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

@c %**end of header

@copying
@quotation
Python 3.14.3, 4월 01, 2026

Author name not set

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

@end copying

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

@c %** start of user preamble

@c %** end of user preamble

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

@c %**start of body
@anchor{contents doc}@anchor{13b}
@menu
* 파이썬의 새로운 기능:: 
* 파이썬 자습서:: 
* 파이썬 설정 및 사용법:: 
* 파이썬 언어 레퍼런스:: 
* 파이썬 표준 라이브러리:: 
* 파이썬 인터프리터 확장 및 내장:: 
* Python/C API reference manual:: 
* 파이썬 모듈 설치하기:: 
* 파이썬 HOWTO:: 
* 파이썬 자주 나오는 질문들:: 
* Deprecations:: 
* 용어집:: 
* 이 설명서에 관하여:: 
* 버그 다루기:: 
* 저작권:: 
* 역사와 라이센스:: 
* Python 모듈 목록:: 
* 색인:: 

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

파이썬의 새로운 기능

* What’s new in Python 3.14: What’s new in Python 3 14. 
* 파이썬 3.13의 새로운 기능에 대해 알아봅시다: 파이썬 3 13의 새로운 기능에 대해 알아봅시다. 
* What’s New In Python 3.12: What’s New In Python 3 12. 
* What’s New In Python 3.11: What’s New In Python 3 11. 
* What’s New In Python 3.10: What’s New In Python 3 10. 
* 파이썬 3.9의 새로운 기능: 파이썬 3 9의 새로운 기능. 
* 파이썬 3.8의 새로운 기능: 파이썬 3 8의 새로운 기능. 
* 파이썬 3.7의 새로운 기능: 파이썬 3 7의 새로운 기능. 
* 파이썬 3.6의 새로운 기능: 파이썬 3 6의 새로운 기능. 
* 파이썬 3.5의 새로운 기능: 파이썬 3 5의 새로운 기능. 
* What’s New In Python 3.4: What’s New In Python 3 4. 
* What’s New In Python 3.3: What’s New In Python 3 3. 
* What’s New In Python 3.2: What’s New In Python 3 2. 
* What’s New In Python 3.1: What’s New In Python 3 1. 
* What’s New In Python 3.0: What’s New In Python 3 0. 
* What’s New in Python 2.7: What’s New in Python 2 7. 
* What’s New in Python 2.6: What’s New in Python 2 6. 
* What’s New in Python 2.5: What’s New in Python 2 5. 
* What’s New in Python 2.4: What’s New in Python 2 4. 
* What’s New in Python 2.3: What’s New in Python 2 3. 
* What’s New in Python 2.2: What’s New in Python 2 2. 
* What’s New in Python 2.1: What’s New in Python 2 1. 
* What’s New in Python 2.0: What’s New in Python 2 0. 
* Changelog:: 

What’s new in Python 3.14

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

New features

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

Other language changes

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

Improved modules

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

Optimizations

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

Removed

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

Deprecated

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

CPython bytecode changes

* Pseudo-instructions:: 

C API changes

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

Deprecated C APIs

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

Build changes

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

Porting to Python 3.14

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

Changes in annotations (PEP 649 and PEP 749)

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

파이썬 3.13의 새로운 기능에 대해 알아봅시다

* 요약 – 릴리스 하이라이트:: 
* 새로운 기능들:: 
* 기타 언어 변경:: 
* 새로운 모듈들:: 
* 개선된 모듈들:: 
* 최적화 관련 사항들:: 
* 제거된 모듈들과 API들:: 
* New Deprecations:: 
* CPython 바이트 코드 변경 사항:: 
* C API의 변경 사항들:: 
* 빌드 변경 사항들:: 
* 파이썬 3.13으로의 (코드) 이식: 파이썬 3 13으로의 코드 이식. 
* 회귀 테스트 변경 사항:: 

새로운 기능들

* 개선된 대화형 인터프리터:: 
* 개선된 에러 메세지:: 
* 제한 없는 스레드를 사용하는 파이썬(CPython): 제한 없는 스레드를 사용하는 파이썬 CPython. 
* 실험적인 지정 시간 구동 (Just-In-Time; JIT) 컴파일러: 실험적인 지정 시간 구동 Just-In-Time; JIT 컴파일러. 
* locals()의 변형에 대한 의미 구조 정의: locals 의 변형에 대한 의미 구조 정의. 
* 모바일 플랫폼들에 대한 지원:: 

개선된 모듈들

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

제거된 모듈들과 API들

* PEP 594; 표준 라이브러리에서 "죽은 배터리들(dead batteries)" 제거하기: PEP 594 표준 라이브러리에서 "죽은 배터리들 dead batteries " 제거하기. 
* 2to3:: 
* builtins:: 
* configparser: configparser<3>. 
* importlib.metadata: importlib metadata. 
* locale:: 
* opcode:: 
* optparse:: 
* pathlib: pathlib<5>. 
* re: re<3>. 
* tkinter.tix: tkinter tix. 
* turtle: turtle<2>. 
* typing: typing<3>. 
* unittest: unittest<2>. 
* urllib: urllib<3>. 
* webbrowser: webbrowser<2>. 

New Deprecations

* 파이썬 3.14에서 제거 예정인 항목들: 파이썬 3 14에서 제거 예정인 항목들. 
* 파이썬 3.15에서 제거 예정인 항목들: 파이썬 3 15에서 제거 예정인 항목들. 
* 파이썬 3.16에서 제거 예정인 항목들: 파이썬 3 16에서 제거 예정인 항목들. 
* 파이썬 3.17에서 제거 예정인 항목들: 파이썬 3 17에서 제거 예정인 항목들. 
* 파이썬 3.18에서 제거 예정인 항목들: 파이썬 3 18에서 제거 예정인 항목들. 
* Pending removal in Python 3.19: Pending removal in Python 3 19<2>. 
* 향후 보다 상위 버전의 제거 예정 항목들:: 

C API의 변경 사항들

* 새로운 기능들: 새로운 기능들<2>. 
* C API의 변경 사항들: C API의 변경 사항들<2>. 
* 제한된 C API 변경 사항들:: 
* 제거된 C API들:: 
* 사용 지원 중단(deprecated)된 C API들: 사용 지원 중단 deprecated 된 C API들. 

사용 지원 중단(deprecated)된 C API들

* 파이썬 3.14에서 제거 예정인 항목들: 파이썬 3 14에서 제거 예정인 항목들<2>. 
* 파이썬 3.15에서 제거 예정인 항목들: 파이썬 3 15에서 제거 예정인 항목들<2>. 
* 파이썬 3.16에서 제거 예정인 항목들: 파이썬 3 16에서 제거 예정인 항목들<2>. 
* 파이썬 3.18에서 제거 예정인 항목들: 파이썬 3 18에서 제거 예정인 항목들<2>. 
* 향후 보다 상위 버전의 제거 예정 항목들: 향후 보다 상위 버전의 제거 예정 항목들<2>. 

파이썬 3.13으로의 (코드) 이식

* 파이썬 API 변경 사항:: 
* C API 변경사항:: 

What’s New In Python 3.12

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

New Features

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

New Features Related to Type Hints

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

Improved Modules

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

Deprecated

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

Removed

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

Porting to Python 3.12

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

C API Changes

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

Deprecated

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

What’s New In Python 3.11

* Summary – Release highlights: Summary – Release highlights<3>. 
* 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>. 
* Other CPython Implementation Changes:: 
* New Modules: New Modules<2>. 
* Improved Modules: Improved Modules<2>. 
* Optimizations: Optimizations<3>. 
* Faster CPython:: 
* CPython bytecode changes: CPython bytecode changes<3>. 
* Deprecated: Deprecated<4>. 
* Pending Removal in Python 3.12: Pending Removal in Python 3 12. 
* Removed: Removed<4>. 
* Porting to Python 3.11: Porting to Python 3 11. 
* Build Changes: Build Changes<2>. 
* C API Changes: C API Changes<2>. 
* Notable changes in 3.11.4: Notable changes in 3 11 4. 
* Notable changes in 3.11.5: Notable changes in 3 11 5. 

New Features

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

New Features Related to Type Hints

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

Improved Modules

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

Faster CPython

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

Faster Startup

* Frozen imports / Static code objects:: 

Faster Runtime

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

FAQ

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

CPython bytecode changes

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

Deprecated

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

C API Changes

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

Notable changes in 3.11.4

* tarfile: tarfile<2>. 

Notable changes in 3.11.5

* OpenSSL:: 

What’s New In Python 3.10

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

New Features

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

Better error messages

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

PEP 634: Structural Pattern Matching

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

Simple pattern: match to a literal

* Behavior without the wildcard:: 

Patterns and classes

* Patterns with positional parameters:: 

New Features Related to Type Hints

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

Improved Modules

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

dataclasses

* __slots__:: 
* Keyword-only fields:: 

Porting to Python 3.10

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

C API Changes

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

Notable changes in 3.10.12

* tarfile: tarfile<3>. 

파이썬 3.9의 새로운 기능

* 요약 – 배포 주요 사항:: 
* 여러분의 코드에서 DeprecationWarning을 확인해야합니다:: 
* 새로운 기능:: 
* 기타 언어 변경: 기타 언어 변경<2>. 
* 새 모듈:: 
* 개선된 모듈:: 
* 최적화:: 
* 폐지:: 
* 제거:: 
* 파이썬 3.9로 이식하기: 파이썬 3 9로 이식하기. 
* 빌드 변경:: 
* C API 변경:: 
* 파이썬 3.9.1의 주목할만한 변경 사항: 파이썬 3 9 1의 주목할만한 변경 사항. 
* 파이썬 3.9.2의 주목할만한 변경 사항: 파이썬 3 9 2의 주목할만한 변경 사항. 
* 파이썬 3.9.3의 주목할만한 변경 사항: 파이썬 3 9 3의 주목할만한 변경 사항. 
* 파이썬 3.9.5의 주목할만한 변경 사항: 파이썬 3 9 5의 주목할만한 변경 사항. 
* 3.9.14의 주목할만한 보안 기능: 3 9 14의 주목할만한 보안 기능. 
* 3.9.17의 주목할만한 변경 사항: 3 9 17의 주목할만한 변경 사항. 

새로운 기능

* 딕셔너리 병합과 업데이트 연산자:: 
* 접두사와 접미사를 제거하는 새로운 문자열 메서드:: 
* 표준 컬렉션의 형 힌트 제네릭:: 
* 새로운 구문 분석기:: 

새 모듈

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

개선된 모듈

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

파이썬 3.9로 이식하기

* 파이썬 API의 변경:: 
* C API의 변경:: 
* CPython 바이트 코드 변경:: 

C API 변경

* 새로운 기능: 새로운 기능<2>. 
* 파이썬 3.9로 이식하기: 파이썬 3 9로 이식하기<2>. 
* 제거: 제거<2>. 

파이썬 3.9.1의 주목할만한 변경 사항

* typing: typing<8>. 
* macOS 11.0 (Big Sur) 및 Apple Silicon Mac 지원: macOS 11 0 Big Sur 및 Apple Silicon Mac 지원. 

파이썬 3.9.2의 주목할만한 변경 사항

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

파이썬 3.9.5의 주목할만한 변경 사항

* urllib.parse: urllib parse<3>. 

3.9.17의 주목할만한 변경 사항

* tarfile: tarfile<4>. 

파이썬 3.8의 새로운 기능

* 요약 – 배포 주요 사항: 요약 – 배포 주요 사항<2>. 
* 새로운 기능: 새로운 기능<3>. 
* 기타 언어 변경: 기타 언어 변경<3>. 
* 새 모듈: 새 모듈<2>. 
* 개선된 모듈: 개선된 모듈<2>. 
* 최적화: 최적화<2>. 
* 빌드와 C API 변경:: 
* 폐지: 폐지<2>. 
* API 및 기능 제거:: 
* 파이썬 3.8로 이식하기: 파이썬 3 8로 이식하기. 
* 파이썬 3.8.1의 주목할만한 변경 사항: 파이썬 3 8 1의 주목할만한 변경 사항. 
* 파이썬 3.8.2의 주목할만한 변경 사항: 파이썬 3 8 2의 주목할만한 변경 사항. 
* 파이썬 3.8.3의 주목할만한 변경 사항: 파이썬 3 8 3의 주목할만한 변경 사항. 
* 파이썬 3.8.8의 주목할만한 변경 사항: 파이썬 3 8 8의 주목할만한 변경 사항. 
* 파이썬 3.8.9의 주목할만한 변경 사항: 파이썬 3 8 9의 주목할만한 변경 사항. 
* 파이썬 3.8.10의 주목할만한 변경 사항: 파이썬 3 8 10의 주목할만한 변경 사항. 
* 파이썬 3.8.10의 주목할만한 변경 사항: 파이썬 3 8 10의 주목할만한 변경 사항<2>. 
* 파이썬 3.8.12의 주목할만한 변경 사항: 파이썬 3 8 12의 주목할만한 변경 사항. 
* 3.8.14의 주목할만한 보안 기능: 3 8 14의 주목할만한 보안 기능. 
* 3.8.17의 주목할만한 변경 사항: 3 8 17의 주목할만한 변경 사항. 

새로운 기능

* 대입 표현식:: 
* 위치 전용 매개 변수:: 
* 컴파일된 바이트 코드 파일을 위한 병렬 파일 시스템 캐시:: 
* 디버그 빌드는 릴리스 빌드와 같은 ABI를 사용합니다.: 디버그 빌드는 릴리스 빌드와 같은 ABI를 사용합니다. 
* f-문자열은 스스로 설명하는 표현식과 디버깅을 위해 =를 지원합니다.: f-문자열은 스스로 설명하는 표현식과 디버깅을 위해 =를 지원합니다. 
* PEP 578; 파이썬 런타임 감사 훅: PEP 578 파이썬 런타임 감사 훅. 
* PEP 587; 파이썬 초기화 구성: PEP 587 파이썬 초기화 구성. 
* PEP 590; 벡터콜; CPython을 위한 빠른 호출 프로토콜: PEP 590 벡터콜 CPython을 위한 빠른 호출 프로토콜. 
* 아웃 오브 밴드 데이터 버퍼를 사용하는 피클 프로토콜 5:: 

개선된 모듈

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

파이썬 3.8로 이식하기

* 파이썬 동작의 변경:: 
* 파이썬 API의 변경: 파이썬 API의 변경<2>. 
* C API의 변경: C API의 변경<2>. 
* CPython 바이트 코드 변경: CPython 바이트 코드 변경<2>. 
* 데모와 도구:: 

파이썬 3.8.10의 주목할만한 변경 사항

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

파이썬 3.8.10의 주목할만한 변경 사항

* urllib.parse: urllib parse<4>. 

파이썬 3.8.12의 주목할만한 변경 사항

* 파이썬 API의 변경: 파이썬 API의 변경<3>. 

3.8.17의 주목할만한 변경 사항

* tarfile: tarfile<6>. 

파이썬 3.7의 새로운 기능

* 요약 – 배포 주요 사항: 요약 – 배포 주요 사항<3>. 
* 새로운 기능: 새로운 기능<4>. 
* 기타 언어 변경: 기타 언어 변경<4>. 
* 새 모듈: 새 모듈<3>. 
* 개선된 모듈: 개선된 모듈<3>. 
* C API 변경: C API 변경<2>. 
* 빌드 변경: 빌드 변경<2>. 
* 최적화: 최적화<3>. 
* 기타 CPython 구현 변경:: 
* 폐지된 파이썬 동작:: 
* 폐지된 파이썬 모듈@comma{} 함수 및 메서드: 폐지된 파이썬 모듈 함수 및 메서드. 
* 폐지된 C API의 함수 및 형:: 
* 플랫폼 지원 제거:: 
* API 및 기능 제거: API 및 기능 제거<2>. 
* 모듈 제거:: 
* 윈도우 전용 변경:: 
* 파이썬 3.7로 이식하기: 파이썬 3 7로 이식하기. 
* 파이썬 3.7.1의 주목할만한 변경 사항: 파이썬 3 7 1의 주목할만한 변경 사항. 
* 파이썬 3.7.2의 주목할만한 변경 사항: 파이썬 3 7 2의 주목할만한 변경 사항. 
* 파이썬 3.7.6의 주목할만한 변경 사항: 파이썬 3 7 6의 주목할만한 변경 사항. 
* 파이썬 3.7.10의 주목할만한 변경 사항: 파이썬 3 7 10의 주목할만한 변경 사항. 
* 파이썬 3.7.11의 주목할만한 변경 사항: 파이썬 3 7 11의 주목할만한 변경 사항. 
* 파이썬 3.7.14의 주목할만한 보안 기능: 파이썬 3 7 14의 주목할만한 보안 기능. 

새로운 기능

* PEP 563 ; 어노테이션의 지연된 평가: PEP 563 어노테이션의 지연된 평가. 
* PEP 538; 레거시 C 로케일 강제 변경: PEP 538 레거시 C 로케일 강제 변경. 
* PEP 540; 강제 UTF-8 실행시간 모드: PEP 540 강제 UTF-8 실행시간 모드. 
* PEP 553; 내장 breakpoint(): PEP 553 내장 breakpoint. 
* PEP 539; 스레드-로컬 저장소를 위한 새로운 C API: PEP 539 스레드-로컬 저장소를 위한 새로운 C API. 
* PEP 562; 모듈 어트리뷰트에 대한 액세스 사용자 정의: PEP 562 모듈 어트리뷰트에 대한 액세스 사용자 정의. 
* PEP 564; 나노초 해상도의 새로운 시간 함수: PEP 564 나노초 해상도의 새로운 시간 함수. 
* PEP 565; __main__ 의 DeprecationWarning 표시: PEP 565 __main__ 의 DeprecationWarning 표시. 
* PEP 560; typing 모듈과 제네릭 형에 대한 코어 지원: PEP 560 typing 모듈과 제네릭 형에 대한 코어 지원. 
* PEP 552; 해시 기반 .pyc 파일: PEP 552 해시 기반 pyc 파일. 
* PEP 545; 파이썬 설명서 번역: PEP 545 파이썬 설명서 번역. 
* 파이썬 개발 모드 (-X dev): 파이썬 개발 모드 -X dev. 

새 모듈

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

개선된 모듈

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

폐지된 파이썬 모듈, 함수 및 메서드

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

파이썬 3.7로 이식하기

* 파이썬 동작의 변경: 파이썬 동작의 변경<2>. 
* 파이썬 API의 변경: 파이썬 API의 변경<4>. 
* C API의 변경: C API의 변경<3>. 
* CPython 바이트 코드 변경: CPython 바이트 코드 변경<3>. 
* 윈도우 전용 변경: 윈도우 전용 변경<2>. 
* 기타 CPython 구현 변경: 기타 CPython 구현 변경<2>. 

파이썬 3.6의 새로운 기능

* 요약 – 배포 주요 사항: 요약 – 배포 주요 사항<4>. 
* 새로운 기능: 새로운 기능<5>. 
* 기타 언어 변경: 기타 언어 변경<5>. 
* 새로운 모듈:: 
* 개선된 모듈: 개선된 모듈<4>. 
* 최적화: 최적화<4>. 
* 빌드와 C API 변경: 빌드와 C API 변경<2>. 
* 기타 개선 사항:: 
* 폐지: 폐지<3>. 
* 제거: 제거<3>. 
* 파이썬 3.6으로 이식하기: 파이썬 3 6으로 이식하기. 
* 파이썬 3.6.2의 주목할만한 변경 사항: 파이썬 3 6 2의 주목할만한 변경 사항. 
* 파이썬 3.6.4의 주목할만한 변경 사항: 파이썬 3 6 4의 주목할만한 변경 사항. 
* 파이썬 3.6.5의 주목할만한 변경 사항: 파이썬 3 6 5의 주목할만한 변경 사항. 
* 파이썬 3.6.7의 주목할만한 변경 사항: 파이썬 3 6 7의 주목할만한 변경 사항. 
* 파이썬 3.6.10의 주목할만한 변경 사항: 파이썬 3 6 10의 주목할만한 변경 사항. 
* 파이썬 3.6.13의 주목할만한 변경 사항: 파이썬 3 6 13의 주목할만한 변경 사항. 
* 파이썬 3.6.14의 주목할만한 변경 사항: 파이썬 3 6 14의 주목할만한 변경 사항. 

새로운 기능

* PEP 498; 포맷 문자열 리터럴: PEP 498 포맷 문자열 리터럴. 
* PEP 526; 변수 어노테이션 문법: PEP 526 변수 어노테이션 문법. 
* PEP 515; 숫자 리터럴의 밑줄: PEP 515 숫자 리터럴의 밑줄. 
* PEP 525; 비동기 제너레이터: PEP 525 비동기 제너레이터. 
* PEP 530; 비동기 컴프리헨션: PEP 530 비동기 컴프리헨션. 
* PEP 487; 더 간단한 클래스 생성 사용자 정의: PEP 487 더 간단한 클래스 생성 사용자 정의. 
* PEP 487; 디스크립터 프로토콜 향상: PEP 487 디스크립터 프로토콜 향상. 
* PEP 519; 파일 시스템 경로 프로토콜 추가: PEP 519 파일 시스템 경로 프로토콜 추가. 
* PEP 495; 현지 시간 명확성: PEP 495 현지 시간 명확성. 
* PEP 529; 윈도우 파일 시스템 인코딩을 UTF-8로 변경: PEP 529 윈도우 파일 시스템 인코딩을 UTF-8로 변경. 
* PEP 528; 윈도우 콘솔 인코딩을 UTF-8로 변경: PEP 528 윈도우 콘솔 인코딩을 UTF-8로 변경. 
* PEP 520; 클래스 어트리뷰트 정의 순서 유지: PEP 520 클래스 어트리뷰트 정의 순서 유지. 
* PEP 468; 키워드 인자 순서 유지: PEP 468 키워드 인자 순서 유지. 
* 새로운 dict 구현:: 
* PEP 523; CPython에 프레임 평가 API 추가: PEP 523 CPython에 프레임 평가 API 추가. 
* PYTHONMALLOC 환경 변수:: 
* DTrace와 SystemTap 프로브 지원:: 

새로운 모듈

* secrets:: 

개선된 모듈

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

폐지

* 새 키워드:: 
* 폐지된 파이썬 동작: 폐지된 파이썬 동작<2>. 
* 폐지된 파이썬 모듈@comma{} 함수 및 메서드: 폐지된 파이썬 모듈 함수 및 메서드<2>. 
* xml: xml<6>. 
* C API의 폐지된 함수와 형:: 
* 폐지된 빌드 옵션:: 

폐지된 파이썬 모듈, 함수 및 메서드

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

제거

* API와 기능 제거:: 

파이썬 3.6으로 이식하기

* ‘python’ 명령 동작의 변경 사항:: 
* 파이썬 API의 변경 사항:: 
* C API의 변경 사항:: 
* CPython 바이트 코드 변경 사항: CPython 바이트 코드 변경 사항<2>. 

파이썬 3.6.2의 주목할만한 변경 사항

* 새로운 make regen-all 빌드 대상:: 
* make touch 빌드 대상 제거:: 

파이썬 3.5의 새로운 기능

* 요약 – 배포 주요 사항: 요약 – 배포 주요 사항<5>. 
* 새로운 기능: 새로운 기능<6>. 
* 기타 언어 변경: 기타 언어 변경<6>. 
* 새로운 모듈: 새로운 모듈<2>. 
* 개선된 모듈: 개선된 모듈<5>. 
* 기타 모듈 수준 변경:: 
* 최적화: 최적화<5>. 
* 빌드와 C API 변경: 빌드와 C API 변경<3>. 
* 폐지: 폐지<4>. 
* 제거: 제거<4>. 
* 파이썬 3.5로 이식하기: 파이썬 3 5로 이식하기. 
* 파이썬 3.5.4의 주목할만한 변경 사항: 파이썬 3 5 4의 주목할만한 변경 사항. 

새로운 기능

* PEP 492 - async와 await 구문을 사용하는 코루틴:: 
* PEP 465 - 행렬 곱셈을 위한 전용 중위(infix) 연산자: PEP 465 - 행렬 곱셈을 위한 전용 중위 infix 연산자. 
* PEP 448 - 추가적인 언 패킹 일반화:: 
* PEP 461 - bytes와 bytearray를 위한 퍼센트 포매팅 지원:: 
* PEP 484 - 형 힌트:: 
* PEP 471 - os.scandir() 함수 – 더 빠르고 더 나은 디렉터리 이터레이터: PEP 471 - os scandir 함수 – 더 빠르고 더 나은 디렉터리 이터레이터. 
* PEP 475; EINTR로 실패한 시스템 호출 재시도: PEP 475 EINTR로 실패한 시스템 호출 재시도. 
* PEP 479; 제너레이터 내부에서의 StopIteration 처리 변경: PEP 479 제너레이터 내부에서의 StopIteration 처리 변경. 
* PEP 485; 대략적인 동등성을 테스트하는 함수: PEP 485 대략적인 동등성을 테스트하는 함수. 
* PEP 486; 파이썬 런처가 가상 환경을 인식하도록 만들기: PEP 486 파이썬 런처가 가상 환경을 인식하도록 만들기. 
* PEP 488; PYO 파일 제거: PEP 488 PYO 파일 제거. 
* PEP 489; 다단계 확장 모듈 초기화: PEP 489 다단계 확장 모듈 초기화. 

새로운 모듈

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

개선된 모듈

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

ssl

* 메모리 BIO 지원:: 
* 응용 프로그램 계층 프로토콜 협상 지원:: 
* 기타 변경 사항:: 

폐지

* 새 키워드: 새 키워드<2>. 
* 폐지된 파이썬 동작: 폐지된 파이썬 동작<3>. 
* 지원되지 않는 운영 체제:: 
* 폐지된 파이썬 모듈@comma{} 함수 및 메서드: 폐지된 파이썬 모듈 함수 및 메서드<3>. 

제거

* API 및 기능 제거: API 및 기능 제거<3>. 

파이썬 3.5로 이식하기

* 파이썬 동작의 변경: 파이썬 동작의 변경<3>. 
* 파이썬 API의 변경: 파이썬 API의 변경<5>. 
* C API의 변경: C API의 변경<4>. 

파이썬 3.5.4의 주목할만한 변경 사항

* 새로운 make regen-all 빌드 대상: 새로운 make regen-all 빌드 대상<2>. 
* make touch 빌드 대상 제거: make touch 빌드 대상 제거<2>. 

What’s New In Python 3.4

* Summary – Release Highlights:: 
* New Features: New Features<7>. 
* New Modules: New Modules<4>. 
* Improved Modules: Improved Modules<4>. 
* CPython Implementation Changes:: 
* Deprecated: Deprecated<8>. 
* Removed: Removed<8>. 
* 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<4>. 

PEP 453: Explicit Bootstrapping of PIP in Python Installations

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

New Modules

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

Improved Modules

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

CPython Implementation Changes

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

Deprecated

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

Removed

* Operating Systems No Longer Supported:: 
* API and Feature Removals:: 
* Code Cleanups:: 

Porting to Python 3.4

* Changes in ‘python’ Command Behavior:: 
* Changes in the Python API: Changes in the Python API<4>. 
* Changes in the C API: Changes in the C API<3>. 

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<5>. 
* 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<5>. 
* A Finer-Grained Import Lock:: 
* Builtin functions and types:: 
* New Modules: New Modules<5>. 
* Improved Modules: Improved Modules<5>. 
* Optimizations: Optimizations<5>. 
* Build and C API Changes:: 
* Deprecated: Deprecated<9>. 
* Porting to Python 3.3: Porting to Python 3 3. 

PEP 3118: New memoryview implementation and buffer protocol documentation

* Features:: 
* API changes:: 

PEP 393: Flexible String Representation

* Functionality:: 
* Performance and resource usage:: 

PEP 421: Adding sys.implementation

* SimpleNamespace:: 

Using importlib as the Implementation of Import

* New APIs:: 
* Visible Changes:: 

New Modules

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

Improved Modules

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

decimal

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

email

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

Deprecated

* Unsupported Operating Systems:: 
* Deprecated Python modules@comma{} functions and methods: Deprecated Python modules functions and methods. 
* Deprecated functions and types of the C API:: 
* 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<6>. 
* New@comma{} Improved@comma{} and Deprecated Modules: New Improved and Deprecated Modules. 
* Multi-threading:: 
* Optimizations: Optimizations<6>. 
* Unicode:: 
* Codecs:: 
* Documentation:: 
* IDLE:: 
* Code Repository:: 
* Build and C API Changes: Build and C API Changes<2>. 
* Porting to Python 3.2: Porting to Python 3 2. 

New, Improved, and Deprecated Modules

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

What’s New In Python 3.1

* PEP 372; Ordered Dictionaries: PEP 372 Ordered Dictionaries. 
* PEP 378; Format Specifier for Thousands Separator: PEP 378 Format Specifier for Thousands Separator. 
* Other Language Changes: Other Language Changes<7>. 
* New@comma{} Improved@comma{} and Deprecated Modules: New Improved and Deprecated Modules<2>. 
* Optimizations: Optimizations<7>. 
* IDLE: IDLE<2>. 
* Build and C API Changes: Build and C API Changes<3>. 
* 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<4>. 
* 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<8>. 
* New and Improved Modules:: 
* Build and C API Changes: Build and C API Changes<5>. 
* 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<8>. 

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:: 
* Removal of make touch build target:: 

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<9>. 
* New and Improved Modules: New and Improved Modules<2>. 
* Deprecations and Removals:: 
* Build and C API Changes: Build and C API Changes<6>. 
* 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<9>. 
* 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<10>. 
* New@comma{} Improved@comma{} and Removed Modules: New Improved and Removed Modules. 
* Build and C API Changes: Build and C API Changes<7>. 
* 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<10>. 

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<11>. 
* New@comma{} Improved@comma{} and Deprecated Modules: New Improved and Deprecated Modules<3>. 
* Build and C API Changes: Build and C API Changes<8>. 
* 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<11>. 

New, Improved, and Deprecated Modules

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

Build and C API Changes

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

What’s New in Python 2.3

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

New, Improved, and Deprecated Modules

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

Build and C API Changes

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

What’s New in Python 2.2

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

PEPs 252 and 253: Type and Class Changes

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

What’s New in Python 2.1

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

What’s New in Python 2.0

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

Other Core Changes

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

XML Modules

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

Changelog

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

Python next

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

Python 3.14.3 final

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

Python 3.14.2 final

* Security: Security<3>. 
* Library: Library<3>. 
* Core and Builtins: Core and Builtins<3>. 
* Library: Library<4>. 

Python 3.14.1 final

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

Python 3.14.0 final

* macOS: macOS<2>. 
* Windows: Windows<4>. 
* Tools/Demos: Tools/Demos<3>. 
* Security: Security<5>. 
* Library: Library<12>. 

Python 3.14.0 release candidate 3

* Windows: Windows<5>. 
* Tools/Demos: Tools/Demos<4>. 
* Security: Security<6>. 
* Library: Library<13>. 
* Core and Builtins: Core and Builtins<11>. 

Python 3.14.0 release candidate 2

* macOS: macOS<3>. 
* Windows: Windows<6>. 
* Library: Library<14>. 
* Documentation: Documentation<5>. 
* Core and Builtins: Core and Builtins<12>. 
* C API: C API<4>. 
* Build: Build<4>. 

Python 3.14.0 release candidate 1

* Tools/Demos: Tools/Demos<5>. 
* Security: Security<7>. 
* Library: Library<15>. 
* Core and Builtins: Core and Builtins<13>. 
* Library: Library<16>. 
* Core and Builtins: Core and Builtins<14>. 
* Library: Library<17>. 
* Core and Builtins: Core and Builtins<15>. 
* C API: C API<5>. 
* Build: Build<5>. 

Python 3.14.0 beta 4

* Tools/Demos: Tools/Demos<6>. 
* Tests: Tests<4>. 
* Security: Security<8>. 
* Library: Library<18>. 
* Documentation: Documentation<6>. 
* Core and Builtins: Core and Builtins<16>. 
* C API: C API<6>. 
* Build: Build<6>. 

Python 3.14.0 beta 3

* Windows: Windows<7>. 
* Tests: Tests<5>. 
* Security: Security<9>. 
* Library: Library<19>. 
* Documentation: Documentation<7>. 
* Core and Builtins: Core and Builtins<17>. 
* Library: Library<20>. 
* Core and Builtins: Core and Builtins<18>. 
* Library: Library<21>. 
* Core and Builtins: Core and Builtins<19>. 
* Library: Library<22>. 
* Core and Builtins: Core and Builtins<20>. 
* C API: C API<7>. 
* Build: Build<7>. 

Python 3.14.0 beta 2

* Windows: Windows<8>. 
* Tools/Demos: Tools/Demos<7>. 
* Tests: Tests<6>. 
* Security: Security<10>. 
* Library: Library<23>. 
* Core and Builtins: Core and Builtins<21>. 
* C API: C API<8>. 
* Build: Build<8>. 

Python 3.14.0 beta 1

* Windows: Windows<9>. 
* Tools/Demos: Tools/Demos<8>. 
* Tests: Tests<7>. 
* Security: Security<11>. 
* Library: Library<24>. 
* IDLE: IDLE<5>. 
* Documentation: Documentation<8>. 
* Core and Builtins: Core and Builtins<22>. 
* Library: Library<25>. 
* Core and Builtins: Core and Builtins<23>. 
* Library: Library<26>. 
* Core and Builtins: Core and Builtins<24>. 
* Library: Library<27>. 
* C API: C API<9>. 
* Build: Build<9>. 

Python 3.14.0 alpha 7

* macOS: macOS<4>. 
* Windows: Windows<10>. 
* Tools/Demos: Tools/Demos<9>. 
* Tests: Tests<8>. 
* Security: Security<12>. 
* Library: Library<28>. 
* Documentation: Documentation<9>. 
* Core and Builtins: Core and Builtins<25>. 
* Library: Library<29>. 
* Core and Builtins: Core and Builtins<26>. 
* C API: C API<10>. 
* Build: Build<10>. 

Python 3.14.0 alpha 6

* macOS: macOS<5>. 
* Windows: Windows<11>. 
* Tools/Demos: Tools/Demos<10>. 
* Tests: Tests<9>. 
* Security: Security<13>. 
* Library: Library<30>. 
* Documentation: Documentation<10>. 
* Core and Builtins: Core and Builtins<27>. 
* Library: Library<31>. 
* Core and Builtins: Core and Builtins<28>. 
* Library: Library<32>. 
* Core and Builtins: Core and Builtins<29>. 
* C API: C API<11>. 
* Build: Build<11>. 

Python 3.14.0 alpha 5

* macOS: macOS<6>. 
* Tools/Demos: Tools/Demos<11>. 
* Tests: Tests<10>. 
* Security: Security<14>. 
* Library: Library<33>. 
* IDLE: IDLE<6>. 
* Documentation: Documentation<11>. 
* Core and Builtins: Core and Builtins<30>. 
* Library: Library<34>. 
* Core and Builtins: Core and Builtins<31>. 
* Library: Library<35>. 
* Core and Builtins: Core and Builtins<32>. 
* Library: Library<36>. 
* C API: C API<12>. 
* Build: Build<12>. 

Python 3.14.0 alpha 4

* macOS: macOS<7>. 
* Tools/Demos: Tools/Demos<12>. 
* Tests: Tests<11>. 
* Library: Library<37>. 
* Core and Builtins: Core and Builtins<33>. 
* Library: Library<38>. 
* Core and Builtins: Core and Builtins<34>. 
* Library: Library<39>. 
* Core and Builtins: Core and Builtins<35>. 
* C API: C API<13>. 
* Build: Build<13>. 

Python 3.14.0 alpha 3

* Windows: Windows<12>. 
* Tools/Demos: Tools/Demos<13>. 
* Tests: Tests<12>. 
* Security: Security<15>. 
* Library: Library<40>. 
* Documentation: Documentation<12>. 
* Core and Builtins: Core and Builtins<36>. 
* Library: Library<41>. 
* Core and Builtins: Core and Builtins<37>. 
* C API: C API<14>. 
* Build: Build<14>. 

Python 3.14.0 alpha 2

* Windows: Windows<13>. 
* Tools/Demos: Tools/Demos<14>. 
* Tests: Tests<13>. 
* Security: Security<16>. 
* Library: Library<42>. 
* Documentation: Documentation<13>. 
* Core and Builtins: Core and Builtins<38>. 
* Library: Library<43>. 
* Core and Builtins: Core and Builtins<39>. 
* Library: Library<44>. 
* Core and Builtins: Core and Builtins<40>. 
* Library: Library<45>. 
* C API: C API<15>. 
* Build: Build<15>. 

Python 3.14.0 alpha 1

* macOS: macOS<8>. 
* Windows: Windows<14>. 
* Tools/Demos: Tools/Demos<15>. 
* Tests: Tests<14>. 
* Security: Security<17>. 
* Library: Library<46>. 
* IDLE: IDLE<7>. 
* Documentation: Documentation<14>. 
* Core and Builtins: Core and Builtins<41>. 
* Library: Library<47>. 
* Core and Builtins: Core and Builtins<42>. 
* Library: Library<48>. 
* Core and Builtins: Core and Builtins<43>. 
* Library: Library<49>. 
* Core and Builtins: Core and Builtins<44>. 
* Library: Library<50>. 
* Core and Builtins: Core and Builtins<45>. 
* Library: Library<51>. 
* Core and Builtins: Core and Builtins<46>. 
* Library: Library<52>. 
* Core and Builtins: Core and Builtins<47>. 
* Library: Library<53>. 
* Core and Builtins: Core and Builtins<48>. 
* C API: C API<16>. 
* Build: Build<16>. 

Python 3.13.0 beta 1

* Security: Security<18>. 
* Core and Builtins: Core and Builtins<49>. 
* Library: Library<54>. 
* Core and Builtins: Core and Builtins<50>. 
* Library: Library<55>. 
* Documentation: Documentation<15>. 
* Build: Build<17>. 
* Windows: Windows<15>. 
* macOS: macOS<9>. 
* IDLE: IDLE<8>. 
* C API: C API<17>. 

Python 3.13.0 alpha 6

* Core and Builtins: Core and Builtins<51>. 
* Library: Library<56>. 
* Core and Builtins: Core and Builtins<52>. 
* Library: Library<57>. 
* Documentation: Documentation<16>. 
* Tests: Tests<15>. 
* Build: Build<18>. 
* Windows: Windows<16>. 
* C API: C API<18>. 

Python 3.13.0 alpha 5

* Security: Security<19>. 
* Core and Builtins: Core and Builtins<53>. 
* Library: Library<58>. 
* Core and Builtins: Core and Builtins<54>. 
* Library: Library<59>. 
* Core and Builtins: Core and Builtins<55>. 
* Library: Library<60>. 
* Documentation: Documentation<17>. 
* Tests: Tests<16>. 
* Build: Build<19>. 
* Windows: Windows<17>. 
* macOS: macOS<10>. 
* IDLE: IDLE<9>. 
* Tools/Demos: Tools/Demos<16>. 
* C API: C API<19>. 

Python 3.13.0 alpha 4

* Security: Security<20>. 
* Core and Builtins: Core and Builtins<56>. 
* Library: Library<61>. 
* Documentation: Documentation<18>. 
* Tests: Tests<17>. 
* Build: Build<20>. 
* Windows: Windows<18>. 
* macOS: macOS<11>. 
* IDLE: IDLE<10>. 
* Tools/Demos: Tools/Demos<17>. 
* C API: C API<20>. 

Python 3.13.0 alpha 3

* Security: Security<21>. 
* Core and Builtins: Core and Builtins<57>. 
* Library: Library<62>. 
* Documentation: Documentation<19>. 
* Tests: Tests<18>. 
* Build: Build<21>. 
* Windows: Windows<19>. 
* macOS: macOS<12>. 
* IDLE: IDLE<11>. 
* C API: C API<21>. 

Python 3.13.0 alpha 2

* Core and Builtins: Core and Builtins<58>. 
* Library: Library<63>. 
* Tests: Tests<19>. 
* Build: Build<22>. 
* Windows: Windows<20>. 
* macOS: macOS<13>. 
* IDLE: IDLE<12>. 
* Tools/Demos: Tools/Demos<18>. 
* C API: C API<22>. 

Python 3.13.0 alpha 1

* Security: Security<22>. 
* Core and Builtins: Core and Builtins<59>. 
* Library: Library<64>. 
* Documentation: Documentation<20>. 
* Tests: Tests<20>. 
* Build: Build<23>. 
* Windows: Windows<21>. 
* macOS: macOS<14>. 
* IDLE: IDLE<13>. 
* Tools/Demos: Tools/Demos<19>. 
* C API: C API<23>. 

Python 3.12.0 beta 1

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

Python 3.12.0 alpha 7

* Core and Builtins: Core and Builtins<62>. 
* Library: Library<68>. 
* Core and Builtins: Core and Builtins<63>. 
* Build: Build<25>. 
* Core and Builtins: Core and Builtins<64>. 
* Library: Library<69>. 
* Documentation: Documentation<22>. 
* Tests: Tests<22>. 
* Build: Build<26>. 
* Windows: Windows<23>. 
* Tools/Demos: Tools/Demos<21>. 
* C API: C API<25>. 

Python 3.12.0 alpha 6

* Security: Security<24>. 
* Core and Builtins: Core and Builtins<65>. 
* Library: Library<70>. 
* Documentation: Documentation<23>. 
* Tests: Tests<23>. 
* Build: Build<27>. 
* Windows: Windows<24>. 
* macOS: macOS<16>. 
* C API: C API<26>. 

Python 3.12.0 alpha 5

* Security: Security<25>. 
* Core and Builtins: Core and Builtins<66>. 
* Library: Library<71>. 
* Documentation: Documentation<24>. 
* Tests: Tests<24>. 
* Build: Build<28>. 
* Windows: Windows<25>. 

Python 3.12.0 alpha 4

* Core and Builtins: Core and Builtins<67>. 
* Library: Library<72>. 
* Core and Builtins: Core and Builtins<68>. 
* Library: Library<73>. 
* Core and Builtins: Core and Builtins<69>. 
* Library: Library<74>. 
* Documentation: Documentation<25>. 
* Tests: Tests<25>. 
* Build: Build<29>. 
* Windows: Windows<26>. 
* macOS: macOS<17>. 
* Tools/Demos: Tools/Demos<22>. 
* C API: C API<27>. 

Python 3.12.0 alpha 3

* Security: Security<26>. 
* Core and Builtins: Core and Builtins<70>. 
* Library: Library<75>. 
* Core and Builtins: Core and Builtins<71>. 
* Library: Library<76>. 
* Documentation: Documentation<26>. 
* Tests: Tests<26>. 
* Build: Build<30>. 
* Windows: Windows<27>. 
* macOS: macOS<18>. 
* Tools/Demos: Tools/Demos<23>. 
* C API: C API<28>. 

Python 3.12.0 alpha 2

* Security: Security<27>. 
* Core and Builtins: Core and Builtins<72>. 
* Build: Build<31>. 
* Core and Builtins: Core and Builtins<73>. 
* Library: Library<77>. 
* Documentation: Documentation<27>. 
* Tests: Tests<27>. 
* Build: Build<32>. 
* Windows: Windows<28>. 
* macOS: macOS<19>. 
* C API: C API<29>. 

Python 3.12.0 alpha 1

* Security: Security<28>. 
* Core and Builtins: Core and Builtins<74>. 
* Library: Library<78>. 
* Core and Builtins: Core and Builtins<75>. 
* Library: Library<79>. 
* Core and Builtins: Core and Builtins<76>. 
* Library: Library<80>. 
* Core and Builtins: Core and Builtins<77>. 
* Library: Library<81>. 
* Core and Builtins: Core and Builtins<78>. 
* Library: Library<82>. 
* Core and Builtins: Core and Builtins<79>. 
* Library: Library<83>. 
* Core and Builtins: Core and Builtins<80>. 
* Library: Library<84>. 
* Core and Builtins: Core and Builtins<81>. 
* Library: Library<85>. 
* Core and Builtins: Core and Builtins<82>. 
* Library: Library<86>. 
* Core and Builtins: Core and Builtins<83>. 
* Library: Library<87>. 
* Documentation: Documentation<28>. 
* Tests: Tests<28>. 
* Build: Build<33>. 
* Windows: Windows<29>. 
* macOS: macOS<20>. 
* IDLE: IDLE<15>. 
* Tools/Demos: Tools/Demos<24>. 
* C API: C API<30>. 

Python 3.11.0 beta 1

* Security: Security<29>. 
* Core and Builtins: Core and Builtins<84>. 
* Library: Library<88>. 
* Core and Builtins: Core and Builtins<85>. 
* Build: Build<34>. 
* Core and Builtins: Core and Builtins<86>. 
* Library: Library<89>. 
* Documentation: Documentation<29>. 
* Tests: Tests<29>. 
* Build: Build<35>. 
* Windows: Windows<30>. 
* macOS: macOS<21>. 
* Tools/Demos: Tools/Demos<25>. 
* C API: C API<31>. 

Python 3.11.0 alpha 7

* Core and Builtins: Core and Builtins<87>. 
* Library: Library<90>. 
* Core and Builtins: Core and Builtins<88>. 
* Library: Library<91>. 
* Core and Builtins: Core and Builtins<89>. 
* Library: Library<92>. 
* Documentation: Documentation<30>. 
* Tests: Tests<30>. 
* Build: Build<36>. 
* Windows: Windows<31>. 
* macOS: macOS<22>. 
* Tools/Demos: Tools/Demos<26>. 
* C API: C API<32>. 

Python 3.11.0 alpha 6

* Core and Builtins: Core and Builtins<90>. 
* Library: Library<93>. 
* Core and Builtins: Core and Builtins<91>. 
* Library: Library<94>. 
* Core and Builtins: Core and Builtins<92>. 
* Library: Library<95>. 
* Core and Builtins: Core and Builtins<93>. 
* Library: Library<96>. 
* Documentation: Documentation<31>. 
* Tests: Tests<31>. 
* Build: Build<37>. 
* Windows: Windows<32>. 
* IDLE: IDLE<16>. 
* C API: C API<33>. 

Python 3.11.0 alpha 5

* Core and Builtins: Core and Builtins<94>. 
* Library: Library<97>. 
* Core and Builtins: Core and Builtins<95>. 
* Library: Library<98>. 
* Build: Build<38>. 
* Core and Builtins: Core and Builtins<96>. 
* Library: Library<99>. 
* Documentation: Documentation<32>. 
* Tests: Tests<32>. 
* Build: Build<39>. 
* Windows: Windows<33>. 
* macOS: macOS<23>. 
* IDLE: IDLE<17>. 
* C API: C API<34>. 

Python 3.11.0 alpha 4

* Core and Builtins: Core and Builtins<97>. 
* Library: Library<100>. 
* Core and Builtins: Core and Builtins<98>. 
* Library: Library<101>. 
* Core and Builtins: Core and Builtins<99>. 
* Library: Library<102>. 
* Core and Builtins: Core and Builtins<100>. 
* Library: Library<103>. 
* Documentation: Documentation<33>. 
* Tests: Tests<33>. 
* Build: Build<40>. 
* Windows: Windows<34>. 
* macOS: macOS<24>. 
* C API: C API<35>. 

Python 3.11.0 alpha 3

* Core and Builtins: Core and Builtins<101>. 
* Library: Library<104>. 
* Core and Builtins: Core and Builtins<102>. 
* Library: Library<105>. 
* Documentation: Documentation<34>. 
* Tests: Tests<34>. 
* Build: Build<41>. 
* Windows: Windows<35>. 
* macOS: macOS<25>. 
* C API: C API<36>. 

Python 3.11.0 alpha 2

* Core and Builtins: Core and Builtins<103>. 
* Library: Library<106>. 
* Documentation: Documentation<35>. 
* Tests: Tests<35>. 
* Build: Build<42>. 
* Windows: Windows<36>. 
* macOS: macOS<26>. 
* IDLE: IDLE<18>. 
* C API: C API<37>. 

Python 3.11.0 alpha 1

* Security: Security<30>. 
* Core and Builtins: Core and Builtins<104>. 
* Library: Library<107>. 
* Core and Builtins: Core and Builtins<105>. 
* Library: Library<108>. 
* Core and Builtins: Core and Builtins<106>. 
* Library: Library<109>. 
* Core and Builtins: Core and Builtins<107>. 
* Library: Library<110>. 
* Core and Builtins: Core and Builtins<108>. 
* Library: Library<111>. 
* Core and Builtins: Core and Builtins<109>. 
* Library: Library<112>. 
* Core and Builtins: Core and Builtins<110>. 
* Library: Library<113>. 
* Core and Builtins: Core and Builtins<111>. 
* Library: Library<114>. 
* Core and Builtins: Core and Builtins<112>. 
* Library: Library<115>. 
* Core and Builtins: Core and Builtins<113>. 
* Library: Library<116>. 
* Documentation: Documentation<36>. 
* Tests: Tests<36>. 
* Build: Build<43>. 
* Windows: Windows<37>. 
* macOS: macOS<27>. 
* IDLE: IDLE<19>. 
* Tools/Demos: Tools/Demos<27>. 
* C API: C API<38>. 

Python 3.10.0 beta 1

* Security: Security<31>. 
* Core and Builtins: Core and Builtins<114>. 
* Library: Library<117>. 
* Core and Builtins: Core and Builtins<115>. 
* Library: Library<118>. 
* Core and Builtins: Core and Builtins<116>. 
* Library: Library<119>. 
* Documentation: Documentation<37>. 
* Tests: Tests<37>. 
* Build: Build<44>. 
* Windows: Windows<38>. 
* macOS: macOS<28>. 
* IDLE: IDLE<20>. 
* C API: C API<39>. 

Python 3.10.0 alpha 7

* Security: Security<32>. 
* Core and Builtins: Core and Builtins<117>. 
* Library: Library<120>. 
* Core and Builtins: Core and Builtins<118>. 
* Library: Library<121>. 
* Documentation: Documentation<38>. 
* Tests: Tests<38>. 
* Build: Build<45>. 
* Windows: Windows<39>. 
* IDLE: IDLE<21>. 
* C API: C API<40>. 

Python 3.10.0 alpha 6

* Security: Security<33>. 
* Core and Builtins: Core and Builtins<119>. 
* Library: Library<122>. 
* Core and Builtins: Core and Builtins<120>. 
* Library: Library<123>. 
* Core and Builtins: Core and Builtins<121>. 
* Library: Library<124>. 
* Documentation: Documentation<39>. 
* Tests: Tests<39>. 
* Build: Build<46>. 
* Windows: Windows<40>. 
* macOS: macOS<29>. 
* IDLE: IDLE<22>. 
* C API: C API<41>. 

Python 3.10.0 alpha 5

* Security: Security<34>. 
* Core and Builtins: Core and Builtins<122>. 
* Library: Library<125>. 
* Core and Builtins: Core and Builtins<123>. 
* Library: Library<126>. 
* Documentation: Documentation<40>. 
* Tests: Tests<40>. 
* Build: Build<47>. 
* Windows: Windows<41>. 
* macOS: macOS<30>. 
* IDLE: IDLE<23>. 
* C API: C API<42>. 

Python 3.10.0 alpha 4

* Core and Builtins: Core and Builtins<124>. 
* Library: Library<127>. 
* Core and Builtins: Core and Builtins<125>. 
* Library: Library<128>. 
* Core and Builtins: Core and Builtins<126>. 
* Library: Library<129>. 
* Documentation: Documentation<41>. 
* Tests: Tests<41>. 
* Build: Build<48>. 
* macOS: macOS<31>. 
* Tools/Demos: Tools/Demos<28>. 
* C API: C API<43>. 

Python 3.10.0 alpha 3

* Security: Security<35>. 
* Core and Builtins: Core and Builtins<127>. 
* Library: Library<130>. 
* Core and Builtins: Core and Builtins<128>. 
* Library: Library<131>. 
* Core and Builtins: Core and Builtins<129>. 
* Library: Library<132>. 
* Core and Builtins: Core and Builtins<130>. 
* Library: Library<133>. 
* Documentation: Documentation<42>. 
* Tests: Tests<42>. 
* Build: Build<49>. 
* Windows: Windows<42>. 
* macOS: macOS<32>. 
* IDLE: IDLE<24>. 
* Tools/Demos: Tools/Demos<29>. 
* C API: C API<44>. 

Python 3.10.0 alpha 2

* Security: Security<36>. 
* Core and Builtins: Core and Builtins<131>. 
* Library: Library<134>. 
* Core and Builtins: Core and Builtins<132>. 
* Library: Library<135>. 
* Documentation: Documentation<43>. 
* Tests: Tests<43>. 
* Build: Build<50>. 
* Windows: Windows<43>. 
* macOS: macOS<33>. 
* IDLE: IDLE<25>. 
* C API: C API<45>. 

Python 3.10.0 alpha 1

* Security: Security<37>. 
* Core and Builtins: Core and Builtins<133>. 
* Library: Library<136>. 
* Core and Builtins: Core and Builtins<134>. 
* Library: Library<137>. 
* Core and Builtins: Core and Builtins<135>. 
* Library: Library<138>. 
* Core and Builtins: Core and Builtins<136>. 
* Library: Library<139>. 
* Core and Builtins: Core and Builtins<137>. 
* Library: Library<140>. 
* Core and Builtins: Core and Builtins<138>. 
* Library: Library<141>. 
* Core and Builtins: Core and Builtins<139>. 
* Library: Library<142>. 
* Core and Builtins: Core and Builtins<140>. 
* Library: Library<143>. 
* Core and Builtins: Core and Builtins<141>. 
* Library: Library<144>. 
* Core and Builtins: Core and Builtins<142>. 
* Library: Library<145>. 
* Core and Builtins: Core and Builtins<143>. 
* Library: Library<146>. 
* Core and Builtins: Core and Builtins<144>. 
* Library: Library<147>. 
* Core and Builtins: Core and Builtins<145>. 
* Library: Library<148>. 
* Core and Builtins: Core and Builtins<146>. 
* Library: Library<149>. 
* Core and Builtins: Core and Builtins<147>. 
* Library: Library<150>. 
* Documentation: Documentation<44>. 
* Tests: Tests<44>. 
* Build: Build<51>. 
* Windows: Windows<44>. 
* macOS: macOS<34>. 
* IDLE: IDLE<26>. 
* C API: C API<46>. 

Python 3.9.0 beta 1

* Security: Security<38>. 
* Core and Builtins: Core and Builtins<148>. 
* Library: Library<151>. 
* Documentation: Documentation<45>. 
* Tests: Tests<45>. 
* Build: Build<52>. 
* Windows: Windows<45>. 
* macOS: macOS<35>. 
* Tools/Demos: Tools/Demos<30>. 
* C API: C API<47>. 

Python 3.9.0 alpha 6

* Security: Security<39>. 
* Core and Builtins: Core and Builtins<149>. 
* Library: Library<152>. 
* Documentation: Documentation<46>. 
* Tests: Tests<46>. 
* Build: Build<53>. 
* Windows: Windows<46>. 
* macOS: macOS<36>. 
* IDLE: IDLE<27>. 
* Tools/Demos: Tools/Demos<31>. 
* C API: C API<48>. 

Python 3.9.0 alpha 5

* Security: Security<40>. 
* Core and Builtins: Core and Builtins<150>. 
* Library: Library<153>. 
* Documentation: Documentation<47>. 
* Tests: Tests<47>. 
* Build: Build<54>. 
* Windows: Windows<47>. 
* macOS: macOS<37>. 
* IDLE: IDLE<28>. 
* Tools/Demos: Tools/Demos<32>. 
* C API: C API<49>. 

Python 3.9.0 alpha 4

* Security: Security<41>. 
* Core and Builtins: Core and Builtins<151>. 
* Library: Library<154>. 
* Documentation: Documentation<48>. 
* Tests: Tests<48>. 
* Build: Build<55>. 
* Windows: Windows<48>. 
* IDLE: IDLE<29>. 
* C API: C API<50>. 

Python 3.9.0 alpha 3

* Core and Builtins: Core and Builtins<152>. 
* Library: Library<155>. 
* Documentation: Documentation<49>. 
* Build: Build<56>. 
* IDLE: IDLE<30>. 
* C API: C API<51>. 

Python 3.9.0 alpha 2

* Security: Security<42>. 
* Core and Builtins: Core and Builtins<153>. 
* Library: Library<156>. 
* Documentation: Documentation<50>. 
* Tests: Tests<49>. 
* Build: Build<57>. 
* Windows: Windows<49>. 
* macOS: macOS<38>. 
* IDLE: IDLE<31>. 
* C API: C API<52>. 

Python 3.9.0 alpha 1

* Security: Security<43>. 
* Core and Builtins: Core and Builtins<154>. 
* Library: Library<157>. 
* Documentation: Documentation<51>. 
* Tests: Tests<50>. 
* Build: Build<58>. 
* Windows: Windows<50>. 
* macOS: macOS<39>. 
* IDLE: IDLE<32>. 
* Tools/Demos: Tools/Demos<33>. 
* C API: C API<53>. 

Python 3.8.0 beta 1

* Security: Security<44>. 
* Core and Builtins: Core and Builtins<155>. 
* Library: Library<158>. 
* Documentation: Documentation<52>. 
* Tests: Tests<51>. 
* Build: Build<59>. 
* Windows: Windows<51>. 
* macOS: macOS<40>. 
* IDLE: IDLE<33>. 
* Tools/Demos: Tools/Demos<34>. 
* C API: C API<54>. 

Python 3.8.0 alpha 4

* Security: Security<45>. 
* Core and Builtins: Core and Builtins<156>. 
* Library: Library<159>. 
* Documentation: Documentation<53>. 
* Tests: Tests<52>. 
* Build: Build<60>. 
* Windows: Windows<52>. 
* macOS: macOS<41>. 
* IDLE: IDLE<34>. 
* Tools/Demos: Tools/Demos<35>. 
* C API: C API<55>. 

Python 3.8.0 alpha 3

* Security: Security<46>. 
* Core and Builtins: Core and Builtins<157>. 
* Library: Library<160>. 
* Documentation: Documentation<54>. 
* Tests: Tests<53>. 
* Build: Build<61>. 
* Windows: Windows<53>. 
* IDLE: IDLE<35>. 
* Tools/Demos: Tools/Demos<36>. 
* C API: C API<56>. 

Python 3.8.0 alpha 2

* Core and Builtins: Core and Builtins<158>. 
* Library: Library<161>. 
* Documentation: Documentation<55>. 
* Tests: Tests<54>. 
* Windows: Windows<54>. 
* IDLE: IDLE<36>. 

Python 3.8.0 alpha 1

* Security: Security<47>. 
* Core and Builtins: Core and Builtins<159>. 
* Library: Library<162>. 
* Documentation: Documentation<56>. 
* Tests: Tests<55>. 
* Build: Build<62>. 
* Windows: Windows<55>. 
* macOS: macOS<42>. 
* IDLE: IDLE<37>. 
* Tools/Demos: Tools/Demos<37>. 
* C API: C API<57>. 

Python 3.7.0 final

* Library: Library<163>. 
* C API: C API<58>. 

Python 3.7.0 release candidate 1

* Core and Builtins: Core and Builtins<160>. 
* Library: Library<164>. 
* Documentation: Documentation<57>. 
* Build: Build<63>. 
* Windows: Windows<56>. 
* IDLE: IDLE<38>. 

Python 3.7.0 beta 5

* Core and Builtins: Core and Builtins<161>. 
* Library: Library<165>. 
* Documentation: Documentation<58>. 
* Tests: Tests<56>. 
* Build: Build<64>. 
* macOS: macOS<43>. 
* IDLE: IDLE<39>. 

Python 3.7.0 beta 4

* Core and Builtins: Core and Builtins<162>. 
* Library: Library<166>. 
* Documentation: Documentation<59>. 
* Tests: Tests<57>. 
* Build: Build<65>. 
* Windows: Windows<57>. 
* macOS: macOS<44>. 
* IDLE: IDLE<40>. 
* Tools/Demos: Tools/Demos<38>. 

Python 3.7.0 beta 3

* Security: Security<48>. 
* Core and Builtins: Core and Builtins<163>. 
* Library: Library<167>. 
* Documentation: Documentation<60>. 
* Tests: Tests<58>. 
* Build: Build<66>. 
* Windows: Windows<58>. 
* macOS: macOS<45>. 
* IDLE: IDLE<41>. 
* Tools/Demos: Tools/Demos<39>. 
* C API: C API<59>. 

Python 3.7.0 beta 2

* Security: Security<49>. 
* Core and Builtins: Core and Builtins<164>. 
* Library: Library<168>. 
* Documentation: Documentation<61>. 
* Tests: Tests<59>. 
* Build: Build<67>. 
* Windows: Windows<59>. 
* macOS: macOS<46>. 
* IDLE: IDLE<42>. 
* Tools/Demos: Tools/Demos<40>. 

Python 3.7.0 beta 1

* Core and Builtins: Core and Builtins<165>. 
* Library: Library<169>. 
* Documentation: Documentation<62>. 
* Tests: Tests<60>. 
* Build: Build<68>. 
* Windows: Windows<60>. 
* macOS: macOS<47>. 
* C API: C API<60>. 

Python 3.7.0 alpha 4

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

Python 3.7.0 alpha 3

* Core and Builtins: Core and Builtins<167>. 
* Library: Library<171>. 
* Documentation: Documentation<64>. 
* Tests: Tests<62>. 
* Build: Build<69>. 
* Windows: Windows<62>. 
* macOS: macOS<48>. 
* IDLE: IDLE<43>. 
* Tools/Demos: Tools/Demos<42>. 
* C API: C API<62>. 

Python 3.7.0 alpha 2

* Core and Builtins: Core and Builtins<168>. 
* Library: Library<172>. 
* Documentation: Documentation<65>. 
* Build: Build<70>. 
* IDLE: IDLE<44>. 
* C API: C API<63>. 

Python 3.7.0 alpha 1

* Security: Security<50>. 
* Core and Builtins: Core and Builtins<169>. 
* Library: Library<173>. 
* Documentation: Documentation<66>. 
* Tests: Tests<63>. 
* Build: Build<71>. 
* Windows: Windows<63>. 
* IDLE: IDLE<45>. 
* Tools/Demos: Tools/Demos<43>. 
* C API: C API<64>. 

Python 3.6.6 release candidate 1

* Core and Builtins: Core and Builtins<170>. 
* Library: Library<174>. 
* Documentation: Documentation<67>. 
* Tests: Tests<64>. 
* Build: Build<72>. 
* Windows: Windows<64>. 
* macOS: macOS<49>. 
* IDLE: IDLE<46>. 
* Tools/Demos: Tools/Demos<44>. 
* C API: C API<65>. 

Python 3.6.5 final

* Tests: Tests<65>. 
* Build: Build<73>. 

Python 3.6.5 release candidate 1

* Security: Security<51>. 
* Core and Builtins: Core and Builtins<171>. 
* Library: Library<175>. 
* Documentation: Documentation<68>. 
* Tests: Tests<66>. 
* Build: Build<74>. 
* Windows: Windows<65>. 
* macOS: macOS<50>. 
* IDLE: IDLE<47>. 
* Tools/Demos: Tools/Demos<45>. 
* C API: C API<66>. 

Python 3.6.4 release candidate 1

* Core and Builtins: Core and Builtins<172>. 
* Library: Library<176>. 
* Documentation: Documentation<69>. 
* Tests: Tests<67>. 
* Build: Build<75>. 
* Windows: Windows<66>. 
* macOS: macOS<51>. 
* IDLE: IDLE<48>. 
* Tools/Demos: Tools/Demos<46>. 
* C API: C API<67>. 

Python 3.6.3 final

* Library: Library<177>. 
* Build: Build<76>. 

Python 3.6.3 release candidate 1

* Security: Security<52>. 
* Core and Builtins: Core and Builtins<173>. 
* Library: Library<178>. 
* Documentation: Documentation<70>. 
* Tests: Tests<68>. 
* Build: Build<77>. 
* Windows: Windows<67>. 
* IDLE: IDLE<49>. 
* Tools/Demos: Tools/Demos<47>. 

Python 3.6.2 release candidate 2

* Security: Security<53>. 

Python 3.6.2 release candidate 1

* Security: Security<54>. 
* Core and Builtins: Core and Builtins<174>. 
* Library: Library<179>. 
* IDLE: IDLE<50>. 
* C API: C API<68>. 
* Build: Build<78>. 
* Documentation: Documentation<71>. 
* Tools/Demos: Tools/Demos<48>. 
* Tests: Tests<69>. 
* Windows: Windows<68>. 

Python 3.6.1 final

* Core and Builtins: Core and Builtins<175>. 
* Build: Build<79>. 

Python 3.6.1 release candidate 1

* Core and Builtins: Core and Builtins<176>. 
* Library: Library<180>. 
* IDLE: IDLE<51>. 
* Windows: Windows<69>. 
* C API: C API<69>. 
* Documentation: Documentation<72>. 
* Tests: Tests<70>. 
* Build: Build<80>. 

Python 3.6.0 release candidate 2

* Core and Builtins: Core and Builtins<177>. 
* Tools/Demos: Tools/Demos<49>. 
* Windows: Windows<70>. 
* Build: Build<81>. 

Python 3.6.0 release candidate 1

* Core and Builtins: Core and Builtins<178>. 
* Library: Library<181>. 
* C API: C API<70>. 
* Documentation: Documentation<73>. 
* Tools/Demos: Tools/Demos<50>. 

Python 3.6.0 beta 4

* Core and Builtins: Core and Builtins<179>. 
* Library: Library<182>. 
* Documentation: Documentation<74>. 
* Tests: Tests<71>. 
* Build: Build<82>. 

Python 3.6.0 beta 3

* Core and Builtins: Core and Builtins<180>. 
* Library: Library<183>. 
* Windows: Windows<71>. 
* Build: Build<83>. 
* Tests: Tests<72>. 

Python 3.6.0 beta 2

* Core and Builtins: Core and Builtins<181>. 
* Library: Library<184>. 
* Windows: Windows<72>. 
* C API: C API<71>. 
* Build: Build<84>. 
* Tests: Tests<73>. 

Python 3.6.0 beta 1

* Core and Builtins: Core and Builtins<182>. 
* Library: Library<185>. 
* IDLE: IDLE<52>. 
* C API: C API<72>. 
* Tests: Tests<74>. 
* Build: Build<85>. 
* Tools/Demos: Tools/Demos<51>. 
* Windows: Windows<73>. 

Python 3.6.0 alpha 4

* Core and Builtins: Core and Builtins<183>. 
* Library: Library<186>. 
* IDLE: IDLE<53>. 
* Tests: Tests<75>. 
* Windows: Windows<74>. 
* Build: Build<86>. 

Python 3.6.0 alpha 3

* Security: Security<55>. 
* Core and Builtins: Core and Builtins<184>. 
* Library: Library<187>. 
* IDLE: IDLE<54>. 
* C API: C API<73>. 
* Build: Build<87>. 
* Tools/Demos: Tools/Demos<52>. 
* Documentation: Documentation<75>. 
* Tests: Tests<76>. 

Python 3.6.0 alpha 2

* Security: Security<56>. 
* Core and Builtins: Core and Builtins<185>. 
* Library: Library<188>. 
* IDLE: IDLE<55>. 
* Documentation: Documentation<76>. 
* Tests: Tests<77>. 
* Windows: Windows<75>. 
* Build: Build<88>. 
* C API: C API<74>. 
* Tools/Demos: Tools/Demos<53>. 

Python 3.6.0 alpha 1

* Security: Security<57>. 
* Core and Builtins: Core and Builtins<186>. 
* Library: Library<189>. 
* IDLE: IDLE<56>. 
* Documentation: Documentation<77>. 
* Tests: Tests<78>. 
* Build: Build<89>. 
* Windows: Windows<76>. 
* Tools/Demos: Tools/Demos<54>. 
* C API: C API<75>. 

Python 3.5.5 release candidate 1

* Security: Security<58>. 
* Core and Builtins: Core and Builtins<187>. 
* Library: Library<190>. 

Python 3.5.4 final

* Library: Library<191>. 

Python 3.5.4 release candidate 1

* Security: Security<59>. 
* Core and Builtins: Core and Builtins<188>. 
* Library: Library<192>. 
* Documentation: Documentation<78>. 
* Tests: Tests<79>. 
* Build: Build<90>. 
* Windows: Windows<77>. 
* C API: C API<76>. 

Python 3.5.3 release candidate 1

* Security: Security<60>. 
* Core and Builtins: Core and Builtins<189>. 
* Library: Library<193>. 
* IDLE: IDLE<57>. 
* C API: C API<77>. 
* Documentation: Documentation<79>. 
* Tests: Tests<80>. 
* Tools/Demos: Tools/Demos<55>. 
* Windows: Windows<78>. 
* Build: Build<91>. 

Python 3.5.2 final

* Core and Builtins: Core and Builtins<190>. 
* Tests: Tests<81>. 
* IDLE: IDLE<58>. 

Python 3.5.2 release candidate 1

* Security: Security<61>. 
* Core and Builtins: Core and Builtins<191>. 
* Library: Library<194>. 
* IDLE: IDLE<59>. 
* Documentation: Documentation<80>. 
* Tests: Tests<82>. 
* Build: Build<92>. 
* Windows: Windows<79>. 
* Tools/Demos: Tools/Demos<56>. 

Python 3.5.1 final

* Core and Builtins: Core and Builtins<192>. 
* Windows: Windows<80>. 

Python 3.5.1 release candidate 1

* Core and Builtins: Core and Builtins<193>. 
* Library: Library<195>. 
* IDLE: IDLE<60>. 
* Documentation: Documentation<81>. 
* Tests: Tests<83>. 
* Build: Build<93>. 
* Windows: Windows<81>. 
* Tools/Demos: Tools/Demos<57>. 

Python 3.5.0 final

* Build: Build<94>. 

Python 3.5.0 release candidate 4

* Library: Library<196>. 
* Build: Build<95>. 

Python 3.5.0 release candidate 3

* Core and Builtins: Core and Builtins<194>. 
* Library: Library<197>. 

Python 3.5.0 release candidate 2

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

Python 3.5.0 release candidate 1

* Core and Builtins: Core and Builtins<196>. 
* Library: Library<199>. 
* IDLE: IDLE<61>. 
* Documentation: Documentation<82>. 
* Tests: Tests<84>. 

Python 3.5.0 beta 4

* Core and Builtins: Core and Builtins<197>. 
* Library: Library<200>. 
* Build: Build<96>. 

Python 3.5.0 beta 3

* Core and Builtins: Core and Builtins<198>. 
* Library: Library<201>. 
* Tests: Tests<85>. 
* Documentation: Documentation<83>. 
* Build: Build<97>. 

Python 3.5.0 beta 2

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

Python 3.5.0 beta 1

* Core and Builtins: Core and Builtins<200>. 
* Library: Library<203>. 
* IDLE: IDLE<62>. 
* Tests: Tests<86>. 
* Documentation: Documentation<84>. 
* Tools/Demos: Tools/Demos<58>. 

Python 3.5.0 alpha 4

* Core and Builtins: Core and Builtins<201>. 
* Library: Library<204>. 
* Build: Build<98>. 
* Tests: Tests<87>. 
* Tools/Demos: Tools/Demos<59>. 
* C API: C API<78>. 

Python 3.5.0 alpha 3

* Core and Builtins: Core and Builtins<202>. 
* Library: Library<205>. 
* Build: Build<99>. 
* Tests: Tests<88>. 
* Tools/Demos: Tools/Demos<60>. 

Python 3.5.0 alpha 2

* Core and Builtins: Core and Builtins<203>. 
* Library: Library<206>. 
* Build: Build<100>. 
* C API: C API<79>. 
* Windows: Windows<82>. 

Python 3.5.0 alpha 1

* Core and Builtins: Core and Builtins<204>. 
* Library: Library<207>. 
* IDLE: IDLE<63>. 
* Build: Build<101>. 
* C API: C API<80>. 
* Documentation: Documentation<85>. 
* Tests: Tests<89>. 
* Tools/Demos: Tools/Demos<61>. 
* Windows: Windows<83>. 

파이썬 자습서

* 입맛 돋우기:: 
* 파이썬 인터프리터 사용하기:: 
* 파이썬의 간략한 소개:: 
* 기타 제어 흐름 도구:: 
* 자료 구조:: 
* 모듈:: 
* 입력과 출력:: 
* 에러와 예외:: 
* 클래스:: 
* Brief tour of the standard library:: 
* 표준 라이브러리 둘러보기 — 2부:: 
* 가상 환경 및 패키지:: 
* 이제 뭘 하지?:: 
* 대화형 입력 편집 및 히스토리 치환:: 
* 부동 소수점 산술; 문제점 및 한계: 부동 소수점 산술 문제점 및 한계. 
* 부록:: 

파이썬 인터프리터 사용하기

* 인터프리터 실행하기:: 
* 인터프리터와 환경:: 

인터프리터 실행하기

* 인자 전달:: 
* 대화형 모드:: 

인터프리터와 환경

* 소스 코드 인코딩:: 

파이썬의 간략한 소개

* 파이썬을 계산기로 사용하기:: 
* 프로그래밍으로의 첫걸음:: 

파이썬을 계산기로 사용하기

* 숫자:: 
* 텍스트:: 
* 리스트:: 

기타 제어 흐름 도구

* if 문:: 
* for 문:: 
* range() 함수: range 함수. 
* break 와 continue 문:: 
* 루프의 else 절:: 
* pass 문:: 
* match 문:: 
* 함수 정의하기:: 
* 함수 정의 더 보기:: 
* 막간극; 코딩 스타일: 막간극 코딩 스타일. 

함수 정의 더 보기

* 기본 인자 값:: 
* 키워드 인자:: 
* 특수 매개 변수:: 
* 임의의 인자 목록:: 
* 인자 목록 언 패킹:: 
* 람다 표현식:: 
* 도큐멘테이션 문자열:: 
* 함수 어노테이션:: 

특수 매개 변수

* 위치-키워드(Positional-or-Keyword) 인자: 위치-키워드 Positional-or-Keyword 인자. 
* 위치 전용 매개 변수: 위치 전용 매개 변수<2>. 
* 키워드 전용 인자:: 
* 함수 예제:: 
* 복습:: 

자료 구조

* 리스트 더 보기:: 
* del 문:: 
* 튜플과 시퀀스:: 
* 집합:: 
* 딕셔너리:: 
* 루프 테크닉:: 
* 조건 더 보기:: 
* 시퀀스와 다른 형들을 비교하기:: 

리스트 더 보기

* 리스트를 스택으로 사용하기:: 
* 리스트를 큐로 사용하기:: 
* 리스트 컴프리헨션:: 
* 중첩된 리스트 컴프리헨션:: 

모듈

* 모듈 더 보기:: 
* 표준 모듈들:: 
* dir() 함수: dir 함수. 
* 패키지:: 

모듈 더 보기

* 모듈을 스크립트로 실행하기:: 
* 모듈 검색 경로:: 
* “컴파일된” 파이썬 파일:: 

패키지

* 패키지에서 * 임포트 하기:: 
* 패키지 내부 간의 참조:: 
* 여러 디렉터리에 있는 패키지:: 

입력과 출력

* 장식적인 출력 포매팅:: 
* 파일을 읽고 쓰기:: 

장식적인 출력 포매팅

* 포맷 문자열 리터럴:: 
* 문자열 format() 메서드: 문자열 format 메서드. 
* 수동 문자열 포매팅:: 
* 예전의 문자열 포매팅:: 

파일을 읽고 쓰기

* 파일 객체의 매소드:: 
* json 으로 구조적인 데이터를 저장하기:: 

에러와 예외

* 문법 에러:: 
* 예외:: 
* 예외 처리하기:: 
* 예외 일으키기:: 
* 예외 연쇄:: 
* 사용자 정의 예외:: 
* 뒷정리 동작 정의하기:: 
* 미리 정의된 뒷정리 동작들:: 
* Raising and Handling Multiple Unrelated Exceptions:: 
* Enriching Exceptions with Notes:: 

클래스

* 이름과 객체에 관한 한마디:: 
* 파이썬 스코프와 이름 공간:: 
* 클래스와의 첫 만남:: 
* 기타 주의사항들:: 
* 상속:: 
* 비공개 변수:: 
* 잡동사니:: 
* 이터레이터:: 
* 제너레이터:: 
* 제너레이터 표현식:: 

파이썬 스코프와 이름 공간

* 스코프와 이름 공간 예:: 

클래스와의 첫 만남

* 클래스 정의 문법:: 
* 클래스 객체:: 
* 인스턴스 객체:: 
* 메서드 객체:: 
* 클래스와 인스턴스 변수:: 

상속

* 다중 상속:: 

Brief tour of the standard library

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

표준 라이브러리 둘러보기 — 2부

* 출력 포매팅:: 
* 템플릿:: 
* 바이너리 데이터 레코드 배치 작업:: 
* 다중 스레딩:: 
* 로깅:: 
* 약한 참조:: 
* 리스트 작업 도구:: 
* 10진 부동 소수점 산술:: 

가상 환경 및 패키지

* 소개:: 
* 가상 환경 만들기:: 
* pip로 패키지 관리하기:: 

대화형 입력 편집 및 히스토리 치환

* 탭 완성 및 히스토리 편집:: 
* 대화형 인터프리터 대안:: 

부동 소수점 산술: 문제점 및 한계

* 표현 오류:: 

부록

* 대화형 모드: 대화형 모드<2>. 

대화형 모드

* 에러 처리:: 
* 실행 가능한 파이썬 스크립트:: 
* 대화형 시작 파일:: 
* 커스터마이제이션 모듈:: 

파이썬 설정 및 사용법

* 명령 줄과 환경:: 
* 유닉스 플랫폼에서 파이썬 사용하기:: 
* Configure Python:: 
* 윈도우에서 파이썬 사용하기:: 
* macOS 에서 파이썬 사용하기:: 
* Using Python on Android:: 
* Using Python on iOS:: 
* 편집기와 IDE:: 

명령 줄과 환경

* 명령 줄:: 
* 환경 변수:: 

명령 줄

* 인터페이스 옵션:: 
* 일반 옵션:: 
* 기타 옵션:: 
* Controlling color:: 

환경 변수

* 디버그 모드 변수:: 

유닉스 플랫폼에서 파이썬 사용하기

* 최신 버전의 파이썬 내려받기와 설치:: 
* 파이썬 빌드하기:: 
* 파이썬 관련 경로와 파일:: 
* 잡동사니: 잡동사니<2>. 
* Custom OpenSSL:: 

최신 버전의 파이썬 내려받기와 설치

* 리눅스:: 
* FreeBSD와 OpenBSD:: 

리눅스

* Installing IDLE:: 

Configure Python

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

Build Requirements

* Requirements for optional modules:: 

Generated files

* configure script:: 

Configure Options

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

Python Build System

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

Main Makefile targets

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

Compiler and linker flags

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

윈도우에서 파이썬 사용하기

* Python install manager:: 
* 내장 가능한 패키지:: 
* nuget.org 패키지: nuget org 패키지. 
* 대체 번들:: 
* Supported Windows versions:: 
* Removing the MAX_PATH limitation:: 
* UTF-8 모드:: 
* 모듈 찾기:: 
* 추가 모듈:: 
* 윈도우에서 파이썬 컴파일하기:: 
* The full installer (deprecated): The full installer deprecated. 
* Python launcher for Windows (deprecated): Python launcher for Windows deprecated. 

Python install manager

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

내장 가능한 패키지

* Python application:: 
* 파이썬 내장하기:: 

nuget.org 패키지

* 자유 스레드 패키지:: 

추가 모듈

* PyWin32:: 
* cx_Freeze:: 

The full installer (deprecated)

* 설치 단계:: 
* Removing the MAX_PATH limitation: Removing the MAX_PATH limitation<2>. 
* Installing without UI:: 
* Installing without downloading:: 
* 설치 수정하기:: 
* Installing free-threaded binaries: Installing free-threaded binaries<2>. 

Python launcher for Windows (deprecated)

* 시작하기:: 
* Shebang lines: Shebang lines<2>. 
* 셔뱅 줄의 인자:: 
* 사용자 정의:: 
* 진단:: 
* Dry run:: 
* 필요 시 설치:: 
* Return codes:: 

시작하기

* 명령 줄에서:: 
* 가상 환경:: 
* 스크립트에서:: 
* 파일 연결에서:: 

사용자 정의

* INI 파일을 통한 사용자 정의:: 
* 기본 파이썬 버전 사용자 정의:: 

macOS 에서 파이썬 사용하기

* python.org에서 제공하는 macOS용 파이썬 사용하기: python org에서 제공하는 macOS용 파이썬 사용하기. 
* Alternative Distributions:: 
* 추가 파이썬 패키지 설치하기:: 
* GUI 프로그래밍:: 
* Advanced Topics:: 
* 기타 자원:: 

python.org에서 제공하는 macOS용 파이썬 사용하기

* Installation steps:: 
* 파이썬 스크립트를 실행하는 방법:: 

Advanced Topics

* Installing Free-threaded Binaries:: 
* Installing using the command line:: 
* 파이썬 응용 프로그램 배포하기:: 
* App Store Compliance:: 

Using Python on Android

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

Using Python on iOS

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

Python at runtime on iOS

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

Installing Python on iOS

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

App Store Compliance

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

편집기와 IDE

* IDLE — Python editor and shell:: 
* 다른 편집기와 IDE:: 

파이썬 언어 레퍼런스

* 개요:: 
* 어휘 분석:: 
* 데이터 모델:: 
* 실행 모델:: 
* 임포트 시스템:: 
* 표현식:: 
* 단순문(Simple statements): 단순문 Simple statements. 
* 복합문(Compound statements): 복합문 Compound statements. 
* 최상위 요소들:: 
* 전체 문법 규격:: 

개요

* 대안 구현들:: 
* 표기법:: 

표기법

* Lexical and Syntactic definitions:: 

어휘 분석

* 줄 구조(Line structure): 줄 구조 Line structure. 
* 다른 토큰들:: 
* Names (identifiers and keywords): Names identifiers and keywords. 
* 리터럴:: 
* 문자열과 바이트열 리터럴:: 
* 숫자 리터럴:: 
* Operators and delimiters:: 

줄 구조(Line structure)

* 논리적인 줄:: 
* 물리적인 줄:: 
* 주석:: 
* 인코딩 선언:: 
* 명시적인 줄 결합:: 
* 묵시적인 줄 결합:: 
* 빈 줄:: 
* 들여쓰기:: 
* 토큰 사이의 공백:: 
* End marker:: 

Names (identifiers and keywords)

* 키워드:: 
* 소프트 키워드:: 
* 식별자의 예약 영역:: 
* Non-ASCII characters in names:: 

문자열과 바이트열 리터럴

* Triple-quoted strings:: 
* String prefixes:: 
* Formal grammar:: 
* 이스케이프 시퀀스:: 
* Bytes literals:: 
* Raw string literals:: 
* 포맷 문자열 리터럴: 포맷 문자열 리터럴<2>. 
* t-strings:: 
* Formal grammar for f-strings:: 

이스케이프 시퀀스

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

숫자 리터럴

* 정수 리터럴:: 
* 실수 리터럴:: 
* 허수 리터럴:: 

데이터 모델

* 객체@comma{} 값@comma{} 형: 객체 값 형. 
* 표준형 계층:: 
* 특수 메서드 이름들:: 
* 코루틴(Coroutines): 코루틴 Coroutines. 

표준형 계층

* None:: 
* NotImplemented:: 
* Ellipsis:: 
* numbers.Number: numbers Number. 
* 시퀀스들:: 
* 집합 형들(Set types): 집합 형들 Set types. 
* 매핑(Mappings): 매핑 Mappings. 
* 콜러블(Callable types): 콜러블 Callable types. 
* 모듈(Modules): 모듈 Modules. 
* 사용자 정의 클래스(Custom classes): 사용자 정의 클래스 Custom classes. 
* 클래스 인스턴스(Class instances): 클래스 인스턴스 Class instances. 
* I/O 객체 (파일 객체라고도 알려져 있습니다): I/O 객체 파일 객체라고도 알려져 있습니다. 
* 내부 형(Internal types): 내부 형 Internal types. 

numbers.Number

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

시퀀스들

* 불변 시퀀스:: 
* 가변 시퀀스:: 

매핑(Mappings)

* 딕셔너리(Dictionaries): 딕셔너리 Dictionaries. 

콜러블(Callable types)

* 사용자 정의 함수:: 
* 인스턴스 메서드(Instance methods): 인스턴스 메서드 Instance methods. 
* 제너레이터 함수(Generator functions): 제너레이터 함수 Generator functions. 
* 코루틴 함수(Coroutine functions): 코루틴 함수 Coroutine functions. 
* 비동기 제너레이터 함수(Asynchronous generator functions): 비동기 제너레이터 함수 Asynchronous generator functions. 
* 내장 함수(Built-in functions): 내장 함수 Built-in functions. 
* 내장 메서드(Built-in methods): 내장 메서드 Built-in methods. 
* 클래스(Classes): 클래스 Classes. 
* 클래스 인스턴스(Class Instances): 클래스 인스턴스 Class Instances. 

사용자 정의 함수

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

모듈(Modules)

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

사용자 정의 클래스(Custom classes)

* Special attributes:: 
* Special methods:: 

클래스 인스턴스(Class instances)

* Special attributes: Special attributes<2>. 

내부 형(Internal types)

* 코드 객체(Code objects): 코드 객체 Code objects. 
* 프레임 객체(Frame objects): 프레임 객체 Frame objects. 
* 트레이스백 객체(Traceback objects): 트레이스백 객체 Traceback objects. 
* 슬라이스 객체(Slice objects): 슬라이스 객체 Slice objects. 
* 스태틱 메서드 객체(Static method objects): 스태틱 메서드 객체 Static method objects. 
* 클래스 메서드 객체(Class method objects): 클래스 메서드 객체 Class method objects. 

코드 객체(Code objects)

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

프레임 객체(Frame objects)

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

특수 메서드 이름들

* 기본적인 커스터마이제이션:: 
* 어트리뷰트 액세스 커스터마이제이션:: 
* 클래스 생성 커스터마이제이션:: 
* 인스턴스 및 서브 클래스 검사 커스터마이제이션:: 
* 제네릭 형 흉내 내기:: 
* 콜러블 객체 흉내 내기:: 
* 컨테이너형 흉내 내기:: 
* 숫자 형 흉내 내기:: 
* with 문 컨텍스트 관리자:: 
* Customizing positional arguments in class pattern matching:: 
* Emulating buffer types:: 
* Annotations:: 
* 특수 메서드 조회:: 

어트리뷰트 액세스 커스터마이제이션

* 모듈 어트리뷰트 액세스 커스터마이제이션:: 
* 디스크립터 구현하기:: 
* 디스크립터 호출하기:: 
* __slots__: __slots__<2>. 

클래스 생성 커스터마이제이션

* 메타 클래스:: 
* MRO 항목 결정하기:: 
* 적절한 메타 클래스 선택하기:: 
* 클래스 이름 공간 준비하기:: 
* 클래스 바디 실행하기:: 
* 클래스 객체 만들기:: 
* 메타 클래스의 용도:: 

제네릭 형 흉내 내기

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

코루틴(Coroutines)

* 어웨이터블 객체(Awaitable Objects): 어웨이터블 객체 Awaitable Objects. 
* 코루틴 객체(Coroutine Objects): 코루틴 객체 Coroutine Objects. 
* 비동기 이터레이터(Asynchronous Iterators): 비동기 이터레이터 Asynchronous Iterators. 
* 비동기 컨텍스트 관리자:: 

실행 모델

* 프로그램의 구조:: 
* 이름과 연결(binding): 이름과 연결 binding. 
* 예외: 예외<2>. 
* Runtime Components:: 

이름과 연결(binding)

* 이름의 연결:: 
* 이름의 검색(resolution): 이름의 검색 resolution. 
* Annotation scopes:: 
* Lazy evaluation:: 
* builtins 와 제한된 실행:: 
* 동적 기능과의 상호작용:: 

Runtime Components

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

임포트 시스템

* importlib: importlib<10>. 
* 패키지(package): 패키지 package. 
* 검색:: 
* 로딩(loading): 로딩 loading. 
* 경로 기반 파인더:: 
* 표준 임포트 시스템 교체하기:: 
* 패키지 상대 임포트:: 
* __main__ 에 대한 특별한 고려:: 
* 참고문헌:: 

패키지(package)

* 정규 패키지:: 
* 이름 공간 패키지:: 

검색

* 모듈 캐시:: 
* 파인더(finder)와 로더(loader): 파인더 finder 와 로더 loader. 
* 임포트 훅(import hooks): 임포트 훅 import hooks. 
* 메타 경로(meta path): 메타 경로 meta path. 

로딩(loading)

* 로더:: 
* 서브 모듈:: 
* 모듈 스펙:: 
* 모듈의 __path__ 어트리뷰트:: 
* 모듈 repr:: 
* 캐시된 바이트 코드 무효화:: 

경로 기반 파인더

* 경로 엔트리 파인더:: 
* 경로 엔트리 파인더 프로토콜:: 

__main__ 에 대한 특별한 고려

* __main__.__spec__: __main__ __spec__. 

표현식

* 산술 변환:: 
* 아톰 (Atoms): 아톰 Atoms. 
* 프라이머리:: 
* 어웨이트 표현식:: 
* 거듭제곱 연산자:: 
* 일 항 산술과 비트 연산:: 
* 이항 산술 연산:: 
* 시프트 연산:: 
* 이항 비트 연산:: 
* 비교:: 
* 논리 연산(Boolean operations): 논리 연산 Boolean operations. 
* 대입 표현식: 대입 표현식<2>. 
* 조건 표현식(Conditional expressions): 조건 표현식 Conditional expressions. 
* 람다(Lambdas): 람다 Lambdas. 
* 표현식 목록(Expression lists): 표현식 목록 Expression lists. 
* 값을 구하는 순서:: 
* 연산자 우선순위:: 

아톰 (Atoms)

* Built-in constants:: 
* 식별자 (이름): 식별자 이름. 
* 리터럴 (Literals): 리터럴 Literals. 
* 괄호 안에 넣은 형:: 
* 리스트@comma{} 집합@comma{} 딕셔너리의 디스플레이(display): 리스트 집합 딕셔너리의 디스플레이 display. 
* 리스트 디스플레이:: 
* 집합 디스플레이:: 
* 딕셔너리 디스플레이:: 
* 제너레이터 표현식 (Generator expressions): 제너레이터 표현식 Generator expressions. 
* 일드 표현식(Yield expressions): 일드 표현식 Yield expressions. 

식별자 (이름)

* Private name mangling:: 

리터럴 (Literals)

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

일드 표현식(Yield expressions)

* 제너레이터-이터레이터 메서드:: 
* 사용 예:: 
* 비동기 제너레이터 함수:: 
* 비동기 제너레이터-이터레이터 메서드:: 

프라이머리

* 어트리뷰트 참조:: 
* Subscriptions and slicings:: 
* 호출:: 

Subscriptions and slicings

* 슬라이싱(Slicings): 슬라이싱 Slicings. 
* Comma-separated subscripts:: 
* “Starred” subscriptions:: 
* Formal subscription grammar:: 

비교

* 값 비교:: 
* 멤버십 검사 연산:: 
* 아이덴티티 비교:: 

단순문(Simple statements)

* 표현식 문:: 
* 대입문:: 
* assert 문:: 
* pass 문: pass 문<2>. 
* del 문: del 문<2>. 
* return 문:: 
* yield 문:: 
* raise 문:: 
* break 문:: 
* continue 문:: 
* 임포트(import) 문: 임포트 import 문. 
* global 문:: 
* nonlocal 문:: 
* type 문:: 

대입문

* 증분 대입문(Augmented assignment statements): 증분 대입문 Augmented assignment statements. 
* 어노테이트된 대입문(Annotated assignment statements): 어노테이트된 대입문 Annotated assignment statements. 

임포트(import) 문

* 퓨처 문:: 

복합문(Compound statements)

* if 문: if 문<2>. 
* while 문:: 
* for 문: for 문<2>. 
* try 문:: 
* with 문:: 
* The match statement:: 
* 함수 정의:: 
* 클래스 정의:: 
* 코루틴:: 
* Type parameter lists:: 
* Annotations: Annotations<2>. 

try 문

* 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:: 

코루틴

* 코루틴 함수 정의:: 
* async for 문:: 
* async with 문:: 

Type parameter lists

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

최상위 요소들

* 완전한 파이썬 프로그램:: 
* 파일 입력:: 
* 대화형 입력:: 
* 표현식 입력:: 

파이썬 표준 라이브러리

* 소개: 소개<2>. 
* 내장 함수:: 
* 내장 상수:: 
* 내장형:: 
* 내장 예외:: 
* Thread Safety Guarantees:: 
* 텍스트 처리 서비스:: 
* 바이너리 데이터 서비스:: 
* 데이터형:: 
* 숫자와 수학 모듈:: 
* 함수형 프로그래밍 모듈:: 
* 파일과 디렉터리 액세스:: 
* 데이터 지속성:: 
* 데이터 압축 및 보관:: 
* 파일 형식:: 
* 암호화 서비스:: 
* 일반 운영 체제 서비스:: 
* Command-line interface libraries:: 
* 동시 실행:: 
* 네트워킹과 프로세스 간 통신:: 
* 인터넷 데이터 처리:: 
* 구조화된 마크업 처리 도구:: 
* 인터넷 프로토콜과 지원:: 
* 멀티미디어 서비스:: 
* 국제화:: 
* Graphical user interfaces with Tk:: 
* 개발 도구:: 
* 디버깅과 프로파일링:: 
* 소프트웨어 패키징 및 배포:: 
* 파이썬 실행시간 서비스:: 
* 사용자 정의 파이썬 인터프리터:: 
* 모듈 임포트 하기:: 
* 파이썬 언어 서비스:: 
* MS 윈도우 특정 서비스:: 
* Unix-specific services:: 
* Modules command-line interface (CLI): Modules command-line interface CLI. 
* 대체된 모듈:: 
* Removed Modules:: 
* Security Considerations: Security Considerations<2>. 

소개

* 가용성에 대한 참고 사항:: 

가용성에 대한 참고 사항

* 웹어셈블리 플랫폼:: 
* 모바일 플랫폼:: 

내장 상수

* site 모듈에 의해 추가된 상수들:: 

내장형

* 논리값 검사:: 
* 논리 연산 — and@comma{} or@comma{} not: 논리 연산 — and or not. 
* 비교: 비교<2>. 
* 숫자 형 — int@comma{} float@comma{} complex: 숫자 형 — int float complex. 
* Boolean Type - bool:: 
* 이터레이터 형:: 
* 시퀀스 형 — list@comma{} tuple@comma{} range: 시퀀스 형 — list tuple range. 
* Text and Binary Sequence Type Methods Summary:: 
* 텍스트 시퀀스 형 — str:: 
* 바이너리 시퀀스 형 — bytes@comma{} bytearray@comma{} memoryview: 바이너리 시퀀스 형 — bytes bytearray memoryview. 
* 집합 형 — set@comma{} frozenset: 집합 형 — set frozenset. 
* 매핑 형 — dict:: 
* 컨텍스트 관리자 형:: 
* Type Annotation Types — Generic Alias@comma{} Union: Type Annotation Types — Generic Alias Union. 
* 기타 내장형:: 
* 특수 어트리뷰트:: 
* Integer string conversion length limitation:: 

숫자 형 — int, float, complex

* 정수 형에 대한 비트 연산:: 
* 정수 형에 대한 추가 메서드:: 
* 실수에 대한 추가 메서드:: 
* Additional Methods on Complex:: 
* 숫자 형의 해싱:: 

이터레이터 형

* 제너레이터 형:: 

시퀀스 형 — list, tuple, range

* 공통 시퀀스 연산:: 
* 불변 시퀀스 형:: 
* 가변 시퀀스 형:: 
* 리스트: 리스트<2>. 
* 튜플:: 
* 범위:: 

텍스트 시퀀스 형 — str

* 문자열 메서드:: 
* Formatted String Literals (f-strings): Formatted String Literals f-strings. 
* Template String Literals (t-strings): Template String Literals t-strings. 
* printf 스타일 문자열 포매팅:: 

Formatted String Literals (f-strings)

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

바이너리 시퀀스 형 — bytes, bytearray, memoryview

* 바이트열 객체:: 
* 바이트 배열 객체:: 
* 바이트열 과 바이트 배열 연산:: 
* printf 스타일 바이너리 포매팅:: 
* 메모리 뷰:: 

매핑 형 — dict

* 딕셔너리 뷰 객체:: 

Type Annotation Types — Generic Alias, Union

* 제네릭 에일리어스 형:: 
* Union Type:: 

제네릭 에일리어스 형

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

기타 내장형

* 모듈: 모듈<2>. 
* 클래스와 클래스 인스턴스:: 
* 함수:: 
* 메서드:: 
* 코드 객체:: 
* 형 객체:: 
* 널 객체:: 
* Ellipsis 객체:: 
* NotImplemented 객체:: 
* 내부 객체:: 

Integer string conversion length limitation

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

내장 예외

* 예외 컨텍스트:: 
* 내장 예외를 상속받기:: 
* 베이스 클래스:: 
* 구체적인 예외:: 
* 경고:: 
* 예외 그룹:: 
* 예외 계층 구조:: 

구체적인 예외

* OS 예외:: 

Thread Safety Guarantees

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

Thread safety levels

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

텍스트 처리 서비스

* string — 일반적인 문자열 연산:: 
* string.templatelib — Support for template string literals: string templatelib — Support for template string literals. 
* re — Regular expression operations:: 
* difflib — 델타 계산을 위한 도우미:: 
* textwrap — 텍스트 래핑과 채우기:: 
* unicodedata — 유니코드 데이터베이스:: 
* stringprep — 인터넷 문자열 준비:: 
* readline — GNU readline 인터페이스:: 
* rlcompleter — GNU readline을 위한 완성 함수:: 

string — 일반적인 문자열 연산

* 문자열 상수:: 
* Custom string formatting:: 
* Format string syntax:: 
* Template strings ($-strings): Template strings $-strings. 
* 도움 함수:: 

Format string syntax

* Format specification mini-language:: 
* 포맷 예제:: 

string.templatelib — Support for template string literals

* Template strings:: 
* Types:: 
* Helper functions:: 

re — Regular expression operations

* 정규식 문법:: 
* 모듈 내용:: 
* 정규식 객체:: 
* 일치 객체:: 
* 정규식 예제:: 

모듈 내용

* Flags:: 
* Functions:: 
* Exceptions:: 

정규식 예제

* 쌍 검사하기:: 
* scanf() 시뮬레이션: scanf 시뮬레이션. 
* search() 대 match(): search 대 match. 
* 전화번호부 만들기:: 
* 텍스트 뒤섞기:: 
* 모든 부사 찾기:: 
* 모든 부사와 그 위치 찾기:: 
* 날 문자열 표기법:: 
* 토크나이저 작성하기:: 

difflib — 델타 계산을 위한 도우미

* SequenceMatcher objects:: 
* SequenceMatcher examples:: 
* Differ objects:: 
* Differ example:: 
* difflib의 명령 줄 인터페이스:: 
* ndiff 예제:: 

readline — GNU readline 인터페이스

* 초기화 파일:: 
* 줄 버퍼:: 
* 히스토리 파일:: 
* 히스토리 목록:: 
* 시동 훅:: 
* 완성:: 
* 예제:: 

바이너리 데이터 서비스

* struct — 패킹 된 바이너리 데이터로 바이트열을 해석:: 
* codecs — 코덱 레지스트리와 베이스 클래스:: 

struct — 패킹 된 바이너리 데이터로 바이트열을 해석

* 함수와 예외:: 
* 포맷 문자열:: 
* 응용:: 
* 클래스: 클래스<2>. 

포맷 문자열

* 바이트 순서@comma{} 크기 및 정렬: 바이트 순서 크기 및 정렬. 
* 포맷 문자:: 
* 예:: 

응용

* 네이티브 포맷:: 
* 표준 포맷:: 

codecs — 코덱 레지스트리와 베이스 클래스

* 코덱 베이스 클래스:: 
* 인코딩과 유니코드:: 
* 표준 인코딩:: 
* 파이썬 특정 인코딩:: 
* encodings — Encodings package:: 
* encodings.idna — Internationalized Domain Names in Applications: encodings idna — Internationalized Domain Names in Applications. 
* encodings.mbcs — Windows ANSI codepage: encodings mbcs — Windows ANSI codepage. 
* encodings.utf_8_sig — UTF-8 codec with BOM signature: encodings utf_8_sig — UTF-8 codec with BOM signature. 

코덱 베이스 클래스

* 에러 처리기:: 
* 상태 없는 인코딩과 디코딩:: 
* 증분 인코딩과 디코딩:: 
* 스트림 인코딩과 디코딩:: 

증분 인코딩과 디코딩

* IncrementalEncoder 객체:: 
* IncrementalDecoder 객체:: 

스트림 인코딩과 디코딩

* StreamWriter 객체:: 
* StreamReader 객체:: 
* StreamReaderWriter 객체:: 
* StreamRecoder 객체:: 

파이썬 특정 인코딩

* 텍스트 인코딩:: 
* 바이너리 변환:: 
* Standalone Codec Functions:: 
* 텍스트 변환:: 

데이터형

* datetime — Basic date and time types:: 
* zoneinfo — IANA 시간대 지원:: 
* calendar — 일반 달력 관련 함수:: 
* collections — 컨테이너 데이터형:: 
* collections.abc — 컨테이너의 추상 베이스 클래스: collections abc — 컨테이너의 추상 베이스 클래스. 
* heapq — 힙 큐 알고리즘:: 
* bisect — 배열 이진 분할 알고리즘:: 
* array — 효율적인 숫자 배열:: 
* weakref — Weak references:: 
* types — 동적 형 생성과 내장형 이름:: 
* copy — 얕은 복사와 깊은 복사 연산:: 
* pprint — 예쁜 데이터 인쇄기:: 
* reprlib — 대안 repr() 구현: reprlib — 대안 repr 구현. 
* enum — 열거형 지원:: 
* graphlib — 그래프와 유사한 구조에 작동하는 기능:: 

datetime — Basic date and time types

* Aware and naive objects:: 
* 상수:: 
* 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 시간대 지원

* ZoneInfo 사용하기:: 
* 데이터 소스:: 
* ZoneInfo 클래스:: 
* 함수: 함수<2>. 
* 전역:: 
* 예외와 경고:: 

데이터 소스

* 데이터 소스 구성:: 

데이터 소스 구성

* 컴파일 시간 구성:: 
* 환경 구성:: 
* 실행 시간 구성:: 

ZoneInfo 클래스

* 문자열 표현:: 
* 피클 직렬화:: 

calendar — 일반 달력 관련 함수

* Command-line usage:: 

collections — 컨테이너 데이터형

* ChainMap 객체:: 
* Counter 객체:: 
* deque 객체:: 
* defaultdict 객체:: 
* 이름있는 필드를 가진 튜플을 위한 namedtuple() 팩토리 함수: 이름있는 필드를 가진 튜플을 위한 namedtuple 팩토리 함수. 
* OrderedDict 객체:: 
* UserDict 객체:: 
* UserList 객체:: 
* UserString 객체:: 

ChainMap 객체

* ChainMap 예제와 조리법:: 

deque 객체

* deque 조리법:: 

defaultdict 객체

* defaultdict 예:: 

OrderedDict 객체

* OrderedDict 예제와 조리법:: 

collections.abc — 컨테이너의 추상 베이스 클래스

* Collections 추상 베이스 클래스:: 
* Collections 추상 베이스 클래스 – 상세한 설명:: 
* 예제와 조리법:: 

heapq — 힙 큐 알고리즘

* 기본 예:: 
* Other Applications:: 
* 우선순위 큐 구현 참고 사항:: 
* 이론:: 

bisect — 배열 이진 분할 알고리즘

* Performance Notes:: 
* 정렬된 리스트 검색하기:: 
* 예제: 예제<2>. 

weakref — Weak references

* 약한 참조 객체:: 
* 예: 예<2>. 
* 파이널라이저 객체:: 
* 파이널라이저와 __del__() 메서드의 비교: 파이널라이저와 __del__ 메서드의 비교. 

types — 동적 형 생성과 내장형 이름

* 동적 형 생성:: 
* 표준 인터프리터 형:: 
* 추가 유틸리티 클래스와 함수:: 
* 코루틴 유틸리티 함수:: 

pprint — 예쁜 데이터 인쇄기

* 함수: 함수<3>. 
* PrettyPrinter 객체:: 
* 예제: 예제<3>. 

reprlib — 대안 repr() 구현

* Repr 객체:: 
* Repr 객체 서브 클래싱:: 

enum — 열거형 지원

* Module contents:: 
* Data types:: 
* Utilities and decorators:: 
* 참고 사항:: 

Data types

* 지원되는 __dunder__ 이름:: 
* 지원되는 _sunder_ 이름:: 

graphlib — 그래프와 유사한 구조에 작동하는 기능

* 예외: 예외<3>. 

숫자와 수학 모듈

* numbers — 숫자 추상 베이스 클래스:: 
* math — 수학 함수:: 
* cmath — 복소수를 위한 수학 함수:: 
* decimal — Decimal fixed-point and floating-point arithmetic:: 
* fractions — 유리수:: 
* random — 의사 난수 생성:: 
* statistics — 수학 통계 함수:: 

numbers — 숫자 추상 베이스 클래스

* 숫자 계층:: 
* 형 구현자를 위한 주의 사항:: 

형 구현자를 위한 주의 사항

* 더 많은 숫자 추상 베이스 클래스(ABC) 추가: 더 많은 숫자 추상 베이스 클래스 ABC 추가. 
* 산술 연산 구현:: 

math — 수학 함수

* 수론적 함수:: 
* 부동 소수점 산술:: 
* 부동 소수점 조작 함수:: 
* 거듭제곱@comma{} 지수 및 로그 함수: 거듭제곱 지수 및 로그 함수. 
* 합과 곱 함수:: 
* 각도 변환:: 
* 삼각 함수:: 
* 쌍곡선 함수:: 
* 특수 함수:: 
* 상수: 상수<2>. 

cmath — 복소수를 위한 수학 함수

* 극좌표 변환:: 
* 거듭제곱과 로그 함수:: 
* 삼각 함수: 삼각 함수<2>. 
* 쌍곡선(hyperbolic) 함수: 쌍곡선 hyperbolic 함수. 
* 분류 함수:: 
* 상수: 상수<3>. 

decimal — Decimal fixed-point and floating-point arithmetic

* Quick-start tutorial:: 
* Decimal 객체:: 
* Context 객체:: 
* 상수: 상수<4>. 
* 자리 올림 모드:: 
* 신호:: 
* Floating-point notes:: 
* 스레드로 작업하기:: 
* 조리법:: 
* Decimal FAQ:: 

Decimal 객체

* 논리적 피연산자:: 

Floating-point notes

* 증가시킨 정밀도로 자리 올림 오차 줄이기:: 
* 특수 값:: 

random — 의사 난수 생성

* 관리 함수:: 
* 바이트열 함수:: 
* 정수 함수:: 
* 시퀀스 함수:: 
* 이산 분포:: 
* 실수 분포:: 
* 대체 생성기:: 
* 재현성에 대한 참고 사항:: 
* 예제: 예제<4>. 
* 조리법: 조리법<2>. 
* Command-line usage: Command-line usage<2>. 
* Command-line example:: 

statistics — 수학 통계 함수

* 평균과 중심 위치의 측정:: 
* 분산 측정:: 
* Statistics for relations between two inputs:: 
* 함수 세부 사항:: 
* 예외: 예외<4>. 
* NormalDist 객체:: 
* 예제와 조리법: 예제와 조리법<2>. 

예제와 조리법

* 고전적인 확률 문제:: 
* Monte Carlo inputs for simulations:: 
* Approximating binomial distributions:: 
* Naive bayesian classifier:: 

함수형 프로그래밍 모듈

* itertools — Functions creating iterators for efficient looping:: 
* functools — 고차 함수와 콜러블 객체에 대한 연산:: 
* operator — 함수로서의 표준 연산자:: 

itertools — Functions creating iterators for efficient looping

* Itertool Functions:: 
* Itertools 조리법:: 

functools — 고차 함수와 콜러블 객체에 대한 연산

* partial 객체:: 

operator — 함수로서의 표준 연산자

* 연산자를 함수에 매핑하기:: 
* 제자리 연산자:: 

파일과 디렉터리 액세스

* pathlib — Object-oriented filesystem paths:: 
* os.path — 일반적인 경로명 조작: os path — 일반적인 경로명 조작. 
* stat — stat() 결과 해석하기: stat — stat 결과 해석하기. 
* filecmp — 파일과 디렉터리 비교:: 
* tempfile — 임시 파일과 디렉터리 생성:: 
* glob — 유닉스 스타일 경로명 패턴 확장:: 
* fnmatch — 유닉스 파일명 패턴 일치:: 
* linecache — 텍스트 줄에 대한 무작위 액세스:: 
* shutil — 고수준 파일 연산:: 

pathlib — Object-oriented filesystem paths

* 기본 사용:: 
* Exceptions: Exceptions<2>. 
* 순수한 경로:: 
* 구상 경로:: 
* Pattern language:: 
* Comparison to the glob module:: 
* Comparison to the os and os.path modules: Comparison to the os and os path modules. 
* Protocols:: 

순수한 경로

* 일반 속성:: 
* 연산자:: 
* 개별 부분에 액세스하기:: 
* 메서드와 프로퍼티:: 

구상 경로

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

Comparison to the os and os.path modules

* Corresponding tools:: 

filecmp — 파일과 디렉터리 비교

* dircmp 클래스:: 

tempfile — 임시 파일과 디렉터리 생성

* 예: 예<3>. 
* 폐지된 함수와 변수:: 

glob — 유닉스 스타일 경로명 패턴 확장

* 예제: 예제<5>. 

shutil — 고수준 파일 연산

* 디렉터리와 파일 연산:: 
* 아카이브 연산:: 
* 출력 터미널의 크기 조회하기:: 

디렉터리와 파일 연산

* 플랫폼 의존적 효율적인 복사 연산:: 
* copytree 예:: 
* rmtree 예:: 

아카이브 연산

* 아카이브 예:: 
* base_dir을 사용한 아카이브 예:: 

데이터 지속성

* pickle — 파이썬 객체 직렬화:: 
* copyreg — pickle 지원 함수 등록:: 
* shelve — 파이썬 객체 지속성:: 
* marshal — 내부 파이썬 객체 직렬화:: 
* dbm — 유닉스 “데이터베이스” 인터페이스:: 
* sqlite3 — DB-API 2.0 interface for SQLite databases: sqlite3 — DB-API 2 0 interface for SQLite databases. 

pickle — 파이썬 객체 직렬화

* 다른 파이썬 모듈과의 관계:: 
* 데이터 스트림 형식:: 
* 모듈 인터페이스:: 
* 어떤 것이 피클 되고 역 피클 될 수 있을까요?:: 
* 클래스 인스턴스 피클링:: 
* 형@comma{} 함수 및 기타 객체에 대한 사용자 정의 환원: 형 함수 및 기타 객체에 대한 사용자 정의 환원. 
* 아웃 오브 밴드 버퍼:: 
* 전역 제한하기:: 
* 성능:: 
* 예제: 예제<7>. 
* Command-line interface:: 

다른 파이썬 모듈과의 관계

* marshal 과의 비교:: 
* json 과의 비교:: 

클래스 인스턴스 피클링

* 외부 객체의 지속성:: 
* 디스패치 테이블:: 
* 상태 저장 객체 처리:: 

아웃 오브 밴드 버퍼

* 제공자 API:: 
* 소비자 API:: 
* 예제: 예제<6>. 

copyreg — pickle 지원 함수 등록

* 예제: 예제<8>. 

shelve — 파이썬 객체 지속성

* 제약 사항:: 
* 예제: 예제<9>. 

dbm — 유닉스 “데이터베이스” 인터페이스

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

sqlite3 — DB-API 2.0 interface for SQLite databases

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

Reference

* Module functions:: 
* Module constants:: 
* Connection objects:: 
* Cursor objects:: 
* Row objects:: 
* Blob objects:: 
* PrepareProtocol objects:: 
* 예외: 예외<5>. 
* SQLite 와 파이썬 형:: 
* Default adapters and converters (deprecated): Default adapters and converters deprecated. 
* Command-line interface: Command-line interface<2>. 

How-to guides

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

How to adapt custom Python types to SQLite values

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

Explanation

* Transaction control:: 

Transaction control

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

데이터 압축 및 보관

* The compression package:: 
* compression.zstd — Compression compatible with the Zstandard format: compression zstd — Compression compatible with the Zstandard format. 
* zlib — gzip 과 호환되는 압축:: 
* gzip — gzip 파일 지원:: 
* bz2 — bzip2 압축 지원:: 
* lzma — LZMA 알고리즘을 사용한 압축:: 
* zipfile — ZIP 아카이브 작업:: 
* tarfile — tar 아카이브 파일 읽기와 쓰기:: 

compression.zstd — Compression compatible with the Zstandard format

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

gzip — gzip 파일 지원

* 사용 예: 사용 예<2>. 
* Command-line interface: Command-line interface<3>. 

Command-line interface

* Command-line options:: 

bz2 — bzip2 압축 지원

* 파일 압축(해제): 파일 압축 해제. 
* 증분 압축(해제): 증분 압축 해제. 
* 일괄 압축(해제): 일괄 압축 해제. 
* 사용 예: 사용 예<3>. 

lzma — LZMA 알고리즘을 사용한 압축

* 압축 파일 읽기와 쓰기:: 
* 메모리에서의 데이터 압축과 압축 해제:: 
* 기타:: 
* 사용자 정의 필터 체인 지정:: 
* 예: 예<4>. 

zipfile — ZIP 아카이브 작업

* ZipFile objects:: 
* Path objects:: 
* PyZipFile objects:: 
* ZipInfo objects:: 
* Command-line interface: Command-line interface<4>. 
* 압축 해제 함정:: 

Command-line interface

* 명령 줄 옵션:: 

압축 해제 함정

* 파일 자체에서:: 
* File system limitations:: 
* 자원 제한:: 
* 중단:: 
* 추출의 기본 동작:: 

tarfile — tar 아카이브 파일 읽기와 쓰기

* TarFile 객체:: 
* TarInfo 객체:: 
* Extraction filters:: 
* 명령 줄 인터페이스:: 
* 예: 예<5>. 
* 지원되는 tar 형식:: 
* 유니코드 문제:: 

Extraction filters

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

명령 줄 인터페이스

* 명령 줄 옵션: 명령 줄 옵션<2>. 

예

* Reading examples:: 
* Writing examples:: 

파일 형식

* csv — CSV 파일 읽기와 쓰기:: 
* configparser — 구성 파일 구문 분석기:: 
* tomllib — Parse TOML files:: 
* netrc — netrc 파일 처리:: 
* plistlib — 애플 .plist 파일 생성과 구문 분석: plistlib — 애플 plist 파일 생성과 구문 분석. 

csv — CSV 파일 읽기와 쓰기

* 모듈 내용: 모듈 내용<2>. 
* 방언과 포매팅 파라미터:: 
* 판독기 객체:: 
* 기록기 객체:: 
* 예제: 예제<10>. 

configparser — 구성 파일 구문 분석기

* 빠른 시작:: 
* 지원되는 데이터형:: 
* 대체 값:: 
* 지원되는 INI 파일 구조:: 
* Unnamed Sections:: 
* 값의 보간:: 
* 매핑 프로토콜 액세스:: 
* 구문 분석기 동작 사용자 정의:: 
* 레거시 API 예제:: 
* ConfigParser 객체:: 
* RawConfigParser 객체:: 
* 예외: 예외<6>. 

tomllib — Parse TOML files

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

netrc — netrc 파일 처리

* netrc 객체:: 

plistlib — 애플 .plist 파일 생성과 구문 분석

* 예제: 예제<11>. 

암호화 서비스

* hashlib — 보안 해시와 메시지 요약:: 
* hmac — 메시지 인증을 위한 키 해싱:: 
* secrets — 비밀 관리를 위한 안전한 난수 생성:: 

hashlib — 보안 해시와 메시지 요약

* 해시 알고리즘:: 
* 사용법:: 
* 생성자:: 
* 어트리뷰트:: 
* 해시 객체:: 
* SHAKE 가변 길이 요약:: 
* 파일 해싱:: 
* 키 파생:: 
* BLAKE2:: 

BLAKE2

* 해시 객체 만들기:: 
* 상수: 상수<5>. 
* 예: 예<6>. 
* 크레딧:: 

예

* 간단한 해싱:: 
* 다른 요약 크기 사용하기:: 
* 키 해싱:: 
* 무작위 해싱:: 
* 개인화:: 
* 트리 모드:: 

secrets — 비밀 관리를 위한 안전한 난수 생성

* 난수:: 
* 토큰 생성:: 
* 기타 함수:: 
* 조리법과 모범 사례:: 

토큰 생성

* 토큰은 몇 바이트를 사용해야 합니까?:: 

일반 운영 체제 서비스

* os — Miscellaneous operating system interfaces:: 
* io — 스트림 작업을 위한 핵심 도구:: 
* time — 시간 액세스와 변환:: 
* logging — 파이썬 로깅 시설:: 
* logging.config — 로깅 구성: logging config — 로깅 구성. 
* logging.handlers — 로깅 처리기: logging handlers — 로깅 처리기. 
* platform — 하부 플랫폼의 식별 데이터에 대한 액세스:: 
* errno — 표준 errno 시스템 기호:: 
* ctypes — A foreign function library for Python:: 

os — Miscellaneous operating system interfaces

* 파일명@comma{} 명령 줄 인자 및 환경 변수: 파일명 명령 줄 인자 및 환경 변수. 
* Python UTF-8 Mode:: 
* 프로세스 매개 변수:: 
* 파일 객체 생성:: 
* 파일 기술자 연산:: 
* 파일과 디렉터리:: 
* 프로세스 관리:: 
* 스케줄러에 대한 인터페이스:: 
* 기타 시스템 정보:: 
* 난수: 난수<2>. 

파일 기술자 연산

* 터미널의 크기 조회하기:: 
* 파일 기술자의 상속:: 

파일과 디렉터리

* Timer File Descriptors:: 
* 리눅스 확장 어트리뷰트:: 

io — 스트림 작업을 위한 핵심 도구

* 개요: 개요<2>. 
* 텍스트 인코딩: 텍스트 인코딩<2>. 
* 고수준 모듈 인터페이스:: 
* 클래스 위계:: 
* Static Typing:: 
* 성능: 성능<2>. 

개요

* 텍스트 I/O:: 
* 바이너리 I/O:: 
* 원시 I/O:: 

텍스트 인코딩

* Opt-in EncodingWarning:: 

클래스 위계

* I/O 베이스 클래스:: 
* 원시 파일 I/O:: 
* 버퍼링 된 스트림:: 
* 텍스트 I/O: 텍스트 I/O<2>. 

성능

* 바이너리 I/O: 바이너리 I/O<2>. 
* 텍스트 I/O: 텍스트 I/O<3>. 
* 다중 스레드:: 
* 재진입:: 

time — 시간 액세스와 변환

* 함수: 함수<4>. 
* 시계 ID 상수:: 
* 시간대 상수:: 

logging — 파이썬 로깅 시설

* Logger 객체:: 
* 로깅 수준:: 
* Handler 객체:: 
* Formatter 객체:: 
* Filter 객체:: 
* LogRecord 객체:: 
* LogRecord 어트리뷰트:: 
* LoggerAdapter 객체:: 
* 스레드 안전성:: 
* 모듈 수준 함수:: 
* 모듈 수준 어트리뷰트:: 
* warnings 모듈과의 통합:: 

logging.config — 로깅 구성

* 구성 함수:: 
* 보안 고려 사항:: 
* 구성 딕셔너리 스키마:: 
* 구성 파일 형식:: 

구성 딕셔너리 스키마

* 딕셔너리 스키마 세부사항:: 
* 증분 구성:: 
* 객체 연결:: 
* 사용자 정의 객체:: 
* 처리기 구성 순서:: 
* 외부 객체에 대한 액세스:: 
* 내부 객체에 대한 액세스:: 
* 임포트 결정과 사용자 정의 임포터:: 
* Configuring QueueHandler and QueueListener:: 

logging.handlers — 로깅 처리기

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

platform — 하부 플랫폼의 식별 데이터에 대한 액세스

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

ctypes — A foreign function library for Python

* ctypes 자습서:: 
* ctypes 레퍼런스:: 

ctypes 자습서

* 동적 링크 라이브러리 로드하기:: 
* 로드된 dll에서 함수에 액세스하기:: 
* 함수 호출하기:: 
* 기본 데이터형:: 
* 함수 호출하기@comma{} 계속: 함수 호출하기 계속. 
* Calling variadic functions:: 
* 사용자 정의 데이터형을 사용하여 함수 호출하기:: 
* 필수 인자 형 (함수 프로토타입) 지정하기: 필수 인자 형 함수 프로토타입 지정하기. 
* 반환형:: 
* 포인터 전달하기 (또는; 참조로 매개 변수 전달하기): 포인터 전달하기 또는 참조로 매개 변수 전달하기. 
* 구조체와 공용체:: 
* Structure/union layout@comma{} alignment and byte order: Structure/union layout alignment and byte order. 
* 구조체와 공용체의 비트 필드:: 
* 배열:: 
* 포인터:: 
* Thread safety without the GIL:: 
* 형 변환:: 
* 불완전한 형:: 
* 콜백 함수:: 
* dll에서 내 보낸 값을 액세스하기:: 
* 의외의 것들:: 
* 가변 크기 데이터형:: 

ctypes 레퍼런스

* 공유 라이브러리 찾기:: 
* Listing loaded shared libraries:: 
* 공유 라이브러리 로드하기:: 
* 외부 함수:: 
* 함수 프로토타입:: 
* 유틸리티 함수:: 
* 데이터형: 데이터형<2>. 
* 기본 데이터형: 기본 데이터형<2>. 
* 구조화된 데이터형:: 
* 배열과 포인터:: 
* Exceptions: Exceptions<4>. 

Command-line interface libraries

* argparse — Parser for command-line options@comma{} arguments and subcommands: argparse — Parser for command-line options arguments and subcommands. 
* optparse — 명령 줄 옵션용 구문 분석기:: 
* getpass — 이식성 있는 암호 입력:: 
* fileinput — 여러 입력 스트림에서 줄을 이터레이트 하기:: 
* curses — 문자 셀 디스플레이를 위한 터미널 처리:: 
* curses.textpad — Text input widget for curses programs: curses textpad — Text input widget for curses programs. 
* curses.ascii — ASCII 문자용 유틸리티: curses ascii — ASCII 문자용 유틸리티. 
* curses.panel — curses 용 패널 스택 확장: curses panel — curses 용 패널 스택 확장. 
* cmd — 줄 지향 명령 인터프리터 지원:: 

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

* ArgumentParser 객체:: 
* add_argument() 메서드: add_argument 메서드. 
* parse_args() 메서드: parse_args 메서드. 
* 기타 유틸리티:: 
* Exceptions: Exceptions<5>. 

ArgumentParser 객체

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

add_argument() 메서드

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

parse_args() 메서드

* 옵션값 문법:: 
* 잘못된 인자:: 
* - 를 포함하는 인자들:: 
* 인자 약어 (접두사 일치): 인자 약어 접두사 일치. 
* sys.argv 너머: sys argv 너머. 
* Namespace 객체:: 

기타 유틸리티

* Subcommands:: 
* FileType 객체:: 
* 인자 그룹:: 
* 상호 배제:: 
* 파서 기본값:: 
* 도움말 인쇄:: 
* 부분 파싱:: 
* 파일 파싱 사용자 정의:: 
* 종료 메서드:: 
* 혼합 파싱:: 
* Registering custom types or actions:: 

Exceptions

* Argparse 자습서:: 
* Migrating optparse code to argparse:: 

Argparse 자습서

* 개념:: 
* 기본:: 
* 위치 인자 소개:: 
* 옵션 인자 소개:: 
* 위치 및 옵션 인자 결합하기:: 
* 조금 더 발전시키기:: 
* How to translate the argparse output:: 
* Custom type converters:: 
* 맺음말:: 

옵션 인자 소개

* 짧은 옵션:: 

조금 더 발전시키기

* Specifying ambiguous arguments:: 
* 충돌하는 옵션들:: 

optparse — 명령 줄 옵션용 구문 분석기

* Choosing an argument parsing library:: 
* Introduction: Introduction<4>. 
* 배경:: 
* 자습서:: 
* 레퍼런스 지침서:: 
* 옵션 콜백:: 
* Extending optparse:: 
* 예외: 예외<7>. 

배경

* 용어:: 
* 옵션은 무엇을 위한 것입니까?:: 
* 위치 인자는 무엇을 위한 것입니까?:: 

자습서

* 옵션 액션의 이해:: 
* store 액션:: 
* 불리언 (플래그) 옵션 처리하기: 불리언 플래그 옵션 처리하기. 
* 다른 액션들:: 
* 기본값:: 
* 도움말 생성하기:: 
* 버전 문자열 인쇄하기:: 
* How optparse handles errors:: 
* 모두 합치기:: 

도움말 생성하기

* 옵션 그룹화하기:: 

레퍼런스 지침서

* 구문 분석기 만들기:: 
* 구문 분석기 채우기:: 
* 옵션 정의하기:: 
* 옵션 어트리뷰트:: 
* 표준 옵션 액션:: 
* 표준 옵션 형:: 
* 인자 구문 분석하기:: 
* 옵션 구문 분석기를 조회하고 조작하기:: 
* 옵션 간의 충돌:: 
* 정리:: 
* 기타 메서드:: 

옵션 콜백

* 콜백 옵션 정의하기:: 
* 콜백이 호출되는 방법:: 
* 콜백에서 에러 발생시키기:: 
* 콜백 예제 1; 간단한 콜백: 콜백 예제 1 간단한 콜백. 
* 콜백 예제 2; 옵션 순서 확인: 콜백 예제 2 옵션 순서 확인. 
* 콜백 예제 3; 옵션 순서 확인 (일반화): 콜백 예제 3 옵션 순서 확인 일반화. 
* 콜백 예제 4; 임의 조건 확인: 콜백 예제 4 임의 조건 확인. 
* 콜백 예제 5; 고정 인자: 콜백 예제 5 고정 인자. 
* 콜백 예제 6; 가변 인자: 콜백 예제 6 가변 인자. 

Extending optparse

* 새로운 형 추가하기:: 
* 새로운 액션 추가하기:: 

curses — 문자 셀 디스플레이를 위한 터미널 처리

* 함수: 함수<5>. 
* 창 객체:: 
* 상수: 상수<6>. 

curses.textpad — Text input widget for curses programs

* Textbox 객체:: 

curses.panel — curses 용 패널 스택 확장

* 함수: 함수<6>. 
* Panel 객체:: 

cmd — 줄 지향 명령 인터프리터 지원

* Cmd 객체:: 
* Cmd 예:: 

동시 실행

* threading — 스레드 기반 병렬 처리:: 
* multiprocessing — Process-based parallelism:: 
* multiprocessing.shared_memory — 프로세스 간 직접 액세스를 위한 공유 메모리: multiprocessing shared_memory — 프로세스 간 직접 액세스를 위한 공유 메모리. 
* concurrent 패키지:: 
* concurrent.futures — 병렬 작업 실행하기: concurrent futures — 병렬 작업 실행하기. 
* concurrent.interpreters — Multiple interpreters in the same process: concurrent interpreters — Multiple interpreters in the same process. 
* subprocess — 서브 프로세스 관리:: 
* sched — 이벤트 스케줄러:: 
* queue — 동기화된 큐 클래스:: 
* contextvars — 컨텍스트 변수:: 
* _thread — 저수준 스레드 API:: 

threading — 스레드 기반 병렬 처리

* Introduction: Introduction<5>. 
* GIL and performance considerations:: 
* Reference: Reference<2>. 
* with 문으로 록@comma{} 조건 및 세마포어 사용하기: with 문으로 록 조건 및 세마포어 사용하기. 

Reference

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

multiprocessing — Process-based parallelism

* 소개: 소개<3>. 
* 레퍼런스:: 
* 프로그래밍 지침:: 
* 예제: 예제<12>. 

소개

* Process 클래스:: 
* 컨텍스트 및 시작 방법:: 
* 프로세스 간 객체 교환:: 
* 프로세스 간 동기화:: 
* 프로세스 간 상태 공유:: 
* 작업자 풀 사용:: 

레퍼런스

* Global start method:: 
* Process와 예외:: 
* 파이프와 큐:: 
* 잡동사니: 잡동사니<3>. 
* Connection 객체:: 
* 동기화 프리미티브:: 
* 공유 ctypes 객체:: 
* 관리자:: 
* 프락시 객체:: 
* 프로세스 풀:: 
* 리스너와 클라이언트:: 
* 인증 키:: 
* 로깅: 로깅<2>. 
* The multiprocessing.dummy module: The multiprocessing dummy module. 

공유 ctypes 객체

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

관리자

* 사용자 정의 관리자:: 
* 원격 관리자 사용하기:: 

프락시 객체

* 정리: 정리<2>. 

리스너와 클라이언트

* 주소 형식:: 

프로그래밍 지침

* 모든 시작 방법:: 
* spawn 과 forkserver 시작 방법:: 

concurrent.futures — 병렬 작업 실행하기

* Executor 객체:: 
* ThreadPoolExecutor:: 
* InterpreterPoolExecutor:: 
* ProcessPoolExecutor:: 
* Future 객체:: 
* 모듈 함수:: 
* 예외 클래스:: 

ThreadPoolExecutor

* ThreadPoolExecutor 예제:: 

ProcessPoolExecutor

* ProcessPoolExecutor 예제:: 

concurrent.interpreters — Multiple interpreters in the same process

* Key details:: 
* Introduction: Introduction<6>. 
* Reference: Reference<3>. 
* Basic usage:: 

Introduction

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

Reference

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

subprocess — 서브 프로세스 관리

* Using the subprocess Module:: 
* 보안 고려 사항: 보안 고려 사항<2>. 
* Popen 객체:: 
* 윈도우 Popen 도우미:: 
* 오래된 고수준 API:: 
* Replacing Older Functions with the subprocess Module:: 
* 레거시 셸 호출 함수:: 
* 노트:: 

Using the subprocess Module

* 자주 사용되는 인자:: 
* Popen 생성자:: 
* 예외: 예외<8>. 

윈도우 Popen 도우미

* 윈도우 상수:: 

Replacing Older Functions with the subprocess Module

* /bin/sh 셸 명령 치환 교체하기:: 
* 셸 파이프라인 교체하기:: 
* os.system() 교체하기: os system 교체하기. 
* os.spawn 패밀리 교체하기: os spawn 패밀리 교체하기. 
* Replacing os.popen(): Replacing os popen. 

노트

* Timeout Behavior:: 
* 윈도우에서 인자 시퀀스를 문자열로 변환하기:: 
* Disable use of posix_spawn(): Disable use of posix_spawn. 

sched — 이벤트 스케줄러

* 스케줄러 객체:: 

queue — 동기화된 큐 클래스

* 큐 객체:: 
* SimpleQueue 객체:: 

큐 객체

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

contextvars — 컨텍스트 변수

* 컨텍스트 변수:: 
* 수동 컨텍스트 관리:: 
* asyncio 지원:: 

네트워킹과 프로세스 간 통신

* asyncio — 비동기 I/O:: 
* socket — Low-level networking interface:: 
* ssl — TLS/SSL wrapper for socket objects:: 
* select — I/O 완료 대기:: 
* selectors — 고수준 I/O 다중화:: 
* signal — 비동기 이벤트에 대한 처리기 설정:: 
* mmap — 메모리 맵 파일 지원:: 

asyncio — 비동기 I/O

* Runners:: 
* Coroutines and tasks:: 
* 스트림:: 
* 동기화 프리미티브: 동기화 프리미티브<2>. 
* 서브 프로세스:: 
* 큐:: 
* 예외: 예외<10>. 
* Call Graph Introspection:: 
* Event loop:: 
* 퓨처:: 
* 트랜스포트와 프로토콜:: 
* 정책:: 
* 플랫폼 지원:: 
* Extending:: 
* 고수준 API 색인:: 
* 저수준 API 색인:: 
* asyncio로 개발하기:: 

Runners

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

Coroutines and tasks

* 코루틴: 코루틴<2>. 
* 어웨이터블:: 
* Creating tasks:: 
* Task cancellation:: 
* Task groups:: 
* 잠자기:: 
* Running tasks concurrently:: 
* Eager task factory:: 
* Shielding from cancellation:: 
* 시간제한:: 
* Waiting primitives:: 
* Running in threads:: 
* Scheduling from other threads:: 
* 인트로스펙션:: 
* Task object:: 

Task groups

* Terminating a task group:: 

스트림

* StreamReader:: 
* StreamWriter:: 
* 예제: 예제<13>. 

예제

* 스트림을 사용하는 TCP 메아리 클라이언트:: 
* 스트림을 사용하는 TCP 메아리 서버:: 
* HTTP 헤더 가져오기:: 
* 스트림을 사용하여 데이터를 기다리는 열린 소켓 등록:: 

동기화 프리미티브

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

서브 프로세스

* 서브 프로세스 만들기:: 
* 상수: 상수<7>. 
* 서브 프로세스와 상호 작용하기:: 

서브 프로세스와 상호 작용하기

* 서브 프로세스와 스레드:: 
* 예제: 예제<14>. 

큐

* Queue:: 
* 우선순위 큐:: 
* LIFO 큐:: 
* 예외: 예외<9>. 
* 예제: 예제<15>. 

Call Graph Introspection

* Low level utility functions:: 

Event loop

* Event loop methods:: 
* Callback handles:: 
* Server objects:: 
* Event loop implementations:: 
* 예제: 예제<16>. 

Event loop methods

* 루프 실행 및 중지:: 
* 콜백 예약하기:: 
* 지연된 콜백 예약:: 
* Creating futures and tasks:: 
* 네트워크 연결 열기:: 
* 네트워크 서버 만들기:: 
* 파일 전송:: 
* TLS upgrade:: 
* 파일 기술자 관찰하기:: 
* 소켓 객체로 직접 작업하기:: 
* DNS:: 
* 파이프로 작업하기:: 
* 유닉스 시그널:: 
* 스레드 또는 프로세스 풀에서 코드를 실행하기:: 
* Error handling API:: 
* 디버그 모드 활성화:: 
* Running subprocesses:: 

예제

* call_soon()을 사용하는 Hello World: call_soon 을 사용하는 Hello World. 
* call_later()로 현재 날짜를 표시합니다.: call_later 로 현재 날짜를 표시합니다. 
* 파일 기술자에서 읽기 이벤트를 관찰하기:: 
* SIGINT 및 SIGTERM에 대한 시그널 처리기 설정:: 

퓨처

* 퓨처 함수:: 
* Future 객체: Future 객체<2>. 

트랜스포트와 프로토콜

* 트랜스포트:: 
* 프로토콜:: 
* 예제: 예제<17>. 

트랜스포트

* 트랜스포트 계층 구조:: 
* 베이스 트랜스포트:: 
* 읽기 전용 트랜스포트:: 
* 쓰기 전용 트랜스포트:: 
* 데이터 그램 트랜스포트:: 
* 서브 프로세스 트랜스포트:: 

프로토콜

* 베이스 프로토콜:: 
* 베이스 프로토콜: 베이스 프로토콜<2>. 
* 스트리밍 프로토콜:: 
* 버퍼 된 스트리밍 프로토콜:: 
* 데이터 그램 프로토콜:: 
* 서브 프로세스 프로토콜:: 

예제

* TCP 메아리 서버:: 
* TCP 메아리 클라이언트:: 
* UDP 메아리 서버:: 
* UDP 메아리 클라이언트:: 
* 기존 소켓 연결하기:: 
* loop.subprocess_exec() 와 SubprocessProtocol: loop subprocess_exec 와 SubprocessProtocol. 

정책

* 정책을 얻고 설정하기:: 
* 정책 객체:: 
* 사용자 정의 정책:: 

플랫폼 지원

* 모든 플랫폼:: 
* 윈도우:: 
* macOS: macOS<52>. 

윈도우

* 윈도우에서의 서브 프로세스 지원:: 

Extending

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

고수준 API 색인

* 태스크:: 
* 큐: 큐<2>. 
* 서브 프로세스: 서브 프로세스<2>. 
* 스트림: 스트림<2>. 
* 동기화:: 
* 예외: 예외<11>. 

저수준 API 색인

* 이벤트 루프 얻기:: 
* 이벤트 루프 메서드:: 
* 트랜스포트: 트랜스포트<2>. 
* 프로토콜: 프로토콜<2>. 
* 이벤트 루프 정책:: 

asyncio로 개발하기

* 디버그 모드:: 
* 동시성과 다중 스레드:: 
* 블로킹 코드 실행하기:: 
* 로깅: 로깅<3>. 
* await 하지 않은 코루틴 감지:: 
* 전달되지 않은 예외 감지:: 
* Asynchronous generators best practices:: 

Asynchronous generators best practices

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

socket — Low-level networking interface

* 소켓 패밀리:: 
* 모듈 내용: 모듈 내용<3>. 
* 소켓 객체:: 
* 소켓 시간제한에 대한 참고 사항:: 
* 예제: 예제<18>. 

모듈 내용

* 예외: 예외<12>. 
* 상수: 상수<8>. 
* 함수: 함수<7>. 

함수

* 소켓 만들기:: 
* 기타 함수: 기타 함수<2>. 

소켓 시간제한에 대한 참고 사항

* 시간제한과 connect 메서드:: 
* 시간제한과 accept 메서드:: 

ssl — TLS/SSL wrapper for socket objects

* Functions@comma{} constants@comma{} and exceptions: Functions constants and exceptions. 
* SSL sockets:: 
* SSL contexts:: 
* 인증서:: 
* 예제: 예제<19>. 
* 비 블로킹 소켓에 대한 참고 사항:: 
* Memory BIO support:: 
* SSL 세션:: 
* 보안 고려 사항: 보안 고려 사항<3>. 
* TLS 1.3: TLS 1 3. 

Functions, constants, and exceptions

* 소켓 생성:: 
* 컨텍스트 생성:: 
* 예외: 예외<13>. 
* 난수 생성:: 
* 인증서 처리:: 
* 상수: 상수<9>. 

인증서

* 인증서 체인:: 
* CA 인증서:: 
* 결합한 키와 인증서:: 
* 자체 서명 인증서:: 

예제

* SSL 지원 검사하기:: 
* 클라이언트 측 연산:: 
* 서버 측 연산:: 

보안 고려 사항

* 가장 좋은 기본값:: 
* 수동 설정:: 
* 다중 프로세싱:: 

수동 설정

* 인증서 확인:: 
* 프로토콜 버전:: 
* 사이퍼 선택:: 

select — I/O 완료 대기

* /dev/poll 폴링 객체:: 
* 에지와 레벨 트리거 폴링 (epoll) 객체: 에지와 레벨 트리거 폴링 epoll 객체. 
* 폴링 객체:: 
* Kqueue 객체:: 
* Kevent 객체:: 

selectors — 고수준 I/O 다중화

* 소개: 소개<4>. 
* 클래스: 클래스<3>. 
* 예제: 예제<20>. 

signal — 비동기 이벤트에 대한 처리기 설정

* 일반 규칙:: 
* 모듈 내용: 모듈 내용<4>. 
* 예제: 예제<21>. 
* SIGPIPE에 대한 참고 사항:: 
* 신호 처리기와 예외에 대한 참고 사항:: 

일반 규칙

* 파이썬 시그널 처리기의 실행:: 
* 시그널과 스레드:: 

mmap — 메모리 맵 파일 지원

* MADV_* 상수:: 
* MAP_* 상수:: 

인터넷 데이터 처리

* email — 전자 메일과 MIME 처리 패키지:: 
* json — JSON 인코더와 디코더:: 
* mailbox — 다양한 형식의 사서함 조작하기:: 
* mimetypes — 파일명을 MIME 유형에 매핑:: 
* base64 — Base16@comma{} Base32@comma{} Base64@comma{} Base85 데이터 인코딩: base64 — Base16 Base32 Base64 Base85 데이터 인코딩. 
* binascii — 바이너리와 ASCII 간의 변환:: 
* quopri — MIME quoted-printable 데이터 인코딩과 디코딩:: 

email — 전자 메일과 MIME 처리 패키지

* email.message; 전자 메일 메시지 표현: email message 전자 메일 메시지 표현. 
* email.parser; 전자 메일 메시지 구문 분석: email parser 전자 메일 메시지 구문 분석. 
* email.generator; MIME 문서 생성: email generator MIME 문서 생성. 
* email.policy; 정책 객체: email policy 정책 객체. 
* email.errors; 예외와 결함 클래스: email errors 예외와 결함 클래스. 
* email.headerregistry; 사용자 정의 헤더 객체: email headerregistry 사용자 정의 헤더 객체. 
* email.contentmanager; MIME 콘텐츠 관리: email contentmanager MIME 콘텐츠 관리. 
* email; 예제: email 예제. 
* email.message.Message; compat32 API를 사용하여 이메일 메시지 표현하기: email message Message compat32 API를 사용하여 이메일 메시지 표현하기. 
* email.mime; 처음부터 이메일과 MIME 객체 만들기: email mime 처음부터 이메일과 MIME 객체 만들기. 
* email.header; 국제화된 헤더: email header 국제화된 헤더. 
* email.charset; 문자 집합 표현: email charset 문자 집합 표현. 
* email.encoders; 인코더: email encoders 인코더. 
* email.utils; 기타 유틸리티: email utils 기타 유틸리티. 
* email.iterators; 이터레이터: email iterators 이터레이터. 

email.parser: 전자 메일 메시지 구문 분석

* FeedParser API:: 
* Parser API:: 
* 추가 사항:: 

email.contentmanager: MIME 콘텐츠 관리

* 콘텐츠 관리자 인스턴스:: 

json — JSON 인코더와 디코더

* 기본 사용법:: 
* 인코더와 디코더:: 
* 예외: 예외<14>. 
* 표준 준수와 상호 운용성:: 
* Command-line interface: Command-line interface<5>. 

표준 준수와 상호 운용성

* 문자 인코딩:: 
* 무한대와 NaN 숫자 값:: 
* 오브젝트 내에서 반복된 이름:: 
* 오브젝트나 배열이 아닌 최상윗값:: 
* 구현 제약 사항:: 

Command-line interface

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

mailbox — 다양한 형식의 사서함 조작하기

* Mailbox 객체:: 
* Message 객체:: 
* 예외: 예외<15>. 
* 예: 예<7>. 

Mailbox 객체

* Maildir 객체:: 
* mbox 객체:: 
* MH 객체:: 
* Babyl 객체:: 
* MMDF 객체:: 

Message 객체

* MaildirMessage 객체:: 
* mboxMessage 객체:: 
* MHMessage 객체:: 
* BabylMessage 객체:: 
* MMDFMessage 객체:: 

mimetypes — 파일명을 MIME 유형에 매핑

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

base64 — Base16, Base32, Base64, Base85 데이터 인코딩

* RFC 4648 Encodings:: 
* Base85 Encodings:: 
* Legacy Interface:: 
* Security Considerations:: 

구조화된 마크업 처리 도구

* html — 하이퍼텍스트 마크업 언어 지원:: 
* html.parser — 간단한 HTML과 XHTML 구문 분석기: html parser — 간단한 HTML과 XHTML 구문 분석기. 
* html.entities — HTML 일반 엔티티의 정의: html entities — HTML 일반 엔티티의 정의. 
* XML 처리 모듈:: 
* xml.etree.ElementTree — ElementTree XML API: xml etree ElementTree — ElementTree XML API. 
* xml.dom — 문서 객체 모델 API: xml dom — 문서 객체 모델 API. 
* xml.dom.minidom — 최소 DOM 구현: xml dom minidom — 최소 DOM 구현. 
* xml.dom.pulldom — 부분 DOM 트리 구축 지원: xml dom pulldom — 부분 DOM 트리 구축 지원. 
* xml.sax — SAX2 구문 분석기 지원: xml sax — SAX2 구문 분석기 지원. 
* xml.sax.handler — SAX 처리기의 베이스 클래스: xml sax handler — SAX 처리기의 베이스 클래스. 
* xml.sax.saxutils — SAX 유틸리티: xml sax saxutils — SAX 유틸리티. 
* xml.sax.xmlreader — XML 구문 분석기 인터페이스: xml sax xmlreader — XML 구문 분석기 인터페이스. 
* xml.parsers.expat — Expat을 사용한 빠른 XML 구문 분석: xml parsers expat — Expat을 사용한 빠른 XML 구문 분석. 

html.parser — 간단한 HTML과 XHTML 구문 분석기

* HTML 구문 분석기 응용 프로그램 예제:: 
* HTMLParser 메서드:: 
* 예제: 예제<22>. 

XML 처리 모듈

* XML security:: 

xml.etree.ElementTree — ElementTree XML API

* 자습서: 자습서<2>. 
* XPath 지원:: 
* 레퍼런스: 레퍼런스<2>. 
* XInclude 지원:: 
* 레퍼런스: 레퍼런스<3>. 

자습서

* XML 트리와 엘리먼트:: 
* XML 구문 분석하기:: 
* 비 블로킹 구문 분석을 위한 풀(pull) API: 비 블로킹 구문 분석을 위한 풀 pull API. 
* 흥미로운 엘리먼트 찾기:: 
* XML 파일 수정하기:: 
* XML 문서 구축하기:: 
* 이름 공간이 있는 XML 구문 분석하기:: 

XPath 지원

* 예: 예<8>. 
* 지원되는 XPath 문법:: 

레퍼런스

* 함수: 함수<8>. 

XInclude 지원

* 예: 예<9>. 

레퍼런스

* 함수: 함수<9>. 
* Element 객체:: 
* ElementTree 객체:: 
* QName 객체:: 
* TreeBuilder 객체:: 
* XMLParser 객체:: 
* XMLPullParser 객체:: 
* 예외: 예외<16>. 

xml.dom — 문서 객체 모델 API

* 모듈 내용: 모듈 내용<5>. 
* DOM의 객체:: 
* 규격 준수:: 

DOM의 객체

* DOMImplementation 객체:: 
* Node 객체:: 
* NodeList 객체:: 
* DocumentType 객체:: 
* Document 객체:: 
* Element 객체: Element 객체<2>. 
* Attr 객체:: 
* NamedNodeMap 객체:: 
* Comment 객체:: 
* Text와 CDATASection 객체:: 
* ProcessingInstruction 객체:: 
* 예외: 예외<17>. 

규격 준수

* 형 매핑:: 
* 접근자 메서드:: 

xml.dom.minidom — 최소 DOM 구현

* DOM 객체:: 
* DOM 예제:: 
* minidom과 DOM 표준:: 

xml.dom.pulldom — 부분 DOM 트리 구축 지원

* DOMEventStream 객체:: 

xml.sax — SAX2 구문 분석기 지원

* SAXException 객체:: 

xml.sax.handler — SAX 처리기의 베이스 클래스

* ContentHandler 객체:: 
* DTDHandler 객체:: 
* EntityResolver 객체:: 
* ErrorHandler 객체:: 
* LexicalHandler 객체:: 

xml.sax.xmlreader — XML 구문 분석기 인터페이스

* XMLReader 객체:: 
* IncrementalParser 객체:: 
* Locator 객체:: 
* InputSource 객체:: 
* Attributes 인터페이스:: 
* AttributesNS 인터페이스:: 

xml.parsers.expat — Expat을 사용한 빠른 XML 구문 분석

* XMLParser 객체: XMLParser 객체<2>. 
* ExpatError 예외:: 
* 예: 예<10>. 
* 콘텐츠 모델 기술:: 
* Expat 에러 상수:: 

인터넷 프로토콜과 지원

* webbrowser — 편리한 웹 브라우저 제어기:: 
* wsgiref — WSGI 유틸리티와 참조 구현:: 
* urllib — URL 처리 모듈:: 
* urllib.request — URL을 열기 위한 확장 가능한 라이브러리: urllib request — URL을 열기 위한 확장 가능한 라이브러리. 
* urllib.response — Response classes used by urllib: urllib response — Response classes used by urllib. 
* urllib.parse — URL을 구성 요소로 구문 분석: urllib parse — URL을 구성 요소로 구문 분석. 
* urllib.error — urllib.request에 의해 발생하는 예외 클래스: urllib error — urllib request에 의해 발생하는 예외 클래스. 
* urllib.robotparser — robots.txt 구문 분석기: urllib robotparser — robots txt 구문 분석기. 
* http — HTTP 모듈:: 
* http.client — HTTP 프로토콜 클라이언트: http client — HTTP 프로토콜 클라이언트. 
* ftplib — FTP 프로토콜 클라이언트:: 
* poplib — POP3 프로토콜 클라이언트:: 
* imaplib — IMAP4 프로토콜 클라이언트:: 
* smtplib — SMTP 프로토콜 클라이언트:: 
* uuid — UUID objects according to RFC 9562:: 
* socketserver — 네트워크 서버를 위한 프레임워크:: 
* http.server — HTTP 서버: http server — HTTP 서버. 
* http.cookies — HTTP 상태 관리: http cookies — HTTP 상태 관리. 
* http.cookiejar — HTTP 클라이언트를 위한 쿠키 처리: http cookiejar — HTTP 클라이언트를 위한 쿠키 처리. 
* xmlrpc — XMLRPC 서버와 클라이언트 모듈:: 
* xmlrpc.client — XML-RPC 클라이언트 액세스: xmlrpc client — XML-RPC 클라이언트 액세스. 
* xmlrpc.server — 기본 XML-RPC 서버: xmlrpc server — 기본 XML-RPC 서버. 
* ipaddress — IPv4/IPv6 조작 라이브러리:: 

webbrowser — 편리한 웹 브라우저 제어기

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

wsgiref — WSGI 유틸리티와 참조 구현

* 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. 
* 예제: 예제<23>. 

urllib.request — URL을 열기 위한 확장 가능한 라이브러리

* Request 객체:: 
* OpenerDirector 객체:: 
* BaseHandler 객체:: 
* HTTPRedirectHandler 객체:: 
* HTTPCookieProcessor 객체:: 
* ProxyHandler 객체:: 
* HTTPPasswordMgr 객체:: 
* HTTPPasswordMgrWithPriorAuth 객체:: 
* AbstractBasicAuthHandler 객체:: 
* HTTPBasicAuthHandler 객체:: 
* ProxyBasicAuthHandler 객체:: 
* AbstractDigestAuthHandler 객체:: 
* HTTPDigestAuthHandler 객체:: 
* ProxyDigestAuthHandler 객체:: 
* HTTPHandler 객체:: 
* HTTPSHandler 객체:: 
* FileHandler 객체:: 
* DataHandler 객체:: 
* FTPHandler 객체:: 
* CacheFTPHandler 객체:: 
* UnknownHandler 객체:: 
* HTTPErrorProcessor 객체:: 
* 예: 예<11>. 
* 레거시 인터페이스:: 
* urllib.request Restrictions: urllib request Restrictions. 

urllib.parse — URL을 구성 요소로 구문 분석

* URL 구문 분석:: 
* URL 구문 분석 보안:: 
* ASCII로 인코딩된 바이트열 구문 분석:: 
* 구조화된 구문 분석 결과:: 
* URL 인용:: 

http — HTTP 모듈

* HTTP 상태 코드:: 
* HTTP 상태 범주:: 
* HTTP 메서드:: 

http.client — HTTP 프로토콜 클라이언트

* HTTPConnection 객체:: 
* HTTPResponse 객체:: 
* 예: 예<12>. 
* HTTPMessage 객체:: 

ftplib — FTP 프로토콜 클라이언트

* 레퍼런스: 레퍼런스<4>. 

레퍼런스

* FTP 객체:: 
* FTP_TLS 객체:: 
* 모듈 변수:: 

poplib — POP3 프로토콜 클라이언트

* POP3 객체:: 
* POP3 예제:: 

imaplib — IMAP4 프로토콜 클라이언트

* IMAP4 객체:: 
* IMAP4 예:: 

smtplib — SMTP 프로토콜 클라이언트

* SMTP 객체:: 
* SMTP 예:: 

uuid — UUID objects according to RFC 9562

* 명령줄 사용법:: 
* 예제: 예제<24>. 
* 명령줄 예제:: 

socketserver — 네트워크 서버를 위한 프레임워크

* 서버 생성 노트:: 
* 서버 객체:: 
* 요청 처리기 객체:: 
* 예: 예<13>. 

예

* socketserver.TCPServer 예: socketserver TCPServer 예. 
* socketserver.UDPServer 예: socketserver UDPServer 예. 
* 비동기 믹스인:: 

http.server — HTTP 서버

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

http.cookies — HTTP 상태 관리

* 쿠키 객체:: 
* Morsel 객체:: 
* 예제: 예제<25>. 

http.cookiejar — HTTP 클라이언트를 위한 쿠키 처리

* CookieJar와 FileCookieJar 객체:: 
* FileCookieJar 서브 클래스와 웹 브라우저와의 협력:: 
* CookiePolicy 객체:: 
* DefaultCookiePolicy 객체:: 
* Cookie 객체:: 
* 예: 예<14>. 

xmlrpc.client — XML-RPC 클라이언트 액세스

* ServerProxy 객체:: 
* DateTime 객체:: 
* Binary 객체:: 
* Fault 객체:: 
* ProtocolError 객체:: 
* MultiCall 객체:: 
* 편의 함수:: 
* 클라이언트 사용 예:: 
* 클라이언트와 서버 사용 예:: 

xmlrpc.server — 기본 XML-RPC 서버

* SimpleXMLRPCServer objects:: 
* CGIXMLRPCRequestHandler:: 
* XMLRPC 서버 문서화:: 
* DocXMLRPCServer objects:: 
* DocCGIXMLRPCRequestHandler:: 

SimpleXMLRPCServer objects

* SimpleXMLRPCServer example:: 

ipaddress — IPv4/IPv6 조작 라이브러리

* 편의 팩토리 함수:: 
* IP 주소:: 
* IP 네트워크 정의:: 
* 인터페이스 객체:: 
* 다른 모듈 수준 함수:: 
* 맞춤 예외:: 

IP 주소

* 주소 객체:: 
* 문자열과 정수로의 변환:: 
* 연산자: 연산자<2>. 

연산자

* 비교 연산자:: 
* 산술 연산자:: 

IP 네트워크 정의

* 접두사@comma{} 네트 마스크 및 호스트 마스크: 접두사 네트 마스크 및 호스트 마스크. 
* 네트워크 객체:: 
* 연산자: 연산자<3>. 

연산자

* 논리 연산자:: 
* 이터레이션:: 
* 주소 컨테이너로서의 네트워크:: 

인터페이스 객체

* 연산자: 연산자<4>. 

연산자

* 논리 연산자: 논리 연산자<2>. 

멀티미디어 서비스

* wave — WAV 파일 읽고 쓰기:: 
* colorsys — 색 체계 간의 변환:: 

wave — WAV 파일 읽고 쓰기

* Wave_read 객체:: 
* Wave_write 객체:: 

국제화

* gettext — 다국어 국제화 서비스:: 
* locale — 국제화 서비스:: 

gettext — 다국어 국제화 서비스

* GNU gettext API:: 
* 클래스 기반 API:: 
* 프로그램과 모듈의 국제화:: 
* 감사의 말:: 

클래스 기반 API

* NullTranslations 클래스:: 
* GNUTranslations 클래스:: 
* Solaris 메시지 카탈로그 지원:: 
* Catalog 생성자:: 

프로그램과 모듈의 국제화

* 모듈 현지화:: 
* 응용 프로그램 현지화:: 
* 실행 중 언어 변경:: 
* 지연된 번역:: 

locale — 국제화 서비스

* 배경@comma{} 세부 사항@comma{} 힌트@comma{} 팁 및 경고: 배경 세부 사항 힌트 팁 및 경고. 
* Locale names:: 
* 확장 작성자와 파이썬을 내장하는 프로그램의 경우:: 
* 메시지 카탈로그에 액세스:: 

Graphical user interfaces with Tk

* tkinter — Tcl/Tk 파이썬 인터페이스:: 
* tkinter.colorchooser — 색상 선택 대화 상자: tkinter colorchooser — 색상 선택 대화 상자. 
* tkinter.font — Tkinter 글꼴 래퍼: tkinter font — Tkinter 글꼴 래퍼. 
* Tkinter 대화 상자:: 
* tkinter.messagebox — Tkinter 메시지 프롬프트: tkinter messagebox — Tkinter 메시지 프롬프트. 
* tkinter.scrolledtext — 스크롤 되는 Text 위젯: tkinter scrolledtext — 스크롤 되는 Text 위젯. 
* tkinter.dnd — 드래그 앤드 드롭 지원: tkinter dnd — 드래그 앤드 드롭 지원. 
* tkinter.ttk — Tk 테마 위젯: tkinter ttk — Tk 테마 위젯. 
* IDLE — 파이썬 편집기와 셸:: 
* turtle — Turtle graphics:: 

tkinter — Tcl/Tk 파이썬 인터페이스

* Architecture:: 
* Tkinter 모듈:: 
* Tkinter 구명조끼:: 
* Threading model:: 
* 간편한 레퍼런스:: 
* 파일 처리기:: 

Tkinter 구명조끼

* Hello World 프로그램:: 
* Important Tk Concepts:: 
* Understanding How Tkinter Wraps Tcl/Tk:: 
* How do I…? What option does…?:: 
* Navigating the Tcl/Tk Reference Manual:: 

간편한 레퍼런스

* 옵션 설정:: 
* 패커:: 
* 패커 옵션:: 
* 위젯 변수 결합하기:: 
* 창 관리자:: 
* Tk 옵션 데이터형:: 
* 바인딩과 이벤트:: 
* index 매개 변수:: 
* 이미지:: 

Tkinter 대화 상자

* 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

* 네이티브 로드/저장 대화 상자:: 

tkinter.ttk — Tk 테마 위젯

* Ttk 사용하기:: 
* Ttk 위젯:: 
* Widget:: 
* Combobox:: 
* Spinbox:: 
* Notebook:: 
* Progressbar:: 
* Separator:: 
* Sizegrip:: 
* Treeview:: 
* Ttk 스타일링:: 

Widget

* 표준 옵션:: 
* 스크롤 가능한 위젯 옵션:: 
* 레이블 옵션:: 
* 호환성 옵션:: 
* 위젯 상태:: 
* ttk.Widget: ttk Widget. 

Combobox

* 옵션:: 
* 가상 이벤트:: 
* ttk.Combobox: ttk Combobox. 

Spinbox

* 옵션: 옵션<2>. 
* 가상 이벤트: 가상 이벤트<2>. 
* ttk.Spinbox: ttk Spinbox. 

Notebook

* 옵션: 옵션<3>. 
* 탭 옵션:: 
* 탭 식별자:: 
* 가상 이벤트: 가상 이벤트<3>. 
* ttk.Notebook: ttk Notebook. 

Progressbar

* 옵션: 옵션<4>. 
* ttk.Progressbar: ttk Progressbar. 

Separator

* 옵션: 옵션<5>. 

Sizegrip

* 플랫폼별 노트:: 
* 버그:: 

Treeview

* 옵션: 옵션<6>. 
* 항목 옵션:: 
* 태그 옵션:: 
* 열 식별자:: 
* 가상 이벤트: 가상 이벤트<4>. 
* ttk.Treeview: ttk Treeview. 

Ttk 스타일링

* 레이아웃:: 

IDLE — 파이썬 편집기와 셸

* 메뉴:: 
* 편집과 탐색:: 
* 시작과 코드 실행:: 
* 도움말과 환경 설정:: 
* idlelib — IDLE 응용 프로그램의 구현:: 

메뉴

* File 메뉴 (셸과 편집기): File 메뉴 셸과 편집기. 
* Edit 메뉴 (셸과 편집기): Edit 메뉴 셸과 편집기. 
* Format 메뉴 (편집기 창 전용): Format 메뉴 편집기 창 전용. 
* Run 메뉴 (편집기 창 전용): Run 메뉴 편집기 창 전용. 
* Shell 메뉴 (셸 창 전용): Shell 메뉴 셸 창 전용. 
* Debug 메뉴 (셸 창 전용): Debug 메뉴 셸 창 전용. 
* Options 메뉴 (셸과 편집기): Options 메뉴 셸과 편집기. 
* Window 메뉴 (셸과 편집기): Window 메뉴 셸과 편집기. 
* Help 메뉴 (셸과 편집기): Help 메뉴 셸과 편집기. 
* Context 메뉴:: 

편집과 탐색

* 편집기 창:: 
* 키 바인딩:: 
* 자동 들여쓰기:: 
* 검색과 치환:: 
* 완성: 완성<2>. 
* 콜팁:: 
* Format block:: 
* 코드 컨텍스트:: 
* 셸 창:: 
* 텍스트 색상:: 

시작과 코드 실행

* Command-line usage: Command-line usage<5>. 
* 시작 실패:: 
* 사용자 코드 실행하기:: 
* 셸의 사용자 출력:: 
* tkinter 응용 프로그램 개발하기:: 
* 서브 프로세스 없이 실행하기:: 

도움말과 환경 설정

* 도움말 소스:: 
* 환경 설정:: 
* macOS의 IDLE:: 
* 확장:: 

turtle — Turtle graphics

* 소개: 소개<5>. 
* 시작하기: 시작하기<2>. 
* Tutorial: Tutorial<2>. 
* How to…:: 
* Turtle graphics reference:: 
* RawTurtle/Turtl의 메서드와 해당 함수:: 
* TurtleScreen/Screen 메서드와 해당 함수:: 
* 공개 클래스:: 
* Explanation: Explanation<2>. 
* 도움말과 구성:: 
* turtledemo — Demo scripts:: 
* 파이썬 2.6 이후의 변화: 파이썬 2 6 이후의 변화. 
* 파이썬 3.0 이후의 변화: 파이썬 3 0 이후의 변화. 

Tutorial

* 거북이 환경 시작하기:: 
* Basic drawing:: 
* Making algorithmic patterns:: 

Basic drawing

* 펜 제어:: 
* 거북이의 위치:: 

How to…

* Get started as quickly as possible:: 
* Automatically begin and end filling:: 
* Use the turtle module namespace:: 
* 스크립트에서 거북이 그래픽 사용하기:: 
* Use object-oriented turtle graphics:: 

Turtle graphics reference

* Turtle 메서드:: 
* TurtleScreen/Screen의 메서드:: 

RawTurtle/Turtl의 메서드와 해당 함수

* 거북이 움직임:: 
* 거북이의 상태 보고:: 
* 측정 설정:: 
* 펜 제어: 펜 제어<2>. 
* 거북이 상태:: 
* 이벤트 사용하기:: 
* 특수 Turtle 메서드:: 
* 복합 모양:: 

펜 제어

* 그리기 상태:: 
* 색상 제어:: 
* 채우기:: 
* 더 많은 그리기 제어:: 

거북이 상태

* 가시성:: 
* 외관:: 

TurtleScreen/Screen 메서드와 해당 함수

* 창 제어:: 
* 애니메이션 제어:: 
* 화면 이벤트 사용하기:: 
* 입력 메서드:: 
* 설정과 특수 메서드:: 
* TurtleScreen에서 상속되지 않은@comma{} Screen만의 메서드: TurtleScreen에서 상속되지 않은 Screen만의 메서드. 

도움말과 구성

* 도움말 사용법:: 
* 독스트링을 다른 언어로 번역:: 
* Screen과 Turtle을 구성하는 방법:: 

개발 도구

* typing — Support for type hints:: 
* pydoc — 설명서 생성과 온라인 도움말 시스템:: 
* 파이썬 개발 모드:: 
* doctest — 대화형 파이썬 예제 테스트:: 
* unittest — 단위 테스트 프레임워크:: 
* unittest.mock — 모의 객체 라이브러리: unittest mock — 모의 객체 라이브러리. 
* unittest.mock — 시작하기: unittest mock — 시작하기. 
* test — 파이썬 용 회귀 테스트 패키지:: 
* test.support — Utilities for the Python test suite: test support — Utilities for the Python test suite. 
* test.support.socket_helper — Utilities for socket tests: test support socket_helper — Utilities for socket tests. 
* test.support.script_helper — Utilities for the Python execution tests: test support script_helper — Utilities for the Python execution tests. 
* test.support.bytecode_helper — Support tools for testing correct bytecode generation: test support bytecode_helper — Support tools for testing correct bytecode generation. 
* test.support.threading_helper — Utilities for threading tests: test support threading_helper — Utilities for threading tests. 
* test.support.os_helper — Utilities for os tests: test support os_helper — Utilities for os tests. 
* test.support.import_helper — Utilities for import tests: test support import_helper — Utilities for import tests. 
* test.support.warnings_helper — Utilities for warnings tests: test support warnings_helper — Utilities for warnings tests. 

typing — Support for type hints

* Specification for the Python Type System:: 
* 형 에일리어스:: 
* NewType:: 
* Annotating callable objects:: 
* 제네릭:: 
* Annotating tuples:: 
* The type of class objects:: 
* Annotating generators and coroutines:: 
* 사용자 정의 제네릭 형:: 
* Any 형:: 
* 명목적 대 구조적 서브 타이핑:: 
* 모듈 내용: 모듈 내용<6>. 
* Deprecation Timeline of Major Features:: 

모듈 내용

* 특수 타이핑 프리미티브:: 
* 프로토콜: 프로토콜<3>. 
* ABCs and Protocols for working with I/O:: 
* 함수와 데코레이터:: 
* 인트로스펙션 도우미:: 
* 상수: 상수<10>. 
* Deprecated aliases:: 

특수 타이핑 프리미티브

* 특수형:: 
* 특수 형태:: 
* Building generic types and type aliases:: 
* 기타 특수 지시자:: 

Deprecated aliases

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

파이썬 개발 모드

* 파이썬 개발 모드의 효과:: 
* ResourceWarning 예:: 
* 잘못된 파일 기술자 에러 예:: 

doctest — 대화형 파이썬 예제 테스트

* 간단한 사용법; 독스트링에 있는 예제 확인하기: 간단한 사용법 독스트링에 있는 예제 확인하기. 
* 간단한 사용법; 텍스트 파일에 있는 예제 확인하기: 간단한 사용법 텍스트 파일에 있는 예제 확인하기. 
* 명령줄 사용법: 명령줄 사용법<2>. 
* 작동 방법:: 
* 기본 API:: 
* Unittest API:: 
* 고급 API:: 
* 디버깅:: 
* 맺음말: 맺음말<2>. 

작동 방법

* 어떤 독스트링을 검사합니까?:: 
* 독스트링 예제는 어떻게 인식됩니까?:: 
* 실행 컨텍스트란 무엇입니까?:: 
* 예외는 어떻게 됩니까?:: 
* 옵션 플래그:: 
* 지시자:: 
* 경고: 경고<2>. 

고급 API

* DocTest 객체:: 
* Example 객체:: 
* DocTestFinder 객체:: 
* DocTestParser 객체:: 
* TestResults 객체:: 
* DocTestRunner 객체:: 
* OutputChecker 객체:: 

unittest — 단위 테스트 프레임워크

* 기본 예시:: 
* 명령행 인터페이스:: 
* 테스트 탐색(Discovery): 테스트 탐색 Discovery. 
* 테스트 코드 구조 잡기:: 
* 이전의 테스트 코드를 다시 사용하기:: 
* 테스트 건너뛰기와 예상된 실패:: 
* 부분 테스트(subtest)를 사용하여 테스트 반복 구별 짓기: 부분 테스트 subtest 를 사용하여 테스트 반복 구별 짓기. 
* 클래스와 함수:: 
* 클래스와 모듈 픽스쳐:: 
* 시그널 처리하기:: 

명령행 인터페이스

* 명령행 옵션:: 

클래스와 함수

* 테스트 케이스:: 
* 테스트 분류:: 
* 테스트를 로드하고 실행하기:: 

테스트를 로드하고 실행하기

* load_tests 프로토콜:: 

클래스와 모듈 픽스쳐

* setUpClass 와 tearDownClass:: 
* setUpModule 과 tearDownModule:: 

unittest.mock — 모의 객체 라이브러리

* 간략 지침:: 
* Mock 클래스:: 
* 패처:: 
* MagicMock과 매직 메서드 지원:: 
* 도우미:: 
* Order of precedence of side_effect@comma{} return_value and wraps: Order of precedence of side_effect return_value and wraps. 

Mock 클래스

* 호출: 호출<2>. 
* 어트리뷰트 삭제:: 
* 모의 객체 이름과 이름 어트리뷰트:: 
* 모의 객체를 어트리뷰트로 연결하기:: 

패처

* patch:: 
* patch.object: patch object. 
* patch.dict: patch dict. 
* patch.multiple: patch multiple. 
* 패처 메서드; start와 stop: 패처 메서드 start와 stop. 
* 내장 패치:: 
* TEST_PREFIX:: 
* 패치 데코레이터 중첩하기:: 
* 패치할 곳:: 
* 디스크립터와 프락시 객체 패치하기:: 

MagicMock과 매직 메서드 지원

* 매직 메서드 모킹하기:: 
* 매직 모의 객체:: 

도우미

* sentinel:: 
* DEFAULT:: 
* call:: 
* create_autospec:: 
* ANY:: 
* FILTER_DIR:: 
* mock_open:: 
* 자동 사양:: 
* 실링 모의 객체 봉인하기:: 

unittest.mock — 시작하기

* 모의 객체 사용하기:: 
* Patch decorators:: 
* Further examples:: 

모의 객체 사용하기

* Mock patching methods:: 
* Mock for method calls on an object:: 
* Mocking classes:: 
* 모의 객체 이름 붙이기:: 
* Tracking all calls:: 
* Setting return values and attributes:: 
* 모의 객체로 예외 발생시키기:: 
* 부작용 함수와 이터러블:: 
* 비동기 이터레이터 모킹하기:: 
* 비동기 컨텍스트 관리자 모킹하기:: 
* Creating a mock from an existing object:: 
* Using side_effect to return per file content:: 

Further examples

* 연쇄 호출 모킹하기:: 
* 부분 모킹:: 
* Mocking a generator method:: 
* 모든 테스트 메서드에 같은 패치 적용하기:: 
* Mocking unbound methods:: 
* 모의 객체로 여러 호출 확인하기:: 
* 가변 인자에 대처하기:: 
* Nesting patches:: 
* MagicMock으로 딕셔너리 모킹하기:: 
* Mock 서브 클래스와 그 어트리뷰트:: 
* patch.dict로 임포트를 모킹하기: patch dict로 임포트를 모킹하기. 
* 호출 순서 추적과 덜 상세한 호출 어서션:: 
* 더 복잡한 인자 일치:: 

test — 파이썬 용 회귀 테스트 패키지

* Writing Unit Tests for the test package:: 
* 명령 줄 인터페이스를 사용하여 테스트 실행하기:: 

디버깅과 프로파일링

* 감사 이벤트 표:: 
* bdb — 디버거 프레임워크:: 
* faulthandler — 파이썬 트레이스백 덤프:: 
* pdb — The Python Debugger:: 
* 파이썬 프로파일러:: 
* timeit — 작은 코드 조각의 실행 시간 측정:: 
* trace — 파이썬 문장 실행 추적:: 
* tracemalloc — 메모리 할당 추적:: 

faulthandler — 파이썬 트레이스백 덤프

* 트레이스백 덤프하기:: 
* Dumping the C stack:: 
* 결함 처리기 상태:: 
* 시간 초과 후에 트레이스백 덤프하기:: 
* 사용자 시그널에 트레이스백 덤프하기:: 
* 파일 기술자 관련 문제:: 
* 예제: 예제<26>. 

Dumping the C stack

* C Stack Compatibility:: 

pdb — The Python Debugger

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

파이썬 프로파일러

* 프로파일러 소개:: 
* 즉석 사용자 설명서:: 
* profile and cProfile Module Reference:: 
* Stats 클래스:: 
* 결정론적 프로파일링이란 무엇입니까?:: 
* 한계:: 
* 보정:: 
* 사용자 정의 타이머 사용하기:: 

timeit — 작은 코드 조각의 실행 시간 측정

* 기본 예제:: 
* 파이썬 인터페이스:: 
* 명령 줄 인터페이스: 명령 줄 인터페이스<2>. 
* 예제: 예제<27>. 

trace — 파이썬 문장 실행 추적

* 명령 줄 사용법:: 
* 프로그래밍 인터페이스:: 

명령 줄 사용법

* 주요 옵션:: 
* 수정자:: 
* 필터:: 

tracemalloc — 메모리 할당 추적

* 예: 예<15>. 
* API:: 

예

* 상위 10개 표시:: 
* 차이 계산:: 
* 메모리 블록의 트레이스백 얻기:: 
* 예쁜 탑(top): 예쁜 탑 top. 

예쁜 탑(top)

* 모든 추적한 메모리 블록의 현재 및 최대 크기를 기록:: 

API

* 함수: 함수<10>. 
* DomainFilter:: 
* Filter:: 
* Frame:: 
* Snapshot:: 
* Statistic:: 
* StatisticDiff:: 
* Trace:: 
* Traceback:: 

소프트웨어 패키징 및 배포

* ensurepip — pip 설치 프로그램 부트스트랩:: 
* venv — 가상 환경 생성:: 
* zipapp — 실행 가능한 파이썬 zip 아카이브 관리:: 

ensurepip — pip 설치 프로그램 부트스트랩

* Command-line interface: Command-line interface<9>. 
* 모듈 API:: 

venv — 가상 환경 생성

* 가상 환경 만들기: 가상 환경 만들기<2>. 
* How venvs work:: 
* API: API<2>. 
* EnvBuilder 확장 예제:: 

zipapp — 실행 가능한 파이썬 zip 아카이브 관리

* 기본 예: 기본 예<2>. 
* 명령 줄 인터페이스: 명령 줄 인터페이스<3>. 
* 파이썬 API:: 
* 예: 예<16>. 
* 인터프리터 지정하기:: 
* zipapp으로 독립형 응용 프로그램 만들기:: 
* 파이썬 Zip 응용 프로그램 아카이브 형식:: 

zipapp으로 독립형 응용 프로그램 만들기

* 경고: 경고<3>. 

파이썬 실행시간 서비스

* sys — 시스템 특정 파라미터와 함수:: 
* sys.monitoring — Execution event monitoring: sys monitoring — Execution event monitoring. 
* sysconfig — 파이썬의 구성 정보에 접근하기:: 
* builtins — 내장 객체:: 
* __main__ — 최상위 코드 환경:: 
* warnings — 경고 제어:: 
* dataclasses — 데이터 클래스:: 
* contextlib — with 문 컨텍스트를 위한 유틸리티:: 
* abc — 추상 베이스 클래스:: 
* atexit — 종료 처리기:: 
* traceback — 스택 트레이스백 인쇄와 조회:: 
* __future__ — 퓨처 문 정의:: 
* gc — 가비지 수거기 인터페이스:: 
* inspect — 라이브 객체 검사:: 
* annotationlib — Functionality for introspecting annotations:: 
* site — 사이트별 구성 훅:: 

sys.monitoring — Execution event monitoring

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

Tool identifiers

* Registering and using tools:: 

Events

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

Turning events on and off

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

Registering callback functions

* Callback function arguments:: 

sysconfig — 파이썬의 구성 정보에 접근하기

* 구성 변수:: 
* 설치 경로:: 
* User scheme:: 
* Home scheme:: 
* Prefix scheme:: 
* 설치 경로 함수:: 
* 기타 함수: 기타 함수<3>. 
* Command-line usage: Command-line usage<6>. 

User scheme

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

Home scheme

* posix_home:: 

Prefix scheme

* posix_prefix:: 
* nt:: 

__main__ — 최상위 코드 환경

* __name__ == '__main__':: 
* 파이썬 패키지의 __main__.py: 파이썬 패키지의 __main__ py. 
* import __main__:: 

__name__ == '__main__'

* “최상위 코드 환경” 이란 무엇인가요?:: 
* 관용적 사용법:: 
* 패키징 고려 사항:: 

파이썬 패키지의 __main__.py

* 관용적 사용법: 관용적 사용법<2>. 

warnings — 경고 제어

* 경고 범주:: 
* 경고 필터:: 
* 일시적인 경고 억제:: 
* 경고 테스트:: 
* 새 버전의 종속성에 대한 코드 갱신:: 
* 사용 가능한 함수:: 
* 사용 가능한 컨텍스트 관리자:: 
* Concurrent safety of Context Managers:: 

경고 필터

* Repeated Warning Suppression Criteria:: 
* 경고 필터 설명:: 
* 기본 경고 필터:: 
* 기본 필터 재정의:: 

dataclasses — 데이터 클래스

* Module contents: Module contents<2>. 
* 초기화 후처리:: 
* 클래스 변수:: 
* 초기화 전용 변수:: 
* 고정 인스턴스:: 
* 계승:: 
* Re-ordering of keyword-only parameters in __init__(): Re-ordering of keyword-only parameters in __init__. 
* 기본 팩토리 함수:: 
* 가변 기본값:: 
* Descriptor-typed fields:: 

contextlib — with 문 컨텍스트를 위한 유틸리티

* 유틸리티:: 
* 예제와 조리법: 예제와 조리법<3>. 
* 일회용@comma{} 재사용 가능 및 재진입 가능 컨텍스트 관리자: 일회용 재사용 가능 및 재진입 가능 컨텍스트 관리자. 

예제와 조리법

* 일정하지 않은 수의 컨텍스트 관리자 지원:: 
* __enter__ 메서드에서 발생하는 예외 잡기:: 
* __enter__ 구현에서 정리하기:: 
* try-finally와 플래그 변수 사용 교체하기:: 
* 함수 데코레이터로 컨텍스트 관리자 사용하기:: 

일회용, 재사용 가능 및 재진입 가능 컨텍스트 관리자

* 재진입 가능 컨텍스트 관리자:: 
* 재사용 가능 컨텍스트 관리자:: 

atexit — 종료 처리기

* atexit Example:: 

traceback — 스택 트레이스백 인쇄와 조회

* 모듈 수준 함수: 모듈 수준 함수<2>. 
* TracebackException 객체:: 
* StackSummary 객체:: 
* FrameSummary 객체:: 
* Examples of Using the Module-Level Functions:: 
* TracebackException을 사용하는 예제:: 

__future__ — 퓨처 문 정의

* Module Contents:: 

inspect — 라이브 객체 검사

* 형과 멤버:: 
* 소스 코드 가져오기:: 
* Signature 객체로 콜러블 검사하기:: 
* 클래스와 함수: 클래스와 함수<2>. 
* 인터프리터 스택:: 
* 정적으로 어트리뷰트 가져오기:: 
* 제너레이터@comma{} 코루틴 및 비동기 제너레이터의 현재 상태: 제너레이터 코루틴 및 비동기 제너레이터의 현재 상태. 
* 코드 객체 비트 플래그:: 
* Buffer flags:: 
* Command-line interface: Command-line interface<10>. 

annotationlib — Functionality for introspecting annotations

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

Recipes

* Using annotations in a metaclass:: 

site — 사이트별 구성 훅

* sitecustomize:: 
* usercustomize:: 
* Readline 구성:: 
* 모듈 내용: 모듈 내용<7>. 
* Command-line interface: Command-line interface<11>. 

사용자 정의 파이썬 인터프리터

* code — 인터프리터 베이스 클래스:: 
* codeop — 파이썬 코드 컴파일:: 

code — 인터프리터 베이스 클래스

* 대화형 인터프리터 객체:: 
* 대화형 콘솔 객체:: 

모듈 임포트 하기

* zipimport — Zip 저장소에서 모듈 임포트:: 
* pkgutil — 패키지 확장 유틸리티:: 
* modulefinder — 스크립트에서 사용되는 모듈 찾기:: 
* runpy — 파이썬 모듈 찾기와 실행:: 
* importlib — import의 구현:: 
* importlib.resources – Package resource reading@comma{} opening and access: importlib resources – Package resource reading opening and access. 
* importlib.resources.abc – Abstract base classes for resources: importlib resources abc – Abstract base classes for resources. 
* importlib.metadata – 패키지 메타데이터 액세스: importlib metadata – 패키지 메타데이터 액세스. 
* The initialization of the sys.path module search path: The initialization of the sys path module search path. 

zipimport — Zip 저장소에서 모듈 임포트

* zipimporter 객체:: 
* 예제: 예제<28>. 

modulefinder — 스크립트에서 사용되는 모듈 찾기

* ModuleFinder의 사용 예:: 

importlib — import의 구현

* 소개: 소개<6>. 
* 함수: 함수<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. 
* 예: 예<17>. 

예

* 프로그래밍 방식으로 임포트 하기:: 
* 모듈을 임포트 할 수 있는지 확인하기:: 
* 소스 파일을 직접 임포트 하기:: 
* Implementing lazy imports:: 
* 임포터 설정하기:: 
* importlib.import_module() 근사하기: importlib import_module 근사하기. 

importlib.resources – Package resource reading, opening and access

* Functional API:: 

importlib.metadata – 패키지 메타데이터 액세스

* 개요: 개요<3>. 
* 기능적 API:: 
* 배포:: 
* 배포 발견:: 
* Implementing Custom Providers:: 

기능적 API

* 진입 지점:: 
* 배포 메타데이터:: 
* 배포 버전:: 
* 배포 파일:: 
* 배포 요구 사항:: 
* Mapping import to distribution packages:: 

Implementing Custom Providers

* 예제: 예제<29>. 

The initialization of the sys.path module search path

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

파이썬 언어 서비스

* ast — Abstract syntax trees:: 
* symtable — 컴파일러 심볼 테이블 액세스:: 
* token — 파이썬 구문 분석 트리에 사용되는 상수:: 
* keyword — 파이썬 키워드 검사:: 
* tokenize — 파이썬 소스를 위한 토크나이저:: 
* tabnanny — 모호한 들여쓰기 감지:: 
* pyclbr — 파이썬 모듈 브라우저 지원:: 
* py_compile — 파이썬 소스 파일 컴파일:: 
* compileall — 파이썬 라이브러리 바이트 컴파일하기:: 
* dis — Disassembler for Python bytecode:: 
* pickletools — 피클 개발자를 위한 도구:: 

ast — Abstract syntax trees

* Abstract grammar:: 
* 노드 클래스:: 
* ast helpers:: 
* Compiler flags: Compiler flags<2>. 
* Command-line usage: Command-line usage<7>. 

노드 클래스

* Root nodes:: 
* 리터럴: 리터럴<2>. 
* 변수:: 
* 표현식: 표현식<2>. 
* 문장:: 
* 제어 흐름:: 
* Pattern matching:: 
* Type annotations:: 
* Type parameters:: 
* 함수와 클래스 정의:: 
* Async와 await:: 

표현식

* 서브스크립팅:: 
* 컴프리헨션:: 

문장

* 임포트:: 

symtable — 컴파일러 심볼 테이블 액세스

* 심볼 테이블 생성하기:: 
* 심볼 테이블 검사하기:: 
* Command-Line Usage:: 

tokenize — 파이썬 소스를 위한 토크나이저

* 입력 토큰화하기:: 
* 명령 줄 사용법: 명령 줄 사용법<2>. 
* 예제: 예제<30>. 

pyclbr — 파이썬 모듈 브라우저 지원

* Function 객체:: 
* Class 객체:: 

py_compile — 파이썬 소스 파일 컴파일

* 명령줄 인터페이스:: 

compileall — 파이썬 라이브러리 바이트 컴파일하기

* 명령 줄 사용:: 
* 공용 함수:: 

dis — Disassembler for Python bytecode

* Command-line interface: Command-line interface<12>. 
* 바이트 코드 분석:: 
* 분석 함수:: 
* 파이썬 바이트 코드 명령어:: 
* 옵코드 모음:: 

pickletools — 피클 개발자를 위한 도구

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

Command-line usage

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

MS 윈도우 특정 서비스

* msvcrt — MS VC++ 런타임의 유용한 루틴:: 
* winreg — 윈도우 레지스트리 액세스:: 
* winsound — 윈도우용 소리 재생 인터페이스:: 

msvcrt — MS VC++ 런타임의 유용한 루틴

* 파일 연산:: 
* 콘솔 I/O:: 
* 기타 함수: 기타 함수<4>. 

winreg — 윈도우 레지스트리 액세스

* 함수: 함수<12>. 
* 상수: 상수<11>. 
* 레지스트리 핸들 객체:: 

상수

* HKEY_* 상수:: 
* 액세스 권한:: 
* 값 형:: 

액세스 권한

* 64비트 특정:: 

Unix-specific services

* shlex — 간단한 어휘 분석:: 
* posix — 가장 일반적인 POSIX 시스템 호출:: 
* pwd — 암호 데이터베이스:: 
* grp — 그룹 데이터베이스:: 
* termios — POSIX 스타일 tty 제어:: 
* tty — 터미널 제어 함수:: 
* pty — 의사 터미널 유틸리티:: 
* fcntl — fcntl과 ioctl 시스템 호출:: 
* resource — 자원 사용 정보:: 
* syslog — 유닉스 syslog 라이브러리 루틴:: 

shlex — 간단한 어휘 분석

* shlex 객체:: 
* 구문 분석 규칙:: 
* 셸과의 호환성 향상:: 

posix — 가장 일반적인 POSIX 시스템 호출

* 대용량 파일 지원:: 
* 주목할만한 모듈 내용:: 

termios — POSIX 스타일 tty 제어

* 예제: 예제<31>. 

pty — 의사 터미널 유틸리티

* 예제: 예제<32>. 

resource — 자원 사용 정보

* 자원 제한: 자원 제한<2>. 
* 자원 사용량:: 

syslog — 유닉스 syslog 라이브러리 루틴

* 예제: 예제<33>. 

예제

* 간단한 예제:: 

대체된 모듈

* getopt — 명령 줄 옵션용 C 스타일 구문 분석기:: 

Removed Modules

* aifc — AIFF와 AIFC 파일 읽고 쓰기:: 
* asynchat — 비동기 소켓 명령/응답 처리기:: 
* asyncore — 비동기 소켓 처리기:: 
* audioop — 원시 오디오 데이터 조작:: 
* cgi — 공통 게이트웨이 인터페이스 지원:: 
* cgitb — CGI 스크립트를 위한 트레이스백 관리자:: 
* chunk — IFF 청크된 데이터 읽기:: 
* crypt — 유닉스 비밀번호 확인 함수:: 
* distutils — 파이썬 모듈 빌드와 설치:: 
* imghdr — 이미지 유형 판단:: 
* imp — 임포트 내부 액세스:: 
* mailcap — Mailcap 파일 처리:: 
* msilib — 마이크로소프트 설치 파일 읽고 쓰기:: 
* nis — Sun의 NIS(옐로 페이지)에 대한 인터페이스: nis — Sun의 NIS 옐로 페이지 에 대한 인터페이스. 
* nntplib — NNTP 프로토콜 클라이언트:: 
* ossaudiodev — OSS 호환 오디오 장치 액세스:: 
* pipes — 셸 파이프라인에 대한 인터페이스:: 
* smtpd — SMTP 서버:: 
* sndhdr — 음향 파일 유형 판단:: 
* spwd — 섀도 암호 데이터베이스:: 
* sunau — Sun AU 파일 읽고 쓰기:: 
* telnetlib — 텔넷 클라이언트:: 
* uu — uuencode 파일 인코딩과 디코딩:: 
* xdrlib — XDR 데이터 인코딩과 디코딩:: 

파이썬 인터프리터 확장 및 내장

* 권장 제삼자 도구:: 
* 제삼자 도구 없이 확장 만들기:: 
* 더 큰 응용 프로그램에 CPython 런타임을 내장하기:: 

제삼자 도구 없이 확장 만들기

* C나 C++로 파이썬 확장하기:: 
* 확장형 정의하기; 자습서: 확장형 정의하기 자습서. 
* 확장형 정의하기; 여러 가지 주제: 확장형 정의하기 여러 가지 주제. 
* C와 C++ 확장 빌드하기:: 
* 윈도우에서 C와 C++ 확장 빌드하기:: 

C나 C++로 파이썬 확장하기

* 간단한 예:: 
* 막간극; 에러와 예외: 막간극 에러와 예외. 
* 예제로 돌아가기:: 
* 모듈의 메서드 테이블과 초기화 함수:: 
* 컴파일과 링크:: 
* C에서 파이썬 함수 호출하기:: 
* 확장 함수에서 매개 변수 추출하기:: 
* 확장 함수를 위한 키워드 매개 변수:: 
* 임의의 값을 구축하기:: 
* 참조 횟수:: 
* C++로 확장 작성하기:: 
* 확장 모듈을 위한 C API 제공하기:: 

참조 횟수

* 파이썬에서 참조 횟수 세기:: 
* 소유권 규칙:: 
* 살얼음:: 
* NULL 포인터:: 

확장형 정의하기: 자습서

* 기초:: 
* 기초 예제에 데이터와 메서드 추가하기:: 
* 데이터 어트리뷰트를 더 세밀하게 제어하기:: 
* 순환 가비지 수거 지원하기:: 
* 다른 형의 서브 클래싱:: 

확장형 정의하기: 여러 가지 주제

* 파이널리제이션과 할당 해제:: 
* 객체 표현:: 
* 어트리뷰트 관리:: 
* 객체 비교:: 
* 추상 프로토콜 지원:: 
* 약한 참조 지원:: 
* 추가 제안:: 

어트리뷰트 관리

* 범용 어트리뷰트 관리:: 
* 형별 어트리뷰트 관리:: 

C와 C++ 확장 빌드하기

* setuptools로 C와 C++ 확장 빌드하기:: 

윈도우에서 C와 C++ 확장 빌드하기

* 요리책 접근법:: 
* 유닉스와 윈도우의 차이점:: 
* DLL을 실제로 사용하기:: 

더 큰 응용 프로그램에 CPython 런타임을 내장하기

* 다른 응용 프로그램에 파이썬 내장하기:: 

다른 응용 프로그램에 파이썬 내장하기

* 매우 고수준의 내장:: 
* 매우 고수준 내장을 넘어서; 개요: 매우 고수준 내장을 넘어서 개요. 
* 순수한 내장:: 
* 내장된 파이썬을 확장하기:: 
* C++로 파이썬 내장하기:: 
* 유닉스 계열 시스템에서 컴파일과 링크하기:: 

Python/C API reference manual

* 소개: 소개<7>. 
* C API Stability:: 
* 매우 고수준 계층:: 
* 참조 횟수: 참조 횟수<3>. 
* 예외 처리:: 
* Defining extension modules:: 
* 유틸리티: 유틸리티<2>. 
* 추상 객체 계층:: 
* 구상 객체 계층:: 
* Interpreter initialization and finalization:: 
* Thread states and the global interpreter lock:: 
* Asynchronous notifications:: 
* Operating system thread APIs:: 
* Synchronization primitives:: 
* Thread-local storage support:: 
* Multiple interpreters in a Python process:: 
* Profiling and tracing:: 
* Reference tracing:: 
* 파이썬 초기화 구성:: 
* 메모리 관리:: 
* 객체 구현 지원:: 
* API와 ABI 버전 붙이기:: 
* Monitoring C API:: 
* Generating Execution Events:: 

소개

* Language version compatibility:: 
* 코딩 표준:: 
* 인클루드 파일:: 
* 유용한 매크로들:: 
* 객체@comma{} 형 그리고 참조 횟수: 객체 형 그리고 참조 횟수. 
* 예외: 예외<18>. 
* 파이썬 임베딩하기:: 
* 디버깅 빌드:: 
* Recommended third party tools:: 

유용한 매크로들

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

General utility macros

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

객체, 형 그리고 참조 횟수

* 참조 횟수: 참조 횟수<2>. 
* 형:: 

참조 횟수

* 참조 횟수 상세:: 

C API Stability

* Unstable C API:: 
* 안정적인 응용 프로그램 바이너리 인터페이스:: 
* Platform Considerations:: 
* Contents of Limited API:: 

안정적인 응용 프로그램 바이너리 인터페이스

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

매우 고수준 계층

* Available start symbols:: 
* Stack Effects:: 

예외 처리

* 인쇄와 지우기:: 
* 예외 발생시키기:: 
* 경고 발행하기:: 
* 에러 표시기 조회하기:: 
* 시그널 처리하기: 시그널 처리하기<2>. 
* 예외 클래스: 예외 클래스<2>. 
* 예외 객체:: 
* 유니코드 예외 객체:: 
* 재귀 제어:: 
* Exception and warning types:: 
* Tracebacks:: 

Exception and warning types

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

Defining extension modules

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

유틸리티

* 운영 체제 유틸리티:: 
* 시스템 함수:: 
* 프로세스 제어:: 
* 모듈 임포트 하기: 모듈 임포트 하기<2>. 
* 데이터 마샬링 지원:: 
* 인자 구문 분석과 값 구축:: 
* 문자열 변환과 포매팅:: 
* Character classification and conversion:: 
* PyHash API:: 
* 리플렉션:: 
* 코덱 등록소와 지원 함수:: 
* PyTime C API:: 
* Support for Perf Maps:: 

인자 구문 분석과 값 구축

* 인자 구문 분석:: 
* 값 구축:: 

인자 구문 분석

* 문자열과 버퍼:: 
* 숫자: 숫자<2>. 
* 기타 객체:: 
* API 함수:: 

코덱 등록소와 지원 함수

* 코덱 조회 API:: 
* 유니코드 인코딩 에러 처리기용 등록소 API:: 
* Codec utility variables:: 

PyTime C API

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

추상 객체 계층

* 객체 프로토콜:: 
* 호출 프로토콜:: 
* 숫자 프로토콜:: 
* 시퀀스 프로토콜:: 
* 매핑 프로토콜:: 
* 이터레이터 프로토콜:: 
* 버퍼 프로토콜:: 

호출 프로토콜

* tp_call 프로토콜:: 
* 벡터콜(Vectorcall) 프로토콜: 벡터콜 Vectorcall 프로토콜. 
* 객체 호출 API:: 
* 호출 지원 API:: 

벡터콜(Vectorcall) 프로토콜

* 재귀 제어: 재귀 제어<2>. 
* 벡터콜 지원 API:: 

버퍼 프로토콜

* 버퍼 구조체:: 
* 버퍼 요청 유형:: 
* 복잡한 배열:: 
* 버퍼 관련 함수:: 

버퍼 요청 유형

* 요청 독립적 필드:: 
* readonly@comma{} format: readonly format. 
* shape@comma{} strides@comma{} suboffsets: shape strides suboffsets. 
* 연속성 요청:: 
* 복합 요청:: 

복잡한 배열

* NumPy-스타일; shape과 strides: NumPy-스타일 shape과 strides. 
* PIL-스타일; shape@comma{} strides 및 suboffsets: PIL-스타일 shape strides 및 suboffsets. 

구상 객체 계층

* 기본 객체:: 
* 숫자 객체:: 
* 시퀀스 객체:: 
* 컨테이너 객체:: 
* 함수 객체:: 
* 기타 객체: 기타 객체<2>. 
* C API for extension modules:: 

기본 객체

* 형 객체: 형 객체<2>. 
* None 객체:: 

형 객체

* 힙에 할당된 형 만들기:: 

숫자 객체

* 정수 객체:: 
* 불리언 객체:: 
* 부동 소수점 객체:: 
* 복소수 객체:: 

정수 객체

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

부동 소수점 객체

* Pack and Unpack functions:: 

Pack and Unpack functions

* Pack functions:: 
* Unpack functions:: 

복소수 객체

* C 구조체로서의 복소수:: 
* 파이썬 객체로서의 복소수:: 

시퀀스 객체

* 바이트열 객체: 바이트열 객체<2>. 
* 바이트 배열 객체: 바이트 배열 객체<2>. 
* 유니코드 객체와 코덱:: 
* 튜플 객체:: 
* 구조체 시퀀스 객체:: 
* 리스트 객체:: 

바이트 배열 객체

* 형 검사 매크로:: 
* 직접 API 함수:: 
* 매크로:: 

유니코드 객체와 코덱

* 유니코드 객체:: 
* 내장 코덱:: 
* 메서드와 슬롯 함수:: 
* PyUnicodeWriter:: 
* Deprecated API: Deprecated API<2>. 

유니코드 객체

* 유니코드 형:: 
* 유니코드 문자 속성:: 
* 유니코드 문자열 생성과 액세스:: 
* 로케일 인코딩:: 
* 파일 시스템 인코딩:: 
* wchar_t 지원:: 

내장 코덱

* 일반 코덱:: 
* UTF-8 코덱:: 
* UTF-32 코덱:: 
* UTF-16 코덱:: 
* UTF-7 코덱:: 
* 유니코드 이스케이프 코덱:: 
* 원시 유니코드 이스케이프 코덱:: 
* Latin-1 코덱:: 
* ASCII 코덱:: 
* 문자 맵 코덱:: 
* 윈도우 용 MBCS 코덱:: 

컨테이너 객체

* 딕셔너리 객체:: 
* 집합 객체:: 

딕셔너리 객체

* Dictionary View Objects:: 
* Ordered Dictionaries:: 

집합 객체

* Deprecated API: Deprecated API<3>. 

함수 객체

* 함수 객체: 함수 객체<2>. 
* 인스턴스 메서드 객체:: 
* 메서드 객체: 메서드 객체<2>. 
* 셀 객체:: 
* 코드 객체: 코드 객체<2>. 
* Code Object Flags:: 
* Extra information:: 

기타 객체

* 파일 객체:: 
* 모듈 객체:: 
* Module definitions:: 
* Creating extension modules dynamically:: 
* 지원 함수:: 
* 이터레이터 객체:: 
* 디스크립터 객체:: 
* 슬라이스 객체:: 
* MemoryView 객체:: 
* Pickle buffer objects:: 
* 약한 참조 객체: 약한 참조 객체<2>. 
* 캡슐:: 
* Frame Objects:: 
* 제너레이터 객체:: 
* 코루틴 객체:: 
* 컨텍스트 변수 객체:: 
* Objects for Type Hinting:: 

파일 객체

* Deprecated API: Deprecated API<4>. 

Module definitions

* Module slots:: 

지원 함수

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

이터레이터 객체

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

디스크립터 객체

* Built-in descriptors:: 

슬라이스 객체

* Ellipsis 객체: Ellipsis 객체<2>. 

Frame Objects

* Frame Locals Proxies:: 
* Legacy Local Variable APIs:: 
* Internal Frames:: 

제너레이터 객체

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

C API for extension modules

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

Interpreter initialization and finalization

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

Thread states and the global interpreter lock

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

Detaching the thread state from extension code

* APIs:: 

Synchronization primitives

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

Thread-local storage support

* Thread-specific storage API:: 
* Dynamic allocation:: 
* Methods:: 
* Legacy APIs:: 

Multiple interpreters in a Python process

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

파이썬 초기화 구성

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

PyInitConfig C API

* Example:: 
* Create Config:: 
* Error Handling:: 
* Get Options:: 
* Set Options:: 
* Module:: 
* Initialize Python:: 

PyConfig C API

* Example: Example<2>. 
* PyWideStringList:: 
* PyStatus:: 
* PyPreConfig:: 
* Preinitialize Python with PyPreConfig:: 
* PyConfig:: 
* PyConfig를 사용한 초기화:: 
* 격리된 구성:: 
* 파이썬 구성:: 
* Python Path Configuration:: 

메모리 관리

* 개요: 개요<4>. 
* Allocator Domains:: 
* 원시 메모리 인터페이스:: 
* 메모리 인터페이스:: 
* 객체 할당자:: 
* 기본 메모리 할당자:: 
* 메모리 할당자 사용자 정의:: 
* 파이썬 메모리 할당자의 디버그 훅:: 
* pymalloc 할당자:: 
* mimalloc 할당자:: 
* tracemalloc C API:: 
* 예: 예<18>. 

메모리 인터페이스

* Deprecated aliases: Deprecated aliases<2>. 

pymalloc 할당자

* pymalloc 아레나 할당자 사용자 정의:: 

객체 구현 지원

* 힙에 객체 할당하기:: 
* Object Life Cycle:: 
* 공통 객체 구조체:: 
* Type Object Structures:: 
* 순환 가비지 수집 지원:: 

힙에 객체 할당하기

* Deprecated aliases: Deprecated aliases<3>. 

Object Life Cycle

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

공통 객체 구조체

* 기본 객체 형과 매크로:: 
* 함수와 메서드 구현:: 
* 확장형의 어트리뷰트 액세스:: 

확장형의 어트리뷰트 액세스

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

Type Object Structures

* 간략 참조:: 
* PyTypeObject 정의:: 
* PyObject 슬롯:: 
* PyVarObject 슬롯:: 
* PyTypeObject 슬롯:: 
* Static Types:: 
* 힙 형:: 
* 숫자 객체 구조체:: 
* 매핑 객체 구조체:: 
* 시퀀스 객체 구조체:: 
* 버퍼 객체 구조체:: 
* 비동기 객체 구조체:: 
* 슬롯 형 typedef:: 
* 예: 예<19>. 

간략 참조

* “tp 슬롯”:: 
* 서브 슬롯:: 
* 슬롯 typedef:: 

순환 가비지 수집 지원

* 가비지 수거기 상태 제어하기:: 
* 가비지 수거기 상태 조회하기:: 

API와 ABI 버전 붙이기

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

Generating Execution Events

* Managing the Monitoring State:: 

파이썬 모듈 설치하기

* 핵심 용어:: 
* 기본 사용법: 기본 사용법<2>. 
* 어떻게 …?:: 
* 흔히 만나는 설치 문제:: 

어떻게 …?

* … 파이썬 3.4 이전 버전의 파이썬에서 pip 를 설치합니까?: … 파이썬 3 4 이전 버전의 파이썬에서 pip 를 설치합니까?. 
* … 현재 사용자만을 위해 패키지를 설치합니까?:: 
* … 과학 계산용 파이썬 패키지를 설치합니까?:: 
* … 병렬로 설치된 여러 버전의 파이썬으로 작업합니까?:: 

흔히 만나는 설치 문제

* 리눅스에 시스템 파이썬 설치하기:: 
* Pip가 설치되지 않았습니다.: Pip가 설치되지 않았습니다. 
* 바이너리 확장 설치하기:: 

파이썬 HOWTO

* A Conceptual Overview of asyncio:: 
* 확장 모듈을 파이썬 3에 이식하기:: 
* 파이썬 curses 프로그래밍:: 
* Descriptor Guide:: 
* Debugging C API extensions and CPython Internals with GDB:: 
* Enum HOWTO:: 
* 함수형 프로그래밍 HOWTO:: 
* 로깅 HOWTO:: 
* 로깅 요리책:: 
* 정규식 HOWTO:: 
* 소켓 프로그래밍 HOWTO:: 
* 정렬 기법:: 
* 유니코드 HOWTO:: 
* urllib 패키지를 사용하여 인터넷 리소스를 가져오는 방법:: 
* ipaddress 모듈에 대한 소개:: 
* DTrace와 SystemTap으로 CPython 계측하기:: 
* Python support for the Linux perf profiler:: 
* Annotations Best Practices:: 
* Isolating Extension Modules:: 
* timer file descriptor HOWTO:: 
* The Python 2.3 Method Resolution Order: The Python 2 3 Method Resolution Order. 
* Python support for free threading:: 
* C API Extension Support for Free Threading:: 
* Remote debugging attachment protocol:: 
* Permission requirements:: 
* Locating the PyRuntime structure:: 
* Reading _Py_DebugOffsets:: 
* Locating the interpreter and thread state:: 
* Writing control information:: 
* Summary:: 

A Conceptual Overview of asyncio

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

A conceptual overview part 1: the high-level

* Event Loop:: 
* Asynchronous functions and coroutines:: 
* Tasks:: 
* await:: 

A conceptual overview part 2: the nuts and bolts

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

파이썬 curses 프로그래밍

* curses란 무엇입니까?:: 
* curses 응용 프로그램 시작과 종료:: 
* 창과 패드:: 
* 텍스트 표시:: 
* 사용자 입력:: 
* 추가 정보:: 

curses란 무엇입니까?

* 파이썬 curses 모듈:: 

텍스트 표시

* 속성과 색상:: 

Descriptor Guide

* 입문:: 
* 완전한 실용적인 예:: 
* 기술적인 자습서:: 
* 순수한 파이썬 등가물:: 

입문

* 간단한 예; 상수를 반환하는 디스크립터: 간단한 예 상수를 반환하는 디스크립터. 
* 동적 조회:: 
* 관리되는 어트리뷰트:: 
* 사용자 정의 이름:: 
* 마무리 생각:: 

완전한 실용적인 예

* 유효성 검사기 클래스:: 
* 사용자 정의 유효성 검사기:: 
* 실용적인 응용:: 

기술적인 자습서

* 요약:: 
* 정의와 소개:: 
* 디스크립터 프로토콜:: 
* 디스크립터 호출의 개요:: 
* 인스턴스에서 호출:: 
* 클래스에서 호출:: 
* super에서 호출:: 
* 호출 로직 요약:: 
* 자동 이름 알림:: 
* ORM 예제:: 

순수한 파이썬 등가물

* 프로퍼티:: 
* 함수와 메서드:: 
* 메서드의 종류:: 
* 정적 메서드:: 
* 클래스 메서드:: 
* 멤버 객체와 __slots__:: 

Debugging C API extensions and CPython Internals with GDB

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

Prerequisites

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

Using the python-gdb extension

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

Enum HOWTO

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

Derived Enumerations

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

Finer Points

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

How are Enums and Flags different?

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

Enum Cookbook

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

Omitting values

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

함수형 프로그래밍 HOWTO

* 소개: 소개<8>. 
* 이터레이터: 이터레이터<2>. 
* 제너레이터 표현식과 리스트 컴프리헨션:: 
* 제너레이터: 제너레이터<2>. 
* 내장 함수: 내장 함수<2>. 
* itertools 모듈:: 
* functools 모듈:: 
* 작은 함수와 람다 표현식:: 
* 개정내역 및 감사의 글:: 
* 참고 문헌:: 

소개

* 형식적 증명 가능성:: 
* 모듈성:: 
* 디버깅과 테스트 용이성:: 
* 결합성:: 

이터레이터

* 이터레이터를 지원하는 데이터형:: 

제너레이터

* 제너레이터에 값 전달하기:: 

itertools 모듈

* 새로운 이터레이터 만들기:: 
* 요소에 대한 함수 호출:: 
* 요소 선택하기:: 
* 조합 함수:: 
* 요소 분류:: 

functools 모듈

* operator 모듈:: 

참고 문헌

* 일반:: 
* 파이썬 특정:: 
* 파이썬 설명서:: 

로깅 HOWTO

* 기초 로깅 자습서:: 
* 고급 로깅 자습서:: 
* 로깅 수준: 로깅 수준<2>. 
* 유용한 처리기:: 
* 로깅 중에 발생하는 예외:: 
* 임의의 객체를 메시지로 사용하기:: 
* 최적화: 최적화<6>. 
* 기타 자료:: 

기초 로깅 자습서

* 로깅을 사용할 때:: 
* 간단한 예: 간단한 예<2>. 
* 파일에 로깅 하기:: 
* 변수 데이터 로깅:: 
* 표시된 메시지의 포맷 변경:: 
* 메시지에 날짜/시간 표시:: 
* 다음 단계:: 

고급 로깅 자습서

* 로깅 흐름:: 
* 로거:: 
* 처리기:: 
* 포매터:: 
* 로깅 구성:: 
* 구성이 제공되지 않으면 어떻게 되는가:: 
* 라이브러리 로깅 구성:: 

로깅 수준

* 사용자 정의 수준:: 

로깅 요리책

* 여러 모듈에서 로깅 사용하기:: 
* 여러 스레드에서 로깅 하기:: 
* 다중 처리기 및 포매터:: 
* 여러 대상으로 로깅 하기:: 
* Custom handling of levels:: 
* 구성 서버 예제:: 
* 블록 하는 처리기 다루기:: 
* 네트워크에서 로깅 이벤트 보내고 받기:: 
* 로그 출력에 문맥 정보 추가:: 
* Use of contextvars:: 
* Imparting contextual information in handlers:: 
* 여러 프로세스에서 단일 파일에 로깅 하기:: 
* 파일 회전 사용하기:: 
* 대체 포매팅 스타일 사용하기:: 
* 사용자 정의 LogRecord:: 
* Subclassing QueueHandler and QueueListener- a ZeroMQ example:: 
* Subclassing QueueHandler and QueueListener- a pynng example:: 
* 딕셔너리 기반 구성의 예:: 
* rotator와 namer를 사용해서 로그 회전 처리하기:: 
* 좀 더 정교한 multiprocessing 예제:: 
* SysLogHandler로 전송된 메시지에 BOM 삽입하기:: 
* 구조적 로깅 구현:: 
* dictConfig()로 처리기를 사용자 정의하기: dictConfig 로 처리기를 사용자 정의하기. 
* 응용 프로그램 전체에서 특정 포맷 스타일 사용하기:: 
* dictConfig()로 필터 구성하기: dictConfig 로 필터 구성하기. 
* 사용자 정의된 예외 포매팅:: 
* 로깅 메시지 말하기:: 
* 로깅 메시지를 버퍼링하고 조건부 출력하기:: 
* Sending logging messages to email@comma{} with buffering: Sending logging messages to email with buffering. 
* 구성을 통해 UTC(GMT)로 시간을 포맷하기: 구성을 통해 UTC GMT 로 시간을 포맷하기. 
* 선택적 로깅을 위해 컨텍스트 관리자 사용하기:: 
* CLI 응용 프로그램 시작 템플릿:: 
* 로깅을 위한 Qt GUI:: 
* Logging to syslog with RFC5424 support:: 
* How to treat a logger like an output stream:: 
* How to uniformly handle newlines in logging output:: 
* Patterns to avoid:: 
* Other resources:: 

네트워크에서 로깅 이벤트 보내고 받기

* Running a logging socket listener in production:: 

로그 출력에 문맥 정보 추가

* 문맥 정보 전달에 LoggerAdapters 사용하기:: 
* 문맥 정보 전달에 필터 사용하기:: 

문맥 정보 전달에 LoggerAdapters 사용하기

* 딕셔너리 이외의 객체를 사용하여 문맥 정보 전달하기:: 

여러 프로세스에서 단일 파일에 로깅 하기

* concurrent.futures.ProcessPoolExecutor 사용하기: concurrent futures ProcessPoolExecutor 사용하기. 
* Deploying web applications using Gunicorn and uWSGI:: 

Subclassing QueueHandler and QueueListener- a ZeroMQ example

* Subclass QueueHandler:: 
* Subclass QueueListener:: 

Subclassing QueueHandler and QueueListener- a pynng example

* Subclass QueueListener: Subclass QueueListener<2>. 
* Subclass QueueHandler: Subclass QueueHandler<2>. 

응용 프로그램 전체에서 특정 포맷 스타일 사용하기

* LogRecord 팩토리 사용:: 
* 사용자 정의 메시지 객체 사용:: 

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:: 

정규식 HOWTO

* 소개: 소개<9>. 
* 단순한 패턴:: 
* 정규식 사용하기:: 
* 더 많은 패턴 기능:: 
* 문자열 수정하기:: 
* 일반적인 문제들:: 
* 피드백:: 

단순한 패턴

* 문자 일치:: 
* 반복하기:: 

정규식 사용하기

* 정규식 컴파일하기:: 
* 백 슬래시 전염병:: 
* 일치 수행하기:: 
* 모듈 수준 함수: 모듈 수준 함수<3>. 
* 컴파일 플래그:: 

더 많은 패턴 기능

* 메타 문자 더 보기:: 
* 그룹:: 
* 비 포착 그룹과 이름 있는 그룹:: 
* 미리 보기 어서션:: 

문자열 수정하기

* 문자열 분할하기:: 
* 검색과 치환: 검색과 치환<2>. 

일반적인 문제들

* 문자열 메서드를 사용하십시오:: 
* match()와 search() 비교: match 와 search 비교. 
* 탐욕적 과 비 탐욕적 비교:: 
* re.VERBOSE 사용하기: re VERBOSE 사용하기. 

소켓 프로그래밍 HOWTO

* 소켓:: 
* 소켓 만들기: 소켓 만들기<2>. 
* 소켓 사용하기:: 
* 연결 끊기:: 
* 비 블로킹 소켓:: 

소켓

* 역사:: 

소켓 만들기

* IPC:: 

소켓 사용하기

* 바이너리 데이터:: 

연결 끊기

* 소켓이 죽을 때:: 

정렬 기법

* 정렬 기초:: 
* 키 함수:: 
* operator 모듈 함수와 부분 함수 평가:: 
* 오름차순과 내림차순:: 
* 정렬 안정성과 복잡한 정렬:: 
* 장식-정렬-복원:: 
* 비교 함수:: 
* Strategies For Unorderable Types and Values:: 
* 잡동사니: 잡동사니<4>. 
* Partial Sorts:: 

유니코드 HOWTO

* 유니코드 소개:: 
* 파이썬의 유니코드 지원:: 
* 유니코드 데이터 읽고 쓰기:: 
* 감사 인사:: 

유니코드 소개

* 정의:: 
* 인코딩:: 
* 참조:: 

파이썬의 유니코드 지원

* 문자열 형:: 
* 바이트열로 변환:: 
* 파이썬 소스 코드에서 유니코드 리터럴:: 
* 유니코드 속성:: 
* 문자열 비교:: 
* 유니코드 정규식:: 
* 참조: 참조<2>. 

유니코드 데이터 읽고 쓰기

* 유니코드 파일 이름:: 
* 유니코드 인식 프로그램 작성 팁:: 
* 참조: 참조<3>. 

유니코드 인식 프로그램 작성 팁

* 파일 인코딩끼리 변환:: 
* 알 수 없는 인코딩의 파일:: 

urllib 패키지를 사용하여 인터넷 리소스를 가져오는 방법

* 소개: 소개<10>. 
* URL을 가져오기:: 
* 예외 처리: 예외 처리<2>. 
* info와 geturl:: 
* 오프너와 처리기:: 
* 기본 인증:: 
* 프락시:: 
* 소켓과 계층:: 
* 각주:: 

URL을 가져오기

* 데이터:: 
* 헤더:: 

예외 처리

* URLError:: 
* HTTPError:: 
* 마무리:: 

HTTPError

* 에러 코드:: 

마무리

* 1번:: 
* 2번:: 

ipaddress 모듈에 대한 소개

* 주소/네트워크/인터페이스 객체 만들기:: 
* 주소/네트워크/인터페이스 객체 검사:: 
* 주소 리스트로서의 네트워크:: 
* 비교: 비교<3>. 
* 다른 모듈과 함께 IP 주소 사용하기:: 
* 인스턴스 생성 실패 시 세부 사항 가져오기:: 

주소/네트워크/인터페이스 객체 만들기

* IP 버전에 대한 참고 사항:: 
* IP 호스트 주소:: 
* 네트워크 정의:: 
* 호스트 인터페이스:: 

DTrace와 SystemTap으로 CPython 계측하기

* 정적 마커 활성화하기:: 
* 정적 DTrace 프로브:: 
* 정적 SystemTap 마커:: 
* 사용 가능한 정적 마커:: 
* SystemTap 탭셋:: 
* 예제: 예제<34>. 

사용 가능한 정적 마커

* C Entry Points:: 
* C Probing Checks:: 

Python support for the Linux perf profiler

* How to enable perf profiling support:: 
* How to obtain the best results:: 
* How to work without frame pointers:: 

Annotations Best Practices

* Accessing The Annotations Dict Of An Object In Python 3.10 And Newer: Accessing The Annotations Dict Of An Object In Python 3 10 And Newer. 
* Accessing The Annotations Dict Of An Object In Python 3.9 And Older: Accessing The Annotations Dict Of An Object In Python 3 9 And Older. 
* Manually Un-Stringizing Stringized Annotations:: 
* Best Practices For __annotations__ In Any Python Version:: 
* __annotations__ Quirks:: 

Isolating Extension Modules

* Who should read this:: 
* Background:: 
* Making Modules Safe with Multiple Interpreters:: 
* Heap Types:: 
* Open Issues:: 

Background

* Enter Per-Module State:: 
* Isolated Module Objects:: 
* Surprising Edge Cases:: 

Making Modules Safe with Multiple Interpreters

* Managing Global State:: 
* Managing Per-Module State:: 
* Opt-Out; Limiting to One Module Object per Process: Opt-Out Limiting to One Module Object per Process. 
* Module State Access from Functions:: 

Heap Types

* Changing Static Types to Heap Types:: 
* Defining Heap Types:: 
* Garbage-Collection Protocol:: 
* Module State Access from Classes:: 
* Module State Access from Regular Methods:: 
* Module State Access from Slot Methods@comma{} Getters and Setters: Module State Access from Slot Methods Getters and Setters. 
* Lifetime of the Module State:: 

Garbage-Collection Protocol

* tp_traverse in Python 3.8 and lower: tp_traverse in Python 3 8 and lower. 
* Delegating tp_traverse:: 
* Defining tp_dealloc:: 
* Not overriding tp_free:: 
* Avoiding PyObject_New:: 

Open Issues

* Per-Class Scope:: 
* Lossless Conversion to Heap Types:: 

timer file descriptor HOWTO

* Examples: Examples<3>. 

The Python 2.3 Method Resolution Order

* The beginning:: 
* The C3 Method Resolution Order:: 
* Examples: Examples<4>. 
* Bad Method Resolution Orders:: 
* The end:: 
* Resources:: 

Python support for free threading

* Installation: Installation<2>. 
* Identifying free-threaded Python:: 
* The global interpreter lock in free-threaded Python:: 
* Thread safety:: 
* Known limitations:: 
* Behavioral changes:: 

Known limitations

* Immortalization:: 
* Frame objects:: 
* Iterators:: 
* Single-threaded performance:: 

Behavioral changes

* Context variables:: 
* Warning filters:: 

C API Extension Support for Free Threading

* Identifying the Free-Threaded Build in C:: 
* Module Initialization:: 
* General API Guidelines:: 
* Borrowed References:: 
* Memory Allocation APIs:: 
* Thread State and GIL APIs:: 
* Protecting Internal Extension State:: 
* Critical Sections:: 
* Building Extensions for the Free-Threaded Build:: 

Module Initialization

* Multi-Phase Initialization:: 
* Single-Phase Initialization:: 

General API Guidelines

* Container Thread Safety:: 

Container Thread Safety

* PyDict_Next:: 

Critical Sections

* What Are Critical Sections?:: 
* Using Critical Sections:: 
* How Critical Sections Work:: 
* Deadlock Avoidance:: 
* Important Considerations:: 

Building Extensions for the Free-Threaded Build

* Limited C API and Stable ABI:: 
* Windows: Windows<84>. 

Remote debugging attachment protocol

* Disabling remote debugging:: 

파이썬 자주 나오는 질문들

* 일반적인 파이썬 FAQ:: 
* 프로그래밍 FAQ:: 
* 설계와 역사 FAQ:: 
* 라이브러리와 확장 FAQ:: 
* 확장/내장 FAQ:: 
* 윈도우 파이썬 FAQ:: 
* 그래픽 사용자 인터페이스 FAQ:: 
* “왜 내 컴퓨터에 파이썬이 설치되어 있습니까?” FAQ:: 

일반적인 파이썬 FAQ

* 일반적인 정보:: 
* 현실 속의 파이썬:: 

일반적인 정보

* 파이썬이 무엇입니까?:: 
* 파이썬 소프트웨어 재단이 무엇입니까?:: 
* 파이썬을 사용할 때 저작권 관련 제한이 있습니까?:: 
* 파이썬은 애초에 왜 만들어졌습니까?:: 
* 파이썬의 강점은 무엇입니까?:: 
* 파이썬 버전 관리 규칙은 무엇입니까?:: 
* 파이썬 소스를 어떻게 얻을 수 있습니까?:: 
* 파이썬 설명 문서는 어떻게 구합니까?:: 
* 저는 프로그래밍을 해본 적이 없습니다. 파이썬 튜토리얼이 있습니까?: 저는 프로그래밍을 해본 적이 없습니다 파이썬 튜토리얼이 있습니까?. 
* 파이썬에 특화된 뉴스 그룹이나 메일링 리스트가 있습니까?:: 
* 파이썬 베타 테스트 버전은 어떻게 구합니까?:: 
* 파이썬 버그 리포트나 패치는 어떻게 제출합니까?:: 
* 제가 참고할만한 파이썬 관련 기사가 있습니까?:: 
* 파이썬 관련 책이 있습니까?:: 
* 도대체 www.python.org는 어디에 있는 겁니까?: 도대체 www python org는 어디에 있는 겁니까?. 
* 왜 이 언어는 파이썬이라 불립니까?:: 
* “몬티 파이튼의 플라잉 서커스”를 좋아해야합니까?:: 

현실 속의 파이썬

* 파이썬은 어느 정도 안정화 되어있습니까?:: 
* 얼마나 많은 사람이 파이썬을 씁니까?:: 
* 파이썬으로 진행된 중요한 프로젝트가 존재합니까?:: 
* 파이썬에 어떤 새로운 개발요소들이 예정되어 있습니까?:: 
* 기존의 파이썬과 호환 가능하지 않은 변경안을 제시해도 괜찮습니까?:: 
* 파이썬이 초보 프로그래머들에게 좋은 언어입니까?:: 

프로그래밍 FAQ

* General questions:: 
* Core language:: 
* 숫자와 문자열:: 
* 성능: 성능<3>. 
* Sequences (tuples/lists): Sequences tuples/lists. 
* 객체:: 
* 모듈: 모듈<3>. 

General questions

* Is there a source code-level debugger with breakpoints and single-stepping?:: 
* 버그를 찾거나 정적 분석을 수행하는 데 도움이 되는 도구가 있습니까?:: 
* 파이썬 스크립트로 독립 실행형 바이너리를 만들려면 어떻게 해야 합니까?:: 
* 파이썬 프로그램을 위한 코딩 표준이나 스타일 지침서가 있습니까?:: 

Core language

* 변수에 값이 있을 때 UnboundLocalError 가 발생하는 이유는 무엇입니까?:: 
* 파이썬에서 지역과 전역 변수에 대한 규칙은 무엇입니까?:: 
* 다른 값으로 루프에서 정의된 람다는 왜 모두 같은 결과를 반환합니까?:: 
* 모듈 간에 전역 변수를 공유하려면 어떻게 해야 합니까?:: 
* 모듈에서 임포트를 사용하는 “모범 사례”는 무엇입니까?:: 
* 객체 간에 기본값이 공유되는 이유는 무엇입니까?:: 
* 한 함수에서 다른 함수로 선택적이나 키워드 매개변수를 전달하려면 어떻게 해야 합니까?:: 
* 인자와 매개변수의 차이점은 무엇입니까?:: 
* 리스트 ‘y’를 변경할 때 리스트 ‘x’도 변경되는 이유는 무엇입니까?:: 
* 출력 매개변수가 있는 함수를 작성하려면 어떻게 해야 합니까 (참조에 의한 호출)?: 출력 매개변수가 있는 함수를 작성하려면 어떻게 해야 합니까 참조에 의한 호출 ?. 
* 파이썬에서 고차 함수(higher order function)를 어떻게 만드나요?: 파이썬에서 고차 함수 higher order function 를 어떻게 만드나요?. 
* 파이썬에서 객체를 어떻게 복사합니까?:: 
* 객체의 메서드나 어트리뷰트를 어떻게 찾을 수 있습니까?:: 
* 코드에서 객체 이름을 어떻게 찾을 수 있습니까?:: 
* 쉼표 연산자의 우선순위는 어떻게 되나요?:: 
* C의 “?;” 삼항 연산자와 동등한 것이 있습니까?: C의 “? ” 삼항 연산자와 동등한 것이 있습니까?. 
* 파이썬에서 난독화된 한 줄 코드를 작성할 수 있습니까?:: 
* 함수의 매개변수 목록에서 슬래시(/)는 무엇을 의미합니까?: 함수의 매개변수 목록에서 슬래시 / 는 무엇을 의미합니까?. 

숫자와 문자열

* 16진수와 8진수 정수는 어떻게 지정합니까?:: 
* 왜 -22 // 10 이 -3을 반환합니까?:: 
* How do I get int literal attribute instead of SyntaxError?:: 
* 문자열을 숫자로 어떻게 변환합니까?:: 
* 숫자를 문자열로 어떻게 변환합니까?:: 
* 제자리에서 문자열을 어떻게 수정합니까?:: 
* 문자열을 사용하여 어떻게 함수/메서드를 호출합니까?:: 
* Is there an equivalent to Perl’s chomp() for removing trailing newlines from strings?: Is there an equivalent to Perl’s chomp for removing trailing newlines from strings?. 
* Is there a scanf() or sscanf() equivalent?: Is there a scanf or sscanf equivalent?. 
* What does UnicodeDecodeError or UnicodeEncodeError error mean?:: 
* Can I end a raw string with an odd number of backslashes?:: 

성능

* 내 프로그램이 너무 느립니다. 속도를 높이려면 어떻게 해야 합니까?: 내 프로그램이 너무 느립니다 속도를 높이려면 어떻게 해야 합니까?. 
* 많은 문자열을 함께 이어붙이는 가장 효율적인 방법은 무엇입니까?:: 

Sequences (tuples/lists)

* 튜플과 리스트를 어떻게 변환합니까?:: 
* 음수 인덱스는 무엇입니까?:: 
* 시퀀스를 역순으로 이터레이트 하려면 어떻게 합니까?:: 
* 리스트에서 중복을 어떻게 제거합니까?:: 
* How do you remove multiple items from a list?:: 
* 파이썬에서 어떻게 배열을 만드나요?:: 
* 다차원 리스트를 어떻게 만듭니까?:: 
* How do I apply a method or function to a sequence of objects?:: 
* 덧셈은 작동하는데@comma{} 왜 a_tuple[i] += [‘item’]이 예외를 일으킵니까?: 덧셈은 작동하는데 왜 a_tuple[i] += [‘item’]이 예외를 일으킵니까?. 
* 복잡한 정렬을 하고 싶습니다; 파이썬에서 Schwartzian 변환을 할 수 있습니까?: 복잡한 정렬을 하고 싶습니다 파이썬에서 Schwartzian 변환을 할 수 있습니까?. 
* 한 리스트를 다른 리스트의 값으로 정렬하려면 어떻게 해야 합니까?:: 

객체

* 클래스는 무엇입니까?:: 
* 메서드는 무엇입니까?:: 
* self는 무엇입니까?:: 
* 객체가 주어진 클래스나 그 서브 클래스의 인스턴스인지 어떻게 확인합니까?:: 
* 위임이란 무엇입니까?:: 
* How do I call a method defined in a base class from a derived class that extends it?:: 
* 베이스 클래스를 쉽게 변경할 수 있도록 코드를 구성하려면 어떻게 해야 합니까?:: 
* 정적 클래스 데이터와 정적 클래스 메서드를 만들려면 어떻게 해야 합니까?:: 
* 파이썬에서 생성자(또는 메서드)를 어떻게 재정의할 수 있습니까?: 파이썬에서 생성자 또는 메서드 를 어떻게 재정의할 수 있습니까?. 
* __spam을 사용하려고 하는데 _SomeClassName__spam에 대한 에러가 발생합니다.: __spam을 사용하려고 하는데 _SomeClassName__spam에 대한 에러가 발생합니다. 
* 내 클래스는 __del__을 정의하지만 객체를 삭제할 때 호출되지 않습니다.: 내 클래스는 __del__을 정의하지만 객체를 삭제할 때 호출되지 않습니다. 
* 주어진 클래스의 모든 인스턴스 목록을 어떻게 얻습니까?:: 
* id()의 결과가 고유하지 않은 것처럼 보이는 이유는 무엇입니까?: id 의 결과가 고유하지 않은 것처럼 보이는 이유는 무엇입니까?. 
* is 연산자를 사용한 아이덴티티 검사는 언제 신뢰할 수 있습니까?:: 
* How can a subclass control what data is stored in an immutable instance?:: 
* How do I cache method calls?:: 

모듈

* .pyc 파일을 어떻게 만듭니까?: pyc 파일을 어떻게 만듭니까?. 
* 현재 모듈 이름을 어떻게 찾습니까?:: 
* 서로 임포트 하는 모듈을 어떻게 만들 수 있습니까?:: 
* __import__(‘x.y.z’)는 <module ‘x’>를 반환합니다; z를 어떻게 얻습니까?: __import__ ‘x y z’ 는 <module ‘x’>를 반환합니다; z를 어떻게 얻습니까?. 
* 임포트 된 모듈을 편집하고 다시 임포트 할 때@comma{} 변경 사항이 표시되지 않습니다. 왜 이런 일이 발생합니까?: 임포트 된 모듈을 편집하고 다시 임포트 할 때 변경 사항이 표시되지 않습니다 왜 이런 일이 발생합니까?. 

설계와 역사 FAQ

* 파이썬은 왜 문장의 그룹화에 들여쓰기를 사용합니까?:: 
* 간단한 산술 연산으로 이상한 결과가 나오는 이유는 무엇입니까?:: 
* 부동 소수점 계산이 왜 그렇게 부정확합니까?:: 
* 파이썬 문자열이 불변인 이유는 무엇입니까?:: 
* 메서드 정의와 호출에서 ‘self’를 명시적으로 사용해야 하는 이유는 무엇입니까?:: 
* 표현식에서 대입을 사용할 수 없는 이유는 무엇입니까?:: 
* 파이썬은 왜 일부 기능(예를 들어 list.index())에는 메서드를 사용하고 다른 기능(예를 들어 len(list))에는 함수를 사용합니까?: 파이썬은 왜 일부 기능 예를 들어 list index 에는 메서드를 사용하고 다른 기능 예를 들어 len list 에는 함수를 사용합니까?. 
* join()이 리스트나 튜플 메서드가 아니라 문자열 메서드인 이유는 무엇입니까?: join 이 리스트나 튜플 메서드가 아니라 문자열 메서드인 이유는 무엇입니까?. 
* 예외는 얼마나 빠릅니까?:: 
* 파이썬에 switch 나 case 문이 없는 이유는 무엇입니까?:: 
* OS별 스레드 구현에 의존하는 대신 인터프리터에서 스레드를 에뮬레이션할 수 없습니까?:: 
* 람다 표현식이 문장을 포함할 수 없는 이유는 무엇입니까?:: 
* 파이썬을 기계 코드@comma{} C 또는 다른 언어로 컴파일 할 수 있습니까?: 파이썬을 기계 코드 C 또는 다른 언어로 컴파일 할 수 있습니까?. 
* 파이썬은 메모리를 어떻게 관리합니까?:: 
* CPython이 더 전통적인 가비지 수거 체계를 사용하지 않는 이유는 무엇입니까?:: 
* CPython이 종료될 때 모든 메모리가 해제되지 않는 이유는 무엇입니까?:: 
* 별도의 튜플과 리스트 데이터형이 있는 이유는 무엇입니까?:: 
* CPython에서 리스트는 어떻게 구현됩니까?:: 
* CPython에서 딕셔너리는 어떻게 구현됩니까?:: 
* 딕셔너리 키가 불변이어야 하는 이유는 무엇입니까?:: 
* list.sort()가 정렬된 리스트를 반환하지 않는 이유는 무엇입니까?: list sort 가 정렬된 리스트를 반환하지 않는 이유는 무엇입니까?. 
* 파이썬에서 인터페이스 명세를 어떻게 지정하고 강제합니까?:: 
* goto가 없는 이유는 무엇입니까?:: 
* 날 문자열(r-strings)이 역 슬래시로 끝날 수 없는 이유는 무엇입니까?: 날 문자열 r-strings 이 역 슬래시로 끝날 수 없는 이유는 무엇입니까?. 
* 왜 파이썬에는 어트리뷰트 대입을 위한 “with” 문이 없습니까?:: 
* Why don’t generators support the with statement?:: 
* if/while/def/class 문에 콜론이 필요한 이유는 무엇입니까?:: 
* 파이썬은 왜 리스트와 튜플 끝에 쉼표를 허용합니까?:: 

라이브러리와 확장 FAQ

* 일반 라이브러리 관련 질문:: 
* 일반적인 작업:: 
* 스레드:: 
* 입력과 출력: 입력과 출력<2>. 
* 네트워크/인터넷 프로그래밍:: 
* 데이터베이스:: 
* 수학과 숫자:: 

일반 라이브러리 관련 질문

* 작업 X를 수행할 모듈이나 응용 프로그램을 어떻게 찾습니까?:: 
* math.py (socket.py@comma{} regex.py 등) 소스 파일은 어디에 있습니까?: math py socket py regex py 등 소스 파일은 어디에 있습니까?. 
* 유닉스에서 파이썬 스크립트를 실행 파일로 만들려면 어떻게 해야 합니까?:: 
* 파이썬 용 curses/termcap 패키지가 있습니까?:: 
* 파이썬에 C의 onexit()와 동등한 것이 있습니까?: 파이썬에 C의 onexit 와 동등한 것이 있습니까?. 
* 시그널 처리기가 작동하지 않는 이유는 무엇입니까?:: 

일반적인 작업

* 파이썬 프로그램이나 컴포넌트를 어떻게 테스트합니까?:: 
* 독스트링으로 설명서를 어떻게 만듭니까?:: 
* 한 번에 하나의 키 입력을 받는 방법은 무엇입니까?:: 

스레드

* 스레드를 사용하여 어떻게 프로그래밍합니까?:: 
* 제 스레드가 아무것도 실행되지 않는 것 같습니다; 왜 그런가요?: 제 스레드가 아무것도 실행되지 않는 것 같습니다 왜 그런가요?. 
* 여러 작업자 스레드 간에 작업을 어떻게 배달합니까?:: 
* 어떤 종류의 전역 값 변경이 스레드 안전합니까?:: 
* 전역 인터프리터 록을 제거할 수 없습니까?:: 

입력과 출력

* 파일을 어떻게 삭제합니까? (그리고 다른 파일 질문들…): 파일을 어떻게 삭제합니까? 그리고 다른 파일 질문들…. 
* 파일을 어떻게 복사합니까?:: 
* 바이너리 데이터를 읽는 (또는 쓰는) 방법은 무엇입니까?: 바이너리 데이터를 읽는 또는 쓰는 방법은 무엇입니까?. 
* os.popen()으로 만든 파이프에서 os.read()를 사용할 수 없는 것처럼 보입니다; 왜입니까?: os popen 으로 만든 파이프에서 os read 를 사용할 수 없는 것처럼 보입니다; 왜입니까?. 
* 직렬 (RS232) 포트에 어떻게 액세스합니까?: 직렬 RS232 포트에 어떻게 액세스합니까?. 
* 왜 sys.stdout(stdin@comma{} stderr)을 닫아도 닫히지 않습니까?: 왜 sys stdout stdin stderr 을 닫아도 닫히지 않습니까?. 

네트워크/인터넷 프로그래밍

* 파이썬에는 어떤 WWW 도구가 있습니까?:: 
* HTML 생성을 위해 어떤 모듈을 사용해야 합니까?:: 
* 파이썬 스크립트에서 메일을 보내려면 어떻게 해야 합니까?:: 
* 소켓의 connect() 메서드에서 블로킹을 피하려면 어떻게 해야 합니까?: 소켓의 connect 메서드에서 블로킹을 피하려면 어떻게 해야 합니까?. 

데이터베이스

* 파이썬에 데이터베이스 패키지에 대한 인터페이스가 있습니까?:: 
* 파이썬에서 영속 객체를 어떻게 구현합니까?:: 

수학과 숫자

* 파이썬에서 난수를 어떻게 생성합니까?:: 

확장/내장 FAQ

* C로 나만의 함수를 만들 수 있습니까?:: 
* C++로 나만의 함수를 만들 수 있습니까?:: 
* C를 쓰는 것은 어렵습니다; 대안이 있습니까?:: 
* C에서 임의의 파이썬 문장을 어떻게 실행할 수 있습니까?:: 
* C에서 임의의 파이썬 표현식을 어떻게 평가할 수 있습니까?:: 
* 파이썬 객체에서 C값을 어떻게 추출합니까?:: 
* Py_BuildValue()를 사용하여 임의 길이의 튜플을 만드는 방법은 무엇입니까?: Py_BuildValue 를 사용하여 임의 길이의 튜플을 만드는 방법은 무엇입니까?. 
* C에서 객체의 메서드를 어떻게 호출합니까?:: 
* PyErr_Print()의 출력(또는 stdout/stderr로 인쇄되는 모든 것)을 어떻게 잡습니까?: PyErr_Print 의 출력 또는 stdout/stderr로 인쇄되는 모든 것 을 어떻게 잡습니까?. 
* C에서 파이썬으로 작성된 모듈에 어떻게 액세스합니까?:: 
* 파이썬에서 C++ 객체에 어떻게 인터페이스 합니까?:: 
* Setup 파일을 사용하여 모듈을 추가했는데 make가 실패합니다; 왜 그렇습니까?:: 
* 확장을 어떻게 디버깅합니까?:: 
* 리눅스 시스템에서 파이썬 모듈을 컴파일하고 싶지만@comma{} 일부 파일이 없습니다. 왜 그렇습니까?: 리눅스 시스템에서 파이썬 모듈을 컴파일하고 싶지만 일부 파일이 없습니다 왜 그렇습니까?. 
* “잘못된 입력”과 “불완전한 입력”을 어떻게 구별할 수 있습니까?:: 
* 정의되지 않은 g++ 기호 __builtin_new나 __pure_virtual을 어떻게 찾을 수 있습니까?:: 
* 일부 메서드는 C로 구현되고 그 밖의 것은 파이썬으로 구현된 (예를 들어 상속을 통해) 객체 클래스를 만들 수 있습니까?: 일부 메서드는 C로 구현되고 그 밖의 것은 파이썬으로 구현된 예를 들어 상속을 통해 객체 클래스를 만들 수 있습니까?. 

윈도우 파이썬 FAQ

* 윈도우에서 파이썬 프로그램을 실행하려면 어떻게 해야 합니까?:: 
* 파이썬 스크립트 실행 파일로 만들려면 어떻게 해야 합니까?:: 
* 왜 때때로 파이썬은 시작하는 데 시간이 오래 걸립니까?:: 
* 파이썬 스크립트에서 실행 파일을 만드는 방법은 무엇입니까?:: 
* *.pyd 파일은 DLL과 동일합니까?: * pyd 파일은 DLL과 동일합니까?. 
* 윈도우 응용프로그램에 파이썬을 포함하려면 어떻게 해야 합니까?:: 
* 편집기가 내 파이썬 소스에 탭을 삽입하지 않도록 하려면 어떻게 해야 합니까?:: 
* 블로킹 없이 키 입력을 확인하려면 어떻게 해야 합니까?:: 
* 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?. 

그래픽 사용자 인터페이스 FAQ

* 일반적인 GUI 질문:: 
* 파이썬에 어떤 GUI 툴킷이 있습니까?:: 
* Tkinter 질문:: 

Tkinter 질문

* Tkinter 응용 프로그램을 어떻게 고정(freeze)합니까?: Tkinter 응용 프로그램을 어떻게 고정 freeze 합니까?. 
* I/O를 기다리는 동안 Tk 이벤트를 처리하도록 할 수 있습니까?:: 
* Tkinter에서 키 바인딩이 동작하지 않습니다; 이유가 무엇입니까?: Tkinter에서 키 바인딩이 동작하지 않습니다 이유가 무엇입니까?. 

“왜 내 컴퓨터에 파이썬이 설치되어 있습니까?” FAQ

* 파이썬이 무엇입니까?: 파이썬이 무엇입니까?<2>. 
* 내 컴퓨터에 파이썬이 설치된 이유는 무엇입니까?:: 
* 파이썬을 삭제할 수 있습니까?:: 

Deprecations

* Pending removal in Python 3.15: Pending removal in Python 3 15<5>. 
* Pending removal in Python 3.16: Pending removal in Python 3 16<5>. 
* Pending removal in Python 3.17: Pending removal in Python 3 17<3>. 
* Pending removal in Python 3.18: Pending removal in Python 3 18<3>. 
* Pending removal in Python 3.19: Pending removal in Python 3 19<3>. 
* Pending removal in future versions: Pending removal in future versions<5>. 
* C API deprecations:: 

C API deprecations

* Pending removal in Python 3.15: Pending removal in Python 3 15<6>. 
* Pending removal in Python 3.18: Pending removal in Python 3 18<4>. 
* Pending removal in future versions: Pending removal in future versions<6>. 

이 설명서에 관하여

* 파이썬 설명서의 공헌자들:: 

버그 다루기

* 설명서 버그:: 
* 파이썬 문제 추적기 사용하기:: 
* 파이썬에 직접 이바지하기 입문:: 

역사와 라이센스

* 소프트웨어의 역사:: 
* 파이썬에 액세스하거나 사용하기 위한 이용 약관:: 
* 포함된 소프트웨어에 대한 라이센스 및 승인:: 

파이썬에 액세스하거나 사용하기 위한 이용 약관

* PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2:: 
* BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0: BEOPEN COM LICENSE AGREEMENT FOR PYTHON 2 0. 
* CNRI LICENSE AGREEMENT FOR PYTHON 1.6.1: CNRI LICENSE AGREEMENT FOR PYTHON 1 6 1. 
* CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2: CWI LICENSE AGREEMENT FOR PYTHON 0 9 0 THROUGH 1 2. 
* ZERO-CLAUSE BSD LICENSE FOR CODE IN THE PYTHON DOCUMENTATION:: 

포함된 소프트웨어에 대한 라이센스 및 승인

* 메르센 트위스터:: 
* 소켓: 소켓<2>. 
* 비동기 소켓 서비스:: 
* 쿠키 관리:: 
* 실행 추적:: 
* UUencode 및 UUdecode 함수:: 
* XML 원격 프로시저 호출:: 
* test_epoll:: 
* Select kqueue:: 
* SipHash24:: 
* strtod 와 dtoa:: 
* OpenSSL: OpenSSL<2>. 
* expat:: 
* libffi:: 
* zlib: zlib<4>. 
* cfuhash:: 
* libmpdec:: 
* W3C C14N 테스트 스위트:: 
* mimalloc:: 
* asyncio: asyncio<15>. 
* Global Unbounded Sequences (GUS): Global Unbounded Sequences GUS. 
* Zstandard bindings:: 

@end detailmenu
@end menu

@node 파이썬의 새로운 기능,파이썬 자습서,Top,Top
@anchor{whatsnew/index doc}@anchor{13c}@anchor{whatsnew/index python-documentation-contents}@anchor{13d}@anchor{whatsnew/index what-s-new-in-python}@anchor{13e}@anchor{whatsnew/index whatsnew-index}@anchor{13f}
@chapter 파이썬의 새로운 기능


“파이썬의 새로운 기능” 수필 시리즈는 주요 파이썬 버전 간의 가장 중요한 변화를 둘러 봅니다. 새로운 릴리스 이후에 최신 상태를 유지하고자 하는 사람들에게는 “꼭 읽어야 할” 문서입니다.

@menu
* What’s new in Python 3.14: What’s new in Python 3 14. 
* 파이썬 3.13의 새로운 기능에 대해 알아봅시다: 파이썬 3 13의 새로운 기능에 대해 알아봅시다. 
* What’s New In Python 3.12: What’s New In Python 3 12. 
* What’s New In Python 3.11: What’s New In Python 3 11. 
* What’s New In Python 3.10: What’s New In Python 3 10. 
* 파이썬 3.9의 새로운 기능: 파이썬 3 9의 새로운 기능. 
* 파이썬 3.8의 새로운 기능: 파이썬 3 8의 새로운 기능. 
* 파이썬 3.7의 새로운 기능: 파이썬 3 7의 새로운 기능. 
* 파이썬 3.6의 새로운 기능: 파이썬 3 6의 새로운 기능. 
* 파이썬 3.5의 새로운 기능: 파이썬 3 5의 새로운 기능. 
* What’s New In Python 3.4: What’s New In Python 3 4. 
* What’s New In Python 3.3: What’s New In Python 3 3. 
* What’s New In Python 3.2: What’s New In Python 3 2. 
* What’s New In Python 3.1: What’s New In Python 3 1. 
* What’s New In Python 3.0: What’s New In Python 3 0. 
* What’s New in Python 2.7: What’s New in Python 2 7. 
* What’s New in Python 2.6: What’s New in Python 2 6. 
* What’s New in Python 2.5: What’s New in Python 2 5. 
* What’s New in Python 2.4: What’s New in Python 2 4. 
* What’s New in Python 2.3: What’s New in Python 2 3. 
* What’s New in Python 2.2: What’s New in Python 2 2. 
* What’s New in Python 2.1: What’s New in Python 2 1. 
* What’s New in Python 2.0: What’s New in Python 2 0. 
* Changelog:: 

@end menu

@node What’s new in Python 3 14,파이썬 3 13의 새로운 기능에 대해 알아봅시다,,파이썬의 새로운 기능
@anchor{whatsnew/3 14 doc}@anchor{140}@anchor{whatsnew/3 14 what-s-new-in-python-3-14}@anchor{141}
@section What’s new in Python 3.14


@*Editors: 
Adam Turner and Hugo van Kemenade


@c Rules for maintenance:
@c 
@c * Anyone can add text to this document.  Do not spend very much time
@c on the wording of your changes, because your text will probably
@c get rewritten to some degree.
@c 
@c * The maintainer will go through Misc/NEWS periodically and add
@c changes; it's therefore more important to add your changes to
@c Misc/NEWS than to this file.
@c 
@c * This is not a complete list of every single change; completeness
@c is the purpose of Misc/NEWS.  Some changes I consider too small
@c or esoteric to include.  If such a change is added to the text,
@c I'll just remove it.  (This is another reason you shouldn't spend
@c too much time on writing your addition.)
@c 
@c * If you want to draw your new text to the attention of the
@c maintainer, add 'XXX' to the beginning of the paragraph or
@c section.
@c 
@c * It's OK to just add a fragmentary note about a change.  For
@c example: "XXX Describe the transmogrify() function added to the
@c socket module."  The maintainer will research the change and
@c write the necessary text.
@c 
@c * You can comment out your additions if you like, but it's not
@c necessary (especially when a final release is some months away).
@c 
@c * Credit the author of a patch or bugfix.   Just the name is
@c sufficient; the e-mail address isn't necessary.
@c 
@c * It's helpful to add the issue number as a comment:
@c 
@c XXX Describe the transmogrify() function added to the socket
@c module.
@c (Contributed by P.Y. Developer in :gh:`12345`.)
@c 
@c This saves the maintainer the effort of going through the VCS log
@c when researching a change.

This article explains the new features in Python 3.14, compared to 3.13.
Python 3.14 was released on 7 October 2025.
For full details, see the @ref{142,,changelog}.


@subsubheading 더 보기


@geindex Python 향상 제안; PEP 745
PEP 745@footnote{https://peps.python.org/pep-0745/} – Python 3.14 release schedule


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

@end menu

@node Summary – Release highlights,New features,,What’s new in Python 3 14
@anchor{whatsnew/3 14 summary-release-highlights}@anchor{143}
@subsection Summary – Release highlights


@c This section singles out the most important changes in Python 3.14.
@c Brevity is key.

Python 3.14 is the latest stable release of the Python programming
language, with a mix of changes to the language, the implementation,
and the standard library.
The biggest changes include @ref{144,,template string literals},
@ref{145,,deferred evaluation of annotations},
and support for @ref{146,,subinterpreters} in
the standard library.

The library changes include significantly improved capabilities for
@ref{147,,introspection in asyncio},
@ref{148,,support for Zstandard} via a new
@ref{23,,compression.zstd} module, syntax highlighting in the REPL,
as well as the usual deprecations and removals,
and improvements in user-friendliness and correctness.

This article doesn’t attempt to provide a complete specification
of all new features, but instead gives a convenient overview.
For full details refer to the documentation,
such as the @ref{149,,Library Reference}
and @ref{14a,,Language Reference}.
To understand the complete implementation and design rationale for a change,
refer to the PEP for a particular new feature;
but note that PEPs usually are not kept up-to-date
once a feature has been fully implemented.
See @ref{14b,,Porting to Python 3.14} for guidance on upgrading from
earlier versions of Python.


__________________________________________________________________


@c PEP-sized items next.

Interpreter improvements:


@itemize *

@item 
@geindex Python 향상 제안; PEP 649
PEP 649@footnote{https://peps.python.org/pep-0649/} and 
@geindex Python 향상 제안; PEP 749
PEP 749@footnote{https://peps.python.org/pep-0749/}: @ref{145,,Deferred evaluation of annotations}

@item 
@geindex Python 향상 제안; PEP 734
PEP 734@footnote{https://peps.python.org/pep-0734/}: @ref{146,,Multiple interpreters in the standard library}

@item 
@geindex Python 향상 제안; PEP 750
PEP 750@footnote{https://peps.python.org/pep-0750/}: @ref{144,,Template strings}

@item 
@geindex Python 향상 제안; PEP 758
PEP 758@footnote{https://peps.python.org/pep-0758/}: @ref{14c,,Allow except and except* expressions without brackets}

@item 
@geindex Python 향상 제안; PEP 765
PEP 765@footnote{https://peps.python.org/pep-0765/}: @ref{14d,,Control flow in finally blocks}

@item 
@geindex Python 향상 제안; PEP 768
PEP 768@footnote{https://peps.python.org/pep-0768/}: @ref{14e,,Safe external debugger interface for CPython}

@item 
@ref{14f,,A new type of interpreter}

@item 
@ref{150,,Free-threaded mode improvements}

@item 
@ref{151,,Improved error messages}

@item 
@ref{152,,Incremental garbage collection}
@end itemize

Significant improvements in the standard library:


@itemize *

@item 
@geindex Python 향상 제안; PEP 784
PEP 784@footnote{https://peps.python.org/pep-0784/}: @ref{148,,Zstandard support in the standard library}

@item 
@ref{147,,Asyncio introspection capabilities}

@item 
@ref{153,,Concurrent safe warnings control}

@item 
@ref{154,,Syntax highlighting in the default interactive shell}, and color output in several
standard library CLIs
@end itemize

C API improvements:


@itemize *

@item 
@geindex Python 향상 제안; PEP 741
PEP 741@footnote{https://peps.python.org/pep-0741/}: @ref{155,,Python configuration C API}
@end itemize

Platform support:


@itemize *

@item 
@geindex Python 향상 제안; PEP 776
PEP 776@footnote{https://peps.python.org/pep-0776/}: Emscripten is now an @ref{156,,officially supported platform}, at 
@geindex Python 향상 제안; PEP 11#tier-3
tier 3@footnote{https://peps.python.org/pep-0011/#tier-3}.
@end itemize

Release changes:


@itemize *

@item 
@geindex Python 향상 제안; PEP 779
PEP 779@footnote{https://peps.python.org/pep-0779/}: @ref{157,,Free-threaded Python is officially supported}

@item 
@geindex Python 향상 제안; PEP 761
PEP 761@footnote{https://peps.python.org/pep-0761/}: @ref{158,,PGP signatures have been discontinued for official releases}

@item 
@ref{159,,Windows and macOS binary releases now support the experimental just-in-time compiler}

@item 
@ref{156,,Binary releases for Android are now provided}
@end itemize

@node New features,Other language changes,Summary – Release highlights,What’s new in Python 3 14
@anchor{whatsnew/3 14 new-features}@anchor{15a}
@subsection New features


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

@end menu

@node PEP 649 & PEP 749 Deferred evaluation of annotations,PEP 734 Multiple interpreters in the standard library,,New features
@anchor{whatsnew/3 14 pep-649-pep-749-deferred-evaluation-of-annotations}@anchor{15b}@anchor{whatsnew/3 14 whatsnew314-deferred-annotations}@anchor{145}
@subsubsection 
@geindex Python 향상 제안; PEP 649
`PEP 649' & 
@geindex Python 향상 제안; PEP 749
`PEP 749': Deferred evaluation of annotations


The @ref{15c,,annotations} on functions, classes, and modules are no
longer evaluated eagerly. Instead, annotations are stored in special-purpose
@ref{15d,,annotate functions} and evaluated only when
necessary (except if @code{from __future__ import annotations} is used).

This change is designed to improve performance and usability of annotations
in Python in most circumstances. The runtime cost for defining annotations is
minimized, but it remains possible to introspect annotations at runtime.
It is no longer necessary to enclose annotations in strings if they
contain forward references.

The new @ref{6,,annotationlib} module provides tools for inspecting deferred
annotations. Annotations may be evaluated in the @ref{15e,,VALUE}
format (which evaluates annotations to runtime values, similar to the behavior in
earlier Python versions), the @ref{15f,,FORWARDREF} format
(which replaces undefined names with special markers), and the
@ref{160,,STRING} format (which returns annotations as strings).

This example shows how these formats behave:

@example
>>> from annotationlib import get_annotations, Format
>>> def func(arg: Undefined):
...     pass
>>> get_annotations(func, format=Format.VALUE)
Traceback (most recent call last):
  ...
NameError: name 'Undefined' is not defined
>>> get_annotations(func, format=Format.FORWARDREF)
@{'arg': ForwardRef('Undefined', owner=<function func at 0x...>)@}
>>> get_annotations(func, format=Format.STRING)
@{'arg': 'Undefined'@}
@end example

The @ref{161,,porting} section contains guidance
on changes that may be needed due to these changes, though in the majority of
cases, code will continue working as-is.

(Contributed by Jelle Zijlstra in 
@geindex Python 향상 제안; PEP 749
PEP 749@footnote{https://peps.python.org/pep-0749/} and gh-119180@footnote{https://github.com/python/cpython/issues/119180};
@geindex Python 향상 제안; PEP 649
PEP 649@footnote{https://peps.python.org/pep-0649/} was written by Larry Hastings.)


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 649

@item PEP 649@footnote{https://peps.python.org/pep-0649/}

Deferred Evaluation Of Annotations Using Descriptors

@geindex Python 향상 제안; PEP 749

@item PEP 749@footnote{https://peps.python.org/pep-0749/}

Implementing PEP 649
@end table


@node PEP 734 Multiple interpreters in the standard library,PEP 750 Template string literals,PEP 649 & PEP 749 Deferred evaluation of annotations,New features
@anchor{whatsnew/3 14 pep-734-multiple-interpreters-in-the-standard-library}@anchor{162}@anchor{whatsnew/3 14 whatsnew314-multiple-interpreters}@anchor{146}
@subsubsection 
@geindex Python 향상 제안; PEP 734
`PEP 734': Multiple interpreters in the standard library


The CPython runtime supports running multiple copies of Python in the
same process simultaneously and has done so for over 20 years.
Each of these separate copies is called an ‘interpreter’.
However, the feature had been available only through
the @ref{163,,C-API}.

That limitation is removed in Python 3.14,
with the new @ref{25,,concurrent.interpreters} module.

There are at least two notable reasons why using multiple interpreters
has significant benefits:


@itemize *

@item 
they support a new (to Python), human-friendly concurrency model

@item 
true multi-core parallelism
@end itemize

For some use cases, concurrency in software improves efficiency and
can simplify design, at a high level.
At the same time, implementing and maintaining all but the simplest concurrency
is often a struggle for the human brain.
That especially applies to plain threads (for example, @ref{f3,,threading}),
where all memory is shared between all threads.

With multiple isolated interpreters, you can take advantage of a class
of concurrency models, like Communicating Sequential Processes (CSP)
or the actor model, that have found
success in other programming languages, like Smalltalk, Erlang,
Haskell, and Go. Think of multiple interpreters as threads
but with opt-in sharing.

Regarding multi-core parallelism: as of Python 3.12, interpreters
are now sufficiently isolated from one another to be used in parallel
(see 
@geindex Python 향상 제안; PEP 684
PEP 684@footnote{https://peps.python.org/pep-0684/}). This unlocks a variety of CPU-intensive use cases
for Python that were limited by the @ref{164,,GIL}.

Using multiple interpreters is similar in many ways to
@ref{98,,multiprocessing}, in that they both provide isolated logical
“processes” that can run in parallel, with no sharing by default.
However, when using multiple interpreters, an application will use
fewer system resources and will operate more efficiently (since it
stays within the same process). Think of multiple interpreters as
having the isolation of processes with the efficiency of threads.

@c XXX Add an example or two.

@c XXX Link to the not-yet-added HOWTO doc.

While the feature has been around for decades, multiple interpreters
have not been used widely, due to low awareness and the lack of a
standard library module. Consequently, they currently have several
notable limitations, which are expected to improve significantly now
that the feature is going mainstream.

Current limitations:


@itemize *

@item 
starting each interpreter has not been optimized yet

@item 
each interpreter uses more memory than necessary
(work continues on extensive internal sharing between interpreters)

@item 
there aren’t many options `yet' for truly sharing objects or other
data between interpreters (other than @ref{165,,memoryview})

@item 
many third-party extension modules on PyPI are not yet compatible
with multiple interpreters
(all standard library extension modules `are' compatible)

@item 
the approach to writing applications that use multiple isolated
interpreters is mostly unfamiliar to Python users, for now
@end itemize

The impact of these limitations will depend on future CPython
improvements, how interpreters are used, and what the community solves
through PyPI packages. Depending on the use case, the limitations may
not have much impact, so try it out!

Furthermore, future CPython releases will reduce or eliminate overhead
and provide utilities that are less appropriate on PyPI. In the
meantime, most of the limitations can also be addressed through
extension modules, meaning PyPI packages can fill any gap for 3.14, and
even back to 3.12 where interpreters were finally properly isolated and
stopped sharing the @ref{164,,GIL}. Likewise, libraries on PyPI are expected
to emerge for high-level abstractions on top of interpreters.

Regarding extension modules, work is in progress to update some PyPI
projects, as well as tools like Cython, pybind11, nanobind, and PyO3.
The steps for isolating an extension module are found at
@ref{166,,Isolating Extension Modules}.
Isolating a module has a lot of overlap with what is required to support
@ref{150,,free-threading}, so the ongoing
work in the community in that area will help accelerate support
for multiple interpreters.

Also added in 3.14: @ref{167,,concurrent.futures.InterpreterPoolExecutor}.

(Contributed by Eric Snow in gh-134939@footnote{https://github.com/python/cpython/issues/134939}.)


@subsubheading 더 보기


@geindex Python 향상 제안; PEP 734
PEP 734@footnote{https://peps.python.org/pep-0734/}


@node PEP 750 Template string literals,PEP 768 Safe external debugger interface,PEP 734 Multiple interpreters in the standard library,New features
@anchor{whatsnew/3 14 pep-750-template-string-literals}@anchor{168}@anchor{whatsnew/3 14 whatsnew314-template-string-literals}@anchor{144}
@subsubsection 
@geindex Python 향상 제안; PEP 750
`PEP 750': Template string literals


Template strings are a new mechanism for custom string processing.
They share the familiar syntax of f-strings but, unlike f-strings,
return an object representing the static and interpolated parts of
the string, instead of a simple @ref{169,,str}.

To write a t-string, use a @code{'t'} prefix instead of an @code{'f'}:

@example
>>> variety = 'Stilton'
>>> template = t'Try some @{variety@} cheese!'
>>> type(template)
<class 'string.templatelib.Template'>
@end example

@ref{16a,,Template} objects provide access to the static
and interpolated (in curly braces) parts of a string `before' they are combined.
Iterate over @code{Template} instances to access their parts in order:

@c variety = 'Stilton'
@c template = t'Try some {variety} cheese!'

@example
>>> list(template)
['Try some ', Interpolation('Stilton', 'variety', None, '@w{'}), ' cheese!']
@end example

It’s easy to write (or call) code to process @code{Template} instances.
For example, here’s a function that renders static parts lowercase and
@ref{16b,,Interpolation} instances uppercase:

@example
from string.templatelib import Interpolation

def lower_upper(template):
    """Render static parts lowercase and interpolations uppercase."""
    parts = []
    for part in template:
        if isinstance(part, Interpolation):
            parts.append(str(part.value).upper())
        else:
            parts.append(part.lower())
    return '@w{'}.join(parts)

name = 'Wenslydale'
template = t'Mister @{name@}'
assert lower_upper(template) == 'mister WENSLYDALE'
@end example

Because @code{Template} instances distinguish between static strings and
interpolations at runtime, they can be useful for sanitising user input.
Writing a @code{html()} function that escapes user input in HTML is an exercise
left to the reader!
Template processing code can provide improved flexibility.
For instance, a more advanced @code{html()} function could accept
a @code{dict} of HTML attributes directly in the template:

@example
attributes = @{'src': 'limburger.jpg', 'alt': 'lovely cheese'@}
template = t'<img @{attributes@}>'
assert html(template) == '<img src="limburger.jpg" alt="lovely cheese" />'
@end example

Of course, template processing code does not need to return a string-like result.
An even `more' advanced @code{html()} could return a custom type representing
a DOM-like structure.

With t-strings in place, developers can write systems that sanitise SQL,
make safe shell operations, improve logging, tackle modern ideas in web
development (HTML, CSS, and so on), and implement lightweight custom business DSLs.

(Contributed by Jim Baker, Guido van Rossum, Paul Everitt, Koudai Aono,
Lysandros Nikolaou, Dave Peck, Adam Turner, Jelle Zijlstra, Bénédikt Tran,
and Pablo Galindo Salgado in gh-132661@footnote{https://github.com/python/cpython/issues/132661}.)


@subsubheading 더 보기


@geindex Python 향상 제안; PEP 750
PEP 750@footnote{https://peps.python.org/pep-0750/}.


@node PEP 768 Safe external debugger interface,A new type of interpreter,PEP 750 Template string literals,New features
@anchor{whatsnew/3 14 pep-768-safe-external-debugger-interface}@anchor{16c}@anchor{whatsnew/3 14 whatsnew314-remote-debugging}@anchor{14e}
@subsubsection 
@geindex Python 향상 제안; PEP 768
`PEP 768': Safe external debugger interface


Python 3.14 introduces a zero-overhead debugging interface that allows
debuggers and profilers to safely attach to running Python processes
without stopping or restarting them.
This is a significant enhancement to Python’s debugging capabilities,
meaning that unsafe alternatives are no longer required.

The new interface provides safe execution points for attaching debugger code
without modifying the interpreter’s normal execution path
or adding any overhead at runtime.
Due to this, tools can now inspect and interact with Python applications
in real-time, which is a crucial capability for high-availability systems
and production environments.

For convenience, this interface is implemented in the @ref{16d,,sys.remote_exec()}
function. For example:

@example
import sys
from tempfile import NamedTemporaryFile

with NamedTemporaryFile(mode='w', suffix='.py', delete=False) as f:
    script_path = f.name
    f.write(f'import my_debugger; my_debugger.connect(@{os.getpid()@})')

# Execute in process with PID 1234
print('Behold! An offering:')
sys.remote_exec(1234, script_path)
@end example

This function allows sending Python code to be executed in a target process
at the next safe execution point.
However, tool authors can also implement the protocol directly as described
in the PEP, which details the underlying mechanisms used to safely attach to
running processes.

The debugging interface has been carefully designed with security in mind
and includes several mechanisms to control access:


@itemize *

@item 
A 
@geindex PYTHON_DISABLE_REMOTE_DEBUG
@geindex 환경 변수; PYTHON_DISABLE_REMOTE_DEBUG
@ref{16e,,PYTHON_DISABLE_REMOTE_DEBUG} environment variable.

@item 
A @ref{16f,,-X disable-remote-debug} command-line option.

@item 
A @ref{170,,--without-remote-debug} configure flag to completely disable
the feature at build time.
@end itemize

(Contributed by Pablo Galindo Salgado, Matt Wozniski, and Ivona Stojanovic
in gh-131591@footnote{https://github.com/python/cpython/issues/131591}.)


@subsubheading 더 보기


@geindex Python 향상 제안; PEP 768
PEP 768@footnote{https://peps.python.org/pep-0768/}.


@node A new type of interpreter,Free-threaded mode improvements,PEP 768 Safe external debugger interface,New features
@anchor{whatsnew/3 14 a-new-type-of-interpreter}@anchor{171}@anchor{whatsnew/3 14 whatsnew314-tail-call-interpreter}@anchor{14f}
@subsubsection A new type of interpreter


A new type of interpreter has been added to CPython.
It uses tail calls between small C functions that implement individual
Python opcodes, rather than one large C @code{case} statement.
For certain newer compilers, this interpreter provides
significantly better performance. Preliminary benchmarks suggest a geometric
mean of 3-5% faster on the standard @code{pyperformance} benchmark suite,
depending on platform and architecture.
The baseline is Python 3.14 built with Clang 19, without this new interpreter.

This interpreter currently only works with Clang 19 and newer
on x86-64 and AArch64 architectures.
However, a future release of GCC is expected to support this as well.

This feature is opt-in for now. Enabling profile-guided optimization is highly
recommended when using the new interpreter as it is the only configuration
that has been tested and validated for improved performance.
For further information, see @ref{172,,--with-tail-call-interp}.

@cartouche
@quotation 참고 
This is not to be confused with tail call optimization@footnote{https://en.wikipedia.org/wiki/Tail_call} of Python
functions, which is currently not implemented in CPython.

This new interpreter type is an internal implementation detail of the CPython
interpreter.  It doesn’t change the visible behavior of Python programs at
all.  It can improve their performance, but doesn’t change anything else.
@end quotation
@end cartouche

(Contributed by Ken Jin in gh-128563@footnote{https://github.com/python/cpython/issues/128563}, with ideas on how to implement this
in CPython by Mark Shannon, Garrett Gu, Haoran Xu, and Josh Haberman.)

@node Free-threaded mode improvements,Improved error messages,A new type of interpreter,New features
@anchor{whatsnew/3 14 free-threaded-mode-improvements}@anchor{173}@anchor{whatsnew/3 14 whatsnew314-free-threaded-cpython}@anchor{150}
@subsubsection Free-threaded mode improvements


CPython’s free-threaded mode (
@geindex Python 향상 제안; PEP 703
PEP 703@footnote{https://peps.python.org/pep-0703/}), initially added in 3.13,
has been significantly improved in Python 3.14.
The implementation described in PEP 703 has been finished, including C API
changes, and temporary workarounds in the interpreter were replaced with
more permanent solutions.
The specializing adaptive interpreter (
@geindex Python 향상 제안; PEP 659
PEP 659@footnote{https://peps.python.org/pep-0659/}) is now enabled
in free-threaded mode, which along with many other optimizations
greatly improves its performance.
The performance penalty on single-threaded code in free-threaded mode
is now roughly 5-10%, depending on the platform and C compiler used.

From Python 3.14, when compiling extension modules for the free-threaded build of
CPython on Windows, the preprocessor variable @code{Py_GIL_DISABLED} now needs to
be specified by the build backend, as it will no longer be determined
automatically by the C compiler. For a running interpreter, the setting that
was used at compile time can be found using @ref{174,,sysconfig.get_config_var()}.

The new @ref{16f,,-X context_aware_warnings} flag controls if
@ref{153,,concurrent safe warnings control}
is enabled. The flag defaults to true for the free-threaded build
and false for the GIL-enabled build.

A new @ref{175,,thread_inherit_context} flag has been added,
which if enabled means that threads created with @ref{176,,threading.Thread}
start with a copy of the @ref{177,,Context()} of the caller of
@ref{178,,start()}.  Most significantly, this makes the warning
filtering context established by @ref{179,,catch_warnings} be
“inherited” by threads (or asyncio tasks) started within that context.  It also
affects other modules that use context variables, such as the @ref{3a,,decimal}
context manager.
This flag defaults to true for the free-threaded build and false for
the GIL-enabled build.

(Contributed by Sam Gross, Matt Page, Neil Schemenauer, Thomas Wouters,
Donghee Na, Kirill Podoprigora, Ken Jin, Itamar Oren, Brett Simmers,
Dino Viehland, Nathan Goldbaum, Ralf Gommers, Lysandros Nikolaou, Kumar Aditya,
Edgar Margffoy, and many others.
Some of these contributors are employed by Meta, which has continued to provide
significant engineering resources to support this project.)

@node Improved error messages,PEP 784 Zstandard support in the standard library,Free-threaded mode improvements,New features
@anchor{whatsnew/3 14 improved-error-messages}@anchor{17a}@anchor{whatsnew/3 14 whatsnew314-improved-error-messages}@anchor{151}
@subsubsection Improved error messages



@itemize *

@item 
The interpreter now provides helpful suggestions when it detects typos in Python
keywords. When a word that closely resembles a Python keyword is encountered,
the interpreter will suggest the correct keyword in the error message. This
feature helps programmers quickly identify and fix common typing mistakes. For
example:

@example
>>> whille True:
...     pass
Traceback (most recent call last):
  File "<stdin>", line 1
    whille True:
    ^^^^^^
SyntaxError: invalid syntax. Did you mean 'while'?
@end example

While the feature focuses on the most common cases, some variations of
misspellings may still result in regular syntax errors.
(Contributed by Pablo Galindo in gh-132449@footnote{https://github.com/python/cpython/issues/132449}.)

@item 
@ref{17b,,elif} statements that follow an @ref{17c,,else} block now have
a specific error message.
(Contributed by Steele Farnsworth in gh-129902@footnote{https://github.com/python/cpython/issues/129902}.)

@example
>>> if who == "me":
...     print("It's me!")
... else:
...     print("It's not me!")
... elif who is None:
...     print("Who is it?")
File "<stdin>", line 5
  elif who is None:
  ^^^^
SyntaxError: 'elif' block follows an 'else' block
@end example

@item 
If a statement is passed to the @ref{17d,,조건 표현식(Conditional expressions)} after @ref{17c,,else},
or one of @ref{17e,,pass}, @ref{17f,,break}, or @ref{180,,continue}
is passed before @ref{181,,if}, then the
error message highlights where the @ref{182,,expression} is
required. (Contributed by Sergey Miryanov in gh-129515@footnote{https://github.com/python/cpython/issues/129515}.)

@example
>>> x = 1 if True else pass
Traceback (most recent call last):
  File "<string>", line 1
    x = 1 if True else pass
                       ^^^^
SyntaxError: expected expression after 'else', but statement is given

>>> x = continue if True else break
Traceback (most recent call last):
  File "<string>", line 1
    x = continue if True else break
        ^^^^^^^^
SyntaxError: expected expression before 'if', but statement is given
@end example

@item 
When incorrectly closed strings are detected, the error message suggests
that the string may be intended to be part of the string.
(Contributed by Pablo Galindo in gh-88535@footnote{https://github.com/python/cpython/issues/88535}.)

@example
>>> "The interesting object "The important object" is very important"
Traceback (most recent call last):
SyntaxError: invalid syntax. Is this intended to be part of the string?
@end example

@item 
When strings have incompatible prefixes, the error now shows
which prefixes are incompatible.
(Contributed by Nikita Sobolev in gh-133197@footnote{https://github.com/python/cpython/issues/133197}.)

@example
>>> ub'abc'
  File "<python-input-0>", line 1
    ub'abc'
    ^^
SyntaxError: 'u' and 'b' prefixes are incompatible
@end example

@item 
Improved error messages when using @code{as} with incompatible targets in:


@itemize -

@item 
Imports: @code{import ... as ...}

@item 
From imports: @code{from ... import ... as ...}

@item 
Except handlers: @code{except ... as ...}

@item 
Pattern-match cases: @code{case ... as ...}
@end itemize

(Contributed by Nikita Sobolev in gh-123539@footnote{https://github.com/python/cpython/issues/123539}, gh-123562@footnote{https://github.com/python/cpython/issues/123562}, and gh-123440@footnote{https://github.com/python/cpython/issues/123440}.)

@item 
Improved error message when trying to add an instance of an unhashable type to
a @ref{183,,dict} or @ref{184,,set}.
(Contributed by CF Bolz-Tereick and Victor Stinner in gh-132828@footnote{https://github.com/python/cpython/issues/132828}.)

@example
>>> s = set()
>>> s.add(@{'pages': 12, 'grade': 'A'@})
Traceback (most recent call last):
  File "<python-input-1>", line 1, in <module>
    s.add(@{'pages': 12, 'grade': 'A'@})
    ~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: cannot use 'dict' as a set element (unhashable type: 'dict')
>>> d = @{@}
>>> l = [1, 2, 3]
>>> d[l] = 12
Traceback (most recent call last):
  File "<python-input-4>", line 1, in <module>
    d[l] = 12
    ~^^^
TypeError: cannot use 'list' as a dict key (unhashable type: 'list')
@end example

@item 
Improved error message when an object supporting the synchronous
context manager protocol is entered using @ref{185,,async with}
instead of @ref{186,,with},
and vice versa for the asynchronous context manager protocol.
(Contributed by Bénédikt Tran in gh-128398@footnote{https://github.com/python/cpython/issues/128398}.)
@end itemize

@node PEP 784 Zstandard support in the standard library,Asyncio introspection capabilities,Improved error messages,New features
@anchor{whatsnew/3 14 pep-784-zstandard-support-in-the-standard-library}@anchor{187}@anchor{whatsnew/3 14 whatsnew314-zstandard}@anchor{148}
@subsubsection 
@geindex Python 향상 제안; PEP 784
`PEP 784': Zstandard support in the standard library


The new @code{compression} package contains modules @code{compression.lzma},
@code{compression.bz2}, @code{compression.gzip} and @code{compression.zlib}
which re-export the @ref{8e,,lzma}, @ref{14,,bz2}, @ref{6b,,gzip} and @ref{139,,zlib}
modules respectively. The new import names under @code{compression} are the
preferred names for importing these compression modules from Python 3.14. However,
the existing modules names have not been deprecated. Any deprecation or removal
of the existing compression modules will occur no sooner than five years after
the release of 3.14.

The new @code{compression.zstd} module provides compression and decompression
APIs for the Zstandard format via bindings to Meta's zstd library@footnote{https://facebook.github.io/zstd/}. Zstandard is a widely adopted, highly
efficient, and fast compression format. In addition to the APIs introduced in
@code{compression.zstd}, support for reading and writing Zstandard compressed
archives has been added to the @ref{e4,,tarfile}, @ref{137,,zipfile}, and
@ref{ca,,shutil} modules.

Here’s an example of using the new module to compress some data:

@example
from compression import zstd
import math

data = str(math.pi).encode() * 20
compressed = zstd.compress(data)
ratio = len(compressed) / len(data)
print(f"Achieved compression ratio of @{ratio@}")
@end example

As can be seen, the API is similar to the APIs of the @code{lzma} and
@code{bz2} modules.

(Contributed by Emma Harper Smith, Adam Turner, Gregory P. Smith, Tomas Roun,
Victor Stinner, and Rogdham in gh-132983@footnote{https://github.com/python/cpython/issues/132983}.)


@subsubheading 더 보기


@geindex Python 향상 제안; PEP 784
PEP 784@footnote{https://peps.python.org/pep-0784/}.


@node Asyncio introspection capabilities,Concurrent safe warnings control,PEP 784 Zstandard support in the standard library,New features
@anchor{whatsnew/3 14 asyncio-introspection-capabilities}@anchor{188}@anchor{whatsnew/3 14 whatsnew314-asyncio-introspection}@anchor{147}
@subsubsection Asyncio introspection capabilities


Added a new command-line interface to inspect running Python processes
using asynchronous tasks, available via @code{python -m asyncio ps PID}
or @code{python -m asyncio pstree PID}.

The @code{ps} subcommand inspects the given process ID (PID) and displays
information about currently running asyncio tasks.
It outputs a task table: a flat listing of all tasks, their names,
their coroutine stacks, and which tasks are awaiting them.

The @code{pstree} subcommand fetches the same information, but instead renders a
visual async call tree, showing coroutine relationships in a hierarchical format.
This command is particularly useful for debugging long-running or stuck
asynchronous programs.
It can help developers quickly identify where a program is blocked,
what tasks are pending, and how coroutines are chained together.

For example given this code:

@example
import asyncio

async def play_track(track):
    await asyncio.sleep(5)
    print(f'🎵 Finished: @{track@}')

async def play_album(name, tracks):
    async with asyncio.TaskGroup() as tg:
        for track in tracks:
            tg.create_task(play_track(track), name=track)

async def main():
    async with asyncio.TaskGroup() as tg:
        tg.create_task(
          play_album('Sundowning', ['TNDNBTG', 'Levitate']),
          name='Sundowning')
        tg.create_task(
          play_album('TMBTE', ['DYWTYLM', 'Aqua Regia']),
          name='TMBTE')

if __name__ == '__main__':
    asyncio.run(main())
@end example

Executing the new tool on the running process will yield a table like this:

@example
python -m asyncio ps 12345

tid        task id              task name            coroutine stack                                    awaiter chain                                      awaiter name    awaiter id
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1935500    0x7fc930c18050       Task-1               TaskGroup._aexit -> TaskGroup.__aexit__ -> main                                                                       0x0
1935500    0x7fc930c18230       Sundowning           TaskGroup._aexit -> TaskGroup.__aexit__ -> album   TaskGroup._aexit -> TaskGroup.__aexit__ -> main    Task-1          0x7fc930c18050
1935500    0x7fc93173fa50       TMBTE                TaskGroup._aexit -> TaskGroup.__aexit__ -> album   TaskGroup._aexit -> TaskGroup.__aexit__ -> main    Task-1          0x7fc930c18050
1935500    0x7fc93173fdf0       TNDNBTG              sleep -> play                                      TaskGroup._aexit -> TaskGroup.__aexit__ -> album   Sundowning      0x7fc930c18230
1935500    0x7fc930d32510       Levitate             sleep -> play                                      TaskGroup._aexit -> TaskGroup.__aexit__ -> album   Sundowning      0x7fc930c18230
1935500    0x7fc930d32890       DYWTYLM              sleep -> play                                      TaskGroup._aexit -> TaskGroup.__aexit__ -> album   TMBTE           0x7fc93173fa50
1935500    0x7fc93161ec30       Aqua Regia           sleep -> play                                      TaskGroup._aexit -> TaskGroup.__aexit__ -> album   TMBTE           0x7fc93173fa50
@end example

or a tree like this:

@example
python -m asyncio pstree 12345

└── (T) Task-1
    └──  main example.py:13
        └──  TaskGroup.__aexit__ Lib/asyncio/taskgroups.py:72
            └──  TaskGroup._aexit Lib/asyncio/taskgroups.py:121
                ├── (T) Sundowning
                │   └──  album example.py:8
                │       └──  TaskGroup.__aexit__ Lib/asyncio/taskgroups.py:72
                │           └──  TaskGroup._aexit Lib/asyncio/taskgroups.py:121
                │               ├── (T) TNDNBTG
                │               │   └──  play example.py:4
                │               │       └──  sleep Lib/asyncio/tasks.py:702
                │               └── (T) Levitate
                │                   └──  play example.py:4
                │                       └──  sleep Lib/asyncio/tasks.py:702
                └── (T) TMBTE
                    └──  album example.py:8
                        └──  TaskGroup.__aexit__ Lib/asyncio/taskgroups.py:72
                            └──  TaskGroup._aexit Lib/asyncio/taskgroups.py:121
                                ├── (T) DYWTYLM
                                │   └──  play example.py:4
                                │       └──  sleep Lib/asyncio/tasks.py:702
                                └── (T) Aqua Regia
                                    └──  play example.py:4
                                        └──  sleep Lib/asyncio/tasks.py:702
@end example

If a cycle is detected in the async await graph (which could indicate a
programming issue), the tool raises an error and lists the cycle paths that
prevent tree construction:

@example
python -m asyncio pstree 12345

ERROR: await-graph contains cycles - cannot print a tree!

cycle: Task-2 → Task-3 → Task-2
@end example

(Contributed by Pablo Galindo, Łukasz Langa, Yury Selivanov, and Marta
Gomez Macias in gh-91048@footnote{https://github.com/python/cpython/issues/91048}.)

@node Concurrent safe warnings control,,Asyncio introspection capabilities,New features
@anchor{whatsnew/3 14 concurrent-safe-warnings-control}@anchor{189}@anchor{whatsnew/3 14 whatsnew314-concurrent-warnings-control}@anchor{153}
@subsubsection Concurrent safe warnings control


The @ref{179,,warnings.catch_warnings} context manager will now optionally
use a context variable for warning filters. This is enabled by setting
the @ref{18a,,context_aware_warnings} flag, either with the @code{-X}
command-line option or an environment variable. This gives predictable
warnings control when using @code{catch_warnings} combined with
multiple threads or asynchronous tasks. The flag defaults to true for the
free-threaded build and false for the GIL-enabled build.

(Contributed by Neil Schemenauer and Kumar Aditya in gh-130010@footnote{https://github.com/python/cpython/issues/130010}.)

@node Other language changes,New modules,New features,What’s new in Python 3 14
@anchor{whatsnew/3 14 other-language-changes}@anchor{18b}
@subsection Other language changes



@itemize *

@item 
All Windows code pages are now supported as ‘cpXXX’ codecs on Windows.
(Contributed by Serhiy Storchaka in gh-123803@footnote{https://github.com/python/cpython/issues/123803}.)

@item 
Implement mixed-mode arithmetic rules combining real and complex numbers
as specified by the C standard since C99.
(Contributed by Sergey B Kirpichev in gh-69639@footnote{https://github.com/python/cpython/issues/69639}.)

@item 
More syntax errors are now detected regardless of optimisation and
the @ref{18c,,-O} command-line option.
This includes writes to @code{__debug__}, incorrect use of @ref{18d,,await},
and asynchronous comprehensions outside asynchronous functions.
For example, @code{python -O -c 'assert (__debug__ := 1)'}
or @code{python -O -c 'assert await 1'} now produce @ref{18e,,SyntaxError}s.
(Contributed by Irit Katriel and Jelle Zijlstra in gh-122245@footnote{https://github.com/python/cpython/issues/122245} & gh-121637@footnote{https://github.com/python/cpython/issues/121637}.)

@item 
When subclassing a pure C type, the C slots for the new type
are no longer replaced with a wrapped version on class creation
if they are not explicitly overridden in the subclass.
(Contributed by Tomasz Pytel in gh-132284@footnote{https://github.com/python/cpython/issues/132284}.)
@end itemize

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

@end menu

@node Built-ins,Command line and environment,,Other language changes
@anchor{whatsnew/3 14 built-ins}@anchor{18f}
@subsubsection Built-ins



@itemize *

@item 
The @ref{190,,bytes.fromhex()} and @ref{191,,bytearray.fromhex()} methods now accept
ASCII @ref{192,,bytes} and @ref{193,,bytes-like objects}.
(Contributed by Daniel Pope in gh-129349@footnote{https://github.com/python/cpython/issues/129349}.)

@item 
Add class methods @ref{194,,float.from_number()} and @ref{195,,complex.from_number()}
to convert a number to @ref{196,,float} or @ref{197,,complex} type correspondingly.
They raise a @ref{198,,TypeError} if the argument is not a real number.
(Contributed by Serhiy Storchaka in gh-84978@footnote{https://github.com/python/cpython/issues/84978}.)

@item 
Support underscore and comma as thousands separators in the fractional part
for floating-point presentation types of the new-style string formatting
(with @ref{199,,format()} or @ref{19a,,포맷 문자열 리터럴}).
(Contributed by Sergey B Kirpichev in gh-87790@footnote{https://github.com/python/cpython/issues/87790}.)

@item 
The @ref{19b,,int()} function no longer delegates to @ref{19c,,__trunc__()}.
Classes that want to support conversion to @code{int()} must implement
either @ref{19d,,__int__()} or @ref{19e,,__index__()}.
(Contributed by Mark Dickinson in gh-119743@footnote{https://github.com/python/cpython/issues/119743}.)

@item 
The @ref{19f,,map()} function now has an optional keyword-only `strict' flag
like @ref{1a0,,zip()} to check that all the iterables are of equal length.
(Contributed by Wannes Boeykens in gh-119793@footnote{https://github.com/python/cpython/issues/119793}.)

@item 
The @ref{165,,memoryview} type now supports subscription,
making it a @ref{1a1,,generic type}.
(Contributed by Brian Schubert in gh-126012@footnote{https://github.com/python/cpython/issues/126012}.)

@item 
Using @ref{1a2,,NotImplemented} in a boolean context
will now raise a @ref{198,,TypeError}.
This has raised a @ref{1a3,,DeprecationWarning} since Python 3.9.
(Contributed by Jelle Zijlstra in gh-118767@footnote{https://github.com/python/cpython/issues/118767}.)

@item 
Three-argument @ref{1a4,,pow()} now tries calling @ref{1a5,,__rpow__()}
if necessary.
Previously it was only called in two-argument @code{pow()}
and the binary power operator.
(Contributed by Serhiy Storchaka in gh-130104@footnote{https://github.com/python/cpython/issues/130104}.)

@item 
@ref{1a6,,super} objects are now @ref{29,,copyable} and @ref{ab,,pickleable}.
(Contributed by Serhiy Storchaka in gh-125767@footnote{https://github.com/python/cpython/issues/125767}.)
@end itemize

@node Command line and environment,PEP 758 Allow except and except* expressions without brackets,Built-ins,Other language changes
@anchor{whatsnew/3 14 command-line-and-environment}@anchor{1a7}
@subsubsection Command line and environment



@itemize *

@item 
The import time flag can now track modules that are already loaded (‘cached’),
via the new @ref{16f,,-X importtime=2}.
When such a module is imported, the @code{self} and @code{cumulative} times
are replaced by the string @code{cached}.

Values above @code{2} for @code{-X importtime} are now reserved for future use.

(Contributed by Noah Kim and Adam Turner in gh-118655@footnote{https://github.com/python/cpython/issues/118655}.)

@item 
The command-line option @ref{1a8,,-c} now automatically dedents its code
argument before execution. The auto-dedentation behavior mirrors
@ref{1a9,,textwrap.dedent()}.
(Contributed by Jon Crall and Steven Sun in gh-103998@footnote{https://github.com/python/cpython/issues/103998}.)

@item 
@code{-J} is no longer a reserved flag for Jython@footnote{https://www.jython.org/},
and now has no special meaning.
(Contributed by Adam Turner in gh-133336@footnote{https://github.com/python/cpython/issues/133336}.)
@end itemize

@node PEP 758 Allow except and except* expressions without brackets,PEP 765 Control flow in finally blocks,Command line and environment,Other language changes
@anchor{whatsnew/3 14 pep-758-allow-except-and-except-expressions-without-brackets}@anchor{1aa}@anchor{whatsnew/3 14 whatsnew314-bracketless-except}@anchor{14c}
@subsubsection PEP 758: Allow @code{except} and @code{except*} expressions without brackets


The @ref{1ab,,except} and @ref{1ac,,except*} expressions
now allow brackets to be omitted when there are multiple exception types
and the @code{as} clause is not used.
For example:

@example
try:
    connect_to_server()
except TimeoutError, ConnectionRefusedError:
    print('The network has ceased to be!')
@end example

(Contributed by Pablo Galindo and Brett Cannon in 
@geindex Python 향상 제안; PEP 758
PEP 758@footnote{https://peps.python.org/pep-0758/} and gh-131831@footnote{https://github.com/python/cpython/issues/131831}.)

@node PEP 765 Control flow in finally blocks,Incremental garbage collection,PEP 758 Allow except and except* expressions without brackets,Other language changes
@anchor{whatsnew/3 14 pep-765-control-flow-in-finally-blocks}@anchor{1ad}@anchor{whatsnew/3 14 whatsnew314-finally-syntaxwarning}@anchor{14d}
@subsubsection PEP 765: Control flow in @code{finally} blocks


The compiler now emits a @ref{1ae,,SyntaxWarning} when a @ref{1af,,return},
@ref{17f,,break}, or @ref{180,,continue} statement have the effect of
leaving a @ref{1b0,,finally} block.
This change is specified in 
@geindex Python 향상 제안; PEP 765
PEP 765@footnote{https://peps.python.org/pep-0765/}.

In situations where this change is inconvenient (such as those where the
warnings are redundant due to code linting), the @ref{1b1,,warning filter} can be used to turn off all syntax warnings by adding
@code{ignore::SyntaxWarning} as a filter. This can be specified in combination
with a filter that converts other warnings to errors (for example, passing
@code{-Werror -Wignore::SyntaxWarning} as CLI options, or setting
@code{PYTHONWARNINGS=error,ignore::SyntaxWarning}).

Note that applying such a filter at runtime using the @ref{118,,warnings} module
will only suppress the warning in code that is compiled `after' the filter is
adjusted. Code that is compiled prior to the filter adjustment (for example,
when a module is imported) will still emit the syntax warning.

(Contributed by Irit Katriel in gh-130080@footnote{https://github.com/python/cpython/issues/130080}.)

@node Incremental garbage collection,Default interactive shell,PEP 765 Control flow in finally blocks,Other language changes
@anchor{whatsnew/3 14 incremental-garbage-collection}@anchor{1b2}@anchor{whatsnew/3 14 whatsnew314-incremental-gc}@anchor{152}
@subsubsection Incremental garbage collection


The cycle garbage collector is now incremental.
This means that maximum pause times are reduced
by an order of magnitude or more for larger heaps.

There are now only two generations: young and old.
When @ref{1b3,,gc.collect()} is not called directly, the
GC is invoked a little less frequently. When invoked, it
collects the young generation and an increment of the
old generation, instead of collecting one or more generations.

The behavior of @code{gc.collect()} changes slightly:


@itemize *

@item 
@code{gc.collect(1)}: Performs an increment of garbage collection,
rather than collecting generation 1.

@item 
Other calls to @code{gc.collect()} are unchanged.
@end itemize

(Contributed by Mark Shannon in gh-108362@footnote{https://github.com/python/cpython/issues/108362}.)

@node Default interactive shell,,Incremental garbage collection,Other language changes
@anchor{whatsnew/3 14 default-interactive-shell}@anchor{1b4}
@subsubsection Default interactive shell

@anchor{whatsnew/3 14 whatsnew314-pyrepl-highlighting}@anchor{154}

@itemize *

@item 
The default @ref{1b5,,interactive} shell now highlights Python syntax.
The feature is enabled by default, save if 
@geindex PYTHON_BASIC_REPL
@geindex 환경 변수; PYTHON_BASIC_REPL
@ref{1b6,,PYTHON_BASIC_REPL}
or any other environment variable that disables colour is set.
See @ref{1b7,,Controlling color} for details.

The default color theme for syntax highlighting strives for good contrast
and exclusively uses the 4-bit VGA standard ANSI color codes for maximum
compatibility. The theme can be customized using an experimental API
@code{_colorize.set_theme()}.
This can be called interactively or in the 
@geindex PYTHONSTARTUP
@geindex 환경 변수; PYTHONSTARTUP
@ref{1b8,,PYTHONSTARTUP} script.
Note that this function has no stability guarantees,
and may change or be removed.

(Contributed by Łukasz Langa in gh-131507@footnote{https://github.com/python/cpython/issues/131507}.)

@item 
The default @ref{1b5,,interactive} shell now supports import auto-completion.
This means that typing @code{import co} and pressing @code{<Tab>} will suggest
modules starting with @code{co}. Similarly, typing @code{from concurrent import i}
will suggest submodules of @code{concurrent} starting with @code{i}.
Note that autocompletion of module attributes is not currently supported.
(Contributed by Tomas Roun in gh-69605@footnote{https://github.com/python/cpython/issues/69605}.)
@end itemize

@node New modules,Improved modules,Other language changes,What’s new in Python 3 14
@anchor{whatsnew/3 14 new-modules}@anchor{1b9}
@subsection New modules



@itemize *

@item 
@ref{6,,annotationlib}:
For introspecting @ref{15c,,annotations}.
See @ref{145,,PEP 749} for more details.
(Contributed by Jelle Zijlstra in gh-119180@footnote{https://github.com/python/cpython/issues/119180}.)

@item 
@ref{22,,compression} (including @ref{23,,compression.zstd}):
A package for compression-related modules,
including a new module to support the Zstandard compression format.
See @ref{148,,PEP 784} for more details.
(Contributed by Emma Harper Smith, Adam Turner, Gregory P. Smith, Tomas Roun,
Victor Stinner, and Rogdham in gh-132983@footnote{https://github.com/python/cpython/issues/132983}.)

@item 
@ref{25,,concurrent.interpreters}:
Support for multiple interpreters in the standard library.
See @ref{146,,PEP 734} for more details.
(Contributed by Eric Snow in gh-134939@footnote{https://github.com/python/cpython/issues/134939}.)

@item 
@ref{d9,,string.templatelib}:
Support for template string literals (t-strings).
See @ref{144,,PEP 750} for more details.
(Contributed by Jim Baker, Guido van Rossum, Paul Everitt, Koudai Aono,
Lysandros Nikolaou, Dave Peck, Adam Turner, Jelle Zijlstra, Bénédikt Tran,
and Pablo Galindo Salgado in gh-132661@footnote{https://github.com/python/cpython/issues/132661}.)
@end itemize

@node Improved modules,Optimizations,New modules,What’s new in Python 3 14
@anchor{whatsnew/3 14 improved-modules}@anchor{1ba}
@subsection Improved modules


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

@end menu

@node argparse,ast,,Improved modules
@anchor{whatsnew/3 14 argparse}@anchor{1bb}
@subsubsection argparse



@itemize *

@item 
The default value of the @ref{1bc,,program name} for
@ref{1bd,,argparse.ArgumentParser} now reflects the way the Python
interpreter was instructed to find the @code{__main__} module code.
(Contributed by Serhiy Storchaka and Alyssa Coghlan in gh-66436@footnote{https://github.com/python/cpython/issues/66436}.)

@item 
Introduced the optional `suggest_on_error' parameter to
@ref{1bd,,argparse.ArgumentParser}, enabling suggestions for argument choices
and subparser names if mistyped by the user.
(Contributed by Savannah Ostrowski in gh-124456@footnote{https://github.com/python/cpython/issues/124456}.)

@item 
Enable color for help text, which can be disabled with the optional `color'
parameter to @ref{1bd,,argparse.ArgumentParser}.
This can also be controlled by @ref{1b7,,environment variables}.
(Contributed by Hugo van Kemenade in gh-130645@footnote{https://github.com/python/cpython/issues/130645}.)
@end itemize

@node ast,asyncio,argparse,Improved modules
@anchor{whatsnew/3 14 ast}@anchor{1be}
@subsubsection ast



@itemize *

@item 
Add @ref{1bf,,compare()}, a function for comparing two ASTs.
(Contributed by Batuhan Taskaya and Jeremy Hylton in gh-60191@footnote{https://github.com/python/cpython/issues/60191}.)

@item 
Add support for @ref{1c0,,copy.replace()} for AST nodes.
(Contributed by Bénédikt Tran in gh-121141@footnote{https://github.com/python/cpython/issues/121141}.)

@item 
Docstrings are now removed from an optimized AST in optimization level 2.
(Contributed by Irit Katriel in gh-123958@footnote{https://github.com/python/cpython/issues/123958}.)

@item 
The @ref{1c1,,repr()} output for AST nodes now includes more information.
(Contributed by Tomas Roun in gh-116022@footnote{https://github.com/python/cpython/issues/116022}.)

@item 
When called with an AST as input, the @ref{1c2,,parse()} function
now always verifies that the root node type is appropriate.
(Contributed by Irit Katriel in gh-130139@footnote{https://github.com/python/cpython/issues/130139}.)

@item 
Add new options to the command-line interface:
@ref{1c3,,--feature-version},
@ref{1c4,,--optimize}, and
@ref{1c5,,--show-empty}.
(Contributed by Semyon Moroz in gh-133367@footnote{https://github.com/python/cpython/issues/133367}.)
@end itemize

@node asyncio,calendar,ast,Improved modules
@anchor{whatsnew/3 14 asyncio}@anchor{1c6}
@subsubsection asyncio



@itemize *

@item 
The function and methods named @code{create_task()} now take an arbitrary
list of keyword arguments. All keyword arguments are passed to the
@ref{1c7,,Task} constructor or the custom task factory.
(See @ref{1c8,,set_task_factory()} for details.)
The @code{name} and @code{context} keyword arguments are no longer special;
the name should now be set using the @code{name} keyword argument of the factory,
and @code{context} may be @code{None}.

This affects the following function and methods:
@ref{1c9,,asyncio.create_task()},
@ref{1ca,,asyncio.loop.create_task()},
@ref{1cb,,asyncio.TaskGroup.create_task()}.

(Contributed by Thomas Grainger in gh-128307@footnote{https://github.com/python/cpython/issues/128307}.)

@item 
There are two new utility functions for
introspecting and printing a program’s call graph:
@ref{1cc,,capture_call_graph()} and @ref{1cd,,print_call_graph()}.
See @ref{147,,Asyncio introspection capabilities} for more details.
(Contributed by Yury Selivanov, Pablo Galindo Salgado, and Łukasz Langa
in gh-91048@footnote{https://github.com/python/cpython/issues/91048}.)
@end itemize

@node calendar,concurrent futures,asyncio,Improved modules
@anchor{whatsnew/3 14 calendar}@anchor{1ce}
@subsubsection calendar

@anchor{whatsnew/3 14 whatsnew314-color-calendar}@anchor{1cf}

@itemize *

@item 
By default, today’s date is highlighted in color in @ref{15,,calendar}’s
@ref{1d0,,command-line} text output.
This can be controlled by @ref{1b7,,environment variables}.
(Contributed by Hugo van Kemenade in gh-128317@footnote{https://github.com/python/cpython/issues/128317}.)
@end itemize

@node concurrent futures,configparser,calendar,Improved modules
@anchor{whatsnew/3 14 concurrent-futures}@anchor{1d1}
@subsubsection concurrent.futures

@anchor{whatsnew/3 14 whatsnew314-concurrent-futures-interp-pool}@anchor{167}

@itemize *

@item 
Add a new executor class, @ref{1d2,,InterpreterPoolExecutor},
which exposes multiple Python interpreters in the same process
(‘subinterpreters’) to Python code.
This uses a pool of independent Python interpreters to execute calls
asynchronously.

This is separate from the new @ref{25,,interpreters} module
introduced by @ref{146,,PEP 734}.
(Contributed by Eric Snow in gh-124548@footnote{https://github.com/python/cpython/issues/124548}.)
@end itemize
@anchor{whatsnew/3 14 whatsnew314-concurrent-futures-start-method}@anchor{1d3}

@itemize *

@item 
On Unix platforms other than macOS, @ref{1d4,,‘forkserver’} is now the default @ref{1d5,,start method} for
@ref{1d6,,ProcessPoolExecutor}
(replacing @ref{1d7,,‘fork’}).
This change does not affect Windows or macOS, where @ref{1d8,,‘spawn’} remains the default start method.

If the threading incompatible `fork' method is required, you must explicitly
request it by supplying a multiprocessing context `mp_context' to
@ref{1d6,,ProcessPoolExecutor}.

See @ref{1d9,,forkserver restrictions}
for information and differences with the `fork' method and how this change
may affect existing code with mutable global shared variables and/or shared
objects that can not be automatically @ref{ab,,pickled}.

(Contributed by Gregory P. Smith in gh-84559@footnote{https://github.com/python/cpython/issues/84559}.)

@item 
Add two new methods to @ref{1d6,,ProcessPoolExecutor},
@ref{1da,,terminate_workers()}
and @ref{1db,,kill_workers()},
as ways to terminate or kill all living worker processes in the given pool.
(Contributed by Charles Machalow in gh-130849@footnote{https://github.com/python/cpython/issues/130849}.)

@item 
Add the optional `buffersize' parameter to @ref{1dc,,Executor.map} to limit the number of submitted
tasks whose results have not yet been yielded. If the buffer is full,
iteration over the `iterables' pauses until a result is yielded from the
buffer.
(Contributed by Enzo Bonnal and Josh Rosenberg in gh-74028@footnote{https://github.com/python/cpython/issues/74028}.)
@end itemize

@node configparser,contextvars,concurrent futures,Improved modules
@anchor{whatsnew/3 14 configparser}@anchor{1dd}
@subsubsection configparser



@itemize *

@item 
@code{configparser} will no longer write config files it cannot read,
to improve security.
Attempting to @ref{1de,,write()} keys containing
delimiters or beginning with the section header pattern will raise an
@ref{1df,,InvalidWriteError}.
(Contributed by Jacob Lincoln in gh-129270@footnote{https://github.com/python/cpython/issues/129270}.)
@end itemize

@node contextvars,ctypes,configparser,Improved modules
@anchor{whatsnew/3 14 contextvars}@anchor{1e0}
@subsubsection contextvars



@itemize *

@item 
Support the @ref{1e1,,context manager} protocol
for @ref{1e2,,Token} objects.
(Contributed by Andrew Svetlov in gh-129889@footnote{https://github.com/python/cpython/issues/129889}.)
@end itemize

@node ctypes,curses,contextvars,Improved modules
@anchor{whatsnew/3 14 ctypes}@anchor{1e3}
@subsubsection ctypes



@itemize *

@item 
The layout of @ref{1e4,,bit fields}
in @ref{1e5,,Structure} and @ref{1e6,,Union} objects
is now a closer match to platform defaults (GCC/Clang or MSVC).
In particular, fields no longer overlap.
(Contributed by Matthias Görgens in gh-97702@footnote{https://github.com/python/cpython/issues/97702}.)

@item 
The @ref{1e7,,Structure._layout_} class attribute can now be set
to help match a non-default ABI.
(Contributed by Petr Viktorin in gh-97702@footnote{https://github.com/python/cpython/issues/97702}.)

@item 
The class of @ref{1e5,,Structure}/@ref{1e6,,Union}
field descriptors is now available as @ref{1e8,,CField},
and has new attributes to aid debugging and introspection.
(Contributed by Petr Viktorin in gh-128715@footnote{https://github.com/python/cpython/issues/128715}.)

@item 
On Windows, the @ref{1e9,,COMError} exception is now public.
(Contributed by Jun Komoda in gh-126686@footnote{https://github.com/python/cpython/issues/126686}.)

@item 
On Windows, the @ref{1ea,,CopyComPointer()} function is now public.
(Contributed by Jun Komoda in gh-127275@footnote{https://github.com/python/cpython/issues/127275}.)

@item 
Add @ref{1eb,,memoryview_at()}, a function to create a
@ref{165,,memoryview} object that refers to the supplied pointer and
length. This works like @ref{1ec,,ctypes.string_at()} except it avoids a
buffer copy, and is typically useful when implementing pure Python
callback functions that are passed dynamically-sized buffers.
(Contributed by Rian Hunter in gh-112018@footnote{https://github.com/python/cpython/issues/112018}.)

@item 
Complex types, @ref{1ed,,c_float_complex},
@ref{1ee,,c_double_complex}, and @ref{1ef,,c_longdouble_complex},
are now available if both the compiler and the @code{libffi} library support
complex C types.
(Contributed by Sergey B Kirpichev in gh-61103@footnote{https://github.com/python/cpython/issues/61103}.)

@item 
Add @ref{1f0,,ctypes.util.dllist()} for listing the shared libraries
loaded by the current process.
(Contributed by Brian Ward in gh-119349@footnote{https://github.com/python/cpython/issues/119349}.)

@item 
Move @ref{1f1,,ctypes.POINTER()} types cache from a global internal cache
(@code{_pointer_type_cache}) to the @ref{1f2,,_CData.__pointer_type__} attribute of the corresponding
@code{ctypes} types.
This will stop the cache from growing without limits in some situations.
(Contributed by Sergey Miryanov in gh-100926@footnote{https://github.com/python/cpython/issues/100926}.)

@item 
The @ref{1f3,,py_object} type now supports subscription,
making it a @ref{1a1,,generic type}.
(Contributed by Brian Schubert in gh-132168@footnote{https://github.com/python/cpython/issues/132168}.)

@item 
@code{ctypes} now supports @ref{1f4,,free-threading builds}.
(Contributed by Kumar Aditya and Peter Bierma in gh-127945@footnote{https://github.com/python/cpython/issues/127945}.)
@end itemize

@node curses,datetime,ctypes,Improved modules
@anchor{whatsnew/3 14 curses}@anchor{1f5}
@subsubsection curses



@itemize *

@item 
Add the @ref{1f6,,assume_default_colors()} function,
a refinement of the @ref{1f7,,use_default_colors()} function which
allows changing the color pair @code{0}.
(Contributed by Serhiy Storchaka in gh-133139@footnote{https://github.com/python/cpython/issues/133139}.)
@end itemize

@node datetime,decimal,curses,Improved modules
@anchor{whatsnew/3 14 datetime}@anchor{1f8}
@subsubsection datetime



@itemize *

@item 
Add the @ref{1f9,,strptime()} method to the
@ref{1fa,,datetime.date} and @ref{1fb,,datetime.time} classes.
(Contributed by Wannes Boeykens in gh-41431@footnote{https://github.com/python/cpython/issues/41431}.)
@end itemize

@node decimal,difflib,datetime,Improved modules
@anchor{whatsnew/3 14 decimal}@anchor{1fc}
@subsubsection decimal



@itemize *

@item 
Add @ref{1fd,,Decimal.from_number()} as an alternative constructor for
@ref{1fe,,Decimal}.
(Contributed by Serhiy Storchaka in gh-121798@footnote{https://github.com/python/cpython/issues/121798}.)

@item 
Expose @ref{1ff,,IEEEContext()} to support creation of contexts
corresponding to the IEEE 754 (2008) decimal interchange formats.
(Contributed by Sergey B Kirpichev in gh-53032@footnote{https://github.com/python/cpython/issues/53032}.)
@end itemize

@node difflib,dis,decimal,Improved modules
@anchor{whatsnew/3 14 difflib}@anchor{200}
@subsubsection difflib



@itemize *

@item 
Comparison pages with highlighted changes generated by the
@ref{201,,HtmlDiff} class now support ‘dark mode’.
(Contributed by Jiahao Li in gh-129939@footnote{https://github.com/python/cpython/issues/129939}.)
@end itemize

@node dis,errno,difflib,Improved modules
@anchor{whatsnew/3 14 dis}@anchor{202}
@subsubsection dis



@itemize *

@item 
Add support for rendering full source location information of
@ref{203,,instructions}, rather than only the line number.
This feature is added to the following interfaces via the `show_positions'
keyword argument:


@itemize -

@item 
@ref{204,,dis.Bytecode}

@item 
@ref{205,,dis.dis()}

@item 
@ref{206,,dis.distb()}

@item 
@ref{207,,dis.disassemble()}
@end itemize

This feature is also exposed via @ref{208,,dis --show-positions}.
(Contributed by Bénédikt Tran in gh-123165@footnote{https://github.com/python/cpython/issues/123165}.)

@item 
Add the @ref{209,,dis --specialized} command-line option to
show specialized bytecode.
(Contributed by Bénédikt Tran in gh-127413@footnote{https://github.com/python/cpython/issues/127413}.)
@end itemize

@node errno,faulthandler,dis,Improved modules
@anchor{whatsnew/3 14 errno}@anchor{20a}
@subsubsection errno



@itemize *

@item 
Add the @ref{20b,,EHWPOISON} error code constant.
(Contributed by James Roy in gh-126585@footnote{https://github.com/python/cpython/issues/126585}.)
@end itemize

@node faulthandler,fnmatch,errno,Improved modules
@anchor{whatsnew/3 14 faulthandler}@anchor{20c}
@subsubsection faulthandler



@itemize *

@item 
Add support for printing the C stack trace on systems that
@ref{20d,,support it} via the new
@ref{20e,,dump_c_stack()} function or via the `c_stack' argument
in @ref{20f,,faulthandler.enable()}.
(Contributed by Peter Bierma in gh-127604@footnote{https://github.com/python/cpython/issues/127604}.)
@end itemize

@node fnmatch,fractions,faulthandler,Improved modules
@anchor{whatsnew/3 14 fnmatch}@anchor{210}
@subsubsection fnmatch



@itemize *

@item 
Add @ref{211,,filterfalse()}, a function to reject names
matching a given pattern.
(Contributed by Bénédikt Tran in gh-74598@footnote{https://github.com/python/cpython/issues/74598}.)
@end itemize

@node fractions,functools,fnmatch,Improved modules
@anchor{whatsnew/3 14 fractions}@anchor{212}
@subsubsection fractions



@itemize *

@item 
A @ref{213,,Fraction} object may now be constructed from any
object with the @code{as_integer_ratio()} method.
(Contributed by Serhiy Storchaka in gh-82017@footnote{https://github.com/python/cpython/issues/82017}.)

@item 
Add @ref{214,,Fraction.from_number()} as an alternative constructor for
@ref{213,,Fraction}.
(Contributed by Serhiy Storchaka in gh-121797@footnote{https://github.com/python/cpython/issues/121797}.)
@end itemize

@node functools,getopt,fractions,Improved modules
@anchor{whatsnew/3 14 functools}@anchor{215}
@subsubsection functools



@itemize *

@item 
Add the @ref{216,,Placeholder} sentinel.
This may be used with the @ref{217,,partial()}
or @ref{218,,partialmethod()} functions to reserve a place
for positional arguments in the returned @ref{219,,partial object}.
(Contributed by Dominykas Grigonis in gh-119127@footnote{https://github.com/python/cpython/issues/119127}.)

@item 
Allow the `initial' parameter of @ref{21a,,reduce()} to be passed
as a keyword argument.
(Contributed by Sayandip Dutta in gh-125916@footnote{https://github.com/python/cpython/issues/125916}.)
@end itemize

@node getopt,getpass,functools,Improved modules
@anchor{whatsnew/3 14 getopt}@anchor{21b}
@subsubsection getopt



@itemize *

@item 
Add support for options with optional arguments.
(Contributed by Serhiy Storchaka in gh-126374@footnote{https://github.com/python/cpython/issues/126374}.)

@item 
Add support for returning intermixed options and non-option arguments in order.
(Contributed by Serhiy Storchaka in gh-126390@footnote{https://github.com/python/cpython/issues/126390}.)
@end itemize

@node getpass,graphlib,getopt,Improved modules
@anchor{whatsnew/3 14 getpass}@anchor{21c}
@subsubsection getpass



@itemize *

@item 
Support keyboard feedback in the @ref{21d,,getpass()} function via
the keyword-only optional argument `echo_char'.
Placeholder characters are rendered whenever a character is entered,
and removed when a character is deleted.
(Contributed by Semyon Moroz in gh-77065@footnote{https://github.com/python/cpython/issues/77065}.)
@end itemize

@node graphlib,heapq,getpass,Improved modules
@anchor{whatsnew/3 14 graphlib}@anchor{21e}
@subsubsection graphlib



@itemize *

@item 
Allow @ref{21f,,TopologicalSorter.prepare()} to be called more than once
as long as sorting has not started.
(Contributed by Daniel Pope in gh-130914@footnote{https://github.com/python/cpython/issues/130914}.)
@end itemize

@node heapq,hmac,graphlib,Improved modules
@anchor{whatsnew/3 14 heapq}@anchor{220}
@subsubsection heapq



@itemize *

@item 
The @code{heapq} module has improved support for working with max-heaps,
via the following new functions:


@itemize *

@item 
@ref{221,,heapify_max()}

@item 
@ref{222,,heappush_max()}

@item 
@ref{223,,heappop_max()}

@item 
@ref{224,,heapreplace_max()}

@item 
@ref{225,,heappushpop_max()}
@end itemize
@end itemize

@node hmac,http,heapq,Improved modules
@anchor{whatsnew/3 14 hmac}@anchor{226}
@subsubsection hmac



@itemize *

@item 
Add a built-in implementation for HMAC (
@geindex RFC; RFC 2104
RFC 2104@footnote{https://datatracker.ietf.org/doc/html/rfc2104.html}) using formally verified
code from the HACL*@footnote{https://github.com/hacl-star/hacl-star/} project.
This implementation is used as a fallback when the OpenSSL implementation
of HMAC is not available.
(Contributed by Bénédikt Tran in gh-99108@footnote{https://github.com/python/cpython/issues/99108}.)
@end itemize

@node http,imaplib,hmac,Improved modules
@anchor{whatsnew/3 14 http}@anchor{227}
@subsubsection http



@itemize *

@item 
Directory lists and error pages generated by the @ref{76,,http.server}
module allow the browser to apply its default dark mode.
(Contributed by Yorik Hansen in gh-123430@footnote{https://github.com/python/cpython/issues/123430}.)

@item 
The @ref{76,,http.server} module now supports serving over HTTPS using the
@ref{228,,http.server.HTTPSServer} class. This functionality is exposed by
the command-line interface (@code{python -m http.server}) through the following
options:


@itemize *

@item 
@ref{229,,--tls-cert <path>}:
Path to the TLS certificate file.

@item 
@ref{22a,,--tls-key <path>}:
Optional path to the private key file.

@item 
@ref{22b,,--tls-password-file <path>}:
Optional path to the password file for the private key.
@end itemize

(Contributed by Semyon Moroz in gh-85162@footnote{https://github.com/python/cpython/issues/85162}.)
@end itemize

@node imaplib,inspect,http,Improved modules
@anchor{whatsnew/3 14 imaplib}@anchor{22c}
@subsubsection imaplib



@itemize *

@item 
Add @ref{22d,,IMAP4.idle()}, implementing the IMAP4
@code{IDLE} command as defined in 
@geindex RFC; RFC 2177
RFC 2177@footnote{https://datatracker.ietf.org/doc/html/rfc2177.html}.
(Contributed by Forest in gh-55454@footnote{https://github.com/python/cpython/issues/55454}.)
@end itemize

@node inspect,io,imaplib,Improved modules
@anchor{whatsnew/3 14 inspect}@anchor{22e}
@subsubsection inspect



@itemize *

@item 
@ref{22f,,signature()} takes a new argument `annotation_format' to control
the @ref{230,,annotationlib.Format} used for representing annotations.
(Contributed by Jelle Zijlstra in gh-101552@footnote{https://github.com/python/cpython/issues/101552}.)

@item 
@ref{231,,Signature.format()} takes a new argument `unquote_annotations'.
If true, string @ref{15c,,annotations} are displayed without
surrounding quotes.
(Contributed by Jelle Zijlstra in gh-101552@footnote{https://github.com/python/cpython/issues/101552}.)

@item 
Add function @ref{232,,ispackage()} to determine whether an object is a
@ref{233,,package} or not.
(Contributed by Zhikang Yan in gh-125634@footnote{https://github.com/python/cpython/issues/125634}.)
@end itemize

@node io,json,inspect,Improved modules
@anchor{whatsnew/3 14 io}@anchor{234}
@subsubsection io



@itemize *

@item 
Reading text from a non-blocking stream with @code{read} may now raise a
@ref{235,,BlockingIOError} if the operation cannot immediately return bytes.
(Contributed by Giovanni Siragusa in gh-109523@footnote{https://github.com/python/cpython/issues/109523}.)

@item 
Add the @ref{236,,Reader} and @ref{237,,Writer} protocols as simpler
alternatives to the pseudo-protocols @ref{238,,typing.IO},
@ref{239,,typing.TextIO}, and @ref{23a,,typing.BinaryIO}.
(Contributed by Sebastian Rittau in gh-127648@footnote{https://github.com/python/cpython/issues/127648}.)
@end itemize

@node json,linecache,io,Improved modules
@anchor{whatsnew/3 14 json}@anchor{23b}
@subsubsection json



@itemize *

@item 
Add exception notes for JSON serialization errors that allow
identifying the source of the error.
(Contributed by Serhiy Storchaka in gh-122163@footnote{https://github.com/python/cpython/issues/122163}.)

@item 
Allow using the @ref{86,,json} module as a script using the @ref{23c,,-m} switch:
@code{python -m json}.
This is now preferred to @code{python -m json.tool},
which is @ref{23d,,soft deprecated}.
See the @ref{23e,,JSON command-line interface} documentation.
(Contributed by Trey Hunner in gh-122873@footnote{https://github.com/python/cpython/issues/122873}.)

@item 
By default, the output of the @ref{23e,,JSON command-line interface} is highlighted in color.
This can be controlled by @ref{1b7,,environment variables}.
(Contributed by Tomas Roun in gh-131952@footnote{https://github.com/python/cpython/issues/131952}.)
@end itemize

@node linecache,logging handlers,json,Improved modules
@anchor{whatsnew/3 14 linecache}@anchor{23f}
@subsubsection linecache



@itemize *

@item 
@ref{240,,getline()} can now retrieve source code for frozen modules.
(Contributed by Tian Gao in gh-131638@footnote{https://github.com/python/cpython/issues/131638}.)
@end itemize

@node logging handlers,math,linecache,Improved modules
@anchor{whatsnew/3 14 logging-handlers}@anchor{241}
@subsubsection logging.handlers



@itemize *

@item 
@ref{242,,QueueListener} objects now support the
@ref{1e1,,context manager} protocol.
(Contributed by Charles Machalow in gh-132106@footnote{https://github.com/python/cpython/issues/132106}.)

@item 
@ref{243,,QueueListener.start} now
raises a @ref{244,,RuntimeError} if the listener is already started.
(Contributed by Charles Machalow in gh-132106@footnote{https://github.com/python/cpython/issues/132106}.)
@end itemize

@node math,mimetypes,logging handlers,Improved modules
@anchor{whatsnew/3 14 math}@anchor{245}
@subsubsection math



@itemize *

@item 
Added more detailed error messages for domain errors in the module.
(Contributed by Charlie Zhao and Sergey B Kirpichev in gh-101410@footnote{https://github.com/python/cpython/issues/101410}.)
@end itemize

@node mimetypes,multiprocessing,math,Improved modules
@anchor{whatsnew/3 14 mimetypes}@anchor{246}
@subsubsection mimetypes



@itemize *

@item 
Add a public @ref{247,,command-line} for the module,
invoked via @code{python -m mimetypes}.
(Contributed by Oleg Iarygin and Hugo van Kemenade in gh-93096@footnote{https://github.com/python/cpython/issues/93096}.)

@item 
Add several new MIME types based on RFCs and common usage:

@subsubheading Microsoft and 
@geindex RFC; RFC 8081
RFC 8081@footnote{https://datatracker.ietf.org/doc/html/rfc8081.html} MIME types for fonts



@itemize *

@item 
Embedded OpenType: @code{application/vnd.ms-fontobject}

@item 
OpenType Layout (OTF) @code{font/otf}

@item 
TrueType: @code{font/ttf}

@item 
WOFF 1.0 @code{font/woff}

@item 
WOFF 2.0 @code{font/woff2}
@end itemize

@subsubheading 
@geindex RFC; RFC 9559
RFC 9559@footnote{https://datatracker.ietf.org/doc/html/rfc9559.html} MIME types for Matroska audiovisual data container structures



@itemize *

@item 
audio with no video: @code{audio/matroska} (@code{.mka})

@item 
video: @code{video/matroska} (@code{.mkv})

@item 
stereoscopic video: @code{video/matroska-3d} (@code{.mk3d})
@end itemize

@subsubheading Images with RFCs



@itemize *

@item 
@geindex RFC; RFC 1494
RFC 1494@footnote{https://datatracker.ietf.org/doc/html/rfc1494.html}: CCITT Group 3 (@code{.g3})

@item 
@geindex RFC; RFC 3362
RFC 3362@footnote{https://datatracker.ietf.org/doc/html/rfc3362.html}: Real-time Facsimile, T.38 (@code{.t38})

@item 
@geindex RFC; RFC 3745
RFC 3745@footnote{https://datatracker.ietf.org/doc/html/rfc3745.html}: JPEG 2000 (@code{.jp2}), extension (@code{.jpx}) and compound (@code{.jpm})

@item 
@geindex RFC; RFC 3950
RFC 3950@footnote{https://datatracker.ietf.org/doc/html/rfc3950.html}: Tag Image File Format Fax eXtended, TIFF-FX (@code{.tfx})

@item 
@geindex RFC; RFC 4047
RFC 4047@footnote{https://datatracker.ietf.org/doc/html/rfc4047.html}: Flexible Image Transport System (@code{.fits})

@item 
@geindex RFC; RFC 7903
RFC 7903@footnote{https://datatracker.ietf.org/doc/html/rfc7903.html}: Enhanced Metafile (@code{.emf}) and Windows Metafile (@code{.wmf})
@end itemize

@subsubheading Other MIME type additions and changes



@itemize *

@item 
@geindex RFC; RFC 2361
RFC 2361@footnote{https://datatracker.ietf.org/doc/html/rfc2361.html}: Change type for @code{.avi} to @code{video/vnd.avi}
and for @code{.wav} to @code{audio/vnd.wave}

@item 
@geindex RFC; RFC 4337
RFC 4337@footnote{https://datatracker.ietf.org/doc/html/rfc4337.html}: Add MPEG-4 @code{audio/mp4} (@code{.m4a})

@item 
@geindex RFC; RFC 5334
RFC 5334@footnote{https://datatracker.ietf.org/doc/html/rfc5334.html}: Add Ogg media (@code{.oga}, @code{.ogg} and @code{.ogx})

@item 
@geindex RFC; RFC 6713
RFC 6713@footnote{https://datatracker.ietf.org/doc/html/rfc6713.html}: Add gzip @code{application/gzip} (@code{.gz})

@item 
@geindex RFC; RFC 9639
RFC 9639@footnote{https://datatracker.ietf.org/doc/html/rfc9639.html}: Add FLAC @code{audio/flac} (@code{.flac})

@item 
@geindex RFC; RFC 9512
RFC 9512@footnote{https://datatracker.ietf.org/doc/html/rfc9512.html} @code{application/yaml} MIME type for YAML files (@code{.yaml}
and @code{.yml})

@item 
Add 7z @code{application/x-7z-compressed} (@code{.7z})

@item 
Add Android Package @code{application/vnd.android.package-archive} (@code{.apk})
when not strict

@item 
Add deb @code{application/x-debian-package} (@code{.deb})

@item 
Add glTF binary @code{model/gltf-binary} (@code{.glb})

@item 
Add glTF JSON/ASCII @code{model/gltf+json} (@code{.gltf})

@item 
Add M4V @code{video/x-m4v} (@code{.m4v})

@item 
Add PHP @code{application/x-httpd-php} (@code{.php})

@item 
Add RAR @code{application/vnd.rar} (@code{.rar})

@item 
Add RPM @code{application/x-rpm} (@code{.rpm})

@item 
Add STL @code{model/stl} (@code{.stl})

@item 
Add Windows Media Video @code{video/x-ms-wmv} (@code{.wmv})

@item 
De facto: Add WebM @code{audio/webm} (@code{.weba})

@item 
ECMA-376@footnote{https://ecma-international.org/publications-and-standards/standards/ecma-376/}:
Add @code{.docx}, @code{.pptx} and @code{.xlsx} types

@item 
OASIS@footnote{https://docs.oasis-open.org/office/v1.2/cs01/OpenDocument-v1.2-cs01-part1.html#Appendix_C}:
Add OpenDocument @code{.odg}, @code{.odp}, @code{.ods} and @code{.odt} types

@item 
W3C@footnote{https://www.w3.org/TR/epub-33/#app-media-type}:
Add EPUB @code{application/epub+zip} (@code{.epub})
@end itemize

(Contributed by Sahil Prajapati and Hugo van Kemenade in gh-84852@footnote{https://github.com/python/cpython/issues/84852},
by Sasha “Nelie” Chernykh and Hugo van Kemenade in gh-132056@footnote{https://github.com/python/cpython/issues/132056},
and by Hugo van Kemenade in gh-89416@footnote{https://github.com/python/cpython/issues/89416}, gh-85957@footnote{https://github.com/python/cpython/issues/85957}, and gh-129965@footnote{https://github.com/python/cpython/issues/129965}.)
@end itemize

@node multiprocessing,operator,mimetypes,Improved modules
@anchor{whatsnew/3 14 multiprocessing}@anchor{248}
@subsubsection multiprocessing

@anchor{whatsnew/3 14 whatsnew314-multiprocessing-start-method}@anchor{249}

@itemize *

@item 
On Unix platforms other than macOS, @ref{1d4,,‘forkserver’} is now the default @ref{1d5,,start method}
(replacing @ref{1d7,,‘fork’}).
This change does not affect Windows or macOS, where @ref{1d8,,‘spawn’} remains the default start method.

If the threading incompatible `fork' method is required, you must explicitly
request it via a context from @ref{24a,,get_context()} (preferred)
or change the default via @ref{24b,,set_start_method()}.

See @ref{1d9,,forkserver restrictions}
for information and differences with the `fork' method and how this change
may affect existing code with mutable global shared variables and/or shared
objects that can not be automatically @ref{ab,,pickled}.

(Contributed by Gregory P. Smith in gh-84559@footnote{https://github.com/python/cpython/issues/84559}.)

@item 
@ref{98,,multiprocessing}’s @code{'forkserver'} start method now authenticates
its control socket to avoid solely relying on filesystem permissions
to restrict what other processes could cause the forkserver to spawn workers
and run code.
(Contributed by Gregory P. Smith for gh-97514@footnote{https://github.com/python/cpython/issues/97514}.)

@item 
The @ref{24c,,multiprocessing proxy objects}
for `list' and `dict' types gain previously overlooked missing methods:

@quotation


@itemize *

@item 
@code{clear()} and @code{copy()} for proxies of @ref{24d,,list}

@item 
@ref{24e,,fromkeys()}, @code{reversed(d)}, @code{d | @{@}}, @code{@{@} | d},
@code{d |= @{'b': 2@}} for proxies of @ref{183,,dict}
@end itemize
@end quotation

(Contributed by Roy Hyunjin Han for gh-103134@footnote{https://github.com/python/cpython/issues/103134}.)

@item 
Add support for shared @ref{184,,set} objects via
@ref{24f,,SyncManager.set()}.
The @ref{184,,set()} in @ref{250,,Manager()} method is now available.
(Contributed by Mingyu Park in gh-129949@footnote{https://github.com/python/cpython/issues/129949}.)

@item 
Add the @ref{251,,interrupt()}
to @ref{252,,multiprocessing.Process} objects, which terminates the child
process by sending @ref{253,,SIGINT}. This enables
@ref{1b0,,finally} clauses to print a stack trace for the terminated
process. (Contributed by Artem Pulkin in gh-131913@footnote{https://github.com/python/cpython/issues/131913}.)
@end itemize

@node operator,os,multiprocessing,Improved modules
@anchor{whatsnew/3 14 operator}@anchor{254}
@subsubsection operator



@itemize *

@item 
Add @ref{255,,is_none()} and @ref{256,,is_not_none()} as a pair
of functions, such that @code{operator.is_none(obj)} is equivalent
to @code{obj is None} and @code{operator.is_not_none(obj)} is equivalent
to @code{obj is not None}.
(Contributed by Raymond Hettinger and Nico Mexis in gh-115808@footnote{https://github.com/python/cpython/issues/115808}.)
@end itemize

@node os,os path,operator,Improved modules
@anchor{whatsnew/3 14 os}@anchor{257}
@subsubsection os



@itemize *

@item 
Add the @ref{258,,reload_environ()} function to update @ref{259,,os.environ} and
@ref{25a,,os.environb} with changes to the environment made by
@ref{25b,,os.putenv()}, by @ref{25c,,os.unsetenv()}, or made outside Python in the
same process.
(Contributed by Victor Stinner in gh-120057@footnote{https://github.com/python/cpython/issues/120057}.)

@item 
Add the @ref{25d,,SCHED_DEADLINE} and @ref{25e,,SCHED_NORMAL} constants
to the @code{os} module.
(Contributed by James Roy in gh-127688@footnote{https://github.com/python/cpython/issues/127688}.)

@item 
Add the @ref{25f,,readinto()} function to read into a
@ref{260,,buffer object} from a file descriptor.
(Contributed by Cody Maloney in gh-129205@footnote{https://github.com/python/cpython/issues/129205}.)
@end itemize

@node os path,pathlib,os,Improved modules
@anchor{whatsnew/3 14 os-path}@anchor{261}
@subsubsection os.path



@itemize *

@item 
The `strict' parameter to @ref{262,,realpath()} accepts a new value,
@ref{263,,ALLOW_MISSING}.
If used, errors other than @ref{264,,FileNotFoundError} will be re-raised;
the resulting path can be missing but it will be free of symlinks.
(Contributed by Petr Viktorin for 
@geindex Common Vulnerabilities and Exposures; CVE 2025-4517
CVE 2025-4517@footnote{https://www.cve.org/CVERecord?id=CVE-2025-4517}.)
@end itemize

@node pathlib,pdb,os path,Improved modules
@anchor{whatsnew/3 14 pathlib}@anchor{265}
@subsubsection pathlib



@itemize *

@item 
Add methods to @ref{266,,pathlib.Path} to recursively copy or move files and
directories:


@itemize *

@item 
@ref{267,,copy()} copies a file or directory tree to a destination.

@item 
@ref{268,,copy_into()} copies `into' a destination directory.

@item 
@ref{269,,move()} moves a file or directory tree to a destination.

@item 
@ref{26a,,move_into()} moves `into' a destination directory.
@end itemize

(Contributed by Barney Gale in gh-73991@footnote{https://github.com/python/cpython/issues/73991}.)

@item 
Add the @ref{26b,,info} attribute, which stores an object
implementing the new @ref{26c,,pathlib.types.PathInfo} protocol. The
object supports querying the file type and internally caching
@ref{26d,,stat()} results. Path objects generated by
@ref{26e,,iterdir()} are initialized with file type information
gleaned from scanning the parent directory.
(Contributed by Barney Gale in gh-125413@footnote{https://github.com/python/cpython/issues/125413}.)
@end itemize

@node pdb,pickle,pathlib,Improved modules
@anchor{whatsnew/3 14 pdb}@anchor{26f}
@subsubsection pdb



@itemize *

@item 
The @ref{aa,,pdb} module now supports remote attaching to a running Python process
using a new @ref{270,,-p PID} command-line option:

@example
python -m pdb -p 1234
@end example

This will connect to the Python process with the given PID and allow you to
debug it interactively. Notice that due to how the Python interpreter works
attaching to a remote process that is blocked in a system call or waiting for
I/O will only work once the next bytecode instruction is executed or when the
process receives a signal.

This feature uses @ref{14e,,PEP 768}
and the new @ref{16d,,sys.remote_exec()} function to attach to the remote process
and send the PDB commands to it.

(Contributed by Matt Wozniski and Pablo Galindo in gh-131591@footnote{https://github.com/python/cpython/issues/131591}.)

@item 
Hardcoded breakpoints (@ref{271,,breakpoint()} and @ref{272,,set_trace()}) now
reuse the most recent @ref{273,,Pdb} instance that calls
@ref{274,,set_trace()}, instead of creating a new one each time.
As a result, all the instance specific data like @ref{275,,display} and
@ref{276,,commands} are preserved across hardcoded breakpoints.
(Contributed by Tian Gao in gh-121450@footnote{https://github.com/python/cpython/issues/121450}.)

@item 
Add a new argument `mode' to @ref{273,,pdb.Pdb}. Disable the @code{restart}
command when @ref{aa,,pdb} is in @code{inline} mode.
(Contributed by Tian Gao in gh-123757@footnote{https://github.com/python/cpython/issues/123757}.)

@item 
A confirmation prompt will be shown when the user tries to quit @ref{aa,,pdb}
in @code{inline} mode. @code{y}, @code{Y}, @code{<Enter>} or @code{EOF} will confirm
the quit and call @ref{277,,sys.exit()}, instead of raising @ref{278,,bdb.BdbQuit}.
(Contributed by Tian Gao in gh-124704@footnote{https://github.com/python/cpython/issues/124704}.)

@item 
Inline breakpoints like @ref{271,,breakpoint()} or @ref{272,,pdb.set_trace()} will
always stop the program at calling frame, ignoring the @code{skip} pattern
(if any).
(Contributed by Tian Gao in gh-130493@footnote{https://github.com/python/cpython/issues/130493}.)

@item 
@code{<tab>} at the beginning of the line in @ref{aa,,pdb} multi-line input will
fill in a 4-space indentation now, instead of inserting a @code{\t} character.
(Contributed by Tian Gao in gh-130471@footnote{https://github.com/python/cpython/issues/130471}.)

@item 
Auto-indent is introduced in @ref{aa,,pdb} multi-line input. It will either
keep the indentation of the last line or insert a 4-space indentation when
it detects a new code block.
(Contributed by Tian Gao in gh-133350@footnote{https://github.com/python/cpython/issues/133350}.)

@item 
@code{$_asynctask} is added to access the current asyncio task if applicable.
(Contributed by Tian Gao in gh-124367@footnote{https://github.com/python/cpython/issues/124367}.)

@item 
@ref{279,,pdb.set_trace_async()} is added to support debugging asyncio
coroutines. @ref{18d,,await} statements are supported with this
function.
(Contributed by Tian Gao in gh-132576@footnote{https://github.com/python/cpython/issues/132576}.)

@item 
Source code displayed in @ref{aa,,pdb} will be syntax-highlighted. This feature
can be controlled using the same methods as the default @ref{1b5,,interactive}
shell, in addition to the newly added @code{colorize} argument of @ref{273,,pdb.Pdb}.
(Contributed by Tian Gao and Łukasz Langa in gh-133355@footnote{https://github.com/python/cpython/issues/133355}.)
@end itemize

@node pickle,platform,pdb,Improved modules
@anchor{whatsnew/3 14 pickle}@anchor{27a}
@subsubsection pickle



@itemize *

@item 
Set the default protocol version on the @ref{ab,,pickle} module to 5.
For more details, see @ref{27b,,pickle protocols}.

@item 
Add exception notes for pickle serialization errors that allow
identifying the source of the error.
(Contributed by Serhiy Storchaka in gh-122213@footnote{https://github.com/python/cpython/issues/122213}.)
@end itemize

@node platform,pydoc,pickle,Improved modules
@anchor{whatsnew/3 14 platform}@anchor{27c}
@subsubsection platform



@itemize *

@item 
Add @ref{27d,,invalidate_caches()}, a function to invalidate
cached results in the @code{platform} module.
(Contributed by Bénédikt Tran in gh-122549@footnote{https://github.com/python/cpython/issues/122549}.)
@end itemize

@node pydoc,re,platform,Improved modules
@anchor{whatsnew/3 14 pydoc}@anchor{27e}
@subsubsection pydoc



@itemize *

@item 
@ref{15c,,Annotations} in help output are now usually
displayed in a format closer to that in the original source.
(Contributed by Jelle Zijlstra in gh-101552@footnote{https://github.com/python/cpython/issues/101552}.)
@end itemize

@node re,socket,pydoc,Improved modules
@anchor{whatsnew/3 14 re}@anchor{27f}
@subsubsection re



@itemize *

@item 
Support @code{\z} as a synonym for @code{\Z} in @ref{be,,regular expressions}.
It is interpreted unambiguously in many other regular expression engines,
unlike @code{\Z}, which has subtly different behavior.
(Contributed by Serhiy Storchaka in gh-133306@footnote{https://github.com/python/cpython/issues/133306}.)

@item 
@code{\B} in @ref{be,,regular expression} now matches the empty input string,
meaning that it is now always the opposite of @code{\b}.
(Contributed by Serhiy Storchaka in gh-124130@footnote{https://github.com/python/cpython/issues/124130}.)
@end itemize

@node socket,ssl,re,Improved modules
@anchor{whatsnew/3 14 socket}@anchor{280}
@subsubsection socket



@itemize *

@item 
Improve and fix support for Bluetooth sockets.


@itemize *

@item 
Fix support of Bluetooth sockets on NetBSD and DragonFly BSD.
(Contributed by Serhiy Storchaka in gh-132429@footnote{https://github.com/python/cpython/issues/132429}.)

@item 
Fix support for @ref{281,,BTPROTO_HCI} on FreeBSD.
(Contributed by Victor Stinner in gh-111178@footnote{https://github.com/python/cpython/issues/111178}.)

@item 
Add support for @ref{282,,BTPROTO_SCO} on FreeBSD.
(Contributed by Serhiy Storchaka in gh-85302@footnote{https://github.com/python/cpython/issues/85302}.)

@item 
Add support for `cid' and `bdaddr_type' in the address for
@ref{283,,BTPROTO_L2CAP} on FreeBSD.
(Contributed by Serhiy Storchaka in gh-132429@footnote{https://github.com/python/cpython/issues/132429}.)

@item 
Add support for `channel' in the address for
@ref{281,,BTPROTO_HCI} on Linux.
(Contributed by Serhiy Storchaka in gh-70145@footnote{https://github.com/python/cpython/issues/70145}.)

@item 
Accept an integer as the address for
@ref{281,,BTPROTO_HCI} on Linux.
(Contributed by Serhiy Storchaka in gh-132099@footnote{https://github.com/python/cpython/issues/132099}.)

@item 
Return `cid' in @ref{284,,getsockname()} for
@ref{283,,BTPROTO_L2CAP}.
(Contributed by Serhiy Storchaka in gh-132429@footnote{https://github.com/python/cpython/issues/132429}.)

@item 
Add many new constants.
(Contributed by Serhiy Storchaka in gh-132734@footnote{https://github.com/python/cpython/issues/132734}.)
@end itemize
@end itemize

@node ssl,struct,socket,Improved modules
@anchor{whatsnew/3 14 ssl}@anchor{285}
@subsubsection ssl



@itemize *

@item 
Indicate through the @ref{286,,HAS_PHA} Boolean whether the @code{ssl}
module supports TLSv1.3 post-handshake client authentication (PHA).
(Contributed by Will Childs-Klein in gh-128036@footnote{https://github.com/python/cpython/issues/128036}.)
@end itemize

@node struct,symtable,ssl,Improved modules
@anchor{whatsnew/3 14 struct}@anchor{287}
@subsubsection struct



@itemize *

@item 
Support the float complex and double complex C types in
the @ref{db,,struct} module (formatting characters @code{'F'} and @code{'D'}
respectively).
(Contributed by Sergey B Kirpichev in gh-121249@footnote{https://github.com/python/cpython/issues/121249}.)
@end itemize

@node symtable,sys,struct,Improved modules
@anchor{whatsnew/3 14 symtable}@anchor{288}
@subsubsection symtable



@itemize *

@item 
Expose the following @ref{289,,Symbol} methods:


@itemize *

@item 
@ref{28a,,is_comp_cell()}

@item 
@ref{28b,,is_comp_iter()}

@item 
@ref{28c,,is_free_class()}
@end itemize

(Contributed by Bénédikt Tran in gh-120029@footnote{https://github.com/python/cpython/issues/120029}.)
@end itemize

@node sys,sys monitoring,symtable,Improved modules
@anchor{whatsnew/3 14 sys}@anchor{28d}
@subsubsection sys



@itemize *

@item 
The previously undocumented special function @ref{28e,,sys.getobjects()},
which only exists in specialized builds of Python, may now return objects
from other interpreters than the one it’s called in.
(Contributed by Eric Snow in gh-125286@footnote{https://github.com/python/cpython/issues/125286}.)

@item 
Add @ref{28f,,sys._is_immortal()} for determining if an object is @ref{290,,immortal}.
(Contributed by Peter Bierma in gh-128509@footnote{https://github.com/python/cpython/issues/128509}.)

@item 
On FreeBSD, @ref{291,,sys.platform} no longer contains the major version number.
It is always @code{'freebsd'}, instead of @code{'freebsd13'} or @code{'freebsd14'}.
(Contributed by Michael Osipov in gh-129393@footnote{https://github.com/python/cpython/issues/129393}.)

@item 
Raise @ref{1a3,,DeprecationWarning} for @ref{292,,sys._clear_type_cache()}. This
function was deprecated in Python 3.13 but it didn’t raise a runtime warning.

@item 
Add @ref{16d,,sys.remote_exec()} to implement the new external debugger interface.
See @ref{14e,,PEP 768} for details.
(Contributed by Pablo Galindo Salgado, Matt Wozniski, and Ivona Stojanovic
in gh-131591@footnote{https://github.com/python/cpython/issues/131591}.)

@item 
Add the @ref{293,,sys._jit} namespace, containing utilities for introspecting
just-in-time compilation.
(Contributed by Brandt Bucher in gh-133231@footnote{https://github.com/python/cpython/issues/133231}.)
@end itemize

@node sys monitoring,sysconfig,sys,Improved modules
@anchor{whatsnew/3 14 sys-monitoring}@anchor{294}
@subsubsection sys.monitoring



@itemize *

@item 
Add two new monitoring events, @ref{295,,BRANCH_LEFT} and
@ref{296,,BRANCH_RIGHT}.
These replace and deprecate the @code{BRANCH} event.
(Contributed by Mark Shannon in gh-122548@footnote{https://github.com/python/cpython/issues/122548}.)
@end itemize

@node sysconfig,tarfile,sys monitoring,Improved modules
@anchor{whatsnew/3 14 sysconfig}@anchor{297}
@subsubsection sysconfig



@itemize *

@item 
Add @code{ABIFLAGS} key to @ref{298,,get_config_vars()} on Windows.
(Contributed by Xuehai Pan in gh-131799@footnote{https://github.com/python/cpython/issues/131799}.)
@end itemize

@node tarfile,threading,sysconfig,Improved modules
@anchor{whatsnew/3 14 tarfile}@anchor{299}
@subsubsection tarfile



@itemize *

@item 
@ref{29a,,data_filter()} now normalizes symbolic link targets in order to
avoid path traversal attacks.
(Contributed by Petr Viktorin in gh-127987@footnote{https://github.com/python/cpython/issues/127987} and 
@geindex Common Vulnerabilities and Exposures; CVE 2025-4138
CVE 2025-4138@footnote{https://www.cve.org/CVERecord?id=CVE-2025-4138}.)

@item 
@ref{29b,,extractall()} now skips fixing up directory attributes
when a directory was removed or replaced by another kind of file.
(Contributed by Petr Viktorin in gh-127987@footnote{https://github.com/python/cpython/issues/127987} and 
@geindex Common Vulnerabilities and Exposures; CVE 2024-12718
CVE 2024-12718@footnote{https://www.cve.org/CVERecord?id=CVE-2024-12718}.)

@item 
@ref{29c,,extract()} and @ref{29b,,extractall()}
now (re-)apply the extraction filter when substituting a link (hard or
symbolic) with a copy of another archive member, and when fixing up
directory attributes.
The former raises a new exception, @ref{29d,,LinkFallbackError}.
(Contributed by Petr Viktorin for 
@geindex Common Vulnerabilities and Exposures; CVE 2025-4330
CVE 2025-4330@footnote{https://www.cve.org/CVERecord?id=CVE-2025-4330} and 
@geindex Common Vulnerabilities and Exposures; CVE 2024-12718
CVE 2024-12718@footnote{https://www.cve.org/CVERecord?id=CVE-2024-12718}.)

@item 
@ref{29c,,extract()} and @ref{29b,,extractall()}
no longer extract rejected members when
@ref{29e,,errorlevel()} is zero.
(Contributed by Matt Prodani and Petr Viktorin in gh-112887@footnote{https://github.com/python/cpython/issues/112887}
and 
@geindex Common Vulnerabilities and Exposures; CVE 2025-4435
CVE 2025-4435@footnote{https://www.cve.org/CVERecord?id=CVE-2025-4435}.)
@end itemize

@node threading,tkinter,tarfile,Improved modules
@anchor{whatsnew/3 14 threading}@anchor{29f}
@subsubsection threading



@itemize *

@item 
@ref{178,,threading.Thread.start()} now sets the operating system thread name
to @ref{2a0,,threading.Thread.name}.
(Contributed by Victor Stinner in gh-59705@footnote{https://github.com/python/cpython/issues/59705}.)
@end itemize

@node tkinter,turtle,threading,Improved modules
@anchor{whatsnew/3 14 tkinter}@anchor{2a1}
@subsubsection tkinter



@itemize *

@item 
Make @ref{f6,,tkinter} widget methods @code{after()} and @code{after_idle()}
accept keyword arguments.
(Contributed by Zhikang Yan in gh-126899@footnote{https://github.com/python/cpython/issues/126899}.)

@item 
Add ability to specify a name for @code{tkinter.OptionMenu} and
@code{tkinter.ttk.OptionMenu}.
(Contributed by Zhikang Yan in gh-130482@footnote{https://github.com/python/cpython/issues/130482}.)
@end itemize

@node turtle,types,tkinter,Improved modules
@anchor{whatsnew/3 14 turtle}@anchor{2a2}
@subsubsection turtle



@itemize *

@item 
Add context managers for @ref{2a3,,turtle.fill()}, @ref{2a4,,turtle.poly()},
and @ref{2a5,,turtle.no_animation()}.
(Contributed by Marie Roald and Yngve Mardal Moe in gh-126350@footnote{https://github.com/python/cpython/issues/126350}.)
@end itemize

@node types,typing,turtle,Improved modules
@anchor{whatsnew/3 14 types}@anchor{2a6}
@subsubsection types



@itemize *

@item 
@ref{2a7,,types.UnionType} is now an alias for @ref{2a8,,typing.Union}.
See @ref{2a9,,below} for more details.
(Contributed by Jelle Zijlstra in gh-105499@footnote{https://github.com/python/cpython/issues/105499}.)
@end itemize

@node typing,unicodedata,types,Improved modules
@anchor{whatsnew/3 14 typing}@anchor{2aa}
@subsubsection typing

@anchor{whatsnew/3 14 whatsnew314-typing-union}@anchor{2a9}

@itemize *

@item 
The @ref{2a7,,types.UnionType} and @ref{2a8,,typing.Union} types are now
aliases for each other, meaning that both old-style unions
(created with @code{Union[int, str]}) and new-style unions (@code{int | str})
now create instances of the same runtime type. This unifies the behavior
between the two syntaxes, but leads to some differences in behavior that
may affect users who introspect types at runtime:


@itemize -

@item 
Both syntaxes for creating a union now produce the same string
representation in @ref{1c1,,repr()}.
For example, @code{repr(Union[int, str])} is now @code{"int | str"} instead of
@code{"typing.Union[int, str]"}.

@item 
Unions created using the old syntax are no longer cached.
Previously, running @code{Union[int, str]} multiple times would return
the same object (@code{Union[int, str] is Union[int, str]} would be @code{True}),
but now it will return two different objects.
Use @code{==} to compare unions for equality, not @code{is}.
New-style unions have never been cached this way.
This change could increase memory usage for some programs that use
a large number of unions created by subscripting @code{typing.Union}.
However, several factors offset this cost:
unions used in annotations are no longer evaluated by default in Python
3.14 because of 
@geindex Python 향상 제안; PEP 649
PEP 649@footnote{https://peps.python.org/pep-0649/}; an instance of @ref{2a7,,types.UnionType} is
itself much smaller than the object returned by @code{Union[]} was on prior
Python versions; and removing the cache also saves some space.
It is therefore unlikely that this change will cause a significant increase
in memory usage for most users.

@item 
Previously, old-style unions were implemented using the private class
@code{typing._UnionGenericAlias}.
This class is no longer needed for the implementation,
but it has been retained for backward compatibility,
with removal scheduled for Python 3.17.
Users should use documented introspection helpers like
@ref{2ab,,get_origin()} and @ref{2ac,,typing.get_args()} instead of
relying on private implementation details.

@item 
It is now possible to use @ref{2a8,,typing.Union} itself in
@ref{2ad,,isinstance()} checks.
For example, @code{isinstance(int | str, typing.Union)} will return @code{True};
previously this raised @ref{198,,TypeError}.

@item 
The @code{__args__} attribute of @ref{2a8,,typing.Union} objects is
no longer writable.

@item 
It is no longer possible to set any attributes on @ref{2a8,,Union}
objects.
This only ever worked for dunder attributes on previous versions, was never
documented to work, and was subtly broken in many cases.
@end itemize

(Contributed by Jelle Zijlstra in gh-105499@footnote{https://github.com/python/cpython/issues/105499}.)

@item 
@ref{2ae,,TypeAliasType} now supports star unpacking.
@end itemize

@node unicodedata,unittest,typing,Improved modules
@anchor{whatsnew/3 14 unicodedata}@anchor{2af}
@subsubsection unicodedata



@itemize *

@item 
The Unicode database has been updated to Unicode 16.0.0.
@end itemize

@node unittest,urllib,unicodedata,Improved modules
@anchor{whatsnew/3 14 unittest}@anchor{2b0}
@subsubsection unittest

@anchor{whatsnew/3 14 whatsnew314-color-unittest}@anchor{2b1}

@itemize *

@item 
@ref{10c,,unittest} output is now colored by default.
This can be controlled by @ref{1b7,,environment variables}.
(Contributed by Hugo van Kemenade in gh-127221@footnote{https://github.com/python/cpython/issues/127221}.)

@item 
unittest discovery supports @ref{2b2,,namespace package} as start
directory again. It was removed in Python 3.11.
(Contributed by Jacob Walls in gh-80958@footnote{https://github.com/python/cpython/issues/80958}.)

@item 
A number of new methods were added in the @ref{2b3,,TestCase} class
that provide more specialized tests.


@itemize -

@item 
@ref{2b4,,assertHasAttr()} and
@ref{2b5,,assertNotHasAttr()} check whether the object
has a particular attribute.

@item 
@ref{2b6,,assertIsSubclass()} and
@ref{2b7,,assertNotIsSubclass()} check whether the object
is a subclass of a particular class, or of one of a tuple of classes.

@item 
@ref{2b8,,assertStartsWith()},
@ref{2b9,,assertNotStartsWith()},
@ref{2ba,,assertEndsWith()} and
@ref{2bb,,assertNotEndsWith()} check whether the Unicode
or byte string starts or ends with particular strings.
@end itemize

(Contributed by Serhiy Storchaka in gh-71339@footnote{https://github.com/python/cpython/issues/71339}.)
@end itemize

@node urllib,uuid,unittest,Improved modules
@anchor{whatsnew/3 14 urllib}@anchor{2bc}
@subsubsection urllib



@itemize *

@item 
Upgrade HTTP digest authentication algorithm for @ref{111,,urllib.request} by
supporting SHA-256 digest authentication as specified in 
@geindex RFC; RFC 7616
RFC 7616@footnote{https://datatracker.ietf.org/doc/html/rfc7616.html}.
(Contributed by Calvin Bui in gh-128193@footnote{https://github.com/python/cpython/issues/128193}.)

@item 
Improve ergonomics and standards compliance when parsing and emitting
@code{file:} URLs.

In @ref{2bd,,url2pathname()}:


@itemize -

@item 
Accept a complete URL when the new `require_scheme' argument is set to
true.

@item 
Discard URL authority if it matches the local hostname.

@item 
Discard URL authority if it resolves to a local IP address when the new
`resolve_host' argument is set to true.

@item 
Discard URL query and fragment components.

@item 
Raise @ref{2be,,URLError} if a URL authority isn’t local,
except on Windows where we return a UNC path as before.
@end itemize

In @ref{2bf,,pathname2url()}:


@itemize -

@item 
Return a complete URL when the new `add_scheme' argument is set to true.

@item 
Include an empty URL authority when a path begins with a slash. For
example, the path @code{/etc/hosts} is converted to the URL @code{///etc/hosts}.
@end itemize

On Windows, drive letters are no longer converted to uppercase, and @code{:}
characters not following a drive letter no longer cause an @ref{2c0,,OSError}
exception to be raised.

(Contributed by Barney Gale in gh-125866@footnote{https://github.com/python/cpython/issues/125866}.)
@end itemize

@node uuid,webbrowser,urllib,Improved modules
@anchor{whatsnew/3 14 uuid}@anchor{2c1}
@subsubsection uuid



@itemize *

@item 
Add support for UUID versions 6, 7, and 8 via @ref{2c2,,uuid6()},
@ref{2c3,,uuid7()}, and @ref{2c4,,uuid8()} respectively, as specified
in 
@geindex RFC; RFC 9562
RFC 9562@footnote{https://datatracker.ietf.org/doc/html/rfc9562.html}.
(Contributed by Bénédikt Tran in gh-89083@footnote{https://github.com/python/cpython/issues/89083}.)

@item 
@ref{2c5,,NIL} and @ref{2c6,,MAX} are now available to represent the
Nil and Max UUID formats as defined by 
@geindex RFC; RFC 9562
RFC 9562@footnote{https://datatracker.ietf.org/doc/html/rfc9562.html}.
(Contributed by Nick Pope in gh-128427@footnote{https://github.com/python/cpython/issues/128427}.)

@item 
Allow generating multiple UUIDs simultaneously on the command-line via
@ref{2c7,,python -m uuid --count}.
(Contributed by Simon Legner in gh-131236@footnote{https://github.com/python/cpython/issues/131236}.)
@end itemize

@node webbrowser,zipfile,uuid,Improved modules
@anchor{whatsnew/3 14 webbrowser}@anchor{2c8}
@subsubsection webbrowser



@itemize *

@item 
Names in the 
@geindex BROWSER
@geindex 환경 변수; BROWSER
@code{BROWSER} environment variable can now refer to already
registered browsers for the @ref{11b,,webbrowser} module, instead of always
generating a new browser command.

This makes it possible to set 
@geindex BROWSER
@geindex 환경 변수; BROWSER
@code{BROWSER} to the value of one of the
supported browsers on macOS.
@end itemize

@node zipfile,,webbrowser,Improved modules
@anchor{whatsnew/3 14 zipfile}@anchor{2c9}
@subsubsection zipfile



@itemize *

@item 
Added @ref{2ca,,ZipInfo._for_archive}, a method
to resolve suitable defaults for a @ref{2cb,,ZipInfo} object
as used by @ref{2cc,,ZipFile.writestr}.
(Contributed by Bénédikt Tran in gh-123424@footnote{https://github.com/python/cpython/issues/123424}.)

@item 
@ref{2cc,,ZipFile.writestr()} now respects the 
@geindex SOURCE_DATE_EPOCH
@geindex 환경 변수; SOURCE_DATE_EPOCH
@code{SOURCE_DATE_EPOCH}
environment variable in order to better support reproducible builds.
(Contributed by Jiahao Li in gh-91279@footnote{https://github.com/python/cpython/issues/91279}.)
@end itemize

@c Add improved modules above alphabetically, not here at the end.

@node Optimizations,Removed,Improved modules,What’s new in Python 3 14
@anchor{whatsnew/3 14 optimizations}@anchor{2cd}
@subsection Optimizations



@itemize *

@item 
The import time for several standard library modules has been improved,
including @ref{6,,annotationlib}, @ref{9,,ast}, @ref{b,,asyncio}, @ref{f,,base64},
@ref{1a,,cmd}, @ref{2d,,csv}, @ref{67,,gettext}, @ref{81,,importlib.util}, @ref{8a,,locale},
@ref{93,,mimetypes}, @ref{a4,,optparse}, @ref{ab,,pickle}, @ref{b3,,pprint},
@ref{b5,,pstats}, @ref{c9,,shlex}, @ref{d1,,socket}, @ref{d8,,string}, @ref{dc,,subprocess},
@ref{f3,,threading}, @ref{102,,tomllib}, @ref{109,,types}, and @ref{137,,zipfile}.

(Contributed by Adam Turner, Bénédikt Tran, Chris Markiewicz, Eli Schwartz,
Hugo van Kemenade, Jelle Zijlstra, and others in gh-118761@footnote{https://github.com/python/cpython/issues/118761}.)

@item 
The interpreter now avoids some reference count modifications internally
when it’s safe to do so.
This can lead to different values being returned from @ref{2ce,,sys.getrefcount()}
and @ref{2cf,,Py_REFCNT()} compared to previous versions of Python.
See @ref{2d0,,below} for details.
@end itemize

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

@end menu

@node asyncio<2>,base64,,Optimizations
@anchor{whatsnew/3 14 id2}@anchor{2d1}
@subsubsection asyncio



@itemize *

@item 
Standard benchmark results have improved by 10-20% following the
implementation of a new per-thread doubly linked list
for @ref{1c7,,native tasks},
also reducing memory usage.
This enables external introspection tools such as
@ref{147,,python -m asyncio pstree}
to introspect the call graph of asyncio tasks running in all threads.
(Contributed by Kumar Aditya in gh-107803@footnote{https://github.com/python/cpython/issues/107803}.)

@item 
The module now has first class support for
@ref{1f4,,free-threading builds}.
This enables parallel execution of multiple event loops across
different threads, scaling linearly with the number of threads.
(Contributed by Kumar Aditya in gh-128002@footnote{https://github.com/python/cpython/issues/128002}.)
@end itemize

@node base64,bdb,asyncio<2>,Optimizations
@anchor{whatsnew/3 14 base64}@anchor{2d2}
@subsubsection base64



@itemize *

@item 
@ref{2d3,,b16decode()} is now up to six times faster.
(Contributed by Bénédikt Tran, Chris Markiewicz, and Adam Turner
in gh-118761@footnote{https://github.com/python/cpython/issues/118761}.)
@end itemize

@node bdb,difflib<2>,base64,Optimizations
@anchor{whatsnew/3 14 bdb}@anchor{2d4}
@subsubsection bdb



@itemize *

@item 
The basic debugger now has a @ref{e0,,sys.monitoring}-based backend,
which can be selected via the passing @code{'monitoring'}
to the @ref{2d5,,Bdb} class’s new `backend' parameter.
(Contributed by Tian Gao in gh-124533@footnote{https://github.com/python/cpython/issues/124533}.)
@end itemize

@node difflib<2>,gc,bdb,Optimizations
@anchor{whatsnew/3 14 id3}@anchor{2d6}
@subsubsection difflib



@itemize *

@item 
The @ref{2d7,,IS_LINE_JUNK()} function is now up to twice as fast.
(Contributed by Adam Turner and Semyon Moroz in gh-130167@footnote{https://github.com/python/cpython/issues/130167}.)
@end itemize

@node gc,io<2>,difflib<2>,Optimizations
@anchor{whatsnew/3 14 gc}@anchor{2d8}
@subsubsection gc



@itemize *

@item 
The new @ref{152,,incremental garbage collector}
means that maximum pause times are reduced
by an order of magnitude or more for larger heaps.

Because of this optimization, the meaning of the results of
@ref{2d9,,get_threshold()} and @ref{2da,,set_threshold()} have changed,
along with @ref{2db,,get_count()} and @ref{2dc,,get_stats()}.


@itemize -

@item 
For backwards compatibility, @ref{2d9,,get_threshold()} continues to return
a three-item tuple.
The first value is the threshold for young collections, as before;
the second value determines the rate at which the old collection is scanned
(the default is 10, and higher values mean that the old collection
is scanned more slowly).
The third value is now meaningless and is always zero.

@item 
@ref{2da,,set_threshold()} now ignores any items after the second.

@item 
@ref{2db,,get_count()} and @ref{2dc,,get_stats()} continue to return
the same format of results.
The only difference is that instead of the results referring to
the young, aging and old generations,
the results refer to the young generation
and the aging and collecting spaces of the old generation.
@end itemize

In summary, code that attempted to manipulate the behavior of the cycle GC
may not work exactly as intended, but it is very unlikely to be harmful.
All other code will work just fine.

(Contributed by Mark Shannon in gh-108362@footnote{https://github.com/python/cpython/issues/108362}.)
@end itemize

@node io<2>,pathlib<2>,gc,Optimizations
@anchor{whatsnew/3 14 id4}@anchor{2dd}
@subsubsection io



@itemize *

@item 
Opening and reading files now executes fewer system calls.
Reading a small operating system cached file in full is up to 15% faster.
(Contributed by Cody Maloney and Victor Stinner
in gh-120754@footnote{https://github.com/python/cpython/issues/120754} and gh-90102@footnote{https://github.com/python/cpython/issues/90102}.)
@end itemize

@node pathlib<2>,pdb<2>,io<2>,Optimizations
@anchor{whatsnew/3 14 id5}@anchor{2de}
@subsubsection pathlib



@itemize *

@item 
@ref{2df,,Path.read_bytes} now uses unbuffered mode
to open files, which is between 9% and 17% faster to read in full.
(Contributed by Cody Maloney in gh-120754@footnote{https://github.com/python/cpython/issues/120754}.)
@end itemize

@node pdb<2>,textwrap,pathlib<2>,Optimizations
@anchor{whatsnew/3 14 id6}@anchor{2e0}
@subsubsection pdb



@itemize *

@item 
@ref{aa,,pdb} now supports two backends, based on either
@ref{2e1,,sys.settrace()} or @ref{e0,,sys.monitoring}.
Using the @ref{2e2,,pdb CLI} or @ref{271,,breakpoint()}
will always use the @code{sys.monitoring} backend.
Explicitly instantiating @ref{273,,pdb.Pdb} and its derived classes
will use the @code{sys.settrace()} backend by default, which is configurable.
(Contributed by Tian Gao in gh-124533@footnote{https://github.com/python/cpython/issues/124533}.)
@end itemize

@node textwrap,uuid<2>,pdb<2>,Optimizations
@anchor{whatsnew/3 14 textwrap}@anchor{2e3}
@subsubsection textwrap



@itemize *

@item 
Optimize the @ref{1a9,,dedent()} function, improving performance by
an average of 2.4x, with larger improvements for bigger inputs,
and fix a bug with incomplete normalization of blank lines with whitespace
characters other than space and tab.
@end itemize

@node uuid<2>,zlib,textwrap,Optimizations
@anchor{whatsnew/3 14 id7}@anchor{2e4}
@subsubsection uuid



@itemize *

@item 
@ref{2e5,,uuid3()} and @ref{2e6,,uuid5()} are now both roughly 40% faster
for 16-byte names and 20% faster for 1024-byte names.
Performance for longer names remains unchanged.
(Contributed by Bénédikt Tran in gh-128150@footnote{https://github.com/python/cpython/issues/128150}.)

@item 
@ref{2e7,,uuid4()} is now c. 30% faster.
(Contributed by Bénédikt Tran in gh-128150@footnote{https://github.com/python/cpython/issues/128150}.)
@end itemize

@node zlib,,uuid<2>,Optimizations
@anchor{whatsnew/3 14 zlib}@anchor{2e8}
@subsubsection zlib



@itemize *

@item 
On Windows, zlib-ng@footnote{https://github.com/zlib-ng/zlib-ng}
is now used as the implementation of the @ref{139,,zlib} module
in the default binaries.
There are no known incompatibilities between @code{zlib-ng}
and the previously-used @code{zlib} implementation.
This should result in better performance at all compression levels.

It is worth noting that @code{zlib.Z_BEST_SPEED} (@code{1}) may result in
significantly less compression than the previous implementation,
whilst also significantly reducing the time taken to compress.

(Contributed by Steve Dower in gh-91349@footnote{https://github.com/python/cpython/issues/91349}.)
@end itemize

@node Removed,Deprecated,Optimizations,What’s new in Python 3 14
@anchor{whatsnew/3 14 removed}@anchor{2e9}
@subsection Removed


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

@end menu

@node argparse<2>,ast<2>,,Removed
@anchor{whatsnew/3 14 id8}@anchor{2ea}
@subsubsection argparse



@itemize *

@item 
Remove the `type', `choices', and `metavar' parameters
of @code{BooleanOptionalAction}.
These have been deprecated since Python 3.12.
(Contributed by Nikita Sobolev in gh-118805@footnote{https://github.com/python/cpython/issues/118805}.)

@item 
Calling @ref{2eb,,add_argument_group()}
on an argument group now raises a @ref{2ec,,ValueError}.
Similarly, @code{add_argument_group()}
or @ref{2ed,,add_mutually_exclusive_group()}
on a mutually exclusive group now both raise @code{ValueError}s.
This ‘nesting’ was never supported, often failed to work correctly,
and was unintentionally exposed through inheritance.
This functionality has been deprecated since Python 3.11.
(Contributed by Savannah Ostrowski in gh-127186@footnote{https://github.com/python/cpython/issues/127186}.)
@end itemize

@node ast<2>,asyncio<3>,argparse<2>,Removed
@anchor{whatsnew/3 14 id9}@anchor{2ee}
@subsubsection ast



@itemize *

@item 
Remove the following classes, which have been deprecated aliases of
@ref{2ef,,Constant} since Python 3.8 and have emitted
deprecation warnings since Python 3.12:


@itemize *

@item 
@code{Bytes}

@item 
@code{Ellipsis}

@item 
@code{NameConstant}

@item 
@code{Num}

@item 
@code{Str}
@end itemize

As a consequence of these removals, user-defined @code{visit_Num}, @code{visit_Str},
@code{visit_Bytes}, @code{visit_NameConstant} and @code{visit_Ellipsis} methods
on custom @ref{2f0,,NodeVisitor} subclasses will no longer be called
when the @code{NodeVisitor} subclass is visiting an AST.
Define a @code{visit_Constant} method instead.

(Contributed by Alex Waygood in gh-119562@footnote{https://github.com/python/cpython/issues/119562}.)

@item 
Remove the following deprecated properties on @ref{2ef,,ast.Constant},
which were present for compatibility with the now-removed AST classes:


@itemize *

@item 
@code{Constant.n}

@item 
@code{Constant.s}
@end itemize

Use @code{Constant.value} instead.
(Contributed by Alex Waygood in gh-119562@footnote{https://github.com/python/cpython/issues/119562}.)
@end itemize

@node asyncio<3>,email,ast<2>,Removed
@anchor{whatsnew/3 14 id10}@anchor{2f1}
@subsubsection asyncio



@itemize *

@item 
Remove the following classes, methods, and functions,
which have been deprecated since Python 3.12:


@itemize *

@item 
@code{AbstractChildWatcher}

@item 
@code{FastChildWatcher}

@item 
@code{MultiLoopChildWatcher}

@item 
@code{PidfdChildWatcher}

@item 
@code{SafeChildWatcher}

@item 
@code{ThreadedChildWatcher}

@item 
@code{AbstractEventLoopPolicy.get_child_watcher()}

@item 
@code{AbstractEventLoopPolicy.set_child_watcher()}

@item 
@code{get_child_watcher()}

@item 
@code{set_child_watcher()}
@end itemize

(Contributed by Kumar Aditya in gh-120804@footnote{https://github.com/python/cpython/issues/120804}.)

@item 
@ref{2f2,,asyncio.get_event_loop()} now raises a @ref{244,,RuntimeError}
if there is no current event loop,
and no longer implicitly creates an event loop.

(Contributed by Kumar Aditya in gh-126353@footnote{https://github.com/python/cpython/issues/126353}.)

@c TODO: move these patterns to the asyncio docs?
@c quite long for What's New

There’s a few patterns that use @ref{2f2,,asyncio.get_event_loop()}, most
of them can be replaced with @ref{2f3,,asyncio.run()}.

If you’re running an async function, simply use @ref{2f3,,asyncio.run()}.

Before:

@example
async def main():
    ...


loop = asyncio.get_event_loop()
try:
    loop.run_until_complete(main())
finally:
    loop.close()
@end example

After:

@example
async def main():
    ...

asyncio.run(main())
@end example

If you need to start something, for example, a server listening on a socket
and then run forever, use @ref{2f3,,asyncio.run()} and an
@ref{2f4,,asyncio.Event}.

Before:

@example
def start_server(loop): ...

loop = asyncio.get_event_loop()
try:
    start_server(loop)
    loop.run_forever()
finally:
    loop.close()
@end example

After:

@example
def start_server(loop): ...

async def main():
    start_server(asyncio.get_running_loop())
    await asyncio.Event().wait()

asyncio.run(main())
@end example

If you need to run something in an event loop, then run some blocking
code around it, use @ref{2f5,,asyncio.Runner}.

Before:

@example
async def operation_one(): ...
def blocking_code(): ...
async def operation_two(): ...

loop = asyncio.get_event_loop()
try:
    loop.run_until_complete(operation_one())
    blocking_code()
    loop.run_until_complete(operation_two())
finally:
    loop.close()
@end example

After:

@example
async def operation_one(): ...
def blocking_code(): ...
async def operation_two(): ...

with asyncio.Runner() as runner:
    runner.run(operation_one())
    blocking_code()
    runner.run(operation_two())
@end example
@end itemize

@node email,importlib abc,asyncio<3>,Removed
@anchor{whatsnew/3 14 email}@anchor{2f6}
@subsubsection email



@itemize *

@item 
Remove @ref{2f7,,email.utils.localtime()}’s `isdst' parameter,
which was deprecated in and has been ignored since Python 3.12.
(Contributed by Hugo van Kemenade in gh-118798@footnote{https://github.com/python/cpython/issues/118798}.)
@end itemize

@node importlib abc,itertools,email,Removed
@anchor{whatsnew/3 14 importlib-abc}@anchor{2f8}
@subsubsection importlib.abc



@itemize *

@item 
Remove deprecated @ref{7c,,importlib.abc} classes:


@itemize *

@item 
@code{ResourceReader}
(use @ref{2f9,,TraversableResources})

@item 
@code{Traversable}
(use @ref{2fa,,Traversable})

@item 
@code{TraversableResources}
(use @ref{2f9,,TraversableResources})
@end itemize

(Contributed by Jason R. Coombs and Hugo van Kemenade in gh-93963@footnote{https://github.com/python/cpython/issues/93963}.)
@end itemize

@node itertools,pathlib<3>,importlib abc,Removed
@anchor{whatsnew/3 14 itertools}@anchor{2fb}
@subsubsection itertools



@itemize *

@item 
Remove support for copy, deepcopy, and pickle operations
from @ref{85,,itertools} iterators.
These have emitted a @ref{1a3,,DeprecationWarning} since Python 3.12.
(Contributed by Raymond Hettinger in gh-101588@footnote{https://github.com/python/cpython/issues/101588}.)
@end itemize

@node pathlib<3>,pkgutil,itertools,Removed
@anchor{whatsnew/3 14 id11}@anchor{2fc}
@subsubsection pathlib



@itemize *

@item 
Remove support for passing additional keyword arguments
to @ref{266,,Path}.
In previous versions, any such arguments are ignored.
(Contributed by Barney Gale in gh-74033@footnote{https://github.com/python/cpython/issues/74033}.)

@item 
Remove support for passing additional positional arguments to
@ref{2fd,,PurePath.relative_to()} and @ref{2fe,,is_relative_to()}.
In previous versions, any such arguments are joined onto `other'.
(Contributed by Barney Gale in gh-78707@footnote{https://github.com/python/cpython/issues/78707}.)
@end itemize

@node pkgutil,pty,pathlib<3>,Removed
@anchor{whatsnew/3 14 pkgutil}@anchor{2ff}
@subsubsection pkgutil



@itemize *

@item 
Remove the @code{get_loader()} and @code{find_loader()} functions,
which have been deprecated since Python 3.12.
(Contributed by Bénédikt Tran in gh-97850@footnote{https://github.com/python/cpython/issues/97850}.)
@end itemize

@node pty,sqlite3,pkgutil,Removed
@anchor{whatsnew/3 14 pty}@anchor{300}
@subsubsection pty



@itemize *

@item 
Remove the @code{master_open()} and @code{slave_open()} functions,
which have been deprecated since Python 3.12.
Use @ref{301,,pty.openpty()} instead.
(Contributed by Nikita Sobolev in gh-118824@footnote{https://github.com/python/cpython/issues/118824}.)
@end itemize

@node sqlite3,urllib<2>,pty,Removed
@anchor{whatsnew/3 14 sqlite3}@anchor{302}
@subsubsection sqlite3



@itemize *

@item 
Remove @code{version} and @code{version_info} from
the @ref{d4,,sqlite3} module;
use @ref{303,,sqlite_version} and @ref{304,,sqlite_version_info}
for the actual version number of the runtime SQLite library.
(Contributed by Hugo van Kemenade in gh-118924@footnote{https://github.com/python/cpython/issues/118924}.)

@item 
Using a sequence of parameters with named placeholders now
raises a @ref{305,,ProgrammingError},
having been deprecated since Python 3.12.
(Contributed by Erlend E. Aasland in gh-118928@footnote{https://github.com/python/cpython/issues/118928} and gh-101693@footnote{https://github.com/python/cpython/issues/101693}.)
@end itemize

@node urllib<2>,,sqlite3,Removed
@anchor{whatsnew/3 14 id12}@anchor{306}
@subsubsection urllib



@itemize *

@item 
Remove the @code{Quoter} class from @ref{110,,urllib.parse},
which has been deprecated since Python 3.11.
(Contributed by Nikita Sobolev in gh-118827@footnote{https://github.com/python/cpython/issues/118827}.)

@item 
Remove the @code{URLopener} and @code{FancyURLopener} classes
from @ref{111,,urllib.request},
which have been deprecated since Python 3.3.

@code{myopener.open()} can be replaced with @ref{307,,urlopen()}.
@code{myopener.retrieve()} can be replaced with
@ref{308,,urlretrieve()}.
Customisations to the opener classes can be replaced by passing
customized handlers to @ref{309,,build_opener()}.
(Contributed by Barney Gale in gh-84850@footnote{https://github.com/python/cpython/issues/84850}.)
@end itemize

@node Deprecated,CPython bytecode changes,Removed,What’s new in Python 3 14
@anchor{whatsnew/3 14 deprecated}@anchor{30a}
@subsection Deprecated


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

@end menu

@node New deprecations,Pending removal in Python 3 15,,Deprecated
@anchor{whatsnew/3 14 new-deprecations}@anchor{30b}
@subsubsection New deprecations



@itemize *

@item 
Passing a complex number as the `real' or `imag' argument in the
@ref{197,,complex()} constructor is now deprecated;
complex numbers should only be passed as a single positional argument.
(Contributed by Serhiy Storchaka in gh-109218@footnote{https://github.com/python/cpython/issues/109218}.)

@item 
@ref{7,,argparse}:


@itemize *

@item 
Passing the undocumented keyword argument `prefix_chars' to the
@ref{2eb,,add_argument_group()} method is now deprecated.
(Contributed by Savannah Ostrowski in gh-125563@footnote{https://github.com/python/cpython/issues/125563}.)

@item 
Deprecated the @ref{30c,,argparse.FileType} type converter.
Anything relating to resource management should be handled
downstream, after the arguments have been parsed.
(Contributed by Serhiy Storchaka in gh-58032@footnote{https://github.com/python/cpython/issues/58032}.)
@end itemize

@item 
@ref{b,,asyncio}:


@itemize *

@item 
The @code{asyncio.iscoroutinefunction()} is now deprecated
and will be removed in Python 3.16;
use @ref{30d,,inspect.iscoroutinefunction()} instead.
(Contributed by Jiahao Li and Kumar Aditya in gh-122875@footnote{https://github.com/python/cpython/issues/122875}.)

@item 
The @ref{b,,asyncio} policy system is deprecated
and will be removed in Python 3.16.
In particular, the following classes and functions are deprecated:


@itemize *

@item 
@ref{30e,,asyncio.AbstractEventLoopPolicy}

@item 
@ref{30f,,asyncio.DefaultEventLoopPolicy}

@item 
@ref{310,,asyncio.WindowsSelectorEventLoopPolicy}

@item 
@ref{311,,asyncio.WindowsProactorEventLoopPolicy}

@item 
@ref{312,,asyncio.get_event_loop_policy()}

@item 
@ref{313,,asyncio.set_event_loop_policy()}
@end itemize

Users should use @ref{2f3,,asyncio.run()} or @ref{2f5,,asyncio.Runner} with
the `loop_factory' argument to use the desired event loop implementation.

For example, to use @ref{314,,asyncio.SelectorEventLoop} on Windows:

@example
import asyncio

async def main():
    ...

asyncio.run(main(), loop_factory=asyncio.SelectorEventLoop)
@end example

(Contributed by Kumar Aditya in gh-127949@footnote{https://github.com/python/cpython/issues/127949}.)
@end itemize

@item 
@ref{1c,,codecs}:
The @ref{315,,codecs.open()} function is now deprecated,
and will be removed in a future version of Python.
Use @ref{316,,open()} instead.
(Contributed by Inada Naoki in gh-133036@footnote{https://github.com/python/cpython/issues/133036}.)

@item 
@ref{2e,,ctypes}:


@itemize *

@item 
On non-Windows platforms, setting @ref{317,,Structure._pack_} to use a
MSVC-compatible default memory layout is now deprecated in favor of setting
@ref{1e7,,Structure._layout_} to @code{'ms'}, and will be removed in Python 3.19.
(Contributed by Petr Viktorin in gh-131747@footnote{https://github.com/python/cpython/issues/131747}.)

@item 
Calling @ref{1f1,,ctypes.POINTER()} on a string is now deprecated.
Use @ref{318,,incomplete types}
for self-referential structures.
Also, the internal @code{ctypes._pointer_type_cache} is deprecated.
See @code{ctypes.POINTER()} for updated implementation details.
(Contributed by Sergey Myrianov in gh-100926@footnote{https://github.com/python/cpython/issues/100926}.)
@end itemize

@item 
@ref{63,,functools}:
Calling the Python implementation of @ref{21a,,functools.reduce()} with `function'
or `sequence' as keyword arguments is now deprecated;
the parameters will be made positional-only in Python 3.16.
(Contributed by Kirill Podoprigora in gh-121676@footnote{https://github.com/python/cpython/issues/121676}.)

@item 
@ref{8b,,logging}:
Support for custom logging handlers with the `strm' argument
is now deprecated and scheduled for removal in Python 3.16.
Define handlers with the `stream' argument instead.
(Contributed by Mariusz Felisiak in gh-115032@footnote{https://github.com/python/cpython/issues/115032}.)

@item 
@ref{93,,mimetypes}:
Valid extensions are either empty or must start with ‘.’ for
@ref{319,,mimetypes.MimeTypes.add_type()}.
Undotted extensions are deprecated and will
raise a @ref{2ec,,ValueError} in Python 3.16.
(Contributed by Hugo van Kemenade in gh-75223@footnote{https://github.com/python/cpython/issues/75223}.)

@item 
@code{nturl2path}:
This module is now deprecated. Call @ref{2bd,,urllib.request.url2pathname()}
and @ref{2bf,,pathname2url()} instead.
(Contributed by Barney Gale in gh-125866@footnote{https://github.com/python/cpython/issues/125866}.)

@item 
@ref{a5,,os}:
The @ref{31a,,os.popen()} and @ref{31b,,os.spawn*} functions
are now @ref{23d,,soft deprecated}.
They should no longer be used to write new code.
The @ref{dc,,subprocess} module is recommended instead.
(Contributed by Victor Stinner in gh-120743@footnote{https://github.com/python/cpython/issues/120743}.)

@item 
@ref{a8,,pathlib}:
@code{pathlib.PurePath.as_uri()} is now deprecated
and scheduled for removal in Python 3.19.
Use @ref{31c,,pathlib.Path.as_uri()} instead.
(Contributed by Barney Gale in gh-123599@footnote{https://github.com/python/cpython/issues/123599}.)

@item 
@ref{aa,,pdb}:
The undocumented @code{pdb.Pdb.curframe_locals} attribute is now a deprecated
read-only property, which will be removed in a future version of Python.
The low overhead dynamic frame locals access added in Python 3.13 by 
@geindex Python 향상 제안; PEP 667
PEP 667@footnote{https://peps.python.org/pep-0667/}
means the frame locals cache reference previously stored in this attribute
is no longer needed. Derived debuggers should access
@code{pdb.Pdb.curframe.f_locals} directly in Python 3.13 and later versions.
(Contributed by Tian Gao in gh-124369@footnote{https://github.com/python/cpython/issues/124369} and gh-125951@footnote{https://github.com/python/cpython/issues/125951}.)

@item 
@ref{de,,symtable}:
Deprecate @ref{31d,,symtable.Class.get_methods()} due to the lack of interest,
scheduled for removal in Python 3.16.
(Contributed by Bénédikt Tran in gh-119698@footnote{https://github.com/python/cpython/issues/119698}.)

@item 
@ref{f6,,tkinter}:
The @code{tkinter.Variable} methods @code{trace_variable()},
@code{trace_vdelete()} and @code{trace_vinfo()} are now deprecated.
Use @code{trace_add()}, @code{trace_remove()} and @code{trace_info()} instead.
(Contributed by Serhiy Storchaka in gh-120220@footnote{https://github.com/python/cpython/issues/120220}.)

@item 
@ref{110,,urllib.parse}:
Accepting objects with false values (like @code{0} and @code{[]}) except empty
strings, bytes-like objects and @code{None} in @ref{31e,,parse_qsl()}
and @ref{31f,,parse_qs()} is now deprecated.
(Contributed by Serhiy Storchaka in gh-116897@footnote{https://github.com/python/cpython/issues/116897}.)
@end itemize

@c Add deprecations above alphabetically, not here at the end.

@node Pending removal in Python 3 15,Pending removal in Python 3 16,New deprecations,Deprecated
@anchor{whatsnew/3 14 pending-removal-in-python-3-15}@anchor{320}
@subsubsection Pending removal in Python 3.15



@itemize *

@item 
The import system:


@itemize *

@item 
Setting @ref{321,,__cached__} on a module while
failing to set @ref{322,,__spec__.cached}
is deprecated. In Python 3.15, @code{__cached__} will cease to be set or
take into consideration by the import system or standard library. (gh-97879@footnote{https://github.com/python/cpython/issues/97879})

@item 
Setting @ref{323,,__package__} on a module while
failing to set @ref{324,,__spec__.parent}
is deprecated. In Python 3.15, @code{__package__} will cease to be set or
take into consideration by the import system or standard library. (gh-97879@footnote{https://github.com/python/cpython/issues/97879})
@end itemize

@item 
@ref{2e,,ctypes}:


@itemize *

@item 
The undocumented @code{ctypes.SetPointerType()} function
has been deprecated since Python 3.13.
@end itemize

@item 
@ref{76,,http.server}:


@itemize *

@item 
The obsolete and rarely used @ref{325,,CGIHTTPRequestHandler}
has been deprecated since Python 3.13.
No direct replacement exists.
`Anything' is better than CGI to interface
a web server with a request handler.

@item 
The @code{--cgi} flag to the @code{python -m http.server}
command-line interface has been deprecated since Python 3.13.
@end itemize

@item 
@ref{7b,,importlib}:


@itemize *

@item 
@code{load_module()} method: use @code{exec_module()} instead.
@end itemize

@item 
@ref{8a,,locale}:


@itemize *

@item 
The @ref{326,,getdefaultlocale()} function
has been deprecated since Python 3.11.
Its removal was originally planned for Python 3.13 (gh-90817@footnote{https://github.com/python/cpython/issues/90817}),
but has been postponed to Python 3.15.
Use @ref{327,,getlocale()}, @ref{328,,setlocale()},
and @ref{329,,getencoding()} instead.
(Contributed by Hugo van Kemenade in gh-111187@footnote{https://github.com/python/cpython/issues/111187}.)
@end itemize

@item 
@ref{a8,,pathlib}:


@itemize *

@item 
@ref{32a,,PurePath.is_reserved()}
has been deprecated since Python 3.13.
Use @ref{32b,,os.path.isreserved()} to detect reserved paths on Windows.
@end itemize

@item 
@ref{af,,platform}:


@itemize *

@item 
@ref{32c,,java_ver()} has been deprecated since Python 3.13.
This function is only useful for Jython support, has a confusing API,
and is largely untested.
@end itemize

@item 
@ref{e1,,sysconfig}:


@itemize *

@item 
The `check_home' argument of @ref{32d,,sysconfig.is_python_build()} has been
deprecated since Python 3.12.
@end itemize

@item 
@ref{f3,,threading}:


@itemize *

@item 
@ref{32e,,RLock()} will take no arguments in Python 3.15.
Passing any arguments has been deprecated since Python 3.14,
as the Python version does not permit any arguments,
but the C version allows any number of positional or keyword arguments,
ignoring every argument.
@end itemize

@item 
@ref{109,,types}:


@itemize *

@item 
@ref{32f,,types.CodeType}: Accessing @ref{330,,co_lnotab} was
deprecated in 
@geindex Python 향상 제안; PEP 626
PEP 626@footnote{https://peps.python.org/pep-0626/}
since 3.10 and was planned to be removed in 3.12,
but it only got a proper @ref{1a3,,DeprecationWarning} in 3.12.
May be removed in 3.15.
(Contributed by Nikita Sobolev in gh-101866@footnote{https://github.com/python/cpython/issues/101866}.)
@end itemize

@item 
@ref{10a,,typing}:


@itemize *

@item 
The undocumented keyword argument syntax for creating
@ref{331,,NamedTuple} classes
(for example, @code{Point = NamedTuple("Point", x=int, y=int)})
has been deprecated since Python 3.13.
Use the class-based syntax or the functional syntax instead.

@item 
When using the functional syntax of @ref{332,,TypedDict}s, failing
to pass a value to the `fields' parameter (@code{TD = TypedDict("TD")}) or
passing @code{None} (@code{TD = TypedDict("TD", None)}) has been deprecated
since Python 3.13.
Use @code{class TD(TypedDict): pass} or @code{TD = TypedDict("TD", @{@})}
to create a TypedDict with zero field.

@item 
The @ref{333,,typing.no_type_check_decorator()} decorator function
has been deprecated since Python 3.13.
After eight years in the @ref{10a,,typing} module,
it has yet to be supported by any major type checker.
@end itemize

@item 
@ref{119,,wave}:


@itemize *

@item 
The @ref{334,,getmark()}, @code{setmark()},
and @ref{335,,getmarkers()} methods of
the @ref{336,,Wave_read} and @ref{337,,Wave_write} classes
have been deprecated since Python 3.13.
@end itemize

@item 
@ref{138,,zipimport}:


@itemize *

@item 
@ref{338,,load_module()} has been deprecated since
Python 3.10. Use @ref{339,,exec_module()} instead.
(Contributed by Jiahao Li in gh-125746@footnote{https://github.com/python/cpython/issues/125746}.)
@end itemize
@end itemize

@node Pending removal in Python 3 16,Pending removal in Python 3 17,Pending removal in Python 3 15,Deprecated
@anchor{whatsnew/3 14 pending-removal-in-python-3-16}@anchor{33a}
@subsubsection Pending removal in Python 3.16



@itemize *

@item 
The import system:


@itemize *

@item 
Setting @ref{33b,,__loader__} on a module while
failing to set @ref{33c,,__spec__.loader}
is deprecated. In Python 3.16, @code{__loader__} will cease to be set or
taken into consideration by the import system or the standard library.
@end itemize

@item 
@ref{8,,array}:


@itemize *

@item 
The @code{'u'} format code (@code{wchar_t})
has been deprecated in documentation since Python 3.3
and at runtime since Python 3.13.
Use the @code{'w'} format code (@ref{33d,,Py_UCS4})
for Unicode characters instead.
@end itemize

@item 
@ref{b,,asyncio}:


@itemize *

@item 
@code{asyncio.iscoroutinefunction()} is deprecated
and will be removed in Python 3.16;
use @ref{30d,,inspect.iscoroutinefunction()} instead.
(Contributed by Jiahao Li and Kumar Aditya in gh-122875@footnote{https://github.com/python/cpython/issues/122875}.)

@item 
@ref{b,,asyncio} policy system is deprecated and will be removed in Python 3.16.
In particular, the following classes and functions are deprecated:


@itemize *

@item 
@ref{30e,,asyncio.AbstractEventLoopPolicy}

@item 
@ref{30f,,asyncio.DefaultEventLoopPolicy}

@item 
@ref{310,,asyncio.WindowsSelectorEventLoopPolicy}

@item 
@ref{311,,asyncio.WindowsProactorEventLoopPolicy}

@item 
@ref{312,,asyncio.get_event_loop_policy()}

@item 
@ref{313,,asyncio.set_event_loop_policy()}
@end itemize

Users should use @ref{2f3,,asyncio.run()} or @ref{2f5,,asyncio.Runner} with
`loop_factory' to use the desired event loop implementation.

For example, to use @ref{314,,asyncio.SelectorEventLoop} on Windows:

@example
import asyncio

async def main():
    ...

asyncio.run(main(), loop_factory=asyncio.SelectorEventLoop)
@end example

(Contributed by Kumar Aditya in gh-127949@footnote{https://github.com/python/cpython/issues/127949}.)
@end itemize

@item 
@ref{13,,builtins}:


@itemize *

@item 
Bitwise inversion on boolean types, @code{~True} or @code{~False}
has been deprecated since Python 3.12,
as it produces surprising and unintuitive results (@code{-2} and @code{-1}).
Use @code{not x} instead for the logical negation of a Boolean.
In the rare case that you need the bitwise inversion of
the underlying integer, convert to @code{int} explicitly (@code{~int(x)}).
@end itemize

@item 
@ref{63,,functools}:


@itemize *

@item 
Calling the Python implementation of @ref{21a,,functools.reduce()} with `function'
or `sequence' as keyword arguments has been deprecated since Python 3.14.
@end itemize

@item 
@ref{8b,,logging}:

Support for custom logging handlers with the `strm' argument is deprecated
and scheduled for removal in Python 3.16. Define handlers with the `stream'
argument instead. (Contributed by Mariusz Felisiak in gh-115032@footnote{https://github.com/python/cpython/issues/115032}.)

@item 
@ref{93,,mimetypes}:


@itemize *

@item 
Valid extensions start with a ‘.’ or are empty for
@ref{319,,mimetypes.MimeTypes.add_type()}.
Undotted extensions are deprecated and will
raise a @ref{2ec,,ValueError} in Python 3.16.
(Contributed by Hugo van Kemenade in gh-75223@footnote{https://github.com/python/cpython/issues/75223}.)
@end itemize

@item 
@ref{ca,,shutil}:


@itemize *

@item 
The @code{ExecError} exception
has been deprecated since Python 3.14.
It has not been used by any function in @code{shutil} since Python 3.4,
and is now an alias of @ref{244,,RuntimeError}.
@end itemize

@item 
@ref{de,,symtable}:


@itemize *

@item 
The @ref{31d,,Class.get_methods} method
has been deprecated since Python 3.14.
@end itemize

@item 
@ref{df,,sys}:


@itemize *

@item 
The @ref{33e,,_enablelegacywindowsfsencoding()} function
has been deprecated since Python 3.13.
Use the 
@geindex PYTHONLEGACYWINDOWSFSENCODING
@geindex 환경 변수; PYTHONLEGACYWINDOWSFSENCODING
@ref{33f,,PYTHONLEGACYWINDOWSFSENCODING} environment variable instead.
@end itemize

@item 
@ref{e1,,sysconfig}:


@itemize *

@item 
The @code{sysconfig.expand_makefile_vars()} function
has been deprecated since Python 3.14.
Use the @code{vars} argument of @ref{340,,sysconfig.get_paths()} instead.
@end itemize

@item 
@ref{e4,,tarfile}:


@itemize *

@item 
The undocumented and unused @code{TarFile.tarfile} attribute
has been deprecated since Python 3.13.
@end itemize
@end itemize

@node Pending removal in Python 3 17,Pending removal in Python 3 18,Pending removal in Python 3 16,Deprecated
@anchor{whatsnew/3 14 pending-removal-in-python-3-17}@anchor{341}
@subsubsection Pending removal in Python 3.17



@itemize *

@item 
@ref{1f,,collections.abc}:


@itemize -

@item 
@ref{342,,collections.abc.ByteString} is scheduled for removal in Python 3.17.

Use @code{isinstance(obj, collections.abc.Buffer)} to test if @code{obj}
implements the @ref{260,,buffer protocol} at runtime. For use
in type annotations, either use @ref{343,,Buffer} or a union
that explicitly specifies the types your code supports (e.g.,
@code{bytes | bytearray | memoryview}).

@code{ByteString} was originally intended to be an abstract class that
would serve as a supertype of both @ref{192,,bytes} and @ref{344,,bytearray}.
However, since the ABC never had any methods, knowing that an object was an
instance of @code{ByteString} never actually told you anything useful
about the object. Other common buffer types such as @ref{165,,memoryview}
were also never understood as subtypes of @code{ByteString} (either at
runtime or by static type checkers).

See 
@geindex Python 향상 제안; PEP 688#current-options
PEP 688@footnote{https://peps.python.org/pep-0688/#current-options} for more details.
(Contributed by Shantanu Jain in gh-91896@footnote{https://github.com/python/cpython/issues/91896}.)
@end itemize

@item 
@ref{10a,,typing}:


@itemize -

@item 
Before Python 3.14, old-style unions were implemented using the private class
@code{typing._UnionGenericAlias}. This class is no longer needed for the implementation,
but it has been retained for backward compatibility, with removal scheduled for Python
3.17. Users should use documented introspection helpers like @ref{2ab,,typing.get_origin()}
and @ref{2ac,,typing.get_args()} instead of relying on private implementation details.

@item 
@ref{345,,typing.ByteString}, deprecated since Python 3.9, is scheduled for removal in
Python 3.17.

Use @code{isinstance(obj, collections.abc.Buffer)} to test if @code{obj}
implements the @ref{260,,buffer protocol} at runtime. For use
in type annotations, either use @ref{343,,Buffer} or a union
that explicitly specifies the types your code supports (e.g.,
@code{bytes | bytearray | memoryview}).

@code{ByteString} was originally intended to be an abstract class that
would serve as a supertype of both @ref{192,,bytes} and @ref{344,,bytearray}.
However, since the ABC never had any methods, knowing that an object was an
instance of @code{ByteString} never actually told you anything useful
about the object. Other common buffer types such as @ref{165,,memoryview}
were also never understood as subtypes of @code{ByteString} (either at
runtime or by static type checkers).

See 
@geindex Python 향상 제안; PEP 688#current-options
PEP 688@footnote{https://peps.python.org/pep-0688/#current-options} for more details.
(Contributed by Shantanu Jain in gh-91896@footnote{https://github.com/python/cpython/issues/91896}.)
@end itemize
@end itemize

@node Pending removal in Python 3 18,Pending removal in Python 3 19,Pending removal in Python 3 17,Deprecated
@anchor{whatsnew/3 14 pending-removal-in-python-3-18}@anchor{346}
@subsubsection Pending removal in Python 3.18



@itemize *

@item 
@ref{3a,,decimal}:


@itemize *

@item 
The non-standard and undocumented @ref{1fe,,Decimal} format
specifier @code{'N'}, which is only supported in the @code{decimal} module’s
C implementation, has been deprecated since Python 3.13.
(Contributed by Serhiy Storchaka in gh-89902@footnote{https://github.com/python/cpython/issues/89902}.)
@end itemize
@end itemize

@node Pending removal in Python 3 19,Pending removal in future versions,Pending removal in Python 3 18,Deprecated
@anchor{whatsnew/3 14 pending-removal-in-python-3-19}@anchor{347}
@subsubsection Pending removal in Python 3.19



@itemize *

@item 
@ref{2e,,ctypes}:


@itemize *

@item 
Implicitly switching to the MSVC-compatible struct layout by setting
@ref{317,,_pack_} but not @ref{1e7,,_layout_}
on non-Windows platforms.
@end itemize
@end itemize

@node Pending removal in future versions,,Pending removal in Python 3 19,Deprecated
@anchor{whatsnew/3 14 pending-removal-in-future-versions}@anchor{348}
@subsubsection Pending removal in future versions


The following APIs will be removed in the future,
although there is currently no date scheduled for their removal.


@itemize *

@item 
@ref{7,,argparse}:


@itemize *

@item 
Nesting argument groups and nesting mutually exclusive
groups are deprecated.

@item 
Passing the undocumented keyword argument `prefix_chars' to
@ref{2eb,,add_argument_group()} is now
deprecated.

@item 
The @ref{30c,,argparse.FileType} type converter is deprecated.
@end itemize

@item 
@ref{13,,builtins}:


@itemize *

@item 
Generators: @code{throw(type, exc, tb)} and @code{athrow(type, exc, tb)}
signature is deprecated: use @code{throw(exc)} and @code{athrow(exc)} instead,
the single argument signature.

@item 
Currently Python accepts numeric literals immediately followed by keywords,
for example @code{0in x}, @code{1or x}, @code{0if 1else 2}.  It allows confusing and
ambiguous expressions like @code{[0x1for x in y]} (which can be interpreted as
@code{[0x1 for x in y]} or @code{[0x1f or x in y]}).  A syntax warning is raised
if the numeric literal is immediately followed by one of keywords
@ref{349,,and}, @ref{17c,,else}, @ref{34a,,for}, @ref{181,,if},
@ref{34b,,in}, @ref{34c,,is} and @ref{34d,,or}.  In a future release it
will be changed to a syntax error. (gh-87999@footnote{https://github.com/python/cpython/issues/87999})

@item 
Support for @code{__index__()} and @code{__int__()} method returning non-int type:
these methods will be required to return an instance of a strict subclass of
@ref{19b,,int}.

@item 
Support for @code{__float__()} method returning a strict subclass of
@ref{196,,float}: these methods will be required to return an instance of
@code{float}.

@item 
Support for @code{__complex__()} method returning a strict subclass of
@ref{197,,complex}: these methods will be required to return an instance of
@code{complex}.

@item 
Passing a complex number as the `real' or `imag' argument in the
@ref{197,,complex()} constructor is now deprecated; it should only be passed
as a single positional argument.
(Contributed by Serhiy Storchaka in gh-109218@footnote{https://github.com/python/cpython/issues/109218}.)
@end itemize

@item 
@ref{15,,calendar}: @code{calendar.January} and @code{calendar.February} constants are
deprecated and replaced by @ref{34e,,calendar.JANUARY} and
@ref{34f,,calendar.FEBRUARY}.
(Contributed by Prince Roshan in gh-103636@footnote{https://github.com/python/cpython/issues/103636}.)

@item 
@ref{1c,,codecs}: use @ref{316,,open()} instead of @ref{315,,codecs.open()}. (gh-133038@footnote{https://github.com/python/cpython/issues/133038})

@item 
@ref{330,,codeobject.co_lnotab}: use the @ref{350,,codeobject.co_lines()} method
instead.

@item 
@ref{34,,datetime}:


@itemize *

@item 
@ref{351,,utcnow()}:
use @code{datetime.datetime.now(tz=datetime.UTC)}.

@item 
@ref{352,,utcfromtimestamp()}:
use @code{datetime.datetime.fromtimestamp(timestamp, tz=datetime.UTC)}.
@end itemize

@item 
@ref{67,,gettext}: Plural value must be an integer.

@item 
@ref{7b,,importlib}:


@itemize *

@item 
@ref{353,,cache_from_source()} `debug_override' parameter is
deprecated: use the `optimization' parameter instead.
@end itemize

@item 
@ref{7e,,importlib.metadata}:


@itemize *

@item 
@code{EntryPoints} tuple interface.

@item 
Implicit @code{None} on return values.
@end itemize

@item 
@ref{8b,,logging}: the @code{warn()} method has been deprecated
since Python 3.3, use @ref{354,,warning()} instead.

@item 
@ref{8f,,mailbox}: Use of StringIO input and text mode is deprecated, use
BytesIO and binary mode instead.

@item 
@ref{a5,,os}: Calling @ref{355,,os.register_at_fork()} in multi-threaded process.

@item 
@code{pydoc.ErrorDuringImport}: A tuple value for `exc_info' parameter is
deprecated, use an exception instance.

@item 
@ref{be,,re}: More strict rules are now applied for numerical group references
and group names in regular expressions.  Only sequence of ASCII digits is now
accepted as a numerical reference.  The group name in bytes patterns and
replacement strings can now only contain ASCII letters and digits and
underscore.
(Contributed by Serhiy Storchaka in gh-91760@footnote{https://github.com/python/cpython/issues/91760}.)

@item 
@code{sre_compile}, @code{sre_constants} and @code{sre_parse} modules.

@item 
@ref{ca,,shutil}: @ref{356,,rmtree()}’s `onerror' parameter is deprecated in
Python 3.12; use the `onexc' parameter instead.

@item 
@ref{d5,,ssl} options and protocols:


@itemize *

@item 
@ref{357,,ssl.SSLContext} without protocol argument is deprecated.

@item 
@ref{357,,ssl.SSLContext}: @ref{358,,set_npn_protocols()} and
@code{selected_npn_protocol()} are deprecated: use ALPN
instead.

@item 
@code{ssl.OP_NO_SSL*} options

@item 
@code{ssl.OP_NO_TLS*} options

@item 
@code{ssl.PROTOCOL_SSLv3}

@item 
@code{ssl.PROTOCOL_TLS}

@item 
@code{ssl.PROTOCOL_TLSv1}

@item 
@code{ssl.PROTOCOL_TLSv1_1}

@item 
@code{ssl.PROTOCOL_TLSv1_2}

@item 
@code{ssl.TLSVersion.SSLv3}

@item 
@code{ssl.TLSVersion.TLSv1}

@item 
@code{ssl.TLSVersion.TLSv1_1}
@end itemize

@item 
@ref{f3,,threading} methods:


@itemize *

@item 
@code{threading.Condition.notifyAll()}: use @ref{359,,notify_all()}.

@item 
@code{threading.Event.isSet()}: use @ref{35a,,is_set()}.

@item 
@code{threading.Thread.isDaemon()}, @ref{35b,,threading.Thread.setDaemon()}:
use @ref{35c,,threading.Thread.daemon} attribute.

@item 
@code{threading.Thread.getName()}, @ref{35d,,threading.Thread.setName()}:
use @ref{2a0,,threading.Thread.name} attribute.

@item 
@code{threading.currentThread()}: use @ref{35e,,threading.current_thread()}.

@item 
@code{threading.activeCount()}: use @ref{35f,,threading.active_count()}.
@end itemize

@item 
@ref{360,,typing.Text} (gh-92332@footnote{https://github.com/python/cpython/issues/92332}).

@item 
The internal class @code{typing._UnionGenericAlias} is no longer used to implement
@ref{2a8,,typing.Union}. To preserve compatibility with users using this private
class, a compatibility shim will be provided until at least Python 3.17. (Contributed by
Jelle Zijlstra in gh-105499@footnote{https://github.com/python/cpython/issues/105499}.)

@item 
@ref{361,,unittest.IsolatedAsyncioTestCase}: it is deprecated to return a value
that is not @code{None} from a test case.

@item 
@ref{110,,urllib.parse} deprecated functions: @ref{362,,urlparse()} instead


@itemize *

@item 
@code{splitattr()}

@item 
@code{splithost()}

@item 
@code{splitnport()}

@item 
@code{splitpasswd()}

@item 
@code{splitport()}

@item 
@code{splitquery()}

@item 
@code{splittag()}

@item 
@code{splittype()}

@item 
@code{splituser()}

@item 
@code{splitvalue()}

@item 
@code{to_bytes()}
@end itemize

@item 
@ref{11e,,wsgiref}: @code{SimpleHandler.stdout.write()} should not do partial
writes.

@item 
@ref{12b,,xml.etree.ElementTree}: Testing the truth value of an
@ref{363,,Element} is deprecated. In a future release it
will always return @code{True}. Prefer explicit @code{len(elem)} or
@code{elem is not None} tests instead.

@item 
@ref{292,,sys._clear_type_cache()} is deprecated:
use @ref{364,,sys._clear_internal_caches()} instead.
@end itemize

@node CPython bytecode changes,C API changes,Deprecated,What’s new in Python 3 14
@anchor{whatsnew/3 14 cpython-bytecode-changes}@anchor{365}
@subsection CPython bytecode changes



@itemize *

@item 
Replaced the opcode @code{BINARY_SUBSCR} by the @ref{366,,BINARY_OP}
opcode with the @code{NB_SUBSCR} oparg.
(Contributed by Irit Katriel in gh-100239@footnote{https://github.com/python/cpython/issues/100239}.)

@item 
Add the @ref{367,,BUILD_INTERPOLATION} and @ref{368,,BUILD_TEMPLATE}
opcodes to construct new @ref{16b,,Interpolation}
and @ref{16a,,Template} instances, respectively.
(Contributed by Lysandros Nikolaou and others in gh-132661@footnote{https://github.com/python/cpython/issues/132661};
see also @ref{144,,PEP 750; Template strings}).

@item 
Remove the @code{BUILD_CONST_KEY_MAP} opcode.
Use @ref{369,,BUILD_MAP} instead.
(Contributed by Mark Shannon in gh-122160@footnote{https://github.com/python/cpython/issues/122160}.)

@item 
Replace the @code{LOAD_ASSERTION_ERROR} opcode with
@ref{36a,,LOAD_COMMON_CONSTANT} and add support for loading
@ref{36b,,NotImplementedError}.

@item 
Add the @ref{36c,,LOAD_FAST_BORROW} and @ref{36d,,LOAD_FAST_BORROW_LOAD_FAST_BORROW}
opcodes to reduce reference counting overhead when the interpreter can prove
that the reference in the frame outlives the reference loaded onto the stack.
(Contributed by Matt Page in gh-130704@footnote{https://github.com/python/cpython/issues/130704}.)

@item 
Add the @ref{36e,,LOAD_SMALL_INT} opcode, which pushes a small integer
equal to the @code{oparg} to the stack.
The @code{RETURN_CONST} opcode is removed as it is no longer used.
(Contributed by Mark Shannon in gh-125837@footnote{https://github.com/python/cpython/issues/125837}.)

@item 
Add the new @ref{36f,,LOAD_SPECIAL} instruction.
Generate code for @ref{186,,with} and @ref{185,,async with} statements
using the new instruction.
Removed the @code{BEFORE_WITH} and @code{BEFORE_ASYNC_WITH} instructions.
(Contributed by Mark Shannon in gh-120507@footnote{https://github.com/python/cpython/issues/120507}.)

@item 
Add the @ref{370,,POP_ITER} opcode to support ‘virtual’ iterators.
(Contributed by Mark Shannon in gh-132554@footnote{https://github.com/python/cpython/issues/132554}.)
@end itemize

@menu
* Pseudo-instructions:: 

@end menu

@node Pseudo-instructions,,,CPython bytecode changes
@anchor{whatsnew/3 14 pseudo-instructions}@anchor{371}
@subsubsection Pseudo-instructions



@itemize *

@item 
Add the @code{ANNOTATIONS_PLACEHOLDER} pseudo instruction
to support partially executed module-level annotations with
@ref{145,,deferred evaluation of annotations}.
(Contributed by Jelle Zijlstra in gh-130907@footnote{https://github.com/python/cpython/issues/130907}.)

@item 
Add the @code{BINARY_OP_EXTEND} pseudo instruction,
which executes a pair of functions (guard and specialization functions)
accessed from the inline cache.
(Contributed by Irit Katriel in gh-100239@footnote{https://github.com/python/cpython/issues/100239}.)

@item 
Add three specializations for @ref{372,,CALL_KW};
@code{CALL_KW_PY} for calls to Python functions,
@code{CALL_KW_BOUND_METHOD} for calls to bound methods, and
@code{CALL_KW_NON_PY} for all other calls.
(Contributed by Mark Shannon in gh-118093@footnote{https://github.com/python/cpython/issues/118093}.)

@item 
Add the @ref{373,,JUMP_IF_TRUE} and @ref{374,,JUMP_IF_FALSE} pseudo instructions,
conditional jumps which do not impact the stack.
Replaced by the sequence @code{COPY 1}, @code{TO_BOOL}, @code{POP_JUMP_IF_TRUE/FALSE}.
(Contributed by Irit Katriel in gh-124285@footnote{https://github.com/python/cpython/issues/124285}.)

@item 
Add the @code{LOAD_CONST_MORTAL} pseudo instruction.
(Contributed by Mark Shannon in gh-128685@footnote{https://github.com/python/cpython/issues/128685}.)

@item 
Add the @ref{375,,LOAD_CONST_IMMORTAL} pseudo instruction,
which does the same as @code{LOAD_CONST}, but is more efficient
for immortal objects.
(Contributed by Mark Shannon in gh-125837@footnote{https://github.com/python/cpython/issues/125837}.)

@item 
Add the @ref{376,,NOT_TAKEN} pseudo instruction, used by @ref{e0,,sys.monitoring}
to record branch events (such as @ref{295,,BRANCH_LEFT}).
(Contributed by Mark Shannon in gh-122548@footnote{https://github.com/python/cpython/issues/122548}.)
@end itemize

@node C API changes,Build changes,CPython bytecode changes,What’s new in Python 3 14
@anchor{whatsnew/3 14 c-api-changes}@anchor{377}
@subsection C API changes


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

@end menu

@node Python configuration C API,New features in the C API,,C API changes
@anchor{whatsnew/3 14 python-configuration-c-api}@anchor{378}@anchor{whatsnew/3 14 whatsnew314-capi-config}@anchor{155}
@subsubsection Python configuration C API


Add a @ref{379,,PyInitConfig C API} to configure the Python
initialization without relying on C structures and the ability to make
ABI-compatible changes in the future.

Complete the 
@geindex Python 향상 제안; PEP 587
PEP 587@footnote{https://peps.python.org/pep-0587/} @ref{37a,,PyConfig C API} by adding
@ref{37b,,PyInitConfig_AddModule()} which can be used to add a built-in extension
module; a feature previously referred to as the “inittab”.

Add @ref{37c,,PyConfig_Get()} and @ref{37d,,PyConfig_Set()} functions to get and set
the current runtime configuration.

@geindex Python 향상 제안; PEP 587
PEP 587@footnote{https://peps.python.org/pep-0587/} ‘Python Initialization Configuration’ unified all the ways
to configure Python’s initialization. This PEP also unifies the configuration
of Python’s preinitialization and initialization in a single API.
Moreover, this PEP only provides a single choice to embed Python,
instead of having two ‘Python’ and ‘Isolated’ choices (PEP 587),
to further simplify the API.

The lower level PEP 587 PyConfig API remains available for use cases
with an intentionally higher level of coupling to CPython implementation details
(such as emulating the full functionality of CPython’s CLI, including its
configuration mechanisms).

(Contributed by Victor Stinner in gh-107954@footnote{https://github.com/python/cpython/issues/107954}.)


@subsubheading 더 보기


@geindex Python 향상 제안; PEP 741
PEP 741@footnote{https://peps.python.org/pep-0741/} and 
@geindex Python 향상 제안; PEP 587
PEP 587@footnote{https://peps.python.org/pep-0587/}


@node New features in the C API,Limited C API changes,Python configuration C API,C API changes
@anchor{whatsnew/3 14 new-features-in-the-c-api}@anchor{37e}
@subsubsection New features in the C API



@itemize *

@item 
Add @ref{37f,,Py_PACK_VERSION()} and @ref{380,,Py_PACK_FULL_VERSION()},
two new macros for bit-packing Python version numbers.
This is useful for comparisons with @ref{381,,Py_Version}
or @ref{382,,PY_VERSION_HEX}.
(Contributed by Petr Viktorin in gh-128629@footnote{https://github.com/python/cpython/issues/128629}.)

@item 
Add @ref{383,,PyBytes_Join(sep@comma{} iterable)} function,
similar to @code{sep.join(iterable)} in Python.
(Contributed by Victor Stinner in gh-121645@footnote{https://github.com/python/cpython/issues/121645}.)

@item 
Add functions to manipulate the configuration of the current
runtime Python interpreter
(@ref{155,,PEP 741; Python configuration C API}):


@itemize *

@item 
@ref{37c,,PyConfig_Get()}

@item 
@ref{384,,PyConfig_GetInt()}

@item 
@ref{37d,,PyConfig_Set()}

@item 
@ref{385,,PyConfig_Names()}
@end itemize

(Contributed by Victor Stinner in gh-107954@footnote{https://github.com/python/cpython/issues/107954}.)

@item 
Add functions to configure Python initialization
(@ref{155,,PEP 741; Python configuration C API}):


@itemize *

@item 
@ref{386,,Py_InitializeFromInitConfig()}

@item 
@ref{37b,,PyInitConfig_AddModule()}

@item 
@ref{387,,PyInitConfig_Create()}

@item 
@ref{388,,PyInitConfig_Free()}

@item 
@ref{389,,PyInitConfig_FreeStrList()}

@item 
@ref{38a,,PyInitConfig_GetError()}

@item 
@ref{38b,,PyInitConfig_GetExitCode()}

@item 
@ref{38c,,PyInitConfig_GetInt()}

@item 
@ref{38d,,PyInitConfig_GetStr()}

@item 
@ref{38e,,PyInitConfig_GetStrList()}

@item 
@ref{38f,,PyInitConfig_HasOption()}

@item 
@ref{390,,PyInitConfig_SetInt()}

@item 
@ref{391,,PyInitConfig_SetStr()}

@item 
@ref{392,,PyInitConfig_SetStrList()}
@end itemize

(Contributed by Victor Stinner in gh-107954@footnote{https://github.com/python/cpython/issues/107954}.)

@item 
Add @ref{393,,Py_fopen()} function to open a file.
This works similarly to the standard C @code{fopen()} function,
instead accepting a Python object for the `path' parameter
and setting an exception on error.
The corresponding new @ref{394,,Py_fclose()} function should be used
to close a file.
(Contributed by Victor Stinner in gh-127350@footnote{https://github.com/python/cpython/issues/127350}.)

@item 
Add @ref{395,,Py_HashBuffer()} to compute and return the hash value of a buffer.
(Contributed by Antoine Pitrou and Victor Stinner in gh-122854@footnote{https://github.com/python/cpython/issues/122854}.)

@item 
Add @ref{396,,PyImport_ImportModuleAttr()} and
@ref{397,,PyImport_ImportModuleAttrString()} helper functions to import a module
and get an attribute of the module.
(Contributed by Victor Stinner in gh-128911@footnote{https://github.com/python/cpython/issues/128911}.)

@item 
Add @ref{398,,PyIter_NextItem()} to replace @ref{399,,PyIter_Next()},
which has an ambiguous return value.
(Contributed by Irit Katriel and Erlend Aasland in gh-105201@footnote{https://github.com/python/cpython/issues/105201}.)

@item 
Add @ref{39a,,PyLong_GetSign()} function to get the sign of @ref{19b,,int} objects.
(Contributed by Sergey B Kirpichev in gh-116560@footnote{https://github.com/python/cpython/issues/116560}.)

@item 
Add @ref{39b,,PyLong_IsPositive()}, @ref{39c,,PyLong_IsNegative()}
and @ref{39d,,PyLong_IsZero()} for checking if @ref{39e,,PyLongObject}
is positive, negative, or zero, respectively.
(Contributed by James Roy and Sergey B Kirpichev in gh-126061@footnote{https://github.com/python/cpython/issues/126061}.)

@item 
Add new functions to convert C @code{<stdint.h>} numbers to/from
Python @ref{19b,,int} objects:


@itemize *

@item 
@ref{39f,,PyLong_AsInt32()}

@item 
@ref{3a0,,PyLong_AsInt64()}

@item 
@ref{3a1,,PyLong_AsUInt32()}

@item 
@ref{3a2,,PyLong_AsUInt64()}

@item 
@ref{3a3,,PyLong_FromInt32()}

@item 
@ref{3a4,,PyLong_FromInt64()}

@item 
@ref{3a5,,PyLong_FromUInt32()}

@item 
@ref{3a6,,PyLong_FromUInt64()}
@end itemize

(Contributed by Victor Stinner in gh-120389@footnote{https://github.com/python/cpython/issues/120389}.)

@item 
Add a new import and export API for Python @ref{19b,,int} objects
(
@geindex Python 향상 제안; PEP 757
PEP 757@footnote{https://peps.python.org/pep-0757/}):


@itemize *

@item 
@ref{3a7,,PyLong_GetNativeLayout()}

@item 
@ref{3a8,,PyLong_Export()}

@item 
@ref{3a9,,PyLong_FreeExport()}

@item 
@ref{3aa,,PyLongWriter_Create()}

@item 
@ref{3ab,,PyLongWriter_Finish()}

@item 
@ref{3ac,,PyLongWriter_Discard()}
@end itemize

(Contributed by Sergey B Kirpichev and Victor Stinner in gh-102471@footnote{https://github.com/python/cpython/issues/102471}.)

@item 
Add @ref{3ad,,PyMonitoring_FireBranchLeftEvent()} and
@ref{3ae,,PyMonitoring_FireBranchRightEvent()} for generating
@ref{295,,BRANCH_LEFT} and @ref{296,,BRANCH_RIGHT}
events, respectively.
(Contributed by Mark Shannon in gh-122548@footnote{https://github.com/python/cpython/issues/122548}.)

@item 
Add @ref{3af,,PyType_Freeze()} function to make a type immutable.
(Contributed by Victor Stinner in gh-121654@footnote{https://github.com/python/cpython/issues/121654}.)

@item 
Add @ref{3b0,,PyType_GetBaseByToken()} and @ref{3b1,,Py_tp_token} slot
for easier superclass identification, which attempts to resolve the
type checking issue mentioned in 
@geindex Python 향상 제안; PEP 630#type-checking
PEP 630@footnote{https://peps.python.org/pep-0630/#type-checking}.
(Contributed in gh-124153@footnote{https://github.com/python/cpython/issues/124153}.)

@item 
Add a new @ref{3b2,,PyUnicode_Equal()} function to test if two
strings are equal.
The function is also added to the Limited C API.
(Contributed by Victor Stinner in gh-124502@footnote{https://github.com/python/cpython/issues/124502}.)

@item 
Add a new @ref{3b3,,PyUnicodeWriter} API to create a Python @ref{169,,str}
object, with the following functions:


@itemize *

@item 
@ref{3b4,,PyUnicodeWriter_Create()}

@item 
@ref{3b5,,PyUnicodeWriter_DecodeUTF8Stateful()}

@item 
@ref{3b6,,PyUnicodeWriter_Discard()}

@item 
@ref{3b7,,PyUnicodeWriter_Finish()}

@item 
@ref{3b8,,PyUnicodeWriter_Format()}

@item 
@ref{3b9,,PyUnicodeWriter_WriteASCII()}

@item 
@ref{3ba,,PyUnicodeWriter_WriteChar()}

@item 
@ref{3bb,,PyUnicodeWriter_WriteRepr()}

@item 
@ref{3bc,,PyUnicodeWriter_WriteStr()}

@item 
@ref{3bd,,PyUnicodeWriter_WriteSubstring()}

@item 
@ref{3be,,PyUnicodeWriter_WriteUCS4()}

@item 
@ref{3bf,,PyUnicodeWriter_WriteUTF8()}

@item 
@ref{3c0,,PyUnicodeWriter_WriteWideChar()}
@end itemize

(Contributed by Victor Stinner in gh-119182@footnote{https://github.com/python/cpython/issues/119182}.)

@item 
The @code{k} and @code{K} formats in @ref{3c1,,PyArg_ParseTuple()} and
similar functions now use @ref{19e,,__index__()} if available,
like all other integer formats.
(Contributed by Serhiy Storchaka in gh-112068@footnote{https://github.com/python/cpython/issues/112068}.)

@item 
Add support for a new @code{p} format unit in @ref{3c2,,Py_BuildValue()}
that produces a Python @ref{3c3,,bool} object from a C integer.
(Contributed by Pablo Galindo in bpo-45325@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45325}.)

@item 
Add @ref{3c4,,PyUnstable_IsImmortal()} for determining if
an object is @ref{290,,immortal}, for debugging purposes.
(Contributed by Peter Bierma in gh-128509@footnote{https://github.com/python/cpython/issues/128509}.)

@item 
Add @ref{3c5,,PyUnstable_Object_EnableDeferredRefcount()} for enabling
deferred reference counting, as outlined in 
@geindex Python 향상 제안; PEP 703
PEP 703@footnote{https://peps.python.org/pep-0703/}.

@item 
Add @ref{3c6,,PyUnstable_Object_IsUniquelyReferenced()} as
a replacement for @code{Py_REFCNT(op) == 1} on @ref{1f4,,free threaded} builds.
(Contributed by Peter Bierma in gh-133140@footnote{https://github.com/python/cpython/issues/133140}.)

@item 
Add @ref{3c7,,PyUnstable_Object_IsUniqueReferencedTemporary()} to
determine if an object is a unique temporary object on the
interpreter’s operand stack.
This can be used in some cases as a replacement for checking
if @ref{2cf,,Py_REFCNT()} is @code{1} for Python objects passed
as arguments to C API functions.
(Contributed by Sam Gross in gh-133164@footnote{https://github.com/python/cpython/issues/133164}.)
@end itemize

@node Limited C API changes,Removed C APIs,New features in the C API,C API changes
@anchor{whatsnew/3 14 limited-c-api-changes}@anchor{3c8}
@subsubsection Limited C API changes



@itemize *

@item 
In the limited C API version 3.14 and newer, @ref{3c9,,Py_TYPE()} and
@ref{2cf,,Py_REFCNT()} are now implemented as an opaque function call
to hide implementation details.
(Contributed by Victor Stinner in gh-120600@footnote{https://github.com/python/cpython/issues/120600} and gh-124127@footnote{https://github.com/python/cpython/issues/124127}.)

@item 
Remove the @ref{3ca,,PySequence_Fast_GET_SIZE},
@ref{3cb,,PySequence_Fast_GET_ITEM},
and @ref{3cc,,PySequence_Fast_ITEMS}
macros from the limited C API, since they have always been broken
in the limited C API.
(Contributed by Victor Stinner in gh-91417@footnote{https://github.com/python/cpython/issues/91417}.)
@end itemize

@node Removed C APIs,Deprecated C APIs,Limited C API changes,C API changes
@anchor{whatsnew/3 14 removed-c-apis}@anchor{3cd}@anchor{whatsnew/3 14 whatsnew314-c-api-removed}@anchor{3ce}
@subsubsection Removed C APIs



@itemize *

@item 
Creating @ref{3cf,,immutable types} with
mutable bases was deprecated in Python 3.12,
and now raises a @ref{198,,TypeError}.
(Contributed by Nikita Sobolev in gh-119775@footnote{https://github.com/python/cpython/issues/119775}.)

@item 
Remove @code{PyDictObject.ma_version_tag} member, which was deprecated
in Python 3.12.
Use the @ref{3d0,,PyDict_AddWatcher()} API instead.
(Contributed by Sam Gross in gh-124296@footnote{https://github.com/python/cpython/issues/124296}.)

@item 
Remove the private @code{_Py_InitializeMain()} function.
It was a @ref{3d1,,provisional API} added to Python 3.8 by 
@geindex Python 향상 제안; PEP 587
PEP 587@footnote{https://peps.python.org/pep-0587/}.
(Contributed by Victor Stinner in gh-129033@footnote{https://github.com/python/cpython/issues/129033}.)

@item 
Remove the undocumented APIs @code{Py_C_RECURSION_LIMIT}
and @code{PyThreadState.c_recursion_remaining}.
These were added in 3.13 and have been removed without deprecation.
Use @ref{3d2,,Py_EnterRecursiveCall()} to guard against runaway
recursion in C code.
(Removed by Petr Viktorin in gh-133079@footnote{https://github.com/python/cpython/issues/133079}, see also gh-130396@footnote{https://github.com/python/cpython/issues/130396}.)
@end itemize

@node Deprecated C APIs,,Removed C APIs,C API changes
@anchor{whatsnew/3 14 deprecated-c-apis}@anchor{3d3}@anchor{whatsnew/3 14 whatsnew314-c-api-deprecated}@anchor{3d4}
@subsubsection Deprecated C APIs



@itemize *

@item 
The @code{Py_HUGE_VAL} macro is now @ref{23d,,soft deprecated}.
Use @code{Py_INFINITY} instead.
(Contributed by Sergey B Kirpichev in gh-120026@footnote{https://github.com/python/cpython/issues/120026}.)

@item 
The @code{Py_IS_NAN}, @code{Py_IS_INFINITY},
and @code{Py_IS_FINITE} macros are now @ref{23d,,soft deprecated}.
Use @code{isnan}, @code{isinf} and @code{isfinite}
instead, available from @code{math.h} since C99.
(Contributed by Sergey B Kirpichev in gh-119613@footnote{https://github.com/python/cpython/issues/119613}.)

@item 
Non-tuple sequences are now deprecated as argument for the @code{(items)}
format unit in @ref{3c1,,PyArg_ParseTuple()} and other @ref{3d5,,argument parsing} functions if `items' contains format units
which store a @ref{3d6,,borrowed buffer} or a
@ref{3d7,,borrowed reference}.
(Contributed by Serhiy Storchaka in gh-50333@footnote{https://github.com/python/cpython/issues/50333}.)

@item 
The @code{_PyMonitoring_FireBranchEvent} function is now deprecated
and should be replaced with calls to
@ref{3ad,,PyMonitoring_FireBranchLeftEvent()} and
@ref{3ae,,PyMonitoring_FireBranchRightEvent()}.

@item 
The previously undocumented function @ref{3d8,,PySequence_In()} is
now @ref{23d,,soft deprecated}.
Use @ref{3d9,,PySequence_Contains()} instead.
(Contributed by Yuki Kobayashi in gh-127896@footnote{https://github.com/python/cpython/issues/127896}.)
@end itemize

@c Add C API deprecations above alphabetically, not here at the end.

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

@end menu

@node Pending removal in Python 3 15<2>,Pending removal in Python 3 16<2>,,Deprecated C APIs
@anchor{whatsnew/3 14 id13}@anchor{3da}
@subsubsection Pending removal in Python 3.15



@itemize *

@item 
The @ref{3db,,PyImport_ImportModuleNoBlock()}:
Use @ref{3dc,,PyImport_ImportModule()} instead.

@item 
@ref{3dd,,PyWeakref_GetObject()} and @ref{3de,,PyWeakref_GET_OBJECT()}:
Use @ref{3df,,PyWeakref_GetRef()} instead. The pythoncapi-compat project@footnote{https://github.com/python/pythoncapi-compat/} can be used to get
@code{PyWeakref_GetRef()} on Python 3.12 and older.

@item 
@ref{3e0,,Py_UNICODE} type and the @code{Py_UNICODE_WIDE} macro:
Use @code{wchar_t} instead.

@item 
@code{PyUnicode_AsDecodedObject()}:
Use @ref{3e1,,PyCodec_Decode()} instead.

@item 
@code{PyUnicode_AsDecodedUnicode()}:
Use @ref{3e1,,PyCodec_Decode()} instead; Note that some codecs (for example, “base64”)
may return a type other than @ref{169,,str}, such as @ref{192,,bytes}.

@item 
@code{PyUnicode_AsEncodedObject()}:
Use @ref{3e2,,PyCodec_Encode()} instead.

@item 
@code{PyUnicode_AsEncodedUnicode()}:
Use @ref{3e2,,PyCodec_Encode()} instead; Note that some codecs (for example, “base64”)
may return a type other than @ref{192,,bytes}, such as @ref{169,,str}.

@item 
Python initialization functions, deprecated in Python 3.13:


@itemize *

@item 
@ref{3e3,,Py_GetPath()}:
Use @ref{37c,,PyConfig_Get("module_search_paths")}
(@ref{3e4,,sys.path}) instead.

@item 
@ref{3e5,,Py_GetPrefix()}:
Use @ref{37c,,PyConfig_Get("base_prefix")}
(@ref{3e6,,sys.base_prefix}) instead. Use @code{PyConfig_Get("prefix")} (@ref{3e7,,sys.prefix}) if @ref{3e8,,virtual environments} need to be handled.

@item 
@ref{3e9,,Py_GetExecPrefix()}:
Use @ref{37c,,PyConfig_Get("base_exec_prefix")}
(@ref{3ea,,sys.base_exec_prefix}) instead. Use
@code{PyConfig_Get("exec_prefix")}
(@ref{3eb,,sys.exec_prefix}) if @ref{3e8,,virtual environments} need to
be handled.

@item 
@ref{3ec,,Py_GetProgramFullPath()}:
Use @ref{37c,,PyConfig_Get("executable")}
(@ref{3ed,,sys.executable}) instead.

@item 
@ref{3ee,,Py_GetProgramName()}:
Use @ref{37c,,PyConfig_Get("executable")}
(@ref{3ed,,sys.executable}) instead.

@item 
@ref{3ef,,Py_GetPythonHome()}:
Use @ref{37c,,PyConfig_Get("home")} or the
@geindex PYTHONHOME
@geindex 환경 변수; PYTHONHOME
@ref{3f0,,PYTHONHOME} environment variable instead.
@end itemize

The pythoncapi-compat project@footnote{https://github.com/python/pythoncapi-compat/} can be used to get
@ref{37c,,PyConfig_Get()} on Python 3.13 and older.

@item 
Functions to configure Python’s initialization, deprecated in Python 3.11:


@itemize *

@item 
@code{PySys_SetArgvEx()}:
Set @ref{3f1,,PyConfig.argv} instead.

@item 
@code{PySys_SetArgv()}:
Set @ref{3f1,,PyConfig.argv} instead.

@item 
@code{Py_SetProgramName()}:
Set @ref{3f2,,PyConfig.program_name} instead.

@item 
@code{Py_SetPythonHome()}:
Set @ref{3f3,,PyConfig.home} instead.

@item 
@ref{3f4,,PySys_ResetWarnOptions()}:
Clear @ref{3f5,,sys.warnoptions} and @code{warnings.filters} instead.
@end itemize

The @ref{3f6,,Py_InitializeFromConfig()} API should be used with
@ref{3f7,,PyConfig} instead.

@item 
Global configuration variables:


@itemize *

@item 
@ref{3f8,,Py_DebugFlag}:
Use @ref{3f9,,PyConfig.parser_debug} or
@ref{37c,,PyConfig_Get("parser_debug")} instead.

@item 
@ref{3fa,,Py_VerboseFlag}:
Use @ref{3fb,,PyConfig.verbose} or
@ref{37c,,PyConfig_Get("verbose")} instead.

@item 
@ref{3fc,,Py_QuietFlag}:
Use @ref{3fd,,PyConfig.quiet} or
@ref{37c,,PyConfig_Get("quiet")} instead.

@item 
@ref{3fe,,Py_InteractiveFlag}:
Use @ref{3ff,,PyConfig.interactive} or
@ref{37c,,PyConfig_Get("interactive")} instead.

@item 
@ref{400,,Py_InspectFlag}:
Use @ref{401,,PyConfig.inspect} or
@ref{37c,,PyConfig_Get("inspect")} instead.

@item 
@ref{402,,Py_OptimizeFlag}:
Use @ref{403,,PyConfig.optimization_level} or
@ref{37c,,PyConfig_Get("optimization_level")} instead.

@item 
@ref{404,,Py_NoSiteFlag}:
Use @ref{405,,PyConfig.site_import} or
@ref{37c,,PyConfig_Get("site_import")} instead.

@item 
@ref{406,,Py_BytesWarningFlag}:
Use @ref{407,,PyConfig.bytes_warning} or
@ref{37c,,PyConfig_Get("bytes_warning")} instead.

@item 
@ref{408,,Py_FrozenFlag}:
Use @ref{409,,PyConfig.pathconfig_warnings} or
@ref{37c,,PyConfig_Get("pathconfig_warnings")} instead.

@item 
@ref{40a,,Py_IgnoreEnvironmentFlag}:
Use @ref{40b,,PyConfig.use_environment} or
@ref{37c,,PyConfig_Get("use_environment")} instead.

@item 
@ref{40c,,Py_DontWriteBytecodeFlag}:
Use @ref{40d,,PyConfig.write_bytecode} or
@ref{37c,,PyConfig_Get("write_bytecode")} instead.

@item 
@ref{40e,,Py_NoUserSiteDirectory}:
Use @ref{40f,,PyConfig.user_site_directory} or
@ref{37c,,PyConfig_Get("user_site_directory")} instead.

@item 
@ref{410,,Py_UnbufferedStdioFlag}:
Use @ref{411,,PyConfig.buffered_stdio} or
@ref{37c,,PyConfig_Get("buffered_stdio")} instead.

@item 
@ref{412,,Py_HashRandomizationFlag}:
Use @ref{413,,PyConfig.use_hash_seed}
and @ref{414,,PyConfig.hash_seed} or
@ref{37c,,PyConfig_Get("hash_seed")} instead.

@item 
@ref{415,,Py_IsolatedFlag}:
Use @ref{416,,PyConfig.isolated} or
@ref{37c,,PyConfig_Get("isolated")} instead.

@item 
@ref{417,,Py_LegacyWindowsFSEncodingFlag}:
Use @ref{418,,PyPreConfig.legacy_windows_fs_encoding} or
@ref{37c,,PyConfig_Get("legacy_windows_fs_encoding")} instead.

@item 
@ref{419,,Py_LegacyWindowsStdioFlag}:
Use @ref{41a,,PyConfig.legacy_windows_stdio} or
@ref{37c,,PyConfig_Get("legacy_windows_stdio")} instead.

@item 
@code{Py_FileSystemDefaultEncoding}, @code{Py_HasFileSystemDefaultEncoding}:
Use @ref{41b,,PyConfig.filesystem_encoding} or
@ref{37c,,PyConfig_Get("filesystem_encoding")} instead.

@item 
@code{Py_FileSystemDefaultEncodeErrors}:
Use @ref{41c,,PyConfig.filesystem_errors} or
@ref{37c,,PyConfig_Get("filesystem_errors")} instead.

@item 
@code{Py_UTF8Mode}:
Use @ref{41d,,PyPreConfig.utf8_mode} or
@ref{37c,,PyConfig_Get("utf8_mode")} instead.
(see @ref{41e,,Py_PreInitialize()})
@end itemize

The @ref{3f6,,Py_InitializeFromConfig()} API should be used with
@ref{3f7,,PyConfig} to set these options. Or @ref{37c,,PyConfig_Get()} can be
used to get these options at runtime.
@end itemize

@node Pending removal in Python 3 16<2>,Pending removal in Python 3 18<2>,Pending removal in Python 3 15<2>,Deprecated C APIs
@anchor{whatsnew/3 14 id14}@anchor{41f}
@subsubsection Pending removal in Python 3.16



@itemize *

@item 
The bundled copy of @code{libmpdec}.
@end itemize

@node Pending removal in Python 3 18<2>,Pending removal in future versions<2>,Pending removal in Python 3 16<2>,Deprecated C APIs
@anchor{whatsnew/3 14 id15}@anchor{420}
@subsubsection Pending removal in Python 3.18



@itemize *

@item 
The following private functions are deprecated
and planned for removal in Python 3.18:


@itemize *

@item 
@code{_PyBytes_Join()}: use @ref{383,,PyBytes_Join()}.

@item 
@code{_PyDict_GetItemStringWithError()}: use @ref{421,,PyDict_GetItemStringRef()}.

@item 
@code{_PyDict_Pop()}: use @ref{422,,PyDict_Pop()}.

@item 
@code{_PyLong_Sign()}: use @ref{39a,,PyLong_GetSign()}.

@item 
@code{_PyLong_FromDigits()} and @code{_PyLong_New()}:
use @ref{3aa,,PyLongWriter_Create()}.

@item 
@code{_PyThreadState_UncheckedGet()}: use @ref{423,,PyThreadState_GetUnchecked()}.

@item 
@code{_PyUnicode_AsString()}: use @ref{424,,PyUnicode_AsUTF8()}.

@item 
@code{_PyUnicodeWriter_Init()}:
replace @code{_PyUnicodeWriter_Init(&writer)} with
@ref{3b4,,writer = PyUnicodeWriter_Create(0)}.

@item 
@code{_PyUnicodeWriter_Finish()}:
replace @code{_PyUnicodeWriter_Finish(&writer)} with
@ref{3b7,,PyUnicodeWriter_Finish(writer)}.

@item 
@code{_PyUnicodeWriter_Dealloc()}:
replace @code{_PyUnicodeWriter_Dealloc(&writer)} with
@ref{3b6,,PyUnicodeWriter_Discard(writer)}.

@item 
@code{_PyUnicodeWriter_WriteChar()}:
replace @code{_PyUnicodeWriter_WriteChar(&writer, ch)} with
@ref{3ba,,PyUnicodeWriter_WriteChar(writer@comma{} ch)}.

@item 
@code{_PyUnicodeWriter_WriteStr()}:
replace @code{_PyUnicodeWriter_WriteStr(&writer, str)} with
@ref{3bc,,PyUnicodeWriter_WriteStr(writer@comma{} str)}.

@item 
@code{_PyUnicodeWriter_WriteSubstring()}:
replace @code{_PyUnicodeWriter_WriteSubstring(&writer, str, start, end)} with
@ref{3bd,,PyUnicodeWriter_WriteSubstring(writer@comma{} str@comma{} start@comma{} end)}.

@item 
@code{_PyUnicodeWriter_WriteASCIIString()}:
replace @code{_PyUnicodeWriter_WriteASCIIString(&writer, str)} with
@ref{3b9,,PyUnicodeWriter_WriteASCII(writer@comma{} str)}.

@item 
@code{_PyUnicodeWriter_WriteLatin1String()}:
replace @code{_PyUnicodeWriter_WriteLatin1String(&writer, str)} with
@ref{3bf,,PyUnicodeWriter_WriteUTF8(writer@comma{} str)}.

@item 
@code{_PyUnicodeWriter_Prepare()}: (no replacement).

@item 
@code{_PyUnicodeWriter_PrepareKind()}: (no replacement).

@item 
@code{_Py_HashPointer()}: use @ref{425,,Py_HashPointer()}.

@item 
@code{_Py_fopen_obj()}: use @ref{393,,Py_fopen()}.
@end itemize

The pythoncapi-compat project@footnote{https://github.com/python/pythoncapi-compat/} can be used to get
these new public functions on Python 3.13 and older.
(Contributed by Victor Stinner in gh-128863@footnote{https://github.com/python/cpython/issues/128863}.)
@end itemize

@node Pending removal in future versions<2>,,Pending removal in Python 3 18<2>,Deprecated C APIs
@anchor{whatsnew/3 14 id16}@anchor{426}
@subsubsection Pending removal in future versions


The following APIs are deprecated and will be removed,
although there is currently no date scheduled for their removal.


@itemize *

@item 
@ref{427,,Py_TPFLAGS_HAVE_FINALIZE}:
Unneeded since Python 3.8.

@item 
@ref{428,,PyErr_Fetch()}:
Use @ref{429,,PyErr_GetRaisedException()} instead.

@item 
@ref{42a,,PyErr_NormalizeException()}:
Use @ref{429,,PyErr_GetRaisedException()} instead.

@item 
@ref{42b,,PyErr_Restore()}:
Use @ref{42c,,PyErr_SetRaisedException()} instead.

@item 
@ref{42d,,PyModule_GetFilename()}:
Use @ref{42e,,PyModule_GetFilenameObject()} instead.

@item 
@ref{42f,,PyOS_AfterFork()}:
Use @ref{430,,PyOS_AfterFork_Child()} instead.

@item 
@ref{431,,PySlice_GetIndicesEx()}:
Use @ref{432,,PySlice_Unpack()} and @ref{433,,PySlice_AdjustIndices()} instead.

@item 
@ref{434,,PyUnicode_READY()}:
Unneeded since Python 3.12

@item 
@code{PyErr_Display()}:
Use @ref{435,,PyErr_DisplayException()} instead.

@item 
@code{_PyErr_ChainExceptions()}:
Use @code{_PyErr_ChainExceptions1()} instead.

@item 
@code{PyBytesObject.ob_shash} member:
call @ref{436,,PyObject_Hash()} instead.

@item 
Thread Local Storage (TLS) API:


@itemize *

@item 
@ref{437,,PyThread_create_key()}:
Use @ref{438,,PyThread_tss_alloc()} instead.

@item 
@ref{439,,PyThread_delete_key()}:
Use @ref{43a,,PyThread_tss_free()} instead.

@item 
@ref{43b,,PyThread_set_key_value()}:
Use @ref{43c,,PyThread_tss_set()} instead.

@item 
@ref{43d,,PyThread_get_key_value()}:
Use @ref{43e,,PyThread_tss_get()} instead.

@item 
@ref{43f,,PyThread_delete_key_value()}:
Use @ref{440,,PyThread_tss_delete()} instead.

@item 
@ref{441,,PyThread_ReInitTLS()}:
Unneeded since Python 3.7.
@end itemize
@end itemize

@node Build changes,Porting to Python 3 14,C API changes,What’s new in Python 3 14
@anchor{whatsnew/3 14 build-changes}@anchor{442}@anchor{whatsnew/3 14 whatsnew314-build-changes}@anchor{156}
@subsection Build changes



@itemize *

@item 
@geindex Python 향상 제안; PEP 776
PEP 776@footnote{https://peps.python.org/pep-0776/}: Emscripten is now an officially supported platform at
@geindex Python 향상 제안; PEP 11#tier-3
tier 3@footnote{https://peps.python.org/pep-0011/#tier-3}. As a part of this effort, more than 25 bugs in
Emscripten libc@footnote{https://emscripten.org/docs/porting/emscripten-runtime-environment.html} were fixed. Emscripten now includes support
for @ref{2e,,ctypes}, @ref{e7,,termios}, and @ref{5d,,fcntl}, as well as
experimental support for the new @ref{443,,default interactive shell}.
(Contributed by R. Hood Chatham in gh-127146@footnote{https://github.com/python/cpython/issues/127146}, gh-127683@footnote{https://github.com/python/cpython/issues/127683}, and gh-136931@footnote{https://github.com/python/cpython/issues/136931}.)

@item 
Official Android binary releases are now provided on python.org@footnote{https://www.python.org/downloads/android/}.

@item 
GNU Autoconf 2.72 is now required to generate @code{configure}.
(Contributed by Erlend Aasland in gh-115765@footnote{https://github.com/python/cpython/issues/115765}.)

@item 
@code{wasm32-unknown-emscripten} is now a 
@geindex Python 향상 제안; PEP 11
PEP 11@footnote{https://peps.python.org/pep-0011/} tier 3 platform.
(Contributed by R. Hood Chatham in gh-127146@footnote{https://github.com/python/cpython/issues/127146}, gh-127683@footnote{https://github.com/python/cpython/issues/127683}, and gh-136931@footnote{https://github.com/python/cpython/issues/136931}.)

@item 
@code{#pragma}-based linking with @code{python3*.lib} can now be switched off
with @ref{444,,Py_NO_LINK_LIB}.
(Contributed by Jean-Christophe Fillion-Robin in gh-82909@footnote{https://github.com/python/cpython/issues/82909}.)

@item 
CPython now enables a set of recommended compiler options by default
for improved security.
Use the @ref{445,,--disable-safety} @code{configure} option to disable them,
or the @ref{446,,--enable-slower-safety} option for a larger set
of compiler options, albeit with a performance cost.

@item 
The @code{WITH_FREELISTS} macro and @code{--without-freelists} @code{configure}
option have been removed.

@item 
The new @code{configure} option @ref{172,,--with-tail-call-interp}
may be used to enable the experimental tail call interpreter.
See @ref{14f,,A new type of interpreter} for further details.

@item 
To disable the new remote debugging support, use the
@ref{170,,--without-remote-debug} @code{configure} option.
This may be useful for security reasons.

@item 
iOS and macOS apps can now be configured to redirect @code{stdout} and
@code{stderr} content to the system log.
(Contributed by Russell Keith-Magee in gh-127592@footnote{https://github.com/python/cpython/issues/127592}.)

@item 
The iOS testbed is now able to stream test output while the test is running.
The testbed can also be used to run the test suite of projects other than
CPython itself.
(Contributed by Russell Keith-Magee in gh-127592@footnote{https://github.com/python/cpython/issues/127592}.)
@end itemize

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

@end menu

@node build-details json,Discontinuation of PGP signatures,,Build changes
@anchor{whatsnew/3 14 build-details-json}@anchor{447}@anchor{whatsnew/3 14 whatsnew314-build-details}@anchor{448}
@subsubsection @code{build-details.json}


Installations of Python now contain a new file, @code{build-details.json}.
This is a static JSON document containing build details for CPython,
to allow for introspection without needing to run code.
This is helpful for use-cases such as Python launchers, cross-compilation,
and so on.

@code{build-details.json} must be installed in the platform-independent
standard library directory. This corresponds to the @ref{449,,‘stdlib’} @ref{e1,,sysconfig} installation path,
which can be found by running @code{sysconfig.get_path('stdlib')}.


@subsubheading 더 보기


@geindex Python 향상 제안; PEP 739
PEP 739@footnote{https://peps.python.org/pep-0739/} – @code{build-details.json} 1.0 – a static description file
for Python build details


@node Discontinuation of PGP signatures,Free-threaded Python is officially supported,build-details json,Build changes
@anchor{whatsnew/3 14 discontinuation-of-pgp-signatures}@anchor{44a}@anchor{whatsnew/3 14 whatsnew314-no-more-pgp}@anchor{158}
@subsubsection Discontinuation of PGP signatures


PGP (Pretty Good Privacy) signatures will not be provided
for releases of Python 3.14 or future versions.
To verify CPython artifacts, users must use Sigstore verification materials@footnote{https://www.python.org/downloads/metadata/sigstore/}.
Releases have been signed using Sigstore@footnote{https://www.sigstore.dev/} since Python 3.11.

This change in release process was specified in 
@geindex Python 향상 제안; PEP 761
PEP 761@footnote{https://peps.python.org/pep-0761/}.

@node Free-threaded Python is officially supported,Binary releases for the experimental just-in-time compiler,Discontinuation of PGP signatures,Build changes
@anchor{whatsnew/3 14 free-threaded-python-is-officially-supported}@anchor{44b}@anchor{whatsnew/3 14 whatsnew314-free-threaded-now-supported}@anchor{157}
@subsubsection Free-threaded Python is officially supported


The free-threaded build of Python is now supported and no longer experimental.
This is the start of phase II@footnote{https://discuss.python.org/t/37075} where
free-threaded Python is officially supported but still optional.

The free-threading team are confident that the project is on the right path,
and appreciate the continued dedication from everyone working to make
free-threading ready for broader adoption across the Python community.

With these recommendations and the acceptance of this PEP, the Python developer
community should broadly advertise that free-threading is a supported
Python build option now and into the future, and that it will not be removed
without a proper deprecation schedule.

Any decision to transition to phase III@footnote{https://discuss.python.org/t/37075},
with free-threading as the default or sole build of Python is still undecided,
and dependent on many factors both within CPython itself and the community.
This decision is for the future.


@subsubheading 더 보기


@geindex Python 향상 제안; PEP 779
PEP 779@footnote{https://peps.python.org/pep-0779/}

PEP 779's acceptance@footnote{https://discuss.python.org/t/84319/123}


@node Binary releases for the experimental just-in-time compiler,,Free-threaded Python is officially supported,Build changes
@anchor{whatsnew/3 14 binary-releases-for-the-experimental-just-in-time-compiler}@anchor{44c}@anchor{whatsnew/3 14 whatsnew314-jit-compiler}@anchor{159}
@subsubsection Binary releases for the experimental just-in-time compiler


The official macOS and Windows release binaries now include an `experimental'
just-in-time (JIT) compiler. Although it is `not' recommended for production
use, it can be tested by setting 
@geindex PYTHON_JIT
@geindex 환경 변수; PYTHON_JIT
@ref{44d,,PYTHON_JIT=1} as an
environment variable. Downstream source builds and redistributors can use the
@ref{44e,,--enable-experimental-jit=yes-off} configuration option for similar
behavior.

The JIT is at an early stage and still in active development. As such, the
typical performance impact of enabling it can range from 10% slower to 20%
faster, depending on workload. To aid in testing and evaluation, a set of
introspection functions has been provided in the @ref{293,,sys._jit} namespace.
@ref{44f,,sys._jit.is_available()} can be used to determine if the current executable
supports JIT compilation, while @ref{450,,sys._jit.is_enabled()} can be used to tell
if JIT compilation has been enabled for the current process.

Currently, the most significant missing functionality is that native debuggers
and profilers like @code{gdb} and @code{perf} are unable to unwind through JIT frames
(Python debuggers and profilers, like @ref{aa,,pdb} or @ref{b4,,profile}, continue to
work without modification). Free-threaded builds do not support JIT compilation.

Please report any bugs or major performance regressions that you encounter!


@subsubheading 더 보기


@geindex Python 향상 제안; PEP 744
PEP 744@footnote{https://peps.python.org/pep-0744/}


@node Porting to Python 3 14,Notable changes in 3 14 1,Build changes,What’s new in Python 3 14
@anchor{whatsnew/3 14 porting-to-python-3-14}@anchor{14b}
@subsection Porting to Python 3.14


This section lists previously described changes and other bugfixes
that may require changes to your code.

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

@end menu

@node Changes in the Python API,Changes in annotations PEP 649 and PEP 749,,Porting to Python 3 14
@anchor{whatsnew/3 14 changes-in-the-python-api}@anchor{451}
@subsubsection Changes in the Python API



@itemize *

@item 
On Unix platforms other than macOS, `forkserver' is now the default
@ref{1d5,,start method} for @ref{98,,multiprocessing}
and @ref{1d6,,ProcessPoolExecutor}, instead of `fork'.

See @ref{1d3,,(1)} and
@ref{249,,(2)} for details.

If you encounter @ref{452,,NameError}s or pickling errors coming out of
@ref{98,,multiprocessing} or @ref{24,,concurrent.futures}, see the
@ref{1d9,,forkserver restrictions}.

This change does not affect Windows or macOS, where @ref{1d8,,‘spawn’} remains the default start method.

@item 
@ref{217,,functools.partial} is now a method descriptor.
Wrap it in @ref{453,,staticmethod()} if you want to preserve the old behavior.
(Contributed by Serhiy Storchaka and Dominykas Grigonis in gh-121027@footnote{https://github.com/python/cpython/issues/121027}.)

@item 
The @ref{152,,garbage collector is now incremental},
which means that the behavior of @ref{1b3,,gc.collect()} changes slightly:


@itemize *

@item 
@code{gc.collect(1)}: Performs an increment of garbage collection,
rather than collecting generation 1.

@item 
Other calls to @code{gc.collect()} are unchanged.
@end itemize

@item 
The @ref{454,,locale.nl_langinfo()} function now temporarily sets the @code{LC_CTYPE}
locale in some cases.
This temporary change affects other threads.
(Contributed by Serhiy Storchaka in gh-69998@footnote{https://github.com/python/cpython/issues/69998}.)

@item 
@ref{2a7,,types.UnionType} is now an alias for @ref{2a8,,typing.Union},
causing changes in some behaviors.
See @ref{2a9,,above} for more details.
(Contributed by Jelle Zijlstra in gh-105499@footnote{https://github.com/python/cpython/issues/105499}.)

@item 
The runtime behavior of annotations has changed in various ways; see
@ref{145,,above} for details. While most code that interacts
with annotations should continue to work, some undocumented details may behave
differently.

@item 
As part of making the @ref{93,,mimetypes} CLI public,
it now exits with @code{1} on failure instead of @code{0}
and @code{2} on incorrect command-line parameters instead of @code{1}.
Error messages are now printed to stderr.

@item 
The @code{\B} pattern in regular expression now matches the empty string
when given as the entire pattern, which may cause behavioural changes.

@item 
On FreeBSD, @ref{291,,sys.platform} no longer contains the major version number.
@end itemize

@node Changes in annotations PEP 649 and PEP 749,Changes in the C API,Changes in the Python API,Porting to Python 3 14
@anchor{whatsnew/3 14 changes-in-annotations-pep-649-and-pep-749}@anchor{455}@anchor{whatsnew/3 14 whatsnew314-porting-annotations}@anchor{161}
@subsubsection Changes in annotations (
@geindex Python 향상 제안; PEP 649
`PEP 649' and 
@geindex Python 향상 제안; PEP 749
`PEP 749')


This section contains guidance on changes that may be needed to annotations
or Python code that interacts with or introspects annotations,
due to the changes related to @ref{145,,deferred evaluation of annotations}.

In the majority of cases, working code from older versions of Python
will not require any changes.

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

@end menu

@node Implications for annotated code,Implications for readers of __annotations__,,Changes in annotations PEP 649 and PEP 749
@anchor{whatsnew/3 14 implications-for-annotated-code}@anchor{456}
@subsubsection Implications for annotated code


If you define annotations in your code (for example, for use with a static type
checker), then this change probably does not affect you: you can keep
writing annotations the same way you did with previous versions of Python.

You will likely be able to remove quoted strings in annotations, which are frequently
used for forward references. Similarly, if you use @code{from __future__ import annotations}
to avoid having to write strings in annotations, you may well be able to
remove that import once you support only Python 3.14 and newer.
However, if you rely on third-party libraries that read annotations,
those libraries may need changes to support unquoted annotations before they
work as expected.

@node Implications for readers of __annotations__,Related changes,Implications for annotated code,Changes in annotations PEP 649 and PEP 749
@anchor{whatsnew/3 14 implications-for-readers-of-annotations}@anchor{457}
@subsubsection Implications for readers of @code{__annotations__}


If your code reads the @ref{458,,__annotations__} attribute on objects,
you may want to make changes in order to support code that relies on
deferred evaluation of annotations.
For example, you may want to use @ref{459,,annotationlib.get_annotations()} with
the @ref{15f,,FORWARDREF} format,
as the @ref{33,,dataclasses} module now does.

The external typing_extensions@footnote{https://pypi.org/project/typing_extensions/} package provides partial backports
of some of the functionality of the @ref{6,,annotationlib} module,
such as the @ref{230,,Format} enum and
the @ref{459,,get_annotations()} function.
These can be used to write cross-version code that takes advantage of
the new behavior in Python 3.14.

@node Related changes,from __future__ import annotations,Implications for readers of __annotations__,Changes in annotations PEP 649 and PEP 749
@anchor{whatsnew/3 14 related-changes}@anchor{45a}
@subsubsection Related changes


The changes in Python 3.14 are designed to rework how @code{__annotations__}
works at runtime while minimizing breakage to code that contains
annotations in source code and to code that reads @code{__annotations__}.
However, if you rely on undocumented details of the annotation behavior
or on private functions in the standard library, there are many ways in which
your code may not work in Python 3.14.
To safeguard your code against future changes, only use the documented
functionality of the @ref{6,,annotationlib} module.

In particular, do not read annotations directly from the namespace dictionary
attribute of type objects.
Use @ref{45b,,annotationlib.get_annotate_from_class_namespace()} during class
construction and @ref{459,,annotationlib.get_annotations()} afterwards.

In previous releases, it was sometimes possible to access class annotations
from an instance of an annotated class. This behavior was undocumented
and accidental, and will no longer work in Python 3.14.

@node from __future__ import annotations,,Related changes,Changes in annotations PEP 649 and PEP 749
@anchor{whatsnew/3 14 from-future-import-annotations}@anchor{45c}
@subsubsection @code{from __future__ import annotations}


In Python 3.7, 
@geindex Python 향상 제안; PEP 563
PEP 563@footnote{https://peps.python.org/pep-0563/} introduced the @code{from __future__ import annotations}
@ref{45d,,future statement}, which turns all annotations into strings.

However, this statement is now deprecated and it is expected to be removed
in a future version of Python.
This removal will not happen until after Python 3.13 reaches its end of life
in 2029, being the last version of Python without support for deferred
evaluation of annotations.

In Python 3.14, the behavior of code using @code{from __future__ import annotations}
is unchanged.

@node Changes in the C API,,Changes in annotations PEP 649 and PEP 749,Porting to Python 3 14
@anchor{whatsnew/3 14 changes-in-the-c-api}@anchor{45e}
@subsubsection Changes in the C API



@itemize *

@item 
@ref{45f,,Py_Finalize()} now deletes all interned strings. This
is backwards incompatible to any C extension that holds onto an interned
string after a call to @code{Py_Finalize()} and is then reused after a
call to @ref{460,,Py_Initialize()}.  Any issues arising from this behavior will
normally result in crashes during the execution of the subsequent call to
@code{Py_Initialize()} from accessing uninitialized memory. To fix, use
an address sanitizer to identify any use-after-free coming from
an interned string and deallocate it during module shutdown.
(Contributed by Eddie Elizondo in gh-113601@footnote{https://github.com/python/cpython/issues/113601}.)

@item 
The @ref{461,,Unicode Exception Objects} C API
now raises a @ref{198,,TypeError} if its exception argument is not
a @ref{462,,UnicodeError} object.
(Contributed by Bénédikt Tran in gh-127691@footnote{https://github.com/python/cpython/issues/127691}.)
@end itemize
@anchor{whatsnew/3 14 whatsnew314-refcount}@anchor{2d0}

@itemize *

@item 
The interpreter internally avoids some reference count modifications when
loading objects onto the operands stack by @ref{3d7,,borrowing}
references when possible. This can lead to smaller reference count values
compared to previous Python versions. C API extensions that checked
@ref{2cf,,Py_REFCNT()} of @code{1} to determine if an function argument is not
referenced by any other code should instead use
@ref{3c7,,PyUnstable_Object_IsUniqueReferencedTemporary()} as a safer replacement.

@item 
Private functions promoted to public C APIs:


@itemize *

@item 
@code{_PyBytes_Join()}: @ref{383,,PyBytes_Join()}

@item 
@code{_PyLong_IsNegative()}: @ref{39c,,PyLong_IsNegative()}

@item 
@code{_PyLong_IsPositive()}: @ref{39b,,PyLong_IsPositive()}

@item 
@code{_PyLong_IsZero()}: @ref{39d,,PyLong_IsZero()}

@item 
@code{_PyLong_Sign()}: @ref{39a,,PyLong_GetSign()}

@item 
@code{_PyUnicodeWriter_Dealloc()}: @ref{3b6,,PyUnicodeWriter_Discard()}

@item 
@code{_PyUnicodeWriter_Finish()}: @ref{3b7,,PyUnicodeWriter_Finish()}

@item 
@code{_PyUnicodeWriter_Init()}: use @ref{3b4,,PyUnicodeWriter_Create()}

@item 
@code{_PyUnicodeWriter_Prepare()}: (no replacement)

@item 
@code{_PyUnicodeWriter_PrepareKind()}: (no replacement)

@item 
@code{_PyUnicodeWriter_WriteChar()}: @ref{3ba,,PyUnicodeWriter_WriteChar()}

@item 
@code{_PyUnicodeWriter_WriteStr()}: @ref{3bc,,PyUnicodeWriter_WriteStr()}

@item 
@code{_PyUnicodeWriter_WriteSubstring()}: @ref{3bd,,PyUnicodeWriter_WriteSubstring()}

@item 
@code{_PyUnicode_EQ()}: @ref{3b2,,PyUnicode_Equal()}

@item 
@code{_PyUnicode_Equal()}: @ref{3b2,,PyUnicode_Equal()}

@item 
@code{_Py_GetConfig()}: @ref{37c,,PyConfig_Get()} and @ref{384,,PyConfig_GetInt()}

@item 
@code{_Py_HashBytes()}: @ref{395,,Py_HashBuffer()}

@item 
@code{_Py_fopen_obj()}: @ref{393,,Py_fopen()}

@item 
@code{PyMutex_IsLocked()} : @ref{463,,PyMutex_IsLocked()}
@end itemize

The pythoncapi-compat project@footnote{https://github.com/python/pythoncapi-compat/} can be used to get most of these new
functions on Python 3.13 and older.
@end itemize

@node Notable changes in 3 14 1,,Porting to Python 3 14,What’s new in Python 3 14
@anchor{whatsnew/3 14 notable-changes-in-3-14-1}@anchor{464}@anchor{whatsnew/3 14 pythoncapi-compat-project}@anchor{465}
@subsection Notable changes in 3.14.1



@itemize *

@item 
Add @ref{466,,PyUnstable_ThreadState_SetStackProtection()} and
@ref{467,,PyUnstable_ThreadState_ResetStackProtection()} functions to set
the stack protection base address and stack protection size of a Python
thread state.
(Contributed by Victor Stinner in gh-139653@footnote{https://github.com/python/cpython/issues/139653}.)
@end itemize

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 파이썬 3 13의 새로운 기능에 대해 알아봅시다,What’s New In Python 3 12,What’s new in Python 3 14,파이썬의 새로운 기능
@anchor{whatsnew/3 13 doc}@anchor{468}@anchor{whatsnew/3 13 translation-repo}@anchor{469}@anchor{whatsnew/3 13 what-s-new-in-python-3-13}@anchor{46a}
@section 파이썬 3.13의 새로운 기능에 대해 알아봅시다


@*편집자: 
Adam Turner and Thomas Wouters


@c Rules for maintenance:
@c 
@c * Anyone can add text to this document.  Do not spend very much time
@c on the wording of your changes, because your text will probably
@c get rewritten to some degree.
@c 
@c * The maintainer will go through Misc/NEWS periodically and add
@c changes; it's therefore more important to add your changes to
@c Misc/NEWS than to this file.
@c 
@c * This is not a complete list of every single change; completeness
@c is the purpose of Misc/NEWS.  Some changes I consider too small
@c or esoteric to include.  If such a change is added to the text,
@c I'll just remove it.  (This is another reason you shouldn't spend
@c too much time on writing your addition.)
@c 
@c * If you want to draw your new text to the attention of the
@c maintainer, add 'XXX' to the beginning of the paragraph or
@c section.
@c 
@c * It's OK to just add a fragmentary note about a change.  For
@c example: "XXX Describe the transmogrify() function added to the
@c socket module."  The maintainer will research the change and
@c write the necessary text.
@c 
@c * You can comment out your additions if you like, but it's not
@c necessary (especially when a final release is some months away).
@c 
@c * Credit the author of a patch or bugfix.   Just the name is
@c sufficient; the e-mail address isn't necessary.
@c 
@c * It's helpful to add the issue number as a comment:
@c 
@c XXX Describe the transmogrify() function added to the socket
@c module.
@c (Contributed by P.Y. Developer in :gh:`12345`.)
@c 
@c This saves the maintainer the effort of going through the VCS log
@c when researching a change.

해당하는 문서는 기존의 파이썬 3.12와 비교했을 때 파이썬 3.13의 새로운 기능들에 대해 설명합니다. 파이썬 3.13은 2024년 10월 7일에 배포되었습니다. 배포와 관련된 전체 기록을 열람하시려면, 아래 @ref{142,,변경 로그}를 확인해주세요.


@subsubheading 더 보기


@geindex Python 향상 제안; PEP 719
PEP 719@footnote{https://peps.python.org/pep-0719/} – 파이썬 3.13 릴리스 일정


@menu
* 요약 – 릴리스 하이라이트:: 
* 새로운 기능들:: 
* 기타 언어 변경:: 
* 새로운 모듈들:: 
* 개선된 모듈들:: 
* 최적화 관련 사항들:: 
* 제거된 모듈들과 API들:: 
* New Deprecations:: 
* CPython 바이트 코드 변경 사항:: 
* C API의 변경 사항들:: 
* 빌드 변경 사항들:: 
* 파이썬 3.13으로의 (코드) 이식: 파이썬 3 13으로의 코드 이식. 
* 회귀 테스트 변경 사항:: 

@end menu

@node 요약 – 릴리스 하이라이트,새로운 기능들,,파이썬 3 13의 새로운 기능에 대해 알아봅시다
@anchor{whatsnew/3 13 summary-release-highlights}@anchor{46b}
@subsection 요약 – 릴리스 하이라이트


@c This section singles out the most important changes in Python 3.13.
@c Brevity is key.

파이썬 3.13은 가장 최근의 파이썬 프로그래밍 언어에 대한 안정 배포 버전입니다. 언어 전반과 그 구체적인 구현에 있어 업데이트가 있었으며, 표준 라이브러리에도 업데이트가 있었습니다. 가장 큰 업데이트는 @ref{46c,,대화형 인터프리터}, @ref{46d,,제한 없는 스레드 모드(free-threaded mode)} (
@geindex Python 향상 제안; PEP 703
PEP 703@footnote{https://peps.python.org/pep-0703/}), 또한 @ref{46e,,지정 시간 구동 (Just-In-Time) 컴파일러} (
@geindex Python 향상 제안; PEP 744
PEP 744@footnote{https://peps.python.org/pep-0744/})에 대한 것이었습니다.

에러 메세지는 계속 개선되고 있습니다. 트레이스백(Traceback)들의 경우 기본적으로 색깔 표시됩니다. @ref{46f,,locals()} 내장 함수의 경우 반환된 매핑을 변화시키기 위해 @ref{470,,정의된 의미 구조}를 활용하고, 또한 타입 매개변수들은 기본 값의 설정을 지원합니다.

표준 라이브러리의 업데이트는, 오래되어 더 이상 지원되지 않는 API들과 모듈들의 업데이트(혹은 제거)를 포함합니다. 또한, 보다 사용자 친화적이거나 보다 정확한 라이브러리가 되기 위한 통상적인 업데이트들을 포함합니다. 몇몇의 오래된 레거시 표준 라이브러리 모듈들은, 파이썬 3.11 버전에서의 사용 지원 중단(deprecate)된 이후에, 현 버전에서 @ref{471,,제거되었습니다}.

해당하는 업데이트 문서는 새로운 기능 전체에 대해서 설명을 제공해주는 것을 목적으로 삼지 않습니다. 다만, 보다 편리하게 한눈에 볼 수 있을 개괄 설명을 제공하려는 것입니다. 보다 자세한 정보를 원하신다면, 공식 문서를 참고해주세요; 예를 들어, @ref{149,,라이브러리 색인} 혹은 @ref{14a,,언어 색인} 등을 참고하실 수 있습니다. 보다 구체적인 구현 원리 혹은 디자인 원칙에 대해 이해하시고 싶으신 분들께서는, 해당하는 새로운 기능과 관련된 PEP 문서를 열람해주시기를 부탁드립니다. 다만, PEP 문서들의 경우 통상적으로 해당하는 기능이 구현되고 난 이후에는 추가적으로 업데이트되지 않아 최신화되지 않은 부분이 있을 수 있음을 양해 부탁드립니다. 과거 버전의 파이썬을 사용하는 시스템을 파이썬 3.13으로 업그레이드(혹은 이식)하기 위한 안내의 경우 @ref{472,,Porting to Python 3.13}을 참고 부탁드립니다.


__________________________________________________________________


@c PEP-sized items next.

인터프리터의 개선:


@itemize *

@item 
@ref{46c,,대화형 인터프리터}와 @ref{473,,개선된 에러 메세지}에 있어 커다란 개선이 있었습니다.

@item 
@geindex Python 향상 제안; PEP 667
PEP 667@footnote{https://peps.python.org/pep-0667/}: 기존의 @ref{46f,,locals()} 내장 함수의 경우 새롭게 @ref{470,,정의된 의미 구조}를 지원하며, 이러한 지원은 반환되는 매핑 구조의 변환이 필요한 경우에 대한 것입니다. 파이썬 디버거들 혹은 유사한 디버깅 도구들의 경우, 이러한 지원을 통해 지역 변수에 대한 보다 안정적인 업데이트 반영을 보다 최적화된 범위에 대해 수행할 수 있으며, 동시적인 코드 작동 중에서도 마찬가지로 이러한 최적화가 가능해졌습니다.

@item 
@geindex Python 향상 제안; PEP 703
PEP 703@footnote{https://peps.python.org/pep-0703/}: 파이썬 3.13은 전역 인터프리터 잠금(@ref{474,,global interpreter lock})의 해제를 실험적으로 지원합니다. 보다 자세한 내용의 경우 @ref{46d,,제한 없는 스레드 모드(free-threaded mode)}을 참고 부탁드립니다.

@item 
@geindex Python 향상 제안; PEP 744
PEP 744@footnote{https://peps.python.org/pep-0744/}: 기본적인 @ref{46e,,지정 시간 구동 (Just-In-Time) 컴파일러}가 추가되었습니다. 현재는 기본적으로 사용하지 않으며(향후 활성화될 수 있습니다) 성능 개선 효과는 크지 않습니다. 향후의 릴리스들을 통해 더욱 개선될 예정입니다.

@item 
@ref{46c,,대화형 인터프리터}에서 색상 지원을 추가하고, @ref{473,,트레이스백} 및 @ref{475,,doctest}출력에도 적용되었습니다. 이 기능은 
@geindex PYTHON_COLORS
@geindex 환경 변수; PYTHON_COLORS
@ref{476,,PYTHON_COLORS}와 NO_COLOR@footnote{https://no-color.org/}환경 변수를 통해 비활성화할 수 있습니다.
@end itemize

파이썬 데이터 모델의 개선 사항들


@itemize *

@item 
@ref{477,,__static_attributes__}는 클래스 본문 내 함수에서 @code{self.X} 형태로 액세스되는 속성의 이름을 저장합니다.

@item 
@ref{478,,__firstlineno__}는 클래스 정의의 첫 번째 줄 번호를 기록합니다.
@end itemize

표준 라이브러리의 중요한 개선 사항들:


@itemize *

@item 
새로운 @ref{479,,PythonFinalizationError} 예외를 추가했으며, @ref{47a,,종료 시기} 동안 작업이 차단(block)될 때 이 예외가 발생합니다.

@item 
@ref{7,,argparse} 모듈은 명령줄 옵션, 위치 인자와 하위 명령에 대한 사용 지원 중단(deprecating) 표시를 지원합니다.

@item 
새로운 함수 @ref{47b,,base64.z85encode()}와 @ref{47c,,base64.z85decode()}는 Z85 data@footnote{https://rfc.zeromq.org/spec/32/}의 인코딩과 디코딩을 지원합니다.

@item 
@ref{29,,copy} 모듈에 @ref{1c0,,copy.replace()} 함수가 추가되었으며, 여러 내장 타입들과 @ref{47d,,__replace__()} 메서드를 정의하는 모든 클래스를 지원합니다.

@item 
새로운 @ref{39,,dbm.sqlite3} 모듈이 기본 @ref{35,,dbm} 백엔드가 되었습니다.

@item 
@ref{a5,,os} 모듈에 리눅스의 타이머 알림 파일 디스크립터로 작업할 수 있는 @ref{47e,,새로운 함수 세트}가 추가되었습니다.

@item 
@ref{bd,,random} 모듈에 @ref{47f,,명령줄 인터페이스}가 추가되었습니다.
@end itemize

보안 개선 사항들:


@itemize *

@item 
@ref{480,,ssl.create_default_context()}가 기본 플래그로 @ref{481,,ssl.VERIFY_X509_PARTIAL_CHAIN}과 @ref{482,,ssl.VERIFY_X509_STRICT}를 설정합니다.
@end itemize

C API 개선 사항들:


@itemize *

@item 
@ref{483,,Py_mod_gil}슬롯은 확장 모듈이 @ref{164,,GIL}을 비활성화한 상태에서 실행을 지원한다는 것을 나타내기 위해 사용됩니다.

@item 
시스템 시계에 액세스를 제공하는 @ref{484,,PyTime C API}가 추가되었습니다.

@item 
@ref{485,,PyMutex}는 1바이트만 차지하는 새로운 경량 뮤텍스(Mutex)입니다.

@item 
C API에 
@geindex Python 향상 제안; PEP 669
PEP 669@footnote{https://peps.python.org/pep-0669/} 모니터링 이벤트를 생성하는 @ref{486,,함수 세트}가 새로 추가되었습니다.
@end itemize

새로운 타이핑 기능들:


@itemize *

@item 
@geindex Python 향상 제안; PEP 696
PEP 696@footnote{https://peps.python.org/pep-0696/}: 타입 매개변수(@ref{487,,typing.TypeVar}, @ref{488,,typing.ParamSpec}, @ref{489,,typing.TypeVarTuple})에 기본값을 지정할 수 있도록 하는 기능을 새롭게 지원합니다.

@item 
@geindex Python 향상 제안; PEP 702
PEP 702@footnote{https://peps.python.org/pep-0702/}: 새로운 @ref{48a,,warnings.deprecated()} 데코레이터는 타입 시스템과 런타임에서 사용 지원 중단(deprecate) 예정 표시를 지원합니다.

@item 
@geindex Python 향상 제안; PEP 705
PEP 705@footnote{https://peps.python.org/pep-0705/}: @ref{48b,,typing.ReadOnly}는 @ref{332,,typing.TypedDict}의 항목을 타입 검사기에서 읽기 전용으로 표시하는 데 사용할 수 있습니다.

@item 
@geindex Python 향상 제안; PEP 742
PEP 742@footnote{https://peps.python.org/pep-0742/}: @ref{48c,,typing.TypeIs}는 @ref{48d,,typing.TypeGuard}의 대안으로 더 직관적인 타입 축소(type narrowing) 동작을 제공합니다.
@end itemize

플랫폼 지원:


@itemize *

@item 
@geindex Python 향상 제안; PEP 730
PEP 730@footnote{https://peps.python.org/pep-0730/}: 애플의 iOS가 @ref{48e,,공식적으로 지원되는 플랫폼}으로 
@geindex Python 향상 제안; PEP 11#tier-3
3단계 (Tier 3)@footnote{https://peps.python.org/pep-0011/#tier-3} 수준에서 지원됩니다.

@item 
@geindex Python 향상 제안; PEP 738
PEP 738@footnote{https://peps.python.org/pep-0738/}: Android는 @ref{48e,,공식적으로 지원되는 플랫폼}으로 
@geindex Python 향상 제안; PEP 11#tier-3
3단계 (Tier 3)@footnote{https://peps.python.org/pep-0011/#tier-3} 수준에서 지원됩니다.

@item 
@code{wasm32-wasi}는 
@geindex Python 향상 제안; PEP 11#tier-2
2단계 (Tier 2)@footnote{https://peps.python.org/pep-0011/#tier-2} 수준에서 지원됩니다.

@item 
@code{wasm32-emscripten}은 더 이상 공식적으로 지원되는 플랫폼이 아닙니다.
@end itemize

중요한 제거 사항들:


@itemize *

@item 
@ref{471,,PEP 594}: 표준 라이브러리에서 ‘죽은 배터리(dead batteries)’로 분류된 레거시 모듈 19개가 제거되었습니다: @code{aifc}, @code{audioop}, @code{cgi}, @code{cgitb}, @code{chunk}, @code{crypt}, @code{imghdr}, @code{mailcap}, @code{msilib}, @code{nis}, @code{nntplib}, @code{ossaudiodev}, @code{pipes}, @code{sndhdr}, @code{spwd}, @code{sunau}, @code{telnetlib}, @code{uu}, @code{xdrlib}.

@item 
(파이썬 3.11에서 사용 지원 중단되었던) @code{2to3} 도구와 @code{lib2to3} 모듈이 제거되었습니다.

@item 
(파이썬 3.6에서 사용 지원 중단되었던) @code{tkinter.tix} 모듈이 제거되었습니다.

@item 
@code{locale.resetlocale()} 함수가 제거되었습니다.

@item 
@code{typing.io} 및 @code{typing.re} 네임스페이스들이 제거되었습니다.

@item 
연쇄 @ref{48f,,classmethod} 설명자(descriptors)가 제거되었습니다.
@end itemize

릴리스 일정 변경 사항들:

@geindex Python 향상 제안; PEP 602
PEP 602@footnote{https://peps.python.org/pep-0602/} (“Annual Release Cycle for Python”)는 새로운 릴리스의 완전 지원(‘버그 수정’) 기간을 2년으로 연장하도록 업데이트되었습니다. 이는 다음을 의미합니다:


@itemize *

@item 
Python 3.9부터 3.12 버전까지는 완전 지원 기간이 1년 반이며, 이후 3년 반 동안은 보안 수정만 제공됩니다.

@item 
Python 3.13 및 이후 버전은 완전 지원 기간이 2년이며, 그 후 3년간은 보안 수정만 제공합니다.
@end itemize

@node 새로운 기능들,기타 언어 변경,요약 – 릴리스 하이라이트,파이썬 3 13의 새로운 기능에 대해 알아봅시다
@anchor{whatsnew/3 13 new-features}@anchor{490}
@subsection 새로운 기능들


@menu
* 개선된 대화형 인터프리터:: 
* 개선된 에러 메세지:: 
* 제한 없는 스레드를 사용하는 파이썬(CPython): 제한 없는 스레드를 사용하는 파이썬 CPython. 
* 실험적인 지정 시간 구동 (Just-In-Time; JIT) 컴파일러: 실험적인 지정 시간 구동 Just-In-Time; JIT 컴파일러. 
* locals()의 변형에 대한 의미 구조 정의: locals 의 변형에 대한 의미 구조 정의. 
* 모바일 플랫폼들에 대한 지원:: 

@end menu

@node 개선된 대화형 인터프리터,개선된 에러 메세지,,새로운 기능들
@anchor{whatsnew/3 13 a-better-interactive-interpreter}@anchor{491}@anchor{whatsnew/3 13 whatsnew313-better-interactive-interpreter}@anchor{46c}
@subsubsection 개선된 대화형 인터프리터


파이썬 3.13은 기본적으로 PyPy project@footnote{https://pypy.org/}의 코드를 기반으로 한 새로운 대화형 (@ref{1b5,,interactive}) 셸을 사용합니다. 사용자가 대화형 터미널에서 @ref{492,,REPL}을 시작하면 다음과 같은 새 기능이 지원됩니다:


@itemize *

@item 
여러개의 줄을 편집할 때에도 기록을 보존할 수 있습니다.

@item 
@code{help}, @code{exit}, @code{quit} 같은 REPL 전용 명령을 직접 지원합니다. 또한, 함수로 호출할 필요 없이 사용할 수 있습니다.

@item 
프롬프트와 트레이스백에서 @ref{1b7,,기본적으로 색상이 활성화됩니다}.

@item 
@code{F1}으로 대화형 도움말을 탐색할 수 있으며, 별도로 명령 기록이 제공됩니다.

@item 
@code{F2}로 명령 기록을 탐색할 때, 출력을 건너뛸 뿐 아니라 @ref{493,,>>>}와 @ref{494,,…} 프롬프트도 건너뜁니다.

@item 
@code{F3}의 “붙여넣기 모드”는 큰 코드 블록을 붙여넣기 쉽게 해 줍니다(@code{F3}를 다시 누르면 일반 프롬프트로 다시 돌아갑니다).
@end itemize

새 대화형 셸을 비활성화하려면 
@geindex PYTHON_BASIC_REPL
@geindex 환경 변수; PYTHON_BASIC_REPL
@ref{1b6,,PYTHON_BASIC_REPL} 환경 변수를 설정하면 됩니다. 대화형 모드에 대한 자세한 내용은 @ref{495,,대화형 모드}을 참조 부탁드립니다.

(PyPy 프로젝트의 코드를 기반으로, Pablo Galindo Salgado, Łukasz Langa, Lysandros Nikolaou가 gh-111201@footnote{https://github.com/python/cpython/issues/111201}을 통해 기능을 구현하였습니다. Dino Viehland와 Anthony Shaw가 Windows 지원에 기여하였습니다.)

@node 개선된 에러 메세지,제한 없는 스레드를 사용하는 파이썬 CPython,개선된 대화형 인터프리터,새로운 기능들
@anchor{whatsnew/3 13 improved-error-messages}@anchor{496}@anchor{whatsnew/3 13 whatsnew313-improved-error-messages}@anchor{473}
@subsubsection 개선된 에러 메세지



@itemize *

@item 
인터프리터는 터미널에서 트레이스백을 표시할 때 기본적으로 색상을 사용합니다. 이러한 색상 적용을 변경하기 위해 
@geindex PYTHON_COLORS
@geindex 환경 변수; PYTHON_COLORS
@ref{476,,PYTHON_COLORS} 환경 변수 및 NO_COLOR@footnote{https://no-color.org/} 및 FORCE_COLOR@footnote{https://force-color.org/} 환경 변수를 활용할 수 있으며, 이러한 활용을 통해 색상 적용을 @ref{1b7,,제어할 수 있습니다}. (Pablo Galindo Salgado가 gh-112730@footnote{https://github.com/python/cpython/issues/112730}를 통해 기능을 구현하였습니다.)

@item 
표준 라이브러리 모듈과 동일한 이름의 스크립트를 작성하는 실수는 (여러 사용자에 의해) 흔히 발생합니다. 표준 라이브러리 모듈과 동일한 이름의 스크립트로 인해 오류가 발생하는 경우에 보다 자세한 에러 메세지 제공함을 통해 보다 도움이 될 수 있도록 하였습니다:

@example
$ python random.py
Traceback (most recent call last):
  File "/home/me/random.py", line 1, in <module>
    import random
  File "/home/me/random.py", line 3, in <module>
    print(random.randint(5))
          ^^^^^^^^^^^^^^
AttributeError: module 'random' has no attribute 'randint' (consider renaming '/home/me/random.py' since it has the same name as the standard library module named 'random' and prevents importing that standard library module)
@end example

또한, 스크립트가 임포트(import)하려는 제삼자(third-party) 모듈과 이름이 같아서 오류가 발생하는 경우에도 보다 자세한 에러 메세지 제공함을 통해 보다 도움이 될 수 있도록 하였습니다:

@example
$ python numpy.py
Traceback (most recent call last):
  File "/home/me/numpy.py", line 1, in <module>
    import numpy as np
  File "/home/me/numpy.py", line 3, in <module>
    np.array([1, 2, 3])
    ^^^^^^^^
AttributeError: module 'numpy' has no attribute 'array' (consider renaming '/home/me/numpy.py' if it has the same name as a library you intended to import)
@end example

(Shantanu Jain이 gh-95754@footnote{https://github.com/python/cpython/issues/95754}을 통해 기능을 구현하였습니다.)

@item 
함수에 잘못된 키워드 인자가 전달되는 경우, 올바른 키워드 인자가 에러 메세지 안에서 제안되도록 하였습니다.

@example
>>> "Better error messages!".split(max_split=1)
Traceback (most recent call last):
  File "<python-input-0>", line 1, in <module>
    "Better error messages!".split(max_split=1)
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^
TypeError: split() got an unexpected keyword argument 'max_split'. Did you mean 'maxsplit'?
@end example

(Pablo Galindo Salgado와 Shantanu Jain이 gh-107944@footnote{https://github.com/python/cpython/issues/107944}를 통해 기능을 구현하였습니다.)
@end itemize

@node 제한 없는 스레드를 사용하는 파이썬 CPython,실험적인 지정 시간 구동 Just-In-Time; JIT 컴파일러,개선된 에러 메세지,새로운 기능들
@anchor{whatsnew/3 13 free-threaded-cpython}@anchor{497}@anchor{whatsnew/3 13 whatsnew313-free-threaded-cpython}@anchor{46d}
@subsubsection 제한 없는 스레드를 사용하는 파이썬(CPython)


CPython은 @ref{474,,전역 인터프리터 잠금 (GIL)}을 비활성화한 제한 없는 스레드 모드(free-threaded mode)에서 실행을 실험적으로 지원합니다. 이는 실험적 기능이므로 기본 설정으로 활성화되어 있지는 않습니다. 제한 없는 스레드 모드를 실행시키기 위해서는  @code{python3.13t} 또는 @code{python3.13t.exe}라는 별도의 실행 파일이 필요합니다. `free-threaded'로 표시된 미리 빌드된 바이너리는 공식 @ref{498,,Windows} 및 @ref{499,,macOS} 설치 프로그램의 일부로 설치할 수 있으며, 또는 @ref{49a,,--disable-gil} 옵션을 사용하여 소스 코드로부터 CPython을 빌드할 수 있습니다.

제한 없는 스레드 실행은 사용 가능한 CPU 코어에서 스레드를 병렬로 실행하여 가용 처리 능력을 온전히 활용할 수 있게 합니다. 모든 소프트웨어가 자동적으로 이를 통해 이점을 갖게 되는 것은 아니지만, 스레딩을 염두에 두고 설계된 프로그램은 다중 코어 하드웨어에서 보다 더 빠르게 실행됩니다. `제한 없는 스레드 모드는 실험적'이며 개선 작업이 진행 중이므로, 버그가 있을 수 있으며, 단일 스레드를 통한 실행의 성능이 저하될 수 있습니다. 제한 없는 스레드를 사용하는 파이썬(CPython) 빌드는 실행 시 환경 변수 
@geindex PYTHON_GIL
@geindex 환경 변수; PYTHON_GIL
@ref{49b,,PYTHON_GIL} 또는 명령줄 옵션 @ref{16f,,-X gil=1}을 사용해 GIL을 활성화하여 선택적으로 실행할 수 있습니다.

사용 중인 인터프리터가 제한 없는 스레드의 사용을 지원하는지 확인하려면 @ref{49c,,python -VV} 및 @ref{49d,,sys.version}에서 “experimental free-threading build”를 통해 확인할 수 있습니다. 새 @code{sys._is_gil_enabled()} 함수를 사용하면 실행 중인 프로세스에서 GIL이 실제로 비활성화되어 있는지 확인할 수 있습니다.

C-API 확장 모듈은 제한 없는 스레드(free-threaded)를 사용하는 빌드용으로 따로 빌드해야 합니다. 전역 인터프리터 잠금(Global Interpreter Lock; @ref{164,,GIL}) 비활성 실행을 지원하는 확장 모듈은 @ref{483,,Py_mod_gil} 슬롯을 사용해야 합니다. 개별 단계 초기화(single-phase init)를 사용하는 확장 모듈은 GIL 비활성 실행 지원 여부를 표시하기 위해 @ref{49e,,PyUnstable_Module_SetGIL()}을 사용해야 합니다. 이러한 메커니즘을 사용하지 않는 C 확장을 임포트하면 GIL이 자동으로 활성화됩니다. 
@geindex PYTHON_GIL
@geindex 환경 변수; PYTHON_GIL
@ref{49b,,PYTHON_GIL} 환경 변수나 @ref{16f,,-X gil=0} 옵션으로 GIL을 명시적으로 비활성화한 경우는 예외입니다. 제한 없는 스레드를 사용하는 빌드에서 C 확장이 포함된 패키지를 설치하려면 pip 24.1 이상이 필요합니다.

이러한 개선 작업은 많은 개인과 조직, 그리고 제한 없는 스레드(free-threading) 사용 지원을 테스트하고 활성화하는 데 기여한 파이썬 및 다양한 제삼자(third-parth) 프로젝트 커뮤니티들 덕분이었습니다. 주목할 만한 기여자로는 Sam Gross, Ken Jin, Donghee Na, Itamar Oren, Matt Page, Brett Simmers, Dino Viehland, Carl Meyer, Nathan Goldbaum, Ralf Gommers, Lysandros Nikolaou 등이 있으며, 이외에도 많은 분들이 있습니다. 이 기여자들 중 많은 분들이 Meta에 재직하고 있으며, Meta는 이 프로젝트를 지원하기 위해 상당한 엔지니어링 자원을 제공하였습니다.


@subsubheading 더 보기


이러한 개선 작업의 배경과 근거에 대한 보다 구체적인 정보를 위해서는 
@geindex Python 향상 제안; PEP 703
PEP 703@footnote{https://peps.python.org/pep-0703/} “Making the Global Interpreter Lock Optional in CPython”를 열람 부탁드립니다.

제한 없는 스레드 사용을 지원하기 위한 확장 모듈 이식@footnote{https://py-free-threading.github.io/porting/}: 커뮤니티에 의해 지원되는 제한 없는 스레드 사용 지원에 대한 이식 가이드로, 확장 모듈 작성자를 위한 가이드입니다.


@node 실험적인 지정 시간 구동 Just-In-Time; JIT 컴파일러,locals 의 변형에 대한 의미 구조 정의,제한 없는 스레드를 사용하는 파이썬 CPython,새로운 기능들
@anchor{whatsnew/3 13 an-experimental-just-in-time-jit-compiler}@anchor{49f}@anchor{whatsnew/3 13 whatsnew313-jit-compiler}@anchor{46e}
@subsubsection 실험적인 지정 시간 구동 (Just-In-Time; JIT) 컴파일러


@code{--enable-experimental-jit} 옵션을 사용하여 CPython을 구성하고 빌드하면 일부 파이썬 프로그램의 속도를 높일 수 있는 JIT 컴파일러가 추가됩니다. 윈도우에서 JIT를 활성화하려면 @code{PCbuild/build.bat --experimental-jit}을 사용하고, 2단계 (Tier 2) 인터프리터를 활성화하려면 @code{--experimental-jit-interpreter}를 사용하세요. 빌드 요구 사항과 추가 지원 정보는 @code{Tools/jit/README.md}를 확인 부탁드립니다@footnote{https://github.com/python/cpython/blob/main/Tools/jit/README.md}.

@code{--enable-experimental-jit} 옵션은 다음과 같은 특정 값들을 받을 수 있습니다. 특정 값을 지정하지 않으면 기본값은 @code{yes}입니다.


@itemize *

@item 
@code{no}: 2단계 (Tier 2) 인터프리터 및 JIT 파이프라인을 모두 비활성화합니다.

@item 
@code{yes}: JIT (Just-In-Time; 지정 시간 구동) 컴파일러를 활성화합니다. 런타임에 JIT를 비활성화하려면 환경 변수 @code{PYTHON_JIT=0}을 설정할 수 있습니다.

@item 
@code{yes-off}: JIT를 빌드하되 기본값으로 비활성화합니다. 런타임에 JIT를 활성화하려면 환경 변수 @code{PYTHON_JIT=1}을 설정할 수 있습니다.

@item 
@code{interpreter}: 2단계 (Tier 2) 인터프리터를 활성화하지만 JIT는 비활성화합니다. 이 인터프리터는 환경 변수 @code{PYTHON_JIT=0}을 설정하여 비활성화할 수 있습니다.
@end itemize

내부 아키텍처는 대략적으로 다음과 같습니다:


@itemize *

@item 
시작 지점은 최적화된 `1단계(Tier 1) 바이트 코드'입니다. 관련된 보다 구체적인 정보를 위해서는 @ref{4a0,,3.11 버전의 새로운 기능}를 열람 부탁드립니다.

@item 
`1단계(Tier 1) 바이트 코드'가 빈번하게 실행되는 경우, 완전히 내부용인 새로운 중간 표현(IR)인 `2단계 IR(Tier 2 IR)'로 변환됩니다. 변환된 이러한 중간 표현은 마이크로 연산(uops)으로 명명되기도 합니다.

@item 
2단계 IR도 1단계와 같은 스택 기반 가상 머신을 사용하지만, 명령어 형식의 경우 기계어로 변환하기에 보다 더 적합합니다.

@item 
2단계 IR에는 여러개의 최적화 패스가 있으며, 이는 인터프리터에 의해 처리되어 실행되거나 기계어로 변환되기 전에 적용됩니다.

@item 
2단계(Tier 2) 인터프리터가 있지만, 주로 앞서 서술한 최적화 파이프라인의 초기 단계를 디버깅하기 위해 만들어진 것입니다. 2단계 인터프리터는 파이썬에서 @code{--enable-experimental-jit=interpreter} 옵션을 설정함을 통해 활성화할 수 있습니다.

@item 
지정 시간 구동 (JIT; Just-In-Time) 컴파일러가 활성화되면, 최적화된 2단계(Tier 2) IR이 기계어로 변환되어 실행됩니다.

@item 
기계어 변환 과정에서는 `복사-후-패치 (copy-and-patch)'라는 기법을 사용합니다. 런타임 의존성은 없지만, 빌드의 경우 LLVM에 대한 새로운 의존성이 추가되었습니다.
@end itemize


@subsubheading 더 보기


@geindex Python 향상 제안; PEP 744
PEP 744@footnote{https://peps.python.org/pep-0744/}


(JIT은 Brandt Bucher에 의해, Haoran Xu와 Fredrik Kjolstad의 논문에 영감을 받아 개발되었습니다. 2단계 IR의 경우 Mark Shannon과 Guido van Rossum에 의해 개발되었습니다. 2단계 IR의 최적화의 경우 Ken Jin에 의해 개발되었습니다.)

@node locals 의 변형에 대한 의미 구조 정의,모바일 플랫폼들에 대한 지원,실험적인 지정 시간 구동 Just-In-Time; JIT 컴파일러,새로운 기능들
@anchor{whatsnew/3 13 defined-mutation-semantics-for-locals}@anchor{4a1}@anchor{whatsnew/3 13 whatsnew313-locals-semantics}@anchor{470}
@subsubsection @code{locals()}의 변형에 대한 의미 구조 정의


지금까지 @ref{46f,,locals()}의 반환값을 변경했을 때에 예상되는 결과는 개별적인 파이썬 구현에 맡겨져 있었습니다. Python 3.13부터는 
@geindex Python 향상 제안; PEP 667
PEP 667@footnote{https://peps.python.org/pep-0667/}이 대부분의 코드 실행 스코프에 대해 CPython의 기존 동작을 표준화하고, @ref{4a2,,최적화된 스코프}(함수, 제너레이터, 코루틴, 컴프리헨션, 제너레이터 표현식)에서는 현재 할당되어 있는 지역 변수들에 대한 서로 독립적인 스냅샷으로 명시적으로 반환하도록 변경합니다. 이는 지역적으로 참조된 비지역 변수들이 종료 시점에서 확인되는 경우을 포함합니다.

앞서 서술한 것과 같이 최적화된 스코프에서 @ref{46f,,locals()}의 의미 구조가 바뀌면서, 명시적인 네임 스페이스를 제공하지 않는 경우, 암시적으로 @code{locals()}을 대상으로 실행되는 코드 실행 함수들(예: @ref{4a3,,exec()}, @ref{4a4,,eval()})의 기본 동작도 영향을 받았습니다. 이전 버전에서는 코드 실행 함수를 호출한 뒤 @code{locals()}을 호출하여 변경 사항에 액세스할 수 있는지가 구체적인 개별 구현에 따라 달라졌었습니다. 구체적으로, CPython에서 대부분의 경우 이러한 방식은 무리 없이 잘 동작하였지만, 종종 같은 스코프의 공유 스냅샷이 다른 코드(디버거나 코드 실행 추적 도구 등)에 의해 재설정될 수 있기 때문에 최적화된 스코프에서 실패하는 경우도 있었습니다. Python 3.13에서는 해당 코드를 항상 최적화된 스코프의 지역 변수에 대한 독립적인 스냅샷에 대해서만 실행하므로, 그 변경 사항은 이후의 @code{locals()} 호출에서 절대로 보이지 않습니다. 이러한 경우들에서 변경 내용을 확인하기 위해서는 관련 함수에 명시적인 네임 스페이스를 전달해야 합니다. 또는 디스크에서 파이썬 파일을 실행할 때처럼 실행 결과의 네임 스페이스를 반환하는 상위 수준의 코드 실행 API(예를 들어, @ref{4a5,,runpy.run_path()})로 코드를 변경하는 것이 보다 바람직할 수 있습니다.

디버거와 유사 도구들이 (앞서 서술한 변화의 영향을 받는 스코프에서) 지역 변수를 안정적으로 업데이트할 수 있도록, @ref{4a6,,FrameType.f_locals}는 해당 스코프의 지역 변수와 그 스코프에서 참조되는 비지역 변수에 대한 이어쓰기(write-through) 프록시를 반환합니다. 런타임 의미가 불분명하고 일관성 없이 업데이트되던 (공유된) @code{dict} 인스턴스를 반환하지 않습니다.

관련된 C API 변경 사항과 사용 지원 중단 등에 대한 보다 구체적인 정보를 위해서는 
@geindex Python 향상 제안; PEP 667
PEP 667@footnote{https://peps.python.org/pep-0667/}을 열람 부탁드립니다. 또한 관련된 (코드) 이식에 대한 가이드의 경우 @ref{4a7,,Python API} 및 @ref{4a8,,C API}을 열람 부탁드립니다.

(Mark Shannon과 Tian Gao가 PEP을 작성하였고 gh-74929@footnote{https://github.com/python/cpython/issues/74929}를 통해 기능을 구현하였습니다. Guido van Rossum과 Alyssa Coghlan이 설명서를 최신화하였습니다.)

@node 모바일 플랫폼들에 대한 지원,,locals 의 변형에 대한 의미 구조 정의,새로운 기능들
@anchor{whatsnew/3 13 support-for-mobile-platforms}@anchor{4a9}@anchor{whatsnew/3 13 whatsnew313-platform-support}@anchor{48e}
@subsubsection 모바일 플랫폼들에 대한 지원


@geindex Python 향상 제안; PEP 730
PEP 730@footnote{https://peps.python.org/pep-0730/}: iOS가 
@geindex Python 향상 제안; PEP 11
PEP 11@footnote{https://peps.python.org/pep-0011/}에서 지원하는 플랫폼으로, @code{arm64-apple-ios} (2013년 이후 출시된 iPhone 및 iPad 기기)와 @code{arm64-apple-ios-simulator} (Apple 실리콘 하드웨어에서 실행되는 Xcode iOS 시뮬레이터)는 3단계 (Tier 3)로 지정되었습니다. @code{x86_64-apple-ios-simulator} (구형 @code{x86_64} 하드웨어에서 실행되는 Xcode iOS 시뮬레이터)는 3단계 지원 플랫폼은 아니지만, 최선의 노력(best-effort)으로 지원됩니다. (Russell Keith-Magee PEP을 작성하였고 gh-114099@footnote{https://github.com/python/cpython/issues/114099}를 통해 기능을 구현하였습니다.)

@geindex Python 향상 제안; PEP 738
PEP 738@footnote{https://peps.python.org/pep-0738/}: Android가 
@geindex Python 향상 제안; PEP 11
PEP 11@footnote{https://peps.python.org/pep-0011/}에서 지원하는 플랫폼으로, @code{aarch64-linux-android}와 @code{x86_64-linux-android}은 3단계 (Tier 3)로 지정되었습니다. 32비트 @code{arm-linux-androideabi}와 @code{i686-linux-android}는 3단계 지원 플랫폼은 아니지만, 최선의 노력(best-effort)으로 지원됩니다. (Malcolm Smith가 PEP을 작성하였고 gh-116622@footnote{https://github.com/python/cpython/issues/116622}을 통해 기능을 구현하였습니다.)


@subsubheading 더 보기


@geindex Python 향상 제안; PEP 730
PEP 730@footnote{https://peps.python.org/pep-0730/}, 
@geindex Python 향상 제안; PEP 738
PEP 738@footnote{https://peps.python.org/pep-0738/}


@node 기타 언어 변경,새로운 모듈들,새로운 기능들,파이썬 3 13의 새로운 기능에 대해 알아봅시다
@anchor{whatsnew/3 13 other-language-changes}@anchor{4aa}
@subsection 기타 언어 변경



@itemize *

@item 
컴파일러는 이제 독스트링의 각 줄에서 공통된 선행 공백을 제거합니다. 이 변경으로 @ref{4ab,,바이트 코드 캐시} (예를 들어, @cite{.pyc} 파일)의 크기가 줄어듭니다. 예를 들어 SQLAlchemy 2.0의 @code{sqlalchemy.orm.session} 모듈에서는 파일 크기가 약 5% 감소합니다. 이 변경 사항은 독스트링을 사용하는 도구들에 영향을 줍니다. 예를 들어, @ref{3e,,doctest}와 같은 도구가 영향을 받습니다.

@example
> 선행 공백을 포함하는 독스트링입니다.

> 여러개의 문단을 포함하고 있는 경우입니다.
@end example

Inada Naoki가 gh-81283@footnote{https://github.com/python/cpython/issues/81283}을 통해 기능을 구현하였습니다.

@item 
클래스 스코프 안에 있는 @ref{4ac,,어노테이션 스코프}는 이제 람다와 컴프리헨션을 포함할 수 있습니다. 클래스 스코프 안에 있는 컴프리헨션은 부모 스코프에 인라인되지 않습니다.

@example
class C[T]:
    type Alias = lambda: T
@end example

(Jelle Zijlstra가 gh-109118@footnote{https://github.com/python/cpython/issues/109118} 및 gh-118160@footnote{https://github.com/python/cpython/issues/118160}을 통해 기능을 구현하였습니다.)

@item 
@ref{45d,,퓨처 문}은 이제 @ref{0,,__future__} 모듈의 상대 임포트로는 더 이상 활성화되지 않습니다. 이에, @cite{from .__future__ import …} 형식의 구문은 이제, 특별한 기능이 없는 일반적인 상대 임포트로만 처리됩니다. (Jeremiah Gabriel Pascual이 gh-118216@footnote{https://github.com/python/cpython/issues/118216}을 통해 기능을 구현하였습니다.)

@item 
@ref{17c,,else} 블록에서 사용되는 전역 변수의 경우, 이제 @ref{1ab,,except} 블록 안에서도 해당 이름을 @ref{4ad,,global} 문으로 선언할 수 있습니다. 이전버전들에서는 오류로 볼 수 있는 @ref{18e,,SyntaxError}가 발생했습니다. (Irit Katriel이 gh-111123@footnote{https://github.com/python/cpython/issues/111123}를 통해 기능을 구현하였습니다.)

@item 
동결된 모듈을 임포트 과정에서 무시할지 여부를 제어하는 새로운 환경 변수 
@geindex PYTHON_FROZEN_MODULES
@geindex 환경 변수; PYTHON_FROZEN_MODULES
@ref{4ae,,PYTHON_FROZEN_MODULES}가 추가되었습니다. 이 변수는 @ref{16f,,-X frozen_modules} 명령줄 옵션과 동일한 방식으로 작동합니다. (Yilei Yang이 gh-111374@footnote{https://github.com/python/cpython/issues/111374}를 통해 기능을 구현하였습니다.)

@item 
새 환경 변수 
@geindex PYTHON_PERF_JIT_SUPPORT
@geindex 환경 변수; PYTHON_PERF_JIT_SUPPORT
@ref{4af,,PYTHON_PERF_JIT_SUPPORT}와 명령줄 옵션 @ref{16f,,-X perf_jit}를 통해, 프레임 포인터@footnote{https://en.wikipedia.org/wiki/Call_stack} 없이도 동작하는 @ref{4b0,,perf 프로파일러} 지원이 추가되었습니다. (Pablo Galindo가 gh-118518@footnote{https://github.com/python/cpython/issues/118518}를 통해 기능을 구현하였습니다.)

@item 
새 환경 변수 
@geindex PYTHON_HISTORY
@geindex 환경 변수; PYTHON_HISTORY
@ref{4b1,,PYTHON_HISTORY}를 사용하여 @code{.python_history} 파일의 위치를 변경할 수 있습니다. (Levi Sabah, Zackery Spytz, 그리고 Hugo van Kemenade가 gh-73965@footnote{https://github.com/python/cpython/issues/73965}를 통해 기능을 구현하였습니다.)

@item 
클래스에 새로운 @ref{477,,__static_attributes__} 속성이 추가되었습니다. 해당하는 어트리뷰트는 컴파일러가 클래스 본문 안의 어떤 함수에서든 @cite{self.<name>} 형식으로 대입되는 어트리뷰트 이름들을 튜플로 채워넣습니다. (Irit Katriel이 gh-115775@footnote{https://github.com/python/cpython/issues/115775}을 통해 기능을 구현하였습니다.)

@item 
컴파일러는 이제 클래스 정의의 첫 번째 줄 번호를 담은 @code{__firstlineno__} 어트리뷰트를 클래스에 생성합니다. (Serhiy Storchaka가 gh-118465@footnote{https://github.com/python/cpython/issues/118465}를 통해 기능을 구현하였습니다.)

@item 
@ref{4a3,,exec()}와 @ref{4a4,,eval()} 내장 함수는 이제 `globals' 와 `locals' 인자를 키워드 인자로도 받을 수 있습니다. (Raphael Gaschignard가 gh-105879@footnote{https://github.com/python/cpython/issues/105879}를 통해 기능을 구현하였습니다.)

@item 
내장 함수 @ref{4b2,,compile()}이 이제는 @code{ast.PyCF_OPTIMIZED_AST}라는 새로운 플래그를 받아들입니다. 이 플래그는 @code{ast.PyCF_ONLY_AST} 와 비슷하지만, 반환되는 AST가 `optimize' 인자의 값에 따라 최적화된다는 점이 다릅니다. (Irit Katriel가 gh-108113@footnote{https://github.com/python/cpython/issues/108113}를 통해 기능을 구현하였습니다.)

@item 
@ref{4b3,,property} 객체에 @ref{4b4,,__name__} 어트리뷰트를 추가했습니다. (Eugene Toder가 gh-101860@footnote{https://github.com/python/cpython/issues/101860}를 통해 기능을 구현하였습니다.)

@item 
새로운 @ref{479,,PythonFinalizationError} 예외가 추가되었습니다. 해당하는 예외는 @ref{244,,RuntimeError}로부터 파생되었으며, @ref{47a,,종료 시기} 동안 어떤 특정한 작업이 차단될 때에 이를 알리기 위해 사용됩니다. 다음의 호출 가능한 객체(callable)는 이제 @code{PythonFinalizationError}를 발생시킵니다. 이전에는 @code{RuntimeError}를 발생시켰었습니다.


@itemize *

@item 
@ref{4b5,,_thread.start_new_thread()}

@item 
@ref{4b6,,os.fork()}

@item 
@ref{4b7,,os.forkpty()}

@item 
@ref{4b8,,subprocess.Popen}
@end itemize

(Victor Stinner가 gh-114570@footnote{https://github.com/python/cpython/issues/114570}를 통해 기능을 구현하였습니다.)

@item 
이제 @ref{4b9,,str.replace()} 메서드의 `count' 인자를 키워드 인자로 전달할 수 있습니다. (Hugo van Kemenade가 gh-106487@footnote{https://github.com/python/cpython/issues/106487}를 통해 기능을 구현하였습니다.)

@item 
이제 많은 함수에서 파일 디스크립터 인자(file descriptor argument)로 논리(boolean) 값이 전달되면 경고를 발생시킵니다. 해당하는 업데이트를 통해 몇몇 오류를 보다 더 이른 시점에 발견할 수 있습니다. (Serhiy Storchaka가 gh-82626@footnote{https://github.com/python/cpython/issues/82626}를 통해 기능을 구현하였습니다.)

@item 
@ref{14,,bz2}, @ref{8e,,lzma}, @ref{e4,,tarfile}, @ref{137,,zipfile} 모듈의 압축되거나 아카이브된 파일 종류의 객체에 @code{name} 과 @code{mode} 어트리뷰트를 추가했습니다. (Serhiy Storchaka가 gh-115961@footnote{https://github.com/python/cpython/issues/115961}를 통해 기능을 구현하였습니다.)
@end itemize

@node 새로운 모듈들,개선된 모듈들,기타 언어 변경,파이썬 3 13의 새로운 기능에 대해 알아봅시다
@anchor{whatsnew/3 13 new-modules}@anchor{4ba}
@subsection 새로운 모듈들



@itemize *

@item 
@ref{39,,dbm.sqlite3}: @code{dbm`용 SQLite 백엔드입니다. (Raymond Hettinger와 Erlend E. Aasland가 :gh:`100414}를 통해 기능을 구현하였습니다.)
@end itemize

@node 개선된 모듈들,최적화 관련 사항들,새로운 모듈들,파이썬 3 13의 새로운 기능에 대해 알아봅시다
@anchor{whatsnew/3 13 improved-modules}@anchor{4bb}
@subsection 개선된 모듈들


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

@end menu

@node argparse<3>,array,,개선된 모듈들
@anchor{whatsnew/3 13 argparse}@anchor{4bc}
@subsubsection argparse



@itemize *

@item 
@ref{4bd,,add_argument()} 및 @code{add_parser()} 메서드에 `deprecated' 매개 변수가 추가되어, 명령줄 옵션과 위치 인자, 하위 명령에 대해 사용 지원 중단을 표시할 수 있습니다. (Serhiy Storchaka가 gh-83648@footnote{https://github.com/python/cpython/issues/83648}를 통해 기능을 구현하였습니다.)
@end itemize

@node array,ast<3>,argparse<3>,개선된 모듈들
@anchor{whatsnew/3 13 array}@anchor{4be}
@subsubsection array



@itemize *

@item 
유니코드 문자를 위한 @cite{‘w’} 타입 코드(@cite{Py_UCS4})가 추가되었습니다. 사용 지원 중단된 @cite{‘u’} 타입 코드 대신 이 타입 코드를 사용해야 합니다. (Inada Naoki가 gh-80480@footnote{https://github.com/python/cpython/issues/80480}를 통해 기능을 구현하였습니다.)

@item 
@ref{4bf,,clear()} 메서드를 구현해 @ref{4c0,,array.array} 클래스를 @ref{4c1,,MutableSequence} 타입으로 등록했습니다. (Mike Zimin가 gh-114894@footnote{https://github.com/python/cpython/issues/114894}를 통해 기능을 구현하였습니다.)
@end itemize

@node ast<3>,asyncio<4>,array,개선된 모듈들
@anchor{whatsnew/3 13 ast}@anchor{4c2}
@subsubsection ast



@itemize *

@item 
@ref{9,,ast} 모듈의 노드 타입 생성자는 이제 받아들이는 인자에 대해 더 엄격해졌으며, 인자를 생략했을 때의 동작도 더 직관적으로 바뀌었습니다.

AST 노드 인스턴스를 생성할 때 선택적 필드를 인자로 넘기지 않으면, 그 필드는 이제 @cite{None`으로 설정됩니다. 또한@comma{} 마찬가지로@comma{} 리스트 필드를 생략하면 해당 필드는 이제 빈 리스트로 설정되며@comma{} :class:}!expr_context` 필드를 생략하면 기본값은 @ref{4c3,,Load()}가 됩니다. (이전에는 모든 경우 새로 생성한 AST 노드 인스턴스에 해당 어트리뷰트가 없었습니다.)

그 밖의 모든 경우에 필수 인자를 생략하면 노드 생성자가 @ref{1a3,,DeprecationWarning}을 발생시킵니다. 파이썬 3.15에서는 예외를 발생시킵니다. 마찬가지로 AST 노드의 필드로 매핑되지 않는 키워드 인자를 생성자에 전달하는 것은 이제 사용 지원 중단되었으며, 파이썬 3.15에서는 예외를 발생시킵니다.

해당하는 변경 사항은, 클래스가 @ref{4c4,,AST._field_types} 매핑을 정의해 새로운 동작을 사용하도록 선택(opt-in)하지 않는 한, @ref{4c5,,ast.AST}의 사용자 정의 하위 클래스에는 적용되지 않습니다.

(Jelle Zijlstra가 gh-105858@footnote{https://github.com/python/cpython/issues/105858}, gh-117486@footnote{https://github.com/python/cpython/issues/117486}, 그리고 gh-118851@footnote{https://github.com/python/cpython/issues/118851}를 통해 기능을 구현하였습니다.)

@item 
@ref{1c2,,ast.parse()}는 이제 `optimize'를 선택적 인자로 받아들여, 이를 @ref{4b2,,compile()} 함수에 전달합니다. 이를 통해 최적화된 AST를 얻을 수 있습니다. (Irit Katriel이 gh-108113@footnote{https://github.com/python/cpython/issues/108113}을 통해 기능을 구현하였습니다.)
@end itemize

@node asyncio<4>,base64<2>,ast<3>,개선된 모듈들
@anchor{whatsnew/3 13 asyncio}@anchor{4c6}
@subsubsection asyncio



@itemize *

@item 
@ref{4c7,,asyncio.as_completed()}은 이제 @ref{4c8,,비동기 이터레이터} 이면서 동시에 @ref{4c9,,어웨이터블} 을 담는 일반 @ref{4ca,,이터레이터}인 객체를 반환합니다. 비동기 이터레이션에서 일드되는 어웨이터블에는 전달한 원래 태스크나 퓨처 객체가 그대로 포함되므로, 완료되는 태스크와 결과를 서로 연결하기가 더 쉬워집니다. (Justin Arthur이 gh-77714@footnote{https://github.com/python/cpython/issues/77714}을 통해 기능을 구현하였습니다.)

@item 
@ref{4cb,,asyncio.loop.create_unix_server()}는 이제 서버가 닫히면 Unix 소켓을 자동으로 제거합니다. (Pierre Ossman가 gh-111246@footnote{https://github.com/python/cpython/issues/111246}를 통해 기능을 구현하였습니다.)

@item 
@ref{4cc,,DatagramTransport.sendto()}는 빈 바이트열 객체로 호출되면 길이가 0인 데이터그램을 전송합니다. 트랜스포트의 흐름 제어는 이제 버퍼 크기를 계산할 때 데이터그램 헤더까지 고려합니다. (Jamie Phan이 gh-115199@footnote{https://github.com/python/cpython/issues/115199}을 통해 기능을 구현하였습니다.)

@item 
큐의 종료를 관리하기 위해 @ref{4cd,,Queue.shutdown} 메서드와 @ref{4ce,,QueueShutDown} 예외가 추가되었습니다. (Laurie Opperman과 Yves Duprat이 gh-104228@footnote{https://github.com/python/cpython/issues/104228}를 통해 기능을 구현하였습니다.)

@item 
asyncio 서버를 보다 강제적으로 종료할 수 있도록 @ref{4cf,,Server.close_clients()} 와 @ref{4d0,,Server.abort_clients()} 메서드가 추가되었습니다. (Pierre Ossman이 gh-113538@footnote{https://github.com/python/cpython/issues/113538}을 통해 기능을 구현하였습니다.)

@item 
@ref{4d1,,StreamReader.readuntil()} 에서 여러 구분자로 이루어진 튜플을 인자로 받을 수 있으며, 그중 하나를 만나면 읽기를 중단합니다. (Bruce Merry이 gh-81322@footnote{https://github.com/python/cpython/issues/81322}을 통해 기능을 구현하였습니다.)

@item 
외부 취소와 내부 취소가 충돌하는 경우 @ref{4d2,,TaskGroup} 의 동작을 개선했습니다. 예를 들어, 두 개의 태스크 그룹이 중첩된 상태에서 둘 다 자식 태스크에서 동시에 예외가 발생하면, 내부 태스크 그룹이 내부 취소를 삼켜 버려 바깥쪽 태스크 그룹이 멈춰 버릴 수 있었습니다.

태스크 그룹이 외부에서 취소되었으면서 동시에 @ref{4d3,,ExceptionGroup}을 발생시켜야 하는 경우, 이제 부모 태스크의 @ref{4d4,,cancel()} 메서드를 호출합니다. 이렇게 하면 다음 @ref{18d,,await} 에서 @ref{4d5,,CancelledError}가 발생하도록 보장하여, 취소가 사라지지 않게 됩니다.

이번 변경의 또 다른 이점은 태스크 그룹이 이제 (@ref{4d6,,cancelling()}) 로 노출되는 취소 횟수를 그대로 유지한다는 점입니다.

일부 코너 케이스를 처리하기 위해, 취소 횟수가 0에 도달하면 문서화되지 않은 @cite{_must_cancel} 플래그를 재설정하도록 @ref{4d7,,uncancel()}이 동작할 수 있게 되었습니다.

(Arthur Tacca에 의해 보고된 이슈에 의해 영감을 받아 gh-116720@footnote{https://github.com/python/cpython/issues/116720}를 통해 기능이 구현되었습니다.)

@item 
@ref{1cb,,TaskGroup.create_task()}가 비활성 상태인 @ref{4d2,,TaskGroup}에서 호출되면, 주어진 코루틴은 닫힙니다. 이렇게 하면 해당 코루틴이 한 번도 기다려지지(awaited) 않았다는 내용의 @ref{4d8,,RuntimeWarning}이 발생하지 않습니다.

@item 
@cite{create_task`라는 이름의 함수와 메서드에는 태스크 생성자로 전달되는 새로운 `**kwargs} 인자가 추가되었습니다. 이 변경은 3.13.3에 실수로 인해 포함되었고, 사용자 정의 태스크 팩토리에 대한 API 계약을 깨뜨렸습니다. 여러 제삼자 태스크 팩토리들이 이에 대한 우회 방법을 구현했습니다. 3.13.4 및 이후 릴리스에서는 이전 팩토리 계약이 다시 지켜집니다(3.14까지). 기존 우회 방법이 계속 동작하도록, 추가 @cite{**kwargs} 인자는 여전히 @ref{1c7,,Task}와 사용자 정의 태스크 팩토리에 추가 키워드 인자를 전달할 수 있게 합니다.

이는 다음 함수와 메서드에 영향을 줍니다: @ref{1c9,,asyncio.create_task()}, @ref{1ca,,asyncio.loop.create_task()}, @ref{1cb,,asyncio.TaskGroup.create_task()}. (Thomas Grainger가 gh-128307@footnote{https://github.com/python/cpython/issues/128307}를 통해 기능을 구현하였습니다.)
@end itemize

@node base64<2>,compileall,asyncio<4>,개선된 모듈들
@anchor{whatsnew/3 13 base64}@anchor{4d9}
@subsubsection base64



@itemize *

@item 
@ref{47b,,z85encode()}와 @ref{47c,,z85decode()}함수를 추가하여 @ref{192,,bytes}를 Z85 data@footnote{https://rfc.zeromq.org/spec/32/}로 인코딩하고, Z85로 인코딩된 데이터를 @code{bytes`로 디코딩할 수 있습니다. (Matan Perelman이 :gh:`75299}를 통해 기능을 구현하였습니다.)
@end itemize

@node compileall,concurrent futures<2>,base64<2>,개선된 모듈들
@anchor{whatsnew/3 13 compileall}@anchor{4da}
@subsubsection compileall



@itemize *

@item 
작업자 스레드와 프로세스의 기본 개수는 이제 @ref{4db,,os.cpu_count()} 대신 @code{os.process_cpu_count`를 사용해 결정됩니다. (Victor Stinner가 :gh:`109649()}를 통해 기능을 구현하였습니다.)
@end itemize

@node concurrent futures<2>,configparser<2>,compileall,개선된 모듈들
@anchor{whatsnew/3 13 concurrent-futures}@anchor{4dc}
@subsubsection concurrent.futures



@itemize *

@item 
작업자 스레드와 프로세스의 기본 개수는 이제 @ref{4db,,os.cpu_count()} 대신 @code{os.process_cpu_count`를 사용해 결정됩니다. (Victor Stinner가 :gh:`109649()}를 통해 기능을 구현하였습니다.)
@end itemize

@node configparser<2>,copy,concurrent futures<2>,개선된 모듈들
@anchor{whatsnew/3 13 configparser}@anchor{4dd}
@subsubsection configparser



@itemize *

@item 
@ref{4de,,ConfigParser}는 이제 이름 없는 섹션을 지원하여 최상위 수준의 키-값 쌍을 허용합니다. 해당하는 허용은 새로운 `allow_unnamed_section' 매개 변수를 통해 활성화될 수 있습니다. (Pedro Sousa Lacerda가 gh-66449@footnote{https://github.com/python/cpython/issues/66449}를 통해 기능을 구현하였습니다.)
@end itemize

@node copy,ctypes<2>,configparser<2>,개선된 모듈들
@anchor{whatsnew/3 13 copy}@anchor{4df}
@subsubsection copy



@itemize *

@item 
새로운 @ref{1c0,,replace()} 함수와 @ref{47d,,치환 프로토콜}은 객체의 수정된 사본을 더 쉽게 만들 수 있게 해 줍니다. 이는 특히 변형 가능하지 않은 객체들(immutable objects)를 다룰 때 유용합니다. 다음 타입들은 @code{replace()} 함수를 지원하며 치환 프로토콜을 구현합니다:


@itemize *

@item 
@ref{4e0,,collections.namedtuple()}

@item 
@ref{4e1,,dataclasses.dataclass}

@item 
@ref{4e2,,datetime.datetime}, @ref{1fa,,datetime.date}, @ref{1fb,,datetime.time}

@item 
@ref{4e3,,inspect.Signature}, @ref{4e4,,inspect.Parameter}

@item 
@ref{4e5,,types.SimpleNamespace}

@item 
@ref{4e6,,code objects}
@end itemize

사용자 정의 클래스는 @ref{1c0,,copy.replace()}를 지원하도록 @ref{47d,,__replace__()} 메서드를 정의할 수 있습니다. (Serhiy Storchaka가 gh-108751@footnote{https://github.com/python/cpython/issues/108751}를 통해 기능을 구현하였습니다.)
@end itemize

@node ctypes<2>,dbm,copy,개선된 모듈들
@anchor{whatsnew/3 13 ctypes}@anchor{4e7}
@subsubsection ctypes



@itemize *

@item 
중요한 내부 리팩터링의 결과로, 내부 메타클래스의 초기화는 이제 @cite{__new__} 가 아니라 @cite{__init__} 에서 수행됩니다. 해당하는 내부 메타클래스를 상속하여 사용자 정의 초기화를 제공하는 프로젝트에 영향을 줍니다. 일반적으로 다음과 같습니다:


@itemize -

@item 
@cite{__new__} 에서 @cite{super().__new__()} 을 호출한 뒤 수행되던 사용자 정의 로직은 @cite{__init__} 으로 옮겨야 합니다.

@item 
클래스를 생성하려면 메타클래스를 직접 호출해야 합니다. 메타클래스의 @cite{__new__} 메서드만 호출하면 안 됩니다.
@end itemize

관련된 논의와 관련된 변경 사항들에 대해서는 gh-124520@footnote{https://github.com/python/cpython/issues/124520}를 참고 부탁드립니다.

@item 
@ref{1e5,,ctypes.Structure}객체에는 메모리로부터/메모리로 패킹되는 구조체의 정렬을 명시적으로 지정할 수 있는 새 @ref{4e8,,_align_}어트리뷰트가 추가되었습니다. (Matt Sanderson가 gh-112433@footnote{https://github.com/python/cpython/issues/112433}를 통해 기능을 구현하였습니다.)
@end itemize

@node dbm,dis<2>,ctypes<2>,개선된 모듈들
@anchor{whatsnew/3 13 dbm}@anchor{4e9}
@subsubsection dbm



@itemize *

@item 
SQLite 백엔드를 구현하는 새로운 @ref{39,,dbm.sqlite3} 모듈을 추가하고, 이를 기본 @code{dbm} 백엔드로 지정합니다. (Raymond Hettinger와 Erlend E. Aasland가 gh-100414@footnote{https://github.com/python/cpython/issues/100414}를 통해 기능을 구현하였습니다.)

@item 
GDBM 및 NDBM 데이터베이스 객체에 새로 추가된 @code{clear()} 메서드를 통해 데이터베이스에서 모든 항목을 제거할 수 있습니다. (Donghee Na가 gh-107122@footnote{https://github.com/python/cpython/issues/107122}를 통해 기능을 구현하였습니다.)
@end itemize

@node dis<2>,doctest,dbm,개선된 모듈들
@anchor{whatsnew/3 13 dis}@anchor{4ea}
@subsubsection dis



@itemize *

@item 
@ref{3c,,dis} 모듈 함수의 출력이 오프셋이 아니라 점프 대상과 예외 처리기를 나타내는 논리적 라벨들을 표시하도록 변경되었습니다. 오프셋을 함께 표시하려면 새 @ref{4eb,,-O} 명령 줄 옵션이나 `show_offsets' 인수를 사용하면 됩니다. (Irit Katriel이 gh-112137@footnote{https://github.com/python/cpython/issues/112137}를 통해 기능을 구현하였습니다.)

@item 
@ref{4ec,,get_instructions()}는 캐시 항목을 별도의 명령어로 더 이상 나타내지 않습니다. 대신, 새 `cache_info' 필드에 포함된 @ref{203,,Instruction}의 일부로 반환합니다. @code{ (Irit Katriel가 :gh:`112962()}를 통해 기능을 구현하였습니다.)
@end itemize

@node doctest,email<2>,dis<2>,개선된 모듈들
@anchor{whatsnew/3 13 doctest}@anchor{4ed}@anchor{whatsnew/3 13 whatsnew313-doctest}@anchor{475}
@subsubsection doctest



@itemize *

@item 
@ref{3e,,doctest}의 출력에는 이제 기본적으로 색상이 적용됩니다. 이 기능은 새 
@geindex PYTHON_COLORS
@geindex 환경 변수; PYTHON_COLORS
@ref{476,,PYTHON_COLORS} 환경 변수와 표준 NO_COLOR@footnote{https://no-color.org/} 및 FORCE_COLOR@footnote{https://force-color.org/} 환경 변수를 통해 제어할 수 있습니다. 보다 자세한 내용의 경우 @ref{1b7,,Controlling color}를 참고 부탁드립니다. (Hugo van Kemenade가 gh-117225@footnote{https://github.com/python/cpython/issues/117225}를 통해 기능을 구현하였습니다.)

@item 
@ref{4ee,,DocTestRunner.run()} 메서드는 이제 건너뛴 테스트의 개수를 집계합니다. @ref{4ef,,DocTestRunner.skips}와 @ref{4f0,,TestResults.skipped} 어트리뷰트를 추가했습니다. (Victor Stinner가 gh-108794@footnote{https://github.com/python/cpython/issues/108794}를 통해 기능을 구현하였습니다.)
@end itemize

@node email<2>,enum,doctest,개선된 모듈들
@anchor{whatsnew/3 13 email}@anchor{4f1}
@subsubsection email



@itemize *

@item 
줄 바꿈 문자를 포함하는 헤더는 이제 출력될 때 인용(quoted)됩니다. @ref{44,,generator} 모듈은 이제 잘못 접히거나 구분된 헤더가 여러 헤더로 파싱되거나 인접한 데이터와 합쳐질 수 있는 경우, 해당하는 헤더를 직렬화하지 (혹은 쓰지) 않습니다. 해당하는 안전 장치를 비활성화하려면 @ref{4f2,,verify_generated_headers}을 설정할 수 있습니다. (Bas Bloemsaat와 Petr Viktorin가 gh-121650@footnote{https://github.com/python/cpython/issues/121650}를 통해 기능을 구현하였습니다.)

@item 
@ref{4f3,,getaddresses()}와 @ref{4f4,,parseaddr()} 함수는 이제 잘못된 이메일 주소를 만났을 때, 이전처럼 부정확한 값을 반환하는 대신 더 많은 경우에 @cite{(‘’@comma{} ‘’)} 쌍을 반환합니다. 이 두 함수에는 `strict' 라는 새로운 선택적 매개 변수가 추가되었습니다(기본값은 @cite{True`입니다). (잘못된 형태의 입력을 허용하는) 이전의 작동 방식을 사용하려면 `strict=False`를 지정하면 됩니다. *strict* 매개 변수를 사용할 수 있는지 확인하기 위해 `getattr(email.utils@comma{} ‘supports_strict_parsing’@comma{} False)`를 사용할 수 있습니다. (Thomas Dwyer와 Victor Stinner가 :gh:`102988}를 통해 
@geindex Common Vulnerabilities and Exposures; CVE 2023-27043
CVE 2023-27043@footnote{https://www.cve.org/CVERecord?id=CVE-2023-27043}를 고치기 위해 기능을 구현하였습니다.)
@end itemize

@node enum,fractions<2>,email<2>,개선된 모듈들
@anchor{whatsnew/3 13 enum}@anchor{4f5}
@subsubsection enum



@itemize *

@item 
@ref{4f6,,EnumDict}가 공개되어 @ref{4f7,,EnumType}을 서브클래싱할 때 더 잘 지원하도록 했습니다.
@end itemize

@node fractions<2>,glob,enum,개선된 모듈들
@anchor{whatsnew/3 13 fractions}@anchor{4f8}
@subsubsection fractions



@itemize *

@item 
@ref{213,,Fraction} 객체는 이제 채움, 정렬, 부호 처리, 최소 너비 및 그룹화에 대해 표준 @ref{4f9,,포맷 명세 미니 언어} 규칙을 지원합니다. (Mark Dickinson이 gh-111320@footnote{https://github.com/python/cpython/issues/111320}를 통해 기능을 구현하였습니다.)
@end itemize

@node glob,importlib,fractions<2>,개선된 모듈들
@anchor{whatsnew/3 13 glob}@anchor{4fa}
@subsubsection glob



@itemize *

@item 
셸 스타일 와일드카드를 사용하는 경로 지정 문자열을 정규식으로 변환하는 함수인 @code{ (Barney Gale가 :gh:`72904()}를 통해 기능을 구현하였습니다.)
@end itemize

@node importlib,io<3>,glob,개선된 모듈들
@anchor{whatsnew/3 13 importlib}@anchor{4fb}
@subsubsection importlib



@itemize *

@item 
@ref{7f,,importlib.resources} 모듈의 다음 함수들은 이제 여러 개의 위치 인자를 사용해 리소스 디렉터리(혹은 트리)에 액세스할 수 있습니다. 텍스트를 읽는 함수에서는 `encoding' 과 `errors' 인자가 이제 키워드 전용 인자입니다:


@itemize *

@item 
@ref{4fc,,is_resource()}

@item 
@ref{4fd,,open_binary()}

@item 
@ref{4fe,,open_text()}

@item 
@ref{4ff,,path()}

@item 
@ref{500,,read_binary()}

@item 
@ref{501,,read_text()}
@end itemize

해당하는 함수들은 더 이상 사용 지원이 중단된 것으로 간주되지 않으며, 제거할 계획도 없습니다. (Petr Viktorin가 gh-116608@footnote{https://github.com/python/cpython/issues/116608}를 통해 기능을 구현하였습니다.)

@item 
@ref{502,,contents()} 는 완전한 기능을 갖춘 @ref{2fa,,Traversable} API 사용이 권장되며, 여전히 사용 지원 중단된 상태입니다. 하지만, 이를 제거할 계획은 현재 없습니다. (Petr Viktorin가 gh-116608@footnote{https://github.com/python/cpython/issues/116608}를 통해 기능을 구현하였습니다.)
@end itemize

@node io<3>,ipaddress,importlib,개선된 모듈들
@anchor{whatsnew/3 13 io}@anchor{503}
@subsubsection io



@itemize *

@item 
@ref{504,,IOBase} 파이널라이저는 이제 @ref{505,,close()} 메서드에서 발생하는 모든 예외를 @ref{506,,sys.unraisablehook}을 통해 기록합니다. 이전에는 해당하는 에러가 기본적으로 조용한 방식으로 무시되었고, @ref{507,,파이썬 개발 모드}혹은 @ref{508,,디버그 빌드}를 사용할 때에만 기록되었습니다. (Victor Stinner가 gh-62948@footnote{https://github.com/python/cpython/issues/62948}를 통해 기능을 구현하였습니다.)
@end itemize

@node ipaddress,itertools<2>,io<3>,개선된 모듈들
@anchor{whatsnew/3 13 ipaddress}@anchor{509}
@subsubsection ipaddress



@itemize *

@item 
@ref{50a,,IPv4Address.ipv6_mapped} 프로퍼티가 추가되었습니다. 이 프로퍼티는 IPv4 에 매핑된 IPv6 주소를 반환합니다. (Charles Machalow가 gh-109466@footnote{https://github.com/python/cpython/issues/109466}를 통해 기능을 구현하였습니다.)

@item 
@ref{50b,,IPv4Address}, @ref{50c,,IPv6Address}, @ref{50d,,IPv4Network}, 그리고 @ref{50e,,IPv6Network}에의 @code{is_global} 그리고 @code{is_private} 방식의 동작이 수정 개선되었습니다. (Jakub Stasiak가 gh-113171@footnote{https://github.com/python/cpython/issues/113171}를 통해 기능을 구현하였습니다.)
@end itemize

@node itertools<2>,marshal,ipaddress,개선된 모듈들
@anchor{whatsnew/3 13 itertools}@anchor{50f}
@subsubsection itertools



@itemize *

@item 
@ref{510,,batched()}에는 최종 배치가 지정된 배치 크기보다 짧으면 @ref{2ec,,ValueError}를 발생시키는 새로운 `strict' 매개 변수가 추가되었습니다. (Raymond Hettinger가 gh-113202@footnote{https://github.com/python/cpython/issues/113202}를 통해 기능을 구현하였습니다.)
@end itemize

@node marshal,math<2>,itertools<2>,개선된 모듈들
@anchor{whatsnew/3 13 marshal}@anchor{511}
@subsubsection marshal



@itemize *

@item 
`allow_code' 매개변수가 모듈 함수들에 추가되었습니다. @cite{allow_code=False}를 전달하면 파이썬 버전 간에 호환되지 않는 코드 객체는 직렬화(serialization)하거나 역-직렬화(de-serialization)할 수 없습니다. (Serhiy Storchaka가 gh-113626@footnote{https://github.com/python/cpython/issues/113626}를 통해 기능을 구현하였습니다.)
@end itemize

@node math<2>,mimetypes<2>,marshal,개선된 모듈들
@anchor{whatsnew/3 13 math}@anchor{512}
@subsubsection math



@itemize *

@item 
새로운 함수 @ref{513,,fma()}는 합성된 곱셈-덧셈(fused multiply-add) 연산을 수행합니다. 이는 @cite{x * y + z}를 한 번만 반올림하여 계산하므로, 중간 단계에서 정밀도가 손실되지 않습니다. 이 함수는 C99에서 제공하는 @cite{fma()} 함수를 감싸며(wrap), 특수한 경우에는 IEEE 754 “fusedMultiplyAdd” 연산의 규격을 따릅니다. (Mark Dickinson와 Victor Stinner가 gh-73468@footnote{https://github.com/python/cpython/issues/73468}를 통해 기능을 구현하였습니다.)
@end itemize

@node mimetypes<2>,mmap,math<2>,개선된 모듈들
@anchor{whatsnew/3 13 mimetypes}@anchor{514}
@subsubsection mimetypes



@itemize *

@item 
파일 시스템 경로에서 MIME 형식을 추측하는 @ref{515,,guess_file_type()} 함수가 추가되었습니다. 파일 경로와 함께 @ref{516,,guess_type()}을 사용하는 것은 이제 @ref{23d,,소프트 사용 지원 중단된(soft deprecated)} 상태입니다. (Serhiy Storchaka가 gh-66543@footnote{https://github.com/python/cpython/issues/66543}를 통해 기능을 구현하였습니다.)
@end itemize

@node mmap,multiprocessing<2>,mimetypes<2>,개선된 모듈들
@anchor{whatsnew/3 13 mmap}@anchor{517}
@subsubsection mmap



@itemize *

@item 
@ref{518,,mmap} 클래스는 파일 시스템 오류나 액세스 위반으로 인해 매핑된 메모리에 액세스할 수 없을 때 윈도우에서 충돌이 발생하지 않도록 보호됩니다. (Jannis Weigend가 gh-118209@footnote{https://github.com/python/cpython/issues/118209}를 통해 기능을 구현하였습니다.)

@item 
@ref{518,,mmap} 클래스에는 이제 읽기 위치를 이동할 수 있는 파일류 객체가 필요한 경우에 사용할 수 있는 새로운 @ref{519,,seekable()} 메서드가 추가되었습니다. @ref{51a,,seek()} 메서드는 이제 새로운 절대 위치를 반환합니다. (Donghee Na와 Sylvie Liberman가 gh-111835@footnote{https://github.com/python/cpython/issues/111835}를 통해 기능을 구현하였습니다.)

@item 
유닉스에서만 사용할 수 있는 새로운 `trackfd' 매개변수는 @ref{518,,mmap}에서 파일 디스크립터(file descriptor) 복제를 제어합니다. `trackfd'가 @cite{False`이면 *fileno*로 지정된 파일 기술자는 복제되지 않습니다. (Zackery Spytz와 Petr Viktorin가 :gh:`78502}를 통해 기능을 구현하였습니다.)
@end itemize

@node multiprocessing<2>,os<2>,mmap,개선된 모듈들
@anchor{whatsnew/3 13 multiprocessing}@anchor{51b}
@subsubsection multiprocessing



@itemize *

@item 
작업자 스레드와 프로세스의 기본 개수는 이제 @ref{4db,,os.cpu_count()} 대신 @code{os.process_cpu_count`를 사용해 결정됩니다. (Victor Stinner가 :gh:`109649()}를 통해 기능을 구현하였습니다.)
@end itemize

@node os<2>,os path<2>,multiprocessing<2>,개선된 모듈들
@anchor{whatsnew/3 13 os}@anchor{51c}
@subsubsection os



@itemize *

@item 
현재 프로세스의 호출 스레드에서 사용할 수 있는 논리 CPU 코어 수를 얻기 위한 @ref{51d,,process_cpu_count()} 함수를 추가했습니다. (Victor Stinner 가 gh-109649@footnote{https://github.com/python/cpython/issues/109649}를 통해 기능을 구현하였습니다.)

@item 
@ref{4db,,cpu_count()}와 @ref{51d,,process_cpu_count()}는 새 환경 변수 
@geindex PYTHON_CPU_COUNT
@geindex 환경 변수; PYTHON_CPU_COUNT
@ref{51e,,PYTHON_CPU_COUNT} 또는 새 명령줄 옵션 @ref{16f,,-X cpu_count}을 통해 재정의할 수 있습니다. 해당하는 옵션은 애플리케이션 코드나 컨테이너 자체를 수정하지 않고 컨테이너 시스템의 CPU 자원을 제한하고자 하는 사용자에게 유용합니다. (Donghee Na가 gh-109595@footnote{https://github.com/python/cpython/issues/109595}를 통해 기능을 구현하였습니다.)

@item 
리눅스의 @code{타이머 파일 디스크립터(file descriptor)@footnote{https://manpages.debian.org/timerfd_create(2)}}에 대한 @ref{47e,,저수준 인터페이스}를 추가했으며, @ref{51f,,timerfd_create()}, @ref{520,,timerfd_settime()}, @ref{521,,timerfd_settime_ns()}, @ref{522,,timerfd_gettime()}, @ref{523,,timerfd_gettime_ns()}, @ref{524,,TFD_NONBLOCK}, @ref{525,,TFD_CLOEXEC}, @ref{526,,TFD_TIMER_ABSTIME}, @ref{527,,TFD_TIMER_CANCEL_ON_SET}를 제공합니다. (Masaru Tsuchiyama가 gh-108277@footnote{https://github.com/python/cpython/issues/108277}를 통해 기능을 구현하였습니다.)

@item 
@ref{528,,lchmod()}과 @ref{529,,chmod()}의 `follow_symlinks' 인자는 이제 윈도우에서도 사용할 수 있습니다. 윈도우에서는 @code{lchmod()} 함수에서 `follow_symlinks'의 기본값이 @cite{False}입니다. (Serhiy Storchaka가 gh-59616@footnote{https://github.com/python/cpython/issues/59616}를 통해 기능을 구현하였습니다.)

@item 
이제 윈도우에서도 @ref{52a,,fchmod()}와 @ref{529,,chmod()}의 파일 디스크립터(file descriptor) 지원을 사용할 수 있습니다. (Serhiy Storchaka가 gh-113191@footnote{https://github.com/python/cpython/issues/113191}를 통해 기능을 구현하였습니다.)

@item 
윈도우에서 @ref{52b,,mkdir()} 및 @ref{52c,,makedirs()}는 이제 새 디렉터리에 액세스 제어를 적용하기 위해 `mode' 값 @cite{0o700}을 전달하는 것을 지원합니다. 이는 @ref{52d,,tempfile.mkdtemp()}와 관련되며, 
@geindex Common Vulnerabilities and Exposures; CVE 2024-4030
CVE 2024-4030@footnote{https://www.cve.org/CVERecord?id=CVE-2024-4030}의 완화된 해결안입니다. 다른 `mode' 값은 지금과 같이 무시됩니다. (Steve Dower가 gh-118486@footnote{https://github.com/python/cpython/issues/118486}를 통해 기능을 구현하였습니다.)

@item 
이제 @code{posix_spawn`에서 *env* 인자로 `None()}을 전달할 수 있으며, 이 경우 새로 생성된 프로세스는 현재 프로세스의 환경을 사용합니다. (Jakub Kulik가 gh-113119@footnote{https://github.com/python/cpython/issues/113119}를 통해 기능을 구현하였습니다.)

@item 
@code{posix_spawn_file_actions_addclosefrom_np()}를 지원하는 플랫폼에서는 이제 @ref{52e,,posix_spawn()}의 `file_actions' 매개 변수에서 @ref{52f,,POSIX_SPAWN_CLOSEFROM}속성을 사용할 수 있습니다. (Jakub Kulik가 gh-113117@footnote{https://github.com/python/cpython/issues/113117}를 통해 기능을 구현하였습니다.)
@end itemize

@node os path<2>,pathlib<4>,os<2>,개선된 모듈들
@anchor{whatsnew/3 13 os-path}@anchor{530}
@subsubsection os.path



@itemize *

@item 
현재의 시스템에서 경로가 예약된 것인지 확인하기 위한 @ref{32b,,isreserved()} 함수를 추가했습니다. 해당하는 함수는 윈도우에서만 사용할 수 있습니다. (Barney Gale가 gh-88569@footnote{https://github.com/python/cpython/issues/88569}를 통해 기능을 구현하였습니다.)

@item 
윈도우에서 @ref{531,,isabs()}는 이제 정확히 슬래시(@code{\\} 또는 @code{/}) 하나로 시작하는 경로를 절대 경로로 간주하지 않습니다. (Barney Gale와 Jon Foster가 gh-44626@footnote{https://github.com/python/cpython/issues/44626}를 통해 기능을 구현하였습니다.)

@item 
@ref{262,,realpath()}는 이제 파일에 접근할 수 없는 경우에도 MS-DOS 스타일 파일 이름을 해석할 수 있습니다. (Moonsik Park이 gh-82367@footnote{https://github.com/python/cpython/issues/82367}를 통해 기능을 구현하였습니다.)
@end itemize

@node pathlib<4>,pdb<3>,os path<2>,개선된 모듈들
@anchor{whatsnew/3 13 pathlib}@anchor{532}
@subsubsection pathlib



@itemize *

@item 
지원되지 않는 경로 연산에 대해 @ref{36b,,NotImplementedError} 대신 발생하는 @ref{533,,UnsupportedOperation} 예외가 추가되었습니다. (Barney Gale이 gh-89812@footnote{https://github.com/python/cpython/issues/89812}를 통해 기능을 구현하였습니다.)

@item 
‘file’ URI(@code{file:///})에서 @ref{266,,Path} 객체를 생성하는 새로운 생성자 @ref{534,,Path.from_uri()}가 추가되었습니다. (Barney Gale이 gh-107465@footnote{https://github.com/python/cpython/issues/107465}를 통해 기능을 구현하였습니다.)

@item 
셸 스타일의 와일드카드를 통해 경로를 일치시키기 위한 @ref{535,,PurePath.full_match()}가 추가되었으며, 재귀적 와일드카드인 @code{**}도 지원합니다. (Barney Gale이 gh-73435@footnote{https://github.com/python/cpython/issues/73435}를 통해 기능을 구현하였습니다.)

@item 
저수준 경로 파싱과 결합에 사용되는 @ref{a6,,os.path} 구현을 저장하기 위한 @ref{536,,PurePath.parser} 클래스 어트리뷰트가 추가되었습니다. @code{posixpath} 또는 @code{ntpath} 둘 중 하나입니다.

@item 
@ref{537,,Path.glob()}과 @ref{538,,rglob()}에 키워드 전용 인자 `recurse_symlinks'를 추가했습니다. (Barney Gale이 gh-77609@footnote{https://github.com/python/cpython/issues/77609}를 통해 기능을 구현하였습니다.)

@item 
@ref{537,,Path.glob()}과 @ref{538,,rglob()}는 패턴이 "@code{**}"로 끝날 때 이제 파일과 디렉터리를 모두 반환합니다. 이전에는 디렉터리만 반환되었습니다. (Barney Gale이 gh-70303@footnote{https://github.com/python/cpython/issues/70303}를 통해 기능을 구현하였습니다.)

@item 
@ref{539,,Path.is_file}, @ref{53a,,Path.is_dir}, @ref{53b,,Path.owner()}, 그리고 @ref{53c,,Path.group()}에 `follow_symlinks' 키워드 전용 인자를 추가하였습니다. (Barney Gale과 Kamil Turek이 각각 gh-105793@footnote{https://github.com/python/cpython/issues/105793}과 gh-107962@footnote{https://github.com/python/cpython/issues/107962}를 통해 기능을 구현하였습니다.)
@end itemize

@node pdb<3>,queue,pathlib<4>,개선된 모듈들
@anchor{whatsnew/3 13 pdb}@anchor{53d}
@subsubsection pdb



@itemize *

@item 
이제 내장 함수 @ref{271,,breakpoint()}와 @ref{272,,set_trace()}는 다음에 실행될 코드 줄에서가 아니라 바로 디버거에 진입합니다. 이를 통해, @code{breakpoint()}가 컨텍스트의 끝에 위치할 때 디버거가 컨텍스트 바깥에서 중단되던 문제가 발생하지 않도록 합니다. (Tian Gao가 gh-118579@footnote{https://github.com/python/cpython/issues/118579}를 통해 기능을 구현하였습니다.)

@item 
이제 @ref{53e,,sys.flags.safe_path}가 설정되어 있어도 @code{sys.path[0]}는 디버깅 중인 스크립트의 디렉터리로 대체되지 않습니다. (Tian Gao와 Christian Walther가 gh-111762@footnote{https://github.com/python/cpython/issues/111762}를 통해 기능을 구현하였습니다.)

@item 
@ref{136,,zipapp}이 이제 디버깅 가능 대상으로서 지원됩니다. (Tian Gao가 gh-118501@footnote{https://github.com/python/cpython/issues/118501}를 통해 기능을 구현하였습니다.)

@item 
Pdb에 새로운 @ref{53f,,exceptions [exc_number]} 명령을 추가하여, @ref{540,,pm()}의 사후 디버깅 중에 연쇄(chained)된 예외들 사이를 이동할 수 있도록 하였습니다. (Matthias Bussonnier가 gh-106676@footnote{https://github.com/python/cpython/issues/106676}를 통해 기능을 구현하였습니다.)

@item 
앞부분이 pdb 명령인 표현식과 문장들이 이제 올바르게 인식되어 실행됩니다. (Tian Gao가 gh-108464@footnote{https://github.com/python/cpython/issues/108464}를 통해 기능을 구현하였습니다.)
@end itemize

@node queue,random,pdb<3>,개선된 모듈들
@anchor{whatsnew/3 13 queue}@anchor{541}
@subsubsection queue



@itemize *

@item 
@ref{542,,Queue.shutdown}과 @ref{543,,ShutDown}을 추가하여 큐의 종료를 관리할 수 있도록 하였습니다. (Laurie Opperman과 Yves Duprat가 gh-104750@footnote{https://github.com/python/cpython/issues/104750}를 통해 기능을 구현하였습니다.)
@end itemize

@node random,re<2>,queue,개선된 모듈들
@anchor{whatsnew/3 13 random}@anchor{544}
@subsubsection random



@itemize *

@item 
새로운 @ref{47f,,명령줄 인터페이스}를 추가하였습니다. (Hugo van Kemenade가 gh-118131@footnote{https://github.com/python/cpython/issues/118131}를 통해 기능을 구현하였습니다.)
@end itemize

@node re<2>,shutil,random,개선된 모듈들
@anchor{whatsnew/3 13 re}@anchor{545}
@subsubsection re



@itemize *

@item 
보다 더 명확한 전달을 위해 @code{re.error}를 @ref{546,,PatternError}로 이름을 바꾸었습니다. @code{re.error}는 이전 버전과의 호환성을 위해 계속 유지됩니다.
@end itemize

@node shutil,site,re<2>,개선된 모듈들
@anchor{whatsnew/3 13 shutil}@anchor{547}
@subsubsection shutil



@itemize *

@item 
@ref{548,,chown()}에서 `dir_fd' 그리고 `follow_symlinks' 키워드 인자를 지원합니다. (Berker Peksag와 Tahia K가 gh-62308@footnote{https://github.com/python/cpython/issues/62308}를 통해 기능을 구현하였습니다.)
@end itemize

@node site,sqlite3<2>,shutil,개선된 모듈들
@anchor{whatsnew/3 13 site}@anchor{549}
@subsubsection site



@itemize *

@item 
@code{.pth} 파일은 먼저 UTF-8로 디코딩되고, UTF-8 디코딩에 실패하면 @ref{54a,,로케일 인코딩}을 사용해 디코딩합니다. (Inada Naoki가 gh-117802@footnote{https://github.com/python/cpython/issues/117802}를 통해 기능을 구현하였습니다.)
@end itemize

@node sqlite3<2>,ssl<2>,site,개선된 모듈들
@anchor{whatsnew/3 13 sqlite3}@anchor{54b}
@subsubsection sqlite3



@itemize *

@item 
@ref{54c,,Connection} 객체를 @ref{54d,,close()} 메서드로 명시적으로 닫지 않으면 이제 @ref{54e,,ResourceWarning} 경고가 발생합니다. (Erlend E. Aasland가 gh-105539@footnote{https://github.com/python/cpython/issues/105539}를 통해 기능을 구현하였습니다.)

@item 
데이터베이스 객체를 덤프할 때 필터링할 수 있도록 @ref{54f,,Connection.iterdump()}에 `filter' 키워드 전용 매개변수를 추가했습니다. (Mariusz Felisiak가 gh-91602@footnote{https://github.com/python/cpython/issues/91602}를 통해 기능을 구현하였습니다.)
@end itemize

@node ssl<2>,statistics,sqlite3<2>,개선된 모듈들
@anchor{whatsnew/3 13 ssl}@anchor{550}
@subsubsection ssl



@itemize *

@item 
@ref{480,,create_default_context()} API는 이제 기본 플래그로 @ref{481,,VERIFY_X509_PARTIAL_CHAIN}과 @ref{482,,VERIFY_X509_STRICT}를 포함합니다.

@cartouche
@quotation 참고 
@ref{482,,VERIFY_X509_STRICT} 를 사용하면, 하부 OpenSSL 구현에서는 원래 허용했을 수도 있는 
@geindex RFC; RFC 5280
RFC 5280@footnote{https://datatracker.ietf.org/doc/html/rfc5280.html} 이전 형식의 인증서나 잘못된 인증서를 거부할 수 있습니다. 이 동작을 비활성화하는 것은 권장되지 않지만, 필요한 경우에는 다음과 같이 비활성화할 수 있습니다:

@example
import ssl

ctx = ssl.create_default_context()
ctx.verify_flags &= ~ssl.VERIFY_X509_STRICT
@end example
@end quotation
@end cartouche

(William Woodruff가 gh-112389@footnote{https://github.com/python/cpython/issues/112389}를 통해 기능을 구현하였습니다.)
@end itemize

@node statistics,subprocess,ssl<2>,개선된 모듈들
@anchor{whatsnew/3 13 statistics}@anchor{551}
@subsubsection statistics



@itemize *

@item 
커널 밀도 추정을 위해 @ref{552,,kde()} 함수를 추가했습니다. 해당 함수를 통해 고정된 개수의 이산 표본들로부터 연속 확률 밀도 함수를 추정할 수 있습니다. (Raymond Hettinger가 gh-115863@footnote{https://github.com/python/cpython/issues/115863}를 통해 기능을 구현하였습니다.)

@item 
@ref{552,,kde()}가 생성한 추정 확률 밀도 함수에서의 표본 샘플링을 위한 @ref{553,,kde_random()} 함수가 추가되었습니다. (Raymond Hettinger가 gh-115863@footnote{https://github.com/python/cpython/issues/115863}를 통해 기능을 구현하였습니다.)
@end itemize

@node subprocess,sys<2>,statistics,개선된 모듈들
@anchor{whatsnew/3 13 subprocess}@anchor{554}@anchor{whatsnew/3 13 whatsnew313-subprocess}@anchor{555}
@subsubsection subprocess



@itemize *

@item 
@ref{dc,,subprocess} 모듈은 이제 더 많은 종류의 상황 및 경우에서 @ref{52e,,posix_spawn()} 함수를 사용합니다.

`close_fds'가 @cite{True`(기본값)일 때@comma{} C 라이브러리가 :c:func:}!posix_spawn_file_actions_addclosefrom_np`을 제공하는 경우, @ref{52e,,posix_spawn()}이 사용됩니다. 최신 버전의 리눅스, FreeBSD, 솔라리스가 이에 포함됩니다. 리눅스에서는 이 동작이 기존 리눅스의 @code{vfork()} 기반 코드와 비슷한 성능을 보일 것입니다.

비공개(private) 제어 설정인 @code{subprocess._USE_POSIX_SPAWN}을 @cite{False}로 설정하면 @ref{dc,,subprocess} 모듈이 @ref{52e,,posix_spawn()}을 절대로 사용하지 않도록 강제할 수 있습니다. 구체적인 현실 상황에서의 활용에 있어 실제로 이 값을 이렇게 설정해야 했던 경우가 있다면, 그러한 이유와 사용 중인 플랫폼 정보를 @ref{556,,추적기}에 보고해 주시면 모든 사용자를 위해 API 선택 로직을 개선하는 데 도움이 됩니다.
@end itemize

@node sys<2>,tempfile,subprocess,개선된 모듈들
@anchor{whatsnew/3 13 sys}@anchor{557}
@subsubsection sys



@itemize *

@item 
문자열이 인턴(intern)되었는지 테스트할 수 있는 @ref{558,,_is_interned()} 함수가 추가되었습니다. 일부 파이썬 구현에서는 해당하는 함수가 구현되어 있지 않을 수 있음에 유의해주십사 부탁드립니다. (Serhiy Storchaka가 gh-78573@footnote{https://github.com/python/cpython/issues/78573}를 통해 기능을 구현하였습니다.)
@end itemize

@node tempfile,time,sys<2>,개선된 모듈들
@anchor{whatsnew/3 13 tempfile}@anchor{559}
@subsubsection tempfile



@itemize *

@item 
윈도우에서는 @ref{52d,,tempfile.mkdtemp()}에서 사용하는 기본 모드 @cite{0o700}이 @ref{52b,,os.mkdir()}의 변경으로 인해 새 디렉터리에 대한 접근을 제한하도록 변경되었습니다. 
@geindex Common Vulnerabilities and Exposures; CVE 2024-4030
CVE 2024-4030@footnote{https://www.cve.org/CVERecord?id=CVE-2024-4030}의 해결을 위해 제안되었습니다. (Steve Dower가 gh-118486@footnote{https://github.com/python/cpython/issues/118486}를 통해 기능을 구현하였습니다.)
@end itemize

@node time,tkinter<2>,tempfile,개선된 모듈들
@anchor{whatsnew/3 13 time}@anchor{55a}
@subsubsection time



@itemize *

@item 
윈도우에서는 @ref{55b,,monotonic()}이 이제 해상도 15.6 밀리초인 @code{GetTickCount64()} 시계 대신 해상도 1 마이크로초인 @code{QueryPerformanceCounter()} 시계를 사용합니다. (Victor Stinner가 gh-88494@footnote{https://github.com/python/cpython/issues/88494}를 통해 기능을 구현하였습니다.)

@item 
윈도우에서 @ref{55c,,time()}은 이제 해상도가 15.6밀리초인 @code{GetSystemTimeAsFileTime()} 시계 대신, 해상도가 1마이크로초인 @code{GetSystemTimePreciseAsFileTime()} 시계를 사용합니다. (Victor Stinner가 gh-63207@footnote{https://github.com/python/cpython/issues/63207}를 통해 기능을 구현하였습니다.)
@end itemize

@node tkinter<2>,traceback,time,개선된 모듈들
@anchor{whatsnew/3 13 tkinter}@anchor{55d}
@subsubsection tkinter



@itemize *

@item 
@ref{f6,,tkinter} 위젯에 @code{tk_busy_hold()}, @code{tk_busy_configure()}, @code{tk_busy_cget()}, @code{tk_busy_forget()}, @code{tk_busy_current()}, @code{tk_busy_status()} 메서드를 추가되었습니다.

@item 
@ref{f6,,tkinter} 위젯 메서드 @code{wm_attributes()}는 이제 창 어트리뷰트를 가져올 때 접두사 하이픈 없이 속성 이름만 전달할 수 있습니다. 예를 들어, @code{w.wm_attributes('alpha')}가 가능합니다. 또한, @code{w.wm_attributes(alpha=0.5)}와 같이, 설정할 어트리뷰트와 값을 키워드 인자로 지정할 수 있습니다. (Serhiy Storchaka가 gh-43457@footnote{https://github.com/python/cpython/issues/43457}를 통해 기능을 구현하였습니다.)

@item 
새로운 선택적 키워드 전용 매개변수 `return_python_dict'를 사용하면 @code{wm_attributes()}가 어트리뷰트를 @ref{183,,dict}로 반환하도록 할 수 있습니다. (Serhiy Storchaka가 gh-43457@footnote{https://github.com/python/cpython/issues/43457}를 통해 기능을 구현하였습니다.)

@item 
새로운 선택적 키워드 전용 매개변수 `return_ints'를 사용하면 @code{Text.count()}가 단순한 @ref{19b,,int} 값을 반환할 수 있습니다. 그 밖의 경우에는 1-튜플 또는 @cite{None}으로 반환합니다. (Serhiy Storchaka가 gh-97928@footnote{https://github.com/python/cpython/issues/97928}를 통해 기능을 구현하였습니다.)

@item 
@ref{55e,,tkinter.ttk.Style}의 @ref{55f,,element_create()} 메서드에서 @cite{vsapi} 엘리먼트 타입을 지원합니다. (Serhiy Storchaka가 gh-68166@footnote{https://github.com/python/cpython/issues/68166}를 통해 기능을 구현하였습니다.)

@item 
Tkinter 위젯에 @code{after_info()} 메서드를 추가했습니다. (Cheryl Sabella가 gh-77020@footnote{https://github.com/python/cpython/issues/77020}를 통해 기능을 구현하였습니다.)

@item 
한 이미지의 영역을 다른 이미지로 복사할 수 있도록 @code{PhotoImage} 클래스에 새 메서드 @code{copy_replace()}를 추가했습니다. 이때 픽셀 확대(zooming), 서브샘플링(subsampling) 또는 둘 다를 함께 적용할 수 있습니다. (Serhiy Storchaka가 gh-118225@footnote{https://github.com/python/cpython/issues/118225}를 통해 기능을 구현하였습니다.)

@item 
@code{PhotoImage} 클래스의 @code{copy()}, @code{zoom()}, @code{subsample()} 메서드에 `from_coords' 매개 변수가 추가되었습니다. @code{PhotoImage} 클래스의 @code{copy()} 메서드에 `zoom*과 *subsample' 매개 변수가 추가되었습니다. (Serhiy Storchaka가 gh-118225@footnote{https://github.com/python/cpython/issues/118225}를 통해 기능을 구현하였습니다.)

@item 
파일에서 이미지를 읽기 위한 @code{read()} 메서드와 이미지 데이터를 가져오기 위한 @code{data()} 메서드가 @code{PhotoImage} 클래스에 추가되었습니다. @code{write()} 메서드에 `background' 및 `grayscale' 매개변수가 추가되었습니다. (Serhiy Storchaka가 gh-118271@footnote{https://github.com/python/cpython/issues/118271}를 통해 기능을 구현하였습니다.)
@end itemize

@node traceback,types<2>,tkinter<2>,개선된 모듈들
@anchor{whatsnew/3 13 traceback}@anchor{560}
@subsubsection traceback



@itemize *

@item 
@ref{561,,TracebackException}에 @ref{562,,exc_type_str}어트리뷰트가 추가되었습니다. 이 어트리뷰트에는 `exc_type'의 문자열 표현이 저장됩니다. 타입 객체 자체를 담고 있는 @ref{563,,exc_type}어트리뷰트의 사용 지원이 중단(deprecate)되었습니다. @code{exc_type}을 저장할지 여부를 나타내기 위해 기본값이 @code{True}인 매개 변수 `save_exc_type'이 추가되었습니다. (Irit Katriel이 gh-112332@footnote{https://github.com/python/cpython/issues/112332}을 통해 기능을 구현하였습니다.)

@item 
@ref{564,,BaseExceptionGroup} 인스턴스의 중첩된 예외를 재귀적으로 서식을 지정할 수 있도록 @ref{565,,TracebackException.format_exception_only()} 메서드에 새 키워드 전용(keyword-only) 매개 변수 `show_group' 이 추가되었습니다. (Irit Katriel가 gh-105292@footnote{https://github.com/python/cpython/issues/105292}를 통해 기능을 구현하였습니다.)
@end itemize

@node types<2>,typing<2>,traceback,개선된 모듈들
@anchor{whatsnew/3 13 types}@anchor{566}
@subsubsection types



@itemize *

@item 
@ref{4e5,,SimpleNamespace}는 이제 네임스페이스의 속성을 초기화하기 위해 단일 위치 인자를 받을 수 있습니다. 해당하는 매개 변수는 매핑 (mapping)이거나 키/값 쌍의 이터러블이어야 합니다. (Serhiy Storchaka가 gh-108191@footnote{https://github.com/python/cpython/issues/108191}를 통해 기능을 구현하였습니다.)
@end itemize

@node typing<2>,unicodedata<2>,types<2>,개선된 모듈들
@anchor{whatsnew/3 13 typing}@anchor{567}
@subsubsection typing



@itemize *

@item 
@geindex Python 향상 제안; PEP 705
PEP 705@footnote{https://peps.python.org/pep-0705/}: 정적 타입 검사기(type checker)에서 @ref{332,,TypedDict} 항목을 읽기 전용으로 표시하기 위한 특수 타이핑 구조물인 @ref{48b,,ReadOnly}를 추가했습니다.

@item 
@geindex Python 향상 제안; PEP 742
PEP 742@footnote{https://peps.python.org/pep-0742/}: 타입 축소(type narrowing) 방법을 타입 검사기에 알려 주는 타이핑 구조물인 @ref{48c,,TypeIs}를 추가했습니다.

@item 
@ref{10a,,typing} 모듈에서 일부 매개변수의 기본값을 나타내는 데 사용되는 센티넬 객체 @ref{568,,NoDefault} 가 추가되었습니다. (Jelle Zijlstra가 gh-116126@footnote{https://github.com/python/cpython/issues/116126}을 통해 기능을 구현하였습니다.)

@item 
@ref{569,,typing.Protocol}을 정의하는 멤버들의 집합을 반환하는 @ref{56a,,get_protocol_members()} 함수가 추가되었습니다. (Jelle Zijlstra가 gh-104873@footnote{https://github.com/python/cpython/issues/104873}를 통해 기능을 구현하였습니다.)

@item 
클래스가 @ref{569,,Protocol} 인지 확인할 수 있도록 @ref{56b,,is_protocol()} 함수를 추가했습니다. (Jelle Zijlstra가 gh-104873@footnote{https://github.com/python/cpython/issues/104873}를 통해 기능을 구현하였습니다.)

@item 
이제 @ref{56c,,ClassVar} 를 @ref{56d,,Final} 안에 중첩해 사용할 수 있고, 그 반대의 중첩 역시 가능합니다. (Mehdi Drissi가 gh-89547@footnote{https://github.com/python/cpython/issues/89547}를 통해 기능을 구현하였습니다.)
@end itemize

@node unicodedata<2>,venv,typing<2>,개선된 모듈들
@anchor{whatsnew/3 13 unicodedata}@anchor{56e}
@subsubsection unicodedata



@itemize *

@item 
유니코드 데이터베이스가 버전 15.1.0@footnote{https://www.unicode.org/versions/Unicode15.1.0/} 으로 갱신되었습니다. (James Gerity가 gh-109559@footnote{https://github.com/python/cpython/issues/109559}를 통해 기능을 구현하였습니다.)
@end itemize

@node venv,warnings,unicodedata<2>,개선된 모듈들
@anchor{whatsnew/3 13 venv}@anchor{56f}
@subsubsection venv



@itemize *

@item 
가상 환경 디렉터리 안에서 소스 제어 관리(SCM)용 무시(ignore) 파일들을 생성하는 기능이 추가되었습니다. Git이 기본적으로 지원됩니다. @ref{570,,EnvBuilder}, @ref{571,,create()} 와 같은 API를 통해 옵트인(opt-in) 방식으로 제공되며, 이를 확장해 다른 SCM도 지원할 수 있습니다. 또한 CLI에서는 @code{--without-scm-ignore-files} 옵션을 사용하여 이 동작을 옵트아웃(opt-out)할 수 있습니다. (Brett Cannon이 gh-108125@footnote{https://github.com/python/cpython/issues/108125}를 통해 기능을 구현하였습니다.)
@end itemize

@node warnings,xml,venv,개선된 모듈들
@anchor{whatsnew/3 13 warnings}@anchor{572}
@subsubsection warnings



@itemize *

@item 
@geindex Python 향상 제안; PEP 702
PEP 702@footnote{https://peps.python.org/pep-0702/}: 새 @ref{48a,,warnings.deprecated()} 데코레이터는 사용 지원 중단(deprecate) 정보를 @ref{573,,정적 타입 검사기}에 전달하고, 사용이 중단된 클래스와 함수의 사용 시 경고를 발생시키는 방법을 제공합니다. 이와 같이 데코레이터가 함수나 클래스와 함께 사용되는 경우에는 또한 런타임 때에 @ref{1a3,,DeprecationWarning}이 발생합니다. (Jelle Zijlstra가 gh-104003@footnote{https://github.com/python/cpython/issues/104003}를 통해 기능을 구현하였습니다.)
@end itemize

@node xml,zipimport,warnings,개선된 모듈들
@anchor{whatsnew/3 13 xml}@anchor{574}
@subsubsection xml



@itemize *

@item 
다섯 개의 새 메서드를 추가하여 Expat >=2.6.0의 구문 재분석 연기(reparse deferral) (
@geindex Common Vulnerabilities and Exposures; CVE 2023-52425
CVE 2023-52425@footnote{https://www.cve.org/CVERecord?id=CVE-2023-52425})를 제어할 수 있도록 합니다:


@itemize *

@item 
@ref{575,,xml.etree.ElementTree.XMLParser.flush()}

@item 
@ref{576,,xml.etree.ElementTree.XMLPullParser.flush()}

@item 
@ref{577,,xml.parsers.expat.xmlparser.GetReparseDeferralEnabled()}

@item 
@ref{578,,xml.parsers.expat.xmlparser.SetReparseDeferralEnabled()}

@item 
@code{xml.sax.expatreader.ExpatParser.flush()}
@end itemize

(Sebastian Pipping이 gh-115623@footnote{https://github.com/python/cpython/issues/115623}을 통해 기능을 구현하였습니다.)

@item 
명시적인 클린업를 위해 @ref{579,,iterparse()}가 반환하는 이터레이터에 @code{close()} 메서드가 추가되었습니다. (Serhiy Storchaka가 gh-69893@footnote{https://github.com/python/cpython/issues/69893}을 통해 기능을 구현하였습니다.)
@end itemize

@node zipimport,,xml,개선된 모듈들
@anchor{whatsnew/3 13 zipimport}@anchor{57a}
@subsubsection zipimport



@itemize *

@item 
ZIP64@footnote{https://en.wikipedia.org/wiki/Zip_(file_format)#ZIP64} 형식 파일에 대한 지원이 추가되었습니다.  거대한 데이터를 그 누가 사랑하지 않을 수 있나요?  (Tim Hatch가 gh-94146@footnote{https://github.com/python/cpython/issues/94146}를 통해 기능을 구현하였습니다.)
@end itemize

@node 최적화 관련 사항들,제거된 모듈들과 API들,개선된 모듈들,파이썬 3 13의 새로운 기능에 대해 알아봅시다
@anchor{whatsnew/3 13 optimizations}@anchor{57b}
@subsection 최적화 관련 사항들



@itemize *

@item 
몇몇 표준 라이브러리 모듈의 임포트 시간이 크게 개선되었습니다. 예를 들어, @ref{10a,,typing} 모듈의 임포트 시간은 @ref{be,,re} 및 @ref{27,,contextlib}에 대한 의존성을 제거함을 통해 약 3분의 1만큼 단축되었습니다. 임포트 시간이 단축된 다른 모듈들은 @ref{54,,email.utils}, @ref{5a,,enum}, @ref{63,,functools}, @ref{7e,,importlib.metadata}, @ref{f3,,threading} 등 입니다. (Alex Waygood, Shantanu Jain, Adam Turner, Daniel Hollas 등이 gh-109653@footnote{https://github.com/python/cpython/issues/109653}을 통해 기능을 구현하였습니다.)

@item 
@ref{57c,,textwrap.indent()}는 이제 대규모 입력에 대해 예전보다 약 30% 더 빠르게 동작합니다. (Inada Naoki가 gh-107369@footnote{https://github.com/python/cpython/issues/107369}를 통해 기능을 구현하였습니다.)

@item 
@ref{dc,,subprocess} 모듈은 이제 많은 최신 플랫폼에서, `close_fds'가 기본값인 @code{True}인 경우를 포함하는 방식으로, 더 많은 상황에서 @ref{52e,,posix_spawn()} 함수를 사용합니다. 해당하는 방식은 FreeBSD와 솔라리스에서 프로세스를 시작할 때 눈에 띄는 성능 향상을 제공할 것으로 보입니다. 보다 자세한 내용의 경우 위의 @ref{555,,subprocess}를 참고 부탁드립니다. (Jakub Kulik이 gh-113117@footnote{https://github.com/python/cpython/issues/113117}를 통해 기능을 구현하였습니다.)
@end itemize

@node 제거된 모듈들과 API들,New Deprecations,최적화 관련 사항들,파이썬 3 13의 새로운 기능에 대해 알아봅시다
@anchor{whatsnew/3 13 removed-modules-and-apis}@anchor{57d}
@subsection 제거된 모듈들과 API들


@menu
* PEP 594; 표준 라이브러리에서 "죽은 배터리들(dead batteries)" 제거하기: PEP 594 표준 라이브러리에서 "죽은 배터리들 dead batteries " 제거하기. 
* 2to3:: 
* builtins:: 
* configparser: configparser<3>. 
* importlib.metadata: importlib metadata. 
* locale:: 
* opcode:: 
* optparse:: 
* pathlib: pathlib<5>. 
* re: re<3>. 
* tkinter.tix: tkinter tix. 
* turtle: turtle<2>. 
* typing: typing<3>. 
* unittest: unittest<2>. 
* urllib: urllib<3>. 
* webbrowser: webbrowser<2>. 

@end menu

@node PEP 594 표준 라이브러리에서 "죽은 배터리들 dead batteries " 제거하기,2to3,,제거된 모듈들과 API들
@anchor{whatsnew/3 13 pep-594-remove-dead-batteries-from-the-standard-library}@anchor{57e}@anchor{whatsnew/3 13 whatsnew313-pep594}@anchor{471}
@subsubsection PEP 594: 표준 라이브러리에서 "죽은 배터리들(dead batteries)" 제거하기


@geindex Python 향상 제안; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/}는 파이썬의 역사와 관련된 이유로 남아 있거나, 구식으로 간주되고 있거나, 보안에 문제가 있어 일명 ‘죽은 배터리(dead batteries)’로 불리는 모듈 19개를 표준 라이브러리에서 제거할 것을 제안했습니다. 다음의 해당하는 모듈들은 파이썬 3.11에서 사용 지원이 중단(deprecate)되었으며, 이제는 완전히 제거되었습니다:


@itemize *

@item 
@code{aifc}


@itemize *

@item 
standard-aifc@footnote{https://pypi.org/project/standard-aifc/}: PyPI에 재배포된 @cite{aifc} 라이브러리를 사용해주시기를 부탁드립니다.
@end itemize

@item 
@code{audioop}


@itemize *

@item 
audioop-lts@footnote{https://pypi.org/project/audioop-lts/}: PyPI의 @cite{audioop-lts} 라이브러리를 사용해주시기를 부탁드립니다.
@end itemize

@item 
@code{chunk}


@itemize *

@item 
standard-chunk@footnote{https://pypi.org/project/standard-chunk/}: PyPI에 재배포된 @cite{chunk} 라이브러리를 사용해주시기를 부탁드립니다.
@end itemize

@item 
@code{cgi} and @code{cgitb}


@itemize *

@item 
@code{cgi.FieldStorage}는 통상 @cite{GET} 및 @cite{HEAD} 요청에서는 @code{urllib.parse.parse_qsl`로 대체할 수 있고, `POST()} 및 @cite{PUT} 요청에서는 @ref{48,,email.message} 모듈이나 multipart@footnote{https://pypi.org/project/multipart/} 라이브러리를 사용하면 대체할 수 있습니다.

@item 
입력이 @cite{multipart/form-data}인 경우를 제외하면, 원하는 쿼리 문자열에 대해 @ref{31f,,urllib.parse.parse_qs()}를 직접 호출하는 방식으로 @code{cgi.parse()}를 대체할 수 있습니다. 다만 입력이 @cite{multipart/form-data}인 경우에는 아래에 설명된 대로 @code{cgi.parse_multipart()}를 사용하는 방식으로 대체해야 합니다.

@item 
@code{cgi.parse_header()} 함수는 동일한 MIME RFC들을 구현하는 @ref{3f,,email} 패키지의 기능으로 대체할 수 있습니다. 예를 들어, @ref{57f,,email.message.EmailMessage}를 사용하는 경우는 다음과 같습니다:

@example
from email.message import EmailMessage

msg = EmailMessage()
msg['content-type'] = 'application/json; charset="utf8"'
main, params = msg.get_content_type(), msg['content-type'].params
@end example

@item 
@code{cgi.parse_multipart()}는 동일한 MIME RFC들을 구현하는 @ref{3f,,email} 패키지의 기능으로 대체되거나 multipart@footnote{https://pypi.org/project/multipart/} 라이브러리로 대체될 수 있습니다. 예를 들어, @ref{57f,,email.message.EmailMessage} 및 @ref{580,,email.message.Message} 클래스를 활용함을 통해 대체할 수 있습니다.

@item 
“standard-cgi@footnote{https://pypi.org/project/standard-cgi/}: & standard-cgitb@footnote{https://pypi.org/project/standard-cgitb/}: PyPI에 재배포된 @code{cgi} & @code{cgitb} 라이브러리를 사용해주시기를 부탁드립니다.
@end itemize

@item 
@code{crypt} 및 비공개(private) @code{_crypt} 확장 모듈. @ref{6c,,hashlib} 모듈은 단순히 값을 해싱해야 할 때 사용할 수 있는 가능한 하나의 대안입니다. 또한, PyPI에는 다양한 제삼자 라이브러리가 준비되어 있습니다.


@itemize *

@item 
bcrypt@footnote{https://pypi.org/project/bcrypt/}: 소프트웨어와 서버에서 사용할 수 있는 보다 현대적인 암호 해싱 라이브러리입니다.

@item 
argon2-cffi@footnote{https://pypi.org/project/argon2-cffi/}: 안전한 Argon2 암호 해싱 알고리즘입니다.

@item 
legacycrypt@footnote{https://pypi.org/project/legacycrypt/}: POSIX @cite{crypt} 라이브러리 호출과 관련 기능을 위한 @ref{2e,,ctypes} 래퍼(wrapper)입니다.

@item 
crypt_r@footnote{https://pypi.org/project/crypt_r/}: @code{crypt} 모듈의 포크(fork)로, @code{crypt_r(3)@footnote{https://manpages.debian.org/crypt_r(3)}} 라이브러리 호출과 관련 기능을 감싸는 래퍼(wrapper)입니다.

@item 
standard-crypt@footnote{https://pypi.org/project/standard-crypt/} 및 deprecated-crypt-alternative@footnote{https://pypi.org/project/deprecated-crypt-alternative/}: PyPI에서 배포되는 @cite{crypt} 라이브러리 재배포판과 @cite{_crypt} 라이브러리 재구현을 사용하십시오.
@end itemize

@item 
@code{imghdr}: 대체 라이브러리로 filetype@footnote{https://pypi.org/project/filetype/}, puremagic@footnote{https://pypi.org/project/puremagic/}, 그리고 python-magic@footnote{https://pypi.org/project/python-magic/}를 사용해야 합니다. 예를 들어, @code{puremagic.what()} 함수를 사용하여 @code{imghdr}가 지원하던 모든 파일 형식에 대해 @code{imghdr.what()} 함수를 대체할 수 있습니다.


@itemize *

@item 
standard-imghdr@footnote{https://pypi.org/project/standard-imghdr/}: PyPI에서 배포되는 @cite{imghdr} 라이브러리 재배포판을 사용해주시기를 부탁드립니다.
@end itemize

@item 
@code{mailcap}: 대신 @ref{93,,mimetypes} 모듈을 사용해주시기를 부탁드립니다.


@itemize *

@item 
standard-mailcap@footnote{https://pypi.org/project/standard-mailcap/}: PyPI에서 배포되는 @cite{mailcap} 라이브러리 재배포판을 사용해주시기를 부탁드립니다.
@end itemize

@item 
@code{msilib}

@item 
@code{nis}

@item 
@code{nntplib}: 대신 PyPI의 pynntp@footnote{https://pypi.org/project/pynntp/} 라이브러리를 사용하십시오.


@itemize *

@item 
standard-nntplib@footnote{https://pypi.org/project/standard-nntplib/}: PyPI에서 배포되는 @cite{nntplib} 라이브러리 재배포판을 사용하십시오.
@end itemize

@item 
@code{ossaudiodev}: 오디오 재생에 있어 해당 라이브러리 대신 PyPI의 pygame@footnote{https://pypi.org/project/pygame/} 라이브러리를 사용해주시기를 부탁드립니다.

@item 
@code{pipes}: 대신 @ref{dc,,subprocess} 모듈을 사용해주시기를 부탁드립니다.
문서화되지 않은 @code{pipes.quote} 함수를 대신하여 @ref{581,,shlex.quote()}를 사용해주시기를 부탁드립니다.


@itemize *

@item 
standard-pipes@footnote{https://pypi.org/project/standard-pipes/}: PyPI에서 재배포되는 @cite{pipes} 라이브러리를 사용해주시기를 부탁드립니다.
@end itemize

@item 
@code{sndhdr}: filetype@footnote{https://pypi.org/project/filetype/}, puremagic@footnote{https://pypi.org/project/puremagic/} 혹은 python-magic@footnote{https://pypi.org/project/python-magic/} 라이브러리를 대신 사용해주시기를 부탁드립니다.


@itemize *

@item 
standard-sndhdr@footnote{https://pypi.org/project/standard-sndhdr/}: PyPI에서 재배포되는 @cite{sndhdr} 라이브러리를 사용해주시기를 부탁드립니다.
@end itemize

@item 
@code{spwd}: PyPI에서 제공되는 python-pam@footnote{https://pypi.org/project/python-pam/} 라이브러리를 대신 사용해주시기를 부탁드립니다.

@item 
@code{sunau}


@itemize *

@item 
standard-sunau@footnote{https://pypi.org/project/standard-sunau/}: PyPI에서 재배포되는 @cite{sunau} 라이브러리를 사용해주시기를 부탁드립니다.
@end itemize

@item 
@code{telnetlib}: PyPI에서 제공되는 telnetlib3@footnote{https://pypi.org/project/telnetlib3/} 또는 Exscript@footnote{https://pypi.org/project/Exscript/} 라이브러리를 대신 사용해주시기를 부탁드립니다.


@itemize *

@item 
standard-telnetlib@footnote{https://pypi.org/project/standard-telnetlib/}: PyPI에서 재배포되는 @cite{telnetlib} 라이브러리를 사용해주시기를 부탁드립니다.
@end itemize

@item 
@code{uu}: 보다 현대적인 대안으로, @ref{f,,base64} 모듈을 대신 사용해주시기를 부탁드립니다.


@itemize *

@item 
standard-uu@footnote{https://pypi.org/project/standard-uu/}: PyPI에서 재배포되는 @code{uu} 라이브러리를 사용해주시기를 부탁드립니다.
@end itemize

@item 
@code{xdrlib}


@itemize *

@item 
standard-xdrlib@footnote{https://pypi.org/project/standard-xdrlib/}: PyPI에서 재배포되는 @code{xdrlib} 라이브러리를 사용해주시기를 부탁드립니다.
@end itemize
@end itemize

(Victor Stinner와 Zachary Ware가 gh-104773@footnote{https://github.com/python/cpython/issues/104773}와 gh-104780@footnote{https://github.com/python/cpython/issues/104780}를 통해 기능을 구현하였습니다.)

@node 2to3,builtins,PEP 594 표준 라이브러리에서 "죽은 배터리들 dead batteries " 제거하기,제거된 모듈들과 API들
@anchor{whatsnew/3 13 to3}@anchor{582}
@subsubsection 2to3



@itemize *

@item 
파이썬 3.11에서 사용 지원 중단되었던 @code{2to3}과 @code{lib2to3} 모듈이 제거되었습니다.
@end itemize

@node builtins,configparser<3>,2to3,제거된 모듈들과 API들
@anchor{whatsnew/3 13 builtins}@anchor{583}
@subsubsection builtins



@itemize *

@item 
연쇄(chained) @ref{48f,,classmethod} 설명자(descriptors)에 대한 지원이 중단되었습니다(gh-63272@footnote{https://github.com/python/cpython/issues/63272}를 통해 도입된 기능입니다). 이제 @ref{4b3,,property}와 같은 다른 디스크립터를 감싸기(wrap) 위해 사용할 수 없습니다. 이 기능의 핵심 설계에 결함이 있었고, 여러 문제를 발생시켰었습니다. @code{classmethod}를 전달(pass-through)하기 위해서는, Python 3.10에서 추가된 @code{__wrapped__} 어트리뷰트를 사용하는 것이 보다 바람직합니다. (Raymond Hettinger가 gh-89519@footnote{https://github.com/python/cpython/issues/89519}를 통해 기능을 구현하였습니다.)

@item 
일시 중지된 프레임에서 @ref{584,,frame.clear()}를 호출하면 (실행 중인 프레임에서와 마찬가지로) @ref{244,,RuntimeError}가 발생합니다. (Irit Katriel이 gh-79932@footnote{https://github.com/python/cpython/issues/79932}를 통해 기능을 구현하였습니다.)
@end itemize

@node configparser<3>,importlib metadata,builtins,제거된 모듈들과 API들
@anchor{whatsnew/3 13 id3}@anchor{585}
@subsubsection configparser



@itemize *

@item 
문서화되지 않은 @code{LegacyInterpolation} 클래스를 제거했습니다. 이 클래스는 문서 문자열(docstring)에서는 파이썬 3.2부터 사용 지원 중단(deprecated)으로 표시되어 있었습니다. 런타임에서는 파이썬 3.11부터 사용 지원 중단(deprecated)으로 표시되어 있었습니다. (Hugo van Kemenade가 gh-104886@footnote{https://github.com/python/cpython/issues/104886}를 통해 기능을 구현하였습니다.)
@end itemize

@node importlib metadata,locale,configparser<3>,제거된 모듈들과 API들
@anchor{whatsnew/3 13 importlib-metadata}@anchor{586}
@subsubsection importlib.metadata



@itemize *

@item 
@ref{587,,EntryPoint} 객체에 대해 더는 사용 지원되지 않는(deprecated) 서브스크립트(@ref{588,,__getitem__()}) 방식의 액세스를 제거했습니다. (Jason R. Coombs가 gh-113175@footnote{https://github.com/python/cpython/issues/113175}를 통해 기능을 구현하였습니다.)
@end itemize

@node locale,opcode,importlib metadata,제거된 모듈들과 API들
@anchor{whatsnew/3 13 locale}@anchor{589}
@subsubsection locale



@itemize *

@item 
파이썬 3.11에서 사용 지원 중단(deprecated)되었던 @code{locale.resetlocale()} 함수를 제거했습니다. 대신 @code{locale.setlocale(locale.LC_ALL, \"\")}을 사용해주시기를 부탁드립니다.
@end itemize

@node opcode,optparse,locale,제거된 모듈들과 API들
@anchor{whatsnew/3 13 opcode}@anchor{58a}
@subsubsection opcode



@itemize *

@item 
@code{opcode.ENABLE_SPECIALIZATION}를 @code{_opcode.ENABLE_SPECIALIZATION}로 옮겼습니다. 이 필드는 3.12에서 추가되었지만 문서화된 적이 없으며, 외부에서 사용하도록 의도되었던 것이 아니었습니다. (Irit Katriel이 gh-105481@footnote{https://github.com/python/cpython/issues/105481}를 통해 기능을 구현하였습니다.)

@item 
@code{opcode.is_pseudo()}, @code{opcode.MIN_PSEUDO_OPCODE}, @code{opcode.MAX_PSEUDO_OPCODE}를 제거했습니다. 해당하는 어트리뷰트는 파이썬 3.12에서 추가되었지만 문서화되지 않았었고, @ref{3c,,dis}를 통해 노출되지도 않았으며, 외부에서 사용하도록  의도되었던 것이 아니었습니다. (Irit Katriel이 gh-105481@footnote{https://github.com/python/cpython/issues/105481}를 통해 기능을 구현하였습니다.)
@end itemize

@node optparse,pathlib<5>,opcode,제거된 모듈들과 API들
@anchor{whatsnew/3 13 optparse}@anchor{58b}
@subsubsection optparse



@itemize *

@item 
해당하는 모듈은 이제 @ref{23d,,소프트 사용 지원 중단(soft deprecated)} 상태로 간주되지 않습니다. 제삼자(third-party) 명령행 인자 처리 라이브러리를 사용하지 않는 새로운 프로젝트에서는 여전히 @ref{7,,argparse}가 우선적으로 권장됩니다. @cite{argparse}의 동작 방식에는 보다 저수준인 @cite{optparse} 모듈이 `인자 처리 라이브러리를 작성'할 때나 C언어의 @code{getopt()} 함수의 동작에서 유래한 다양한 유닉스 명령행 처리 규약을 @cite{argparse}보다 더 엄격하게 따르는 명령행 어플리케이션을 구현할 때 더 나은 기반을 제공할 수 있는 측면들도 고려되어야 합니다. (Alyssa Coghlan와 Serhiy Storchaka가 gh-126180@footnote{https://github.com/python/cpython/issues/126180}를 통해 기능을 구현하였습니다.)
@end itemize

@node pathlib<5>,re<3>,optparse,제거된 모듈들과 API들
@anchor{whatsnew/3 13 id4}@anchor{58c}
@subsubsection pathlib



@itemize *

@item 
@ref{266,,Path} 객체를 컨텍스트 관리자로 사용할 수 있는 기능이 제거되었습니다. 해당하는 기능은 과거에 사용 지원이 중단(deprecated)되어 있었으며, 파이썬 3.9부터는 아무런 효과도 없었습니다. (Barney Gale이 gh-83863@footnote{https://github.com/python/cpython/issues/83863}를 통해 기능을 구현하였습니다.)
@end itemize

@node re<3>,tkinter tix,pathlib<5>,제거된 모듈들과 API들
@anchor{whatsnew/3 13 id5}@anchor{58d}
@subsubsection re



@itemize *

@item 
@code{re.template()}를 (@code{re.TEMPLATE} 및 @code{re.T} 플래그와 함께) 제거하였습니다. 해당하는 함수는 문서화되어 있지 않았으며, 사용 지원 중단(deprecated)되어 있었으며, 정상적으로 작동하지 않았었습니다. (Serhiy Storchaka와 Nikita Sobolev가 gh-105687@footnote{https://github.com/python/cpython/issues/105687}를 통해 기능을 구현하였습니다.)
@end itemize

@node tkinter tix,turtle<2>,re<3>,제거된 모듈들과 API들
@anchor{whatsnew/3 13 tkinter-tix}@anchor{58e}
@subsubsection tkinter.tix



@itemize *

@item 
파이썬 3.6에서 사용 지원이 중단(deprecated)되었던 @code{tkinter.tix} 모듈이 제거되었습니다. 해당하는 모듈이 감싸고(wrapped) 있던 Tix 제삼자 라이브러리는 더 이상 유지 보수되지 않습니다. (Zachary Ware가 gh-75552@footnote{https://github.com/python/cpython/issues/75552}를 통해 기능을 구현하였습니다.)
@end itemize

@node turtle<2>,typing<3>,tkinter tix,제거된 모듈들과 API들
@anchor{whatsnew/3 13 turtle}@anchor{58f}
@subsubsection turtle



@itemize *

@item 
(문서에서는 파이썬 3.1부터, 런타임에서는 파이썬 3.11부터) 사용 지원이 중단(deprecated)되었던 @code{RawTurtle.settiltangle()} 메서드가 제거되었습니다. (Hugo van Kemenade가 gh-104876@footnote{https://github.com/python/cpython/issues/104876}를 통해 기능을 구현하였습니다.)
@end itemize

@node typing<3>,unittest<2>,turtle<2>,제거된 모듈들과 API들
@anchor{whatsnew/3 13 id6}@anchor{590}
@subsubsection typing



@itemize *

@item 
파이썬 3.8부터 사용 지원이 중단(deprecated)되었던 @code{typing.io} 및 @code{typing.re} 네임스페이스가 제거되었습니다. 해당하는 네임스페이스에 있던 항목들은 이제 @ref{10a,,typing} 모듈에서 직접 임포트할 수 있습니다. (Sebastian Rittau가 gh-92871@footnote{https://github.com/python/cpython/issues/92871}를 통해 기능을 구현하였습니다.)

@item 
키워드 인자를 사용해서 @ref{332,,TypedDict} 타입들을 생성하는 방식은 파이썬 3.11에서 사용 지원이 중단(deprecated)되었으며, 이제 제거되었습니다. (Tomas Roun이 gh-104786@footnote{https://github.com/python/cpython/issues/104786}를 통해 기능을 구현하였습니다.)
@end itemize

@node unittest<2>,urllib<3>,typing<3>,제거된 모듈들과 API들
@anchor{whatsnew/3 13 unittest}@anchor{591}
@subsubsection unittest



@itemize *

@item 
다음의 @ref{10c,,unittest} 함수들은 파이썬 3.11에서 사용 지원이 중단(deprecated)되었으며 제거되었습니다:


@itemize *

@item 
@code{unittest.findTestCases()}

@item 
@code{unittest.makeSuite()}

@item 
@code{unittest.getTestCaseNames()}
@end itemize

대신 @ref{592,,TestLoader} 메서드를 사용해주시기를 부탁드립니다.


@itemize *

@item 
@ref{593,,loadTestsFromModule()}

@item 
@ref{594,,loadTestsFromTestCase()}

@item 
@ref{595,,getTestCaseNames()}
@end itemize

(Hugo van Kemenade가 gh-104835@footnote{https://github.com/python/cpython/issues/104835}를 통해 기능을 구현하였습니다.)

@item 
테스트되지 않았으며 문서화되지 않았던 @code{TestProgram.usageExit()} 메서드가 제거되었습니다. 해당하는 메서드는 파이썬 3.11에서 사용 지원 중단(deprecated)되었었습니다.
@end itemize

@node urllib<3>,webbrowser<2>,unittest<2>,제거된 모듈들과 API들
@anchor{whatsnew/3 13 urllib}@anchor{596}
@subsubsection urllib



@itemize *

@item 
파이썬 3.6에서 사용 지원 중단(deprecated)되었던 @ref{307,,urllib.request.urlopen()} 함수의 `cafile', `capath', `cadefault' 매개 변수가 제거되었습니다. 대신 @ref{357,,SSLContext} 인스턴스와 함께 `context' 매개 변수를 사용해주시기를 부탁드립니다. @ref{597,,ssl.SSLContext.load_cert_chain()} 함수를 사용함을 통해 특정 인증서를 로드하거나, @ref{480,,ssl.create_default_context()}가 운영 체제의 신뢰할 수 있는 인증 기관(CA) 인증서를 선택하도록 할 수 있습니다. (Victor Stinner가 gh-105382@footnote{https://github.com/python/cpython/issues/105382}를 통해 기능을 구현하였습니다.)
@end itemize

@node webbrowser<2>,,urllib<3>,제거된 모듈들과 API들
@anchor{whatsnew/3 13 webbrowser}@anchor{598}
@subsubsection webbrowser



@itemize *

@item 
테스트되지 않았고 문서화되지 않았던 @code{MacOSX} 클래스가 제거되었습니다. 해당하는 클래스는 파이썬 3.11에서 사용 지원 중단(deprecated)되었었습니다. 대신 파이썬 3.2에서 도입된 @code{MacOSXOSAScript} 클래스를 사용해주시기를 부탁드립니다. (Hugo van Kemenade가 gh-104804@footnote{https://github.com/python/cpython/issues/104804}를 통해 기능을 구현하였습니다.)

@item 
사용 지원이 중단(deprecated)된 @code{MacOSXOSAScript._name} 어트리뷰트가 제거되었습니다. 대신 @ref{599,,MacOSXOSAScript.name} 어트리뷰트를 사용해주시기를 부탁드립니다. (Nikita Sobolev가 gh-105546@footnote{https://github.com/python/cpython/issues/105546}를 통해 기능을 구현하였습니다.)
@end itemize

@node New Deprecations,CPython 바이트 코드 변경 사항,제거된 모듈들과 API들,파이썬 3 13의 새로운 기능에 대해 알아봅시다
@anchor{whatsnew/3 13 new-deprecations}@anchor{59a}
@subsection New Deprecations



@itemize *

@item 
@ref{59b,,사용자 정의 함수}:


@itemize *

@item 
새 코드 객체의 타입이 함수의 타입과 일치하지 않는 경우, 함수의 @ref{59c,,__code__} 어트리뷰트에 값을 대입하는 기능은 사용 지원이 중단(deprecated)되었습니다. 구분되는 타입은 다음과 같습니다: 일반 함수, 제너레이터, 비동기 제너레이터, 그리고 코루틴. (Irit Katriel이 gh-81137@footnote{https://github.com/python/cpython/issues/81137}을 통해 기능을 구현하였습니다.)
@end itemize

@item 
@ref{8,,array}:


@itemize *

@item 
런타임에서 @cite{‘u’} 형식 코드(@code{wchar_t})에 대한 사용 지원이 중단(deprecated)되었습니다. 해당하는 형식 코드는 파이썬 3.3 문서에서 사용 지원이 중단되었으며, 파이썬 3.16에서 제거될 예정입니다. 대신 유니코드 문자에는 @cite{‘w’} 형식 코드(@ref{33d,,Py_UCS4})를 사용해주시기를 부탁드립니다. (Hugo van Kemenade가 gh-80480@footnote{https://github.com/python/cpython/issues/80480}를 통해 기능을 구현하였습니다.)
@end itemize

@item 
@ref{2e,,ctypes}:


@itemize *

@item 
파이썬 3.15에서 제거될 예정인, 문서화되지 않은 @code{SetPointerType()} 함수에 대한 사용 지원을 중단(deprecate)합니다. (Victor Stinner가 gh-105733@footnote{https://github.com/python/cpython/issues/105733}를 통해 기능을 구현하였습니다.)

@item 
@cite{type * length} 곱셈 사용을 권장하기 위해 @ref{59d,,ARRAY()} 함수를 @ref{23d,,소프트 사용 지원 중단} 상태로 표시합니다. (Victor Stinner가 gh-105733@footnote{https://github.com/python/cpython/issues/105733}를 통해 기능을 구현하였습니다.)
@end itemize

@item 
@ref{3a,,decimal}:


@itemize *

@item 
Deprecate the non-standard and undocumented @ref{1fe,,Decimal}
format specifier @code{'N'},
which is only supported in the @code{decimal} module’s C implementation.
Scheduled to be removed in Python 3.18.
(Contributed by Serhiy Storchaka in gh-89902@footnote{https://github.com/python/cpython/issues/89902}.)
@end itemize

@item 
@ref{3c,,dis}:


@itemize *

@item 
@code{HAVE_ARGUMENT} 구분자에 대한 사용 지원을 중단(deprecate)합니다. 대신 @ref{59e,,hasarg}을 통해 포함 여부(membership)를 검사해주시기를 부탁드립니다. (Irit Katriel이 gh-109319@footnote{https://github.com/python/cpython/issues/109319}를 통해 기능을 구현하였습니다.)
@end itemize

@item 
@ref{67,,gettext}:


@itemize *

@item 
@code{gettext} 모듈에서 복수형을 고려하는 함수와 메서드에 정수가 아닌 수를 인수로 사용하는 경우에 대한 사용 지원을 중단(deprecate)합니다. (Serhiy Storchaka가 gh-88434@footnote{https://github.com/python/cpython/issues/88434}를 통해 기능을 구현하였습니다.)
@end itemize

@item 
@ref{68,,glob}:


@itemize *

@item 
문서화되지 않은 @code{glob0()} 및 @code{glob1()} 함수에 대한 사용 지원을 중단(deprecate)합니다. @ref{59f,,glob()}을 사용하고, 루트 디렉터리를 지정하는 @ref{5a0,,경로류 객체}를 `root_dir' 매개 변수로 대신 전달하세요. (Barney Gale이 gh-117337@footnote{https://github.com/python/cpython/issues/117337}를 통해 기능을 구현하였습니다.)
@end itemize

@item 
@ref{76,,http.server}:


@itemize *

@item 
@ref{325,,CGIHTTPRequestHandler} 클래스는 사용 지원 중단(deprecate)되었으며, Python 3.15에서 제거될 예정입니다. 프로세스 기반 CGI HTTP 서버는 오래전부터 사실상 사용되지 않고 있었습니다. 관련된 코드들은 오래되었을 뿐 아니라 더 이상 유지 보수되고 있지 않으며, 실제로 거의 사용되고 있지 않은 것으로 보입니다. 보안과 기능 모두에 있어 문제가 있으며 버그 발생 가능성이 매우 높습니다. (Gregory P. Smith가 gh-109096@footnote{https://github.com/python/cpython/issues/109096}를 통해 기능을 구현하였습니다.)

@item 
@code{python -m http.server} 명령 줄 인터페이스의 @code{--cgi} 플래그는 사용 지원 중단(deprecate)되었으며, Python 3.15에서 제거될 예정입니다. (Gregory P. Smith가 gh-109096@footnote{https://github.com/python/cpython/issues/109096}를 통해 기능을 구현하였습니다.)
@end itemize

@item 
@ref{93,,mimetypes}:


@itemize *

@item 
파일 경로 인수를 받는 @ref{516,,guess_type()} 호출은 @ref{23d,,소프트 사용 지원 중단} 처리되었습니다. 대신 @code{ (Serhiy Storchaka가 :gh:`66543()}를 통해 기능을 구현하였습니다.)
@end itemize

@item 
@ref{be,,re}:


@itemize *

@item 
모듈 수준의 @ref{5a1,,split()}, @ref{5a2,,sub()}, @ref{5a3,,subn()} 함수들에 선택적 인자인 `maxsplit', `count', `flags'를 위치 인자로 전달하는 방식이 사용 지원 중단(deprecate)되었습니다. 관련 매개 변수들은 향후 Python 버전에서 @ref{5a4,,키워드 전용} 매개 변수로 변경될 예정입니다. (Serhiy Storchaka가 gh-56166@footnote{https://github.com/python/cpython/issues/56166}를 통해 기능을 구현하였습니다.)
@end itemize

@item 
@ref{a8,,pathlib}:


@itemize *

@item 
@ref{32a,,PurePath.is_reserved()}는 사용 지원 중단(deprecated)되었으며, 파이썬 3.15에서 제거될 것입니다. 윈도우에서 예약된 경로를 감지하려면 @ref{32b,,os.path.isreserved()}를 사용해주시기를 부탁드립니다. (Barney Gale이 gh-88569@footnote{https://github.com/python/cpython/issues/88569}를 통해 기능을 구현하였습니다.)
@end itemize

@item 
@ref{af,,platform}:


@itemize *

@item 
@ref{32c,,java_ver()}는 사용 지원 중단(deprecated)되었으며, 파이썬 3.15에서 제거될 것입니다. 해당하는 함수는 Jython 지원에만 유용할 수 있는 것으로 보이며, API가 혼란스럽고, 대부분의 경우 테스트되지 않았습니다. (Nikita Sobolev가 gh-116349@footnote{https://github.com/python/cpython/issues/116349}를 통해 기능을 구현하였습니다.)
@end itemize

@item 
@ref{ba,,pydoc}:


@itemize *

@item 
문서화되지 않은 @code{ispackage()} 함수는 이제 사용 지원 중단(deprecated)되었습니다.
@end itemize

@item 
@ref{d4,,sqlite3}:


@itemize *

@item 
@ref{5a5,,connect()} 함수와 @ref{54c,,Connection} 생성자에 두 개 이상의 위치 인자를 전달하는 방식이 이제 사용 지원 중단(deprecated)되었습니다. 이외의 매개변수들은 파이썬 3.15부터 키워드 전용 매개변수로 사용 가능합니다. (Erlend E. Aasland가 gh-107948@footnote{https://github.com/python/cpython/issues/107948}를 통해 기능을 구현하였습니다.)

@item 
@ref{5a6,,Connection.create_function()}과 @ref{5a7,,Connection.create_aggregate()}에 이름, 인자의 개수, 호출 가능한 객체(callable)을 키워드 인자로 전달하는 방식이 이제 사용 지원 중단(deprecated)되었습니다. 해당하는 매개변수들은 파이썬 3.15부터 위치 전용 매개변수로 사용 가능합니다. (Erlend E. Aasland가 gh-108278@footnote{https://github.com/python/cpython/issues/108278}를 통해 기능을 구현하였습니다.)

@item 
@ref{54c,,Connection} 의 @ref{5a8,,set_authorizer()}, @ref{5a9,,set_progress_handler()}, @ref{5aa,,set_trace_callback()} 메서드에서 콜백 호출 가능한 객체(callback callable)들을 키워드 인자로 전달하는 동작이 사용 지원 중단(deprecated)되었습니다. 콜백 호출 가능한 객체(callback callable)의 경우 파이썬 3.15부터는 위치 전용 인자로만 전달할 수 있습니다. (Erlend E. Aasland가 gh-108278@footnote{https://github.com/python/cpython/issues/108278}를 통해 기능을 구현하였습니다.)
@end itemize

@item 
@ref{df,,sys}:


@itemize *

@item 
@ref{33e,,_enablelegacywindowsfsencoding()} 함수를 사용 지원 중단(deprecate)하였습니다. 파이썬 3.16에서 제거될 예정입니다. 대신 
@geindex PYTHONLEGACYWINDOWSFSENCODING
@geindex 환경 변수; PYTHONLEGACYWINDOWSFSENCODING
@ref{33f,,PYTHONLEGACYWINDOWSFSENCODING} 환경 변수를 사용해주시기를 부탁드립니다. (Inada Naoki가 gh-73427@footnote{https://github.com/python/cpython/issues/73427}을 통해 기능을 구현하였습니다.)
@end itemize

@item 
@ref{e4,,tarfile}:


@itemize *

@item 
문서화되지 않았으며 사용되지 않고 있는 @code{TarFile.tarfile} 속성을 사용 지원 중단(deprecate)하고 파이썬 3.16에서 제거할 예정입니다. (gh-115256@footnote{https://github.com/python/cpython/issues/115256}를 통해 기능이 구현되었습니다.)
@end itemize

@item 
@ref{104,,traceback}:


@itemize *

@item 
@ref{563,,TracebackException.exc_type} 속성을 사용 지원 중단(deprecate)합니다. 대신 @ref{562,,TracebackException.exc_type_str}을 사용해주시기를 부탁드립니다. (Irit Katriel이 gh-112332@footnote{https://github.com/python/cpython/issues/112332}를 통해 기능을 구현하였습니다.)
@end itemize

@item 
@ref{10a,,typing}:


@itemize *

@item 
문서화되지 않은, @ref{331,,NamedTuple} 클래스를 만들 때에 사용되는 키워드 인자에 대한 구문 문법(syntax)을 사용 지원 중단(deprecate)합니다. 예를 들어, @code{Point = NamedTuple(\"Point"\, x=int, y=int)} 같은 구문은 파이썬 3.15에서 제거될 예정입니다. 대신 관련된 클래스에 대한 혹은 관련된 함수형 구문 문법(syntax)을 사용해주시기를 부탁드립니다. (Alex Waygood가 gh-105566@footnote{https://github.com/python/cpython/issues/105566}를 통해 기능을 구현하였습니다.)

@item 
@ref{331,,NamedTuple} 또는 @ref{332,,typing.TypedDict} 클래스를 만들 때 `fields' 매개변수를 생략하는 것과, 두 가지의 타입 모두에 있어 `fields' 매개변수에 @code{None}을 전달하는 방식의 사용이 사용 지원 중단(deprecate)되었습니다. 파이썬 3.15에서는 `fields' 매개 변수에 유효한 시퀀스를 반드시 지정해주셔야 합니다. 필드가 없는(zero field의) NamedTuple 클래스를 만들려면 @code{class NT(NamedTuple): pass}이나 @code{NT = NamedTuple(\"NT\", ())}을 사용하십시오. 필드가 없는 TypedDict 클래스를 만들려면 @code{class TD(TypedDict): pass}또는 @code{TD = TypedDict(\"TD\", @{@})}를 사용해주시기를 부탁드립니다. (Alex Waygood가 gh-105566@footnote{https://github.com/python/cpython/issues/105566}와 gh-105570@footnote{https://github.com/python/cpython/issues/105570}를 통해 기능을 구현하였습니다.)

@item 
@ref{333,,typing.no_type_check_decorator()} 데코레이터 함수를 사용 지원 중단(deprecate)하였으며, 파이썬 3.15에서 제거할 예정입니다. @ref{10a,,typing} 모듈에 도입된 지 8년이 지났지만, 여전히 여러 인지도 있는 주요 정적 타입 검사기(type checker)도 이를 지원하지 않고 있습니다. (Alex Waygood이 gh-106309@footnote{https://github.com/python/cpython/issues/106309}를 통해 기능을 구현하였습니다.)

@item 
@ref{5ab,,typing.AnyStr}의 사용 지원이 중단되었습니다. 파이썬 3.16에서는 @code{typing.__all__}에 더 이상 포함되지 않도록 제거될 것입니다. 해당하는 코드를 임포트(import)하거나 액세스하면 런타임에 @ref{1a3,,DeprecationWarning}이 발생하게 될 것입니다. 파이썬 3.18에서 완전히 제거될 예정입니다. 대신 새로운 @ref{5ac,,타입 매개변수 구문}을 사용해주시기를 부탁드립니다. (Michael The가 gh-107116@footnote{https://github.com/python/cpython/issues/107116}를 통해 기능을 구현하였습니다.)
@end itemize

@item 
@ref{119,,wave}:


@itemize *

@item 
@ref{336,,Wave_read} 및 @ref{337,,Wave_write} 클래스에 있는 @ref{334,,getmark()}, @code{setmark()}, @ref{335,,getmarkers()} 메서드의 사용 지원이 중단(deprecated)되었으며, 파이썬 3.15에서 제거될 예정입니다. (Victor Stinner가 gh-105096@footnote{https://github.com/python/cpython/issues/105096}를 통해 기능을 구현하였습니다.)
@end itemize
@end itemize

@c Add deprecations above alphabetically, not here at the end.

@menu
* 파이썬 3.14에서 제거 예정인 항목들: 파이썬 3 14에서 제거 예정인 항목들. 
* 파이썬 3.15에서 제거 예정인 항목들: 파이썬 3 15에서 제거 예정인 항목들. 
* 파이썬 3.16에서 제거 예정인 항목들: 파이썬 3 16에서 제거 예정인 항목들. 
* 파이썬 3.17에서 제거 예정인 항목들: 파이썬 3 17에서 제거 예정인 항목들. 
* 파이썬 3.18에서 제거 예정인 항목들: 파이썬 3 18에서 제거 예정인 항목들. 
* Pending removal in Python 3.19: Pending removal in Python 3 19<2>. 
* 향후 보다 상위 버전의 제거 예정 항목들:: 

@end menu

@node 파이썬 3 14에서 제거 예정인 항목들,파이썬 3 15에서 제거 예정인 항목들,,New Deprecations
@anchor{whatsnew/3 13 pending-removal-in-python-3-14}@anchor{5ad}
@subsubsection 파이썬 3.14에서 제거 예정인 항목들



@itemize *

@item 
@ref{7,,argparse}: @code{argparse.BooleanOptionalAction}의 `type', `choices', `metavar' 매개변수의 사용 지원이 중단(deprecated)되었으며, 파이썬 3.14에서 제거될 예정입니다. (Nikita Sobolev가 gh-92248@footnote{https://github.com/python/cpython/issues/92248}을 통해 기능을 구현하였습니다.)

@item 
@ref{9,,ast}: 다음 기능들은 파이썬 3.8부터 문서상에서 사용 지원이 중단(deprecated)된 것으로 표시되었었습니다. 이제 실행 중에 접근하거나 사용하면 런타임에 @ref{1a3,,DeprecationWarning}이 발생합니다. 파이썬 3.14에서 제거될 예정입니다:


@itemize *

@item 
@code{ast.Num}

@item 
@code{ast.Str}

@item 
@code{ast.Bytes}

@item 
@code{ast.NameConstant}

@item 
@code{ast.Ellipsis}
@end itemize

대신 @ref{2ef,,ast.Constant}을 사용해주시기를 부탁드립니다. (Serhiy Storchaka가 gh-90953@footnote{https://github.com/python/cpython/issues/90953}을 통해 기능을 구현하였습니다.)

@item 
@ref{b,,asyncio}:


@itemize *

@item 
자식 관찰자 클래스(child watcher class)인 @code{asyncio.MultiLoopChildWatcher}, @code{asyncio.FastChildWatcher}, @code{asyncio.AbstractChildWatcher}, 그리고 @code{asyncio.SafeChildWatcher}는 사용 지원 중단(deprecated)되었으며 파이썬 3.14에서 제거될 예정입니다. (Kumar Aditya가 gh-94597@footnote{https://github.com/python/cpython/issues/94597}를 통해 기능을 구현하였습니다.)

@item 
@code{asyncio.set_child_watcher()}, @code{asyncio.get_child_watcher()}, @code{asyncio.AbstractEventLoopPolicy.set_child_watcher()}, 그리고 @code{asyncio.AbstractEventLoopPolicy.get_child_watcher()}는 사용 지원 중단(deprecated)되었으며 파이썬 3.14에서 제거될 예정입니다. (Kumar Aditya가 gh-94597@footnote{https://github.com/python/cpython/issues/94597}를 통해 기능을 구현하였습니다.)

@item 
이제, 기본 이벤트 루프 정책의 @ref{2f2,,get_event_loop()} 메서드는 이벤트 루프가 설정되어 있지 않아 새 루프를 생성하는 경우 @ref{1a3,,DeprecationWarning} 경고를 발생시킵니다. (Serhiy Storchaka가 gh-100160@footnote{https://github.com/python/cpython/issues/100160}를 통해 기능을 구현하였습니다.)
@end itemize

@item 
@ref{3f,,email}: @ref{2f7,,email.utils.localtime()}의 `isdst' 매개 변수 사용이 사용 지원 중단(deprecated)되었습니다. (Alan Williams가 gh-72346@footnote{https://github.com/python/cpython/issues/72346}를 통해 기능을 구현하였습니다.)

@item 
@ref{7c,,importlib.abc} 사용 지원 중단(deprecated)된 클래스들:


@itemize *

@item 
@code{importlib.abc.ResourceReader}

@item 
@code{importlib.abc.Traversable}

@item 
@code{importlib.abc.TraversableResources}
@end itemize

대신 다음과 같은 @ref{80,,importlib.resources.abc} 모듈의 클래스를 사용해주시기를 부탁드립니다:


@itemize *

@item 
@ref{2fa,,importlib.resources.abc.Traversable}

@item 
@ref{2f9,,importlib.resources.abc.TraversableResources}
@end itemize

(Jason R. Coombs와 Hugo van Kemenade가 gh-93963@footnote{https://github.com/python/cpython/issues/93963}를 통해 기능을 구현하였습니다.)

@item 
@ref{85,,itertools} 모듈은 copy, deepcopy, pickle 연산에 대해 문서화되지 않았었습니다. 또한, 과거로부터 계속, 비효율적이며, 버그가 많이 발견되며, 일관되지 않은 방식으로만 지원되어왔었습니다. 해당하는 모듈은 파이썬 3.14에서 제거될 예정이며, 이를 통해 많은 양의 코드 분량이 삭제될 것이며 유지 관리 부담이 크게 줄어들 것입니다. (Raymond Hettinger가 gh-101588@footnote{https://github.com/python/cpython/issues/101588}를 통해 기능을 구현하였습니다.)

@item 
@ref{98,,multiprocessing}: 현재 기본값이 @cite{‘fork’}인 리눅스, BSD 및 그 밖의 macOS 이외의 POSIX 플랫폼에서는 더 안전한 기본 시작 방법으로 변경될 예정입니다 (gh-84559@footnote{https://github.com/python/cpython/issues/84559}를 참고 부탁드립니다). 대부분의 코드 베이스 및 구성 요소들은 이와 관련 없을 것으로 예상욉니다. 때문에 실행 시간 경고를 추가하는 것은 불필요할 수 있다고 생각되었습니다. 코드에서 @cite{‘fork’}가 `필요'한 경우에만 @ref{24a,,get_context()} 혹은 @ref{24b,,set_start_method()} API를 통해 명시적으로 지정해주시기를 부탁드립니다. 보다 자세한 내용의 경우 @ref{1d5,,컨텍스트 및 시작 방법}를 참고 부탁드립니다.

@item 
@ref{a8,,pathlib}: @ref{2fe,,is_relative_to()} 및 @ref{2fd,,relative_to()}에 추가 인자를 전달하는 것은 사용 지원 중단(deprecated) 되었습니다.

@item 
@ref{ae,,pkgutil}: @code{pkgutil.find_loader()} 및 @code{pkgutil.get_loader()}는 이제 @ref{1a3,,DeprecationWarning}을 발생시킵니다. 대신 @ref{5ae,,importlib.util.find_spec()}를 사용해주시기를 부탁드립니다. (Nikita Sobolev가 gh-97850@footnote{https://github.com/python/cpython/issues/97850}을 통해 기능을 구현하였습니다.)

@item 
@ref{b6,,pty}:


@itemize *

@item 
@cite{master_open()}대신 @ref{301,,pty.openpty()}를 사용해주시기를 부탁드립니다.

@item 
@cite{slave_open()}대신 @ref{301,,pty.openpty()}를 사용해주시기를 부탁드립니다.
@end itemize

@item 
@ref{d4,,sqlite3}:


@itemize *

@item 
@code{version} 그리고 @code{version_info}.

@item 
@ref{5af,,execute()} 및 @ref{5b0,,executemany()}에서 @ref{5b1,,이름있는 자리 표시자(named placeholders)}를 사용하고 `매개변수' 가 @ref{183,,dict}가 아니라 시퀀스인 경우.
@end itemize

@item 
@ref{10e,,urllib}: @code{urllib.parse.Quoter} 클래스는 사용 지원 중단(deprecated)되었습니다. 해당하는 클래스는 공개 API로 제공할 의도로 작성된 것이 아니었습니다. (Gregory P. Smith가 gh-88168@footnote{https://github.com/python/cpython/issues/88168}를 통해 기능을 구현하였습니다.)
@end itemize

@node 파이썬 3 15에서 제거 예정인 항목들,파이썬 3 16에서 제거 예정인 항목들,파이썬 3 14에서 제거 예정인 항목들,New Deprecations
@anchor{whatsnew/3 13 pending-removal-in-python-3-15}@anchor{5b2}
@subsubsection 파이썬 3.15에서 제거 예정인 항목들



@itemize *

@item 
임포트 시스템:


@itemize *

@item 
모듈에 @ref{321,,__cached__}를 설정하면서 @ref{322,,__spec__.cached}를 설정하지 않는 동작은 사용 지원 중단(deprecated)되었습니다. 파이썬 3.15부터는 @code{__cached__} 어트리뷰트가 임포트 시스템이나 표준 라이브러리에서 더 이상 설정 혹은 고려되지 않습니다. (gh-97879@footnote{https://github.com/python/cpython/issues/97879}를 참고 부탁드립니다.)

@item 
모듈에 @ref{323,,__package__}를 설정하는 동시에 @ref{324,,__spec__.parent}를 설정하지 않는 방식의 사용은 사용 지원 중단(deprecated)되었습니다. 파이썬 3.15부터는 @code{__package__} 어트리뷰트가 임포트 시스템이나 표준 라이브러리에서 더 이상 설정 혹은 고려되지 않습니다. (gh-97879@footnote{https://github.com/python/cpython/issues/97879}를 참고 부탁드립니다.)
@end itemize

@item 
@ref{2e,,ctypes}:


@itemize *

@item 
문서화되지 않았던 @code{ctypes.SetPointerType()} 함수는 파이썬 3.13부터 사용 지원 중단(deprecated)되었습니다.
@end itemize

@item 
@ref{76,,http.server}:


@itemize *

@item 
오랫동안 거의 사용되지 않았던 @ref{325,,CGIHTTPRequestHandler} 클래스는 파이썬 3.13부터 사용 지원 중단(deprecated)되었습니다. 직접적인 대체 수단은 없으나, 그 `어떤' 종류의 요청 처리를 수행하는 웹 서버 인터페이스도 CGI를 사용하는 것에 비해서는 보다 바람직하다는 점에 대해 유의 부탁드리고자 합니다.

@item 
@code{python -m http.server} 명령줄 인터페이스의 @code{--cgi} 플래그는 파이썬 3.13부터 사용 지원 중단(deprecated)되었습니다.
@end itemize

@item 
@ref{7b,,importlib}:


@itemize *

@item 
@cite{load_module()} 메서드: 대신 @cite{exec_module()}을 사용해주시기를 부탁드립니다.
@end itemize

@item 
@ref{8a,,locale}:


@itemize *

@item 
@ref{326,,getdefaultlocale()} 함수는 파이썬 3.11부터 사용 지원 중단(deprecated)되었습니다. 해당하는 함수는 파이썬 3.13(gh-90817@footnote{https://github.com/python/cpython/issues/90817})에서 제거될 예정이었으나, 파이썬 3.15로 제거의 일정이 연기되었습니다. 대신 @ref{327,,getlocale()}, @ref{328,,setlocale()}, 그리고 @ref{329,,getencoding()}를 사용해주시기를 부탁드립니다. (Hugo van Kemenade가 gh-111187@footnote{https://github.com/python/cpython/issues/111187}를 통해 기능을 구현하였습니다.)
@end itemize

@item 
@ref{a8,,pathlib}:


@itemize *

@item 
@ref{32a,,PurePath.is_reserved()}는 파이썬 3.13부터 사용 지원 중단(deprecated)되었습니다. 윈도우에서 예약된 경로를 파악하기 위해서는 @ref{32b,,os.path.isreserved()}를 사용해주시기를 부탁드립니다.
@end itemize

@item 
@ref{af,,platform}:


@itemize *

@item 
@ref{32c,,java_ver()}는 파이썬 3.13부터 사용 지원 중단(deprecated)되었습니다. 해당하는 함수는 Jython의 지원에만 유용할 수 있고, API가 혼란스럽고, 대부분의 경우에 대해 테스트되지 않았습니다.
@end itemize

@item 
@ref{e1,,sysconfig}:


@itemize *

@item 
@ref{32d,,sysconfig.is_python_build()}의 `check_home' 인자는 파이썬 3.12부터 폐지되었습니다.
@end itemize

@item 
@ref{f3,,threading}:


@itemize *

@item 
@ref{32e,,RLock()} will take no arguments in Python 3.15.
Passing any arguments has been deprecated since Python 3.14,
as the Python version does not permit any arguments,
but the C version allows any number of positional or keyword arguments,
ignoring every argument.
@end itemize

@item 
@ref{109,,types}:


@itemize *

@item 
@ref{32f,,types.CodeType}: @ref{330,,co_lnotab}에 대한 접근은 
@geindex Python 향상 제안; PEP 626
PEP 626@footnote{https://peps.python.org/pep-0626/}을 통해 3.10부터 사용 지원 중단(deprecated)되었고 3.12에서 제거될 예정이었습니다만, 3.12에서 @ref{1a3,,DeprecationWarning}이 추가되었습니다. 3.15에서 제거될 수 있습니다. (Nikita Sobolev가 gh-101866@footnote{https://github.com/python/cpython/issues/101866}를 통해 기능을 구현하였습니다.)
@end itemize

@item 
@ref{10a,,typing}:


@itemize *

@item 
@ref{331,,NamedTuple} 클래스를 생성할 때 사용하는 키워드 인자 문법(예를 들어, @code{Point = NamedTuple(\"Point\", x=int, y=int)})은 Python 3.13부터 사용 지원 중단(deprecated)되었습니다. 해당하는 문법은 문서화되어 있지 않았습니다. 대신 클래스 기반 구문 문법(syntax)이나 함수형 구문 문법(syntax)을 사용해주시기를 부탁드립니다.

@item 
@ref{332,,TypedDict}의 함수형 문법을 사용할 때 @code{TD = TypedDict("TD")}와 같이 `fields' 매개변수에 값을 전달하지 않거나, @code{TD = TypedDict("TD", None)}와 같이 @cite{None}을 전달하는 방식은 파이썬 3.13부터 사용 지원이 중단(deprecated)되었습니다. 필드가 없는 (zero-field의) TypedDict를 만들려면 @code{class TD(TypedDict): pass}나 @code{TD = TypedDict("TD", @{@})}를 사용해주시기를 부탁드립니다.

@item 
@ref{333,,typing.no_type_check_decorator()} 데코레이터 함수는 파이썬 3.13부터 사용 지원이 중단(deprecated)되었습니다. @ref{10a,,typing} 모듈에 추가된 지 8년이 지났었으나, 아직까지 어떤 주요 정적 타입 검사기(type checker)도 해당하는 함수를 지원하지 않았었습니다.
@end itemize

@item 
@ref{119,,wave}:


@itemize *

@item 
@ref{336,,Wave_read}와 @ref{337,,Wave_write} 클래스들의 @ref{334,,getmark()}, @code{setmark()}, 그리고 @ref{335,,getmarkers()} 메서드들은 파이썬 3.13부터 사용 지원 중단(deprecated) 되었습니다.
@end itemize

@item 
@ref{138,,zipimport}:


@itemize *

@item 
@ref{338,,load_module()} 메서드는 파이썬 3.10부터 사용 지원 중단(deprecated)되었습니다. 대신 @ref{339,,exec_module()}를 사용해주시기를 부탁드립니다. (Jiahao Li가 gh-125746@footnote{https://github.com/python/cpython/issues/125746}를 통해 기능을 구현하였습니다.)
@end itemize
@end itemize

@node 파이썬 3 16에서 제거 예정인 항목들,파이썬 3 17에서 제거 예정인 항목들,파이썬 3 15에서 제거 예정인 항목들,New Deprecations
@anchor{whatsnew/3 13 pending-removal-in-python-3-16}@anchor{5b3}
@subsubsection 파이썬 3.16에서 제거 예정인 항목들



@itemize *

@item 
임포트 시스템:


@itemize *

@item 
모듈에 @ref{33b,,__loader__}를 설정하면서 @ref{33c,,__spec__.loader}를 설정하지 않는 방식의 사용에 대한 사용 지원이 중단(deprecated)되었습니다. 파이썬 3.16부터는 임포트 시스템과 표준 라이브러리가 @code{__loader__}를 설정 혹은 참조하지 않습니다.
@end itemize

@item 
@ref{8,,array}:


@itemize *

@item 
@code{'u'} 포맷 코드(@code{wchar_t})는 문서에서는 파이썬 3.3부터, 런타임에서는 파이썬 3.13부터 사용 지원이 중단(deprecated)되었습니다. 유니코드 문자에는 대신 @code{'w'} 포맷 코드(@ref{33d,,Py_UCS4})를 사용해주시기를 부탁드립니다.
@end itemize

@item 
@ref{b,,asyncio}:


@itemize *

@item 
@code{asyncio.iscoroutinefunction()} 함수는 사용 지원이 중단(deprecated)되었으며 파이썬 3.16에서 제거될 예정입니다. 대신 @ref{30d,,inspect.iscoroutinefunction()}을 사용해주시기를 부탁드립니다. (Jiahao Li와 Kumar Aditya가 gh-122875@footnote{https://github.com/python/cpython/issues/122875}를 통해 기능을 구현하였습니다.)

@item 
@ref{b,,asyncio} 정책 시스템은 사용 지원이 중단(deprecated)되었으며 파이썬 3.16에서 제거될 예정입니다. 다음 클래스와 함수의 사용 지원이 중단(deprecated)되었음에 유의해주십사 부탁드립니다:


@itemize *

@item 
@ref{30e,,asyncio.AbstractEventLoopPolicy}

@item 
@ref{30f,,asyncio.DefaultEventLoopPolicy}

@item 
@ref{310,,asyncio.WindowsSelectorEventLoopPolicy}

@item 
@ref{311,,asyncio.WindowsProactorEventLoopPolicy}

@item 
@ref{312,,asyncio.get_event_loop_policy()}

@item 
@ref{313,,asyncio.set_event_loop_policy()}
@end itemize

사용자는 원하는 이벤트 루프 구현을 사용하기 위해 @ref{2f3,,asyncio.run()} 또는 @ref{2f5,,asyncio.Runner}와 `loop_factory'를 함께 사용해야 합니다.

예를 들어, 윈도우에서 @ref{314,,asyncio.SelectorEventLoop}을 사용하기 위해:

@example
import asyncio

async def main():
    ...

asyncio.run(main(), loop_factory=asyncio.SelectorEventLoop)
@end example

(Kumar Aditya가 gh-127949@footnote{https://github.com/python/cpython/issues/127949}를 통해 기여하였습니다.)
@end itemize

@item 
@ref{13,,builtins}:


@itemize *

@item 
논리(boolean) 타입에서의 비트별 반전 연산인 @cite{~True} 또는 @cite{~False}는 직관적이지 않은 결과인(@cite{-2}, @cite{-1})를 출력하기 때문에 파이썬 3.12부터 사용 지원이 중단(deprecated)되었습니다. 논리(boolean) 값의 논리적 부정을 위해서는 대신 @cite{not x}를 사용해주시기를 부탁드립니다. 정수 값의 비트별 반전이 실제로 필요한 몇 안되는 경우에 대한 필요에 있어서는, 명시적으로 @cite{int}로 변환한 뒤 @cite{~int(x)}를 사용해주시기를 부탁드립니다.
@end itemize

@item 
@ref{63,,functools}:


@itemize *

@item 
파이썬 구현인 @ref{21a,,functools.reduce()} 함수에서 `function' 또는 `sequence'를 키워드 인자로 사용하는 것은 파이썬 3.14부터 사용 지원 중단(deprecated)되었습니다.
@end itemize

@item 
@ref{8b,,logging}:

사용자 정의 로깅 처리기(custom logging handlers)의 `strm' 인자를 받는 방식의 사용은 사용 지원 중단(deprecated)되었으며 파이썬 3.16에서 제거될 예정입니다. 대신 `stream' 인자를 사용하여 처리기를 정의하는 방식으로 사용해주시기를 부탁드립니다. (Mariusz Felisiak가 gh-115032@footnote{https://github.com/python/cpython/issues/115032}를 통해 기능을 구현하였습니다.)

@item 
@ref{93,,mimetypes}:


@itemize *

@item 
@ref{319,,mimetypes.MimeTypes.add_type()}에서 유효한 확장자는 @cite{.}으로 시작하거나 빈 문자열이어야 합니다. 점으로 시작하지 않는 확장자는 사용 지원 중단(deprecated)되었으며, 파이썬 3.16에서는 @ref{2ec,,ValueError}를 발생시킵니다. (Hugo van Kemenade가 gh-75223@footnote{https://github.com/python/cpython/issues/75223}를 통해 기능을 구현하였습니다.)
@end itemize

@item 
@ref{ca,,shutil}:


@itemize *

@item 
@code{ExecError} 예외가 파이썬 3.14부터 사용 지원 중단(deprecated)되었습니다. 파이썬 3.4 이후로는 @code{shutil} 모듈의 어떤 함수에서도 사용되지 않았으며, 이제는 @ref{244,,RuntimeError}의 다른 이름(alias)으로 간주됩니다.
@end itemize

@item 
@ref{de,,symtable}:


@itemize *

@item 
@ref{31d,,Class.get_methods} 메서드는 파이썬 3.14부터 사용 지원 중단(deprecated)되었습니다.
@end itemize

@item 
@ref{df,,sys}:


@itemize *

@item 
@ref{33e,,_enablelegacywindowsfsencoding()} 함수는 파이썬 3.13부터 사용 지원 중단(deprecated)되었습니다. 대신 
@geindex PYTHONLEGACYWINDOWSFSENCODING
@geindex 환경 변수; PYTHONLEGACYWINDOWSFSENCODING
@ref{33f,,PYTHONLEGACYWINDOWSFSENCODING} 환경 변수를 사용해주시기를 부탁드립니다.
@end itemize

@item 
@ref{e1,,sysconfig}:


@itemize *

@item 
@code{sysconfig.expand_makefile_vars()} 함수는 파이썬 3.14부터 사용 지원 중단(deprecated)되었습니다. 대신 @ref{340,,sysconfig.get_paths()} 의 @cite{vars} 인자를 사용해주시기를 부탁드립니다.
@end itemize

@item 
@ref{e4,,tarfile}:


@itemize *

@item 
문서화되지도 사용되지도 않고 있는 @code{TarFile.tarfile} 어트리뷰트는 파이썬 3.13부터 사용 지원 중단(deprecated)되었습니다.
@end itemize
@end itemize

@node 파이썬 3 17에서 제거 예정인 항목들,파이썬 3 18에서 제거 예정인 항목들,파이썬 3 16에서 제거 예정인 항목들,New Deprecations
@anchor{whatsnew/3 13 pending-removal-in-python-3-17}@anchor{5b4}
@subsubsection 파이썬 3.17에서 제거 예정인 항목들



@itemize *

@item 
@ref{1f,,collections.abc}:


@itemize -

@item 
@ref{342,,collections.abc.ByteString}은 파이썬 3.17에서 제거될 예정입니다.

실행 시간에 특정 @code{obj}가 @ref{260,,버퍼 프로토콜}을 활용하는지 확인하려면 @code{isinstance(obj, collections.abc.Buffer)}를 사용해주시기를 부탁드립니다. 타입 어노테이션(type annotation)에서 사용하시기를 원하는 경우 @ref{343,,Buffer}를 사용하거나, 코드에서 지원하는 타입을 명시적으로 지정한 유니언(예를 들어, @cite{bytes | bytearray | memoryview})을 사용해주시기를 부탁드립니다.

@code{ByteString}은 원래 @ref{192,,bytes}와 @ref{344,,bytearray} 두 경우 모두에 있어 상위 타입으로 동작하는 추상 클래스로 설계되었습니다. 그러나 ABC에는 관련된 메서드가 전혀 없었기 때문에, 어떤 객체가 @code{ByteString} 인스턴스라는 사실을 알아도 그 객체에 대해 실제로 유용한 정보를 얻을 수 없었습니다. @ref{165,,memoryview}와 같은 다른 보다 일반적인 버퍼 타입들도, 런타임에서 혹은 정적 타입 검사기(type checker)에서 @code{ByteString}의 하위 타입으로 취급된 적이 없습니다.

보다 자세한 내용은 
@geindex Python 향상 제안; PEP 688#current-options
PEP 688@footnote{https://peps.python.org/pep-0688/#current-options}을 참고해주시기를 부탁드립니다. (Shantanu Jain이 gh-91896@footnote{https://github.com/python/cpython/issues/91896}를 통해 기능을 구현하였습니다.)
@end itemize

@item 
@ref{10a,,typing}:


@itemize -

@item 
파이썬 3.14 이전에는 이전 스타일의 유니언(old-style union)이 비공개(private) 클래스 @cite{typing._UnionGenericAlias}를 사용해 구현되었습니다. 해당하는 클래스는 더 이상 관련된 구체적인 구현에 필요하지는 않지만 하위 호환성을 위해 유지되고 있습니다. 파이썬 3.17에서 제거될 예정입니다. 관련된 사용을 하실 경우, 문서화가 지원되는 관련 분석 도구들인 @ref{2ab,,typing.get_origin()}과 @ref{2ac,,typing.get_args()} 등을 보다 적극적으로 활용해주시기를 부탁드립니다.

@item 
@ref{345,,typing.ByteString}는 파이썬 3.9부터 사용 지원 중단(deprecated)되었으며 파이썬 3.17에서 제거될 예정입니다.

실행 시간에 특정 @code{obj}가 @ref{260,,버퍼 프로토콜}을 활용하는지 확인하려면 @code{isinstance(obj, collections.abc.Buffer)}를 사용해주시기를 부탁드립니다. 타입 어노테이션(type annotation)에서 사용하시기를 원하는 경우 @ref{343,,Buffer}를 사용하거나, 코드에서 지원하는 타입을 명시적으로 지정한 유니언(예를 들어, @cite{bytes | bytearray | memoryview})을 사용해주시기를 부탁드립니다.

@code{ByteString}은 원래 @ref{192,,bytes}와 @ref{344,,bytearray} 두 경우 모두에 있어 상위 타입으로 동작하는 추상 클래스로 설계되었습니다. 그러나 ABC에는 관련된 메서드가 전혀 없었기 때문에, 어떤 객체가 @code{ByteString} 인스턴스라는 사실을 알아도 그 객체에 대해 실제로 유용한 정보를 얻을 수 없었습니다. @ref{165,,memoryview}와 같은 다른 보다 일반적인 버퍼 타입들도, 런타임에서 혹은 정적 타입 검사기(type checker)에서 @code{ByteString}의 하위 타입으로 취급된 적이 없습니다.

보다 자세한 내용은 
@geindex Python 향상 제안; PEP 688#current-options
PEP 688@footnote{https://peps.python.org/pep-0688/#current-options}을 참고해주시기를 부탁드립니다. (Shantanu Jain이 gh-91896@footnote{https://github.com/python/cpython/issues/91896}를 통해 기능을 구현하였습니다.)
@end itemize
@end itemize

@node 파이썬 3 18에서 제거 예정인 항목들,Pending removal in Python 3 19<2>,파이썬 3 17에서 제거 예정인 항목들,New Deprecations
@anchor{whatsnew/3 13 pending-removal-in-python-3-18}@anchor{5b5}
@subsubsection 파이썬 3.18에서 제거 예정인 항목들



@itemize *

@item 
@ref{3a,,decimal}:


@itemize *

@item 
The non-standard and undocumented @ref{1fe,,Decimal} format
specifier @code{'N'}, which is only supported in the @code{decimal} module’s
C implementation, has been deprecated since Python 3.13.
(Contributed by Serhiy Storchaka in gh-89902@footnote{https://github.com/python/cpython/issues/89902}.)
@end itemize
@end itemize

@node Pending removal in Python 3 19<2>,향후 보다 상위 버전의 제거 예정 항목들,파이썬 3 18에서 제거 예정인 항목들,New Deprecations
@anchor{whatsnew/3 13 pending-removal-in-python-3-19}@anchor{5b6}
@subsubsection Pending removal in Python 3.19



@itemize *

@item 
@ref{2e,,ctypes}:


@itemize *

@item 
Implicitly switching to the MSVC-compatible struct layout by setting
@ref{317,,_pack_} but not @ref{1e7,,_layout_}
on non-Windows platforms.
@end itemize
@end itemize

@node 향후 보다 상위 버전의 제거 예정 항목들,,Pending removal in Python 3 19<2>,New Deprecations
@anchor{whatsnew/3 13 pending-removal-in-future-versions}@anchor{5b7}
@subsubsection 향후 보다 상위 버전의 제거 예정 항목들


다음의 API들은 향후 버전에서 제거될 예정이지만, 구체적인 제거 시점이 아직 정해지지는 않았습니다.


@itemize *

@item 
@ref{7,,argparse}:


@itemize *

@item 
인자 그룹과 상호 배타적 인자 그룹을 중첩해서 사용하는 기능은 사용 지원 중단(deprecated)되었습니다.

@item 
문서화되지 않은 키워드 인자 `prefix_chars'를 @ref{2eb,,add_argument_group()}에 전달하는 방식의 사용이 사용 지원 중단(deprecated)되었습니다.

@item 
@ref{30c,,argparse.FileType} 타입 변환기(type converter)가 사용 지원 중단(deprecated)되었습니다.
@end itemize

@item 
@ref{13,,builtins}:


@itemize *

@item 
제너레이터에서 @cite{throw(type@comma{} exc@comma{} tb)} 및 @cite{athrow(type@comma{} exc@comma{} tb)} 시그니처는 사용 지원 중단(deprecated)되었습니다. 대신 단일 인자 시그니처인 @cite{throw(exc)}와 @cite{athrow(exc)}를 사용해주시기를 부탁드립니다.

@item 
현재 파이썬은 숫자 리터럴 바로 뒤에 키워드가 오는 방식의 표현을 허용합니다. 예를 들어, @code{0in x}, @code{1or x}, @code{0if 1else 2}와 같은 표현이 허용됩니다. 이로 인해, @cite{[0x1for x in y]}처럼 혼란스럽거나 모호한 종류의 표현도 허용됩니다. 해당하는 예시의 표현은 @code{[0x1 for x in y]} 또는 @code{[0x1f or x in y]}로 해석될 수 있습니다. 숫자 리터럴 바로 뒤에 @ref{349,,and}, @ref{17c,,else}, @ref{34a,,for}, @ref{181,,if}, @ref{34b,,in}, @ref{34c,,is}, @ref{34d,,or} 중 하나의 키워드가 오는 경우 구문 경고가 발생합니다. 향후 릴리스에서는 이것이 문법 에러로 간주될 예정입니다. (보다 자세한 내용의 경우 gh-87999@footnote{https://github.com/python/cpython/issues/87999}를 참고 부탁드립니다.)

@item 
@code{__index__()} 및 @code{__int__()} 메서드가 정수가 아닌 타입을 반환하는 방식의 사용은 사용 지원 중단(deprecated)되었습니다. 대신 해당하는 메서드는 @ref{19b,,int}의 실제 하위 클래스(strict subclass) 인스턴스를 반환하는 방식으로 사용해주시기를 부탁드립니다.

@item 
@code{__float__()} 메서드가 @ref{196,,float}의 실제 하위 클래스(strict subclass)를 반환하는 방식의 사용은 사용 지원 중단(deprecated)되었습니다. 이제 해당하는 메서드는 @code{float} 인스턴스를 반환하는 방식으로 사용해주시기를 부탁드립니다.

@item 
@cite{__complex__()} 메서드가 @ref{197,,complex}의 실제 하위 클래스(strict subclass)를 반환하는 방식의 사용은 사용 지원 중단(deprecated)되었습니다. 이제 해당하는 메서드는 @code{complex} 인스턴스를 반환하는 방식으로 사용해주시기를 부탁드립니다.

@item 
복소수를 @ref{197,,complex()} 생성자의 `real' 또는 `imag' 인자로 전달하는 것은 이제 사용 지원이 중단(deprecated)되었으며, 복소수는 하나의 위치 인자로만 전달해주시기를 부탁드립니다. (Serhiy Storchaka가 gh-109218@footnote{https://github.com/python/cpython/issues/109218}를 통해 기능을 구현하였습니다.)
@end itemize

@item 
@ref{15,,calendar}: @cite{calendar.January}와 @cite{calendar.February} 상수는 사용 지원이 중단(deprecated)되었으며, 대신 @ref{34e,,calendar.JANUARY} 와 @ref{34f,,calendar.FEBRUARY} 를 사용해주시기를 부탁드립니다. (Prince Roshan이 gh-103636@footnote{https://github.com/python/cpython/issues/103636}를 통해 기능을 구현하였습니다.)

@item 
@ref{1c,,codecs}: @ref{315,,codecs.open()} 대신 @ref{316,,open()}을 사용하십시오. (보다 자세한 내용의 경우 gh-133038@footnote{https://github.com/python/cpython/issues/133038}를 참고 부탁드립니다.)

@item 
@ref{330,,codeobject.co_lnotab} 대신 @ref{350,,codeobject.co_lines()} 메서드를 사용해주시기를 부탁드립니다.

@item 
@ref{34,,datetime}:


@itemize *

@item 
@ref{351,,utcnow()}: 대신 @code{datetime.datetime.now(tz=datetime.UTC)} 메서드를 사용해주시기를 부탁드립니다.

@item 
@ref{352,,utcfromtimestamp()}:
use @code{datetime.datetime.fromtimestamp(timestamp, tz=datetime.UTC)}.
@end itemize

@item 
@ref{67,,gettext}: 복수형 값(plural value)은 정수여야 합니다.

@item 
@ref{7b,,importlib}:


@itemize *

@item 
@ref{353,,cache_from_source()} 의 `debug_override' 매개 변수는 사용 지원 중단(deprecated)되었습니다. 대신 `optimization' 매개 변수를 사용해주시기를 부탁드립니다.
@end itemize

@item 
@ref{7e,,importlib.metadata}:


@itemize *

@item 
@code{EntryPoints} 튜플 인터페이스.

@item 
반환 값의 암시적 @code{None}.
@end itemize

@item 
@ref{8b,,logging}: @code{warn()} 메서드는 파이썬 3.3부터 사용 지원 중단(deprecated) 되었습니다. 대신 @ref{354,,warning()}을 사용해주시기를 부탁드립니다.

@item 
@ref{8f,,mailbox}: StringIO 입력과 텍스트 모드 사용은 사용 지원 중단(deprecated) 되었습니다. 대신 @cite{BytesIO} 와 바이너리 모드를 사용해주시기를 부탁드립니다.

@item 
@ref{a5,,os}: 다중 스레드 프로세스에서 @ref{355,,os.register_at_fork()}를 호출하는 것은 사용 지원 중단(deprecated) 되었습니다.

@item 
@code{pydoc.ErrorDuringImport}: `exc_info' 매개 변수에 튜플 값을 사용하는 것은 사용 지원 중단(deprecated) 되었습니다. 대신 예외 인스턴스를 사용해주시기를 부탁드립니다.

@item 
@ref{be,,re}: 정규식의 숫자 그룹 참조와 그룹 이름에 보다 더 엄격한 규칙이 적용됩니다. 숫자 참조에는 ASCII 숫자 시퀀스만 허용됩니다. 바이트 패턴과 치환 문자열에서 사용되는 그룹 이름에는 이제 ASCII 영문자, 숫자, 밑줄(@cite{_})만 포함될 수 있습니다. (Serhiy Storchaka가 gh-91760@footnote{https://github.com/python/cpython/issues/91760}를 통해 기능을 구현하였습니다.)

@item 
@code{sre_compile}, @code{sre_constants} and @code{sre_parse} modules.

@item 
@ref{ca,,shutil}: @ref{356,,rmtree()}의 `onerror' 매개변수는 파이썬 3.12에서 사용 지원이 중단(deprecated)되었습니다. 대신 `onexc' 매개변수를 사용해주시기를 부탁드립니다.

@item 
@ref{d5,,ssl} 옵션 및 프로토콜:


@itemize *

@item 
@ref{357,,ssl.SSLContext} 생성 시 프로토콜 인자를 지정하지 않는 방식은 사용 지원이 중단(deprecated)되었습니다.

@item 
@ref{357,,ssl.SSLContext}: @ref{358,,set_npn_protocols()} 그리고 @code{selected_npn_protocol()}은 사용 지원이 중단(deprecated)되었습니다. 대신 ALPN을 사용해주시기를 부탁드립니다.

@item 
@code{ssl.OP_NO_SSL*} options

@item 
@code{ssl.OP_NO_TLS*} options

@item 
@code{ssl.PROTOCOL_SSLv3}

@item 
@code{ssl.PROTOCOL_TLS}

@item 
@code{ssl.PROTOCOL_TLSv1}

@item 
@code{ssl.PROTOCOL_TLSv1_1}

@item 
@code{ssl.PROTOCOL_TLSv1_2}

@item 
@code{ssl.TLSVersion.SSLv3}

@item 
@code{ssl.TLSVersion.TLSv1}

@item 
@code{ssl.TLSVersion.TLSv1_1}
@end itemize

@item 
@ref{f3,,threading} 메서드:


@itemize *

@item 
@code{threading.Condition.notifyAll()}: 대신 @ref{35e,,threading.current_thread()}를 사용해주시기를 부탁드립니다.

@item 
@code{threading.Event.isSet()}: 대신 @ref{35a,,is_set()}를 사용해주시기를 부탁드립니다.

@item 
@code{threading.Thread.isDaemon()}와 @ref{35b,,threading.Thread.setDaemon()}: 대신 @ref{35c,,threading.Thread.daemon} 어트리뷰트를 사용해주시기를 부탁드립니다.

@item 
@code{threading.Thread.getName()}와 @ref{35d,,threading.Thread.setName()}: 대신 @ref{2a0,,threading.Thread.name} 어트리뷰트를 사용해주시기를 부탁드립니다.

@item 
@code{threading.currentThread()}: 대신 @ref{35e,,threading.current_thread()}를 사용해주시기를 부탁드립니다.

@item 
@code{threading.activeCount()}: 대신 @ref{35f,,threading.active_count()}를 사용해주시기를 부탁드립니다.
@end itemize

@item 
@ref{360,,typing.Text} (gh-92332@footnote{https://github.com/python/cpython/issues/92332}).

@item 
내부 클래스 @cite{typing._UnionGenericAlias}는 @ref{2a8,,typing.Union} 구현에 있어 더 이상 사용되지 않습니다. 해당하는 비공개(private) 클래스를 사용하는 코드들과의 호환성을 유지하기 위해, 호환성을 위한 도구(shim)이 최소한 파이썬 3.17까지는 제공될 예정입니다. (Jelle Zijlstra가 gh-105499@footnote{https://github.com/python/cpython/issues/105499}를 통해 기능을 구현하였습니다.)

@item 
@ref{361,,unittest.IsolatedAsyncioTestCase}: 테스트 케이스에서 @code{None}이 아닌 값을 반환하는 방식의 사용은 사용 지원 중단(deprecated)되었습니다.

@item 
@ref{110,,urllib.parse}의 사용 지원 중단된 함수들: 대신 @ref{362,,urlparse()}를 사용해주시기를 부탁드립니다.


@itemize *

@item 
@code{splitattr()}

@item 
@code{splithost()}

@item 
@code{splitnport()}

@item 
@code{splitpasswd()}

@item 
@code{splitport()}

@item 
@code{splitquery()}

@item 
@code{splittag()}

@item 
@code{splittype()}

@item 
@code{splituser()}

@item 
@code{splitvalue()}

@item 
@code{to_bytes()}
@end itemize

@item 
@ref{11e,,wsgiref}: @cite{SimpleHandler.stdout.write()}는 부분 쓰기(partial write)를 수행하지 않아야 함을 유의해주십사 부탁드립니다.

@item 
@ref{12b,,xml.etree.ElementTree}: @ref{363,,Element}의 진리값(truth value)을 검사하는 것은 더 이상 권장되지 않으며(Deprecated) 폐지 예정입니다. 향후 파이썬 버전에서는 모든 경우에 있어 @code{True}를 반환할 것입니다. 명시적인 @code{len(elem)} 또는 @code{elem is not None} 방식의 테스트를 대신 사용해주시기를 부탁드립니다.

@item 
@ref{292,,sys._clear_type_cache()} 함수는 사용 지원 중단(deprecated)되었습니다. 대신 @ref{364,,sys._clear_internal_caches()}를 사용해주시기를 부탁드립니다.
@end itemize

@node CPython 바이트 코드 변경 사항,C API의 변경 사항들,New Deprecations,파이썬 3 13의 새로운 기능에 대해 알아봅시다
@anchor{whatsnew/3 13 cpython-bytecode-changes}@anchor{5b8}
@subsection CPython 바이트 코드 변경 사항



@itemize *

@item 
@code{YIELD_VALUE`의 oparg는 yield가 yield from이나 await의 일부인 경우에는 `@w{`}1`}이 되고, 그렇지 않으면 @code{0}이 됩니다. @ref{5b9,,RESUME}의 oparg에는 예외 깊이(except-depth)가 1인지 여부를 나타내는 비트가 추가되도록 변경되었으며, 이는 제너레이터를 닫는 처리를 최적화하기 위해 필요합니다. (Irit Katriel이 gh-111354@footnote{https://github.com/python/cpython/issues/111354}를 통해 기능을 구현하였습니다.)
@end itemize

@node C API의 변경 사항들,빌드 변경 사항들,CPython 바이트 코드 변경 사항,파이썬 3 13의 새로운 기능에 대해 알아봅시다
@anchor{whatsnew/3 13 c-api-changes}@anchor{5ba}
@subsection C API의 변경 사항들


@menu
* 새로운 기능들: 새로운 기능들<2>. 
* C API의 변경 사항들: C API의 변경 사항들<2>. 
* 제한된 C API 변경 사항들:: 
* 제거된 C API들:: 
* 사용 지원 중단(deprecated)된 C API들: 사용 지원 중단 deprecated 된 C API들. 

@end menu

@node 새로운 기능들<2>,C API의 변경 사항들<2>,,C API의 변경 사항들
@anchor{whatsnew/3 13 id7}@anchor{5bb}
@subsubsection 새로운 기능들



@itemize *

@item 
@geindex Python 향상 제안; PEP 669
PEP 669@footnote{https://peps.python.org/pep-0669/} 모니터링 이벤트 생성을 위한 @ref{486,,PyMonitoring C API}가 추가되었습니다:


@itemize *

@item 
@ref{5bc,,PyMonitoringState}

@item 
@ref{5bd,,PyMonitoring_FirePyStartEvent()}

@item 
@ref{5be,,PyMonitoring_FirePyResumeEvent()}

@item 
@ref{5bf,,PyMonitoring_FirePyReturnEvent()}

@item 
@ref{5c0,,PyMonitoring_FirePyYieldEvent()}

@item 
@ref{5c1,,PyMonitoring_FireCallEvent()}

@item 
@ref{5c2,,PyMonitoring_FireLineEvent()}

@item 
@ref{5c3,,PyMonitoring_FireJumpEvent()}

@item 
@code{PyMonitoring_FireBranchEvent}

@item 
@ref{5c4,,PyMonitoring_FireCReturnEvent()}

@item 
@ref{5c5,,PyMonitoring_FirePyThrowEvent()}

@item 
@ref{5c6,,PyMonitoring_FireRaiseEvent()}

@item 
@ref{5c7,,PyMonitoring_FireCRaiseEvent()}

@item 
@ref{5c8,,PyMonitoring_FireReraiseEvent()}

@item 
@ref{5c9,,PyMonitoring_FireExceptionHandledEvent()}

@item 
@ref{5ca,,PyMonitoring_FirePyUnwindEvent()}

@item 
@ref{5cb,,PyMonitoring_FireStopIterationEvent()}

@item 
@ref{5cc,,PyMonitoring_EnterScope()}

@item 
@ref{5cd,,PyMonitoring_ExitScope()}
@end itemize

(Irit Katriel이 gh-111997@footnote{https://github.com/python/cpython/issues/111997}를 통해 기능을 구현하였습니다.)

@item 
1바이트만 차지하는 경량 뮤텍스인 @ref{485,,PyMutex}와 새로운 @ref{5ce,,PyMutex_Lock()} 및 @ref{5cf,,PyMutex_Unlock()} 함수를 추가했습니다. 연산을 수행하기 위해 블록이 필요하면, 현재 GIL을 보유 중인 경우 @code{PyMutex_Lock()}는 @ref{474,,전역 인터프리터 잠금(GIL)}을 해제합니다. (Sam Gross이 gh-108724@footnote{https://github.com/python/cpython/issues/108724}를 통해 기능을 구현하였습니다.)

@item 
시스템 시계에 액세스할 수 있도록 @ref{5d0,,PyTime C API}를 추가했습니다.


@itemize *

@item 
@ref{5d1,,PyTime_t}.

@item 
@ref{5d2,,PyTime_MIN} 그리고 @ref{5d3,,PyTime_MAX}.

@item 
@ref{5d4,,PyTime_AsSecondsDouble()}.

@item 
@ref{5d5,,PyTime_Monotonic()}.

@item 
@ref{5d6,,PyTime_MonotonicRaw()}.

@item 
@ref{5d7,,PyTime_PerfCounter()}.

@item 
@ref{5d8,,PyTime_PerfCounterRaw()}.

@item 
@ref{5d9,,PyTime_Time()}.

@item 
@ref{5da,,PyTime_TimeRaw()}.
@end itemize

(Victor Stinner과 Petr Viktorin이 gh-110850@footnote{https://github.com/python/cpython/issues/110850}를 통해 기능을 구현하였습니다.)

@item 
@ref{5db,,PyDict_Contains()}와 동일하게 동작하지만, `key'를 @ref{5dc,,PyObject}* 대신 const char* 형식의 UTF-8 인코딩된 바이트 문자열로 지정하는 @ref{5dd,,PyDict_ContainsString()} 함수를 추가했습니다. (Victor Stinner가 gh-108314@footnote{https://github.com/python/cpython/issues/108314}를 통해 기능을 구현하였습니다.)

@item 
@ref{5de,,PyDict_GetItemWithError()}와 유사하게 동작하지만 @ref{3d7,,빌린 참조(borrowed reference)} 대신 @ref{5df,,강한 참조(strong reference)}를 반환하는 @ref{5e0,,PyDict_GetItemRef()} 및 @ref{421,,PyDict_GetItemStringRef()} 함수를 추가했습니다. 해당하는 함수는 오류가 발생하면 @cite{-1}을 반환하므로 @code{PyErr_Occurred()}를 별도로 확인할 필요가 없습니다. (Victor Stinner가 gh-106004@footnote{https://github.com/python/cpython/issues/106004}를 통해 기능을 구현하였습니다.)

@item 
@ref{5e1,,PyDict_SetDefault()}와 유사하게 동작하지만 @ref{3d7,,빌린 참조(borrowed reference)} 대신 @ref{5df,,강한 참조(strong reference)}를 반환하는 @ref{5e2,,PyDict_SetDefaultRef()} 함수를 추가했습니다. 이 함수는 오류가 발생하면 @cite{-1}을, 새 항목을 삽입한 경우 @cite{0}을, 키가 딕셔너리에 이미 존재하는 경우 @cite{1}을 반환합니다. (Sam Gross가 gh-112066@footnote{https://github.com/python/cpython/issues/112066}를 통해 기능을 구현하였습니다.)

@item 
딕셔너리에서 키를 제거하고 필요에 따라 제거된 값을 반환하는 @ref{422,,PyDict_Pop()} 및 @ref{5e3,,PyDict_PopString()} 함수를 추가했습니다. 이는 @ref{5e4,,dict.pop()} 메서드와 비슷하지만, 기본값 인자가 없으며 존재하지 않는 키에 대해서도 @ref{5e5,,KeyError}를 발생시키지 않습니다. (Stefan Behnel과 Victor Stinner가 gh-111262@footnote{https://github.com/python/cpython/issues/111262}를 통해 기능을 구현하였습니다.)

@item 
@ref{5e6,,PyObject_GetItem()} 및 @ref{5e7,,PyMapping_GetItemString()}의 대안으로, 각각 @ref{5e8,,PyMapping_GetOptionalItem()} 및 @ref{5e9,,PyMapping_GetOptionalItemString()} 함수를 추가하였습니다. 해당하는 새로운 함수들은 요청된 키가 기존 매핑에 없더라도 @ref{5e5,,KeyError}를 발생시키지 않습니다. 해당하는 변형은 누락된 키를 오류 사례(failure)로 취급하지 않아야 하는 경우에 보다 더 편리하고 빠른 작동에 도움이 됩니다. (Serhiy Storchaka가 gh-106307@footnote{https://github.com/python/cpython/issues/106307}를 통해 기능을 구현하였습니다.)

@item 
@ref{5ea,,PyObject_GetOptionalAttr()} 및 @ref{5eb,,PyObject_GetOptionalAttrString()}의 대안으로, 각각 @ref{5ec,,PyObject_GetAttr()} 및 @ref{5ed,,PyObject_GetAttrString()} 함수를 추가하였습니다. 새로운 함수는 요청된 어트리뷰트를 객체에서 찾을 수 없더라도 @ref{5ee,,AttributeError}를 발생시키지 않습니다. 해당하는 변형은 누락된 어트리뷰트를 오류 사례(failure)로 취급하지 않아야 하는 경우에 보다 더 편리하고 빠른 작동에 도움이 됩니다. (Serhiy Storchaka가 gh-106521@footnote{https://github.com/python/cpython/issues/106521}를 통해 기능을 구현하였습니다.)

@item 
경고 메시지를 사용자 지정할 수 있도록 @ref{5ef,,PyErr_WriteUnraisable()} 함수의 확장으로 @ref{5f0,,PyErr_FormatUnraisable()} 함수를 추가했습니다. (Serhiy Storchaka가 gh-108082@footnote{https://github.com/python/cpython/issues/108082}를 통해 기능을 구현하였습니다.)

@item 
프레임의 locals, globals, 빌트인에 대해 @ref{3d7,,빌린 참조(borrowed reference)} 대신 @ref{5df,,강한 참조(strong reference)}를 반환하는 새로운 함수들을 추가했습니다. 해당하는 업데이트들은 @ref{470,,PEP 667}의 일환입니다:


@itemize *

@item 
@ref{5f1,,PyEval_GetBuiltins()} 대신 @ref{5f2,,PyEval_GetFrameBuiltins()}를 사용해주시기를 부탁드립니다.

@item 
@ref{5f3,,PyEval_GetGlobals()} 대신 @ref{5f4,,PyEval_GetFrameGlobals()}를 사용해주시기를 부탁드립니다.

@item 
@ref{5f5,,PyEval_GetLocals()} 대신 @ref{5f6,,PyEval_GetFrameLocals()}를 사용해주시기를 부탁드립니다.
@end itemize

(Mark Shannon과 Tian Gao가 gh-74929@footnote{https://github.com/python/cpython/issues/74929}를 통해 기능을 구현하였습니다.)

@item 
상수에 대한 @ref{5df,,강한 참조(strong reference)} 또는 @ref{3d7,,빌린 참조(borrowed reference)}를 얻을 수 있도록 @ref{5f7,,Py_GetConstant()} 및 @ref{5f8,,Py_GetConstantBorrowed()} 함수를 추가했습니다. 예를 들어, @cite{Py_GetConstant(Py_CONSTANT_ZERO)}는 상수 0에 대한 강한 참조(strong reference)를 반환합니다. (Victor  Stinner가 gh-115754@footnote{https://github.com/python/cpython/issues/115754}를 통해 기능을 구현하였습니다.)

@item 
@ref{5f9,,PyImport_AddModule()} 함수의 대체로 @ref{5fa,,PyImport_AddModuleRef()} 함수를 추가했습니다. 이 함수는 @ref{3d7,,빌린 참조(borrowed reference)} 대신 @ref{5df,,강한 참조(strong reference)}를 반환합니다. (Victor Stinner가 gh-105922@footnote{https://github.com/python/cpython/issues/105922}를 통해 기능을 구현하였습니다.)

@item 
메인 파이썬 인터프리터가 @ref{47a,,종료 중(interpreter shutdown)} 상태에 해당하는지 확인할 수 있도록 @ref{5fb,,Py_IsFinalizing()} 함수를 추가했습니다. (Victor Stinner가 gh-108014@footnote{https://github.com/python/cpython/issues/108014}를 통해 기능을 구현하였습니다.)

@item 
@ref{3d7,,빌린 참조(borrowed reference)} 대신 @ref{5df,,강한 참조(strong reference)}를 반환하는 @ref{5fc,,PyList_GetItem()}의 대체 함수로 @ref{5fd,,PyList_GetItemRef()} 함수를 추가합니다. (Sam Gross가 gh-114329@footnote{https://github.com/python/cpython/issues/114329}를 통해 기능을 구현하였습니다.)

@item 
@ref{5fe,,PyList_Extend()} 및 @ref{5ff,,PyList_Clear()} 함수를 추가하였습니다. 해당하는 함수들은 기존 파이썬의 @ref{600,,list.extend()} 및 @ref{601,,list.clear()} 메서드를 그대로 반영한 것입니다. (Victor Stinner가 gh-111138@footnote{https://github.com/python/cpython/issues/111138}를 통해 기능을 구현하였습니다.)

@item 
새로운 @ref{602,,PyLong_AsInt()} 함수를 추가했습니다. 해당하는 함수는 @ref{603,,PyLong_AsLong()}과 유사하게 동작하지만, 결과를 C의 long 대신 C의 int에 저장합니다. (Victor Stinner가 gh-108014@footnote{https://github.com/python/cpython/issues/108014}를 통해 기능을 구현하였습니다.)

@item 
네이티브 정수형과 파이썬 @ref{19b,,int} 객체 사이의 변환을 단순화하기 위해 @ref{604,,PyLong_AsNativeBytes()}, @ref{605,,PyLong_FromNativeBytes()}, @ref{606,,PyLong_FromUnsignedNativeBytes()} 함수를 추가했습니다. (Steve Dower가 gh-111140@footnote{https://github.com/python/cpython/issues/111140}를 통해 기능을 구현하였습니다.)

@item 
@ref{607,,PyModule_AddObjectRef()} 그리고 @ref{608,,PyModule_AddObject()}와 유사하지만 항상 값에 대한 참조를 가져가는(steal) @ref{609,,PyModule_Add()} 함수를 추가했습니다. (Serhiy Storchaka가 gh-86493@footnote{https://github.com/python/cpython/issues/86493}를 통해 기능을 구현하였습니다.)

@item 
파이썬 객체의 기본 해싱 함수를 구현하는 @ref{60a,,PyObject_GenericHash()} 함수를 추가했습니다. (Serhiy Storchaka가 gh-113024@footnote{https://github.com/python/cpython/issues/113024}를 통해 기능을 구현하였습니다.)

@item 
가공되지 않은(raw) 포인터를 해싱하기 위한 @ref{425,,Py_HashPointer()} 함수를 추가했습니다. (Victor Stinner가 gh-111545@footnote{https://github.com/python/cpython/issues/111545}를 통해 기능을 구현하였습니다.)

@item 
@ref{60b,,PyObject_VisitManagedDict()} 그리고 @ref{60c,,PyObject_ClearManagedDict()} 함수를 추가하였습니다. 해당하는 함수들은 @ref{60d,,Py_TPFLAGS_MANAGED_DICT} 플래그를 사용하는 타입의 @cite{traverse} 및 @cite{clear} 함수를 통해 호출되어야 합니다. pythoncapi-compat 프로젝트@footnote{https://github.com/python/pythoncapi-compat/}를 통해 해당하는 함수들을 Python 3.11 및 3.12에서 사용할 수 있습니다. (Victor Stinner가 gh-107073@footnote{https://github.com/python/cpython/issues/107073}를 통해 기능을 구현하였습니다.)

@item 
@ref{105,,tracemalloc} 모듈과 같은 방식으로 객체의 생성(creation)과 파기(destruction)를 추적할 수 있도록 @ref{60e,,PyRefTracer_SetTracer()} 그리고 @ref{60f,,PyRefTracer_GetTracer()} 함수를 추가했습니다. (Pablo Galindo가 gh-93502@footnote{https://github.com/python/cpython/issues/93502}를 통해 기능을 구현하였습니다.)

@item 
이벤트 인자를 파이썬 @ref{610,,tuple} 객체로 받는 @ref{611,,PySys_Audit()}의 대안으로 @ref{612,,PySys_AuditTuple()} 함수를 추가했습니다. (Victor Stinner가 gh-85283@footnote{https://github.com/python/cpython/issues/85283}를 통해 기능을 구현하였습니다.)

@item 
@code{NULL}인 경우에 치명적인(fatal) 에러로 프로세스를 종료하지 않는 @ref{613,,PyThreadState_Get()} 의 대안으로 @ref{423,,PyThreadState_GetUnchecked()} 함수를 추가했습니다. 결과가 @code{NULL} 인지 여부를 확인하는 역할을 호출자가 수행합니다.

@item 
타입의 완전히 정규화된 이름을 얻기 위한 @ref{614,,PyType_GetFullyQualifiedName()} 함수를 추가했습니다. @ref{615,,type.__module__}가 문자열이고 그 값이 @cite{‘builtins’} 또는 @cite{‘__main__’}이 아닌 경우, 모듈 이름이 앞에 붙습니다. (Victor Stinner가 gh-111696@footnote{https://github.com/python/cpython/issues/111696}를 통해 기능을 구현하였습니다.)

@item 
특정 타입의 모듈 이름을 가져오는 @ref{616,,PyType_GetModuleName()} 함수를 추가했습니다. 해당하는 함수의 이런 동작은 @ref{615,,type.__module__} 어트리뷰트를 가져오는 것과 동일합니다. (Eric Snow와 Victor Stinner가 gh-111696@footnote{https://github.com/python/cpython/issues/111696}를 통해 기능을 구현하였습니다.)

@item 
유니코드 객체를 const char* 형식의 UTF-8 인코딩된 문자열과 비교하기 위한 @ref{617,,PyUnicode_EqualToUTF8AndSize()}와 @ref{618,,PyUnicode_EqualToUTF8()} 함수를 추가했습니다. 두 값이 같으면 @cite{1}을 반환하며, 두 값이 같지 않으면 @cite{0}을 반환합니다. 해당하는 함수들은 예외를 발생시키지 않습니다. (Serhiy Storchaka가 gh-110289@footnote{https://github.com/python/cpython/issues/110289}를 통해 기능을 구현하였습니다.)

@item 
@ref{3dd,,PyWeakref_GetObject()}의 대안으로 @ref{3df,,PyWeakref_GetRef()} 함수를 추가했습니다. 해당하는 함수는 참조 대상이 아직 살아 있는 경우 @ref{5df,,강한 참조 (strong reference)}를, 더 이상 살아 있지 않은 경우 @cite{NULL}을 반환합니다. (Victor Stinner가 gh-105927@footnote{https://github.com/python/cpython/issues/105927}를 통해 기능을 구현하였습니다.)

@item 
에러를 조용한 방식으로 간과/무시하던 함수들의 동작을 바로잡은 새로운 함수들을 추가했습니다:


@itemize *

@item 
@ref{619,,PyObject_HasAttr()} 대신 @ref{61a,,PyObject_HasAttrWithError()}를 사용해주시기를 부탁드립니다.

@item 
@ref{61b,,PyObject_HasAttrString()}의 사용 대신 @ref{61c,,PyObject_HasAttrStringWithError()}의 사용을 부탁드립니다.

@item 
@ref{61d,,PyMapping_HasKey()} 대신 @ref{61e,,PyMapping_HasKeyWithError()}를 사용해주시기를 부탁드립니다.

@item 
@ref{61f,,PyMapping_HasKeyString()}의 사용 대신 @ref{620,,PyMapping_HasKeyStringWithError()}의 사용을 부탁드립니다.
@end itemize

새로운 함수들은 에러의 경우 @cite{-1}을, 참의 경우 기존과 같이 @cite{1}을, 거짓의 경우 @cite{0}을 반환합니다.

(Serhiy Storchaka가 gh-108511@footnote{https://github.com/python/cpython/issues/108511}를 통해 기능을 구현하였습니다.)
@end itemize

@node C API의 변경 사항들<2>,제한된 C API 변경 사항들,새로운 기능들<2>,C API의 변경 사항들
@anchor{whatsnew/3 13 changed-c-apis}@anchor{621}
@subsubsection C API의 변경 사항들



@itemize *

@item 
@ref{622,,PyArg_ParseTupleAndKeywords()}와 @ref{623,,PyArg_VaParseTupleAndKeywords()}의 `keywords' 매개 변수는 이제 C 언어에서는 char *const*, C++ 언어에서는 const char *const* 형식을 가지며, 이전의 char** 형식으로부터 업데이트되었습니다. C++ 언어에서는 이를 통해 해당하는 함수들이 const char *const*, const char**, char *const* 형식의 인자와 명시적인 타입 변환(explicit type cast) 없이도 호환되도록 합니다. C 언어에서는 해당하는 함수들이 char *const* 형식의 인자만 지원합니다. 해당하는 방식의 작동은 @ref{624,,PY_CXX_CONST} 매크로를 사용하여 재정의할 수 있습니다. (Serhiy Storchaka가 gh-65210@footnote{https://github.com/python/cpython/issues/65210}를 통해 기능을 구현하였습니다.)

@item 
@ref{622,,PyArg_ParseTupleAndKeywords()}가 이제 ASCII 가 아닌 키워드 매개 변수 이름도 지원합니다. (Serhiy Storchaka가 gh-110815@footnote{https://github.com/python/cpython/issues/110815}를 통해 기능을 구현하였습니다.)

@item 
@code{PyCode_GetFirstFree()} 함수는 이제 불안정한 API로 분류되며, 이름도 @ref{625,,PyUnstable_Code_GetFirstFree()}로 변경되었습니다. (Bogdan Romanyuk가 gh-115781@footnote{https://github.com/python/cpython/issues/115781}를 통해 기능을 구현하였습니다.)

@item 
@ref{626,,PyDict_GetItem()}, @ref{627,,PyDict_GetItemString()}, @ref{61d,,PyMapping_HasKey()}, @ref{61f,,PyMapping_HasKeyString()}, @ref{619,,PyObject_HasAttr()}, @ref{61b,,PyObject_HasAttrString()}, 그리고 @ref{628,,PySys_GetObject()} 함수는 호출 시 발생한 모든 에러를 이전에는 그냥 지워 버렸지만, 이제 @ref{506,,sys.unraisablehook()}을 사용하는 방식을 통해 해당하는 에러들을 보고합니다. 관련된 설명서를 기반으로 다른 함수로 변경하는 것이 보다 권장되는 방법입니다. (Serhiy Storchaka가 gh-106672@footnote{https://github.com/python/cpython/issues/106672}를 통해 기능을 구현하였습니다.)

@item 
@ref{629,,PyUnicode_FromFormat()}에 @code{%T}, @code{%#T}, @code{%N}, 그리고 @code{%#N} 형식에 대한 지원이 추가되었습니다.


@itemize *

@item 
@code{%T}: 객체 타입의 완전히 정규화된 이름을 가져옵니다.

@item 
@code{%#T}: 위의 @code{%T}와 같은 방식으로, 그러나 콜론을 구분 기호로 사용합니다.

@item 
@code{%N}: 타입의 완전히 정규화된 이름을 가져옵니다.

@item 
@code{%#N}: 위의 @code{%N}과 같은 방식으로, 그러나 콜론을 구분 기호로 사용합니다.
@end itemize

보다 자세한 내용의 경우 
@geindex Python 향상 제안; PEP 737
PEP 737@footnote{https://peps.python.org/pep-0737/}를 참고 부탁드립니다. (Victor Stinner가 gh-111696@footnote{https://github.com/python/cpython/issues/111696}를 통해 기능을 구현하였습니다.)

@item 
이제 @code{#} @ref{62a,,포맷 코드}를 사용할 때에 @code{Python.h}를 포함하기 전에 @code{PY_SSIZE_T_CLEAN} 매크로를 정의할 필요가 없습니다. 해당하는 포맷 코드를 받는 API들은 @code{#} 포맷에 대해 항상 @code{Py_ssize_t}를 사용합니다. (Inada Naoki가 gh-104922@footnote{https://github.com/python/cpython/issues/104922}를 통해 기능을 구현하였습니다.)

@item 
파이썬이 @ref{508,,디버그 모드}로 빌드되었거나 @ref{62b,,with assertions} 옵션으로 빌드된 경우, @ref{62c,,PyTuple_SET_ITEM()}과 @ref{62d,,PyList_SET_ITEM()} 함수는 인덱스 인자가 올바른지 검사문을 통한 확인(assert)을 통해 검사합니다.
@end itemize

@node 제한된 C API 변경 사항들,제거된 C API들,C API의 변경 사항들<2>,C API의 변경 사항들
@anchor{whatsnew/3 13 limited-c-api-changes}@anchor{62e}
@subsubsection 제한된 C API 변경 사항들



@itemize *

@item 
다음과 같은 함수들은 이제 제한된 C API에 포함됩니다.


@itemize *

@item 
@ref{62f,,PyMem_RawMalloc()}

@item 
@ref{630,,PyMem_RawCalloc()}

@item 
@ref{631,,PyMem_RawRealloc()}

@item 
@ref{632,,PyMem_RawFree()}

@item 
@ref{611,,PySys_Audit()}

@item 
@ref{612,,PySys_AuditTuple()}

@item 
@ref{633,,PyType_GetModuleByDef()}
@end itemize

(Contributed by Victor Stinner in gh-85283@footnote{https://github.com/python/cpython/issues/85283} and gh-116936@footnote{https://github.com/python/cpython/issues/116936}.)

@item 
참조 추적(tracing references)을 활성화하여 @ref{634,,--with-trace-refs} 옵션으로 빌드된 파이썬은 이제 @ref{635,,제한된 C API}를 지원합니다. (Victor Stinner가 gh-108634@footnote{https://github.com/python/cpython/issues/108634}를 통해 기능을 구현하였습니다.)
@end itemize

@node 제거된 C API들,사용 지원 중단 deprecated 된 C API들,제한된 C API 변경 사항들,C API의 변경 사항들
@anchor{whatsnew/3 13 removed-c-apis}@anchor{636}
@subsubsection 제거된 C API들



@itemize *

@item 
@code{_Py} 또는 @code{_PY} 접두사가 붙은 (비공개로 간주되는) 여러 함수, 매크로, 변수 등을 제거되었습니다. 혹시나라도 프로젝트가 해당하는 제거의 영향을 받거나 제거된 API가 계속 제공되어야 한다고 생각하신다면, 공개 C API를 요청하기 위해 @ref{556,,새 이슈}를 열어주시고, Victor Stinner에게 알리기 위해 이슈에 @code{cc: @@vstinner}를 추가해 주십시오. (Victor Stinner가 gh-106320@footnote{https://github.com/python/cpython/issues/106320}를 통해 기능을 구현하였습니다.)

@item 
파이썬 3.0에서 사용 지원이 중단된 낡은 버퍼 프로토콜을 제거합니다. 대신 @ref{260,,버퍼 프로토콜}를 사용해주시기를 부탁드립니다.


@itemize *

@item 
@code{PyObject_CheckReadBuffer()}: 객체가 버퍼 프로토콜을 지원하는지 테스트하고자 하는 경우 @ref{637,,PyObject_CheckBuffer()}를 사용해주시기를 부탁드립니다. 참고로 @code{PyObject_CheckBuffer()}는 @ref{638,,PyObject_GetBuffer()}가 성공하는 것을 보장하는 방식의 가정을 하지는 않습니다. 객체를 실제로 읽을 수 있는지 테스트하고자 하는 경우 @code{PyObject_GetBuffer()}의 다음 예제를 참조해주시기를 부탁드립니다.

@item 
@code{PyObject_AsCharBuffer()}, @code{PyObject_AsReadBuffer()}: 대신 @ref{638,,PyObject_GetBuffer()}와 @ref{639,,PyBuffer_Release()}를 사용해주시기를 부탁드립니다:

@example
// `view.buf`\와 `view.len`\을 사용하여 버퍼로부터 읽는 것이 가능합니다.

// buf를 `(const char*)view.buf`\로 캐스팅해야 하는 경우가 있을 수 있습니다.
@end example

@item 
@code{PyObject_AsWriteBuffer()}: 대신 @ref{638,,PyObject_GetBuffer()}와 @ref{639,,PyBuffer_Release()}를 사용해주시기를 부탁드립니다.

@example
// 버퍼에 쓸 때에는 `view.buf`\와 `view.len`\을 사용할 수 있습니다.
@end example
@end itemize

(Inada Naoki가 gh-85275@footnote{https://github.com/python/cpython/issues/85275}를 통해 기능을 구현하였습니다.)

@item 
파이썬 3.9에서 사용 지원이 중단된 여러 함수를 제거합니다.


@itemize *

@item 
@code{PyEval_CallObject()}, @code{PyEval_CallObjectWithKeywords()}: 대신 @ref{63a,,PyObject_CallNoArgs()} 혹은 @ref{63b,,PyObject_Call()}를 사용해주시기를 부탁드립니다.

@cartouche
@quotation 경고 
@ref{63b,,PyObject_Call()}에서는 위치 인자가 @ref{610,,tuple}이어야 하고 @cite{NULL}이면 안 됩니다. 키워드 인자는 @ref{183,,dict}이거나 @cite{NULL}입니다. 제거된 과거의 함수들은 인자 형식을 검사하고, 위치 인자와 키워드 인자에 대해 @cite{NULL}을 허용했었습니다. @cite{PyEval_CallObjectWithKeywords(func@comma{} NULL@comma{} kwargs)}를 @code{PyObject_Call()} 대신 사용할 때에, @ref{63c,,PyTuple_New(0)}로 생성한 빈 튜플을 위치 인자로 전달하는 것이 가능합니다.
@end quotation
@end cartouche

@item 
@code{PyEval_CallFunction()}: 대신 @ref{63d,,PyObject_CallFunction()}를 사용해주시기를 부탁드립니다.

@item 
@code{PyEval_CallMethod()}: 대신 @ref{63e,,PyObject_CallMethod()}를 사용해주시기를 부탁드립니다.

@item 
@code{PyCFunction_Call()}: 대신 @ref{63b,,PyObject_Call()}를 사용해주시기를 부탁드립니다.
@end itemize

(Victor Stinner가 gh-105107@footnote{https://github.com/python/cpython/issues/105107}를 통해 기능을 구현하였습니다.)

@item 
오래된, 파이썬 초기화를 구성할 때 사용되던, 파이썬 3.11에서 사용 지원이 중단(deprecated)된, 다음 함수들을 제거합니다:


@itemize *

@item 
@code{PySys_AddWarnOptionUnicode()}: 대신 @ref{63f,,PyConfig.warnoptions}를 사용해주시기를 부탁드립니다.

@item 
@code{PySys_AddWarnOptionUnicode()}: 대신 @ref{63f,,PyConfig.warnoptions}를 사용해주시기를 부탁드립니다.

@item 
@code{PySys_AddXOption()}: 대신 @ref{640,,PyConfig.xoptions}를 사용해주시기를 부탁드립니다.

@item 
@code{PySys_HasWarnOptions()}: 대신 @ref{640,,PyConfig.xoptions}를 사용해주시기를 부탁드립니다.

@item 
@code{PySys_SetPath()}: 대신 @ref{641,,PyConfig.module_search_paths}를 설정해주시기를 부탁드립니다.

@item 
@code{Py_SetPath()}: 대신 @ref{641,,PyConfig.module_search_paths}를 설정해주시기를 부탁드립니다.

@item 
@code{Py_SetStandardStreamEncoding()}: 대신 @ref{642,,PyConfig.stdio_encoding}를 설정해주시기를 부탁드립니다. 또한, 윈도우에서의 경우 @ref{41a,,PyConfig.legacy_windows_stdio}를 설정해주시는 것이 필요한 경우가 종종 있습니다.

@item 
@code{_Py_SetProgramFullPath()}: 대신 @ref{643,,PyConfig.executable}를 설정해주시기를 부탁드립니다.
@end itemize

파이썬 3.8에 추가된 @ref{644,,파이썬 초기화 구성}의 새로운 @ref{3f7,,PyConfig} API를 대신 사용해주시기를 부탁드립니다(보다 자세한 내용의 경우 
@geindex Python 향상 제안; PEP 587
PEP 587@footnote{https://peps.python.org/pep-0587/}를 참고해주시기를 부탁드립니다). (Victor Stinner가 gh-105145@footnote{https://github.com/python/cpython/issues/105145}를 통해 기능을 구현하였습니다.)

@item 
파이썬 3.2에서 폐지된 @code{PyEval_AcquireLock()}과 @code{PyEval_ReleaseLock()} 함수들을 제거하였습니다. 해당하는 함수들은 스레드 상태를 갱신하지 않았었습니다. 해당하는 함수들은 다음의 함수들을 통해 대체 가능합니다:


@itemize *

@item 
@ref{645,,PyEval_SaveThread()}와 @ref{646,,PyEval_RestoreThread()};

@item 
저수준 @ref{647,,PyEval_AcquireThread()}과 @ref{646,,PyEval_RestoreThread()};

@item 
혹은 @ref{648,,PyGILState_Ensure()}와 @ref{649,,PyGILState_Release()}.
@end itemize

(Victor Stinner가 gh-105182@footnote{https://github.com/python/cpython/issues/105182}를 통해 기능을 구현하였습니다.)

@item 
파이썬 3.9에서 사용 지원이 중단(deprecated)되었던 @code{PyEval_ThreadsInitialized()} 함수를 제거했습니다. 파이썬 3.7부터는 @code{Py_Initialize()}가 항상 GIL을 생성합니다. 따라서, @code{PyEval_InitThreads()}를 호출해도 아무런 효과가 없으며 @code{PyEval_ThreadsInitialized()}는 항상 0이 아닌 값을 반환합니다. (Victor Stinner가 gh-105182@footnote{https://github.com/python/cpython/issues/105182}를 통해 기능을 구현하였습니다.)

@item 
파이썬 3.8과의 하위 호환성을 위해 유지되던 @code{_PyInterpreterState_Get()} 별칭(alias)을 제거했습니다. 해당하는 별칭(alias)은 @ref{64a,,PyInterpreterState_Get()}에 대한 별칭(alias)이었습니다. 파이썬 3.8 및 그 이전 버전에서 @code{PyInterpreterState_Get()}을 사용하는 것은 pythoncapi-compat project@footnote{https://github.com/python/pythoncapi-compat/}를 통해 가능합니다. (Victor Stinner가 gh-106320@footnote{https://github.com/python/cpython/issues/106320}를 통해 기능을 구현하였습니다.)

@item 
비공개(private) 함수 @code{_PyObject_FastCall()}을 제거했습니다: 대신 파이썬 3.8부터 사용할 수 있는 @code{PyObject_Vectorcall()}을 사용해주시기를 부탁드립니다(보다 자세한 내용의 경우 
@geindex Python 향상 제안; PEP 590
PEP 590@footnote{https://peps.python.org/pep-0590/}를 참고해주시기를 부탁드립니다). (Victor Stinner가 gh-106023@footnote{https://github.com/python/cpython/issues/106023}를 통해 기능을 구현하였습니다.)

@item 
비공개(private) 함수만을 포함하던 @cite{cpython/pytime.h} 헤더 파일을 제거했습니다. (Victor Stinner가 gh-106316@footnote{https://github.com/python/cpython/issues/106316}를 통해 기능을 구현하였습니다.)

@item 
제한된 C API에서 문서화되지 않은 상수 @cite{PY_TIMEOUT_MAX}를 제거했습니다.

@item 
휴지통 매크로 @cite{Py_TRASHCAN_SAFE_BEGIN}과 @cite{Py_TRASHCAN_SAFE_END}를 제거했습니다. 해당 매크로는 오래된 것이었습니다. 대신 새로운 매크로인 @cite{Py_TRASHCAN_BEGIN}과 @cite{Py_TRASHCAN_END}를 사용해주시기를 부탁드립니다. (Irit Katriel이 gh-105111@footnote{https://github.com/python/cpython/issues/105111}를 통해 기능을 구현하였습니다.)
@end itemize

@node 사용 지원 중단 deprecated 된 C API들,,제거된 C API들,C API의 변경 사항들
@anchor{whatsnew/3 13 deprecated-c-apis}@anchor{64b}
@subsubsection 사용 지원 중단(deprecated)된 C API들



@itemize *

@item 
오래된 파이썬 초기화 함수들의 사용 지원을 중단(deprecate)합니다:


@itemize *

@item 
@ref{3f4,,PySys_ResetWarnOptions()}: 대신 @ref{3f5,,sys.warnoptions}와 @code{warnings.filters}를 초기화해주시기를 부탁드립니다.

@item 
@ref{3e9,,Py_GetExecPrefix()}: 대신 @ref{3eb,,sys.exec_prefix}를 활용해주시기를 부탁드립니다.

@item 
@ref{3e3,,Py_GetPath()}: 대신 @ref{3e4,,sys.path}를 활용해주시기를 부탁드립니다.

@item 
@ref{3e5,,Py_GetPrefix()}: 대신 @ref{3e7,,sys.prefix}를 활용해주시기를 부탁드립니다.

@item 
@ref{3ec,,Py_GetProgramFullPath()}: 대신 @ref{3ed,,sys.executable}를 활용해주시기를 부탁드립니다.

@item 
@ref{3ee,,Py_GetProgramName()}: 대신 @ref{3ed,,sys.executable}를 활용해주시기를 부탁드립니다.

@item 
@ref{3ef,,Py_GetPythonHome()}: 대신 @ref{3f3,,PyConfig.home} 혹은 
@geindex PYTHONHOME
@geindex 환경 변수; PYTHONHOME
@ref{3f0,,PYTHONHOME} 환경 변수를 활용해주시기를 부탁드립니다.
@end itemize

(Victor Stinner가 gh-105145@footnote{https://github.com/python/cpython/issues/105145}를 통해 기능을 구현하였습니다.)

@item 
@ref{5f1,,PyEval_GetBuiltins()}, @ref{5f3,,PyEval_GetGlobals()}, @ref{5f5,,PyEval_GetLocals()} 함수를 @ref{23d,,소프트 사용 지원 중단(soft deprecated)} 상태로 표시합니다. 이들 함수는 @ref{3d7,,빌린 참조(borrowed reference)}를 반환합니다.

@item 
@ref{3db,,PyImport_ImportModuleNoBlock()} 함수를 사용 지원 중단(deprecate)합니다. 해당하는 함수는 파이썬 3.3부터 @ref{3dc,,PyImport_ImportModule()}의 별칭(alias)입니다.

@item 
@ref{608,,PyModule_AddObject()} 함수를 @ref{23d,,소프트 사용 지원 중단(soft deprecated)} 상태로 표시합니다. 해당하는 함수는 @ref{609,,PyModule_Add()} 또는 @ref{607,,PyModule_AddObjectRef()}로 대체해야 합니다. (Serhiy Storchaka가 gh-86493@footnote{https://github.com/python/cpython/issues/86493}를 통해 기능을 구현하였습니다.)

@item 
오래된 @cite{Py_UNICODE} 그리고 @cite{PY_UNICODE_TYPE} 타입과 @code{Py_UNICODE_WIDE} 매크로를 폐지합니다. 대신 @code{wchar_t}타입을 사용해주시기를 부탁드립니다. 파이썬 3.3부터 @cite{Py_UNICODE}와 @cite{PY_UNICODE_TYPE}은 @code{wchar_t}의 별칭(alias)입니다.

@item 
@ref{3dd,,PyWeakref_GetObject()}와 @ref{3de,,PyWeakref_GET_OBJECT()} 함수가 사용 지원 중단(deprecate)되었습니다. 해당하는 함수들은 @ref{3d7,,빌린 참조(borrowed reference)}를 반환합니다. 해당하는 함수들은 새 @ref{3df,,PyWeakref_GetRef()} 함수로 대체되어야 합니다. 해당하는 함수는 @ref{5df,,강한 참조 (strong reference)}를 반환합니다. 파이썬 3.12 및 그 이전 버전에서 @code{PyWeakref_GetRef()}를 사용하기 위해 pythoncapi-compat 프로젝트@footnote{https://github.com/python/pythoncapi-compat/}를 활용할 수 있습니다.
@end itemize

@c Add deprecations above alphabetically, not here at the end.

@menu
* 파이썬 3.14에서 제거 예정인 항목들: 파이썬 3 14에서 제거 예정인 항목들<2>. 
* 파이썬 3.15에서 제거 예정인 항목들: 파이썬 3 15에서 제거 예정인 항목들<2>. 
* 파이썬 3.16에서 제거 예정인 항목들: 파이썬 3 16에서 제거 예정인 항목들<2>. 
* 파이썬 3.18에서 제거 예정인 항목들: 파이썬 3 18에서 제거 예정인 항목들<2>. 
* 향후 보다 상위 버전의 제거 예정 항목들: 향후 보다 상위 버전의 제거 예정 항목들<2>. 

@end menu

@node 파이썬 3 14에서 제거 예정인 항목들<2>,파이썬 3 15에서 제거 예정인 항목들<2>,,사용 지원 중단 deprecated 된 C API들
@anchor{whatsnew/3 13 id8}@anchor{64c}
@subsubsection 파이썬 3.14에서 제거 예정인 항목들



@itemize *

@item 
확장 모듈용 @ref{64d,,PyDictObject}의 @cite{ma_version_tag} 필드(보다 자세한 내용의 경우 
@geindex Python 향상 제안; PEP 699
PEP 699@footnote{https://peps.python.org/pep-0699/}과 gh-101193@footnote{https://github.com/python/cpython/issues/101193}를 참고 부탁드립니다).

@item 
변형 가능한(mutable) 기반으로부터 @ref{3cf,,immutable types}의 생성 (보다 자세한 내용의 경우 gh-95388@footnote{https://github.com/python/cpython/issues/95388}를 참고 부탁드립니다).
@end itemize

@node 파이썬 3 15에서 제거 예정인 항목들<2>,파이썬 3 16에서 제거 예정인 항목들<2>,파이썬 3 14에서 제거 예정인 항목들<2>,사용 지원 중단 deprecated 된 C API들
@anchor{whatsnew/3 13 id9}@anchor{64e}
@subsubsection 파이썬 3.15에서 제거 예정인 항목들



@itemize *

@item 
@ref{3db,,PyImport_ImportModuleNoBlock()}: 대신 @ref{3dc,,PyImport_ImportModule()}를 사용해주시기를 부탁드립니다.

@item 
@ref{3dd,,PyWeakref_GetObject()}와 @ref{3de,,PyWeakref_GET_OBJECT()}: 대신 @ref{3df,,PyWeakref_GetRef()}를 사용해주시기를 부탁드립니다. 파이썬 3.12 및 그 이전 버전에서 @code{PyWeakref_GetRef()}를 사용하려면 pythoncapi-compat 프로젝트@footnote{https://github.com/python/pythoncapi-compat/}를 활용할 수 있습니다.

@item 
@ref{3e0,,Py_UNICODE} 타입과 @code{Py_UNICODE_WIDE} 매크로는 대신 @code{wchar_t}를 사용해주시기를 부탁드립니다.

@item 
@code{PyUnicode_AsDecodedObject()}: 대신 @ref{3e1,,PyCodec_Decode()}를 사용해주시기를 부탁드립니다.

@item 
@code{PyUnicode_AsDecodedUnicode()}: 대신 @ref{3e1,,PyCodec_Decode()}를 사용해주시기를 부탁드립니다. 다만, 일부 코덱(예를 들어, "base64")은 @ref{169,,str}이 아닌 @ref{192,,bytes}와 같은 다른 타입을 반환할 수 있음을 주의해주시기를 부탁드립니다.

@item 
@code{PyUnicode_AsEncodedObject()}: 대신 @ref{3e2,,PyCodec_Encode()}를 사용해주시기를 부탁드립니다.

@item 
@code{PyUnicode_AsEncodedUnicode()} 대신 @ref{3e2,,PyCodec_Encode()}를 사용해주시기를 부탁드립니다. 일부 코덱(예를 들어, "base64")은 @ref{192,,bytes}가 아닌 @ref{169,,str}과 같은 다른 타입을 반환할 수 있음을 주의해주시기를 부탁드립니다.

@item 
파이썬 3.13에서 사용 지원 중단(deprecated)된 파이썬 초기화 함수들:


@itemize *

@item 
@ref{3e3,,Py_GetPath()}: 대신 @ref{37c,,PyConfig_Get("module_search_paths")} (@ref{3e4,,sys.path})를 사용해주시기를 부탁드립니다.

@item 
@ref{3e5,,Py_GetPrefix()}: 대신 @ref{37c,,PyConfig_Get("base_prefix")} (@ref{3e6,,sys.base_prefix})를 사용해주시기를 부탁드립니다. 만약 @ref{3e8,,가상 환경}에 대한 처리가 필요한 경우에는 대신 @code{PyConfig_Get("prefix")} (@ref{3e7,,sys.prefix})를 사용해주시기를 부탁드립니다.

@item 
@ref{3e9,,Py_GetExecPrefix()}: 대신 @ref{37c,,PyConfig_Get("base_exec_prefix")} (@ref{3ea,,sys.base_exec_prefix})를 사용해주시기를 부탁드립니다. 만약 @ref{3e8,,가상 환경}에 대한 처리가 필요한 경우에는 대신 @code{PyConfig_Get("exec_prefix")} (@ref{3eb,,sys.exec_prefix})를 사용해주시기를 부탁드립니다.

@item 
@ref{3ec,,Py_GetProgramFullPath()}: 대신 @ref{37c,,PyConfig_Get("executable")} (@ref{3ed,,sys.executable})를 사용해주시기를 부탁드립니다.

@item 
@ref{3ee,,Py_GetProgramName()}: 대신 @ref{37c,,PyConfig_Get("executable")} (@ref{3ed,,sys.executable})를 사용해주시기를 부탁드립니다.

@item 
@ref{3ef,,Py_GetPythonHome()}: 대신 @ref{37c,,PyConfig_Get("home")} 혹은 
@geindex PYTHONHOME
@geindex 환경 변수; PYTHONHOME
@ref{3f0,,PYTHONHOME} 환경 변수를 사용해주시기를 부탁드립니다.
@end itemize

Python 3.13 및 이전 버전에서 @ref{37c,,PyConfig_Get()}을 사용하기 위해 pythoncapi-compat 프로젝트@footnote{https://github.com/python/pythoncapi-compat/}를 사용할 수 있습니다.

@item 
파이썬 3.11에서 사용 지원이 중단(deprecated)된, 파이썬 초기화를 구성하는 함수들은 다음과 같습니다:


@itemize *

@item 
@code{PySys_SetArgvEx()}: 대신 @ref{3f1,,PyConfig.argv}를 설정해주시기를 부탁드립니다.

@item 
@code{PySys_SetArgv()}: 대신 @ref{3f1,,PyConfig.argv}를 설정해주시기를 부탁드립니다.

@item 
@code{Py_SetProgramName()}: 대신 @ref{3f2,,PyConfig.program_name}를 설정해주시기를 부탁드립니다.

@item 
@code{Py_SetPythonHome()}: 대신 @ref{3f3,,PyConfig.home}를 설정해주시기를 부탁드립니다.

@item 
@ref{3f4,,PySys_ResetWarnOptions()}: 대신 @ref{3f5,,sys.warnoptions}와 @code{warnings.filters}를 초기화해주시기를 부탁드립니다.
@end itemize

@ref{3f6,,Py_InitializeFromConfig()} API는 @ref{3f7,,PyConfig}와 함께 사용되어야 합니다.

@item 
전역 구성 변수들:


@itemize *

@item 
@ref{3f8,,Py_DebugFlag}: 대신 @ref{3f9,,PyConfig.parser_debug}나 @ref{37c,,PyConfig_Get("parser_debug")}를 사용해주시기를 부탁드립니다.

@item 
@ref{3fa,,Py_VerboseFlag}: 대신 @ref{3fb,,PyConfig.verbose}나 @ref{37c,,PyConfig_Get("verbose")}를 사용해주시기를 부탁드립니다.

@item 
@ref{3fc,,Py_QuietFlag}: 대신 @ref{3fd,,PyConfig.quiet}나 @ref{37c,,PyConfig_Get("quiet")}를 사용해주시기를 부탁드립니다.

@item 
@ref{3fe,,Py_InteractiveFlag}: 대신 @ref{3ff,,PyConfig.interactive}나 @ref{37c,,PyConfig_Get("interactive")}를 사용해주시기를 부탁드립니다.

@item 
@ref{400,,Py_InspectFlag}: 대신 @ref{401,,PyConfig.inspect}나 @ref{37c,,PyConfig_Get("inspect")}를 사용해주시기를 부탁드립니다.

@item 
@ref{402,,Py_OptimizeFlag}: 대신 @ref{403,,PyConfig.optimization_level}나 @ref{37c,,PyConfig_Get("optimization_level")}를 사용해주시기를 부탁드립니다.

@item 
@ref{404,,Py_NoSiteFlag}: 대신 @ref{405,,PyConfig.site_import}나 @ref{37c,,PyConfig_Get("site_import")}를 사용해주시기를 부탁드립니다.

@item 
@ref{406,,Py_BytesWarningFlag}: 대신 @ref{407,,PyConfig.bytes_warning}나 @ref{37c,,PyConfig_Get("bytes_warning")}를 사용해주시기를 부탁드립니다.

@item 
@ref{408,,Py_FrozenFlag}: 대신 @ref{409,,PyConfig.pathconfig_warnings}나 @ref{37c,,PyConfig_Get("pathconfig_warnings")}를 사용해주시기를 부탁드립니다.

@item 
@ref{40a,,Py_IgnoreEnvironmentFlag}: 대신 @ref{40b,,PyConfig.use_environment}나 @ref{37c,,PyConfig_Get("use_environment")}를 사용해주시기를 부탁드립니다.

@item 
@ref{40c,,Py_DontWriteBytecodeFlag}: 대신 @ref{40d,,PyConfig.write_bytecode}나 @ref{37c,,PyConfig_Get("write_bytecode")}를 사용해주시기를 부탁드립니다.

@item 
@ref{40e,,Py_NoUserSiteDirectory}: 대신 @ref{40f,,PyConfig.user_site_directory}나 @ref{37c,,PyConfig_Get("user_site_directory")}를 사용해주시기를 부탁드립니다.

@item 
@ref{410,,Py_UnbufferedStdioFlag}: 대신 @ref{411,,PyConfig.buffered_stdio}나 @ref{37c,,PyConfig_Get("buffered_stdio")}를 사용해주시기를 부탁드립니다.

@item 
@ref{412,,Py_HashRandomizationFlag}: 대신 @ref{413,,PyConfig.use_hash_seed}나 @ref{414,,PyConfig.hash_seed} 혹은 @ref{37c,,PyConfig_Get("hash_seed")}를 사용해주시기를 부탁드립니다.

@item 
@ref{415,,Py_IsolatedFlag}: 대신 @ref{416,,PyConfig.isolated} 혹은 @ref{37c,,PyConfig_Get("isolated")}를 사용해주시기를 부탁드립니다.

@item 
@ref{417,,Py_LegacyWindowsFSEncodingFlag}: 대신 @ref{418,,PyPreConfig.legacy_windows_fs_encoding} 혹은 @ref{37c,,PyConfig_Get("legacy_windows_fs_encoding")}를 사용해주시기를 부탁드립니다.

@item 
@ref{419,,Py_LegacyWindowsStdioFlag}: 대신 @ref{41a,,PyConfig.legacy_windows_stdio} 혹은 @ref{37c,,PyConfig_Get("legacy_windows_stdio")}를 사용해주시기를 부탁드립니다.

@item 
@code{Py_FileSystemDefaultEncoding}와 @code{Py_HasFileSystemDefaultEncoding}: 대신 @ref{41b,,PyConfig.filesystem_encoding} 혹은 @ref{37c,,PyConfig_Get("filesystem_encoding")}를 사용해주시기를 부탁드립니다.

@item 
@code{Py_FileSystemDefaultEncodeErrors}: 대신 @ref{41c,,PyConfig.filesystem_errors} 혹은 @ref{37c,,PyConfig_Get("filesystem_errors")}를 사용해주시기를 부탁드립니다.

@item 
@code{Py_UTF8Mode}: 대신 @ref{41d,,PyPreConfig.utf8_mode} 혹은 @ref{37c,,PyConfig_Get("utf8_mode")}를 사용해주시기를 부탁드립니다 (보다 자세한 내용의 경우 @ref{41e,,Py_PreInitialize()}를 참고 부탁드립니다).
@end itemize

해당하는 옵션들을 설정하기 위해 @ref{3f6,,Py_InitializeFromConfig()} API를 @ref{3f7,,PyConfig}와 함께 사용해주시기를 부탁드립니다. 혹은, 실행 시간에 해당하는 옵션 값을 가져오는 방식으로 @ref{37c,,PyConfig_Get()}을 사용해주시기를 부탁드립니다.
@end itemize

@node 파이썬 3 16에서 제거 예정인 항목들<2>,파이썬 3 18에서 제거 예정인 항목들<2>,파이썬 3 15에서 제거 예정인 항목들<2>,사용 지원 중단 deprecated 된 C API들
@anchor{whatsnew/3 13 id10}@anchor{64f}
@subsubsection 파이썬 3.16에서 제거 예정인 항목들



@itemize *

@item 
번들로 포함된 @code{libmpdec} 사본.
@end itemize

@node 파이썬 3 18에서 제거 예정인 항목들<2>,향후 보다 상위 버전의 제거 예정 항목들<2>,파이썬 3 16에서 제거 예정인 항목들<2>,사용 지원 중단 deprecated 된 C API들
@anchor{whatsnew/3 13 id11}@anchor{650}
@subsubsection 파이썬 3.18에서 제거 예정인 항목들



@itemize *

@item 
다음의 비공개(private) 함수들은 사용 지원이 중단(deprecated)되었으며 파이썬 3.18에서 제거될 예정입니다.


@itemize *

@item 
@code{_PyBytes_Join()}: 대신 @ref{383,,PyBytes_Join()}를 사용해주시기를 부탁드립니다.

@item 
@code{_PyDict_GetItemStringWithError()}: 대신 @ref{421,,PyDict_GetItemStringRef()}를 사용해주시기를 부탁드립니다.

@item 
@code{_PyDict_Pop()}: 대신 @ref{422,,PyDict_Pop()}을 사용해주시기를 부탁드립니다.

@item 
@code{_PyLong_Sign()}: 대신 @ref{39a,,PyLong_GetSign()}을 사용해주시기를 부탁드립니다.

@item 
@code{_PyLong_FromDigits()} 그리고 @code{_PyLong_New()}: 대신 @ref{3aa,,PyLongWriter_Create()}를 사용해주시기를 부탁드립니다.

@item 
@code{_PyThreadState_UncheckedGet()}: 대신 @ref{423,,PyThreadState_GetUnchecked()}를 사용해주시기를 부탁드립니다.

@item 
@code{_PyUnicode_AsString()}: 대신 @ref{424,,PyUnicode_AsUTF8()}를 사용해주시기를 부탁드립니다.

@item 
@code{_PyUnicodeWriter_Init()}: @code{_PyUnicodeWriter_Init(&writer)}와 같은 사용 대신 @ref{3b4,,writer = PyUnicodeWriter_Create(0)}와 같은 사용을 부탁드립니다.

@item 
@code{_PyUnicodeWriter_Finish()}: @code{_PyUnicodeWriter_Finish(&writer)}와 같은 사용 대신 @ref{3b7,,PyUnicodeWriter_Finish(writer)}와 같은 사용을 부탁드립니다.

@item 
@code{_PyUnicodeWriter_Dealloc()}: @code{_PyUnicodeWriter_Dealloc(&writer)}와 같은 사용 대신 @ref{3b6,,PyUnicodeWriter_Discard(writer)}와 같은 사용을 부탁드립니다.

@item 
@code{_PyUnicodeWriter_WriteChar()}: @code{_PyUnicodeWriter_WriteChar(&writer, ch)}와 같은 사용 대신 @ref{3ba,,PyUnicodeWriter_WriteChar(writer@comma{} ch)}와 같은 사용을 부탁드립니다.

@item 
@code{_PyUnicodeWriter_WriteStr()}: @code{_PyUnicodeWriter_WriteStr(&writer, str)}와 같은 사용 대신 @ref{3bc,,PyUnicodeWriter_WriteStr(writer@comma{} str)}와 같은 사용을 부탁드립니다.

@item 
@code{_PyUnicodeWriter_WriteSubstring()}: @code{_PyUnicodeWriter_WriteSubstring(&writer, str, start, end)}와 같은 사용 대신 @ref{3bd,,PyUnicodeWriter_WriteSubstring(writer@comma{} str@comma{} start@comma{} end) " "}와 같은 사용을 부탁드립니다.

@item 
@code{_PyUnicodeWriter_WriteASCIIString()}: @code{_PyUnicodeWriter_WriteASCIIString(&writer, str)}와 같은 사용 대신 @ref{3b9,,PyUnicodeWriter_WriteASCII(writer@comma{} str)}와 같은 사용을 부탁드립니다.

@item 
@code{_PyUnicodeWriter_WriteLatin1String()}: @code{_PyUnicodeWriter_WriteLatin1String(&writer, str)}와 같은 사용 대신 @ref{3bf,,PyUnicodeWriter_WriteUTF8(writer@comma{} str)}와 같은 사용을 부탁드립니다.

@item 
@code{_PyUnicodeWriter_Prepare()}: (다른 직접적인 대안이 없습니다.)

@item 
@code{_PyUnicodeWriter_PrepareKind()}: (다른 직접적인 대안이 없습니다.)

@item 
@code{_Py_HashPointer()}: 대신 @ref{425,,Py_HashPointer()}를 사용해주시기를 부탁드립니다.

@item 
@code{_Py_fopen_obj()}: 대신 @ref{393,,Py_fopen()}를 사용해주시기를 부탁드립니다.
@end itemize

pythoncapi-compat 프로젝트@footnote{https://github.com/python/pythoncapi-compat/}를 통해 Python 3.13 및 그 이전 버전에서 새로운 공개 함수를 사용할 수 있습니다.
@end itemize

@node 향후 보다 상위 버전의 제거 예정 항목들<2>,,파이썬 3 18에서 제거 예정인 항목들<2>,사용 지원 중단 deprecated 된 C API들
@anchor{whatsnew/3 13 id12}@anchor{651}
@subsubsection 향후 보다 상위 버전의 제거 예정 항목들


다음의 API는 사용 지원 중단(deprecated)되었습니다. 제거될 예정이지만, 아직 구체적인 제거 일정이 정해지지는 않았습니다.


@itemize *

@item 
@ref{427,,Py_TPFLAGS_HAVE_FINALIZE}: 파이썬 3.8부터 활용되고 있지 않습니다.

@item 
@ref{428,,PyErr_Fetch()}: 대신 @ref{429,,PyErr_GetRaisedException()}를 사용해주시기를 부탁드립니다.

@item 
@ref{42a,,PyErr_NormalizeException()}: 대신 @ref{429,,PyErr_GetRaisedException()}를 사용해주시기를 부탁드립니다.

@item 
@ref{42b,,PyErr_Restore()}: 대신 @ref{42c,,PyErr_SetRaisedException()}를 사용해주시기를 부탁드립니다.

@item 
@ref{42d,,PyModule_GetFilename()}: 대신 @ref{42e,,PyModule_GetFilenameObject()}를 사용해주시기를 부탁드립니다.

@item 
@ref{42f,,PyOS_AfterFork()}: 대신 @ref{430,,PyOS_AfterFork_Child()}를 사용해주시기를 부탁드립니다.

@item 
@ref{431,,PySlice_GetIndicesEx()}: 대신 @ref{432,,PySlice_Unpack()}과 @ref{433,,PySlice_AdjustIndices()}를 사용해주시기를 부탁드립니다.

@item 
@ref{434,,PyUnicode_READY()}: 파이썬 3.12부터 활용되고 있지 않습니다.

@item 
@code{PyErr_Display()}: 대신 @ref{435,,PyErr_DisplayException()}를 사용해주시기를 부탁드립니다.

@item 
@code{_PyErr_ChainExceptions()}: 대신 @code{_PyErr_ChainExceptions1()}를 사용해주시기를 부탁드립니다.

@item 
@code{PyBytesObject.ob_shash}: 대신 @ref{436,,PyObject_Hash()}를 사용해주시기를 부탁드립니다.

@item 
스레드 로컬 저장소 (Thread Local Storage; TLS) API:


@itemize *

@item 
@ref{437,,PyThread_create_key()}: 대신 @ref{438,,PyThread_tss_alloc()}를 사용해주시기를 부탁드립니다.

@item 
@ref{439,,PyThread_delete_key()}: 대신 @ref{43a,,PyThread_tss_free()}를 사용해주시기를 부탁드립니다.

@item 
@ref{43b,,PyThread_set_key_value()}: 대신 @ref{43c,,PyThread_tss_set()}를 사용해주시기를 부탁드립니다.

@item 
@ref{43d,,PyThread_get_key_value()}: 대신 @ref{43e,,PyThread_tss_get()}를 사용해주시기를 부탁드립니다.

@item 
@ref{43f,,PyThread_delete_key_value()}: 대신 @ref{440,,PyThread_tss_delete()}를 사용해주시기를 부탁드립니다.

@item 
@ref{441,,PyThread_ReInitTLS()}: 파이썬 3.7부터 활용되고 있지 않습니다.
@end itemize
@end itemize

@node 빌드 변경 사항들,파이썬 3 13으로의 코드 이식,C API의 변경 사항들,파이썬 3 13의 새로운 기능에 대해 알아봅시다
@anchor{whatsnew/3 13 build-changes}@anchor{652}@anchor{whatsnew/3 13 pythoncapi-compat-project}@anchor{653}
@subsection 빌드 변경 사항들



@itemize *

@item 
@cite{arm64-apple-ios}와 @cite{arm64-apple-ios-simulator}는 이제  
@geindex Python 향상 제안; PEP 11
PEP 11@footnote{https://peps.python.org/pep-0011/}에서 규정된 3단계 (Tier 3) 지원 플랫폼입니다. (Russell Keith-Magee가 @ref{48e,,PEP 730}를 작성하였으며, gh-114099@footnote{https://github.com/python/cpython/issues/114099}를 통해 기능을 구현하였습니다.)

@item 
@cite{aarch64-linux-android}와 @cite{x86_64-linux-android}는 이제 
@geindex Python 향상 제안; PEP 11
PEP 11@footnote{https://peps.python.org/pep-0011/}에서 규정된 3단계 (Tier 3) 지원 플랫폼입니다. (Malcolm Smith가 @ref{48e,,PEP 738}를 작성하였으며, gh-116622@footnote{https://github.com/python/cpython/issues/116622}를 통해 기능을 구현하였습니다.)

@item 
@code{wasm32-wasi}는 
@geindex Python 향상 제안; PEP 11
PEP 11@footnote{https://peps.python.org/pep-0011/}에서 규정된 2단계 (Tier 2) 지원 플랫폼입니다. (Brett Cannon이 gh-115192@footnote{https://github.com/python/cpython/issues/115192}를 통해 기능을 구현하였습니다.)

@item 
@cite{wasm32-emscripten}은 더 이상 
@geindex Python 향상 제안; PEP 11
PEP 11@footnote{https://peps.python.org/pep-0011/}에서 규정된 공식 지원 플랫폼이 아닙니다. (Brett Cannon이 gh-115192@footnote{https://github.com/python/cpython/issues/115192}를 통해 기능을 구현하였습니다.)

@item 
이제 CPython을 빌드하려면 C11 atomic 라이브러리, GCC 내장 atomic 함수, 또는 MSVC interlocked intrinsic를 지원하는 컴파일러가 필요합니다.

@item 
이제 @code{configure} 스크립트를 다시 생성하려면 Autoconf 2.71과 aclocal 1.16.5가 필요합니다. (Christian Heimes가 gh-89886@footnote{https://github.com/python/cpython/issues/89886}를 통해, 그리고 Victor Stinner가 gh-112090@footnote{https://github.com/python/cpython/issues/112090}를 통해 기능을 구현하였습니다.)

@item 
@ref{d4,,sqlite3} 확장 모듈을 빌드하려면 SQLite 3.15.2 이상이 필요합니다. (Erlend Aasland가 gh-105875@footnote{https://github.com/python/cpython/issues/105875}를 통해 기능을 구현하였습니다.)

@item 
CPython은 이제 기본적으로 mimalloc 라이브러리@footnote{https://github.com/microsoft/mimalloc/}를 함께 제공합니다. 해당하는 라이브러리는 MIT 라이센스로 배포됩니다. 보다 자세한 내용은 @ref{654,,mimalloc 라이센스}을 참고 부탁드립니다. mimalloc 번들에는 사용자에 의한 변경 사항이 있을 수 있습니다. 보다 자세한 내용은 gh-113141@footnote{https://github.com/python/cpython/issues/113141}을 참고 부탁드립니다.

@item 
@code{configure} 스크립트의 @ref{655,,--with-system-libmpdec} 옵션 기본값은 이제 @code{yes}입니다. 내장된 @cite{libmpdec} 사본은 Python 3.16에서 제거될 예정입니다.

@item 
@code{configure}에서 @ref{634,,--with-trace-refs} (참조 추적) 옵션을 사용해 빌드한 파이썬은 이제 파이썬 릴리스 빌드 및 @ref{508,,디버그 빌드}와 ABI 호환됩니다. (Victor Stinner가 gh-108634@footnote{https://github.com/python/cpython/issues/108634}를 통해 기능을 구현하였습니다.)

@item 
POSIX 시스템에서 이제 pkg-config(@code{.}) 파일 이름에 ABI 플래그가 포함됩니다. 예를 들어, 제한 없는 스레드를 사용하는(free-threaded) 빌드는 @cite{python-3.13t.pc}를 생성하고 디버그 빌드는 @cite{python-3.13d.pc}를 생성합니다.

@item 
@code{errno}, @code{fcntl}, @code{grp}, @code{md5}, @code{pwd}, @code{resource}, @code{termios}, @code{winsound}, @code{_ctypes_test}, @code{_multiprocessing.posixshmem}, @code{_scproxy}, @code{_stat}, @code{_statistics}, @code{_testconsole}, @code{_testimportmultiple}, 그리고 @code{_uuid} C 확장 모듈은 이제 @ref{635,,제한된 C API (limited-c-api)}로 빌드됩니다. (Victor Stinner가 gh-85283@footnote{https://github.com/python/cpython/issues/85283}를 통해 기능을 구현하였습니다.)
@end itemize

@node 파이썬 3 13으로의 코드 이식,회귀 테스트 변경 사항,빌드 변경 사항들,파이썬 3 13의 새로운 기능에 대해 알아봅시다
@anchor{whatsnew/3 13 porting-to-python-3-13}@anchor{472}
@subsection 파이썬 3.13으로의 (코드) 이식


해당하는 섹션을 통해, 앞서 설명한 변경 사항과, 코드 변경이 필요할 수 있는 기타 버그 수정 사항들을 나열하며 각각에 대한 설명을 드리고자 합니다.

@menu
* 파이썬 API 변경 사항:: 
* C API 변경사항:: 

@end menu

@node 파이썬 API 변경 사항,C API 변경사항,,파이썬 3 13으로의 코드 이식
@anchor{whatsnew/3 13 changes-in-the-python-api}@anchor{656}
@subsubsection 파이썬 API 변경 사항

@anchor{whatsnew/3 13 pep667-porting-notes-py}@anchor{4a7}

@itemize *

@item 
@ref{470,,PEP 667}는 @ref{46f,,locals()}와 @ref{4a6,,f_locals}의 의미 구조에 여러 변경 가능성을 제안하였습니다.


@itemize *

@item 
@ref{4a2,,최적화된 스코프(optimized scope)}에서 @ref{46f,,locals()}를 호출하면 호출할 때마다 서로 독립적인 스냅샷이 생성되며, 그 결과 이전에 반환된 참조는 더 이상 암시적으로 갱신되지 않습니다. 레거시 CPython 동작을 재현하려면, 처음에 반환된 딕셔너리를 이후의 @code{locals()} 호출 결과로 명시적으로 갱신해 주어야 합니다. @code{locals()}를 암시적으로 대상으로 하는 코드 실행 함수들(예를 들어, @cite{exec} 혹은 @cite{eval})은 최적화된 스코프(optimized scope)에서 실행 결과에 접근하려면 반드시 명시적인 네임 스페이스(namespace)을 전달받아야 합니다. (
@geindex Python 향상 제안; PEP 667
PEP 667@footnote{https://peps.python.org/pep-0667/}를 통해 제안된 가능성 중 일부가 적용된 결과입니다.)

@item 
모듈이나 클래스 스코프에서 컴프리헨션 내부에서(@cite{exec}혹은 @cite{eval}를 사용하는 경우를 포함하는 방식으로) @ref{46f,,locals()}를 호출하면, 다시 한 번 그 컴프리헨션이 독립적인 중첩 함수처럼 실행되는 것과 같은 방식으로 작동합니다. 이를 감싸고 있는(containing) 스코프의 지역 변수는 포함되지 않습니다. 파이썬 3.12에서는 
@geindex Python 향상 제안; PEP 709
PEP 709@footnote{https://peps.python.org/pep-0709/}을 통해 제안된 가능성 중 일부를 적용한 결과로, 감싸고 있는(containing) 스코프의 지역 변수까지 포함하도록 해당하는 동작이 구현되었던 적 있습니다. (현재 버전의 변경은, 
@geindex Python 향상 제안; PEP 667
PEP 667@footnote{https://peps.python.org/pep-0667/}를 통해 제안된 가능성 중 일부가 적용된 결과입니다.)

@item 
이제 @ref{4a2,,최적화된 스코프}에서 @ref{4a6,,FrameType.f_locals}에 접근하면, 특정 시점에만 갱신되는 스냅샷이 아니라 이어쓰기(write-through) 프록시가 반환됩니다. 스냅샷이 필요한 경우에는, @cite{dict} 생성자나 프록시의 @cite{.copy()} 메서드를 통해 명시적으로 만들어주셔야 합니다. (
@geindex Python 향상 제안; PEP 667
PEP 667@footnote{https://peps.python.org/pep-0667/}를 통해 제안된 가능성 중 일부가 적용된 결과입니다.)
@end itemize

@item 
@ref{217,,functools.partial}을 메서드로 사용할 경우 이제 @ref{657,,FutureWarning} 경고가 발생합니다. 해당하는 동작은 향후의 파이썬 버전에서 수정 변경될 예저입니다. 이전 방식의 동작을 그대로 유지하고자 하는 경우, @ref{453,,staticmethod()}로 감싸서 사용해주시기를 부탁드립니다. (Serhiy Storchaka가 gh-121027@footnote{https://github.com/python/cpython/issues/121027}를 통해 기능을 구현하였습니다.)

@item 
@ref{658,,getpass.getuser()}은 사용자 아이디 검색에 실패하면 비유닉스 플랫폼에서는 @ref{659,,ImportError}, 유닉스 플랫폼에서는 비밀번호 데이터베이스가 비어 있는 경우 @ref{5e5,,KeyError} 대신 @ref{2c0,,OSError}이 발생함을 유의해주시기를 부탁드립니다.

@item 
@ref{65a,,gzip.GzipFile}의 @code{mode} 어트리뷰트 값은 이제 정수형 (@code{1} 또는 @code{2}) 대신 문자열(@code{'rb'} 또는 @code{'wb'})입니다. @ref{65b,,zipfile.ZipFile.open()}에서 반환되는 읽기 가능한 파일형 객체의 @code{mode} 어트리뷰트 값은 이제 @code{'r'} 대신 @code{'rb'}입니다. (Serhiy Storchaka가 gh-115961@footnote{https://github.com/python/cpython/issues/115961}를 통해 기능을 구현하였습니다.)

@item 
@ref{65c,,mailbox.Maildir}는 이제 이름이 점(@code{'.'})으로 시작하는 파일을 무시합니다. (Zackery Spytz가 gh-65559@footnote{https://github.com/python/cpython/issues/65559}를 통해 기능을 구현하였습니다.)

@item 
@ref{537,,pathlib.Path.glob()} 및 @ref{538,,rglob()}는 이제 @code{"**"}로 끝나는 패턴이 주어지면 디렉터리뿐만 아니라 파일도 모두 반환합니다. 이전에는 디렉터리만 반환했습니다. 이전과 같이 디렉터리만 일치시키려면 패턴 끝에 슬래시를 추가하십시오.

@item 
@ref{f3,,threading} 모듈은 이제 @code{_thread} 모듈에 @code{_is_main_interpreter()} 함수가 정의되어 있는 것을 가정합니다. 해당하는 함수는 인자를 받지 않으며, 현재의 인터프리터가 메인 인터프리터이면 @cite{True}를 반환합니다.

커스텀 @code{_thread} 모듈을 제공하는 모든 라이브러리나 응용 프로그램은, 모듈의 다른 "비공개(private)" 어트리뷰트와 마찬가지로 @code{_is_main_interpreter()} 함수를 반드시 제공해야 합니다. (보다 자세한 내용은 gh-112826@footnote{https://github.com/python/cpython/issues/112826}를 참고 부탁드립니다.)
@end itemize

@node C API 변경사항,,파이썬 API 변경 사항,파이썬 3 13으로의 코드 이식
@anchor{whatsnew/3 13 changes-in-the-c-api}@anchor{65d}
@subsubsection C API 변경사항



@itemize *

@item 
@code{Python.h}는 더 이상 @code{<ieeefp.h>} 표준 헤더 파일을 포함하지 않습니다. 해당하는 헤더는 원래 @code{finite()} 함수를 제공하기 위해 포함되었으나, 이제 해당하는 함수는 @code{<math.h>} 헤더를 통해 제공됩니다. 이제는 필요한 경우에만 명시적으로 포함해야 합니다. 또한, @code{HAVE_IEEEFP_H} 매크로가 제거되었습니다. (Victor Stinner가 gh-108765@footnote{https://github.com/python/cpython/issues/108765}를 통해 기능을 구현하였습니다.)

@item 
@cite{Python.h}는 이제 @code{<time.h>}, @code{<sys/select.h>}, @code{<sys/time.h>} 표준 헤더 파일을 더 이상 포함하지 않습니다. 이제는 필요한 경우에만 해당하는 헤더들을 명시적으로 포함해야 합니다. 예를 들어, @code{<time.h>}는 @code{clock()} 및 @code{gmtime()} 함수를 제공하고, @cite{<sys/select.h>`는 :c:func:}!select` 함수를 제공하며, @code{<sys/time.h>}는 @code{futimes()}, @code{gettimeofday()}, @code{setitimer()} 함수들을 제공합니다. (Victor Stinner가 gh-108765@footnote{https://github.com/python/cpython/issues/108765}를 통해 기능을 구현하였습니다.)

@item 
Windows에서 @code{Python.h}는 더 이상 @code{<stddef.h>} 표준 헤더 파일을 포함하지 않습니다. 이제는 필요한 경우에만 해당하는 헤더들을 명시적으로 포함해야 합니다. 예를 들어, 해당하는 헤더는 @code{offsetof()} 함수와 @code{size_t} 및 @code{ptrdiff_t} 타입을 제공합니다. 다른 모든 플랫폼에서는 이미 @code{<stddef.h>}를 명시적으로 포함해야 했습니다. @code{HAVE_STDDEF_H} 매크로는 윈도우에서만 정의됩니다. (Victor Stinner가 gh-108765@footnote{https://github.com/python/cpython/issues/108765}를 통해 기능을 구현하였습니다.)

@item 
@ref{65e,,Py_LIMITED_API} 매크로가 정의된 경우, @code{Py_BUILD_CORE}, @code{Py_BUILD_CORE_BUILTIN}, 그리고 @code{Py_BUILD_CORE_MODULE} 매크로는 이제 @code{<Python.h>}에서 정의가 해제됩니다. (Victor Stinner가 gh-85283@footnote{https://github.com/python/cpython/issues/85283}를 통해 기능을 구현하였습니다.)

@item 
이전 trashcan 매크로인 @code{Py_TRASHCAN_SAFE_BEGIN}과 @code{Py_TRASHCAN_SAFE_END}가 제거되었습니다. 대신 보다 새로운 매크로인 @code{Py_TRASHCAN_BEGIN} 및 @code{Py_TRASHCAN_END}를 사용해주시기를 부탁드립니다.

이전 매크로를 사용하는 @code{tp_dealloc} 함수는 다음과 같이:

@example
static void
mytype_dealloc(mytype *p)
@{
    PyObject_GC_UnTrack(p);
    Py_TRASHCAN_SAFE_BEGIN(p);
    ...
    Py_TRASHCAN_SAFE_END
@}
@end example

새 매크로를 사용하는 방식으로 업데이트되어야 합니다.

@example
static void
mytype_dealloc(mytype *p)
@{
    PyObject_GC_UnTrack(p);
    Py_TRASHCAN_BEGIN(p, mytype_dealloc)
    ...
    Py_TRASHCAN_END
@}
@end example

@code{Py_TRASHCAN_BEGIN}의 두 번째 인자는 해당하는 매크로가 사용되는 할당 해제 함수 자신을 가리켜야 한다는 점을 유의해주십사 부탁드립니다. 새로운 매크로는 파이썬 3.8에서 추가되었고, 기존 매크로는 파이썬 3.11에서 사용 지원이 중단(deprecated)되었습니다. (Irit Katriel이 gh-105111@footnote{https://github.com/python/cpython/issues/105111}을 통해 기능을 구현하였습니다.)
@end itemize
@anchor{whatsnew/3 13 pep667-porting-notes-c}@anchor{4a8}

@itemize *

@item 
@ref{470,,PEP 667}은 프레임 관련 함수에 여러 변경 가능성을 제안합니다:


@itemize *

@item 
@ref{4a2,,최적화된 스코프}에서 @ref{5f5,,PyEval_GetLocals()}가 반환하는 딕셔너리를 변경했을 때의 작동 방식이 달라졌습니다. 추가된 새 딕셔너리 항목은 이제 해당 프레임에서 이어지는 @code{PyEval_GetLocals()} 호출에서만 `보이게' 됩니다. @ref{65f,,PyFrame_GetLocals()}, @ref{46f,,locals()}, @ref{4a6,,FrameType.f_locals}는 더 이상 동일한 하부 캐시 딕셔너리에 액세스하지 않습니다. 실제 변수 이름에 대한 항목과 이어쓰기(write-through) 프록시 인터페이스를 통해 추가된 이름에 대한 변경 사항은, 해당 프레임에서 @code{PyEval_GetLocals()}를 이어서 호출하는 경우에 덮어씁니다. 권장되는 코드 수정 방법은 그 함수가 어떻게 사용되고 있었는지에 따라 달라질 수 있습니다. 보다 자세한 내용의 경우 해당하는 함수에 대한 사용 지원 중단 안내(deprecation notice)를 참고해주시기를 부탁드립니다.

@item 
@ref{4a2,,최적화된 스코프}에서 @ref{65f,,PyFrame_GetLocals()}를 호출하면, 이제는 시점이 불분명하게 갱신되는 스냅샷 대신 이어쓰기(write-through) 프록시를 반환합니다. 스냅샷이 필요한 경우에는 명시적으로 (예를 들어, @ref{660,,PyDict_Copy()}를 통해) 만들거나 혹은 새로운 @ref{5f6,,PyEval_GetFrameLocals()} API를 호출하는 방법이 있습니다.

@item 
@code{PyFrame_FastToLocals`와 :c:func:()}!PyFrame_FastToLocalsWithError`는 더 이상 아무런 효과도 가지지 않습니다. 파이썬 3.11에 @ref{65f,,PyFrame_GetLocals()}이 도입된 이후로 해당하는 함수들을 호출하는 것이 불필요하다는 점에 유의해주시기를 부탁드립니다.

@item 
@code{PyFrame_LocalsToFast()}는 더 이상 아무런 효과도 가지지 않습니다. @ref{65f,,PyFrame_GetLocals()}이 @ref{4a2,,optimized scopes}에 대한 이어 쓰기 프록시를 반환하므로 해당하는 함수를 호출하는 것이 불필요하다는 점에 유의해주시기를 부탁드립니다.
@end itemize

@item 
파이썬 3.13은 많은 비공개(private) 함수들을 제거했습니다. 일부는 다음과 같은 방식으로 대체될 수 있습니다:


@itemize *

@item 
@code{_PyDict_Pop()} @ref{422,,PyDict_Pop()} 또는 @ref{5e3,,PyDict_PopString()};

@item 
@code{_PyDict_GetItemWithError()}: @ref{5e0,,PyDict_GetItemRef()};

@item 
@code{_PyErr_WriteUnraisableMsg()}:  @ref{5f0,,PyErr_FormatUnraisable()};

@item 
@code{_PyEval_SetTrace()} @ref{661,,PyEval_SetTrace()} 또는 @ref{662,,PyEval_SetTraceAllThreads()};

@item 
@code{_PyList_Extend()}: @ref{5fe,,PyList_Extend()};

@item 
@code{_PyLong_AsInt()}: @ref{602,,PyLong_AsInt()};

@item 
@code{_PyMem_RawStrdup()}: @code{strdup()};

@item 
@code{_PyMem_Strdup()}: @code{strdup()};

@item 
@code{_PyObject_ClearManagedDict()}: @ref{60c,,PyObject_ClearManagedDict()};

@item 
@code{_PyObject_VisitManagedDict()}: @ref{60b,,PyObject_VisitManagedDict()};

@item 
@code{_PyThreadState_UncheckedGet()}: @ref{423,,PyThreadState_GetUnchecked()};

@item 
@code{_PyTime_AsSecondsDouble()}: @ref{5d4,,PyTime_AsSecondsDouble()};

@item 
@code{_PyTime_GetMonotonicClock()} @ref{5d5,,PyTime_Monotonic()} 또는 @ref{5d6,,PyTime_MonotonicRaw()};

@item 
@code{_PyTime_GetPerfCounter()} @ref{5d7,,PyTime_PerfCounter()} 또는 @ref{5d8,,PyTime_PerfCounterRaw()};

@item 
@code{_PyTime_GetSystemClock()} @ref{5d9,,PyTime_Time()} 또는 @ref{5da,,PyTime_TimeRaw()};

@item 
@code{_PyTime_MAX}: @ref{5d3,,PyTime_MAX};

@item 
@code{_PyTime_MIN}: @ref{5d2,,PyTime_MIN};

@item 
@code{_PyTime_t}: @ref{5d1,,PyTime_t};

@item 
@code{_Py_HashPointer()}: @ref{425,,Py_HashPointer()};

@item 
@code{_Py_IsFinalizing()}: @ref{5fb,,Py_IsFinalizing()}.
@end itemize

파이썬 3.12 및 상위 버전에서  pythoncapi-compat 프로젝트@footnote{https://github.com/python/pythoncapi-compat/}를 통해 해당하는 새로운 함수 대부분을 사용할 수 있습니다.
@end itemize

@node 회귀 테스트 변경 사항,,파이썬 3 13으로의 코드 이식,파이썬 3 13의 새로운 기능에 대해 알아봅시다
@anchor{whatsnew/3 13 regression-test-changes}@anchor{663}
@subsection 회귀 테스트 변경 사항



@itemize *

@item 
@code{configure} @ref{664,,--with-pydebug}을 통해 빌드된 파이썬은 이제 @ref{16f,,-X presite=package.module}를 지원합니다. 해당하는 옵션을 사용하면 @code{site.py}이 실행되기 전에 인터프리터의 라이프 사이클 초기에 가져와야 하는 모듈들을 지정합니다. (Łukasz Langa가 gh-110769@footnote{https://github.com/python/cpython/issues/110769}를 통해 기능을 구현하였습니다.)
@end itemize

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node What’s New In Python 3 12,What’s New In Python 3 11,파이썬 3 13의 새로운 기능에 대해 알아봅시다,파이썬의 새로운 기능
@anchor{whatsnew/3 12 doc}@anchor{665}@anchor{whatsnew/3 12 translation-repo}@anchor{666}@anchor{whatsnew/3 12 what-s-new-in-python-3-12}@anchor{667}
@section What’s New In Python 3.12


@*Editor: 
Adam Turner


@c Rules for maintenance:
@c 
@c * Anyone can add text to this document.  Do not spend very much time
@c on the wording of your changes, because your text will probably
@c get rewritten to some degree.
@c 
@c * The maintainer will go through Misc/NEWS periodically and add
@c changes; it's therefore more important to add your changes to
@c Misc/NEWS than to this file.
@c 
@c * This is not a complete list of every single change; completeness
@c is the purpose of Misc/NEWS.  Some changes I consider too small
@c or esoteric to include.  If such a change is added to the text,
@c I'll just remove it.  (This is another reason you shouldn't spend
@c too much time on writing your addition.)
@c 
@c * If you want to draw your new text to the attention of the
@c maintainer, add 'XXX' to the beginning of the paragraph or
@c section.
@c 
@c * It's OK to just add a fragmentary note about a change.  For
@c example: "XXX Describe the transmogrify() function added to the
@c socket module."  The maintainer will research the change and
@c write the necessary text.
@c 
@c * You can comment out your additions if you like, but it's not
@c necessary (especially when a final release is some months away).
@c 
@c * Credit the author of a patch or bugfix.   Just the name is
@c sufficient; the e-mail address isn't necessary.
@c 
@c * It's helpful to add the issue number as a comment:
@c 
@c XXX Describe the transmogrify() function added to the socket
@c module.
@c (Contributed by P.Y. Developer in :gh:`12345`.)
@c 
@c This saves the maintainer the effort of going through the VCS log when
@c researching a change.

This article explains the new features in Python 3.12, compared to 3.11.
Python 3.12 was released on October 2, 2023.
For full details, see the @ref{142,,changelog}.


@subsubheading 더 보기


@geindex Python 향상 제안; PEP 693
PEP 693@footnote{https://peps.python.org/pep-0693/} – Python 3.12 Release Schedule


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

@end menu

@node Summary – Release highlights<2>,New Features,,What’s New In Python 3 12
@anchor{whatsnew/3 12 summary-release-highlights}@anchor{668}
@subsection Summary – Release highlights


@c This section singles out the most important changes in Python 3.12.
@c Brevity is key.

Python 3.12 is a stable release of the Python programming language,
with a mix of changes to the language and the standard library.
The library changes focus on cleaning up deprecated APIs, usability, and correctness.
Of note, the @code{distutils} package has been removed from the standard library.
Filesystem support in @ref{a5,,os} and @ref{a8,,pathlib} has seen a number of improvements,
and several modules have better performance.

The language changes focus on usability,
as @ref{669,,f-strings} have had many limitations removed
and ‘Did you mean …’ suggestions continue to improve.
The new @ref{66a,,type parameter syntax}
and @ref{66b,,type} statement improve ergonomics for using @ref{1a1,,generic types} and @ref{66c,,type aliases} with static type checkers.

This article doesn’t attempt to provide a complete specification of all new features,
but instead gives a convenient overview.
For full details, you should refer to the documentation,
such as the  @ref{149,,Library Reference}
and @ref{14a,,Language Reference}.
If you want to understand the complete implementation and design rationale for a change,
refer to the PEP for a particular new feature;
but note that PEPs usually are not kept up-to-date
once a feature has been fully implemented.


__________________________________________________________________


@c PEP-sized items next.

New syntax features:


@itemize *

@item 
@ref{66a,,PEP 695}, type parameter syntax and the @ref{66b,,type} statement
@end itemize

New grammar features:


@itemize *

@item 
@ref{66d,,PEP 701}, @ref{669,,f-strings} in the grammar
@end itemize

Interpreter improvements:


@itemize *

@item 
@ref{66e,,PEP 684}, a unique per-interpreter @ref{474,,GIL}

@item 
@ref{66f,,PEP 669}, low impact monitoring

@item 
@ref{670,,Improved 'Did you mean ...' suggestions}@anchor{whatsnew/3 12 improved-error-messages}@anchor{670}
for @ref{452,,NameError}, @ref{659,,ImportError}, and @ref{18e,,SyntaxError} exceptions
@end itemize

Python data model improvements:


@itemize *

@item 
@ref{671,,PEP 688}, using the @ref{260,,buffer protocol} from Python
@end itemize

Significant improvements in the standard library:


@itemize *

@item 
The @ref{266,,pathlib.Path} class now supports subclassing

@item 
The @ref{a5,,os} module received several improvements for Windows support

@item 
A @ref{672,,command-line interface} has been added to the
@ref{d4,,sqlite3} module

@item 
@ref{2ad,,isinstance()} checks against @ref{673,,runtime-checkable protocols} enjoy a speed up of between two and 20 times

@item 
The @ref{b,,asyncio} package has had a number of performance improvements,
with some benchmarks showing a 75% speed up.

@item 
A @ref{674,,command-line interface} has been added to the
@ref{116,,uuid} module

@item 
Due to the changes in @ref{66d,,PEP 701},
producing tokens via the @ref{101,,tokenize} module is up to 64% faster.
@end itemize

Security improvements:


@itemize *

@item 
Replace the builtin @ref{6c,,hashlib} implementations of
SHA1, SHA3, SHA2-384, SHA2-512, and MD5 with formally verified code from the
HACL*@footnote{https://github.com/hacl-star/hacl-star/} project.
These builtin implementations remain as fallbacks that are only used when
OpenSSL does not provide them.
@end itemize

C API improvements:


@itemize *

@item 
@ref{675,,PEP 697}, unstable C API tier

@item 
@ref{676,,PEP 683}, immortal objects
@end itemize

CPython implementation improvements:


@itemize *

@item 
@ref{677,,PEP 709}, comprehension inlining

@item 
@ref{4b0,,CPython support} for the Linux @code{perf} profiler

@item 
Implement stack overflow protection on supported platforms
@end itemize

New typing features:


@itemize *

@item 
@ref{678,,PEP 692}, using @ref{332,,TypedDict} to
annotate @ref{679,,**kwargs}

@item 
@ref{67a,,PEP 698}, @ref{67b,,typing.override()} decorator
@end itemize

Important deprecations, removals or restrictions:


@itemize *

@item 
@geindex Python 향상 제안; PEP 623
PEP 623@footnote{https://peps.python.org/pep-0623/}: Remove @code{wstr} from Unicode objects in Python’s C API,
reducing the size of every @ref{169,,str} object by at least 8 bytes.

@item 
@geindex Python 향상 제안; PEP 632
PEP 632@footnote{https://peps.python.org/pep-0632/}: Remove the @code{distutils} package.
See 
@geindex Python 향상 제안; PEP 0632#migration-advice
the migration guide@footnote{https://peps.python.org/pep-0632/#migration-advice}
for advice replacing the APIs it provided.
The third-party Setuptools@footnote{https://setuptools.pypa.io/en/latest/deprecated/distutils-legacy.html}
package continues to provide @code{distutils},
if you still require it in Python 3.12 and beyond.

@item 
gh-95299@footnote{https://github.com/python/cpython/issues/95299}: Do not pre-install @code{setuptools} in virtual environments
created with @ref{117,,venv}.
This means that @code{distutils}, @code{setuptools}, @code{pkg_resources},
and @code{easy_install} will no longer available by default; to access these
run @code{pip install setuptools} in the @ref{67c,,activated}
virtual environment.

@item 
The @code{asynchat}, @code{asyncore}, and @code{imp} modules have been
removed, along with several @ref{2b3,,unittest.TestCase}
@ref{67d,,method aliases}@anchor{whatsnew/3 12 unittest-testcase-removed-aliases}@anchor{67d}.
@end itemize

@node New Features,New Features Related to Type Hints,Summary – Release highlights<2>,What’s New In Python 3 12
@anchor{whatsnew/3 12 new-features}@anchor{67e}
@subsection New Features


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

@end menu

@node PEP 695 Type Parameter Syntax,PEP 701 Syntactic formalization of f-strings,,New Features
@anchor{whatsnew/3 12 pep-695-type-parameter-syntax}@anchor{67f}@anchor{whatsnew/3 12 whatsnew312-pep695}@anchor{66a}
@subsubsection PEP 695: Type Parameter Syntax


Generic classes and functions under 
@geindex Python 향상 제안; PEP 484
PEP 484@footnote{https://peps.python.org/pep-0484/} were declared using a verbose syntax
that left the scope of type parameters unclear and required explicit declarations of
variance.

@geindex Python 향상 제안; PEP 695
PEP 695@footnote{https://peps.python.org/pep-0695/} introduces a new, more compact and explicit way to create
@ref{680,,generic classes} and @ref{681,,functions}:

@example
def max[T](args: Iterable[T]) -> T:
    ...

class list[T]:
    def __getitem__(self, index: int, /) -> T:
        ...

    def append(self, element: T) -> None:
        ...
@end example

In addition, the PEP introduces a new way to declare @ref{682,,type aliases}
using the @ref{66b,,type} statement, which creates an instance of
@ref{2ae,,TypeAliasType}:

@example
type Point = tuple[float, float]
@end example

Type aliases can also be @ref{683,,generic}:

@example
type Point[T] = tuple[T, T]
@end example

The new syntax allows declaring @ref{489,,TypeVarTuple}
and @ref{488,,ParamSpec} parameters, as well as @ref{487,,TypeVar}
parameters with bounds or constraints:

@example
type IntFunc[**P] = Callable[P, int]  # ParamSpec
type LabeledTuple[*Ts] = tuple[str, *Ts]  # TypeVarTuple
type HashableSequence[T: Hashable] = Sequence[T]  # TypeVar with bound
type IntOrStrSequence[T: (int, str)] = Sequence[T]  # TypeVar with constraints
@end example

The value of type aliases and the bound and constraints of type variables
created through this syntax are evaluated only on demand (see
@ref{684,,lazy evaluation}). This means type aliases are able to
refer to other types defined later in the file.

Type parameters declared through a type parameter list are visible within the
scope of the declaration and any nested scopes, but not in the outer scope. For
example, they can be used in the type annotations for the methods of a generic
class or in the class body. However, they cannot be used in the module scope after
the class is defined. See @ref{5ac,,Type parameter lists} for a detailed description of the
runtime semantics of type parameters.

In order to support these scoping semantics, a new kind of scope is introduced,
the @ref{4ac,,annotation scope}. Annotation scopes behave for the
most part like function scopes, but interact differently with enclosing class scopes.
In Python 3.13, @ref{15c,,annotations} will also be evaluated in
annotation scopes.

See 
@geindex Python 향상 제안; PEP 695
PEP 695@footnote{https://peps.python.org/pep-0695/} for more details.

(PEP written by Eric Traut. Implementation by Jelle Zijlstra, Eric Traut,
and others in gh-103764@footnote{https://github.com/python/cpython/issues/103764}.)

@node PEP 701 Syntactic formalization of f-strings,PEP 684 A Per-Interpreter GIL,PEP 695 Type Parameter Syntax,New Features
@anchor{whatsnew/3 12 pep-701-syntactic-formalization-of-f-strings}@anchor{685}@anchor{whatsnew/3 12 whatsnew312-pep701}@anchor{66d}
@subsubsection PEP 701: Syntactic formalization of f-strings


@geindex Python 향상 제안; PEP 701
PEP 701@footnote{https://peps.python.org/pep-0701/} lifts some restrictions on the usage of @ref{669,,f-strings}.
Expression components inside f-strings can now be any valid Python expression,
including strings reusing the same quote as the containing f-string,
multi-line expressions, comments, backslashes, and unicode escape sequences.
Let’s cover these in detail:


@itemize *

@item 
Quote reuse: in Python 3.11, reusing the same quotes as the enclosing f-string
raises a @ref{18e,,SyntaxError}, forcing the user to either use other available
quotes (like using double quotes or triple quotes if the f-string uses single
quotes). In Python 3.12, you can now do things like this:

@example
>>> songs = ['Take me back to Eden', 'Alkaline', 'Ascensionism']
>>> f"This is the playlist: @{", ".join(songs)@}"
'This is the playlist: Take me back to Eden, Alkaline, Ascensionism'
@end example

Note that before this change there was no explicit limit in how f-strings can
be nested, but the fact that string quotes cannot be reused inside the
expression component of f-strings made it impossible to nest f-strings
arbitrarily. In fact, this is the most nested f-string that could be written:

@example
>>> f"""@{f'@w{'}'@{f'@{f"@{1+1@}"@}'@}'@w{'}'@}"""
'2'
@end example

As now f-strings can contain any valid Python expression inside expression
components, it is now possible to nest f-strings arbitrarily:

@example
>>> f"@{f"@{f"@{f"@{f"@{f"@{1+1@}"@}"@}"@}"@}"@}"
'2'
@end example

@item 
Multi-line expressions and comments: In Python 3.11, f-string expressions
must be defined in a single line, even if the expression within the f-string
could normally span multiple lines
(like literal lists being defined over multiple lines),
making them harder to read. In Python 3.12 you can now define f-strings
spanning multiple lines, and add inline comments:

@example
>>> f"This is the playlist: @{", ".join([
...     'Take me back to Eden',  # My, my, those eyes like fire
...     'Alkaline',              # Not acid nor alkaline
...     'Ascensionism'           # Take to the broken skies at last
... ])@}"
'This is the playlist: Take me back to Eden, Alkaline, Ascensionism'
@end example

@item 
Backslashes and unicode characters: before Python 3.12 f-string expressions
couldn’t contain any @code{\} character. This also affected unicode @ref{686,,escape sequences} (such as @code{\N@{snowman@}}) as these contain
the @code{\N} part that previously could not be part of expression components of
f-strings. Now, you can define expressions like this:

@example
>>> print(f"This is the playlist: @{"\n".join(songs)@}")
This is the playlist: Take me back to Eden
Alkaline
Ascensionism
>>> print(f"This is the playlist: @{"\N@{BLACK HEART SUIT@}".join(songs)@}")
This is the playlist: Take me back to Eden♥Alkaline♥Ascensionism
@end example
@end itemize

See 
@geindex Python 향상 제안; PEP 701
PEP 701@footnote{https://peps.python.org/pep-0701/} for more details.

As a positive side-effect of how this feature has been implemented (by parsing f-strings
with 
@geindex Python 향상 제안; PEP 617
the PEG parser@footnote{https://peps.python.org/pep-0617/}), now error messages for f-strings are more precise
and include the exact location of the error. For example, in Python 3.11, the following
f-string raises a @ref{18e,,SyntaxError}:

@example
>>> my_string = f"@{x z y@}" + f"@{1 + 1@}"
  File "<stdin>", line 1
    (x z y)
     ^^^
SyntaxError: f-string: invalid syntax. Perhaps you forgot a comma?
@end example

but the error message doesn’t include the exact location of the error within the line and
also has the expression artificially surrounded by parentheses. In Python 3.12, as f-strings
are parsed with the PEG parser, error messages can be more precise and show the entire line:

@example
>>> my_string = f"@{x z y@}" + f"@{1 + 1@}"
  File "<stdin>", line 1
    my_string = f"@{x z y@}" + f"@{1 + 1@}"
                   ^^^
SyntaxError: invalid syntax. Perhaps you forgot a comma?
@end example

(Contributed by Pablo Galindo, Batuhan Taskaya, Lysandros Nikolaou, Cristián
Maureira-Fredes and Marta Gómez in gh-102856@footnote{https://github.com/python/cpython/issues/102856}. PEP written by Pablo Galindo,
Batuhan Taskaya, Lysandros Nikolaou and Marta Gómez).

@node PEP 684 A Per-Interpreter GIL,PEP 669 Low impact monitoring for CPython,PEP 701 Syntactic formalization of f-strings,New Features
@anchor{whatsnew/3 12 pep-684-a-per-interpreter-gil}@anchor{687}@anchor{whatsnew/3 12 whatsnew312-pep684}@anchor{66e}
@subsubsection PEP 684: A Per-Interpreter GIL


@geindex Python 향상 제안; PEP 684
PEP 684@footnote{https://peps.python.org/pep-0684/} introduces a per-interpreter @ref{474,,GIL},
so that sub-interpreters may now be created with a unique GIL per interpreter.
This allows Python programs to take full advantage of multiple CPU
cores. This is currently only available through the C-API,
though a Python API is 
@geindex Python 향상 제안; PEP 554
anticipated for 3.13@footnote{https://peps.python.org/pep-0554/}.

Use the new @ref{688,,Py_NewInterpreterFromConfig()} function to
create an interpreter with its own GIL:

@example
PyInterpreterConfig config = @{
    .check_multi_interp_extensions = 1,
    .gil = PyInterpreterConfig_OWN_GIL,
@};
PyThreadState *tstate = NULL;
PyStatus status = Py_NewInterpreterFromConfig(&tstate, &config);
if (PyStatus_Exception(status)) @{
    return -1;
@}
/* The new interpreter is now active in the current thread. */
@end example

For further examples how to use the C-API for sub-interpreters with a
per-interpreter GIL, see @code{Modules/_xxsubinterpretersmodule.c}.

(Contributed by Eric Snow in gh-104210@footnote{https://github.com/python/cpython/issues/104210}, etc.)

@node PEP 669 Low impact monitoring for CPython,PEP 688 Making the buffer protocol accessible in Python,PEP 684 A Per-Interpreter GIL,New Features
@anchor{whatsnew/3 12 pep-669-low-impact-monitoring-for-cpython}@anchor{689}@anchor{whatsnew/3 12 whatsnew312-pep669}@anchor{66f}
@subsubsection PEP 669: Low impact monitoring for CPython


@geindex Python 향상 제안; PEP 669
PEP 669@footnote{https://peps.python.org/pep-0669/} defines a new @ref{e0,,API} for profilers,
debuggers, and other tools to monitor events in CPython.
It covers a wide range of events, including calls,
returns, lines, exceptions, jumps, and more.
This means that you only pay for what you use, providing support
for near-zero overhead debuggers and coverage tools.
See  @code{sys.monitoring} for details.

(Contributed by Mark Shannon in gh-103082@footnote{https://github.com/python/cpython/issues/103082}.)

@node PEP 688 Making the buffer protocol accessible in Python,PEP 709 Comprehension inlining,PEP 669 Low impact monitoring for CPython,New Features
@anchor{whatsnew/3 12 pep-688-making-the-buffer-protocol-accessible-in-python}@anchor{68a}@anchor{whatsnew/3 12 whatsnew312-pep688}@anchor{671}
@subsubsection PEP 688: Making the buffer protocol accessible in Python


@geindex Python 향상 제안; PEP 688
PEP 688@footnote{https://peps.python.org/pep-0688/} introduces a way to use the @ref{260,,buffer protocol}
from Python code. Classes that implement the @ref{68b,,__buffer__()} method
are now usable as buffer types.

The new @ref{343,,collections.abc.Buffer} ABC provides a standard
way to represent buffer objects, for example in type annotations.
The new @ref{68c,,inspect.BufferFlags} enum represents the flags that
can be used to customize buffer creation.
(Contributed by Jelle Zijlstra in gh-102500@footnote{https://github.com/python/cpython/issues/102500}.)

@node PEP 709 Comprehension inlining,Improved Error Messages,PEP 688 Making the buffer protocol accessible in Python,New Features
@anchor{whatsnew/3 12 pep-709-comprehension-inlining}@anchor{68d}@anchor{whatsnew/3 12 whatsnew312-pep709}@anchor{677}
@subsubsection PEP 709: Comprehension inlining


Dictionary, list, and set comprehensions are now inlined, rather than creating a
new single-use function object for each execution of the comprehension. This
speeds up execution of a comprehension by up to two times.
See 
@geindex Python 향상 제안; PEP 709
PEP 709@footnote{https://peps.python.org/pep-0709/} for further details.

Comprehension iteration variables remain isolated and don’t overwrite a
variable of the same name in the outer scope, nor are they visible after the
comprehension. Inlining does result in a few visible behavior changes:


@itemize *

@item 
There is no longer a separate frame for the comprehension in tracebacks,
and tracing/profiling no longer shows the comprehension as a function call.

@item 
The @ref{de,,symtable} module will no longer produce child symbol tables for each
comprehension; instead, the comprehension’s locals will be included in the
parent function’s symbol table.

@item 
Calling @ref{46f,,locals()} inside a comprehension now includes variables
from outside the comprehension, and no longer includes the synthetic @code{.0}
variable for the comprehension “argument”.

@item 
A comprehension iterating directly over @code{locals()} (e.g. @code{[k for k in
locals()]}) may see “RuntimeError: dictionary changed size during iteration”
when run under tracing (e.g. code coverage measurement). This is the same
behavior already seen in e.g. @code{for k in locals():}. To avoid the error, first
create a list of keys to iterate over: @code{keys = list(locals()); [k for k in
keys]}.
@end itemize

(Contributed by Carl Meyer and Vladimir Matveev in 
@geindex Python 향상 제안; PEP 709
PEP 709@footnote{https://peps.python.org/pep-0709/}.)

@node Improved Error Messages,,PEP 709 Comprehension inlining,New Features

@subsubsection Improved Error Messages



@itemize *

@item 
Modules from the standard library are now potentially suggested as part of
the error messages displayed by the interpreter when a @ref{452,,NameError} is
raised to the top level. (Contributed by Pablo Galindo in gh-98254@footnote{https://github.com/python/cpython/issues/98254}.)

@example
>>> sys.version_info
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'sys' is not defined. Did you forget to import 'sys'?
@end example

@item 
Improve the error suggestion for @ref{452,,NameError} exceptions for instances.
Now if a @code{NameError} is raised in a method and the instance has an
attribute that’s exactly equal to the name in the exception, the suggestion
will include @code{self.<NAME>} instead of the closest match in the method
scope. (Contributed by Pablo Galindo in gh-99139@footnote{https://github.com/python/cpython/issues/99139}.)

@example
>>> class A:
...    def __init__(self):
...        self.blech = 1
...
...    def foo(self):
...        somethin = blech
...
>>> A().foo()
Traceback (most recent call last):
  File "<stdin>", line 1
    somethin = blech
               ^^^^^
NameError: name 'blech' is not defined. Did you mean: 'self.blech'?
@end example

@item 
Improve the @ref{18e,,SyntaxError} error message when the user types @code{import x
from y} instead of @code{from y import x}. (Contributed by Pablo Galindo in gh-98931@footnote{https://github.com/python/cpython/issues/98931}.)

@example
>>> import a.y.z from b.y.z
Traceback (most recent call last):
  File "<stdin>", line 1
    import a.y.z from b.y.z
    ^^^^^^^^^^^^^^^^^^^^^^^
SyntaxError: Did you mean to use 'from ... import ...' instead?
@end example

@item 
@ref{659,,ImportError} exceptions raised from failed @code{from <module> import
<name>} statements now include suggestions for the value of @code{<name>} based on the
available names in @code{<module>}. (Contributed by Pablo Galindo in gh-91058@footnote{https://github.com/python/cpython/issues/91058}.)

@example
>>> from collections import chainmap
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: cannot import name 'chainmap' from 'collections'. Did you mean: 'ChainMap'?
@end example
@end itemize

@node New Features Related to Type Hints,Other Language Changes,New Features,What’s New In Python 3 12
@anchor{whatsnew/3 12 new-features-related-to-type-hints}@anchor{68e}
@subsection New Features Related to Type Hints


This section covers major changes affecting 
@geindex Python 향상 제안; PEP 484
type hints@footnote{https://peps.python.org/pep-0484/} and
the @ref{10a,,typing} module.

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

@end menu

@node PEP 692 Using TypedDict for more precise **kwargs typing,PEP 698 Override Decorator for Static Typing,,New Features Related to Type Hints
@anchor{whatsnew/3 12 pep-692-using-typeddict-for-more-precise-kwargs-typing}@anchor{68f}@anchor{whatsnew/3 12 whatsnew312-pep692}@anchor{678}
@subsubsection PEP 692: Using @code{TypedDict} for more precise @code{**kwargs} typing


Typing @code{**kwargs} in a function signature as introduced by 
@geindex Python 향상 제안; PEP 484
PEP 484@footnote{https://peps.python.org/pep-0484/} allowed
for valid annotations only in cases where all of the @code{**kwargs} were of the
same type.

@geindex Python 향상 제안; PEP 692
PEP 692@footnote{https://peps.python.org/pep-0692/} specifies a more precise way of typing @code{**kwargs} by relying on
typed dictionaries:

@example
from typing import TypedDict, Unpack

class Movie(TypedDict):
  name: str
  year: int

def foo(**kwargs: Unpack[Movie]): ...
@end example

See 
@geindex Python 향상 제안; PEP 692
PEP 692@footnote{https://peps.python.org/pep-0692/} for more details.

(Contributed by Franek Magiera in gh-103629@footnote{https://github.com/python/cpython/issues/103629}.)

@node PEP 698 Override Decorator for Static Typing,,PEP 692 Using TypedDict for more precise **kwargs typing,New Features Related to Type Hints
@anchor{whatsnew/3 12 pep-698-override-decorator-for-static-typing}@anchor{690}@anchor{whatsnew/3 12 whatsnew312-pep698}@anchor{67a}
@subsubsection PEP 698: Override Decorator for Static Typing


A new decorator @ref{67b,,typing.override()} has been added to the @ref{10a,,typing}
module. It indicates to type checkers that the method is intended to override
a method in a superclass. This allows type checkers to catch mistakes where
a method that is intended to override something in a base class
does not in fact do so.

Example:

@example
from typing import override

class Base:
  def get_color(self) -> str:
    return "blue"

class GoodChild(Base):
  @@override  # ok: overrides Base.get_color
  def get_color(self) -> str:
    return "yellow"

class BadChild(Base):
  @@override  # type checker error: does not override Base.get_color
  def get_colour(self) -> str:
    return "red"
@end example

See 
@geindex Python 향상 제안; PEP 698
PEP 698@footnote{https://peps.python.org/pep-0698/} for more details.

(Contributed by Steven Troxler in gh-101561@footnote{https://github.com/python/cpython/issues/101561}.)

@node Other Language Changes,New Modules,New Features Related to Type Hints,What’s New In Python 3 12
@anchor{whatsnew/3 12 other-language-changes}@anchor{691}
@subsection Other Language Changes



@itemize *

@item 
The parser now raises @ref{18e,,SyntaxError} when parsing source code containing
null bytes. (Contributed by Pablo Galindo in gh-96670@footnote{https://github.com/python/cpython/issues/96670}.)

@item 
A backslash-character pair that is not a valid escape sequence now generates
a @ref{1ae,,SyntaxWarning}, instead of @ref{1a3,,DeprecationWarning}.
For example, @code{re.compile("\d+\.\d+")} now emits a @code{SyntaxWarning}
(@code{"\d"} is an invalid escape sequence, use raw strings for regular
expression: @code{re.compile(r"\d+\.\d+")}).
In a future Python version, @ref{18e,,SyntaxError} will eventually be raised,
instead of @code{SyntaxWarning}.
(Contributed by Victor Stinner in gh-98401@footnote{https://github.com/python/cpython/issues/98401}.)

@item 
Octal escapes with value larger than @code{0o377} (ex: @code{"\477"}), deprecated
in Python 3.11, now produce a @ref{1ae,,SyntaxWarning}, instead of
@ref{1a3,,DeprecationWarning}.
In a future Python version they will be eventually a @ref{18e,,SyntaxError}.
(Contributed by Victor Stinner in gh-98401@footnote{https://github.com/python/cpython/issues/98401}.)

@item 
Variables used in the target part of comprehensions that are not stored to
can now be used in assignment expressions (@code{:=}).
For example, in @code{[(b := 1) for a, b.prop in some_iter]}, the assignment to
@code{b} is now allowed. Note that assigning to variables stored to in the target
part of comprehensions (like @code{a}) is still disallowed, as per 
@geindex Python 향상 제안; PEP 572
PEP 572@footnote{https://peps.python.org/pep-0572/}.
(Contributed by Nikita Sobolev in gh-100581@footnote{https://github.com/python/cpython/issues/100581}.)

@item 
Exceptions raised in a class or type’s @code{__set_name__} method are no longer
wrapped by a @ref{244,,RuntimeError}. Context information is added to the
exception as a 
@geindex Python 향상 제안; PEP 678
PEP 678@footnote{https://peps.python.org/pep-0678/} note. (Contributed by Irit Katriel in gh-77757@footnote{https://github.com/python/cpython/issues/77757}.)

@item 
When a @code{try-except*} construct handles the entire @ref{4d3,,ExceptionGroup}
and raises one other exception, that exception is no longer wrapped in an
@code{ExceptionGroup}. Also changed in version 3.11.4. (Contributed by Irit
Katriel in gh-103590@footnote{https://github.com/python/cpython/issues/103590}.)

@item 
The Garbage Collector now runs only on the eval breaker mechanism of the
Python bytecode evaluation loop instead of object allocations. The GC can
also run when @ref{692,,PyErr_CheckSignals()} is called so C extensions that
need to run for a long time without executing any Python code also have a
chance to execute the GC periodically. (Contributed by Pablo Galindo in
gh-97922@footnote{https://github.com/python/cpython/issues/97922}.)

@item 
All builtin and extension callables expecting boolean parameters now accept
arguments of any type instead of just @ref{3c3,,bool} and @ref{19b,,int}.
(Contributed by Serhiy Storchaka in gh-60203@footnote{https://github.com/python/cpython/issues/60203}.)

@item 
@ref{165,,memoryview} now supports the half-float type (the “e” format code).
(Contributed by Donghee Na and Antoine Pitrou in gh-90751@footnote{https://github.com/python/cpython/issues/90751}.)

@item 
@ref{693,,slice} objects are now hashable, allowing them to be used as dict keys and
set items. (Contributed by Will Bradshaw, Furkan Onder, and Raymond Hettinger in gh-101264@footnote{https://github.com/python/cpython/issues/101264}.)

@item 
@ref{694,,sum()} now uses Neumaier summation to improve accuracy and commutativity
when summing floats or mixed ints and floats.
(Contributed by Raymond Hettinger in gh-100425@footnote{https://github.com/python/cpython/issues/100425}.)

@item 
@ref{1c2,,ast.parse()} now raises @ref{18e,,SyntaxError} instead of @ref{2ec,,ValueError}
when parsing source code containing null bytes. (Contributed by Pablo Galindo
in gh-96670@footnote{https://github.com/python/cpython/issues/96670}.)

@item 
The extraction methods in @ref{e4,,tarfile}, and @ref{695,,shutil.unpack_archive()},
have a new a `filter' argument that allows limiting tar features than may be
surprising or dangerous, such as creating files outside the destination
directory.
See @ref{696,,tarfile extraction filters} for details.
In Python 3.14, the default will switch to @code{'data'}.
(Contributed by Petr Viktorin in 
@geindex Python 향상 제안; PEP 706
PEP 706@footnote{https://peps.python.org/pep-0706/}.)

@item 
@ref{697,,types.MappingProxyType} instances are now hashable if the underlying
mapping is hashable.
(Contributed by Serhiy Storchaka in gh-87995@footnote{https://github.com/python/cpython/issues/87995}.)

@item 
Add @ref{4b0,,support for the perf profiler} through the new
environment variable 
@geindex PYTHONPERFSUPPORT
@geindex 환경 변수; PYTHONPERFSUPPORT
@ref{698,,PYTHONPERFSUPPORT}
and command-line option @ref{16f,,-X perf},
as well as the new @ref{699,,sys.activate_stack_trampoline()},
@ref{69a,,sys.deactivate_stack_trampoline()},
and @ref{69b,,sys.is_stack_trampoline_active()} functions.
(Design by Pablo Galindo. Contributed by Pablo Galindo and Christian Heimes
with contributions from Gregory P. Smith [Google] and Mark Shannon
in gh-96123@footnote{https://github.com/python/cpython/issues/96123}.)
@end itemize

@node New Modules,Improved Modules,Other Language Changes,What’s New In Python 3 12
@anchor{whatsnew/3 12 new-modules}@anchor{69c}
@subsection New Modules



@itemize *

@item 
None.
@end itemize

@node Improved Modules,Optimizations<2>,New Modules,What’s New In Python 3 12
@anchor{whatsnew/3 12 improved-modules}@anchor{69d}
@subsection Improved Modules


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

@end menu

@node array<2>,asyncio<5>,,Improved Modules
@anchor{whatsnew/3 12 array}@anchor{69e}
@subsubsection array



@itemize *

@item 
The @ref{4c0,,array.array} class now supports subscripting, making it a
@ref{1a1,,generic type}. (Contributed by Jelle Zijlstra in gh-98658@footnote{https://github.com/python/cpython/issues/98658}.)
@end itemize

@node asyncio<5>,calendar<2>,array<2>,Improved Modules
@anchor{whatsnew/3 12 asyncio}@anchor{69f}
@subsubsection asyncio



@itemize *

@item 
The performance of writing to sockets in @ref{b,,asyncio} has been
significantly improved. @code{asyncio} now avoids unnecessary copying when
writing to sockets and uses @ref{6a0,,sendmsg()} if the platform
supports it. (Contributed by Kumar Aditya in gh-91166@footnote{https://github.com/python/cpython/issues/91166}.)

@item 
Add @ref{6a1,,asyncio.eager_task_factory()} and @ref{6a2,,asyncio.create_eager_task_factory()}
functions to allow opting an event loop in to eager task execution,
making some use-cases 2x to 5x faster.
(Contributed by Jacob Bower & Itamar Oren in gh-102853@footnote{https://github.com/python/cpython/issues/102853}, gh-104140@footnote{https://github.com/python/cpython/issues/104140}, and gh-104138@footnote{https://github.com/python/cpython/issues/104138})

@item 
On Linux, @ref{b,,asyncio} uses @code{asyncio.PidfdChildWatcher} by default
if @ref{6a3,,os.pidfd_open()} is available and functional instead of
@code{asyncio.ThreadedChildWatcher}.
(Contributed by Kumar Aditya in gh-98024@footnote{https://github.com/python/cpython/issues/98024}.)

@item 
The event loop now uses the best available child watcher for each platform
(@code{asyncio.PidfdChildWatcher} if supported and
@code{asyncio.ThreadedChildWatcher} otherwise), so manually
configuring a child watcher is not recommended.
(Contributed by Kumar Aditya in gh-94597@footnote{https://github.com/python/cpython/issues/94597}.)

@item 
Add `loop_factory' parameter to @ref{2f3,,asyncio.run()} to allow specifying
a custom event loop factory.
(Contributed by Kumar Aditya in gh-99388@footnote{https://github.com/python/cpython/issues/99388}.)

@item 
Add C implementation of @ref{6a4,,asyncio.current_task()} for 4x-6x speedup.
(Contributed by Itamar Oren and Pranav Thulasiram Bhat in gh-100344@footnote{https://github.com/python/cpython/issues/100344}.)

@item 
@ref{6a5,,asyncio.iscoroutine()} now returns @code{False} for generators as
@ref{b,,asyncio} does not support legacy generator-based coroutines.
(Contributed by Kumar Aditya in gh-102748@footnote{https://github.com/python/cpython/issues/102748}.)

@item 
@ref{6a6,,asyncio.wait()} and @ref{4c7,,asyncio.as_completed()} now accepts generators
yielding tasks.
(Contributed by Kumar Aditya in gh-78530@footnote{https://github.com/python/cpython/issues/78530}.)
@end itemize

@node calendar<2>,csv,asyncio<5>,Improved Modules
@anchor{whatsnew/3 12 calendar}@anchor{6a7}
@subsubsection calendar



@itemize *

@item 
Add enums @ref{6a8,,calendar.Month} and @ref{6a9,,calendar.Day}
defining months of the year and days of the week.
(Contributed by Prince Roshan in gh-103636@footnote{https://github.com/python/cpython/issues/103636}.)
@end itemize

@node csv,dis<3>,calendar<2>,Improved Modules
@anchor{whatsnew/3 12 csv}@anchor{6aa}
@subsubsection csv



@itemize *

@item 
Add @ref{6ab,,csv.QUOTE_NOTNULL} and @ref{6ac,,csv.QUOTE_STRINGS} flags to
provide finer grained control of @code{None} and empty strings by
@ref{6ad,,reader} and @ref{6ae,,writer} objects.
@end itemize

@node dis<3>,fractions<3>,csv,Improved Modules
@anchor{whatsnew/3 12 dis}@anchor{6af}
@subsubsection dis



@itemize *

@item 
Pseudo instruction opcodes (which are used by the compiler but
do not appear in executable bytecode) are now exposed in the
@ref{3c,,dis} module.
@ref{6b0,,HAVE_ARGUMENT} is still relevant to real opcodes,
but it is not useful for pseudo instructions. Use the new
@ref{59e,,dis.hasarg} collection instead.
(Contributed by Irit Katriel in gh-94216@footnote{https://github.com/python/cpython/issues/94216}.)

@item 
Add the @ref{6b1,,dis.hasexc} collection to signify instructions that set
an exception handler. (Contributed by Irit Katriel in gh-94216@footnote{https://github.com/python/cpython/issues/94216}.)
@end itemize

@node fractions<3>,importlib resources,dis<3>,Improved Modules
@anchor{whatsnew/3 12 fractions}@anchor{6b2}
@subsubsection fractions



@itemize *

@item 
Objects of type @ref{213,,fractions.Fraction} now support float-style
formatting. (Contributed by Mark Dickinson in gh-100161@footnote{https://github.com/python/cpython/issues/100161}.)
@end itemize

@node importlib resources,inspect<2>,fractions<3>,Improved Modules
@anchor{whatsnew/3 12 importlib-resources}@anchor{6b3}
@subsubsection importlib.resources



@itemize *

@item 
@ref{6b4,,importlib.resources.as_file()} now supports resource directories.
(Contributed by Jason R. Coombs in gh-97930@footnote{https://github.com/python/cpython/issues/97930}.)

@item 
Rename first parameter of @ref{6b5,,importlib.resources.files()} to `anchor'.
(Contributed by Jason R. Coombs in gh-100598@footnote{https://github.com/python/cpython/issues/100598}.)
@end itemize

@node inspect<2>,itertools<3>,importlib resources,Improved Modules
@anchor{whatsnew/3 12 inspect}@anchor{6b6}
@subsubsection inspect



@itemize *

@item 
Add @ref{6b7,,inspect.markcoroutinefunction()} to mark sync functions that return
a @ref{6b8,,coroutine} for use with @ref{30d,,inspect.iscoroutinefunction()}.
(Contributed by Carlton Gibson in gh-99247@footnote{https://github.com/python/cpython/issues/99247}.)

@item 
Add @ref{6b9,,inspect.getasyncgenstate()} and @ref{6ba,,inspect.getasyncgenlocals()}
for determining the current state of asynchronous generators.
(Contributed by Thomas Krennwallner in gh-79940@footnote{https://github.com/python/cpython/issues/79940}.)

@item 
The performance of @ref{6bb,,inspect.getattr_static()} has been considerably
improved. Most calls to the function should be at least 2x faster than they
were in Python 3.11. (Contributed by Alex Waygood in gh-103193@footnote{https://github.com/python/cpython/issues/103193}.)
@end itemize

@node itertools<3>,math<3>,inspect<2>,Improved Modules
@anchor{whatsnew/3 12 itertools}@anchor{6bc}
@subsubsection itertools



@itemize *

@item 
Add @ref{510,,itertools.batched()} for collecting into even-sized
tuples where the last batch may be shorter than the rest.
(Contributed by Raymond Hettinger in gh-98363@footnote{https://github.com/python/cpython/issues/98363}.)
@end itemize

@node math<3>,os<3>,itertools<3>,Improved Modules
@anchor{whatsnew/3 12 math}@anchor{6bd}
@subsubsection math



@itemize *

@item 
Add @ref{6be,,math.sumprod()} for computing a sum of products.
(Contributed by Raymond Hettinger in gh-100485@footnote{https://github.com/python/cpython/issues/100485}.)

@item 
Extend @ref{6bf,,math.nextafter()} to include a `steps' argument
for moving up or down multiple steps at a time. (Contributed by
Matthias Goergens, Mark Dickinson, and Raymond Hettinger in gh-94906@footnote{https://github.com/python/cpython/issues/94906}.)
@end itemize

@node os<3>,os path<3>,math<3>,Improved Modules
@anchor{whatsnew/3 12 os}@anchor{6c0}
@subsubsection os



@itemize *

@item 
Add @ref{6c1,,os.PIDFD_NONBLOCK} to open a file descriptor
for a process with @ref{6a3,,os.pidfd_open()} in non-blocking mode.
(Contributed by Kumar Aditya in gh-93312@footnote{https://github.com/python/cpython/issues/93312}.)

@item 
@ref{6c2,,os.DirEntry} now includes an @ref{6c3,,os.DirEntry.is_junction()}
method to check if the entry is a junction.
(Contributed by Charles Machalow in gh-99547@footnote{https://github.com/python/cpython/issues/99547}.)

@item 
Add @ref{6c4,,os.listdrives()}, @ref{6c5,,os.listvolumes()} and @ref{6c6,,os.listmounts()}
functions on Windows for enumerating drives, volumes and mount points.
(Contributed by Steve Dower in gh-102519@footnote{https://github.com/python/cpython/issues/102519}.)

@item 
@ref{26d,,os.stat()} and @ref{6c7,,os.lstat()} are now more accurate on Windows.
The @code{st_birthtime} field will now be filled with the creation time
of the file, and @code{st_ctime} is deprecated but still contains the
creation time (but in the future will return the last metadata change,
for consistency with other platforms). @code{st_dev} may be up to 64 bits
and @code{st_ino} up to 128 bits depending on your file system, and
@code{st_rdev} is always set to zero rather than incorrect values.
Both functions may be significantly faster on newer releases of
Windows. (Contributed by Steve Dower in gh-99726@footnote{https://github.com/python/cpython/issues/99726}.)
@end itemize

@node os path<3>,pathlib<6>,os<3>,Improved Modules
@anchor{whatsnew/3 12 os-path}@anchor{6c8}
@subsubsection os.path



@itemize *

@item 
Add @ref{6c9,,os.path.isjunction()} to check if a given path is a junction.
(Contributed by Charles Machalow in gh-99547@footnote{https://github.com/python/cpython/issues/99547}.)

@item 
Add @ref{6ca,,os.path.splitroot()} to split a path into a triad
@code{(drive, root, tail)}. (Contributed by Barney Gale in gh-101000@footnote{https://github.com/python/cpython/issues/101000}.)
@end itemize

@node pathlib<6>,platform<2>,os path<3>,Improved Modules
@anchor{whatsnew/3 12 pathlib}@anchor{6cb}
@subsubsection pathlib



@itemize *

@item 
Add support for subclassing @ref{6cc,,pathlib.PurePath} and
@ref{266,,pathlib.Path}, plus their Posix- and Windows-specific variants.
Subclasses may override the @ref{6cd,,pathlib.PurePath.with_segments()} method
to pass information between path instances.

@item 
Add @ref{6ce,,pathlib.Path.walk()} for walking the directory trees and generating
all file or directory names within them, similar to @ref{6cf,,os.walk()}.
(Contributed by Stanislav Zmiev in gh-90385@footnote{https://github.com/python/cpython/issues/90385}.)

@item 
Add `walk_up' optional parameter to @ref{2fd,,pathlib.PurePath.relative_to()}
to allow the insertion of @code{..} entries in the result; this behavior is
more consistent with @ref{6d0,,os.path.relpath()}.
(Contributed by Domenico Ragusa in gh-84538@footnote{https://github.com/python/cpython/issues/84538}.)

@item 
Add @ref{6d1,,pathlib.Path.is_junction()} as a proxy to @ref{6c9,,os.path.isjunction()}.
(Contributed by Charles Machalow in gh-99547@footnote{https://github.com/python/cpython/issues/99547}.)

@item 
Add `case_sensitive' optional parameter to @ref{537,,pathlib.Path.glob()},
@ref{538,,pathlib.Path.rglob()} and @ref{6d2,,pathlib.PurePath.match()} for matching
the path’s case sensitivity, allowing for more precise control over the matching process.
@end itemize

@node platform<2>,pdb<4>,pathlib<6>,Improved Modules
@anchor{whatsnew/3 12 platform}@anchor{6d3}
@subsubsection platform



@itemize *

@item 
Add support for detecting Windows 11 and Windows Server releases past 2012.
Previously, lookups on Windows Server platforms newer than Windows Server 2012
and on Windows 11 would return @code{Windows-10}.
(Contributed by Steve Dower in gh-89545@footnote{https://github.com/python/cpython/issues/89545}.)
@end itemize

@node pdb<4>,random<2>,platform<2>,Improved Modules
@anchor{whatsnew/3 12 pdb}@anchor{6d4}
@subsubsection pdb



@itemize *

@item 
Add convenience variables to hold values temporarily for debug session
and provide quick access to values like the current frame or the return
value.
(Contributed by Tian Gao in gh-103693@footnote{https://github.com/python/cpython/issues/103693}.)
@end itemize

@node random<2>,shutil<2>,pdb<4>,Improved Modules
@anchor{whatsnew/3 12 random}@anchor{6d5}
@subsubsection random



@itemize *

@item 
Add @ref{6d6,,random.binomialvariate()}.
(Contributed by Raymond Hettinger in gh-81620@footnote{https://github.com/python/cpython/issues/81620}.)

@item 
Add a default of @code{lambd=1.0} to @ref{6d7,,random.expovariate()}.
(Contributed by Raymond Hettinger in gh-100234@footnote{https://github.com/python/cpython/issues/100234}.)
@end itemize

@node shutil<2>,sqlite3<3>,random<2>,Improved Modules
@anchor{whatsnew/3 12 shutil}@anchor{6d8}
@subsubsection shutil



@itemize *

@item 
@ref{6d9,,shutil.make_archive()} now passes the `root_dir' argument to custom
archivers which support it.
In this case it no longer temporarily changes the current working directory
of the process to `root_dir' to perform archiving.
(Contributed by Serhiy Storchaka in gh-74696@footnote{https://github.com/python/cpython/issues/74696}.)

@item 
@ref{356,,shutil.rmtree()} now accepts a new argument `onexc' which is an
error handler like `onerror' but which expects an exception instance
rather than a `(typ, val, tb)' triplet. `onerror' is deprecated.
(Contributed by Irit Katriel in gh-102828@footnote{https://github.com/python/cpython/issues/102828}.)

@item 
@ref{6da,,shutil.which()} now consults the `PATHEXT' environment variable to
find matches within `PATH' on Windows even when the given `cmd' includes
a directory component.
(Contributed by Charles Machalow in gh-103179@footnote{https://github.com/python/cpython/issues/103179}.)

@ref{6da,,shutil.which()} will call @code{NeedCurrentDirectoryForExePathW} when
querying for executables on Windows to determine if the current working
directory should be prepended to the search path.
(Contributed by Charles Machalow in gh-103179@footnote{https://github.com/python/cpython/issues/103179}.)

@ref{6da,,shutil.which()} will return a path matching the `cmd' with a component
from @code{PATHEXT} prior to a direct match elsewhere in the search path on
Windows.
(Contributed by Charles Machalow in gh-103179@footnote{https://github.com/python/cpython/issues/103179}.)
@end itemize

@node sqlite3<3>,statistics<2>,shutil<2>,Improved Modules
@anchor{whatsnew/3 12 sqlite3}@anchor{6db}
@subsubsection sqlite3



@itemize *

@item 
Add a @ref{672,,command-line interface}.
(Contributed by Erlend E. Aasland in gh-77617@footnote{https://github.com/python/cpython/issues/77617}.)

@item 
Add the @ref{6dc,,sqlite3.Connection.autocommit} attribute
to @ref{54c,,sqlite3.Connection}
and the `autocommit' parameter to @ref{5a5,,sqlite3.connect()}
to control 
@geindex Python 향상 제안; PEP 249
PEP 249@footnote{https://peps.python.org/pep-0249/}-compliant
@ref{6dd,,transaction handling}.
(Contributed by Erlend E. Aasland in gh-83638@footnote{https://github.com/python/cpython/issues/83638}.)

@item 
Add `entrypoint' keyword-only parameter to
@ref{6de,,sqlite3.Connection.load_extension()},
for overriding the SQLite extension entry point.
(Contributed by Erlend E. Aasland in gh-103015@footnote{https://github.com/python/cpython/issues/103015}.)

@item 
Add @ref{6df,,sqlite3.Connection.getconfig()} and
@ref{6e0,,sqlite3.Connection.setconfig()} to @ref{54c,,sqlite3.Connection}
to make configuration changes to a database connection.
(Contributed by Erlend E. Aasland in gh-103489@footnote{https://github.com/python/cpython/issues/103489}.)
@end itemize

@node statistics<2>,sys<3>,sqlite3<3>,Improved Modules
@anchor{whatsnew/3 12 statistics}@anchor{6e1}
@subsubsection statistics



@itemize *

@item 
Extend @ref{6e2,,statistics.correlation()} to include as a @code{ranked} method
for computing the Spearman correlation of ranked data.
(Contributed by Raymond Hettinger in gh-95861@footnote{https://github.com/python/cpython/issues/95861}.)
@end itemize

@node sys<3>,tempfile<2>,statistics<2>,Improved Modules
@anchor{whatsnew/3 12 sys}@anchor{6e3}
@subsubsection sys



@itemize *

@item 
Add the @ref{e0,,sys.monitoring} namespace to expose the new @ref{66f,,PEP 669} monitoring API.
(Contributed by Mark Shannon in gh-103082@footnote{https://github.com/python/cpython/issues/103082}.)

@item 
Add @ref{699,,sys.activate_stack_trampoline()} and
@ref{69a,,sys.deactivate_stack_trampoline()} for activating and deactivating
stack profiler trampolines,
and @ref{69b,,sys.is_stack_trampoline_active()} for querying if stack profiler
trampolines are active.
(Contributed by Pablo Galindo and Christian Heimes
with contributions from Gregory P. Smith [Google] and Mark Shannon
in gh-96123@footnote{https://github.com/python/cpython/issues/96123}.)

@item 
Add @ref{6e4,,sys.last_exc} which holds the last unhandled exception that
was raised (for post-mortem debugging use cases). Deprecate the
three fields that have the same information in its legacy form:
@ref{6e5,,sys.last_type}, @ref{6e6,,sys.last_value} and @ref{6e7,,sys.last_traceback}.
(Contributed by Irit Katriel in gh-102778@footnote{https://github.com/python/cpython/issues/102778}.)

@item 
@ref{6e8,,sys._current_exceptions()} now returns a mapping from thread-id to an
exception instance, rather than to a @code{(typ, exc, tb)} tuple.
(Contributed by Irit Katriel in gh-103176@footnote{https://github.com/python/cpython/issues/103176}.)

@item 
@ref{6e9,,sys.setrecursionlimit()} and @ref{6ea,,sys.getrecursionlimit()}.
The recursion limit now applies only to Python code. Builtin functions do
not use the recursion limit, but are protected by a different mechanism
that prevents recursion from causing a virtual machine crash.
@end itemize

@node tempfile<2>,threading<2>,sys<3>,Improved Modules
@anchor{whatsnew/3 12 tempfile}@anchor{6eb}
@subsubsection tempfile



@itemize *

@item 
The @ref{6ec,,tempfile.NamedTemporaryFile} function has a new optional parameter
`delete_on_close' (Contributed by Evgeny Zorin in gh-58451@footnote{https://github.com/python/cpython/issues/58451}.)

@item 
@ref{52d,,tempfile.mkdtemp()} now always returns an absolute path, even if the
argument provided to the `dir' parameter is a relative path.
@end itemize

@node threading<2>,tkinter<3>,tempfile<2>,Improved Modules
@anchor{whatsnew/3 12 threading}@anchor{6ed}
@subsubsection threading



@itemize *

@item 
Add @ref{6ee,,threading.settrace_all_threads()} and
@ref{6ef,,threading.setprofile_all_threads()} that allow to set tracing and
profiling functions in all running threads in addition to the calling one.
(Contributed by Pablo Galindo in gh-93503@footnote{https://github.com/python/cpython/issues/93503}.)
@end itemize

@node tkinter<3>,tokenize,threading<2>,Improved Modules
@anchor{whatsnew/3 12 tkinter}@anchor{6f0}
@subsubsection tkinter



@itemize *

@item 
@code{tkinter.Canvas.coords()} now flattens its arguments.
It now accepts not only coordinates as separate arguments
(@code{x1, y1, x2, y2, ...}) and a sequence of coordinates
(@code{[x1, y1, x2, y2, ...]}), but also coordinates grouped in pairs
(@code{(x1, y1), (x2, y2), ...} and @code{[(x1, y1), (x2, y2), ...]}),
like @code{create_*()} methods.
(Contributed by Serhiy Storchaka in gh-94473@footnote{https://github.com/python/cpython/issues/94473}.)
@end itemize

@node tokenize,types<3>,tkinter<3>,Improved Modules
@anchor{whatsnew/3 12 tokenize}@anchor{6f1}
@subsubsection tokenize



@itemize *

@item 
The @ref{101,,tokenize} module includes the changes introduced in 
@geindex Python 향상 제안; PEP 701
PEP 701@footnote{https://peps.python.org/pep-0701/}.
(Contributed by Marta Gómez Macías and Pablo Galindo in gh-102856@footnote{https://github.com/python/cpython/issues/102856}.)
See @ref{6f2,,Porting to Python 3.12} for more information on the
changes to the @code{tokenize} module.
@end itemize

@node types<3>,typing<4>,tokenize,Improved Modules
@anchor{whatsnew/3 12 types}@anchor{6f3}
@subsubsection types



@itemize *

@item 
Add @ref{6f4,,types.get_original_bases()} to allow for further introspection of
@ref{6f5,,사용자 정의 제네릭 형} when subclassed. (Contributed by
James Hilton-Balfe and Alex Waygood in gh-101827@footnote{https://github.com/python/cpython/issues/101827}.)
@end itemize

@node typing<4>,unicodedata<3>,types<3>,Improved Modules
@anchor{whatsnew/3 12 typing}@anchor{6f6}@anchor{whatsnew/3 12 whatsnew-typing-py312}@anchor{6f7}
@subsubsection typing



@itemize *

@item 
@ref{2ad,,isinstance()} checks against
@ref{673,,runtime-checkable protocols} now use
@ref{6bb,,inspect.getattr_static()} rather than @ref{6f8,,hasattr()} to lookup whether
attributes exist. This means that descriptors and @ref{6f9,,__getattr__()}
methods are no longer unexpectedly evaluated during @code{isinstance()} checks
against runtime-checkable protocols. However, it may also mean that some
objects which used to be considered instances of a runtime-checkable protocol
may no longer be considered instances of that protocol on Python 3.12+, and
vice versa. Most users are unlikely to be affected by this change.
(Contributed by Alex Waygood in gh-102433@footnote{https://github.com/python/cpython/issues/102433}.)

@item 
The members of a runtime-checkable protocol are now considered “frozen” at
runtime as soon as the class has been created. Monkey-patching attributes
onto a runtime-checkable protocol will still work, but will have no impact on
@ref{2ad,,isinstance()} checks comparing objects to the protocol. For example:

@example
>>> from typing import Protocol, runtime_checkable
>>> @@runtime_checkable
... class HasX(Protocol):
...     x = 1
...
>>> class Foo: ...
...
>>> f = Foo()
>>> isinstance(f, HasX)
False
>>> f.x = 1
>>> isinstance(f, HasX)
True
>>> HasX.y = 2
>>> isinstance(f, HasX)  # unchanged, even though HasX now also has a "y" attribute
True
@end example

This change was made in order to speed up @code{isinstance()} checks against
runtime-checkable protocols.

@item 
The performance profile of @ref{2ad,,isinstance()} checks against
@ref{673,,runtime-checkable protocols} has changed
significantly. Most @code{isinstance()} checks against protocols with only a few
members should be at least 2x faster than in 3.11, and some may be 20x
faster or more. However, @code{isinstance()} checks against protocols with many
members may be slower than in Python 3.11. (Contributed by Alex
Waygood in gh-74690@footnote{https://github.com/python/cpython/issues/74690} and gh-103193@footnote{https://github.com/python/cpython/issues/103193}.)

@item 
All @ref{332,,typing.TypedDict} and @ref{331,,typing.NamedTuple} classes now have the
@code{__orig_bases__} attribute. (Contributed by Adrian Garcia Badaracco in
gh-103699@footnote{https://github.com/python/cpython/issues/103699}.)

@item 
Add @code{frozen_default} parameter to @ref{6fa,,typing.dataclass_transform()}.
(Contributed by Erik De Bonte in gh-99957@footnote{https://github.com/python/cpython/issues/99957}.)
@end itemize

@node unicodedata<3>,unittest<3>,typing<4>,Improved Modules
@anchor{whatsnew/3 12 unicodedata}@anchor{6fb}
@subsubsection unicodedata



@itemize *

@item 
The Unicode database has been updated to version 15.0.0. (Contributed by
Benjamin Peterson in gh-96734@footnote{https://github.com/python/cpython/issues/96734}).
@end itemize

@node unittest<3>,uuid<3>,unicodedata<3>,Improved Modules
@anchor{whatsnew/3 12 unittest}@anchor{6fc}
@subsubsection unittest


Add a @code{--durations} command line option, showing the N slowest test cases:

@example
python3 -m unittest --durations=3 lib.tests.test_threading
.....
Slowest test durations
----------------------------------------------------------------------
1.210s     test_timeout (Lib.test.test_threading.BarrierTests)
1.003s     test_default_timeout (Lib.test.test_threading.BarrierTests)
0.518s     test_timeout (Lib.test.test_threading.EventTests)

(0.000 durations hidden.  Use -v to show these durations.)
----------------------------------------------------------------------
Ran 158 tests in 9.869s

OK (skipped=3)
@end example

(Contributed by Giampaolo Rodola in gh-48330@footnote{https://github.com/python/cpython/issues/48330})

@node uuid<3>,,unittest<3>,Improved Modules
@anchor{whatsnew/3 12 uuid}@anchor{6fd}
@subsubsection uuid



@itemize *

@item 
Add a @ref{674,,command-line interface}.
(Contributed by Adam Chhina in gh-88597@footnote{https://github.com/python/cpython/issues/88597}.)
@end itemize

@node Optimizations<2>,CPython bytecode changes<2>,Improved Modules,What’s New In Python 3 12
@anchor{whatsnew/3 12 optimizations}@anchor{6fe}
@subsection Optimizations



@itemize *

@item 
Remove @code{wstr} and @code{wstr_length} members from Unicode objects.
It reduces object size by 8 or 16 bytes on 64bit platform. (
@geindex Python 향상 제안; PEP 623
PEP 623@footnote{https://peps.python.org/pep-0623/})
(Contributed by Inada Naoki in gh-92536@footnote{https://github.com/python/cpython/issues/92536}.)

@item 
Add experimental support for using the BOLT binary optimizer in the build
process, which improves performance by 1-5%.
(Contributed by Kevin Modzelewski in gh-90536@footnote{https://github.com/python/cpython/issues/90536} and tuned by Donghee Na in gh-101525@footnote{https://github.com/python/cpython/issues/101525})

@item 
Speed up the regular expression substitution (functions @ref{5a2,,re.sub()} and
@ref{5a3,,re.subn()} and corresponding @code{re.Pattern} methods) for
replacement strings containing group references by 2–3 times.
(Contributed by Serhiy Storchaka in gh-91524@footnote{https://github.com/python/cpython/issues/91524}.)

@item 
Speed up @ref{1c7,,asyncio.Task} creation by deferring expensive string formatting.
(Contributed by Itamar Oren in gh-103793@footnote{https://github.com/python/cpython/issues/103793}.)

@item 
The @ref{6ff,,tokenize.tokenize()} and @ref{700,,tokenize.generate_tokens()} functions are
up to 64% faster as a side effect of the changes required to cover 
@geindex Python 향상 제안; PEP 701
PEP 701@footnote{https://peps.python.org/pep-0701/} in
the @ref{101,,tokenize} module. (Contributed by Marta Gómez Macías and Pablo Galindo
in gh-102856@footnote{https://github.com/python/cpython/issues/102856}.)

@item 
Speed up @ref{1a6,,super()} method calls and attribute loads via the
new @ref{701,,LOAD_SUPER_ATTR} instruction. (Contributed by Carl Meyer and
Vladimir Matveev in gh-103497@footnote{https://github.com/python/cpython/issues/103497}.)
@end itemize

@node CPython bytecode changes<2>,Demos and Tools,Optimizations<2>,What’s New In Python 3 12
@anchor{whatsnew/3 12 cpython-bytecode-changes}@anchor{702}
@subsection CPython bytecode changes



@itemize *

@item 
Remove the @code{LOAD_METHOD} instruction. It has been merged into
@ref{703,,LOAD_ATTR}. @code{LOAD_ATTR} will now behave like the old
@code{LOAD_METHOD} instruction if the low bit of its oparg is set.
(Contributed by Ken Jin in gh-93429@footnote{https://github.com/python/cpython/issues/93429}.)

@item 
Remove the @code{JUMP_IF_FALSE_OR_POP} and @code{JUMP_IF_TRUE_OR_POP}
instructions. (Contributed by Irit Katriel in gh-102859@footnote{https://github.com/python/cpython/issues/102859}.)

@item 
Remove the @code{PRECALL} instruction. (Contributed by Mark Shannon in
gh-92925@footnote{https://github.com/python/cpython/issues/92925}.)

@item 
Add the @ref{704,,BINARY_SLICE} and @ref{705,,STORE_SLICE} instructions.
(Contributed by Mark Shannon in gh-94163@footnote{https://github.com/python/cpython/issues/94163}.)

@item 
Add the @ref{706,,CALL_INTRINSIC_1} instructions.
(Contributed by Mark Shannon in gh-99005@footnote{https://github.com/python/cpython/issues/99005}.)

@item 
Add the @ref{707,,CALL_INTRINSIC_2} instruction.
(Contributed by Irit Katriel in gh-101799@footnote{https://github.com/python/cpython/issues/101799}.)

@item 
Add the @ref{708,,CLEANUP_THROW} instruction.
(Contributed by Brandt Bucher in gh-90997@footnote{https://github.com/python/cpython/issues/90997}.)

@item 
Add the @code{END_SEND} instruction.
(Contributed by Mark Shannon in gh-103082@footnote{https://github.com/python/cpython/issues/103082}.)

@item 
Add the @ref{709,,LOAD_FAST_AND_CLEAR} instruction as part of the
implementation of 
@geindex Python 향상 제안; PEP 709
PEP 709@footnote{https://peps.python.org/pep-0709/}. (Contributed by Carl Meyer in gh-101441@footnote{https://github.com/python/cpython/issues/101441}.)

@item 
Add the @ref{70a,,LOAD_FAST_CHECK} instruction.
(Contributed by Dennis Sweeney in gh-93143@footnote{https://github.com/python/cpython/issues/93143}.)

@item 
Add the @ref{70b,,LOAD_FROM_DICT_OR_DEREF}, @ref{70c,,LOAD_FROM_DICT_OR_GLOBALS},
and @ref{70d,,LOAD_LOCALS} opcodes as part of the implementation of 
@geindex Python 향상 제안; PEP 695
PEP 695@footnote{https://peps.python.org/pep-0695/}.
Remove the @code{LOAD_CLASSDEREF} opcode, which can be replaced with
@code{LOAD_LOCALS} plus @code{LOAD_FROM_DICT_OR_DEREF}. (Contributed
by Jelle Zijlstra in gh-103764@footnote{https://github.com/python/cpython/issues/103764}.)

@item 
Add the @ref{701,,LOAD_SUPER_ATTR} instruction. (Contributed by Carl Meyer and
Vladimir Matveev in gh-103497@footnote{https://github.com/python/cpython/issues/103497}.)

@item 
Add the @code{RETURN_CONST} instruction. (Contributed by Wenyang Wang in gh-101632@footnote{https://github.com/python/cpython/issues/101632}.)
@end itemize

@node Demos and Tools,Deprecated<2>,CPython bytecode changes<2>,What’s New In Python 3 12
@anchor{whatsnew/3 12 demos-and-tools}@anchor{70e}
@subsection Demos and Tools



@itemize *

@item 
Remove the @code{Tools/demo/} directory which contained old demo scripts. A copy
can be found in the old-demos project@footnote{https://github.com/gvanrossum/old-demos}.
(Contributed by Victor Stinner in gh-97681@footnote{https://github.com/python/cpython/issues/97681}.)

@item 
Remove outdated example scripts of the @code{Tools/scripts/} directory.
A copy can be found in the old-demos project@footnote{https://github.com/gvanrossum/old-demos}.
(Contributed by Victor Stinner in gh-97669@footnote{https://github.com/python/cpython/issues/97669}.)
@end itemize

@node Deprecated<2>,Removed<2>,Demos and Tools,What’s New In Python 3 12
@anchor{whatsnew/3 12 deprecated}@anchor{70f}
@subsection Deprecated



@itemize *

@item 
@ref{7,,argparse}: The `type', `choices', and `metavar' parameters
of @code{argparse.BooleanOptionalAction} are deprecated
and will be removed in 3.14.
(Contributed by Nikita Sobolev in gh-92248@footnote{https://github.com/python/cpython/issues/92248}.)

@item 
@ref{9,,ast}: The following @code{ast} features have been deprecated in documentation since
Python 3.8, now cause a @ref{1a3,,DeprecationWarning} to be emitted at runtime
when they are accessed or used, and will be removed in Python 3.14:


@itemize *

@item 
@code{ast.Num}

@item 
@code{ast.Str}

@item 
@code{ast.Bytes}

@item 
@code{ast.NameConstant}

@item 
@code{ast.Ellipsis}
@end itemize

Use @ref{2ef,,ast.Constant} instead.
(Contributed by Serhiy Storchaka in gh-90953@footnote{https://github.com/python/cpython/issues/90953}.)

@item 
@ref{b,,asyncio}:


@itemize *

@item 
The child watcher classes @code{asyncio.MultiLoopChildWatcher},
@code{asyncio.FastChildWatcher}, @code{asyncio.AbstractChildWatcher}
and @code{asyncio.SafeChildWatcher} are deprecated and
will be removed in Python 3.14.
(Contributed by Kumar Aditya in gh-94597@footnote{https://github.com/python/cpython/issues/94597}.)

@item 
@code{asyncio.set_child_watcher()}, @code{asyncio.get_child_watcher()},
@code{asyncio.AbstractEventLoopPolicy.set_child_watcher()} and
@code{asyncio.AbstractEventLoopPolicy.get_child_watcher()} are deprecated
and will be removed in Python 3.14.
(Contributed by Kumar Aditya in gh-94597@footnote{https://github.com/python/cpython/issues/94597}.)

@item 
The @ref{2f2,,get_event_loop()} method of the
default event loop policy now emits a @ref{1a3,,DeprecationWarning} if there
is no current event loop set and it decides to create one.
(Contributed by Serhiy Storchaka and Guido van Rossum in gh-100160@footnote{https://github.com/python/cpython/issues/100160}.)
@end itemize

@item 
@ref{15,,calendar}: @code{calendar.January} and @code{calendar.February} constants are deprecated and
replaced by @ref{34e,,calendar.JANUARY} and @ref{34f,,calendar.FEBRUARY}.
(Contributed by Prince Roshan in gh-103636@footnote{https://github.com/python/cpython/issues/103636}.)

@item 
@ref{1f,,collections.abc}: Deprecated @ref{342,,collections.abc.ByteString}.

Use @code{isinstance(obj, collections.abc.Buffer)} to test if @code{obj} implements
the @ref{260,,buffer protocol} at runtime. For use in type
annotations, either use @ref{343,,Buffer} or a union
that explicitly specifies the types your code supports (e.g.,
@code{bytes | bytearray | memoryview}).

@code{ByteString} was originally intended to be an abstract class that
would serve as a supertype of both @ref{192,,bytes} and @ref{344,,bytearray}.
However, since the ABC never had any methods, knowing that an object was an
instance of @code{ByteString} never actually told you anything useful
about the object. Other common buffer types such as @ref{165,,memoryview} were
also never understood as subtypes of @code{ByteString} (either at
runtime or by static type checkers).

See 
@geindex Python 향상 제안; PEP 688#current-options
PEP 688@footnote{https://peps.python.org/pep-0688/#current-options} for more details.
(Contributed by Shantanu Jain in gh-91896@footnote{https://github.com/python/cpython/issues/91896}.)

@item 
@ref{34,,datetime}: @ref{4e2,,datetime.datetime}’s @ref{351,,utcnow()} and
@ref{352,,utcfromtimestamp()} are deprecated and will be
removed in a future version. Instead, use timezone-aware objects to represent
datetimes in UTC: respectively, call @ref{710,,now()} and
@ref{711,,fromtimestamp()}  with the `tz' parameter set to
@ref{712,,datetime.UTC}.
(Contributed by Paul Ganssle in gh-103857@footnote{https://github.com/python/cpython/issues/103857}.)

@item 
@ref{3f,,email}: Deprecate the `isdst' parameter in @ref{2f7,,email.utils.localtime()}.
(Contributed by Alan Williams in gh-72346@footnote{https://github.com/python/cpython/issues/72346}.)

@item 
@ref{7c,,importlib.abc}: Deprecated the following classes, scheduled for removal in
Python 3.14:


@itemize *

@item 
@code{importlib.abc.ResourceReader}

@item 
@code{importlib.abc.Traversable}

@item 
@code{importlib.abc.TraversableResources}
@end itemize

Use @ref{80,,importlib.resources.abc} classes instead:


@itemize *

@item 
@ref{2fa,,importlib.resources.abc.Traversable}

@item 
@ref{2f9,,importlib.resources.abc.TraversableResources}
@end itemize

(Contributed by Jason R. Coombs and Hugo van Kemenade in gh-93963@footnote{https://github.com/python/cpython/issues/93963}.)

@item 
@ref{85,,itertools}: Deprecate the support for copy, deepcopy, and pickle operations,
which is undocumented, inefficient, historically buggy, and inconsistent.
This will be removed in 3.14 for a significant reduction in code
volume and maintenance burden.
(Contributed by Raymond Hettinger in gh-101588@footnote{https://github.com/python/cpython/issues/101588}.)

@item 
@ref{98,,multiprocessing}: In Python 3.14, the default @code{multiprocessing}
start method will change to a safer one on Linux, BSDs,
and other non-macOS POSIX platforms where @code{'fork'} is currently
the default (gh-84559@footnote{https://github.com/python/cpython/issues/84559}). Adding a runtime warning about this was deemed too
disruptive as the majority of code is not expected to care. Use the
@ref{24a,,get_context()} or
@ref{24b,,set_start_method()} APIs to explicitly specify when
your code `requires' @code{'fork'}.  See @ref{1d5,,contexts and start methods}.

@item 
@ref{ae,,pkgutil}: @code{pkgutil.find_loader()} and @code{pkgutil.get_loader()}
are deprecated and will be removed in Python 3.14;
use @ref{5ae,,importlib.util.find_spec()} instead.
(Contributed by Nikita Sobolev in gh-97850@footnote{https://github.com/python/cpython/issues/97850}.)

@item 
@ref{b6,,pty}: The module has two undocumented @code{master_open()} and @code{slave_open()}
functions that have been deprecated since Python 2 but only gained a
proper @ref{1a3,,DeprecationWarning} in 3.12. Remove them in 3.14.
(Contributed by Soumendra Ganguly and Gregory P. Smith in gh-85984@footnote{https://github.com/python/cpython/issues/85984}.)

@item 
@ref{a5,,os}:


@itemize *

@item 
The @code{st_ctime} fields return by @ref{26d,,os.stat()} and @ref{6c7,,os.lstat()} on
Windows are deprecated. In a future release, they will contain the last
metadata change time, consistent with other platforms. For now, they still
contain the creation time, which is also available in the new @code{st_birthtime}
field. (Contributed by Steve Dower in gh-99726@footnote{https://github.com/python/cpython/issues/99726}.)

@item 
On POSIX platforms, @ref{4b6,,os.fork()} can now raise a
@ref{1a3,,DeprecationWarning} when it can detect being called from a
multithreaded process. There has always been a fundamental incompatibility
with the POSIX platform when doing so. Even if such code `appeared' to work.
We added the warning to raise awareness as issues encountered by code doing
this are becoming more frequent. See the @code{os.fork()} documentation for
more details along with this discussion on fork being incompatible with threads@footnote{https://discuss.python.org/t/concerns-regarding-deprecation-of-fork-with-alive-threads/33555} for `why' we’re now surfacing this
longstanding platform compatibility problem to developers.
@end itemize

When this warning appears due to usage of @ref{98,,multiprocessing} or
@ref{24,,concurrent.futures} the fix is to use a different
@code{multiprocessing} start method such as @code{"spawn"} or @code{"forkserver"}.

@item 
@ref{ca,,shutil}: The `onerror' argument of @ref{356,,shutil.rmtree()} is deprecated;
use `onexc' instead. (Contributed by Irit Katriel in gh-102828@footnote{https://github.com/python/cpython/issues/102828}.)

@item 
@ref{d4,,sqlite3}:


@itemize *

@item 
@ref{713,,default adapters and converters} are now deprecated.
Instead, use the @ref{714,,Adapter and converter recipes}
and tailor them to your needs.
(Contributed by Erlend E. Aasland in gh-90016@footnote{https://github.com/python/cpython/issues/90016}.)

@item 
In @ref{5af,,execute()}, @ref{1a3,,DeprecationWarning} is now emitted
when @ref{5b1,,named placeholders} are used together with
parameters supplied as a @ref{715,,sequence} instead of as a @ref{183,,dict}.
Starting from Python 3.14, using named placeholders with parameters supplied
as a sequence will raise a @ref{305,,ProgrammingError}.
(Contributed by Erlend E. Aasland in gh-101698@footnote{https://github.com/python/cpython/issues/101698}.)
@end itemize

@item 
@ref{df,,sys}: The @ref{6e5,,sys.last_type}, @ref{6e6,,sys.last_value} and @ref{6e7,,sys.last_traceback}
fields are deprecated. Use @ref{6e4,,sys.last_exc} instead.
(Contributed by Irit Katriel in gh-102778@footnote{https://github.com/python/cpython/issues/102778}.)

@item 
@ref{e4,,tarfile}: Extracting tar archives without specifying `filter' is deprecated until
Python 3.14, when @code{'data'} filter will become the default.
See @ref{696,,Extraction filters} for details.

@item 
@ref{10a,,typing}:


@itemize *

@item 
@ref{716,,typing.Hashable} and @ref{717,,typing.Sized}, aliases for
@ref{718,,collections.abc.Hashable} and @ref{719,,collections.abc.Sized} respectively, are
deprecated. (gh-94309@footnote{https://github.com/python/cpython/issues/94309}.)

@item 
@ref{345,,typing.ByteString}, deprecated since Python 3.9, now causes a
@ref{1a3,,DeprecationWarning} to be emitted when it is used.
(Contributed by Alex Waygood in gh-91896@footnote{https://github.com/python/cpython/issues/91896}.)
@end itemize

@item 
@ref{12b,,xml.etree.ElementTree}: The module now emits @ref{1a3,,DeprecationWarning}
when testing the truth value of an @ref{363,,xml.etree.ElementTree.Element}.
Before, the Python implementation emitted @ref{657,,FutureWarning}, and the C
implementation emitted nothing.
(Contributed by Jacob Walls in gh-83122@footnote{https://github.com/python/cpython/issues/83122}.)

@item 
The 3-arg signatures (type, value, traceback) of @ref{71a,,coroutine throw()}, @ref{71b,,generator throw()} and
@ref{71c,,async generator throw()} are deprecated and
may be removed in a future version of Python. Use the single-arg versions
of these functions instead. (Contributed by Ofey Chan in gh-89874@footnote{https://github.com/python/cpython/issues/89874}.)

@item 
@ref{1a3,,DeprecationWarning} is now raised when @ref{323,,__package__} on a
module differs from
@ref{324,,__spec__.parent} (previously
it was @ref{71d,,ImportWarning}).
(Contributed by Brett Cannon in gh-65961@footnote{https://github.com/python/cpython/issues/65961}.)

@item 
Setting @ref{323,,__package__} or @ref{321,,__cached__} on a
module is deprecated, and will cease to be set or taken into consideration by
the import system in Python 3.14. (Contributed by Brett Cannon in gh-65961@footnote{https://github.com/python/cpython/issues/65961}.)

@item 
The bitwise inversion operator (@code{~}) on bool is deprecated. It will throw an
error in Python 3.16. Use @code{not} for logical negation of bools instead.
In the rare case that you really need the bitwise inversion of the underlying
@code{int}, convert to int explicitly: @code{~int(x)}. (Contributed by Tim Hoffmann
in gh-103487@footnote{https://github.com/python/cpython/issues/103487}.)

@item 
Accessing @ref{330,,co_lnotab} on code objects was deprecated in
Python 3.10 via 
@geindex Python 향상 제안; PEP 626
PEP 626@footnote{https://peps.python.org/pep-0626/},
but it only got a proper @ref{1a3,,DeprecationWarning} in 3.12.
May be removed in 3.15.
(Contributed by Nikita Sobolev in gh-101866@footnote{https://github.com/python/cpython/issues/101866}.)
@end itemize

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

@end menu

@node Pending removal in Python 3 13,Pending removal in Python 3 14,,Deprecated<2>
@anchor{whatsnew/3 12 pending-removal-in-python-3-13}@anchor{71e}
@subsubsection Pending removal in Python 3.13


Modules (see 
@geindex Python 향상 제안; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/}):


@itemize *

@item 
@code{aifc}

@item 
@code{audioop}

@item 
@code{cgi}

@item 
@code{cgitb}

@item 
@code{chunk}

@item 
@code{crypt}

@item 
@code{imghdr}

@item 
@code{mailcap}

@item 
@code{msilib}

@item 
@code{nis}

@item 
@code{nntplib}

@item 
@code{ossaudiodev}

@item 
@code{pipes}

@item 
@code{sndhdr}

@item 
@code{spwd}

@item 
@code{sunau}

@item 
@code{telnetlib}

@item 
@code{uu}

@item 
@code{xdrlib}
@end itemize

Other modules:


@itemize *

@item 
@code{lib2to3}, and the @code{2to3} program (gh-84540@footnote{https://github.com/python/cpython/issues/84540})
@end itemize

APIs:


@itemize *

@item 
@code{configparser.LegacyInterpolation} (gh-90765@footnote{https://github.com/python/cpython/issues/90765})

@item 
@code{locale.resetlocale()} (gh-90817@footnote{https://github.com/python/cpython/issues/90817})

@item 
@code{turtle.RawTurtle.settiltangle()} (gh-50096@footnote{https://github.com/python/cpython/issues/50096})

@item 
@code{unittest.findTestCases()} (gh-50096@footnote{https://github.com/python/cpython/issues/50096})

@item 
@code{unittest.getTestCaseNames()} (gh-50096@footnote{https://github.com/python/cpython/issues/50096})

@item 
@code{unittest.makeSuite()} (gh-50096@footnote{https://github.com/python/cpython/issues/50096})

@item 
@code{unittest.TestProgram.usageExit()} (gh-67048@footnote{https://github.com/python/cpython/issues/67048})

@item 
@code{webbrowser.MacOSX} (gh-86421@footnote{https://github.com/python/cpython/issues/86421})

@item 
@ref{48f,,classmethod} descriptor chaining (gh-89519@footnote{https://github.com/python/cpython/issues/89519})
@end itemize

@node Pending removal in Python 3 14,Pending removal in Python 3 15<3>,Pending removal in Python 3 13,Deprecated<2>
@anchor{whatsnew/3 12 pending-removal-in-python-3-14}@anchor{71f}
@subsubsection Pending removal in Python 3.14



@itemize *

@item 
@ref{7,,argparse}: The `type', `choices', and `metavar' parameters
of @code{argparse.BooleanOptionalAction} are deprecated
and will be removed in 3.14.
(Contributed by Nikita Sobolev in gh-92248@footnote{https://github.com/python/cpython/issues/92248}.)

@item 
@ref{9,,ast}: The following features have been deprecated in documentation
since Python 3.8, now cause a @ref{1a3,,DeprecationWarning} to be emitted at
runtime when they are accessed or used, and will be removed in Python 3.14:


@itemize *

@item 
@code{ast.Num}

@item 
@code{ast.Str}

@item 
@code{ast.Bytes}

@item 
@code{ast.NameConstant}

@item 
@code{ast.Ellipsis}
@end itemize

Use @ref{2ef,,ast.Constant} instead.
(Contributed by Serhiy Storchaka in gh-90953@footnote{https://github.com/python/cpython/issues/90953}.)

@item 
@ref{b,,asyncio}:


@itemize *

@item 
The child watcher classes @code{asyncio.MultiLoopChildWatcher},
@code{asyncio.FastChildWatcher}, @code{asyncio.AbstractChildWatcher}
and @code{asyncio.SafeChildWatcher} are deprecated and
will be removed in Python 3.14.
(Contributed by Kumar Aditya in gh-94597@footnote{https://github.com/python/cpython/issues/94597}.)

@item 
@code{asyncio.set_child_watcher()}, @code{asyncio.get_child_watcher()},
@code{asyncio.AbstractEventLoopPolicy.set_child_watcher()} and
@code{asyncio.AbstractEventLoopPolicy.get_child_watcher()} are deprecated
and will be removed in Python 3.14.
(Contributed by Kumar Aditya in gh-94597@footnote{https://github.com/python/cpython/issues/94597}.)

@item 
The @ref{2f2,,get_event_loop()} method of the
default event loop policy now emits a @ref{1a3,,DeprecationWarning} if there
is no current event loop set and it decides to create one.
(Contributed by Serhiy Storchaka and Guido van Rossum in gh-100160@footnote{https://github.com/python/cpython/issues/100160}.)
@end itemize

@item 
@ref{3f,,email}: Deprecated the `isdst' parameter in @ref{2f7,,email.utils.localtime()}.
(Contributed by Alan Williams in gh-72346@footnote{https://github.com/python/cpython/issues/72346}.)

@item 
@ref{7c,,importlib.abc} deprecated classes:


@itemize *

@item 
@code{importlib.abc.ResourceReader}

@item 
@code{importlib.abc.Traversable}

@item 
@code{importlib.abc.TraversableResources}
@end itemize

Use @ref{80,,importlib.resources.abc} classes instead:


@itemize *

@item 
@ref{2fa,,importlib.resources.abc.Traversable}

@item 
@ref{2f9,,importlib.resources.abc.TraversableResources}
@end itemize

(Contributed by Jason R. Coombs and Hugo van Kemenade in gh-93963@footnote{https://github.com/python/cpython/issues/93963}.)

@item 
@ref{85,,itertools} had undocumented, inefficient, historically buggy,
and inconsistent support for copy, deepcopy, and pickle operations.
This will be removed in 3.14 for a significant reduction in code
volume and maintenance burden.
(Contributed by Raymond Hettinger in gh-101588@footnote{https://github.com/python/cpython/issues/101588}.)

@item 
@ref{98,,multiprocessing}: The default start method will change to a safer one on
Linux, BSDs, and other non-macOS POSIX platforms where @code{'fork'} is currently
the default (gh-84559@footnote{https://github.com/python/cpython/issues/84559}). Adding a runtime warning about this was deemed too
disruptive as the majority of code is not expected to care. Use the
@ref{24a,,get_context()} or
@ref{24b,,set_start_method()} APIs to explicitly specify when
your code `requires' @code{'fork'}.  See @ref{1d5,,컨텍스트 및 시작 방법}.

@item 
@ref{a8,,pathlib}: @ref{2fe,,is_relative_to()} and
@ref{2fd,,relative_to()}: passing additional arguments is
deprecated.

@item 
@ref{ae,,pkgutil}: @code{pkgutil.find_loader()} and @code{pkgutil.get_loader()}
now raise @ref{1a3,,DeprecationWarning};
use @ref{5ae,,importlib.util.find_spec()} instead.
(Contributed by Nikita Sobolev in gh-97850@footnote{https://github.com/python/cpython/issues/97850}.)

@item 
@ref{b6,,pty}:


@itemize *

@item 
@code{master_open()}: use @ref{301,,pty.openpty()}.

@item 
@code{slave_open()}: use @ref{301,,pty.openpty()}.
@end itemize

@item 
@ref{d4,,sqlite3}:


@itemize *

@item 
@code{version} and @code{version_info}.

@item 
@ref{5af,,execute()} and @ref{5b0,,executemany()}
if @ref{5b1,,named placeholders} are used and
`parameters' is a sequence instead of a @ref{183,,dict}.
@end itemize

@item 
@ref{10e,,urllib}:
@code{urllib.parse.Quoter} is deprecated: it was not intended to be a
public API.
(Contributed by Gregory P. Smith in gh-88168@footnote{https://github.com/python/cpython/issues/88168}.)
@end itemize

@node Pending removal in Python 3 15<3>,Pending removal in Python 3 16<3>,Pending removal in Python 3 14,Deprecated<2>
@anchor{whatsnew/3 12 pending-removal-in-python-3-15}@anchor{720}
@subsubsection Pending removal in Python 3.15



@itemize *

@item 
The import system:


@itemize *

@item 
Setting @ref{321,,__cached__} on a module while
failing to set @ref{322,,__spec__.cached}
is deprecated. In Python 3.15, @code{__cached__} will cease to be set or
take into consideration by the import system or standard library. (gh-97879@footnote{https://github.com/python/cpython/issues/97879})

@item 
Setting @ref{323,,__package__} on a module while
failing to set @ref{324,,__spec__.parent}
is deprecated. In Python 3.15, @code{__package__} will cease to be set or
take into consideration by the import system or standard library. (gh-97879@footnote{https://github.com/python/cpython/issues/97879})
@end itemize

@item 
@ref{2e,,ctypes}:


@itemize *

@item 
The undocumented @code{ctypes.SetPointerType()} function
has been deprecated since Python 3.13.
@end itemize

@item 
@ref{76,,http.server}:


@itemize *

@item 
The obsolete and rarely used @ref{325,,CGIHTTPRequestHandler}
has been deprecated since Python 3.13.
No direct replacement exists.
`Anything' is better than CGI to interface
a web server with a request handler.

@item 
The @code{--cgi} flag to the @code{python -m http.server}
command-line interface has been deprecated since Python 3.13.
@end itemize

@item 
@ref{7b,,importlib}:


@itemize *

@item 
@code{load_module()} method: use @code{exec_module()} instead.
@end itemize

@item 
@ref{8a,,locale}:


@itemize *

@item 
The @ref{326,,getdefaultlocale()} function
has been deprecated since Python 3.11.
Its removal was originally planned for Python 3.13 (gh-90817@footnote{https://github.com/python/cpython/issues/90817}),
but has been postponed to Python 3.15.
Use @ref{327,,getlocale()}, @ref{328,,setlocale()},
and @ref{329,,getencoding()} instead.
(Contributed by Hugo van Kemenade in gh-111187@footnote{https://github.com/python/cpython/issues/111187}.)
@end itemize

@item 
@ref{a8,,pathlib}:


@itemize *

@item 
@ref{32a,,PurePath.is_reserved()}
has been deprecated since Python 3.13.
Use @ref{32b,,os.path.isreserved()} to detect reserved paths on Windows.
@end itemize

@item 
@ref{af,,platform}:


@itemize *

@item 
@ref{32c,,java_ver()} has been deprecated since Python 3.13.
This function is only useful for Jython support, has a confusing API,
and is largely untested.
@end itemize

@item 
@ref{e1,,sysconfig}:


@itemize *

@item 
The `check_home' argument of @ref{32d,,sysconfig.is_python_build()} has been
deprecated since Python 3.12.
@end itemize

@item 
@ref{f3,,threading}:


@itemize *

@item 
@ref{32e,,RLock()} will take no arguments in Python 3.15.
Passing any arguments has been deprecated since Python 3.14,
as the Python version does not permit any arguments,
but the C version allows any number of positional or keyword arguments,
ignoring every argument.
@end itemize

@item 
@ref{109,,types}:


@itemize *

@item 
@ref{32f,,types.CodeType}: Accessing @ref{330,,co_lnotab} was
deprecated in 
@geindex Python 향상 제안; PEP 626
PEP 626@footnote{https://peps.python.org/pep-0626/}
since 3.10 and was planned to be removed in 3.12,
but it only got a proper @ref{1a3,,DeprecationWarning} in 3.12.
May be removed in 3.15.
(Contributed by Nikita Sobolev in gh-101866@footnote{https://github.com/python/cpython/issues/101866}.)
@end itemize

@item 
@ref{10a,,typing}:


@itemize *

@item 
The undocumented keyword argument syntax for creating
@ref{331,,NamedTuple} classes
(for example, @code{Point = NamedTuple("Point", x=int, y=int)})
has been deprecated since Python 3.13.
Use the class-based syntax or the functional syntax instead.

@item 
When using the functional syntax of @ref{332,,TypedDict}s, failing
to pass a value to the `fields' parameter (@code{TD = TypedDict("TD")}) or
passing @code{None} (@code{TD = TypedDict("TD", None)}) has been deprecated
since Python 3.13.
Use @code{class TD(TypedDict): pass} or @code{TD = TypedDict("TD", @{@})}
to create a TypedDict with zero field.

@item 
The @ref{333,,typing.no_type_check_decorator()} decorator function
has been deprecated since Python 3.13.
After eight years in the @ref{10a,,typing} module,
it has yet to be supported by any major type checker.
@end itemize

@item 
@ref{119,,wave}:


@itemize *

@item 
The @ref{334,,getmark()}, @code{setmark()},
and @ref{335,,getmarkers()} methods of
the @ref{336,,Wave_read} and @ref{337,,Wave_write} classes
have been deprecated since Python 3.13.
@end itemize

@item 
@ref{138,,zipimport}:


@itemize *

@item 
@ref{338,,load_module()} has been deprecated since
Python 3.10. Use @ref{339,,exec_module()} instead.
(Contributed by Jiahao Li in gh-125746@footnote{https://github.com/python/cpython/issues/125746}.)
@end itemize
@end itemize

@node Pending removal in Python 3 16<3>,Pending removal in Python 3 17<2>,Pending removal in Python 3 15<3>,Deprecated<2>
@anchor{whatsnew/3 12 pending-removal-in-python-3-16}@anchor{721}
@subsubsection Pending removal in Python 3.16



@itemize *

@item 
The import system:


@itemize *

@item 
Setting @ref{33b,,__loader__} on a module while
failing to set @ref{33c,,__spec__.loader}
is deprecated. In Python 3.16, @code{__loader__} will cease to be set or
taken into consideration by the import system or the standard library.
@end itemize

@item 
@ref{8,,array}:


@itemize *

@item 
The @code{'u'} format code (@code{wchar_t})
has been deprecated in documentation since Python 3.3
and at runtime since Python 3.13.
Use the @code{'w'} format code (@ref{33d,,Py_UCS4})
for Unicode characters instead.
@end itemize

@item 
@ref{b,,asyncio}:


@itemize *

@item 
@code{asyncio.iscoroutinefunction()} is deprecated
and will be removed in Python 3.16;
use @ref{30d,,inspect.iscoroutinefunction()} instead.
(Contributed by Jiahao Li and Kumar Aditya in gh-122875@footnote{https://github.com/python/cpython/issues/122875}.)

@item 
@ref{b,,asyncio} policy system is deprecated and will be removed in Python 3.16.
In particular, the following classes and functions are deprecated:


@itemize *

@item 
@ref{30e,,asyncio.AbstractEventLoopPolicy}

@item 
@ref{30f,,asyncio.DefaultEventLoopPolicy}

@item 
@ref{310,,asyncio.WindowsSelectorEventLoopPolicy}

@item 
@ref{311,,asyncio.WindowsProactorEventLoopPolicy}

@item 
@ref{312,,asyncio.get_event_loop_policy()}

@item 
@ref{313,,asyncio.set_event_loop_policy()}
@end itemize

Users should use @ref{2f3,,asyncio.run()} or @ref{2f5,,asyncio.Runner} with
`loop_factory' to use the desired event loop implementation.

For example, to use @ref{314,,asyncio.SelectorEventLoop} on Windows:

@example
import asyncio

async def main():
    ...

asyncio.run(main(), loop_factory=asyncio.SelectorEventLoop)
@end example

(Contributed by Kumar Aditya in gh-127949@footnote{https://github.com/python/cpython/issues/127949}.)
@end itemize

@item 
@ref{13,,builtins}:


@itemize *

@item 
Bitwise inversion on boolean types, @code{~True} or @code{~False}
has been deprecated since Python 3.12,
as it produces surprising and unintuitive results (@code{-2} and @code{-1}).
Use @code{not x} instead for the logical negation of a Boolean.
In the rare case that you need the bitwise inversion of
the underlying integer, convert to @code{int} explicitly (@code{~int(x)}).
@end itemize

@item 
@ref{63,,functools}:


@itemize *

@item 
Calling the Python implementation of @ref{21a,,functools.reduce()} with `function'
or `sequence' as keyword arguments has been deprecated since Python 3.14.
@end itemize

@item 
@ref{8b,,logging}:

Support for custom logging handlers with the `strm' argument is deprecated
and scheduled for removal in Python 3.16. Define handlers with the `stream'
argument instead. (Contributed by Mariusz Felisiak in gh-115032@footnote{https://github.com/python/cpython/issues/115032}.)

@item 
@ref{93,,mimetypes}:


@itemize *

@item 
Valid extensions start with a ‘.’ or are empty for
@ref{319,,mimetypes.MimeTypes.add_type()}.
Undotted extensions are deprecated and will
raise a @ref{2ec,,ValueError} in Python 3.16.
(Contributed by Hugo van Kemenade in gh-75223@footnote{https://github.com/python/cpython/issues/75223}.)
@end itemize

@item 
@ref{ca,,shutil}:


@itemize *

@item 
The @code{ExecError} exception
has been deprecated since Python 3.14.
It has not been used by any function in @code{shutil} since Python 3.4,
and is now an alias of @ref{244,,RuntimeError}.
@end itemize

@item 
@ref{de,,symtable}:


@itemize *

@item 
The @ref{31d,,Class.get_methods} method
has been deprecated since Python 3.14.
@end itemize

@item 
@ref{df,,sys}:


@itemize *

@item 
The @ref{33e,,_enablelegacywindowsfsencoding()} function
has been deprecated since Python 3.13.
Use the 
@geindex PYTHONLEGACYWINDOWSFSENCODING
@geindex 환경 변수; PYTHONLEGACYWINDOWSFSENCODING
@ref{33f,,PYTHONLEGACYWINDOWSFSENCODING} environment variable instead.
@end itemize

@item 
@ref{e1,,sysconfig}:


@itemize *

@item 
The @code{sysconfig.expand_makefile_vars()} function
has been deprecated since Python 3.14.
Use the @code{vars} argument of @ref{340,,sysconfig.get_paths()} instead.
@end itemize

@item 
@ref{e4,,tarfile}:


@itemize *

@item 
The undocumented and unused @code{TarFile.tarfile} attribute
has been deprecated since Python 3.13.
@end itemize
@end itemize

@node Pending removal in Python 3 17<2>,Pending removal in future versions<3>,Pending removal in Python 3 16<3>,Deprecated<2>
@anchor{whatsnew/3 12 pending-removal-in-python-3-17}@anchor{722}
@subsubsection Pending removal in Python 3.17



@itemize *

@item 
@ref{1f,,collections.abc}:


@itemize -

@item 
@ref{342,,collections.abc.ByteString} is scheduled for removal in Python 3.17.

Use @code{isinstance(obj, collections.abc.Buffer)} to test if @code{obj}
implements the @ref{260,,buffer protocol} at runtime. For use
in type annotations, either use @ref{343,,Buffer} or a union
that explicitly specifies the types your code supports (e.g.,
@code{bytes | bytearray | memoryview}).

@code{ByteString} was originally intended to be an abstract class that
would serve as a supertype of both @ref{192,,bytes} and @ref{344,,bytearray}.
However, since the ABC never had any methods, knowing that an object was an
instance of @code{ByteString} never actually told you anything useful
about the object. Other common buffer types such as @ref{165,,memoryview}
were also never understood as subtypes of @code{ByteString} (either at
runtime or by static type checkers).

See 
@geindex Python 향상 제안; PEP 688#current-options
PEP 688@footnote{https://peps.python.org/pep-0688/#current-options} for more details.
(Contributed by Shantanu Jain in gh-91896@footnote{https://github.com/python/cpython/issues/91896}.)
@end itemize

@item 
@ref{10a,,typing}:


@itemize -

@item 
Before Python 3.14, old-style unions were implemented using the private class
@code{typing._UnionGenericAlias}. This class is no longer needed for the implementation,
but it has been retained for backward compatibility, with removal scheduled for Python
3.17. Users should use documented introspection helpers like @ref{2ab,,typing.get_origin()}
and @ref{2ac,,typing.get_args()} instead of relying on private implementation details.

@item 
@ref{345,,typing.ByteString}, deprecated since Python 3.9, is scheduled for removal in
Python 3.17.

Use @code{isinstance(obj, collections.abc.Buffer)} to test if @code{obj}
implements the @ref{260,,buffer protocol} at runtime. For use
in type annotations, either use @ref{343,,Buffer} or a union
that explicitly specifies the types your code supports (e.g.,
@code{bytes | bytearray | memoryview}).

@code{ByteString} was originally intended to be an abstract class that
would serve as a supertype of both @ref{192,,bytes} and @ref{344,,bytearray}.
However, since the ABC never had any methods, knowing that an object was an
instance of @code{ByteString} never actually told you anything useful
about the object. Other common buffer types such as @ref{165,,memoryview}
were also never understood as subtypes of @code{ByteString} (either at
runtime or by static type checkers).

See 
@geindex Python 향상 제안; PEP 688#current-options
PEP 688@footnote{https://peps.python.org/pep-0688/#current-options} for more details.
(Contributed by Shantanu Jain in gh-91896@footnote{https://github.com/python/cpython/issues/91896}.)
@end itemize
@end itemize

@node Pending removal in future versions<3>,,Pending removal in Python 3 17<2>,Deprecated<2>
@anchor{whatsnew/3 12 pending-removal-in-future-versions}@anchor{723}
@subsubsection Pending removal in future versions


The following APIs will be removed in the future,
although there is currently no date scheduled for their removal.


@itemize *

@item 
@ref{7,,argparse}:


@itemize *

@item 
Nesting argument groups and nesting mutually exclusive
groups are deprecated.

@item 
Passing the undocumented keyword argument `prefix_chars' to
@ref{2eb,,add_argument_group()} is now
deprecated.

@item 
The @ref{30c,,argparse.FileType} type converter is deprecated.
@end itemize

@item 
@ref{13,,builtins}:


@itemize *

@item 
Generators: @code{throw(type, exc, tb)} and @code{athrow(type, exc, tb)}
signature is deprecated: use @code{throw(exc)} and @code{athrow(exc)} instead,
the single argument signature.

@item 
Currently Python accepts numeric literals immediately followed by keywords,
for example @code{0in x}, @code{1or x}, @code{0if 1else 2}.  It allows confusing and
ambiguous expressions like @code{[0x1for x in y]} (which can be interpreted as
@code{[0x1 for x in y]} or @code{[0x1f or x in y]}).  A syntax warning is raised
if the numeric literal is immediately followed by one of keywords
@ref{349,,and}, @ref{17c,,else}, @ref{34a,,for}, @ref{181,,if},
@ref{34b,,in}, @ref{34c,,is} and @ref{34d,,or}.  In a future release it
will be changed to a syntax error. (gh-87999@footnote{https://github.com/python/cpython/issues/87999})

@item 
Support for @code{__index__()} and @code{__int__()} method returning non-int type:
these methods will be required to return an instance of a strict subclass of
@ref{19b,,int}.

@item 
Support for @code{__float__()} method returning a strict subclass of
@ref{196,,float}: these methods will be required to return an instance of
@code{float}.

@item 
Support for @code{__complex__()} method returning a strict subclass of
@ref{197,,complex}: these methods will be required to return an instance of
@code{complex}.

@item 
Passing a complex number as the `real' or `imag' argument in the
@ref{197,,complex()} constructor is now deprecated; it should only be passed
as a single positional argument.
(Contributed by Serhiy Storchaka in gh-109218@footnote{https://github.com/python/cpython/issues/109218}.)
@end itemize

@item 
@ref{15,,calendar}: @code{calendar.January} and @code{calendar.February} constants are
deprecated and replaced by @ref{34e,,calendar.JANUARY} and
@ref{34f,,calendar.FEBRUARY}.
(Contributed by Prince Roshan in gh-103636@footnote{https://github.com/python/cpython/issues/103636}.)

@item 
@ref{1c,,codecs}: use @ref{316,,open()} instead of @ref{315,,codecs.open()}. (gh-133038@footnote{https://github.com/python/cpython/issues/133038})

@item 
@ref{330,,codeobject.co_lnotab}: use the @ref{350,,codeobject.co_lines()} method
instead.

@item 
@ref{34,,datetime}:


@itemize *

@item 
@ref{351,,utcnow()}:
use @code{datetime.datetime.now(tz=datetime.UTC)}.

@item 
@ref{352,,utcfromtimestamp()}:
use @code{datetime.datetime.fromtimestamp(timestamp, tz=datetime.UTC)}.
@end itemize

@item 
@ref{67,,gettext}: Plural value must be an integer.

@item 
@ref{7b,,importlib}:


@itemize *

@item 
@ref{353,,cache_from_source()} `debug_override' parameter is
deprecated: use the `optimization' parameter instead.
@end itemize

@item 
@ref{7e,,importlib.metadata}:


@itemize *

@item 
@code{EntryPoints} tuple interface.

@item 
Implicit @code{None} on return values.
@end itemize

@item 
@ref{8b,,logging}: the @code{warn()} method has been deprecated
since Python 3.3, use @ref{354,,warning()} instead.

@item 
@ref{8f,,mailbox}: Use of StringIO input and text mode is deprecated, use
BytesIO and binary mode instead.

@item 
@ref{a5,,os}: Calling @ref{355,,os.register_at_fork()} in multi-threaded process.

@item 
@code{pydoc.ErrorDuringImport}: A tuple value for `exc_info' parameter is
deprecated, use an exception instance.

@item 
@ref{be,,re}: More strict rules are now applied for numerical group references
and group names in regular expressions.  Only sequence of ASCII digits is now
accepted as a numerical reference.  The group name in bytes patterns and
replacement strings can now only contain ASCII letters and digits and
underscore.
(Contributed by Serhiy Storchaka in gh-91760@footnote{https://github.com/python/cpython/issues/91760}.)

@item 
@code{sre_compile}, @code{sre_constants} and @code{sre_parse} modules.

@item 
@ref{ca,,shutil}: @ref{356,,rmtree()}’s `onerror' parameter is deprecated in
Python 3.12; use the `onexc' parameter instead.

@item 
@ref{d5,,ssl} options and protocols:


@itemize *

@item 
@ref{357,,ssl.SSLContext} without protocol argument is deprecated.

@item 
@ref{357,,ssl.SSLContext}: @ref{358,,set_npn_protocols()} and
@code{selected_npn_protocol()} are deprecated: use ALPN
instead.

@item 
@code{ssl.OP_NO_SSL*} options

@item 
@code{ssl.OP_NO_TLS*} options

@item 
@code{ssl.PROTOCOL_SSLv3}

@item 
@code{ssl.PROTOCOL_TLS}

@item 
@code{ssl.PROTOCOL_TLSv1}

@item 
@code{ssl.PROTOCOL_TLSv1_1}

@item 
@code{ssl.PROTOCOL_TLSv1_2}

@item 
@code{ssl.TLSVersion.SSLv3}

@item 
@code{ssl.TLSVersion.TLSv1}

@item 
@code{ssl.TLSVersion.TLSv1_1}
@end itemize

@item 
@ref{f3,,threading} methods:


@itemize *

@item 
@code{threading.Condition.notifyAll()}: use @ref{359,,notify_all()}.

@item 
@code{threading.Event.isSet()}: use @ref{35a,,is_set()}.

@item 
@code{threading.Thread.isDaemon()}, @ref{35b,,threading.Thread.setDaemon()}:
use @ref{35c,,threading.Thread.daemon} attribute.

@item 
@code{threading.Thread.getName()}, @ref{35d,,threading.Thread.setName()}:
use @ref{2a0,,threading.Thread.name} attribute.

@item 
@code{threading.currentThread()}: use @ref{35e,,threading.current_thread()}.

@item 
@code{threading.activeCount()}: use @ref{35f,,threading.active_count()}.
@end itemize

@item 
@ref{360,,typing.Text} (gh-92332@footnote{https://github.com/python/cpython/issues/92332}).

@item 
The internal class @code{typing._UnionGenericAlias} is no longer used to implement
@ref{2a8,,typing.Union}. To preserve compatibility with users using this private
class, a compatibility shim will be provided until at least Python 3.17. (Contributed by
Jelle Zijlstra in gh-105499@footnote{https://github.com/python/cpython/issues/105499}.)

@item 
@ref{361,,unittest.IsolatedAsyncioTestCase}: it is deprecated to return a value
that is not @code{None} from a test case.

@item 
@ref{110,,urllib.parse} deprecated functions: @ref{362,,urlparse()} instead


@itemize *

@item 
@code{splitattr()}

@item 
@code{splithost()}

@item 
@code{splitnport()}

@item 
@code{splitpasswd()}

@item 
@code{splitport()}

@item 
@code{splitquery()}

@item 
@code{splittag()}

@item 
@code{splittype()}

@item 
@code{splituser()}

@item 
@code{splitvalue()}

@item 
@code{to_bytes()}
@end itemize

@item 
@ref{11e,,wsgiref}: @code{SimpleHandler.stdout.write()} should not do partial
writes.

@item 
@ref{12b,,xml.etree.ElementTree}: Testing the truth value of an
@ref{363,,Element} is deprecated. In a future release it
will always return @code{True}. Prefer explicit @code{len(elem)} or
@code{elem is not None} tests instead.

@item 
@ref{292,,sys._clear_type_cache()} is deprecated:
use @ref{364,,sys._clear_internal_caches()} instead.
@end itemize

@node Removed<2>,Porting to Python 3 12,Deprecated<2>,What’s New In Python 3 12
@anchor{whatsnew/3 12 removed}@anchor{724}@anchor{whatsnew/3 12 whatsnew312-removed}@anchor{725}
@subsection Removed


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

@end menu

@node asynchat and asyncore,configparser<4>,,Removed<2>
@anchor{whatsnew/3 12 asynchat-and-asyncore}@anchor{726}
@subsubsection asynchat and asyncore



@itemize *

@item 
These two modules have been removed
according to the schedule in 
@geindex Python 향상 제안; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/},
having been deprecated in Python 3.6.
Use @ref{b,,asyncio} instead.
(Contributed by Nikita Sobolev in gh-96580@footnote{https://github.com/python/cpython/issues/96580}.)
@end itemize

@node configparser<4>,distutils,asynchat and asyncore,Removed<2>
@anchor{whatsnew/3 12 configparser}@anchor{727}
@subsubsection configparser



@itemize *

@item 
Several names deprecated in the @ref{26,,configparser} way back in 3.2 have
been removed per gh-89336@footnote{https://github.com/python/cpython/issues/89336}:


@itemize *

@item 
@ref{728,,configparser.ParsingError} no longer has a @code{filename} attribute
or argument. Use the @code{source} attribute and argument instead.

@item 
@ref{26,,configparser} no longer has a @code{SafeConfigParser} class. Use the
shorter @ref{4de,,ConfigParser} name instead.

@item 
@ref{4de,,configparser.ConfigParser} no longer has a @code{readfp} method.
Use @ref{729,,read_file()} instead.
@end itemize
@end itemize

@node distutils,ensurepip,configparser<4>,Removed<2>
@anchor{whatsnew/3 12 distutils}@anchor{72a}@anchor{whatsnew/3 12 whatsnew312-removed-distutils}@anchor{72b}
@subsubsection distutils



@itemize *

@item 
Remove the @code{distutils} package. It was deprecated in Python 3.10 by
@geindex Python 향상 제안; PEP 632
PEP 632@footnote{https://peps.python.org/pep-0632/} “Deprecate distutils module”. For projects still using
@code{distutils} and cannot be updated to something else, the @code{setuptools}
project can be installed: it still provides @code{distutils}.
(Contributed by Victor Stinner in gh-92584@footnote{https://github.com/python/cpython/issues/92584}.)
@end itemize

@node ensurepip,enum<2>,distutils,Removed<2>
@anchor{whatsnew/3 12 ensurepip}@anchor{72c}
@subsubsection ensurepip



@itemize *

@item 
Remove the bundled setuptools wheel from @ref{59,,ensurepip},
and stop installing setuptools in environments created by @ref{117,,venv}.

@code{pip (>= 22.1)} does not require setuptools to be installed in the
environment. @code{setuptools}-based (and @code{distutils}-based) packages
can still be used with @code{pip install}, since pip will provide
@code{setuptools} in the build environment it uses for building a
package.

@code{easy_install}, @code{pkg_resources}, @code{setuptools} and @code{distutils}
are no longer provided by default in environments created with
@code{venv} or bootstrapped with @code{ensurepip}, since they are part of
the @code{setuptools} package. For projects relying on these at runtime,
the @code{setuptools} project should be declared as a dependency and
installed separately (typically, using pip).

(Contributed by Pradyun Gedam in gh-95299@footnote{https://github.com/python/cpython/issues/95299}.)
@end itemize

@node enum<2>,ftplib,ensurepip,Removed<2>
@anchor{whatsnew/3 12 enum}@anchor{72d}
@subsubsection enum



@itemize *

@item 
Remove @ref{5a,,enum}’s @code{EnumMeta.__getattr__}, which is no longer needed for
enum attribute access.
(Contributed by Ethan Furman in gh-95083@footnote{https://github.com/python/cpython/issues/95083}.)
@end itemize

@node ftplib,gzip,enum<2>,Removed<2>
@anchor{whatsnew/3 12 ftplib}@anchor{72e}
@subsubsection ftplib



@itemize *

@item 
Remove @ref{62,,ftplib}’s @code{FTP_TLS.ssl_version} class attribute: use the
`context' parameter instead.
(Contributed by Victor Stinner in gh-94172@footnote{https://github.com/python/cpython/issues/94172}.)
@end itemize

@node gzip,hashlib,ftplib,Removed<2>
@anchor{whatsnew/3 12 gzip}@anchor{72f}
@subsubsection gzip



@itemize *

@item 
Remove the @code{filename} attribute of @ref{6b,,gzip}’s @ref{65a,,gzip.GzipFile},
deprecated since Python 2.6, use the @ref{730,,name} attribute
instead. In write mode, the @code{filename} attribute added @code{'.gz'} file
extension if it was not present.
(Contributed by Victor Stinner in gh-94196@footnote{https://github.com/python/cpython/issues/94196}.)
@end itemize

@node hashlib,importlib<2>,gzip,Removed<2>
@anchor{whatsnew/3 12 hashlib}@anchor{731}
@subsubsection hashlib



@itemize *

@item 
Remove the pure Python implementation of @ref{6c,,hashlib}’s
@ref{732,,hashlib.pbkdf2_hmac()}, deprecated in Python 3.10. Python 3.10 and
newer requires OpenSSL 1.1.1 (
@geindex Python 향상 제안; PEP 644
PEP 644@footnote{https://peps.python.org/pep-0644/}): this OpenSSL version provides
a C implementation of @code{pbkdf2_hmac()} which is faster.
(Contributed by Victor Stinner in gh-94199@footnote{https://github.com/python/cpython/issues/94199}.)
@end itemize

@node importlib<2>,imp,hashlib,Removed<2>
@anchor{whatsnew/3 12 importlib}@anchor{733}
@subsubsection importlib



@itemize *

@item 
Many previously deprecated cleanups in @ref{7b,,importlib} have now been
completed:


@itemize *

@item 
References to, and support for @code{module_repr()} has been removed.
(Contributed by Barry Warsaw in gh-97850@footnote{https://github.com/python/cpython/issues/97850}.)

@item 
@code{importlib.util.set_package}, @code{importlib.util.set_loader} and
@code{importlib.util.module_for_loader} have all been removed. (Contributed by
Brett Cannon and Nikita Sobolev in gh-65961@footnote{https://github.com/python/cpython/issues/65961} and gh-97850@footnote{https://github.com/python/cpython/issues/97850}.)

@item 
Support for @code{find_loader()} and @code{find_module()} APIs have been
removed.  (Contributed by Barry Warsaw in gh-98040@footnote{https://github.com/python/cpython/issues/98040}.)

@item 
@code{importlib.abc.Finder}, @code{pkgutil.ImpImporter}, and @code{pkgutil.ImpLoader}
have been removed.  (Contributed by Barry Warsaw in gh-98040@footnote{https://github.com/python/cpython/issues/98040}.)
@end itemize
@end itemize

@node imp,io<4>,importlib<2>,Removed<2>
@anchor{whatsnew/3 12 imp}@anchor{734}@anchor{whatsnew/3 12 whatsnew312-removed-imp}@anchor{735}
@subsubsection imp



@itemize *

@item 
The @code{imp} module has been removed.  (Contributed by Barry Warsaw in
gh-98040@footnote{https://github.com/python/cpython/issues/98040}.)

To migrate, consult the following correspondence table:

@quotation


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

imp

@tab

importlib

@item

@code{imp.NullImporter}

@tab

Insert @code{None} into @code{sys.path_importer_cache}

@item

@code{imp.cache_from_source()}

@tab

@ref{353,,importlib.util.cache_from_source()}

@item

@code{imp.find_module()}

@tab

@ref{5ae,,importlib.util.find_spec()}

@item

@code{imp.get_magic()}

@tab

@ref{736,,importlib.util.MAGIC_NUMBER}

@item

@code{imp.get_suffixes()}

@tab

@ref{737,,importlib.machinery.SOURCE_SUFFIXES}, @ref{738,,importlib.machinery.EXTENSION_SUFFIXES}, and @ref{739,,importlib.machinery.BYTECODE_SUFFIXES}

@item

@code{imp.get_tag()}

@tab

@ref{73a,,sys.implementation.cache_tag}

@item

@code{imp.load_module()}

@tab

@ref{73b,,importlib.import_module()}

@item

@code{imp.new_module(name)}

@tab

@code{types.ModuleType(name)}

@item

@code{imp.reload()}

@tab

@ref{73c,,importlib.reload()}

@item

@code{imp.source_from_cache()}

@tab

@ref{73d,,importlib.util.source_from_cache()}

@item

@code{imp.load_source()}

@tab

`See below'

@end multitable

@end quotation

Replace @code{imp.load_source()} with:

@example
import importlib.util
import importlib.machinery

def load_source(modname, filename):
    loader = importlib.machinery.SourceFileLoader(modname, filename)
    spec = importlib.util.spec_from_file_location(modname, filename, loader=loader)
    module = importlib.util.module_from_spec(spec)
    # The module is always executed and not cached in sys.modules.
    # Uncomment the following line to cache the module.
    # sys.modules[module.__name__] = module
    loader.exec_module(module)
    return module
@end example

@item 
Remove @code{imp} functions and attributes with no replacements:


@itemize *

@item 
Undocumented functions:


@itemize *

@item 
@code{imp.init_builtin()}

@item 
@code{imp.load_compiled()}

@item 
@code{imp.load_dynamic()}

@item 
@code{imp.load_package()}
@end itemize

@item 
@code{imp.lock_held()}, @code{imp.acquire_lock()}, @code{imp.release_lock()}:
the locking scheme has changed in Python 3.3 to per-module locks.

@item 
@code{imp.find_module()} constants: @code{SEARCH_ERROR}, @code{PY_SOURCE},
@code{PY_COMPILED}, @code{C_EXTENSION}, @code{PY_RESOURCE}, @code{PKG_DIRECTORY},
@code{C_BUILTIN}, @code{PY_FROZEN}, @code{PY_CODERESOURCE}, @code{IMP_HOOK}.
@end itemize
@end itemize

@node io<4>,locale<2>,imp,Removed<2>
@anchor{whatsnew/3 12 io}@anchor{73e}
@subsubsection io



@itemize *

@item 
Remove @ref{83,,io}’s @code{io.OpenWrapper} and @code{_pyio.OpenWrapper}, deprecated in Python
3.10: just use @ref{316,,open()} instead. The @code{open()} (@ref{73f,,io.open()})
function is a built-in function. Since Python 3.10, @code{_pyio.open()} is
also a static method.
(Contributed by Victor Stinner in gh-94169@footnote{https://github.com/python/cpython/issues/94169}.)
@end itemize

@node locale<2>,smtpd,io<4>,Removed<2>
@anchor{whatsnew/3 12 locale}@anchor{740}
@subsubsection locale



@itemize *

@item 
Remove @ref{8a,,locale}’s @code{locale.format()} function, deprecated in Python 3.7:
use @ref{741,,locale.format_string()} instead.
(Contributed by Victor Stinner in gh-94226@footnote{https://github.com/python/cpython/issues/94226}.)
@end itemize

@node smtpd,sqlite3<4>,locale<2>,Removed<2>
@anchor{whatsnew/3 12 smtpd}@anchor{742}
@subsubsection smtpd



@itemize *

@item 
The @code{smtpd} module has been removed according to the schedule in 
@geindex Python 향상 제안; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/},
having been deprecated in Python 3.4.7 and 3.5.4.
Use the aiosmtpd@footnote{https://pypi.org/project/aiosmtpd/} PyPI module or any other
@ref{b,,asyncio}-based server instead.
(Contributed by Oleg Iarygin in gh-93243@footnote{https://github.com/python/cpython/issues/93243}.)
@end itemize

@node sqlite3<4>,ssl<3>,smtpd,Removed<2>
@anchor{whatsnew/3 12 id2}@anchor{743}
@subsubsection sqlite3



@itemize *

@item 
The following undocumented @ref{d4,,sqlite3} features, deprecated in Python
3.10, are now removed:


@itemize *

@item 
@code{sqlite3.enable_shared_cache()}

@item 
@code{sqlite3.OptimizedUnicode}
@end itemize

If a shared cache must be used, open the database in URI mode using the
@code{cache=shared} query parameter.

The @code{sqlite3.OptimizedUnicode} text factory has been an alias for
@ref{169,,str} since Python 3.3. Code that previously set the text factory to
@code{OptimizedUnicode} can either use @code{str} explicitly, or rely on the
default value which is also @code{str}.

(Contributed by Erlend E. Aasland in gh-92548@footnote{https://github.com/python/cpython/issues/92548}.)
@end itemize

@node ssl<3>,unittest<4>,sqlite3<4>,Removed<2>
@anchor{whatsnew/3 12 ssl}@anchor{744}
@subsubsection ssl



@itemize *

@item 
Remove @ref{d5,,ssl}’s @code{ssl.RAND_pseudo_bytes()} function, deprecated in Python 3.6:
use @ref{745,,os.urandom()} or @ref{746,,ssl.RAND_bytes()} instead.
(Contributed by Victor Stinner in gh-94199@footnote{https://github.com/python/cpython/issues/94199}.)

@item 
Remove the @code{ssl.match_hostname()} function.
It was deprecated in Python 3.7. OpenSSL performs
hostname matching since Python 3.7, Python no longer uses the
@code{ssl.match_hostname()} function.
(Contributed by Victor Stinner in gh-94199@footnote{https://github.com/python/cpython/issues/94199}.)

@item 
Remove the @code{ssl.wrap_socket()} function, deprecated in Python 3.7:
instead, create a @ref{357,,ssl.SSLContext} object and call its
@ref{747,,ssl.SSLContext.wrap_socket} method. Any package that still uses
@code{ssl.wrap_socket()} is broken and insecure. The function neither sends a
SNI TLS extension nor validates the server hostname. Code is subject to 
@geindex Common Weakness Enumeration; CWE 295
CWE 295@footnote{https://cwe.mitre.org/data/definitions/295.html}
(Improper Certificate Validation).
(Contributed by Victor Stinner in gh-94199@footnote{https://github.com/python/cpython/issues/94199}.)
@end itemize

@node unittest<4>,webbrowser<3>,ssl<3>,Removed<2>
@anchor{whatsnew/3 12 id3}@anchor{748}
@subsubsection unittest



@itemize *

@item 
Remove many long-deprecated @ref{10c,,unittest} features:


@itemize *

@item 
A number of @ref{2b3,,TestCase} method aliases:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxx} 
@headitem

Deprecated alias

@tab

Method Name

@tab

Deprecated in

@item

@code{failUnless}

@tab

@ref{749,,assertTrue()}

@tab

3.1

@item

@code{failIf}

@tab

@ref{74a,,assertFalse()}

@tab

3.1

@item

@code{failUnlessEqual}

@tab

@ref{74b,,assertEqual()}

@tab

3.1

@item

@code{failIfEqual}

@tab

@ref{74c,,assertNotEqual()}

@tab

3.1

@item

@code{failUnlessAlmostEqual}

@tab

@ref{74d,,assertAlmostEqual()}

@tab

3.1

@item

@code{failIfAlmostEqual}

@tab

@ref{74e,,assertNotAlmostEqual()}

@tab

3.1

@item

@code{failUnlessRaises}

@tab

@ref{74f,,assertRaises()}

@tab

3.1

@item

@code{assert_}

@tab

@ref{749,,assertTrue()}

@tab

3.2

@item

@code{assertEquals}

@tab

@ref{74b,,assertEqual()}

@tab

3.2

@item

@code{assertNotEquals}

@tab

@ref{74c,,assertNotEqual()}

@tab

3.2

@item

@code{assertAlmostEquals}

@tab

@ref{74d,,assertAlmostEqual()}

@tab

3.2

@item

@code{assertNotAlmostEquals}

@tab

@ref{74e,,assertNotAlmostEqual()}

@tab

3.2

@item

@code{assertRegexpMatches}

@tab

@ref{750,,assertRegex()}

@tab

3.2

@item

@code{assertRaisesRegexp}

@tab

@ref{751,,assertRaisesRegex()}

@tab

3.2

@item

@code{assertNotRegexpMatches}

@tab

@ref{752,,assertNotRegex()}

@tab

3.5

@end multitable


You can use @indicateurl{https://github.com/isidentical/teyit} to automatically modernise
your unit tests.

@item 
Undocumented and broken @ref{2b3,,TestCase} method
@code{assertDictContainsSubset} (deprecated in Python 3.2).

@item 
Undocumented @ref{593,,TestLoader.loadTestsFromModule} parameter `use_load_tests'
(deprecated and ignored since Python 3.5).

@item 
An alias of the @ref{753,,TextTestResult} class:
@code{_TextTestResult} (deprecated in Python 3.2).
@end itemize

(Contributed by Serhiy Storchaka in gh-89325@footnote{https://github.com/python/cpython/issues/89325}.)
@end itemize

@node webbrowser<3>,xml etree ElementTree,unittest<4>,Removed<2>
@anchor{whatsnew/3 12 webbrowser}@anchor{754}
@subsubsection webbrowser



@itemize *

@item 
Remove support for obsolete browsers from @ref{11b,,webbrowser}.
The removed browsers include: Grail, Mosaic, Netscape, Galeon, Skipstone,
Iceape, Firebird, and Firefox versions 35 and below (gh-102871@footnote{https://github.com/python/cpython/issues/102871}).
@end itemize

@node xml etree ElementTree,zipimport<2>,webbrowser<3>,Removed<2>
@anchor{whatsnew/3 12 xml-etree-elementtree}@anchor{755}
@subsubsection xml.etree.ElementTree



@itemize *

@item 
Remove the @code{ElementTree.Element.copy()} method of the
pure Python implementation, deprecated in Python 3.10, use the
@ref{756,,copy.copy()} function instead.  The C implementation of @ref{12b,,xml.etree.ElementTree}
has no @code{copy()} method, only a @code{__copy__()} method.
(Contributed by Victor Stinner in gh-94383@footnote{https://github.com/python/cpython/issues/94383}.)
@end itemize

@node zipimport<2>,Others,xml etree ElementTree,Removed<2>
@anchor{whatsnew/3 12 zipimport}@anchor{757}
@subsubsection zipimport



@itemize *

@item 
Remove @ref{138,,zipimport}’s @code{find_loader()} and @code{find_module()} methods,
deprecated in Python 3.10: use the @code{find_spec()} method instead.  See
@geindex Python 향상 제안; PEP 451
PEP 451@footnote{https://peps.python.org/pep-0451/} for the rationale.
(Contributed by Victor Stinner in gh-94379@footnote{https://github.com/python/cpython/issues/94379}.)
@end itemize

@node Others,,zipimport<2>,Removed<2>
@anchor{whatsnew/3 12 others}@anchor{758}
@subsubsection Others



@itemize *

@item 
Remove the @code{suspicious} rule from the documentation @code{Makefile} and
@code{Doc/tools/rstlint.py}, both in favor of sphinx-lint@footnote{https://github.com/sphinx-contrib/sphinx-lint}.
(Contributed by Julien Palard in gh-98179@footnote{https://github.com/python/cpython/issues/98179}.)

@item 
Remove the `keyfile' and `certfile' parameters from the
@ref{62,,ftplib}, @ref{78,,imaplib}, @ref{b1,,poplib} and @ref{cf,,smtplib} modules,
and the `key_file', `cert_file' and `check_hostname' parameters from the
@ref{73,,http.client} module,
all deprecated since Python 3.6. Use the `context' parameter
(`ssl_context' in @code{imaplib}) instead.
(Contributed by Victor Stinner in gh-94172@footnote{https://github.com/python/cpython/issues/94172}.)

@item 
Remove @code{Jython} compatibility hacks from several stdlib modules and tests.
(Contributed by Nikita Sobolev in gh-99482@footnote{https://github.com/python/cpython/issues/99482}.)

@item 
Remove @code{_use_broken_old_ctypes_structure_semantics_} flag
from @ref{2e,,ctypes} module.
(Contributed by Nikita Sobolev in gh-99285@footnote{https://github.com/python/cpython/issues/99285}.)
@end itemize

@node Porting to Python 3 12,Build Changes,Removed<2>,What’s New In Python 3 12
@anchor{whatsnew/3 12 porting-to-python-3-12}@anchor{759}@anchor{whatsnew/3 12 whatsnew312-porting-to-python312}@anchor{6f2}
@subsection Porting to Python 3.12


This section lists previously described changes and other bugfixes
that may require changes to your code.

@menu
* Changes in the Python API: Changes in the Python API<2>. 

@end menu

@node Changes in the Python API<2>,,,Porting to Python 3 12
@anchor{whatsnew/3 12 changes-in-the-python-api}@anchor{75a}
@subsubsection Changes in the Python API



@itemize *

@item 
More strict rules are now applied for numerical group references and
group names in regular expressions.
Only sequence of ASCII digits is now accepted as a numerical reference.
The group name in bytes patterns and replacement strings can now only
contain ASCII letters and digits and underscore.
(Contributed by Serhiy Storchaka in gh-91760@footnote{https://github.com/python/cpython/issues/91760}.)

@item 
Remove @code{randrange()} functionality deprecated since Python 3.10.  Formerly,
@code{randrange(10.0)} losslessly converted to @code{randrange(10)}. Now, it raises a
@ref{198,,TypeError}. Also, the exception raised for non-integer values such as
@code{randrange(10.5)} or @code{randrange('10')} has been changed from @ref{2ec,,ValueError} to
@code{TypeError}.  This also prevents bugs where @code{randrange(1e25)} would silently
select from a larger range than @code{randrange(10**25)}.
(Originally suggested by Serhiy Storchaka gh-86388@footnote{https://github.com/python/cpython/issues/86388}.)

@item 
@ref{1bd,,argparse.ArgumentParser} changed encoding and error handler
for reading arguments from file (e.g. @code{fromfile_prefix_chars} option)
from default text encoding (e.g. @ref{75b,,locale.getpreferredencoding(False)})
to @ref{75c,,filesystem encoding and error handler}.
Argument files should be encoded in UTF-8 instead of ANSI Codepage on Windows.

@item 
Remove the @code{asyncore}-based @code{smtpd} module deprecated in Python 3.4.7
and 3.5.4.  A recommended replacement is the
@ref{b,,asyncio}-based aiosmtpd@footnote{https://pypi.org/project/aiosmtpd/} PyPI module.

@item 
@ref{75d,,shlex.split()}: Passing @code{None} for `s' argument now raises an
exception, rather than reading @ref{75e,,sys.stdin}. The feature was deprecated
in Python 3.9.
(Contributed by Victor Stinner in gh-94352@footnote{https://github.com/python/cpython/issues/94352}.)

@item 
The @ref{a5,,os} module no longer accepts bytes-like paths, like
@ref{344,,bytearray} and @ref{165,,memoryview} types: only the exact
@ref{192,,bytes} type is accepted for bytes strings.
(Contributed by Victor Stinner in gh-98393@footnote{https://github.com/python/cpython/issues/98393}.)

@item 
@ref{75f,,syslog.openlog()} and @ref{760,,syslog.closelog()} now fail if used in subinterpreters.
@ref{761,,syslog.syslog()} may still be used in subinterpreters,
but now only if @code{syslog.openlog()} has already been called in the main interpreter.
These new restrictions do not apply to the main interpreter,
so only a very small set of users might be affected.
This change helps with interpreter isolation.  Furthermore, @ref{e2,,syslog} is a wrapper
around process-global resources, which are best managed from the main interpreter.
(Contributed by Donghee Na in gh-99127@footnote{https://github.com/python/cpython/issues/99127}.)

@item 
The undocumented locking behavior of @ref{762,,cached_property()}
is removed, because it locked across all instances of the class, leading to high
lock contention. This means that a cached property getter function could now run
more than once for a single instance, if two threads race. For most simple
cached properties (e.g. those that are idempotent and simply calculate a value
based on other attributes of the instance) this will be fine.  If
synchronization is needed, implement locking within the cached property getter
function or around multi-threaded access points.

@item 
@ref{6e8,,sys._current_exceptions()} now returns a mapping from thread-id to an
exception instance, rather than to a @code{(typ, exc, tb)} tuple.
(Contributed by Irit Katriel in gh-103176@footnote{https://github.com/python/cpython/issues/103176}.)

@item 
When extracting tar files using @ref{e4,,tarfile} or
@ref{695,,shutil.unpack_archive()}, pass the `filter' argument to limit features
that may be surprising or dangerous.
See @ref{696,,Extraction filters} for details.

@item 
The output of the @ref{6ff,,tokenize.tokenize()} and @ref{700,,tokenize.generate_tokens()}
functions is now changed due to the changes introduced in 
@geindex Python 향상 제안; PEP 701
PEP 701@footnote{https://peps.python.org/pep-0701/}. This
means that @code{STRING} tokens are not emitted any more for f-strings and the
tokens described in 
@geindex Python 향상 제안; PEP 701
PEP 701@footnote{https://peps.python.org/pep-0701/} are now produced instead: @code{FSTRING_START},
@code{FSTRING_MIDDLE} and @code{FSTRING_END} are now emitted for f-string “string”
parts in addition to the appropriate tokens for the tokenization in the
expression components. For example for the f-string @code{f"start @{1+1@} end"}
the old version of the tokenizer emitted:

@example
1,0-1,18:           STRING         'f"start @{1+1@} end"'
@end example

while the new version emits:

@example
1,0-1,2:            FSTRING_START  'f"'
1,2-1,8:            FSTRING_MIDDLE 'start '
1,8-1,9:            OP             '@{'
1,9-1,10:           NUMBER         '1'
1,10-1,11:          OP             '+'
1,11-1,12:          NUMBER         '1'
1,12-1,13:          OP             '@}'
1,13-1,17:          FSTRING_MIDDLE ' end'
1,17-1,18:          FSTRING_END    '"'
@end example

Additionally, there may be some minor behavioral changes as a consequence of the
changes required to support 
@geindex Python 향상 제안; PEP 701
PEP 701@footnote{https://peps.python.org/pep-0701/}. Some of these changes include:


@itemize *

@item 
The @code{type} attribute of the tokens emitted when tokenizing some invalid Python
characters such as @code{!} has changed from @code{ERRORTOKEN} to @code{OP}.

@item 
Incomplete single-line strings now also raise @ref{763,,tokenize.TokenError} as incomplete
multiline strings do.

@item 
Some incomplete or invalid Python code now raises @ref{763,,tokenize.TokenError} instead of
returning arbitrary @code{ERRORTOKEN} tokens when tokenizing it.

@item 
Mixing tabs and spaces as indentation in the same file is not supported anymore and will
raise a @ref{764,,TabError}.
@end itemize

@item 
The @ref{f3,,threading} module now expects the @code{_thread} module to have
an @code{_is_main_interpreter} attribute.  It is a function with no
arguments that returns @code{True} if the current interpreter is the
main interpreter.

Any library or application that provides a custom @code{_thread} module
should provide @code{_is_main_interpreter()}.
(See gh-112826@footnote{https://github.com/python/cpython/issues/112826}.)
@end itemize

@node Build Changes,C API Changes,Porting to Python 3 12,What’s New In Python 3 12
@anchor{whatsnew/3 12 build-changes}@anchor{765}
@subsection Build Changes



@itemize *

@item 
Python no longer uses @code{setup.py} to build shared C extension modules.
Build parameters like headers and libraries are detected in @code{configure}
script. Extensions are built by @code{Makefile}. Most extensions use
@code{pkg-config} and fall back to manual detection.
(Contributed by Christian Heimes in gh-93939@footnote{https://github.com/python/cpython/issues/93939}.)

@item 
@code{va_start()} with two parameters, like @code{va_start(args, format),}
is now required to build Python.
@code{va_start()} is no longer called with a single parameter.
(Contributed by Kumar Aditya in gh-93207@footnote{https://github.com/python/cpython/issues/93207}.)

@item 
CPython now uses the ThinLTO option as the default link time optimization policy
if the Clang compiler accepts the flag.
(Contributed by Donghee Na in gh-89536@footnote{https://github.com/python/cpython/issues/89536}.)

@item 
Add @code{COMPILEALL_OPTS} variable in @code{Makefile} to override @ref{21,,compileall}
options (default: @code{-j0}) in @code{make install}. Also merged the 3
@code{compileall} commands into a single command to build .pyc files for all
optimization levels (0, 1, 2) at once.
(Contributed by Victor Stinner in gh-99289@footnote{https://github.com/python/cpython/issues/99289}.)

@item 
Add platform triplets for 64-bit LoongArch:


@itemize *

@item 
loongarch64-linux-gnusf

@item 
loongarch64-linux-gnuf32

@item 
loongarch64-linux-gnu
@end itemize

(Contributed by Zhang Na in gh-90656@footnote{https://github.com/python/cpython/issues/90656}.)

@item 
@code{PYTHON_FOR_REGEN} now require Python 3.10 or newer.

@item 
Autoconf 2.71 and aclocal 1.16.4 is now required to regenerate
@code{configure}.
(Contributed by Christian Heimes in gh-89886@footnote{https://github.com/python/cpython/issues/89886}.)

@item 
Windows builds and macOS installers from python.org now use OpenSSL 3.0.
@end itemize

@node C API Changes,,Build Changes,What’s New In Python 3 12
@anchor{whatsnew/3 12 c-api-changes}@anchor{766}
@subsection C API Changes


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

@end menu

@node New Features<2>,Porting to Python 3 12<2>,,C API Changes
@anchor{whatsnew/3 12 id4}@anchor{767}
@subsubsection New Features

@anchor{whatsnew/3 12 whatsnew312-pep697}@anchor{675}

@itemize *

@item 
@geindex Python 향상 제안; PEP 697
PEP 697@footnote{https://peps.python.org/pep-0697/}: Introduce the @ref{768,,Unstable C API tier},
intended for low-level tools like debuggers and JIT compilers.
This API may change in each minor release of CPython without deprecation
warnings.
Its contents are marked by the @code{PyUnstable_} prefix in names.

Code object constructors:


@itemize -

@item 
@code{PyUnstable_Code_New()} (renamed from @code{PyCode_New})

@item 
@code{PyUnstable_Code_NewWithPosOnlyArgs()} (renamed from @code{PyCode_NewWithPosOnlyArgs})
@end itemize

Extra storage for code objects (
@geindex Python 향상 제안; PEP 523
PEP 523@footnote{https://peps.python.org/pep-0523/}):


@itemize -

@item 
@code{PyUnstable_Eval_RequestCodeExtraIndex()} (renamed from @code{_PyEval_RequestCodeExtraIndex})

@item 
@code{PyUnstable_Code_GetExtra()} (renamed from @code{_PyCode_GetExtra})

@item 
@code{PyUnstable_Code_SetExtra()} (renamed from @code{_PyCode_SetExtra})
@end itemize

The original names will continue to be available until the respective
API changes.

(Contributed by Petr Viktorin in gh-101101@footnote{https://github.com/python/cpython/issues/101101}.)

@item 
@geindex Python 향상 제안; PEP 697
PEP 697@footnote{https://peps.python.org/pep-0697/}: Add an API for extending types whose instance memory layout is
opaque:


@itemize -

@item 
@ref{769,,PyType_Spec.basicsize} can be zero or negative to specify
inheriting or extending the base class size.

@item 
@ref{76a,,PyObject_GetTypeData()} and @ref{76b,,PyType_GetTypeDataSize()}
added to allow access to subclass-specific instance data.

@item 
@ref{76c,,Py_TPFLAGS_ITEMS_AT_END} and @ref{76d,,PyObject_GetItemData()}
added to allow safely extending certain variable-sized types, including
@ref{76e,,PyType_Type}.

@item 
@ref{76f,,Py_RELATIVE_OFFSET} added to allow defining
@ref{770,,members} in terms of a subclass-specific struct.
@end itemize

(Contributed by Petr Viktorin in gh-103509@footnote{https://github.com/python/cpython/issues/103509}.)

@item 
Add the new @ref{635,,limited C API} function @ref{771,,PyType_FromMetaclass()},
which generalizes the existing @ref{772,,PyType_FromModuleAndSpec()} using
an additional metaclass argument.
(Contributed by Wenzel Jakob in gh-93012@footnote{https://github.com/python/cpython/issues/93012}.)

@item 
API for creating objects that can be called using
@ref{773,,the vectorcall protocol} was added to the
@ref{774,,Limited API}:


@itemize *

@item 
@ref{775,,Py_TPFLAGS_HAVE_VECTORCALL}

@item 
@ref{776,,PyVectorcall_NARGS()}

@item 
@ref{777,,PyVectorcall_Call()}

@item 
@ref{778,,vectorcallfunc}
@end itemize

The @ref{775,,Py_TPFLAGS_HAVE_VECTORCALL} flag is now removed from a class
when the class’s @ref{779,,__call__()} method is reassigned.
This makes vectorcall safe to use with mutable types (i.e. heap types
without the immutable flag, @ref{3cf,,Py_TPFLAGS_IMMUTABLETYPE}).
Mutable types that do not override @ref{77a,,tp_call} now
inherit the @code{Py_TPFLAGS_HAVE_VECTORCALL} flag.
(Contributed by Petr Viktorin in gh-93274@footnote{https://github.com/python/cpython/issues/93274}.)

The @ref{60d,,Py_TPFLAGS_MANAGED_DICT} and @ref{77b,,Py_TPFLAGS_MANAGED_WEAKREF}
flags have been added. This allows extensions classes to support object
@ref{77c,,__dict__} and weakrefs with less bookkeeping,
using less memory and with faster access.

@item 
API for performing calls using
@ref{773,,the vectorcall protocol} was added to the
@ref{774,,Limited API}:


@itemize *

@item 
@ref{77d,,PyObject_Vectorcall()}

@item 
@ref{77e,,PyObject_VectorcallMethod()}

@item 
@ref{77f,,PY_VECTORCALL_ARGUMENTS_OFFSET}
@end itemize

This means that both the incoming and outgoing ends of the vector call
protocol are now available in the @ref{774,,Limited API}. (Contributed
by Wenzel Jakob in gh-98586@footnote{https://github.com/python/cpython/issues/98586}.)

@item 
Add two new public functions,
@ref{780,,PyEval_SetProfileAllThreads()} and
@ref{662,,PyEval_SetTraceAllThreads()}, that allow to set tracing and profiling
functions in all running threads in addition to the calling one. (Contributed
by Pablo Galindo in gh-93503@footnote{https://github.com/python/cpython/issues/93503}.)

@item 
Add new function @ref{781,,PyFunction_SetVectorcall()} to the C API
which sets the vectorcall field of a given @ref{782,,PyFunctionObject}.
(Contributed by Andrew Frost in gh-92257@footnote{https://github.com/python/cpython/issues/92257}.)

@item 
The C API now permits registering callbacks via @ref{3d0,,PyDict_AddWatcher()},
@ref{783,,PyDict_Watch()} and related APIs to be called whenever a dictionary
is modified. This is intended for use by optimizing interpreters, JIT
compilers, or debuggers.
(Contributed by Carl Meyer in gh-91052@footnote{https://github.com/python/cpython/issues/91052}.)

@item 
Add @ref{784,,PyType_AddWatcher()} and @ref{785,,PyType_Watch()} API to register
callbacks to receive notification on changes to a type.
(Contributed by Carl Meyer in gh-91051@footnote{https://github.com/python/cpython/issues/91051}.)

@item 
Add @ref{786,,PyCode_AddWatcher()} and @ref{787,,PyCode_ClearWatcher()}
APIs to register callbacks to receive notification on creation and
destruction of code objects.
(Contributed by Itamar Oren in gh-91054@footnote{https://github.com/python/cpython/issues/91054}.)

@item 
Add @ref{788,,PyFrame_GetVar()} and @ref{789,,PyFrame_GetVarString()} functions to
get a frame variable by its name.
(Contributed by Victor Stinner in gh-91248@footnote{https://github.com/python/cpython/issues/91248}.)

@item 
Add @ref{429,,PyErr_GetRaisedException()} and @ref{42c,,PyErr_SetRaisedException()}
for saving and restoring the current exception.
These functions return and accept a single exception object,
rather than the triple arguments of the now-deprecated
@ref{428,,PyErr_Fetch()} and @ref{42b,,PyErr_Restore()}.
This is less error prone and a bit more efficient.
(Contributed by Mark Shannon in gh-101578@footnote{https://github.com/python/cpython/issues/101578}.)

@item 
Add @code{_PyErr_ChainExceptions1}, which takes an exception instance,
to replace the legacy-API @code{_PyErr_ChainExceptions}, which is now
deprecated. (Contributed by Mark Shannon in gh-101578@footnote{https://github.com/python/cpython/issues/101578}.)

@item 
Add @ref{78a,,PyException_GetArgs()} and @ref{78b,,PyException_SetArgs()}
as convenience functions for retrieving and modifying
the @ref{78c,,args} passed to the exception’s constructor.
(Contributed by Mark Shannon in gh-101578@footnote{https://github.com/python/cpython/issues/101578}.)

@item 
Add @ref{435,,PyErr_DisplayException()}, which takes an exception instance,
to replace the legacy-api @code{PyErr_Display()}. (Contributed by
Irit Katriel in gh-102755@footnote{https://github.com/python/cpython/issues/102755}).
@end itemize
@anchor{whatsnew/3 12 whatsnew312-pep683}@anchor{676}

@itemize *

@item 
@geindex Python 향상 제안; PEP 683
PEP 683@footnote{https://peps.python.org/pep-0683/}: Introduce `Immortal Objects', which allows objects
to bypass reference counts, and related changes to the C-API:


@itemize -

@item 

@table @asis

@item @code{_Py_IMMORTAL_REFCNT}: The reference count that defines an object

as immortal.
@end table

@item 
@code{_Py_IsImmortal} Checks if an object has the immortal reference count.

@item 

@table @asis

@item @code{PyObject_HEAD_INIT} This will now initialize reference count to

@code{_Py_IMMORTAL_REFCNT} when used with @code{Py_BUILD_CORE}.
@end table

@item 

@table @asis

@item @code{SSTATE_INTERNED_IMMORTAL} An identifier for interned unicode objects

that are immortal.
@end table

@item 

@table @asis

@item @code{SSTATE_INTERNED_IMMORTAL_STATIC} An identifier for interned unicode

objects that are immortal and static
@end table

@item 

@table @asis

@item @code{sys.getunicodeinternedsize} This returns the total number of unicode

objects that have been interned. This is now needed for @code{refleak.py} to
correctly track reference counts and allocated blocks
@end table
@end itemize

(Contributed by Eddie Elizondo in gh-84436@footnote{https://github.com/python/cpython/issues/84436}.)

@item 
@geindex Python 향상 제안; PEP 684
PEP 684@footnote{https://peps.python.org/pep-0684/}: Add the new @ref{688,,Py_NewInterpreterFromConfig()}
function and @ref{78d,,PyInterpreterConfig}, which may be used
to create sub-interpreters with their own GILs.
(See @ref{66e,,PEP 684; A Per-Interpreter GIL} for more info.)
(Contributed by Eric Snow in gh-104110@footnote{https://github.com/python/cpython/issues/104110}.)

@item 
In the limited C API version 3.12, @ref{78e,,Py_INCREF()} and
@ref{78f,,Py_DECREF()} functions are now implemented as opaque function calls to
hide implementation details.
(Contributed by Victor Stinner in gh-105387@footnote{https://github.com/python/cpython/issues/105387}.)
@end itemize

@node Porting to Python 3 12<2>,Deprecated<3>,New Features<2>,C API Changes
@anchor{whatsnew/3 12 id5}@anchor{790}
@subsubsection Porting to Python 3.12



@itemize *

@item 
Legacy Unicode APIs based on @code{Py_UNICODE*} representation has been removed.
Please migrate to APIs based on UTF-8 or @code{wchar_t*}.

@item 
Argument parsing functions like @ref{3c1,,PyArg_ParseTuple()} doesn’t support
@code{Py_UNICODE*} based format (e.g. @code{u}, @code{Z}) anymore. Please migrate
to other formats for Unicode like @code{s}, @code{z}, @code{es}, and @code{U}.

@item 
@code{tp_weaklist} for all static builtin types is always @code{NULL}.
This is an internal-only field on @code{PyTypeObject}
but we’re pointing out the change in case someone happens to be
accessing the field directly anyway.  To avoid breakage, consider
using the existing public C-API instead, or, if necessary, the
(internal-only) @code{_PyObject_GET_WEAKREFS_LISTPTR()} macro.

@item 
This internal-only @ref{791,,PyTypeObject.tp_subclasses} may now not be
a valid object pointer.  Its type was changed to void* to
reflect this.  We mention this in case someone happens to be accessing the
internal-only field directly.

To get a list of subclasses, call the Python method
@ref{792,,__subclasses__()} (using @ref{63e,,PyObject_CallMethod()},
for example).

@item 
Add support of more formatting options (left aligning, octals, uppercase
hexadecimals, @code{intmax_t}, @code{ptrdiff_t}, @code{wchar_t} C
strings, variable width and precision) in @ref{629,,PyUnicode_FromFormat()} and
@ref{793,,PyUnicode_FromFormatV()}.
(Contributed by Serhiy Storchaka in gh-98836@footnote{https://github.com/python/cpython/issues/98836}.)

@item 
An unrecognized format character in @ref{629,,PyUnicode_FromFormat()} and
@ref{793,,PyUnicode_FromFormatV()} now sets a @ref{794,,SystemError}.
In previous versions it caused all the rest of the format string to be
copied as-is to the result string, and any extra arguments discarded.
(Contributed by Serhiy Storchaka in gh-95781@footnote{https://github.com/python/cpython/issues/95781}.)

@item 
Fix wrong sign placement in @ref{629,,PyUnicode_FromFormat()} and
@ref{793,,PyUnicode_FromFormatV()}.
(Contributed by Philip Georgi in gh-95504@footnote{https://github.com/python/cpython/issues/95504}.)

@item 
Extension classes wanting to add a @ref{77c,,__dict__} or weak reference slot
should use @ref{60d,,Py_TPFLAGS_MANAGED_DICT} and
@ref{77b,,Py_TPFLAGS_MANAGED_WEAKREF} instead of @code{tp_dictoffset} and
@code{tp_weaklistoffset}, respectively.
The use of @code{tp_dictoffset} and @code{tp_weaklistoffset} is still
supported, but does not fully support multiple inheritance
(gh-95589@footnote{https://github.com/python/cpython/issues/95589}), and performance may be worse.
Classes declaring @code{Py_TPFLAGS_MANAGED_DICT} must call
@code{_PyObject_VisitManagedDict()} and @code{_PyObject_ClearManagedDict()}
to traverse and clear their instance’s dictionaries.
To clear weakrefs, call @ref{795,,PyObject_ClearWeakRefs()}, as before.

@item 
The @ref{796,,PyUnicode_FSDecoder()} function no longer accepts bytes-like
paths, like @ref{344,,bytearray} and @ref{165,,memoryview} types: only the exact
@ref{192,,bytes} type is accepted for bytes strings.
(Contributed by Victor Stinner in gh-98393@footnote{https://github.com/python/cpython/issues/98393}.)

@item 
The @ref{797,,Py_CLEAR}, @ref{798,,Py_SETREF} and @ref{799,,Py_XSETREF}
macros now only evaluate their arguments once. If an argument has side
effects, these side effects are no longer duplicated.
(Contributed by Victor Stinner in gh-98724@footnote{https://github.com/python/cpython/issues/98724}.)

@item 
The interpreter’s error indicator is now always normalized. This means
that @ref{79a,,PyErr_SetObject()}, @ref{79b,,PyErr_SetString()} and the other
functions that set the error indicator now normalize the exception
before storing it. (Contributed by Mark Shannon in gh-101578@footnote{https://github.com/python/cpython/issues/101578}.)

@item 
@code{_Py_RefTotal} is no longer authoritative and only kept around
for ABI compatibility.  Note that it is an internal global and only
available on debug builds.  If you happen to be using it then you’ll
need to start using @code{_Py_GetGlobalRefTotal()}.

@item 
The following functions now select an appropriate metaclass for the newly
created type:


@itemize *

@item 
@ref{79c,,PyType_FromSpec()}

@item 
@ref{79d,,PyType_FromSpecWithBases()}

@item 
@ref{772,,PyType_FromModuleAndSpec()}
@end itemize

Creating classes whose metaclass overrides @ref{79e,,tp_new}
is deprecated, and in Python 3.14+ it will be disallowed.
Note that these functions ignore @code{tp_new} of the metaclass, possibly
allowing incomplete initialization.

Note that @ref{771,,PyType_FromMetaclass()} (added in Python 3.12)
already disallows creating classes whose metaclass overrides @code{tp_new}
(@ref{79f,,__new__()} in Python).

Since @code{tp_new} overrides almost everything @code{PyType_From*} functions do,
the two are incompatible with each other.
The existing behavior – ignoring the metaclass for several steps
of type creation – is unsafe in general, since (meta)classes assume that
@code{tp_new} was called.
There is no simple general workaround. One of the following may work for you:


@itemize -

@item 
If you control the metaclass, avoid using @code{tp_new} in it:


@itemize -

@item 
If initialization can be skipped, it can be done in
@ref{7a0,,tp_init} instead.

@item 
If the metaclass doesn’t need to be instantiated from Python,
set its @code{tp_new} to @code{NULL} using
the @ref{7a1,,Py_TPFLAGS_DISALLOW_INSTANTIATION} flag.
This makes it acceptable for @code{PyType_From*} functions.
@end itemize

@item 
Avoid @code{PyType_From*} functions: if you don’t need C-specific features
(slots or setting the instance size), create types by @ref{7a2,,calling}
the metaclass.

@item 
If you `know' the @code{tp_new} can be skipped safely, filter the deprecation
warning out using @ref{179,,warnings.catch_warnings()} from Python.
@end itemize

@item 
@ref{7a3,,PyOS_InputHook} and @ref{7a4,,PyOS_ReadlineFunctionPointer} are no
longer called in @ref{163,,subinterpreters}. This is
because clients generally rely on process-wide global state (since these
callbacks have no way of recovering extension module state).

This also avoids situations where extensions may find themselves running in a
subinterpreter that they don’t support (or haven’t yet been loaded in). See
gh-104668@footnote{https://github.com/python/cpython/issues/104668} for more info.

@item 
@ref{39e,,PyLongObject} has had its internals changed for better performance.
Although the internals of @code{PyLongObject} are private, they are used
by some extension modules.
The internal fields should no longer be accessed directly, instead the API
functions beginning @code{PyLong_...} should be used instead.
Two new `unstable' API functions are provided for efficient access to the
value of @code{PyLongObject}s which fit into a single machine word:


@itemize *

@item 
@ref{7a5,,PyUnstable_Long_IsCompact()}

@item 
@ref{7a6,,PyUnstable_Long_CompactValue()}
@end itemize

@item 
Custom allocators, set via @ref{7a7,,PyMem_SetAllocator()}, are now
required to be thread-safe, regardless of memory domain.  Allocators
that don’t have their own state, including “hooks”, are not affected.
If your custom allocator is not already thread-safe and you need
guidance then please create a new GitHub issue
and CC @code{@@ericsnowcurrently}.
@end itemize

@node Deprecated<3>,Removed<3>,Porting to Python 3 12<2>,C API Changes
@anchor{whatsnew/3 12 id6}@anchor{7a8}
@subsubsection Deprecated



@itemize *

@item 
In accordance with 
@geindex Python 향상 제안; PEP 699
PEP 699@footnote{https://peps.python.org/pep-0699/}, the @code{ma_version_tag} field in @ref{64d,,PyDictObject}
is deprecated for extension modules. Accessing this field will generate a compiler
warning at compile time. This field will be removed in Python 3.14.
(Contributed by Ramvikrams and Kumar Aditya in gh-101193@footnote{https://github.com/python/cpython/issues/101193}. PEP by Ken Jin.)

@item 
Deprecate global configuration variable:


@itemize *

@item 
@ref{3f8,,Py_DebugFlag}: use @ref{3f9,,PyConfig.parser_debug}

@item 
@ref{3fa,,Py_VerboseFlag}: use @ref{3fb,,PyConfig.verbose}

@item 
@ref{3fc,,Py_QuietFlag}: use @ref{3fd,,PyConfig.quiet}

@item 
@ref{3fe,,Py_InteractiveFlag}: use @ref{3ff,,PyConfig.interactive}

@item 
@ref{400,,Py_InspectFlag}: use @ref{401,,PyConfig.inspect}

@item 
@ref{402,,Py_OptimizeFlag}: use @ref{403,,PyConfig.optimization_level}

@item 
@ref{404,,Py_NoSiteFlag}: use @ref{405,,PyConfig.site_import}

@item 
@ref{406,,Py_BytesWarningFlag}: use @ref{407,,PyConfig.bytes_warning}

@item 
@ref{408,,Py_FrozenFlag}: use @ref{409,,PyConfig.pathconfig_warnings}

@item 
@ref{40a,,Py_IgnoreEnvironmentFlag}: use @ref{40b,,PyConfig.use_environment}

@item 
@ref{40c,,Py_DontWriteBytecodeFlag}: use @ref{40d,,PyConfig.write_bytecode}

@item 
@ref{40e,,Py_NoUserSiteDirectory}: use @ref{40f,,PyConfig.user_site_directory}

@item 
@ref{410,,Py_UnbufferedStdioFlag}: use @ref{411,,PyConfig.buffered_stdio}

@item 
@ref{412,,Py_HashRandomizationFlag}: use @ref{413,,PyConfig.use_hash_seed}
and @ref{414,,PyConfig.hash_seed}

@item 
@ref{415,,Py_IsolatedFlag}: use @ref{416,,PyConfig.isolated}

@item 
@ref{417,,Py_LegacyWindowsFSEncodingFlag}: use @ref{418,,PyPreConfig.legacy_windows_fs_encoding}

@item 
@ref{419,,Py_LegacyWindowsStdioFlag}: use @ref{41a,,PyConfig.legacy_windows_stdio}

@item 
@code{Py_FileSystemDefaultEncoding}: use @ref{41b,,PyConfig.filesystem_encoding}

@item 
@code{Py_HasFileSystemDefaultEncoding}: use @ref{41b,,PyConfig.filesystem_encoding}

@item 
@code{Py_FileSystemDefaultEncodeErrors}: use @ref{41c,,PyConfig.filesystem_errors}

@item 
@code{Py_UTF8Mode}: use @ref{41d,,PyPreConfig.utf8_mode} (see @ref{41e,,Py_PreInitialize()})
@end itemize

The @ref{3f6,,Py_InitializeFromConfig()} API should be used with
@ref{3f7,,PyConfig} instead.
(Contributed by Victor Stinner in gh-77782@footnote{https://github.com/python/cpython/issues/77782}.)

@item 
Creating @ref{3cf,,immutable types} with mutable
bases is deprecated and will be disabled in Python 3.14. (gh-95388@footnote{https://github.com/python/cpython/issues/95388})

@item 
The @code{structmember.h} header is deprecated, though it continues to be
available and there are no plans to remove it.

Its contents are now available just by including @code{Python.h},
with a @code{Py} prefix added if it was missing:


@itemize -

@item 
@ref{770,,PyMemberDef}, @ref{7a9,,PyMember_GetOne()} and
@ref{7aa,,PyMember_SetOne()}

@item 
Type macros like @ref{7ab,,Py_T_INT}, @ref{7ac,,Py_T_DOUBLE}, etc.
(previously @code{T_INT}, @code{T_DOUBLE}, etc.)

@item 
The flags @ref{7ad,,Py_READONLY} (previously @code{READONLY}) and
@ref{7ae,,Py_AUDIT_READ} (previously all uppercase)
@end itemize

Several items are not exposed from @code{Python.h}:


@itemize -

@item 
@ref{7af,,T_OBJECT} (use @ref{7b0,,Py_T_OBJECT_EX})

@item 
@ref{7b1,,T_NONE} (previously undocumented, and pretty quirky)

@item 
The macro @code{WRITE_RESTRICTED} which does nothing.

@item 
The macros @code{RESTRICTED} and @code{READ_RESTRICTED}, equivalents of
@ref{7ae,,Py_AUDIT_READ}.

@item 
In some configurations, @code{<stddef.h>} is not included from @code{Python.h}.
It should be included manually when using @code{offsetof()}.
@end itemize

The deprecated header continues to provide its original
contents under the original names.
Your old code can stay unchanged, unless the extra include and non-namespaced
macros bother you greatly.

(Contributed in gh-47146@footnote{https://github.com/python/cpython/issues/47146} by Petr Viktorin, based on
earlier work by Alexander Belopolsky and Matthias Braun.)

@item 
@ref{428,,PyErr_Fetch()} and @ref{42b,,PyErr_Restore()} are deprecated.
Use @ref{429,,PyErr_GetRaisedException()} and
@ref{42c,,PyErr_SetRaisedException()} instead.
(Contributed by Mark Shannon in gh-101578@footnote{https://github.com/python/cpython/issues/101578}.)

@item 
@code{PyErr_Display()} is deprecated. Use @ref{435,,PyErr_DisplayException()}
instead. (Contributed by Irit Katriel in gh-102755@footnote{https://github.com/python/cpython/issues/102755}).

@item 
@code{_PyErr_ChainExceptions} is deprecated. Use @code{_PyErr_ChainExceptions1}
instead. (Contributed by Irit Katriel in gh-102192@footnote{https://github.com/python/cpython/issues/102192}.)

@item 
Using @ref{79c,,PyType_FromSpec()}, @ref{79d,,PyType_FromSpecWithBases()}
or @ref{772,,PyType_FromModuleAndSpec()} to create a class whose metaclass
overrides @ref{79e,,tp_new} is deprecated.
Call the metaclass instead.
@end itemize

@c Add deprecations above alphabetically, not here at the end.

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

@end menu

@node Pending removal in Python 3 14<2>,Pending removal in Python 3 15<4>,,Deprecated<3>
@anchor{whatsnew/3 12 id7}@anchor{7b2}
@subsubsection Pending removal in Python 3.14



@itemize *

@item 
The @code{ma_version_tag} field in @ref{64d,,PyDictObject} for extension modules
(
@geindex Python 향상 제안; PEP 699
PEP 699@footnote{https://peps.python.org/pep-0699/}; gh-101193@footnote{https://github.com/python/cpython/issues/101193}).

@item 
Creating @ref{3cf,,immutable types} with mutable
bases (gh-95388@footnote{https://github.com/python/cpython/issues/95388}).
@end itemize

@node Pending removal in Python 3 15<4>,Pending removal in Python 3 16<4>,Pending removal in Python 3 14<2>,Deprecated<3>
@anchor{whatsnew/3 12 id8}@anchor{7b3}
@subsubsection Pending removal in Python 3.15



@itemize *

@item 
The @ref{3db,,PyImport_ImportModuleNoBlock()}:
Use @ref{3dc,,PyImport_ImportModule()} instead.

@item 
@ref{3dd,,PyWeakref_GetObject()} and @ref{3de,,PyWeakref_GET_OBJECT()}:
Use @ref{3df,,PyWeakref_GetRef()} instead. The pythoncapi-compat project@footnote{https://github.com/python/pythoncapi-compat/} can be used to get
@code{PyWeakref_GetRef()} on Python 3.12 and older.

@item 
@ref{3e0,,Py_UNICODE} type and the @code{Py_UNICODE_WIDE} macro:
Use @code{wchar_t} instead.

@item 
@code{PyUnicode_AsDecodedObject()}:
Use @ref{3e1,,PyCodec_Decode()} instead.

@item 
@code{PyUnicode_AsDecodedUnicode()}:
Use @ref{3e1,,PyCodec_Decode()} instead; Note that some codecs (for example, “base64”)
may return a type other than @ref{169,,str}, such as @ref{192,,bytes}.

@item 
@code{PyUnicode_AsEncodedObject()}:
Use @ref{3e2,,PyCodec_Encode()} instead.

@item 
@code{PyUnicode_AsEncodedUnicode()}:
Use @ref{3e2,,PyCodec_Encode()} instead; Note that some codecs (for example, “base64”)
may return a type other than @ref{192,,bytes}, such as @ref{169,,str}.

@item 
Python initialization functions, deprecated in Python 3.13:


@itemize *

@item 
@ref{3e3,,Py_GetPath()}:
Use @ref{37c,,PyConfig_Get("module_search_paths")}
(@ref{3e4,,sys.path}) instead.

@item 
@ref{3e5,,Py_GetPrefix()}:
Use @ref{37c,,PyConfig_Get("base_prefix")}
(@ref{3e6,,sys.base_prefix}) instead. Use @code{PyConfig_Get("prefix")} (@ref{3e7,,sys.prefix}) if @ref{3e8,,virtual environments} need to be handled.

@item 
@ref{3e9,,Py_GetExecPrefix()}:
Use @ref{37c,,PyConfig_Get("base_exec_prefix")}
(@ref{3ea,,sys.base_exec_prefix}) instead. Use
@code{PyConfig_Get("exec_prefix")}
(@ref{3eb,,sys.exec_prefix}) if @ref{3e8,,virtual environments} need to
be handled.

@item 
@ref{3ec,,Py_GetProgramFullPath()}:
Use @ref{37c,,PyConfig_Get("executable")}
(@ref{3ed,,sys.executable}) instead.

@item 
@ref{3ee,,Py_GetProgramName()}:
Use @ref{37c,,PyConfig_Get("executable")}
(@ref{3ed,,sys.executable}) instead.

@item 
@ref{3ef,,Py_GetPythonHome()}:
Use @ref{37c,,PyConfig_Get("home")} or the
@geindex PYTHONHOME
@geindex 환경 변수; PYTHONHOME
@ref{3f0,,PYTHONHOME} environment variable instead.
@end itemize

The pythoncapi-compat project@footnote{https://github.com/python/pythoncapi-compat/} can be used to get
@ref{37c,,PyConfig_Get()} on Python 3.13 and older.

@item 
Functions to configure Python’s initialization, deprecated in Python 3.11:


@itemize *

@item 
@code{PySys_SetArgvEx()}:
Set @ref{3f1,,PyConfig.argv} instead.

@item 
@code{PySys_SetArgv()}:
Set @ref{3f1,,PyConfig.argv} instead.

@item 
@code{Py_SetProgramName()}:
Set @ref{3f2,,PyConfig.program_name} instead.

@item 
@code{Py_SetPythonHome()}:
Set @ref{3f3,,PyConfig.home} instead.

@item 
@ref{3f4,,PySys_ResetWarnOptions()}:
Clear @ref{3f5,,sys.warnoptions} and @code{warnings.filters} instead.
@end itemize

The @ref{3f6,,Py_InitializeFromConfig()} API should be used with
@ref{3f7,,PyConfig} instead.

@item 
Global configuration variables:


@itemize *

@item 
@ref{3f8,,Py_DebugFlag}:
Use @ref{3f9,,PyConfig.parser_debug} or
@ref{37c,,PyConfig_Get("parser_debug")} instead.

@item 
@ref{3fa,,Py_VerboseFlag}:
Use @ref{3fb,,PyConfig.verbose} or
@ref{37c,,PyConfig_Get("verbose")} instead.

@item 
@ref{3fc,,Py_QuietFlag}:
Use @ref{3fd,,PyConfig.quiet} or
@ref{37c,,PyConfig_Get("quiet")} instead.

@item 
@ref{3fe,,Py_InteractiveFlag}:
Use @ref{3ff,,PyConfig.interactive} or
@ref{37c,,PyConfig_Get("interactive")} instead.

@item 
@ref{400,,Py_InspectFlag}:
Use @ref{401,,PyConfig.inspect} or
@ref{37c,,PyConfig_Get("inspect")} instead.

@item 
@ref{402,,Py_OptimizeFlag}:
Use @ref{403,,PyConfig.optimization_level} or
@ref{37c,,PyConfig_Get("optimization_level")} instead.

@item 
@ref{404,,Py_NoSiteFlag}:
Use @ref{405,,PyConfig.site_import} or
@ref{37c,,PyConfig_Get("site_import")} instead.

@item 
@ref{406,,Py_BytesWarningFlag}:
Use @ref{407,,PyConfig.bytes_warning} or
@ref{37c,,PyConfig_Get("bytes_warning")} instead.

@item 
@ref{408,,Py_FrozenFlag}:
Use @ref{409,,PyConfig.pathconfig_warnings} or
@ref{37c,,PyConfig_Get("pathconfig_warnings")} instead.

@item 
@ref{40a,,Py_IgnoreEnvironmentFlag}:
Use @ref{40b,,PyConfig.use_environment} or
@ref{37c,,PyConfig_Get("use_environment")} instead.

@item 
@ref{40c,,Py_DontWriteBytecodeFlag}:
Use @ref{40d,,PyConfig.write_bytecode} or
@ref{37c,,PyConfig_Get("write_bytecode")} instead.

@item 
@ref{40e,,Py_NoUserSiteDirectory}:
Use @ref{40f,,PyConfig.user_site_directory} or
@ref{37c,,PyConfig_Get("user_site_directory")} instead.

@item 
@ref{410,,Py_UnbufferedStdioFlag}:
Use @ref{411,,PyConfig.buffered_stdio} or
@ref{37c,,PyConfig_Get("buffered_stdio")} instead.

@item 
@ref{412,,Py_HashRandomizationFlag}:
Use @ref{413,,PyConfig.use_hash_seed}
and @ref{414,,PyConfig.hash_seed} or
@ref{37c,,PyConfig_Get("hash_seed")} instead.

@item 
@ref{415,,Py_IsolatedFlag}:
Use @ref{416,,PyConfig.isolated} or
@ref{37c,,PyConfig_Get("isolated")} instead.

@item 
@ref{417,,Py_LegacyWindowsFSEncodingFlag}:
Use @ref{418,,PyPreConfig.legacy_windows_fs_encoding} or
@ref{37c,,PyConfig_Get("legacy_windows_fs_encoding")} instead.

@item 
@ref{419,,Py_LegacyWindowsStdioFlag}:
Use @ref{41a,,PyConfig.legacy_windows_stdio} or
@ref{37c,,PyConfig_Get("legacy_windows_stdio")} instead.

@item 
@code{Py_FileSystemDefaultEncoding}, @code{Py_HasFileSystemDefaultEncoding}:
Use @ref{41b,,PyConfig.filesystem_encoding} or
@ref{37c,,PyConfig_Get("filesystem_encoding")} instead.

@item 
@code{Py_FileSystemDefaultEncodeErrors}:
Use @ref{41c,,PyConfig.filesystem_errors} or
@ref{37c,,PyConfig_Get("filesystem_errors")} instead.

@item 
@code{Py_UTF8Mode}:
Use @ref{41d,,PyPreConfig.utf8_mode} or
@ref{37c,,PyConfig_Get("utf8_mode")} instead.
(see @ref{41e,,Py_PreInitialize()})
@end itemize

The @ref{3f6,,Py_InitializeFromConfig()} API should be used with
@ref{3f7,,PyConfig} to set these options. Or @ref{37c,,PyConfig_Get()} can be
used to get these options at runtime.
@end itemize

@node Pending removal in Python 3 16<4>,Pending removal in future versions<4>,Pending removal in Python 3 15<4>,Deprecated<3>
@anchor{whatsnew/3 12 id9}@anchor{7b4}
@subsubsection Pending removal in Python 3.16



@itemize *

@item 
The bundled copy of @code{libmpdec}.
@end itemize

@node Pending removal in future versions<4>,,Pending removal in Python 3 16<4>,Deprecated<3>
@anchor{whatsnew/3 12 id10}@anchor{7b5}
@subsubsection Pending removal in future versions


The following APIs are deprecated and will be removed,
although there is currently no date scheduled for their removal.


@itemize *

@item 
@ref{427,,Py_TPFLAGS_HAVE_FINALIZE}:
Unneeded since Python 3.8.

@item 
@ref{428,,PyErr_Fetch()}:
Use @ref{429,,PyErr_GetRaisedException()} instead.

@item 
@ref{42a,,PyErr_NormalizeException()}:
Use @ref{429,,PyErr_GetRaisedException()} instead.

@item 
@ref{42b,,PyErr_Restore()}:
Use @ref{42c,,PyErr_SetRaisedException()} instead.

@item 
@ref{42d,,PyModule_GetFilename()}:
Use @ref{42e,,PyModule_GetFilenameObject()} instead.

@item 
@ref{42f,,PyOS_AfterFork()}:
Use @ref{430,,PyOS_AfterFork_Child()} instead.

@item 
@ref{431,,PySlice_GetIndicesEx()}:
Use @ref{432,,PySlice_Unpack()} and @ref{433,,PySlice_AdjustIndices()} instead.

@item 
@ref{434,,PyUnicode_READY()}:
Unneeded since Python 3.12

@item 
@code{PyErr_Display()}:
Use @ref{435,,PyErr_DisplayException()} instead.

@item 
@code{_PyErr_ChainExceptions()}:
Use @code{_PyErr_ChainExceptions1()} instead.

@item 
@code{PyBytesObject.ob_shash} member:
call @ref{436,,PyObject_Hash()} instead.

@item 
Thread Local Storage (TLS) API:


@itemize *

@item 
@ref{437,,PyThread_create_key()}:
Use @ref{438,,PyThread_tss_alloc()} instead.

@item 
@ref{439,,PyThread_delete_key()}:
Use @ref{43a,,PyThread_tss_free()} instead.

@item 
@ref{43b,,PyThread_set_key_value()}:
Use @ref{43c,,PyThread_tss_set()} instead.

@item 
@ref{43d,,PyThread_get_key_value()}:
Use @ref{43e,,PyThread_tss_get()} instead.

@item 
@ref{43f,,PyThread_delete_key_value()}:
Use @ref{440,,PyThread_tss_delete()} instead.

@item 
@ref{441,,PyThread_ReInitTLS()}:
Unneeded since Python 3.7.
@end itemize
@end itemize

@node Removed<3>,,Deprecated<3>,C API Changes
@anchor{whatsnew/3 12 id11}@anchor{7b6}
@subsubsection Removed



@itemize *

@item 
Remove the @code{token.h} header file. There was never any public tokenizer C
API. The @code{token.h} header file was only designed to be used by Python
internals.
(Contributed by Victor Stinner in gh-92651@footnote{https://github.com/python/cpython/issues/92651}.)

@item 
Legacy Unicode APIs have been removed. See 
@geindex Python 향상 제안; PEP 623
PEP 623@footnote{https://peps.python.org/pep-0623/} for detail.


@itemize *

@item 
@code{PyUnicode_WCHAR_KIND}

@item 
@code{PyUnicode_AS_UNICODE()}

@item 
@code{PyUnicode_AsUnicode()}

@item 
@code{PyUnicode_AsUnicodeAndSize()}

@item 
@code{PyUnicode_AS_DATA()}

@item 
@code{PyUnicode_FromUnicode()}

@item 
@code{PyUnicode_GET_SIZE()}

@item 
@code{PyUnicode_GetSize()}

@item 
@code{PyUnicode_GET_DATA_SIZE()}
@end itemize

@item 
Remove the @code{PyUnicode_InternImmortal()} function macro.
(Contributed by Victor Stinner in gh-85858@footnote{https://github.com/python/cpython/issues/85858}.)
@end itemize

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node What’s New In Python 3 11,What’s New In Python 3 10,What’s New In Python 3 12,파이썬의 새로운 기능
@anchor{whatsnew/3 11 doc}@anchor{7b7}@anchor{whatsnew/3 11 translation-repo}@anchor{7b8}@anchor{whatsnew/3 11 what-s-new-in-python-3-11}@anchor{7b9}
@section What’s New In Python 3.11


@*Editor: 
Pablo Galindo Salgado


@c Rules for maintenance:
@c 
@c * Anyone can add text to this document.  Do not spend very much time
@c on the wording of your changes, because your text will probably
@c get rewritten to some degree.
@c 
@c * The maintainer will go through Misc/NEWS periodically and add
@c changes; it's therefore more important to add your changes to
@c Misc/NEWS than to this file.
@c 
@c * This is not a complete list of every single change; completeness
@c is the purpose of Misc/NEWS.  Some changes I consider too small
@c or esoteric to include.  If such a change is added to the text,
@c I'll just remove it.  (This is another reason you shouldn't spend
@c too much time on writing your addition.)
@c 
@c * If you want to draw your new text to the attention of the
@c maintainer, add 'XXX' to the beginning of the paragraph or
@c section.
@c 
@c * It's OK to just add a fragmentary note about a change.  For
@c example: "XXX Describe the transmogrify() function added to the
@c socket module."  The maintainer will research the change and
@c write the necessary text.
@c 
@c * You can comment out your additions if you like, but it's not
@c necessary (especially when a final release is some months away).
@c 
@c * Credit the author of a patch or bugfix.   Just the name is
@c sufficient; the e-mail address isn't necessary.
@c 
@c * It's helpful to add the bug/patch number as a comment:
@c 
@c XXX Describe the transmogrify() function added to the socket
@c module.
@c (Contributed by P.Y. Developer in :issue:`12345`.)
@c 
@c This saves the maintainer the effort of going through the Mercurial log
@c when researching a change.

This article explains the new features in Python 3.11, compared to 3.10.
Python 3.11 was released on October 24, 2022.
For full details, see the @ref{142,,changelog}.

@menu
* Summary – Release highlights: Summary – Release highlights<3>. 
* 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>. 
* Other CPython Implementation Changes:: 
* New Modules: New Modules<2>. 
* Improved Modules: Improved Modules<2>. 
* Optimizations: Optimizations<3>. 
* Faster CPython:: 
* CPython bytecode changes: CPython bytecode changes<3>. 
* Deprecated: Deprecated<4>. 
* Pending Removal in Python 3.12: Pending Removal in Python 3 12. 
* Removed: Removed<4>. 
* Porting to Python 3.11: Porting to Python 3 11. 
* Build Changes: Build Changes<2>. 
* C API Changes: C API Changes<2>. 
* Notable changes in 3.11.4: Notable changes in 3 11 4. 
* Notable changes in 3.11.5: Notable changes in 3 11 5. 

@end menu

@node Summary – Release highlights<3>,New Features<3>,,What’s New In Python 3 11
@anchor{whatsnew/3 11 summary-release-highlights}@anchor{7ba}@anchor{whatsnew/3 11 whatsnew311-summary}@anchor{7bb}
@subsection Summary – Release highlights


@c This section singles out the most important changes in Python 3.11.
@c Brevity is key.


@itemize *

@item 
Python 3.11 is between 10-60% faster than Python 3.10.
On average, we measured a 1.25x speedup on the standard benchmark suite.
See @ref{7bc,,Faster CPython} for details.
@end itemize

@c PEP-sized items next.

New syntax features:


@itemize *

@item 
@ref{7bd,,PEP 654; Exception Groups and except*}
@end itemize

New built-in features:


@itemize *

@item 
@ref{7be,,PEP 678; Exceptions can be enriched with notes}
@end itemize

New standard library modules:


@itemize *

@item 
@geindex Python 향상 제안; PEP 680
PEP 680@footnote{https://peps.python.org/pep-0680/}: @ref{102,,tomllib} —
Support for parsing TOML@footnote{https://toml.io/} in the Standard Library
@end itemize

Interpreter improvements:


@itemize *

@item 
@ref{7bf,,PEP 657; Fine-grained error locations in tracebacks}

@item 
New @ref{7c0,,-P} command line option and 
@geindex PYTHONSAFEPATH
@geindex 환경 변수; PYTHONSAFEPATH
@ref{7c1,,PYTHONSAFEPATH} environment
variable to @ref{7c2,,disable automatically prepending potentially unsafe paths} to @ref{3e4,,sys.path}
@end itemize

New typing features:


@itemize *

@item 
@ref{7c3,,PEP 646; Variadic generics}

@item 
@ref{7c4,,PEP 655; Marking individual TypedDict items as required or not-required}

@item 
@ref{7c5,,PEP 673; Self type}

@item 
@ref{7c6,,PEP 675; Arbitrary literal string type}

@item 
@ref{7c7,,PEP 681; Data class transforms}
@end itemize

Important deprecations, removals and restrictions:


@itemize *

@item 
@geindex Python 향상 제안; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/}:
@ref{7c8,,Many legacy standard library modules have been deprecated} and will be removed in Python 3.13

@item 
@geindex Python 향상 제안; PEP 624
PEP 624@footnote{https://peps.python.org/pep-0624/}:
@ref{7c9,,Py_UNICODE encoder APIs have been removed}

@item 
@geindex Python 향상 제안; PEP 670
PEP 670@footnote{https://peps.python.org/pep-0670/}:
@ref{7ca,,Macros converted to static inline functions}
@end itemize

@node New Features<3>,New Features Related to Type Hints<2>,Summary – Release highlights<3>,What’s New In Python 3 11
@anchor{whatsnew/3 11 new-features}@anchor{7cb}@anchor{whatsnew/3 11 whatsnew311-features}@anchor{7cc}
@subsection New Features


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

@end menu

@node PEP 657 Fine-grained error locations in tracebacks,PEP 654 Exception Groups and except*,,New Features<3>
@anchor{whatsnew/3 11 pep-657-fine-grained-error-locations-in-tracebacks}@anchor{7cd}@anchor{whatsnew/3 11 whatsnew311-pep657}@anchor{7bf}
@subsubsection PEP 657: Fine-grained error locations in tracebacks


When printing tracebacks, the interpreter will now point to the exact expression
that caused the error, instead of just the line. For example:

@example
Traceback (most recent call last):
  File "distance.py", line 11, in <module>
    print(manhattan_distance(p1, p2))
          ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "distance.py", line 6, in manhattan_distance
    return abs(point_1.x - point_2.x) + abs(point_1.y - point_2.y)
                           ^^^^^^^^^
AttributeError: 'NoneType' object has no attribute 'x'
@end example

Previous versions of the interpreter would point to just the line, making it
ambiguous which object was @code{None}. These enhanced errors can also be helpful
when dealing with deeply nested @ref{183,,dict} objects and multiple function calls:

@example
Traceback (most recent call last):
  File "query.py", line 37, in <module>
    magic_arithmetic('foo')
  File "query.py", line 18, in magic_arithmetic
    return add_counts(x) / 25
           ^^^^^^^^^^^^^
  File "query.py", line 24, in add_counts
    return 25 + query_user(user1) + query_user(user2)
                ^^^^^^^^^^^^^^^^^
  File "query.py", line 32, in query_user
    return 1 + query_count(db, response['a']['b']['c']['user'], retry=True)
                               ~~~~~~~~~~~~~~~~~~^^^^^
TypeError: 'NoneType' object is not subscriptable
@end example

As well as complex arithmetic expressions:

@example
Traceback (most recent call last):
  File "calculation.py", line 54, in <module>
    result = (x / y / z) * (a / b / c)
              ~~~~~~^~~
ZeroDivisionError: division by zero
@end example

Additionally, the information used by the enhanced traceback feature
is made available via a general API, that can be used to correlate
@ref{4ab,,bytecode} @ref{7ce,,instructions} with source code location.
This information can be retrieved using:


@itemize -

@item 
The @ref{7cf,,codeobject.co_positions()} method in Python.

@item 
The @ref{7d0,,PyCode_Addr2Location()} function in the C API.
@end itemize

See 
@geindex Python 향상 제안; PEP 657
PEP 657@footnote{https://peps.python.org/pep-0657/} for more details. (Contributed by Pablo Galindo, Batuhan Taskaya
and Ammar Askar in bpo-43950@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43950}.)

@cartouche
@quotation 참고 
This feature requires storing column positions in @ref{7d1,,코드 객체},
which may result in a small increase in interpreter memory usage
and disk usage for compiled Python files.
To avoid storing the extra information
and deactivate printing the extra traceback information,
use the @ref{16f,,-X no_debug_ranges} command line option
or the 
@geindex PYTHONNODEBUGRANGES
@geindex 환경 변수; PYTHONNODEBUGRANGES
@ref{7d2,,PYTHONNODEBUGRANGES} environment variable.
@end quotation
@end cartouche

@node PEP 654 Exception Groups and except*,PEP 678 Exceptions can be enriched with notes,PEP 657 Fine-grained error locations in tracebacks,New Features<3>
@anchor{whatsnew/3 11 pep-654-exception-groups-and-except}@anchor{7d3}@anchor{whatsnew/3 11 whatsnew311-pep654}@anchor{7bd}
@subsubsection PEP 654: Exception Groups and @code{except*}


@geindex Python 향상 제안; PEP 654
PEP 654@footnote{https://peps.python.org/pep-0654/} introduces language features that enable a program
to raise and handle multiple unrelated exceptions simultaneously.
The builtin types @ref{4d3,,ExceptionGroup} and @ref{564,,BaseExceptionGroup}
make it possible to group exceptions and raise them together,
and the new @ref{1ac,,except*} syntax generalizes
@ref{1ab,,except} to match subgroups of exception groups.

See 
@geindex Python 향상 제안; PEP 654
PEP 654@footnote{https://peps.python.org/pep-0654/} for more details.

(Contributed by Irit Katriel in bpo-45292@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45292}. PEP written by
Irit Katriel, Yury Selivanov and Guido van Rossum.)

@node PEP 678 Exceptions can be enriched with notes,Windows py exe launcher improvements,PEP 654 Exception Groups and except*,New Features<3>
@anchor{whatsnew/3 11 pep-678-exceptions-can-be-enriched-with-notes}@anchor{7d4}@anchor{whatsnew/3 11 whatsnew311-pep678}@anchor{7be}
@subsubsection PEP 678: Exceptions can be enriched with notes


The @ref{7d5,,add_note()} method is added to @ref{7d6,,BaseException}.
It can be used to enrich exceptions with context information
that is not available at the time when the exception is raised.
The added notes appear in the default traceback.

See 
@geindex Python 향상 제안; PEP 678
PEP 678@footnote{https://peps.python.org/pep-0678/} for more details.

(Contributed by Irit Katriel in bpo-45607@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45607}.
PEP written by Zac Hatfield-Dodds.)

@node Windows py exe launcher improvements,,PEP 678 Exceptions can be enriched with notes,New Features<3>
@anchor{whatsnew/3 11 whatsnew311-windows-launcher}@anchor{7d7}@anchor{whatsnew/3 11 windows-py-exe-launcher-improvements}@anchor{7d8}
@subsubsection Windows @code{py.exe} launcher improvements


The copy of the @ref{7d9,,Python install manager} included with Python 3.11 has been significantly
updated. It now supports company/tag syntax as defined in 
@geindex Python 향상 제안; PEP 514
PEP 514@footnote{https://peps.python.org/pep-0514/} using the
@code{-V:@var{<company>}/@var{<tag>}} argument instead of the limited @code{-@var{<major>}.@var{<minor>}}.
This allows launching distributions other than @code{PythonCore},
the one hosted on python.org@footnote{https://www.python.org}.

When using @code{-V:} selectors, either company or tag can be omitted, but all
installs will be searched. For example, @code{-V:OtherPython/} will select the
“best” tag registered for @code{OtherPython}, while @code{-V:3.11} or @code{-V:/3.11}
will select the “best” distribution with tag @code{3.11}.

When using the legacy @code{-@var{<major>}}, @code{-@var{<major>}.@var{<minor>}},
@code{-@var{<major>}-@var{<bitness>}} or @code{-@var{<major>}.@var{<minor>}-@var{<bitness>}} arguments,
all existing behaviour should be preserved from past versions,
and only releases from @code{PythonCore} will be selected.
However, the @code{-64} suffix now implies “not 32-bit” (not necessarily x86-64),
as there are multiple supported 64-bit platforms.
32-bit runtimes are detected by checking the runtime’s tag for a @code{-32} suffix.
All releases of Python since 3.5 have included this in their 32-bit builds.
@anchor{whatsnew/3 11 new-feat-related-type-hints-311}@anchor{7da}
@node New Features Related to Type Hints<2>,Other Language Changes<2>,New Features<3>,What’s New In Python 3 11
@anchor{whatsnew/3 11 new-features-related-to-type-hints}@anchor{7db}@anchor{whatsnew/3 11 whatsnew311-typing-features}@anchor{7dc}
@subsection New Features Related to Type Hints


This section covers major changes affecting 
@geindex Python 향상 제안; PEP 484
PEP 484@footnote{https://peps.python.org/pep-0484/} type hints and
the @ref{10a,,typing} module.

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

@end menu

@node PEP 646 Variadic generics,PEP 655 Marking individual TypedDict items as required or not-required,,New Features Related to Type Hints<2>
@anchor{whatsnew/3 11 pep-646-variadic-generics}@anchor{7dd}@anchor{whatsnew/3 11 whatsnew311-pep646}@anchor{7c3}
@subsubsection PEP 646: Variadic generics


@geindex Python 향상 제안; PEP 484
PEP 484@footnote{https://peps.python.org/pep-0484/} previously introduced @ref{487,,TypeVar}, enabling creation
of generics parameterised with a single type. 
@geindex Python 향상 제안; PEP 646
PEP 646@footnote{https://peps.python.org/pep-0646/} adds
@ref{489,,TypeVarTuple}, enabling parameterisation
with an `arbitrary' number of types. In other words,
a @code{TypeVarTuple} is a `variadic' type variable,
enabling `variadic' generics.

This enables a wide variety of use cases.
In particular, it allows the type of array-like structures
in numerical computing libraries such as NumPy and TensorFlow to be
parameterised with the array `shape'. Static type checkers will now
be able to catch shape-related bugs in code that uses these libraries.

See 
@geindex Python 향상 제안; PEP 646
PEP 646@footnote{https://peps.python.org/pep-0646/} for more details.

(Contributed by Matthew Rahtz in bpo-43224@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43224}, with contributions by
Serhiy Storchaka and Jelle Zijlstra. PEP written by Mark Mendoza, Matthew
Rahtz, Pradeep Kumar Srinivasan, and Vincent Siles.)

@node PEP 655 Marking individual TypedDict items as required or not-required,PEP 673 Self type,PEP 646 Variadic generics,New Features Related to Type Hints<2>
@anchor{whatsnew/3 11 pep-655-marking-individual-typeddict-items-as-required-or-not-required}@anchor{7de}@anchor{whatsnew/3 11 whatsnew311-pep655}@anchor{7c4}
@subsubsection PEP 655: Marking individual @code{TypedDict} items as required or not-required


@ref{7df,,Required} and @ref{7e0,,NotRequired} provide a
straightforward way to mark whether individual items in a
@ref{332,,TypedDict} must be present. Previously, this was only possible
using inheritance.

All fields are still required by default,
unless the `total' parameter is set to @code{False},
in which case all fields are still not-required by default.
For example, the following specifies a @code{TypedDict}
with one required and one not-required key:

@example
class Movie(TypedDict):
   title: str
   year: NotRequired[int]

m1: Movie = @{"title": "Black Panther", "year": 2018@}  # OK
m2: Movie = @{"title": "Star Wars"@}  # OK (year is not required)
m3: Movie = @{"year": 2022@}  # ERROR (missing required field title)
@end example

The following definition is equivalent:

@example
class Movie(TypedDict, total=False):
   title: Required[str]
   year: int
@end example

See 
@geindex Python 향상 제안; PEP 655
PEP 655@footnote{https://peps.python.org/pep-0655/} for more details.

(Contributed by David Foster and Jelle Zijlstra in bpo-47087@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47087}. PEP
written by David Foster.)

@node PEP 673 Self type,PEP 675 Arbitrary literal string type,PEP 655 Marking individual TypedDict items as required or not-required,New Features Related to Type Hints<2>
@anchor{whatsnew/3 11 pep-673-self-type}@anchor{7e1}@anchor{whatsnew/3 11 whatsnew311-pep673}@anchor{7c5}
@subsubsection PEP 673: @code{Self} type


The new @ref{7e2,,Self} annotation provides a simple and intuitive
way to annotate methods that return an instance of their class. This
behaves the same as the @ref{487,,TypeVar}-based approach
@geindex Python 향상 제안; PEP 484#annotating-instance-and-class-methods
specified in PEP 484@footnote{https://peps.python.org/pep-0484/#annotating-instance-and-class-methods},
but is more concise and easier to follow.

Common use cases include alternative constructors provided as
@ref{48f,,classmethod}s,
and @ref{7e3,,__enter__()} methods that return @code{self}:

@example
class MyLock:
    def __enter__(self) -> Self:
        self.lock()
        return self

    ...

class MyInt:
    @@classmethod
    def fromhex(cls, s: str) -> Self:
        return cls(int(s, 16))

    ...
@end example

@ref{7e2,,Self} can also be used to annotate method parameters
or attributes of the same type as their enclosing class.

See 
@geindex Python 향상 제안; PEP 673
PEP 673@footnote{https://peps.python.org/pep-0673/} for more details.

(Contributed by James Hilton-Balfe in bpo-46534@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46534}. PEP written by
Pradeep Kumar Srinivasan and James Hilton-Balfe.)

@node PEP 675 Arbitrary literal string type,PEP 681 Data class transforms,PEP 673 Self type,New Features Related to Type Hints<2>
@anchor{whatsnew/3 11 pep-675-arbitrary-literal-string-type}@anchor{7e4}@anchor{whatsnew/3 11 whatsnew311-pep675}@anchor{7c6}
@subsubsection PEP 675: Arbitrary literal string type


The new @ref{7e5,,LiteralString} annotation may be used to indicate
that a function parameter can be of any literal string type. This allows
a function to accept arbitrary literal string types, as well as strings
created from other literal strings. Type checkers can then
enforce that sensitive functions, such as those that execute SQL
statements or shell commands, are called only with static arguments,
providing protection against injection attacks.

For example, a SQL query function could be annotated as follows:

@example
def run_query(sql: LiteralString) -> ...
    ...

def caller(
    arbitrary_string: str,
    query_string: LiteralString,
    table_name: LiteralString,
) -> None:
    run_query("SELECT * FROM students")       # ok
    run_query(query_string)                   # ok
    run_query("SELECT * FROM " + table_name)  # ok
    run_query(arbitrary_string)               # type checker error
    run_query(                                # type checker error
        f"SELECT * FROM students WHERE name = @{arbitrary_string@}"
    )
@end example

See 
@geindex Python 향상 제안; PEP 675
PEP 675@footnote{https://peps.python.org/pep-0675/} for more details.

(Contributed by Jelle Zijlstra in bpo-47088@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47088}. PEP written by Pradeep
Kumar Srinivasan and Graham Bleaney.)

@node PEP 681 Data class transforms,PEP 563 may not be the future,PEP 675 Arbitrary literal string type,New Features Related to Type Hints<2>
@anchor{whatsnew/3 11 pep-681-data-class-transforms}@anchor{7e6}@anchor{whatsnew/3 11 whatsnew311-pep681}@anchor{7c7}
@subsubsection PEP 681: Data class transforms


@ref{6fa,,dataclass_transform} may be used to
decorate a class, metaclass, or a function that is itself a decorator.
The presence of @code{@@dataclass_transform()} tells a static type checker that the
decorated object performs runtime “magic” that transforms a class,
giving it @ref{4e1,,dataclass}-like behaviors.

For example:

@example
# The create_model decorator is defined by a library.
@@typing.dataclass_transform()
def create_model(cls: Type[T]) -> Type[T]:
    cls.__init__ = ...
    cls.__eq__ = ...
    cls.__ne__ = ...
    return cls

# The create_model decorator can now be used to create new model classes:
@@create_model
class CustomerModel:
    id: int
    name: str

c = CustomerModel(id=327, name="Eric Idle")
@end example

See 
@geindex Python 향상 제안; PEP 681
PEP 681@footnote{https://peps.python.org/pep-0681/} for more details.

(Contributed by Jelle Zijlstra in gh-91860@footnote{https://github.com/python/cpython/issues/91860}. PEP written by
Erik De Bonte and Eric Traut.)

@node PEP 563 may not be the future,,PEP 681 Data class transforms,New Features Related to Type Hints<2>
@anchor{whatsnew/3 11 pep-563-may-not-be-the-future}@anchor{7e7}@anchor{whatsnew/3 11 whatsnew311-pep563-deferred}@anchor{7e8}
@subsubsection PEP 563 may not be the future


@geindex Python 향상 제안; PEP 563
PEP 563@footnote{https://peps.python.org/pep-0563/} Postponed Evaluation of Annotations
(the @code{from __future__ import annotations} @ref{45d,,future statement})
that was originally planned for release in Python 3.10
has been put on hold indefinitely.
See this message from the Steering Council@footnote{https://mail.python.org/archives/list/python-dev@@python.org/message/VIZEBX5EYMSYIJNDBF6DMUMZOCWHARSO/}
for more information.

@node Other Language Changes<2>,Other CPython Implementation Changes,New Features Related to Type Hints<2>,What’s New In Python 3 11
@anchor{whatsnew/3 11 other-language-changes}@anchor{7e9}@anchor{whatsnew/3 11 whatsnew311-other-lang-changes}@anchor{7ea}
@subsection Other Language Changes



@itemize *

@item 
Starred unpacking expressions can now be used in @ref{34a,,for} statements.
(See bpo-46725@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46725} for more details.)

@item 
Asynchronous @ref{7eb,,comprehensions} are now allowed
inside comprehensions in @ref{7ec,,asynchronous functions}.
Outer comprehensions implicitly become asynchronous in this case.
(Contributed by Serhiy Storchaka in bpo-33346@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33346}.)

@item 
A @ref{198,,TypeError} is now raised instead of an @ref{5ee,,AttributeError} in
@ref{186,,with} statements and @ref{7ed,,contextlib.ExitStack.enter_context()}
for objects that do not support the @ref{1e1,,context manager} protocol,
and in @ref{185,,async with} statements and
@ref{7ee,,contextlib.AsyncExitStack.enter_async_context()}
for objects not supporting the @ref{7ef,,asynchronous context manager} protocol.
(Contributed by Serhiy Storchaka in bpo-12022@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12022} and bpo-44471@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44471}.)

@item 
Added @ref{7f0,,object.__getstate__()}, which provides the default
implementation of the @code{__getstate__()} method. @ref{29,,copy}ing
and @ref{ab,,pickle}ing instances of subclasses of builtin types
@ref{344,,bytearray}, @ref{184,,set}, @ref{7f1,,frozenset},
@ref{7f2,,collections.OrderedDict}, @ref{7f3,,collections.deque},
@ref{7f4,,weakref.WeakSet}, and @ref{7f5,,datetime.tzinfo} now copies and
pickles instance attributes implemented as @ref{7f6,,slots}.
This change has an unintended side effect: It trips up a small minority
of existing Python projects not expecting @code{object.__getstate__()} to
exist. See the later comments on gh-70766@footnote{https://github.com/python/cpython/issues/70766} for discussions of what
workarounds such code may need.
(Contributed by Serhiy Storchaka in bpo-26579@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26579}.)
@end itemize
@anchor{whatsnew/3 11 whatsnew311-pythonsafepath}@anchor{7c2}

@itemize *

@item 
Added a @ref{7c0,,-P} command line option
and a 
@geindex PYTHONSAFEPATH
@geindex 환경 변수; PYTHONSAFEPATH
@ref{7c1,,PYTHONSAFEPATH} environment variable,
which disable the automatic prepending to @ref{3e4,,sys.path}
of the script’s directory when running a script,
or the current directory when using @ref{1a8,,-c} and @ref{23c,,-m}.
This ensures only stdlib and installed modules
are picked up by @ref{7f7,,import},
and avoids unintentionally or maliciously shadowing modules
with those in a local (and typically user-writable) directory.
(Contributed by Victor Stinner in gh-57684@footnote{https://github.com/python/cpython/issues/57684}.)

@item 
A @code{"z"} option was added to the @ref{4f9,,Format specification mini-language} that
coerces negative to positive zero after rounding to the format precision.
See 
@geindex Python 향상 제안; PEP 682
PEP 682@footnote{https://peps.python.org/pep-0682/} for more details.
(Contributed by John Belmonte in gh-90153@footnote{https://github.com/python/cpython/issues/90153}.)

@item 
Bytes are no longer accepted on @ref{3e4,,sys.path}.  Support broke sometime
between Python 3.2 and 3.6, with no one noticing until after Python 3.10.0
was released. In addition, bringing back support would be problematic due to
interactions between @ref{7f8,,-b} and @ref{7f9,,sys.path_importer_cache} when
there is a mixture of @ref{169,,str} and @ref{192,,bytes} keys.
(Contributed by Thomas Grainger in gh-91181@footnote{https://github.com/python/cpython/issues/91181}.)
@end itemize

@node Other CPython Implementation Changes,New Modules<2>,Other Language Changes<2>,What’s New In Python 3 11
@anchor{whatsnew/3 11 other-cpython-implementation-changes}@anchor{7fa}@anchor{whatsnew/3 11 whatsnew311-other-implementation-changes}@anchor{7fb}
@subsection Other CPython Implementation Changes



@itemize *

@item 
The special methods @ref{7fc,,__complex__()} for @ref{197,,complex}
and @ref{7fd,,__bytes__()} for @ref{192,,bytes} are implemented to support
the @ref{7fe,,typing.SupportsComplex} and @ref{7ff,,typing.SupportsBytes} protocols.
(Contributed by Mark Dickinson and Donghee Na in bpo-24234@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24234}.)

@item 
@code{siphash13} is added as a new internal hashing algorithm.
It has similar security properties as @code{siphash24},
but it is slightly faster for long inputs.
@ref{169,,str}, @ref{192,,bytes}, and some other types
now use it as the default algorithm for @ref{800,,hash()}.
@geindex Python 향상 제안; PEP 552
PEP 552@footnote{https://peps.python.org/pep-0552/} @ref{801,,hash-based .pyc files}
now use @code{siphash13} too.
(Contributed by Inada Naoki in bpo-29410@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29410}.)

@item 
When an active exception is re-raised by a @ref{802,,raise} statement with no parameters,
the traceback attached to this exception is now always @code{sys.exc_info()[1].__traceback__}.
This means that changes made to the traceback in the current @ref{1ab,,except} clause are
reflected in the re-raised exception.
(Contributed by Irit Katriel in bpo-45711@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45711}.)

@item 
The interpreter state’s representation of handled exceptions
(aka @code{exc_info} or @code{_PyErr_StackItem})
now only has the @code{exc_value} field; @code{exc_type} and @code{exc_traceback}
have been removed, as they can be derived from @code{exc_value}.
(Contributed by Irit Katriel in bpo-45711@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45711}.)

@item 
A new @ref{803,,command line option}, @code{AppendPath},
has been added for the Windows installer.
It behaves similarly to @code{PrependPath},
but appends the install and scripts directories instead of prepending them.
(Contributed by Bastian Neuburger in bpo-44934@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44934}.)

@item 
The @ref{804,,PyConfig.module_search_paths_set} field must now be set to @code{1} for
initialization to use @ref{641,,PyConfig.module_search_paths} to initialize
@ref{3e4,,sys.path}. Otherwise, initialization will recalculate the path and replace
any values added to @code{module_search_paths}.

@item 
The output of the @ref{805,,--help} option now fits in 50 lines/80 columns.
Information about @ref{806,,Python environment variables}
and @ref{16f,,-X} options is now available using the respective
@ref{807,,--help-env} and @ref{808,,--help-xoptions} flags,
and with the new @ref{809,,--help-all}.
(Contributed by Éric Araujo in bpo-46142@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46142}.)

@item 
Converting between @ref{19b,,int} and @ref{169,,str} in bases other than 2
(binary), 4, 8 (octal), 16 (hexadecimal), or 32 such as base 10 (decimal)
now raises a @ref{2ec,,ValueError} if the number of digits in string form is
above a limit to avoid potential denial of service attacks due to the
algorithmic complexity. This is a mitigation for 
@geindex Common Vulnerabilities and Exposures; CVE 2020-10735
CVE 2020-10735@footnote{https://www.cve.org/CVERecord?id=CVE-2020-10735}.
This limit can be configured or disabled by environment variable, command
line flag, or @ref{df,,sys} APIs. See the @ref{80a,,integer string conversion length limitation} documentation.  The default limit
is 4300 digits in string form.
@end itemize

@node New Modules<2>,Improved Modules<2>,Other CPython Implementation Changes,What’s New In Python 3 11
@anchor{whatsnew/3 11 new-modules}@anchor{80b}@anchor{whatsnew/3 11 whatsnew311-new-modules}@anchor{80c}
@subsection New Modules



@itemize *

@item 
@ref{102,,tomllib}: For parsing TOML@footnote{https://toml.io/}.
See 
@geindex Python 향상 제안; PEP 680
PEP 680@footnote{https://peps.python.org/pep-0680/} for more details.
(Contributed by Taneli Hukkinen in bpo-40059@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40059}.)

@item 
@ref{122,,wsgiref.types}:
@geindex Python 향상 제안; PEP 3333
WSGI@footnote{https://peps.python.org/pep-3333/}-specific types for static type checking.
(Contributed by Sebastian Rittau in bpo-42012@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42012}.)
@end itemize

@node Improved Modules<2>,Optimizations<3>,New Modules<2>,What’s New In Python 3 11
@anchor{whatsnew/3 11 improved-modules}@anchor{80d}@anchor{whatsnew/3 11 whatsnew311-improved-modules}@anchor{80e}
@subsection Improved Modules


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

@end menu

@node asyncio<6>,contextlib,,Improved Modules<2>
@anchor{whatsnew/3 11 asyncio}@anchor{80f}@anchor{whatsnew/3 11 whatsnew311-asyncio}@anchor{810}
@subsubsection asyncio



@itemize *

@item 
Added the @ref{4d2,,TaskGroup} class,
an @ref{811,,asynchronous context manager}
holding a group of tasks that will wait for all of them upon exit.
For new code this is recommended over using
@ref{1c9,,create_task()} and @ref{812,,gather()} directly.
(Contributed by Yury Selivanov and others in gh-90908@footnote{https://github.com/python/cpython/issues/90908}.)

@item 
Added @ref{813,,timeout()}, an asynchronous context manager for
setting a timeout on asynchronous operations. For new code this is
recommended over using @ref{814,,wait_for()} directly.
(Contributed by Andrew Svetlov in gh-90927@footnote{https://github.com/python/cpython/issues/90927}.)

@item 
Added the @ref{2f5,,Runner} class, which exposes the machinery
used by @ref{2f3,,run()}.
(Contributed by Andrew Svetlov in gh-91218@footnote{https://github.com/python/cpython/issues/91218}.)

@item 
Added the @ref{815,,Barrier} class to the synchronization
primitives in the asyncio library, and the related
@ref{816,,BrokenBarrierError} exception.
(Contributed by Yves Duprat and Andrew Svetlov in gh-87518@footnote{https://github.com/python/cpython/issues/87518}.)

@item 
Added keyword argument `all_errors' to @ref{817,,asyncio.loop.create_connection()}
so that multiple connection errors can be raised as an @ref{4d3,,ExceptionGroup}.

@item 
Added the @ref{818,,asyncio.StreamWriter.start_tls()} method for
upgrading existing stream-based connections to TLS.
(Contributed by Ian Good in bpo-34975@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34975}.)

@item 
Added raw datagram socket functions to the event loop:
@ref{819,,sock_sendto()},
@ref{81a,,sock_recvfrom()} and
@ref{81b,,sock_recvfrom_into()}.
These have implementations in @ref{314,,SelectorEventLoop} and
@ref{81c,,ProactorEventLoop}.
(Contributed by Alex Grönholm in bpo-46805@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46805}.)

@item 
Added @ref{4d6,,cancelling()} and
@ref{4d7,,uncancel()} methods to @ref{1c7,,Task}.
These are primarily intended for internal use,
notably by @ref{4d2,,TaskGroup}.
@end itemize

@node contextlib,dataclasses,asyncio<6>,Improved Modules<2>
@anchor{whatsnew/3 11 contextlib}@anchor{81d}@anchor{whatsnew/3 11 whatsnew311-contextlib}@anchor{81e}
@subsubsection contextlib



@itemize *

@item 
Added non parallel-safe @ref{81f,,chdir()} context manager to change
the current working directory and then restore it on exit. Simple wrapper
around @ref{820,,chdir()}. (Contributed by Filipe Laíns in bpo-25625@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25625})
@end itemize

@node dataclasses,datetime<2>,contextlib,Improved Modules<2>
@anchor{whatsnew/3 11 dataclasses}@anchor{821}@anchor{whatsnew/3 11 whatsnew311-dataclasses}@anchor{822}
@subsubsection dataclasses



@itemize *

@item 
Change field default mutability check, allowing only defaults which are
@ref{823,,hashable} instead of any object which is not an instance of
@ref{183,,dict}, @ref{24d,,list} or @ref{184,,set}. (Contributed by Eric V. Smith in
bpo-44674@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44674}.)
@end itemize

@node datetime<2>,enum<3>,dataclasses,Improved Modules<2>
@anchor{whatsnew/3 11 datetime}@anchor{824}@anchor{whatsnew/3 11 whatsnew311-datetime}@anchor{825}
@subsubsection datetime



@itemize *

@item 
Add @ref{712,,datetime.UTC}, a convenience alias for
@ref{826,,datetime.timezone.utc}. (Contributed by Kabir Kwatra in gh-91973@footnote{https://github.com/python/cpython/issues/91973}.)

@item 
@ref{827,,datetime.date.fromisoformat()}, @ref{828,,datetime.time.fromisoformat()} and
@ref{829,,datetime.datetime.fromisoformat()} can now be used to parse most ISO 8601
formats (barring only those that support fractional hours and minutes).
(Contributed by Paul Ganssle in gh-80010@footnote{https://github.com/python/cpython/issues/80010}.)
@end itemize

@node enum<3>,fcntl,datetime<2>,Improved Modules<2>
@anchor{whatsnew/3 11 enum}@anchor{82a}@anchor{whatsnew/3 11 whatsnew311-enum}@anchor{82b}
@subsubsection enum



@itemize *

@item 
Renamed @code{EnumMeta} to @ref{4f7,,EnumType}
(@code{EnumMeta} kept as an alias).

@item 
Added @ref{82c,,StrEnum},
with members that can be used as (and must be) strings.

@item 
Added @ref{82d,,ReprEnum},
which only modifies the @ref{82e,,__repr__()} of members
while returning their literal values (rather than names)
for @ref{82f,,__str__()} and @ref{830,,__format__()}
(used by @ref{169,,str()}, @ref{199,,format()} and @ref{669,,f-string}s).

@item 
Changed @ref{831,,Enum.__format__()} (the default for
@ref{199,,format()}, @ref{832,,str.format()} and @ref{669,,f-string}s) to always produce
the same result as @ref{833,,Enum.__str__()}:  for enums inheriting from
@ref{82d,,ReprEnum} it will be the member’s value; for all other enums
it will be the enum and member name (e.g. @code{Color.RED}).

@item 
Added a new `boundary' class parameter to @ref{834,,Flag} enums
and the @ref{835,,FlagBoundary} enum with its options,
to control how to handle out-of-range flag values.

@item 
Added the @ref{836,,verify()} enum decorator
and the @ref{837,,EnumCheck} enum with its options,
to check enum classes against several specific constraints.

@item 
Added the @ref{838,,member()} and @ref{839,,nonmember()} decorators,
to ensure the decorated object is/is not converted to an enum member.

@item 
Added the @ref{83a,,property()} decorator,
which works like @ref{4b3,,property()} except for enums.
Use this instead of @ref{83b,,types.DynamicClassAttribute()}.

@item 
Added the @ref{83c,,global_enum()} enum decorator,
which adjusts @ref{82e,,__repr__()} and @ref{82f,,__str__()}
to show values as members of their module rather than the enum class.
For example, @code{'re.ASCII'} for the @ref{83d,,ASCII} member
of @ref{83e,,re.RegexFlag} rather than @code{'RegexFlag.ASCII'}.

@item 
Enhanced @ref{834,,Flag} to support
@ref{83f,,len()}, iteration and @ref{34b,,in}/@ref{840,,not in} on its members.
For example, the following now works:
@code{len(AFlag(3)) == 2 and list(AFlag(3)) == (AFlag.ONE, AFlag.TWO)}

@item 
Changed @ref{841,,Enum} and @ref{834,,Flag}
so that members are now defined
before @ref{842,,__init_subclass__()} is called;
@ref{843,,dir()} now includes methods, etc., from mixed-in data types.

@item 
Changed @ref{834,,Flag}
to only consider primary values (power of two) canonical
while composite values (@code{3}, @code{6}, @code{10}, etc.) are considered aliases;
inverted flags are coerced to their positive equivalent.
@end itemize

@node fcntl,fractions<4>,enum<3>,Improved Modules<2>
@anchor{whatsnew/3 11 fcntl}@anchor{844}@anchor{whatsnew/3 11 whatsnew311-fcntl}@anchor{845}
@subsubsection fcntl



@itemize *

@item 
On FreeBSD, the @code{F_DUP2FD} and @code{F_DUP2FD_CLOEXEC} flags respectively
are supported, the former equals to @code{dup2} usage while the latter set
the @code{FD_CLOEXEC} flag in addition.
@end itemize

@node fractions<4>,functools<2>,fcntl,Improved Modules<2>
@anchor{whatsnew/3 11 fractions}@anchor{846}@anchor{whatsnew/3 11 whatsnew311-fractions}@anchor{847}
@subsubsection fractions



@itemize *

@item 
Support 
@geindex Python 향상 제안; PEP 515
PEP 515@footnote{https://peps.python.org/pep-0515/}-style initialization of @ref{213,,Fraction} from
string.  (Contributed by Sergey B Kirpichev in bpo-44258@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44258}.)

@item 
@ref{213,,Fraction} now implements an @code{__int__} method, so
that an @code{isinstance(some_fraction, typing.SupportsInt)} check passes.
(Contributed by Mark Dickinson in bpo-44547@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44547}.)
@end itemize

@node functools<2>,gzip<2>,fractions<4>,Improved Modules<2>
@anchor{whatsnew/3 11 functools}@anchor{848}@anchor{whatsnew/3 11 whatsnew311-functools}@anchor{849}
@subsubsection functools



@itemize *

@item 
@ref{84a,,functools.singledispatch()} now supports @ref{2a7,,types.UnionType}
and @ref{2a8,,typing.Union} as annotations to the dispatch argument.:

@example
>>> from functools import singledispatch
>>> @@singledispatch
... def fun(arg, verbose=False):
...     if verbose:
...         print("Let me just say,", end=" ")
...     print(arg)
...
>>> @@fun.register
... def _(arg: int | float, verbose=False):
...     if verbose:
...         print("Strength in numbers, eh?", end=" ")
...     print(arg)
...
>>> from typing import Union
>>> @@fun.register
... def _(arg: Union[list, set], verbose=False):
...     if verbose:
...         print("Enumerate this:")
...     for i, elem in enumerate(arg):
...         print(i, elem)
...
@end example

(Contributed by Yurii Karabas in bpo-46014@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46014}.)
@end itemize

@node gzip<2>,hashlib<2>,functools<2>,Improved Modules<2>
@anchor{whatsnew/3 11 gzip}@anchor{84b}@anchor{whatsnew/3 11 whatsnew311-gzip}@anchor{84c}
@subsubsection gzip



@itemize *

@item 
The @ref{84d,,gzip.compress()} function is now faster when used with the
`mtime=0' argument as it delegates the compression entirely to a single
@ref{84e,,zlib.compress()} operation. There is one side effect of this change: The
gzip file header contains an “OS” byte in its header. That was traditionally
always set to a value of 255 representing “unknown” by the @ref{6b,,gzip}
module. Now, when using @code{compress()} with `mtime=0', it may be
set to a different value by the underlying zlib C library Python was linked
against.
(See gh-112346@footnote{https://github.com/python/cpython/issues/112346} for details on the side effect.)
@end itemize

@node hashlib<2>,IDLE and idlelib,gzip<2>,Improved Modules<2>
@anchor{whatsnew/3 11 hashlib}@anchor{84f}@anchor{whatsnew/3 11 whatsnew311-hashlib}@anchor{850}
@subsubsection hashlib



@itemize *

@item 
@ref{851,,hashlib.blake2b()} and @ref{852,,hashlib.blake2s()} now prefer libb2@footnote{https://www.blake2.net/}
over Python’s vendored copy.
(Contributed by Christian Heimes in bpo-47095@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47095}.)

@item 
The internal @code{_sha3} module with SHA3 and SHAKE algorithms now uses
`tiny_sha3' instead of the `Keccak Code Package' to reduce code and binary
size. The @ref{6c,,hashlib} module prefers optimized SHA3 and SHAKE
implementations from OpenSSL. The change affects only installations without
OpenSSL support.
(Contributed by Christian Heimes in bpo-47098@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47098}.)

@item 
Add @ref{853,,hashlib.file_digest()}, a helper function for efficient hashing
of files or file-like objects.
(Contributed by Christian Heimes in gh-89313@footnote{https://github.com/python/cpython/issues/89313}.)
@end itemize

@node IDLE and idlelib,inspect<3>,hashlib<2>,Improved Modules<2>
@anchor{whatsnew/3 11 idle-and-idlelib}@anchor{854}@anchor{whatsnew/3 11 whatsnew311-idle}@anchor{855}
@subsubsection IDLE and idlelib



@itemize *

@item 
Apply syntax highlighting to @code{.pyi} files. (Contributed by Alex
Waygood and Terry Jan Reedy in bpo-45447@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45447}.)

@item 
Include prompts when saving Shell with inputs and outputs.
(Contributed by Terry Jan Reedy in gh-95191@footnote{https://github.com/python/cpython/issues/95191}.)
@end itemize

@node inspect<3>,locale<3>,IDLE and idlelib,Improved Modules<2>
@anchor{whatsnew/3 11 inspect}@anchor{856}@anchor{whatsnew/3 11 whatsnew311-inspect}@anchor{857}
@subsubsection inspect



@itemize *

@item 
Add @ref{858,,getmembers_static()} to return all members without
triggering dynamic lookup via the descriptor protocol. (Contributed by
Weipeng Hong in bpo-30533@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30533}.)

@item 
Add @ref{859,,ismethodwrapper()}
for checking if the type of an object is a @ref{85a,,MethodWrapperType}.
(Contributed by Hakan Çelik in bpo-29418@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29418}.)

@item 
Change the frame-related functions in the @ref{82,,inspect} module to return new
@ref{85b,,FrameInfo} and @ref{85c,,Traceback} class instances
(backwards compatible with the previous @ref{85d,,named tuple}-like interfaces)
that includes the extended 
@geindex Python 향상 제안; PEP 657
PEP 657@footnote{https://peps.python.org/pep-0657/} position information (end
line number, column and end column). The affected functions are:


@itemize *

@item 
@ref{85e,,inspect.getframeinfo()}

@item 
@ref{85f,,inspect.getouterframes()}

@item 
@ref{860,,inspect.getinnerframes()},

@item 
@ref{861,,inspect.stack()}

@item 
@ref{862,,inspect.trace()}
@end itemize

(Contributed by Pablo Galindo in gh-88116@footnote{https://github.com/python/cpython/issues/88116}.)
@end itemize

@node locale<3>,logging,inspect<3>,Improved Modules<2>
@anchor{whatsnew/3 11 locale}@anchor{863}@anchor{whatsnew/3 11 whatsnew311-locale}@anchor{864}
@subsubsection locale



@itemize *

@item 
Add @ref{329,,locale.getencoding()} to get the current locale encoding. It is similar to
@code{locale.getpreferredencoding(False)} but ignores the
@ref{865,,Python UTF-8 Mode}.
@end itemize

@node logging,math<4>,locale<3>,Improved Modules<2>
@anchor{whatsnew/3 11 logging}@anchor{866}@anchor{whatsnew/3 11 whatsnew311-logging}@anchor{867}
@subsubsection logging



@itemize *

@item 
Added @ref{868,,getLevelNamesMapping()}
to return a mapping from logging level names (e.g. @code{'CRITICAL'})
to the values of their corresponding @ref{869,,로깅 수준} (e.g. @code{50}, by default).
(Contributed by Andrei Kulakovin in gh-88024@footnote{https://github.com/python/cpython/issues/88024}.)

@item 
Added a @ref{86a,,createSocket()} method
to @ref{86b,,SysLogHandler}, to match
@ref{86c,,SocketHandler.createSocket()}.
It is called automatically during handler initialization
and when emitting an event, if there is no active socket.
(Contributed by Kirill Pinchuk in gh-88457@footnote{https://github.com/python/cpython/issues/88457}.)
@end itemize

@node math<4>,operator<2>,logging,Improved Modules<2>
@anchor{whatsnew/3 11 math}@anchor{86d}@anchor{whatsnew/3 11 whatsnew311-math}@anchor{86e}
@subsubsection math



@itemize *

@item 
Add @ref{86f,,math.exp2()}: return 2 raised to the power of x.
(Contributed by Gideon Mitchell in bpo-45917@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45917}.)

@item 
Add @ref{870,,math.cbrt()}: return the cube root of x.
(Contributed by Ajith Ramachandran in bpo-44357@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44357}.)

@item 
The behaviour of two @ref{871,,math.pow()} corner cases was changed, for
consistency with the IEEE 754 specification. The operations
@code{math.pow(0.0, -math.inf)} and @code{math.pow(-0.0, -math.inf)} now return
@code{inf}. Previously they raised @ref{2ec,,ValueError}. (Contributed by Mark
Dickinson in bpo-44339@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44339}.)

@item 
The @ref{872,,math.nan} value is now always available.
(Contributed by Victor Stinner in bpo-46917@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46917}.)
@end itemize

@node operator<2>,os<4>,math<4>,Improved Modules<2>
@anchor{whatsnew/3 11 operator}@anchor{873}@anchor{whatsnew/3 11 whatsnew311-operator}@anchor{874}
@subsubsection operator



@itemize *

@item 
A new function @code{operator.call} has been added, such that
@code{operator.call(obj, *args, **kwargs) == obj(*args, **kwargs)}.
(Contributed by Antony Lee in bpo-44019@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44019}.)
@end itemize

@node os<4>,pathlib<7>,operator<2>,Improved Modules<2>
@anchor{whatsnew/3 11 os}@anchor{875}@anchor{whatsnew/3 11 whatsnew311-os}@anchor{876}
@subsubsection os



@itemize *

@item 
On Windows, @ref{745,,os.urandom()} now uses @code{BCryptGenRandom()},
instead of @code{CryptGenRandom()} which is deprecated.
(Contributed by Donghee Na in bpo-44611@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44611}.)
@end itemize

@node pathlib<7>,re<4>,os<4>,Improved Modules<2>
@anchor{whatsnew/3 11 pathlib}@anchor{877}@anchor{whatsnew/3 11 whatsnew311-pathlib}@anchor{878}
@subsubsection pathlib



@itemize *

@item 
@ref{537,,glob()} and @ref{538,,rglob()} return only
directories if `pattern' ends with a pathname components separator:
@ref{879,,sep} or @ref{87a,,altsep}.
(Contributed by Eisuke Kawasima in bpo-22276@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22276} and bpo-33392@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33392}.)
@end itemize

@node re<4>,shutil<3>,pathlib<7>,Improved Modules<2>
@anchor{whatsnew/3 11 re}@anchor{87b}@anchor{whatsnew/3 11 whatsnew311-re}@anchor{87c}
@subsubsection re



@itemize *

@item 
Atomic grouping (@code{(?>...)}) and possessive quantifiers (@code{*+}, @code{++},
@code{?+}, @code{@{m,n@}+}) are now supported in regular expressions.
(Contributed by Jeffrey C. Jacobs and Serhiy Storchaka in bpo-433030@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=433030}.)
@end itemize

@node shutil<3>,socket<2>,re<4>,Improved Modules<2>
@anchor{whatsnew/3 11 shutil}@anchor{87d}@anchor{whatsnew/3 11 whatsnew311-shutil}@anchor{87e}
@subsubsection shutil



@itemize *

@item 
Add optional parameter `dir_fd' in @ref{356,,shutil.rmtree()}.
(Contributed by Serhiy Storchaka in bpo-46245@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46245}.)
@end itemize

@node socket<2>,sqlite3<5>,shutil<3>,Improved Modules<2>
@anchor{whatsnew/3 11 socket}@anchor{87f}@anchor{whatsnew/3 11 whatsnew311-socket}@anchor{880}
@subsubsection socket



@itemize *

@item 
Add CAN Socket support for NetBSD.
(Contributed by Thomas Klausner in bpo-30512@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30512}.)

@item 
@ref{881,,create_connection()} has an option to raise, in case of
failure to connect, an @ref{4d3,,ExceptionGroup} containing all errors
instead of only raising the last error.
(Contributed by Irit Katriel in bpo-29980@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29980}.)
@end itemize

@node sqlite3<5>,string,socket<2>,Improved Modules<2>
@anchor{whatsnew/3 11 sqlite3}@anchor{882}@anchor{whatsnew/3 11 whatsnew311-sqlite3}@anchor{883}
@subsubsection sqlite3



@itemize *

@item 
You can now disable the authorizer by passing @ref{884,,None} to
@ref{5a8,,set_authorizer()}.
(Contributed by Erlend E. Aasland in bpo-44491@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44491}.)

@item 
Collation name @ref{885,,create_collation()} can now
contain any Unicode character.  Collation names with invalid characters
now raise @ref{886,,UnicodeEncodeError} instead of @ref{305,,sqlite3.ProgrammingError}.
(Contributed by Erlend E. Aasland in bpo-44688@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44688}.)

@item 
@ref{d4,,sqlite3} exceptions now include the SQLite extended error code as
@ref{887,,sqlite_errorcode} and the SQLite error name as
@ref{888,,sqlite_errorname}.
(Contributed by Aviv Palivoda, Daniel Shahaf, and Erlend E. Aasland in
bpo-16379@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16379} and bpo-24139@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24139}.)

@item 
Add @ref{889,,setlimit()} and
@ref{88a,,getlimit()} to @ref{54c,,sqlite3.Connection} for
setting and getting SQLite limits by connection basis.
(Contributed by Erlend E. Aasland in bpo-45243@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45243}.)

@item 
@ref{d4,,sqlite3} now sets @ref{88b,,sqlite3.threadsafety} based on the default
threading mode the underlying SQLite library has been compiled with.
(Contributed by Erlend E. Aasland in bpo-45613@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45613}.)

@item 
@ref{d4,,sqlite3} C callbacks now use unraisable exceptions if callback
tracebacks are enabled. Users can now register an
@ref{506,,unraisable hook handler} to improve their debug
experience.
(Contributed by Erlend E. Aasland in bpo-45828@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45828}.)

@item 
Fetch across rollback no longer raises @ref{88c,,InterfaceError}.
Instead we leave it to the SQLite library to handle these cases.
(Contributed by Erlend E. Aasland in bpo-44092@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44092}.)

@item 
Add @ref{88d,,serialize()} and
@ref{88e,,deserialize()} to @ref{54c,,sqlite3.Connection} for
serializing and deserializing databases.
(Contributed by Erlend E. Aasland in bpo-41930@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41930}.)

@item 
Add @ref{88f,,create_window_function()} to
@ref{54c,,sqlite3.Connection} for creating aggregate window functions.
(Contributed by Erlend E. Aasland in bpo-34916@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34916}.)

@item 
Add @ref{890,,blobopen()} to @ref{54c,,sqlite3.Connection}.
@ref{891,,sqlite3.Blob} allows incremental I/O operations on blobs.
(Contributed by Aviv Palivoda and Erlend E. Aasland in bpo-24905@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24905}.)
@end itemize

@node string,sys<4>,sqlite3<5>,Improved Modules<2>
@anchor{whatsnew/3 11 string}@anchor{892}@anchor{whatsnew/3 11 whatsnew311-string}@anchor{893}
@subsubsection string



@itemize *

@item 
Add @ref{894,,get_identifiers()}
and @ref{895,,is_valid()} to @ref{896,,string.Template},
which respectively return all valid placeholders,
and whether any invalid placeholders are present.
(Contributed by Ben Kehoe in gh-90465@footnote{https://github.com/python/cpython/issues/90465}.)
@end itemize

@node sys<4>,sysconfig<2>,string,Improved Modules<2>
@anchor{whatsnew/3 11 sys}@anchor{897}@anchor{whatsnew/3 11 whatsnew311-sys}@anchor{898}
@subsubsection sys



@itemize *

@item 
@ref{899,,sys.exc_info()} now derives the @code{type} and @code{traceback} fields
from the @code{value} (the exception instance), so when an exception is
modified while it is being handled, the changes are reflected in
the results of subsequent calls to @code{exc_info()}.
(Contributed by Irit Katriel in bpo-45711@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45711}.)

@item 
Add @ref{89a,,sys.exception()} which returns the active exception instance
(equivalent to @code{sys.exc_info()[1]}).
(Contributed by Irit Katriel in bpo-46328@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46328}.)

@item 
Add the @ref{89b,,sys.flags.safe_path} flag.
(Contributed by Victor Stinner in gh-57684@footnote{https://github.com/python/cpython/issues/57684}.)
@end itemize

@node sysconfig<2>,tempfile<3>,sys<4>,Improved Modules<2>
@anchor{whatsnew/3 11 sysconfig}@anchor{89c}@anchor{whatsnew/3 11 whatsnew311-sysconfig}@anchor{89d}
@subsubsection sysconfig



@itemize *

@item 
Three new @ref{449,,installation schemes}
(`posix_venv', `nt_venv' and `venv') were added and are used when Python
creates new virtual environments or when it is running from a virtual
environment.
The first two schemes (`posix_venv' and `nt_venv') are OS-specific
for non-Windows and Windows, the `venv' is essentially an alias to one of
them according to the OS Python runs on.
This is useful for downstream distributors who modify
@ref{89e,,sysconfig.get_preferred_scheme()}.
Third party code that creates new virtual environments should use the new
`venv' installation scheme to determine the paths, as does @ref{117,,venv}.
(Contributed by Miro Hrončok in bpo-45413@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45413}.)
@end itemize

@node tempfile<3>,threading<3>,sysconfig<2>,Improved Modules<2>
@anchor{whatsnew/3 11 tempfile}@anchor{89f}@anchor{whatsnew/3 11 whatsnew311-tempfile}@anchor{8a0}
@subsubsection tempfile



@itemize *

@item 
@ref{8a1,,SpooledTemporaryFile} objects now fully implement the methods
of @ref{8a2,,io.BufferedIOBase} or @ref{8a3,,io.TextIOBase}
(depending on file mode).
This lets them work correctly with APIs that expect file-like objects,
such as compression modules.
(Contributed by Carey Metcalfe in gh-70363@footnote{https://github.com/python/cpython/issues/70363}.)
@end itemize

@node threading<3>,time<2>,tempfile<3>,Improved Modules<2>
@anchor{whatsnew/3 11 threading}@anchor{8a4}@anchor{whatsnew/3 11 whatsnew311-threading}@anchor{8a5}
@subsubsection threading



@itemize *

@item 
On Unix, if the @code{sem_clockwait()} function is available in the C library
(glibc 2.30 and newer), the @ref{8a6,,threading.Lock.acquire()} method now uses
the monotonic clock (@ref{8a7,,time.CLOCK_MONOTONIC}) for the timeout, rather
than using the system clock (@ref{8a8,,time.CLOCK_REALTIME}), to not be affected
by system clock changes.
(Contributed by Victor Stinner in bpo-41710@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41710}.)
@end itemize

@node time<2>,tkinter<4>,threading<3>,Improved Modules<2>
@anchor{whatsnew/3 11 time}@anchor{8a9}@anchor{whatsnew/3 11 whatsnew311-time}@anchor{8aa}
@subsubsection time



@itemize *

@item 
On Unix, @ref{8ab,,time.sleep()} now uses the @code{clock_nanosleep()} or
@code{nanosleep()} function, if available, which has a resolution of 1 nanosecond
(10@w{^-9} seconds), rather than using @code{select()} which has a resolution
of 1 microsecond (10@w{^-6} seconds).
(Contributed by Benjamin Szőke and Victor Stinner in bpo-21302@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21302}.)

@item 
On Windows 8.1 and newer, @ref{8ab,,time.sleep()} now uses a waitable timer based
on high-resolution timers@footnote{https://docs.microsoft.com/en-us/windows-hardware/drivers/kernel/high-resolution-timers}
which has a resolution of 100 nanoseconds (10@w{^-7} seconds). Previously,
it had a resolution of 1 millisecond (10@w{^-3} seconds).
(Contributed by Benjamin Szőke, Donghee Na, Eryk Sun and Victor Stinner in bpo-21302@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21302} and bpo-45429@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45429}.)
@end itemize

@node tkinter<4>,traceback<2>,time<2>,Improved Modules<2>
@anchor{whatsnew/3 11 tkinter}@anchor{8ac}@anchor{whatsnew/3 11 whatsnew311-tkinter}@anchor{8ad}
@subsubsection tkinter



@itemize *

@item 
Added method @code{info_patchlevel()} which returns the exact version of
the Tcl library as a named tuple similar to @ref{8ae,,sys.version_info}.
(Contributed by Serhiy Storchaka in gh-91827@footnote{https://github.com/python/cpython/issues/91827}.)
@end itemize

@node traceback<2>,typing<5>,tkinter<4>,Improved Modules<2>
@anchor{whatsnew/3 11 traceback}@anchor{8af}@anchor{whatsnew/3 11 whatsnew311-traceback}@anchor{8b0}
@subsubsection traceback



@itemize *

@item 
Add @ref{8b1,,traceback.StackSummary.format_frame_summary()} to allow users
to override which frames appear in the traceback, and how they are
formatted.
(Contributed by Ammar Askar in bpo-44569@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44569}.)

@item 
Add @ref{8b2,,traceback.TracebackException.print()}, which prints the
formatted @ref{561,,TracebackException} instance to a file.
(Contributed by Irit Katriel in bpo-33809@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33809}.)
@end itemize

@node typing<5>,unicodedata<4>,traceback<2>,Improved Modules<2>
@anchor{whatsnew/3 11 typing}@anchor{8b3}@anchor{whatsnew/3 11 whatsnew311-typing}@anchor{8b4}
@subsubsection typing


For major changes, see @ref{7da,,New Features Related to Type Hints}.


@itemize *

@item 
Add @ref{8b5,,typing.assert_never()} and @ref{8b6,,typing.Never}.
@code{typing.assert_never()} is useful for asking a type checker to confirm
that a line of code is not reachable. At runtime, it raises an
@ref{8b7,,AssertionError}.
(Contributed by Jelle Zijlstra in gh-90633@footnote{https://github.com/python/cpython/issues/90633}.)

@item 
Add @ref{8b8,,typing.reveal_type()}. This is useful for asking a type checker
what type it has inferred for a given expression. At runtime it prints
the type of the received value.
(Contributed by Jelle Zijlstra in gh-90572@footnote{https://github.com/python/cpython/issues/90572}.)

@item 
Add @ref{8b9,,typing.assert_type()}. This is useful for asking a type checker
to confirm that the type it has inferred for a given expression matches
the given type. At runtime it simply returns the received value.
(Contributed by Jelle Zijlstra in gh-90638@footnote{https://github.com/python/cpython/issues/90638}.)

@item 
@ref{332,,typing.TypedDict} types can now be generic. (Contributed by
Samodya Abeysiriwardane in gh-89026@footnote{https://github.com/python/cpython/issues/89026}.)

@item 
@ref{331,,NamedTuple} types can now be generic.
(Contributed by Serhiy Storchaka in bpo-43923@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43923}.)

@item 
Allow subclassing of @ref{8ba,,typing.Any}. This is useful for avoiding
type checker errors related to highly dynamic class, such as mocks.
(Contributed by Shantanu Jain in gh-91154@footnote{https://github.com/python/cpython/issues/91154}.)

@item 
The @ref{8bb,,typing.final()} decorator now sets the @code{__final__} attributed on
the decorated object.
(Contributed by Jelle Zijlstra in gh-90500@footnote{https://github.com/python/cpython/issues/90500}.)

@item 
The @ref{8bc,,typing.get_overloads()} function can be used for introspecting
the overloads of a function. @ref{8bd,,typing.clear_overloads()} can be used
to clear all registered overloads of a function.
(Contributed by Jelle Zijlstra in gh-89263@footnote{https://github.com/python/cpython/issues/89263}.)

@item 
The @ref{8be,,__init__()} method of @ref{569,,Protocol} subclasses
is now preserved. (Contributed by Adrian Garcia Badarasco in gh-88970@footnote{https://github.com/python/cpython/issues/88970}.)

@item 
The representation of empty tuple types (@code{Tuple[()]}) is simplified.
This affects introspection, e.g. @code{get_args(Tuple[()])} now evaluates
to @code{()} instead of @code{((),)}.
(Contributed by Serhiy Storchaka in gh-91137@footnote{https://github.com/python/cpython/issues/91137}.)

@item 
Loosen runtime requirements for type annotations by removing the callable
check in the private @code{typing._type_check} function. (Contributed by
Gregory Beauregard in gh-90802@footnote{https://github.com/python/cpython/issues/90802}.)

@item 
@ref{8bf,,typing.get_type_hints()} now supports evaluating strings as forward
references in @ref{8c0,,PEP 585 generic aliases}.
(Contributed by Niklas Rosenstein in gh-85542@footnote{https://github.com/python/cpython/issues/85542}.)

@item 
@ref{8bf,,typing.get_type_hints()} no longer adds @ref{8c1,,Optional}
to parameters with @code{None} as a default. (Contributed by Nikita Sobolev
in gh-90353@footnote{https://github.com/python/cpython/issues/90353}.)

@item 
@ref{8bf,,typing.get_type_hints()} now supports evaluating bare stringified
@ref{56c,,ClassVar} annotations. (Contributed by Gregory Beauregard
in gh-90711@footnote{https://github.com/python/cpython/issues/90711}.)

@item 
@ref{8c2,,typing.no_type_check()} no longer modifies external classes and functions.
It also now correctly marks classmethods as not to be type checked. (Contributed
by Nikita Sobolev in gh-90729@footnote{https://github.com/python/cpython/issues/90729}.)
@end itemize

@node unicodedata<4>,unittest<5>,typing<5>,Improved Modules<2>
@anchor{whatsnew/3 11 unicodedata}@anchor{8c3}@anchor{whatsnew/3 11 whatsnew311-unicodedata}@anchor{8c4}
@subsubsection unicodedata



@itemize *

@item 
The Unicode database has been updated to version 14.0.0.
(Contributed by Benjamin Peterson in bpo-45190@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45190}).
@end itemize

@node unittest<5>,venv<2>,unicodedata<4>,Improved Modules<2>
@anchor{whatsnew/3 11 unittest}@anchor{8c5}@anchor{whatsnew/3 11 whatsnew311-unittest}@anchor{8c6}
@subsubsection unittest



@itemize *

@item 
Added methods @ref{8c7,,enterContext()} and
@ref{8c8,,enterClassContext()} of class
@ref{2b3,,TestCase}, method
@ref{8c9,,enterAsyncContext()} of
class @ref{361,,IsolatedAsyncioTestCase} and function
@ref{8ca,,unittest.enterModuleContext()}.
(Contributed by Serhiy Storchaka in bpo-45046@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45046}.)
@end itemize

@node venv<2>,warnings<2>,unittest<5>,Improved Modules<2>
@anchor{whatsnew/3 11 venv}@anchor{8cb}@anchor{whatsnew/3 11 whatsnew311-venv}@anchor{8cc}
@subsubsection venv



@itemize *

@item 
When new Python virtual environments are created, the `venv'
@ref{449,,sysconfig installation scheme} is used
to determine the paths inside the environment.
When Python runs in a virtual environment, the same installation scheme
is the default.
That means that downstream distributors can change the default sysconfig install
scheme without changing behavior of virtual environments.
Third party code that also creates new virtual environments should do the same.
(Contributed by Miro Hrončok in bpo-45413@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45413}.)
@end itemize

@node warnings<2>,zipfile<2>,venv<2>,Improved Modules<2>
@anchor{whatsnew/3 11 warnings}@anchor{8cd}@anchor{whatsnew/3 11 whatsnew311-warnings}@anchor{8ce}
@subsubsection warnings



@itemize *

@item 
@ref{179,,warnings.catch_warnings()} now accepts arguments for @ref{8cf,,warnings.simplefilter()},
providing a more concise way to locally ignore warnings or convert them to errors.
(Contributed by Zac Hatfield-Dodds in bpo-47074@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47074}.)
@end itemize

@node zipfile<2>,,warnings<2>,Improved Modules<2>
@anchor{whatsnew/3 11 whatsnew311-zipfile}@anchor{8d0}@anchor{whatsnew/3 11 zipfile}@anchor{8d1}
@subsubsection zipfile



@itemize *

@item 
Added support for specifying member name encoding for reading metadata
in a @ref{8d2,,ZipFile}’s directory and file headers.
(Contributed by Stephen J. Turnbull and Serhiy Storchaka in bpo-28080@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28080}.)

@item 
Added @ref{8d3,,ZipFile.mkdir()}
for creating new directories inside ZIP archives.
(Contributed by Sam Ezeh in gh-49083@footnote{https://github.com/python/cpython/issues/49083}.)

@item 
Added @ref{8d4,,stem}, @ref{8d5,,suffix}
and @ref{8d6,,suffixes} to @ref{8d7,,zipfile.Path}.
(Contributed by Miguel Brito in gh-88261@footnote{https://github.com/python/cpython/issues/88261}.)
@end itemize

@node Optimizations<3>,Faster CPython,Improved Modules<2>,What’s New In Python 3 11
@anchor{whatsnew/3 11 optimizations}@anchor{8d8}@anchor{whatsnew/3 11 whatsnew311-optimizations}@anchor{8d9}
@subsection Optimizations


This section covers specific optimizations independent of the
@ref{7bc,,Faster CPython} project, which is covered in its own section.


@itemize *

@item 
The compiler now optimizes simple
@ref{8da,,printf-style % formatting} on string literals
containing only the format codes @code{%s}, @code{%r} and @code{%a} and makes it as
fast as a corresponding @ref{669,,f-string} expression.
(Contributed by Serhiy Storchaka in bpo-28307@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28307}.)

@item 
Integer division (@code{//}) is better tuned for optimization by compilers.
It is now around 20% faster on x86-64 when dividing an @ref{19b,,int}
by a value smaller than @code{2**30}.
(Contributed by Gregory P. Smith and Tim Peters in gh-90564@footnote{https://github.com/python/cpython/issues/90564}.)

@item 
@ref{694,,sum()} is now nearly 30% faster for integers smaller than @code{2**30}.
(Contributed by Stefan Behnel in gh-68264@footnote{https://github.com/python/cpython/issues/68264}.)

@item 
Resizing lists is streamlined for the common case,
speeding up @ref{8db,,list.append()} by ≈15%
and simple @ref{8dc,,list comprehension}s by up to 20-30%
(Contributed by Dennis Sweeney in gh-91165@footnote{https://github.com/python/cpython/issues/91165}.)

@item 
Dictionaries don’t store hash values when all keys are Unicode objects,
decreasing @ref{183,,dict} size.
For example, @code{sys.getsizeof(dict.fromkeys("abcdefg"))}
is reduced from 352 bytes to 272 bytes (23% smaller) on 64-bit platforms.
(Contributed by Inada Naoki in bpo-46845@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46845}.)

@item 
Using @ref{8dd,,asyncio.DatagramProtocol} is now orders of magnitude faster
when transferring large files over UDP,
with speeds over 100 times higher for a ≈60 MiB file.
(Contributed by msoxzw in gh-91487@footnote{https://github.com/python/cpython/issues/91487}.)

@item 
@ref{92,,math} functions @ref{8de,,comb()} and @ref{8df,,perm()} are now
≈10 times faster for large arguments (with a larger speedup for larger `k').
(Contributed by Serhiy Storchaka in bpo-37295@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37295}.)

@item 
The @ref{d7,,statistics} functions @ref{8e0,,mean()},
@ref{8e1,,variance()} and @ref{8e2,,stdev()} now consume
iterators in one pass rather than converting them to a @ref{24d,,list} first.
This is twice as fast and can save substantial memory.
(Contributed by Raymond Hettinger in gh-90415@footnote{https://github.com/python/cpython/issues/90415}.)

@item 
@ref{8e3,,unicodedata.normalize()}
now normalizes pure-ASCII strings in constant time.
(Contributed by Donghee Na in bpo-44987@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44987}.)
@end itemize

@node Faster CPython,CPython bytecode changes<3>,Optimizations<3>,What’s New In Python 3 11
@anchor{whatsnew/3 11 faster-cpython}@anchor{8e4}@anchor{whatsnew/3 11 whatsnew311-faster-cpython}@anchor{7bc}
@subsection Faster CPython


CPython 3.11 is an average of
25% faster@footnote{https://github.com/faster-cpython/ideas#published-results}
than CPython 3.10 as measured with the
pyperformance@footnote{https://github.com/python/pyperformance} benchmark suite,
when compiled with GCC on Ubuntu Linux.
Depending on your workload, the overall speedup could be 10-60%.

This project focuses on two major areas in Python:
@ref{8e5,,Faster Startup} and @ref{8e6,,Faster Runtime}.
Optimizations not covered by this project are listed separately under
@ref{8d9,,Optimizations}.

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

@end menu

@node Faster Startup,Faster Runtime,,Faster CPython
@anchor{whatsnew/3 11 faster-startup}@anchor{8e7}@anchor{whatsnew/3 11 whatsnew311-faster-startup}@anchor{8e5}
@subsubsection Faster Startup


@menu
* Frozen imports / Static code objects:: 

@end menu

@node Frozen imports / Static code objects,,,Faster Startup
@anchor{whatsnew/3 11 frozen-imports-static-code-objects}@anchor{8e8}@anchor{whatsnew/3 11 whatsnew311-faster-imports}@anchor{8e9}
@subsubsection Frozen imports / Static code objects


Python caches @ref{4ab,,bytecode} in the @ref{8ea,,__pycache__}
directory to speed up module loading.

Previously in 3.10, Python module execution looked like this:

@example
Read __pycache__ -> Unmarshal -> Heap allocated code object -> Evaluate
@end example

In Python 3.11, the core modules essential for Python startup are “frozen”.
This means that their @ref{7d1,,코드 객체} (and bytecode)
are statically allocated by the interpreter.
This reduces the steps in module execution process to:

@example
Statically allocated code object -> Evaluate
@end example

Interpreter startup is now 10-15% faster in Python 3.11. This has a big
impact for short-running programs using Python.

(Contributed by Eric Snow, Guido van Rossum and Kumar Aditya in many issues.)

@node Faster Runtime,Misc,Faster Startup,Faster CPython
@anchor{whatsnew/3 11 faster-runtime}@anchor{8eb}@anchor{whatsnew/3 11 whatsnew311-faster-runtime}@anchor{8e6}
@subsubsection Faster Runtime


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

@end menu

@node Cheaper lazy Python frames,Inlined Python function calls,,Faster Runtime
@anchor{whatsnew/3 11 cheaper-lazy-python-frames}@anchor{8ec}@anchor{whatsnew/3 11 whatsnew311-lazy-python-frames}@anchor{8ed}
@subsubsection Cheaper, lazy Python frames


Python frames, holding execution information,
are created whenever Python calls a Python function.
The following are new frame optimizations:


@itemize -

@item 
Streamlined the frame creation process.

@item 
Avoided memory allocation by generously re-using frame space on the C stack.

@item 
Streamlined the internal frame struct to contain only essential information.
Frames previously held extra debugging and memory management information.
@end itemize

Old-style @ref{8ee,,frame objects}
are now created only when requested by debuggers
or by Python introspection functions such as @ref{8ef,,sys._getframe()} and
@ref{8f0,,inspect.currentframe()}. For most user code, no frame objects are
created at all. As a result, nearly all Python functions calls have sped
up significantly. We measured a 3-7% speedup in pyperformance.

(Contributed by Mark Shannon in bpo-44590@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44590}.)
@anchor{whatsnew/3 11 inline-calls}@anchor{8f1}
@node Inlined Python function calls,PEP 659 Specializing Adaptive Interpreter,Cheaper lazy Python frames,Faster Runtime
@anchor{whatsnew/3 11 inlined-python-function-calls}@anchor{8f2}@anchor{whatsnew/3 11 whatsnew311-inline-calls}@anchor{8f3}
@subsubsection Inlined Python function calls


During a Python function call, Python will call an evaluating C function to
interpret that function’s code. This effectively limits pure Python recursion to
what’s safe for the C stack.

In 3.11, when CPython detects Python code calling another Python function,
it sets up a new frame, and “jumps” to the new code inside the new frame. This
avoids calling the C interpreting function altogether.

Most Python function calls now consume no C stack space, speeding them up.
In simple recursive functions like fibonacci or
factorial, we observed a 1.7x speedup. This also means recursive functions
can recurse significantly deeper
(if the user increases the recursion limit with @ref{6e9,,sys.setrecursionlimit()}).
We measured a 1-3% improvement in pyperformance.

(Contributed by Pablo Galindo and Mark Shannon in bpo-45256@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45256}.)

@node PEP 659 Specializing Adaptive Interpreter,,Inlined Python function calls,Faster Runtime
@anchor{whatsnew/3 11 pep-659-specializing-adaptive-interpreter}@anchor{8f4}@anchor{whatsnew/3 11 whatsnew311-pep659}@anchor{4a0}
@subsubsection PEP 659: Specializing Adaptive Interpreter


@geindex Python 향상 제안; PEP 659
PEP 659@footnote{https://peps.python.org/pep-0659/} is one of the key parts of the Faster CPython project. The general
idea is that while Python is a dynamic language, most code has regions where
objects and types rarely change. This concept is known as `type stability'.

At runtime, Python will try to look for common patterns and type stability
in the executing code. Python will then replace the current operation with a
more specialized one. This specialized operation uses fast paths available only
to those use cases/types, which generally outperform their generic
counterparts. This also brings in another concept called `inline caching', where
Python caches the results of expensive operations directly in the
@ref{4ab,,bytecode}.

The specializer will also combine certain common instruction pairs into one
superinstruction, reducing the overhead during execution.

Python will only specialize
when it sees code that is “hot” (executed multiple times). This prevents Python
from wasting time on run-once code. Python can also de-specialize when code is
too dynamic or when the use changes. Specialization is attempted periodically,
and specialization attempts are not too expensive,
allowing specialization to adapt to new circumstances.

(PEP written by Mark Shannon, with ideas inspired by Stefan Brunthaler.
See 
@geindex Python 향상 제안; PEP 659
PEP 659@footnote{https://peps.python.org/pep-0659/} for more information. Implementation by Mark Shannon and Brandt
Bucher, with additional help from Irit Katriel and Dennis Sweeney.)

@c If I missed out anyone, please add them.


@multitable {xxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxx} 
@headitem

Operation

@tab

Form

@tab

Specialization

@tab

Operation speedup
(up to)

@tab

Contributor(s)

@item

Binary
operations

@tab

@code{x + x}

@code{x - x}

@code{x * x}

@tab

Binary add, multiply and subtract for common types
such as @ref{19b,,int}, @ref{196,,float} and @ref{169,,str}
take custom fast paths for their underlying types.

@tab

10%

@tab

Mark Shannon,
Donghee Na,
Brandt Bucher,
Dennis Sweeney

@item

Subscript

@tab

@code{a[i]}

@tab

Subscripting container types such as @ref{24d,,list},
@ref{610,,tuple} and @ref{183,,dict} directly index
the underlying data structures.

Subscripting custom @ref{588,,__getitem__()}
is also inlined similar to @ref{8f1,,Inlined Python function calls}.

@tab

10-25%

@tab

Irit Katriel,
Mark Shannon

@item

Store
subscript

@tab

@code{a[i] = z}

@tab

Similar to subscripting specialization above.

@tab

10-25%

@tab

Dennis Sweeney

@item

Calls

@tab

@code{f(arg)}

@code{C(arg)}

@tab

Calls to common builtin (C) functions and types such
as @ref{83f,,len()} and @ref{169,,str} directly call their
underlying C version. This avoids going through the
internal calling convention.

@tab

20%

@tab

Mark Shannon,
Ken Jin

@item

Load
global
variable

@tab

@code{print}

@code{len}

@tab

The object’s index in the globals/builtins namespace
is cached. Loading globals and builtins require
zero namespace lookups.

@tab

@footnote{
A similar optimization already existed since Python 3.8.
3.11 specializes for more forms and reduces some overhead.
}

@tab

Mark Shannon

@item

Load
attribute

@tab

@code{o.attr}

@tab

Similar to loading global variables. The attribute’s
index inside the class/object’s namespace is cached.
In most cases, attribute loading will require zero
namespace lookups.

@tab

@footnote{
A similar optimization already existed since Python 3.10.
3.11 specializes for more forms. Furthermore, all attribute loads should
be sped up by @uref{https://bugs.python.org/issue?@@action=redirect&bpo=45947,bpo-45947}.
}

@tab

Mark Shannon

@item

Load
methods for
call

@tab

@code{o.meth()}

@tab

The actual address of the method is cached. Method
loading now has no namespace lookups – even for
classes with long inheritance chains.

@tab

10-20%

@tab

Ken Jin,
Mark Shannon

@item

Store
attribute

@tab

@code{o.attr = z}

@tab

Similar to load attribute optimization.

@tab

2%
in pyperformance

@tab

Mark Shannon

@item

Unpack
Sequence

@tab

@code{*seq}

@tab

Specialized for common containers such as
@ref{24d,,list} and @ref{610,,tuple}.
Avoids internal calling convention.

@tab

8%

@tab

Brandt Bucher

@end multitable


@node Misc,FAQ,Faster Runtime,Faster CPython
@anchor{whatsnew/3 11 misc}@anchor{8f5}@anchor{whatsnew/3 11 whatsnew311-faster-cpython-misc}@anchor{8f6}
@subsubsection Misc



@itemize *

@item 
Objects now require less memory due to lazily created object namespaces.
Their namespace dictionaries now also share keys more freely.
(Contributed Mark Shannon in bpo-45340@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45340} and bpo-40116@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40116}.)

@item 
“Zero-cost” exceptions are implemented, eliminating the cost
of @ref{8f7,,try} statements when no exception is raised.
(Contributed by Mark Shannon in bpo-40222@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40222}.)

@item 
A more concise representation of exceptions in the interpreter reduced the
time required for catching an exception by about 10%.
(Contributed by Irit Katriel in bpo-45711@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45711}.)

@item 
@ref{be,,re}’s regular expression matching engine has been partially refactored,
and now uses computed gotos (or “threaded code”) on supported platforms. As a
result, Python 3.11 executes the pyperformance regular expression benchmarks@footnote{https://pyperformance.readthedocs.io/benchmarks.html#regex-dna} up to 10%
faster than Python 3.10.
(Contributed by Brandt Bucher in gh-91404@footnote{https://github.com/python/cpython/issues/91404}.)
@end itemize

@node FAQ,About,Misc,Faster CPython
@anchor{whatsnew/3 11 faq}@anchor{8f8}@anchor{whatsnew/3 11 whatsnew311-faster-cpython-faq}@anchor{8f9}
@subsubsection FAQ


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

@end menu

@node How should I write my code to utilize these speedups?,Will CPython 3 11 use more memory?,,FAQ
@anchor{whatsnew/3 11 faster-cpython-faq-my-code}@anchor{8fa}@anchor{whatsnew/3 11 how-should-i-write-my-code-to-utilize-these-speedups}@anchor{8fb}
@subsubsection How should I write my code to utilize these speedups?


Write Pythonic code that follows common best practices;
you don’t have to change your code.
The Faster CPython project optimizes for common code patterns we observe.

@node Will CPython 3 11 use more memory?,I don’t see any speedups in my workload Why?,How should I write my code to utilize these speedups?,FAQ
@anchor{whatsnew/3 11 faster-cpython-faq-memory}@anchor{8fc}@anchor{whatsnew/3 11 will-cpython-3-11-use-more-memory}@anchor{8fd}
@subsubsection Will CPython 3.11 use more memory?


Maybe not; we don’t expect memory use to exceed 20% higher than 3.10.
This is offset by memory optimizations for frame objects and object
dictionaries as mentioned above.

@node I don’t see any speedups in my workload Why?,Is there a JIT compiler?,Will CPython 3 11 use more memory?,FAQ
@anchor{whatsnew/3 11 faster-cpython-ymmv}@anchor{8fe}@anchor{whatsnew/3 11 i-don-t-see-any-speedups-in-my-workload-why}@anchor{8ff}
@subsubsection I don’t see any speedups in my workload. Why?


Certain code won’t have noticeable benefits. If your code spends most of
its time on I/O operations, or already does most of its
computation in a C extension library like NumPy, there won’t be significant
speedups. This project currently benefits pure-Python workloads the most.

Furthermore, the pyperformance figures are a geometric mean. Even within the
pyperformance benchmarks, certain benchmarks have slowed down slightly, while
others have sped up by nearly 2x!

@node Is there a JIT compiler?,,I don’t see any speedups in my workload Why?,FAQ
@anchor{whatsnew/3 11 faster-cpython-jit}@anchor{900}@anchor{whatsnew/3 11 is-there-a-jit-compiler}@anchor{901}
@subsubsection Is there a JIT compiler?


No. We’re still exploring other optimizations.

@node About,,FAQ,Faster CPython
@anchor{whatsnew/3 11 about}@anchor{902}@anchor{whatsnew/3 11 whatsnew311-faster-cpython-about}@anchor{903}
@subsubsection About


Faster CPython explores optimizations for @ref{904,,CPython}. The main team is
funded by Microsoft to work on this full-time. Pablo Galindo Salgado is also
funded by Bloomberg LP to work on the project part-time. Finally, many
contributors are volunteers from the community.

@node CPython bytecode changes<3>,Deprecated<4>,Faster CPython,What’s New In Python 3 11
@anchor{whatsnew/3 11 cpython-bytecode-changes}@anchor{905}@anchor{whatsnew/3 11 whatsnew311-bytecode-changes}@anchor{906}
@subsection CPython bytecode changes


The bytecode now contains inline cache entries,
which take the form of the newly-added @ref{907,,CACHE} instructions.
Many opcodes expect to be followed by an exact number of caches,
and instruct the interpreter to skip over them at runtime.
Populated caches can look like arbitrary instructions,
so great care should be taken when reading or modifying
raw, adaptive bytecode containing quickened data.

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

@end menu

@node New opcodes,Replaced opcodes,,CPython bytecode changes<3>
@anchor{whatsnew/3 11 new-opcodes}@anchor{908}@anchor{whatsnew/3 11 whatsnew311-added-opcodes}@anchor{909}
@subsubsection New opcodes



@itemize *

@item 
@code{ASYNC_GEN_WRAP}, @ref{90a,,RETURN_GENERATOR} and @ref{90b,,SEND},
used in generators and co-routines.

@item 
@ref{90c,,COPY_FREE_VARS},
which avoids needing special caller-side code for closures.

@item 
@ref{90d,,JUMP_BACKWARD_NO_INTERRUPT},
for use in certain loops where handling interrupts is undesirable.

@item 
@ref{90e,,MAKE_CELL}, to create @ref{90f,,셀 객체}.

@item 
@ref{910,,CHECK_EG_MATCH}  and  @code{PREP_RERAISE_STAR},
to handle the @ref{7bd,,new exception groups and except*}
added in 
@geindex Python 향상 제안; PEP 654
PEP 654@footnote{https://peps.python.org/pep-0654/}.

@item 
@ref{911,,PUSH_EXC_INFO}, for use in exception handlers.

@item 
@ref{5b9,,RESUME}, a no-op,
for internal tracing, debugging and optimization checks.
@end itemize

@node Replaced opcodes,Changed/removed opcodes,New opcodes,CPython bytecode changes<3>
@anchor{whatsnew/3 11 replaced-opcodes}@anchor{912}@anchor{whatsnew/3 11 whatsnew311-replaced-opcodes}@anchor{913}
@subsubsection Replaced opcodes



@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Replaced Opcode(s)

@tab

New Opcode(s)

@tab

Notes

@item


@display
@code{BINARY_*}@w{ }
@code{INPLACE_*}@w{ }
@end display



@tab

@ref{366,,BINARY_OP}

@tab

Replaced all numeric binary/in-place
opcodes with a single opcode

@item


@display
@code{CALL_FUNCTION}@w{ }
@code{CALL_FUNCTION_KW}@w{ }
@code{CALL_METHOD}@w{ }
@end display



@tab


@display
@ref{914,,CALL}@w{ }
@code{KW_NAMES}@w{ }
@code{PRECALL}@w{ }
@ref{915,,PUSH_NULL}@w{ }
@end display



@tab

Decouples argument shifting for methods
from handling of keyword arguments;
allows better specialization of calls

@item


@display
@code{DUP_TOP}@w{ }
@code{DUP_TOP_TWO}@w{ }
@code{ROT_TWO}@w{ }
@code{ROT_THREE}@w{ }
@code{ROT_FOUR}@w{ }
@code{ROT_N}@w{ }
@end display



@tab


@display
@ref{916,,COPY}@w{ }
@ref{917,,SWAP}@w{ }
@end display



@tab

Stack manipulation instructions

@item


@display
@code{JUMP_IF_NOT_EXC_MATCH}@w{ }
@end display



@tab


@display
@ref{918,,CHECK_EXC_MATCH}@w{ }
@end display



@tab

Now performs check but doesn’t jump

@item


@display
@code{JUMP_ABSOLUTE}@w{ }
@code{POP_JUMP_IF_FALSE}@w{ }
@code{POP_JUMP_IF_TRUE}@w{ }
@end display



@tab


@display
@ref{919,,JUMP_BACKWARD}@w{ }
@code{POP_JUMP_BACKWARD_IF_*}@w{ }
@code{POP_JUMP_FORWARD_IF_*}@w{ }
@end display



@tab

See @footnote{
All jump opcodes are now relative, including the
existing @code{JUMP_IF_TRUE_OR_POP} and @code{JUMP_IF_FALSE_OR_POP}.
The argument is now an offset from the current instruction
rather than an absolute location.
};
@code{TRUE}, @code{FALSE},
@code{NONE} and @code{NOT_NONE} variants
for each direction

@item


@display
@code{SETUP_WITH}@w{ }
@code{SETUP_ASYNC_WITH}@w{ }
@end display



@tab

@code{BEFORE_WITH}

@tab

@ref{186,,with} block setup

@end multitable

@anchor{whatsnew/3 11 whatsnew311-changed-opcodes}@anchor{91a}@anchor{whatsnew/3 11 whatsnew311-removed-opcodes}@anchor{91b}
@node Changed/removed opcodes,,Replaced opcodes,CPython bytecode changes<3>
@anchor{whatsnew/3 11 changed-removed-opcodes}@anchor{91c}@anchor{whatsnew/3 11 whatsnew311-changed-removed-opcodes}@anchor{91d}
@subsubsection Changed/removed opcodes



@itemize *

@item 
Changed @ref{91e,,MATCH_CLASS} and @ref{91f,,MATCH_KEYS}
to no longer push an additional boolean value to indicate success/failure.
Instead, @code{None} is pushed on failure
in place of the tuple of extracted values.

@item 
Changed opcodes that work with exceptions to reflect them
now being represented as one item on the stack instead of three
(see gh-89874@footnote{https://github.com/python/cpython/issues/89874}).

@item 
Removed @code{COPY_DICT_WITHOUT_KEYS}, @code{GEN_START},
@code{POP_BLOCK}, @code{SETUP_FINALLY} and @code{YIELD_FROM}.
@end itemize
@anchor{whatsnew/3 11 whatsnew311-deprecated}@anchor{920}
@node Deprecated<4>,Pending Removal in Python 3 12,CPython bytecode changes<3>,What’s New In Python 3 11
@anchor{whatsnew/3 11 deprecated}@anchor{921}@anchor{whatsnew/3 11 whatsnew311-python-api-deprecated}@anchor{922}
@subsection Deprecated


This section lists Python APIs that have been deprecated in Python 3.11.

Deprecated C APIs are @ref{923,,listed separately}.
@anchor{whatsnew/3 11 whatsnew311-deprecated-language}@anchor{924}
@menu
* Language/Builtins:: 
* Modules:: 
* Standard Library:: 

@end menu

@node Language/Builtins,Modules,,Deprecated<4>
@anchor{whatsnew/3 11 language-builtins}@anchor{925}@anchor{whatsnew/3 11 whatsnew311-deprecated-builtins}@anchor{926}
@subsubsection Language/Builtins



@itemize *

@item 
Chaining @ref{48f,,classmethod} descriptors (introduced in bpo-19072@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19072})
is now deprecated.  It can no longer be used to wrap other descriptors
such as @ref{4b3,,property}.  The core design of this feature was flawed
and caused a number of downstream problems.  To “pass-through” a
@code{classmethod}, consider using the @code{__wrapped__} attribute
that was added in Python 3.10.
(Contributed by Raymond Hettinger in gh-89519@footnote{https://github.com/python/cpython/issues/89519}.)

@item 
Octal escapes in string and bytes literals with values larger than @code{0o377}
(255 in decimal) now produce a @ref{1a3,,DeprecationWarning}.
In a future Python version, they will raise a @ref{1ae,,SyntaxWarning} and
eventually a @ref{18e,,SyntaxError}.
(Contributed by Serhiy Storchaka in gh-81548@footnote{https://github.com/python/cpython/issues/81548}.)

@item 
The delegation of @ref{19b,,int()} to @ref{19c,,__trunc__()} is now deprecated.
Calling @code{int(a)} when @code{type(a)} implements @code{__trunc__()} but not
@ref{19d,,__int__()} or @ref{19e,,__index__()} now raises
a @ref{1a3,,DeprecationWarning}.
(Contributed by Zackery Spytz in bpo-44977@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44977}.)
@end itemize

@node Modules,Standard Library,Language/Builtins,Deprecated<4>
@anchor{whatsnew/3 11 modules}@anchor{927}@anchor{whatsnew/3 11 whatsnew311-deprecated-modules}@anchor{928}
@subsubsection Modules

@anchor{whatsnew/3 11 whatsnew311-pep594}@anchor{7c8}

@itemize *

@item 
@geindex Python 향상 제안; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/} led to the deprecations of the following modules
slated for removal in Python 3.13:


@multitable {xxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxx} 
@item

@code{aifc}

@tab

@code{chunk}

@tab

@code{msilib}

@tab

@code{pipes}

@tab

@code{telnetlib}

@item

@code{audioop}

@tab

@code{crypt}

@tab

@code{nis}

@tab

@code{sndhdr}

@tab

@code{uu}

@item

@code{cgi}

@tab

@code{imghdr}

@tab

@code{nntplib}

@tab

@code{spwd}

@tab

@code{xdrlib}

@item

@code{cgitb}

@tab

@code{mailcap}

@tab

@code{ossaudiodev}

@tab

@code{sunau}

@tab

@end multitable


(Contributed by Brett Cannon in bpo-47061@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47061} and Victor Stinner in
gh-68966@footnote{https://github.com/python/cpython/issues/68966}.)

@item 
The @code{asynchat}, @code{asyncore} and  @code{smtpd} modules have been
deprecated since at least Python 3.6. Their documentation and deprecation
warnings have now been updated to note they will be removed in Python 3.12.
(Contributed by Hugo van Kemenade in bpo-47022@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47022}.)

@item 
The @code{lib2to3} package and @code{2to3} tool
are now deprecated and may not be able to parse Python 3.10 or newer.
See 
@geindex Python 향상 제안; PEP 617
PEP 617@footnote{https://peps.python.org/pep-0617/}, introducing the new PEG parser, for details.
(Contributed by Victor Stinner in bpo-40360@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40360}.)

@item 
Undocumented modules @code{sre_compile}, @code{sre_constants}
and @code{sre_parse} are now deprecated.
(Contributed by Serhiy Storchaka in bpo-47152@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47152}.)
@end itemize

@node Standard Library,,Modules,Deprecated<4>
@anchor{whatsnew/3 11 standard-library}@anchor{929}@anchor{whatsnew/3 11 whatsnew311-deprecated-stdlib}@anchor{92a}
@subsubsection Standard Library



@itemize *

@item 
The following have been deprecated in @ref{26,,configparser} since Python 3.2.
Their deprecation warnings have now been updated to note they will be removed
in Python 3.12:


@itemize *

@item 
the @code{configparser.SafeConfigParser} class

@item 
the @code{configparser.ParsingError.filename} property

@item 
the @code{configparser.RawConfigParser.readfp()} method
@end itemize

(Contributed by Hugo van Kemenade in bpo-45173@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45173}.)

@item 
@code{configparser.LegacyInterpolation} has been deprecated in the docstring
since Python 3.2, and is not listed in the @ref{26,,configparser} documentation.
It now emits a @ref{1a3,,DeprecationWarning} and will be removed
in Python 3.13. Use @ref{92b,,configparser.BasicInterpolation} or
@ref{92c,,configparser.ExtendedInterpolation} instead.
(Contributed by Hugo van Kemenade in bpo-46607@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46607}.)

@item 
The older set of @ref{7f,,importlib.resources} functions were deprecated
in favor of the replacements added in Python 3.9
and will be removed in a future Python version,
due to not supporting resources located within package subdirectories:


@itemize *

@item 
@code{importlib.resources.contents()}

@item 
@code{importlib.resources.is_resource()}

@item 
@code{importlib.resources.open_binary()}

@item 
@code{importlib.resources.open_text()}

@item 
@code{importlib.resources.read_binary()}

@item 
@code{importlib.resources.read_text()}

@item 
@code{importlib.resources.path()}
@end itemize

@item 
The @ref{326,,locale.getdefaultlocale()} function is deprecated and will be
removed in Python 3.15. Use @ref{328,,locale.setlocale()},
@ref{75b,,locale.getpreferredencoding(False)} and
@ref{327,,locale.getlocale()} functions instead.
(Contributed by Victor Stinner in gh-90817@footnote{https://github.com/python/cpython/issues/90817}.)

@item 
The @code{locale.resetlocale()} function is deprecated and will be
removed in Python 3.13. Use @code{locale.setlocale(locale.LC_ALL, "")} instead.
(Contributed by Victor Stinner in gh-90817@footnote{https://github.com/python/cpython/issues/90817}.)

@item 
Stricter rules will now be applied for numerical group references
and group names in @ref{92d,,regular expressions}.
Only sequences of ASCII digits will now be accepted as a numerical reference,
and the group name in @ref{192,,bytes} patterns and replacement strings
can only contain ASCII letters, digits and underscores.
For now, a deprecation warning is raised for syntax violating these rules.
(Contributed by Serhiy Storchaka in gh-91760@footnote{https://github.com/python/cpython/issues/91760}.)

@item 
In the @ref{be,,re} module, the @code{re.template()} function
and the corresponding @code{re.TEMPLATE} and @code{re.T} flags
are deprecated, as they were undocumented and lacked an obvious purpose.
They will be removed in Python 3.13.
(Contributed by Serhiy Storchaka and Miro Hrončok in gh-92728@footnote{https://github.com/python/cpython/issues/92728}.)

@item 
@code{turtle.settiltangle()} has been deprecated since Python 3.1;
it now emits a deprecation warning and will be removed in Python 3.13. Use
@ref{92e,,turtle.tiltangle()} instead (it was earlier incorrectly marked
as deprecated, and its docstring is now corrected).
(Contributed by Hugo van Kemenade in bpo-45837@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45837}.)

@item 
@ref{360,,typing.Text}, which exists solely to provide compatibility support
between Python 2 and Python 3 code, is now deprecated. Its removal is
currently unplanned, but users are encouraged to use @ref{169,,str} instead
wherever possible.
(Contributed by Alex Waygood in gh-92332@footnote{https://github.com/python/cpython/issues/92332}.)

@item 
The keyword argument syntax for constructing @ref{332,,typing.TypedDict} types
is now deprecated. Support will be removed in Python 3.13. (Contributed by
Jingchen Ye in gh-90224@footnote{https://github.com/python/cpython/issues/90224}.)

@item 
@code{webbrowser.MacOSX} is deprecated and will be removed in Python 3.13.
It is untested, undocumented, and not used by @ref{11b,,webbrowser} itself.
(Contributed by Donghee Na in bpo-42255@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42255}.)

@item 
The behavior of returning a value from a @ref{2b3,,TestCase} and
@ref{361,,IsolatedAsyncioTestCase} test methods (other than the
default @code{None} value) is now deprecated.

@item 
Deprecated the following not-formally-documented @ref{10c,,unittest} functions,
scheduled for removal in Python 3.13:


@itemize *

@item 
@code{unittest.findTestCases()}

@item 
@code{unittest.makeSuite()}

@item 
@code{unittest.getTestCaseNames()}
@end itemize

Use @ref{592,,TestLoader} methods instead:


@itemize *

@item 
@ref{593,,unittest.TestLoader.loadTestsFromModule()}

@item 
@ref{594,,unittest.TestLoader.loadTestsFromTestCase()}

@item 
@ref{595,,unittest.TestLoader.getTestCaseNames()}
@end itemize

(Contributed by Erlend E. Aasland in bpo-5846@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5846}.)

@item 
@code{unittest.TestProgram.usageExit()} is marked deprecated, to be removed
in 3.13.
(Contributed by Carlos Damázio in gh-67048@footnote{https://github.com/python/cpython/issues/67048}.)
@end itemize
@anchor{whatsnew/3 11 whatsnew311-pending-removal}@anchor{92f}
@node Pending Removal in Python 3 12,Removed<4>,Deprecated<4>,What’s New In Python 3 11
@anchor{whatsnew/3 11 pending-removal-in-python-3-12}@anchor{930}@anchor{whatsnew/3 11 whatsnew311-python-api-pending-removal}@anchor{931}
@subsection Pending Removal in Python 3.12


The following Python APIs have been deprecated in earlier Python releases,
and will be removed in Python 3.12.

C APIs pending removal are
@ref{932,,listed separately}.


@itemize *

@item 
The @code{asynchat} module

@item 
The @code{asyncore} module

@item 
The @ref{933,,entire distutils package}

@item 
The @code{imp} module

@item 
The @ref{238,,typing.io} namespace

@item 
The @ref{934,,typing.re} namespace

@item 
@code{cgi.log()}

@item 
@code{importlib.find_loader()}

@item 
@code{importlib.abc.Loader.module_repr()}

@item 
@code{importlib.abc.MetaPathFinder.find_module()}

@item 
@code{importlib.abc.PathEntryFinder.find_loader()}

@item 
@code{importlib.abc.PathEntryFinder.find_module()}

@item 
@code{importlib.machinery.BuiltinImporter.find_module()}

@item 
@code{importlib.machinery.BuiltinLoader.module_repr()}

@item 
@code{importlib.machinery.FileFinder.find_loader()}

@item 
@code{importlib.machinery.FileFinder.find_module()}

@item 
@code{importlib.machinery.FrozenImporter.find_module()}

@item 
@code{importlib.machinery.FrozenLoader.module_repr()}

@item 
@code{importlib.machinery.PathFinder.find_module()}

@item 
@code{importlib.machinery.WindowsRegistryFinder.find_module()}

@item 
@code{importlib.util.module_for_loader()}

@item 
@code{importlib.util.set_loader_wrapper()}

@item 
@code{importlib.util.set_package_wrapper()}

@item 
@code{pkgutil.ImpImporter}

@item 
@code{pkgutil.ImpLoader}

@item 
@code{pathlib.Path.link_to()}

@item 
@code{sqlite3.enable_shared_cache()}

@item 
@code{sqlite3.OptimizedUnicode()}

@item 
@code{PYTHONTHREADDEBUG} environment variable

@item 
The following deprecated aliases in @ref{10c,,unittest}:

@quotation


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxx} 
@headitem

Deprecated alias

@tab

Method Name

@tab

Deprecated in

@item

@code{failUnless}

@tab

@ref{749,,assertTrue()}

@tab

3.1

@item

@code{failIf}

@tab

@ref{74a,,assertFalse()}

@tab

3.1

@item

@code{failUnlessEqual}

@tab

@ref{74b,,assertEqual()}

@tab

3.1

@item

@code{failIfEqual}

@tab

@ref{74c,,assertNotEqual()}

@tab

3.1

@item

@code{failUnlessAlmostEqual}

@tab

@ref{74d,,assertAlmostEqual()}

@tab

3.1

@item

@code{failIfAlmostEqual}

@tab

@ref{74e,,assertNotAlmostEqual()}

@tab

3.1

@item

@code{failUnlessRaises}

@tab

@ref{74f,,assertRaises()}

@tab

3.1

@item

@code{assert_}

@tab

@ref{749,,assertTrue()}

@tab

3.2

@item

@code{assertEquals}

@tab

@ref{74b,,assertEqual()}

@tab

3.2

@item

@code{assertNotEquals}

@tab

@ref{74c,,assertNotEqual()}

@tab

3.2

@item

@code{assertAlmostEquals}

@tab

@ref{74d,,assertAlmostEqual()}

@tab

3.2

@item

@code{assertNotAlmostEquals}

@tab

@ref{74e,,assertNotAlmostEqual()}

@tab

3.2

@item

@code{assertRegexpMatches}

@tab

@ref{750,,assertRegex()}

@tab

3.2

@item

@code{assertRaisesRegexp}

@tab

@ref{751,,assertRaisesRegex()}

@tab

3.2

@item

@code{assertNotRegexpMatches}

@tab

@ref{752,,assertNotRegex()}

@tab

3.5

@end multitable

@end quotation
@end itemize
@anchor{whatsnew/3 11 whatsnew311-removed}@anchor{935}
@node Removed<4>,Porting to Python 3 11,Pending Removal in Python 3 12,What’s New In Python 3 11
@anchor{whatsnew/3 11 removed}@anchor{936}@anchor{whatsnew/3 11 whatsnew311-python-api-removed}@anchor{937}
@subsection Removed


This section lists Python APIs that have been removed in Python 3.11.

Removed C APIs are @ref{938,,listed separately}.


@itemize *

@item 
Removed the @code{@@asyncio.coroutine()} @ref{939,,decorator}
enabling legacy generator-based coroutines to be compatible with
@ref{93a,,async} / @ref{18d,,await} code.
The function has been deprecated since Python 3.8 and the removal was
initially scheduled for Python 3.10. Use @ref{7ec,,async def} instead.
(Contributed by Illia Volochii in bpo-43216@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43216}.)

@item 
Removed @code{asyncio.coroutines.CoroWrapper} used for wrapping legacy
generator-based coroutine objects in the debug mode.
(Contributed by Illia Volochii in bpo-43216@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43216}.)

@item 
Due to significant security concerns, the `reuse_address' parameter of
@ref{93b,,asyncio.loop.create_datagram_endpoint()}, disabled in Python 3.9, is
now entirely removed. This is because of the behavior of the socket option
@code{SO_REUSEADDR} in UDP.
(Contributed by Hugo van Kemenade in bpo-45129@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45129}.)

@item 
Removed the @code{binhex} module, deprecated in Python 3.9.
Also removed the related, similarly-deprecated @ref{11,,binascii} functions:


@itemize *

@item 
@code{binascii.a2b_hqx()}

@item 
@code{binascii.b2a_hqx()}

@item 
@code{binascii.rlecode_hqx()}

@item 
@code{binascii.rldecode_hqx()}
@end itemize

The @ref{93c,,binascii.crc_hqx()} function remains available.

(Contributed by Victor Stinner in bpo-45085@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45085}.)

@item 
Removed the @code{distutils} @code{bdist_msi} command deprecated in Python 3.9.
Use @code{bdist_wheel} (wheel packages) instead.
(Contributed by Hugo van Kemenade in bpo-45124@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45124}.)

@item 
Removed the @ref{588,,__getitem__()} methods of
@ref{93d,,xml.dom.pulldom.DOMEventStream}, @ref{93e,,wsgiref.util.FileWrapper}
and @ref{93f,,fileinput.FileInput}, deprecated since Python 3.9.
(Contributed by Hugo van Kemenade in bpo-45132@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45132}.)

@item 
Removed the deprecated @ref{67,,gettext} functions
@code{lgettext()}, @code{ldgettext()},
@code{lngettext()} and @code{ldngettext()}.
Also removed the @code{bind_textdomain_codeset()} function,
the @code{NullTranslations.output_charset()} and
@code{NullTranslations.set_output_charset()} methods,
and the `codeset' parameter of @code{translation()} and @code{install()},
since they are only used for the @code{l*gettext()} functions.
(Contributed by Donghee Na and Serhiy Storchaka in bpo-44235@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44235}.)

@item 
Removed from the @ref{82,,inspect} module:


@itemize *

@item 
The @code{getargspec()} function, deprecated since Python 3.0;
use @ref{22f,,inspect.signature()} or @ref{940,,inspect.getfullargspec()} instead.

@item 
The @code{formatargspec()} function, deprecated since Python 3.5;
use the @ref{22f,,inspect.signature()} function
or the @ref{4e3,,inspect.Signature} object directly.

@item 
The undocumented @code{Signature.from_builtin()}
and @code{Signature.from_function()} methods, deprecated since Python 3.5;
use the @ref{941,,Signature.from_callable()}
method instead.
@end itemize

(Contributed by Hugo van Kemenade in bpo-45320@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45320}.)

@item 
Removed the @ref{942,,__class_getitem__()} method
from @ref{6cc,,pathlib.PurePath},
because it was not used and added by mistake in previous versions.
(Contributed by Nikita Sobolev in bpo-46483@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46483}.)

@item 
Removed the @code{MailmanProxy} class in the @code{smtpd} module,
as it is unusable without the external @code{mailman} package.
(Contributed by Donghee Na in bpo-35800@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35800}.)

@item 
Removed the deprecated @code{split()} method of @code{_tkinter.TkappType}.
(Contributed by Erlend E. Aasland in bpo-38371@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38371}.)

@item 
Removed namespace package support from @ref{10c,,unittest} discovery.
It was introduced in Python 3.4 but has been broken since Python 3.7.
(Contributed by Inada Naoki in bpo-23882@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23882}.)

@item 
Removed the undocumented private @code{float.__set_format__()} method,
previously known as @code{float.__setformat__()} in Python 3.7.
Its docstring said: “You probably don’t want to use this function.
It exists mainly to be used in Python’s test suite.”
(Contributed by Victor Stinner in bpo-46852@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46852}.)

@item 
The @code{--experimental-isolated-subinterpreters} configure flag
(and corresponding @code{EXPERIMENTAL_ISOLATED_SUBINTERPRETERS} macro)
have been removed.

@item 
Pynche@footnote{https://pypi.org/project/Pynche/}
— The Pythonically Natural Color and Hue Editor — has been moved out
of @code{Tools/scripts} and is being developed independently@footnote{https://gitlab.com/warsaw/pynche/-/tree/main} from the Python source tree.
@end itemize
@anchor{whatsnew/3 11 whatsnew311-porting}@anchor{943}
@node Porting to Python 3 11,Build Changes<2>,Removed<4>,What’s New In Python 3 11
@anchor{whatsnew/3 11 porting-to-python-3-11}@anchor{944}@anchor{whatsnew/3 11 whatsnew311-python-api-porting}@anchor{945}
@subsection Porting to Python 3.11


This section lists previously described changes and other bugfixes
in the Python API that may require changes to your Python code.

Porting notes for the C API are
@ref{946,,listed separately}.


@itemize *

@item 
@ref{316,,open()}, @ref{73f,,io.open()}, @ref{315,,codecs.open()} and
@ref{93f,,fileinput.FileInput} no longer accept @code{'U'} (“universal newline”)
in the file mode. In Python 3, “universal newline” mode is used by default
whenever a file is opened in text mode,
and the @code{'U'} flag has been deprecated since Python 3.3.
The @ref{947,,newline parameter}
to these functions controls how universal newlines work.
(Contributed by Victor Stinner in bpo-37330@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37330}.)

@item 
@ref{4c5,,ast.AST} node positions are now validated when provided to
@ref{4b2,,compile()} and other related functions. If invalid positions are detected,
a @ref{2ec,,ValueError} will be raised. (Contributed by Pablo Galindo in gh-93351@footnote{https://github.com/python/cpython/issues/93351})

@item 
Prohibited passing non-@ref{948,,concurrent.futures.ThreadPoolExecutor}
executors to @ref{949,,asyncio.loop.set_default_executor()}
following a deprecation in Python 3.8.
(Contributed by Illia Volochii in bpo-43234@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43234}.)

@item 
@ref{15,,calendar}: The @ref{94a,,calendar.LocaleTextCalendar} and
@ref{94b,,calendar.LocaleHTMLCalendar} classes now use
@ref{327,,locale.getlocale()}, instead of using @ref{326,,locale.getdefaultlocale()},
if no locale is specified.
(Contributed by Victor Stinner in bpo-46659@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46659}.)

@item 
The @ref{aa,,pdb} module now reads the @code{.pdbrc} configuration file with
the @code{'UTF-8'} encoding.
(Contributed by Srinivas Reddy Thatiparthy (శ్రీనివాస్  రెడ్డి తాటిపర్తి) in bpo-41137@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41137}.)

@item 
The `population' parameter of @ref{94c,,random.sample()} must be a sequence,
and automatic conversion of @ref{184,,set}s to @ref{24d,,list}s
is no longer supported. Also, if the sample size
is larger than the population size, a @ref{2ec,,ValueError} is raised.
(Contributed by Raymond Hettinger in bpo-40465@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40465}.)

@item 
The `random' optional parameter of @ref{94d,,random.shuffle()} was removed.
It was previously an arbitrary random function to use for the shuffle;
now, @ref{94e,,random.random()} (its previous default) will always be used.

@item 
In @ref{be,,re} @ref{92d,,정규식 문법}, global inline flags (e.g. @code{(?i)})
can now only be used at the start of regular expressions.
Using them elsewhere has been deprecated since Python 3.6.
(Contributed by Serhiy Storchaka in bpo-47066@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47066}.)

@item 
In the @ref{be,,re} module, several long-standing bugs where fixed that,
in rare cases, could cause capture groups to get the wrong result.
Therefore, this could change the captured output in these cases.
(Contributed by Ma Lin in bpo-35859@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35859}.)
@end itemize

@node Build Changes<2>,C API Changes<2>,Porting to Python 3 11,What’s New In Python 3 11
@anchor{whatsnew/3 11 build-changes}@anchor{94f}@anchor{whatsnew/3 11 whatsnew311-build-changes}@anchor{950}
@subsection Build Changes



@itemize *

@item 
CPython now has 
@geindex Python 향상 제안; PEP 11
PEP 11@footnote{https://peps.python.org/pep-0011/} 
@geindex Python 향상 제안; PEP 11#tier-3
Tier 3 support@footnote{https://peps.python.org/pep-0011/#tier-3} for
cross compiling to the WebAssembly@footnote{https://webassembly.org/} platforms
Emscripten@footnote{https://emscripten.org/}
(@code{wasm32-unknown-emscripten}, i.e. Python in the browser)
and WebAssembly System Interface (WASI)@footnote{https://wasi.dev/}
(@code{wasm32-unknown-wasi}).
The effort is inspired by previous work like Pyodide@footnote{https://pyodide.org/}.
These platforms provide a limited subset of POSIX APIs; Python standard
libraries features and modules related to networking, processes, threading,
signals, mmap, and users/groups are not available or don’t work.
(Emscripten contributed by Christian Heimes and Ethan Smith in gh-84461@footnote{https://github.com/python/cpython/issues/84461}
and WASI contributed by Christian Heimes in gh-90473@footnote{https://github.com/python/cpython/issues/90473};
platforms promoted in gh-95085@footnote{https://github.com/python/cpython/issues/95085})

@item 
Building CPython now requires:


@itemize *

@item 
A C11@footnote{https://en.cppreference.com/w/c/11} compiler and standard library.
Optional C11 features@footnote{https://en.wikipedia.org/wiki/C11_(C_standard_revision)#Optional_features}
are not required.
(Contributed by Victor Stinner in bpo-46656@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46656},
bpo-45440@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45440} and bpo-46640@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46640}.)

@item 
Support for IEEE 754@footnote{https://en.wikipedia.org/wiki/IEEE_754}
floating-point numbers.
(Contributed by Victor Stinner in bpo-46917@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46917}.)
@end itemize

@item 
The @code{Py_NO_NAN} macro has been removed.
Since CPython now requires IEEE 754 floats, NaN values are always available.
(Contributed by Victor Stinner in bpo-46656@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46656}.)

@item 
The @ref{f6,,tkinter} package now requires Tcl/Tk@footnote{https://www.tcl.tk}
version 8.5.12 or newer.
(Contributed by Serhiy Storchaka in bpo-46996@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46996}.)

@item 
Build dependencies, compiler flags, and linker flags for most stdlib
extension modules are now detected by @code{configure}. libffi, libnsl,
libsqlite3, zlib, bzip2, liblzma, libcrypt, Tcl/Tk, and uuid flags
are detected by pkg-config@footnote{https://www.freedesktop.org/wiki/Software/pkg-config/} (when available).
@ref{f6,,tkinter} now requires a pkg-config command
to detect development settings for Tcl/Tk@footnote{https://www.tcl.tk} headers and libraries.
(Contributed by Christian Heimes and Erlend Egeberg Aasland in
bpo-45847@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45847}, bpo-45747@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45747}, and bpo-45763@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45763}.)

@item 
libpython is no longer linked against libcrypt.
(Contributed by Mike Gilbert in bpo-45433@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45433}.)

@item 
CPython can now be built with the
ThinLTO@footnote{https://clang.llvm.org/docs/ThinLTO.html} option
via passing @code{thin} to @ref{951,,--with-lto}, i.e. @code{--with-lto=thin}.
(Contributed by Donghee Na and Brett Holman in bpo-44340@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44340}.)

@item 
Freelists for object structs can now be disabled. A new @code{configure}
option @code{--without-freelists} can be used to disable all freelists
except empty tuple singleton.
(Contributed by Christian Heimes in bpo-45522@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45522}.)

@item 
@code{Modules/Setup} and @code{Modules/makesetup} have been improved and tied up.
Extension modules can now be built through @code{makesetup}. All except some
test modules can be linked statically into a main binary or library.
(Contributed by Brett Cannon and Christian Heimes in bpo-45548@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45548},
bpo-45570@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45570}, bpo-45571@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45571}, and bpo-43974@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43974}.)

@cartouche
@quotation 참고 
Use the environment variables @code{TCLTK_CFLAGS} and
@code{TCLTK_LIBS} to manually specify the location of Tcl/Tk headers
and libraries. The @code{configure} options
@code{--with-tcltk-includes} and @code{--with-tcltk-libs}
have been removed.

On RHEL 7 and CentOS 7 the development packages do not provide @code{tcl.pc}
and @code{tk.pc}; use @code{TCLTK_LIBS="-ltk8.5 -ltkstub8.5 -ltcl8.5"}.
The directory @code{Misc/rhel7} contains @code{.pc} files and instructions
on how to build Python with RHEL 7’s and CentOS 7’s Tcl/Tk and OpenSSL.
@end quotation
@end cartouche

@item 
CPython will now use 30-bit digits by default for the Python @ref{19b,,int}
implementation. Previously, the default was to use 30-bit digits on platforms
with @code{SIZEOF_VOID_P >= 8}, and 15-bit digits otherwise. It’s still possible
to explicitly request use of 15-bit digits via either the
@ref{952,,--enable-big-digits} option to the configure script
or (for Windows) the @code{PYLONG_BITS_IN_DIGIT} variable in @code{PC/pyconfig.h},
but this option may be removed at some point in the future.
(Contributed by Mark Dickinson in bpo-45569@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45569}.)
@end itemize

@node C API Changes<2>,Notable changes in 3 11 4,Build Changes<2>,What’s New In Python 3 11
@anchor{whatsnew/3 11 c-api-changes}@anchor{953}@anchor{whatsnew/3 11 whatsnew311-c-api}@anchor{954}
@subsection C API Changes


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

@end menu

@node New Features<4>,Porting to Python 3 11<2>,,C API Changes<2>
@anchor{whatsnew/3 11 id5}@anchor{955}@anchor{whatsnew/3 11 whatsnew311-c-api-new-features}@anchor{956}
@subsubsection New Features



@itemize *

@item 
Add a new @ref{957,,PyType_GetName()} function to get type’s short name.
(Contributed by Hai Shi in bpo-42035@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42035}.)

@item 
Add a new @ref{958,,PyType_GetQualName()} function to get type’s qualified name.
(Contributed by Hai Shi in bpo-42035@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42035}.)

@item 
Add new @ref{959,,PyThreadState_EnterTracing()} and
@ref{95a,,PyThreadState_LeaveTracing()} functions to the limited C API to
suspend and resume tracing and profiling.
(Contributed by Victor Stinner in bpo-43760@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43760}.)

@item 
Added the @ref{381,,Py_Version} constant which bears the same value as
@ref{382,,PY_VERSION_HEX}.
(Contributed by  Gabriele N. Tornetta in bpo-43931@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43931}.)

@item 
@ref{95b,,Py_buffer} and APIs are now part of the limited API and the stable
ABI:


@itemize *

@item 
@ref{637,,PyObject_CheckBuffer()}

@item 
@ref{638,,PyObject_GetBuffer()}

@item 
@ref{95c,,PyBuffer_GetPointer()}

@item 
@ref{95d,,PyBuffer_SizeFromFormat()}

@item 
@ref{95e,,PyBuffer_ToContiguous()}

@item 
@ref{95f,,PyBuffer_FromContiguous()}

@item 
@ref{960,,PyObject_CopyData()}

@item 
@ref{961,,PyBuffer_IsContiguous()}

@item 
@ref{962,,PyBuffer_FillContiguousStrides()}

@item 
@ref{963,,PyBuffer_FillInfo()}

@item 
@ref{639,,PyBuffer_Release()}

@item 
@ref{964,,PyMemoryView_FromBuffer()}

@item 
@ref{965,,bf_getbuffer} and
@ref{966,,bf_releasebuffer} type slots
@end itemize

(Contributed by Christian Heimes in bpo-45459@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45459}.)

@item 
Added the @ref{633,,PyType_GetModuleByDef()} function, used to get the module
in which a method was defined, in cases where this information is not
available directly (via @ref{967,,PyCMethod}).
(Contributed by Petr Viktorin in bpo-46613@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46613}.)

@item 
Add new functions to pack and unpack C double (serialize and deserialize):
@ref{968,,PyFloat_Pack2()}, @ref{969,,PyFloat_Pack4()}, @ref{96a,,PyFloat_Pack8()},
@ref{96b,,PyFloat_Unpack2()}, @ref{96c,,PyFloat_Unpack4()} and
@ref{96d,,PyFloat_Unpack8()}.
(Contributed by Victor Stinner in bpo-46906@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46906}.)

@item 
Add new functions to get frame object attributes:
@ref{96e,,PyFrame_GetBuiltins()}, @ref{96f,,PyFrame_GetGenerator()},
@ref{970,,PyFrame_GetGlobals()}, @ref{971,,PyFrame_GetLasti()}.

@item 
Added two new functions to get and set the active exception instance:
@ref{972,,PyErr_GetHandledException()} and @ref{973,,PyErr_SetHandledException()}.
These are alternatives to @ref{974,,PyErr_SetExcInfo()} and
@ref{975,,PyErr_GetExcInfo()} which work with the legacy 3-tuple
representation of exceptions.
(Contributed by Irit Katriel in bpo-46343@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46343}.)

@item 
Added the @ref{976,,PyConfig.safe_path} member.
(Contributed by Victor Stinner in gh-57684@footnote{https://github.com/python/cpython/issues/57684}.)
@end itemize

@node Porting to Python 3 11<2>,Deprecated<5>,New Features<4>,C API Changes<2>
@anchor{whatsnew/3 11 id6}@anchor{977}@anchor{whatsnew/3 11 whatsnew311-c-api-porting}@anchor{946}
@subsubsection Porting to Python 3.11

@anchor{whatsnew/3 11 whatsnew311-pep670}@anchor{7ca}

@itemize *

@item 
Some macros have been converted to static inline functions to avoid
macro pitfalls@footnote{https://gcc.gnu.org/onlinedocs/cpp/Macro-Pitfalls.html}.
The change should be mostly transparent to users,
as the replacement functions will cast their arguments to the expected types
to avoid compiler warnings due to static type checks.
However, when the limited C API is set to >=3.11,
these casts are not done,
and callers will need to cast arguments to their expected types.
See 
@geindex Python 향상 제안; PEP 670
PEP 670@footnote{https://peps.python.org/pep-0670/} for more details.
(Contributed by Victor Stinner and Erlend E. Aasland in gh-89653@footnote{https://github.com/python/cpython/issues/89653}.)

@item 
@ref{974,,PyErr_SetExcInfo()} no longer uses the @code{type} and @code{traceback}
arguments, the interpreter now derives those values from the exception
instance (the @code{value} argument). The function still steals references
of all three arguments.
(Contributed by Irit Katriel in bpo-45711@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45711}.)

@item 
@ref{975,,PyErr_GetExcInfo()} now derives the @code{type} and @code{traceback}
fields of the result from the exception instance (the @code{value} field).
(Contributed by Irit Katriel in bpo-45711@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45711}.)

@item 
@ref{978,,_frozen} has a new @code{is_package} field to indicate whether
or not the frozen module is a package.  Previously, a negative value
in the @code{size} field was the indicator.  Now only non-negative values
be used for @code{size}.
(Contributed by Kumar Aditya in bpo-46608@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46608}.)

@item 
@ref{979,,_PyFrameEvalFunction()} now takes @code{_PyInterpreterFrame*}
as its second parameter, instead of @code{PyFrameObject*}.
See 
@geindex Python 향상 제안; PEP 523
PEP 523@footnote{https://peps.python.org/pep-0523/} for more details of how to use this function pointer type.

@item 
@code{PyCode_New()} and @code{PyCode_NewWithPosOnlyArgs()} now take
an additional @code{exception_table} argument.
Using these functions should be avoided, if at all possible.
To get a custom code object: create a code object using the compiler,
then get a modified version with the @code{replace} method.

@item 
@ref{97a,,PyCodeObject} no longer has the @code{co_code}, @code{co_varnames},
@code{co_cellvars} and @code{co_freevars} fields.  Instead, use
@ref{97b,,PyCode_GetCode()}, @ref{97c,,PyCode_GetVarnames()},
@ref{97d,,PyCode_GetCellvars()} and @ref{97e,,PyCode_GetFreevars()} respectively
to access them via the C API.
(Contributed by Brandt Bucher in bpo-46841@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46841} and Ken Jin in gh-92154@footnote{https://github.com/python/cpython/issues/92154}
and gh-94936@footnote{https://github.com/python/cpython/issues/94936}.)

@item 
The old trashcan macros (@code{Py_TRASHCAN_SAFE_BEGIN}/@code{Py_TRASHCAN_SAFE_END})
are now deprecated. They should be replaced by the new macros
@code{Py_TRASHCAN_BEGIN} and @code{Py_TRASHCAN_END}.

A tp_dealloc function that has the old macros, such as:

@example
static void
mytype_dealloc(mytype *p)
@{
    PyObject_GC_UnTrack(p);
    Py_TRASHCAN_SAFE_BEGIN(p);
    ...
    Py_TRASHCAN_SAFE_END
@}
@end example

should migrate to the new macros as follows:

@example
static void
mytype_dealloc(mytype *p)
@{
    PyObject_GC_UnTrack(p);
    Py_TRASHCAN_BEGIN(p, mytype_dealloc)
    ...
    Py_TRASHCAN_END
@}
@end example

Note that @code{Py_TRASHCAN_BEGIN} has a second argument which
should be the deallocation function it is in.

To support older Python versions in the same codebase, you
can define the following macros and use them throughout
the code (credit: these were copied from the @code{mypy} codebase):

@example
#if PY_VERSION_HEX >= 0x03080000
#  define CPy_TRASHCAN_BEGIN(op, dealloc) Py_TRASHCAN_BEGIN(op, dealloc)
#  define CPy_TRASHCAN_END(op) Py_TRASHCAN_END
#else
#  define CPy_TRASHCAN_BEGIN(op, dealloc) Py_TRASHCAN_SAFE_BEGIN(op)
#  define CPy_TRASHCAN_END(op) Py_TRASHCAN_SAFE_END(op)
#endif
@end example

@item 
The @ref{97f,,PyType_Ready()} function now raises an error if a type is defined
with the @ref{980,,Py_TPFLAGS_HAVE_GC} flag set but has no traverse function
(@ref{981,,PyTypeObject.tp_traverse}).
(Contributed by Victor Stinner in bpo-44263@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44263}.)

@item 
Heap types with the @ref{3cf,,Py_TPFLAGS_IMMUTABLETYPE} flag can now inherit
the 
@geindex Python 향상 제안; PEP 590
PEP 590@footnote{https://peps.python.org/pep-0590/} vectorcall protocol.  Previously, this was only possible for
@ref{982,,static types}.
(Contributed by Erlend E. Aasland in bpo-43908@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43908})

@item 
Since @ref{3c9,,Py_TYPE()} is changed to a inline static function,
@code{Py_TYPE(obj) = new_type} must be replaced with
@code{Py_SET_TYPE(obj, new_type)}: see the @ref{983,,Py_SET_TYPE()} function
(available since Python 3.9). For backward compatibility, this macro can be
used:

@example
#if PY_VERSION_HEX < 0x030900A4 && !defined(Py_SET_TYPE)
static inline void _Py_SET_TYPE(PyObject *ob, PyTypeObject *type)
@{ ob->ob_type = type; @}
#define Py_SET_TYPE(ob, type) _Py_SET_TYPE((PyObject*)(ob), type)
#endif
@end example

(Contributed by Victor Stinner in bpo-39573@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39573}.)

@item 
Since @ref{984,,Py_SIZE()} is changed to a inline static function,
@code{Py_SIZE(obj) = new_size} must be replaced with
@code{Py_SET_SIZE(obj, new_size)}: see the @ref{985,,Py_SET_SIZE()} function
(available since Python 3.9). For backward compatibility, this macro can be
used:

@example
#if PY_VERSION_HEX < 0x030900A4 && !defined(Py_SET_SIZE)
static inline void _Py_SET_SIZE(PyVarObject *ob, Py_ssize_t size)
@{ ob->ob_size = size; @}
#define Py_SET_SIZE(ob, size) _Py_SET_SIZE((PyVarObject*)(ob), size)
#endif
@end example

(Contributed by Victor Stinner in bpo-39573@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39573}.)

@item 
@code{<Python.h>} no longer includes the header files @code{<stdlib.h>},
@code{<stdio.h>}, @code{<errno.h>} and @code{<string.h>} when the @code{Py_LIMITED_API}
macro is set to @code{0x030b0000} (Python 3.11) or higher. C extensions should
explicitly include the header files after @code{#include <Python.h>}.
(Contributed by Victor Stinner in bpo-45434@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45434}.)

@item 
The non-limited API files @code{cellobject.h}, @code{classobject.h}, @code{code.h}, @code{context.h},
@code{funcobject.h}, @code{genobject.h} and @code{longintrepr.h} have been moved to
the @code{Include/cpython} directory. Moreover, the @code{eval.h} header file was
removed. These files must not be included directly, as they are already
included in @code{Python.h}: @ref{986,,Include Files}. If they have
been included directly, consider including @code{Python.h} instead.
(Contributed by Victor Stinner in bpo-35134@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35134}.)

@item 
The @code{PyUnicode_CHECK_INTERNED()} macro has been excluded from the
limited C API. It was never usable there, because it used internal structures
which are not available in the limited C API.
(Contributed by Victor Stinner in bpo-46007@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46007}.)

@item 
The following frame functions and type are now directly available with
@code{#include <Python.h>}, it’s no longer needed to add
@code{#include <frameobject.h>}:


@itemize *

@item 
@ref{987,,PyFrame_Check()}

@item 
@ref{988,,PyFrame_GetBack()}

@item 
@ref{96e,,PyFrame_GetBuiltins()}

@item 
@ref{96f,,PyFrame_GetGenerator()}

@item 
@ref{970,,PyFrame_GetGlobals()}

@item 
@ref{971,,PyFrame_GetLasti()}

@item 
@ref{65f,,PyFrame_GetLocals()}

@item 
@ref{989,,PyFrame_Type}
@end itemize

(Contributed by Victor Stinner in gh-93937@footnote{https://github.com/python/cpython/issues/93937}.)
@end itemize
@anchor{whatsnew/3 11 pyframeobject-3-11-hiding}@anchor{98a}

@itemize *

@item 
The @ref{98b,,PyFrameObject} structure members have been removed from the
public C API.

While the documentation notes that the @ref{98b,,PyFrameObject} fields are
subject to change at any time, they have been stable for a long time and were
used in several popular extensions.

In Python 3.11, the frame struct was reorganized to allow performance
optimizations. Some fields were removed entirely, as they were details of the
old implementation.

@ref{98b,,PyFrameObject} fields:


@itemize *

@item 
@code{f_back}: use @ref{988,,PyFrame_GetBack()}.

@item 
@code{f_blockstack}: removed.

@item 
@code{f_builtins}: use @ref{96e,,PyFrame_GetBuiltins()}.

@item 
@code{f_code}: use @ref{98c,,PyFrame_GetCode()}.

@item 
@code{f_gen}: use @ref{96f,,PyFrame_GetGenerator()}.

@item 
@code{f_globals}: use @ref{970,,PyFrame_GetGlobals()}.

@item 
@code{f_iblock}: removed.

@item 
@code{f_lasti}: use @ref{971,,PyFrame_GetLasti()}.
Code using @code{f_lasti} with @code{PyCode_Addr2Line()} should use
@ref{98d,,PyFrame_GetLineNumber()} instead; it may be faster.

@item 
@code{f_lineno}: use @ref{98d,,PyFrame_GetLineNumber()}

@item 
@code{f_locals}: use @ref{65f,,PyFrame_GetLocals()}.

@item 
@code{f_stackdepth}: removed.

@item 
@code{f_state}: no public API (renamed to @code{f_frame.f_state}).

@item 
@code{f_trace}: no public API.

@item 
@code{f_trace_lines}: use @code{PyObject_GetAttrString((PyObject*)frame, "f_trace_lines")}.

@item 
@code{f_trace_opcodes}: use @code{PyObject_GetAttrString((PyObject*)frame, "f_trace_opcodes")}.

@item 
@code{f_localsplus}: no public API (renamed to @code{f_frame.localsplus}).

@item 
@code{f_valuestack}: removed.
@end itemize

The Python frame object is now created lazily. A side effect is that the
@ref{98e,,f_back} member must not be accessed directly,
since its value is now also
computed lazily. The @ref{988,,PyFrame_GetBack()} function must be called
instead.

Debuggers that accessed the @ref{4a6,,f_locals} directly `must' call
@ref{65f,,PyFrame_GetLocals()} instead. They no longer need to call
@code{PyFrame_FastToLocalsWithError()} or @code{PyFrame_LocalsToFast()},
in fact they should not call those functions. The necessary updating of the
frame is now managed by the virtual machine.

Code defining @code{PyFrame_GetCode()} on Python 3.8 and older:

@example
#if PY_VERSION_HEX < 0x030900B1
static inline PyCodeObject* PyFrame_GetCode(PyFrameObject *frame)
@{
    Py_INCREF(frame->f_code);
    return frame->f_code;
@}
#endif
@end example

Code defining @code{PyFrame_GetBack()} on Python 3.8 and older:

@example
#if PY_VERSION_HEX < 0x030900B1
static inline PyFrameObject* PyFrame_GetBack(PyFrameObject *frame)
@{
    Py_XINCREF(frame->f_back);
    return frame->f_back;
@}
#endif
@end example

Or use the pythoncapi_compat project@footnote{https://github.com/python/pythoncapi-compat} to get these two
functions on older Python versions.

@item 
Changes of the @ref{98f,,PyThreadState} structure members:


@itemize *

@item 
@code{frame}: removed, use @ref{990,,PyThreadState_GetFrame()} (function added
to Python 3.9 by bpo-40429@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40429}).
Warning: the function returns a @ref{5df,,strong reference}, need to call
@ref{991,,Py_XDECREF()}.

@item 
@code{tracing}: changed, use @ref{959,,PyThreadState_EnterTracing()}
and @ref{95a,,PyThreadState_LeaveTracing()}
(functions added to Python 3.11 by bpo-43760@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43760}).

@item 
@code{recursion_depth}: removed,
use @code{(tstate->recursion_limit - tstate->recursion_remaining)} instead.

@item 
@code{stackcheck_counter}: removed.
@end itemize

Code defining @code{PyThreadState_GetFrame()} on Python 3.8 and older:

@example
#if PY_VERSION_HEX < 0x030900B1
static inline PyFrameObject* PyThreadState_GetFrame(PyThreadState *tstate)
@{
    Py_XINCREF(tstate->frame);
    return tstate->frame;
@}
#endif
@end example

Code defining @code{PyThreadState_EnterTracing()} and
@code{PyThreadState_LeaveTracing()} on Python 3.10 and older:

@example
#if PY_VERSION_HEX < 0x030B00A2
static inline void PyThreadState_EnterTracing(PyThreadState *tstate)
@{
    tstate->tracing++;
#if PY_VERSION_HEX >= 0x030A00A1
    tstate->cframe->use_tracing = 0;
#else
    tstate->use_tracing = 0;
#endif
@}

static inline void PyThreadState_LeaveTracing(PyThreadState *tstate)
@{
    int use_tracing = (tstate->c_tracefunc != NULL || tstate->c_profilefunc != NULL);
    tstate->tracing--;
#if PY_VERSION_HEX >= 0x030A00A1
    tstate->cframe->use_tracing = use_tracing;
#else
    tstate->use_tracing = use_tracing;
#endif
@}
#endif
@end example

Or use the pythoncapi-compat project@footnote{https://github.com/python/pythoncapi-compat} to get these functions
on old Python functions.

@item 
Distributors are encouraged to build Python with the optimized Blake2
library libb2@footnote{https://www.blake2.net/}.

@item 
The @ref{804,,PyConfig.module_search_paths_set} field must now be set to 1 for
initialization to use @ref{641,,PyConfig.module_search_paths} to initialize
@ref{3e4,,sys.path}. Otherwise, initialization will recalculate the path and replace
any values added to @code{module_search_paths}.

@item 
@ref{992,,PyConfig_Read()} no longer calculates the initial search path, and will not
fill any values into @ref{641,,PyConfig.module_search_paths}. To calculate default
paths and then modify them, finish initialization and use @ref{628,,PySys_GetObject()}
to retrieve @ref{3e4,,sys.path} as a Python list object and modify it directly.
@end itemize

@node Deprecated<5>,Pending Removal in Python 3 12<2>,Porting to Python 3 11<2>,C API Changes<2>
@anchor{whatsnew/3 11 id7}@anchor{993}@anchor{whatsnew/3 11 whatsnew311-c-api-deprecated}@anchor{923}
@subsubsection Deprecated



@itemize *

@item 
Deprecate the following functions to configure the Python initialization:


@itemize *

@item 
@code{PySys_AddWarnOptionUnicode()}

@item 
@code{PySys_AddWarnOption()}

@item 
@code{PySys_AddXOption()}

@item 
@code{PySys_HasWarnOptions()}

@item 
@code{PySys_SetArgvEx()}

@item 
@code{PySys_SetArgv()}

@item 
@code{PySys_SetPath()}

@item 
@code{Py_SetPath()}

@item 
@code{Py_SetProgramName()}

@item 
@code{Py_SetPythonHome()}

@item 
@code{Py_SetStandardStreamEncoding()}

@item 
@code{_Py_SetProgramFullPath()}
@end itemize

Use the new @ref{3f7,,PyConfig} API of the @ref{644,,Python Initialization Configuration} instead (
@geindex Python 향상 제안; PEP 587
PEP 587@footnote{https://peps.python.org/pep-0587/}).
(Contributed by Victor Stinner in gh-88279@footnote{https://github.com/python/cpython/issues/88279}.)

@item 
Deprecate the @code{ob_shash} member of the @ref{994,,PyBytesObject}. Use @ref{436,,PyObject_Hash()} instead.
(Contributed by Inada Naoki in bpo-46864@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46864}.)
@end itemize

@node Pending Removal in Python 3 12<2>,Removed<5>,Deprecated<5>,C API Changes<2>
@anchor{whatsnew/3 11 id8}@anchor{995}@anchor{whatsnew/3 11 whatsnew311-c-api-pending-removal}@anchor{932}
@subsubsection Pending Removal in Python 3.12


The following C APIs have been deprecated in earlier Python releases,
and will be removed in Python 3.12.


@itemize *

@item 
@code{PyUnicode_AS_DATA()}

@item 
@code{PyUnicode_AS_UNICODE()}

@item 
@code{PyUnicode_AsUnicodeAndSize()}

@item 
@code{PyUnicode_AsUnicode()}

@item 
@code{PyUnicode_FromUnicode()}

@item 
@code{PyUnicode_GET_DATA_SIZE()}

@item 
@code{PyUnicode_GET_SIZE()}

@item 
@code{PyUnicode_GetSize()}

@item 
@code{PyUnicode_IS_COMPACT()}

@item 
@code{PyUnicode_IS_READY()}

@item 
@ref{434,,PyUnicode_READY()}

@item 
@code{PyUnicode_WSTR_LENGTH()}

@item 
@code{_PyUnicode_AsUnicode()}

@item 
@code{PyUnicode_WCHAR_KIND}

@item 
@ref{996,,PyUnicodeObject}

@item 
@code{PyUnicode_InternImmortal()}
@end itemize

@node Removed<5>,,Pending Removal in Python 3 12<2>,C API Changes<2>
@anchor{whatsnew/3 11 id9}@anchor{997}@anchor{whatsnew/3 11 whatsnew311-c-api-removed}@anchor{938}
@subsubsection Removed



@itemize *

@item 
@code{PyFrame_BlockSetup()} and @code{PyFrame_BlockPop()} have been
removed.
(Contributed by Mark Shannon in bpo-40222@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40222}.)

@item 
Remove the following math macros using the @code{errno} variable:


@itemize *

@item 
@code{Py_ADJUST_ERANGE1()}

@item 
@code{Py_ADJUST_ERANGE2()}

@item 
@code{Py_OVERFLOWED()}

@item 
@code{Py_SET_ERANGE_IF_OVERFLOW()}

@item 
@code{Py_SET_ERRNO_ON_MATH_ERROR()}
@end itemize

(Contributed by Victor Stinner in bpo-45412@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45412}.)

@item 
Remove @code{Py_UNICODE_COPY()} and @code{Py_UNICODE_FILL()} macros, deprecated
since Python 3.3. Use @code{PyUnicode_CopyCharacters()} or @code{memcpy()}
(@code{wchar_t*} string), and @code{PyUnicode_Fill()} functions instead.
(Contributed by Victor Stinner in bpo-41123@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41123}.)

@item 
Remove the @code{pystrhex.h} header file. It only contains private functions.
C extensions should only include the main @code{<Python.h>} header file.
(Contributed by Victor Stinner in bpo-45434@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45434}.)

@item 
Remove the @code{Py_FORCE_DOUBLE()} macro. It was used by the
@code{Py_IS_INFINITY()} macro.
(Contributed by Victor Stinner in bpo-45440@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45440}.)

@item 
The following items are no longer available when @ref{65e,,Py_LIMITED_API}
is defined:


@itemize *

@item 
@ref{998,,PyMarshal_WriteLongToFile()}

@item 
@ref{999,,PyMarshal_WriteObjectToFile()}

@item 
@ref{99a,,PyMarshal_ReadObjectFromString()}

@item 
@ref{99b,,PyMarshal_WriteObjectToString()}

@item 
the @code{Py_MARSHAL_VERSION} macro
@end itemize

These are not part of the @ref{99c,,limited API}.

(Contributed by Victor Stinner in bpo-45474@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45474}.)

@item 
Exclude @ref{3de,,PyWeakref_GET_OBJECT()} from the limited C API. It never
worked since the @code{PyWeakReference} structure is opaque in the
limited C API.
(Contributed by Victor Stinner in bpo-35134@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35134}.)

@item 
Remove the @code{PyHeapType_GET_MEMBERS()} macro. It was exposed in the
public C API by mistake, it must only be used by Python internally.
Use the @code{PyTypeObject.tp_members} member instead.
(Contributed by Victor Stinner in bpo-40170@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40170}.)

@item 
Remove the @code{HAVE_PY_SET_53BIT_PRECISION} macro (moved to the internal C
API).
(Contributed by Victor Stinner in bpo-45412@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45412}.)
@end itemize
@anchor{whatsnew/3 11 whatsnew311-pep624}@anchor{7c9}

@itemize *

@item 
Remove the @ref{3e0,,Py_UNICODE} encoder APIs,
as they have been deprecated since Python 3.3,
are little used
and are inefficient relative to the recommended alternatives.

The removed functions are:


@itemize *

@item 
@code{PyUnicode_Encode()}

@item 
@code{PyUnicode_EncodeASCII()}

@item 
@code{PyUnicode_EncodeLatin1()}

@item 
@code{PyUnicode_EncodeUTF7()}

@item 
@code{PyUnicode_EncodeUTF8()}

@item 
@code{PyUnicode_EncodeUTF16()}

@item 
@code{PyUnicode_EncodeUTF32()}

@item 
@code{PyUnicode_EncodeUnicodeEscape()}

@item 
@code{PyUnicode_EncodeRawUnicodeEscape()}

@item 
@code{PyUnicode_EncodeCharmap()}

@item 
@code{PyUnicode_TranslateCharmap()}

@item 
@code{PyUnicode_EncodeDecimal()}

@item 
@code{PyUnicode_TransformDecimalToASCII()}
@end itemize

See 
@geindex Python 향상 제안; PEP 624
PEP 624@footnote{https://peps.python.org/pep-0624/} for details and
@geindex Python 향상 제안; PEP 624#alternative-apis
migration guidance@footnote{https://peps.python.org/pep-0624/#alternative-apis}.
(Contributed by Inada Naoki in bpo-44029@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44029}.)
@end itemize

@node Notable changes in 3 11 4,Notable changes in 3 11 5,C API Changes<2>,What’s New In Python 3 11
@anchor{whatsnew/3 11 notable-changes-in-3-11-4}@anchor{99d}
@subsection Notable changes in 3.11.4


@menu
* tarfile: tarfile<2>. 

@end menu

@node tarfile<2>,,,Notable changes in 3 11 4
@anchor{whatsnew/3 11 tarfile}@anchor{99e}
@subsubsection tarfile



@itemize *

@item 
The extraction methods in @ref{e4,,tarfile}, and @ref{695,,shutil.unpack_archive()},
have a new a `filter' argument that allows limiting tar features than may be
surprising or dangerous, such as creating files outside the destination
directory.
See @ref{696,,Extraction filters} for details.
In Python 3.12, use without the `filter' argument will show a
@ref{1a3,,DeprecationWarning}.
In Python 3.14, the default will switch to @code{'data'}.
(Contributed by Petr Viktorin in 
@geindex Python 향상 제안; PEP 706
PEP 706@footnote{https://peps.python.org/pep-0706/}.)
@end itemize

@node Notable changes in 3 11 5,,Notable changes in 3 11 4,What’s New In Python 3 11
@anchor{whatsnew/3 11 notable-changes-in-3-11-5}@anchor{99f}
@subsection Notable changes in 3.11.5


@menu
* OpenSSL:: 

@end menu

@node OpenSSL,,,Notable changes in 3 11 5
@anchor{whatsnew/3 11 openssl}@anchor{9a0}
@subsubsection OpenSSL



@itemize *

@item 
Windows builds and macOS installers from python.org now use OpenSSL 3.0.
@end itemize

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node What’s New In Python 3 10,파이썬 3 9의 새로운 기능,What’s New In Python 3 11,파이썬의 새로운 기능
@anchor{whatsnew/3 10 doc}@anchor{9a1}@anchor{whatsnew/3 10 translation-repo}@anchor{9a2}@anchor{whatsnew/3 10 what-s-new-in-python-3-10}@anchor{9a3}
@section What’s New In Python 3.10


@*Editor: 
Pablo Galindo Salgado


@c Rules for maintenance:
@c 
@c * Anyone can add text to this document.  Do not spend very much time
@c on the wording of your changes, because your text will probably
@c get rewritten to some degree.
@c 
@c * The maintainer will go through Misc/NEWS periodically and add
@c changes; it's therefore more important to add your changes to
@c Misc/NEWS than to this file.
@c 
@c * This is not a complete list of every single change; completeness
@c is the purpose of Misc/NEWS.  Some changes I consider too small
@c or esoteric to include.  If such a change is added to the text,
@c I'll just remove it.  (This is another reason you shouldn't spend
@c too much time on writing your addition.)
@c 
@c * If you want to draw your new text to the attention of the
@c maintainer, add 'XXX' to the beginning of the paragraph or
@c section.
@c 
@c * It's OK to just add a fragmentary note about a change.  For
@c example: "XXX Describe the transmogrify() function added to the
@c socket module."  The maintainer will research the change and
@c write the necessary text.
@c 
@c * You can comment out your additions if you like, but it's not
@c necessary (especially when a final release is some months away).
@c 
@c * Credit the author of a patch or bugfix.   Just the name is
@c sufficient; the e-mail address isn't necessary.
@c 
@c * It's helpful to add the bug/patch number as a comment:
@c 
@c XXX Describe the transmogrify() function added to the socket
@c module.
@c (Contributed by P.Y. Developer in :issue:`12345`.)
@c 
@c This saves the maintainer the effort of going through the git log
@c when researching a change.

This article explains the new features in Python 3.10, compared to 3.9.
Python 3.10 was released on October 4, 2021.
For full details, see the @ref{142,,changelog}.

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

@end menu

@node Summary – Release highlights<4>,New Features<5>,,What’s New In Python 3 10
@anchor{whatsnew/3 10 summary-release-highlights}@anchor{9a4}
@subsection Summary – Release highlights


@c This section singles out the most important changes in Python 3.10.
@c Brevity is key.

@c PEP-sized items next.

New syntax features:


@itemize *

@item 
@geindex Python 향상 제안; PEP 634
PEP 634@footnote{https://peps.python.org/pep-0634/}, Structural Pattern Matching: Specification

@item 
@geindex Python 향상 제안; PEP 635
PEP 635@footnote{https://peps.python.org/pep-0635/}, Structural Pattern Matching: Motivation and Rationale

@item 
@geindex Python 향상 제안; PEP 636
PEP 636@footnote{https://peps.python.org/pep-0636/}, Structural Pattern Matching: Tutorial

@item 
bpo-12782@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12782}, Parenthesized context managers are now officially allowed.
@end itemize

New features in the standard library:


@itemize *

@item 
@geindex Python 향상 제안; PEP 618
PEP 618@footnote{https://peps.python.org/pep-0618/}, Add Optional Length-Checking To zip.
@end itemize

Interpreter improvements:


@itemize *

@item 
@geindex Python 향상 제안; PEP 626
PEP 626@footnote{https://peps.python.org/pep-0626/}, Precise line numbers for debugging and other tools.
@end itemize

New typing features:


@itemize *

@item 
@geindex Python 향상 제안; PEP 604
PEP 604@footnote{https://peps.python.org/pep-0604/}, Allow writing union types as X | Y

@item 
@geindex Python 향상 제안; PEP 612
PEP 612@footnote{https://peps.python.org/pep-0612/}, Parameter Specification Variables

@item 
@geindex Python 향상 제안; PEP 613
PEP 613@footnote{https://peps.python.org/pep-0613/}, Explicit Type Aliases

@item 
@geindex Python 향상 제안; PEP 647
PEP 647@footnote{https://peps.python.org/pep-0647/}, User-Defined Type Guards
@end itemize

Important deprecations, removals or restrictions:


@itemize *

@item 
@geindex Python 향상 제안; PEP 644
PEP 644@footnote{https://peps.python.org/pep-0644/}, Require OpenSSL 1.1.1 or newer

@item 
@geindex Python 향상 제안; PEP 632
PEP 632@footnote{https://peps.python.org/pep-0632/}, Deprecate distutils module.

@item 
@geindex Python 향상 제안; PEP 623
PEP 623@footnote{https://peps.python.org/pep-0623/}, Deprecate and prepare for the removal of the wstr member in PyUnicodeObject.

@item 
@geindex Python 향상 제안; PEP 624
PEP 624@footnote{https://peps.python.org/pep-0624/}, Remove Py_UNICODE encoder APIs

@item 
@geindex Python 향상 제안; PEP 597
PEP 597@footnote{https://peps.python.org/pep-0597/}, Add optional EncodingWarning
@end itemize

@node New Features<5>,New Features Related to Type Hints<3>,Summary – Release highlights<4>,What’s New In Python 3 10
@anchor{whatsnew/3 10 new-features}@anchor{9a5}
@subsection New Features


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

@end menu

@node Parenthesized context managers,Better error messages,,New Features<5>
@anchor{whatsnew/3 10 parenthesized-context-managers}@anchor{9a6}@anchor{whatsnew/3 10 whatsnew310-pep563}@anchor{9a7}
@subsubsection Parenthesized context managers


Using enclosing parentheses for continuation across multiple lines
in context managers is now supported. This allows formatting a long
collection of context managers in multiple lines in a similar way
as it was previously possible with import statements. For instance,
all these examples are now valid:

@example
with (CtxManager() as example):
    ...

with (
    CtxManager1(),
    CtxManager2()
):
    ...

with (CtxManager1() as example,
      CtxManager2()):
    ...

with (CtxManager1(),
      CtxManager2() as example):
    ...

with (
    CtxManager1() as example1,
    CtxManager2() as example2
):
    ...
@end example

it is also possible to use a trailing comma at the end of the
enclosed group:

@example
with (
    CtxManager1() as example1,
    CtxManager2() as example2,
    CtxManager3() as example3,
):
    ...
@end example

This new syntax uses the non LL(1) capacities of the new parser.
Check 
@geindex Python 향상 제안; PEP 617
PEP 617@footnote{https://peps.python.org/pep-0617/} for more details.

(Contributed by Guido van Rossum, Pablo Galindo and Lysandros Nikolaou
in bpo-12782@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12782} and bpo-40334@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40334}.)

@node Better error messages,PEP 626 Precise line numbers for debugging and other tools,Parenthesized context managers,New Features<5>
@anchor{whatsnew/3 10 better-error-messages}@anchor{9a8}
@subsubsection Better error messages


@menu
* SyntaxErrors:: 
* IndentationErrors:: 
* AttributeErrors:: 
* NameErrors:: 

@end menu

@node SyntaxErrors,IndentationErrors,,Better error messages
@anchor{whatsnew/3 10 syntaxerrors}@anchor{9a9}
@subsubsection SyntaxErrors


When parsing code that contains unclosed parentheses or brackets the interpreter
now includes the location of the unclosed bracket of parentheses instead of displaying
`SyntaxError: unexpected EOF while parsing' or pointing to some incorrect location.
For instance, consider the following code (notice the unclosed ‘@{‘):

@example
expected = @{9: 1, 18: 2, 19: 2, 27: 3, 28: 3, 29: 3, 36: 4, 37: 4,
            38: 4, 39: 4, 45: 5, 46: 5, 47: 5, 48: 5, 49: 5, 54: 6,
some_other_code = foo()
@end example

Previous versions of the interpreter reported confusing places as the location of
the syntax error:

@example
File "example.py", line 3
    some_other_code = foo()
                    ^
SyntaxError: invalid syntax
@end example

but in Python 3.10 a more informative error is emitted:

@example
File "example.py", line 1
    expected = @{9: 1, 18: 2, 19: 2, 27: 3, 28: 3, 29: 3, 36: 4, 37: 4,
               ^
SyntaxError: '@{' was never closed
@end example

In a similar way, errors involving unclosed string literals (single and triple
quoted) now point to the start of the string instead of reporting EOF/EOL.

These improvements are inspired by previous work in the PyPy interpreter.

(Contributed by Pablo Galindo in bpo-42864@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42864} and Batuhan Taskaya in
bpo-40176@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40176}.)

@ref{18e,,SyntaxError} exceptions raised by the interpreter will now highlight the
full error range of the expression that constitutes the syntax error itself,
instead of just where the problem is detected. In this way, instead of displaying
(before Python 3.10):

@example
>>> foo(x, z for z in range(10), t, w)
  File "<stdin>", line 1
    foo(x, z for z in range(10), t, w)
           ^
SyntaxError: Generator expression must be parenthesized
@end example

now Python 3.10 will display the exception as:

@example
>>> foo(x, z for z in range(10), t, w)
  File "<stdin>", line 1
    foo(x, z for z in range(10), t, w)
           ^^^^^^^^^^^^^^^^^^^^
SyntaxError: Generator expression must be parenthesized
@end example

This improvement was contributed by Pablo Galindo in bpo-43914@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43914}.

A considerable amount of new specialized messages for @ref{18e,,SyntaxError} exceptions
have been incorporated. Some of the most notable ones are as follows:


@itemize *

@item 
Missing @code{:} before blocks:

@example
>>> if rocket.position > event_horizon
  File "<stdin>", line 1
    if rocket.position > event_horizon
                                      ^
SyntaxError: expected ':'
@end example

(Contributed by Pablo Galindo in bpo-42997@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42997}.)

@item 
Unparenthesised tuples in comprehensions targets:

@example
>>> @{x,y for x,y in zip('abcd', '1234')@}
  File "<stdin>", line 1
    @{x,y for x,y in zip('abcd', '1234')@}
     ^
SyntaxError: did you forget parentheses around the comprehension target?
@end example

(Contributed by Pablo Galindo in bpo-43017@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43017}.)

@item 
Missing commas in collection literals and between expressions:

@example
>>> items = @{
... x: 1,
... y: 2
... z: 3,
  File "<stdin>", line 3
    y: 2
       ^
SyntaxError: invalid syntax. Perhaps you forgot a comma?
@end example

(Contributed by Pablo Galindo in bpo-43822@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43822}.)

@item 
Multiple Exception types without parentheses:

@example
>>> try:
...     build_dyson_sphere()
... except NotEnoughScienceError, NotEnoughResourcesError:
  File "<stdin>", line 3
    except NotEnoughScienceError, NotEnoughResourcesError:
           ^
SyntaxError: multiple exception types must be parenthesized
@end example

(Contributed by Pablo Galindo in bpo-43149@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43149}.)

@item 
Missing @code{:} and values in dictionary literals:

@example
>>> values = @{
... x: 1,
... y: 2,
... z:
... @}
  File "<stdin>", line 4
    z:
     ^
SyntaxError: expression expected after dictionary key and ':'

>>> values = @{x:1, y:2, z w:3@}
  File "<stdin>", line 1
    values = @{x:1, y:2, z w:3@}
                        ^
SyntaxError: ':' expected after dictionary key
@end example

(Contributed by Pablo Galindo in bpo-43823@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43823}.)

@item 
@code{try} blocks without @code{except} or @code{finally} blocks:

@example
>>> try:
...     x = 2
... something = 3
  File "<stdin>", line 3
    something  = 3
    ^^^^^^^^^
SyntaxError: expected 'except' or 'finally' block
@end example

(Contributed by Pablo Galindo in bpo-44305@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44305}.)

@item 
Usage of @code{=} instead of @code{==} in comparisons:

@example
>>> if rocket.position = event_horizon:
  File "<stdin>", line 1
    if rocket.position = event_horizon:
                       ^
SyntaxError: cannot assign to attribute here. Maybe you meant '==' instead of '='?
@end example

(Contributed by Pablo Galindo in bpo-43797@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43797}.)

@item 
Usage of @code{*} in f-strings:

@example
>>> f"Black holes @{*all_black_holes@} and revelations"
  File "<stdin>", line 1
    (*all_black_holes)
     ^
SyntaxError: f-string: cannot use starred expression here
@end example

(Contributed by Pablo Galindo in bpo-41064@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41064}.)
@end itemize

@node IndentationErrors,AttributeErrors,SyntaxErrors,Better error messages
@anchor{whatsnew/3 10 indentationerrors}@anchor{9aa}
@subsubsection IndentationErrors


Many @ref{9ab,,IndentationError} exceptions now have more context regarding what kind of block
was expecting an indentation, including the location of the statement:

@example
>>> def foo():
...    if lel:
...    x = 2
  File "<stdin>", line 3
    x = 2
    ^
IndentationError: expected an indented block after 'if' statement in line 2
@end example

@node AttributeErrors,NameErrors,IndentationErrors,Better error messages
@anchor{whatsnew/3 10 attributeerrors}@anchor{9ac}
@subsubsection AttributeErrors


When printing @ref{5ee,,AttributeError}, @code{PyErr_Display()} will offer
suggestions of similar attribute names in the object that the exception was
raised from:

@example
>>> collections.namedtoplo
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: module 'collections' has no attribute 'namedtoplo'. Did you mean: namedtuple?
@end example

(Contributed by Pablo Galindo in bpo-38530@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38530}.)

@cartouche
@quotation 경고 
Notice this won’t work if @code{PyErr_Display()} is not called to display the error
which can happen if some other custom error display function is used. This is a common
scenario in some REPLs like IPython.
@end quotation
@end cartouche

@node NameErrors,,AttributeErrors,Better error messages
@anchor{whatsnew/3 10 nameerrors}@anchor{9ad}
@subsubsection NameErrors


When printing @ref{452,,NameError} raised by the interpreter, @code{PyErr_Display()}
will offer suggestions of similar variable names in the function that the exception
was raised from:

@example
>>> schwarzschild_black_hole = None
>>> schwarschild_black_hole
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'schwarschild_black_hole' is not defined. Did you mean: schwarzschild_black_hole?
@end example

(Contributed by Pablo Galindo in bpo-38530@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38530}.)

@cartouche
@quotation 경고 
Notice this won’t work if @code{PyErr_Display()} is not called to display the error,
which can happen if some other custom error display function is used. This is a common
scenario in some REPLs like IPython.
@end quotation
@end cartouche

@node PEP 626 Precise line numbers for debugging and other tools,PEP 634 Structural Pattern Matching,Better error messages,New Features<5>
@anchor{whatsnew/3 10 pep-626-precise-line-numbers-for-debugging-and-other-tools}@anchor{9ae}
@subsubsection PEP 626: Precise line numbers for debugging and other tools


PEP 626 brings more precise and reliable line numbers for debugging, profiling and coverage tools.
Tracing events, with the correct line number, are generated for all lines of code executed and only for lines of code that are executed.

The @ref{9af,,f_lineno} attribute of frame objects will always contain the
expected line number.

The @ref{330,,co_lnotab} attribute of
@ref{4e6,,code objects} is deprecated and
will be removed in 3.12.
Code that needs to convert from offset to line number should use the new
@ref{350,,co_lines()} method instead.

@node PEP 634 Structural Pattern Matching,Optional EncodingWarning and encoding="locale" option,PEP 626 Precise line numbers for debugging and other tools,New Features<5>
@anchor{whatsnew/3 10 pep-634-structural-pattern-matching}@anchor{9b0}
@subsubsection PEP 634: Structural Pattern Matching


Structural pattern matching has been added in the form of a `match statement'
and `case statements' of patterns with associated actions. Patterns
consist of sequences, mappings, primitive data types as well as class instances.
Pattern matching enables programs to extract information from complex data types,
branch on the structure of data, and apply specific actions based on different
forms of data.

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

@end menu

@node Syntax and operations,Declarative approach,,PEP 634 Structural Pattern Matching
@anchor{whatsnew/3 10 syntax-and-operations}@anchor{9b1}
@subsubsection Syntax and operations


The generic syntax of pattern matching is:

@example
match subject:
    case <pattern_1>:
        <action_1>
    case <pattern_2>:
        <action_2>
    case <pattern_3>:
        <action_3>
    case _:
        <action_wildcard>
@end example

A match statement takes an expression and compares its value to successive
patterns given as one or more case blocks.  Specifically, pattern matching
operates by:


@enumerate 

@item 
using data with type and shape (the @code{subject})

@item 
evaluating the @code{subject} in the @code{match} statement

@item 
comparing the subject with each pattern in a @code{case} statement
from top to bottom until a match is confirmed.

@item 
executing the action associated with the pattern of the confirmed
match

@item 
If an exact match is not confirmed, the last case, a wildcard @code{_},
if provided, will be used as the matching case. If an exact match is
not confirmed and a wildcard case does not exist, the entire match
block is a no-op.
@end enumerate

@node Declarative approach,Simple pattern match to a literal,Syntax and operations,PEP 634 Structural Pattern Matching
@anchor{whatsnew/3 10 declarative-approach}@anchor{9b2}
@subsubsection Declarative approach


Readers may be aware of pattern matching through the simple example of matching
a subject (data object) to a literal (pattern) with the switch statement found
in C, Java or JavaScript (and many other languages). Often the switch statement
is used for comparison of an object/expression with case statements containing
literals.

More powerful examples of pattern matching can be found in languages such as
Scala and Elixir. With structural pattern matching, the approach is “declarative” and
explicitly states the conditions (the patterns) for data to match.

While an “imperative” series of instructions using nested “if” statements
could be used to accomplish something similar to structural pattern matching,
it is less clear than the “declarative” approach. Instead the “declarative”
approach states the conditions to meet for a match and is more readable through
its explicit patterns. While structural pattern matching can be used in its
simplest form comparing a variable to a literal in a case statement, its
true value for Python lies in its handling of the subject’s type and shape.

@node Simple pattern match to a literal,Patterns with a literal and variable,Declarative approach,PEP 634 Structural Pattern Matching
@anchor{whatsnew/3 10 simple-pattern-match-to-a-literal}@anchor{9b3}
@subsubsection Simple pattern: match to a literal


Let’s look at this example as pattern matching in its simplest form: a value,
the subject, being matched to several literals, the patterns. In the example
below, @code{status} is the subject of the match statement. The patterns are
each of the case statements, where literals represent request status codes.
The associated action to the case is executed after a match:

@example
def http_error(status):
    match status:
        case 400:
            return "Bad request"
        case 404:
            return "Not found"
        case 418:
            return "I'm a teapot"
        case _:
            return "Something's wrong with the internet"
@end example

If the above function is passed a @code{status} of 418, “I’m a teapot” is returned.
If the above function is passed a @code{status} of 500, the case statement with
@code{_} will match as a wildcard, and “Something’s wrong with the internet” is
returned.
Note the last block: the variable name, @code{_}, acts as a `wildcard' and insures
the subject will always match. The use of @code{_} is optional.

You can combine several literals in a single pattern using @code{|} (“or”):

@example
case 401 | 403 | 404:
    return "Not allowed"
@end example

@menu
* Behavior without the wildcard:: 

@end menu

@node Behavior without the wildcard,,,Simple pattern match to a literal
@anchor{whatsnew/3 10 behavior-without-the-wildcard}@anchor{9b4}
@subsubsection Behavior without the wildcard


If we modify the above example by removing the last case block, the example
becomes:

@example
def http_error(status):
    match status:
        case 400:
            return "Bad request"
        case 404:
            return "Not found"
        case 418:
            return "I'm a teapot"
@end example

Without the use of @code{_} in a case statement, a match may not exist. If no
match exists, the behavior is a no-op. For example, if @code{status} of 500 is
passed, a no-op occurs.

@node Patterns with a literal and variable,Patterns and classes,Simple pattern match to a literal,PEP 634 Structural Pattern Matching
@anchor{whatsnew/3 10 patterns-with-a-literal-and-variable}@anchor{9b5}
@subsubsection Patterns with a literal and variable


Patterns can look like unpacking assignments, and a pattern may be used to bind
variables. In this example, a data point can be unpacked to its x-coordinate
and y-coordinate:

@example
# point is an (x, y) tuple
match point:
    case (0, 0):
        print("Origin")
    case (0, y):
        print(f"Y=@{y@}")
    case (x, 0):
        print(f"X=@{x@}")
    case (x, y):
        print(f"X=@{x@}, Y=@{y@}")
    case _:
        raise ValueError("Not a point")
@end example

The first pattern has two literals, @code{(0, 0)}, and may be thought of as an
extension of the literal pattern shown above. The next two patterns combine a
literal and a variable, and the variable `binds' a value from the subject
(@code{point}).  The fourth pattern captures two values, which makes it
conceptually similar to the unpacking assignment @code{(x, y) = point}.

@node Patterns and classes,Nested patterns,Patterns with a literal and variable,PEP 634 Structural Pattern Matching
@anchor{whatsnew/3 10 patterns-and-classes}@anchor{9b6}
@subsubsection Patterns and classes


If you are using classes to structure your data, you can use as a pattern
the class name followed by an argument list resembling a constructor. This
pattern has the ability to capture instance attributes into variables:

@example
class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y

def location(point):
    match point:
        case Point(x=0, y=0):
            print("Origin is the point's location.")
        case Point(x=0, y=y):
            print(f"Y=@{y@} and the point is on the y-axis.")
        case Point(x=x, y=0):
            print(f"X=@{x@} and the point is on the x-axis.")
        case Point():
            print("The point is located somewhere else on the plane.")
        case _:
            print("Not a point")
@end example

@menu
* Patterns with positional parameters:: 

@end menu

@node Patterns with positional parameters,,,Patterns and classes
@anchor{whatsnew/3 10 patterns-with-positional-parameters}@anchor{9b7}
@subsubsection Patterns with positional parameters


You can use positional parameters with some builtin classes that provide an
ordering for their attributes (e.g. dataclasses). You can also define a specific
position for attributes in patterns by setting the @code{__match_args__} special
attribute in your classes. If it’s set to (“x”, “y”), the following patterns
are all equivalent (and all bind the @code{y} attribute to the @code{var} variable):

@example
Point(1, var)
Point(1, y=var)
Point(x=1, y=var)
Point(y=var, x=1)
@end example

@node Nested patterns,Complex patterns and the wildcard,Patterns and classes,PEP 634 Structural Pattern Matching
@anchor{whatsnew/3 10 nested-patterns}@anchor{9b8}
@subsubsection Nested patterns


Patterns can be arbitrarily nested.  For example, if our data is a short
list of points, it could be matched like this:

@example
match points:
    case []:
        print("No points in the list.")
    case [Point(0, 0)]:
        print("The origin is the only point in the list.")
    case [Point(x, y)]:
        print(f"A single point @{x@}, @{y@} is in the list.")
    case [Point(0, y1), Point(0, y2)]:
        print(f"Two points on the Y axis at @{y1@}, @{y2@} are in the list.")
    case _:
        print("Something else is found in the list.")
@end example

@node Complex patterns and the wildcard,Guard,Nested patterns,PEP 634 Structural Pattern Matching
@anchor{whatsnew/3 10 complex-patterns-and-the-wildcard}@anchor{9b9}
@subsubsection Complex patterns and the wildcard


To this point, the examples have used @code{_} alone in the last case statement.
A wildcard can be used in more complex patterns, such as @code{('error', code, _)}.
For example:

@example
match test_variable:
    case ('warning', code, 40):
        print("A warning has been received.")
    case ('error', code, _):
        print(f"An error @{code@} occurred.")
@end example

In the above case, @code{test_variable} will match for (‘error’, code, 100) and
(‘error’, code, 800).

@node Guard,Other Key Features,Complex patterns and the wildcard,PEP 634 Structural Pattern Matching
@anchor{whatsnew/3 10 guard}@anchor{9ba}
@subsubsection Guard


We can add an @code{if} clause to a pattern, known as a “guard”.  If the
guard is false, @code{match} goes on to try the next case block.  Note
that value capture happens before the guard is evaluated:

@example
match point:
    case Point(x, y) if x == y:
        print(f"The point is located on the diagonal Y=X at @{x@}.")
    case Point(x, y):
        print(f"Point is not on the diagonal.")
@end example

@node Other Key Features,,Guard,PEP 634 Structural Pattern Matching
@anchor{whatsnew/3 10 other-key-features}@anchor{9bb}
@subsubsection Other Key Features


Several other key features:


@itemize -

@item 
Like unpacking assignments, tuple and list patterns have exactly the
same meaning and actually match arbitrary sequences. Technically,
the subject must be a sequence.
Therefore, an important exception is that patterns don’t match iterators.
Also, to prevent a common mistake, sequence patterns don’t match strings.

@item 
Sequence patterns support wildcards: @code{[x, y, *rest]} and @code{(x, y,
*rest)} work similar to wildcards in unpacking assignments.  The
name after @code{*} may also be @code{_}, so @code{(x, y, *_)} matches a sequence
of at least two items without binding the remaining items.

@item 
Mapping patterns: @code{@{"bandwidth": b, "latency": l@}} captures the
@code{"bandwidth"} and @code{"latency"} values from a dict.  Unlike sequence
patterns, extra keys are ignored.  A wildcard @code{**rest} is also
supported.  (But @code{**_} would be redundant, so is not allowed.)

@item 
Subpatterns may be captured using the @code{as} keyword:

@example
case (Point(x1, y1), Point(x2, y2) as p2): ...
@end example

This binds x1, y1, x2, y2 like you would expect without the @code{as} clause,
and p2 to the entire second item of the subject.

@item 
Most literals are compared by equality. However, the singletons @code{True},
@code{False} and @code{None} are compared by identity.

@item 
Named constants may be used in patterns.  These named constants must be
dotted names to prevent the constant from being interpreted as a capture
variable:

@example
from enum import Enum
class Color(Enum):
    RED = 0
    GREEN = 1
    BLUE = 2

color = Color.GREEN
match color:
    case Color.RED:
        print("I see red!")
    case Color.GREEN:
        print("Grass is green")
    case Color.BLUE:
        print("I'm feeling the blues :(")
@end example
@end itemize

For the full specification see 
@geindex Python 향상 제안; PEP 634
PEP 634@footnote{https://peps.python.org/pep-0634/}.  Motivation and rationale
are in 
@geindex Python 향상 제안; PEP 635
PEP 635@footnote{https://peps.python.org/pep-0635/}, and a longer tutorial is in 
@geindex Python 향상 제안; PEP 636
PEP 636@footnote{https://peps.python.org/pep-0636/}.

@node Optional EncodingWarning and encoding="locale" option,,PEP 634 Structural Pattern Matching,New Features<5>
@anchor{whatsnew/3 10 optional-encodingwarning-and-encoding-locale-option}@anchor{9bc}@anchor{whatsnew/3 10 whatsnew310-pep597}@anchor{9bd}
@subsubsection Optional @code{EncodingWarning} and @code{encoding="locale"} option


The default encoding of @ref{9be,,TextIOWrapper} and @ref{316,,open()} is
platform and locale dependent. Since UTF-8 is used on most Unix
platforms, omitting @code{encoding} option when opening UTF-8 files
(e.g. JSON, YAML, TOML, Markdown) is a very common bug. For example:

@example
# BUG: "rb" mode or encoding="utf-8" should be used.
with open("data.json") as f:
    data = json.load(f)
@end example

To find this type of bug, an optional @code{EncodingWarning} is added.
It is emitted when @ref{89b,,sys.flags.warn_default_encoding}
is true and locale-specific default encoding is used.

@code{-X warn_default_encoding} option and 
@geindex PYTHONWARNDEFAULTENCODING
@geindex 환경 변수; PYTHONWARNDEFAULTENCODING
@ref{9bf,,PYTHONWARNDEFAULTENCODING}
are added to enable the warning.

See @ref{9c0,,텍스트 인코딩} for more information.

@node New Features Related to Type Hints<3>,Other Language Changes<3>,New Features<5>,What’s New In Python 3 10
@anchor{whatsnew/3 10 new-feat-related-type-hints}@anchor{9c1}@anchor{whatsnew/3 10 new-features-related-to-type-hints}@anchor{9c2}
@subsection New Features Related to Type Hints


This section covers major changes affecting 
@geindex Python 향상 제안; PEP 484
PEP 484@footnote{https://peps.python.org/pep-0484/} type hints and
the @ref{10a,,typing} module.

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

@end menu

@node PEP 604 New Type Union Operator,PEP 612 Parameter Specification Variables,,New Features Related to Type Hints<3>
@anchor{whatsnew/3 10 pep-604-new-type-union-operator}@anchor{9c3}
@subsubsection PEP 604: New Type Union Operator


A new type union operator was introduced which enables the syntax @code{X | Y}.
This provides a cleaner way of expressing ‘either type X or type Y’ instead of
using @ref{2a8,,typing.Union}, especially in type hints.

In previous versions of Python, to apply a type hint for functions accepting
arguments of multiple types, @ref{2a8,,typing.Union} was used:

@example
def square(number: Union[int, float]) -> Union[int, float]:
    return number ** 2
@end example

Type hints can now be written in a more succinct manner:

@example
def square(number: int | float) -> int | float:
    return number ** 2
@end example

This new syntax is also accepted as the second argument to @ref{2ad,,isinstance()}
and @ref{9c4,,issubclass()}:

@example
>>> isinstance(1, int | str)
True
@end example

See @ref{9c5,,Union Type} and 
@geindex Python 향상 제안; PEP 604
PEP 604@footnote{https://peps.python.org/pep-0604/} for more details.

(Contributed by Maggie Moss and Philippe Prados in bpo-41428@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41428},
with additions by Yurii Karabas and Serhiy Storchaka in bpo-44490@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44490}.)

@node PEP 612 Parameter Specification Variables,PEP 613 TypeAlias,PEP 604 New Type Union Operator,New Features Related to Type Hints<3>
@anchor{whatsnew/3 10 pep-612-parameter-specification-variables}@anchor{9c6}
@subsubsection PEP 612: Parameter Specification Variables


Two new options to improve the information provided to static type checkers for
@geindex Python 향상 제안; PEP 484
PEP 484@footnote{https://peps.python.org/pep-0484/}‘s @code{Callable} have been added to the @ref{10a,,typing} module.

The first is the parameter specification variable.  They are used to forward the
parameter types of one callable to another callable – a pattern commonly
found in higher order functions and decorators.  Examples of usage can be found
in @ref{488,,typing.ParamSpec}. Previously, there was no easy way to type annotate
dependency of parameter types in such a precise manner.

The second option is the new @code{Concatenate} operator. It’s used in conjunction
with parameter specification variables to type annotate a higher order callable
which adds or removes parameters of another callable.  Examples of usage can
be found in @ref{9c7,,typing.Concatenate}.

See @ref{9c8,,typing.Callable}, @ref{488,,typing.ParamSpec},
@ref{9c7,,typing.Concatenate}, @ref{9c9,,typing.ParamSpecArgs},
@ref{9ca,,typing.ParamSpecKwargs}, and 
@geindex Python 향상 제안; PEP 612
PEP 612@footnote{https://peps.python.org/pep-0612/} for more details.

(Contributed by Ken Jin in bpo-41559@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41559}, with minor enhancements by Jelle
Zijlstra in bpo-43783@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43783}.  PEP written by Mark Mendoza.)

@node PEP 613 TypeAlias,PEP 647 User-Defined Type Guards,PEP 612 Parameter Specification Variables,New Features Related to Type Hints<3>
@anchor{whatsnew/3 10 pep-613-typealias}@anchor{9cb}
@subsubsection PEP 613: TypeAlias


@geindex Python 향상 제안; PEP 484
PEP 484@footnote{https://peps.python.org/pep-0484/} introduced the concept of type aliases, only requiring them to be
top-level unannotated assignments. This simplicity sometimes made it difficult
for type checkers to distinguish between type aliases and ordinary assignments,
especially when forward references or invalid types were involved. Compare:

@example
StrCache = 'Cache[str]'  # a type alias
LOG_PREFIX = 'LOG[DEBUG]'  # a module constant
@end example

Now the @ref{10a,,typing} module has a special value @ref{9cc,,TypeAlias}
which lets you declare type aliases more explicitly:

@example
StrCache: TypeAlias = 'Cache[str]'  # a type alias
LOG_PREFIX = 'LOG[DEBUG]'  # a module constant
@end example

See 
@geindex Python 향상 제안; PEP 613
PEP 613@footnote{https://peps.python.org/pep-0613/} for more details.

(Contributed by Mikhail Golubev in bpo-41923@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41923}.)

@node PEP 647 User-Defined Type Guards,,PEP 613 TypeAlias,New Features Related to Type Hints<3>
@anchor{whatsnew/3 10 pep-647-user-defined-type-guards}@anchor{9cd}
@subsubsection PEP 647: User-Defined Type Guards


@ref{48d,,TypeGuard} has been added to the @ref{10a,,typing} module to annotate
type guard functions and improve information provided to static type checkers
during type narrowing.  For more information, please see
@code{TypeGuard}‘s documentation, and 
@geindex Python 향상 제안; PEP 647
PEP 647@footnote{https://peps.python.org/pep-0647/}.

(Contributed by Ken Jin and Guido van Rossum in bpo-43766@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43766}.
PEP written by Eric Traut.)

@node Other Language Changes<3>,New Modules<3>,New Features Related to Type Hints<3>,What’s New In Python 3 10
@anchor{whatsnew/3 10 other-language-changes}@anchor{9ce}
@subsection Other Language Changes



@itemize *

@item 
The @ref{19b,,int} type has a new method @ref{9cf,,int.bit_count()}, returning the
number of ones in the binary expansion of a given integer, also known
as the population count. (Contributed by Niklas Fiekas in bpo-29882@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29882}.)

@item 
The views returned by @ref{9d0,,dict.keys()}, @ref{9d1,,dict.values()} and
@ref{9d2,,dict.items()} now all have a @code{mapping} attribute that gives a
@ref{697,,types.MappingProxyType} object wrapping the original
dictionary. (Contributed by Dennis Sweeney in bpo-40890@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40890}.)

@item 
@geindex Python 향상 제안; PEP 618
PEP 618@footnote{https://peps.python.org/pep-0618/}: The @ref{1a0,,zip()} function now has an optional @code{strict} flag, used
to require that all the iterables have an equal length.

@item 
Builtin and extension functions that take integer arguments no longer accept
@ref{1fe,,Decimal}s, @ref{213,,Fraction}s and other
objects that can be converted to integers only with a loss (e.g. that have
the @ref{19d,,__int__()} method but do not have the
@ref{19e,,__index__()} method).
(Contributed by Serhiy Storchaka in bpo-37999@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37999}.)

@item 
If @ref{9d3,,object.__ipow__()} returns @ref{1a2,,NotImplemented}, the operator will
correctly fall back to @ref{9d4,,object.__pow__()} and @ref{1a5,,object.__rpow__()} as expected.
(Contributed by Alex Shkop in bpo-38302@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38302}.)

@item 
Assignment expressions can now be used unparenthesized within set literals
and set comprehensions, as well as in sequence indexes (but not slices).

@item 
Functions have a new @code{__builtins__} attribute which is used to look for
builtin symbols when a function is executed, instead of looking into
@code{__globals__['__builtins__']}. The attribute is initialized from
@code{__globals__["__builtins__"]} if it exists, else from the current builtins.
(Contributed by Mark Shannon in bpo-42990@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42990}.)

@item 
Two new builtin functions – @ref{9d5,,aiter()} and @ref{9d6,,anext()} have been added
to provide asynchronous counterparts to @ref{9d7,,iter()} and @ref{9d8,,next()},
respectively.
(Contributed by Joshua Bronson, Daniel Pope, and Justin Wang in bpo-31861@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31861}.)

@item 
Static methods (@ref{453,,@@staticmethod}) and class methods
(@ref{48f,,@@classmethod}) now inherit the method attributes
(@code{__module__}, @code{__name__}, @code{__qualname__}, @code{__doc__},
@code{__annotations__}) and have a new @code{__wrapped__} attribute.
Moreover, static methods are now callable as regular functions.
(Contributed by Victor Stinner in bpo-43682@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43682}.)

@item 
Annotations for complex targets (everything beside @code{simple name} targets
defined by 
@geindex Python 향상 제안; PEP 526
PEP 526@footnote{https://peps.python.org/pep-0526/}) no longer cause any runtime effects with @code{from __future__ import annotations}.
(Contributed by Batuhan Taskaya in bpo-42737@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42737}.)

@item 
Class and module objects now lazy-create empty annotations dicts on demand.
The annotations dicts are stored in the object’s @code{__dict__} for
backwards compatibility.  This improves the best practices for working
with @code{__annotations__}; for more information, please see
@ref{9d9,,Annotations Best Practices}.
(Contributed by Larry Hastings in bpo-43901@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43901}.)

@item 
Annotations consist of @code{yield}, @code{yield from}, @code{await} or named expressions
are now forbidden under @code{from __future__ import annotations} due to their side
effects.
(Contributed by Batuhan Taskaya in bpo-42725@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42725}.)

@item 
Usage of unbound variables, @code{super()} and other expressions that might
alter the processing of symbol table as annotations are now rendered
effectless under @code{from __future__ import annotations}.
(Contributed by Batuhan Taskaya in bpo-42725@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42725}.)

@item 
Hashes of NaN values of both @ref{196,,float} type and
@ref{1fe,,decimal.Decimal} type now depend on object identity. Formerly, they
always hashed to @code{0} even though NaN values are not equal to one another.
This caused potentially quadratic runtime behavior due to excessive hash
collisions when creating dictionaries and sets containing multiple NaNs.
(Contributed by Raymond Hettinger in bpo-43475@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43475}.)

@item 
A @ref{18e,,SyntaxError} (instead of a @ref{452,,NameError}) will be raised when deleting
the @ref{9da,,__debug__} constant.  (Contributed by Donghee Na in bpo-45000@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45000}.)

@item 
@ref{18e,,SyntaxError} exceptions now have @code{end_lineno} and
@code{end_offset} attributes.  They will be @code{None} if not determined.
(Contributed by Pablo Galindo in bpo-43914@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43914}.)
@end itemize

@node New Modules<3>,Improved Modules<3>,Other Language Changes<3>,What’s New In Python 3 10
@anchor{whatsnew/3 10 new-modules}@anchor{9db}
@subsection New Modules



@itemize *

@item 
None.
@end itemize

@node Improved Modules<3>,Optimizations<4>,New Modules<3>,What’s New In Python 3 10
@anchor{whatsnew/3 10 improved-modules}@anchor{9dc}
@subsection Improved Modules


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

@end menu

@node asyncio<7>,argparse<4>,,Improved Modules<3>
@anchor{whatsnew/3 10 asyncio}@anchor{9dd}
@subsubsection asyncio


Add missing @ref{9de,,connect_accepted_socket()}
method.
(Contributed by Alex Grönholm in bpo-41332@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41332}.)

@node argparse<4>,array<3>,asyncio<7>,Improved Modules<3>
@anchor{whatsnew/3 10 argparse}@anchor{9df}
@subsubsection argparse


Misleading phrase “optional arguments” was replaced with “options” in argparse help. Some tests might require adaptation if they rely on exact output match.
(Contributed by Raymond Hettinger in bpo-9694@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9694}.)

@node array<3>,asynchat asyncore smtpd,argparse<4>,Improved Modules<3>
@anchor{whatsnew/3 10 array}@anchor{9e0}
@subsubsection array


The @ref{9e1,,index()} method of @ref{4c0,,array.array} now has
optional `start' and `stop' parameters.
(Contributed by Anders Lorentsen and Zackery Spytz in bpo-31956@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31956}.)

@node asynchat asyncore smtpd,base64<3>,array<3>,Improved Modules<3>
@anchor{whatsnew/3 10 asynchat-asyncore-smtpd}@anchor{9e2}
@subsubsection asynchat, asyncore, smtpd


These modules have been marked as deprecated in their module documentation
since Python 3.6.  An import-time @ref{1a3,,DeprecationWarning} has now been
added to all three of these modules.

@node base64<3>,bdb<2>,asynchat asyncore smtpd,Improved Modules<3>
@anchor{whatsnew/3 10 base64}@anchor{9e3}
@subsubsection base64


Add @ref{9e4,,base64.b32hexencode()} and @ref{9e5,,base64.b32hexdecode()} to support the
Base32 Encoding with Extended Hex Alphabet.

@node bdb<2>,bisect,base64<3>,Improved Modules<3>
@anchor{whatsnew/3 10 bdb}@anchor{9e6}
@subsubsection bdb


Add @code{clearBreakpoints()} to reset all set breakpoints.
(Contributed by Irit Katriel in bpo-24160@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24160}.)

@node bisect,codecs,bdb<2>,Improved Modules<3>
@anchor{whatsnew/3 10 bisect}@anchor{9e7}
@subsubsection bisect


Added the possibility of providing a `key' function to the APIs in the @ref{12,,bisect}
module. (Contributed by Raymond Hettinger in bpo-4356@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4356}.)

@node codecs,collections abc,bisect,Improved Modules<3>
@anchor{whatsnew/3 10 codecs}@anchor{9e8}
@subsubsection codecs


Add a @ref{9e9,,codecs.unregister()} function to unregister a codec search function.
(Contributed by Hai Shi in bpo-41842@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41842}.)

@node collections abc,contextlib<2>,codecs,Improved Modules<3>
@anchor{whatsnew/3 10 collections-abc}@anchor{9ea}
@subsubsection collections.abc


The @code{__args__} of the @ref{8c0,,parameterized generic} for
@ref{9eb,,collections.abc.Callable} are now consistent with @ref{9c8,,typing.Callable}.
@code{collections.abc.Callable} generic now flattens type parameters, similar
to what @code{typing.Callable} currently does.  This means that
@code{collections.abc.Callable[[int, str], str]} will have @code{__args__} of
@code{(int, str, str)}; previously this was @code{([int, str], str)}.  To allow this
change, @ref{9ec,,types.GenericAlias} can now be subclassed, and a subclass will
be returned when subscripting the @code{collections.abc.Callable} type.  Note
that a @ref{198,,TypeError} may be raised for invalid forms of parameterizing
@code{collections.abc.Callable} which may have passed silently in Python 3.9.
(Contributed by Ken Jin in bpo-42195@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42195}.)

@node contextlib<2>,curses<2>,collections abc,Improved Modules<3>
@anchor{whatsnew/3 10 contextlib}@anchor{9ed}
@subsubsection contextlib


Add a @ref{9ee,,contextlib.aclosing()} context manager to safely close async generators
and objects representing asynchronously released resources.
(Contributed by Joongi Kim and John Belmonte in bpo-41229@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41229}.)

Add asynchronous context manager support to @ref{9ef,,contextlib.nullcontext()}.
(Contributed by Tom Gringauz in bpo-41543@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41543}.)

Add @ref{9f0,,AsyncContextDecorator}, for supporting usage of async
context managers as decorators.

@node curses<2>,dataclasses<2>,contextlib<2>,Improved Modules<3>
@anchor{whatsnew/3 10 curses}@anchor{9f1}
@subsubsection curses


The extended color functions added in ncurses 6.1 will be used transparently
by @ref{9f2,,curses.color_content()}, @ref{9f3,,curses.init_color()},
@ref{9f4,,curses.init_pair()}, and @ref{9f5,,curses.pair_content()}. A new function,
@ref{9f6,,curses.has_extended_color_support()}, indicates whether extended color
support is provided by the underlying ncurses library.
(Contributed by Jeffrey Kintscher and Hans Petter Jansson in bpo-36982@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36982}.)

The @code{BUTTON5_*} constants are now exposed in the @ref{2f,,curses} module if
they are provided by the underlying curses library.
(Contributed by Zackery Spytz in bpo-39273@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39273}.)

@node dataclasses<2>,distutils<2>,curses<2>,Improved Modules<3>
@anchor{whatsnew/3 10 dataclasses}@anchor{9f7}
@subsubsection dataclasses


@menu
* __slots__:: 
* Keyword-only fields:: 

@end menu

@node __slots__,Keyword-only fields,,dataclasses<2>
@anchor{whatsnew/3 10 slots}@anchor{9f8}
@subsubsection __slots__


Added @code{slots} parameter in @ref{4e1,,dataclasses.dataclass()} decorator.
(Contributed by Yurii Karabas in bpo-42269@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42269})

@node Keyword-only fields,,__slots__,dataclasses<2>
@anchor{whatsnew/3 10 keyword-only-fields}@anchor{9f9}
@subsubsection Keyword-only fields


dataclasses now supports fields that are keyword-only in the
generated __init__ method.  There are a number of ways of specifying
keyword-only fields.

You can say that every field is keyword-only:

@example
from dataclasses import dataclass

@@dataclass(kw_only=True)
class Birthday:
    name: str
    birthday: datetime.date
@end example

Both @code{name} and @code{birthday} are keyword-only parameters to the
generated __init__ method.

You can specify keyword-only on a per-field basis:

@example
from dataclasses import dataclass, field

@@dataclass
class Birthday:
    name: str
    birthday: datetime.date = field(kw_only=True)
@end example

Here only @code{birthday} is keyword-only.  If you set @code{kw_only} on
individual fields, be aware that there are rules about re-ordering
fields due to keyword-only fields needing to follow non-keyword-only
fields.  See the full dataclasses documentation for details.

You can also specify that all fields following a KW_ONLY marker are
keyword-only.  This will probably be the most common usage:

@example
from dataclasses import dataclass, KW_ONLY

@@dataclass
class Point:
    x: float
    y: float
    _: KW_ONLY
    z: float = 0.0
    t: float = 0.0
@end example

Here, @code{z} and @code{t} are keyword-only parameters, while @code{x} and
@code{y} are not.
(Contributed by Eric V. Smith in bpo-43532@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43532}.)

@node distutils<2>,doctest<2>,dataclasses<2>,Improved Modules<3>
@anchor{whatsnew/3 10 distutils}@anchor{9fa}@anchor{whatsnew/3 10 distutils-deprecated}@anchor{933}
@subsubsection distutils


The entire @code{distutils} package is deprecated, to be removed in Python
3.12. Its functionality for specifying package builds has already been
completely replaced by third-party packages @code{setuptools} and
@code{packaging}, and most other commonly used APIs are available elsewhere
in the standard library (such as @ref{af,,platform}, @ref{ca,,shutil},
@ref{dc,,subprocess} or @ref{e1,,sysconfig}). There are no plans to migrate
any other functionality from @code{distutils}, and applications that are
using other functions should plan to make private copies of the code.
Refer to 
@geindex Python 향상 제안; PEP 632
PEP 632@footnote{https://peps.python.org/pep-0632/} for discussion.

The @code{bdist_wininst} command deprecated in Python 3.8 has been removed.
The @code{bdist_wheel} command is now recommended to distribute binary packages
on Windows.
(Contributed by Victor Stinner in bpo-42802@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42802}.)

@node doctest<2>,encodings,distutils<2>,Improved Modules<3>
@anchor{whatsnew/3 10 doctest}@anchor{9fb}
@subsubsection doctest


When a module does not define @code{__loader__}, fall back to @code{__spec__.loader}.
(Contributed by Brett Cannon in bpo-42133@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42133}.)

@node encodings,enum<4>,doctest<2>,Improved Modules<3>
@anchor{whatsnew/3 10 encodings}@anchor{9fc}
@subsubsection encodings


@ref{9fd,,encodings.normalize_encoding()} now ignores non-ASCII characters.
(Contributed by Hai Shi in bpo-39337@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39337}.)

@node enum<4>,fileinput,encodings,Improved Modules<3>
@anchor{whatsnew/3 10 enum}@anchor{9fe}
@subsubsection enum


@ref{841,,Enum} @ref{82e,,__repr__()} now returns @code{enum_name.member_name} and
@ref{82f,,__str__()} now returns @code{member_name}.  Stdlib enums available as
module constants have a @ref{1c1,,repr()} of @code{module_name.member_name}.
(Contributed by Ethan Furman in bpo-40066@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40066}.)

Add @ref{82c,,enum.StrEnum} for enums where all members are strings.
(Contributed by Ethan Furman in bpo-41816@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41816}.)

@node fileinput,faulthandler<2>,enum<4>,Improved Modules<3>
@anchor{whatsnew/3 10 fileinput}@anchor{9ff}
@subsubsection fileinput


Add `encoding' and `errors' parameters in @ref{a00,,fileinput.input()} and
@ref{93f,,fileinput.FileInput}.
(Contributed by Inada Naoki in bpo-43712@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43712}.)

@ref{a01,,fileinput.hook_compressed()} now returns @ref{9be,,TextIOWrapper} object
when `mode' is “r” and file is compressed, like uncompressed files.
(Contributed by Inada Naoki in bpo-5758@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5758}.)

@node faulthandler<2>,gc<2>,fileinput,Improved Modules<3>
@anchor{whatsnew/3 10 faulthandler}@anchor{a02}
@subsubsection faulthandler


The @ref{5c,,faulthandler} module now detects if a fatal error occurs during a
garbage collector collection.
(Contributed by Victor Stinner in bpo-44466@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44466}.)

@node gc<2>,glob<2>,faulthandler<2>,Improved Modules<3>
@anchor{whatsnew/3 10 gc}@anchor{a03}
@subsubsection gc


Add audit hooks for @ref{a04,,gc.get_objects()}, @ref{a05,,gc.get_referrers()} and
@ref{a06,,gc.get_referents()}. (Contributed by Pablo Galindo in bpo-43439@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43439}.)

@node glob<2>,hashlib<3>,gc<2>,Improved Modules<3>
@anchor{whatsnew/3 10 glob}@anchor{a07}
@subsubsection glob


Add the `root_dir' and `dir_fd' parameters in @ref{59f,,glob()} and
@ref{a08,,iglob()} which allow to specify the root directory for searching.
(Contributed by Serhiy Storchaka in bpo-38144@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38144}.)

@node hashlib<3>,hmac<2>,glob<2>,Improved Modules<3>
@anchor{whatsnew/3 10 hashlib}@anchor{a09}
@subsubsection hashlib


The hashlib module requires OpenSSL 1.1.1 or newer.
(Contributed by Christian Heimes in 
@geindex Python 향상 제안; PEP 644
PEP 644@footnote{https://peps.python.org/pep-0644/} and bpo-43669@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43669}.)

The hashlib module has preliminary support for OpenSSL 3.0.0.
(Contributed by Christian Heimes in bpo-38820@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38820} and other issues.)

The pure-Python fallback of @ref{732,,pbkdf2_hmac()} is deprecated. In
the future PBKDF2-HMAC will only be available when Python has been built with
OpenSSL support.
(Contributed by Christian Heimes in bpo-43880@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43880}.)

@node hmac<2>,IDLE and idlelib<2>,hashlib<3>,Improved Modules<3>
@anchor{whatsnew/3 10 hmac}@anchor{a0a}
@subsubsection hmac


The hmac module now uses OpenSSL’s HMAC implementation internally.
(Contributed by Christian Heimes in bpo-40645@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40645}.)

@node IDLE and idlelib<2>,importlib metadata<2>,hmac<2>,Improved Modules<3>
@anchor{whatsnew/3 10 idle-and-idlelib}@anchor{a0b}
@subsubsection IDLE and idlelib


Make IDLE invoke @ref{a0c,,sys.excepthook()} (when started without ‘-n’).
User hooks were previously ignored.  (Contributed by Ken Hilton in
bpo-43008@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43008}.)

Rearrange the settings dialog.  Split the General tab into Windows
and Shell/Ed tabs.  Move help sources, which extend the Help menu, to the
Extensions tab.  Make space for new options and shorten the dialog. The
latter makes the dialog better fit small screens.  (Contributed by Terry Jan
Reedy in bpo-40468@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40468}.)  Move the indent space setting from the Font tab to
the new Windows tab.  (Contributed by Mark Roseman and Terry Jan Reedy in
bpo-33962@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33962}.)

The changes above were backported to a 3.9 maintenance release.

Add a Shell sidebar.  Move the primary prompt (‘>>>’) to the sidebar.
Add secondary prompts (’…’) to the sidebar.  Left click and optional
drag selects one or more lines of text, as with the editor
line number sidebar.  Right click after selecting text lines displays
a context menu with ‘copy with prompts’.  This zips together prompts
from the sidebar with lines from the selected text.  This option also
appears on the context menu for the text.  (Contributed by Tal Einat
in bpo-37903@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37903}.)

Use spaces instead of tabs to indent interactive code.  This makes
interactive code entries ‘look right’.  Making this feasible was a
major motivation for adding the shell sidebar.  (Contributed by
Terry Jan Reedy in bpo-37892@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37892}.)

Highlight the new @ref{a0d,,soft keywords} @ref{a0e,,match},
@code{case}, and @ref{a0f,,_} in
pattern-matching statements. However, this highlighting is not perfect
and will be incorrect in some rare cases, including some @code{_}-s in
@code{case} patterns.  (Contributed by Tal Einat in bpo-44010@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44010}.)

New in 3.10 maintenance releases.

Apply syntax highlighting to @code{.pyi} files. (Contributed by Alex
Waygood and Terry Jan Reedy in bpo-45447@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45447}.)

Include prompts when saving Shell with inputs and outputs.
(Contributed by Terry Jan Reedy in gh-95191@footnote{https://github.com/python/cpython/issues/95191}.)

@node importlib metadata<2>,inspect<4>,IDLE and idlelib<2>,Improved Modules<3>
@anchor{whatsnew/3 10 importlib-metadata}@anchor{a10}
@subsubsection importlib.metadata


Feature parity with @code{importlib_metadata} 4.6
(history@footnote{https://importlib-metadata.readthedocs.io/en/latest/history.html}).

@ref{587,,importlib.metadata entry points}
now provide a nicer experience
for selecting entry points by group and name through a new
@ref{587,,importlib.metadata.EntryPoints} class. See the Compatibility
Note in the docs for more info on the deprecation and usage.

Added @ref{a11,,importlib.metadata.packages_distributions()}
for resolving top-level Python modules and packages to their
@ref{a12,,importlib.metadata.Distribution}.

@node inspect<4>,itertools<4>,importlib metadata<2>,Improved Modules<3>
@anchor{whatsnew/3 10 inspect}@anchor{a13}
@subsubsection inspect


When a module does not define @code{__loader__}, fall back to @code{__spec__.loader}.
(Contributed by Brett Cannon in bpo-42133@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42133}.)

Add @ref{a14,,inspect.get_annotations()}, which safely computes the annotations
defined on an object. It works around the quirks of accessing the annotations
on various types of objects, and makes very few assumptions about the object
it examines. @code{inspect.get_annotations()} can also correctly un-stringize
stringized annotations.  @code{inspect.get_annotations()} is now considered
best practice for accessing the annotations dict defined on any Python object;
for more information on best practices for working with annotations, please see
@ref{9d9,,Annotations Best Practices}.
Relatedly, @ref{22f,,inspect.signature()},
@ref{941,,inspect.Signature.from_callable()}, and @code{inspect.Signature.from_function()}
now call @code{inspect.get_annotations()} to retrieve annotations. This means
@code{inspect.signature()} and @code{inspect.Signature.from_callable()} can
also now un-stringize stringized annotations.
(Contributed by Larry Hastings in bpo-43817@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43817}.)

@node itertools<4>,linecache<2>,inspect<4>,Improved Modules<3>
@anchor{whatsnew/3 10 itertools}@anchor{a15}
@subsubsection itertools


Add @ref{a16,,itertools.pairwise()}.
(Contributed by Raymond Hettinger in bpo-38200@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38200}.)

@node linecache<2>,os<5>,itertools<4>,Improved Modules<3>
@anchor{whatsnew/3 10 linecache}@anchor{a17}
@subsubsection linecache


When a module does not define @code{__loader__}, fall back to @code{__spec__.loader}.
(Contributed by Brett Cannon in bpo-42133@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42133}.)

@node os<5>,os path<4>,linecache<2>,Improved Modules<3>
@anchor{whatsnew/3 10 os}@anchor{a18}
@subsubsection os


Add @ref{4db,,os.cpu_count()} support for VxWorks RTOS.
(Contributed by Peixing Xin in bpo-41440@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41440}.)

Add a new function @ref{a19,,os.eventfd()} and related helpers to wrap the
@code{eventfd2} syscall on Linux.
(Contributed by Christian Heimes in bpo-41001@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41001}.)

Add @ref{a1a,,os.splice()} that allows to move data between two file
descriptors without copying between kernel address space and user
address space, where one of the file descriptors must refer to a
pipe. (Contributed by Pablo Galindo in bpo-41625@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41625}.)

Add @ref{a1b,,O_EVTONLY}, @ref{a1c,,O_FSYNC}, @ref{a1d,,O_SYMLINK}
and @ref{a1e,,O_NOFOLLOW_ANY} for macOS.
(Contributed by Donghee Na in bpo-43106@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43106}.)

@node os path<4>,pathlib<8>,os<5>,Improved Modules<3>
@anchor{whatsnew/3 10 os-path}@anchor{a1f}
@subsubsection os.path


@ref{262,,os.path.realpath()} now accepts a `strict' keyword-only argument. When set
to @code{True}, @ref{2c0,,OSError} is raised if a path doesn’t exist or a symlink loop
is encountered.
(Contributed by Barney Gale in bpo-43757@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43757}.)

@node pathlib<8>,platform<3>,os path<4>,Improved Modules<3>
@anchor{whatsnew/3 10 pathlib}@anchor{a20}
@subsubsection pathlib


Add slice support to @ref{a21,,PurePath.parents}.
(Contributed by Joshua Cannon in bpo-35498@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35498}.)

Add negative indexing support to @ref{a21,,PurePath.parents}.
(Contributed by Yaroslav Pankovych in bpo-21041@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21041}.)

Add @ref{a22,,Path.hardlink_to} method that
supersedes @code{link_to()}. The new method has the same argument
order as @ref{a23,,symlink_to()}.
(Contributed by Barney Gale in bpo-39950@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39950}.)

@ref{a24,,pathlib.Path.stat()} and @ref{a25,,chmod()} now accept a
`follow_symlinks' keyword-only argument for consistency with corresponding
functions in the @ref{a5,,os} module.
(Contributed by Barney Gale in bpo-39906@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39906}.)

@node platform<3>,pprint,pathlib<8>,Improved Modules<3>
@anchor{whatsnew/3 10 platform}@anchor{a26}
@subsubsection platform


Add @ref{a27,,platform.freedesktop_os_release()} to retrieve operation system
identification from freedesktop.org os-release@footnote{https://www.freedesktop.org/software/systemd/man/os-release.html} standard file.
(Contributed by Christian Heimes in bpo-28468@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28468}.)

@node pprint,py_compile,platform<3>,Improved Modules<3>
@anchor{whatsnew/3 10 pprint}@anchor{a28}
@subsubsection pprint


@ref{a29,,pprint.pprint()} now accepts a new @code{underscore_numbers} keyword argument.
(Contributed by sblondon in bpo-42914@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42914}.)

@ref{b3,,pprint} can now pretty-print @ref{4e1,,dataclasses.dataclass} instances.
(Contributed by Lewis Gaul in bpo-43080@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43080}.)

@node py_compile,pyclbr,pprint,Improved Modules<3>
@anchor{whatsnew/3 10 py-compile}@anchor{a2a}
@subsubsection py_compile


Add @code{--quiet} option to command-line interface of @ref{b8,,py_compile}.
(Contributed by Gregory Schevchenko in bpo-38731@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38731}.)

@node pyclbr,shelve,py_compile,Improved Modules<3>
@anchor{whatsnew/3 10 pyclbr}@anchor{a2b}
@subsubsection pyclbr


Add an @code{end_lineno} attribute to the @code{Function} and @code{Class}
objects in the tree returned by @ref{a2c,,pyclbr.readmodule()} and
@ref{a2d,,pyclbr.readmodule_ex()}.  It matches the existing (start) @code{lineno}.
(Contributed by Aviral Srivastava in bpo-38307@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38307}.)

@node shelve,statistics<3>,pyclbr,Improved Modules<3>
@anchor{whatsnew/3 10 shelve}@anchor{a2e}
@subsubsection shelve


The @ref{c8,,shelve} module now uses @ref{a2f,,pickle.DEFAULT_PROTOCOL} by default
instead of @ref{ab,,pickle} protocol @code{3} when creating shelves.
(Contributed by Zackery Spytz in bpo-34204@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34204}.)

@node statistics<3>,site<2>,shelve,Improved Modules<3>
@anchor{whatsnew/3 10 statistics}@anchor{a30}
@subsubsection statistics


Add @ref{a31,,covariance()}, Pearson’s
@ref{6e2,,correlation()}, and simple
@ref{a32,,linear_regression()} functions.
(Contributed by Tymoteusz Wołodźko in bpo-38490@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38490}.)

@node site<2>,socket<3>,statistics<3>,Improved Modules<3>
@anchor{whatsnew/3 10 site}@anchor{a33}
@subsubsection site


When a module does not define @code{__loader__}, fall back to @code{__spec__.loader}.
(Contributed by Brett Cannon in bpo-42133@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42133}.)

@node socket<3>,ssl<4>,site<2>,Improved Modules<3>
@anchor{whatsnew/3 10 socket}@anchor{a34}
@subsubsection socket


The exception @ref{a35,,socket.timeout} is now an alias of @ref{a36,,TimeoutError}.
(Contributed by Christian Heimes in bpo-42413@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42413}.)

Add option to create MPTCP sockets with @code{IPPROTO_MPTCP}
(Contributed by Rui Cunha in bpo-43571@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43571}.)

Add @code{IP_RECVTOS} option to receive the type of service (ToS) or DSCP/ECN fields
(Contributed by Georg Sauthoff in bpo-44077@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44077}.)

@node ssl<4>,sqlite3<6>,socket<3>,Improved Modules<3>
@anchor{whatsnew/3 10 ssl}@anchor{a37}
@subsubsection ssl


The ssl module requires OpenSSL 1.1.1 or newer.
(Contributed by Christian Heimes in 
@geindex Python 향상 제안; PEP 644
PEP 644@footnote{https://peps.python.org/pep-0644/} and bpo-43669@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43669}.)

The ssl module has preliminary support for OpenSSL 3.0.0 and new option
@ref{a38,,OP_IGNORE_UNEXPECTED_EOF}.
(Contributed by Christian Heimes in bpo-38820@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38820}, bpo-43794@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43794},
bpo-43788@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43788}, bpo-43791@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43791}, bpo-43799@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43799}, bpo-43920@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43920},
bpo-43789@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43789}, and bpo-43811@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43811}.)

Deprecated function and use of deprecated constants now result in
a @ref{1a3,,DeprecationWarning}. @ref{a39,,ssl.SSLContext.options} has
@ref{a3a,,OP_NO_SSLv2} and @ref{a3b,,OP_NO_SSLv3} set by default and
therefore cannot warn about setting the flag again. The
@ref{a3c,,deprecation section} has a list of deprecated
features.
(Contributed by Christian Heimes in bpo-43880@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43880}.)

The ssl module now has more secure default settings. Ciphers without forward
secrecy or SHA-1 MAC are disabled by default. Security level 2 prohibits
weak RSA, DH, and ECC keys with less than 112 bits of security.
@ref{357,,SSLContext} defaults to minimum protocol version TLS 1.2.
Settings are based on Hynek Schlawack’s research.
(Contributed by Christian Heimes in bpo-43998@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43998}.)

The deprecated protocols SSL 3.0, TLS 1.0, and TLS 1.1 are no longer
officially supported. Python does not block them actively. However
OpenSSL build options, distro configurations, vendor patches, and cipher
suites may prevent a successful handshake.

Add a `timeout' parameter to the @ref{a3d,,ssl.get_server_certificate()} function.
(Contributed by Zackery Spytz in bpo-31870@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31870}.)

The ssl module uses heap-types and multi-phase initialization.
(Contributed by Christian Heimes in bpo-42333@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42333}.)

A new verify flag @ref{481,,VERIFY_X509_PARTIAL_CHAIN} has been added.
(Contributed by l0x in bpo-40849@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40849}.)

@node sqlite3<6>,sys<5>,ssl<4>,Improved Modules<3>
@anchor{whatsnew/3 10 sqlite3}@anchor{a3e}
@subsubsection sqlite3


Add audit events for @ref{5a5,,connect()},
@ref{a3f,,enable_load_extension()}, and
@ref{6de,,load_extension()}.
(Contributed by Erlend E. Aasland in bpo-43762@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43762}.)

@node sys<5>,_thread,sqlite3<6>,Improved Modules<3>
@anchor{whatsnew/3 10 sys}@anchor{a40}
@subsubsection sys


Add @ref{a41,,sys.orig_argv} attribute: the list of the original command line
arguments passed to the Python executable.
(Contributed by Victor Stinner in bpo-23427@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23427}.)

Add @ref{a42,,sys.stdlib_module_names}, containing the list of the standard library
module names.
(Contributed by Victor Stinner in bpo-42955@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42955}.)

@node _thread,threading<4>,sys<5>,Improved Modules<3>
@anchor{whatsnew/3 10 thread}@anchor{a43}
@subsubsection _thread


@ref{a44,,_thread.interrupt_main()} now takes an optional signal number to
simulate (the default is still @ref{253,,signal.SIGINT}).
(Contributed by Antoine Pitrou in bpo-43356@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43356}.)

@node threading<4>,traceback<3>,_thread,Improved Modules<3>
@anchor{whatsnew/3 10 threading}@anchor{a45}
@subsubsection threading


Add @ref{a46,,threading.gettrace()} and @ref{a47,,threading.getprofile()} to
retrieve the functions set by @ref{a48,,threading.settrace()} and
@ref{a49,,threading.setprofile()} respectively.
(Contributed by Mario Corchero in bpo-42251@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42251}.)

Add @ref{a4a,,threading.__excepthook__} to allow retrieving the original value
of @ref{a4b,,threading.excepthook()} in case it is set to a broken or a different
value.
(Contributed by Mario Corchero in bpo-42308@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42308}.)

@node traceback<3>,types<4>,threading<4>,Improved Modules<3>
@anchor{whatsnew/3 10 traceback}@anchor{a4c}
@subsubsection traceback


The @ref{a4d,,format_exception()},
@ref{a4e,,format_exception_only()}, and
@ref{a4f,,print_exception()} functions can now take an exception object
as a positional-only argument.
(Contributed by Zackery Spytz and Matthias Bussonnier in bpo-26389@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26389}.)

@node types<4>,typing<6>,traceback<3>,Improved Modules<3>
@anchor{whatsnew/3 10 types}@anchor{a50}
@subsubsection types


Reintroduce the @ref{a51,,types.EllipsisType}, @ref{a52,,types.NoneType}
and @ref{a53,,types.NotImplementedType} classes, providing a new set
of types readily interpretable by type checkers.
(Contributed by Bas van Beek in bpo-41810@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41810}.)

@node typing<6>,unittest<6>,types<4>,Improved Modules<3>
@anchor{whatsnew/3 10 typing}@anchor{a54}
@subsubsection typing


For major changes, see @ref{9c1,,New Features Related to Type Hints}.

The behavior of @ref{a55,,typing.Literal} was changed to conform with 
@geindex Python 향상 제안; PEP 586
PEP 586@footnote{https://peps.python.org/pep-0586/}
and to match the behavior of static type checkers specified in the PEP.


@enumerate 

@item 
@code{Literal} now de-duplicates parameters.

@item 
Equality comparisons between @code{Literal} objects are now order independent.

@item 
@code{Literal} comparisons now respect types.  For example,
@code{Literal[0] == Literal[False]} previously evaluated to @code{True}.  It is
now @code{False}.  To support this change, the internally used type cache now
supports differentiating types.

@item 
@code{Literal} objects will now raise a @ref{198,,TypeError} exception during
equality comparisons if any of their parameters are not @ref{823,,hashable}.
Note that declaring @code{Literal} with unhashable parameters will not throw
an error:

@example
>>> from typing import Literal
>>> Literal[@{0@}]
>>> Literal[@{0@}] == Literal[@{False@}]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'set'
@end example
@end enumerate

(Contributed by Yurii Karabas in bpo-42345@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42345}.)

Add new function @ref{a56,,typing.is_typeddict()} to introspect if an annotation
is a @ref{332,,typing.TypedDict}.
(Contributed by Patrick Reader in bpo-41792@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41792}.)

Subclasses of @code{typing.Protocol} which only have data variables declared
will now raise a @code{TypeError} when checked with @code{isinstance} unless they
are decorated with @ref{673,,runtime_checkable()}.  Previously, these checks
passed silently.  Users should decorate their
subclasses with the @code{runtime_checkable()} decorator
if they want runtime protocols.
(Contributed by Yurii Karabas in bpo-38908@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38908}.)

Importing from the @code{typing.io} and @code{typing.re} submodules will now emit
@ref{1a3,,DeprecationWarning}.  These submodules have been deprecated since
Python 3.8 and will be removed in a future version of Python.  Anything
belonging to those submodules should be imported directly from
@ref{10a,,typing} instead.
(Contributed by Sebastian Rittau in bpo-38291@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38291}.)

@node unittest<6>,urllib parse,typing<6>,Improved Modules<3>
@anchor{whatsnew/3 10 unittest}@anchor{a57}
@subsubsection unittest


Add new method @ref{a58,,assertNoLogs()} to complement the
existing @ref{a59,,assertLogs()}. (Contributed by Kit Yan Choi
in bpo-39385@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39385}.)

@node urllib parse,xml<2>,unittest<6>,Improved Modules<3>
@anchor{whatsnew/3 10 urllib-parse}@anchor{a5a}
@subsubsection urllib.parse


Python versions earlier than Python 3.10 allowed using both @code{;} and @code{&} as
query parameter separators in @ref{31f,,urllib.parse.parse_qs()} and
@ref{31e,,urllib.parse.parse_qsl()}.  Due to security concerns, and to conform with
newer W3C recommendations, this has been changed to allow only a single
separator key, with @code{&} as the default.  This change also affects
@code{cgi.parse()} and @code{cgi.parse_multipart()} as they use the affected
functions internally.  For more details, please see their respective
documentation.
(Contributed by Adam Goldschmidt, Senthil Kumaran and Ken Jin in bpo-42967@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42967}.)

The presence of newline or tab characters in parts of a URL allows for some
forms of attacks. Following the WHATWG specification that updates 
@geindex RFC; RFC 3986
RFC 3986@footnote{https://datatracker.ietf.org/doc/html/rfc3986.html},
ASCII newline @code{\n}, @code{\r} and tab @code{\t} characters are stripped from the
URL by the parser in @ref{110,,urllib.parse} preventing such attacks. The removal
characters are controlled by a new module level variable
@code{urllib.parse._UNSAFE_URL_BYTES_TO_REMOVE}. (See gh-88048@footnote{https://github.com/python/cpython/issues/88048})

@node xml<2>,zipimport<3>,urllib parse,Improved Modules<3>
@anchor{whatsnew/3 10 xml}@anchor{a5b}
@subsubsection xml


Add a @ref{a5c,,LexicalHandler} class to the
@ref{130,,xml.sax.handler} module.
(Contributed by Jonathan Gossage and Zackery Spytz in bpo-35018@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35018}.)

@node zipimport<3>,,xml<2>,Improved Modules<3>
@anchor{whatsnew/3 10 zipimport}@anchor{a5d}
@subsubsection zipimport


Add methods related to 
@geindex Python 향상 제안; PEP 451
PEP 451@footnote{https://peps.python.org/pep-0451/}: @ref{a5e,,find_spec()},
@ref{a5f,,zipimport.zipimporter.create_module()}, and
@ref{339,,zipimport.zipimporter.exec_module()}.
(Contributed by Brett Cannon in bpo-42131@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42131}.)

Add @ref{a60,,invalidate_caches()} method.
(Contributed by Desmond Cheong in bpo-14678@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14678}.)

@node Optimizations<4>,Deprecated<6>,Improved Modules<3>,What’s New In Python 3 10
@anchor{whatsnew/3 10 optimizations}@anchor{a61}
@subsection Optimizations



@itemize *

@item 
Constructors @ref{169,,str()}, @ref{192,,bytes()} and @ref{344,,bytearray()} are now faster
(around 30–40% for small objects).
(Contributed by Serhiy Storchaka in bpo-41334@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41334}.)

@item 
The @ref{c3,,runpy} module now imports fewer modules.
The @code{python3 -m module-name} command startup time is 1.4x faster in
average. On Linux, @code{python3 -I -m module-name} imports 69 modules on Python
3.9, whereas it only imports 51 modules (-18) on Python 3.10.
(Contributed by Victor Stinner in bpo-41006@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41006} and bpo-41718@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41718}.)

@item 
The @code{LOAD_ATTR} instruction now uses new “per opcode cache” mechanism.  It
is about 36% faster now for regular attributes and 44% faster for slots.
(Contributed by Pablo Galindo and Yury Selivanov in bpo-42093@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42093} and Guido
van Rossum in bpo-42927@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42927}, based on ideas implemented originally in PyPy
and MicroPython.)

@item 
When building Python with @ref{a62,,--enable-optimizations} now
@code{-fno-semantic-interposition} is added to both the compile and link line.
This speeds builds of the Python interpreter created with @ref{a63,,--enable-shared}
with @code{gcc} by up to 30%. See this article@footnote{https://developers.redhat.com/blog/2020/06/25/red-hat-enterprise-linux-8-2-brings-faster-python-3-8-run-speeds/}
for more details. (Contributed by Victor Stinner and Pablo Galindo in
bpo-38980@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38980}.)

@item 
Use a new output buffer management code for @ref{14,,bz2} / @ref{8e,,lzma} /
@ref{139,,zlib} modules, and add @code{.readall()} function to
@code{_compression.DecompressReader} class. bz2 decompression is now 1.09x ~ 1.17x
faster, lzma decompression 1.20x ~ 1.32x faster, @code{GzipFile.read(-1)} 1.11x
~ 1.18x faster. (Contributed by Ma Lin, reviewed by Gregory P. Smith, in bpo-41486@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41486})

@item 
When using stringized annotations, annotations dicts for functions are no longer
created when the function is created.  Instead, they are stored as a tuple of
strings, and the function object lazily converts this into the annotations dict
on demand.  This optimization cuts the CPU time needed to define an annotated
function by half.
(Contributed by Yurii Karabas and Inada Naoki in bpo-42202@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42202}.)

@item 
Substring search functions such as @code{str1 in str2} and @code{str2.find(str1)}
now sometimes use Crochemore & Perrin’s “Two-Way” string searching
algorithm to avoid quadratic behavior on long strings.  (Contributed
by Dennis Sweeney in bpo-41972@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41972})

@item 
Add micro-optimizations to @code{_PyType_Lookup()} to improve type attribute cache lookup
performance in the common case of cache hits. This makes the interpreter 1.04 times faster
on average. (Contributed by Dino Viehland in bpo-43452@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43452}.)

@item 
The following built-in functions now support the faster 
@geindex Python 향상 제안; PEP 590
PEP 590@footnote{https://peps.python.org/pep-0590/} vectorcall calling convention:
@ref{19f,,map()}, @ref{a64,,filter()}, @ref{a65,,reversed()}, @ref{3c3,,bool()} and @ref{196,,float()}.
(Contributed by Donghee Na and Jeroen Demeyer in bpo-43575@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43575}, bpo-43287@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43287}, bpo-41922@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41922}, bpo-41873@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41873} and bpo-41870@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41870}.)

@item 
@ref{a66,,BZ2File} performance is improved by removing internal @code{RLock}.
This makes @code{BZ2File} thread unsafe in the face of multiple simultaneous
readers or writers, just like its equivalent classes in @ref{6b,,gzip} and
@ref{8e,,lzma} have always been.  (Contributed by Inada Naoki in bpo-43785@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43785}.)
@end itemize

@node Deprecated<6>,Removed<6>,Optimizations<4>,What’s New In Python 3 10
@anchor{whatsnew/3 10 deprecated}@anchor{a67}@anchor{whatsnew/3 10 whatsnew310-deprecated}@anchor{a3c}
@subsection Deprecated



@itemize *

@item 
Currently Python accepts numeric literals immediately followed by keywords,
for example @code{0in x}, @code{1or x}, @code{0if 1else 2}.  It allows confusing
and ambiguous expressions like @code{[0x1for x in y]} (which can be
interpreted as @code{[0x1 for x in y]} or @code{[0x1f or x in y]}).  Starting in
this release, a deprecation warning is raised if the numeric literal is
immediately followed by one of keywords @ref{349,,and}, @ref{17c,,else},
@ref{34a,,for}, @ref{181,,if}, @ref{34b,,in}, @ref{34c,,is} and @ref{34d,,or}.
In future releases it will be changed to syntax warning, and finally to
syntax error.
(Contributed by Serhiy Storchaka in bpo-43833@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43833}.)

@item 
Starting in this release, there will be a concerted effort to begin
cleaning up old import semantics that were kept for Python 2.7
compatibility. Specifically,
@code{find_loader()}/@code{find_module()}
(superseded by @ref{a68,,find_spec()}),
@ref{a69,,load_module()}
(superseded by @ref{a6a,,exec_module()}),
@code{module_repr()} (which the import system
takes care of for you), the @code{__package__} attribute
(superseded by @code{__spec__.parent}), the @code{__loader__} attribute
(superseded by @code{__spec__.loader}), and the @code{__cached__} attribute
(superseded by @code{__spec__.cached}) will slowly be removed (as well
as other classes and methods in @ref{7b,,importlib}).
@ref{71d,,ImportWarning} and/or @ref{1a3,,DeprecationWarning} will be raised
as appropriate to help identify code which needs updating during
this transition.

@item 
The entire @code{distutils} namespace is deprecated, to be removed in
Python 3.12. Refer to the @ref{933,,module changes}
section for more information.

@item 
Non-integer arguments to @ref{a6b,,random.randrange()} are deprecated.
The @ref{2ec,,ValueError} is deprecated in favor of a @ref{198,,TypeError}.
(Contributed by Serhiy Storchaka and Raymond Hettinger in bpo-37319@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37319}.)

@item 
The various @code{load_module()} methods of @ref{7b,,importlib} have been
documented as deprecated since Python 3.6, but will now also trigger
a @ref{1a3,,DeprecationWarning}. Use
@ref{a6a,,exec_module()} instead.
(Contributed by Brett Cannon in bpo-26131@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26131}.)

@item 
@code{zimport.zipimporter.load_module()} has been deprecated in
preference for @ref{339,,exec_module()}.
(Contributed by Brett Cannon in bpo-26131@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26131}.)

@item 
The use of @ref{a69,,load_module()} by the import
system now triggers an @ref{71d,,ImportWarning} as
@ref{a6a,,exec_module()} is preferred.
(Contributed by Brett Cannon in bpo-26131@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26131}.)

@item 
The use of @code{importlib.abc.MetaPathFinder.find_module()} and
@code{importlib.abc.PathEntryFinder.find_module()} by the import system now
trigger an @ref{71d,,ImportWarning} as
@ref{a68,,importlib.abc.MetaPathFinder.find_spec()} and
@ref{a6c,,importlib.abc.PathEntryFinder.find_spec()}
are preferred, respectively. You can use
@ref{a6d,,importlib.util.spec_from_loader()} to help in porting.
(Contributed by Brett Cannon in bpo-42134@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42134}.)

@item 
The use of @code{importlib.abc.PathEntryFinder.find_loader()} by the import
system now triggers an @ref{71d,,ImportWarning} as
@ref{a6c,,importlib.abc.PathEntryFinder.find_spec()} is preferred. You can use
@ref{a6d,,importlib.util.spec_from_loader()} to help in porting.
(Contributed by Brett Cannon in bpo-43672@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43672}.)

@item 
The various implementations of
@code{importlib.abc.MetaPathFinder.find_module()} (
@code{importlib.machinery.BuiltinImporter.find_module()},
@code{importlib.machinery.FrozenImporter.find_module()},
@code{importlib.machinery.WindowsRegistryFinder.find_module()},
@code{importlib.machinery.PathFinder.find_module()},
@code{importlib.abc.MetaPathFinder.find_module()} ),
@code{importlib.abc.PathEntryFinder.find_module()} (
@code{importlib.machinery.FileFinder.find_module()} ), and
@code{importlib.abc.PathEntryFinder.find_loader()} (
@code{importlib.machinery.FileFinder.find_loader()} )
now raise @ref{1a3,,DeprecationWarning} and are slated for removal in
Python 3.12 (previously they were documented as deprecated in Python 3.4).
(Contributed by Brett Cannon in bpo-42135@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42135}.)

@item 
@code{importlib.abc.Finder} is deprecated (including its sole method,
@code{find_module()}). Both
@ref{a6e,,importlib.abc.MetaPathFinder} and @ref{a6f,,importlib.abc.PathEntryFinder}
no longer inherit from the class. Users should inherit from one of these two
classes as appropriate instead.
(Contributed by Brett Cannon in bpo-42135@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42135}.)

@item 
The deprecations of @code{imp}, @code{importlib.find_loader()},
@code{importlib.util.set_package_wrapper()},
@code{importlib.util.set_loader_wrapper()},
@code{importlib.util.module_for_loader()},
@code{pkgutil.ImpImporter}, and
@code{pkgutil.ImpLoader} have all been updated to list Python 3.12 as the
slated version of removal (they began raising @ref{1a3,,DeprecationWarning} in
previous versions of Python).
(Contributed by Brett Cannon in bpo-43720@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43720}.)

@item 
The import system now uses the @code{__spec__} attribute on modules before
falling back on @code{module_repr()} for a module’s
@code{__repr__()} method. Removal of the use of @code{module_repr()} is scheduled
for Python 3.12.
(Contributed by Brett Cannon in bpo-42137@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42137}.)

@item 
@code{importlib.abc.Loader.module_repr()},
@code{importlib.machinery.FrozenLoader.module_repr()}, and
@code{importlib.machinery.BuiltinLoader.module_repr()} are deprecated and
slated for removal in Python 3.12.
(Contributed by Brett Cannon in bpo-42136@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42136}.)

@item 
@code{sqlite3.OptimizedUnicode} has been undocumented and obsolete since Python
3.3, when it was made an alias to @ref{169,,str}.  It is now deprecated,
scheduled for removal in Python 3.12.
(Contributed by Erlend E. Aasland in bpo-42264@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42264}.)

@item 
The undocumented built-in function @code{sqlite3.enable_shared_cache} is now
deprecated, scheduled for removal in Python 3.12.  Its use is strongly
discouraged by the SQLite3 documentation.  See the SQLite3 docs@footnote{https://sqlite.org/c3ref/enable_shared_cache.html} for more details.
If a shared cache must be used, open the database in URI mode using the
@code{cache=shared} query parameter.
(Contributed by Erlend E. Aasland in bpo-24464@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24464}.)

@item 
The following @code{threading} methods are now deprecated:


@itemize *

@item 
@code{threading.currentThread} => @ref{35e,,threading.current_thread()}

@item 
@code{threading.activeCount} => @ref{35f,,threading.active_count()}

@item 
@code{threading.Condition.notifyAll} =>
@ref{359,,threading.Condition.notify_all()}

@item 
@code{threading.Event.isSet} => @ref{35a,,threading.Event.is_set()}

@item 
@code{threading.Thread.setName} => @ref{2a0,,threading.Thread.name}

@item 
@code{threading.thread.getName} => @ref{2a0,,threading.Thread.name}

@item 
@code{threading.Thread.isDaemon} => @ref{35c,,threading.Thread.daemon}

@item 
@code{threading.Thread.setDaemon} => @ref{35c,,threading.Thread.daemon}
@end itemize

(Contributed by Jelle Zijlstra in gh-87889@footnote{https://github.com/python/cpython/issues/87889}.)

@item 
@code{pathlib.Path.link_to()} is deprecated and slated for removal in
Python 3.12. Use @ref{a22,,pathlib.Path.hardlink_to()} instead.
(Contributed by Barney Gale in bpo-39950@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39950}.)

@item 
@code{cgi.log()} is deprecated and slated for removal in Python 3.12.
(Contributed by Inada Naoki in bpo-41139@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41139}.)

@item 
The following @ref{d5,,ssl} features have been deprecated since Python 3.6,
Python 3.7, or OpenSSL 1.1.0 and will be removed in 3.11:


@itemize *

@item 
@code{OP_NO_SSLv2}, @code{OP_NO_SSLv3}, @code{OP_NO_TLSv1},
@code{OP_NO_TLSv1_1}, @code{OP_NO_TLSv1_2}, and
@code{OP_NO_TLSv1_3} are replaced by
@ref{a70,,minimum_version} and
@ref{a71,,maximum_version}.

@item 
@code{PROTOCOL_SSLv2}, @code{PROTOCOL_SSLv3},
@code{PROTOCOL_SSLv23}, @code{PROTOCOL_TLSv1},
@code{PROTOCOL_TLSv1_1}, @code{PROTOCOL_TLSv1_2}, and
@code{PROTOCOL_TLS} are deprecated in favor of
@ref{a72,,PROTOCOL_TLS_CLIENT} and @ref{a73,,PROTOCOL_TLS_SERVER}

@item 
@code{wrap_socket()} is replaced by @ref{747,,ssl.SSLContext.wrap_socket()}

@item 
@code{match_hostname()}

@item 
@code{RAND_pseudo_bytes()}, @code{RAND_egd()}

@item 
NPN features like @ref{a74,,ssl.SSLSocket.selected_npn_protocol()} and
@ref{358,,ssl.SSLContext.set_npn_protocols()} are replaced by ALPN.
@end itemize

@item 
The threading debug (@code{PYTHONTHREADDEBUG} environment variable) is
deprecated in Python 3.10 and will be removed in Python 3.12. This feature
requires a @ref{508,,debug build of Python}.
(Contributed by Victor Stinner in bpo-44584@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44584}.)

@item 
Importing from the @code{typing.io} and @code{typing.re} submodules will now emit
@ref{1a3,,DeprecationWarning}.  These submodules will be removed in a future version
of Python.  Anything belonging to these submodules should be imported directly
from @ref{10a,,typing} instead.
(Contributed by Sebastian Rittau in bpo-38291@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38291}.)
@end itemize

@node Removed<6>,Porting to Python 3 10,Deprecated<6>,What’s New In Python 3 10
@anchor{whatsnew/3 10 removed}@anchor{a75}@anchor{whatsnew/3 10 whatsnew310-removed}@anchor{a76}
@subsection Removed



@itemize *

@item 
Removed special methods @code{__int__}, @code{__float__}, @code{__floordiv__},
@code{__mod__}, @code{__divmod__}, @code{__rfloordiv__}, @code{__rmod__} and
@code{__rdivmod__} of the @ref{197,,complex} class.  They always raised
a @ref{198,,TypeError}.
(Contributed by Serhiy Storchaka in bpo-41974@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41974}.)

@item 
The @code{ParserBase.error()} method from the private and undocumented @code{_markupbase}
module has been removed.  @ref{a77,,html.parser.HTMLParser} is the only subclass of
@code{ParserBase} and its @code{error()} implementation was already removed in
Python 3.5.
(Contributed by Berker Peksag in bpo-31844@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31844}.)

@item 
Removed the @code{unicodedata.ucnhash_CAPI} attribute which was an internal
PyCapsule object. The related private @code{_PyUnicode_Name_CAPI} structure was
moved to the internal C API.
(Contributed by Victor Stinner in bpo-42157@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42157}.)

@item 
Removed the @code{parser} module, which was deprecated in 3.9 due to the
switch to the new PEG parser, as well as all the C source and header files
that were only being used by the old parser, including @code{node.h}, @code{parser.h},
@code{graminit.h} and @code{grammar.h}.

@item 
Removed the Public C API functions @code{PyParser_SimpleParseStringFlags},
@code{PyParser_SimpleParseStringFlagsFilename},
@code{PyParser_SimpleParseFileFlags} and @code{PyNode_Compile}
that were deprecated in 3.9 due to the switch to the new PEG parser.

@item 
Removed the @code{formatter} module, which was deprecated in Python 3.4.
It is somewhat obsolete, little used, and not tested. It was originally
scheduled to be removed in Python 3.6, but such removals were delayed until
after Python 2.7 EOL. Existing users should copy whatever classes they use
into their code.
(Contributed by Donghee Na and Terry J. Reedy in bpo-42299@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42299}.)

@item 
Removed the @code{PyModule_GetWarningsModule()} function that was useless
now due to the @code{_warnings} module was converted to a builtin module in 2.6.
(Contributed by Hai Shi in bpo-42599@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42599}.)

@item 
Remove deprecated aliases to @ref{a78,,Collections 추상 베이스 클래스} from
the @ref{1e,,collections} module.
(Contributed by Victor Stinner in bpo-37324@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37324}.)

@item 
The @code{loop} parameter has been removed from most of @ref{b,,asyncio}‘s
@ref{a79,,high-level API} following deprecation
in Python 3.8.  The motivation behind this change is multifold:


@enumerate 

@item 
This simplifies the high-level API.

@item 
The functions in the high-level API have been implicitly getting the
current thread’s running event loop since Python 3.7.  There isn’t a need to
pass the event loop to the API in most normal use cases.

@item 
Event loop passing is error-prone especially when dealing with loops
running in different threads.
@end enumerate

Note that the low-level API will still accept @code{loop}.
See @ref{a7a,,Changes in the Python API} for examples of how to replace existing code.

(Contributed by Yurii Karabas, Andrew Svetlov, Yury Selivanov and Kyle Stanley
in bpo-42392@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42392}.)
@end itemize

@node Porting to Python 3 10,CPython bytecode changes<4>,Removed<6>,What’s New In Python 3 10
@anchor{whatsnew/3 10 porting-to-python-3-10}@anchor{a7b}
@subsection Porting to Python 3.10


This section lists previously described changes and other bugfixes
that may require changes to your code.

@menu
* Changes in the Python syntax:: 
* Changes in the Python API: Changes in the Python API<3>. 
* Changes in the C API: Changes in the C API<2>. 

@end menu

@node Changes in the Python syntax,Changes in the Python API<3>,,Porting to Python 3 10
@anchor{whatsnew/3 10 changes-in-the-python-syntax}@anchor{a7c}
@subsubsection Changes in the Python syntax



@itemize *

@item 
Deprecation warning is now emitted when compiling previously valid syntax
if the numeric literal is immediately followed by a keyword (like in @code{0in x}).
In future releases it will be changed to syntax warning, and finally to a
syntax error.  To get rid of the warning and make the code compatible with
future releases just add a space between the numeric literal and the
following keyword.
(Contributed by Serhiy Storchaka in bpo-43833@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43833}.)
@end itemize

@node Changes in the Python API<3>,Changes in the C API<2>,Changes in the Python syntax,Porting to Python 3 10
@anchor{whatsnew/3 10 changes-in-the-python-api}@anchor{a7d}@anchor{whatsnew/3 10 changes-python-api}@anchor{a7a}
@subsubsection Changes in the Python API



@itemize *

@item 
The `etype' parameters of the @ref{a4d,,format_exception()},
@ref{a4e,,format_exception_only()}, and
@ref{a4f,,print_exception()} functions in the @ref{104,,traceback} module
have been renamed to `exc'.
(Contributed by Zackery Spytz and Matthias Bussonnier in bpo-26389@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26389}.)

@item 
@ref{d,,atexit}: At Python exit, if a callback registered with
@ref{a7e,,atexit.register()} fails, its exception is now logged. Previously, only
some exceptions were logged, and the last exception was always silently
ignored.
(Contributed by Victor Stinner in bpo-42639@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42639}.)

@item 
@ref{9eb,,collections.abc.Callable} generic now flattens type parameters, similar
to what @ref{9c8,,typing.Callable} currently does.  This means that
@code{collections.abc.Callable[[int, str], str]} will have @code{__args__} of
@code{(int, str, str)}; previously this was @code{([int, str], str)}.  Code which
accesses the arguments via @ref{2ac,,typing.get_args()} or @code{__args__} need to account
for this change.  Furthermore, @ref{198,,TypeError} may be raised for invalid forms
of parameterizing @code{collections.abc.Callable} which may have passed
silently in Python 3.9.
(Contributed by Ken Jin in bpo-42195@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42195}.)

@item 
@ref{a7f,,socket.htons()} and @ref{a80,,socket.ntohs()} now raise @ref{a81,,OverflowError}
instead of @ref{1a3,,DeprecationWarning} if the given parameter will not fit in
a 16-bit unsigned integer.
(Contributed by Erlend E. Aasland in bpo-42393@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42393}.)

@item 
The @code{loop} parameter has been removed from most of @ref{b,,asyncio}‘s
@ref{a79,,high-level API} following deprecation
in Python 3.8.

A coroutine that currently looks like this:

@example
async def foo(loop):
    await asyncio.sleep(1, loop=loop)
@end example

Should be replaced with this:

@example
async def foo():
    await asyncio.sleep(1)
@end example

If @code{foo()} was specifically designed `not' to run in the current thread’s
running event loop (e.g. running in another thread’s event loop), consider
using @ref{a82,,asyncio.run_coroutine_threadsafe()} instead.

(Contributed by Yurii Karabas, Andrew Svetlov, Yury Selivanov and Kyle Stanley
in bpo-42392@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42392}.)

@item 
The @ref{a83,,types.FunctionType} constructor now inherits the current builtins
if the `globals' dictionary has no @code{"__builtins__"} key, rather than using
@code{@{"None": None@}} as builtins: same behavior as @ref{4a4,,eval()} and
@ref{4a3,,exec()} functions.  Defining a function with @code{def function(...): ...}
in Python is not affected, globals cannot be overridden with this syntax: it
also inherits the current builtins.
(Contributed by Victor Stinner in bpo-42990@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42990}.)
@end itemize

@node Changes in the C API<2>,,Changes in the Python API<3>,Porting to Python 3 10
@anchor{whatsnew/3 10 changes-in-the-c-api}@anchor{a84}
@subsubsection Changes in the C API



@itemize *

@item 
The C API functions @code{PyParser_SimpleParseStringFlags},
@code{PyParser_SimpleParseStringFlagsFilename},
@code{PyParser_SimpleParseFileFlags}, @code{PyNode_Compile} and the type
used by these functions, @code{struct _node}, were removed due to the switch
to the new PEG parser.

Source should be now be compiled directly to a code object using, for
example, @ref{a85,,Py_CompileString()}. The resulting code object can then be
evaluated using, for example, @ref{a86,,PyEval_EvalCode()}.

Specifically:


@itemize *

@item 
A call to @code{PyParser_SimpleParseStringFlags} followed by
@code{PyNode_Compile} can be replaced by calling @ref{a85,,Py_CompileString()}.

@item 
There is no direct replacement for @code{PyParser_SimpleParseFileFlags}.
To compile code from a @code{FILE *} argument, you will need to read
the file in C and pass the resulting buffer to @ref{a85,,Py_CompileString()}.

@item 
To compile a file given a @code{char *} filename, explicitly open the file, read
it and compile the result. One way to do this is using the @ref{83,,io}
module with @ref{3dc,,PyImport_ImportModule()}, @ref{63e,,PyObject_CallMethod()},
@ref{a87,,PyBytes_AsString()} and @ref{a85,,Py_CompileString()},
as sketched below. (Declarations and error handling are omitted.)

@example
io_module = Import_ImportModule("io");
fileobject = PyObject_CallMethod(io_module, "open", "ss", filename, "rb");
source_bytes_object = PyObject_CallMethod(fileobject, "read", "");
result = PyObject_CallMethod(fileobject, "close", "");
source_buf = PyBytes_AsString(source_bytes_object);
code = Py_CompileString(source_buf, filename, Py_file_input);
@end example

@item 
For @code{FrameObject} objects, the @ref{a88,,f_lasti} member now represents a wordcode
offset instead of a simple offset into the bytecode string. This means that this
number needs to be multiplied by 2 to be used with APIs that expect a byte offset
instead (like @ref{a89,,PyCode_Addr2Line()} for example). Notice as well that the
@code{f_lasti} member of @code{FrameObject} objects is not considered stable: please
use @ref{98d,,PyFrame_GetLineNumber()} instead.
@end itemize
@end itemize

@node CPython bytecode changes<4>,Build Changes<3>,Porting to Python 3 10,What’s New In Python 3 10
@anchor{whatsnew/3 10 cpython-bytecode-changes}@anchor{a8a}
@subsection CPython bytecode changes



@itemize *

@item 
The @code{MAKE_FUNCTION} instruction now accepts either a dict or a tuple of
strings as the function’s annotations.
(Contributed by Yurii Karabas and Inada Naoki in bpo-42202@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42202}.)
@end itemize

@node Build Changes<3>,C API Changes<3>,CPython bytecode changes<4>,What’s New In Python 3 10
@anchor{whatsnew/3 10 build-changes}@anchor{a8b}
@subsection Build Changes



@itemize *

@item 
@geindex Python 향상 제안; PEP 644
PEP 644@footnote{https://peps.python.org/pep-0644/}: Python now requires OpenSSL 1.1.1 or newer. OpenSSL 1.0.2 is no
longer supported.
(Contributed by Christian Heimes in bpo-43669@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43669}.)

@item 
The C99 functions @code{snprintf()} and @code{vsnprintf()} are now required
to build Python.
(Contributed by Victor Stinner in bpo-36020@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36020}.)

@item 
@ref{d4,,sqlite3} requires SQLite 3.7.15 or higher. (Contributed by Sergey Fedoseev
and Erlend E. Aasland in bpo-40744@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40744} and bpo-40810@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40810}.)

@item 
The @ref{d,,atexit} module must now always be built as a built-in module.
(Contributed by Victor Stinner in bpo-42639@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42639}.)

@item 
Add @ref{a8c,,--disable-test-modules} option to the @code{configure} script:
don’t build nor install test modules.
(Contributed by Xavier de Gaye, Thomas Petazzoni and Peixing Xin in bpo-27640@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27640}.)

@item 
Add @ref{a8d,,--with-wheel-pkg-dir=PATH option}
to the @code{./configure} script. If
specified, the @ref{59,,ensurepip} module looks for @code{setuptools} and @code{pip}
wheel packages in this directory: if both are present, these wheel packages
are used instead of ensurepip bundled wheel packages.

Some Linux distribution packaging policies recommend against bundling
dependencies. For example, Fedora installs wheel packages in the
@code{/usr/share/python-wheels/} directory and don’t install the
@code{ensurepip._bundled} package.

(Contributed by Victor Stinner in bpo-42856@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42856}.)

@item 
Add a new @ref{a8e,,configure --without-static-libpython option} to not build the @code{libpythonMAJOR.MINOR.a}
static library and not install the @code{python.o} object file.

(Contributed by Victor Stinner in bpo-43103@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43103}.)

@item 
The @code{configure} script now uses the @code{pkg-config} utility, if available,
to detect the location of Tcl/Tk headers and libraries.  As before, those
locations can be explicitly specified with the @code{--with-tcltk-includes}
and @code{--with-tcltk-libs} configuration options.
(Contributed by Manolis Stamatogiannakis in bpo-42603@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42603}.)

@item 
Add @ref{a8f,,--with-openssl-rpath} option to @code{configure} script. The option
simplifies building Python with a custom OpenSSL installation, e.g.
@code{./configure --with-openssl=/path/to/openssl --with-openssl-rpath=auto}.
(Contributed by Christian Heimes in bpo-43466@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43466}.)
@end itemize

@node C API Changes<3>,Notable security feature in 3 10 7,Build Changes<3>,What’s New In Python 3 10
@anchor{whatsnew/3 10 c-api-changes}@anchor{a90}
@subsection C API Changes


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

@end menu

@node PEP 652 Maintaining the Stable ABI,New Features<6>,,C API Changes<3>
@anchor{whatsnew/3 10 pep-652-maintaining-the-stable-abi}@anchor{a91}
@subsubsection PEP 652: Maintaining the Stable ABI


The Stable ABI (Application Binary Interface) for extension modules or
embedding Python is now explicitly defined.
@ref{774,,C API Stability} describes C API and ABI stability guarantees along with best
practices for using the Stable ABI.

(Contributed by Petr Viktorin in 
@geindex Python 향상 제안; PEP 652
PEP 652@footnote{https://peps.python.org/pep-0652/} and bpo-43795@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43795}.)

@node New Features<6>,Porting to Python 3 10<2>,PEP 652 Maintaining the Stable ABI,C API Changes<3>
@anchor{whatsnew/3 10 id1}@anchor{a92}
@subsubsection New Features



@itemize *

@item 
The result of @ref{a93,,PyNumber_Index()} now always has exact type @ref{19b,,int}.
Previously, the result could have been an instance of a subclass of @code{int}.
(Contributed by Serhiy Storchaka in bpo-40792@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40792}.)

@item 
Add a new @ref{a94,,orig_argv} member to the @ref{3f7,,PyConfig}
structure: the list of the original command line arguments passed to the
Python executable.
(Contributed by Victor Stinner in bpo-23427@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23427}.)

@item 
The @ref{a95,,PyDateTime_DATE_GET_TZINFO()} and
@ref{a96,,PyDateTime_TIME_GET_TZINFO()} macros have been added for accessing
the @code{tzinfo} attributes of @ref{4e2,,datetime.datetime} and
@ref{1fb,,datetime.time} objects.
(Contributed by Zackery Spytz in bpo-30155@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30155}.)

@item 
Add a @ref{a97,,PyCodec_Unregister()} function to unregister a codec
search function.
(Contributed by Hai Shi in bpo-41842@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41842}.)

@item 
The @ref{a98,,PyIter_Send()} function was added to allow
sending value into iterator without raising @code{StopIteration} exception.
(Contributed by Vladimir Matveev in bpo-41756@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41756}.)

@item 
Add @ref{a99,,PyUnicode_AsUTF8AndSize()} to the limited C API.
(Contributed by Alex Gaynor in bpo-41784@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41784}.)

@item 
Add @ref{607,,PyModule_AddObjectRef()} function: similar to
@ref{608,,PyModule_AddObject()} but don’t steal a reference to the value on
success.
(Contributed by Victor Stinner in bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}.)

@item 
Add @ref{a9a,,Py_NewRef()} and @ref{a9b,,Py_XNewRef()} functions to increment the
reference count of an object and return the object.
(Contributed by Victor Stinner in bpo-42262@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42262}.)

@item 
The @ref{79d,,PyType_FromSpecWithBases()} and @ref{772,,PyType_FromModuleAndSpec()}
functions now accept a single class as the `bases' argument.
(Contributed by Serhiy Storchaka in bpo-42423@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42423}.)

@item 
The @ref{772,,PyType_FromModuleAndSpec()} function now accepts NULL @code{tp_doc}
slot.
(Contributed by Hai Shi in bpo-41832@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41832}.)

@item 
The @ref{a9c,,PyType_GetSlot()} function can accept
@ref{982,,static types}.
(Contributed by Hai Shi and Petr Viktorin in bpo-41073@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41073}.)

@item 
Add a new @ref{a9d,,PySet_CheckExact()} function to the C-API to check if an
object is an instance of @ref{184,,set} but not an instance of a subtype.
(Contributed by Pablo Galindo in bpo-43277@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43277}.)

@item 
Add @ref{a9e,,PyErr_SetInterruptEx()} which allows passing a signal number
to simulate.
(Contributed by Antoine Pitrou in bpo-43356@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43356}.)

@item 
The limited C API is now supported if @ref{508,,Python is built in debug mode} (if the @code{Py_DEBUG} macro is defined). In the limited C API,
the @ref{78e,,Py_INCREF()} and @ref{78f,,Py_DECREF()} functions are now implemented
as opaque function
calls, rather than accessing directly the @ref{a9f,,PyObject.ob_refcnt}
member, if Python is built in debug mode and the @code{Py_LIMITED_API} macro
targets Python 3.10 or newer. It became possible to support the limited C API
in debug mode because the @ref{5dc,,PyObject} structure is the same in release
and debug mode since Python 3.8 (see bpo-36465@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36465}).

The limited C API is still not supported in the @ref{634,,--with-trace-refs}
special build (@code{Py_TRACE_REFS} macro).
(Contributed by Victor Stinner in bpo-43688@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43688}.)

@item 
Add the @ref{aa0,,Py_Is(x@comma{} y)} function to test if the `x' object is
the `y' object, the same as @code{x is y} in Python. Add also the
@ref{aa1,,Py_IsNone()}, @ref{aa2,,Py_IsTrue()}, @ref{aa3,,Py_IsFalse()} functions to
test if an object is, respectively, the @code{None} singleton, the @code{True}
singleton or the @code{False} singleton.
(Contributed by Victor Stinner in bpo-43753@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43753}.)

@item 
Add new functions to control the garbage collector from C code:
@ref{aa4,,PyGC_Enable()},
@ref{aa5,,PyGC_Disable()},
@ref{aa6,,PyGC_IsEnabled()}.
These functions allow to activate, deactivate and query the state of the garbage collector from C code without
having to import the @ref{64,,gc} module.

@item 
Add a new @ref{7a1,,Py_TPFLAGS_DISALLOW_INSTANTIATION} type flag to disallow
creating type instances.
(Contributed by Victor Stinner in bpo-43916@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43916}.)

@item 
Add a new @ref{3cf,,Py_TPFLAGS_IMMUTABLETYPE} type flag for creating immutable
type objects: type attributes cannot be set nor deleted.
(Contributed by Victor Stinner and Erlend E. Aasland in bpo-43908@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43908}.)
@end itemize

@node Porting to Python 3 10<2>,Deprecated<7>,New Features<6>,C API Changes<3>
@anchor{whatsnew/3 10 id2}@anchor{aa7}
@subsubsection Porting to Python 3.10



@itemize *

@item 
The @code{PY_SSIZE_T_CLEAN} macro must now be defined to use
@ref{3c1,,PyArg_ParseTuple()} and @ref{3c2,,Py_BuildValue()} formats which use
@code{#}: @code{es#}, @code{et#}, @code{s#}, @code{u#}, @code{y#}, @code{z#}, @code{U#} and @code{Z#}.
See @ref{3d5,,인자 구문 분석과 값 구축} and 
@geindex Python 향상 제안; PEP 353
PEP 353@footnote{https://peps.python.org/pep-0353/}.
(Contributed by Victor Stinner in bpo-40943@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40943}.)

@item 
Since @ref{2cf,,Py_REFCNT()} is changed to the inline static function,
@code{Py_REFCNT(obj) = new_refcnt} must be replaced with @code{Py_SET_REFCNT(obj, new_refcnt)}:
see @ref{aa8,,Py_SET_REFCNT()} (available since Python 3.9). For backward
compatibility, this macro can be used:

@example
#if PY_VERSION_HEX < 0x030900A4
#  define Py_SET_REFCNT(obj, refcnt) ((Py_REFCNT(obj) = (refcnt)), (void)0)
#endif
@end example

(Contributed by Victor Stinner in bpo-39573@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39573}.)

@item 
Calling @ref{626,,PyDict_GetItem()} without @ref{164,,GIL} held had been allowed
for historical reason. It is no longer allowed.
(Contributed by Victor Stinner in bpo-40839@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40839}.)

@item 
@code{PyUnicode_FromUnicode(NULL, size)} and @code{PyUnicode_FromStringAndSize(NULL, size)}
raise @code{DeprecationWarning} now.  Use @ref{aa9,,PyUnicode_New()} to allocate
Unicode object without initial data.
(Contributed by Inada Naoki in bpo-36346@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36346}.)

@item 
The private @code{_PyUnicode_Name_CAPI} structure of the PyCapsule API
@code{unicodedata.ucnhash_CAPI} has been moved to the internal C API.
(Contributed by Victor Stinner in bpo-42157@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42157}.)

@item 
@ref{3e3,,Py_GetPath()}, @ref{3e5,,Py_GetPrefix()}, @ref{3e9,,Py_GetExecPrefix()},
@ref{3ec,,Py_GetProgramFullPath()}, @ref{3ef,,Py_GetPythonHome()} and
@ref{3ee,,Py_GetProgramName()} functions now return @code{NULL} if called before
@ref{460,,Py_Initialize()} (before Python is initialized). Use the new
@ref{644,,파이썬 초기화 구성} API to get the @ref{aaa,,Python Path Configuration}.
(Contributed by Victor Stinner in bpo-42260@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42260}.)

@item 
@ref{62d,,PyList_SET_ITEM()}, @ref{62c,,PyTuple_SET_ITEM()} and
@ref{aab,,PyCell_SET()} macros can no longer be used as l-value or r-value.
For example, @code{x = PyList_SET_ITEM(a, b, c)} and
@code{PyList_SET_ITEM(a, b, c) = x} now fail with a compiler error. It prevents
bugs like @code{if (PyList_SET_ITEM (a, b, c) < 0) ...} test.
(Contributed by Zackery Spytz and Victor Stinner in bpo-30459@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30459}.)

@item 
The non-limited API files @code{odictobject.h}, @code{parser_interface.h},
@code{picklebufobject.h}, @code{pyarena.h}, @code{pyctype.h}, @code{pydebug.h},
@code{pyfpe.h}, and @code{pytime.h} have been moved to the @code{Include/cpython}
directory. These files must not be included directly, as they are already
included in @code{Python.h}; see @ref{986,,인클루드 파일}. If they have
been included directly, consider including @code{Python.h} instead.
(Contributed by Nicholas Sim in bpo-35134@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35134}.)

@item 
Use the @ref{3cf,,Py_TPFLAGS_IMMUTABLETYPE} type flag to create immutable type
objects. Do not rely on @ref{aac,,Py_TPFLAGS_HEAPTYPE} to decide if a type
object is mutable or not; check if @code{Py_TPFLAGS_IMMUTABLETYPE} is set
instead.
(Contributed by Victor Stinner and Erlend E. Aasland in bpo-43908@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43908}.)

@item 
The undocumented function @code{Py_FrozenMain} has been removed from the
limited API. The function is mainly useful for custom builds of Python.
(Contributed by Petr Viktorin in bpo-26241@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26241}.)
@end itemize

@node Deprecated<7>,Removed<7>,Porting to Python 3 10<2>,C API Changes<3>
@anchor{whatsnew/3 10 id3}@anchor{aad}
@subsubsection Deprecated



@itemize *

@item 
The @code{PyUnicode_InternImmortal()} function is now deprecated
and will be removed in Python 3.12: use @ref{aae,,PyUnicode_InternInPlace()}
instead.
(Contributed by Victor Stinner in bpo-41692@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41692}.)
@end itemize

@node Removed<7>,,Deprecated<7>,C API Changes<3>
@anchor{whatsnew/3 10 id4}@anchor{aaf}
@subsubsection Removed



@itemize *

@item 
Removed @code{Py_UNICODE_str*} functions manipulating @code{Py_UNICODE*} strings.
(Contributed by Inada Naoki in bpo-41123@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41123}.)


@itemize *

@item 
@code{Py_UNICODE_strlen}: use @ref{ab0,,PyUnicode_GetLength()} or
@ref{ab1,,PyUnicode_GET_LENGTH}

@item 
@code{Py_UNICODE_strcat}: use @ref{ab2,,PyUnicode_CopyCharacters()} or
@ref{629,,PyUnicode_FromFormat()}

@item 
@code{Py_UNICODE_strcpy}, @code{Py_UNICODE_strncpy}: use
@ref{ab2,,PyUnicode_CopyCharacters()} or @ref{ab3,,PyUnicode_Substring()}

@item 
@code{Py_UNICODE_strcmp}: use @ref{ab4,,PyUnicode_Compare()}

@item 
@code{Py_UNICODE_strncmp}: use @ref{ab5,,PyUnicode_Tailmatch()}

@item 
@code{Py_UNICODE_strchr}, @code{Py_UNICODE_strrchr}: use
@ref{ab6,,PyUnicode_FindChar()}
@end itemize

@item 
Removed @code{PyUnicode_GetMax()}. Please migrate to new (
@geindex Python 향상 제안; PEP 393
PEP 393@footnote{https://peps.python.org/pep-0393/}) APIs.
(Contributed by Inada Naoki in bpo-41103@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41103}.)

@item 
Removed @code{PyLong_FromUnicode()}. Please migrate to @ref{ab7,,PyLong_FromUnicodeObject()}.
(Contributed by Inada Naoki in bpo-41103@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41103}.)

@item 
Removed @code{PyUnicode_AsUnicodeCopy()}. Please use @ref{ab8,,PyUnicode_AsUCS4Copy()} or
@ref{ab9,,PyUnicode_AsWideCharString()}
(Contributed by Inada Naoki in bpo-41103@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41103}.)

@item 
Removed @code{_Py_CheckRecursionLimit} variable: it has been replaced by
@code{ceval.recursion_limit} of the @ref{aba,,PyInterpreterState} structure.
(Contributed by Victor Stinner in bpo-41834@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41834}.)

@item 
Removed undocumented macros @code{Py_ALLOW_RECURSION} and
@code{Py_END_ALLOW_RECURSION} and the @code{recursion_critical} field of the
@ref{aba,,PyInterpreterState} structure.
(Contributed by Serhiy Storchaka in bpo-41936@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41936}.)

@item 
Removed the undocumented @code{PyOS_InitInterrupts()} function. Initializing
Python already implicitly installs signal handlers: see
@ref{abb,,PyConfig.install_signal_handlers}.
(Contributed by Victor Stinner in bpo-41713@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41713}.)

@item 
Remove the @code{PyAST_Validate()} function. It is no longer possible to build a
AST object (@code{mod_ty} type) with the public C API. The function was already
excluded from the limited C API (
@geindex Python 향상 제안; PEP 384
PEP 384@footnote{https://peps.python.org/pep-0384/}).
(Contributed by Victor Stinner in bpo-43244@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43244}.)

@item 
Remove the @code{symtable.h} header file and the undocumented functions:


@itemize *

@item 
@code{PyST_GetScope()}

@item 
@code{PySymtable_Build()}

@item 
@code{PySymtable_BuildObject()}

@item 
@code{PySymtable_Free()}

@item 
@code{Py_SymtableString()}

@item 
@code{Py_SymtableStringObject()}
@end itemize

The @code{Py_SymtableString()} function was part the stable ABI by mistake but
it could not be used, because the @code{symtable.h} header file was excluded
from the limited C API.

Use Python @ref{de,,symtable} module instead.
(Contributed by Victor Stinner in bpo-43244@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43244}.)

@item 
Remove @ref{7a4,,PyOS_ReadlineFunctionPointer()} from the limited C API headers
and from @code{python3.dll}, the library that provides the stable ABI on
Windows. Since the function takes a @code{FILE*} argument, its ABI stability
cannot be guaranteed.
(Contributed by Petr Viktorin in bpo-43868@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43868}.)

@item 
Remove @code{ast.h}, @code{asdl.h}, and @code{Python-ast.h} header files.
These functions were undocumented and excluded from the limited C API.
Most names defined by these header files were not prefixed by @code{Py} and so
could create names conflicts. For example, @code{Python-ast.h} defined a
@code{Yield} macro which was conflict with the @code{Yield} name used by the
Windows @code{<winbase.h>} header. Use the Python @ref{9,,ast} module instead.
(Contributed by Victor Stinner in bpo-43244@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43244}.)

@item 
Remove the compiler and parser functions using @code{struct _mod} type, because
the public AST C API was removed:


@itemize *

@item 
@code{PyAST_Compile()}

@item 
@code{PyAST_CompileEx()}

@item 
@code{PyAST_CompileObject()}

@item 
@code{PyFuture_FromAST()}

@item 
@code{PyFuture_FromASTObject()}

@item 
@code{PyParser_ASTFromFile()}

@item 
@code{PyParser_ASTFromFileObject()}

@item 
@code{PyParser_ASTFromFilename()}

@item 
@code{PyParser_ASTFromString()}

@item 
@code{PyParser_ASTFromStringObject()}
@end itemize

These functions were undocumented and excluded from the limited C API.
(Contributed by Victor Stinner in bpo-43244@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43244}.)

@item 
Remove the @code{pyarena.h} header file with functions:


@itemize *

@item 
@code{PyArena_New()}

@item 
@code{PyArena_Free()}

@item 
@code{PyArena_Malloc()}

@item 
@code{PyArena_AddPyObject()}
@end itemize

These functions were undocumented, excluded from the limited C API, and were
only used internally by the compiler.
(Contributed by Victor Stinner in bpo-43244@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43244}.)

@item 
The @code{PyThreadState.use_tracing} member has been removed to optimize Python.
(Contributed by Mark Shannon in bpo-43760@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43760}.)
@end itemize

@node Notable security feature in 3 10 7,Notable security feature in 3 10 8,C API Changes<3>,What’s New In Python 3 10
@anchor{whatsnew/3 10 notable-security-feature-in-3-10-7}
@subsection Notable security feature in 3.10.7


Converting between @ref{19b,,int} and @ref{169,,str} in bases other than 2
(binary), 4, 8 (octal), 16 (hexadecimal), or 32 such as base 10 (decimal)
now raises a @ref{2ec,,ValueError} if the number of digits in string form is
above a limit to avoid potential denial of service attacks due to the
algorithmic complexity. This is a mitigation for 
@geindex Common Vulnerabilities and Exposures; CVE 2020-10735
CVE 2020-10735@footnote{https://www.cve.org/CVERecord?id=CVE-2020-10735}.
This limit can be configured or disabled by environment variable, command
line flag, or @ref{df,,sys} APIs. See the @ref{80a,,integer string conversion length limitation} documentation.  The default limit
is 4300 digits in string form.

@node Notable security feature in 3 10 8,Notable changes in 3 10 12,Notable security feature in 3 10 7,What’s New In Python 3 10
@anchor{whatsnew/3 10 notable-security-feature-in-3-10-8}@anchor{abd}
@subsection Notable security feature in 3.10.8


The deprecated @code{mailcap} module now refuses to inject unsafe text
(filenames, MIME types, parameters) into shell commands. Instead of using such
text, it will warn and act as if a match was not found (or for test commands,
as if the test failed).
(Contributed by Petr Viktorin in gh-98966@footnote{https://github.com/python/cpython/issues/98966}.)

@node Notable changes in 3 10 12,,Notable security feature in 3 10 8,What’s New In Python 3 10
@anchor{whatsnew/3 10 notable-changes-in-3-10-12}@anchor{abe}
@subsection Notable changes in 3.10.12


@menu
* tarfile: tarfile<3>. 

@end menu

@node tarfile<3>,,,Notable changes in 3 10 12
@anchor{whatsnew/3 10 tarfile}@anchor{abf}
@subsubsection tarfile



@itemize *

@item 
The extraction methods in @ref{e4,,tarfile}, and @ref{695,,shutil.unpack_archive()},
have a new a `filter' argument that allows limiting tar features than may be
surprising or dangerous, such as creating files outside the destination
directory.
See @ref{696,,Extraction filters} for details.
In Python 3.12, use without the `filter' argument will show a
@ref{1a3,,DeprecationWarning}.
In Python 3.14, the default will switch to @code{'data'}.
(Contributed by Petr Viktorin in 
@geindex Python 향상 제안; PEP 706
PEP 706@footnote{https://peps.python.org/pep-0706/}.)
@end itemize

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 파이썬 3 9의 새로운 기능,파이썬 3 8의 새로운 기능,What’s New In Python 3 10,파이썬의 새로운 기능
@anchor{whatsnew/3 9 doc}@anchor{ac0}@anchor{whatsnew/3 9 translation-repo}@anchor{ac1}@anchor{whatsnew/3 9 what-s-new-in-python-3-9}@anchor{ac2}
@section 파이썬 3.9의 새로운 기능


@*편집자: 
Łukasz Langa


@c Rules for maintenance:
@c 
@c * Anyone can add text to this document.  Your text might get
@c rewritten to some degree.
@c 
@c * The maintainer will go through Misc/NEWS periodically and add
@c changes; it's therefore more important to add your changes to
@c Misc/NEWS than to this file.
@c 
@c * This is not a complete list of every single change; completeness
@c is the purpose of Misc/NEWS.  Some changes will be too small
@c or esoteric to include.  If such a change is added to the text,
@c it might get removed during final editing.
@c 
@c * If you want to draw your new text to the attention of the
@c maintainer, add 'XXX' to the beginning of the paragraph or
@c section.
@c 
@c * It's OK to just add a fragmentary note about a change.  For
@c example: "XXX Describe the transmogrify() function added to the
@c socket module."  The maintainer will research the change and
@c write the necessary text.
@c 
@c * You can comment out your additions if you like, but it's not
@c necessary (especially when a final release is some months away).
@c 
@c * Credit the author of a patch or bugfix.   Just the name is
@c sufficient; the e-mail address isn't necessary.
@c 
@c * It's helpful to add the bug/patch number as a comment:
@c 
@c XXX Describe the transmogrify() function added to the socket
@c module.
@c (Contributed by P.Y. Developer in :issue:`12345`.)
@c 
@c This saves the maintainer the effort of going through the Mercurial log
@c when researching a change.

이 기사에서는 3.8과 비교하여 파이썬 3.9의 새로운 기능에 관해 설명합니다. 파이썬 3.9는 2020년 10월 5일에 출시되었습니다. 자세한 내용은 @ref{142,,변경 내역}을 참조하세요.


@subsubheading 더 보기


@geindex Python 향상 제안; PEP 596
PEP 596@footnote{https://peps.python.org/pep-0596/} - 파이썬 3.9 출시 일정


@menu
* 요약 – 배포 주요 사항:: 
* 여러분의 코드에서 DeprecationWarning을 확인해야합니다:: 
* 새로운 기능:: 
* 기타 언어 변경: 기타 언어 변경<2>. 
* 새 모듈:: 
* 개선된 모듈:: 
* 최적화:: 
* 폐지:: 
* 제거:: 
* 파이썬 3.9로 이식하기: 파이썬 3 9로 이식하기. 
* 빌드 변경:: 
* C API 변경:: 
* 파이썬 3.9.1의 주목할만한 변경 사항: 파이썬 3 9 1의 주목할만한 변경 사항. 
* 파이썬 3.9.2의 주목할만한 변경 사항: 파이썬 3 9 2의 주목할만한 변경 사항. 
* 파이썬 3.9.3의 주목할만한 변경 사항: 파이썬 3 9 3의 주목할만한 변경 사항. 
* 파이썬 3.9.5의 주목할만한 변경 사항: 파이썬 3 9 5의 주목할만한 변경 사항. 
* 3.9.14의 주목할만한 보안 기능: 3 9 14의 주목할만한 보안 기능. 
* 3.9.17의 주목할만한 변경 사항: 3 9 17의 주목할만한 변경 사항. 

@end menu

@node 요약 – 배포 주요 사항,여러분의 코드에서 DeprecationWarning을 확인해야합니다,,파이썬 3 9의 새로운 기능
@anchor{whatsnew/3 9 summary-release-highlights}@anchor{ac3}
@subsection 요약 – 배포 주요 사항


@c This section singles out the most important changes in Python 3.9.
@c Brevity is key.

새로운 문법 기능:


@itemize *

@item 
@geindex Python 향상 제안; PEP 584
PEP 584@footnote{https://peps.python.org/pep-0584/}, 병합(union) 연산자가 @code{dict}에 추가되었습니다.

@item 
@geindex Python 향상 제안; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/}, 표준 컬렉션의 형 힌트 제네릭;

@item 
@geindex Python 향상 제안; PEP 614
PEP 614@footnote{https://peps.python.org/pep-0614/}, 데코레이터에 대한 완화된 문법 제한.
@end itemize

새로운 내장 기능:


@itemize *

@item 
@geindex Python 향상 제안; PEP 616
PEP 616@footnote{https://peps.python.org/pep-0616/}, 접두사와 접미사를 제거하는 문자열 메서드.
@end itemize

표준 라이브러리의 새로운 기능:


@itemize *

@item 
@geindex Python 향상 제안; PEP 593
PEP 593@footnote{https://peps.python.org/pep-0593/}, 유연한 함수와 변수 어노테이션;

@item 
경쟁과 시그널 없이 프로세스 관리를 허용하는 @ref{6a3,,os.pidfd_open()}이 추가되었습니다.
@end itemize

인터프리터 개선:


@itemize *

@item 
@geindex Python 향상 제안; PEP 573
PEP 573@footnote{https://peps.python.org/pep-0573/}, C 확장형의 메서드에서 모듈 상태에 빠르게 액세스하기;

@item 
@geindex Python 향상 제안; PEP 617
PEP 617@footnote{https://peps.python.org/pep-0617/}, CPython은 이제 PEG를 기반으로 하는 새로운 구문 분석기를 사용합니다;

@item 
많은 파이썬 내장(range, tuple, set, frozenset, list, dict)이 이제 
@geindex Python 향상 제안; PEP 590
PEP 590@footnote{https://peps.python.org/pep-0590/} 벡터콜을 사용하여 빨라졌습니다;

@item 
가비지 수거는 부활한 객체에서 블록 되지 않습니다;

@item 
많은 파이썬 모듈(@code{_abc}, @code{audioop}, @code{_bz2}, @code{_codecs}, @code{_contextvars}, @code{_crypt}, @code{_functools}, @code{_json}, @code{_locale}, @ref{92,,math}, @ref{a3,,operator}, @ref{c1,,resource}, @ref{f4,,time}, @code{_weakref})은 이제 PEP 489에 정의된 대로 다단계 초기화를 사용합니다;

@item 
많은 표준 라이브러리 모듈(@code{audioop}, @ref{9,,ast}, @ref{6a,,grp}, @code{_hashlib}, @ref{b7,,pwd}, @code{_posixsubprocess}, @ref{bd,,random}, @ref{c6,,select}, @ref{db,,struct}, @ref{e7,,termios}, @ref{139,,zlib})은 이제 PEP 384에서 정의한 안정(stable) ABI를 사용하고 있습니다.
@end itemize

새로운 라이브러리 모듈:


@itemize *

@item 
@geindex Python 향상 제안; PEP 615
PEP 615@footnote{https://peps.python.org/pep-0615/}, IANA 시간대 데이터베이스는 이제 @ref{13a,,zoneinfo} 모듈을 통해 표준 라이브러리에 있습니다;

@item 
이제 새로운 @ref{69,,graphlib} 모듈에서 그래프의 위상 정렬(topological sort) 구현이 제공됩니다.
@end itemize

릴리스 프로세스 변경:


@itemize *

@item 
@geindex Python 향상 제안; PEP 602
PEP 602@footnote{https://peps.python.org/pep-0602/}, CPython은 연간 릴리스 주기를 채택합니다.
@end itemize

@node 여러분의 코드에서 DeprecationWarning을 확인해야합니다,새로운 기능,요약 – 배포 주요 사항,파이썬 3 9의 새로운 기능
@anchor{whatsnew/3 9 you-should-check-for-deprecationwarning-in-your-code}@anchor{ac4}
@subsection 여러분의 코드에서 DeprecationWarning을 확인해야합니다


파이썬 2.7이 여전히 지원될 때, 파이썬 2.7과의 과거 호환성을 위해 파이썬 3의 많은 기능이 유지되었습니다. 파이썬 2.7 지원이 종료되면서, 이러한 이전 버전과의 호환성 계층이 제거되었거나, 곧 제거될 예정입니다. 그들 대부분은 몇 년 동안 @ref{1a3,,DeprecationWarning} 경고를 내보냈습니다. 예를 들어, @code{collections.abc.Mapping} 대신 @code{collections.Mapping}을 사용하면 2012년에 배포된 파이썬 3.3 이후 @code{DeprecationWarning}을 내보냅니다.

@ref{ac5,,-W} @code{default} 명령 줄 옵션으로 응용 프로그램을 테스트하여 @ref{1a3,,DeprecationWarning}과 @ref{ac6,,PendingDeprecationWarning} 을 보십시오. 또는 @code{-W} @code{error}로 아예 에러로 취급하십시오. @ref{1b1,,경고 필터}를 사용하면 제삼자 코드의 경고를 무시할 수 있습니다.

파이썬 3.9는 파이썬 프로젝트 지원 담당자가 파이썬 2 지원 제거를 구성하고 파이썬 3.9에 대한 지원을 추가할 수 있도록 더 많은 시간을 제공하기 위한, 파이썬 2 과거 호환성 계층을 제공하는 마지막 버전입니다.

@ref{1e,,collections} 모듈의 @ref{a78,,추상 베이스 클래스}에 대한 별칭(@ref{ac7,,collections.abc.Mapping}에 대한 @code{collections.Mapping} 별칭과 같은)은 이전 버전과의 호환성을 위해 마지막 배포 하나에서 유지됩니다. 파이썬 3.10에서 제거됩니다.

더 일반적으로, @ref{507,,파이썬 개발 모드}에서 테스트를 실행하면 다음 파이썬 버전과 호환되도록 코드를 준비하는 데 도움이 됩니다.

참고: 이 버전의 파이썬에서 기존의 많은 폐지가 제거되기도 했습니다. @ref{ac8,,제거} 섹션을 참조하십시오.

@node 새로운 기능,기타 언어 변경<2>,여러분의 코드에서 DeprecationWarning을 확인해야합니다,파이썬 3 9의 새로운 기능
@anchor{whatsnew/3 9 new-features}@anchor{ac9}
@subsection 새로운 기능


@menu
* 딕셔너리 병합과 업데이트 연산자:: 
* 접두사와 접미사를 제거하는 새로운 문자열 메서드:: 
* 표준 컬렉션의 형 힌트 제네릭:: 
* 새로운 구문 분석기:: 

@end menu

@node 딕셔너리 병합과 업데이트 연산자,접두사와 접미사를 제거하는 새로운 문자열 메서드,,새로운 기능
@anchor{whatsnew/3 9 dictionary-merge-update-operators}@anchor{aca}
@subsubsection 딕셔너리 병합과 업데이트 연산자


내장 @ref{183,,dict} 클래스에 병합(@code{|})과 업데이트(@code{|=}) 연산자가 추가되었습니다. 이들은 딕셔너리 병합의 기존 @code{dict.update}와 @code{@{**d1, **d2@}} 메서드를 보완합니다.

예:

@example
>>> x = @{"key1": "value1 from x", "key2": "value2 from x"@}
>>> y = @{"key2": "value2 from y", "key3": "value3 from y"@}
>>> x | y
@{'key1': 'value1 from x', 'key2': 'value2 from y', 'key3': 'value3 from y'@}
>>> y | x
@{'key2': 'value2 from x', 'key3': 'value3 from y', 'key1': 'value1 from x'@}
@end example

자세한 설명은 
@geindex Python 향상 제안; PEP 584
PEP 584@footnote{https://peps.python.org/pep-0584/}를 참조하십시오. (Contributed by Brandt Bucher in bpo-36144@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36144}.)

@node 접두사와 접미사를 제거하는 새로운 문자열 메서드,표준 컬렉션의 형 힌트 제네릭,딕셔너리 병합과 업데이트 연산자,새로운 기능
@anchor{whatsnew/3 9 new-string-methods-to-remove-prefixes-and-suffixes}@anchor{acb}
@subsubsection 접두사와 접미사를 제거하는 새로운 문자열 메서드


문자열에서 불필요한 접두사나 접미사를 쉽게 제거하기 위해 @ref{acc,,str.removeprefix(prefix)}와 @ref{acd,,str.removesuffix(suffix)}가 추가되었습니다. 해당 @code{bytes}, @code{bytearray} 및 @code{collections.UserString} 메서드도 추가되었습니다. 자세한 설명은 
@geindex Python 향상 제안; PEP 616
PEP 616@footnote{https://peps.python.org/pep-0616/}을 참조하십시오. (Contributed by Dennis Sweeney in bpo-39939@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39939}.)

@node 표준 컬렉션의 형 힌트 제네릭,새로운 구문 분석기,접두사와 접미사를 제거하는 새로운 문자열 메서드,새로운 기능
@anchor{whatsnew/3 9 type-hinting-generics-in-standard-collections}@anchor{ace}
@subsubsection 표준 컬렉션의 형 힌트 제네릭


형 어노테이션에서 이제 @code{typing}에서 해당 대문자 형(예를 들어 @code{List}나 @code{Dict})을 임포트 하는 대신 @code{list}와 @code{dict}와 같은 내장 컬렉션 형을 제네릭 형으로 사용할 수 있습니다. 표준 라이브러리의 일부 다른 형도 이제 제네릭입니다, 예를 들어 @code{queue.Queue}.

예:

@example
def greet_all(names: list[str]) -> None:
    for name in names:
        print("Hello", name)
@end example

자세한 내용은 
@geindex Python 향상 제안; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/}를 참조하십시오. (Contributed by Guido van Rossum, Ethan Smith, and Batuhan Taşkaya in bpo-39481@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39481}.)

@node 새로운 구문 분석기,,표준 컬렉션의 형 힌트 제네릭,새로운 기능
@anchor{whatsnew/3 9 new-parser}@anchor{acf}
@subsubsection 새로운 구문 분석기


파이썬 3.9는 LL(1)@footnote{https://en.wikipedia.org/wiki/LL_parser} 대신 PEG@footnote{https://en.wikipedia.org/wiki/Parsing_expression_grammar}를 기반으로 하는 새로운 구문 분석기를 사용합니다. 새로운 구문 분석기의 성능은 기존 구문 분석기의 성능과 거의 비슷하지만, PEG 형식은 새로운 언어 기능을 설계할 때 LL(1)보다 더 유연합니다. 파이썬 3.10 이상에서 이 유연성을 사용하기 시작할 것입니다.

@ref{9,,ast} 모듈은 새 구문 분석기를 사용하며 이전 구문 분석기와 같은 AST를 생성합니다.

파이썬 3.10에서는, 이전 구문 분석기가 삭제되어, 여기에 의존하는 모든 기능도 제거됩니다 (주로 오랜 기간 폐지되었던 @code{parser} 모듈). 파이썬 3.9에서*만*, 명령 줄 스위치(@code{-X oldparser})나 환경 변수(@code{PYTHONOLDPARSER=1})를 사용하여 LL(1) 구문 분석기로 다시 전환 할 수 있습니다.

자세한 내용은 
@geindex Python 향상 제안; PEP 617
PEP 617@footnote{https://peps.python.org/pep-0617/}을 참조하십시오. (Contributed by Guido van Rossum, Pablo Galindo and Lysandros Nikolaou in bpo-40334@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40334}.)

@node 기타 언어 변경<2>,새 모듈,새로운 기능,파이썬 3 9의 새로운 기능
@anchor{whatsnew/3 9 other-language-changes}@anchor{ad0}
@subsection 기타 언어 변경



@itemize *

@item 
@ref{ad1,,__import__()}는 이제 @ref{2ec,,ValueError} 대신 @ref{659,,ImportError}를 발생시킵니다. 이는 상대적 임포트가 최상위 수준 패키지를 넘어갈 때 발생했습니다. (Contributed by Ngalim Siregar in bpo-37444@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37444}.)

@item 
파이썬은 이제 명령 줄에 지정된 스크립트 파일 이름의 절대 경로를 얻습니다 (예: @code{python3 script.py}): @ref{1,,__main__} 모듈의 @code{__file__} 어트리뷰트는 상대 경로 대신 절대 경로가 됩니다. 이 경로는 현재 디렉터리가 @ref{820,,os.chdir()}에 의해 변경된 후에도 계속 유효합니다. 부작용으로, 이 경우 트레이스백은 @code{__main__} 모듈 프레임에 대해 절대 경로를 표시합니다. (Contributed by Victor Stinner in bpo-20443@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20443}.)

@item 
@ref{507,,파이썬 개발 모드}와 @ref{508,,디버그 빌드}에서, 이제 문자열 인코딩과 디코딩 연산을 위해 `encoding'과 `errors' 인자가 검사됩니다. 예: @ref{316,,open()}, @ref{ad2,,str.encode()} 및 @ref{ad3,,bytes.decode()}.

기본적으로, 최상의 성능을 위해, `errors' 인자는 첫 번째 인코딩/디코딩 에러에서만 확인되며 빈 문자열에 대해서는 `encoding' 인자가 무시되는 경우가 있습니다. (Contributed by Victor Stinner in bpo-37388@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37388}.)

@item 
@code{"".replace("", s, n)}는 이제 0이 아닌 모든 @code{n}에 대해 빈 문자열 대신 @code{s}를 반환합니다. 이제 @code{"".replace("", s)}와 일관성 있습니다. @ref{192,,bytes}와 @ref{344,,bytearray} 객체에 대해 유사한 변경 사항이 있습니다. (Contributed by Serhiy Storchaka in bpo-28029@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28029}.)

@item 
이제 모든 유효한 표현식을 @ref{939,,데코레이터}로 사용할 수 있습니다. 이전에는, 문법이 훨씬 제한적이었습니다. 자세한 내용은 
@geindex Python 향상 제안; PEP 614
PEP 614@footnote{https://peps.python.org/pep-0614/}를 참조하십시오. (Contributed by Brandt Bucher in bpo-39702@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39702}.)

@item 
@ref{10a,,typing} 모듈에 대한 도움말이 개선되었습니다. 모든 특수 형식과 특수 제네릭 에일리어스(@code{Union}과 @code{List} 같은)에 대한 독스트링이 이제 표시됩니다. @code{List[int]}와 같은 제네릭 에일리어스로 @ref{ad4,,help()}를 사용하면 해당 구상형(이 경우 @code{list})에 대한 도움말이 표시됩니다. (Contributed by Serhiy Storchaka in bpo-40257@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40257}.)

@item 
@ref{ad5,,aclose()} / @ref{ad6,,asend()} / @ref{71c,,athrow()}의 병렬 실행은 이제 금지되며, 이제 @code{ag_running}은 비동기 제너레이터의 실제 실행 상태를 반영합니다. (Contributed by Yury Selivanov in bpo-30773@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30773}.)

@item 
@code{__iter__} 메서드 호출 시 예기치 않은 에러가 더는 @ref{34b,,in} 연산자와 @ref{a3,,operator} 모듈의 @ref{ad7,,contains()}, @ref{ad8,,indexOf()} 및 @ref{ad9,,countOf()} 함수에서 @code{TypeError}에 의해 마스킹 되지 않습니다. (Contributed by Serhiy Storchaka in bpo-40824@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40824}.)

@item 
Unparenthesized lambda expressions can no longer be the expression part in an
@code{if} clause in comprehensions and generator expressions. See bpo-41848@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41848}
and bpo-43755@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43755} for details.
@end itemize

@node 새 모듈,개선된 모듈,기타 언어 변경<2>,파이썬 3 9의 새로운 기능
@anchor{whatsnew/3 9 new-modules}@anchor{ada}
@subsection 새 모듈


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

@end menu

@node zoneinfo,graphlib<2>,,새 모듈
@anchor{whatsnew/3 9 zoneinfo}@anchor{adb}
@subsubsection zoneinfo


@ref{13a,,zoneinfo} 모듈은 IANA 시간대 데이터베이스 지원을 표준 라이브러리에 도입합니다. 시스템의 시간대 데이터로 뒷받침되는 구상 @ref{7f5,,datetime.tzinfo} 구현인 @ref{adc,,zoneinfo.ZoneInfo}를 추가합니다.

예:

@example
>>> from zoneinfo import ZoneInfo
>>> import datetime as dt

>>> # Daylight saving time
>>> when = dt.datetime(2020, 10, 31, 12, tzinfo=ZoneInfo("America/Los_Angeles"))
>>> print(when)
2020-10-31 12:00:00-07:00
>>> when.tzname()
'PDT'

>>> # Standard time
>>> when += dt.timedelta(days=7)
>>> print(when)
2020-11-07 12:00:00-08:00
>>> print(when.tzname())
PST
@end example

IANA 데이터베이스를 제공하지 않는 플랫폼의 대체 데이터 소스로, tzdata@footnote{https://pypi.org/project/tzdata/} 모듈이 자사(first-party) 패키지로 출시되었습니다 – PyPI를 통해 배포되고 CPython 핵심 팀에서 유지 관리합니다.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 615

@item PEP 615@footnote{https://peps.python.org/pep-0615/} – 표준 라이브러리의 IANA 시간대 데이터베이스에 대한 지원

Paul Ganssle이 작성하고 구현한 PEP
@end table


@node graphlib<2>,,zoneinfo,새 모듈
@anchor{whatsnew/3 9 graphlib}@anchor{add}
@subsubsection graphlib


@ref{ade,,graphlib.TopologicalSorter} 클래스를 포함하는 @ref{69,,graphlib}를 추가하여 그래프의 위상 정렬을 수행하는 기능을 제공합니다. (Contributed by Pablo Galindo, Tim Peters and Larry Hastings in bpo-17005@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17005}.)

@node 개선된 모듈,최적화,새 모듈,파이썬 3 9의 새로운 기능
@anchor{whatsnew/3 9 improved-modules}@anchor{adf}
@subsection 개선된 모듈


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

@end menu

@node ast<4>,asyncio<8>,,개선된 모듈
@anchor{whatsnew/3 9 ast}@anchor{ae0}
@subsubsection ast


`indent' 옵션을 @ref{ae1,,dump()}에 추가하여 여러 줄 들여쓰기 된 출력을 생성할 수 있습니다. (Contributed by Serhiy Storchaka in bpo-37995@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37995}.)

@ref{4c5,,ast.AST} 객체를 역 구문 분석하고, 구문 분석할 때 동등한 @code{ast.AST} 객체를 생성하는 코드가 담긴 문자열을 생성하는 데 사용할 수 있는 @ref{ae2,,ast.unparse()}를 @ref{9,,ast} 모듈의 함수로 추가했습니다. (Contributed by Pablo Galindo and Batuhan Taskaya in bpo-38870@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38870}.)

AST 노드를 생성하는 데 사용된 ASDL 서명이 포함된 독스트링을 AST 노드에 추가했습니다. (Contributed by Batuhan Taskaya in bpo-39638@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39638}.)

@node asyncio<8>,compileall<2>,ast<4>,개선된 모듈
@anchor{whatsnew/3 9 asyncio}@anchor{ae3}
@subsubsection asyncio


심각한 보안 문제로 인해, @ref{93b,,asyncio.loop.create_datagram_endpoint()}의 `reuse_address' 매개 변수는 더는 지원되지 않습니다. 이것은 UDP에서 소켓 옵션 @code{SO_REUSEADDR}의 동작 때문입니다. 자세한 내용은 @code{loop.create_datagram_endpoint()} 설명서를 참조하십시오. (Contributed by Kyle Stanley, Antoine Pitrou, and Yury Selivanov in bpo-37228@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37228}.)

@ref{948,,ThreadPoolExecutor}가 닫기를 끝내기를 기다리는 기본 실행기의 종료(shutdown)를 예약하는 새 @ref{6b8,,코루틴} @ref{ae4,,shutdown_default_executor()}가 추가되었습니다. 또한, @ref{2f3,,asyncio.run()}은 새로운 코루틴을 사용하도록 갱신되었습니다. (Contributed by Kyle Stanley in bpo-34037@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34037}.)

Added @code{asyncio.PidfdChildWatcher}, a Linux-specific child watcher
implementation that polls process file descriptors. (bpo-38692@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38692})

새로운 @ref{6b8,,코루틴} @ref{ae5,,asyncio.to_thread()}를 추가했습니다. 주로 이벤트 루프 블록을 피하고자 별도의 스레드에서 IO 병목 함수를 실행하는 데 사용되며, 기본적으로 키워드 인자를 직접 취할 수 있는 @ref{ae6,,run_in_executor()}의 고수준 버전으로 작동합니다. (Contributed by Kyle Stanley and Yury Selivanov in bpo-32309@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32309}.)

시간 초과로 인해 태스크를 취소할 때, @ref{814,,asyncio.wait_for()}는 이제 양의 timeout과 마찬가지로 `timeout'이 <= 0 인 경우에도 취소가 완료될 때까지 기다립니다. (Contributed by Elvis Pranskevichus in bpo-32751@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32751}.)

@ref{b,,asyncio}는 이제 @ref{ae7,,ssl.SSLSocket} 소켓과 호환되지 않는 메서드를 호출할 때 @ref{198,,TypeError}를 발생시킵니다. (Contributed by Ido Michael in bpo-37404@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37404}.)

@node compileall<2>,concurrent futures<3>,asyncio<8>,개선된 모듈
@anchor{whatsnew/3 9 compileall}@anchor{ae8}
@subsubsection compileall


복제된 @code{.pyc} 파일에 대해 하드 링크를 사용하는 새로운 가능성이 추가되었습니다: `hardlink_dupes' 매개 변수와 –hardlink-dupes 명령 줄 옵션. (Contributed by  Lumír ‘Frenzy’ Balhar in bpo-40495@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40495}.)

결과 @code{.pyc} 파일에서 경로 조작을 위한 새로운 옵션을 추가했습니다: `stripdir', `prependdir', `limit_sl_dest' 매개 변수와 -s, -p, -e 명령 줄 옵션. 최적화 수준에 대한 옵션을 여러 번 지정할 수 있는 가능성이 추가되었습니다. (Contributed by Lumír ‘Frenzy’ Balhar in bpo-38112@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38112}.)

@node concurrent futures<3>,curses<3>,compileall<2>,개선된 모듈
@anchor{whatsnew/3 9 concurrent-futures}@anchor{ae9}
@subsubsection concurrent.futures


실행기를 종료하기 전에 완료되기를 기다리는 대신, 실행을 시작하지 않은 모든 계류 중인 퓨처를 취소하는 새 `cancel_futures' 매개 변수를 @ref{aea,,concurrent.futures.Executor.shutdown()}에 추가했습니다. (Contributed by Kyle Stanley in bpo-39349@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39349}.)

@ref{948,,ThreadPoolExecutor}와 @ref{1d6,,ProcessPoolExecutor} 에서 데몬 스레드를 제거했습니다. 이를 통해 종료 절차에서 서브 인터프리터와의 호환성과 예측성이 향상됩니다. (Contributed by Kyle Stanley in bpo-39812@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39812}.)

재사용 가능한 유휴 작업자가 없을 때만, @ref{1d6,,ProcessPoolExecutor} 의 작업자가 요청 시 스폰 됩니다. 이는 시작 오버헤드를 최적화하고 유휴 작업자에게 손실되는 CPU 시간을 줄입니다. (Contributed by Kyle Stanley in bpo-39207@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39207}.)

@node curses<3>,datetime<3>,concurrent futures<3>,개선된 모듈
@anchor{whatsnew/3 9 curses}@anchor{aeb}
@subsubsection curses


@ref{aec,,curses.get_escdelay()}, @ref{aed,,curses.set_escdelay()}, @ref{aee,,curses.get_tabsize()} 및 @ref{aef,,curses.set_tabsize()} 함수를 추가했습니다. (Contributed by Anthony Sottile in bpo-38312@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38312}.)

@node datetime<3>,distutils<3>,curses<3>,개선된 모듈
@anchor{whatsnew/3 9 datetime}@anchor{af0}
@subsubsection datetime


@ref{1fa,,datetime.date}의 @ref{af1,,isocalendar()}와 @ref{4e2,,datetime.datetime}의 @ref{af2,,isocalendar()} 메서드는 이제 @ref{610,,tuple} 대신 @ref{4e0,,namedtuple()}을 반환합니다. (Contributed by Donghee Na in bpo-24416@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24416}.)

@node distutils<3>,fcntl<2>,datetime<3>,개선된 모듈
@anchor{whatsnew/3 9 distutils}@anchor{af3}
@subsubsection distutils


@code{upload} 명령은 이제 SHA2-256 및 Blake2b-256 해시 다이제스트를 만듭니다. MD5 다이제스트를 차단하는 플랫폼에서는 MD5를 건너뜁니다. (Contributed by Christian Heimes in bpo-40698@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40698}.)

@node fcntl<2>,ftplib<2>,distutils<3>,개선된 모듈
@anchor{whatsnew/3 9 fcntl}@anchor{af4}
@subsubsection fcntl


Added constants @code{fcntl.F_OFD_GETLK}, @code{fcntl.F_OFD_SETLK}
and @code{fcntl.F_OFD_SETLKW}.
(Contributed by Donghee Na in bpo-38602@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38602}.)

@node ftplib<2>,gc<3>,fcntl<2>,개선된 모듈
@anchor{whatsnew/3 9 ftplib}@anchor{af5}
@subsubsection ftplib


비 블로킹 소켓의 생성을 막기 위해 생성자에 대해 주어진 시간제한이 0이면 @ref{af6,,FTP}와 @ref{af7,,FTP_TLS}는 이제 @ref{2ec,,ValueError}를 발생시킵니다. (Contributed by Donghee Na in bpo-39259@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39259}.)

@node gc<3>,hashlib<4>,ftplib<2>,개선된 모듈
@anchor{whatsnew/3 9 gc}@anchor{af8}
@subsubsection gc


가비지 수거기가 일부 객체를 되살리는 컬렉션을 만들 때 (파이널라이저가 실행된 후 격리된 순환 외부에서 도달할 수 있습니다), 여전히 도달할 수 없는 모든 객체의 컬렉션을 차단하지 않습니다. (Contributed by Pablo Galindo and Tim Peters in bpo-38379@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38379}.)

가비지 수거기에서 객체가 파이널라이즈 되었는지 확인하는 새 함수 @ref{af9,,gc.is_finalized()}를 추가했습니다. (Contributed by Pablo Galindo in bpo-39322@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39322}.)

@node hashlib<4>,http<2>,gc<3>,개선된 모듈
@anchor{whatsnew/3 9 hashlib}@anchor{afa}
@subsubsection hashlib


@ref{6c,,hashlib} 모듈은 이제 사용할 수 있으면 OpenSSL의 SHA3 해시와 SHAKE XOF를 사용할 수 있습니다. (Contributed by Christian Heimes in bpo-37630@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37630}.)

내장 해시 모듈은 이제 @code{./configure --without-builtin-hashlib-hashes}로 비활성화하거나 @code{./configure --with-builtin-hashlib-hashes=sha3,blake2}로 선택적으로 활성화하여 OpenSSL 기반 구현의 사용을 강제할 수 있습니다. (Contributed by Christian Heimes in bpo-40479@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40479})

@node http<2>,IDLE과 idlelib,hashlib<4>,개선된 모듈
@anchor{whatsnew/3 9 http}@anchor{afb}
@subsubsection http


HTTP 상태 코드 @code{103 EARLY_HINTS}, @code{418 IM_A_TEAPOT} 및 @code{425 TOO_EARLY}가 @ref{afc,,http.HTTPStatus}에 추가되었습니다. (Contributed by Donghee Na in bpo-39509@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39509} and Ross Rhodes in bpo-39507@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39507}.)

@node IDLE과 idlelib,imaplib<2>,http<2>,개선된 모듈
@anchor{whatsnew/3 9 idle-and-idlelib}@anchor{afd}
@subsubsection IDLE과 idlelib


커서 깜박임을 토글하는 옵션이 추가되었습니다. (Contributed by Zackery Spytz in bpo-4603@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4603}.)

이스케이프 키는 이제 IDLE 완료 창을 닫습니다. (Contributed by Johnny Najera in bpo-38944@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38944}.)

모듈 이름 완성 리스트에 키워드를 추가했습니다. (Contributed by Terry J. Reedy in bpo-37765@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37765}.)

New in 3.9 maintenance releases

Make IDLE invoke @ref{a0c,,sys.excepthook()} (when started without ‘-n’).
User hooks were previously ignored.  (Contributed by Ken Hilton in
bpo-43008@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43008}.)

위의 변경 사항은 3.8 유지 보수 릴리스로 역 이식되었습니다.

Rearrange the settings dialog.  Split the General tab into Windows
and Shell/Ed tabs.  Move help sources, which extend the Help menu, to the
Extensions tab.  Make space for new options and shorten the dialog. The
latter makes the dialog better fit small screens.  (Contributed by Terry Jan
Reedy in bpo-40468@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40468}.)  Move the indent space setting from the Font tab to
the new Windows tab.  (Contributed by Mark Roseman and Terry Jan Reedy in
bpo-33962@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33962}.)

Apply syntax highlighting to @code{.pyi} files. (Contributed by Alex
Waygood and Terry Jan Reedy in bpo-45447@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45447}.)

@node imaplib<2>,importlib<3>,IDLE과 idlelib,개선된 모듈
@anchor{whatsnew/3 9 imaplib}@anchor{afe}
@subsubsection imaplib


@ref{aff,,IMAP4}와 @ref{b00,,IMAP4_SSL}에는 이제 생성자에 선택적 `timeout' 매개 변수가 있습니다. 또한 @ref{b01,,open()} 메서드에는 이제 이 변경으로 인해 선택적 `timeout' 매개 변수가 있습니다. 재정의된 @code{IMAP4_SSL}과 @ref{b02,,IMAP4_stream} 메서드에 이 변경이 적용되었습니다. (Contributed by Donghee Na in bpo-38615@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38615}.)

@ref{b03,,imaplib.IMAP4.unselect()}가 추가되었습니다. @code{imaplib.IMAP4.unselect()}는 선택한 사서함과 관련된 서버 자원을 해제하고 서버를 인증된 상태로 되돌립니다. 이 명령은 현재 선택된 사서함에서 메시지가 영구적으로 제거되지 않는다는 점을 제외하고 @ref{b04,,imaplib.IMAP4.close()}와 같은 작업을 수행합니다. (Contributed by Donghee Na in bpo-40375@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40375}.)

@node importlib<3>,inspect<5>,imaplib<2>,개선된 모듈
@anchor{whatsnew/3 9 importlib}@anchor{b05}
@subsubsection importlib


import 문과의 일관성을 개선하기 위해, @ref{b06,,importlib.util.resolve_name()}은 이제 잘못된 상대 임포트 시도에 대해 @ref{2ec,,ValueError} 대신 @ref{659,,ImportError}를 발생시킵니다. (Contributed by Ngalim Siregar in bpo-37444@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37444}.)

불변 모듈 객체를 게시하는 임포트 로더는 이제 개별 모듈 외에도 불변 패키지를 게시할 수 있습니다. (Contributed by Dino Viehland in bpo-39336@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39336}.)

@code{importlib_resources} 버전 1.5의 역 이식과 일치하는 패키지 데이터의 하위 디렉터리를 지원하는 @ref{6b5,,importlib.resources.files()} 함수가 추가되었습니다. (Contributed by Jason R. Coombs in bpo-39791@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39791}.)

@code{importlib_metadata} 버전 1.6.1로부터 @code{importlib.metadata}를 새로 고쳤습니다.

@node inspect<5>,ipaddress<2>,importlib<3>,개선된 모듈
@anchor{whatsnew/3 9 inspect}@anchor{b07}
@subsubsection inspect


@ref{b08,,inspect.BoundArguments.arguments}가 @code{OrderedDict}에서 일반 dict로 변경되었습니다. (Contributed by Inada Naoki in bpo-36350@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36350} and bpo-39775@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39775}.)

@node ipaddress<2>,math<5>,inspect<5>,개선된 모듈
@anchor{whatsnew/3 9 ipaddress}@anchor{b09}
@subsubsection ipaddress


@ref{84,,ipaddress}는 이제 IPv6 스코프 된 주소(접미사 @code{%<scope_id>} 가 있는 IPv6 주소)를 지원합니다.

스코프 된 IPv6 주소는 @ref{50c,,ipaddress.IPv6Address}를 사용하여 구문 분석할 수 있습니다. 존재하면, @ref{b0a,,scope_id} 어트리뷰트를 통해 스코프 존 ID를 사용할 수 있습니다. (Contributed by Oleksandr Pavliuk in bpo-34788@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34788}.)

Starting with Python 3.9.5 the @ref{84,,ipaddress} module no longer
accepts any leading zeros in IPv4 address strings.
(Contributed by Christian Heimes in bpo-36384@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36384}).

@node math<5>,multiprocessing<3>,ipaddress<2>,개선된 모듈
@anchor{whatsnew/3 9 math}@anchor{b0b}
@subsubsection math


여러 인자를 처리하도록 @ref{b0c,,math.gcd()} 함수를 확장했습니다. 이전에는 두 개의 인자만 지원했습니다. (Contributed by Serhiy Storchaka in bpo-39648@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39648}.)

@ref{b0d,,math.lcm()}을 추가했습니다: 지정된 인자의 최소 공배수를 반환합니다. (Contributed by Mark Dickinson, Ananthakrishnan and Serhiy Storchaka in bpo-39479@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39479} and bpo-39648@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39648}.)

@ref{6bf,,math.nextafter()}를 추가했습니다: `y'를 향해 `x' 뒤의 다음 부동 소수점 값을 반환합니다. (Contributed by Victor Stinner in bpo-39288@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39288}.)

@ref{b0e,,math.ulp()}를 추가했습니다: 부동 소수점의 최하위 비트 값을 반환합니다. (Contributed by Victor Stinner in bpo-39310@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39310}.)

@node multiprocessing<3>,nntplib,math<5>,개선된 모듈
@anchor{whatsnew/3 9 multiprocessing}@anchor{b0f}
@subsubsection multiprocessing


@ref{b10,,multiprocessing.SimpleQueue} 클래스에는 큐를 명시적으로 닫는 새로운 @ref{b11,,close()} 메서드가 있습니다. (Contributed by Victor Stinner in bpo-30966@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30966}.)

@node nntplib,os<6>,multiprocessing<3>,개선된 모듈
@anchor{whatsnew/3 9 nntplib}@anchor{b12}
@subsubsection nntplib


생성자에 대해 주어진 시간제한이 0이면 비 블로킹 소켓을 만드는 것을 막기 위해 @code{NNTP}와 @code{NNTP_SSL}은 이제 @ref{2ec,,ValueError}를 발생시킵니다. (Contributed by Donghee Na in bpo-39259@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39259}.)

@node os<6>,pathlib<9>,nntplib,개선된 모듈
@anchor{whatsnew/3 9 os}@anchor{b13}
@subsubsection os


@code{si_code}에 @ref{b14,,CLD_KILLED}와 @ref{b15,,CLD_STOPPED}를 추가했습니다. (Contributed by Donghee Na in bpo-38493@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38493}.)

파일 기술자를 사용한 프로세스 관리를 위해 리눅스 특정 @ref{6a3,,os.pidfd_open()}(bpo-38692@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38692})과 @ref{b16,,os.P_PIDFD}(bpo-38713@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38713})를 노출했습니다.

@ref{25c,,os.unsetenv()} 함수는 이제 윈도우에서도 사용할 수 있습니다. (Contributed by Victor Stinner in bpo-39413@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39413}.)

@ref{25b,,os.putenv()}와 @ref{25c,,os.unsetenv()} 함수를 이제 항상 사용할 수 있습니다. (Contributed by Victor Stinner in bpo-39395@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39395}.)

@ref{b17,,os.waitstatus_to_exitcode()} 함수를 추가했습니다: 대기 상태를 종료 코드로 변환합니다. (Contributed by Victor Stinner in bpo-40094@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40094}.)

@node pathlib<9>,pdb<5>,os<6>,개선된 모듈
@anchor{whatsnew/3 9 pathlib}@anchor{b18}
@subsubsection pathlib


@ref{b19,,os.readlink()}와 유사하게 작동하는 @ref{b1a,,pathlib.Path.readlink()}를 추가했습니다. (Contributed by Girts Folkmanis in bpo-30618@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30618})

@node pdb<5>,poplib,pathlib<9>,개선된 모듈
@anchor{whatsnew/3 9 pdb}@anchor{b1b}
@subsubsection pdb


이제 윈도우에서 @ref{273,,Pdb}는 @code{~/.pdbrc}를 지원합니다. (Contributed by Tim Hopper and Dan Lidral-Porter in bpo-20523@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20523}.)

@node poplib,pprint<2>,pdb<5>,개선된 모듈
@anchor{whatsnew/3 9 poplib}@anchor{b1c}
@subsubsection poplib


생성자에 대해 주어진 시간제한이 0이면 비 블로킹 소켓을 만드는 것을 막기 위해 @ref{b1d,,POP3}과 @ref{b1e,,POP3_SSL}은 이제 @ref{2ec,,ValueError}를 발생시킵니다. (Contributed by Donghee Na in bpo-39259@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39259}.)

@node pprint<2>,pydoc<2>,poplib,개선된 모듈
@anchor{whatsnew/3 9 pprint}@anchor{b1f}
@subsubsection pprint


@ref{b3,,pprint}는 이제 @ref{4e5,,types.SimpleNamespace}를 예쁘게 인쇄 할 수 있습니다. (Contributed by Carl Bordum Hansen in bpo-37376@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37376}.)

@node pydoc<2>,random<3>,pprint<2>,개선된 모듈
@anchor{whatsnew/3 9 pydoc}@anchor{b20}
@subsubsection pydoc


독스트링은 이제 클래스, 함수, 메서드 등뿐만 아니라 자체 @ref{b21,,__doc__} 어트리뷰트를 가진 모든 객체에 대해 표시됩니다. (Contributed by Serhiy Storchaka in bpo-40257@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40257}.)

@node random<3>,signal,pydoc<2>,개선된 모듈
@anchor{whatsnew/3 9 random}@anchor{b22}
@subsubsection random


Added a new @ref{b23,,random.Random.randbytes()} method: generate random bytes.
(Contributed by Victor Stinner in bpo-40286@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40286}.)

@node signal,smtplib,random<3>,개선된 모듈
@anchor{whatsnew/3 9 signal}@anchor{b24}
@subsubsection signal


pid 대신 파일 기술자를 사용하여 프로세스에 시그널을 보내는 리눅스 특정 @ref{b25,,signal.pidfd_send_signal()}을 노출했습니다. (bpo-38712@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38712})

@node smtplib,socket<4>,signal,개선된 모듈
@anchor{whatsnew/3 9 smtplib}@anchor{b26}
@subsubsection smtplib


생성자에 대해 주어진 시간제한이 0이면 비 블로킹 소켓을 만드는 것을 막기 위해 @ref{b27,,SMTP}와 @ref{b28,,SMTP_SSL}은 이제 @ref{2ec,,ValueError}를 발생시킵니다. (Contributed by Donghee Na in bpo-39259@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39259}.)

@ref{b29,,LMTP} 생성자는 이제 선택적 `timeout' 매개 변수를 갖습니다. (Contributed by Donghee Na in bpo-39329@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39329}.)

@node socket<4>,time<3>,smtplib,개선된 모듈
@anchor{whatsnew/3 9 socket}@anchor{b2a}
@subsubsection socket


@ref{d1,,socket} 모듈은 이제 리눅스 4.1 이상에서 @ref{b2b,,CAN_RAW_JOIN_FILTERS} 상수를 내보냅니다. (Contributed by Stefan Tatschner and Zackery Spytz in bpo-25780@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25780}.)

socket 모듈은 이제 @ref{b2c,,CAN_J1939} 프로토콜을 지원하는 플랫폼에서 이를 지원합니다. (Contributed by Karl Ding in bpo-40291@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40291}.)

socket 모듈에는 이제 @ref{b2d,,socket.send_fds()}와 @ref{b2e,,socket.recv_fds()} 함수가 있습니다. (Contributed by Joannah Nanjekye, Shinya Okano and Victor Stinner in bpo-28724@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28724}.)

@node time<3>,sys<6>,socket<4>,개선된 모듈
@anchor{whatsnew/3 9 time}@anchor{b2f}
@subsubsection time


AIX에서, @ref{b30,,thread_time()}은 이제 10 밀리초 해상도의 @code{clock_gettime(CLOCK_THREAD_CPUTIME_ID)}가 아니라 나노초 해상도의 @code{thread_cputime()}으로 구현됩니다. (Contributed by Batuhan Taskaya in bpo-40192@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40192})

@node sys<6>,tracemalloc,time<3>,개선된 모듈
@anchor{whatsnew/3 9 sys}@anchor{b31}
@subsubsection sys


새로운 @ref{b32,,sys.platlibdir} 어트리뷰트를 추가했습니다: 플랫폼별 라이브러리 디렉터리의 이름. 표준 라이브러리의 경로와 설치된 확장 모듈의 경로들을 빌드하는 데 사용됩니다. 대부분 플랫폼에서 @code{"lib"}와 같습니다. Fedora와 SuSE에서는, 64비트 플랫폼에서 @code{"lib64"}와 같습니다. (Contributed by Jan Matějek, Matěj Cepl, Charalampos Stratakis and Victor Stinner in bpo-1294959@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1294959}.)

이전에는, 비 대화형일 때 @ref{b33,,sys.stderr}가 블록 버퍼링 되었습니다. 이제 @code{stderr}은 기본적으로 항상 줄 버퍼링 됩니다. (Contributed by Jendrik Seipp in bpo-13601@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13601}.)

@node tracemalloc,typing<7>,sys<6>,개선된 모듈
@anchor{whatsnew/3 9 tracemalloc}@anchor{b34}
@subsubsection tracemalloc


특정 코드 조각의 최대 사용량을 측정하기 위해 추적한 메모리 블록의 최대 크기를 현재 크기로 설정하는 @ref{b35,,tracemalloc.reset_peak()}가 추가되었습니다. (Contributed by Huon Wilson in bpo-40630@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40630}.)

@node typing<7>,unicodedata<5>,tracemalloc,개선된 모듈
@anchor{whatsnew/3 9 typing}@anchor{b36}
@subsubsection typing


@geindex Python 향상 제안; PEP 593
PEP 593@footnote{https://peps.python.org/pep-0593/}은 문맥 별 메타 데이터로 기존 형을 데코레이트 하는 @ref{b37,,typing.Annotated} 형과 실행 시간에 메타 데이터에 액세스하기 위해 @ref{8bf,,typing.get_type_hints()}에 새로운 @code{include_extras} 매개 변수를 도입했습니다. (Contributed by Till Varoquaux and Konstantin Kashin.)

@node unicodedata<5>,venv<3>,typing<7>,개선된 모듈
@anchor{whatsnew/3 9 unicodedata}@anchor{b38}
@subsubsection unicodedata


유니코드 데이터베이스가 버전 13.0.0으로 갱신되었습니다. (bpo-39926@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39926}).

@node venv<3>,xml<3>,unicodedata<5>,개선된 모듈
@anchor{whatsnew/3 9 venv}@anchor{b39}
@subsubsection venv


@ref{117,,venv}가 제공하는 활성화 스크립트는 이제 모두 항상 @code{__VENV_PROMPT__}로 지정된 값을 사용하여 프롬프트 사용자 정의를 일관되게 지정합니다. 이전에는 일부 스크립트는 @code{__VENV_PROMPT__}를 무조건 사용했으며, 다른 스크립트는 설정되었을 때만 (이것이 기본입니다) @code{__VENV_PROMPT__}를 사용했으며 어떤 것은 대신 @code{__VENV_NAME__}을 사용했습니다. (Contributed by Brett Cannon in bpo-37663@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37663}.)

@node xml<3>,,venv<3>,개선된 모듈
@anchor{whatsnew/3 9 xml}@anchor{b3a}
@subsubsection xml


@ref{12b,,xml.etree.ElementTree}를 XML 파일로 직렬화할 때 어트리뷰트 내의 공백 문자가 이제 유지됩니다. EOLN은 더는 “n”으로 정규화되지 않습니다. 이것은 XML 명세의 2.11 섹션을 해석하는 방법에 대한 논의 결과입니다. (Contributed by Mefistotelis in bpo-39011@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39011}.)

@node 최적화,폐지,개선된 모듈,파이썬 3 9의 새로운 기능
@anchor{whatsnew/3 9 optimizations}@anchor{b3b}
@subsection 최적화



@itemize *

@item 
컴프리헨션에서 임시 변수를 대입하는 관용구를 최적화했습니다. 이제 컴프리헨션에서 @code{for y in [expr]}는 단순 대입 @code{y = expr}만큼 빠릅니다. 예를 들면:

@quotation

sums = [s for s in [0] for x in data for s in [s + x]]
@end quotation

@code{:=} 연산자와 달리 이 관용구는 변수를 외부 스코프로 누출하지 않습니다.

(Contributed by Serhiy Storchaka in bpo-32856@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32856}.)

@item 
다중 스레드 응용 프로그램에서 시그널 처리를 최적화했습니다. 메인 스레드와 다른 스레드가 신호를 받으면, 처리할 수 없는 계류 중인 시그널을 확인하기 위해 바이트 코드 평가 루프가 더는 각 바이트 코드 명령에서 중단되지 않습니다. 메인 인터프리터의 메인 스레드만 시그널을 처리할 수 있습니다.

이전에는, 메인 스레드가 시그널을 처리할 때까지 각 명령에서 바이트 코드 평가 루프가 중단되었습니다. (Contributed by Victor Stinner in bpo-40010@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40010}.)

@item 
@code{closefrom()}을 사용하여 FreeBSD에서 @ref{dc,,subprocess} 모듈을 최적화했습니다. (Contributed by Ed Maste, Conrad Meyer, Kyle Evans, Kubilay Kocak and Victor Stinner in bpo-38061@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38061}.)

@item 
@ref{b3c,,PyLong_FromDouble()}은 이제 long에 맞는 값에 대해 최대 1.87배 더 빠릅니다. (Contributed by Sergey Fedoseev in bpo-37986@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37986}.)

@item 
많은 파이썬 내장(@ref{b3d,,range}, @ref{610,,tuple}, @ref{184,,set}, @ref{7f1,,frozenset}, @ref{24d,,list}, @ref{183,,dict})은 이제 
@geindex Python 향상 제안; PEP 590
PEP 590@footnote{https://peps.python.org/pep-0590/} 벡터콜 프로토콜을 사용하여 가속됩니다. (Contributed by Donghee Na, Mark Shannon, Jeroen Demeyer and Petr Viktorin in bpo-37207@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37207}.)

@item 
Optimized @code{set.difference_update()} for the case when the other set
is much larger than the base set.
(Suggested by Evgeny Kapun with code contributed by Michele Orrù in bpo-8425@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8425}.)

@item 
파이썬의 작은 객체 할당자(@code{obmalloc.c})는 이제 하나의 빈 아레나를 OS로 반환하지 않고 즉시 재사용 할 수 있도록 허용합니다. 이렇게 하면 각 이터레이션마다 아레나가 새로 만들어지고 파괴될 수 있도록 하는 간단한 루프에서의 스레싱(thrashing)이 방지됩니다. (Contributed by Tim Peters in bpo-37257@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37257}.)

@item 
이제 부동 소수점 연산의 @ref{b3e,,정수 나눗셈}의 성능이 개선되었습니다. 또한 이 연산에 대한 @ref{b3f,,ZeroDivisionError}의 메시지가 갱신됩니다. (Contributed by Donghee Na in bpo-39434@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39434}.)

@item 
UTF-8과 ascii 코덱으로 짧은 ASCII 문자열을 디코딩하는 것이 이제 약 15% 더 빨라졌습니다. (Contributed by Inada Naoki in bpo-37348@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37348}.)
@end itemize

다음은 파이썬 3.4에서 파이썬 3.9까지의 성능 향상에 대한 요약입니다:

@example
Python version                       3.4     3.5     3.6     3.7     3.8    3.9
--------------                       ---     ---     ---     ---     ---    ---

Variable and attribute read access:
    read_local                       7.1     7.1     5.4     5.1     3.9    3.9
    read_nonlocal                    7.1     8.1     5.8     5.4     4.4    4.5
    read_global                     15.5    19.0    14.3    13.6     7.6    7.8
    read_builtin                    21.1    21.6    18.5    19.0     7.5    7.8
    read_classvar_from_class        25.6    26.5    20.7    19.5    18.4   17.9
    read_classvar_from_instance     22.8    23.5    18.8    17.1    16.4   16.9
    read_instancevar                32.4    33.1    28.0    26.3    25.4   25.3
    read_instancevar_slots          27.8    31.3    20.8    20.8    20.2   20.5
    read_namedtuple                 73.8    57.5    45.0    46.8    18.4   18.7
    read_boundmethod                37.6    37.9    29.6    26.9    27.7   41.1

Variable and attribute write access:
    write_local                      8.7     9.3     5.5     5.3     4.3    4.3
    write_nonlocal                  10.5    11.1     5.6     5.5     4.7    4.8
    write_global                    19.7    21.2    18.0    18.0    15.8   16.7
    write_classvar                  92.9    96.0   104.6   102.1    39.2   39.8
    write_instancevar               44.6    45.8    40.0    38.9    35.5   37.4
    write_instancevar_slots         35.6    36.1    27.3    26.6    25.7   25.8

Data structure read access:
    read_list                       24.2    24.5    20.8    20.8    19.0   19.5
    read_deque                      24.7    25.5    20.2    20.6    19.8   20.2
    read_dict                       24.3    25.7    22.3    23.0    21.0   22.4
    read_strdict                    22.6    24.3    19.5    21.2    18.9   21.5

Data structure write access:
    write_list                      27.1    28.5    22.5    21.6    20.0   20.0
    write_deque                     28.7    30.1    22.7    21.8    23.5   21.7
    write_dict                      31.4    33.3    29.3    29.2    24.7   25.4
    write_strdict                   28.4    29.9    27.5    25.2    23.1   24.5

Stack (or queue) operations:
    list_append_pop                 93.4   112.7    75.4    74.2    50.8   50.6
    deque_append_pop                43.5    57.0    49.4    49.2    42.5   44.2
    deque_append_popleft            43.7    57.3    49.7    49.7    42.8   46.4

Timing loop:
    loop_overhead                    0.5     0.6     0.4     0.3     0.3    0.3
@end example

이 결과는 @code{Tools/scripts/var_access_benchmark.py}에 있는 변수 액세스 벤치마크 스크립트에서 생성되었습니다. 벤치마크 스크립트는 타이밍을 나노초로 표시합니다. 벤치마크는 python.org@footnote{https://www.python.org/downloads/macos/}에서 찾을 수 있는 macOS 64비트 빌드를 실행하는 Intel® Core™ i7-4960HQ processor@footnote{https://ark.intel.com/content/www/us/en/ark/products/76088/intel-core-i7-4960hq-processor-6m-cache-up-to-3-80-ghz.html}에서 측정되었습니다.

@node 폐지,제거,최적화,파이썬 3 9의 새로운 기능
@anchor{whatsnew/3 9 deprecated}@anchor{b40}
@subsection 폐지



@itemize *

@item 
distutils @code{bdist_msi} 명령은 이제 폐지되었습니다, 대신 @code{bdist_wheel}(휠 패키지)을 사용하십시오. (Contributed by Hugo van Kemenade in bpo-39586@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39586}.)

@item 
현재 @ref{b41,,math.factorial()}은 음이 아닌 정숫값을 갖는 @ref{196,,float} 인스턴스를 허용합니다 (가령 @code{5.0}). 정숫값이 아니거나 음수인 float에 대해서는 @ref{2ec,,ValueError}를 발생시킵니다. 이제 폐지되었습니다. 향후 파이썬 버전에서는 모든 float에 대해 @ref{198,,TypeError}를 발생시킬 것입니다. (Contributed by Serhiy Storchaka in bpo-37315@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37315}.)

@item 
@code{parser}와 @code{symbol} 모듈은 폐지되었고 이후 버전의 파이썬에서 제거될 예정입니다. 대부분의 사용 사례에서 사용자는 @ref{9,,ast} 모듈을 사용하여 추상 구문 트리(AST) 생성과 컴파일 단계를 활용할 수 있습니다.

@item 
공개 C API 함수 @code{PyParser_SimpleParseStringFlags()}, @code{PyParser_SimpleParseStringFlagsFilename()}, @code{PyParser_SimpleParseFileFlags()} 및 @code{PyNode_Compile()}는 폐지되었고 파이썬 3.10에서 이전 구문 분석기와 함께 제거됩니다.

@item 
불리언 문맥에서 @ref{1a2,,NotImplemented}를 사용하는 것은 거의 확실히 잘못된 풍부한 비교 구현의 결과이므로 폐지되었습니다. 향후 버전의 파이썬에서 @ref{198,,TypeError}가 될 것입니다. (Contributed by Josh Rosenberg in bpo-35712@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35712}.)

@item 
@ref{bd,,random} 모듈은 현재 모든 해시 가능한 형을 시드 값으로 허용합니다. 불행히도, 이러한 형 중 일부는 결정론적 해시값을 보장하지 않습니다. 파이썬 3.9 이후, 이 모듈은 시드를 @ref{884,,None}, @ref{19b,,int}, @ref{196,,float}, @ref{169,,str}, @ref{192,,bytes} 및 @ref{344,,bytearray}로 제한합니다.

@item 
`mode' 인자를 지정하지 않고 쓰기 위해 @ref{65a,,GzipFile} 파일을 여는 것은 폐지되었습니다. 향후 파이썬 버전에서는 이때 기본적으로 항상 읽기 위해 열립니다. 쓰기 위해 열면서 경고가 나오지 않도록 하기 위해서는 `mode' 인자를 지정하십시오. (Contributed by Serhiy Storchaka in bpo-28286@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28286}.)

@item 
@code{_tkinter.TkappType}의 @code{split()} 메서드를 폐지하고, 더 일관되고 예측 가능한 동작을 갖는 @code{splitlist()} 메서드로 대체합니다. (Contributed by Serhiy Storchaka in bpo-38371@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38371}.)

@item 
코루틴 객체를 @ref{6a6,,asyncio.wait()}에 명시적으로 전달하는 것은 폐지되었고 버전 3.11에서 제거됩니다. (Contributed by Yury Selivanov and Kyle Stanley in bpo-34790@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34790}.)

@item 
binhex4 와 hexbin4 표준은 이제 폐지되었습니다. @code{binhex} 모듈과 다음 @ref{11,,binascii} 함수는 이제 폐지되었습니다:


@itemize *

@item 
@code{b2a_hqx()}, @code{a2b_hqx()}

@item 
@code{rlecode_hqx()}, @code{rledecode_hqx()}
@end itemize

(Contributed by Victor Stinner in bpo-39353@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39353}.)

@item 
@ref{9,,ast} 클래스 @code{slice}, @code{Index} 및 @code{ExtSlice}는 폐지된 것으로 간주하고 향후 파이썬 버전에서 제거될 예정입니다. @code{Index(value)} 대신 @code{value} 자체를 사용해야 합니다. @code{ExtSlice(slices)} 대신 @code{Tuple(slices, Load())}를 사용해야 합니다. (Contributed by Serhiy Storchaka in bpo-34822@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34822}.)

@item 
@ref{9,,ast} 클래스 @code{Suite}, @code{Param}, @code{AugLoad} 및 @code{AugStore}는 폐지된 것으로 간주하고 향후 파이썬 버전에서 제거될 예정입니다. 이것들은 구문 분석기에 의해 생성되지 않았으며 파이썬 3의 코드 생성기에 의해 받아들여지지 않았습니다. (Contributed by Batuhan Taskaya in bpo-39639@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39639} and bpo-39969@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39969} and Serhiy Storchaka in bpo-39988@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39988}.)

@item 
@code{PyEval_InitThreads()}와 @code{PyEval_ThreadsInitialized()} 함수는 이제 폐지되었고 파이썬 3.11에서 제거됩니다. @code{PyEval_InitThreads()}를 호출해도 이제 아무런 효과가 없습니다. @ref{164,,GIL}은 파이썬 3.7부터 @ref{460,,Py_Initialize()}로 초기화됩니다. (Contributed by Victor Stinner in bpo-39877@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39877}.)

@item 
@ref{75d,,shlex.split()} 함수에 첫 번째 인자로 @code{None}을 전달하는 것은 폐지되었습니다. (Contributed by Zackery Spytz in bpo-33262@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33262}.)

@item 
@code{smtpd.MailmanProxy()}는 이제 외부 모듈 @code{mailman} 없이는 사용할 수 없어서 폐지되었습니다. (Contributed by Samuel Colvin in bpo-35800@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35800}.)

@item 
@code{lib2to3} 모듈은 이제 @ref{ac6,,PendingDeprecationWarning} 을 방출합니다. 파이썬 3.9는 PEG 구문 분석기로 전환되었으며 (
@geindex Python 향상 제안; PEP 617
PEP 617@footnote{https://peps.python.org/pep-0617/}을 참조하십시오), 파이썬 3.10에는 lib2to3의 LL(1) 구문 분석기로 구문 분석할 수 없는 새로운 언어 문법이 포함될 수 있습니다. @code{lib2to3} 모듈은 향후 파이썬 버전의 표준 라이브러리에서 제거될 수 있습니다. LibCST@footnote{https://libcst.readthedocs.io/}나 parso@footnote{https://parso.readthedocs.io/}와 같은 제삼자 대안을 고려하십시오. (Contributed by Carl Meyer in bpo-40360@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40360}.)

@item 
@ref{94d,,random.shuffle()}의 `random' 매개 변수는 폐지되었습니다. (Contributed by Raymond Hettinger in bpo-40465@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40465})
@end itemize

@node 제거,파이썬 3 9로 이식하기,폐지,파이썬 3 9의 새로운 기능
@anchor{whatsnew/3 9 removed}@anchor{b42}@anchor{whatsnew/3 9 removed-in-python-39}@anchor{ac8}
@subsection 제거



@itemize *

@item 
@code{unittest.mock.__version__}의 잘못된 버전이 제거되었습니다.

@item 
@code{nntplib.NNTP}: @code{xpath()}와 @code{xgtitle()} 메서드가 제거되었습니다. 이 메서드는 파이썬 3.3부터 폐지되었습니다. 일반적으로, 이러한 확장은 지원되지 않거나 NNTP 서버 관리자가 활성화하지 않습니다. @code{xgtitle()}의 경우, @code{nntplib.NNTP.descriptions()}나 @code{nntplib.NNTP.description()}을 대신 사용하십시오. (Contributed by Donghee Na in bpo-39366@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39366}.)

@item 
@ref{4c0,,array.array}: @code{tostring()}과 @code{fromstring()} 메서드가 제거되었습니다. 이것들은 @code{tobytes()}와 @code{frombytes()}의 별칭으로, 파이썬 3.2부터 폐지되었습니다. (Contributed by Victor Stinner in bpo-38916@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38916}.)

@item 
설명되지 않은 @code{sys.callstats()} 함수가 제거되었습니다. 파이썬 3.7부터는, 폐지되었고 항상 @ref{884,,None}을 반환했습니다. 파이썬 3.7에서 이미 제거된 특수 빌드 옵션 @code{CALL_PROFILE}이 필요했습니다. (Contributed by Victor Stinner in bpo-37414@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37414}.)

@item 
@code{sys.getcheckinterval()} 과 @code{sys.setcheckinterval()} 함수가 제거되었습니다. 파이썬 3.2부터 폐지되었습니다. 대신 @ref{b43,,sys.getswitchinterval()}과 @ref{b44,,sys.setswitchinterval()}을 사용하십시오. (Contributed by Victor Stinner in bpo-37392@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37392}.)

@item 
C 함수 @code{PyImport_Cleanup()}이 제거되었습니다. 이렇게 설명되어 있었습니다: “모듈 테이블을 비웁니다. 내부 전용.” (Contributed by Victor Stinner in bpo-36710@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36710}.)

@item 
@code{_dummy_thread}와 @code{dummy_threading} 모듈이 제거되었습니다. 이 모듈은 스레드 지원이 필수인 파이썬 3.7부터 폐지되었습니다. (Contributed by Victor Stinner in bpo-37312@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37312}.)

@item 
@code{aifc.open()}에 대한 @code{aifc.openfp()} 별칭, @code{sunau.open()}에 대한 @code{sunau.openfp()} 별칭, @ref{b45,,wave.open()}에 대한 @code{wave.openfp()} 별칭이 제거되었습니다. 파이썬 3.7부터 폐지되었습니다. (Contributed by Victor Stinner in bpo-37320@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37320}.)

@item 
@ref{176,,threading.Thread}의 @code{isAlive()} 메서드가 제거되었습니다. 파이썬 3.8부터 폐지되었습니다. 대신 @ref{b46,,is_alive()}를 사용하십시오. (Contributed by Donghee Na in bpo-37804@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37804}.)

@item 
@ref{12b,,ElementTree} 모듈에서 클래스 @ref{b47,,ElementTree}와 @ref{363,,Element}의 메서드 @code{getchildren()}과 @code{getiterator()}가 제거되었습니다. 파이썬 3.2에서 폐지되었습니다. @code{x.getchildren()} 대신 @code{iter(x)}나 @code{list(x)}를, @code{x.getiterator()} 대신 @code{x.iter()}나 @code{list(x.iter())}를 사용하십시오. (Contributed by Serhiy Storchaka in bpo-36543@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36543}.)

@item 
낡은 @ref{b0,,plistlib} API는 제거되었습니다, 파이썬 3.4부터 폐지되었습니다. @ref{b48,,load()}, @ref{b49,,loads()}, @ref{b4a,,dump()} 및 @ref{b4b,,dumps()} 함수를 사용하십시오. 또한, `use_builtin_types' 매개 변수가 제거되었으며, 표준 @ref{192,,bytes} 객체가 항상 대신 사용됩니다. (Contributed by Jon Janzen in bpo-36409@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36409}.)

@item 
C 함수 @code{PyGen_NeedsFinalizing}이 제거되었습니다. 
@geindex Python 향상 제안; PEP 442
PEP 442@footnote{https://peps.python.org/pep-0442/}를 구현한 후, 설명되지도, 테스트 되지도, CPython 내 어디에서건 사용되지도 않았습니다. Joannah Nanjekye의 패치. (Contributed by Joannah Nanjekye in bpo-15088@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15088})

@item 
파이썬 3.1부터 폐지된 별칭 @code{base64.encodestring()}과 @code{base64.decodestring()}은 제거되었습니다: 대신 @ref{b4c,,base64.encodebytes()}와 @ref{b4d,,base64.decodebytes()}를 사용하십시오. (Contributed by Victor Stinner in bpo-39351@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39351}.)

@item 
@code{fractions.gcd()} 함수가 제거되었습니다, 파이썬 3.5부터 폐지되었습니다 (bpo-22486@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22486}): 대신 @ref{b0c,,math.gcd()}를 사용하십시오. (Contributed by Victor Stinner in bpo-39350@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39350}.)

@item 
@ref{a66,,bz2.BZ2File}의 `buffering' 매개 변수가 제거되었습니다. 파이썬 3.0부터 무시되었고 사용하면 @ref{1a3,,DeprecationWarning}을 방출했습니다. 파일을 여는 방법을 제어하려면 열린 파일 객체를 전달하십시오. (Contributed by Victor Stinner in bpo-39357@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39357}.)

@item 
@ref{b4e,,json.loads()}의 `encoding' 매개 변수가 제거되었습니다. 파이썬 3.1부터 폐지되었고 무시되었습니다; 파이썬 3.8부터 사용하면 @ref{1a3,,DeprecationWarning}을 방출했습니다. (Contributed by Inada Naoki in bpo-39377@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39377})

@item 
@code{with (await asyncio.lock):}와 @code{with (yield from asyncio.lock):} 문은 더는 지원되지 않습니다, 대신 @code{async with lock}을 사용하십시오. @code{asyncio.Condition}과 @code{asyncio.Semaphore}도 마찬가지입니다. (Contributed by Andrew Svetlov in bpo-34793@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34793}.)

@item 
@code{sys.getcounts()} 함수, @code{-X showalloccount} 명령 줄 옵션 및 C 구조체 @ref{3f7,,PyConfig}의 @code{show_alloc_count} 필드가 제거되었습니다. 이들은 @code{COUNT_ALLOCS} 매크로를 정의하는 특별한 파이썬 빌드가 필요했습니다. (Contributed by Victor Stinner in bpo-39489@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39489}.)

@item 
@ref{331,,typing.NamedTuple} 클래스의 @code{_field_types} 어트리뷰트가 제거되었습니다. 파이썬 3.8부터 폐지되었습니다. 대신 @code{__annotations__} 어트리뷰트를 사용하십시오. (Contributed by Serhiy Storchaka in bpo-40182@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40182}.)

@item 
@code{symtable.SymbolTable.has_exec()} 메서드가 제거되었습니다. 2006 년부터 폐지되었으며, 호출되면 @code{False}를 반환하기만 합니다. (Contributed by Batuhan Taskaya in bpo-40208@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40208})

@item 
@code{asyncio.Task.current_task()}와 @code{asyncio.Task.all_tasks()}가 제거되었습니다. 파이썬 3.7부터 폐지되었고 대신 @ref{6a4,,asyncio.current_task()}와 @ref{b4f,,asyncio.all_tasks()}를 사용할 수 있습니다. (Contributed by Rémi Lapeyre in bpo-40967@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40967})

@item 
@ref{a77,,html.parser.HTMLParser} 클래스의 @code{unescape()} 메서드가 제거되었습니다 (파이썬 3.4부터 폐지되었습니다). 문자 참조를 해당 유니코드 문자로 변환하는 데 @ref{b50,,html.unescape()}를 사용해야 합니다.
@end itemize

@node 파이썬 3 9로 이식하기,빌드 변경,제거,파이썬 3 9의 새로운 기능
@anchor{whatsnew/3 9 porting-to-python-3-9}@anchor{b51}
@subsection 파이썬 3.9로 이식하기


이 절에서는 여러분의 코드 수정을 요구할 수도 있는 이전에 설명한 변경 사항과 다른 버그 수정 사항을 나열합니다.

@menu
* 파이썬 API의 변경:: 
* C API의 변경:: 
* CPython 바이트 코드 변경:: 

@end menu

@node 파이썬 API의 변경,C API의 변경,,파이썬 3 9로 이식하기
@anchor{whatsnew/3 9 changes-in-the-python-api}@anchor{b52}
@subsubsection 파이썬 API의 변경



@itemize *

@item 
@ref{ad1,,__import__()}와 @ref{b06,,importlib.util.resolve_name()}은 이전에 @ref{2ec,,ValueError}를 발생시키던 곳에서 이제 @ref{659,,ImportError}를 발생시킵니다. 특정 예외 형을 포착하고 파이썬 3.9와 이전 버전을 모두 지원하는 호출자는 @code{except (ImportError, ValueError):}를 사용하여 둘 다 포착해야 합니다.

@item 
@code{__VENV_PROMPT__}가 @code{""}로 설정될 때 @ref{117,,venv} 활성화 스크립트는 더는 특별한 경우가 아닙니다.

@item 
@ref{b53,,select.epoll.unregister()} 메서드는 더는 @ref{b54,,EBADF} 에러를 무시하지 않습니다. (Contributed by Victor Stinner in bpo-39239@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39239}.)

@item 
`buffering' 매개 변수가 제거되었기 때문에, @ref{a66,,bz2.BZ2File}의 `compresslevel' 매개 변수는 키워드 전용이 되었습니다. (Contributed by Victor Stinner in bpo-39357@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39357}.)

@item 
서브스크립션이 단순화된 AST. 단순 인덱스는 값으로 표시되고, 확장 슬라이스는 튜플로 표시됩니다. @code{Index(value)}는 @code{value} 자체를 반환하고, @code{ExtSlice(slices)}는 @code{Tuple(slices, Load())}를 반환합니다. (Contributed by Serhiy Storchaka in bpo-34822@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34822}.)

@item 
@ref{b55,,-E}나 @ref{b56,,-I} 명령 줄 옵션을 사용할 때 @ref{7b,,importlib} 모듈은 이제 
@geindex PYTHONCASEOK
@geindex 환경 변수; PYTHONCASEOK
@ref{b57,,PYTHONCASEOK} 환경 변수를 무시합니다.

@item 
`encoding' 매개 변수가 클래스 @ref{af6,,ftplib.FTP}와 @ref{af7,,ftplib.FTP_TLS}에 키워드 전용 매개 변수로 추가되었으며, 기본 인코딩이 
@geindex RFC; RFC 2640
RFC 2640@footnote{https://datatracker.ietf.org/doc/html/rfc2640.html}을 따르도록 Latin-1에서 UTF-8로 변경되었습니다.

@item 
@ref{ae4,,asyncio.loop.shutdown_default_executor()}가 @ref{b58,,AbstractEventLoop} 에 추가되어서, 이것을 상속하는 대체 이벤트 루프에 이 메서드가 정의되어 있어야 합니다. (Contributed by Kyle Stanley in bpo-34037@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34037}.)

@item 
컴파일러 플래그와의 충돌을 방지하기 위해 @ref{0,,__future__} 모듈에서 퓨처 플래그의 상숫값이 갱신되었습니다. 이전에는 @code{PyCF_ALLOW_TOP_LEVEL_AWAIT}가 @code{CO_FUTURE_DIVISION}과 충돌했습니다. (Contributed by Batuhan Taskaya in bpo-39562@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39562})

@item 
@code{array('u')}는 이제 @code{Py_UNICODE} 대신 @code{wchar_t}를 C형으로 사용합니다. @code{Py_UNICODE}는 파이썬 3.3부터 @code{wchar_t}의 별칭이라서 이 변경은 동작에 영향을 미치지 않습니다. (Contributed by Inada Naoki in bpo-34538@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34538}.)

@item 
@ref{b59,,logging.getLogger()} API는 이제 이름 @code{'root'}를 전달할 때 루트 로거를 반환합니다. 이전에는 @code{'root'}라는 이름의 비 루트 로거를 반환했습니다. 이것은 사용자 코드가 @code{'root'}라는 이름의 루트가 아닌 로거를 명시적으로 원하거나, @code{'root.py'}라는 최상위 모듈에서 @code{logging.getLogger(__name__)}을 사용하여 로거를 인스턴스 화하는 경우에 영향을 미칠 수 있습니다. (Contributed by Vinay Sajip in bpo-37742@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37742}.)

@item 
@ref{6cc,,PurePath}의 나눗셈 처리는 이제 @code{str}이나 @code{PurePath}의 인스턴스가 아닌 다른 것을 전달하면 @ref{198,,TypeError}를 발생시키는 대신 @ref{1a2,,NotImplemented}를 반환합니다. 이는 언급한 형을 상속하지 않는 호환 가능한 클래스를 만들 수 있도록 합니다. (Contributed by Roger Aiudi in bpo-34775@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34775}).

@item 
Starting with Python 3.9.5 the @ref{84,,ipaddress} module no longer
accepts any leading zeros in IPv4 address strings. Leading zeros are
ambiguous and interpreted as octal notation by some libraries. For example
the legacy function @ref{b5a,,socket.inet_aton()} treats leading zeros as octal
notatation. glibc implementation of modern @ref{b5b,,inet_pton()} does
not accept any leading zeros.
(Contributed by Christian Heimes in bpo-36384@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36384}).

@item 
@ref{b5c,,codecs.lookup()} now normalizes the encoding name the same way as
@ref{9fd,,encodings.normalize_encoding()}, except that @code{codecs.lookup()} also
converts the name to lower case. For example, @code{"latex+latin1"} encoding
name is now normalized to @code{"latex_latin1"}.
(Contributed by Jordon Xu in bpo-37751@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37751}.)
@end itemize

@node C API의 변경,CPython 바이트 코드 변경,파이썬 API의 변경,파이썬 3 9로 이식하기
@anchor{whatsnew/3 9 changes-in-the-c-api}@anchor{b5d}
@subsubsection C API의 변경



@itemize *

@item 
@ref{b5e,,힙 할당 형} (가령 @ref{79c,,PyType_FromSpec()} 및 유사한 API로 만들어진 것)의 인스턴스는 파이썬 3.8부터 형 객체에 대한 참조를 보유합니다. 파이썬 3.8의 “C API의 변경”에 표시된 대로, 대부분의 경우, 부작용이 없어야 하지만 사용자 정의 @ref{981,,tp_traverse} 함수가 있는 형의 경우 힙 할당형의 모든 사용자 정의 @code{tp_traverse} 함수가 객체의 형을 방문하도록 합니다.

@quotation

예:

@example
int
foo_traverse(PyObject *self, visitproc visit, void *arg)
@{
// Rest of the traverse function
#if PY_VERSION_HEX >= 0x03090000
    // This was not needed before Python 3.9 (Python issue 35810 and 40217)
    Py_VISIT(Py_TYPE(self));
#endif
@}
@end example
@end quotation

순회 함수가 베이스 클래스 (또는 다른 형)의 @code{tp_traverse}에 위임하면, @code{Py_TYPE(self)}를 한 번만 방문해야 합니다. @code{tp_traverse}에서 @ref{b5e,,힙 형} 만 형을 방문하도록 기대된다는 것에 유의하십시오.

@quotation

예를 들어, @code{tp_traverse} 함수가 다음을 포함하면:

@example
base->tp_traverse(self, visit, arg)
@end example

다음을 추가하십시오:

@example
#if PY_VERSION_HEX >= 0x03090000
    // 파이썬 3.9 이전에서는 필요하지 않습니다 (파이썬 이슈 35810 및 40217)
    if (base->tp_flags & Py_TPFLAGS_HEAPTYPE) @{
        // 힙 형의 tp_traverse가 이미 Py_TYPE(self)를 방문했습니다
    @} else @{
        Py_VISIT(Py_TYPE(self));
    @}
#else
@end example
@end quotation

(자세한 내용은 bpo-35810@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35810}과 bpo-40217@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40217}을 참조하십시오.)

@item 
@code{PyEval_CallObject}, @code{PyEval_CallFunction}, @code{PyEval_CallMethod} 및 @code{PyEval_CallObjectWithKeywords} 함수는 폐지되었습니다. 대신 @ref{63b,,PyObject_Call()}과 그 변형을 사용하십시오. (자세한 내용은 bpo-29548@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29548}을 참조하십시오.)
@end itemize

@node CPython 바이트 코드 변경,,C API의 변경,파이썬 3 9로 이식하기
@anchor{whatsnew/3 9 cpython-bytecode-changes}@anchor{b5f}
@subsubsection CPython 바이트 코드 변경



@itemize *

@item 
The @code{LOAD_ASSERTION_ERROR} opcode was added for handling the
@ref{b60,,assert} statement. Previously, the assert statement would not work
correctly if the @ref{8b7,,AssertionError} exception was being shadowed.
(Contributed by Zackery Spytz in bpo-34880@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34880}.)

@item 
@ref{b61,,COMPARE_OP} 옵코드는 4개의 개별 명령어로 분할되었습니다:


@itemize *

@item 
풍부한 비교를 위한 @code{COMPARE_OP}

@item 
‘is’와 ‘is not’ 테스트를 위한 @code{IS_OP}

@item 
‘in’과 ‘not in’ 테스트를 위한 @code{CONTAINS_OP}

@item 
‘try-except’ 문에서 예외를 확인하기 위한 @code{JUMP_IF_NOT_EXC_MATCH}.
@end itemize

(Contributed by Mark Shannon in bpo-39156@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39156}.)
@end itemize

@node 빌드 변경,C API 변경,파이썬 3 9로 이식하기,파이썬 3 9의 새로운 기능
@anchor{whatsnew/3 9 build-changes}@anchor{b62}
@subsection 빌드 변경



@itemize *

@item 
@code{configure} 스크립트에 @code{--with-platlibdir} 옵션을 추가했습니다: 새 @ref{b32,,sys.platlibdir} 어트리뷰트에 저장된, 플랫폼별 라이브러리 디렉터리의 이름. 자세한 정보는 @code{sys.platlibdir} 어트리뷰트를 참조하십시오. (Contributed by Jan Matějek, Matěj Cepl, Charalampos Stratakis and Victor Stinner in bpo-1294959@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1294959}.)

@item 
@code{COUNT_ALLOCS} 특수 빌드 매크로가 제거되었습니다. (Contributed by Victor Stinner in bpo-39489@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39489}.)

@item 
윈도우 이외의 플랫폼에서, @code{setenv()}와 @code{unsetenv()} 함수는 이제 파이썬을 빌드하는 데 필요합니다. (Contributed by Victor Stinner in bpo-39395@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39395}.)

@item 
윈도우가 아닌 플랫폼에서, @code{bdist_wininst} 설치 프로그램 생성은 이제 공식적으로 지원되지 않습니다. (자세한 내용은 bpo-10945@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10945}를 참조하십시오.)

@item 
macOS에서 소스로부터 파이썬을 빌드할 때, @code{_tkinter}는, 이전 macOS 릴리스의 경우와 마찬가지로, @code{/Library/Frameworks}에 설치되었으면 비 시스템 Tcl과 Tk 프레임 워크와 링크됩니다. macOS SDK가 명시적으로 구성되면 (@ref{b63,,--enable-universalsdk}나 @code{-isysroot}를 사용하여), SDK 자체만 검색됩니다. 기본 동작은 여전히 @code{--with-tcltk-includes}와 @code{--with-tcltk-libs}로 재정의할 수 있습니다. (Contributed by Ned Deily in bpo-34956@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34956}.)

@item 
이제 윈도우 10 ARM64 용으로 파이썬을 빌드할 수 있습니다. (Contributed by Steve Dower in bpo-33125@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33125}.)

@item 
@code{--pgo}를 사용할 때 이제 일부 개별 테스트를 건너뜁니다. 문제의 테스트는 PGO 작업 시간을 매우 증가시켰으며 최종 실행 파일의 최적화를 개선하는 데 도움이 되지 않았을 가능성이 높습니다. 이렇게 하면 작업 속도가 약 15배 빨라집니다. 전체 단위 테스트 스위트를 실행하는 것은 느립니다. 이 변경으로 인해 많은 코드 분기가 실행되지 않아서 빌드가 약간 덜 최적화 될 수 있습니다. 훨씬 느린 빌드를 기다릴 의사가 있다면, @code{./configure [..] PROFILE_TASK="-m test --pgo-extended"}를 사용하여 이전 동작을 복원할 수 있습니다. 우리는 어떤 PGO 작업 집합이 더 빠른 빌드를 생성하는지에 대해 보장하지 않습니다. 결과가 환경, 워크로드 및 컴파일러 도구 체인에 따라 달라질 수 있어서, 이를 중요하게 생각하는 사용자는 자신의 관련 벤치마크를 실행해야 합니다. (자세한 내용은 bpo-36044@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36044}와 bpo-37707@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37707}를 참조하십시오.)
@end itemize

@node C API 변경,파이썬 3 9 1의 주목할만한 변경 사항,빌드 변경,파이썬 3 9의 새로운 기능
@anchor{whatsnew/3 9 c-api-changes}@anchor{b64}
@subsection C API 변경


@menu
* 새로운 기능: 새로운 기능<2>. 
* 파이썬 3.9로 이식하기: 파이썬 3 9로 이식하기<2>. 
* 제거: 제거<2>. 

@end menu

@node 새로운 기능<2>,파이썬 3 9로 이식하기<2>,,C API 변경
@anchor{whatsnew/3 9 id1}@anchor{b65}
@subsubsection 새로운 기능



@itemize *

@item 
@geindex Python 향상 제안; PEP 573
PEP 573@footnote{https://peps.python.org/pep-0573/}: 모듈을 클래스와 연결하는 @ref{772,,PyType_FromModuleAndSpec()}를 추가했습니다; 모듈과 해당 상태를 가져오는 @ref{b66,,PyType_GetModule()}과 @ref{b67,,PyType_GetModuleState()}를 추가합니다; 메서드가 자신이 정의된 클래스에 액세스할 수 있도록 하는 @ref{967,,PyCMethod}와 @ref{b68,,METH_METHOD}를 추가합니다. (Contributed by Marcel Plch and Petr Viktorin in bpo-38787@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38787}.)

@item 
@ref{98c,,PyFrame_GetCode()} 함수를 추가했습니다: 프레임 코드를 얻습니다. @ref{988,,PyFrame_GetBack()} 함수를 추가했습니다: 프레임 다음 외부 프레임을 얻습니다. (Contributed by Victor Stinner in bpo-40421@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40421}.)

@item 
제한된 C API에 @ref{98d,,PyFrame_GetLineNumber()}를 추가했습니다. (Contributed by Victor Stinner in bpo-40421@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40421}.)

@item 
인터프리터를 얻는 @ref{b69,,PyThreadState_GetInterpreter()}와 @ref{64a,,PyInterpreterState_Get()} 함수를 추가했습니다. 파이썬 스레드 상태의 현재 프레임을 가져오는 @ref{990,,PyThreadState_GetFrame()} 함수를 추가했습니다. @ref{b6a,,PyThreadState_GetID()} 함수를 추가했습니다: 파이썬 스레드 상태의 고유 식별자를 가져옵니다. (Contributed by Victor Stinner in bpo-39947@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39947}.)

@item 
인자 없이 콜러블 파이썬 객체를 호출하는 새로운 공용 @ref{63a,,PyObject_CallNoArgs()} 함수를 C API에 추가했습니다. 인자 없이 콜러블 파이썬 객체를 호출하는 가장 효율적인 방법입니다. (Contributed by Victor Stinner in bpo-37194@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37194}.)

@item 
제한된 C API의 변경 사항 (@code{Py_LIMITED_API} 매크로가 정의된 경우):


@itemize *

@item 
제한된 API에 대한 일반 함수로 @ref{3d2,,Py_EnterRecursiveCall()} 과 @ref{b6b,,Py_LeaveRecursiveCall()} 을 제공합니다. 이전에는, 이들이 매크로로 정의되었지만, 이러한 매크로는 @code{PyThreadState.recursion_depth} 필드에 액세스할 수 없는 제한된 C API로는 컴파일되지 않았습니다 (이 구조체는 제한된 C API에서 불투명합니다).

@item 
@code{PyObject_INIT()}와 @code{PyObject_INIT_VAR()}는 구현 세부 정보를 숨기도록 일반 “불투명” 함수가 됩니다.
@end itemize

(Contributed by Victor Stinner in bpo-38644@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38644} and bpo-39542@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39542}.)

@item 
@ref{b6c,,PyModule_AddType()} 함수가 추가되어 모듈에 형을 추가하는 것을 돕습니다. (Contributed by Donghee Na in bpo-40024@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40024}.)

@item 
@ref{b6d,,PyObject_GC_IsTracked()}와 @ref{b6e,,PyObject_GC_IsFinalized()} 함수를 공용 API에 추가하여 파이썬 객체가 현재 추적되고 있거나 가비지 수거기에 의해 이미 파이널라이즈 되었는지 조회할 수 있습니다. (Contributed by Pablo Galindo Salgado in bpo-40241@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40241}.)

@item 
함수 류 객체의 사용자 친화적인 문자열 표현을 얻는 @code{_PyObject_FunctionStr()}을 추가했습니다. (Patch by Jeroen Demeyer in bpo-37645@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37645}.)

@item 
하나의 위치 인자로 객체를 호출하는 @ref{b6f,,PyObject_CallOneArg()}를 추가했습니다 (Patch by Jeroen Demeyer in bpo-37483@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37483}.)
@end itemize

@node 파이썬 3 9로 이식하기<2>,제거<2>,새로운 기능<2>,C API 변경
@anchor{whatsnew/3 9 id2}@anchor{b70}
@subsubsection 파이썬 3.9로 이식하기



@itemize *

@item 
@code{PyInterpreterState.eval_frame}(
@geindex Python 향상 제안; PEP 523
PEP 523@footnote{https://peps.python.org/pep-0523/})에는 이제 새로운 필수 `tstate' 매개 변수(@code{PyThreadState*})가 필요합니다. (Contributed by Victor Stinner in bpo-38500@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38500}.)

@item 
확장 모듈: 모듈 상태가 요청되었지만, 아직 할당되지 않았으면 @ref{b71,,PyModuleDef}의 @ref{b72,,m_traverse}, @ref{b73,,m_clear} 및 @ref{b74,,m_free} 함수가 더는 호출되지 않습니다. 이것은 모듈이 만들이진 직후, 모듈이 실행되기 직전의 경우입니다 (@ref{b75,,Py_mod_exec} 함수). 더 정확하게는, @code{m_size}가 0보다 크고 모듈 상태(@ref{b76,,PyModule_GetState()}가 반환하는)가 @code{NULL}이면 이 함수가 호출되지 않습니다.

모듈 상태가 없는 확장 모듈(@code{m_size <= 0})은 영향을 받지 않습니다.

@item 
서브 인터프리터에서 @ref{b77,,Py_AddPendingCall()} 이 호출되면, 함수는 이제 메인 인터프리터에서 호출되지 않고 서브 인터프리터에서 호출되도록 예약됩니다. 각 서브 인터프리터는 이제 자체 예약된 호출 목록을 갖습니다. (Contributed by Victor Stinner in bpo-39984@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39984}.)

@item 
@code{-E} 옵션이 사용될 때 (@ref{40b,,PyConfig.use_environment}가 @code{0}으로 설정될 때) 윈도우 레지스트리가 더는 @ref{3e4,,sys.path}를 초기화하는 데 사용되지 않습니다. 이것은 윈도우에서 파이썬을 내장할 때 중요합니다. (Contributed by Zackery Spytz in bpo-8901@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8901}.)

@item 
전역 변수 @ref{b78,,PyStructSequence_UnnamedField}는 이제 상수이며 상수 문자열을 참조합니다. (Contributed by Serhiy Storchaka in bpo-38650@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38650}.)

@item 
@code{PyGC_Head} 구조체는 이제 불투명합니다. 내부 C API(@code{pycore_gc.h})에서만 정의됩니다. (Contributed by Victor Stinner in bpo-40241@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40241}.)

@item 
@code{Py_UNICODE_COPY}, @code{Py_UNICODE_FILL}, @code{PyUnicode_WSTR_LENGTH}, @code{PyUnicode_FromUnicode()}, @code{PyUnicode_AsUnicode()}, @code{_PyUnicode_AsUnicode} 및 @code{PyUnicode_AsUnicodeAndSize()}는 C에서 폐지된 것으로 표시됩니다. 파이썬 3.3 이후 
@geindex Python 향상 제안; PEP 393
PEP 393@footnote{https://peps.python.org/pep-0393/}에서 폐지되었습니다. (Contributed by Inada Naoki in bpo-36346@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36346}.)

@item 
@ref{b79,,Py_FatalError()} 함수는, @code{Py_LIMITED_API} 매크로가 정의되지 않는 한, 현재 함수의 이름을 자동으로 로그 하는 매크로로 대체됩니다. (Contributed by Victor Stinner in bpo-39882@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39882}.)

@item 
벡터콜 프로토콜은 이제 호출자가 키워드 이름으로 문자열만 전달하도록 요구합니다. (자세한 내용은 bpo-37540@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37540}을 참조하십시오.)

@item 
이제 여러 매크로와 함수의 구현 세부 사항이 숨겨집니다:


@itemize *

@item 
@ref{b7a,,PyObject_IS_GC()} 매크로가 함수로 변환되었습니다.

@item 
@code{PyObject_NEW()} 매크로는 @ref{b7b,,PyObject_New} 매크로의 별칭이 되고, @code{PyObject_NEW_VAR()} 매크로는 @ref{b7c,,PyObject_NewVar} 매크로의 별칭이 됩니다. 더는 @ref{b7d,,PyTypeObject.tp_basicsize} 멤버에 직접 액세스하지 않습니다.

@item 
@code{PyObject_GET_WEAKREFS_LISTPTR()} 매크로가 함수로 변환되었습니다: 매크로는 @ref{b7e,,PyTypeObject.tp_weaklistoffset} 멤버에 직접 액세스했습니다.

@item 
@ref{637,,PyObject_CheckBuffer()} 매크로가 함수로 변환되었습니다: 매크로는 @ref{b7f,,PyTypeObject.tp_as_buffer} 멤버에 직접 액세스했습니다.

@item 
@ref{b80,,PyIndex_Check()}는 이제 구현 세부 사항을 숨기기 위해 항상 불투명한 함수로 선언됩니다: @code{PyIndex_Check()} 매크로가 제거되었습니다. 매크로는 @ref{b81,,PyTypeObject.tp_as_number} 멤버에 직접 액세스했습니다.
@end itemize

(자세한 내용은 bpo-40170@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40170}을 참조하십시오.)
@end itemize

@node 제거<2>,,파이썬 3 9로 이식하기<2>,C API 변경
@anchor{whatsnew/3 9 id3}@anchor{b82}
@subsubsection 제거



@itemize *

@item 
제한된 C API에서 @code{pyfpe.h}의 @code{PyFPE_START_PROTECT()}와 @code{PyFPE_END_PROTECT()} 매크로를 제외했습니다. (Contributed by Victor Stinner in bpo-38835@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38835}.)

@item 
@ref{b83,,PyTypeObject}의 @code{tp_print} 슬롯이 제거되었습니다. 파이썬 2.7과 이전 버전에서 파일로 객체를 인쇄하는 데 사용되었습니다. 파이썬 3.0부터는, 무시되고 사용되지 않았습니다. (Contributed by Jeroen Demeyer in bpo-36974@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36974}.)

@item 
제한된 C API의 변경 사항 (@code{Py_LIMITED_API} 매크로가 정의된 경우):


@itemize *

@item 
제한된 C API에서 다음 함수를 제외했습니다:


@itemize *

@item 
@code{PyThreadState_DeleteCurrent()}
(Contributed by Joannah Nanjekye in bpo-37878@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37878}.)

@item 
@code{_Py_CheckRecursionLimit}

@item 
@code{_Py_NewReference()}

@item 
@code{_Py_ForgetReference()}

@item 
@code{_PyTraceMalloc_NewReference()}

@item 
@code{_Py_GetRefTotal()}

@item 
제한된 C API에서 결코 작동하지 않은 휴지통 메커니즘.

@item 
@code{PyTrash_UNWIND_LEVEL}

@item 
@code{Py_TRASHCAN_BEGIN_CONDITION}

@item 
@code{Py_TRASHCAN_BEGIN}

@item 
@code{Py_TRASHCAN_END}

@item 
@code{Py_TRASHCAN_SAFE_BEGIN}

@item 
@code{Py_TRASHCAN_SAFE_END}
@end itemize

@item 
다음 함수와 정의를 내부 C API로 옮겼습니다:


@itemize *

@item 
@code{_PyDebug_PrintTotalRefs()}

@item 
@code{_Py_PrintReferences()}

@item 
@code{_Py_PrintReferenceAddresses()}

@item 
@code{_Py_tracemalloc_config}

@item 
@code{_Py_AddToAllObjects()} (@code{Py_TRACE_REFS} 빌드에만 해당)
@end itemize
@end itemize

(Contributed by Victor Stinner in bpo-38644@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38644} and bpo-39542@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39542}.)

@item 
@code{_PyRuntime.getframe} 훅을 제거했고 @code{_PyRuntime.getframe}의 별칭인 @code{_PyThreadState_GetFrame} 매크로를 제거했습니다. 이들은 내부 C API에 의해서만 노출되었습니다. @code{PyThreadFrameGetter} 형도 제거했습니다. (Contributed by Victor Stinner in bpo-39946@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39946}.)

@item 
C API에서 다음 함수를 제거했습니다. 모든 자유 목록을 지우려면 @ref{b84,,PyGC_Collect()}를 명시적으로 호출하십시오. (Contributed by Inada Naoki and Victor Stinner in bpo-37340@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37340}, bpo-38896@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38896} and bpo-40428@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40428}.)


@itemize *

@item 
@code{PyAsyncGen_ClearFreeLists()}

@item 
@code{PyContext_ClearFreeList()}

@item 
@code{PyDict_ClearFreeList()}

@item 
@code{PyFloat_ClearFreeList()}

@item 
@code{PyFrame_ClearFreeList()}

@item 
@code{PyList_ClearFreeList()}

@item 
@code{PyMethod_ClearFreeList()}와 @code{PyCFunction_ClearFreeList()}: 연결된 메서드 객체의 자유 목록이 제거되었습니다.

@item 
@code{PySet_ClearFreeList()}: 파이썬 3.4에서 집합 자유 목록이 제거되었습니다.

@item 
@code{PyTuple_ClearFreeList()}

@item 
@code{PyUnicode_ClearFreeList()}: 파이썬 3.3에서 유니코드 자유 목록이 제거되었습니다.
@end itemize

@item 
@code{_PyUnicode_ClearStaticStrings()} 함수를 제거했습니다. (Contributed by Victor Stinner in bpo-39465@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39465}.)

@item 
@code{Py_UNICODE_MATCH}를 제거했습니다. 
@geindex Python 향상 제안; PEP 393
PEP 393@footnote{https://peps.python.org/pep-0393/}에서 폐지되었고, 파이썬 3.3부터 망가졌습니다. 대신 @ref{ab5,,PyUnicode_Tailmatch()} 함수를 사용할 수 있습니다. (Contributed by Inada Naoki in bpo-36346@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36346}.)

@item 
정의되었지만 구현이 없는 헤더 파일들을 정리했습니다. 제거되는 공용 API 심볼은: @code{_PyBytes_InsertThousandsGroupingLocale}, @code{_PyBytes_InsertThousandsGrouping}, @code{_Py_InitializeFromArgs}, @code{_Py_InitializeFromWideArgs}, @code{_PyFloat_Repr}, @code{_PyFloat_Digits}, @code{_PyFloat_DigitsInit}, @code{PyFrame_ExtendStack}, @code{_PyAIterWrapper_Type}, @code{PyNullImporter_Type}, @code{PyCmpWrapper_Type}, @code{PySortWrapper_Type}, @code{PyNoArgsFunction}입니다. (Contributed by Pablo Galindo Salgado in bpo-39372@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39372}.)
@end itemize

@node 파이썬 3 9 1의 주목할만한 변경 사항,파이썬 3 9 2의 주목할만한 변경 사항,C API 변경,파이썬 3 9의 새로운 기능
@anchor{whatsnew/3 9 notable-changes-in-python-3-9-1}@anchor{b85}
@subsection 파이썬 3.9.1의 주목할만한 변경 사항


@menu
* typing: typing<8>. 
* macOS 11.0 (Big Sur) 및 Apple Silicon Mac 지원: macOS 11 0 Big Sur 및 Apple Silicon Mac 지원. 

@end menu

@node typing<8>,macOS 11 0 Big Sur 및 Apple Silicon Mac 지원,,파이썬 3 9 1의 주목할만한 변경 사항
@anchor{whatsnew/3 9 id4}@anchor{b86}
@subsubsection typing


@ref{a55,,typing.Literal}의 동작은 
@geindex Python 향상 제안; PEP 586
PEP 586@footnote{https://peps.python.org/pep-0586/}를 따르고 PEP에 지정된 정적 형 검사기의 동작과 일치하도록 변경되었습니다.


@enumerate 

@item 
@code{Literal}은 이제 매개 변수를 중복 제거합니다.

@item 
@code{Literal} 객체 간의 동등 비교는 이제 순서에 독립적입니다.

@item 
@code{Literal} 비교는 이제 형을 존중합니다. 예를 들어, @code{Literal[0] == Literal[False]}는 이전에 @code{True}로 평가되었습니다. 이제 @code{False}입니다. 이 변경을 지원하기 위해, 내부적으로 사용되는 형 캐시는 이제 형 구분을 지원합니다.

@item 
@code{Literal} 객체는 매개 변수 중 하나라도 @ref{823,,해시 가능}하지 않으면 동등 비교 중에 @ref{198,,TypeError} 예외를 발생시킵니다. 가변 매개 변수로 @code{Literal}를 선언하는 것은 에러를 발생시키지 않음에 유의하십시오:

@example
>>> from typing import Literal
>>> Literal[@{0@}]
>>> Literal[@{0@}] == Literal[@{False@}]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'set'
@end example
@end enumerate

(Contributed by Yurii Karabas in bpo-42345@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42345}.)

@node macOS 11 0 Big Sur 및 Apple Silicon Mac 지원,,typing<8>,파이썬 3 9 1의 주목할만한 변경 사항
@anchor{whatsnew/3 9 macos-11-0-big-sur-and-apple-silicon-mac-support}@anchor{b87}
@subsubsection macOS 11.0 (Big Sur) 및 Apple Silicon Mac 지원


3.9.1부터, 파이썬은 이제 macOS 11.0 (Big Sur)과 Apple Silicon Mac(@code{ARM64} 아키텍처 기반)에서 빌드와 실행을 완전히 지원합니다. 이제 새로운 유니버설 빌드 변형인 @code{universal2}를 사용하여 하나의 실행 파일 집합에서 @code{ARM64}와 @code{Intel 64}를 모두 네이티브 하게 지원할 수 있습니다. 바이너리는 이제 현재 버전의 macOS에서 빌드되어 다양한 이전 macOS 버전(10.9까지 테스트 되었습니다)에 배포되는 동시에 실행시간에 사용 중인 운영 체제 버전에 따라 조건부로 사용 가능한 일부 새로운 OS 기능과 옵션을 만들 수 있습니다 (“약한 링크(weaklinking)”).

(Contributed by Ronald Oussoren and Lawrence D’Anna in bpo-41100@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41100}.)

@node 파이썬 3 9 2의 주목할만한 변경 사항,파이썬 3 9 3의 주목할만한 변경 사항,파이썬 3 9 1의 주목할만한 변경 사항,파이썬 3 9의 새로운 기능
@anchor{whatsnew/3 9 notable-changes-in-python-3-9-2}@anchor{b88}
@subsection 파이썬 3.9.2의 주목할만한 변경 사항


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

@end menu

@node collections abc<2>,urllib parse<2>,,파이썬 3 9 2의 주목할만한 변경 사항
@anchor{whatsnew/3 9 collections-abc}@anchor{b89}
@subsubsection collections.abc


@ref{9eb,,collections.abc.Callable} 제네릭은 이제 @ref{9c8,,typing.Callable}이 현재 수행하는 것과 유사하게 형 매개 변수를 평활화합니다. 이것은 @code{collections.abc.Callable[[int, str], str]}의 @code{__args__}가 @code{(int, str, str)}임을 의미합니다; 이전에는 @code{([int, str], str)}였습니다. 이러한 변경을 허용하기 위해, 이제 @ref{9ec,,types.GenericAlias}를 서브 클래싱할 수 있으며, @code{collections.abc.Callable} 형을 서브스크립팅할 할 때 서브 클래스가 반환됩니다. @ref{2ac,,typing.get_args()}나 @code{__args__}를 통해 인자에 액세스하는 코드는 이 변경 사항을 고려해야 합니다. 파이썬 3.9.1에서 조용히 전달되었을 수 있는 @code{collections.abc.Callable}의 유효하지 않은 매개 변수화 형식에 대해 @ref{1a3,,DeprecationWarning}을 방출할 수 있습니다. 이 @code{DeprecationWarning}은 파이썬 3.10에서 @ref{198,,TypeError}가 됩니다. (Contributed by Ken Jin in bpo-42195@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42195}.)

@node urllib parse<2>,,collections abc<2>,파이썬 3 9 2의 주목할만한 변경 사항
@anchor{whatsnew/3 9 urllib-parse}@anchor{b8a}
@subsubsection urllib.parse


이전 파이썬 버전에서는 @ref{31f,,urllib.parse.parse_qs()}와 @ref{31e,,urllib.parse.parse_qsl()}에서 쿼리 매개 변수 구분자로 @code{;}과 @code{&}를 모두 사용할 수 있었습니다. 보안 문제와 최신 W3C 권장 사항을 준수하기 위해, @code{&}가 기본값인 단일 구분자 키만 허용하도록 변경되었습니다. 이 변경 사항은 영향을 받는 함수를 내부적으로 사용하므로 @code{cgi.parse()}와 @code{cgi.parse_multipart()}에도 영향을 줍니다. 자세한 내용은 해당 설명서를 참조하십시오. (Contributed by Adam Goldschmidt, Senthil Kumaran and Ken Jin in bpo-42967@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42967}.)

@node 파이썬 3 9 3의 주목할만한 변경 사항,파이썬 3 9 5의 주목할만한 변경 사항,파이썬 3 9 2의 주목할만한 변경 사항,파이썬 3 9의 새로운 기능
@anchor{whatsnew/3 9 notable-changes-in-python-3-9-3}@anchor{b8b}
@subsection 파이썬 3.9.3의 주목할만한 변경 사항


보안 수정은 수동 데이터 채널을 설정할 때 원격 서버에서 보낸 IPv4 주소를 신뢰하지 않도록 @ref{af6,,ftplib.FTP} 동작을 변경합니다. 대신 ftp 서버 IP 주소를 재사용합니다. 이전 동작이 필요한 특별한 코드의 경우, FTP 인스턴스의 @code{trust_server_pasv_ipv4_address} 어트리뷰트를 @code{True}로 설정하십시오. (gh-87451@footnote{https://github.com/python/cpython/issues/87451}를 참조하십시오)

@node 파이썬 3 9 5의 주목할만한 변경 사항,3 9 14의 주목할만한 보안 기능,파이썬 3 9 3의 주목할만한 변경 사항,파이썬 3 9의 새로운 기능
@anchor{whatsnew/3 9 notable-changes-in-python-3-9-5}@anchor{b8c}
@subsection 파이썬 3.9.5의 주목할만한 변경 사항


@menu
* urllib.parse: urllib parse<3>. 

@end menu

@node urllib parse<3>,,,파이썬 3 9 5의 주목할만한 변경 사항
@anchor{whatsnew/3 9 id5}@anchor{b8d}
@subsubsection urllib.parse


The presence of newline or tab characters in parts of a URL allows for some
forms of attacks. Following the WHATWG specification that updates 
@geindex RFC; RFC 3986
RFC 3986@footnote{https://datatracker.ietf.org/doc/html/rfc3986.html},
ASCII newline @code{\n}, @code{\r} and tab @code{\t} characters are stripped from the
URL by the parser in @ref{110,,urllib.parse} preventing such attacks. The removal
characters are controlled by a new module level variable
@code{urllib.parse._UNSAFE_URL_BYTES_TO_REMOVE}. (See gh-88048@footnote{https://github.com/python/cpython/issues/88048})

@node 3 9 14의 주목할만한 보안 기능,3 9 17의 주목할만한 변경 사항,파이썬 3 9 5의 주목할만한 변경 사항,파이썬 3 9의 새로운 기능
@anchor{whatsnew/3 9 notable-security-feature-in-3-9-14}@anchor{b8e}
@subsection 3.9.14의 주목할만한 보안 기능


Converting between @ref{19b,,int} and @ref{169,,str} in bases other than 2
(binary), 4, 8 (octal), 16 (hexadecimal), or 32 such as base 10 (decimal)
now raises a @ref{2ec,,ValueError} if the number of digits in string form is
above a limit to avoid potential denial of service attacks due to the
algorithmic complexity. This is a mitigation for 
@geindex Common Vulnerabilities and Exposures; CVE 2020-10735
CVE 2020-10735@footnote{https://www.cve.org/CVERecord?id=CVE-2020-10735}.
This limit can be configured or disabled by environment variable, command
line flag, or @ref{df,,sys} APIs. See the @ref{80a,,integer string conversion length limitation} documentation.  The default limit
is 4300 digits in string form.

@node 3 9 17의 주목할만한 변경 사항,,3 9 14의 주목할만한 보안 기능,파이썬 3 9의 새로운 기능
@anchor{whatsnew/3 9 notable-changes-in-3-9-17}@anchor{b8f}
@subsection 3.9.17의 주목할만한 변경 사항


@menu
* tarfile: tarfile<4>. 

@end menu

@node tarfile<4>,,,3 9 17의 주목할만한 변경 사항
@anchor{whatsnew/3 9 tarfile}@anchor{b90}
@subsubsection tarfile



@itemize *

@item 
The extraction methods in @ref{e4,,tarfile}, and @ref{695,,shutil.unpack_archive()},
have a new a `filter' argument that allows limiting tar features than may be
surprising or dangerous, such as creating files outside the destination
directory.
See @ref{696,,Extraction filters} for details.
In Python 3.12, use without the `filter' argument will show a
@ref{1a3,,DeprecationWarning}.
In Python 3.14, the default will switch to @code{'data'}.
(Contributed by Petr Viktorin in 
@geindex Python 향상 제안; PEP 706
PEP 706@footnote{https://peps.python.org/pep-0706/}.)
@end itemize

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 파이썬 3 8의 새로운 기능,파이썬 3 7의 새로운 기능,파이썬 3 9의 새로운 기능,파이썬의 새로운 기능
@anchor{whatsnew/3 8 doc}@anchor{b91}@anchor{whatsnew/3 8 translation-repo}@anchor{b92}@anchor{whatsnew/3 8 what-s-new-in-python-3-8}@anchor{b93}
@section 파이썬 3.8의 새로운 기능


@c Rules for maintenance:
@c 
@c * Anyone can add text to this document.  Do not spend very much time
@c on the wording of your changes, because your text will probably
@c get rewritten to some degree.
@c 
@c * The maintainer will go through Misc/NEWS periodically and add
@c changes; it's therefore more important to add your changes to
@c Misc/NEWS than to this file.
@c 
@c * This is not a complete list of every single change; completeness
@c is the purpose of Misc/NEWS.  Some changes I consider too small
@c or esoteric to include.  If such a change is added to the text,
@c I'll just remove it.  (This is another reason you shouldn't spend
@c too much time on writing your addition.)
@c 
@c * If you want to draw your new text to the attention of the
@c maintainer, add 'XXX' to the beginning of the paragraph or
@c section.
@c 
@c * It's OK to just add a fragmentary note about a change.  For
@c example: "XXX Describe the transmogrify() function added to the
@c socket module."  The maintainer will research the change and
@c write the necessary text.
@c 
@c * You can comment out your additions if you like, but it's not
@c necessary (especially when a final release is some months away).
@c 
@c * Credit the author of a patch or bugfix.   Just the name is
@c sufficient; the e-mail address isn't necessary.
@c 
@c * It's helpful to add the bug/patch number as a comment:
@c 
@c XXX Describe the transmogrify() function added to the socket
@c module.
@c (Contributed by P.Y. Developer in :issue:`12345`.)
@c 
@c This saves the maintainer the effort of going through the Git log
@c when researching a change.

@*편집자: 
Raymond Hettinger


이 기사에서는 파이썬 3.7과 비교하여 3.8의 새로운 기능에 관해 설명합니다. 파이썬 3.8은 2019년 10월 14일에 출시되었습니다. 자세한 내용은 @ref{142,,changelog}를 참조하세요.

@c from math import cos, radians
@c from unicodedata import normalize
@c import re
@c import math

@menu
* 요약 – 배포 주요 사항: 요약 – 배포 주요 사항<2>. 
* 새로운 기능: 새로운 기능<3>. 
* 기타 언어 변경: 기타 언어 변경<3>. 
* 새 모듈: 새 모듈<2>. 
* 개선된 모듈: 개선된 모듈<2>. 
* 최적화: 최적화<2>. 
* 빌드와 C API 변경:: 
* 폐지: 폐지<2>. 
* API 및 기능 제거:: 
* 파이썬 3.8로 이식하기: 파이썬 3 8로 이식하기. 
* 파이썬 3.8.1의 주목할만한 변경 사항: 파이썬 3 8 1의 주목할만한 변경 사항. 
* 파이썬 3.8.2의 주목할만한 변경 사항: 파이썬 3 8 2의 주목할만한 변경 사항. 
* 파이썬 3.8.3의 주목할만한 변경 사항: 파이썬 3 8 3의 주목할만한 변경 사항. 
* 파이썬 3.8.8의 주목할만한 변경 사항: 파이썬 3 8 8의 주목할만한 변경 사항. 
* 파이썬 3.8.9의 주목할만한 변경 사항: 파이썬 3 8 9의 주목할만한 변경 사항. 
* 파이썬 3.8.10의 주목할만한 변경 사항: 파이썬 3 8 10의 주목할만한 변경 사항. 
* 파이썬 3.8.10의 주목할만한 변경 사항: 파이썬 3 8 10의 주목할만한 변경 사항<2>. 
* 파이썬 3.8.12의 주목할만한 변경 사항: 파이썬 3 8 12의 주목할만한 변경 사항. 
* 3.8.14의 주목할만한 보안 기능: 3 8 14의 주목할만한 보안 기능. 
* 3.8.17의 주목할만한 변경 사항: 3 8 17의 주목할만한 변경 사항. 

@end menu

@node 요약 – 배포 주요 사항<2>,새로운 기능<3>,,파이썬 3 8의 새로운 기능
@anchor{whatsnew/3 8 summary-release-highlights}@anchor{b94}
@subsection 요약 – 배포 주요 사항


@c This section singles out the most important changes in Python 3.8.
@c Brevity is key.

@c PEP-sized items next.

@node 새로운 기능<3>,기타 언어 변경<3>,요약 – 배포 주요 사항<2>,파이썬 3 8의 새로운 기능
@anchor{whatsnew/3 8 new-features}@anchor{b95}
@subsection 새로운 기능


@menu
* 대입 표현식:: 
* 위치 전용 매개 변수:: 
* 컴파일된 바이트 코드 파일을 위한 병렬 파일 시스템 캐시:: 
* 디버그 빌드는 릴리스 빌드와 같은 ABI를 사용합니다.: 디버그 빌드는 릴리스 빌드와 같은 ABI를 사용합니다. 
* f-문자열은 스스로 설명하는 표현식과 디버깅을 위해 =를 지원합니다.: f-문자열은 스스로 설명하는 표현식과 디버깅을 위해 =를 지원합니다. 
* PEP 578; 파이썬 런타임 감사 훅: PEP 578 파이썬 런타임 감사 훅. 
* PEP 587; 파이썬 초기화 구성: PEP 587 파이썬 초기화 구성. 
* PEP 590; 벡터콜; CPython을 위한 빠른 호출 프로토콜: PEP 590 벡터콜 CPython을 위한 빠른 호출 프로토콜. 
* 아웃 오브 밴드 데이터 버퍼를 사용하는 피클 프로토콜 5:: 

@end menu

@node 대입 표현식,위치 전용 매개 변수,,새로운 기능<3>
@anchor{whatsnew/3 8 assignment-expressions}@anchor{b96}
@subsubsection 대입 표현식


더 큰 표현식의 일부로 변수에 값을 대입하는 새로운 문법 @code{:=} 이 있습니다. 바다코끼리의 눈과 엄니@footnote{https://en.wikipedia.org/wiki/Walrus#/media/File:Pacific_Walrus_-_Bull_(8247646168).jpg}를 닮아서 “바다코끼리 연산자(the walrus operator)”라고 친근하게 알려져 있습니다.

이 예에서, 대입 표현식은 @ref{83f,,len()}을 두 번 호출하지 않도록 합니다:

@example
if (n := len(a)) > 10:
    print(f"List is too long (@{n@} elements, expected <= 10)")
@end example

정규식 일치 중에도 비슷한 이점이 있습니다. 일치 객체가 두 번 필요합니다, 일치하는지 검사할 때 한 번, 서브 그룹을 추출할 때 한 번:

@example
discount = 0.0
if (mo := re.search(r'(\d+)% discount', advertisement)):
    discount = float(mo.group(1)) / 100.0
@end example

이 연산자는 루프 종료를 검사하기 위해 값을 계산한 다음 루프의 바디에서 그 값이 다시 필요한 while 루프에도 유용합니다:

@example
# 고정 길이 블록을 루핑합니다
while (block := f.read(256)) != '@w{'}:
    process(block)
@end example

필터링 조건에서 계산된 값이 표현식 바디에도 필요한 리스트 컴프리헨션에서 또 다른 사용 사례가 생깁니다:

@example
[clean_name.title() for name in names
 if (clean_name := normalize('NFC', name)) in allowed_names]
@end example

복잡성을 줄이고 가독성을 개선하는 명확한 사례로 바다코끼리 연산자 사용을 제한하십시오.

자세한 설명은 
@geindex Python 향상 제안; PEP 572
PEP 572@footnote{https://peps.python.org/pep-0572/}를 참조하십시오.

(Contributed by Emily Morehouse in bpo-35224@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35224}.)

@node 위치 전용 매개 변수,컴파일된 바이트 코드 파일을 위한 병렬 파일 시스템 캐시,대입 표현식,새로운 기능<3>
@anchor{whatsnew/3 8 positional-only-parameters}@anchor{b97}
@subsubsection 위치 전용 매개 변수


일부 함수 매개 변수를 위치적으로 지정해야만 하고 키워드 인자로 사용할 수 없도록 지시하는 새로운 함수 매개 변수 문법 @code{/} 이 있습니다. 이것은 Larry Hastings의 Argument Clinic@footnote{https://devguide.python.org/development-tools/clinic/} 도구로 어노테이트된 C 함수들에 대해 @code{help()}가 보여주는 것과 같은 표기법입니다.

다음 예에서, 매개 변수 `a'와 `b'는 위치 전용이며, `c'나 `d'는 위치나 키워드일 수 있으며, `e'나 `f'는 키워드 전용이어야 합니다:

@example
def f(a, b, /, c, d, *, e, f):
    print(a, b, c, d, e, f)
@end example

다음은 유효한 호출입니다:

@example
f(10, 20, 30, d=40, e=50, f=60)
@end example

하지만, 다음은 잘못된 호출입니다:

@example
f(10, b=20, c=30, d=40, e=50, f=60)   # b는 키워드 인자일 수 없습니다
f(10, 20, 30, 40, 50, f=60)           # e는 키워드 인자여야 합니다
@end example

이 표기법의 한 가지 사용 사례는 순수 파이썬 함수가 기존 C 코드 함수의 동작을 완전히 흉내 낼 수 있다는 것입니다. 예를 들어, 내장 @ref{b98,,divmod()} 함수는 키워드 인자를 허용하지 않습니다:

@example
def divmod(a, b, /):
    "내장 divmod() 함수를 흉내 냅니다"
    return (a // b, a % b)
@end example

또 다른 사용 사례는 매개 변수 이름이 도움이 되지 않을 때 키워드 인자를 배제하는 것입니다. 예를 들어, 내장 @ref{83f,,len()} 함수의 서명은 @code{len(obj, /)}입니다. 이것은 다음과 같은 어색한 호출을 금지합니다:

@example
len(obj='hello')  # "obj" 키워드 인자는 가독성을 떨어뜨립니다
@end example

매개 변수를 위치 전용으로 표시하면 클라이언트 코드를 손상할 위험 없이 매개 변수 이름을 나중에 변경할 수 있다는 추가적인 이점이 있습니다. 예를 들어, @ref{d7,,statistics} 모듈에서, 매개 변수 이름 `dist'는 나중에 변경될 수 있습니다. 이것은 다음과 같은 함수 명세 때문에 가능해졌습니다:

@example
def quantiles(dist, /, *, n=4, method='exclusive')
    ...
@end example

@code{/}의 왼쪽에 있는 매개 변수는 가능한 키워드로 노출되지 않기 때문에, 매개 변수 이름은 @code{**kwargs}에서 계속 사용할 수 있습니다:

@example
>>> def f(a, b, /, **kwargs):
...     print(a, b, kwargs)
...
>>> f(10, 20, a=1, b=2, c=3)         # a와 b는 두 가지 방식으로 사용됩니다
10 20 @{'a': 1, 'b': 2, 'c': 3@}
@end example

이는 임의의 키워드 인자를 받아들여야 하는 함수와 메서드의 구현을 크게 단순화합니다. 예를 들어, 다음은 @ref{1e,,collections} 모듈의 코드에서 뽑아온 것입니다:

@example
class Counter(dict):

    def __init__(self, iterable=None, /, **kwds):
        # "iterable" 이 가능한 키워드 인자임에 유의하십시오
@end example

자세한 설명은 
@geindex Python 향상 제안; PEP 570
PEP 570@footnote{https://peps.python.org/pep-0570/}을 참조하십시오.

(Contributed by Pablo Galindo in bpo-36540@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36540}.)

@c TODO: Pablo will sprint on docs at PyCon US 2019.

@node 컴파일된 바이트 코드 파일을 위한 병렬 파일 시스템 캐시,디버그 빌드는 릴리스 빌드와 같은 ABI를 사용합니다,위치 전용 매개 변수,새로운 기능<3>
@anchor{whatsnew/3 8 parallel-filesystem-cache-for-compiled-bytecode-files}@anchor{b99}
@subsubsection 컴파일된 바이트 코드 파일을 위한 병렬 파일 시스템 캐시


새 
@geindex PYTHONPYCACHEPREFIX
@geindex 환경 변수; PYTHONPYCACHEPREFIX
@ref{b9a,,PYTHONPYCACHEPREFIX} 설정(@ref{16f,,-X} @code{pycache_prefix}로도 사용 가능합니다)은 각 소스 디렉터리 내의 기본 @code{__pycache__} 하위 디렉터리 대신 별도의 병렬 파일 시스템 트리를 사용하도록 묵시적 바이트 코드 캐시를 구성합니다.

캐시의 위치는 @ref{b9b,,sys.pycache_prefix}로 보고됩니다 (@ref{884,,None}은 @code{__pycache__} 하위 디렉터리의 기본 위치를 나타냅니다).

(Contributed by Carl Meyer in bpo-33499@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33499}.)

@node 디버그 빌드는 릴리스 빌드와 같은 ABI를 사용합니다,f-문자열은 스스로 설명하는 표현식과 디버깅을 위해 =를 지원합니다,컴파일된 바이트 코드 파일을 위한 병렬 파일 시스템 캐시,새로운 기능<3>
@anchor{whatsnew/3 8 debug-build-uses-the-same-abi-as-release-build}@anchor{b9c}
@subsubsection 디버그 빌드는 릴리스 빌드와 같은 ABI를 사용합니다.


파이썬은 이제 릴리스나 디버그 모드 중 어느 것으로 빌드되더라도 같은 ABI를 사용합니다. 유닉스에서, 파이썬이 디버그 모드로 빌드될 때, 이제 릴리스 모드로 빌드된 C 확장과 안정(stable) ABI를 사용해서 빌드된 C 확장을 로드할 수 있습니다.

릴리스 빌드와 @ref{508,,디버그 빌드}는 이제 ABI 호환됩니다: @code{Py_DEBUG} 매크로를 정의하는 것은 더는 @code{Py_TRACE_REFS} 매크로를 암시하지 않습니다, 이것은 ABI 비 호환성만 도입할 뿐입니다. @ref{28e,,sys.getobjects()} 함수와 
@geindex PYTHONDUMPREFS
@geindex 환경 변수; PYTHONDUMPREFS
@ref{b9d,,PYTHONDUMPREFS} 환경 변수를 추가하는 @code{Py_TRACE_REFS} 매크로는 새로운 @ref{634,,./configure --with-trace-refs} 빌드 옵션을 사용하여 설정할 수 있습니다. (Contributed by Victor Stinner in bpo-36465@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36465}.)

유닉스에서, C 확장은 안드로이드와 Cygwin을 제외하고는 더는 libpython에 링크되지 않습니다. 이제 정적으로 링크된 파이썬이 공유 라이브러리 파이썬을 사용하여 빌드된 C 확장을 로드할 수 있습니다. (Contributed by Victor Stinner in bpo-21536@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21536}.)

유닉스에서, 파이썬이 디버그 모드로 빌드될 때, 임포트는 이제 릴리스 모드로 컴파일된 C 확장과 안정(stable) ABI로 컴파일된 C 확장도 찾습니다. (Contributed by Victor Stinner in bpo-36722@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36722}.)

파이썬을 응용 프로그램에 내장하려면, 새로운 @code{--embed} 옵션을 @code{python3-config --libs --embed}에 전달하여 @code{-lpython3.8}을 얻어야 합니다 (응용 프로그램을 libpython에 링크합니다). 3.8 이하를 모두 지원하려면, 먼저 @code{python3-config --libs --embed}를 시도하고, 실패하면 @code{python3-config --libs}(@code{--embed} 없이)로 대체하십시오.

파이썬을 응용 프로그램에 내장하기 위해, pkg-config @code{python-3.8-embed} 모듈을 추가했습니다: @code{pkg-config python-3.8-embed --libs} 는 @code{-lpython3.8}을 포함합니다. 3.8 이하를 모두 지원하려면, 먼저 @code{pkg-config python-X.Y-embed --libs} 를 시도하고, 실패하면 @code{pkg-config python-X.Y --libs}(@code{--embed} 없이)로 대체하십시오 (@code{X.Y}를 파이썬 버전으로 교체하십시오).

반면에, @code{pkg-config python3.8 --libs} 는 더는 @code{-lpython3.8}을 포함하지 않습니다. C 확장은 libpython에 링크되어서는 안 됩니다 (안드로이드와 Cygwin은 예외인데, 이들은 스크립트로 처리됩니다); 이 변경은 의도적으로 이전 버전과 호환되지 않습니다. (Contributed by Victor Stinner in bpo-36721@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36721}.)

@node f-문자열은 스스로 설명하는 표현식과 디버깅을 위해 =를 지원합니다,PEP 578 파이썬 런타임 감사 훅,디버그 빌드는 릴리스 빌드와 같은 ABI를 사용합니다,새로운 기능<3>
@anchor{whatsnew/3 8 bpo-36817-whatsnew}@anchor{b9e}@anchor{whatsnew/3 8 f-strings-support-for-self-documenting-expressions-and-debugging}@anchor{b9f}
@subsubsection f-문자열은 스스로 설명하는 표현식과 디버깅을 위해 =를 지원합니다.


@ref{669,,f-문자열}에 @code{=} 지정자를 추가했습니다. @code{f'@{expr=@}'}과 같은 f-문자열은 표현식의 텍스트, 등호, 평가된 표현식의 표현(repr)으로 확장됩니다. 예를 들어:

@example
>>> import datetime as dt
>>> user = 'eric_idle'
>>> member_since = dt.date(1975, 7, 31)
>>> f'@{user=@} @{member_since=@}'
"user='eric_idle' member_since=datetime.date(1975, 7, 31)"
@end example

일반적인 @ref{19a,,f-문자열 포맷 지정자}를 사용하면 표현식의 결과가 표시되는 방식을 더 잘 제어할 수 있습니다:

@example
>>> delta = dt.date.today() - member_since
>>> f'@{user=!s@}  @{delta.days=:,d@}'
'user=eric_idle  delta.days=16,075'
@end example

@code{=} 지정자는 계산을 표시할 수 있도록 전체 표현식을 표시합니다:

@example
>>> print(f'@{theta=@}  @{cos(radians(theta))=:.3f@}')
theta=30  cos(radians(theta))=0.866
@end example

(Contributed by Eric V. Smith and Larry Hastings in bpo-36817@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36817}.)

@node PEP 578 파이썬 런타임 감사 훅,PEP 587 파이썬 초기화 구성,f-문자열은 스스로 설명하는 표현식과 디버깅을 위해 =를 지원합니다,새로운 기능<3>
@anchor{whatsnew/3 8 pep-578-python-runtime-audit-hooks}@anchor{ba0}
@subsubsection PEP 578: 파이썬 런타임 감사 훅


이 PEP는 감사 훅(Audit Hook)과 확인된 열기 훅(Verified Open Hook)을 추가합니다. 둘 다 파이썬과 네이티브 코드에서 사용 가능해서, 순수 파이썬 코드로 작성된 응용 프로그램과 프레임워크가 추가 알림을 활용할 수 있도록 함과 동시에 임베더(embedder)나 시스템 관리자가 감사가 항상 활성화된 파이썬 빌드를 배치할 수 있도록 합니다.

자세한 설명은 
@geindex Python 향상 제안; PEP 578
PEP 578@footnote{https://peps.python.org/pep-0578/}을 참조하십시오.

@node PEP 587 파이썬 초기화 구성,PEP 590 벡터콜 CPython을 위한 빠른 호출 프로토콜,PEP 578 파이썬 런타임 감사 훅,새로운 기능<3>
@anchor{whatsnew/3 8 pep-587-python-initialization-configuration}@anchor{ba1}
@subsubsection PEP 587: 파이썬 초기화 구성


@geindex Python 향상 제안; PEP 587
PEP 587@footnote{https://peps.python.org/pep-0587/}은 파이썬 초기화를 구성하는 새로운 C API를 추가하여 전체 구성에 대한 세밀한 제어와 개선된 에러 보고를 제공합니다.

새로운 구조체:


@itemize *

@item 
@ref{3f7,,PyConfig}

@item 
@ref{ba2,,PyPreConfig}

@item 
@ref{ba3,,PyStatus}

@item 
@ref{ba4,,PyWideStringList}
@end itemize

새로운 함수:


@itemize *

@item 
@ref{ba5,,PyConfig_Clear()}

@item 
@ref{ba6,,PyConfig_InitIsolatedConfig()}

@item 
@ref{ba7,,PyConfig_InitPythonConfig()}

@item 
@ref{992,,PyConfig_Read()}

@item 
@ref{ba8,,PyConfig_SetArgv()}

@item 
@ref{ba9,,PyConfig_SetBytesArgv()}

@item 
@ref{baa,,PyConfig_SetBytesString()}

@item 
@ref{bab,,PyConfig_SetString()}

@item 
@ref{bac,,PyPreConfig_InitIsolatedConfig()}

@item 
@ref{bad,,PyPreConfig_InitPythonConfig()}

@item 
@ref{bae,,PyStatus_Error()}

@item 
@ref{baf,,PyStatus_Exception()}

@item 
@ref{bb0,,PyStatus_Exit()}

@item 
@ref{bb1,,PyStatus_IsError()}

@item 
@ref{bb2,,PyStatus_IsExit()}

@item 
@ref{bb3,,PyStatus_NoMemory()}

@item 
@ref{bb4,,PyStatus_Ok()}

@item 
@ref{bb5,,PyWideStringList_Append()}

@item 
@ref{bb6,,PyWideStringList_Insert()}

@item 
@ref{bb7,,Py_BytesMain()}

@item 
@ref{bb8,,Py_ExitStatusException()}

@item 
@ref{3f6,,Py_InitializeFromConfig()}

@item 
@ref{41e,,Py_PreInitialize()}

@item 
@ref{bb9,,Py_PreInitializeFromArgs()}

@item 
@ref{bba,,Py_PreInitializeFromBytesArgs()}

@item 
@ref{bbb,,Py_RunMain()}
@end itemize

이 PEP는 이러한 내부 구조체에 @code{_PyRuntimeState.preconfig}(@ref{ba2,,PyPreConfig} 형)와 @code{PyInterpreterState.config} (@ref{3f7,,PyConfig} 형) 필드를 추가합니다. @code{PyInterpreterState.config}는 전역 구성 변수와 기타 내부(private) 변수를 대체하는 새로운 참조 구성이 됩니다.

설명서는 @ref{644,,파이썬 초기화 구성}을 참조하십시오.

자세한 설명은 
@geindex Python 향상 제안; PEP 587
PEP 587@footnote{https://peps.python.org/pep-0587/}을 참조하십시오.

(Contributed by Victor Stinner in bpo-36763@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36763}.)

@node PEP 590 벡터콜 CPython을 위한 빠른 호출 프로토콜,아웃 오브 밴드 데이터 버퍼를 사용하는 피클 프로토콜 5,PEP 587 파이썬 초기화 구성,새로운 기능<3>
@anchor{whatsnew/3 8 pep-590-vectorcall-a-fast-calling-protocol-for-cpython}@anchor{bbc}
@subsubsection PEP 590: 벡터콜: CPython을 위한 빠른 호출 프로토콜


@ref{773,,벡터콜(Vectorcall) 프로토콜}이 파이썬/C API에 추가되었습니다. 이것은 이미 다양한 클래스에 대해 수행된 기존 최적화를 형식화하기 위한 것입니다. 콜러블을 구현하는 모든 @ref{982,,정적인 형}은 이 프로토콜을 사용할 수 있습니다.

이것은 현재 잠정적(provisional)입니다. 목표는 파이썬 3.9에서 완전히 공개하는 것입니다.

자세한 설명은 
@geindex Python 향상 제안; PEP 590
PEP 590@footnote{https://peps.python.org/pep-0590/}을 참조하십시오.

(Contributed by Jeroen Demeyer, Mark Shannon and Petr Viktorin in bpo-36974@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36974}.)

@node 아웃 오브 밴드 데이터 버퍼를 사용하는 피클 프로토콜 5,,PEP 590 벡터콜 CPython을 위한 빠른 호출 프로토콜,새로운 기능<3>
@anchor{whatsnew/3 8 pickle-protocol-5-with-out-of-band-data-buffers}@anchor{bbd}
@subsubsection 아웃 오브 밴드 데이터 버퍼를 사용하는 피클 프로토콜 5


멀티 코어나 멀티 머신 프로세싱을 활용하기 위해 @ref{ab,,pickle}을 사용해서 파이썬 프로세스 간에 큰 데이터를 전송할 때, 메모리 복사를 줄이고 데이터 종속적 압축과 같은 사용자 정의 기술을 적용하여 전송을 최적화하는 것이 중요합니다.

@ref{ab,,pickle} 프로토콜 5는 통신 계층의 재량에 따라 
@geindex Python 향상 제안; PEP 3118
PEP 3118@footnote{https://peps.python.org/pep-3118/} 호환 데이터가 주 피클 스트림과 별도로 전송될 수 있는 아웃 오브 밴드 버퍼를 지원합니다.

자세한 설명은 
@geindex Python 향상 제안; PEP 574
PEP 574@footnote{https://peps.python.org/pep-0574/}를 참조하십시오.

(Contributed by Antoine Pitrou in bpo-36785@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36785}.)

@node 기타 언어 변경<3>,새 모듈<2>,새로운 기능<3>,파이썬 3 8의 새로운 기능
@anchor{whatsnew/3 8 other-language-changes}@anchor{bbe}
@subsection 기타 언어 변경



@itemize *

@item 
@ref{180,,continue} 문은 구현 문제로 인해 @ref{1b0,,finally} 절에서 사용할 수 없었습니다. 파이썬 3.8에서는 이 제한이 제거되었습니다. (Contributed by Serhiy Storchaka in bpo-32489@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32489}.)

@item 
@ref{3c3,,bool}, @ref{19b,,int} 및 @ref{213,,fractions.Fraction} 형에는 이제 @ref{196,,float}와 @ref{1fe,,decimal.Decimal}에서 발견되는 것과 유사한 @ref{bbf,,as_integer_ratio()} 메서드가 있습니다. 이 작은 API 확장을 통해 @code{numerator, denominator = x.as_integer_ratio()}라고 쓰고 여러 숫자 형에서 작동하도록 할 수 있습니다. (Contributed by Lisa Roach in bpo-33073@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33073} and Raymond Hettinger in bpo-37819@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37819}.)

@item 
@ref{19b,,int}, @ref{196,,float} 및 @ref{197,,complex}의 생성자는 이제 해당 메서드 @ref{19d,,__int__()}, @ref{bc0,,__float__()} 또는 @ref{7fc,,__complex__()}를 사용할 수 없을 때, @ref{19e,,__index__()} 특수 메서드가 있으면 사용할 수 있습니다. (Contributed by Serhiy Storchaka in bpo-20092@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20092}.)

@item 
@ref{be,,정규식}에 @code{\N@{@var{name}@}} 이스케이프 지원이 추가되었습니다:

@example
>>> notice = 'Copyright © 2019'
>>> copyright_year_pattern = re.compile(r'\N@{copyright sign@}\s*(\d@{4@})')
>>> int(copyright_year_pattern.search(notice).group(1))
2019
@end example

(Contributed by Jonathan Eunice and Serhiy Storchaka in bpo-30688@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30688}.)

@item 
이제 딕셔너리와 딕셔너리 뷰는 @ref{a65,,reversed()}를 사용하여 삽입 순서의 역순으로 이터레이트 할 수 있습니다. (Contributed by Rémi Lapeyre in bpo-33462@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33462}.)

@item 
함수 호출에서 키워드 이름에 허용된 문법이 더 제한되었습니다. 특히, @code{f((keyword)=arg)}는 더는 허용되지 않습니다. 키워드 인자 대입 항의 왼쪽에 이름 그대로 이상의 것을 허용하려는 의도는 결코 없었습니다. (Contributed by Benjamin Peterson in bpo-34641@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34641}.)

@item 
@ref{bc1,,yield}와 @ref{1af,,return} 문에서의 일반화된 이터러블 언 패킹은 더는 둘러싸는 괄호를 요구하지 않습니다. 이는 `yield'와 `return' 문법이 일반 대입 문법과 더 잘 일치하도록 만듭니다:

@example
>>> def parse(family):
...     lastname, *members = family.split()
...     return lastname.upper(), *members
...
>>> parse('simpsons homer marge bart lisa maggie')
('SIMPSONS', 'homer', 'marge', 'bart', 'lisa', 'maggie')
@end example

(Contributed by David Cuthbert and Jordan Chapman in bpo-32117@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32117}.)

@item 
@code{[(10, 20) (30, 40)]}와 같은 코드에서처럼 쉼표가 빠질 때, 컴파일러는 유용한 제안과 함께 @ref{1ae,,SyntaxWarning}을 표시합니다. 이것은 단지 첫 번째 튜플이 콜러블이 아니라고 알리는 @ref{198,,TypeError}를 개선한 것입니다. (Contributed by Serhiy Storchaka in bpo-15248@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15248}.)

@item 
@ref{1fa,,datetime.date}나 @ref{4e2,,datetime.datetime}의 서브 클래스와 @ref{bc2,,datetime.timedelta} 객체 간의 산술 연산은 이제 베이스 클래스가 아닌 서브 클래스의 인스턴스를 반환합니다. 이는 @ref{bc3,,astimezone()}과 같은 @code{datetime.timedelta} 산술을 직접 또는 간접적으로 사용하는 연산의 반환형에도 영향을 줍니다. (Contributed by Paul Ganssle in bpo-32417@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32417}.)

@item 
파이썬 인터프리터가 Ctrl-C(SIGINT)에 의해 인터럽트 되고 그로 인한 @ref{bc4,,KeyboardInterrupt} 예외가 잡히지 않으면, 파이썬 프로세스는 이제 Ctrl-C로 인해 죽었다는 것을 호출한 프로세스가 감지할 수 있도록 SIGINT 시그널을 통해서나 올바른 종료 코드를 통해 종료합니다. POSIX와 윈도우의 셸은 대화식 세션에서 스크립트를 올바르게 종료하기 위해 이를 사용합니다. (Contributed by Google via Gregory P. Smith in bpo-1054041@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1054041}.)

@item 
일부 고급 프로그래밍 스타일은 기존 함수에 대한 @ref{32f,,types.CodeType} 객체를 갱신할 필요가 있습니다. 코드 객체는 불변이므로, 기존 코드 객체에 기반하는 새 코드 객체를 만들어야 합니다. 19개의 매개 변수 때문에, 다소 지루했습니다. 이제, 새로운 @code{replace()} 메서드를 사용하면 몇 가지 변경된 매개 변수만으로 복제본을 만들 수 있습니다.

다음은 `data' 매개 변수가 키워드 인자로 사용되지 않도록 @ref{8e0,,statistics.mean()} 함수를 변경하는 예입니다:

@example
>>> from statistics import mean
>>> mean(data=[10, 20, 90])
40
>>> mean.__code__ = mean.__code__.replace(co_posonlyargcount=1)
>>> mean(data=[10, 20, 90])
Traceback (most recent call last):
  ...
TypeError: mean() got some positional-only arguments passed as keyword arguments: 'data'
@end example

(Contributed by Victor Stinner in bpo-37032@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37032}.)

@item 
정수의 경우, @ref{1a4,,pow()} 함수의 세 인자 형식은 이제 밑이 모듈러스와 서로소일 때 음수 지수를 허용합니다. 지수가 @code{-1}일 때 밑에 대한 모듈러 역수를 계산하고, 다른 음수 지수에 대해서는 그 역수의 적절한 거듭제곱을 계산합니다. 예를 들어, 모듈로 137에 대한 38의 모듈러 역수@footnote{https://en.wikipedia.org/wiki/Modular_multiplicative_inverse}를 계산하려면, 다음과 같이 작성하십시오:

@example
>>> pow(38, -1, 137)
119
>>> 119 * 38 % 137
1
@end example

모듈러 역수는 선형 디오판토스 방정식(linear Diophantine equations)@footnote{https://en.wikipedia.org/wiki/Diophantine_equation}의 해에서 나타납니다. 예를 들어, @code{4258𝑥 + 147𝑦 = 369}에 대한 정수해를 찾으려면, 먼저 @code{4258𝑥 ≡ 369 (mod 147)}로 다시 쓴 다음 해를 구하십시오:

@example
>>> x = 369 * pow(4258, -1, 147) % 147
>>> y = (4258 * x - 369) // -147
>>> 4258 * x + 147 * y
369
@end example

(Contributed by Mark Dickinson in bpo-36027@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36027}.)

@item 
키가 먼저 계산되고 값이 두 번째로 계산되도록, 딕셔너리 컴프리헨션은 딕셔너리 리터럴과 동기화되었습니다:

@example
>>> # 딕셔너리 컴프리헨션
>>> cast = @{input('role? '): input('actor? ') for i in range(2)@}
role? King Arthur
actor? Chapman
role? Black Knight
actor? Cleese

>>> # 딕셔너리 리터럴
>>> cast = @{input('role? '): input('actor? ')@}
role? Sir Robin
actor? Eric Idle
@end example

키 표현식에서 대입된 변수를 값 표현식에서 사용할 수 있기 때문에, 보장된 실행 순서는 대입 표현식에 유용합니다:

@example
>>> names = ['Martin von Löwis', 'Łukasz Langa', 'Walter Dörwald']
>>> @{(n := normalize('NFC', name)).casefold() : n for name in names@}
@{'martin von löwis': 'Martin von Löwis',
 'łukasz langa': 'Łukasz Langa',
 'walter dörwald': 'Walter Dörwald'@}
@end example

(Contributed by Jörn Heissler in bpo-35224@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35224}.)

@item 
The @ref{bc5,,object.__reduce__()} method can now return a tuple from two to
six elements long. Formerly, five was the limit.  The new, optional sixth
element is a callable with a @code{(obj, state)} signature.  This allows the
direct control over the state-updating behavior of a specific object.  If
not `None', this callable will have priority over the object’s
@ref{bc6,,__setstate__()} method.
(Contributed by Pierre Glaser and Olivier Grisel in bpo-35900@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35900}.)
@end itemize

@node 새 모듈<2>,개선된 모듈<2>,기타 언어 변경<3>,파이썬 3 8의 새로운 기능
@anchor{whatsnew/3 8 new-modules}@anchor{bc7}
@subsection 새 모듈



@itemize *

@item 
새로운 @ref{7e,,importlib.metadata} 모듈은 제삼자 패키지에서 메타 데이터를 읽을 수 있도록 (잠정적으로) 지원합니다. 예를 들어, 설치된 패키지의 버전 번호, 진입점 목록 등을 추출 할 수 있습니다:

@example
>>> # 다음 예에서는 널리 사용되는 "requests" 패키지가 설치되어 있어야 함에
>>> # 유의하십시오.
>>>
>>> from importlib.metadata import version, requires, files
>>> version('requests')
'2.22.0'
>>> list(requires('requests'))
['chardet (<3.1.0,>=3.0.2)']
>>> list(files('requests'))[:5]
[PackagePath('requests-2.22.0.dist-info/INSTALLER'),
 PackagePath('requests-2.22.0.dist-info/LICENSE'),
 PackagePath('requests-2.22.0.dist-info/METADATA'),
 PackagePath('requests-2.22.0.dist-info/RECORD'),
 PackagePath('requests-2.22.0.dist-info/WHEEL')]
@end example

(Contributed by Barry Warsaw and Jason R. Coombs in bpo-34632@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34632}.)
@end itemize

@node 개선된 모듈<2>,최적화<2>,새 모듈<2>,파이썬 3 8의 새로운 기능
@anchor{whatsnew/3 8 improved-modules}@anchor{bc8}
@subsection 개선된 모듈


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

@end menu

@node ast<5>,asyncio<9>,,개선된 모듈<2>
@anchor{whatsnew/3 8 ast}@anchor{bc9}
@subsubsection ast


이제 AST 노드는 노드 끝의 정확한 위치를 제공하는 @code{end_lineno}와 @code{end_col_offset} 어트리뷰트를 가집니다. (이것은 @code{lineno}와 @code{col_offset} 어트리뷰트가 있는 노드에만 적용됩니다.)

새 함수 @ref{bca,,ast.get_source_segment()}는 특정 AST 노드의 소스 코드를 반환합니다.

(Contributed by Ivan Levkivskyi in bpo-33416@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33416}.)

@ref{1c2,,ast.parse()} 함수에는 몇 가지 새로운 플래그가 있습니다:


@itemize *

@item 
@code{type_comments=True}는 특정 AST 노드와 연관된 
@geindex Python 향상 제안; PEP 484
PEP 484@footnote{https://peps.python.org/pep-0484/}와 
@geindex Python 향상 제안; PEP 526
PEP 526@footnote{https://peps.python.org/pep-0526/} 형 주석의 텍스트를 반환하도록 합니다;

@item 
@code{mode='func_type'}은 
@geindex Python 향상 제안; PEP 484
PEP 484@footnote{https://peps.python.org/pep-0484/} “서명 형 주석”(함수 정의 AST 노드에 대해 반환됩니다)을 구문 분석하는 데 사용될 수 있습니다;

@item 
@code{feature_version=(3, N)}은 이전 버전의 파이썬 3을 지정할 수 있게 합니다. 예를 들어, @code{feature_version=(3, 4)}는 @ref{93a,,async}와 @ref{18d,,await}를 예약어가 아닌 단어로 취급합니다.
@end itemize

(Contributed by Guido van Rossum in bpo-35766@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35766}.)

@node asyncio<9>,builtins<2>,ast<5>,개선된 모듈<2>
@anchor{whatsnew/3 8 asyncio}@anchor{bcb}
@subsubsection asyncio


@ref{2f3,,asyncio.run()}은 임시 API를 졸업하고 안정 API가 되었습니다. 이 함수는 이벤트 루프를 자동으로 관리하면서 @ref{6b8,,코루틴}을 실행하고 결과를 반환하는 데 사용할 수 있습니다. 예를 들면:

@example
import asyncio

async def main():
    await asyncio.sleep(0)
    return 42

asyncio.run(main())
@end example

이것은 `대략' 다음과 동등합니다:

@example
import asyncio

async def main():
    await asyncio.sleep(0)
    return 42

loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
try:
    loop.run_until_complete(main())
finally:
    asyncio.set_event_loop(None)
    loop.close()
@end example

실제 구현은 훨씬 더 복잡합니다. 따라서, @ref{2f3,,asyncio.run()}은 asyncio 프로그램을 실행하는 데 선호되는 방법이어야 합니다.

(Contributed by Yury Selivanov in bpo-32314@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32314}.)

@code{python -m asyncio}를 실행하면 네이티브 하게 비동기 REPL을 시작합니다. 이를 통해 최상위 @ref{18d,,await}가 있는 코드를 빠르게 실험할 수 있습니다. 더는 호출할 때마다 새로운 이벤트 루프를 만드는 @code{asyncio.run()}을 직접 호출할 필요가 없습니다:

@example
$ python -m asyncio
asyncio REPL 3.8.0
Use "await" directly instead of "asyncio.run()".
Type "help", "copyright", "credits" or "license" for more information.
>>> import asyncio
>>> await asyncio.sleep(10, result='hello')
hello
@end example

(Contributed by Yury Selivanov in bpo-37028@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37028}.)

@ref{4d5,,asyncio.CancelledError} 예외는 이제 @ref{bcc,,Exception}이 아닌 @ref{7d6,,BaseException}을 상속하고, 더는 @ref{bcd,,concurrent.futures.CancelledError}를 상속하지 않습니다. (Contributed by Yury Selivanov in bpo-32528@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32528}.)

윈도우에서, 기본 이벤트 루프는 이제 @ref{81c,,ProactorEventLoop} 입니다. (Contributed by Victor Stinner in bpo-34687@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34687}.)

@ref{81c,,ProactorEventLoop}는 이제 UDP도 지원합니다. (Contributed by Adam Meily and Andrew Svetlov in bpo-29883@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29883}.)

이제 @ref{81c,,ProactorEventLoop}가 @ref{bc4,,KeyboardInterrupt}(“CTRL+C”)에 의해 인터럽트 될 수 있습니다. (Contributed by Vladimir Matveev in bpo-23057@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23057}.)

@ref{1c7,,asyncio.Task} 내에 래핑 된 코루틴을 얻기 위한 @ref{bce,,asyncio.Task.get_coro()}를 추가했습니다. (Contributed by Alex Grönholm in bpo-36999@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36999}.)

이제 @code{name} 키워드 인자를 @ref{1c9,,asyncio.create_task()}나 @ref{1ca,,create_task()} 이벤트 루프 메서드에 전달하거나, 태스크 객체의 @ref{bcf,,set_name()} 메서드를 호출하여 asyncio 태스크의 이름을 지정할 수 있습니다. 태스크 이름은 @ref{1c7,,asyncio.Task}의 @code{repr()} 출력에 표시되며 @ref{bd0,,get_name()} 메서드를 사용하여 조회할 수도 있습니다. (Contributed by Alex Grönholm in bpo-34270@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34270}.)

@ref{817,,asyncio.loop.create_connection()}에 Happy Eyeballs@footnote{https://en.wikipedia.org/wiki/Happy_Eyeballs}에 대한 지원이 추가되었습니다. 동작을 지정하기 위해, 두 개의 매개변수가 추가되었습니다: `happy_eyeballs_delay'와 `interleave'. Happy Eyeballs 알고리즘은 IPv4와 IPv6을 지원하는 응용 프로그램에서 둘 모두를 사용하여 동시에 연결을 시도하여 응답성을 향상합니다. (Contributed by twisteroid ambassador in bpo-33530@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33530}.)

@node builtins<2>,collections,asyncio<9>,개선된 모듈<2>
@anchor{whatsnew/3 8 builtins}@anchor{bd1}
@subsubsection builtins


내장 @ref{4b2,,compile()}이 @code{ast.PyCF_ALLOW_TOP_LEVEL_AWAIT} 플래그를 받아들이도록 개선되었습니다. 이 새 플래그가 전달되면, @code{compile()}은 일반적으로 유효하지 문법으로 간주하는 최상위 수준 @code{await}, @code{async for} 및 @code{async with} 구문을 허용합니다. 그러면 @code{CO_COROUTINE} 플래그로 표시된 비동기 코드 객체가 반환될 수 있습니다. (Contributed by Matthias Bussonnier in bpo-34616@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34616})

@node collections,cProfile,builtins<2>,개선된 모듈<2>
@anchor{whatsnew/3 8 collections}@anchor{bd2}
@subsubsection collections


이제 @ref{4e0,,collections.namedtuple()}의 @ref{bd3,,_asdict()} 메서드는 @ref{7f2,,collections.OrderedDict} 대신 @ref{183,,dict}를 반환합니다. 파이썬 3.7부터 일반 딕셔너리가 순서를 보장하기 때문에 이것이 가능합니다. @code{OrderedDict}의 추가 기능이 필요하면, 제안된 해결 방법은 원하는 형으로 결과를 캐스팅하는 것입니다: @code{OrderedDict(nt._asdict())}. (Contributed by Raymond Hettinger in bpo-35864@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35864}.)

@node cProfile,csv<2>,collections,개선된 모듈<2>
@anchor{whatsnew/3 8 cprofile}@anchor{bd4}
@subsubsection cProfile


@ref{bd5,,cProfile.Profile} 클래스는 이제 컨텍스트 관리자로 사용할 수 있습니다. 다음처럼 코드 블록을 프로파일 하십시오:

@example
import cProfile

with cProfile.Profile() as profiler:
      # 프로파일 할 코드
      ...
@end example

(Contributed by Scott Sanderson in bpo-29235@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29235}.)

@node csv<2>,curses<4>,cProfile,개선된 모듈<2>
@anchor{whatsnew/3 8 csv}@anchor{bd6}
@subsubsection csv


@ref{bd7,,csv.DictReader}는 이제 @ref{7f2,,collections.OrderedDict} 대신 @ref{183,,dict}의 인스턴스를 반환합니다. 이 도구는 이제 여전히 필드 순서를 유지하면서 더 빠르고 메모리를 덜 사용합니다. (Contributed by Michael Selik in bpo-34003@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34003}.)

@node curses<4>,ctypes<3>,csv<2>,개선된 모듈<2>
@anchor{whatsnew/3 8 curses}@anchor{bd8}
@subsubsection curses


하부 ncurses 라이브러리에 대한 구조화된 버전 정보를 담는 새로운 변수를 추가했습니다: @ref{bd9,,ncurses_version}. (Contributed by Serhiy Storchaka in bpo-31680@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31680}.)

@node ctypes<3>,datetime<4>,curses<4>,개선된 모듈<2>
@anchor{whatsnew/3 8 ctypes}@anchor{bda}
@subsubsection ctypes


윈도우에서, @ref{bdb,,CDLL} 및 서브 클래스는 이제 하부 @code{LoadLibraryEx} 호출에 대한 플래그를 지정하는 `winmode' 매개 변수를 받아들입니다. 기본 플래그는 DLL이 저장된 경로(전체나 부분 경로가 초기 DLL을 로드하는 데 사용되었다면)와 @ref{bdc,,add_dll_directory()}로 추가된 경로를 포함하여 신뢰할 수 있는 위치에서만 DLL 종속성을 로드하도록 설정됩니다. (Contributed by Steve Dower in bpo-36085@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36085}.)

@node datetime<4>,functools<3>,ctypes<3>,개선된 모듈<2>
@anchor{whatsnew/3 8 datetime}@anchor{bdd}
@subsubsection datetime


ISO 년, 주 번호 및 요일로 @ref{1fa,,date}와 @ref{4e2,,datetime} 객체를 각각 생성하는, 새로운 대체 생성자 @ref{bde,,datetime.date.fromisocalendar()} 와 @ref{bdf,,datetime.datetime.fromisocalendar()}를 추가했습니다; 이것들은 각 클래스의 @code{isocalendar} 메서드의 역입니다. (Contributed by Paul Ganssle in bpo-36004@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36004}.)

@node functools<3>,gc<4>,datetime<4>,개선된 모듈<2>
@anchor{whatsnew/3 8 functools}@anchor{be0}
@subsubsection functools


이제 @ref{be1,,functools.lru_cache()}는 데코레이터를 반환하는 함수가 아닌 직접적인 데코레이터로 사용할 수 있습니다. 그래서 이 두 가지가 모두 지원됩니다:

@example
@@lru_cache
def f(x):
    ...

@@lru_cache(maxsize=256)
def f(x):
    ...
@end example

(Contributed by Raymond Hettinger in bpo-36772@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36772}.)

인스턴스 수명 동안 캐시 된 계산된 속성을 위한 새로운 @ref{762,,functools.cached_property()} 데코레이터를 추가했습니다.

@example
import functools
import statistics

class Dataset:
   def __init__(self, sequence_of_numbers):
      self.data = sequence_of_numbers

   @@functools.cached_property
   def variance(self):
      return statistics.variance(self.data)
@end example

(Contributed by Carl Meyer in bpo-21145@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21145})

@ref{be2,,싱글 디스패치}를 사용하여 메서드를 @ref{be3,,제네릭 함수}로 변환하는 새로운 @ref{be4,,functools.singledispatchmethod()} 데코레이터를 추가했습니다:

@example
from functools import singledispatchmethod
from contextlib import suppress

class TaskManager:

    def __init__(self, tasks):
        self.tasks = list(tasks)

    @@singledispatchmethod
    def discard(self, value):
        with suppress(ValueError):
            self.tasks.remove(value)

    @@discard.register(list)
    def _(self, tasks):
        targets = set(tasks)
        self.tasks = [x for x in self.tasks if x not in targets]
@end example

(Contributed by Ethan Smith in bpo-32380@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32380})

@node gc<4>,gettext,functools<3>,개선된 모듈<2>
@anchor{whatsnew/3 8 gc}@anchor{be5}
@subsubsection gc


이제 @ref{a04,,get_objects()}는 객체를 가져올 세대(generation)를 나타내는 선택적 `generation' 매개 변수를 받을 수 있습니다. (Contributed by Pablo Galindo in bpo-36016@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36016}.)

@node gettext,gzip<3>,gc<4>,개선된 모듈<2>
@anchor{whatsnew/3 8 gettext}@anchor{be6}
@subsubsection gettext


@ref{be7,,pgettext()}와 그 변형을 추가했습니다. (Contributed by Franz Glasner, Éric Araujo, and Cheryl Sabella in bpo-2504@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2504}.)

@node gzip<3>,IDLE과 idlelib<2>,gettext,개선된 모듈<2>
@anchor{whatsnew/3 8 gzip}@anchor{be8}
@subsubsection gzip


재현성 있는 출력을 위해 @ref{84d,,gzip.compress()}에 `mtime' 매개 변수를 추가했습니다. (Contributed by Guo Ci Teo in bpo-34898@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34898}.)

특정 유형의 유효하지 않거나 손상된 gzip 파일의 경우 이제 @ref{2c0,,OSError} 대신 @ref{be9,,BadGzipFile} 예외가 발생합니다. (Contributed by Filip Gruszczyński, Michele Orrù, and Zackery Spytz in bpo-6584@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6584}.)

@node IDLE과 idlelib<2>,inspect<6>,gzip<3>,개선된 모듈<2>
@anchor{whatsnew/3 8 idle-and-idlelib}@anchor{bea}
@subsubsection IDLE과 idlelib


N 줄(기본적으로 50)을 초과하는 출력은 버튼으로 축소됩니다. N은 설정 대화 상자의 General 페이지의 PyShell 섹션에서 변경할 수 있습니다. 그보다 작은, 하지만 아주 길 수도 있는, 줄은 출력을 마우스 오른쪽 버튼으로 클릭하면 압착할 수 있습니다. 압착된 출력은 버튼을 더블 클릭해서 제자리에서 확장하거나, 버튼을 마우스 오른쪽 단추로 클릭하여 클립 보드나 별도의 창으로 확장할 수 있습니다. (Contributed by Tal Einat in bpo-1529353@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1529353}.)

사용자 정의 설정으로 모듈을 실행하기 위해 Run 메뉴에 “Run Customized”를 추가합니다. 입력한 모든 명령 줄 인자는 sys.argv에 추가됩니다. 또한 다음 사용자 정의 실행을 위해 상자에 다시 나타납니다. 일반적인 셸 메인 모듈 재시작을 억제할 수도 있습니다. (Contributed by Cheryl Sabella, Terry Jan Reedy, and others in bpo-5680@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5680} and bpo-37627@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37627}.)

IDLE 편집기 창에 선택적인 줄 번호를 추가했습니다. 창은 구성 대화 상자의 General 탭에서 설정하지 않는 한 줄 번호 없이 열립니다. 기존 창의 줄 번호는 옵션 메뉴에서 표시되거나 숨겨집니다. (Contributed by Tal Einat and Saimadhav Heblikar in bpo-17535@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17535}.)

OS 네이티브 인코딩은 이제 파이썬 문자열과 Tcl 객체 간 변환에 사용됩니다. 이를 통해 IDLE은 그림 이모티콘과 기타 BMP가 아닌 문자를 사용할 수 있습니다. 이러한 문자는 표시하거나 클립 보드에 복사하고 클립보드에서 붙여넣을 수 있습니다. 문자열을 Tcl에서 파이썬으로 변환했다가 되돌리는 것은 이제 실패하지 않습니다. (많은 사람이 8년 동안 이 작업을 했지만, 마침내 Serhiy Storchaka가 이 문제를 bpo-13153@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13153}에서 해결했습니다.)

3.8.1의 새로운 기능:

커서 깜박임을 토글하는 옵션을 추가합니다. (Contributed by Zackery Spytz in bpo-4603@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4603}.)

이스케이프 키는 이제 IDLE 완성(completion) 창을 닫습니다. (Contributed by Johnny Najera in bpo-38944@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38944}.)

위의 변경 사항은 3.7 유지 보수 릴리스로 역 이식되었습니다.

모듈 이름 완성 리스트에 키워드를 추가합니다. (Contributed by Terry J. Reedy in bpo-37765@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37765}.)

@node inspect<6>,io<5>,IDLE과 idlelib<2>,개선된 모듈<2>
@anchor{whatsnew/3 8 inspect}@anchor{beb}
@subsubsection inspect


@ref{bec,,inspect.getdoc()} 함수는 이제 @code{__slots__} 어트리뷰트가 값이 독스트링인 @ref{183,,dict}면 독스트링을 찾을 수 있습니다. 이것은 @ref{4b3,,property()}, @ref{48f,,classmethod()} 및 @ref{453,,staticmethod()}에 대해 이미 가지고 있는 것과 유사한 문서화 옵션을 제공합니다:

@example
class AudioClip:
    __slots__ = @{'bit_rate': 'expressed in kilohertz to one decimal place',
                 'duration': 'in seconds, rounded up to an integer'@}
    def __init__(self, bit_rate, duration):
        self.bit_rate = round(bit_rate / 1000.0, 1)
        self.duration = ceil(duration)
@end example

(Contributed by Raymond Hettinger in bpo-36326@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36326}.)

@node io<5>,itertools<5>,inspect<6>,개선된 모듈<2>
@anchor{whatsnew/3 8 io}@anchor{bed}
@subsubsection io


개발 모드(@ref{16f,,-X} @code{env})와 @ref{508,,디버그 빌드}에서, @code{close()} 메서드가 실패하면 @ref{504,,io.IOBase} 파이널라이저가 이제 예외를 로그 합니다. 릴리스 빌드에서는 기본적으로 예외가 조용히 무시됩니다. (Contributed by Victor Stinner in bpo-18748@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18748}.)

@node itertools<5>,json tool,io<5>,개선된 모듈<2>
@anchor{whatsnew/3 8 itertools}@anchor{bee}
@subsubsection itertools


@ref{bef,,itertools.accumulate()} 함수는 초깃값을 지정하기 위한 옵션 `initial' 키워드 인자를 추가했습니다:

@example
>>> from itertools import accumulate
>>> list(accumulate([10, 5, 30, 15], initial=1000))
[1000, 1010, 1015, 1045, 1060]
@end example

(Contributed by Lisa Roach in bpo-34659@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34659}.)

@node json tool,logging<2>,itertools<5>,개선된 모듈<2>
@anchor{whatsnew/3 8 json-tool}@anchor{bf0}
@subsubsection json.tool


모든 입력 행을 별도의 JSON 객체로 구문 분석하는 @code{--json-lines} 옵션을 추가했습니다. (Contributed by Weipeng Hong in bpo-31553@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31553}.)

@node logging<2>,math<6>,json tool,개선된 모듈<2>
@anchor{whatsnew/3 8 logging}@anchor{bf1}
@subsubsection logging


@ref{bf2,,logging.basicConfig()}에 `force' 키워드 인자를 추가했습니다. 참으로 설정하면, 루트 로거에 연결된 기존 처리기는 다른 인자로 지정된 구성을 수행하기 전에 제거되고 닫힙니다.

이것은 오랜 문제를 해결합니다. 일단 로거나 `basicConfig()'가 호출되면, `basicConfig()'에 대한 후속 호출은 조용히 무시되었습니다. 이로 인해 대화식 프롬프트나 Jupyter 노트북을 사용하여 다양한 로깅 구성 옵션을 갱신, 실험 또는 가르치기가 어려웠습니다.

(Suggested by Raymond Hettinger, implemented by Donghee Na, and
reviewed by Vinay Sajip in bpo-33897@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33897}.)

@node math<6>,mmap<2>,logging<2>,개선된 모듈<2>
@anchor{whatsnew/3 8 math}@anchor{bf3}
@subsubsection math


두 점 사이의 유클리드 거리를 계산하기 위한 새로운 함수 @ref{bf4,,math.dist()}가 추가되었습니다. (Contributed by Raymond Hettinger in bpo-33089@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33089}.)

다중 차원을 처리하도록 @ref{bf5,,math.hypot()} 함수를 확장했습니다. 이전에는, 2-D 케이스 만 지원했습니다. (Contributed by Raymond Hettinger in bpo-33089@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33089}.)

‘start’ 값(기본값: 1)과 숫자의 이터러블의 곱을 반환하는 @ref{694,,sum()}의 대응 물인 새 함수 @ref{bf6,,math.prod()}를 추가했습니다:

@example
>>> prior = 0.8
>>> likelihoods = [0.625, 0.84, 0.30]
>>> math.prod(likelihoods, start=prior)
0.126
@end example

(Contributed by Pablo Galindo in bpo-35606@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35606}.)

새로운 조합 함수(combinatoric functions) @ref{8df,,math.perm()}와 @ref{8de,,math.comb()}가 추가되었습니다:

@example
>>> math.perm(10, 3)    # 10개 중에서 한 번에 3개를 취한 순열
720
>>> math.comb(10, 3)    # 10개 중에서 한 번에 3개를 취한 조합
120
@end example

(Contributed by Yash Aggarwal, Keller Fuchs, Serhiy Storchaka, and Raymond
Hettinger in bpo-37128@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37128}, bpo-37178@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37178}, and bpo-35431@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35431}.)

정수 제곱근을 부동 소수점으로 변환하지 않고 정확하게 계산하기 위한 새로운 함수 @ref{bf7,,math.isqrt()}를 추가했습니다. 새 함수는 제한 없이 큰 정수를 지원합니다. @code{floor(sqrt(n))} 보다 빠르지만 @ref{bf8,,math.sqrt()} 보다 느립니다:

@example
>>> r = 650320427
>>> s = r ** 2
>>> isqrt(s - 1)         # 정확합니다
650320426
>>> floor(sqrt(s - 1))   # 부정확합니다
650320427
@end example

(Contributed by Mark Dickinson in bpo-36887@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36887}.)

함수 @ref{b41,,math.factorial()}은 더는 int-류가 아닌 인자를 받아들이지 않습니다. (Contributed by Pablo Galindo in bpo-33083@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33083}.)

@node mmap<2>,multiprocessing<4>,math<6>,개선된 모듈<2>
@anchor{whatsnew/3 8 mmap}@anchor{bf9}
@subsubsection mmap


@ref{518,,mmap.mmap} 클래스에는 이제 @code{madvise()} 시스템 호출에 액세스하는 @ref{bfa,,madvise()} 메서드가 있습니다. (Contributed by Zackery Spytz in bpo-32941@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32941}.)

@node multiprocessing<4>,os<7>,mmap<2>,개선된 모듈<2>
@anchor{whatsnew/3 8 multiprocessing}@anchor{bfb}
@subsubsection multiprocessing


새로운 @ref{9d,,multiprocessing.shared_memory} 모듈을 추가했습니다. (Contributed by Davin Potts in bpo-35813@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35813}.)

macOS에서, 이제 기본적으로 `spawn' 시작 방법이 사용됩니다. (Contributed by Victor Stinner in bpo-33725@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33725}.)

@node os<7>,os path<5>,multiprocessing<4>,개선된 모듈<2>
@anchor{whatsnew/3 8 os}@anchor{bfc}
@subsubsection os


확장 모듈을 임포트 하거나 @ref{2e,,ctypes}를 사용하여 DLL을 로드할 때 네이티브 종속성에 대한 추가 검색 경로를 제공하기 위해 윈도우에서 새로운 함수 @ref{bdc,,add_dll_directory()}가 추가되었습니다. (Contributed by Steve Dower in bpo-36085@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36085}.)

새로운 @ref{bfd,,os.memfd_create()} 함수가 추가되어 @code{memfd_create()} 시스템 호출을 감쌉니다. (Contributed by Zackery Spytz and Christian Heimes in bpo-26836@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26836}.)

On Windows, much of the manual logic for handling reparse points (including
symlinks and directory junctions) has been delegated to the operating system.
Specifically, @ref{26d,,os.stat()} will now traverse anything supported by the
operating system, while @ref{6c7,,os.lstat()} will only open reparse points that
identify as “name surrogates” while others are opened as for @code{os.stat()}.
In all cases, @ref{bfe,,os.stat_result.st_mode} will only have @code{S_IFLNK} set for
symbolic links and not other kinds of reparse points. To identify other kinds
of reparse point, check the new @ref{bff,,os.stat_result.st_reparse_tag} attribute.

윈도우에서, @ref{b19,,os.readlink()}는 이제 디렉터리 정션을 읽을 수 있습니다. @ref{c00,,islink()}는 디렉터리 정션에 대해 @code{False}를 반환함에 유의하십시오. 따라서 @code{islink}를 먼저 확인하는 코드는 정션을 계속 디렉터리로 처리하지만, @code{os.readlink()}의 에러를 처리하는 코드는 정션을 이제 링크로 처리할 수 있습니다.

(Contributed by Steve Dower in bpo-37834@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37834}.)

@node os path<5>,pathlib<10>,os<7>,개선된 모듈<2>
@anchor{whatsnew/3 8 os-path}@anchor{c01}
@subsubsection os.path


@ref{c02,,exists()}, @ref{c03,,lexists()}, @ref{c04,,isdir()}, @ref{c05,,isfile()}, @ref{c00,,islink()} 및 @ref{c06,,ismount()}와 같은 불리언 결과를 반환하는 @ref{a6,,os.path} 함수는 이제 OS 수준에서 표현할 수 없는 문자나 바이트를 포함하는 경로에 대해 @ref{2ec,,ValueError}나 그것의 서브 클래스 @ref{886,,UnicodeEncodeError} 와 @ref{c07,,UnicodeDecodeError} 를 발생시키는 대신 @code{False}를 반환합니다. (Contributed by Serhiy Storchaka in bpo-33721@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33721}.).

윈도우에서 @ref{c08,,expanduser()}는 이제 
@geindex USERPROFILE
@geindex 환경 변수; USERPROFILE
@code{USERPROFILE} 환경 변수를 선호하며 일반적으로 일반 사용자 계정에 설정되지 않는 
@geindex HOME
@geindex 환경 변수; HOME
@code{HOME}을 사용하지 않습니다. (Contributed by Anthony Sottile in bpo-36264@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36264}.)

윈도우에서 @ref{c04,,isdir()}은 존재하지 않는 디렉터리에 대한 링크에 대해 더는 @code{True}를 반환하지 않습니다.

윈도우에서 @ref{262,,realpath()}는 이제 심볼릭 링크와 디렉터리 정션을 포함하는 재해석 지점을 결정(resolve)합니다.

(Contributed by Steve Dower in bpo-37834@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37834}.)

@node pathlib<10>,pickle<2>,os path<5>,개선된 모듈<2>
@anchor{whatsnew/3 8 pathlib}@anchor{c09}
@subsubsection pathlib


@ref{c0a,,exists()}, @ref{53a,,is_dir()}, @ref{539,,is_file()}, @ref{c0b,,is_mount()}, @ref{c0c,,is_symlink()}, @ref{c0d,,is_block_device()}, @ref{c0e,,is_char_device()}, @ref{c0f,,is_fifo()}, @ref{c10,,is_socket()}과 같은 불리언 결과를 반환하는 @ref{266,,pathlib.Path} 메서드는 OS 수준에서 표현할 수 없는 문자가 포함된 경로에 대해 @ref{2ec,,ValueError}나 그것의 서브 클래스 @ref{886,,UnicodeEncodeError} 를 발생시키는 대신 @code{False}를 반환합니다. (Contributed by Serhiy Storchaka in bpo-33721@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33721}.)

Added @code{pathlib.Path.link_to()} which creates a hard link pointing
to a path.
(Contributed by Joannah Nanjekye in bpo-26978@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26978})
Note that @code{link_to} was deprecated in 3.10 and removed in 3.12 in
favor of a @code{hardlink_to} method added in 3.10 which matches the
semantics of the existing @code{symlink_to} method.

@node pickle<2>,plistlib,pathlib<10>,개선된 모듈<2>
@anchor{whatsnew/3 8 pickle}@anchor{c11}
@subsubsection pickle


C 최적화된 @ref{c12,,Pickler}를 서브 클래싱하는 @ref{ab,,pickle} 확장은 이제 특수 @ref{c13,,reducer_override()} 메서드를 정의하여 함수와 클래스의 피클링 로직을 재정의할 수 있습니다. (Contributed by Pierre Glaser and Olivier Grisel in bpo-35900@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35900}.)

@node plistlib,pprint<3>,pickle<2>,개선된 모듈<2>
@anchor{whatsnew/3 8 plistlib}@anchor{c14}
@subsubsection plistlib


새로운 @ref{c15,,plistlib.UID}가 추가되었으며 NSKeyedArchiver 인코딩된 바이너리 plist를 읽고 쓰는 지원을 활성화했습니다. (Contributed by Jon Janzen in bpo-26707@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26707}.)

@node pprint<3>,py_compile<2>,plistlib,개선된 모듈<2>
@anchor{whatsnew/3 8 pprint}@anchor{c16}
@subsubsection pprint


@ref{b3,,pprint} 모듈은 여러 함수에 `sort_dicts' 매개 변수를 추가했습니다. 기본적으로, 이러한 함수는 렌더링이나 인쇄 전에 딕셔너리를 계속 정렬합니다. 그러나, `sort_dicts'가 거짓으로 설정되면, 딕셔너리는 키가 삽입된 순서를 유지합니다. 디버깅하는 동안 JSON 입력과 비교하는 데 유용 할 수 있습니다.

또한, @ref{a29,,pprint.pprint()}와 유사하지만 `sort_dicts'가 @code{False}로 기본 설정된 새로운 편의 함수 @ref{c17,,pprint.pp()}가 있습니다:

@example
>>> from pprint import pprint, pp
>>> d = dict(source='input.txt', operation='filter', destination='output.txt')
>>> pp(d, width=40)                  # 원래 순서
@{'source': 'input.txt',
 'operation': 'filter',
 'destination': 'output.txt'@}
>>> pprint(d, width=40)              # 알파벳 순으로 정렬된 키
@{'destination': 'output.txt',
 'operation': 'filter',
 'source': 'input.txt'@}
@end example

(Contributed by Rémi Lapeyre in bpo-30670@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30670}.)

@node py_compile<2>,shlex,pprint<3>,개선된 모듈<2>
@anchor{whatsnew/3 8 py-compile}@anchor{c18}
@subsubsection py_compile


@ref{c19,,py_compile.compile()}은 이제 조용한 모드를 지원합니다. (Contributed by Joannah Nanjekye in bpo-22640@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22640}.)

@node shlex,shutil<4>,py_compile<2>,개선된 모듈<2>
@anchor{whatsnew/3 8 shlex}@anchor{c1a}
@subsubsection shlex


새 @ref{c1b,,shlex.join()} 함수는 @ref{75d,,shlex.split()}의 역함수로 작동합니다. (Contributed by Bo Bayles in bpo-32102@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32102}.)

@node shutil<4>,socket<5>,shlex,개선된 모듈<2>
@anchor{whatsnew/3 8 shutil}@anchor{c1c}
@subsubsection shutil


@ref{c1d,,shutil.copytree()}는 이제 새로운 @code{dirs_exist_ok} 키워드 인자를 받아들입니다. (Contributed by Josh Bronson in bpo-20849@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20849}.)

@ref{6d9,,shutil.make_archive()}는 이제 이식성과 표준 적합성을 향상하기 위해 새로운 아카이브에 최신 pax (POSIX.1-2001) 형식을 기본으로 합니다, @ref{e4,,tarfile} 모듈에 대한 해당 변경 사항을 상속했습니다. (Contributed by C.A.M. Gerlach in bpo-30661@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30661}.)

윈도우에서 @ref{356,,shutil.rmtree()}는 이제 그 내용을 먼저 재귀적으로 삭제하지 않고 디렉터리 정션을 삭제합니다. (Contributed by Steve Dower in bpo-37834@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37834}.)

@node socket<5>,ssl<5>,shutil<4>,개선된 모듈<2>
@anchor{whatsnew/3 8 socket}@anchor{c1e}
@subsubsection socket


같은 소켓에서 IPv4와 IPv6 연결을 모두 받아들이는 것을 포함하여 일반적으로 서버 소켓을 만들 때 필요한 작업을 자동화하는 @ref{c1f,,create_server()}와 @ref{c20,,has_dualstack_ipv6()} 편리 함수가 추가되었습니다. (Contributed by Giampaolo Rodolà in bpo-17561@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17561}.)

@ref{c21,,socket.if_nameindex()}, @ref{c22,,socket.if_nametoindex()} 및 @ref{c23,,socket.if_indextoname()} 함수가 윈도우에서 구현되었습니다. (Contributed by Zackery Spytz in bpo-37007@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37007}.)

@node ssl<5>,statistics<4>,socket<5>,개선된 모듈<2>
@anchor{whatsnew/3 8 ssl}@anchor{c24}
@subsubsection ssl


TLS 1.3 포스트 핸드 셰이크 인증을 활성화하는 @ref{c25,,post_handshake_auth}와 시작하는 @ref{c26,,verify_client_post_handshake()}를 추가했습니다. (Contributed by Christian Heimes in bpo-34670@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34670}.)

@node statistics<4>,sys<7>,ssl<5>,개선된 모듈<2>
@anchor{whatsnew/3 8 statistics}@anchor{c27}
@subsubsection statistics


@ref{8e0,,statistics.mean()}의 더 빠른 부동 소수점 변형으로 @ref{c28,,statistics.fmean()}을 추가했습니다. (Contributed by Raymond Hettinger and Steven D’Aprano in bpo-35904@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35904}.)

@ref{c29,,statistics.geometric_mean()}을 추가했습니다 (Contributed by Raymond Hettinger in bpo-27181@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27181}.)

가장 빈번한 값의 리스트를 반환하는 @ref{c2a,,statistics.multimode()}가 추가되었습니다. (Contributed by Raymond Hettinger in bpo-35892@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35892}.)

데이터나 분포를 등분위 간격(equiprobable intervals)(예를 들어, 4분위 수(quattiles), 십분위 수(deciles) 또는 백분위 수(percentiles))으로 나누는 @ref{c2b,,statistics.quantiles()}를 추가했습니다. (Contributed by Raymond Hettinger in bpo-36546@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36546}.)

무작위 변수의 정규 분포를 만들고 조작하기 위한 도구인 @ref{c2c,,statistics.NormalDist}를 추가했습니다. (Contributed by Raymond Hettinger in bpo-36018@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36018}.)

@example
>>> temperature_feb = NormalDist.from_samples([4, 12, -3, 2, 7, 14])
>>> temperature_feb.mean
6.0
>>> temperature_feb.stdev
6.356099432828281

>>> temperature_feb.cdf(3)            # 3도 이하일 확률
0.3184678262814532
>>> # 7도와 10도가 될 상대적 가능성
>>> temperature_feb.pdf(7) / temperature_feb.pdf(10)
1.2039930378537762

>>> el_niño = NormalDist(4, 2.5)
>>> temperature_feb += el_niño        # 기후 효과(엘니뇨)를 더합니다
>>> temperature_feb
NormalDist(mu=10.0, sigma=6.830080526611674)

>>> temperature_feb * (9/5) + 32      # 화씨(Fahrenheit)로 변환합니다
NormalDist(mu=50.0, sigma=12.294144947901014)
>>> temperature_feb.samples(3)        # 무작위 샘플을 만듭니다
[7.672102882379219, 12.000027119750287, 4.647488369766392]
@end example

@node sys<7>,tarfile<5>,statistics<4>,개선된 모듈<2>
@anchor{whatsnew/3 8 sys}@anchor{c2d}
@subsubsection sys


“발생시킬 수 없는 예외(unraisable exceptions)” 처리 방법을 제어하기 위해 재정의할 수 있는 새로운 @ref{506,,sys.unraisablehook()} 함수를 추가했습니다. 예외가 발생했지만, 파이썬에서 처리할 방법이 없을 때 호출됩니다. 예를 들어, 파괴자(destructor)가 예외를 발생시키거나 가비지 수집(@ref{1b3,,gc.collect()}) 중에. (Contributed by Victor Stinner in bpo-36829@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36829}.)

@node tarfile<5>,threading<5>,sys<7>,개선된 모듈<2>
@anchor{whatsnew/3 8 tarfile}@anchor{c2e}
@subsubsection tarfile


@ref{e4,,tarfile} 모듈은 새로운 아카이브를 만들 때 이제 이전의 GNU 전용이 아닌 최신 pax (POSIX.1-2001) 형식을 기본값으로 사용합니다. 이것은 표준화되고 확장 가능한 형식으로 일관된 인코딩(UTF-8)을 사용하여 플랫폼 간 이식성을 개선하고, 몇 가지 다른 이점을 제공합니다. (Contributed by C.A.M. Gerlach in bpo-36268@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36268}.)

@node threading<5>,tokenize<2>,tarfile<5>,개선된 모듈<2>
@anchor{whatsnew/3 8 threading}@anchor{c2f}
@subsubsection threading


잡히지 않은 @ref{c30,,threading.Thread.run()} 예외를 처리하는 새로운 @ref{a4b,,threading.excepthook()} 함수를 추가했습니다. 잡히지 않은 @code{threading.Thread.run()} 예외가 처리되는 방식을 제어하기 위해 재정의될 수 있습니다. (Contributed by Victor Stinner in bpo-1230540@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1230540}.)

새로운 @ref{c31,,threading.get_native_id()} 함수와 @ref{c32,,native_id} 어트리뷰트를 @ref{176,,threading.Thread} 클래스에 추가합니다. 이것들은 커널이 할당한 현재 스레드의 네이티브 정수 스레드 ID를 반환합니다. 이 기능은 특정 플랫폼에서만 사용할 수 있습니다, 자세한 내용은 @code{get_native_id}를 참조하십시오. (Contributed by Jake Tesler in bpo-36084@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36084}.)

@node tokenize<2>,tkinter<5>,threading<5>,개선된 모듈<2>
@anchor{whatsnew/3 8 tokenize}@anchor{c33}
@subsubsection tokenize


@ref{101,,tokenize} 모듈은 이제 후행 줄 넘김이 없는 입력을 제공할 때 묵시적으로 @code{NEWLINE} 토큰을 출력합니다. 이 동작은 이제 C 토크나이저가 내부적으로 수행하는 것과 일치합니다. (Contributed by Ammar Askar in bpo-33899@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33899}.)

@node tkinter<5>,time<4>,tokenize<2>,개선된 모듈<2>
@anchor{whatsnew/3 8 tkinter}@anchor{c34}
@subsubsection tkinter


Added methods @code{selection_from()},
@code{selection_present()},
@code{selection_range()} and
@code{selection_to()}
in the @code{tkinter.Spinbox} class.
(Contributed by Juliette Monsel in bpo-34829@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34829}.)

Added method @code{moveto()}
in the @code{tkinter.Canvas} class.
(Contributed by Juliette Monsel in bpo-23831@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23831}.)

The @code{tkinter.PhotoImage} class now has
@code{transparency_get()} and
@code{transparency_set()} methods.  (Contributed by
Zackery Spytz in bpo-25451@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25451}.)

@node time<4>,typing<9>,tkinter<5>,개선된 모듈<2>
@anchor{whatsnew/3 8 time}@anchor{c35}
@subsubsection time


macOS 10.12를 위한 새로운 시계 @ref{c36,,CLOCK_UPTIME_RAW}가 추가되었습니다. (Contributed by Joannah Nanjekye in bpo-35702@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35702}.)

@node typing<9>,unicodedata<6>,time<4>,개선된 모듈<2>
@anchor{whatsnew/3 8 typing}@anchor{c37}
@subsubsection typing


@ref{10a,,typing} 모듈은 몇 가지 새로운 기능을 통합했습니다:


@itemize *

@item 
키별 형이 있는 딕셔너리 형. 
@geindex Python 향상 제안; PEP 589
PEP 589@footnote{https://peps.python.org/pep-0589/}와 @ref{332,,typing.TypedDict}를 참조하십시오. TypedDict는 문자열 키만 사용합니다. 기본적으로, 모든 키가 있어야 합니다. 키를 선택적으로 만들려면 “total=False”를 지정하십시오:

@example
class Location(TypedDict, total=False):
    lat_long: tuple
    grid_square: str
    xy_coordinate: tuple
@end example

@item 
리터럴 형. 
@geindex Python 향상 제안; PEP 586
PEP 586@footnote{https://peps.python.org/pep-0586/}과 @ref{a55,,typing.Literal}을 참조하십시오. Literal 형은 매개 변수나 반환 값이 하나 이상의 특정 리터럴 값으로 제한됨을 나타냅니다:

@example
def get_status(port: int) -> Literal['connected', 'disconnected']:
    ...
@end example

@item 
“최종(final)” 변수, 함수, 메서드 및 클래스. 
@geindex Python 향상 제안; PEP 591
PEP 591@footnote{https://peps.python.org/pep-0591/}, @ref{56d,,typing.Final} 및 @ref{8bb,,typing.final()}을 참조하십시오. final 한정자는 정적 형 검사기에 서브 클래싱, 재정의 또는 재대입을 제한하도록 지시합니다:

@example
pi: Final[float] = 3.1415926536
@end example

@item 
프로토콜 정의. 
@geindex Python 향상 제안; PEP 544
PEP 544@footnote{https://peps.python.org/pep-0544/}, @ref{569,,typing.Protocol} 및 @ref{673,,typing.runtime_checkable()}을 참조하십시오. @ref{c38,,typing.SupportsInt}와 같은 간단한 ABC는 이제 @code{Protocol} 서브 클래스입니다.

@item 
새 프로토콜 클래스 @ref{c39,,typing.SupportsIndex}.

@item 
새 함수 @ref{2ab,,typing.get_origin()}과 @ref{2ac,,typing.get_args()}.
@end itemize

@node unicodedata<6>,unittest<7>,typing<9>,개선된 모듈<2>
@anchor{whatsnew/3 8 unicodedata}@anchor{c3a}
@subsubsection unicodedata


@ref{10b,,unicodedata} 모듈은 유니코드 12.1.0@footnote{https://blog.unicode.org/2019/05/unicode-12-1-en.html} 릴리스를 사용하도록 업그레이드되었습니다.

새 함수 @ref{c3b,,is_normalized()}를 문자열이 특정 정규화 형식인지 확인하는 데 사용할 수 있습니다. 종종 실제로 문자열을 정규화하는 것보다 훨씬 빠릅니다. (Contributed by Max Belanger, David Euresti, and Greg Price in bpo-32285@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32285} and bpo-37966@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37966}).

@node unittest<7>,venv<4>,unicodedata<6>,개선된 모듈<2>
@anchor{whatsnew/3 8 unittest}@anchor{c3c}
@subsubsection unittest


@ref{c3d,,Mock}의 비동기 버전을 지원하는 @ref{c3e,,AsyncMock}이 추가되었습니다. 테스트를 위해 적절한 새로운 assert 함수들이 추가되었습니다. (Contributed by Lisa Roach in bpo-26467@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26467}).

@ref{c3f,,setUpModule()}과 @ref{c40,,setUpClass()}에 대한 정리를 지원하기 위해 unittest에 @ref{c41,,addModuleCleanup()} 과 @ref{c42,,addClassCleanup()}를 추가했습니다. (Contributed by Lisa Roach in bpo-24412@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24412}.)

여러 mock assert 함수는 이제 실패 시 실제 호출의 리스트도 인쇄합니다. (Contributed by Petter Strandmark in bpo-35047@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35047}.)

@ref{10c,,unittest} 모듈은 @ref{361,,unittest.IsolatedAsyncioTestCase}를 통해 코루틴을 테스트 케이스로 사용하는 지원을 얻었습니다. (Contributed by Andrew Svetlov in bpo-32972@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32972}.)

예:

@example
import unittest


class TestRequest(unittest.IsolatedAsyncioTestCase):

    async def asyncSetUp(self):
        self.connection = await AsyncConnection()

    async def test_get(self):
        response = await self.connection.get("https://example.com")
        self.assertEqual(response.status_code, 200)

    async def asyncTearDown(self):
        await self.connection.close()


if __name__ == "__main__":
    unittest.main()
@end example

@node venv<4>,weakref,unittest<7>,개선된 모듈<2>
@anchor{whatsnew/3 8 venv}@anchor{c43}
@subsubsection venv


@ref{117,,venv}는 이제 PowerShell Core 6.1에서 가상 환경을 활성화하기 위한 모든 플랫폼에 @code{Activate.ps1} 스크립트를 포함합니다. (Contributed by Brett Cannon in bpo-32718@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32718}.)

@node weakref,xml<4>,venv<4>,개선된 모듈<2>
@anchor{whatsnew/3 8 weakref}@anchor{c44}
@subsubsection weakref


@ref{c45,,weakref.proxy()}에 의해 반환된 프락시 객체는 이제 다른 숫자 연산자에 더해 행렬 곱셈 연산자 @code{@@}와 @code{@@=}을 지원합니다. (Contributed by Mark Dickinson in bpo-36669@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36669}.)

@node xml<4>,xmlrpc,weakref,개선된 모듈<2>
@anchor{whatsnew/3 8 xml}@anchor{c46}
@subsubsection xml


DTD 및 외부 엔티티 조회에 대한 완화로서, @ref{128,,xml.dom.minidom}과 @ref{12f,,xml.sax} 모듈은 기본적으로 더는 외부 엔티티를 처리하지 않습니다. (Contributed by Christian Heimes in bpo-17239@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17239}.)

@ref{12b,,xml.etree.ElementTree} 모듈의 @code{.find*()} 메서드는 이름 공간을 무시하는 @code{@{*@}tag}와 지정된 이름 공간의 모든 태그를 반환하는 @code{@{namespace@}*}와 같은 와일드카드 검색을 지원합니다. (Contributed by Stefan Behnel in bpo-28238@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28238}.)

The @ref{12b,,xml.etree.ElementTree} module provides a new function
@ref{c47,,canonicalize()} that implements C14N 2.0.
(Contributed by Stefan Behnel in bpo-13611@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13611}.)

@ref{c48,,xml.etree.ElementTree.XMLParser}의 대상 객체는 새 콜백 메서드 @code{start_ns()}와 @code{end_ns()}를 통해 이름 공간 선언 이벤트를 수신할 수 있습니다. 또한, @ref{c49,,xml.etree.ElementTree.TreeBuilder} 대상은 주석과 처리 명령어에 대한 이벤트를 처리하여 생성된 트리에 포함하도록 구성할 수 있습니다. (Contributed by Stefan Behnel in bpo-36676@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36676} and bpo-36673@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36673}.)

@node xmlrpc,,xml<4>,개선된 모듈<2>
@anchor{whatsnew/3 8 xmlrpc}@anchor{c4a}
@subsubsection xmlrpc


@ref{c4b,,xmlrpc.client.ServerProxy}는 이제 각 요청과 함께 보낼 HTTP 헤더의 시퀀스를 위한 선택적 `headers' 키워드 인자를 지원합니다. 무엇보다도, 기본 베이식 인증(basic authentication)에서 더 빠른 세션 인증(session authentication)으로 업그레이드 할 수 있도록 합니다. (Contributed by Cédric Krier in bpo-35153@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35153}.)

@node 최적화<2>,빌드와 C API 변경,개선된 모듈<2>,파이썬 3 8의 새로운 기능
@anchor{whatsnew/3 8 optimizations}@anchor{c4c}
@subsection 최적화



@itemize *

@item 
@ref{dc,,subprocess} 모듈은 이제 성능 향상을 위해 몇몇 경우 @ref{52e,,os.posix_spawn()} 함수를 사용할 수 있습니다. 현재, 다음과 같은 조건이 모두 충족될 때 macOS와 리눅스(glibc 2.24 이상 사용)에서만 사용됩니다:


@itemize *

@item 
`close_fds'가 거짓입니다.

@item 
`preexec_fn', `pass_fds', `cwd' 및 `start_new_session' 매개 변수가 설정되지 않았습니다.

@item 
`executable' 경로가 디렉터리를 포함합니다.
@end itemize

(Contributed by Joannah Nanjekye and Victor Stinner in bpo-35537@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35537}.)

@item 
@ref{c4d,,shutil.copyfile()}, @ref{c4e,,shutil.copy()}, @ref{c4f,,shutil.copy2()}, @ref{c1d,,shutil.copytree()} 및 @ref{c50,,shutil.move()}는 파일을 보다 효율적으로 복사하기 위해 리눅스와 macOS에서 플랫폼별 “빠른 복사(fast-copy)” 시스템 호출을 사용합니다. “빠른 복사”는 복사 작업이 커널 내에서 발생하여 “@code{outfd.write(infd.read())}”처럼 파이썬에서 사용자 공간(userspace) 버퍼를 사용하지 않도록 합니다. 윈도우에서  @code{shutil.copyfile()}은 더 큰 기본 버퍼 크기(16 KiB 대신 1 MiB)를 사용하고 @ref{c51,,shutil.copyfileobj()}의 @ref{165,,memoryview()} 기반 변형이 사용됩니다. 같은 파티션 내에서 512 MiB 파일을 복사할 때 속도 개선은 리눅스에서는 약 +26%, macOS에서는 +50%, 윈도우에서는 +40%입니다. 또한, 훨씬 적은 CPU 사이클이 소모됩니다. @ref{c52,,플랫폼 의존적 효율적인 복사 연산} 절을 참조하십시오. (Contributed by Giampaolo Rodolà in bpo-33671@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33671}.)

@item 
@ref{c1d,,shutil.copytree()}는 @ref{c53,,os.scandir()} 함수를 사용하고 이것에 의존하는 모든 복사 함수는 캐시 된 @ref{26d,,os.stat()} 값을 사용합니다. 8000개의 파일이 있는 디렉터리를 복사할 때 속도 개선은 리눅스에서는 +9%, 윈도우에서는 +20%, 윈도우 SMB 공유에서는 +30%입니다. 또한, @code{os.stat()} 시스템 호출 수가 38% 감소하여 특히 @code{shutil.copytree()}가 네트워크 파일 시스템에서 더 빠릅니다. (Contributed by Giampaolo Rodolà in bpo-33695@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33695}.)

@item 
@ref{ab,,pickle} 모듈의 기본 프로토콜은 이제 파이썬 3.4에서 처음 소개된 프로토콜 4입니다. 파이썬 3.0부터 사용 가능한 프로토콜 3보다 성능이 우수하고 크기가 작습니다.

@item 
@code{PyGC_Head}에서 @ref{c54,,Py_ssize_t} 멤버 하나를 삭제했습니다. 모든 GC 추적 객체(예를 들어, 튜플, 리스트, 딕셔너리)의 크기는 4 또는 8바이트 줄어듭니다. (Contributed by Inada Naoki in bpo-33597@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33597}.)

@item 
@ref{c55,,uuid.UUID}는 이제 @code{__slots__}를 사용하여 메모리 사용량을 줄입니다. (Contributed by Wouter Bolsterlee and Tal Einat in bpo-30977@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30977})

@item 
@ref{c56,,operator.itemgetter()}의 33% 성능 향상. 인자 처리를 최적화하고 튜플에 대한 하나의 음수가 아닌 정수 인덱스의 흔한 경우에 대한 빠른 경로를 추가했습니다 (표준 라이브러리의 일반적인 사용 사례입니다). (Contributed by Raymond Hettinger in bpo-35664@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35664}.)

@item 
@ref{4e0,,collections.namedtuple()}에서의 필드 조회 속도 향상. 이제 두 배 이상 빨라져, 파이썬에서 가장 빠른 인스턴스 변수 조회 형식이 되었습니다. (Contributed by Raymond Hettinger, Pablo Galindo, and Joe Jevnik, Serhiy Storchaka in bpo-32492@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32492}.)

@item 
@ref{24d,,list} 생성자는 입력 이터러블의 길이를 알 수 있으면 (입력이 @code{__len__}을 구현하면) 내부 항목 버퍼를 초과 할당하지 않습니다. 이것은 생성된 리스트가 평균 12% 작게 만듭니다. (Contributed by Raymond Hettinger and Pablo Galindo in bpo-33234@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33234}.)

@item 
클래스 변수 쓰기 속도 두 배 향상. 특수하지 않은(non-dunder) 어트리뷰트가 갱신되었을 때, 슬롯 갱신을 위한 불필요한 호출이 있었습니다. (Contributed by Stefan Behnel, Pablo Galindo Salgado, Raymond Hettinger, Neil Schemenauer, and Serhiy Storchaka in bpo-36012@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36012}.)

@item 
많은 내장 함수와 메서드에 전달된 인자를 변환하는 오버헤드 감소. 이것은 몇몇 간단한 내장 함수와 메서드 호출을 20–50%까지 가속합니다. (Contributed by Serhiy Storchaka in bpo-23867@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23867}, bpo-35582@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35582} and bpo-36127@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36127}.)

@item 
@code{LOAD_GLOBAL} 명령어는 이제 새로운 “옵코드(opcode) 단위 캐시” 메커니즘을 사용합니다. 이제 약 40% 빨라졌습니다. (Contributed by Yury Selivanov and Inada Naoki in bpo-26219@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26219}.)
@end itemize

@node 빌드와 C API 변경,폐지<2>,최적화<2>,파이썬 3 8의 새로운 기능
@anchor{whatsnew/3 8 build-and-c-api-changes}@anchor{c57}
@subsection 빌드와 C API 변경



@itemize *

@item 
기본 @ref{c58,,sys.abiflags}는 빈 문자열이 되었습니다: pymalloc을 위한 @code{m} 플래그가 쓸모없게 되었으므로 (pymalloc을 포함하거나 포함하지 않는 빌드는 ABI 호환입니다) 제거되었습니다. (Contributed by Victor Stinner in bpo-36707@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36707}.)

변경의 예:


@itemize *

@item 
@code{python3.8} 프로그램만 설치되고, @code{python3.8m} 프로그램은 사라졌습니다.

@item 
@code{python3.8-config} 스크립트만 설치되고, @code{python3.8m-config} 스크립트는 사라졌습니다.

@item 
@code{m} 플래그는 동적 라이브러리 파일명의 접미사에서 제거되었습니다: 표준 라이브러리는 물론 PyPI에서 다운로드 한 것과 같은 제삼자 패키지에서 생성되고 설치된 확장 모듈. 예를 들어, 리눅스에서 파이썬 3.7 접미사 @code{.cpython-37m-x86_64-linux-gnu.so}는 파이썬 3.8에서 @code{.cpython-38-x86_64-linux-gnu.so}가 되었습니다.
@end itemize

@item 
여러 종류의 API를 더 잘 구분할 수 있도록 헤더 파일이 재구성되었습니다:


@itemize *

@item 
@code{Include/*.h}는 이식성 있는 공용 안정 C API 여야 합니다.

@item 
@code{Include/cpython/*.h}는 CPython에 고유한 불안정한 C API 여야 합니다; @code{_Py}나 @code{_PY}로 시작하는 일부 비공개 API가 포함된 공개 API.

@item 
@code{Include/internal/*.h}는 아주 CPython에 특정한 비공개 내부 C API입니다. 이 API는 과거 호환성 보증이 없어서, CPython 외부에서 사용해서는 안 됩니다. 이것은 함수를 호출하지 않고 CPython 내부에 액세스해야 하는 디버거나 프로파일과 같이 매우 구체적인 요구 사항을 위해서만 노출됩니다. 이 API는 이제 @code{make install}에 의해 설치됩니다.
@end itemize

(Contributed by Victor Stinner in bpo-35134@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35134} and bpo-35081@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35081}, Eric Snow가 파이썬 3.7에서 시작한 작업.)

@item 
일부 매크로는 정적 인라인 함수로 변환되었습니다: 매개 변수 형과 반환형이 잘 정의되며, 매크로에 특정한 문제가 없으며, 변수는 지역 스코프를 갖습니다. 예:


@itemize *

@item 
@ref{78e,,Py_INCREF()}, @ref{78f,,Py_DECREF()}

@item 
@ref{c59,,Py_XINCREF()}, @ref{991,,Py_XDECREF()}

@item 
@code{PyObject_INIT}, @code{PyObject_INIT_VAR}

@item 
비공개 함수: @code{_PyObject_GC_TRACK()}, @code{_PyObject_GC_UNTRACK()}, @code{_Py_Dealloc()}
@end itemize

(Contributed by Victor Stinner in bpo-35059@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35059}.)

@item 
@code{PyByteArray_Init()}와 @code{PyByteArray_Fini()} 함수가 제거되었습니다. 파이썬 2.7.4와 파이썬 3.2.0부터 아무것도 하지 않고, 제한된 API(안정 ABI)에서 제외되었으며 문서로 만들어지지 않았습니다. (Contributed by Victor Stinner in bpo-35713@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35713}.)

@item 
@ref{c5a,,PyExceptionClass_Name()}의 결과는 이제 @code{char *} 대신 @code{const char *} 형입니다. (Contributed by Serhiy Storchaka in bpo-33818@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33818}.)

@item 
@code{Modules/Setup.dist}와 @code{Modules/Setup}의 이중성이 제거되었습니다. 이전에는, CPython 소스 트리를 갱신할 때, 업스트림 변경 사항을 반영하기 위해 @code{Modules/Setup.dist}(소스 트리 내부)를 @code{Modules/Setup}(빌드 트리 내부)으로 수동으로 복사해야 했습니다. 이는 패키지 작성자에게는 작은 이점을 제공했지만, 파일 복사를 잊어버리면 빌드가 실패할 수 있어서 CPython 개발자들을 자주 귀찮게 만들었습니다.

이제 빌드 시스템은 항상 소스 트리 안의 @code{Modules/Setup}에서 읽습니다. 그 파일을 사용자 정의하고 싶은 사람들은 소스 트리에 대한 다른 변경과 마찬가지로 CPython의 git 포크나 패치 파일로 변경 사항을 유지하는 것이 좋습니다.

(Contributed by Antoine Pitrou in bpo-32430@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32430}.)

@item 
@ref{603,,PyLong_AsLong()}과 같은 파이썬 숫자를 C 정수로 변환하는 함수와, @ref{3c1,,PyArg_ParseTuple()}처럼 @code{'i'}와 같은 정수 변환 포맷 단위로 인자를 구문 분석하는 함수는, 이제 사용할 수 있다면 @ref{19d,,__int__()} 대신 @ref{19e,,__index__()} 특수 메서드를 사용합니다. @code{__int__()} 메서드가 있지만 @code{__index__()} 메서드가 없는 객체(@ref{1fe,,Decimal}과 @ref{213,,Fraction} 같은)에 대해서 폐지 경고가 발생합니다. @ref{c5b,,PyNumber_Check()}는 이제 @code{__index__()}를 구현하는 객체에 대해 @code{1}을 반환합니다. @ref{c5c,,PyNumber_Long()}, @ref{c5d,,PyNumber_Float()} 및 @ref{c5e,,PyFloat_AsDouble()}은 이제 사용할 수 있으면 @code{__index__()} 메서드를 사용합니다. (Contributed by Serhiy Storchaka in bpo-36048@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36048} and bpo-20092@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20092}.)

@item 
힙에 할당된 형 객체는 이제 @ref{c5f,,PyType_GenericAlloc()}이 아닌 @ref{c60,,PyObject_Init()}(그리고 이것과 평행한 매크로 @code{PyObject_INIT})에서 참조 횟수를 증가시킵니다. 인스턴스 할당이나 할당 해제를 수정하는 형은 조정이 필요할 수 있습니다. (Contributed by Eddie Elizondo in bpo-35810@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35810}.)

@item 
새 함수 @code{PyCode_NewWithPosOnlyArgs()}는 @code{PyCode_New()}처럼 코드 객체를 만들 수 있지만, 위치 전용 인자의 개수를 나타내는 `posonlyargcount' 매개 변수가 추가로 있습니다. (Contributed by Pablo Galindo in bpo-37221@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37221}.)

@item 
@code{Py_SetPath()}는 이제 @ref{3ed,,sys.executable}을 프로그램 이름(@ref{3ee,,Py_GetProgramName()}) 대신 프로그램 전체 경로(@ref{3ec,,Py_GetProgramFullPath()})로 설정합니다. (Contributed by Victor Stinner in bpo-38234@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38234}.)
@end itemize

@node 폐지<2>,API 및 기능 제거,빌드와 C API 변경,파이썬 3 8의 새로운 기능
@anchor{whatsnew/3 8 deprecated}@anchor{c61}
@subsection 폐지



@itemize *

@item 
distutils @code{bdist_wininst} 명령은 이제 폐지되었습니다, 대신 @code{bdist_wheel}(wheel 패키지)을 사용하십시오. (Contributed by Victor Stinner in bpo-37481@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37481}.)

@item 
@ref{12b,,ElementTree} 모듈의 폐지된 메서드 @code{getchildren()}과 @code{getiterator()}는 이제 @ref{ac6,,PendingDeprecationWarning} 대신 @ref{1a3,,DeprecationWarning}을 발생시킵니다. 이것들은 파이썬 3.9에서 제거될 것입니다. (Contributed by Serhiy Storchaka in bpo-29209@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29209}.)

@item 
@ref{948,,concurrent.futures.ThreadPoolExecutor}의 인스턴스가 아닌 객체를 @ref{949,,loop.set_default_executor()}로 전달하는 것은 폐지되었고 파이썬 3.9에서 금지될 것입니다. (Contributed by Elvis Pranskevichus in bpo-34075@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34075}.)

@item 
@ref{93d,,xml.dom.pulldom.DOMEventStream}, @ref{93e,,wsgiref.util.FileWrapper} 및 @ref{93f,,fileinput.FileInput}의 @ref{588,,__getitem__()} 메서드는 폐지되었습니다.

이 메서드의 구현은 `index' 매개 변수를 무시하고 대신 다음 항목을 반환했습니다. (Contributed by Berker Peksag in bpo-9372@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9372}.)

@item 
@ref{331,,typing.NamedTuple} 클래스는 @code{_field_types} 어트리뷰트를 폐지했고, 같은 정보를 갖는 @code{__annotations__} 어트리뷰트로 대신합니다. (Contributed by Raymond Hettinger in bpo-36320@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36320}.)

@item 
@ref{9,,ast} 클래스 @code{Num}, @code{Str}, @code{Bytes}, @code{NameConstant} 및 @code{Ellipsis}는 폐지된 것으로 간주하고 향후 파이썬 버전에서 제거될 예정입니다. 대신 @ref{2ef,,Constant}를 사용해야 합니다. (Contributed by Serhiy Storchaka in bpo-32892@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32892}.)

@item 
@ref{2f0,,ast.NodeVisitor} 메서드 @code{visit_Num()}, @code{visit_Str()}, @code{visit_Bytes()}, @code{visit_NameConstant()} 및 @code{visit_Ellipsis()}는 이제 폐지되었으며 향후 파이썬 버전에서는 호출되지 않을 것입니다. 모든 상수 노드를 처리하기 위해서는 @ref{c62,,visit_Constant()} 메서드를 추가하십시오. (Contributed by Serhiy Storchaka in bpo-36917@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36917}.)

@item 
The @code{@@asyncio.coroutine} @ref{939,,decorator} is deprecated and will be
removed in version 3.10.  Instead of @code{@@asyncio.coroutine}, use
@ref{7ec,,async def} instead.
(Contributed by Andrew Svetlov in bpo-36921@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36921}.)

@item 
@ref{b,,asyncio}에서, 다음에 대해 `loop' 인자의 명시적 전달은 폐지되었고 버전 3.10에서 제거됩니다: @ref{c63,,asyncio.sleep()}, @ref{812,,asyncio.gather()}, @ref{c64,,asyncio.shield()}, @ref{814,,asyncio.wait_for()}, @ref{6a6,,asyncio.wait()}, @ref{4c7,,asyncio.as_completed()}, @ref{1c7,,asyncio.Task}, @ref{c65,,asyncio.Lock}, @ref{2f4,,asyncio.Event}, @ref{c66,,asyncio.Condition}, @ref{c67,,asyncio.Semaphore}, @ref{c68,,asyncio.BoundedSemaphore}, @ref{c69,,asyncio.Queue}, @ref{c6a,,asyncio.create_subprocess_exec()} 및 @ref{c6b,,asyncio.create_subprocess_shell()}.

@item 
코루틴 객체를 @ref{6a6,,asyncio.wait()}에 명시적으로 전달하는 것은 폐지되었고 버전 3.11에서 제거됩니다. (Contributed by Yury Selivanov in bpo-34790@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34790}.)

@item 
The following functions and methods are deprecated in the @ref{67,,gettext}
module: @code{lgettext()}, @code{ldgettext()},
@code{lngettext()} and @code{ldngettext()}.
They return encoded bytes, and it’s possible that you will get unexpected
Unicode-related exceptions if there are encoding problems with the
translated strings. It’s much better to use alternatives which return
Unicode strings in Python 3. These functions have been broken for a long time.

Function @code{bind_textdomain_codeset()}, methods
@code{NullTranslations.output_charset()} and
@code{NullTranslations.set_output_charset()}, and the `codeset'
parameter of functions @ref{c6c,,translation()} and
@ref{c6d,,install()} are also deprecated, since they are only used for
the @code{l*gettext()} functions.
(Contributed by Serhiy Storchaka in bpo-33710@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33710}.)

@item 
The @code{isAlive()} method of @ref{176,,threading.Thread}
has been deprecated.
(Contributed by Donghee Na in bpo-35283@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35283}.)

@item 
정수 인자를 받아들이는 많은 내장과 확장 함수는 이제 @ref{1fe,,Decimal}들, @ref{213,,Fraction}들 및 정수로 변환될 때 손실을 수반하는 다른 객체들(예를 들어, @ref{19d,,__int__()} 메서드는 있지만 @ref{19e,,__index__()} 메서드는 없는 것들)에 대해 폐지 경고를 발생시킵니다. 이후 버전에서는 에러가 될 것입니다. (Contributed by Serhiy Storchaka in bpo-36048@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36048}.)

@item 
다음 인자들을 키워드 인자로 전달하는 것이 폐지되었습니다:


@itemize -

@item 
`func' in @ref{218,,functools.partialmethod()}, @ref{c6e,,weakref.finalize()},
@ref{c6f,,profile.Profile.runcall()}, @code{cProfile.Profile.runcall()},
@ref{c70,,bdb.Bdb.runcall()}, @ref{c71,,trace.Trace.runfunc()} and
@ref{c72,,curses.wrapper()}.

@item 
@ref{c73,,unittest.TestCase.addCleanup()}의 `function'.

@item 
@ref{948,,concurrent.futures.ThreadPoolExecutor}과 @ref{1d6,,concurrent.futures.ProcessPoolExecutor}의 @ref{c74,,submit()} 메서드의 `fn'.

@item 
`callback' in @ref{c75,,contextlib.ExitStack.callback()},
@code{contextlib.AsyncExitStack.callback()} and
@ref{c76,,contextlib.AsyncExitStack.push_async_callback()}.

@item 
`c' and `typeid' in the @code{create()}
method of @code{multiprocessing.managers.Server} and
@code{multiprocessing.managers.SharedMemoryServer}.

@item 
@ref{c6e,,weakref.finalize()}의 `obj'.
@end itemize

파이썬의 향후 배포에서, 이것들은 @ref{c77,,위치 전용}이 될 것입니다. (Contributed by Serhiy Storchaka in bpo-36492@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36492}.)
@end itemize

@node API 및 기능 제거,파이썬 3 8로 이식하기,폐지<2>,파이썬 3 8의 새로운 기능
@anchor{whatsnew/3 8 api-and-feature-removals}@anchor{c78}
@subsection API 및 기능 제거


다음 기능과 API는 파이썬 3.8에서 제거되었습니다.:


@itemize *

@item 
파이썬 3.3부터, @ref{1e,,collections}에서 ABC를 임포트 하는 것은 폐지되었고, @ref{1f,,collections.abc}에서 임포트를 수행해야 합니다. collections에서 임포트할 수 있는 것은 3.8에서 제거될 것으로 표시되었지만 3.9로 지연되었습니다. (gh-81134@footnote{https://github.com/python/cpython/issues/81134} 참조)

@item 
The @code{macpath} module, deprecated in Python 3.7, has been removed.
(Contributed by Victor Stinner in bpo-35471@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35471}.)

@item 
The function @code{platform.popen()} has been removed, after having been
deprecated since Python 3.3: use @ref{31a,,os.popen()} instead.
(Contributed by Victor Stinner in bpo-35345@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35345}.)

@item 
The function @code{time.clock()} has been removed, after having been
deprecated since Python 3.3: use @ref{c79,,time.perf_counter()} or
@ref{c7a,,time.process_time()} instead, depending
on your requirements, to have well-defined behavior.
(Contributed by Matthias Bussonnier in bpo-36895@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36895}.)

@item 
@code{pyvenv} 스크립트를 제거하고 @code{python3.8 -m venv}로 대체하여, 어떤 파이썬 인터프리터가 @code{pyvenv} 스크립트와 연결되어 있는지에 대한 혼란을 없애줍니다. (Contributed by Brett Cannon in bpo-25427@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25427}.)

@item 
@code{cgi} 모듈에서 @code{parse_qs}, @code{parse_qsl} 및 @code{escape}가 제거되었습니다. 파이썬 3.2 이하에서 폐지되었습니다. 대신 @code{urllib.parse}와 @code{html} 모듈에서 임포트 해야 합니다.

@item 
@code{filemode} 함수가 @ref{e4,,tarfile} 모듈에서 제거되었습니다. 문서로 만들어지지 않았고, 파이썬 3.3부터 폐지되었습니다.

@item 
@ref{c48,,XMLParser} 생성자는 더는 `html' 인자를 받아들이지 않습니다. 효과가 있었던 적이 없고 3.4에서 폐지되었습니다. 다른 모든 매개 변수는 이제 @ref{5a4,,키워드 전용}입니다. (Contributed by Serhiy Storchaka in bpo-29209@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29209}.)

@item 
@ref{c48,,XMLParser}의 @code{doctype()} 메서드를 제거했습니다. (Contributed by Serhiy Storchaka in bpo-29209@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29209}.)

@item 
“unicode_internal” 코덱이 제거되었습니다. (Contributed by Inada Naoki in bpo-36297@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36297}.)

@item 
@ref{d4,,sqlite3} 모듈의 @code{Cache}와 @code{Statement} 객체는 사용자에게 노출되지 않습니다. (Contributed by Aviv Palivoda in bpo-30262@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30262}.)

@item 
@ref{a00,,fileinput.input()}과 @ref{93f,,fileinput.FileInput()}의 @code{bufsize} 키워드 인자는 무시 되었고 파이썬 3.6부터 폐지되었으며, 이제 제거되었습니다. bpo-36952@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36952} (Contributed by Matthias Bussonnier.)

@item 
The functions @code{sys.set_coroutine_wrapper()} and
@code{sys.get_coroutine_wrapper()} deprecated in Python 3.7 have been removed;
bpo-36933@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36933} (Contributed by Matthias Bussonnier.)
@end itemize

@node 파이썬 3 8로 이식하기,파이썬 3 8 1의 주목할만한 변경 사항,API 및 기능 제거,파이썬 3 8의 새로운 기능
@anchor{whatsnew/3 8 porting-to-python-3-8}@anchor{c7b}
@subsection 파이썬 3.8로 이식하기


이 절에서는 여러분의 코드 수정을 요구할 수도 있는 이전에 설명한 변경 사항과 다른 버그 수정 사항을 나열합니다.

@menu
* 파이썬 동작의 변경:: 
* 파이썬 API의 변경: 파이썬 API의 변경<2>. 
* C API의 변경: C API의 변경<2>. 
* CPython 바이트 코드 변경: CPython 바이트 코드 변경<2>. 
* 데모와 도구:: 

@end menu

@node 파이썬 동작의 변경,파이썬 API의 변경<2>,,파이썬 3 8로 이식하기
@anchor{whatsnew/3 8 changes-in-python-behavior}@anchor{c7c}
@subsubsection 파이썬 동작의 변경



@itemize *

@item 
일드 표현식(@code{yield}와 @code{yield from} 절 모두)은 이제 컴프리헨션과 제너레이터 표현식에서 허용되지 않습니다 (가장 왼쪽 @code{for} 절의 이터러블 표현식 제외). (Contributed by Serhiy Storchaka in bpo-10544@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10544}.)

@item 
아이덴티티 검사(@code{is}와 @code{is not})가 특정 형의 리터럴(예를 들어, 문자열, 숫자)과 함께 사용될 때 컴파일러는 이제 @ref{1ae,,SyntaxWarning}을 생성합니다. 이들은 종종 CPython에서 우연히 작동할 수 있지만, 언어 명세에 의해 보장되지는 않습니다. 이 경고는 사용자가 동등 검사(@code{==}와 @code{!=})를 대신 사용하도록 권장합니다. (Contributed by Serhiy Storchaka in bpo-34850@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34850}.)

@item 
CPython 인터프리터는 때에 따라 예외를 삼킬 수 있습니다. 파이썬 3.8에서는 이런 경우가 덜 발생합니다. 특히, 형 딕셔너리에서 어트리뷰트를 가져올 때 발생하는 예외는 더는 무시되지 않습니다. (Contributed by Serhiy Storchaka in bpo-35459@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35459}.)

@item 
내장형 @ref{3c3,,bool}, @ref{19b,,int}, @ref{196,,float}, @ref{197,,complex} 및 표준 라이브러리의 일부 클래스에서 @code{__str__} 구현을 제거했습니다. 이제 이들은 @ref{c7d,,object}에서 @code{__str__()}을 상속합니다. 결과적으로, 이러한 클래스의 서브 클래스에서 @code{__repr__()} 메서드를 정의하면 문자열 표현에 영향을 줍니다. (Contributed by Serhiy Storchaka in bpo-36793@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36793}.)

@item 
AIX에서, @ref{291,,sys.platform}은 더는 주(major) 버전을 포함하지 않습니다. @code{'aix3'} .. @code{'aix7'} 대신 항상 @code{'aix'}입니다. 이전 버전의 파이썬에서는 버전 번호가 포함되어 있기 때문에, 항상 @code{sys.platform.startswith('aix')}를 사용하는 것이 좋습니다. (Contributed by M. Felt in bpo-36588@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36588}.)

@item 
@code{PyEval_AcquireLock()}과 @code{PyEval_AcquireThread()}는 인터프리터가 파이널라이즈하는 동안 호출되면 현재 스레드를 종료하여, @ref{646,,PyEval_RestoreThread()}, @ref{c7e,,Py_END_ALLOW_THREADS()} 및 @ref{648,,PyGILState_Ensure()}와 일관되게 만듭니다. 이 동작을 원하지 않으면, @code{_Py_IsFinalizing()}이나 @ref{c7f,,sys.is_finalizing()}을 확인하여 호출을 보호하십시오. (Contributed by Joannah Nanjekye in bpo-36475@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36475}.)
@end itemize

@node 파이썬 API의 변경<2>,C API의 변경<2>,파이썬 동작의 변경,파이썬 3 8로 이식하기
@anchor{whatsnew/3 8 changes-in-the-python-api}@anchor{c80}
@subsubsection 파이썬 API의 변경



@itemize *

@item 
@ref{c81,,os.getcwdb()} 함수는 이제 윈도우에서 ANSI 코드 페이지가 아닌 UTF-8 인코딩을 사용합니다. 이유는 
@geindex Python 향상 제안; PEP 529
PEP 529@footnote{https://peps.python.org/pep-0529/}를 참조하십시오. 이 함수는 윈도우에서 더는 폐지되지 않았습니다. (Contributed by Victor Stinner in bpo-37412@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37412}.)

@item 
@ref{4b8,,subprocess.Popen} can now use @ref{52e,,os.posix_spawn()} in some cases
for better performance. On Windows Subsystem for Linux and QEMU User
Emulation, the @code{Popen} constructor using
@code{os.posix_spawn()} no longer raises an exception on errors like
“missing program”.  Instead the child process fails with a
non-zero @ref{c82,,returncode}.
(Contributed by Joannah Nanjekye and Victor Stinner in bpo-35537@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35537}.)

@item 
@ref{4b8,,subprocess.Popen}의 `preexec_fn' 인자는 더는 서브 인터프리터와 호환되지 않습니다. 서브 인터프리터에서 매개 변수를 사용하면 @ref{244,,RuntimeError}가 발생합니다. (Contributed by Eric Snow in bpo-34651@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34651}, modified by Christian Heimes in bpo-37951@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37951}.)

@item 
The @ref{c83,,imaplib.IMAP4.logout()} method no longer silently ignores arbitrary
exceptions.
(Contributed by Victor Stinner in bpo-36348@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36348}.)

@item 
The function @code{platform.popen()} has been removed, after having been deprecated since
Python 3.3: use @ref{31a,,os.popen()} instead.
(Contributed by Victor Stinner in bpo-35345@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35345}.)

@item 
@ref{c84,,statistics.mode()} 함수는 다중 모드(multimodal) 데이터가 주어질 때 더는 예외를 발생시키지 않습니다. 대신, 입력 데이터에서 만나는 첫 번째 모드를 반환합니다. (Contributed by Raymond Hettinger in bpo-35892@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35892}.)

@item 
@ref{c85,,tkinter.ttk.Treeview} 클래스의 @ref{c86,,selection()} 메서드는 더는 인자를 받아들이지 않습니다. 선택을 변경하기 위해 인자와 함께 사용하는 것은 파이썬 3.6에서 폐지되었습니다. 선택을 변경하려면 @ref{c87,,selection_set()}과 같은 특화된 메서드를 사용하십시오. (Contributed by Serhiy Storchaka in bpo-31508@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31508}.)

@item 
The @ref{c88,,writexml()}, @ref{c89,,toxml()}
and @ref{c8a,,toprettyxml()} methods of
@ref{128,,xml.dom.minidom} and the @ref{c8b,,write()}
method of @ref{12b,,xml.etree.ElementTree} now preserve the attribute order
specified by the user.
(Contributed by Diego Rojas and Raymond Hettinger in bpo-34160@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34160}.)

@item 
플래그 @code{'r'}로 열린 @ref{36,,dbm.dumb} 데이터베이스는 이제 읽기 전용입니다. @code{'r'}과 @code{'w'} 플래그로 @ref{c8c,,dbm.dumb.open()}하면 더는 데이터베이스가 없을 때 만들지 않습니다. (Contributed by Serhiy Storchaka in bpo-32749@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32749}.)

@item 
@ref{c48,,XMLParser}의 서브 클래스에 정의된 @code{doctype()} 메서드는 더는 호출되지 않으며 @ref{1a3,,DeprecationWarning} 대신 @ref{4d8,,RuntimeWarning}을 방출합니다. XML doctype 선언을 처리하려면 대상에 @ref{c8d,,doctype()} 메서드를 정의하십시오. (Contributed by Serhiy Storchaka in bpo-29209@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29209}.)

@item 
사용자 지정 메타 클래스가 @code{type.__new__}에 전달된 이름 공간에 @code{__classcell__} 항목을 제공하지 않으면 이제 @ref{244,,RuntimeError}가 발생합니다. 파이썬 3.6–3.7에서는 @ref{1a3,,DeprecationWarning}이 방출되었습니다. (Contributed by Serhiy Storchaka in bpo-23722@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23722}.)

@item 
The @ref{bd5,,cProfile.Profile} class can now be used as
a context manager. (Contributed by Scott Sanderson in bpo-29235@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29235}.)

@item 
@ref{c4d,,shutil.copyfile()}, @ref{c4e,,shutil.copy()}, @ref{c4f,,shutil.copy2()}, @ref{c1d,,shutil.copytree()} 및 @ref{c50,,shutil.move()}는 플랫폼 특정 “고속 복사(fast-copy)” 시스템 호출을 사용합니다 (@ref{c52,,플랫폼 의존적 효율적인 복사 연산} 절을 참조하십시오).

@item 
윈도우에서 @ref{c4d,,shutil.copyfile()} 기본 버퍼 크기가 16 KiB에서 1 MiB로 변경되었습니다.

@item 
@code{PyGC_Head} 구조체가 완전히 변경되었습니다. 구조체 멤버를 건드리는 모든 코드는 다시 작성해야 합니다. (bpo-33597@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33597} 참조.)

@item 
@ref{aba,,PyInterpreterState} 구조체는 “내부” 헤더 파일(구체적으로 Include/internal/pycore_pystate.h)로 이동했습니다. 불투명한 @code{PyInterpreterState}는 공용 API(와 안정 ABI)의 일부로 계속 사용할 수 있습니다. 설명서는 구조체의 필드가 공용이 아니라고 말하고 있으니, 아무도 해당 필드를 사용하지 않기를 바랍니다. 그러나, 하나 이상의 내부 필드에 의지하고 대안이 없으면 BPO 이슈를 여십시오. 조정을 돕기 위해 노력할 것입니다 (공용 API에 접근 함수를 추가하는 것도 가능합니다). (bpo-35886@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35886}을 참조하십시오.)

@item 
@ref{c8e,,mmap.flush()} 메서드는 이제 모든 플랫폼에서 성공 시 @code{None}을 반환하고 에러 시 예외를 발생시킵니다. 이전에는, 그 동작이 플랫폼에 따라 달랐습니다: 윈도우에서 성공 시 0이 아닌 값이 반환되었습니다; 에러 시 0이 반환되었습니다. 유닉스에서 성공 시 0 값이 반환되었습니다; 에러 시 예외가 발생했습니다. (Contributed by Berker Peksag in bpo-2122@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2122}.)

@item 
@ref{128,,xml.dom.minidom}과 @ref{12f,,xml.sax} 모듈은 기본적으로 더는 외부 엔티티를 처리하지 않습니다. (Contributed by Christian Heimes in bpo-17239@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17239}.)

@item 
Deleting a key from a read-only @ref{35,,dbm} database (@ref{36,,dbm.dumb},
@ref{37,,dbm.gnu} or @ref{38,,dbm.ndbm}) raises @code{error} (@ref{c8f,,dbm.dumb.error},
@ref{c90,,dbm.gnu.error} or @ref{c91,,dbm.ndbm.error}) instead of @ref{5e5,,KeyError}.
(Contributed by Xiang Zhang in bpo-33106@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33106}.)

@item 
리터럴을 위해 단순화된 AST. 모든 상수는 @ref{2ef,,ast.Constant} 인스턴스로 표시됩니다. 이전 클래스 @code{Num}, @code{Str}, @code{Bytes}, @code{NameConstant} 및 @code{Ellipsis}를 인스턴스 화하면 @code{Constant} 인스턴스가 반환됩니다. (Contributed by Serhiy Storchaka in bpo-32892@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32892}.)

@item 
윈도우에서 @ref{c08,,expanduser()}는 이제 
@geindex USERPROFILE
@geindex 환경 변수; USERPROFILE
@code{USERPROFILE} 환경 변수를 선호하며 일반적으로 일반 사용자 계정에 설정되지 않는 
@geindex HOME
@geindex 환경 변수; HOME
@code{HOME}을 사용하지 않습니다. (Contributed by Anthony Sottile in bpo-36264@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36264}.)

@item 
@ref{4d5,,asyncio.CancelledError} 예외는 이제 @ref{bcc,,Exception}이 아닌 @ref{7d6,,BaseException}을 상속하고, 더는 @ref{bcd,,concurrent.futures.CancelledError}를 상속하지 않습니다. (Contributed by Yury Selivanov in bpo-32528@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32528}.)

@item 
@ref{814,,asyncio.wait_for()} 함수는 이제 @ref{1c7,,asyncio.Task} 인스턴스를 사용할 때 취소를 올바르게 기다립니다. 이전에는, `timeout'에 도달하면 취소되어 즉시 반환되었습니다. (Contributed by Elvis Pranskevichus in bpo-32751@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32751}.)

@item 
@ref{c92,,asyncio.BaseTransport.get_extra_info()} 함수는 이제 ‘socket’이 `name' 매개 변수로 전달될 때 안전하게 사용할 수 있는 소켓 객체를 반환합니다. (Contributed by Yury Selivanov in bpo-37027@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37027}.)

@item 
@ref{c93,,asyncio.BufferedProtocol}는 졸업해서 안정 API가 되었습니다.
@end itemize
@anchor{whatsnew/3 8 bpo-36085-whatsnew}@anchor{c94}

@itemize *

@item 
윈도우에서 @ref{2e,,ctypes}로 로드된 확장 모듈과 DLL에 대한 DLL 종속성이 이제 더 안전하게 처리됩니다. 시스템 경로, DLL이나 PYD 파일이 들어 있는 디렉터리 및 @ref{bdc,,add_dll_directory()}로 추가된 디렉터리만 로드 시간 종속성을 위해 검색합니다. 특히, 
@geindex PATH
@geindex 환경 변수; PATH
@code{PATH}와 현재 작업 디렉터리는 더는 사용되지 않으며, 이러한 것들에 대한 수정은 더는 일반 DLL 결정(resolution)에 영향을 주지 않습니다. 여러분의 응용 프로그램이 이러한 메커니즘에 의존한다면, @code{add_dll_directory()}가 있는지 확인하고, 있다면 이를 사용하여 라이브러리를 로드하는 동안 DLL 디렉터리를 추가하십시오. 윈도우 7 사용자는 윈도우 업데이트 KB2533623이 설치되었는지 확인해야 합니다 (이는 설치 프로그램에서도 확인합니다). (Contributed by Steve Dower in bpo-36085@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36085}.)

@item 
pgen과 관련된 헤더 파일과 함수는 순수 파이썬 구현으로 대체 된 후에 제거되었습니다. (Contributed by Pablo Galindo in bpo-36623@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36623}.)

@item 
@ref{32f,,types.CodeType}은 
@geindex Python 향상 제안; PEP 570
PEP 570@footnote{https://peps.python.org/pep-0570/}에 정의된 위치 전용 인자를 지원하기 위해 생성자의 두 번째 위치에 새 매개 변수(`posonlyargcount')를 갖습니다. 첫 번째 인자(`argcount')는 이제 위치 인자의 총수(위치 전용 인자 포함)를 나타냅니다. @code{types.CodeType}의 새로운 @code{replace()} 메서드를 사용하면 코드가 미래에도 안전하게 만들 수 있습니다.

@item 
The parameter @code{digestmod} for @ref{c95,,hmac.new()} no longer uses the MD5 digest
by default.
@end itemize

@node C API의 변경<2>,CPython 바이트 코드 변경<2>,파이썬 API의 변경<2>,파이썬 3 8로 이식하기
@anchor{whatsnew/3 8 changes-in-the-c-api}@anchor{c96}
@subsubsection C API의 변경



@itemize *

@item 
@ref{c97,,PyCompilerFlags} 구조체에 새로운 `cf_feature_version' 필드가 생겼습니다. @code{PY_MINOR_VERSION}으로 초기화해야합니다. 이 필드는 기본적으로 무시되며, @code{PyCF_ONLY_AST} 플래그가 `cf_flags'에 설정되었을 때, 또 그때만 사용됩니다. (Contributed by Guido van Rossum in bpo-35766@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35766}.)

@item 
@code{PyEval_ReInitThreads()} 함수가 C API에서 제거되었습니다. 명시적으로 호출하면 안 됩니다: 대신 @ref{430,,PyOS_AfterFork_Child()}를 사용하십시오. (Contributed by Victor Stinner in bpo-36728@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36728}.)

@item 
유닉스에서, C 확장은 더는 안드로이드와 Cygwin을 제외하고는 libpython에 링크되지 않습니다. 파이썬이 내장될 때, @code{libpython}은 @code{RTLD_LOCAL}이 아니라 @code{RTLD_GLOBAL}로 로드되어야 합니다. 이전에는, @code{RTLD_LOCAL}을 사용하여, @code{Modules/Setup}의 @code{*shared*} 섹션에 의해 빌드된 표준 라이브러리의 C 확장과 같이 @code{libpython}에 링크되지 않은 C 확장을 로드할 수 없었습니다. (Contributed by Victor Stinner in bpo-21536@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21536}.)

@item 
@code{PY_SSIZE_T_CLEAN}이 정의되지 않은 상태에서 값을 구문 분석하거나 빌드할 때(예를 들어, @ref{3c1,,PyArg_ParseTuple()}, @ref{3c2,,Py_BuildValue()}, @ref{63d,,PyObject_CallFunction()} 등) 포맷의 @code{#} 변형을 사용하면 @code{DeprecationWarning}이 발생합니다. 3.10이나 4.0에서 제거됩니다. 자세한 내용은 @ref{3d5,,인자 구문 분석과 값 구축}를 참조하십시오. (Contributed by Inada Naoki in bpo-36381@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36381}.)

@item 
Instances of heap-allocated types (such as those created with
@ref{79c,,PyType_FromSpec()}) hold a reference to their type object.
Increasing the reference count of these type objects has been moved from
@ref{c5f,,PyType_GenericAlloc()} to the more low-level functions,
@ref{c60,,PyObject_Init()} and @code{PyObject_INIT}.
This makes types created through @code{PyType_FromSpec()} behave like
other classes in managed code.

@ref{982,,정적으로 할당된 형}은 영향을 받지 않습니다.

대다수의 경우, 부작용이 없어야 합니다. 그러나, 인스턴스를 할당한 후 수동으로 참조 횟수를 늘리는 형(아마도 버그를 회피하기 위해)이 이제 불멸이 될 수 있습니다. 이를 피하고자, 이런 클래스는 인스턴스 할당 해제 중에 형 객체에 Py_DECREF를 호출할 필요가 있습니다.

이러한 형들을 3.8로 올바르게 이식하려면, 다음 변경 사항을 적용하십시오:


@itemize *

@item 
Remove @ref{78e,,Py_INCREF} on the type object after allocating an
instance - if any.
This may happen after calling @ref{b7b,,PyObject_New},
@ref{b7c,,PyObject_NewVar}, @ref{c98,,PyObject_GC_New()},
@ref{c99,,PyObject_GC_NewVar()}, or any other custom allocator that uses
@ref{c60,,PyObject_Init()} or @code{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
    // 파이썬 이슈 35810에 대한 해결 방법; 파이썬 3.8에서는 더는 필요 없습니다
    PY_INCREF(type)
#endif
    return foo;
@}
@end example

@item 
힙에 할당되는 형의 모든 사용자 정의 @code{tp_dealloc} 함수가 형의 참조 횟수를 감소시키도록 하십시오.

예:

@example
static void
foo_dealloc(foo_struct *instance) @{
    PyObject *type = Py_TYPE(instance);
    PyObject_GC_Del(instance);
#if PY_VERSION_HEX >= 0x03080000
    // 파이썬 3.8 이전에서는 필요하지 않았습니다 (파이썬 이슈 35810)
    Py_DECREF(type);
#endif
@}
@end example
@end itemize

(Contributed by Eddie Elizondo in bpo-35810@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35810}.)

@item 
@ref{c9a,,Py_DEPRECATED()} 매크로는 MSVC 용으로 구현되었습니다. 매크로는 이제 기호 이름 앞에 놓여야 합니다.

예:

@example
Py_DEPRECATED(3.8) PyAPI_FUNC(int) Py_OldFunction(void);
@end example

(Contributed by Zackery Spytz in bpo-33407@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33407}.)

@item 
인터프리터는 더는 기능 배포에서 확장형의 바이너리 호환성을 지원하지 않습니다. 제삼자 확장 모듈에서 내보낸 @ref{c9b,,PyTypeObject}는 @ref{c9c,,tp_finalize} (@ref{427,,Py_TPFLAGS_HAVE_FINALIZE}는 @code{tp_finalize}를 읽기 전에 더는 확인되지 않습니다)를 포함하여 현재 파이썬 버전이 기대하는 모든 슬롯을 가지고 있다고 가정합니다.

(Contributed by Antoine Pitrou in bpo-32388@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32388}.)

@item 
함수 @code{PyNode_AddChild()}와 @code{PyParser_AddToken()}는 이제 두 개의 추가 @code{int} 인자 `end_lineno'와 `end_col_offset'을 받아들입니다.

@item 
MinGW 도구가 @code{python38.dll}에 대해 직접 링크할 수 있도록 허용하는 @code{libpython38.a} 파일은 더는 일반 윈도우 배포에 포함되지 않습니다. 이 파일이 필요하면, MinGW binutils 패키지의 일부인 @code{gendef}와 @code{dlltool} 도구로 생성할 수 있습니다:

@example
gendef - python38.dll > tmp.def
dlltool --dllname python38.dll --def tmp.def --output-lib libpython38.a
@end example

설치된 @code{pythonXY.dll}의 위치는 윈도우의 설치 옵션과 버전 및 언어에 따라 다릅니다. 자세한 내용은 @ref{c9d,,윈도우에서 파이썬 사용하기}를 참조하십시오. 결과 라이브러리는 @code{pythonXY.lib}(일반적으로 파이썬 설치 환경의 @code{libs} 디렉터리입니다)와 같은 디렉터리에 위치해야 합니다.

(Contributed by Steve Dower in bpo-37351@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37351}.)
@end itemize

@node CPython 바이트 코드 변경<2>,데모와 도구,C API의 변경<2>,파이썬 3 8로 이식하기
@anchor{whatsnew/3 8 cpython-bytecode-changes}@anchor{c9e}
@subsubsection CPython 바이트 코드 변경



@itemize *

@item 
인터프리터 루프는 블록 스택을 언 롤링하는 로직을 컴파일러로 이동시킴으로써 단순화되었습니다. 컴파일러는 이제 값 스택을 조정하고 @ref{17f,,break}, @ref{180,,continue} 및 @ref{1af,,return}에 대한 정리 코드를 호출하는 명시적인 명령을 출력합니다.

옵코드 @code{BREAK_LOOP}, @code{CONTINUE_LOOP}, @code{SETUP_LOOP} 및 @code{SETUP_EXCEPT}를 제거했습니다. 새로운 옵코드 @code{ROT_FOUR}, @code{BEGIN_FINALLY}, @code{CALL_FINALLY} 및 @code{POP_FINALLY}가 추가되었습니다. @code{END_FINALLY}와 @code{WITH_CLEANUP_START}의 동작이 변경되었습니다.

(Contributed by Mark Shannon, Antoine Pitrou and Serhiy Storchaka in
bpo-17611@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17611}.)

@item 
@ref{c9f,,async for} 루프에서 다음 항목을 await 할 때 발생하는 예외를 처리하기 위한 새로운 옵코드 @ref{ca0,,END_ASYNC_FOR}가 추가되었습니다. (Contributed by Serhiy Storchaka in bpo-33041@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33041}.)

@item 
@ref{ca1,,MAP_ADD}는 이제 값을 스택의 첫 번째 요소로, 키를 두 번째 요소로 기대합니다. 이 변경은 
@geindex Python 향상 제안; PEP 572
PEP 572@footnote{https://peps.python.org/pep-0572/}의 제안에 따라, 딕셔너리 컴프리헨션에서 키가 값보다 항상 먼저 평가되도록 하기 위해 만들어졌습니다. (Contributed by Jörn Heissler in bpo-35224@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35224}.)
@end itemize

@node 데모와 도구,,CPython 바이트 코드 변경<2>,파이썬 3 8로 이식하기
@anchor{whatsnew/3 8 demos-and-tools}@anchor{ca2}
@subsubsection 데모와 도구


변수를 액세스하는 다양한 방법의 시간을 측정하기 위한 벤치마크 스크립트를 추가했습니다: @code{Tools/scripts/var_access_benchmark.py}. (Contributed by Raymond Hettinger in bpo-35884@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35884}.)

다음은 파이썬 3.3 이후의 성능 향상에 대한 요약입니다:

@example
Python version                       3.3     3.4     3.5     3.6     3.7     3.8
--------------                       ---     ---     ---     ---     ---     ---

Variable and attribute read access:
    read_local                       4.0     7.1     7.1     5.4     5.1     3.9
    read_nonlocal                    5.3     7.1     8.1     5.8     5.4     4.4
    read_global                     13.3    15.5    19.0    14.3    13.6     7.6
    read_builtin                    20.0    21.1    21.6    18.5    19.0     7.5
    read_classvar_from_class        20.5    25.6    26.5    20.7    19.5    18.4
    read_classvar_from_instance     18.5    22.8    23.5    18.8    17.1    16.4
    read_instancevar                26.8    32.4    33.1    28.0    26.3    25.4
    read_instancevar_slots          23.7    27.8    31.3    20.8    20.8    20.2
    read_namedtuple                 68.5    73.8    57.5    45.0    46.8    18.4
    read_boundmethod                29.8    37.6    37.9    29.6    26.9    27.7

Variable and attribute write access:
    write_local                      4.6     8.7     9.3     5.5     5.3     4.3
    write_nonlocal                   7.3    10.5    11.1     5.6     5.5     4.7
    write_global                    15.9    19.7    21.2    18.0    18.0    15.8
    write_classvar                  81.9    92.9    96.0   104.6   102.1    39.2
    write_instancevar               36.4    44.6    45.8    40.0    38.9    35.5
    write_instancevar_slots         28.7    35.6    36.1    27.3    26.6    25.7

Data structure read access:
    read_list                       19.2    24.2    24.5    20.8    20.8    19.0
    read_deque                      19.9    24.7    25.5    20.2    20.6    19.8
    read_dict                       19.7    24.3    25.7    22.3    23.0    21.0
    read_strdict                    17.9    22.6    24.3    19.5    21.2    18.9

Data structure write access:
    write_list                      21.2    27.1    28.5    22.5    21.6    20.0
    write_deque                     23.8    28.7    30.1    22.7    21.8    23.5
    write_dict                      25.9    31.4    33.3    29.3    29.2    24.7
    write_strdict                   22.9    28.4    29.9    27.5    25.2    23.1

Stack (or queue) operations:
    list_append_pop                144.2    93.4   112.7    75.4    74.2    50.8
    deque_append_pop                30.4    43.5    57.0    49.4    49.2    42.5
    deque_append_popleft            30.8    43.7    57.3    49.7    49.7    42.8

Timing loop:
    loop_overhead                    0.3     0.5     0.6     0.4     0.3     0.3
@end example

벤치마크는 python.org@footnote{https://www.python.org/downloads/macos/}에서 찾을 수 있는 macOS 64비트 빌드를 실행하는 Intel® Core™ i7-4960HQ processor@footnote{https://ark.intel.com/content/www/us/en/ark/products/76088/intel-core-i7-4960hq-processor-6m-cache-up-to-3-80-ghz.html}에서 측정되었습니다. 벤치마크 스크립트는 타이밍을 나노초로 표시합니다.

@node 파이썬 3 8 1의 주목할만한 변경 사항,파이썬 3 8 2의 주목할만한 변경 사항,파이썬 3 8로 이식하기,파이썬 3 8의 새로운 기능
@anchor{whatsnew/3 8 notable-changes-in-python-3-8-1}@anchor{ca3}
@subsection 파이썬 3.8.1의 주목할만한 변경 사항


심각한 보안 문제로 인해, @ref{93b,,asyncio.loop.create_datagram_endpoint()}의 `reuse_address' 매개 변수는 더는 지원되지 않습니다. 이것은 UDP에서 소켓 옵션 @code{SO_REUSEADDR}의 동작 때문입니다. 자세한 내용은 @code{loop.create_datagram_endpoint()} 설명서를 참조하십시오. (Contributed by Kyle Stanley, Antoine Pitrou, and Yury Selivanov in bpo-37228@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37228}.)

@node 파이썬 3 8 2의 주목할만한 변경 사항,파이썬 3 8 3의 주목할만한 변경 사항,파이썬 3 8 1의 주목할만한 변경 사항,파이썬 3 8의 새로운 기능
@anchor{whatsnew/3 8 notable-changes-in-python-3-8-2}@anchor{ca4}
@subsection 파이썬 3.8.2의 주목할만한 변경 사항


Fixed a regression with the @code{ignore} callback of @ref{c1d,,shutil.copytree()}.
The argument types are now str and List[str] again.
(Contributed by Manuel Barkhau and Giampaolo Rodola in gh-83571@footnote{https://github.com/python/cpython/issues/83571}.)

@node 파이썬 3 8 3의 주목할만한 변경 사항,파이썬 3 8 8의 주목할만한 변경 사항,파이썬 3 8 2의 주목할만한 변경 사항,파이썬 3 8의 새로운 기능
@anchor{whatsnew/3 8 notable-changes-in-python-3-8-3}@anchor{ca5}
@subsection 파이썬 3.8.3의 주목할만한 변경 사항


The constant values of future flags in the @ref{0,,__future__} module
are updated in order to prevent collision with compiler flags. Previously
@code{PyCF_ALLOW_TOP_LEVEL_AWAIT} was clashing with @code{CO_FUTURE_DIVISION}.
(Contributed by Batuhan Taskaya in gh-83743@footnote{https://github.com/python/cpython/issues/83743})

@node 파이썬 3 8 8의 주목할만한 변경 사항,파이썬 3 8 9의 주목할만한 변경 사항,파이썬 3 8 3의 주목할만한 변경 사항,파이썬 3 8의 새로운 기능
@anchor{whatsnew/3 8 notable-changes-in-python-3-8-8}@anchor{ca6}
@subsection 파이썬 3.8.8의 주목할만한 변경 사항


이전 파이썬 버전에서는 @ref{31f,,urllib.parse.parse_qs()}와 @ref{31e,,urllib.parse.parse_qsl()}에서 쿼리 매개 변수 구분자로 @code{;}과 @code{&}를 모두 사용할 수 있었습니다. 보안 문제와 최신 W3C 권장 사항을 준수하기 위해, @code{&}가 기본값인 단일 구분자 키만 허용하도록 변경되었습니다. 이 변경 사항은 영향을 받는 함수를 내부적으로 사용하므로 @code{cgi.parse()}와 @code{cgi.parse_multipart()}에도 영향을 줍니다. 자세한 내용은 해당 설명서를 참조하십시오. (Contributed by Adam Goldschmidt, Senthil Kumaran and Ken Jin in bpo-42967@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42967}.)

@node 파이썬 3 8 9의 주목할만한 변경 사항,파이썬 3 8 10의 주목할만한 변경 사항,파이썬 3 8 8의 주목할만한 변경 사항,파이썬 3 8의 새로운 기능
@anchor{whatsnew/3 8 notable-changes-in-python-3-8-9}@anchor{ca7}
@subsection 파이썬 3.8.9의 주목할만한 변경 사항


A security fix alters the @ref{af6,,ftplib.FTP} behavior to not trust the
IPv4 address sent from the remote server when setting up a passive data
channel.  We reuse the ftp server IP address instead.  For unusual code
requiring the old behavior, set a @code{trust_server_pasv_ipv4_address}
attribute on your FTP instance to @code{True}.  (See gh-87451@footnote{https://github.com/python/cpython/issues/87451})

@node 파이썬 3 8 10의 주목할만한 변경 사항,파이썬 3 8 10의 주목할만한 변경 사항<2>,파이썬 3 8 9의 주목할만한 변경 사항,파이썬 3 8의 새로운 기능
@anchor{whatsnew/3 8 notable-changes-in-python-3-8-10}@anchor{ca8}
@subsection 파이썬 3.8.10의 주목할만한 변경 사항


@menu
* macOS 11.0 (Big Sur) and Apple Silicon Mac support: macOS 11 0 Big Sur and Apple Silicon Mac support. 

@end menu

@node macOS 11 0 Big Sur and Apple Silicon Mac support,,,파이썬 3 8 10의 주목할만한 변경 사항
@anchor{whatsnew/3 8 macos-11-0-big-sur-and-apple-silicon-mac-support}@anchor{ca9}
@subsubsection macOS 11.0 (Big Sur) and Apple Silicon Mac support


As of 3.8.10, Python now supports building and running on macOS 11
(Big Sur) and on Apple Silicon Macs (based on the @code{ARM64} architecture).
A new universal build variant, @code{universal2}, is now available to natively
support both @code{ARM64} and @code{Intel 64} in one set of executables.
Note that support for “weaklinking”, building binaries targeted for newer
versions of macOS that will also run correctly on older versions by
testing at runtime for missing features, is not included in this backport
from Python 3.9; to support a range of macOS versions, continue to target
for and build on the oldest version in the range.

(Originally contributed by Ronald Oussoren and Lawrence D’Anna in gh-85272@footnote{https://github.com/python/cpython/issues/85272},
with fixes by FX Coudert and Eli Rykoff, and backported to 3.8 by Maxime Bélanger
and Ned Deily)

@node 파이썬 3 8 10의 주목할만한 변경 사항<2>,파이썬 3 8 12의 주목할만한 변경 사항,파이썬 3 8 10의 주목할만한 변경 사항,파이썬 3 8의 새로운 기능
@anchor{whatsnew/3 8 id1}@anchor{caa}
@subsection 파이썬 3.8.10의 주목할만한 변경 사항


@menu
* urllib.parse: urllib parse<4>. 

@end menu

@node urllib parse<4>,,,파이썬 3 8 10의 주목할만한 변경 사항<2>
@anchor{whatsnew/3 8 urllib-parse}@anchor{cab}
@subsubsection urllib.parse


The presence of newline or tab characters in parts of a URL allows for some
forms of attacks. Following the WHATWG specification that updates 
@geindex RFC; RFC 3986
RFC 3986@footnote{https://datatracker.ietf.org/doc/html/rfc3986.html},
ASCII newline @code{\n}, @code{\r} and tab @code{\t} characters are stripped from the
URL by the parser in @ref{110,,urllib.parse} preventing such attacks. The removal
characters are controlled by a new module level variable
@code{urllib.parse._UNSAFE_URL_BYTES_TO_REMOVE}. (See bpo-43882@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43882})

@node 파이썬 3 8 12의 주목할만한 변경 사항,3 8 14의 주목할만한 보안 기능,파이썬 3 8 10의 주목할만한 변경 사항<2>,파이썬 3 8의 새로운 기능
@anchor{whatsnew/3 8 notable-changes-in-python-3-8-12}@anchor{cac}
@subsection 파이썬 3.8.12의 주목할만한 변경 사항


@menu
* 파이썬 API의 변경: 파이썬 API의 변경<3>. 

@end menu

@node 파이썬 API의 변경<3>,,,파이썬 3 8 12의 주목할만한 변경 사항
@anchor{whatsnew/3 8 id2}@anchor{cad}
@subsubsection 파이썬 API의 변경


Starting with Python 3.8.12 the @ref{84,,ipaddress} module no longer accepts
any leading zeros in IPv4 address strings. Leading zeros are ambiguous and
interpreted as octal notation by some libraries. For example the legacy
function @ref{b5a,,socket.inet_aton()} treats leading zeros as octal notation.
glibc implementation of modern @ref{b5b,,inet_pton()} does not accept
any leading zeros.

(Originally contributed by Christian Heimes in bpo-36384@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36384}, and backported
to 3.8 by Achraf Merzouki.)

@node 3 8 14의 주목할만한 보안 기능,3 8 17의 주목할만한 변경 사항,파이썬 3 8 12의 주목할만한 변경 사항,파이썬 3 8의 새로운 기능
@anchor{whatsnew/3 8 notable-security-feature-in-3-8-14}@anchor{cae}
@subsection 3.8.14의 주목할만한 보안 기능


Converting between @ref{19b,,int} and @ref{169,,str} in bases other than 2
(binary), 4, 8 (octal), 16 (hexadecimal), or 32 such as base 10 (decimal)
now raises a @ref{2ec,,ValueError} if the number of digits in string form is
above a limit to avoid potential denial of service attacks due to the
algorithmic complexity. This is a mitigation for 
@geindex Common Vulnerabilities and Exposures; CVE 2020-10735
CVE 2020-10735@footnote{https://www.cve.org/CVERecord?id=CVE-2020-10735}.
This limit can be configured or disabled by environment variable, command
line flag, or @ref{df,,sys} APIs. See the @ref{80a,,integer string conversion length limitation} documentation.  The default limit
is 4300 digits in string form.

@node 3 8 17의 주목할만한 변경 사항,,3 8 14의 주목할만한 보안 기능,파이썬 3 8의 새로운 기능
@anchor{whatsnew/3 8 notable-changes-in-3-8-17}@anchor{caf}
@subsection 3.8.17의 주목할만한 변경 사항


@menu
* tarfile: tarfile<6>. 

@end menu

@node tarfile<6>,,,3 8 17의 주목할만한 변경 사항
@anchor{whatsnew/3 8 id3}@anchor{cb0}
@subsubsection tarfile



@itemize *

@item 
The extraction methods in @ref{e4,,tarfile}, and @ref{695,,shutil.unpack_archive()},
have a new a `filter' argument that allows limiting tar features than may be
surprising or dangerous, such as creating files outside the destination
directory.
See @ref{696,,Extraction filters} for details.
In Python 3.12, use without the `filter' argument will show a
@ref{1a3,,DeprecationWarning}.
In Python 3.14, the default will switch to @code{'data'}.
(Contributed by Petr Viktorin in 
@geindex Python 향상 제안; PEP 706
PEP 706@footnote{https://peps.python.org/pep-0706/}.)
@end itemize

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 파이썬 3 7의 새로운 기능,파이썬 3 6의 새로운 기능,파이썬 3 8의 새로운 기능,파이썬의 새로운 기능
@anchor{whatsnew/3 7 doc}@anchor{cb1}@anchor{whatsnew/3 7 translation-repo}@anchor{cb2}@anchor{whatsnew/3 7 what-s-new-in-python-3-7}@anchor{cb3}
@section 파이썬 3.7의 새로운 기능


@*편집자: 
Elvis Pranskevichus <@email{elvis@@magic.io}>


@c Rules for maintenance:
@c 
@c * Anyone can add text to this document.  Do not spend very much time
@c on the wording of your changes, because your text will probably
@c get rewritten to some degree.
@c 
@c * The maintainer will go through Misc/NEWS periodically and add
@c changes; it's therefore more important to add your changes to
@c Misc/NEWS than to this file.
@c 
@c * This is not a complete list of every single change; completeness
@c is the purpose of Misc/NEWS.  Some changes I consider too small
@c or esoteric to include.  If such a change is added to the text,
@c I'll just remove it.  (This is another reason you shouldn't spend
@c too much time on writing your addition.)
@c 
@c * If you want to draw your new text to the attention of the
@c maintainer, add 'XXX' to the beginning of the paragraph or
@c section.
@c 
@c * It's OK to just add a fragmentary note about a change.  For
@c example: "XXX Describe the transmogrify() function added to the
@c socket module."  The maintainer will research the change and
@c write the necessary text.
@c 
@c * You can comment out your additions if you like, but it's not
@c necessary (especially when a final release is some months away).
@c 
@c * Credit the author of a patch or bugfix.   Just the name is
@c sufficient; the e-mail address isn't necessary.
@c 
@c * It's helpful to add the bug/patch number as a comment:
@c 
@c XXX Describe the transmogrify() function added to the socket
@c module.
@c (Contributed by P.Y. Developer in :issue:`12345`.)
@c 
@c This saves the maintainer the effort of going through the Git log
@c when researching a change.

이 기사에서는 파이썬 3.6과 비교하여 3.7의 새로운 기능에 관해 설명합니다. 파이썬 3.7은 2018년 6월 27일에 배포되었습니다. 자세한 내용은 @ref{142,,changelog} 를 참조하세요.

@menu
* 요약 – 배포 주요 사항: 요약 – 배포 주요 사항<3>. 
* 새로운 기능: 새로운 기능<4>. 
* 기타 언어 변경: 기타 언어 변경<4>. 
* 새 모듈: 새 모듈<3>. 
* 개선된 모듈: 개선된 모듈<3>. 
* C API 변경: C API 변경<2>. 
* 빌드 변경: 빌드 변경<2>. 
* 최적화: 최적화<3>. 
* 기타 CPython 구현 변경:: 
* 폐지된 파이썬 동작:: 
* 폐지된 파이썬 모듈@comma{} 함수 및 메서드: 폐지된 파이썬 모듈 함수 및 메서드. 
* 폐지된 C API의 함수 및 형:: 
* 플랫폼 지원 제거:: 
* API 및 기능 제거: API 및 기능 제거<2>. 
* 모듈 제거:: 
* 윈도우 전용 변경:: 
* 파이썬 3.7로 이식하기: 파이썬 3 7로 이식하기. 
* 파이썬 3.7.1의 주목할만한 변경 사항: 파이썬 3 7 1의 주목할만한 변경 사항. 
* 파이썬 3.7.2의 주목할만한 변경 사항: 파이썬 3 7 2의 주목할만한 변경 사항. 
* 파이썬 3.7.6의 주목할만한 변경 사항: 파이썬 3 7 6의 주목할만한 변경 사항. 
* 파이썬 3.7.10의 주목할만한 변경 사항: 파이썬 3 7 10의 주목할만한 변경 사항. 
* 파이썬 3.7.11의 주목할만한 변경 사항: 파이썬 3 7 11의 주목할만한 변경 사항. 
* 파이썬 3.7.14의 주목할만한 보안 기능: 파이썬 3 7 14의 주목할만한 보안 기능. 

@end menu

@node 요약 – 배포 주요 사항<3>,새로운 기능<4>,,파이썬 3 7의 새로운 기능
@anchor{whatsnew/3 7 summary-release-highlights}@anchor{cb4}
@subsection 요약 – 배포 주요 사항


@c This section singles out the most important changes in Python 3.7.
@c Brevity is key.

새로운 문법 기능:


@itemize *

@item 
@ref{cb5,,PEP 563}, 형 어노테이션의 지연된 평가.
@end itemize

이전 버전과 호환되지 않는 문법 변경:


@itemize *

@item 
@ref{93a,,async}와 @ref{18d,,await} 는 이제 예약 키워드입니다.
@end itemize

새 라이브러리 모듈:


@itemize *

@item 
@ref{28,,contextvars}: @ref{cb6,,PEP 567 – 컨텍스트 변수}

@item 
@ref{33,,dataclasses}: @ref{cb7,,PEP 557 – 데이터 클래스}

@item 
@ref{cb8,,importlib.resources}
@end itemize

새로운 내장 기능:


@itemize *

@item 
@ref{cb9,,PEP 553}, 새로운 @ref{271,,breakpoint()} 함수.
@end itemize

파이썬 데이터 모델 개선:


@itemize *

@item 
@ref{cba,,PEP 562}, 모듈 어트리뷰트에 대한 액세스의 사용자 정의.

@item 
@ref{cbb,,PEP 560}, typing 모듈과 제네릭 형에 대한 코어 지원.

@item 
@ref{cbc,,dict} 객체의 삽입 순서 보존 특성을 파이썬 언어 규격의 공식적인 일부로 선언했습니다@footnote{https://mail.python.org/pipermail/python-dev/2017-December/151283.html}.
@end itemize

표준 라이브러리의 현저한 개선:


@itemize *

@item 
@ref{b,,asyncio} 모듈에 새 기능과 현저한 @ref{cbd,,사용성 및 성능 개선} 이 추가되었습니다.

@item 
@ref{f4,,time} 모듈은 @ref{cbe,,나노초 해상도의 함수} 지원을 얻었습니다.
@end itemize

CPython 구현 개선:


@itemize *

@item 
ASCII를 기본 텍스트 인코딩으로 사용하지 않기:


@itemize *

@item 
@ref{cbf,,PEP 538}, 레거시 C 로케일 강제 변경

@item 
@ref{cc0,,PEP 540}, 강제 UTF-8 실행시간 모드
@end itemize

@item 
@ref{cc1,,PEP 552}, 결정적 .pycs

@item 
@ref{cc2,,새로운 파이썬 개발 모드}

@item 
@ref{cc3,,PEP 565}, 개선된 @ref{1a3,,DeprecationWarning} 처리
@end itemize

C API 개선 사항:


@itemize *

@item 
@ref{cc4,,PEP 539}, 스레드-로컬 저장소를 위한 새로운 C API
@end itemize

설명서 개선 사항:


@itemize *

@item 
@ref{cc5,,PEP 545}, 파이썬 설명서 번역

@item 
새로운 설명서 번역: 일본어@footnote{https://docs.python.org/ja/}, 프랑스어@footnote{https://docs.python.org/fr/}, 한국어@footnote{https://docs.python.org/ko/}.
@end itemize

이 배포는 많은 영역에서 주목할만한 성능 향상을 제공합니다. @ref{cc6,,최적화} 섹션에 자세히 나와 있습니다.

이전 파이썬 배포와의 호환성에 영향을 줄 수 있는 변경 사항 목록은 @ref{cc7,,파이썬 3.7로 이식하기} 섹션을 참조하십시오.

@node 새로운 기능<4>,기타 언어 변경<4>,요약 – 배포 주요 사항<3>,파이썬 3 7의 새로운 기능
@anchor{whatsnew/3 7 new-features}@anchor{cc8}
@subsection 새로운 기능


@menu
* PEP 563 ; 어노테이션의 지연된 평가: PEP 563 어노테이션의 지연된 평가. 
* PEP 538; 레거시 C 로케일 강제 변경: PEP 538 레거시 C 로케일 강제 변경. 
* PEP 540; 강제 UTF-8 실행시간 모드: PEP 540 강제 UTF-8 실행시간 모드. 
* PEP 553; 내장 breakpoint(): PEP 553 내장 breakpoint. 
* PEP 539; 스레드-로컬 저장소를 위한 새로운 C API: PEP 539 스레드-로컬 저장소를 위한 새로운 C API. 
* PEP 562; 모듈 어트리뷰트에 대한 액세스 사용자 정의: PEP 562 모듈 어트리뷰트에 대한 액세스 사용자 정의. 
* PEP 564; 나노초 해상도의 새로운 시간 함수: PEP 564 나노초 해상도의 새로운 시간 함수. 
* PEP 565; __main__ 의 DeprecationWarning 표시: PEP 565 __main__ 의 DeprecationWarning 표시. 
* PEP 560; typing 모듈과 제네릭 형에 대한 코어 지원: PEP 560 typing 모듈과 제네릭 형에 대한 코어 지원. 
* PEP 552; 해시 기반 .pyc 파일: PEP 552 해시 기반 pyc 파일. 
* PEP 545; 파이썬 설명서 번역: PEP 545 파이썬 설명서 번역. 
* 파이썬 개발 모드 (-X dev): 파이썬 개발 모드 -X dev. 

@end menu

@node PEP 563 어노테이션의 지연된 평가,PEP 538 레거시 C 로케일 강제 변경,,새로운 기능<4>
@anchor{whatsnew/3 7 pep-563-postponed-evaluation-of-annotations}@anchor{cc9}@anchor{whatsnew/3 7 whatsnew37-pep563}@anchor{cb5}
@subsubsection PEP 563 : 어노테이션의 지연된 평가


파이썬에서 형 힌트의 출현은 
@geindex Python 향상 제안; PEP 3107
PEP 3107@footnote{https://peps.python.org/pep-3107/}에서 추가되고 
@geindex Python 향상 제안; PEP 526
PEP 526@footnote{https://peps.python.org/pep-0526/}에서 더욱 다듬어진 어노테이션의 두 가지 사용성 문제를 드러냈습니다:


@itemize *

@item 
어노테이션은 현재 스코프에서 이미 사용 가능한 이름 만 사용할 수 있습니다. 즉, 어떤 종류의 전방 참조도 지원하지 않았습니다; 그리고

@item 
소스 코드에 어노테이션을 붙이는 것은 파이썬 프로그램의 시작 시간에 악영향을 미쳤습니다.
@end itemize

이 두 가지 문제는 어노테이션 평가를 지연시키는 것으로 해결됩니다. 정의 시간에 어노테이션의 표현식을 실행하는 코드를 컴파일하는 대신, 컴파일러는 해당 표현식의 AST와 동등한 문자열 형식으로 어노테이션을 저장합니다. 필요하다면, 실행시간에 @ref{8bf,,typing.get_type_hints()} 를 사용하여 어노테이션을 해석 할 수 있습니다. 이것이 필수적이지 않은 일반적인 경우에는, 어노테이션을 싸게 저장할 수 있고 (짧은 문자열은 인터프리터에 의해 한 번만 만들어지기 때문입니다), 시작 시간을 더 빠르게 할 수 있습니다.

사용성 측면에서, 이제 어노테이션이 전방 참조를 지원하므로 다음 문법이 유효합니다:

@example
class C:
    @@classmethod
    def from_string(cls, source: str) -> C:
        ...

    def validate_b(self, obj: B) -> bool:
        ...

class B:
    ...
@end example

이 변경으로 인해 호환성이 깨지기 때문에, 파이썬 3.7에서 새 동작은 @ref{0,,__future__} 임포트를 사용하여 모듈별로 새로운 동작을 활성화해야 합니다:

@example
from __future__ import annotations
@end example

파이썬 3.10에서는 기본값이 됩니다.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 563

@item PEP 563@footnote{https://peps.python.org/pep-0563/} – 어노테이션의 지연된 평가

Łukasz Langa가 작성하고 구현한 PEP.
@end table


@node PEP 538 레거시 C 로케일 강제 변경,PEP 540 강제 UTF-8 실행시간 모드,PEP 563 어노테이션의 지연된 평가,새로운 기능<4>
@anchor{whatsnew/3 7 pep-538-legacy-c-locale-coercion}@anchor{cca}@anchor{whatsnew/3 7 whatsnew37-pep538}@anchor{cbf}
@subsubsection PEP 538: 레거시 C 로케일 강제 변경


파이썬 3시리즈에서 진행 중인 과제는, 윈도우 이외의 플랫폼에서 기본 C 또는 POSIX 로케일 사용으로 인해 묵시적으로 가정되는 “7-비트 ASCII” 텍스트 인코딩을 처리하기 위한 적절한 기본 전략을 결정하는 것입니다.

새 
@geindex PYTHONCOERCECLOCALE
@geindex 환경 변수; PYTHONCOERCECLOCALE
@ref{ccb,,PYTHONCOERCECLOCALE} 환경 변수의 설명서에 설명되어있듯이, 
@geindex Python 향상 제안; PEP 538
PEP 538@footnote{https://peps.python.org/pep-0538/} 은 기본 인터프리터 명령행 인터페이스를 갱신하여, 사용 가능한 UTF-8 기반 로케일로 자동으로 강제 변경합니다. 이런 식으로 @code{LC_CTYPE} 을 자동 설정하는 것은, 핵심 인터프리터와 로케일을 인식하는 C 확장 (가령 @ref{bf,,readline}) 모두 기본 텍스트 인코딩으로 ASCII 대신 UTF-8을 가정하게 된다는 뜻입니다.

@geindex Python 향상 제안; PEP 11
PEP 11@footnote{https://peps.python.org/pep-0011/} 의 플랫폼 지원 정의 역시 전체 텍스트 처리 지원을 적절히 구성된 비 ASCII 기반 로케일로 제한하도록 갱신되었습니다.

이 변경의 일부로, 이제 정의된 강제 변경 대상 로케일(현재 @code{C.UTF-8}, @code{C.utf8}, @code{UTF-8})을 사용할 때, @ref{75e,,stdin} 과 @ref{ccc,,stdout} 의 기본 에러 처리기는 (@code{strict} 대신) @code{surrogateescape} 입니다. @ref{b33,,stderr} 의 기본 에러 처리기는 로케일에 관계없이 계속 @code{backslashreplace} 입니다.

로케일 강제 변경은 기본적으로 조용히 일어나지만, 로케일 관련 통합 문제를 디버깅하는 데 도움을 주기 위해 @code{PYTHONCOERCECLOCALE=warn} 를 설정해서 (@ref{b33,,stderr} 로 직접 출력되는) 명시적 경고를 요청할 수 있습니다. 또한, 이 설정은 핵심 인터프리터가 초기화될 때 레거시 C 로케일이 활성 상태로 남아 있으면 파이썬 런타임이 경고를 하도록 만듭니다.

@geindex Python 향상 제안; PEP 538
PEP 538@footnote{https://peps.python.org/pep-0538/} 의 로케일 강제 변환이 (비 파이썬 응용 프로그램과 이전 버전의 파이썬을 실행하는 경우를 포함하는) 자식 프로세스뿐만 아니라 (GNU @code{readline} 같은) 확장 모듈에도 영향을 주는 장점이 있지만, 실행 중인 시스템에 적절한 대상 로케일이 있어야 한다는 단점이 있습니다. 적절한 대상 로케일을 사용할 수 없는 경우(예를 들어, RHEL/CentOS 7에서 발생하듯이)를 더 잘 처리하기 위해, 파이썬 3.7은 @ref{cc0,,PEP 540; 강제 UTF-8 실행시간 모드} 또한 구현합니다.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 538

@item PEP 538@footnote{https://peps.python.org/pep-0538/} – 레거시 C 로케일을 UTF-8 기반 로케일로 강제 변경

Nick Coghlan 이 작성하고 구현한 PEP.
@end table


@node PEP 540 강제 UTF-8 실행시간 모드,PEP 553 내장 breakpoint,PEP 538 레거시 C 로케일 강제 변경,새로운 기능<4>
@anchor{whatsnew/3 7 pep-540-forced-utf-8-runtime-mode}@anchor{ccd}@anchor{whatsnew/3 7 whatsnew37-pep540}@anchor{cc0}
@subsubsection PEP 540: 강제 UTF-8 실행시간 모드


새로운 @ref{16f,,-X} @code{utf8} 명령행 옵션과 
@geindex PYTHONUTF8
@geindex 환경 변수; PYTHONUTF8
@ref{cce,,PYTHONUTF8} 환경 변수를 사용하여 @ref{865,,파이썬 UTF-8 모드}를 활성화할 수 있습니다.

UTF-8 모드에서, CPython은 로케일 설정을 무시하고 기본적으로 UTF-8 인코딩을 사용합니다. @ref{75e,,sys.stdin} 과 @ref{ccc,,sys.stdout} 스트림의 에러 처리기는 @code{surrogateescape} 로 설정됩니다.

강제 UTF-8 모드는 임베디드 응용 프로그램의 로케일 설정을 변경하지 않고 임베디드 파이썬 인터프리터의 텍스트 처리 동작을 변경하는 데 사용할 수 있습니다.

@geindex Python 향상 제안; PEP 540
PEP 540@footnote{https://peps.python.org/pep-0540/} 의 UTF-8 모드는 실행 중인 시스템에서 사용할 수 있는 로케일에 관계없이 작동하는 이점이 있지만, (GNU @code{readline} 과 같은) 확장 모듈, 비 파이썬 응용 프로그램을 실행하는 자식 프로세스, 이전 버전의 파이썬을 실행하는 자식 프로세스에 영향을 주지 못하는 단점이 있습니다. 이러한 구성 요소와 통신 할 때 텍스트 데이터가 손상될 위험을 줄이기 위해 파이썬 3.7은 @ref{cc0,,PEP 540; 강제 UTF-8 실행시간 모드} 또한 구현합니다.

UTF-8 모드는 로케일이 @code{C} 또는 @code{POSIX} 이고, 
@geindex Python 향상 제안; PEP 538
PEP 538@footnote{https://peps.python.org/pep-0538/} 로케일 강제 변환이 UTF-8 기반 대안으로의 변경에 실패할 때 (그 실패가 @code{PYTHONCOERCECLOCALE=0} 설정 때문이든, @code{LC_ALL} 설정 때문이든, 적절한 대상 로케일이 없기 때문이든 무관하게) 기본적으로 활성화됩니다.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 540

@item PEP 540@footnote{https://peps.python.org/pep-0540/} – 새로운 UTF-8 모드 추가

Victor Stinner가 작성하고 구현한 PEP
@end table


@node PEP 553 내장 breakpoint,PEP 539 스레드-로컬 저장소를 위한 새로운 C API,PEP 540 강제 UTF-8 실행시간 모드,새로운 기능<4>
@anchor{whatsnew/3 7 pep-553-built-in-breakpoint}@anchor{ccf}@anchor{whatsnew/3 7 whatsnew37-pep553}@anchor{cb9}
@subsubsection PEP 553: 내장 @code{breakpoint()}


파이썬 3.7에는 파이썬 디버거에 진입하는 쉽고 일관된 방식을 제공하는 새로운 내장 @ref{271,,breakpoint()} 함수가 포함되어 있습니다.

내장 @code{breakpoint()} 는 @ref{cd0,,sys.breakpointhook()} 을 호출합니다. 기본적으로, 후자는 @ref{aa,,pdb}를 임포트 한 다음 @code{pdb.set_trace()} 를 호출합니다. 하지만, @code{sys.breakpointhook()} 을 여러분이 선택한 함수에 연결하면, @code{breakpoint()} 는 임의의 디버거에 진입할 수 있습니다. 또한, 환경 변수 
@geindex PYTHONBREAKPOINT
@geindex 환경 변수; PYTHONBREAKPOINT
@ref{cd1,,PYTHONBREAKPOINT} 를 여러분이 선택한 디버거의 콜러블로 설정할 수 있습니다. 내장 @code{breakpoint()} 를 완전히 비활성화하려면 @code{PYTHONBREAKPOINT=0} 를 설정하십시오.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 553

@item PEP 553@footnote{https://peps.python.org/pep-0553/} – 내장 breakpoint()

Barry Warsaw가 작성하고 구현한 PEP
@end table


@node PEP 539 스레드-로컬 저장소를 위한 새로운 C API,PEP 562 모듈 어트리뷰트에 대한 액세스 사용자 정의,PEP 553 내장 breakpoint,새로운 기능<4>
@anchor{whatsnew/3 7 pep-539-new-c-api-for-thread-local-storage}@anchor{cd2}@anchor{whatsnew/3 7 whatsnew37-pep539}@anchor{cc4}
@subsubsection PEP 539: 스레드-로컬 저장소를 위한 새로운 C API


파이썬은 스레드 로컬 저장소 지원을 위한 C API를 제공하지만; 기존 @ref{cd3,,스레드 로컬 저장소 (TLS) API} 는 모든 플랫폼에서 TLS 키로 int를 사용합니다. 이것은 공식적으로 지원되는 플랫폼에서는 일반적으로 문제가 되지 않지만, POSIX를 준수하지도 실용적인 의미에서 이식성이 있지도 않습니다.

@geindex Python 향상 제안; PEP 539
PEP 539@footnote{https://peps.python.org/pep-0539/} 는 CPython에 새로운 @ref{cd4,,스레드 특정 저장소 (TSS) API} 를 제공해서 이를 변경하는데, CPython 인터프리터 내에서 기존 TLS API의 사용을 대체하는 동시에 기존 API를 폐지합니다. TSS API는 TSS 키를 나타내는데 int 대신 @ref{cd5,,Py_tss_t}라는 새로운 형을 사용합니다. 이 형은 하부 TLS 구현에 따라 달라질 수 있는 불투명 한 형입니다. 그래서 네이티브 TLS 키가 int로 안전하게 캐스팅될 수 없는 방식으로 정의된 플랫폼에서 CPython을 빌드 할 수 있게 합니다.

네이티브 TLS 키가 int로 안전하게 캐스팅될 수 없는 방식으로 정의된 플랫폼에서는, 기존 TLS API의 모든 함수는 작동하지 않고 즉시 실패를 반환합니다. 이는 이전 API가 신뢰성 있게 사용될 수 없는 플랫폼에서 지원되지 않으며, 이러한 지원을 추가하기 위한 노력이 없을 것을 분명하게 나타냅니다.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 539

@item PEP 539@footnote{https://peps.python.org/pep-0539/} – CPython의 스레드-로컬 저장소를 위한 새로운 C-API

Erik M. Bray가 작성하고 Masayuki Yamamoto가 구현한 PEP.
@end table


@node PEP 562 모듈 어트리뷰트에 대한 액세스 사용자 정의,PEP 564 나노초 해상도의 새로운 시간 함수,PEP 539 스레드-로컬 저장소를 위한 새로운 C API,새로운 기능<4>
@anchor{whatsnew/3 7 pep-562-customization-of-access-to-module-attributes}@anchor{cd6}@anchor{whatsnew/3 7 whatsnew37-pep562}@anchor{cba}
@subsubsection PEP 562: 모듈 어트리뷰트에 대한 액세스 사용자 정의


Python 3.7 allows defining @ref{cd7,,__getattr__()} on modules and will call
it whenever a module attribute is otherwise not found.  Defining
@ref{cd8,,__dir__()} on modules is now also allowed.

이것이 유용한 전형적인 예는 모듈 어트리뷰트 폐지와 지연 로딩입니다.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 562

@item PEP 562@footnote{https://peps.python.org/pep-0562/} – 모듈 @code{__getattr__} 과 @code{__dir__}

Ivan Levkivskyi가 작성하고 구현한 PEP
@end table


@node PEP 564 나노초 해상도의 새로운 시간 함수,PEP 565 __main__ 의 DeprecationWarning 표시,PEP 562 모듈 어트리뷰트에 대한 액세스 사용자 정의,새로운 기능<4>
@anchor{whatsnew/3 7 pep-564-new-time-functions-with-nanosecond-resolution}@anchor{cd9}@anchor{whatsnew/3 7 whatsnew37-pep564}@anchor{cbe}
@subsubsection PEP 564: 나노초 해상도의 새로운 시간 함수


현대 시스템의 시계 해상도는 @ref{55c,,time.time()} 함수와 그 변형이 반환하는 부동 소수점 숫자의 제한된 정밀도를 초과 할 수 있습니다. 
@geindex Python 향상 제안; PEP 564
PEP 564@footnote{https://peps.python.org/pep-0564/} 는 기존 타이머 함수의 새로운 “나노 초” 변형을 @ref{f4,,time} 모듈에 추가합니다:


@itemize *

@item 
@ref{cda,,time.clock_gettime_ns()}

@item 
@ref{cdb,,time.clock_settime_ns()}

@item 
@ref{cdc,,time.monotonic_ns()}

@item 
@ref{cdd,,time.perf_counter_ns()}

@item 
@ref{cde,,time.process_time_ns()}

@item 
@ref{cdf,,time.time_ns()}
@end itemize

새로운 함수는 나노초의 수를 정숫값으로 반환합니다.

@geindex Python 향상 제안; PEP 0564#annex-clocks-resolution-in-python
측정@footnote{https://peps.python.org/pep-0564/#annex-clocks-resolution-in-python}에 의하면 리눅스와 윈도우에서 @ref{cdf,,time.time_ns()} 의 해상도는 @ref{55c,,time.time()} 보다 약 3배 정밀합니다.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 564

@item PEP 564@footnote{https://peps.python.org/pep-0564/} – 나노초 해상도의 새로운 시간 함수 추가

Victor Stinner가 작성하고 구현한 PEP
@end table


@node PEP 565 __main__ 의 DeprecationWarning 표시,PEP 560 typing 모듈과 제네릭 형에 대한 코어 지원,PEP 564 나노초 해상도의 새로운 시간 함수,새로운 기능<4>
@anchor{whatsnew/3 7 pep-565-show-deprecationwarning-in-main}@anchor{ce0}@anchor{whatsnew/3 7 whatsnew37-pep565}@anchor{cc3}
@subsubsection PEP 565: @code{__main__} 의 DeprecationWarning 표시


@ref{1a3,,DeprecationWarning} 의 기본 처리 방식이 변경되어, 이러한 경고가 다시 한번 기본적으로 표시됩니다. 하지만, 이를 발생시킨 코드가 @ref{1,,__main__} 모듈에서 직접 실행될 때만 표시됩니다. 결과적으로, 단일 파일 스크립트 개발자와 파이썬을 대화식으로 사용하는 개발자는 사용하는 API에 대한 폐지 경고를 다시 보게 되지만, 임포트되는 응용 프로그램, 라이브러리, 프레임웍 모듈에서 발생하는 폐지 경고는 계속 기본적으로 숨겨집니다.

이 변경으로 인해, 이제 표준 라이브러리는 개발자가 세 가지 다른 폐지 경고 동작 중 하나를 선택할 수 있도록 합니다:


@itemize *

@item 
@ref{657,,FutureWarning}: 기본적으로 항상 표시됩니다. 응용 프로그램 최종 사용자를 대상으로 하는 경고로 권장됩니다 (예, 폐지된 응용 프로그램 구성 설정).

@item 
@ref{1a3,,DeprecationWarning}: 기본적으로 @ref{1,,__main__} 과 테스트 실행 시에 표시됩니다. 버전 업그레이드가 동작 변경이나 에러를 일으킬 수 있어서, 다른 파이썬 개발자를 대상으로 하는 경고로 권장됩니다.

@item 
@ref{ac6,,PendingDeprecationWarning}: 기본적으로 테스트 실행 시에만 표시됩니다. 향후 버전 업그레이드가 경고 범주를 @ref{1a3,,DeprecationWarning} 이나 @ref{657,,FutureWarning}으로 변경하게 될 경우를 위한 것입니다.
@end itemize

이전에는 @ref{1a3,,DeprecationWarning} 과 @ref{ac6,,PendingDeprecationWarning} 둘 다 테스트를 실행할 때만 볼 수 있었습니다. 주로 단일 파일 스크립트를 작성하거나 대화식으로 파이썬을 사용하는 개발자는 사용된 API가 호환되지 않는 방식으로 변경된 것을 보고 놀랄 수 있었습니다.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 565

@item PEP 565@footnote{https://peps.python.org/pep-0565/} – @code{__main__} 의 DeprecationWarning 표시

Nick Coghlan이 작성하고 구현한 PEP
@end table


@node PEP 560 typing 모듈과 제네릭 형에 대한 코어 지원,PEP 552 해시 기반 pyc 파일,PEP 565 __main__ 의 DeprecationWarning 표시,새로운 기능<4>
@anchor{whatsnew/3 7 pep-560-core-support-for-typing-module-and-generic-types}@anchor{ce1}@anchor{whatsnew/3 7 whatsnew37-pep560}@anchor{cbb}
@subsubsection PEP 560: @code{typing} 모듈과 제네릭 형에 대한 코어 지원


Initially 
@geindex Python 향상 제안; PEP 484
PEP 484@footnote{https://peps.python.org/pep-0484/} was designed in such way that it would not introduce `any'
changes to the core CPython interpreter. Now type hints and the @ref{10a,,typing}
module are extensively used by the community, so this restriction is removed.
The PEP introduces two special methods @ref{942,,__class_getitem__()} and
@ref{ce2,,__mro_entries__()}, these methods are now used by most classes and special
constructs in @code{typing}. As a result, the speed of various operations
with types increased up to 7 times, the generic types can be used without
metaclass conflicts, and several long standing bugs in @code{typing} module are
fixed.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 560

@item PEP 560@footnote{https://peps.python.org/pep-0560/} – typing 모듈과 제네릭 형에 대한 코어 지원

Ivan Levkivskyi가 작성하고 구현한 PEP
@end table


@node PEP 552 해시 기반 pyc 파일,PEP 545 파이썬 설명서 번역,PEP 560 typing 모듈과 제네릭 형에 대한 코어 지원,새로운 기능<4>
@anchor{whatsnew/3 7 pep-552-hash-based-pyc-files}@anchor{ce3}@anchor{whatsnew/3 7 whatsnew37-pep552}@anchor{cc1}
@subsubsection PEP 552: 해시 기반 .pyc 파일


파이썬은 전통적으로 바이트 코드 캐시 파일(즉, @code{.pyc} 파일)의 최신성을 검사하기 위해, 소스 메타 데이터(최종 수정 타임스탬프와 크기)를 캐시 파일이 만들어질 때 헤더에 저장된 소스 메타 데이터와 비교했습니다. 효과적이지만, 이 무효화 방법에는 단점이 있습니다. 파일 시스템 타임스탬프가 너무 거친 경우, 파이썬은 소스 변경을 놓칠 수 있어 사용자 혼란을 낳을 수 있습니다. 또한, 캐시 파일에 타임스탬프를 갖는 것은 빌드 재현성@footnote{https://reproducible-builds.org/} 과 콘텐츠 기반 빌드 시스템에서 문제가 됩니다.

@geindex Python 향상 제안; PEP 552
PEP 552@footnote{https://peps.python.org/pep-0552/} 는 소스 타임스탬프 대신 소스 파일의 해시가 소스 타임스탬프 대신 무효화에 사용될 수 있도록 pyc 형식을 확장합니다. 이러한 @code{.pyc} 파일을 “해시 기반”이라고 합니다. 기본적으로, 파이썬은 여전히 타임스탬프 기반 무효화를 사용하며 실행 시간에 해시 기반 @code{.pyc} 파일을 생성하지 않습니다. 해시 기반 @code{.pyc} 파일은 @ref{b8,,py_compile} 또는 @ref{21,,compileall}로 만들 수 있습니다.

해시 기반 @code{.pyc} 파일에는 두 가지 변형이 있습니다: 검사형(checked)과 비검사형(unchecked). 파이썬은 검사형 해시 기반 @code{.pyc} 파일을 실행시간에 해당 소스 파일에 대해 유효성을 검사하지만, 비검사형 해시 기반 pyc에 대해서는 확인하지 않습니다. 비검사형 해시 기반 @code{.pyc} 파일은 파이썬 외부의 시스템(가령 빌드 시스템)이 @code{.pyc} 파일을 최신 상태로 유지하는 책임을 지는 환경에서 유용한 성능 최적화입니다.

자세한 정보는 @ref{801,,캐시된 바이트 코드 무효화} 를 보십시오.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 552

@item PEP 552@footnote{https://peps.python.org/pep-0552/} – 결정적 pycs

Benjamin Peterson이 작성하고 구현한 PEP
@end table


@node PEP 545 파이썬 설명서 번역,파이썬 개발 모드 -X dev,PEP 552 해시 기반 pyc 파일,새로운 기능<4>
@anchor{whatsnew/3 7 pep-545-python-documentation-translations}@anchor{ce4}@anchor{whatsnew/3 7 whatsnew37-pep545}@anchor{cc5}
@subsubsection PEP 545: 파이썬 설명서 번역


@geindex Python 향상 제안; PEP 545
PEP 545@footnote{https://peps.python.org/pep-0545/} 는 파이썬 설명서 번역을 만들고 유지하는 과정을 설명합니다.

세 가지 새로운 번역이 추가되었습니다:


@itemize -

@item 
일본어: @indicateurl{https://docs.python.org/ja/}

@item 
프랑스어: @indicateurl{https://docs.python.org/fr/}

@item 
한국어: @indicateurl{https://docs.python.org/ko/}
@end itemize


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 545

@item PEP 545@footnote{https://peps.python.org/pep-0545/} – 파이썬 설명서 번역

Julien Palard, Inada Naoki 및 Victor Stinner가 작성하고 구현한 PEP.
@end table


@node 파이썬 개발 모드 -X dev,,PEP 545 파이썬 설명서 번역,새로운 기능<4>
@anchor{whatsnew/3 7 python-development-mode-x-dev}@anchor{ce5}@anchor{whatsnew/3 7 whatsnew37-devmode}@anchor{cc2}
@subsubsection 파이썬 개발 모드 (-X dev)


새 @ref{16f,,-X} @code{dev} 명령행 옵션이나 새 
@geindex PYTHONDEVMODE
@geindex 환경 변수; PYTHONDEVMODE
@ref{ce6,,PYTHONDEVMODE} 환경 변수를 사용하여 @ref{507,,파이썬 개발 모드}를 활성화할 수 있습니다. 개발 모드에 있을 때, 파이썬은 기본적으로 활성화되기에는 너무 비싼 추가적인 실행 시간 검사를 수행합니다. 자세한 설명은 @ref{507,,파이썬 개발 모드} 설명서를 참조하십시오.

@node 기타 언어 변경<4>,새 모듈<3>,새로운 기능<4>,파이썬 3 7의 새로운 기능
@anchor{whatsnew/3 7 other-language-changes}@anchor{ce7}
@subsection 기타 언어 변경



@itemize *

@item 
@ref{18d,,await} 표현식과 @ref{c9f,,async for} 절을 포함하는 컴프리헨션은 구현 문제로 인해 @ref{19a,,포맷 문자열 리터럴}의 표현식에서 유효하지 않았습니다. 파이썬 3.7에서는 이 제한이 해제되었습니다.

@item 
이제 함수에 255개 이상의 인자를 전달할 수 있고, 함수는 255개 이상의 매개변수를 가질 수 있습니다. (Contributed by Serhiy Storchaka in bpo-12844@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12844} and bpo-18896@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18896}.)

@item 
이제 @ref{190,,bytes.fromhex()} 와 @ref{191,,bytearray.fromhex()} 는 스페이스뿐만 아니라 모든 ASCII 공백을 무시합니다. (Contributed by Robert Xiao in bpo-28927@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28927}.)

@item 
@ref{169,,str}, @ref{192,,bytes}, @ref{344,,bytearray} 는 새 @ref{ce8,,isascii()} 메서드에 대한 지원을 얻었습니다. 이 메서드를 사용하여 문자열이나 바이트열에 오직 ASCII 문자만 들어 있는지 검사할 수 있습니다. (Contributed by INADA Naoki in bpo-32677@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32677}.)

@item 
이제 @ref{659,,ImportError} 는 @code{from ... import ...} 가 실패할 때 모듈 이름과 모듈 @code{__file__} 경로를 출력합니다. (Contributed by Matthias Bussonnier in bpo-29546@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29546}.)

@item 
이제 하위 모듈을 이름에 연결하는 절대 임포트가 수반되는 순환 임포트가 지원됩니다. (Contributed by Serhiy Storchaka in bpo-30024@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30024}.)

@item 
이제 @code{object.__format__(x, '@w{'})} 는 @code{format(str(self), '@w{'})} 대신에 @code{str(x)} 과 동등합니다. (Contributed by Serhiy Storchaka in bpo-28974@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28974}.)

@item 
이제 스택 트레이스의 동적 생성을 더욱 잘 지원하기 위해, 파이썬 코드에서 @ref{ce9,,types.TracebackType} 의 인스턴스를 만들 수 있고, @ref{cea,,트레이스백} 의 @ref{ceb,,tb_next} 어트리뷰트에 쓸 수 있습니다. (Contributed by Nathaniel J. Smith in bpo-30579@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30579}.)

@item 
@ref{23c,,-m} 스위치를 사용할 때, 이제 @code{sys.path[0]} 를 빈 디렉터리로 남겨두기보다는 전체 시작 디렉터리 경로로 확장됩니다 (빈 디렉터리를 남겨두면, 임포트가 일어날 때의 `현재' 작업 디렉터리로부터의 임포트가 가능해집니다) (Contributed by Nick Coghlan in bpo-33053@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33053}.)

@item 
새 @ref{16f,,-X} @code{importtime} 옵션 또는 
@geindex PYTHONPROFILEIMPORTTIME
@geindex 환경 변수; PYTHONPROFILEIMPORTTIME
@ref{cec,,PYTHONPROFILEIMPORTTIME} 환경 변수는 각 모듈 임포트의 타이밍을 보여주기 위해 사용될 수 있습니다. (Contributed by Inada Naoki in bpo-31415@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31415}.)
@end itemize

@node 새 모듈<3>,개선된 모듈<3>,기타 언어 변경<4>,파이썬 3 7의 새로운 기능
@anchor{whatsnew/3 7 new-modules}@anchor{ced}
@subsection 새 모듈


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

@end menu

@node contextvars<2>,dataclasses<3>,,새 모듈<3>
@anchor{whatsnew/3 7 contextvars}@anchor{cee}@anchor{whatsnew/3 7 whatsnew37-pep567}@anchor{cb6}
@subsubsection contextvars


새 @ref{28,,contextvars} 모듈과 @ref{cef,,새 C API} 집합은 `컨텍스트 변수' 에 대한 지원을 도입합니다. 컨텍스트 변수는 개념적으로 스레드-로컬 변수와 유사합니다. TLS와 달리, 컨텍스트 변수는 비동기 코드를 올바르게 지원합니다.

@ref{b,,asyncio}와 @ref{3a,,decimal} 모듈은 바로 사용할 수 있도록 컨텍스트 변수를 사용하고 지원하도록 업데이트되었습니다. 특히 활성 십진 컨텍스트는 이제 컨텍스트 변수에 저장되므로, 십진수 연산이 비동기 코드에서 올바른 컨텍스트에서 작동 할 수 있습니다.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 567

@item PEP 567@footnote{https://peps.python.org/pep-0567/} – 컨텍스트 변수

Yury Selivanov가 작성하고 구현한 PEP
@end table


@node dataclasses<3>,importlib resources<2>,contextvars<2>,새 모듈<3>
@anchor{whatsnew/3 7 dataclasses}@anchor{cf0}@anchor{whatsnew/3 7 whatsnew37-pep557}@anchor{cb7}
@subsubsection dataclasses


새 @ref{4e1,,dataclass()} 데코레이터는 `데이터 클래스' 를 선언하는 방법을 제공합니다. 데이터 클래스는 클래스 변수 어노테이션을 사용하여 어트리뷰트를 기술합니다. 생성자와 @ref{82e,,__repr__()}, @ref{cf1,,__eq__()}, @ref{cf2,,__hash__()} 와 같은 다른 매직 메서드가 자동으로 생성됩니다.

예:

@example
@@dataclass
class Point:
    x: float
    y: float
    z: float = 0.0

p = Point(1.5, 2.5)
print(p)   # produces "Point(x=1.5, y=2.5, z=0.0)"
@end example


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 557

@item PEP 557@footnote{https://peps.python.org/pep-0557/} – 데이터 클래스

Eric V. Smith가 작성하고 구현한 PEP
@end table


@node importlib resources<2>,,dataclasses<3>,새 모듈<3>
@anchor{whatsnew/3 7 importlib-resources}@anchor{cf3}@anchor{whatsnew/3 7 whatsnew37-importlib-resources}@anchor{cb8}
@subsubsection importlib.resources


The new @ref{7f,,importlib.resources} module provides several new APIs and one
new ABC for access to, opening, and reading `resources' inside packages.
Resources are roughly similar to files inside packages, but they needn’t
be actual files on the physical file system.  Module loaders can provide a
@code{get_resource_reader()} function which returns
a @code{importlib.abc.ResourceReader} instance to support this
new API.  Built-in file path loaders and zip file loaders both support this.

Contributed by Barry Warsaw and Brett Cannon in bpo-32248@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32248}.


@subsubheading 더 보기


importlib_resources@footnote{https://importlib-resources.readthedocs.io/en/latest/} – 이전 파이썬 버전을 위한 PyPI 역 이식.


@node 개선된 모듈<3>,C API 변경<2>,새 모듈<3>,파이썬 3 7의 새로운 기능
@anchor{whatsnew/3 7 improved-modules}@anchor{cf4}
@subsection 개선된 모듈


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

@end menu

@node argparse<5>,asyncio<10>,,개선된 모듈<3>
@anchor{whatsnew/3 7 argparse}@anchor{cf5}
@subsubsection argparse


새로운 @ref{cf6,,ArgumentParser.parse_intermixed_args()} 메서드는 옵션과 위치 인자의 혼합을 허용합니다. (Contributed by paul.j3 in bpo-14191@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14191}.)

@node asyncio<10>,binascii,argparse<5>,개선된 모듈<3>
@anchor{whatsnew/3 7 asyncio}@anchor{cf7}@anchor{whatsnew/3 7 whatsnew37-asyncio}@anchor{cbd}
@subsubsection asyncio


@ref{b,,asyncio} 모듈은 많은 새로운 기능과 사용성 및 @ref{cf8,,성능 개선}이 추가되었습니다. 주목할만한 변경 사항은 다음과 같습니다:


@itemize *

@item 
새로운 @ref{3d1,,잠정} @ref{2f3,,asyncio.run()} 함수는 자동으로 이벤트 루프를 생성하고 파괴함으로써 동기 코드에서 코루틴을 실행하는 데 사용될 수 있습니다. (Contributed by Yury Selivanov in bpo-32314@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32314}.)

@item 
asyncio는 @ref{28,,contextvars} 에 대한 지원을 얻었습니다. @ref{cf9,,loop.call_soon()}, @ref{cfa,,loop.call_soon_threadsafe()}, @ref{cfb,,loop.call_later()}, @ref{cfc,,loop.call_at()} 및 @ref{cfd,,Future.add_done_callback()} 은 새로운 선택적 키워드-전용 `context' 매개 변수를 갖습니다. @ref{1c7,,Tasks} 는 이제 자신의 컨텍스트를 자동으로 추적합니다. 자세한 정보는 
@geindex Python 향상 제안; PEP 567
PEP 567@footnote{https://peps.python.org/pep-0567/}을 보십시오. (Contributed by Yury Selivanov in bpo-32436@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32436}.)

@item 
새로운 @ref{1c9,,asyncio.create_task()} 함수가 @code{asyncio.get_event_loop().create_task()} 의 손쉬운 방법으로 추가되었습니다. (Contributed by Andrew Svetlov in bpo-32311@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32311}.)

@item 
새로운 @ref{cfe,,loop.start_tls()} 메서드를 사용하여 기존 연결을 TLS로 업그레이드할 수 있습니다. (Contributed by Yury Selivanov in bpo-23749@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23749}.)

@item 
새로운 @ref{cff,,loop.sock_recv_into()} 메서드는 데이터를 직접 소켓에서 제공된 버퍼로 읽어 들여 데이터 복사를 줄일 수 있게 합니다. (Contributed by Antoine Pitrou in bpo-31819@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31819}.)

@item 
새로운 @ref{6a4,,asyncio.current_task()} 함수는 현재 실행 중인 @ref{1c7,,Task} 인스턴스를 반환하고, 새 @ref{b4f,,asyncio.all_tasks()} 함수는 주어진 루프에 있는 모든 기존 @code{Task} 인스턴스 집합을 반환합니다. @code{Task.current_task()} 와 @code{Task.all_tasks()} 메서드는 폐지되었습니다. (Contributed by Andrew Svetlov in bpo-32250@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32250}.)

@item 
새로운 `잠정적' @ref{c93,,BufferedProtocol} 클래스는 수신 버퍼를 수동으로 제어하여 스트리밍 프로토콜을 구현할 수 있게 합니다. (Contributed by Yury Selivanov in bpo-32251@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32251}.)

@item 
새로운 @ref{d00,,asyncio.get_running_loop()} 함수는 현재 실행 중인 루프를 반환하고, 루프가 실행되고 있지 않으면 @ref{244,,RuntimeError} 를 발생시킵니다. 이는 아무것도 실행되고 있지 않으면 새로 `만드는' @ref{2f2,,asyncio.get_event_loop()} 과는 대조적입니다. (Contributed by Yury Selivanov in bpo-32269@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32269}.)

@item 
새로운 @ref{d01,,StreamWriter.wait_closed()} 코루틴 메서드는 스트림 작성자가 닫힐 때까지 기다릴 수 있습니다. 새로운 @ref{d02,,StreamWriter.is_closing()} 메서드를 사용하여 작성기가 닫히고 있는지 판별 할 수 있습니다. (Contributed by Andrew Svetlov in bpo-32391@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32391}.)

@item 
새로운 @ref{d03,,loop.sock_sendfile()} 코루틴 메서드는 가능한 경우 @ref{d04,,os.sendfile} 을 사용하여 파일을 전송할 수 있도록 합니다. (Contributed by Andrew Svetlov in bpo-32410@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32410}.)

@item 
새로운 @ref{d05,,Future.get_loop()} 와 @code{Task.get_loop()} 메서드는 태스크 나 퓨처가 만들어진 루프의 인스턴스를 돌려줍니다. @ref{d06,,Server.get_loop()} 는 @ref{d07,,asyncio.Server} 객체에 대해서도 같은 일을 할 수 있도록 합니다. (Contributed by Yury Selivanov in bpo-32415@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32415} and Srinivas Reddy Thatiparthy in bpo-32418@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32418}.)

@item 
이제 @ref{d07,,asyncio.Server} 의 인스턴스가 어떻게 시작되는지 제어할 수 있습니다. 이전에는 서버를 만들 때 즉시 서버가 시작되었습니다. 새로운 `start_serving' 키워드 인자는 @ref{d08,,loop.create_server()} 와 @ref{4cb,,loop.create_unix_server()} 뿐만 아니라 @ref{d09,,Server.start_serving()} 와 @ref{d0a,,Server.serve_forever()} 에도 사용되어 서버 인스턴스를 만드는 것과 시작시키는 것을 분리할 수 있습니다. 새로운 @ref{d0b,,Server.is_serving()} 메서드는 서버가 실행 중이면 @code{True} 를 돌려줍니다. @code{Server} 객체는 이제 비동기 컨텍스트 관리자입니다:

@example
srv = await loop.create_server(...)

async with srv:
    # some code

# At this point, srv is closed and no longer accepts new connections.
@end example

(Contributed by Yury Selivanov in bpo-32662@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32662}.)

@item 
@ref{cfb,,loop.call_later()} 가 반환하는 콜백 객체는 예약된 절대 콜백 타임스탬프를 돌려주는 새 @ref{d0c,,when()} 메서드를 얻었습니다. (Contributed by Andrew Svetlov in bpo-32741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32741}.)

@item 
@ref{93b,,loop.create_datagram_endpoint()} 메서드는 유닉스 소켓 지원을 얻었습니다. (Contributed by Quentin Dawans in bpo-31245@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31245}.)

@item 
@ref{d0d,,asyncio.open_connection()}, @ref{d0e,,asyncio.start_server()} 함수, @ref{817,,loop.create_connection()}, @ref{d08,,loop.create_server()}, @ref{9de,,loop.create_accepted_socket()} 메서드와 해당 유닉스 소켓 변형은 이제 `ssl_handshake_timeout' 키워드 인자를 받아들입니다. (Contributed by Neil Aspinall in bpo-29970@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29970}.)

@item 
새로운 @ref{d0f,,Handle.cancelled()} 메서드는 콜백이 취소된 경우 @code{True} 를 돌려줍니다. (Contributed by Marat Sharafutdinov in bpo-31943@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31943}.)

@item 
asyncio 소스는 @ref{93a,,async}/@ref{18d,,await} 구문을 사용하도록 변환되었습니다. (Contributed by Andrew Svetlov in bpo-32193@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32193}.)

@item 
새로운 @ref{d10,,ReadTransport.is_reading()} 메서드를 사용하여 전송계층의 읽기 상태를 판별 할 수 있습니다. 또한 @ref{d11,,ReadTransport.resume_reading()} 과 @ref{d12,,ReadTransport.pause_reading()} 은 이제 멱등적(idempotent)입니다. (Contributed by Yury Selivanov in bpo-32356@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32356}.)

@item 
소켓 경로를 받아들이는 루프 메서드에는 이제 @ref{5a0,,경로류 객체} 를 전달할 수 있습니다. (Contributed by Yury Selivanov in bpo-32066@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32066}.)

@item 
@ref{b,,asyncio} 에서 리눅스의 TCP 소켓은 이제 기본적으로 @code{TCP_NODELAY} 플래그가 설정된 상태로 만들어집니다. (Contributed by Yury Selivanov and Victor Stinner in bpo-27456@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27456}.)

@item 
취소된 작업에서 발생하는 예외는 더 로깅 되지 않습니다. (Contributed by Yury Selivanov in bpo-30508@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30508}.)

@item 
새로운 @code{WindowsSelectorEventLoopPolicy} 와 @code{WindowsProactorEventLoopPolicy} 클래스. (Contributed by Yury Selivanov in bpo-33792@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33792}.)
@end itemize

몇몇 @code{asyncio} API는 @ref{d13,,폐지되었습니다}.

@node binascii,calendar<3>,asyncio<10>,개선된 모듈<3>
@anchor{whatsnew/3 7 binascii}@anchor{d14}
@subsubsection binascii


@ref{d15,,b2a_uu()} 함수는 선택적 `backtick' 키워드 인자를 받아들입니다. 참일 때, 0은 스페이스 대신에 @code{'`'} 로 표현됩니다. (Contributed by Xiang Zhang in bpo-30103@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30103}.)

@node calendar<3>,collections<2>,binascii,개선된 모듈<3>
@anchor{whatsnew/3 7 calendar}@anchor{d16}
@subsubsection calendar


@ref{d17,,HTMLCalendar} 클래스는 생성된 HTML 달력에서 CSS 클래스의 개별화를 쉽게 해주는 새로운 클래스 어트리뷰트를 갖습니다. (Contributed by Oz Tiram in bpo-30095@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30095}.)

@node collections<2>,compileall<3>,calendar<3>,개선된 모듈<3>
@anchor{whatsnew/3 7 collections}@anchor{d18}
@subsubsection collections


@code{collections.namedtuple()} 은 이제 기본값을 지원합니다. (Contributed by Raymond Hettinger in bpo-32320@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32320}.)

@node compileall<3>,concurrent futures<4>,collections<2>,개선된 모듈<3>
@anchor{whatsnew/3 7 compileall}@anchor{d19}
@subsubsection compileall


@ref{d1a,,compileall.compile_dir()} 는 새로운 `invalidation_mode' 매개 변수를 갖습니다. 이 매개 변수는 @ref{cc1,,해시 기반 .pyc 무효화} 를 활성화하는데 사용할 수 있습니다. 무효화 모드는 새로운 @code{--invalidation-mode} 인자를 사용하여 명령행에서 지정할 수도 있습니다. (Contributed by Benjamin Peterson in bpo-31650@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31650}.)

@node concurrent futures<4>,contextlib<3>,compileall<3>,개선된 모듈<3>
@anchor{whatsnew/3 7 concurrent-futures}@anchor{d1b}
@subsubsection concurrent.futures


@ref{1d6,,ProcessPoolExecutor} 와 @ref{948,,ThreadPoolExecutor} 는 이제 새로운 `initializer' 및 `initargs' 생성자 인자를 지원합니다. (Contributed by Antoine Pitrou in bpo-21423@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21423}.)

@ref{1d6,,ProcessPoolExecutor} 는 새로운 `mp_context' 인자를 통해 multiprocessing 컨텍스트를 받아들일 수 있습니다. (Contributed by Thomas Moreau in bpo-31540@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31540}.)

@node contextlib<3>,cProfile<2>,concurrent futures<4>,개선된 모듈<3>
@anchor{whatsnew/3 7 contextlib}@anchor{d1c}
@subsubsection contextlib


새로운 @ref{9ef,,nullcontext()} 는 @ref{d1d,,ExitStack} 보다 더 간단하고 빠른 no-op 컨텍스트 관리자입니다. (Contributed by Jesse-Bakker in bpo-10049@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10049}.)

새로운 @ref{d1e,,asynccontextmanager()}, @ref{d1f,,AbstractAsyncContextManager}, @ref{d20,,AsyncExitStack} 가 추가되어 동기 대응물을 보완합니다. (Contributed by Jelle Zijlstra in bpo-29679@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29679} and bpo-30241@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30241}, and by Alexander Mohr and Ilya Kulakov in bpo-29302@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29302}.)

@node cProfile<2>,crypt,contextlib<3>,개선된 모듈<3>
@anchor{whatsnew/3 7 cprofile}@anchor{d21}
@subsubsection cProfile


@ref{2b,,cProfile} 명령행은 이제 스크립트 경로의 대안으로 @code{-m module_name} 을 허용합니다. (Contributed by Sanyam Khurana in bpo-21862@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21862}.)

@node crypt,datetime<5>,cProfile<2>,개선된 모듈<3>
@anchor{whatsnew/3 7 crypt}@anchor{d22}
@subsubsection crypt


@code{crypt} 모듈은 이제 블로피시 해싱 방법을 지원합니다. (Contributed by Serhiy Storchaka in bpo-31664@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31664}.)

@code{mksalt()} 함수는 이제 해싱을 위한 라운드 수를 지정할 수 있습니다. (Contributed by Serhiy Storchaka in bpo-31702@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31702}.)

@node datetime<5>,dbm<2>,crypt,개선된 모듈<3>
@anchor{whatsnew/3 7 datetime}@anchor{d23}
@subsubsection datetime


새로운 @ref{829,,datetime.fromisoformat()} 메서드는 @ref{d24,,datetime.isoformat()} 이 출력하는 형식의 문자열로부터 @ref{4e2,,datetime} 객체를 생성합니다. (Contributed by Paul Ganssle in bpo-15873@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15873}.)

@ref{7f5,,tzinfo} 클래스는 이제 분보다 작은 오프셋을 지원합니다. (Contributed by Alexander Belopolsky in bpo-5288@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5288}.)

@node dbm<2>,decimal<2>,datetime<5>,개선된 모듈<3>
@anchor{whatsnew/3 7 dbm}@anchor{d25}
@subsubsection dbm


@ref{36,,dbm.dumb} 는 이제 읽기 전용 파일 읽기를 지원하며 변경되지 않았을 때 더는 색인 파일을 쓰지 않습니다.

@node decimal<2>,dis<4>,dbm<2>,개선된 모듈<3>
@anchor{whatsnew/3 7 decimal}@anchor{d26}
@subsubsection decimal


@ref{3a,,decimal} 모듈은 이제 십진 컨텍스트를 저장하는데 @ref{cb6,,컨텍스트 변수} 를 사용한다. (Contributed by Yury Selivanov in bpo-32630@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32630}.)

@node dis<4>,distutils<4>,decimal<2>,개선된 모듈<3>
@anchor{whatsnew/3 7 dis}@anchor{d27}
@subsubsection dis


@ref{205,,dis()} 함수는 이제 중첩된 코드 객체 (컴프리헨션, 제너레이터 표현식 및 중첩된 함수의 코드와 중첩된 클래스를 만드는데 사용되는 코드)를 역 어셈블 할 수 있습니다. 해체 재귀의 최대 깊이는 새로운 * depth * 매개 변수에 의해 제어됩니다. (Contributed by Serhiy Storchaka in bpo-11822@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11822}.)

@node distutils<4>,enum<5>,dis<4>,개선된 모듈<3>
@anchor{whatsnew/3 7 distutils}@anchor{d28}
@subsubsection distutils


@code{README.rst} 는 이제 distutils 표준 README 목록에 포함됩니다. 그래서 소스 배포판에 포함됩니다. (Contributed by Ryan Gonzalez in bpo-11913@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11913}.)

@node enum<5>,functools<4>,distutils<4>,개선된 모듈<3>
@anchor{whatsnew/3 7 enum}@anchor{d29}
@subsubsection enum


@ref{841,,Enum} 은 새로운 @code{_ignore_} 클래스 프로퍼티를 얻었는데, 열거형 멤버가 되어서는 안 되는 프로퍼티의 이름들을 나열할 수 있도록 합니다. (Contributed by Ethan Furman in bpo-31801@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31801}.)

In Python 3.8, attempting to check for non-Enum objects in @ref{841,,Enum}
classes will raise a @ref{198,,TypeError} (e.g. @code{1 in Color}); similarly,
attempting to check for non-Flag objects in a @ref{834,,Flag} member will
raise @code{TypeError} (e.g. @code{1 in Perm.RW}); currently, both operations
return @ref{d2a,,False} instead and are deprecated.
(Contributed by Ethan Furman in bpo-33217@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33217}.)

@node functools<4>,gc<5>,enum<5>,개선된 모듈<3>
@anchor{whatsnew/3 7 functools}@anchor{d2b}
@subsubsection functools


@ref{84a,,functools.singledispatch()} 는 이제 형 어노테이션을 사용해서 구현을 등록할 수 있습니다. (Contributed by Łukasz Langa in bpo-32227@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32227}.)

@node gc<5>,hmac<3>,functools<4>,개선된 모듈<3>
@anchor{whatsnew/3 7 gc}@anchor{d2c}
@subsubsection gc


새로운 @ref{d2d,,gc.freeze()} 함수는 가비지 수집기가 추적 한 모든 객체를 고정하고 미래의 수집에서 그것들을 제외합니다. POSIX @code{fork()} 호출 전에 사용하면 GC를 쓰기 전에 복사(copy-on-write) 친화적으로 만들고 수집 속도를 높일 수 있습니다. 새로운 @ref{d2e,,gc.unfreeze()} 함수는 이 작업을 되돌립니다. 또한, @ref{d2f,,gc.get_freeze_count()}를 사용하여 고정된 객체의 수를 얻을 수 있습니다. (Contributed by Li Zekun in bpo-31558@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31558}.)

@node hmac<3>,http client,gc<5>,개선된 모듈<3>
@anchor{whatsnew/3 7 hmac}@anchor{d30}
@subsubsection hmac


@ref{6e,,hmac} 모듈은 이제 최적화된 단일 호출 @ref{d31,,digest()} 함수를 제공합니다. @ref{d32,,HMAC()} 보다 최대 3배 빠릅니다. (Contributed by Christian Heimes in bpo-32433@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32433}.)

@node http client,http server,hmac<3>,개선된 모듈<3>
@anchor{whatsnew/3 7 http-client}@anchor{d33}
@subsubsection http.client


@ref{d34,,HTTPConnection} 과 @ref{d35,,HTTPSConnection} 은 이제 향상된 업로드 처리량을 위해 새로운 `blocksize' 인자를 지원합니다. (Contributed by Nir Soffer in bpo-31945@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31945}.)

@node http server,idlelib 및 IDLE,http client,개선된 모듈<3>
@anchor{whatsnew/3 7 http-server}@anchor{d36}
@subsubsection http.server


@ref{d37,,SimpleHTTPRequestHandler} 는 이제 HTTP @code{If-Modified-Since} 헤더를 지원합니다. 헤더에 지정된 시간 이후에 대상 파일이 수정되지 않았으면 서버는 304 응답 상태를 돌려줍니다. (Contributed by Pierre Quentel in bpo-29654@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29654}.)

@ref{d37,,SimpleHTTPRequestHandler} 는 새로운 @code{--directory} 명령행 인자와 더불어 새로운 `directory' 인자를 받아들입니다. 이 매개 변수를 사용하면 서버는 지정된 디렉터리를 제공하는데, 기본적으로는 현재 작업 디렉터리를 사용합니다. (Contributed by Stéphane Wirtel and Julien Palard in bpo-28707@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28707}.)

The new @ref{d38,,ThreadingHTTPServer} class
uses threads to handle requests using @ref{d39,,ThreadingMixIn}.
It is used when @code{http.server} is run with @code{-m}.
(Contributed by Julien Palard in bpo-31639@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31639}.)

@node idlelib 및 IDLE,importlib<4>,http server,개선된 모듈<3>
@anchor{whatsnew/3 7 idlelib-and-idle}@anchor{d3a}
@subsubsection idlelib 및 IDLE


자동 완성을 위한 여러 수정. (Contributed by Louie Lu in bpo-15786@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15786}.)

Module Browser (File 메뉴에 있는데, 예전에는 Class Browser라고 불렸습니다)는 이제 최상위 함수와 클래스 외에도 중첩된 함수와 클래스도 표시합니다. (Contributed by Guilherme Polo, Cheryl Sabella, and Terry Jan Reedy in bpo-1612262@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1612262}.)

설정 대화 상자(Options, Configure IDLE)는 모양과 기능을 향상하기 위해 부분적으로 다시 작성되었습니다. (Contributed by Cheryl Sabella and Terry Jan Reedy in multiple issues.)

이제 글꼴 표본에 라틴 문자 이외의 문자가 포함되어 사용자가 특정 글꼴을 선택했을 때의 효과를 더 잘 볼 수 있습니다. (Contributed by Terry Jan Reedy in bpo-13802@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13802}.) 표본을 편집하여 다른 문자를 포함할 수 있습니다. (Contributed by Serhiy Storchaka in bpo-31860@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31860}.)

이전에는 확장 기능으로 구현된 IDLE 기능이 일반 기능으로 다시 구현되었습니다. 이것들의 설정을 Extensions 탭에서 다른 대화 상자 탭으로 옮겼습니다. (Contributed by Charles Wohlganger and Terry Jan Reedy in bpo-27099@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27099}.)

편집기 코드 컨텍스트 옵션이 개정되었습니다. 상자는 최대 행 수까지 모든 컨텍스트 행을 표시합니다. 컨텍스트 행을 클릭하면 편집기가 해당 행으로 이동합니다. 사용자 정의 테마의 컨텍스트 색상이 설정 대화 상자의 강조 표시 탭에 추가되었습니다. (Contributed by Cheryl Sabella and Terry Jan Reedy in bpo-33642@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33642}, bpo-33768@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33768}, and bpo-33679@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33679}.)

윈도우에서, 새로운 API 호출이 tk가 DPI에 맞게 조정된다는 것을 윈도우에 알려줍니다. Windows 8.1+ 또는 10에서, 파이썬 바이너리의 DPI 호환성 속성을 변경하지 않고도, 96DPI보다 큰 모니터 해상도를 사용하면, 텍스트와 선이 더 선명해집니다. 그렇지 않으면 아무런 효과도 일으키지 않습니다. (Contributed by Terry Jan Reedy in bpo-33656@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33656}.)

3.7.1의 새로운 기능:

N 줄(기본값은 50)을 초과하는 출력은 버튼으로 축소됩니다. N은 설정 대화 상자의 General 페이지의 PyShell 섹션에서 변경할 수 있습니다. 저 작은, 하지만 아주 길 수도 있는, 줄은 출력을 마우스 오른쪽 버튼으로 클릭하면 축소할 수 있습니다. 축소된 출력은 버튼을 더블 클릭해서 재자리에서 확대하거나, 버튼을 마우스 오른쪽 단추로 클릭하여 클립 보드나 별도의 창으로 확대할 수 있습니다. (Contributed by Tal Einat in bpo-1529353@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1529353}.).

위의 변경 사항은 3.6 유지 보수 배포로 역 이식되었습니다.

3.7.4의 새로운 기능:

사용자 정의 설정으로 모듈을 실행하기 위해 Run 메뉴에 “Run Customized”를 추가합니다. 입력한 모든 명령 줄 인자는 sys.argv에 추가됩니다. 다음 사용자 정의 실행을 위해 상자에 다시 나타납니다. 일반적인 셸 메인 모듈 재시작을 억제할 수도 있습니다. (Contributed by Cheryl Sabella, Terry Jan Reedy, and others in bpo-5680@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5680} and bpo-37627@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37627}.)

3.7.5의 새로운 기능:

IDLE 편집기 창에 선택적인 줄 번호를 추가합니다. 창은 구성 대화 상자의 General 탭에서 설정하지 않는 한 줄 번호 없이 열립니다. 기존 창의 줄 번호는 옵션 메뉴에서 표시되거나 숨겨집니다. (Contributed by Tal Einat and Saimadhav Heblikar in bpo-17535@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17535}.)

@node importlib<4>,io<6>,idlelib 및 IDLE,개선된 모듈<3>
@anchor{whatsnew/3 7 importlib}@anchor{d3b}
@subsubsection importlib


The @code{importlib.abc.ResourceReader} ABC was introduced to
support the loading of resources from packages.  See also
@ref{cb8,,importlib.resources}.
(Contributed by Barry Warsaw, Brett Cannon in bpo-32248@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32248}.)

@ref{73c,,importlib.reload()} 는 이제 모듈에 스펙이 없는 경우 @ref{d3c,,ModuleNotFoundError} 를 발생시킵니다. (Contributed by Garvit Khatri in bpo-29851@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29851}.)

@ref{5ae,,importlib.util.find_spec()} now raises @ref{d3c,,ModuleNotFoundError} instead of
@ref{5ee,,AttributeError} if the specified parent module is not a package (i.e.
lacks a @code{__path__} attribute).
(Contributed by Milan Oberkirch in bpo-30436@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30436}.)

The new @ref{d3d,,importlib.util.source_hash()} can be used to compute the hash of
the passed source.  A @ref{cc1,,hash-based .pyc file}
embeds the value returned by this function.

@node io<6>,ipaddress<3>,importlib<4>,개선된 모듈<3>
@anchor{whatsnew/3 7 io}@anchor{d3e}
@subsubsection io


새로운 @ref{d3f,,TextIOWrapper.reconfigure()} 메서드를 사용하여 텍스트 스트림을 새로운 설정으로 재구성 할 수 있습니다. (Contributed by Antoine Pitrou in bpo-30526@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30526} and INADA Naoki in bpo-15216@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15216}.)

@node ipaddress<3>,itertools<6>,io<6>,개선된 모듈<3>
@anchor{whatsnew/3 7 ipaddress}@anchor{d40}
@subsubsection ipaddress


@ref{50e,,ipaddress.IPv6Network} 와 @ref{50d,,ipaddress.IPv4Network} 의 새로운 @code{subnet_of()} 와 @code{supernet_of()} 메서드는 네트워크 포함 테스트에 사용될 수 있습니다. (Contributed by Michel Albert and Cheryl Sabella in bpo-20825@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20825}.)

@node itertools<6>,locale<4>,ipaddress<3>,개선된 모듈<3>
@anchor{whatsnew/3 7 itertools}@anchor{d41}
@subsubsection itertools


@ref{d42,,itertools.islice()} 는 start, stop, step 인자로 @ref{19e,,정수류 객체} 를 받아들입니다. (Contributed by Will Roberts in bpo-30537@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30537}.)

@node locale<4>,logging<3>,itertools<6>,개선된 모듈<3>
@anchor{whatsnew/3 7 locale}@anchor{d43}
@subsubsection locale


@ref{741,,locale.format_string()} 의 새로운 `monetary' 인자는 변환에 화폐 천 단위 분리자 및 그룹화 문자열을 사용하도록 만듭니다. (Contributed by Garvit in bpo-10379@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10379}.)

@ref{75b,,locale.getpreferredencoding()} 함수는 이제 안드로이드나 @ref{cc0,,강제 UTF-8 모드} 일 때 항상 @code{'UTF-8'} 을 반환합니다.

@node logging<3>,math<7>,locale<4>,개선된 모듈<3>
@anchor{whatsnew/3 7 logging}@anchor{d44}
@subsubsection logging


@ref{d45,,Logger} 인스턴스는 이제 피클(pickle) 할 수 있습니다. (Contributed by Vinay Sajip in bpo-30520@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30520}.)

새로운 @ref{d46,,StreamHandler.setStream()} 메서드는 처리기 생성 후 로거 스트림을 대체하는 데 사용될 수 있습니다. (Contributed by Vinay Sajip in bpo-30522@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30522}.)

이제 @ref{d47,,logging.config.fileConfig()} 에 전달된 구성에서 처리기 생성자에 대한 키워드 인자를 지정할 수 있습니다. (Contributed by Preston Landers in bpo-31080@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31080}.)

@node math<7>,mimetypes<3>,logging<3>,개선된 모듈<3>
@anchor{whatsnew/3 7 math}@anchor{d48}
@subsubsection math


새로운 @ref{d49,,math.remainder()} 함수는 IEEE 754 스타일의 나머지 연산을 구현합니다. (Contributed by Mark Dickinson in bpo-29962@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29962}.)

@node mimetypes<3>,msilib,math<7>,개선된 모듈<3>
@anchor{whatsnew/3 7 mimetypes}@anchor{d4a}
@subsubsection mimetypes


.bmp의 MIME 형이 @code{'image/x-ms-bmp'} 에서 @code{'image/bmp'} 로 변경되었습니다. (Contributed by Nitish Chandra in bpo-22589@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22589}.)

@node msilib,multiprocessing<5>,mimetypes<3>,개선된 모듈<3>
@anchor{whatsnew/3 7 msilib}@anchor{d4b}
@subsubsection msilib


새로운 @code{Database.Close()} 메서드를 사용하여 @abbr{MSI} 데이터베이스를 닫을 수 있습니다. (Contributed by Berker Peksag in bpo-20486@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20486}.)

@node multiprocessing<5>,os<8>,msilib,개선된 모듈<3>
@anchor{whatsnew/3 7 multiprocessing}@anchor{d4c}
@subsubsection multiprocessing


새로운 @ref{d4d,,Process.close()} 메서드는 명시적으로 프로세스 객체를 닫고 그와 연관된 모든 자원을 해제합니다. 하부 프로세스가 여전히 실행 중이면 @ref{2ec,,ValueError} 를 일으킵니다. (Contributed by Antoine Pitrou in bpo-30596@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30596}.)

The new @ref{d4e,,Process.kill()} method can
be used to terminate the process using the @ref{d4f,,SIGKILL} signal on Unix.
(Contributed by Vitor Pereira in bpo-30794@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30794}.)

@ref{252,,Process} 에 의해 생성된 데몬이 아닌 스레드는 이제 프로세스 종료 시에 조인(join)됩니다. (Contributed by Antoine Pitrou in bpo-18966@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18966}.)

@node os<8>,pathlib<11>,multiprocessing<5>,개선된 모듈<3>
@anchor{whatsnew/3 7 os}@anchor{d50}
@subsubsection os


@ref{d51,,os.fwalk()} 는 이제 `경로' 인자로 @ref{192,,bytes} 도 받아들입니다. (Contributed by Serhiy Storchaka in bpo-28682@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28682}.)

@ref{c53,,os.scandir()} 은 @ref{d52,,파일 기술자} 에 대한 지원을 얻었습니다. (Contributed by Serhiy Storchaka in bpo-25996@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25996}.)

새로운 @ref{355,,register_at_fork()} 함수는 프로세스 포크 때 실행될 파이썬 콜백을 등록 할 수 있게 합니다. (Contributed by Antoine Pitrou in bpo-16500@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16500}.)

@ref{d53,,os.preadv()} (@ref{d54,,os.readv()} 와 @ref{d55,,os.pread()} 의 기능을 결합한 것)와 @ref{d56,,os.pwritev()} 함수 (@ref{d57,,os.writev()} 와 @ref{d58,,os.pwrite()} 의 기능을 결합한 것)를 추가했습니다. (Contributed by Pablo Galindo in bpo-31368@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31368}.)

@ref{52c,,os.makedirs()} 의 mode 인자는 더는 새로 생성된 중간 수준 디렉터리의 파일 사용 권한 비트에 영향을 미치지 않습니다. (Contributed by Serhiy Storchaka in bpo-19930@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19930}.)

@ref{d59,,os.dup2()} 는 이제 새로운 파일 기술자를 반환합니다. 이전에는 항상 @code{None} 을 반환했습니다. (Contributed by Benjamin Peterson in bpo-32441@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32441}.)

@ref{26d,,os.stat()} 에 의해 반환된 구조체는 이제 솔라리스와 그 파생물에서 @ref{d5a,,st_fstype} 어트리뷰트를 포함합니다. (Contributed by Jesús Cea Avión in bpo-32659@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32659}.)

@node pathlib<11>,pdb<6>,os<8>,개선된 모듈<3>
@anchor{whatsnew/3 7 pathlib}@anchor{d5b}
@subsubsection pathlib


새로운 @ref{c0b,,Path.is_mount()} 메서드는 이제 POSIX 시스템에서 사용할 수 있으며 경로가 마운트 지점인지 아닌지를 결정하는 데 사용할 수 있습니다. (Contributed by Cooper Ry Lees in bpo-30897@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30897}.)

@node pdb<6>,py_compile<3>,pathlib<11>,개선된 모듈<3>
@anchor{whatsnew/3 7 pdb}@anchor{d5c}
@subsubsection pdb


@ref{272,,pdb.set_trace()} 는 이제 선택적 `header' 키워드 전용 인자를 취합니다. 주어진 경우, 디버깅이 시작되기 바로 전에 콘솔에 출력됩니다. (Contributed by Barry Warsaw in bpo-31389@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31389}.)

@ref{aa,,pdb} 명령행은 이제 스크립트 파일의 대안으로 @code{-m module_name} 을 받아들입니다. (Contributed by Mario Corchero in bpo-32206@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32206}.)

@node py_compile<3>,pydoc<3>,pdb<6>,개선된 모듈<3>
@anchor{whatsnew/3 7 py-compile}@anchor{d5d}
@subsubsection py_compile


@ref{c19,,py_compile.compile()} 은 – 그리고 자연히 @ref{21,,compileall} 도 – 이제 
@geindex SOURCE_DATE_EPOCH
@geindex 환경 변수; SOURCE_DATE_EPOCH
@code{SOURCE_DATE_EPOCH} 환경 변수가 설정되면 해시 기반 유효성 검사를 위해 @code{.pyc} 파일을 무조건 생성합니다. 이것은 @code{.pyc} 파일의 재현 가능한 빌드@footnote{https://reproducible-builds.org/} 를 보장할 수 있도록 한다. (Contributed by Bernhard M. Wiedemann in bpo-29708@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29708}.)

@node pydoc<3>,queue<2>,py_compile<3>,개선된 모듈<3>
@anchor{whatsnew/3 7 pydoc}@anchor{d5e}
@subsubsection pydoc


pydoc 서버는 이제 새로운 @code{-n} 명령행 인자로 지정된 임의의 호스트 이름에 바인드 할 수 있습니다. (Contributed by Feanil Patel in bpo-31128@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31128}.)

@node queue<2>,re<5>,pydoc<3>,개선된 모듈<3>
@anchor{whatsnew/3 7 queue}@anchor{d5f}
@subsubsection queue


새로운 @ref{d60,,SimpleQueue} 클래스는 무제한 @abbr{FIFO} 큐입니다. (Contributed by Antoine Pitrou in bpo-14976@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14976}.)

@node re<5>,signal<2>,queue<2>,개선된 모듈<3>
@anchor{whatsnew/3 7 re}@anchor{d61}
@subsubsection re


플래그 @ref{83d,,re.ASCII}, @ref{d62,,re.LOCALE} 및 @ref{d63,,re.UNICODE} 를 그룹의 스코프 내에서 설정할 수 있습니다. (Contributed by Serhiy Storchaka in bpo-31690@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31690}.)

@ref{5a1,,re.split()} 는 이제 빈 문자열과 일치하는 @code{r'\b'}, @code{'^$'} 또는 @code{(?=-)} 와 같은 패턴으로 나누는 것을 지원합니다. (Contributed by Serhiy Storchaka in bpo-25054@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25054}.)

@ref{d62,,re.LOCALE} 플래그로 컴파일된 정규식은 더는 컴파일 시간의 로케일에 의존하지 않습니다. 로케일 설정은 컴파일된 정규식이 사용될 때 적용됩니다. (Contributed by Serhiy Storchaka in bpo-30215@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30215}.)

정규식이 앞으로 의미적인 변경이 있을 문자 집합 구조물(가령 중첩된 집합과 집합 연산)을 포함하면 이제 @ref{657,,FutureWarning} 을 줍니다. (Contributed by Serhiy Storchaka in bpo-30349@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30349}.)

@ref{756,,copy.copy()} 와 @ref{d64,,copy.deepcopy()} 를 사용하여 컴파일된 정규식과 매치 객체를 복사 할 수 있습니다. (Contributed by Serhiy Storchaka in bpo-10076@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10076}.)

@node signal<2>,socket<6>,re<5>,개선된 모듈<3>
@anchor{whatsnew/3 7 signal}@anchor{d65}
@subsubsection signal


@ref{d66,,signal.set_wakeup_fd()} 함수의 새로운 `warn_on_full_buffer' 인자는 웨이크업 버퍼 오버플로가 발생했을 때 파이썬이 표준 에러로 경고를 출력할지를 지정할 수 있게 합니다. (Contributed by Nathaniel J. Smith in bpo-30050@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30050}.)

@node socket<6>,socketserver,signal<2>,개선된 모듈<3>
@anchor{whatsnew/3 7 socket}@anchor{d67}
@subsubsection socket


새로운 @ref{d68,,socket.getblocking()} 메서드는 소켓이 블로킹 모드에 있으면 @code{True} 를 반환하고, 그렇지 않으면 @code{False} 를 반환합니다. (Contributed by Yury Selivanov in bpo-32373@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32373}.)

새로운 @ref{d69,,socket.close()} 함수는 전달된 소켓 파일 기술자를 닫습니다. 이 함수는 플랫폼 간 호환성을 높이기 위해 @ref{d6a,,os.close()} 대신 사용되어야 합니다. (Contributed by Christian Heimes in bpo-32454@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32454}.)

The @ref{d1,,socket} module now exposes the @ref{d6b,,socket.TCP_CONGESTION} (Linux 2.6.13), @ref{d6b,,socket.TCP_USER_TIMEOUT} (Linux 2.6.37), and @ref{d6b,,socket.TCP_NOTSENT_LOWAT} (Linux 3.12) constants.
(Contributed by Omar Sandoval in bpo-26273@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26273} and
Nathaniel J. Smith in bpo-29728@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29728}.)

가상 기계와 호스트 간의 통신을 허용하기 위해 @ref{d6c,,socket.AF_VSOCK} 소켓 지원이 추가되었습니다. (Contributed by Cathy Avery in bpo-27584@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27584}.)

소켓은 이제 기본적으로 파일 기술자에서 패밀리, 형 및 프로토콜을 자동 감지합니다. (Contributed by Christian Heimes in bpo-28134@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28134}.)

@node socketserver,sqlite3<7>,socket<6>,개선된 모듈<3>
@anchor{whatsnew/3 7 socketserver}@anchor{d6d}
@subsubsection socketserver


@ref{d6e,,socketserver.ThreadingMixIn.server_close} now waits until all non-daemon
threads complete. @code{socketserver.ForkingMixIn.server_close} now waits
until all child processes complete.

Add a new @ref{d6f,,socketserver.ForkingMixIn.block_on_close} class attribute to
@ref{d70,,socketserver.ForkingMixIn} and @ref{d39,,socketserver.ThreadingMixIn}
classes. Set the class attribute to @code{False} to get the pre-3.7 behaviour.

@node sqlite3<7>,ssl<6>,socketserver,개선된 모듈<3>
@anchor{whatsnew/3 7 sqlite3}@anchor{d71}
@subsubsection sqlite3


@ref{54c,,sqlite3.Connection} 은 이제 하부 SQLite 라이브러리의 버전이 3.6.11 이상일 때 @ref{d72,,backup()} 메서드를 노출합니다. (Contributed by Lele Gaifax in bpo-27645@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27645}.)

@ref{5a5,,sqlite3.connect()} 의 `database' 인자는 이제 문자열뿐만 아니라 모든 @ref{5a0,,경로류 객체} 를 받아들입니다. (Contributed by Anders Lorentsen in bpo-31843@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31843}.)

@node ssl<6>,string<2>,sqlite3<7>,개선된 모듈<3>
@anchor{whatsnew/3 7 ssl}@anchor{d73}
@subsubsection ssl


The @ref{d5,,ssl} module now uses OpenSSL’s builtin API instead of
@code{match_hostname()} to check a host name or an IP address.  Values
are validated during TLS handshake.  Any certificate validation error
including failing the host name check now raises
@ref{d74,,SSLCertVerificationError} and aborts the handshake with a proper
TLS Alert message.  The new exception contains additional information.
Host name validation can be customized with
@ref{d75,,SSLContext.hostname_checks_common_name}.
(Contributed by Christian Heimes in bpo-31399@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31399}.)

@cartouche
@quotation 참고 
향상된 호스트 이름 검사에는 OpenSSL 1.0.2 또는 1.1과 호환되는 `libssl' 구현이 필요합니다. 따라서, OpenSSL 0.9.8 및 1.0.1은 더는 지원되지 않습니다 (더 자세한 내용은 @ref{d76,,플랫폼 지원 제거}를 보세요). ssl 모듈은 대부분 LibreSSL 2.7.2 이상과 호환됩니다.
@end quotation
@end cartouche

@code{ssl} 모듈은 더는 SNI TLS 확장에서 IP 주소를 전송하지 않습니다. (Contributed by Christian Heimes in bpo-32185@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32185}.)

@code{match_hostname()} no longer supports partial wildcards like
@code{www*.example.org}.
(Contributed by Mandeep Singh in bpo-23033@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23033} and Christian Heimes in
bpo-31399@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31399}.)

@code{ssl} 모듈의 기본 사이퍼 군 선택은 이제 하드 코딩된 화이트리스트가 아닌 블랙리스트 접근법을 사용합니다. 파이썬은 더는 OpenSSL 보안 업데이트 때문에 차단된 사이퍼를 다시 활성화하지 않습니다. 기본 사이퍼 군 선택은 컴파일 시점에 구성 할 수 있습니다. (Contributed by Christian Heimes in bpo-31429@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31429}.)

국제화된 도메인 이름 (IDN)을 포함하는 서버 인증서의 유효성 검사가 이제 지원됩니다. 이 변경의 일부로, @ref{d77,,SSLSocket.server_hostname} 어트리뷰트는 이제 U-label 형식(@code{"pythön.org"})보다는 A-label 형식(@code{"xn--pythn-mua.org"})으로 기대하는 호스트 이름을 저장합니다. (Contributed by Nathaniel J. Smith and Christian Heimes in bpo-28414@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28414}.)

@code{ssl} 모듈은 TLS 1.3과 OpenSSL 1.1.1을 예비적이고 실험적으로 지원합니다. 파이썬 3.7.0 배포 당시, OpenSSL 1.1.1은 아직 개발 중이며 TLS 1.3은 아직 완성되지 않았습니다. TLS 1.3 핸드 셰이크와 프로토콜은 TLS 1.2 및 그 이전 버전과 약간 다르게 동작합니다. @ref{d78,,TLS 1.3}을 참조하세요. (Contributed by Christian Heimes in bpo-32947@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32947}, bpo-20995@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20995}, bpo-29136@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29136}, bpo-30622@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30622} and bpo-33618@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33618})

@ref{ae7,,SSLSocket} 과 @ref{d79,,SSLObject} 는 더는 공개 생성자를 가지고 있지 않습니다. 직접 인스턴스를 만드는 것은 결코 문서로 만들어지고 지원되는 기능이 아닙니다. 인스턴스는 @ref{357,,SSLContext} 메서드 @ref{747,,wrap_socket()}과 @ref{d7a,,wrap_bio()}로 생성되어야 합니다. (Contributed by Christian Heimes in bpo-32951@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32951})

최소 및 최대 TLS 프로토콜 버전을 설정하기 위한 OpenSSL 1.1 API는 @ref{a70,,SSLContext.minimum_version} 과 @ref{a71,,SSLContext.maximum_version} 로 제공됩니다. 지원되는 프로토콜은 여러 가지 새 플래그로 표시됩니다, 가령 @ref{d7b,,HAS_TLSv1_1}. (Contributed by Christian Heimes in bpo-32609@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32609}.)

Added @ref{c25,,ssl.SSLContext.post_handshake_auth} to enable and
@ref{c26,,ssl.SSLSocket.verify_client_post_handshake()} to initiate TLS 1.3
post-handshake authentication.
(Contributed by Christian Heimes in gh-78851@footnote{https://github.com/python/cpython/issues/78851}.)

@node string<2>,subprocess<2>,ssl<6>,개선된 모듈<3>
@anchor{whatsnew/3 7 string}@anchor{d7c}
@subsubsection string


@ref{896,,string.Template} 은 이제 중괄호로 둘러싼 치환식과 그렇지 않은 치환식의 정규식을 따로 선택적으로 수정할 수 있도록 합니다. (Contributed by Barry Warsaw in bpo-1198569@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1198569}.)

@node subprocess<2>,sys<8>,string<2>,개선된 모듈<3>
@anchor{whatsnew/3 7 subprocess}@anchor{d7d}
@subsubsection subprocess


@ref{d7e,,subprocess.run()} 함수는 새로운 `capture_output' 키워드 인자를 받습니다. 참일 때, stdout과 stderr가 캡처됩니다. 이것은 @ref{d7f,,subprocess.PIPE} 를 `stdout' 및 `stderr' 인자로 전달하는 것과 같습니다. (Contributed by Bo Bayles in bpo-32102@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32102}.)

@code{subprocess.run} 함수와 @ref{4b8,,subprocess.Popen} 생성자는 이제 `text' 키워드 인자를 `universal_newlines' 의 별칭으로 받아들입니다. (Contributed by Andrew Clegg in bpo-31756@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31756}.)

윈도우에서 `close_fds' 의 기본값은 표준 핸들을 리디렉션 할 때 @code{False} 에서 @code{True} 로 변경되었습니다. 이제 표준 핸들을 리디렉션 할 때 `close_fds' 를 참으로 설정할 수 있습니다. @ref{4b8,,subprocess.Popen} 을 참조하세요. 이것은 지원되는 모든 플랫폼에서 이제 `close_fds' 의 기본값이 @code{True} 임을 뜻합니다. (Contributed by Segev Finer in bpo-19764@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19764}.)

subprocess 모듈은 이제 @ref{d80,,subprocess.call()}, @ref{d7e,,subprocess.run()} 중에, 또는 @ref{4b8,,Popen} 컨텍스트 관리자에 있는 동안 @ref{bc4,,KeyboardInterrupt} 를 더 우아하게 처리합니다. 이제 @code{KeyboardInterrupt} 예외 처리를 계속하기 전에 자식이 종료될 때까지 약간의 시간을 기다립니다. (Contributed by Gregory P. Smith in bpo-25942@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25942}.)

@node sys<8>,time<5>,subprocess<2>,개선된 모듈<3>
@anchor{whatsnew/3 7 sys}@anchor{d81}
@subsubsection sys


새로운 @ref{cd0,,sys.breakpointhook()} 훅 함수는 내장 @ref{271,,breakpoint()} 에 의해 호출됩니다. (Contributed by Barry Warsaw in bpo-31353@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31353}.)

안드로이드에서, 새로운 @ref{d82,,sys.getandroidapilevel()} 은 빌드 시간 안드로이드 API 버전을 반환합니다. (Contributed by Victor Stinner in bpo-28740@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28740}.)

The new @ref{d83,,sys.get_coroutine_origin_tracking_depth()} function returns
the current coroutine origin tracking depth, as set by
the new @ref{d84,,sys.set_coroutine_origin_tracking_depth()}.  @ref{b,,asyncio}
has been converted to use this new API instead of
the deprecated @code{sys.set_coroutine_wrapper()}.
(Contributed by Nathaniel J. Smith in bpo-32591@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32591}.)

@node time<5>,tkinter<6>,sys<8>,개선된 모듈<3>
@anchor{whatsnew/3 7 time}@anchor{d85}
@subsubsection time


@geindex Python 향상 제안; PEP 564
PEP 564@footnote{https://peps.python.org/pep-0564/} 는 @ref{f4,,time} 모듈에 나노초 해상도의 새로운 함수 6개를 추가합니다:


@itemize *

@item 
@ref{cda,,time.clock_gettime_ns()}

@item 
@ref{cdb,,time.clock_settime_ns()}

@item 
@ref{cdc,,time.monotonic_ns()}

@item 
@ref{cdd,,time.perf_counter_ns()}

@item 
@ref{cde,,time.process_time_ns()}

@item 
@ref{cdf,,time.time_ns()}
@end itemize

새로운 시계 식별자가 추가되었습니다:


@itemize *

@item 
@ref{d86,,time.CLOCK_BOOTTIME} (리눅스): 시스템이 일시 중지된 시간을 포함한다는 점만 제외하고는 @ref{8a7,,time.CLOCK_MONOTONIC} 과 같습니다.

@item 
@ref{d87,,time.CLOCK_PROF} (FreeBSD, NetBSD, OpenBSD): 고해상도의 프로세스별 CPU 타이머.

@item 
@ref{d88,,time.CLOCK_UPTIME} (FreeBSD, OpenBSD): 절댓값이 시스템이 실행 중이었고 중단되지 않은 시간인 시간. 정확한 업타임 측정을 제공합니다.
@end itemize

새로운 @ref{b30,,time.thread_time()}과 @ref{d89,,time.thread_time_ns()} 함수는 스레드 당 CPU 시간을 측정하는 데 사용될 수 있습니다. (Contributed by Antoine Pitrou in bpo-32025@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32025}.)

새로운 @ref{d8a,,time.pthread_getcpuclockid()} 함수는 스레드 별 CPU 시간 시계의 시계 ID를 반환합니다.

@node tkinter<6>,tracemalloc<2>,time<5>,개선된 모듈<3>
@anchor{whatsnew/3 7 tkinter}@anchor{d8b}
@subsubsection tkinter


이제 새로운 @ref{d8c,,tkinter.ttk.Spinbox} 클래스를 사용할 수 있습니다. (Contributed by Alan Moore in bpo-32585@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32585}.)

@node tracemalloc<2>,types<5>,tkinter<6>,개선된 모듈<3>
@anchor{whatsnew/3 7 tracemalloc}@anchor{d8d}
@subsubsection tracemalloc


@ref{d8e,,tracemalloc.Traceback} 은 더 일반 트레이스백과 같이 동작하여, 프레임을 가장 오래된 것부터 가장 최근의 것으로 정렬합니다. @ref{d8f,,Traceback.format()} 은 이제 음의 `limit' 을 받아들이고, 결과를 @code{abs(limit)} 개의 가장 오래된 프레임으로 잘라냅니다. 이전 동작을 얻으려면, @code{Traceback.format()} 에 새로운 `most_recent_first' 인자를 사용하십시오. (Contributed by Jesse Bakker in bpo-32121@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32121}.)

@node types<5>,unicodedata<7>,tracemalloc<2>,개선된 모듈<3>
@anchor{whatsnew/3 7 types}@anchor{d90}
@subsubsection types


이제 새로운 @ref{d91,,WrapperDescriptorType}, @ref{85a,,MethodWrapperType}, @ref{d92,,MethodDescriptorType}, @ref{d93,,ClassMethodDescriptorType} 클래스를 사용할 수 있습니다. (Contributed by Manuel Krebber and Guido van Rossum in bpo-29377@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29377}, and Serhiy Storchaka in bpo-32265@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32265}.)

새로운 @ref{d94,,types.resolve_bases()} 함수는 
@geindex Python 향상 제안; PEP 560
PEP 560@footnote{https://peps.python.org/pep-0560/} 에 지정된 대로 MRO 항목을 동적으로 결정합니다. (Contributed by Ivan Levkivskyi in bpo-32717@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32717}.)

@node unicodedata<7>,unittest<8>,types<5>,개선된 모듈<3>
@anchor{whatsnew/3 7 unicodedata}@anchor{d95}
@subsubsection unicodedata


내부 @ref{10b,,unicodedata} 데이터베이스가 유니코드 11@footnote{https://www.unicode.org/versions/Unicode11.0.0/} 을 사용하도록 업그레이드되었습니다. (Contributed by Benjamin Peterson.)

@node unittest<8>,unittest mock,unicodedata<7>,개선된 모듈<3>
@anchor{whatsnew/3 7 unittest}@anchor{d96}
@subsubsection unittest


새로운 @code{-k} 명령행 옵션은 이름 부분 문자열이나 유닉스 셸과 같은 패턴으로 테스트를 필터링 할 수 있습니다. 예를 들어 @code{python -m unittest -k foo} 는 @code{foo_tests.SomeTest.test_something}, @code{bar_tests.SomeTest.test_foo} 를 실행하지만, @code{bar_tests.FooTest.test_something} 는 실행하지 않습니다. (Contributed by Jonas Haag in bpo-32071@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32071}.)

@node unittest mock,urllib parse<5>,unittest<8>,개선된 모듈<3>
@anchor{whatsnew/3 7 unittest-mock}@anchor{d97}
@subsubsection unittest.mock


@ref{d98,,sentinel} 어트리뷰트는 이제 @ref{29,,복사}되거나 @ref{ab,,피클}될 때 그들의 아이덴티티를 보존합니다. (Contributed by Serhiy Storchaka in bpo-20804@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20804}.)

새로운 @ref{d99,,seal()} 함수는 @ref{c3d,,Mock} 인스턴스를 봉인하도록 허용합니다. 추가적인 어트리뷰트 모의 객체를 만들 수 없도록 합니다. 봉인은 모의 객체인 모든 어트리뷰트에 재귀적으로 적용됩니다. (Contributed by Mario Corchero in bpo-30541@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30541}.)

@node urllib parse<5>,uu,unittest mock,개선된 모듈<3>
@anchor{whatsnew/3 7 urllib-parse}@anchor{d9a}
@subsubsection urllib.parse


@ref{d9b,,urllib.parse.quote()} 가 
@geindex RFC; RFC 2396
RFC 2396@footnote{https://datatracker.ietf.org/doc/html/rfc2396.html}에서 
@geindex RFC; RFC 3986
RFC 3986@footnote{https://datatracker.ietf.org/doc/html/rfc3986.html}으로 갱신되어, 기본적으로 이스케이프 되지 않는 문자 집합에 @code{~} 가 추가되었습니다. (Contributed by Christian Theune and Ratnadeep Debnath in bpo-16285@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16285}.)

@node uu,uuid<4>,urllib parse<5>,개선된 모듈<3>
@anchor{whatsnew/3 7 uu}@anchor{d9c}
@subsubsection uu


@code{uu.encode()} 함수는 이제 선택적 `backtick' 키워드 인자를 받아들입니다. 참일 때, 0은 스페이스 대신에 @code{'`'} 로 표현됩니다. (Contributed by Xiang Zhang in bpo-30103@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30103}.)

@node uuid<4>,warnings<3>,uu,개선된 모듈<3>
@anchor{whatsnew/3 7 uuid}@anchor{d9d}
@subsubsection uuid


새로운 @ref{d9e,,UUID.is_safe} 어트리뷰트는 생성된 UUID가 다중 프로세스에 안전한 방법으로 생성되었는지에 대해 플랫폼이 주는 정보를 전달합니다. (Contributed by Barry Warsaw in bpo-22807@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22807}.)

@ref{d9f,,uuid.getnode()} 는 이제 지역적으로 관리되는 MAC 주소보다 보편적으로 관리되는 MAC 주소를 선호합니다. 이것은 @ref{da0,,uuid.uuid1()} 에서 반환된 UUID의 글로벌 유일성을 더 잘 보장합니다. 지역적으로 관리되는 MAC 주소 만 사용할 수 있는 경우, 처음 발견된 MAC 주소가 반환됩니다. (Contributed by Barry Warsaw in bpo-32107@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32107}.)

@node warnings<3>,xml<5>,uuid<4>,개선된 모듈<3>
@anchor{whatsnew/3 7 warnings}@anchor{da1}
@subsubsection warnings


기본 경고 필터의 초기화가 다음과 같이 변경되었습니다:


@itemize *

@item 
명령행 옵션(@ref{7f8,,-b} 및 새로운 CPython 특정 @ref{16f,,-X} @code{dev} 옵션을 포함합니다)을 통해 활성화된 경고는 항상 @ref{3f5,,sys.warnoptions} 어트리뷰트를 통해 경고 절차로 전달됩니다.

@item 
명령행 또는 환경을 통해 활성화된 경고 필터의 우선순위는 다음과 같습니다:


@itemize *

@item 
@ref{7f8,,-b} (또는 @code{-bb})에 의한 @code{BytesWarning} 필터

@item 
@ref{ac5,,-W} 옵션으로 지정된 모든 필터

@item 
@geindex PYTHONWARNINGS
@geindex 환경 변수; PYTHONWARNINGS
@ref{da2,,PYTHONWARNINGS} 환경 변수로 지정된 모든 필터

@item 
다른 모든 CPython 특정 필터 (예, 새로운 @code{-X dev} 모드를 위해 추가된 @code{default} 필터)

@item 
경고 절차에 의해 직접 정의된 모든 묵시적 필터
@end itemize

@item 
@ref{508,,CPython 디버그 빌드}에서, 이제 모든 경고가 기본적으로 표시됩니다 (묵시적 필터 목록이 비어 있습니다)
@end itemize

(Contributed by Nick Coghlan and Victor Stinner in bpo-20361@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20361},
bpo-32043@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32043}, and bpo-32230@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32230}.)

폐지 경고는 단일 파일 스크립트 및 대화식 프롬프트에서 다시 한번 기본적으로 표시됩니다. 자세한 내용은 @ref{cc3,,PEP 565; __main__ 의 DeprecationWarning 표시} 를 참조하십시오. (Contributed by Nick Coghlan in bpo-31975@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31975}.)

@node xml<5>,xml etree,warnings<3>,개선된 모듈<3>
@anchor{whatsnew/3 7 xml}@anchor{da3}
@subsubsection xml


As mitigation against DTD and external entity retrieval, the
@ref{128,,xml.dom.minidom} and @ref{12f,,xml.sax} modules no longer process
external entities by default.
(Contributed by Christian Heimes in gh-61441@footnote{https://github.com/python/cpython/issues/61441}.)

@node xml etree,xmlrpc server,xml<5>,개선된 모듈<3>
@anchor{whatsnew/3 7 xml-etree}@anchor{da4}
@subsubsection xml.etree


@ref{da5,,ElementPath} predicates in the @code{find()}
methods can now compare text of the current node with @code{[. = "text"]},
not only text in children.  Predicates also allow adding spaces for
better readability.  (Contributed by Stefan Behnel in bpo-31648@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31648}.)

@node xmlrpc server,zipapp,xml etree,개선된 모듈<3>
@anchor{whatsnew/3 7 xmlrpc-server}@anchor{da6}
@subsubsection xmlrpc.server


@code{SimpleXMLRPCDispatcher.register_function()}
can now be used as a decorator.  (Contributed by Xiang Zhang in
bpo-7769@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7769}.)

@node zipapp,zipfile<3>,xmlrpc server,개선된 모듈<3>
@anchor{whatsnew/3 7 zipapp}@anchor{da7}
@subsubsection zipapp


함수 @ref{da8,,create_archive()} 는 이제 사용자가 저장소에 포함되어야 하는 파일을 선택할 수 있도록 선택적 `filter' 인자를 받아들입니다. (Contributed by Irmen de Jong in bpo-31072@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31072}.)

함수 @ref{da8,,create_archive()} 는 이제 압축된 저장소를 생성하기 위해 선택적 `compressed' 인자를 받아들입니다. 명령행 옵션 @code{--compress} 도 압축을 지원하기 위해 추가되었습니다. (Contributed by Zhiming Wang in bpo-31638@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31638}.)

@node zipfile<3>,,zipapp,개선된 모듈<3>
@anchor{whatsnew/3 7 zipfile}@anchor{da9}
@subsubsection zipfile


@ref{8d2,,ZipFile} 은 이제 압축 수준을 제어하기 위해 새로운 `compresslevel' 매개변수를 받아들입니다. (Contributed by Bo Bayles in bpo-21417@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21417}.)

@code{ZipFile} 에 의해 생성된 저장소에 있는 서브 디렉터리는 이제 알파벳순으로 저장됩니다. (Contributed by Bernhard M. Wiedemann in bpo-30693@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30693}.)

@node C API 변경<2>,빌드 변경<2>,개선된 모듈<3>,파이썬 3 7의 새로운 기능
@anchor{whatsnew/3 7 c-api-changes}@anchor{daa}
@subsection C API 변경


스레드-로컬 저장소를 위한 새로운 API가 구현되었습니다. 개요는 @ref{cc4,,PEP 539; 스레드-로컬 저장소를 위한 새로운 C API} 를, 완전한 레퍼런스는 @ref{cd4,,Thread-specific storage API}를 보십시오. (Contributed by Masayuki Yamamoto in bpo-25658@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25658}.)

새로운 @ref{cb6,,컨텍스트 변수} 기능은 다수의 @ref{cef,,새로운 C API}를 노출합니다.

새로운 @ref{dab,,PyImport_GetModule()} 함수는 주어진 이름으로 이전에 임포트 한 모듈을 반환합니다. (Contributed by Eric Snow in bpo-28411@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28411}.)

새로운 @ref{dac,,Py_RETURN_RICHCOMPARE} 매크로는 풍부한 비교 함수를 작성하기 쉽게 합니다. (Contributed by Petr Victorin in bpo-23699@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23699}.)

새로운 @ref{dad,,Py_UNREACHABLE} 매크로는 도달할 수 없는 코드 경로를 표시하는 데 사용될 수 있습니다. (Contributed by Barry Warsaw in bpo-31338@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31338}.)

@ref{105,,tracemalloc} 은 이제 새로운 @ref{dae,,PyTraceMalloc_Track()}과 @ref{daf,,PyTraceMalloc_Untrack()} 함수를 통해 C API를 노출합니다. (Contributed by Victor Stinner in bpo-30054@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30054}.)

The new @ref{db0,,import__find__load__start} and
@ref{db0,,import__find__load__done} static markers can be used
to trace module imports.
(Contributed by Christian Heimes in bpo-31574@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31574}.)

The fields @code{name} and @code{doc} of structures
@ref{770,,PyMemberDef}, @ref{db1,,PyGetSetDef},
@ref{db2,,PyStructSequence_Field}, @ref{db3,,PyStructSequence_Desc},
and @code{wrapperbase} are now of type @code{const char *} rather of
@code{char *}.  (Contributed by Serhiy Storchaka in bpo-28761@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28761}.)

@ref{a99,,PyUnicode_AsUTF8AndSize()} 와 @ref{424,,PyUnicode_AsUTF8()}의 결과는 이제 @code{char *} 이 아니라 @code{const char *} 입니다. (Contributed by Serhiy Storchaka in bpo-28769@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28769}.)

@ref{db4,,PyMapping_Keys()}, @ref{db5,,PyMapping_Values()} 및 @ref{db6,,PyMapping_Items()}의 결과는 이제 리스트 또는 튜플이 아니라 항상 리스트입니다. (Contributed by Oren Milman in bpo-28280@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28280}.)

함수 @ref{432,,PySlice_Unpack()}과 @ref{433,,PySlice_AdjustIndices()} 를 추가했습니다. (Contributed by Serhiy Storchaka in bpo-27867@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27867}.)

@ref{42f,,PyOS_AfterFork()} 는 폐지되고, 새 함수 @ref{db7,,PyOS_BeforeFork()}, @ref{db8,,PyOS_AfterFork_Parent()} 그리고 @ref{430,,PyOS_AfterFork_Child()}로 대체되었습니다. (Contributed by Antoine Pitrou in bpo-16500@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16500}.)

공개 API의 일부였던 @code{PyExc_RecursionErrorInst} 싱글톤은 제거되었습니다. 청소되지 않은 멤버가 인터프리터의 파이널리제이션 과정에서 세그멘테이션 오류를 일으킬 수 있기 때문입니다. (Contributed by Xavier de Gaye in bpo-22898@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22898} and bpo-30697@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30697}.)

시간대 지원을 위한 timezone 생성자 @ref{db9,,PyTimeZone_FromOffset()} 과 @ref{dba,,PyTimeZone_FromOffsetAndName()} 및 UTC 싱글톤에 액세스하는 @ref{dbb,,PyDateTime_TimeZone_UTC} C API 지원을 추가했습니다. (Contributed by Paul Ganssle in bpo-10381@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10381}.)

The type of results of @code{PyThread_start_new_thread()} and
@code{PyThread_get_thread_ident()}, and the `id' parameter of
@ref{dbc,,PyThreadState_SetAsyncExc()} changed from long to
unsigned long.
(Contributed by Serhiy Storchaka in bpo-6532@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6532}.)

@ref{ab9,,PyUnicode_AsWideCharString()}은 두 번째 인자가 @code{NULL} 이고 wchar_t* 문자열이 널 문자를 포함하면 @ref{2ec,,ValueError} 를 발생시킵니다. (Contributed by Serhiy Storchaka in bpo-30708@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30708}.)

시동 절차와 동적 메모리 할당자의 변경으로 인해 대부분의 C API 함수를 호출하기 전에 @ref{460,,Py_Initialize()} 를 호출해야 한다는 오래전부터 문서화 된 요구 사항이 이제 더 중요해졌고, 이를 지키지 않으면 내장형 응용 프로그램에서 세그멘테이션 오류로 이어질 수 있습니다. 자세한 내용은 이 문서의 @ref{cc7,,파이썬 3.7로 이식하기} 절과 C API 설명서의 @ref{dbd,,Before Python initialization} 절을 참조하십시오.

새로운 @ref{dbe,,PyInterpreterState_GetID()} 는 주어진 인터프리터의 유일한 ID를 반환합니다. (Contributed by Eric Snow in bpo-29102@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29102}.)

@ref{dbf,,Py_DecodeLocale()}, @ref{dc0,,Py_EncodeLocale()} 은 이제 @ref{cc0,,UTF-8 모드} 가 활성화될 때 UTF-8 인코딩을 사용합니다. (Contributed by Victor Stinner in bpo-29240@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29240}.)

@ref{dc1,,PyUnicode_DecodeLocaleAndSize()} 와 @ref{dc2,,PyUnicode_EncodeLocale()}은 이제 @code{surrogateescape} 에러 처리기에 현재 로케일 인코딩을 사용합니다. (Contributed by Victor Stinner in bpo-29240@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29240}.)

@ref{ab6,,PyUnicode_FindChar()} 의 `start' 와 `end' 매개 변수가 문자열 슬라이스처럼 동작하도록 조정되었습니다. (Contributed by Xiang Zhang in bpo-28822@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28822}.)

@node 빌드 변경<2>,최적화<3>,C API 변경<2>,파이썬 3 7의 새로운 기능
@anchor{whatsnew/3 7 build-changes}@anchor{dc3}
@subsection 빌드 변경


@code{--without-threads} 빌드 지원이 제거되었습니다. @ref{f3,,threading} 모듈은 이제 항상 사용할 수 있습니다. (Contributed by Antoine Pitrou in bpo-31370@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31370}.)

OSX 이외의 유닉스 플랫폼에서 @ref{2e,,_ctypes} 모듈을 빌드할 때 사용되는 libffi의 전체 복사본이 더는 포함되지 않습니다. 이러한 플랫폼에서 @code{_ctypes} 를 빌드 할 때 libffi의 설치된 사본이 필요합니다. (Contributed by Zachary Ware in bpo-27979@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27979}.)

윈도우 빌드 프로세스는 외부 소스를 가져오는 데 더는 서브버전에 의존하지 않습니다. 대신 파이썬 스크립트를 사용해서 GitHub에서 zip 파일을 내려받습니다. 시스템에서 파이썬 3.6이 발견되지 않으면 (@code{py -3.6} 를 통해), 이 목적을 위해 NuGet으로 32-비트 파이썬의 사본을 내려받습니다. (Contributed by Zachary Ware in bpo-30450@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30450}.)

@ref{d5,,ssl} 모듈은 OpenSSL 1.0.2 또는 1.1 호환 libssl을 요구합니다. OpenSSL 1.0.1의 유효 기간은 2016-12-31 에 만료되었고 더는 지원되지 않습니다. LibreSSL도 일시적으로 지원되지 않습니다. 버전 2.6.4까지의 LibreSSL 배포에는 필수 OpenSSL 1.0.2 API가 없습니다.

@node 최적화<3>,기타 CPython 구현 변경,빌드 변경<2>,파이썬 3 7의 새로운 기능
@anchor{whatsnew/3 7 optimizations}@anchor{dc4}@anchor{whatsnew/3 7 whatsnew37-perf}@anchor{cc6}
@subsection 최적화


C로 구현된 다양한 표준 라이브러리 클래스의 많은 메서드를 호출하는 오버헤드가, @code{METH_FASTCALL} 규칙을 사용하도록 더 많은 코드를 이식함으로써 상당히 감소하였습니다. (Contributed by Victor Stinner in bpo-29300@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29300}, bpo-29507@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29507}, bpo-29452@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29452}, and bpo-29286@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29286}.)

다양한 최적화를 통해 파이썬의 시작 시간을 리눅스에서 10%, macOS에서 최대 30%까지 줄였습니다. (Contributed by Victor Stinner, INADA Naoki in bpo-29585@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29585}, and Ivan Levkivskyi in bpo-31333@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31333}.)

메서드 호출은 이제 연결된 메서드 인스턴스 생성을 피하는 바이트 코드 변경으로 인해 최대 20% 빨라졌습니다. (Contributed by Yury Selivanov and INADA Naoki in bpo-26110@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26110}.)
@anchor{whatsnew/3 7 whatsnew37-asyncio-perf}@anchor{cf8}
@ref{b,,asyncio} 모듈은 자주 사용되는 함수들에 대해 여러 가지 주목할만한 최적화가 이루어졌습니다:


@itemize *

@item 
@ref{2f2,,asyncio.get_event_loop()} 함수가 C로 다시 구현되어 최대 15배 빨라졌습니다. (Contributed by Yury Selivanov in bpo-32296@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32296}.)

@item 
@ref{dc5,,asyncio.Future} 콜백 관리가 최적화되었습니다. (Contributed by Yury Selivanov in bpo-32348@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32348}.)

@item 
@ref{812,,asyncio.gather()} 는 이제 최대 15% 빨라졌습니다. (Contributed by Yury Selivanov in bpo-32355@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32355}.)

@item 
@ref{c63,,asyncio.sleep()}은 이제 `delay' 인자가 0이거나 음수일 때 최대 2배 빠릅니다. (Contributed by Andrew Svetlov in bpo-32351@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32351}.)

@item 
asyncio 디버그 모드의 성능 오버헤드가 감소하였습니다. (Contributed by Antoine Pitrou in bpo-31970@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31970}.)
@end itemize

@ref{cbb,,PEP 560 작업} 의 결과로, @ref{10a,,typing} 의 임포트 시간이 7배 단축되었으며, 많은 typing 연산이 이제 더 빨라졌습니다. (Contributed by Ivan Levkivskyi in bpo-32226@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32226}.)

@ref{dc6,,sorted()}와 @ref{dc7,,list.sort()} 는 일반적인 사용에 대해 최대 40-75% 더 빠르게 최적화되었습니다. (Contributed by Elliot Gorokhovsky in bpo-28685@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28685}.)

@ref{dc8,,dict.copy()} 는 이제 5.5 배 빠릅니다. (Contributed by Yury Selivanov in bpo-31179@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31179}.)

@ref{6f8,,hasattr()}과 @ref{dc9,,getattr()}은 이제 `name' 이 발견되지 않고 `obj' 가 @ref{6f9,,object.__getattr__()} 또는 @ref{dca,,object.__getattribute__()} 를 재정의하지 않을 때 약 4배 빨라졌습니다. (Contributed by INADA Naoki in bpo-32544@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32544}.)

문자열에서 특정 유니코드 문자 (가령 우크라이나어 “Є”)를 검색하는 것은 다른 문자를 검색하는 것보다 최대 25배까지 느렸습니다. 이제는 최악의 상황에도 겨우 3배 느립니다. (Contributed by Serhiy Storchaka in bpo-24821@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24821}.)

@ref{4e0,,collections.namedtuple()} 팩토리가 재구현되어 네임드 튜플을 4 에서 6배 빠르게 생성합니다. (Contributed by Jelle Zijlstra with further improvements by INADA Naoki, Serhiy Storchaka, and Raymond Hettinger in bpo-28638@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28638}.)

@ref{dcb,,datetime.date.fromordinal()} and @ref{dcc,,datetime.date.fromtimestamp()}
are now up to 30% faster in the common case.
(Contributed by Paul Ganssle in bpo-32403@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32403}.)

@ref{d51,,os.fwalk()} 함수는 @ref{c53,,os.scandir()} 을 사용함으로써 이제 최대 2배 빨라졌습니다. (Contributed by Serhiy Storchaka in bpo-25996@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25996}.)

@ref{c53,,os.scandir()} 함수를 사용하여 @ref{356,,shutil.rmtree()} 함수의 속도가 20–40% 향상되었습니다. (Contributed by Serhiy Storchaka in bpo-28564@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28564}.)

최적화된 @ref{be,,정규식} 의 대소 문자를 구별하지 않는 매칭과 검색. 일부 패턴 검색은 이제 최대 20배까지 빨라질 수 있습니다. (Contributed by Serhiy Storchaka in bpo-30285@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30285}.)

@ref{dcd,,re.compile()} 은 이제 @code{flags} 매개 변수가 @code{RegexFlag} 인 경우 int 객체로 변환합니다. 이제 파이썬 3.5만큼 빠르고, 패턴에 따라 파이썬 3.6보다 약 10% 빠릅니다. (Contributed by INADA Naoki in bpo-31671@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31671}.)

클래스 @ref{dce,,selectors.EpollSelector}, @ref{dcf,,selectors.PollSelector} 와 @ref{dd0,,selectors.DevpollSelector} 의 @ref{dd1,,modify()} 메서드는 높은 부하가 걸릴 때 10% 정도 더 빨라질 수 있습니다. (Contributed by Giampaolo Rodola’ in bpo-30014@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30014})

상수 폴딩은 핍홀 최적화기에서 새로운 AST 최적화기로 이동되어, 더욱 일관된 최적화를 수행 할 수 있습니다. (Contributed by Eugene Toder and INADA Naoki in bpo-29469@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29469} and bpo-11549@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11549}.)

@ref{4,,abc} 에 있는 대부분 함수와 메서드는 C로 재작성되었습니다. 이로 인해 추상 베이스 클래스 생성과, 이에 대한 @ref{2ad,,isinstance()} 와 @ref{9c4,,issubclass()} 호출이 1.5 배 더 빠릅니다. 또한, 파이썬 시작 시간을 최대 10% 단축합니다. (Contributed by Ivan Levkivskyi and INADA Naoki in bpo-31333@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31333})

@ref{1fa,,datetime.date} 와 @ref{4e2,,datetime.datetime} 의 대체 생성자의 경우, 서브 클래스를 만들지 않을 때 파이썬 생성자를 우회해서 속도가 현저히 향상되었습니다. (Contributed by Paul Ganssle in bpo-32403@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32403})

@ref{4c0,,array.array} 인스턴스의 비교 속도가 어떤 경우에는 상당히 향상되었습니다. 같은 정수 형의 값을 보유한 배열을 비교할 때, 이제는 10배에서 70배 빠릅니다. (Contributed by Adrian Wielgosik in bpo-24700@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24700}.)

@ref{dd2,,math.erf()} 와 @ref{dd3,,math.erfc()} 함수는 이제 대부분 플랫폼에서 (더 빠른) C 라이브러리 구현을 사용합니다. (Contributed by Serhiy Storchaka in bpo-26121@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26121}.)

@node 기타 CPython 구현 변경,폐지된 파이썬 동작,최적화<3>,파이썬 3 7의 새로운 기능
@anchor{whatsnew/3 7 other-cpython-implementation-changes}@anchor{dd4}
@subsection 기타 CPython 구현 변경



@itemize *

@item 
트레이스 훅은 이제 추적할 프레임의 새로운 @ref{dd5,,f_trace_lines} 와 @ref{dd6,,f_trace_opcodes} 어트리뷰트를 설정하여, 인터프리터로부터 @code{line} 대신 @code{opcode} 이벤트를 수신하도록 선택할 수 있습니다. (Contributed by Nick Coghlan in bpo-31344@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31344}.)

@item 
이름 공간 패키지 모듈 어트리뷰트에 대한 일관성 문제를 수정했습니다. 이름 공간 모듈 객체는 이제 @code{__file__} 을 @code{None} (이전에는 설정되지 않았습니다)으로 설정하고, @code{__spec__.origin} 도 @code{None} (이전에는 문자열 @code{"namespace"})으로 설정됩니다. bpo-32305@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32305}를 참조하세요. 또한, 이름 공간 모듈 객체의 @code{__spec__.loader} 는 @code{__loader__} 와 같은 값으로 설정됩니다 (이전에는 @code{None} 으로 설정되었습니다). bpo-32303@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32303}을 참조하세요.

@item 
@ref{46f,,locals()} 딕셔너리는 이제 변수가 정의된 어휘 순서로 표시됩니다. 이전에는 순서가 정의되지 않았습니다. (Contributed by Raymond Hettinger in bpo-32690@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32690}.)

@item 
@code{distutils} @code{upload} 명령은 더는 CR 줄 마침 문자를 CRLF로 바꾸려고 시도하지 않습니다. 이것은 CR에 해당하는 바이트로 끝나는 sdists의 손상 문제를 수정합니다. (Contributed by Bo Bayles in bpo-32304@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32304}.)
@end itemize

@node 폐지된 파이썬 동작,폐지된 파이썬 모듈 함수 및 메서드,기타 CPython 구현 변경,파이썬 3 7의 새로운 기능
@anchor{whatsnew/3 7 deprecated-python-behavior}@anchor{dd7}
@subsection 폐지된 파이썬 동작


일드 표현식(@code{yield} 와 @code{yield from} 절 모두)은 이제 컴프리헨션과 제너레이터 표현식에서 폐지되었습니다 (가장 왼쪽의 @code{for} 절의 이터러블 표현식은 제외합니다). 이것은 컴프리헨션이 언제나 적절한 유형의 컨테이너를 즉시 반환하도록 하고(잠재적으로 @ref{dd8,,제너레이터 이터레이터} 객체를 반환하는 것이 아니라), 제너레이터 표현식이 명시적 일드 표현식의 출력 중간에 묵시적 출력을 끼워 넣으려고 시도하지 못하게 하기 위함입니다. 파이썬 3.7에서 이러한 표현식은 컴파일될 때 @ref{1a3,,DeprecationWarning} 을 내보내고, 파이썬 3.8에서는 @ref{18e,,SyntaxError} 가 됩니다. (Contributed by Serhiy Storchaka in bpo-10544@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10544}.)

@ref{197,,complex} 의 서브 클래스를 @ref{7fc,,object.__complex__()} 에서 반환하는 것은 폐지되었고, 향후 파이썬 버전에서 에러가 발생할 것입니다. 이것은 @code{__complex__()} 를 @ref{19d,,object.__int__()} 및 @ref{bc0,,object.__float__()} 와 일관성 있도록 만듭니다. (Contributed by Serhiy Storchaka in bpo-28894@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28894}.)

@node 폐지된 파이썬 모듈 함수 및 메서드,폐지된 C API의 함수 및 형,폐지된 파이썬 동작,파이썬 3 7의 새로운 기능
@anchor{whatsnew/3 7 deprecated-python-modules-functions-and-methods}@anchor{dd9}
@subsection 폐지된 파이썬 모듈, 함수 및 메서드


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

@end menu

@node aifc,asyncio<11>,,폐지된 파이썬 모듈 함수 및 메서드
@anchor{whatsnew/3 7 aifc}@anchor{dda}
@subsubsection aifc


@code{aifc.openfp()} 는 폐지되었고 파이썬 3.9에서 제거될 것입니다. 대신에 @code{aifc.open()} 을 사용하십시오. (Contributed by Brian Curtin in bpo-31985@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31985}.)

@node asyncio<11>,collections<3>,aifc,폐지된 파이썬 모듈 함수 및 메서드
@anchor{whatsnew/3 7 id2}@anchor{ddb}@anchor{whatsnew/3 7 whatsnew37-asyncio-deprecated}@anchor{d13}
@subsubsection asyncio


@ref{c65,,asyncio.Lock} 및 다른 asyncio 동기화 프리미티브의 인스턴스를 직접 @code{await} 하는 지원은 폐지되었습니다. 동기화 자원을 획득하고 해제하기 위해서는 비동기 컨텍스트 관리자를 사용해야 합니다. (Contributed by Andrew Svetlov in bpo-32253@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32253}.)

@code{asyncio.Task.current_task()}와 @code{asyncio.Task.all_tasks()} 메서드는 폐지되었습니다. (Contributed by Andrew Svetlov in bpo-32250@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32250}.)

@node collections<3>,dbm<3>,asyncio<11>,폐지된 파이썬 모듈 함수 및 메서드
@anchor{whatsnew/3 7 id3}@anchor{ddc}
@subsubsection collections


파이썬 3.8에서, @ref{1f,,collections.abc} 의 추상 베이스 클래스는 더는 @ref{1e,,collections} 모듈에 노출되지 않습니다. 이것은 구상 클래스와 추상 베이스 클래스 사이의 명확한 구분을 만드는 데 도움이 됩니다. (Contributed by Serhiy Storchaka in bpo-25988@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25988}.)

@node dbm<3>,enum<6>,collections<3>,폐지된 파이썬 모듈 함수 및 메서드
@anchor{whatsnew/3 7 id4}@anchor{ddd}
@subsubsection dbm


@ref{36,,dbm.dumb} 은 이제 읽기 전용 파일 읽기를 지원하며 변경되지 않았을 때 더는 색인 파일을 쓰지 않습니다. @code{'r'} 및 @code{'w'} 모드에서 색인 파일이 빠지고 새로 만들어지면, 이제 폐지 경고가 표시됩니다 (향후의 파이썬 배포에서는 에러가 발생합니다). (Contributed by Serhiy Storchaka in bpo-28847@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28847}.)

@node enum<6>,gettext<2>,dbm<3>,폐지된 파이썬 모듈 함수 및 메서드
@anchor{whatsnew/3 7 id5}@anchor{dde}
@subsubsection enum


In Python 3.8, attempting to check for non-Enum objects in @ref{841,,Enum}
classes will raise a @ref{198,,TypeError} (e.g. @code{1 in Color}); similarly,
attempting to check for non-Flag objects in a @ref{834,,Flag} member will
raise @code{TypeError} (e.g. @code{1 in Perm.RW}); currently, both operations
return @ref{d2a,,False} instead.
(Contributed by Ethan Furman in bpo-33217@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33217}.)

@node gettext<2>,importlib<5>,enum<6>,폐지된 파이썬 모듈 함수 및 메서드
@anchor{whatsnew/3 7 gettext}@anchor{ddf}
@subsubsection gettext


@ref{67,,gettext} 에서 복수형을 선택하기 위해 정수가 아닌 값을 사용하는 것이 폐지되었습니다. 올바르게 작동된 적이 없습니다. (Contributed by Serhiy Storchaka in bpo-28692@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28692}.)

@node importlib<5>,locale<5>,gettext<2>,폐지된 파이썬 모듈 함수 및 메서드
@anchor{whatsnew/3 7 id6}@anchor{de0}
@subsubsection importlib


메서드 @code{MetaPathFinder.find_module()} (@ref{a68,,MetaPathFinder.find_spec()} 로 대체되었습니다)와 @code{PathEntryFinder.find_loader()} (@ref{a6c,,PathEntryFinder.find_spec()} 로 대체되었습니다) 는 둘 다 파이썬 3.4에서 폐지되었고, 이제는 @ref{1a3,,DeprecationWarning} 을 일으킵니다. (Contributed by Matthias Bussonnier in bpo-29576@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29576}.)

The @ref{de1,,importlib.abc.ResourceLoader} ABC has been deprecated in
favour of @code{importlib.abc.ResourceReader}.

@node locale<5>,macpath,importlib<5>,폐지된 파이썬 모듈 함수 및 메서드
@anchor{whatsnew/3 7 id7}@anchor{de2}
@subsubsection locale


@code{locale.format()} has been deprecated, use @ref{741,,locale.format_string()}
instead.  (Contributed by Garvit in bpo-10379@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10379}.)

@node macpath,threading<6>,locale<5>,폐지된 파이썬 모듈 함수 및 메서드
@anchor{whatsnew/3 7 macpath}@anchor{de3}
@subsubsection macpath


The @code{macpath} is now deprecated and will be removed in Python 3.8.
(Contributed by Chi Hsuan Yen in bpo-9850@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9850}.)

@node threading<6>,socket<7>,macpath,폐지된 파이썬 모듈 함수 및 메서드
@anchor{whatsnew/3 7 threading}@anchor{de4}
@subsubsection threading


@code{dummy_threading}과 @code{_dummy_thread} 는 폐지되었습니다. 스레딩을 비활성화하여 파이썬을 빌드하는 것이 더는 가능하지 않습니다. 대신 @ref{f3,,threading}을 사용하십시오. (Contributed by Antoine Pitrou in bpo-31370@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31370}.)

@node socket<7>,ssl<7>,threading<6>,폐지된 파이썬 모듈 함수 및 메서드
@anchor{whatsnew/3 7 id8}@anchor{de5}
@subsubsection socket


@ref{a7f,,socket.htons()} 와 @ref{a80,,socket.ntohs()} 에서 자동 인자 값 자름은 폐지되었습니다. 이후 버전의 파이썬에서는 전달된 인자가 16비트보다 큰 경우 예외가 발생합니다. (Contributed by Oren Milman in bpo-28332@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28332}.)

@node ssl<7>,sunau,socket<7>,폐지된 파이썬 모듈 함수 및 메서드
@anchor{whatsnew/3 7 id9}@anchor{de6}
@subsubsection ssl


@code{ssl.wrap_socket()} is deprecated.  Use
@ref{747,,ssl.SSLContext.wrap_socket()} instead.
(Contributed by Christian Heimes in bpo-28124@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28124}.)

@node sunau,sys<9>,ssl<7>,폐지된 파이썬 모듈 함수 및 메서드
@anchor{whatsnew/3 7 sunau}@anchor{de7}
@subsubsection sunau


@code{sunau.openfp()} 는 폐지되었고 파이썬 3.9에서 제거될 것입니다. 대신에 @code{sunau.open()} 을 사용하십시오. (Contributed by Brian Curtin in bpo-31985@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31985}.)

@node sys<9>,wave,sunau,폐지된 파이썬 모듈 함수 및 메서드
@anchor{whatsnew/3 7 id10}@anchor{de8}
@subsubsection sys


Deprecated @code{sys.set_coroutine_wrapper()} and
@code{sys.get_coroutine_wrapper()}.

문서로 만들어지지 않은 @code{sys.callstats()} 함수는 폐지되었고 향후 파이썬 버전에서 제거될 것입니다. (Contributed by Victor Stinner in bpo-28799@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28799}.)

@node wave,,sys<9>,폐지된 파이썬 모듈 함수 및 메서드
@anchor{whatsnew/3 7 wave}@anchor{de9}
@subsubsection wave


@code{wave.openfp()} has been deprecated and will be removed in Python 3.9.
Use @ref{b45,,wave.open()} instead.
(Contributed by Brian Curtin in bpo-31985@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31985}.)

@node 폐지된 C API의 함수 및 형,플랫폼 지원 제거,폐지된 파이썬 모듈 함수 및 메서드,파이썬 3 7의 새로운 기능
@anchor{whatsnew/3 7 deprecated-functions-and-types-of-the-c-api}@anchor{dea}
@subsection 폐지된 C API의 함수 및 형


함수 @ref{431,,PySlice_GetIndicesEx()} 는 폐지되었고, @code{Py_LIMITED_API} 가 설정되어 있지 않거나, @code{0x03050400} 과 @code{0x03060000} (포함되지 않음) 사이의 값이나 @code{0x03060100} 이상의 값으로 설정되어 있으면 매크로로 대체됩니다. (Contributed by Serhiy Storchaka in bpo-27867@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27867}.)

@ref{42f,,PyOS_AfterFork()} 는 폐지되었습니다. @ref{db7,,PyOS_BeforeFork()}, @ref{db8,,PyOS_AfterFork_Parent()} 또는 @ref{430,,PyOS_AfterFork_Child()} 를 대신 사용하십시오. (Contributed by Antoine Pitrou in bpo-16500@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16500}.)

@node 플랫폼 지원 제거,API 및 기능 제거<2>,폐지된 C API의 함수 및 형,파이썬 3 7의 새로운 기능
@anchor{whatsnew/3 7 id11}@anchor{deb}@anchor{whatsnew/3 7 platform-support-removals}@anchor{d76}
@subsection 플랫폼 지원 제거



@itemize *

@item 
FreeBSD 9와 그 이전 버전은 더는 공식적으로 지원되지 않습니다.

@item 
확장 모듈 내를 포함하여, 완전한 유니코드 지원을 위해 유닉스 플랫폼은 이제 레거시 @code{ASCII} 기반 @code{C} 로케일의 대안으로, @code{C.UTF-8} (전체 로케일), @code{C.utf8} (전체 로케일) 또는 @code{UTF-8} (@code{LC_CTYPE} 전용 로케일) 중 적어도 하나를 제공할 것으로 기대됩니다.

@item 
OpenSSL 0.9.8 및 1.0.1은 더는 지원되지 않습니다. 이는 여전히 이 버전을 사용하는 이전 플랫폼에서 SSL/TLS를 지원하는 CPython 3.7을 빌드하려면 최신 버전의 OpenSSL에 링크되는 사용자 정의 빌드 옵션이 필요함을 뜻합니다.

특히, 이 문제는 Debian 8 (일명 “jessie”) 및 Ubuntu 14.04 (일명 “Trusty”) LTS 리눅스 배포판에 영향을 미칩니다. 아직 OpenSSL 1.0.1을 기본적으로 사용하기 때문입니다.

Debian 9 (“stretch”) 및 Ubuntu 16.04 (“xenial”) 는, 다른 LTS 리눅스 배포판(가령, RHEL/CentOS 7.5, SLES 12-SP3)의 최신 릴리스 역시, OpenSSL 1.0.2 이상을 사용하고, 기본 빌드 구성에서 여전히 지원됩니다.

CPython의 자체 CI 구성 파일@footnote{https://github.com/python/cpython/blob/v3.7.13/.travis.yml}은 CPython의 테스트 스위트에서 SSL 호환성 테스트 기반시설@footnote{https://github.com/python/cpython/tree/3.14/Tools/ssl/multissltests.py}을 사용하여 구형 시스템이 제공하는 OpenSSL대신 OpenSSL 1.1.0을 빌드하고 링크하는 예를 제공합니다.
@end itemize

@node API 및 기능 제거<2>,모듈 제거,플랫폼 지원 제거,파이썬 3 7의 새로운 기능
@anchor{whatsnew/3 7 api-and-feature-removals}@anchor{dec}
@subsection API 및 기능 제거


다음 기능과 API는 파이썬 3.7에서 제거되었습니다:


@itemize *

@item 
@code{os.stat_float_times()} 함수가 제거되었습니다. 이것은 파이썬 2.2와의 하위 호환성을 위해 파이썬 2.3에서 소개되었으며 파이썬 3.1부터 폐지되었습니다.

@item 
@ref{5a2,,re.sub()} 의 대체 템플릿에 있는 @code{'\'} 와 ASCII 글자로 이루어진 알 수 없는 이스케이프는 파이썬 3.5에서 폐지되었고, 이제는 에러를 일으킵니다.

@item 
@ref{ded,,tarfile.TarFile.add()} 에서 `exclude' 인자의 지원이 제거되었습니다. 파이썬 2.7 및 3.2에서 폐지되었습니다. 대신 `filter' 인자를 사용하십시오.

@item 
@code{ntpath.splitunc()} 함수는 파이썬 3.1에서 폐지되었고, 이제 제거되었습니다. 대신에 @ref{dee,,splitdrive()} 를 사용하십시오.

@item 
@ref{4e0,,collections.namedtuple()}은 네임드 튜플 클래스에 대해 생성된 소스 코드를 보여주는 `verbose' 매개 변수 나 @code{_source} 어트리뷰트를 더는 지원하지 않습니다. 이것은 클래스 생성 속도를 높이기 위해 고안된 최적화 일부입니다. (Contributed by Jelle Zijlstra with further improvements by INADA Naoki, Serhiy Storchaka, and Raymond Hettinger in bpo-28638@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28638}.)

@item 
함수 @ref{3c3,,bool()}, @ref{196,,float()}, @ref{24d,,list()} 그리고 @ref{610,,tuple()} 은 더는 키워드 인자를 취하지 않습니다. @ref{19b,,int()} 의 첫 번째 인자는 이제 위치 인자로만 전달될 수 있습니다.

@item 
Removed previously deprecated in Python 2.4 classes @code{Plist}, @code{Dict} and
@code{_InternalDict} in the @ref{b0,,plistlib} module.  Dict values in the result
of functions @code{readPlist()} and
@code{readPlistFromBytes()} are now normal dicts.  You no longer
can use attribute access to access items of these dictionaries.

@item 
@code{asyncio.windows_utils.socketpair()} 함수가 삭제되었습니다. 대신에 @ref{def,,socket.socketpair()} 함수를 사용하십시오. 파이썬 3.5부터 모든 플랫폼에서 사용할 수 있습니다. @code{asyncio.windows_utils.socketpair} 는 파이썬 3.5 이상에서 @code{socket.socketpair} 의 별칭이었습니다.

@item 
@ref{b,,asyncio} 는 더는 @ref{c7,,selectors}와 @code{_overlapped} 모듈을 @code{asyncio.selectors} 와 @code{asyncio._overlapped} 로 노출하지 않습니다. @code{from asyncio import selectors} 를 @code{import selectors} 로 대체하십시오.

@item 
Direct instantiation of @ref{ae7,,ssl.SSLSocket} and @ref{d79,,ssl.SSLObject}
objects is now prohibited. The constructors were never documented, tested,
or designed as public constructors.  Users were supposed to use
@code{ssl.wrap_socket()} or @ref{357,,ssl.SSLContext}.
(Contributed by Christian Heimes in bpo-32951@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32951}.)

@item 
사용되지 않는 @code{distutils} @code{install_misc} 명령이 제거되었습니다. (Contributed by Eric N. Vander Weele in bpo-29218@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29218}.)
@end itemize

@node 모듈 제거,윈도우 전용 변경,API 및 기능 제거<2>,파이썬 3 7의 새로운 기능
@anchor{whatsnew/3 7 module-removals}@anchor{df0}
@subsection 모듈 제거


@code{fpectl} 모듈이 삭제되었습니다. 기본적으로 활성화된 적이 없고, x86-64에서 제대로 작동한 적도 없고, 예기치 않게 C 확장을 깨뜨리는 방식으로 파이썬 ABI를 변경했습니다. (Contributed by Nathaniel J. Smith in bpo-29137@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29137}.)

@node 윈도우 전용 변경,파이썬 3 7로 이식하기,모듈 제거,파이썬 3 7의 새로운 기능
@anchor{whatsnew/3 7 windows-only-changes}@anchor{df1}
@subsection 윈도우 전용 변경


파이썬 런처(py.exe)는 32비트와 64비트 지정자를 받아들일 수 있는데, 마이너 버전을 지정하지 `않아도' 됩니다. 그래서 @code{py -3.7-32} 뿐만 아니라 @code{py -3-32} 와 @code{py -3-64} 도 유효합니다. 또한 -`m'-64와 -`m.n'-64 형식도 이제 받아들이는데, 지정하지 않을 때 32비트가 사용되는 경우도 64비트 파이썬을 강제합니다. 지정된 버전을 사용할 수 없는 경우 py.exe가 에러를 일으키며 종료됩니다. (Contributed by Steve Barnes in bpo-30291@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30291}.)

런처는 @code{py -0} 처럼 실행시킬 수 있는데, 설치되어있는 파이썬의 목록을 만들고, `기본값을 애스터리스크로 표시합니다'. @code{py -0p} 를 실행하면 경로가 포함됩니다. py가 일치할 수 없는 버전 지정자로 실행되면 사용 가능한 지정자의 `짧은 양식' 목록도 인쇄됩니다. (Contributed by Steve Barnes in bpo-30362@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30362}.)

@node 파이썬 3 7로 이식하기,파이썬 3 7 1의 주목할만한 변경 사항,윈도우 전용 변경,파이썬 3 7의 새로운 기능
@anchor{whatsnew/3 7 porting-to-python-3-7}@anchor{df2}@anchor{whatsnew/3 7 porting-to-python-37}@anchor{cc7}
@subsection 파이썬 3.7로 이식하기


이 섹션에서는 여러분의 코드 수정을 요구하는 앞서 설명한 변경 사항과 버그 수정을 나열합니다.

@menu
* 파이썬 동작의 변경: 파이썬 동작의 변경<2>. 
* 파이썬 API의 변경: 파이썬 API의 변경<4>. 
* C API의 변경: C API의 변경<3>. 
* CPython 바이트 코드 변경: CPython 바이트 코드 변경<3>. 
* 윈도우 전용 변경: 윈도우 전용 변경<2>. 
* 기타 CPython 구현 변경: 기타 CPython 구현 변경<2>. 

@end menu

@node 파이썬 동작의 변경<2>,파이썬 API의 변경<4>,,파이썬 3 7로 이식하기
@anchor{whatsnew/3 7 changes-in-python-behavior}@anchor{df3}
@subsubsection 파이썬 동작의 변경



@itemize *

@item 
@ref{93a,,async}와 @ref{18d,,await} 이름은 이제 예약 키워드입니다. 이 이름을 식별자로 사용하는 코드는 이제 @ref{18e,,SyntaxError} 를 발생시킵니다. (Contributed by Jelle Zijlstra in bpo-30406@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30406}.)

@item 
@geindex Python 향상 제안; PEP 479
PEP 479@footnote{https://peps.python.org/pep-0479/} 는 파이썬 3.7의 모든 코드에서 활성화되었습니다. 즉 코루틴과 제너레이터에서 직접 또는 간접적으로 발생하는 @ref{df4,,StopIteration} 예외는 @ref{244,,RuntimeError} 예외로 변환됩니다. (Contributed by Yury Selivanov in bpo-32670@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32670}.)

@item 
@ref{df5,,object.__aiter__()} 메서드는 더는 비동기로 선언될 수 없습니다. (Contributed by Yury Selivanov in bpo-31709@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31709}.)

@item 
못 보고 넘기는 바람에, 이전 파이썬 버전에서 다음 문법이 받아들여 지는 잘못이 있었습니다:

@example
f(1 for x in [1],)

class C(1 for x in [1]):
    pass
@end example

파이썬 3.7은 이제 올바르게 @ref{18e,,SyntaxError} 를 일으킵니다. 제너레이터 표현식은 항상 괄호 안에 바로 들어가 있어야 하며 양쪽에 쉼표를 넣을 수 없고 중복된 괄호는 오직 호출 시에만 생략 할 수 있습니다. (Contributed by Serhiy Storchaka in bpo-32012@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32012} and bpo-32023@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32023}.)

@item 
@ref{23c,,-m} 스위치를 사용할 때, 이제 빈 문자열 대신에 초기 작업 디렉터리가 @ref{3e4,,sys.path} 에 추가됩니다 (빈 문자열은 각 임포트 시점의 작업 디렉터리가 동적으로 적용되게 만듭니다). 빈 문자열을 검사하는 프로그램이나 이전 동작에 의존하는 프로그램은 그에 따라 업데이트해야 합니다 (예를 들어, 왜 코드가 빈 문자열을 검사했는지에 따라 @code{os.getcwd()} 또는 @code{os.path.dirname(__main__.__file__)} 도 검사해서).
@end itemize

@node 파이썬 API의 변경<4>,C API의 변경<3>,파이썬 동작의 변경<2>,파이썬 3 7로 이식하기
@anchor{whatsnew/3 7 changes-in-the-python-api}@anchor{df6}
@subsubsection 파이썬 API의 변경



@itemize *

@item 
@ref{d6e,,socketserver.ThreadingMixIn.server_close} now waits until all
non-daemon threads complete.  Set the new
@ref{d6f,,socketserver.ThreadingMixIn.block_on_close} class attribute to
@code{False} to get the pre-3.7 behaviour.
(Contributed by Victor Stinner in bpo-31233@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31233} and bpo-33540@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33540}.)

@item 
@ref{d6e,,socketserver.ForkingMixIn.server_close} now waits until all
child processes complete. Set the new
@ref{d6f,,socketserver.ForkingMixIn.block_on_close} class attribute to @code{False}
to get the pre-3.7 behaviour.
(Contributed by Victor Stinner in bpo-31151@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31151} and bpo-33540@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33540}.)

@item 
@ref{df7,,locale.localeconv()} 함수는 이제 일시적으로 @code{LC_CTYPE} 로케일을 @code{LC_NUMERIC} 의 값으로 설정하는 때도 있습니다. (Contributed by Victor Stinner in bpo-31900@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31900}.)

@item 
@ref{df8,,pkgutil.walk_packages()} 는 `path' 가 문자열이면 @ref{2ec,,ValueError} 를 발생시킵니다. 이전에는 빈 리스트가 반환되었습니다. (Contributed by Sanyam Khurana in bpo-24744@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24744}.)

@item 
@ref{df9,,string.Formatter.format()} 의 포맷 문자열 인자는 이제 @ref{c77,,위치-전용} 입니다. 키워드 인자로 전달하는 것은 파이썬 3.5에서 폐지되었습니다. (Contributed by Serhiy Storchaka in bpo-29193@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29193}.)

@item 
클래스 @ref{dfa,,http.cookies.Morsel} 의 어트리뷰트 @ref{dfb,,key}, @ref{dfc,,value} 및 @ref{dfd,,coded_value} 는 이제 읽기 전용입니다. 그들에게 대입하는 것은 파이썬 3.5에서 폐지되었습니다. 그것들을 설정하려면 @ref{dfe,,set()} 메서드를 사용하십시오. (Contributed by Serhiy Storchaka in bpo-29192@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29192}.)

@item 
@ref{52c,,os.makedirs()} 의 `mode' 인자는 더는 새로 생성된 중간 수준 디렉터리의 파일 사용 권한 비트에 영향을 미치지 않습니다. 파일 사용 권한 비트를 설정하기 위해서 @code{makedirs()} 를 호출하기 전에 umask를 설정할 수 있습니다. (Contributed by Serhiy Storchaka in bpo-19930@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19930}.)

@item 
@ref{dff,,struct.Struct.format} 형은 이제 @ref{192,,bytes} 가 아니라 @ref{169,,str} 입니다. (Contributed by Victor Stinner in bpo-21071@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21071}.)

@item 
@code{cgi.parse_multipart()} 는 이제 `encoding' 및 `errors' 인자를 받아들이고 @code{FieldStorage} 과 같은 결과를 반환합니다: 파일이 아닌 필드의 경우 키와 연관된 값은 바이트열이 아니라 문자열의 리스트입니다. (Contributed by Pierre Quentel in bpo-29979@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29979}.)

@item 
@ref{d1,,socket} 의 내부 변경으로 인해, 이번 버전의 파이썬에서 @ref{e00,,socket.share} 로 만들어진 소켓에 @ref{e01,,socket.fromshare()} 를 호출하는 것은 지원되지 않습니다.

@item 
@ref{7d6,,BaseException} 의 @code{repr} 은 후행 쉼표를 포함하지 않도록 변경되었습니다. 대부분의 예외는 이 변경의 영향을 받습니다. (Contributed by Serhiy Storchaka in bpo-30399@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30399}.)

@item 
@ref{bc2,,datetime.timedelta} 의 @code{repr} 은 키워드 인자를 출력에 포함하도록 변경되었습니다. (Contributed by Utkarsh Upadhyay in bpo-30302@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30302}.)

@item 
@ref{356,,shutil.rmtree()} 는 이제 @ref{c53,,os.scandir()} 함수를 사용하여 구현되었으므로, 사용자 지정 처리기 `onerror' 는 이제 디렉터리의 목록을 얻는 데 실패하면 첫 번째 인자가 @code{os.listdir} 대신 @code{os.scandir} 로 호출됩니다.

@item 
유니코드 기술 표준 #18@footnote{https://unicode.org/reports/tr18/} 과같이 정규 표현식에서 중첩 집합 및 집합 연산에 대한 지원이 향후 추가될 수 있습니다. 그러면 문법이 변경됩니다. 미래의 변화를 촉진하기 위해 당분간 모호한 경우에 @ref{657,,FutureWarning} 를 일으킬 것입니다. 이 경우는 리터럴 @code{'['} 로 시작하거나 리터럴 문자 @code{'--'}, @code{'&&'}, @code{'~~'} 및 @code{'||'} 을 포함하는 집합을 포함합니다. 경고를 피하려면 백 슬래시로 이스케이프 처리하십시오. (Contributed by Serhiy Storchaka in bpo-30349@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30349}.)

@item 
빈 문자열과 일치 할 수 있는 @ref{be,,정규식} 으로 문자열을 나눈 결과가 변경되었습니다. 예를 들어, @code{r'\s*'} 로 나누면, 이전처럼 공백 문자뿐만 아니라, 공백 문자가 아닌 문자의 앞과 문자열 끝 바로 직전의 빈 문자열로도 나눕니다. 패턴을 @code{r'\s+'} 로 변경하면 이전의 동작을 복원 할 수 있습니다. 파이썬 3.5부터 그러한 패턴에 대해 @ref{657,,FutureWarning} 을 만들었습니다.

빈 문자열과 비어 있지 않은 문자열 모두와 일치하는 패턴의 경우, 모든 일치를 검색한 결과가 다른 경우에도 변경될 수 있습니다. 예를 들어, 문자열 @code{'a\n\n'} 에서, 패턴 @code{r'(?m)^\s*?$'} 는 위치 2와 3의 빈 문자열을 일치시킬 뿐만 아니라, 위치 2–3의 문자열 @code{'\n'} 도 일치시킵니다. 빈 줄만 일치시키려면, 패턴을 @code{r'(?m)^[^\S\n]*$'} 으로 다시 써야 합니다.

@ref{5a2,,re.sub()}는 이제 이전의 비어 있지 않은 일치에 인접한 빈 일치를 치환합니다. 예를 들어 @code{re.sub('x*', '-', 'abxd')} 는 이제 @code{'-a-b-d-'} 대신에 @code{'-a-b--d-'} 를 돌려줍니다 (‘b’와 ‘d’ 사이의 첫 번째 마이너스는 ‘x’를 치환하고 두 번째 마이너스는 ‘x’와 ‘d’ 사이의 빈 문자열을 치환합니다).

(Contributed by Serhiy Storchaka in bpo-25054@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25054} and bpo-32308@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32308}.)

@item 
변경 @ref{e02,,re.escape()} 가 ASCII 문자, 숫자 및 @code{'_'} 이외의 모든 문자를 이스케이프 하는 대신 정규식 특수 문자만 이스케이프 하도록 변경합니다. (Contributed by Serhiy Storchaka in bpo-29995@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29995}.)

@item 
@ref{d8e,,tracemalloc.Traceback} 프레임은 이제 가장 오래된 것부터 가장 최근의 것 순으로 정렬되어, @ref{104,,traceback} 과 더 일관성 있게 만듭니다. (Contributed by Jesse Bakker in bpo-32121@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32121}.)

@item 
@ref{e03,,socket.SOCK_NONBLOCK} 또는 @ref{e04,,socket.SOCK_CLOEXEC} 비트 플래그를 지원하는 OS에서, @ref{e05,,socket.type} 에 이것들을 더는 적용하지 않습니다. 따라서 @code{if sock.type == socket.SOCK_STREAM} 과 같은 검사는 모든 플랫폼에서 예상대로 작동합니다. (Contributed by Yury Selivanov in bpo-32331@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32331}.)

@item 
윈도우에서 표준 핸들을 리디렉션 할 때 @ref{4b8,,subprocess.Popen} 의 `close_fds' 인자의 기본값이 @ref{d2a,,False} 에서 @ref{e06,,True} 로 변경되었습니다. 이전에 표준 입출력 리디렉션으로 @code{subprocess.Popen} 을 사용할 때 상속된 핸들에 의존했다면, 이전 동작을 유지하기 위해서 @code{close_fds=False} 를 넘기거나 @ref{e07,,STARTUPINFO.lpAttributeList} 를 사용해야 합니다.

@item 
@ref{e08,,importlib.machinery.PathFinder.invalidate_caches()} – 묵시적으로 @ref{e09,,importlib.invalidate_caches()} 에 영향을 줍니다 – 는 이제 @ref{7f9,,sys.path_importer_cache} 에서 @code{None} 으로 설정된 엔트리를 삭제합니다. (Contributed by Brett Cannon in bpo-33169@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33169}.)

@item 
@ref{b,,asyncio} 에서, @ref{e0a,,loop.sock_recv()}, @ref{e0b,,loop.sock_sendall()}, @ref{e0c,,loop.sock_accept()}, @ref{e0d,,loop.getaddrinfo()}, @ref{e0e,,loop.getnameinfo()} 는 문서와 일치하도록 적절한 코루틴 메서드로 변경되었습니다. 이전에는, 이 메서드는 @ref{dc5,,asyncio.Future} 인스턴스를 반환했습니다. (Contributed by Yury Selivanov in bpo-32327@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32327}.)

@item 
@ref{e0f,,asyncio.Server.sockets} 는 이제 내부 서버 소켓 리스트를 직접 돌려주는 대신 사본을 반환합니다. (Contributed by Yury Selivanov in bpo-32662@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32662}.)

@item 
@ref{dff,,Struct.format} 는 @ref{192,,bytes} 인스턴스 대신에 @ref{169,,str} 인스턴스가 되었습니다. (Contributed by Victor Stinner in bpo-21071@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21071}.)

@item 
@code{required=True}를 @ref{e10,,ArgumentParser.add_subparsers()}로 전달하여 @ref{7,,argparse} 부속 파서를 필수로 만들 수 있습니다. (Contributed by Anthony Sottile in bpo-26510@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26510}.)

@item 
@ref{e11,,ast.literal_eval()} 이 이제 더 엄격해졌습니다. 임의 숫자를 더하거나 빼는 것이 더는 허용되지 않습니다. (Contributed by Serhiy Storchaka in bpo-31778@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31778}.)

@item 
@ref{e12,,Calendar.itermonthdates} 는 이제 날짜가 @code{0001-01-01} 에서 @code{9999-12-31} 범위를 벗어나면 일관되게 예외를 일으킵니다. 이러한 예외를 허용할 수 없는 응용 프로그램을 지원하기 위해 새로운 @ref{e13,,Calendar.itermonthdays3} 와 @ref{e14,,Calendar.itermonthdays4} 를 사용할 수 있습니다. 새로운 메서드는 튜플을 반환하고 @ref{1fa,,datetime.date} 에 의해 지원되는 범위에 제한받지 않습니다. (Contributed by Alexander Belopolsky in bpo-28292@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28292}.)

@item 
@ref{e15,,collections.ChainMap} 은 이제 하부 매핑의 순서를 보존합니다. (Contributed by Raymond Hettinger in bpo-32792@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32792}.)

@item 
@ref{948,,concurrent.futures.ThreadPoolExecutor} 와 @ref{1d6,,concurrent.futures.ProcessPoolExecutor} 의 @code{submit()} 메서드는 인터프리터가 종료하는 동안 호출되면 @ref{244,,RuntimeError} 를 발생시킵니다. (Contributed by Mark Nemec in bpo-33097@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33097}.)

@item 
@ref{4de,,configparser.ConfigParser} 생성자는 @code{read_dict()} 를 사용하여 기본값을 처리해서, 그 동작을 파서의 나머지와 일관되게 합니다. 이제 기본 딕셔너리의 문자열이 아닌 키와 값은 묵시적으로 문자열로 변환됩니다. (Contributed by James Tocknell in bpo-23835@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23835}.)

@item 
문서로 만들어지지 않은 여러 가지 내부 임포트가 제거되었습니다. 한 가지 예는 @code{os.errno}를 더는 사용할 수 없다는 것입니다; 대신 @code{import errno}를 직접 사용하십시오. 이러한 문서로 만들어지지 않은 내부 임포트는, 마이크로 버전 배포에서도, 언제든지 예고 없이 삭제될 수 있음에 유의하십시오.
@end itemize

@node C API의 변경<3>,CPython 바이트 코드 변경<3>,파이썬 API의 변경<4>,파이썬 3 7로 이식하기
@anchor{whatsnew/3 7 changes-in-the-c-api}@anchor{e16}
@subsubsection C API의 변경


함수 @ref{431,,PySlice_GetIndicesEx()} 는 크기 조절이 가능한 시퀀스에 대해 안전하지 않은 것으로 간주합니다. 슬라이스 인덱스가 @ref{19b,,int} 의 인스턴스가 아니라 @code{__index__()} 메서드를 구현하는 객체인 경우, 시퀀스는 길이를 @code{PySlice_GetIndicesEx()} 에 전달한 후 크기를 조정할 수 있습니다. 이로 인해 시퀀스의 길이를 벗어나는 인덱스가 반환될 수 있습니다. 가능한 문제를 피하려면 @ref{432,,PySlice_Unpack()}과 @ref{433,,PySlice_AdjustIndices()} 라는 새로운 함수를 사용하십시오. (Contributed by Serhiy Storchaka in bpo-27867@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27867}.)

@node CPython 바이트 코드 변경<3>,윈도우 전용 변경<2>,C API의 변경<3>,파이썬 3 7로 이식하기
@anchor{whatsnew/3 7 cpython-bytecode-changes}@anchor{e17}
@subsubsection CPython 바이트 코드 변경


There are two new opcodes: @code{LOAD_METHOD} and @code{CALL_METHOD}.
(Contributed by Yury Selivanov and INADA Naoki in bpo-26110@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26110}.)

@code{STORE_ANNOTATION} 옵코드가 삭제되었습니다. (Contributed by Mark Shannon in bpo-32550@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32550}.)

@node 윈도우 전용 변경<2>,기타 CPython 구현 변경<2>,CPython 바이트 코드 변경<3>,파이썬 3 7로 이식하기
@anchor{whatsnew/3 7 id12}@anchor{e18}
@subsubsection 윈도우 전용 변경


@ref{3e4,,sys.path} 를 재정의하는데 사용되는 파일은 이제 @code{'sys.path'} 대신에 @code{<python-executable>._pth} 라고 불립니다. 자세한 정보는 @ref{e19,,모듈 찾기} 를 보십시오. (Contributed by Steve Dower in bpo-28137@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28137}.)

@node 기타 CPython 구현 변경<2>,,윈도우 전용 변경<2>,파이썬 3 7로 이식하기
@anchor{whatsnew/3 7 id13}@anchor{e1a}
@subsubsection 기타 CPython 구현 변경


공개된 CPython 실행시간 초기화 API에 가해질 잠재적인 미래의 변경을 준비하기 위해 (초기의, 하지만 약간 낡은 초안은 
@geindex Python 향상 제안; PEP 432
PEP 432@footnote{https://peps.python.org/pep-0432/}를 보십시오), CPython의 내부 시작 및 구성 관리 로직이 상당히 리팩토링 되었습니다. 이러한 업데이트는 내장형 응용 프로그램과 일반 CPython CLI의 사용자 모두에게 완전히 투명하도록 의도했지만, 리팩토링 변경이 인터프리터 시작 시 다양한 작업의 내부 순서를 변경하므로 내장형 응용 프로그램과 CPython 자체에서 잠재 결함을 드러낼 수 있으므로 여기에서 언급합니다. (처음에는 Nick Coghlan과 Eric Snow가 bpo-22257@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22257} 의 일부로 이바지했고, Nick, Eric, Victor Stinner가 여러 이슈를 통해 추가로 업데이트했습니다). 영향을 받는 일부 알려진 세부 정보는 이렇습니다:


@itemize *

@item 
@code{PySys_AddWarnOptionUnicode()} 는 @code{Py_Initialize}를 호출하기 전에 유니코드 객체를 생성해야 하는 요구사항 때문에 현재 내장형 응용 프로그램에서는 사용할 수 없습니다. 대신에 @code{PySys_AddWarnOption()} 을 사용하십시오.

@item 
@code{PySys_AddWarnOption()}으로 내장형 응용 프로그램이 추가한 경고 필터는 이제 인터프리터가 설정한 기본 필터보다 더 일관되게 우선해야 합니다.
@end itemize

기본 경고 필터가 구성되는 방식의 변경으로 인해, @ref{406,,Py_BytesWarningFlag} 를 1보다 큰 값으로 설정하는 것이 더는 @ref{e1b,,BytesWarning} 메시지를 내보내면서 동시에 예외로 변환되도록 하기에 충분하지 못합니다. 대신, 플래그를 설정해야 하고 (경고가 처음에 발생하도록), 예외로 변환하기 위해 명시적으로 @code{error::BytesWarning} 경고 필터를 추가해야 합니다.

컴파일러가 독스트링을 처리하는 방식의 변화 때문에, 독스트링만으로 구성된 함수 바디의 묵시적인 @code{return None} 은, 이제 함수의 헤더 행이 아니라 독스트링과 같은 줄에 등장하는 것으로 표시됩니다.

현재 예외 상태가 프레임 객체에서 코루틴으로 옮겨졌습니다. 이는 인터프리터를 간소화하고 제너레이터에 들어가거나 빠져나갈 때 예외 상태를 스와프함으로써 발생하는 모호한 두 가지 버그를 수정했습니다. (Contributed by Mark Shannon in bpo-25612@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25612}.)

@node 파이썬 3 7 1의 주목할만한 변경 사항,파이썬 3 7 2의 주목할만한 변경 사항,파이썬 3 7로 이식하기,파이썬 3 7의 새로운 기능
@anchor{whatsnew/3 7 notable-changes-in-python-3-7-1}@anchor{e1c}
@subsection 파이썬 3.7.1의 주목할만한 변경 사항


3.7.1부터, @ref{460,,Py_Initialize()}는 이제 @ref{e1d,,Py_Main()}과 같은 환경 설정을 일관되게 읽고 존중합니다 (이전 파이썬 버전에서는, 환경 변수 중 잘 정의되지 않은 부분 집합을 존중했지만 파이썬 3.7.0에서는 bpo-34247@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34247}로 인해 아무것도 읽지 않았습니다). 이 동작을 원하지 않으면, @code{Py_Initialize()}를 호출하기 전에 @ref{40a,,Py_IgnoreEnvironmentFlag}를 1로 설정하십시오.

3.7.1에서, 컨텍스트 변수를 위한 C API는 @ref{5dc,,PyObject} 포인터를 사용하도록 @ref{e1e,,변경되었습니다}. bpo-34762@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34762}를 참조하세요.

3.7.1에서, @ref{101,,tokenize} 모듈은 끝에 줄 바꿈이 없는 입력이 제공될 때 묵시적으로 @code{NEWLINE} 토큰을 산출합니다. 이 동작은 이제 C 토크나이저가 내부적으로 수행하는 것과 일치합니다. (Contributed by Ammar Askar in bpo-33899@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33899}.)

@node 파이썬 3 7 2의 주목할만한 변경 사항,파이썬 3 7 6의 주목할만한 변경 사항,파이썬 3 7 1의 주목할만한 변경 사항,파이썬 3 7의 새로운 기능
@anchor{whatsnew/3 7 notable-changes-in-python-3-7-2}@anchor{e1f}
@subsection 파이썬 3.7.2의 주목할만한 변경 사항


3.7.2에서, 윈도우에서 @ref{117,,venv}는 더는 원본 바이너리를 복사하지 않고, 대신 @code{python.exe} 와 @code{pythonw.exe}라는 리디렉터 스크립트를 만듭니다. 이렇게 하면 각 파이썬 업데이트마다 모든 가상 환경을 업그레이드하거나 다시 만들어야 하는 오랜 문제를 해결할 수 있습니다. 그러나, 이 배포에서는 새 스크립트를 얻기 위해 가상 환경을 다시 만들어야 함에 유의하세요.

@node 파이썬 3 7 6의 주목할만한 변경 사항,파이썬 3 7 10의 주목할만한 변경 사항,파이썬 3 7 2의 주목할만한 변경 사항,파이썬 3 7의 새로운 기능
@anchor{whatsnew/3 7 notable-changes-in-python-3-7-6}@anchor{e20}
@subsection 파이썬 3.7.6의 주목할만한 변경 사항


심각한 보안 문제로 인해, @ref{93b,,asyncio.loop.create_datagram_endpoint()}의 `reuse_address' 매개 변수는 더는 지원되지 않습니다. 이것은 UDP에서 소켓 옵션 @code{SO_REUSEADDR}의 동작 때문입니다. 자세한 내용은 @code{loop.create_datagram_endpoint()} 설명서를 참조하십시오. (Contributed by Kyle Stanley, Antoine Pitrou, and Yury Selivanov in bpo-37228@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37228}.)

@node 파이썬 3 7 10의 주목할만한 변경 사항,파이썬 3 7 11의 주목할만한 변경 사항,파이썬 3 7 6의 주목할만한 변경 사항,파이썬 3 7의 새로운 기능
@anchor{whatsnew/3 7 notable-changes-in-python-3-7-10}@anchor{e21}
@subsection 파이썬 3.7.10의 주목할만한 변경 사항


이전 파이썬 버전에서는 @ref{31f,,urllib.parse.parse_qs()}와 @ref{31e,,urllib.parse.parse_qsl()}에서 쿼리 매개 변수 구분자로 @code{;}과 @code{&}를 모두 사용할 수 있었습니다. 보안 문제와 최신 W3C 권장 사항을 준수하기 위해, @code{&}가 기본값인 단일 구분자 키만 허용하도록 변경되었습니다. 이 변경 사항은 영향을 받는 함수를 내부적으로 사용하므로 @code{cgi.parse()}와 @code{cgi.parse_multipart()}에도 영향을 줍니다. 자세한 내용은 해당 설명서를 참조하십시오. (Contributed by Adam Goldschmidt, Senthil Kumaran and Ken Jin in bpo-42967@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42967}.)

@node 파이썬 3 7 11의 주목할만한 변경 사항,파이썬 3 7 14의 주목할만한 보안 기능,파이썬 3 7 10의 주목할만한 변경 사항,파이썬 3 7의 새로운 기능
@anchor{whatsnew/3 7 notable-changes-in-python-3-7-11}@anchor{e22}
@subsection 파이썬 3.7.11의 주목할만한 변경 사항


A security fix alters the @ref{af6,,ftplib.FTP} behavior to not trust the
IPv4 address sent from the remote server when setting up a passive data
channel.  We reuse the ftp server IP address instead.  For unusual code
requiring the old behavior, set a @code{trust_server_pasv_ipv4_address}
attribute on your FTP instance to @code{True}.  (See gh-87451@footnote{https://github.com/python/cpython/issues/87451})

The presence of newline or tab characters in parts of a URL allows for some
forms of attacks. Following the WHATWG specification that updates RFC 3986,
ASCII newline @code{\n}, @code{\r} and tab @code{\t} characters are stripped from the
URL by the parser @ref{110,,urllib.parse()} preventing such attacks. The removal
characters are controlled by a new module level variable
@code{urllib.parse._UNSAFE_URL_BYTES_TO_REMOVE}. (See gh-88048@footnote{https://github.com/python/cpython/issues/88048})

@node 파이썬 3 7 14의 주목할만한 보안 기능,,파이썬 3 7 11의 주목할만한 변경 사항,파이썬 3 7의 새로운 기능
@anchor{whatsnew/3 7 notable-security-feature-in-3-7-14}@anchor{e23}
@subsection 파이썬 3.7.14의 주목할만한 보안 기능


Converting between @ref{19b,,int} and @ref{169,,str} in bases other than 2
(binary), 4, 8 (octal), 16 (hexadecimal), or 32 such as base 10 (decimal)
now raises a @ref{2ec,,ValueError} if the number of digits in string form is
above a limit to avoid potential denial of service attacks due to the
algorithmic complexity. This is a mitigation for 
@geindex Common Vulnerabilities and Exposures; CVE 2020-10735
CVE 2020-10735@footnote{https://www.cve.org/CVERecord?id=CVE-2020-10735}.
This limit can be configured or disabled by environment variable, command
line flag, or @ref{df,,sys} APIs. See the @ref{80a,,integer string conversion length limitation} documentation.  The default limit
is 4300 digits in string form.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 파이썬 3 6의 새로운 기능,파이썬 3 5의 새로운 기능,파이썬 3 7의 새로운 기능,파이썬의 새로운 기능
@anchor{whatsnew/3 6 doc}@anchor{e24}@anchor{whatsnew/3 6 translation-repo}@anchor{e25}@anchor{whatsnew/3 6 what-s-new-in-python-3-6}@anchor{e26}
@section 파이썬 3.6의 새로운 기능


@*편집자: 
Elvis Pranskevichus <@email{elvis@@magic.io}>, Yury Selivanov <@email{yury@@magic.io}>


@c Rules for maintenance:
@c 
@c * Anyone can add text to this document.  Do not spend very much time
@c on the wording of your changes, because your text will probably
@c get rewritten to some degree.
@c 
@c * The maintainer will go through Misc/NEWS periodically and add
@c changes; it's therefore more important to add your changes to
@c Misc/NEWS than to this file.
@c 
@c * This is not a complete list of every single change; completeness
@c is the purpose of Misc/NEWS.  Some changes I consider too small
@c or esoteric to include.  If such a change is added to the text,
@c I'll just remove it.  (This is another reason you shouldn't spend
@c too much time on writing your addition.)
@c 
@c * If you want to draw your new text to the attention of the
@c maintainer, add 'XXX' to the beginning of the paragraph or
@c section.
@c 
@c * It's OK to just add a fragmentary note about a change.  For
@c example: "XXX Describe the transmogrify() function added to the
@c socket module."  The maintainer will research the change and
@c write the necessary text.
@c 
@c * You can comment out your additions if you like, but it's not
@c necessary (especially when a final release is some months away).
@c 
@c * Credit the author of a patch or bugfix.   Just the name is
@c sufficient; the e-mail address isn't necessary.
@c 
@c * It's helpful to add the bug/patch number as a comment:
@c 
@c XXX Describe the transmogrify() function added to the socket
@c module.
@c (Contributed by P.Y. Developer in :issue:`12345`.)
@c 
@c This saves the maintainer the effort of going through the Mercurial log
@c when researching a change.

This article explains the new features in Python 3.6, compared to 3.5.
Python 3.6 was released on December 23, 2016.  See the
changelog@footnote{https://docs.python.org/3.6/whatsnew/changelog.html} for a full
list of changes.


@subsubheading 더 보기


@geindex Python 향상 제안; PEP 494
PEP 494@footnote{https://peps.python.org/pep-0494/} - 파이썬 3.6 출시 일정


@menu
* 요약 – 배포 주요 사항: 요약 – 배포 주요 사항<4>. 
* 새로운 기능: 새로운 기능<5>. 
* 기타 언어 변경: 기타 언어 변경<5>. 
* 새로운 모듈:: 
* 개선된 모듈: 개선된 모듈<4>. 
* 최적화: 최적화<4>. 
* 빌드와 C API 변경: 빌드와 C API 변경<2>. 
* 기타 개선 사항:: 
* 폐지: 폐지<3>. 
* 제거: 제거<3>. 
* 파이썬 3.6으로 이식하기: 파이썬 3 6으로 이식하기. 
* 파이썬 3.6.2의 주목할만한 변경 사항: 파이썬 3 6 2의 주목할만한 변경 사항. 
* 파이썬 3.6.4의 주목할만한 변경 사항: 파이썬 3 6 4의 주목할만한 변경 사항. 
* 파이썬 3.6.5의 주목할만한 변경 사항: 파이썬 3 6 5의 주목할만한 변경 사항. 
* 파이썬 3.6.7의 주목할만한 변경 사항: 파이썬 3 6 7의 주목할만한 변경 사항. 
* 파이썬 3.6.10의 주목할만한 변경 사항: 파이썬 3 6 10의 주목할만한 변경 사항. 
* 파이썬 3.6.13의 주목할만한 변경 사항: 파이썬 3 6 13의 주목할만한 변경 사항. 
* 파이썬 3.6.14의 주목할만한 변경 사항: 파이썬 3 6 14의 주목할만한 변경 사항. 

@end menu

@node 요약 – 배포 주요 사항<4>,새로운 기능<5>,,파이썬 3 6의 새로운 기능
@anchor{whatsnew/3 6 summary-release-highlights}@anchor{e27}
@subsection 요약 – 배포 주요 사항


새로운 문법 기능:


@itemize *

@item 
@ref{e28,,PEP 498}, 포맷 문자열 리터럴.

@item 
@ref{e29,,PEP 515}, 숫자 리터럴의 밑줄.

@item 
@ref{e2a,,PEP 526}, 변수 어노테이션 문법.

@item 
@ref{e2b,,PEP 525}, 비동기 제너레이터.

@item 
@ref{e2c,,PEP 530}: 비동기 컴프리헨션.
@end itemize

새로운 라이브러리 모듈:


@itemize *

@item 
@ref{c5,,secrets}: @ref{e2d,,PEP 506 – 표준 라이브러리에 secret 모듈 추가}.
@end itemize

CPython 구현 개선:


@itemize *

@item 
@ref{cbc,,dict} 형은 Raymond Hettinger의 제안@footnote{https://mail.python.org/pipermail/python-dev/2012-December/123028.html}에 기반한 @ref{e2e,,더욱더 간결한 표현}을 사용하도록 재구현되었으며 PyPy 딕셔너리 구현@footnote{https://morepypy.blogspot.com/2015/01/faster-more-memory-efficient-and-more.html}과 유사합니다. 이로 인해 파이썬 3.5와 비교할 때 딕셔너리가 20%에서 25% 적은 메모리를 사용하게 되었습니다.

@item 
@ref{e2f,,새 프로토콜}로 클래스 생성의 사용자 정의가 단순화되었습니다.

@item 
클래스 어트리뷰트 정의 순서는 @ref{e30,,이제 보존됩니다}.

@item 
@code{**kwargs}의 요소 순서는 이제 키워드 인자가 함수에 전달된 @ref{e31,,순서에 해당합니다}.

@item 
DTrace와 SystemTap @ref{e32,,프로브 지원}이 추가되었습니다.

@item 
이제 새로운 @ref{e33,,PYTHONMALLOC} 환경 변수를 사용하여 인터프리터 메모리 할당과 액세스 에러를 디버깅 할 수 있습니다.
@end itemize

표준 라이브러리 대폭 개선:


@itemize *

@item 
@ref{b,,asyncio} 모듈은 새로운 기능, 상당한 사용성 및 성능 향상, 상당한 양의 버그 수정을 받았습니다. 파이썬 3.6부터 @code{asyncio} 모듈은 더는 잠정적이지 않으며 해당 API는 안정적인 것으로 간주합니다.

@item 
@ref{5a0,,경로류 객체}를 지원하기 위해 새로운 @ref{e34,,파일 시스템 경로 프로토콜}이 구현되었습니다. 경로에서 작동하는 모든 표준 라이브러리 함수가 새 프로토콜과 함께 작동하도록 갱신되었습니다.

@item 
@ref{34,,datetime} 모듈은 @ref{e35,,현지 시간 명확성}에 대한 지원을 얻었습니다.

@item 
@ref{10a,,typing} 모듈은 여러 @ref{e36,,개선}을 받았습니다.

@item 
@ref{105,,tracemalloc} 모듈은 크게 다시 작업 되었으며 이제 @ref{54e,,ResourceWarning}에 대해 더 나은 출력을 제공하고 메모리 할당 에러에 대한 더 나은 진단을 제공하는 데 사용됩니다. 자세한 내용은 @ref{e33,,PYTHONMALLOC 섹션}을 참조하십시오.
@end itemize

보안 향상:


@itemize *

@item 
새로운 @ref{c5,,secrets} 모듈이 추가되어 계정 인증, 토큰 등과 같은 비밀 관리에 적합한 암호화 된 강력한 의사 난수 생성을 단순화합니다.

@item 
리눅스에서, @ref{745,,os.urandom()}은 이제 보안을 강화하기 위해 시스템 urandom 엔트로피 풀이 초기화될 때까지 블록합니다. 근거는 
@geindex Python 향상 제안; PEP 524
PEP 524@footnote{https://peps.python.org/pep-0524/}를 참조하십시오.

@item 
@ref{6c,,hashlib}와 @ref{d5,,ssl} 모듈은 이제 OpenSSL 1.1.0을 지원합니다.

@item 
@ref{d5,,ssl} 모듈의 기본 설정과 기능 집합이 개선되었습니다.

@item 
@ref{6c,,hashlib} 모듈은 BLAKE2, SHA-3 및 SHAKE 해시 알고리즘과 @ref{e37,,scrypt()} 키 파생 함수에 대한 지원을 받았습니다.
@end itemize

윈도우 개선:


@itemize *

@item 
@ref{e38,,PEP 528}과 @ref{e39,,PEP 529}, 윈도우 파일 시스템과 콘솔 인코딩이 UTF-8로 변경되었습니다.

@item 
@code{py.exe} 런처는 대화식으로 사용할 때 사용자가 버전을 지정하지 않을 때 (명령 줄 인자나 구성 파일을 통해) 더는 파이썬 3보다 파이썬 2를 선호하지 않습니다. 셔뱅 줄의 처리는 변경되지 않았습니다 - 이 경우 “python”은 파이썬 2를 나타냅니다.

@item 
@code{python.exe}와 @code{pythonw.exe}는 긴 경로 인식으로 표시되어서, 260자 경로 제한이 더는 적용되지 않을 수 있음을 뜻합니다. 자세한 내용은 @ref{e3a,,MAX_PATH 제한 제거}를 참조하십시오.

@item 
@code{._pth} 파일을 추가하여 격리 모드를 강제 적용하고 모든 검색 경로를 완전히 지정하여 레지스트리와 환경 조회를 방지할 수 있습니다. 자세한 정보는 @ref{e19,,설명서}를 참조하십시오.

@item 
이제 @code{python36.zip} 파일이 
@geindex PYTHONHOME
@geindex 환경 변수; PYTHONHOME
@ref{3f0,,PYTHONHOME}을 추론하는 랜드 마크로 작동합니다. 자세한 정보는 @ref{e19,,설명서}를 참조하십시오.
@end itemize

@node 새로운 기능<5>,기타 언어 변경<5>,요약 – 배포 주요 사항<4>,파이썬 3 6의 새로운 기능
@anchor{whatsnew/3 6 new-features}@anchor{e3b}@anchor{whatsnew/3 6 pypy-dict-implementation}@anchor{e3c}
@subsection 새로운 기능


@menu
* PEP 498; 포맷 문자열 리터럴: PEP 498 포맷 문자열 리터럴. 
* PEP 526; 변수 어노테이션 문법: PEP 526 변수 어노테이션 문법. 
* PEP 515; 숫자 리터럴의 밑줄: PEP 515 숫자 리터럴의 밑줄. 
* PEP 525; 비동기 제너레이터: PEP 525 비동기 제너레이터. 
* PEP 530; 비동기 컴프리헨션: PEP 530 비동기 컴프리헨션. 
* PEP 487; 더 간단한 클래스 생성 사용자 정의: PEP 487 더 간단한 클래스 생성 사용자 정의. 
* PEP 487; 디스크립터 프로토콜 향상: PEP 487 디스크립터 프로토콜 향상. 
* PEP 519; 파일 시스템 경로 프로토콜 추가: PEP 519 파일 시스템 경로 프로토콜 추가. 
* PEP 495; 현지 시간 명확성: PEP 495 현지 시간 명확성. 
* PEP 529; 윈도우 파일 시스템 인코딩을 UTF-8로 변경: PEP 529 윈도우 파일 시스템 인코딩을 UTF-8로 변경. 
* PEP 528; 윈도우 콘솔 인코딩을 UTF-8로 변경: PEP 528 윈도우 콘솔 인코딩을 UTF-8로 변경. 
* PEP 520; 클래스 어트리뷰트 정의 순서 유지: PEP 520 클래스 어트리뷰트 정의 순서 유지. 
* PEP 468; 키워드 인자 순서 유지: PEP 468 키워드 인자 순서 유지. 
* 새로운 dict 구현:: 
* PEP 523; CPython에 프레임 평가 API 추가: PEP 523 CPython에 프레임 평가 API 추가. 
* PYTHONMALLOC 환경 변수:: 
* DTrace와 SystemTap 프로브 지원:: 

@end menu

@node PEP 498 포맷 문자열 리터럴,PEP 526 변수 어노테이션 문법,,새로운 기능<5>
@anchor{whatsnew/3 6 pep-498-formatted-string-literals}@anchor{e3d}@anchor{whatsnew/3 6 whatsnew36-pep498}@anchor{e28}
@subsubsection PEP 498: 포맷 문자열 리터럴


@geindex Python 향상 제안; PEP 498
PEP 498@footnote{https://peps.python.org/pep-0498/}은 새로운 종류의 문자열 리터럴 `f-문자열(f-strings)', 또는 @ref{19a,,포맷 문자열 리터럴}을 도입합니다.

포맷 문자열 리터럴은 @code{'f'}를 접두어로 사용하고 @ref{832,,str.format()}에서 허용하는 포맷 문자열과 유사합니다. 중괄호로 둘러싸인 치환 필드가 포함됩니다. 치환 필드는 실행 시간에 평가된 다음 @ref{199,,format()} 프로토콜을 사용하여 포맷되는 표현식입니다:

@example
>>> name = "Fred"
>>> f"He said his name is @{name@}."
'He said his name is Fred.'
>>> width = 10
>>> precision = 4
>>> value = decimal.Decimal("12.34567")
>>> f"result: @{value:@{width@}.@{precision@}@}"  # 중첩된 필드
'result:      12.35'
@end example


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 498

@item PEP 498@footnote{https://peps.python.org/pep-0498/} – 리터럴 문자열 보간.

Eric V. Smith가 작성하고 구현한 PEP.
@end table

@ref{19a,,기능 설명서}.


@node PEP 526 변수 어노테이션 문법,PEP 515 숫자 리터럴의 밑줄,PEP 498 포맷 문자열 리터럴,새로운 기능<5>
@anchor{whatsnew/3 6 pep-526-syntax-for-variable-annotations}@anchor{e3e}@anchor{whatsnew/3 6 whatsnew36-pep526}@anchor{e2a}
@subsubsection PEP 526: 변수 어노테이션 문법


@geindex Python 향상 제안; PEP 484
PEP 484@footnote{https://peps.python.org/pep-0484/}는 함수 매개 변수의 형 어노테이션, 일명 형 힌트에 대한 표준을 도입했습니다. 이 PEP는 클래스 변수와 인스턴스 변수를 포함한 변수 형에 어노테이트하기 위해 파이썬에 구문을 추가합니다:

@example
primes: List[int] = []

captain: str  # 노트: 초깃값이 없습니다!

class Starship:
    stats: Dict[str, int] = @{@}
@end example

함수 어노테이션과 마찬가지로, 파이썬 인터프리터는 변수 어노테이션에 특별한 의미를 부여하지 않고 클래스나 모듈의 @code{__annotations__} 어트리뷰트에 저장하기만 합니다.

정적으로 타이핑된 언어의 변수 선언과 달리, 어노테이션 문법의 목표는 추상 구문 트리와 @code{__annotations__} 어트리뷰트를 통해 제삼자 도구와 라이브러리를 위해 구조화된 형 메타 데이터를 쉽게 지정할 방법을 제공하는 것입니다.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 526

@item PEP 526@footnote{https://peps.python.org/pep-0526/} – 변수 어노테이션 문법.

Ryan Gonzalez, Philip House, Ivan Levkivskyi, Lisa Roach 및 Guido van Rossum이 작성한 PEP. Ivan Levkivskyi가 구현했습니다.
@end table

새 문법을 사용하거나 사용할 도구: mypy@footnote{https://www.mypy-lang.org/}, pytype@footnote{https://github.com/google/pytype}, PyCharm 등.


@node PEP 515 숫자 리터럴의 밑줄,PEP 525 비동기 제너레이터,PEP 526 변수 어노테이션 문법,새로운 기능<5>
@anchor{whatsnew/3 6 pep-515-underscores-in-numeric-literals}@anchor{e3f}@anchor{whatsnew/3 6 whatsnew36-pep515}@anchor{e29}
@subsubsection PEP 515: 숫자 리터럴의 밑줄


@geindex Python 향상 제안; PEP 515
PEP 515@footnote{https://peps.python.org/pep-0515/}는 가독성을 높이기 위해 숫자 리터럴에 밑줄을 사용하는 기능을 추가합니다. 예를 들면:

@example
>>> 1_000_000_000_000_000
1000000000000000
>>> 0x_FF_FF_FF_FF
4294967295
@end example

숫자 사이와 진수 지정자(base specifier) 뒤에 단일 밑줄이 허용됩니다. 선행, 후행 또는 여러 밑줄이 연속해서 나오는 것은 허용되지 않습니다.

@ref{4f9,,문자열 포매팅} 언어는 이제 부동 소수점 표시형과 정수 표시형 @code{'d'}에 대해 천 단위 구분자에 밑줄 사용을 알리는 @code{'_'} 옵션을 지원합니다. 정수 표시형 @code{'b'}, @code{'o'}, @code{'x'} 및 @code{'X'}의 경우, 밑줄이 4자리마다 삽입됩니다:

@example
>>> '@{:_@}'.format(1000000)
'1_000_000'
>>> '@{:_x@}'.format(0xFFFFFFFF)
'ffff_ffff'
@end example


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 515

@item PEP 515@footnote{https://peps.python.org/pep-0515/} – 숫자 리터럴의 밑줄

Georg Brandl과 Serhiy Storchaka가 작성한 PEP.
@end table


@node PEP 525 비동기 제너레이터,PEP 530 비동기 컴프리헨션,PEP 515 숫자 리터럴의 밑줄,새로운 기능<5>
@anchor{whatsnew/3 6 pep-525-asynchronous-generators}@anchor{e40}@anchor{whatsnew/3 6 whatsnew36-pep525}@anchor{e2b}
@subsubsection PEP 525: 비동기 제너레이터


@geindex Python 향상 제안; PEP 492
PEP 492@footnote{https://peps.python.org/pep-0492/}는 파이썬 3.5에 네이티브 코루틴과 @code{async} / @code{await} 구문에 대한 지원을 도입했습니다. 파이썬 3.5 구현의 주목할만한 제한은 같은 함수 본문에서 @code{await}와 @code{yield}를 사용할 수 없다는 것입니다. 파이썬 3.6에서는 이 제한이 해제되어 `비동기 제너레이터(asynchronous generators)'를 정의할 수 있습니다:

@example
async def ticker(delay, to):
    """0 에서 *to* 까지의 숫자를 *delay* 초마다 일드합니다."""
    for i in range(to):
        yield i
        await asyncio.sleep(delay)
@end example

새로운 문법은 더 빠르고 간결한 코드를 허용합니다.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 525

@item PEP 525@footnote{https://peps.python.org/pep-0525/} – 비동기 제너레이터

Yury Selivanov가 작성하고 구현한 PEP.
@end table


@node PEP 530 비동기 컴프리헨션,PEP 487 더 간단한 클래스 생성 사용자 정의,PEP 525 비동기 제너레이터,새로운 기능<5>
@anchor{whatsnew/3 6 pep-530-asynchronous-comprehensions}@anchor{e41}@anchor{whatsnew/3 6 whatsnew36-pep530}@anchor{e2c}
@subsubsection PEP 530: 비동기 컴프리헨션


@geindex Python 향상 제안; PEP 530
PEP 530@footnote{https://peps.python.org/pep-0530/}은 리스트, 집합, 딕셔너리 컴프리헨션과 제너레이터 표현식에서 @code{async for} 사용에 대한 지원을 추가합니다:

@example
result = [i async for i in aiter() if i % 2]
@end example

또한, @code{await} 표현식은 모든 종류의 컴프리헨션에서 지원됩니다:

@example
result = [await fun() for fun in funcs if await condition()]
@end example


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 530

@item PEP 530@footnote{https://peps.python.org/pep-0530/} – 비동기 컴프리헨션

Yury Selivanov가 작성하고 구현한 PEP.
@end table


@node PEP 487 더 간단한 클래스 생성 사용자 정의,PEP 487 디스크립터 프로토콜 향상,PEP 530 비동기 컴프리헨션,새로운 기능<5>
@anchor{whatsnew/3 6 pep-487-simpler-customization-of-class-creation}@anchor{e42}@anchor{whatsnew/3 6 whatsnew36-pep487}@anchor{e2f}
@subsubsection PEP 487: 더 간단한 클래스 생성 사용자 정의


이제 메타 클래스를 사용하지 않고도 서브 클래스 생성을 사용자 정의할 수 있습니다. 새 서브 클래스가 만들어질 때마다 새 @code{__init_subclass__} 클래스 메서드가 베이스 클래스에서 호출됩니다:

@example
class PluginBase:
    subclasses = []

    def __init_subclass__(cls, **kwargs):
        super().__init_subclass__(**kwargs)
        cls.subclasses.append(cls)

class Plugin1(PluginBase):
    pass

class Plugin2(PluginBase):
    pass
@end example

인자가 없는 @ref{1a6,,super()} 호출이 @ref{842,,__init_subclass__()} 구현에서 올바르게 작동하도록 하기 위해, 사용자 정의 메타 클래스에서 새 @code{__classcell__} 이름 공간 항목이 @code{type.__new__}로 전파되도록 해야 합니다 (@ref{e43,,클래스 객체 만들기}에 설명되었듯이).


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 487

@item PEP 487@footnote{https://peps.python.org/pep-0487/} – 더 간단한 클래스 생성 사용자 정의

Martin Teichmann이 작성하고 구현한 PEP.
@end table

@ref{e44,,기능 설명서}


@node PEP 487 디스크립터 프로토콜 향상,PEP 519 파일 시스템 경로 프로토콜 추가,PEP 487 더 간단한 클래스 생성 사용자 정의,새로운 기능<5>
@anchor{whatsnew/3 6 pep-487-descriptor-protocol-enhancements}@anchor{e45}@anchor{whatsnew/3 6 whatsnew36-pep487-descriptors}@anchor{e46}
@subsubsection PEP 487: 디스크립터 프로토콜 향상


@geindex Python 향상 제안; PEP 487
PEP 487@footnote{https://peps.python.org/pep-0487/}은 새로운 선택적 @ref{e47,,__set_name__()} 메서드를 포함하도록 디스크립터 프로토콜을 확장합니다. 새 클래스가 정의될 때마다, 정의에 포함된 모든 디스크립터에 대해 새 메서드가 호출되어, 정의되는 클래스에 대한 참조와 클래스 이름 공간 내에서 디스크립터에 지정된 이름을 제공합니다. 즉, 디스크립터의 인스턴스는 이제 소유자 클래스에 있는 디스크립터의 어트리뷰트 이름을 알 수 있습니다:

@example
class IntField:
    def __get__(self, instance, owner):
        return instance.__dict__[self.name]

    def __set__(self, instance, value):
        if not isinstance(value, int):
            raise ValueError(f'expecting integer in @{self.name@}')
        instance.__dict__[self.name] = value

    # this is the new initializer:
    def __set_name__(self, owner, name):
        self.name = name

class Model:
    int_field = IntField()
@end example


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 487

@item PEP 487@footnote{https://peps.python.org/pep-0487/} – 더 간단한 클래스 생성 사용자 정의

Martin Teichmann이 작성하고 구현한 PEP.
@end table

@ref{e48,,기능 설명서}


@node PEP 519 파일 시스템 경로 프로토콜 추가,PEP 495 현지 시간 명확성,PEP 487 디스크립터 프로토콜 향상,새로운 기능<5>
@anchor{whatsnew/3 6 pep-519-adding-a-file-system-path-protocol}@anchor{e49}@anchor{whatsnew/3 6 whatsnew36-pep519}@anchor{e34}
@subsubsection PEP 519: 파일 시스템 경로 프로토콜 추가


파일 시스템 경로는 역사적으로 @ref{169,,str}이나 @ref{192,,bytes} 객체로 표현되었습니다. 이로 인해 파일 시스템 경로에서 작동하는 코드를 작성하는 사람들은 이러한 객체가 두 형 중 하나일 뿐이라고 가정합니다 (파일 기술자를 나타내는 @ref{19b,,int}는 파일 경로가 아니기 때문에 고려하지 않습니다). 불행히도 이러한 가정은 @ref{a8,,pathlib}와 같은 파일 시스템 경로의 대체 객체 표현이 파이썬의 표준 라이브러리를 포함하여 기존 코드와 함께 작동하지 못하게 합니다.

이 상황을 해결하기 위해, @ref{e4a,,os.PathLike}으로 표현되는 새 인터페이스가 정의되었습니다. @ref{e4b,,__fspath__()} 메서드를 구현하면, 객체가 경로를 나타낸다는 신호를 보내는 것입니다. 그런 다음 객체는 파일 시스템 경로의 저수준 표현을 @ref{169,,str}이나 @ref{192,,bytes} 객체로 제공할 수 있습니다. 이것은 @code{os.PathLike}을 구현하거나 파일 시스템 경로를 나타내는 @code{str}나 @code{bytes} 객체면 객체를 @ref{5a0,,경로류}로 간주함을 뜻합니다. 코드는 @ref{e4c,,os.fspath()}, @ref{e4d,,os.fsdecode()} 또는 @ref{e4e,,os.fsencode()}를 사용하여 경로류 객체의 @code{str} 및/또는 @code{bytes} 표현을 명시적으로 얻을 수 있습니다.

내장 @ref{316,,open()} 함수는 @ref{a5,,os}와 @ref{a6,,os.path} 모듈의 모든 관련 함수와 표준 라이브러리의 대부분의 다른 함수와 클래스와 마찬가지로, @ref{e4a,,os.PathLike} 객체를 받아들이도록 갱신되었습니다. @ref{6c2,,os.DirEntry} 클래스와 @ref{a8,,pathlib}의 관련 클래스도 @code{os.PathLike}을 구현하도록 갱신되었습니다.

기대하는 것은 파일 시스템 경로에서 작동하는 기반 함수들을 갱신하면 코드 변경 없이, 혹은 최소한의 변경만으로도 (예를 들어 경로류 객체에 대한 연산 전에 코드 시작 부분에서 @ref{e4c,,os.fspath()}를 호출하기), 제삼자 코드가 모든 @ref{5a0,,경로류 객체}를 묵시적으로 지원하게 되는 것입니다.

다음은 새 인터페이스를 사용하여 @ref{266,,pathlib.Path}를 기존 코드로보다 쉽고 투명하게 사용할 수 있는 방법에 대한 몇 가지 예입니다:

@example
>>> import pathlib
>>> with open(pathlib.Path("README")) as f:
...     contents = f.read()
...
>>> import os.path
>>> os.path.splitext(pathlib.Path("some_file.txt"))
('some_file', '.txt')
>>> os.path.join("/a/b", pathlib.Path("c"))
'/a/b/c'
>>> import os
>>> os.fspath(pathlib.Path("some_file.txt"))
'some_file.txt'
@end example

(Implemented by Brett Cannon, Ethan Furman, Dusty Phillips, and Jelle Zijlstra.)


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 519

@item PEP 519@footnote{https://peps.python.org/pep-0519/} – 파일 시스템 경로 프로토콜 추가

Brett Cannon과 Koos Zevenhoven이 작성한 PEP.
@end table


@node PEP 495 현지 시간 명확성,PEP 529 윈도우 파일 시스템 인코딩을 UTF-8로 변경,PEP 519 파일 시스템 경로 프로토콜 추가,새로운 기능<5>
@anchor{whatsnew/3 6 pep-495-local-time-disambiguation}@anchor{e4f}@anchor{whatsnew/3 6 whatsnew36-pep495}@anchor{e35}
@subsubsection PEP 495: 현지 시간 명확성


대부분의 세계 위치에서, 현지 시계가 뒤로 이동하는 시간이 있었고 앞으로도 있을 것입니다. 이 시간에는, 현지 시계가 같은 날에 같은 시간을 두 번 표시하는 간격이 도입되었습니다. 이러한 상황에서, 현지 시계에 표시되는 (또는 파이썬 datetime 인스턴스에 저장된) 정보는 특정 시점을 식별하기에 충분하지 않습니다.

@geindex Python 향상 제안; PEP 495
PEP 495@footnote{https://peps.python.org/pep-0495/}는 @ref{4e2,,datetime.datetime}과 @ref{1fb,,datetime.time} 클래스의 인스턴스에 새로운 `fold' 어트리뷰트를 추가하여 현지 시간이 같은 두 순간을 구별합니다:

@example
>>> u0 = datetime(2016, 11, 6, 4, tzinfo=timezone.utc)
>>> for i in range(4):
...     u = u0 + i*HOUR
...     t = u.astimezone(Eastern)
...     print(u.time(), 'UTC =', t.time(), t.tzname(), t.fold)
...
04:00:00 UTC = 00:00:00 EDT 0
05:00:00 UTC = 01:00:00 EDT 0
06:00:00 UTC = 01:00:00 EST 1
07:00:00 UTC = 02:00:00 EST 0
@end example

@ref{e50,,fold} 어트리뷰트의 값은 모호한 경우의 두 번째 (시간순으로) 순간을 나타내는 인스턴스를 제외한 모든 인스턴스에 대해 @code{0} 값을 갖습니다.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 495

@item PEP 495@footnote{https://peps.python.org/pep-0495/} – 현지 시간 명확성

Alexander Belopolsky와 Tim Peters가 작성하고 Alexander Belopolsky가 구현한 PEP.
@end table


@node PEP 529 윈도우 파일 시스템 인코딩을 UTF-8로 변경,PEP 528 윈도우 콘솔 인코딩을 UTF-8로 변경,PEP 495 현지 시간 명확성,새로운 기능<5>
@anchor{whatsnew/3 6 pep-529-change-windows-filesystem-encoding-to-utf-8}@anchor{e51}@anchor{whatsnew/3 6 whatsnew36-pep529}@anchor{e39}
@subsubsection PEP 529: 윈도우 파일 시스템 인코딩을 UTF-8로 변경


파일 시스템 경로를 나타내는 것은 bytes가 아닌 str(유니코드)로 수행하는 것이 가장 좋습니다. 그러나, bytes 사용이 충분하고 올바른 경우가 있습니다.

파이썬 3.6 이전에는, 윈도우에서 bytes 경로를 사용할 때 데이터 손실이 발생할 수 있습니다. 이 변경으로 인해, 이제 윈도우에서 bytes를 사용하여 경로를 나타내는 것이 지원됩니다. 단, 해당 bytes는 @ref{e52,,sys.getfilesystemencoding()}에서 반환한 인코딩으로 인코딩되며, 현재 기본값은 @code{'utf-8'}입니다.

경로를 나타내기 위해 str을 사용하지 않는 응용 프로그램은 @ref{e4e,,os.fsencode()}와 @ref{e4d,,os.fsdecode()}를 사용하여 해당 bytes가 올바르게 인코딩되도록 해야 합니다. 이전 동작으로 되돌리려면, 
@geindex PYTHONLEGACYWINDOWSFSENCODING
@geindex 환경 변수; PYTHONLEGACYWINDOWSFSENCODING
@ref{33f,,PYTHONLEGACYWINDOWSFSENCODING}을 설정하거나 @ref{33e,,sys._enablelegacywindowsfsencoding()}을 호출하십시오.

필요한 코드 수정에 대한 자세한 정보와 논의는 
@geindex Python 향상 제안; PEP 529
PEP 529@footnote{https://peps.python.org/pep-0529/}를 참조하십시오.

@node PEP 528 윈도우 콘솔 인코딩을 UTF-8로 변경,PEP 520 클래스 어트리뷰트 정의 순서 유지,PEP 529 윈도우 파일 시스템 인코딩을 UTF-8로 변경,새로운 기능<5>
@anchor{whatsnew/3 6 pep-528-change-windows-console-encoding-to-utf-8}@anchor{e53}@anchor{whatsnew/3 6 whatsnew36-pep528}@anchor{e38}
@subsubsection PEP 528: 윈도우 콘솔 인코딩을 UTF-8로 변경


윈도우의 기본 콘솔은 이제 모든 유니코드 문자를 허용하고 파이썬 코드에 올바르게 읽힌 str 객체를 제공합니다. @code{sys.stdin}, @code{sys.stdout} 및 @code{sys.stderr}은 이제 utf-8 인코딩으로 기본 설정됩니다.

이 변경은 대화 형 콘솔을 사용할 때만 적용되며, 파일이나 파이프를 리디렉션 할 때는 적용되지 않습니다. 대화식 콘솔 사용 시에 이전 동작으로 되돌리려면, 
@geindex PYTHONLEGACYWINDOWSSTDIO
@geindex 환경 변수; PYTHONLEGACYWINDOWSSTDIO
@ref{e54,,PYTHONLEGACYWINDOWSSTDIO}를 설정하십시오.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 528

@item PEP 528@footnote{https://peps.python.org/pep-0528/} – 윈도우 콘솔 인코딩을 UTF-8로 변경

Steve Dower가 작성하고 구현한 PEP.
@end table


@node PEP 520 클래스 어트리뷰트 정의 순서 유지,PEP 468 키워드 인자 순서 유지,PEP 528 윈도우 콘솔 인코딩을 UTF-8로 변경,새로운 기능<5>
@anchor{whatsnew/3 6 pep-520-preserving-class-attribute-definition-order}@anchor{e55}@anchor{whatsnew/3 6 whatsnew36-pep520}@anchor{e30}
@subsubsection PEP 520: 클래스 어트리뷰트 정의 순서 유지


클래스 정의 본문의 어트리뷰트는 자연스러운 순서를 갖습니다: 이름이 소스에 나타나는 것과 같은 순서. 이 순서는 이제 새 클래스의 @ref{e56,,__dict__} 어트리뷰트에 유지됩니다.

또한, 유효한 기본 클래스 `실행' 이름 공간(@ref{e57,,type.__prepare__()}에서 반환되는 것)은 이제 삽입 순서 보존 매핑입니다.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 520

@item PEP 520@footnote{https://peps.python.org/pep-0520/} – 클래스 어트리뷰트 정의 순서 유지

Eric Snow가 작성하고 구현한 PEP.
@end table


@node PEP 468 키워드 인자 순서 유지,새로운 dict 구현,PEP 520 클래스 어트리뷰트 정의 순서 유지,새로운 기능<5>
@anchor{whatsnew/3 6 pep-468-preserving-keyword-argument-order}@anchor{e58}@anchor{whatsnew/3 6 whatsnew36-pep468}@anchor{e31}
@subsubsection PEP 468: 키워드 인자 순서 유지


함수 서명의 @code{**kwargs}는 이제 삽입 순서 보존 매핑임이 보장됩니다.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 468

@item PEP 468@footnote{https://peps.python.org/pep-0468/} – 키워드 인자 순서 유지

Eric Snow가 작성하고 구현한 PEP.
@end table


@node 새로운 dict 구현,PEP 523 CPython에 프레임 평가 API 추가,PEP 468 키워드 인자 순서 유지,새로운 기능<5>
@anchor{whatsnew/3 6 new-dict-implementation}@anchor{e59}@anchor{whatsnew/3 6 whatsnew36-compactdict}@anchor{e2e}
@subsubsection 새로운 dict 구현


@ref{cbc,,dict} 형은 이제 PyPy에서 처음 구현된@footnote{https://morepypy.blogspot.com/2015/01/faster-more-memory-efficient-and-more.html} Raymond Hettinger의 제안@footnote{https://mail.python.org/pipermail/python-dev/2012-December/123028.html}에 기반한 “간결한” 표현을 사용합니다. 새로운 @ref{183,,dict()}의 메모리 사용량은 파이썬 3.5에 비해 20%에서 25% 더 적습니다.

이 새로운 구현의 순서 보존 측면은 구현 세부 사항으로 간주하며 이에 의존해서는 안 됩니다 (향후에 변경될 수 있지만, 현재와 미래의 모든 파이썬 구현에 대해 순서 보존 의미 체계를 의무화하도록 언어 명세를 변경하기 전에 몇 번의 릴리스에서 이 새로운 dict 구현을 언어에 포함하는 것이 바람직합니다; 이것은 또한 무작위 이터레이션 순서가 여전히 유효한 언어의 이전 버전과의 과거 호환성을 유지하는 데 도움이 됩니다, 예를 들어 파이썬 3.5).

(Contributed by INADA Naoki in bpo-27350@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27350}. 원래 Raymond Hettinger가 제안한@footnote{https://mail.python.org/pipermail/python-dev/2012-December/123028.html} 아이디어.)

@node PEP 523 CPython에 프레임 평가 API 추가,PYTHONMALLOC 환경 변수,새로운 dict 구현,새로운 기능<5>
@anchor{whatsnew/3 6 pep-523-adding-a-frame-evaluation-api-to-cpython}@anchor{e5a}@anchor{whatsnew/3 6 whatsnew36-pep523}@anchor{e5b}
@subsubsection PEP 523: CPython에 프레임 평가 API 추가


파이썬은 코드 실행 방법을 사용자 정의하기 위한 광범위한 지원을 제공하지만, 빠진 한 가지는 프레임 객체를 평가하는 것입니다. 파이썬에서 프레임 평가를 가로채는 방법을 원한다면 정의된 함수에 대한 함수 포인터를 직접 조작하지 않고는 방법이 없었습니다.

@geindex Python 향상 제안; PEP 523
PEP 523@footnote{https://peps.python.org/pep-0523/}은 프레임 평가를 C 수준에서 끼워 넣을 수 있도록 하는 API를 제공하여 이를 바꿉니다. 이를 통해 디버거와 JIT과 같은 도구가 파이썬 코드 실행이 시작되기 전에 프레임 평가를 가로챌 수 있습니다. 이를 통해 파이썬 코드의 대체 평가 구현, 추적 프레임 평가 등이 가능해집니다.

이 API는 제한된 C API의 일부가 아니며 이 API의 사용이 제한적일 것으로 기대하고, 매우 선별된 저수준 사용 사례에만 적용 가능함을 알리기 위해 비공개로 표시됩니다. API의 의미는 필요에 따라 파이썬과 함께 변경됩니다.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 523

@item PEP 523@footnote{https://peps.python.org/pep-0523/} – CPython에 프레임 평가 API 추가

Brett Cannon과 Dino Viehland가 작성한 PEP.
@end table


@node PYTHONMALLOC 환경 변수,DTrace와 SystemTap 프로브 지원,PEP 523 CPython에 프레임 평가 API 추가,새로운 기능<5>
@anchor{whatsnew/3 6 pythonmalloc-environment-variable}@anchor{e5c}@anchor{whatsnew/3 6 whatsnew36-pythonmalloc}@anchor{e33}
@subsubsection PYTHONMALLOC 환경 변수


새로운 
@geindex PYTHONMALLOC
@geindex 환경 변수; PYTHONMALLOC
@ref{e5d,,PYTHONMALLOC} 환경 변수를 사용하면 파이썬 메모리 할당자를 설정하고 디버그 훅을 설치할 수 있습니다.

이제 @code{PYTHONMALLOC=debug}를 사용하여 릴리스 모드로 컴파일된 파이썬의 파이썬 메모리 할당자에 디버그 훅을 설치할 수 있습니다. 디버그 훅의 효과:


@itemize *

@item 
새로 할당된 메모리는 @code{0xCB} 바이트로 채워집니다

@item 
해제된 메모리는 @code{0xDB} 바이트로 채워집니다

@item 
파이썬 메모리 할당자 API 위반을 감지합니다. 예를 들어, @ref{e5e,,PyMem_Malloc()}에 의해 할당된 메모리 블록에 대해 호출된 @ref{e5f,,PyObject_Free()}.

@item 
버퍼 시작 앞에 쓰기를 감지합니다 (버퍼 언더플로)

@item 
버퍼 끝 뒤에 쓰기를 감지합니다 (버퍼 오버플로)

@item 
@ref{e60,,PYMEM_DOMAIN_OBJ}(예: @ref{e61,,PyObject_Malloc()})와 @ref{e62,,PYMEM_DOMAIN_MEM}(예: @ref{e5e,,PyMem_Malloc()}) 도메인의 할당자 함수가 호출될 때 @ref{474,,GIL}을 잡았는지 확인합니다.
@end itemize

GIL을 잡았는지 확인하는 것도 파이썬 3.6의 새로운 기능입니다.

파이썬 메모리 할당자에 대한 디버그 훅은 @ref{e63,,PyMem_SetupDebugHooks()} 함수를 참조하십시오.

이제 @code{PYTHONMALLOC=malloc}을 사용해서 모든 파이썬 메모리 할당에 대해 C 라이브러리의 @code{malloc()} 할당자를 강제로 사용하게 할 수도 있습니다. 이것은 릴리스 모드로 컴파일된 파이썬에 Valgrind와 같은 외부 메모리 디버거를 사용할 때 유용합니다.

에러 시, 파이썬 메모리 할당자의 디버그 훅은 이제 @ref{105,,tracemalloc} 모듈을 사용하여 메모리 블록이 할당된 트레이스백을 가져옵니다.

@code{python3.6 -X tracemalloc=5}(트레이스에 5개 프레임을 저장합니다)를 사용하는 버퍼 오버플로로 인한 치명적인 에러의 예:

@example
Debug memory block at address p=0x7fbcd41666f8: API 'o'
    4 bytes originally requested
    The 7 pad bytes at p-7 are FORBIDDENBYTE, as expected.
    The 8 pad bytes at tail=0x7fbcd41666fc are not all FORBIDDENBYTE (0xfb):
        at tail+0: 0x02 *** OUCH
        at tail+1: 0xfb
        at tail+2: 0xfb
        at tail+3: 0xfb
        at tail+4: 0xfb
        at tail+5: 0xfb
        at tail+6: 0xfb
        at tail+7: 0xfb
    The block was made by call #1233329 to debug malloc/realloc.
    Data at p: 1a 2b 30 00

Memory block allocated at (most recent call first):
  File "test/test_bytes.py", line 323
  File "unittest/case.py", line 600
  File "unittest/case.py", line 648
  File "unittest/suite.py", line 122
  File "unittest/suite.py", line 84

Fatal Python error: bad trailing pad byte

Current thread 0x00007fbcdbd32700 (most recent call first):
  File "test/test_bytes.py", line 323 in test_hex
  File "unittest/case.py", line 600 in run
  File "unittest/case.py", line 648 in __call__
  File "unittest/suite.py", line 122 in run
  File "unittest/suite.py", line 84 in __call__
  File "unittest/suite.py", line 122 in run
  File "unittest/suite.py", line 84 in __call__
  ...
@end example

(Contributed by Victor Stinner in bpo-26516@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26516} and bpo-26564@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26564}.)

@node DTrace와 SystemTap 프로브 지원,,PYTHONMALLOC 환경 변수,새로운 기능<5>
@anchor{whatsnew/3 6 dtrace-and-systemtap-probing-support}@anchor{e64}@anchor{whatsnew/3 6 whatsnew36-tracing}@anchor{e32}
@subsubsection DTrace와 SystemTap 프로브 지원


이제 파이썬은 인터프리터에서 다음 이벤트에 대한 정적 마커를 활성화하는 @code{--with-dtrace}로 빌드 할 수 있습니다:


@itemize *

@item 
함수 호출/반환

@item 
가비지 수거 시작/완료

@item 
실행된 코드 줄.
@end itemize

이것은 특정 @ref{508,,디버그 빌드}를 다시 컴파일하거나 응용 프로그램별 프로파일링/디버깅 코드를 제공할 필요 없이, 프로덕션에서 실행 중인 인터프리터를 계측하는 데 사용할 수 있습니다.

자세한 내용은 @ref{e65,,DTrace와 SystemTap으로 CPython 계측하기}에 있습니다.

현재 구현은 리눅스와 macOS에서 테스트되었습니다. 향후 추가 마커가 추가될 수 있습니다.

(Contributed by Łukasz Langa in bpo-21590@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21590}, based on patches by
Jesús Cea Avión, David Malcolm, and Nikhil Benesch.)

@node 기타 언어 변경<5>,새로운 모듈,새로운 기능<5>,파이썬 3 6의 새로운 기능
@anchor{whatsnew/3 6 other-language-changes}@anchor{e66}
@subsection 기타 언어 변경


핵심 파이썬 언어에 대한 몇 가지 작은 변경 사항은 다음과 같습니다:


@itemize *

@item 
@code{global}이나 @code{nonlocal} 문은 이제 같은 스코프에서 영향을 받는 이름을 처음 사용하기 전에 텍스트로 나타나야 합니다. 이전에는 @ref{1ae,,SyntaxWarning}이었습니다.

@item 
It is now possible to set a @ref{e67,,special method} to
@code{None} to indicate that the corresponding operation is not available.
For example, if a class sets @ref{e68,,__iter__()} to @code{None}, the class
is not iterable.
(Contributed by Andrew Barnert and Ivan Levkivskyi in bpo-25958@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25958}.)

@item 
반복되는 트레이스백 줄의 긴 시퀀스는 이제 @code{"[Previous line repeated @{count@} more times]"}로 축약됩니다 (예는 @ref{e69,,traceback} 을 참조하십시오). (Contributed by Emanuel Barry in bpo-26823@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26823}.)

@item 
임포트는 이제 모듈을 찾을 수 없을 때 새로운 예외 @ref{d3c,,ModuleNotFoundError}(@ref{659,,ImportError}의 서브 클래스)를 발생시킵니다. 현재 (try-except에서) ImportError를 확인하는 코드는 계속 작동합니다. (Contributed by Eric Snow in bpo-15767@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15767}.)

@item 
인자가 없는 @code{super()}에 의존하는 클래스 메서드는 이제 클래스 생성 중에 메타 클래스 메서드에서 호출될 때 올바르게 작동합니다. (Contributed by Martin Teichmann in bpo-23722@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23722}.)
@end itemize

@node 새로운 모듈,개선된 모듈<4>,기타 언어 변경<5>,파이썬 3 6의 새로운 기능
@anchor{whatsnew/3 6 new-modules}@anchor{e6a}
@subsection 새로운 모듈


@menu
* secrets:: 

@end menu

@node secrets,,,새로운 모듈
@anchor{whatsnew/3 6 secrets}@anchor{e6b}@anchor{whatsnew/3 6 whatsnew36-pep506}@anchor{e2d}
@subsubsection secrets


새로운 @ref{c5,,secrets} 모듈의 주요 목적은 계정 인증, 토큰 등과 같은 비밀 관리에 적합한 암호학적으로 강력한 의사 난수 값을 신뢰성 있게 생성할 수 있는 확실한 방법을 제공하는 것입니다.

@cartouche
@quotation 경고 
@ref{bd,,random} 모듈의 의사 난수 생성기는 보안 목적으로 사용하지 `않아야' 합니다. 파이썬 3.6 이상에서는 @ref{c5,,secrets}를 사용하고 파이썬 3.5와 이전 버전에서는 @ref{745,,os.urandom()}을 사용하십시오.
@end quotation
@end cartouche


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 506

@item PEP 506@footnote{https://peps.python.org/pep-0506/} – 표준 라이브러리에 비밀 모듈 추가

Steven D’Aprano 가 작성하고 구현한 PEP.
@end table


@node 개선된 모듈<4>,최적화<4>,새로운 모듈,파이썬 3 6의 새로운 기능
@anchor{whatsnew/3 6 improved-modules}@anchor{e6c}
@subsection 개선된 모듈


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

@end menu

@node array<4>,ast<6>,,개선된 모듈<4>
@anchor{whatsnew/3 6 array}@anchor{e6d}
@subsubsection array


@ref{4c0,,array.array}의 소진된 이터레이터는 이제 이터레이트 되는 배열이 확장된 경우에도 소진된 상태로 유지됩니다. 이것은 다른 가변 시퀀스의 동작과 일치합니다.

Contributed by Serhiy Storchaka in bpo-26492@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26492}.

@node ast<6>,asyncio<12>,array<4>,개선된 모듈<4>
@anchor{whatsnew/3 6 ast}@anchor{e6e}
@subsubsection ast


새로운 @ref{2ef,,ast.Constant} AST 노드가 추가되었습니다. 상수 폴딩을 위해 외부 AST 최적화기에서 사용할 수 있습니다.

Contributed by Victor Stinner in bpo-26146@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26146}.

@node asyncio<12>,Binascii,ast<6>,개선된 모듈<4>
@anchor{whatsnew/3 6 asyncio}@anchor{e6f}
@subsubsection asyncio


파이썬 3.6부터 @code{asyncio} 모듈은 더는 잠정적이 아니며 해당 API는 안정적인 것으로 간주합니다.

파이썬 3.5.0 이후 @ref{b,,asyncio} 모듈의 주목할만한 변경 사항 (잠정적 상태로 인해 모두 3.5.x로 역 이식되었습니다):


@itemize *

@item 
@ref{2f2,,get_event_loop()} 함수는 코루틴과 콜백에서 호출될 때 항상 현재 실행 중인 루프를 반환하도록 변경되었습니다. (Contributed by Yury Selivanov in bpo-28613@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28613}.)

@item 
@ref{e70,,ensure_future()} 함수와 이를 사용하는 모든 함수(가령 @ref{e71,,loop.run_until_complete()})는 이제 모든 종류의 @ref{4c9,,어웨이터블 객체}를 받아들입니다. (Contributed by Yury Selivanov.)

@item 
다른 스레드의 이벤트 루프에 코루틴을 제출하는 새로운 @ref{a82,,run_coroutine_threadsafe()} 함수. (Contributed by Vincent Michel.)

@item 
트랜스포트가 닫히고 있거나 닫혔는지 확인하는 새로운 @ref{e72,,Transport.is_closing()} 메서드. (Contributed by Yury Selivanov.)

@item 
@ref{d08,,loop.create_server()} 메서드는 이제 호스트 리스트를 받아들일 수 있습니다. (Contributed by Yann Sionneau.)

@item 
Future 객체를 만드는 새로운 @ref{e73,,loop.create_future()} 메서드. 이를 통해 uvloop@footnote{https://github.com/MagicStack/uvloop}와 같은 대체 이벤트 루프 구현이 더 빠른 @ref{dc5,,asyncio.Future} 구현을 제공할 수 있습니다. (Contributed by Yury Selivanov in bpo-27041@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27041}.)

@item 
현재 예외 처리기를 가져오는 새로운 @ref{e74,,loop.get_exception_handler()} 메서드. (Contributed by Yury Selivanov in bpo-27040@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27040}.)

@item 
구분자 바이트 시퀀스가 나타날 때까지 스트림에서 데이터를 읽는 새로운 @ref{4d1,,StreamReader.readuntil()} 메서드. (Contributed by Mark Korenberg.)

@item 
@ref{e75,,StreamReader.readexactly()}의 성능이 향상되었습니다. (Contributed by Mark Korenberg in bpo-28370@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28370}.)

@item 
@ref{e0d,,loop.getaddrinfo()} 메서드는 주소가 이미 결정되었으면 시스템 @code{getaddrinfo} 함수를 호출하지 않도록 최적화되었습니다. (Contributed by A. Jesse Jiryu Davis.)

@item 
현재 이터레이션 직후 루프를 중지하도록 @ref{e76,,loop.stop()} 메서드가 변경되었습니다. 마지막 이터레이션의 결과로 예약된 모든 새 콜백은 버려집니다. (Contributed by Guido van Rossum in bpo-25593@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25593}.)

@item 
@ref{e77,,Future.set_exception}
will now raise @ref{198,,TypeError} when passed an instance of
the @ref{df4,,StopIteration} exception.
(Contributed by Chris Angelico in bpo-26221@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26221}.)

@item 
asyncio 외부의 연결을 받아들이지만 이를 처리하기 위해 asyncio를 사용하는 서버에서 사용할 새로운 @ref{9de,,loop.connect_accepted_socket()} 메서드. (Contributed by Jim Fulton in bpo-27392@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27392}.)

@item 
@code{TCP_NODELAY} 플래그는 이제 기본적으로 모든 TCP 트랜스포트에 대해 설정됩니다. (Contributed by Yury Selivanov in bpo-27456@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27456}.)

@item 
루프를 닫기 전에 계류 중인 비동기 제너레이터를 제대로 닫는 새로운 @ref{e78,,loop.shutdown_asyncgens()}. (Contributed by Yury Selivanov in bpo-28003@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28003}.)

@item 
@ref{dc5,,Future}와 @ref{1c7,,Task} 클래스는 이제 asyncio 코드를 최대 30% 더 빠르게 만드는 최적화된 C 구현을 갖습니다. (Contributed by Yury Selivanov and INADA Naoki in bpo-26081@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26081} and bpo-28544@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28544}.)
@end itemize

@node Binascii,cmath,asyncio<12>,개선된 모듈<4>
@anchor{whatsnew/3 6 binascii}@anchor{e79}
@subsubsection Binascii


@ref{e7a,,b2a_base64()} 함수는 이제 반환 값에 줄 넘김 문자를 추가할지를 제어하기 위해 선택적 `newline' 키워드 인자를 받아들입니다. (Contributed by Victor Stinner in bpo-25357@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25357}.)

@node cmath,collections<4>,Binascii,개선된 모듈<4>
@anchor{whatsnew/3 6 cmath}@anchor{e7b}
@subsubsection cmath


새로운 @ref{e7c,,cmath.tau} (`τ') 상수가 추가되었습니다. (Contributed by Lisa Roach in bpo-12345@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12345}, see 
@geindex Python 향상 제안; PEP 628
PEP 628@footnote{https://peps.python.org/pep-0628/} for details.)

새로운 상수: @ref{e7d,,math.inf}와 @ref{872,,math.nan}과 일치하는 @ref{e7e,,cmath.inf}와 @ref{e7f,,cmath.nan}, 그리고 복소수 repr에서 사용하는 형식과 일치하는 @ref{e80,,cmath.infj}와 @ref{e81,,cmath.nanj}. (Contributed by Mark Dickinson in bpo-23229@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23229}.)

@node collections<4>,concurrent futures<5>,cmath,개선된 모듈<4>
@anchor{whatsnew/3 6 collections}@anchor{e82}
@subsubsection collections


새로운 @ref{e83,,Collection} 추상 베이스 클래스가 추가되어 길이가 있는 이터러블 컨테이너 클래스를 나타냅니다. (Contributed by Ivan Levkivskyi, docs by Neil Girdhar in bpo-27598@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27598}.)

The new @ref{e84,,Reversible} abstract base class represents
iterable classes that also provide the @ref{e85,,__reversed__()} method.
(Contributed by Ivan Levkivskyi in bpo-25987@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25987}.)

새로운 @ref{e86,,AsyncGenerator} 추상 베이스 클래스는 비동기 제너레이터를 나타냅니다. (Contributed by Yury Selivanov in bpo-28720@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28720}.)

@ref{4e0,,namedtuple()} 함수는 이제 지정되면 반환된 네임드 튜플 클래스의 @ref{615,,__module__} 어트리뷰트에 사용되는 선택적 키워드 인자 `module'을 받아들입니다. (Contributed by Raymond Hettinger in bpo-17941@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17941}.)

@ref{4e0,,namedtuple()}에 대한 `verbose'와 `rename' 인자는 이제 키워드 전용입니다. (Contributed by Raymond Hettinger in bpo-25628@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25628}.)

이제 재귀 @ref{7f3,,collections.deque} 인스턴스를 피클 할 수 있습니다. (Contributed by Serhiy Storchaka in bpo-26482@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26482}.)

@node concurrent futures<5>,contextlib<4>,collections<4>,개선된 모듈<4>
@anchor{whatsnew/3 6 concurrent-futures}@anchor{e87}
@subsubsection concurrent.futures


@ref{948,,ThreadPoolExecutor} 클래스 생성자는 이제 선택적 `thread_name_prefix' 인자를 받아들여 풀이 만든 스레드의 이름을 사용자 정의할 수 있습니다. (Contributed by Gregory P. Smith in bpo-27664@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27664}.)

@node contextlib<4>,datetime<6>,concurrent futures<5>,개선된 모듈<4>
@anchor{whatsnew/3 6 contextlib}@anchor{e88}
@subsubsection contextlib


컨텍스트 관리자를 위한 추상 베이스 클래스를 제공하기 위해 @ref{e89,,contextlib.AbstractContextManager} 클래스가 추가되었습니다. @code{self}를 반환하는 @code{__exit__()}의 합리적인 기본 구현을 제공하고 @code{__enter__()}는 추상 메서드로 남겨 둡니다. 일치하는 클래스가 @ref{10a,,typing} 모듈에 @ref{e8a,,typing.ContextManager}로 추가되었습니다. (Contributed by Brett Cannon in bpo-25609@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25609}.)

@node datetime<6>,decimal<3>,contextlib<4>,개선된 모듈<4>
@anchor{whatsnew/3 6 datetime}@anchor{e8b}
@subsubsection datetime


The @ref{4e2,,datetime} and @ref{1fb,,time} classes have
the new @ref{e8c,,fold} attribute used to disambiguate local time
when necessary.  Many functions in the @ref{34,,datetime} have been
updated to support local time disambiguation.
See @ref{e35,,Local Time Disambiguation} section for more
information.
(Contributed by Alexander Belopolsky in bpo-24773@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24773}.)

@ref{e8d,,datetime.strftime()}과 @ref{e8e,,date.strftime()} 메서드는 이제 ISO 8601 날짜 지시자 @code{%G}, @code{%u} 및 @code{%V}를 지원합니다. (Contributed by Ashley Anderson in bpo-12006@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12006}.)

@ref{d24,,datetime.isoformat()} 함수는 이제 포함할 시간 값의 추가 구성 요소 수를 지정하는 선택적 `timespec' 인자를 받아들입니다. (Contributed by Alessandro Cucci and Alexander Belopolsky in bpo-19475@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19475}.)

@ref{e8f,,datetime.combine()}은 이제 선택적 `tzinfo' 인자를 받아들입니다. (Contributed by Alexander Belopolsky in bpo-27661@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27661}.)

@node decimal<3>,distutils<5>,datetime<6>,개선된 모듈<4>
@anchor{whatsnew/3 6 decimal}@anchor{e90}
@subsubsection decimal


주어진 @ref{1fe,,Decimal} 인스턴스를 분수로 표현하는 정수 쌍 @code{(n, d)}를 가장 작은 항과 양의 분모로 반환하는 새로운 @ref{e91,,Decimal.as_integer_ratio()} 메서드:

@example
>>> Decimal('-3.14').as_integer_ratio()
(-157, 50)
@end example

(Contributed by Stefan Krah amd Mark Dickinson in bpo-25928@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25928}.)

@node distutils<5>,email<3>,decimal<3>,개선된 모듈<4>
@anchor{whatsnew/3 6 distutils}@anchor{e92}
@subsubsection distutils


@code{default_format} 어트리뷰트는 @code{distutils.command.sdist.sdist}에서 제거되었으며 @code{formats} 어트리뷰트의 기본값은 @code{['gztar']}입니다. 예상되지는 않지만, @code{default_format}의 존재에 의존하는 모든 코드를 조정해야 할 수 있습니다. 자세한 내용은 bpo-27819@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27819}를 참조하십시오.

@node email<3>,encodings<2>,distutils<5>,개선된 모듈<4>
@anchor{whatsnew/3 6 email}@anchor{e93}
@subsubsection email


다양한 생성자에 대한 `policy' 키워드를 통해 활성화되는 새 이메일 API는 더는 잠정적이 아닙니다. @ref{3f,,email} 설명서는 레거시 API에 대한 이전 설명서를 유지하면서 새 API에 초점을 맞추기 위해 재구성되고 재작성되었습니다. (Contributed by R. David Murray in bpo-24277@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24277}.)

이제 @ref{49,,email.mime} 클래스는 모두 선택적 `policy' 키워드를 받아들입니다. (Contributed by Berker Peksag in bpo-27331@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27331}.)

@ref{e94,,DecodedGenerator}는 이제 `policy' 키워드를 지원합니다.

구문 분석기가 새 메시지 객체를 만들 때 기본적으로 사용되는 클래스를 제어하는, 새 @ref{53,,policy} 어트리뷰트 @ref{e95,,message_factory}가 있습니다. @ref{e96,,email.policy.compat32} 정책의 경우 @ref{580,,Message}이고, 새 정책의 경우 @ref{57f,,EmailMessage}입니다. (Contributed by R. David Murray in bpo-20476@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20476}.)

@node encodings<2>,enum<7>,email<3>,개선된 모듈<4>
@anchor{whatsnew/3 6 encodings}@anchor{e97}
@subsubsection encodings


윈도우에서, @code{CP_OEMCP}를 사용하는 @code{'oem'} 인코딩을 추가하고, @code{CP_ACP} 코드 페이지를 사용하는 기존 @code{'mbcs'} 인코딩을 위한 @code{'ansi'} 별칭을 추가했습니다. (Contributed by Steve Dower in bpo-27959@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27959}.)

@node enum<7>,faulthandler<3>,encodings<2>,개선된 모듈<4>
@anchor{whatsnew/3 6 enum}@anchor{e98}
@subsubsection enum


Two new enumeration base classes have been added to the @ref{5a,,enum} module:
@ref{834,,Flag} and @ref{e99,,IntFlag}.  Both are used to define
constants that can be combined using the bitwise operators.
(Contributed by Ethan Furman in bpo-23591@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23591}.)

Many standard library modules have been updated to use the
@ref{e99,,IntFlag} class for their constants.

새 @ref{e9a,,enum.auto} 값을 사용하여 값을 열거형 멤버에 자동으로 할당할 수 있습니다:

@example
>>> from enum import Enum, auto
>>> class Color(Enum):
...     red = auto()
...     blue = auto()
...     green = auto()
...
>>> list(Color)
[<Color.red: 1>, <Color.blue: 2>, <Color.green: 3>]
@end example

@node faulthandler<3>,fileinput<2>,enum<7>,개선된 모듈<4>
@anchor{whatsnew/3 6 faulthandler}@anchor{e9b}
@subsubsection faulthandler


윈도우에서, @ref{5c,,faulthandler} 모듈은 이제 윈도우 예외에 대한 처리기를 설치합니다: @ref{20f,,faulthandler.enable()}을 참조하십시오. (Contributed by Victor Stinner in bpo-23848@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23848}.)

@node fileinput<2>,hashlib<5>,faulthandler<3>,개선된 모듈<4>
@anchor{whatsnew/3 6 fileinput}@anchor{e9c}
@subsubsection fileinput


@ref{e9d,,hook_encoded()}는 이제 `errors' 인자를 지원합니다. (Contributed by Joseph Hackman in bpo-25788@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25788}.)

@node hashlib<5>,http client<2>,fileinput<2>,개선된 모듈<4>
@anchor{whatsnew/3 6 hashlib}@anchor{e9e}
@subsubsection hashlib


@ref{6c,,hashlib}는 OpenSSL 1.1.0을 지원합니다. 최소 권장 버전은 1.0.2입니다. (Contributed by Christian Heimes in bpo-26470@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26470}.)

BLAKE2 해시 함수가 모듈에 추가되었습니다. @ref{851,,blake2b()}와 @ref{852,,blake2s()}는 항상 사용할 수 있으며 BLAKE2의 전체 기능 집합을 지원합니다. (Contributed by Christian Heimes in bpo-26798@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26798} based on code by Dmitry Chestnykh and Samuel Neves. Documentation written by Dmitry Chestnykh.)

SHA-3 해시 함수 @ref{e9f,,sha3_224()}, @ref{ea0,,sha3_256()}, @ref{ea1,,sha3_384()}, @ref{ea2,,sha3_512()} 및 SHAKE 해시 함수 @ref{ea3,,shake_128()}과 @ref{ea4,,shake_256()}이 추가되었습니다. (Contributed by Christian Heimes in bpo-16113@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16113}. Keccak Code Package by Guido Bertoni, Joan Daemen, Michaël Peeters, Gilles Van Assche, and Ronny Van Keer.)

비밀번호 기반 키 파생 함수 @ref{e37,,scrypt()}는 이제 OpenSSL 1.1.0 이상에서 사용할 수 있습니다. (Contributed by Christian Heimes in bpo-27928@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27928}.)

@node http client<2>,idlelib와 IDLE,hashlib<5>,개선된 모듈<4>
@anchor{whatsnew/3 6 http-client}@anchor{ea5}
@subsubsection http.client


@ref{ea6,,HTTPConnection.request()}와 @ref{ea7,,endheaders()} 모두 이제 청크 인코딩(chunked encoding) 요청 본문을 지원합니다. (Contributed by Demian Brecht and Rolf Krahl in bpo-12319@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12319}.)

@node idlelib와 IDLE,importlib<6>,http client<2>,개선된 모듈<4>
@anchor{whatsnew/3 6 idlelib-and-idle}@anchor{ea8}
@subsubsection idlelib와 IDLE


idlelib 패키지는 IDLE의 모양과 작동을 개선하고 코드를 더 쉽게 이해하고, 테스트하고 개선할 수 있도록 현대화와 리팩토링 되고 있습니다. 특히 리눅스와 맥에서 IDLE을 더 보기 좋게 만드는 부분은 대부분 대화 상자에서 ttk 위젯을 사용하는 것입니다. 결과적으로, IDLE은 더는 tcl/tk 8.4에서 실행되지 않습니다. 이제 tcl/tk 8.5나 8.6이 필요합니다. 둘 중 어느 것이든 최신 릴리스를 실행하는 것이 좋습니다.

‘현대화’에는 idlelib 모듈의 이름 변경과 통합이 포함됩니다. 부분 대문자 이름을 가진 파일의 이름을 바꾸는 것은, 예를 들어 3.0에서 Tkinter와 TkFont를 tkinter와 tkinter.font로 이름을 바꾸는 것과 유사합니다. 결과적으로, 3.5에서 작동했던 idlelib 파일 임포트는 일반적으로 3.6에서 작동하지 않습니다. 최소한 모듈 이름 변경이 필요합니다 (idlelib/README.txt를 참조하십시오). (bpo-24225@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24225}에서 Al Swiegart와 Terry Reedy에 의해 이름이 변경되었습니다. 이후 대부분의 idlelib 패치는 프로세스의 일부였고 앞으로도 그럴 것입니다.)

이에 대한 보상으로, 결과적으로 일부 idlelib 클래스는 더 나은 API와 그를 설명하는 독스트링을 통해 더 쉽게 사용할 수 있습니다. 사용할 수 있으면 추가 유용한 정보가 idlelib에 추가될 것입니다.

3.6.2의 새로운 기능:

자동 완성에 대한 여러 수정. (Contributed by Louie Lu in bpo-15786@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15786}.)

3.6.3의 새로운 기능:

모듈 브라우저(File 메뉴에 있는, 예전에는 클래스 브라우저라고 했습니다)는 이제 최상위 함수와 클래스 외에도 중첩된 함수와 클래스를 표시합니다. (Contributed by Guilherme Polo, Cheryl Sabella, and Terry Jan Reedy in bpo-1612262@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1612262}.)

이전에 확장으로 구현된 IDLE 기능은 일반 기능으로 다시 구현되었습니다. 설정이 Extension 탭에서 다른 대화 상자 탭으로 이동되었습니다. (Contributed by Charles Wohlganger and Terry Jan Reedy in bpo-27099@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27099}.)

설정 대화 상자(Options, Configure IDLE)가 부분적으로 다시 작성되어 모양과 기능이 모두 향상되었습니다. (Contributed by Cheryl Sabella and Terry Jan Reedy in multiple issues.)

3.6.4의 새로운 기능:

이제 글꼴 샘플에는 사용자가 특정 글꼴 선택의 효과를 더 잘 볼 수 있도록 비 라틴 문자 선택이 포함됩니다. (Contributed by Terry Jan Reedy in bpo-13802@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13802}.) 샘플은 다른 문자를 포함하도록 편집 할 수 있습니다. (Contributed by Serhiy Storchaka in bpo-31860@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31860}.)

3.6.6의 새로운 기능:

편집기 코드 컨텍스트 옵션이 수정되었습니다. 상자는 최대 maxlines까지 모든 컨텍스트 줄을 표시합니다. 컨텍스트 줄을 클릭하면 편집기가 해당 줄로 이동합니다. 사용자 정의 테마의 컨텍스트 색상이 Settings 대화 상자의 Highlights 탭에 추가되었습니다. (Contributed by Cheryl Sabella and Terry Jan Reedy in bpo-33642@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33642}, bpo-33768@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33768}, and bpo-33679@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33679}.)

윈도우에서, 새로운 API 호출은 tk가 DPI에 맞게 확장됨을 윈도우에 알립니다. 윈도우 8.1 이상이나 10에서, 파이썬 바이너리의 DPI 호환성 속성이 변경되지 않고, 96 DPI보다 큰 모니터 해상도를 사용하면, 텍스트와 선이 더 선명해져야 합니다. 그렇지 않으면 효과가 없습니다. (Contributed by Terry Jan Reedy in bpo-33656@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33656}.)

3.6.7의 새로운 기능:

N 줄 (기본값은 50) 이상의 출력은 버튼으로 압착됩니다. N은 Settings 대화 상자의 General 페이지에 있는 PyShell 섹션에서 변경할 수 있습니다. 더 적은 (하지만 더 길 수는 있는) 줄은 출력을 마우스 오른쪽 버튼으로 클릭하여 압착할 수 있습니다. 압착된 출력은 버튼을 더블 클릭하여 제자리에서 확장하거나 마우스 오른쪽 버튼으로 버튼을 클릭하여 클립 보드나 별도의 창으로 확장 할 수 있습니다. (Contributed by Tal Einat in bpo-1529353@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1529353}.)

@node importlib<6>,inspect<7>,idlelib와 IDLE,개선된 모듈<4>
@anchor{whatsnew/3 6 importlib}@anchor{ea9}
@subsubsection importlib


임포트는 이제 모듈을 찾을 수 없을 때 새로운 예외 @ref{d3c,,ModuleNotFoundError}(@ref{659,,ImportError}의 서브 클래스)를 발생시킵니다. 현재 (try-except에서) @code{ImportError}를 검사하는 코드는 계속 작동합니다. (Contributed by Eric Snow in bpo-15767@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15767}.)

@ref{eaa,,importlib.util.LazyLoader}는 이제 래핑 된 로더에서 @ref{eab,,create_module()}을 호출하여, @ref{eac,,importlib.machinery.BuiltinImporter}와 @ref{ead,,importlib.machinery.ExtensionFileLoader}를 @code{importlib.util.LazyLoader}와 함께 사용할 수 없는 제한을 제거합니다.

@ref{353,,importlib.util.cache_from_source()}, @ref{73d,,importlib.util.source_from_cache()} 및 @ref{eae,,importlib.util.spec_from_file_location()}은 이제 @ref{5a0,,경로류 객체}를 받아들입니다.

@node inspect<7>,json<2>,importlib<6>,개선된 모듈<4>
@anchor{whatsnew/3 6 inspect}@anchor{eaf}
@subsubsection inspect


@ref{22f,,inspect.signature()} 함수는 이제 컴프리헨션과 제너레이터 표현식 스코프에 대해 컴파일러가 생성한 묵시적 @code{.0} 매개 변수를 @code{implicit0}이라는 위치 전용 매개 변수인 것처럼 보고합니다. (Contributed by Jelle Zijlstra in bpo-19611@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19611}.)

To reduce code churn when upgrading from Python 2.7 and the legacy
@code{inspect.getargspec()} API, the previously documented deprecation of
@ref{940,,inspect.getfullargspec()} has been reversed. While this function is
convenient for single/source Python 2/3 code bases, the richer
@ref{22f,,inspect.signature()} interface remains the recommended approach for new
code. (Contributed by Nick Coghlan in bpo-27172@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27172})

@node json<2>,logging<4>,inspect<7>,개선된 모듈<4>
@anchor{whatsnew/3 6 json}@anchor{eb0}
@subsubsection json


@ref{eb1,,json.load()}와 @ref{b4e,,json.loads()}는 이제 바이너리 입력을 지원합니다. 인코딩된 JSON은 UTF-8, UTF-16 또는 UTF-32를 사용하여 표현해야 합니다. (Contributed by Serhiy Storchaka in bpo-17909@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17909}.)

@node logging<4>,math<8>,json<2>,개선된 모듈<4>
@anchor{whatsnew/3 6 logging}@anchor{eb2}
@subsubsection logging


새로운 @ref{eb3,,WatchedFileHandler.reopenIfNeeded()} 메서드가 추가되어 로그 파일을 다시 열어야 하는지 확인하는 기능이 추가되었습니다. (Contributed by Marian Horban in bpo-24884@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24884}.)

@node math<8>,multiprocessing<6>,logging<4>,개선된 모듈<4>
@anchor{whatsnew/3 6 math}@anchor{eb4}
@subsubsection math


tau (`τ') 상수가 @ref{92,,math}와 @ref{19,,cmath} 모듈에 추가되었습니다. (Contributed by Lisa Roach in bpo-12345@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12345}, see 
@geindex Python 향상 제안; PEP 628
PEP 628@footnote{https://peps.python.org/pep-0628/} for details.)

@node multiprocessing<6>,os<9>,math<8>,개선된 모듈<4>
@anchor{whatsnew/3 6 multiprocessing}@anchor{eb5}
@subsubsection multiprocessing


@ref{250,,multiprocessing.Manager()}에서 반환된 @ref{24c,,프락시 객체}는 이제 중첩될 수 있습니다. (Contributed by Davin Potts in bpo-6766@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6766}.)

@node os<9>,pathlib<12>,multiprocessing<6>,개선된 모듈<4>
@anchor{whatsnew/3 6 os}@anchor{eb6}
@subsubsection os


@ref{a5,,os}와 @ref{a6,,os.path} 모듈이 이제 @ref{5a0,,경로류 객체}를 지원하는 방법에 대한 자세한 내용은 @ref{e34,,PEP 519} 요약을 참조하십시오.

@ref{c53,,scandir()}은 이제 윈도우에서 @ref{192,,bytes} 경로를 지원합니다.

A new @ref{eb7,,close()} method allows explicitly closing a
@ref{c53,,scandir()} iterator.  The @code{scandir()} iterator now
supports the @ref{1e1,,context manager} protocol.  If a @code{scandir()}
iterator is neither exhausted nor explicitly closed a @ref{54e,,ResourceWarning}
will be emitted in its destructor.
(Contributed by Serhiy Storchaka in bpo-25994@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25994}.)

리눅스에서, @ref{745,,os.urandom()}은 이제 보안을 강화하기 위해 시스템 urandom 엔트로피 풀이 초기화될 때까지 블록합니다. 근거는 
@geindex Python 향상 제안; PEP 524
PEP 524@footnote{https://peps.python.org/pep-0524/}를 참조하십시오.

리눅스 @code{getrandom()} 시스템 호출(무작위 바이트 얻기)이 이제 새로운 @ref{eb8,,os.getrandom()} 함수로 노출됩니다. (Contributed by Victor Stinner, part of the 
@geindex Python 향상 제안; PEP 524
PEP 524@footnote{https://peps.python.org/pep-0524/})

@node pathlib<12>,pdb<7>,os<9>,개선된 모듈<4>
@anchor{whatsnew/3 6 pathlib}@anchor{eb9}
@subsubsection pathlib


@ref{a8,,pathlib}는 이제 @ref{5a0,,경로류 객체}를 지원합니다. (Contributed by Brett Cannon in bpo-27186@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27186}.)

자세한 내용은 @ref{e34,,PEP 519} 요약을 참조하십시오.

@node pdb<7>,pickle<3>,pathlib<12>,개선된 모듈<4>
@anchor{whatsnew/3 6 pdb}@anchor{eba}
@subsubsection pdb


@ref{273,,Pdb} 클래스 생성자에는 @code{.pdbrc} 파일을 읽어야 하는지를 제어하는 새로운 선택적 `readrc' 인자가 있습니다.

@node pickle<3>,pickletools,pdb<7>,개선된 모듈<4>
@anchor{whatsnew/3 6 pickle}@anchor{ebb}
@subsubsection pickle


키워드 인자로 호출된 @code{__new__}가 필요한 객체는 이제 프로토콜 버전 4보다 오래된 @ref{27b,,피클 프로토콜}을 사용하여 피클 할 수 있습니다. 프로토콜 버전 4는 이미 이 경우를 지원합니다. (Contributed by Serhiy Storchaka in bpo-24164@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24164}.)

@node pickletools,pydoc<4>,pickle<3>,개선된 모듈<4>
@anchor{whatsnew/3 6 pickletools}@anchor{ebc}
@subsubsection pickletools


@ref{ebd,,pickletools.dis()}는 이제 @code{MEMOIZE} 옵코드를 위한 묵시적 메모 인덱스를 출력합니다. (Contributed by Serhiy Storchaka in bpo-25382@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25382}.)

@node pydoc<4>,random<4>,pickletools,개선된 모듈<4>
@anchor{whatsnew/3 6 pydoc}@anchor{ebe}
@subsubsection pydoc


@ref{ba,,pydoc} 모듈은 @code{MANPAGER} 환경 변수를 존중하는 법을 배웠습니다. (Contributed by Matthias Klose in bpo-8637@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8637}.)

@ref{ad4,,help()}와 @ref{ba,,pydoc}은 이제 사전 순이 아닌 정의된 순서대로 네임드 튜플 필드를 나열할 수 있습니다. (Contributed by Raymond Hettinger in bpo-24879@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24879}.)

@node random<4>,re<6>,pydoc<4>,개선된 모듈<4>
@anchor{whatsnew/3 6 random}@anchor{ebf}
@subsubsection random


새로운 @ref{ec0,,choices()} 함수는 선택적 가중치(weights)를 사용하여 주어진 모집단에서 지정된 크기의 요소 리스트를 반환합니다. (Contributed by Raymond Hettinger in bpo-18844@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18844}.)

@node re<6>,readline,random<4>,개선된 모듈<4>
@anchor{whatsnew/3 6 re}@anchor{ec1}
@subsubsection re


정규식에서 수정자 범위 지원이 추가되었습니다. 예: @code{'(?i:p)ython'}은 @code{'python'}과 @code{'Python'}과 일치하지만, @code{'PYTHON'}은 일치하지 않습니다; @code{'(?i)g(?-i:v)r'}는 @code{'GvR'}과 @code{'gvr'}과 일치하지만, @code{'GVR'}은 일치하지 않습니다. (Contributed by Serhiy Storchaka in bpo-433028@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=433028}.)

Match 객체 그룹은 @code{group()}과 동등한 @code{__getitem__}으로 액세스 할 수 있습니다. 따라서 @code{mo['name']}은 이제 @code{mo.group('name')}과 동등합니다. (Contributed by Eric Smith in bpo-24454@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24454}.)

@ref{ec2,,Match} 객체는 이제 @ref{19e,,인덱스류 객체}를 그룹 인덱스로 지원합니다. (Contributed by Jeroen Demeyer and Xiang Zhang in bpo-27177@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27177}.)

@node readline,rlcompleter,re<6>,개선된 모듈<4>
@anchor{whatsnew/3 6 readline}@anchor{ec3}
@subsubsection readline


히스토리 리스트에 자동 입력 추가를 활성화하거나 비활성화하는 @ref{ec4,,set_auto_history()}를 추가했습니다. (Contributed by Tyler Crompton in bpo-26870@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26870}.)

@node rlcompleter,shlex<2>,readline,개선된 모듈<4>
@anchor{whatsnew/3 6 rlcompleter}@anchor{ec5}
@subsubsection rlcompleter


접두사가 밑줄로 시작하지 않는 한 비공개와 특수 어트리뷰트 이름은 이제 생략됩니다. 일부 완성된 키워드 뒤에 스페이스나 콜론이 추가됩니다. (Contributed by Serhiy Storchaka in bpo-25011@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25011} and bpo-25209@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25209}.)

@node shlex<2>,site<3>,rlcompleter,개선된 모듈<4>
@anchor{whatsnew/3 6 shlex}@anchor{ec6}
@subsubsection shlex


@ref{ec7,,shlex}는 구두점으로 처리되는 문자를 제어하기 위한 새로운 `punctuation_chars' 인자를 통해 훨씬 @ref{ec8,,개선된 셸 호환성}을 갖습니다. (Contributed by Vinay Sajip in bpo-1521950@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1521950}.)

@node site<3>,sqlite3<8>,shlex<2>,개선된 모듈<4>
@anchor{whatsnew/3 6 site}@anchor{ec9}
@subsubsection site


@code{.pth} 파일에서 @ref{3e4,,sys.path}에 추가할 경로를 지정할 때, 이제 디렉터리 위에 파일 경로를 지정할 수 있습니다 (예를 들어 zip 파일). (Contributed by Wolfgang Langner in bpo-26587@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26587}).

@node sqlite3<8>,socket<8>,site<3>,개선된 모듈<4>
@anchor{whatsnew/3 6 sqlite3}@anchor{eca}
@subsubsection sqlite3


@ref{ecb,,sqlite3.Cursor.lastrowid}는 이제 @code{REPLACE} 문을 지원합니다. (Contributed by Alex LordThorsen in bpo-16864@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16864}.)

@node socket<8>,socketserver<2>,sqlite3<8>,개선된 모듈<4>
@anchor{whatsnew/3 6 socket}@anchor{ecc}
@subsubsection socket


@ref{ecd,,ioctl()} 함수는 이제 @ref{ece,,SIO_LOOPBACK_FAST_PATH} 제어 코드를 지원합니다. (Contributed by Daniel Stokes in bpo-26536@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26536}.)

@ref{ecf,,getsockopt()} 상수 @code{SO_DOMAIN}, @code{SO_PROTOCOL}, @code{SO_PEERSEC} 및 @code{SO_PASSSEC}이 이제 지원됩니다. (Contributed by Christian Heimes in bpo-26907@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26907}.)

@ref{ed0,,setsockopt()}는 이제 @code{setsockopt(level, optname, None, optlen: int)} 형식을 지원합니다. (Contributed by Christian Heimes in bpo-27744@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27744}.)

socket 모듈은 이제 리눅스 커널 암호화 API와 인터페이스 하기 위해 주소 패밀리 @ref{ed1,,AF_ALG}를 지원합니다. @code{ALG_*}, @code{SOL_ALG} 및 @ref{ed2,,sendmsg_afalg()}가 추가되었습니다. (Contributed by Christian Heimes in bpo-27744@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27744} with support from Victor Stinner.)

새로운 리눅스 상수 @code{TCP_USER_TIMEOUT}과 @code{TCP_CONGESTION}이 추가되었습니다. (Contributed by Omar Sandoval, bpo-26273@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26273}).

@node socketserver<2>,ssl<8>,socket<8>,개선된 모듈<4>
@anchor{whatsnew/3 6 socketserver}@anchor{ed3}
@subsubsection socketserver


@ref{76,,http.server}, @ref{135,,xmlrpc.server} 및 @ref{121,,wsgiref.simple_server}에 정의된 것들을 포함하여, @ref{d2,,socketserver} 모듈에 기반하는 서버는 이제 @ref{1e1,,컨텍스트 관리자} 프로토콜을 지원합니다. (Contributed by Aviv Palivoda in bpo-26404@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26404}.)

The @ref{ed4,,wfile} attribute of
@ref{ed5,,StreamRequestHandler} classes now implements
the @ref{8a2,,io.BufferedIOBase} writable interface.  In particular,
calling @ref{ed6,,write()} is now guaranteed to send the
data in full.  (Contributed by Martin Panter in bpo-26721@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26721}.)

@node ssl<8>,statistics<5>,socketserver<2>,개선된 모듈<4>
@anchor{whatsnew/3 6 ssl}@anchor{ed7}
@subsubsection ssl


@ref{d5,,ssl}은 OpenSSL 1.1.0을 지원합니다. 최소 권장 버전은 1.0.2입니다. (Contributed by Christian Heimes in bpo-26470@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26470}.)

3DES는 기본 암호 스위트에서 제거되었으며 ChaCha20 Poly1305 암호 스위트가 추가되었습니다. (Contributed by Christian Heimes in bpo-27850@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27850} and bpo-27766@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27766}.)

@ref{357,,SSLContext}는 옵션과 암호에 대해 더 나은 기본 구성을 제공합니다. (Contributed by Christian Heimes in bpo-28043@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28043}.)

SSL 세션은 새로운 @ref{ed8,,SSLSession} 클래스를 사용하여, 한 클라이언트 측 연결에서 다른 연결로 복사 할 수 있습니다. TLS 세션 재개는 초기 핸드 셰이크 속도를 높이고, 지연 시간을 줄이며 성능을 향상할 수 있습니다 (Contributed by Christian Heimes in bpo-19500@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19500} based on a draft by Alex Warhawk.)

새로운 @ref{ed9,,get_ciphers()} 메서드를 사용하여 암호 우선순위에 따라 활성화된 암호 리스트를 가져올 수 있습니다.

All constants and flags have been converted to @ref{eda,,IntEnum} and
@ref{e99,,IntFlag}.
(Contributed by Christian Heimes in bpo-28025@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28025}.)

@ref{357,,SSLContext}를 위한 서버와 클라이언트 측 특정 TLS 프로토콜이 추가되었습니다. (Contributed by Christian Heimes in bpo-28085@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28085}.)

Added @ref{c25,,ssl.SSLContext.post_handshake_auth} to enable and
@ref{c26,,ssl.SSLSocket.verify_client_post_handshake()} to initiate TLS 1.3
post-handshake authentication.
(Contributed by Christian Heimes in gh-78851@footnote{https://github.com/python/cpython/issues/78851}.)

@node statistics<5>,struct<2>,ssl<8>,개선된 모듈<4>
@anchor{whatsnew/3 6 statistics}@anchor{edb}
@subsubsection statistics


새로운 @ref{edc,,harmonic_mean()} 함수가 추가되었습니다. (Contributed by Steven D’Aprano in bpo-27181@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27181}.)

@node struct<2>,subprocess<3>,statistics<5>,개선된 모듈<4>
@anchor{whatsnew/3 6 struct}@anchor{edd}
@subsubsection struct


@ref{db,,struct}는 이제 @code{'e'} 포맷 지정자를 통해 IEEE 754 반 정밀도 부동 소수점을 지원합니다. (Contributed by Eli Stevens, Mark Dickinson in bpo-11734@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11734}.)

@node subprocess<3>,sys<10>,struct<2>,개선된 모듈<4>
@anchor{whatsnew/3 6 subprocess}@anchor{ede}
@subsubsection subprocess


@ref{4b8,,subprocess.Popen} 파괴자는 이제 자식 프로세스가 계속 실행 중이면 @ref{54e,,ResourceWarning} 경고를 내보냅니다. 자식 프로세스의 종료 상태를 읽으려면, 컨텍스트 관리자 프로토콜(@code{with proc: ...})을 사용하거나 @ref{edf,,wait()} 메서드를 명시적으로 호출하십시오. (Contributed by Victor Stinner in bpo-26741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26741}.)

@ref{4b8,,subprocess.Popen} 생성자와 그것을 통해 인자를 전달하는 모든 함수는 이제 `encoding'과 `errors' 인자를 받아들입니다. 이들 중 하나를 지정하면 `stdin', `stdout' 및 `stderr' 스트림에 대한 텍스트 모드가 활성화됩니다. (Contributed by Steve Dower in bpo-6135@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6135}.)

@node sys<10>,telnetlib,subprocess<3>,개선된 모듈<4>
@anchor{whatsnew/3 6 sys}@anchor{ee0}
@subsubsection sys


새로운 @ref{ee1,,getfilesystemencodeerrors()} 함수는 유니코드 파일명과 바이트열 파일명 사이를 변환하는 데 사용되는 에러 모드의 이름을 반환합니다. (Contributed by Steve Dower in bpo-27781@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27781}.)

윈도우에서 @ref{ee2,,getwindowsversion()} 함수의 반환 값에는 이제 프로세스에 대해 에뮬레이션 되는 버전이 아니라 현재 운영 체제의 정확한 주 버전, 부 버전 및 빌드 번호가 포함된 `platform_version' 필드가 포함됩니다 (Contributed by Steve Dower in bpo-27932@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27932}.)

@node telnetlib,time<6>,sys<10>,개선된 모듈<4>
@anchor{whatsnew/3 6 telnetlib}@anchor{ee3}
@subsubsection telnetlib


@code{telnetlib.Telnet}은 이제 컨텍스트 관리자입니다 (contributed by Stéphane Wirtel in bpo-25485@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25485}).

@node time<6>,timeit,telnetlib,개선된 모듈<4>
@anchor{whatsnew/3 6 time}@anchor{ee4}
@subsubsection time


The @ref{ee5,,struct_time} attributes @code{tm_gmtoff} and
@code{tm_zone} are now available on all platforms.

@node timeit,tkinter<7>,time<6>,개선된 모듈<4>
@anchor{whatsnew/3 6 timeit}@anchor{ee6}
@subsubsection timeit


총 실행 시간이 200밀리초 이상이 되도록 @ref{ee7,,Timer.timeit()}을 반복적으로 호출하는 새로운 @ref{ee8,,Timer.autorange()} 편의 메서드가 추가되었습니다. (Contributed by Steven D’Aprano in bpo-6422@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6422}.)

@ref{f5,,timeit}은 이제 최상과 최악 시간 사이에 상당한 (4x) 차이가 있을 때 경고합니다. (Contributed by Serhiy Storchaka in bpo-23552@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23552}.)

@node tkinter<7>,traceback<4>,timeit,개선된 모듈<4>
@anchor{whatsnew/3 6 tkinter}@anchor{ee9}
@subsubsection tkinter


Added methods @code{Variable.trace_add()},
@code{Variable.trace_remove()} and @code{trace_info()}
in the @code{tkinter.Variable} class.  They replace old methods
@code{trace_variable()}, @code{trace()},
@code{trace_vdelete()} and
@code{trace_vinfo()} that use obsolete Tcl commands and might
not work in future versions of Tcl.
(Contributed by Serhiy Storchaka in bpo-22115@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22115}).

@node traceback<4>,tracemalloc<3>,tkinter<7>,개선된 모듈<4>
@anchor{whatsnew/3 6 traceback}@anchor{eea}@anchor{whatsnew/3 6 whatsnew36-traceback}@anchor{e69}
@subsubsection traceback


traceback 모듈과 인터프리터의 내장 예외 디스플레이는 이제 다음 예제와 같이 트레이스백에서 반복되는 긴 시퀀스의 줄을 축약합니다:

@example
>>> def f(): f()
...
>>> f()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 1, in f
  File "<stdin>", line 1, in f
  File "<stdin>", line 1, in f
  [Previous line repeated 995 more times]
RecursionError: maximum recursion depth exceeded
@end example

(Contributed by Emanuel Barry in bpo-26823@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26823}.)

@node tracemalloc<3>,typing<10>,traceback<4>,개선된 모듈<4>
@anchor{whatsnew/3 6 tracemalloc}@anchor{eeb}
@subsubsection tracemalloc


@ref{105,,tracemalloc} 모듈은 이제 여러 다른 주소 공간에서 메모리 할당 추적을 지원합니다.

새로운 @ref{eec,,DomainFilter} 필터 클래스가 주소 공간(도메인)별로 블록 추적을 필터링하기 위해 추가되었습니다.

(Contributed by Victor Stinner in bpo-26588@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26588}.)

@node typing<10>,unicodedata<8>,tracemalloc<3>,개선된 모듈<4>
@anchor{whatsnew/3 6 typing}@anchor{eed}@anchor{whatsnew/3 6 whatsnew36-typing}@anchor{e36}
@subsubsection typing


@ref{10a,,typing} 모듈이 @ref{3d1,,잠정적}이므로, 파이썬 3.6에 도입된 모든 변경 사항은 파이썬 3.5.x로 역 이식되었습니다.

@ref{10a,,typing} 모듈은 제네릭 형 에일리어스에 대한 훨씬 향상된 지원을 제공합니다. 예를 들어 @code{Dict[str, Tuple[S, T]]}는 이제 유효한 형 어노테이션입니다. (Contributed by Guido van Rossum in Github #195@footnote{https://github.com/python/typing/pull/195}.)

@ref{e89,,contextlib.AbstractContextManager}를 나타내는 @ref{e8a,,typing.ContextManager} 클래스가 추가되었습니다. (Contributed by Brett Cannon in bpo-25609@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25609}.)

@ref{e83,,collections.abc.Collection}을 나타내는 @ref{eee,,typing.Collection} 클래스가 추가되었습니다. (Contributed by Ivan Levkivskyi in bpo-27598@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27598}.)

클래스 변수를 표시하기 위해 @ref{56c,,typing.ClassVar} 형 구조가 추가되었습니다. 
@geindex Python 향상 제안; PEP 526
PEP 526@footnote{https://peps.python.org/pep-0526/}에 도입된 대로, ClassVar에 래핑 된 변수 어노테이션은 주어진 어트리뷰트가 클래스 변수로 사용되도록 의도되었으며 해당 클래스의 인스턴스에 설정되어서는 안 됨을 나타냅니다. (Contributed by Ivan Levkivskyi in Github #280@footnote{https://github.com/python/typing/pull/280}.)

정적 형 검사기가 @code{True}로 가정하지만, 실행 시간에는 @code{False}인 새 @ref{eef,,TYPE_CHECKING} 상수. (Contributed by Guido van Rossum in Github #230@footnote{https://github.com/python/typing/issues/230}.)

어노테이션에 대한 경량 고유 형을 만드는 새로운 @ref{ef0,,NewType()} 도우미 함수가 추가되었습니다:

@example
from typing import NewType

UserId = NewType('UserId', int)
some_id = UserId(524313)
@end example

정적 형 검사기는 새 형을 원래 형의 서브 클래스인 것처럼 처리합니다. (Contributed by Ivan Levkivskyi in Github #189@footnote{https://github.com/python/typing/issues/189}.)

@node unicodedata<8>,unittest mock<2>,typing<10>,개선된 모듈<4>
@anchor{whatsnew/3 6 unicodedata}@anchor{ef1}
@subsubsection unicodedata


@ref{10b,,unicodedata} 모듈은 이제 유니코드 9.0.0@footnote{https://unicode.org/versions/Unicode9.0.0/}의 데이터를 사용합니다. (Contributed by Benjamin Peterson.)

@node unittest mock<2>,urllib request,unicodedata<8>,개선된 모듈<4>
@anchor{whatsnew/3 6 unittest-mock}@anchor{ef2}
@subsubsection unittest.mock


@ref{c3d,,Mock} 클래스는 다음과 같이 개선되었습니다:


@itemize *

@item 
모의 객체가 호출되었는지 확인하는 두 가지 새로운 메서드, @ref{ef3,,Mock.assert_called()}와 @ref{ef4,,Mock.assert_called_once()}. (Contributed by Amit Saha in bpo-26323@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26323}.)

@item 
@ref{ef5,,Mock.reset_mock()} 메서드에는 이제 두 개의 선택적 키워드 전용 인자가 있습니다: `return_value'와 `side_effect'. (Contributed by Kushal Das in bpo-21271@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21271}.)
@end itemize

@node urllib request,urllib robotparser,unittest mock<2>,개선된 모듈<4>
@anchor{whatsnew/3 6 urllib-request}@anchor{ef6}
@subsubsection urllib.request


If a HTTP request has a file or iterable body (other than a
bytes object) but no @code{Content-Length} header, rather than
throwing an error, @ref{ef7,,AbstractHTTPHandler}
now falls back to use chunked transfer encoding.
(Contributed by Demian Brecht and Rolf Krahl in bpo-12319@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12319}.)

@node urllib robotparser,venv<5>,urllib request,개선된 모듈<4>
@anchor{whatsnew/3 6 urllib-robotparser}@anchor{ef8}
@subsubsection urllib.robotparser


@ref{ef9,,RobotFileParser}는 이제 @code{Crawl-delay}와 @code{Request-rate} 확장을 지원합니다. (Contributed by Nikolay Bogoychev in bpo-16099@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16099}.)

@node venv<5>,warnings<4>,urllib robotparser,개선된 모듈<4>
@anchor{whatsnew/3 6 venv}@anchor{efa}
@subsubsection venv


@ref{117,,venv}는 새 파라미터 @code{--prompt}를 받아들입니다. 이 파라미터는 가상 환경에 대한 대체 접두사를 제공합니다. (Proposed by Łukasz Balcerzak and ported to 3.6 by Stéphane Wirtel in bpo-22829@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22829}.)

@node warnings<4>,winreg,venv<5>,개선된 모듈<4>
@anchor{whatsnew/3 6 warnings}@anchor{efb}
@subsubsection warnings


A new optional `source' parameter has been added to the
@ref{efc,,warnings.warn_explicit()} function: the destroyed object which emitted a
@ref{54e,,ResourceWarning}. A `source' attribute has also been added to
@code{warnings.WarningMessage} (contributed by Victor Stinner in
bpo-26568@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26568} and bpo-26567@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26567}).

@ref{54e,,ResourceWarning} 경고가 로그 될 때, @ref{105,,tracemalloc} 모듈이 이제 파괴된 객체가 할당된 트레이스백을 얻는 데 사용됩니다.

@code{example.py} 스크립트의 예:

@example
import warnings

def func():
    return open(__file__)

f = func()
f = None
@end example

@code{python3.6 -Wd -X tracemalloc=5 example.py} 명령의 출력:

@example
example.py:7: ResourceWarning: unclosed file <_io.TextIOWrapper name='example.py' mode='r' encoding='UTF-8'>
  f = None
Object allocated at (most recent call first):
  File "example.py", lineno 4
    return open(__file__)
  File "example.py", lineno 6
    f = func()
@end example

“Object allocated at” 트레이스백은 새로운 것이며 @ref{105,,tracemalloc}이 파이썬 메모리 할당을 추적하고 @ref{118,,warnings} 모듈을 이미 임포트 했을 때만 표시됩니다.

@node winreg,winsound,warnings<4>,개선된 모듈<4>
@anchor{whatsnew/3 6 winreg}@anchor{efd}
@subsubsection winreg


64비트 정수 형 @ref{efe,,REG_QWORD}를 추가했습니다. (Contributed by Clement Rouault in bpo-23026@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23026}.)

@node winsound,xmlrpc client,winreg,개선된 모듈<4>
@anchor{whatsnew/3 6 winsound}@anchor{eff}
@subsubsection winsound


키워드 인자가 @ref{f00,,Beep}, @ref{f01,,MessageBeep} 및 @ref{f02,,PlaySound} 에 전달되도록 허용합니다 (bpo-27982@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27982}).

@node xmlrpc client,zipfile<4>,winsound,개선된 모듈<4>
@anchor{whatsnew/3 6 xmlrpc-client}@anchor{f03}
@subsubsection xmlrpc.client


@ref{134,,xmlrpc.client} 모듈은 이제 숫자와 @code{None}에 대해 Apache XML-RPC 구현에서 사용하는 추가 데이터형의 역 마셜링을 지원합니다. (Contributed by Serhiy Storchaka in bpo-26885@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26885}.)

@node zipfile<4>,zlib<2>,xmlrpc client,개선된 모듈<4>
@anchor{whatsnew/3 6 zipfile}@anchor{f04}
@subsubsection zipfile


새로운 @ref{f05,,ZipInfo.from_file()} 클래스 메서드를 사용하면 파일 시스템 파일에서 @ref{2cb,,ZipInfo} 인스턴스를 만들 수 있습니다. 새로운 @ref{f06,,ZipInfo.is_dir()} 메서드를 사용하여 @code{ZipInfo} 인스턴스가 디렉터리를 나타내는지 확인할 수 있습니다. (Contributed by Thomas Kluyver in bpo-26039@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26039}.)

이제 @ref{65b,,ZipFile.open()} 메서드를 사용하여 데이터를 추출할 뿐만 아니라, ZIP 파일에 데이터를 쓸 수 있습니다. (Contributed by Thomas Kluyver in bpo-26039@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26039}.)

@node zlib<2>,,zipfile<4>,개선된 모듈<4>
@anchor{whatsnew/3 6 zlib}@anchor{f07}
@subsubsection zlib


@ref{84e,,compress()}와 @ref{f08,,decompress()} 함수는 이제 키워드 인자를 받아들입니다. (Contributed by Aviv Palivoda in bpo-26243@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26243} and Xiang Zhang in bpo-16764@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16764} respectively.)

@node 최적화<4>,빌드와 C API 변경<2>,개선된 모듈<4>,파이썬 3 6의 새로운 기능
@anchor{whatsnew/3 6 optimizations}@anchor{f09}
@subsection 최적화



@itemize *

@item 
파이썬 인터프리터는 이제 바이트 코드 대신 16비트 워드 코드를 사용하여 여러 옵코드 최적화를 가능하게 했습니다. (Contributed by Demur Rumed with input and reviews from Serhiy Storchaka and Victor Stinner in bpo-26647@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26647} and bpo-28050@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28050}.)

@item 
@ref{dc5,,asyncio.Future} 클래스에는 이제 최적화된 C 구현이 있습니다. (Contributed by Yury Selivanov and INADA Naoki in bpo-26081@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26081}.)

@item 
@ref{1c7,,asyncio.Task} 클래스에는 이제 최적화된 C 구현이 있습니다. (Contributed by Yury Selivanov in bpo-28544@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28544}.)

@item 
@ref{10a,,typing} 모듈의 다양한 구현 개선 사항(가령 제네릭 형의 캐싱)을 통해 최대 30배의 성능 향상과 메모리 요구량 감소가 가능해졌습니다.

@item 
ASCII 디코더는 이제 에러 처리기 @code{surrogateescape}, @code{ignore} 및 @code{replace}에 대해 최대 60배 빠릅니다 (Contributed by Victor Stinner in bpo-24870@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24870}).

@item 
ASCII와 Latin1 인코더는 이제 에러 처리기 @code{surrogateescape}에 대해 최대 3배 빠릅니다 (Contributed by Victor Stinner in bpo-25227@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25227}).

@item 
UTF-8 인코더는 이제 에러 처리기 @code{ignore}, @code{replace}, @code{surrogateescape}, @code{surrogatepass}에 대해 최대 75배 빠릅니다 (Contributed by Victor Stinner in bpo-25267@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25267}).

@item 
UTF-8 디코더는 이제 에러 처리기 @code{ignore}, @code{replace} 및 @code{surrogateescape}에 대해 최대 15배 빠릅니다 (Contributed by Victor Stinner in bpo-25301@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25301}).

@item 
@code{bytes % args}는 이제 최대 2배 더 빠릅니다. (Contributed by Victor Stinner in bpo-25349@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25349}).

@item 
@code{bytearray % args}는 이제 2.5–5배 더 빠릅니다. (Contributed by Victor Stinner in bpo-25399@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25399}).

@item 
@ref{190,,bytes.fromhex()}와 @ref{191,,bytearray.fromhex()}를 최적화했습니다: 이제 2배에서 3.5배까지 빨라졌습니다. (Contributed by Victor Stinner in bpo-25401@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25401}).

@item 
@code{bytes.replace(b'@w{'}, b'.')}와 @code{bytearray.replace(b'@w{'}, b'.')}를 최적화했습니다: 최대 80% 더 빠릅니다. (Contributed by Josh Snider in bpo-26574@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26574}).

@item 
@ref{e5e,,PyMem_Malloc()} 도메인(@ref{e62,,PYMEM_DOMAIN_MEM})의 할당자 함수는 이제 C 라이브러리의 @code{malloc()} 함수 대신 @ref{f0a,,pymalloc 메모리 할당자}를 사용합니다. pymalloc 할당자는 수명이 짧은 512바이트 이하의 객체에 최적화되어 있으며, 더 큰 메모리 블록에는 @code{malloc()}을 사용합니다. (Contributed by Victor Stinner in bpo-26249@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26249}).

@item 
@ref{f0b,,pickle.load()}와 @ref{f0c,,pickle.loads()}는 이제 많은 작은 객체를 역 직렬화할 때 최대 10% 더 빠릅니다 (Contributed by Victor Stinner in bpo-27056@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27056}).

@item 
@ref{f0d,,키워드 인자}를 함수에 전달하면 @ref{f0e,,위치 인자}를 전달하는 것과 비교하여 오버헤드가 있습니다. 이제 인자 클리닉(Argument Clinic)을 사용하여 구현된 확장 함수에서 이 오버헤드가 많이 감소합니다. (Contributed by Serhiy Storchaka in bpo-27574@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27574}).

@item 
@ref{68,,glob} 모듈에서 @ref{59f,,glob()}과 @ref{a08,,iglob()} 함수를 최적화했습니다; 이제 약 3–6배 더 빠릅니다. (Contributed by Serhiy Storchaka in bpo-25596@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25596}).

@item 
@ref{c53,,os.scandir()}을 사용하여 @ref{a8,,pathlib}에서 글로빙(globbing)을 최적화했습니다; 이제 약 1.5–4배 더 빨라졌습니다. (Contributed by Serhiy Storchaka in bpo-26032@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26032}).

@item 
@ref{12b,,xml.etree.ElementTree} 구문 분석, 이터레이션 및 깊은 복사 성능이 크게 향상되었습니다. (Contributed by Serhiy Storchaka in bpo-25638@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25638}, bpo-25873@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25873}, and bpo-25869@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25869}.)

@item 
이제 부동 소수점과 십진수(decimals)에서 @ref{213,,fractions.Fraction} 인스턴스를 생성하는 것이 2–3배 빨라졌습니다. (Contributed by Serhiy Storchaka in bpo-25971@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25971}.)
@end itemize

@node 빌드와 C API 변경<2>,기타 개선 사항,최적화<4>,파이썬 3 6의 새로운 기능
@anchor{whatsnew/3 6 build-and-c-api-changes}@anchor{f0f}
@subsection 빌드와 C API 변경



@itemize *

@item 
이제 파이썬을 빌드하려면 도구 체인에서 일부 C99 지원이 필요합니다. 특히, 파이썬은 이제 @code{PY_LONG_LONG}과 같은 사용자 정의 매크로 자리에 표준 정수 형과 매크로를 사용합니다. 자세한 내용은, 
@geindex Python 향상 제안; PEP 7
PEP 7@footnote{https://peps.python.org/pep-0007/}과 bpo-17884@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17884}를 참조하십시오.

@item 
안드로이드 NDK와 안드로이드 API 수준이 21 (안드로이드 5.0 Lollipop) 이상으로 CPython을 교차 컴파일하면 성공적으로 실행됩니다. 안드로이드는 아직 지원되는 플랫폼이 아니지만, 파이썬 테스트 스위트는 약 16번의 테스트 실패만으로 안드로이드 에뮬레이터에서 실행됩니다. 안드로이드 메타 이슈 bpo-26865@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26865}를 참조하세요.

@item 
@code{--enable-optimizations} 구성 플래그가 추가되었습니다. 이를 켜면 PGO와 같은 값 비싼 최적화가 활성화됩니다. (Original patch by Alecsandru Patrascu of Intel in bpo-26359@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26359}.)

@item 
이제 @ref{e60,,PYMEM_DOMAIN_OBJ}(예를 들어: @ref{e61,,PyObject_Malloc()})와 @ref{e62,,PYMEM_DOMAIN_MEM}(예를 들어: @ref{e5e,,PyMem_Malloc()}) 도메인의 할당자 함수가 호출될 때 @ref{474,,GIL}이 유지되어야 합니다.

@item 
버퍼링 된 데이터 플러시가 실패했는지를 나타내는 새로운 @ref{f10,,Py_FinalizeEx()} API. (Contributed by Martin Panter in bpo-5319@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5319}.)

@item 
@ref{622,,PyArg_ParseTupleAndKeywords()} 는 이제 @ref{c77,,위치 전용 매개 변수}를 지원합니다. 위치 전용 매개 변수는 빈 이름으로 정의됩니다. (Contributed by Serhiy Storchaka in bpo-26282@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26282}).

@item 
@code{PyTraceback_Print} 메서드는 이제 반복되는 줄의 긴 시퀀스를 @code{"[Previous line repeated @{count@} more times]"}로 줄여줍니다. (Contributed by Emanuel Barry in bpo-26823@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26823}.)

@item 
새로운 @ref{f11,,PyErr_SetImportErrorSubclass()} 함수를 사용하면 발생시킬 @ref{659,,ImportError}의 서브 클래스를 지정할 수 있습니다. (Contributed by Eric Snow in bpo-15767@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15767}.)

@item 
새로운 @ref{f12,,PyErr_ResourceWarning()} 함수는 리소스 할당의 소스를 제공하는 @ref{54e,,ResourceWarning}을 생성하는 데 사용할 수 있습니다. (Contributed by Victor Stinner in bpo-26567@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26567}.)

@item 
새로운 @ref{f13,,PyOS_FSPath()} 함수는 @ref{5a0,,경로류 객체}의 파일 시스템 표현을 반환합니다. (Contributed by Brett Cannon in bpo-27186@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27186}.)

@item 
@ref{f14,,PyUnicode_FSConverter()}와 @ref{796,,PyUnicode_FSDecoder()} 함수는 이제 @ref{5a0,,경로류 객체}를 받아들입니다.
@end itemize

@node 기타 개선 사항,폐지<3>,빌드와 C API 변경<2>,파이썬 3 6의 새로운 기능
@anchor{whatsnew/3 6 other-improvements}@anchor{f15}
@subsection 기타 개선 사항



@itemize *

@item 
@ref{f16,,--version}(약식 형식: @ref{49c,,-V})이 두 번 제공되면, 파이썬은 자세한 정보로 @ref{49d,,sys.version}을 인쇄합니다.

@example
$ ./python -VV
Python 3.6.0b4+ (3.6:223967b49e49+, Nov 21 2016, 20:55:04)
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)]
@end example
@end itemize

@node 폐지<3>,제거<3>,기타 개선 사항,파이썬 3 6의 새로운 기능
@anchor{whatsnew/3 6 deprecated}@anchor{f17}
@subsection 폐지


@menu
* 새 키워드:: 
* 폐지된 파이썬 동작: 폐지된 파이썬 동작<2>. 
* 폐지된 파이썬 모듈@comma{} 함수 및 메서드: 폐지된 파이썬 모듈 함수 및 메서드<2>. 
* xml: xml<6>. 
* C API의 폐지된 함수와 형:: 
* 폐지된 빌드 옵션:: 

@end menu

@node 새 키워드,폐지된 파이썬 동작<2>,,폐지<3>
@anchor{whatsnew/3 6 new-keywords}@anchor{f18}
@subsubsection 새 키워드


@code{async}와 @code{await}는 변수, 클래스, 함수 또는 모듈 이름으로 사용하지 않는 것이 좋습니다. 파이썬 3.5에서 
@geindex Python 향상 제안; PEP 492
PEP 492@footnote{https://peps.python.org/pep-0492/}에 의해 도입되었으며, 파이썬 3.7에서 정식 키워드가 될 것입니다. 파이썬 3.6부터, @code{async}나 @code{await}를 이름으로 사용하면 @ref{1a3,,DeprecationWarning}이 생성됩니다.

@node 폐지된 파이썬 동작<2>,폐지된 파이썬 모듈 함수 및 메서드<2>,새 키워드,폐지<3>
@anchor{whatsnew/3 6 deprecated-python-behavior}@anchor{f19}
@subsubsection 폐지된 파이썬 동작


제너레이터 내에서 @ref{df4,,StopIteration} 예외를 발생시키면 이제 @ref{1a3,,DeprecationWarning}이 생성되고, 파이썬 3.7에서는 @ref{244,,RuntimeError}가 트리거될 것입니다. 자세한 내용은 @ref{f1a,,PEP 479; 제너레이터 내부에서의 StopIteration 처리 변경}를 참조하십시오.

The @ref{df5,,__aiter__()} method is now expected to return an asynchronous
iterator directly instead of returning an awaitable as previously.
Doing the former will trigger a @ref{1a3,,DeprecationWarning}.  Backward
compatibility will be removed in Python 3.7.
(Contributed by Yury Selivanov in bpo-27243@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27243}.)

유효한 이스케이프 시퀀스가 아닌 역 슬래시 문자 쌍은 이제 @ref{1a3,,DeprecationWarning}을 생성합니다. 이것은 결국 @ref{18e,,SyntaxError}가 될 것이지만, 몇 번의 파이썬 릴리스에서는 그렇게 되지 않을 것입니다. (Contributed by Emanuel Barry in bpo-27364@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27364}.)

상대 임포트를 수행할 때, @code{__spec__}이나 @code{__package__}가 정의되지 않을 때 호출하는 모듈에서 @code{__name__}과 @code{__path__}로 폴백하면 이제 @ref{71d,,ImportWarning}이 발생합니다. (Contributed by Rose Ames in bpo-25791@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25791}.)

@node 폐지된 파이썬 모듈 함수 및 메서드<2>,xml<6>,폐지된 파이썬 동작<2>,폐지<3>
@anchor{whatsnew/3 6 deprecated-python-modules-functions-and-methods}@anchor{f1b}
@subsubsection 폐지된 파이썬 모듈, 함수 및 메서드


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

@end menu

@node asynchat,asyncore,,폐지된 파이썬 모듈 함수 및 메서드<2>
@anchor{whatsnew/3 6 asynchat}@anchor{f1c}
@subsubsection asynchat


@code{asynchat}은 폐지되었고 @ref{b,,asyncio}로 대체합니다. (Contributed by Mariatta in bpo-25002@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25002}.)

@node asyncore,dbm<4>,asynchat,폐지된 파이썬 모듈 함수 및 메서드<2>
@anchor{whatsnew/3 6 asyncore}@anchor{f1d}
@subsubsection asyncore


@code{asyncore}는 폐지되었고 @ref{b,,asyncio}로 대체합니다. (Contributed by Mariatta in bpo-25002@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25002}.)

@node dbm<4>,distutils<6>,asyncore,폐지된 파이썬 모듈 함수 및 메서드<2>
@anchor{whatsnew/3 6 dbm}@anchor{f1e}
@subsubsection dbm


다른 @ref{35,,dbm} 구현과 달리, @ref{36,,dbm.dumb} 모듈은 @code{'rw'} 모드로 데이터베이스를 만들고 @code{'r'} 모드로 열린 데이터베이스를 수정할 수 있습니다. 이 동작은 이제 폐지되었고 3.8에서 제거됩니다. (Contributed by Serhiy Storchaka in bpo-21708@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21708}.)

@node distutils<6>,grp,dbm<4>,폐지된 파이썬 모듈 함수 및 메서드<2>
@anchor{whatsnew/3 6 id2}@anchor{f1f}
@subsubsection distutils


@code{distutils.Distribution} 생성자에 대한 문서화되지 않은 @code{extra_path} 인자는 이제 폐지된 것으로 간주하며 설정되면 경고가 발생합니다. 이 매개 변수에 대한 지원은 향후 파이썬 릴리스에서 제거됩니다. 자세한 내용은 bpo-27919@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27919}를 참조하십시오.

@node grp,importlib<7>,distutils<6>,폐지된 파이썬 모듈 함수 및 메서드<2>
@anchor{whatsnew/3 6 grp}@anchor{f20}
@subsubsection grp


@ref{f21,,getgrgid()}에서 정수가 아닌 인자에 대한 지원은 폐지되었습니다. (Contributed by Serhiy Storchaka in bpo-26129@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26129}.)

@node importlib<7>,os<10>,grp,폐지된 파이썬 모듈 함수 및 메서드<2>
@anchor{whatsnew/3 6 id3}@anchor{f22}
@subsubsection importlib


@ref{f23,,importlib.machinery.SourceFileLoader.load_module()}과 @ref{f24,,importlib.machinery.SourcelessFileLoader.load_module()} 메서드는 이제 폐지되었습니다. 이들은 @ref{a6a,,importlib.abc.Loader.exec_module()}로 대체하도록 이전 버전의 파이썬에서 폐지되지 않은 @ref{7b,,importlib}에 있는 유일한 @ref{a69,,importlib.abc.Loader.load_module()} 구현입니다.

@ref{f25,,importlib.machinery.WindowsRegistryFinder} 클래스는 이제 폐지되었습니다. 3.6.0부터, 기본적으로 (윈도우에서) @ref{f26,,sys.meta_path}에 계속 추가되지만, 향후 릴리스에서 변경될 수 있습니다.

@node os<10>,re<7>,importlib<7>,폐지된 파이썬 모듈 함수 및 메서드<2>
@anchor{whatsnew/3 6 id4}@anchor{f27}
@subsubsection os


@ref{a5,,os} 함수, @ref{4b2,,compile()} 및 유사한 함수에서 경로로 일반 @ref{193,,바이트열류 객체}에 대한 문서화되지 않은 지원은 이제 폐지되었습니다. (Contributed by Serhiy Storchaka in bpo-25791@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25791} and bpo-26754@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26754}.)

@node re<7>,ssl<9>,os<10>,폐지된 파이썬 모듈 함수 및 메서드<2>
@anchor{whatsnew/3 6 id5}@anchor{f28}
@subsubsection re


정규식 중간에 있는 인라인 플래그 @code{(?letters)}에 대한 지원은 폐지되었고 향후 파이썬 버전에서 제거됩니다. 정규식 시작 부분의 플래그는 계속 허용됩니다. (Contributed by Serhiy Storchaka in bpo-22493@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22493}.)

@node ssl<9>,tkinter<8>,re<7>,폐지된 파이썬 모듈 함수 및 메서드<2>
@anchor{whatsnew/3 6 id6}@anchor{f29}
@subsubsection ssl


OpenSSL 0.9.8, 1.0.0 및 1.0.1은 폐지되었고 더는 지원되지 않습니다. 향후에 @ref{d5,,ssl} 모듈에는 최소한 OpenSSL 1.0.2나 1.1.0이 필요합니다.

@ref{62,,ftplib}, @ref{73,,http.client}, @ref{78,,imaplib}, @ref{b1,,poplib} 및 @ref{cf,,smtplib}에서 @code{certfile}, @code{keyfile} 및 @code{check_hostname}과 같은 SSL 관련 인자는 폐지되었고 @code{context}로 대체합니다. (Contributed by Christian Heimes in bpo-28022@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28022}.)

@ref{d5,,ssl} 모듈의 몇 가지 프로토콜과 함수는 이제 폐지되었습니다. 일부 기능은 향후 버전의 OpenSSL에서 더는 사용할 수 없을 것입니다. 다른 기능들이 폐지되었고 다른 API로 대체합니다. (Contributed by Christian Heimes in bpo-28022@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28022} and bpo-26470@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26470}.)

@node tkinter<8>,venv<6>,ssl<9>,폐지된 파이썬 모듈 함수 및 메서드<2>
@anchor{whatsnew/3 6 id7}@anchor{f2a}
@subsubsection tkinter


@code{tkinter.tix} 모듈은 이제 폐지되었습니다. @ref{f6,,tkinter} 사용자는 대신 @ref{ff,,tkinter.ttk}를 사용해야합니다.

@node venv<6>,,tkinter<8>,폐지된 파이썬 모듈 함수 및 메서드<2>
@anchor{whatsnew/3 6 id8}@anchor{f2b}@anchor{whatsnew/3 6 whatsnew36-venv}@anchor{f2c}
@subsubsection venv


@code{pyvenv} 스크립트는 폐지되었고 @code{python3 -m venv}로 대체합니다. 이것은 @code{pyvenv}가 연결되어있는 파이썬 인터프리터가 무엇이고 따라서 가상 환경에서 어떤 파이썬 인터프리터가 사용될 것인지에 대한 혼동을 방지합니다. (Contributed by Brett Cannon in bpo-25154@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25154}.)

@node xml<6>,C API의 폐지된 함수와 형,폐지된 파이썬 모듈 함수 및 메서드<2>,폐지<3>
@anchor{whatsnew/3 6 xml}@anchor{f2d}
@subsubsection xml



@itemize *

@item 
As mitigation against DTD and external entity retrieval, the
@ref{128,,xml.dom.minidom} and @ref{12f,,xml.sax} modules no longer process
external entities by default.
(Contributed by Christian Heimes in gh-61441@footnote{https://github.com/python/cpython/issues/61441}.)
@end itemize

@node C API의 폐지된 함수와 형,폐지된 빌드 옵션,xml<6>,폐지<3>
@anchor{whatsnew/3 6 deprecated-functions-and-types-of-the-c-api}@anchor{f2e}
@subsubsection C API의 폐지된 함수와 형


문서화되지 않은 함수 @code{PyUnicode_AsEncodedObject()}, @code{PyUnicode_AsDecodedObject()}, @code{PyUnicode_AsEncodedUnicode()} 및 @code{PyUnicode_AsDecodedUnicode()} 는 이제 폐지되었습니다. 대신 @ref{f2f,,범용 코덱 기반 API}를 사용하십시오.

@node 폐지된 빌드 옵션,,C API의 폐지된 함수와 형,폐지<3>
@anchor{whatsnew/3 6 deprecated-build-options}@anchor{f30}
@subsubsection 폐지된 빌드 옵션


@code{--with-system-ffi} 구성 플래그는 이제 비 macOS 유닉스 플랫폼에서 기본적으로 켜집니다. @code{--without-system-ffi}를 사용하여 비활성화 할 수 있지만, 플래그 사용은 폐지되었고 파이썬 3.7에서는 허용되지 않을 것입니다. macOS는 이 변경의 영향을 받지 않습니다. 많은 OS 배포자는 시스템 파이썬을 빌드할 때 이미 @code{--with-system-ffi} 플래그를 사용함에 유의하십시오.

@node 제거<3>,파이썬 3 6으로 이식하기,폐지<3>,파이썬 3 6의 새로운 기능
@anchor{whatsnew/3 6 removed}@anchor{f31}
@subsection 제거


@menu
* API와 기능 제거:: 

@end menu

@node API와 기능 제거,,,제거<3>
@anchor{whatsnew/3 6 api-and-feature-removals}@anchor{f32}
@subsubsection API와 기능 제거



@itemize *

@item 
정규식에서 @code{'\'}와 ASCII 문자로 구성된 알 수 없는 이스케이프는 이제 에러를 발생시킵니다. @ref{5a2,,re.sub()}의 치환 템플릿에서는 여전히 허용되지만, 폐지되었습니다. @ref{d62,,re.LOCALE} 플래그는 이제 바이너리 패턴에서만 사용할 수 있습니다.

@item 
@code{inspect.getmoduleinfo()}가 제거되었습니다 (CPython 3.3부터 폐지되었습니다). @ref{f33,,inspect.getmodulename()}은 주어진 경로에 대한 모듈 이름을 얻는 데 사용해야 합니다. (Contributed by Yury Selivanov in bpo-13248@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13248}.)

@item 
@code{traceback.Ignore} 클래스와 @code{traceback.usage}, @code{traceback.modname}, @code{traceback.fullmodname}, @code{traceback.find_lines_from_code}, @code{traceback.find_lines}, @code{traceback.find_strings}, @code{traceback.find_executable_lines} 메서드가 @ref{104,,traceback} 모듈에서 제거되었습니다. 그것들은 파이썬 3.2 이후 폐지된 문서화되지 않은 메서드였으며 동등한 기능은 비공개 메서드에서 사용할 수 있습니다.

@item 
@ref{f6,,tkinter} 위젯 클래스의 @code{tk_menuBar()}와 @code{tk_bindForTraversal()} 더미 메서드가 제거되었습니다 (해당 Tk 명령은 Tk 4.0 이후로 사용되지 않습니다).

@item 
@ref{8d2,,zipfile.ZipFile} 클래스의 @ref{65b,,open()} 메서드는 더는 @code{'U'} 모드를 지원하지 않습니다 (파이썬 3.4부터 폐지되었습니다). @ref{f34,,유니버설 줄 넘김} 모드에서 압축된 텍스트 파일을 읽으려면 @ref{9be,,io.TextIOWrapper}를 사용하십시오.

@item 
문서화되지 않은 @code{IN}, @code{CDROM}, @code{DLFCN}, @code{TYPES}, @code{CDIO} 및 @code{STROPTS} 모듈이 제거되었습니다. 이들은 플랫폼별 @code{Lib/plat-*/} 디렉터리에 있었지만, 만성적으로 구식이었고, 여러 플랫폼에서 일관성 없이 사용할 수 있으며, 유지 관리되지 않았습니다. 이러한 모듈을 만든 스크립트는 소스 배포에서 Tools/scripts/h2py.py@footnote{https://github.com/python/cpython/blob/v3.6.15/Tools/scripts/h2py.py}로 계속 제공됩니다.

@item 
폐지된 @code{asynchat.fifo} 클래스가 제거되었습니다.
@end itemize

@node 파이썬 3 6으로 이식하기,파이썬 3 6 2의 주목할만한 변경 사항,제거<3>,파이썬 3 6의 새로운 기능
@anchor{whatsnew/3 6 porting-to-python-3-6}@anchor{f35}
@subsection 파이썬 3.6으로 이식하기


이 섹션에서는 여러분의 코드 변경이 필요할 수 있는 이전에 설명한 변경 사항과 기타 버그 수정을 나열합니다.

@menu
* ‘python’ 명령 동작의 변경 사항:: 
* 파이썬 API의 변경 사항:: 
* C API의 변경 사항:: 
* CPython 바이트 코드 변경 사항: CPython 바이트 코드 변경 사항<2>. 

@end menu

@node ‘python’ 명령 동작의 변경 사항,파이썬 API의 변경 사항,,파이썬 3 6으로 이식하기
@anchor{whatsnew/3 6 changes-in-python-command-behavior}@anchor{f36}
@subsubsection ‘python’ 명령 동작의 변경 사항



@itemize *

@item 
정의된 @code{COUNT_ALLOCS}, @code{SHOW_ALLOC_COUNT} 또는 @code{SHOW_TRACK_COUNT} 매크로가 있는 특수 파이썬 빌드의 출력은 이제 기본적으로 꺼져 있습니다. @code{-X showalloccount} 옵션을 사용하여 다시 활성화할 수 있습니다. 이제 @code{stdout} 대신 @code{stderr}로 출력됩니다. (Contributed by Serhiy Storchaka in bpo-23034@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23034}.)
@end itemize

@node 파이썬 API의 변경 사항,C API의 변경 사항,‘python’ 명령 동작의 변경 사항,파이썬 3 6으로 이식하기
@anchor{whatsnew/3 6 changes-in-the-python-api}@anchor{f37}
@subsubsection 파이썬 API의 변경 사항



@itemize *

@item 
@ref{316,,open()}은 더는 @code{'U'} 모드 플래그를 @code{'+'}와 결합하는 것을 허용하지 않습니다. (Contributed by Jeff Balogh and John O’Connor in bpo-2091@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2091}.)

@item 
@ref{d4,,sqlite3}은 더는 DDL 문 이전에 열린 트랜잭션을 묵시적으로 커밋하지 않습니다.

@item 
리눅스에서, @ref{745,,os.urandom()}은 이제 보안을 강화하기 위해 시스템 urandom 엔트로피 풀이 초기화될 때까지 블록합니다.

@item 
@ref{a6a,,importlib.abc.Loader.exec_module()}이 정의되면, @ref{eab,,importlib.abc.Loader.create_module()}도 정의되어야 합니다.

@item 
@ref{f38,,PyErr_SetImportError()}는 이제 `msg' 인자가 설정되지 않았을 때 @ref{198,,TypeError}를 설정합니다. 이전에는 @code{NULL}만 반환되었습니다.

@item 
코드 객체의 @ref{330,,co_lnotab} 어트리뷰트 형식이 음수 줄 번호 델타를 지원하도록 변경되었습니다. 기본적으로, 파이썬은 음의 줄 번호 델타가 있는 바이트 코드를 내보내지 않습니다. @ref{9af,,frame.f_lineno}, @code{PyFrame_GetLineNumber()} 또는 @code{PyCode_Addr2Line()}을 사용하는 함수는 영향을 받지 않습니다. @code{co_lnotab}을 직접 디코딩하는 함수는 줄 번호 델타에 부호 있는 8비트 정수 형을 사용하도록 갱신해야 하지만, 이는 음의 줄 번호 델타를 사용하는 응용 프로그램을 지원하는 데만 필요합니다. @code{co_lnotab} 형식과 디코딩 방법에 대해서는 @code{Objects/lnotab_notes.txt}를 참조하고, 그 이유는 
@geindex Python 향상 제안; PEP 511
PEP 511@footnote{https://peps.python.org/pep-0511/}을 참조하십시오.

@item 
@ref{21,,compileall} 모듈의 함수는 이제 @code{1}이나 @code{0} 대신 불리언을 반환하여 각각 성공이나 실패를 나타냅니다. 불리언은 정수의 서브 클래스이기 때문에, @code{1}이나 @code{0}에 대한 아이덴티티 검사를 수행하는 경우에만 문제가 됩니다. bpo-25768@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25768}을 참조하십시오.

@item 
Reading the @code{port} attribute of
@ref{f39,,urllib.parse.urlsplit()} and @ref{362,,urlparse()} results
now raises @ref{2ec,,ValueError} for out-of-range values, rather than
returning @ref{884,,None}.  See bpo-20059@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20059}.

@item 
@code{imp} 모듈은 이제 @ref{ac6,,PendingDeprecationWarning} 대신 @ref{1a3,,DeprecationWarning}을 발생시킵니다.

@item 
The following modules have had missing APIs added to their
@ref{f3a,,__all__} attributes to match the documented APIs:
@ref{15,,calendar}, @code{cgi}, @ref{2d,,csv},
@ref{12b,,ElementTree}, @ref{5a,,enum},
@ref{5f,,fileinput}, @ref{62,,ftplib}, @ref{8b,,logging}, @ref{8f,,mailbox},
@ref{93,,mimetypes}, @ref{a4,,optparse}, @ref{b0,,plistlib}, @code{smtpd},
@ref{dc,,subprocess}, @ref{e4,,tarfile}, @ref{f3,,threading} and
@ref{119,,wave}.  This means they will export new symbols when @code{import *}
is used.
(Contributed by Joel Taddei and Jacek Kołodziej in bpo-23883@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23883}.)

@item 
상대 임포트를 수행할 때, @code{__package__}가 @code{__spec__.parent}와 같다고 비교되지 않으면 @ref{71d,,ImportWarning}이 발생합니다. (Contributed by Brett Cannon in bpo-25791@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25791}.)

@item 
상대 임포트가 수행되고 부모 패키지가 알려지지 않았으면, @ref{659,,ImportError}가 발생합니다. 이전에는, @ref{794,,SystemError}를 발생시킬 수 있었습니다. (Contributed by Brett Cannon in bpo-18018@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18018}.)

@item 
@ref{76,,http.server}, @ref{135,,xmlrpc.server} 및 @ref{121,,wsgiref.simple_server}에 정의된 서버를 포함하여, @ref{d2,,socketserver} 모듈을 기반으로 하는 서버는 이제 @ref{bcc,,Exception}에서 파생된 예외만 포착합니다. 따라서 요청 처리기가 @ref{f3b,,SystemExit}나 @ref{bc4,,KeyboardInterrupt}와 같은 예외를 발생시키면, @ref{f3c,,handle_error()}가 더는 호출되지 않고, 예외로 인해 단일 스레드 서버가 중지됩니다. (Contributed by Martin Panter in bpo-23430@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23430}.)

@item 
@code{spwd.getspnam()}은 이제 사용자에게 권한이 없으면 @ref{5e5,,KeyError} 대신 @ref{f3d,,PermissionError}를 발생시킵니다.

@item 
@ref{f3e,,socket.socket.close()} 메서드는 하부 시스템 호출에 의해 에러(예를 들어 @code{EBADF})가 보고되면 예외를 발생시킵니다. (Contributed by Martin Panter in bpo-26685@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26685}.)

@item 
@code{smtpd.SMTPChannel}과 @code{smtpd.SMTPServer} 생성자에 대한 `decode_data' 인자는 이제 기본적으로 @code{False}입니다. 이것은 @code{process_message()}에 전달된 인자가 이제 기본적으로 바이트열 객체이고, @code{process_message()}에 키워드 인자가 전달됨을 의미합니다. 3.5에서 생성된 폐지 경고에 따라 이미 갱신된 코드는 영향을 받지 않습니다.

@item 
@ref{86,,json} 모듈의 @ref{f3f,,dump()}, @ref{f40,,dumps()}, @ref{eb1,,load()} 및 @ref{b4e,,loads()} 함수와 @ref{f41,,JSONEncoder}와 @ref{f42,,JSONDecoder} 클래스 생성자의 모든 선택적 인자는 이제 @ref{5a4,,키워드 전용}입니다. (Contributed by Serhiy Storchaka in bpo-18726@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18726}.)

@item 
@code{type.__new__}를 재정의하지 않는 @ref{f43,,type}의 서브 클래스는 더는 단일 인자 형식을 사용하여 객체 형을 가져올 수 없습니다.

@item 
As part of 
@geindex Python 향상 제안; PEP 487
PEP 487@footnote{https://peps.python.org/pep-0487/}, the handling of keyword arguments passed to
@ref{f43,,type} (other than the metaclass hint, @code{metaclass}) is now
consistently delegated to @ref{842,,object.__init_subclass__()}. This means that
@ref{79f,,type.__new__} and @ref{8be,,type.__init__} both now accept arbitrary keyword arguments,
but @code{object.__init_subclass__()} (which is called from
@code{type.__new__}) will reject them by default.
Custom metaclasses accepting additional keyword arguments will need to adjust
their calls to @code{type.__new__}
(whether direct or via @ref{1a6,,super}) accordingly.

@item 
@code{distutils.command.sdist.sdist}에서, @code{default_format} 어트리뷰트가 제거되었으며 더는 적용되지 않습니다. 대신, gzip 된 tar 파일 형식이 모든 플랫폼에서 기본값이며 플랫폼별 선택이 이루어지지 않습니다. 윈도우에서 배포가 빌드되고 zip 배포가 필요한 환경에서는, 다음을 포함하는 @code{setup.cfg} 파일로 프로젝트를 구성하십시오:

@example
[sdist]
formats=zip
@end example

이 동작은 Setuptools 26.0.0에 의해 이전 파이썬 버전으로 역 이식되었습니다.

@item 
@ref{111,,urllib.request} 모듈과 @ref{ea6,,http.client.HTTPConnection.request()} 메서드에서, Content-Length 헤더 필드가 지정되지 않았고 요청 본문이 파일 객체이면, 이제 HTTP 1.1 청크 인코딩(chunked encoding)으로 전송됩니다. 파일 객체를 HTTP 1.0 서버로 보내야 하면, 이제 호출자가 Content-Length 값을 지정해야 합니다. (Contributed by Demian Brecht and Rolf Krahl with tweaks from Martin Panter in bpo-12319@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12319}.)

@item 
@ref{bd7,,DictReader}는 이제 @ref{7f2,,OrderedDict} 형의 행을 반환합니다. (Contributed by Steve Holden in bpo-27842@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27842}.)

@item 
플랫폼에서 지원하지 않으면, @code{crypt.METHOD_CRYPT}는 더는 @code{crypt.methods}에 추가되지 않습니다. (Contributed by Victor Stinner in bpo-25287@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25287}.)

@item 
@ref{4e0,,namedtuple()}에 대한 `verbose'와 `rename' 인자는 이제 키워드 전용입니다. (Contributed by Raymond Hettinger in bpo-25628@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25628}.)

@item 
리눅스에서, @ref{f44,,ctypes.util.find_library()}는 이제 @code{LD_LIBRARY_PATH}에서 공유 라이브러리를 찾습니다. (Contributed by Vinay Sajip in bpo-9998@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9998}.)

@item 
@ref{aff,,imaplib.IMAP4} 클래스는 이제 서버에서 보낸 메시지의 @code{']'} 문자를 포함하는 플래그를 처리하여 실세계 호환성을 향상합니다. (Contributed by Lita Cho in bpo-21815@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21815}.)

@item 
The @ref{f45,,mmap.mmap.write()} function now returns the number
of bytes written like other write methods.
(Contributed by Jakub Stasiak in bpo-26335@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26335}.)

@item 
@ref{f46,,pkgutil.iter_modules()}와 @ref{df8,,pkgutil.walk_packages()} 함수는 네임드 튜플 @ref{f47,,ModuleInfo}를 반환합니다. (Contributed by Ramchandra Apte in bpo-17211@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17211}.)

@item 
@ref{5a2,,re.sub()}는 이제 문자열에서 패턴을 찾을 수 없는 경우에도 치환 템플릿에 있는 잘못된 숫자 그룹 참조에 대해 에러를 발생시킵니다. 이제 잘못된 그룹 참조에 대한 에러 메시지에 그룹 인덱스와 참조 위치가 포함됩니다. (Contributed by SilentGhost, Serhiy Storchaka in bpo-25953@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25953}.)

@item 
@ref{8d2,,zipfile.ZipFile}은 이제 인식할 수 없는 압축 값에 대해 @ref{36b,,NotImplementedError} 를 발생시킵니다. 이전에는 일반 @ref{244,,RuntimeError}가 발생했습니다. 또한, 닫힌 ZipFile에서 @code{ZipFile} 메서드를 호출하거나 @code{'r'} 모드로 만든 ZipFile에서 @ref{f48,,write()} 메서드를 호출하면 @ref{2ec,,ValueError}가 발생합니다. 이전에는, 이러한 시나리오에서 @code{RuntimeError}가 발생했습니다.

@item 
사용자 정의 메타 클래스가 인자가 없는 @ref{1a6,,super()}나 메서드에서 묵시적 @code{__class__} 클로저 변수로의 직접 참조와 결합할 때, 묵시적 @code{__classcell__} 이름 공간 항목은 이제 초기화를 위해 @code{type.__new__}까지 전달되어야 합니다. 그렇게 하지 않으면 파이썬 3.6에서는 @ref{1a3,,DeprecationWarning}이, 파이썬 3.8에서는 @ref{244,,RuntimeError}가 발생합니다.

@item 
@ref{d3c,,ModuleNotFoundError} 의 도입으로, 임포트 시스템 소비자는 임포트 시스템 교체로 인해 적절한 경우 덜 구체적인 @ref{659,,ImportError}가 아닌 더 구체적인 예외가 발생할 것으로 기대할 수 있습니다. 이러한 소비자와의 향후 호환성을 제공하기 위해, @ref{ad1,,__import__()}를 완전히 대체하는 대체 임포트 시스템의 구현자는 모듈을 전혀 찾을 수 없을 때 새 서브 클래스를 발생시키도록 구현을 갱신해야 합니다. 기본 임포트 시스템에 대한 호환 플러그인의 구현자는 필요한 경우 기본 임포트 시스템이 새 서브 클래스를 발생시키므로 변경할 필요가 없습니다.
@end itemize

@node C API의 변경 사항,CPython 바이트 코드 변경 사항<2>,파이썬 API의 변경 사항,파이썬 3 6으로 이식하기
@anchor{whatsnew/3 6 changes-in-the-c-api}@anchor{f49}
@subsubsection C API의 변경 사항



@itemize *

@item 
@ref{e5e,,PyMem_Malloc()} 할당자 패밀리는 이제 시스템 @code{malloc()}이 아닌 @ref{f0a,,pymalloc 할당자}를 사용합니다. 이제 GIL을 보유하지 않고 @code{PyMem_Malloc()}을 호출하는 응용 프로그램이 충돌할 수 있습니다. 응용 프로그램에서 메모리 할당자의 사용을 확인하려면 
@geindex PYTHONMALLOC
@geindex 환경 변수; PYTHONMALLOC
@ref{e5d,,PYTHONMALLOC} 환경 변수를 @code{debug}로 설정하십시오. bpo-26249@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26249}를 참조하십시오.

@item 
@ref{f4a,,Py_Exit()}(그리고 메인 인터프리터)는 이제 버퍼링 된 데이터를 플러시 하지 못하면 종료 상태를 120으로 재정의합니다. bpo-5319@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5319}를 참조하십시오.
@end itemize

@node CPython 바이트 코드 변경 사항<2>,,C API의 변경 사항,파이썬 3 6으로 이식하기
@anchor{whatsnew/3 6 cpython-bytecode-changes}@anchor{f4b}
@subsubsection CPython 바이트 코드 변경 사항


파이썬 3.6에서 @ref{4ab,,바이트 코드}에 몇 가지 주요 변경 사항이 있습니다.


@itemize *

@item 
파이썬 인터프리터는 이제 바이트 코드 대신 16비트 워드 코드를 사용합니다. (Contributed by Demur Rumed with input and reviews from Serhiy Storchaka and Victor Stinner in bpo-26647@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26647} and bpo-28050@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28050}.)

@item 
@ref{e28,,포맷 문자열 리터럴} 구현의 일부로 새로운 @code{FORMAT_VALUE}와 @ref{f4c,,BUILD_STRING} 옵코드. (Contributed by Eric Smith in bpo-25483@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25483} and Serhiy Storchaka in bpo-27078@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27078}.)

@item 
The new @code{BUILD_CONST_KEY_MAP} opcode to optimize the creation
of dictionaries with constant keys.
(Contributed by Serhiy Storchaka in bpo-27140@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27140}.)

@item 
더 나은 성능과 더 간단한 구현을 위해 함수 호출 옵코드들이 크게 다시 작업 되었습니다. @ref{f4d,,MAKE_FUNCTION}, @code{CALL_FUNCTION}, @code{CALL_FUNCTION_KW} 및 @code{BUILD_MAP_UNPACK_WITH_CALL} 옵코드가 수정되었으며, 새로운 @ref{f4e,,CALL_FUNCTION_EX} 와 @code{BUILD_TUPLE_UNPACK_WITH_CALL}이 추가되었으며, @code{CALL_FUNCTION_VAR}, @code{CALL_FUNCTION_VAR_KW} 및 @code{MAKE_CLOSURE} 옵코드가 제거되었습니다. (Contributed by Demur Rumed in bpo-27095@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27095}, and Serhiy Storchaka in bpo-27213@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27213}, bpo-28257@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28257}.)

@item 
새로운 @ref{f4f,,변수 어노테이션} 문법을 지원하기 위해 새로운 @ref{f50,,SETUP_ANNOTATIONS}와 @code{STORE_ANNOTATION} 옵코드가 추가되었습니다. (Contributed by Ivan Levkivskyi in bpo-27985@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27985}.)
@end itemize

@node 파이썬 3 6 2의 주목할만한 변경 사항,파이썬 3 6 4의 주목할만한 변경 사항,파이썬 3 6으로 이식하기,파이썬 3 6의 새로운 기능
@anchor{whatsnew/3 6 notable-changes-in-python-3-6-2}@anchor{f51}
@subsection 파이썬 3.6.2의 주목할만한 변경 사항


@menu
* 새로운 make regen-all 빌드 대상:: 
* make touch 빌드 대상 제거:: 

@end menu

@node 새로운 make regen-all 빌드 대상,make touch 빌드 대상 제거,,파이썬 3 6 2의 주목할만한 변경 사항
@anchor{whatsnew/3 6 new-make-regen-all-build-target}@anchor{f52}
@subsubsection 새로운 @code{make regen-all} 빌드 대상


교차 컴파일을 단순화하고, 기존 버전의 파이썬을 이미 사용할 수 있을 필요 없이 CPython을 안정적으로 컴파일 할 수 있도록, autotools 기반 빌드 시스템은 더는 파일 수정 시간을 기반으로 생성된 파일을 묵시적으로 재컴파일하려고 시도하지 않습니다.

대신, 원할 때 이러한 파일을 강제로 재생성하기 위해 새로운 @code{make regen-all} 명령이 추가되었습니다 (예를 들어 사전 생성된 버전을 기반으로 파이썬의 초기 버전이 이미 빌드된 후).

더 선택적인 재생성 대상도 정의됩니다 - 자세한 내용은 Makefile.pre.in@footnote{https://github.com/python/cpython/tree/3.14/Makefile.pre.in}을 참조하십시오.

(Contributed by Victor Stinner in bpo-23404@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23404}.)


Added in version 3.6.2.


@node make touch 빌드 대상 제거,,새로운 make regen-all 빌드 대상,파이썬 3 6 2의 주목할만한 변경 사항
@anchor{whatsnew/3 6 removal-of-make-touch-build-target}@anchor{f53}
@subsubsection @code{make touch} 빌드 대상 제거


수정 시간을 갱신하여 생성된 파일의 묵시적 재생성을 요청하는 데 이전에 사용된 @code{make touch} 빌드 대상이 제거되었습니다.

새로운 @code{make regen-all} 대상으로 대체되었습니다.

(Contributed by Victor Stinner in bpo-23404@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23404}.)


버전 3.6.2에서 변경.


@node 파이썬 3 6 4의 주목할만한 변경 사항,파이썬 3 6 5의 주목할만한 변경 사항,파이썬 3 6 2의 주목할만한 변경 사항,파이썬 3 6의 새로운 기능
@anchor{whatsnew/3 6 notable-changes-in-python-3-6-4}@anchor{f54}
@subsection 파이썬 3.6.4의 주목할만한 변경 사항


공용 API의 일부였던 @code{PyExc_RecursionErrorInst} 싱글톤은 멤버가 삭제되지 않아서 인터프리터 종료 중에 세그멘테이션 오류가 발생할 수 있어서 제거되었습니다. (Contributed by Xavier de Gaye in bpo-22898@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22898} and bpo-30697@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30697}.)

@node 파이썬 3 6 5의 주목할만한 변경 사항,파이썬 3 6 7의 주목할만한 변경 사항,파이썬 3 6 4의 주목할만한 변경 사항,파이썬 3 6의 새로운 기능
@anchor{whatsnew/3 6 notable-changes-in-python-3-6-5}@anchor{f55}
@subsection 파이썬 3.6.5의 주목할만한 변경 사항


이제 @ref{df7,,locale.localeconv()} 함수는 때에 따라 임시로 @code{LC_CTYPE} 로케일을 @code{LC_NUMERIC} 로케일로 설정합니다. (Contributed by Victor Stinner in bpo-31900@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31900}.)

@node 파이썬 3 6 7의 주목할만한 변경 사항,파이썬 3 6 10의 주목할만한 변경 사항,파이썬 3 6 5의 주목할만한 변경 사항,파이썬 3 6의 새로운 기능
@anchor{whatsnew/3 6 notable-changes-in-python-3-6-7}@anchor{f56}
@subsection 파이썬 3.6.7의 주목할만한 변경 사항


@ref{128,,xml.dom.minidom} and @ref{12f,,xml.sax} modules no longer process
external entities by default. See also gh-61441@footnote{https://github.com/python/cpython/issues/61441}.

3.6.7에서 @ref{101,,tokenize} 모듈은 이제 후행 줄 넘김이 없는 입력이 제공될 때 묵시적으로 @code{NEWLINE} 토큰을 내보냅니다. 이 동작은 이제 C 토크나이저가 내부적으로 수행하는 작업과 일치합니다. (Contributed by Ammar Askar in bpo-33899@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33899}.)

@node 파이썬 3 6 10의 주목할만한 변경 사항,파이썬 3 6 13의 주목할만한 변경 사항,파이썬 3 6 7의 주목할만한 변경 사항,파이썬 3 6의 새로운 기능
@anchor{whatsnew/3 6 notable-changes-in-python-3-6-10}@anchor{f57}
@subsection 파이썬 3.6.10의 주목할만한 변경 사항


심각한 보안 문제로 인해 @ref{93b,,asyncio.loop.create_datagram_endpoint()}의 `reuse_address' 매개 변수는 더는 지원되지 않습니다. 이는 UDP에서 소켓 옵션 @code{SO_REUSEADDR}의 동작 때문입니다. 자세한 내용은 @code{loop.create_datagram_endpoint()} 설명서를 참조하십시오. (Contributed by Kyle Stanley, Antoine Pitrou, and Yury Selivanov in bpo-37228@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37228}.)

@node 파이썬 3 6 13의 주목할만한 변경 사항,파이썬 3 6 14의 주목할만한 변경 사항,파이썬 3 6 10의 주목할만한 변경 사항,파이썬 3 6의 새로운 기능
@anchor{whatsnew/3 6 notable-changes-in-python-3-6-13}@anchor{f58}
@subsection 파이썬 3.6.13의 주목할만한 변경 사항


이전 파이썬 버전에서는 @ref{31f,,urllib.parse.parse_qs()}와 @ref{31e,,urllib.parse.parse_qsl()}에서 쿼리 매개 변수 구분자로 @code{;}과 @code{&}를 모두 사용할 수 있었습니다. 보안 문제와 최신 W3C 권장 사항을 준수하기 위해, @code{&}가 기본값인 단일 구분자 키만 허용하도록 변경되었습니다. 이 변경 사항은 영향을 받는 함수를 내부적으로 사용하므로 @code{cgi.parse()}와 @code{cgi.parse_multipart()}에도 영향을 줍니다. 자세한 내용은 해당 설명서를 참조하십시오. (Contributed by Adam Goldschmidt, Senthil Kumaran and Ken Jin in bpo-42967@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42967}.)

@node 파이썬 3 6 14의 주목할만한 변경 사항,,파이썬 3 6 13의 주목할만한 변경 사항,파이썬 3 6의 새로운 기능
@anchor{whatsnew/3 6 notable-changes-in-python-3-6-14}@anchor{f59}
@subsection 파이썬 3.6.14의 주목할만한 변경 사항


A security fix alters the @ref{af6,,ftplib.FTP} behavior to not trust the
IPv4 address sent from the remote server when setting up a passive data
channel.  We reuse the ftp server IP address instead.  For unusual code
requiring the old behavior, set a @code{trust_server_pasv_ipv4_address}
attribute on your FTP instance to @code{True}.  (See gh-87451@footnote{https://github.com/python/cpython/issues/87451})

The presence of newline or tab characters in parts of a URL allows for some
forms of attacks. Following the WHATWG specification that updates RFC 3986,
ASCII newline @code{\n}, @code{\r} and tab @code{\t} characters are stripped from the
URL by the parser @ref{110,,urllib.parse()} preventing such attacks. The removal
characters are controlled by a new module level variable
@code{urllib.parse._UNSAFE_URL_BYTES_TO_REMOVE}. (See gh-88048@footnote{https://github.com/python/cpython/issues/88048})

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 파이썬 3 5의 새로운 기능,What’s New In Python 3 4,파이썬 3 6의 새로운 기능,파이썬의 새로운 기능
@anchor{whatsnew/3 5 doc}@anchor{f5a}@anchor{whatsnew/3 5 translation-repo}@anchor{f5b}@anchor{whatsnew/3 5 what-s-new-in-python-3-5}@anchor{f5c}
@section 파이썬 3.5의 새로운 기능


@*편집자: 
Elvis Pranskevichus <@email{elvis@@magic.io}>, Yury Selivanov <@email{yury@@magic.io}>


@c Rules for maintenance:
@c 
@c * Anyone can add text to this document.  Do not spend very much time
@c on the wording of your changes, because your text will probably
@c get rewritten to some degree.
@c 
@c * The maintainer will go through Misc/NEWS periodically and add
@c changes; it's therefore more important to add your changes to
@c Misc/NEWS than to this file.
@c 
@c * This is not a complete list of every single change; completeness
@c is the purpose of Misc/NEWS.  Some changes I consider too small
@c or esoteric to include.  If such a change is added to the text,
@c I'll just remove it.  (This is another reason you shouldn't spend
@c too much time on writing your addition.)
@c 
@c * If you want to draw your new text to the attention of the
@c maintainer, add 'XXX' to the beginning of the paragraph or
@c section.
@c 
@c * It's OK to just add a fragmentary note about a change.  For
@c example: "XXX Describe the transmogrify() function added to the
@c socket module."  The maintainer will research the change and
@c write the necessary text.
@c 
@c * You can comment out your additions if you like, but it's not
@c necessary (especially when a final release is some months away).
@c 
@c * Credit the author of a patch or bugfix.   Just the name is
@c sufficient; the e-mail address isn't necessary.
@c 
@c * It's helpful to add the bug/patch number as a comment:
@c 
@c XXX Describe the transmogrify() function added to the socket
@c module.
@c (Contributed by P.Y. Developer in :issue:`12345`.)
@c 
@c This saves the maintainer the effort of going through the Mercurial log
@c when researching a change.

This article explains the new features in Python 3.5, compared to 3.4.
Python 3.5 was released on September 13, 2015.  See the
changelog@footnote{https://docs.python.org/3.5/whatsnew/changelog.html} for a full
list of changes.


@subsubheading 더 보기


@geindex Python 향상 제안; PEP 478
PEP 478@footnote{https://peps.python.org/pep-0478/} - 파이썬 3.5 출시 일정


@menu
* 요약 – 배포 주요 사항: 요약 – 배포 주요 사항<5>. 
* 새로운 기능: 새로운 기능<6>. 
* 기타 언어 변경: 기타 언어 변경<6>. 
* 새로운 모듈: 새로운 모듈<2>. 
* 개선된 모듈: 개선된 모듈<5>. 
* 기타 모듈 수준 변경:: 
* 최적화: 최적화<5>. 
* 빌드와 C API 변경: 빌드와 C API 변경<3>. 
* 폐지: 폐지<4>. 
* 제거: 제거<4>. 
* 파이썬 3.5로 이식하기: 파이썬 3 5로 이식하기. 
* 파이썬 3.5.4의 주목할만한 변경 사항: 파이썬 3 5 4의 주목할만한 변경 사항. 

@end menu

@node 요약 – 배포 주요 사항<5>,새로운 기능<6>,,파이썬 3 5의 새로운 기능
@anchor{whatsnew/3 5 summary-release-highlights}@anchor{f5d}
@subsection 요약 – 배포 주요 사항


새로운 문법 기능:


@itemize *

@item 
@ref{f5e,,PEP 492}, async와 await 구문을 사용하는 코루틴.

@item 
@ref{f5f,,PEP 465}, 새로운 행렬 곱셈 연산자: @code{a @@ b}.

@item 
@ref{f60,,PEP 448}, 추가적인 언 패킹 일반화.
@end itemize

새로운 라이브러리 모듈:


@itemize *

@item 
@ref{10a,,typing}: @ref{f61,,PEP 484 – 형 힌트}.

@item 
@ref{136,,zipapp}: @ref{f62,,PEP 441 파이썬 ZIP 응용 프로그램 지원 개선}.
@end itemize

새로운 내장 기능:


@itemize *

@item 
@code{bytes % args}, @code{bytearray % args} : @ref{f63,,PEP 461} – bytes와 bytearray에 @code{%} 포매팅 추가.

@item 
새로운 @ref{f64,,bytes.hex()}, @ref{f65,,bytearray.hex()} 및 @ref{f66,,memoryview.hex()} 메서드. (Contributed by Arnon Yaari in bpo-9951@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9951}.)

@item 
@ref{165,,memoryview}는 이제 튜플 인덱싱(다차원 포함)을 지원합니다. (Contributed by Antoine Pitrou in bpo-23632@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23632}.)

@item 
제너레이터에는 @code{yield from} 표현식에 의해 이터레이션 중인 객체를 반환하는 새로운 @code{gi_yieldfrom} 어트리뷰트가 있습니다. (Contributed by Benno Leslie and Yury Selivanov in bpo-24450@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24450}.)

@item 
이제 최대 재귀 깊이에 도달하면 새로운 @ref{f67,,RecursionError} 예외가 발생합니다. (Contributed by Georg Brandl in bpo-19235@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19235}.)
@end itemize

CPython 구현 개선:


@itemize *

@item 
@code{LC_TYPE} 로케일이 POSIX 로케일(@code{C} 로케일)일 때, @ref{75e,,sys.stdin}과 @ref{ccc,,sys.stdout}은 이제 @code{strict} 에러 처리기 대신 @code{surrogateescape} 에러 처리기를 사용합니다. (Contributed by Victor Stinner in bpo-19977@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19977}.)

@item 
@code{.pyo} 파일은 더는 사용되지 않으며 @code{.pyc} 이름에 명시적으로 최적화 수준을 포함하는 더 유연한 체계로 대체되었습니다. (@ref{f68,,PEP 488 개요}를 참조하십시오.)

@item 
내장과 확장 모듈은 이제 파이썬 모듈이 로드되는 방식과 유사한 다단계 절차로 초기화됩니다. (@ref{f69,,PEP 489 개요}를 참조하십시오.)
@end itemize

표준 라이브러리의 현저한 개선:


@itemize *

@item 
@ref{7f2,,collections.OrderedDict}는 이제 @ref{f6a,,C로 구현}되어서 4 에서 100배 더 빠릅니다.

@item 
@ref{d5,,ssl} 모듈은 네트워크 IO에서 SSL 프로토콜 처리를 분리하는 @ref{f6b,,메모리 BIO 지원}을 얻었습니다.

@item 
새로운 @ref{c53,,os.scandir()} 함수는 디렉터리 순회의 @ref{f6c,,더 좋고 훨씬 더 빠른 방법}을 제공합니다.

@item 
@ref{be1,,functools.lru_cache()}는 대부분 @ref{f6d,,C로 재구현되어서} 훨씬 더 나은 성능을 제공합니다.

@item 
새로운 @ref{d7e,,subprocess.run()} 함수는 @ref{f6e,,서브 프로세스를 실행하는 간소화된 방법}을 제공합니다.

@item 
@ref{104,,traceback} 모듈은 향상된 성능과 개발자 편의를 위해 크게 @ref{f6f,,개선}되었습니다.
@end itemize

보안 향상:


@itemize *

@item 
SSLv3은 이제 표준 라이브러리 전체에서 비활성화됩니다. @ref{357,,ssl.SSLContext}를 수동으로 인스턴스 화하여 여전히 활성화 할 수 있습니다. (자세한 내용은 bpo-22638@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22638}을 참조하십시오; 이 변경 사항은 CPython 3.4와 2.7로 역 이식되었습니다.)

@item 
HTTP 쿠키 구문 분석은 이제 잠재적인 주입 공격으로부터 보호하기 위해 더 엄격해졌습니다. (Contributed by Antoine Pitrou in bpo-22796@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22796}.)
@end itemize

윈도우 개선:


@itemize *

@item 
윈도우 용 새 설치 프로그램이 이전 MSI를 대체했습니다. 자세한 정보는 @ref{c9d,,윈도우에서 파이썬 사용하기}를 참조하십시오.

@item 
윈도우 빌드는 이제 Microsoft Visual C++ 14.0을 사용하고, 확장 모듈은 같은 것을 사용해야 합니다.
@end itemize

다른 많은 소규모 개선 사항, CPython 최적화, 폐지 및 잠재적 이식 문제를 포함하여, 사용자가 직면하는 변경 사항의 포괄적인 목록을 읽으십시오.

@node 새로운 기능<6>,기타 언어 변경<6>,요약 – 배포 주요 사항<5>,파이썬 3 5의 새로운 기능
@anchor{whatsnew/3 5 new-features}@anchor{f70}
@subsection 새로운 기능


@menu
* PEP 492 - async와 await 구문을 사용하는 코루틴:: 
* PEP 465 - 행렬 곱셈을 위한 전용 중위(infix) 연산자: PEP 465 - 행렬 곱셈을 위한 전용 중위 infix 연산자. 
* PEP 448 - 추가적인 언 패킹 일반화:: 
* PEP 461 - bytes와 bytearray를 위한 퍼센트 포매팅 지원:: 
* PEP 484 - 형 힌트:: 
* PEP 471 - os.scandir() 함수 – 더 빠르고 더 나은 디렉터리 이터레이터: PEP 471 - os scandir 함수 – 더 빠르고 더 나은 디렉터리 이터레이터. 
* PEP 475; EINTR로 실패한 시스템 호출 재시도: PEP 475 EINTR로 실패한 시스템 호출 재시도. 
* PEP 479; 제너레이터 내부에서의 StopIteration 처리 변경: PEP 479 제너레이터 내부에서의 StopIteration 처리 변경. 
* PEP 485; 대략적인 동등성을 테스트하는 함수: PEP 485 대략적인 동등성을 테스트하는 함수. 
* PEP 486; 파이썬 런처가 가상 환경을 인식하도록 만들기: PEP 486 파이썬 런처가 가상 환경을 인식하도록 만들기. 
* PEP 488; PYO 파일 제거: PEP 488 PYO 파일 제거. 
* PEP 489; 다단계 확장 모듈 초기화: PEP 489 다단계 확장 모듈 초기화. 

@end menu

@node PEP 492 - async와 await 구문을 사용하는 코루틴,PEP 465 - 행렬 곱셈을 위한 전용 중위 infix 연산자,,새로운 기능<6>
@anchor{whatsnew/3 5 pep-492-coroutines-with-async-and-await-syntax}@anchor{f71}@anchor{whatsnew/3 5 whatsnew-pep-492}@anchor{f5e}
@subsubsection PEP 492 - async와 await 구문을 사용하는 코루틴


@geindex Python 향상 제안; PEP 492
PEP 492@footnote{https://peps.python.org/pep-0492/}는 @ref{4c9,,어웨이터블 객체}, @ref{f72,,코루틴 함수}, @ref{f73,,비동기 이터레이션} 및 @ref{7ef,,비동기 컨텍스트 관리자}를 추가하여 파이썬에서 비동기 프로그래밍에 대한 지원을 크게 향상합니다.

코루틴 함수는 새로운 @ref{7ec,,async def} 구문을 사용하여 선언됩니다:

@example
>>> async def coro():
...     return 'spam'
@end example

Inside a coroutine function, the new @ref{18d,,await} expression can be used
to suspend coroutine execution until the result is available.  Any object
can be `awaited', as long as it implements the @ref{4c9,,awaitable} protocol by
defining the @ref{f74,,__await__()} method.

PEP 492는 또한 비동기 이터러블에 대한 편리한 이터레이션을 위해 @ref{c9f,,async for} 문을 추가합니다.

새로운 구문을 사용하여 작성된 기본 HTTP 클라이언트의 예:

@example
import asyncio

async def http_get(domain):
    reader, writer = await asyncio.open_connection(domain, 80)

    writer.write(b'\r\n'.join([
        b'GET / HTTP/1.1',
        b'Host: %b' % domain.encode('latin-1'),
        b'Connection: close',
        b'@w{'}, b'@w{'}
    ]))

    async for line in reader:
        print('>>>', line)

    writer.close()

loop = asyncio.get_event_loop()
try:
    loop.run_until_complete(http_get('example.com'))
finally:
    loop.close()
@end example

비동기 이터레이션과 마찬가지로, 비동기 컨텍스트 관리자를 위한 새로운 구문이 있습니다. 다음 스크립트:

@example
import asyncio

async def coro(name, lock):
    print('coro @{@}: waiting for lock'.format(name))
    async with lock:
        print('coro @{@}: holding the lock'.format(name))
        await asyncio.sleep(1)
        print('coro @{@}: releasing the lock'.format(name))

loop = asyncio.get_event_loop()
lock = asyncio.Lock()
coros = asyncio.gather(coro(1, lock), coro(2, lock))
try:
    loop.run_until_complete(coros)
finally:
    loop.close()
@end example

는 다음을 출력합니다:

@example
coro 2: waiting for lock
coro 2: holding the lock
coro 1: waiting for lock
coro 2: releasing the lock
coro 1: holding the lock
coro 1: releasing the lock
@end example

@ref{c9f,,async for}와 @ref{185,,async with}는 모두 @ref{7ec,,async def}로 선언된 코루틴 함수 내에서만 사용할 수 있음에 유의하십시오.

코루틴 함수는 @ref{f75,,asyncio loop}와 같은 호환 가능한 이벤트 루프 내에서 실행되도록 설계되었습니다.

@cartouche
@quotation 참고 

버전 3.5.2에서 변경: CPython 3.5.2부터 @code{__aiter__}는 @ref{4c8,,비동기 이터레이터}를 직접 반환 할 수 있습니다. @ref{4c9,,어웨이터블} 객체를 반환하면 @ref{ac6,,PendingDeprecationWarning} 이 발생합니다.

@ref{f76,,비동기 이터레이터(Asynchronous Iterators)} 설명서 섹션에서 자세한 내용을 참조하십시오.

@end quotation
@end cartouche


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 492

@item PEP 492@footnote{https://peps.python.org/pep-0492/} – async와 await 구문을 사용하는 코루틴

Yury Selivanov가 작성하고 구현한 PEP.
@end table


@node PEP 465 - 행렬 곱셈을 위한 전용 중위 infix 연산자,PEP 448 - 추가적인 언 패킹 일반화,PEP 492 - async와 await 구문을 사용하는 코루틴,새로운 기능<6>
@anchor{whatsnew/3 5 pep-465-a-dedicated-infix-operator-for-matrix-multiplication}@anchor{f77}@anchor{whatsnew/3 5 whatsnew-pep-465}@anchor{f5f}
@subsubsection PEP 465 - 행렬 곱셈을 위한 전용 중위(infix) 연산자


@geindex Python 향상 제안; PEP 465
PEP 465@footnote{https://peps.python.org/pep-0465/} adds the @code{@@} infix operator for matrix multiplication.
Currently, no builtin Python types implement the new operator, however, it
can be implemented by defining @ref{f78,,__matmul__()},
@ref{f79,,__rmatmul__()}, and @ref{f7a,,__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.

행렬 곱셈은 수학, 과학, 공학의 많은 분야에서 매우 일반적인 연산이며, @code{@@}를 추가하면 더 깨끗한 코드를 작성할 수 있습니다:

@example
S = (H @@ beta - r).T @@ inv(H @@ V @@ H.T) @@ (H @@ beta - r)
@end example

이렇게 작성하는 대신에:

@example
S = dot((dot(H, beta) - r).T,
        dot(inv(dot(dot(H, V), H.T)), dot(H, beta) - r))
@end example

NumPy 1.10은 새 연산자를 지원합니다:

@example
>>> import numpy

>>> x = numpy.ones(3)
>>> x
array([ 1., 1., 1.])

>>> m = numpy.eye(3)
>>> m
array([[ 1., 0., 0.],
       [ 0., 1., 0.],
       [ 0., 0., 1.]])

>>> x @@ m
array([ 1., 1., 1.])
@end example


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 465

@item PEP 465@footnote{https://peps.python.org/pep-0465/} – 행렬 곱셈을 위한 전용 중위(infix) 연산자

Nathaniel J. Smith가 작성한 PEP; Benjamin Peterson이 구현했습니다.
@end table


@node PEP 448 - 추가적인 언 패킹 일반화,PEP 461 - bytes와 bytearray를 위한 퍼센트 포매팅 지원,PEP 465 - 행렬 곱셈을 위한 전용 중위 infix 연산자,새로운 기능<6>
@anchor{whatsnew/3 5 pep-448-additional-unpacking-generalizations}@anchor{f7b}@anchor{whatsnew/3 5 whatsnew-pep-448}@anchor{f60}
@subsubsection PEP 448 - 추가적인 언 패킹 일반화


@geindex Python 향상 제안; PEP 448
PEP 448@footnote{https://peps.python.org/pep-0448/}은 @code{*} 이터러블 언 패킹 연산자와 @code{**} 딕셔너리 언 패킹 연산자의 허용된 사용을 확장합니다. 이제 @ref{f7c,,함수 호출}에서 임의의 수의 언 패킹을 사용할 수 있습니다:

@example
>>> print(*[1], *[2], 3, *[4, 5])
1 2 3 4 5

>>> def fn(a, b, c, d):
...     print(a, b, c, d)
...

>>> fn(**@{'a': 1, 'c': 3@}, **@{'b': 2, 'd': 4@})
1 2 3 4
@end example

마찬가지로, 튜플, 리스트, 집합 및 딕셔너리 디스플레이는 여러 번의 언 패킹을 허용합니다 (@ref{f7d,,표현식 목록(Expression lists)}과 @ref{f7e,,딕셔너리 디스플레이}를 참조하십시오):

@example
>>> *range(4), 4
(0, 1, 2, 3, 4)

>>> [*range(4), 4]
[0, 1, 2, 3, 4]

>>> @{*range(4), 4, *(5, 6, 7)@}
@{0, 1, 2, 3, 4, 5, 6, 7@}

>>> @{'x': 1, **@{'y': 2@}@}
@{'x': 1, 'y': 2@}
@end example


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 448

@item PEP 448@footnote{https://peps.python.org/pep-0448/} – 추가적인 언 패킹 일반화

Joshua Landau가 작성한 PEP; Neil Girdhar, Thomas Wouters 및 Joshua Landau가 구현했습니다.
@end table


@node PEP 461 - bytes와 bytearray를 위한 퍼센트 포매팅 지원,PEP 484 - 형 힌트,PEP 448 - 추가적인 언 패킹 일반화,새로운 기능<6>
@anchor{whatsnew/3 5 pep-461-percent-formatting-support-for-bytes-and-bytearray}@anchor{f7f}@anchor{whatsnew/3 5 whatsnew-pep-461}@anchor{f63}
@subsubsection PEP 461 - bytes와 bytearray를 위한 퍼센트 포매팅 지원


@geindex Python 향상 제안; PEP 461
PEP 461@footnote{https://peps.python.org/pep-0461/}은 @ref{192,,bytes}와 @ref{344,,bytearray}에 @code{%} @ref{f80,,보간 연산자}에 대한 지원을 추가합니다.

보간은 일반적으로 문자열 연산으로 간주하지만, @code{bytes}나 @code{bytearrays}에 대한 보간이 적절한 경우가 있고, 이 누락 된 기능을 보완하는 데 필요한 작업이 코드의 전반적인 가독성을 떨어뜨립니다. 이 문제는 종종 바이너리와 ASCII 호환 텍스트가 혼합된 전송 형식(wire format) 프로토콜을 다룰 때 특히 중요합니다.

예:

@example
>>> b'Hello %b!' % b'World'
b'Hello World!'

>>> b'x=%i y=%f' % (1, 2.5)
b'x=1 y=2.500000'
@end example

유니코드는 @code{%b}에 허용되지 않지만, @code{%a}에서 허용됩니다 (@code{repr(obj).encode('ascii', 'backslashreplace')}와 동등합니다):

@example
>>> b'Hello %b!' % 'World'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: %b requires bytes, or an object that implements __bytes__, not 'str'

>>> b'price: %a' % '10€'
b"price: '10\\u20ac'"
@end example

@code{%s}와 @code{%r} 변환 유형은, 지원되기는 하지만, 파이썬 2와의 호환성이 필요한 코드 베이스에서만 사용해야 함에 유의하십시오.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 461

@item PEP 461@footnote{https://peps.python.org/pep-0461/} – bytes와 bytearray에 % 포매팅 추가

Ethan Furman이 작성한 PEP; Neil Schemenauer와 Ethan Furman이 구현했습니다.
@end table


@node PEP 484 - 형 힌트,PEP 471 - os scandir 함수 – 더 빠르고 더 나은 디렉터리 이터레이터,PEP 461 - bytes와 bytearray를 위한 퍼센트 포매팅 지원,새로운 기능<6>
@anchor{whatsnew/3 5 pep-484-type-hints}@anchor{f81}@anchor{whatsnew/3 5 whatsnew-pep-484}@anchor{f61}
@subsubsection PEP 484 - 형 힌트


함수 어노테이션 구문은 버전 3.0(
@geindex Python 향상 제안; PEP 3107
PEP 3107@footnote{https://peps.python.org/pep-3107/})부터 파이썬 기능이었지만, 어노테이션의 의미는 정의되지 않은 상태로 남아 있었습니다.

경험에 따르면 대부분 함수 어노테이션은 함수 매개 변수와 반환 값에 형 힌트를 제공하는 데 사용되었습니다. 표준 라이브러리에 형 어노테이션을 위한 기본 정의와 도구가 포함되어 있다면 파이썬 사용자에게 도움이 될 것이 분명해졌습니다.

@geindex Python 향상 제안; PEP 484
PEP 484@footnote{https://peps.python.org/pep-0484/}는 어노테이션을 사용할 수 없는 상황에 대한 몇 가지 규칙과 함께 이러한 표준 정의와 도구를 제공하는 @ref{3d1,,잠정적 모듈}을 도입합니다.

예를 들어, 다음은 어노테이션에 인자와 반환형이 선언된 간단한 함수입니다:

@example
def greeting(name: str) -> str:
    return 'Hello ' + name
@end example

이러한 어노테이션은 일반적인 @ref{458,,__annotations__} 어트리뷰트를 통해 실행 시간에 사용할 수 있지만, `어떤 자동 형 검사도 실행 시간에 일어나지 않습니다'. 대신, 별도의 오프라인 형 검사기(예를 들어 mypy@footnote{https://mypy-lang.org})가 필요할 때 소스 코드 분석에 사용되는 것으로 가정합니다.

형 시스템은 공용체(unions), 제네릭 형 및 모든 형과 일치하는 (즉, 대입 가능한) @ref{8ba,,Any}라는 특수형을 지원합니다.


@subsubheading 더 보기



@itemize *

@item 
@ref{10a,,typing} 모듈 설명서

@item 

@table @asis

@geindex Python 향상 제안; PEP 484

@item PEP 484@footnote{https://peps.python.org/pep-0484/} – 형 힌트

Guido van Rossum, Jukka Lehtosalo 및 Łukasz Langa가 작성한 PEP; Guido van Rossum이 구현했습니다.
@end table

@item 

@table @asis

@geindex Python 향상 제안; PEP 483

@item PEP 483@footnote{https://peps.python.org/pep-0483/} – 형 힌트 이론

Guido van Rossum이 작성한 PEP
@end table
@end itemize


@node PEP 471 - os scandir 함수 – 더 빠르고 더 나은 디렉터리 이터레이터,PEP 475 EINTR로 실패한 시스템 호출 재시도,PEP 484 - 형 힌트,새로운 기능<6>
@anchor{whatsnew/3 5 pep-471-os-scandir-function-a-better-and-faster-directory-iterator}@anchor{f82}@anchor{whatsnew/3 5 whatsnew-pep-471}@anchor{f6c}
@subsubsection PEP 471 - os.scandir() 함수 – 더 빠르고 더 나은 디렉터리 이터레이터


@geindex Python 향상 제안; PEP 471
PEP 471@footnote{https://peps.python.org/pep-0471/}은 표준 라이브러리에 새 디렉터리 이터레이션 함수 @ref{c53,,os.scandir()}을 추가합니다. 또한, @ref{6cf,,os.walk()}는 이제 @code{scandir}을 사용하여 구현되어, POSIX 시스템에서는 3 에서 5배, 윈도우 시스템에서는 7 에서 20배 더 빠릅니다. 이것은 주로 디렉터리 트리를 탐색하는 데 필요한 @ref{26d,,os.stat()} 호출 수를 크게 줄임으로써 달성됩니다.

또한, @code{scandir}은 파일 이름 리스트 대신에 이터레이터를 반환하므로, 매우 큰 디렉터리를 이터레이션 할 때 메모리 효율성이 향상됩니다.

다음 예제는 @code{'.'}로 시작하지 않는 지정된 `path'의 모든 파일(디렉터리 제외)을 표시하기 위해 @ref{c53,,os.scandir()}을 사용하는 간단한 방법을 보여줍니다. @ref{f83,,entry.is_file()} 호출은 일반적으로 추가 시스템 호출을 수행하지 않습니다:

@example
for entry in os.scandir(path):
    if not entry.name.startswith('.') and entry.is_file():
        print(entry.name)
@end example


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 471

@item PEP 471@footnote{https://peps.python.org/pep-0471/} – os.scandir() 함수 – 더 빠르고 더 나은 디렉터리 이터레이터

Victor Stinner의 도움으로 Ben Hoyt가 작성하고 구현한 PEP.
@end table


@node PEP 475 EINTR로 실패한 시스템 호출 재시도,PEP 479 제너레이터 내부에서의 StopIteration 처리 변경,PEP 471 - os scandir 함수 – 더 빠르고 더 나은 디렉터리 이터레이터,새로운 기능<6>
@anchor{whatsnew/3 5 pep-475-retry-system-calls-failing-with-eintr}@anchor{f84}@anchor{whatsnew/3 5 whatsnew-pep-475}@anchor{f85}
@subsubsection PEP 475: EINTR로 실패한 시스템 호출 재시도


@ref{f86,,errno.EINTR} 에러 코드는 I/O를 기다리는 시스템 호출이 시그널에 의해 중단될 때마다 반환됩니다. 이전에는, 이러한 경우에 파이썬이 @ref{f87,,InterruptedError}를 발생시켰습니다. 이는 파이썬 응용 프로그램을 작성할 때 개발자가 두 가지 선택을 할 수 있음을 의미합니다:


@enumerate 

@item 
@code{InterruptedError}를 무시합니다.

@item 
@code{InterruptedError}를 처리하고 모든 호출 지점에서 중단된 시스템 호출을 다시 시작합니다.
@end enumerate

첫 번째 옵션은 응용 프로그램이 간헐적으로 실패하도록 합니다. 두 번째 옵션은 코드를 거의 읽을 수 없게 만드는 많은 양의 상용구를 추가합니다. 다음을 비교해 보십시오:

@example
print("Hello World")
@end example

와:

@example
while True:
    try:
        print("Hello World")
        break
    except InterruptedError:
        continue
@end example

@geindex Python 향상 제안; PEP 475
PEP 475@footnote{https://peps.python.org/pep-0475/}는 @code{EINTR}에서 시스템 호출의 자동 재시도를 구현합니다. 이것은 대부분의 상황에서 사용자 코드에서 @code{EINTR}이나 @ref{f87,,InterruptedError}를 다루는 부담을 제거하고 표준 라이브러리를 포함한 파이썬 프로그램을 더욱 강인하게 만듭니다. 시스템 호출은 시그널 처리기가 예외를 발생시키지 않는 경우에만 재시도됨에 유의하십시오.

다음은 시그널에 의해 중단될 때 재시도되는 함수 목록입니다:


@itemize *

@item 
@ref{316,,open()}과 @ref{73f,,io.open()};

@item 
@ref{5c,,faulthandler} 모듈의 함수들;

@item 
@ref{a5,,os} 함수: @ref{f88,,fchdir()}, @ref{52a,,fchmod()}, @ref{f89,,fchown()}, @ref{f8a,,fdatasync()}, @ref{f8b,,fstat()}, @ref{f8c,,fstatvfs()}, @ref{f8d,,fsync()}, @ref{f8e,,ftruncate()}, @ref{f8f,,mkfifo()}, @ref{f90,,mknod()}, @ref{f91,,open()}, @ref{f92,,posix_fadvise()}, @ref{f93,,posix_fallocate()}, @ref{d55,,pread()}, @ref{d58,,pwrite()}, @ref{f94,,read()}, @ref{d54,,readv()}, @ref{d04,,sendfile()}, @ref{f95,,wait3()}, @ref{f96,,wait4()}, @ref{f97,,wait()}, @ref{f98,,waitid()}, @ref{f99,,waitpid()}, @ref{f9a,,write()}, @ref{d57,,writev()};

@item 
특수한 경우: @ref{d6a,,os.close()}와 @ref{d59,,os.dup2()}는 이제 @ref{f86,,EINTR} 에러를 무시합니다; 시스템 호출은 재시도되지 않습니다 (이유는 PEP를 참조하십시오);

@item 
@ref{c6,,select} 함수: @ref{f9b,,devpoll.poll()}, @ref{f9c,,epoll.poll()}, @ref{f9d,,kqueue.control()}, @ref{f9e,,poll.poll()}, @ref{f9f,,select()};

@item 
@ref{fa0,,socket} 클래스의 메서드: @ref{fa1,,accept()}, @ref{fa2,,connect()} (비 블로킹 소켓 제외), @ref{fa3,,recv()}, @ref{fa4,,recvfrom()}, @ref{fa5,,recvmsg()}, @ref{fa6,,send()}, @ref{fa7,,sendall()}, @ref{6a0,,sendmsg()}, @ref{fa8,,sendto()};

@item 
@ref{fa9,,signal.sigtimedwait()}와 @ref{faa,,signal.sigwaitinfo()};

@item 
@ref{8ab,,time.sleep()}.
@end itemize


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 475

@item PEP 475@footnote{https://peps.python.org/pep-0475/} – EINTR로 실패한 시스템 호출 재시도

Charles-François Natali와 Victor Stinner가 Antoine Pitrou의 도움을 받아 PEP와 구현을 작성했습니다 (프렌치 커넥션).
@end table


@node PEP 479 제너레이터 내부에서의 StopIteration 처리 변경,PEP 485 대략적인 동등성을 테스트하는 함수,PEP 475 EINTR로 실패한 시스템 호출 재시도,새로운 기능<6>
@anchor{whatsnew/3 5 pep-479-change-stopiteration-handling-inside-generators}@anchor{fab}@anchor{whatsnew/3 5 whatsnew-pep-479}@anchor{f1a}
@subsubsection PEP 479: 제너레이터 내부에서의 StopIteration 처리 변경


파이썬 3.4와 이전 버전에서 제너레이터와 @ref{df4,,StopIteration}의 상호 작용은 때때로 놀랍고, 모호한 버그를 감출 수 있습니다. 이전에는, 제너레이터 함수 내에서 실수로 발생한 @code{StopIteration}이 제너레이터를 구동하는 루프 구성에 의해 이터레이션의 끝으로 해석되었습니다.

@geindex Python 향상 제안; PEP 479
PEP 479@footnote{https://peps.python.org/pep-0479/}는 제너레이터의 동작을 변경합니다: 제너레이터 내부에서 @code{StopIteration} 예외가 발생하면, 제너레이터 프레임을 종료하기 전에 @ref{244,,RuntimeError}로 대체됩니다. 이 변경의 주요 목표는 보호되지 않는 @ref{9d8,,next()} 호출이 @code{StopIteration}을 발생시키고 이 때문에 제너레이터가 제어하는 이터레이션이 조용히 종료되도록 하는 상황에서 디버깅을 용이하게 하는 것입니다. 이것은 @code{yield from} 구조와 결합할 때 특히 유해합니다.

이는 이전 버전과 호환되지 않는 변경이므로, 새 동작을 사용하려면 @ref{fac,,__future__} 임포트가 필요합니다:

@example
>>> from __future__ import generator_stop

>>> def gen():
...     next(iter([]))
...     yield
...
>>> next(gen())
Traceback (most recent call last):
  File "<stdin>", line 2, in gen
StopIteration

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
RuntimeError: generator raised StopIteration
@end example

@code{__future__} 임포트가 없으면, 제너레이터 내에서 @ref{df4,,StopIteration} 예외가 발생할 때마다 @ref{ac6,,PendingDeprecationWarning} 이 발생합니다.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 479

@item PEP 479@footnote{https://peps.python.org/pep-0479/} – 제너레이터 내부에서의 StopIteration 처리 변경

Chris Angelico와 Guido van Rossum이 작성한 PEP. Chris Angelico, Yury Selivanov 및 Nick Coghlan이 구현했습니다.
@end table


@node PEP 485 대략적인 동등성을 테스트하는 함수,PEP 486 파이썬 런처가 가상 환경을 인식하도록 만들기,PEP 479 제너레이터 내부에서의 StopIteration 처리 변경,새로운 기능<6>
@anchor{whatsnew/3 5 pep-485-a-function-for-testing-approximate-equality}@anchor{fad}@anchor{whatsnew/3 5 whatsnew-pep-485}@anchor{fae}
@subsubsection PEP 485: 대략적인 동등성을 테스트하는 함수


@geindex Python 향상 제안; PEP 485
PEP 485@footnote{https://peps.python.org/pep-0485/}는 두 값이 대략 같거나 서로 “가까운”지를 알려주는 @ref{faf,,math.isclose()}와 @ref{fb0,,cmath.isclose()} 함수를 추가합니다. 두 값이 가까운 것으로 간주하는지는 주어진 절대와 상대 허용 오차에 따라 결정됩니다. 상대적 허용 오차는 더 큰 절댓값에 상대적으로 @code{isclose} 인자간에 허용되는 최대 차이입니다:

@example
>>> import math
>>> a = 5.0
>>> b = 4.99998
>>> math.isclose(a, b, rel_tol=1e-5)
True
>>> math.isclose(a, b, rel_tol=1e-6)
False
@end example

절대 허용 오차를 사용하여 두 값을 비교할 수도 있습니다. 이 값은 음수가 아니어야 합니다:

@example
>>> import math
>>> a = 5.0
>>> b = 4.99998
>>> math.isclose(a, b, abs_tol=0.00003)
True
>>> math.isclose(a, b, abs_tol=0.00001)
False
@end example


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 485

@item PEP 485@footnote{https://peps.python.org/pep-0485/} – 대략적인 동등성을 테스트하는 함수

Christopher Barker가 작성한 PEP; Chris Barker와 Tal Einat이 구현했습니다.
@end table


@node PEP 486 파이썬 런처가 가상 환경을 인식하도록 만들기,PEP 488 PYO 파일 제거,PEP 485 대략적인 동등성을 테스트하는 함수,새로운 기능<6>
@anchor{whatsnew/3 5 pep-486-make-the-python-launcher-aware-of-virtual-environments}@anchor{fb1}@anchor{whatsnew/3 5 whatsnew-pep-486}@anchor{fb2}
@subsubsection PEP 486: 파이썬 런처가 가상 환경을 인식하도록 만들기


@geindex Python 향상 제안; PEP 486
PEP 486@footnote{https://peps.python.org/pep-0486/}은 윈도우 런처(
@geindex Python 향상 제안; PEP 397
PEP 397@footnote{https://peps.python.org/pep-0397/}을 참조하십시오)가 활성 가상 환경을 인식하도록 합니다. 기본 인터프리터를 사용하고 @code{VIRTUAL_ENV} 환경 변수를 설정하면, 가상 환경의 인터프리터가 사용됩니다.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 486

@item PEP 486@footnote{https://peps.python.org/pep-0486/} – 파이썬 런처가 가상 환경을 인식하도록 만들기

Paul Moore가 작성하고 구현한 PEP.
@end table


@node PEP 488 PYO 파일 제거,PEP 489 다단계 확장 모듈 초기화,PEP 486 파이썬 런처가 가상 환경을 인식하도록 만들기,새로운 기능<6>
@anchor{whatsnew/3 5 pep-488-elimination-of-pyo-files}@anchor{fb3}@anchor{whatsnew/3 5 whatsnew-pep-488}@anchor{f68}
@subsubsection PEP 488: PYO 파일 제거


@geindex Python 향상 제안; PEP 488
PEP 488@footnote{https://peps.python.org/pep-0488/}은 @code{.pyo} 파일의 개념을 제거합니다. 이는 @code{.pyc} 파일이 최적화되지 않은 바이트 코드와 최적화된 바이트 코드를 모두 나타냄을 의미합니다. 바이트 코드 파일을 지속해서 재생성할 필요가 없도록, @code{.pyc} 파일은 이제 바이트 코드가 최적화될 때 이름에 선택적 @code{opt-} 태그를 갖습니다. 이것은 @ref{18c,,-O}나 @ref{fb4,,-OO}에서 실행할 때 더는 바이트 코드 파일 이름 충돌이 발생하지 않는 부작용이 있습니다. 따라서, @code{-O}와 @code{-OO}에서 생성된 바이트 코드 파일이 이제 동시에 존재할 수 있습니다. @ref{353,,importlib.util.cache_from_source()}는 이러한 변경을 돕기 위해 갱신된 API를 갖습니다.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 488

@item PEP 488@footnote{https://peps.python.org/pep-0488/} – PYO 파일 제거

Brett Cannon이 작성하고 구현한 PEP.
@end table


@node PEP 489 다단계 확장 모듈 초기화,,PEP 488 PYO 파일 제거,새로운 기능<6>
@anchor{whatsnew/3 5 pep-489-multi-phase-extension-module-initialization}@anchor{fb5}@anchor{whatsnew/3 5 whatsnew-pep-489}@anchor{f69}
@subsubsection PEP 489: 다단계 확장 모듈 초기화


@geindex Python 향상 제안; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}는 파이썬 3.4에서 
@geindex Python 향상 제안; PEP 451
PEP 451@footnote{https://peps.python.org/pep-0451/}이 도입한 2단계 모듈 로딩 메커니즘을 활용하기 위해 확장 모듈 초기화를 갱신합니다.

이 변경으로 인해 ASCII로 제한되지 않고 유효한 식별자를 모듈 이름으로 사용할 수 있는 기능을 포함하여, 확장 모듈의 임포트 의미 체계가 파이썬 소스와 바이트 코드 모듈의 것과 훨씬 더 가까운 새로운 메커니즘을 사용하도록 옵트 인합니다.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 489

@item PEP 489@footnote{https://peps.python.org/pep-0489/} – 다단계 확장 모듈 초기화

Petr Viktorin, Stefan Behnel 및 Nick Coghlan이 작성한 PEP; Petr Viktorin이 구현했습니다.
@end table


@node 기타 언어 변경<6>,새로운 모듈<2>,새로운 기능<6>,파이썬 3 5의 새로운 기능
@anchor{whatsnew/3 5 other-language-changes}@anchor{fb6}
@subsection 기타 언어 변경


핵심 파이썬 언어에 대한 몇 가지 작은 변경 사항은 다음과 같습니다:


@itemize *

@item 
@code{"namereplace"} 에러 처리기를 추가했습니다. 이제 @code{"backslashreplace"} 에러 처리기가 디코딩과 변환에서 작동합니다. (Contributed by Serhiy Storchaka in bpo-19676@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19676} and bpo-22286@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22286}.)

@item 
@ref{7f8,,-b} 옵션은 이제 @ref{192,,bytes}와 @ref{19b,,int}의 비교에 영향을 줍니다. (Contributed by Serhiy Storchaka in bpo-23681@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23681}.)

@item 
새로운 카자흐어 @code{kz1048}과 타지크어 @code{koi8_t} @ref{fb7,,코덱}. (Contributed by Serhiy Storchaka in bpo-22682@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22682} and bpo-22681@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22681}.)

@item 
프로퍼티 독스트링은 이제 쓰기 가능합니다. 이것은 @ref{4e0,,collections.namedtuple()} 독스트링에 특히 유용합니다. (Contributed by Berker Peksag in bpo-24064@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24064}.)

@item 
이제 상대 임포트를 포함하는 순환 임포트가 지원됩니다. (Contributed by Brett Cannon and Antoine Pitrou in bpo-17636@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17636}.)
@end itemize

@node 새로운 모듈<2>,개선된 모듈<5>,기타 언어 변경<6>,파이썬 3 5의 새로운 기능
@anchor{whatsnew/3 5 new-modules}@anchor{fb8}
@subsection 새로운 모듈


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

@end menu

@node typing<11>,zipapp<2>,,새로운 모듈<2>
@anchor{whatsnew/3 5 typing}@anchor{fb9}
@subsubsection typing


새로운 @ref{10a,,typing} @ref{3d1,,잠정적} 모듈은 함수 형 어노테이션에 대한 표준 정의와 도구를 제공합니다. 자세한 내용은 @ref{f61,,형 힌트}를 참조하십시오.

@node zipapp<2>,,typing<11>,새로운 모듈<2>
@anchor{whatsnew/3 5 whatsnew-zipapp}@anchor{f62}@anchor{whatsnew/3 5 zipapp}@anchor{fba}
@subsubsection zipapp


새로운 (
@geindex Python 향상 제안; PEP 441
PEP 441@footnote{https://peps.python.org/pep-0441/}에서 지정된) @ref{136,,zipapp} 모듈은 실행 가능한 파이썬 Zip 응용 프로그램을 만들기 위한 API와 명령 줄 도구를 제공합니다. 실행 가능한 파이썬 Zip 응용 프로그램은 bpo-1739468@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1739468}에서 파이썬 2.6에 도입되었지만, 그때나 그 이후로 잘 공개되지 않았습니다.

새로운 모듈을 사용하면, @code{__main__.py} 파일을 포함한 모든 파일을 @code{myapp} 디렉터리에 넣고 다음을 실행하는 것만큼 간단하게 응용 프로그램을 번들링 할 수 있습니다:

@example
$ python -m zipapp myapp
$ python myapp.pyz
@end example

모듈 구현은 bpo-23491@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23491}에서 Paul Moore에 의해 기고되었습니다.


@subsubheading 더 보기


@geindex Python 향상 제안; PEP 441
PEP 441@footnote{https://peps.python.org/pep-0441/} – 파이썬 ZIP 응용 프로그램 지원 개선


@node 개선된 모듈<5>,기타 모듈 수준 변경,새로운 모듈<2>,파이썬 3 5의 새로운 기능
@anchor{whatsnew/3 5 improved-modules}@anchor{fbb}
@subsection 개선된 모듈


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

@end menu

@node argparse<6>,asyncio<13>,,개선된 모듈<5>
@anchor{whatsnew/3 5 argparse}@anchor{fbc}
@subsubsection argparse


@ref{1bd,,ArgumentParser} 클래스는 이제 @ref{fbd,,allow_abbrev}를 @code{False}로 설정하여 긴 옵션의 @ref{fbe,,약어 사용}을 비활성화 할 수 있습니다. (Contributed by Jonathan Paugh, Steven Bethard, paul j3 and Daniel Eriksson in bpo-14910@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14910}.)

@node asyncio<13>,bz2,argparse<6>,개선된 모듈<5>
@anchor{whatsnew/3 5 asyncio}@anchor{fbf}
@subsubsection asyncio


@ref{b,,asyncio} 모듈은 @ref{3d1,,잠정적}이므로, 파이썬 3.5에 도입된 모든 변경 사항은 파이썬 3.4.x로 역 이식되었습니다.

파이썬 3.4.0 이후 @ref{b,,asyncio} 모듈의 주목할만한 변경 사항:


@itemize *

@item 
새로운 디버깅 API: @ref{fc0,,loop.set_debug()}와 @ref{fc1,,loop.get_debug()} 메서드. (Contributed by Victor Stinner.)

@item 
프로액터(proactor) 이벤트 루프는 이제 SSL을 지원합니다. (Contributed by Antoine Pitrou and Victor Stinner in bpo-22560@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22560}.)

@item 
이벤트 루프가 닫혔는지 확인하는 새로운 @ref{fc2,,loop.is_closed()} 메서드. (Contributed by Victor Stinner in bpo-21326@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21326}.)

@item 
코루틴을 위한 새로운 @ref{1c7,,Task}를 편리하게 만들고 예약하는 새로운 @ref{1ca,,loop.create_task()}. @code{create_task} 메서드는 코루틴을 태스크로 감싸는 모든 asyncio 함수(가령 @ref{6a6,,asyncio.wait()}, @ref{812,,asyncio.gather()} 등)에서도 사용됩니다. (Contributed by Victor Stinner.)

@item 
흐름 제어의 `high-'와 `low-' 수위 한계를 조회하는 새로운 @ref{fc3,,transport.get_write_buffer_limits()} 메서드. (Contributed by Victor Stinner.)

@item 
The @code{async()} function is deprecated in favor of
@ref{e70,,ensure_future()}.
(Contributed by Yury Selivanov.)

@item 
@ref{1ca,,loop.create_task()} 메서드가 사용하는 태스크 팩토리를 사용자 정의하는 새로운 @ref{1c8,,loop.set_task_factory()}와 @ref{fc4,,loop.get_task_factory()} 메서드. (Contributed by Yury Selivanov.)

@item 
새로운 @ref{fc5,,Queue.join()}과 @ref{fc6,,Queue.task_done()} 큐 메서드. (Contributed by Victor Stinner.)

@item 
@code{JoinableQueue} 클래스가 제거되고, @ref{c69,,asyncio.Queue} 클래스로 대체되었습니다. (Contributed by Victor Stinner.)
@end itemize

3.5.1의 업데이트:


@itemize *

@item 
@ref{e70,,ensure_future()} 함수와 이를 사용하는 모든 함수(가령 @ref{e71,,loop.run_until_complete()})는 이제 모든 종류의 @ref{4c9,,어웨이터블 객체}를 받아들입니다. (Contributed by Yury Selivanov.)

@item 
다른 스레드의 이벤트 루프에 코루틴을 제출하는 새로운 @ref{a82,,run_coroutine_threadsafe()} 함수. (Contributed by Vincent Michel.)

@item 
트랜스포트가 닫히고 있거나 닫혀 있는지 확인하는 새로운 @ref{e72,,Transport.is_closing()} 메서드. (Contributed by Yury Selivanov.)

@item 
@ref{d08,,loop.create_server()} 메서드는 이제 호스트 리스트를 받아들일 수 있습니다. (Contributed by Yann Sionneau.)
@end itemize

3.5.2의 업데이트 :


@itemize *

@item 
Future 객체를 만드는 새로운 @ref{e73,,loop.create_future()} 메서드. 이를 통해 uvloop@footnote{https://github.com/MagicStack/uvloop}와 같은 대체 이벤트 루프 구현이 더 빠른 @ref{dc5,,asyncio.Future} 구현을 제공 할 수 있습니다. (Contributed by Yury Selivanov.)

@item 
현재 예외 처리기를 가져오는 새로운 @ref{e74,,loop.get_exception_handler()} 메서드. (Contributed by Yury Selivanov.)

@item 
구분자 바이트 시퀀스가 나타날 때까지 스트림에서 데이터를 읽는 새로운 @ref{4d1,,StreamReader.readuntil()} 메서드. (Contributed by Mark Korenberg.)

@item 
@ref{817,,loop.create_connection()}과 @ref{d08,,loop.create_server()} 메서드는 주소가 이미 결정된 경우 시스템 @code{getaddrinfo} 함수를 호출하지 않도록 최적화되었습니다. (Contributed by A. Jesse Jiryu Davis.)

@item 
@ref{fc7,,loop.sock_connect(sock@comma{} address)}는 더는 호출 전에 `address'를 결정할 필요가 없습니다. (Contributed by A. Jesse Jiryu Davis.)
@end itemize

@node bz2,cgi,asyncio<13>,개선된 모듈<5>
@anchor{whatsnew/3 5 bz2}@anchor{fc8}
@subsubsection bz2


이제 @ref{fc9,,BZ2Decompressor.decompress} 메서드는 압축 해제된 데이터의 최대 크기를 제한하기 위해 선택적 `max_length' 인자를 받아들입니다. (Contributed by Nikolaus Rath in bpo-15955@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15955}.)

@node cgi,cmath<2>,bz2,개선된 모듈<5>
@anchor{whatsnew/3 5 cgi}@anchor{fca}
@subsubsection cgi


@code{FieldStorage} 클래스는 이제 @ref{1e1,,컨텍스트 관리자} 프로토콜을 지원합니다. (Contributed by Berker Peksag in bpo-20289@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20289}.)

@node cmath<2>,code,cgi,개선된 모듈<5>
@anchor{whatsnew/3 5 cmath}@anchor{fcb}
@subsubsection cmath


새로운 함수 @ref{fb0,,isclose()}는 대략적인 동등성을 테스트하는 방법을 제공합니다. (Contributed by Chris Barker and Tal Einat in bpo-24270@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24270}.)

@node code,collections<5>,cmath<2>,개선된 모듈<5>
@anchor{whatsnew/3 5 code}@anchor{fcc}
@subsubsection code


@ref{fcd,,InteractiveInterpreter.showtraceback()} 메서드는 이제 대화 형 인터프리터처럼 전체 연결된(chained) 트레이스백을 인쇄합니다. (Contributed by Claudiu Popa in bpo-17442@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17442}.)

@node collections<5>,collections abc<3>,code,개선된 모듈<5>
@anchor{whatsnew/3 5 collections}@anchor{fce}
@subsubsection collections

@anchor{whatsnew/3 5 whatsnew-ordereddict}@anchor{f6a}
@ref{7f2,,OrderedDict} 클래스는 이제 C로 구현되어 4 에서 100배 더 빨라졌습니다. (Contributed by Eric Snow in bpo-16991@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16991}.)

@code{OrderedDict.items()}, @code{OrderedDict.keys()},
and @code{OrderedDict.values()} views now support @ref{a65,,reversed()} iteration.
(Contributed by Serhiy Storchaka in bpo-19505@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19505}.)

@ref{7f3,,deque} 클래스는 이제 @ref{fcf,,index()}, @ref{fd0,,insert()} 및 @ref{fd1,,copy()}를 정의하고, @code{+}와 @code{*} 연산자를 지원합니다. 이를 통해 데크가 @ref{4c1,,MutableSequence}로 인식되고 리스트에 대한 대체 가능성이 향상됩니다. (Contributed by Raymond Hettinger in bpo-23704@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23704}.)

이제 @ref{4e0,,namedtuple()}이 생성한 독스트링을 갱신할 수 있습니다:

@example
Point = namedtuple('Point', ['x', 'y'])
Point.__doc__ += ': Cartesian coordinate'
Point.x.__doc__ = 'abscissa'
Point.y.__doc__ = 'ordinate'
@end example

(Contributed by Berker Peksag in bpo-24064@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24064}.)

The @ref{fd2,,UserString} class now implements the
@ref{fd3,,__getnewargs__()}, @ref{fd4,,__rmod__()}, @ref{fd5,,casefold()},
@ref{fd6,,format_map()}, @ref{fd7,,isprintable()}, and @ref{fd8,,maketrans()}
methods to match the corresponding methods of @ref{169,,str}.
(Contributed by Joe Jevnik in bpo-22189@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22189}.)

@node collections abc<3>,compileall<4>,collections<5>,개선된 모듈<5>
@anchor{whatsnew/3 5 collections-abc}@anchor{fd9}
@subsubsection collections.abc


The @code{Sequence.index()} method now
accepts `start' and `stop' arguments to match the corresponding methods
of @ref{610,,tuple}, @ref{24d,,list}, etc.
(Contributed by Devin Jeanpierre in bpo-23086@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23086}.)

새로운 @ref{fda,,Generator} 추상 베이스 클래스. (Contributed by Stefan Behnel in bpo-24018@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24018}.)

새로운 @ref{fdb,,Awaitable}, @ref{fdc,,Coroutine}, @ref{fdd,,AsyncIterator} 및 @ref{fde,,AsyncIterable} 추상 베이스 클래스. (Contributed by Yury Selivanov in bpo-24184@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24184}.)

이전 파이썬 버전의 경우, 새 ABC의 역 이식을 외부 PyPI 패키지@footnote{https://pypi.org/project/backports_abc/}에서 사용할 수 있습니다.

@node compileall<4>,concurrent futures<6>,collections abc<3>,개선된 모듈<5>
@anchor{whatsnew/3 5 compileall}@anchor{fdf}
@subsubsection compileall


새로운 @ref{21,,compileall} 옵션인 @code{-j @var{N}} 을 사용하면 `N' 작업자를 동시에 실행하여 병렬 바이트 코드 컴파일을 수행할 수 있습니다. @ref{d1a,,compile_dir()} 함수에는 대응하는 @code{workers} 매개 변수가 있습니다. (Contributed by Claudiu Popa in bpo-16104@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16104}.)

또 다른 새로운 옵션인 @code{-r}은 하위 디렉터리에 대한 최대 재귀 수준을 제어할 수 있습니다. (Contributed by Claudiu Popa in bpo-19628@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19628}.)

이제 @code{-q} 명령 줄 옵션을 두 번 이상 지정할 수 있으며, 이 경우 에러를 포함한 모든 출력이 억제됩니다. @ref{d1a,,compile_dir()}, @ref{fe0,,compile_file()} 및 @ref{fe1,,compile_path()}의 해당 @code{quiet} 매개 변수는 이제 출력 억제 수준을 나타내는 정숫값을 받아들일 수 있습니다. (Contributed by Thomas Kluyver in bpo-21338@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21338}.)

@node concurrent futures<6>,configparser<5>,compileall<4>,개선된 모듈<5>
@anchor{whatsnew/3 5 concurrent-futures}@anchor{fe2}
@subsubsection concurrent.futures


@ref{1dc,,Executor.map()} 메서드는 이제 `chunksize' 인자를 받아, @ref{1d6,,ProcessPoolExecutor()}가 사용될 때 작업을 일괄 처리하여 성능을 향상할 수 있습니다. (Contributed by Dan O’Reilly in bpo-11271@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11271}.)

@ref{948,,ThreadPoolExecutor} 생성자의 작업자 수는 이제 선택 사항입니다. 기본값은 CPU 수의 5배입니다. (Contributed by Claudiu Popa in bpo-21527@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21527}.)

@node configparser<5>,contextlib<5>,concurrent futures<6>,개선된 모듈<5>
@anchor{whatsnew/3 5 configparser}@anchor{fe3}
@subsubsection configparser


@ref{26,,configparser}는 이제 @ref{4de,,ConfigParser} 생성자에서 변환기 딕셔너리를 지정하거나 @code{ConfigParser} 서브 클래스에서 메서드로 정의하여 값 변환을 사용자 정의하는 방법을 제공합니다. 구문 분석기 인스턴스에 정의된 변환기는 섹션 프락시에 의해 상속됩니다.

예:

@example
>>> import configparser
>>> conv = @{@}
>>> conv['list'] = lambda v: [e.strip() for e in v.split() if e.strip()]
>>> cfg = configparser.ConfigParser(converters=conv)
>>> cfg.read_string("""
... [s]
... list = a b c d e f g
... """)
>>> cfg.get('s', 'list')
'a b c d e f g'
>>> cfg.getlist('s', 'list')
['a', 'b', 'c', 'd', 'e', 'f', 'g']
>>> section = cfg['s']
>>> section.getlist('list')
['a', 'b', 'c', 'd', 'e', 'f', 'g']
@end example

(Contributed by Łukasz Langa in bpo-18159@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18159}.)

@node contextlib<5>,csv<3>,configparser<5>,개선된 모듈<5>
@anchor{whatsnew/3 5 contextlib}@anchor{fe4}
@subsubsection contextlib


새로운 @ref{fe5,,redirect_stderr()} @ref{1e1,,컨텍스트 관리자}(@ref{fe6,,redirect_stdout()}과 유사)를 사용하면 유틸리티 스크립트가 출력을 @ref{b33,,sys.stderr}에 기록하고 리디렉션 옵션을 제공하지 않는 유연하지 않은 API를 더 쉽게 처리할 수 있습니다:

@example
>>> import contextlib, io, logging
>>> f = io.StringIO()
>>> with contextlib.redirect_stderr(f):
...     logging.warning('warning')
...
>>> f.getvalue()
'WARNING:root:warning\n'
@end example

(Contributed by Berker Peksag in bpo-22389@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22389}.)

@node csv<3>,curses<5>,contextlib<5>,개선된 모듈<5>
@anchor{whatsnew/3 5 csv}@anchor{fe7}
@subsubsection csv


@ref{fe8,,writerow()} 메서드는 이제 시퀀스뿐만 아니라 임의의 이터러블을 지원합니다. (Contributed by Serhiy Storchaka in bpo-23171@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23171}.)

@node curses<5>,dbm<5>,csv<3>,개선된 모듈<5>
@anchor{whatsnew/3 5 curses}@anchor{fe9}
@subsubsection curses


The new @ref{fea,,update_lines_cols()} function updates the @ref{feb,,LINES}
and @ref{fec,,COLS} module variables.  This is useful for detecting
manual screen resizing.  (Contributed by Arnon Yaari in bpo-4254@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4254}.)

@node dbm<5>,difflib<3>,curses<5>,개선된 모듈<5>
@anchor{whatsnew/3 5 dbm}@anchor{fed}
@subsubsection dbm


@ref{c8c,,dumb.open}은 플래그 값이 @code{"n"}일 때 항상 새 데이터베이스를 만듭니다. (Contributed by Claudiu Popa in bpo-18039@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18039}.)

@node difflib<3>,distutils<7>,dbm<5>,개선된 모듈<5>
@anchor{whatsnew/3 5 difflib}@anchor{fee}
@subsubsection difflib


@ref{fef,,HtmlDiff.make_file()}에 의해 생성된 HTML 문서의 문자 집합은 이제 새로운 `charset' 키워드 전용 인자를 사용하여 사용자 정의 할 수 있습니다. HTML 문서의 기본 문자 집합이 @code{"ISO-8859-1"}에서 @code{"utf-8"}로 변경되었습니다. (Contributed by Berker Peksag in bpo-2052@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2052}.)

@ref{ff0,,diff_bytes()} 함수는 이제 바이트 문자열 리스트를 비교할 수 있습니다. 이것은 파이썬 2의 회귀를 수리합니다. (Contributed by Terry J. Reedy and Greg Ward in bpo-17445@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17445}.)

@node distutils<7>,doctest<3>,difflib<3>,개선된 모듈<5>
@anchor{whatsnew/3 5 distutils}@anchor{ff1}
@subsubsection distutils


@code{build}와 @code{build_ext} 명령은 이제 @code{-j} 옵션을 받아들여 확장 모듈의 병렬 빌드를 활성화합니다. (Contributed by Antoine Pitrou in bpo-5309@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5309}.)

@code{distutils} 모듈은 이제 @code{xz} 압축을 지원하며, @code{xztar}를 인자로 @code{bdist --format}에 전달하여 활성화 할 수 있습니다. (Contributed by Serhiy Storchaka in bpo-16314@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16314}.)

@node doctest<3>,email<4>,distutils<7>,개선된 모듈<5>
@anchor{whatsnew/3 5 doctest}@anchor{ff2}
@subsubsection doctest


@ref{ff3,,DocTestSuite()} 함수는 `module'에 독스트링이 없으면 @ref{2ec,,ValueError}를 발생시키는 대신 빈 @ref{ff4,,unittest.TestSuite}를 반환합니다. (Contributed by Glenn Jones in bpo-15916@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15916}.)

@node email<4>,enum<8>,doctest<3>,개선된 모듈<5>
@anchor{whatsnew/3 5 email}@anchor{ff5}
@subsubsection email


새로운 정책 옵션 @ref{ff6,,Policy.mangle_from_}은 생성자가 이메일 본문에서 @code{"From "}으로 시작하는 줄에 @code{">"} 문자를 접두사로 추가할지를 제어합니다. 기본값은 @ref{e96,,compat32}의 경우 @code{True}이고 다른 모든 정책의 경우 @code{False}입니다. (Contributed by Milan Oberkirch in bpo-20098@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20098}.)

새로운 @ref{ff7,,Message.get_content_disposition()} 메서드를 사용하면 @code{Content-Disposition} 헤더의 규범적 값에 쉽게 액세스 할 수 있습니다. (Contributed by Abhilash Raj in bpo-21083@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21083}.)

새로운 정책 옵션 @ref{ff8,,EmailPolicy.utf8}을 @code{True}로 설정하여 인코딩된 단어를 사용하는 대신 UTF-8 문자 집합을 사용하여 이메일 헤더를 인코딩 할 수 있습니다. 이를 통해 @code{Messages}를 
@geindex RFC; RFC 6532
RFC 6532@footnote{https://datatracker.ietf.org/doc/html/rfc6532.html}에 따라 포매팅하고 
@geindex RFC; RFC 6531
RFC 6531@footnote{https://datatracker.ietf.org/doc/html/rfc6531.html} @code{SMTPUTF8} 확장을 지원하는 SMTP 서버와 함께 사용할 수 있습니다. (Contributed by R. David Murray in bpo-24211@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24211}.)

@ref{ff9,,mime.text.MIMEText} 생성자는 이제 @ref{ffa,,charset.Charset} 인스턴스를 받아들입니다. (Contributed by Claude Paroz and Berker Peksag in bpo-16324@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16324}.)

@node enum<8>,faulthandler<4>,email<4>,개선된 모듈<5>
@anchor{whatsnew/3 5 enum}@anchor{ffb}
@subsubsection enum


@ref{841,,Enum} 콜러블에는 `names'만 제공되는 경우 열거형 값의 초기 수를 지정하는 새 매개 변수 `start'가 있습니다:

@example
>>> Animal = enum.Enum('Animal', 'cat dog', start=10)
>>> Animal.cat
<Animal.cat: 10>
>>> Animal.dog
<Animal.dog: 11>
@end example

(Contributed by Ethan Furman in bpo-21706@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21706}.)

@node faulthandler<4>,functools<5>,enum<8>,개선된 모듈<5>
@anchor{whatsnew/3 5 faulthandler}@anchor{ffc}
@subsubsection faulthandler


@ref{20f,,enable()}, @ref{ffd,,register()}, @ref{ffe,,dump_traceback()} 및 @ref{fff,,dump_traceback_later()} 함수는 이제 파일류 객체 외에도 파일 기술자를 받아들입니다. (Contributed by Wei Wu in bpo-23566@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23566}.)

@node functools<5>,glob<3>,faulthandler<4>,개선된 모듈<5>
@anchor{whatsnew/3 5 functools}@anchor{1000}
@subsubsection functools

@anchor{whatsnew/3 5 whatsnew-lrucache}@anchor{f6d}
대부분의 @ref{be1,,lru_cache()} 장치는 이제 C로 구현되어 훨씬 빨라졌습니다. (Contributed by Matt Joiner, Alexey Kachayev, and Serhiy Storchaka in bpo-14373@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14373}.)

@node glob<3>,gzip<4>,functools<5>,개선된 모듈<5>
@anchor{whatsnew/3 5 glob}@anchor{1001}
@subsubsection glob


@ref{a08,,iglob()}과 @ref{59f,,glob()} 함수는 이제 @code{"**"} 패턴을 사용하여 하위 디렉터리에서 재귀 검색을 지원합니다. (Contributed by Serhiy Storchaka in bpo-13968@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13968}.)

@node gzip<4>,heapq<2>,glob<3>,개선된 모듈<5>
@anchor{whatsnew/3 5 gzip}@anchor{1002}
@subsubsection gzip


@ref{65a,,GzipFile} 생성자의 `mode' 인자는 이제 배타적 생성을 요청하는 @code{"x"}를 받아들입니다. (Contributed by Tim Heaney in bpo-19222@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19222}.)

@node heapq<2>,http<3>,gzip<4>,개선된 모듈<5>
@anchor{whatsnew/3 5 heapq}@anchor{1003}
@subsubsection heapq


@ref{1004,,merge()}의 요소 비교는 이제 새로운 선택적 `key' 키워드 인자에 @ref{1005,,키 함수}를 전달하여 사용자 정의 할 수 있으며, 새로운 선택적 `reverse' 키워드 인자를 사용하여 요소 비교를 반전할 수 있습니다:

@example
>>> import heapq
>>> a = ['9', '777', '55555']
>>> b = ['88', '6666']
>>> list(heapq.merge(a, b, key=len))
['9', '88', '777', '6666', '55555']
>>> list(heapq.merge(reversed(a), reversed(b), key=len, reverse=True))
['55555', '6666', '777', '88', '9']
@end example

(Contributed by Raymond Hettinger in bpo-13742@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13742}.)

@node http<3>,http client<3>,heapq<2>,개선된 모듈<5>
@anchor{whatsnew/3 5 http}@anchor{1006}
@subsubsection http


HTTP 상태 코드, 이유 구문 및 영어로 작성된 자세한 설명의 집합을 정의하는 새로운 @ref{afc,,HTTPStatus} 열거형. (Contributed by Demian Brecht in bpo-21793@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21793}.)

@node http client<3>,idlelib 및 IDLE<2>,http<3>,개선된 모듈<5>
@anchor{whatsnew/3 5 http-client}@anchor{1007}
@subsubsection http.client


@ref{1008,,HTTPConnection.getresponse()}는 이제 원격 서버 연결이 예기치 않게 닫힐 때 @ref{1009,,RemoteDisconnected} 예외를 발생시킵니다. 또한 @ref{100a,,ConnectionError}(@code{RemoteDisconnected}는 이것의 서브 클래스입니다)가 발생하면, 클라이언트 소켓이 이제 자동으로 닫히고 다음 요청에 다시 연결됩니다:

@example
import http.client
conn = http.client.HTTPConnection('www.python.org')
for retries in range(3):
    try:
        conn.request('GET', '/')
        resp = conn.getresponse()
    except http.client.RemoteDisconnected:
        pass
@end example

(Contributed by Martin Panter in bpo-3566@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=3566}.)

@node idlelib 및 IDLE<2>,imaplib<3>,http client<3>,개선된 모듈<5>
@anchor{whatsnew/3 5 idlelib-and-idle}@anchor{100b}
@subsubsection idlelib 및 IDLE


idlelib는 IDLE 셸과 편집기를 구현하고 다른 프로그램에서 임포트 하려는 것이 아니기 때문에, 모든 릴리스에서 개선됩니다. 3.4.0 이후의 누적 변경 사항과 향후 3.5.x 릴리스에서 변경된 사항은 @code{Lib/idlelib/NEWS.txt}를 참조하십시오. 이 파일은 IDLE Help ‣ About IDLE 대화 상자에서도 제공됩니다.

@node imaplib<3>,imghdr,idlelib 및 IDLE<2>,개선된 모듈<5>
@anchor{whatsnew/3 5 imaplib}@anchor{100c}
@subsubsection imaplib


@ref{aff,,IMAP4} 클래스는 이제 @ref{1e1,,컨텍스트 관리자} 프로토콜을 지원합니다. @ref{186,,with} 문에서 사용하면 IMAP4 @code{LOGOUT} 명령이 블록 끝에서 자동으로 호출됩니다. (Contributed by Tarek Ziadé and Serhiy Storchaka in bpo-4972@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4972}.)

@ref{78,,imaplib} 모듈은 이제 @ref{100d,,IMAP4.enable()} 메서드를 통해 
@geindex RFC; RFC 5161
RFC 5161@footnote{https://datatracker.ietf.org/doc/html/rfc5161.html}(ENABLE 확장) 및 
@geindex RFC; RFC 6855
RFC 6855@footnote{https://datatracker.ietf.org/doc/html/rfc6855.html}(UTF-8 지원)를 지원합니다. 새로운 @ref{100e,,IMAP4.utf8_enabled} 어트리뷰트는 
@geindex RFC; RFC 6855
RFC 6855@footnote{https://datatracker.ietf.org/doc/html/rfc6855.html} 지원이 활성화되었는지를 추적합니다. (Contributed by Milan Oberkirch, R. David Murray, and Maciej Szulik in bpo-21800@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21800}.)

이제 @ref{78,,imaplib} 모듈은 이제 RFC에서 권장하는 대로 UTF-8을 사용하여 ASCII가 아닌 문자열 사용자 이름과 암호를 자동으로 인코딩합니다. (Contributed by Milan Oberkirch in bpo-21800@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21800}.)

@node imghdr,importlib<8>,imaplib<3>,개선된 모듈<5>
@anchor{whatsnew/3 5 imghdr}@anchor{100f}
@subsubsection imghdr


@code{what()} 함수는 이제 OpenEXR@footnote{https://www.openexr.com} 형식(contributed by Martin Vignali and Claudiu Popa in bpo-20295@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20295}) 및 WebP@footnote{https://en.wikipedia.org/wiki/WebP} 형식(contributed by Fabrice Aneche and Claudiu Popa in bpo-20197@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20197})을 인식합니다.

@node importlib<8>,inspect<8>,imghdr,개선된 모듈<5>
@anchor{whatsnew/3 5 importlib}@anchor{1010}
@subsubsection importlib


@ref{eaa,,util.LazyLoader} 클래스는 시작 소요 시간이 중요한 응용 프로그램에서 모듈의 지연 로드를 허용합니다. (Contributed by Brett Cannon in bpo-17621@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17621}.)

@ref{1011,,abc.InspectLoader.source_to_code()} 메서드는 이제 정적 메서드입니다. 이렇게 하면 @code{exec(code, module.__dict__)}를 실행하여 문자열에서 컴파일된 코드로 모듈 객체를 더 쉽게 초기화 할 수 있습니다. (Contributed by Brett Cannon in bpo-21156@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21156}.)

새 @ref{1012,,util.module_from_spec()} 함수는 이제 새 모듈을 만드는 데 선호되는 방법입니다. @ref{1013,,types.ModuleType} 인스턴스를 직접 만드는 것과는 반대로, 이 새로운 함수는 전달된 명세 객체를 기반으로 다양한 임포트 제어 어트리뷰트를 설정합니다. (Contributed by Brett Cannon in bpo-20383@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20383}.)

@node inspect<8>,io<7>,importlib<8>,개선된 모듈<5>
@anchor{whatsnew/3 5 inspect}@anchor{1014}
@subsubsection inspect


@ref{4e3,,Signature}와 @ref{4e4,,Parameter} 클래스 모두 이제 피클 가능하고 해시 가능합니다. (Contributed by Yury Selivanov in bpo-20726@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20726} and bpo-20334@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20334}.)

새로운 @ref{1015,,BoundArguments.apply_defaults()} 메서드는 누락 된 인자에 대한 기본값을 설정하는 방법을 제공합니다:

@example
>>> def foo(a, b='ham', *args): pass
>>> ba = inspect.signature(foo).bind('spam')
>>> ba.apply_defaults()
>>> ba.arguments
OrderedDict([('a', 'spam'), ('b', 'ham'), ('args', ())])
@end example

(Contributed by Yury Selivanov in bpo-24190@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24190}.)

새로운 클래스 메서드 @ref{941,,Signature.from_callable()}은 @ref{4e3,,Signature}의 서브 클래싱을 더 쉽게 만듭니다. (Contributed by Yury Selivanov and Eric Snow in bpo-17373@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17373}.)

@ref{22f,,signature()} 함수는 이제 `follow_wrapped' 선택적 키워드 인자를 받아들이며, @code{False}로 설정되면 @code{__wrapped__} 링크의 자동 추적을 비활성화합니다. (Contributed by Yury Selivanov in bpo-20691@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20691}.)

@ref{f72,,코루틴 함수}와 @ref{6b8,,코루틴 객체}를 검사하는 새로운 함수 집합 : @ref{1016,,iscoroutine()}, @ref{30d,,iscoroutinefunction()}, @ref{1017,,isawaitable()}, @ref{1018,,getcoroutinelocals()} 및 @ref{1019,,getcoroutinestate()} 가 추가되었습니다. (Contributed by Yury Selivanov in bpo-24017@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24017} and bpo-24400@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24400}.)

@ref{861,,stack()}, @ref{862,,trace()}, @ref{85f,,getouterframes()} 및 @ref{860,,getinnerframes()} 함수는 이제 네임드 튜플 리스트를 반환합니다. (Contributed by Daniel Shahaf in bpo-16808@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16808}.)

@node io<7>,ipaddress<4>,inspect<8>,개선된 모듈<5>
@anchor{whatsnew/3 5 io}@anchor{101a}
@subsubsection io


하부 원시 스트림의 @ref{101b,,RawIOBase.read()}나 @ref{101c,,RawIOBase.readinto()} 메서드에 대한 호출을 최대 한 번 사용하는 새로운 @ref{101d,,BufferedIOBase.readinto1()} 메서드. (Contributed by Nikolaus Rath in bpo-20578@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20578}.)

@node ipaddress<4>,json<3>,io<7>,개선된 모듈<5>
@anchor{whatsnew/3 5 ipaddress}@anchor{101e}
@subsubsection ipaddress


@ref{50d,,IPv4Network}와 @ref{50e,,IPv6Network} 클래스는 이제 기존 주소에서 네트워크 객체를 쉽게 구성할 수 있도록 @code{(address, netmask)} 튜플 인자를 받아들입니다:

@example
>>> import ipaddress
>>> ipaddress.IPv4Network(('127.0.0.0', 8))
IPv4Network('127.0.0.0/8')
>>> ipaddress.IPv4Network(('127.0.0.0', '255.0.0.0'))
IPv4Network('127.0.0.0/8')
@end example

(Contributed by Peter Moody and Antoine Pitrou in bpo-16531@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16531}.)

A new @ref{101f,,reverse_pointer} attribute for the
@ref{50b,,IPv4Address} and @ref{50c,,IPv6Address} classes
returns the name of the reverse DNS PTR record:

@example
>>> import ipaddress
>>> addr = ipaddress.IPv4Address('127.0.0.1')
>>> addr.reverse_pointer
'1.0.0.127.in-addr.arpa'
>>> addr6 = ipaddress.IPv6Address('::1')
>>> addr6.reverse_pointer
'1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa'
@end example

(Contributed by Leon Weber in bpo-20480@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20480}.)

@node json<3>,linecache<3>,ipaddress<4>,개선된 모듈<5>
@anchor{whatsnew/3 5 json}@anchor{1020}
@subsubsection json


@ref{87,,json.tool} 명령 줄 인터페이스는 이제 입력으로 전달된 JSON 객체의 키 순서를 유지합니다. 새로운 @code{--sort-keys} 옵션을 사용하여 키를 알파벳순으로 정렬 할 수 있습니다. (Contributed by Berker Peksag in bpo-21650@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21650}.)

이제 JSON 디코더는 에러에 대한 더 나은 문맥 정보를 제공하기 위해 @ref{2ec,,ValueError} 대신 @ref{1021,,JSONDecodeError}를 발생시킵니다. (Contributed by Serhiy Storchaka in bpo-19361@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19361}.)

@node linecache<3>,locale<6>,json<3>,개선된 모듈<5>
@anchor{whatsnew/3 5 linecache}@anchor{1022}
@subsubsection linecache


새로운 @ref{1023,,lazycache()} 함수를 사용하여 파일 기반이 아닌 모듈에 대한 정보를 캡처하여 나중에 @ref{240,,getline()}을 통해 해당 라인을 가져올 수 있습니다. 이렇게 하면 모듈 전역을 무기한으로 유지할 필요 없이, 실제로 줄이 필요할 때까지 I/O를 수행하지 않습니다. (Contributed by Robert Collins in bpo-17911@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17911}.)

@node locale<6>,logging<5>,linecache<3>,개선된 모듈<5>
@anchor{whatsnew/3 5 locale}@anchor{1024}
@subsubsection locale


새로운 @ref{1025,,delocalize()} 함수를 사용하여 @code{LC_NUMERIC} 설정을 고려하여 문자열을 정규화된 숫자 문자열로 변환 할 수 있습니다:

@example
>>> import locale
>>> locale.setlocale(locale.LC_NUMERIC, 'de_DE.UTF-8')
'de_DE.UTF-8'
>>> locale.delocalize('1.234,56')
'1234.56'
>>> locale.setlocale(locale.LC_NUMERIC, 'en_US.UTF-8')
'en_US.UTF-8'
>>> locale.delocalize('1,234.56')
'1234.56'
@end example

(Contributed by Cédric Krier in bpo-13918@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13918}.)

@node logging<5>,lzma,locale<6>,개선된 모듈<5>
@anchor{whatsnew/3 5 logging}@anchor{1026}
@subsubsection logging


모든 로깅 메서드(@ref{d45,,Logger} @ref{1027,,log()}, @ref{1028,,exception()}, @ref{1029,,critical()}, @ref{102a,,debug()} 등)는 이제 불리언 값과 예외 튜플 외에도 예외 인스턴스를 `exc_info' 인자로 받아들입니다:

@example
>>> import logging
>>> try:
...     1/0
... except ZeroDivisionError as ex:
...     logging.error('exception', exc_info=ex)
ERROR:root:exception
@end example

(Contributed by Yury Selivanov in bpo-20537@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20537}.)

이제 @ref{102b,,handlers.HTTPHandler} 클래스는 HTTP 연결에 사용되는 SSL 설정을 구성하기 위해 선택적 @ref{357,,ssl.SSLContext} 인스턴스를 받아들입니다. (Contributed by Alex Gaynor in bpo-22788@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22788}.)

@ref{242,,handlers.QueueListener} 클래스는 이제 `respect_handler_level' 키워드 인자를 취합니다. 이 인자는 @code{True}로 설정되면 처리기 수준을 고려하여 처리기에 메시지를 전달합니다. (Contributed by Vinay Sajip.)

@node lzma,math<9>,logging<5>,개선된 모듈<5>
@anchor{whatsnew/3 5 lzma}@anchor{102c}
@subsubsection lzma


이제 @ref{102d,,LZMADecompressor.decompress()} 메서드는 압축 해제된 데이터의 최대 크기를 제한하기 위해 선택적 `max_length' 인자를 받아들입니다. (Contributed by Martin Panter in bpo-15955@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15955}.)

@node math<9>,multiprocessing<7>,lzma,개선된 모듈<5>
@anchor{whatsnew/3 5 math}@anchor{102e}
@subsubsection math


@ref{92,,math} 모듈에 @ref{e7d,,inf}와 @ref{872,,nan}의 두 가지 새로운 상수가 추가되었습니다. (Contributed by Mark Dickinson in bpo-23185@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23185}.)

새로운 함수 @ref{faf,,isclose()}는 대략적인 동등성을 테스트하는 방법을 제공합니다. (Contributed by Chris Barker and Tal Einat in bpo-24270@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24270}.)

A new @ref{b0c,,gcd()} function has been added.  The @code{fractions.gcd()}
function is now deprecated. (Contributed by Mark Dickinson and Serhiy
Storchaka in bpo-22486@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22486}.)

@node multiprocessing<7>,operator<3>,math<9>,개선된 모듈<5>
@anchor{whatsnew/3 5 multiprocessing}@anchor{102f}
@subsubsection multiprocessing


@ref{1030,,sharedctypes.synchronized()} 객체는 이제 @ref{1e1,,컨텍스트 관리자} 프로토콜을 지원합니다. (Contributed by Charles-François Natali in bpo-21565@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21565}.)

@node operator<3>,os<11>,multiprocessing<7>,개선된 모듈<5>
@anchor{whatsnew/3 5 operator}@anchor{1031}
@subsubsection operator


@ref{1032,,attrgetter()}, @ref{c56,,itemgetter()} 및 @ref{1033,,methodcaller()} 객체는 이제 피클링을 지원합니다. (Contributed by Josh Rosenberg and Serhiy Storchaka in bpo-22955@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22955}.)

행렬 곱셈을 수행하는 새로운 @ref{1034,,matmul()}과 @ref{1035,,imatmul()} 함수. (Contributed by Benjamin Peterson in bpo-21176@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21176}.)

@node os<11>,pathlib<13>,operator<3>,개선된 모듈<5>
@anchor{whatsnew/3 5 os}@anchor{1036}
@subsubsection os


@ref{6c2,,DirEntry} 객체의 이터레이터를 반환하는 새로운 @ref{c53,,scandir()} 함수가 추가되었습니다. 가능하면, @code{scandir()}은 디렉터리를 스캔하는 동안 파일 어트리뷰트를 추출하여, 파일 유형이나 어트리뷰트를 파악하기 위해 후속 시스템 호출을 수행할 필요가 없어서, 성능이 크게 향상될 수 있습니다. (Contributed by Ben Hoyt with the help of Victor Stinner in bpo-22524@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22524}.)

윈도우에서, 이제 새로운 @ref{1037,,stat_result.st_file_attributes} 어트리뷰트를 사용할 수 있습니다. @code{GetFileInformationByHandle()} 이 반환한 @code{BY_HANDLE_FILE_INFORMATION} 구조체의 @code{dwFileAttributes} 멤버에 해당합니다. (Contributed by Ben Hoyt in bpo-21719@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21719}.)

@ref{745,,urandom()} 함수는 이제 리눅스 3.17 이상에서 @code{getrandom()} 시스템 호출을 사용하고, OpenBSD 5.6 이상에서 @code{getentropy()}를 사용하여, @code{/dev/urandom}을 사용할 필요가 없고 잠재적인 파일 기술자 고갈로 인한 실패를 방지합니다. (Contributed by Victor Stinner in bpo-22181@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22181}.)

새로운 @ref{1038,,get_blocking()}과 @ref{1039,,set_blocking()} 함수를 사용하여 파일 기술자의 블로킹 모드(@ref{103a,,O_NONBLOCK})를 가져오고 설정할 수 있습니다 (Contributed by Victor Stinner in bpo-22054@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22054}.)

이제 @ref{103b,,truncate()}와 @ref{f8e,,ftruncate()} 함수가 이제 윈도우에서 지원됩니다. (Contributed by Steve Dower in bpo-23668@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23668}.)

전달된 각 경로명의 가장 긴 공통 하위 경로를 반환하는 새로운 @ref{103c,,os.path.commonpath()} 함수가 있습니다. @ref{103d,,os.path.commonprefix()} 함수와 달리, 항상 유효한 경로를 반환합니다:

@example
>>> os.path.commonprefix(['/usr/lib', '/usr/local/lib'])
'/usr/l'

>>> os.path.commonpath(['/usr/lib', '/usr/local/lib'])
'/usr'
@end example

(Contributed by Rafik Draoui and Serhiy Storchaka in bpo-10395@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10395}.)

@node pathlib<13>,pickle<4>,os<11>,개선된 모듈<5>
@anchor{whatsnew/3 5 pathlib}@anchor{103e}
@subsubsection pathlib


새로운 @ref{103f,,Path.samefile()} 메서드를 사용하여 다른 @ref{266,,Path} 객체나 문자열일 수 있는 다른 경로와 같은 파일을 가리키는지를 확인할 수 있습니다:

@example
>>> import pathlib
>>> p1 = pathlib.Path('/etc/hosts')
>>> p2 = pathlib.Path('/etc/../etc/hosts')
>>> p1.samefile(p2)
True
@end example

(Contributed by Vajrasky Kok and Antoine Pitrou in bpo-19775@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19775}.)

@ref{1040,,Path.mkdir()} 메서드는 이제 @code{mkdir -p}와 @ref{52c,,os.makedirs()} 기능과 일치하는 새로운 선택적 `exist_ok' 인자를 받아들입니다. (Contributed by Berker Peksag in bpo-21539@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21539}.)

@code{~}와 @code{~user} 접두사를 확장하는 새로운 @ref{1041,,Path.expanduser()} 메서드가 있습니다. (Contributed by Serhiy Storchaka and Claudiu Popa in bpo-19776@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19776}.)

새로운 @ref{1042,,Path.home()} 클래스 메서드를 사용하여 사용자의 홈 디렉터리를 나타내는 @ref{266,,Path} 인스턴스를 가져올 수 있습니다. (Contributed by Victor Salgado and Mayank Tripathi in bpo-19777@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19777}.)

파일에 대한 읽기/쓰기 연산을 단순화하는 새로운 @ref{1043,,Path.write_text()}, @ref{1044,,Path.read_text()}, @ref{1045,,Path.write_bytes()}, @ref{2df,,Path.read_bytes()} 메서드.

다음 코드 조각은 @code{~/spam42}를 만들거나 기존 파일을 다시 작성합니다:

@example
>>> import pathlib
>>> p = pathlib.Path('~/spam42')
>>> p.expanduser().write_text('ham')
3
@end example

(Contributed by Christopher Welborn in bpo-20218@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20218}.)

@node pickle<4>,poplib<2>,pathlib<13>,개선된 모듈<5>
@anchor{whatsnew/3 5 pickle}@anchor{1046}
@subsubsection pickle


연결되지 않은 메서드나 중첩된 클래스와 같은 중첩 된 객체는 이제 프로토콜 버전 4보다 오래된 @ref{27b,,피클 프로토콜}을 사용하여 피클 할 수 있습니다. 프로토콜 버전 4는 이미 이러한 경우를 지원합니다. (Contributed by Serhiy Storchaka in bpo-23611@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23611}.)

@node poplib<2>,re<8>,pickle<4>,개선된 모듈<5>
@anchor{whatsnew/3 5 poplib}@anchor{1047}
@subsubsection poplib


새로운 @ref{1048,,POP3.utf8()} 명령은 POP 서버가 지원하면 
@geindex RFC; RFC 6856
RFC 6856@footnote{https://datatracker.ietf.org/doc/html/rfc6856.html} (국제화된 이메일) 지원을 활성화합니다. (Contributed by Milan OberKirch in bpo-21804@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21804}.)

@node re<8>,readline<2>,poplib<2>,개선된 모듈<5>
@anchor{whatsnew/3 5 re}@anchor{1049}
@subsubsection re


고정 길이를 가진 그룹에 대한 참조와 조건부 참조는 이제 되돌아보기 어서션(lookbehind assertions)에서 허용됩니다:

@example
>>> import re
>>> pat = re.compile(r'(a|b).(?<=\1)c')
>>> pat.match('aac')
<_sre.SRE_Match object; span=(0, 3), match='aac'>
>>> pat.match('bbc')
<_sre.SRE_Match object; span=(0, 3), match='bbc'>
@end example

(Contributed by Serhiy Storchaka in bpo-9179@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9179}.)

정규식의 캡처 그룹 수는 더는 100개로 제한되지 않습니다. (Contributed by Serhiy Storchaka in bpo-22437@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22437}.)

@ref{5a2,,sub()}와 @ref{5a3,,subn()} 함수는 이제 예외를 발생시키는 대신 일치하지 않는 그룹을 빈 문자열로 대체합니다. (Contributed by Serhiy Storchaka in bpo-1519638@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1519638}.)

The @ref{546,,re.error} exceptions have new attributes,
@ref{104a,,msg}, @ref{104b,,pattern},
@ref{104c,,pos}, @ref{104d,,lineno},
and @ref{104e,,colno}, that provide better context
information about the error:

@example
>>> re.compile("""
...     (?x)
...     .++
... """)
Traceback (most recent call last):
   ...
sre_constants.error: multiple repeat at position 16 (line 3, column 7)
@end example

(Contributed by Serhiy Storchaka in bpo-22578@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22578}.)

@node readline<2>,selectors,re<8>,개선된 모듈<5>
@anchor{whatsnew/3 5 readline}@anchor{104f}
@subsubsection readline


새로운 @ref{1050,,append_history_file()} 함수를 사용하여 지정된 파일에 히스토리에 지정된 수의 후행 요소를 추가 할 수 있습니다. (Contributed by Bruno Cauet in bpo-22940@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22940}.)

@node selectors,Shutil,readline<2>,개선된 모듈<5>
@anchor{whatsnew/3 5 selectors}@anchor{1051}
@subsubsection selectors


새로운 @ref{dd0,,DevpollSelector}는 Solaris에서 효율적인 @code{/dev/poll} 폴링을 지원합니다. (Contributed by Giampaolo Rodola’ in bpo-18931@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18931}.)

@node Shutil,signal<3>,selectors,개선된 모듈<5>
@anchor{whatsnew/3 5 shutil}@anchor{1052}
@subsubsection Shutil


@ref{c50,,move()} 함수는 이제 `copy_function' 인자를 받아들여, 예를 들어, 이동할 때 파일 메타 데이터를 무시해야 하면 기본 @ref{c4f,,copy2()} 대신 @ref{c4e,,copy()} 함수를 사용할 수 있습니다. (Contributed by Claudiu Popa in bpo-19840@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19840}.)

@ref{6d9,,make_archive()} 함수는 이제 `xztar' 형식을 지원합니다. (Contributed by Serhiy Storchaka in bpo-5411@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5411}.)

@node signal<3>,smtpd<2>,Shutil,개선된 모듈<5>
@anchor{whatsnew/3 5 signal}@anchor{1053}
@subsubsection signal


윈도우에서, @ref{d66,,set_wakeup_fd()} 함수는 이제 소켓 핸들도 지원합니다. (Contributed by Victor Stinner in bpo-22018@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22018}.)

@ref{cb,,signal} 모듈의 다양한 @code{SIG*} 상수가 @ref{5a,,열거형}으로 변환되었습니다. 이를 통해 디버깅 중에 정수 “매직 넘버” 대신 의미 있는 이름을 인쇄할 수 있습니다. (Contributed by Giampaolo Rodola’ in bpo-21076@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21076}.)

@node smtpd<2>,smtplib<2>,signal<3>,개선된 모듈<5>
@anchor{whatsnew/3 5 smtpd}@anchor{1054}
@subsubsection smtpd


이제 @code{SMTPServer}와 @code{SMTPChannel} 클래스 모두 `decode_data' 키워드 인자를 받아 SMTP 트랜잭션의 @code{DATA} 부분이 @code{"utf-8"} 코덱을 사용하여 디코딩되는지 아니면 대신 바이트 문자열로 @code{SMTPServer.process_message()} 메서드에 제공되는지 확인합니다. 이전 버전과의 호환성을 위해 기본값은 @code{True}이지만, 파이썬 3.6에서는 @code{False}로 변경됩니다. `decode_data'가 @code{False}로 설정되면, @code{process_message} 메서드는 키워드 인자를 받아들일 준비가 되어 있어야 합니다. (Contributed by Maciej Szulik in bpo-19662@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19662}.)

`decode_data'가 @code{True}로 설정되면 @code{SMTPServer} 클래스는 이제 @code{8BITMIME} 확장(
@geindex RFC; RFC 6152
RFC 6152@footnote{https://datatracker.ietf.org/doc/html/rfc6152.html})을 알립니다. 클라이언트가 @code{MAIL} 명령에 @code{BODY=8BITMIME}를 지정하면, `mail_options' 키워드를 통해 @code{SMTPServer.process_message()}로 전달됩니다. (Contributed by Milan Oberkirch and R.  David Murray in bpo-21795@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21795}.)

@code{SMTPServer} 클래스는 이제 @code{SMTPUTF8} 확장(
@geindex RFC; RFC 6531
RFC 6531@footnote{https://datatracker.ietf.org/doc/html/rfc6531.html}: 국제화된 이메일)도 지원합니다. 클라이언트가 @code{MAIL} 명령에 @code{SMTPUTF8 BODY=8BITMIME}을 지정하면, `mail_options' 키워드를 통해 @code{SMTPServer.process_message()}로 전달됩니다. @code{SMTPUTF8} 데이터를 올바르게 처리하는 것은 @code{process_message} 메서드의 책임입니다. (Contributed by Milan Oberkirch in bpo-21725@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21725}.)

이제 @code{SMTPServer} 생성자에 직접 또는 이름 결정(name resolution)을 통해 IPv6 주소를 제공하고 성공적으로 연결할 수 있습니다. (Contributed by Milan Oberkirch in bpo-14758@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14758}.)

@node smtplib<2>,sndhdr,smtpd<2>,개선된 모듈<5>
@anchor{whatsnew/3 5 smtplib}@anchor{1055}
@subsubsection smtplib


새로운 @ref{1056,,SMTP.auth()} 메서드는 사용자 정의 인증 메커니즘을 구현하는 편리한 방법을 제공합니다. (Contributed by Milan Oberkirch in bpo-15014@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15014}.)

@ref{1057,,SMTP.set_debuglevel()} 메서드는 이제 디버그 메시지에서 타임 스탬프를 활성화하는 추가 디버그 수준(2)을 받아들입니다. (Contributed by Gavin Chappell and Maciej Szulik in bpo-16914@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16914}.)

@ref{1058,,SMTP.sendmail()}과 @ref{1059,,SMTP.send_message()} 메서드 모두 이제 
@geindex RFC; RFC 6531
RFC 6531@footnote{https://datatracker.ietf.org/doc/html/rfc6531.html}(SMTPUTF8)을 지원합니다. (Contributed by Milan Oberkirch and R. David Murray in bpo-22027@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22027}.)

@node sndhdr,socket<9>,smtplib<2>,개선된 모듈<5>
@anchor{whatsnew/3 5 sndhdr}@anchor{105a}
@subsubsection sndhdr


@code{what()}과 @code{whathdr()} 함수는 이제 @ref{4e0,,namedtuple()}을 반환합니다. (Contributed by Claudiu Popa in bpo-18615@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18615}.)

@node socket<9>,ssl<10>,sndhdr,개선된 모듈<5>
@anchor{whatsnew/3 5 socket}@anchor{105b}
@subsubsection socket


제한 시간이 있는 함수는 이제 시스템 시계 대신 단조증가(monotonic) 시계를 사용합니다. (Contributed by Victor Stinner in bpo-22043@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22043}.)

새로운 @ref{105c,,socket.sendfile()} 메서드를 사용하면 유닉스에서 고성능 @ref{d04,,os.sendfile()} 함수를 사용하여 소켓을 통해 파일을 전송할 수 있어서, 일반 @ref{fa6,,socket.send()}를 사용할 때 보다 업로드 속도가 2 에서 3배 빨라집니다. (Contributed by Giampaolo Rodola’ in bpo-17552@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17552}.)

@ref{fa7,,socket.sendall()} 메서드는 더는 바이트를 받거나 보낼 때마다 소켓 시간제한을 재설정하지 않습니다. 소켓 시간제한은 이제 모든 데이터를 보내는 최대 총 기간입니다. (Contributed by Victor Stinner in bpo-23853@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23853}.)

@ref{105d,,socket.listen()} 메서드의 `backlog' 인자는 이제 선택 사항입니다. 기본적으로 @ref{105e,,SOMAXCONN}나 @code{128}중 작은 값으로 설정됩니다. (Contributed by Charles-François Natali in bpo-21455@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21455}.)

@node ssl<10>,sqlite3<9>,socket<9>,개선된 모듈<5>
@anchor{whatsnew/3 5 ssl}@anchor{105f}
@subsubsection ssl


@menu
* 메모리 BIO 지원:: 
* 응용 프로그램 계층 프로토콜 협상 지원:: 
* 기타 변경 사항:: 

@end menu

@node 메모리 BIO 지원,응용 프로그램 계층 프로토콜 협상 지원,,ssl<10>
@anchor{whatsnew/3 5 memory-bio-support}@anchor{1060}@anchor{whatsnew/3 5 whatsnew-sslmemorybio}@anchor{f6b}
@subsubsection 메모리 BIO 지원


(Contributed by Geert Jansen in bpo-21965@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21965}.)

새로운 @ref{d79,,SSLObject} 클래스가 추가되어 @ref{ae7,,SSLSocket}의 네트워크 I/O 기능이 필요하지 않거나 최적이 아닐 때 SSL 프로토콜 지원을 제공합니다. @code{SSLObject}는 SSL 프로토콜 인스턴스를 나타내지만, 네트워크 I/O 메서드를 구현하지 않고 대신 메모리 버퍼 인터페이스를 제공합니다. 새로운 @ref{1061,,MemoryBIO} 클래스는 파이썬과 SSL 프로토콜 인스턴스 간에 데이터를 전달하는 데 사용할 수 있습니다.

메모리 BIO SSL 지원은 주로 @ref{ae7,,SSLSocket}의 준비(readiness) 모델 (“select/poll”)이 비효율적인 비동기 I/O를 구현하는 프레임워크에서 사용하기 위한 것입니다.

새 @ref{d7a,,SSLContext.wrap_bio()} 메서드를 사용하여 새 @code{SSLObject} 인스턴스를 만들 수 있습니다.

@node 응용 프로그램 계층 프로토콜 협상 지원,기타 변경 사항,메모리 BIO 지원,ssl<10>
@anchor{whatsnew/3 5 application-layer-protocol-negotiation-support}@anchor{1062}
@subsubsection 응용 프로그램 계층 프로토콜 협상 지원


(Contributed by Benjamin Peterson in bpo-20188@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20188}.)

OpenSSL 지원이 있는 경우, @ref{d5,,ssl} 모듈은 이제 
@geindex RFC; RFC 7301
RFC 7301@footnote{https://datatracker.ietf.org/doc/html/rfc7301.html}에 설명된 대로 `응용 프로그램 계층 프로토콜 협상(Application-Layer Protocol Negotiation)' TLS 확장을 구현합니다.

새로운 @ref{1063,,SSLContext.set_alpn_protocols()}는 소켓이 TLS 핸드 셰이크 중에 어떤 프로토콜을 알려야 하는지 지정하는 데 사용할 수 있습니다.

새로운 @ref{1064,,SSLSocket.selected_alpn_protocol()}은 TLS 핸드 셰이크 중에 선택된 프로토콜을 반환합니다. @ref{1065,,HAS_ALPN} 플래그는 ALPN 지원이 있는지를 나타냅니다.

@node 기타 변경 사항,,응용 프로그램 계층 프로토콜 협상 지원,ssl<10>
@anchor{whatsnew/3 5 other-changes}@anchor{1066}
@subsubsection 기타 변경 사항


사용 중인 실제 프로토콜 버전을 조회하는 새로운 @ref{1067,,SSLSocket.version()} 메서드가 있습니다. (Contributed by Antoine Pitrou in bpo-20421@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20421}.)

The @ref{ae7,,SSLSocket} class now implements
a @code{SSLSocket.sendfile()} method.
(Contributed by Giampaolo Rodola’ in bpo-17552@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17552}.)

The @code{SSLSocket.send()} method now raises either
the @ref{1068,,ssl.SSLWantReadError} or @ref{1069,,ssl.SSLWantWriteError} exception on a
non-blocking socket if the operation would block. Previously, it would return
@code{0}.  (Contributed by Nikolaus Rath in bpo-20951@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20951}.)

@ref{106a,,cert_time_to_seconds()} 함수는 이제 입력 시간을 
@geindex RFC; RFC 5280
RFC 5280@footnote{https://datatracker.ietf.org/doc/html/rfc5280.html}에 따라 현지 시간이 아닌 UTC로 해석합니다. 또한, 반환 값은 항상 @ref{19b,,int}입니다. (Contributed by Akira Li in bpo-19940@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19940}.)

New @code{SSLObject.shared_ciphers()} and
@ref{106b,,SSLSocket.shared_ciphers()} methods return
the list of ciphers sent by the client during the handshake.
(Contributed by Benjamin Peterson in bpo-23186@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23186}.)

The @ref{106c,,SSLSocket.do_handshake()},
@ref{106d,,SSLSocket.read()},
@code{SSLSocket.shutdown()}, and
@ref{106e,,SSLSocket.write()} methods of the @ref{ae7,,SSLSocket}
class no longer reset the socket timeout every time bytes are received or sent.
The socket timeout is now the maximum total duration of the method.
(Contributed by Victor Stinner in bpo-23853@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23853}.)

The @code{match_hostname()} function now supports matching of IP addresses.
(Contributed by Antoine Pitrou in bpo-23239@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23239}.)

@node sqlite3<9>,subprocess<4>,ssl<10>,개선된 모듈<5>
@anchor{whatsnew/3 5 sqlite3}@anchor{106f}
@subsubsection sqlite3


@ref{1070,,Row} 클래스는 이제 시퀀스 프로토콜, 특히 @ref{a65,,reversed()} 이터레이션과 슬라이스 인덱싱을 완전히 지원합니다. (Contributed by Claudiu Popa in bpo-10203@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10203}; by Lucas Sinclair, Jessica McKellar, and  Serhiy Storchaka in bpo-13583@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13583}.)

@node subprocess<4>,sys<11>,sqlite3<9>,개선된 모듈<5>
@anchor{whatsnew/3 5 subprocess}@anchor{1071}@anchor{whatsnew/3 5 whatsnew-subprocess}@anchor{f6e}
@subsubsection subprocess


새로운 @ref{d7e,,run()} 함수가 추가되었습니다. 지정된 명령을 실행하고 완료된 프로세스를 설명하는 @ref{1072,,CompletedProcess} 객체를 반환합니다. 새 API는 더 일관적이며 이전 파이썬 버전과의 호환성을 유지할 필요가 없는 파이썬 코드에서 서브 프로세스를 호출하는 데 권장되는 접근 방식입니다. (Contributed by Thomas Kluyver in bpo-23342@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23342}.)

예:

@example
>>> subprocess.run(["ls", "-l"])  # doesn't capture output
CompletedProcess(args=['ls', '-l'], returncode=0)

>>> subprocess.run("exit 1", shell=True, check=True)
Traceback (most recent call last):
  ...
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1

>>> subprocess.run(["ls", "-l", "/dev/null"], stdout=subprocess.PIPE)
CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n')
@end example

@node sys<11>,sysconfig<3>,subprocess<4>,개선된 모듈<5>
@anchor{whatsnew/3 5 sys}@anchor{1073}
@subsubsection sys


A new @code{set_coroutine_wrapper()} function allows setting a global
hook that will be called whenever a @ref{6b8,,coroutine object}
is created by an @ref{7ec,,async def} function.  A corresponding
@code{get_coroutine_wrapper()} can be used to obtain a currently set
wrapper.  Both functions are @ref{3d1,,provisional},
and are intended for debugging purposes only.  (Contributed by Yury Selivanov
in bpo-24017@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24017}.)

새로운 @ref{c7f,,is_finalizing()} 함수를 사용하여 파이썬 인터프리터가 @ref{47a,,종료 중}인지 확인할 수 있습니다. (Contributed by Antoine Pitrou in bpo-22696@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22696}.)

@node sysconfig<3>,tarfile<7>,sys<11>,개선된 모듈<5>
@anchor{whatsnew/3 5 sysconfig}@anchor{1074}
@subsubsection sysconfig


이제 윈도우의 사용자 스크립트 디렉터리 이름에 파이썬 버전의 처음 두 구성 요소가 포함됩니다. (Contributed by Paul Moore in bpo-23437@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23437}.)

@node tarfile<7>,threading<7>,sysconfig<3>,개선된 모듈<5>
@anchor{whatsnew/3 5 tarfile}@anchor{1075}
@subsubsection tarfile


@ref{1076,,open()} 함수의 `mode' 인자는 이제 배타적 생성을 요청하는 @code{"x"}를 받아들입니다. (Contributed by Berker Peksag in bpo-21717@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21717}.)

@ref{29b,,TarFile.extractall()}과 @ref{29c,,TarFile.extract()} 메서드는 이제 키워드 인자 `numeric_owner'를 취합니다. @code{True}로 설정하면, 압축을 푼 파일과 디렉터리는 tar 파일의 숫자 @code{uid}와 @code{gid}가 소유합니다. @code{False}(기본값, 또한 3.5 이전 버전의 동작)로 설정하면, tar 파일의 명명된 사용자와 그룹이 소유합니다. (Contributed by Michael Vogt and Eric Smith in bpo-23193@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23193}.)

@ref{1077,,TarFile.list()}는 이제 @ref{1078,,TarFile.getmembers()}가 반환하는 리스트의 부분 집합으로 설정할 수 있는 선택적 `members' 키워드 인자를 받아들입니다. (Contributed by Serhiy Storchaka in bpo-21549@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21549}.)

@node threading<7>,time<7>,tarfile<7>,개선된 모듈<5>
@anchor{whatsnew/3 5 threading}@anchor{1079}
@subsubsection threading


이제 @ref{8a6,,Lock.acquire()}와 @ref{107a,,RLock.acquire()} 메서드 모두 시간제한 관리에 단조증가(monotonic) 시계를 사용합니다. (Contributed by Victor Stinner in bpo-22043@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22043}.)

@node time<7>,timeit<2>,threading<7>,개선된 모듈<5>
@anchor{whatsnew/3 5 time}@anchor{107b}
@subsubsection time


@ref{55b,,monotonic()} 함수는 이제 항상 사용할 수 있습니다. (Contributed by Victor Stinner in bpo-22043@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22043}.)

@node timeit<2>,tkinter<9>,time<7>,개선된 모듈<5>
@anchor{whatsnew/3 5 timeit}@anchor{107c}
@subsubsection timeit


새로운 명령 줄 옵션 @code{-u}나 @code{--unit=@var{U}} 를 사용하여 타이머 출력의 시간 단위를 지정할 수 있습니다. 지원되는 옵션은 @code{usec}, @code{msec} 또는 @code{sec}입니다. (Contributed by Julian Gindi in bpo-18983@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18983}.)

@ref{107d,,timeit()} 함수에는 코드가 실행될 이름 공간을 지정하기 위한 새로운 `globals' 매개 변수가 있습니다. (Contributed by Ben Roberts in bpo-2527@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2527}.)

@node tkinter<9>,traceback<5>,timeit<2>,개선된 모듈<5>
@anchor{whatsnew/3 5 tkinter}@anchor{107e}
@subsubsection tkinter


윈도우에서 Tcl/Tk 환경을 설정하는 데 사용되는 @code{tkinter._fix} 모듈은 환경 변수를 영구적으로 변경하지 않는 @code{_tkinter} 모듈의 내부 함수로 대체되었습니다. (Contributed by Zachary Ware in bpo-20035@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20035}.)

@node traceback<5>,types<6>,tkinter<9>,개선된 모듈<5>
@anchor{whatsnew/3 5 traceback}@anchor{107f}@anchor{whatsnew/3 5 whatsnew-traceback}@anchor{f6f}
@subsubsection traceback


새로운 @ref{1080,,walk_stack()}과 @ref{1081,,walk_tb()} 함수로 프레임과 @ref{cea,,트레이스백 객체}를 편리하게 탐색 할 수 있습니다. (Contributed by Robert Collins in bpo-17911@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17911}.)

새로운 경량 클래스: @ref{561,,TracebackException}, @ref{1082,,StackSummary} 및 @ref{1083,,FrameSummary}. (Contributed by Robert Collins in bpo-17911@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17911}.)

@ref{1084,,print_tb()}와 @ref{1085,,print_stack()} 함수는 모두 이제 `limit' 인자에 대해 음수 값을 지원합니다. (Contributed by Dmitry Kazakov in bpo-22619@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22619}.)

@node types<6>,unicodedata<9>,traceback<5>,개선된 모듈<5>
@anchor{whatsnew/3 5 types}@anchor{1086}
@subsubsection types


@ref{dd8,,제너레이터}와 @ref{fda,,제너레이터류} 객체를 @ref{4c9,,어웨이터블}로 변환하는 새로운 @ref{1087,,coroutine()} 함수. (Contributed by Yury Selivanov in bpo-24017@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24017}.)

@ref{7ec,,async def} 함수로 만든 @ref{6b8,,코루틴} 객체에 사용되는 @ref{1088,,CoroutineType}라는 새로운 형. (Contributed by Yury Selivanov in bpo-24400@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24400}.)

@node unicodedata<9>,unittest<9>,types<6>,개선된 모듈<5>
@anchor{whatsnew/3 5 unicodedata}@anchor{1089}
@subsubsection unicodedata


@ref{10b,,unicodedata} 모듈은 이제 유니코드 8.0.0@footnote{https://unicode.org/versions/Unicode8.0.0/}의 데이터를 사용합니다.

@node unittest<9>,unittest mock<3>,unicodedata<9>,개선된 모듈<5>
@anchor{whatsnew/3 5 unittest}@anchor{108a}
@subsubsection unittest


@ref{593,,TestLoader.loadTestsFromModule()} 메서드는 이제 @code{load_tests}에 세 번째 인자로 전달되는 키워드 전용 인자 `pattern'을 받아들입니다. 패키지 이름이 기본 패턴과 일치할 수 없어서, 이제 발견된 패키지의 경로가 `pattern'과 일치하는지와 관계없이 @code{load_tests}를 확인합니다. (Contributed by Robert Collins and Barry A. Warsaw in bpo-16662@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16662}.)

이제 unittest 디스커버리 에러가 @ref{592,,TestLoader} 인스턴스의 @ref{108b,,TestLoader.errors} 어트리뷰트에 표시됩니다. (Contributed by Robert Collins in bpo-19746@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19746}.)

트레이스백에 지역 변수를 표시하는 새로운 명령 줄 옵션 @code{--locals}. (Contributed by Robert Collins in bpo-22936@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22936}.)

@node unittest mock<3>,urllib<4>,unittest<9>,개선된 모듈<5>
@anchor{whatsnew/3 5 unittest-mock}@anchor{108c}
@subsubsection unittest.mock


@ref{c3d,,Mock} 클래스는 다음과 같이 개선되었습니다:


@itemize *

@item 
클래스 생성자에는 @code{"assert"}로 시작하는 어트리뷰트 이름에 대해 모의 객체가 @ref{5ee,,AttributeError}를 발생시키는 새로운 `unsafe' 매개 변수가 있습니다. (Contributed by Kushal Das in bpo-21238@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21238}.)

@item 
모의 객체가 호출되었는지 확인하는 새로운 @ref{108d,,Mock.assert_not_called()} 메서드. (Contributed by Kushal Das in bpo-21262@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21262}.)
@end itemize

The @ref{108e,,MagicMock} class now supports
@ref{108f,,__truediv__()}, @ref{1090,,__divmod__()}
and @ref{f78,,__matmul__()} operators.
(Contributed by Johannes Baiter in bpo-20968@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20968}, and Håkan Lövdahl
in bpo-23581@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23581} and bpo-23568@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23568}.)

내장 이름을 패치 할 때 더는 @code{create=True}를 @ref{1091,,patch()} 함수에 명시적으로 전달할 필요가 없습니다. (Contributed by Kushal Das in bpo-17660@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17660}.)

@node urllib<4>,wsgiref,unittest mock<3>,개선된 모듈<5>
@anchor{whatsnew/3 5 urllib}@anchor{1092}
@subsubsection urllib


새로운 @ref{1093,,request.HTTPPasswordMgrWithPriorAuth} 클래스는 HTTP 기본 인증 자격 증명을 관리하도록 허용하여, 불필요한 @code{401} 응답 처리를 제거하거나, @code{Authorization} 헤더가 전송되지 않았으면 @code{401} 대신 @code{404} 응답을 반환하는 서버와 통신하기 위해 첫 번째 요청에서 자격 증명을 무조건 전송하도록 합니다. (Contributed by Matej Cepl in bpo-19494@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19494} and Akshit Khurana in bpo-7159@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7159}.)

@ref{1094,,parse.urlencode()} 함수에 대한 새로운 `quote_via' 인자는 필요하면 쿼리 부분의 인코딩을 제어하는 방법을 제공합니다. (Contributed by Samwyse and Arnon Yaari in bpo-13866@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13866}.)

@ref{307,,request.urlopen()} 함수는 HTTPS 연결에 사용될 `context' 인자로 @ref{357,,ssl.SSLContext} 객체를 받아들입니다. (Contributed by Alex Gaynor in bpo-22366@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22366}.)

@ref{1095,,parse.urljoin()}은 상대 URL 확인을 위해 
@geindex RFC; RFC 1808
RFC 1808@footnote{https://datatracker.ietf.org/doc/html/rfc1808.html}과 
@geindex RFC; RFC 2396
RFC 2396@footnote{https://datatracker.ietf.org/doc/html/rfc2396.html} 대신에 
@geindex RFC; RFC 3986
RFC 3986@footnote{https://datatracker.ietf.org/doc/html/rfc3986.html} 의미 체계를 사용하도록 갱신되었습니다. (Contributed by Demian Brecht and Senthil Kumaran in bpo-22118@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22118}.)

@node wsgiref,xmlrpc<2>,urllib<4>,개선된 모듈<5>
@anchor{whatsnew/3 5 wsgiref}@anchor{1096}
@subsubsection wsgiref


@ref{1097,,headers.Headers} 클래스 생성자의 `headers' 인자는 이제 선택 사항입니다. (Contributed by Pablo Torres Navarrete and SilentGhost in bpo-5800@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5800}.)

@node xmlrpc<2>,xml sax,wsgiref,개선된 모듈<5>
@anchor{whatsnew/3 5 xmlrpc}@anchor{1098}
@subsubsection xmlrpc


@ref{c4b,,client.ServerProxy} 클래스는 이제 @ref{1e1,,컨텍스트 관리자} 프로토콜을 지원합니다. (Contributed by Claudiu Popa in bpo-20627@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20627}.)

@ref{c4b,,client.ServerProxy} 생성자는 이제 선택적 @ref{357,,ssl.SSLContext} 인스턴스를 받아들입니다. (Contributed by Alex Gaynor in bpo-22960@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22960}.)

@node xml sax,zipfile<5>,xmlrpc<2>,개선된 모듈<5>
@anchor{whatsnew/3 5 xml-sax}@anchor{1099}
@subsubsection xml.sax


SAX 구문 분석기는 이제 @ref{109a,,xmlreader.InputSource} 객체의 문자 스트림을 지원합니다. (Contributed by Serhiy Storchaka in bpo-2175@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2175}.)

@ref{109b,,parseString()}은 이제 @ref{169,,str} 인스턴스를 받아들입니다. (Contributed by Serhiy Storchaka in bpo-10590@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10590}.)

@node zipfile<5>,,xml sax,개선된 모듈<5>
@anchor{whatsnew/3 5 zipfile}@anchor{109c}
@subsubsection zipfile


이제 ZIP 출력을 위치 변경할 수 없는(unseekable) 스트림에 쓸 수 있습니다. (Contributed by Serhiy Storchaka in bpo-23252@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23252}.)

@ref{65b,,ZipFile.open()} 메서드의 `mode' 인자는 이제 배타적 생성을 요청하는 @code{"x"}를 받아들입니다. (Contributed by Serhiy Storchaka in bpo-21717@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21717}.)

@node 기타 모듈 수준 변경,최적화<5>,개선된 모듈<5>,파이썬 3 5의 새로운 기능
@anchor{whatsnew/3 5 other-module-level-changes}@anchor{109d}
@subsection 기타 모듈 수준 변경


@ref{94,,mmap}, @code{ossaudiodev}, @ref{d1,,socket}, @ref{d5,,ssl} 및 @ref{1c,,codecs} 모듈의 많은 함수는 이제 쓰기 가능한 @ref{193,,바이트열류 객체}를 받아들입니다. (Contributed by Serhiy Storchaka in bpo-23001@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23001}.)

@node 최적화<5>,빌드와 C API 변경<3>,기타 모듈 수준 변경,파이썬 3 5의 새로운 기능
@anchor{whatsnew/3 5 optimizations}@anchor{109e}
@subsection 최적화


@ref{6cf,,os.walk()} 함수는 POSIX 시스템에서 3 에서 5배, 윈도우에서 7 에서 20배 빨라졌습니다. 이는 하부 @code{readdir}이나 @code{FindFirstFile}/@code{FindNextFile} 시스템 호출에서 파일 정보를 노출하는 새로운 @ref{c53,,os.scandir()} 함수를 사용하여 수행되었습니다. (Contributed by Ben Hoyt with help from Victor Stinner in bpo-23605@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23605}.)

(0 바이트로 채워진) @code{bytes(int)}의 구성이 더 빠르고 큰 객체에 대해 더 적은 메모리를 사용합니다. @code{malloc()} 대신 @code{calloc()}을 사용하여 이러한 객체에 대한 메모리를 할당합니다. (Contributed by Victor Stinner in bpo-21233@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21233}.)

@ref{84,,ipaddress} @ref{50d,,IPv4Network}와 @ref{50e,,IPv6Network}에 대한 일부 연산(가령 @ref{109f,,subnets()}, @ref{10a0,,supernet()}, @ref{10a1,,summarize_address_range()}, @ref{10a2,,collapse_addresses()})이 크게 빨라졌습니다. 속도 향상 범위는 3 에서 15배입니다. (Contributed by Antoine Pitrou, Michel Albert, and Markus in bpo-21486@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21486}, bpo-21487@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21487}, bpo-20826@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20826}, bpo-23266@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23266}.)

@ref{84,,ipaddress} 객체의 피클링은 훨씬 더 작은 출력을 생성하도록 최적화되었습니다. (Contributed by Serhiy Storchaka in bpo-23133@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23133}.)

@ref{10a3,,io.BytesIO}에 대한 많은 연산이 이제 50%에서 100% 더 빨라졌습니다. (Contributed by Serhiy Storchaka in bpo-15381@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15381} and David Wilson in bpo-22003@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22003}.)

이제 @ref{10a4,,marshal.dumps()} 함수가 더 빨라졌습니다: 일반 데이터에서는 버전 3과 4에서 65–85%, 버전 0부터 2에서 20–25%, 최상의 경우 최대 5배입니다. (Contributed by Serhiy Storchaka in bpo-20416@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20416} and bpo-23344@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23344}.)

UTF-32 인코더는 이제 3 에서 7배 더 빨라졌습니다. (Contributed by Serhiy Storchaka in bpo-15027@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15027}.)

이제 정규식이 최대 10% 더 빠르게 구문 분석됩니다. (Contributed by Serhiy Storchaka in bpo-19380@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19380}.)

@ref{f40,,json.dumps()} 함수는 @code{ensure_ascii=False}로 실행될 때 @code{ensure_ascii=True}와 같이 빠르게 실행되도록 최적화되었습니다. (Contributed by Naoki Inada in bpo-23206@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23206}.)

@ref{10a5,,PyObject_IsInstance()}와 @ref{10a6,,PyObject_IsSubclass()} 함수는 두 번째 인자가 메타 클래스로 @ref{f43,,type}을 갖는 일반적인 경우에 가속화되었습니다. (Contributed Georg Brandl by in bpo-22540@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22540}.)

메서드 캐싱이 약간 개선되어, 일부 벤치마크에서 최대 5%의 성능 향상을 가져왔습니다. (Contributed by Antoine Pitrou in bpo-22847@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22847}.)

@ref{bd,,random} 모듈의 객체는 이제 64비트 빌드에서 50% 적은 메모리를 사용합니다. (Contributed by Serhiy Storchaka in bpo-23488@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23488}.)

@ref{4b3,,property()} 게터 호출은 최대 25% 더 빠릅니다. (Contributed by Joe Jevnik in bpo-23910@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23910}.)

@ref{213,,fractions.Fraction}의 인스턴스 화가 이제 최대 30% 빨라졌습니다. (Contributed by Stefan Behnel in bpo-22464@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22464}.)

문자열 메서드 @ref{10a7,,find()}, @ref{10a8,,rfind()}, @ref{10a9,,split()}, @ref{10aa,,partition()} 및 @ref{34b,,in} 문자열 연산자는 이제 1-문자 하위 문자열을 검색할 때 훨씬 더 빠릅니다. (Contributed by Serhiy Storchaka in bpo-23573@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23573}.)

@node 빌드와 C API 변경<3>,폐지<4>,최적화<5>,파이썬 3 5의 새로운 기능
@anchor{whatsnew/3 5 build-and-c-api-changes}@anchor{10ab}
@subsection 빌드와 C API 변경


새로운 @code{calloc} 함수가 추가되었습니다:


@itemize *

@item 
@ref{630,,PyMem_RawCalloc()},

@item 
@ref{10ac,,PyMem_Calloc()},

@item 
@ref{10ad,,PyObject_Calloc()}.
@end itemize

(Contributed by Victor Stinner in bpo-21233@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21233}.)

새로운 인코딩/디코딩 도우미 함수:


@itemize *

@item 
@ref{dbf,,Py_DecodeLocale()} (@code{_Py_char2wchar()}을 대체),

@item 
@ref{dc0,,Py_EncodeLocale()} (@code{_Py_wchar2char()}을 대체).
@end itemize

(Contributed by Victor Stinner in bpo-18395@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18395}.)

유니코드 인코딩 에러를 @code{\N@{...@}} 이스케이프로 대체하는 새로운 @ref{10ae,,PyCodec_NameReplaceErrors()} 함수. (Contributed by Serhiy Storchaka in bpo-19676@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19676}.)

@ref{10af,,PyErr_Format()}과 유사하지만 @code{va_list} 인자를 받아들이는 새로운 @ref{10b0,,PyErr_FormatV()} 함수. (Contributed by Antoine Pitrou in bpo-18711@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18711}.)

새로운 @ref{10b1,,PyExc_RecursionError} 예외. (Contributed by Georg Brandl in bpo-19235@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19235}.)

@geindex Python 향상 제안; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/} – 다단계 확장 모듈 초기화에 의해 도입된 새로운 @ref{10b2,,PyModule_FromDefAndSpec()}, @ref{10b3,,PyModule_FromDefAndSpec2()} 및 @ref{10b4,,PyModule_ExecDef()} 함수. (Contributed by Petr Viktorin in bpo-24268@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24268}.)

행렬 곱셈을 수행하는 새로운 @ref{10b5,,PyNumber_MatrixMultiply()}와 @ref{10b6,,PyNumber_InPlaceMatrixMultiply()} 함수. (Contributed by Benjamin Peterson in bpo-21176@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21176}. 자세한 내용은 
@geindex Python 향상 제안; PEP 465
PEP 465@footnote{https://peps.python.org/pep-0465/}를 참조하십시오.)

@ref{c9c,,PyTypeObject.tp_finalize} 슬롯은 이제 안정적인 ABI의 일부입니다.

이제 윈도우 빌드에는 Visual Studio 2015@footnote{https://visualstudio.microsoft.com/en/vs/older-downloads/#visual-studio-2015-and-other-products}의 일부로 제공되는 Microsoft Visual C++ 14.0이 필요합니다.

확장 모듈은 이제 일부 플랫폼에서 파일명에 플랫폼 정보 태그를 포함합니다 (태그는 선택 사항이며, CPython은 태그가 없더라도 확장을 임포트 하지만, 태그가 존재하고 일치하지 않으면 확장이 로드되지 않습니다):


@itemize *

@item 
리눅스에서, 확장 모듈 파일명은 @code{.cpython-<major><minor>m-<architecture>-<os>.pyd}로 끝납니다:


@itemize *

@item 
@code{<major>}는 파이썬 버전의 주 번호입니다; 파이썬 3.5의 경우 @code{3}입니다.

@item 
@code{<minor>}는 파이썬 버전의 부 번호입니다; 파이썬 3.5의 경우 @code{5}입니다.

@item 
@code{<architecture>}는 확장 모듈이 실행되도록 빌드된 하드웨어 아키텍처입니다. 가장 흔하게 32비트 Intel 플랫폼의 경우 @code{i386} 또는 64비트 Intel (및 AMD) 플랫폼의 경우 @code{x86_64}입니다.

@item 
@code{<os>}는 64비트 플랫폼에서 32비트 ABI와 통신하도록 빌드된 확장을 제외하고 항상 @code{linux-gnu}입니다. 이 경우 @code{linux-gnu32}(그리고 @code{<architecture>}는 @code{x86_64}가 됩니다)입니다.
@end itemize

@item 
윈도우에서, 확장 모듈 파일명은 @code{<debug>.cp<major><minor>-<platform>.pyd}로 끝납니다:


@itemize *

@item 
@code{<major>}는 파이썬 버전의 주 번호입니다; 파이썬 3.5의 경우 @code{3}입니다.

@item 
@code{<minor>}는 파이썬 버전의 부 번호입니다; 파이썬 3.5의 경우 @code{5}입니다.

@item 
@code{<platform>}은 확장 모듈이 빌드된 플랫폼으로, Win32 용 @code{win32}, Win64 용 @code{win_amd64}, 윈도우 Itanium 64 용 @code{win_ia64} 및 ARM 기반 윈도우 용 @code{win_arm}입니다.

@item 
디버그 모드로 빌드되면, @code{<debug>}는 @code{_d}가 되고 그렇지 않으면 공백이 됩니다.
@end itemize

@item 
OS X 플랫폼에서, 확장 모듈 파일명은 이제 @code{-darwin.so}로 끝납니다.

@item 
다른 모든 플랫폼에서, 확장 모듈 파일명은 파이썬 3.4에서와 같습니다.
@end itemize

@node 폐지<4>,제거<4>,빌드와 C API 변경<3>,파이썬 3 5의 새로운 기능
@anchor{whatsnew/3 5 deprecated}@anchor{10b7}
@subsection 폐지


@menu
* 새 키워드: 새 키워드<2>. 
* 폐지된 파이썬 동작: 폐지된 파이썬 동작<3>. 
* 지원되지 않는 운영 체제:: 
* 폐지된 파이썬 모듈@comma{} 함수 및 메서드: 폐지된 파이썬 모듈 함수 및 메서드<3>. 

@end menu

@node 새 키워드<2>,폐지된 파이썬 동작<3>,,폐지<4>
@anchor{whatsnew/3 5 new-keywords}@anchor{10b8}
@subsubsection 새 키워드


@code{async}와 @code{await}는 변수, 클래스, 함수 또는 모듈 이름으로 사용하지 않는 것이 좋습니다. 파이썬 3.5에서 
@geindex Python 향상 제안; PEP 492
PEP 492@footnote{https://peps.python.org/pep-0492/}에 의해 도입되었으며, 파이썬 3.7에서 정식 키워드가 될 것입니다.

@node 폐지된 파이썬 동작<3>,지원되지 않는 운영 체제,새 키워드<2>,폐지<4>
@anchor{whatsnew/3 5 deprecated-python-behavior}@anchor{10b9}
@subsubsection 폐지된 파이썬 동작


제너레이터 내에서 @ref{df4,,StopIteration} 예외를 발생시키면 이제 조용한 @ref{ac6,,PendingDeprecationWarning} 을 생성하며, 이는 파이썬 3.6에서 조용하지 않은 폐지 경고가 되고 파이썬 3.7에서 @ref{244,,RuntimeError}를 트리거할 것입니다. 자세한 내용은 @ref{f1a,,PEP 479; 제너레이터 내부에서의 StopIteration 처리 변경}을 참조하십시오.

@node 지원되지 않는 운영 체제,폐지된 파이썬 모듈 함수 및 메서드<3>,폐지된 파이썬 동작<3>,폐지<4>
@anchor{whatsnew/3 5 unsupported-operating-systems}@anchor{10ba}
@subsubsection 지원되지 않는 운영 체제


윈도우 XP는 더는 Microsoft에서 지원하지 않아서, 
@geindex Python 향상 제안; PEP 11
PEP 11@footnote{https://peps.python.org/pep-0011/}에 따라 CPython 3.5는 이 OS에서 더는 공식적으로 지원되지 않습니다.

@node 폐지된 파이썬 모듈 함수 및 메서드<3>,,지원되지 않는 운영 체제,폐지<4>
@anchor{whatsnew/3 5 deprecated-python-modules-functions-and-methods}@anchor{10bb}
@subsubsection 폐지된 파이썬 모듈, 함수 및 메서드


The @code{formatter} module has now graduated to full deprecation and is still
slated for removal in Python 3.6.

The @code{asyncio.async()} function is deprecated in favor of
@ref{e70,,ensure_future()}.

@code{smtpd} 모듈은 과거에 항상 @code{utf-8} 코덱을 사용하여 이메일 메시지의 DATA 부분을 디코딩했습니다. 이제 @code{SMTPServer}에 대한 새로운 `decode_data' 키워드로 제어 할 수 있습니다. 기본값은 @code{True}이지만, 이 기본값은 폐지되었습니다. 폐지 경고를 방지하려면 적절한 값으로 `decode_data' 키워드를 지정하십시오.

@ref{dfa,,http.cookies.Morsel} 객체의 @ref{dfb,,key}, @ref{dfc,,value} 및 @ref{dfd,,coded_value}에 값을 직접 대입하는 것은 폐지되었습니다. 대신 @ref{dfe,,set()} 메서드를 사용하십시오. 또한, @code{set()}의 문서화되지 않은 `LegalChars' 매개 변수는 폐지되었으며 이제 무시됩니다.

포맷 문자열을 키워드 인자 `format_string'으로 @ref{10bc,,string.Formatter} 클래스의 @ref{df9,,format()} 메서드에 전달하는 것은 폐지되었습니다. (Contributed by Serhiy Storchaka in bpo-23671@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23671}.)

The @code{platform.dist()} and @code{platform.linux_distribution()} functions
are now deprecated.  Linux distributions use too many different ways of
describing themselves, so the functionality is left to a package.
(Contributed by Vajrasky Kok and Berker Peksag in bpo-1322@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1322}.)

이전에 문서화되지 않은 @ref{4e3,,inspect.Signature}의 @code{from_function}과 @code{from_builtin} 메서드는 폐지되었습니다. 대신 새로운 @ref{941,,Signature.from_callable()} 메서드를 사용하십시오. (Contributed by Yury Selivanov in bpo-24248@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24248}.)

The @code{inspect.getargspec()} function is deprecated and scheduled to be
removed in Python 3.6.  (See bpo-20438@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20438} for details.)

The @ref{82,,inspect} @ref{940,,getfullargspec()},
@ref{10bd,,getcallargs()}, and @code{formatargspec()} functions are
deprecated in favor of the @ref{22f,,inspect.signature()} API. (Contributed by Yury
Selivanov in bpo-20438@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20438}.)

@ref{10be,,getargvalues()}와 @ref{10bf,,formatargvalues()} 함수는 파이썬 3.5.0 릴리스에서 실수로 폐지된 것으로 표시되었습니다.

str 패턴이나 @ref{83d,,re.ASCII}와 함께 @ref{d62,,re.LOCALE} 플래그를 사용하는 것은 이제 폐지되었습니다. (Contributed by Serhiy Storchaka in bpo-22407@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22407}.)

정규식 패턴과 치환 패턴에서 @code{'\'}와 ASCII 문자로 구성된 인식할 수 없는 특수 시퀀스를 사용하면 이제 폐지 경고가 발생하며 파이썬 3.6에서는 금지됩니다. (Contributed by Serhiy Storchaka in bpo-23622@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23622}.)

@ref{593,,unittest.TestLoader.loadTestsFromModule()} 메서드의 문서화되지 않고 비공식적인 `use_load_tests' 기본 인자는 이제 폐지되었으며 무시됩니다. (Contributed by Robert Collins and Barry A. Warsaw in bpo-16662@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16662}.)

@node 제거<4>,파이썬 3 5로 이식하기,폐지<4>,파이썬 3 5의 새로운 기능
@anchor{whatsnew/3 5 removed}@anchor{10c0}
@subsection 제거


@menu
* API 및 기능 제거: API 및 기능 제거<3>. 

@end menu

@node API 및 기능 제거<3>,,,제거<4>
@anchor{whatsnew/3 5 api-and-feature-removals}@anchor{10c1}
@subsubsection API 및 기능 제거


다음과 같은 더는 사용되지 않고 이전에 폐지된 API와 기능이 제거되었습니다:


@itemize *

@item 
@code{__version__} 어트리뷰트가 이메일 패키지에서 삭제되었습니다. 이메일 코드는 오랫동안 표준 라이브러리와 별도로 배포되지 않았으며 @code{__version__} 문자열은 지난 몇 번의 릴리스에서 갱신되지 않았습니다.

@item 
@ref{62,,ftplib} 모듈의 내부 @code{Netrc} 클래스는 3.4에서 폐지되었으며, 이제 제거되었습니다. (Contributed by Matt Chaput in bpo-6623@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6623}.)

@item 
@code{.pyo} 파일의 개념이 제거되었습니다.

@item 
잠정적 @ref{b,,asyncio} 모듈의 JoinableQueue 클래스는 3.4.4에서 폐지되었으며 이제 제거되었습니다. (Contributed by A. Jesse Jiryu Davis in bpo-23464@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23464}.)
@end itemize

@node 파이썬 3 5로 이식하기,파이썬 3 5 4의 주목할만한 변경 사항,제거<4>,파이썬 3 5의 새로운 기능
@anchor{whatsnew/3 5 porting-to-python-3-5}@anchor{10c2}
@subsection 파이썬 3.5로 이식하기


이 섹션은 코드 변경이 필요할 수 있는 이전에 설명한 변경 사항과 기타 버그 수정을 나열합니다.

@menu
* 파이썬 동작의 변경: 파이썬 동작의 변경<3>. 
* 파이썬 API의 변경: 파이썬 API의 변경<5>. 
* C API의 변경: C API의 변경<4>. 

@end menu

@node 파이썬 동작의 변경<3>,파이썬 API의 변경<5>,,파이썬 3 5로 이식하기
@anchor{whatsnew/3 5 changes-in-python-behavior}@anchor{10c3}
@subsubsection 파이썬 동작의 변경



@itemize *

@item 
부주의로 인해, 이전 파이썬 버전은 다음 문법을 잘못 수락했습니다:

@example
f(1 for x in [1], *args)
f(1 for x in [1], **kwargs)
@end example

함수에 대한 유일한 인자가 아닌 경우 제너레이터 표현식을 괄호로 묶어야 하므로, 파이썬 3.5는 이제 @ref{18e,,SyntaxError}를 올바르게 발생시킵니다.
@end itemize

@node 파이썬 API의 변경<5>,C API의 변경<4>,파이썬 동작의 변경<3>,파이썬 3 5로 이식하기
@anchor{whatsnew/3 5 changes-in-the-python-api}@anchor{10c4}
@subsubsection 파이썬 API의 변경



@itemize *

@item 
@geindex Python 향상 제안; PEP 475
PEP 475@footnote{https://peps.python.org/pep-0475/}: 시스템 호출은 시그널에 의해 중단될 때 파이썬 시그널 처리기가 예외를 발생시키지 않으면 이제 @ref{f87,,InterruptedError}를 발생시키는 대신 재시도됩니다.

@item 
파이썬 3.5 이전에는, @ref{1fb,,datetime.time} 객체가 UTC로 자정을 나타내면 거짓으로 간주했습니다. 이 동작은 모호하고 에러가 발생하기 쉬운 것으로 간주하여 파이썬 3.5에서 제거되었습니다. 자세한 내용은 bpo-13936@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13936}을 참조하십시오.

@item 
The @code{ssl.SSLSocket.send()} method now raises either
@ref{1068,,ssl.SSLWantReadError} or @ref{1069,,ssl.SSLWantWriteError}
on a non-blocking socket if the operation would block.  Previously,
it would return @code{0}.  (Contributed by Nikolaus Rath in bpo-20951@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20951}.)

@item 
제너레이터의 @code{__name__} 어트리뷰트는 이제 코드 이름에서 설정되는 대신 함수 이름에서 설정됩니다. 코드 이름을 꺼내려면 @code{gen.gi_code.co_name}을 사용하십시오. 제너레이터에는 이제 제너레이터의 표현(@code{repr(gen)})에 사용되는 정규화된 이름인 새로운 @code{__qualname__} 어트리뷰트도 있습니다. (Contributed by Victor Stinner in bpo-21205@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21205}.)

@item 
폐지된 “strict” 모드와 @ref{a77,,HTMLParser}의 인자, @code{HTMLParser.error()} 및 @code{HTMLParserError} 예외가 제거되었습니다. (Contributed by Ezio Melotti in bpo-15114@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15114}.) @code{HTMLParser}의 `convert_charrefs' 인자는 이제 기본적으로 @code{True}입니다. (Contributed by Berker Peksag in bpo-21047@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21047}.)

@item 
공식적으로 API의 일부는 아니지만, 이전에 “‘sometype’ does not support the buffer protocol” 형식이었던 에러 메시지는 이제 “a @ref{193,,bytes-like object} is required, not ‘sometype’” 형식임을 이식의 목적(즉: 테스트 수선)을 위해 유의할 필요가 있습니다. (Contributed by Ezio Melotti in bpo-16518@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16518}.)

@item 
현재 디렉터리가 더는 존재하지 않는 디렉터리로 설정되면 @ref{264,,FileNotFoundError} 가 더는 발생하지 않고 대신 @ref{10c5,,find_spec()}이 @ref{7f9,,sys.path_importer_cache}에서 @code{None}을 캐싱하지 `않고' @code{None}을 반환합니다. 이는 일반적일 때와 다릅니다 (bpo-22834@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22834}).

@item 
@ref{73,,http.client}와 @ref{76,,http.server}의 HTTP 상태 코드와 메시지는 공통 @ref{afc,,HTTPStatus} 열거형으로 리팩토링 되었습니다. @code{http.client}와 @code{http.server}의 값은 이전 버전과의 호환성을 위해 계속 사용할 수 있습니다. (Contributed by Demian Brecht in bpo-21793@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21793}.)

@item 
When an import loader defines @ref{a6a,,exec_module()}
it is now expected to also define
@ref{eab,,create_module()} (raises a
@ref{1a3,,DeprecationWarning} now, will be an error in Python 3.6). If the loader
inherits from @ref{10c6,,importlib.abc.Loader} then there is nothing to do, else
simply define @code{create_module()} to return
@code{None}.  (Contributed by Brett Cannon in bpo-23014@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23014}.)

@item 
@ref{5a1,,re.split()} 함수는 항상 빈 패턴 일치를 무시해서, @code{"x*"} 패턴은 @code{"x+"}와 같게 작동하고, @code{"\b"} 패턴은 절대 작동하지 않습니다. 이제 @code{re.split()}은 패턴이 빈 문자열과 일치 할 수 있으면 경고를 발생시킵니다. 호환성을 위해, 절대 빈 문자열과 일치하지 않는 패턴을 사용하십시오 (예를 들어 @code{"x*"} 대신 @code{"x+"}). 빈 문자열과만 일치 할 수 있는 패턴(가령 @code{"\b"})은 이제 에러를 발생시킵니다. (Contributed by Serhiy Storchaka in bpo-22818@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22818}.)

@item 
@ref{dfa,,http.cookies.Morsel} 딕셔너리류 인터페이스가 자체 일관성이 있도록 만들었습니다: 이제 Morsel 비교는 @ref{dfb,,key}와 @ref{dfc,,value}를 고려하고, @ref{10c7,,copy()}는 이제 @ref{183,,dict}가 아닌 @code{Morsel} 인스턴스를 생성하며, @ref{10c8,,update()}는 이제 업데이트 딕셔너리의 키 중 하나라도 잘못되면 예외를 발생시킵니다. 또한, @ref{dfe,,set()}의 문서화되지 않은 `LegalChars' 매개 변수는 폐지되었으며 이제 무시됩니다. (Contributed by Demian Brecht in bpo-2211@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2211}.)

@item 
@geindex Python 향상 제안; PEP 488
PEP 488@footnote{https://peps.python.org/pep-0488/}은 파이썬에서 @code{.pyo} 파일을 제거하고 @code{.pyc} 파일 이름에 선택적 @code{opt-} 태그를 도입했습니다. @ref{353,,importlib.util.cache_from_source()}는 @code{opt-} 태그를 제어하는 데 도움이 되는 `optimization' 매개 변수를 얻었습니다. 이로 인해, 함수의 `debug_override' 매개 변수는 이제 폐지되었습니다. 또한 @code{.pyo} 파일은 더는 파이썬 인터프리터에 대한 파일 인자로 지원되지 않아서 자체적으로 배포될 때 (즉, 소스 없는 코드 배포) 용도가 없습니다. 파이썬 3.5에서 바이트 코드의 매직 넘버가 변경되었기 때문에, 이전 버전의 파이썬에서 가져온 모든 이전 @code{.pyo} 파일은 이 PEP에 관계없이 유효하지 않습니다.

@item 
@ref{d1,,socket} 모듈은 이제 리눅스 3.6 이상에서 @ref{10c9,,CAN_RAW_FD_FRAMES} 상수를 내보냅니다.

@item 
@ref{106a,,ssl.cert_time_to_seconds()} 함수는 이제 입력 시간을 
@geindex RFC; RFC 5280
RFC 5280@footnote{https://datatracker.ietf.org/doc/html/rfc5280.html}에 따라 현지 시간이 아닌 UTC로 해석합니다. 또한, 반환 값은 항상 @ref{19b,,int}입니다. (Contributed by Akira Li in bpo-19940@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19940}.)

@item 
@code{pygettext.py} 도구는 이제 POT-Creation-Date 헤더의 시간대에 표준 +NNNN 형식을 사용합니다.

@item 
The @ref{cf,,smtplib} module now uses @ref{b33,,sys.stderr} instead of the previous
module-level @code{stderr} variable for debug output.  If your (test)
program depends on patching the module-level variable to capture the debug
output, you will need to update it to capture sys.stderr instead.

@item 
@ref{10ca,,str.startswith()}와 @ref{10cb,,str.endswith()} 메서드는 빈 문자열을 찾고 인덱스가 완전히 범위를 벗어났을 때 더는 @code{True}를 반환하지 않습니다. (Contributed by Serhiy Storchaka in bpo-24284@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24284}.)

@item 
@ref{bec,,inspect.getdoc()} 함수는 이제 베이스 클래스에서 상속된 설명서 문자열을 반환합니다. 상속된 설명서가 적절하면 설명서 문자열을 더는 복제할 필요가 없습니다. 상속된 문자열을 억제하려면, 빈 문자열을 지정해야 합니다 (또는 설명서를 채울 수 있습니다). 이 변경 사항은 @ref{ba,,pydoc} 모듈과 @ref{ad4,,help()} 함수의 출력에 영향을 줍니다. (Contributed by Serhiy Storchaka in bpo-15582@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15582}.)

@item 
중첩된 @ref{217,,functools.partial()} 호출은 이제 평활화됩니다. 이전 동작에 의존한다면, 이제 @code{functools.partial()} 객체에 어트리뷰트를 추가하거나 @code{functools.partial()}의 서브 클래스를 만들 수 있습니다. (Contributed by Alexander Belopolsky in bpo-7830@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7830}.)
@end itemize

@node C API의 변경<4>,,파이썬 API의 변경<5>,파이썬 3 5로 이식하기
@anchor{whatsnew/3 5 changes-in-the-c-api}@anchor{10cc}
@subsubsection C API의 변경



@itemize *

@item 
The undocumented @code{format} member of the
(non-public) @code{PyMemoryViewObject} structure has been removed.
All extensions relying on the relevant parts in @code{memoryobject.h}
must be rebuilt.

@item 
The @code{PyMemAllocator} structure was renamed to
@ref{10cd,,PyMemAllocatorEx} and a new @code{calloc} field was added.

@item 
참조를 누출한 문서화되지 않은 매크로 @code{PyObject_REPR()}을 제거했습니다. @ref{629,,PyUnicode_FromFormat()}과 유사한 함수에서 객체의 @ref{1c1,,repr()}을 포맷하려면 포맷 문자 @code{%R}을 사용하십시오. (Contributed by Serhiy Storchaka in bpo-22453@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22453}.)

@item 
@ref{615,,__module__} 어트리뷰트가 없으면 피클링과 인트로스펙션이 망가지므로, @code{__module__} 어트리뷰트가 없는 내장형에 대해 폐지 경고가 발생합니다. 이것은 향후 @ref{5ee,,AttributeError}가 될 것입니다. (Contributed by Serhiy Storchaka in bpo-20204@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20204}.)

@item 
@geindex Python 향상 제안; PEP 492
PEP 492@footnote{https://peps.python.org/pep-0492/} 구현의 일부로, @ref{c9b,,PyTypeObject}의 @code{tp_reserved} 슬롯이 @ref{10ce,,tp_as_async} 슬롯으로 대체되었습니다. 새로운 형, 구조체 및 함수는 @ref{10cf,,코루틴 객체}를 참조하십시오.
@end itemize

@node 파이썬 3 5 4의 주목할만한 변경 사항,,파이썬 3 5로 이식하기,파이썬 3 5의 새로운 기능
@anchor{whatsnew/3 5 notable-changes-in-python-3-5-4}@anchor{10d0}
@subsection 파이썬 3.5.4의 주목할만한 변경 사항


@menu
* 새로운 make regen-all 빌드 대상: 새로운 make regen-all 빌드 대상<2>. 
* make touch 빌드 대상 제거: make touch 빌드 대상 제거<2>. 

@end menu

@node 새로운 make regen-all 빌드 대상<2>,make touch 빌드 대상 제거<2>,,파이썬 3 5 4의 주목할만한 변경 사항
@anchor{whatsnew/3 5 new-make-regen-all-build-target}@anchor{10d1}
@subsubsection 새로운 @code{make regen-all} 빌드 대상


교차 컴파일을 단순화하고, 기존 버전의 파이썬이 이미 사용할 수 있어야 한다는 요구 사항 없이 CPython을 안정적으로 컴파일 할 수 있도록, autotools 기반 빌드 시스템은 더는 파일 수정 시간을 기반으로 생성된 파일을 묵시적으로 재컴파일하려고 시도하지 않습니다.

대신, 원할 때 이러한 파일을 강제로 재생성하기 위해 새로운 @code{make regen-all} 명령이 추가되었습니다 (예를 들어 사전 생성된 버전을 기반으로 파이썬의 초기 버전이 이미 빌드된 후).

보다 선택적 재생성 대상도 정의됩니다 - 자세한 내용은 Makefile.pre.in@footnote{https://github.com/python/cpython/tree/3.14/Makefile.pre.in}을 참조하십시오.

(Contributed by Victor Stinner in bpo-23404@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23404}.)


Added in version 3.5.4.


@node make touch 빌드 대상 제거<2>,,새로운 make regen-all 빌드 대상<2>,파이썬 3 5 4의 주목할만한 변경 사항
@anchor{whatsnew/3 5 removal-of-make-touch-build-target}@anchor{10d2}
@subsubsection @code{make touch} 빌드 대상 제거


수정 시간을 갱신하여 생성된 파일의 묵시적 재생성을 요청하는 데 이전에 사용된 @code{make touch} 빌드 대상이 제거되었습니다.

새로운 @code{make regen-all} 대상으로 대체되었습니다.

(Contributed by Victor Stinner in bpo-23404@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23404}.)


버전 3.5.4에서 변경.


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node What’s New In Python 3 4,What’s New In Python 3 3,파이썬 3 5의 새로운 기능,파이썬의 새로운 기능
@anchor{whatsnew/3 4 doc}@anchor{10d3}@anchor{whatsnew/3 4 translation-repo}@anchor{10d4}@anchor{whatsnew/3 4 what-s-new-in-python-3-4}@anchor{10d5}
@section What’s New In Python 3.4


@*Author: 
R. David Murray <@email{rdmurray@@bitdance.com}> (Editor)


@c Rules for maintenance:
@c 
@c * Anyone can add text to this document, but the maintainer reserves the
@c right to rewrite any additions. In particular, for obscure or esoteric
@c features, the maintainer may reduce any addition to a simple reference to
@c the new documentation rather than explaining the feature inline.
@c 
@c * While the maintainer will periodically go through Misc/NEWS
@c and add changes, it's best not to rely on this. We know from experience
@c that any changes that aren't in the What's New documentation around the
@c time of the original release will remain largely unknown to the community
@c for years, even if they're added later. We also know from experience that
@c other priorities can arise, and the maintainer will run out of time to do
@c updates -- in such cases, end users will be much better served by partial
@c notifications that at least give a hint about new features to
@c investigate.
@c 
@c * This is not a complete list of every single change; completeness
@c is the purpose of Misc/NEWS. The What's New should focus on changes that
@c are visible to Python *users* and that *require* a feature release (i.e.
@c most bug fixes should only be recorded in Misc/NEWS)
@c 
@c * PEPs should not be marked Final until they have an entry in What's New.
@c A placeholder entry that is just a section header and a link to the PEP
@c (e.g ":pep:`397` has been implemented") is acceptable. If a PEP has been
@c implemented and noted in What's New, don't forget to mark it as Final!
@c 
@c * If you want to draw your new text to the attention of the
@c maintainer, add 'XXX' to the beginning of the paragraph or
@c section.
@c 
@c * It's OK to add just a very brief note about a change.  For
@c example: "The :ref:`~socket.transmogrify()` function was added to the
@c :mod:`socket` module."  The maintainer will research the change and
@c write the necessary text (if appropriate). The advantage of doing this
@c is that even if no more descriptive text is ever added, readers will at
@c least have a notification that the new feature exists and a link to the
@c relevant documentation.
@c 
@c * You can comment out your additions if you like, but it's not
@c necessary (especially when a final release is some months away).
@c 
@c * Credit the author of a patch or bugfix.   Just the name is
@c sufficient; the e-mail address isn't necessary.
@c 
@c * It's helpful to add the bug/patch number as a comment:
@c 
@c The :ref:`~socket.transmogrify()` function was added to the
@c :mod:`socket` module.  (Contributed by P.Y. Developer in :issue:`12345`.)
@c 
@c This saves the maintainer the effort of going through the Mercurial log
@c when researching a change.
@c 
@c * Cross referencing tip: :ref:`mod.attr` will display as ``mod.attr``,
@c while :ref:`~mod.attr` will display as ``attr``.

This article explains the new features in Python 3.4, compared to 3.3.
Python 3.4 was released on March 16, 2014.  For full details, see the
changelog@footnote{https://docs.python.org/3.4/whatsnew/changelog.html}.


@subsubheading 더 보기


@geindex Python 향상 제안; PEP 429
PEP 429@footnote{https://peps.python.org/pep-0429/} – Python 3.4 Release Schedule


@menu
* Summary – Release Highlights:: 
* New Features: New Features<7>. 
* New Modules: New Modules<4>. 
* Improved Modules: Improved Modules<4>. 
* CPython Implementation Changes:: 
* Deprecated: Deprecated<8>. 
* Removed: Removed<8>. 
* Porting to Python 3.4: Porting to Python 3 4. 
* Changed in 3.4.3: Changed in 3 4 3. 

@end menu

@node Summary – Release Highlights,New Features<7>,,What’s New In Python 3 4
@anchor{whatsnew/3 4 summary-release-highlights}@anchor{10d6}
@subsection Summary – Release Highlights


@c This section singles out the most important changes in Python 3.4.
@c Brevity is key.

New syntax features:


@itemize *

@item 
No new syntax features were added in Python 3.4.
@end itemize

Other new features:


@itemize *

@item 
@ref{10d7,,pip should always be available} (
@geindex Python 향상 제안; PEP 453
PEP 453@footnote{https://peps.python.org/pep-0453/}).

@item 
@ref{10d8,,Newly created file descriptors are non-inheritable}
(
@geindex Python 향상 제안; PEP 446
PEP 446@footnote{https://peps.python.org/pep-0446/}).

@item 
command line option for @ref{10d9,,isolated mode}
(bpo-16499@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16499}).

@item 
@ref{10da,,improvements in the handling of codecs}
that are not text encodings (multiple issues).

@item 
@ref{10db,,A ModuleSpec Type} for the Import System
(
@geindex Python 향상 제안; PEP 451
PEP 451@footnote{https://peps.python.org/pep-0451/}).  (Affects importer authors.)

@item 
The @ref{91,,marshal} format has been made @ref{10dc,,more compact and efficient} (bpo-16475@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16475}).
@end itemize

New library modules:


@itemize *

@item 
@ref{b,,asyncio}: @ref{10dd,,New provisional API for asynchronous IO} (
@geindex Python 향상 제안; PEP 3156
PEP 3156@footnote{https://peps.python.org/pep-3156/}).

@item 
@ref{59,,ensurepip}: @ref{10de,,Bootstrapping the pip installer}
(
@geindex Python 향상 제안; PEP 453
PEP 453@footnote{https://peps.python.org/pep-0453/}).

@item 
@ref{5a,,enum}: @ref{10df,,Support for enumeration types}
(
@geindex Python 향상 제안; PEP 435
PEP 435@footnote{https://peps.python.org/pep-0435/}).

@item 
@ref{a8,,pathlib}: @ref{10e0,,Object-oriented filesystem paths}
(
@geindex Python 향상 제안; PEP 428
PEP 428@footnote{https://peps.python.org/pep-0428/}).

@item 
@ref{c7,,selectors}: @ref{10e1,,High-level and efficient I/O multiplexing}, built upon the @ref{c6,,select} module primitives (part
of 
@geindex Python 향상 제안; PEP 3156
PEP 3156@footnote{https://peps.python.org/pep-3156/}).

@item 
@ref{d7,,statistics}: A basic @ref{10e2,,numerically stable statistics library} (
@geindex Python 향상 제안; PEP 450
PEP 450@footnote{https://peps.python.org/pep-0450/}).

@item 
@ref{105,,tracemalloc}: @ref{10e3,,Trace Python memory allocations} (
@geindex Python 향상 제안; PEP 454
PEP 454@footnote{https://peps.python.org/pep-0454/}).
@end itemize

Significantly improved library modules:


@itemize *

@item 
@ref{10e4,,Single-dispatch generic functions} in
@ref{63,,functools} (
@geindex Python 향상 제안; PEP 443
PEP 443@footnote{https://peps.python.org/pep-0443/}).

@item 
New @ref{ab,,pickle} @ref{10e5,,protocol 4} (
@geindex Python 향상 제안; PEP 3154
PEP 3154@footnote{https://peps.python.org/pep-3154/}).

@item 
@ref{98,,multiprocessing} now has @ref{10e6,,an option to avoid using os.fork on Unix} (bpo-8713@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8713}).

@item 
@ref{3f,,email} has a new submodule, @ref{41,,contentmanager}, and
a new @ref{580,,Message} subclass
(@ref{57f,,EmailMessage}) that @ref{10e7,,simplify MIME handling} (bpo-18891@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18891}).

@item 
The @ref{82,,inspect} and @ref{ba,,pydoc} modules are now capable of
correct introspection of a much wider variety of callable objects,
which improves the output of the Python @ref{ad4,,help()} system.

@item 
The @ref{84,,ipaddress} module API has been declared stable
@end itemize

Security improvements:


@itemize *

@item 
@ref{10e8,,Secure and interchangeable hash algorithm}
(
@geindex Python 향상 제안; PEP 456
PEP 456@footnote{https://peps.python.org/pep-0456/}).

@item 
@ref{10d8,,Make newly created file descriptors non-inheritable}
(
@geindex Python 향상 제안; PEP 446
PEP 446@footnote{https://peps.python.org/pep-0446/}) to avoid leaking file descriptors to child processes.

@item 
New command line option for @ref{10d9,,isolated mode},
(bpo-16499@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16499}).

@item 
@ref{98,,multiprocessing} now has @ref{10e6,,an option to avoid using os.fork on Unix}.  `spawn' and `forkserver' are
more secure because they avoid sharing data with child processes.

@item 
@ref{98,,multiprocessing} child processes on Windows no longer inherit
all of the parent’s inheritable handles, only the necessary ones.

@item 
A new @ref{732,,hashlib.pbkdf2_hmac()} function provides
the PKCS#5 password-based key derivation function 2@footnote{https://en.wikipedia.org/wiki/PBKDF2}.

@item 
@ref{10e9,,TLSv1.1 and TLSv1.2 support} for @ref{d5,,ssl}.

@item 
@ref{10ea,,Retrieving certificates from the Windows system cert store support} for @ref{d5,,ssl}.

@item 
@ref{10eb,,Server-side SNI (Server Name Indication) support} for @ref{d5,,ssl}.

@item 
The @ref{357,,ssl.SSLContext} class has a @ref{10ec,,lot of improvements}.

@item 
All modules in the standard library that support SSL now support server
certificate verification, including hostname matching
(@code{ssl.match_hostname()}) and CRLs (Certificate Revocation lists, see
@ref{10ed,,ssl.SSLContext.load_verify_locations()}).
@end itemize

CPython implementation improvements:


@itemize *

@item 
@ref{10ee,,Safe object finalization} (
@geindex Python 향상 제안; PEP 442
PEP 442@footnote{https://peps.python.org/pep-0442/}).

@item 
Leveraging 
@geindex Python 향상 제안; PEP 442
PEP 442@footnote{https://peps.python.org/pep-0442/}, in most cases @ref{10ee,,module globals are no longer set to None during finalization} (bpo-18214@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18214}).

@item 
@ref{10ef,,Configurable memory allocators} (
@geindex Python 향상 제안; PEP 445
PEP 445@footnote{https://peps.python.org/pep-0445/}).

@item 
@ref{10f0,,Argument Clinic} (
@geindex Python 향상 제안; PEP 436
PEP 436@footnote{https://peps.python.org/pep-0436/}).
@end itemize

Please read on for a comprehensive list of user-facing changes, including many
other smaller improvements, CPython optimizations, deprecations, and potential
porting issues.

@node New Features<7>,New Modules<4>,Summary – Release Highlights,What’s New In Python 3 4
@anchor{whatsnew/3 4 new-features}@anchor{10f1}
@subsection New Features


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

@end menu

@node PEP 453 Explicit Bootstrapping of PIP in Python Installations,PEP 446 Newly Created File Descriptors Are Non-Inheritable,,New Features<7>
@anchor{whatsnew/3 4 pep-453-explicit-bootstrapping-of-pip-in-python-installations}@anchor{10f2}@anchor{whatsnew/3 4 whatsnew-pep-453}@anchor{10d7}
@subsubsection PEP 453: Explicit Bootstrapping of PIP in Python Installations


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

@end menu

@node Bootstrapping pip By Default,Documentation Changes,,PEP 453 Explicit Bootstrapping of PIP in Python Installations
@anchor{whatsnew/3 4 bootstrapping-pip-by-default}@anchor{10f3}
@subsubsection Bootstrapping pip By Default


The new @ref{59,,ensurepip} module (defined in 
@geindex Python 향상 제안; PEP 453
PEP 453@footnote{https://peps.python.org/pep-0453/}) provides a standard
cross-platform mechanism to bootstrap the pip installer into Python
installations and virtual environments. The version of @code{pip} included
with Python 3.4.0 is @code{pip} 1.5.4, and future 3.4.x maintenance releases
will update the bundled version to the latest version of @code{pip} that is
available at the time of creating the release candidate.

By default, the commands @code{pipX} and @code{pipX.Y} will be installed on all
platforms (where X.Y stands for the version of the Python installation),
along with the @code{pip} Python package and its dependencies. On Windows and
in virtual environments on all platforms, the unversioned @code{pip} command
will also be installed. On other platforms, the system wide unversioned
@code{pip} command typically refers to the separately installed Python 2
version.

The @code{pyvenv} command line utility and the @ref{117,,venv}
module make use of the @ref{59,,ensurepip} module to make @code{pip} readily
available in virtual environments. When using the command line utility,
@code{pip} is installed by default, while when using the @code{venv} module
@ref{10f4,,API} installation of @code{pip} must be requested explicitly.

For CPython @ref{10f5,,source builds on POSIX systems},
the @code{make install} and @code{make altinstall} commands bootstrap @code{pip} by
default.  This behaviour can be controlled through configure options, and
overridden through Makefile options.

On Windows and Mac OS X, the CPython installers now default to installing
@code{pip} along with CPython itself (users may opt out of installing it
during the installation process). Window users will need to opt in to the
automatic @code{PATH} modifications to have @code{pip} available from the command
line by default, otherwise it can still be accessed through the Python
launcher for Windows as @code{py -m pip}.

As 
@geindex Python 향상 제안; PEP 0453#recommendations-for-downstream-distributors
discussed in the PEP@footnote{https://peps.python.org/pep-0453/#recommendations-for-downstream-distributors}
platform packagers may choose not to install
these commands by default, as long as, when invoked, they provide clear and
simple directions on how to install them on that platform (usually using
the system package manager).

@cartouche
@quotation 참고 
To avoid conflicts between parallel Python 2 and Python 3 installations,
only the versioned @code{pip3} and @code{pip3.4} commands are bootstrapped by
default when @code{ensurepip} is invoked directly - the @code{--default-pip}
option is needed to also request the unversioned @code{pip} command.
@code{pyvenv} and the Windows installer ensure that the unqualified @code{pip}
command is made available in those environments, and @code{pip} can always be
invoked via the @code{-m} switch rather than directly to avoid ambiguity on
systems with multiple Python installations.
@end quotation
@end cartouche

@node Documentation Changes,,Bootstrapping pip By Default,PEP 453 Explicit Bootstrapping of PIP in Python Installations
@anchor{whatsnew/3 4 documentation-changes}@anchor{10f6}
@subsubsection Documentation Changes


As part of this change, the @ref{10f7,,파이썬 모듈 설치하기} and
distributing-index sections of the documentation have been
completely redesigned as short getting started and FAQ documents. Most
packaging documentation has now been moved out to the Python Packaging
Authority maintained Python Packaging User Guide@footnote{https://packaging.python.org} and the documentation of the individual
projects.

However, as this migration is currently still incomplete, the legacy
versions of those guides remaining available as @ref{10f8,,setuptools로 C와 C++ 확장 빌드하기}
and @ref{10f9,,setuptools로 C와 C++ 확장 빌드하기}.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 453

@item PEP 453@footnote{https://peps.python.org/pep-0453/} – Explicit bootstrapping of pip in Python installations

PEP written by Donald Stufft and Nick Coghlan, implemented by
Donald Stufft, Nick Coghlan, Martin von Löwis and Ned Deily.
@end table


@node PEP 446 Newly Created File Descriptors Are Non-Inheritable,Improvements to Codec Handling,PEP 453 Explicit Bootstrapping of PIP in Python Installations,New Features<7>
@anchor{whatsnew/3 4 pep-446-newly-created-file-descriptors-are-non-inheritable}@anchor{10fa}@anchor{whatsnew/3 4 whatsnew-pep-446}@anchor{10d8}
@subsubsection PEP 446: Newly Created File Descriptors Are Non-Inheritable


@geindex Python 향상 제안; PEP 446
PEP 446@footnote{https://peps.python.org/pep-0446/} makes newly created file descriptors @ref{10fb,,non-inheritable}.  In general, this is the behavior an application will
want: when launching a new process, having currently open files also
open in the new process can lead to all sorts of hard to find bugs,
and potentially to security issues.

However, there are occasions when inheritance is desired.  To support
these cases, the following new functions and methods are available:


@itemize *

@item 
@ref{10fc,,os.get_inheritable()}, @ref{10fd,,os.set_inheritable()}

@item 
@ref{10fe,,os.get_handle_inheritable()}, @ref{10ff,,os.set_handle_inheritable()}

@item 
@ref{1100,,socket.socket.get_inheritable()}, @ref{1101,,socket.socket.set_inheritable()}
@end itemize


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 446

@item PEP 446@footnote{https://peps.python.org/pep-0446/} – Make newly created file descriptors non-inheritable

PEP written and implemented by Victor Stinner.
@end table


@node Improvements to Codec Handling,PEP 451 A ModuleSpec Type for the Import System,PEP 446 Newly Created File Descriptors Are Non-Inheritable,New Features<7>
@anchor{whatsnew/3 4 codec-handling-improvements}@anchor{10da}@anchor{whatsnew/3 4 improvements-to-codec-handling}@anchor{1102}
@subsubsection Improvements to Codec Handling


Since it was first introduced, the @ref{1c,,codecs} module has always been
intended to operate as a type-neutral dynamic encoding and decoding
system. However, its close coupling with the Python text model, especially
the type restricted convenience methods on the builtin @ref{169,,str},
@ref{192,,bytes} and @ref{344,,bytearray} types, has historically obscured that
fact.

As a key step in clarifying the situation, the @ref{1103,,codecs.encode()} and
@ref{1104,,codecs.decode()} convenience functions are now properly documented in
Python 2.7, 3.3 and 3.4. These functions have existed in the @ref{1c,,codecs}
module (and have been covered by the regression test suite) since Python 2.4,
but were previously only discoverable through runtime introspection.

Unlike the convenience methods on @ref{169,,str}, @ref{192,,bytes} and
@ref{344,,bytearray}, the @ref{1c,,codecs} convenience functions support arbitrary
codecs in both Python 2 and Python 3, rather than being limited to Unicode text
encodings (in Python 3) or @code{basestring} <-> @code{basestring} conversions (in
Python 2).

In Python 3.4, the interpreter is able to identify the known non-text
encodings provided in the standard library and direct users towards these
general purpose convenience functions when appropriate:

@example
>>> b"abcdef".decode("hex")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
LookupError: 'hex' is not a text encoding; use codecs.decode() to handle arbitrary codecs

>>> "hello".encode("rot13")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
LookupError: 'rot13' is not a text encoding; use codecs.encode() to handle arbitrary codecs

>>> open("foo.txt", encoding="hex")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
LookupError: 'hex' is not a text encoding; use codecs.open() to handle arbitrary codecs
@end example

In a related change, whenever it is feasible without breaking backwards
compatibility, exceptions raised during encoding and decoding operations
are wrapped in a chained exception of the same type that mentions the
name of the codec responsible for producing the error:

@example
>>> import codecs

>>> codecs.decode(b"abcdefgh", "hex")
Traceback (most recent call last):
  File "/usr/lib/python3.4/encodings/hex_codec.py", line 20, in hex_decode
    return (binascii.a2b_hex(input), len(input))
binascii.Error: Non-hexadecimal digit found

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
binascii.Error: decoding with 'hex' codec failed (Error: Non-hexadecimal digit found)

>>> codecs.encode("hello", "bz2")
Traceback (most recent call last):
  File "/usr/lib/python3.4/encodings/bz2_codec.py", line 17, in bz2_encode
    return (bz2.compress(input), len(input))
  File "/usr/lib/python3.4/bz2.py", line 498, in compress
    return comp.compress(data) + comp.flush()
TypeError: 'str' does not support the buffer interface

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: encoding with 'bz2' codec failed (TypeError: 'str' does not support the buffer interface)
@end example

Finally, as the examples above show, these improvements have permitted
the restoration of the convenience aliases for the non-Unicode codecs that
were themselves restored in Python 3.2. This means that encoding binary data
to and from its hexadecimal representation (for example) can now be written
as:

@example
>>> from codecs import encode, decode
>>> encode(b"hello", "hex")
b'68656c6c6f'
>>> decode(b"68656c6c6f", "hex")
b'hello'
@end example

The binary and text transforms provided in the standard library are detailed
in @ref{1105,,바이너리 변환} and @ref{1106,,텍스트 변환}.

(Contributed by Nick Coghlan in bpo-7475@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7475}, bpo-17827@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17827},
bpo-17828@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17828} and bpo-19619@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19619}.)

@node PEP 451 A ModuleSpec Type for the Import System,Other Language Changes<4>,Improvements to Codec Handling,New Features<7>
@anchor{whatsnew/3 4 pep-451-a-modulespec-type-for-the-import-system}@anchor{1107}@anchor{whatsnew/3 4 whatsnew-pep-451}@anchor{10db}
@subsubsection PEP 451: A ModuleSpec Type for the Import System


@geindex Python 향상 제안; PEP 451
PEP 451@footnote{https://peps.python.org/pep-0451/} provides an encapsulation of the information about a module that the
import machinery will use to load it (that is, a module specification).  This
helps simplify both the import implementation and several import-related APIs.
The change is also a stepping stone for several future import-related improvements@footnote{https://mail.python.org/pipermail/python-dev/2013-November/130111.html}.

The public-facing changes from the PEP are entirely backward-compatible.
Furthermore, they should be transparent to everyone but importer authors.  Key
finder and loader methods have been deprecated, but they will continue working.
New importers should use the new methods described in the PEP.  Existing
importers should be updated to implement the new methods.  See the
@ref{1108,,Deprecated} section for a list of methods that should be replaced and
their replacements.

@node Other Language Changes<4>,,PEP 451 A ModuleSpec Type for the Import System,New Features<7>
@anchor{whatsnew/3 4 other-language-changes}@anchor{1109}
@subsubsection Other Language Changes


Some smaller changes made to the core Python language are:


@itemize *

@item 
Unicode database updated to UCD version 6.3.

@item 
@ref{110a,,min()} and @ref{110b,,max()} now accept a `default' keyword-only argument that
can be used to specify the value they return if the iterable they are
evaluating has no elements.  (Contributed by Julian Berman in
bpo-18111@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18111}.)

@item 
Module objects are now @ref{110c,,weakly referenceable}.

@item 
Module @code{__file__} attributes (and related values) should now always
contain absolute paths by default, with the sole exception of
@code{__main__.__file__} when a script has been executed directly using
a relative path.  (Contributed by Brett Cannon in bpo-18416@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18416}.)

@item 
All the UTF-* codecs (except UTF-7) now reject surrogates during both
encoding and decoding unless the @code{surrogatepass} error handler is used,
with the exception of the UTF-16 decoder (which accepts valid surrogate pairs)
and the UTF-16 encoder (which produces them while encoding non-BMP characters).
(Contributed by Victor Stinner, Kang-Hao (Kenny) Lu and Serhiy Storchaka in
bpo-12892@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12892}.)

@item 
New German EBCDIC @ref{fb7,,codec} @code{cp273}.  (Contributed
by Michael Bierenfeld and Andrew Kuchling in bpo-1097797@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1097797}.)

@item 
New Ukrainian @ref{fb7,,codec} @code{cp1125}.  (Contributed by
Serhiy Storchaka in bpo-19668@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19668}.)

@item 
@ref{192,,bytes}.join() and @ref{344,,bytearray}.join() now accept arbitrary
buffer objects as arguments.  (Contributed by Antoine Pitrou in
bpo-15958@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15958}.)

@item 
The @ref{19b,,int} constructor now accepts any object that has an @code{__index__}
method for its `base' argument.  (Contributed by Mark Dickinson in
bpo-16772@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16772}.)

@item 
Frame objects now have a @ref{584,,clear()} method that clears all
references to local variables from the frame.  (Contributed by Antoine Pitrou
in bpo-17934@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17934}.)

@item 
@ref{165,,memoryview} is now registered as a @ref{1f,,Sequence},
and supports the @ref{a65,,reversed()} builtin.  (Contributed by Nick Coghlan
and Claudiu Popa in bpo-18690@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18690} and bpo-19078@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19078}.)

@item 
Signatures reported by @ref{ad4,,help()} have been modified and improved in
several cases as a result of the introduction of Argument Clinic and other
changes to the @ref{82,,inspect} and @ref{ba,,pydoc} modules.

@item 
@ref{110d,,__length_hint__()} is now part of the formal language
specification (see 
@geindex Python 향상 제안; PEP 424
PEP 424@footnote{https://peps.python.org/pep-0424/}).  (Contributed by Armin Ronacher in
bpo-16148@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16148}.)
@end itemize

@node New Modules<4>,Improved Modules<4>,New Features<7>,What’s New In Python 3 4
@anchor{whatsnew/3 4 new-modules}@anchor{110e}
@subsection New Modules


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

@end menu

@node asyncio<14>,ensurepip<2>,,New Modules<4>
@anchor{whatsnew/3 4 asyncio}@anchor{110f}@anchor{whatsnew/3 4 whatsnew-asyncio}@anchor{10dd}
@subsubsection asyncio


The new @ref{b,,asyncio} module (defined in 
@geindex Python 향상 제안; PEP 3156
PEP 3156@footnote{https://peps.python.org/pep-3156/}) provides a standard
pluggable event loop model for Python, providing solid asynchronous IO
support in the standard library, and making it easier for other event loop
implementations to interoperate with the standard library and each other.

For Python 3.4, this module is considered a @ref{3d1,,provisional API}.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 3156

@item PEP 3156@footnote{https://peps.python.org/pep-3156/} – Asynchronous IO Support Rebooted: the “asyncio” Module

PEP written and implementation led by Guido van Rossum.
@end table


@node ensurepip<2>,enum<9>,asyncio<14>,New Modules<4>
@anchor{whatsnew/3 4 ensurepip}@anchor{1110}@anchor{whatsnew/3 4 whatsnew-ensurepip}@anchor{10de}
@subsubsection ensurepip


The new @ref{59,,ensurepip} module is the primary infrastructure for the
@geindex Python 향상 제안; PEP 453
PEP 453@footnote{https://peps.python.org/pep-0453/} implementation.  In the normal course of events end users will not
need to interact with this module, but it can be used to manually bootstrap
@code{pip} if the automated bootstrapping into an installation or virtual
environment was declined.

@ref{59,,ensurepip} includes a bundled copy of @code{pip}, up-to-date as of the first
release candidate of the release of CPython with which it ships (this applies
to both maintenance releases and feature releases).  @code{ensurepip} does not
access the internet.  If the installation has internet access, after
@code{ensurepip} is run the bundled @code{pip} can be used to upgrade @code{pip} to a
more recent release than the bundled one.  (Note that such an upgraded version
of @code{pip} is considered to be a separately installed package and will not be
removed if Python is uninstalled.)

The module is named `ensure'pip because if called when @code{pip} is already
installed, it does nothing.  It also has an @code{--upgrade} option that will
cause it to install the bundled copy of @code{pip} if the existing installed
version of @code{pip} is older than the bundled copy.

@node enum<9>,pathlib<14>,ensurepip<2>,New Modules<4>
@anchor{whatsnew/3 4 enum}@anchor{1111}@anchor{whatsnew/3 4 whatsnew-enum}@anchor{10df}
@subsubsection enum


The new @ref{5a,,enum} module (defined in 
@geindex Python 향상 제안; PEP 435
PEP 435@footnote{https://peps.python.org/pep-0435/}) provides a standard
implementation of enumeration types, allowing other modules (such as
@ref{d1,,socket}) to provide more informative error messages and better
debugging support by replacing opaque integer constants with backwards
compatible enumeration values.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 435

@item PEP 435@footnote{https://peps.python.org/pep-0435/} – Adding an Enum type to the Python standard library

PEP written by Barry Warsaw, Eli Bendersky and Ethan Furman,
implemented by Ethan Furman.
@end table


@node pathlib<14>,selectors<2>,enum<9>,New Modules<4>
@anchor{whatsnew/3 4 pathlib}@anchor{1112}@anchor{whatsnew/3 4 whatsnew-pathlib}@anchor{10e0}
@subsubsection pathlib


The new @ref{a8,,pathlib} module offers classes representing filesystem paths
with semantics appropriate for different operating systems.  Path classes are
divided between `pure paths', which provide purely computational operations
without I/O, and `concrete paths', which inherit from pure paths but also
provide I/O operations.

For Python 3.4, this module is considered a @ref{3d1,,provisional API}.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 428

@item PEP 428@footnote{https://peps.python.org/pep-0428/} – The pathlib module – object-oriented filesystem paths

PEP written and implemented by Antoine Pitrou.
@end table


@node selectors<2>,statistics<6>,pathlib<14>,New Modules<4>
@anchor{whatsnew/3 4 selectors}@anchor{1113}@anchor{whatsnew/3 4 whatsnew-selectors}@anchor{10e1}
@subsubsection selectors


The new @ref{c7,,selectors} module (created as part of implementing 
@geindex Python 향상 제안; PEP 3156
PEP 3156@footnote{https://peps.python.org/pep-3156/})
allows high-level and efficient I/O multiplexing, built upon the
@ref{c6,,select} module primitives.

@node statistics<6>,tracemalloc<4>,selectors<2>,New Modules<4>
@anchor{whatsnew/3 4 statistics}@anchor{1114}@anchor{whatsnew/3 4 whatsnew-statistics}@anchor{10e2}
@subsubsection statistics


The new @ref{d7,,statistics} module (defined in 
@geindex Python 향상 제안; PEP 450
PEP 450@footnote{https://peps.python.org/pep-0450/}) offers some core
statistics functionality directly in the standard library. This module
supports calculation of the mean, median, mode, variance and standard
deviation of a data series.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 450

@item PEP 450@footnote{https://peps.python.org/pep-0450/} – Adding A Statistics Module To The Standard Library

PEP written and implemented by Steven D’Aprano
@end table


@node tracemalloc<4>,,statistics<6>,New Modules<4>
@anchor{whatsnew/3 4 tracemalloc}@anchor{1115}@anchor{whatsnew/3 4 whatsnew-tracemalloc}@anchor{10e3}
@subsubsection tracemalloc


The new @ref{105,,tracemalloc} module (defined in 
@geindex Python 향상 제안; PEP 454
PEP 454@footnote{https://peps.python.org/pep-0454/}) is a debug tool to
trace memory blocks allocated by Python. It provides the following information:


@itemize *

@item 
Trace where an object was allocated

@item 
Statistics on allocated memory blocks per filename and per line number:
total size, number and average size of allocated memory blocks

@item 
Compute the differences between two snapshots to detect memory leaks
@end itemize


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 454

@item PEP 454@footnote{https://peps.python.org/pep-0454/} – Add a new tracemalloc module to trace Python memory allocations

PEP written and implemented by Victor Stinner
@end table


@node Improved Modules<4>,CPython Implementation Changes,New Modules<4>,What’s New In Python 3 4
@anchor{whatsnew/3 4 improved-modules}@anchor{1116}
@subsection Improved Modules


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

@end menu

@node abc,aifc<2>,,Improved Modules<4>
@anchor{whatsnew/3 4 abc}@anchor{1117}
@subsubsection abc


New function @ref{1118,,abc.get_cache_token()} can be used to know when to invalidate
caches that are affected by changes in the object graph.  (Contributed
by Łukasz Langa in bpo-16832@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16832}.)

New class @ref{1119,,ABC} has @ref{111a,,ABCMeta} as its meta class.
Using @code{ABC} as a base class has essentially the same effect as specifying
@code{metaclass=abc.ABCMeta}, but is simpler to type and easier to read.
(Contributed by Bruno Dupuis in bpo-16049@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16049}.)

@node aifc<2>,argparse<7>,abc,Improved Modules<4>
@anchor{whatsnew/3 4 aifc}@anchor{111b}
@subsubsection aifc


The @code{getparams()} method now returns a namedtuple rather than a
plain tuple.  (Contributed by Claudiu Popa in bpo-17818@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17818}.)

@code{aifc.open()} now supports the context management protocol: when used in a
@ref{186,,with} block, the @code{close()} method of the returned
object will be called automatically at the end of the block.  (Contributed by
Serhiy Storchacha in bpo-16486@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16486}.)

The @code{writeframesraw()} and @code{writeframes()}
methods now accept any @ref{193,,bytes-like object}.  (Contributed by Serhiy
Storchaka in bpo-8311@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8311}.)

@node argparse<7>,audioop,aifc<2>,Improved Modules<4>
@anchor{whatsnew/3 4 argparse}@anchor{111c}
@subsubsection argparse


The @ref{30c,,FileType} class now accepts `encoding' and
`errors' arguments, which are passed through to @ref{316,,open()}.  (Contributed
by Lucas Maystre in bpo-11175@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11175}.)

@node audioop,base64<4>,argparse<7>,Improved Modules<4>
@anchor{whatsnew/3 4 audioop}@anchor{111d}
@subsubsection audioop


@code{audioop} now supports 24-bit samples.  (Contributed by Serhiy Storchaka
in bpo-12866@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12866}.)

New @code{byteswap()} function converts big-endian samples to
little-endian and vice versa.  (Contributed by Serhiy Storchaka in
bpo-19641@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19641}.)

All @code{audioop} functions now accept any @ref{193,,bytes-like object}.  Strings
are not accepted: they didn’t work before, now they raise an error right away.
(Contributed by Serhiy Storchaka in bpo-16685@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16685}.)

@node base64<4>,collections<6>,audioop,Improved Modules<4>
@anchor{whatsnew/3 4 base64}@anchor{111e}
@subsubsection base64


The encoding and decoding functions in @ref{f,,base64} now accept any
@ref{193,,bytes-like object} in cases where it previously required a
@ref{192,,bytes} or @ref{344,,bytearray} instance.  (Contributed by Nick Coghlan in
bpo-17839@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17839}.)

New functions @ref{111f,,a85encode()}, @ref{1120,,a85decode()},
@ref{1121,,b85encode()}, and @ref{1122,,b85decode()} provide the ability to
encode and decode binary data from and to @code{Ascii85} and the git/mercurial
@code{Base85} formats, respectively.  The @code{a85} functions have options that can
be used to make them compatible with the variants of the @code{Ascii85} encoding,
including the Adobe variant.  (Contributed by Martin Morrison, the Mercurial
project, Serhiy Storchaka, and Antoine Pitrou in bpo-17618@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17618}.)

@node collections<6>,colorsys,base64<4>,Improved Modules<4>
@anchor{whatsnew/3 4 collections}@anchor{1123}
@subsubsection collections


The @ref{1124,,ChainMap.new_child()} method now accepts an `m' argument specifying
the child map to add to the chain.  This allows an existing mapping and/or a
custom mapping type to be used for the child.  (Contributed by Vinay Sajip in
bpo-16613@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16613}.)

@node colorsys,contextlib<6>,collections<6>,Improved Modules<4>
@anchor{whatsnew/3 4 colorsys}@anchor{1125}
@subsubsection colorsys


The number of digits in the coefficients for the RGB — YIQ conversions have
been expanded so that they match the FCC NTSC versions.  The change in
results should be less than 1% and may better match results found elsewhere.
(Contributed by Brian Landers and Serhiy Storchaka in bpo-14323@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14323}.)

@node contextlib<6>,dbm<6>,colorsys,Improved Modules<4>
@anchor{whatsnew/3 4 contextlib}@anchor{1126}
@subsubsection contextlib


The new @ref{1127,,contextlib.suppress} context manager helps to clarify the
intent of code that deliberately suppresses exceptions from a single
statement.  (Contributed by Raymond Hettinger in bpo-15806@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15806} and
Zero Piraeus in bpo-19266@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19266}.)

The new @ref{fe6,,contextlib.redirect_stdout()} context manager makes it easier
for utility scripts to handle inflexible APIs that write their output to
@ref{ccc,,sys.stdout} and don’t provide any options to redirect it.  Using the
context manager, the @code{sys.stdout} output can be redirected to any
other stream or, in conjunction with @ref{1128,,io.StringIO}, to a string.
The latter can be especially useful, for example, to capture output
from a function that was written to implement a command line interface.
It is recommended only for utility scripts because it affects the
global state of @code{sys.stdout}.  (Contributed by Raymond Hettinger
in bpo-15805@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15805}.)

The @ref{27,,contextlib} documentation has also been updated to include a
@ref{1129,,discussion} of the
differences between single use, reusable and reentrant context managers.

@node dbm<6>,dis<5>,contextlib<6>,Improved Modules<4>
@anchor{whatsnew/3 4 dbm}@anchor{112a}
@subsubsection dbm


@ref{112b,,dbm.open()} objects now support the context management protocol.  When
used in a @ref{186,,with} statement, the @code{close} method of the database
object will be called automatically at the end of the block.  (Contributed by
Claudiu Popa and Nick Coghlan in bpo-19282@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19282}.)

@node dis<5>,doctest<4>,dbm<6>,Improved Modules<4>
@anchor{whatsnew/3 4 dis}@anchor{112c}
@subsubsection dis


Functions @ref{112d,,show_code()}, @ref{205,,dis()}, @ref{206,,distb()}, and
@ref{207,,disassemble()} now accept a keyword-only `file' argument that
controls where they write their output.

The @ref{3c,,dis} module is now built around an @ref{203,,Instruction} class
that provides object oriented access to the details of each individual bytecode
operation.

A new method, @ref{4ec,,get_instructions()}, provides an iterator that emits
the Instruction stream for a given piece of Python code.  Thus it is now
possible to write a program that inspects and manipulates a bytecode
object in ways different from those provided by the @ref{3c,,dis} module
itself.  For example:

@example
>>> import dis
>>> for instr in dis.get_instructions(lambda x: x + 1):
...     print(instr.opname)
LOAD_FAST
LOAD_CONST
BINARY_ADD
RETURN_VALUE
@end example

The various display tools in the @ref{3c,,dis} module have been rewritten to use
these new components.

In addition, a new application-friendly class @ref{204,,Bytecode} provides
an object-oriented API for inspecting bytecode in both in human-readable form
and for iterating over instructions.  The @code{Bytecode} constructor
takes the same arguments that @ref{4ec,,get_instructions()} does (plus an
optional `current_offset'), and the resulting object can be iterated to produce
@ref{203,,Instruction} objects.  But it also has a @ref{112e,,dis}
method, equivalent to calling @ref{205,,dis} on the constructor argument, but
returned as a multi-line string:

@example
>>> bytecode = dis.Bytecode(lambda x: x + 1, current_offset=3)
>>> for instr in bytecode:
...     print('@{@} (@{@})'.format(instr.opname, instr.opcode))
LOAD_FAST (124)
LOAD_CONST (100)
BINARY_ADD (23)
RETURN_VALUE (83)
>>> bytecode.dis().splitlines()
['  1           0 LOAD_FAST                0 (x)',
 '      -->     3 LOAD_CONST               1 (1)',
 '              6 BINARY_ADD',
 '              7 RETURN_VALUE']
@end example

@ref{204,,Bytecode} also has a class method,
@ref{112f,,from_traceback()}, that provides the ability to manipulate a
traceback (that is, @code{print(Bytecode.from_traceback(tb).dis())} is equivalent
to @code{distb(tb)}).

(Contributed by Nick Coghlan, Ryan Kelly and Thomas Kluyver in bpo-11816@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11816}
and Claudiu Popa in bpo-17916@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17916}.)

New function @ref{1130,,stack_effect()} computes the effect on the Python stack
of a given opcode and argument, information that is not otherwise available.
(Contributed by Larry Hastings in bpo-19722@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19722}.)

@node doctest<4>,email<5>,dis<5>,Improved Modules<4>
@anchor{whatsnew/3 4 doctest}@anchor{1131}
@subsubsection doctest


A new @ref{1132,,option flag}, @ref{1133,,FAIL_FAST}, halts
test running as soon as the first failure is detected.  (Contributed by R.
David Murray and Daniel Urban in bpo-16522@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16522}.)

The @ref{3e,,doctest} command line interface now uses @ref{7,,argparse}, and has two
new options, @code{-o} and @code{-f}.  @code{-o} allows @ref{1132,,doctest options} to be specified on the command line, and @code{-f} is a
shorthand for @code{-o FAIL_FAST} (to parallel the similar option supported by the
@ref{10c,,unittest} CLI).  (Contributed by R. David Murray in bpo-11390@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11390}.)

@ref{3e,,doctest} will now find doctests in extension module @code{__doc__} strings.
(Contributed by Zachary Ware in bpo-3158@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=3158}.)

@node email<5>,filecmp,doctest<4>,Improved Modules<4>
@anchor{whatsnew/3 4 email}@anchor{1134}
@subsubsection email


@ref{1135,,as_string()} now accepts a `policy' argument to
override the default policy of the message when generating a string
representation of it.  This means that @code{as_string} can now be used in more
circumstances, instead of having to create and use a @ref{44,,generator} in
order to pass formatting parameters to its @code{flatten} method.  (Contributed by
R. David Murray in bpo-18600@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18600}.)

New method @ref{1136,,as_bytes()} added to produce a bytes
representation of the message in a fashion similar to how @code{as_string}
produces a string representation.  It does not accept the `maxheaderlen'
argument, but does accept the `unixfrom' and `policy' arguments. The
@ref{580,,Message} @ref{1137,,__bytes__()} method
calls it, meaning that @code{bytes(mymsg)} will now produce the intuitive
result:  a bytes object containing the fully formatted message.  (Contributed
by R. David Murray in bpo-18600@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18600}.)

The @ref{1138,,Message.set_param()} message now accepts a `replace' keyword argument.
When specified, the associated header will be updated without changing
its location in the list of headers.  For backward compatibility, the default
is @code{False}.  (Contributed by R. David Murray in bpo-18891@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18891}.)
@anchor{whatsnew/3 4 whatsnew-email-contentmanager}@anchor{10e7}
A pair of new subclasses of @ref{580,,Message} have been added
(@ref{57f,,EmailMessage} and @ref{1139,,MIMEPart}), along with a new sub-module,
@ref{41,,contentmanager} and a new @ref{53,,policy} attribute
@ref{113a,,content_manager}.  All documentation is
currently in the new module, which is being added as part of email’s new
@ref{3d1,,provisional API}.  These classes provide a number of new methods that
make extracting content from and inserting content into email messages much
easier.  For details, see the @code{contentmanager} documentation and
the @ref{113b,,email; 예제}.  These API additions complete the
bulk of the work that was planned as part of the email6 project.  The currently
provisional API is scheduled to become final in Python 3.5 (possibly with a few
minor additions in the area of error handling).  (Contributed by R. David
Murray in bpo-18891@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18891}.)

@node filecmp,functools<6>,email<5>,Improved Modules<4>
@anchor{whatsnew/3 4 filecmp}@anchor{113c}
@subsubsection filecmp


A new @ref{113d,,clear_cache()} function provides the ability to clear the
@ref{5e,,filecmp} comparison cache, which uses @ref{26d,,os.stat()} information to
determine if the file has changed since the last compare.  This can be used,
for example, if the file might have been changed and re-checked in less time
than the resolution of a particular filesystem’s file modification time field.
(Contributed by Mark Levitt in bpo-18149@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18149}.)

New module attribute @ref{113e,,DEFAULT_IGNORES} provides the list of
directories that are used as the default value for the `ignore' parameter of
the @ref{113f,,dircmp()} function.  (Contributed by Eli Bendersky in
bpo-15442@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15442}.)

@node functools<6>,gc<6>,filecmp,Improved Modules<4>
@anchor{whatsnew/3 4 functools}@anchor{1140}
@subsubsection functools


The new @ref{218,,partialmethod()} descriptor brings partial argument
application to descriptors, just as @ref{217,,partial()} provides
for normal callables. The new descriptor also makes it easier to get
arbitrary callables (including @code{partial()} instances)
to behave like normal instance methods when included in a class definition.
(Contributed by Alon Horev and Nick Coghlan in bpo-4331@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4331}.)
@anchor{whatsnew/3 4 whatsnew-singledispatch}@anchor{10e4}
The new @ref{84a,,singledispatch()} decorator brings support for
single-dispatch generic functions to the Python standard library. Where
object oriented programming focuses on grouping multiple operations on a
common set of data into a class, a generic function focuses on grouping
multiple implementations of an operation that allows it to work with
`different' kinds of data.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 443

@item PEP 443@footnote{https://peps.python.org/pep-0443/} – Single-dispatch generic functions

PEP written and implemented by Łukasz Langa.
@end table


@ref{1141,,total_ordering()} now supports a return value of
@ref{1a2,,NotImplemented} from the underlying comparison function.  (Contributed
by Katie Miller in bpo-10042@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10042}.)

A pure-python version of the @ref{217,,partial()} function is now in the
stdlib; in CPython it is overridden by the C accelerated version, but it is
available for other implementations to use.  (Contributed by Brian Thorne in
bpo-12428@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12428}.)

@node gc<6>,glob<4>,functools<6>,Improved Modules<4>
@anchor{whatsnew/3 4 gc}@anchor{1142}
@subsubsection gc


New function @ref{2dc,,get_stats()} returns a list of three per-generation
dictionaries containing the collections statistics since interpreter startup.
(Contributed by Antoine Pitrou in bpo-16351@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16351}.)

@node glob<4>,hashlib<6>,gc<6>,Improved Modules<4>
@anchor{whatsnew/3 4 glob}@anchor{1143}
@subsubsection glob


A new function @ref{1144,,escape()} provides a way to escape special characters
in a filename so that they do not become part of the globbing expansion but are
instead matched literally.  (Contributed by Serhiy Storchaka in bpo-8402@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8402}.)

@node hashlib<6>,hmac<4>,glob<4>,Improved Modules<4>
@anchor{whatsnew/3 4 hashlib}@anchor{1145}
@subsubsection hashlib


A new @ref{732,,hashlib.pbkdf2_hmac()} function provides
the PKCS#5 password-based key derivation function 2@footnote{https://en.wikipedia.org/wiki/PBKDF2}.  (Contributed by Christian
Heimes in bpo-18582@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18582}.)

The @ref{1146,,name} attribute of @ref{6c,,hashlib} hash objects is now
a formally supported interface.  It has always existed in CPython’s
@code{hashlib} (although it did not return lower case names for all supported
hashes), but it was not a public interface and so some other Python
implementations have not previously supported it.  (Contributed by Jason R.
Coombs in bpo-18532@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18532}.)

@node hmac<4>,html,hashlib<6>,Improved Modules<4>
@anchor{whatsnew/3 4 hmac}@anchor{1147}
@subsubsection hmac


@ref{6e,,hmac} now accepts @code{bytearray} as well as @code{bytes} for the `key'
argument to the @ref{c95,,new()} function, and the `msg' parameter to both the
@code{new()} function and the @ref{1148,,update()} method now
accepts any type supported by the @ref{6c,,hashlib} module.  (Contributed
by Jonas Borgström in bpo-18240@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18240}.)

The `digestmod' argument to the @ref{c95,,hmac.new()} function may now be any hash
digest name recognized by @ref{6c,,hashlib}.  In addition, the current behavior in
which the value of `digestmod' defaults to @code{MD5} is deprecated: in a
future version of Python there will be no default value.  (Contributed by
Christian Heimes in bpo-17276@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17276}.)

With the addition of @ref{1149,,block_size} and @ref{114a,,name}
attributes (and the formal documentation of the @ref{114b,,digest_size}
attribute), the @ref{6e,,hmac} module now conforms fully to the 
@geindex Python 향상 제안; PEP 247
PEP 247@footnote{https://peps.python.org/pep-0247/} API.
(Contributed by Christian Heimes in bpo-18775@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18775}.)

@node html,http<4>,hmac<4>,Improved Modules<4>
@anchor{whatsnew/3 4 html}@anchor{114c}
@subsubsection html


New function @ref{b50,,unescape()} function converts HTML5 character references to
the corresponding Unicode characters.  (Contributed by Ezio Melotti in
bpo-2927@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2927}.)

@ref{a77,,HTMLParser} accepts a new keyword argument
`convert_charrefs' that, when @code{True}, automatically converts all character
references.  For backward-compatibility, its value defaults to @code{False}, but
it will change to @code{True} in a future version of Python, so you are invited to
set it explicitly and update your code to use this new feature.  (Contributed
by Ezio Melotti in bpo-13633@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13633}.)

The `strict' argument of @ref{a77,,HTMLParser} is now deprecated.
(Contributed by Ezio Melotti in bpo-15114@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15114}.)

@node http<4>,idlelib and IDLE,html,Improved Modules<4>
@anchor{whatsnew/3 4 http}@anchor{114d}
@subsubsection http


@ref{114e,,send_error()} now accepts an
optional additional `explain' parameter which can be used to provide an
extended error description, overriding the hardcoded default if there is one.
This extended error description will be formatted using the
@ref{114f,,error_message_format} attribute
and sent as the body of the error response.
(Contributed by Karl Cow in bpo-12921@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12921}.)

The @ref{76,,http.server} @ref{1150,,command line interface} now has
a @code{-b/--bind} option that causes the server to listen on a specific address.
(Contributed by Malte Swart in bpo-17764@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17764}.)

@node idlelib and IDLE,importlib<9>,http<4>,Improved Modules<4>
@anchor{whatsnew/3 4 idlelib-and-idle}@anchor{1151}
@subsubsection idlelib and IDLE


Since idlelib implements the IDLE shell and editor and is not intended for
import by other programs, it gets improvements with every release. See
@code{Lib/idlelib/NEWS.txt} for a cumulative list of changes since 3.3.0,
as well as changes made in future 3.4.x releases. This file is also available
from the IDLE Help ‣ About IDLE dialog.

@node importlib<9>,inspect<9>,idlelib and IDLE,Improved Modules<4>
@anchor{whatsnew/3 4 importlib}@anchor{1152}
@subsubsection importlib


The @ref{1153,,InspectLoader} ABC defines a new method,
@ref{1011,,source_to_code()} that accepts source
data and a path and returns a code object.  The default implementation
is equivalent to @code{compile(data, path, 'exec', dont_inherit=True)}.
(Contributed by Eric Snow and Brett Cannon in bpo-15627@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15627}.)

@ref{1153,,InspectLoader} also now has a default implementation
for the @ref{1154,,get_code()} method.  However,
it will normally be desirable to override the default implementation
for performance reasons.  (Contributed by Brett Cannon in bpo-18072@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18072}.)

The @ref{73c,,reload()} function has been moved from @code{imp} to
@ref{7b,,importlib} as part of the @code{imp} module deprecation.  (Contributed by
Berker Peksag in bpo-18193@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18193}.)

@ref{81,,importlib.util} now has a @ref{736,,MAGIC_NUMBER} attribute
providing access to the bytecode version number.  This replaces the
@code{get_magic()} function in the deprecated @code{imp} module.
(Contributed by Brett Cannon in bpo-18192@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18192}.)

New @ref{81,,importlib.util} functions @ref{353,,cache_from_source()}
and @ref{73d,,source_from_cache()} replace the same-named functions
in the deprecated @code{imp} module.  (Contributed by Brett Cannon in
bpo-18194@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18194}.)

The @ref{7b,,importlib} bootstrap @ref{1155,,NamespaceLoader} now conforms to
the @ref{1153,,InspectLoader} ABC, which means that @code{runpy} and
@code{python -m} can now be used with namespace packages.  (Contributed
by Brett Cannon in bpo-18058@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18058}.)

@ref{81,,importlib.util} has a new function @ref{1156,,decode_source()}
that decodes source from bytes using universal newline processing.  This is
useful for implementing @ref{1157,,InspectLoader.get_source()} methods.

@ref{ead,,importlib.machinery.ExtensionFileLoader} now has a
@ref{1158,,get_filename()} method.  This was
inadvertently omitted in the original implementation.  (Contributed by Eric
Snow in bpo-19152@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19152}.)

@node inspect<9>,ipaddress<5>,importlib<9>,Improved Modules<4>
@anchor{whatsnew/3 4 inspect}@anchor{1159}
@subsubsection inspect


The @ref{82,,inspect} module now offers a basic @ref{115a,,command line interface} to quickly display source code and other
information for modules, classes and functions.  (Contributed by Claudiu Popa
and Nick Coghlan in bpo-18626@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18626}.)

@ref{115b,,unwrap()} makes it easy to unravel wrapper function chains
created by @ref{115c,,functools.wraps()} (and any other API that sets the
@code{__wrapped__} attribute on a wrapper function).  (Contributed by
Daniel Urban, Aaron Iles and Nick Coghlan in bpo-13266@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13266}.)

As part of the implementation of the new @ref{5a,,enum} module, the
@ref{82,,inspect} module now has substantially better support for custom
@code{__dir__} methods and dynamic class attributes provided through
metaclasses.  (Contributed by Ethan Furman in bpo-18929@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18929} and
bpo-19030@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19030}.)

@ref{940,,getfullargspec()} and @code{getargspec()}
now use the @ref{22f,,signature()} API. This allows them to
support a much broader range of callables, including those with
@code{__signature__} attributes, those with metadata provided by argument
clinic, @ref{217,,functools.partial()} objects and more. Note that, unlike
@code{signature()}, these functions still ignore @code{__wrapped__}
attributes, and report the already bound first argument for bound methods,
so it is still necessary to update your code to use
@code{signature()} directly if those features are desired.
(Contributed by Yury Selivanov in bpo-17481@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17481}.)

@ref{22f,,signature()} now supports duck types of CPython functions,
which adds support for functions compiled with Cython.  (Contributed
by Stefan Behnel and Yury Selivanov in bpo-17159@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17159}.)

@node ipaddress<5>,logging<6>,inspect<9>,Improved Modules<4>
@anchor{whatsnew/3 4 ipaddress}@anchor{115d}
@subsubsection ipaddress


@ref{84,,ipaddress} was added to the standard library in Python 3.3 as a
@ref{3d1,,provisional API}. With the release of Python 3.4, this qualification
has been removed: @code{ipaddress} is now considered a stable API, covered
by the normal standard library requirements to maintain backwards
compatibility.

A new @ref{115e,,is_global} property is @code{True} if
an address is globally routeable.  (Contributed by Peter Moody in
bpo-17400@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17400}.)

@node logging<6>,marshal<2>,ipaddress<5>,Improved Modules<4>
@anchor{whatsnew/3 4 logging}@anchor{115f}
@subsubsection logging


The @ref{1160,,TimedRotatingFileHandler} has a new `atTime'
parameter that can be used to specify the time of day when rollover should
happen.  (Contributed by Ronald Oussoren in bpo-9556@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9556}.)

@ref{1161,,SocketHandler} and
@ref{1162,,DatagramHandler} now support Unix domain sockets (by
setting `port' to @code{None}).  (Contributed by Vinay Sajip in commit
ce46195b56a9.)

@ref{d47,,fileConfig()} now accepts a
@ref{1163,,configparser.RawConfigParser} subclass instance for the `fname'
parameter.  This facilitates using a configuration file when logging
configuration is just a part of the overall application configuration, or where
the application modifies the configuration before passing it to
@code{fileConfig()}.  (Contributed by Vinay Sajip in
bpo-16110@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16110}.)

Logging configuration data received from a socket via the
@ref{1164,,logging.config.listen()} function can now be validated before being
processed by supplying a verification function as the argument to the new
`verify' keyword argument.  (Contributed by Vinay Sajip in bpo-15452@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15452}.)

@node marshal<2>,mmap<3>,logging<6>,Improved Modules<4>
@anchor{whatsnew/3 4 marshal}@anchor{1165}@anchor{whatsnew/3 4 whatsnew-marshal-3}@anchor{10dc}
@subsubsection marshal


The default @ref{91,,marshal} version has been bumped to 3.  The code implementing
the new version restores the Python2 behavior of recording only one copy of
interned strings and preserving the interning on deserialization, and extends
this “one copy” ability to any object type (including handling recursive
references).  This reduces both the size of @code{.pyc} files and the amount of
memory a module occupies in memory when it is loaded from a @code{.pyc} (or
@code{.pyo}) file.  (Contributed by Kristján Valur Jónsson in bpo-16475@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16475},
with additional speedups by Antoine Pitrou in bpo-19219@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19219}.)

@node mmap<3>,multiprocessing<8>,marshal<2>,Improved Modules<4>
@anchor{whatsnew/3 4 mmap}@anchor{1166}
@subsubsection mmap


mmap objects are now @ref{110c,,weakly referenceable}.
(Contributed by Valerie Lambert in bpo-4885@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4885}.)

@node multiprocessing<8>,operator<4>,mmap<3>,Improved Modules<4>
@anchor{whatsnew/3 4 multiprocessing}@anchor{1167}
@subsubsection multiprocessing

@anchor{whatsnew/3 4 whatsnew-multiprocessing-no-fork}@anchor{10e6}
On Unix two new @ref{1d5,,start methods},
@code{spawn} and @code{forkserver}, have been added for starting processes using
@ref{98,,multiprocessing}.  These make the mixing of processes with threads more
robust, and the @code{spawn} method matches the semantics that multiprocessing has
always used on Windows.  New function
@ref{1168,,get_all_start_methods()} reports all start methods
available on the platform, @ref{1169,,get_start_method()} reports
the current start method, and @ref{24b,,set_start_method()} sets
the start method.  (Contributed by Richard Oudkerk in bpo-8713@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8713}.)

@ref{98,,multiprocessing} also now has the concept of a @code{context}, which
determines how child processes are created.  New function
@ref{24a,,get_context()} returns a context that uses a specified
start method.  It has the same API as the @code{multiprocessing} module itself,
so you can use it to create @ref{116a,,Pool}s and other
objects that will operate within that context.  This allows a framework and an
application or different parts of the same application to use multiprocessing
without interfering with each other.  (Contributed by Richard Oudkerk in
bpo-18999@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18999}.)

Except when using the old `fork' start method, child processes no longer
inherit unneeded handles/file descriptors from their parents (part of
bpo-8713@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8713}).

@ref{98,,multiprocessing} now relies on @ref{c3,,runpy} (which implements the
@code{-m} switch) to initialise @code{__main__} appropriately in child processes
when using the @code{spawn} or @code{forkserver} start methods. This resolves some
edge cases where combining multiprocessing, the @code{-m} command line switch,
and explicit relative imports could cause obscure failures in child
processes.  (Contributed by Nick Coghlan in bpo-19946@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19946}.)

@node operator<4>,os<12>,multiprocessing<8>,Improved Modules<4>
@anchor{whatsnew/3 4 operator}@anchor{116b}
@subsubsection operator


New function @ref{116c,,length_hint()} provides an implementation of the
specification for how the @ref{110d,,__length_hint__()} special method should
be used, as part of the 
@geindex Python 향상 제안; PEP 424
PEP 424@footnote{https://peps.python.org/pep-0424/} formal specification of this language
feature.  (Contributed by Armin Ronacher in bpo-16148@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16148}.)

There is now a pure-python version of the @ref{a3,,operator} module available for
reference and for use by alternate implementations of Python.  (Contributed by
Zachary Ware in bpo-16694@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16694}.)

@node os<12>,pdb<8>,operator<4>,Improved Modules<4>
@anchor{whatsnew/3 4 os}@anchor{116d}
@subsubsection os


There are new functions to get and set the @ref{10fb,,inheritable flag} of a file descriptor (@ref{10fc,,os.get_inheritable()},
@ref{10fd,,os.set_inheritable()}) or a Windows handle
(@ref{10fe,,os.get_handle_inheritable()}, @ref{10ff,,os.set_handle_inheritable()}).

New function @ref{4db,,cpu_count()} reports the number of CPUs available on the
platform on which Python is running (or @code{None} if the count can’t be
determined).  The @ref{116e,,multiprocessing.cpu_count()} function is now implemented
in terms of this function).  (Contributed by Trent Nelson, Yogesh Chaudhari,
Victor Stinner, and Charles-François Natali in bpo-17914@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17914}.)

@ref{116f,,os.path.samestat()} is now available on the Windows platform (and the
@ref{1170,,os.path.samefile()} implementation is now shared between Unix and
Windows).  (Contributed by Brian Curtin in bpo-11939@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11939}.)

@ref{c06,,os.path.ismount()} now recognizes volumes mounted below a drive
root on Windows.  (Contributed by Tim Golden in bpo-9035@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9035}.)

@ref{f91,,os.open()} supports two new flags on platforms that provide them,
@ref{1171,,O_PATH} (un-opened file descriptor), and @ref{1172,,O_TMPFILE}
(unnamed temporary file; as of 3.4.0 release available only on Linux systems
with a kernel version of 3.11 or newer that have uapi headers).  (Contributed
by Christian Heimes in bpo-18673@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18673} and Benjamin Peterson, respectively.)

@node pdb<8>,pickle<5>,os<12>,Improved Modules<4>
@anchor{whatsnew/3 4 pdb}@anchor{1173}
@subsubsection pdb


@ref{aa,,pdb} has been enhanced to handle generators, @ref{bc1,,yield}, and
@code{yield from} in a more useful fashion.  This is especially helpful when
debugging @ref{b,,asyncio} based programs.  (Contributed by Andrew Svetlov and
Xavier de Gaye in bpo-16596@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16596}.)

The @code{print} command has been removed from @ref{aa,,pdb}, restoring access to the
Python @ref{1174,,print()} function from the pdb command line.  Python2’s @code{pdb} did
not have a @code{print} command; instead, entering @code{print} executed the
@code{print} statement.  In Python3 @code{print} was mistakenly made an alias for the
pdb @ref{1175,,p} command.  @code{p}, however, prints the @code{repr} of its argument,
not the @code{str} like the Python2 @code{print} command did.  Worse, the Python3
@code{pdb print} command shadowed the Python3 @code{print} function, making it
inaccessible at the @code{pdb} prompt.  (Contributed by Connor Osborn in
bpo-18764@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18764}.)

@node pickle<5>,plistlib<2>,pdb<8>,Improved Modules<4>
@anchor{whatsnew/3 4 pickle}@anchor{1176}@anchor{whatsnew/3 4 whatsnew-protocol-4}@anchor{10e5}
@subsubsection pickle


@ref{ab,,pickle} now supports (but does not use by default) a new pickle protocol,
protocol 4.  This new protocol addresses a number of issues that were present
in previous protocols, such as the serialization of nested classes, very large
strings and containers, and classes whose @ref{79f,,__new__()} method takes
keyword-only arguments.  It also provides some efficiency improvements.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 3154

@item PEP 3154@footnote{https://peps.python.org/pep-3154/} – Pickle protocol 4

PEP written by Antoine Pitrou and implemented by Alexandre Vassalotti.
@end table


@node plistlib<2>,poplib<3>,pickle<5>,Improved Modules<4>
@anchor{whatsnew/3 4 plistlib}@anchor{1177}
@subsubsection plistlib


@ref{b0,,plistlib} now has an API that is similar to the standard pattern for
stdlib serialization protocols, with new @ref{b48,,load()},
@ref{b4a,,dump()}, @ref{b49,,loads()}, and @ref{b4b,,dumps()}
functions.  (The older API is now deprecated.)  In addition to the already
supported XML plist format (@ref{1178,,FMT_XML}), it also now supports
the binary plist format (@ref{1179,,FMT_BINARY}).  (Contributed by Ronald
Oussoren and others in bpo-14455@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14455}.)

@node poplib<3>,pprint<4>,plistlib<2>,Improved Modules<4>
@anchor{whatsnew/3 4 poplib}@anchor{117a}
@subsubsection poplib


Two new methods have been added to @ref{b1,,poplib}: @ref{117b,,capa()},
which returns the list of capabilities advertised by the POP server, and
@ref{117c,,stls()}, which switches a clear-text POP3 session into an
encrypted POP3 session if the POP server supports it.  (Contributed by Lorenzo
Catucci in bpo-4473@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4473}.)

@node pprint<4>,pty<2>,poplib<3>,Improved Modules<4>
@anchor{whatsnew/3 4 pprint}@anchor{117d}
@subsubsection pprint


The @ref{b3,,pprint} module’s @ref{117e,,PrettyPrinter} class and its
@ref{117f,,pformat()}, and @ref{a29,,pprint()} functions have a new
option, `compact', that controls how the output is formatted.  Currently
setting `compact' to @code{True} means that sequences will be printed with as many
sequence elements as will fit within `width' on each (indented) line.
(Contributed by Serhiy Storchaka in bpo-19132@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19132}.)

Long strings are now wrapped using Python’s normal line continuation
syntax.  (Contributed by Antoine Pitrou in bpo-17150@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17150}.)

@node pty<2>,pydoc<5>,pprint<4>,Improved Modules<4>
@anchor{whatsnew/3 4 pty}@anchor{1180}
@subsubsection pty


@ref{1181,,pty.spawn()} now returns the status value from @ref{f99,,os.waitpid()} on
the child process, instead of @code{None}.  (Contributed by Gregory P. Smith.)

@node pydoc<5>,re<9>,pty<2>,Improved Modules<4>
@anchor{whatsnew/3 4 pydoc}@anchor{1182}
@subsubsection pydoc


The @ref{ba,,pydoc} module is now based directly on the @ref{22f,,inspect.signature()}
introspection API, allowing it to provide signature information for a wider
variety of callable objects. This change also means that @code{__wrapped__}
attributes are now taken into account when displaying help information.
(Contributed by Larry Hastings in bpo-19674@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19674}.)

The @ref{ba,,pydoc} module no longer displays the @code{self} parameter for
already bound methods. Instead, it aims to always display the exact current
signature of the supplied callable.  (Contributed by Larry Hastings in
bpo-20710@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20710}.)

In addition to the changes that have been made to @ref{ba,,pydoc} directly,
its handling of custom @code{__dir__} methods and various descriptor
behaviours has also been improved substantially by the underlying changes in
the @ref{82,,inspect} module.

As the @ref{ad4,,help()} builtin is based on @ref{ba,,pydoc}, the above changes also
affect the behaviour of @code{help()}.

@node re<9>,resource,pydoc<5>,Improved Modules<4>
@anchor{whatsnew/3 4 re}@anchor{1183}
@subsubsection re


New @ref{1184,,fullmatch()} function and @ref{1185,,Pattern.fullmatch()} method anchor
the pattern at both ends of the string to match.  This provides a way to be
explicit about the goal of the match, which avoids a class of subtle bugs where
@code{$} characters get lost during code changes or the addition of alternatives
to an existing regular expression.  (Contributed by Matthew Barnett in
bpo-16203@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16203}.)

The repr of @ref{1186,,regex objects} now includes the pattern
and the flags; the repr of @ref{1187,,match objects} now
includes the start, end, and the part of the string that matched.  (Contributed
by Hugo Lopes Tavares and Serhiy Storchaka in bpo-13592@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13592} and
bpo-17087@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17087}.)

@node resource,select,re<9>,Improved Modules<4>
@anchor{whatsnew/3 4 resource}@anchor{1188}
@subsubsection resource


New @ref{1189,,prlimit()} function, available on Linux platforms with a
kernel version of 2.6.36 or later and glibc of 2.13 or later, provides the
ability to query or set the resource limits for processes other than the one
making the call.  (Contributed by Christian Heimes in bpo-16595@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16595}.)

On Linux kernel version 2.6.36 or later, there are also some new
Linux specific constants: @ref{118a,,RLIMIT_MSGQUEUE},
@ref{118b,,RLIMIT_NICE}, @ref{118c,,RLIMIT_RTPRIO},
@ref{118d,,RLIMIT_RTTIME}, and @ref{118e,,RLIMIT_SIGPENDING}.
(Contributed by Christian Heimes in bpo-19324@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19324}.)

On FreeBSD version 9 and later, there some new FreeBSD specific constants:
@ref{118f,,RLIMIT_SBSIZE}, @ref{1190,,RLIMIT_SWAP}, and
@ref{1191,,RLIMIT_NPTS}.  (Contributed by Claudiu Popa in
bpo-19343@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19343}.)

@node select,shelve<2>,resource,Improved Modules<4>
@anchor{whatsnew/3 4 select}@anchor{1192}
@subsubsection select


@ref{1193,,epoll} objects now support the context management protocol.
When used in a @ref{186,,with} statement, the @ref{1194,,close()}
method will be called automatically at the end of the block.  (Contributed
by Serhiy Storchaka in bpo-16488@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16488}.)

@ref{1195,,devpoll} objects now have @ref{1196,,fileno()} and
@ref{1197,,close()} methods, as well as a new attribute
@ref{1198,,closed}.  (Contributed by Victor Stinner in
bpo-18794@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18794}.)

@node shelve<2>,shutil<5>,select,Improved Modules<4>
@anchor{whatsnew/3 4 shelve}@anchor{1199}
@subsubsection shelve


@ref{119a,,Shelf} instances may now be used in @ref{186,,with} statements,
and will be automatically closed at the end of the @code{with} block.
(Contributed by Filip Gruszczyński in bpo-13896@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13896}.)

@node shutil<5>,smtpd<3>,shelve<2>,Improved Modules<4>
@anchor{whatsnew/3 4 shutil}@anchor{119b}
@subsubsection shutil


@ref{c4d,,copyfile()} now raises a specific @ref{119c,,Error} subclass,
@ref{119d,,SameFileError}, when the source and destination are the same
file, which allows an application to take appropriate action on this specific
error.  (Contributed by Atsuo Ishimoto and Hynek Schlawack in
bpo-1492704@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1492704}.)

@node smtpd<3>,smtplib<3>,shutil<5>,Improved Modules<4>
@anchor{whatsnew/3 4 smtpd}@anchor{119e}
@subsubsection smtpd


The @code{SMTPServer} and @code{SMTPChannel} classes now
accept a `map' keyword argument which, if specified, is passed in to
@code{asynchat.async_chat} as its `map' argument.  This allows an application
to avoid affecting the global socket map.  (Contributed by Vinay Sajip in
bpo-11959@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11959}.)

@node smtplib<3>,socket<10>,smtpd<3>,Improved Modules<4>
@anchor{whatsnew/3 4 smtplib}@anchor{119f}
@subsubsection smtplib


@ref{11a0,,SMTPException} is now a subclass of @ref{2c0,,OSError}, which allows
both socket level errors and SMTP protocol level errors to be caught in one
try/except statement by code that only cares whether or not an error occurred.
(Contributed by Ned Jackson Lovely in bpo-2118@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2118}.)

@node socket<10>,sqlite3<10>,smtplib<3>,Improved Modules<4>
@anchor{whatsnew/3 4 socket}@anchor{11a1}
@subsubsection socket


The socket module now supports the @ref{11a2,,CAN_BCM} protocol on
platforms that support it.  (Contributed by Brian Thorne in bpo-15359@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15359}.)

Socket objects have new methods to get or set their @ref{10fb,,inheritable flag}, @ref{1100,,get_inheritable()} and
@ref{1101,,set_inheritable()}.

The @code{socket.AF_*} and @code{socket.SOCK_*} constants are now enumeration values
using the new @ref{5a,,enum} module.  This allows meaningful names to be printed
during debugging, instead of integer “magic numbers”.

The @ref{11a3,,AF_LINK} constant is now available on BSD and OSX.

@ref{b5b,,inet_pton()} and @ref{11a4,,inet_ntop()} are now supported
on Windows.  (Contributed by Atsuo Ishimoto in bpo-7171@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7171}.)

@node sqlite3<10>,ssl<11>,socket<10>,Improved Modules<4>
@anchor{whatsnew/3 4 sqlite3}@anchor{11a5}
@subsubsection sqlite3


A new boolean parameter to the @ref{5a5,,connect()} function, `uri', can be
used to indicate that the `database' parameter is a @code{uri} (see the SQLite URI documentation@footnote{https://www.sqlite.org/uri.html}).  (Contributed by poq in
bpo-13773@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13773}.)

@node ssl<11>,stat,sqlite3<10>,Improved Modules<4>
@anchor{whatsnew/3 4 ssl}@anchor{11a6}
@subsubsection ssl

@anchor{whatsnew/3 4 whatsnew-tls-11-12}@anchor{10e9}
@ref{11a7,,PROTOCOL_TLSv1_1} and @ref{11a8,,PROTOCOL_TLSv1_2} (TLSv1.1 and
TLSv1.2 support) have been added; support for these protocols is only available if
Python is linked with OpenSSL 1.0.1 or later.  (Contributed by Michele Orrù and
Antoine Pitrou in bpo-16692@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16692}.)
@anchor{whatsnew/3 4 whatsnew34-sslcontext}@anchor{10ec}
New function @ref{480,,create_default_context()} provides a standard way to
obtain an @ref{357,,SSLContext} whose settings are intended to be a
reasonable balance between compatibility and security.  These settings are
more stringent than the defaults provided by the @code{SSLContext}
constructor, and may be adjusted in the future, without prior deprecation, if
best-practice security requirements change.  The new recommended best
practice for using stdlib libraries that support SSL is to use
@code{create_default_context()} to obtain an @code{SSLContext}
object, modify it if needed, and then pass it as the `context' argument
of the appropriate stdlib API.  (Contributed by Christian Heimes
in bpo-19689@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19689}.)

@ref{357,,SSLContext} method @ref{10ed,,load_verify_locations()}
accepts a new optional argument `cadata', which can be used to provide PEM or
DER encoded certificates directly via strings or bytes, respectively.
(Contributed by Christian Heimes in bpo-18138@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18138}.)

New function @ref{11a9,,get_default_verify_paths()} returns
a named tuple of the paths and environment variables that the
@ref{11aa,,set_default_verify_paths()} method uses to set
OpenSSL’s default @code{cafile} and @code{capath}.  This can be an aid in
debugging default verification issues.  (Contributed by Christian Heimes
in bpo-18143@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18143}.)

@ref{357,,SSLContext} has a new method,
@ref{11ab,,cert_store_stats()}, that reports the number of loaded
@code{X.509} certs, @code{X.509 CA} certs, and certificate revocation lists
(@code{crl}s), as well as a @ref{11ac,,get_ca_certs()} method that
returns a list of the loaded @code{CA} certificates.  (Contributed by Christian
Heimes in bpo-18147@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18147}.)

If OpenSSL 0.9.8 or later is available, @ref{357,,SSLContext} has a new
attribute @ref{11ad,,verify_flags} that can be used to control the
certificate verification process by setting it to some combination of the new
constants @ref{11ae,,VERIFY_DEFAULT}, @ref{11af,,VERIFY_CRL_CHECK_LEAF},
@ref{11b0,,VERIFY_CRL_CHECK_CHAIN}, or @ref{482,,VERIFY_X509_STRICT}.
OpenSSL does not do any CRL verification by default.  (Contributed by
Christien Heimes in bpo-8813@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8813}.)

New @ref{357,,SSLContext} method @ref{11b1,,load_default_certs()}
loads a set of default “certificate authority” (CA) certificates from default
locations, which vary according to the platform.  It can be used to load both
TLS web server authentication certificates
(@code{purpose=}@ref{11b2,,SERVER_AUTH}) for a client to use to verify a
server, and certificates for a server to use in verifying client certificates
(@code{purpose=}@ref{11b3,,CLIENT_AUTH}).  (Contributed by Christian
Heimes in bpo-19292@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19292}.)
@anchor{whatsnew/3 4 whatsnew34-win-cert-store}@anchor{10ea}
Two new windows-only functions, @ref{11b4,,enum_certificates()} and
@ref{11b5,,enum_crls()} provide the ability to retrieve certificates,
certificate information, and CRLs from the Windows cert store.  (Contributed
by Christian Heimes in bpo-17134@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17134}.)
@anchor{whatsnew/3 4 whatsnew34-sni}@anchor{10eb}
Support for server-side SNI (Server Name Indication) using the new
@ref{11b6,,ssl.SSLContext.set_servername_callback()} method.
(Contributed by Daniel Black in bpo-8109@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8109}.)

The dictionary returned by @ref{11b7,,SSLSocket.getpeercert()} contains additional
@code{X509v3} extension items: @code{crlDistributionPoints}, @code{calIssuers}, and
@code{OCSP} URIs.  (Contributed by Christian Heimes in bpo-18379@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18379}.)

@node stat,struct<3>,ssl<11>,Improved Modules<4>
@anchor{whatsnew/3 4 stat}@anchor{11b8}
@subsubsection stat


The @ref{d6,,stat} module is now backed by a C implementation in @code{_stat}. A C
implementation is required as most of the values aren’t standardized and
are platform-dependent.  (Contributed by Christian Heimes in bpo-11016@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11016}.)

The module supports new @ref{11b9,,ST_MODE} flags, @ref{11ba,,S_IFDOOR},
@ref{11bb,,S_IFPORT}, and @ref{11bc,,S_IFWHT}.  (Contributed by
Christian Hiemes in bpo-11016@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11016}.)

@node struct<3>,subprocess<5>,stat,Improved Modules<4>
@anchor{whatsnew/3 4 struct}@anchor{11bd}
@subsubsection struct


New function @ref{11be,,iter_unpack} and a new
@ref{11bf,,struct.Struct.iter_unpack()} method on compiled formats provide streamed
unpacking of a buffer containing repeated instances of a given format of data.
(Contributed by Antoine Pitrou in bpo-17804@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17804}.)

@node subprocess<5>,sunau<2>,struct<3>,Improved Modules<4>
@anchor{whatsnew/3 4 subprocess}@anchor{11c0}
@subsubsection subprocess


@ref{11c1,,check_output()} now accepts an `input' argument that can
be used to provide the contents of @code{stdin} for the command that is run.
(Contributed by Zack Weinberg in bpo-16624@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16624}.)

@ref{11c2,,getoutput()} and @ref{11c3,,getstatusoutput()} now
work on Windows.  This change was actually inadvertently made in 3.3.4.
(Contributed by Tim Golden in bpo-10197@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10197}.)

@node sunau<2>,sys<12>,subprocess<5>,Improved Modules<4>
@anchor{whatsnew/3 4 sunau}@anchor{11c4}
@subsubsection sunau


The @code{getparams()} method now returns a namedtuple rather than a
plain tuple.  (Contributed by Claudiu Popa in bpo-18901@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18901}.)

@code{sunau.open()} now supports the context management protocol: when used in a
@ref{186,,with} block, the @code{close} method of the returned object will be
called automatically at the end of the block.  (Contributed by Serhiy Storchaka
in bpo-18878@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18878}.)

@code{AU_write.setsampwidth()} now supports 24 bit samples, thus adding
support for writing 24 sample using the module.  (Contributed by
Serhiy Storchaka in bpo-19261@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19261}.)

The @code{writeframesraw()} and
@code{writeframes()} methods now accept any @ref{193,,bytes-like object}.  (Contributed by Serhiy Storchaka in bpo-8311@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8311}.)

@node sys<12>,tarfile<8>,sunau<2>,Improved Modules<4>
@anchor{whatsnew/3 4 sys}@anchor{11c5}
@subsubsection sys


New function @ref{11c6,,sys.getallocatedblocks()} returns the current number of
blocks allocated by the interpreter.  (In CPython with the default
@code{--with-pymalloc} setting, this is allocations made through the
@ref{e61,,PyObject_Malloc()} API.)  This can be useful for tracking memory leaks,
especially if automated via a test suite.  (Contributed by Antoine Pitrou
in bpo-13390@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13390}.)

When the Python interpreter starts in @ref{443,,interactive mode}, it checks for an @ref{11c7,,__interactivehook__} attribute
on the @ref{df,,sys} module.  If the attribute exists, its value is called with no
arguments just before interactive mode is started.  The check is made after the
@geindex PYTHONSTARTUP
@geindex 환경 변수; PYTHONSTARTUP
@ref{1b8,,PYTHONSTARTUP} file is read, so it can be set there.  The @ref{cc,,site}
module @ref{11c8,,sets it} to a function that enables tab
completion and history saving (in @code{~/.python-history}) if the platform
supports @ref{bf,,readline}.  If you do not want this (new) behavior, you can
override it in 
@geindex PYTHONSTARTUP
@geindex 환경 변수; PYTHONSTARTUP
@code{PYTHONSTARTUP}, @ref{cd,,sitecustomize}, or
@ref{114,,usercustomize} by deleting this attribute from @code{sys} (or setting it
to some other callable).  (Contributed by Éric Araujo and Antoine Pitrou in
bpo-5845@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5845}.)

@node tarfile<8>,textwrap<2>,sys<12>,Improved Modules<4>
@anchor{whatsnew/3 4 tarfile}@anchor{11c9}
@subsubsection tarfile


The @ref{e4,,tarfile} module now supports a simple @ref{11ca,,명령 줄 인터페이스} when
called as a script directly or via @code{-m}.  This can be used to create and
extract tarfile archives.  (Contributed by Berker Peksag in bpo-13477@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13477}.)

@node textwrap<2>,threading<8>,tarfile<8>,Improved Modules<4>
@anchor{whatsnew/3 4 textwrap}@anchor{11cb}
@subsubsection textwrap


The @ref{11cc,,TextWrapper} class has two new attributes/constructor
arguments: @ref{11cd,,max_lines}, which limits the number of
lines in the output, and @ref{11ce,,placeholder}, which is a
string that will appear at the end of the output if it has been truncated
because of `max_lines'.  Building on these capabilities, a new convenience
function @ref{11cf,,shorten()} collapses all of the whitespace in the input
to single spaces and produces a single line of a given `width' that ends with
the `placeholder' (by default, @code{[...]}).  (Contributed by Antoine Pitrou and
Serhiy Storchaka in bpo-18585@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18585} and bpo-18725@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18725}.)

@node threading<8>,traceback<6>,textwrap<2>,Improved Modules<4>
@anchor{whatsnew/3 4 threading}@anchor{11d0}
@subsubsection threading


The @ref{176,,Thread} object representing the main thread can be
obtained from the new @ref{11d1,,main_thread()} function.  In normal
conditions this will be the thread from which the Python interpreter was
started.  (Contributed by Andrew Svetlov in bpo-18882@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18882}.)

@node traceback<6>,types<7>,threading<8>,Improved Modules<4>
@anchor{whatsnew/3 4 traceback}@anchor{11d2}
@subsubsection traceback


A new @ref{11d3,,traceback.clear_frames()} function takes a traceback object
and clears the local variables in all of the frames it references,
reducing the amount of memory consumed.  (Contributed by Andrew Kuchling in
bpo-1565525@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1565525}.)

@node types<7>,urllib<5>,traceback<6>,Improved Modules<4>
@anchor{whatsnew/3 4 types}@anchor{11d4}
@subsubsection types


A new @ref{83b,,DynamicClassAttribute()} descriptor provides a way to define
an attribute that acts normally when looked up through an instance object, but
which is routed to the `class' @code{__getattr__} when looked up through the
class.  This allows one to have properties active on a class, and have virtual
attributes on the class with the same name (see @ref{5a,,enum} for an example).
(Contributed by Ethan Furman in bpo-19030@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19030}.)

@node urllib<5>,unittest<10>,types<7>,Improved Modules<4>
@anchor{whatsnew/3 4 urllib}@anchor{11d5}
@subsubsection urllib


@ref{111,,urllib.request} now supports @code{data:} URLs via the
@ref{11d6,,DataHandler} class.  (Contributed by Mathias Panzenböck
in bpo-16423@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16423}.)

The http method that will be used by a @ref{11d7,,Request} class
can now be specified by setting a @ref{11d8,,method}
class attribute on the subclass.  (Contributed by Jason R Coombs in
bpo-18978@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18978}.)

@ref{11d7,,Request} objects are now reusable: if the
@ref{11d9,,full_url} or @ref{11da,,data}
attributes are modified, all relevant internal properties are updated.  This
means, for example, that it is now possible to use the same
@code{Request} object in more than one
@ref{11db,,OpenerDirector.open()} call with different `data' arguments, or to
modify a @code{Request}‘s @code{url} rather than recomputing it
from scratch.  There is also a new
@ref{11dc,,remove_header()} method that can be used to remove
headers from a @code{Request}.  (Contributed by Alexey
Kachayev in bpo-16464@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16464}, Daniel Wozniak in bpo-17485@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17485}, and Damien Brecht
and Senthil Kumaran in bpo-17272@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17272}.)

@ref{11dd,,HTTPError} objects now have a
@ref{11de,,headers} attribute that provides access to the
HTTP response headers associated with the error.  (Contributed by
Berker Peksag in bpo-15701@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15701}.)

@node unittest<10>,venv<7>,urllib<5>,Improved Modules<4>
@anchor{whatsnew/3 4 unittest}@anchor{11df}
@subsubsection unittest


The @ref{2b3,,TestCase} class has a new method,
@ref{11e0,,subTest()}, that produces a context manager whose
@ref{186,,with} block becomes a “sub-test”.  This context manager allows a test
method to dynamically generate subtests  by, say, calling the @code{subTest}
context manager inside a loop.  A single test method can thereby produce an
indefinite number of separately identified and separately counted tests, all of
which will run even if one or more of them fail.  For example:

@example
class NumbersTest(unittest.TestCase):
    def test_even(self):
        for i in range(6):
            with self.subTest(i=i):
                self.assertEqual(i % 2, 0)
@end example

will result in six subtests, each identified in the unittest verbose output
with a label consisting of the variable name @code{i} and a particular value for
that variable (@code{i=0}, @code{i=1}, etc).  See @ref{11e1,,부분 테스트(subtest)를 사용하여 테스트 반복 구별 짓기} for the full
version of this example.  (Contributed by Antoine Pitrou in bpo-16997@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16997}.)

@ref{11e2,,unittest.main()} now accepts an iterable of test names for
`defaultTest', where previously it only accepted a single test name as a
string.  (Contributed by Jyrki Pulliainen in bpo-15132@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15132}.)

If @ref{11e3,,SkipTest} is raised during test discovery (that is, at the
module level in the test file), it is now reported as a skip instead of an
error.  (Contributed by Zach Ware in bpo-16935@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16935}.)

@ref{11e4,,discover()} now sorts the discovered files to provide
consistent test ordering.  (Contributed by Martin Melin and Jeff Ramnani in
bpo-16709@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16709}.)

@ref{ff4,,TestSuite} now drops references to tests as soon as the test
has been run, if the test is successful.  On Python interpreters that do
garbage collection, this allows the tests to be garbage collected if nothing
else is holding a reference to the test.  It is possible to override this
behavior by creating a @code{TestSuite} subclass that defines a
custom @code{_removeTestAtIndex} method.  (Contributed by Tom Wardill, Matt
McClure, and Andrew Svetlov in bpo-11798@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11798}.)

A new test assertion context-manager, @ref{a59,,assertLogs()},
will ensure that a given block of code emits a log message using the
@ref{8b,,logging} module.  By default the message can come from any logger and
have a priority of @code{INFO} or higher, but both the logger name and an
alternative minimum logging level may be specified.  The object returned by the
context manager can be queried for the @ref{11e5,,LogRecord}s and/or
formatted messages that were logged.  (Contributed by Antoine Pitrou in
bpo-18937@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18937}.)

Test discovery now works with namespace packages (Contributed by Claudiu Popa
in bpo-17457@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17457}.)

@ref{10d,,unittest.mock} objects now inspect their specification signatures when
matching calls, which means an argument can now be matched by either position
or name, instead of only by position.  (Contributed by Antoine Pitrou in
bpo-17015@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17015}.)

@ref{11e6,,mock_open()} objects now have @code{readline} and @code{readlines}
methods.  (Contributed by Toshio Kuratomi in bpo-17467@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17467}.)

@node venv<7>,wave<2>,unittest<10>,Improved Modules<4>
@anchor{whatsnew/3 4 venv}@anchor{11e7}
@subsubsection venv


@ref{117,,venv} now includes activation scripts for the @code{csh} and @code{fish}
shells.  (Contributed by Andrew Svetlov in bpo-15417@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15417}.)

@ref{570,,EnvBuilder} and the @ref{571,,create()} convenience function
take a new keyword argument `with_pip', which defaults to @code{False}, that
controls whether or not @code{EnvBuilder} ensures that @code{pip} is
installed in the virtual environment.  (Contributed by Nick Coghlan in
bpo-19552@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19552} as part of the 
@geindex Python 향상 제안; PEP 453
PEP 453@footnote{https://peps.python.org/pep-0453/} implementation.)

@node wave<2>,weakref<2>,venv<7>,Improved Modules<4>
@anchor{whatsnew/3 4 wave}@anchor{11e8}
@subsubsection wave


The @ref{11e9,,getparams()} method now returns a namedtuple rather
than a plain tuple.  (Contributed by Claudiu Popa in bpo-17487@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17487}.)

@ref{b45,,wave.open()} now supports the context management protocol.  (Contributed
by Claudiu Popa in bpo-17616@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17616}.)

@ref{119,,wave} can now @ref{11ea,,write output to unseekable files}.  (Contributed by David Jones, Guilherme Polo, and Serhiy
Storchaka in bpo-5202@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5202}.)

The @ref{11eb,,writeframesraw()} and
@ref{11ec,,writeframes()} methods now accept any @ref{193,,bytes-like object}.  (Contributed by Serhiy Storchaka in bpo-8311@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8311}.)

@node weakref<2>,xml etree<2>,wave<2>,Improved Modules<4>
@anchor{whatsnew/3 4 weakref}@anchor{11ed}
@subsubsection weakref


New @ref{11ee,,WeakMethod} class simulates weak references to bound
methods.  (Contributed by Antoine Pitrou in bpo-14631@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14631}.)

New @ref{c6e,,finalize} class makes it possible to register a callback
to be invoked when an object is garbage collected, without needing to
carefully manage the lifecycle of the weak reference itself.  (Contributed by
Richard Oudkerk in bpo-15528@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15528}.)

The callback, if any, associated with a @ref{11ef,,ref} is now
exposed via the @ref{11f0,,__callback__} attribute.  (Contributed
by Mark Dickinson in bpo-17643@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17643}.)

@node xml etree<2>,zipfile<6>,weakref<2>,Improved Modules<4>
@anchor{whatsnew/3 4 xml-etree}@anchor{11f1}
@subsubsection xml.etree


A new parser, @ref{11f2,,XMLPullParser}, allows a
non-blocking applications to parse XML documents.  An example can be
seen at @ref{11f3,,비 블로킹 구문 분석을 위한 풀(pull) API}.  (Contributed by Antoine
Pitrou in bpo-17741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17741}.)

The @ref{12b,,xml.etree.ElementTree} @ref{11f4,,tostring()} and
@ref{11f5,,tostringlist()} functions, and the
@ref{b47,,ElementTree}
@ref{c8b,,write()} method, now have a
`short_empty_elements' @ref{5a4,,keyword-only parameter}
providing control over whether elements with no content are written in
abbreviated (@code{<tag />}) or expanded (@code{<tag></tag>}) form.  (Contributed by
Ariel Poliak and Serhiy Storchaka in bpo-14377@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14377}.)

@node zipfile<6>,,xml etree<2>,Improved Modules<4>
@anchor{whatsnew/3 4 zipfile}@anchor{11f6}
@subsubsection zipfile


The @ref{11f7,,writepy()} method of the
@ref{11f8,,PyZipFile} class has a new `filterfunc' option that can be
used to control which directories and files are added to the archive.  For
example, this could be used to exclude test files from the archive.
(Contributed by Christian Tismer in bpo-19274@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19274}.)

The `allowZip64' parameter to @ref{8d2,,ZipFile} and
@ref{11f8,,PyZipFile} is now @code{True} by default.  (Contributed by
William Mallard in bpo-17201@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17201}.)

@node CPython Implementation Changes,Deprecated<8>,Improved Modules<4>,What’s New In Python 3 4
@anchor{whatsnew/3 4 cpython-implementation-changes}@anchor{11f9}
@subsection CPython Implementation Changes


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

@end menu

@node PEP 445 Customization of CPython Memory Allocators,PEP 442 Safe Object Finalization,,CPython Implementation Changes
@anchor{whatsnew/3 4 pep-445-customization-of-cpython-memory-allocators}@anchor{11fa}@anchor{whatsnew/3 4 whatsnew-pep-445}@anchor{10ef}
@subsubsection PEP 445: Customization of CPython Memory Allocators


@geindex Python 향상 제안; PEP 445
PEP 445@footnote{https://peps.python.org/pep-0445/} adds new C level interfaces to customize memory allocation in
the CPython interpreter.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 445

@item PEP 445@footnote{https://peps.python.org/pep-0445/} – Add new APIs to customize Python memory allocators

PEP written and implemented by Victor Stinner.
@end table


@node PEP 442 Safe Object Finalization,PEP 456 Secure and Interchangeable Hash Algorithm,PEP 445 Customization of CPython Memory Allocators,CPython Implementation Changes
@anchor{whatsnew/3 4 pep-442-safe-object-finalization}@anchor{11fb}@anchor{whatsnew/3 4 whatsnew-pep-442}@anchor{10ee}
@subsubsection PEP 442: Safe Object Finalization


@geindex Python 향상 제안; PEP 442
PEP 442@footnote{https://peps.python.org/pep-0442/} removes the current limitations and quirks of object finalization
in CPython. With it, objects with @ref{11fc,,__del__()} methods, as well as
generators with @ref{1b0,,finally} clauses, can be finalized when they are
part of a reference cycle.

As part of this change, module globals are no longer forcibly set to
@ref{884,,None} during interpreter shutdown in most cases, instead relying
on the normal operation of the cyclic garbage collector.  This avoids a
whole class of interpreter-shutdown-time errors, usually involving
@code{__del__} methods, that have plagued Python since the cyclic GC
was first introduced.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 442

@item PEP 442@footnote{https://peps.python.org/pep-0442/} – Safe object finalization

PEP written and implemented by Antoine Pitrou.
@end table


@node PEP 456 Secure and Interchangeable Hash Algorithm,PEP 436 Argument Clinic,PEP 442 Safe Object Finalization,CPython Implementation Changes
@anchor{whatsnew/3 4 pep-456-secure-and-interchangeable-hash-algorithm}@anchor{11fd}@anchor{whatsnew/3 4 whatsnew-pep-456}@anchor{10e8}
@subsubsection PEP 456: Secure and Interchangeable Hash Algorithm


@geindex Python 향상 제안; PEP 456
PEP 456@footnote{https://peps.python.org/pep-0456/} follows up on earlier security fix work done on Python’s hash
algorithm to address certain DOS attacks to which public facing APIs backed by
dictionary lookups may be subject.  (See bpo-14621@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14621} for the start of the
current round of improvements.)  The PEP unifies CPython’s hash code to make it
easier for a packager to substitute a different hash algorithm, and switches
Python’s default implementation to a SipHash implementation on platforms that
have a 64 bit data type.  Any performance differences in comparison with the
older FNV algorithm are trivial.

The PEP adds additional fields to the @ref{11fe,,sys.hash_info} named tuple to
describe the hash algorithm in use by the currently executing binary.  Otherwise,
the PEP does not alter any existing CPython APIs.

@node PEP 436 Argument Clinic,Other Build and C API Changes,PEP 456 Secure and Interchangeable Hash Algorithm,CPython Implementation Changes
@anchor{whatsnew/3 4 pep-436-argument-clinic}@anchor{11ff}@anchor{whatsnew/3 4 whatsnew-pep-436}@anchor{10f0}
@subsubsection PEP 436: Argument Clinic


“Argument Clinic” (
@geindex Python 향상 제안; PEP 436
PEP 436@footnote{https://peps.python.org/pep-0436/}) is now part of the CPython build process
and can be used to simplify the process of defining and maintaining
accurate signatures for builtins and standard library extension modules
implemented in C.

Some standard library extension modules have been converted to use Argument
Clinic in Python 3.4, and @ref{ba,,pydoc} and @ref{82,,inspect} have been updated
accordingly.

It is expected that signature metadata for programmatic introspection will
be added to additional callables implemented in C as part of Python 3.4
maintenance releases.

@cartouche
@quotation 참고 
The Argument Clinic PEP is not fully up to date with the state of the
implementation. This has been deemed acceptable by the release manager
and core development team in this case, as Argument Clinic will not
be made available as a public API for third party use in Python 3.4.
@end quotation
@end cartouche


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 436

@item PEP 436@footnote{https://peps.python.org/pep-0436/} – The Argument Clinic DSL

PEP written and implemented by Larry Hastings.
@end table


@node Other Build and C API Changes,Other Improvements,PEP 436 Argument Clinic,CPython Implementation Changes
@anchor{whatsnew/3 4 other-build-and-c-api-changes}@anchor{1200}
@subsubsection Other Build and C API Changes



@itemize *

@item 
The new @ref{a9c,,PyType_GetSlot()} function has been added to the stable ABI,
allowing retrieval of function pointers from named type slots when using
the limited API.  (Contributed by Martin von Löwis in bpo-17162@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17162}.)

@item 
The new @code{Py_SetStandardStreamEncoding()} pre-initialization API
allows applications embedding the CPython interpreter to reliably force
a particular encoding and error handler for the standard streams.
(Contributed by Bastien Montagne and Nick Coghlan in bpo-16129@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16129}.)

@item 
Most Python C APIs that don’t mutate string arguments are now correctly
marked as accepting @code{const char *} rather than @code{char *}.  (Contributed
by Serhiy Storchaka in bpo-1772673@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1772673}.)

@item 
A new shell version of @code{python-config} can be used even when a python
interpreter is not available (for example, in cross compilation scenarios).

@item 
@ref{629,,PyUnicode_FromFormat()} now supports width and precision
specifications for @code{%s}, @code{%A}, @code{%U}, @code{%V}, @code{%S}, and @code{%R}.
(Contributed by Ysj Ray and Victor Stinner in bpo-7330@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7330}.)

@item 
New function @ref{1201,,PyStructSequence_InitType2()} supplements the
existing @ref{1202,,PyStructSequence_InitType()} function.  The difference
is that it returns @code{0} on success and @code{-1} on failure.

@item 
The CPython source can now be compiled using the address sanity checking
features of recent versions of GCC and clang:  the false alarms in the small
object allocator have been silenced.  (Contributed by Dhiru Kholia in
bpo-18596@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18596}.)

@item 
The Windows build now uses Address Space Layout Randomization@footnote{https://en.wikipedia.org/wiki/Address_space_layout_randomization} and Data Execution Prevention@footnote{https://en.wikipedia.org/wiki/Data_Execution_Prevention}.  (Contributed by
Christian Heimes in bpo-16632@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16632}.)

@item 
New function @ref{1203,,PyObject_LengthHint()} is the C API equivalent
of @ref{116c,,operator.length_hint()}.  (Contributed by Armin Ronacher in
bpo-16148@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16148}.)
@end itemize

@node Other Improvements,Significant Optimizations,Other Build and C API Changes,CPython Implementation Changes
@anchor{whatsnew/3 4 other-improvements}@anchor{1204}@anchor{whatsnew/3 4 other-improvements-3-4}@anchor{1205}
@subsubsection Other Improvements

@anchor{whatsnew/3 4 whatsnew-isolated-mode}@anchor{10d9}

@itemize *

@item 
The @ref{1206,,python} command has a new @ref{1207,,option}, @code{-I}, which causes it to run in “isolated mode”,
which means that @ref{3e4,,sys.path} contains neither the script’s directory nor
the user’s @code{site-packages} directory, and all @code{PYTHON*} environment
variables are ignored (it implies both @code{-s} and @code{-E}).  Other
restrictions may also be applied in the future, with the goal being to
isolate the execution of a script from the user’s environment.  This is
appropriate, for example, when Python is used to run a system script.  On
most POSIX systems it can and should be used in the @code{#!} line of system
scripts.  (Contributed by Christian Heimes in bpo-16499@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16499}.)

@item 
Tab-completion is now enabled by default in the interactive interpreter
on systems that support @ref{bf,,readline}.  History is also enabled by default,
and is written to (and read from) the file @code{~/.python-history}.
(Contributed by Antoine Pitrou and Éric Araujo in bpo-5845@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5845}.)

@item 
Invoking the Python interpreter with @code{--version} now outputs the version to
standard output instead of standard error (bpo-18338@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18338}). Similar changes
were made to @ref{7,,argparse} (bpo-18920@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18920}) and other modules that have
script-like invocation capabilities (bpo-18922@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18922}).

@item 
The CPython Windows installer now adds @code{.py} to the 
@geindex PATHEXT
@geindex 환경 변수; PATHEXT
@code{PATHEXT}
variable when extensions are registered, allowing users to run a python
script at the windows command prompt by just typing its name without the
@code{.py} extension.  (Contributed by Paul Moore in bpo-18569@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18569}.)

@item 
A new @code{make} target coverage-report@footnote{https://devguide.python.org/coverage/#measuring-coverage-of-c-code-with-gcov-and-lcov}
will build python, run the test suite, and generate an HTML coverage report
for the C codebase using @code{gcov} and lcov@footnote{https://github.com/linux-test-project/lcov}.

@item 
The @code{-R} option to the @ref{1208,,python regression test suite} now
also checks for memory allocation leaks, using
@ref{11c6,,sys.getallocatedblocks()}.  (Contributed by Antoine Pitrou in
bpo-13390@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13390}.)

@item 
@code{python -m} now works with namespace packages.

@item 
The @ref{d6,,stat} module is now implemented in C, which means it gets the
values for its constants from the C header files, instead of having the
values hard-coded in the python module as was previously the case.

@item 
Loading multiple python modules from a single OS module (@code{.so}, @code{.dll})
now works correctly (previously it silently returned the first python
module in the file).  (Contributed by Václav Šmilauer in bpo-16421@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16421}.)

@item 
A new opcode, @code{LOAD_CLASSDEREF}, has been added to fix a bug in the
loading of free variables in class bodies that could be triggered by certain
uses of @ref{e57,,__prepare__}.  (Contributed by Benjamin Peterson in
bpo-17853@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17853}.)

@item 
A number of MemoryError-related crashes were identified and fixed by Victor
Stinner using his 
@geindex Python 향상 제안; PEP 445
PEP 445@footnote{https://peps.python.org/pep-0445/}-based @code{pyfailmalloc} tool (bpo-18408@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18408},
bpo-18520@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18520}).

@item 
The @code{pyvenv} command now accepts a @code{--copies} option
to use copies rather than symlinks even on systems where symlinks are the
default.  (Contributed by Vinay Sajip in bpo-18807@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18807}.)

@item 
The @code{pyvenv} command also accepts a @code{--without-pip}
option to suppress the otherwise-automatic bootstrapping of pip into
the virtual environment.  (Contributed by Nick Coghlan in bpo-19552@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19552}
as part of the 
@geindex Python 향상 제안; PEP 453
PEP 453@footnote{https://peps.python.org/pep-0453/} implementation.)

@item 
The encoding name is now optional in the value set for the
@geindex PYTHONIOENCODING
@geindex 환경 변수; PYTHONIOENCODING
@ref{1209,,PYTHONIOENCODING} environment variable.  This makes it possible to
set just the error handler, without changing the default encoding.
(Contributed by Serhiy Storchaka in bpo-18818@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18818}.)

@item 
The @ref{14,,bz2}, @ref{8e,,lzma}, and @ref{6b,,gzip} module @code{open} functions now
support @code{x} (exclusive creation) mode.  (Contributed by Tim Heaney and
Vajrasky Kok in bpo-19201@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19201}, bpo-19222@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19222}, and bpo-19223@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19223}.)
@end itemize

@node Significant Optimizations,,Other Improvements,CPython Implementation Changes
@anchor{whatsnew/3 4 significant-optimizations}@anchor{120a}
@subsubsection Significant Optimizations



@itemize *

@item 
The UTF-32 decoder is now 3x to 4x faster.  (Contributed by Serhiy Storchaka
in bpo-14625@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14625}.)

@item 
The cost of hash collisions for sets is now reduced.  Each hash table
probe now checks a series of consecutive, adjacent key/hash pairs before
continuing to make random probes through the hash table.  This exploits
cache locality to make collision resolution less expensive.
The collision resolution scheme can be described as a hybrid of linear
probing and open addressing.  The number of additional linear probes
defaults to nine.  This can be changed at compile-time by defining
LINEAR_PROBES to be any value.  Set LINEAR_PROBES=0 to turn-off
linear probing entirely.  (Contributed by Raymond Hettinger in
bpo-18771@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18771}.)

@item 
The interpreter starts about 30% faster. A couple of measures lead to the
speedup. The interpreter loads fewer modules on startup, e.g. the @ref{be,,re},
@ref{1e,,collections} and @ref{8a,,locale} modules and their dependencies are no
longer imported by default. The marshal module has been improved to load
compiled Python code faster.  (Contributed by Antoine Pitrou, Christian
Heimes and Victor Stinner in bpo-19219@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19219}, bpo-19218@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19218}, bpo-19209@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19209},
bpo-19205@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19205} and bpo-9548@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9548}.)

@item 
@ref{a66,,bz2.BZ2File} is now as fast or faster than the Python2 version for
most cases.  @ref{120b,,lzma.LZMAFile} has also been optimized.  (Contributed by
Serhiy Storchaka and Nadeem Vawda in bpo-16034@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16034}.)

@item 
@ref{120c,,random.getrandbits()} is 20%-40% faster for small integers (the most
common use case).  (Contributed by Serhiy Storchaka in bpo-16674@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16674}.)

@item 
By taking advantage of the new storage format for strings, pickling of
strings is now significantly faster.  (Contributed by Victor Stinner and
Antoine Pitrou in bpo-15596@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15596}.)

@item 
A performance issue in @code{io.FileIO.readall()} has been solved.  This
particularly affects Windows, and significantly speeds up the case of piping
significant amounts of data through @ref{dc,,subprocess}.  (Contributed
by Richard Oudkerk in bpo-15758@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15758}.)

@item 
@ref{120d,,html.escape()} is now 10x faster.  (Contributed by Matt Bryant in
bpo-18020@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18020}.)

@item 
On Windows, the native @code{VirtualAlloc} is now used instead of the CRT
@code{malloc} in @code{obmalloc}.  Artificial benchmarks show about a 3% memory
savings.

@item 
@ref{745,,os.urandom()} now uses a lazily opened persistent file descriptor
so as to avoid using many file descriptors when run in parallel from
multiple threads.  (Contributed by Antoine Pitrou in bpo-18756@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18756}.)
@end itemize

@node Deprecated<8>,Removed<8>,CPython Implementation Changes,What’s New In Python 3 4
@anchor{whatsnew/3 4 deprecated}@anchor{120e}@anchor{whatsnew/3 4 deprecated-3-4}@anchor{1108}
@subsection Deprecated


This section covers various APIs and other features that have been deprecated
in Python 3.4, and will be removed in Python 3.5 or later.  In most (but not
all) cases, using the deprecated APIs will produce a @ref{1a3,,DeprecationWarning}
when the interpreter is run with deprecation warnings enabled (for example, by
using @code{-Wd}).

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

@end menu

@node Deprecations in the Python API,Deprecated Features,,Deprecated<8>
@anchor{whatsnew/3 4 deprecations-in-the-python-api}@anchor{120f}
@subsubsection Deprecations in the Python API



@itemize *

@item 
As mentioned in @ref{10db,,PEP 451; A ModuleSpec Type for the Import System}, a number of @ref{7b,,importlib}
methods and functions are deprecated: @code{importlib.find_loader()} is
replaced by @ref{5ae,,importlib.util.find_spec()};
@code{importlib.machinery.PathFinder.find_module()} is replaced by
@ref{1210,,importlib.machinery.PathFinder.find_spec()};
@code{importlib.abc.MetaPathFinder.find_module()} is replaced by
@ref{a68,,importlib.abc.MetaPathFinder.find_spec()};
@code{importlib.abc.PathEntryFinder.find_loader()} and
@code{find_module()} are replaced by
@ref{a6c,,importlib.abc.PathEntryFinder.find_spec()}; all of the @code{@var{xxx}Loader} ABC
@code{load_module} methods (@code{importlib.abc.Loader.load_module()},
@code{importlib.abc.InspectLoader.load_module()},
@code{importlib.abc.FileLoader.load_module()},
@code{importlib.abc.SourceLoader.load_module()}) should no longer be
implemented, instead loaders should implement an
@code{exec_module} method
(@ref{a6a,,importlib.abc.Loader.exec_module()},
@ref{1211,,importlib.abc.InspectLoader.exec_module()}
@ref{1212,,importlib.abc.SourceLoader.exec_module()}) and let the import system
take care of the rest; and
@code{importlib.abc.Loader.module_repr()},
@code{importlib.util.module_for_loader()}, @code{importlib.util.set_loader()},
and @code{importlib.util.set_package()} are no longer needed because their
functions are now handled automatically by the import system.

@item 
The @code{imp} module is pending deprecation. To keep compatibility with
Python 2/3 code bases, the module’s removal is currently not scheduled.

@item 
The @code{formatter} module is pending deprecation and is slated for removal
in Python 3.6.

@item 
@code{MD5} as the default `digestmod' for the @ref{c95,,hmac.new()} function is
deprecated.  Python 3.6 will require an explicit digest name or constructor as
`digestmod' argument.

@item 
The internal @code{Netrc} class in the @ref{62,,ftplib} module has been documented
as deprecated in its docstring for quite some time.  It now emits a
@ref{1a3,,DeprecationWarning} and will be removed completely in Python 3.5.

@item 
The undocumented `endtime' argument to @ref{edf,,subprocess.Popen.wait()} should
not have been exposed and is hopefully not in use; it is deprecated and
will mostly likely be removed in Python 3.5.

@item 
The `strict' argument of @ref{a77,,HTMLParser} is deprecated.

@item 
The @ref{b0,,plistlib} @code{readPlist()},
@code{writePlist()}, @code{readPlistFromBytes()}, and
@code{writePlistToBytes()} functions are deprecated in favor of the
corresponding new functions @ref{b48,,load()}, @ref{b4a,,dump()},
@ref{b49,,loads()}, and @ref{b4b,,dumps()}.  @code{Data()}
is deprecated in favor of just using the @ref{192,,bytes} constructor.

@item 
The @ref{e1,,sysconfig} key @code{SO} is deprecated, it has been replaced by
@code{EXT_SUFFIX}.

@item 
The @code{U} mode accepted by various @code{open} functions is deprecated.
In Python3 it does not do anything useful, and should be replaced by
appropriate uses of @ref{9be,,io.TextIOWrapper} (if needed) and its `newline'
argument.

@item 
The `parser' argument of @ref{579,,xml.etree.ElementTree.iterparse()} has
been deprecated, as has the `html' argument of
@ref{c48,,XMLParser()}.  To prepare for the removal of the
latter, all arguments to @code{XMLParser} should be passed by keyword.
@end itemize

@node Deprecated Features,,Deprecations in the Python API,Deprecated<8>
@anchor{whatsnew/3 4 deprecated-features}@anchor{1213}
@subsubsection Deprecated Features



@itemize *

@item 
Running @ref{1214,,IDLE — 파이썬 편집기와 셸} with the @code{-n} flag (no subprocess) is deprecated.
However, the feature will not be removed until bpo-18823@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18823} is resolved.

@item 
The site module adding a “site-python” directory to sys.path, if it
exists, is deprecated (bpo-19375@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19375}).
@end itemize

@node Removed<8>,Porting to Python 3 4,Deprecated<8>,What’s New In Python 3 4
@anchor{whatsnew/3 4 removed}@anchor{1215}
@subsection Removed


@menu
* Operating Systems No Longer Supported:: 
* API and Feature Removals:: 
* Code Cleanups:: 

@end menu

@node Operating Systems No Longer Supported,API and Feature Removals,,Removed<8>
@anchor{whatsnew/3 4 operating-systems-no-longer-supported}@anchor{1216}
@subsubsection Operating Systems No Longer Supported


Support for the following operating systems has been removed from the source
and build tools:


@itemize *

@item 
OS/2 (bpo-16135@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16135}).

@item 
Windows 2000 (changeset e52df05b496a).

@item 
Windows systems where @code{COMSPEC} points to @code{command.com} (bpo-14470@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14470}).

@item 
VMS (bpo-16136@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16136}).
@end itemize

@node API and Feature Removals,Code Cleanups,Operating Systems No Longer Supported,Removed<8>
@anchor{whatsnew/3 4 api-and-feature-removals}@anchor{1217}
@subsubsection API and Feature Removals


The following obsolete and previously deprecated APIs and features have been
removed:


@itemize *

@item 
The unmaintained @code{Misc/TextMate} and @code{Misc/vim} directories have been
removed (see the devguide@footnote{https://devguide.python.org}
for suggestions on what to use instead).

@item 
The @code{SO} makefile macro is removed (it was replaced by the
@code{SHLIB_SUFFIX} and @code{EXT_SUFFIX} macros) (bpo-16754@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16754}).

@item 
The @code{PyThreadState.tick_counter} field has been removed; its value has
been meaningless since Python 3.2, when the “new GIL” was introduced
(bpo-19199@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19199}).

@item 
@code{PyLoader} and @code{PyPycLoader} have been removed from @ref{7b,,importlib}.
(Contributed by Taras Lyapun in bpo-15641@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15641}.)

@item 
The `strict' argument to @ref{d34,,HTTPConnection} and
@ref{d35,,HTTPSConnection} has been removed.  HTTP 0.9-style
“Simple Responses” are no longer supported.

@item 
The deprecated @ref{11d7,,urllib.request.Request} getter and setter methods
@code{add_data}, @code{has_data}, @code{get_data}, @code{get_type}, @code{get_host},
@code{get_selector}, @code{set_proxy}, @code{get_origin_req_host}, and
@code{is_unverifiable} have been removed (use direct attribute access instead).

@item 
Support for loading the deprecated @code{TYPE_INT64} has been removed from
@ref{91,,marshal}.  (Contributed by Dan Riti in bpo-15480@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15480}.)

@item 
@ref{4e3,,inspect.Signature}: positional-only parameters are now required
to have a valid name.

@item 
@ref{830,,object.__format__()} no longer accepts non-empty format strings, it now
raises a @ref{198,,TypeError} instead.  Using a non-empty string has been
deprecated since Python 3.2.  This change has been made to prevent a
situation where previously working (but incorrect) code would start failing
if an object gained a __format__ method, which means that your code may now
raise a @code{TypeError} if you are using an @code{'s'} format code with objects
that do not have a __format__ method that handles it.  See bpo-7994@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7994} for
background.

@item 
@code{difflib.SequenceMatcher.isbjunk()} and
@code{difflib.SequenceMatcher.isbpopular()} were deprecated in 3.2, and have
now been removed: use @code{x in sm.bjunk} and
@code{x in sm.bpopular}, where `sm' is a @ref{1218,,SequenceMatcher} object
(bpo-13248@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13248}).
@end itemize

@node Code Cleanups,,API and Feature Removals,Removed<8>
@anchor{whatsnew/3 4 code-cleanups}@anchor{1219}
@subsubsection Code Cleanups



@itemize *

@item 
The unused and undocumented internal @code{Scanner} class has been removed from
the @ref{ba,,pydoc} module.

@item 
The private and effectively unused @code{_gestalt} module has been removed,
along with the private @ref{af,,platform} functions @code{_mac_ver_lookup},
@code{_mac_ver_gstalt}, and @code{_bcd2str}, which would only have ever been called
on badly broken OSX systems (see bpo-18393@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18393}).

@item 
The hardcoded copies of certain @ref{d6,,stat} constants that were included in
the @ref{e4,,tarfile} module namespace have been removed.
@end itemize

@node Porting to Python 3 4,Changed in 3 4 3,Removed<8>,What’s New In Python 3 4
@anchor{whatsnew/3 4 porting-to-python-3-4}@anchor{121a}
@subsection Porting to Python 3.4


This section lists previously described changes and other bugfixes
that may require changes to your code.

@menu
* Changes in ‘python’ Command Behavior:: 
* Changes in the Python API: Changes in the Python API<4>. 
* Changes in the C API: Changes in the C API<3>. 

@end menu

@node Changes in ‘python’ Command Behavior,Changes in the Python API<4>,,Porting to Python 3 4
@anchor{whatsnew/3 4 changes-in-python-command-behavior}@anchor{121b}
@subsubsection Changes in ‘python’ Command Behavior



@itemize *

@item 
In a posix shell, setting the 
@geindex PATH
@geindex 환경 변수; PATH
@code{PATH} environment variable to
an empty value is equivalent to not setting it at all.  However, setting
@geindex PYTHONPATH
@geindex 환경 변수; PYTHONPATH
@ref{121c,,PYTHONPATH} to an empty value was `not' equivalent to not setting it
at all: setting 
@geindex PYTHONPATH
@geindex 환경 변수; PYTHONPATH
@code{PYTHONPATH} to an empty value was equivalent to
setting it to @code{.}, which leads to confusion when reasoning by analogy to
how 
@geindex PATH
@geindex 환경 변수; PATH
@code{PATH} works.  The behavior now conforms to the posix convention
for 
@geindex PATH
@geindex 환경 변수; PATH
@code{PATH}.

@item 
The [X refs, Y blocks] output of a debug (@code{--with-pydebug}) build of the
CPython interpreter is now off by default.  It can be re-enabled using the
@code{-X showrefcount} option.  (Contributed by Ezio Melotti in bpo-17323@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17323}.)

@item 
The python command and most stdlib scripts (as well as @ref{7,,argparse}) now
output @code{--version} information to @code{stdout} instead of @code{stderr} (for
issue list see @ref{1205,,Other Improvements} above).
@end itemize

@node Changes in the Python API<4>,Changes in the C API<3>,Changes in ‘python’ Command Behavior,Porting to Python 3 4
@anchor{whatsnew/3 4 changes-in-the-python-api}@anchor{121d}
@subsubsection Changes in the Python API



@itemize *

@item 
The ABCs defined in @ref{7c,,importlib.abc} now either raise the appropriate
exception or return a default value instead of raising
@ref{36b,,NotImplementedError} blindly. This will only affect code calling
@ref{1a6,,super()} and falling through all the way to the ABCs. For compatibility,
catch both @code{NotImplementedError} or the appropriate exception as needed.

@item 
The module type now initializes the @ref{323,,__package__} and
@ref{33b,,__loader__}
attributes to @code{None} by default. To determine if these attributes were set
in a backwards-compatible fashion, use e.g.
@code{getattr(module, '__loader__', None) is not None}.  (bpo-17115@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17115}.)

@item 
@code{importlib.util.module_for_loader()} now sets @code{__loader__} and
@code{__package__} unconditionally to properly support reloading. If this is not
desired then you will need to set these attributes manually. You can use
@code{importlib.util.module_to_load()} for module management.

@item 
Import now resets relevant attributes (e.g. @code{__name__}, @code{__loader__},
@code{__package__}, @code{__file__}, @code{__cached__}) unconditionally when reloading.
Note that this restores a pre-3.3 behavior in that it means a module is
re-found when re-loaded (bpo-19413@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19413}).

@item 
Frozen packages no longer set @code{__path__} to a list containing the package
name, they now set it to an empty list.  The previous behavior could cause
the import system to do the wrong thing on submodule imports if there was
also a directory with the same name as the frozen package.  The correct way
to determine if a module is a package or not is to use @code{hasattr(module,
'__path__')} (bpo-18065@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18065}).

@item 
Frozen modules no longer define a @code{__file__} attribute. It’s semantically
incorrect for frozen modules to set the attribute as they are not loaded from
any explicit location. If you must know that a module comes from frozen code
then you can see if the module’s @code{__spec__.location} is set to @code{'frozen'},
check if the loader is a subclass of
@ref{121e,,importlib.machinery.FrozenImporter},
or if Python 2 compatibility is necessary you can use @code{imp.is_frozen()}.

@item 
@ref{c19,,py_compile.compile()} now raises @ref{121f,,FileExistsError} if the file path
it would write to is a symlink or a non-regular file. This is to act as a
warning that import will overwrite those files with a regular file regardless
of what type of file path they were originally.

@item 
@ref{1220,,importlib.abc.SourceLoader.get_source()} no longer raises
@ref{659,,ImportError} when the source code being loaded triggers a
@ref{18e,,SyntaxError} or @ref{c07,,UnicodeDecodeError}. As @code{ImportError} is
meant to be raised only when source code cannot be found but it should, it was
felt to be over-reaching/overloading of that meaning when the source code is
found but improperly structured. If you were catching ImportError before and
wish to continue to ignore syntax or decoding issues, catch all three
exceptions now.

@item 
@ref{1221,,functools.update_wrapper()} and @ref{115c,,functools.wraps()} now correctly
set the @code{__wrapped__} attribute to the function being wrapped, even if
that function also had its @code{__wrapped__} attribute set. This means
@code{__wrapped__} attributes now correctly link a stack of decorated
functions rather than every @code{__wrapped__} attribute in the chain
referring to the innermost function. Introspection libraries that
assumed the previous behaviour was intentional can use
@ref{115b,,inspect.unwrap()} to access the first function in the chain that has
no @code{__wrapped__} attribute.

@item 
@ref{940,,inspect.getfullargspec()} has been reimplemented on top of
@ref{22f,,inspect.signature()} and hence handles a much wider variety of callable
objects than it did in the past. It is expected that additional builtin and
extension module callables will gain signature metadata over the course of
the Python 3.4 series. Code that assumes that
@code{inspect.getfullargspec()} will fail on non-Python callables may need
to be adjusted accordingly.

@item 
@ref{1222,,importlib.machinery.PathFinder} now passes on the current working
directory to objects in @ref{1223,,sys.path_hooks} for the empty string. This
results in @ref{7f9,,sys.path_importer_cache} never containing @code{'@w{'}}, thus
iterating through @code{sys.path_importer_cache} based on @ref{3e4,,sys.path}
will not find all keys. A module’s @code{__file__} when imported in the current
working directory will also now have an absolute path, including when using
@code{-m} with the interpreter (except for @code{__main__.__file__} when a script
has been executed directly using a relative path) (Contributed by Brett
Cannon in bpo-18416@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18416}).  is specified on the command-line)
(bpo-18416@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18416}).

@item 
The removal of the `strict' argument to @ref{d34,,HTTPConnection}
and @ref{d35,,HTTPSConnection} changes the meaning of the
remaining arguments if you are specifying them positionally rather than by
keyword.  If you’ve been paying attention to deprecation warnings your code
should already be specifying any additional arguments via keywords.

@item 
Strings between @code{from __future__ import ...} statements now `always' raise
a @ref{18e,,SyntaxError}.  Previously if there was no leading docstring, an
interstitial string would sometimes be ignored.  This brings CPython into
compliance with the language spec; Jython and PyPy already were.
(bpo-17434@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17434}).

@item 
@ref{11b7,,ssl.SSLSocket.getpeercert()} and @ref{106c,,ssl.SSLSocket.do_handshake()}
now raise an @ref{2c0,,OSError} with @code{ENOTCONN} when the @code{SSLSocket} is not
connected, instead of the previous behavior of raising an
@ref{5ee,,AttributeError}.  In addition, @code{getpeercert()}
will raise a @ref{2ec,,ValueError} if the handshake has not yet been done.

@item 
@ref{1224,,base64.b32decode()} now raises a @ref{1225,,binascii.Error} when the
input string contains non-b32-alphabet characters, instead of a
@ref{198,,TypeError}.  This particular @code{TypeError} was missed when the other
@code{TypeError}s were converted.  (Contributed by Serhiy Storchaka in
bpo-18011@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18011}.)  Note: this change was also inadvertently applied in Python
3.3.3.

@item 
The @code{file} attribute is now automatically closed when
the creating @code{cgi.FieldStorage} instance is garbage collected. If you
were pulling the file object out separately from the @code{cgi.FieldStorage}
instance and not keeping the instance alive, then you should either store the
entire @code{cgi.FieldStorage} instance or read the contents of the file
before the @code{cgi.FieldStorage} instance is garbage collected.

@item 
Calling @code{read} or @code{write} on a closed SSL socket now raises an
informative @ref{2ec,,ValueError} rather than the previous more mysterious
@ref{5ee,,AttributeError} (bpo-9177@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9177}).

@item 
@ref{1226,,slice.indices()} no longer produces an @ref{a81,,OverflowError} for huge
values.  As a consequence of this fix, @code{slice.indices()} now raises a
@ref{2ec,,ValueError} if given a negative length; previously it returned nonsense
values (bpo-14794@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14794}).

@item 
The @ref{197,,complex} constructor, unlike the @ref{19,,cmath} functions, was
incorrectly accepting @ref{196,,float} values if an object’s @code{__complex__}
special method returned one.  This now raises a @ref{198,,TypeError}.
(bpo-16290@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16290}.)

@item 
The @ref{19b,,int} constructor in 3.2 and 3.3 erroneously accepts @ref{196,,float}
values for the `base' parameter.  It is unlikely anyone was doing this, but
if so, it will now raise a @ref{198,,TypeError} (bpo-16772@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16772}).

@item 
Defaults for keyword-only arguments are now evaluated `after' defaults for
regular keyword arguments, instead of before.  Hopefully no one wrote any
code that depends on the previous buggy behavior (bpo-16967@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16967}).

@item 
Stale thread states are now cleared after @ref{4b6,,fork()}.  This may cause
some system resources to be released that previously were incorrectly kept
perpetually alive (for example, database connections kept in thread-local
storage).  (bpo-17094@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17094}.)

@item 
Parameter names in @code{__annotations__} dicts are now mangled properly,
similarly to @ref{1227,,__kwdefaults__}.
(Contributed by Yury Selivanov in bpo-20625@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20625}.)

@item 
@ref{1146,,hashlib.hash.name} now always returns the identifier in lower case.
Previously some builtin hashes had uppercase names, but now that it is a
formal public interface the naming has been made consistent (bpo-18532@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18532}).

@item 
Because @ref{ff4,,unittest.TestSuite} now drops references to tests after they
are run, test harnesses that reuse a @ref{ff4,,TestSuite} to re-run
a set of tests may fail.   Test suites should not be re-used in this fashion
since it means state is retained between test runs, breaking the test
isolation that @ref{10c,,unittest} is designed to provide.  However, if the lack
of isolation is considered acceptable, the old behavior can be restored by
creating a @code{TestSuite} subclass that defines a
@code{_removeTestAtIndex} method that does nothing (see
@ref{1228,,TestSuite.__iter__()}) (bpo-11798@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11798}).

@item 
@ref{10c,,unittest} now uses @ref{7,,argparse} for command line parsing.  There are
certain invalid command forms that used to work that are no longer allowed;
in theory this should not cause backward compatibility issues since the
disallowed command forms didn’t make any sense and are unlikely to be in use.

@item 
The @ref{5a1,,re.split()}, @ref{1229,,re.findall()}, and @ref{5a2,,re.sub()} functions, and
the @ref{122a,,group()} and @ref{122b,,groups()} methods of
@code{match} objects now always return a `bytes' object when the string
to be matched is a @ref{193,,bytes-like object}.  Previously the return type
matched the input type, so if your code was depending on the return value
being, say, a @code{bytearray}, you will need to change your code.

@item 
@code{audioop} functions now raise an error immediately if passed string
input, instead of failing randomly later on (bpo-16685@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16685}).

@item 
The new `convert_charrefs' argument to @ref{a77,,HTMLParser}
currently defaults to @code{False} for backward compatibility, but will
eventually be changed to default to @code{True}.  It is recommended that you add
this keyword, with the appropriate value, to any
@code{HTMLParser} calls in your code (bpo-13633@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13633}).

@item 
Since the `digestmod' argument to the @ref{c95,,hmac.new()} function will in the
future have no default, all calls to @code{hmac.new()} should be changed to
explicitly specify a `digestmod' (bpo-17276@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17276}).

@item 
Calling @ref{174,,sysconfig.get_config_var()} with the @code{SO} key, or looking
@code{SO} up in the results of a call to @ref{298,,sysconfig.get_config_vars()}
is deprecated.  This key should be replaced by @code{EXT_SUFFIX} or
@code{SHLIB_SUFFIX}, depending on the context (bpo-19555@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19555}).

@item 
Any calls to @code{open} functions that specify @code{U} should be modified.
@code{U} is ineffective in Python3 and will eventually raise an error if used.
Depending on the function, the equivalent of its old Python2 behavior can be
achieved using either a `newline' argument, or if necessary by wrapping the
stream in @ref{9be,,TextIOWrapper} to use its `newline' argument
(bpo-15204@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15204}).

@item 
If you use @code{pyvenv} in a script and desire that pip
`not' be installed, you must add @code{--without-pip} to your command
invocation.

@item 
The default behavior of @ref{f3f,,json.dump()} and @ref{f40,,json.dumps()} when
an indent is specified has changed: it no longer produces trailing
spaces after the item separating commas at the ends of lines.  This
will matter only if you have tests that are doing white-space-sensitive
comparisons of such output (bpo-16333@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16333}).

@item 
@ref{3e,,doctest} now looks for doctests in extension module @code{__doc__}
strings, so if your doctest test discovery includes extension modules that
have things that look like doctests in them you may see test failures you’ve
never seen before when running your tests (bpo-3158@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=3158}).

@item 
The @ref{1f,,collections.abc} module has been slightly refactored as
part of the Python startup improvements.  As a consequence of this, it is no
longer the case that importing @ref{1e,,collections} automatically imports
@code{collections.abc}.  If your program depended on the (undocumented)
implicit import, you will need to add an explicit @code{import collections.abc}
(bpo-20784@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20784}).
@end itemize

@node Changes in the C API<3>,,Changes in the Python API<4>,Porting to Python 3 4
@anchor{whatsnew/3 4 changes-in-the-c-api}@anchor{122c}
@subsubsection Changes in the C API



@itemize *

@item 
@ref{122d,,PyEval_EvalFrameEx()}, @ref{122e,,PyObject_Repr()}, and
@ref{122f,,PyObject_Str()}, along with some other internal C APIs, now include
a debugging assertion that ensures they are not used in situations where
they may silently discard a currently active exception. In cases where
discarding the active exception is expected and desired (for example,
because it has already been saved locally with @ref{428,,PyErr_Fetch()} or
is being deliberately replaced with a different exception), an explicit
@ref{1230,,PyErr_Clear()} call will be needed to avoid triggering the
assertion when invoking these operations (directly or indirectly) and
running against a version of Python that is compiled with assertions
enabled.

@item 
@ref{f38,,PyErr_SetImportError()} now sets @ref{198,,TypeError} when its `msg'
argument is not set. Previously only @code{NULL} was returned with no exception
set.

@item 
The result of the @ref{7a4,,PyOS_ReadlineFunctionPointer} callback must
now be a string allocated by @ref{62f,,PyMem_RawMalloc()} or
@ref{631,,PyMem_RawRealloc()}, or @code{NULL} if an error occurred, instead of a
string allocated by @ref{e5e,,PyMem_Malloc()} or @ref{1231,,PyMem_Realloc()}
(bpo-16742@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16742})

@item 
@ref{43b,,PyThread_set_key_value()} now always set the value. In Python
3.3, the function did nothing if the key already exists (if the current
value is a non-@code{NULL} pointer).

@item 
The @code{f_tstate} (thread state) field of the @ref{98b,,PyFrameObject}
structure has been removed to fix a bug: see bpo-14432@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14432} for the
rationale.
@end itemize

@node Changed in 3 4 3,,Porting to Python 3 4,What’s New In Python 3 4
@anchor{whatsnew/3 4 changed-in-3-4-3}@anchor{1232}
@subsection Changed in 3.4.3


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

@end menu

@node PEP 476 Enabling certificate verification by default for stdlib http clients,,,Changed in 3 4 3
@anchor{whatsnew/3 4 pep-476}@anchor{1233}@anchor{whatsnew/3 4 pep-476-enabling-certificate-verification-by-default-for-stdlib-http-clients}@anchor{1234}
@subsubsection PEP 476: Enabling certificate verification by default for stdlib http clients


@ref{73,,http.client} and modules which use it, such as @ref{111,,urllib.request} and
@ref{134,,xmlrpc.client}, will now verify that the server presents a certificate
which is signed by a CA in the platform trust store and whose hostname matches
the hostname being requested by default, significantly improving security for
many applications.

For applications which require the old previous behavior, they can pass an
alternate context:

@example
import urllib.request
import ssl

# This disables all verification
context = ssl._create_unverified_context()

# This allows using a specific certificate for the host, which doesn't need
# to be in the trust store
context = ssl.create_default_context(cafile="/path/to/file.crt")

urllib.request.urlopen("https://invalid-cert", context=context)
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node What’s New In Python 3 3,What’s New In Python 3 2,What’s New In Python 3 4,파이썬의 새로운 기능
@anchor{whatsnew/3 3 doc}@anchor{1235}@anchor{whatsnew/3 3 translation-repo}@anchor{1236}@anchor{whatsnew/3 3 what-s-new-in-python-3-3}@anchor{1237}
@section What’s New In Python 3.3


@c Rules for maintenance:
@c 
@c * Anyone can add text to this document.  Do not spend very much time
@c on the wording of your changes, because your text will probably
@c get rewritten to some degree.
@c 
@c * The maintainer will go through Misc/NEWS periodically and add
@c changes; it's therefore more important to add your changes to
@c Misc/NEWS than to this file.
@c 
@c * This is not a complete list of every single change; completeness
@c is the purpose of Misc/NEWS.  Some changes I consider too small
@c or esoteric to include.  If such a change is added to the text,
@c I'll just remove it.  (This is another reason you shouldn't spend
@c too much time on writing your addition.)
@c 
@c * If you want to draw your new text to the attention of the
@c maintainer, add 'XXX' to the beginning of the paragraph or
@c section.
@c 
@c * It's OK to just add a fragmentary note about a change.  For
@c example: "XXX Describe the transmogrify() function added to the
@c socket module."  The maintainer will research the change and
@c write the necessary text.
@c 
@c * You can comment out your additions if you like, but it's not
@c necessary (especially when a final release is some months away).
@c 
@c * Credit the author of a patch or bugfix.   Just the name is
@c sufficient; the e-mail address isn't necessary.
@c 
@c * It's helpful to add the bug/patch number as a comment:
@c 
@c XXX Describe the transmogrify() function added to the socket
@c module.
@c (Contributed by P.Y. Developer in :issue:`12345`.)
@c 
@c This saves the maintainer the effort of going through the Mercurial log
@c when researching a change.

This article explains the new features in Python 3.3, compared to 3.2.
Python 3.3 was released on September 29, 2012.  For full details,
see the changelog@footnote{https://docs.python.org/3.3/whatsnew/changelog.html}.


@subsubheading 더 보기


@geindex Python 향상 제안; PEP 398
PEP 398@footnote{https://peps.python.org/pep-0398/} - Python 3.3 Release Schedule


@menu
* Summary – Release highlights: Summary – Release highlights<5>. 
* 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<5>. 
* A Finer-Grained Import Lock:: 
* Builtin functions and types:: 
* New Modules: New Modules<5>. 
* Improved Modules: Improved Modules<5>. 
* Optimizations: Optimizations<5>. 
* Build and C API Changes:: 
* Deprecated: Deprecated<9>. 
* Porting to Python 3.3: Porting to Python 3 3. 

@end menu

@node Summary – Release highlights<5>,PEP 405 Virtual Environments,,What’s New In Python 3 3
@anchor{whatsnew/3 3 summary-release-highlights}@anchor{1238}
@subsection Summary – Release highlights


@c This section singles out the most important changes in Python 3.3.
@c Brevity is key.

New syntax features:


@itemize *

@item 
New @code{yield from} expression for @ref{1239,,generator delegation}.

@item 
The @code{u'unicode'} syntax is accepted again for @ref{169,,str} objects.
@end itemize

New library modules:


@itemize *

@item 
@ref{5c,,faulthandler} (helps debugging low-level crashes)

@item 
@ref{84,,ipaddress} (high-level objects representing IP addresses and masks)

@item 
@ref{8e,,lzma} (compress data using the XZ / LZMA algorithm)

@item 
@ref{10d,,unittest.mock} (replace parts of your system under test with mock objects)

@item 
@ref{117,,venv} (Python @ref{123a,,virtual environments}, as in the
popular @code{virtualenv} package)
@end itemize

New built-in features:


@itemize *

@item 
Reworked @ref{123b,,I/O exception hierarchy}.
@end itemize

Implementation improvements:


@itemize *

@item 
Rewritten @ref{123c,,import machinery} based on @ref{7b,,importlib}.

@item 
More compact @ref{123d,,unicode strings}.

@item 
More compact @ref{123e,,attribute dictionaries}.
@end itemize

Significantly Improved Library Modules:


@itemize *

@item 
C Accelerator for the @ref{123f,,decimal} module.

@item 
Better unicode handling in the @ref{1240,,email} module
(@ref{1241,,provisional}).
@end itemize

Security improvements:


@itemize *

@item 
Hash randomization is switched on by default.
@end itemize

Please read on for a comprehensive list of user-facing changes.

@node PEP 405 Virtual Environments,PEP 420 Implicit Namespace Packages,Summary – Release highlights<5>,What’s New In Python 3 3
@anchor{whatsnew/3 3 pep-405}@anchor{123a}@anchor{whatsnew/3 3 pep-405-virtual-environments}@anchor{1242}
@subsection PEP 405: Virtual Environments


Virtual environments help create separate Python setups while sharing a
system-wide base install, for ease of maintenance.  Virtual environments
have their own set of private site packages (i.e. locally installed
libraries), and are optionally segregated from the system-wide site
packages.  Their concept and implementation are inspired by the popular
@code{virtualenv} third-party package, but benefit from tighter integration
with the interpreter core.

This PEP adds the @ref{117,,venv} module for programmatic access, and the
@code{pyvenv} script for command-line access and
administration.  The Python interpreter checks for a @code{pyvenv.cfg},
file whose existence signals the base of a virtual environment’s directory
tree.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 405

@item PEP 405@footnote{https://peps.python.org/pep-0405/} - Python Virtual Environments

PEP written by Carl Meyer; implementation by Carl Meyer and Vinay Sajip
@end table


@node PEP 420 Implicit Namespace Packages,PEP 3118 New memoryview implementation and buffer protocol documentation,PEP 405 Virtual Environments,What’s New In Python 3 3
@anchor{whatsnew/3 3 pep-420-implicit-namespace-packages}@anchor{1243}
@subsection PEP 420: Implicit Namespace Packages


Native support for package directories that don’t require @code{__init__.py}
marker files and can automatically span multiple path segments (inspired by
various third party approaches to namespace packages, as described in
@geindex Python 향상 제안; PEP 420
PEP 420@footnote{https://peps.python.org/pep-0420/})


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 420

@item PEP 420@footnote{https://peps.python.org/pep-0420/} - Implicit Namespace Packages

PEP written by Eric V. Smith; implementation by Eric V. Smith
and Barry Warsaw
@end table


@node PEP 3118 New memoryview implementation and buffer protocol documentation,PEP 393 Flexible String Representation,PEP 420 Implicit Namespace Packages,What’s New In Python 3 3
@anchor{whatsnew/3 3 pep-3118-new-memoryview-implementation-and-buffer-protocol-documentation}@anchor{1244}@anchor{whatsnew/3 3 pep-3118-update}@anchor{1245}
@subsection PEP 3118: New memoryview implementation and buffer protocol documentation


The implementation of 
@geindex Python 향상 제안; PEP 3118
PEP 3118@footnote{https://peps.python.org/pep-3118/} has been significantly improved.

The new memoryview implementation comprehensively fixes all ownership and
lifetime issues of dynamically allocated fields in the Py_buffer struct
that led to multiple crash reports. Additionally, several functions that
crashed or returned incorrect results for non-contiguous or multi-dimensional
input have been fixed.

The memoryview object now has a PEP-3118 compliant getbufferproc()
that checks the consumer’s request type. Many new features have been
added, most of them work in full generality for non-contiguous arrays
and arrays with suboffsets.

The documentation has been updated, clearly spelling out responsibilities
for both exporters and consumers. Buffer request flags are grouped into
basic and compound flags. The memory layout of non-contiguous and
multi-dimensional NumPy-style arrays is explained.

@menu
* Features:: 
* API changes:: 

@end menu

@node Features,API changes,,PEP 3118 New memoryview implementation and buffer protocol documentation
@anchor{whatsnew/3 3 features}@anchor{1246}
@subsubsection Features



@itemize *

@item 
All native single character format specifiers in struct module syntax
(optionally prefixed with ‘@@’) are now supported.

@item 
With some restrictions, the cast() method allows changing of format and
shape of C-contiguous arrays.

@item 
Multi-dimensional list representations are supported for any array type.

@item 
Multi-dimensional comparisons are supported for any array type.

@item 
One-dimensional memoryviews of hashable (read-only) types with formats B,
b or c are now hashable.  (Contributed by Antoine Pitrou in bpo-13411@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13411}.)

@item 
Arbitrary slicing of any 1-D arrays type is supported. For example, it
is now possible to reverse a memoryview in `O'(1) by using a negative step.
@end itemize

@node API changes,,Features,PEP 3118 New memoryview implementation and buffer protocol documentation
@anchor{whatsnew/3 3 api-changes}@anchor{1247}
@subsubsection API changes



@itemize *

@item 
The maximum number of dimensions is officially limited to 64.

@item 
The representation of empty shape, strides and suboffsets is now
an empty tuple instead of @code{None}.

@item 
Accessing a memoryview element with format ‘B’ (unsigned bytes)
now returns an integer (in accordance with the struct module syntax).
For returning a bytes object the view must be cast to ‘c’ first.

@item 
memoryview comparisons now use the logical structure of the operands
and compare all array elements by value. All format strings in struct
module syntax are supported. Views with unrecognised format strings
are still permitted, but will always compare as unequal, regardless
of view contents.

@item 
For further changes see @ref{1248,,Build and C API Changes} and @ref{1249,,Porting C code}.
@end itemize

(Contributed by Stefan Krah in bpo-10181@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10181}.)


@subsubheading 더 보기


@geindex Python 향상 제안; PEP 3118
PEP 3118@footnote{https://peps.python.org/pep-3118/} - Revising the Buffer Protocol


@node PEP 393 Flexible String Representation,PEP 397 Python Launcher for Windows,PEP 3118 New memoryview implementation and buffer protocol documentation,What’s New In Python 3 3
@anchor{whatsnew/3 3 pep-393}@anchor{123d}@anchor{whatsnew/3 3 pep-393-flexible-string-representation}@anchor{124a}
@subsection PEP 393: Flexible String Representation


The Unicode string type is changed to support multiple internal
representations, depending on the character with the largest Unicode ordinal
(1, 2, or 4 bytes) in the represented string.  This allows a space-efficient
representation in common cases, but gives access to full UCS-4 on all
systems.  For compatibility with existing APIs, several representations may
exist in parallel; over time, this compatibility should be phased out.

On the Python side, there should be no downside to this change.

On the C API side, 
@geindex Python 향상 제안; PEP 393
PEP 393@footnote{https://peps.python.org/pep-0393/} is fully backward compatible.  The legacy API
should remain available at least five years.  Applications using the legacy
API will not fully benefit of the memory reduction, or - worse - may use
a bit more memory, because Python may have to maintain two versions of each
string (in the legacy format and in the new efficient storage).

@menu
* Functionality:: 
* Performance and resource usage:: 

@end menu

@node Functionality,Performance and resource usage,,PEP 393 Flexible String Representation
@anchor{whatsnew/3 3 functionality}@anchor{124b}
@subsubsection Functionality


Changes introduced by 
@geindex Python 향상 제안; PEP 393
PEP 393@footnote{https://peps.python.org/pep-0393/} are the following:


@itemize *

@item 
Python now always supports the full range of Unicode code points, including
non-BMP ones (i.e. from @code{U+0000} to @code{U+10FFFF}).  The distinction between
narrow and wide builds no longer exists and Python now behaves like a wide
build, even under Windows.

@item 
With the death of narrow builds, the problems specific to narrow builds have
also been fixed, for example:


@itemize *

@item 
@ref{83f,,len()} now always returns 1 for non-BMP characters,
so @code{len('\U0010FFFF') == 1};

@item 
surrogate pairs are not recombined in string literals,
so @code{'\uDBFF\uDFFF' != '\U0010FFFF'};

@item 
indexing or slicing non-BMP characters returns the expected value,
so @code{'\U0010FFFF'[0]} now returns @code{'\U0010FFFF'} and not @code{'\uDBFF'};

@item 
all other functions in the standard library now correctly handle
non-BMP code points.
@end itemize

@item 
The value of @ref{124c,,sys.maxunicode} is now always @code{1114111} (@code{0x10FFFF}
in hexadecimal).  The @code{PyUnicode_GetMax()} function still returns
either @code{0xFFFF} or @code{0x10FFFF} for backward compatibility, and it should
not be used with the new Unicode API (see bpo-13054@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13054}).

@item 
The @code{./configure} flag @code{--with-wide-unicode} has been removed.
@end itemize

@node Performance and resource usage,,Functionality,PEP 393 Flexible String Representation
@anchor{whatsnew/3 3 performance-and-resource-usage}@anchor{124d}
@subsubsection Performance and resource usage


The storage of Unicode strings now depends on the highest code point in the string:


@itemize *

@item 
pure ASCII and Latin1 strings (@code{U+0000-U+00FF}) use 1 byte per code point;

@item 
BMP strings (@code{U+0000-U+FFFF}) use 2 bytes per code point;

@item 
non-BMP strings (@code{U+10000-U+10FFFF}) use 4 bytes per code point.
@end itemize

The net effect is that for most applications, memory usage of string
storage should decrease significantly - especially compared to former
wide unicode builds - as, in many cases, strings will be pure ASCII
even in international contexts (because many strings store non-human
language data, such as XML fragments, HTTP headers, JSON-encoded data,
etc.).  We also hope that it will, for the same reasons, increase CPU
cache efficiency on non-trivial applications. The memory usage of
Python 3.3 is two to three times smaller than Python 3.2, and a little
bit better than Python 2.7, on a Django benchmark (see the PEP for
details).


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 393

@item PEP 393@footnote{https://peps.python.org/pep-0393/} - Flexible String Representation

PEP written by Martin von Löwis; implementation by Torsten Becker
and Martin von Löwis.
@end table


@node PEP 397 Python Launcher for Windows,PEP 3151 Reworking the OS and IO exception hierarchy,PEP 393 Flexible String Representation,What’s New In Python 3 3
@anchor{whatsnew/3 3 pep-397}@anchor{124e}@anchor{whatsnew/3 3 pep-397-python-launcher-for-windows}@anchor{124f}
@subsection PEP 397: Python Launcher for Windows


The Python 3.3 Windows installer now includes a @code{py} launcher application
that can be used to launch Python applications in a version independent
fashion.

This launcher is invoked implicitly when double-clicking @code{*.py} files.
If only a single Python version is installed on the system, that version
will be used to run the file. If multiple versions are installed, the most
recent version is used by default, but this can be overridden by including
a Unix-style “shebang line” in the Python script.

The launcher can also be used explicitly from the command line as the @code{py}
application. Running @code{py} follows the same version selection rules as
implicitly launching scripts, but a more specific version can be selected
by passing appropriate arguments (such as @code{-3} to request Python 3 when
Python 2 is also installed, or @code{-2.6} to specifically request an earlier
Python version when a more recent version is installed).

In addition to the launcher, the Windows installer now includes an
option to add the newly installed Python to the system PATH.  (Contributed
by Brian Curtin in bpo-3561@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=3561}.)


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 397

@item PEP 397@footnote{https://peps.python.org/pep-0397/} - Python Launcher for Windows

PEP written by Mark Hammond and Martin v. Löwis; implementation by
Vinay Sajip.
@end table

Launcher documentation: @ref{7d9,,Python install manager}

Installer PATH modification: @ref{1250,,Python install manager}


@node PEP 3151 Reworking the OS and IO exception hierarchy,PEP 380 Syntax for Delegating to a Subgenerator,PEP 397 Python Launcher for Windows,What’s New In Python 3 3
@anchor{whatsnew/3 3 pep-3151}@anchor{123b}@anchor{whatsnew/3 3 pep-3151-reworking-the-os-and-io-exception-hierarchy}@anchor{1251}
@subsection PEP 3151: Reworking the OS and IO exception hierarchy


The hierarchy of exceptions raised by operating system errors is now both
simplified and finer-grained.

You don’t have to worry anymore about choosing the appropriate exception
type between @ref{2c0,,OSError}, @ref{1252,,IOError}, @ref{1253,,EnvironmentError},
@ref{1254,,WindowsError}, @code{mmap.error}, @ref{1255,,socket.error} or
@ref{1256,,select.error}.  All these exception types are now only one:
@code{OSError}.  The other names are kept as aliases for compatibility
reasons.

Also, it is now easier to catch a specific error condition.  Instead of
inspecting the @code{errno} attribute (or @code{args[0]}) for a particular
constant from the @ref{5b,,errno} module, you can catch the adequate
@ref{2c0,,OSError} subclass.  The available subclasses are the following:


@itemize *

@item 
@ref{235,,BlockingIOError}

@item 
@ref{1257,,ChildProcessError}

@item 
@ref{100a,,ConnectionError}

@item 
@ref{121f,,FileExistsError}

@item 
@ref{264,,FileNotFoundError}

@item 
@ref{f87,,InterruptedError}

@item 
@ref{1258,,IsADirectoryError}

@item 
@ref{1259,,NotADirectoryError}

@item 
@ref{f3d,,PermissionError}

@item 
@ref{125a,,ProcessLookupError}

@item 
@ref{a36,,TimeoutError}
@end itemize

And the @ref{100a,,ConnectionError} itself has finer-grained subclasses:


@itemize *

@item 
@ref{125b,,BrokenPipeError}

@item 
@ref{125c,,ConnectionAbortedError}

@item 
@ref{125d,,ConnectionRefusedError}

@item 
@ref{125e,,ConnectionResetError}
@end itemize

Thanks to the new exceptions, common usages of the @ref{5b,,errno} can now be
avoided.  For example, the following code written for Python 3.2:

@example
from errno import ENOENT, EACCES, EPERM

try:
    with open("document.txt") as f:
        content = f.read()
except IOError as err:
    if err.errno == ENOENT:
        print("document.txt file is missing")
    elif err.errno in (EACCES, EPERM):
        print("You are not allowed to read document.txt")
    else:
        raise
@end example

can now be written without the @ref{5b,,errno} import and without manual
inspection of exception attributes:

@example
try:
    with open("document.txt") as f:
        content = f.read()
except FileNotFoundError:
    print("document.txt file is missing")
except PermissionError:
    print("You are not allowed to read document.txt")
@end example


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 3151

@item PEP 3151@footnote{https://peps.python.org/pep-3151/} - Reworking the OS and IO Exception Hierarchy

PEP written and implemented by Antoine Pitrou
@end table


@geindex yield;yield from (in What's New)

@node PEP 380 Syntax for Delegating to a Subgenerator,PEP 409 Suppressing exception context,PEP 3151 Reworking the OS and IO exception hierarchy,What’s New In Python 3 3
@anchor{whatsnew/3 3 pep-380}@anchor{1239}@anchor{whatsnew/3 3 pep-380-syntax-for-delegating-to-a-subgenerator}@anchor{125f}
@subsection PEP 380: Syntax for Delegating to a Subgenerator


PEP 380 adds the @code{yield from} expression, allowing a @ref{1260,,generator} to
delegate
part of its operations to another generator. This allows a section of code
containing @ref{bc1,,yield} to be factored out and placed in another generator.
Additionally, the subgenerator is allowed to return with a value, and the
value is made available to the delegating generator.

While designed primarily for use in delegating to a subgenerator, the @code{yield
from} expression actually allows delegation to arbitrary subiterators.

For simple iterators, @code{yield from iterable} is essentially just a shortened
form of @code{for item in iterable: yield item}:

@example
>>> def g(x):
...     yield from range(x, 0, -1)
...     yield from range(x)
...
>>> list(g(5))
[5, 4, 3, 2, 1, 0, 1, 2, 3, 4]
@end example

However, unlike an ordinary loop, @code{yield from} allows subgenerators to
receive sent and thrown values directly from the calling scope, and
return a final value to the outer generator:

@example
>>> def accumulate():
...     tally = 0
...     while 1:
...         next = yield
...         if next is None:
...             return tally
...         tally += next
...
>>> def gather_tallies(tallies):
...     while 1:
...         tally = yield from accumulate()
...         tallies.append(tally)
...
>>> tallies = []
>>> acc = gather_tallies(tallies)
>>> next(acc)  # Ensure the accumulator is ready to accept values
>>> for i in range(4):
...     acc.send(i)
...
>>> acc.send(None)  # Finish the first tally
>>> for i in range(5):
...     acc.send(i)
...
>>> acc.send(None)  # Finish the second tally
>>> tallies
[6, 10]
@end example

The main principle driving this change is to allow even generators that are
designed to be used with the @code{send} and @code{throw} methods to be split into
multiple subgenerators as easily as a single large function can be split into
multiple subfunctions.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 380

@item PEP 380@footnote{https://peps.python.org/pep-0380/} - Syntax for Delegating to a Subgenerator

PEP written by Greg Ewing; implementation by Greg Ewing, integrated into
3.3 by Renaud Blanch, Ryan Kelly and Nick Coghlan; documentation by
Zbigniew Jędrzejewski-Szmek and Nick Coghlan
@end table


@node PEP 409 Suppressing exception context,PEP 414 Explicit Unicode literals,PEP 380 Syntax for Delegating to a Subgenerator,What’s New In Python 3 3
@anchor{whatsnew/3 3 pep-409-suppressing-exception-context}@anchor{1261}
@subsection PEP 409: Suppressing exception context


PEP 409 introduces new syntax that allows the display of the chained
exception context to be disabled. This allows cleaner error messages in
applications that convert between exception types:

@example
>>> class D:
...     def __init__(self, extra):
...         self._extra_attributes = extra
...     def __getattr__(self, attr):
...         try:
...             return self._extra_attributes[attr]
...         except KeyError:
...             raise AttributeError(attr) from None
...
>>> D(@{@}).x
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 8, in __getattr__
AttributeError: x
@end example

Without the @code{from None} suffix to suppress the cause, the original
exception would be displayed by default:

@example
>>> class C:
...     def __init__(self, extra):
...         self._extra_attributes = extra
...     def __getattr__(self, attr):
...         try:
...             return self._extra_attributes[attr]
...         except KeyError:
...             raise AttributeError(attr)
...
>>> C(@{@}).x
Traceback (most recent call last):
  File "<stdin>", line 6, in __getattr__
KeyError: 'x'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 8, in __getattr__
AttributeError: x
@end example

No debugging capability is lost, as the original exception context remains
available if needed (for example, if an intervening library has incorrectly
suppressed valuable underlying details):

@example
>>> try:
...     D(@{@}).x
... except AttributeError as exc:
...     print(repr(exc.__context__))
...
KeyError('x',)
@end example


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 409

@item PEP 409@footnote{https://peps.python.org/pep-0409/} - Suppressing exception context

PEP written by Ethan Furman; implemented by Ethan Furman and Nick
Coghlan.
@end table


@node PEP 414 Explicit Unicode literals,PEP 3155 Qualified name for classes and functions,PEP 409 Suppressing exception context,What’s New In Python 3 3
@anchor{whatsnew/3 3 pep-414-explicit-unicode-literals}@anchor{1262}
@subsection PEP 414: Explicit Unicode literals


To ease the transition from Python 2 for Unicode aware Python applications
that make heavy use of Unicode literals, Python 3.3 once again supports the
“@code{u}” prefix for string literals. This prefix has no semantic significance
in Python 3, it is provided solely to reduce the number of purely mechanical
changes in migrating to Python 3, making it easier for developers to focus on
the more significant semantic changes (such as the stricter default
separation of binary and text data).


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 414

@item PEP 414@footnote{https://peps.python.org/pep-0414/} - Explicit Unicode literals

PEP written by Armin Ronacher.
@end table


@node PEP 3155 Qualified name for classes and functions,PEP 412 Key-Sharing Dictionary,PEP 414 Explicit Unicode literals,What’s New In Python 3 3
@anchor{whatsnew/3 3 pep-3155-qualified-name-for-classes-and-functions}@anchor{1263}
@subsection PEP 3155: Qualified name for classes and functions


Functions and class objects have a new @ref{1264,,__qualname__}
attribute representing
the “path” from the module top-level to their definition.  For global functions
and classes, this is the same as @ref{1265,,__name__}.
For other functions and classes,
it provides better information about where they were actually defined, and
how they might be accessible from the global scope.

Example with (non-bound) methods:

@example
>>> class C:
...     def meth(self):
...         pass
...
>>> C.meth.__name__
'meth'
>>> C.meth.__qualname__
'C.meth'
@end example

Example with nested classes:

@example
>>> class C:
...     class D:
...         def meth(self):
...             pass
...
>>> C.D.__name__
'D'
>>> C.D.__qualname__
'C.D'
>>> C.D.meth.__name__
'meth'
>>> C.D.meth.__qualname__
'C.D.meth'
@end example

Example with nested functions:

@example
>>> def outer():
...     def inner():
...         pass
...     return inner
...
>>> outer().__name__
'inner'
>>> outer().__qualname__
'outer.<locals>.inner'
@end example

The string representation of those objects is also changed to include the
new, more precise information:

@example
>>> str(C.D)
"<class '__main__.C.D'>"
>>> str(C.D.meth)
'<function C.D.meth at 0x7f46b9fe31e0>'
@end example


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 3155

@item PEP 3155@footnote{https://peps.python.org/pep-3155/} - Qualified name for classes and functions

PEP written and implemented by Antoine Pitrou.
@end table


@node PEP 412 Key-Sharing Dictionary,PEP 362 Function Signature Object,PEP 3155 Qualified name for classes and functions,What’s New In Python 3 3
@anchor{whatsnew/3 3 pep-412}@anchor{123e}@anchor{whatsnew/3 3 pep-412-key-sharing-dictionary}@anchor{1266}
@subsection PEP 412: Key-Sharing Dictionary


Dictionaries used for the storage of objects’ attributes are now able to
share part of their internal storage between each other (namely, the part
which stores the keys and their respective hashes).  This reduces the memory
consumption of programs creating many instances of non-builtin types.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 412

@item PEP 412@footnote{https://peps.python.org/pep-0412/} - Key-Sharing Dictionary

PEP written and implemented by Mark Shannon.
@end table


@node PEP 362 Function Signature Object,PEP 421 Adding sys implementation,PEP 412 Key-Sharing Dictionary,What’s New In Python 3 3
@anchor{whatsnew/3 3 pep-362-function-signature-object}@anchor{1267}
@subsection PEP 362: Function Signature Object


A new function @ref{22f,,inspect.signature()} makes introspection of python
callables easy and straightforward.  A broad range of callables is supported:
python functions, decorated or not, classes, and @ref{217,,functools.partial()}
objects.  New classes @ref{4e3,,inspect.Signature}, @ref{4e4,,inspect.Parameter}
and @ref{1268,,inspect.BoundArguments} hold information about the call signatures,
such as, annotations, default values, parameters kinds, and bound arguments,
which considerably simplifies writing decorators and any code that validates
or amends calling signatures or arguments.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 362

@item PEP 362@footnote{https://peps.python.org/pep-0362/}: -  Function Signature Object

PEP written by Brett Cannon, Yury Selivanov, Larry Hastings, Jiwon Seo;
implemented by Yury Selivanov.
@end table


@node PEP 421 Adding sys implementation,Using importlib as the Implementation of Import,PEP 362 Function Signature Object,What’s New In Python 3 3
@anchor{whatsnew/3 3 pep-421-adding-sys-implementation}@anchor{1269}
@subsection PEP 421: Adding sys.implementation


A new attribute on the @ref{df,,sys} module exposes details specific to the
implementation of the currently running interpreter.  The initial set of
attributes on @ref{73a,,sys.implementation} are @code{name}, @code{version},
@code{hexversion}, and @code{cache_tag}.

The intention of @code{sys.implementation} is to consolidate into one namespace
the implementation-specific data used by the standard library.  This allows
different Python implementations to share a single standard library code base
much more easily.  In its initial state, @code{sys.implementation} holds only a
small portion of the implementation-specific data.  Over time that ratio will
shift in order to make the standard library more portable.

One example of improved standard library portability is @code{cache_tag}.  As of
Python 3.3, @code{sys.implementation.cache_tag} is used by @ref{7b,,importlib} to
support 
@geindex Python 향상 제안; PEP 3147
PEP 3147@footnote{https://peps.python.org/pep-3147/} compliance.  Any Python implementation that uses
@code{importlib} for its built-in import system may use @code{cache_tag} to control
the caching behavior for modules.

@menu
* SimpleNamespace:: 

@end menu

@node SimpleNamespace,,,PEP 421 Adding sys implementation
@anchor{whatsnew/3 3 simplenamespace}@anchor{126a}
@subsubsection SimpleNamespace


The implementation of @code{sys.implementation} also introduces a new type to
Python: @ref{4e5,,types.SimpleNamespace}.  In contrast to a mapping-based
namespace, like @ref{183,,dict}, @code{SimpleNamespace} is attribute-based, like
@ref{c7d,,object}.  However, unlike @code{object}, @code{SimpleNamespace} instances
are writable.  This means that you can add, remove, and modify the namespace
through normal attribute access.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 421

@item PEP 421@footnote{https://peps.python.org/pep-0421/} - Adding sys.implementation

PEP written and implemented by Eric Snow.
@end table


@node Using importlib as the Implementation of Import,Other Language Changes<5>,PEP 421 Adding sys implementation,What’s New In Python 3 3
@anchor{whatsnew/3 3 importlib}@anchor{123c}@anchor{whatsnew/3 3 using-importlib-as-the-implementation-of-import}@anchor{126b}
@subsection Using importlib as the Implementation of Import


bpo-2377@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2377} - Replace __import__ w/ importlib.__import__
bpo-13959@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13959} - Re-implement parts of @code{imp} in pure Python
bpo-14605@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14605} - Make import machinery explicit
bpo-14646@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14646} - Require loaders set __loader__ and __package__

The @ref{ad1,,__import__()} function is now powered by @ref{126c,,importlib.__import__()}.
This work leads to the completion of “phase 2” of 
@geindex Python 향상 제안; PEP 302
PEP 302@footnote{https://peps.python.org/pep-0302/}. There are
multiple benefits to this change. First, it has allowed for more of the
machinery powering import to be exposed instead of being implicit and hidden
within the C code. It also provides a single implementation for all Python VMs
supporting Python 3.3 to use, helping to end any VM-specific deviations in
import semantics. And finally it eases the maintenance of import, allowing for
future growth to occur.

For the common user, there should be no visible change in semantics.  For
those whose code currently manipulates import or calls import
programmatically, the code changes that might possibly be required are covered
in the @ref{126d,,Porting Python code} section of this document.

@menu
* New APIs:: 
* Visible Changes:: 

@end menu

@node New APIs,Visible Changes,,Using importlib as the Implementation of Import
@anchor{whatsnew/3 3 new-apis}@anchor{126e}
@subsubsection New APIs


One of the large benefits of this work is the exposure of what goes into
making the import statement work. That means the various importers that were
once implicit are now fully exposed as part of the @ref{7b,,importlib} package.

The abstract base classes defined in @ref{7c,,importlib.abc} have been expanded
to properly delineate between @ref{126f,,meta path finders}
and @ref{1270,,path entry finders} by introducing
@ref{a6e,,importlib.abc.MetaPathFinder} and
@ref{a6f,,importlib.abc.PathEntryFinder}, respectively. The old ABC of
@code{importlib.abc.Finder} is now only provided for backwards-compatibility
and does not enforce any method requirements.

In terms of finders, @ref{1271,,importlib.machinery.FileFinder} exposes the
mechanism used to search for source and bytecode files of a module. Previously
this class was an implicit member of @ref{1223,,sys.path_hooks}.

For loaders, the new abstract base class @ref{1272,,importlib.abc.FileLoader} helps
write a loader that uses the file system as the storage mechanism for a module’s
code. The loader for source files
(@ref{1273,,importlib.machinery.SourceFileLoader}), sourceless bytecode files
(@ref{1274,,importlib.machinery.SourcelessFileLoader}), and extension modules
(@ref{ead,,importlib.machinery.ExtensionFileLoader}) are now available for
direct use.

@ref{659,,ImportError} now has @code{name} and @code{path} attributes which are set when
there is relevant data to provide. The message for failed imports will also
provide the full name of the module now instead of just the tail end of the
module’s name.

The @ref{e09,,importlib.invalidate_caches()} function will now call the method with
the same name on all finders cached in @ref{7f9,,sys.path_importer_cache} to help
clean up any stored state as necessary.

@node Visible Changes,,New APIs,Using importlib as the Implementation of Import
@anchor{whatsnew/3 3 visible-changes}@anchor{1275}
@subsubsection Visible Changes


For potential required changes to code, see the @ref{126d,,Porting Python code}
section.

Beyond the expanse of what @ref{7b,,importlib} now exposes, there are other
visible changes to import. The biggest is that @ref{f26,,sys.meta_path} and
@ref{1223,,sys.path_hooks} now store all of the meta path finders and path entry
hooks used by import.  Previously the finders were implicit and hidden within
the C code of import instead of being directly exposed. This means that one can
now easily remove or change the order of the various finders to fit one’s needs.

Another change is that all modules have a @code{__loader__} attribute, storing the
loader used to create the module. 
@geindex Python 향상 제안; PEP 302
PEP 302@footnote{https://peps.python.org/pep-0302/} has been updated to make this
attribute mandatory for loaders to implement, so in the future once 3rd-party
loaders have been updated people will be able to rely on the existence of the
attribute. Until such time, though, import is setting the module post-load.

Loaders are also now expected to set the @code{__package__} attribute from
@geindex Python 향상 제안; PEP 366
PEP 366@footnote{https://peps.python.org/pep-0366/}. Once again, import itself is already setting this on all loaders
from @ref{7b,,importlib} and import itself is setting the attribute post-load.

@code{None} is now inserted into @ref{7f9,,sys.path_importer_cache} when no finder
can be found on @ref{1223,,sys.path_hooks}. Since @code{imp.NullImporter} is not
directly exposed on @code{sys.path_hooks} it could no longer be relied upon to
always be available to use as a value representing no finder found.

All other changes relate to semantic changes which should be taken into
consideration when updating code for Python 3.3, and thus should be read about
in the @ref{126d,,Porting Python code} section of this document.

(Implementation by Brett Cannon)

@node Other Language Changes<5>,A Finer-Grained Import Lock,Using importlib as the Implementation of Import,What’s New In Python 3 3
@anchor{whatsnew/3 3 other-language-changes}@anchor{1276}
@subsection Other Language Changes


Some smaller changes made to the core Python language are:


@itemize *

@item 
Added support for Unicode name aliases and named sequences.
Both @ref{1277,,unicodedata.lookup()} and @code{'\N@{...@}'} now resolve name aliases,
and @code{unicodedata.lookup()} resolves named sequences too.

(Contributed by Ezio Melotti in bpo-12753@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12753}.)

@item 
Unicode database updated to UCD version 6.1.0

@item 
Equality comparisons on @ref{b3d,,range()} objects now return a result reflecting
the equality of the underlying sequences generated by those range objects.
(bpo-13201@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13201})

@item 
The @code{count()}, @code{find()}, @code{rfind()}, @code{index()} and @code{rindex()}
methods of @ref{192,,bytes} and @ref{344,,bytearray} objects now accept an
integer between 0 and 255 as their first argument.

(Contributed by Petri Lehtinen in bpo-12170@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12170}.)

@item 
The @code{rjust()}, @code{ljust()}, and @code{center()} methods of @ref{192,,bytes}
and @ref{344,,bytearray} now accept a @code{bytearray} for the @code{fill}
argument.  (Contributed by Petri Lehtinen in bpo-12380@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12380}.)

@item 
New methods have been added to @ref{24d,,list} and @ref{344,,bytearray}:
@code{copy()} and @code{clear()} (bpo-10516@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10516}).  Consequently,
@ref{4c1,,MutableSequence} now also defines a
@code{clear()} method (bpo-11388@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11388}).

@item 
Raw bytes literals can now be written @code{rb"..."} as well as @code{br"..."}.

(Contributed by Antoine Pitrou in bpo-13748@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13748}.)

@item 
@ref{1278,,dict.setdefault()} now does only one lookup for the given key, making
it atomic when used with built-in types.

(Contributed by Filip Gruszczyński in bpo-13521@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13521}.)

@item 
The error messages produced when a function call does not match the function
signature have been significantly improved.

(Contributed by Benjamin Peterson.)
@end itemize

@node A Finer-Grained Import Lock,Builtin functions and types,Other Language Changes<5>,What’s New In Python 3 3
@anchor{whatsnew/3 3 a-finer-grained-import-lock}@anchor{1279}
@subsection A Finer-Grained Import Lock


Previous versions of CPython have always relied on a global import lock.
This led to unexpected annoyances, such as deadlocks when importing a module
would trigger code execution in a different thread as a side-effect.
Clumsy workarounds were sometimes employed, such as the
@ref{3db,,PyImport_ImportModuleNoBlock()} C API function.

In Python 3.3, importing a module takes a per-module lock.  This correctly
serializes importation of a given module from multiple threads (preventing
the exposure of incompletely initialized modules), while eliminating the
aforementioned annoyances.

(Contributed by Antoine Pitrou in bpo-9260@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9260}.)

@node Builtin functions and types,New Modules<5>,A Finer-Grained Import Lock,What’s New In Python 3 3
@anchor{whatsnew/3 3 builtin-functions-and-types}@anchor{127a}
@subsection Builtin functions and types



@itemize *

@item 
@ref{316,,open()} gets a new `opener' parameter: the underlying file descriptor
for the file object is then obtained by calling `opener' with (`file',
`flags'). It can be used to use custom flags like @ref{127b,,os.O_CLOEXEC} for
example. The @code{'x'} mode was added: open for exclusive creation, failing if
the file already exists.

@item 
@ref{1174,,print()}: added the `flush' keyword argument. If the `flush' keyword
argument is true, the stream is forcibly flushed.

@item 
@ref{800,,hash()}: hash randomization is enabled by default, see
@ref{cf2,,object.__hash__()} and 
@geindex PYTHONHASHSEED
@geindex 환경 변수; PYTHONHASHSEED
@ref{127c,,PYTHONHASHSEED}.

@item 
The @ref{169,,str} type gets a new @ref{fd5,,casefold()} method: return a
casefolded copy of the string, casefolded strings may be used for caseless
matching. For example, @code{'ß'.casefold()} returns @code{'ss'}.

@item 
The sequence documentation has been substantially rewritten to better
explain the binary/text sequence distinction and to provide specific
documentation sections for the individual builtin sequence types
(bpo-4966@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4966}).
@end itemize

@node New Modules<5>,Improved Modules<5>,Builtin functions and types,What’s New In Python 3 3
@anchor{whatsnew/3 3 new-modules}@anchor{127d}
@subsection New Modules


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

@end menu

@node faulthandler<5>,ipaddress<6>,,New Modules<5>
@anchor{whatsnew/3 3 faulthandler}@anchor{127e}
@subsubsection faulthandler


This new debug module @ref{5c,,faulthandler} contains functions to dump Python tracebacks explicitly,
on a fault (a crash like a segmentation fault), after a timeout, or on a user
signal. Call @ref{20f,,faulthandler.enable()} to install fault handlers for the
@ref{127f,,SIGSEGV}, @ref{1280,,SIGFPE}, @ref{1281,,SIGABRT},
@ref{1282,,SIGBUS}, and @ref{1283,,SIGILL} signals.
You can also enable them at startup by setting the 
@geindex PYTHONFAULTHANDLER
@geindex 환경 변수; PYTHONFAULTHANDLER
@ref{1284,,PYTHONFAULTHANDLER}
environment variable or by using @ref{16f,,-X} @code{faulthandler} command line option.

Example of a segmentation fault on Linux:

@example
$ python -q -X faulthandler
>>> import ctypes
>>> ctypes.string_at(0)
Fatal Python error: Segmentation fault

Current thread 0x00007fb899f39700:
  File "/home/python/cpython/Lib/ctypes/__init__.py", line 486 in string_at
  File "<stdin>", line 1 in <module>
Segmentation fault
@end example

@node ipaddress<6>,lzma<2>,faulthandler<5>,New Modules<5>
@anchor{whatsnew/3 3 ipaddress}@anchor{1285}
@subsubsection ipaddress


The new @ref{84,,ipaddress} module provides tools for creating and manipulating
objects representing IPv4 and IPv6 addresses, networks and interfaces (i.e.
an IP address associated with a specific IP subnet).

(Contributed by Google and Peter Moody in 
@geindex Python 향상 제안; PEP 3144
PEP 3144@footnote{https://peps.python.org/pep-3144/}.)

@node lzma<2>,,ipaddress<6>,New Modules<5>
@anchor{whatsnew/3 3 lzma}@anchor{1286}
@subsubsection lzma


The newly added @ref{8e,,lzma} module provides data compression and decompression
using the LZMA algorithm, including support for the @code{.xz} and @code{.lzma}
file formats.

(Contributed by Nadeem Vawda and Per Øyvind Karlsen in bpo-6715@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6715}.)

@node Improved Modules<5>,Optimizations<5>,New Modules<5>,What’s New In Python 3 3
@anchor{whatsnew/3 3 improved-modules}@anchor{1287}
@subsection Improved Modules


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

@end menu

@node abc<2>,array<5>,,Improved Modules<5>
@anchor{whatsnew/3 3 abc}@anchor{1288}
@subsubsection abc


Improved support for abstract base classes containing descriptors composed with
abstract methods. The recommended approach to declaring abstract descriptors is
now to provide @code{__isabstractmethod__} as a dynamically updated
property. The built-in descriptors have been updated accordingly.


@itemize *

@item 
@ref{1289,,abc.abstractproperty} has been deprecated, use @ref{4b3,,property}
with @ref{128a,,abc.abstractmethod()} instead.

@item 
@ref{128b,,abc.abstractclassmethod} has been deprecated, use
@ref{48f,,classmethod} with @ref{128a,,abc.abstractmethod()} instead.

@item 
@ref{128c,,abc.abstractstaticmethod} has been deprecated, use
@ref{453,,staticmethod} with @ref{128a,,abc.abstractmethod()} instead.
@end itemize

(Contributed by Darren Dale in bpo-11610@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11610}.)

@ref{128d,,abc.ABCMeta.register()} now returns the registered subclass, which means
it can now be used as a class decorator (bpo-10868@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10868}).

@node array<5>,base64<5>,abc<2>,Improved Modules<5>
@anchor{whatsnew/3 3 array}@anchor{128e}
@subsubsection array


The @ref{8,,array} module supports the long long type using @code{q} and
@code{Q} type codes.

(Contributed by Oren Tirosh and Hirokazu Yamamoto in bpo-1172711@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1172711}.)

@node base64<5>,binascii<2>,array<5>,Improved Modules<5>
@anchor{whatsnew/3 3 base64}@anchor{128f}
@subsubsection base64


ASCII-only Unicode strings are now accepted by the decoding functions of the
@ref{f,,base64} modern interface. For example, @code{base64.b64decode('YWJj')}
returns @code{b'abc'}.  (Contributed by Catalin Iacob in bpo-13641@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13641}.)

@node binascii<2>,bz2<2>,base64<5>,Improved Modules<5>
@anchor{whatsnew/3 3 binascii}@anchor{1290}
@subsubsection binascii


In addition to the binary objects they normally accept, the @code{a2b_} functions
now all also accept ASCII-only strings as input.  (Contributed by Antoine
Pitrou in bpo-13637@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13637}.)

@node bz2<2>,codecs<2>,binascii<2>,Improved Modules<5>
@anchor{whatsnew/3 3 bz2}@anchor{1291}
@subsubsection bz2


The @ref{14,,bz2} module has been rewritten from scratch. In the process, several
new features have been added:


@itemize *

@item 
New @ref{1292,,bz2.open()} function: open a bzip2-compressed file in binary or
text mode.

@item 
@ref{a66,,bz2.BZ2File} can now read from and write to arbitrary file-like
objects, by means of its constructor’s `fileobj' argument.

(Contributed by Nadeem Vawda in bpo-5863@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5863}.)

@item 
@ref{a66,,bz2.BZ2File} and @ref{1293,,bz2.decompress()} can now decompress
multi-stream inputs (such as those produced by the @code{pbzip2} tool).
@code{bz2.BZ2File} can now also be used to create this type of file, using
the @code{'a'} (append) mode.

(Contributed by Nir Aides in bpo-1625@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1625}.)

@item 
@ref{a66,,bz2.BZ2File} now implements all of the @ref{8a2,,io.BufferedIOBase} API,
except for the @code{detach()} and @code{truncate()} methods.
@end itemize

@node codecs<2>,collections<7>,bz2<2>,Improved Modules<5>
@anchor{whatsnew/3 3 codecs}@anchor{1294}
@subsubsection codecs


The @ref{57,,mbcs} codec has been rewritten to handle correctly
@code{replace} and @code{ignore} error handlers on all Windows versions.  The
@code{mbcs} codec now supports all error handlers, instead of only
@code{replace} to encode and @code{ignore} to decode.

A new Windows-only codec has been added: @code{cp65001} (bpo-13216@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13216}). It is the
Windows code page 65001 (Windows UTF-8, @code{CP_UTF8}).  For example, it is used
by @code{sys.stdout} if the console output code page is set to cp65001 (e.g., using
@code{chcp 65001} command).

Multibyte CJK decoders now resynchronize faster.  They only ignore the first
byte of an invalid byte sequence. For example, @code{b'\xff\n'.decode('gb2312',
'replace')} now returns a @code{\n} after the replacement character.

(bpo-12016@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12016})

Incremental CJK codec encoders are no longer reset at each call to their
encode() methods. For example:

@example
>>> import codecs
>>> encoder = codecs.getincrementalencoder('hz')('strict')
>>> b'@w{'}.join(encoder.encode(x) for x in '\u52ff\u65bd\u65bc\u4eba\u3002 Bye.')
b'~@{NpJ)l6HK!#~@} Bye.'
@end example

This example gives @code{b'~@{Np~@}~@{J)~@}~@{l6~@}~@{HK~@}~@{!#~@} Bye.'} with older Python
versions.

(bpo-12100@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12100})

The @code{unicode_internal} codec has been deprecated.

@node collections<7>,contextlib<7>,codecs<2>,Improved Modules<5>
@anchor{whatsnew/3 3 collections}@anchor{1295}
@subsubsection collections


Addition of a new @ref{e15,,ChainMap} class to allow treating a
number of mappings as a single unit.  (Written by Raymond Hettinger for
bpo-11089@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11089}, made public in bpo-11297@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11297}.)

The abstract base classes have been moved in a new @ref{1f,,collections.abc}
module, to better differentiate between the abstract and the concrete
collections classes.  Aliases for ABCs are still present in the
@ref{1e,,collections} module to preserve existing imports.  (bpo-11085@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11085})

@c XXX addition of __slots__ to ABCs not recorded here: internal detail

The @ref{1296,,Counter} class now supports the unary @code{+} and @code{-}
operators, as well as the in-place operators @code{+=}, @code{-=}, @code{|=}, and
@code{&=}.  (Contributed by Raymond Hettinger in bpo-13121@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13121}.)

@node contextlib<7>,crypt<2>,collections<7>,Improved Modules<5>
@anchor{whatsnew/3 3 contextlib}@anchor{1297}
@subsubsection contextlib


@ref{d1d,,ExitStack} now provides a solid foundation for
programmatic manipulation of context managers and similar cleanup
functionality. Unlike the previous @code{contextlib.nested} API (which was
deprecated and removed), the new API is designed to work correctly
regardless of whether context managers acquire their resources in
their @code{__init__} method (for example, file objects) or in their
@code{__enter__} method (for example, synchronisation objects from the
@ref{f3,,threading} module).

(bpo-13585@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13585})

@node crypt<2>,curses<6>,contextlib<7>,Improved Modules<5>
@anchor{whatsnew/3 3 crypt}@anchor{1298}
@subsubsection crypt


Addition of salt and modular crypt format (hashing method) and the @code{mksalt()}
function to the @code{crypt} module.

(bpo-10924@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10924})

@node curses<6>,datetime<7>,crypt<2>,Improved Modules<5>
@anchor{whatsnew/3 3 curses}@anchor{1299}
@subsubsection curses



@itemize *

@item 
If the @ref{2f,,curses} module is linked to the ncursesw library, use Unicode
functions when Unicode strings or characters are passed (e.g.
@code{waddwstr()}), and bytes functions otherwise (e.g. @code{waddstr()}).

@item 
Use the locale encoding instead of @code{utf-8} to encode Unicode strings.

@item 
@ref{129a,,curses.window} has a new @ref{129b,,curses.window.encoding} attribute.

@item 
The @ref{129a,,curses.window} class has a new @ref{129c,,get_wch()}
method to get a wide character

@item 
The @ref{2f,,curses} module has a new @ref{129d,,unget_wch()} function to
push a wide character so the next @ref{129c,,get_wch()} will return
it
@end itemize

(Contributed by Iñigo Serna in bpo-6755@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6755}.)

@node datetime<7>,decimal<4>,curses<6>,Improved Modules<5>
@anchor{whatsnew/3 3 datetime}@anchor{129e}
@subsubsection datetime



@itemize *

@item 
Equality comparisons between naive and aware @ref{4e2,,datetime}
instances now return @ref{d2a,,False} instead of raising @ref{198,,TypeError}
(bpo-15006@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15006}).

@item 
New @ref{129f,,datetime.datetime.timestamp()} method: Return POSIX timestamp
corresponding to the @ref{4e2,,datetime} instance.

@item 
The @ref{e8d,,datetime.datetime.strftime()} method supports formatting years
older than 1000.

@item 
The @ref{bc3,,datetime.datetime.astimezone()} method can now be
called without arguments to convert datetime instance to the system
timezone.
@end itemize

@node decimal<4>,email<6>,datetime<7>,Improved Modules<5>
@anchor{whatsnew/3 3 decimal}@anchor{12a0}@anchor{whatsnew/3 3 new-decimal}@anchor{123f}
@subsubsection decimal



@table @asis

@item bpo-7652@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7652} - integrate fast native decimal arithmetic.

C-module and libmpdec written by Stefan Krah.
@end table

The new C version of the decimal module integrates the high speed libmpdec
library for arbitrary precision correctly rounded decimal floating-point
arithmetic. libmpdec conforms to IBM’s General Decimal Arithmetic Specification.

Performance gains range from 10x for database applications to 100x for
numerically intensive applications. These numbers are expected gains
for standard precisions used in decimal floating-point arithmetic. Since
the precision is user configurable, the exact figures may vary. For example,
in integer bignum arithmetic the differences can be significantly higher.

The following table is meant as an illustration. Benchmarks are available
at @indicateurl{https://www.bytereef.org/mpdecimal/quickstart.html}.

@quotation


@multitable {xxxxxxxxxxx} {xxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxx} 
@headitem

@tab

decimal.py

@tab

_decimal

@tab

speedup

@item

pi

@tab

42.02s

@tab

0.345s

@tab

120x

@item

telco

@tab

172.19s

@tab

5.68s

@tab

30x

@item

psycopg

@tab

3.57s

@tab

0.29s

@tab

12x

@end multitable

@end quotation

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

@end menu

@node Features<2>,API changes<2>,,decimal<4>
@anchor{whatsnew/3 3 id1}@anchor{12a1}
@subsubsection Features



@itemize *

@item 
The @ref{12a2,,FloatOperation} signal optionally enables stricter
semantics for mixing floats and Decimals.

@item 
If Python is compiled without threads, the C version automatically
disables the expensive thread local context machinery. In this case,
the variable @ref{12a3,,HAVE_THREADS} is set to @code{False}.
@end itemize

@node API changes<2>,,Features<2>,decimal<4>
@anchor{whatsnew/3 3 id2}@anchor{12a4}
@subsubsection API changes



@itemize *

@item 
The C module has the following context limits, depending on the machine
architecture:

@quotation


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

@tab

32-bit

@tab

64-bit

@item

@ref{12a5,,MAX_PREC}

@tab

@code{425000000}

@tab

@code{999999999999999999}

@item

@ref{12a6,,MAX_EMAX}

@tab

@code{425000000}

@tab

@code{999999999999999999}

@item

@ref{12a7,,MIN_EMIN}

@tab

@code{-425000000}

@tab

@code{-999999999999999999}

@end multitable

@end quotation

@item 
In the context templates (@ref{12a8,,DefaultContext},
@ref{12a9,,BasicContext} and @ref{12aa,,ExtendedContext})
the magnitude of @ref{12ab,,Emax} and
@ref{12ac,,Emin} has changed to @code{999999}.

@item 
The @ref{1fe,,Decimal} constructor in decimal.py does not observe
the context limits and converts values with arbitrary exponents or precision
exactly. Since the C version has internal limits, the following scheme is
used: If possible, values are converted exactly, otherwise
@ref{12ad,,InvalidOperation} is raised and the result is NaN. In the
latter case it is always possible to use @ref{12ae,,create_decimal()}
in order to obtain a rounded or inexact value.

@item 
The power function in decimal.py is always correctly rounded. In the
C version, it is defined in terms of the correctly rounded
@ref{12af,,exp()} and @ref{12b0,,ln()} functions,
but the final result is only “almost always correctly rounded”.

@item 
In the C version, the context dictionary containing the signals is a
@ref{12b1,,MutableMapping}.  For speed reasons,
@ref{12b2,,flags} and @ref{12b3,,traps} always
refer to the same @code{MutableMapping} that the context
was initialized with. If a new signal dictionary is assigned,
@code{flags} and @code{traps}
are updated with the new values, but they do not reference the RHS
dictionary.

@item 
Pickling a @ref{12b4,,Context} produces a different output in order
to have a common interchange format for the Python and C versions.

@item 
The order of arguments in the @ref{12b4,,Context} constructor has been
changed to match the order displayed by @ref{1c1,,repr()}.

@item 
The @code{watchexp} parameter in the @ref{12b5,,quantize()} method
is deprecated.
@end itemize

@node email<6>,ftplib<3>,decimal<4>,Improved Modules<5>
@anchor{whatsnew/3 3 email}@anchor{12b6}@anchor{whatsnew/3 3 new-email}@anchor{1240}
@subsubsection email


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

@end menu

@node Policy Framework,Provisional Policy with New Header API,,email<6>
@anchor{whatsnew/3 3 policy-framework}@anchor{12b7}
@subsubsection Policy Framework


The email package now has a @ref{53,,policy} framework.  A
@ref{12b8,,Policy} is an object with several methods and properties
that control how the email package behaves.  The primary policy for Python 3.3
is the @ref{12b9,,Compat32} policy, which provides backward
compatibility with the email package in Python 3.2.  A @code{policy} can be
specified when an email message is parsed by a @ref{52,,parser}, or when a
@ref{580,,Message} object is created, or when an email is
serialized using a @ref{44,,generator}.  Unless overridden, a policy passed
to a @code{parser} is inherited by all the @code{Message} object and sub-objects
created by the @code{parser}.  By default a @code{generator} will use the policy of
the @code{Message} object it is serializing.  The default policy is
@ref{e96,,compat32}.

The minimum set of controls implemented by all @code{policy} objects are:


@multitable {xxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

max_line_length

@tab

The maximum length, excluding the linesep character(s),
individual lines may have when a @code{Message} is
serialized.  Defaults to 78.

@item

linesep

@tab

The character used to separate individual lines when a
@code{Message} is serialized.  Defaults to @code{\n}.

@item

cte_type

@tab

@code{7bit} or @code{8bit}.  @code{8bit} applies only to a
@code{Bytes} @code{generator}, and means that non-ASCII may
be used where allowed by the protocol (or where it
exists in the original input).

@item

raise_on_defect

@tab

Causes a @code{parser} to raise error when defects are
encountered instead of adding them to the @code{Message}
object’s @code{defects} list.

@end multitable


A new policy instance, with new settings, is created using the
@ref{12ba,,clone()} method of policy objects.  @code{clone} takes
any of the above controls as keyword arguments.  Any control not specified in
the call retains its default value.  Thus you can create a policy that uses
@code{\r\n} linesep characters like this:

@example
mypolicy = compat32.clone(linesep='\r\n')
@end example

Policies can be used to make the generation of messages in the format needed by
your application simpler.  Instead of having to remember to specify
@code{linesep='\r\n'} in all the places you call a @code{generator}, you can specify
it once, when you set the policy used by the @code{parser} or the @code{Message},
whichever your program uses to create @code{Message} objects.  On the other hand,
if you need to generate messages in multiple forms, you can still specify the
parameters in the appropriate @code{generator} call.  Or you can have custom
policy instances for your different cases, and pass those in when you create
the @code{generator}.

@node Provisional Policy with New Header API,Other API Changes,Policy Framework,email<6>
@anchor{whatsnew/3 3 provisional-policy-with-new-header-api}@anchor{12bb}
@subsubsection Provisional Policy with New Header API


While the policy framework is worthwhile all by itself, the main motivation for
introducing it is to allow the creation of new policies that implement new
features for the email package in a way that maintains backward compatibility
for those who do not use the new policies.  Because the new policies introduce a
new API, we are releasing them in Python 3.3 as a @ref{1241,,provisional policy}.  Backwards incompatible changes (up to and including
removal of the code) may occur if deemed necessary by the core developers.

The new policies are instances of @ref{12bc,,EmailPolicy},
and add the following additional controls:


@multitable {xxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

refold_source

@tab

Controls whether or not headers parsed by a
@ref{52,,parser} are refolded by the
@ref{44,,generator}.  It can be @code{none}, @code{long},
or @code{all}.  The default is @code{long}, which means that
source headers with a line longer than
@code{max_line_length} get refolded.  @code{none} means no
line get refolded, and @code{all} means that all lines
get refolded.

@item

header_factory

@tab

A callable that take a @code{name} and @code{value} and
produces a custom header object.

@end multitable


The @code{header_factory} is the key to the new features provided by the new
policies.  When one of the new policies is used, any header retrieved from
a @code{Message} object is an object produced by the @code{header_factory}, and any
time you set a header on a @code{Message} it becomes an object produced by
@code{header_factory}.  All such header objects have a @code{name} attribute equal
to the header name.  Address and Date headers have additional attributes
that give you access to the parsed data of the header.  This means you can now
do things like this:

@example
>>> m = Message(policy=SMTP)
>>> m['To'] = 'Éric <foo@@example.com>'
>>> m['to']
'Éric <foo@@example.com>'
>>> m['to'].addresses
(Address(display_name='Éric', username='foo', domain='example.com'),)
>>> m['to'].addresses[0].username
'foo'
>>> m['to'].addresses[0].display_name
'Éric'
>>> m['Date'] = email.utils.localtime()
>>> m['Date'].datetime
datetime.datetime(2012, 5, 25, 21, 39, 24, 465484, tzinfo=datetime.timezone(datetime.timedelta(-1, 72000), 'EDT'))
>>> m['Date']
'Fri, 25 May 2012 21:44:27 -0400'
>>> print(m)
To: =?utf-8?q?=C3=89ric?= <foo@@example.com>
Date: Fri, 25 May 2012 21:44:27 -0400
@end example

You will note that the unicode display name is automatically encoded as
@code{utf-8} when the message is serialized, but that when the header is accessed
directly, you get the unicode version.  This eliminates any need to deal with
the @ref{45,,email.header} @ref{12bd,,decode_header()} or
@ref{12be,,make_header()} functions.

You can also create addresses from parts:

@example
>>> m['cc'] = [Group('pals', [Address('Bob', 'bob', 'example.com'),
...                           Address('Sally', 'sally', 'example.com')]),
...            Address('Bonzo', addr_spec='bonz@@laugh.com')]
>>> print(m)
To: =?utf-8?q?=C3=89ric?= <foo@@example.com>
Date: Fri, 25 May 2012 21:44:27 -0400
cc: pals: Bob <bob@@example.com>, Sally <sally@@example.com>;, Bonzo <bonz@@laugh.com>
@end example

Decoding to unicode is done automatically:

@example
>>> m2 = message_from_string(str(m))
>>> m2['to']
'Éric <foo@@example.com>'
@end example

When you parse a message, you can use the @code{addresses} and @code{groups}
attributes of the header objects to access the groups and individual
addresses:

@example
>>> m2['cc'].addresses
(Address(display_name='Bob', username='bob', domain='example.com'), Address(display_name='Sally', username='sally', domain='example.com'), Address(display_name='Bonzo', username='bonz', domain='laugh.com'))
>>> m2['cc'].groups
(Group(display_name='pals', addresses=(Address(display_name='Bob', username='bob', domain='example.com'), Address(display_name='Sally', username='sally', domain='example.com')), Group(display_name=None, addresses=(Address(display_name='Bonzo', username='bonz', domain='laugh.com'),))
@end example

In summary, if you use one of the new policies, header manipulation works the
way it ought to:  your application works with unicode strings, and the email
package transparently encodes and decodes the unicode to and from the RFC
standard Content Transfer Encodings.

@node Other API Changes,,Provisional Policy with New Header API,email<6>
@anchor{whatsnew/3 3 other-api-changes}@anchor{12bf}
@subsubsection Other API Changes


New @ref{12c0,,BytesHeaderParser}, added to the @ref{52,,parser}
module to complement @ref{12c1,,HeaderParser} and complete the Bytes
API.

New utility functions:


@itemize *

@item 
@ref{12c2,,format_datetime()}: given a @ref{4e2,,datetime},
produce a string formatted for use in an email header.

@item 
@ref{12c3,,parsedate_to_datetime()}: given a date string from
an email header, convert it into an aware @ref{4e2,,datetime},
or a naive @code{datetime} if the offset is @code{-0000}.

@item 
@ref{2f7,,localtime()}: With no argument, returns the
current local time as an aware @ref{4e2,,datetime} using the local
@ref{12c4,,timezone}.  Given an aware @code{datetime},
converts it into an aware @code{datetime} using the
local @code{timezone}.
@end itemize

@node ftplib<3>,functools<7>,email<6>,Improved Modules<5>
@anchor{whatsnew/3 3 ftplib}@anchor{12c5}
@subsubsection ftplib



@itemize *

@item 
@ref{af6,,ftplib.FTP} now accepts a @code{source_address} keyword argument to
specify the @code{(host, port)} to use as the source address in the bind call
when creating the outgoing socket.  (Contributed by Giampaolo Rodolà
in bpo-8594@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8594}.)

@item 
The @ref{af7,,FTP_TLS} class now provides a new
@ref{12c6,,ccc()} function to revert control channel back to
plaintext.  This can be useful to take advantage of firewalls that know how
to handle NAT with non-secure FTP without opening fixed ports.  (Contributed
by Giampaolo Rodolà in bpo-12139@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12139}.)

@item 
Added @ref{12c7,,ftplib.FTP.mlsd()} method which provides a parsable directory
listing format and deprecates @ref{12c8,,ftplib.FTP.nlst()} and
@ref{12c9,,ftplib.FTP.dir()}.  (Contributed by Giampaolo Rodolà in bpo-11072@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11072}.)
@end itemize

@node functools<7>,gc<7>,ftplib<3>,Improved Modules<5>
@anchor{whatsnew/3 3 functools}@anchor{12ca}
@subsubsection functools


The @ref{be1,,functools.lru_cache()} decorator now accepts a @code{typed} keyword
argument (that defaults to @code{False} to ensure that it caches values of
different types that compare equal in separate cache slots.  (Contributed
by Raymond Hettinger in bpo-13227@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13227}.)

@node gc<7>,hmac<5>,functools<7>,Improved Modules<5>
@anchor{whatsnew/3 3 gc}@anchor{12cb}
@subsubsection gc


It is now possible to register callbacks invoked by the garbage collector
before and after collection using the new @ref{12cc,,callbacks} list.

@node hmac<5>,http<5>,gc<7>,Improved Modules<5>
@anchor{whatsnew/3 3 hmac}@anchor{12cd}
@subsubsection hmac


A new @ref{12ce,,compare_digest()} function has been added to prevent side
channel attacks on digests through timing analysis.  (Contributed by Nick
Coghlan and Christian Heimes in bpo-15061@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15061}.)

@node http<5>,html<2>,hmac<5>,Improved Modules<5>
@anchor{whatsnew/3 3 http}@anchor{12cf}
@subsubsection http


@ref{12d0,,http.server.BaseHTTPRequestHandler} now buffers the headers and writes
them all at once when @ref{12d1,,end_headers()} is
called.  A new method @ref{12d2,,flush_headers()}
can be used to directly manage when the accumulated headers are sent.
(Contributed by Andrew Schaaf in bpo-3709@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=3709}.)

@ref{76,,http.server} now produces valid @code{HTML 4.01 strict} output.
(Contributed by Ezio Melotti in bpo-13295@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13295}.)

@ref{12d3,,http.client.HTTPResponse} now has a
@ref{12d4,,readinto()} method, which means it can be used
as an @ref{12d5,,io.RawIOBase} class.  (Contributed by John Kuhn in
bpo-13464@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13464}.)

@node html<2>,imaplib<4>,http<5>,Improved Modules<5>
@anchor{whatsnew/3 3 html}@anchor{12d6}
@subsubsection html


@ref{a77,,html.parser.HTMLParser} is now able to parse broken markup without
raising errors, therefore the `strict' argument of the constructor and the
@code{HTMLParseError} exception are now deprecated.
The ability to parse broken markup is the result of a number of bug fixes that
are also available on the latest bug fix releases of Python 2.7/3.2.
(Contributed by Ezio Melotti in bpo-15114@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15114}, and bpo-14538@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14538},
bpo-13993@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13993}, bpo-13960@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13960}, bpo-13358@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13358}, bpo-1745761@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1745761},
bpo-755670@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=755670}, bpo-13357@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13357}, bpo-12629@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12629}, bpo-1200313@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1200313},
bpo-670664@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=670664}, bpo-13273@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13273}, bpo-12888@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12888}, bpo-7311@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7311}.)

A new @ref{12d7,,html5} dictionary that maps HTML5 named character
references to the equivalent Unicode character(s) (e.g. @code{html5['gt;'] ==
'>'}) has been added to the @ref{70,,html.entities} module.  The dictionary is
now also used by @ref{a77,,HTMLParser}.  (Contributed by Ezio
Melotti in bpo-11113@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11113} and bpo-15156@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15156}.)

@node imaplib<4>,inspect<10>,html<2>,Improved Modules<5>
@anchor{whatsnew/3 3 imaplib}@anchor{12d8}
@subsubsection imaplib


The @ref{b00,,IMAP4_SSL} constructor now accepts an SSLContext
parameter to control parameters of the secure channel.

(Contributed by Sijin Joseph in bpo-8808@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8808}.)

@node inspect<10>,io<8>,imaplib<4>,Improved Modules<5>
@anchor{whatsnew/3 3 inspect}@anchor{12d9}
@subsubsection inspect


A new @ref{12da,,getclosurevars()} function has been added. This function
reports the current binding of all names referenced from the function body and
where those names were resolved, making it easier to verify correct internal
state when testing code that relies on stateful closures.

(Contributed by Meador Inge and Nick Coghlan in bpo-13062@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13062}.)

A new @ref{12db,,getgeneratorlocals()} function has been added. This
function reports the current binding of local variables in the generator’s
stack frame, making it easier to verify correct internal state when testing
generators.

(Contributed by Meador Inge in bpo-15153@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15153}.)

@node io<8>,itertools<7>,inspect<10>,Improved Modules<5>
@anchor{whatsnew/3 3 io}@anchor{12dc}
@subsubsection io


The @ref{73f,,open()} function has a new @code{'x'} mode that can be used to
exclusively create a new file, and raise a @ref{121f,,FileExistsError} if the file
already exists. It is based on the C11 ‘x’ mode to fopen().

(Contributed by David Townshend in bpo-12760@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12760}.)

The constructor of the @ref{9be,,TextIOWrapper} class has a new
`write_through' optional argument. If `write_through' is @code{True}, calls to
@code{write()} are guaranteed not to be buffered: any data
written on the @code{TextIOWrapper} object is immediately handled to its
underlying binary buffer.

@node itertools<7>,logging<7>,io<8>,Improved Modules<5>
@anchor{whatsnew/3 3 itertools}@anchor{12dd}
@subsubsection itertools


@ref{bef,,accumulate()} now takes an optional @code{func} argument for
providing a user-supplied binary function.

@node logging<7>,math<10>,itertools<7>,Improved Modules<5>
@anchor{whatsnew/3 3 logging}@anchor{12de}
@subsubsection logging


The @ref{bf2,,basicConfig()} function now supports an optional @code{handlers}
argument taking an iterable of handlers to be added to the root logger.

A class level attribute @code{append_nul} has
been added to @ref{86b,,SysLogHandler} to allow control of the
appending of the @code{NUL} (@code{\000}) byte to syslog records, since for some
daemons it is required while for others it is passed through to the log.

@node math<10>,mmap<4>,logging<7>,Improved Modules<5>
@anchor{whatsnew/3 3 math}@anchor{12df}
@subsubsection math


The @ref{92,,math} module has a new function, @ref{12e0,,log2()},  which returns
the base-2 logarithm of `x'.

(Written by Mark Dickinson in bpo-11888@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11888}.)

@node mmap<4>,multiprocessing<9>,math<10>,Improved Modules<5>
@anchor{whatsnew/3 3 mmap}@anchor{12e1}
@subsubsection mmap


The @ref{12e2,,read()} method is now more compatible with other file-like
objects: if the argument is omitted or specified as @code{None}, it returns the
bytes from the current file position to the end of the mapping.  (Contributed
by Petri Lehtinen in bpo-12021@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12021}.)

@node multiprocessing<9>,nntplib<2>,mmap<4>,Improved Modules<5>
@anchor{whatsnew/3 3 multiprocessing}@anchor{12e3}
@subsubsection multiprocessing


The new @ref{12e4,,multiprocessing.connection.wait()} function allows polling
multiple objects (such as connections, sockets and pipes) with a timeout.
(Contributed by Richard Oudkerk in bpo-12328@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12328}.)

@ref{12e5,,multiprocessing.connection.Connection} objects can now be transferred
over multiprocessing connections.
(Contributed by Richard Oudkerk in bpo-4892@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4892}.)

@ref{252,,multiprocessing.Process} now accepts a @code{daemon} keyword argument
to override the default behavior of inheriting the @code{daemon} flag from
the parent process (bpo-6064@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6064}).

New attribute @ref{12e6,,multiprocessing.Process.sentinel} allows a
program to wait on multiple @ref{252,,Process} objects at one
time using the appropriate OS primitives (for example, @ref{c6,,select} on
posix systems).

New methods @ref{12e7,,multiprocessing.pool.Pool.starmap()} and
@ref{12e8,,starmap_async()} provide
@ref{12e9,,itertools.starmap()} equivalents to the existing
@ref{12ea,,multiprocessing.pool.Pool.map()} and
@ref{12eb,,map_async()} functions.  (Contributed by Hynek
Schlawack in bpo-12708@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12708}.)

@node nntplib<2>,os<13>,multiprocessing<9>,Improved Modules<5>
@anchor{whatsnew/3 3 nntplib}@anchor{12ec}
@subsubsection nntplib


The @code{nntplib.NNTP} class now supports the context management protocol to
unconditionally consume @ref{1255,,socket.error} exceptions and to close the NNTP
connection when done:

@example
>>> from nntplib import NNTP
>>> with NNTP('news.gmane.org') as n:
...     n.group('gmane.comp.python.committers')
...
('211 1755 1 1755 gmane.comp.python.committers', 1755, 1, 1755, 'gmane.comp.python.committers')
>>>
@end example

(Contributed by Giampaolo Rodolà in bpo-9795@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9795}.)

@node os<13>,pdb<9>,nntplib<2>,Improved Modules<5>
@anchor{whatsnew/3 3 os}@anchor{12ed}
@subsubsection os



@itemize *

@item 
The @ref{a5,,os} module has a new @ref{12ee,,pipe2()} function that makes it
possible to create a pipe with @ref{127b,,O_CLOEXEC} or
@ref{103a,,O_NONBLOCK} flags set atomically. This is especially useful to
avoid race conditions in multi-threaded programs.

@item 
The @ref{a5,,os} module has a new @ref{d04,,sendfile()} function which provides
an efficient “zero-copy” way for copying data from one file (or socket)
descriptor to another. The phrase “zero-copy” refers to the fact that all of
the copying of data between the two descriptors is done entirely by the
kernel, with no copying of data into userspace buffers. @code{sendfile()}
can be used to efficiently copy data from a file on disk to a network socket,
e.g. for downloading a file.

(Patch submitted by Ross Lagerwall and Giampaolo Rodolà in bpo-10882@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10882}.)

@item 
To avoid race conditions like symlink attacks and issues with temporary
files and directories, it is more reliable (and also faster) to manipulate
file descriptors instead of file names. Python 3.3 enhances existing functions
and introduces new functions to work on file descriptors (bpo-4761@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4761},
bpo-10755@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10755} and bpo-14626@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14626}).


@itemize -

@item 
The @ref{a5,,os} module has a new @ref{d51,,fwalk()} function similar to
@ref{6cf,,walk()} except that it also yields file descriptors referring to the
directories visited. This is especially useful to avoid symlink races.

@item 
The following functions get new optional `dir_fd' (@ref{12ef,,paths relative to directory descriptors}) and/or `follow_symlinks' (@ref{12f0,,not following symlinks}):
@ref{12f1,,access()}, @ref{12f2,,chflags()}, @ref{529,,chmod()}, @ref{12f3,,chown()},
@ref{12f4,,link()}, @ref{6c7,,lstat()}, @ref{52b,,mkdir()}, @ref{f8f,,mkfifo()},
@ref{f90,,mknod()}, @ref{f91,,open()}, @ref{b19,,readlink()}, @ref{12f5,,remove()},
@ref{12f6,,rename()}, @ref{12f7,,replace()}, @ref{12f8,,rmdir()}, @ref{26d,,stat()},
@ref{12f9,,symlink()}, @ref{12fa,,unlink()}, @ref{12fb,,utime()}.  Platform
support for using these parameters can be checked via the sets
@ref{12fc,,os.supports_dir_fd} and @ref{12fd,,os.supports_follow_symlinks}.

@item 
The following functions now support a file descriptor for their path argument:
@ref{820,,chdir()}, @ref{529,,chmod()}, @ref{12f3,,chown()},
@ref{12fe,,execve()}, @ref{12ff,,listdir()}, @ref{1300,,pathconf()}, @ref{c02,,exists()},
@ref{26d,,stat()}, @ref{1301,,statvfs()}, @ref{12fb,,utime()}.  Platform support
for this can be checked via the @ref{1302,,os.supports_fd} set.
@end itemize

@item 
@ref{12f1,,access()} accepts an @code{effective_ids} keyword argument to turn on
using the effective uid/gid rather than the real uid/gid in the access check.
Platform support for this can be checked via the
@ref{1303,,supports_effective_ids} set.

@item 
The @ref{a5,,os} module has two new functions: @ref{1304,,getpriority()} and
@ref{1305,,setpriority()}. They can be used to get or set process
niceness/priority in a fashion similar to @ref{1306,,os.nice()} but extended to all
processes instead of just the current one.

(Patch submitted by Giampaolo Rodolà in bpo-10784@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10784}.)

@item 
The new @ref{12f7,,os.replace()} function allows cross-platform renaming of a
file with overwriting the destination.  With @ref{12f6,,os.rename()}, an existing
destination file is overwritten under POSIX, but raises an error under
Windows.
(Contributed by Antoine Pitrou in bpo-8828@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8828}.)

@item 
The stat family of functions (@ref{26d,,stat()}, @ref{f8b,,fstat()},
and @ref{6c7,,lstat()}) now support reading a file’s timestamps
with nanosecond precision.  Symmetrically, @ref{12fb,,utime()}
can now write file timestamps with nanosecond precision.  (Contributed by
Larry Hastings in bpo-14127@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14127}.)

@item 
The new @ref{1307,,os.get_terminal_size()} function queries the size of the
terminal attached to a file descriptor. See also
@ref{1308,,shutil.get_terminal_size()}.
(Contributed by Zbigniew Jędrzejewski-Szmek in bpo-13609@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13609}.)
@end itemize

@c XXX sort out this mess after beta1


@itemize *

@item 
New functions to support Linux extended attributes (bpo-12720@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12720}):
@ref{1309,,getxattr()}, @ref{130a,,listxattr()}, @ref{130b,,removexattr()},
@ref{130c,,setxattr()}.

@item 
New interface to the scheduler. These functions
control how a process is allocated CPU time by the operating system. New
functions:
@ref{130d,,sched_get_priority_max()}, @ref{130e,,sched_get_priority_min()},
@ref{130f,,sched_getaffinity()}, @ref{1310,,sched_getparam()},
@ref{1311,,sched_getscheduler()}, @ref{1312,,sched_rr_get_interval()},
@ref{1313,,sched_setaffinity()}, @ref{1314,,sched_setparam()},
@ref{1315,,sched_setscheduler()}, @ref{1316,,sched_yield()},

@item 
New functions to control the file system:


@itemize *

@item 
@ref{f92,,posix_fadvise()}: Announces an intention to access data in a
specific pattern thus allowing the kernel to make optimizations.

@item 
@ref{f93,,posix_fallocate()}: Ensures that enough disk space is allocated
for a file.

@item 
@ref{1317,,sync()}: Force write of everything to disk.
@end itemize

@item 
Additional new  posix functions:


@itemize *

@item 
@ref{1318,,lockf()}: Apply, test or remove a POSIX lock on an open file descriptor.

@item 
@ref{d55,,pread()}: Read from a file descriptor at an offset, the file
offset remains unchanged.

@item 
@ref{d58,,pwrite()}: Write to a file descriptor from an offset, leaving
the file offset unchanged.

@item 
@ref{d54,,readv()}: Read from a file descriptor into a number of writable buffers.

@item 
@ref{103b,,truncate()}: Truncate the file corresponding to `path', so that
it is at most `length' bytes in size.

@item 
@ref{f98,,waitid()}: Wait for the completion of one or more child processes.

@item 
@ref{d57,,writev()}: Write the contents of `buffers' to a file descriptor,
where `buffers' is an arbitrary sequence of buffers.

@item 
@ref{1319,,getgrouplist()} (bpo-9344@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9344}): Return list of group ids that
specified user belongs to.
@end itemize

@item 
@ref{131a,,times()} and @ref{131b,,uname()}: Return type changed from a tuple to
a tuple-like object with named attributes.

@item 
Some platforms now support additional constants for the @ref{131c,,lseek()}
function, such as @code{os.SEEK_HOLE} and @code{os.SEEK_DATA}.

@item 
New constants @ref{131d,,RTLD_LAZY}, @ref{131e,,RTLD_NOW},
@ref{131f,,RTLD_GLOBAL}, @ref{1320,,RTLD_LOCAL}, @ref{1321,,RTLD_NODELETE},
@ref{1322,,RTLD_NOLOAD}, and @ref{1323,,RTLD_DEEPBIND} are available on
platforms that support them.   These are for use with the
@ref{1324,,sys.setdlopenflags()} function, and supersede the similar constants
defined in @ref{2e,,ctypes} and @code{DLFCN}.  (Contributed by Victor Stinner
in bpo-13226@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13226}.)

@item 
@ref{12f9,,os.symlink()} now accepts (and ignores) the @code{target_is_directory}
keyword argument on non-Windows platforms, to ease cross-platform support.
@end itemize

@node pdb<9>,pickle<6>,os<13>,Improved Modules<5>
@anchor{whatsnew/3 3 pdb}@anchor{1325}
@subsubsection pdb


Tab-completion is now available not only for command names, but also their
arguments.  For example, for the @code{break} command, function and file names
are completed.

(Contributed by Georg Brandl in bpo-14210@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14210})

@node pickle<6>,pydoc<6>,pdb<9>,Improved Modules<5>
@anchor{whatsnew/3 3 pickle}@anchor{1326}
@subsubsection pickle


@ref{c12,,pickle.Pickler} objects now have an optional
@ref{1327,,dispatch_table} attribute allowing per-pickler
reduction functions to be set.

(Contributed by Richard Oudkerk in bpo-14166@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14166}.)

@node pydoc<6>,re<10>,pickle<6>,Improved Modules<5>
@anchor{whatsnew/3 3 pydoc}@anchor{1328}
@subsubsection pydoc


The Tk GUI and the @code{serve()} function have been removed from the
@ref{ba,,pydoc} module: @code{pydoc -g} and @code{serve()} have been deprecated
in Python 3.2.

@node re<10>,sched,pydoc<6>,Improved Modules<5>
@anchor{whatsnew/3 3 re}@anchor{1329}
@subsubsection re


@ref{169,,str} regular expressions now support @code{\u} and @code{\U} escapes.

(Contributed by Serhiy Storchaka in bpo-3665@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=3665}.)

@node sched,select<2>,re<10>,Improved Modules<5>
@anchor{whatsnew/3 3 sched}@anchor{132a}
@subsubsection sched



@itemize *

@item 
@ref{132b,,run()} now accepts a `blocking' parameter which when
set to false makes the method execute the scheduled events due to expire
soonest (if any) and then return immediately.
This is useful in case you want to use the @ref{132c,,scheduler} in
non-blocking applications.  (Contributed by Giampaolo Rodolà in bpo-13449@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13449}.)

@item 
@ref{132c,,scheduler} class can now be safely used in multi-threaded
environments.  (Contributed by Josiah Carlson and Giampaolo Rodolà in
bpo-8684@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8684}.)

@item 
`timefunc' and `delayfunct' parameters of @ref{132c,,scheduler} class
constructor are now optional and defaults to @ref{55c,,time.time()} and
@ref{8ab,,time.sleep()} respectively.  (Contributed by Chris Clark in
bpo-13245@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13245}.)

@item 
@ref{132d,,enter()} and @ref{132e,,enterabs()}
`argument' parameter is now optional.  (Contributed by Chris Clark in
bpo-13245@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13245}.)

@item 
@ref{132d,,enter()} and @ref{132e,,enterabs()}
now accept a `kwargs' parameter.  (Contributed by Chris Clark in
bpo-13245@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13245}.)
@end itemize

@node select<2>,shlex<3>,sched,Improved Modules<5>
@anchor{whatsnew/3 3 select}@anchor{132f}
@subsubsection select


Solaris and derivative platforms have a new class @ref{1195,,select.devpoll}
for high performance asynchronous sockets via @code{/dev/poll}.
(Contributed by Jesús Cea Avión in bpo-6397@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6397}.)

@node shlex<3>,shutil<6>,select<2>,Improved Modules<5>
@anchor{whatsnew/3 3 shlex}@anchor{1330}
@subsubsection shlex


The previously undocumented helper function @code{quote} from the
@code{pipes} modules has been moved to the @ref{c9,,shlex} module and
documented.  @ref{581,,quote()} properly escapes all characters in a string
that might be otherwise given special meaning by the shell.

@node shutil<6>,signal<4>,shlex<3>,Improved Modules<5>
@anchor{whatsnew/3 3 shutil}@anchor{1331}
@subsubsection shutil



@itemize *

@item 
New functions:


@itemize *

@item 
@ref{1332,,disk_usage()}: provides total, used and free disk space
statistics.  (Contributed by Giampaolo Rodolà in bpo-12442@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12442}.)

@item 
@ref{548,,chown()}: allows one to change user and/or group of the given
path also specifying the user/group names and not only their numeric
ids.  (Contributed by Sandro Tosi in bpo-12191@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12191}.)

@item 
@ref{1308,,shutil.get_terminal_size()}: returns the size of the terminal window
to which the interpreter is attached.  (Contributed by Zbigniew
Jędrzejewski-Szmek in bpo-13609@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13609}.)
@end itemize

@item 
@ref{c4f,,copy2()} and @ref{1333,,copystat()} now preserve file
timestamps with nanosecond precision on platforms that support it.
They also preserve file “extended attributes” on Linux.  (Contributed
by Larry Hastings in bpo-14127@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14127} and  bpo-15238@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15238}.)

@item 
Several functions now take an optional @code{symlinks} argument: when that
parameter is true, symlinks aren’t dereferenced and the operation instead
acts on the symlink itself (or creates one, if relevant).
(Contributed by Hynek Schlawack in bpo-12715@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12715}.)

@item 
When copying files to a different file system, @ref{c50,,move()} now
handles symlinks the way the posix @code{mv} command does, recreating the
symlink rather than copying the target file contents.  (Contributed by
Jonathan Niehof in bpo-9993@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9993}.)  @code{move()} now also returns
the @code{dst} argument as its result.

@item 
@ref{356,,rmtree()} is now resistant to symlink attacks on platforms
which support the new @code{dir_fd} parameter in @ref{f91,,os.open()} and
@ref{12fa,,os.unlink()}.  (Contributed by Martin von Löwis and Hynek Schlawack
in bpo-4489@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4489}.)
@end itemize

@node signal<4>,smtpd<4>,shutil<6>,Improved Modules<5>
@anchor{whatsnew/3 3 signal}@anchor{1334}
@subsubsection signal



@itemize *

@item 
The @ref{cb,,signal} module has new functions:


@itemize *

@item 
@ref{1335,,pthread_sigmask()}: fetch and/or change the signal mask of the
calling thread (Contributed by Jean-Paul Calderone in bpo-8407@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8407});

@item 
@ref{1336,,pthread_kill()}: send a signal to a thread;

@item 
@ref{1337,,sigpending()}: examine pending functions;

@item 
@ref{1338,,sigwait()}: wait a signal;

@item 
@ref{faa,,sigwaitinfo()}: wait for a signal, returning detailed
information about it;

@item 
@ref{fa9,,sigtimedwait()}: like @ref{faa,,sigwaitinfo()} but with a
timeout.
@end itemize

@item 
The signal handler writes the signal number as a single byte instead of
a nul byte into the wakeup file descriptor. So it is possible to wait more
than one signal and know which signals were raised.

@item 
@ref{1339,,signal.signal()} and @ref{133a,,signal.siginterrupt()} raise an OSError,
instead of a RuntimeError: OSError has an errno attribute.
@end itemize

@node smtpd<4>,smtplib<4>,signal<4>,Improved Modules<5>
@anchor{whatsnew/3 3 smtpd}@anchor{133b}
@subsubsection smtpd


The @code{smtpd} module now supports 
@geindex RFC; RFC 5321
RFC 5321@footnote{https://datatracker.ietf.org/doc/html/rfc5321.html} (extended SMTP) and 
@geindex RFC; RFC 1870
RFC 1870@footnote{https://datatracker.ietf.org/doc/html/rfc1870.html}
(size extension).  Per the standard, these extensions are enabled if and only
if the client initiates the session with an @code{EHLO} command.

(Initial @code{ELHO} support by Alberto Trevino.  Size extension by Juhana
Jauhiainen.  Substantial additional work on the patch contributed by Michele
Orrù and Dan Boswell.  bpo-8739@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8739})

@node smtplib<4>,socket<11>,smtpd<4>,Improved Modules<5>
@anchor{whatsnew/3 3 smtplib}@anchor{133c}
@subsubsection smtplib


The @ref{b27,,SMTP}, @ref{b28,,SMTP_SSL}, and
@ref{b29,,LMTP} classes now accept a @code{source_address} keyword argument
to specify the @code{(host, port)} to use as the source address in the bind call
when creating the outgoing socket.  (Contributed by Paulo Scardine in
bpo-11281@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11281}.)

@ref{b27,,SMTP} now supports the context management protocol, allowing an
@code{SMTP} instance to be used in a @code{with} statement.  (Contributed
by Giampaolo Rodolà in bpo-11289@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11289}.)

The @ref{b28,,SMTP_SSL} constructor and the @ref{133d,,starttls()}
method now accept an SSLContext parameter to control parameters of the secure
channel.  (Contributed by Kasun Herath in bpo-8809@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8809}.)

@node socket<11>,socketserver<3>,smtplib<4>,Improved Modules<5>
@anchor{whatsnew/3 3 socket}@anchor{133e}
@subsubsection socket



@itemize *

@item 
The @ref{fa0,,socket} class now exposes additional methods to process
ancillary data when supported by the underlying platform:


@itemize *

@item 
@ref{6a0,,sendmsg()}

@item 
@ref{fa5,,recvmsg()}

@item 
@ref{133f,,recvmsg_into()}
@end itemize

(Contributed by David Watson in bpo-6560@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6560}, based on an earlier patch by
Heiko Wundram)

@item 
The @ref{fa0,,socket} class now supports the PF_CAN protocol family
(@indicateurl{https://en.wikipedia.org/wiki/Socketcan}), on Linux
(@indicateurl{https://lwn.net/Articles/253425}).

(Contributed by Matthias Fuchs, updated by Tiago Gonçalves in bpo-10141@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10141}.)

@item 
The @ref{fa0,,socket} class now supports the PF_RDS protocol family
(@indicateurl{https://en.wikipedia.org/wiki/Reliable_Datagram_Sockets} and
https://oss.oracle.com/projects/rds@footnote{https://web.archive.org/web/20130115155505/https://oss.oracle.com/projects/rds/}).

@item 
The @ref{fa0,,socket} class now supports the @code{PF_SYSTEM} protocol
family on OS X.  (Contributed by Michael Goderbauer in bpo-13777@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13777}.)

@item 
New function @ref{1340,,sethostname()} allows the hostname to be set
on Unix systems if the calling process has sufficient privileges.
(Contributed by Ross Lagerwall in bpo-10866@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10866}.)
@end itemize

@node socketserver<3>,sqlite3<11>,socket<11>,Improved Modules<5>
@anchor{whatsnew/3 3 socketserver}@anchor{1341}
@subsubsection socketserver


@ref{1342,,BaseServer} now has an overridable method
@ref{1343,,service_actions()} that is called by the
@ref{1344,,serve_forever()} method in the service loop.
@ref{d70,,ForkingMixIn} now uses this to clean up zombie
child processes.  (Contributed by Justin Warkentin in bpo-11109@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11109}.)

@node sqlite3<11>,ssl<12>,socketserver<3>,Improved Modules<5>
@anchor{whatsnew/3 3 sqlite3}@anchor{1345}
@subsubsection sqlite3


New @ref{54c,,sqlite3.Connection} method
@ref{5aa,,set_trace_callback()} can be used to capture a trace of
all sql commands processed by sqlite.  (Contributed by Torsten Landschoff
in bpo-11688@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11688}.)

@node ssl<12>,stat<2>,sqlite3<11>,Improved Modules<5>
@anchor{whatsnew/3 3 ssl}@anchor{1346}
@subsubsection ssl



@itemize *

@item 
The @ref{d5,,ssl} module has two new random generation functions:


@itemize *

@item 
@ref{746,,RAND_bytes()}: generate cryptographically strong
pseudo-random bytes.

@item 
@code{RAND_pseudo_bytes()}: generate pseudo-random bytes.
@end itemize

(Contributed by Victor Stinner in bpo-12049@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12049}.)

@item 
The @ref{d5,,ssl} module now exposes a finer-grained exception hierarchy
in order to make it easier to inspect the various kinds of errors.
(Contributed by Antoine Pitrou in bpo-11183@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11183}.)

@item 
@ref{597,,load_cert_chain()} now accepts a `password' argument
to be used if the private key is encrypted.
(Contributed by Adam Simpkins in bpo-12803@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12803}.)

@item 
Diffie-Hellman key exchange, both regular and Elliptic Curve-based, is
now supported through the @ref{1347,,load_dh_params()} and
@ref{1348,,set_ecdh_curve()} methods.
(Contributed by Antoine Pitrou in bpo-13626@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13626} and bpo-13627@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13627}.)

@item 
SSL sockets have a new @ref{1349,,get_channel_binding()} method
allowing the implementation of certain authentication mechanisms such as
SCRAM-SHA-1-PLUS.  (Contributed by Jacek Konieczny in bpo-12551@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12551}.)

@item 
You can query the SSL compression algorithm used by an SSL socket, thanks
to its new @ref{134a,,compression()} method.  The new attribute
@ref{134b,,OP_NO_COMPRESSION} can be used to disable compression.
(Contributed by Antoine Pitrou in bpo-13634@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13634}.)

@item 
Support has been added for the Next Protocol Negotiation extension using
the @ref{358,,ssl.SSLContext.set_npn_protocols()} method.
(Contributed by Colin Marc in bpo-14204@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14204}.)

@item 
SSL errors can now be introspected more easily thanks to
@ref{134c,,library} and @ref{134d,,reason} attributes.
(Contributed by Antoine Pitrou in bpo-14837@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14837}.)

@item 
The @ref{a3d,,get_server_certificate()} function now supports IPv6.
(Contributed by Charles-François Natali in bpo-11811@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11811}.)

@item 
New attribute @ref{134e,,OP_CIPHER_SERVER_PREFERENCE} allows setting
SSLv3 server sockets to use the server’s cipher ordering preference rather
than the client’s (bpo-13635@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13635}).
@end itemize

@node stat<2>,struct<4>,ssl<12>,Improved Modules<5>
@anchor{whatsnew/3 3 stat}@anchor{134f}
@subsubsection stat


The undocumented tarfile.filemode function has been moved to
@ref{1350,,stat.filemode()}. It can be used to convert a file’s mode to a string of
the form ‘-rwxrwxrwx’.

(Contributed by Giampaolo Rodolà in bpo-14807@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14807}.)

@node struct<4>,subprocess<6>,stat<2>,Improved Modules<5>
@anchor{whatsnew/3 3 struct}@anchor{1351}
@subsubsection struct


The @ref{db,,struct} module now supports @code{ssize_t} and @code{size_t} via the
new codes @code{n} and @code{N}, respectively.  (Contributed by Antoine Pitrou
in bpo-3163@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=3163}.)

@node subprocess<6>,sys<13>,struct<4>,Improved Modules<5>
@anchor{whatsnew/3 3 subprocess}@anchor{1352}
@subsubsection subprocess


Command strings can now be bytes objects on posix platforms.  (Contributed by
Victor Stinner in bpo-8513@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8513}.)

A new constant @ref{1353,,DEVNULL} allows suppressing output in a
platform-independent fashion.  (Contributed by Ross Lagerwall in
bpo-5870@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5870}.)

@node sys<13>,tarfile<9>,subprocess<6>,Improved Modules<5>
@anchor{whatsnew/3 3 sys}@anchor{1354}
@subsubsection sys


The @ref{df,,sys} module has a new @ref{1355,,thread_info} @ref{85d,,named tuple} holding information about the thread implementation
(bpo-11223@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11223}).

@node tarfile<9>,tempfile<4>,sys<13>,Improved Modules<5>
@anchor{whatsnew/3 3 tarfile}@anchor{1356}
@subsubsection tarfile


@ref{e4,,tarfile} now supports @code{lzma} encoding via the @ref{8e,,lzma} module.
(Contributed by Lars Gustäbel in bpo-5689@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5689}.)

@node tempfile<4>,textwrap<3>,tarfile<9>,Improved Modules<5>
@anchor{whatsnew/3 3 tempfile}@anchor{1357}
@subsubsection tempfile


@ref{8a1,,tempfile.SpooledTemporaryFile}'s @code{truncate()} method now accepts
a @code{size} parameter.  (Contributed by Ryan Kelly in bpo-9957@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9957}.)

@node textwrap<3>,threading<9>,tempfile<4>,Improved Modules<5>
@anchor{whatsnew/3 3 textwrap}@anchor{1358}
@subsubsection textwrap


The @ref{f2,,textwrap} module has a new @ref{57c,,indent()} that makes
it straightforward to add a common prefix to selected lines in a block
of text  (bpo-13857@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13857}).

@node threading<9>,time<8>,textwrap<3>,Improved Modules<5>
@anchor{whatsnew/3 3 threading}@anchor{1359}
@subsubsection threading


@ref{135a,,threading.Condition}, @ref{135b,,threading.Semaphore},
@ref{135c,,threading.BoundedSemaphore}, @ref{135d,,threading.Event}, and
@ref{135e,,threading.Timer}, all of which used to be factory functions returning a
class instance, are now classes and may be subclassed.  (Contributed by Éric
Araujo in bpo-10968@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10968}.)

The @ref{176,,threading.Thread} constructor now accepts a @code{daemon} keyword
argument to override the default behavior of inheriting the @code{daemon} flag
value from the parent thread (bpo-6064@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6064}).

The formerly private function @code{_thread.get_ident} is now available as the
public function @ref{135f,,threading.get_ident()}.  This eliminates several cases of
direct access to the @code{_thread} module in the stdlib.  Third party code that
used @code{_thread.get_ident} should likewise be changed to use the new public
interface.

@node time<8>,types<8>,threading<9>,Improved Modules<5>
@anchor{whatsnew/3 3 time}@anchor{1360}
@subsubsection time


The 
@geindex Python 향상 제안; PEP 418
PEP 418@footnote{https://peps.python.org/pep-0418/} added new functions to the @ref{f4,,time} module:


@itemize *

@item 
@ref{1361,,get_clock_info()}: Get information on a clock.

@item 
@ref{55b,,monotonic()}: Monotonic clock (cannot go backward), not affected
by system clock updates.

@item 
@ref{c79,,perf_counter()}: Performance counter with the highest available
resolution to measure a short duration.

@item 
@ref{c7a,,process_time()}: Sum of the system and user CPU time of the
current process.
@end itemize

Other new functions:


@itemize *

@item 
@ref{1362,,clock_getres()}, @ref{1363,,clock_gettime()} and
@ref{1364,,clock_settime()} functions with @code{CLOCK_@var{xxx}} constants.
(Contributed by Victor Stinner in bpo-10278@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10278}.)
@end itemize

To improve cross platform consistency, @ref{8ab,,sleep()} now raises a
@ref{2ec,,ValueError} when passed a negative sleep value.  Previously this was an
error on posix, but produced an infinite sleep on Windows.

@node types<8>,unittest<11>,time<8>,Improved Modules<5>
@anchor{whatsnew/3 3 types}@anchor{1365}
@subsubsection types


Add a new @ref{697,,types.MappingProxyType} class: Read-only proxy of a mapping.
(bpo-14386@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14386})

The new functions @ref{1366,,types.new_class()} and @ref{1367,,types.prepare_class()} provide support
for 
@geindex Python 향상 제안; PEP 3115
PEP 3115@footnote{https://peps.python.org/pep-3115/} compliant dynamic type creation. (bpo-14588@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14588})

@node unittest<11>,urllib<6>,types<8>,Improved Modules<5>
@anchor{whatsnew/3 3 unittest}@anchor{1368}
@subsubsection unittest


@ref{74f,,assertRaises()}, @ref{751,,assertRaisesRegex()}, @ref{1369,,assertWarns()}, and
@ref{136a,,assertWarnsRegex()} now accept a keyword argument `msg' when used as
context managers.  (Contributed by Ezio Melotti and Winston Ewert in
bpo-10775@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10775}.)

@ref{136b,,unittest.TestCase.run()} now returns the @ref{136c,,TestResult}
object.

@node urllib<6>,webbrowser<4>,unittest<11>,Improved Modules<5>
@anchor{whatsnew/3 3 urllib}@anchor{136d}
@subsubsection urllib


The @ref{11d7,,Request} class, now accepts a `method' argument
used by @ref{136e,,get_method()} to determine what HTTP method
should be used.  For example, this will send a @code{'HEAD'} request:

@example
>>> urlopen(Request('https://www.python.org', method='HEAD'))
@end example

(bpo-1673007@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1673007})

@node webbrowser<4>,xml etree ElementTree<2>,urllib<6>,Improved Modules<5>
@anchor{whatsnew/3 3 webbrowser}@anchor{136f}
@subsubsection webbrowser


The @ref{11b,,webbrowser} module supports more “browsers”: Google Chrome (named
@code{chrome}, @code{chromium}, @code{chrome-browser} or
@code{chromium-browser} depending on the version and operating system),
and the generic launchers @code{xdg-open}, from the FreeDesktop.org
project, and @code{gvfs-open}, which is the default URI handler for GNOME
3.  (The former contributed by Arnaud Calmettes in bpo-13620@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13620}, the latter
by Matthias Klose in bpo-14493@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14493}.)

@node xml etree ElementTree<2>,zlib<3>,webbrowser<4>,Improved Modules<5>
@anchor{whatsnew/3 3 xml-etree-elementtree}@anchor{1370}
@subsubsection xml.etree.ElementTree


The @ref{12b,,xml.etree.ElementTree} module now imports its C accelerator by
default; there is no longer a need to explicitly import
@code{xml.etree.cElementTree} (this module stays for backwards compatibility,
but is now deprecated).  In addition,  the @code{iter} family of methods of
@ref{363,,Element} has been optimized (rewritten in C).
The module’s documentation has also been greatly improved with added examples
and a more detailed reference.

@node zlib<3>,,xml etree ElementTree<2>,Improved Modules<5>
@anchor{whatsnew/3 3 zlib}@anchor{1371}
@subsubsection zlib


New attribute @ref{1372,,zlib.Decompress.eof} makes it possible to distinguish
between a properly formed compressed stream and an incomplete or truncated one.
(Contributed by Nadeem Vawda in bpo-12646@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12646}.)

New attribute @ref{1373,,zlib.ZLIB_RUNTIME_VERSION} reports the version string of
the underlying @code{zlib} library that is loaded at runtime.  (Contributed by
Torsten Landschoff in bpo-12306@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12306}.)

@node Optimizations<5>,Build and C API Changes,Improved Modules<5>,What’s New In Python 3 3
@anchor{whatsnew/3 3 optimizations}@anchor{1374}
@subsection Optimizations


Major performance enhancements have been added:


@itemize *

@item 
Thanks to 
@geindex Python 향상 제안; PEP 393
PEP 393@footnote{https://peps.python.org/pep-0393/}, some operations on Unicode strings have been optimized:


@itemize *

@item 
the memory footprint is divided by 2 to 4 depending on the text

@item 
encode an ASCII string to UTF-8 doesn’t need to encode characters anymore,
the UTF-8 representation is shared with the ASCII representation

@item 
the UTF-8 encoder has been optimized

@item 
repeating a single ASCII letter and getting a substring of an ASCII string
is 4 times faster
@end itemize

@item 
UTF-8 is now 2x to 4x faster.  UTF-16 encoding is now up to 10x faster.

(Contributed by Serhiy Storchaka, bpo-14624@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14624}, bpo-14738@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14738} and
bpo-15026@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15026}.)
@end itemize

@node Build and C API Changes,Deprecated<9>,Optimizations<5>,What’s New In Python 3 3
@anchor{whatsnew/3 3 build-and-c-api-changes}@anchor{1248}
@subsection Build and C API Changes


Changes to Python’s build process and to the C API include:


@itemize *

@item 
New 
@geindex Python 향상 제안; PEP 3118
PEP 3118@footnote{https://peps.python.org/pep-3118/} related function:


@itemize *

@item 
@ref{1375,,PyMemoryView_FromMemory()}
@end itemize

@item 
@geindex Python 향상 제안; PEP 393
PEP 393@footnote{https://peps.python.org/pep-0393/} added new Unicode types, macros and functions:


@itemize *

@item 
High-level API:


@itemize *

@item 
@ref{ab2,,PyUnicode_CopyCharacters()}

@item 
@ref{ab6,,PyUnicode_FindChar()}

@item 
@ref{ab0,,PyUnicode_GetLength()}, @ref{ab1,,PyUnicode_GET_LENGTH}

@item 
@ref{aa9,,PyUnicode_New()}

@item 
@ref{ab3,,PyUnicode_Substring()}

@item 
@ref{1376,,PyUnicode_ReadChar()}, @ref{1377,,PyUnicode_WriteChar()}
@end itemize

@item 
Low-level API:


@itemize *

@item 
@ref{1378,,Py_UCS1}, @ref{1379,,Py_UCS2}, @ref{33d,,Py_UCS4} types

@item 
@ref{137a,,PyASCIIObject} and @ref{137b,,PyCompactUnicodeObject} structures

@item 
@ref{434,,PyUnicode_READY}

@item 
@ref{137c,,PyUnicode_FromKindAndData()}

@item 
@ref{137d,,PyUnicode_AsUCS4()}, @ref{ab8,,PyUnicode_AsUCS4Copy()}

@item 
@ref{137e,,PyUnicode_DATA}, @ref{137f,,PyUnicode_1BYTE_DATA},
@ref{1380,,PyUnicode_2BYTE_DATA}, @ref{1381,,PyUnicode_4BYTE_DATA}

@item 
@ref{1382,,PyUnicode_KIND} with @code{PyUnicode_Kind} enum:
@code{PyUnicode_WCHAR_KIND}, @ref{1383,,PyUnicode_1BYTE_KIND},
@ref{1384,,PyUnicode_2BYTE_KIND}, @ref{1385,,PyUnicode_4BYTE_KIND}

@item 
@ref{1386,,PyUnicode_READ}, @ref{1387,,PyUnicode_READ_CHAR}, @ref{1388,,PyUnicode_WRITE}

@item 
@ref{1389,,PyUnicode_MAX_CHAR_VALUE}
@end itemize
@end itemize

@item 
@ref{3c1,,PyArg_ParseTuple} now accepts a @ref{344,,bytearray} for the @code{c}
format (bpo-12380@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12380}).
@end itemize

@node Deprecated<9>,Porting to Python 3 3,Build and C API Changes,What’s New In Python 3 3
@anchor{whatsnew/3 3 deprecated}@anchor{138a}
@subsection Deprecated


@menu
* Unsupported Operating Systems:: 
* Deprecated Python modules@comma{} functions and methods: Deprecated Python modules functions and methods. 
* Deprecated functions and types of the C API:: 
* Deprecated features:: 

@end menu

@node Unsupported Operating Systems,Deprecated Python modules functions and methods,,Deprecated<9>
@anchor{whatsnew/3 3 unsupported-operating-systems}@anchor{138b}
@subsubsection Unsupported Operating Systems


OS/2 and VMS are no longer supported due to the lack of a maintainer.

Windows 2000 and Windows platforms which set @code{COMSPEC} to @code{command.com}
are no longer supported due to maintenance burden.

OSF support, which was deprecated in 3.2, has been completely removed.

@node Deprecated Python modules functions and methods,Deprecated functions and types of the C API,Unsupported Operating Systems,Deprecated<9>
@anchor{whatsnew/3 3 deprecated-python-modules-functions-and-methods}@anchor{138c}
@subsubsection Deprecated Python modules, functions and methods



@itemize *

@item 
Passing a non-empty string to @code{object.__format__()} is deprecated, and
will produce a @ref{198,,TypeError} in Python 3.4 (bpo-9856@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9856}).

@item 
The @code{unicode_internal} codec has been deprecated because of the
@geindex Python 향상 제안; PEP 393
PEP 393@footnote{https://peps.python.org/pep-0393/}, use UTF-8, UTF-16 (@code{utf-16-le} or @code{utf-16-be}), or UTF-32
(@code{utf-32-le} or @code{utf-32-be})

@item 
@ref{12c8,,ftplib.FTP.nlst()} and @ref{12c9,,ftplib.FTP.dir()}: use
@ref{12c7,,ftplib.FTP.mlsd()}

@item 
@code{platform.popen()}: use the @ref{dc,,subprocess} module. Check especially
the @ref{138d,,Replacing Older Functions with the subprocess Module} section (bpo-11377@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11377}).

@item 
bpo-13374@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13374}: The Windows bytes API has been deprecated in the @ref{a5,,os}
module. Use Unicode filenames, instead of bytes filenames, to not depend on
the ANSI code page anymore and to support any filename.

@item 
bpo-13988@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13988}: The @code{xml.etree.cElementTree} module is deprecated.  The
accelerator is used automatically whenever available.

@item 
The behaviour of @code{time.clock()} depends on the platform: use the new
@ref{c79,,time.perf_counter()} or @ref{c7a,,time.process_time()} function instead,
depending on your requirements, to have a well defined behaviour.

@item 
The @code{os.stat_float_times()} function is deprecated.

@item 
@ref{4,,abc} module:


@itemize *

@item 
@ref{1289,,abc.abstractproperty} has been deprecated, use @ref{4b3,,property}
with @ref{128a,,abc.abstractmethod()} instead.

@item 
@ref{128b,,abc.abstractclassmethod} has been deprecated, use
@ref{48f,,classmethod} with @ref{128a,,abc.abstractmethod()} instead.

@item 
@ref{128c,,abc.abstractstaticmethod} has been deprecated, use
@ref{453,,staticmethod} with @ref{128a,,abc.abstractmethod()} instead.
@end itemize

@item 
@ref{7b,,importlib} package:


@itemize *

@item 
@ref{138e,,importlib.abc.SourceLoader.path_mtime()} is now deprecated in favour of
@ref{138f,,importlib.abc.SourceLoader.path_stats()} as bytecode files now store
both the modification time and size of the source file the bytecode file was
compiled from.
@end itemize
@end itemize

@node Deprecated functions and types of the C API,Deprecated features,Deprecated Python modules functions and methods,Deprecated<9>
@anchor{whatsnew/3 3 deprecated-functions-and-types-of-the-c-api}@anchor{1390}
@subsubsection Deprecated functions and types of the C API


The @ref{3e0,,Py_UNICODE} has been deprecated by 
@geindex Python 향상 제안; PEP 393
PEP 393@footnote{https://peps.python.org/pep-0393/} and will be
removed in Python 4. All functions using this type are deprecated:

Unicode functions and methods using @ref{3e0,,Py_UNICODE} and
@ref{3e0,,Py_UNICODE}* types:


@itemize *

@item 
@code{PyUnicode_FromUnicode}: use @ref{1391,,PyUnicode_FromWideChar()} or
@ref{137c,,PyUnicode_FromKindAndData()}

@item 
@code{PyUnicode_AS_UNICODE}, @code{PyUnicode_AsUnicode()},
@code{PyUnicode_AsUnicodeAndSize()}: use @ref{ab9,,PyUnicode_AsWideCharString()}

@item 
@code{PyUnicode_AS_DATA}: use @ref{137e,,PyUnicode_DATA} with
@ref{1386,,PyUnicode_READ} and @ref{1388,,PyUnicode_WRITE}

@item 
@code{PyUnicode_GET_SIZE}, @code{PyUnicode_GetSize()}: use
@ref{ab1,,PyUnicode_GET_LENGTH} or @ref{ab0,,PyUnicode_GetLength()}

@item 
@code{PyUnicode_GET_DATA_SIZE}: use
@code{PyUnicode_GET_LENGTH(str) * PyUnicode_KIND(str)} (only work on ready
strings)

@item 
@code{PyUnicode_AsUnicodeCopy()}: use @ref{ab8,,PyUnicode_AsUCS4Copy()} or
@ref{ab9,,PyUnicode_AsWideCharString()}

@item 
@code{PyUnicode_GetMax()}
@end itemize

Functions and macros manipulating Py_UNICODE* strings:


@itemize *

@item 
@code{Py_UNICODE_strlen()}: use @ref{ab0,,PyUnicode_GetLength()} or
@ref{ab1,,PyUnicode_GET_LENGTH}

@item 
@code{Py_UNICODE_strcat()}: use @ref{ab2,,PyUnicode_CopyCharacters()} or
@ref{629,,PyUnicode_FromFormat()}

@item 
@code{Py_UNICODE_strcpy()}, @code{Py_UNICODE_strncpy()},
@code{Py_UNICODE_COPY()}: use @ref{ab2,,PyUnicode_CopyCharacters()} or
@ref{ab3,,PyUnicode_Substring()}

@item 
@code{Py_UNICODE_strcmp()}: use @ref{ab4,,PyUnicode_Compare()}

@item 
@code{Py_UNICODE_strncmp()}: use @ref{ab5,,PyUnicode_Tailmatch()}

@item 
@code{Py_UNICODE_strchr()}, @code{Py_UNICODE_strrchr()}: use
@ref{ab6,,PyUnicode_FindChar()}

@item 
@code{Py_UNICODE_FILL()}: use @ref{1392,,PyUnicode_Fill()}

@item 
@code{Py_UNICODE_MATCH}
@end itemize

Encoders:


@itemize *

@item 
@code{PyUnicode_Encode()}: use @code{PyUnicode_AsEncodedObject()}

@item 
@code{PyUnicode_EncodeUTF7()}

@item 
@code{PyUnicode_EncodeUTF8()}: use @ref{424,,PyUnicode_AsUTF8()} or
@ref{1393,,PyUnicode_AsUTF8String()}

@item 
@code{PyUnicode_EncodeUTF32()}

@item 
@code{PyUnicode_EncodeUTF16()}

@item 
@code{PyUnicode_EncodeUnicodeEscape()} use
@ref{1394,,PyUnicode_AsUnicodeEscapeString()}

@item 
@code{PyUnicode_EncodeRawUnicodeEscape()} use
@ref{1395,,PyUnicode_AsRawUnicodeEscapeString()}

@item 
@code{PyUnicode_EncodeLatin1()}: use @ref{1396,,PyUnicode_AsLatin1String()}

@item 
@code{PyUnicode_EncodeASCII()}: use @ref{1397,,PyUnicode_AsASCIIString()}

@item 
@code{PyUnicode_EncodeCharmap()}

@item 
@code{PyUnicode_TranslateCharmap()}

@item 
@code{PyUnicode_EncodeMBCS()}: use @ref{1398,,PyUnicode_AsMBCSString()} or
@ref{1399,,PyUnicode_EncodeCodePage()} (with @code{CP_ACP} code_page)

@item 
@code{PyUnicode_EncodeDecimal()},
@code{PyUnicode_TransformDecimalToASCII()}
@end itemize

@node Deprecated features,,Deprecated functions and types of the C API,Deprecated<9>
@anchor{whatsnew/3 3 deprecated-features}@anchor{139a}
@subsubsection Deprecated features


The @ref{8,,array} module’s @code{'u'} format code is now deprecated and will be
removed in Python 4 together with the rest of the (@ref{3e0,,Py_UNICODE}) API.

@node Porting to Python 3 3,,Deprecated<9>,What’s New In Python 3 3
@anchor{whatsnew/3 3 porting-to-python-3-3}@anchor{139b}
@subsection Porting to Python 3.3


This section lists previously described changes and other bugfixes
that may require changes to your code.

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

@end menu

@node Porting Python code,Porting C code,,Porting to Python 3 3
@anchor{whatsnew/3 3 porting-python-code}@anchor{126d}@anchor{whatsnew/3 3 portingpythoncode}@anchor{139c}
@subsubsection Porting Python code



@itemize *

@item 
Hash randomization is enabled by default. Set the 
@geindex PYTHONHASHSEED
@geindex 환경 변수; PYTHONHASHSEED
@ref{127c,,PYTHONHASHSEED}
environment variable to @code{0} to disable hash randomization. See also the
@ref{cf2,,object.__hash__()} method.

@item 
bpo-12326@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12326}: On Linux, sys.platform doesn’t contain the major version
anymore. It is now always ‘linux’, instead of ‘linux2’ or ‘linux3’ depending
on the Linux version used to build Python. Replace sys.platform == ‘linux2’
with sys.platform.startswith(‘linux’), or directly sys.platform == ‘linux’ if
you don’t need to support older Python versions.

@item 
bpo-13847@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13847}, bpo-14180@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14180}: @ref{f4,,time} and @ref{34,,datetime}:
@ref{a81,,OverflowError} is now raised instead of @ref{2ec,,ValueError} if a
timestamp is out of range. @ref{2c0,,OSError} is now raised if C functions
@code{gmtime()} or @code{localtime()} failed.

@item 
The default finders used by import now utilize a cache of what is contained
within a specific directory. If you create a Python source file or sourceless
bytecode file, make sure to call @ref{e09,,importlib.invalidate_caches()} to clear
out the cache for the finders to notice the new file.

@item 
@ref{659,,ImportError} now uses the full name of the module that was attempted to
be imported. Doctests that check ImportErrors’ message will need to be
updated to use the full name of the module instead of just the tail of the
name.

@item 
The `index' argument to @ref{ad1,,__import__()} now defaults to 0 instead of -1
and no longer support negative values. It was an oversight when 
@geindex Python 향상 제안; PEP 328
PEP 328@footnote{https://peps.python.org/pep-0328/} was
implemented that the default value remained -1. If you need to continue to
perform a relative import followed by an absolute import, then perform the
relative import using an index of 1, followed by another import using an
index of 0. It is preferred, though, that you use
@ref{73b,,importlib.import_module()} rather than call @code{__import__()} directly.

@item 
@ref{ad1,,__import__()} no longer allows one to use an index value other than 0
for top-level modules. E.g. @code{__import__('sys', level=1)} is now an error.

@item 
Because @ref{f26,,sys.meta_path} and @ref{1223,,sys.path_hooks} now have finders on
them by default, you will most likely want to use @ref{139d,,list.insert()} instead
of @ref{8db,,list.append()} to add to those lists.

@item 
Because @code{None} is now inserted into @ref{7f9,,sys.path_importer_cache}, if you
are clearing out entries in the dictionary of paths that do not have a
finder, you will need to remove keys paired with values of @code{None} `and'
@code{imp.NullImporter} to be backwards-compatible. This will lead to extra
overhead on older versions of Python that re-insert @code{None} into
@code{sys.path_importer_cache} where it represents the use of implicit
finders, but semantically it should not change anything.

@item 
@code{importlib.abc.Finder} no longer specifies a @code{find_module()} abstract
method that must be implemented. If you were relying on subclasses to
implement that method, make sure to check for the method’s existence first.
You will probably want to check for @code{find_loader()} first, though, in the
case of working with @ref{1270,,path entry finders}.

@item 
@ref{ae,,pkgutil} has been converted to use @ref{7b,,importlib} internally. This
eliminates many edge cases where the old behaviour of the 
@geindex Python 향상 제안; PEP 302
PEP 302@footnote{https://peps.python.org/pep-0302/} import
emulation failed to match the behaviour of the real import system. The
import emulation itself is still present, but is now deprecated. The
@ref{139e,,pkgutil.iter_importers()} and @ref{df8,,pkgutil.walk_packages()} functions
special case the standard import hooks so they are still supported even
though they do not provide the non-standard @code{iter_modules()} method.

@item 
A longstanding RFC-compliance bug (bpo-1079@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1079}) in the parsing done by
@ref{12bd,,email.header.decode_header()} has been fixed.  Code that uses the
standard idiom to convert encoded headers into unicode
(@code{str(make_header(decode_header(h))}) will see no change, but code that
looks at the individual tuples returned by decode_header will see that
whitespace that precedes or follows @code{ASCII} sections is now included in the
@code{ASCII} section.  Code that builds headers using @code{make_header} should
also continue to work without change, since @code{make_header} continues to add
whitespace between @code{ASCII} and non-@code{ASCII} sections if it is not already
present in the input strings.

@item 
@ref{139f,,email.utils.formataddr()} now does the correct content transfer
encoding when passed non-@code{ASCII} display names.  Any code that depended on
the previous buggy behavior that preserved the non-@code{ASCII} unicode in the
formatted output string will need to be changed (bpo-1690608@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1690608}).

@item 
@ref{13a0,,poplib.POP3.quit()} may now raise protocol errors like all other
@code{poplib} methods.  Code that assumes @code{quit} does not raise
@ref{13a1,,poplib.error_proto} errors may need to be changed if errors on @code{quit}
are encountered by a particular application (bpo-11291@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11291}).

@item 
The @code{strict} argument to @ref{13a2,,email.parser.Parser}, deprecated since
Python 2.4, has finally been removed.

@item 
The deprecated method @code{unittest.TestCase.assertSameElements} has been
removed.

@item 
The deprecated variable @code{time.accept2dyear} has been removed.

@item 
The deprecated @code{Context._clamp} attribute has been removed from the
@ref{3a,,decimal} module.  It was previously replaced by the public attribute
@ref{13a3,,clamp}.  (See bpo-8540@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8540}.)

@item 
The undocumented internal helper class @code{SSLFakeFile} has been removed
from @ref{cf,,smtplib}, since its functionality has long been provided directly
by @ref{13a4,,socket.socket.makefile()}.

@item 
Passing a negative value to @ref{8ab,,time.sleep()} on Windows now raises an
error instead of sleeping forever.  It has always raised an error on posix.

@item 
The @code{ast.__version__} constant has been removed.  If you need to
make decisions affected by the AST version, use @ref{8ae,,sys.version_info}
to make the decision.

@item 
Code that used to work around the fact that the @ref{f3,,threading} module used
factory functions by subclassing the private classes will need to change to
subclass the now-public classes.

@item 
The undocumented debugging machinery in the threading module has been
removed, simplifying the code.  This should have no effect on production
code, but is mentioned here in case any application debug frameworks were
interacting with it (bpo-13550@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13550}).
@end itemize

@node Porting C code,Building C extensions,Porting Python code,Porting to Python 3 3
@anchor{whatsnew/3 3 porting-c-code}@anchor{1249}
@subsubsection Porting C code



@itemize *

@item 
In the course of changes to the buffer API the undocumented
@code{smalltable} member of the
@ref{95b,,Py_buffer} structure has been removed and the
layout of the @code{PyMemoryViewObject} has changed.

All extensions relying on the relevant parts in @code{memoryobject.h}
or @code{object.h} must be rebuilt.

@item 
Due to @ref{123d,,PEP 393}, the @ref{3e0,,Py_UNICODE} type and all
functions using this type are deprecated (but will stay available for
at least five years).  If you were using low-level Unicode APIs to
construct and access unicode objects and you want to benefit of the
memory footprint reduction provided by 
@geindex Python 향상 제안; PEP 393
PEP 393@footnote{https://peps.python.org/pep-0393/}, you have to convert
your code to the new @ref{13a5,,Unicode API}.

However, if you only have been using high-level functions such as
@ref{13a6,,PyUnicode_Concat()}, @ref{13a7,,PyUnicode_Join()} or
@ref{629,,PyUnicode_FromFormat()}, your code will automatically take
advantage of the new unicode representations.

@item 
@ref{13a8,,PyImport_GetMagicNumber()} now returns @code{-1} upon failure.

@item 
As a negative value for the `level' argument to @ref{ad1,,__import__()} is no
longer valid, the same now holds for @ref{13a9,,PyImport_ImportModuleLevel()}.
This also means that the value of `level' used by
@ref{13aa,,PyImport_ImportModuleEx()} is now @code{0} instead of @code{-1}.
@end itemize

@node Building C extensions,Command Line Switch Changes,Porting C code,Porting to Python 3 3
@anchor{whatsnew/3 3 building-c-extensions}@anchor{13ab}
@subsubsection Building C extensions



@itemize *

@item 
The range of possible file names for C extensions has been narrowed.
Very rarely used spellings have been suppressed: under POSIX, files
named @code{xxxmodule.so}, @code{xxxmodule.abi3.so} and
@code{xxxmodule.cpython-*.so} are no longer recognized as implementing
the @code{xxx} module.  If you had been generating such files, you have
to switch to the other spellings (i.e., remove the @code{module} string
from the file names).

(implemented in bpo-14040@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14040}.)
@end itemize

@node Command Line Switch Changes,,Building C extensions,Porting to Python 3 3
@anchor{whatsnew/3 3 command-line-switch-changes}@anchor{13ac}
@subsubsection Command Line Switch Changes



@itemize *

@item 
The -Q command-line flag and related artifacts have been removed.  Code
checking sys.flags.division_warning will need updating.

(bpo-10998@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10998}, contributed by Éric Araujo.)

@item 
When @code{python} is started with @ref{13ad,,-S}, @code{import site}
will no longer add site-specific paths to the module search paths.  In
previous versions, it did.

(bpo-11591@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11591}, contributed by Carl Meyer with editions by Éric Araujo.)
@end itemize

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node What’s New In Python 3 2,What’s New In Python 3 1,What’s New In Python 3 3,파이썬의 새로운 기능
@anchor{whatsnew/3 2 doc}@anchor{13ae}@anchor{whatsnew/3 2 translation-repo}@anchor{13af}@anchor{whatsnew/3 2 what-s-new-in-python-3-2}@anchor{13b0}
@section What’s New In Python 3.2


@*Author: 
Raymond Hettinger


@c $Id$
@c Rules for maintenance:
@c 
@c * Anyone can add text to this document.  Do not spend very much time
@c on the wording of your changes, because your text will probably
@c get rewritten.  (Note, during release candidate phase or just before
@c a beta release, please use the tracker instead -- this helps avoid
@c merge conflicts.   If you must add a suggested entry directly,
@c please put it in an XXX comment and the maintainer will take notice).
@c 
@c * The maintainer will go through Misc/NEWS periodically and add
@c changes; it's therefore more important to add your changes to
@c Misc/NEWS than to this file.
@c 
@c * This is not a complete list of every single change; completeness
@c is the purpose of Misc/NEWS.  Some changes I consider too small
@c or esoteric to include.  If such a change is added to the text,
@c I'll just remove it.  (This is another reason you shouldn't spend
@c too much time on writing your addition.)
@c 
@c * If you want to draw your new text to the attention of the
@c maintainer, add 'XXX' to the beginning of the paragraph or
@c section.
@c 
@c * It's OK to just add a fragmentary note about a change.  For
@c example: "XXX Describe the transmogrify() function added to the
@c socket module."  The maintainer will research the change and
@c write the necessary text.
@c 
@c * You can comment out your additions if you like, but it's not
@c necessary (especially when a final release is some months away).
@c 
@c * Credit the author of a patch or bugfix.   Just the name is
@c sufficient; the e-mail address isn't necessary.  It's helpful to
@c add the issue number:
@c 
@c   XXX Describe the transmogrify() function added to the socket
@c   module.
@c 
@c   (Contributed by P.Y. Developer; :issue:`12345`.)
@c 
@c This saves the maintainer the effort of going through the SVN log
@c when researching a change.

This article explains the new features in Python 3.2 as compared to 3.1.
Python 3.2 was released on February 20, 2011. It
focuses on a few highlights and gives a few examples.  For full details, see the
Misc/NEWS@footnote{https://github.com/python/cpython/blob/076ca6c3c8df3030307e548d9be792ce3c1c6eea/Misc/NEWS}
file.


@subsubheading 더 보기


@geindex Python 향상 제안; PEP 392
PEP 392@footnote{https://peps.python.org/pep-0392/} - Python 3.2 Release Schedule


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

@end menu

@node PEP 384 Defining a Stable ABI,PEP 389 Argparse Command Line Parsing Module,,What’s New In Python 3 2
@anchor{whatsnew/3 2 pep-384-defining-a-stable-abi}@anchor{13b1}
@subsection PEP 384: Defining a Stable ABI


In the past, extension modules built for one Python version were often
not usable with other Python versions. Particularly on Windows, every
feature release of Python required rebuilding all extension modules that
one wanted to use. This requirement was the result of the free access to
Python interpreter internals that extension modules could use.

With Python 3.2, an alternative approach becomes available: extension
modules which restrict themselves to a limited API (by defining
Py_LIMITED_API) cannot use many of the internals, but are constrained
to a set of API functions that are promised to be stable for several
releases. As a consequence, extension modules built for 3.2 in that
mode will also work with 3.3, 3.4, and so on. Extension modules that
make use of details of memory structures can still be built, but will
need to be recompiled for every feature release.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 384

@item PEP 384@footnote{https://peps.python.org/pep-0384/} - Defining a Stable ABI

PEP written by Martin von Löwis.
@end table


@node PEP 389 Argparse Command Line Parsing Module,PEP 391 Dictionary Based Configuration for Logging,PEP 384 Defining a Stable ABI,What’s New In Python 3 2
@anchor{whatsnew/3 2 pep-389-argparse-command-line-parsing-module}@anchor{13b2}
@subsection PEP 389: Argparse Command Line Parsing Module


A new module for command line parsing, @ref{7,,argparse}, was introduced to
overcome the limitations of @ref{a4,,optparse} which did not provide support for
positional arguments (not just options), subcommands, required options and other
common patterns of specifying and validating options.

This module has already had widespread success in the community as a
third-party module.  Being more fully featured than its predecessor, the
@ref{7,,argparse} module is now the preferred module for command-line processing.
The older module is still being kept available because of the substantial amount
of legacy code that depends on it.

Here’s an annotated example parser showing features like limiting results to a
set of choices, specifying a `metavar' in the help screen, validating that one
or more positional arguments is present, and making a required option:

@example
import argparse
parser = argparse.ArgumentParser(
            description = 'Manage servers',         # main description for help
            epilog = 'Tested on Solaris and Linux') # displayed after help
parser.add_argument('action',                       # argument name
            choices = ['deploy', 'start', 'stop'],  # three allowed values
            help = 'action on each target')         # help msg
parser.add_argument('targets',
            metavar = 'HOSTNAME',                   # var name used in help msg
            nargs = '+',                            # require one or more targets
            help = 'url for target machines')       # help msg explanation
parser.add_argument('-u', '--user',                 # -u or --user option
            required = True,                        # make it a required argument
            help = 'login as user')
@end example

Example of calling the parser on a command string:

@example
>>> cmd = 'deploy sneezy.example.com sleepy.example.com -u skycaptain'
>>> result = parser.parse_args(cmd.split())
>>> result.action
'deploy'
>>> result.targets
['sneezy.example.com', 'sleepy.example.com']
>>> result.user
'skycaptain'
@end example

Example of the parser’s automatically generated help:

@example
>>> parser.parse_args('-h'.split())

usage: manage_cloud.py [-h] -u USER
                       @{deploy,start,stop@} HOSTNAME [HOSTNAME ...]

Manage servers

positional arguments:
  @{deploy,start,stop@}   action on each target
  HOSTNAME              url for target machines

optional arguments:
  -h, --help            show this help message and exit
  -u USER, --user USER  login as user

Tested on Solaris and Linux
@end example

An especially nice @ref{7,,argparse} feature is the ability to define subparsers,
each with their own argument patterns and help displays:

@example
import argparse
parser = argparse.ArgumentParser(prog='HELM')
subparsers = parser.add_subparsers()

parser_l = subparsers.add_parser('launch', help='Launch Control')   # first subgroup
parser_l.add_argument('-m', '--missiles', action='store_true')
parser_l.add_argument('-t', '--torpedos', action='store_true')

parser_m = subparsers.add_parser('move', help='Move Vessel',        # second subgroup
                                 aliases=('steer', 'turn'))         # equivalent names
parser_m.add_argument('-c', '--course', type=int, required=True)
parser_m.add_argument('-s', '--speed', type=int, default=0)
@end example

@example
$ ./helm.py --help                         # top level help (launch and move)
$ ./helm.py launch --help                  # help for launch options
$ ./helm.py launch --missiles              # set missiles=True and torpedos=False
$ ./helm.py steer --course 180 --speed 5   # set movement parameters
@end example


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 389

@item PEP 389@footnote{https://peps.python.org/pep-0389/} - New Command Line Parsing Module

PEP written by Steven Bethard.
@end table

@ref{13b3,,Migrating optparse code to argparse} for details on the differences from @ref{a4,,optparse}.


@node PEP 391 Dictionary Based Configuration for Logging,PEP 3148 The concurrent futures module,PEP 389 Argparse Command Line Parsing Module,What’s New In Python 3 2
@anchor{whatsnew/3 2 pep-391-dictionary-based-configuration-for-logging}@anchor{13b4}
@subsection PEP 391:  Dictionary Based Configuration for Logging


The @ref{8b,,logging} module provided two kinds of configuration, one style with
function calls for each option or another style driven by an external file saved
in a @ref{26,,configparser} format.  Those options did not provide the flexibility
to create configurations from JSON or YAML files, nor did they support
incremental configuration, which is needed for specifying logger options from a
command line.

To support a more flexible style, the module now offers
@ref{13b5,,logging.config.dictConfig()} for specifying logging configuration with
plain Python dictionaries.  The configuration options include formatters,
handlers, filters, and loggers.  Here’s a working example of a configuration
dictionary:

@example
@{"version": 1,
 "formatters": @{"brief": @{"format": "%(levelname)-8s: %(name)-15s: %(message)s"@},
                "full": @{"format": "%(asctime)s %(name)-15s %(levelname)-8s %(message)s"@}
                @},
 "handlers": @{"console": @{
                   "class": "logging.StreamHandler",
                   "formatter": "brief",
                   "level": "INFO",
                   "stream": "ext://sys.stdout"@},
              "console_priority": @{
                   "class": "logging.StreamHandler",
                   "formatter": "full",
                   "level": "ERROR",
                   "stream": "ext://sys.stderr"@}
              @},
 "root": @{"level": "DEBUG", "handlers": ["console", "console_priority"]@}@}
@end example

If that dictionary is stored in a file called @code{conf.json}, it can be
loaded and called with code like this:

@example
>>> import json, logging.config
>>> with open('conf.json') as f:
...     conf = json.load(f)
...
>>> logging.config.dictConfig(conf)
>>> logging.info("Transaction completed normally")
INFO    : root           : Transaction completed normally
>>> logging.critical("Abnormal termination")
2011-02-17 11:14:36,694 root            CRITICAL Abnormal termination
@end example


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 391

@item PEP 391@footnote{https://peps.python.org/pep-0391/} - Dictionary Based Configuration for Logging

PEP written by Vinay Sajip.
@end table


@node PEP 3148 The concurrent futures module,PEP 3147 PYC Repository Directories,PEP 391 Dictionary Based Configuration for Logging,What’s New In Python 3 2
@anchor{whatsnew/3 2 pep-3148-the-concurrent-futures-module}@anchor{13b6}
@subsection PEP 3148:  The @code{concurrent.futures} module


Code for creating and managing concurrency is being collected in a new top-level
namespace, `concurrent'.  Its first member is a `futures' package which provides
a uniform high-level interface for managing threads and processes.

The design for @ref{24,,concurrent.futures} was inspired by the
`java.util.concurrent' package.  In that model, a running call and its result
are represented by a @ref{13b7,,Future} object that abstracts
features common to threads, processes, and remote procedure calls.  That object
supports status checks (running or done), timeouts, cancellations, adding
callbacks, and access to results or exceptions.

The primary offering of the new module is a pair of executor classes for
launching and managing calls.  The goal of the executors is to make it easier to
use existing tools for making parallel calls. They save the effort needed to
setup a pool of resources, launch the calls, create a results queue, add
time-out handling, and limit the total number of threads, processes, or remote
procedure calls.

Ideally, each application should share a single executor across multiple
components so that process and thread limits can be centrally managed.  This
solves the design challenge that arises when each component has its own
competing strategy for resource management.

Both classes share a common interface with three methods:
@ref{c74,,submit()} for scheduling a callable and
returning a @ref{13b7,,Future} object;
@ref{1dc,,map()} for scheduling many asynchronous calls
at a time, and @ref{aea,,shutdown()} for freeing
resources.  The class is a @ref{1e1,,context manager} and can be used in a
@ref{186,,with} statement to assure that resources are automatically released
when currently pending futures are done executing.

A simple of example of @ref{948,,ThreadPoolExecutor} is a
launch of four parallel threads for copying files:

@example
import concurrent.futures, shutil
with concurrent.futures.ThreadPoolExecutor(max_workers=4) as e:
    e.submit(shutil.copy, 'src1.txt', 'dest1.txt')
    e.submit(shutil.copy, 'src2.txt', 'dest2.txt')
    e.submit(shutil.copy, 'src3.txt', 'dest3.txt')
    e.submit(shutil.copy, 'src3.txt', 'dest4.txt')
@end example


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 3148

@item PEP 3148@footnote{https://peps.python.org/pep-3148/} - Futures – Execute Computations Asynchronously

PEP written by Brian Quinlan.
@end table

@ref{13b8,,Code for Threaded Parallel URL reads}, an
example using threads to fetch multiple web pages in parallel.

@ref{13b9,,Code for computing prime numbers in parallel}, an example demonstrating
@ref{1d6,,ProcessPoolExecutor}.


@node PEP 3147 PYC Repository Directories,PEP 3149 ABI Version Tagged so Files,PEP 3148 The concurrent futures module,What’s New In Python 3 2
@anchor{whatsnew/3 2 pep-3147-pyc-repository-directories}@anchor{13ba}
@subsection PEP 3147:  PYC Repository Directories


Python’s scheme for caching bytecode in `.pyc' files did not work well in
environments with multiple Python interpreters.  If one interpreter encountered
a cached file created by another interpreter, it would recompile the source and
overwrite the cached file, thus losing the benefits of caching.

The issue of “pyc fights” has become more pronounced as it has become
commonplace for Linux distributions to ship with multiple versions of Python.
These conflicts also arise with CPython alternatives such as Unladen Swallow.

To solve this problem, Python’s import machinery has been extended to use
distinct filenames for each interpreter.  Instead of Python 3.2 and Python 3.3 and
Unladen Swallow each competing for a file called “mymodule.pyc”, they will now
look for “mymodule.cpython-32.pyc”, “mymodule.cpython-33.pyc”, and
“mymodule.unladen10.pyc”.  And to prevent all of these new files from
cluttering source directories, the `pyc' files are now collected in a
“__pycache__” directory stored under the package directory.

Aside from the filenames and target directories, the new scheme has a few
aspects that are visible to the programmer:


@itemize *

@item 
Imported modules now have a @ref{321,,__cached__} attribute which stores
the name of the actual file that was imported:

@example
>>> import collections
>>> collections.__cached__
'c:/py32/lib/__pycache__/collections.cpython-32.pyc'
@end example

@item 
The tag that is unique to each interpreter is accessible from the @code{imp}
module:

@example
>>> import imp
>>> imp.get_tag()
'cpython-32'
@end example

@item 
Scripts that try to deduce source filename from the imported file now need to
be smarter.  It is no longer sufficient to simply strip the “c” from a “.pyc”
filename.  Instead, use the new functions in the @code{imp} module:

@example
>>> imp.source_from_cache('c:/py32/lib/__pycache__/collections.cpython-32.pyc')
'c:/py32/lib/collections.py'
>>> imp.cache_from_source('c:/py32/lib/collections.py')
'c:/py32/lib/__pycache__/collections.cpython-32.pyc'
@end example

@item 
The @ref{b8,,py_compile} and @ref{21,,compileall} modules have been updated to
reflect the new naming convention and target directory.  The command-line
invocation of `compileall' has new options: @code{-i} for
specifying a list of files and directories to compile and @code{-b} which causes
bytecode files to be written to their legacy location rather than
`__pycache__'.

@item 
The @ref{7c,,importlib.abc} module has been updated with new @ref{13bb,,abstract base classes} for loading bytecode files.  The obsolete
ABCs, @code{PyLoader} and
@code{PyPycLoader}, have been deprecated (instructions on how
to stay Python 3.1 compatible are included with the documentation).
@end itemize


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 3147

@item PEP 3147@footnote{https://peps.python.org/pep-3147/} - PYC Repository Directories

PEP written by Barry Warsaw.
@end table


@node PEP 3149 ABI Version Tagged so Files,PEP 3333 Python Web Server Gateway Interface v1 0 1,PEP 3147 PYC Repository Directories,What’s New In Python 3 2
@anchor{whatsnew/3 2 pep-3149-abi-version-tagged-so-files}@anchor{13bc}
@subsection PEP 3149: ABI Version Tagged .so Files


The PYC repository directory allows multiple bytecode cache files to be
co-located.  This PEP implements a similar mechanism for shared object files by
giving them a common directory and distinct names for each version.

The common directory is “pyshared” and the file names are made distinct by
identifying the Python implementation (such as CPython, PyPy, Jython, etc.), the
major and minor version numbers, and optional build flags (such as “d” for
debug, “m” for pymalloc, “u” for wide-unicode).  For an arbitrary package “foo”,
you may see these files when the distribution package is installed:

@example
/usr/share/pyshared/foo.cpython-32m.so
/usr/share/pyshared/foo.cpython-33md.so
@end example

In Python itself, the tags are accessible from functions in the @ref{e1,,sysconfig}
module:

@example
>>> import sysconfig
>>> sysconfig.get_config_var('SOABI')       # find the version tag
'cpython-32mu'
>>> sysconfig.get_config_var('EXT_SUFFIX')  # find the full filename extension
'.cpython-32mu.so'
@end example


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 3149

@item PEP 3149@footnote{https://peps.python.org/pep-3149/} - ABI Version Tagged .so Files

PEP written by Barry Warsaw.
@end table


@node PEP 3333 Python Web Server Gateway Interface v1 0 1,Other Language Changes<6>,PEP 3149 ABI Version Tagged so Files,What’s New In Python 3 2
@anchor{whatsnew/3 2 pep-3333-python-web-server-gateway-interface-v1-0-1}@anchor{13bd}
@subsection PEP 3333: Python Web Server Gateway Interface v1.0.1


This informational PEP clarifies how bytes/text issues are to be handled by the
WSGI protocol.  The challenge is that string handling in Python 3 is most
conveniently handled with the @ref{169,,str} type even though the HTTP protocol
is itself bytes oriented.

The PEP differentiates so-called `native strings' that are used for
request/response headers and metadata versus `byte strings' which are used for
the bodies of requests and responses.

The `native strings' are always of type @ref{169,,str} but are restricted to code
points between `U+0000' through `U+00FF' which are translatable to bytes using
`Latin-1' encoding.  These strings are used for the keys and values in the
environment dictionary and for response headers and statuses in the
@code{start_response()} function.  They must follow 
@geindex RFC; RFC 2616
RFC 2616@footnote{https://datatracker.ietf.org/doc/html/rfc2616.html} with respect to
encoding. That is, they must either be `ISO-8859-1' characters or use
@geindex RFC; RFC 2047
RFC 2047@footnote{https://datatracker.ietf.org/doc/html/rfc2047.html} MIME encoding.

For developers porting WSGI applications from Python 2, here are the salient
points:


@itemize *

@item 
If the app already used strings for headers in Python 2, no change is needed.

@item 
If instead, the app encoded output headers or decoded input headers, then the
headers will need to be re-encoded to Latin-1.  For example, an output header
encoded in utf-8 was using @code{h.encode('utf-8')} now needs to convert from
bytes to native strings using @code{h.encode('utf-8').decode('latin-1')}.

@item 
Values yielded by an application or sent using the @code{write()} method
must be byte strings.  The @code{start_response()} function and environ
must use native strings.  The two cannot be mixed.
@end itemize

For server implementers writing CGI-to-WSGI pathways or other CGI-style
protocols, the users must to be able access the environment using native strings
even though the underlying platform may have a different convention.  To bridge
this gap, the @ref{11e,,wsgiref} module has a new function,
@ref{13be,,wsgiref.handlers.read_environ()} for transcoding CGI variables from
@ref{259,,os.environ} into native strings and returning a new dictionary.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 3333

@item PEP 3333@footnote{https://peps.python.org/pep-3333/} - Python Web Server Gateway Interface v1.0.1

PEP written by Phillip Eby.
@end table


@node Other Language Changes<6>,New Improved and Deprecated Modules,PEP 3333 Python Web Server Gateway Interface v1 0 1,What’s New In Python 3 2
@anchor{whatsnew/3 2 other-language-changes}@anchor{13bf}
@subsection Other Language Changes


Some smaller changes made to the core Python language are:


@itemize *

@item 
String formatting for @ref{199,,format()} and @ref{832,,str.format()} gained new
capabilities for the format character `#'.  Previously, for integers in
binary, octal, or hexadecimal, it caused the output to be prefixed with ‘0b’,
‘0o’, or ‘0x’ respectively.  Now it can also handle floats, complex, and
Decimal, causing the output to always have a decimal point even when no digits
follow it.

@example
>>> format(20, '#o')
'0o24'
>>> format(12.34, '#5.0f')
'  12.'
@end example

(Suggested by Mark Dickinson and implemented by Eric Smith in bpo-7094@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7094}.)

@item 
There is also a new @ref{fd6,,str.format_map()} method that extends the
capabilities of the existing @ref{832,,str.format()} method by accepting arbitrary
@ref{13c0,,mapping} objects.  This new method makes it possible to use string
formatting with any of Python’s many dictionary-like objects such as
@ref{13c1,,defaultdict}, @ref{119a,,Shelf},
@ref{4de,,ConfigParser}, or @ref{35,,dbm}.  It is also useful with
custom @ref{183,,dict} subclasses that normalize keys before look-up or that
supply a @ref{13c2,,__missing__()} method for unknown keys:

@example
>>> import shelve
>>> d = shelve.open('tmp.shl')
>>> 'The @{project_name@} status is @{status@} as of @{date@}'.format_map(d)
'The testing project status is green as of February 15, 2011'

>>> class LowerCasedDict(dict):
...     def __getitem__(self, key):
...         return dict.__getitem__(self, key.lower())
...
>>> lcd = LowerCasedDict(part='widgets', quantity=10)
>>> 'There are @{QUANTITY@} @{Part@} in stock'.format_map(lcd)
'There are 10 widgets in stock'

>>> class PlaceholderDict(dict):
...     def __missing__(self, key):
...         return '<@{@}>'.format(key)
...
>>> 'Hello @{name@}, welcome to @{location@}'.format_map(PlaceholderDict())
'Hello <name>, welcome to <location>'
@end example
@end itemize

@quotation

(Suggested by Raymond Hettinger and implemented by Eric Smith in
bpo-6081@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6081}.)
@end quotation


@itemize *

@item 
The interpreter can now be started with a quiet option, @code{-q}, to prevent
the copyright and version information from being displayed in the interactive
mode.  The option can be introspected using the @ref{89b,,sys.flags} attribute:

@example
$ python -q
>>> sys.flags
sys.flags(debug=0, division_warning=0, inspect=0, interactive=0,
optimize=0, dont_write_bytecode=0, no_user_site=0, no_site=0,
ignore_environment=0, verbose=0, bytes_warning=0, quiet=1)
@end example

(Contributed by Marcin Wojdyr in bpo-1772833@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1772833}).

@item 
The @ref{6f8,,hasattr()} function works by calling @ref{dc9,,getattr()} and detecting
whether an exception is raised.  This technique allows it to detect methods
created dynamically by @ref{6f9,,__getattr__()} or @ref{dca,,__getattribute__()} which
would otherwise be absent from the class dictionary.  Formerly, `hasattr'
would catch any exception, possibly masking genuine errors.  Now, `hasattr'
has been tightened to only catch @ref{5ee,,AttributeError} and let other
exceptions pass through:

@example
>>> class A:
...     @@property
...     def f(self):
...         return 1 // 0
...
>>> a = A()
>>> hasattr(a, 'f')
Traceback (most recent call last):
  ...
ZeroDivisionError: integer division or modulo by zero
@end example

(Discovered by Yury Selivanov and fixed by Benjamin Peterson; bpo-9666@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9666}.)

@item 
The @ref{169,,str()} of a float or complex number is now the same as its
@ref{1c1,,repr()}. Previously, the @code{str()} form was shorter but that just
caused confusion and is no longer needed now that the shortest possible
@code{repr()} is displayed by default:

@example
>>> import math
>>> repr(math.pi)
'3.141592653589793'
>>> str(math.pi)
'3.141592653589793'
@end example

(Proposed and implemented by Mark Dickinson; bpo-9337@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9337}.)

@item 
@ref{165,,memoryview} objects now have a @ref{13c3,,release()} method
and they also now support the context management protocol.  This allows timely
release of any resources that were acquired when requesting a buffer from the
original object.

@example
>>> with memoryview(b'abcdefgh') as v:
...     print(v.tolist())
[97, 98, 99, 100, 101, 102, 103, 104]
@end example

(Added by Antoine Pitrou; bpo-9757@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9757}.)

@item 
Previously it was illegal to delete a name from the local namespace if it
occurs as a free variable in a nested block:

@example
def outer(x):
    def inner():
        return x
    inner()
    del x
@end example

This is now allowed.  Remember that the target of an @ref{1ab,,except} clause
is cleared, so this code which used to work with Python 2.6, raised a
@ref{18e,,SyntaxError} with Python 3.1 and now works again:

@example
def f():
    def print_error():
        print(e)
    try:
        something
    except Exception as e:
        print_error()
        # implicit "del e" here
@end example

(See bpo-4617@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4617}.)

@item 
@ref{13c4,,Struct sequence types} are now subclasses of tuple.
This means that C structures like those returned by @ref{26d,,os.stat()},
@ref{13c5,,time.gmtime()}, and @ref{8ae,,sys.version_info} now work like a
@ref{85d,,named tuple} and now work with functions and methods that
expect a tuple as an argument.  This is a big step forward in making the C
structures as flexible as their pure Python counterparts:

@example
>>> import sys
>>> isinstance(sys.version_info, tuple)
True
>>> 'Version %d.%d.%d %s(%d)' % sys.version_info
'Version 3.2.0 final(0)'
@end example

(Suggested by Arfrever Frehtes Taifersar Arahesis and implemented
by Benjamin Peterson in bpo-8413@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8413}.)

@item 
Warnings are now easier to control using the 
@geindex PYTHONWARNINGS
@geindex 환경 변수; PYTHONWARNINGS
@ref{da2,,PYTHONWARNINGS}
environment variable as an alternative to using @code{-W} at the command line:

@example
$ export PYTHONWARNINGS='ignore::RuntimeWarning::,once::UnicodeWarning::'
@end example

(Suggested by Barry Warsaw and implemented by Philip Jenvey in bpo-7301@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7301}.)

@item 
A new warning category, @ref{54e,,ResourceWarning}, has been added.  It is
emitted when potential issues with resource consumption or cleanup
are detected.  It is silenced by default in normal release builds but
can be enabled through the means provided by the @ref{118,,warnings}
module, or on the command line.

A @ref{54e,,ResourceWarning} is issued at interpreter shutdown if the
@ref{13c6,,gc.garbage} list isn’t empty, and if @ref{13c7,,gc.DEBUG_UNCOLLECTABLE} is
set, all uncollectable objects are printed.  This is meant to make the
programmer aware that their code contains object finalization issues.

A @ref{54e,,ResourceWarning} is also issued when a @ref{13c8,,file object} is destroyed
without having been explicitly closed.  While the deallocator for such
object ensures it closes the underlying operating system resource
(usually, a file descriptor), the delay in deallocating the object could
produce various issues, especially under Windows.  Here is an example
of enabling the warning from the command line:

@example
$ python -q -Wdefault
>>> f = open("foo", "wb")
>>> del f
__main__:1: ResourceWarning: unclosed file <_io.BufferedWriter name='foo'>
@end example

(Added by Antoine Pitrou and Georg Brandl in bpo-10093@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10093} and bpo-477863@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=477863}.)

@item 
@ref{b3d,,range} objects now support `index' and `count' methods. This is part
of an effort to make more objects fully implement the
@ref{13c9,,collections.Sequence} @ref{13bb,,abstract base class}.  As a result, the
language will have a more uniform API.  In addition, @code{range} objects
now support slicing and negative indices, even with values larger than
@ref{13ca,,sys.maxsize}.  This makes `range' more interoperable with lists:

@example
>>> range(0, 100, 2).count(10)
1
>>> range(0, 100, 2).index(10)
5
>>> range(0, 100, 2)[5]
10
>>> range(0, 100, 2)[0:5]
range(0, 10, 2)
@end example

(Contributed by Daniel Stutzbach in bpo-9213@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9213}, by Alexander Belopolsky
in bpo-2690@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2690}, and by Nick Coghlan in bpo-10889@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10889}.)

@item 
The @ref{13cb,,callable()} builtin function from Py2.x was resurrected.  It provides
a concise, readable alternative to using an @ref{13bb,,abstract base class} in an
expression like @code{isinstance(x, collections.Callable)}:

@example
>>> callable(max)
True
>>> callable(20)
False
@end example

(See bpo-10518@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10518}.)

@item 
Python’s import mechanism can now load modules installed in directories with
non-ASCII characters in the path name.  This solved an aggravating problem
with home directories for users with non-ASCII characters in their usernames.
@end itemize

@quotation

(Required extensive work by Victor Stinner in bpo-9425@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9425}.)
@end quotation

@node New Improved and Deprecated Modules,Multi-threading,Other Language Changes<6>,What’s New In Python 3 2
@anchor{whatsnew/3 2 new-improved-and-deprecated-modules}@anchor{13cc}
@subsection New, Improved, and Deprecated Modules


Python’s standard library has undergone significant maintenance efforts and
quality improvements.

The biggest news for Python 3.2 is that the @ref{3f,,email} package, @ref{8f,,mailbox}
module, and @code{nntplib} modules now work correctly with the bytes/text model
in Python 3.  For the first time, there is correct handling of messages with
mixed encodings.

Throughout the standard library, there has been more careful attention to
encodings and text versus bytes issues.  In particular, interactions with the
operating system are now better able to exchange non-ASCII data using the
Windows MBCS encoding, locale-aware encodings, or UTF-8.

Another significant win is the addition of substantially better support for
`SSL' connections and security certificates.

In addition, more classes now implement a @ref{1e1,,context manager} to support
convenient and reliable resource clean-up using a @ref{186,,with} statement.

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

@end menu

@node email<7>,elementtree,,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 email}@anchor{13cd}
@subsubsection email


The usability of the @ref{3f,,email} package in Python 3 has been mostly fixed by
the extensive efforts of R. David Murray.  The problem was that emails are
typically read and stored in the form of @ref{192,,bytes} rather than @ref{169,,str}
text, and they may contain multiple encodings within a single email.  So, the
email package had to be extended to parse and generate email messages in bytes
format.


@itemize *

@item 
New functions @ref{13ce,,message_from_bytes()} and
@ref{13cf,,message_from_binary_file()}, and new classes
@ref{13d0,,BytesFeedParser} and @ref{13d1,,BytesParser}
allow binary message data to be parsed into model objects.

@item 
Given bytes input to the model, @ref{13d2,,get_payload()}
will by default decode a message body that has a
@code{Content-Transfer-Encoding} of `8bit' using the charset
specified in the MIME headers and return the resulting string.

@item 
Given bytes input to the model, @ref{13d3,,Generator} will
convert message bodies that have a @code{Content-Transfer-Encoding} of
`8bit' to instead have a `7bit' @code{Content-Transfer-Encoding}.

Headers with unencoded non-ASCII bytes are deemed to be 
@geindex RFC; RFC 2047
RFC 2047@footnote{https://datatracker.ietf.org/doc/html/rfc2047.html}-encoded
using the `unknown-8bit' character set.

@item 
A new class @ref{13d4,,BytesGenerator} produces bytes as output,
preserving any unchanged non-ASCII data that was present in the input used to
build the model, including message bodies with a
@code{Content-Transfer-Encoding} of `8bit'.

@item 
The @ref{cf,,smtplib} @ref{b27,,SMTP} class now accepts a byte string
for the `msg' argument to the @ref{1058,,sendmail()} method,
and a new method, @ref{1059,,send_message()} accepts a
@ref{580,,Message} object and can optionally obtain the
`from_addr' and `to_addrs' addresses directly from the object.
@end itemize

(Proposed and implemented by R. David Murray, bpo-4661@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4661} and bpo-10321@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10321}.)

@node elementtree,functools<8>,email<7>,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 elementtree}@anchor{13d5}
@subsubsection elementtree


The @ref{12b,,xml.etree.ElementTree} package and its @code{xml.etree.cElementTree}
counterpart have been updated to version 1.3.

Several new and useful functions and methods have been added:


@itemize *

@item 
@ref{13d6,,xml.etree.ElementTree.fromstringlist()} which builds an XML document
from a sequence of fragments

@item 
@ref{13d7,,xml.etree.ElementTree.register_namespace()} for registering a global
namespace prefix

@item 
@ref{11f5,,xml.etree.ElementTree.tostringlist()} for string representation
including all sublists

@item 
@ref{13d8,,xml.etree.ElementTree.Element.extend()} for appending a sequence of zero
or more elements

@item 
@ref{13d9,,xml.etree.ElementTree.Element.iterfind()} searches an element and
subelements

@item 
@ref{13da,,xml.etree.ElementTree.Element.itertext()} creates a text iterator over
an element and its subelements

@item 
@ref{13db,,xml.etree.ElementTree.TreeBuilder.end()} closes the current element

@item 
@ref{c8d,,xml.etree.ElementTree.TreeBuilder.doctype()} handles a doctype
declaration
@end itemize

Two methods have been deprecated:


@itemize *

@item 
@code{xml.etree.ElementTree.getchildren()} use @code{list(elem)} instead.

@item 
@code{xml.etree.ElementTree.getiterator()} use @code{Element.iter} instead.
@end itemize

For details of the update, see Introducing ElementTree@footnote{https://web.archive.org/web/20200703234532/http://effbot.org/zone/elementtree-13-intro.htm}
on Fredrik Lundh’s website.

(Contributed by Florent Xicluna and Fredrik Lundh, bpo-6472@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6472}.)

@node functools<8>,itertools<8>,elementtree,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 functools}@anchor{13dc}
@subsubsection functools



@itemize *

@item 
The @ref{63,,functools} module includes a new decorator for caching function
calls.  @ref{be1,,functools.lru_cache()} can save repeated queries to an external
resource whenever the results are expected to be the same.

For example, adding a caching decorator to a database query function can save
database accesses for popular searches:

@example
>>> import functools
>>> @@functools.lru_cache(maxsize=300)
... def get_phone_number(name):
...     c = conn.cursor()
...     c.execute('SELECT phonenumber FROM phonelist WHERE name=?', (name,))
...     return c.fetchone()[0]
@end example

@example
>>> for name in user_requests:
...     get_phone_number(name)        # cached lookup
@end example

To help with choosing an effective cache size, the wrapped function is
instrumented for tracking cache statistics:

@example
>>> get_phone_number.cache_info()
CacheInfo(hits=4805, misses=980, maxsize=300, currsize=300)
@end example

If the phonelist table gets updated, the outdated contents of the cache can be
cleared with:

@example
>>> get_phone_number.cache_clear()
@end example

(Contributed by Raymond Hettinger and incorporating design ideas from Jim
Baker, Miki Tebeka, and Nick Coghlan; see recipe 498245@footnote{https://code.activestate.com/recipes/498245-lru-and-lfu-cache-decorators/}, recipe 577479@footnote{https://code.activestate.com/recipes/577479-simple-caching-decorator/}, bpo-10586@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10586}, and
bpo-10593@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10593}.)

@item 
The @ref{115c,,functools.wraps()} decorator now adds a @code{__wrapped__} attribute
pointing to the original callable function.  This allows wrapped functions to
be introspected.  It also copies @ref{13dd,,__annotations__} if
defined.  And now it also gracefully skips over missing attributes such as
@ref{13de,,__doc__} which
might not be defined for the wrapped callable.

In the above example, the cache can be removed by recovering the original
function:

@example
>>> get_phone_number = get_phone_number.__wrapped__    # uncached function
@end example

(By Nick Coghlan and Terrence Cole; bpo-9567@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9567}, bpo-3445@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=3445}, and
bpo-8814@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8814}.)

@item 
To help write classes with rich comparison methods, a new decorator
@ref{1141,,functools.total_ordering()} will use existing equality and inequality
methods to fill in the remaining methods.

For example, supplying `__eq__' and `__lt__' will enable
@ref{1141,,total_ordering()} to fill-in `__le__', `__gt__' and `__ge__':

@example
@@total_ordering
class Student:
    def __eq__(self, other):
        return ((self.lastname.lower(), self.firstname.lower()) ==
                (other.lastname.lower(), other.firstname.lower()))

    def __lt__(self, other):
        return ((self.lastname.lower(), self.firstname.lower()) <
                (other.lastname.lower(), other.firstname.lower()))
@end example

With the `total_ordering' decorator, the remaining comparison methods
are filled in automatically.

(Contributed by Raymond Hettinger.)

@item 
To aid in porting programs from Python 2, the @ref{13df,,functools.cmp_to_key()}
function converts an old-style comparison function to
modern @ref{1005,,key function}:

@example
>>> # locale-aware sort order
>>> sorted(iterable, key=cmp_to_key(locale.strcoll))
@end example

For sorting examples and a brief sorting tutorial, see the Sorting HowTo@footnote{https://wiki.python.org/moin/HowTo/Sorting/} tutorial.

(Contributed by Raymond Hettinger.)
@end itemize

@node itertools<8>,collections<8>,functools<8>,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 itertools}@anchor{13e0}
@subsubsection itertools



@itemize *

@item 
The @ref{85,,itertools} module has a new @ref{bef,,accumulate()} function
modeled on APL’s `scan' operator and Numpy’s `accumulate' function:

@example
>>> from itertools import accumulate
>>> list(accumulate([8, 2, 50]))
[8, 10, 60]
@end example

@example
>>> prob_dist = [0.1, 0.4, 0.2, 0.3]
>>> list(accumulate(prob_dist))      # cumulative probability distribution
[0.1, 0.5, 0.7, 1.0]
@end example

For an example using @ref{bef,,accumulate()}, see the @ref{13e1,,examples for the random module}.

(Contributed by Raymond Hettinger and incorporating design suggestions
from Mark Dickinson.)
@end itemize

@node collections<8>,threading<10>,itertools<8>,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 collections}@anchor{13e2}
@subsubsection collections



@itemize *

@item 
The @ref{1296,,collections.Counter} class now has two forms of in-place
subtraction, the existing `-=' operator for saturating subtraction@footnote{https://en.wikipedia.org/wiki/Saturation_arithmetic} and the new
@ref{13e3,,subtract()} method for regular subtraction.  The
former is suitable for multisets@footnote{https://en.wikipedia.org/wiki/Multiset}
which only have positive counts, and the latter is more suitable for use cases
that allow negative counts:

@example
>>> from collections import Counter
>>> tally = Counter(dogs=5, cats=3)
>>> tally -= Counter(dogs=2, cats=8)    # saturating subtraction
>>> tally
Counter(@{'dogs': 3@})
@end example

@example
>>> tally = Counter(dogs=5, cats=3)
>>> tally.subtract(dogs=2, cats=8)      # regular subtraction
>>> tally
Counter(@{'dogs': 3, 'cats': -5@})
@end example

(Contributed by Raymond Hettinger.)

@item 
The @ref{7f2,,collections.OrderedDict} class has a new method
@ref{13e4,,move_to_end()} which takes an existing key and
moves it to either the first or last position in the ordered sequence.

The default is to move an item to the last position.  This is equivalent of
renewing an entry with @code{od[k] = od.pop(k)}.

A fast move-to-end operation is useful for resequencing entries.  For example,
an ordered dictionary can be used to track order of access by aging entries
from the oldest to the most recently accessed.

@example
>>> from collections import OrderedDict
>>> d = OrderedDict.fromkeys(['a', 'b', 'X', 'd', 'e'])
>>> list(d)
['a', 'b', 'X', 'd', 'e']
>>> d.move_to_end('X')
>>> list(d)
['a', 'b', 'd', 'e', 'X']
@end example

(Contributed by Raymond Hettinger.)

@item 
The @ref{7f3,,collections.deque} class grew two new methods
@ref{13e5,,count()} and @ref{13e6,,reverse()} that
make them more substitutable for @ref{24d,,list} objects:

@example
>>> from collections import deque
>>> d = deque('simsalabim')
>>> d.count('s')
2
>>> d.reverse()
>>> d
deque(['m', 'i', 'b', 'a', 'l', 'a', 's', 'm', 'i', 's'])
@end example

(Contributed by Raymond Hettinger.)
@end itemize

@node threading<10>,datetime and time,collections<8>,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 threading}@anchor{13e7}
@subsubsection threading


The @ref{f3,,threading} module has a new @ref{13e8,,Barrier}
synchronization class for making multiple threads wait until all of them have
reached a common barrier point.  Barriers are useful for making sure that a task
with multiple preconditions does not run until all of the predecessor tasks are
complete.

Barriers can work with an arbitrary number of threads.  This is a generalization
of a Rendezvous@footnote{https://en.wikipedia.org/wiki/Synchronous_rendezvous} which
is defined for only two threads.

Implemented as a two-phase cyclic barrier, @ref{13e8,,Barrier} objects
are suitable for use in loops.  The separate `filling' and `draining' phases
assure that all threads get released (drained) before any one of them can loop
back and re-enter the barrier.  The barrier fully resets after each cycle.

Example of using barriers:

@example
from threading import Barrier, Thread

def get_votes(site):
    ballots = conduct_election(site)
    all_polls_closed.wait()        # do not count until all polls are closed
    totals = summarize(ballots)
    publish(site, totals)

all_polls_closed = Barrier(len(sites))
for site in sites:
    Thread(target=get_votes, args=(site,)).start()
@end example

In this example, the barrier enforces a rule that votes cannot be counted at any
polling site until all polls are closed.  Notice how a solution with a barrier
is similar to one with @ref{13e9,,threading.Thread.join()}, but the threads stay alive
and continue to do work (summarizing ballots) after the barrier point is
crossed.

If any of the predecessor tasks can hang or be delayed, a barrier can be created
with an optional `timeout' parameter.  Then if the timeout period elapses before
all the predecessor tasks reach the barrier point, all waiting threads are
released and a @ref{13ea,,BrokenBarrierError} exception is raised:

@example
def get_votes(site):
    ballots = conduct_election(site)
    try:
        all_polls_closed.wait(timeout=midnight - time.now())
    except BrokenBarrierError:
        lockbox = seal_ballots(ballots)
        queue.put(lockbox)
    else:
        totals = summarize(ballots)
        publish(site, totals)
@end example

In this example, the barrier enforces a more robust rule.  If some election
sites do not finish before midnight, the barrier times-out and the ballots are
sealed and deposited in a queue for later handling.

See Barrier Synchronization Patterns@footnote{https://osl.cs.illinois.edu/media/papers/karmani-2009-barrier_synchronization_pattern.pdf}
for more examples of how barriers can be used in parallel computing.  Also, there is
a simple but thorough explanation of barriers in The Little Book of Semaphores@footnote{https://greenteapress.com/semaphores/LittleBookOfSemaphores.pdf}, `section 3.6'.

(Contributed by Kristján Valur Jónsson with an API review by Jeffrey Yasskin in
bpo-8777@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8777}.)

@node datetime and time,math<11>,threading<10>,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 datetime-and-time}@anchor{13eb}
@subsubsection datetime and time



@itemize *

@item 
The @ref{34,,datetime} module has a new type @ref{12c4,,timezone} that
implements the @ref{7f5,,tzinfo} interface by returning a fixed UTC
offset and timezone name. This makes it easier to create timezone-aware
datetime objects:

@example
>>> import datetime as dt

>>> dt.datetime.now(dt.timezone.utc)
datetime.datetime(2010, 12, 8, 21, 4, 2, 923754, tzinfo=datetime.timezone.utc)

>>> dt.datetime.strptime("01/01/2000 12:00 +0000", "%m/%d/%Y %H:%M %z")
datetime.datetime(2000, 1, 1, 12, 0, tzinfo=datetime.timezone.utc)
@end example

@item 
Also, @ref{bc2,,timedelta} objects can now be multiplied by
@ref{196,,float} and divided by @code{float} and @ref{19b,,int} objects.
And @code{timedelta} objects can now divide one another.

@item 
The @ref{e8e,,datetime.date.strftime()} method is no longer restricted to years
after 1900.  The new supported year range is from 1000 to 9999 inclusive.

@item 
Whenever a two-digit year is used in a time tuple, the interpretation has been
governed by @code{time.accept2dyear}.  The default is @code{True} which means that
for a two-digit year, the century is guessed according to the POSIX rules
governing the @code{%y} strptime format.

Starting with Py3.2, use of the century guessing heuristic will emit a
@ref{1a3,,DeprecationWarning}.  Instead, it is recommended that
@code{time.accept2dyear} be set to @code{False} so that large date ranges
can be used without guesswork:

@example
>>> import time, warnings
>>> warnings.resetwarnings()      # remove the default warning filters

>>> time.accept2dyear = True      # guess whether 11 means 11 or 2011
>>> time.asctime((11, 1, 1, 12, 34, 56, 4, 1, 0))
Warning (from warnings module):
  ...
DeprecationWarning: Century info guessed for a 2-digit year.
'Fri Jan  1 12:34:56 2011'

>>> time.accept2dyear = False     # use the full range of allowable dates
>>> time.asctime((11, 1, 1, 12, 34, 56, 4, 1, 0))
'Fri Jan  1 12:34:56 11'
@end example

Several functions now have significantly expanded date ranges.  When
@code{time.accept2dyear} is false, the @ref{13ec,,time.asctime()} function will
accept any year that fits in a C int, while the @ref{13ed,,time.mktime()} and
@ref{13ee,,time.strftime()} functions will accept the full range supported by the
corresponding operating system functions.
@end itemize

(Contributed by Alexander Belopolsky and Victor Stinner in bpo-1289118@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1289118},
bpo-5094@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5094}, bpo-6641@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6641}, bpo-2706@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2706}, bpo-1777412@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1777412}, bpo-8013@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8013},
and bpo-10827@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10827}.)

@c XXX https://bugs.python.org/issue?%40search_text=datetime&%40sort=-activity

@node math<11>,abc<3>,datetime and time,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 math}@anchor{13ef}
@subsubsection math


The @ref{92,,math} module has been updated with six new functions inspired by the
C99 standard.

The @ref{13f0,,isfinite()} function provides a reliable and fast way to detect
special values.  It returns @code{True} for regular numbers and @code{False} for `Nan' or
`Infinity':

@example
>>> from math import isfinite
>>> [isfinite(x) for x in (123, 4.56, float('Nan'), float('Inf'))]
[True, True, False, False]
@end example

The @ref{13f1,,expm1()} function computes @code{e**x-1} for small values of `x'
without incurring the loss of precision that usually accompanies the subtraction
of nearly equal quantities:

@example
>>> from math import expm1
>>> expm1(0.013671875)   # more accurate way to compute e**x-1 for a small x
0.013765762467652909
@end example

The @ref{dd2,,erf()} function computes a probability integral or Gaussian error function@footnote{https://en.wikipedia.org/wiki/Error_function}.  The
complementary error function, @ref{dd3,,erfc()}, is @code{1 - erf(x)}:

@example
>>> from math import erf, erfc, sqrt
>>> erf(1.0/sqrt(2.0))   # portion of normal distribution within 1 standard deviation
0.682689492137086
>>> erfc(1.0/sqrt(2.0))  # portion of normal distribution outside 1 standard deviation
0.31731050786291404
>>> erf(1.0/sqrt(2.0)) + erfc(1.0/sqrt(2.0))
1.0
@end example

The @ref{13f2,,gamma()} function is a continuous extension of the factorial
function.  See @indicateurl{https://en.wikipedia.org/wiki/Gamma_function} for details.  Because
the function is related to factorials, it grows large even for small values of
`x', so there is also a @ref{13f3,,lgamma()} function for computing the natural
logarithm of the gamma function:

@example
>>> from math import gamma, lgamma
>>> gamma(7.0)           # six factorial
720.0
>>> lgamma(801.0)        # log(800 factorial)
4551.950730698041
@end example

(Contributed by Mark Dickinson.)

@node abc<3>,io<9>,math<11>,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 abc}@anchor{13f4}
@subsubsection abc


The @ref{4,,abc} module now supports @ref{128b,,abstractclassmethod()} and
@ref{128c,,abstractstaticmethod()}.

These tools make it possible to define an @ref{13bb,,abstract base class} that
requires a particular @ref{48f,,classmethod()} or @ref{453,,staticmethod()} to be
implemented:

@example
class Temperature(metaclass=abc.ABCMeta):
    @@abc.abstractclassmethod
    def from_fahrenheit(cls, t):
        ...
    @@abc.abstractclassmethod
    def from_celsius(cls, t):
        ...
@end example

(Patch submitted by Daniel Urban; bpo-5867@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5867}.)

@node io<9>,reprlib,abc<3>,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 io}@anchor{13f5}
@subsubsection io


The @ref{10a3,,io.BytesIO} has a new method, @ref{13f6,,getbuffer()}, which
provides functionality similar to @ref{165,,memoryview()}.  It creates an editable
view of the data without making a copy.  The buffer’s random access and support
for slice notation are well-suited to in-place editing:

@example
>>> REC_LEN, LOC_START, LOC_LEN = 34, 7, 11

>>> def change_location(buffer, record_number, location):
...     start = record_number * REC_LEN + LOC_START
...     buffer[start: start+LOC_LEN] = location

>>> import io

>>> byte_stream = io.BytesIO(
...     b'G3805  storeroom  Main chassis    '
...     b'X7899  shipping   Reserve cog     '
...     b'L6988  receiving  Primary sprocket'
... )
>>> buffer = byte_stream.getbuffer()
>>> change_location(buffer, 1, b'warehouse  ')
>>> change_location(buffer, 0, b'showroom   ')
>>> print(byte_stream.getvalue())
b'G3805  showroom   Main chassis    '
b'X7899  warehouse  Reserve cog     '
b'L6988  receiving  Primary sprocket'
@end example

(Contributed by Antoine Pitrou in bpo-5506@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5506}.)

@node reprlib,logging<8>,io<9>,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 reprlib}@anchor{13f7}
@subsubsection reprlib


When writing a @ref{82e,,__repr__()} method for a custom container, it is easy to
forget to handle the case where a member refers back to the container itself.
Python’s builtin objects such as @ref{24d,,list} and @ref{184,,set} handle
self-reference by displaying “…” in the recursive part of the representation
string.

To help write such @ref{82e,,__repr__()} methods, the @ref{c0,,reprlib} module has a new
decorator, @ref{13f8,,recursive_repr()}, for detecting recursive calls to
@code{__repr__()} and substituting a placeholder string instead:

@example
>>> class MyList(list):
...     @@recursive_repr()
...     def __repr__(self):
...         return '<' + '|'.join(map(repr, self)) + '>'
...
>>> m = MyList('abc')
>>> m.append(m)
>>> m.append('x')
>>> print(m)
<'a'|'b'|'c'|...|'x'>
@end example

(Contributed by Raymond Hettinger in bpo-9826@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9826} and bpo-9840@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9840}.)

@node logging<8>,csv<4>,reprlib,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 logging}@anchor{13f9}
@subsubsection logging


In addition to dictionary-based configuration described above, the
@ref{8b,,logging} package has many other improvements.

The logging documentation has been augmented by a @ref{13fa,,basic tutorial}, an @ref{13fb,,advanced tutorial}, and a @ref{13fc,,cookbook} of
logging recipes.  These documents are the fastest way to learn about logging.

The @ref{bf2,,logging.basicConfig()} set-up function gained a `style' argument to
support three different types of string formatting.  It defaults to “%” for
traditional %-formatting, can be set to “@{” for the new @ref{832,,str.format()} style, or
can be set to “$” for the shell-style formatting provided by
@ref{896,,string.Template}.  The following three configurations are equivalent:

@example
>>> from logging import basicConfig
>>> basicConfig(style='%', format="%(name)s -> %(levelname)s: %(message)s")
>>> basicConfig(style='@{', format="@{name@} -> @{levelname@} @{message@}")
>>> basicConfig(style='$', format="$name -> $levelname: $message")
@end example

If no configuration is set-up before a logging event occurs, there is now a
default configuration using a @ref{13fd,,StreamHandler} directed to
@ref{b33,,sys.stderr} for events of @code{WARNING} level or higher.  Formerly, an
event occurring before a configuration was set-up would either raise an
exception or silently drop the event depending on the value of
@ref{13fe,,logging.raiseExceptions}.  The new default handler is stored in
@ref{13ff,,logging.lastResort}.

The use of filters has been simplified.  Instead of creating a
@ref{1400,,Filter} object, the predicate can be any Python callable that
returns @code{True} or @code{False}.

There were a number of other improvements that add flexibility and simplify
configuration.  See the module documentation for a full listing of changes in
Python 3.2.

@node csv<4>,contextlib<8>,logging<8>,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 csv}@anchor{1401}
@subsubsection csv


The @ref{2d,,csv} module now supports a new dialect, @ref{1402,,unix_dialect},
which applies quoting for all fields and a traditional Unix style with @code{'\n'} as
the line terminator.  The registered dialect name is @code{unix}.

The @ref{1403,,csv.DictWriter} has a new method,
@ref{1404,,writeheader()} for writing-out an initial row to document
the field names:

@example
>>> import csv, sys
>>> w = csv.DictWriter(sys.stdout, ['name', 'dept'], dialect='unix')
>>> w.writeheader()
"name","dept"
>>> w.writerows([
...     @{'name': 'tom', 'dept': 'accounting'@},
...     @{'name': 'susan', 'dept': 'Salesl'@}])
"tom","accounting"
"susan","sales"
@end example

(New dialect suggested by Jay Talbot in bpo-5975@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5975}, and the new method
suggested by Ed Abraham in bpo-1537721@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1537721}.)

@node contextlib<8>,decimal and fractions,csv<4>,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 contextlib}@anchor{1405}
@subsubsection contextlib


There is a new and slightly mind-blowing tool
@ref{1406,,ContextDecorator} that is helpful for creating a
@ref{1e1,,context manager} that does double duty as a function decorator.

As a convenience, this new functionality is used by
@ref{1407,,contextmanager()} so that no extra effort is needed to support
both roles.

The basic idea is that both context managers and function decorators can be used
for pre-action and post-action wrappers.  Context managers wrap a group of
statements using a @ref{186,,with} statement, and function decorators wrap a
group of statements enclosed in a function.  So, occasionally there is a need to
write a pre-action or post-action wrapper that can be used in either role.

For example, it is sometimes useful to wrap functions or groups of statements
with a logger that can track the time of entry and time of exit.  Rather than
writing both a function decorator and a context manager for the task, the
@ref{1407,,contextmanager()} provides both capabilities in a single
definition:

@example
from contextlib import contextmanager
import logging

logging.basicConfig(level=logging.INFO)

@@contextmanager
def track_entry_and_exit(name):
    logging.info('Entering: %s', name)
    yield
    logging.info('Exiting: %s', name)
@end example

Formerly, this would have only been usable as a context manager:

@example
with track_entry_and_exit('widget loader'):
    print('Some time consuming activity goes here')
    load_widget()
@end example

Now, it can be used as a decorator as well:

@example
@@track_entry_and_exit('widget loader')
def activity():
    print('Some time consuming activity goes here')
    load_widget()
@end example

Trying to fulfill two roles at once places some limitations on the technique.
Context managers normally have the flexibility to return an argument usable by
a @ref{186,,with} statement, but there is no parallel for function decorators.

In the above example, there is not a clean way for the `track_entry_and_exit'
context manager to return a logging instance for use in the body of enclosed
statements.

(Contributed by Michael Foord in bpo-9110@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9110}.)

@node decimal and fractions,ftp,contextlib<8>,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 decimal-and-fractions}@anchor{1408}
@subsubsection decimal and fractions


Mark Dickinson crafted an elegant and efficient scheme for assuring that
different numeric datatypes will have the same hash value whenever their actual
values are equal (bpo-8188@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8188}):

@example
assert hash(Fraction(3, 2)) == hash(1.5) == \
       hash(Decimal("1.5")) == hash(complex(1.5, 0))
@end example

Some of the hashing details are exposed through a new attribute,
@ref{11fe,,sys.hash_info}, which describes the bit width of the hash value, the
prime modulus, the hash values for `infinity' and `nan', and the multiplier
used for the imaginary part of a number:

@example
>>> sys.hash_info
sys.hash_info(width=64, modulus=2305843009213693951, inf=314159, nan=0, imag=1000003)
@end example

An early decision to limit the interoperability of various numeric types has
been relaxed.  It is still unsupported (and ill-advised) to have implicit
mixing in arithmetic expressions such as @code{Decimal('1.1') + float('1.1')}
because the latter loses information in the process of constructing the binary
float.  However, since existing floating-point value can be converted losslessly
to either a decimal or rational representation, it makes sense to add them to
the constructor and to support mixed-type comparisons.


@itemize *

@item 
The @ref{1fe,,decimal.Decimal} constructor now accepts @ref{196,,float} objects
directly so there in no longer a need to use the @ref{1409,,from_float()}
method (bpo-8257@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8257}).

@item 
Mixed type comparisons are now fully supported so that
@ref{1fe,,Decimal} objects can be directly compared with @ref{196,,float}
and @ref{213,,fractions.Fraction} (bpo-2531@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2531} and bpo-8188@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8188}).
@end itemize

Similar changes were made to @ref{213,,fractions.Fraction} so that the
@ref{140a,,from_float()} and @ref{140b,,from_decimal()}
methods are no longer needed (bpo-8294@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8294}):

@example
>>> from decimal import Decimal
>>> from fractions import Fraction
>>> Decimal(1.1)
Decimal('1.100000000000000088817841970012523233890533447265625')
>>> Fraction(1.1)
Fraction(2476979795053773, 2251799813685248)
@end example

Another useful change for the @ref{3a,,decimal} module is that the
@ref{13a3,,Context.clamp} attribute is now public.  This is useful in creating
contexts that correspond to the decimal interchange formats specified in IEEE
754 (see bpo-8540@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8540}).

(Contributed by Mark Dickinson and Raymond Hettinger.)

@node ftp,popen,decimal and fractions,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 ftp}@anchor{140c}
@subsubsection ftp


The @ref{af6,,ftplib.FTP} class now supports the context management protocol to
unconditionally consume @ref{1255,,socket.error} exceptions and to close the FTP
connection when done:

@example
>>> from ftplib import FTP
>>> with FTP("ftp1.at.proftpd.org") as ftp:
        ftp.login()
        ftp.dir()

'230 Anonymous login ok, restrictions apply.'
dr-xr-xr-x   9 ftp      ftp           154 May  6 10:43 .
dr-xr-xr-x   9 ftp      ftp           154 May  6 10:43 ..
dr-xr-xr-x   5 ftp      ftp          4096 May  6 10:43 CentOS
dr-xr-xr-x   3 ftp      ftp            18 Jul 10  2008 Fedora
@end example

Other file-like objects such as @ref{518,,mmap.mmap} and @ref{a00,,fileinput.input()}
also grew auto-closing context managers:

@example
with fileinput.input(files=('log1.txt', 'log2.txt')) as f:
    for line in f:
        process(line)
@end example

(Contributed by Tarek Ziadé and Giampaolo Rodolà in bpo-4972@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4972}, and
by Georg Brandl in bpo-8046@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8046} and bpo-1286@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1286}.)

The @ref{af7,,FTP_TLS} class now accepts a `context' parameter, which is a
@ref{357,,ssl.SSLContext} object allowing bundling SSL configuration options,
certificates and private keys into a single (potentially long-lived) structure.

(Contributed by Giampaolo Rodolà; bpo-8806@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8806}.)

@node popen,select<3>,ftp,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 popen}@anchor{140d}
@subsubsection popen


The @ref{31a,,os.popen()} and @ref{4b8,,subprocess.Popen()} functions now support
@ref{186,,with} statements for auto-closing of the file descriptors.

(Contributed by Antoine Pitrou and Brian Curtin in bpo-7461@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7461} and
bpo-10554@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10554}.)

@node select<3>,gzip and zipfile,popen,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 select}@anchor{140e}
@subsubsection select


The @ref{c6,,select} module now exposes a new, constant attribute,
@ref{140f,,PIPE_BUF}, which gives the minimum number of bytes which are
guaranteed not to block when @ref{f9f,,select.select()} says a pipe is ready
for writing.

@example
>>> import select
>>> select.PIPE_BUF
512
@end example

(Available on Unix systems. Patch by Sébastien Sablé in bpo-9862@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9862})

@node gzip and zipfile,tarfile<10>,select<3>,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 gzip-and-zipfile}@anchor{1410}
@subsubsection gzip and zipfile


@ref{65a,,gzip.GzipFile} now implements the @ref{8a2,,io.BufferedIOBase}
@ref{13bb,,abstract base class} (except for @code{truncate()}).  It also has a
@ref{1411,,peek()} method and supports unseekable as well as
zero-padded file objects.

The @ref{6b,,gzip} module also gains the @ref{84d,,compress()} and
@ref{1412,,decompress()} functions for easier in-memory compression and
decompression.  Keep in mind that text needs to be encoded as @ref{192,,bytes}
before compressing and decompressing:

@example
>>> import gzip
>>> s = 'Three shall be the number thou shalt count, '
>>> s += 'and the number of the counting shall be three'
>>> b = s.encode()                        # convert to utf-8
>>> len(b)
89
>>> c = gzip.compress(b)
>>> len(c)
77
>>> gzip.decompress(c).decode()[:42]      # decompress and convert to text
'Three shall be the number thou shalt count'
@end example

(Contributed by Anand B. Pillai in bpo-3488@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=3488}; and by Antoine Pitrou, Nir
Aides and Brian Curtin in bpo-9962@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9962}, bpo-1675951@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1675951}, bpo-7471@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7471} and
bpo-2846@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2846}.)

Also, the @ref{65b,,zipfile.ZipExtFile} class was reworked internally to represent
files stored inside an archive.  The new implementation is significantly faster
and can be wrapped in an @ref{1413,,io.BufferedReader} object for more speedups.  It
also solves an issue where interleaved calls to `read' and `readline' gave the
wrong results.

(Patch submitted by Nir Aides in bpo-7610@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7610}.)

@node tarfile<10>,hashlib<7>,gzip and zipfile,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 tarfile}@anchor{1414}
@subsubsection tarfile


The @ref{1415,,TarFile} class can now be used as a context manager.  In
addition, its @ref{ded,,add()} method has a new option, `filter',
that controls which files are added to the archive and allows the file metadata
to be edited.

The new `filter' option replaces the older, less flexible `exclude' parameter
which is now deprecated.  If specified, the optional `filter' parameter needs to
be a @ref{f0d,,keyword argument}.  The user-supplied filter function accepts a
@ref{1416,,TarInfo} object and returns an updated
@code{TarInfo} object, or if it wants the file to be excluded, the
function can return @code{None}:

@example
>>> import tarfile, glob

>>> def myfilter(tarinfo):
...     if tarinfo.isfile():             # only save real files
...         tarinfo.uname = 'monty'      # redact the user name
...         return tarinfo

>>> with tarfile.open(name='myarchive.tar.gz', mode='w:gz') as tf:
...     for filename in glob.glob('*.txt'):
...         tf.add(filename, filter=myfilter)
...     tf.list()
-rw-r--r-- monty/501        902 2011-01-26 17:59:11 annotations.txt
-rw-r--r-- monty/501        123 2011-01-26 17:59:11 general_questions.txt
-rw-r--r-- monty/501       3514 2011-01-26 17:59:11 prion.txt
-rw-r--r-- monty/501        124 2011-01-26 17:59:11 py_todo.txt
-rw-r--r-- monty/501       1399 2011-01-26 17:59:11 semaphore_notes.txt
@end example

(Proposed by Tarek Ziadé and implemented by Lars Gustäbel in bpo-6856@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6856}.)

@node hashlib<7>,ast<7>,tarfile<10>,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 hashlib}@anchor{1417}
@subsubsection hashlib


The @ref{6c,,hashlib} module has two new constant attributes listing the hashing
algorithms guaranteed to be present in all implementations and those available
on the current implementation:

@example
>>> import hashlib

>>> hashlib.algorithms_guaranteed
@{'sha1', 'sha224', 'sha384', 'sha256', 'sha512', 'md5'@}

>>> hashlib.algorithms_available
@{'md2', 'SHA256', 'SHA512', 'dsaWithSHA', 'mdc2', 'SHA224', 'MD4', 'sha256',
'sha512', 'ripemd160', 'SHA1', 'MDC2', 'SHA', 'SHA384', 'MD2',
'ecdsa-with-SHA1','md4', 'md5', 'sha1', 'DSA-SHA', 'sha224',
'dsaEncryption', 'DSA', 'RIPEMD160', 'sha', 'MD5', 'sha384'@}
@end example

(Suggested by Carl Chenet in bpo-7418@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7418}.)

@node ast<7>,os<14>,hashlib<7>,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 ast}@anchor{1418}
@subsubsection ast


The @ref{9,,ast} module has a wonderful a general-purpose tool for safely
evaluating expression strings using the Python literal
syntax.  The @ref{e11,,ast.literal_eval()} function serves as a secure alternative to
the builtin @ref{4a4,,eval()} function which is easily abused.  Python 3.2 adds
@ref{192,,bytes} and @ref{184,,set} literals to the list of supported types:
strings, bytes, numbers, tuples, lists, dicts, sets, booleans, and @code{None}.

@example
>>> from ast import literal_eval

>>> request = "@{'req': 3, 'func': 'pow', 'args': (2, 0.5)@}"
>>> literal_eval(request)
@{'args': (2, 0.5), 'req': 3, 'func': 'pow'@}

>>> request = "os.system('do something harmful')"
>>> literal_eval(request)
Traceback (most recent call last):
  ...
ValueError: malformed node or string: <_ast.Call object at 0x101739a10>
@end example

(Implemented by Benjamin Peterson and Georg Brandl.)

@node os<14>,shutil<7>,ast<7>,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 os}@anchor{1419}
@subsubsection os


Different operating systems use various encodings for filenames and environment
variables.  The @ref{a5,,os} module provides two new functions,
@ref{e4e,,fsencode()} and @ref{e4d,,fsdecode()}, for encoding and decoding
filenames:

@example
>>> import os
>>> filename = 'Sehenswürdigkeiten'
>>> os.fsencode(filename)
b'Sehensw\xc3\xbcrdigkeiten'
@end example

Some operating systems allow direct access to encoded bytes in the
environment.  If so, the @ref{141a,,os.supports_bytes_environ} constant will be
true.

For direct access to encoded environment variables (if available),
use the new @ref{141b,,os.getenvb()} function or use @ref{25a,,os.environb}
which is a bytes version of @ref{259,,os.environ}.

(Contributed by Victor Stinner.)

@node shutil<7>,sqlite3<12>,os<14>,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 shutil}@anchor{141c}
@subsubsection shutil


The @ref{c1d,,shutil.copytree()} function has two new options:


@itemize *

@item 
`ignore_dangling_symlinks': when @code{symlinks=False} so that the function
copies a file pointed to by a symlink, not the symlink itself. This option
will silence the error raised if the file doesn’t exist.

@item 
`copy_function': is a callable that will be used to copy files.
@ref{c4f,,shutil.copy2()} is used by default.
@end itemize

(Contributed by Tarek Ziadé.)

In addition, the @ref{ca,,shutil} module now supports @ref{141d,,archiving operations} for zipfiles, uncompressed tarfiles, gzipped tarfiles,
and bzipped tarfiles.  And there are functions for registering additional
archiving file formats (such as xz compressed tarfiles or custom formats).

The principal functions are @ref{6d9,,make_archive()} and
@ref{695,,unpack_archive()}.  By default, both operate on the current
directory (which can be set by @ref{820,,os.chdir()}) and on any sub-directories.
The archive filename needs to be specified with a full pathname.  The archiving
step is non-destructive (the original files are left unchanged).

@example
>>> import shutil, pprint

>>> os.chdir('mydata')  # change to the source directory
>>> f = shutil.make_archive('/var/backup/mydata',
...                         'zip')      # archive the current directory
>>> f                                   # show the name of archive
'/var/backup/mydata.zip'
>>> os.chdir('tmp')                     # change to an unpacking
>>> shutil.unpack_archive('/var/backup/mydata.zip')  # recover the data

>>> pprint.pprint(shutil.get_archive_formats())  # display known formats
[('bztar', "bzip2'ed tar-file"),
 ('gztar', "gzip'ed tar-file"),
 ('tar', 'uncompressed tar file'),
 ('zip', 'ZIP file')]

>>> shutil.register_archive_format(     # register a new archive format
...     name='xz',
...     function=xz.compress,           # callable archiving function
...     extra_args=[('level', 8)],      # arguments to the function
...     description='xz compression'
... )
@end example

(Contributed by Tarek Ziadé.)

@node sqlite3<12>,html<3>,shutil<7>,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 sqlite3}@anchor{141e}
@subsubsection sqlite3


The @ref{d4,,sqlite3} module was updated to pysqlite version 2.6.0.  It has two new capabilities.


@itemize *

@item 
The @code{sqlite3.Connection.in_transit} attribute is true if there is an
active transaction for uncommitted changes.

@item 
The @ref{a3f,,sqlite3.Connection.enable_load_extension()} and
@ref{6de,,sqlite3.Connection.load_extension()} methods allows you to load SQLite
extensions from “.so” files.  One well-known extension is the fulltext-search
extension distributed with SQLite.
@end itemize

(Contributed by R. David Murray and Shashwat Anand; bpo-8845@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8845}.)

@node html<3>,socket<12>,sqlite3<12>,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 html}@anchor{141f}
@subsubsection html


A new @ref{6f,,html} module was introduced with only a single function,
@ref{120d,,escape()}, which is used for escaping reserved characters from HTML
markup:

@example
>>> import html
>>> html.escape('x > 2 && x < 7')
'x &gt; 2 &amp;&amp; x &lt; 7'
@end example

@node socket<12>,ssl<13>,html<3>,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 socket}@anchor{1420}
@subsubsection socket


The @ref{d1,,socket} module has two new improvements.


@itemize *

@item 
Socket objects now have a @ref{1421,,detach()} method which puts
the socket into closed state without actually closing the underlying file
descriptor.  The latter can then be reused for other purposes.
(Added by Antoine Pitrou; bpo-8524@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8524}.)

@item 
@ref{881,,socket.create_connection()} now supports the context management protocol
to unconditionally consume @ref{1255,,socket.error} exceptions and to close the
socket when done.
(Contributed by Giampaolo Rodolà; bpo-9794@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9794}.)
@end itemize

@node ssl<13>,nntp,socket<12>,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 ssl}@anchor{1422}
@subsubsection ssl


The @ref{d5,,ssl} module added a number of features to satisfy common requirements
for secure (encrypted, authenticated) internet connections:


@itemize *

@item 
A new class, @ref{357,,SSLContext}, serves as a container for persistent
SSL data, such as protocol settings, certificates, private keys, and various
other options. It includes a @ref{747,,wrap_socket()} for creating
an SSL socket from an SSL context.

@item 
A new function, @code{ssl.match_hostname()}, supports server identity
verification for higher-level protocols by implementing the rules of HTTPS
(from 
@geindex RFC; RFC 2818
RFC 2818@footnote{https://datatracker.ietf.org/doc/html/rfc2818.html}) which are also suitable for other protocols.

@item 
The @ref{747,,ssl.wrap_socket()} constructor function now takes a `ciphers'
argument.  The `ciphers' string lists the allowed encryption algorithms using
the format described in the OpenSSL documentation@footnote{https://docs.openssl.org/1.0.2/man1/ciphers/#cipher-list-format}.

@item 
When linked against recent versions of OpenSSL, the @ref{d5,,ssl} module now
supports the Server Name Indication extension to the TLS protocol, allowing
multiple “virtual hosts” using different certificates on a single IP port.
This extension is only supported in client mode, and is activated by passing
the `server_hostname' argument to @ref{747,,ssl.SSLContext.wrap_socket()}.

@item 
Various options have been added to the @ref{d5,,ssl} module, such as
@ref{a3a,,OP_NO_SSLv2} which disables the insecure and obsolete SSLv2
protocol.

@item 
The extension now loads all the OpenSSL ciphers and digest algorithms.  If
some SSL certificates cannot be verified, they are reported as an “unknown
algorithm” error.

@item 
The version of OpenSSL being used is now accessible using the module
attributes @ref{1423,,ssl.OPENSSL_VERSION} (a string),
@ref{1424,,ssl.OPENSSL_VERSION_INFO} (a 5-tuple), and
@ref{1425,,ssl.OPENSSL_VERSION_NUMBER} (an integer).
@end itemize

(Contributed by Antoine Pitrou in bpo-8850@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8850}, bpo-1589@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1589}, bpo-8322@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8322},
bpo-5639@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5639}, bpo-4870@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4870}, bpo-8484@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8484}, and bpo-8321@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8321}.)

@node nntp,certificates,ssl<13>,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 nntp}@anchor{1426}
@subsubsection nntp


The @code{nntplib} module has a revamped implementation with better bytes and
text semantics as well as more practical APIs.  These improvements break
compatibility with the nntplib version in Python 3.1, which was partly
dysfunctional in itself.

Support for secure connections through both implicit (using
@code{nntplib.NNTP_SSL}) and explicit (using @code{nntplib.NNTP.starttls()})
TLS has also been added.

(Contributed by Antoine Pitrou in bpo-9360@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9360} and Andrew Vant in bpo-1926@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1926}.)

@node certificates,imaplib<5>,nntp,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 certificates}@anchor{1427}
@subsubsection certificates


@ref{d35,,http.client.HTTPSConnection}, @ref{1428,,urllib.request.HTTPSHandler}
and @ref{307,,urllib.request.urlopen()} now take optional arguments to allow for
server certificate checking against a set of Certificate Authorities,
as recommended in public uses of HTTPS.

(Added by Antoine Pitrou, bpo-9003@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9003}.)

@node imaplib<5>,http client<4>,certificates,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 imaplib}@anchor{1429}
@subsubsection imaplib


Support for explicit TLS on standard IMAP4 connections has been added through
the new @ref{142a,,imaplib.IMAP4.starttls} method.

(Contributed by Lorenzo M. Catucci and Antoine Pitrou, bpo-4471@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4471}.)

@node http client<4>,unittest<12>,imaplib<5>,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 http-client}@anchor{142b}
@subsubsection http.client


There were a number of small API improvements in the @ref{73,,http.client} module.
The old-style HTTP 0.9 simple responses are no longer supported and the `strict'
parameter is deprecated in all classes.

The @ref{d34,,HTTPConnection} and
@ref{d35,,HTTPSConnection} classes now have a `source_address'
parameter for a (host, port) tuple indicating where the HTTP connection is made
from.

Support for certificate checking and HTTPS virtual hosts were added to
@ref{d35,,HTTPSConnection}.

The @ref{ea6,,request()} method on connection objects
allowed an optional `body' argument so that a @ref{13c8,,file object} could be used
to supply the content of the request.  Conveniently, the `body' argument now
also accepts an @ref{142c,,iterable} object so long as it includes an explicit
@code{Content-Length} header.  This extended interface is much more flexible than
before.

To establish an HTTPS connection through a proxy server, there is a new
@ref{142d,,set_tunnel()} method that sets the host and
port for HTTP Connect tunneling.

To match the behavior of @ref{76,,http.server}, the HTTP client library now also
encodes headers with ISO-8859-1 (Latin-1) encoding.  It was already doing that
for incoming headers, so now the behavior is consistent for both incoming and
outgoing traffic. (See work by Armin Ronacher in bpo-10980@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10980}.)

@node unittest<12>,random<5>,http client<4>,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 unittest}@anchor{142e}
@subsubsection unittest


The unittest module has a number of improvements supporting test discovery for
packages, easier experimentation at the interactive prompt, new testcase
methods, improved diagnostic messages for test failures, and better method
names.


@itemize *

@item 
The command-line call @code{python -m unittest} can now accept file paths
instead of module names for running specific tests (bpo-10620@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10620}).  The new
test discovery can find tests within packages, locating any test importable
from the top-level directory.  The top-level directory can be specified with
the @code{-t} option, a pattern for matching files with @code{-p}, and a directory to
start discovery with @code{-s}:

@example
$ python -m unittest discover -s my_proj_dir -p _test.py
@end example

(Contributed by Michael Foord.)

@item 
Experimentation at the interactive prompt is now easier because the
@ref{2b3,,unittest.TestCase} class can now be instantiated without
arguments:

@example
>>> from unittest import TestCase
>>> TestCase().assertEqual(pow(2, 3), 8)
@end example

(Contributed by Michael Foord.)

@item 
The @ref{10c,,unittest} module has two new methods,
@ref{1369,,assertWarns()} and
@ref{136a,,assertWarnsRegex()} to verify that a given warning type
is triggered by the code under test:

@example
with self.assertWarns(DeprecationWarning):
    legacy_function('XYZ')
@end example

(Contributed by Antoine Pitrou, bpo-9754@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9754}.)

Another new method, @ref{142f,,assertCountEqual()} is used to
compare two iterables to determine if their element counts are equal (whether
the same elements are present with the same number of occurrences regardless
of order):

@example
def test_anagram(self):
    self.assertCountEqual('algorithm', 'logarithm')
@end example

(Contributed by Raymond Hettinger.)

@item 
A principal feature of the unittest module is an effort to produce meaningful
diagnostics when a test fails.  When possible, the failure is recorded along
with a diff of the output.  This is especially helpful for analyzing log files
of failed test runs. However, since diffs can sometime be voluminous, there is
a new @ref{1430,,maxDiff} attribute that sets maximum length of
diffs displayed.

@item 
In addition, the method names in the module have undergone a number of clean-ups.

For example, @ref{750,,assertRegex()} is the new name for
@code{assertRegexpMatches()} which was misnamed because the
test uses @ref{1431,,re.search()}, not @ref{1432,,re.match()}.  Other methods using
regular expressions are now named using short form “Regex” in preference to
“Regexp” – this matches the names used in other unittest implementations,
matches Python’s old name for the @ref{be,,re} module, and it has unambiguous
camel-casing.

(Contributed by Raymond Hettinger and implemented by Ezio Melotti.)

@item 
To improve consistency, some long-standing method aliases are being
deprecated in favor of the preferred names:

@quotation


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Old Name

@tab

Preferred Name

@item

@code{assert_()}

@tab

@ref{749,,assertTrue()}

@item

@code{assertEquals()}

@tab

@ref{74b,,assertEqual()}

@item

@code{assertNotEquals()}

@tab

@ref{74c,,assertNotEqual()}

@item

@code{assertAlmostEquals()}

@tab

@ref{74d,,assertAlmostEqual()}

@item

@code{assertNotAlmostEquals()}

@tab

@ref{74e,,assertNotAlmostEqual()}

@end multitable

@end quotation

Likewise, the @code{TestCase.fail*} methods deprecated in Python 3.1 are expected
to be removed in Python 3.3.

(Contributed by Ezio Melotti; bpo-9424@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9424}.)

@item 
The @code{assertDictContainsSubset()} method was deprecated
because it was misimplemented with the arguments in the wrong order.  This
created hard-to-debug optical illusions where tests like
@code{TestCase().assertDictContainsSubset(@{'a':1, 'b':2@}, @{'a':1@})} would fail.

(Contributed by Raymond Hettinger.)
@end itemize

@node random<5>,poplib<4>,unittest<12>,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 random}@anchor{1433}
@subsubsection random


The integer methods in the @ref{bd,,random} module now do a better job of producing
uniform distributions.  Previously, they computed selections with
@code{int(n*random())} which had a slight bias whenever `n' was not a power of two.
Now, multiple selections are made from a range up to the next power of two and a
selection is kept only when it falls within the range @code{0 <= x < n}.  The
functions and methods affected are @ref{a6b,,randrange()},
@ref{1434,,randint()}, @ref{1435,,choice()}, @ref{94d,,shuffle()} and
@ref{94c,,sample()}.

(Contributed by Raymond Hettinger; bpo-9025@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9025}.)

@node poplib<4>,asyncore<2>,random<5>,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 poplib}@anchor{1436}
@subsubsection poplib


@ref{b1e,,POP3_SSL} class now accepts a `context' parameter, which is a
@ref{357,,ssl.SSLContext} object allowing bundling SSL configuration options,
certificates and private keys into a single (potentially long-lived)
structure.

(Contributed by Giampaolo Rodolà; bpo-8807@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8807}.)

@node asyncore<2>,tempfile<5>,poplib<4>,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 asyncore}@anchor{1437}
@subsubsection asyncore


@code{asyncore.dispatcher} now provides a
@code{handle_accepted()} method
returning a @code{(sock, addr)} pair which is called when a connection has actually
been established with a new remote endpoint. This is supposed to be used as a
replacement for old @code{handle_accept()} and avoids
the user  to call @code{accept()} directly.

(Contributed by Giampaolo Rodolà; bpo-6706@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6706}.)

@node tempfile<5>,inspect<11>,asyncore<2>,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 tempfile}@anchor{1438}
@subsubsection tempfile


The @ref{e6,,tempfile} module has a new context manager,
@ref{1439,,TemporaryDirectory} which provides easy deterministic
cleanup of temporary directories:

@example
with tempfile.TemporaryDirectory() as tmpdirname:
    print('created temporary dir:', tmpdirname)
@end example

(Contributed by Neil Schemenauer and Nick Coghlan; bpo-5178@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5178}.)

@node inspect<11>,pydoc<7>,tempfile<5>,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 inspect}@anchor{143a}
@subsubsection inspect



@itemize *

@item 
The @ref{82,,inspect} module has a new function
@ref{143b,,getgeneratorstate()} to easily identify the current state of a
generator-iterator:

@example
>>> from inspect import getgeneratorstate
>>> def gen():
...     yield 'demo'
...
>>> g = gen()
>>> getgeneratorstate(g)
'GEN_CREATED'
>>> next(g)
'demo'
>>> getgeneratorstate(g)
'GEN_SUSPENDED'
>>> next(g, None)
>>> getgeneratorstate(g)
'GEN_CLOSED'
@end example

(Contributed by Rodolpho Eckhardt and Nick Coghlan, bpo-10220@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10220}.)

@item 
To support lookups without the possibility of activating a dynamic attribute,
the @ref{82,,inspect} module has a new function, @ref{6bb,,getattr_static()}.
Unlike @ref{6f8,,hasattr()}, this is a true read-only search, guaranteed not to
change state while it is searching:

@example
>>> class A:
...     @@property
...     def f(self):
...         print('Running')
...         return 10
...
>>> a = A()
>>> getattr(a, 'f')
Running
10
>>> inspect.getattr_static(a, 'f')
<property object at 0x1022bd788>
@end example
@end itemize

@quotation

(Contributed by Michael Foord.)
@end quotation

@node pydoc<7>,dis<6>,inspect<11>,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 pydoc}@anchor{143c}
@subsubsection pydoc


The @ref{ba,,pydoc} module now provides a much-improved web server interface, as
well as a new command-line option @code{-b} to automatically open a browser window
to display that server:

@example
$ pydoc3.2 -b
@end example

(Contributed by Ron Adam; bpo-2001@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2001}.)

@node dis<6>,dbm<7>,pydoc<7>,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 dis}@anchor{143d}
@subsubsection dis


The @ref{3c,,dis} module gained two new functions for inspecting code,
@ref{143e,,code_info()} and @ref{112d,,show_code()}.  Both provide detailed code
object information for the supplied function, method, source code string or code
object.  The former returns a string and the latter prints it:

@example
>>> import dis, random
>>> dis.show_code(random.choice)
Name:              choice
Filename:          /Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/random.py
Argument count:    2
Kw-only arguments: 0
Number of locals:  3
Stack size:        11
Flags:             OPTIMIZED, NEWLOCALS, NOFREE
Constants:
   0: 'Choose a random element from a non-empty sequence.'
   1: 'Cannot choose from an empty sequence'
Names:
   0: _randbelow
   1: len
   2: ValueError
   3: IndexError
Variable names:
   0: self
   1: seq
   2: i
@end example

In addition, the @ref{205,,dis()} function now accepts string arguments
so that the common idiom @code{dis(compile(s, '@w{'}, 'eval'))} can be shortened
to @code{dis(s)}:

@example
>>> dis('3*x+1 if x%2==1 else x//2')
  1           0 LOAD_NAME                0 (x)
              3 LOAD_CONST               0 (2)
              6 BINARY_MODULO
              7 LOAD_CONST               1 (1)
             10 COMPARE_OP               2 (==)
             13 POP_JUMP_IF_FALSE       28
             16 LOAD_CONST               2 (3)
             19 LOAD_NAME                0 (x)
             22 BINARY_MULTIPLY
             23 LOAD_CONST               1 (1)
             26 BINARY_ADD
             27 RETURN_VALUE
        >>   28 LOAD_NAME                0 (x)
             31 LOAD_CONST               0 (2)
             34 BINARY_FLOOR_DIVIDE
             35 RETURN_VALUE
@end example

Taken together, these improvements make it easier to explore how CPython is
implemented and to see for yourself what the language syntax does
under-the-hood.

(Contributed by Nick Coghlan in bpo-9147@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9147}.)

@node dbm<7>,ctypes<4>,dis<6>,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 dbm}@anchor{143f}
@subsubsection dbm


All database modules now support the @code{get()} and @code{setdefault()} methods.

(Suggested by Ray Allen in bpo-9523@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9523}.)

@node ctypes<4>,site<4>,dbm<7>,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 ctypes}@anchor{1440}
@subsubsection ctypes


A new type, @ref{1441,,ctypes.c_ssize_t} represents the C @code{ssize_t} datatype.

@node site<4>,sysconfig<4>,ctypes<4>,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 site}@anchor{1442}
@subsubsection site


The @ref{cc,,site} module has three new functions useful for reporting on the
details of a given Python installation.


@itemize *

@item 
@ref{1443,,getsitepackages()} lists all global site-packages directories.

@item 
@ref{1444,,getuserbase()} reports on the user’s base directory where data can
be stored.

@item 
@ref{1445,,getusersitepackages()} reveals the user-specific site-packages
directory path.
@end itemize

@example
>>> import site
>>> site.getsitepackages()
['/Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/site-packages',
 '/Library/Frameworks/Python.framework/Versions/3.2/lib/site-python',
 '/Library/Python/3.2/site-packages']
>>> site.getuserbase()
'/Users/raymondhettinger/Library/Python/3.2'
>>> site.getusersitepackages()
'/Users/raymondhettinger/Library/Python/3.2/lib/python/site-packages'
@end example

Conveniently, some of site’s functionality is accessible directly from the
command-line:

@example
$ python -m site --user-base
/Users/raymondhettinger/.local
$ python -m site --user-site
/Users/raymondhettinger/.local/lib/python3.2/site-packages
@end example

(Contributed by Tarek Ziadé in bpo-6693@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6693}.)

@node sysconfig<4>,pdb<10>,site<4>,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 sysconfig}@anchor{1446}
@subsubsection sysconfig


The new @ref{e1,,sysconfig} module makes it straightforward to discover
installation paths and configuration variables that vary across platforms and
installations.

The module offers access simple access functions for platform and version
information:


@itemize *

@item 
@ref{1447,,get_platform()} returning values like `linux-i586' or
`macosx-10.6-ppc'.

@item 
@ref{1448,,get_python_version()} returns a Python version string
such as “3.2”.
@end itemize

It also provides access to the paths and variables corresponding to one of
seven named schemes used by @code{distutils}.  Those include `posix_prefix',
`posix_home', `posix_user', `nt', `nt_user', `os2', `os2_home':


@itemize *

@item 
@ref{340,,get_paths()} makes a dictionary containing installation paths
for the current installation scheme.

@item 
@ref{298,,get_config_vars()} returns a dictionary of platform specific
variables.
@end itemize

There is also a convenient command-line interface:

@example
C:\Python32>python -m sysconfig
Platform: "win32"
Python version: "3.2"
Current installation scheme: "nt"

Paths:
        data = "C:\Python32"
        include = "C:\Python32\Include"
        platinclude = "C:\Python32\Include"
        platlib = "C:\Python32\Lib\site-packages"
        platstdlib = "C:\Python32\Lib"
        purelib = "C:\Python32\Lib\site-packages"
        scripts = "C:\Python32\Scripts"
        stdlib = "C:\Python32\Lib"

Variables:
        BINDIR = "C:\Python32"
        BINLIBDEST = "C:\Python32\Lib"
        EXE = ".exe"
        INCLUDEPY = "C:\Python32\Include"
        LIBDEST = "C:\Python32\Lib"
        SO = ".pyd"
        VERSION = "32"
        abiflags = ""
        base = "C:\Python32"
        exec_prefix = "C:\Python32"
        platbase = "C:\Python32"
        prefix = "C:\Python32"
        projectbase = "C:\Python32"
        py_version = "3.2"
        py_version_nodot = "32"
        py_version_short = "3.2"
        srcdir = "C:\Python32"
        userbase = "C:\Documents and Settings\Raymond\Application Data\Python"
@end example

(Moved out of Distutils by Tarek Ziadé.)

@node pdb<10>,configparser<6>,sysconfig<4>,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 pdb}@anchor{1449}
@subsubsection pdb


The @ref{aa,,pdb} debugger module gained a number of usability improvements:


@itemize *

@item 
@code{pdb.py} now has a @code{-c} option that executes commands as given in a
@code{.pdbrc} script file.

@item 
A @code{.pdbrc} script file can contain @code{continue} and @code{next} commands
that continue debugging.

@item 
The @ref{273,,Pdb} class constructor now accepts a `nosigint' argument.

@item 
New commands: @code{l(list)}, @code{ll(long list)} and @code{source} for
listing source code.

@item 
New commands: @code{display} and @code{undisplay} for showing or hiding
the value of an expression if it has changed.

@item 
New command: @code{interact} for starting an interactive interpreter containing
the global and local  names found in the current scope.

@item 
Breakpoints can be cleared by breakpoint number.
@end itemize

(Contributed by Georg Brandl, Antonio Cuni and Ilya Sandler.)

@node configparser<6>,urllib parse<6>,pdb<10>,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 configparser}@anchor{144a}
@subsubsection configparser


The @ref{26,,configparser} module was modified to improve usability and
predictability of the default parser and its supported INI syntax.  The old
@code{ConfigParser} class was removed in favor of @code{SafeConfigParser}
which has in turn been renamed to @ref{4de,,ConfigParser}. Support
for inline comments is now turned off by default and section or option
duplicates are not allowed in a single configuration source.

Config parsers gained a new API based on the mapping protocol:

@example
>>> parser = ConfigParser()
>>> parser.read_string("""
... [DEFAULT]
... location = upper left
... visible = yes
... editable = no
... color = blue
...
... [main]
... title = Main Menu
... color = green
...
... [options]
... title = Options
... """)
>>> parser['main']['color']
'green'
>>> parser['main']['editable']
'no'
>>> section = parser['options']
>>> section['title']
'Options'
>>> section['title'] = 'Options (editable: %(editable)s)'
>>> section['title']
'Options (editable: no)'
@end example

The new API is implemented on top of the classical API, so custom parser
subclasses should be able to use it without modifications.

The INI file structure accepted by config parsers can now be customized. Users
can specify alternative option/value delimiters and comment prefixes, change the
name of the `DEFAULT' section or switch the interpolation syntax.

There is support for pluggable interpolation including an additional interpolation
handler @ref{92c,,ExtendedInterpolation}:

@example
>>> parser = ConfigParser(interpolation=ExtendedInterpolation())
>>> parser.read_dict(@{'buildout': @{'directory': '/home/ambv/zope9'@},
...                   'custom': @{'prefix': '/usr/local'@}@})
>>> parser.read_string("""
... [buildout]
... parts =
...   zope9
...   instance
... find-links =
...   $@{buildout:directory@}/downloads/dist
...
... [zope9]
... recipe = plone.recipe.zope9install
... location = /opt/zope
...
... [instance]
... recipe = plone.recipe.zope9instance
... zope9-location = $@{zope9:location@}
... zope-conf = $@{custom:prefix@}/etc/zope.conf
... """)
>>> parser['buildout']['find-links']
'\n/home/ambv/zope9/downloads/dist'
>>> parser['instance']['zope-conf']
'/usr/local/etc/zope.conf'
>>> instance = parser['instance']
>>> instance['zope-conf']
'/usr/local/etc/zope.conf'
>>> instance['zope9-location']
'/opt/zope'
@end example

A number of smaller features were also introduced, like support for specifying
encoding in read operations, specifying fallback values for get-functions, or
reading directly from dictionaries and strings.

(All changes contributed by Łukasz Langa.)

@c XXX consider showing a difflib example

@node urllib parse<6>,mailbox,configparser<6>,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 urllib-parse}@anchor{144b}
@subsubsection urllib.parse


A number of usability improvements were made for the @ref{110,,urllib.parse} module.

The @ref{362,,urlparse()} function now supports IPv6@footnote{https://en.wikipedia.org/wiki/IPv6} addresses as described in 
@geindex RFC; RFC 2732
RFC 2732@footnote{https://datatracker.ietf.org/doc/html/rfc2732.html}:

@example
>>> import urllib.parse
>>> urllib.parse.urlparse('http://[dead:beef:cafe:5417:affe:8FA3:deaf:feed]/foo/')
ParseResult(scheme='http',
            netloc='[dead:beef:cafe:5417:affe:8FA3:deaf:feed]',
            path='/foo/',
            params='@w{'},
            query='@w{'},
            fragment='@w{'})
@end example

The @ref{144c,,urldefrag()} function now returns a @ref{85d,,named tuple}:

@example
>>> r = urllib.parse.urldefrag('http://python.org/about/#target')
>>> r
DefragResult(url='http://python.org/about/', fragment='target')
>>> r[0]
'http://python.org/about/'
>>> r.fragment
'target'
@end example

And, the @ref{1094,,urlencode()} function is now much more flexible,
accepting either a string or bytes type for the `query' argument.  If it is a
string, then the `safe', `encoding', and `error' parameters are sent to
@ref{144d,,quote_plus()} for encoding:

@example
>>> urllib.parse.urlencode([
...      ('type', 'telenovela'),
...      ('name', '¿Dónde Está Elisa?')],
...      encoding='latin-1')
'type=telenovela&name=%BFD%F3nde+Est%E1+Elisa%3F'
@end example

As detailed in @ref{144e,,ASCII로 인코딩된 바이트열 구문 분석}, all the @ref{110,,urllib.parse}
functions now accept ASCII-encoded byte strings as input, so long as they are
not mixed with regular strings.  If ASCII-encoded byte strings are given as
parameters, the return types will also be an ASCII-encoded byte strings:

@example
>>> urllib.parse.urlparse(b'http://www.python.org:80/about/')
ParseResultBytes(scheme=b'http', netloc=b'www.python.org:80',
                 path=b'/about/', params=b'@w{'}, query=b'@w{'}, fragment=b'@w{'})
@end example

(Work by Nick Coghlan, Dan Mahn, and Senthil Kumaran in bpo-2987@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2987},
bpo-5468@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5468}, and bpo-9873@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9873}.)

@node mailbox,turtledemo,urllib parse<6>,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 mailbox}@anchor{144f}
@subsubsection mailbox


Thanks to a concerted effort by R. David Murray, the @ref{8f,,mailbox} module has
been fixed for Python 3.2.  The challenge was that mailbox had been originally
designed with a text interface, but email messages are best represented with
@ref{192,,bytes} because various parts of a message may have different encodings.

The solution harnessed the @ref{3f,,email} package’s binary support for parsing
arbitrary email messages.  In addition, the solution required a number of API
changes.

As expected, the @ref{1450,,add()} method for
@ref{1451,,mailbox.Mailbox} objects now accepts binary input.

@ref{1128,,StringIO} and text file input are deprecated.  Also, string input
will fail early if non-ASCII characters are used.  Previously it would fail when
the email was processed in a later step.

There is also support for binary output.  The @ref{1452,,get_file()}
method now returns a file in the binary mode (where it used to incorrectly set
the file to text-mode).  There is also a new @ref{1453,,get_bytes()}
method that returns a @ref{192,,bytes} representation of a message corresponding
to a given `key'.

It is still possible to get non-binary output using the old API’s
@ref{1454,,get_string()} method, but that approach
is not very useful.  Instead, it is best to extract messages from
a @ref{1455,,Message} object or to load them from binary input.

(Contributed by R. David Murray, with efforts from Steffen Daode Nurpmeso and an
initial patch by Victor Stinner in bpo-9124@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9124}.)

@node turtledemo,,mailbox,New Improved and Deprecated Modules
@anchor{whatsnew/3 2 turtledemo}@anchor{1456}
@subsubsection turtledemo


The demonstration code for the @ref{107,,turtle} module was moved from the `Demo'
directory to main library.  It includes over a dozen sample scripts with
lively displays.  Being on @ref{3e4,,sys.path}, it can now be run directly
from the command-line:

@example
$ python -m turtledemo
@end example

(Moved from the Demo directory by Alexander Belopolsky in bpo-10199@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10199}.)

@node Multi-threading,Optimizations<6>,New Improved and Deprecated Modules,What’s New In Python 3 2
@anchor{whatsnew/3 2 multi-threading}@anchor{1457}
@subsection Multi-threading



@itemize *

@item 
The mechanism for serializing execution of concurrently running Python threads
(generally known as the @ref{164,,GIL} or Global Interpreter Lock) has
been rewritten.  Among the objectives were more predictable switching
intervals and reduced overhead due to lock contention and the number of
ensuing system calls.  The notion of a “check interval” to allow thread
switches has been abandoned and replaced by an absolute duration expressed in
seconds.  This parameter is tunable through @ref{b44,,sys.setswitchinterval()}.
It currently defaults to 5 milliseconds.

Additional details about the implementation can be read from a python-dev mailing-list message@footnote{https://mail.python.org/pipermail/python-dev/2009-October/093321.html}
(however, “priority requests” as exposed in this message have not been kept
for inclusion).

(Contributed by Antoine Pitrou.)

@item 
Regular and recursive locks now accept an optional `timeout' argument to their
@ref{8a6,,acquire()} method.  (Contributed by Antoine Pitrou;
bpo-7316@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7316}.)

@item 
Similarly, @ref{1458,,threading.Semaphore.acquire()} also gained a `timeout'
argument.  (Contributed by Torsten Landschoff; bpo-850728@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=850728}.)

@item 
Regular and recursive lock acquisitions can now be interrupted by signals on
platforms using Pthreads.  This means that Python programs that deadlock while
acquiring locks can be successfully killed by repeatedly sending SIGINT to the
process (by pressing @code{Ctrl}+@code{C} in most shells).
(Contributed by Reid Kleckner; bpo-8844@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8844}.)
@end itemize

@node Optimizations<6>,Unicode,Multi-threading,What’s New In Python 3 2
@anchor{whatsnew/3 2 optimizations}@anchor{1459}
@subsection Optimizations


A number of small performance enhancements have been added:


@itemize *

@item 
Python’s peephole optimizer now recognizes patterns such @code{x in @{1, 2, 3@}} as
being a test for membership in a set of constants.  The optimizer recasts the
@ref{184,,set} as a @ref{7f1,,frozenset} and stores the pre-built constant.

Now that the speed penalty is gone, it is practical to start writing
membership tests using set-notation.  This style is both semantically clear
and operationally fast:

@example
extension = name.rpartition('.')[2]
if extension in @{'xml', 'html', 'xhtml', 'css'@}:
    handle(name)
@end example

(Patch and additional tests contributed by Dave Malcolm; bpo-6690@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6690}).

@item 
Serializing and unserializing data using the @ref{ab,,pickle} module is now
several times faster.

(Contributed by Alexandre Vassalotti, Antoine Pitrou
and the Unladen Swallow team in bpo-9410@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9410} and bpo-3873@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=3873}.)

@item 
The Timsort algorithm@footnote{https://en.wikipedia.org/wiki/Timsort} used in
@ref{dc7,,list.sort()} and @ref{dc6,,sorted()} now runs faster and uses less memory
when called with a @ref{1005,,key function}.  Previously, every element of
a list was wrapped with a temporary object that remembered the key value
associated with each element.  Now, two arrays of keys and values are
sorted in parallel.  This saves the memory consumed by the sort wrappers,
and it saves time lost to delegating comparisons.

(Patch by Daniel Stutzbach in bpo-9915@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9915}.)

@item 
JSON decoding performance is improved and memory consumption is reduced
whenever the same string is repeated for multiple keys.  Also, JSON encoding
now uses the C speedups when the @code{sort_keys} argument is true.

(Contributed by Antoine Pitrou in bpo-7451@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7451} and by Raymond Hettinger and
Antoine Pitrou in bpo-10314@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10314}.)

@item 
Recursive locks (created with the @ref{32e,,threading.RLock()} API) now benefit
from a C implementation which makes them as fast as regular locks, and between
10x and 15x faster than their previous pure Python implementation.

(Contributed by Antoine Pitrou; bpo-3001@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=3001}.)

@item 
The fast-search algorithm in stringlib is now used by the @ref{10a9,,split()},
@ref{145a,,rsplit()}, @ref{145b,,splitlines()} and @ref{4b9,,replace()} methods on
@ref{192,,bytes}, @ref{344,,bytearray} and @ref{169,,str} objects. Likewise, the
algorithm is also used by @ref{10a8,,rfind()}, @ref{145c,,rindex()}, @code{rsplit()} and
@ref{145d,,rpartition()}.

(Patch by Florent Xicluna in bpo-7622@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7622} and bpo-7462@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7462}.)

@item 
Integer to string conversions now work two “digits” at a time, reducing the
number of division and modulo operations.

(bpo-6713@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6713} by Gawain Bolton, Mark Dickinson, and Victor Stinner.)
@end itemize

There were several other minor optimizations. Set differencing now runs faster
when one operand is much larger than the other (patch by Andress Bennetts in
bpo-8685@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8685}).  The @code{array.repeat()} method has a faster implementation
(bpo-1569291@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1569291} by Alexander Belopolsky). The @ref{12d0,,BaseHTTPRequestHandler}
has more efficient buffering (bpo-3709@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=3709} by Andrew Schaaf).  The
@ref{1032,,operator.attrgetter()} function has been sped-up (bpo-10160@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10160} by
Christos Georgiou).  And @ref{4de,,ConfigParser} loads multi-line arguments a bit
faster (bpo-7113@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7113} by Łukasz Langa).

@node Unicode,Codecs,Optimizations<6>,What’s New In Python 3 2
@anchor{whatsnew/3 2 unicode}@anchor{145e}
@subsection Unicode


Python has been updated to Unicode 6.0.0@footnote{https://unicode.org/versions/Unicode6.0.0/}.  The update to the standard adds
over 2,000 new characters including emoji@footnote{https://en.wikipedia.org/wiki/Emoji}
symbols which are important for mobile phones.

In addition, the updated standard has altered the character properties for two
Kannada characters (U+0CF1, U+0CF2) and one New Tai Lue numeric character
(U+19DA), making the former eligible for use in identifiers while disqualifying
the latter.  For more information, see Unicode Character Database Changes@footnote{https://www.unicode.org/versions/Unicode6.0.0/#Database_Changes}.

@node Codecs,Documentation,Unicode,What’s New In Python 3 2
@anchor{whatsnew/3 2 codecs}@anchor{145f}
@subsection Codecs


Support was added for `cp720' Arabic DOS encoding (bpo-1616979@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1616979}).

MBCS encoding no longer ignores the error handler argument. In the default
strict mode, it raises an @ref{c07,,UnicodeDecodeError} when it encounters an
undecodable byte sequence and an @ref{886,,UnicodeEncodeError} for an unencodable
character.

The MBCS codec supports @code{'strict'} and @code{'ignore'} error handlers for
decoding, and @code{'strict'} and @code{'replace'} for encoding.

To emulate Python3.1 MBCS encoding, select the @code{'ignore'} handler for decoding
and the @code{'replace'} handler for encoding.

On Mac OS X, Python decodes command line arguments with @code{'utf-8'} rather than
the locale encoding.

By default, @ref{e4,,tarfile} uses @code{'utf-8'} encoding on Windows (instead of
@code{'mbcs'}) and the @code{'surrogateescape'} error handler on all operating
systems.

@node Documentation,IDLE,Codecs,What’s New In Python 3 2
@anchor{whatsnew/3 2 documentation}@anchor{1460}
@subsection Documentation


The documentation continues to be improved.


@itemize *

@item 
A table of quick links has been added to the top of lengthy sections such as
@ref{1461,,내장 함수}.  In the case of @ref{85,,itertools}, the links are
accompanied by tables of cheatsheet-style summaries to provide an overview and
memory jog without having to read all of the docs.

@item 
In some cases, the pure Python source code can be a helpful adjunct to the
documentation, so now many modules now feature quick links to the latest
version of the source code.  For example, the @ref{63,,functools} module
documentation has a quick link at the top labeled:

@quotation

`Source code' Lib/functools.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/functools.py}.
@end quotation

(Contributed by Raymond Hettinger; see
rationale@footnote{https://rhettinger.wordpress.com/2011/01/28/open-your-source-more/}.)

@item 
The docs now contain more examples and recipes.  In particular, @ref{be,,re}
module has an extensive section, @ref{1462,,정규식 예제}.  Likewise, the
@ref{85,,itertools} module continues to be updated with new
@ref{1463,,Itertools 조리법}.

@item 
The @ref{34,,datetime} module now has an auxiliary implementation in pure Python.
No functionality was changed.  This just provides an easier-to-read alternate
implementation.

(Contributed by Alexander Belopolsky in bpo-9528@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9528}.)

@item 
The unmaintained @code{Demo} directory has been removed.  Some demos were
integrated into the documentation, some were moved to the @code{Tools/demo}
directory, and others were removed altogether.

(Contributed by Georg Brandl in bpo-7962@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7962}.)
@end itemize

@node IDLE,Code Repository,Documentation,What’s New In Python 3 2
@anchor{whatsnew/3 2 idle}@anchor{1464}
@subsection IDLE



@itemize *

@item 
The format menu now has an option to clean source files by stripping
trailing whitespace.

(Contributed by Raymond Hettinger; bpo-5150@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5150}.)

@item 
IDLE on Mac OS X now works with both Carbon AquaTk and Cocoa AquaTk.

(Contributed by Kevin Walzer, Ned Deily, and Ronald Oussoren; bpo-6075@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6075}.)
@end itemize

@node Code Repository,Build and C API Changes<2>,IDLE,What’s New In Python 3 2
@anchor{whatsnew/3 2 code-repository}@anchor{1465}
@subsection Code Repository


In addition to the existing Subversion code repository at @indicateurl{https://svn.python.org}
there is now a Mercurial@footnote{https://www.mercurial-scm.org/} repository at
@indicateurl{https://hg.python.org/}.

After the 3.2 release, there are plans to switch to Mercurial as the primary
repository.  This distributed version control system should make it easier for
members of the community to create and share external changesets.  See
@geindex Python 향상 제안; PEP 385
PEP 385@footnote{https://peps.python.org/pep-0385/} for details.

To learn to use the new version control system, see the Quick Start@footnote{https://www.mercurial-scm.org/wiki/QuickStart} or the Guide to Mercurial Workflows@footnote{https://www.mercurial-scm.org/guide}.

@node Build and C API Changes<2>,Porting to Python 3 2,Code Repository,What’s New In Python 3 2
@anchor{whatsnew/3 2 build-and-c-api-changes}@anchor{1466}
@subsection Build and C API Changes


Changes to Python’s build process and to the C API include:


@itemize *

@item 
The `idle', `pydoc' and `2to3' scripts are now installed with a
version-specific suffix on @code{make altinstall} (bpo-10679@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10679}).

@item 
The C functions that access the Unicode Database now accept and return
characters from the full Unicode range, even on narrow unicode builds
(Py_UNICODE_TOLOWER, Py_UNICODE_ISDECIMAL, and others).  A visible difference
in Python is that @ref{1467,,unicodedata.numeric()} now returns the correct value
for large code points, and @ref{1c1,,repr()} may consider more characters as
printable.

(Reported by Bupjoe Lee and fixed by Amaury Forgeot D’Arc; bpo-5127@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5127}.)

@item 
Computed gotos are now enabled by default on supported compilers (which are
detected by the configure script).  They can still be disabled selectively by
specifying @code{--without-computed-gotos}.

(Contributed by Antoine Pitrou; bpo-9203@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9203}.)

@item 
The option @code{--with-wctype-functions} was removed.  The built-in unicode
database is now used for all functions.

(Contributed by Amaury Forgeot D’Arc; bpo-9210@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9210}.)

@item 
Hash values are now values of a new type, @ref{1468,,Py_hash_t}, which is
defined to be the same size as a pointer.  Previously they were of type long,
which on some 64-bit operating systems is still only 32 bits long.  As a
result of this fix, @ref{184,,set} and @ref{183,,dict} can now hold more than
@code{2**32} entries on builds with 64-bit pointers (previously, they could grow
to that size but their performance degraded catastrophically).

(Suggested by Raymond Hettinger and implemented by Benjamin Peterson;
bpo-9778@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9778}.)

@item 
A new macro @code{Py_VA_COPY} copies the state of the variable argument
list.  It is equivalent to C99 `va_copy' but available on all Python platforms
(bpo-2443@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2443}).

@item 
A new C API function @code{PySys_SetArgvEx()} allows an embedded interpreter
to set @ref{1469,,sys.argv} without also modifying @ref{3e4,,sys.path}
(bpo-5753@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5753}).

@item 
@code{PyEval_CallObject()} is now only available in macro form.  The
function declaration, which was kept for backwards compatibility reasons, is
now removed – the macro was introduced in 1997 (bpo-8276@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8276}).

@item 
There is a new function @ref{146a,,PyLong_AsLongLongAndOverflow()} which
is analogous to @ref{146b,,PyLong_AsLongAndOverflow()}.  They both serve to
convert Python @ref{19b,,int} into a native fixed-width type while providing
detection of cases where the conversion won’t fit (bpo-7767@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7767}).

@item 
The @ref{146c,,PyUnicode_CompareWithASCIIString()} function now returns `not
equal' if the Python string is `NUL' terminated.

@item 
There is a new function @ref{146d,,PyErr_NewExceptionWithDoc()} that is
like @ref{146e,,PyErr_NewException()} but allows a docstring to be specified.
This lets C exceptions have the same self-documenting capabilities as
their pure Python counterparts (bpo-7033@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7033}).

@item 
When compiled with the @code{--with-valgrind} option, the pymalloc
allocator will be automatically disabled when running under Valgrind.  This
gives improved memory leak detection when running under Valgrind, while taking
advantage of pymalloc at other times (bpo-2422@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2422}).

@item 
Removed the @code{O?} format from the `PyArg_Parse' functions.  The format is no
longer used and it had never been documented (bpo-8837@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8837}).
@end itemize

There were a number of other small changes to the C-API.  See the
Misc/NEWS@footnote{https://github.com/python/cpython/blob/v3.2.6/Misc/NEWS}
file for a complete list.

Also, there were a number of updates to the Mac OS X build, see
Mac/BuildScript/README.txt@footnote{https://github.com/python/cpython/blob/v3.2.6/Mac/BuildScript/README.txt}
for details.  For users running a 32/64-bit
build, there is a known problem with the default Tcl/Tk on Mac OS X 10.6.
Accordingly, we recommend installing an updated alternative such as
ActiveState Tcl/Tk 8.5.9@footnote{https://web.archive.org/web/20101208191259/https://www.activestate.com/activetcl/downloads}.
See @indicateurl{https://www.python.org/download/mac/tcltk/} for additional details.

@node Porting to Python 3 2,,Build and C API Changes<2>,What’s New In Python 3 2
@anchor{whatsnew/3 2 porting-to-python-3-2}@anchor{146f}
@subsection Porting to Python 3.2


This section lists previously described changes and other bugfixes that may
require changes to your code:


@itemize *

@item 
The @ref{26,,configparser} module has a number of clean-ups.  The major change is
to replace the old @code{ConfigParser} class with long-standing preferred
alternative @code{SafeConfigParser}.  In addition there are a number of
smaller incompatibilities:


@itemize *

@item 
The interpolation syntax is now validated on
@ref{1470,,get()} and
@ref{1471,,set()} operations. In the default
interpolation scheme, only two tokens with percent signs are valid: @code{%(name)s}
and @code{%%}, the latter being an escaped percent sign.

@item 
The @ref{1471,,set()} and
@ref{1472,,add_section()} methods now verify that
values are actual strings.  Formerly, unsupported types could be introduced
unintentionally.

@item 
Duplicate sections or options from a single source now raise either
@ref{1473,,DuplicateSectionError} or
@ref{1474,,DuplicateOptionError}.  Formerly, duplicates would
silently overwrite a previous entry.

@item 
Inline comments are now disabled by default so now the `;' character
can be safely used in values.

@item 
Comments now can be indented.  Consequently, for `;' or `#' to appear at
the start of a line in multiline values, it has to be interpolated.  This
keeps comment prefix characters in values from being mistaken as comments.

@item 
@code{""} is now a valid value and is no longer automatically converted to an
empty string. For empty strings, use @code{"option ="} in a line.
@end itemize

@item 
The @code{nntplib} module was reworked extensively, meaning that its APIs
are often incompatible with the 3.1 APIs.

@item 
@ref{344,,bytearray} objects can no longer be used as filenames; instead,
they should be converted to @ref{192,,bytes}.

@item 
The @code{array.tostring()} and @code{array.fromstring()} have been renamed to
@ref{1475,,array.tobytes()} and
@ref{1476,,array.frombytes()} for clarity.  The old names
have been deprecated. (See bpo-8990@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8990}.)

@item 
@code{PyArg_Parse*()} functions:


@itemize *

@item 
“t#” format has been removed: use “s#” or “s*” instead

@item 
“w” and “w#” formats has been removed: use “w*” instead
@end itemize

@item 
The @code{PyCObject} type, deprecated in 3.1, has been removed.  To wrap
opaque C pointers in Python objects, the @ref{1477,,PyCapsule} API should be used
instead; the new type has a well-defined interface for passing typing safety
information and a less complicated signature for calling a destructor.

@item 
The @code{sys.setfilesystemencoding()} function was removed because
it had a flawed design.

@item 
The @ref{1478,,random.seed()} function and method now salt string seeds with an
sha512 hash function.  To access the previous version of `seed' in order to
reproduce Python 3.1 sequences, set the `version' argument to `1',
@code{random.seed(s, version=1)}.

@item 
The previously deprecated @code{string.maketrans()} function has been removed
in favor of the static methods @ref{1479,,bytes.maketrans()} and
@ref{147a,,bytearray.maketrans()}.  This change solves the confusion around which
types were supported by the @ref{d8,,string} module.  Now, @ref{169,,str},
@ref{192,,bytes}, and @ref{344,,bytearray} each have their own `maketrans' and
`translate' methods with intermediate translation tables of the appropriate
type.

(Contributed by Georg Brandl; bpo-5675@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5675}.)

@item 
The previously deprecated @code{contextlib.nested()} function has been removed
in favor of a plain @ref{186,,with} statement which can accept multiple
context managers.  The latter technique is faster (because it is built-in),
and it does a better job finalizing multiple context managers when one of them
raises an exception:

@example
with open('mylog.txt') as infile, open('a.out', 'w') as outfile:
    for line in infile:
        if '<critical>' in line:
            outfile.write(line)
@end example

(Contributed by Georg Brandl and Mattias Brändström;
appspot issue 53094@footnote{https://codereview.appspot.com/53094}.)

@item 
@ref{147b,,struct.pack()} now only allows bytes for the @code{s} string pack code.
Formerly, it would accept text arguments and implicitly encode them to bytes
using UTF-8.  This was problematic because it made assumptions about the
correct encoding and because a variable-length encoding can fail when writing
to fixed length segment of a structure.

Code such as @code{struct.pack('<6sHHBBB', 'GIF87a', x, y)} should be rewritten
with to use bytes instead of text, @code{struct.pack('<6sHHBBB', b'GIF87a', x, y)}.

(Discovered by David Beazley and fixed by Victor Stinner; bpo-10783@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10783}.)

@item 
The @ref{12b,,xml.etree.ElementTree} class now raises an
@ref{147c,,xml.etree.ElementTree.ParseError} when a parse fails. Previously it
raised an @ref{147d,,xml.parsers.expat.ExpatError}.

@item 
The new, longer @ref{169,,str()} value on floats may break doctests which rely on
the old output format.

@item 
In @ref{4b8,,subprocess.Popen}, the default value for `close_fds' is now
@code{True} under Unix; under Windows, it is @code{True} if the three standard
streams are set to @code{None}, @code{False} otherwise.  Previously, `close_fds'
was always @code{False} by default, which produced difficult to solve bugs
or race conditions when open file descriptors would leak into the child
process.

@item 
Support for legacy HTTP 0.9 has been removed from @ref{111,,urllib.request}
and @ref{73,,http.client}.  Such support is still present on the server side
(in @ref{76,,http.server}).

(Contributed by Antoine Pitrou, bpo-10711@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10711}.)

@item 
SSL sockets in timeout mode now raise @ref{a35,,socket.timeout} when a timeout
occurs, rather than a generic @ref{147e,,SSLError}.

(Contributed by Antoine Pitrou, bpo-10272@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10272}.)

@item 
The misleading functions @code{PyEval_AcquireLock()} and
@code{PyEval_ReleaseLock()} have been officially deprecated.  The
thread-state aware APIs (such as @ref{645,,PyEval_SaveThread()}
and @ref{646,,PyEval_RestoreThread()}) should be used instead.

@item 
Due to security risks, @code{asyncore.handle_accept()} has been deprecated, and
a new function, @code{asyncore.handle_accepted()}, was added to replace it.

(Contributed by Giampaolo Rodola in bpo-6706@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6706}.)

@item 
Due to the new @ref{164,,GIL} implementation, @code{PyEval_InitThreads()}
cannot be called before @ref{460,,Py_Initialize()} anymore.
@end itemize

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node What’s New In Python 3 1,What’s New In Python 3 0,What’s New In Python 3 2,파이썬의 새로운 기능
@anchor{whatsnew/3 1 doc}@anchor{147f}@anchor{whatsnew/3 1 translation-repo}@anchor{1480}@anchor{whatsnew/3 1 what-s-new-in-python-3-1}@anchor{1481}
@section What’s New In Python 3.1


@*Author: 
Raymond Hettinger


@c $Id$
@c Rules for maintenance:
@c 
@c * Anyone can add text to this document.  Do not spend very much time
@c on the wording of your changes, because your text will probably
@c get rewritten to some degree.
@c 
@c * The maintainer will go through Misc/NEWS periodically and add
@c changes; it's therefore more important to add your changes to
@c Misc/NEWS than to this file.
@c 
@c * This is not a complete list of every single change; completeness
@c is the purpose of Misc/NEWS.  Some changes I consider too small
@c or esoteric to include.  If such a change is added to the text,
@c I'll just remove it.  (This is another reason you shouldn't spend
@c too much time on writing your addition.)
@c 
@c * If you want to draw your new text to the attention of the
@c maintainer, add 'XXX' to the beginning of the paragraph or
@c section.
@c 
@c * It's OK to just add a fragmentary note about a change.  For
@c example: "XXX Describe the transmogrify() function added to the
@c socket module."  The maintainer will research the change and
@c write the necessary text.
@c 
@c * You can comment out your additions if you like, but it's not
@c necessary (especially when a final release is some months away).
@c 
@c * Credit the author of a patch or bugfix.   Just the name is
@c sufficient; the e-mail address isn't necessary.
@c 
@c * It's helpful to add the bug/patch number as a comment:
@c 
@c % Patch 12345
@c XXX Describe the transmogrify() function added to the socket
@c module.
@c (Contributed by P.Y. Developer.)
@c 
@c This saves the maintainer the effort of going through the SVN log
@c when researching a change.

This article explains the new features in Python 3.1, compared to 3.0.
Python 3.1 was released on June 27, 2009.

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

@end menu

@node PEP 372 Ordered Dictionaries,PEP 378 Format Specifier for Thousands Separator,,What’s New In Python 3 1
@anchor{whatsnew/3 1 pep-372-ordered-dictionaries}@anchor{1482}
@subsection PEP 372: Ordered Dictionaries


Regular Python dictionaries iterate over key/value pairs in arbitrary order.
Over the years, a number of authors have written alternative implementations
that remember the order that the keys were originally inserted.  Based on
the experiences from those implementations, a new
@ref{7f2,,collections.OrderedDict} class has been introduced.

The OrderedDict API is substantially the same as regular dictionaries
but will iterate over keys and values in a guaranteed order depending on
when a key was first inserted.  If a new entry overwrites an existing entry,
the original insertion position is left unchanged.  Deleting an entry and
reinserting it will move it to the end.

The standard library now supports use of ordered dictionaries in several
modules.  The @ref{26,,configparser} module uses them by default.  This lets
configuration files be read, modified, and then written back in their original
order.  The `_asdict()' method for @ref{4e0,,collections.namedtuple()} now
returns an ordered dictionary with the values appearing in the same order as
the underlying tuple indices.  The @ref{86,,json} module is being built-out with
an `object_pairs_hook' to allow OrderedDicts to be built by the decoder.
Support was also added for third-party tools like PyYAML@footnote{https://pyyaml.org/}.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 372

@item PEP 372@footnote{https://peps.python.org/pep-0372/} - Ordered Dictionaries

PEP written by Armin Ronacher and Raymond Hettinger.  Implementation
written by Raymond Hettinger.
@end table


Since an ordered dictionary remembers its insertion order, it can be used
in conjunction with sorting to make a sorted dictionary:

@example
>>> # regular unsorted dictionary
>>> d = @{'banana': 3, 'apple':4, 'pear': 1, 'orange': 2@}

>>> # dictionary sorted by key
>>> OrderedDict(sorted(d.items(), key=lambda t: t[0]))
OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)])

>>> # dictionary sorted by value
>>> OrderedDict(sorted(d.items(), key=lambda t: t[1]))
OrderedDict([('pear', 1), ('orange', 2), ('banana', 3), ('apple', 4)])

>>> # dictionary sorted by length of the key string
>>> OrderedDict(sorted(d.items(), key=lambda t: len(t[0])))
OrderedDict([('pear', 1), ('apple', 4), ('orange', 2), ('banana', 3)])
@end example

The new sorted dictionaries maintain their sort order when entries
are deleted.  But when new keys are added, the keys are appended
to the end and the sort is not maintained.

@node PEP 378 Format Specifier for Thousands Separator,Other Language Changes<7>,PEP 372 Ordered Dictionaries,What’s New In Python 3 1
@anchor{whatsnew/3 1 pep-378-format-specifier-for-thousands-separator}@anchor{1483}
@subsection PEP 378: Format Specifier for Thousands Separator


The built-in @ref{199,,format()} function and the @ref{832,,str.format()} method use
a mini-language that now includes a simple, non-locale aware way to format
a number with a thousands separator.  That provides a way to humanize a
program’s output, improving its professional appearance and readability:

@example
>>> format(1234567, ',d')
'1,234,567'
>>> format(1234567.89, ',.2f')
'1,234,567.89'
>>> format(12345.6 + 8901234.12j, ',f')
'12,345.600000+8,901,234.120000j'
>>> format(Decimal('1234567.89'), ',f')
'1,234,567.89'
@end example

The supported types are @ref{19b,,int}, @ref{196,,float}, @ref{197,,complex}
and @ref{1fe,,decimal.Decimal}.

Discussions are underway about how to specify alternative separators
like dots, spaces, apostrophes, or underscores.  Locale-aware applications
should use the existing `n' format specifier which already has some support
for thousands separators.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 378

@item PEP 378@footnote{https://peps.python.org/pep-0378/} - Format Specifier for Thousands Separator

PEP written by Raymond Hettinger and implemented by Eric Smith and
Mark Dickinson.
@end table


@node Other Language Changes<7>,New Improved and Deprecated Modules<2>,PEP 378 Format Specifier for Thousands Separator,What’s New In Python 3 1
@anchor{whatsnew/3 1 other-language-changes}@anchor{1484}
@subsection Other Language Changes


Some smaller changes made to the core Python language are:


@itemize *

@item 
Directories and zip archives containing a @code{__main__.py}
file can now be executed directly by passing their name to the
interpreter. The directory/zipfile is automatically inserted as the
first entry in sys.path.  (Suggestion and initial patch by Andy Chu;
revised patch by Phillip J. Eby and Nick Coghlan; bpo-1739468@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1739468}.)

@item 
The @ref{19b,,int()} type gained a @code{bit_length} method that returns the
number of bits necessary to represent its argument in binary:

@example
>>> n = 37
>>> bin(37)
'0b100101'
>>> n.bit_length()
6
>>> n = 2**123-1
>>> n.bit_length()
123
>>> (n+1).bit_length()
124
@end example

(Contributed by Fredrik Johansson, Victor Stinner, Raymond Hettinger,
and Mark Dickinson; bpo-3439@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=3439}.)

@item 
The fields in @ref{199,,format()} strings can now be automatically
numbered:

@example
>>> 'Sir @{@} of @{@}'.format('Gallahad', 'Camelot')
'Sir Gallahad of Camelot'
@end example

Formerly, the string would have required numbered fields such as:
@code{'Sir @{0@} of @{1@}'}.

(Contributed by Eric Smith; bpo-5237@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5237}.)

@item 
The @code{string.maketrans()} function is deprecated and is replaced by new
static methods, @ref{1479,,bytes.maketrans()} and @ref{147a,,bytearray.maketrans()}.
This change solves the confusion around which types were supported by the
@ref{d8,,string} module. Now, @ref{169,,str}, @ref{192,,bytes}, and
@ref{344,,bytearray} each have their own `maketrans' and `translate'
methods with intermediate translation tables of the appropriate type.

(Contributed by Georg Brandl; bpo-5675@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5675}.)

@item 
The syntax of the @ref{186,,with} statement now allows multiple context
managers in a single statement:

@example
>>> with open('mylog.txt') as infile, open('a.out', 'w') as outfile:
...     for line in infile:
...         if '<critical>' in line:
...             outfile.write(line)
@end example

With the new syntax, the @code{contextlib.nested()} function is no longer
needed and is now deprecated.

(Contributed by Georg Brandl and Mattias Brändström;
appspot issue 53094@footnote{https://codereview.appspot.com/53094}.)

@item 
@code{round(x, n)} now returns an integer if `x' is an integer.
Previously it returned a float:

@example
>>> round(1123, -2)
1100
@end example

(Contributed by Mark Dickinson; bpo-4707@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4707}.)

@item 
Python now uses David Gay’s algorithm for finding the shortest floating-point
representation that doesn’t change its value.  This should help
mitigate some of the confusion surrounding binary floating-point
numbers.

The significance is easily seen with a number like @code{1.1} which does not
have an exact equivalent in binary floating point.  Since there is no exact
equivalent, an expression like @code{float('1.1')} evaluates to the nearest
representable value which is @code{0x1.199999999999ap+0} in hex or
@code{1.100000000000000088817841970012523233890533447265625} in decimal. That
nearest value was and still is used in subsequent floating-point
calculations.

What is new is how the number gets displayed.  Formerly, Python used a
simple approach.  The value of @code{repr(1.1)} was computed as @code{format(1.1,
'.17g')} which evaluated to @code{'1.1000000000000001'}. The advantage of
using 17 digits was that it relied on IEEE-754 guarantees to assure that
@code{eval(repr(1.1))} would round-trip exactly to its original value.  The
disadvantage is that many people found the output to be confusing (mistaking
intrinsic limitations of binary floating-point representation as being a
problem with Python itself).

The new algorithm for @code{repr(1.1)} is smarter and returns @code{'1.1'}.
Effectively, it searches all equivalent string representations (ones that
get stored with the same underlying float value) and returns the shortest
representation.

The new algorithm tends to emit cleaner representations when possible, but
it does not change the underlying values.  So, it is still the case that
@code{1.1 + 2.2 != 3.3} even though the representations may suggest otherwise.

The new algorithm depends on certain features in the underlying floating-point
implementation.  If the required features are not found, the old
algorithm will continue to be used.  Also, the text pickle protocols
assure cross-platform portability by using the old algorithm.

(Contributed by Eric Smith and Mark Dickinson; bpo-1580@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1580})
@end itemize

@node New Improved and Deprecated Modules<2>,Optimizations<7>,Other Language Changes<7>,What’s New In Python 3 1
@anchor{whatsnew/3 1 new-improved-and-deprecated-modules}@anchor{1485}
@subsection New, Improved, and Deprecated Modules



@itemize *

@item 
Added a @ref{1296,,collections.Counter} class to support convenient
counting of unique items in a sequence or iterable:

@example
>>> Counter(['red', 'blue', 'red', 'green', 'blue', 'blue'])
Counter(@{'blue': 3, 'red': 2, 'green': 1@})
@end example

(Contributed by Raymond Hettinger; bpo-1696199@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1696199}.)

@item 
Added a new module, @ref{ff,,tkinter.ttk} for access to the Tk themed widget set.
The basic idea of ttk is to separate, to the extent possible, the code
implementing a widget’s behavior from the code implementing its appearance.

(Contributed by Guilherme Polo; bpo-2983@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2983}.)

@item 
The @ref{65a,,gzip.GzipFile} and @ref{a66,,bz2.BZ2File} classes now support
the context management protocol:

@example
>>> # Automatically close file after writing
>>> with gzip.GzipFile(filename, "wb") as f:
...     f.write(b"xxx")
@end example

(Contributed by Antoine Pitrou.)

@item 
The @ref{3a,,decimal} module now supports methods for creating a
decimal object from a binary @ref{196,,float}.  The conversion is
exact but can sometimes be surprising:

@example
>>> Decimal.from_float(1.1)
Decimal('1.100000000000000088817841970012523233890533447265625')
@end example

The long decimal result shows the actual binary fraction being
stored for `1.1'.  The fraction has many digits because `1.1' cannot
be exactly represented in binary.

(Contributed by Raymond Hettinger and Mark Dickinson.)

@item 
The @ref{85,,itertools} module grew two new functions.  The
@ref{1486,,itertools.combinations_with_replacement()} function is one of
four for generating combinatorics including permutations and Cartesian
products.  The @ref{1487,,itertools.compress()} function mimics its namesake
from APL.  Also, the existing @ref{1488,,itertools.count()} function now has
an optional `step' argument and can accept any type of counting
sequence including @ref{213,,fractions.Fraction} and
@ref{1fe,,decimal.Decimal}:

@example
>>> [p+q for p,q in combinations_with_replacement('LOVE', 2)]
['LL', 'LO', 'LV', 'LE', 'OO', 'OV', 'OE', 'VV', 'VE', 'EE']

>>> list(compress(data=range(10), selectors=[0,0,1,1,0,1,0,1,0,0]))
[2, 3, 5, 7]

>>> c = count(start=Fraction(1,2), step=Fraction(1,6))
>>> [next(c), next(c), next(c), next(c)]
[Fraction(1, 2), Fraction(2, 3), Fraction(5, 6), Fraction(1, 1)]
@end example

(Contributed by Raymond Hettinger.)

@item 
@ref{4e0,,collections.namedtuple()} now supports a keyword argument
`rename' which lets invalid fieldnames be automatically converted to
positional names in the form _0, _1, etc.  This is useful when
the field names are being created by an external source such as a
CSV header, SQL field list, or user input:

@example
>>> query = input()
SELECT region, dept, count(*) FROM main GROUPBY region, dept

>>> cursor.execute(query)
>>> query_fields = [desc[0] for desc in cursor.description]
>>> UserQuery = namedtuple('UserQuery', query_fields, rename=True)
>>> pprint.pprint([UserQuery(*row) for row in cursor])
[UserQuery(region='South', dept='Shipping', _2=185),
 UserQuery(region='North', dept='Accounting', _2=37),
 UserQuery(region='West', dept='Sales', _2=419)]
@end example

(Contributed by Raymond Hettinger; bpo-1818@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1818}.)

@item 
The @ref{5a2,,re.sub()}, @ref{5a3,,re.subn()} and @ref{5a1,,re.split()} functions now
accept a flags parameter.

(Contributed by Gregory Smith.)

@item 
The @ref{8b,,logging} module now implements a simple @ref{1489,,logging.NullHandler}
class for applications that are not using logging but are calling
library code that does.  Setting-up a null handler will suppress
spurious warnings such as “No handlers could be found for logger foo”:

@example
>>> h = logging.NullHandler()
>>> logging.getLogger("foo").addHandler(h)
@end example

(Contributed by Vinay Sajip; bpo-4384@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4384}).

@item 
The @ref{c3,,runpy} module which supports the @code{-m} command line switch
now supports the execution of packages by looking for and executing
a @code{__main__} submodule when a package name is supplied.

(Contributed by Andi Vajda; bpo-4195@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4195}.)

@item 
The @ref{aa,,pdb} module can now access and display source code loaded via
@ref{138,,zipimport} (or any other conformant 
@geindex Python 향상 제안; PEP 302
PEP 302@footnote{https://peps.python.org/pep-0302/} loader).

(Contributed by Alexander Belopolsky; bpo-4201@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4201}.)

@item 
@ref{217,,functools.partial} objects can now be pickled.
@end itemize

@quotation

(Suggested by Antoine Pitrou and Jesse Noller.  Implemented by
Jack Diederich; bpo-5228@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5228}.)
@end quotation


@itemize *

@item 
Add @ref{ba,,pydoc} help topics for symbols so that @code{help('@@')}
works as expected in the interactive environment.

(Contributed by David Laban; bpo-4739@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4739}.)

@item 
The @ref{10c,,unittest} module now supports skipping individual tests or classes
of tests. And it supports marking a test as an expected failure, a test that
is known to be broken, but shouldn’t be counted as a failure on a
TestResult:

@example
class TestGizmo(unittest.TestCase):

    @@unittest.skipUnless(sys.platform.startswith("win"), "requires Windows")
    def test_gizmo_on_windows(self):
        ...

    @@unittest.expectedFailure
    def test_gimzo_without_required_library(self):
        ...
@end example

Also, tests for exceptions have been builtout to work with context managers
using the @ref{186,,with} statement:

@example
def test_division_by_zero(self):
    with self.assertRaises(ZeroDivisionError):
        x / 0
@end example

In addition, several new assertion methods were added including
@ref{148a,,assertSetEqual()},
@ref{148b,,assertDictEqual()},
@code{assertDictContainsSubset()},
@ref{148c,,assertListEqual()},
@ref{148d,,assertTupleEqual()},
@ref{148e,,assertSequenceEqual()},
@ref{751,,assertRaisesRegexp()},
@ref{148f,,assertIsNone()},
and @ref{1490,,assertIsNotNone()}.

(Contributed by Benjamin Peterson and Antoine Pitrou.)

@item 
The @ref{83,,io} module has three new constants for the @ref{1491,,seek()}
method: @ref{1492,,SEEK_SET}, @ref{1493,,SEEK_CUR}, and @ref{1494,,SEEK_END}.

@item 
The @ref{8ae,,sys.version_info} tuple is now a named tuple:

@example
>>> sys.version_info
sys.version_info(major=3, minor=1, micro=0, releaselevel='alpha', serial=2)
@end example

(Contributed by Ross Light; bpo-4285@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4285}.)

@item 
The @code{nntplib} and @ref{78,,imaplib} modules now support IPv6.

(Contributed by Derek Morr; bpo-1655@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1655} and bpo-1664@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1664}.)

@item 
The @ref{ab,,pickle} module has been adapted for better interoperability with
Python 2.x when used with protocol 2 or lower.  The reorganization of the
standard library changed the formal reference for many objects.  For
example, @code{__builtin__.set} in Python 2 is called @code{builtins.set} in Python
3. This change confounded efforts to share data between different versions of
Python.  But now when protocol 2 or lower is selected, the pickler will
automatically use the old Python 2 names for both loading and dumping. This
remapping is turned-on by default but can be disabled with the `fix_imports'
option:

@example
>>> s = @{1, 2, 3@}
>>> pickle.dumps(s, protocol=0)
b'c__builtin__\nset\np0\n((lp1\nL1L\naL2L\naL3L\natp2\nRp3\n.'
>>> pickle.dumps(s, protocol=0, fix_imports=False)
b'cbuiltins\nset\np0\n((lp1\nL1L\naL2L\naL3L\natp2\nRp3\n.'
@end example

An unfortunate but unavoidable side-effect of this change is that protocol 2
pickles produced by Python 3.1 won’t be readable with Python 3.0. The latest
pickle protocol, protocol 3, should be used when migrating data between
Python 3.x implementations, as it doesn’t attempt to remain compatible with
Python 2.x.

(Contributed by Alexandre Vassalotti and Antoine Pitrou, bpo-6137@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6137}.)

@item 
A new module, @ref{7b,,importlib} was added.  It provides a complete, portable,
pure Python reference implementation of the @ref{7f7,,import} statement and its
counterpart, the @ref{ad1,,__import__()} function.  It represents a substantial
step forward in documenting and defining the actions that take place during
imports.

(Contributed by Brett Cannon.)
@end itemize

@node Optimizations<7>,IDLE<2>,New Improved and Deprecated Modules<2>,What’s New In Python 3 1
@anchor{whatsnew/3 1 optimizations}@anchor{1495}
@subsection Optimizations


Major performance enhancements have been added:


@itemize *

@item 
The new I/O library (as defined in 
@geindex Python 향상 제안; PEP 3116
PEP 3116@footnote{https://peps.python.org/pep-3116/}) was mostly written in
Python and quickly proved to be a problematic bottleneck in Python 3.0.
In Python 3.1, the I/O library has been entirely rewritten in C and is
2 to 20 times faster depending on the task at hand. The pure Python
version is still available for experimentation purposes through
the @code{_pyio} module.

(Contributed by Amaury Forgeot d’Arc and Antoine Pitrou.)

@item 
Added a heuristic so that tuples and dicts containing only untrackable objects
are not tracked by the garbage collector. This can reduce the size of
collections and therefore the garbage collection overhead on long-running
programs, depending on their particular use of datatypes.

(Contributed by Antoine Pitrou, bpo-4688@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4688}.)

@item 
Enabling a configure option named @code{--with-computed-gotos}
on compilers that support it (notably: gcc, SunPro, icc), the bytecode
evaluation loop is compiled with a new dispatch mechanism which gives
speedups of up to 20%, depending on the system, the compiler, and
the benchmark.

(Contributed by Antoine Pitrou along with a number of other participants,
bpo-4753@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4753}).

@item 
The decoding of UTF-8, UTF-16 and LATIN-1 is now two to four times
faster.

(Contributed by Antoine Pitrou and Amaury Forgeot d’Arc, bpo-4868@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4868}.)

@item 
The @ref{86,,json} module now has a C extension to substantially improve
its performance.  In addition, the API was modified so that json works
only with @ref{169,,str}, not with @ref{192,,bytes}.  That change makes the
module closely match the JSON specification@footnote{https://json.org/}
which is defined in terms of Unicode.

(Contributed by Bob Ippolito and converted to Py3.1 by Antoine Pitrou
and Benjamin Peterson; bpo-4136@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4136}.)

@item 
Unpickling now interns the attribute names of pickled objects.  This saves
memory and allows pickles to be smaller.

(Contributed by Jake McGuire and Antoine Pitrou; bpo-5084@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5084}.)
@end itemize

@node IDLE<2>,Build and C API Changes<3>,Optimizations<7>,What’s New In Python 3 1
@anchor{whatsnew/3 1 idle}@anchor{1496}
@subsection IDLE



@itemize *

@item 
IDLE’s format menu now provides an option to strip trailing whitespace
from a source file.

(Contributed by Roger D. Serwy; bpo-5150@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5150}.)
@end itemize

@node Build and C API Changes<3>,Porting to Python 3 1,IDLE<2>,What’s New In Python 3 1
@anchor{whatsnew/3 1 build-and-c-api-changes}@anchor{1497}
@subsection Build and C API Changes


Changes to Python’s build process and to the C API include:


@itemize *

@item 
Integers are now stored internally either in base @code{2**15} or in base
@code{2**30}, the base being determined at build time.  Previously, they
were always stored in base @code{2**15}.  Using base @code{2**30} gives
significant performance improvements on 64-bit machines, but
benchmark results on 32-bit machines have been mixed.  Therefore,
the default is to use base @code{2**30} on 64-bit machines and base @code{2**15}
on 32-bit machines; on Unix, there’s a new configure option
@code{--enable-big-digits} that can be used to override this default.

Apart from the performance improvements this change should be invisible to
end users, with one exception: for testing and debugging purposes there’s a
new @ref{1498,,sys.int_info} that provides information about the
internal format, giving the number of bits per digit and the size in bytes
of the C type used to store each digit:

@example
>>> import sys
>>> sys.int_info
sys.int_info(bits_per_digit=30, sizeof_digit=4)
@end example

(Contributed by Mark Dickinson; bpo-4258@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4258}.)

@item 
The @ref{1499,,PyLong_AsUnsignedLongLong()} function now handles a negative
`pylong' by raising @ref{a81,,OverflowError} instead of @ref{198,,TypeError}.

(Contributed by Mark Dickinson and Lisandro Dalcrin; bpo-5175@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5175}.)

@item 
Deprecated @code{PyNumber_Int()}.  Use @ref{c5c,,PyNumber_Long()} instead.

(Contributed by Mark Dickinson; bpo-4910@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4910}.)

@item 
Added a new @ref{149a,,PyOS_string_to_double()} function to replace the
deprecated functions @code{PyOS_ascii_strtod()} and @code{PyOS_ascii_atof()}.

(Contributed by Mark Dickinson; bpo-5914@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5914}.)

@item 
Added @ref{1477,,PyCapsule} as a replacement for the @code{PyCObject} API.
The principal difference is that the new type has a well defined interface
for passing typing safety information and a less complicated signature
for calling a destructor.  The old type had a problematic API and is now
deprecated.

(Contributed by Larry Hastings; bpo-5630@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5630}.)
@end itemize

@node Porting to Python 3 1,,Build and C API Changes<3>,What’s New In Python 3 1
@anchor{whatsnew/3 1 porting-to-python-3-1}@anchor{149b}
@subsection Porting to Python 3.1


This section lists previously described changes and other bugfixes
that may require changes to your code:


@itemize *

@item 
The new floating-point string representations can break existing doctests.
For example:

@example
def e():
    '@w{'}'Compute the base of natural logarithms.

    >>> e()
    2.7182818284590451

    '@w{'}'
    return sum(1/math.factorial(x) for x in reversed(range(30)))

doctest.testmod()

**********************************************************************
Failed example:
    e()
Expected:
    2.7182818284590451
Got:
    2.718281828459045
**********************************************************************
@end example

@item 
The automatic name remapping in the pickle module for protocol 2 or lower can
make Python 3.1 pickles unreadable in Python 3.0.  One solution is to use
protocol 3.  Another solution is to set the `fix_imports' option to @code{False}.
See the discussion above for more details.
@end itemize

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node What’s New In Python 3 0,What’s New in Python 2 7,What’s New In Python 3 1,파이썬의 새로운 기능
@anchor{whatsnew/3 0 doc}@anchor{149c}@anchor{whatsnew/3 0 translation-repo}@anchor{149d}@anchor{whatsnew/3 0 what-s-new-in-python-3-0}@anchor{149e}
@section What’s New In Python 3.0


@c XXX Add trademark info for Apple, Microsoft.

@*Author: 
Guido van Rossum


@c $Id$
@c Rules for maintenance:
@c 
@c * Anyone can add text to this document.  Do not spend very much time
@c on the wording of your changes, because your text will probably
@c get rewritten to some degree.
@c 
@c * The maintainer will go through Misc/NEWS periodically and add
@c changes; it's therefore more important to add your changes to
@c Misc/NEWS than to this file.  (Note: I didn't get to this for 3.0.
@c GvR.)
@c 
@c * This is not a complete list of every single change; completeness
@c is the purpose of Misc/NEWS.  Some changes I consider too small
@c or esoteric to include.  If such a change is added to the text,
@c I'll just remove it.  (This is another reason you shouldn't spend
@c too much time on writing your addition.)
@c 
@c * If you want to draw your new text to the attention of the
@c maintainer, add 'XXX' to the beginning of the paragraph or
@c section.
@c 
@c * It's OK to just add a fragmentary note about a change.  For
@c example: "XXX Describe the transmogrify() function added to the
@c socket module."  The maintainer will research the change and
@c write the necessary text.
@c 
@c * You can comment out your additions if you like, but it's not
@c necessary (especially when a final release is some months away).
@c 
@c * Credit the author of a patch or bugfix.   Just the name is
@c sufficient; the e-mail address isn't necessary.  (Due to time
@c constraints I haven't managed to do this for 3.0.  GvR.)
@c 
@c * It's helpful to add the bug/patch number as a comment:
@c 
@c % Patch 12345
@c XXX Describe the transmogrify() function added to the socket
@c module.
@c (Contributed by P.Y. Developer.)
@c 
@c This saves the maintainer the effort of going through the SVN log
@c when researching a change.  (Again, I didn't get to this for 3.0.
@c GvR.)

This article explains the new features in Python 3.0, compared to 2.6.
Python 3.0, also known as “Python 3000” or “Py3K”, is the first ever
`intentionally backwards incompatible' Python release. Python 3.0 was released on December 3, 2008.
There are more changes than in a typical release, and more that are important for all
Python users. Nevertheless, after digesting the changes, you’ll find
that Python really hasn’t changed all that much – by and large, we’re
mostly fixing well-known annoyances and warts, and removing a lot of
old cruft.

This article doesn’t attempt to provide a complete specification of
all new features, but instead tries to give a convenient overview.
For full details, you should refer to the documentation for Python
3.0, and/or the many PEPs referenced in the text. If you want to
understand the complete implementation and design rationale for a
particular feature, PEPs usually have more details than the regular
documentation; but note that PEPs usually are not kept up-to-date once
a feature has been fully implemented.

Due to time constraints this document is not as complete as it should
have been.  As always for a new release, the @code{Misc/NEWS} file in the
source distribution contains a wealth of detailed information about
every small thing that was changed.

@c Compare with previous release in 2 - 3 sentences here.

@c add hyperlink when the documentation becomes available online.

@c ======================================================================

@c Large, PEP-level features and changes should be described here.

@c Should there be a new section here for 3k migration?

@c Or perhaps a more general section describing module changes/deprecation?

@c sets module deprecated

@c ======================================================================

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

@end menu

@node Common Stumbling Blocks,Overview Of Syntax Changes,,What’s New In Python 3 0
@anchor{whatsnew/3 0 common-stumbling-blocks}@anchor{149f}
@subsection Common Stumbling Blocks


This section lists those few changes that are most likely to trip you
up if you’re used to Python 2.5.

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

@end menu

@node Print Is A Function,Views And Iterators Instead Of Lists,,Common Stumbling Blocks
@anchor{whatsnew/3 0 print-is-a-function}@anchor{14a0}
@subsubsection Print Is A Function


The @code{print} statement has been replaced with a @ref{1174,,print()}
function, with keyword arguments to replace most of the special syntax
of the old @code{print} statement (
@geindex Python 향상 제안; PEP 3105
PEP 3105@footnote{https://peps.python.org/pep-3105/}).  Examples:

@example
Old: print "The answer is", 2*2
New: print("The answer is", 2*2)

Old: print x,           # Trailing comma suppresses newline
New: print(x, end=" ")  # Appends a space instead of a newline

Old: print              # Prints a newline
New: print()            # You must call the function!

Old: print >>sys.stderr, "fatal error"
New: print("fatal error", file=sys.stderr)

Old: print (x, y)       # prints repr((x, y))
New: print((x, y))      # Not the same as print(x, y)!
@end example

You can also customize the separator between items, e.g.:

@example
print("There are <", 2**32, "> possibilities!", sep="")
@end example

which produces:

@example
There are <4294967296> possibilities!
@end example

Note:


@itemize *

@item 
The @ref{1174,,print()} function doesn’t support the “softspace” feature of
the old @code{print} statement.  For example, in Python 2.x,
@code{print "A\n", "B"} would write @code{"A\nB\n"}; but in Python 3.0,
@code{print("A\n", "B")} writes @code{"A\n B\n"}.

@item 
Initially, you’ll be finding yourself typing the old @code{print x}
a lot in interactive mode.  Time to retrain your fingers to type
@code{print(x)} instead!

@item 
When using the @code{2to3} source-to-source conversion tool, all
@code{print} statements are automatically converted to
@ref{1174,,print()} function calls, so this is mostly a non-issue for
larger projects.
@end itemize

@node Views And Iterators Instead Of Lists,Ordering Comparisons,Print Is A Function,Common Stumbling Blocks
@anchor{whatsnew/3 0 views-and-iterators-instead-of-lists}@anchor{14a1}
@subsubsection Views And Iterators Instead Of Lists


Some well-known APIs no longer return lists:


@itemize *

@item 
@ref{183,,dict} methods @ref{9d0,,dict.keys()}, @ref{9d2,,dict.items()} and
@ref{9d1,,dict.values()} return “views” instead of lists.  For example,
this no longer works: @code{k = d.keys(); k.sort()}.  Use @code{k =
sorted(d)} instead (this works in Python 2.5 too and is just
as efficient).

@item 
Also, the @code{dict.iterkeys()}, @code{dict.iteritems()} and
@code{dict.itervalues()} methods are no longer supported.

@item 
@ref{19f,,map()} and @ref{a64,,filter()} return iterators.  If you really need
a list and the input sequences are all of equal length, a quick
fix is to wrap @code{map()} in @ref{24d,,list()}, e.g. @code{list(map(...))},
but a better fix is
often to use a list comprehension (especially when the original code
uses @ref{14a2,,lambda}), or rewriting the code so it doesn’t need a
list at all.  Particularly tricky is @code{map()} invoked for the
side effects of the function; the correct transformation is to use a
regular @ref{34a,,for} loop (since creating a list would just be
wasteful).

If the input sequences are not of equal length, @ref{19f,,map()} will
stop at the termination of the shortest of the sequences. For full
compatibility with @code{map()} from Python 2.x, also wrap the sequences in
@ref{14a3,,itertools.zip_longest()}, e.g. @code{map(func, *sequences)} becomes
@code{list(map(func, itertools.zip_longest(*sequences)))}.

@item 
@ref{b3d,,range()} now behaves like @code{xrange()} used to behave, except
it works with values of arbitrary size.  The latter no longer
exists.

@item 
@ref{1a0,,zip()} now returns an iterator.
@end itemize

@node Ordering Comparisons,Integers,Views And Iterators Instead Of Lists,Common Stumbling Blocks
@anchor{whatsnew/3 0 ordering-comparisons}@anchor{14a4}
@subsubsection Ordering Comparisons


Python 3.0 has simplified the rules for ordering comparisons:


@itemize *

@item 
The ordering comparison operators (@code{<}, @code{<=}, @code{>=}, @code{>})
raise a TypeError exception when the operands don’t have a
meaningful natural ordering.  Thus, expressions like @code{1 < '@w{'}}, @code{0
> None} or @code{len <= len} are no longer valid, and e.g. @code{None <
None} raises @ref{198,,TypeError} instead of returning
@code{False}.  A corollary is that sorting a heterogeneous list
no longer makes sense – all the elements must be comparable to each
other.  Note that this does not apply to the @code{==} and @code{!=}
operators: objects of different incomparable types always compare
unequal to each other.

@item 
@ref{dc6,,sorted()} and @ref{dc7,,list.sort()} no longer accept the
`cmp' argument providing a comparison function.  Use the `key'
argument instead. N.B. the `key' and `reverse' arguments are now
“keyword-only”.

@item 
The @code{cmp()} function should be treated as gone, and the @code{__cmp__()}
special method is no longer supported.  Use @ref{14a5,,__lt__()} for sorting,
@ref{cf1,,__eq__()} with @ref{cf2,,__hash__()}, and other rich comparisons as needed.
(If you really need the @code{cmp()} functionality, you could use the
expression @code{(a > b) - (a < b)} as the equivalent for @code{cmp(a, b)}.)
@end itemize

@node Integers,Text Vs Data Instead Of Unicode Vs 8-bit,Ordering Comparisons,Common Stumbling Blocks
@anchor{whatsnew/3 0 integers}@anchor{14a6}
@subsubsection Integers



@itemize *

@item 
@geindex Python 향상 제안; PEP 237
PEP 237@footnote{https://peps.python.org/pep-0237/}: Essentially, @code{long} renamed to @ref{19b,,int}.
That is, there is only one built-in integral type, named
@code{int}; but it behaves mostly like the old @code{long} type.

@item 
@geindex Python 향상 제안; PEP 238
PEP 238@footnote{https://peps.python.org/pep-0238/}: An expression like @code{1/2} returns a float.  Use
@code{1//2} to get the truncating behavior.  (The latter syntax has
existed for years, at least since Python 2.2.)

@item 
The @code{sys.maxint} constant was removed, since there is no
longer a limit to the value of integers.  However, @ref{13ca,,sys.maxsize}
can be used as an integer larger than any practical list or string
index.  It conforms to the implementation’s “natural” integer size
and is typically the same as @code{sys.maxint} in previous releases
on the same platform (assuming the same build options).

@item 
The @ref{1c1,,repr()} of a long integer doesn’t include the trailing @code{L}
anymore, so code that unconditionally strips that character will
chop off the last digit instead.  (Use @ref{169,,str()} instead.)

@item 
Octal literals are no longer of the form @code{0720}; use @code{0o720}
instead.
@end itemize

@node Text Vs Data Instead Of Unicode Vs 8-bit,,Integers,Common Stumbling Blocks
@anchor{whatsnew/3 0 text-vs-data-instead-of-unicode-vs-8-bit}@anchor{14a7}
@subsubsection Text Vs. Data Instead Of Unicode Vs. 8-bit


Everything you thought you knew about binary data and Unicode has
changed.


@itemize *

@item 
Python 3.0 uses the concepts of `text' and (binary) `data' instead
of Unicode strings and 8-bit strings.  All text is Unicode; however
`encoded' Unicode is represented as binary data.  The type used to
hold text is @ref{169,,str}, the type used to hold data is
@ref{192,,bytes}.  The biggest difference with the 2.x situation is
that any attempt to mix text and data in Python 3.0 raises
@ref{198,,TypeError}, whereas if you were to mix Unicode and 8-bit
strings in Python 2.x, it would work if the 8-bit string happened to
contain only 7-bit (ASCII) bytes, but you would get
@ref{c07,,UnicodeDecodeError} if it contained non-ASCII values.  This
value-specific behavior has caused numerous sad faces over the
years.

@item 
As a consequence of this change in philosophy, pretty much all code
that uses Unicode, encodings or binary data most likely has to
change.  The change is for the better, as in the 2.x world there
were numerous bugs having to do with mixing encoded and unencoded
text.  To be prepared in Python 2.x, start using @code{unicode}
for all unencoded text, and @ref{169,,str} for binary or encoded data
only.  Then the @code{2to3} tool will do most of the work for you.

@item 
You can no longer use @code{u"..."} literals for Unicode text.
However, you must use @code{b"..."} literals for binary data.

@item 
As the @ref{169,,str} and @ref{192,,bytes} types cannot be mixed, you
must always explicitly convert between them.  Use @ref{ad2,,str.encode()}
to go from @code{str} to @code{bytes}, and @ref{ad3,,bytes.decode()}
to go from @code{bytes} to @code{str}.  You can also use
@code{bytes(s, encoding=...)} and @code{str(b, encoding=...)},
respectively.

@item 
Like @ref{169,,str}, the @ref{192,,bytes} type is immutable.  There is a
separate `mutable' type to hold buffered binary data,
@ref{344,,bytearray}.  Nearly all APIs that accept @code{bytes} also
accept @code{bytearray}.  The mutable API is based on
@ref{4c1,,collections.MutableSequence}.

@item 
All backslashes in raw string literals are interpreted literally.
This means that @code{'\U'} and @code{'\u'} escapes in raw strings are not
treated specially.  For example, @code{r'\u20ac'} is a string of 6
characters in Python 3.0, whereas in 2.6, @code{ur'\u20ac'} was the
single “euro” character.  (Of course, this change only affects raw
string literals; the euro character is @code{'\u20ac'} in Python 3.0.)

@item 
The built-in @code{basestring} abstract type was removed.  Use
@ref{169,,str} instead.  The @code{str} and @ref{192,,bytes} types
don’t have functionality enough in common to warrant a shared base
class.  The @code{2to3} tool (see below) replaces every occurrence of
@code{basestring} with @code{str}.

@item 
Files opened as text files (still the default mode for @ref{316,,open()})
always use an encoding to map between strings (in memory) and bytes
(on disk).  Binary files (opened with a @code{b} in the mode argument)
always use bytes in memory.  This means that if a file is opened
using an incorrect mode or encoding, I/O will likely fail loudly,
instead of silently producing incorrect data.  It also means that
even Unix users will have to specify the correct mode (text or
binary) when opening a file.  There is a platform-dependent default
encoding, which on Unixy platforms can be set with the @code{LANG}
environment variable (and sometimes also with some other
platform-specific locale-related environment variables).  In many
cases, but not all, the system default is UTF-8; you should never
count on this default.  Any application reading or writing more than
pure ASCII text should probably have a way to override the encoding.
There is no longer any need for using the encoding-aware streams
in the @ref{1c,,codecs} module.

@item 
The initial values of @ref{75e,,sys.stdin}, @ref{ccc,,sys.stdout} and
@ref{b33,,sys.stderr} are now unicode-only text files (i.e., they are
instances of @ref{8a3,,io.TextIOBase}).  To read and write bytes data
with these streams, you need to use their @ref{14a8,,io.TextIOBase.buffer}
attribute.

@item 
Filenames are passed to and returned from APIs as (Unicode) strings.
This can present platform-specific problems because on some
platforms filenames are arbitrary byte strings.  (On the other hand,
on Windows filenames are natively stored as Unicode.)  As a
work-around, most APIs (e.g. @ref{316,,open()} and many functions in the
@ref{a5,,os} module) that take filenames accept @ref{192,,bytes} objects
as well as strings, and a few APIs have a way to ask for a
@code{bytes} return value.  Thus, @ref{12ff,,os.listdir()} returns a
list of @code{bytes} instances if the argument is a @code{bytes}
instance, and @ref{c81,,os.getcwdb()} returns the current working
directory as a @code{bytes} instance.  Note that when
@code{os.listdir()} returns a list of strings, filenames that
cannot be decoded properly are omitted rather than raising
@ref{462,,UnicodeError}.

@item 
Some system APIs like @ref{259,,os.environ} and @ref{1469,,sys.argv} can
also present problems when the bytes made available by the system is
not interpretable using the default encoding.  Setting the @code{LANG}
variable and rerunning the program is probably the best approach.

@item 
@geindex Python 향상 제안; PEP 3138
PEP 3138@footnote{https://peps.python.org/pep-3138/}: The @ref{1c1,,repr()} of a string no longer escapes
non-ASCII characters.  It still escapes control characters and code
points with non-printable status in the Unicode standard, however.

@item 
@geindex Python 향상 제안; PEP 3120
PEP 3120@footnote{https://peps.python.org/pep-3120/}: The default source encoding is now UTF-8.

@item 
@geindex Python 향상 제안; PEP 3131
PEP 3131@footnote{https://peps.python.org/pep-3131/}: Non-ASCII letters are now allowed in identifiers.
(However, the standard library remains ASCII-only with the exception
of contributor names in comments.)

@item 
The @code{StringIO} and @code{cStringIO} modules are gone.  Instead,
import the @ref{83,,io} module and use @ref{1128,,io.StringIO} or
@ref{10a3,,io.BytesIO} for text and data respectively.

@item 
See also the @ref{14a9,,유니코드 HOWTO}, which was updated for Python 3.0.
@end itemize

@node Overview Of Syntax Changes,Changes Already Present In Python 2 6,Common Stumbling Blocks,What’s New In Python 3 0
@anchor{whatsnew/3 0 overview-of-syntax-changes}@anchor{14aa}
@subsection Overview Of Syntax Changes


This section gives a brief overview of every `syntactic' change in
Python 3.0.

@menu
* New Syntax:: 
* Changed Syntax:: 
* Removed Syntax:: 

@end menu

@node New Syntax,Changed Syntax,,Overview Of Syntax Changes
@anchor{whatsnew/3 0 new-syntax}@anchor{14ab}
@subsubsection New Syntax



@itemize *

@item 
@geindex Python 향상 제안; PEP 3107
PEP 3107@footnote{https://peps.python.org/pep-3107/}: Function argument and return value annotations.  This
provides a standardized way of annotating a function’s parameters
and return value.  There are no semantics attached to such
annotations except that they can be introspected at runtime using
the @ref{458,,__annotations__} attribute.  The intent is to
encourage experimentation through metaclasses, decorators or frameworks.

@item 
@geindex Python 향상 제안; PEP 3102
PEP 3102@footnote{https://peps.python.org/pep-3102/}: Keyword-only arguments.  Named parameters occurring
after @code{*args} in the parameter list `must' be specified using
keyword syntax in the call.  You can also use a bare @code{*} in the
parameter list to indicate that you don’t accept a variable-length
argument list, but you do have keyword-only arguments.

@item 
Keyword arguments are allowed after the list of base classes in a
class definition.  This is used by the new convention for specifying
a metaclass (see next section), but can be used for other purposes
as well, as long as the metaclass supports it.

@item 
@geindex Python 향상 제안; PEP 3104
PEP 3104@footnote{https://peps.python.org/pep-3104/}: @ref{14ac,,nonlocal} statement.  Using @code{nonlocal x}
you can now assign directly to a variable in an outer (but
non-global) scope.  @code{nonlocal} is a new reserved word.

@item 
@geindex Python 향상 제안; PEP 3132
PEP 3132@footnote{https://peps.python.org/pep-3132/}: Extended Iterable Unpacking.  You can now write things
like @code{a, b, *rest = some_sequence}.  And even @code{*rest, a =
stuff}.  The @code{rest} object is always a (possibly empty) list; the
right-hand side may be any iterable.  Example:

@example
(a, *rest, b) = range(5)
@end example

This sets `a' to @code{0}, `b' to @code{4}, and `rest' to @code{[1, 2, 3]}.

@item 
Dictionary comprehensions: @code{@{k: v for k, v in stuff@}} means the
same thing as @code{dict(stuff)} but is more flexible.  (This is
@geindex Python 향상 제안; PEP 274
PEP 274@footnote{https://peps.python.org/pep-0274/} vindicated. :-)

@item 
Set literals, e.g. @code{@{1, 2@}}.  Note that @code{@{@}} is an empty
dictionary; use @code{set()} for an empty set.  Set comprehensions are
also supported; e.g., @code{@{x for x in stuff@}} means the same thing as
@code{set(stuff)} but is more flexible.

@item 
New octal literals, e.g. @code{0o720} (already in 2.6).  The old octal
literals (@code{0720}) are gone.

@item 
New binary literals, e.g. @code{0b1010} (already in 2.6), and
there is a new corresponding built-in function, @ref{14ad,,bin()}.

@item 
Bytes literals are introduced with a leading @code{b} or @code{B}, and
there is a new corresponding built-in function, @ref{192,,bytes()}.
@end itemize

@node Changed Syntax,Removed Syntax,New Syntax,Overview Of Syntax Changes
@anchor{whatsnew/3 0 changed-syntax}@anchor{14ae}
@subsubsection Changed Syntax



@itemize *

@item 
@geindex Python 향상 제안; PEP 3109
PEP 3109@footnote{https://peps.python.org/pep-3109/} and 
@geindex Python 향상 제안; PEP 3134
PEP 3134@footnote{https://peps.python.org/pep-3134/}: new @ref{802,,raise} statement syntax:
@code{raise [@var{expr} [from @var{expr}]]}.  See below.

@item 
@code{as} and @ref{186,,with} are now reserved words.  (Since
2.6, actually.)

@item 
@code{True}, @code{False}, and @code{None} are reserved words.  (2.6 partially enforced
the restrictions on @code{None} already.)

@item 
Change from @ref{1ab,,except} `exc', `var' to
@code{except} `exc' @code{as} `var'.  See 
@geindex Python 향상 제안; PEP 3110
PEP 3110@footnote{https://peps.python.org/pep-3110/}.

@item 
@geindex Python 향상 제안; PEP 3115
PEP 3115@footnote{https://peps.python.org/pep-3115/}: New Metaclass Syntax.  Instead of:

@example
class C:
    __metaclass__ = M
    ...
@end example

you must now use:

@example
class C(metaclass=M):
    ...
@end example

The module-global @code{__metaclass__} variable is no longer
supported.  (It was a crutch to make it easier to default to
new-style classes without deriving every class from
@ref{c7d,,object}.)

@item 
List comprehensions no longer support the syntactic form
@code{[... for @var{var} in @var{item1}, @var{item2}, ...]}.  Use
@code{[... for @var{var} in (@var{item1}, @var{item2}, ...)]} instead.
Also note that list comprehensions have different semantics: they
are closer to syntactic sugar for a generator expression inside a
@ref{24d,,list()} constructor, and in particular the loop control
variables are no longer leaked into the surrounding scope.

@item 
The `ellipsis' (@code{...}) can be used as an atomic expression
anywhere.  (Previously it was only allowed in slices.)  Also, it
`must' now be spelled as @code{...}.  (Previously it could also be
spelled as @code{. . .}, by a mere accident of the grammar.)
@end itemize

@node Removed Syntax,,Changed Syntax,Overview Of Syntax Changes
@anchor{whatsnew/3 0 removed-syntax}@anchor{14af}
@subsubsection Removed Syntax



@itemize *

@item 
@geindex Python 향상 제안; PEP 3113
PEP 3113@footnote{https://peps.python.org/pep-3113/}: Tuple parameter unpacking removed.  You can no longer
write @code{def foo(a, (b, c)): ...}.
Use @code{def foo(a, b_c): b, c = b_c} instead.

@item 
Removed backticks (use @ref{1c1,,repr()} instead).

@item 
Removed @code{<>} (use @code{!=} instead).

@item 
Removed keyword: @ref{4a3,,exec()} is no longer a keyword; it remains as
a function.  (Fortunately the function syntax was also accepted in
2.x.)  Also note that @code{exec()} no longer takes a stream argument;
instead of @code{exec(f)} you can use @code{exec(f.read())}.

@item 
Integer literals no longer support a trailing @code{l} or @code{L}.

@item 
String literals no longer support a leading @code{u} or @code{U}.

@item 
The @ref{14b0,,from} `module' @ref{7f7,,import} @code{*} syntax is only
allowed at the module level, no longer inside functions.

@item 
The only acceptable syntax for relative imports is @code{from .[@var{module}]
import @var{name}}.  All @ref{7f7,,import} forms not starting with @code{.} are
interpreted as absolute imports.  (
@geindex Python 향상 제안; PEP 328
PEP 328@footnote{https://peps.python.org/pep-0328/})

@item 
Classic classes are gone.
@end itemize

@node Changes Already Present In Python 2 6,Library Changes,Overview Of Syntax Changes,What’s New In Python 3 0
@anchor{whatsnew/3 0 changes-already-present-in-python-2-6}@anchor{14b1}
@subsection Changes Already Present In Python 2.6


Since many users presumably make the jump straight from Python 2.5 to
Python 3.0, this section reminds the reader of new features that were
originally designed for Python 3.0 but that were back-ported to Python
2.6.  The corresponding sections in @ref{14b2,,What’s New in Python 2.6} should be
consulted for longer descriptions.


@itemize *

@item 
@ref{14b3,,PEP 343; The ‘with’ statement}.  The @ref{186,,with} statement is now a standard
feature and no longer needs to be imported from the @ref{0,,__future__}.
Also check out @ref{14b4,,Writing Context Managers} and
@ref{14b5,,The contextlib module}.

@item 
@ref{14b6,,PEP 366; Explicit Relative Imports From a Main Module}.  This enhances the usefulness of the @ref{23c,,-m}
option when the referenced module lives in a package.

@item 
@ref{14b7,,PEP 370; Per-user site-packages Directory}.

@item 
@ref{14b8,,PEP 371; The multiprocessing Package}.

@item 
@ref{14b9,,PEP 3101; Advanced String Formatting}.  Note: the 2.6 description mentions the
@ref{199,,format()} method for both 8-bit and Unicode strings.  In 3.0,
only the @ref{169,,str} type (text strings with Unicode support)
supports this method; the @ref{192,,bytes} type does not.  The plan is
to eventually make this the only API for string formatting, and to
start deprecating the @code{%} operator in Python 3.1.

@item 
@ref{14ba,,PEP 3105; print As a Function}.  This is now a standard feature and no longer needs
to be imported from @ref{0,,__future__}.  More details were given above.

@item 
@ref{14bb,,PEP 3110; Exception-Handling Changes}.  The @ref{1ab,,except} `exc' @code{as} `var'
syntax is now standard and @code{except} `exc', `var' is no
longer supported.  (Of course, the @code{as} `var' part is still
optional.)

@item 
@ref{14bc,,PEP 3112; Byte Literals}.  The @code{b"..."} string literal notation (and its
variants like @code{b'...'}, @code{b"""..."""}, and @code{br"..."}) now
produces a literal of type @ref{192,,bytes}.

@item 
@ref{14bd,,PEP 3116; New I/O Library}.  The @ref{83,,io} module is now the standard way of
doing file I/O.  The built-in @ref{316,,open()} function is now an
alias for @ref{73f,,io.open()} and has additional keyword arguments
`encoding', `errors', `newline' and `closefd'.  Also note that an
invalid `mode' argument now raises @ref{2ec,,ValueError}, not
@ref{1252,,IOError}.  The binary file object underlying a text file
object can be accessed as @code{f.buffer} (but beware that the
text object maintains a buffer of itself in order to speed up
the encoding and decoding operations).

@item 
@ref{14be,,PEP 3118; Revised Buffer Protocol}.  The old builtin @code{buffer()} is now really gone;
the new builtin @ref{165,,memoryview()} provides (mostly) similar
functionality.

@item 
@ref{14bf,,PEP 3119; Abstract Base Classes}.  The @ref{4,,abc} module and the ABCs defined in the
@ref{1e,,collections} module plays a somewhat more prominent role in
the language now, and built-in collection types like @ref{183,,dict}
and @ref{24d,,list} conform to the @ref{12b1,,collections.MutableMapping}
and @ref{4c1,,collections.MutableSequence} ABCs, respectively.

@item 
@ref{14c0,,PEP 3127; Integer Literal Support and Syntax}.  As mentioned above, the new octal literal
notation is the only one supported, and binary literals have been
added.

@item 
@ref{14c1,,PEP 3129; Class Decorators}.

@item 
@ref{14c2,,PEP 3141; A Type Hierarchy for Numbers}.  The @ref{a2,,numbers} module is another new use of
ABCs, defining Python’s “numeric tower”.  Also note the new
@ref{61,,fractions} module which implements @ref{14c3,,numbers.Rational}.
@end itemize

@node Library Changes,PEP 3101 A New Approach To String Formatting,Changes Already Present In Python 2 6,What’s New In Python 3 0
@anchor{whatsnew/3 0 library-changes}@anchor{14c4}
@subsection Library Changes


Due to time constraints, this document does not exhaustively cover the
very extensive changes to the standard library.  
@geindex Python 향상 제안; PEP 3108
PEP 3108@footnote{https://peps.python.org/pep-3108/} is the
reference for the major changes to the library.  Here’s a capsule
review:


@itemize *

@item 
Many old modules were removed.  Some, like @code{gopherlib} (no
longer used) and @code{md5} (replaced by @ref{6c,,hashlib}), were
already deprecated by 
@geindex Python 향상 제안; PEP 4
PEP 4@footnote{https://peps.python.org/pep-0004/}.  Others were removed as a result
of the removal of support for various platforms such as Irix, BeOS
and Mac OS 9 (see 
@geindex Python 향상 제안; PEP 11
PEP 11@footnote{https://peps.python.org/pep-0011/}).  Some modules were also selected for
removal in Python 3.0 due to lack of use or because a better
replacement exists.  See 
@geindex Python 향상 제안; PEP 3108
PEP 3108@footnote{https://peps.python.org/pep-3108/} for an exhaustive list.

@item 
The @code{bsddb3} package was removed because its presence in the
core standard library has proved over time to be a particular burden
for the core developers due to testing instability and Berkeley DB’s
release schedule.  However, the package is alive and well,
externally maintained at @indicateurl{https://www.jcea.es/programacion/pybsddb.htm}.

@item 
Some modules were renamed because their old name disobeyed
@geindex Python 향상 제안; PEP 8
PEP 8@footnote{https://peps.python.org/pep-0008/}, or for various other reasons.  Here’s the list:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Old Name

@tab

New Name

@item

_winreg

@tab

winreg

@item

ConfigParser

@tab

configparser

@item

copy_reg

@tab

copyreg

@item

Queue

@tab

queue

@item

SocketServer

@tab

socketserver

@item

markupbase

@tab

_markupbase

@item

repr

@tab

reprlib

@item

test.test_support

@tab

test.support

@end multitable


@item 
A common pattern in Python 2.x is to have one version of a module
implemented in pure Python, with an optional accelerated version
implemented as a C extension; for example, @ref{ab,,pickle} and
@code{cPickle}.  This places the burden of importing the accelerated
version and falling back on the pure Python version on each user of
these modules.  In Python 3.0, the accelerated versions are
considered implementation details of the pure Python versions.
Users should always import the standard version, which attempts to
import the accelerated version and falls back to the pure Python
version.  The @code{pickle} / @code{cPickle} pair received this
treatment.  The @ref{b4,,profile} module is on the list for 3.1.  The
@code{StringIO} module has been turned into a class in the @ref{83,,io}
module.

@item 
Some related modules have been grouped into packages, and usually
the submodule names have been simplified.  The resulting new
packages are:


@itemize *

@item 
@ref{35,,dbm} (@code{anydbm}, @code{dbhash}, @code{dbm},
@code{dumbdbm}, @code{gdbm}, @code{whichdb}).

@item 
@ref{6f,,html} (@code{HTMLParser}, @code{htmlentitydefs}).

@item 
@ref{72,,http} (@code{httplib}, @code{BaseHTTPServer},
@code{CGIHTTPServer}, @code{SimpleHTTPServer}, @code{Cookie},
@code{cookielib}).

@item 
@ref{f6,,tkinter} (all @code{Tkinter}-related modules except
@ref{107,,turtle}).  The target audience of @code{turtle} doesn’t
really care about @code{tkinter}.  Also note that as of Python
2.6, the functionality of @code{turtle} has been greatly enhanced.

@item 
@ref{10e,,urllib} (@code{urllib}, @code{urllib2}, @code{urlparse},
@code{robotparse}).

@item 
@ref{133,,xmlrpc} (@code{xmlrpclib}, @code{DocXMLRPCServer},
@code{SimpleXMLRPCServer}).
@end itemize
@end itemize

Some other changes to standard library modules, not covered by
@geindex Python 향상 제안; PEP 3108
PEP 3108@footnote{https://peps.python.org/pep-3108/}:


@itemize *

@item 
Killed @code{sets}.  Use the built-in @ref{184,,set()} class.

@item 
Cleanup of the @ref{df,,sys} module: removed @code{sys.exitfunc()},
@code{sys.exc_clear()}, @code{sys.exc_type}, @code{sys.exc_value},
@code{sys.exc_traceback}.  (Note that @ref{6e5,,sys.last_type}
etc. remain.)

@item 
Cleanup of the @ref{4c0,,array.array} type: the @code{read()} and
@code{write()} methods are gone; use @ref{14c5,,fromfile()} and
@ref{14c6,,tofile()} instead.  Also, the @code{'c'} typecode for array is
gone – use either @code{'b'} for bytes or @code{'u'} for Unicode
characters.

@item 
Cleanup of the @ref{a3,,operator} module: removed
@code{sequenceIncludes()} and @code{isCallable()}.

@item 
Cleanup of the @code{thread} module: @code{acquire_lock()} and
@code{release_lock()} are gone; use @ref{8a6,,acquire()} and
@ref{14c7,,release()} instead.

@item 
Cleanup of the @ref{bd,,random} module: removed the @code{jumpahead()} API.

@item 
The @code{new} module is gone.

@item 
The functions @code{os.tmpnam()}, @code{os.tempnam()} and
@code{os.tmpfile()} have been removed in favor of the @ref{e6,,tempfile}
module.

@item 
The @ref{101,,tokenize} module has been changed to work with bytes.  The
main entry point is now @ref{6ff,,tokenize.tokenize()}, instead of
generate_tokens.

@item 
@code{string.letters} and its friends (@code{string.lowercase} and
@code{string.uppercase}) are gone.  Use
@ref{14c8,,string.ascii_letters} etc. instead.  (The reason for the
removal is that @code{string.letters} and friends had
locale-specific behavior, which is a bad idea for such
attractively named global “constants”.)

@item 
Renamed module @code{__builtin__} to @ref{13,,builtins} (removing the
underscores, adding an ‘s’).  The @code{__builtins__} variable
found in most global namespaces is unchanged.  To modify a builtin,
you should use @code{builtins}, not @code{__builtins__}!
@end itemize

@node PEP 3101 A New Approach To String Formatting,Changes To Exceptions,Library Changes,What’s New In Python 3 0
@anchor{whatsnew/3 0 pep-3101-a-new-approach-to-string-formatting}@anchor{14c9}
@subsection 
@geindex Python 향상 제안; PEP 3101
`PEP 3101': A New Approach To String Formatting



@itemize *

@item 
A new system for  built-in string formatting operations replaces the
@code{%} string  formatting operator.   (However, the @code{%}  operator is
still supported;  it will  be deprecated in  Python 3.1  and removed
from the language at some later time.)  Read 
@geindex Python 향상 제안; PEP 3101
PEP 3101@footnote{https://peps.python.org/pep-3101/} for the full
scoop.
@end itemize

@node Changes To Exceptions,Miscellaneous Other Changes,PEP 3101 A New Approach To String Formatting,What’s New In Python 3 0
@anchor{whatsnew/3 0 changes-to-exceptions}@anchor{14ca}
@subsection Changes To Exceptions


The APIs for raising and catching exception have been cleaned up and
new powerful features added:


@itemize *

@item 
@geindex Python 향상 제안; PEP 352
PEP 352@footnote{https://peps.python.org/pep-0352/}: All exceptions must be derived (directly or indirectly)
from @ref{7d6,,BaseException}.  This is the root of the exception
hierarchy.  This is not new as a recommendation, but the
`requirement' to inherit from @code{BaseException} is new.  (Python
2.6 still allowed classic classes to be raised, and placed no
restriction on what you can catch.)  As a consequence, string
exceptions are finally truly and utterly dead.

@item 
Almost all exceptions should actually derive from @ref{bcc,,Exception};
@ref{7d6,,BaseException} should only be used as a base class for
exceptions that should only be handled at the top level, such as
@ref{f3b,,SystemExit} or @ref{bc4,,KeyboardInterrupt}.  The recommended
idiom for handling all exceptions except for this latter category is
to use @ref{1ab,,except} @code{Exception}.

@item 
@code{StandardError} was removed.

@item 
Exceptions no longer behave as sequences.  Use the @ref{78c,,args}
attribute instead.

@item 
@geindex Python 향상 제안; PEP 3109
PEP 3109@footnote{https://peps.python.org/pep-3109/}: Raising exceptions.  You must now use @code{raise
@var{Exception}(@var{args})} instead of @code{raise @var{Exception}, @var{args}}.
Additionally, you can no longer explicitly specify a traceback;
instead, if you `have' to do this, you can assign directly to the
@ref{14cb,,__traceback__} attribute (see below).

@item 
@geindex Python 향상 제안; PEP 3110
PEP 3110@footnote{https://peps.python.org/pep-3110/}: Catching exceptions.  You must now use
@code{except @var{SomeException} as @var{variable}} instead
of @code{except @var{SomeException}, @var{variable}}.  Moreover, the
`variable' is explicitly deleted when the @ref{1ab,,except} block
is left.

@item 
@geindex Python 향상 제안; PEP 3134
PEP 3134@footnote{https://peps.python.org/pep-3134/}: Exception chaining.  There are two cases: implicit
chaining and explicit chaining.  Implicit chaining happens when an
exception is raised in an @ref{1ab,,except} or @ref{1b0,,finally}
handler block.  This usually happens due to a bug in the handler
block; we call this a `secondary' exception.  In this case, the
original exception (that was being handled) is saved as the
@ref{14cc,,__context__} attribute of the secondary exception.
Explicit chaining is invoked with this syntax:

@example
raise SecondaryException() from primary_exception
@end example

(where `primary_exception' is any expression that produces an
exception object, probably an exception that was previously caught).
In this case, the primary exception is stored on the
@ref{14cd,,__cause__} attribute of the secondary exception.  The
traceback printed when an unhandled exception occurs walks the chain
of @code{__cause__} and @ref{14cc,,__context__} attributes and
prints a
separate traceback for each component of the chain, with the primary
exception at the top.  (Java users may recognize this behavior.)

@item 
@geindex Python 향상 제안; PEP 3134
PEP 3134@footnote{https://peps.python.org/pep-3134/}: Exception objects now store their traceback as the
@ref{14cb,,__traceback__} attribute.  This means that an exception
object now contains all the information pertaining to an exception,
and there are fewer reasons to use @ref{899,,sys.exc_info()} (though the
latter is not removed).

@item 
A few exception messages are improved when Windows fails to load an
extension module.  For example, @code{error code 193} is now @code{%1 is
not a valid Win32 application}.  Strings now deal with non-English
locales.
@end itemize

@node Miscellaneous Other Changes,Build and C API Changes<4>,Changes To Exceptions,What’s New In Python 3 0
@anchor{whatsnew/3 0 miscellaneous-other-changes}@anchor{14ce}
@subsection Miscellaneous Other Changes


@menu
* Operators And Special Methods:: 
* Builtins:: 

@end menu

@node Operators And Special Methods,Builtins,,Miscellaneous Other Changes
@anchor{whatsnew/3 0 operators-and-special-methods}@anchor{14cf}
@subsubsection Operators And Special Methods



@itemize *

@item 
@code{!=} now returns the opposite of @code{==}, unless @code{==} returns
@ref{1a2,,NotImplemented}.

@item 
The concept of “unbound methods” has been removed from the language.
When referencing a method as a class attribute, you now get a plain
function object.

@item 
@code{__getslice__()}, @code{__setslice__()} and @code{__delslice__()}
were killed.  The syntax @code{a[i:j]} now translates to
@code{a.__getitem__(slice(i, j))} (or @ref{14d0,,__setitem__()} or
@ref{14d1,,__delitem__()}, when used as an assignment or deletion target,
respectively).

@item 
@geindex Python 향상 제안; PEP 3114
PEP 3114@footnote{https://peps.python.org/pep-3114/}: the standard @ref{9d8,,next()} method has been renamed to
@ref{14d2,,__next__()}.

@item 
The @code{__oct__()} and @code{__hex__()} special methods are removed
– @ref{14d3,,oct()} and @ref{14d4,,hex()} use @ref{19e,,__index__()} now to convert
the argument to an integer.

@item 
Removed support for @code{__members__} and @code{__methods__}.

@item 
The function attributes named @code{func_X} have been renamed to
use the @code{__X__} form, freeing up these names in the function
attribute namespace for user-defined attributes.  To wit,
@code{func_closure}, @code{func_code}, @code{func_defaults},
@code{func_dict}, @code{func_doc}, @code{func_globals},
@code{func_name} were renamed to @ref{14d5,,__closure__},
@ref{59c,,__code__}, @ref{14d6,,__defaults__},
@ref{14d7,,__dict__}, @ref{13de,,__doc__},
@ref{14d8,,__globals__}, @ref{14d9,,__name__},
respectively.

@item 
@code{__nonzero__()} is now @ref{14da,,__bool__()}.
@end itemize

@node Builtins,,Operators And Special Methods,Miscellaneous Other Changes
@anchor{whatsnew/3 0 builtins}@anchor{14db}
@subsubsection Builtins



@itemize *

@item 
@geindex Python 향상 제안; PEP 3135
PEP 3135@footnote{https://peps.python.org/pep-3135/}: New @ref{1a6,,super()}.  You can now invoke @code{super()}
without arguments and (assuming this is in a regular instance method
defined inside a @ref{14dc,,class} statement) the right class and
instance will automatically be chosen.  With arguments, the behavior
of @code{super()} is unchanged.

@item 
@geindex Python 향상 제안; PEP 3111
PEP 3111@footnote{https://peps.python.org/pep-3111/}: @code{raw_input()} was renamed to @ref{14dd,,input()}.  That
is, the new @code{input()} function reads a line from
@ref{75e,,sys.stdin} and returns it with the trailing newline stripped.
It raises @ref{14de,,EOFError} if the input is terminated prematurely.
To get the old behavior of @code{input()}, use @code{eval(input())}.

@item 
A new built-in function @ref{9d8,,next()} was added to call the
@ref{14d2,,__next__()} method on an object.

@item 
The @ref{14df,,round()} function rounding strategy and return type have
changed.  Exact halfway cases are now rounded to the nearest even
result instead of away from zero.  (For example, @code{round(2.5)} now
returns @code{2} rather than @code{3}.)  @code{round(x[, n])} now
delegates to @code{x.__round__([n])} instead of always returning a
float.  It generally returns an integer when called with a single
argument and a value of the same type as @code{x} when called with two
arguments.

@item 
Moved @code{intern()} to @ref{14e0,,sys.intern()}.

@item 
Removed: @code{apply()}.  Instead of @code{apply(f, args)} use
@code{f(*args)}.

@item 
Removed @ref{13cb,,callable()}.  Instead of @code{callable(f)} you can use
@code{isinstance(f, collections.Callable)}.  The @code{operator.isCallable()}
function is also gone.

@item 
Removed @code{coerce()}.  This function no longer serves a purpose
now that classic classes are gone.

@item 
Removed @code{execfile()}.  Instead of @code{execfile(fn)} use
@code{exec(open(fn).read())}.

@item 
Removed the @code{file} type.  Use @ref{316,,open()}.  There are now several
different kinds of streams that open can return in the @ref{83,,io} module.

@item 
Removed @code{reduce()}.  Use @ref{21a,,functools.reduce()} if you really
need it; however, 99 percent of the time an explicit @ref{34a,,for}
loop is more readable.

@item 
Removed @code{reload()}.  Use @code{imp.reload()}.

@item 
Removed. @code{dict.has_key()} – use the @ref{34b,,in} operator
instead.
@end itemize

@c ======================================================================

@node Build and C API Changes<4>,Performance,Miscellaneous Other Changes,What’s New In Python 3 0
@anchor{whatsnew/3 0 build-and-c-api-changes}@anchor{14e1}
@subsection Build and C API Changes


Due to time constraints, here is a `very' incomplete list of changes
to the C API.


@itemize *

@item 
Support for several platforms was dropped, including but not limited
to Mac OS 9, BeOS, RISCOS, Irix, and Tru64.

@item 
@geindex Python 향상 제안; PEP 3118
PEP 3118@footnote{https://peps.python.org/pep-3118/}: New Buffer API.

@item 
@geindex Python 향상 제안; PEP 3121
PEP 3121@footnote{https://peps.python.org/pep-3121/}: Extension Module Initialization & Finalization.

@item 
@geindex Python 향상 제안; PEP 3123
PEP 3123@footnote{https://peps.python.org/pep-3123/}: Making @ref{14e2,,PyObject_HEAD} conform to standard C.

@item 
No more C API support for restricted execution.

@item 
@code{PyNumber_Coerce()}, @code{PyNumber_CoerceEx()},
@code{PyMember_Get()}, and @code{PyMember_Set()} C APIs are removed.

@item 
New C API @ref{3db,,PyImport_ImportModuleNoBlock()}, works like
@ref{3dc,,PyImport_ImportModule()} but won’t block on the import lock
(returning an error instead).

@item 
Renamed the boolean conversion C-level slot and method:
@code{nb_nonzero} is now @code{nb_bool}.

@item 
Removed @code{METH_OLDARGS} and @code{WITH_CYCLE_GC} from the C API.
@end itemize

@c ======================================================================

@node Performance,Porting To Python 3 0,Build and C API Changes<4>,What’s New In Python 3 0
@anchor{whatsnew/3 0 performance}@anchor{14e3}
@subsection Performance


The net result of the 3.0 generalizations is that Python 3.0 runs the
pystone benchmark around 10% slower than Python 2.5.  Most likely the
biggest cause is the removal of special-casing for small integers.
There’s room for improvement, but it will happen after 3.0 is
released!

@c ======================================================================

@node Porting To Python 3 0,,Performance,What’s New In Python 3 0
@anchor{whatsnew/3 0 porting-to-python-3-0}@anchor{14e4}
@subsection Porting To Python 3.0


For porting existing Python 2.5 or 2.6 source code to Python 3.0, the
best strategy is the following:


@enumerate 0

@item 
(Prerequisite:) Start with excellent test coverage.

@item 
Port to Python 2.6.  This should be no more work than the average
port from Python 2.x to Python 2.(x+1).  Make sure all your tests
pass.

@item 
(Still using 2.6:) Turn on the @code{-3} command line switch.
This enables warnings about features that will be removed (or
change) in 3.0.  Run your test suite again, and fix code that you
get warnings about until there are no warnings left, and all your
tests still pass.

@item 
Run the @code{2to3} source-to-source translator over your source code
tree.  Run the
result of the translation under Python 3.0.  Manually fix up any
remaining issues, fixing problems until all tests pass again.
@end enumerate

It is not recommended to try to write source code that runs unchanged
under both Python 2.6 and 3.0; you’d have to use a very contorted
coding style, e.g. avoiding @code{print} statements, metaclasses,
and much more.  If you are maintaining a library that needs to support
both Python 2.6 and Python 3.0, the best approach is to modify step 3
above by editing the 2.6 version of the source code and running the
@code{2to3} translator again, rather than editing the 3.0 version of the
source code.

For porting C extensions to Python 3.0, please see @ref{14e5,,확장 모듈을 파이썬 3에 이식하기}.

@c ======================================================================

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node What’s New in Python 2 7,What’s New in Python 2 6,What’s New In Python 3 0,파이썬의 새로운 기능
@anchor{whatsnew/2 7 doc}@anchor{14e6}@anchor{whatsnew/2 7 translation-repo}@anchor{14e7}@anchor{whatsnew/2 7 what-s-new-in-python-2-7}@anchor{14e8}
@section What’s New in Python 2.7


@*Author: 
A.M. Kuchling (amk at amk.ca)


@c hyperlink all the methods & functions.

@c T_STRING_INPLACE not described in main docs

@c $Id$
@c Rules for maintenance:
@c 
@c * Anyone can add text to this document.  Do not spend very much time
@c on the wording of your changes, because your text will probably
@c get rewritten to some degree.
@c 
@c * The maintainer will go through Misc/NEWS periodically and add
@c changes; it's therefore more important to add your changes to
@c Misc/NEWS than to this file.
@c 
@c * This is not a complete list of every single change; completeness
@c is the purpose of Misc/NEWS.  Some changes I consider too small
@c or esoteric to include.  If such a change is added to the text,
@c I'll just remove it.  (This is another reason you shouldn't spend
@c too much time on writing your addition.)
@c 
@c * If you want to draw your new text to the attention of the
@c maintainer, add 'XXX' to the beginning of the paragraph or
@c section.
@c 
@c * It's OK to just add a fragmentary note about a change.  For
@c example: "XXX Describe the transmogrify() function added to the
@c socket module."  The maintainer will research the change and
@c write the necessary text.
@c 
@c * You can comment out your additions if you like, but it's not
@c necessary (especially when a final release is some months away).
@c 
@c * Credit the author of a patch or bugfix.  Just the name is
@c sufficient; the e-mail address isn't necessary.
@c 
@c * It's helpful to add the bug/patch number in a parenthetical comment.
@c 
@c XXX Describe the transmogrify() function added to the socket
@c module.
@c (Contributed by P.Y. Developer; :issue:`12345`.)
@c 
@c This saves the maintainer some effort going through the SVN logs
@c when researching a change.

This article explains the new features in Python 2.7.  Python 2.7 was released
on July 3, 2010.

Numeric handling has been improved in many ways, for both
floating-point numbers and for the @ref{1fe,,Decimal} class.
There are some useful additions to the standard library, such as a
greatly enhanced @ref{10c,,unittest} module, the @ref{7,,argparse} module
for parsing command-line options, convenient @ref{7f2,,OrderedDict}
and @ref{1296,,Counter} classes in the @ref{1e,,collections} module,
and many other improvements.

Python 2.7 is planned to be the last of the 2.x releases, so we worked
on making it a good release for the long term.  To help with porting
to Python 3, several new features from the Python 3.x series have been
included in 2.7.

This article doesn’t attempt to provide a complete specification of
the new features, but instead provides a convenient overview.  For
full details, you should refer to the documentation for Python 2.7 at
@indicateurl{https://docs.python.org}. If you want to understand the rationale for
the design and implementation, refer to the PEP for a particular new
feature or the issue on @indicateurl{https://bugs.python.org} in which a change was
discussed.  Whenever possible, “What’s New in Python” links to the
bug/patch item for each change.

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

@end menu

@node The Future for Python 2 x,Changes to the Handling of Deprecation Warnings,,What’s New in Python 2 7
@anchor{whatsnew/2 7 the-future-for-python-2-x}@anchor{14e9}@anchor{whatsnew/2 7 whatsnew27-python31}@anchor{14ea}
@subsection The Future for Python 2.x


Python 2.7 is the last major release in the 2.x series, as the Python
maintainers have shifted the focus of their new feature development efforts
to the Python 3.x series. This means that while Python 2 continues to
receive bug fixes, and to be updated to build correctly on new hardware and
versions of supported operated systems, there will be no new full feature
releases for the language or standard library.

However, while there is a large common subset between Python 2.7 and Python
3, and many of the changes involved in migrating to that common subset, or
directly to Python 3, can be safely automated, some other changes (notably
those associated with Unicode handling) may require careful consideration,
and preferably robust automated regression test suites, to migrate
effectively.

This means that Python 2.7 will remain in place for a long time, providing a
stable and supported base platform for production systems that have not yet
been ported to Python 3. The full expected lifecycle of the Python 2.7
series is detailed in 
@geindex Python 향상 제안; PEP 373
PEP 373@footnote{https://peps.python.org/pep-0373/}.

Some key consequences of the long-term significance of 2.7 are:


@itemize *

@item 
As noted above, the 2.7 release has a much longer period of maintenance
when compared to earlier 2.x versions. Python 2.7 is currently expected to
remain supported by the core development team (receiving security updates
and other bug fixes) until at least 2020 (10 years after its initial
release, compared to the more typical support period of 18–24 months).

@item 
As the Python 2.7 standard library ages, making effective use of the
Python Package Index (either directly or via a redistributor) becomes
more important for Python 2 users. In addition to a wide variety of third
party packages for various tasks, the available packages include backports
of new modules and features from the Python 3 standard library that are
compatible with Python 2, as well as various tools and libraries that can
make it easier to migrate to Python 3. The Python Packaging User Guide@footnote{https://packaging.python.org} provides guidance on downloading and
installing software from the Python Package Index.

@item 
While the preferred approach to enhancing Python 2 is now the publication
of new packages on the Python Package Index, this approach doesn’t
necessarily work in all cases, especially those related to network
security. In exceptional cases that cannot be handled adequately by
publishing new or updated packages on PyPI, the Python Enhancement
Proposal process may be used to make the case for adding new features
directly to the Python 2 standard library. Any such additions, and the
maintenance releases where they were added, will be noted in the
@ref{14eb,,New Features Added to Python 2.7 Maintenance Releases} section below.
@end itemize

For projects wishing to migrate from Python 2 to Python 3, or for library
and framework developers wishing to support users on both Python 2 and
Python 3, there are a variety of tools and guides available to help decide
on a suitable approach and manage some of the technical details involved.
The recommended starting point is the pyporting-howto HOWTO guide.

@node Changes to the Handling of Deprecation Warnings,Python 3 1 Features,The Future for Python 2 x,What’s New in Python 2 7
@anchor{whatsnew/2 7 changes-to-the-handling-of-deprecation-warnings}@anchor{14ec}
@subsection Changes to the Handling of Deprecation Warnings


For Python 2.7, a policy decision was made to silence warnings only of
interest to developers by default.  @ref{1a3,,DeprecationWarning} and its
descendants are now ignored unless otherwise requested, preventing
users from seeing warnings triggered by an application.  This change
was also made in the branch that became Python 3.2. (Discussed
on stdlib-sig and carried out in bpo-7319@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7319}.)

In previous releases, @ref{1a3,,DeprecationWarning} messages were
enabled by default, providing Python developers with a clear
indication of where their code may break in a future major version
of Python.

However, there are increasingly many users of Python-based
applications who are not directly involved in the development of
those applications.  @ref{1a3,,DeprecationWarning} messages are
irrelevant to such users, making them worry about an application
that’s actually working correctly and burdening application developers
with responding to these concerns.

You can re-enable display of @ref{1a3,,DeprecationWarning} messages by
running Python with the @ref{ac5,,-Wdefault} (short form:
@code{-Wd}) switch, or by setting the 
@geindex PYTHONWARNINGS
@geindex 환경 변수; PYTHONWARNINGS
@ref{da2,,PYTHONWARNINGS}
environment variable to @code{"default"} (or @code{"d"}) before running
Python.  Python code can also re-enable them
by calling @code{warnings.simplefilter('default')}.

The @code{unittest} module also automatically reenables deprecation warnings
when running tests.

@node Python 3 1 Features,PEP 372 Adding an Ordered Dictionary to collections,Changes to the Handling of Deprecation Warnings,What’s New in Python 2 7
@anchor{whatsnew/2 7 python-3-1-features}@anchor{14ed}
@subsection Python 3.1 Features


Much as Python 2.6 incorporated features from Python 3.0,
version 2.7 incorporates some of the new features
in Python 3.1.  The 2.x series continues to provide tools
for migrating to the 3.x series.

A partial list of 3.1 features that were backported to 2.7:


@itemize *

@item 
The syntax for set literals (@code{@{1,2,3@}} is a mutable set).

@item 
Dictionary and set comprehensions (@code{@{i: i*2 for i in range(3)@}}).

@item 
Multiple context managers in a single @ref{186,,with} statement.

@item 
A new version of the @ref{83,,io} library, rewritten in C for performance.

@item 
The ordered-dictionary type described in @ref{14ee,,PEP 372; Adding an Ordered Dictionary to collections}.

@item 
The new @code{","} format specifier described in @ref{14ef,,PEP 378; Format Specifier for Thousands Separator}.

@item 
The @ref{165,,memoryview} object.

@item 
A small subset of the @ref{7b,,importlib} module,
@ref{14f0,,described below}.

@item 
The @ref{1c1,,repr()} of a float @code{x} is shorter in many cases: it’s now
based on the shortest decimal string that’s guaranteed to round back
to @code{x}.  As in previous versions of Python, it’s guaranteed that
@code{float(repr(x))} recovers @code{x}.

@item 
Float-to-string and string-to-float conversions are correctly rounded.
The @ref{14df,,round()} function is also now correctly rounded.

@item 
The @ref{1477,,PyCapsule} type, used to provide a C API for extension modules.

@item 
The @ref{146b,,PyLong_AsLongAndOverflow()} C API function.
@end itemize

Other new Python3-mode warnings include:


@itemize *

@item 
@code{operator.isCallable()} and @code{operator.sequenceIncludes()},
which are not supported in 3.x, now trigger warnings.

@item 
The @code{-3} switch now automatically
enables the @code{-Qwarn} switch that causes warnings
about using classic division with integers and long integers.
@end itemize

@c ========================================================================

@c Large, PEP-level features and changes should be described here.

@c ========================================================================

@node PEP 372 Adding an Ordered Dictionary to collections,PEP 378 Format Specifier for Thousands Separator<2>,Python 3 1 Features,What’s New in Python 2 7
@anchor{whatsnew/2 7 pep-0372}@anchor{14ee}@anchor{whatsnew/2 7 pep-372-adding-an-ordered-dictionary-to-collections}@anchor{14f1}
@subsection PEP 372: Adding an Ordered Dictionary to collections


Regular Python dictionaries iterate over key/value pairs in arbitrary order.
Over the years, a number of authors have written alternative implementations
that remember the order that the keys were originally inserted.  Based on
the experiences from those implementations, 2.7 introduces a new
@ref{7f2,,OrderedDict} class in the @ref{1e,,collections} module.

The @ref{7f2,,OrderedDict} API provides the same interface as regular
dictionaries but iterates over keys and values in a guaranteed order
depending on when a key was first inserted:

@example
>>> from collections import OrderedDict
>>> d = OrderedDict([('first', 1),
...                  ('second', 2),
...                  ('third', 3)])
>>> d.items()
[('first', 1), ('second', 2), ('third', 3)]
@end example

If a new entry overwrites an existing entry, the original insertion
position is left unchanged:

@example
>>> d['second'] = 4
>>> d.items()
[('first', 1), ('second', 4), ('third', 3)]
@end example

Deleting an entry and reinserting it will move it to the end:

@example
>>> del d['second']
>>> d['second'] = 5
>>> d.items()
[('first', 1), ('third', 3), ('second', 5)]
@end example

The @ref{14f2,,popitem()} method has an optional `last'
argument that defaults to @code{True}.  If `last' is true, the most recently
added key is returned and removed; if it’s false, the
oldest key is selected:

@example
>>> od = OrderedDict([(x,0) for x in range(20)])
>>> od.popitem()
(19, 0)
>>> od.popitem()
(18, 0)
>>> od.popitem(last=False)
(0, 0)
>>> od.popitem(last=False)
(1, 0)
@end example

Comparing two ordered dictionaries checks both the keys and values,
and requires that the insertion order was the same:

@example
>>> od1 = OrderedDict([('first', 1),
...                    ('second', 2),
...                    ('third', 3)])
>>> od2 = OrderedDict([('third', 3),
...                    ('first', 1),
...                    ('second', 2)])
>>> od1 == od2
False
>>> # Move 'third' key to the end
>>> del od2['third']; od2['third'] = 3
>>> od1 == od2
True
@end example

Comparing an @ref{7f2,,OrderedDict} with a regular dictionary
ignores the insertion order and just compares the keys and values.

How does the @ref{7f2,,OrderedDict} work?  It maintains a
doubly linked list of keys, appending new keys to the list as they’re inserted.
A secondary dictionary maps keys to their corresponding list node, so
deletion doesn’t have to traverse the entire linked list and therefore
remains `O'(1).

The standard library now supports use of ordered dictionaries in several
modules.


@itemize *

@item 
The @ref{26,,ConfigParser} module uses them by default, meaning that
configuration files can now be read, modified, and then written back
in their original order.

@item 
The @ref{bd3,,_asdict()} method for
@ref{4e0,,collections.namedtuple()} now returns an ordered dictionary with the
values appearing in the same order as the underlying tuple indices.

@item 
The @ref{86,,json} module’s @ref{f42,,JSONDecoder} class
constructor was extended with an `object_pairs_hook' parameter to
allow @code{OrderedDict} instances to be built by the decoder.
Support was also added for third-party tools like
PyYAML@footnote{https://pyyaml.org/}.
@end itemize


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 372

@item PEP 372@footnote{https://peps.python.org/pep-0372/} - Adding an ordered dictionary to collections

PEP written by Armin Ronacher and Raymond Hettinger;
implemented by Raymond Hettinger.
@end table


@node PEP 378 Format Specifier for Thousands Separator<2>,PEP 389 The argparse Module for Parsing Command Lines,PEP 372 Adding an Ordered Dictionary to collections,What’s New in Python 2 7
@anchor{whatsnew/2 7 pep-0378}@anchor{14ef}@anchor{whatsnew/2 7 pep-378-format-specifier-for-thousands-separator}@anchor{14f3}
@subsection PEP 378: Format Specifier for Thousands Separator


To make program output more readable, it can be useful to add
separators to large numbers, rendering them as
18,446,744,073,709,551,616 instead of 18446744073709551616.

The fully general solution for doing this is the @ref{8a,,locale} module,
which can use different separators (“,” in North America, “.” in
Europe) and different grouping sizes, but @code{locale} is complicated
to use and unsuitable for multi-threaded applications where different
threads are producing output for different locales.

Therefore, a simple comma-grouping mechanism has been added to the
mini-language used by the @ref{832,,str.format()} method.  When
formatting a floating-point number, simply include a comma between the
width and the precision:

@example
>>> '@{:20,.2f@}'.format(18446744073709551616.0)
'18,446,744,073,709,551,616.00'
@end example

When formatting an integer, include the comma after the width:

@example
>>> '@{:20,d@}'.format(18446744073709551616)
'18,446,744,073,709,551,616'
@end example

This mechanism is not adaptable at all; commas are always used as the
separator and the grouping is always into three-digit groups.  The
comma-formatting mechanism isn’t as general as the @ref{8a,,locale}
module, but it’s easier to use.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 378

@item PEP 378@footnote{https://peps.python.org/pep-0378/} - Format Specifier for Thousands Separator

PEP written by Raymond Hettinger; implemented by Eric Smith.
@end table


@node PEP 389 The argparse Module for Parsing Command Lines,PEP 391 Dictionary-Based Configuration For Logging,PEP 378 Format Specifier for Thousands Separator<2>,What’s New in Python 2 7
@anchor{whatsnew/2 7 pep-389-the-argparse-module-for-parsing-command-lines}@anchor{14f4}
@subsection PEP 389: The argparse Module for Parsing Command Lines


The @ref{7,,argparse} module for parsing command-line arguments was
added as a more powerful replacement for the
@ref{a4,,optparse} module.

This means Python now supports three different modules for parsing
command-line arguments: @ref{65,,getopt}, @ref{a4,,optparse}, and
@ref{7,,argparse}.  The @code{getopt} module closely resembles the C
library’s @code{getopt()} function, so it remains useful if you’re writing a
Python prototype that will eventually be rewritten in C.
@code{optparse} becomes redundant, but there are no plans to remove it
because there are many scripts still using it, and there’s no
automated way to update these scripts.  (Making the @code{argparse}
API consistent with @code{optparse}’s interface was discussed but
rejected as too messy and difficult.)

In short, if you’re writing a new script and don’t need to worry
about compatibility with earlier versions of Python, use
@ref{7,,argparse} instead of @ref{a4,,optparse}.

Here’s an example:

@example
import argparse

parser = argparse.ArgumentParser(description='Command-line example.')

# Add optional switches
parser.add_argument('-v', action='store_true', dest='is_verbose',
                    help='produce verbose output')
parser.add_argument('-o', action='store', dest='output',
                    metavar='FILE',
                    help='direct output to FILE instead of stdout')
parser.add_argument('-C', action='store', type=int, dest='context',
                    metavar='NUM', default=0,
                    help='display NUM lines of added context')

# Allow any number of additional arguments.
parser.add_argument(nargs='*', action='store', dest='inputs',
                    help='input filenames (default is stdin)')

args = parser.parse_args()
print args.__dict__
@end example

Unless you override it, @code{-h} and @code{--help} switches
are automatically added, and produce neatly formatted output:

@example
-> ./python.exe argparse-example.py --help
usage: argparse-example.py [-h] [-v] [-o FILE] [-C NUM] [inputs [inputs ...]]

Command-line example.

positional arguments:
  inputs      input filenames (default is stdin)

optional arguments:
  -h, --help  show this help message and exit
  -v          produce verbose output
  -o FILE     direct output to FILE instead of stdout
  -C NUM      display NUM lines of added context
@end example

As with @ref{a4,,optparse}, the command-line switches and arguments
are returned as an object with attributes named by the `dest' parameters:

@example
-> ./python.exe argparse-example.py -v
@{'output': None,
 'is_verbose': True,
 'context': 0,
 'inputs': []@}

-> ./python.exe argparse-example.py -v -o /tmp/output -C 4 file1 file2
@{'output': '/tmp/output',
 'is_verbose': True,
 'context': 4,
 'inputs': ['file1', 'file2']@}
@end example

@ref{7,,argparse} has much fancier validation than @ref{a4,,optparse}; you
can specify an exact number of arguments as an integer, 0 or more
arguments by passing @code{'*'}, 1 or more by passing @code{'+'}, or an
optional argument with @code{'?'}.  A top-level parser can contain
sub-parsers to define subcommands that have different sets of
switches, as in @code{svn commit}, @code{svn checkout}, etc.  You can
specify an argument’s type as @ref{30c,,FileType}, which will
automatically open files for you and understands that @code{'-'} means
standard input or output.


@subsubheading 더 보기



@table @asis

@item @ref{7,,argparse} documentation

The documentation page of the argparse module.

@item @ref{13b3,,Migrating optparse code to argparse}

Part of the Python documentation, describing how to convert
code that uses @ref{a4,,optparse}.

@geindex Python 향상 제안; PEP 389

@item PEP 389@footnote{https://peps.python.org/pep-0389/} - argparse - New Command Line Parsing Module

PEP written and implemented by Steven Bethard.
@end table


@node PEP 391 Dictionary-Based Configuration For Logging,PEP 3106 Dictionary Views,PEP 389 The argparse Module for Parsing Command Lines,What’s New in Python 2 7
@anchor{whatsnew/2 7 pep-391-dictionary-based-configuration-for-logging}@anchor{14f5}
@subsection PEP 391: Dictionary-Based Configuration For Logging


The @ref{8b,,logging} module is very flexible; applications can define
a tree of logging subsystems, and each logger in this tree can filter
out certain messages, format them differently, and direct messages to
a varying number of handlers.

All this flexibility can require a lot of configuration.  You can
write Python statements to create objects and set their properties,
but a complex set-up requires verbose but boring code.
@ref{8b,,logging} also supports a @ref{d47,,fileConfig()}
function that parses a file, but the file format doesn’t support
configuring filters, and it’s messier to generate programmatically.

Python 2.7 adds a @ref{13b5,,dictConfig()} function that
uses a dictionary to configure logging.  There are many ways to
produce a dictionary from different sources: construct one with code;
parse a file containing JSON; or use a YAML parsing library if one is
installed.  For more information see @ref{14f6,,구성 함수}.

The following example configures two loggers, the root logger and a
logger named “network”.  Messages sent to the root logger will be
sent to the system log using the syslog protocol, and messages
to the “network” logger will be written to a @code{network.log} file
that will be rotated once the log reaches 1MB.

@example
import logging
import logging.config

configdict = @{
 'version': 1,    # Configuration schema in use; must be 1 for now
 'formatters': @{
     'standard': @{
         'format': ('%(asctime)s %(name)-15s '
                    '%(levelname)-8s %(message)s')@}@},

 'handlers': @{'netlog': @{'backupCount': 10,
                     'class': 'logging.handlers.RotatingFileHandler',
                     'filename': '/logs/network.log',
                     'formatter': 'standard',
                     'level': 'INFO',
                     'maxBytes': 1000000@},
              'syslog': @{'class': 'logging.handlers.SysLogHandler',
                         'formatter': 'standard',
                         'level': 'ERROR'@}@},

 # Specify all the subordinate loggers
 'loggers': @{
             'network': @{
                         'handlers': ['netlog']
             @}
 @},
 # Specify properties of the root logger
 'root': @{
          'handlers': ['syslog']
 @},
@}

# Set up configuration
logging.config.dictConfig(configdict)

# As an example, log two error messages
logger = logging.getLogger('/')
logger.error('Database not found')

netlogger = logging.getLogger('network')
netlogger.error('Connection failed')
@end example

Three smaller enhancements to the @ref{8b,,logging} module, all
implemented by Vinay Sajip, are:

@c rev79293


@itemize *

@item 
The @ref{86b,,SysLogHandler} class now supports
syslogging over TCP.  The constructor has a `socktype' parameter
giving the type of socket to use, either @ref{14f7,,socket.SOCK_DGRAM}
for UDP or @ref{14f8,,socket.SOCK_STREAM} for TCP.  The default
protocol remains UDP.

@item 
@ref{d45,,Logger} instances gained a @ref{14f9,,getChild()}
method that retrieves a descendant logger using a relative path.
For example, once you retrieve a logger by doing @code{log = getLogger('app')},
calling @code{log.getChild('network.listen')} is equivalent to
@code{getLogger('app.network.listen')}.

@item 
The @ref{14fa,,LoggerAdapter} class gained an
@ref{14fb,,isEnabledFor()} method that takes a
`level' and returns whether the underlying logger would
process a message of that level of importance.
@end itemize

@c XXX: Logger objects don't have a class declaration so the link don't work


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 391

@item PEP 391@footnote{https://peps.python.org/pep-0391/} - Dictionary-Based Configuration For Logging

PEP written and implemented by Vinay Sajip.
@end table


@node PEP 3106 Dictionary Views,PEP 3137 The memoryview Object,PEP 391 Dictionary-Based Configuration For Logging,What’s New in Python 2 7
@anchor{whatsnew/2 7 pep-3106-dictionary-views}@anchor{14fc}
@subsection PEP 3106: Dictionary Views


The dictionary methods @ref{9d0,,keys()}, @ref{9d1,,values()}, and
@ref{9d2,,items()} are different in Python 3.x.  They return an object
called a `view' instead of a fully materialized list.

It’s not possible to change the return values of @ref{9d0,,keys()},
@ref{9d1,,values()}, and @ref{9d2,,items()} in Python 2.7 because
too much code would break.  Instead the 3.x versions were added
under the new names @code{viewkeys()}, @code{viewvalues()},
and @code{viewitems()}.

@example
>>> d = dict((i*10, chr(65+i)) for i in range(26))
>>> d
@{0: 'A', 130: 'N', 10: 'B', 140: 'O', 20: ..., 250: 'Z'@}
>>> d.viewkeys()
dict_keys([0, 130, 10, 140, 20, 150, 30, ..., 250])
@end example

Views can be iterated over, but the key and item views also behave
like sets.  The @code{&} operator performs intersection, and @code{|}
performs a union:

@example
>>> d1 = dict((i*10, chr(65+i)) for i in range(26))
>>> d2 = dict((i**.5, i) for i in range(1000))
>>> d1.viewkeys() & d2.viewkeys()
set([0.0, 10.0, 20.0, 30.0])
>>> d1.viewkeys() | range(0, 30)
set([0, 1, 130, 3, 4, 5, 6, ..., 120, 250])
@end example

The view keeps track of the dictionary and its contents change as the
dictionary is modified:

@example
>>> vk = d.viewkeys()
>>> vk
dict_keys([0, 130, 10, ..., 250])
>>> d[260] = '&'
>>> vk
dict_keys([0, 130, 260, 10, ..., 250])
@end example

However, note that you can’t add or remove keys while you’re iterating
over the view:

@example
>>> for k in vk:
...     d[k*2] = k
...
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
RuntimeError: dictionary changed size during iteration
@end example

You can use the view methods in Python 2.x code, and the 2to3
converter will change them to the standard @ref{9d0,,keys()},
@ref{9d1,,values()}, and @ref{9d2,,items()} methods.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 3106

@item PEP 3106@footnote{https://peps.python.org/pep-3106/} - Revamping dict.keys(), .values() and .items()

PEP written by Guido van Rossum.
Backported to 2.7 by Alexandre Vassalotti; bpo-1967@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1967}.
@end table


@node PEP 3137 The memoryview Object,Other Language Changes<8>,PEP 3106 Dictionary Views,What’s New in Python 2 7
@anchor{whatsnew/2 7 pep-3137-the-memoryview-object}@anchor{14fd}
@subsection PEP 3137: The memoryview Object


The @ref{165,,memoryview} object provides a view of another object’s
memory content that matches the @ref{192,,bytes} type’s interface.

@example
>>> import string
>>> m = memoryview(string.letters)
>>> m
<memory at 0x37f850>
>>> len(m)           # Returns length of underlying object
52
>>> m[0], m[25], m[26]   # Indexing returns one byte
('a', 'z', 'A')
>>> m2 = m[0:26]         # Slicing returns another memoryview
>>> m2
<memory at 0x37f080>
@end example

The content of the view can be converted to a string of bytes or
a list of integers:

@example
>>> m2.tobytes()
'abcdefghijklmnopqrstuvwxyz'
>>> m2.tolist()
[97, 98, 99, 100, 101, 102, 103, ... 121, 122]
>>>
@end example

@ref{165,,memoryview} objects allow modifying the underlying object if
it’s a mutable object.

@example
>>> m2[0] = 75
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: cannot modify read-only memory
>>> b = bytearray(string.letters)  # Creating a mutable object
>>> b
bytearray(b'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ')
>>> mb = memoryview(b)
>>> mb[0] = '*'         # Assign to view, changing the bytearray.
>>> b[0:5]              # The bytearray has been changed.
bytearray(b'*bcde')
>>>
@end example


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 3137

@item PEP 3137@footnote{https://peps.python.org/pep-3137/} - Immutable Bytes and Mutable Buffer

PEP written by Guido van Rossum.
Implemented by Travis Oliphant, Antoine Pitrou and others.
Backported to 2.7 by Antoine Pitrou; bpo-2396@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2396}.
@end table


@node Other Language Changes<8>,New and Improved Modules,PEP 3137 The memoryview Object,What’s New in Python 2 7
@anchor{whatsnew/2 7 other-language-changes}@anchor{14fe}
@subsection Other Language Changes


Some smaller changes made to the core Python language are:


@itemize *

@item 
The syntax for set literals has been backported from Python 3.x.
Curly brackets are used to surround the contents of the resulting
mutable set; set literals are
distinguished from dictionaries by not containing colons and values.
@code{@{@}} continues to represent an empty dictionary; use
@code{set()} for an empty set.

@example
>>> @{1, 2, 3, 4, 5@}
set([1, 2, 3, 4, 5])
>>> set() # empty set
set([])
>>> @{@}    # empty dict
@{@}
@end example

Backported by Alexandre Vassalotti; bpo-2335@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2335}.

@item 
Dictionary and set comprehensions are another feature backported from
3.x, generalizing list/generator comprehensions to use
the literal syntax for sets and dictionaries.

@example
>>> @{x: x*x for x in range(6)@}
@{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25@}
>>> @{('a'*x) for x in range(6)@}
set(['@w{'}, 'a', 'aa', 'aaa', 'aaaa', 'aaaaa'])
@end example

Backported by Alexandre Vassalotti; bpo-2333@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2333}.

@item 
The @ref{186,,with} statement can now use multiple context managers
in one statement.  Context managers are processed from left to right
and each one is treated as beginning a new @code{with} statement.
This means that:

@example
with A() as a, B() as b:
    ... suite of statements ...
@end example

is equivalent to:

@example
with A() as a:
    with B() as b:
        ... suite of statements ...
@end example

The @code{contextlib.nested()} function provides a very similar
function, so it’s no longer necessary and has been deprecated.

(Proposed in @indicateurl{https://codereview.appspot.com/53094}; implemented by
Georg Brandl.)

@item 
Conversions between floating-point numbers and strings are
now correctly rounded on most platforms.  These conversions occur
in many different places: @ref{169,,str()} on
floats and complex numbers; the @ref{196,,float} and @ref{197,,complex}
constructors;
numeric formatting; serializing and
deserializing floats and complex numbers using the
@ref{91,,marshal}, @ref{ab,,pickle}
and @ref{86,,json} modules;
parsing of float and imaginary literals in Python code;
and @ref{1fe,,Decimal}-to-float conversion.

Related to this, the @ref{1c1,,repr()} of a floating-point number `x'
now returns a result based on the shortest decimal string that’s
guaranteed to round back to `x' under correct rounding (with
round-half-to-even rounding mode).  Previously it gave a string
based on rounding x to 17 decimal digits.

@c maybe add an example?

The rounding library responsible for this improvement works on
Windows and on Unix platforms using the gcc, icc, or suncc
compilers.  There may be a small number of platforms where correct
operation of this code cannot be guaranteed, so the code is not
used on such systems.  You can find out which code is being used
by checking @ref{14ff,,sys.float_repr_style},  which will be @code{short}
if the new code is in use and @code{legacy} if it isn’t.

Implemented by Eric Smith and Mark Dickinson, using David Gay’s
@code{dtoa.c} library; bpo-7117@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7117}.

@item 
Conversions from long integers and regular integers to floating
point now round differently, returning the floating-point number
closest to the number.  This doesn’t matter for small integers that
can be converted exactly, but for large numbers that will
unavoidably lose precision, Python 2.7 now approximates more
closely.  For example, Python 2.6 computed the following:

@example
>>> n = 295147905179352891391
>>> float(n)
2.9514790517935283e+20
>>> n - long(float(n))
65535L
@end example

Python 2.7’s floating-point result is larger, but much closer to the
true value:

@example
>>> n = 295147905179352891391
>>> float(n)
2.9514790517935289e+20
>>> n - long(float(n))
-1L
@end example

(Implemented by Mark Dickinson; bpo-3166@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=3166}.)

Integer division is also more accurate in its rounding behaviours.  (Also
implemented by Mark Dickinson; bpo-1811@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1811}.)

@item 
Implicit coercion for complex numbers has been removed; the interpreter
will no longer ever attempt to call a @code{__coerce__()} method on complex
objects.  (Removed by Meador Inge and Mark Dickinson; bpo-5211@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5211}.)

@item 
The @ref{832,,str.format()} method now supports automatic numbering of the replacement
fields.  This makes using @code{str.format()} more closely resemble using
@code{%s} formatting:

@example
>>> '@{@}:@{@}:@{@}'.format(2009, 04, 'Sunday')
'2009:4:Sunday'
>>> '@{@}:@{@}:@{day@}'.format(2009, 4, day='Sunday')
'2009:4:Sunday'
@end example

The auto-numbering takes the fields from left to right, so the first @code{@{...@}}
specifier will use the first argument to @ref{832,,str.format()}, the next
specifier will use the next argument, and so on.  You can’t mix auto-numbering
and explicit numbering – either number all of your specifier fields or none
of them – but you can mix auto-numbering and named fields, as in the second
example above.  (Contributed by Eric Smith; bpo-5237@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5237}.)

Complex numbers now correctly support usage with @ref{199,,format()},
and default to being right-aligned.
Specifying a precision or comma-separation applies to both the real
and imaginary parts of the number, but a specified field width and
alignment is applied to the whole of the resulting @code{1.5+3j}
output.  (Contributed by Eric Smith; bpo-1588@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1588} and bpo-7988@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7988}.)

The ‘F’ format code now always formats its output using uppercase characters,
so it will now produce ‘INF’ and ‘NAN’.
(Contributed by Eric Smith; bpo-3382@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=3382}.)

A low-level change: the @ref{830,,object.__format__()} method now triggers
a @ref{ac6,,PendingDeprecationWarning} if it’s passed a format string,
because the @code{__format__()} method for @ref{c7d,,object} converts
the object to a string representation and formats that.  Previously
the method silently applied the format string to the string
representation, but that could hide mistakes in Python code.  If
you’re supplying formatting information such as an alignment or
precision, presumably you’re expecting the formatting to be applied
in some object-specific way.  (Fixed by Eric Smith; bpo-7994@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7994}.)

@item 
The @ref{19b,,int()} and @code{long()} types gained a @code{bit_length}
method that returns the number of bits necessary to represent
its argument in binary:

@example
>>> n = 37
>>> bin(n)
'0b100101'
>>> n.bit_length()
6
>>> n = 2**123-1
>>> n.bit_length()
123
>>> (n+1).bit_length()
124
@end example

(Contributed by Fredrik Johansson and Victor Stinner; bpo-3439@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=3439}.)

@item 
The @ref{7f7,,import} statement will no longer try an absolute import
if a relative import (e.g. @code{from .os import sep}) fails.  This
fixes a bug, but could possibly break certain @code{import}
statements that were only working by accident.  (Fixed by Meador Inge;
bpo-7902@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7902}.)

@item 
It’s now possible for a subclass of the built-in @code{unicode} type
to override the @code{__unicode__()} method.  (Implemented by
Victor Stinner; bpo-1583863@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1583863}.)

@item 
The @ref{344,,bytearray} type’s @ref{1500,,translate()} method now accepts
@code{None} as its first argument.  (Fixed by Georg Brandl;
bpo-4759@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4759}.)

@c XXX bytearray doesn't seem to be documented

@item 
When using @ref{48f,,@@classmethod} and
@ref{453,,@@staticmethod} to wrap
methods as class or static methods, the wrapper object now
exposes the wrapped function as their @ref{1501,,__func__}
attribute.
(Contributed by Amaury Forgeot d’Arc, after a suggestion by
George Sakkis; bpo-5982@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5982}.)

@item 
When a restricted set of attributes were set using @code{__slots__},
deleting an unset attribute would not raise @ref{5ee,,AttributeError}
as you would expect.  Fixed by Benjamin Peterson; bpo-7604@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7604}.)

@item 
Two new encodings are now supported: “cp720”, used primarily for
Arabic text; and “cp858”, a variant of CP 850 that adds the euro
symbol.  (CP720 contributed by Alexander Belchenko and Amaury
Forgeot d’Arc in bpo-1616979@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1616979}; CP858 contributed by Tim Hatch in
bpo-8016@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8016}.)

@item 
The @code{file} object will now set the @code{filename} attribute
on the @ref{1252,,IOError} exception when trying to open a directory
on POSIX platforms (noted by Jan Kaliszewski; bpo-4764@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4764}), and
now explicitly checks for and forbids writing to read-only file objects
instead of trusting the C library to catch and report the error
(fixed by Stefan Krah; bpo-5677@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5677}).

@item 
The Python tokenizer now translates line endings itself, so the
@ref{4b2,,compile()} built-in function now accepts code using any
line-ending convention.  Additionally, it no longer requires that the
code end in a newline.

@item 
Extra parentheses in function definitions are illegal in Python 3.x,
meaning that you get a syntax error from @code{def f((x)): pass}.  In
Python3-warning mode, Python 2.7 will now warn about this odd usage.
(Noted by James Lingard; bpo-7362@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7362}.)

@item 
It’s now possible to create weak references to old-style class
objects.  New-style classes were always weak-referenceable.  (Fixed
by Antoine Pitrou; bpo-8268@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8268}.)

@item 
When a module object is garbage-collected, the module’s dictionary is
now only cleared if no one else is holding a reference to the
dictionary (bpo-7140@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7140}).
@end itemize

@c ======================================================================

@menu
* Interpreter Changes:: 
* Optimizations: Optimizations<8>. 

@end menu

@node Interpreter Changes,Optimizations<8>,,Other Language Changes<8>
@anchor{whatsnew/2 7 interpreter-changes}@anchor{1502}@anchor{whatsnew/2 7 new-27-interpreter}@anchor{1503}
@subsubsection Interpreter Changes


A new environment variable, 
@geindex PYTHONWARNINGS
@geindex 환경 변수; PYTHONWARNINGS
@ref{da2,,PYTHONWARNINGS},
allows controlling warnings.  It should be set to a string
containing warning settings, equivalent to those
used with the @ref{ac5,,-W} switch, separated by commas.
(Contributed by Brian Curtin; bpo-7301@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7301}.)

For example, the following setting will print warnings every time
they occur, but turn warnings from the @ref{75,,Cookie} module into an
error.  (The exact syntax for setting an environment variable varies
across operating systems and shells.)

@example
export PYTHONWARNINGS=all,error:::Cookie:0
@end example

@c ======================================================================

@node Optimizations<8>,,Interpreter Changes,Other Language Changes<8>
@anchor{whatsnew/2 7 optimizations}@anchor{1504}
@subsubsection Optimizations


Several performance enhancements have been added:


@itemize *

@item 
A new opcode was added to perform the initial setup for
@ref{186,,with} statements, looking up the @ref{7e3,,__enter__()} and
@ref{1505,,__exit__()} methods.  (Contributed by Benjamin Peterson.)

@item 
The garbage collector now performs better for one common usage
pattern: when many objects are being allocated without deallocating
any of them.  This would previously take quadratic
time for garbage collection, but now the number of full garbage collections
is reduced as the number of objects on the heap grows.
The new logic only performs a full garbage collection pass when
the middle generation has been collected 10 times and when the
number of survivor objects from the middle generation exceeds 10% of
the number of objects in the oldest generation.  (Suggested by Martin
von Löwis and implemented by Antoine Pitrou; bpo-4074@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4074}.)

@item 
The garbage collector tries to avoid tracking simple containers
which can’t be part of a cycle. In Python 2.7, this is now true for
tuples and dicts containing atomic types (such as ints, strings,
etc.). Transitively, a dict containing tuples of atomic types won’t
be tracked either. This helps reduce the cost of each
garbage collection by decreasing the number of objects to be
considered and traversed by the collector.
(Contributed by Antoine Pitrou; bpo-4688@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4688}.)

@item 
Long integers are now stored internally either in base @code{2**15} or in base
@code{2**30}, the base being determined at build time.  Previously, they
were always stored in base @code{2**15}.  Using base @code{2**30} gives
significant performance improvements on 64-bit machines, but
benchmark results on 32-bit machines have been mixed.  Therefore,
the default is to use base @code{2**30} on 64-bit machines and base @code{2**15}
on 32-bit machines; on Unix, there’s a new configure option
@code{--enable-big-digits} that can be used to override this default.

Apart from the performance improvements this change should be
invisible to end users, with one exception: for testing and
debugging purposes there’s a new structseq @code{sys.long_info} that
provides information about the internal format, giving the number of
bits per digit and the size in bytes of the C type used to store
each digit:

@example
>>> import sys
>>> sys.long_info
sys.long_info(bits_per_digit=30, sizeof_digit=4)
@end example

(Contributed by Mark Dickinson; bpo-4258@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4258}.)

Another set of changes made long objects a few bytes smaller: 2 bytes
smaller on 32-bit systems and 6 bytes on 64-bit.
(Contributed by Mark Dickinson; bpo-5260@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5260}.)

@item 
The division algorithm for long integers has been made faster
by tightening the inner loop, doing shifts instead of multiplications,
and fixing an unnecessary extra iteration.
Various benchmarks show speedups of between 50% and 150% for long
integer divisions and modulo operations.
(Contributed by Mark Dickinson; bpo-5512@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5512}.)
Bitwise operations are also significantly faster (initial patch by
Gregory Smith; bpo-1087418@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1087418}).

@item 
The implementation of @code{%} checks for the left-side operand being
a Python string and special-cases it; this results in a 1–3%
performance increase for applications that frequently use @code{%}
with strings, such as templating libraries.
(Implemented by Collin Winter; bpo-5176@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5176}.)

@item 
List comprehensions with an @code{if} condition are compiled into
faster bytecode.  (Patch by Antoine Pitrou, back-ported to 2.7
by Jeffrey Yasskin; bpo-4715@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4715}.)

@item 
Converting an integer or long integer to a decimal string was made
faster by special-casing base 10 instead of using a generalized
conversion function that supports arbitrary bases.
(Patch by Gawain Bolton; bpo-6713@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6713}.)

@item 
The @code{split()}, @code{replace()}, @code{rindex()},
@code{rpartition()}, and @code{rsplit()} methods of string-like types
(strings, Unicode strings, and @ref{344,,bytearray} objects) now use a
fast reverse-search algorithm instead of a character-by-character
scan.  This is sometimes faster by a factor of 10.  (Added by
Florent Xicluna; bpo-7462@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7462} and bpo-7622@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7622}.)

@item 
The @ref{ab,,pickle} and @code{cPickle} modules now automatically
intern the strings used for attribute names, reducing memory usage
of the objects resulting from unpickling.  (Contributed by Jake
McGuire; bpo-5084@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5084}.)

@item 
The @code{cPickle} module now special-cases dictionaries,
nearly halving the time required to pickle them.
(Contributed by Collin Winter; bpo-5670@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5670}.)
@end itemize

@c ======================================================================

@node New and Improved Modules,Build and C API Changes<5>,Other Language Changes<8>,What’s New in Python 2 7
@anchor{whatsnew/2 7 new-and-improved-modules}@anchor{1506}
@subsection New and Improved Modules


As in every release, Python’s standard library received a number of
enhancements and bug fixes.  Here’s a partial list of the most notable
changes, sorted alphabetically by module name. Consult the
@code{Misc/NEWS} file in the source tree for a more complete list of
changes, or look through the Subversion logs for all the details.


@itemize *

@item 
The @ref{10,,bdb} module’s base debugging class @ref{2d5,,Bdb}
gained a feature for skipping modules.  The constructor
now takes an iterable containing glob-style patterns such as
@code{django.*}; the debugger will not step into stack frames
from a module that matches one of these patterns.
(Contributed by Maru Newby after a suggestion by
Senthil Kumaran; bpo-5142@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5142}.)

@item 
The @ref{11,,binascii} module now supports the buffer API, so it can be
used with @ref{165,,memoryview} instances and other similar buffer objects.
(Backported from 3.x by Florent Xicluna; bpo-7703@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7703}.)

@item 
Updated module: the @code{bsddb} module has been updated from 4.7.2devel9
to version 4.8.4 of
the pybsddb package@footnote{https://www.jcea.es/programacion/pybsddb.htm}.
The new version features better Python 3.x compatibility, various bug fixes,
and adds several new BerkeleyDB flags and methods.
(Updated by Jesús Cea Avión; bpo-8156@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8156}.  The pybsddb
changelog can be read at @indicateurl{https://hg.jcea.es/pybsddb/file/tip/ChangeLog}.)

@item 
The @ref{14,,bz2} module’s @ref{a66,,BZ2File} now supports the context
management protocol, so you can write @code{with bz2.BZ2File(...) as f:}.
(Contributed by Hagen Fürstenau; bpo-3860@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=3860}.)

@item 
New class: the @ref{1296,,Counter} class in the @ref{1e,,collections}
module is useful for tallying data.  @code{Counter} instances
behave mostly like dictionaries but return zero for missing keys instead of
raising a @ref{5e5,,KeyError}:

@example
>>> from collections import Counter
>>> c = Counter()
>>> for letter in 'here is a sample of english text':
...   c[letter] += 1
...
>>> c
Counter(@{' ': 6, 'e': 5, 's': 3, 'a': 2, 'i': 2, 'h': 2,
'l': 2, 't': 2, 'g': 1, 'f': 1, 'm': 1, 'o': 1, 'n': 1,
'p': 1, 'r': 1, 'x': 1@})
>>> c['e']
5
>>> c['z']
0
@end example

There are three additional @ref{1296,,Counter} methods.
@ref{1507,,most_common()} returns the N most common
elements and their counts.  @ref{1508,,elements()}
returns an iterator over the contained elements, repeating each
element as many times as its count.
@ref{13e3,,subtract()} takes an iterable and
subtracts one for each element instead of adding; if the argument is
a dictionary or another @code{Counter}, the counts are
subtracted.

@example
>>> c.most_common(5)
[(' ', 6), ('e', 5), ('s', 3), ('a', 2), ('i', 2)]
>>> c.elements() ->
   'a', 'a', ' ', ' ', ' ', ' ', ' ', ' ',
   'e', 'e', 'e', 'e', 'e', 'g', 'f', 'i', 'i',
   'h', 'h', 'm', 'l', 'l', 'o', 'n', 'p', 's',
   's', 's', 'r', 't', 't', 'x'
>>> c['e']
5
>>> c.subtract('very heavy on the letter e')
>>> c['e']    # Count is now lower
-1
@end example

Contributed by Raymond Hettinger; bpo-1696199@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1696199}.

@c revision 79660

New class: @ref{7f2,,OrderedDict} is described in the earlier
section @ref{14ee,,PEP 372; Adding an Ordered Dictionary to collections}.

New method: The @ref{7f3,,deque} data type now has a
@ref{13e5,,count()} method that returns the number of
contained elements equal to the supplied argument `x', and a
@ref{13e6,,reverse()} method that reverses the elements
of the deque in-place.  @code{deque} also exposes its maximum
length as the read-only @ref{1509,,maxlen} attribute.
(Both features added by Raymond Hettinger.)

The @ref{4e0,,namedtuple} class now has an optional `rename' parameter.
If `rename' is true, field names that are invalid because they’ve
been repeated or aren’t legal Python identifiers will be
renamed to legal names that are derived from the field’s
position within the list of fields:

@example
>>> from collections import namedtuple
>>> T = namedtuple('T', ['field1', '$illegal', 'for', 'field2'], rename=True)
>>> T._fields
('field1', '_1', '_2', 'field2')
@end example

(Added by Raymond Hettinger; bpo-1818@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1818}.)

Finally, the @ref{ac7,,Mapping} abstract base class now
returns @ref{1a2,,NotImplemented} if a mapping is compared to
another type that isn’t a @code{Mapping}.
(Fixed by Daniel Stutzbach; bpo-8729@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8729}.)

@item 
Constructors for the parsing classes in the @ref{26,,ConfigParser} module now
take an `allow_no_value' parameter, defaulting to false; if true,
options without values will be allowed.  For example:

@example
>>> import ConfigParser, StringIO
>>> sample_config = """
... [mysqld]
... user = mysql
... pid-file = /var/run/mysqld/mysqld.pid
... skip-bdb
... """
>>> config = ConfigParser.RawConfigParser(allow_no_value=True)
>>> config.readfp(StringIO.StringIO(sample_config))
>>> config.get('mysqld', 'user')
'mysql'
>>> print config.get('mysqld', 'skip-bdb')
None
>>> print config.get('mysqld', 'unknown')
Traceback (most recent call last):
  ...
NoOptionError: No option 'unknown' in section: 'mysqld'
@end example

(Contributed by Mats Kindahl; bpo-7005@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7005}.)

@item 
Deprecated function: @code{contextlib.nested()}, which allows
handling more than one context manager with a single @ref{186,,with}
statement, has been deprecated, because the @code{with} statement
now supports multiple context managers.

@item 
The @ref{74,,cookielib} module now ignores cookies that have an invalid
version field, one that doesn’t contain an integer value.  (Fixed by
John J. Lee; bpo-3924@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=3924}.)

@item 
The @ref{29,,copy} module’s @ref{d64,,deepcopy()} function will now
correctly copy bound instance methods.  (Implemented by
Robert Collins; bpo-1515@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1515}.)

@item 
The @ref{2e,,ctypes} module now always converts @code{None} to a C @code{NULL}
pointer for arguments declared as pointers.  (Changed by Thomas
Heller; bpo-4606@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4606}.)  The underlying libffi library@footnote{https://sourceware.org/libffi/} has been updated to version
3.0.9, containing various fixes for different platforms.  (Updated
by Matthias Klose; bpo-8142@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8142}.)

@item 
New method: the @ref{34,,datetime} module’s @ref{bc2,,timedelta} class
gained a @ref{150a,,total_seconds()} method that returns the
number of seconds in the duration.  (Contributed by Brian Quinlan; bpo-5788@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5788}.)

@item 
New method: the @ref{1fe,,Decimal} class gained a
@ref{1409,,from_float()} class method that performs an exact
conversion of a floating-point number to a @code{Decimal}.
This exact conversion strives for the
closest decimal approximation to the floating-point representation’s value;
the resulting decimal value will therefore still include the inaccuracy,
if any.
For example, @code{Decimal.from_float(0.1)} returns
@code{Decimal('0.1000000000000000055511151231257827021181583404541015625')}.
(Implemented by Raymond Hettinger; bpo-4796@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4796}.)

Comparing instances of @ref{1fe,,Decimal} with floating-point
numbers now produces sensible results based on the numeric values
of the operands.  Previously such comparisons would fall back to
Python’s default rules for comparing objects, which produced arbitrary
results based on their type.  Note that you still cannot combine
@code{Decimal} and floating point in other operations such as addition,
since you should be explicitly choosing how to convert between float and
@code{Decimal}.  (Fixed by Mark Dickinson; bpo-2531@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2531}.)

The constructor for @ref{1fe,,Decimal} now accepts
floating-point numbers (added by Raymond Hettinger; bpo-8257@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8257})
and non-European Unicode characters such as Arabic-Indic digits
(contributed by Mark Dickinson; bpo-6595@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6595}).

Most of the methods of the @ref{12b4,,Context} class now accept integers
as well as @ref{1fe,,Decimal} instances; the only exceptions are the
@ref{150b,,canonical()} and @ref{150c,,is_canonical()}
methods.  (Patch by Juan José Conti; bpo-7633@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7633}.)

When using @ref{1fe,,Decimal} instances with a string’s
@ref{832,,format()} method, the default alignment was previously
left-alignment.  This has been changed to right-alignment, which is
more sensible for numeric types.  (Changed by Mark Dickinson; bpo-6857@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6857}.)

Comparisons involving a signaling NaN value (or @code{sNAN}) now signal
@ref{12ad,,InvalidOperation} instead of silently returning a true or
false value depending on the comparison operator.  Quiet NaN values
(or @code{NaN}) are now hashable.  (Fixed by Mark Dickinson;
bpo-7279@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7279}.)

@item 
The @ref{3b,,difflib} module now produces output that is more
compatible with modern @code{diff}/@code{patch} tools
through one small change, using a tab character instead of spaces as
a separator in the header giving the filename.  (Fixed by Anatoly
Techtonik; bpo-7585@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7585}.)

@item 
The Distutils @code{sdist} command now always regenerates the
@code{MANIFEST} file, since even if the @code{MANIFEST.in} or
@code{setup.py} files haven’t been modified, the user might have
created some new files that should be included.
(Fixed by Tarek Ziadé; bpo-8688@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8688}.)

@item 
The @ref{3e,,doctest} module’s @ref{150d,,IGNORE_EXCEPTION_DETAIL} flag
will now ignore the name of the module containing the exception
being tested.  (Patch by Lennart Regebro; bpo-7490@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7490}.)

@item 
The @ref{3f,,email} module’s @ref{580,,Message} class will
now accept a Unicode-valued payload, automatically converting the
payload to the encoding specified by @code{output_charset}.
(Added by R. David Murray; bpo-1368247@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1368247}.)

@item 
The @ref{213,,Fraction} class now accepts a single float or
@ref{1fe,,Decimal} instance, or two rational numbers, as
arguments to its constructor.  (Implemented by Mark Dickinson;
rationals added in bpo-5812@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5812}, and float/decimal in
bpo-8294@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8294}.)

Ordering comparisons (@code{<}, @code{<=}, @code{>}, @code{>=}) between
fractions and complex numbers now raise a @ref{198,,TypeError}.
This fixes an oversight, making the @ref{213,,Fraction}
match the other numeric types.

@c revision 79455

@item 
New class: @ref{af7,,FTP_TLS} in
the @ref{62,,ftplib} module provides secure FTP
connections using TLS encapsulation of authentication as well as
subsequent control and data transfers.
(Contributed by Giampaolo Rodola; bpo-2054@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2054}.)

The @ref{150e,,storbinary()} method for binary uploads can now restart
uploads thanks to an added `rest' parameter (patch by Pablo Mouzo;
bpo-6845@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6845}.)

@item 
New class decorator: @ref{1141,,total_ordering()} in the @ref{63,,functools}
module takes a class that defines an @ref{cf1,,__eq__()} method and one of
@ref{14a5,,__lt__()}, @ref{150f,,__le__()}, @ref{1510,,__gt__()}, or @ref{1511,,__ge__()},
and generates the missing comparison methods.  Since the
@code{__cmp__()} method is being deprecated in Python 3.x,
this decorator makes it easier to define ordered classes.
(Added by Raymond Hettinger; bpo-5479@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5479}.)

New function: @ref{13df,,cmp_to_key()} will take an old-style comparison
function that expects two arguments and return a new callable that
can be used as the `key' parameter to functions such as
@ref{dc6,,sorted()}, @ref{110a,,min()} and @ref{110b,,max()}, etc.  The primary
intended use is to help with making code compatible with Python 3.x.
(Added by Raymond Hettinger.)

@item 
New function: the @ref{64,,gc} module’s @ref{1512,,is_tracked()} returns
true if a given instance is tracked by the garbage collector, false
otherwise. (Contributed by Antoine Pitrou; bpo-4688@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4688}.)

@item 
The @ref{6b,,gzip} module’s @ref{65a,,GzipFile} now supports the context
management protocol, so you can write @code{with gzip.GzipFile(...) as f:}
(contributed by Hagen Fürstenau; bpo-3860@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=3860}), and it now implements
the @ref{8a2,,io.BufferedIOBase} ABC, so you can wrap it with
@ref{1413,,io.BufferedReader} for faster processing
(contributed by Nir Aides; bpo-7471@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7471}).
It’s also now possible to override the modification time
recorded in a gzipped file by providing an optional timestamp to
the constructor.  (Contributed by Jacques Frechet; bpo-4272@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4272}.)

Files in gzip format can be padded with trailing zero bytes; the
@ref{6b,,gzip} module will now consume these trailing bytes.  (Fixed by
Tadek Pietraszek and Brian Curtin; bpo-2846@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2846}.)

@item 
New attribute: the @ref{6c,,hashlib} module now has an @code{algorithms}
attribute containing a tuple naming the supported algorithms.
In Python 2.7, @code{hashlib.algorithms} contains
@code{('md5', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512')}.
(Contributed by Carl Chenet; bpo-7418@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7418}.)

@item 
The default @ref{12d3,,HTTPResponse} class used by the @ref{72,,httplib} module now
supports buffering, resulting in much faster reading of HTTP responses.
(Contributed by Kristján Valur Jónsson; bpo-4879@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4879}.)

The @ref{d34,,HTTPConnection} and @ref{d35,,HTTPSConnection} classes
now support a `source_address' parameter, a @code{(host, port)} 2-tuple
giving the source address that will be used for the connection.
(Contributed by Eldon Ziegler; bpo-3972@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=3972}.)

@item 
The @code{ihooks} module now supports relative imports.  Note that
@code{ihooks} is an older module for customizing imports,
superseded by the @code{imputil} module added in Python 2.0.
(Relative import support added by Neil Schemenauer.)

@c revision 75423

@item 
The @ref{78,,imaplib} module now supports IPv6 addresses.
(Contributed by Derek Morr; bpo-1655@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1655}.)

@item 
New function: the @ref{82,,inspect} module’s @ref{10bd,,getcallargs()}
takes a callable and its positional and keyword arguments,
and figures out which of the callable’s parameters will receive each argument,
returning a dictionary mapping argument names to their values.  For example:

@example
>>> from inspect import getcallargs
>>> def f(a, b=1, *pos, **named):
...     pass
...
>>> getcallargs(f, 1, 2, 3)
@{'a': 1, 'b': 2, 'pos': (3,), 'named': @{@}@}
>>> getcallargs(f, a=2, x=4)
@{'a': 2, 'b': 1, 'pos': (), 'named': @{'x': 4@}@}
>>> getcallargs(f)
Traceback (most recent call last):
...
TypeError: f() takes at least 1 argument (0 given)
@end example

Contributed by George Sakkis; bpo-3135@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=3135}.

@item 
Updated module: The @ref{83,,io} library has been upgraded to the version shipped with
Python 3.1.  For 3.1, the I/O library was entirely rewritten in C
and is 2 to 20 times faster depending on the task being performed.  The
original Python version was renamed to the @code{_pyio} module.

One minor resulting change: the @ref{8a3,,io.TextIOBase} class now
has an @ref{1513,,errors} attribute giving the error setting
used for encoding and decoding errors (one of @code{'strict'}, @code{'replace'},
@code{'ignore'}).

The @ref{1514,,io.FileIO} class now raises an @ref{2c0,,OSError} when passed
an invalid file descriptor.  (Implemented by Benjamin Peterson;
bpo-4991@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4991}.)  The @ref{1515,,truncate()} method now preserves the
file position; previously it would change the file position to the
end of the new file.  (Fixed by Pascal Chambon; bpo-6939@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6939}.)

@item 
New function: @code{itertools.compress(data, selectors)} takes two
iterators.  Elements of `data' are returned if the corresponding
value in `selectors' is true:

@example
itertools.compress('ABCDEF', [1,0,1,0,1,1]) =>
  A, C, E, F
@end example

@c maybe here is better to use >>> list(itertools.compress(...)) instead

New function: @code{itertools.combinations_with_replacement(iter, r)}
returns all the possible `r'-length combinations of elements from the
iterable `iter'.  Unlike @ref{1516,,combinations()}, individual elements
can be repeated in the generated combinations:

@example
itertools.combinations_with_replacement('abc', 2) =>
  ('a', 'a'), ('a', 'b'), ('a', 'c'),
  ('b', 'b'), ('b', 'c'), ('c', 'c')
@end example

Note that elements are treated as unique depending on their position
in the input, not their actual values.

The @ref{1488,,itertools.count()} function now has a `step' argument that
allows incrementing by values other than 1.  @code{count()} also
now allows keyword arguments, and using non-integer values such as
floats or @ref{1fe,,Decimal} instances.  (Implemented by Raymond
Hettinger; bpo-5032@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5032}.)

@ref{1516,,itertools.combinations()} and @ref{1517,,itertools.product()}
previously raised @ref{2ec,,ValueError} for values of `r' larger than
the input iterable.  This was deemed a specification error, so they
now return an empty iterator.  (Fixed by Raymond Hettinger; bpo-4816@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4816}.)

@item 
Updated module: The @ref{86,,json} module was upgraded to version 2.0.9 of the
simplejson package, which includes a C extension that makes
encoding and decoding faster.
(Contributed by Bob Ippolito; bpo-4136@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4136}.)

To support the new @ref{7f2,,collections.OrderedDict} type, @ref{eb1,,json.load()}
now has an optional `object_pairs_hook' parameter that will be called
with any object literal that decodes to a list of pairs.
(Contributed by Raymond Hettinger; bpo-5381@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5381}.)

@item 
The @ref{8f,,mailbox} module’s @ref{65c,,Maildir} class now records the
timestamp on the directories it reads, and only re-reads them if the
modification time has subsequently changed.  This improves
performance by avoiding unneeded directory scans.  (Fixed by
A.M. Kuchling and Antoine Pitrou; bpo-1607951@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1607951}, bpo-6896@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6896}.)

@item 
New functions: the @ref{92,,math} module gained
@ref{dd2,,erf()} and @ref{dd3,,erfc()} for the error function and the complementary error function,
@ref{13f1,,expm1()} which computes @code{e**x - 1} with more precision than
using @ref{1518,,exp()} and subtracting 1,
@ref{13f2,,gamma()} for the Gamma function, and
@ref{13f3,,lgamma()} for the natural log of the Gamma function.
(Contributed by Mark Dickinson and nirinA raseliarison; bpo-3366@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=3366}.)

@item 
The @ref{98,,multiprocessing} module’s @code{Manager*} classes
can now be passed a callable that will be called whenever
a subprocess is started, along with a set of arguments that will be
passed to the callable.
(Contributed by lekma; bpo-5585@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5585}.)

The @ref{116a,,Pool} class, which controls a pool of worker processes,
now has an optional `maxtasksperchild' parameter.  Worker processes
will perform the specified number of tasks and then exit, causing the
@code{Pool} to start a new worker.  This is useful if tasks may leak
memory or other resources, or if some tasks will cause the worker to
become very large.
(Contributed by Charles Cazabon; bpo-6963@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6963}.)

@item 
The @code{nntplib} module now supports IPv6 addresses.
(Contributed by Derek Morr; bpo-1664@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1664}.)

@item 
New functions: the @ref{a5,,os} module wraps the following POSIX system
calls: @ref{1519,,getresgid()} and @ref{151a,,getresuid()}, which return the
real, effective, and saved GIDs and UIDs;
@ref{151b,,setresgid()} and @ref{151c,,setresuid()}, which set
real, effective, and saved GIDs and UIDs to new values;
@ref{151d,,initgroups()}, which initialize the group access list
for the current process.  (GID/UID functions
contributed by Travis H.; bpo-6508@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6508}.  Support for initgroups added
by Jean-Paul Calderone; bpo-7333@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7333}.)

The @ref{4b6,,os.fork()} function now re-initializes the import lock in
the child process; this fixes problems on Solaris when @code{fork()}
is called from a thread.  (Fixed by Zsolt Cserna; bpo-7242@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7242}.)

@item 
In the @ref{a6,,os.path} module, the @ref{151e,,normpath()} and
@ref{151f,,abspath()} functions now preserve Unicode; if their input path
is a Unicode string, the return value is also a Unicode string.
(@ref{151e,,normpath()} fixed by Matt Giuca in bpo-5827@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5827};
@ref{151f,,abspath()} fixed by Ezio Melotti in bpo-3426@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=3426}.)

@item 
The @ref{ba,,pydoc} module now has help for the various symbols that Python
uses.  You can now do @code{help('<<')} or @code{help('@@')}, for example.
(Contributed by David Laban; bpo-4739@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4739}.)

@item 
The @ref{be,,re} module’s @ref{5a1,,split()}, @ref{5a2,,sub()}, and @ref{5a3,,subn()}
now accept an optional `flags' argument, for consistency with the
other functions in the module.  (Added by Gregory P. Smith.)

@item 
New function: @ref{4a5,,run_path()} in the @ref{c3,,runpy} module
will execute the code at a provided `path' argument.  `path' can be
the path of a Python source file (@code{example.py}), a compiled
bytecode file (@code{example.pyc}), a directory
(@code{./package/}), or a zip archive (@code{example.zip}).  If a
directory or zip path is provided, it will be added to the front of
@code{sys.path} and the module @ref{1,,__main__} will be imported.  It’s
expected that the directory or zip contains a @code{__main__.py};
if it doesn’t, some other @code{__main__.py} might be imported from
a location later in @code{sys.path}.  This makes more of the machinery
of @code{runpy} available to scripts that want to mimic the way
Python’s command line processes an explicit path name.
(Added by Nick Coghlan; bpo-6816@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6816}.)

@item 
New function: in the @ref{ca,,shutil} module, @ref{6d9,,make_archive()}
takes a filename, archive type (zip or tar-format), and a directory
path, and creates an archive containing the directory’s contents.
(Added by Tarek Ziadé.)

@ref{ca,,shutil}’s @ref{c4d,,copyfile()} and @ref{c1d,,copytree()}
functions now raise a @ref{1520,,SpecialFileError} exception when
asked to copy a named pipe.  Previously the code would treat
named pipes like a regular file by opening them for reading, and
this would block indefinitely.  (Fixed by Antoine Pitrou; bpo-3002@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=3002}.)

@item 
The @ref{cb,,signal} module no longer re-installs the signal handler
unless this is truly necessary, which fixes a bug that could make it
impossible to catch the EINTR signal robustly.  (Fixed by
Charles-Francois Natali; bpo-8354@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8354}.)

@item 
New functions: in the @ref{cc,,site} module, three new functions
return various site- and user-specific paths.
@ref{1443,,getsitepackages()} returns a list containing all
global site-packages directories,
@ref{1445,,getusersitepackages()} returns the path of the user’s
site-packages directory, and
@ref{1444,,getuserbase()} returns the value of the @ref{1521,,USER_BASE}
environment variable, giving the path to a directory that can be used
to store data.
(Contributed by Tarek Ziadé; bpo-6693@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6693}.)

The @ref{cc,,site} module now reports exceptions occurring
when the @ref{cd,,sitecustomize} module is imported, and will no longer
catch and swallow the @ref{bc4,,KeyboardInterrupt} exception.  (Fixed by
Victor Stinner; bpo-3137@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=3137}.)

@item 
The @ref{881,,create_connection()} function
gained a `source_address' parameter, a @code{(host, port)} 2-tuple
giving the source address that will be used for the connection.
(Contributed by Eldon Ziegler; bpo-3972@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=3972}.)

The @ref{1522,,recv_into()} and @ref{1523,,recvfrom_into()}
methods will now write into objects that support the buffer API, most usefully
the @ref{344,,bytearray} and @ref{165,,memoryview} objects.  (Implemented by
Antoine Pitrou; bpo-8104@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8104}.)

@item 
The @ref{d2,,SocketServer} module’s @ref{1524,,TCPServer} class now
supports socket timeouts and disabling the Nagle algorithm.
The @code{disable_nagle_algorithm} class attribute
defaults to @code{False}; if overridden to be true,
new request connections will have the TCP_NODELAY option set to
prevent buffering many small sends into a single TCP packet.
The @ref{1525,,timeout} class attribute can hold
a timeout in seconds that will be applied to the request socket; if
no request is received within that time, @ref{1526,,handle_timeout()}
will be called and @ref{1527,,handle_request()} will return.
(Contributed by Kristján Valur Jónsson; bpo-6192@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6192} and bpo-6267@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6267}.)

@item 
Updated module: the @ref{d4,,sqlite3} module has been updated to
version 2.6.0 of the pysqlite package@footnote{https://github.com/ghaering/pysqlite}. Version 2.6.0 includes a number of bugfixes, and adds
the ability to load SQLite extensions from shared libraries.
Call the @code{enable_load_extension(True)} method to enable extensions,
and then call @ref{6de,,load_extension()} to load a particular shared library.
(Updated by Gerhard Häring.)

@item 
The @ref{d5,,ssl} module’s @ref{ae7,,SSLSocket} objects now support the
buffer API, which fixed a test suite failure (fix by Antoine Pitrou;
bpo-7133@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7133}) and automatically set
OpenSSL’s @code{SSL_MODE_AUTO_RETRY}, which will prevent an error
code being returned from @code{recv()} operations that trigger an SSL
renegotiation (fix by Antoine Pitrou; bpo-8222@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8222}).

The @ref{747,,wrap_socket()} constructor function now takes a
`ciphers' argument that’s a string listing the encryption algorithms
to be allowed; the format of the string is described
in the OpenSSL documentation@footnote{https://docs.openssl.org/1.0.2/man1/ciphers/}.
(Added by Antoine Pitrou; bpo-8322@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8322}.)

Another change makes the extension load all of OpenSSL’s ciphers and
digest algorithms so that they’re all available.  Some SSL
certificates couldn’t be verified, reporting an “unknown algorithm”
error.  (Reported by Beda Kosata, and fixed by Antoine Pitrou;
bpo-8484@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8484}.)

The version of OpenSSL being used is now available as the module
attributes @ref{1423,,ssl.OPENSSL_VERSION} (a string),
@ref{1424,,ssl.OPENSSL_VERSION_INFO} (a 5-tuple), and
@ref{1425,,ssl.OPENSSL_VERSION_NUMBER} (an integer).  (Added by Antoine
Pitrou; bpo-8321@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8321}.)

@item 
The @ref{db,,struct} module will no longer silently ignore overflow
errors when a value is too large for a particular integer format
code (one of @code{bBhHiIlLqQ}); it now always raises a
@ref{1528,,struct.error} exception.  (Changed by Mark Dickinson;
bpo-1523@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1523}.)  The @ref{147b,,pack()} function will also
attempt to use @ref{19e,,__index__()} to convert and pack non-integers
before trying the @ref{19d,,__int__()} method or reporting an error.
(Changed by Mark Dickinson; bpo-8300@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8300}.)

@item 
New function: the @ref{dc,,subprocess} module’s
@ref{11c1,,check_output()} runs a command with a specified set of arguments
and returns the command’s output as a string when the command runs without
error, or raises a @ref{1529,,CalledProcessError} exception otherwise.

@example
>>> subprocess.check_output(['df', '-h', '.'])
'Filesystem     Size   Used  Avail Capacity  Mounted on\n
/dev/disk0s2    52G    49G   3.0G    94%    /\n'

>>> subprocess.check_output(['df', '-h', '/bogus'])
  ...
subprocess.CalledProcessError: Command '['df', '-h', '/bogus']' returned non-zero exit status 1
@end example

(Contributed by Gregory P. Smith.)

The @ref{dc,,subprocess} module will now retry its internal system calls
on receiving an @ref{f86,,EINTR} signal.  (Reported by several people; final
patch by Gregory P. Smith in bpo-1068268@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1068268}.)

@item 
New function: @ref{152a,,is_declared_global()} in the @ref{de,,symtable} module
returns true for variables that are explicitly declared to be global,
false for ones that are implicitly global.
(Contributed by Jeremy Hylton.)

@item 
The @ref{e2,,syslog} module will now use the value of @code{sys.argv[0]} as the
identifier instead of the previous default value of @code{'python'}.
(Changed by Sean Reifschneider; bpo-8451@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8451}.)

@item 
The @ref{8ae,,sys.version_info} value is now a named tuple, with attributes
named @code{major}, @code{minor}, @code{micro},
@code{releaselevel}, and @code{serial}.  (Contributed by Ross
Light; bpo-4285@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4285}.)

@ref{ee2,,sys.getwindowsversion()} also returns a named tuple,
with attributes named @code{major}, @code{minor}, @code{build},
@code{platform}, @code{service_pack}, @code{service_pack_major},
@code{service_pack_minor}, @code{suite_mask}, and
@code{product_type}.  (Contributed by Brian Curtin; bpo-7766@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7766}.)

@item 
The @ref{e4,,tarfile} module’s default error handling has changed, to
no longer suppress fatal errors.  The default error level was previously 0,
which meant that errors would only result in a message being written to the
debug log, but because the debug log is not activated by default,
these errors go unnoticed.  The default error level is now 1,
which raises an exception if there’s an error.
(Changed by Lars Gustäbel; bpo-7357@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7357}.)

@ref{e4,,tarfile} now supports filtering the @ref{1416,,TarInfo}
objects being added to a tar file.  When you call @ref{ded,,add()},
you may supply an optional `filter' argument
that’s a callable.  The `filter' callable will be passed the
@code{TarInfo} for every file being added, and can modify and return it.
If the callable returns @code{None}, the file will be excluded from the
resulting archive.  This is more powerful than the existing
`exclude' argument, which has therefore been deprecated.
(Added by Lars Gustäbel; bpo-6856@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6856}.)
The @ref{1415,,TarFile} class also now supports the context management protocol.
(Added by Lars Gustäbel; bpo-7232@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7232}.)

@item 
The @ref{152b,,wait()} method of the @ref{135d,,threading.Event} class
now returns the internal flag on exit.  This means the method will usually
return true because @code{wait()} is supposed to block until the
internal flag becomes true.  The return value will only be false if
a timeout was provided and the operation timed out.
(Contributed by Tim Lesher; bpo-1674032@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1674032}.)

@item 
The Unicode database provided by the @ref{10b,,unicodedata} module is
now used internally to determine which characters are numeric,
whitespace, or represent line breaks.  The database also
includes information from the @code{Unihan.txt} data file (patch
by Anders Chrigström and Amaury Forgeot d’Arc; bpo-1571184@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1571184})
and has been updated to version 5.2.0 (updated by
Florent Xicluna; bpo-8024@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8024}).

@item 
The @ref{110,,urlparse} module’s @ref{f39,,urlsplit()} now handles
unknown URL schemes in a fashion compliant with 
@geindex RFC; RFC 3986
RFC 3986@footnote{https://datatracker.ietf.org/doc/html/rfc3986.html}: if the
URL is of the form @code{"<something>://..."}, the text before the
@code{://} is treated as the scheme, even if it’s a made-up scheme that
the module doesn’t know about.  This change may break code that
worked around the old behaviour.  For example, Python 2.6.4 or 2.5
will return the following:

@example
>>> import urlparse
>>> urlparse.urlsplit('invented://host/filename?query')
('invented', '@w{'}, '//host/filename?query', '@w{'}, '@w{'})
@end example

Python 2.7 (and Python 2.6.5) will return:

@example
>>> import urlparse
>>> urlparse.urlsplit('invented://host/filename?query')
('invented', 'host', '/filename?query', '@w{'}, '@w{'})
@end example

(Python 2.7 actually produces slightly different output, since it
returns a named tuple instead of a standard tuple.)

The @ref{110,,urlparse} module also supports IPv6 literal addresses as defined by
@geindex RFC; RFC 2732
RFC 2732@footnote{https://datatracker.ietf.org/doc/html/rfc2732.html} (contributed by Senthil Kumaran; bpo-2987@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2987}).

@example
>>> urlparse.urlparse('http://[1080::8:800:200C:417A]/foo')
ParseResult(scheme='http', netloc='[1080::8:800:200C:417A]',
            path='/foo', params='@w{'}, query='@w{'}, fragment='@w{'})
@end example

@item 
New class: the @ref{7f4,,WeakSet} class in the @ref{11a,,weakref}
module is a set that only holds weak references to its elements; elements
will be removed once there are no references pointing to them.
(Originally implemented in Python 3.x by Raymond Hettinger, and backported
to 2.7 by Michael Foord.)

@item 
The @ref{12b,,xml.etree.ElementTree} library, no longer escapes
ampersands and angle brackets when outputting an XML processing
instruction (which looks like @code{<?xml-stylesheet href="#style1"?>})
or comment (which looks like @code{<!-- comment -->}).
(Patch by Neil Muller; bpo-2746@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2746}.)

@item 
The XML-RPC client and server, provided by the @ref{134,,xmlrpclib} and
@ref{135,,SimpleXMLRPCServer} modules, have improved performance by
supporting HTTP/1.1 keep-alive and by optionally using gzip encoding
to compress the XML being exchanged.  The gzip compression is
controlled by the @code{encode_threshold} attribute of
@ref{152c,,SimpleXMLRPCRequestHandler}, which contains a size in bytes;
responses larger than this will be compressed.
(Contributed by Kristján Valur Jónsson; bpo-6267@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6267}.)

@item 
The @ref{137,,zipfile} module’s @ref{8d2,,ZipFile} now supports the context
management protocol, so you can write @code{with zipfile.ZipFile(...) as f:}.
(Contributed by Brian Curtin; bpo-5511@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5511}.)

@ref{137,,zipfile} now also supports archiving empty directories and
extracts them correctly.  (Fixed by Kuba Wieczorek; bpo-4710@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4710}.)
Reading files out of an archive is faster, and interleaving
@ref{152d,,read()} and
@ref{152e,,readline()} now works correctly.
(Contributed by Nir Aides; bpo-7610@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7610}.)

The @ref{152f,,is_zipfile()} function now
accepts a file object, in addition to the path names accepted in earlier
versions.  (Contributed by Gabriel Genellina; bpo-4756@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4756}.)

The @ref{2cc,,writestr()} method now has an optional `compress_type' parameter
that lets you override the default compression method specified in the
@ref{8d2,,ZipFile} constructor.  (Contributed by Ronald Oussoren;
bpo-6003@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6003}.)
@end itemize

@c ======================================================================

@c whole new modules get described in subsections here

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

@end menu

@node New module importlib,New module sysconfig,,New and Improved Modules
@anchor{whatsnew/2 7 importlib-section}@anchor{14f0}@anchor{whatsnew/2 7 new-module-importlib}@anchor{1530}
@subsubsection New module: importlib


Python 3.1 includes the @ref{7b,,importlib} package, a re-implementation
of the logic underlying Python’s @ref{7f7,,import} statement.
@code{importlib} is useful for implementers of Python interpreters and
to users who wish to write new importers that can participate in the
import process.  Python 2.7 doesn’t contain the complete
@code{importlib} package, but instead has a tiny subset that contains
a single function, @ref{73b,,import_module()}.

@code{import_module(name, package=None)} imports a module.  `name' is
a string containing the module or package’s name.  It’s possible to do
relative imports by providing a string that begins with a @code{.}
character, such as @code{..utils.errors}.  For relative imports, the
`package' argument must be provided and is the name of the package that
will be used as the anchor for
the relative import.  @ref{73b,,import_module()} both inserts the imported
module into @code{sys.modules} and returns the module object.

Here are some examples:

@example
>>> from importlib import import_module
>>> anydbm = import_module('anydbm')  # Standard absolute import
>>> anydbm
<module 'anydbm' from '/p/python/Lib/anydbm.py'>
>>> # Relative import
>>> file_util = import_module('..file_util', 'distutils.command')
>>> file_util
<module 'distutils.file_util' from '/python/Lib/distutils/file_util.pyc'>
@end example

@ref{7b,,importlib} was implemented by Brett Cannon and introduced in
Python 3.1.

@node New module sysconfig,ttk Themed Widgets for Tk,New module importlib,New and Improved Modules
@anchor{whatsnew/2 7 new-module-sysconfig}@anchor{1531}
@subsubsection New module: sysconfig


The @ref{e1,,sysconfig} module has been pulled out of the Distutils
package, becoming a new top-level module in its own right.
@code{sysconfig} provides functions for getting information about
Python’s build process: compiler switches, installation paths, the
platform name, and whether Python is running from its source
directory.

Some of the functions in the module are:


@itemize *

@item 
@ref{174,,get_config_var()} returns variables from Python’s
Makefile and the @code{pyconfig.h} file.

@item 
@ref{298,,get_config_vars()} returns a dictionary containing
all of the configuration variables.

@item 
@ref{1532,,get_path()} returns the configured path for
a particular type of module: the standard library,
site-specific modules, platform-specific modules, etc.

@item 
@ref{32d,,is_python_build()} returns true if you’re running a
binary from a Python source tree, and false otherwise.
@end itemize

Consult the @ref{e1,,sysconfig} documentation for more details and for
a complete list of functions.

The Distutils package and @ref{e1,,sysconfig} are now maintained by Tarek
Ziadé, who has also started a Distutils2 package (source repository at
@indicateurl{https://hg.python.org/distutils2/}) for developing a next-generation
version of Distutils.

@node ttk Themed Widgets for Tk,Updated module unittest,New module sysconfig,New and Improved Modules
@anchor{whatsnew/2 7 ttk-themed-widgets-for-tk}@anchor{1533}
@subsubsection ttk: Themed Widgets for Tk


Tcl/Tk 8.5 includes a set of themed widgets that re-implement basic Tk
widgets but have a more customizable appearance and can therefore more
closely resemble the native platform’s widgets.  This widget
set was originally called Tile, but was renamed to Ttk (for “themed Tk”)
on being added to Tcl/Tck release 8.5.

To learn more, read the @ref{ff,,ttk} module documentation.  You may also
wish to read the Tcl/Tk manual page describing the
Ttk theme engine, available at
@indicateurl{https://www.tcl.tk/man/tcl8.5/TkCmd/ttk_intro.html}. Some
screenshots of the Python/Ttk code in use are at
@indicateurl{https://code.google.com/archive/p/python-ttk/wikis/Screenshots.wiki}.

The @ref{ff,,tkinter.ttk} module was written by Guilherme Polo and added in
bpo-2983@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2983}.  An alternate version called @code{Tile.py}, written by
Martin Franklin and maintained by Kevin Walzer, was proposed for
inclusion in bpo-2618@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2618}, but the authors argued that Guilherme
Polo’s work was more comprehensive.

@node Updated module unittest,Updated module ElementTree 1 3,ttk Themed Widgets for Tk,New and Improved Modules
@anchor{whatsnew/2 7 unittest-section}@anchor{1534}@anchor{whatsnew/2 7 updated-module-unittest}@anchor{1535}
@subsubsection Updated module: unittest


The @ref{10c,,unittest} module was greatly enhanced; many
new features were added.  Most of these features were implemented
by Michael Foord, unless otherwise noted.  The enhanced version of
the module is downloadable separately for use with Python versions 2.4 to 2.6,
packaged as the @code{unittest2} package, from unittest2@footnote{https://pypi.org/project/unittest2/}.

When used from the command line, the module can automatically discover
tests.  It’s not as fancy as py.test@footnote{https://pytest.org} or
nose@footnote{https://nose.readthedocs.io/}, but provides a
simple way to run tests kept within a set of package directories.  For example,
the following command will search the @code{test/} subdirectory for
any importable test files named @code{test*.py}:

@example
python -m unittest discover -s test
@end example

Consult the @ref{10c,,unittest} module documentation for more details.
(Developed in bpo-6001@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6001}.)

The @ref{11e2,,main()} function supports some other new options:


@itemize *

@item 
@ref{1536,,-b} or @code{--buffer} will buffer the standard output
and standard error streams during each test.  If the test passes,
any resulting output will be discarded; on failure, the buffered
output will be displayed.

@item 
@ref{1537,,-c} or @code{--catch} will cause the control-C interrupt
to be handled more gracefully.  Instead of interrupting the test
process immediately, the currently running test will be completed
and then the partial results up to the interruption will be reported.
If you’re impatient, a second press of control-C will cause an immediate
interruption.

This control-C handler tries to avoid causing problems when the code
being tested or the tests being run have defined a signal handler of
their own, by noticing that a signal handler was already set and
calling it.  If this doesn’t work for you, there’s a
@ref{1538,,removeHandler()} decorator that can be used to mark tests that
should have the control-C handling disabled.

@item 
@ref{1539,,-f} or @code{--failfast} makes
test execution stop immediately when a test fails instead of
continuing to execute further tests.  (Suggested by Cliff Dyer and
implemented by Michael Foord; bpo-8074@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8074}.)
@end itemize

The progress messages now show ‘x’ for expected failures
and ‘u’ for unexpected successes when run in verbose mode.
(Contributed by Benjamin Peterson.)

Test cases can raise the @ref{11e3,,SkipTest} exception to skip a
test (bpo-1034053@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1034053}).

The error messages for @ref{74b,,assertEqual()},
@ref{749,,assertTrue()}, and @ref{74a,,assertFalse()}
failures now provide more information.  If you set the
@ref{153a,,longMessage} attribute of your @ref{2b3,,TestCase} classes to
true, both the standard error message and any additional message you
provide will be printed for failures.  (Added by Michael Foord; bpo-5663@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5663}.)

The @ref{74f,,assertRaises()} method now
returns a context handler when called without providing a callable
object to run.  For example, you can write this:

@example
with self.assertRaises(KeyError):
    @{@}['foo']
@end example

(Implemented by Antoine Pitrou; bpo-4444@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4444}.)

@c rev 78774

Module- and class-level setup and teardown fixtures are now supported.
Modules can contain @ref{c3f,,setUpModule()} and @ref{153b,,tearDownModule()}
functions.  Classes can have @ref{c40,,setUpClass()} and
@ref{153c,,tearDownClass()} methods that must be defined as class methods
(using @code{@@classmethod} or equivalent).  These functions and
methods are invoked when the test runner switches to a test case in a
different module or class.

The methods @ref{c73,,addCleanup()} and
@ref{153d,,doCleanups()} were added.
@code{addCleanup()} lets you add cleanup functions that
will be called unconditionally (after @ref{153e,,setUp()} if
@code{setUp()} fails, otherwise after @ref{153f,,tearDown()}). This allows
for much simpler resource allocation and deallocation during tests
(bpo-5679@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5679}).

A number of new methods were added that provide more specialized
tests.  Many of these methods were written by Google engineers
for use in their test suites; Gregory P. Smith, Michael Foord, and
GvR worked on merging them into Python’s version of @ref{10c,,unittest}.


@itemize *

@item 
@ref{148f,,assertIsNone()} and @ref{1490,,assertIsNotNone()} take one
expression and verify that the result is or is not @code{None}.

@item 
@ref{1540,,assertIs()} and @ref{1541,,assertIsNot()}
take two values and check whether the two values evaluate to the same object or not.
(Added by Michael Foord; bpo-2578@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2578}.)

@item 
@ref{1542,,assertIsInstance()} and
@ref{1543,,assertNotIsInstance()} check whether
the resulting object is an instance of a particular class, or of
one of a tuple of classes.  (Added by Georg Brandl; bpo-7031@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7031}.)

@item 
@ref{1544,,assertGreater()}, @ref{1545,,assertGreaterEqual()},
@ref{1546,,assertLess()}, and @ref{1547,,assertLessEqual()} compare
two quantities.

@item 
@ref{1548,,assertMultiLineEqual()} compares two strings, and if they’re
not equal, displays a helpful comparison that highlights the
differences in the two strings.  This comparison is now used by
default when Unicode strings are compared with @ref{74b,,assertEqual()}.

@item 
@ref{750,,assertRegexpMatches()} and
@ref{752,,assertNotRegexpMatches()} checks whether the
first argument is a string matching or not matching the regular
expression provided as the second argument (bpo-8038@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8038}).

@item 
@ref{751,,assertRaisesRegexp()} checks
whether a particular exception
is raised, and then also checks that the string representation of
the exception matches the provided regular expression.

@item 
@ref{1549,,assertIn()} and @ref{154a,,assertNotIn()}
tests whether `first' is or is not in  `second'.

@item 
@ref{142f,,assertItemsEqual()} tests whether two provided sequences
contain the same elements.

@item 
@ref{148a,,assertSetEqual()} compares whether two sets are equal, and
only reports the differences between the sets in case of error.

@item 
Similarly, @ref{148c,,assertListEqual()} and @ref{148d,,assertTupleEqual()}
compare the specified types and explain any differences without necessarily
printing their full values; these methods are now used by default
when comparing lists and tuples using @ref{74b,,assertEqual()}.
More generally, @ref{148e,,assertSequenceEqual()} compares two sequences
and can optionally check whether both sequences are of a
particular type.

@item 
@ref{148b,,assertDictEqual()} compares two dictionaries and reports the
differences; it’s now used by default when you compare two dictionaries
using @ref{74b,,assertEqual()}.  @code{assertDictContainsSubset()} checks whether
all of the key/value pairs in `first' are found in `second'.

@item 
@ref{74d,,assertAlmostEqual()} and @ref{74e,,assertNotAlmostEqual()} test
whether `first' and `second' are approximately equal.  This method
can either round their difference to an optionally specified number
of `places' (the default is 7) and compare it to zero, or require
the difference to be smaller than a supplied `delta' value.

@item 
@ref{154b,,loadTestsFromName()} properly honors the
@ref{154c,,suiteClass} attribute of
the @ref{592,,TestLoader}. (Fixed by Mark Roddy; bpo-6866@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6866}.)

@item 
A new hook lets you extend the @ref{74b,,assertEqual()} method to handle
new data types.  The @ref{154d,,addTypeEqualityFunc()} method takes a type
object and a function. The function will be used when both of the
objects being compared are of the specified type.  This function
should compare the two objects and raise an exception if they don’t
match; it’s a good idea for the function to provide additional
information about why the two objects aren’t matching, much as the new
sequence comparison methods do.
@end itemize

@ref{11e2,,unittest.main()} now takes an optional @code{exit} argument.  If
false, @code{main()} doesn’t call @ref{277,,sys.exit()}, allowing
@code{main()} to be used from the interactive interpreter.
(Contributed by J. Pablo Fernández; bpo-3379@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=3379}.)

@ref{136c,,TestResult} has new @ref{154e,,startTestRun()} and
@ref{154f,,stopTestRun()} methods that are called immediately before
and after a test run.  (Contributed by Robert Collins; bpo-5728@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5728}.)

With all these changes, the @code{unittest.py} was becoming awkwardly
large, so the module was turned into a package and the code split into
several files (by Benjamin Peterson).  This doesn’t affect how the
module is imported or used.


@subsubheading 더 보기



@table @asis

@item @indicateurl{https://web.archive.org/web/20210619163128/http://www.voidspace.org.uk/python/articles/unittest2.shtml}

Describes the new features, how to use them, and the
rationale for various design decisions.  (By Michael Foord.)
@end table


@node Updated module ElementTree 1 3,,Updated module unittest,New and Improved Modules
@anchor{whatsnew/2 7 elementtree-section}@anchor{1550}@anchor{whatsnew/2 7 updated-module-elementtree-1-3}@anchor{1551}
@subsubsection Updated module: ElementTree 1.3


The version of the ElementTree library included with Python was updated to
version 1.3.  Some of the new features are:


@itemize *

@item 
The various parsing functions now take a `parser' keyword argument
giving an @ref{c48,,XMLParser} instance that will
be used.  This makes it possible to override the file’s internal encoding:

@example
p = ET.XMLParser(encoding='utf-8')
t = ET.XML("""<root/>""", parser=p)
@end example

Errors in parsing XML now raise a @ref{147c,,ParseError} exception, whose
instances have a @code{position} attribute
containing a (`line', `column') tuple giving the location of the problem.

@item 
ElementTree’s code for converting trees to a string has been
significantly reworked, making it roughly twice as fast in many
cases.  The @ref{c8b,,ElementTree.write()}
and @code{Element.write()} methods now have a `method' parameter that can be
“xml” (the default), “html”, or “text”.  HTML mode will output empty
elements as @code{<empty></empty>} instead of @code{<empty/>}, and text
mode will skip over elements and only output the text chunks.  If
you set the @ref{1552,,tag} attribute of an
element to @code{None} but
leave its children in place, the element will be omitted when the
tree is written out, so you don’t need to do more extensive rearrangement
to remove a single element.

Namespace handling has also been improved.  All @code{xmlns:<whatever>}
declarations are now output on the root element, not scattered throughout
the resulting XML.  You can set the default namespace for a tree
by setting the @code{default_namespace} attribute and can
register new prefixes with @ref{13d7,,register_namespace()}.  In XML mode,
you can use the true/false `xml_declaration' parameter to suppress the
XML declaration.

@item 
New @ref{363,,Element} method:
@ref{13d8,,extend()} appends the items from a
sequence to the element’s children.  Elements themselves behave like
sequences, so it’s easy to move children from one element to
another:

@example
from xml.etree import ElementTree as ET

t = ET.XML("""<list>
  <item>1</item> <item>2</item>  <item>3</item>
</list>""")
new = ET.XML('<root/>')
new.extend(t)

# Outputs <root><item>1</item>...</root>
print ET.tostring(new)
@end example

@item 
New @ref{363,,Element} method:
@ref{1553,,iter()} yields the children of the
element as a generator.  It’s also possible to write @code{for child in
elem:} to loop over an element’s children.  The existing method
@code{getiterator()} is now deprecated, as is @code{getchildren()}
which constructs and returns a list of children.

@item 
New @ref{363,,Element} method:
@ref{13da,,itertext()} yields all chunks of
text that are descendants of the element.  For example:

@example
t = ET.XML("""<list>
  <item>1</item> <item>2</item>  <item>3</item>
</list>""")

# Outputs ['\n  ', '1', ' ', '2', '  ', '3', '\n']
print list(t.itertext())
@end example

@item 
Deprecated: using an element as a Boolean (i.e., @code{if elem:}) would
return true if the element had any children, or false if there were
no children.  This behaviour is confusing – @code{None} is false, but
so is a childless element? – so it will now trigger a
@ref{657,,FutureWarning}.  In your code, you should be explicit: write
@code{len(elem) != 0} if you’re interested in the number of children,
or @code{elem is not None}.
@end itemize

Fredrik Lundh develops ElementTree and produced the 1.3 version;
you can read his article describing 1.3 at
@indicateurl{https://web.archive.org/web/20200703234532/http://effbot.org/zone/elementtree-13-intro.htm}.
Florent Xicluna updated the version included with
Python, after discussions on python-dev and in bpo-6472@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6472}.)

@c ======================================================================

@node Build and C API Changes<5>,Other Changes and Fixes,New and Improved Modules,What’s New in Python 2 7
@anchor{whatsnew/2 7 build-and-c-api-changes}@anchor{1554}
@subsection Build and C API Changes


Changes to Python’s build process and to the C API include:


@itemize *

@item 
The latest release of the GNU Debugger, GDB 7, can be scripted using Python@footnote{https://web.archive.org/web/20110715084810/http://sourceware.org/gdb/current/onlinedocs/gdb/Python.html}.
When you begin debugging an executable program P, GDB will look for
a file named @code{P-gdb.py} and automatically read it.  Dave Malcolm
contributed a @code{python-gdb.py} that adds a number of
commands useful when debugging Python itself.  For example,
@code{py-up} and @code{py-down} go up or down one Python stack frame,
which usually corresponds to several C stack frames.  @code{py-print}
prints the value of a Python variable, and @code{py-bt} prints the
Python stack trace.  (Added as a result of bpo-8032@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8032}.)

@item 
If you use the @code{.gdbinit} file provided with Python,
the “pyo” macro in the 2.7 version now works correctly when the thread being
debugged doesn’t hold the GIL; the macro now acquires it before printing.
(Contributed by Victor Stinner; bpo-3632@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=3632}.)

@item 
@ref{b77,,Py_AddPendingCall()} is now thread-safe, letting any
worker thread submit notifications to the main Python thread.  This
is particularly useful for asynchronous IO operations.
(Contributed by Kristján Valur Jónsson; bpo-4293@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4293}.)

@item 
New function: @ref{1555,,PyCode_NewEmpty()} creates an empty code object;
only the filename, function name, and first line number are required.
This is useful for extension modules that are attempting to
construct a more useful traceback stack.  Previously such
extensions needed to call @code{PyCode_New()}, which had many
more arguments.  (Added by Jeffrey Yasskin.)

@item 
New function: @ref{146d,,PyErr_NewExceptionWithDoc()} creates a new
exception class, just as the existing @ref{146e,,PyErr_NewException()} does,
but takes an extra @code{char *} argument containing the docstring for the
new exception class.  (Added by ‘lekma’ on the Python bug tracker;
bpo-7033@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7033}.)

@item 
New function: @ref{98d,,PyFrame_GetLineNumber()} takes a frame object
and returns the line number that the frame is currently executing.
Previously code would need to get the index of the bytecode
instruction currently executing, and then look up the line number
corresponding to that address.  (Added by Jeffrey Yasskin.)

@item 
New functions: @ref{146b,,PyLong_AsLongAndOverflow()} and
@ref{146a,,PyLong_AsLongLongAndOverflow()}  approximates a Python long
integer as a C long or long long.
If the number is too large to fit into
the output type, an `overflow' flag is set and returned to the caller.
(Contributed by Case Van Horsen; bpo-7528@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7528} and bpo-7767@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7767}.)

@item 
New function: stemming from the rewrite of string-to-float conversion,
a new @ref{149a,,PyOS_string_to_double()} function was added.  The old
@code{PyOS_ascii_strtod()} and @code{PyOS_ascii_atof()} functions
are now deprecated.

@item 
New function: @code{PySys_SetArgvEx()} sets the value of
@code{sys.argv} and can optionally update @code{sys.path} to include the
directory containing the script named by @code{sys.argv[0]} depending
on the value of an `updatepath' parameter.

This function was added to close a security hole for applications
that embed Python.  The old function, @code{PySys_SetArgv()}, would
always update @code{sys.path}, and sometimes it would add the current
directory.  This meant that, if you ran an application embedding
Python in a directory controlled by someone else, attackers could
put a Trojan-horse module in the directory (say, a file named
@code{os.py}) that your application would then import and run.

If you maintain a C/C++ application that embeds Python, check
whether you’re calling @code{PySys_SetArgv()} and carefully consider
whether the application should be using @code{PySys_SetArgvEx()}
with `updatepath' set to false.

Security issue reported as 
@geindex Common Vulnerabilities and Exposures; CVE 2008-5983
CVE 2008-5983@footnote{https://www.cve.org/CVERecord?id=CVE-2008-5983};
discussed in bpo-5753@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5753}, and fixed by Antoine Pitrou.

@item 
New macros: the Python header files now define the following macros:
@ref{1556,,Py_ISALNUM},
@ref{1557,,Py_ISALPHA},
@ref{1558,,Py_ISDIGIT},
@ref{1559,,Py_ISLOWER},
@ref{155a,,Py_ISSPACE},
@ref{155b,,Py_ISUPPER},
@ref{155c,,Py_ISXDIGIT},
@ref{155d,,Py_TOLOWER}, and @ref{155e,,Py_TOUPPER}.
All of these functions are analogous to the C
standard macros for classifying characters, but ignore the current
locale setting, because in
several places Python needs to analyze characters in a
locale-independent way.  (Added by Eric Smith;
bpo-5793@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5793}.)

@item 
Removed function: @code{PyEval_CallObject()} is now only available
as a macro.  A function version was being kept around to preserve
ABI linking compatibility, but that was in 1997; it can certainly be
deleted by now.  (Removed by Antoine Pitrou; bpo-8276@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8276}.)

@item 
New format codes: the @code{PyString_FromFormat()},
@code{PyString_FromFormatV()}, and @ref{10af,,PyErr_Format()} functions now
accept @code{%lld} and @code{%llu} format codes for displaying
C’s long long types.
(Contributed by Mark Dickinson; bpo-7228@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7228}.)

@item 
The complicated interaction between threads and process forking has
been changed.  Previously, the child process created by
@ref{4b6,,os.fork()} might fail because the child is created with only a
single thread running, the thread performing the @code{os.fork()}.
If other threads were holding a lock, such as Python’s import lock,
when the fork was performed, the lock would still be marked as
“held” in the new process.  But in the child process nothing would
ever release the lock, since the other threads weren’t replicated,
and the child process would no longer be able to perform imports.

Python 2.7 acquires the import lock before performing an
@ref{4b6,,os.fork()}, and will also clean up any locks created using the
@ref{f3,,threading} module.  C extension modules that have internal
locks, or that call @code{fork()} themselves, will not benefit
from this clean-up.

(Fixed by Thomas Wouters; bpo-1590864@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1590864}.)

@item 
The @ref{45f,,Py_Finalize()} function now calls the internal
@code{threading._shutdown()} function; this prevents some exceptions from
being raised when an interpreter shuts down.
(Patch by Adam Olsen; bpo-1722344@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1722344}.)

@item 
When using the @ref{770,,PyMemberDef} structure to define attributes
of a type, Python will no longer let you try to delete or set a
@code{T_STRING_INPLACE} attribute.

@c rev 79644

@item 
Global symbols defined by the @ref{2e,,ctypes} module are now prefixed
with @code{Py}, or with @code{_ctypes}.  (Implemented by Thomas
Heller; bpo-3102@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=3102}.)

@item 
New configure option: the @code{--with-system-expat} switch allows
building the @ref{12c,,pyexpat} module to use the system Expat library.
(Contributed by Arfrever Frehtes Taifersar Arahesis; bpo-7609@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7609}.)

@item 
New configure option: the
@code{--with-valgrind} option will now disable the pymalloc
allocator, which is difficult for the Valgrind memory-error detector
to analyze correctly.
Valgrind will therefore be better at detecting memory leaks and
overruns. (Contributed by James Henstridge; bpo-2422@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2422}.)

@item 
New configure option: you can now supply an empty string to
@code{--with-dbmliborder=} in order to disable all of the various
DBM modules.  (Added by Arfrever Frehtes Taifersar Arahesis;
bpo-6491@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6491}.)

@item 
The @code{configure} script now checks for floating-point rounding bugs
on certain 32-bit Intel chips and defines a @code{X87_DOUBLE_ROUNDING}
preprocessor definition.  No code currently uses this definition,
but it’s available if anyone wishes to use it.
(Added by Mark Dickinson; bpo-2937@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2937}.)

@code{configure} also now sets a @code{LDCXXSHARED} Makefile
variable for supporting C++ linking.  (Contributed by Arfrever
Frehtes Taifersar Arahesis; bpo-1222585@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1222585}.)

@item 
The build process now creates the necessary files for pkg-config
support.  (Contributed by Clinton Roy; bpo-3585@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=3585}.)

@item 
The build process now supports Subversion 1.7.  (Contributed by
Arfrever Frehtes Taifersar Arahesis; bpo-6094@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6094}.)
@end itemize

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

@end menu

@node Capsules,Port-Specific Changes Windows,,Build and C API Changes<5>
@anchor{whatsnew/2 7 capsules}@anchor{155f}@anchor{whatsnew/2 7 whatsnew27-capsules}@anchor{1560}
@subsubsection Capsules


Python 3.1 adds a new C datatype, @ref{1477,,PyCapsule}, for providing a
C API to an extension module.  A capsule is essentially the holder of
a C @code{void *} pointer, and is made available as a module attribute; for
example, the @ref{d1,,socket} module’s API is exposed as @code{socket.CAPI},
and @ref{10b,,unicodedata} exposes @code{ucnhash_CAPI}.  Other extensions
can import the module, access its dictionary to get the capsule
object, and then get the @code{void *} pointer, which will usually point
to an array of pointers to the module’s various API functions.

There is an existing data type already used for this,
@code{PyCObject}, but it doesn’t provide type safety.  Evil code
written in pure Python could cause a segmentation fault by taking a
@code{PyCObject} from module A and somehow substituting it for the
@code{PyCObject} in module B.   Capsules know their own name,
and getting the pointer requires providing the name:

@example
void *vtable;

if (!PyCapsule_IsValid(capsule, "mymodule.CAPI") @{
        PyErr_SetString(PyExc_ValueError, "argument type invalid");
        return NULL;
@}

vtable = PyCapsule_GetPointer(capsule, "mymodule.CAPI");
@end example

You are assured that @code{vtable} points to whatever you’re expecting.
If a different capsule was passed in, @ref{1561,,PyCapsule_IsValid()} would
detect the mismatched name and return false.  Refer to
@ref{1562,,확장 모듈을 위한 C API 제공하기} for more information on using these objects.

Python 2.7 now uses capsules internally to provide various
extension-module APIs, but the @code{PyCObject_AsVoidPtr()} was
modified to handle capsules, preserving compile-time compatibility
with the @code{PyCObject} interface.  Use of
@code{PyCObject_AsVoidPtr()} will signal a
@ref{ac6,,PendingDeprecationWarning}, which is silent by default.

Implemented in Python 3.1 and backported to 2.7 by Larry Hastings;
discussed in bpo-5630@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5630}.

@c ======================================================================

@node Port-Specific Changes Windows,Port-Specific Changes Mac OS X,Capsules,Build and C API Changes<5>
@anchor{whatsnew/2 7 port-specific-changes-windows}@anchor{1563}
@subsubsection Port-Specific Changes: Windows



@itemize *

@item 
The @ref{97,,msvcrt} module now contains some constants from
the @code{crtassem.h} header file:
@ref{1564,,CRT_ASSEMBLY_VERSION},
@ref{1565,,VC_ASSEMBLY_PUBLICKEYTOKEN},
and @ref{1566,,LIBRARIES_ASSEMBLY_NAME_PREFIX}.
(Contributed by David Cournapeau; bpo-4365@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4365}.)

@item 
The @ref{11c,,_winreg} module for accessing the registry now implements
the @ref{1567,,CreateKeyEx()} and @ref{1568,,DeleteKeyEx()}
functions, extended versions of previously supported functions that
take several extra arguments.  The @ref{1569,,DisableReflectionKey()},
@ref{156a,,EnableReflectionKey()}, and @ref{156b,,QueryReflectionKey()}
were also tested and documented.
(Implemented by Brian Curtin: bpo-7347@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7347}.)

@item 
The new @code{_beginthreadex()} API is used to start threads, and
the native thread-local storage functions are now used.
(Contributed by Kristján Valur Jónsson; bpo-3582@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=3582}.)

@item 
The @ref{156c,,os.kill()} function now works on Windows.  The signal value
can be the constants @ref{156d,,CTRL_C_EVENT},
@ref{156e,,CTRL_BREAK_EVENT}, or any integer.  The first two constants
will send @code{Control}-@code{C} and @code{Control}-@code{Break} keystroke events to
subprocesses; any other value will use the @code{TerminateProcess()}
API.  (Contributed by Miki Tebeka; bpo-1220212@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1220212}.)

@item 
The @ref{12ff,,os.listdir()} function now correctly fails
for an empty path.  (Fixed by Hirokazu Yamamoto; bpo-5913@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5913}.)

@item 
The @ref{93,,mimetypes} module will now read the MIME database from
the Windows registry when initializing.
(Patch by Gabriel Genellina; bpo-4969@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4969}.)
@end itemize

@c ======================================================================

@node Port-Specific Changes Mac OS X,Port-Specific Changes FreeBSD,Port-Specific Changes Windows,Build and C API Changes<5>
@anchor{whatsnew/2 7 port-specific-changes-mac-os-x}@anchor{156f}
@subsubsection Port-Specific Changes: Mac OS X



@itemize *

@item 
The path @code{/Library/Python/2.7/site-packages} is now appended to
@code{sys.path}, in order to share added packages between the system
installation and a user-installed copy of the same version.
(Changed by Ronald Oussoren; bpo-4865@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4865}.)


버전 2.7.13에서 변경: As of 2.7.13, this change was removed.
@code{/Library/Python/2.7/site-packages}, the site-packages directory
used by the Apple-supplied system Python 2.7 is no longer appended to
@code{sys.path} for user-installed Pythons such as from the python.org
installers.  As of macOS 10.12, Apple changed how the system
site-packages directory is configured, which could cause installation
of pip components, like setuptools, to fail.  Packages installed for
the system Python will no longer be shared with user-installed
Pythons. (bpo-28440@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28440})

@end itemize

@node Port-Specific Changes FreeBSD,,Port-Specific Changes Mac OS X,Build and C API Changes<5>
@anchor{whatsnew/2 7 port-specific-changes-freebsd}@anchor{1570}
@subsubsection Port-Specific Changes: FreeBSD



@itemize *

@item 
FreeBSD 7.1’s @code{SO_SETFIB} constant, used with the @ref{fa0,,socket()} methods
@ref{ecf,,getsockopt()}/@ref{ed0,,setsockopt()} to select an
alternate routing table, is now available in the @ref{d1,,socket}
module.  (Added by Kyle VanderBeek; bpo-8235@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8235}.)
@end itemize

@node Other Changes and Fixes,Porting to Python 2 7,Build and C API Changes<5>,What’s New in Python 2 7
@anchor{whatsnew/2 7 other-changes-and-fixes}@anchor{1571}
@subsection Other Changes and Fixes



@itemize *

@item 
Two benchmark scripts, @code{iobench} and @code{ccbench}, were
added to the @code{Tools} directory.  @code{iobench} measures the
speed of the built-in file I/O objects returned by @ref{316,,open()}
while performing various operations, and @code{ccbench} is a
concurrency benchmark that tries to measure computing throughput,
thread switching latency, and IO processing bandwidth when
performing several tasks using a varying number of threads.

@item 
The @code{Tools/i18n/msgfmt.py} script now understands plural
forms in @code{.po} files.  (Fixed by Martin von Löwis;
bpo-5464@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5464}.)

@item 
When importing a module from a @code{.pyc} or @code{.pyo} file
with an existing @code{.py} counterpart, the @ref{1572,,co_filename}
attributes of the resulting code objects are overwritten when the
original filename is obsolete.  This can happen if the file has been
renamed, moved, or is accessed through different paths.  (Patch by
Ziga Seilnacht and Jean-Paul Calderone; bpo-1180193@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1180193}.)

@item 
The @code{regrtest.py} script now takes a @code{--randseed=}
switch that takes an integer that will be used as the random seed
for the @code{-r} option that executes tests in random order.
The @code{-r} option also reports the seed that was used
(Added by Collin Winter.)

@item 
Another @code{regrtest.py} switch is @code{-j}, which
takes an integer specifying how many tests run in parallel. This
allows reducing the total runtime on multi-core machines.
This option is compatible with several other options, including the
@code{-R} switch which is known to produce long runtimes.
(Added by Antoine Pitrou, bpo-6152@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6152}.)  This can also be used
with a new @code{-F} switch that runs selected tests in a loop
until they fail.  (Added by Antoine Pitrou; bpo-7312@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7312}.)

@item 
When executed as a script, the @code{py_compile.py} module now
accepts @code{'-'} as an argument, which will read standard input for
the list of filenames to be compiled.  (Contributed by Piotr
Ożarowski; bpo-8233@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8233}.)
@end itemize

@c ======================================================================

@node Porting to Python 2 7,New Features Added to Python 2 7 Maintenance Releases,Other Changes and Fixes,What’s New in Python 2 7
@anchor{whatsnew/2 7 porting-to-python-2-7}@anchor{1573}
@subsection Porting to Python 2.7


This section lists previously described changes and other bugfixes
that may require changes to your code:


@itemize *

@item 
The @ref{b3d,,range()} function processes its arguments more
consistently; it will now call @ref{19d,,__int__()} on non-float,
non-integer arguments that are supplied to it.  (Fixed by Alexander
Belopolsky; bpo-1533@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1533}.)

@item 
The string @ref{199,,format()} method changed the default precision used
for floating-point and complex numbers from 6 decimal
places to 12, which matches the precision used by @ref{169,,str()}.
(Changed by Eric Smith; bpo-5920@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5920}.)

@item 
Because of an optimization for the @ref{186,,with} statement, the special
methods @ref{7e3,,__enter__()} and @ref{1505,,__exit__()} must belong to the object’s
type, and cannot be directly attached to the object’s instance.  This
affects new-style classes (derived from @ref{c7d,,object}) and C extension
types.  (bpo-6101@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6101}.)

@item 
Due to a bug in Python 2.6, the `exc_value' parameter to
@ref{1505,,__exit__()} methods was often the string representation of the
exception, not an instance.  This was fixed in 2.7, so `exc_value'
will be an instance as expected.  (Fixed by Florent Xicluna;
bpo-7853@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7853}.)

@item 
When a restricted set of attributes were set using @code{__slots__},
deleting an unset attribute would not raise @ref{5ee,,AttributeError}
as you would expect.  Fixed by Benjamin Peterson; bpo-7604@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7604}.)
@end itemize

In the standard library:


@itemize *

@item 
Operations with @ref{4e2,,datetime} instances that resulted in a year
falling outside the supported range didn’t always raise
@ref{a81,,OverflowError}.  Such errors are now checked more carefully
and will now raise the exception. (Reported by Mark Leander, patch
by Anand B. Pillai and Alexander Belopolsky; bpo-7150@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7150}.)

@item 
When using @ref{1fe,,Decimal} instances with a string’s
@ref{199,,format()} method, the default alignment was previously
left-alignment.  This has been changed to right-alignment, which might
change the output of your programs.
(Changed by Mark Dickinson; bpo-6857@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6857}.)

Comparisons involving a signaling NaN value (or @code{sNAN}) now signal
@ref{12ad,,InvalidOperation} instead of silently returning a true or
false value depending on the comparison operator.  Quiet NaN values
(or @code{NaN}) are now hashable.  (Fixed by Mark Dickinson;
bpo-7279@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7279}.)

@item 
The @ref{12b,,xml.etree.ElementTree} library no longer escapes
ampersands and angle brackets when outputting an XML processing
instruction (which looks like @code{<?xml-stylesheet href="#style1"?>})
or comment (which looks like @code{<!-- comment -->}).
(Patch by Neil Muller; bpo-2746@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2746}.)

@item 
The @code{readline()} method of @ref{1128,,StringIO} objects now does
nothing when a negative length is requested, as other file-like
objects do.  (bpo-7348@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7348}).

@item 
The @ref{e2,,syslog} module will now use the value of @code{sys.argv[0]} as the
identifier instead of the previous default value of @code{'python'}.
(Changed by Sean Reifschneider; bpo-8451@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8451}.)

@item 
The @ref{e4,,tarfile} module’s default error handling has changed, to
no longer suppress fatal errors.  The default error level was previously 0,
which meant that errors would only result in a message being written to the
debug log, but because the debug log is not activated by default,
these errors go unnoticed.  The default error level is now 1,
which raises an exception if there’s an error.
(Changed by Lars Gustäbel; bpo-7357@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7357}.)

@item 
The @ref{110,,urlparse} module’s @ref{f39,,urlsplit()} now handles
unknown URL schemes in a fashion compliant with 
@geindex RFC; RFC 3986
RFC 3986@footnote{https://datatracker.ietf.org/doc/html/rfc3986.html}: if the
URL is of the form @code{"<something>://..."}, the text before the
@code{://} is treated as the scheme, even if it’s a made-up scheme that
the module doesn’t know about.  This change may break code that
worked around the old behaviour.  For example, Python 2.6.4 or 2.5
will return the following:

@example
>>> import urlparse
>>> urlparse.urlsplit('invented://host/filename?query')
('invented', '@w{'}, '//host/filename?query', '@w{'}, '@w{'})
@end example

Python 2.7 (and Python 2.6.5) will return:

@example
>>> import urlparse
>>> urlparse.urlsplit('invented://host/filename?query')
('invented', 'host', '/filename?query', '@w{'}, '@w{'})
@end example

(Python 2.7 actually produces slightly different output, since it
returns a named tuple instead of a standard tuple.)
@end itemize

For C extensions:


@itemize *

@item 
C extensions that use integer format codes with the @code{PyArg_Parse*}
family of functions will now raise a @ref{198,,TypeError} exception
instead of triggering a @ref{1a3,,DeprecationWarning} (bpo-5080@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5080}).

@item 
Use the new @ref{149a,,PyOS_string_to_double()} function instead of the old
@code{PyOS_ascii_strtod()} and @code{PyOS_ascii_atof()} functions,
which are now deprecated.
@end itemize

For applications that embed Python:


@itemize *

@item 
The @code{PySys_SetArgvEx()} function was added, letting
applications close a security hole when the existing
@code{PySys_SetArgv()} function was used.  Check whether you’re
calling @code{PySys_SetArgv()} and carefully consider whether the
application should be using @code{PySys_SetArgvEx()} with
`updatepath' set to false.
@end itemize

@c ======================================================================

@node New Features Added to Python 2 7 Maintenance Releases,Acknowledgements,Porting to Python 2 7,What’s New in Python 2 7
@anchor{whatsnew/2 7 new-features-added-to-python-2-7-maintenance-releases}@anchor{1574}@anchor{whatsnew/2 7 py27-maintenance-enhancements}@anchor{14eb}
@subsection New Features Added to Python 2.7 Maintenance Releases


New features may be added to Python 2.7 maintenance releases when the
situation genuinely calls for it. Any such additions must go through
the Python Enhancement Proposal process, and make a compelling case for why
they can’t be adequately addressed by either adding the new feature solely to
Python 3, or else by publishing it on the Python Package Index.

In addition to the specific proposals listed below, there is a general
exemption allowing new @code{-3} warnings to be added in any Python 2.7
maintenance release.

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

@end menu

@node Two new environment variables for debug mode,PEP 434 IDLE Enhancement Exception for All Branches,,New Features Added to Python 2 7 Maintenance Releases
@anchor{whatsnew/2 7 two-new-environment-variables-for-debug-mode}@anchor{1575}
@subsubsection Two new environment variables for debug mode


In debug mode, the @code{[xxx refs]} statistic is not written by default, the
@code{PYTHONSHOWREFCOUNT} environment variable now must also be set.
(Contributed by Victor Stinner; bpo-31733@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31733}.)

When Python is compiled with @code{COUNT_ALLOC} defined, allocation counts are no
longer dumped by default anymore: the @code{PYTHONSHOWALLOCCOUNT} environment
variable must now also be set. Moreover, allocation counts are now dumped into
stderr, rather than stdout. (Contributed by Victor Stinner; bpo-31692@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31692}.)


Added in version 2.7.15.


@node PEP 434 IDLE Enhancement Exception for All Branches,PEP 466 Network Security Enhancements for Python 2 7,Two new environment variables for debug mode,New Features Added to Python 2 7 Maintenance Releases
@anchor{whatsnew/2 7 pep-434-idle-enhancement-exception-for-all-branches}@anchor{1576}
@subsubsection PEP 434: IDLE Enhancement Exception for All Branches


@geindex Python 향상 제안; PEP 434
PEP 434@footnote{https://peps.python.org/pep-0434/} describes a general exemption for changes made to the IDLE
development environment shipped along with Python. This exemption makes it
possible for the IDLE developers to provide a more consistent user
experience across all supported versions of Python 2 and 3.

For details of any IDLE changes, refer to the NEWS file for the specific
release.

@node PEP 466 Network Security Enhancements for Python 2 7,PEP 477 Backport ensurepip PEP 453 to Python 2 7,PEP 434 IDLE Enhancement Exception for All Branches,New Features Added to Python 2 7 Maintenance Releases
@anchor{whatsnew/2 7 pep-466-network-security-enhancements-for-python-2-7}@anchor{1577}
@subsubsection PEP 466: Network Security Enhancements for Python 2.7


@geindex Python 향상 제안; PEP 466
PEP 466@footnote{https://peps.python.org/pep-0466/} describes a number of network security enhancement proposals
that have been approved for inclusion in Python 2.7 maintenance releases,
with the first of those changes appearing in the Python 2.7.7 release.

@geindex Python 향상 제안; PEP 466
PEP 466@footnote{https://peps.python.org/pep-0466/} related features added in Python 2.7.7:


@itemize *

@item 
@ref{12ce,,hmac.compare_digest()} was backported from Python 3 to make a timing
attack resistant comparison operation available to Python 2 applications.
(Contributed by Alex Gaynor; bpo-21306@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21306}.)

@item 
OpenSSL 1.0.1g was upgraded in the official Windows installers published on
python.org. (Contributed by Zachary Ware; bpo-21462@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21462}.)
@end itemize

@geindex Python 향상 제안; PEP 466
PEP 466@footnote{https://peps.python.org/pep-0466/} related features added in Python 2.7.8:


@itemize *

@item 
@ref{732,,hashlib.pbkdf2_hmac()} was backported from Python 3 to make a hashing
algorithm suitable for secure password storage broadly available to Python
2 applications. (Contributed by Alex Gaynor; bpo-21304@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21304}.)

@item 
OpenSSL 1.0.1h was upgraded for the official Windows installers published on
python.org. (Contributed by Zachary Ware in bpo-21671@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21671} for 
@geindex Common Vulnerabilities and Exposures; CVE 2014-0224
CVE 2014-0224@footnote{https://www.cve.org/CVERecord?id=CVE-2014-0224}.)
@end itemize

@geindex Python 향상 제안; PEP 466
PEP 466@footnote{https://peps.python.org/pep-0466/} related features added in Python 2.7.9:


@itemize *

@item 
Most of Python 3.4’s @ref{d5,,ssl} module was backported. This means @code{ssl}
now supports Server Name Indication, TLS1.x settings, access to the platform
certificate store, the @ref{357,,SSLContext} class, and other
features. (Contributed by Alex Gaynor and David Reid; bpo-21308@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21308}.)

Refer to the “Version added: 2.7.9” notes in the module documentation for
specific details.

@item 
@ref{745,,os.urandom()} was changed to cache a file descriptor to @code{/dev/urandom}
instead of reopening @code{/dev/urandom} on every call. (Contributed by Alex
Gaynor; bpo-21305@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21305}.)

@item 
@ref{1578,,hashlib.algorithms_guaranteed} and
@ref{1579,,hashlib.algorithms_available} were backported from Python 3 to make
it easier for Python 2 applications to select the strongest available hash
algorithm. (Contributed by Alex Gaynor in bpo-21307@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21307})
@end itemize

@node PEP 477 Backport ensurepip PEP 453 to Python 2 7,PEP 476 Enabling certificate verification by default for stdlib http clients<2>,PEP 466 Network Security Enhancements for Python 2 7,New Features Added to Python 2 7 Maintenance Releases
@anchor{whatsnew/2 7 pep-477-backport-ensurepip-pep-453-to-python-2-7}@anchor{157a}
@subsubsection PEP 477: Backport ensurepip (PEP 453) to Python 2.7


@geindex Python 향상 제안; PEP 477
PEP 477@footnote{https://peps.python.org/pep-0477/} approves the inclusion of the 
@geindex Python 향상 제안; PEP 453
PEP 453@footnote{https://peps.python.org/pep-0453/} ensurepip module and the
improved documentation that was enabled by it in the Python 2.7 maintenance
releases, appearing first in the Python 2.7.9 release.

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

@end menu

@node Bootstrapping pip By Default<2>,Documentation Changes<2>,,PEP 477 Backport ensurepip PEP 453 to Python 2 7
@anchor{whatsnew/2 7 bootstrapping-pip-by-default}@anchor{157b}
@subsubsection Bootstrapping pip By Default


The new @ref{59,,ensurepip} module (defined in 
@geindex Python 향상 제안; PEP 453
PEP 453@footnote{https://peps.python.org/pep-0453/}) provides a standard
cross-platform mechanism to bootstrap the pip installer into Python
installations. The version of @code{pip} included with Python 2.7.9 is @code{pip}
1.5.6, and future 2.7.x maintenance releases will update the bundled version to
the latest version of @code{pip} that is available at the time of creating the
release candidate.

By default, the commands @code{pip}, @code{pipX} and @code{pipX.Y} will be installed on
all platforms (where X.Y stands for the version of the Python installation),
along with the @code{pip} Python package and its dependencies.

For CPython @ref{10f5,,source builds on POSIX systems},
the @code{make install} and @code{make altinstall} commands do not bootstrap @code{pip}
by default.  This behaviour can be controlled through configure options, and
overridden through Makefile options.

On Windows and Mac OS X, the CPython installers now default to installing
@code{pip} along with CPython itself (users may opt out of installing it
during the installation process). Window users will need to opt in to the
automatic @code{PATH} modifications to have @code{pip} available from the command
line by default, otherwise it can still be accessed through the Python
launcher for Windows as @code{py -m pip}.

As 
@geindex Python 향상 제안; PEP 0477#disabling-ensurepip-by-downstream-distributors
discussed in the PEP@footnote{https://peps.python.org/pep-0477/#disabling-ensurepip-by-downstream-distributors},
platform packagers may choose not to install
these commands by default, as long as, when invoked, they provide clear and
simple directions on how to install them on that platform (usually using
the system package manager).

@node Documentation Changes<2>,,Bootstrapping pip By Default<2>,PEP 477 Backport ensurepip PEP 453 to Python 2 7
@anchor{whatsnew/2 7 documentation-changes}@anchor{157c}
@subsubsection Documentation Changes


As part of this change, the @ref{10f7,,파이썬 모듈 설치하기} and
distributing-index sections of the documentation have been
completely redesigned as short getting started and FAQ documents. Most
packaging documentation has now been moved out to the Python Packaging
Authority maintained Python Packaging User Guide@footnote{https://packaging.python.org} and the documentation of the individual
projects.

However, as this migration is currently still incomplete, the legacy
versions of those guides remaining available as @ref{10f8,,setuptools로 C와 C++ 확장 빌드하기}
and @ref{10f9,,setuptools로 C와 C++ 확장 빌드하기}.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 453

@item PEP 453@footnote{https://peps.python.org/pep-0453/} – Explicit bootstrapping of pip in Python installations

PEP written by Donald Stufft and Nick Coghlan, implemented by
Donald Stufft, Nick Coghlan, Martin von Löwis and Ned Deily.
@end table


@node PEP 476 Enabling certificate verification by default for stdlib http clients<2>,PEP 493 HTTPS verification migration tools for Python 2 7,PEP 477 Backport ensurepip PEP 453 to Python 2 7,New Features Added to Python 2 7 Maintenance Releases
@anchor{whatsnew/2 7 pep-476-enabling-certificate-verification-by-default-for-stdlib-http-clients}@anchor{157d}
@subsubsection PEP 476: Enabling certificate verification by default for stdlib http clients


@geindex Python 향상 제안; PEP 476
PEP 476@footnote{https://peps.python.org/pep-0476/} updated @ref{72,,httplib} and modules which use it, such as
@ref{111,,urllib2} and @ref{134,,xmlrpclib}, to now
verify that the server
presents a certificate which is signed by a Certificate Authority in the
platform trust store and whose hostname matches the hostname being requested
by default, significantly improving security for many applications. This
change was made in the Python 2.7.9 release.

For applications which require the old previous behavior, they can pass an
alternate context:

@example
import urllib2
import ssl

# This disables all verification
context = ssl._create_unverified_context()

# This allows using a specific certificate for the host, which doesn't need
# to be in the trust store
context = ssl.create_default_context(cafile="/path/to/file.crt")

urllib2.urlopen("https://invalid-cert", context=context)
@end example

@node PEP 493 HTTPS verification migration tools for Python 2 7,New make regen-all build target,PEP 476 Enabling certificate verification by default for stdlib http clients<2>,New Features Added to Python 2 7 Maintenance Releases
@anchor{whatsnew/2 7 pep-493-https-verification-migration-tools-for-python-2-7}@anchor{157e}
@subsubsection PEP 493: HTTPS verification migration tools for Python 2.7


@geindex Python 향상 제안; PEP 493
PEP 493@footnote{https://peps.python.org/pep-0493/} provides additional migration tools to support a more incremental
infrastructure upgrade process for environments containing applications and
services relying on the historically permissive processing of server
certificates when establishing client HTTPS connections.  These additions were
made in the Python 2.7.12 release.

These tools are intended for use in cases where affected applications and
services can’t be modified to explicitly pass a more permissive SSL context
when establishing the connection.

For applications and services which can’t be modified at all, the new
@code{PYTHONHTTPSVERIFY} environment variable may be set to @code{0} to revert an
entire Python process back to the default permissive behaviour of Python 2.7.8
and earlier.

For cases where the connection establishment code can’t be modified, but the
overall application can be, the new @code{ssl._https_verify_certificates()}
function can be used to adjust the default behaviour at runtime.

@node New make regen-all build target,Removal of make touch build target,PEP 493 HTTPS verification migration tools for Python 2 7,New Features Added to Python 2 7 Maintenance Releases
@anchor{whatsnew/2 7 new-make-regen-all-build-target}@anchor{157f}
@subsubsection New @code{make regen-all} build target


To simplify cross-compilation, and to ensure that CPython can reliably be
compiled without requiring an existing version of Python to already be
available, the autotools-based build system no longer attempts to implicitly
recompile generated files based on file modification times.

Instead, a new @code{make regen-all} command has been added to force regeneration
of these files when desired (e.g. after an initial version of Python has
already been built based on the pregenerated versions).

More selective regeneration targets are also defined - see
Makefile.pre.in@footnote{https://github.com/python/cpython/tree/3.14/Makefile.pre.in} for details.

(Contributed by Victor Stinner in bpo-23404@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23404}.)


Added in version 2.7.14.


@node Removal of make touch build target,,New make regen-all build target,New Features Added to Python 2 7 Maintenance Releases
@anchor{whatsnew/2 7 removal-of-make-touch-build-target}@anchor{1580}
@subsubsection Removal of @code{make touch} build target


The @code{make touch} build target previously used to request implicit regeneration
of generated files by updating their modification times has been removed.

It has been replaced by the new @code{make regen-all} target.

(Contributed by Victor Stinner in bpo-23404@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23404}.)


버전 2.7.14에서 변경.


@c ======================================================================

@node Acknowledgements,,New Features Added to Python 2 7 Maintenance Releases,What’s New in Python 2 7
@anchor{whatsnew/2 7 acknowledgements}@anchor{1581}@anchor{whatsnew/2 7 acks27}@anchor{1582}
@subsection Acknowledgements


The author would like to thank the following people for offering
suggestions, corrections and assistance with various drafts of this
article: Nick Coghlan, Philip Jenvey, Ryan Lovett, R. David Murray,
Hugh Secker-Walker.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node What’s New in Python 2 6,What’s New in Python 2 5,What’s New in Python 2 7,파이썬의 새로운 기능
@anchor{whatsnew/2 6 doc}@anchor{1583}@anchor{whatsnew/2 6 translation-repo}@anchor{1584}@anchor{whatsnew/2 6 what-s-new-in-python-2-6}@anchor{1585}@anchor{whatsnew/2 6 whats-new-in-2-6}@anchor{14b2}
@section What’s New in Python 2.6


@*Author: 
A.M. Kuchling (amk at amk.ca)


@c $Id$
@c Rules for maintenance:
@c 
@c * Anyone can add text to this document.  Do not spend very much time
@c on the wording of your changes, because your text will probably
@c get rewritten to some degree.
@c 
@c * The maintainer will go through Misc/NEWS periodically and add
@c changes; it's therefore more important to add your changes to
@c Misc/NEWS than to this file.
@c 
@c * This is not a complete list of every single change; completeness
@c is the purpose of Misc/NEWS.  Some changes I consider too small
@c or esoteric to include.  If such a change is added to the text,
@c I'll just remove it.  (This is another reason you shouldn't spend
@c too much time on writing your addition.)
@c 
@c * If you want to draw your new text to the attention of the
@c maintainer, add 'XXX' to the beginning of the paragraph or
@c section.
@c 
@c * It's OK to just add a fragmentary note about a change.  For
@c example: "XXX Describe the transmogrify() function added to the
@c socket module."  The maintainer will research the change and
@c write the necessary text.
@c 
@c * You can comment out your additions if you like, but it's not
@c necessary (especially when a final release is some months away).
@c 
@c * Credit the author of a patch or bugfix.   Just the name is
@c sufficient; the e-mail address isn't necessary.
@c 
@c * It's helpful to add the bug/patch number in a parenthetical comment.
@c 
@c XXX Describe the transmogrify() function added to the socket
@c module.
@c (Contributed by P.Y. Developer; :issue:`12345`.)
@c 
@c This saves the maintainer some effort going through the SVN logs
@c when researching a change.

This article explains the new features in Python 2.6, released on October 1,
2008.  The release schedule is described in 
@geindex Python 향상 제안; PEP 361
PEP 361@footnote{https://peps.python.org/pep-0361/}.

The major theme of Python 2.6 is preparing the migration path to
Python 3.0, a major redesign of the language.  Whenever possible,
Python 2.6 incorporates new features and syntax from 3.0 while
remaining compatible with existing code by not removing older features
or syntax.  When it’s not possible to do that, Python 2.6 tries to do
what it can, adding compatibility functions in a
@code{future_builtins} module and a @code{-3} switch to warn about
usages that will become unsupported in 3.0.

Some significant new packages have been added to the standard library,
such as the @ref{98,,multiprocessing} and @ref{86,,json} modules, but
there aren’t many new features that aren’t related to Python 3.0 in
some way.

Python 2.6 also sees a number of improvements and bugfixes throughout
the source.  A search through the change logs finds there were 259
patches applied and 612 bugs fixed between Python 2.5 and 2.6.  Both
figures are likely to be underestimates.

This article doesn’t attempt to provide a complete specification of
the new features, but instead provides a convenient overview.  For
full details, you should refer to the documentation for Python 2.6. If
you want to understand the rationale for the design and
implementation, refer to the PEP for a particular new feature.
Whenever possible, “What’s New in Python” links to the bug/patch item
for each change.

@c Compare with previous release in 2 - 3 sentences here.
@c add hyperlink when the documentation becomes available online.

@c ========================================================================

@c Large, PEP-level features and changes should be described here.

@c ========================================================================

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

@end menu

@node Python 3 0,Changes to the Development Process,,What’s New in Python 2 6
@anchor{whatsnew/2 6 python-3-0}@anchor{1586}
@subsection Python 3.0


The development cycle for Python versions 2.6 and 3.0 was
synchronized, with the alpha and beta releases for both versions being
made on the same days.  The development of 3.0 has influenced many
features in 2.6.

Python 3.0 is a far-ranging redesign of Python that breaks
compatibility with the 2.x series.  This means that existing Python
code will need some conversion in order to run on
Python 3.0.  However, not all the changes in 3.0 necessarily break
compatibility.  In cases where new features won’t cause existing code
to break, they’ve been backported to 2.6 and are described in this
document in the appropriate place.  Some of the 3.0-derived features
are:


@itemize *

@item 
A @code{__complex__()} method for converting objects to a complex number.

@item 
Alternate syntax for catching exceptions: @code{except TypeError as exc}.

@item 
The addition of @ref{21a,,functools.reduce()} as a synonym for the built-in
@code{reduce()} function.
@end itemize

Python 3.0 adds several new built-in functions and changes the
semantics of some existing builtins.  Functions that are new in 3.0
such as @ref{14ad,,bin()} have simply been added to Python 2.6, but existing
builtins haven’t been changed; instead, the @code{future_builtins}
module has versions with the new 3.0 semantics.  Code written to be
compatible with 3.0 can do @code{from future_builtins import hex, map} as
necessary.

A new command-line switch, @code{-3}, enables warnings
about features that will be removed in Python 3.0.  You can run code
with this switch to see how much work will be necessary to port
code to 3.0.  The value of this switch is available
to Python code as the boolean variable @code{sys.py3kwarning},
and to C extension code as @code{Py_Py3kWarningFlag}.


@subsubheading 더 보기


The 3`xxx' series of PEPs, which contains proposals for Python 3.0.
@geindex Python 향상 제안; PEP 3000
PEP 3000@footnote{https://peps.python.org/pep-3000/} describes the development process for Python 3.0.
Start with 
@geindex Python 향상 제안; PEP 3100
PEP 3100@footnote{https://peps.python.org/pep-3100/} that describes the general goals for Python
3.0, and then explore the higher-numbered PEPs that propose
specific features.


@node Changes to the Development Process,PEP 343 The ‘with’ statement,Python 3 0,What’s New in Python 2 6
@anchor{whatsnew/2 6 changes-to-the-development-process}@anchor{1587}
@subsection Changes to the Development Process


While 2.6 was being developed, the Python development process
underwent two significant changes: we switched from SourceForge’s
issue tracker to a customized Roundup installation, and the
documentation was converted from LaTeX to reStructuredText.

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

@end menu

@node New Issue Tracker Roundup,New Documentation Format reStructuredText Using Sphinx,,Changes to the Development Process
@anchor{whatsnew/2 6 new-issue-tracker-roundup}@anchor{1588}
@subsubsection New Issue Tracker: Roundup


For a long time, the Python developers had been growing increasingly
annoyed by SourceForge’s bug tracker.  SourceForge’s hosted solution
doesn’t permit much customization; for example, it wasn’t possible to
customize the life cycle of issues.

The infrastructure committee of the Python Software Foundation
therefore posted a call for issue trackers, asking volunteers to set
up different products and import some of the bugs and patches from
SourceForge.  Four different trackers were examined: Jira@footnote{https://www.atlassian.com/software/jira/},
Launchpad@footnote{https://launchpad.net/},
Roundup@footnote{https://roundup.sourceforge.io/}, and
Trac@footnote{https://trac.edgewall.org/}.
The committee eventually settled on Jira
and Roundup as the two candidates.  Jira is a commercial product that
offers no-cost hosted instances to free-software projects; Roundup
is an open-source project that requires volunteers
to administer it and a server to host it.

After posting a call for volunteers, a new Roundup installation was
set up at @indicateurl{https://bugs.python.org}.  One installation of Roundup can
host multiple trackers, and this server now also hosts issue trackers
for Jython and for the Python web site.  It will surely find
other uses in the future.  Where possible,
this edition of “What’s New in Python” links to the bug/patch
item for each change.

Hosting of the Python bug tracker is kindly provided by
Upfront Systems@footnote{https://upfrontsoftware.co.za}
of Stellenbosch, South Africa.  Martin von Löwis put a
lot of effort into importing existing bugs and patches from
SourceForge; his scripts for this import operation are at
@code{https://svn.python.org/view/tracker/importer/} and may be useful to
other projects wishing to move from SourceForge to Roundup.


@subsubheading 더 보기



@table @asis

@item @indicateurl{https://bugs.python.org}

The Python bug tracker.

@item @indicateurl{https://bugs.jython.org}:

The Jython bug tracker.

@item @indicateurl{https://roundup.sourceforge.io/}

Roundup downloads and documentation.

@item @indicateurl{https://svn.python.org/view/tracker/importer/}

Martin von Löwis’s conversion scripts.
@end table


@node New Documentation Format reStructuredText Using Sphinx,,New Issue Tracker Roundup,Changes to the Development Process
@anchor{whatsnew/2 6 new-documentation-format-restructuredtext-using-sphinx}@anchor{1589}
@subsubsection New Documentation Format: reStructuredText Using Sphinx


The Python documentation was written using LaTeX since the project
started around 1989.  In the 1980s and early 1990s, most documentation
was printed out for later study, not viewed online. LaTeX was widely
used because it provided attractive printed output while remaining
straightforward to write once the basic rules of the markup were
learned.

Today LaTeX is still used for writing publications destined for
printing, but the landscape for programming tools has shifted.  We no
longer print out reams of documentation; instead, we browse through it
online and HTML has become the most important format to support.
Unfortunately, converting LaTeX to HTML is fairly complicated and Fred
L. Drake Jr., the long-time Python documentation editor, spent a lot
of time maintaining the conversion process.  Occasionally people would
suggest converting the documentation into SGML and later XML, but
performing a good conversion is a major task and no one ever committed
the time required to finish the job.

During the 2.6 development cycle, Georg Brandl put a lot of effort
into building a new toolchain for processing the documentation.  The
resulting package is called Sphinx, and is available from
@indicateurl{https://www.sphinx-doc.org/}.

Sphinx concentrates on HTML output, producing attractively styled and
modern HTML; printed output is still supported through conversion to
LaTeX.  The input format is reStructuredText, a markup syntax
supporting custom extensions and directives that is commonly used in
the Python community.

Sphinx is a standalone package that can be used for writing, and
almost two dozen other projects
(listed on the Sphinx web site@footnote{https://www.sphinx-doc.org/en/master/examples.html})
have adopted Sphinx as their documentation tool.


@subsubheading 더 보기



@table @asis

@item Documenting Python@footnote{https://devguide.python.org/documenting/}

Describes how to write for Python’s documentation.

@item Sphinx@footnote{https://www.sphinx-doc.org/}

Documentation and code for the Sphinx toolchain.

@item Docutils@footnote{https://docutils.sourceforge.io}

The underlying reStructuredText parser and toolset.
@end table


@node PEP 343 The ‘with’ statement,PEP 366 Explicit Relative Imports From a Main Module,Changes to the Development Process,What’s New in Python 2 6
@anchor{whatsnew/2 6 pep-0343}@anchor{14b3}@anchor{whatsnew/2 6 pep-343-the-with-statement}@anchor{158a}
@subsection PEP 343: The ‘with’ statement


The previous version, Python 2.5, added the ‘@ref{186,,with}’
statement as an optional feature, to be enabled by a @code{from __future__
import with_statement} directive.  In 2.6 the statement no longer needs to
be specially enabled; this means that @code{with} is now always a
keyword.  The rest of this section is a copy of the corresponding
section from the “What’s New in Python 2.5” document; if you’re
familiar with the ‘@code{with}’ statement
from Python 2.5, you can skip this section.

The ‘@ref{186,,with}’ statement clarifies code that previously would use
@code{try...finally} blocks to ensure that clean-up code is executed.  In this
section, I’ll discuss the statement as it will commonly be used.  In the next
section, I’ll examine the implementation details and show how to write objects
for use with this statement.

The ‘@ref{186,,with}’ statement is a control-flow structure whose basic
structure is:

@example
with expression [as variable]:
    with-block
@end example

The expression is evaluated, and it should result in an object that supports the
context management protocol (that is, has @ref{7e3,,__enter__()} and @ref{1505,,__exit__()}
methods).

The object’s @ref{7e3,,__enter__()} is called before `with-block' is executed and
therefore can run set-up code. It also may return a value that is bound to the
name `variable', if given.  (Note carefully that `variable' is `not' assigned
the result of `expression'.)

After execution of the `with-block' is finished, the object’s @ref{1505,,__exit__()}
method is called, even if the block raised an exception, and can therefore run
clean-up code.

Some standard Python objects now support the context management protocol and can
be used with the ‘@ref{186,,with}’ statement. File objects are one example:

@example
with open('/etc/passwd', 'r') as f:
    for line in f:
        print line
        ... more processing code ...
@end example

After this statement has executed, the file object in `f' will have been
automatically closed, even if the @ref{34a,,for} loop raised an exception
part-way through the block.

@cartouche
@quotation 참고 
In this case, `f' is the same object created by @ref{316,,open()}, because
@ref{7e3,,__enter__()} returns `self'.
@end quotation
@end cartouche

The @ref{f3,,threading} module’s locks and condition variables  also support the
‘@ref{186,,with}’ statement:

@example
lock = threading.Lock()
with lock:
    # Critical section of code
    ...
@end example

The lock is acquired before the block is executed and always released once  the
block is complete.

The @ref{158b,,localcontext()} function in the @ref{3a,,decimal} module makes
it easy to save and restore the current decimal context, which encapsulates
the desired precision and rounding characteristics for computations:

@example
from decimal import Decimal, Context, localcontext

# Displays with default precision of 28 digits
v = Decimal('578')
print v.sqrt()

with localcontext(Context(prec=16)):
    # All code in this block uses a precision of 16 digits.
    # The original context is restored on exiting the block.
    print v.sqrt()
@end example

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

@end menu

@node Writing Context Managers,The contextlib module,,PEP 343 The ‘with’ statement
@anchor{whatsnew/2 6 new-26-context-managers}@anchor{14b4}@anchor{whatsnew/2 6 writing-context-managers}@anchor{158c}
@subsubsection Writing Context Managers


Under the hood, the ‘@ref{186,,with}’ statement is fairly complicated. Most
people will only use ‘@code{with}’ in company with existing objects and
don’t need to know these details, so you can skip the rest of this section if
you like.  Authors of new objects will need to understand the details of the
underlying implementation and should keep reading.

A high-level explanation of the context management protocol is:


@itemize *

@item 
The expression is evaluated and should result in an object called a “context
manager”.  The context manager must have @ref{7e3,,__enter__()} and
@ref{1505,,__exit__()} methods.

@item 
The context manager’s @ref{7e3,,__enter__()} method is called.  The value
returned is assigned to `VAR'.  If no @code{as VAR} clause is present, the
value is simply discarded.

@item 
The code in `BLOCK' is executed.

@item 
If `BLOCK' raises an exception, the context manager’s @ref{1505,,__exit__()} method
is called with three arguments, the exception details (@code{type, value, traceback},
the same values returned by @ref{899,,sys.exc_info()}, which can also be @code{None}
if no exception occurred).  The method’s return value controls whether an exception
is re-raised: any false value re-raises the exception, and @code{True} will result
in suppressing it.  You’ll only rarely want to suppress the exception, because
if you do the author of the code containing the ‘@ref{186,,with}’ statement will
never realize anything went wrong.

@item 
If `BLOCK' didn’t raise an exception,  the @ref{1505,,__exit__()} method is still
called, but `type', `value', and `traceback' are all @code{None}.
@end itemize

Let’s think through an example.  I won’t present detailed code but will only
sketch the methods necessary for a database that supports transactions.

(For people unfamiliar with database terminology: a set of changes to the
database are grouped into a transaction.  Transactions can be either committed,
meaning that all the changes are written into the database, or rolled back,
meaning that the changes are all discarded and the database is unchanged.  See
any database textbook for more information.)

Let’s assume there’s an object representing a database connection. Our goal will
be to let the user write code like this:

@example
db_connection = DatabaseConnection()
with db_connection as cursor:
    cursor.execute('insert into ...')
    cursor.execute('delete from ...')
    # ... more operations ...
@end example

The transaction should be committed if the code in the block runs flawlessly or
rolled back if there’s an exception. Here’s the basic interface for
@code{DatabaseConnection} that I’ll assume:

@example
class DatabaseConnection:
    # Database interface
    def cursor(self):
        "Returns a cursor object and starts a new transaction"
    def commit(self):
        "Commits current transaction"
    def rollback(self):
        "Rolls back current transaction"
@end example

The @ref{7e3,,__enter__()} method is pretty easy, having only to start a new
transaction.  For this application the resulting cursor object would be a useful
result, so the method will return it.  The user can then add @code{as cursor} to
their ‘@ref{186,,with}’ statement to bind the cursor to a variable name.

@example
class DatabaseConnection:
    ...
    def __enter__(self):
        # Code to start a new transaction
        cursor = self.cursor()
        return cursor
@end example

The @ref{1505,,__exit__()} method is the most complicated because it’s where most of
the work has to be done.  The method has to check if an exception occurred.  If
there was no exception, the transaction is committed.  The transaction is rolled
back if there was an exception.

In the code below, execution will just fall off the end of the function,
returning the default value of @code{None}.  @code{None} is false, so the exception
will be re-raised automatically.  If you wished, you could be more explicit and
add a @ref{1af,,return} statement at the marked location.

@example
class DatabaseConnection:
    ...
    def __exit__(self, type, value, tb):
        if tb is None:
            # No exception, so commit
            self.commit()
        else:
            # Exception occurred, so rollback.
            self.rollback()
            # return False
@end example

@node The contextlib module,,Writing Context Managers,PEP 343 The ‘with’ statement
@anchor{whatsnew/2 6 new-module-contextlib}@anchor{14b5}@anchor{whatsnew/2 6 the-contextlib-module}@anchor{158d}
@subsubsection The contextlib module


The @ref{27,,contextlib} module provides some functions and a decorator that
are useful when writing objects for use with the ‘@ref{186,,with}’ statement.

The decorator is called @ref{1407,,contextmanager()}, and lets you write
a single generator function instead of defining a new class.  The generator
should yield exactly one value.  The code up to the @ref{bc1,,yield} will be
executed as the @ref{7e3,,__enter__()} method, and the value yielded will
be the method’s return value that will get bound to the variable in the
‘@ref{186,,with}’ statement’s @code{as} clause, if any.  The code after
the @code{yield} will be executed in the @ref{1505,,__exit__()} method.
Any exception raised in the block will be raised by the @code{yield}
statement.

Using this decorator, our database example from the previous section
could be written as:

@example
from contextlib import contextmanager

@@contextmanager
def db_transaction(connection):
    cursor = connection.cursor()
    try:
        yield cursor
    except:
        connection.rollback()
        raise
    else:
        connection.commit()

db = DatabaseConnection()
with db_transaction(db) as cursor:
    ...
@end example

The @ref{27,,contextlib} module also has a @code{nested(mgr1, mgr2, ...)} function
that combines a number of context managers so you don’t need to write nested
‘@ref{186,,with}’ statements.  In this example, the single ‘@code{with}’
statement both starts a database transaction and acquires a thread lock:

@example
lock = threading.Lock()
with nested (db_transaction(db), lock) as (cursor, locked):
    ...
@end example

Finally, the @ref{158e,,closing()} function returns its argument so that it can be
bound to a variable, and calls the argument’s @code{.close()} method at the end
of the block.

@example
import urllib, sys
from contextlib import closing

with closing(urllib.urlopen('http://www.yahoo.com')) as f:
    for line in f:
        sys.stdout.write(line)
@end example


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 343

@item PEP 343@footnote{https://peps.python.org/pep-0343/} - The “with” statement

PEP written by Guido van Rossum and Nick Coghlan; implemented by Mike Bland,
Guido van Rossum, and Neal Norwitz.  The PEP shows the code generated for a
‘@ref{186,,with}’ statement, which can be helpful in learning how the statement
works.
@end table

The documentation  for the @ref{27,,contextlib} module.


@c ======================================================================

@node PEP 366 Explicit Relative Imports From a Main Module,PEP 370 Per-user site-packages Directory,PEP 343 The ‘with’ statement,What’s New in Python 2 6
@anchor{whatsnew/2 6 pep-0366}@anchor{14b6}@anchor{whatsnew/2 6 pep-366-explicit-relative-imports-from-a-main-module}@anchor{158f}
@subsection PEP 366: Explicit Relative Imports From a Main Module


Python’s @ref{23c,,-m} switch allows running a module as a script.
When you ran a module that was located inside a package, relative
imports didn’t work correctly.

The fix for Python 2.6 adds a @ref{323,,module.__package__} attribute.
When this attribute is present, relative imports will be
relative to the value of this attribute instead of the
@ref{1590,,__name__} attribute.

PEP 302-style importers can then set @ref{323,,__package__} as necessary.
The @ref{c3,,runpy} module that implements the @ref{23c,,-m} switch now
does this, so relative imports will now work correctly in scripts
running from inside a package.

@c ======================================================================

@node PEP 370 Per-user site-packages Directory,PEP 371 The multiprocessing Package,PEP 366 Explicit Relative Imports From a Main Module,What’s New in Python 2 6
@anchor{whatsnew/2 6 pep-0370}@anchor{14b7}@anchor{whatsnew/2 6 pep-370-per-user-site-packages-directory}@anchor{1591}
@subsection PEP 370: Per-user @code{site-packages} Directory


When you run Python, the module search path @code{sys.path} usually
includes a directory whose path ends in @code{"site-packages"}.  This
directory is intended to hold locally installed packages available to
all users using a machine or a particular site installation.

Python 2.6 introduces a convention for user-specific site directories.
The directory varies depending on the platform:


@itemize *

@item 
Unix and Mac OS X: @code{~/.local/}

@item 
Windows: @code{%APPDATA%/Python}
@end itemize

Within this directory, there will be version-specific subdirectories,
such as @code{lib/python2.6/site-packages} on Unix/Mac OS and
@code{Python26/site-packages} on Windows.

If you don’t like the default directory, it can be overridden by an
environment variable.  
@geindex PYTHONUSERBASE
@geindex 환경 변수; PYTHONUSERBASE
@ref{1592,,PYTHONUSERBASE} sets the root
directory used for all Python versions supporting this feature.  On
Windows, the directory for application-specific data can be changed by
setting the @code{APPDATA} environment variable.  You can also
modify the @code{site.py} file for your Python installation.

The feature can be disabled entirely by running Python with the
@ref{1593,,-s} option or setting the 
@geindex PYTHONNOUSERSITE
@geindex 환경 변수; PYTHONNOUSERSITE
@ref{1594,,PYTHONNOUSERSITE}
environment variable.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 370

@item PEP 370@footnote{https://peps.python.org/pep-0370/} - Per-user @code{site-packages} Directory

PEP written and implemented by Christian Heimes.
@end table


@c ======================================================================

@node PEP 371 The multiprocessing Package,PEP 3101 Advanced String Formatting,PEP 370 Per-user site-packages Directory,What’s New in Python 2 6
@anchor{whatsnew/2 6 pep-0371}@anchor{14b8}@anchor{whatsnew/2 6 pep-371-the-multiprocessing-package}@anchor{1595}
@subsection PEP 371: The @code{multiprocessing} Package


The new @ref{98,,multiprocessing} package lets Python programs create new
processes that will perform a computation and return a result to the
parent.  The parent and child processes can communicate using queues
and pipes, synchronize their operations using locks and semaphores,
and can share simple arrays of data.

The @ref{98,,multiprocessing} module started out as an exact emulation of
the @ref{f3,,threading} module using processes instead of threads.  That
goal was discarded along the path to Python 2.6, but the general
approach of the module is still similar.  The fundamental class
is the @ref{252,,Process}, which is passed a callable object and
a collection of arguments.  The @ref{1596,,start()} method
sets the callable running in a subprocess, after which you can call
the @ref{1597,,is_alive()} method to check whether the
subprocess is still running and the @ref{1598,,join()}
method to wait for the process to exit.

Here’s a simple example where the subprocess will calculate a
factorial.  The function doing the calculation is written strangely so
that it takes significantly longer when the input argument is a
multiple of 4.

@example
import time
from multiprocessing import Process, Queue


def factorial(queue, N):
    "Compute a factorial."
    # If N is a multiple of 4, this function will take much longer.
    if (N % 4) == 0:
        time.sleep(.05 * N/4)

    # Calculate the result
    fact = 1L
    for i in range(1, N+1):
        fact = fact * i

    # Put the result on the queue
    queue.put(fact)

if __name__ == '__main__':
    queue = Queue()

    N = 5

    p = Process(target=factorial, args=(queue, N))
    p.start()
    p.join()

    result = queue.get()
    print 'Factorial', N, '=', result
@end example

A @ref{1599,,Queue} is used to communicate the result of the factorial.
The @code{Queue} object is stored in a global variable.
The child process will use the value of the variable when the child
was created; because it’s a @code{Queue}, parent and child can use
the object to communicate.  (If the parent were to change the value of
the global variable, the child’s value would be unaffected, and vice
versa.)

Two other classes, @ref{116a,,Pool} and
@ref{250,,Manager}, provide higher-level interfaces.
@code{Pool} will create a fixed number of worker
processes, and requests can then be distributed to the workers by calling
@ref{159a,,apply()} or
@ref{159b,,apply_async()} to add a single request, and
@ref{12ea,,map()} or
@ref{12eb,,map_async()} to add a number of
requests.  The following code uses a @code{Pool} to
spread requests across 5 worker processes and retrieve a list of results:

@example
from multiprocessing import Pool

def factorial(N, dictionary):
    "Compute a factorial."
    ...
p = Pool(5)
result = p.map(factorial, range(1, 1000, 10))
for v in result:
    print v
@end example

This produces the following output:

@example
1
39916800
51090942171709440000
8222838654177922817725562880000000
33452526613163807108170062053440751665152000000000
...
@end example

The other high-level interface, the @ref{250,,Manager} class,
creates a separate server process that can hold master copies of Python data
structures.  Other processes can then access and modify these data
structures using proxy objects.  The following example creates a
shared dictionary by calling the @ref{183,,dict()} method; the worker
processes then insert values into the dictionary.  (Locking is not
done for you automatically, which doesn’t matter in this example.
@code{Manager}’s methods also include
@ref{159c,,Lock()},
@ref{159d,,RLock()},
and @ref{159e,,Semaphore()} to create
shared locks.)

@example
import time
from multiprocessing import Pool, Manager

def factorial(N, dictionary):
    "Compute a factorial."
    # Calculate the result
    fact = 1L
    for i in range(1, N+1):
        fact = fact * i

    # Store result in dictionary
    dictionary[N] = fact

if __name__ == '__main__':
    p = Pool(5)
    mgr = Manager()
    d = mgr.dict()         # Create shared dictionary

    # Run tasks using the pool
    for N in range(1, 1000, 10):
        p.apply_async(factorial, (N, d))

    # Mark pool as closed -- no more tasks can be added.
    p.close()

    # Wait for tasks to exit
    p.join()

    # Output results
    for k, v in sorted(d.items()):
        print k, v
@end example

This will produce the output:

@example
1 1
11 39916800
21 51090942171709440000
31 8222838654177922817725562880000000
41 33452526613163807108170062053440751665152000000000
51 15511187532873822802242430164693032110632597200169861120000...
@end example


@subsubheading 더 보기


The documentation for the @ref{98,,multiprocessing} module.


@table @asis

@geindex Python 향상 제안; PEP 371

@item PEP 371@footnote{https://peps.python.org/pep-0371/} - Addition of the multiprocessing package

PEP written by Jesse Noller and Richard Oudkerk;
implemented by Richard Oudkerk and Jesse Noller.
@end table


@c ======================================================================

@node PEP 3101 Advanced String Formatting,PEP 3105 print As a Function,PEP 371 The multiprocessing Package,What’s New in Python 2 6
@anchor{whatsnew/2 6 pep-3101}@anchor{14b9}@anchor{whatsnew/2 6 pep-3101-advanced-string-formatting}@anchor{159f}
@subsection PEP 3101: Advanced String Formatting


In Python 3.0, the @code{%} operator is supplemented by a more powerful string
formatting method, @ref{199,,format()}.  Support for the @ref{832,,str.format()} method
has been backported to Python 2.6.

In 2.6, both 8-bit and Unicode strings have a @code{.format()} method that
treats the string as a template and takes the arguments to be formatted.
The formatting template uses curly brackets (@code{@{}, @code{@}}) as special characters:

@example
>>> # Substitute positional argument 0 into the string.
>>> "User ID: @{0@}".format("root")
'User ID: root'
>>> # Use the named keyword arguments
>>> "User ID: @{uid@}   Last seen: @{last_login@}".format(
...    uid="root",
...    last_login = "5 Mar 2008 07:20")
'User ID: root   Last seen: 5 Mar 2008 07:20'
@end example

Curly brackets can be escaped by doubling them:

@example
>>> "Empty dict: @{@{@}@}".format()
"Empty dict: @{@}"
@end example

Field names can be integers indicating positional arguments, such as
@code{@{0@}}, @code{@{1@}}, etc. or names of keyword arguments.  You can also
supply compound field names that read attributes or access dictionary keys:

@example
>>> import sys
>>> print 'Platform: @{0.platform@}\nPython version: @{0.version@}'.format(sys)
Platform: darwin
Python version: 2.6a1+ (trunk:61261M, Mar  5 2008, 20:29:41)
[GCC 4.0.1 (Apple Computer, Inc. build 5367)]'

>>> import mimetypes
>>> 'Content-type: @{0[.mp4]@}'.format(mimetypes.types_map)
'Content-type: video/mp4'
@end example

Note that when using dictionary-style notation such as @code{[.mp4]}, you
don’t need to put any quotation marks around the string; it will look
up the value using @code{.mp4} as the key.  Strings beginning with a
number will be converted to an integer.  You can’t write more
complicated expressions inside a format string.

So far we’ve shown how to specify which field to substitute into the
resulting string.  The precise formatting used is also controllable by
adding a colon followed by a format specifier.  For example:

@example
>>> # Field 0: left justify, pad to 15 characters
>>> # Field 1: right justify, pad to 6 characters
>>> fmt = '@{0:15@} $@{1:>6@}'
>>> fmt.format('Registration', 35)
'Registration    $    35'
>>> fmt.format('Tutorial', 50)
'Tutorial        $    50'
>>> fmt.format('Banquet', 125)
'Banquet         $   125'
@end example

Format specifiers can reference other fields through nesting:

@example
>>> fmt = '@{0:@{1@}@}'
>>> width = 15
>>> fmt.format('Invoice #1234', width)
'Invoice #1234  '
>>> width = 35
>>> fmt.format('Invoice #1234', width)
'Invoice #1234                      '
@end example

The alignment of a field within the desired width can be specified:


@multitable {xxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Character

@tab

Effect

@item

< (default)

@tab

Left-align

@item

>

@tab

Right-align

@item

^

@tab

Center

@item

=

@tab

(For numeric types only) Pad after the sign.

@end multitable


Format specifiers can also include a presentation type, which
controls how the value is formatted.  For example, floating-point numbers
can be formatted as a general number or in exponential notation:

@example
>>> '@{0:g@}'.format(3.75)
'3.75'
>>> '@{0:e@}'.format(3.75)
'3.750000e+00'
@end example

A variety of presentation types are available.  Consult the 2.6
documentation for a @ref{15a0,,complete list}; here’s a sample:


@multitable {xxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

@code{b}

@tab

Binary. Outputs the number in base 2.

@item

@code{c}

@tab

Character. Converts the integer to the corresponding Unicode character
before printing.

@item

@code{d}

@tab

Decimal Integer. Outputs the number in base 10.

@item

@code{o}

@tab

Octal format. Outputs the number in base 8.

@item

@code{x}

@tab

Hex format. Outputs the number in base 16, using lower-case letters for
the digits above 9.

@item

@code{e}

@tab

Exponent notation. Prints the number in scientific notation using the
letter ‘e’ to indicate the exponent.

@item

@code{g}

@tab

General format. This prints the number as a fixed-point number, unless
the number is too large, in which case it switches to ‘e’ exponent
notation.

@item

@code{n}

@tab

Number. This is the same as ‘g’ (for floats) or ‘d’ (for integers),
except that it uses the current locale setting to insert the appropriate
number separator characters.

@item

@code{%}

@tab

Percentage. Multiplies the number by 100 and displays in fixed (‘f’)
format, followed by a percent sign.

@end multitable


Classes and types can define a @ref{830,,__format__()} method to control how they’re
formatted.  It receives a single argument, the format specifier:

@example
def __format__(self, format_spec):
    if isinstance(format_spec, unicode):
        return unicode(str(self))
    else:
        return str(self)
@end example

There’s also a @ref{199,,format()} builtin that will format a single
value.  It calls the type’s @ref{830,,__format__()} method with the
provided specifier:

@example
>>> format(75.6564, '.2f')
'75.66'
@end example


@subsubheading 더 보기



@table @asis

@item @ref{15a0,,Format string syntax}

The reference documentation for format fields.

@geindex Python 향상 제안; PEP 3101

@item PEP 3101@footnote{https://peps.python.org/pep-3101/} - Advanced String Formatting

PEP written by Talin. Implemented by Eric Smith.
@end table


@c ======================================================================

@node PEP 3105 print As a Function,PEP 3110 Exception-Handling Changes,PEP 3101 Advanced String Formatting,What’s New in Python 2 6
@anchor{whatsnew/2 6 pep-3105}@anchor{14ba}@anchor{whatsnew/2 6 pep-3105-print-as-a-function}@anchor{15a1}
@subsection PEP 3105: @code{print} As a Function


The @code{print} statement becomes the @ref{1174,,print()} function in Python 3.0.
Making @code{print()} a function makes it possible to replace the function
by doing @code{def print(...)} or importing a new function from somewhere else.

Python 2.6 has a @code{__future__} import that removes @code{print} as language
syntax, letting you use the functional form instead.  For example:

@example
>>> from __future__ import print_function
>>> print('# of entries', len(dictionary), file=sys.stderr)
@end example

The signature of the new function is:

@example
def print(*args, sep=' ', end='\n', file=None)
@end example

The parameters are:


@itemize *

@item 
`args': positional arguments whose values will be printed out.

@item 
`sep': the separator, which will be printed between arguments.

@item 
`end': the ending text, which will be printed after all of the
arguments have been output.

@item 
`file': the file object to which the output will be sent.
@end itemize


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 3105

@item PEP 3105@footnote{https://peps.python.org/pep-3105/} - Make print a function

PEP written by Georg Brandl.
@end table


@c ======================================================================

@node PEP 3110 Exception-Handling Changes,PEP 3112 Byte Literals,PEP 3105 print As a Function,What’s New in Python 2 6
@anchor{whatsnew/2 6 pep-3110}@anchor{14bb}@anchor{whatsnew/2 6 pep-3110-exception-handling-changes}@anchor{15a2}
@subsection PEP 3110: Exception-Handling Changes


One error that Python programmers occasionally make
is writing the following code:

@example
try:
    ...
except TypeError, ValueError:  # Wrong!
    ...
@end example

The author is probably trying to catch both @ref{198,,TypeError} and
@ref{2ec,,ValueError} exceptions, but this code actually does something
different: it will catch @code{TypeError} and bind the resulting
exception object to the local name @code{"ValueError"}.  The
@code{ValueError} exception will not be caught at all.  The correct
code specifies a tuple of exceptions:

@example
try:
    ...
except (TypeError, ValueError):
    ...
@end example

This error happens because the use of the comma here is ambiguous:
does it indicate two different nodes in the parse tree, or a single
node that’s a tuple?

Python 3.0 makes this unambiguous by replacing the comma with the word
“as”.  To catch an exception and store the exception object in the
variable @code{exc}, you must write:

@example
try:
    ...
except TypeError as exc:
    ...
@end example

Python 3.0 will only support the use of “as”, and therefore interprets
the first example as catching two different exceptions.  Python 2.6
supports both the comma and “as”, so existing code will continue to
work.  We therefore suggest using “as” when writing new Python code
that will only be executed with 2.6.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 3110

@item PEP 3110@footnote{https://peps.python.org/pep-3110/} - Catching Exceptions in Python 3000

PEP written and implemented by Collin Winter.
@end table


@c ======================================================================

@node PEP 3112 Byte Literals,PEP 3116 New I/O Library,PEP 3110 Exception-Handling Changes,What’s New in Python 2 6
@anchor{whatsnew/2 6 pep-3112}@anchor{14bc}@anchor{whatsnew/2 6 pep-3112-byte-literals}@anchor{15a3}
@subsection PEP 3112: Byte Literals


Python 3.0 adopts Unicode as the language’s fundamental string type and
denotes 8-bit literals differently, either as @code{b'string'}
or using a @ref{192,,bytes} constructor.  For future compatibility,
Python 2.6 adds @code{bytes} as a synonym for the @ref{169,,str} type,
and it also supports the @code{b'@w{'}} notation.

The 2.6 @ref{169,,str} differs from 3.0’s @ref{192,,bytes} type in various
ways; most notably, the constructor is completely different.  In 3.0,
@code{bytes([65, 66, 67])} is 3 elements long, containing the bytes
representing @code{ABC}; in 2.6, @code{bytes([65, 66, 67])} returns the
12-byte string representing the @ref{169,,str()} of the list.

The primary use of @ref{192,,bytes} in 2.6 will be to write tests of
object type such as @code{isinstance(x, bytes)}.  This will help the 2to3
converter, which can’t tell whether 2.x code intends strings to
contain either characters or 8-bit bytes; you can now
use either @code{bytes} or @ref{169,,str} to represent your intention
exactly, and the resulting code will also be correct in Python 3.0.

There’s also a @code{__future__} import that causes all string literals
to become Unicode strings.  This means that @code{\u} escape sequences
can be used to include Unicode characters:

@example
from __future__ import unicode_literals

s = ('\u751f\u3080\u304e\u3000\u751f\u3054'
     '\u3081\u3000\u751f\u305f\u307e\u3054')

print len(s)               # 12 Unicode characters
@end example

At the C level, Python 3.0 will rename the existing 8-bit
string type, called @code{PyStringObject} in Python 2.x,
to @ref{994,,PyBytesObject}.  Python 2.6 uses @code{#define}
to support using the names @ref{994,,PyBytesObject()},
@ref{15a4,,PyBytes_Check()}, @ref{15a5,,PyBytes_FromStringAndSize()},
and all the other functions and macros used with strings.

Instances of the @ref{192,,bytes} type are immutable just
as strings are.  A new @ref{344,,bytearray} type stores a mutable
sequence of bytes:

@example
>>> bytearray([65, 66, 67])
bytearray(b'ABC')
>>> b = bytearray(u'\u21ef\u3244', 'utf-8')
>>> b
bytearray(b'\xe2\x87\xaf\xe3\x89\x84')
>>> b[0] = '\xe3'
>>> b
bytearray(b'\xe3\x87\xaf\xe3\x89\x84')
>>> unicode(str(b), 'utf-8')
u'\u31ef \u3244'
@end example

Byte arrays support most of the methods of string types, such as
@ref{15a6,,startswith()}/@ref{15a7,,endswith()},
@ref{15a8,,find()}/@ref{15a9,,rfind()},
and some of the methods of lists, such as @ref{15aa,,append()},
@ref{15ab,,pop()},  and @ref{15ac,,reverse()}.

@example
>>> b = bytearray('ABC')
>>> b.append('d')
>>> b.append(ord('e'))
>>> b
bytearray(b'ABCde')
@end example

There’s also a corresponding C API, with
@ref{15ad,,PyByteArray_FromObject()},
@ref{15ae,,PyByteArray_FromStringAndSize()},
and various other functions.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 3112

@item PEP 3112@footnote{https://peps.python.org/pep-3112/} - Bytes literals in Python 3000

PEP written by Jason Orendorff; backported to 2.6 by Christian Heimes.
@end table


@c ======================================================================

@node PEP 3116 New I/O Library,PEP 3118 Revised Buffer Protocol,PEP 3112 Byte Literals,What’s New in Python 2 6
@anchor{whatsnew/2 6 pep-3116}@anchor{14bd}@anchor{whatsnew/2 6 pep-3116-new-i-o-library}@anchor{15af}
@subsection PEP 3116: New I/O Library


Python’s built-in file objects support a number of methods, but
file-like objects don’t necessarily support all of them.  Objects that
imitate files usually support @code{read()} and
@code{write()}, but they may not support @code{readline()},
for example.  Python 3.0 introduces a layered I/O library in the @ref{83,,io}
module that separates buffering and text-handling features from the
fundamental read and write operations.

There are three levels of abstract base classes provided by
the @ref{83,,io} module:


@itemize *

@item 
@ref{12d5,,RawIOBase} defines raw I/O operations: @ref{101b,,read()},
@ref{101c,,readinto()}, @ref{15b0,,write()},
@ref{1491,,seek()}, @ref{15b1,,tell()}, @ref{1515,,truncate()},
and @ref{505,,close()}.
Most of the methods of this class will often map to a single system call.
There are also @ref{15b2,,readable()}, @ref{15b3,,writable()},
and @ref{15b4,,seekable()} methods for determining what operations a
given object will allow.

Python 3.0 has concrete implementations of this class for files and
sockets, but Python 2.6 hasn’t restructured its file and socket objects
in this way.

@item 
@ref{8a2,,BufferedIOBase} is an abstract base class that
buffers data in memory to reduce the number of
system calls used, making I/O processing more efficient.
It supports all of the methods of @ref{12d5,,RawIOBase},
and adds a @ref{15b5,,raw} attribute holding the underlying
raw object.

There are five concrete classes implementing this ABC.
@ref{15b6,,BufferedWriter} and @ref{1413,,BufferedReader} are for objects
that support write-only or read-only usage that have a @ref{1491,,seek()}
method for random access.  @ref{15b7,,BufferedRandom} objects support
read and write access upon the same underlying stream, and
@ref{15b8,,BufferedRWPair} is for objects such as TTYs that have both
read and write operations acting upon unconnected streams of data.
The @ref{10a3,,BytesIO} class supports reading, writing, and seeking
over an in-memory buffer.

@geindex universal newlines;What's new

@item 
@ref{8a3,,TextIOBase}: Provides functions for reading and writing
strings (remember, strings will be Unicode in Python 3.0),
and supporting @ref{f34,,universal newlines}.  @code{TextIOBase} defines
the @ref{bf,,readline()} method and supports iteration upon
objects.

There are two concrete implementations.  @ref{9be,,TextIOWrapper}
wraps a buffered I/O object, supporting all of the methods for
text I/O and adding a @ref{14a8,,buffer} attribute for access
to the underlying object.  @ref{1128,,StringIO} simply buffers
everything in memory without ever writing anything to disk.

(In Python 2.6, @ref{1128,,io.StringIO} is implemented in
pure Python, so it’s pretty slow.   You should therefore stick with the
existing @code{StringIO} module or @code{cStringIO} for now.  At some
point Python 3.0’s @ref{83,,io} module will be rewritten into C for speed,
and perhaps the C implementation will be  backported to the 2.x releases.)
@end itemize

In Python 2.6, the underlying implementations haven’t been
restructured to build on top of the @ref{83,,io} module’s classes.  The
module is being provided to make it easier to write code that’s
forward-compatible with 3.0, and to save developers the effort of writing
their own implementations of buffering and text I/O.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 3116

@item PEP 3116@footnote{https://peps.python.org/pep-3116/} - New I/O

PEP written by Daniel Stutzbach, Mike Verdone, and Guido van Rossum.
Code by Guido van Rossum, Georg Brandl, Walter Doerwald,
Jeremy Hylton, Martin von Löwis, Tony Lownds, and others.
@end table


@c ======================================================================

@node PEP 3118 Revised Buffer Protocol,PEP 3119 Abstract Base Classes,PEP 3116 New I/O Library,What’s New in Python 2 6
@anchor{whatsnew/2 6 pep-3118}@anchor{14be}@anchor{whatsnew/2 6 pep-3118-revised-buffer-protocol}@anchor{15b9}
@subsection PEP 3118: Revised Buffer Protocol


The buffer protocol is a C-level API that lets Python types
exchange pointers into their internal representations.  A
memory-mapped file can be viewed as a buffer of characters, for
example, and this lets another module such as @ref{be,,re}
treat memory-mapped files as a string of characters to be searched.

The primary users of the buffer protocol are numeric-processing
packages such as NumPy, which expose the internal representation
of arrays so that callers can write data directly into an array instead
of going through a slower API.  This PEP updates the buffer protocol in light of experience
from NumPy development, adding a number of new features
such as indicating the shape of an array or locking a memory region.

The most important new C API function is
@code{PyObject_GetBuffer(PyObject *obj, Py_buffer *view, int flags)}, which
takes an object and a set of flags, and fills in the
@code{Py_buffer} structure with information
about the object’s memory representation.  Objects
can use this operation to lock memory in place
while an external caller could be modifying the contents,
so there’s a corresponding @code{PyBuffer_Release(Py_buffer *view)} to
indicate that the external caller is done.

The `flags' argument to @ref{638,,PyObject_GetBuffer()} specifies
constraints upon the memory returned.  Some examples are:


@itemize *

@item 
@ref{15ba,,PyBUF_WRITABLE} indicates that the memory must be writable.

@item 
@code{PyBUF_LOCK} requests a read-only or exclusive lock on the memory.

@item 
@ref{15bb,,PyBUF_C_CONTIGUOUS} and @ref{15bc,,PyBUF_F_CONTIGUOUS}
requests a C-contiguous (last dimension varies the fastest) or
Fortran-contiguous (first dimension varies the fastest) array layout.
@end itemize

Two new argument codes for @ref{3c1,,PyArg_ParseTuple()},
@code{s*} and @code{z*}, return locked buffer objects for a parameter.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 3118

@item PEP 3118@footnote{https://peps.python.org/pep-3118/} - Revising the buffer protocol

PEP written by Travis Oliphant and Carl Banks; implemented by
Travis Oliphant.
@end table


@c ======================================================================

@node PEP 3119 Abstract Base Classes,PEP 3127 Integer Literal Support and Syntax,PEP 3118 Revised Buffer Protocol,What’s New in Python 2 6
@anchor{whatsnew/2 6 pep-3119}@anchor{14bf}@anchor{whatsnew/2 6 pep-3119-abstract-base-classes}@anchor{15bd}
@subsection PEP 3119: Abstract Base Classes


Some object-oriented languages such as Java support interfaces,
declaring that a class has a given set of methods or supports a given
access protocol.  Abstract Base Classes (or ABCs) are an equivalent
feature for Python. The ABC support consists of an @ref{4,,abc} module
containing a metaclass called @ref{111a,,ABCMeta}, special handling of
this metaclass by the @ref{2ad,,isinstance()} and @ref{9c4,,issubclass()}
builtins, and a collection of basic ABCs that the Python developers
think will be widely useful.  Future versions of Python will probably
add more ABCs.

Let’s say you have a particular class and wish to know whether it supports
dictionary-style access.  The phrase “dictionary-style” is vague, however.
It probably means that accessing items with @code{obj[1]} works.
Does it imply that setting items with @code{obj[2] = value} works?
Or that the object will have @code{keys()}, @code{values()}, and @code{items()}
methods?  What about the iterative variants  such as @code{iterkeys()}?
@code{copy`and :meth:()}!update`?  Iterating over the object with @code{iter()}?

The Python 2.6 @ref{1e,,collections} module includes a number of
different ABCs that represent these distinctions.  @code{Iterable}
indicates that a class defines @ref{e68,,__iter__()}, and
@code{Container} means the class defines a @ref{15be,,__contains__()}
method and therefore supports @code{x in y} expressions.  The basic
dictionary interface of getting items, setting items, and
@code{keys()}, @code{values()}, and @code{items()}, is defined by the
@code{MutableMapping} ABC.

You can derive your own classes from a particular ABC
to indicate they support that ABC’s interface:

@example
import collections

class Storage(collections.MutableMapping):
    ...
@end example

Alternatively, you could write the class without deriving from
the desired ABC and instead register the class by
calling the ABC’s @ref{128d,,register()} method:

@example
import collections

class Storage:
    ...

collections.MutableMapping.register(Storage)
@end example

For classes that you write, deriving from the ABC is probably clearer.
The @ref{128d,,register()}  method is useful when you’ve written a new
ABC that can describe an existing type or class, or if you want
to declare that some third-party class implements an ABC.
For example, if you defined a @code{PrintableType} ABC,
it’s legal to do:

@example
# Register Python's types
PrintableType.register(int)
PrintableType.register(float)
PrintableType.register(str)
@end example

Classes should obey the semantics specified by an ABC, but
Python can’t check this; it’s up to the class author to
understand the ABC’s requirements and to implement the code accordingly.

To check whether an object supports a particular interface, you can
now write:

@example
def func(d):
    if not isinstance(d, collections.MutableMapping):
        raise ValueError("Mapping object expected, not %r" % d)
@end example

Don’t feel that you must now begin writing lots of checks as in the
above example.  Python has a strong tradition of duck-typing, where
explicit type-checking is never done and code simply calls methods on
an object, trusting that those methods will be there and raising an
exception if they aren’t.  Be judicious in checking for ABCs and only
do it where it’s absolutely necessary.

You can write your own ABCs by using @code{abc.ABCMeta} as the
metaclass in a class definition:

@example
from abc import ABCMeta, abstractmethod

class Drawable():
    __metaclass__ = ABCMeta

    @@abstractmethod
    def draw(self, x, y, scale=1.0):
        pass

    def draw_doubled(self, x, y):
        self.draw(x, y, scale=2.0)


class Square(Drawable):
    def draw(self, x, y, scale):
        ...
@end example

In the @code{Drawable} ABC above, the @code{draw_doubled()} method
renders the object at twice its size and can be implemented in terms
of other methods described in @code{Drawable}.  Classes implementing
this ABC therefore don’t need to provide their own implementation
of @code{draw_doubled()}, though they can do so.  An implementation
of @code{draw()} is necessary, though; the ABC can’t provide
a useful generic implementation.

You can apply the @ref{128a,,@@~abc.abstractmethod} decorator to methods such as
@code{draw()} that must be implemented; Python will then raise an
exception for classes that don’t define the method.
Note that the exception is only raised when you actually
try to create an instance of a subclass lacking the method:

@example
>>> class Circle(Drawable):
...     pass
...
>>> c = Circle()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Can't instantiate abstract class Circle with abstract methods draw
>>>
@end example

Abstract data attributes can be declared using the
@code{@@abstractproperty} decorator:

@example
from abc import abstractproperty
...

@@abstractproperty
def readonly(self):
   return self._x
@end example

Subclasses must then define a @code{readonly} property.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 3119

@item PEP 3119@footnote{https://peps.python.org/pep-3119/} - Introducing Abstract Base Classes

PEP written by Guido van Rossum and Talin.
Implemented by Guido van Rossum.
Backported to 2.6 by Benjamin Aranguren, with Alex Martelli.
@end table


@c ======================================================================

@node PEP 3127 Integer Literal Support and Syntax,PEP 3129 Class Decorators,PEP 3119 Abstract Base Classes,What’s New in Python 2 6
@anchor{whatsnew/2 6 pep-3127}@anchor{14c0}@anchor{whatsnew/2 6 pep-3127-integer-literal-support-and-syntax}@anchor{15bf}
@subsection PEP 3127: Integer Literal Support and Syntax


Python 3.0 changes the syntax for octal (base-8) integer literals,
prefixing them with “0o” or “0O” instead of a leading zero, and adds
support for binary (base-2) integer literals, signalled by a “0b” or
“0B” prefix.

Python 2.6 doesn’t drop support for a leading 0 signalling
an octal number, but it does add support for “0o” and “0b”:

@example
>>> 0o21, 2*8 + 1
(17, 17)
>>> 0b101111
47
@end example

The @ref{14d3,,oct()} builtin still returns numbers
prefixed with a leading zero, and a new @ref{14ad,,bin()}
builtin returns the binary representation for a number:

@example
>>> oct(42)
'052'
>>> future_builtins.oct(42)
'0o52'
>>> bin(173)
'0b10101101'
@end example

The @ref{19b,,int()} and @code{long()} builtins will now accept the “0o”
and “0b” prefixes when base-8 or base-2 are requested, or when the
`base' argument is zero (signalling that the base used should be
determined from the string):

@example
>>> int ('0o52', 0)
42
>>> int('1101', 2)
13
>>> int('0b1101', 2)
13
>>> int('0b1101', 0)
13
@end example


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 3127

@item PEP 3127@footnote{https://peps.python.org/pep-3127/} - Integer Literal Support and Syntax

PEP written by Patrick Maupin; backported to 2.6 by
Eric Smith.
@end table


@c ======================================================================

@node PEP 3129 Class Decorators,PEP 3141 A Type Hierarchy for Numbers,PEP 3127 Integer Literal Support and Syntax,What’s New in Python 2 6
@anchor{whatsnew/2 6 pep-3129}@anchor{14c1}@anchor{whatsnew/2 6 pep-3129-class-decorators}@anchor{15c0}
@subsection PEP 3129: Class Decorators


Decorators have been extended from functions to classes.  It’s now legal to
write:

@example
@@foo
@@bar
class A:
  pass
@end example

This is equivalent to:

@example
class A:
  pass

A = foo(bar(A))
@end example


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 3129

@item PEP 3129@footnote{https://peps.python.org/pep-3129/} - Class Decorators

PEP written by Collin Winter.
@end table


@c ======================================================================

@node PEP 3141 A Type Hierarchy for Numbers,Other Language Changes<9>,PEP 3129 Class Decorators,What’s New in Python 2 6
@anchor{whatsnew/2 6 pep-3141}@anchor{14c2}@anchor{whatsnew/2 6 pep-3141-a-type-hierarchy-for-numbers}@anchor{15c1}
@subsection PEP 3141: A Type Hierarchy for Numbers


Python 3.0 adds several abstract base classes for numeric types
inspired by Scheme’s numeric tower.  These classes were backported to
2.6 as the @ref{a2,,numbers} module.

The most general ABC is @code{Number}.  It defines no operations at
all, and only exists to allow checking if an object is a number by
doing @code{isinstance(obj, Number)}.

@code{Complex} is a subclass of @code{Number}.  Complex numbers
can undergo the basic operations of addition, subtraction,
multiplication, division, and exponentiation, and you can retrieve the
real and imaginary parts and obtain a number’s conjugate.  Python’s built-in
complex type is an implementation of @code{Complex}.

@code{Real} further derives from @code{Complex}, and adds
operations that only work on real numbers: @code{floor()}, @code{trunc()},
rounding, taking the remainder mod N, floor division,
and comparisons.

@code{Rational} numbers derive from @code{Real}, have
@code{numerator} and @code{denominator} properties, and can be
converted to floats.  Python 2.6 adds a simple rational-number class,
@code{Fraction}, in the @ref{61,,fractions} module.  (It’s called
@code{Fraction} instead of @code{Rational} to avoid
a name clash with @ref{14c3,,numbers.Rational}.)

@code{Integral} numbers derive from @code{Rational}, and
can be shifted left and right with @code{<<} and @code{>>},
combined using bitwise operations such as @code{&} and @code{|},
and can be used as array indexes and slice boundaries.

In Python 3.0, the PEP slightly redefines the existing builtins
@ref{14df,,round()}, @ref{15c2,,math.floor()}, @ref{15c3,,math.ceil()}, and adds a new
one, @ref{15c4,,math.trunc()}, that’s been backported to Python 2.6.
@code{math.trunc()} rounds toward zero, returning the closest
@code{Integral} that’s between the function’s argument and zero.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 3141

@item PEP 3141@footnote{https://peps.python.org/pep-3141/} - A Type Hierarchy for Numbers

PEP written by Jeffrey Yasskin.
@end table

Scheme's numerical tower@footnote{https://www.gnu.org/software/guile/manual/html_node/Numerical-Tower.html#Numerical-Tower}, from the Guile manual.

Scheme's number datatypes@footnote{https://conservatory.scheme.org/schemers/Documents/Standards/R5RS/HTML/r5rs-Z-H-9.html#%_sec_6.2} from the R5RS Scheme specification.


@menu
* The fractions Module:: 

@end menu

@node The fractions Module,,,PEP 3141 A Type Hierarchy for Numbers
@anchor{whatsnew/2 6 the-fractions-module}@anchor{15c5}
@subsubsection The @code{fractions} Module


To fill out the hierarchy of numeric types, the @ref{61,,fractions}
module provides a rational-number class.  Rational numbers store their
values as a numerator and denominator forming a fraction, and can
exactly represent numbers such as @code{2/3} that floating-point numbers
can only approximate.

The @code{Fraction} constructor takes two @code{Integral} values
that will be the numerator and denominator of the resulting fraction.

@example
>>> from fractions import Fraction
>>> a = Fraction(2, 3)
>>> b = Fraction(2, 5)
>>> float(a), float(b)
(0.66666666666666663, 0.40000000000000002)
>>> a+b
Fraction(16, 15)
>>> a/b
Fraction(5, 3)
@end example

For converting floating-point numbers to rationals,
the float type now has an @code{as_integer_ratio()} method that returns
the numerator and denominator for a fraction that evaluates to the same
floating-point value:

@example
>>> (2.5) .as_integer_ratio()
(5, 2)
>>> (3.1415) .as_integer_ratio()
(7074029114692207L, 2251799813685248L)
>>> (1./3) .as_integer_ratio()
(6004799503160661L, 18014398509481984L)
@end example

Note that values that can only be approximated by floating-point
numbers, such as 1./3, are not simplified to the number being
approximated; the fraction attempts to match the floating-point value
`exactly'.

The @ref{61,,fractions} module is based upon an implementation by Sjoerd
Mullender that was in Python’s @code{Demo/classes/} directory for a
long time.  This implementation was significantly updated by Jeffrey
Yasskin.

@node Other Language Changes<9>,New and Improved Modules<2>,PEP 3141 A Type Hierarchy for Numbers,What’s New in Python 2 6
@anchor{whatsnew/2 6 other-language-changes}@anchor{15c6}
@subsection Other Language Changes


Some smaller changes made to the core Python language are:


@itemize *

@item 
Directories and zip archives containing a @code{__main__.py} file
can now be executed directly by passing their name to the
interpreter. The directory or zip archive is automatically inserted
as the first entry in sys.path.  (Suggestion and initial patch by
Andy Chu, subsequently revised by Phillip J. Eby and Nick Coghlan;
bpo-1739468@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1739468}.)

@item 
The @ref{6f8,,hasattr()} function was catching and ignoring all errors,
under the assumption that they meant a @code{__getattr__()} method
was failing somehow and the return value of @code{hasattr()} would
therefore be @code{False}.  This logic shouldn’t be applied to
@ref{bc4,,KeyboardInterrupt} and @ref{f3b,,SystemExit}, however; Python 2.6
will no longer discard such exceptions when @code{hasattr()}
encounters them.  (Fixed by Benjamin Peterson; bpo-2196@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2196}.)

@item 
When calling a function using the @code{**} syntax to provide keyword
arguments, you are no longer required to use a Python dictionary;
any mapping will now work:

@example
>>> def f(**kw):
...    print sorted(kw)
...
>>> ud=UserDict.UserDict()
>>> ud['a'] = 1
>>> ud['b'] = 'string'
>>> f(**ud)
['a', 'b']
@end example

(Contributed by Alexander Belopolsky; bpo-1686487@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1686487}.)

It’s also become legal to provide keyword arguments after a @code{*args} argument
to a function call.

@example
>>> def f(*args, **kw):
...     print args, kw
...
>>> f(1,2,3, *(4,5,6), keyword=13)
(1, 2, 3, 4, 5, 6) @{'keyword': 13@}
@end example

Previously this would have been a syntax error.
(Contributed by Amaury Forgeot d’Arc; bpo-3473@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=3473}.)

@item 
A new builtin, @code{next(iterator, [default])} returns the next item
from the specified iterator.  If the `default' argument is supplied,
it will be returned if `iterator' has been exhausted; otherwise,
the @ref{df4,,StopIteration} exception will be raised.  (Backported
in bpo-2719@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2719}.)

@item 
Tuples now have @ref{15c7,,index()} and @ref{15c8,,count()} methods
matching the list type’s @ref{15c9,,index()} and @ref{15ca,,count()} methods:

@example
>>> t = (0,1,2,3,4,0,1,2)
>>> t.index(3)
3
>>> t.count(0)
2
@end example

(Contributed by Raymond Hettinger)

@item 
The built-in types now have improved support for extended slicing syntax,
accepting various combinations of @code{(start, stop, step)}.
Previously, the support was partial and certain corner cases wouldn’t work.
(Implemented by Thomas Wouters.)

@c Revision 57619

@item 
Properties now have three attributes, @code{getter}, @code{setter}
and @code{deleter}, that are decorators providing useful shortcuts
for adding a getter, setter or deleter function to an existing
property. You would use them like this:

@example
class C(object):
    @@property
    def x(self):
        return self._x

    @@x.setter
    def x(self, value):
        self._x = value

    @@x.deleter
    def x(self):
        del self._x

class D(C):
    @@C.x.getter
    def x(self):
        return self._x * 2

    @@x.setter
    def x(self, value):
        self._x = value / 2
@end example

@item 
Several methods of the built-in set types now accept multiple iterables:
@code{intersection()},
@code{intersection_update()},
@code{union()}, @code{update()},
@code{difference()} and @code{difference_update()}.

@example
>>> s=set('1234567890')
>>> s.intersection('abc123', 'cdf246')  # Intersection between all inputs
set(['2'])
>>> s.difference('246', '789')
set(['1', '0', '3', '5'])
@end example

(Contributed by Raymond Hettinger.)

@item 
Many floating-point features were added.  The @ref{196,,float()} function
will now turn the string @code{nan} into an
IEEE 754 Not A Number value, and @code{+inf} and @code{-inf} into
positive or negative infinity.  This works on any platform with
IEEE 754 semantics.  (Contributed by Christian Heimes; bpo-1635@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635}.)

Other functions in the @ref{92,,math} module, @code{isinf()} and
@code{isnan()}, return true if their floating-point argument is
infinite or Not A Number.  (bpo-1640@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1640})

Conversion functions were added to convert floating-point numbers
into hexadecimal strings (bpo-3008@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=3008}).  These functions
convert floats to and from a string representation without
introducing rounding errors from the conversion between decimal and
binary.  Floats have a @ref{14d4,,hex()} method that returns a string
representation, and the @code{float.fromhex()} method converts a string
back into a number:

@example
>>> a = 3.75
>>> a.hex()
'0x1.e000000000000p+1'
>>> float.fromhex('0x1.e000000000000p+1')
3.75
>>> b=1./3
>>> b.hex()
'0x1.5555555555555p-2'
@end example

@item 
A numerical nicety: when creating a complex number from two floats
on systems that support signed zeros (-0 and +0), the
@ref{197,,complex()} constructor will now preserve the sign
of the zero.  (Fixed by Mark T. Dickinson; bpo-1507@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1507}.)

@item 
Classes that inherit a @code{__hash__()} method from a parent class
can set @code{__hash__ = None} to indicate that the class isn’t
hashable.  This will make @code{hash(obj)} raise a @ref{198,,TypeError}
and the class will not be indicated as implementing the
@code{Hashable} ABC.

You should do this when you’ve defined a @code{__cmp__()} or
@code{__eq__()} method that compares objects by their value rather
than by identity.  All objects have a default hash method that uses
@code{id(obj)} as the hash value.  There’s no tidy way to remove the
@code{__hash__()} method inherited from a parent class, so
assigning @code{None} was implemented as an override.  At the
C level, extensions can set @code{tp_hash} to
@ref{15cb,,PyObject_HashNotImplemented()}.
(Fixed by Nick Coghlan and Amaury Forgeot d’Arc; bpo-2235@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2235}.)

@item 
The @ref{15cc,,GeneratorExit} exception now subclasses
@ref{7d6,,BaseException} instead of @ref{bcc,,Exception}.  This means
that an exception handler that does @code{except Exception:}
will not inadvertently catch @code{GeneratorExit}.
(Contributed by Chad Austin; bpo-1537@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1537}.)

@item 
Generator objects now have a @code{gi_code} attribute that refers to
the original code object backing the generator.
(Contributed by Collin Winter; bpo-1473257@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1473257}.)

@item 
The @ref{4b2,,compile()} built-in function now accepts keyword arguments
as well as positional parameters.  (Contributed by Thomas Wouters;
bpo-1444529@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1444529}.)

@item 
The @ref{197,,complex()} constructor now accepts strings containing
parenthesized complex numbers, meaning that @code{complex(repr(cplx))}
will now round-trip values.  For example, @code{complex('(3+4j)')}
now returns the value (3+4j).  (bpo-1491866@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1491866})

@item 
The string @code{translate()} method now accepts @code{None} as the
translation table parameter, which is treated as the identity
transformation.   This makes it easier to carry out operations
that only delete characters.  (Contributed by Bengt Richter and
implemented by Raymond Hettinger; bpo-1193128@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1193128}.)

@item 
The built-in @ref{843,,dir()} function now checks for a @code{__dir__()}
method on the objects it receives.  This method must return a list
of strings containing the names of valid attributes for the object,
and lets the object control the value that @code{dir()} produces.
Objects that have @code{__getattr__()} or @code{__getattribute__()}
methods can use this to advertise pseudo-attributes they will honor.
(bpo-1591665@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1591665})

@item 
Instance method objects have new attributes for the object and function
comprising the method; the new synonym for @code{im_self} is
@ref{15cd,,__self__}, and @code{im_func} is also available as
@ref{1501,,__func__}.
The old names are still supported in Python 2.6, but are gone in 3.0.

@item 
An obscure change: when you use the @ref{46f,,locals()} function inside a
@ref{14dc,,class} statement, the resulting dictionary no longer returns free
variables.  (Free variables, in this case, are variables referenced in the
@code{class} statement  that aren’t attributes of the class.)
@end itemize

@c ======================================================================

@menu
* Optimizations: Optimizations<9>. 
* Interpreter Changes: Interpreter Changes<2>. 

@end menu

@node Optimizations<9>,Interpreter Changes<2>,,Other Language Changes<9>
@anchor{whatsnew/2 6 optimizations}@anchor{15ce}
@subsubsection Optimizations



@itemize *

@item 
The @ref{118,,warnings} module has been rewritten in C.  This makes
it possible to invoke warnings from the parser, and may also
make the interpreter’s startup faster.
(Contributed by Neal Norwitz and Brett Cannon; bpo-1631171@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1631171}.)

@item 
Type objects now have a cache of methods that can reduce
the work required to find the correct method implementation
for a particular class; once cached, the interpreter doesn’t need to
traverse base classes to figure out the right method to call.
The cache is cleared if a base class or the class itself is modified,
so the cache should remain correct even in the face of Python’s dynamic
nature.
(Original optimization implemented by Armin Rigo, updated for
Python 2.6 by Kevin Jacobs; bpo-1700288@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1700288}.)

By default, this change is only applied to types that are included with
the Python core.  Extension modules may not necessarily be compatible with
this cache,
so they must explicitly add @ref{15cf,,Py_TPFLAGS_HAVE_VERSION_TAG}
to the module’s @code{tp_flags} field to enable the method cache.
(To be compatible with the method cache, the extension module’s code
must not directly access and modify the @code{tp_dict} member of
any of the types it implements.  Most modules don’t do this,
but it’s impossible for the Python interpreter to determine that.
See bpo-1878@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1878} for some discussion.)

@item 
Function calls that use keyword arguments are significantly faster
by doing a quick pointer comparison, usually saving the time of a
full string comparison.  (Contributed by Raymond Hettinger, after an
initial implementation by Antoine Pitrou; bpo-1819@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1819}.)

@item 
All of the functions in the @ref{db,,struct} module have been rewritten in
C, thanks to work at the Need For Speed sprint.
(Contributed by Raymond Hettinger.)

@item 
Some of the standard built-in types now set a bit in their type
objects.  This speeds up checking whether an object is a subclass of
one of these types.  (Contributed by Neal Norwitz.)

@item 
Unicode strings now use faster code for detecting
whitespace and line breaks; this speeds up the @code{split()} method
by about 25% and @code{splitlines()} by 35%.
(Contributed by Antoine Pitrou.)  Memory usage is reduced
by using pymalloc for the Unicode string’s data.

@item 
The @code{with} statement now stores the @ref{1505,,__exit__()} method on the stack,
producing a small speedup.  (Implemented by Jeffrey Yasskin.)

@item 
To reduce memory usage, the garbage collector will now clear internal
free lists when garbage-collecting the highest generation of objects.
This may return memory to the operating system sooner.
@end itemize

@c ======================================================================

@node Interpreter Changes<2>,,Optimizations<9>,Other Language Changes<9>
@anchor{whatsnew/2 6 interpreter-changes}@anchor{15d0}@anchor{whatsnew/2 6 new-26-interpreter}@anchor{15d1}
@subsubsection Interpreter Changes


Two command-line options have been reserved for use by other Python
implementations.  The @code{-J} switch has been reserved for use by
Jython for Jython-specific options, such as switches that are passed to
the underlying JVM.  @ref{16f,,-X} has been reserved for options
specific to a particular implementation of Python such as CPython,
Jython, or IronPython.  If either option is used with Python 2.6, the
interpreter will report that the option isn’t currently used.

Python can now be prevented from writing @code{.pyc} or @code{.pyo}
files by supplying the @ref{15d2,,-B} switch to the Python interpreter,
or by setting the 
@geindex PYTHONDONTWRITEBYTECODE
@geindex 환경 변수; PYTHONDONTWRITEBYTECODE
@ref{15d3,,PYTHONDONTWRITEBYTECODE} environment
variable before running the interpreter.  This setting is available to
Python programs as the @code{sys.dont_write_bytecode} variable, and
Python code can change the value to modify the interpreter’s
behaviour.  (Contributed by Neal Norwitz and Georg Brandl.)

The encoding used for standard input, output, and standard error can
be specified by setting the 
@geindex PYTHONIOENCODING
@geindex 환경 변수; PYTHONIOENCODING
@ref{1209,,PYTHONIOENCODING} environment
variable before running the interpreter.  The value should be a string
in the form @code{<encoding>} or @code{<encoding>:<errorhandler>}.
The `encoding' part specifies the encoding’s name, e.g. @code{utf-8} or
@code{latin-1}; the optional `errorhandler' part specifies
what to do with characters that can’t be handled by the encoding,
and  should be one of “error”, “ignore”, or “replace”.   (Contributed
by Martin von Löwis.)

@c ======================================================================

@node New and Improved Modules<2>,Deprecations and Removals,Other Language Changes<9>,What’s New in Python 2 6
@anchor{whatsnew/2 6 new-and-improved-modules}@anchor{15d4}
@subsection New and Improved Modules


As in every release, Python’s standard library received a number of
enhancements and bug fixes.  Here’s a partial list of the most notable
changes, sorted alphabetically by module name. Consult the
@code{Misc/NEWS} file in the source tree for a more complete list of
changes, or look through the Subversion logs for all the details.


@itemize *

@item 
The @code{asyncore} and @code{asynchat} modules are
being actively maintained again, and a number of patches and bugfixes
were applied.  (Maintained by Josiah Carlson; see bpo-1736190@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1736190} for
one patch.)

@item 
The @code{bsddb} module also has a new maintainer, Jesús Cea Avión, and the package
is now available as a standalone package.  The web page for the package is
www.jcea.es/programacion/pybsddb.htm@footnote{https://www.jcea.es/programacion/pybsddb.htm}.
The plan is to remove the package from the standard library
in Python 3.0, because its pace of releases is much more frequent than
Python’s.

The @code{bsddb.dbshelve} module now uses the highest pickling protocol
available, instead of restricting itself to protocol 1.
(Contributed by W. Barnes.)

@item 
The @code{cgi} module will now read variables from the query string
of an HTTP POST request.  This makes it possible to use form actions
with URLs that include query strings such as
“/cgi-bin/add.py?category=1”.  (Contributed by Alexandre Fiori and
Nubis; bpo-1817@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1817}.)

The @code{parse_qs()} and @code{parse_qsl()} functions have been
relocated from the @code{cgi} module to the @ref{110,,urlparse} module.
The versions still available in the @code{cgi} module will
trigger @ref{ac6,,PendingDeprecationWarning} messages in 2.6
(bpo-600362@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=600362}).

@item 
The @ref{19,,cmath} module underwent extensive revision,
contributed by Mark Dickinson and Christian Heimes.
Five new functions were added:


@itemize *

@item 
@code{polar()} converts a complex number to polar form, returning
the modulus and argument of the complex number.

@item 
@code{rect()} does the opposite, turning a modulus, argument pair
back into the corresponding complex number.

@item 
@code{phase()} returns the argument (also called the angle) of a complex
number.

@item 
@code{isnan()} returns True if either
the real or imaginary part of its argument is a NaN.

@item 
@code{isinf()} returns True if either the real or imaginary part of
its argument is infinite.
@end itemize

The revisions also improved the numerical soundness of the
@ref{19,,cmath} module.  For all functions, the real and imaginary
parts of the results are accurate to within a few units of least
precision (ulps) whenever possible.  See bpo-1381@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1381} for the
details.  The branch cuts for @code{asinh()}, @code{atanh()}: and
@code{atan()} have also been corrected.

The tests for the module have been greatly expanded; nearly 2000 new
test cases exercise the algebraic functions.

On IEEE 754 platforms, the @ref{19,,cmath} module now handles IEEE 754
special values and floating-point exceptions in a manner consistent
with Annex ‘G’ of the C99 standard.

@item 
A new data type in the @ref{1e,,collections} module: @code{namedtuple(typename, fieldnames)}
is a factory function that creates subclasses of the standard tuple
whose fields are accessible by name as well as index.  For example:

@example
>>> var_type = collections.namedtuple('variable',
...             'id name type size')
>>> # Names are separated by spaces or commas.
>>> # 'id, name, type, size' would also work.
>>> var_type._fields
('id', 'name', 'type', 'size')

>>> var = var_type(1, 'frequency', 'int', 4)
>>> print var[0], var.id    # Equivalent
1 1
>>> print var[2], var.type  # Equivalent
int int
>>> var._asdict()
@{'size': 4, 'type': 'int', 'id': 1, 'name': 'frequency'@}
>>> v2 = var._replace(name='amplitude')
>>> v2
variable(id=1, name='amplitude', type='int', size=4)
@end example

Several places in the standard library that returned tuples have
been modified to return @code{namedtuple()} instances.  For example,
the @code{Decimal.as_tuple()} method now returns a named tuple with
@code{sign}, @code{digits}, and @code{exponent} fields.

(Contributed by Raymond Hettinger.)

@item 
Another change to the @ref{1e,,collections} module is that the
@code{deque} type now supports an optional `maxlen' parameter;
if supplied, the deque’s size will be restricted to no more
than `maxlen' items.  Adding more items to a full deque causes
old items to be discarded.

@example
>>> from collections import deque
>>> dq=deque(maxlen=3)
>>> dq
deque([], maxlen=3)
>>> dq.append(1); dq.append(2); dq.append(3)
>>> dq
deque([1, 2, 3], maxlen=3)
>>> dq.append(4)
>>> dq
deque([2, 3, 4], maxlen=3)
@end example

(Contributed by Raymond Hettinger.)

@item 
The @ref{75,,Cookie} module’s @ref{dfa,,Morsel} objects now support an
@ref{15d5,,httponly} attribute.  In some browsers. cookies with this attribute
set cannot be accessed or manipulated by JavaScript code.
(Contributed by Arvin Schnell; bpo-1638033@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1638033}.)

@item 
A new window method in the @ref{2f,,curses} module,
@code{chgat()}, changes the display attributes for a certain number of
characters on a single line.  (Contributed by Fabian Kreutz.)

@example
# Boldface text starting at y=0,x=21
# and affecting the rest of the line.
stdscr.chgat(0, 21, curses.A_BOLD)
@end example

The @code{Textbox} class in the @ref{32,,curses.textpad} module
now supports editing in insert mode as well as overwrite mode.
Insert mode is enabled by supplying a true value for the `insert_mode'
parameter when creating the @code{Textbox} instance.

@item 
The @ref{34,,datetime} module’s @code{strftime()} methods now support a
@code{%f} format code that expands to the number of microseconds in the
object, zero-padded on
the left to six places.  (Contributed by Skip Montanaro; bpo-1158@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1158}.)

@item 
The @ref{3a,,decimal} module was updated to version 1.66 of
the General Decimal Specification@footnote{https://speleotrove.com/decimal/decarith.html}.  New features
include some methods for some basic mathematical functions such as
@code{exp()} and @code{log10()}:

@example
>>> Decimal(1).exp()
Decimal("2.718281828459045235360287471")
>>> Decimal("2.7182818").ln()
Decimal("0.9999999895305022877376682436")
>>> Decimal(1000).log10()
Decimal("3")
@end example

The @code{as_tuple()} method of @code{Decimal} objects now returns a
named tuple with @code{sign}, @code{digits}, and @code{exponent} fields.

(Implemented by Facundo Batista and Mark Dickinson.  Named tuple
support added by Raymond Hettinger.)

@item 
The @ref{3b,,difflib} module’s @code{SequenceMatcher} class
now returns named tuples representing matches,
with @code{a}, @code{b}, and @code{size} attributes.
(Contributed by Raymond Hettinger.)

@item 
An optional @code{timeout} parameter, specifying a timeout measured in
seconds, was added to the @ref{af6,,ftplib.FTP} class constructor as
well as the @code{connect()} method.  (Added by Facundo Batista.)
Also, the @code{FTP} class’s @code{storbinary()} and
@code{storlines()} now take an optional `callback' parameter that
will be called with each block of data after the data has been sent.
(Contributed by Phil Schwartz; bpo-1221598@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1221598}.)

@item 
The @code{reduce()} built-in function is also available in the
@ref{63,,functools} module.  In Python 3.0, the builtin has been
dropped and @code{reduce()} is only available from @code{functools};
currently there are no plans to drop the builtin in the 2.x series.
(Patched by Christian Heimes; bpo-1739906@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1739906}.)

@item 
When possible, the @ref{66,,getpass} module will now use
@code{/dev/tty} to print a prompt message and read the password,
falling back to standard error and standard input.  If the
password may be echoed to the terminal, a warning is printed before
the prompt is displayed.  (Contributed by Gregory P. Smith.)

@item 
The @ref{59f,,glob.glob()} function can now return Unicode filenames if
a Unicode path was used and Unicode filenames are matched within the
directory.  (bpo-1001604@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1001604})

@item 
A new function in the @ref{6d,,heapq} module, @code{merge(iter1, iter2, ...)},
takes any number of iterables returning data in sorted
order, and returns a new generator that returns the contents of all
the iterators, also in sorted order.  For example:

@example
>>> list(heapq.merge([1, 3, 5, 9], [2, 8, 16]))
[1, 2, 3, 5, 8, 9, 16]
@end example

Another new function, @code{heappushpop(heap, item)},
pushes `item' onto `heap', then pops off and returns the smallest item.
This is more efficient than making a call to @code{heappush()} and then
@code{heappop()}.

@ref{6d,,heapq} is now implemented to only use less-than comparison,
instead of the less-than-or-equal comparison it previously used.
This makes @code{heapq}’s usage of a type match the
@ref{dc7,,list.sort()} method.
(Contributed by Raymond Hettinger.)

@item 
An optional @code{timeout} parameter, specifying a timeout measured in
seconds, was added to the @ref{d34,,httplib.HTTPConnection} and
@ref{d35,,HTTPSConnection} class constructors.  (Added by Facundo
Batista.)

@item 
Most of the @ref{82,,inspect} module’s functions, such as
@code{getmoduleinfo()} and @code{getargs()}, now return named tuples.
In addition to behaving like tuples, the elements of the  return value
can also be accessed as attributes.
(Contributed by Raymond Hettinger.)

Some new functions in the module include
@code{isgenerator()}, @code{isgeneratorfunction()},
and @code{isabstract()}.

@item 
The @ref{85,,itertools} module gained several new functions.

@code{izip_longest(iter1, iter2, ...[, fillvalue])} makes tuples from
each of the elements; if some of the iterables are shorter than
others, the missing values are set to `fillvalue'.  For example:

@example
>>> tuple(itertools.izip_longest([1,2,3], [1,2,3,4,5]))
((1, 1), (2, 2), (3, 3), (None, 4), (None, 5))
@end example

@code{product(iter1, iter2, ..., [repeat=N])} returns the Cartesian product
of the supplied iterables, a set of tuples containing
every possible combination of the elements returned from each iterable.

@example
>>> list(itertools.product([1,2,3], [4,5,6]))
[(1, 4), (1, 5), (1, 6),
 (2, 4), (2, 5), (2, 6),
 (3, 4), (3, 5), (3, 6)]
@end example

The optional `repeat' keyword argument is used for taking the
product of an iterable or a set of iterables with themselves,
repeated `N' times.  With a single iterable argument, `N'-tuples
are returned:

@example
>>> list(itertools.product([1,2], repeat=3))
[(1, 1, 1), (1, 1, 2), (1, 2, 1), (1, 2, 2),
 (2, 1, 1), (2, 1, 2), (2, 2, 1), (2, 2, 2)]
@end example

With two iterables, `2N'-tuples are returned.

@example
>>> list(itertools.product([1,2], [3,4], repeat=2))
[(1, 3, 1, 3), (1, 3, 1, 4), (1, 3, 2, 3), (1, 3, 2, 4),
 (1, 4, 1, 3), (1, 4, 1, 4), (1, 4, 2, 3), (1, 4, 2, 4),
 (2, 3, 1, 3), (2, 3, 1, 4), (2, 3, 2, 3), (2, 3, 2, 4),
 (2, 4, 1, 3), (2, 4, 1, 4), (2, 4, 2, 3), (2, 4, 2, 4)]
@end example

@code{combinations(iterable, r)} returns sub-sequences of length `r' from
the elements of `iterable'.

@example
>>> list(itertools.combinations('123', 2))
[('1', '2'), ('1', '3'), ('2', '3')]
>>> list(itertools.combinations('123', 3))
[('1', '2', '3')]
>>> list(itertools.combinations('1234', 3))
[('1', '2', '3'), ('1', '2', '4'),
 ('1', '3', '4'), ('2', '3', '4')]
@end example

@code{permutations(iter[, r])} returns all the permutations of length `r' of
the iterable’s elements.  If `r' is not specified, it will default to the
number of elements produced by the iterable.

@example
>>> list(itertools.permutations([1,2,3,4], 2))
[(1, 2), (1, 3), (1, 4),
 (2, 1), (2, 3), (2, 4),
 (3, 1), (3, 2), (3, 4),
 (4, 1), (4, 2), (4, 3)]
@end example

@code{itertools.chain(*iterables)} is an existing function in
@ref{85,,itertools} that gained a new constructor in Python 2.6.
@code{itertools.chain.from_iterable(iterable)} takes a single
iterable that should return other iterables.  @code{chain()} will
then return all the elements of the first iterable, then
all the elements of the second, and so on.

@example
>>> list(itertools.chain.from_iterable([[1,2,3], [4,5,6]]))
[1, 2, 3, 4, 5, 6]
@end example

(All contributed by Raymond Hettinger.)

@item 
The @ref{8b,,logging} module’s @code{FileHandler} class
and its subclasses @code{WatchedFileHandler}, @code{RotatingFileHandler},
and @code{TimedRotatingFileHandler} now
have an optional `delay' parameter to their constructors.  If `delay'
is true, opening of the log file is deferred until the first
@code{emit()} call is made.  (Contributed by Vinay Sajip.)

@code{TimedRotatingFileHandler} also has a `utc' constructor
parameter.  If the argument is true, UTC time will be used
in determining when midnight occurs and in generating filenames;
otherwise local time will be used.

@item 
Several new functions were added to the @ref{92,,math} module:


@itemize *

@item 
@ref{15d6,,isinf()} and @ref{15d7,,isnan()} determine whether a given float
is a (positive or negative) infinity or a NaN (Not a Number), respectively.

@item 
@ref{15d8,,copysign()} copies the sign bit of an IEEE 754 number,
returning the absolute value of `x' combined with the sign bit of
`y'.  For example, @code{math.copysign(1, -0.0)} returns -1.0.
(Contributed by Christian Heimes.)

@item 
@ref{b41,,factorial()} computes the factorial of a number.
(Contributed by Raymond Hettinger; bpo-2138@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2138}.)

@item 
@ref{15d9,,fsum()} adds up the stream of numbers from an iterable,
and is careful to avoid loss of precision through using partial sums.
(Contributed by Jean Brouwers, Raymond Hettinger, and Mark Dickinson;
bpo-2819@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2819}.)

@item 
@ref{15da,,acosh()}, @ref{15db,,asinh()}
and @ref{15dc,,atanh()} compute the inverse hyperbolic functions.

@item 
@ref{15dd,,log1p()} returns the natural logarithm of `1+x'
(base `e').

@item 
@code{trunc()} rounds a number toward zero, returning the closest
@code{Integral} that’s between the function’s argument and zero.
Added as part of the backport of
@ref{14c2,,PEP 3141's type hierarchy for numbers}.
@end itemize

@item 
The @ref{92,,math} module has been improved to give more consistent
behaviour across platforms, especially with respect to handling of
floating-point exceptions and IEEE 754 special values.

Whenever possible, the module follows the recommendations of the C99
standard about 754’s special values.  For example, @code{sqrt(-1.)}
should now give a @ref{2ec,,ValueError} across almost all platforms,
while @code{sqrt(float('NaN'))} should return a NaN on all IEEE 754
platforms.  Where Annex ‘F’ of the C99 standard recommends signaling
‘divide-by-zero’ or ‘invalid’, Python will raise @code{ValueError}.
Where Annex ‘F’ of the C99 standard recommends signaling ‘overflow’,
Python will raise @ref{a81,,OverflowError}.  (See bpo-711019@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=711019} and
bpo-1640@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1640}.)

(Contributed by Christian Heimes and Mark Dickinson.)

@item 
@ref{518,,mmap} objects now have a @code{rfind()} method that searches for a
substring beginning at the end of the string and searching
backwards.  The @code{find()} method also gained an `end' parameter
giving an index at which to stop searching.
(Contributed by John Lenton.)

@item 
The @ref{a3,,operator} module gained a
@code{methodcaller()} function that takes a name and an optional
set of arguments, returning a callable that will call
the named function on any arguments passed to it.  For example:

@example
>>> # Equivalent to lambda s: s.replace('old', 'new')
>>> replacer = operator.methodcaller('replace', 'old', 'new')
>>> replacer('old wine in old bottles')
'new wine in new bottles'
@end example

(Contributed by Georg Brandl, after a suggestion by Gregory Petrosyan.)

The @code{attrgetter()} function now accepts dotted names and performs
the corresponding attribute lookups:

@example
>>> inst_name = operator.attrgetter(
...        '__class__.__name__')
>>> inst_name('@w{'})
'str'
>>> inst_name(help)
'_Helper'
@end example

(Contributed by Georg Brandl, after a suggestion by Barry Warsaw.)

@item 
The @ref{a5,,os} module now wraps several new system calls.
@code{fchmod(fd, mode)} and @code{fchown(fd, uid, gid)} change the mode
and ownership of an opened file, and @code{lchmod(path, mode)} changes
the mode of a symlink.  (Contributed by Georg Brandl and Christian
Heimes.)

@code{chflags()} and @code{lchflags()} are wrappers for the
corresponding system calls (where they’re available), changing the
flags set on a file.  Constants for the flag values are defined in
the @ref{d6,,stat} module; some possible values include
@code{UF_IMMUTABLE} to signal the file may not be changed and
@code{UF_APPEND} to indicate that data can only be appended to the
file.  (Contributed by M. Levinson.)

@code{os.closerange(low, high)} efficiently closes all file descriptors
from `low' to `high', ignoring any errors and not including `high' itself.
This function is now used by the @ref{dc,,subprocess} module to make starting
processes faster.  (Contributed by Georg Brandl; bpo-1663329@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1663329}.)

@item 
The @code{os.environ} object’s @code{clear()} method will now unset the
environment variables using @ref{25c,,os.unsetenv()} in addition to clearing
the object’s keys.  (Contributed by Martin Horcicka; bpo-1181@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1181}.)

@item 
The @ref{6cf,,os.walk()} function now has a @code{followlinks} parameter. If
set to True, it will follow symlinks pointing to directories and
visit the directory’s contents.  For backward compatibility, the
parameter’s default value is false.  Note that the function can fall
into an infinite recursion if there’s a symlink that points to a
parent directory.  (bpo-1273829@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1273829})

@item 
In the @ref{a6,,os.path} module, the @code{splitext()} function
has been changed to not split on leading period characters.
This produces better results when operating on Unix’s dot-files.
For example, @code{os.path.splitext('.ipython')}
now returns @code{('.ipython', '@w{'})} instead of @code{('@w{'}, '.ipython')}.
(bpo-1115886@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1115886})

A new function, @code{os.path.relpath(path, start='.')}, returns a relative path
from the @code{start} path, if it’s supplied, or from the current
working directory to the destination @code{path}.  (Contributed by
Richard Barran; bpo-1339796@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1339796}.)

On Windows, @ref{15de,,os.path.expandvars()} will now expand environment variables
given in the form “%var%”, and “~user” will be expanded into the
user’s home directory path.  (Contributed by Josiah Carlson;
bpo-957650@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=957650}.)

@item 
The Python debugger provided by the @ref{aa,,pdb} module
gained a new command: “run” restarts the Python program being debugged
and can optionally take new command-line arguments for the program.
(Contributed by Rocky Bernstein; bpo-1393667@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1393667}.)

@item 
The @ref{15df,,pdb.post_mortem()} function, used to begin debugging a
traceback, will now use the traceback returned by @ref{899,,sys.exc_info()}
if no traceback is supplied.   (Contributed by Facundo Batista;
bpo-1106316@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1106316}.)

@item 
The @ref{ac,,pickletools} module now has an @code{optimize()} function
that takes a string containing a pickle and removes some unused
opcodes, returning a shorter pickle that contains the same data structure.
(Contributed by Raymond Hettinger.)

@item 
A @code{get_data()} function was added to the @ref{ae,,pkgutil}
module that returns the contents of resource files included
with an installed Python package.  For example:

@example
>>> import pkgutil
>>> print pkgutil.get_data('test', 'exception_hierarchy.txt')
BaseException
 +-- SystemExit
 +-- KeyboardInterrupt
 +-- GeneratorExit
 +-- Exception
      +-- StopIteration
      +-- StandardError
 ...
@end example

(Contributed by Paul Moore; bpo-2439@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2439}.)

@item 
The @code{pyexpat} module’s @code{Parser} objects now allow setting
their @code{buffer_size} attribute to change the size of the buffer
used to hold character data.
(Contributed by Achim Gaedke; bpo-1137@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1137}.)

@item 
The @code{Queue} module now provides queue variants that retrieve entries
in different orders.  The @code{PriorityQueue} class stores
queued items in a heap and retrieves them in priority order,
and @code{LifoQueue} retrieves the most recently added entries first,
meaning that it behaves like a stack.
(Contributed by Raymond Hettinger.)

@item 
The @ref{bd,,random} module’s @code{Random} objects can
now be pickled on a 32-bit system and unpickled on a 64-bit
system, and vice versa.  Unfortunately, this change also means
that Python 2.6’s @code{Random} objects can’t be unpickled correctly
on earlier versions of Python.
(Contributed by Shawn Ligocki; bpo-1727780@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1727780}.)

The new @code{triangular(low, high, mode)} function returns random
numbers following a triangular distribution.   The returned values
are between `low' and `high', not including `high' itself, and
with `mode' as the most frequently occurring value
in the distribution.  (Contributed by Wladmir van der Laan and
Raymond Hettinger; bpo-1681432@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1681432}.)

@item 
Long regular expression searches carried out by the  @ref{be,,re}
module will check for signals being delivered, so
time-consuming searches can now be interrupted.
(Contributed by Josh Hoyt and Ralf Schmitt; bpo-846388@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=846388}.)

The regular expression module is implemented by compiling bytecodes
for a tiny regex-specific virtual machine.  Untrusted code
could create malicious strings of bytecode directly and cause crashes,
so Python 2.6 includes a verifier for the regex bytecode.
(Contributed by Guido van Rossum from work for Google App Engine;
bpo-3487@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=3487}.)

@item 
The @ref{c2,,rlcompleter} module’s @code{Completer.complete()} method
will now ignore exceptions triggered while evaluating a name.
(Fixed by Lorenz Quack; bpo-2250@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2250}.)

@item 
The @ref{c4,,sched} module’s @code{scheduler} instances now
have a read-only @ref{bb,,queue} attribute that returns the
contents of the scheduler’s queue, represented as a list of
named tuples with the fields @code{(time, priority, action, argument)}.
(Contributed by Raymond Hettinger; bpo-1861@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1861}.)

@item 
The @ref{c6,,select} module now has wrapper functions
for the Linux @code{epoll()} and BSD @code{kqueue()} system calls.
@code{modify()} method was added to the existing @code{poll}
objects; @code{pollobj.modify(fd, eventmask)} takes a file descriptor
or file object and an event mask, modifying the recorded event mask
for that file.
(Contributed by Christian Heimes; bpo-1657@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1657}.)

@item 
The @ref{c1d,,shutil.copytree()} function now has an optional `ignore' argument
that takes a callable object.  This callable will receive each directory path
and a list of the directory’s contents, and returns a list of names that
will be ignored, not copied.

The @ref{ca,,shutil} module also provides an @code{ignore_patterns()}
function for use with this new parameter.  @code{ignore_patterns()}
takes an arbitrary number of glob-style patterns and returns a
callable that will ignore any files and directories that match any
of these patterns.  The following example copies a directory tree,
but skips both @code{.svn} directories and Emacs backup files,
which have names ending with ‘~’:

@example
shutil.copytree('Doc/library', '/tmp/library',
                ignore=shutil.ignore_patterns('*~', '.svn'))
@end example

(Contributed by Tarek Ziadé; bpo-2663@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2663}.)

@item 
Integrating signal handling with GUI handling event loops
like those used by Tkinter or GTk+ has long been a problem; most
software ends up polling, waking up every fraction of a second to check
if any GUI events have occurred.
The @ref{cb,,signal} module can now make this more efficient.
Calling @code{signal.set_wakeup_fd(fd)} sets a file descriptor
to be used; when a signal is received, a byte is written to that
file descriptor.  There’s also a C-level function,
@ref{15e0,,PySignal_SetWakeupFd()}, for setting the descriptor.

Event loops will use this by opening a pipe to create two descriptors,
one for reading and one for writing.  The writable descriptor
will be passed to @code{set_wakeup_fd()}, and the readable descriptor
will be added to the list of descriptors monitored by the event loop via
@code{select()} or @code{poll()}.
On receiving a signal, a byte will be written and the main event loop
will be woken up, avoiding the need to poll.

(Contributed by Adam Olsen; bpo-1583@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1583}.)

The @code{siginterrupt()} function is now available from Python code,
and allows changing whether signals can interrupt system calls or not.
(Contributed by Ralf Schmitt.)

The @code{setitimer()} and @code{getitimer()} functions have also been
added (where they’re available).  @code{setitimer()}
allows setting interval timers that will cause a signal to be
delivered to the process after a specified time, measured in
wall-clock time, consumed process time, or combined process+system
time.  (Contributed by Guilherme Polo; bpo-2240@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2240}.)

@item 
The @ref{cf,,smtplib} module now supports SMTP over SSL thanks to the
addition of the @code{SMTP_SSL} class. This class supports an
interface identical to the existing @code{SMTP} class.
(Contributed by Monty Taylor.)  Both class constructors also have an
optional @code{timeout} parameter that specifies a timeout for the
initial connection attempt, measured in seconds.  (Contributed by
Facundo Batista.)

An implementation of the LMTP protocol (
@geindex RFC; RFC 2033
RFC 2033@footnote{https://datatracker.ietf.org/doc/html/rfc2033.html}) was also added
to the module.  LMTP is used in place of SMTP when transferring
e-mail between agents that don’t manage a mail queue.  (LMTP
implemented by Leif Hedstrom; bpo-957003@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=957003}.)

@code{SMTP.starttls()} now complies with 
@geindex RFC; RFC 3207
RFC 3207@footnote{https://datatracker.ietf.org/doc/html/rfc3207.html} and forgets any
knowledge obtained from the server not obtained from the TLS
negotiation itself.  (Patch contributed by Bill Fenner;
bpo-829951@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=829951}.)

@item 
The @ref{d1,,socket} module now supports TIPC (@indicateurl{https://tipc.sourceforge.net/}),
a high-performance non-IP-based protocol designed for use in clustered
environments.  TIPC addresses are 4- or 5-tuples.
(Contributed by Alberto Bertogli; bpo-1646@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1646}.)

A new function, @code{create_connection()}, takes an address and
connects to it using an optional timeout value, returning the
connected socket object.  This function also looks up the address’s
type and connects to it using IPv4 or IPv6 as appropriate.  Changing
your code to use @code{create_connection()} instead of
@code{socket(socket.AF_INET, ...)} may be all that’s required to make
your code work with IPv6.

@item 
The base classes in the @ref{d2,,SocketServer} module now support
calling a @ref{1526,,handle_timeout()} method after a span of inactivity
specified by the server’s @ref{1525,,timeout} attribute.  (Contributed
by Michael Pomraning.)  The @ref{1344,,serve_forever()} method
now takes an optional poll interval measured in seconds,
controlling how often the server will check for a shutdown request.
(Contributed by Pedro Werneck and Jeffrey Yasskin;
bpo-742598@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=742598}, bpo-1193577@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1193577}.)

@item 
The @ref{d4,,sqlite3} module, maintained by Gerhard Häring,
has been updated from version 2.3.2 in Python 2.5 to
version 2.4.1.

@item 
The @ref{db,,struct} module now supports the C99 _Bool type,
using the format character @code{'?'}.
(Contributed by David Remahl.)

@item 
The @ref{4b8,,Popen} objects provided by the @ref{dc,,subprocess} module
now have @ref{15e1,,terminate()}, @ref{15e2,,kill()}, and @ref{15e3,,send_signal()} methods.
On Windows, @code{send_signal()} only supports the @ref{15e4,,SIGTERM}
signal, and all these methods are aliases for the Win32 API function
@code{TerminateProcess()}.
(Contributed by Christian Heimes.)

@item 
A new variable in the @ref{df,,sys} module, @code{float_info}, is an
object containing information derived from the @code{float.h} file
about the platform’s floating-point support.  Attributes of this
object include @code{mant_dig} (number of digits in the mantissa),
@code{epsilon} (smallest difference between 1.0 and the next
largest value representable), and several others.  (Contributed by
Christian Heimes; bpo-1534@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1534}.)

Another new variable, @code{dont_write_bytecode}, controls whether Python
writes any @code{.pyc} or @code{.pyo} files on importing a module.
If this variable is true, the compiled files are not written.  The
variable is initially set on start-up by supplying the @ref{15d2,,-B}
switch to the Python interpreter, or by setting the
@geindex PYTHONDONTWRITEBYTECODE
@geindex 환경 변수; PYTHONDONTWRITEBYTECODE
@ref{15d3,,PYTHONDONTWRITEBYTECODE} environment variable before
running the interpreter.  Python code can subsequently
change the value of this variable to control whether bytecode files
are written or not.
(Contributed by Neal Norwitz and Georg Brandl.)

Information about the command-line arguments supplied to the Python
interpreter is available by reading attributes of a named
tuple available as @code{sys.flags}.  For example, the @code{verbose}
attribute is true if Python
was executed in verbose mode, @code{debug} is true in debugging mode, etc.
These attributes are all read-only.
(Contributed by Christian Heimes.)

A new function, @code{getsizeof()}, takes a Python object and returns
the amount of memory used by the object, measured in bytes.  Built-in
objects return correct results; third-party extensions may not,
but can define a @code{__sizeof__()} method to return the
object’s size.
(Contributed by Robert Schuppenies; bpo-2898@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2898}.)

It’s now possible to determine the current profiler and tracer functions
by calling @ref{15e5,,sys.getprofile()} and @ref{15e6,,sys.gettrace()}.
(Contributed by Georg Brandl; bpo-1648@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1648}.)

@item 
The @ref{e4,,tarfile} module now supports POSIX.1-2001 (pax) tarfiles in
addition to the POSIX.1-1988 (ustar) and GNU tar formats that were
already supported.  The default format is GNU tar; specify the
@code{format} parameter to open a file using a different format:

@example
tar = tarfile.open("output.tar", "w",
                   format=tarfile.PAX_FORMAT)
@end example

The new @code{encoding} and @code{errors} parameters specify an encoding and
an error handling scheme for character conversions.  @code{'strict'},
@code{'ignore'}, and @code{'replace'} are the three standard ways Python can
handle errors,;
@code{'utf-8'} is a special value that replaces bad characters with
their UTF-8 representation.  (Character conversions occur because the
PAX format supports Unicode filenames, defaulting to UTF-8 encoding.)

The @code{TarFile.add()} method now accepts an @code{exclude} argument that’s
a function that can be used to exclude certain filenames from
an archive.
The function must take a filename and return true if the file
should be excluded or false if it should be archived.
The function is applied to both the name initially passed to @code{add()}
and to the names of files in recursively added directories.

(All changes contributed by Lars Gustäbel).

@item 
An optional @code{timeout} parameter was added to the
@code{telnetlib.Telnet} class constructor, specifying a timeout
measured in seconds.  (Added by Facundo Batista.)

@item 
The @ref{6ec,,tempfile.NamedTemporaryFile} class usually deletes
the temporary file it created when the file is closed.  This
behaviour can now be changed by passing @code{delete=False} to the
constructor.  (Contributed by Damien Miller; bpo-1537850@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1537850}.)

A new class, @code{SpooledTemporaryFile}, behaves like
a temporary file but stores its data in memory until a maximum size is
exceeded.  On reaching that limit, the contents will be written to
an on-disk temporary file.  (Contributed by Dustin J. Mitchell.)

The @code{NamedTemporaryFile} and @code{SpooledTemporaryFile} classes
both work as context managers, so you can write
@code{with tempfile.NamedTemporaryFile() as tmp: ...}.
(Contributed by Alexander Belopolsky; bpo-2021@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2021}.)

@item 
The @ref{ea,,test.test_support} module gained a number
of context managers useful for writing tests.
@ref{15e7,,EnvironmentVarGuard()} is a
context manager that temporarily changes environment variables and
automatically restores them to their old values.

Another context manager, @code{TransientResource}, can surround calls
to resources that may or may not be available; it will catch and
ignore a specified list of exceptions.  For example,
a network test may ignore certain failures when connecting to an
external web site:

@example
with test_support.TransientResource(IOError,
                                errno=errno.ETIMEDOUT):
    f = urllib.urlopen('https://sf.net')
    ...
@end example

Finally, @code{check_warnings()} resets the @code{warning} module’s
warning filters and returns an object that will record all warning
messages triggered (bpo-3781@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=3781}):

@example
with test_support.check_warnings() as wrec:
    warnings.simplefilter("always")
    # ... code that triggers a warning ...
    assert str(wrec.message) == "function is outdated"
    assert len(wrec.warnings) == 1, "Multiple warnings raised"
@end example

(Contributed by Brett Cannon.)

@item 
The @ref{f2,,textwrap} module can now preserve existing whitespace
at the beginnings and ends of the newly created lines
by specifying @code{drop_whitespace=False}
as an argument:

@example
>>> S = """This  sentence  has a bunch   of
...   extra   whitespace."""
>>> print textwrap.fill(S, width=15)
This  sentence
has a bunch
of    extra
whitespace.
>>> print textwrap.fill(S, drop_whitespace=False, width=15)
This  sentence
  has a bunch
   of    extra
   whitespace.
>>>
@end example

(Contributed by Dwayne Bailey; bpo-1581073@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1581073}.)

@item 
The @ref{f3,,threading} module API is being changed to use properties
such as @code{daemon} instead of @code{setDaemon()} and
@code{isDaemon()} methods, and some methods have been renamed to use
underscores instead of camel-case; for example, the
@code{activeCount()} method is renamed to @code{active_count()}.  Both
the 2.6 and 3.0 versions of the module support the same properties
and renamed methods, but don’t remove the old methods.  No date has been set
for the deprecation of the old APIs in Python 3.x; the old APIs won’t
be removed in any 2.x version.
(Carried out by several people, most notably Benjamin Peterson.)

The @ref{f3,,threading} module’s @code{Thread} objects
gained an @code{ident} property that returns the thread’s
identifier, a nonzero integer.  (Contributed by Gregory P. Smith;
bpo-2871@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2871}.)

@item 
The @ref{f5,,timeit} module now accepts callables as well as strings
for the statement being timed and for the setup code.
Two convenience functions were added for creating
@code{Timer} instances:
@code{repeat(stmt, setup, time, repeat, number)} and
@code{timeit(stmt, setup, time, number)} create an instance and call
the corresponding method. (Contributed by Erik Demaine;
bpo-1533909@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1533909}.)

@item 
The @code{Tkinter} module now accepts lists and tuples for options,
separating the elements by spaces before passing the resulting value to
Tcl/Tk.
(Contributed by Guilherme Polo; bpo-2906@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2906}.)

@item 
The @ref{107,,turtle} module for turtle graphics was greatly enhanced by
Gregor Lingl.  New features in the module include:


@itemize *

@item 
Better animation of turtle movement and rotation.

@item 
Control over turtle movement using the new @code{delay()},
@code{tracer()}, and @code{speed()} methods.

@item 
The ability to set new shapes for the turtle, and to
define a new coordinate system.

@item 
Turtles now have an @code{undo()} method that can roll back actions.

@item 
Simple support for reacting to input events such as mouse and keyboard
activity, making it possible to write simple games.

@item 
A @code{turtle.cfg} file can be used to customize the starting appearance
of the turtle’s screen.

@item 
The module’s docstrings can be replaced by new docstrings that have been
translated into another language.
@end itemize

(bpo-1513695@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1513695})

@item 
An optional @code{timeout} parameter was added to the
@ref{307,,urllib.urlopen} function and the
@code{urllib.ftpwrapper} class constructor, as well as the
@code{urllib2.urlopen} function.  The parameter specifies a timeout
measured in seconds.   For example:

@example
>>> u = urllib2.urlopen("http://slow.example.com",
                        timeout=3)
Traceback (most recent call last):
  ...
urllib2.URLError: <urlopen error timed out>
>>>
@end example

(Added by Facundo Batista.)

@item 
The Unicode database provided by the @ref{10b,,unicodedata} module
has been updated to version 5.1.0.  (Updated by
Martin von Löwis; bpo-3811@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=3811}.)

@item 
The @ref{118,,warnings} module’s @code{formatwarning()} and @code{showwarning()}
gained an optional `line' argument that can be used to supply the
line of source code.  (Added as part of bpo-1631171@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1631171}, which re-implemented
part of the @code{warnings} module in C code.)

A new function, @code{catch_warnings()}, is a context manager
intended for testing purposes that lets you temporarily modify the
warning filters and then restore their original values (bpo-3781@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=3781}).

@item 
The XML-RPC @ref{135,,SimpleXMLRPCServer} and @code{DocXMLRPCServer}
classes can now be prevented from immediately opening and binding to
their socket by passing @code{False} as the `bind_and_activate'
constructor parameter.  This can be used to modify the instance’s
@code{allow_reuse_address} attribute before calling the
@code{server_bind()} and @code{server_activate()} methods to
open the socket and begin listening for connections.
(Contributed by Peter Parente; bpo-1599845@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1599845}.)

@code{SimpleXMLRPCServer} also has a @code{_send_traceback_header}
attribute; if true, the exception and formatted traceback are returned
as HTTP headers “X-Exception” and “X-Traceback”.  This feature is
for debugging purposes only and should not be used on production servers
because the tracebacks might reveal passwords or other sensitive
information.  (Contributed by Alan McIntyre as part of his
project for Google’s Summer of Code 2007.)

@item 
The @ref{134,,xmlrpclib} module no longer automatically converts
@ref{1fa,,datetime.date} and @ref{1fb,,datetime.time} to the
@ref{15e8,,xmlrpclib.DateTime} type; the conversion semantics were
not necessarily correct for all applications.  Code using
@code{xmlrpclib} should convert @code{date} and @code{time}
instances. (bpo-1330538@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1330538})  The code can also handle
dates before 1900 (contributed by Ralf Schmitt; bpo-2014@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2014})
and 64-bit integers represented by using @code{<i8>} in XML-RPC responses
(contributed by Riku Lindblad; bpo-2985@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2985}).

@item 
The @ref{137,,zipfile} module’s @code{ZipFile} class now has
@code{extract()} and @code{extractall()} methods that will unpack
a single file or all the files in the archive to the current directory, or
to a specified directory:

@example
z = zipfile.ZipFile('python-251.zip')

# Unpack a single file, writing it relative
# to the /tmp directory.
z.extract('Python/sysmodule.c', '/tmp')

# Unpack all the files in the archive.
z.extractall()
@end example

(Contributed by Alan McIntyre; bpo-467924@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=467924}.)

The @ref{316,,open()}, @code{read()} and @code{extract()} methods can now
take either a filename or a @code{ZipInfo} object.  This is useful when an
archive accidentally contains a duplicated filename.
(Contributed by Graham Horler; bpo-1775025@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1775025}.)

Finally, @ref{137,,zipfile} now supports using Unicode filenames
for archived files.  (Contributed by Alexey Borzenkov; bpo-1734346@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1734346}.)
@end itemize

@c ======================================================================

@c whole new modules get described in subsections here

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

@end menu

@node The ast module,The future_builtins module,,New and Improved Modules<2>
@anchor{whatsnew/2 6 the-ast-module}@anchor{15e9}
@subsubsection The @code{ast} module


The @ref{9,,ast} module provides an Abstract Syntax Tree
representation of Python code, and Armin Ronacher
contributed a set of helper functions that perform a variety of
common tasks.  These will be useful for HTML templating
packages, code analyzers, and similar tools that process
Python code.

The @code{parse()} function takes an expression and returns an AST.
The @code{dump()} function outputs a representation of a tree, suitable
for debugging:

@example
import ast

t = ast.parse("""
d = @{@}
for i in 'abcdefghijklm':
    d[i + i] = ord(i) - ord('a') + 1
print d
""")
print ast.dump(t)
@end example

This outputs a deeply nested tree:

@example
Module(body=[
  Assign(targets=[
    Name(id='d', ctx=Store())
   ], value=Dict(keys=[], values=[]))
  For(target=Name(id='i', ctx=Store()),
      iter=Str(s='abcdefghijklm'), body=[
    Assign(targets=[
      Subscript(value=
        Name(id='d', ctx=Load()),
          slice=
          Index(value=
            BinOp(left=Name(id='i', ctx=Load()), op=Add(),
             right=Name(id='i', ctx=Load()))), ctx=Store())
     ], value=
     BinOp(left=
      BinOp(left=
       Call(func=
        Name(id='ord', ctx=Load()), args=[
          Name(id='i', ctx=Load())
         ], keywords=[], starargs=None, kwargs=None),
       op=Sub(), right=Call(func=
        Name(id='ord', ctx=Load()), args=[
          Str(s='a')
         ], keywords=[], starargs=None, kwargs=None)),
       op=Add(), right=Num(n=1)))
    ], orelse=[])
   Print(dest=None, values=[
     Name(id='d', ctx=Load())
   ], nl=True)
 ])
@end example

The @code{literal_eval()} method takes a string or an AST
representing a literal expression, parses and evaluates it, and
returns the resulting value.  A literal expression is a Python
expression containing only strings, numbers, dictionaries,
etc. but no statements or function calls.  If you need to
evaluate an expression but cannot accept the security risk of using an
@ref{4a4,,eval()} call, @code{literal_eval()} will handle it safely:

@example
>>> literal = '("a", "b", @{2:4, 3:8, 1:2@})'
>>> print ast.literal_eval(literal)
('a', 'b', @{1: 2, 2: 4, 3: 8@})
>>> print ast.literal_eval('"a" + "b"')
Traceback (most recent call last):
  ...
ValueError: malformed string
@end example

The module also includes @code{NodeVisitor} and
@code{NodeTransformer} classes for traversing and modifying an AST,
and functions for common transformations such as changing line
numbers.

@c ======================================================================

@node The future_builtins module,The json module JavaScript Object Notation,The ast module,New and Improved Modules<2>
@anchor{whatsnew/2 6 the-future-builtins-module}@anchor{15ea}
@subsubsection The @code{future_builtins} module


Python 3.0 makes many changes to the repertoire of built-in
functions, and most of the changes can’t be introduced in the Python
2.x series because they would break compatibility.
The @code{future_builtins} module provides versions
of these built-in functions that can be imported when writing
3.0-compatible code.

The functions in this module currently include:


@itemize *

@item 
@code{ascii(obj)}: equivalent to @ref{1c1,,repr()}.  In Python 3.0,
@code{repr()} will return a Unicode string, while @ref{15eb,,ascii()} will
return a pure ASCII bytestring.

@item 
@code{filter(predicate, iterable)},
@code{map(func, iterable1, ...)}: the 3.0 versions
return iterators, unlike the 2.x builtins which return lists.

@item 
@code{hex(value)}, @code{oct(value)}: instead of calling the
@code{__hex__()} or @code{__oct__()} methods, these versions will
call the @code{__index__()} method and convert the result to hexadecimal
or octal.  @ref{14d3,,oct()} will use the new @code{0o} notation for its
result.
@end itemize

@c ======================================================================

@node The json module JavaScript Object Notation,The plistlib module A Property-List Parser,The future_builtins module,New and Improved Modules<2>
@anchor{whatsnew/2 6 the-json-module-javascript-object-notation}@anchor{15ec}
@subsubsection The @code{json} module: JavaScript Object Notation


The new @ref{86,,json} module supports the encoding and decoding of Python types in
JSON (Javascript Object Notation). JSON is a lightweight interchange format
often used in web applications. For more information about JSON, see
@indicateurl{http://www.json.org}.

@ref{86,,json} comes with support for decoding and encoding most built-in Python
types. The following example encodes and decodes a dictionary:

@example
>>> import json
>>> data = @{"spam": "foo", "parrot": 42@}
>>> in_json = json.dumps(data) # Encode the data
>>> in_json
'@{"parrot": 42, "spam": "foo"@}'
>>> json.loads(in_json) # Decode into a Python object
@{"spam": "foo", "parrot": 42@}
@end example

It’s also possible to write your own decoders and encoders to support
more types. Pretty-printing of the JSON strings is also supported.

@ref{86,,json} (originally called simplejson) was written by Bob
Ippolito.

@c ======================================================================

@node The plistlib module A Property-List Parser,ctypes Enhancements,The json module JavaScript Object Notation,New and Improved Modules<2>
@anchor{whatsnew/2 6 the-plistlib-module-a-property-list-parser}@anchor{15ed}
@subsubsection The @code{plistlib} module: A Property-List Parser


The @code{.plist} format is commonly used on Mac OS X to
store basic data types (numbers, strings, lists,
and dictionaries) by serializing them into an XML-based format.
It resembles the XML-RPC serialization of data types.

Despite being primarily used on Mac OS X, the format
has nothing Mac-specific about it and the Python implementation works
on any platform that Python supports, so the @ref{b0,,plistlib} module
has been promoted to the standard library.

Using the module is simple:

@example
import sys
import plistlib
import datetime as dt

# Create data structure
data_struct = dict(lastAccessed=dt.datetime.now(),
                   version=1,
                   categories=('Personal','Shared','Private'))

# Create string containing XML.
plist_str = plistlib.writePlistToString(data_struct)
new_struct = plistlib.readPlistFromString(plist_str)
print data_struct
print new_struct

# Write data structure to a file and read it back.
plistlib.writePlist(data_struct, '/tmp/customizations.plist')
new_struct = plistlib.readPlist('/tmp/customizations.plist')

# read/writePlist accepts file-like objects as well as paths.
plistlib.writePlist(data_struct, sys.stdout)
@end example

@c ======================================================================

@node ctypes Enhancements,Improved SSL Support,The plistlib module A Property-List Parser,New and Improved Modules<2>
@anchor{whatsnew/2 6 ctypes-enhancements}@anchor{15ee}
@subsubsection ctypes Enhancements


Thomas Heller continued to maintain and enhance the
@ref{2e,,ctypes} module.

@ref{2e,,ctypes} now supports a @code{c_bool} datatype
that represents the C99 @code{bool} type.  (Contributed by David Remahl;
bpo-1649190@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1649190}.)

The @ref{2e,,ctypes} string, buffer and array types have improved
support for extended slicing syntax,
where various combinations of @code{(start, stop, step)} are supplied.
(Implemented by Thomas Wouters.)

@c Revision 57769

All @ref{2e,,ctypes} data types now support
@code{from_buffer()} and @code{from_buffer_copy()}
methods that create a ctypes instance based on a
provided buffer object.  @code{from_buffer_copy()} copies
the contents of the object,
while @code{from_buffer()} will share the same memory area.

A new calling convention tells @ref{2e,,ctypes} to clear the @code{errno} or
Win32 LastError variables at the outset of each wrapped call.
(Implemented by Thomas Heller; bpo-1798@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1798}.)

You can now retrieve the Unix @code{errno} variable after a function
call.  When creating a wrapped function, you can supply
@code{use_errno=True} as a keyword parameter to the @code{DLL()} function
and then call the module-level methods @code{set_errno()} and
@code{get_errno()} to set and retrieve the error value.

The Win32 LastError variable is similarly supported by
the @code{DLL()}, @code{OleDLL()}, and @code{WinDLL()} functions.
You supply @code{use_last_error=True} as a keyword parameter
and then call the module-level methods @code{set_last_error()}
and @code{get_last_error()}.

The @code{byref()} function, used to retrieve a pointer to a ctypes
instance, now has an optional `offset' parameter that is a byte
count that will be added to the returned pointer.

@c ======================================================================

@node Improved SSL Support,,ctypes Enhancements,New and Improved Modules<2>
@anchor{whatsnew/2 6 improved-ssl-support}@anchor{15ef}
@subsubsection Improved SSL Support


Bill Janssen made extensive improvements to Python 2.6’s support for
the Secure Sockets Layer by adding a new module, @ref{d5,,ssl}, that’s
built atop the OpenSSL@footnote{https://www.openssl.org/} library.
This new module provides more control over the protocol negotiated,
the X.509 certificates used, and has better support for writing SSL
servers (as opposed to clients) in Python.  The existing SSL support
in the @ref{d1,,socket} module hasn’t been removed and continues to work,
though it will be removed in Python 3.0.

To use the new module, you must first create a TCP connection in the
usual way and then pass it to the @code{ssl.wrap_socket()} function.
It’s possible to specify whether a certificate is required, and to
obtain certificate info by calling the @code{getpeercert()} method.


@subsubheading 더 보기


The documentation for the @ref{d5,,ssl} module.


@c ======================================================================

@node Deprecations and Removals,Build and C API Changes<6>,New and Improved Modules<2>,What’s New in Python 2 6
@anchor{whatsnew/2 6 deprecations-and-removals}@anchor{15f0}
@subsection Deprecations and Removals



@itemize *

@item 
String exceptions have been removed.  Attempting to use them raises a
@ref{198,,TypeError}.

@item 
Changes to the @ref{bcc,,Exception} interface
as dictated by 
@geindex Python 향상 제안; PEP 352
PEP 352@footnote{https://peps.python.org/pep-0352/} continue to be made.  For 2.6,
the @code{message} attribute is being deprecated in favor of the
@ref{78c,,args} attribute.

@item 
(3.0-warning mode) Python 3.0 will feature a reorganized standard
library that will drop many outdated modules and rename others.
Python 2.6 running in 3.0-warning mode will warn about these modules
when they are imported.

The list of deprecated modules is:
@code{audiodev},
@code{bgenlocations},
@code{buildtools},
@code{bundlebuilder},
@code{Canvas},
@code{compiler},
@code{dircache},
@code{dl},
@code{fpformat},
@code{gensuitemodule},
@code{ihooks},
@code{imageop},
@code{imgfile},
@code{linuxaudiodev},
@code{mhlib},
@code{mimetools},
@code{multifile},
@code{new},
@code{pure},
@code{statvfs},
@code{sunaudiodev},
@code{test.testall}, and
@code{toaiff}.

@item 
The @code{gopherlib} module has been removed.

@item 
The @code{MimeWriter} module and @code{mimify} module
have been deprecated; use the @ref{3f,,email}
package instead.

@item 
The @code{md5} module has been deprecated; use the @ref{6c,,hashlib} module
instead.

@item 
The @code{posixfile} module has been deprecated; @ref{15f1,,fcntl.lockf()}
provides better locking.

@item 
The @code{popen2} module has been deprecated; use the @ref{dc,,subprocess}
module.

@item 
The @code{rgbimg} module has been removed.

@item 
The @code{sets} module has been deprecated; it’s better to
use the built-in @ref{184,,set} and @ref{7f1,,frozenset} types.

@item 
The @code{sha} module has been deprecated; use the @ref{6c,,hashlib} module
instead.
@end itemize

@c ======================================================================

@node Build and C API Changes<6>,Porting to Python 2 6,Deprecations and Removals,What’s New in Python 2 6
@anchor{whatsnew/2 6 build-and-c-api-changes}@anchor{15f2}
@subsection Build and C API Changes


Changes to Python’s build process and to the C API include:


@itemize *

@item 
Python now must be compiled with C89 compilers (after 19
years!).  This means that the Python source tree has dropped its
own implementations of @code{memmove()} and @code{strerror()}, which
are in the C89 standard library.

@item 
Python 2.6 can be built with Microsoft Visual Studio 2008 (version
9.0), and this is the new default compiler.  See the
@code{PCbuild} directory for the build files.  (Implemented by
Christian Heimes.)

@item 
On Mac OS X, Python 2.6 can be compiled as a 4-way universal build.
The @code{configure} script
can take a @code{--with-universal-archs=[32-bit|64-bit|all]}
switch, controlling whether the binaries are built for 32-bit
architectures (x86, PowerPC), 64-bit (x86-64 and PPC-64), or both.
(Contributed by Ronald Oussoren.)

@item 
A new function added in Python 2.6.6, @code{PySys_SetArgvEx()}, sets
the value of @code{sys.argv} and can optionally update @code{sys.path} to
include the directory containing the script named by @code{sys.argv[0]}
depending on the value of an `updatepath' parameter.

This function was added to close a security hole for applications
that embed Python.  The old function, @code{PySys_SetArgv()}, would
always update @code{sys.path}, and sometimes it would add the current
directory.  This meant that, if you ran an application embedding
Python in a directory controlled by someone else, attackers could
put a Trojan-horse module in the directory (say, a file named
@code{os.py}) that your application would then import and run.

If you maintain a C/C++ application that embeds Python, check
whether you’re calling @code{PySys_SetArgv()} and carefully consider
whether the application should be using @code{PySys_SetArgvEx()}
with `updatepath' set to false.  Note that using this function will
break compatibility with Python versions 2.6.5 and earlier; if you
have to continue working with earlier versions, you can leave
the call to @code{PySys_SetArgv()} alone and call
@code{PyRun_SimpleString("sys.path.pop(0)\n")} afterwards to discard
the first @code{sys.path} component.

Security issue reported as 
@geindex Common Vulnerabilities and Exposures; CVE 2008-5983
CVE 2008-5983@footnote{https://www.cve.org/CVERecord?id=CVE-2008-5983};
discussed in gh-50003@footnote{https://github.com/python/cpython/issues/50003}, and fixed by Antoine Pitrou.

@item 
The BerkeleyDB module now has a C API object, available as
@code{bsddb.db.api}.   This object can be used by other C extensions
that wish to use the @code{bsddb} module for their own purposes.
(Contributed by Duncan Grisby.)

@item 
The new buffer interface, previously described in
@ref{15b9,,the PEP 3118 section},
adds @ref{638,,PyObject_GetBuffer()} and @ref{639,,PyBuffer_Release()},
as well as a few other functions.

@item 
Python’s use of the C stdio library is now thread-safe, or at least
as thread-safe as the underlying library is.  A long-standing potential
bug occurred if one thread closed a file object while another thread
was reading from or writing to the object.  In 2.6 file objects
have a reference count, manipulated by the
@code{PyFile_IncUseCount()} and @code{PyFile_DecUseCount()}
functions.  File objects can’t be closed unless the reference count
is zero.  @code{PyFile_IncUseCount()} should be called while the GIL
is still held, before carrying out an I/O operation using the
@code{FILE *} pointer, and @code{PyFile_DecUseCount()} should be called
immediately after the GIL is re-acquired.
(Contributed by Antoine Pitrou and Gregory P. Smith.)

@item 
Importing modules simultaneously in two different threads no longer
deadlocks; it will now raise an @ref{659,,ImportError}.  A new API
function, @ref{3db,,PyImport_ImportModuleNoBlock()}, will look for a
module in @code{sys.modules} first, then try to import it after
acquiring an import lock.  If the import lock is held by another
thread, an @code{ImportError} is raised.
(Contributed by Christian Heimes.)

@item 
Several functions return information about the platform’s
floating-point support.  @ref{15f3,,PyFloat_GetMax()} returns
the maximum representable floating-point value,
and @ref{15f4,,PyFloat_GetMin()} returns the minimum
positive value.  @ref{15f5,,PyFloat_GetInfo()} returns an object
containing more information from the @code{float.h} file, such as
@code{"mant_dig"} (number of digits in the mantissa), @code{"epsilon"}
(smallest difference between 1.0 and the next largest value
representable), and several others.
(Contributed by Christian Heimes; bpo-1534@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1534}.)

@item 
C functions and methods that use
@ref{15f6,,PyComplex_AsCComplex()} will now accept arguments that
have a @code{__complex__()} method.  In particular, the functions in the
@ref{19,,cmath} module will now accept objects with this method.
This is a backport of a Python 3.0 change.
(Contributed by Mark Dickinson; bpo-1675423@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1675423}.)

@item 
Python’s C API now includes two functions for case-insensitive string
comparisons, @code{PyOS_stricmp(char*, char*)}
and @code{PyOS_strnicmp(char*, char*, Py_ssize_t)}.
(Contributed by Christian Heimes; bpo-1635@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635}.)

@item 
Many C extensions define their own little macro for adding
integers and strings to the module’s dictionary in the
@code{init*} function.  Python 2.6 finally defines standard macros
for adding values to a module, @ref{15f7,,PyModule_AddStringMacro}
and @ref{15f8,,PyModule_AddIntMacro()}.  (Contributed by
Christian Heimes.)

@item 
Some macros were renamed in both 3.0 and 2.6 to make it clearer that
they are macros,
not functions.  @code{Py_Size()} became @ref{984,,Py_SIZE()},
@code{Py_Type()} became @ref{3c9,,Py_TYPE()}, and
@code{Py_Refcnt()} became @ref{2cf,,Py_REFCNT()}.
The mixed-case macros are still available
in Python 2.6 for backward compatibility.
(bpo-1629@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1629})

@item 
Distutils now places C extensions it builds in a
different directory when running on a debug version of Python.
(Contributed by Collin Winter; bpo-1530959@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1530959}.)

@item 
Several basic data types, such as integers and strings, maintain
internal free lists of objects that can be re-used.  The data
structures for these free lists now follow a naming convention: the
variable is always named @code{free_list}, the counter is always named
@code{numfree}, and a macro @code{Py<typename>_MAXFREELIST} is
always defined.

@item 
A new Makefile target, “make patchcheck”, prepares the Python source tree
for making a patch: it fixes trailing whitespace in all modified
@code{.py} files, checks whether the documentation has been changed,
and reports whether the @code{Misc/ACKS} and @code{Misc/NEWS} files
have been updated.
(Contributed by Brett Cannon.)

Another new target, “make profile-opt”, compiles a Python binary
using GCC’s profile-guided optimization.  It compiles Python with
profiling enabled, runs the test suite to obtain a set of profiling
results, and then compiles using these results for optimization.
(Contributed by Gregory P. Smith.)
@end itemize

@c ======================================================================

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

@end menu

@node Port-Specific Changes Windows<2>,Port-Specific Changes Mac OS X<2>,,Build and C API Changes<6>
@anchor{whatsnew/2 6 port-specific-changes-windows}@anchor{15f9}
@subsubsection Port-Specific Changes: Windows



@itemize *

@item 
The support for Windows 95, 98, ME and NT4 has been dropped.
Python 2.6 requires at least Windows 2000 SP4.

@item 
The new default compiler on Windows is Visual Studio 2008 (version
9.0). The build directories for Visual Studio 2003 (version 7.1) and
2005 (version 8.0) were moved into the PC/ directory. The new
@code{PCbuild} directory supports cross compilation for X64, debug
builds and Profile Guided Optimization (PGO). PGO builds are roughly
10% faster than normal builds.  (Contributed by Christian Heimes
with help from Amaury Forgeot d’Arc and Martin von Löwis.)

@item 
The @ref{97,,msvcrt} module now supports
both the normal and wide char variants of the console I/O
API.  The @ref{15fa,,getwch()} function reads a keypress and returns a Unicode
value, as does the @ref{15fb,,getwche()} function.  The @ref{15fc,,putwch()} function
takes a Unicode character and writes it to the console.
(Contributed by Christian Heimes.)

@item 
@ref{15de,,os.path.expandvars()} will now expand environment variables in
the form “%var%”, and “~user” will be expanded into the user’s home
directory path.  (Contributed by Josiah Carlson; bpo-957650@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=957650}.)

@item 
The @ref{d1,,socket} module’s socket objects now have an
@ref{ecd,,ioctl()} method that provides a limited interface to the
@code{WSAIoctl()} system interface.

@item 
The @ref{11c,,_winreg} module now has a function,
@ref{15fd,,ExpandEnvironmentStrings()},
that expands environment variable references such as @code{%NAME%}
in an input string.  The handle objects provided by this
module now support the context protocol, so they can be used
in @ref{186,,with} statements. (Contributed by Christian Heimes.)

@ref{11c,,_winreg} also has better support for x64 systems,
exposing the @ref{1569,,DisableReflectionKey()}, @ref{156a,,EnableReflectionKey()},
and @ref{156b,,QueryReflectionKey()} functions, which enable and disable
registry reflection for 32-bit processes running on 64-bit systems.
(bpo-1753245@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1753245})

@item 
The @code{msilib} module’s @code{Record} object
gained @code{GetInteger()} and @code{GetString()} methods that
return field values as an integer or a string.
(Contributed by Floris Bruynooghe; bpo-2125@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2125}.)
@end itemize

@c ======================================================================

@node Port-Specific Changes Mac OS X<2>,Port-Specific Changes IRIX,Port-Specific Changes Windows<2>,Build and C API Changes<6>
@anchor{whatsnew/2 6 port-specific-changes-mac-os-x}@anchor{15fe}
@subsubsection Port-Specific Changes: Mac OS X



@itemize *

@item 
When compiling a framework build of Python, you can now specify the
framework name to be used by providing the
@code{--with-framework-name=} option to the
@code{configure} script.

@item 
The @code{macfs} module has been removed.  This in turn required the
@code{macostools.touched()} function to be removed because it depended on the
@code{macfs} module.  (bpo-1490190@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1490190})

@item 
Many other Mac OS modules have been deprecated and will be removed in
Python 3.0:
@code{_builtinSuites},
@code{aepack},
@code{aetools},
@code{aetypes},
@code{applesingle},
@code{appletrawmain},
@code{appletrunner},
@code{argvemulator},
@code{Audio_mac},
@code{autoGIL},
@code{Carbon},
@code{cfmfile},
@code{CodeWarrior},
@code{ColorPicker},
@code{EasyDialogs},
@code{Explorer},
@code{Finder},
@code{FrameWork},
@code{findertools},
@code{ic},
@code{icglue},
@code{icopen},
@code{macerrors},
@code{MacOS},
@code{macfs},
@code{macostools},
@code{macresource},
@code{MiniAEFrame},
@code{Nav},
@code{Netscape},
@code{OSATerminology},
@code{pimp},
@code{PixMapWrapper},
@code{StdSuites},
@code{SystemEvents},
@code{Terminal}, and
@code{terminalcommand}.
@end itemize

@c ======================================================================

@node Port-Specific Changes IRIX,,Port-Specific Changes Mac OS X<2>,Build and C API Changes<6>
@anchor{whatsnew/2 6 port-specific-changes-irix}@anchor{15ff}
@subsubsection Port-Specific Changes: IRIX


A number of old IRIX-specific modules were deprecated and will
be removed in Python 3.0:
@code{al} and @code{AL},
@code{cd},
@code{cddb},
@code{cdplayer},
@code{CL} and @code{cl},
@code{DEVICE},
@code{ERRNO},
@code{FILE},
@code{FL} and @code{fl},
@code{flp},
@code{fm},
@code{GET},
@code{GLWS},
@code{GL} and @code{gl},
@code{IN},
@code{IOCTL},
@code{jpeg},
@code{panelparser},
@code{readcd},
@code{SV} and @code{sv},
@code{torgb},
@code{videoreader}, and
@code{WAIT}.

@c ======================================================================

@node Porting to Python 2 6,Acknowledgements<2>,Build and C API Changes<6>,What’s New in Python 2 6
@anchor{whatsnew/2 6 porting-to-python-2-6}@anchor{1600}
@subsection Porting to Python 2.6


This section lists previously described changes and other bugfixes
that may require changes to your code:


@itemize *

@item 
Classes that aren’t supposed to be hashable should
set @code{__hash__ = None} in their definitions to indicate
the fact.

@item 
String exceptions have been removed.  Attempting to use them raises a
@ref{198,,TypeError}.

@item 
The @code{__init__()} method of @ref{7f3,,collections.deque}
now clears any existing contents of the deque
before adding elements from the iterable.  This change makes the
behavior match @code{list.__init__()}.

@item 
@ref{8be,,object.__init__()} previously accepted arbitrary arguments and
keyword arguments, ignoring them.  In Python 2.6, this is no longer
allowed and will result in a @ref{198,,TypeError}.  This will affect
@code{__init__()} methods that end up calling the corresponding
method on @ref{c7d,,object} (perhaps through using @ref{1a6,,super()}).
See bpo-1683368@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1683368} for discussion.

@item 
The @code{Decimal} constructor now accepts leading and trailing
whitespace when passed a string.  Previously it would raise an
@code{InvalidOperation} exception.  On the other hand, the
@code{create_decimal()} method of @code{Context} objects now
explicitly disallows extra whitespace, raising a
@code{ConversionSyntax} exception.

@item 
Due to an implementation accident, if you passed a file path to
the built-in  @ref{ad1,,__import__()} function, it would actually import
the specified file.  This was never intended to work, however, and
the implementation now explicitly checks for this case and raises
an @ref{659,,ImportError}.

@item 
C API: the @ref{1601,,PyImport_Import()} and @ref{3dc,,PyImport_ImportModule()}
functions now default to absolute imports, not relative imports.
This will affect C extensions that import other modules.

@item 
C API: extension data types that shouldn’t be hashable
should define their @code{tp_hash} slot to
@ref{15cb,,PyObject_HashNotImplemented()}.

@item 
The @ref{d1,,socket} module exception @ref{1255,,socket.error} now inherits
from @ref{1252,,IOError}.  Previously it wasn’t a subclass of
@code{StandardError} but now it is, through @code{IOError}.
(Implemented by Gregory P. Smith; bpo-1706815@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1706815}.)

@item 
The @ref{134,,xmlrpclib} module no longer automatically converts
@ref{1fa,,datetime.date} and @ref{1fb,,datetime.time} to the
@ref{15e8,,xmlrpclib.DateTime} type; the conversion semantics were
not necessarily correct for all applications.  Code using
@code{xmlrpclib} should convert @code{date} and @code{time}
instances. (bpo-1330538@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1330538})

@item 
(3.0-warning mode) The @ref{bcc,,Exception} class now warns
when accessed using slicing or index access; having
@code{Exception} behave like a tuple is being phased out.

@item 
(3.0-warning mode) inequality comparisons between two dictionaries
or two objects that don’t implement comparison methods are reported
as warnings.  @code{dict1 == dict2} still works, but @code{dict1 < dict2}
is being phased out.

Comparisons between cells, which are an implementation detail of Python’s
scoping rules, also cause warnings because such comparisons are forbidden
entirely in 3.0.
@end itemize

For applications that embed Python:


@itemize *

@item 
The @code{PySys_SetArgvEx()} function was added in Python 2.6.6,
letting applications close a security hole when the existing
@code{PySys_SetArgv()} function was used.  Check whether you’re
calling @code{PySys_SetArgv()} and carefully consider whether the
application should be using @code{PySys_SetArgvEx()} with
`updatepath' set to false.
@end itemize

@c ======================================================================

@node Acknowledgements<2>,,Porting to Python 2 6,What’s New in Python 2 6
@anchor{whatsnew/2 6 acknowledgements}@anchor{1602}@anchor{whatsnew/2 6 acks}@anchor{1603}
@subsection Acknowledgements


The author would like to thank the following people for offering
suggestions, corrections and assistance with various drafts of this
article: Georg Brandl, Steve Brown, Nick Coghlan, Ralph Corderoy,
Jim Jewett, Kent Johnson, Chris Lambacher,  Martin Michlmayr,
Antoine Pitrou, Brian Warner.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node What’s New in Python 2 5,What’s New in Python 2 4,What’s New in Python 2 6,파이썬의 새로운 기능
@anchor{whatsnew/2 5 doc}@anchor{1604}@anchor{whatsnew/2 5 translation-repo}@anchor{1605}@anchor{whatsnew/2 5 what-s-new-in-python-2-5}@anchor{1606}
@section What’s New in Python 2.5


@*Author: 
A.M. Kuchling


@c $Id: whatsnew25.tex 56611 2007-07-29 08:26:10Z georg.brandl $

@c Fix XXX comments

This article explains the new features in Python 2.5.  The final release of
Python 2.5 is scheduled for August 2006; 
@geindex Python 향상 제안; PEP 356
PEP 356@footnote{https://peps.python.org/pep-0356/} describes the planned
release schedule.  Python 2.5 was released on September 19, 2006.

The changes in Python 2.5 are an interesting mix of language and library
improvements. The library enhancements will be more important to Python’s user
community, I think, because several widely useful packages were added.  New
modules include ElementTree for XML processing (@code{xml.etree}),
the SQLite database module (@code{sqlite}), and the @ref{2e,,ctypes}
module for calling C functions.

The language changes are of middling significance.  Some pleasant new features
were added, but most of them aren’t features that you’ll use every day.
Conditional expressions were finally added to the language using a novel syntax;
see section @ref{1607,,PEP 308; Conditional Expressions}.  The new ‘@ref{186,,with}’ statement will make
writing cleanup code easier (section @ref{1608,,PEP 343; The ‘with’ statement}).  Values can now be passed
into generators (section @ref{1609,,PEP 342; New Generator Features}).  Imports are now visible as either
absolute or relative (section @ref{160a,,PEP 328; Absolute and Relative Imports}).  Some corner cases of exception
handling are handled better (section @ref{160b,,PEP 341; Unified try/except/finally}).  All these improvements
are worthwhile, but they’re improvements to one specific language feature or
another; none of them are broad modifications to Python’s semantics.

As well as the language and library additions, other improvements and bugfixes
were made throughout the source tree.  A search through the SVN change logs
finds there were 353 patches applied and 458 bugs fixed between Python 2.4 and
2.5.  (Both figures are likely to be underestimates.)

This article doesn’t try to be a complete specification of the new features;
instead changes are briefly introduced using helpful examples.  For full
details, you should always refer to the documentation for Python 2.5 at
@indicateurl{https://docs.python.org}. If you want to understand the complete implementation
and design rationale, refer to the PEP for a particular new feature.

Comments, suggestions, and error reports for this document are welcome; please
e-mail them to the author or open a bug in the Python bug tracker.

@c ======================================================================

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

@end menu

@node PEP 308 Conditional Expressions,PEP 309 Partial Function Application,,What’s New in Python 2 5
@anchor{whatsnew/2 5 pep-308}@anchor{1607}@anchor{whatsnew/2 5 pep-308-conditional-expressions}@anchor{160c}
@subsection PEP 308: Conditional Expressions


For a long time, people have been requesting a way to write conditional
expressions, which are expressions that return value A or value B depending on
whether a Boolean value is true or false.  A conditional expression lets you
write a single assignment statement that has the same effect as the following:

@example
if condition:
    x = true_value
else:
    x = false_value
@end example

There have been endless tedious discussions of syntax on both python-dev and
comp.lang.python.  A vote was even held that found the majority of voters wanted
conditional expressions in some form, but there was no syntax that was preferred
by a clear majority. Candidates included C’s @code{cond ? true_v : false_v}, @code{if
cond then true_v else false_v}, and 16 other variations.

Guido van Rossum eventually chose a surprising syntax:

@example
x = true_value if condition else false_value
@end example

Evaluation is still lazy as in existing Boolean expressions, so the order of
evaluation jumps around a bit.  The `condition' expression in the middle is
evaluated first, and the `true_value' expression is evaluated only if the
condition was true.  Similarly, the `false_value' expression is only evaluated
when the condition is false.

This syntax may seem strange and backwards; why does the condition go in the
`middle' of the expression, and not in the front as in C’s @code{c ? x : y}?  The
decision was checked by applying the new syntax to the modules in the standard
library and seeing how the resulting code read.  In many cases where a
conditional expression is used, one value seems to be the ‘common case’ and one
value is an ‘exceptional case’, used only on rarer occasions when the condition
isn’t met.  The conditional syntax makes this pattern a bit more obvious:

@example
contents = ((doc + '\n') if doc else '@w{'})
@end example

I read the above statement as meaning “here `contents' is  usually assigned a
value of @code{doc+'\n'}; sometimes  `doc' is empty, in which special case an empty
string is returned.”   I doubt I will use conditional expressions very often
where there  isn’t a clear common and uncommon case.

There was some discussion of whether the language should require surrounding
conditional expressions with parentheses.  The decision was made to `not'
require parentheses in the Python language’s grammar, but as a matter of style I
think you should always use them. Consider these two statements:

@example
# First version -- no parens
level = 1 if logging else 0

# Second version -- with parens
level = (1 if logging else 0)
@end example

In the first version, I think a reader’s eye might group the statement into
‘level = 1’, ‘if logging’, ‘else 0’, and think that the condition decides
whether the assignment to `level' is performed.  The second version reads
better, in my opinion, because it makes it clear that the assignment is always
performed and the choice is being made between two values.

Another reason for including the brackets: a few odd combinations of list
comprehensions and lambdas could look like incorrect conditional expressions.
See 
@geindex Python 향상 제안; PEP 308
PEP 308@footnote{https://peps.python.org/pep-0308/} for some examples.  If you put parentheses around your
conditional expressions, you won’t run into this case.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 308

@item PEP 308@footnote{https://peps.python.org/pep-0308/} - Conditional Expressions

PEP written by Guido van Rossum and Raymond D. Hettinger; implemented by Thomas
Wouters.
@end table


@c ======================================================================

@node PEP 309 Partial Function Application,PEP 314 Metadata for Python Software Packages v1 1,PEP 308 Conditional Expressions,What’s New in Python 2 5
@anchor{whatsnew/2 5 pep-309}@anchor{160d}@anchor{whatsnew/2 5 pep-309-partial-function-application}@anchor{160e}
@subsection PEP 309: Partial Function Application


The @ref{63,,functools} module is intended to contain tools for functional-style
programming.

One useful tool in this module is the @code{partial()} function. For programs
written in a functional style, you’ll sometimes want to construct variants of
existing functions that have some of the parameters filled in.  Consider a
Python function @code{f(a, b, c)}; you could create a new function @code{g(b, c)} that
was equivalent to @code{f(1, b, c)}.  This is called “partial function
application”.

@code{partial()} takes the arguments @code{(function, arg1, arg2, ... kwarg1=value1,
kwarg2=value2)}.  The resulting object is callable, so you can just call it to
invoke `function' with the filled-in arguments.

Here’s a small but realistic example:

@example
import functools

def log (message, subsystem):
    "Write the contents of 'message' to the specified subsystem."
    print '%s: %s' % (subsystem, message)
    ...

server_log = functools.partial(log, subsystem='server')
server_log('Unable to open socket')
@end example

Here’s another example, from a program that uses PyGTK.  Here a context-sensitive
pop-up menu is being constructed dynamically.  The callback provided
for the menu option is a partially applied version of the @code{open_item()}
method, where the first argument has been provided.

@example
...
class Application:
    def open_item(self, path):
       ...
    def init (self):
        open_func = functools.partial(self.open_item, item_path)
        popup_menu.append( ("Open", open_func, 1) )
@end example

Another function in the @ref{63,,functools} module is the
@code{update_wrapper(wrapper, wrapped)} function that helps you write
well-behaved decorators.  @code{update_wrapper()} copies the name, module, and
docstring attribute to a wrapper function so that tracebacks inside the wrapped
function are easier to understand.  For example, you might write:

@example
def my_decorator(f):
    def wrapper(*args, **kwds):
        print 'Calling decorated function'
        return f(*args, **kwds)
    functools.update_wrapper(wrapper, f)
    return wrapper
@end example

@code{wraps()} is a decorator that can be used inside your own decorators to copy
the wrapped function’s information.  An alternate  version of the previous
example would be:

@example
def my_decorator(f):
    @@functools.wraps(f)
    def wrapper(*args, **kwds):
        print 'Calling decorated function'
        return f(*args, **kwds)
    return wrapper
@end example


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 309

@item PEP 309@footnote{https://peps.python.org/pep-0309/} - Partial Function Application

PEP proposed and written by Peter Harris; implemented by Hye-Shik Chang and Nick
Coghlan, with adaptations by Raymond Hettinger.
@end table


@c ======================================================================

@node PEP 314 Metadata for Python Software Packages v1 1,PEP 328 Absolute and Relative Imports,PEP 309 Partial Function Application,What’s New in Python 2 5
@anchor{whatsnew/2 5 pep-314}@anchor{160f}@anchor{whatsnew/2 5 pep-314-metadata-for-python-software-packages-v1-1}@anchor{1610}
@subsection PEP 314: Metadata for Python Software Packages v1.1


Some simple dependency support was added to Distutils.  The @code{setup()}
function now has @code{requires}, @code{provides}, and @code{obsoletes} keyword
parameters.  When you build a source distribution using the @code{sdist} command,
the dependency information will be recorded in the @code{PKG-INFO} file.

Another new keyword parameter is @code{download_url}, which should be set to a URL
for the package’s source code.  This means it’s now possible to look up an entry
in the package index, determine the dependencies for a package, and download the
required packages.

@example
VERSION = '1.0'
setup(name='PyPackage',
      version=VERSION,
      requires=['numarray', 'zlib (>=1.1.4)'],
      obsoletes=['OldPackage']
      download_url=('http://www.example.com/pypackage/dist/pkg-%s.tar.gz'
                    % VERSION),
     )
@end example

Another new enhancement to the Python package index at
@indicateurl{https://pypi.org} is storing source and binary archives for a
package.  The new @code{upload} Distutils command will upload a package to
the repository.

Before a package can be uploaded, you must be able to build a distribution using
the @code{sdist} Distutils command.  Once that works, you can run @code{python
setup.py upload} to add your package to the PyPI archive.  Optionally you can
GPG-sign the package by supplying the @code{--sign} and @code{--identity}
options.

Package uploading was implemented by Martin von Löwis and Richard Jones.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 314

@item PEP 314@footnote{https://peps.python.org/pep-0314/} - Metadata for Python Software Packages v1.1

PEP proposed and written by A.M. Kuchling, Richard Jones, and Fred Drake;
implemented by Richard Jones and Fred Drake.
@end table


@c ======================================================================

@node PEP 328 Absolute and Relative Imports,PEP 338 Executing Modules as Scripts,PEP 314 Metadata for Python Software Packages v1 1,What’s New in Python 2 5
@anchor{whatsnew/2 5 pep-328}@anchor{160a}@anchor{whatsnew/2 5 pep-328-absolute-and-relative-imports}@anchor{1611}
@subsection PEP 328: Absolute and Relative Imports


The simpler part of 
@geindex Python 향상 제안; PEP 328
PEP 328@footnote{https://peps.python.org/pep-0328/} was implemented in Python 2.4: parentheses could now
be used to enclose the names imported from a module using the @code{from ... import
...} statement, making it easier to import many different names.

The more complicated part has been implemented in Python 2.5: importing a module
can be specified to use absolute or package-relative imports.  The plan is to
move toward making absolute imports the default in future versions of Python.

Let’s say you have a package directory like this:

@example
pkg/
pkg/__init__.py
pkg/main.py
pkg/string.py
@end example

This defines a package named @code{pkg} containing the @code{pkg.main} and
@code{pkg.string} submodules.

Consider the code in the @code{main.py} module.  What happens if it executes
the statement @code{import string}?  In Python 2.4 and earlier, it will first look
in the package’s directory to perform a relative import, finds
@code{pkg/string.py}, imports the contents of that file as the
@code{pkg.string} module, and that module is bound to the name @code{string} in the
@code{pkg.main} module’s namespace.

That’s fine if @code{pkg.string} was what you wanted.  But what if you wanted
Python’s standard @ref{d8,,string} module?  There’s no clean way to ignore
@code{pkg.string} and look for the standard module; generally you had to look at
the contents of @code{sys.modules}, which is slightly unclean.    Holger Krekel’s
@code{py.std} package provides a tidier way to perform imports from the standard
library, @code{import py; py.std.string.join()}, but that package isn’t available
on all Python installations.

Reading code which relies on relative imports is also less clear, because a
reader may be confused about which module, @ref{d8,,string} or @code{pkg.string},
is intended to be used.  Python users soon learned not to duplicate the names of
standard library modules in the names of their packages’ submodules, but you
can’t protect against having your submodule’s name being used for a new module
added in a future version of Python.

In Python 2.5, you can switch @ref{7f7,,import}’s behaviour to  absolute imports
using a @code{from __future__ import absolute_import} directive.  This absolute-import
behaviour will become the default in a future version (probably Python
2.7).  Once absolute imports  are the default, @code{import string} will always
find the standard library’s version. It’s suggested that users should begin
using absolute imports as much as possible, so it’s preferable to begin writing
@code{from pkg import string} in your code.

Relative imports are still possible by adding a leading period  to the module
name when using the @code{from ... import} form:

@example
# Import names from pkg.string
from .string import name1, name2
# Import pkg.string
from . import string
@end example

This imports the @ref{d8,,string} module relative to the current package, so in
@code{pkg.main} this will import `name1' and `name2' from @code{pkg.string}.
Additional leading periods perform the relative import starting from the parent
of the current package.  For example, code in the @code{A.B.C} module can do:

@example
from . import D                 # Imports A.B.D
from .. import E                # Imports A.E
from ..F import G               # Imports A.F.G
@end example

Leading periods cannot be used with the @code{import modname}  form of the import
statement, only the @code{from ... import} form.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 328

@item PEP 328@footnote{https://peps.python.org/pep-0328/} - Imports: Multi-Line and Absolute/Relative

PEP written by Aahz; implemented by Thomas Wouters.

@item @indicateurl{https://pylib.readthedocs.io/}

The py library by Holger Krekel, which contains the @code{py.std} package.
@end table


@c ======================================================================

@node PEP 338 Executing Modules as Scripts,PEP 341 Unified try/except/finally,PEP 328 Absolute and Relative Imports,What’s New in Python 2 5
@anchor{whatsnew/2 5 pep-338}@anchor{1612}@anchor{whatsnew/2 5 pep-338-executing-modules-as-scripts}@anchor{1613}
@subsection PEP 338: Executing Modules as Scripts


The @ref{23c,,-m} switch added in Python 2.4 to execute a module as a script
gained a few more abilities.  Instead of being implemented in C code inside the
Python interpreter, the switch now uses an implementation in a new module,
@ref{c3,,runpy}.

The @ref{c3,,runpy} module implements a more sophisticated import mechanism so that
it’s now possible to run modules in a package such as @code{pychecker.checker}.
The module also supports alternative import mechanisms such as the
@ref{138,,zipimport} module.  This means you can add a .zip archive’s path to
@code{sys.path} and then use the @ref{23c,,-m} switch to execute code from the
archive.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 338

@item PEP 338@footnote{https://peps.python.org/pep-0338/} - Executing modules as scripts

PEP written and  implemented by Nick Coghlan.
@end table


@c ======================================================================

@node PEP 341 Unified try/except/finally,PEP 342 New Generator Features,PEP 338 Executing Modules as Scripts,What’s New in Python 2 5
@anchor{whatsnew/2 5 pep-341}@anchor{160b}@anchor{whatsnew/2 5 pep-341-unified-try-except-finally}@anchor{1614}
@subsection PEP 341: Unified try/except/finally


Until Python 2.5, the @ref{8f7,,try} statement came in two flavours. You could
use a @ref{1b0,,finally} block to ensure that code is always executed, or one or
more @ref{1ab,,except} blocks to catch  specific exceptions.  You couldn’t
combine both @code{except} blocks and a @code{finally} block, because
generating the right bytecode for the combined version was complicated and it
wasn’t clear what the semantics of the combined statement should be.

Guido van Rossum spent some time working with Java, which does support the
equivalent of combining @ref{1ab,,except} blocks and a @ref{1b0,,finally} block,
and this clarified what the statement should mean.  In Python 2.5, you can now
write:

@example
try:
    block-1 ...
except Exception1:
    handler-1 ...
except Exception2:
    handler-2 ...
else:
    else-block
finally:
    final-block
@end example

The code in `block-1' is executed.  If the code raises an exception, the various
@ref{1ab,,except} blocks are tested: if the exception is of class
@code{Exception1}, `handler-1' is executed; otherwise if it’s of class
@code{Exception2}, `handler-2' is executed, and so forth.  If no exception is
raised, the `else-block' is executed.

No matter what happened previously, the `final-block' is executed once the code
block is complete and any raised exceptions handled. Even if there’s an error in
an exception handler or the `else-block' and a new exception is raised, the code
in the `final-block' is still run.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 341

@item PEP 341@footnote{https://peps.python.org/pep-0341/} - Unifying try-except and try-finally

PEP written by Georg Brandl;  implementation by Thomas Lee.
@end table


@c ======================================================================

@node PEP 342 New Generator Features,PEP 343 The ‘with’ statement<2>,PEP 341 Unified try/except/finally,What’s New in Python 2 5
@anchor{whatsnew/2 5 pep-342}@anchor{1609}@anchor{whatsnew/2 5 pep-342-new-generator-features}@anchor{1615}
@subsection PEP 342: New Generator Features


Python 2.5 adds a simple way to pass values `into' a generator. As introduced in
Python 2.3, generators only produce output; once a generator’s code was invoked
to create an iterator, there was no way to pass any new information into the
function when its execution is resumed.  Sometimes the ability to pass in some
information would be useful.  Hackish solutions to this include making the
generator’s code look at a global variable and then changing the global
variable’s value, or passing in some mutable object that callers then modify.

To refresh your memory of basic generators, here’s a simple example:

@example
def counter (maximum):
    i = 0
    while i < maximum:
        yield i
        i += 1
@end example

When you call @code{counter(10)}, the result is an iterator that returns the values
from 0 up to 9.  On encountering the @ref{bc1,,yield} statement, the iterator
returns the provided value and suspends the function’s execution, preserving the
local variables. Execution resumes on the following call to the iterator’s
@ref{9d8,,next()} method, picking up after the @code{yield} statement.

In Python 2.3, @ref{bc1,,yield} was a statement; it didn’t return any value.  In
2.5, @code{yield} is now an expression, returning a value that can be
assigned to a variable or otherwise operated on:

@example
val = (yield i)
@end example

I recommend that you always put parentheses around a @ref{bc1,,yield} expression
when you’re doing something with the returned value, as in the above example.
The parentheses aren’t always necessary, but it’s easier to always add them
instead of having to remember when they’re needed.

(
@geindex Python 향상 제안; PEP 342
PEP 342@footnote{https://peps.python.org/pep-0342/} explains the exact rules, which are that a
@ref{bc1,,yield}-expression must always be parenthesized except when it
occurs at the top-level
expression on the right-hand side of an assignment.  This means you can write
@code{val = yield i} but have to use parentheses when there’s an operation, as in
@code{val = (yield i) + 12}.)

Values are sent into a generator by calling its @code{send(value)} method.  The
generator’s code is then resumed and the @ref{bc1,,yield} expression returns the
specified `value'.  If the regular @ref{9d8,,next()} method is called, the
@code{yield} returns @ref{884,,None}.

Here’s the previous example, modified to allow changing the value of the
internal counter.

@example
def counter (maximum):
    i = 0
    while i < maximum:
        val = (yield i)
        # If value provided, change counter
        if val is not None:
            i = val
        else:
            i += 1
@end example

And here’s an example of changing the counter:

@example
>>> it = counter(10)
>>> print it.next()
0
>>> print it.next()
1
>>> print it.send(8)
8
>>> print it.next()
9
>>> print it.next()
Traceback (most recent call last):
  File "t.py", line 15, in ?
    print it.next()
StopIteration
@end example

@ref{bc1,,yield} will usually return @ref{884,,None}, so you should always check
for this case.  Don’t just use its value in expressions unless you’re sure that
the @code{send()} method will be the only method used to resume your generator
function.

In addition to @code{send()}, there are two other new methods on generators:


@itemize *

@item 
@code{throw(type, value=None, traceback=None)} is used to raise an exception
inside the generator; the exception is raised by the @ref{bc1,,yield} expression
where the generator’s execution is paused.

@item 
@code{close()} raises a new @ref{15cc,,GeneratorExit} exception inside the generator
to terminate the iteration.  On receiving this exception, the generator’s code
must either raise @code{GeneratorExit} or @ref{df4,,StopIteration}.  Catching the
@code{GeneratorExit} exception and returning a value is illegal and will trigger
a @ref{244,,RuntimeError}; if the function raises some other exception, that
exception is propagated to the caller.  @code{close()} will also be called by
Python’s garbage collector when the generator is garbage-collected.

If you need to run cleanup code when a @ref{15cc,,GeneratorExit} occurs, I suggest
using a @code{try: ... finally:} suite instead of  catching @code{GeneratorExit}.
@end itemize

The cumulative effect of these changes is to turn generators from one-way
producers of information into both producers and consumers.

Generators also become `coroutines', a more generalized form of subroutines.
Subroutines are entered at one point and exited at another point (the top of the
function, and a @ref{1af,,return} statement), but coroutines can be entered,
exited, and resumed at many different points (the @ref{bc1,,yield} statements).
We’ll have to figure out patterns for using coroutines effectively in Python.

The addition of the @code{close()} method has one side effect that isn’t obvious.
@code{close()} is called when a generator is garbage-collected, so this means the
generator’s code gets one last chance to run before the generator is destroyed.
This last chance means that @code{try...finally} statements in generators can now
be guaranteed to work; the @ref{1b0,,finally} clause will now always get a
chance to run.  The syntactic restriction that you couldn’t mix @ref{bc1,,yield}
statements with a @code{try...finally} suite has therefore been removed.  This
seems like a minor bit of language trivia, but using generators and
@code{try...finally} is actually necessary in order to implement the
@ref{186,,with} statement described by 
@geindex Python 향상 제안; PEP 343
PEP 343@footnote{https://peps.python.org/pep-0343/}.  I’ll look at this new statement
in the following  section.

Another even more esoteric effect of this change: previously, the
@code{gi_frame} attribute of a generator was always a frame object. It’s now
possible for @code{gi_frame} to be @code{None} once the generator has been
exhausted.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 342

@item PEP 342@footnote{https://peps.python.org/pep-0342/} - Coroutines via Enhanced Generators

PEP written by  Guido van Rossum and Phillip J. Eby; implemented by Phillip J.
Eby.  Includes examples of  some fancier uses of generators as coroutines.

Earlier versions of these features were proposed in  
@geindex Python 향상 제안; PEP 288
PEP 288@footnote{https://peps.python.org/pep-0288/} by Raymond
Hettinger and 
@geindex Python 향상 제안; PEP 325
PEP 325@footnote{https://peps.python.org/pep-0325/} by Samuele Pedroni.

@item @indicateurl{https://en.wikipedia.org/wiki/Coroutine}

The Wikipedia entry for  coroutines.

@item @indicateurl{https://web.archive.org/web/20160321211320/http://www.sidhe.org/~dan/blog/archives/000178.html}

An explanation of coroutines from a Perl point of view, written by Dan Sugalski.
@end table


@c ======================================================================

@node PEP 343 The ‘with’ statement<2>,PEP 352 Exceptions as New-Style Classes,PEP 342 New Generator Features,What’s New in Python 2 5
@anchor{whatsnew/2 5 pep-343}@anchor{1608}@anchor{whatsnew/2 5 pep-343-the-with-statement}@anchor{1616}
@subsection PEP 343: The ‘with’ statement


The ‘@ref{186,,with}’ statement clarifies code that previously would use
@code{try...finally} blocks to ensure that clean-up code is executed.  In this
section, I’ll discuss the statement as it will commonly be used.  In the next
section, I’ll examine the implementation details and show how to write objects
for use with this statement.

The ‘@ref{186,,with}’ statement is a new control-flow structure whose basic
structure is:

@example
with expression [as variable]:
    with-block
@end example

The expression is evaluated, and it should result in an object that supports the
context management protocol (that is, has @ref{7e3,,__enter__()} and @ref{1505,,__exit__()}
methods.

The object’s @ref{7e3,,__enter__()} is called before `with-block' is executed and
therefore can run set-up code. It also may return a value that is bound to the
name `variable', if given.  (Note carefully that `variable' is `not' assigned
the result of `expression'.)

After execution of the `with-block' is finished, the object’s @ref{1505,,__exit__()}
method is called, even if the block raised an exception, and can therefore run
clean-up code.

To enable the statement in Python 2.5, you need to add the following directive
to your module:

@example
from __future__ import with_statement
@end example

The statement will always be enabled in Python 2.6.

Some standard Python objects now support the context management protocol and can
be used with the ‘@ref{186,,with}’ statement. File objects are one example:

@example
with open('/etc/passwd', 'r') as f:
    for line in f:
        print line
        ... more processing code ...
@end example

After this statement has executed, the file object in `f' will have been
automatically closed, even if the @ref{34a,,for} loop raised an exception
part-way through the block.

@cartouche
@quotation 참고 
In this case, `f' is the same object created by @ref{316,,open()}, because
@ref{7e3,,__enter__()} returns `self'.
@end quotation
@end cartouche

The @ref{f3,,threading} module’s locks and condition variables  also support the
‘@ref{186,,with}’ statement:

@example
lock = threading.Lock()
with lock:
    # Critical section of code
    ...
@end example

The lock is acquired before the block is executed and always released once  the
block is complete.

The new @code{localcontext()} function in the @ref{3a,,decimal} module makes it easy
to save and restore the current decimal context, which encapsulates the desired
precision and rounding characteristics for computations:

@example
from decimal import Decimal, Context, localcontext

# Displays with default precision of 28 digits
v = Decimal('578')
print v.sqrt()

with localcontext(Context(prec=16)):
    # All code in this block uses a precision of 16 digits.
    # The original context is restored on exiting the block.
    print v.sqrt()
@end example

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

@end menu

@node Writing Context Managers<2>,The contextlib module<2>,,PEP 343 The ‘with’ statement<2>
@anchor{whatsnew/2 5 new-25-context-managers}@anchor{1617}@anchor{whatsnew/2 5 writing-context-managers}@anchor{1618}
@subsubsection Writing Context Managers


Under the hood, the ‘@ref{186,,with}’ statement is fairly complicated. Most
people will only use ‘@code{with}’ in company with existing objects and
don’t need to know these details, so you can skip the rest of this section if
you like.  Authors of new objects will need to understand the details of the
underlying implementation and should keep reading.

A high-level explanation of the context management protocol is:


@itemize *

@item 
The expression is evaluated and should result in an object called a “context
manager”.  The context manager must have @ref{7e3,,__enter__()} and @ref{1505,,__exit__()}
methods.

@item 
The context manager’s @ref{7e3,,__enter__()} method is called.  The value returned
is assigned to `VAR'.  If no @code{'as VAR'} clause is present, the value is simply
discarded.

@item 
The code in `BLOCK' is executed.

@item 
If `BLOCK' raises an exception, the @code{__exit__(type, value, traceback)}
is called with the exception details, the same values returned by
@ref{899,,sys.exc_info()}.  The method’s return value controls whether the exception
is re-raised: any false value re-raises the exception, and @code{True} will result
in suppressing it.  You’ll only rarely want to suppress the exception, because
if you do the author of the code containing the ‘@ref{186,,with}’ statement will
never realize anything went wrong.

@item 
If `BLOCK' didn’t raise an exception,  the @ref{1505,,__exit__()} method is still
called, but `type', `value', and `traceback' are all @code{None}.
@end itemize

Let’s think through an example.  I won’t present detailed code but will only
sketch the methods necessary for a database that supports transactions.

(For people unfamiliar with database terminology: a set of changes to the
database are grouped into a transaction.  Transactions can be either committed,
meaning that all the changes are written into the database, or rolled back,
meaning that the changes are all discarded and the database is unchanged.  See
any database textbook for more information.)

Let’s assume there’s an object representing a database connection. Our goal will
be to let the user write code like this:

@example
db_connection = DatabaseConnection()
with db_connection as cursor:
    cursor.execute('insert into ...')
    cursor.execute('delete from ...')
    # ... more operations ...
@end example

The transaction should be committed if the code in the block runs flawlessly or
rolled back if there’s an exception. Here’s the basic interface for
@code{DatabaseConnection} that I’ll assume:

@example
class DatabaseConnection:
    # Database interface
    def cursor (self):
        "Returns a cursor object and starts a new transaction"
    def commit (self):
        "Commits current transaction"
    def rollback (self):
        "Rolls back current transaction"
@end example

The @ref{7e3,,__enter__()} method is pretty easy, having only to start a new
transaction.  For this application the resulting cursor object would be a useful
result, so the method will return it.  The user can then add @code{as cursor} to
their ‘@ref{186,,with}’ statement to bind the cursor to a variable name.

@example
class DatabaseConnection:
    ...
    def __enter__ (self):
        # Code to start a new transaction
        cursor = self.cursor()
        return cursor
@end example

The @ref{1505,,__exit__()} method is the most complicated because it’s where most of
the work has to be done.  The method has to check if an exception occurred.  If
there was no exception, the transaction is committed.  The transaction is rolled
back if there was an exception.

In the code below, execution will just fall off the end of the function,
returning the default value of @code{None}.  @code{None} is false, so the exception
will be re-raised automatically.  If you wished, you could be more explicit and
add a @ref{1af,,return} statement at the marked location.

@example
class DatabaseConnection:
    ...
    def __exit__ (self, type, value, tb):
        if tb is None:
            # No exception, so commit
            self.commit()
        else:
            # Exception occurred, so rollback.
            self.rollback()
            # return False
@end example

@node The contextlib module<2>,,Writing Context Managers<2>,PEP 343 The ‘with’ statement<2>
@anchor{whatsnew/2 5 contextlibmod}@anchor{1619}@anchor{whatsnew/2 5 the-contextlib-module}@anchor{161a}
@subsubsection The contextlib module


The new @ref{27,,contextlib} module provides some functions and a decorator that
are useful for writing objects for use with the ‘@ref{186,,with}’ statement.

The decorator is called @code{contextmanager()}, and lets you write a single
generator function instead of defining a new class.  The generator should yield
exactly one value.  The code up to the @ref{bc1,,yield} will be executed as the
@ref{7e3,,__enter__()} method, and the value yielded will be the method’s return
value that will get bound to the variable in the ‘@ref{186,,with}’ statement’s
@code{as} clause, if any.  The code after the @code{yield} will be
executed in the @ref{1505,,__exit__()} method.  Any exception raised in the block will
be raised by the @code{yield} statement.

Our database example from the previous section could be written  using this
decorator as:

@example
from contextlib import contextmanager

@@contextmanager
def db_transaction (connection):
    cursor = connection.cursor()
    try:
        yield cursor
    except:
        connection.rollback()
        raise
    else:
        connection.commit()

db = DatabaseConnection()
with db_transaction(db) as cursor:
    ...
@end example

The @ref{27,,contextlib} module also has a @code{nested(mgr1, mgr2, ...)} function
that combines a number of context managers so you don’t need to write nested
‘@ref{186,,with}’ statements.  In this example, the single ‘@code{with}’
statement both starts a database transaction and acquires a thread lock:

@example
lock = threading.Lock()
with nested (db_transaction(db), lock) as (cursor, locked):
    ...
@end example

Finally, the @code{closing(object)} function returns `object' so that it can be
bound to a variable, and calls @code{object.close} at the end of the block.

@example
import urllib, sys
from contextlib import closing

with closing(urllib.urlopen('http://www.yahoo.com')) as f:
    for line in f:
        sys.stdout.write(line)
@end example


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 343

@item PEP 343@footnote{https://peps.python.org/pep-0343/} - The “with” statement

PEP written by Guido van Rossum and Nick Coghlan; implemented by Mike Bland,
Guido van Rossum, and Neal Norwitz.  The PEP shows the code generated for a
‘@ref{186,,with}’ statement, which can be helpful in learning how the statement
works.
@end table

The documentation  for the @ref{27,,contextlib} module.


@c ======================================================================

@node PEP 352 Exceptions as New-Style Classes,PEP 353 Using ssize_t as the index type,PEP 343 The ‘with’ statement<2>,What’s New in Python 2 5
@anchor{whatsnew/2 5 pep-352}@anchor{161b}@anchor{whatsnew/2 5 pep-352-exceptions-as-new-style-classes}@anchor{161c}
@subsection PEP 352: Exceptions as New-Style Classes


Exception classes can now be new-style classes, not just classic classes, and
the built-in @ref{bcc,,Exception} class and all the standard built-in exceptions
(@ref{452,,NameError}, @ref{2ec,,ValueError}, etc.) are now new-style classes.

The inheritance hierarchy for exceptions has been rearranged a bit. In 2.5, the
inheritance relationships are:

@example
BaseException       # New in Python 2.5
|- KeyboardInterrupt
|- SystemExit
|- Exception
   |- (all other current built-in exceptions)
@end example

This rearrangement was done because people often want to catch all exceptions
that indicate program errors.  @ref{bc4,,KeyboardInterrupt} and @ref{f3b,,SystemExit}
aren’t errors, though, and usually represent an explicit action such as the user
hitting @code{Control}-@code{C} or code calling @ref{277,,sys.exit()}.  A bare @code{except:} will
catch all exceptions, so you commonly need to list @code{KeyboardInterrupt} and
@code{SystemExit} in order to re-raise them.  The usual pattern is:

@example
try:
    ...
except (KeyboardInterrupt, SystemExit):
    raise
except:
    # Log error...
    # Continue running program...
@end example

In Python 2.5, you can now write @code{except Exception} to achieve the same
result, catching all the exceptions that usually indicate errors  but leaving
@ref{bc4,,KeyboardInterrupt} and @ref{f3b,,SystemExit} alone.  As in previous versions,
a bare @code{except:} still catches all exceptions.

The goal for Python 3.0 is to require any class raised as an exception to derive
from @ref{7d6,,BaseException} or some descendant of @code{BaseException}, and future
releases in the Python 2.x series may begin to enforce this constraint.
Therefore, I suggest you begin making all your exception classes derive from
@ref{bcc,,Exception} now.  It’s been suggested that the bare @code{except:} form should
be removed in Python 3.0, but Guido van Rossum hasn’t decided whether to do this
or not.

Raising of strings as exceptions, as in the statement @code{raise "Error
occurred"}, is deprecated in Python 2.5 and will trigger a warning.  The aim is
to be able to remove the string-exception feature in a few releases.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 352

@item PEP 352@footnote{https://peps.python.org/pep-0352/} - Required Superclass for Exceptions

PEP written by  Brett Cannon and Guido van Rossum; implemented by Brett Cannon.
@end table


@c ======================================================================

@node PEP 353 Using ssize_t as the index type,PEP 357 The ‘__index__’ method,PEP 352 Exceptions as New-Style Classes,What’s New in Python 2 5
@anchor{whatsnew/2 5 pep-353}@anchor{161d}@anchor{whatsnew/2 5 pep-353-using-ssize-t-as-the-index-type}@anchor{161e}
@subsection PEP 353: Using ssize_t as the index type


A wide-ranging change to Python’s C API, using a new  @ref{c54,,Py_ssize_t} type
definition instead of int,  will permit the interpreter to handle more
data on 64-bit platforms. This change doesn’t affect Python’s capacity on 32-bit
platforms.

Various pieces of the Python interpreter used C’s int type to store
sizes or counts; for example, the number of items in a list or tuple were stored
in an int.  The C compilers for most 64-bit platforms still define
int as a 32-bit type, so that meant that lists could only hold up to
@code{2**31 - 1} = 2147483647 items. (There are actually a few different
programming models that 64-bit C compilers can use – see
@indicateurl{https://unix.org/version2/whatsnew/lp64_wp.html} for a discussion – but the
most commonly available model leaves int as 32 bits.)

A limit of 2147483647 items doesn’t really matter on a 32-bit platform because
you’ll run out of memory before hitting the length limit. Each list item
requires space for a pointer, which is 4 bytes, plus space for a
@ref{5dc,,PyObject} representing the item.  2147483647*4 is already more bytes
than a 32-bit address space can contain.

It’s possible to address that much memory on a 64-bit platform, however.  The
pointers for a list that size would only require 16 GiB of space, so it’s not
unreasonable that Python programmers might construct lists that large.
Therefore, the Python interpreter had to be changed to use some type other than
int, and this will be a 64-bit type on 64-bit platforms.  The change
will cause incompatibilities on 64-bit machines, so it was deemed worth making
the transition now, while the number of 64-bit users is still relatively small.
(In 5 or 10 years, we may `all' be on 64-bit machines, and the transition would
be more painful then.)

This change most strongly affects authors of C extension modules.   Python
strings and container types such as lists and tuples  now use
@ref{c54,,Py_ssize_t} to store their size.   Functions such as
@ref{161f,,PyList_Size()}  now return @code{Py_ssize_t}.  Code in extension modules
may therefore need to have some variables changed to @code{Py_ssize_t}.

The @ref{3c1,,PyArg_ParseTuple()} and @ref{3c2,,Py_BuildValue()} functions have a new
conversion code, @code{n}, for @ref{c54,,Py_ssize_t}.   @code{PyArg_ParseTuple()}’s
@code{s#} and @code{t#} still output int by default, but you can define the
macro  @code{PY_SSIZE_T_CLEAN} before including @code{Python.h}  to make
them return @code{Py_ssize_t}.

@geindex Python 향상 제안; PEP 353
PEP 353@footnote{https://peps.python.org/pep-0353/} has a section on conversion guidelines that  extension authors should
read to learn about supporting 64-bit platforms.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 353

@item PEP 353@footnote{https://peps.python.org/pep-0353/} - Using ssize_t as the index type

PEP written and implemented by Martin von Löwis.
@end table


@c ======================================================================

@node PEP 357 The ‘__index__’ method,Other Language Changes<10>,PEP 353 Using ssize_t as the index type,What’s New in Python 2 5
@anchor{whatsnew/2 5 pep-357}@anchor{1620}@anchor{whatsnew/2 5 pep-357-the-index-method}@anchor{1621}
@subsection PEP 357: The ‘__index__’ method


The NumPy developers had a problem that could only be solved by adding a new
special method, @code{__index__()}.  When using slice notation, as in
@code{[start:stop:step]}, the values of the `start', `stop', and `step' indexes
must all be either integers or long integers.  NumPy defines a variety of
specialized integer types corresponding to unsigned and signed integers of 8,
16, 32, and 64 bits, but there was no way to signal that these types could be
used as slice indexes.

Slicing can’t just use the existing @code{__int__()} method because that method
is also used to implement coercion to integers.  If slicing used
@code{__int__()}, floating-point numbers would also become legal slice indexes
and that’s clearly an undesirable behaviour.

Instead, a new special method called @code{__index__()} was added.  It takes no
arguments and returns an integer giving the slice index to use.  For example:

@example
class C:
    def __index__ (self):
        return self.value
@end example

The return value must be either a Python integer or long integer. The
interpreter will check that the type returned is correct, and raises a
@ref{198,,TypeError} if this requirement isn’t met.

A corresponding @ref{1622,,nb_index} slot was added to the C-level
@ref{1623,,PyNumberMethods} structure to let C extensions implement this protocol.
@code{PyNumber_Index(obj)} can be used in extension code to call the
@code{__index__()} function and retrieve its result.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 357

@item PEP 357@footnote{https://peps.python.org/pep-0357/} - Allowing Any Object to be Used for Slicing

PEP written  and implemented by Travis Oliphant.
@end table


@c ======================================================================

@node Other Language Changes<10>,New Improved and Removed Modules,PEP 357 The ‘__index__’ method,What’s New in Python 2 5
@anchor{whatsnew/2 5 other-lang}@anchor{1624}@anchor{whatsnew/2 5 other-language-changes}@anchor{1625}
@subsection Other Language Changes


Here are all of the changes that Python 2.5 makes to the core Python language.


@itemize *

@item 
The @ref{183,,dict} type has a new hook for letting subclasses provide a default
value when a key isn’t contained in the dictionary. When a key isn’t found, the
dictionary’s @code{__missing__(key)} method will be called.  This hook is used
to implement the new @code{defaultdict} class in the @ref{1e,,collections}
module.  The following example defines a dictionary  that returns zero for any
missing key:

@example
class zerodict (dict):
    def __missing__ (self, key):
        return 0

d = zerodict(@{1:1, 2:2@})
print d[1], d[2]   # Prints 1, 2
print d[3], d[4]   # Prints 0, 0
@end example

@item 
Both 8-bit and Unicode strings have new @code{partition(sep)}  and
@code{rpartition(sep)} methods that simplify a common use case.

The @code{find(S)} method is often used to get an index which is then used to
slice the string and obtain the pieces that are before and after the separator.
@code{partition(sep)} condenses this pattern into a single method call that
returns a 3-tuple containing the substring before the separator, the separator
itself, and the substring after the separator.  If the separator isn’t found,
the first element of the tuple is the entire string and the other two elements
are empty.  @code{rpartition(sep)} also returns a 3-tuple but starts searching
from the end of the string; the @code{r} stands for ‘reverse’.

Some examples:

@example
>>> ('http://www.python.org').partition('://')
('http', '://', 'www.python.org')
>>> ('file:/usr/share/doc/index.html').partition('://')
('file:/usr/share/doc/index.html', '@w{'}, '@w{'})
>>> (u'Subject: a quick question').partition(':')
(u'Subject', u':', u' a quick question')
>>> 'www.python.org'.rpartition('.')
('www.python', '.', 'org')
>>> 'www.python.org'.rpartition(':')
('@w{'}, '@w{'}, 'www.python.org')
@end example

(Implemented by Fredrik Lundh following a suggestion by Raymond Hettinger.)

@item 
The @code{startswith()} and @code{endswith()} methods of string types now accept
tuples of strings to check for.

@example
def is_image_file (filename):
    return filename.endswith(('.gif', '.jpg', '.tiff'))
@end example

(Implemented by Georg Brandl following a suggestion by Tom Lynn.)

@c RFE #1491485

@item 
The @ref{110a,,min()} and @ref{110b,,max()} built-in functions gained a @code{key} keyword
parameter analogous to the @code{key} argument for @code{sort()}.  This parameter
supplies a function that takes a single argument and is called for every value
in the list; @code{min()}/@code{max()} will return the element with the
smallest/largest return value from this function. For example, to find the
longest string in a list, you can do:

@example
L = ['medium', 'longest', 'short']
# Prints 'longest'
print max(L, key=len)
# Prints 'short', because lexicographically 'short' has the largest value
print max(L)
@end example

(Contributed by Steven Bethard and Raymond Hettinger.)

@item 
Two new built-in functions, @ref{1626,,any()} and @ref{1627,,all()}, evaluate whether an
iterator contains any true or false values.  @code{any()} returns @ref{e06,,True}
if any value returned by the iterator is true; otherwise it will return
@ref{d2a,,False}.  @code{all()} returns @code{True} only if all of the values
returned by the iterator evaluate as true. (Suggested by Guido van Rossum, and
implemented by Raymond Hettinger.)

@item 
The result of a class’s @code{__hash__()} method can now be either a long
integer or a regular integer.  If a long integer is returned, the hash of that
value is taken.  In earlier versions the hash value was required to be a
regular integer, but in 2.5 the @ref{1628,,id()} built-in was changed to always
return non-negative numbers, and users often seem to use @code{id(self)} in
@code{__hash__()} methods (though this is discouraged).

@c Bug #1536021

@item 
ASCII is now the default encoding for modules.  It’s now  a syntax error if a
module contains string literals with 8-bit characters but doesn’t have an
encoding declaration.  In Python 2.4 this triggered a warning, not a syntax
error.  See 
@geindex Python 향상 제안; PEP 263
PEP 263@footnote{https://peps.python.org/pep-0263/}  for how to declare a module’s encoding; for example, you
might add  a line like this near the top of the source file:

@example
# -*- coding: latin1 -*-
@end example

@item 
A new warning, @ref{1629,,UnicodeWarning}, is triggered when  you attempt to
compare a Unicode string and an 8-bit string  that can’t be converted to Unicode
using the default ASCII encoding.   The result of the comparison is false:

@example
>>> chr(128) == unichr(128)   # Can't convert chr(128) to Unicode
__main__:1: UnicodeWarning: Unicode equal comparison failed
  to convert both arguments to Unicode - interpreting them
  as being unequal
False
>>> chr(127) == unichr(127)   # chr(127) can be converted
True
@end example

Previously this would raise a @ref{c07,,UnicodeDecodeError} exception, but in 2.5
this could result in puzzling problems when accessing a dictionary.  If you
looked up @code{unichr(128)} and @code{chr(128)} was being used as a key, you’d get a
@code{UnicodeDecodeError} exception.  Other changes in 2.5 resulted in this
exception being raised instead of suppressed by the code in @code{dictobject.c}
that implements dictionaries.

Raising an exception for such a comparison is strictly correct, but the change
might have broken code, so instead  @ref{1629,,UnicodeWarning} was introduced.

(Implemented by Marc-André Lemburg.)

@item 
One error that Python programmers sometimes make is forgetting to include an
@code{__init__.py} module in a package directory. Debugging this mistake can be
confusing, and usually requires running Python with the @ref{162a,,-v} switch to
log all the paths searched. In Python 2.5, a new @ref{71d,,ImportWarning} warning is
triggered when an import would have picked up a directory as a package but no
@code{__init__.py} was found.  This warning is silently ignored by default;
provide the @ref{ac5,,-Wd} option when running the Python executable to display
the warning message. (Implemented by Thomas Wouters.)

@item 
The list of base classes in a class definition can now be empty.   As an
example, this is now legal:

@example
class C():
    pass
@end example

(Implemented by Brett Cannon.)
@end itemize

@c ======================================================================

@menu
* Interactive Interpreter Changes:: 
* Optimizations: Optimizations<10>. 

@end menu

@node Interactive Interpreter Changes,Optimizations<10>,,Other Language Changes<10>
@anchor{whatsnew/2 5 interactive}@anchor{162b}@anchor{whatsnew/2 5 interactive-interpreter-changes}@anchor{162c}
@subsubsection Interactive Interpreter Changes


In the interactive interpreter, @code{quit} and @code{exit}  have long been strings so
that new users get a somewhat helpful message when they try to quit:

@example
>>> quit
'Use Ctrl-D (i.e. EOF) to exit.'
@end example

In Python 2.5, @code{quit} and @code{exit} are now objects that still produce string
representations of themselves, but are also callable. Newbies who try @code{quit()}
or @code{exit()} will now exit the interpreter as they expect.  (Implemented by
Georg Brandl.)

The Python executable now accepts the standard long options  @ref{805,,--help}
and @ref{f16,,--version}; on Windows,  it also accepts the @ref{162d,,/?} option
for displaying a help message. (Implemented by Georg Brandl.)

@c ======================================================================

@node Optimizations<10>,,Interactive Interpreter Changes,Other Language Changes<10>
@anchor{whatsnew/2 5 optimizations}@anchor{162e}@anchor{whatsnew/2 5 opts}@anchor{162f}
@subsubsection Optimizations


Several of the optimizations were developed at the NeedForSpeed sprint, an event
held in Reykjavik, Iceland, from May 21–28 2006. The sprint focused on speed
enhancements to the CPython implementation and was funded by EWT LLC with local
support from CCP Games.  Those optimizations added at this sprint are specially
marked in the following list.


@itemize *

@item 
When they were introduced  in Python 2.4, the built-in @ref{184,,set} and
@ref{7f1,,frozenset} types were built on top of Python’s dictionary type.   In 2.5
the internal data structure has been customized for implementing sets, and as a
result sets will use a third less memory and are somewhat faster. (Implemented
by Raymond Hettinger.)

@item 
The speed of some Unicode operations, such as finding substrings, string
splitting, and character map encoding and decoding, has been improved.
(Substring search and splitting improvements were added by Fredrik Lundh and
Andrew Dalke at the NeedForSpeed sprint. Character maps were improved by Walter
Dörwald and Martin von Löwis.)

@c Patch 1313939, 1359618

@item 
The @code{long(str, base)} function is now faster on long digit strings
because fewer intermediate results are calculated.  The peak is for strings of
around 800–1000 digits where  the function is 6 times faster. (Contributed by
Alan McIntyre and committed at the NeedForSpeed sprint.)

@c Patch 1442927

@item 
It’s now illegal to mix iterating over a file  with @code{for line in file} and
calling  the file object’s @code{read()}/@ref{bf,,readline()}/@code{readlines()}
methods.  Iteration uses an internal buffer and the  @code{read*()} methods
don’t use that buffer.   Instead they would return the data following the
buffer, causing the data to appear out of order.  Mixing iteration and these
methods will now trigger a @ref{2ec,,ValueError} from the @code{read*()} method.
(Implemented by Thomas Wouters.)

@c Patch 1397960

@item 
The @ref{db,,struct} module now compiles structure format  strings into an
internal representation and caches this representation, yielding a 20% speedup.
(Contributed by Bob Ippolito at the NeedForSpeed sprint.)

@item 
The @ref{be,,re} module got a 1 or 2% speedup by switching to  Python’s allocator
functions instead of the system’s  @code{malloc()} and @code{free()}.
(Contributed by Jack Diederich at the NeedForSpeed sprint.)

@item 
The code generator’s peephole optimizer now performs simple constant folding
in expressions.  If you write something like @code{a = 2+3}, the code generator
will do the arithmetic and produce code corresponding to @code{a = 5}.  (Proposed
and implemented  by Raymond Hettinger.)

@item 
Function calls are now faster because code objects now keep  the most recently
finished frame (a “zombie frame”) in an internal field of the code object,
reusing it the next time the code object is invoked.  (Original patch by Michael
Hudson, modified by Armin Rigo and Richard Jones; committed at the NeedForSpeed
sprint.)  Frame objects are also slightly smaller, which may improve cache
locality and reduce memory usage a bit.  (Contributed by Neal Norwitz.)

@c Patch 876206

@c Patch 1337051

@item 
Python’s built-in exceptions are now new-style classes, a change that speeds
up instantiation considerably.  Exception handling in Python 2.5 is therefore
about 30% faster than in 2.4. (Contributed by Richard Jones, Georg Brandl and
Sean Reifschneider at the NeedForSpeed sprint.)

@item 
Importing now caches the paths tried, recording whether  they exist or not so
that the interpreter makes fewer  @code{open()} and @code{stat()} calls on
startup. (Contributed by Martin von Löwis and Georg Brandl.)

@c Patch 921466
@end itemize

@c ======================================================================

@node New Improved and Removed Modules,Build and C API Changes<7>,Other Language Changes<10>,What’s New in Python 2 5
@anchor{whatsnew/2 5 modules}@anchor{1630}@anchor{whatsnew/2 5 new-improved-and-removed-modules}@anchor{1631}
@subsection New, Improved, and Removed Modules


The standard library received many enhancements and bug fixes in Python 2.5.
Here’s a partial list of the most notable changes, sorted alphabetically by
module name. Consult the @code{Misc/NEWS} file in the source tree for a more
complete list of changes, or look through the SVN logs for all the details.


@itemize *

@item 
The @code{audioop} module now supports the a-LAW encoding, and the code for
u-LAW encoding has been improved.  (Contributed by Lars Immisch.)

@item 
The @ref{1c,,codecs} module gained support for incremental codecs.  The
@code{codec.lookup()} function now returns a @code{CodecInfo} instance instead
of a tuple. @code{CodecInfo} instances behave like a 4-tuple to preserve
backward compatibility but also have the attributes @code{encode},
@code{decode}, @code{incrementalencoder}, @code{incrementaldecoder},
@code{streamwriter}, and @code{streamreader}.  Incremental codecs  can receive
input and produce output in multiple chunks; the output is the same as if the
entire input was fed to the non-incremental codec. See the @code{codecs} module
documentation for details. (Designed and implemented by Walter Dörwald.)

@c Patch  1436130

@item 
The @ref{1e,,collections} module gained a new type, @code{defaultdict}, that
subclasses the standard @ref{183,,dict} type.  The new type mostly behaves like a
dictionary but constructs a default value when a key isn’t present,
automatically adding it to the dictionary for the requested key value.

The first argument to @code{defaultdict}’s constructor is a factory function
that gets called whenever a key is requested but not found. This factory
function receives no arguments, so you can use built-in type constructors such
as @ref{24d,,list()} or @ref{19b,,int()}.  For example,  you can make an index of words
based on their initial letter like this:

@example
words = """Nel mezzo del cammin di nostra vita
mi ritrovai per una selva oscura
che la diritta via era smarrita""".lower().split()

index = defaultdict(list)

for w in words:
    init_letter = w[0]
    index[init_letter].append(w)
@end example

Printing @code{index} results in the following output:

@example
defaultdict(<type 'list'>, @{'c': ['cammin', 'che'], 'e': ['era'],
        'd': ['del', 'di', 'diritta'], 'm': ['mezzo', 'mi'],
        'l': ['la'], 'o': ['oscura'], 'n': ['nel', 'nostra'],
        'p': ['per'], 's': ['selva', 'smarrita'],
        'r': ['ritrovai'], 'u': ['una'], 'v': ['vita', 'via']@}
@end example

(Contributed by Guido van Rossum.)

@item 
The @code{deque} double-ended queue type supplied by the @ref{1e,,collections}
module now has a @code{remove(value)} method that removes the first occurrence
of `value' in the queue, raising @ref{2ec,,ValueError} if the value isn’t found.
(Contributed by Raymond Hettinger.)

@item 
New module: The @ref{27,,contextlib} module contains helper functions for use
with the new ‘@ref{186,,with}’ statement.  See section @ref{1619,,The contextlib module}
for more about this module.

@item 
New module: The @ref{2b,,cProfile} module is a C implementation of  the existing
@ref{b4,,profile} module that has much lower overhead. The module’s interface is
the same as @code{profile}: you run @code{cProfile.run('main()')} to profile a
function, can save profile data to a file, etc.  It’s not yet known if the
Hotshot profiler, which is also written in C but doesn’t match the
@code{profile} module’s interface, will continue to be maintained in future
versions of Python.  (Contributed by Armin Rigo.)

Also, the @ref{b5,,pstats} module for analyzing the data measured by the profiler
now supports directing the output to any file object by supplying a `stream'
argument to the @code{Stats} constructor. (Contributed by Skip Montanaro.)

@item 
The @ref{2d,,csv} module, which parses files in comma-separated value format,
received several enhancements and a number of bugfixes.  You can now set the
maximum size in bytes of a field by calling the
@code{csv.field_size_limit(new_limit)} function; omitting the `new_limit'
argument will return the currently set limit.  The @code{reader} class now has
a @code{line_num} attribute that counts the number of physical lines read from
the source; records can span multiple physical lines, so @code{line_num} is not
the same as the number of records read.

The CSV parser is now stricter about multi-line quoted fields. Previously, if a
line ended within a quoted field without a terminating newline character, a
newline would be inserted into the returned field. This behavior caused problems
when reading files that contained carriage return characters within fields, so
the code was changed to return the field without inserting newlines. As a
consequence, if newlines embedded within fields are important, the input should
be split into lines in a manner that preserves the newline characters.

(Contributed by Skip Montanaro and Andrew McNamara.)

@item 
The @ref{4e2,,datetime} class in the @ref{34,,datetime}  module now has a
@code{strptime(string, format)}  method for parsing date strings, contributed
by Josh Spoerri. It uses the same format characters as @ref{1632,,time.strptime()} and
@ref{13ee,,time.strftime()}:

@example
import datetime as dt

ts = dt.datetime.strptime('10:13:15 2006-03-07',
                          '%H:%M:%S %Y-%m-%d')
@end example

@item 
The @code{SequenceMatcher.get_matching_blocks()} method in the @ref{3b,,difflib}
module now guarantees to return a minimal list of blocks describing matching
subsequences.  Previously, the algorithm would occasionally break a block of
matching elements into two list entries. (Enhancement by Tim Peters.)

@item 
The @ref{3e,,doctest} module gained a @code{SKIP} option that keeps an example from
being executed at all.  This is intended for code snippets that are usage
examples intended for the reader and aren’t actually test cases.

An `encoding' parameter was added to the @code{testfile()} function and the
@code{DocFileSuite} class to specify the file’s encoding.  This makes it
easier to use non-ASCII characters in  tests contained within a docstring.
(Contributed by Bjorn Tillenius.)

@c Patch 1080727

@item 
The @ref{3f,,email} package has been updated to version 4.0. (Contributed by
Barry Warsaw.)

@c XXX need to provide some more detail here

@geindex universal newlines;What's new

@item 
The @ref{5f,,fileinput} module was made more flexible. Unicode filenames are now
supported, and a `mode' parameter that defaults to @code{"r"} was added to the
@ref{14dd,,input()} function to allow opening files in binary or @ref{f34,,universal newlines} mode.  Another new parameter, `openhook', lets you use a function
other than @ref{316,,open()}  to open the input files.  Once you’re iterating over
the set of files, the @code{FileInput} object’s new @ref{1633,,fileno()} returns
the file descriptor for the currently opened file. (Contributed by Georg
Brandl.)

@item 
In the @ref{64,,gc} module, the new @code{get_count()} function returns a 3-tuple
containing the current collection counts for the three GC generations.  This is
accounting information for the garbage collector; when these counts reach a
specified threshold, a garbage collection sweep will be made.  The existing
@ref{1b3,,gc.collect()} function now takes an optional `generation' argument of 0, 1,
or 2 to specify which generation to collect. (Contributed by Barry Warsaw.)

@item 
The @code{nsmallest()} and  @code{nlargest()} functions in the @ref{6d,,heapq}
module  now support a @code{key} keyword parameter similar to the one provided by
the @ref{110a,,min()}/@ref{110b,,max()} functions and the @code{sort()} methods.  For
example:

@example
>>> import heapq
>>> L = ["short", 'medium', 'longest', 'longer still']
>>> heapq.nsmallest(2, L)  # Return two lowest elements, lexicographically
['longer still', 'longest']
>>> heapq.nsmallest(2, L, key=len)   # Return two shortest elements
['short', 'medium']
@end example

(Contributed by Raymond Hettinger.)

@item 
The @ref{d42,,itertools.islice()} function now accepts @code{None} for the start and
step arguments.  This makes it more compatible with the attributes of slice
objects, so that you can now write the following:

@example
s = slice(5)     # Create slice object
itertools.islice(iterable, s.start, s.stop, s.step)
@end example

(Contributed by Raymond Hettinger.)

@item 
The @ref{199,,format()} function in the @ref{8a,,locale} module has been modified and
two new functions were added, @code{format_string()} and @code{currency()}.

The @ref{199,,format()} function’s `val' parameter could previously be a string as
long as no more than one %char specifier appeared; now the parameter must be
exactly one %char specifier with no surrounding text.  An optional `monetary'
parameter was also added which, if @code{True}, will use the locale’s rules for
formatting currency in placing a separator between groups of three digits.

To format strings with multiple %char specifiers, use the new
@code{format_string()} function that works like @ref{199,,format()} but also supports
mixing %char specifiers with arbitrary text.

A new @code{currency()} function was also added that formats a number according
to the current locale’s settings.

(Contributed by Georg Brandl.)

@c Patch 1180296

@item 
The @ref{8f,,mailbox} module underwent a massive rewrite to add the capability to
modify mailboxes in addition to reading them.  A new set of classes that include
@code{mbox}, @code{MH}, and @code{Maildir} are used to read mailboxes, and
have an @code{add(message)} method to add messages, @code{remove(key)} to
remove messages, and @code{lock()}/@code{unlock()} to lock/unlock the mailbox.
The following example converts a maildir-format mailbox into an mbox-format
one:

@example
import mailbox

# 'factory=None' uses email.Message.Message as the class representing
# individual messages.
src = mailbox.Maildir('maildir', factory=None)
dest = mailbox.mbox('/tmp/mbox')

for msg in src:
    dest.add(msg)
@end example

(Contributed by Gregory K. Johnson.  Funding was provided by Google’s 2005
Summer of Code.)

@item 
New module: the @code{msilib} module allows creating Microsoft Installer
@code{.msi} files and CAB files.  Some support for reading the @code{.msi}
database is also included. (Contributed by Martin von Löwis.)

@item 
The @code{nis} module now supports accessing domains other than the system
default domain by supplying a `domain' argument to the @code{nis.match()} and
@code{nis.maps()} functions. (Contributed by Ben Bell.)

@item 
The @ref{a3,,operator} module’s @code{itemgetter()}  and @code{attrgetter()}
functions now support multiple fields.   A call such as
@code{operator.attrgetter('a', 'b')} will return a function  that retrieves the
@code{a} and @code{b} attributes.  Combining  this new feature with the
@code{sort()} method’s @code{key} parameter  lets you easily sort lists using
multiple fields. (Contributed by Raymond Hettinger.)

@item 
The @ref{a4,,optparse} module was updated to version 1.5.1 of the Optik library.
The @code{OptionParser} class gained an @code{epilog} attribute, a string
that will be printed after the help message, and a @code{destroy()} method to
break reference cycles created by the object. (Contributed by Greg Ward.)

@item 
The @ref{a5,,os} module underwent several changes.  The @code{stat_float_times}
variable now defaults to true, meaning that @ref{26d,,os.stat()} will now return time
values as floats.  (This doesn’t necessarily mean that @code{os.stat()} will
return times that are precise to fractions of a second; not all systems support
such precision.)

Constants named @ref{1492,,os.SEEK_SET}, @ref{1493,,os.SEEK_CUR}, and
@ref{1494,,os.SEEK_END} have been added; these are the parameters to the
@ref{131c,,os.lseek()} function.  Two new constants for locking are
@ref{1634,,os.O_SHLOCK} and @ref{1635,,os.O_EXLOCK}.

Two new functions, @code{wait3()} and @code{wait4()}, were added.  They’re similar
the @code{waitpid()} function which waits for a child process to exit and returns
a tuple of the process ID and its exit status, but @code{wait3()} and
@code{wait4()} return additional information.  @code{wait3()} doesn’t take a
process ID as input, so it waits for any child process to exit and returns a
3-tuple of `process-id', `exit-status', `resource-usage' as returned from the
@ref{1636,,resource.getrusage()} function. @code{wait4(pid)} does take a process ID.
(Contributed by Chad J. Schroeder.)

On FreeBSD, the @ref{26d,,os.stat()} function now returns  times with nanosecond
resolution, and the returned object now has @code{st_gen} and
@code{st_birthtime}. The @code{st_flags} attribute is also available, if the
platform supports it. (Contributed by Antti Louko and  Diego Pettenò.)

@c (Patch 1180695, 1212117)

@item 
The Python debugger provided by the @ref{aa,,pdb} module can now store lists of
commands to execute when a breakpoint is reached and execution stops.  Once
breakpoint #1 has been created, enter @code{commands 1} and enter a series of
commands to be executed, finishing the list with @code{end}.  The command list can
include commands that resume execution, such as @code{continue} or @code{next}.
(Contributed by Grégoire Dooms.)

@c Patch 790710

@item 
The @ref{ab,,pickle} and @code{cPickle} modules no longer accept a return value
of @code{None} from the @ref{bc5,,__reduce__()} method; the method must return a tuple
of arguments instead.  The ability to return @code{None} was deprecated in Python
2.4, so this completes the removal of the feature.

@item 
The @ref{ae,,pkgutil} module, containing various utility functions for finding
packages, was enhanced to support 
@geindex Python 향상 제안; PEP 302
PEP 302@footnote{https://peps.python.org/pep-0302/}’s import hooks and now also works for
packages stored in ZIP-format archives. (Contributed by Phillip J. Eby.)

@item 
The pybench benchmark suite by Marc-André Lemburg is now included in the
@code{Tools/pybench} directory.  The pybench suite is an improvement on the
commonly used @code{pystone.py} program because pybench provides a more
detailed measurement of the interpreter’s speed.  It times particular operations
such as function calls, tuple slicing, method lookups, and numeric operations,
instead of performing many different operations and reducing the result to a
single number as @code{pystone.py} does.

@item 
The @code{pyexpat} module now uses version 2.0 of the Expat parser.
(Contributed by Trent Mick.)

@item 
The @ref{1599,,Queue} class provided by the @code{Queue} module gained two new
methods.  @code{join()} blocks until all items in the queue have been retrieved
and all processing work on the items  have been completed.  Worker threads call
the other new method,  @code{task_done()}, to signal that processing for an item
has been completed.  (Contributed by Raymond Hettinger.)

@item 
The old @code{regex} and @code{regsub} modules, which have been  deprecated
ever since Python 2.0, have finally been deleted.   Other deleted modules:
@code{statcache}, @code{tzparse}, @code{whrandom}.

@item 
Also deleted: the @code{lib-old} directory, which includes ancient modules
such as @code{dircmp} and @code{ni}, was removed.  @code{lib-old} wasn’t on the
default @code{sys.path}, so unless your programs explicitly added the directory to
@code{sys.path}, this removal shouldn’t affect your code.

@item 
The @ref{c2,,rlcompleter} module is no longer  dependent on importing the
@ref{bf,,readline} module and therefore now works on non-Unix platforms. (Patch
from Robert Kiendl.)

@c Patch #1472854

@item 
The @ref{135,,SimpleXMLRPCServer} and @code{DocXMLRPCServer}  classes now have a
@code{rpc_paths} attribute that constrains XML-RPC operations to a limited set
of URL paths; the default is to allow only @code{'/'} and @code{'/RPC2'}.  Setting
@code{rpc_paths} to @code{None} or an empty tuple disables  this path checking.

@c Bug #1473048

@item 
The @ref{d1,,socket} module now supports @code{AF_NETLINK} sockets on Linux,
thanks to a patch from Philippe Biondi.   Netlink sockets are a Linux-specific
mechanism for communications between a user-space process and kernel code; an
introductory  article about them is at @indicateurl{https://www.linuxjournal.com/article/7356}.
In Python code, netlink addresses are represented as a tuple of 2 integers,
@code{(pid, group_mask)}.

Two new methods on socket objects, @code{recv_into(buffer)} and
@code{recvfrom_into(buffer)}, store the received data in an object  that
supports the buffer protocol instead of returning the data as a string.  This
means you can put the data directly into an array or a memory-mapped file.

Socket objects also gained @code{getfamily()}, @code{gettype()}, and
@code{getproto()} accessor methods to retrieve the family, type, and protocol
values for the socket.

@item 
New module: the @code{spwd} module provides functions for accessing the shadow
password database on systems that support  shadow passwords.

@item 
The @ref{db,,struct} is now faster because it  compiles format strings into
@code{Struct} objects with @code{pack()} and @code{unpack()} methods.  This is
similar to how the @ref{be,,re} module lets you create compiled regular expression
objects.  You can still use the module-level  @code{pack()} and @code{unpack()}
functions; they’ll create  @code{Struct} objects and cache them.  Or you can
use  @code{Struct} instances directly:

@example
s = struct.Struct('ih3s')

data = s.pack(1972, 187, 'abc')
year, number, name = s.unpack(data)
@end example

You can also pack and unpack data to and from buffer objects directly using the
@code{pack_into(buffer, offset, v1, v2, ...)} and @code{unpack_from(buffer,
offset)} methods.  This lets you store data directly into an array or a
memory-mapped file.

(@code{Struct} objects were implemented by Bob Ippolito at the NeedForSpeed
sprint.  Support for buffer objects was added by Martin Blais, also at the
NeedForSpeed sprint.)

@item 
The Python developers switched from CVS to Subversion during the 2.5
development process.  Information about the exact build version is available as
the @code{sys.subversion} variable, a 3-tuple of @code{(interpreter-name, branch-name,
revision-range)}.  For example, at the time of writing my copy of 2.5 was
reporting @code{('CPython', 'trunk', '45313:45315')}.

This information is also available to C extensions via the
@ref{1637,,Py_GetBuildInfo()} function that returns a  string of build information
like this: @code{"trunk:45355:45356M, Apr 13 2006, 07:42:19"}.   (Contributed by
Barry Warsaw.)

@item 
Another new function, @ref{1638,,sys._current_frames()}, returns the current stack
frames for all running threads as a dictionary mapping thread identifiers to the
topmost stack frame currently active in that thread at the time the function is
called.  (Contributed by Tim Peters.)

@item 
The @code{TarFile} class in the @ref{e4,,tarfile} module now has an
@code{extractall()} method that extracts all members from the archive into the
current working directory.  It’s also possible to set a different directory as
the extraction target, and to unpack only a subset of the archive’s members.

The compression used for a tarfile opened in stream mode can now be autodetected
using the mode @code{'r|*'}. (Contributed by Lars Gustäbel.)

@c patch 918101

@item 
The @ref{f3,,threading} module now lets you set the stack size used when new
threads are created. The @code{stack_size([*size*])} function returns the
currently configured stack size, and supplying the optional `size' parameter
sets a new value.  Not all platforms support changing the stack size, but
Windows, POSIX threading, and OS/2 all do. (Contributed by Andrew MacIntyre.)

@c Patch 1454481

@item 
The @ref{10b,,unicodedata} module has been updated to use version 4.1.0 of the
Unicode character database.  Version 3.2.0 is required  by some specifications,
so it’s still available as  @ref{1639,,unicodedata.ucd_3_2_0}.

@item 
New module: the  @ref{116,,uuid} module generates  universally unique identifiers
(UUIDs) according to 
@geindex RFC; RFC 4122
RFC 4122@footnote{https://datatracker.ietf.org/doc/html/rfc4122.html}.  The RFC defines several different UUID
versions that are generated from a starting string, from system properties, or
purely randomly.  This module contains a @code{UUID} class and  functions
named @code{uuid1()}, @code{uuid3()}, @code{uuid4()},  and  @code{uuid5()} to
generate different versions of UUID.  (Version 2 UUIDs  are not specified in
@geindex RFC; RFC 4122
RFC 4122@footnote{https://datatracker.ietf.org/doc/html/rfc4122.html} and are not supported by this module.)

@example
>>> import uuid
>>> # make a UUID based on the host ID and current time
>>> uuid.uuid1()
UUID('a8098c1a-f86e-11da-bd1a-00112444be1e')

>>> # make a UUID using an MD5 hash of a namespace UUID and a name
>>> uuid.uuid3(uuid.NAMESPACE_DNS, 'python.org')
UUID('6fa459ea-ee8a-3ca4-894e-db77e160355e')

>>> # make a random UUID
>>> uuid.uuid4()
UUID('16fd2706-8baf-433b-82eb-8c7fada847da')

>>> # make a UUID using a SHA-1 hash of a namespace UUID and a name
>>> uuid.uuid5(uuid.NAMESPACE_DNS, 'python.org')
UUID('886313e1-3b8a-5372-9b90-0c9aee199e5d')
@end example

(Contributed by Ka-Ping Yee.)

@item 
The @ref{11a,,weakref} module’s @code{WeakKeyDictionary} and
@code{WeakValueDictionary} types gained new methods for iterating over the
weak references contained in the dictionary.  @code{iterkeyrefs()} and
@code{keyrefs()} methods were added to @code{WeakKeyDictionary}, and
@code{itervaluerefs()} and @code{valuerefs()} were added to
@code{WeakValueDictionary}.  (Contributed by Fred L. Drake, Jr.)

@item 
The @ref{11b,,webbrowser} module received a number of enhancements. It’s now
usable as a script with @code{python -m webbrowser}, taking a URL as the argument;
there are a number of switches  to control the behaviour (@code{-n} for a new
browser window,  @code{-t} for a new tab).  New module-level functions,
@code{open_new()} and @code{open_new_tab()}, were added  to support this.  The
module’s @ref{316,,open()} function supports an additional feature, an `autoraise'
parameter that signals whether to raise the open window when possible. A number
of additional browsers were added to the supported list such as Firefox, Opera,
Konqueror, and elinks.  (Contributed by Oleg Broytmann and Georg Brandl.)

@c Patch #754022

@item 
The @ref{134,,xmlrpclib} module now supports returning  @ref{4e2,,datetime} objects
for the XML-RPC date type.  Supply  @code{use_datetime=True} to the @ref{163a,,loads()}
function or the @code{Unmarshaller} class to enable this feature. (Contributed
by Skip Montanaro.)

@c Patch 1120353

@item 
The @ref{137,,zipfile} module now supports the ZIP64 version of the  format,
meaning that a .zip archive can now be larger than 4 GiB and can contain
individual files larger than 4 GiB.  (Contributed by Ronald Oussoren.)

@c Patch 1446489

@item 
The @ref{139,,zlib} module’s @code{Compress} and @code{Decompress} objects now
support a @ref{29,,copy()} method that makes a copy of the  object’s internal state
and returns a new  @code{Compress} or @code{Decompress} object.
(Contributed by Chris AtLee.)

@c Patch 1435422
@end itemize

@c ======================================================================

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

@end menu

@node The ctypes package,The ElementTree package,,New Improved and Removed Modules
@anchor{whatsnew/2 5 module-ctypes}@anchor{163b}@anchor{whatsnew/2 5 the-ctypes-package}@anchor{163c}
@subsubsection The ctypes package


The @ref{2e,,ctypes} package, written by Thomas Heller, has been added  to the
standard library.  @code{ctypes} lets you call arbitrary functions  in shared
libraries or DLLs.  Long-time users may remember the @code{dl} module, which
provides functions for loading shared libraries and calling functions in them.
The @code{ctypes} package is much fancier.

To load a shared library or DLL, you must create an instance of the
@code{CDLL} class and provide the name or path of the shared library or DLL.
Once that’s done, you can call arbitrary functions by accessing them as
attributes of the @code{CDLL} object.

@example
import ctypes

libc = ctypes.CDLL('libc.so.6')
result = libc.printf("Line of output\n")
@end example

Type constructors for the various C types are provided: @code{c_int()},
@code{c_float()}, @code{c_double()}, @code{c_char_p()} (equivalent to char*), and so forth.  Unlike Python’s types, the C versions are all mutable; you
can assign to their @code{value} attribute to change the wrapped value.  Python
integers and strings will be automatically converted to the corresponding C
types, but for other types you  must call the correct type constructor.  (And I
mean `must';  getting it wrong will often result in the interpreter crashing
with a segmentation fault.)

You shouldn’t use @code{c_char_p()} with a Python string when the C function will
be modifying the memory area, because Python strings are  supposed to be
immutable; breaking this rule will cause puzzling bugs.  When you need a
modifiable memory area, use @code{create_string_buffer()}:

@example
s = "this is a string"
buf = ctypes.create_string_buffer(s)
libc.strfry(buf)
@end example

C functions are assumed to return integers, but you can set the @code{restype}
attribute of the function object to  change this:

@example
>>> libc.atof('2.71828')
-1783957616
>>> libc.atof.restype = ctypes.c_double
>>> libc.atof('2.71828')
2.71828
@end example

@ref{2e,,ctypes} also provides a wrapper for Python’s C API  as the
@code{ctypes.pythonapi} object.  This object does `not'  release the global
interpreter lock before calling a function, because the lock must be held when
calling into the interpreter’s code.   There’s a @ref{1f3,,py_object} type
constructor that will create a  @ref{5dc,,PyObject}* pointer.  A simple usage:

@example
import ctypes

d = @{@}
ctypes.pythonapi.PyObject_SetItem(ctypes.py_object(d),
          ctypes.py_object("abc"),  ctypes.py_object(1))
# d is now @{'abc', 1@}.
@end example

Don’t forget to use @ref{1f3,,py_object()}; if it’s omitted you end  up with a
segmentation fault.

@ref{2e,,ctypes} has been around for a while, but people still write  and
distribution hand-coded extension modules because you can’t rely on
@code{ctypes} being present. Perhaps developers will begin to write  Python
wrappers atop a library accessed through @code{ctypes} instead of extension
modules, now that @code{ctypes} is included with core Python.


@subsubheading 더 보기



@table @asis

@item @indicateurl{https://web.archive.org/web/20180410025338/http://starship.python.net/crew/theller/ctypes/}

The pre-stdlib ctypes web page, with a tutorial, reference, and FAQ.
@end table

The documentation  for the @ref{2e,,ctypes} module.


@c ======================================================================

@node The ElementTree package,The hashlib package,The ctypes package,New Improved and Removed Modules
@anchor{whatsnew/2 5 module-etree}@anchor{163d}@anchor{whatsnew/2 5 the-elementtree-package}@anchor{163e}
@subsubsection The ElementTree package


A subset of Fredrik Lundh’s ElementTree library for processing XML has been
added to the standard library as @code{xml.etree}.  The available modules are
@code{ElementTree}, @code{ElementPath}, and @code{ElementInclude} from
ElementTree 1.2.6.    The @code{cElementTree} accelerator module is also
included.

The rest of this section will provide a brief overview of using ElementTree.
Full documentation for ElementTree is available at
@indicateurl{https://web.archive.org/web/20201124024954/http://effbot.org/zone/element-index.htm}.

ElementTree represents an XML document as a tree of element nodes. The text
content of the document is stored as the @code{text} and @code{tail}
attributes of  (This is one of the major differences between ElementTree and
the Document Object Model; in the DOM there are many different types of node,
including @code{TextNode}.)

The most commonly used parsing function is @code{parse()}, that takes either a
string (assumed to contain a filename) or a file-like object and returns an
@code{ElementTree} instance:

@example
from xml.etree import ElementTree as ET

tree = ET.parse('ex-1.xml')

feed = urllib.urlopen(
          'http://planet.python.org/rss10.xml')
tree = ET.parse(feed)
@end example

Once you have an @code{ElementTree} instance, you can call its @code{getroot()}
method to get the root @code{Element} node.

There’s also an @code{XML()} function that takes a string literal and returns an
@code{Element} node (not an @code{ElementTree}).   This function provides a
tidy way to incorporate XML fragments, approaching the convenience of an XML
literal:

@example
svg = ET.XML("""<svg width="10px" version="1.0">
             </svg>""")
svg.set('height', '320px')
svg.append(elem1)
@end example

Each XML element supports some dictionary-like and some list-like access
methods.  Dictionary-like operations are used to access attribute values, and
list-like operations are used to access child nodes.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Operation

@tab

Result

@item

@code{elem[n]}

@tab

Returns n’th child element.

@item

@code{elem[m:n]}

@tab

Returns list of m’th through n’th child
elements.

@item

@code{len(elem)}

@tab

Returns number of child elements.

@item

@code{list(elem)}

@tab

Returns list of child elements.

@item

@code{elem.append(elem2)}

@tab

Adds `elem2' as a child.

@item

@code{elem.insert(index, elem2)}

@tab

Inserts `elem2' at the specified location.

@item

@code{del elem[n]}

@tab

Deletes n’th child element.

@item

@code{elem.keys()}

@tab

Returns list of attribute names.

@item

@code{elem.get(name)}

@tab

Returns value of attribute `name'.

@item

@code{elem.set(name, value)}

@tab

Sets new value for attribute `name'.

@item

@code{elem.attrib}

@tab

Retrieves the dictionary containing
attributes.

@item

@code{del elem.attrib[name]}

@tab

Deletes attribute `name'.

@end multitable


Comments and processing instructions are also represented as @code{Element}
nodes.  To check if a node is a comment or processing instructions:

@example
if elem.tag is ET.Comment:
    ...
elif elem.tag is ET.ProcessingInstruction:
    ...
@end example

To generate XML output, you should call the @code{ElementTree.write()} method.
Like @code{parse()}, it can take either a string or a file-like object:

@example
# Encoding is US-ASCII
tree.write('output.xml')

# Encoding is UTF-8
f = open('output.xml', 'w')
tree.write(f, encoding='utf-8')
@end example

(Caution: the default encoding used for output is ASCII.  For general XML work,
where an element’s name may contain arbitrary Unicode characters, ASCII isn’t a
very useful encoding because it will raise an exception if an element’s name
contains any characters with values greater than 127.  Therefore, it’s best to
specify a different encoding such as UTF-8 that can handle any Unicode
character.)

This section is only a partial description of the ElementTree interfaces. Please
read the package’s official documentation for more details.


@subsubheading 더 보기



@table @asis

@item @indicateurl{https://web.archive.org/web/20201124024954/http://effbot.org/zone/element-index.htm}

Official documentation for ElementTree.
@end table


@c ======================================================================

@node The hashlib package,The sqlite3 package,The ElementTree package,New Improved and Removed Modules
@anchor{whatsnew/2 5 module-hashlib}@anchor{163f}@anchor{whatsnew/2 5 the-hashlib-package}@anchor{1640}
@subsubsection The hashlib package


A new @ref{6c,,hashlib} module, written by Gregory P. Smith,  has been added to
replace the @code{md5} and @code{sha} modules.  @code{hashlib} adds support for
additional secure hashes (SHA-224, SHA-256, SHA-384, and SHA-512). When
available, the module uses OpenSSL for fast platform optimized implementations
of algorithms.

The old @code{md5} and @code{sha} modules still exist as wrappers around hashlib
to preserve backwards compatibility.  The new module’s interface is very close
to that of the old modules, but not identical. The most significant difference
is that the constructor functions for creating new hashing objects are named
differently.

@example
# Old versions
h = md5.md5()
h = md5.new()

# New version
h = hashlib.md5()

# Old versions
h = sha.sha()
h = sha.new()

# New version
h = hashlib.sha1()

# Hash that weren't previously available
h = hashlib.sha224()
h = hashlib.sha256()
h = hashlib.sha384()
h = hashlib.sha512()

# Alternative form
h = hashlib.new('md5')          # Provide algorithm as a string
@end example

Once a hash object has been created, its methods are the same as before:
@code{update(string)} hashes the specified string into the  current digest
state, @code{digest()} and @code{hexdigest()} return the digest value as a binary
string or a string of hex digits, and @ref{29,,copy()} returns a new hashing object
with the same digest state.


@subsubheading 더 보기


The documentation  for the @ref{6c,,hashlib} module.


@c ======================================================================

@node The sqlite3 package,The wsgiref package,The hashlib package,New Improved and Removed Modules
@anchor{whatsnew/2 5 module-sqlite}@anchor{1641}@anchor{whatsnew/2 5 the-sqlite3-package}@anchor{1642}
@subsubsection The sqlite3 package


The pysqlite module (@indicateurl{https://www.pysqlite.org}), a wrapper for the SQLite embedded
database, has been added to the standard library under the package name
@ref{d4,,sqlite3}.

SQLite is a C library that provides a lightweight disk-based database that
doesn’t require a separate server process and allows accessing the database
using a nonstandard variant of the SQL query language. Some applications can use
SQLite for internal data storage.  It’s also possible to prototype an
application using SQLite and then port the code to a larger database such as
PostgreSQL or Oracle.

pysqlite was written by Gerhard Häring and provides a SQL interface compliant
with the DB-API 2.0 specification described by 
@geindex Python 향상 제안; PEP 249
PEP 249@footnote{https://peps.python.org/pep-0249/}.

If you’re compiling the Python source yourself, note that the source tree
doesn’t include the SQLite code, only the wrapper module. You’ll need to have
the SQLite libraries and headers installed before compiling Python, and the
build process will compile the module when the necessary headers are available.

To use the module, you must first create a @code{Connection} object that
represents the database.  Here the data will be stored in the
@code{/tmp/example} file:

@example
conn = sqlite3.connect('/tmp/example')
@end example

You can also supply the special name @code{:memory:} to create a database in RAM.

Once you have a @code{Connection}, you can create a @code{Cursor}  object
and call its @code{execute()} method to perform SQL commands:

@example
c = conn.cursor()

# Create table
c.execute('@w{'}'create table stocks
(date text, trans text, symbol text,
 qty real, price real)'@w{'}')

# Insert a row of data
c.execute("""insert into stocks
          values ('2006-01-05','BUY','RHAT',100,35.14)""")
@end example

Usually your SQL operations will need to use values from Python variables.  You
shouldn’t assemble your query using Python’s string operations because doing so
is insecure; it makes your program vulnerable to an SQL injection attack.

Instead, use the DB-API’s parameter substitution.  Put @code{?} as a placeholder
wherever you want to use a value, and then provide a tuple of values as the
second argument to the cursor’s @code{execute()} method.  (Other database modules
may use a different placeholder, such as @code{%s} or @code{:1}.) For example:

@example
# Never do this -- insecure!
symbol = 'IBM'
c.execute("... where symbol = '%s'" % symbol)

# Do this instead
t = (symbol,)
c.execute('select * from stocks where symbol=?', t)

# Larger example
for t in (('2006-03-28', 'BUY', 'IBM', 1000, 45.00),
          ('2006-04-05', 'BUY', 'MSOFT', 1000, 72.00),
          ('2006-04-06', 'SELL', 'IBM', 500, 53.00),
         ):
    c.execute('insert into stocks values (?,?,?,?,?)', t)
@end example

To retrieve data after executing a SELECT statement, you can either  treat the
cursor as an iterator, call the cursor’s @code{fetchone()} method to retrieve a
single matching row,  or call @code{fetchall()} to get a list of the matching
rows.

This example uses the iterator form:

@example
>>> c = conn.cursor()
>>> c.execute('select * from stocks order by price')
>>> for row in c:
...    print row
...
(u'2006-01-05', u'BUY', u'RHAT', 100, 35.140000000000001)
(u'2006-03-28', u'BUY', u'IBM', 1000, 45.0)
(u'2006-04-06', u'SELL', u'IBM', 500, 53.0)
(u'2006-04-05', u'BUY', u'MSOFT', 1000, 72.0)
>>>
@end example

For more information about the SQL dialect supported by SQLite, see
@indicateurl{https://www.sqlite.org}.


@subsubheading 더 보기



@table @asis

@item @indicateurl{https://www.pysqlite.org}

The pysqlite web page.

@item @indicateurl{https://www.sqlite.org}

The SQLite web page; the documentation describes the syntax and the available
data types for the supported SQL dialect.
@end table

The documentation  for the @ref{d4,,sqlite3} module.


@table @asis

@geindex Python 향상 제안; PEP 249

@item PEP 249@footnote{https://peps.python.org/pep-0249/} - Database API Specification 2.0

PEP written by Marc-André Lemburg.
@end table


@c ======================================================================

@node The wsgiref package,,The sqlite3 package,New Improved and Removed Modules
@anchor{whatsnew/2 5 module-wsgiref}@anchor{1643}@anchor{whatsnew/2 5 the-wsgiref-package}@anchor{1644}
@subsubsection The wsgiref package


The Web Server Gateway Interface (WSGI) v1.0 defines a standard interface
between web servers and Python web applications and is described in 
@geindex Python 향상 제안; PEP 333
PEP 333@footnote{https://peps.python.org/pep-0333/}.
The @ref{11e,,wsgiref} package is a reference implementation of the WSGI
specification.

@c XXX should this be in a :pep:`333` section instead?

The package includes a basic HTTP server that will run a WSGI application; this
server is useful for debugging but isn’t intended for  production use.  Setting
up a server takes only a few lines of code:

@example
from wsgiref import simple_server

wsgi_app = ...

host = '@w{'}
port = 8000
httpd = simple_server.make_server(host, port, wsgi_app)
httpd.serve_forever()
@end example

@c XXX discuss structure of WSGI applications?

@c XXX provide an example using Django or some other framework?


@subsubheading 더 보기



@table @asis

@item @indicateurl{https://web.archive.org/web/20160331090247/http://wsgi.readthedocs.org/en/latest/}

A central web site for WSGI-related resources.

@geindex Python 향상 제안; PEP 333

@item PEP 333@footnote{https://peps.python.org/pep-0333/} - Python Web Server Gateway Interface v1.0

PEP written by Phillip J. Eby.
@end table


@c ======================================================================

@node Build and C API Changes<7>,Porting to Python 2 5,New Improved and Removed Modules,What’s New in Python 2 5
@anchor{whatsnew/2 5 build-and-c-api-changes}@anchor{1645}@anchor{whatsnew/2 5 build-api}@anchor{1646}
@subsection Build and C API Changes


Changes to Python’s build process and to the C API include:


@itemize *

@item 
The Python source tree was converted from CVS to Subversion,  in a complex
migration procedure that was supervised and flawlessly carried out by Martin von
Löwis.  The procedure was developed as 
@geindex Python 향상 제안; PEP 347
PEP 347@footnote{https://peps.python.org/pep-0347/}.

@item 
Coverity, a company that markets a source code analysis tool called Prevent,
provided the results of their examination of the Python source code.  The
analysis found about 60 bugs that  were quickly fixed.  Many of the bugs were
refcounting problems, often occurring in error-handling code.  See
@indicateurl{https://scan.coverity.com} for the statistics.

@item 
The largest change to the C API came from 
@geindex Python 향상 제안; PEP 353
PEP 353@footnote{https://peps.python.org/pep-0353/}, which modifies the
interpreter to use a @ref{c54,,Py_ssize_t} type definition instead of
int.  See the earlier section @ref{161d,,PEP 353; Using ssize_t as the index type} for a discussion of this
change.

@item 
The design of the bytecode compiler has changed a great deal,  no longer
generating bytecode by traversing the parse tree.  Instead the parse tree is
converted to an abstract syntax tree (or AST), and it is  the abstract syntax
tree that’s traversed to produce the bytecode.

It’s possible for Python code to obtain AST objects by using the
@ref{4b2,,compile()} built-in and specifying @code{_ast.PyCF_ONLY_AST} as the value of
the  `flags' parameter:

@example
from _ast import PyCF_ONLY_AST
ast = compile("""a=0
for i in range(10):
    a += i
""", "<string>", 'exec', PyCF_ONLY_AST)

assignment = ast.body[0]
for_loop = ast.body[1]
@end example

No official documentation has been written for the AST code yet, but 
@geindex Python 향상 제안; PEP 339
PEP 339@footnote{https://peps.python.org/pep-0339/}
discusses the design.  To start learning about the code, read the definition of
the various AST nodes in @code{Parser/Python.asdl}.  A Python script reads this
file and generates a set of C structure definitions in
@code{Include/Python-ast.h}.  The @code{PyParser_ASTFromString()} and
@code{PyParser_ASTFromFile()}, defined in @code{Include/pythonrun.h}, take
Python source as input and return the root of an AST representing the contents.
This AST can then be turned into a code object by @code{PyAST_Compile()}.  For
more information, read the source code, and then ask questions on python-dev.

The AST code was developed under Jeremy Hylton’s management, and implemented by
(in alphabetical order) Brett Cannon, Nick Coghlan, Grant Edwards, John
Ehresman, Kurt Kaiser, Neal Norwitz, Tim Peters, Armin Rigo, and Neil
Schemenauer, plus the participants in a number of AST sprints at conferences
such as PyCon.

@c List of names taken from Jeremy's python-dev post at

@c https://mail.python.org/pipermail/python-dev/2005-October/057500.html

@item 
Evan Jones’s patch to obmalloc, first described in a talk at PyCon DC 2005,
was applied.  Python 2.4 allocated small objects in 256K-sized arenas, but never
freed arenas.  With this patch, Python will free arenas when they’re empty.  The
net effect is that on some platforms, when you allocate many objects, Python’s
memory usage may actually drop when you delete them and the memory may be
returned to the operating system.  (Implemented by Evan Jones, and reworked by
Tim Peters.)

Note that this change means extension modules must be more careful when
allocating memory.  Python’s API has many different functions for allocating
memory that are grouped into families.  For example, @ref{e5e,,PyMem_Malloc()},
@ref{1231,,PyMem_Realloc()}, and @ref{1647,,PyMem_Free()} are one family that allocates
raw memory, while @ref{e61,,PyObject_Malloc()}, @ref{1648,,PyObject_Realloc()}, and
@ref{e5f,,PyObject_Free()} are another family that’s supposed to be used for
creating Python objects.

Previously these different families all reduced to the platform’s
@code{malloc()} and @code{free()} functions.  This meant  it didn’t matter if
you got things wrong and allocated memory with the @code{PyMem} function but
freed it with the @code{PyObject} function.  With 2.5’s changes to obmalloc,
these families now do different things and mismatches will probably result in a
segfault.  You should carefully test your C extension modules with Python 2.5.

@item 
The built-in set types now have an official C API.  Call @ref{1649,,PySet_New()}
and @ref{164a,,PyFrozenSet_New()} to create a new set, @ref{164b,,PySet_Add()} and
@ref{164c,,PySet_Discard()} to add and remove elements, and @ref{164d,,PySet_Contains()}
and @ref{164e,,PySet_Size()} to examine the set’s state. (Contributed by Raymond
Hettinger.)

@item 
C code can now obtain information about the exact revision of the Python
interpreter by calling the  @ref{1637,,Py_GetBuildInfo()} function that returns a
string of build information like this: @code{"trunk:45355:45356M, Apr 13 2006,
07:42:19"}.   (Contributed by Barry Warsaw.)

@item 
Two new macros can be used to indicate C functions that are local to the
current file so that a faster calling convention can be used.
@ref{164f,,Py_LOCAL} declares the function as returning a value of the
specified `type' and uses a fast-calling qualifier.
@ref{1650,,Py_LOCAL_INLINE} does the same thing and also requests the
function be inlined.  If macro @code{PY_LOCAL_AGGRESSIVE} is defined before
@code{python.h} is included, a set of more aggressive optimizations are enabled
for the module; you should benchmark the results to find out if these
optimizations actually make the code faster.  (Contributed by Fredrik Lundh at
the NeedForSpeed sprint.)

@item 
@code{PyErr_NewException(name, base, dict)} can now accept a tuple of base
classes as its `base' argument.  (Contributed by Georg Brandl.)

@item 
The @code{PyErr_Warn()} function for issuing warnings is now deprecated in
favour of @code{PyErr_WarnEx(category, message, stacklevel)} which lets you
specify the number of stack frames separating this function and the caller.  A
`stacklevel' of 1 is the function calling @ref{1651,,PyErr_WarnEx()}, 2 is the
function above that, and so forth.  (Added by Neal Norwitz.)

@item 
The CPython interpreter is still written in C, but  the code can now be
compiled with a C++ compiler without errors.   (Implemented by Anthony Baxter,
Martin von Löwis, Skip Montanaro.)

@item 
The @code{PyRange_New()} function was removed.  It was never documented, never
used in the core code, and had dangerously lax error checking.  In the unlikely
case that your extensions were using it, you can replace it by something like
the following:

@example
range = PyObject_CallFunction((PyObject*) &PyRange_Type, "lll",
                              start, stop, step);
@end example
@end itemize

@c ======================================================================

@menu
* Port-Specific Changes:: 

@end menu

@node Port-Specific Changes,,,Build and C API Changes<7>
@anchor{whatsnew/2 5 port-specific-changes}@anchor{1652}@anchor{whatsnew/2 5 ports}@anchor{1653}
@subsubsection Port-Specific Changes



@itemize *

@item 
MacOS X (10.3 and higher): dynamic loading of modules now uses the
@code{dlopen()} function instead of MacOS-specific functions.

@item 
MacOS X: an @code{--enable-universalsdk} switch was added to the
@code{configure} script that compiles the interpreter as a universal binary
able to run on both PowerPC and Intel processors. (Contributed by Ronald
Oussoren; bpo-2573@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2573}.)

@item 
Windows: @code{.dll} is no longer supported as a filename extension for
extension modules.  @code{.pyd} is now the only filename extension that will be
searched for.
@end itemize

@c ======================================================================

@node Porting to Python 2 5,Acknowledgements<3>,Build and C API Changes<7>,What’s New in Python 2 5
@anchor{whatsnew/2 5 porting}@anchor{1654}@anchor{whatsnew/2 5 porting-to-python-2-5}@anchor{1655}
@subsection Porting to Python 2.5


This section lists previously described changes that may require changes to your
code:


@itemize *

@item 
ASCII is now the default encoding for modules.  It’s now  a syntax error if a
module contains string literals with 8-bit characters but doesn’t have an
encoding declaration.  In Python 2.4 this triggered a warning, not a syntax
error.

@item 
Previously, the @code{gi_frame} attribute of a generator was always a frame
object.  Because of the 
@geindex Python 향상 제안; PEP 342
PEP 342@footnote{https://peps.python.org/pep-0342/} changes described in section @ref{1609,,PEP 342; New Generator Features},
it’s now possible for @code{gi_frame} to be @code{None}.

@item 
A new warning, @ref{1629,,UnicodeWarning}, is triggered when  you attempt to
compare a Unicode string and an 8-bit string that can’t be converted to Unicode
using the default ASCII encoding.  Previously such comparisons would raise a
@ref{c07,,UnicodeDecodeError} exception.

@item 
Library: the @ref{2d,,csv} module is now stricter about multi-line quoted fields.
If your files contain newlines embedded within fields, the input should be split
into lines in a manner which preserves the newline characters.

@item 
Library: the @ref{8a,,locale} module’s  @ref{199,,format()} function’s would
previously  accept any string as long as no more than one %char specifier
appeared.  In Python 2.5, the argument must be exactly one %char specifier with
no surrounding text.

@item 
Library: The @ref{ab,,pickle} and @code{cPickle} modules no longer accept a
return value of @code{None} from the @ref{bc5,,__reduce__()} method; the method must
return a tuple of arguments instead.  The modules also no longer accept the
deprecated `bin' keyword parameter.

@item 
Library: The @ref{135,,SimpleXMLRPCServer} and @code{DocXMLRPCServer}  classes now
have a @code{rpc_paths} attribute that constrains XML-RPC operations to a
limited set of URL paths; the default is to allow only @code{'/'} and @code{'/RPC2'}.
Setting  @code{rpc_paths} to @code{None} or an empty tuple disables  this path
checking.

@item 
C API: Many functions now use @ref{c54,,Py_ssize_t}  instead of int to
allow processing more data on 64-bit machines.  Extension code may need to make
the same change to avoid warnings and to support 64-bit machines.  See the
earlier section @ref{161d,,PEP 353; Using ssize_t as the index type} for a discussion of this change.

@item 
C API:  The obmalloc changes mean that  you must be careful to not mix usage
of the @code{PyMem_*} and @code{PyObject_*} families of functions. Memory
allocated with  one family’s @code{*_Malloc} must be  freed with the
corresponding family’s @code{*_Free} function.
@end itemize

@c ======================================================================

@node Acknowledgements<3>,,Porting to Python 2 5,What’s New in Python 2 5
@anchor{whatsnew/2 5 acknowledgements}@anchor{1656}
@subsection Acknowledgements


The author would like to thank the following people for offering suggestions,
corrections and assistance with various drafts of this article: Georg Brandl,
Nick Coghlan, Phillip J. Eby, Lars Gustäbel, Raymond Hettinger, Ralf W.
Grosse-Kunstleve, Kent Johnson, Iain Lowe, Martin von Löwis, Fredrik Lundh, Andrew
McNamara, Skip Montanaro, Gustavo Niemeyer, Paul Prescod, James Pryor, Mike
Rovner, Scott Weikart, Barry Warsaw, Thomas Wouters.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node What’s New in Python 2 4,What’s New in Python 2 3,What’s New in Python 2 5,파이썬의 새로운 기능
@anchor{whatsnew/2 4 doc}@anchor{1657}@anchor{whatsnew/2 4 translation-repo}@anchor{1658}@anchor{whatsnew/2 4 what-s-new-in-python-2-4}@anchor{1659}
@section What’s New in Python 2.4


@*Author: 
A.M. Kuchling


@c $Id: whatsnew24.tex 54632 2007-03-31 11:59:54Z georg.brandl $

@c Don't write extensive text for new sections; I'll do that.

@c Feel free to add commented-out reminders of things that need

@c to be covered.  --amk

This article explains the new features in Python 2.4.1, released on March 30,
2005.

Python 2.4 is a medium-sized release.  It doesn’t introduce as many changes as
the radical Python 2.2, but introduces more features than the conservative 2.3
release.  The most significant new language features are function decorators and
generator expressions; most other changes are to the standard library.

According to the CVS change logs, there were 481 patches applied and 502 bugs
fixed between Python 2.3 and 2.4.  Both figures are likely to be underestimates.

This article doesn’t attempt to provide a complete specification of every single
new feature, but instead provides a brief introduction to each feature.  For
full details, you should refer to the documentation for Python 2.4, such as the
Python Library Reference and the Python Reference Manual.  Often you will be
referred to the PEP for a particular new feature for explanations of the
implementation and design rationale.

@c ======================================================================

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

@end menu

@node PEP 218 Built-In Set Objects,PEP 237 Unifying Long Integers and Integers,,What’s New in Python 2 4
@anchor{whatsnew/2 4 pep-218-built-in-set-objects}@anchor{165a}
@subsection PEP 218: Built-In Set Objects


Python 2.3 introduced the @code{sets} module.  C implementations of set data
types have now been added to the Python core as two new built-in types,
@code{set(iterable)} and @code{frozenset(iterable)}.  They provide high speed
operations for membership testing, for eliminating duplicates from sequences,
and for mathematical operations like unions, intersections, differences, and
symmetric differences.

@example
>>> a = set('abracadabra')              # form a set from a string
>>> 'z' in a                            # fast membership testing
False
>>> a                                   # unique letters in a
set(['a', 'r', 'b', 'c', 'd'])
>>> '@w{'}.join(a)                          # convert back into a string
'arbcd'

>>> b = set('alacazam')                 # form a second set
>>> a - b                               # letters in a but not in b
set(['r', 'd', 'b'])
>>> a | b                               # letters in either a or b
set(['a', 'c', 'r', 'd', 'b', 'm', 'z', 'l'])
>>> a & b                               # letters in both a and b
set(['a', 'c'])
>>> a ^ b                               # letters in a or b but not both
set(['r', 'd', 'b', 'm', 'z', 'l'])

>>> a.add('z')                          # add a new element
>>> a.update('wxy')                     # add multiple new elements
>>> a
set(['a', 'c', 'b', 'd', 'r', 'w', 'y', 'x', 'z'])
>>> a.remove('x')                       # take one element out
>>> a
set(['a', 'c', 'b', 'd', 'r', 'w', 'y', 'z'])
@end example

The @ref{7f1,,frozenset()} type is an immutable version of @ref{184,,set()}. Since it is
immutable and hashable, it may be used as a dictionary key or as a member of
another set.

The @code{sets} module remains in the standard library, and may be useful if you
wish to subclass the @code{Set} or @code{ImmutableSet} classes.  There are
currently no plans to deprecate the module.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 218

@item PEP 218@footnote{https://peps.python.org/pep-0218/} - Adding a Built-In Set Object Type

Originally proposed by Greg Wilson and ultimately implemented by Raymond
Hettinger.
@end table


@c ======================================================================

@node PEP 237 Unifying Long Integers and Integers,PEP 289 Generator Expressions,PEP 218 Built-In Set Objects,What’s New in Python 2 4
@anchor{whatsnew/2 4 pep-237-unifying-long-integers-and-integers}@anchor{165b}
@subsection PEP 237: Unifying Long Integers and Integers


The lengthy transition process for this PEP, begun in Python 2.2, takes another
step forward in Python 2.4.  In 2.3, certain integer operations that would
behave differently after int/long unification triggered @ref{657,,FutureWarning}
warnings and returned values limited to 32 or 64 bits (depending on your
platform).  In 2.4, these expressions no longer produce a warning and instead
produce a different result that’s usually a long integer.

The problematic expressions are primarily left shifts and lengthy hexadecimal
and octal constants.  For example, @code{2 << 32} results in a warning in 2.3,
evaluating to 0 on 32-bit platforms.  In Python 2.4, this expression now returns
the correct answer, 8589934592.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 237

@item PEP 237@footnote{https://peps.python.org/pep-0237/} - Unifying Long Integers and Integers

Original PEP written by Moshe Zadka and GvR.  The changes for 2.4 were
implemented by  Kalle Svensson.
@end table


@c ======================================================================

@node PEP 289 Generator Expressions,PEP 292 Simpler String Substitutions,PEP 237 Unifying Long Integers and Integers,What’s New in Python 2 4
@anchor{whatsnew/2 4 pep-289-generator-expressions}@anchor{165c}
@subsection PEP 289: Generator Expressions


The iterator feature introduced in Python 2.2 and the @ref{85,,itertools} module
make it easier to write programs that loop through large data sets without
having the entire data set in memory at one time.  List comprehensions don’t fit
into this picture very well because they produce a Python list object containing
all of the items.  This unavoidably pulls all of the objects into memory, which
can be a problem if your data set is very large.  When trying to write a
functionally styled program, it would be natural to write something like:

@example
links = [link for link in get_all_links() if not link.followed]
for link in links:
    ...
@end example

instead of

@example
for link in get_all_links():
    if link.followed:
        continue
    ...
@end example

The first form is more concise and perhaps more readable, but if you’re dealing
with a large number of link objects you’d have to write the second form to avoid
having all link objects in memory at the same time.

Generator expressions work similarly to list comprehensions but don’t
materialize the entire list; instead they create a generator that will return
elements one by one.  The above example could be written as:

@example
links = (link for link in get_all_links() if not link.followed)
for link in links:
    ...
@end example

Generator expressions always have to be written inside parentheses, as in the
above example.  The parentheses signalling a function call also count, so if you
want to create an iterator that will be immediately passed to a function you
could write:

@example
print sum(obj.count for obj in list_all_objects())
@end example

Generator expressions differ from list comprehensions in various small ways.
Most notably, the loop variable (`obj' in the above example) is not accessible
outside of the generator expression.  List comprehensions leave the variable
assigned to its last value; future versions of Python will change this, making
list comprehensions match generator expressions in this respect.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 289

@item PEP 289@footnote{https://peps.python.org/pep-0289/} - Generator Expressions

Proposed by Raymond Hettinger and implemented by Jiwon Seo with early efforts
steered by Hye-Shik Chang.
@end table


@c ======================================================================

@node PEP 292 Simpler String Substitutions,PEP 318 Decorators for Functions and Methods,PEP 289 Generator Expressions,What’s New in Python 2 4
@anchor{whatsnew/2 4 pep-292-simpler-string-substitutions}@anchor{165d}
@subsection PEP 292: Simpler String Substitutions


Some new classes in the standard library provide an alternative mechanism for
substituting variables into strings; this style of substitution may be better
for applications where untrained users need to edit templates.

The usual way of substituting variables by name is the @code{%} operator:

@example
>>> '%(page)i: %(title)s' % @{'page':2, 'title': 'The Best of Times'@}
'2: The Best of Times'
@end example

When writing the template string, it can be easy to forget the @code{i} or @code{s}
after the closing parenthesis.  This isn’t a big problem if the template is in a
Python module, because you run the code, get an “Unsupported format character”
@ref{2ec,,ValueError}, and fix the problem.  However, consider an application such
as Mailman where template strings or translations are being edited by users who
aren’t aware of the Python language.  The format string’s syntax is complicated
to explain to such users, and if they make a mistake, it’s difficult to provide
helpful feedback to them.

PEP 292 adds a @code{Template} class to the @ref{d8,,string} module that uses
@code{$} to indicate a substitution:

@example
>>> import string
>>> t = string.Template('$page: $title')
>>> t.substitute(@{'page':2, 'title': 'The Best of Times'@})
'2: The Best of Times'
@end example

If a key is missing from the dictionary, the @code{substitute()} method will
raise a @ref{5e5,,KeyError}.  There’s also a @code{safe_substitute()} method that
ignores missing keys:

@example
>>> t = string.Template('$page: $title')
>>> t.safe_substitute(@{'page':3@})
'3: $title'
@end example


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 292

@item PEP 292@footnote{https://peps.python.org/pep-0292/} - Simpler String Substitutions

Written and implemented  by Barry Warsaw.
@end table


@c ======================================================================

@node PEP 318 Decorators for Functions and Methods,PEP 322 Reverse Iteration,PEP 292 Simpler String Substitutions,What’s New in Python 2 4
@anchor{whatsnew/2 4 pep-318-decorators-for-functions-and-methods}@anchor{165e}
@subsection PEP 318: Decorators for Functions and Methods


Python 2.2 extended Python’s object model by adding static methods and class
methods, but it didn’t extend Python’s syntax to provide any new way of defining
static or class methods.  Instead, you had to write a @ref{165f,,def} statement
in the usual way, and pass the resulting method to a @ref{453,,staticmethod()} or
@ref{48f,,classmethod()} function that would wrap up the function as a method of the
new type. Your code would look like this:

@example
class C:
   def meth (cls):
       ...

   meth = classmethod(meth)   # Rebind name to wrapped-up class method
@end example

If the method was very long, it would be easy to miss or forget the
@ref{48f,,classmethod()} invocation after the function body.

The intention was always to add some syntax to make such definitions more
readable, but at the time of 2.2’s release a good syntax was not obvious.  Today
a good syntax `still' isn’t obvious but users are asking for easier access to
the feature; a new syntactic feature has been added to meet this need.

The new feature is called “function decorators”.  The name comes from the idea
that @ref{48f,,classmethod()}, @ref{453,,staticmethod()}, and friends are storing
additional information on a function object; they’re `decorating' functions with
more details.

The notation borrows from Java and uses the @code{'@@'} character as an indicator.
Using the new syntax, the example above would be written:

@example
class C:

   @@classmethod
   def meth (cls):
       ...
@end example

The @code{@@classmethod} is shorthand for the @code{meth=classmethod(meth)} assignment.
More generally, if you have the following:

@example
@@A
@@B
@@C
def f ():
    ...
@end example

It’s equivalent to the following pre-decorator code:

@example
def f(): ...
f = A(B(C(f)))
@end example

Decorators must come on the line before a function definition, one decorator per
line, and can’t be on the same line as the def statement, meaning that @code{@@A def
f(): ...} is illegal.  You can only decorate function definitions, either at
the module level or inside a class; you can’t decorate class definitions.

A decorator is just a function that takes the function to be decorated as an
argument and returns either the same function or some new object.  The return
value of the decorator need not be callable (though it typically is), unless
further decorators will be applied to the result.  It’s easy to write your own
decorators.  The following simple example just sets an attribute on the function
object:

@example
>>> def deco(func):
...    func.attr = 'decorated'
...    return func
...
>>> @@deco
... def f(): pass
...
>>> f
<function f at 0x402ef0d4>
>>> f.attr
'decorated'
>>>
@end example

As a slightly more realistic example, the following decorator checks that the
supplied argument is an integer:

@example
def require_int (func):
    def wrapper (arg):
        assert isinstance(arg, int)
        return func(arg)

    return wrapper

@@require_int
def p1 (arg):
    print arg

@@require_int
def p2(arg):
    print arg*2
@end example

An example in 
@geindex Python 향상 제안; PEP 318
PEP 318@footnote{https://peps.python.org/pep-0318/} contains a fancier version of this idea that lets you
both specify the required type and check the returned type.

Decorator functions can take arguments.  If arguments are supplied, your
decorator function is called with only those arguments and must return a new
decorator function; this function must take a single function and return a
function, as previously described.  In other words, @code{@@A @@B @@C(args)} becomes:

@example
def f(): ...
_deco = C(args)
f = A(B(_deco(f)))
@end example

Getting this right can be slightly brain-bending, but it’s not too difficult.

A small related change makes the @ref{14d9,,func_name}
attribute of functions
writable.  This attribute is used to display function names in tracebacks, so
decorators should change the name of any new function that’s constructed and
returned.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 318

@item PEP 318@footnote{https://peps.python.org/pep-0318/} - Decorators for Functions, Methods and Classes

Written  by Kevin D. Smith, Jim Jewett, and Skip Montanaro.  Several people
wrote patches implementing function decorators, but the one that was actually
checked in was patch #979728, written by Mark Russell.

@item @indicateurl{https://wiki.python.org/moin/PythonDecoratorLibrary}

This Wiki page contains several examples of decorators.
@end table


@c ======================================================================

@node PEP 322 Reverse Iteration,PEP 324 New subprocess Module,PEP 318 Decorators for Functions and Methods,What’s New in Python 2 4
@anchor{whatsnew/2 4 pep-322-reverse-iteration}@anchor{1660}
@subsection PEP 322: Reverse Iteration


A new built-in function, @code{reversed(seq)}, takes a sequence and returns an
iterator that loops over the elements of the sequence  in reverse order.

@example
>>> for i in reversed(xrange(1,4)):
...    print i
...
3
2
1
@end example

Compared to extended slicing, such as @code{range(1,4)[::-1]}, @ref{a65,,reversed()} is
easier to read, runs faster, and uses substantially less memory.

Note that @ref{a65,,reversed()} only accepts sequences, not arbitrary iterators.  If
you want to reverse an iterator, first convert it to  a list with @ref{24d,,list()}.

@example
>>> input = open('/etc/passwd', 'r')
>>> for line in reversed(list(input)):
...   print line
...
root:*:0:0:System Administrator:/var/root:/bin/tcsh
  ...
@end example


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 322

@item PEP 322@footnote{https://peps.python.org/pep-0322/} - Reverse Iteration

Written and implemented by Raymond Hettinger.
@end table


@c ======================================================================

@node PEP 324 New subprocess Module,PEP 327 Decimal Data Type,PEP 322 Reverse Iteration,What’s New in Python 2 4
@anchor{whatsnew/2 4 pep-324-new-subprocess-module}@anchor{1661}
@subsection PEP 324: New subprocess Module


The standard library provides a number of ways to execute a subprocess, offering
different features and different levels of complexity.
@code{os.system(command)} is easy to use, but slow (it runs a shell process
which executes the command) and dangerous (you have to be careful about escaping
the shell’s metacharacters).  The @code{popen2} module offers classes that can
capture standard output and standard error from the subprocess, but the naming
is confusing.  The @ref{dc,,subprocess} module cleans  this up, providing a unified
interface that offers all the features you might need.

Instead of @code{popen2}’s collection of classes, @ref{dc,,subprocess} contains a
single class called @ref{4b8,,subprocess.Popen}  whose constructor supports a number of
different keyword arguments.

@example
class Popen(args, bufsize=0, executable=None,
            stdin=None, stdout=None, stderr=None,
            preexec_fn=None, close_fds=False, shell=False,
            cwd=None, env=None, universal_newlines=False,
            startupinfo=None, creationflags=0):
@end example

`args' is commonly a sequence of strings that will be the arguments to the
program executed as the subprocess.  (If the `shell' argument is true, `args'
can be a string which will then be passed on to the shell for interpretation,
just as @ref{1662,,os.system()} does.)

`stdin', `stdout', and `stderr' specify what the subprocess’s input, output, and
error streams will be.  You can provide a file object or a file descriptor, or
you can use the constant @code{subprocess.PIPE} to create a pipe between the
subprocess and the parent.

@geindex universal newlines;What's new

The constructor has a number of handy options:


@itemize *

@item 
`close_fds' requests that all file descriptors be closed before running the
subprocess.

@item 
`cwd' specifies the working directory in which the subprocess will be executed
(defaulting to whatever the parent’s working directory is).

@item 
`env' is a dictionary specifying environment variables.

@item 
`preexec_fn' is a function that gets called before the child is started.

@item 
`universal_newlines' opens the child’s input and output using Python’s
@ref{f34,,universal newlines} feature.
@end itemize

Once you’ve created the @code{Popen} instance,  you can call its @code{wait()}
method to pause until the subprocess has exited, @code{poll()} to check if it’s
exited without pausing,  or @code{communicate(data)} to send the string `data'
to the subprocess’s standard input.   @code{communicate(data)}  then reads any
data that the subprocess has sent to its standard output  or standard error,
returning a tuple @code{(stdout_data, stderr_data)}.

@code{call()} is a shortcut that passes its arguments along to the @code{Popen}
constructor, waits for the command to complete, and returns the status code of
the subprocess.  It can serve as a safer analog to @ref{1662,,os.system()}:

@example
sts = subprocess.call(['dpkg', '-i', '/tmp/new-package.deb'])
if sts == 0:
    # Success
    ...
else:
    # dpkg returned an error
    ...
@end example

The command is invoked without use of the shell.  If you really do want to  use
the shell, you can add @code{shell=True} as a keyword argument and provide a string
instead of a sequence:

@example
sts = subprocess.call('dpkg -i /tmp/new-package.deb', shell=True)
@end example

The PEP takes various examples of shell and Python code and shows how they’d be
translated into Python code that uses @ref{dc,,subprocess}.  Reading this section
of the PEP is highly recommended.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 324

@item PEP 324@footnote{https://peps.python.org/pep-0324/} - subprocess - New process module

Written and implemented by Peter Åstrand, with assistance from Fredrik Lundh and
others.
@end table


@c ======================================================================

@node PEP 327 Decimal Data Type,PEP 328 Multi-line Imports,PEP 324 New subprocess Module,What’s New in Python 2 4
@anchor{whatsnew/2 4 pep-327-decimal-data-type}@anchor{1663}
@subsection PEP 327: Decimal Data Type


Python has always supported floating-point (FP) numbers, based on the underlying
C double type, as a data type.  However, while most programming
languages provide a floating-point type, many people (even programmers) are
unaware that floating-point numbers don’t represent certain decimal fractions
accurately.  The new @code{Decimal} type can represent these fractions
accurately, up to a user-specified precision limit.

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

@end menu

@node Why is Decimal needed?,The Decimal type,,PEP 327 Decimal Data Type
@anchor{whatsnew/2 4 why-is-decimal-needed}@anchor{1664}
@subsubsection Why is Decimal needed?


The limitations arise from the representation used for floating-point numbers.
FP numbers are made up of three components:


@itemize *

@item 
The sign, which is positive or negative.

@item 
The mantissa, which is a single-digit binary number   followed by a fractional
part.  For example, @code{1.01} in base-2 notation is @code{1 + 0/2 + 1/4}, or 1.25 in
decimal notation.

@item 
The exponent, which tells where the decimal point is located in the number
represented.
@end itemize

For example, the number 1.25 has positive sign, a mantissa value of 1.01 (in
binary), and an exponent of 0 (the decimal point doesn’t need to be shifted).
The number 5 has the same sign and mantissa, but the exponent is 2 because the
mantissa is multiplied by 4 (2 to the power of the exponent 2); 1.25 * 4 equals
5.

Modern systems usually provide floating-point support that conforms to a
standard called IEEE 754.  C’s double type is usually implemented as a
64-bit IEEE 754 number, which uses 52 bits of space for the mantissa.  This
means that numbers can only be specified to 52 bits of precision.  If you’re
trying to represent numbers whose expansion repeats endlessly, the expansion is
cut off after 52 bits. Unfortunately, most software needs to produce output in
base 10, and common fractions in base 10 are often repeating decimals in binary.
For example, 1.1 decimal is binary @code{1.0001100110011 ...}; .1 = 1/16 + 1/32 +
1/256 plus an infinite number of additional terms.  IEEE 754 has to chop off
that infinitely repeated decimal after 52 digits, so the representation is
slightly inaccurate.

Sometimes you can see this inaccuracy when the number is printed:

@example
>>> 1.1
1.1000000000000001
@end example

The inaccuracy isn’t always visible when you print the number because the
FP-to-decimal-string conversion is provided by the C library, and most C libraries try
to produce sensible output.  Even if it’s not displayed, however, the inaccuracy
is still there and subsequent operations can magnify the error.

For many applications this doesn’t matter.  If I’m plotting points and
displaying them on my monitor, the difference between 1.1 and 1.1000000000000001
is too small to be visible.  Reports often limit output to a certain number of
decimal places, and if you round the number to two or three or even eight
decimal places, the error is never apparent.  However, for applications where it
does matter,  it’s a lot of work to implement your own custom arithmetic
routines.

Hence, the @code{Decimal} type was created.

@node The Decimal type,The Context type,Why is Decimal needed?,PEP 327 Decimal Data Type
@anchor{whatsnew/2 4 the-decimal-type}@anchor{1665}
@subsubsection The @code{Decimal} type


A new module, @ref{3a,,decimal}, was added to Python’s standard library.  It
contains two classes, @code{Decimal} and @code{Context}.  @code{Decimal}
instances represent numbers, and @code{Context} instances are used to wrap up
various settings such as the precision and default rounding mode.

@code{Decimal} instances are immutable, like regular Python integers and FP
numbers; once it’s been created, you can’t change the value an instance
represents.  @code{Decimal} instances can be created from integers or
strings:

@example
>>> import decimal
>>> decimal.Decimal(1972)
Decimal("1972")
>>> decimal.Decimal("1.1")
Decimal("1.1")
@end example

You can also provide tuples containing the sign, the mantissa represented  as a
tuple of decimal digits, and the exponent:

@example
>>> decimal.Decimal((1, (1, 4, 7, 5), -2))
Decimal("-14.75")
@end example

Cautionary note: the sign bit is a Boolean value, so 0 is positive and 1 is
negative.

Converting from floating-point numbers poses a bit of a problem: should the FP
number representing 1.1 turn into the decimal number for exactly 1.1, or for 1.1
plus whatever inaccuracies are introduced? The decision was to dodge the issue
and leave such a conversion out of the API.  Instead, you should convert the
floating-point number into a string using the desired precision and pass the
string to the @code{Decimal} constructor:

@example
>>> f = 1.1
>>> decimal.Decimal(str(f))
Decimal("1.1")
>>> decimal.Decimal('%.12f' % f)
Decimal("1.100000000000")
@end example

Once you have @code{Decimal} instances, you can perform the usual mathematical
operations on them.  One limitation: exponentiation requires an integer
exponent:

@example
>>> a = decimal.Decimal('35.72')
>>> b = decimal.Decimal('1.73')
>>> a+b
Decimal("37.45")
>>> a-b
Decimal("33.99")
>>> a*b
Decimal("61.7956")
>>> a/b
Decimal("20.64739884393063583815028902")
>>> a ** 2
Decimal("1275.9184")
>>> a**b
Traceback (most recent call last):
  ...
decimal.InvalidOperation: x ** (non-integer)
@end example

You can combine @code{Decimal} instances with integers, but not with
floating-point numbers:

@example
>>> a + 4
Decimal("39.72")
>>> a + 4.5
Traceback (most recent call last):
  ...
TypeError: You can interact Decimal only with int, long or Decimal data types.
>>>
@end example

@code{Decimal} numbers can be used with the @ref{92,,math} and @ref{19,,cmath}
modules, but note that they’ll be immediately converted to  floating-point
numbers before the operation is performed, resulting in a possible loss of
precision and accuracy.  You’ll also get back a regular floating-point number
and not a @code{Decimal}.

@example
>>> import math, cmath
>>> d = decimal.Decimal('123456789012.345')
>>> math.sqrt(d)
351364.18288201344
>>> cmath.sqrt(-d)
351364.18288201344j
@end example

@code{Decimal} instances have a @code{sqrt()} method that returns a
@code{Decimal}, but if you need other things such as trigonometric functions
you’ll have to implement them.

@example
>>> d.sqrt()
Decimal("351364.1828820134592177245001")
@end example

@node The Context type,,The Decimal type,PEP 327 Decimal Data Type
@anchor{whatsnew/2 4 the-context-type}@anchor{1666}
@subsubsection The @code{Context} type


Instances of the @code{Context} class encapsulate several settings for
decimal operations:


@itemize *

@item 
@code{prec} is the precision, the number of decimal places.

@item 
@code{rounding} specifies the rounding mode.  The @ref{3a,,decimal} module has
constants for the various possibilities: @code{ROUND_DOWN},
@code{ROUND_CEILING},  @code{ROUND_HALF_EVEN}, and various others.

@item 
@code{traps} is a dictionary specifying what happens on encountering certain
error conditions: either  an exception is raised or  a value is returned.  Some
examples of error conditions are division by zero, loss of precision, and
overflow.
@end itemize

There’s a thread-local default context available by calling @code{getcontext()};
you can change the properties of this context to alter the default precision,
rounding, or trap handling.  The following example shows the effect of changing
the precision of the default context:

@example
>>> decimal.getcontext().prec
28
>>> decimal.Decimal(1) / decimal.Decimal(7)
Decimal("0.1428571428571428571428571429")
>>> decimal.getcontext().prec = 9
>>> decimal.Decimal(1) / decimal.Decimal(7)
Decimal("0.142857143")
@end example

The default action for error conditions is selectable; the module can either
return a special value such as infinity or not-a-number, or exceptions can be
raised:

@example
>>> decimal.Decimal(1) / decimal.Decimal(0)
Traceback (most recent call last):
  ...
decimal.DivisionByZero: x / 0
>>> decimal.getcontext().traps[decimal.DivisionByZero] = False
>>> decimal.Decimal(1) / decimal.Decimal(0)
Decimal("Infinity")
>>>
@end example

The @code{Context} instance also has various methods for formatting  numbers
such as @code{to_eng_string()} and @code{to_sci_string()}.

For more information, see the documentation for the @ref{3a,,decimal} module, which
includes a quick-start tutorial and a reference.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 327

@item PEP 327@footnote{https://peps.python.org/pep-0327/} - Decimal Data Type

Written by Facundo Batista and implemented by Facundo Batista, Eric Price,
Raymond Hettinger, Aahz, and Tim Peters.

@item http://www.lahey.com/float.htm@footnote{https://web.archive.org/web/20230604072523/http://www.lahey.com/float.htm}

The article uses Fortran code to illustrate many of the problems that
floating-point inaccuracy can cause.

@item @indicateurl{https://speleotrove.com/decimal/}

A description of a decimal-based representation.  This representation is being
proposed as a standard, and underlies the new Python decimal type.  Much of this
material was written by Mike Cowlishaw, designer of the Rexx language.
@end table


@c ======================================================================

@node PEP 328 Multi-line Imports,PEP 331 Locale-Independent Float/String Conversions,PEP 327 Decimal Data Type,What’s New in Python 2 4
@anchor{whatsnew/2 4 pep-328-multi-line-imports}@anchor{1667}
@subsection PEP 328: Multi-line Imports


One language change is a small syntactic tweak aimed at making it easier to
import many names from a module.  In a @code{from module import names} statement,
`names' is a sequence of names separated by commas.  If the sequence is  very
long, you can either write multiple imports from the same module, or you can use
backslashes to escape the line endings like this:

@example
from SimpleXMLRPCServer import SimpleXMLRPCServer,\
            SimpleXMLRPCRequestHandler,\
            CGIXMLRPCRequestHandler,\
            resolve_dotted_attribute
@end example

The syntactic change in Python 2.4 simply allows putting the names within
parentheses.  Python ignores newlines within a parenthesized expression, so the
backslashes are no longer needed:

@example
from SimpleXMLRPCServer import (SimpleXMLRPCServer,
                                SimpleXMLRPCRequestHandler,
                                CGIXMLRPCRequestHandler,
                                resolve_dotted_attribute)
@end example

The PEP also proposes that all @ref{7f7,,import} statements be absolute imports,
with a leading @code{.} character to indicate a relative import.  This part of the
PEP was not implemented for Python 2.4, but was completed for Python 2.5.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 328

@item PEP 328@footnote{https://peps.python.org/pep-0328/} - Imports: Multi-Line and Absolute/Relative

Written by Aahz.  Multi-line imports were implemented by Dima Dorfman.
@end table


@c ======================================================================

@node PEP 331 Locale-Independent Float/String Conversions,Other Language Changes<11>,PEP 328 Multi-line Imports,What’s New in Python 2 4
@anchor{whatsnew/2 4 pep-331-locale-independent-float-string-conversions}@anchor{1668}
@subsection PEP 331: Locale-Independent Float/String Conversions


The @ref{8a,,locale} modules lets Python software select various conversions and
display conventions that are localized to a particular country or language.
However, the module was careful to not change the numeric locale because various
functions in Python’s implementation required that the numeric locale remain set
to the @code{'C'} locale.  Often this was because the code was using the C
library’s @code{atof()} function.

Not setting the numeric locale caused trouble for extensions that used third-party
C libraries, however, because they wouldn’t have the correct locale set.
The motivating example was GTK+, whose user interface widgets weren’t displaying
numbers in the current locale.

The solution described in the PEP is to add three new functions to the Python
API that perform ASCII-only conversions, ignoring the locale setting:


@itemize *

@item 
@code{PyOS_ascii_strtod(str, ptr)}  and @code{PyOS_ascii_atof(str, ptr)}
both convert a string to a C double.

@item 
@code{PyOS_ascii_formatd(buffer, buf_len, format, d)} converts a
double to an ASCII string.
@end itemize

The code for these functions came from the GLib library
(https://developer-old.gnome.org/glib/2.26/@footnote{http://web.archive.org/web/20210306104320/https://developer.gnome.org/glib/2.26/}), whose developers kindly
relicensed the relevant functions and donated them to the Python Software
Foundation.  The @ref{8a,,locale} module  can now change the numeric locale,
letting extensions such as GTK+  produce the correct results.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 331

@item PEP 331@footnote{https://peps.python.org/pep-0331/} - Locale-Independent Float/String Conversions

Written by Christian R. Reis, and implemented by Gustavo Carneiro.
@end table


@c ======================================================================

@node Other Language Changes<11>,New Improved and Deprecated Modules<3>,PEP 331 Locale-Independent Float/String Conversions,What’s New in Python 2 4
@anchor{whatsnew/2 4 other-language-changes}@anchor{1669}
@subsection Other Language Changes


Here are all of the changes that Python 2.4 makes to the core Python language.


@itemize *

@item 
Decorators for functions and methods were added (
@geindex Python 향상 제안; PEP 318
PEP 318@footnote{https://peps.python.org/pep-0318/}).

@item 
Built-in @ref{184,,set()} and @ref{7f1,,frozenset()} types were  added (
@geindex Python 향상 제안; PEP 218
PEP 218@footnote{https://peps.python.org/pep-0218/}).
Other new built-ins include the @code{reversed(seq)} function (
@geindex Python 향상 제안; PEP 322
PEP 322@footnote{https://peps.python.org/pep-0322/}).

@item 
Generator expressions were added (
@geindex Python 향상 제안; PEP 289
PEP 289@footnote{https://peps.python.org/pep-0289/}).

@item 
Certain numeric expressions no longer return values restricted to 32 or 64
bits (
@geindex Python 향상 제안; PEP 237
PEP 237@footnote{https://peps.python.org/pep-0237/}).

@item 
You can now put parentheses around the list of names in a @code{from module import
names} statement (
@geindex Python 향상 제안; PEP 328
PEP 328@footnote{https://peps.python.org/pep-0328/}).

@item 
The @ref{166a,,dict.update()} method now accepts the same argument forms as the
@ref{183,,dict} constructor.  This includes any mapping, any iterable of key/value
pairs, and keyword arguments. (Contributed by Raymond Hettinger.)

@item 
The string methods @code{ljust()}, @code{rjust()}, and @code{center()} now take
an optional argument for specifying a fill character other than a space.
(Contributed by Raymond Hettinger.)

@item 
Strings also gained an @code{rsplit()} method that works like the @code{split()}
method but splits from the end of the string.   (Contributed by Sean
Reifschneider.)

@example
>>> 'www.python.org'.split('.', 1)
['www', 'python.org']
'www.python.org'.rsplit('.', 1)
['www.python', 'org']
@end example

@item 
Three keyword parameters, `cmp', `key', and `reverse', were added to the
@code{sort()} method of lists. These parameters make some common usages of
@code{sort()} simpler. All of these parameters are optional.

For the `cmp' parameter, the value should be a comparison function that takes
two parameters and returns -1, 0, or +1 depending on how the parameters compare.
This function will then be used to sort the list.  Previously this was the only
parameter that could be provided to @code{sort()}.

`key' should be a single-parameter function that takes a list element and
returns a comparison key for the element.  The list is then sorted using the
comparison keys.  The following example sorts a list case-insensitively:

@example
>>> L = ['A', 'b', 'c', 'D']
>>> L.sort()                 # Case-sensitive sort
>>> L
['A', 'D', 'b', 'c']
>>> # Using 'key' parameter to sort list
>>> L.sort(key=lambda x: x.lower())
>>> L
['A', 'b', 'c', 'D']
>>> # Old-fashioned way
>>> L.sort(cmp=lambda x,y: cmp(x.lower(), y.lower()))
>>> L
['A', 'b', 'c', 'D']
@end example

The last example, which uses the `cmp' parameter, is the old way to perform a
case-insensitive sort.  It works but is slower than using a `key' parameter.
Using `key' calls @code{lower()} method once for each element in the list while
using `cmp' will call it twice for each comparison, so using `key' saves on
invocations of the @code{lower()} method.

For simple key functions and comparison functions, it is often possible to avoid
a @ref{14a2,,lambda} expression by using an unbound method instead.  For example,
the above case-insensitive sort is best written as:

@example
>>> L.sort(key=str.lower)
>>> L
['A', 'b', 'c', 'D']
@end example

Finally, the `reverse' parameter takes a Boolean value.  If the value is true,
the list will be sorted into reverse order. Instead of @code{L.sort();
L.reverse()}, you can now write @code{L.sort(reverse=True)}.

The results of sorting are now guaranteed to be stable.  This means that two
entries with equal keys will be returned in the same order as they were input.
For example, you can sort a list of people by name, and then sort the list by
age, resulting in a list sorted by age where people with the same age are in
name-sorted order.

(All changes to @code{sort()} contributed by Raymond Hettinger.)

@item 
There is a new built-in function @code{sorted(iterable)} that works like the
in-place @ref{dc7,,list.sort()} method but can be used in expressions.  The
differences are:

@item 
the input may be any iterable;

@item 
a newly formed copy is sorted, leaving the original intact; and

@item 
the expression returns the new sorted copy

@example
>>> L = [9,7,8,3,2,4,1,6,5]
>>> [10+i for i in sorted(L)]       # usable in a list comprehension
[11, 12, 13, 14, 15, 16, 17, 18, 19]
>>> L                               # original is left unchanged
[9,7,8,3,2,4,1,6,5]
>>> sorted('Monty Python')          # any iterable may be an input
[' ', 'M', 'P', 'h', 'n', 'n', 'o', 'o', 't', 't', 'y', 'y']

>>> # List the contents of a dict sorted by key values
>>> colormap = dict(red=1, blue=2, green=3, black=4, yellow=5)
>>> for k, v in sorted(colormap.iteritems()):
...     print k, v
...
black 4
blue 2
green 3
red 1
yellow 5
@end example

(Contributed by Raymond Hettinger.)

@item 
Integer operations will no longer trigger an @code{OverflowWarning}. The
@code{OverflowWarning} warning will disappear in Python 2.5.

@item 
The interpreter gained a new switch, @ref{23c,,-m}, that takes a name, searches
for the corresponding  module on @code{sys.path}, and runs the module as a script.
For example,  you can now run the Python profiler with @code{python -m profile}.
(Contributed by Nick Coghlan.)

@item 
The @code{eval(expr, globals, locals)} and @code{execfile(filename, globals,
locals)} functions and the @code{exec} statement now accept any mapping type
for the `locals' parameter.  Previously this had to be a regular Python
dictionary.  (Contributed by Raymond Hettinger.)

@item 
The @ref{1a0,,zip()} built-in function and @code{itertools.izip()} now return an
empty list if called with no arguments. Previously they raised a
@ref{198,,TypeError} exception.  This makes them more suitable for use with variable
length argument lists:

@example
>>> def transpose(array):
...    return zip(*array)
...
>>> transpose([(1,2,3), (4,5,6)])
[(1, 4), (2, 5), (3, 6)]
>>> transpose([])
[]
@end example

(Contributed by Raymond Hettinger.)

@item 
Encountering a failure while importing a module no longer leaves a partially initialized
module object in @code{sys.modules}.  The incomplete module object left
behind would fool further imports of the same module into succeeding, leading to
confusing errors.   (Fixed by Tim Peters.)

@item 
@ref{884,,None} is now a constant; code that binds a new value to  the name
@code{None} is now a syntax error. (Contributed by Raymond Hettinger.)
@end itemize

@c ======================================================================

@menu
* Optimizations: Optimizations<11>. 

@end menu

@node Optimizations<11>,,,Other Language Changes<11>
@anchor{whatsnew/2 4 optimizations}@anchor{166b}
@subsubsection Optimizations



@itemize *

@item 
The inner loops for list and tuple slicing were optimized and now run about
one-third faster.  The inner loops for dictionaries were also optimized,
resulting in performance boosts for @code{keys()}, @code{values()}, @code{items()},
@code{iterkeys()}, @code{itervalues()}, and @code{iteritems()}. (Contributed by
Raymond Hettinger.)

@item 
The machinery for growing and shrinking lists was optimized for speed and for
space efficiency.  Appending and popping from lists now runs faster due to more
efficient code paths and less frequent use of the underlying system
@code{realloc()}.  List comprehensions also benefit.   @ref{600,,list.extend()} was
also optimized and no longer converts its argument into a temporary list before
extending the base list.  (Contributed by Raymond Hettinger.)

@item 
@ref{24d,,list()}, @ref{610,,tuple()}, @ref{19f,,map()}, @ref{a64,,filter()}, and @ref{1a0,,zip()} now
run several times faster with non-sequence arguments that supply a
@code{__len__()} method.  (Contributed by Raymond Hettinger.)

@item 
The methods @code{list.__getitem__()}, @code{dict.__getitem__()}, and
@code{dict.__contains__()} are now implemented as @code{method_descriptor}
objects rather than @code{wrapper_descriptor} objects.  This form of  access
doubles their performance and makes them more suitable for use as arguments to
functionals: @code{map(mydict.__getitem__, keylist)}. (Contributed by Raymond
Hettinger.)

@item 
Added a new opcode, @code{LIST_APPEND}, that simplifies the generated bytecode
for list comprehensions and speeds them up by about a third.  (Contributed by
Raymond Hettinger.)

@item 
The peephole bytecode optimizer has been improved to  produce shorter, faster
bytecode; remarkably, the resulting bytecode is  more readable.  (Enhanced by
Raymond Hettinger.)

@item 
String concatenations in statements of the form @code{s = s + "abc"} and @code{s +=
"abc"} are now performed more efficiently in certain circumstances.  This
optimization won’t be present in other Python implementations such as Jython, so
you shouldn’t rely on it; using the @code{join()} method of strings is still
recommended when you want to efficiently glue a large number of strings
together. (Contributed by Armin Rigo.)
@end itemize

The net result of the 2.4 optimizations is that Python 2.4 runs the pystone
benchmark around 5% faster than Python 2.3 and 35% faster than Python 2.2.
(pystone is not a particularly good benchmark, but it’s the most commonly used
measurement of Python’s performance.  Your own applications may show greater or
smaller benefits from Python 2.4.)

@c pystone is almost useless for comparing different versions of Python;
@c instead, it excels at predicting relative Python performance on different
@c machines.  So, this section would be more informative if it used other tools
@c such as pybench and parrotbench.  For a more application oriented benchmark,
@c try comparing the timings of test_decimal.py under 2.3 and 2.4.

@c ======================================================================

@node New Improved and Deprecated Modules<3>,Build and C API Changes<8>,Other Language Changes<11>,What’s New in Python 2 4
@anchor{whatsnew/2 4 new-improved-and-deprecated-modules}@anchor{166c}
@subsection New, Improved, and Deprecated Modules


As usual, Python’s standard library received a number of enhancements and bug
fixes.  Here’s a partial list of the most notable changes, sorted alphabetically
by module name. Consult the @code{Misc/NEWS} file in the source tree for a more
complete list of changes, or look through the CVS logs for all the details.


@itemize *

@item 
The @code{asyncore} module’s @code{loop()} function now has a `count' parameter
that lets you perform a limited number of passes through the polling loop.  The
default is still to loop forever.

@item 
The @ref{f,,base64} module now has more complete 
@geindex RFC; RFC 3548
RFC 3548@footnote{https://datatracker.ietf.org/doc/html/rfc3548.html} support for Base64,
Base32, and Base16 encoding and decoding, including optional case folding and
optional alternative alphabets. (Contributed by Barry Warsaw.)

@item 
The @ref{12,,bisect} module now has an underlying C implementation for improved
performance. (Contributed by Dmitry Vasiliev.)

@item 
The CJKCodecs collections of East Asian codecs, maintained by Hye-Shik Chang,
was integrated into 2.4.   The new encodings are:

@item 
Chinese (PRC): gb2312, gbk, gb18030, big5hkscs, hz

@item 
Chinese (ROC): big5, cp950

@item 

@table @asis

@item Japanese: cp932, euc-jis-2004, euc-jp, euc-jisx0213, iso-2022-jp,

iso-2022-jp-1, iso-2022-jp-2, iso-2022-jp-3, iso-2022-jp-ext, iso-2022-jp-2004,
shift-jis, shift-jisx0213, shift-jis-2004
@end table

@item 
Korean: cp949, euc-kr, johab, iso-2022-kr

@item 
Some other new encodings were added: HP Roman8,  ISO_8859-11, ISO_8859-16,
PCTP-154, and TIS-620.

@item 
The UTF-8 and UTF-16 codecs now cope better with receiving partial input.
Previously the @code{StreamReader} class would try to read more data, making
it impossible to resume decoding from the stream.  The @code{read()} method will
now return as much data as it can and future calls will resume decoding where
previous ones left off.  (Implemented by Walter Dörwald.)

@item 
There is a new @ref{1e,,collections} module for  various specialized collection
datatypes.  Currently it contains just one type, @code{deque}, a double-ended
queue that supports efficiently adding and removing elements from either
end:

@example
>>> from collections import deque
>>> d = deque('ghi')        # make a new deque with three items
>>> d.append('j')           # add a new entry to the right side
>>> d.appendleft('f')       # add a new entry to the left side
>>> d                       # show the representation of the deque
deque(['f', 'g', 'h', 'i', 'j'])
>>> d.pop()                 # return and remove the rightmost item
'j'
>>> d.popleft()             # return and remove the leftmost item
'f'
>>> list(d)                 # list the contents of the deque
['g', 'h', 'i']
>>> 'h' in d                # search the deque
True
@end example

Several modules, such as the @code{Queue} and @ref{f3,,threading} modules, now take
advantage of @ref{7f3,,collections.deque} for improved performance.  (Contributed
by Raymond Hettinger.)

@item 
The @ref{26,,ConfigParser} classes have been enhanced slightly. The @ref{166d,,read()}
method now returns a list of the files that were successfully parsed, and the
@ref{1471,,set()} method raises @ref{198,,TypeError} if passed a `value' argument that
isn’t a string.   (Contributed by John Belmonte and David Goodger.)

@item 
The @ref{2f,,curses} module now supports the ncurses extension
@code{use_default_colors()}.  On platforms where the terminal supports
transparency, this makes it possible to use a transparent background.
(Contributed by Jörg Lehmann.)

@item 
The @ref{3b,,difflib} module now includes an @code{HtmlDiff} class that creates
an HTML table showing a side by side comparison of two versions of a text.
(Contributed by Dan Gass.)

@item 
The @ref{3f,,email} package was updated to version 3.0,  which dropped various
deprecated APIs and removes support for Python versions earlier than 2.3.  The
3.0 version of the package uses a new incremental parser for MIME messages,
available in the @code{email.FeedParser} module.  The new parser doesn’t require
reading the entire message into memory, and doesn’t raise exceptions if a
message is malformed; instead it records any problems in the  @code{defect}
attribute of the message.  (Developed by Anthony Baxter, Barry Warsaw, Thomas
Wouters, and others.)

@item 
The @ref{6d,,heapq} module has been converted to C.  The resulting tenfold
improvement in speed makes the module suitable for handling high volumes of
data.  In addition, the module has two new functions @code{nlargest()} and
@code{nsmallest()} that use heaps to find the N largest or smallest values in a
dataset without the expense of a full sort.  (Contributed by Raymond Hettinger.)

@item 
The @ref{72,,httplib} module now contains constants for HTTP status codes defined
in various HTTP-related RFC documents.  Constants have names such as
@code{OK}, @code{CREATED}, @code{CONTINUE}, and
@code{MOVED_PERMANENTLY}; use pydoc to get a full list.  (Contributed by
Andrew Eland.)

@item 
The @ref{78,,imaplib} module now supports IMAP’s THREAD command (contributed by
Yves Dionne) and new @code{deleteacl()} and @code{myrights()} methods (contributed
by Arnaud Mazin).

@item 
The @ref{85,,itertools} module gained a @code{groupby(iterable[, *func*])}
function. `iterable' is something that can be iterated over to return a stream
of elements, and the optional `func' parameter is a function that takes an
element and returns a key value; if omitted, the key is simply the element
itself.  @code{groupby()} then groups the elements into subsequences which have
matching values of the key, and returns a series of 2-tuples containing the key
value and an iterator over the subsequence.

Here’s an example to make this clearer.  The `key' function simply returns
whether a number is even or odd, so the result of @code{groupby()} is to return
consecutive runs of odd or even numbers.

@example
>>> import itertools
>>> L = [2, 4, 6, 7, 8, 9, 11, 12, 14]
>>> for key_val, it in itertools.groupby(L, lambda x: x % 2):
...    print key_val, list(it)
...
0 [2, 4, 6]
1 [7]
0 [8]
1 [9, 11]
0 [12, 14]
>>>
@end example

@code{groupby()} is typically used with sorted input.  The logic for
@code{groupby()} is similar to the Unix @code{uniq} filter which makes it handy for
eliminating, counting, or identifying duplicate elements:

@example
>>> word = 'abracadabra'
>>> letters = sorted(word)   # Turn string into a sorted list of letters
>>> letters
['a', 'a', 'a', 'a', 'a', 'b', 'b', 'c', 'd', 'r', 'r']
>>> for k, g in itertools.groupby(letters):
...    print k, list(g)
...
a ['a', 'a', 'a', 'a', 'a']
b ['b', 'b']
c ['c']
d ['d']
r ['r', 'r']
>>> # List unique letters
>>> [k for k, g in groupby(letters)]
['a', 'b', 'c', 'd', 'r']
>>> # Count letter occurrences
>>> [(k, len(list(g))) for k, g in groupby(letters)]
[('a', 5), ('b', 2), ('c', 1), ('d', 1), ('r', 2)]
@end example

(Contributed by Hye-Shik Chang.)

@item 
@ref{85,,itertools} also gained a function named @code{tee(iterator, N)} that
returns `N' independent iterators that replicate `iterator'.  If `N' is omitted,
the default is 2.

@example
>>> L = [1,2,3]
>>> i1, i2 = itertools.tee(L)
>>> i1,i2
(<itertools.tee object at 0x402c2080>, <itertools.tee object at 0x402c2090>)
>>> list(i1)               # Run the first iterator to exhaustion
[1, 2, 3]
>>> list(i2)               # Run the second iterator to exhaustion
[1, 2, 3]
@end example

Note that @code{tee()} has to keep copies of the values returned  by the
iterator; in the worst case, it may need to keep all of them.   This should
therefore be used carefully if the leading iterator can run far ahead of the
trailing iterator in a long stream of inputs. If the separation is large, then
you might as well use  @ref{24d,,list()} instead.  When the iterators track closely
with one another, @code{tee()} is ideal.  Possible applications include
bookmarking, windowing, or lookahead iterators. (Contributed by Raymond
Hettinger.)

@item 
A number of functions were added to the @ref{8a,,locale}  module, such as
@code{bind_textdomain_codeset()} to specify a particular encoding and a family of
@code{l*gettext()} functions that return messages in the chosen encoding.
(Contributed by Gustavo Niemeyer.)

@item 
Some keyword arguments were added to the @ref{8b,,logging} package’s
@code{basicConfig()} function to simplify log configuration.  The default
behavior is to log messages to standard error, but various keyword arguments can
be specified to log to a particular file, change the logging format, or set the
logging level. For example:

@example
import logging
logging.basicConfig(filename='/var/log/application.log',
    level=0,  # Log all messages
    format='%(levelname):%(process):%(thread):%(message)')
@end example

Other additions to the @ref{8b,,logging} package include a @code{log(level, msg)}
convenience method, as well as a @code{TimedRotatingFileHandler} class that
rotates its log files at a timed interval.  The module already had
@code{RotatingFileHandler}, which rotated logs once the file exceeded a
certain size.  Both classes derive from a new @code{BaseRotatingHandler} class
that can be used to implement other rotating handlers.

(Changes implemented by Vinay Sajip.)

@item 
The @ref{91,,marshal} module now shares interned strings on unpacking a  data
structure.  This may shrink the size of certain pickle strings, but the primary
effect is to make @code{.pyc} files significantly smaller. (Contributed by
Martin von Löwis.)

@item 
The @code{nntplib} module’s @code{NNTP} class gained @code{description()} and
@code{descriptions()} methods to retrieve  newsgroup descriptions for a single
group or for a range of groups. (Contributed by Jürgen A. Erhard.)

@item 
Two new functions were added to the @ref{a3,,operator} module,
@code{attrgetter(attr)} and @code{itemgetter(index)}. Both functions return
callables that take a single argument and return the corresponding attribute or
item; these callables make excellent data extractors when used with @ref{19f,,map()}
or @ref{dc6,,sorted()}.  For example:

@example
>>> L = [('c', 2), ('d', 1), ('a', 4), ('b', 3)]
>>> map(operator.itemgetter(0), L)
['c', 'd', 'a', 'b']
>>> map(operator.itemgetter(1), L)
[2, 1, 4, 3]
>>> sorted(L, key=operator.itemgetter(1)) # Sort list by second tuple item
[('d', 1), ('c', 2), ('b', 3), ('a', 4)]
@end example

(Contributed by Raymond Hettinger.)

@item 
The @ref{a4,,optparse} module was updated in various ways.  The module now passes
its messages through @ref{166e,,gettext.gettext()}, making it possible to
internationalize Optik’s help and error messages.  Help messages for options can
now include the string @code{'%default'}, which will be replaced by the option’s
default value.  (Contributed by Greg Ward.)

@item 
The long-term plan is to deprecate the @code{rfc822} module in some future
Python release in favor of the @ref{3f,,email} package. To this end, the
@ref{166f,,email.Utils.formatdate} function has been changed to make it usable as a
replacement for @code{rfc822.formatdate()}.  You may want to write new e-mail
processing code with this in mind.  (Change implemented by Anthony Baxter.)

@item 
A new @code{urandom(n)} function was added to the @ref{a5,,os} module, returning
a string containing `n' bytes of random data.  This function provides access to
platform-specific sources of randomness such as @code{/dev/urandom} on Linux or
the Windows CryptoAPI.  (Contributed by Trevor Perrin.)

@item 
Another new function: @code{os.path.lexists(path)}  returns true if the file
specified by `path' exists, whether or not it’s a symbolic link.  This differs
from the existing @code{os.path.exists(path)} function, which returns false if
`path' is a symlink that points to a destination that doesn’t exist.
(Contributed by Beni Cherniavsky.)

@item 
A new @code{getsid()} function was added to the @ref{b2,,posix} module that
underlies the @ref{a5,,os} module. (Contributed by J. Raynor.)

@item 
The @ref{b1,,poplib} module now supports POP over SSL.  (Contributed by Hector
Urtubia.)

@item 
The @ref{b4,,profile} module can now profile C extension functions. (Contributed
by Nick Bastin.)

@item 
The @ref{bd,,random} module has a new method called @code{getrandbits(N)} that
returns a long integer `N' bits in length.  The existing @code{randrange()}
method now uses @code{getrandbits()} where appropriate, making generation of
arbitrarily large random numbers more efficient.  (Contributed by Raymond
Hettinger.)

@item 
The regular expression language accepted by the @ref{be,,re} module was extended
with simple conditional expressions, written as @code{(?(group)A|B)}.  `group' is
either a numeric group ID or a group name defined with @code{(?P<group>...)}
earlier in the expression.  If the specified group matched, the regular
expression pattern `A' will be tested against the string; if the group didn’t
match, the pattern `B' will be used instead. (Contributed by Gustavo Niemeyer.)

@item 
The @ref{be,,re} module is also no longer recursive, thanks to a massive amount
of work by Gustavo Niemeyer.  In a recursive regular expression engine, certain
patterns result in a large amount of C stack space being consumed, and it was
possible to overflow the stack. For example, if you matched a 30000-byte string
of @code{a} characters against the expression @code{(a|b)+}, one stack frame was
consumed per character.  Python 2.3 tried to check for stack overflow and raise
a @ref{244,,RuntimeError} exception, but certain patterns could sidestep the
checking and if you were unlucky Python could segfault. Python 2.4’s regular
expression engine can match this pattern without problems.

@item 
The @ref{cb,,signal} module now performs tighter error-checking on the parameters
to the @ref{1339,,signal.signal()} function.  For example, you can’t set a handler on
the @code{SIGKILL} signal; previous versions of Python would quietly accept
this, but 2.4 will raise a @ref{244,,RuntimeError} exception.

@item 
Two new functions were added to the @ref{d1,,socket} module. @code{socketpair()}
returns a pair of connected sockets and @code{getservbyport(port)} looks up the
service name for a given port number. (Contributed by Dave Cole and Barry
Warsaw.)

@item 
The @code{sys.exitfunc()} function has been deprecated.  Code should be using
the existing @ref{d,,atexit} module, which correctly handles calling multiple exit
functions.  Eventually @code{sys.exitfunc()} will become a purely internal
interface, accessed only by @code{atexit}.

@item 
The @ref{e4,,tarfile} module now generates GNU-format tar files by default.
(Contributed by Lars Gustäbel.)

@item 
The @ref{f3,,threading} module now has an elegantly simple way to support
thread-local data.  The module contains a @code{local} class whose attribute
values are local to different threads.

@example
import threading

data = threading.local()
data.number = 42
data.url = ('www.python.org', 80)
@end example

Other threads can assign and retrieve their own values for the @code{number}
and @code{url} attributes.  You can subclass @code{local} to initialize
attributes or to add methods. (Contributed by Jim Fulton.)

@item 
The @ref{f5,,timeit} module now automatically disables periodic garbage
collection during the timing loop.  This change makes consecutive timings more
comparable.  (Contributed by Raymond Hettinger.)

@item 
The @ref{11a,,weakref} module now supports a wider variety of objects including
Python functions, class instances, sets, frozensets, deques, arrays, files,
sockets, and regular expression pattern objects. (Contributed by Raymond
Hettinger.)

@item 
The @ref{134,,xmlrpclib} module now supports a multi-call extension for
transmitting multiple XML-RPC calls in a single HTTP operation. (Contributed by
Brian Quinlan.)

@item 
The @code{mpz}, @code{rotor}, and @code{xreadlines} modules have  been
removed.
@end itemize

@c ======================================================================

@c whole new modules get described in subsections here

@c =====================

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

@end menu

@node cookielib,doctest<5>,,New Improved and Deprecated Modules<3>
@anchor{whatsnew/2 4 cookielib}@anchor{1670}
@subsubsection cookielib


The @ref{74,,cookielib} library supports client-side handling for HTTP cookies,
mirroring the @ref{75,,Cookie} module’s server-side cookie support. Cookies are
stored in cookie jars; the library transparently stores cookies offered by the
web server in the cookie jar, and fetches the cookie from the jar when
connecting to the server. As in web browsers, policy objects control whether
cookies are accepted or not.

In order to store cookies across sessions, two implementations of cookie jars
are provided: one that stores cookies in the Netscape format so applications can
use the Mozilla or Lynx cookie files, and one that stores cookies in the same
format as the Perl libwww library.

@ref{111,,urllib2} has been changed to interact with @ref{74,,cookielib}:
@code{HTTPCookieProcessor} manages a cookie jar that is used when accessing
URLs.

This module was contributed by John J. Lee.

@c ==================

@node doctest<5>,,cookielib,New Improved and Deprecated Modules<3>
@anchor{whatsnew/2 4 doctest}@anchor{1671}
@subsubsection doctest


The @ref{3e,,doctest} module underwent considerable refactoring thanks to Edward
Loper and Tim Peters.  Testing can still be as simple as running
@ref{1672,,doctest.testmod()}, but the refactorings allow customizing the module’s
operation in various ways

The new @code{DocTestFinder} class extracts the tests from a given  object’s
docstrings:

@example
def f (x, y):
    """>>> f(2,2)
4
>>> f(3,2)
6
    """
    return x*y

finder = doctest.DocTestFinder()

# Get list of DocTest instances
tests = finder.find(f)
@end example

The new @code{DocTestRunner} class then runs individual tests and can produce
a summary of the results:

@example
runner = doctest.DocTestRunner()
for t in tests:
    tried, failed = runner.run(t)

runner.summarize(verbose=1)
@end example

The above example produces the following output:

@example
1 items passed all tests:
   2 tests in f
2 tests in 1 items.
2 passed and 0 failed.
Test passed.
@end example

@code{DocTestRunner} uses an instance of the @code{OutputChecker} class to
compare the expected output with the actual output.  This class takes a number
of different flags that customize its behaviour; ambitious users can also write
a completely new subclass of @code{OutputChecker}.

The default output checker provides a number of handy features. For example,
with the @ref{1673,,doctest.ELLIPSIS} option flag, an ellipsis (@code{...}) in the
expected output matches any substring,  making it easier to accommodate outputs
that vary in minor ways:

@example
def o (n):
    """>>> o(1)
<__main__.C instance at 0x...>
>>>
"""
@end example

Another special string, @code{<BLANKLINE>}, matches a blank line:

@example
def p (n):
    """>>> p(1)
<BLANKLINE>
>>>
"""
@end example

Another new capability is producing a diff-style display of the output by
specifying the @ref{1674,,doctest.REPORT_UDIFF} (unified diffs),
@ref{1675,,doctest.REPORT_CDIFF} (context diffs), or @ref{1676,,doctest.REPORT_NDIFF}
(delta-style) option flags.  For example:

@example
def g (n):
    """>>> g(4)
here
is
a
lengthy
>>>"""
    L = 'here is a rather lengthy list of words'.split()
    for word in L[:n]:
        print word
@end example

Running the above function’s tests with @ref{1674,,doctest.REPORT_UDIFF} specified,
you get the following output:

@example
**********************************************************************
File "t.py", line 15, in g
Failed example:
    g(4)
Differences (unified diff with -expected +actual):
    @@@@ -2,3 +2,3 @@@@
     is
     a
    -lengthy
    +rather
**********************************************************************
@end example

@c ======================================================================

@node Build and C API Changes<8>,Porting to Python 2 4,New Improved and Deprecated Modules<3>,What’s New in Python 2 4
@anchor{whatsnew/2 4 build-and-c-api-changes}@anchor{1677}
@subsection Build and C API Changes


Some of the changes to Python’s build process and to the C API are:


@itemize *

@item 
Three new convenience macros were added for common return values from
extension functions: @ref{1678,,Py_RETURN_NONE}, @ref{1679,,Py_RETURN_TRUE}, and
@ref{167a,,Py_RETURN_FALSE}. (Contributed by Brett Cannon.)

@item 
Another new macro, @ref{797,,Py_CLEAR},  decreases the reference count of
`obj' and sets `obj' to the null pointer.  (Contributed by Jim Fulton.)

@item 
A new function, @code{PyTuple_Pack(N, obj1, obj2, ..., objN)}, constructs
tuples from a variable length argument list of Python objects.  (Contributed by
Raymond Hettinger.)

@item 
A new function, @code{PyDict_Contains(d, k)}, implements fast dictionary
lookups without masking exceptions raised during the look-up process.
(Contributed by Raymond Hettinger.)

@item 
The @ref{167b,,Py_IS_NAN}(X) macro returns 1 if  its float or double argument
`X' is a NaN.   (Contributed by Tim Peters.)

@item 
C code can avoid unnecessary locking by using the new
@code{PyEval_ThreadsInitialized()} function to tell  if any thread operations
have been performed.  If this function  returns false, no lock operations are
needed. (Contributed by Nick Coghlan.)

@item 
A new function, @ref{623,,PyArg_VaParseTupleAndKeywords()}, is the same as
@ref{622,,PyArg_ParseTupleAndKeywords()} but takes a  @code{va_list} instead of a
number of arguments. (Contributed by Greg Chapman.)

@item 
A new method flag, @ref{167c,,METH_COEXIST}, allows a function defined in slots
to co-exist with a @ref{167d,,PyCFunction} having the same name.  This can halve
the access time for a method such as @code{set.__contains__()}.  (Contributed by
Raymond Hettinger.)

@item 
Python can now be built with additional profiling for the interpreter itself,
intended as an aid to people developing the Python core.  Providing
@code{--enable-profiling} to the @code{configure} script will let you
profile the interpreter with @code{gprof}, and providing the
@code{--with-tsc} switch enables profiling using the Pentium’s
Time-Stamp-Counter register.  Note that the @code{--with-tsc} switch is slightly
misnamed, because the profiling feature also works on the PowerPC platform,
though that processor architecture doesn’t call that register “the TSC
register”.  (Contributed by Jeremy Hylton.)

@item 
The @code{tracebackobject} type has been renamed to
@code{PyTracebackObject}.
@end itemize

@c ======================================================================

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

@end menu

@node Port-Specific Changes<2>,,,Build and C API Changes<8>
@anchor{whatsnew/2 4 port-specific-changes}@anchor{167e}
@subsubsection Port-Specific Changes



@itemize *

@item 
The Windows port now builds under MSVC++ 7.1 as well as version 6.
(Contributed by Martin von Löwis.)
@end itemize

@c ======================================================================

@node Porting to Python 2 4,Acknowledgements<4>,Build and C API Changes<8>,What’s New in Python 2 4
@anchor{whatsnew/2 4 porting-to-python-2-4}@anchor{167f}
@subsection Porting to Python 2.4


This section lists previously described changes that may require changes to your
code:


@itemize *

@item 
Left shifts and hexadecimal/octal constants that are too  large no longer
trigger a @ref{657,,FutureWarning} and return  a value limited to 32 or 64 bits;
instead they return a long integer.

@item 
Integer operations will no longer trigger an @code{OverflowWarning}. The
@code{OverflowWarning} warning will disappear in Python 2.5.

@item 
The @ref{1a0,,zip()} built-in function and @code{itertools.izip()} now return  an
empty list instead of raising a @ref{198,,TypeError} exception if called with no
arguments.

@item 
You can no longer compare the @code{date} and @ref{4e2,,datetime} instances
provided by the @ref{34,,datetime} module.  Two  instances of different classes
will now always be unequal, and  relative comparisons (@code{<}, @code{>}) will raise
a @ref{198,,TypeError}.

@item 
@code{dircache.listdir()} now passes exceptions to the caller instead of
returning empty lists.

@item 
@code{LexicalHandler.startDTD()} used to receive the public and system IDs in
the wrong order.  This has been corrected; applications relying on the wrong
order need to be fixed.

@item 
@ref{1680,,fcntl.ioctl()} now warns if the `mutate'  argument is omitted and
relevant.

@item 
The @ref{e4,,tarfile} module now generates GNU-format tar files by default.

@item 
Encountering a failure while importing a module no longer leaves a
partially initialized module object in @code{sys.modules}.

@item 
@ref{884,,None} is now a constant; code that binds a new value to  the name
@code{None} is now a syntax error.

@item 
The @code{signals.signal()} function now raises a @ref{244,,RuntimeError} exception
for certain illegal values; previously these errors would pass silently.  For
example, you can no longer set a handler on the @code{SIGKILL} signal.
@end itemize

@c ======================================================================

@node Acknowledgements<4>,,Porting to Python 2 4,What’s New in Python 2 4
@anchor{whatsnew/2 4 acknowledgements}@anchor{1681}@anchor{whatsnew/2 4 acks}@anchor{1682}
@subsection Acknowledgements


The author would like to thank the following people for offering suggestions,
corrections and assistance with various drafts of this article: Koray Can,
Hye-Shik Chang, Michael Dyck, Raymond Hettinger, Brian Hurt, Hamish Lawson,
Fredrik Lundh, Sean Reifschneider, Sadruddin Rejeb.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node What’s New in Python 2 3,What’s New in Python 2 2,What’s New in Python 2 4,파이썬의 새로운 기능
@anchor{whatsnew/2 3 doc}@anchor{1683}@anchor{whatsnew/2 3 translation-repo}@anchor{1684}@anchor{whatsnew/2 3 what-s-new-in-python-2-3}@anchor{1685}
@section What’s New in Python 2.3


@*Author: 
A.M. Kuchling


@c $Id: whatsnew23.tex 54631 2007-03-31 11:58:36Z georg.brandl $

This article explains the new features in Python 2.3.  Python 2.3 was released
on July 29, 2003.

The main themes for Python 2.3 are polishing some of the features added in 2.2,
adding various small but useful enhancements to the core language, and expanding
the standard library.  The new object model introduced in the previous version
has benefited from 18 months of bugfixes and from optimization efforts that have
improved the performance of new-style classes.  A few new built-in functions
have been added such as @ref{694,,sum()} and @ref{1686,,enumerate()}.  The @ref{34b,,in}
operator can now be used for substring searches (e.g. @code{"ab" in "abc"} returns
@ref{e06,,True}).

Some of the many new library features include Boolean, set, heap, and date/time
data types, the ability to import modules from ZIP-format archives, metadata
support for the long-awaited Python catalog, an updated version of IDLE, and
modules for logging messages, wrapping text, parsing CSV files, processing
command-line options, using BerkeleyDB databases…  the list of new and
enhanced modules is lengthy.

This article doesn’t attempt to provide a complete specification of the new
features, but instead provides a convenient overview.  For full details, you
should refer to the documentation for Python 2.3, such as the Python Library
Reference and the Python Reference Manual.  If you want to understand the
complete implementation and design rationale, refer to the PEP for a particular
new feature.

@c ======================================================================

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

@end menu

@node PEP 218 A Standard Set Datatype,PEP 255 Simple Generators,,What’s New in Python 2 3
@anchor{whatsnew/2 3 pep-218-a-standard-set-datatype}@anchor{1687}
@subsection PEP 218: A Standard Set Datatype


The new @code{sets} module contains an implementation of a set datatype.  The
@code{Set} class is for mutable sets, sets that can have members added and
removed.  The @code{ImmutableSet} class is for sets that can’t be modified,
and instances of @code{ImmutableSet} can therefore be used as dictionary keys.
Sets are built on top of dictionaries, so the elements within a set must be
hashable.

Here’s a simple example:

@example
>>> import sets
>>> S = sets.Set([1,2,3])
>>> S
Set([1, 2, 3])
>>> 1 in S
True
>>> 0 in S
False
>>> S.add(5)
>>> S.remove(3)
>>> S
Set([1, 2, 5])
>>>
@end example

The union and intersection of sets can be computed with the @ref{1688,,union()} and
@ref{1689,,intersection()} methods; an alternative notation uses the bitwise operators
@code{&} and @code{|}. Mutable sets also have in-place versions of these methods,
@code{union_update()} and @ref{168a,,intersection_update()}.

@example
>>> S1 = sets.Set([1,2,3])
>>> S2 = sets.Set([4,5,6])
>>> S1.union(S2)
Set([1, 2, 3, 4, 5, 6])
>>> S1 | S2                  # Alternative notation
Set([1, 2, 3, 4, 5, 6])
>>> S1.intersection(S2)
Set([])
>>> S1 & S2                  # Alternative notation
Set([])
>>> S1.union_update(S2)
>>> S1
Set([1, 2, 3, 4, 5, 6])
>>>
@end example

It’s also possible to take the symmetric difference of two sets.  This is the
set of all elements in the union that aren’t in the intersection.  Another way
of putting it is that the symmetric difference contains all elements that are in
exactly one set.  Again, there’s an alternative notation (@code{^}), and an
in-place version with the ungainly name @ref{168b,,symmetric_difference_update()}.

@example
>>> S1 = sets.Set([1,2,3,4])
>>> S2 = sets.Set([3,4,5,6])
>>> S1.symmetric_difference(S2)
Set([1, 2, 5, 6])
>>> S1 ^ S2
Set([1, 2, 5, 6])
>>>
@end example

There are also @code{issubset()} and @code{issuperset()} methods for checking
whether one set is a subset or superset of another:

@example
>>> S1 = sets.Set([1,2,3])
>>> S2 = sets.Set([2,3])
>>> S2.issubset(S1)
True
>>> S1.issubset(S2)
False
>>> S1.issuperset(S2)
True
>>>
@end example


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 218

@item PEP 218@footnote{https://peps.python.org/pep-0218/} - Adding a Built-In Set Object Type

PEP written by Greg V. Wilson. Implemented by Greg V. Wilson, Alex Martelli, and
GvR.
@end table


@c ======================================================================

@node PEP 255 Simple Generators,PEP 263 Source Code Encodings,PEP 218 A Standard Set Datatype,What’s New in Python 2 3
@anchor{whatsnew/2 3 pep-255-simple-generators}@anchor{168c}@anchor{whatsnew/2 3 section-generators}@anchor{168d}
@subsection PEP 255: Simple Generators


In Python 2.2, generators were added as an optional feature, to be enabled by a
@code{from __future__ import generators} directive.  In 2.3 generators no longer
need to be specially enabled, and are now always present; this means that
@ref{bc1,,yield} is now always a keyword.  The rest of this section is a copy of
the description of generators from the “What’s New in Python 2.2” document; if
you read it back when Python 2.2 came out, you can skip the rest of this
section.

You’re doubtless familiar with how function calls work in Python or C. When you
call a function, it gets a private namespace where its local variables are
created.  When the function reaches a @ref{1af,,return} statement, the local
variables are destroyed and the resulting value is returned to the caller.  A
later call to the same function will get a fresh new set of local variables.
But, what if the local variables weren’t thrown away on exiting a function?
What if you could later resume the function where it left off?  This is what
generators provide; they can be thought of as resumable functions.

Here’s the simplest example of a generator function:

@example
def generate_ints(N):
    for i in range(N):
        yield i
@end example

A new keyword, @ref{bc1,,yield}, was introduced for generators.  Any function
containing a @code{yield} statement is a generator function; this is
detected by Python’s bytecode compiler which compiles the function specially as
a result.

When you call a generator function, it doesn’t return a single value; instead it
returns a generator object that supports the iterator protocol.  On executing
the @ref{bc1,,yield} statement, the generator outputs the value of @code{i},
similar to a @ref{1af,,return} statement.  The big difference between
@code{yield} and a @code{return} statement is that on reaching a
@code{yield} the generator’s state of execution is suspended and local
variables are preserved.  On the next call to the generator’s @code{.next()}
method, the function will resume executing immediately after the
@code{yield} statement.  (For complicated reasons, the @code{yield}
statement isn’t allowed inside the @ref{8f7,,try} block of a
@code{try}…@code{finally} statement; read 
@geindex Python 향상 제안; PEP 255
PEP 255@footnote{https://peps.python.org/pep-0255/} for a full
explanation of the interaction between @code{yield} and exceptions.)

Here’s a sample usage of the @code{generate_ints()} generator:

@example
>>> gen = generate_ints(3)
>>> gen
<generator object at 0x8117f90>
>>> gen.next()
0
>>> gen.next()
1
>>> gen.next()
2
>>> gen.next()
Traceback (most recent call last):
  File "stdin", line 1, in ?
  File "stdin", line 2, in generate_ints
StopIteration
@end example

You could equally write @code{for i in generate_ints(5)}, or @code{a,b,c =
generate_ints(3)}.

Inside a generator function, the @ref{1af,,return} statement can only be used
without a value, and signals the end of the procession of values; afterwards the
generator cannot return any further values. @code{return} with a value, such
as @code{return 5}, is a syntax error inside a generator function.  The end of the
generator’s results can also be indicated by raising @ref{df4,,StopIteration}
manually, or by just letting the flow of execution fall off the bottom of the
function.

You could achieve the effect of generators manually by writing your own class
and storing all the local variables of the generator as instance variables.  For
example, returning a list of integers could be done by setting @code{self.count} to
0, and having the @ref{9d8,,next()} method increment @code{self.count} and return it.
However, for a moderately complicated generator, writing a corresponding class
would be much messier. @code{Lib/test/test_generators.py} contains a number of
more interesting examples.  The simplest one implements an in-order traversal of
a tree using generators recursively.

@example
# A recursive generator that generates Tree leaves in in-order.
def inorder(t):
    if t:
        for x in inorder(t.left):
            yield x
        yield t.label
        for x in inorder(t.right):
            yield x
@end example

Two other examples in @code{Lib/test/test_generators.py} produce solutions for
the N-Queens problem (placing $N$ queens on an $NxN$ chess board so that no
queen threatens another) and the Knight’s Tour (a route that takes a knight to
every square of an $NxN$ chessboard without visiting any square twice).

The idea of generators comes from other programming languages, especially Icon
(@indicateurl{https://www2.cs.arizona.edu/icon/}), where the idea of generators is central.  In
Icon, every expression and function call behaves like a generator.  One example
from “An Overview of the Icon Programming Language” at
@indicateurl{https://www2.cs.arizona.edu/icon/docs/ipd266.htm} gives an idea of what this looks
like:

@example
sentence := "Store it in the neighboring harbor"
if (i := find("or", sentence)) > 5 then write(i)
@end example

In Icon the @code{find()} function returns the indexes at which the substring
“or” is found: 3, 23, 33.  In the @ref{181,,if} statement, @code{i} is first
assigned a value of 3, but 3 is less than 5, so the comparison fails, and Icon
retries it with the second value of 23.  23 is greater than 5, so the comparison
now succeeds, and the code prints the value 23 to the screen.

Python doesn’t go nearly as far as Icon in adopting generators as a central
concept.  Generators are considered part of the core Python language, but
learning or using them isn’t compulsory; if they don’t solve any problems that
you have, feel free to ignore them. One novel feature of Python’s interface as
compared to Icon’s is that a generator’s state is represented as a concrete
object (the iterator) that can be passed around to other functions or stored in
a data structure.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 255

@item PEP 255@footnote{https://peps.python.org/pep-0255/} - Simple Generators

Written by Neil Schemenauer, Tim Peters, Magnus Lie Hetland.  Implemented mostly
by Neil Schemenauer and Tim Peters, with other fixes from the Python Labs crew.
@end table


@c ======================================================================

@node PEP 263 Source Code Encodings,PEP 273 Importing Modules from ZIP Archives,PEP 255 Simple Generators,What’s New in Python 2 3
@anchor{whatsnew/2 3 pep-263-source-code-encodings}@anchor{168e}@anchor{whatsnew/2 3 section-encodings}@anchor{168f}
@subsection PEP 263: Source Code Encodings


Python source files can now be declared as being in different character set
encodings.  Encodings are declared by including a specially formatted comment in
the first or second line of the source file.  For example, a UTF-8 file can be
declared with:

@example
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
@end example

Without such an encoding declaration, the default encoding used is 7-bit ASCII.
Executing or importing modules that contain string literals with 8-bit
characters and have no encoding declaration will result in a
@ref{1a3,,DeprecationWarning} being signalled by Python 2.3; in 2.4 this will be a
syntax error.

The encoding declaration only affects Unicode string literals, which will be
converted to Unicode using the specified encoding.  Note that Python identifiers
are still restricted to ASCII characters, so you can’t have variable names that
use characters outside of the usual alphanumerics.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 263

@item PEP 263@footnote{https://peps.python.org/pep-0263/} - Defining Python Source Code Encodings

Written by Marc-André Lemburg and Martin von Löwis; implemented by Suzuki Hisao
and Martin von Löwis.
@end table


@c ======================================================================

@node PEP 273 Importing Modules from ZIP Archives,PEP 277 Unicode file name support for Windows NT,PEP 263 Source Code Encodings,What’s New in Python 2 3
@anchor{whatsnew/2 3 pep-273-importing-modules-from-zip-archives}@anchor{1690}
@subsection PEP 273: Importing Modules from ZIP Archives


The new @ref{138,,zipimport} module adds support for importing modules from a
ZIP-format archive.  You don’t need to import the module explicitly; it will be
automatically imported if a ZIP archive’s filename is added to @code{sys.path}.
For example:

@example
amk@@nyman:~/src/python$ unzip -l /tmp/example.zip
Archive:  /tmp/example.zip
  Length     Date   Time    Name
 --------    ----   ----    ----
     8467  11-26-02 22:30   jwzthreading.py
 --------                   -------
     8467                   1 file
amk@@nyman:~/src/python$ ./python
Python 2.3 (#1, Aug 1 2003, 19:54:32)
>>> import sys
>>> sys.path.insert(0, '/tmp/example.zip')  # Add .zip file to front of path
>>> import jwzthreading
>>> jwzthreading.__file__
'/tmp/example.zip/jwzthreading.py'
>>>
@end example

An entry in @code{sys.path} can now be the filename of a ZIP archive. The ZIP
archive can contain any kind of files, but only files named @code{*.py},
@code{*.pyc}, or @code{*.pyo} can be imported.  If an archive only contains
@code{*.py} files, Python will not attempt to modify the archive by adding the
corresponding @code{*.pyc} file, meaning that if a ZIP archive doesn’t contain
@code{*.pyc} files, importing may be rather slow.

A path within the archive can also be specified to only import from a
subdirectory; for example, the path @code{/tmp/example.zip/lib/} would only
import from the @code{lib/} subdirectory within the archive.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 273

@item PEP 273@footnote{https://peps.python.org/pep-0273/} - Import Modules from Zip Archives

Written by James C. Ahlstrom,  who also provided an implementation. Python 2.3
follows the specification in 
@geindex Python 향상 제안; PEP 273
PEP 273@footnote{https://peps.python.org/pep-0273/},  but uses an implementation written by
Just van Rossum  that uses the import hooks described in 
@geindex Python 향상 제안; PEP 302
PEP 302@footnote{https://peps.python.org/pep-0302/}. See section
@ref{1691,,PEP 302; New Import Hooks} for a description of the new import hooks.
@end table


@c ======================================================================

@node PEP 277 Unicode file name support for Windows NT,PEP 278 Universal Newline Support,PEP 273 Importing Modules from ZIP Archives,What’s New in Python 2 3
@anchor{whatsnew/2 3 pep-277-unicode-file-name-support-for-windows-nt}@anchor{1692}
@subsection PEP 277: Unicode file name support for Windows NT


On Windows NT, 2000, and XP, the system stores file names as Unicode strings.
Traditionally, Python has represented file names as byte strings, which is
inadequate because it renders some file names inaccessible.

Python now allows using arbitrary Unicode strings (within the limitations of the
file system) for all functions that expect file names, most notably the
@ref{316,,open()} built-in function. If a Unicode string is passed to
@ref{12ff,,os.listdir()}, Python now returns a list of Unicode strings.  A new
function, @code{os.getcwdu()}, returns the current directory as a Unicode string.

Byte strings still work as file names, and on Windows Python will transparently
convert them to Unicode using the @code{mbcs} encoding.

Other systems also allow Unicode strings as file names but convert them to byte
strings before passing them to the system, which can cause a @ref{462,,UnicodeError}
to be raised. Applications can test whether arbitrary Unicode strings are
supported as file names by checking @ref{1693,,os.path.supports_unicode_filenames},
a Boolean value.

Under MacOS, @ref{12ff,,os.listdir()} may now return Unicode filenames.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 277

@item PEP 277@footnote{https://peps.python.org/pep-0277/} - Unicode file name support for Windows NT

Written by Neil Hodgson; implemented by Neil Hodgson, Martin von Löwis, and Mark
Hammond.
@end table


@c ======================================================================

@geindex universal newlines;What's new

@node PEP 278 Universal Newline Support,PEP 279 enumerate,PEP 277 Unicode file name support for Windows NT,What’s New in Python 2 3
@anchor{whatsnew/2 3 pep-278-universal-newline-support}@anchor{1694}
@subsection PEP 278: Universal Newline Support


The three major operating systems used today are Microsoft Windows, Apple’s
Macintosh OS, and the various Unix derivatives.  A minor irritation of
cross-platform work  is that these three platforms all use different characters to
mark the ends of lines in text files.  Unix uses the linefeed (ASCII character
10), MacOS uses the carriage return (ASCII character 13), and Windows uses a
two-character sequence of a carriage return plus a newline.

Python’s file objects can now support end of line conventions other than the
one followed by the platform on which Python is running. Opening a file with
the mode @code{'U'} or @code{'rU'} will open a file for reading in @ref{f34,,universal newlines} mode.  All three line ending conventions will be translated to a
@code{'\n'} in the strings returned by the various file methods such as
@code{read()} and @code{readline()}.

Universal newline support is also used when importing modules and when executing
a file with the @code{execfile()} function.  This means that Python modules can
be shared between all three operating systems without needing to convert the
line-endings.

This feature can be disabled when compiling Python by specifying the
@code{--without-universal-newlines} switch when running Python’s
@code{configure} script.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 278

@item PEP 278@footnote{https://peps.python.org/pep-0278/} - Universal Newline Support

Written and implemented by Jack Jansen.
@end table


@c ======================================================================

@node PEP 279 enumerate,PEP 282 The logging Package,PEP 278 Universal Newline Support,What’s New in Python 2 3
@anchor{whatsnew/2 3 pep-279-enumerate}@anchor{1695}@anchor{whatsnew/2 3 section-enumerate}@anchor{1696}
@subsection PEP 279: enumerate()


A new built-in function, @ref{1686,,enumerate()}, will make certain loops a bit
clearer.  @code{enumerate(thing)}, where `thing' is either an iterator or a
sequence, returns an iterator that will return @code{(0, thing[0])}, @code{(1,
thing[1])}, @code{(2, thing[2])}, and so forth.

A common idiom to change every element of a list looks like this:

@example
for i in range(len(L)):
    item = L[i]
    # ... compute some result based on item ...
    L[i] = result
@end example

This can be rewritten using @ref{1686,,enumerate()} as:

@example
for i, item in enumerate(L):
    # ... compute some result based on item ...
    L[i] = result
@end example


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 279

@item PEP 279@footnote{https://peps.python.org/pep-0279/} - The enumerate() built-in function

Written and implemented by Raymond D. Hettinger.
@end table


@c ======================================================================

@node PEP 282 The logging Package,PEP 285 A Boolean Type,PEP 279 enumerate,What’s New in Python 2 3
@anchor{whatsnew/2 3 pep-282-the-logging-package}@anchor{1697}
@subsection PEP 282: The logging Package


A standard package for writing logs, @ref{8b,,logging}, has been added to Python
2.3.  It provides a powerful and flexible mechanism for generating logging
output which can then be filtered and processed in various ways.  A
configuration file written in a standard format can be used to control the
logging behavior of a program.  Python includes handlers that will write log
records to standard error or to a file or socket, send them to the system log,
or even e-mail them to a particular address; of course, it’s also possible to
write your own handler classes.

The @ref{d45,,Logger} class is the primary class. Most application code will deal
with one or more @code{Logger} objects, each one used by a particular
subsystem of the application. Each @code{Logger} is identified by a name, and
names are organized into a hierarchy using @code{.}  as the component separator.
For example, you might have @code{Logger} instances named @code{server},
@code{server.auth} and @code{server.network}.  The latter two instances are below
@code{server} in the hierarchy.  This means that if you turn up the verbosity for
@code{server} or direct @code{server} messages to a different handler, the changes
will also apply to records logged to @code{server.auth} and @code{server.network}.
There’s also a root @code{Logger} that’s the parent of all other loggers.

For simple uses, the @ref{8b,,logging} package contains some convenience functions
that always use the root log:

@example
import logging

logging.debug('Debugging information')
logging.info('Informational message')
logging.warning('Warning:config file %s not found', 'server.conf')
logging.error('Error occurred')
logging.critical('Critical error -- shutting down')
@end example

This produces the following output:

@example
WARNING:root:Warning:config file server.conf not found
ERROR:root:Error occurred
CRITICAL:root:Critical error -- shutting down
@end example

In the default configuration, informational and debugging messages are
suppressed and the output is sent to standard error.  You can enable the display
of informational and debugging messages by calling the @ref{1698,,setLevel()} method
on the root logger.

Notice the @ref{354,,warning()} call’s use of string formatting operators; all of the
functions for logging messages take the arguments @code{(msg, arg1, arg2, ...)} and
log the string resulting from @code{msg % (arg1, arg2, ...)}.

There’s also an @ref{1699,,exception()} function that records the most recent
traceback.  Any of the other functions will also record the traceback if you
specify a true value for the keyword argument `exc_info'.

@example
def f():
    try:    1/0
    except: logging.exception('Problem recorded')

f()
@end example

This produces the following output:

@example
ERROR:root:Problem recorded
Traceback (most recent call last):
  File "t.py", line 6, in f
    1/0
ZeroDivisionError: integer division or modulo by zero
@end example

Slightly more advanced programs will use a logger other than the root logger.
The @code{getLogger(name)} function is used to get a particular log, creating
it if it doesn’t exist yet. @code{getLogger(None)} returns the root logger.

@example
log = logging.getLogger('server')
 ...
log.info('Listening on port %i', port)
 ...
log.critical('Disk full')
 ...
@end example

Log records are usually propagated up the hierarchy, so a message logged to
@code{server.auth} is also seen by @code{server} and @code{root}, but a @ref{d45,,Logger}
can prevent this by setting its @ref{169a,,propagate} attribute to @ref{d2a,,False}.

There are more classes provided by the @ref{8b,,logging} package that can be
customized.  When a @ref{d45,,Logger} instance is told to log a message, it
creates a @ref{11e5,,LogRecord} instance that is sent to any number of different
@ref{169b,,Handler} instances.  Loggers and handlers can also have an attached list
of filters, and each filter can cause the @code{LogRecord} to be ignored or
can modify the record before passing it along.  When they’re finally output,
@code{LogRecord} instances are converted to text by a @ref{169c,,Formatter}
class.  All of these classes can be replaced by your own specially written
classes.

With all of these features the @ref{8b,,logging} package should provide enough
flexibility for even the most complicated applications.  This is only an
incomplete overview of its features, so please see the package’s reference
documentation for all of the details.  Reading 
@geindex Python 향상 제안; PEP 282
PEP 282@footnote{https://peps.python.org/pep-0282/} will also be helpful.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 282

@item PEP 282@footnote{https://peps.python.org/pep-0282/} - A Logging System

Written by Vinay Sajip and Trent Mick; implemented by Vinay Sajip.
@end table


@c ======================================================================

@node PEP 285 A Boolean Type,PEP 293 Codec Error Handling Callbacks,PEP 282 The logging Package,What’s New in Python 2 3
@anchor{whatsnew/2 3 pep-285-a-boolean-type}@anchor{169d}@anchor{whatsnew/2 3 section-bool}@anchor{169e}
@subsection PEP 285: A Boolean Type


A Boolean type was added to Python 2.3.  Two new constants were added to the
@code{__builtin__} module, @ref{e06,,True} and @ref{d2a,,False}.  (@code{True} and
@code{False} constants were added to the built-ins in Python 2.2.1, but the
2.2.1 versions are simply set to integer values of 1 and 0 and aren’t a
different type.)

The type object for this new type is named @ref{3c3,,bool}; the constructor for it
takes any Python value and converts it to @ref{e06,,True} or @ref{d2a,,False}.

@example
>>> bool(1)
True
>>> bool(0)
False
>>> bool([])
False
>>> bool( (1,) )
True
@end example

Most of the standard library modules and built-in functions have been changed to
return Booleans.

@example
>>> obj = []
>>> hasattr(obj, 'append')
True
>>> isinstance(obj, list)
True
>>> isinstance(obj, tuple)
False
@end example

Python’s Booleans were added with the primary goal of making code clearer.  For
example, if you’re reading a function and encounter the statement @code{return 1},
you might wonder whether the @code{1} represents a Boolean truth value, an index,
or a coefficient that multiplies some other quantity.  If the statement is
@code{return True}, however, the meaning of the return value is quite clear.

Python’s Booleans were `not' added for the sake of strict type-checking.  A very
strict language such as Pascal would also prevent you performing arithmetic with
Booleans, and would require that the expression in an @ref{181,,if} statement
always evaluate to a Boolean result.  Python is not this strict and never will
be, as 
@geindex Python 향상 제안; PEP 285
PEP 285@footnote{https://peps.python.org/pep-0285/} explicitly says.  This means you can still use any expression
in an @code{if} statement, even ones that evaluate to a list or tuple or
some random object.  The Boolean type is a subclass of the @ref{19b,,int} class so
that arithmetic using a Boolean still works.

@example
>>> True + 1
2
>>> False + 1
1
>>> False * 75
0
>>> True * 75
75
@end example

To sum up @ref{e06,,True} and @ref{d2a,,False} in a sentence: they’re alternative
ways to spell the integer values 1 and 0, with the single difference that
@ref{169,,str()} and @ref{1c1,,repr()} return the strings @code{'True'} and @code{'False'}
instead of @code{'1'} and @code{'0'}.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 285

@item PEP 285@footnote{https://peps.python.org/pep-0285/} - Adding a bool type

Written and implemented by GvR.
@end table


@c ======================================================================

@node PEP 293 Codec Error Handling Callbacks,PEP 301 Package Index and Metadata for Distutils,PEP 285 A Boolean Type,What’s New in Python 2 3
@anchor{whatsnew/2 3 pep-293-codec-error-handling-callbacks}@anchor{169f}
@subsection PEP 293: Codec Error Handling Callbacks


When encoding a Unicode string into a byte string, unencodable characters may be
encountered.  So far, Python has allowed specifying the error processing as
either “strict” (raising @ref{462,,UnicodeError}), “ignore” (skipping the
character), or “replace” (using a question mark in the output string), with
“strict” being the default behavior. It may be desirable to specify alternative
processing of such errors, such as inserting an XML character reference or HTML
entity reference into the converted string.

Python now has a flexible framework to add different processing strategies.  New
error handlers can be added with @ref{16a0,,codecs.register_error()}, and codecs then
can access the error handler with @ref{16a1,,codecs.lookup_error()}. An equivalent C
API has been added for codecs written in C. The error handler gets the necessary
state information such as the string being converted, the position in the string
where the error was detected, and the target encoding.  The handler can then
either raise an exception or return a replacement string.

Two additional error handlers have been implemented using this framework:
“backslashreplace” uses Python backslash quoting to represent unencodable
characters and “xmlcharrefreplace” emits XML character references.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 293

@item PEP 293@footnote{https://peps.python.org/pep-0293/} - Codec Error Handling Callbacks

Written and implemented by Walter Dörwald.
@end table


@c ======================================================================

@node PEP 301 Package Index and Metadata for Distutils,PEP 302 New Import Hooks,PEP 293 Codec Error Handling Callbacks,What’s New in Python 2 3
@anchor{whatsnew/2 3 pep-301-package-index-and-metadata-for-distutils}@anchor{16a2}@anchor{whatsnew/2 3 section-pep301}@anchor{16a3}
@subsection PEP 301: Package Index and Metadata for Distutils


Support for the long-requested Python catalog makes its first appearance in 2.3.

The heart of the catalog is the new Distutils @code{register} command.
Running @code{python setup.py register} will collect the metadata describing a
package, such as its name, version, maintainer, description, &c., and send it to
a central catalog server.  The resulting catalog is available from
@indicateurl{https://pypi.org}.

To make the catalog a bit more useful, a new optional `classifiers' keyword
argument has been added to the Distutils @code{setup()} function.  A list of
Trove@footnote{http://catb.org/~esr/trove/}-style strings can be supplied to help
classify the software.

Here’s an example @code{setup.py} with classifiers, written to be compatible
with older versions of the Distutils:

@example
from distutils import core
kw = @{'name': "Quixote",
      'version': "0.5.1",
      'description': "A highly Pythonic Web application framework",
      # ...
      @}

if (hasattr(core, 'setup_keywords') and
    'classifiers' in core.setup_keywords):
    kw['classifiers'] = \
        ['Topic :: Internet :: WWW/HTTP :: Dynamic Content',
         'Environment :: No Input/Output (Daemon)',
         'Intended Audience :: Developers'],

core.setup(**kw)
@end example

The full list of classifiers can be obtained by running  @code{python setup.py
register --list-classifiers}.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 301

@item PEP 301@footnote{https://peps.python.org/pep-0301/} - Package Index and Metadata for Distutils

Written and implemented by Richard Jones.
@end table


@c ======================================================================

@node PEP 302 New Import Hooks,PEP 305 Comma-separated Files,PEP 301 Package Index and Metadata for Distutils,What’s New in Python 2 3
@anchor{whatsnew/2 3 pep-302-new-import-hooks}@anchor{16a4}@anchor{whatsnew/2 3 section-pep302}@anchor{1691}
@subsection PEP 302: New Import Hooks


While it’s been possible to write custom import hooks ever since the
@code{ihooks} module was introduced in Python 1.3, no one has ever been really
happy with it because writing new import hooks is difficult and messy.  There
have been various proposed alternatives such as the @code{imputil} and @code{iu}
modules, but none of them has ever gained much acceptance, and none of them were
easily usable from C code.

@geindex Python 향상 제안; PEP 302
PEP 302@footnote{https://peps.python.org/pep-0302/} borrows ideas from its predecessors, especially from Gordon
McMillan’s @code{iu} module.  Three new items  are added to the @ref{df,,sys}
module:


@itemize *

@item 
@code{sys.path_hooks} is a list of callable objects; most  often they’ll be
classes.  Each callable takes a string containing a path and either returns an
importer object that will handle imports from this path or raises an
@ref{659,,ImportError} exception if it can’t handle this path.

@item 
@code{sys.path_importer_cache} caches importer objects for each path, so
@code{sys.path_hooks} will only need to be traversed once for each path.

@item 
@code{sys.meta_path} is a list of importer objects that will be traversed before
@code{sys.path} is checked.  This list is initially empty, but user code can add
objects to it.  Additional built-in and frozen modules can be imported by an
object added to this list.
@end itemize

Importer objects must have a single method, @code{find_module(fullname,
path=None)}.  `fullname' will be a module or package name, e.g. @code{string} or
@code{distutils.core}.  @code{find_module()} must return a loader object that has a
single method, @code{load_module(fullname)}, that creates and returns the
corresponding module object.

Pseudo-code for Python’s new import logic, therefore, looks something like this
(simplified a bit; see 
@geindex Python 향상 제안; PEP 302
PEP 302@footnote{https://peps.python.org/pep-0302/} for the full details):

@example
for mp in sys.meta_path:
    loader = mp(fullname)
    if loader is not None:
        <module> = loader.load_module(fullname)

for path in sys.path:
    for hook in sys.path_hooks:
        try:
            importer = hook(path)
        except ImportError:
            # ImportError, so try the other path hooks
            pass
        else:
            loader = importer.find_module(fullname)
            <module> = loader.load_module(fullname)

# Not found!
raise ImportError
@end example


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 302

@item PEP 302@footnote{https://peps.python.org/pep-0302/} - New Import Hooks

Written by Just van Rossum and Paul Moore. Implemented by Just van Rossum.
@end table


@c ======================================================================

@node PEP 305 Comma-separated Files,PEP 307 Pickle Enhancements,PEP 302 New Import Hooks,What’s New in Python 2 3
@anchor{whatsnew/2 3 pep-305-comma-separated-files}@anchor{16a5}@anchor{whatsnew/2 3 section-pep305}@anchor{16a6}
@subsection PEP 305: Comma-separated Files


Comma-separated files are a format frequently used for exporting data from
databases and spreadsheets.  Python 2.3 adds a parser for comma-separated files.

Comma-separated format is deceptively simple at first glance:

@example
Costs,150,200,3.95
@end example

Read a line and call @code{line.split(',')}: what could be simpler? But toss in
string data that can contain commas, and things get more complicated:

@example
"Costs",150,200,3.95,"Includes taxes, shipping, and sundry items"
@end example

A big ugly regular expression can parse this, but using the new  @ref{2d,,csv}
package is much simpler:

@example
import csv

input = open('datafile', 'rb')
reader = csv.reader(input)
for line in reader:
    print line
@end example

The @ref{6ad,,reader()} function takes a number of different options. The field
separator isn’t limited to the comma and can be changed to any character, and so
can the quoting and line-ending characters.

Different dialects of comma-separated files can be defined and registered;
currently there are two dialects, both used by Microsoft Excel. A separate
@ref{6ae,,csv.writer} class will generate comma-separated files from a succession
of tuples or lists, quoting strings that contain the delimiter.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 305

@item PEP 305@footnote{https://peps.python.org/pep-0305/} - CSV File API

Written and implemented  by Kevin Altis, Dave Cole, Andrew McNamara, Skip
Montanaro, Cliff Wells.
@end table


@c ======================================================================

@node PEP 307 Pickle Enhancements,Extended Slices,PEP 305 Comma-separated Files,What’s New in Python 2 3
@anchor{whatsnew/2 3 pep-307-pickle-enhancements}@anchor{16a7}@anchor{whatsnew/2 3 section-pep307}@anchor{16a8}
@subsection PEP 307: Pickle Enhancements


The @ref{ab,,pickle} and @code{cPickle} modules received some attention during the
2.3 development cycle.  In 2.2, new-style classes could be pickled without
difficulty, but they weren’t pickled very compactly; 
@geindex Python 향상 제안; PEP 307
PEP 307@footnote{https://peps.python.org/pep-0307/} quotes a trivial
example where a new-style class results in a pickled string three times longer
than that for a classic class.

The solution was to invent a new pickle protocol.  The @ref{16a9,,pickle.dumps()}
function has supported a text-or-binary flag  for a long time.  In 2.3, this
flag is redefined from a Boolean to an integer: 0 is the old text-mode pickle
format, 1 is the old binary format, and now 2 is a new 2.3-specific format.  A
new constant, @ref{16aa,,pickle.HIGHEST_PROTOCOL}, can be used to select the
fanciest protocol available.

Unpickling is no longer considered a safe operation.  2.2’s @ref{ab,,pickle}
provided hooks for trying to prevent unsafe classes from being unpickled
(specifically, a @code{__safe_for_unpickling__} attribute), but none of this
code was ever audited and therefore it’s all been ripped out in 2.3.  You should
not unpickle untrusted data in any version of Python.

To reduce the pickling overhead for new-style classes, a new interface for
customizing pickling was added using three special methods:
@ref{7f0,,__getstate__()}, @ref{bc6,,__setstate__()}, and @ref{fd3,,__getnewargs__()}.  Consult
@geindex Python 향상 제안; PEP 307
PEP 307@footnote{https://peps.python.org/pep-0307/} for the full semantics  of these methods.

As a way to compress pickles yet further, it’s now possible to use integer codes
instead of long strings to identify pickled classes. The Python Software
Foundation will maintain a list of standardized codes; there’s also a range of
codes for private use.  Currently no codes have been specified.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 307

@item PEP 307@footnote{https://peps.python.org/pep-0307/} - Extensions to the pickle protocol

Written and implemented  by Guido van Rossum and Tim Peters.
@end table


@c ======================================================================

@node Extended Slices,Other Language Changes<12>,PEP 307 Pickle Enhancements,What’s New in Python 2 3
@anchor{whatsnew/2 3 extended-slices}@anchor{16ab}@anchor{whatsnew/2 3 section-slices}@anchor{16ac}
@subsection Extended Slices


Ever since Python 1.4, the slicing syntax has supported an optional third “step”
or “stride” argument.  For example, these are all legal Python syntax:
@code{L[1:10:2]}, @code{L[:-1:1]}, @code{L[::-1]}.  This was added to Python at the
request of the developers of Numerical Python, which uses the third argument
extensively.  However, Python’s built-in list, tuple, and string sequence types
have never supported this feature, raising a @ref{198,,TypeError} if you tried it.
Michael Hudson contributed a patch to fix this shortcoming.

For example, you can now easily extract the elements of a list that have even
indexes:

@example
>>> L = range(10)
>>> L[::2]
[0, 2, 4, 6, 8]
@end example

Negative values also work to make a copy of the same list in reverse order:

@example
>>> L[::-1]
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
@end example

This also works for tuples, arrays, and strings:

@example
>>> s='abcd'
>>> s[::2]
'ac'
>>> s[::-1]
'dcba'
@end example

If you have a mutable sequence such as a list or an array you can assign to or
delete an extended slice, but there are some differences between assignment to
extended and regular slices.  Assignment to a regular slice can be used to
change the length of the sequence:

@example
>>> a = range(3)
>>> a
[0, 1, 2]
>>> a[1:3] = [4, 5, 6]
>>> a
[0, 4, 5, 6]
@end example

Extended slices aren’t this flexible.  When assigning to an extended slice, the
list on the right hand side of the statement must contain the same number of
items as the slice it is replacing:

@example
>>> a = range(4)
>>> a
[0, 1, 2, 3]
>>> a[::2]
[0, 2]
>>> a[::2] = [0, -1]
>>> a
[0, 1, -1, 3]
>>> a[::2] = [0,1,2]
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
ValueError: attempt to assign sequence of size 3 to extended slice of size 2
@end example

Deletion is more straightforward:

@example
>>> a = range(4)
>>> a
[0, 1, 2, 3]
>>> a[::2]
[0, 2]
>>> del a[::2]
>>> a
[1, 3]
@end example

One can also now pass slice objects to the @ref{588,,__getitem__()} methods of the
built-in sequences:

@example
>>> range(10).__getitem__(slice(0, 5, 2))
[0, 2, 4]
@end example

Or use slice objects directly in subscripts:

@example
>>> range(10)[slice(0, 5, 2)]
[0, 2, 4]
@end example

To simplify implementing sequences that support extended slicing, slice objects
now have a method @code{indices(length)} which, given the length of a sequence,
returns a @code{(start, stop, step)} tuple that can be passed directly to
@ref{b3d,,range()}. @code{indices()} handles omitted and out-of-bounds indices in a
manner consistent with regular slices (and this innocuous phrase hides a welter
of confusing details!).  The method is intended to be used like this:

@example
class FakeSeq:
    ...
    def calc_item(self, i):
        ...
    def __getitem__(self, item):
        if isinstance(item, slice):
            indices = item.indices(len(self))
            return FakeSeq([self.calc_item(i) for i in range(*indices)])
        else:
            return self.calc_item(i)
@end example

From this example you can also see that the built-in @ref{693,,slice} object is
now the type object for the slice type, and is no longer a function.  This is
consistent with Python 2.2, where @ref{19b,,int}, @ref{169,,str}, etc., underwent
the same change.

@c ======================================================================

@node Other Language Changes<12>,New Improved and Deprecated Modules<4>,Extended Slices,What’s New in Python 2 3
@anchor{whatsnew/2 3 other-language-changes}@anchor{16ad}
@subsection Other Language Changes


Here are all of the changes that Python 2.3 makes to the core Python language.


@itemize *

@item 
The @ref{bc1,,yield} statement is now always a keyword, as described in
section @ref{168d,,PEP 255; Simple Generators} of this document.

@item 
A new built-in function @ref{1686,,enumerate()} was added, as described in section
@ref{1696,,PEP 279; enumerate()} of this document.

@item 
Two new constants, @ref{e06,,True} and @ref{d2a,,False} were added along with the
built-in @ref{3c3,,bool} type, as described in section @ref{169e,,PEP 285; A Boolean Type} of this
document.

@item 
The @ref{19b,,int()} type constructor will now return a long integer instead of
raising an @ref{a81,,OverflowError} when a string or floating-point number is too
large to fit into an integer.  This can lead to the paradoxical result that
@code{isinstance(int(expression), int)} is false, but that seems unlikely to cause
problems in practice.

@item 
Built-in types now support the extended slicing syntax, as described in
section @ref{16ac,,Extended Slices} of this document.

@item 
A new built-in function, @code{sum(iterable, start=0)},  adds up the numeric
items in the iterable object and returns their sum.  @ref{694,,sum()} only accepts
numbers, meaning that you can’t use it to concatenate a bunch of strings.
(Contributed by Alex Martelli.)

@item 
@code{list.insert(pos, value)} used to  insert `value' at the front of the list
when `pos' was negative.  The behaviour has now been changed to be consistent
with slice indexing, so when `pos' is -1 the value will be inserted before the
last element, and so forth.

@item 
@code{list.index(value)}, which searches for `value'  within the list and returns
its index, now takes optional  `start' and `stop' arguments to limit the search
to  only part of the list.

@item 
Dictionaries have a new method, @code{pop(key[, *default*])}, that returns
the value corresponding to `key' and removes that key/value pair from the
dictionary.  If the requested key isn’t present in the dictionary, `default' is
returned if it’s specified and @ref{5e5,,KeyError} raised if it isn’t.

@example
>>> d = @{1:2@}
>>> d
@{1: 2@}
>>> d.pop(4)
Traceback (most recent call last):
  File "stdin", line 1, in ?
KeyError: 4
>>> d.pop(1)
2
>>> d.pop(1)
Traceback (most recent call last):
  File "stdin", line 1, in ?
KeyError: 'pop(): dictionary is empty'
>>> d
@{@}
>>>
@end example

There’s also a new class method,  @code{dict.fromkeys(iterable, value)}, that
creates a dictionary with keys taken from the supplied iterator `iterable' and
all values set to `value', defaulting to @code{None}.

(Patches contributed by Raymond Hettinger.)

Also, the @ref{183,,dict()} constructor now accepts keyword arguments to simplify
creating small dictionaries:

@example
>>> dict(red=1, blue=2, green=3, black=4)
@{'blue': 2, 'black': 4, 'green': 3, 'red': 1@}
@end example

(Contributed by Just van Rossum.)

@item 
The @ref{b60,,assert} statement no longer checks the @code{__debug__} flag, so
you can no longer disable assertions by assigning to @code{__debug__}. Running
Python with the @ref{18c,,-O} switch will still generate code that doesn’t
execute any assertions.

@item 
Most type objects are now callable, so you can use them to create new objects
such as functions, classes, and modules.  (This means that the @code{new} module
can be deprecated in a future Python version, because you can now use the type
objects available in the @ref{109,,types} module.) For example, you can create a new
module object with the following code:

@example
>>> import types
>>> m = types.ModuleType('abc','docstring')
>>> m
<module 'abc' (built-in)>
>>> m.__doc__
'docstring'
@end example

@item 
A new warning, @ref{ac6,,PendingDeprecationWarning} was added to indicate features
which are in the process of being deprecated.  The warning will `not' be printed
by default.  To check for use of features that will be deprecated in the future,
supply @ref{ac5,,-Walways;;PendingDeprecationWarning;;} on the command line or
use @ref{16ae,,warnings.filterwarnings()}.

@item 
The process of deprecating string-based exceptions, as in @code{raise "Error
occurred"}, has begun.  Raising a string will now trigger
@ref{ac6,,PendingDeprecationWarning}.

@item 
Using @code{None} as a variable name will now result in a @ref{1ae,,SyntaxWarning}
warning.  In a future version of Python, @code{None} may finally become a keyword.

@item 
The @code{xreadlines()} method of file objects, introduced in Python 2.1, is no
longer necessary because files now behave as their own iterator.
@code{xreadlines()} was originally introduced as a faster way to loop over all
the lines in a file, but now you can simply write @code{for line in file_obj}.
File objects also have a new read-only @code{encoding} attribute that gives the
encoding used by the file; Unicode strings written to the file will be
automatically  converted to bytes using the given encoding.

@item 
The method resolution order used by new-style classes has changed, though
you’ll only notice the difference if you have a really complicated inheritance
hierarchy.  Classic classes are unaffected by this change.  Python 2.2
originally used a topological sort of a class’s ancestors, but 2.3 now uses the
C3 algorithm as described in the paper "A Monotonic Superclass Linearization for Dylan"@footnote{https://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.19.3910}. To
understand the motivation for this change,  read Michele Simionato’s article
@ref{16af,,The Python 2.3 Method Resolution Order}, or
read the thread on python-dev starting with the message at
@indicateurl{https://mail.python.org/pipermail/python-dev/2002-October/029035.html}. Samuele
Pedroni first pointed out the problem and also implemented the fix by coding the
C3 algorithm.

@item 
Python runs multithreaded programs by switching between threads after
executing N bytecodes.  The default value for N has been increased from 10 to
100 bytecodes, speeding up single-threaded applications by reducing the
switching overhead.  Some multithreaded applications may suffer slower response
time, but that’s easily fixed by setting the limit back to a lower number using
@code{sys.setcheckinterval(N)}. The limit can be retrieved with the new
@code{sys.getcheckinterval()} function.

@item 
One minor but far-reaching change is that the names of extension types defined
by the modules included with Python now contain the module and a @code{'.'} in
front of the type name.  For example, in Python 2.2, if you created a socket and
printed its @code{__class__}, you’d get this output:

@example
>>> s = socket.socket()
>>> s.__class__
<type 'socket'>
@end example

In 2.3, you get this:

@example
>>> s.__class__
<type '_socket.socket'>
@end example

@item 
One of the noted incompatibilities between old- and new-style classes has been
removed: you can now assign to the @ref{16b0,,__name__} and @ref{16b1,,__bases__}
attributes of new-style classes.  There are some restrictions on what can be
assigned to @code{__bases__} along the lines of those relating to assigning to
an instance’s @ref{16b2,,__class__} attribute.
@end itemize

@c ======================================================================

@menu
* String Changes:: 
* Optimizations: Optimizations<12>. 

@end menu

@node String Changes,Optimizations<12>,,Other Language Changes<12>
@anchor{whatsnew/2 3 string-changes}@anchor{16b3}
@subsubsection String Changes



@itemize *

@item 
The @ref{34b,,in} operator now works differently for strings. Previously, when
evaluating @code{X in Y} where `X' and `Y' are strings, `X' could only be a single
character. That’s now changed; `X' can be a string of any length, and @code{X in Y}
will return @ref{e06,,True} if `X' is a substring of `Y'.  If `X' is the empty
string, the result is always @code{True}.

@example
>>> 'ab' in 'abcd'
True
>>> 'ad' in 'abcd'
False
>>> '@w{'} in 'abcd'
True
@end example

Note that this doesn’t tell you where the substring starts; if you need that
information, use the @ref{10a7,,find()} string method.

@item 
The @ref{16b4,,strip()}, @ref{16b5,,lstrip()}, and @ref{16b6,,rstrip()} string methods now have
an optional argument for specifying the characters to strip.  The default is
still to remove all whitespace characters:

@example
>>> '   abc '.strip()
'abc'
>>> '><><abc<><><>'.strip('<>')
'abc'
>>> '><><abc<><><>\n'.strip('<>')
'abc<><><>\n'
>>> u'\u4000\u4001abc\u4000'.strip(u'\u4000')
u'\u4001abc'
>>>
@end example

(Suggested by Simon Brunning and implemented by Walter Dörwald.)

@item 
The @ref{10ca,,startswith()} and @ref{10cb,,endswith()} string methods now accept negative
numbers for the `start' and `end' parameters.

@item 
Another new string method is @ref{16b7,,zfill()}, originally a function in the
@ref{d8,,string} module.  @code{zfill()} pads a numeric string with zeros on the
left until it’s the specified width. Note that the @code{%} operator is still more
flexible and powerful than @code{zfill()}.

@example
>>> '45'.zfill(4)
'0045'
>>> '12345'.zfill(4)
'12345'
>>> 'goofy'.zfill(6)
'0goofy'
@end example

(Contributed by Walter Dörwald.)

@item 
A new type object, @code{basestring}, has been added. Both 8-bit strings and
Unicode strings inherit from this type, so @code{isinstance(obj, basestring)} will
return @ref{e06,,True} for either kind of string.  It’s a completely abstract
type, so you can’t create @code{basestring} instances.

@item 
Interned strings are no longer immortal and will now be garbage-collected in
the usual way when the only reference to them is from the internal dictionary of
interned strings.  (Implemented by Oren Tirosh.)
@end itemize

@c ======================================================================

@node Optimizations<12>,,String Changes,Other Language Changes<12>
@anchor{whatsnew/2 3 optimizations}@anchor{16b8}
@subsubsection Optimizations



@itemize *

@item 
The creation of new-style class instances has been made much faster; they’re
now faster than classic classes!

@item 
The @ref{dc7,,sort()} method of list objects has been extensively rewritten by Tim
Peters, and the implementation is significantly faster.

@item 
Multiplication of large long integers is now much faster thanks to an
implementation of Karatsuba multiplication, an algorithm that scales better than
the `O'(`n'@w{^2}) required for the grade-school multiplication algorithm.  (Original
patch by Christopher A. Craig, and significantly reworked by Tim Peters.)

@item 
The @code{SET_LINENO} opcode is now gone.  This may provide a small speed
increase, depending on your compiler’s idiosyncrasies. See section
@ref{16b9,,Other Changes and Fixes} for a longer explanation. (Removed by Michael Hudson.)

@item 
@code{xrange()} objects now have their own iterator, making @code{for i in
xrange(n)} slightly faster than @code{for i in range(n)}.  (Patch by Raymond
Hettinger.)

@item 
A number of small rearrangements have been made in various hotspots to improve
performance, such as inlining a function or removing some code.  (Implemented
mostly by GvR, but lots of people have contributed single changes.)
@end itemize

The net result of the 2.3 optimizations is that Python 2.3 runs the  pystone
benchmark around 25% faster than Python 2.2.

@c ======================================================================

@node New Improved and Deprecated Modules<4>,Pymalloc A Specialized Object Allocator,Other Language Changes<12>,What’s New in Python 2 3
@anchor{whatsnew/2 3 new-improved-and-deprecated-modules}@anchor{16ba}
@subsection New, Improved, and Deprecated Modules


As usual, Python’s standard library received a number of enhancements and bug
fixes.  Here’s a partial list of the most notable changes, sorted alphabetically
by module name. Consult the @code{Misc/NEWS} file in the source tree for a more
complete list of changes, or look through the CVS logs for all the details.


@itemize *

@item 
The @ref{8,,array} module now supports arrays of Unicode characters using the
@code{'u'} format character.  Arrays also now support using the @code{+=} assignment
operator to add another array’s contents, and the @code{*=} assignment operator to
repeat an array. (Contributed by Jason Orendorff.)

@item 
The @code{bsddb} module has been replaced by version 4.1.6 of the PyBSDDB@footnote{https://pybsddb.sourceforge.net} package, providing a more complete interface
to the transactional features of the BerkeleyDB library.

The old version of the module has been renamed to  @code{bsddb185} and is no
longer built automatically; you’ll  have to edit @code{Modules/Setup} to enable
it.  Note that the new @code{bsddb} package is intended to be compatible with
the  old module, so be sure to file bugs if you discover any incompatibilities.
When upgrading to Python 2.3, if the new interpreter is compiled with a new
version of  the underlying BerkeleyDB library, you will almost certainly have to
convert your database files to the new version.  You can do this fairly easily
with the new scripts @code{db2pickle.py} and @code{pickle2db.py} which you
will find in the distribution’s @code{Tools/scripts} directory.  If you’ve
already been using the PyBSDDB package and importing it as @code{bsddb3}, you
will have to change your @code{import} statements to import it as @code{bsddb}.

@item 
The new @ref{14,,bz2} module is an interface to the bz2 data compression library.
bz2-compressed data is usually smaller than  corresponding
@ref{139,,zlib}-compressed data. (Contributed by Gustavo Niemeyer.)

@item 
A set of standard date/time types has been added in the new @ref{34,,datetime}
module.  See the following section for more details.

@item 
The Distutils @code{Extension} class now supports an extra constructor
argument named `depends' for listing additional source files that an extension
depends on.  This lets Distutils recompile the module if any of the dependency
files are modified.  For example, if @code{sampmodule.c} includes the header
file @code{sample.h}, you would create the @code{Extension} object like
this:

@example
ext = Extension("samp",
                sources=["sampmodule.c"],
                depends=["sample.h"])
@end example

Modifying @code{sample.h} would then cause the module to be recompiled.
(Contributed by Jeremy Hylton.)

@item 
Other minor changes to Distutils: it now checks for the 
@geindex CC
@geindex 환경 변수; CC
@ref{16bb,,CC},
@geindex CFLAGS
@geindex 환경 변수; CFLAGS
@ref{16bc,,CFLAGS}, @code{CPP}, 
@geindex LDFLAGS
@geindex 환경 변수; LDFLAGS
@ref{16bd,,LDFLAGS}, and 
@geindex CPPFLAGS
@geindex 환경 변수; CPPFLAGS
@ref{16be,,CPPFLAGS}
environment variables, using them to override the settings in Python’s
configuration (contributed by Robert Weber).

@item 
Previously the @ref{3e,,doctest} module would only search the docstrings of
public methods and functions for test cases, but it now also examines private
ones as well.  The @ref{ff3,,DocTestSuite()} function creates a
@ref{ff4,,unittest.TestSuite} object from a set of @code{doctest} tests.

@item 
The new @code{gc.get_referents(object)} function returns a list of all the
objects referenced by `object'.

@item 
The @ref{65,,getopt} module gained a new function, @ref{16bf,,gnu_getopt()}, that
supports the same arguments as the existing @ref{16c0,,getopt()} function but uses
GNU-style scanning mode. The existing @code{getopt()} stops processing options as
soon as a non-option argument is encountered, but in GNU-style mode processing
continues, meaning that options and arguments can be mixed.  For example:

@example
>>> getopt.getopt(['-f', 'filename', 'output', '-v'], 'f:v')
([('-f', 'filename')], ['output', '-v'])
>>> getopt.gnu_getopt(['-f', 'filename', 'output', '-v'], 'f:v')
([('-f', 'filename'), ('-v', '@w{'})], ['output'])
@end example

(Contributed by Peter Åstrand.)

@item 
The @ref{6a,,grp}, @ref{b7,,pwd}, and @ref{c1,,resource} modules now return enhanced
tuples:

@example
>>> import grp
>>> g = grp.getgrnam('amk')
>>> g.gr_name, g.gr_gid
('amk', 500)
@end example

@item 
The @ref{6b,,gzip} module can now handle files exceeding 2 GiB.

@item 
The new @ref{6d,,heapq} module contains an implementation of a heap queue
algorithm.  A heap is an array-like data structure that keeps items in a
partially sorted order such that, for every index `k', @code{heap[k] <=
heap[2*k+1]} and @code{heap[k] <= heap[2*k+2]}.  This makes it quick to remove the
smallest item, and inserting a new item while maintaining the heap property is
`O'(log `n').  (See @indicateurl{https://xlinux.nist.gov/dads//HTML/priorityque.html} for more
information about the priority queue data structure.)

The @ref{6d,,heapq} module provides @ref{16c1,,heappush()} and @ref{16c2,,heappop()} functions
for adding and removing items while maintaining the heap property on top of some
other mutable Python sequence type.  Here’s an example that uses a Python list:

@example
>>> import heapq
>>> heap = []
>>> for item in [3, 7, 5, 11, 1]:
...    heapq.heappush(heap, item)
...
>>> heap
[1, 3, 5, 11, 7]
>>> heapq.heappop(heap)
1
>>> heapq.heappop(heap)
3
>>> heap
[5, 7, 11]
@end example

(Contributed by Kevin O’Connor.)

@item 
The IDLE integrated development environment has been updated using the code
from the IDLEfork project (@indicateurl{https://idlefork.sourceforge.net}).  The most notable feature is
that the code being developed is now executed in a subprocess, meaning that
there’s no longer any need for manual @code{reload()} operations. IDLE’s core code
has been incorporated into the standard library as the @ref{77,,idlelib} package.

@item 
The @ref{78,,imaplib} module now supports IMAP over SSL. (Contributed by Piers
Lauder and Tino Lange.)

@item 
The @ref{85,,itertools} contains a number of useful functions for use with
iterators, inspired by various functions provided by the ML and Haskell
languages.  For example, @code{itertools.ifilter(predicate, iterator)} returns all
elements in the iterator for which the function @code{predicate()} returns
@ref{e06,,True}, and @code{itertools.repeat(obj, N)} returns @code{obj} `N' times.
There are a number of other functions in the module; see the package’s reference
documentation for details.
(Contributed by Raymond Hettinger.)

@item 
Two new functions in the @ref{92,,math} module, @code{degrees(rads)} and
@code{radians(degs)}, convert between radians and degrees.  Other functions in
the @code{math} module such as @ref{16c3,,math.sin()} and @ref{16c4,,math.cos()} have always
required input values measured in radians.  Also, an optional `base' argument
was added to @ref{16c5,,math.log()} to make it easier to compute logarithms for bases
other than @code{e} and @code{10}.  (Contributed by Raymond Hettinger.)

@item 
Several new POSIX functions (@code{getpgid()}, @code{killpg()}, @code{lchown()},
@code{loadavg()}, @code{major()}, @code{makedev()}, @code{minor()}, and
@code{mknod()}) were added to the @ref{b2,,posix} module that underlies the
@ref{a5,,os} module. (Contributed by Gustavo Niemeyer, Geert Jansen, and Denis S.
Otkidach.)

@item 
In the @ref{a5,,os} module, the @code{*stat()} family of functions can now report
fractions of a second in a timestamp.  Such time stamps are represented as
floats, similar to the value returned by @ref{55c,,time.time()}.

During testing, it was found that some applications will break if time stamps
are floats.  For compatibility, when using the tuple interface of the
@ref{16c6,,stat_result} time stamps will be represented as integers. When using
named fields (a feature first introduced in Python 2.2), time stamps are still
represented as integers, unless @code{os.stat_float_times()} is invoked to enable
float return values:

@example
>>> os.stat("/tmp").st_mtime
1034791200
>>> os.stat_float_times(True)
>>> os.stat("/tmp").st_mtime
1034791200.6335014
@end example

In Python 2.4, the default will change to always returning floats.

Application developers should enable this feature only if all their libraries
work properly when confronted with floating-point time stamps, or if they use
the tuple API. If used, the feature should be activated on an application level
instead of trying to enable it on a per-use basis.

@item 
The @ref{a4,,optparse} module contains a new parser for command-line arguments
that can convert option values to a particular Python type  and will
automatically generate a usage message.  See the following section for  more
details.

@item 
The old and never-documented @code{linuxaudiodev} module has been deprecated,
and a new version named @code{ossaudiodev} has been added.  The module was
renamed because the OSS sound drivers can be used on platforms other than Linux,
and the interface has also been tidied and brought up to date in various ways.
(Contributed by Greg Ward and Nicholas FitzRoy-Dale.)

@item 
The new @ref{af,,platform} module contains a number of functions that try to
determine various properties of the platform you’re running on.  There are
functions for getting the architecture, CPU type, the Windows OS version, and
even the Linux distribution version. (Contributed by Marc-André Lemburg.)

@item 
The parser objects provided by the @ref{12c,,pyexpat} module can now optionally
buffer character data, resulting in fewer calls to your character data handler
and therefore faster performance.  Setting the parser object’s
@ref{16c7,,buffer_text} attribute to @ref{e06,,True} will enable buffering.

@item 
The @code{sample(population, k)} function was added to the @ref{bd,,random}
module.  `population' is a sequence or @code{xrange} object containing the
elements of a population, and @ref{94c,,sample()} chooses `k' elements from the
population without replacing chosen elements.  `k' can be any value up to
@code{len(population)}. For example:

@example
>>> days = ['Mo', 'Tu', 'We', 'Th', 'Fr', 'St', 'Sn']
>>> random.sample(days, 3)      # Choose 3 elements
['St', 'Sn', 'Th']
>>> random.sample(days, 7)      # Choose 7 elements
['Tu', 'Th', 'Mo', 'We', 'St', 'Fr', 'Sn']
>>> random.sample(days, 7)      # Choose 7 again
['We', 'Mo', 'Sn', 'Fr', 'Tu', 'St', 'Th']
>>> random.sample(days, 8)      # Can't choose eight
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
  File "random.py", line 414, in sample
      raise ValueError, "sample larger than population"
ValueError: sample larger than population
>>> random.sample(xrange(1,10000,2), 10)   # Choose ten odd nos. under 10000
[3407, 3805, 1505, 7023, 2401, 2267, 9733, 3151, 8083, 9195]
@end example

The @ref{bd,,random} module now uses a new algorithm, the Mersenne Twister,
implemented in C.  It’s faster and more extensively studied than the previous
algorithm.

(All changes contributed by Raymond Hettinger.)

@item 
The @ref{bf,,readline} module also gained a number of new functions:
@ref{16c8,,get_history_item()}, @ref{16c9,,get_current_history_length()}, and
@ref{16ca,,redisplay()}.

@item 
The @code{rexec} and @code{Bastion} modules have been declared dead, and
attempts to import them will fail with a @ref{244,,RuntimeError}.  New-style classes
provide new ways to break out of the restricted execution environment provided
by @code{rexec}, and no one has interest in fixing them or time to do so.  If
you have applications using @code{rexec}, rewrite them to use something else.

(Sticking with Python 2.2 or 2.1 will not make your applications any safer
because there are known bugs in the @code{rexec} module in those versions.  To
repeat: if you’re using @code{rexec}, stop using it immediately.)

@item 
The @code{rotor} module has been deprecated because the  algorithm it uses for
encryption is not believed to be secure.  If you need encryption, use one of the
several AES Python modules that are available separately.

@item 
The @ref{ca,,shutil} module gained a @code{move(src, dest)} function that
recursively moves a file or directory to a new location.

@item 
Support for more advanced POSIX signal handling was added to the @ref{cb,,signal}
but then removed again as it proved impossible to make it work reliably across
platforms.

@item 
The @ref{d1,,socket} module now supports timeouts.  You can call the
@code{settimeout(t)} method on a socket object to set a timeout of `t' seconds.
Subsequent socket operations that take longer than `t' seconds to complete will
abort and raise a @ref{a35,,socket.timeout} exception.

The original timeout implementation was by Tim O’Malley.  Michael Gilfix
integrated it into the Python @ref{d1,,socket} module and shepherded it through a
lengthy review.  After the code was checked in, Guido van Rossum rewrote parts
of it.  (This is a good example of a collaborative development process in
action.)

@item 
On Windows, the @ref{d1,,socket} module now ships with Secure  Sockets Layer
(SSL) support.

@item 
The value of the C @code{PYTHON_API_VERSION} macro is now exposed at the
Python level as @code{sys.api_version}.  The current exception can be cleared by
calling the new @code{sys.exc_clear()} function.

@item 
The new @ref{e4,,tarfile} module  allows reading from and writing to
@code{tar}-format archive files. (Contributed by Lars Gustäbel.)

@item 
The new @ref{f2,,textwrap} module contains functions for wrapping strings
containing paragraphs of text.  The @code{wrap(text, width)} function takes a
string and returns a list containing the text split into lines of no more than
the chosen width.  The @code{fill(text, width)} function returns a single
string, reformatted to fit into lines no longer than the chosen width. (As you
can guess, @ref{16cb,,fill()} is built on top of @ref{16cc,,wrap()}.  For example:

@example
>>> import textwrap
>>> paragraph = "Not a whit, we defy augury: ... more text ..."
>>> textwrap.wrap(paragraph, 60)
["Not a whit, we defy augury: there's a special providence in",
 "the fall of a sparrow. If it be now, 'tis not to come; if it",
 ...]
>>> print textwrap.fill(paragraph, 35)
Not a whit, we defy augury: there's
a special providence in the fall of
a sparrow. If it be now, 'tis not
to come; if it be not to come, it
will be now; if it be not now, yet
it will come: the readiness is all.
>>>
@end example

The module also contains a @ref{11cc,,TextWrapper} class that actually implements
the text wrapping strategy.   Both the @code{TextWrapper} class and the
@ref{16cc,,wrap()} and @ref{16cb,,fill()} functions support a number of additional keyword
arguments for fine-tuning the formatting; consult the module’s documentation
for details. (Contributed by Greg Ward.)

@item 
The @code{thread} and @ref{f3,,threading} modules now have companion modules,
@code{dummy_thread} and @code{dummy_threading}, that provide a do-nothing
implementation of the @code{thread} module’s interface for platforms where
threads are not supported.  The intention is to simplify thread-aware modules
(ones that `don’t' rely on threads to run) by putting the following code at the
top:

@example
try:
    import threading as _threading
except ImportError:
    import dummy_threading as _threading
@end example

In this example, @code{_threading} is used as the module name to make it clear
that the module being used is not necessarily the actual @ref{f3,,threading}
module. Code can call functions and use classes in @code{_threading} whether or
not threads are supported, avoiding an @ref{181,,if} statement and making the
code slightly clearer.  This module will not magically make multithreaded code
run without threads; code that waits for another thread to return or to do
something will simply hang forever.

@item 
The @ref{f4,,time} module’s @ref{1632,,strptime()} function has long been an annoyance
because it uses the platform C library’s @code{strptime()} implementation, and
different platforms sometimes have odd bugs.  Brett Cannon contributed a
portable implementation that’s written in pure Python and should behave
identically on all platforms.

@item 
The new @ref{f5,,timeit} module helps measure how long snippets of Python code
take to execute.  The @code{timeit.py} file can be run directly from the
command line, or the module’s @ref{16cd,,Timer} class can be imported and used
directly.  Here’s a short example that figures out whether it’s faster to
convert an 8-bit string to Unicode by appending an empty Unicode string to it or
by using the @code{unicode()} function:

@example
import timeit

timer1 = timeit.Timer('unicode("abc")')
timer2 = timeit.Timer('"abc" + u""')

# Run three trials
print timer1.repeat(repeat=3, number=100000)
print timer2.repeat(repeat=3, number=100000)

# On my laptop this outputs:
# [0.36831796169281006, 0.37441694736480713, 0.35304892063140869]
# [0.17574405670166016, 0.18193507194519043, 0.17565798759460449]
@end example

@item 
The @code{Tix} module has received various bug fixes and updates for the
current version of the Tix package.

@item 
The @code{Tkinter} module now works with a thread-enabled  version of Tcl.
Tcl’s threading model requires that widgets only be accessed from the thread in
which they’re created; accesses from another thread can cause Tcl to panic.  For
certain Tcl interfaces, @code{Tkinter} will now automatically avoid this  when a
widget is accessed from a different thread by marshalling a command, passing it
to the correct thread, and waiting for the results.  Other interfaces can’t be
handled automatically but @code{Tkinter} will now raise an exception on such an
access so that you can at least find out about the problem.  See
@indicateurl{https://mail.python.org/pipermail/python-dev/2002-December/031107.html} for a more
detailed explanation of this change.  (Implemented by Martin von Löwis.)

@item 
Calling Tcl methods through @code{_tkinter} no longer  returns only strings.
Instead, if Tcl returns other objects those objects are converted to their
Python equivalent, if one exists, or wrapped with a @code{_tkinter.Tcl_Obj}
object if no Python equivalent exists. This behavior can be controlled through
the @code{wantobjects()} method of @code{tkapp} objects.

When using @code{_tkinter} through the @code{Tkinter} module (as most Tkinter
applications will), this feature is always activated. It should not cause
compatibility problems, since Tkinter would always convert string results to
Python types where possible.

If any incompatibilities are found, the old behavior can be restored by setting
the @code{wantobjects} variable in the @code{Tkinter} module to false before
creating the first @code{tkapp} object.

@example
import Tkinter
Tkinter.wantobjects = 0
@end example

Any breakage caused by this change should be reported as a bug.

@item 
The @code{UserDict} module has a new @code{DictMixin} class which defines
all dictionary methods for classes that already have a minimum mapping
interface.  This greatly simplifies writing classes that need to be
substitutable for dictionaries, such as the classes in  the @ref{c8,,shelve}
module.

Adding the mix-in as a superclass provides the full dictionary interface
whenever the class defines @ref{588,,__getitem__()}, @ref{14d0,,__setitem__()},
@ref{14d1,,__delitem__()}, and @code{keys()}. For example:

@example
>>> import UserDict
>>> class SeqDict(UserDict.DictMixin):
...     """Dictionary lookalike implemented with lists."""
...     def __init__(self):
...         self.keylist = []
...         self.valuelist = []
...     def __getitem__(self, key):
...         try:
...             i = self.keylist.index(key)
...         except ValueError:
...             raise KeyError
...         return self.valuelist[i]
...     def __setitem__(self, key, value):
...         try:
...             i = self.keylist.index(key)
...             self.valuelist[i] = value
...         except ValueError:
...             self.keylist.append(key)
...             self.valuelist.append(value)
...     def __delitem__(self, key):
...         try:
...             i = self.keylist.index(key)
...         except ValueError:
...             raise KeyError
...         self.keylist.pop(i)
...         self.valuelist.pop(i)
...     def keys(self):
...         return list(self.keylist)
...
>>> s = SeqDict()
>>> dir(s)      # See that other dictionary methods are implemented
['__cmp__', '__contains__', '__delitem__', '__doc__', '__getitem__',
 '__init__', '__iter__', '__len__', '__module__', '__repr__',
 '__setitem__', 'clear', 'get', 'has_key', 'items', 'iteritems',
 'iterkeys', 'itervalues', 'keylist', 'keys', 'pop', 'popitem',
 'setdefault', 'update', 'valuelist', 'values']
@end example

(Contributed by Raymond Hettinger.)

@item 
The DOM implementation in @ref{128,,xml.dom.minidom} can now generate XML output
in a particular encoding by providing an optional encoding argument to the
@ref{c89,,toxml()} and @ref{c8a,,toprettyxml()} methods of DOM nodes.

@item 
The @code{xmlrpclib} module now supports an XML-RPC extension for handling nil
data values such as Python’s @code{None}.  Nil values are always supported on
unmarshalling an XML-RPC response.  To generate requests containing @code{None},
you must supply a true value for the `allow_none' parameter when creating a
@code{Marshaller} instance.

@item 
The new @code{DocXMLRPCServer} module allows writing self-documenting XML-RPC
servers. Run it in demo mode (as a program) to see it in action.   Pointing the
web browser to the RPC server produces pydoc-style documentation; pointing
xmlrpclib to the server allows invoking the actual methods. (Contributed by
Brian Quinlan.)

@item 
Support for internationalized domain names (RFCs 3454, 3490, 3491, and 3492)
has been added. The “idna” encoding can be used to convert between a Unicode
domain name and the ASCII-compatible encoding (ACE) of that name.

@example
>@{@}>@{@}> u"www.Alliancefrançaise.nu".encode("idna")
'www.xn--alliancefranaise-npb.nu'
@end example

The @ref{d1,,socket} module has also been extended to transparently convert
Unicode hostnames to the ACE version before passing them to the C library.
Modules that deal with hostnames such as @code{httplib} and @ref{62,,ftplib})
also support Unicode host names; @code{httplib} also sends HTTP @code{Host}
headers using the ACE version of the domain name.  @ref{10e,,urllib} supports
Unicode URLs with non-ASCII host names as long as the @code{path} part of the URL
is ASCII only.

To implement this change, the @ref{da,,stringprep} module, the  @code{mkstringprep}
tool and the @code{punycode} encoding have been added.
@end itemize

@c ======================================================================

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

@end menu

@node Date/Time Type,The optparse Module,,New Improved and Deprecated Modules<4>
@anchor{whatsnew/2 3 date-time-type}@anchor{16ce}
@subsubsection Date/Time Type


Date and time types suitable for expressing timestamps were added as the
@ref{34,,datetime} module.  The types don’t support different calendars or many
fancy features, and just stick to the basics of representing time.

The three primary types are: @ref{1fa,,date}, representing a day, month, and year;
@ref{1fb,,time}, consisting of hour, minute, and second; and @ref{4e2,,datetime},
which contains all the attributes of both @code{date} and @code{time}.
There’s also a @ref{bc2,,timedelta} class representing differences between two
points in time, and time zone logic is implemented by classes inheriting from
the abstract @ref{7f5,,tzinfo} class.

You can create instances of @ref{1fa,,date} and @ref{1fb,,time} by either supplying
keyword arguments to the appropriate constructor, e.g.
@code{datetime.date(year=1972, month=10, day=15)}, or by using one of a number of
class methods.  For example, the @ref{16cf,,today()} class method returns the
current local date.

Once created, instances of the date/time classes are all immutable. There are a
number of methods for producing formatted strings from objects:

@example
>>> import datetime as dt
>>> now = dt.datetime.now()
>>> now.isoformat()
'2002-12-30T21:27:03.994956'
>>> now.ctime()  # Only available on date, datetime
'Mon Dec 30 21:27:03 2002'
>>> now.strftime('%Y %d %b')
'2002 30 Dec'
@end example

The @ref{16d0,,replace()} method allows modifying one or more fields  of a
@ref{1fa,,date} or @ref{4e2,,datetime} instance, returning a new instance:

@example
>>> d = dt.datetime.now()
>>> d
datetime.datetime(2002, 12, 30, 22, 15, 38, 827738)
>>> d.replace(year=2001, hour=12)
datetime.datetime(2001, 12, 30, 12, 15, 38, 827738)
>>>
@end example

Instances can be compared, hashed, and converted to strings (the result is the
same as that of @ref{d24,,isoformat()}).  @ref{1fa,,date} and @ref{4e2,,datetime}
instances can be subtracted from each other, and added to @ref{bc2,,timedelta}
instances.  The largest missing feature is that there’s no standard library
support for parsing strings and getting back a @code{date} or
@code{datetime}.

For more information, refer to the module’s reference documentation.
(Contributed by Tim Peters.)

@c ======================================================================

@node The optparse Module,,Date/Time Type,New Improved and Deprecated Modules<4>
@anchor{whatsnew/2 3 the-optparse-module}@anchor{16d1}
@subsubsection The optparse Module


The @ref{65,,getopt} module provides simple parsing of command-line arguments.  The
new @ref{a4,,optparse} module (originally named Optik) provides more elaborate
command-line parsing that follows the Unix conventions, automatically creates
the output for @code{--help}, and can perform different actions for different
options.

You start by creating an instance of @ref{16d2,,OptionParser} and telling it what
your program’s options are.

@example
import sys
from optparse import OptionParser

op = OptionParser()
op.add_option('-i', '--input',
              action='store', type='string', dest='input',
              help='set input filename')
op.add_option('-l', '--length',
              action='store', type='int', dest='length',
              help='set maximum length of output')
@end example

Parsing a command line is then done by calling the @ref{16d3,,parse_args()} method.

@example
options, args = op.parse_args(sys.argv[1:])
print options
print args
@end example

This returns an object containing all of the option values, and a list of
strings containing the remaining arguments.

Invoking the script with the various arguments now works as you’d expect it to.
Note that the length argument is automatically converted to an integer.

@example
$ ./python opt.py -i data arg1
<Values at 0x400cad4c: @{'input': 'data', 'length': None@}>
['arg1']
$ ./python opt.py --input=data --length=4
<Values at 0x400cad2c: @{'input': 'data', 'length': 4@}>
[]
$
@end example

The help message is automatically generated for you:

@example
$ ./python opt.py --help
usage: opt.py [options]

options:
  -h, --help            show this help message and exit
  -iINPUT, --input=INPUT
                        set input filename
  -lLENGTH, --length=LENGTH
                        set maximum length of output
$
@end example

See the module’s documentation for more details.

Optik was written by Greg Ward, with suggestions from the readers of the Getopt
SIG.

@c ======================================================================

@node Pymalloc A Specialized Object Allocator,Build and C API Changes<9>,New Improved and Deprecated Modules<4>,What’s New in Python 2 3
@anchor{whatsnew/2 3 pymalloc-a-specialized-object-allocator}@anchor{16d4}@anchor{whatsnew/2 3 section-pymalloc}@anchor{16d5}
@subsection Pymalloc: A Specialized Object Allocator


Pymalloc, a specialized object allocator written by Vladimir Marangozov, was a
feature added to Python 2.1.  Pymalloc is intended to be faster than the system
@code{malloc()} and to have less memory overhead for allocation patterns typical
of Python programs. The allocator uses C’s @code{malloc()} function to get large
pools of memory and then fulfills smaller memory requests from these pools.

In 2.1 and 2.2, pymalloc was an experimental feature and wasn’t enabled by
default; you had to explicitly enable it when compiling Python by providing the
@code{--with-pymalloc} option to the @code{configure} script.  In 2.3,
pymalloc has had further enhancements and is now enabled by default; you’ll have
to supply @code{--without-pymalloc} to disable it.

This change is transparent to code written in Python; however, pymalloc may
expose bugs in C extensions.  Authors of C extension modules should test their
code with pymalloc enabled, because some incorrect code may cause core dumps at
runtime.

There’s one particularly common error that causes problems.  There are a number
of memory allocation functions in Python’s C API that have previously just been
aliases for the C library’s @code{malloc()} and @code{free()}, meaning that if
you accidentally called mismatched functions the error wouldn’t be noticeable.
When the object allocator is enabled, these functions aren’t aliases of
@code{malloc()} and @code{free()} any more, and calling the wrong function to
free memory may get you a core dump.  For example, if memory was allocated using
@ref{e61,,PyObject_Malloc()}, it has to be freed using @ref{e5f,,PyObject_Free()}, not
@code{free()}.  A few modules included with Python fell afoul of this and had to
be fixed; doubtless there are more third-party modules that will have the same
problem.

As part of this change, the confusing multiple interfaces for allocating memory
have been consolidated down into two API families. Memory allocated with one
family must not be manipulated with functions from the other family.  There is
one family for allocating chunks of memory and another family of functions
specifically for allocating Python objects.


@itemize *

@item 
To allocate and free an undistinguished chunk of memory use the “raw memory”
family: @ref{e5e,,PyMem_Malloc()}, @ref{1231,,PyMem_Realloc()}, and @ref{1647,,PyMem_Free()}.

@item 
The “object memory” family is the interface to the pymalloc facility described
above and is biased towards a large number of “small” allocations:
@ref{e61,,PyObject_Malloc()}, @ref{1648,,PyObject_Realloc()}, and @ref{e5f,,PyObject_Free()}.

@item 
To allocate and free Python objects, use the “object” family
@ref{b7b,,PyObject_New}, @ref{b7c,,PyObject_NewVar}, and @ref{16d6,,PyObject_Del()}.
@end itemize

Thanks to lots of work by Tim Peters, pymalloc in 2.3 also provides debugging
features to catch memory overwrites and doubled frees in both extension modules
and in the interpreter itself.  To enable this support, compile a debugging
version of the Python interpreter by running @code{configure} with
@code{--with-pydebug}.

To aid extension writers, a header file @code{Misc/pymemcompat.h} is
distributed with the source to Python 2.3 that allows Python extensions to use
the 2.3 interfaces to memory allocation while compiling against any version of
Python since 1.5.2.  You would copy the file from Python’s source distribution
and bundle it with the source of your extension.


@subsubheading 더 보기



@table @asis

@item @indicateurl{https://hg.python.org/cpython/file/default/Objects/obmalloc.c}

For the full details of the pymalloc implementation, see the comments at
the top of the file @code{Objects/obmalloc.c} in the Python source code.
The above link points to the file within the python.org SVN browser.
@end table


@c ======================================================================

@node Build and C API Changes<9>,Other Changes and Fixes<2>,Pymalloc A Specialized Object Allocator,What’s New in Python 2 3
@anchor{whatsnew/2 3 build-and-c-api-changes}@anchor{16d7}
@subsection Build and C API Changes


Changes to Python’s build process and to the C API include:


@itemize *

@item 
The cycle detection implementation used by the garbage collection has proven
to be stable, so it’s now been made mandatory.  You can no longer compile Python
without it, and the @code{--with-cycle-gc} switch to @code{configure} has
been removed.

@item 
Python can now optionally be built as a shared library
(@code{libpython2.3.so}) by supplying @code{--enable-shared} when running
Python’s @code{configure} script.  (Contributed by Ondrej Palkovsky.)

@item 
The @code{DL_EXPORT} and @code{DL_IMPORT} macros are now deprecated.
Initialization functions for Python extension modules should now be declared
using the new macro @ref{16d8,,PyMODINIT_FUNC}, while the Python core will
generally use the @code{PyAPI_FUNC} and @code{PyAPI_DATA} macros.

@item 
The interpreter can be compiled without any docstrings for the built-in
functions and modules by supplying @code{--without-doc-strings} to the
@code{configure} script. This makes the Python executable about 10% smaller,
but will also mean that you can’t get help for Python’s built-ins.  (Contributed
by Gustavo Niemeyer.)

@item 
The @code{PyArg_NoArgs()} macro is now deprecated, and code that uses it
should be changed.  For Python 2.2 and later, the method definition table can
specify the @ref{16d9,,METH_NOARGS} flag, signalling that there are no arguments,
and the argument checking can then be removed.  If compatibility with pre-2.2
versions of Python is important, the code could use @code{PyArg_ParseTuple(args,
"")} instead, but this will be slower than using @code{METH_NOARGS}.

@item 
@ref{3c1,,PyArg_ParseTuple()} accepts new format characters for various sizes of
unsigned integers: @code{B} for unsigned char, @code{H} for unsigned short int,  @code{I} for unsigned int,  and @code{K} for unsigned long long.

@item 
A new function, @code{PyObject_DelItemString(mapping, char *key)} was added
as shorthand for @code{PyObject_DelItem(mapping, PyString_New(key))}.

@item 
File objects now manage their internal string buffer differently, increasing
it exponentially when needed.  This results in the benchmark tests in
@code{Lib/test/test_bufio.py} speeding up considerably (from 57 seconds to 1.7
seconds, according to one measurement).

@item 
It’s now possible to define class and static methods for a C extension type by
setting either the @ref{16da,,METH_CLASS} or @ref{16db,,METH_STATIC} flags in a
method’s @ref{16dc,,PyMethodDef} structure.

@item 
Python now includes a copy of the Expat XML parser’s source code, removing any
dependence on a system version or local installation of Expat.

@item 
If you dynamically allocate type objects in your extension, you should be
aware of a change in the rules relating to the @ref{615,,__module__} and
@ref{16b0,,__name__} attributes.  In summary, you will want to ensure the type’s
dictionary contains a @code{'__module__'} key; making the module name the part of
the type name leading up to the final period will no longer have the desired
effect.  For more detail, read the API reference documentation or the  source.
@end itemize

@c ======================================================================

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

@end menu

@node Port-Specific Changes<3>,,,Build and C API Changes<9>
@anchor{whatsnew/2 3 port-specific-changes}@anchor{16dd}
@subsubsection Port-Specific Changes


Support for a port to IBM’s OS/2 using the EMX runtime environment was merged
into the main Python source tree.  EMX is a POSIX emulation layer over the OS/2
system APIs.  The Python port for EMX tries to support all the POSIX-like
capability exposed by the EMX runtime, and mostly succeeds; @code{fork()} and
@ref{5d,,fcntl()} are restricted by the limitations of the underlying emulation
layer.  The standard OS/2 port, which uses IBM’s Visual Age compiler, also
gained support for case-sensitive import semantics as part of the integration of
the EMX port into CVS.  (Contributed by Andrew MacIntyre.)

On MacOS, most toolbox modules have been weaklinked to improve backward
compatibility.  This means that modules will no longer fail to load if a single
routine is missing on the current OS version. Instead calling the missing
routine will raise an exception. (Contributed by Jack Jansen.)

The RPM spec files, found in the @code{Misc/RPM/} directory in the Python
source distribution, were updated for 2.3.  (Contributed by Sean Reifschneider.)

Other new platforms now supported by Python include AtheOS
(@indicateurl{http://www.atheos.cx/}), GNU/Hurd, and OpenVMS.

@c ======================================================================

@node Other Changes and Fixes<2>,Porting to Python 2 3,Build and C API Changes<9>,What’s New in Python 2 3
@anchor{whatsnew/2 3 other-changes-and-fixes}@anchor{16de}@anchor{whatsnew/2 3 section-other}@anchor{16b9}
@subsection Other Changes and Fixes


As usual, there were a bunch of other improvements and bugfixes scattered
throughout the source tree.  A search through the CVS change logs finds there
were 523 patches applied and 514 bugs fixed between Python 2.2 and 2.3.  Both
figures are likely to be underestimates.

Some of the more notable changes are:


@itemize *

@item 
If the 
@geindex PYTHONINSPECT
@geindex 환경 변수; PYTHONINSPECT
@ref{16df,,PYTHONINSPECT} environment variable is set, the Python
interpreter will enter the interactive prompt after running a Python program, as
if Python had been invoked with the @ref{16e0,,-i} option. The environment
variable can be set before running the Python interpreter, or it can be set by
the Python program as part of its execution.

@item 
The @code{regrtest.py} script now provides a way to allow “all resources
except `foo'.”  A resource name passed to the @code{-u} option can now be
prefixed with a hyphen (@code{'-'}) to mean “remove this resource.”  For example,
the option ‘@code{-uall,-bsddb}’ could be used to enable the use of all resources
except @code{bsddb}.

@item 
The tools used to build the documentation now work under Cygwin as well as
Unix.

@item 
The @code{SET_LINENO} opcode has been removed.  Back in the mists of time, this
opcode was needed to produce line numbers in tracebacks and support trace
functions (for, e.g., @ref{aa,,pdb}). Since Python 1.5, the line numbers in
tracebacks have been computed using a different mechanism that works with
“python -O”.  For Python 2.3 Michael Hudson implemented a similar scheme to
determine when to call the trace function, removing the need for @code{SET_LINENO}
entirely.

It would be difficult to detect any resulting difference from Python code, apart
from a slight speed up when Python is run without @ref{18c,,-O}.

C extensions that access the @ref{9af,,f_lineno} field of frame objects should
instead call @code{PyCode_Addr2Line(f->f_code, f->f_lasti)}. This will have the
added effect of making the code work as desired under “python -O” in earlier
versions of Python.

A nifty new feature is that trace functions can now assign to the
@ref{9af,,f_lineno} attribute of frame objects, changing the line that will be
executed next.  A @code{jump} command has been added to the @ref{aa,,pdb} debugger
taking advantage of this new feature. (Implemented by Richie Hindle.)
@end itemize

@c ======================================================================

@node Porting to Python 2 3,Acknowledgements<5>,Other Changes and Fixes<2>,What’s New in Python 2 3
@anchor{whatsnew/2 3 porting-to-python-2-3}@anchor{16e1}
@subsection Porting to Python 2.3


This section lists previously described changes that may require changes to your
code:


@itemize *

@item 
@ref{bc1,,yield} is now always a keyword; if it’s used as a variable name in
your code, a different name must be chosen.

@item 
For strings `X' and `Y', @code{X in Y} now works if `X' is more than one
character long.

@item 
The @ref{19b,,int()} type constructor will now return a long integer instead of
raising an @ref{a81,,OverflowError} when a string or floating-point number is too
large to fit into an integer.

@item 
If you have Unicode strings that contain 8-bit characters, you must declare
the file’s encoding (UTF-8, Latin-1, or whatever) by adding a comment to the top
of the file.  See section @ref{168f,,PEP 263; Source Code Encodings} for more information.

@item 
Calling Tcl methods through @code{_tkinter} no longer  returns only strings.
Instead, if Tcl returns other objects those objects are converted to their
Python equivalent, if one exists, or wrapped with a @code{_tkinter.Tcl_Obj}
object if no Python equivalent exists.

@item 
Large octal and hex literals such as @code{0xffffffff} now trigger a
@ref{657,,FutureWarning}. Currently they’re stored as 32-bit numbers and result in a
negative value, but in Python 2.4 they’ll become positive long integers.

There are a few ways to fix this warning.  If you really need a positive number,
just add an @code{L} to the end of the literal.  If you’re trying to get a 32-bit
integer with low bits set and have previously used an expression such as @code{~(1
<< 31)}, it’s probably clearest to start with all bits set and clear the
desired upper bits. For example, to clear just the top bit (bit 31), you could
write @code{0xffffffffL &~(1L<<31)}.

@item 
You can no longer disable assertions by assigning to @code{__debug__}.

@item 
The Distutils @code{setup()} function has gained various new keyword arguments
such as `depends'.  Old versions of the Distutils will abort if passed unknown
keywords.  A solution is to check for the presence of the new
@code{get_distutil_options()} function in your @code{setup.py} and only uses the
new keywords with a version of the Distutils that supports them:

@example
from distutils import core

kw = @{'sources': 'foo.c', ...@}
if hasattr(core, 'get_distutil_options'):
    kw['depends'] = ['foo.h']
ext = Extension(**kw)
@end example

@item 
Using @code{None} as a variable name will now result in a @ref{1ae,,SyntaxWarning}
warning.

@item 
Names of extension types defined by the modules included with Python now
contain the module and a @code{'.'} in front of the type name.
@end itemize

@c ======================================================================

@node Acknowledgements<5>,,Porting to Python 2 3,What’s New in Python 2 3
@anchor{whatsnew/2 3 acknowledgements}@anchor{16e2}@anchor{whatsnew/2 3 acks}@anchor{16e3}
@subsection Acknowledgements


The author would like to thank the following people for offering suggestions,
corrections and assistance with various drafts of this article: Jeff Bauer,
Simon Brunning, Brett Cannon, Michael Chermside, Andrew Dalke, Scott David
Daniels, Fred L. Drake, Jr., David Fraser,  Kelly Gerber, Raymond Hettinger,
Michael Hudson, Chris Lambert, Detlef Lannert, Martin von Löwis, Andrew
MacIntyre, Lalo Martins, Chad Netzer, Gustavo Niemeyer, Neal Norwitz, Hans
Nowak, Chris Reedy, Francesco Ricciardi, Vinay Sajip, Neil Schemenauer, Roman
Suzi, Jason Tishler, Just van Rossum.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node What’s New in Python 2 2,What’s New in Python 2 1,What’s New in Python 2 3,파이썬의 새로운 기능
@anchor{whatsnew/2 2 doc}@anchor{16e4}@anchor{whatsnew/2 2 translation-repo}@anchor{16e5}@anchor{whatsnew/2 2 what-s-new-in-python-2-2}@anchor{16e6}
@section What’s New in Python 2.2


@*Author: 
A.M. Kuchling


@c $Id: whatsnew22.tex 37315 2004-09-10 19:33:00Z akuchling $

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

@end menu

@node Introduction,PEPs 252 and 253 Type and Class Changes,,What’s New in Python 2 2
@anchor{whatsnew/2 2 introduction}@anchor{16e7}
@subsection Introduction


This article explains the new features in Python 2.2.2, released on October 14,
2002.  Python 2.2.2 is a bugfix release of Python 2.2, originally released on
December 21, 2001.

Python 2.2 can be thought of as the “cleanup release”.  There are some features
such as generators and iterators that are completely new, but most of the
changes, significant and far-reaching though they may be, are aimed at cleaning
up irregularities and dark corners of the language design.

This article doesn’t attempt to provide a complete specification of the new
features, but instead provides a convenient overview.  For full details, you
should refer to the documentation for Python 2.2, such as the Python Library Reference@footnote{https://docs.python.org/2.2/lib/lib.html} and the Python Reference Manual@footnote{https://docs.python.org/2.2/ref/ref.html}.  If you want to
understand the complete implementation and design rationale for a change, refer
to the PEP for a particular new feature.

@c see also, now defunct
@c 
@c http://www.unixreview.com/documents/s=1356/urm0109h/0109h.htm
@c    "What's So Special About Python 2.2?" is also about the new 2.2 features, and
@c    was written by Cameron Laird and Kathryn Soraiz.

@c ======================================================================

@node PEPs 252 and 253 Type and Class Changes,PEP 234 Iterators,Introduction,What’s New in Python 2 2
@anchor{whatsnew/2 2 peps-252-and-253-type-and-class-changes}@anchor{16e8}
@subsection PEPs 252 and 253: Type and Class Changes


The largest and most far-reaching changes in Python 2.2 are to Python’s model of
objects and classes.  The changes should be backward compatible, so it’s likely
that your code will continue to run unchanged, but the changes provide some
amazing new capabilities. Before beginning this, the longest and most
complicated section of this article, I’ll provide an overview of the changes and
offer some comments.

A long time ago I wrote a web page listing flaws in Python’s design.  One of the
most significant flaws was that it’s impossible to subclass Python types
implemented in C.  In particular, it’s not possible to subclass built-in types,
so you can’t just subclass, say, lists in order to add a single useful method to
them. The @code{UserList} module provides a class that supports all of the
methods of lists and that can be subclassed further, but there’s lots of C code
that expects a regular Python list and won’t accept a @ref{16e9,,UserList}
instance.

Python 2.2 fixes this, and in the process adds some exciting new capabilities.
A brief summary:


@itemize *

@item 
You can subclass built-in types such as lists and even integers, and your
subclasses should work in every place that requires the original type.

@item 
It’s now possible to define static and class methods, in addition to the
instance methods available in previous versions of Python.

@item 
It’s also possible to automatically call methods on accessing or setting an
instance attribute by using a new mechanism called `properties'.  Many uses
of @ref{6f9,,__getattr__()} can be rewritten to use properties instead, making the
resulting code simpler and faster.  As a small side benefit, attributes can now
have docstrings, too.

@item 
The list of legal attributes for an instance can be limited to a particular
set using `slots', making it possible to safeguard against typos and
perhaps make more optimizations possible in future versions of Python.
@end itemize

Some users have voiced concern about all these changes.  Sure, they say, the new
features are neat and lend themselves to all sorts of tricks that weren’t
possible in previous versions of Python, but they also make the language more
complicated.  Some people have said that they’ve always recommended Python for
its simplicity, and feel that its simplicity is being lost.

Personally, I think there’s no need to worry.  Many of the new features are
quite esoteric, and you can write a lot of Python code without ever needed to be
aware of them.  Writing a simple class is no more difficult than it ever was, so
you don’t need to bother learning or teaching them unless they’re actually
needed.  Some very complicated tasks that were previously only possible from C
will now be possible in pure Python, and to my mind that’s all for the better.

I’m not going to attempt to cover every single corner case and small change that
were required to make the new features work.  Instead this section will paint
only the broad strokes.  See section @ref{16ea,,Related Links}, “Related Links”, for
further sources of information about Python 2.2’s new object model.

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

@end menu

@node Old and New Classes,Descriptors,,PEPs 252 and 253 Type and Class Changes
@anchor{whatsnew/2 2 old-and-new-classes}@anchor{16eb}
@subsubsection Old and New Classes


First, you should know that Python 2.2 really has two kinds of classes: classic
or old-style classes, and new-style classes.  The old-style class model is
exactly the same as the class model in earlier versions of Python.  All the new
features described in this section apply only to new-style classes. This
divergence isn’t intended to last forever; eventually old-style classes will be
dropped, possibly in Python 3.0.

So how do you define a new-style class?  You do it by subclassing an existing
new-style class.  Most of Python’s built-in types, such as integers, lists,
dictionaries, and even files, are new-style classes now.  A new-style class
named @ref{c7d,,object}, the base class for all built-in types, has also been
added so if no built-in type is suitable, you can just subclass
@code{object}:

@example
class C(object):
    def __init__ (self):
        ...
    ...
@end example

This means that @ref{14dc,,class} statements that don’t have any base classes are
always classic classes in Python 2.2.  (Actually you can also change this by
setting a module-level variable named @code{__metaclass__} — see 
@geindex Python 향상 제안; PEP 253
PEP 253@footnote{https://peps.python.org/pep-0253/}
for the details — but it’s easier to just subclass @ref{c7d,,object}.)

The type objects for the built-in types are available as built-ins, named using
a clever trick.  Python has always had built-in functions named @ref{19b,,int()},
@ref{196,,float()}, and @ref{169,,str()}.  In 2.2, they aren’t functions any more, but
type objects that behave as factories when called.

@example
>>> int
<type 'int'>
>>> int('123')
123
@end example

To make the set of types complete, new type objects such as @ref{183,,dict()} and
@code{file()} have been added.  Here’s a more interesting example, adding a
@code{lock()} method to file objects:

@example
class LockableFile(file):
    def lock (self, operation, length=0, start=0, whence=0):
        import fcntl
        return fcntl.lockf(self.fileno(), operation,
                           length, start, whence)
@end example

The now-obsolete @code{posixfile} module contained a class that emulated all of
a file object’s methods and also added a @code{lock()} method, but this class
couldn’t be passed to internal functions that expected a built-in file,
something which is possible with our new @code{LockableFile}.

@node Descriptors,Multiple Inheritance The Diamond Rule,Old and New Classes,PEPs 252 and 253 Type and Class Changes
@anchor{whatsnew/2 2 descriptors}@anchor{16ec}
@subsubsection Descriptors


In previous versions of Python, there was no consistent way to discover what
attributes and methods were supported by an object. There were some informal
conventions, such as defining @code{__members__} and @code{__methods__}
attributes that were lists of names, but often the author of an extension type
or a class wouldn’t bother to define them.  You could fall back on inspecting
the @ref{77c,,__dict__} of an object, but when class inheritance or an arbitrary
@code{__getattr__()} hook were in use this could still be inaccurate.

The one big idea underlying the new class model is that an API for describing
the attributes of an object using `descriptors' has been formalized.
Descriptors specify the value of an attribute, stating whether it’s a method or
a field.  With the descriptor API, static methods and class methods become
possible, as well as more exotic constructs.

Attribute descriptors are objects that live inside class objects, and have a few
attributes of their own:


@itemize *

@item 
@ref{1265,,__name__} is the attribute’s name.

@item 
@ref{b21,,__doc__} is the attribute’s docstring.

@item 
@code{__get__(object)} is a method that retrieves the attribute value from
`object'.

@item 
@code{__set__(object, value)} sets the attribute on `object' to `value'.

@item 
@code{__delete__(object, value)} deletes the `value'  attribute of `object'.
@end itemize

For example, when you write @code{obj.x}, the steps that Python actually performs
are:

@example
descriptor = obj.__class__.x
descriptor.__get__(obj)
@end example

For methods, @ref{16ed,,descriptor.__get__} returns a temporary
object that’s
callable, and wraps up the instance and the method to be called on it. This is
also why static methods and class methods are now possible; they have
descriptors that wrap up just the method, or the method and the class.  As a
brief explanation of these new kinds of methods, static methods aren’t passed
the instance, and therefore resemble regular functions.  Class methods are
passed the class of the object, but not the object itself.  Static and class
methods are defined like this:

@example
class C(object):
    def f(arg1, arg2):
        ...
    f = staticmethod(f)

    def g(cls, arg1, arg2):
        ...
    g = classmethod(g)
@end example

The @ref{453,,staticmethod()} function takes the function @code{f()}, and returns it
wrapped up in a descriptor so it can be stored in the class object.  You might
expect there to be special syntax for creating such methods (@code{def static f},
@code{defstatic f()}, or something like that) but no such syntax has been defined
yet; that’s been left for future versions of Python.

More new features, such as slots and properties, are also implemented as new
kinds of descriptors, and it’s not difficult to write a descriptor class that
does something novel.  For example, it would be possible to write a descriptor
class that made it possible to write Eiffel-style preconditions and
postconditions for a method.  A class that used this feature might be defined
like this:

@example
from eiffel import eiffelmethod

class C(object):
    def f(self, arg1, arg2):
        # The actual function
        ...
    def pre_f(self):
        # Check preconditions
        ...
    def post_f(self):
        # Check postconditions
        ...

    f = eiffelmethod(f, pre_f, post_f)
@end example

Note that a person using the new @code{eiffelmethod()} doesn’t have to understand
anything about descriptors.  This is why I think the new features don’t increase
the basic complexity of the language. There will be a few wizards who need to
know about it in order to write @code{eiffelmethod()} or the ZODB or whatever,
but most users will just write code on top of the resulting libraries and ignore
the implementation details.

@node Multiple Inheritance The Diamond Rule,Attribute Access,Descriptors,PEPs 252 and 253 Type and Class Changes
@anchor{whatsnew/2 2 multiple-inheritance-the-diamond-rule}@anchor{16ee}
@subsubsection Multiple Inheritance: The Diamond Rule


Multiple inheritance has also been made more useful through changing the rules
under which names are resolved.  Consider this set of classes (diagram taken
from 
@geindex Python 향상 제안; PEP 253
PEP 253@footnote{https://peps.python.org/pep-0253/} by Guido van Rossum):

@example
      class A:
        ^ ^  def save(self): ...
       /   \
      /     \
     /       \
    /         \
class B     class C:
    ^         ^  def save(self): ...
     \       /
      \     /
       \   /
        \ /
      class D
@end example

The lookup rule for classic classes is simple but not very smart; the base
classes are searched depth-first, going from left to right.  A reference to
@code{D.save()} will search the classes @code{D}, @code{B}, and then
@code{A}, where @code{save()} would be found and returned.  @code{C.save()}
would never be found at all.  This is bad, because if @code{C}’s @code{save()}
method is saving some internal state specific to @code{C}, not calling it will
result in that state never getting saved.

New-style classes follow a different algorithm that’s a bit more complicated to
explain, but does the right thing in this situation. (Note that Python 2.3
changes this algorithm to one that produces the same results in most cases, but
produces more useful results for really complicated inheritance graphs.)


@enumerate 

@item 
List all the base classes, following the classic lookup rule and include a
class multiple times if it’s visited repeatedly.  In the above example, the list
of visited classes is [@code{D}, @code{B}, @code{A}, @code{C},
@code{A}].

@item 
Scan the list for duplicated classes.  If any are found, remove all but one
occurrence, leaving the `last' one in the list.  In the above example, the list
becomes [@code{D}, @code{B}, @code{C}, @code{A}] after dropping
duplicates.
@end enumerate

Following this rule, referring to @code{D.save()} will return @code{C.save()},
which is the behaviour we’re after.  This lookup rule is the same as the one
followed by Common Lisp.  A new built-in function, @ref{1a6,,super()}, provides a way
to get at a class’s superclasses without having to reimplement Python’s
algorithm. The most commonly used form will be  @code{super(class, obj)}, which
returns  a bound superclass object (not the actual class object).  This form
will be used in methods to call a method in the superclass; for example,
@code{D}’s @code{save()} method would look like this:

@example
class D (B,C):
    def save (self):
        # Call superclass .save()
        super(D, self).save()
        # Save D's private information here
        ...
@end example

@ref{1a6,,super()} can also return unbound superclass objects when called as
@code{super(class)} or @code{super(class1, class2)}, but this probably won’t
often be useful.

@node Attribute Access,Related Links,Multiple Inheritance The Diamond Rule,PEPs 252 and 253 Type and Class Changes
@anchor{whatsnew/2 2 attribute-access}@anchor{16ef}
@subsubsection Attribute Access


A fair number of sophisticated Python classes define hooks for attribute access
using @ref{6f9,,__getattr__()}; most commonly this is done for convenience, to make
code more readable by automatically mapping an attribute access such as
@code{obj.parent} into a method call such as @code{obj.get_parent}.  Python 2.2 adds
some new ways of controlling attribute access.

First, @code{__getattr__(attr_name)} is still supported by new-style classes,
and nothing about it has changed.  As before, it will be called when an attempt
is made to access @code{obj.foo} and no attribute named @code{foo} is found in the
instance’s dictionary.

New-style classes also support a new method,
@code{__getattribute__(attr_name)}.  The difference between the two methods is
that @ref{dca,,__getattribute__()} is `always' called whenever any attribute is
accessed, while the old @ref{6f9,,__getattr__()} is only called if @code{foo} isn’t
found in the instance’s dictionary.

However, Python 2.2’s support for `properties' will often be a simpler way
to trap attribute references.  Writing a @code{__getattr__()} method is
complicated because to avoid recursion you can’t use regular attribute accesses
inside them, and instead have to mess around with the contents of
@ref{77c,,__dict__}. @ref{6f9,,__getattr__()} methods also end up being called by Python
when it checks for other methods such as @ref{82e,,__repr__()} or @code{__coerce__()},
and so have to be written with this in mind. Finally, calling a function on
every attribute access results in a sizable performance loss.

@ref{4b3,,property} is a new built-in type that packages up three functions that
get, set, or delete an attribute, and a docstring.  For example, if you want to
define a @code{size} attribute that’s computed, but also settable, you could
write:

@example
class C(object):
    def get_size (self):
        result = ... computation ...
        return result
    def set_size (self, size):
        ... compute something based on the size
        and set internal state appropriately ...

    # Define a property.  The 'delete this attribute'
    # method is defined as None, so the attribute
    # can't be deleted.
    size = property(get_size, set_size,
                    None,
                    "Storage size of this instance")
@end example

That is certainly clearer and easier to write than a pair of
@code{__getattr__()}/@code{__setattr__()} methods that check for the @code{size}
attribute and handle it specially while retrieving all other attributes from the
instance’s @ref{77c,,__dict__}.  Accesses to @code{size} are also the only ones
which have to perform the work of calling a function, so references to other
attributes run at their usual speed.

Finally, it’s possible to constrain the list of attributes that can be
referenced on an object using the new @ref{16f0,,__slots__} class attribute. Python
objects are usually very dynamic; at any time it’s possible to define a new
attribute on an instance by just doing @code{obj.new_attr=1}.   A new-style class
can define a class attribute named @code{__slots__} to limit the legal
attributes  to a particular set of names.  An example will make this clear:

@example
>>> class C(object):
...     __slots__ = ('template', 'name')
...
>>> obj = C()
>>> print obj.template
None
>>> obj.template = 'Test'
>>> print obj.template
Test
>>> obj.newattr = None
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
AttributeError: 'C' object has no attribute 'newattr'
@end example

Note how you get an @ref{5ee,,AttributeError} on the attempt to assign to an
attribute not listed in @ref{16f0,,__slots__}.

@node Related Links,,Attribute Access,PEPs 252 and 253 Type and Class Changes
@anchor{whatsnew/2 2 related-links}@anchor{16f1}@anchor{whatsnew/2 2 sect-rellinks}@anchor{16ea}
@subsubsection Related Links


This section has just been a quick overview of the new features, giving enough
of an explanation to start you programming, but many details have been
simplified or ignored.  Where should you go to get a more complete picture?

The @ref{16f2,,Descriptor Guide} is a lengthy tutorial introduction to
the descriptor features, written by Guido van Rossum. If my description has
whetted your appetite, go read this tutorial next, because it goes into much
more detail about the new features while still remaining quite easy to read.

Next, there are two relevant PEPs, 
@geindex Python 향상 제안; PEP 252
PEP 252@footnote{https://peps.python.org/pep-0252/} and 
@geindex Python 향상 제안; PEP 253
PEP 253@footnote{https://peps.python.org/pep-0253/}.  
@geindex Python 향상 제안; PEP 252
PEP 252@footnote{https://peps.python.org/pep-0252/} is
titled “Making Types Look More Like Classes”, and covers the descriptor API.
@geindex Python 향상 제안; PEP 253
PEP 253@footnote{https://peps.python.org/pep-0253/} is titled “Subtyping Built-in Types”, and describes the changes to
type objects that make it possible to subtype built-in objects.  
@geindex Python 향상 제안; PEP 253
PEP 253@footnote{https://peps.python.org/pep-0253/} is
the more complicated PEP of the two, and at a few points the necessary
explanations of types and meta-types may cause your head to explode.  Both PEPs
were written and implemented by Guido van Rossum, with substantial assistance
from the rest of the Zope Corp. team.

Finally, there’s the ultimate authority: the source code.  Most of the machinery
for the type handling is in @code{Objects/typeobject.c}, but you should only
resort to it after all other avenues have been exhausted, including posting a
question to python-list or python-dev.

@c ======================================================================

@node PEP 234 Iterators,PEP 255 Simple Generators<2>,PEPs 252 and 253 Type and Class Changes,What’s New in Python 2 2
@anchor{whatsnew/2 2 pep-234-iterators}@anchor{16f3}
@subsection PEP 234: Iterators


Another significant addition to 2.2 is an iteration interface at both the C and
Python levels.  Objects can define how they can be looped over by callers.

In Python versions up to 2.1, the usual way to make @code{for item in obj} work is
to define a @ref{588,,__getitem__()} method that looks something like this:

@example
def __getitem__(self, index):
    return <next item>
@end example

@ref{588,,__getitem__()} is more properly used to define an indexing operation on an
object so that you can write @code{obj[5]} to retrieve the sixth element.  It’s a
bit misleading when you’re using this only to support @ref{34a,,for} loops.
Consider some file-like object that wants to be looped over; the `index'
parameter is essentially meaningless, as the class probably assumes that a
series of @code{__getitem__()} calls will be made with `index' incrementing by
one each time.  In other words, the presence of the @code{__getitem__()} method
doesn’t mean that using @code{file[5]}  to randomly access the sixth element will
work, though it really should.

In Python 2.2, iteration can be implemented separately, and @ref{588,,__getitem__()}
methods can be limited to classes that really do support random access.  The
basic idea of iterators is  simple.  A new built-in function, @code{iter(obj)}
or @code{iter(C, sentinel)}, is used to get an iterator. @code{iter(obj)} returns
an iterator for the object `obj', while @code{iter(C, sentinel)} returns an
iterator that will invoke the callable object `C' until it returns `sentinel' to
signal that the iterator is done.

Python classes can define an @code{__iter__()} method, which should create and
return a new iterator for the object; if the object is its own iterator, this
method can just return @code{self}.  In particular, iterators will usually be their
own iterators.  Extension types implemented in C can implement a @ref{16f4,,tp_iter}
function in order to return an iterator, and extension types that want to behave
as iterators can define a @ref{16f5,,tp_iternext} function.

So, after all this, what do iterators actually do?  They have one required
method, @ref{9d8,,next()}, which takes no arguments and returns the next value.  When
there are no more values to be returned, calling @code{next()} should raise the
@ref{df4,,StopIteration} exception.

@example
>>> L = [1,2,3]
>>> i = iter(L)
>>> print i
<iterator object at 0x8116870>
>>> i.next()
1
>>> i.next()
2
>>> i.next()
3
>>> i.next()
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
StopIteration
>>>
@end example

In 2.2, Python’s @ref{34a,,for} statement no longer expects a sequence; it
expects something for which @ref{9d7,,iter()} will return an iterator. For backward
compatibility and convenience, an iterator is automatically constructed for
sequences that don’t implement @code{__iter__()} or a @ref{16f4,,tp_iter} slot, so
@code{for i in [1,2,3]} will still work.  Wherever the Python interpreter loops
over a sequence, it’s been changed to use the iterator protocol.  This means you
can do things like this:

@example
>>> L = [1,2,3]
>>> i = iter(L)
>>> a,b,c = i
>>> a,b,c
(1, 2, 3)
@end example

Iterator support has been added to some of Python’s basic types.   Calling
@ref{9d7,,iter()} on a dictionary will return an iterator which loops over its keys:

@example
>>> m = @{'Jan': 1, 'Feb': 2, 'Mar': 3, 'Apr': 4, 'May': 5, 'Jun': 6,
...      'Jul': 7, 'Aug': 8, 'Sep': 9, 'Oct': 10, 'Nov': 11, 'Dec': 12@}
>>> for key in m: print key, m[key]
...
Mar 3
Feb 2
Aug 8
Sep 9
May 5
Jun 6
Jul 7
Jan 1
Apr 4
Nov 11
Dec 12
Oct 10
@end example

That’s just the default behaviour.  If you want to iterate over keys, values, or
key/value pairs, you can explicitly call the @code{iterkeys()},
@code{itervalues()}, or @code{iteritems()} methods to get an appropriate iterator.
In a minor related change, the @ref{34b,,in} operator now works on dictionaries,
so @code{key in dict} is now equivalent to @code{dict.has_key(key)}.

Files also provide an iterator, which calls the @ref{bf,,readline()} method until
there are no more lines in the file.  This means you can now read each line of a
file using code like this:

@example
for line in file:
    # do something for each line
    ...
@end example

Note that you can only go forward in an iterator; there’s no way to get the
previous element, reset the iterator, or make a copy of it. An iterator object
could provide such additional capabilities, but the iterator protocol only
requires a @ref{9d8,,next()} method.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 234

@item PEP 234@footnote{https://peps.python.org/pep-0234/} - Iterators

Written by Ka-Ping Yee and GvR; implemented  by the Python Labs crew, mostly by
GvR and Tim Peters.
@end table


@c ======================================================================

@node PEP 255 Simple Generators<2>,PEP 237 Unifying Long Integers and Integers<2>,PEP 234 Iterators,What’s New in Python 2 2
@anchor{whatsnew/2 2 pep-255-simple-generators}@anchor{16f6}
@subsection PEP 255: Simple Generators


Generators are another new feature, one that interacts with the introduction of
iterators.

You’re doubtless familiar with how function calls work in Python or C.  When you
call a function, it gets a private namespace where its local variables are
created.  When the function reaches a @ref{1af,,return} statement, the local
variables are destroyed and the resulting value is returned to the caller.  A
later call to the same function will get a fresh new set of local variables.
But, what if the local variables weren’t thrown away on exiting a function?
What if you could later resume the function where it left off?  This is what
generators provide; they can be thought of as resumable functions.

Here’s the simplest example of a generator function:

@example
def generate_ints(N):
    for i in range(N):
        yield i
@end example

A new keyword, @ref{bc1,,yield}, was introduced for generators.  Any function
containing a @code{yield} statement is a generator function; this is
detected by Python’s bytecode compiler which compiles the function specially as
a result.  Because a new keyword was introduced, generators must be explicitly
enabled in a module by including a @code{from __future__ import generators}
statement near the top of the module’s source code.  In Python 2.3 this
statement will become unnecessary.

When you call a generator function, it doesn’t return a single value; instead it
returns a generator object that supports the iterator protocol.  On executing
the @ref{bc1,,yield} statement, the generator outputs the value of @code{i},
similar to a @ref{1af,,return} statement.  The big difference between
@code{yield} and a @code{return} statement is that on reaching a
@code{yield} the generator’s state of execution is suspended and local
variables are preserved.  On the next call to the generator’s @code{next()} method,
the function will resume executing immediately after the @code{yield}
statement.  (For complicated reasons, the @code{yield} statement isn’t
allowed inside the @code{try} block of a
@ref{8f7,,try}…@ref{1b0,,finally} statement; read 
@geindex Python 향상 제안; PEP 255
PEP 255@footnote{https://peps.python.org/pep-0255/} for a full
explanation of the interaction between @code{yield} and exceptions.)

Here’s a sample usage of the @code{generate_ints()} generator:

@example
>>> gen = generate_ints(3)
>>> gen
<generator object at 0x8117f90>
>>> gen.next()
0
>>> gen.next()
1
>>> gen.next()
2
>>> gen.next()
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
  File "<stdin>", line 2, in generate_ints
StopIteration
@end example

You could equally write @code{for i in generate_ints(5)}, or @code{a,b,c =
generate_ints(3)}.

Inside a generator function, the @ref{1af,,return} statement can only be used
without a value, and signals the end of the procession of values; afterwards the
generator cannot return any further values. @code{return} with a value, such
as @code{return 5}, is a syntax error inside a generator function.  The end of the
generator’s results can also be indicated by raising @ref{df4,,StopIteration}
manually, or by just letting the flow of execution fall off the bottom of the
function.

You could achieve the effect of generators manually by writing your own class
and storing all the local variables of the generator as instance variables.  For
example, returning a list of integers could be done by setting @code{self.count} to
0, and having the @ref{9d8,,next()} method increment @code{self.count} and return it.
However, for a moderately complicated generator, writing a corresponding class
would be much messier. @code{Lib/test/test_generators.py} contains a number of
more interesting examples.  The simplest one implements an in-order traversal of
a tree using generators recursively.

@example
# A recursive generator that generates Tree leaves in in-order.
def inorder(t):
    if t:
        for x in inorder(t.left):
            yield x
        yield t.label
        for x in inorder(t.right):
            yield x
@end example

Two other examples in @code{Lib/test/test_generators.py} produce solutions for
the N-Queens problem (placing $N$ queens on an $NxN$ chess board so that no
queen threatens another) and the Knight’s Tour (a route that takes a knight to
every square of an $NxN$ chessboard without visiting any square twice).

The idea of generators comes from other programming languages, especially Icon
(@indicateurl{https://www2.cs.arizona.edu/icon/}), where the idea of generators is central.  In
Icon, every expression and function call behaves like a generator.  One example
from “An Overview of the Icon Programming Language” at
@indicateurl{https://www2.cs.arizona.edu/icon/docs/ipd266.htm} gives an idea of what this looks
like:

@example
sentence := "Store it in the neighboring harbor"
if (i := find("or", sentence)) > 5 then write(i)
@end example

In Icon the @code{find()} function returns the indexes at which the substring
“or” is found: 3, 23, 33.  In the @ref{181,,if} statement, @code{i} is first
assigned a value of 3, but 3 is less than 5, so the comparison fails, and Icon
retries it with the second value of 23.  23 is greater than 5, so the comparison
now succeeds, and the code prints the value 23 to the screen.

Python doesn’t go nearly as far as Icon in adopting generators as a central
concept.  Generators are considered a new part of the core Python language, but
learning or using them isn’t compulsory; if they don’t solve any problems that
you have, feel free to ignore them. One novel feature of Python’s interface as
compared to Icon’s is that a generator’s state is represented as a concrete
object (the iterator) that can be passed around to other functions or stored in
a data structure.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 255

@item PEP 255@footnote{https://peps.python.org/pep-0255/} - Simple Generators

Written by Neil Schemenauer, Tim Peters, Magnus Lie Hetland.  Implemented mostly
by Neil Schemenauer and Tim Peters, with other fixes from the Python Labs crew.
@end table


@c ======================================================================

@node PEP 237 Unifying Long Integers and Integers<2>,PEP 238 Changing the Division Operator,PEP 255 Simple Generators<2>,What’s New in Python 2 2
@anchor{whatsnew/2 2 pep-237-unifying-long-integers-and-integers}@anchor{16f7}
@subsection PEP 237: Unifying Long Integers and Integers


In recent versions, the distinction between regular integers, which are 32-bit
values on most machines, and long integers, which can be of arbitrary size, was
becoming an annoyance.  For example, on platforms that support files larger than
@code{2**32} bytes, the @code{tell()} method of file objects has to return a long
integer. However, there were various bits of Python that expected plain integers
and would raise an error if a long integer was provided instead.  For example,
in Python 1.5, only regular integers could be used as a slice index, and
@code{'abc'[1L:]} would raise a @ref{198,,TypeError} exception with the message ‘slice
index must be int’.

Python 2.2 will shift values from short to long integers as required. The ‘L’
suffix is no longer needed to indicate a long integer literal, as now the
compiler will choose the appropriate type.  (Using the ‘L’ suffix will be
discouraged in future 2.x versions of Python, triggering a warning in Python
2.4, and probably dropped in Python 3.0.)  Many operations that used to raise an
@ref{a81,,OverflowError} will now return a long integer as their result.  For
example:

@example
>>> 1234567890123
1234567890123L
>>> 2 ** 64
18446744073709551616L
@end example

In most cases, integers and long integers will now be treated identically.  You
can still distinguish them with the @ref{f43,,type()} built-in function, but that’s
rarely needed.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 237

@item PEP 237@footnote{https://peps.python.org/pep-0237/} - Unifying Long Integers and Integers

Written by Moshe Zadka and Guido van Rossum.  Implemented mostly by Guido van
Rossum.
@end table


@c ======================================================================

@node PEP 238 Changing the Division Operator,Unicode Changes,PEP 237 Unifying Long Integers and Integers<2>,What’s New in Python 2 2
@anchor{whatsnew/2 2 pep-238-changing-the-division-operator}@anchor{16f8}
@subsection PEP 238: Changing the Division Operator


The most controversial change in Python 2.2 heralds the start of an effort to
fix an old design flaw that’s been in Python from the beginning. Currently
Python’s division operator, @code{/}, behaves like C’s division operator when
presented with two integer arguments: it returns an integer result that’s
truncated down when there would be a fractional part.  For example, @code{3/2} is
1, not 1.5, and @code{(-1)/2} is -1, not -0.5.  This means that the results of
division can vary unexpectedly depending on the type of the two operands and
because Python is dynamically typed, it can be difficult to determine the
possible types of the operands.

(The controversy is over whether this is `really' a design flaw, and whether
it’s worth breaking existing code to fix this.  It’s caused endless discussions
on python-dev, and in July 2001 erupted into a storm of acidly sarcastic
postings on @code{comp.lang.python}. I won’t argue for either side here
and will stick to describing what’s  implemented in 2.2.  Read 
@geindex Python 향상 제안; PEP 238
PEP 238@footnote{https://peps.python.org/pep-0238/} for a
summary of arguments and counter-arguments.)

Because this change might break code, it’s being introduced very gradually.
Python 2.2 begins the transition, but the switch won’t be complete until Python
3.0.

First, I’ll borrow some terminology from 
@geindex Python 향상 제안; PEP 238
PEP 238@footnote{https://peps.python.org/pep-0238/}.  “True division” is the
division that most non-programmers are familiar with: 3/2 is 1.5, 1/4 is 0.25,
and so forth.  “Floor division” is what Python’s @code{/} operator currently does
when given integer operands; the result is the floor of the value returned by
true division.  “Classic division” is the current mixed behaviour of @code{/}; it
returns the result of floor division when the operands are integers, and returns
the result of true division when one of the operands is a floating-point number.

Here are the changes 2.2 introduces:


@itemize *

@item 
A new operator, @code{//}, is the floor division operator. (Yes, we know it looks
like C++’s comment symbol.)  @code{//} `always' performs floor division no matter
what the types of its operands are, so @code{1 // 2} is 0 and @code{1.0 // 2.0} is
also 0.0.

@code{//} is always available in Python 2.2; you don’t need to enable it using a
@code{__future__} statement.

@item 
By including a @code{from __future__ import division} in a module, the @code{/}
operator will be changed to return the result of true division, so @code{1/2} is
0.5.  Without the @code{__future__} statement, @code{/} still means classic division.
The default meaning of @code{/} will not change until Python 3.0.

@item 
Classes can define methods called @ref{108f,,__truediv__()} and @ref{16f9,,__floordiv__()}
to overload the two division operators.  At the C level, there are also slots in
the @ref{1623,,PyNumberMethods} structure so extension types can define the two
operators.

@item 
Python 2.2 supports some command-line arguments for testing whether code will
work with the changed division semantics.  Running python with @code{-Q
warn} will cause a warning to be issued whenever division is applied to two
integers.  You can use this to find code that’s affected by the change and fix
it.  By default, Python 2.2 will simply perform classic division without a
warning; the warning will be turned on by default in Python 2.3.
@end itemize


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 238

@item PEP 238@footnote{https://peps.python.org/pep-0238/} - Changing the Division Operator

Written by Moshe Zadka and  Guido van Rossum.  Implemented by Guido van Rossum..
@end table


@c ======================================================================

@node Unicode Changes,PEP 227 Nested Scopes,PEP 238 Changing the Division Operator,What’s New in Python 2 2
@anchor{whatsnew/2 2 unicode-changes}@anchor{16fa}
@subsection Unicode Changes


Python’s Unicode support has been enhanced a bit in 2.2.  Unicode strings are
usually stored as UCS-2, as 16-bit unsigned integers. Python 2.2 can also be
compiled to use UCS-4, 32-bit unsigned integers, as its internal encoding by
supplying @code{--enable-unicode=ucs4} to the configure script.   (It’s also
possible to specify @code{--disable-unicode} to completely disable Unicode
support.)

When built to use UCS-4 (a “wide Python”), the interpreter can natively handle
Unicode characters from U+000000 to U+110000, so the range of legal values for
the @code{unichr()} function is expanded accordingly.  Using an interpreter
compiled to use UCS-2 (a “narrow Python”), values greater than 65535 will still
cause @code{unichr()} to raise a @ref{2ec,,ValueError} exception. This is all
described in 
@geindex Python 향상 제안; PEP 261
PEP 261@footnote{https://peps.python.org/pep-0261/}, “Support for ‘wide’ Unicode characters”; consult it for
further details.

Another change is simpler to explain. Since their introduction, Unicode strings
have supported an @code{encode()} method to convert the string to a selected
encoding such as UTF-8 or Latin-1.  A symmetric @code{decode([*encoding*])}
method has been added to 8-bit strings (though not to Unicode strings) in 2.2.
@code{decode()} assumes that the string is in the specified encoding and decodes
it, returning whatever is returned by the codec.

Using this new feature, codecs have been added for tasks not directly related to
Unicode.  For example, codecs have been added for uu-encoding, MIME’s base64
encoding, and compression with the @ref{139,,zlib} module:

@example
>>> s = """Here is a lengthy piece of redundant, overly verbose,
... and repetitive text.
... """
>>> data = s.encode('zlib')
>>> data
'x\x9c\r\xc9\xc1\r\x80 \x10\x04\xc0?Ul...'
>>> data.decode('zlib')
'Here is a lengthy piece of redundant, overly verbose,\nand repetitive text.\n'
>>> print s.encode('uu')
begin 666 <data>
M2&5R92!I<R!A(&QE;F=T:'D@@<&EE8V4@@;V8@@<F5D=6YD86YT+"!O=F5R;'D@@
>=F5R8F]S92P*86YD(')E<&5T:71I=F4@@=&5X="X*

end
>>> "sheesh".encode('rot-13')
'furrfu'
@end example

To convert a class instance to Unicode, a @code{__unicode__()} method can be
defined by a class, analogous to @code{__str__()}.

@code{encode()}, @code{decode()}, and @code{__unicode__()} were implemented by
Marc-André Lemburg.  The changes to support using UCS-4 internally were
implemented by Fredrik Lundh and Martin von Löwis.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 261

@item PEP 261@footnote{https://peps.python.org/pep-0261/} - Support for ‘wide’ Unicode characters

Written by Paul Prescod.
@end table


@c ======================================================================

@node PEP 227 Nested Scopes,New and Improved Modules<3>,Unicode Changes,What’s New in Python 2 2
@anchor{whatsnew/2 2 pep-227-nested-scopes}@anchor{16fb}
@subsection PEP 227: Nested Scopes


In Python 2.1, statically nested scopes were added as an optional feature, to be
enabled by a @code{from __future__ import nested_scopes} directive.  In 2.2 nested
scopes no longer need to be specially enabled, and are now always present.  The
rest of this section is a copy of the description of nested scopes from my
“What’s New in Python 2.1” document; if you read it when 2.1 came out, you can
skip the rest of this section.

The largest change introduced in Python 2.1, and made complete in 2.2, is to
Python’s scoping rules.  In Python 2.0, at any given time there are at most
three namespaces used to look up variable names: local, module-level, and the
built-in namespace.  This often surprised people because it didn’t match their
intuitive expectations.  For example, a nested recursive function definition
doesn’t work:

@example
def f():
    ...
    def g(value):
        ...
        return g(value-1) + 1
    ...
@end example

The function @code{g()} will always raise a @ref{452,,NameError} exception, because
the binding of the name @code{g} isn’t in either its local namespace or in the
module-level namespace.  This isn’t much of a problem in practice (how often do
you recursively define interior functions like this?), but this also made using
the @ref{14a2,,lambda} expression clumsier, and this was a problem in practice.
In code which uses @code{lambda} you can often find local variables being
copied by passing them as the default values of arguments.

@example
def find(self, name):
    "Return list of any entries equal to 'name'"
    L = filter(lambda x, name=name: x == name,
               self.list_attribute)
    return L
@end example

The readability of Python code written in a strongly functional style suffers
greatly as a result.

The most significant change to Python 2.2 is that static scoping has been added
to the language to fix this problem.  As a first effect, the @code{name=name}
default argument is now unnecessary in the above example.  Put simply, when a
given variable name is not assigned a value within a function (by an assignment,
or the @ref{165f,,def}, @ref{14dc,,class}, or @ref{7f7,,import} statements),
references to the variable will be looked up in the local namespace of the
enclosing scope.  A more detailed explanation of the rules, and a dissection of
the implementation, can be found in the PEP.

This change may cause some compatibility problems for code where the same
variable name is used both at the module level and as a local variable within a
function that contains further function definitions. This seems rather unlikely
though, since such code would have been pretty confusing to read in the first
place.

One side effect of the change is that the @code{from module import *} and
@code{exec} statements have been made illegal inside a function scope under
certain conditions.  The Python reference manual has said all along that @code{from
module import *} is only legal at the top level of a module, but the CPython
interpreter has never enforced this before.  As part of the implementation of
nested scopes, the compiler which turns Python source into bytecodes has to
generate different code to access variables in a containing scope.  @code{from
module import *} and @code{exec} make it impossible for the compiler to
figure this out, because they add names to the local namespace that are
unknowable at compile time. Therefore, if a function contains function
definitions or @ref{14a2,,lambda} expressions with free variables, the compiler
will flag this by raising a @ref{18e,,SyntaxError} exception.

To make the preceding explanation a bit clearer, here’s an example:

@example
x = 1
def f():
    # The next line is a syntax error
    exec 'x=2'
    def g():
        return x
@end example

Line 4 containing the @code{exec} statement is a syntax error, since
@code{exec} would define a new local variable named @code{x} whose value should
be accessed by @code{g()}.

This shouldn’t be much of a limitation, since @code{exec} is rarely used in
most Python code (and when it is used, it’s often a sign of a poor design
anyway).


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 227

@item PEP 227@footnote{https://peps.python.org/pep-0227/} - Statically Nested Scopes

Written and implemented by Jeremy Hylton.
@end table


@c ======================================================================

@node New and Improved Modules<3>,Interpreter Changes and Fixes,PEP 227 Nested Scopes,What’s New in Python 2 2
@anchor{whatsnew/2 2 new-and-improved-modules}@anchor{16fc}
@subsection New and Improved Modules



@itemize *

@item 
The @ref{134,,xmlrpclib} module was contributed to the standard library by Fredrik
Lundh, providing support for writing XML-RPC clients.  XML-RPC is a simple
remote procedure call protocol built on top of HTTP and XML. For example, the
following snippet retrieves a list of RSS channels from the O’Reilly Network,
and then  lists the recent headlines for one channel:

@example
import xmlrpclib
s = xmlrpclib.Server(
      'http://www.oreillynet.com/meerkat/xml-rpc/server.php')
channels = s.meerkat.getChannels()
# channels is a list of dictionaries, like this:
# [@{'id': 4, 'title': 'Freshmeat Daily News'@}
#  @{'id': 190, 'title': '32Bits Online'@},
#  @{'id': 4549, 'title': '3DGamers'@}, ... ]

# Get the items for one channel
items = s.meerkat.getItems( @{'channel': 4@} )

# 'items' is another list of dictionaries, like this:
# [@{'link': 'http://freshmeat.net/releases/52719/',
#   'description': 'A utility which converts HTML to XSL FO.',
#   'title': 'html2fo 0.3 (Default)'@}, ... ]
@end example

The @ref{135,,SimpleXMLRPCServer} module makes it easy to create straightforward
XML-RPC servers.  See @indicateurl{http://xmlrpc.scripting.com/} for more information about XML-RPC.

@item 
The new @ref{6e,,hmac} module implements the HMAC algorithm described by
@geindex RFC; RFC 2104
RFC 2104@footnote{https://datatracker.ietf.org/doc/html/rfc2104.html}. (Contributed by Gerhard Häring.)

@item 
Several functions that originally returned lengthy tuples now return
pseudo-sequences that still behave like tuples but also have mnemonic attributes such
as @code{memberst_mtime} or @ref{16fd,,tm_year}. The enhanced functions include
@ref{26d,,stat()}, @ref{f8b,,fstat()}, @ref{1301,,statvfs()}, and @ref{f8c,,fstatvfs()} in the
@ref{a5,,os} module, and @ref{16fe,,localtime()}, @ref{13c5,,gmtime()}, and @ref{1632,,strptime()} in
the @ref{f4,,time} module.

For example, to obtain a file’s size using the old tuples, you’d end up writing
something like @code{file_size = os.stat(filename)[stat.ST_SIZE]}, but now this can
be written more clearly as @code{file_size = os.stat(filename).st_size}.

The original patch for this feature was contributed by Nick Mathewson.

@item 
The Python profiler has been extensively reworked and various errors in its
output have been corrected.  (Contributed by Fred L. Drake, Jr. and Tim Peters.)

@item 
The @ref{d1,,socket} module can be compiled to support IPv6; specify the
@code{--enable-ipv6} option to Python’s configure script.  (Contributed by
Jun-ichiro “itojun” Hagino.)

@item 
Two new format characters were added to the @ref{db,,struct} module for 64-bit
integers on platforms that support the C long long type.  @code{q} is for
a signed 64-bit integer, and @code{Q} is for an unsigned one.  The value is
returned in Python’s long integer type.  (Contributed by Tim Peters.)

@item 
In the interpreter’s interactive mode, there’s a new built-in function
@ref{ad4,,help()} that uses the @ref{ba,,pydoc} module introduced in Python 2.1 to
provide interactive help. @code{help(object)} displays any available help text
about `object'.  @code{help()} with no argument puts you in an online help
utility, where you can enter the names of functions, classes, or modules to read
their help text. (Contributed by Guido van Rossum, using Ka-Ping Yee’s
@code{pydoc} module.)

@item 
Various bugfixes and performance improvements have been made to the SRE engine
underlying the @ref{be,,re} module.  For example, the @ref{5a2,,re.sub()} and
@ref{5a1,,re.split()} functions have been rewritten in C.  Another contributed patch
speeds up certain Unicode character ranges by a factor of two, and a new
@ref{16ff,,finditer()}  method that returns an iterator over all the non-overlapping
matches in  a given string.  (SRE is maintained by Fredrik Lundh.  The
BIGCHARSET patch was contributed by Martin von Löwis.)

@item 
The @ref{cf,,smtplib} module now supports 
@geindex RFC; RFC 2487
RFC 2487@footnote{https://datatracker.ietf.org/doc/html/rfc2487.html}, “Secure SMTP over TLS”, so
it’s now possible to encrypt the SMTP traffic between a Python program and the
mail transport agent being handed a message.  @code{smtplib} also supports SMTP
authentication.  (Contributed by Gerhard Häring.)

@item 
The @ref{78,,imaplib} module, maintained by Piers Lauder, has support for several
new extensions: the NAMESPACE extension defined in 
@geindex RFC; RFC 2342
RFC 2342@footnote{https://datatracker.ietf.org/doc/html/rfc2342.html}, SORT, GETACL and
SETACL.  (Contributed by Anthony Baxter and Michel Pelletier.)

@item 
The @code{rfc822} module’s parsing of email addresses is now compliant with
@geindex RFC; RFC 2822
RFC 2822@footnote{https://datatracker.ietf.org/doc/html/rfc2822.html}, an update to 
@geindex RFC; RFC 822
RFC 822@footnote{https://datatracker.ietf.org/doc/html/rfc822.html}.  (The module’s name is `not' going to be
changed to @code{rfc2822}.)  A new package, @ref{3f,,email}, has also been added for
parsing and generating e-mail messages.  (Contributed by Barry Warsaw, and
arising out of his work on Mailman.)

@item 
The @ref{3b,,difflib} module now contains a new @code{Differ} class for
producing human-readable lists of changes (a “delta”) between two sequences of
lines of text.  There are also two generator functions, @code{ndiff()} and
@code{restore()}, which respectively return a delta from two sequences, or one of
the original sequences from a delta. (Grunt work contributed by David Goodger,
from ndiff.py code by Tim Peters who then did the generatorization.)

@item 
New constants @code{ascii_letters}, @code{ascii_lowercase}, and
@code{ascii_uppercase} were added to the @ref{d8,,string} module.  There were
several modules in the standard library that used @code{string.letters} to
mean the ranges A-Za-z, but that assumption is incorrect when locales are in
use, because @code{string.letters} varies depending on the set of legal
characters defined by the current locale.  The buggy modules have all been fixed
to use @code{ascii_letters} instead. (Reported by an unknown person; fixed by
Fred L. Drake, Jr.)

@item 
The @ref{93,,mimetypes} module now makes it easier to use alternative MIME-type
databases by the addition of a @ref{1700,,MimeTypes} class, which takes a list of
filenames to be parsed.  (Contributed by Fred L. Drake, Jr.)

@item 
A @ref{135e,,Timer} class was added to the @ref{f3,,threading} module that allows
scheduling an activity to happen at some future time.  (Contributed by Itamar
Shtull-Trauring.)
@end itemize

@c ======================================================================

@node Interpreter Changes and Fixes,Other Changes and Fixes<3>,New and Improved Modules<3>,What’s New in Python 2 2
@anchor{whatsnew/2 2 interpreter-changes-and-fixes}@anchor{1701}
@subsection Interpreter Changes and Fixes


Some of the changes only affect people who deal with the Python interpreter at
the C level because they’re writing Python extension modules, embedding the
interpreter, or just hacking on the interpreter itself. If you only write Python
code, none of the changes described here will affect you very much.


@itemize *

@item 
Profiling and tracing functions can now be implemented in C, which can operate
at much higher speeds than Python-based functions and should reduce the overhead
of profiling and tracing.  This  will be of interest to authors of development
environments for Python.  Two new C functions were added to Python’s API,
@ref{1702,,PyEval_SetProfile()} and @ref{661,,PyEval_SetTrace()}. The existing
@ref{1703,,sys.setprofile()} and @ref{2e1,,sys.settrace()} functions still exist, and have
simply been changed to use the new C-level interface.  (Contributed by Fred L.
Drake, Jr.)

@item 
Another low-level API, primarily of interest to implementers of Python
debuggers and development tools, was added. @ref{1704,,PyInterpreterState_Head()} and
@ref{1705,,PyInterpreterState_Next()} let a caller walk through all the existing
interpreter objects; @ref{1706,,PyInterpreterState_ThreadHead()} and
@ref{1707,,PyThreadState_Next()} allow looping over all the thread states for a given
interpreter.  (Contributed by David Beazley.)

@item 
The C-level interface to the garbage collector has been changed to make it
easier to write extension types that support garbage collection and to debug
misuses of the functions. Various functions have slightly different semantics,
so a bunch of functions had to be renamed.  Extensions that use the old API will
still compile but will `not' participate in garbage collection, so updating them
for 2.2 should be considered fairly high priority.

To upgrade an extension module to the new API, perform the following steps:

@item 
Rename @code{Py_TPFLAGS_GC} to @ref{980,,Py_TPFLAGS_HAVE_GC}.

@item 

@table @asis

@item Use @ref{c98,,PyObject_GC_New()} or @ref{c99,,PyObject_GC_NewVar()} to allocate

objects, and @ref{1708,,PyObject_GC_Del()} to deallocate them.
@end table

@item 
Rename @code{PyObject_GC_Init()} to @ref{1709,,PyObject_GC_Track()} and
@code{PyObject_GC_Fini()} to @ref{170a,,PyObject_GC_UnTrack()}.

@item 
Remove @code{PyGC_HEAD_SIZE} from object size calculations.

@item 
Remove calls to @code{PyObject_AS_GC()} and @code{PyObject_FROM_GC()}.

@item 
A new @code{et} format sequence was added to @ref{3c1,,PyArg_ParseTuple()}; @code{et}
takes both a parameter and an encoding name, and converts the parameter to the
given encoding if the parameter turns out to be a Unicode string, or leaves it
alone if it’s an 8-bit string, assuming it to already be in the desired
encoding.  This differs from the @code{es} format character, which assumes that
8-bit strings are in Python’s default ASCII encoding and converts them to the
specified new encoding. (Contributed by M.-A. Lemburg, and used for the MBCS
support on Windows described in the following section.)

@item 
A different argument parsing function, @ref{170b,,PyArg_UnpackTuple()}, has been
added that’s simpler and presumably faster.  Instead of specifying a format
string, the caller simply gives the minimum and maximum number of arguments
expected, and a set of pointers to @ref{5dc,,PyObject}* variables that will be
filled in with argument values.

@item 
Two new flags @ref{16d9,,METH_NOARGS} and @ref{170c,,METH_O} are available in method
definition tables to simplify implementation of methods with no arguments or a
single untyped argument. Calling such methods is more efficient than calling a
corresponding method that uses @ref{170d,,METH_VARARGS}.  Also, the old
@code{METH_OLDARGS} style of writing C methods is  now officially deprecated.

@item 
Two new wrapper functions, @ref{170e,,PyOS_snprintf()} and @ref{170f,,PyOS_vsnprintf()}
were added to provide  cross-platform implementations for the relatively new
@code{snprintf()} and @code{vsnprintf()} C lib APIs. In contrast to the standard
@code{sprintf()} and @code{vsprintf()} functions, the Python versions check the
bounds of the buffer used to protect against buffer overruns. (Contributed by
M.-A. Lemburg.)

@item 
The @ref{1710,,_PyTuple_Resize()} function has lost an unused parameter, so now it
takes 2 parameters instead of 3.  The third argument was never used, and can
simply be discarded when porting code from earlier versions to Python 2.2.
@end itemize

@c ======================================================================

@node Other Changes and Fixes<3>,Acknowledgements<6>,Interpreter Changes and Fixes,What’s New in Python 2 2
@anchor{whatsnew/2 2 other-changes-and-fixes}@anchor{1711}
@subsection Other Changes and Fixes


As usual there were a bunch of other improvements and bugfixes scattered
throughout the source tree.  A search through the CVS change logs finds there
were 527 patches applied and 683 bugs fixed between Python 2.1 and 2.2; 2.2.1
applied 139 patches and fixed 143 bugs; 2.2.2 applied 106 patches and fixed 82
bugs.  These figures are likely to be underestimates.

Some of the more notable changes are:


@itemize *

@item 
The code for the MacOS port for Python, maintained by Jack Jansen, is now kept
in the main Python CVS tree, and many changes have been made to support MacOS X.

The most significant change is the ability to build Python as a framework,
enabled by supplying the @code{--enable-framework} option to the configure
script when compiling Python.  According to Jack Jansen, “This installs a
self-contained Python installation plus the OS X framework “glue” into
@code{/Library/Frameworks/Python.framework} (or another location of choice).
For now there is little immediate added benefit to this (actually, there is the
disadvantage that you have to change your PATH to be able to find Python), but
it is the basis for creating a full-blown Python application, porting the
MacPython IDE, possibly using Python as a standard OSA scripting language and
much more.”

Most of the MacPython toolbox modules, which interface to MacOS APIs such as
windowing, QuickTime, scripting, etc. have been ported to OS X, but they’ve been
left commented out in @code{setup.py}.  People who want to experiment with
these modules can uncomment them manually.

@c Jack's original comments:
@c The main change is the possibility to build Python as a
@c framework. This installs a self-contained Python installation plus the
@c OSX framework "glue" into /Library/Frameworks/Python.framework (or
@c another location of choice). For now there is little immediate added
@c benefit to this (actually, there is the disadvantage that you have to
@c change your PATH to be able to find Python), but it is the basis for
@c creating a fullblown Python application, porting the MacPython IDE,
@c possibly using Python as a standard OSA scripting language and much
@c more. You enable this with "configure --enable-framework".
@c The other change is that most MacPython toolbox modules, which
@c interface to all the MacOS APIs such as windowing, quicktime,
@c scripting, etc. have been ported. Again, most of these are not of
@c immediate use, as they need a full application to be really useful, so
@c they have been commented out in setup.py. People wanting to experiment
@c can uncomment them. Gestalt and Internet Config modules are enabled by
@c default.

@item 
Keyword arguments passed to built-in functions that don’t take them now cause a
@ref{198,,TypeError} exception to be raised, with the message “`function' takes no
keyword arguments”.

@item 
Weak references, added in Python 2.1 as an extension module, are now part of
the core because they’re used in the implementation of new-style classes.  The
@ref{1712,,ReferenceError} exception has therefore moved from the @ref{11a,,weakref}
module to become a built-in exception.

@item 
A new script, @code{Tools/scripts/cleanfuture.py} by Tim Peters,
automatically removes obsolete @code{__future__} statements from Python source
code.

@item 
An additional `flags' argument has been added to the built-in function
@ref{4b2,,compile()}, so the behaviour of @code{__future__} statements can now be
correctly observed in simulated shells, such as those presented by IDLE and
other development environments.  This is described in 
@geindex Python 향상 제안; PEP 264
PEP 264@footnote{https://peps.python.org/pep-0264/}. (Contributed
by Michael Hudson.)

@item 
The new license introduced with Python 1.6 wasn’t GPL-compatible.  This is
fixed by some minor textual changes to the 2.2 license, so it’s now legal to
embed Python inside a GPLed program again.  Note that Python itself is not
GPLed, but instead is under a license that’s essentially equivalent to the BSD
license, same as it always was.  The license changes were also applied to the
Python 2.0.1 and 2.1.1 releases.

@item 
When presented with a Unicode filename on Windows, Python will now convert it
to an MBCS encoded string, as used by the Microsoft file APIs.  As MBCS is
explicitly used by the file APIs, Python’s choice of ASCII as the default
encoding turns out to be an annoyance.  On Unix, the locale’s character set is
used if @code{locale.nl_langinfo(CODESET)} is available.  (Windows support was
contributed by Mark Hammond with assistance from Marc-André Lemburg. Unix
support was added by Martin von Löwis.)

@item 
Large file support is now enabled on Windows.  (Contributed by Tim Peters.)

@item 
The @code{Tools/scripts/ftpmirror.py} script now parses a @code{.netrc}
file, if you have one. (Contributed by Mike Romberg.)

@item 
Some features of the object returned by the @code{xrange()} function are now
deprecated, and trigger warnings when they’re accessed; they’ll disappear in
Python 2.3. @code{xrange} objects tried to pretend they were full sequence
types by supporting slicing, sequence multiplication, and the @ref{34b,,in}
operator, but these features were rarely used and therefore buggy.  The
@code{tolist()} method and the @code{start}, @code{stop}, and @code{step}
attributes are also being deprecated.  At the C level, the fourth argument to
the @code{PyRange_New()} function, @code{repeat}, has also been deprecated.

@item 
There were a bunch of patches to the dictionary implementation, mostly to fix
potential core dumps if a dictionary contains objects that sneakily changed
their hash value, or mutated the dictionary they were contained in. For a while
python-dev fell into a gentle rhythm of Michael Hudson finding a case that
dumped core, Tim Peters fixing the bug, Michael finding another case, and round
and round it went.

@item 
On Windows, Python can now be compiled with Borland C thanks to a number of
patches contributed by Stephen Hansen, though the result isn’t fully functional
yet.  (But this `is' progress…)

@item 
Another Windows enhancement: Wise Solutions generously offered PythonLabs use
of their InstallerMaster 8.1 system.  Earlier PythonLabs Windows installers used
Wise 5.0a, which was beginning to show its age.  (Packaged up by Tim Peters.)

@item 
Files ending in @code{.pyw} can now be imported on Windows. @code{.pyw} is a
Windows-only thing, used to indicate that a script needs to be run using
PYTHONW.EXE instead of PYTHON.EXE in order to prevent a DOS console from popping
up to display the output.  This patch makes it possible to import such scripts,
in case they’re also usable as modules.  (Implemented by David Bolen.)

@item 
On platforms where Python uses the C @code{dlopen()} function  to load
extension modules, it’s now possible to set the flags used  by @code{dlopen()}
using the @ref{1713,,sys.getdlopenflags()} and @ref{1324,,sys.setdlopenflags()} functions.
(Contributed by Bram Stolk.)

@item 
The @ref{1a4,,pow()} built-in function no longer supports 3 arguments when
floating-point numbers are supplied. @code{pow(x, y, z)} returns @code{(x**y) % z},
but this is never useful for floating-point numbers, and the final result varies
unpredictably depending on the platform.  A call such as @code{pow(2.0, 8.0, 7.0)}
will now raise a @ref{198,,TypeError} exception.
@end itemize

@c ======================================================================

@node Acknowledgements<6>,,Other Changes and Fixes<3>,What’s New in Python 2 2
@anchor{whatsnew/2 2 acknowledgements}@anchor{1714}
@subsection Acknowledgements


The author would like to thank the following people for offering suggestions,
corrections and assistance with various drafts of this article: Fred Bremmer,
Keith Briggs, Andrew Dalke, Fred L. Drake, Jr., Carel Fellinger, David Goodger,
Mark Hammond, Stephen Hansen, Michael Hudson, Jack Jansen, Marc-André Lemburg,
Martin von Löwis, Fredrik Lundh, Michael McLay, Nick Mathewson, Paul Moore,
Gustavo Niemeyer, Don O’Donnell, Joonas Paalasma, Tim Peters, Jens Quade, Tom
Reinhardt, Neil Schemenauer, Guido van Rossum, Greg Ward, Edward Welbourne.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node What’s New in Python 2 1,What’s New in Python 2 0,What’s New in Python 2 2,파이썬의 새로운 기능
@anchor{whatsnew/2 1 doc}@anchor{1715}@anchor{whatsnew/2 1 translation-repo}@anchor{1716}@anchor{whatsnew/2 1 what-s-new-in-python-2-1}@anchor{1717}
@section What’s New in Python 2.1


@*Author: 
A.M. Kuchling


@c $Id: whatsnew21.tex 50964 2006-07-30 03:03:43Z fred.drake $

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

@end menu

@node Introduction<2>,PEP 227 Nested Scopes<2>,,What’s New in Python 2 1
@anchor{whatsnew/2 1 introduction}@anchor{1718}
@subsection Introduction


This article explains the new features in Python 2.1.  While there aren’t as
many changes in 2.1 as there were in Python 2.0, there are still some pleasant
surprises in store.  2.1 is the first release to be steered through the use of
Python Enhancement Proposals, or PEPs, so most of the sizable changes have
accompanying PEPs that provide more complete documentation and a design
rationale for the change.  This article doesn’t attempt to document the new
features completely, but simply provides an overview of the new features for
Python programmers. Refer to the Python 2.1 documentation, or to the specific
PEP, for more details about any new feature that particularly interests you.

One recent goal of the Python development team has been to accelerate the pace
of new releases, with a new release coming every 6 to 9 months. 2.1 is the first
release to come out at this faster pace, with the first alpha appearing in
January, 3 months after the final version of 2.0 was released.

The final release of Python 2.1 was made on April 17, 2001.

@c ======================================================================

@node PEP 227 Nested Scopes<2>,PEP 236 __future__ Directives,Introduction<2>,What’s New in Python 2 1
@anchor{whatsnew/2 1 pep-227-nested-scopes}@anchor{1719}
@subsection PEP 227: Nested Scopes


The largest change in Python 2.1 is to Python’s scoping rules.  In Python 2.0,
at any given time there are at most three namespaces used to look up variable
names: local, module-level, and the built-in namespace.  This often surprised
people because it didn’t match their intuitive expectations.  For example, a
nested recursive function definition doesn’t work:

@example
def f():
    ...
    def g(value):
        ...
        return g(value-1) + 1
    ...
@end example

The function @code{g()} will always raise a @ref{452,,NameError} exception, because
the binding of the name @code{g} isn’t in either its local namespace or in the
module-level namespace.  This isn’t much of a problem in practice (how often do
you recursively define interior functions like this?), but this also made using
the @ref{14a2,,lambda} expression clumsier, and this was a problem in practice.
In code which uses @code{lambda} you can often find local variables being
copied by passing them as the default values of arguments.

@example
def find(self, name):
    "Return list of any entries equal to 'name'"
    L = filter(lambda x, name=name: x == name,
               self.list_attribute)
    return L
@end example

The readability of Python code written in a strongly functional style suffers
greatly as a result.

The most significant change to Python 2.1 is that static scoping has been added
to the language to fix this problem.  As a first effect, the @code{name=name}
default argument is now unnecessary in the above example.  Put simply, when a
given variable name is not assigned a value within a function (by an assignment,
or the @ref{165f,,def}, @ref{14dc,,class}, or @ref{7f7,,import} statements),
references to the variable will be looked up in the local namespace of the
enclosing scope.  A more detailed explanation of the rules, and a dissection of
the implementation, can be found in the PEP.

This change may cause some compatibility problems for code where the same
variable name is used both at the module level and as a local variable within a
function that contains further function definitions. This seems rather unlikely
though, since such code would have been pretty confusing to read in the first
place.

One side effect of the change is that the @code{from module import *} and
@code{exec} statements have been made illegal inside a function scope under
certain conditions.  The Python reference manual has said all along that @code{from
module import *} is only legal at the top level of a module, but the CPython
interpreter has never enforced this before.  As part of the implementation of
nested scopes, the compiler which turns Python source into bytecodes has to
generate different code to access variables in a containing scope.  @code{from
module import *} and @code{exec} make it impossible for the compiler to
figure this out, because they add names to the local namespace that are
unknowable at compile time. Therefore, if a function contains function
definitions or @ref{14a2,,lambda} expressions with free variables, the compiler
will flag this by raising a @ref{18e,,SyntaxError} exception.

To make the preceding explanation a bit clearer, here’s an example:

@example
x = 1
def f():
    # The next line is a syntax error
    exec 'x=2'
    def g():
        return x
@end example

Line 4 containing the @code{exec} statement is a syntax error, since
@code{exec} would define a new local variable named @code{x} whose value should
be accessed by @code{g()}.

This shouldn’t be much of a limitation, since @code{exec} is rarely used in
most Python code (and when it is used, it’s often a sign of a poor design
anyway).

Compatibility concerns have led to nested scopes being introduced gradually; in
Python 2.1, they aren’t enabled by default, but can be turned on within a module
by using a future statement as described in 
@geindex Python 향상 제안; PEP 236
PEP 236@footnote{https://peps.python.org/pep-0236/}.  (See the following section
for further discussion of 
@geindex Python 향상 제안; PEP 236
PEP 236@footnote{https://peps.python.org/pep-0236/}.)  In Python 2.2, nested scopes will become
the default and there will be no way to turn them off, but users will have had
all of 2.1’s lifetime to fix any breakage resulting from their introduction.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 227

@item PEP 227@footnote{https://peps.python.org/pep-0227/} - Statically Nested Scopes

Written and implemented by Jeremy Hylton.
@end table


@c ======================================================================

@node PEP 236 __future__ Directives,PEP 207 Rich Comparisons,PEP 227 Nested Scopes<2>,What’s New in Python 2 1
@anchor{whatsnew/2 1 pep-236-future-directives}@anchor{171a}
@subsection PEP 236: __future__ Directives


The reaction to nested scopes was widespread concern about the dangers of
breaking code with the 2.1 release, and it was strong enough to make the
Pythoneers take a more conservative approach.  This approach consists of
introducing a convention for enabling optional functionality in release N that
will become compulsory in release N+1.

The syntax uses a @code{from...import} statement using the reserved module name
@ref{0,,__future__}.  Nested scopes can be enabled by the following statement:

@example
from __future__ import nested_scopes
@end example

While it looks like a normal @ref{7f7,,import} statement, it’s not; there are
strict rules on where such a future statement can be put. They can only be at
the top of a module, and must precede any Python code or regular
@code{import} statements.  This is because such statements can affect how
the Python bytecode compiler parses code and generates bytecode, so they must
precede any statement that will result in bytecodes being produced.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 236

@item PEP 236@footnote{https://peps.python.org/pep-0236/} - Back to the @ref{0,,__future__}

Written by Tim Peters, and primarily implemented by Jeremy Hylton.
@end table


@c ======================================================================

@node PEP 207 Rich Comparisons,PEP 230 Warning Framework,PEP 236 __future__ Directives,What’s New in Python 2 1
@anchor{whatsnew/2 1 pep-207-rich-comparisons}@anchor{171b}
@subsection PEP 207: Rich Comparisons


In earlier versions, Python’s support for implementing comparisons on user-defined
classes and extension types was quite simple. Classes could implement a
@code{__cmp__()} method that was given two instances of a class, and could only
return 0 if they were equal or +1 or -1 if they weren’t; the method couldn’t
raise an exception or return anything other than a Boolean value.  Users of
Numeric Python often found this model too weak and restrictive, because in the
number-crunching programs that numeric Python is used for, it would be more
useful to be able to perform elementwise comparisons of two matrices, returning
a matrix containing the results of a given comparison for each element.  If the
two matrices are of different sizes, then the compare has to be able to raise an
exception to signal the error.

In Python 2.1, rich comparisons were added in order to support this need.
Python classes can now individually overload each of the @code{<}, @code{<=}, @code{>},
@code{>=}, @code{==}, and @code{!=} operations.  The new magic method names are:


@multitable {xxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Operation

@tab

Method name

@item

@code{<}

@tab

@ref{14a5,,__lt__()}

@item

@code{<=}

@tab

@ref{150f,,__le__()}

@item

@code{>}

@tab

@ref{1510,,__gt__()}

@item

@code{>=}

@tab

@ref{1511,,__ge__()}

@item

@code{==}

@tab

@ref{cf1,,__eq__()}

@item

@code{!=}

@tab

@ref{171c,,__ne__()}

@end multitable


(The magic methods are named after the corresponding Fortran operators @code{.LT.}.
@code{.LE.}, &c.  Numeric programmers are almost certainly quite familiar with
these names and will find them easy to remember.)

Each of these magic methods is of the form @code{method(self, other)}, where
@code{self} will be the object on the left-hand side of the operator, while
@code{other} will be the object on the right-hand side.  For example, the
expression @code{A < B} will cause @code{A.__lt__(B)} to be called.

Each of these magic methods can return anything at all: a Boolean, a matrix, a
list, or any other Python object.  Alternatively they can raise an exception if
the comparison is impossible, inconsistent, or otherwise meaningless.

The built-in @code{cmp(A,B)} function can use the rich comparison machinery,
and now accepts an optional argument specifying which comparison operation to
use; this is given as one of the strings @code{"<"}, @code{"<="}, @code{">"}, @code{">="},
@code{"=="}, or @code{"!="}.  If called without the optional third argument,
@code{cmp()} will only return -1, 0, or +1 as in previous versions of Python;
otherwise it will call the appropriate method and can return any Python object.

There are also corresponding changes of interest to C programmers; there’s a new
slot @code{tp_richcmp} in type objects and an API for performing a given rich
comparison.  I won’t cover the C API here, but will refer you to 
@geindex Python 향상 제안; PEP 207
PEP 207@footnote{https://peps.python.org/pep-0207/}, or to
2.1’s C API documentation, for the full list of related functions.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 207

@item PEP 207@footnote{https://peps.python.org/pep-0207/} - Rich Comparisons

Written by Guido van Rossum, heavily based on earlier work by David Ascher, and
implemented by Guido van Rossum.
@end table


@c ======================================================================

@node PEP 230 Warning Framework,PEP 229 New Build System,PEP 207 Rich Comparisons,What’s New in Python 2 1
@anchor{whatsnew/2 1 pep-230-warning-framework}@anchor{171d}
@subsection PEP 230: Warning Framework


Over its 10 years of existence, Python has accumulated a certain number of
obsolete modules and features along the way.  It’s difficult to know when a
feature is safe to remove, since there’s no way of knowing how much code uses it
— perhaps no programs depend on the feature, or perhaps many do.  To enable
removing old features in a more structured way, a warning framework was added.
When the Python developers want to get rid of a feature, it will first trigger a
warning in the next version of Python.  The following Python version can then
drop the feature, and users will have had a full release cycle to remove uses of
the old feature.

Python 2.1 adds the warning framework to be used in this scheme.  It adds a
@ref{118,,warnings} module that provide functions to issue warnings, and to filter
out warnings that you don’t want to be displayed. Third-party modules can also
use this framework to deprecate old features that they no longer wish to
support.

For example, in Python 2.1 the @code{regex} module is deprecated, so importing
it causes a warning to be printed:

@example
>>> import regex
__main__:1: DeprecationWarning: the regex module
         is deprecated; please use the re module
>>>
@end example

Warnings can be issued by calling the @ref{171e,,warnings.warn()} function:

@example
warnings.warn("feature X no longer supported")
@end example

The first parameter is the warning message; an additional optional parameters
can be used to specify a particular warning category.

Filters can be added to disable certain warnings; a regular expression pattern
can be applied to the message or to the module name in order to suppress a
warning.  For example, you may have a program that uses the @code{regex} module
and not want to spare the time to convert it to use the @ref{be,,re} module right
now.  The warning can be suppressed by calling

@example
import warnings
warnings.filterwarnings(action = 'ignore',
                        message='.*regex module is deprecated',
                        category=DeprecationWarning,
                        module = '__main__')
@end example

This adds a filter that will apply only to warnings of the class
@ref{1a3,,DeprecationWarning} triggered in the @ref{1,,__main__} module, and applies
a regular expression to only match the message about the @code{regex} module
being deprecated, and will cause such warnings to be ignored.  Warnings can also
be printed only once, printed every time the offending code is executed, or
turned into exceptions that will cause the program to stop (unless the
exceptions are caught in the usual way, of course).

Functions were also added to Python’s C API for issuing warnings; refer to PEP
230 or to Python’s API documentation for the details.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 5

@item PEP 5@footnote{https://peps.python.org/pep-0005/} - Guidelines for Language Evolution

Written by Paul Prescod, to specify procedures to be followed when removing old
features from Python.  The policy described in this PEP hasn’t been officially
adopted, but the eventual policy probably won’t be too different from Prescod’s
proposal.

@geindex Python 향상 제안; PEP 230

@item PEP 230@footnote{https://peps.python.org/pep-0230/} - Warning Framework

Written and implemented by Guido van Rossum.
@end table


@c ======================================================================

@node PEP 229 New Build System,PEP 205 Weak References,PEP 230 Warning Framework,What’s New in Python 2 1
@anchor{whatsnew/2 1 pep-229-new-build-system}@anchor{171f}
@subsection PEP 229: New Build System


When compiling Python, the user had to go in and edit the @code{Modules/Setup}
file in order to enable various additional modules; the default set is
relatively small and limited to modules that compile on most Unix platforms.
This means that on Unix platforms with many more features, most notably Linux,
Python installations often don’t contain all useful modules they could.

Python 2.0 added the Distutils, a set of modules for distributing and installing
extensions.  In Python 2.1, the Distutils are used to compile much of the
standard library of extension modules, autodetecting which ones are supported on
the current machine.  It’s hoped that this will make Python installations easier
and more featureful.

Instead of having to edit the @code{Modules/Setup} file in order to enable
modules, a @code{setup.py} script in the top directory of the Python source
distribution is run at build time, and attempts to discover which modules can be
enabled by examining the modules and header files on the system.  If a module is
configured in @code{Modules/Setup}, the @code{setup.py} script won’t attempt
to compile that module and will defer to the @code{Modules/Setup} file’s
contents.  This provides a way to specific any strange command-line flags or
libraries that are required for a specific platform.

In another far-reaching change to the build mechanism, Neil Schemenauer
restructured things so Python now uses a single makefile that isn’t recursive,
instead of makefiles in the top directory and in each of the @code{Python/},
@code{Parser/}, @code{Objects/}, and @code{Modules/} subdirectories.  This
makes building Python faster and also makes hacking the Makefiles clearer and
simpler.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 229

@item PEP 229@footnote{https://peps.python.org/pep-0229/} - Using Distutils to Build Python

Written and implemented by A.M. Kuchling.
@end table


@c ======================================================================

@node PEP 205 Weak References,PEP 232 Function Attributes,PEP 229 New Build System,What’s New in Python 2 1
@anchor{whatsnew/2 1 pep-205-weak-references}@anchor{1720}
@subsection PEP 205: Weak References


Weak references, available through the @ref{11a,,weakref} module, are a minor but
useful new data type in the Python programmer’s toolbox.

Storing a reference to an object (say, in a dictionary or a list) has the side
effect of keeping that object alive forever.  There are a few specific cases
where this behaviour is undesirable, object caches being the most common one,
and another being circular references in data structures such as trees.

For example, consider a memoizing function that caches the results of another
function @code{f(x)} by storing the function’s argument and its result in a
dictionary:

@example
_cache = @{@}
def memoize(x):
    if _cache.has_key(x):
        return _cache[x]

    retval = f(x)

    # Cache the returned object
    _cache[x] = retval

    return retval
@end example

This version works for simple things such as integers, but it has a side effect;
the @code{_cache} dictionary holds a reference to the return values, so they’ll
never be deallocated until the Python process exits and cleans up. This isn’t
very noticeable for integers, but if @code{f()} returns an object, or a data
structure that takes up a lot of memory, this can be a problem.

Weak references provide a way to implement a cache that won’t keep objects alive
beyond their time.  If an object is only accessible through weak references, the
object will be deallocated and the weak references will now indicate that the
object it referred to no longer exists.  A weak reference to an object `obj' is
created by calling @code{wr = weakref.ref(obj)}.  The object being referred to is
returned by calling the weak reference as if it were a function: @code{wr()}.  It
will return the referenced object, or @code{None} if the object no longer exists.

This makes it possible to write a @code{memoize()} function whose cache doesn’t
keep objects alive, by storing weak references in the cache.

@example
_cache = @{@}
def memoize(x):
    if _cache.has_key(x):
        obj = _cache[x]()
        # If weak reference object still exists,
        # return it
        if obj is not None: return obj

    retval = f(x)

    # Cache a weak reference
    _cache[x] = weakref.ref(retval)

    return retval
@end example

The @ref{11a,,weakref} module also allows creating proxy objects which behave like
weak references — an object referenced only by proxy objects is deallocated –
but instead of requiring an explicit call to retrieve the object, the proxy
transparently forwards all operations to the object as long as the object still
exists.  If the object is deallocated, attempting to use a proxy will cause a
@code{weakref.ReferenceError} exception to be raised.

@example
proxy = weakref.proxy(obj)
proxy.attr   # Equivalent to obj.attr
proxy.meth() # Equivalent to obj.meth()
del obj
proxy.attr   # raises weakref.ReferenceError
@end example


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 205

@item PEP 205@footnote{https://peps.python.org/pep-0205/} - Weak References

Written and implemented by Fred L. Drake, Jr.
@end table


@c ======================================================================

@node PEP 232 Function Attributes,PEP 235 Importing Modules on Case-Insensitive Platforms,PEP 205 Weak References,What’s New in Python 2 1
@anchor{whatsnew/2 1 pep-232-function-attributes}@anchor{1721}
@subsection PEP 232: Function Attributes


In Python 2.1, functions can now have arbitrary information attached to them.
People were often using docstrings to hold information about functions and
methods, because the @ref{13de,,__doc__} attribute was the only way of
attaching any
information to a function.  For example, in the Zope web application server,
functions are marked as safe for public access by having a docstring, and in
John Aycock’s SPARK parsing framework, docstrings hold parts of the BNF grammar
to be parsed.  This overloading is unfortunate, since docstrings are really
intended to hold a function’s documentation; for example, it means you can’t
properly document functions intended for private use in Zope.

Arbitrary attributes can now be set and retrieved on functions using the regular
Python syntax:

@example
def f(): pass

f.publish = 1
f.secure = 1
f.grammar = "A ::= B (C D)*"
@end example

The dictionary containing attributes can be accessed as the function’s
@ref{14d7,,__dict__}. Unlike the @ref{e56,,__dict__} attribute of class instances, in
functions you can actually assign a new dictionary to @code{__dict__}, though
the new value is restricted to a regular Python dictionary; you `can’t' be
tricky and set it to a @code{UserDict} instance, or any other random object
that behaves like a mapping.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 232

@item PEP 232@footnote{https://peps.python.org/pep-0232/} - Function Attributes

Written and implemented by Barry Warsaw.
@end table


@c ======================================================================

@node PEP 235 Importing Modules on Case-Insensitive Platforms,PEP 217 Interactive Display Hook,PEP 232 Function Attributes,What’s New in Python 2 1
@anchor{whatsnew/2 1 pep-235-importing-modules-on-case-insensitive-platforms}@anchor{1722}
@subsection PEP 235: Importing Modules on Case-Insensitive Platforms


Some operating systems have filesystems that are case-insensitive, MacOS and
Windows being the primary examples; on these systems, it’s impossible to
distinguish the filenames @code{FILE.PY} and @code{file.py}, even though they do store
the file’s name  in its original case (they’re case-preserving, too).

In Python 2.1, the @ref{7f7,,import} statement will work to simulate case-sensitivity
on case-insensitive platforms.  Python will now search for the first
case-sensitive match by default, raising an @ref{659,,ImportError} if no such file
is found, so @code{import file} will not import a module named @code{FILE.PY}.
Case-insensitive matching can be requested by setting the 
@geindex PYTHONCASEOK
@geindex 환경 변수; PYTHONCASEOK
@ref{b57,,PYTHONCASEOK}
environment variable before starting the Python interpreter.

@c ======================================================================

@node PEP 217 Interactive Display Hook,PEP 208 New Coercion Model,PEP 235 Importing Modules on Case-Insensitive Platforms,What’s New in Python 2 1
@anchor{whatsnew/2 1 pep-217-interactive-display-hook}@anchor{1723}
@subsection PEP 217: Interactive Display Hook


When using the Python interpreter interactively, the output of commands is
displayed using the built-in @ref{1c1,,repr()} function. In Python 2.1, the variable
@ref{1724,,sys.displayhook()} can be set to a callable object which will be called
instead of @code{repr()}. For example, you can set it to a special
pretty-printing function:

@example
>>> # Create a recursive data structure
... L = [1,2,3]
>>> L.append(L)
>>> L # Show Python's default output
[1, 2, 3, [...]]
>>> # Use pprint.pprint() as the display function
... import sys, pprint
>>> sys.displayhook = pprint.pprint
>>> L
[1, 2, 3,  <Recursion on list with id=135143996>]
>>>
@end example


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 217

@item PEP 217@footnote{https://peps.python.org/pep-0217/} - Display Hook for Interactive Use

Written and implemented by Moshe Zadka.
@end table


@c ======================================================================

@node PEP 208 New Coercion Model,PEP 241 Metadata in Python Packages,PEP 217 Interactive Display Hook,What’s New in Python 2 1
@anchor{whatsnew/2 1 pep-208-new-coercion-model}@anchor{1725}
@subsection PEP 208: New Coercion Model


How numeric coercion is done at the C level was significantly modified.  This
will only affect the authors of C extensions to Python, allowing them more
flexibility in writing extension types that support numeric operations.

Extension types can now set the type flag @code{Py_TPFLAGS_CHECKTYPES} in their
@code{PyTypeObject} structure to indicate that they support the new coercion model.
In such extension types, the numeric slot functions can no longer assume that
they’ll be passed two arguments of the same type; instead they may be passed two
arguments of differing types, and can then perform their own internal coercion.
If the slot function is passed a type it can’t handle, it can indicate the
failure by returning a reference to the @code{Py_NotImplemented} singleton value.
The numeric functions of the other type will then be tried, and perhaps they can
handle the operation; if the other type also returns @code{Py_NotImplemented}, then
a @ref{198,,TypeError} will be raised.  Numeric methods written in Python can also
return @code{Py_NotImplemented}, causing the interpreter to act as if the method
did not exist (perhaps raising a @code{TypeError}, perhaps trying another
object’s numeric methods).


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 208

@item PEP 208@footnote{https://peps.python.org/pep-0208/} - Reworking the Coercion Model

Written and implemented by Neil Schemenauer, heavily based upon earlier work by
Marc-André Lemburg.  Read this to understand the fine points of how numeric
operations will now be processed at the C level.
@end table


@c ======================================================================

@node PEP 241 Metadata in Python Packages,New and Improved Modules<4>,PEP 208 New Coercion Model,What’s New in Python 2 1
@anchor{whatsnew/2 1 pep-241-metadata-in-python-packages}@anchor{1726}
@subsection PEP 241: Metadata in Python Packages


A common complaint from Python users is that there’s no single catalog of all
the Python modules in existence.  T. Middleton’s Vaults of Parnassus at
@code{www.vex.net/parnassus/} (retired in February 2009, available in the Internet Archive Wayback Machine@footnote{https://web.archive.org/web/20090130140102/http://www.vex.net/parnassus/})
was the largest catalog of Python modules, but
registering software at the Vaults is optional, and many people did not bother.

As a first small step toward fixing the problem, Python software packaged using
the Distutils @code{sdist} command will include a file named
@code{PKG-INFO} containing information about the package such as its name,
version, and author (metadata, in cataloguing terminology).  
@geindex Python 향상 제안; PEP 241
PEP 241@footnote{https://peps.python.org/pep-0241/} contains
the full list of fields that can be present in the @code{PKG-INFO} file.  As
people began to package their software using Python 2.1, more and more packages
will include metadata, making it possible to build automated cataloguing systems
and experiment with them.  With the result experience, perhaps it’ll be possible
to design a really good catalog and then build support for it into Python 2.2.
For example, the Distutils @code{sdist} and @code{bdist_*} commands
could support an @code{upload} option that would automatically upload your
package to a catalog server.

You can start creating packages containing @code{PKG-INFO} even if you’re not
using Python 2.1, since a new release of the Distutils will be made for users of
earlier Python versions.  Version 1.0.2 of the Distutils includes the changes
described in 
@geindex Python 향상 제안; PEP 241
PEP 241@footnote{https://peps.python.org/pep-0241/}, as well as various bugfixes and enhancements.  It will be
available from the Distutils SIG at @indicateurl{https://www.python.org/community/sigs/current/distutils-sig/}.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 241

@item PEP 241@footnote{https://peps.python.org/pep-0241/} - Metadata for Python Software Packages

Written and implemented by A.M. Kuchling.

@geindex Python 향상 제안; PEP 243

@item PEP 243@footnote{https://peps.python.org/pep-0243/} - Module Repository Upload Mechanism

Written by Sean Reifschneider, this draft PEP describes a proposed mechanism for
uploading  Python packages to a central server.
@end table


@c ======================================================================

@node New and Improved Modules<4>,Other Changes and Fixes<4>,PEP 241 Metadata in Python Packages,What’s New in Python 2 1
@anchor{whatsnew/2 1 new-and-improved-modules}@anchor{1727}
@subsection New and Improved Modules



@itemize *

@item 
Ka-Ping Yee contributed two new modules: @code{inspect.py}, a module for
getting information about live Python code, and @code{pydoc.py}, a module for
interactively converting docstrings to HTML or text.  As a bonus,
@code{Tools/scripts/pydoc}, which is now automatically installed, uses
@code{pydoc.py} to display documentation given a Python module, package, or
class name.  For example, @code{pydoc xml.dom} displays the following:

@example
Python Library Documentation: package xml.dom in xml

NAME
    xml.dom - W3C Document Object Model implementation for Python.

FILE
    /usr/local/lib/python2.1/xml/dom/__init__.pyc

DESCRIPTION
    The Python mapping of the Document Object Model is documented in the
    Python Library Reference in the section on the xml.dom package.

    This package contains the following modules:
      ...
@end example

@code{pydoc} also includes a Tk-based interactive help browser.   @code{pydoc}
quickly becomes addictive; try it out!

@item 
Two different modules for unit testing were added to the standard library.
The @ref{3e,,doctest} module, contributed by Tim Peters, provides a testing
framework based on running embedded examples in docstrings and comparing the
results against the expected output.  PyUnit, contributed by Steve Purcell, is a
unit testing framework inspired by JUnit, which was in turn an adaptation of
Kent Beck’s Smalltalk testing framework.  See @indicateurl{https://pyunit.sourceforge.net/} for
more information about PyUnit.

@item 
The @ref{3b,,difflib} module contains a class, @ref{1218,,SequenceMatcher}, which
compares two sequences and computes the changes required to transform one
sequence into the other.  For example, this module can be used to write a tool
similar to the Unix @code{diff} program, and in fact the sample program
@code{Tools/scripts/ndiff.py} demonstrates how to write such a script.

@item 
@ref{31,,curses.panel}, a wrapper for the panel library, part of ncurses and of
SYSV curses, was contributed by Thomas Gellekum.  The panel library provides
windows with the additional feature of depth. Windows can be moved higher or
lower in the depth ordering, and the panel library figures out where panels
overlap and which sections are visible.

@item 
The PyXML package has gone through a few releases since Python 2.0, and Python
2.1 includes an updated version of the @ref{126,,xml} package.  Some of the
noteworthy changes include support for Expat 1.2 and later versions, the ability
for Expat parsers to handle files in any encoding supported by Python, and
various bugfixes for SAX, DOM, and the @code{minidom} module.

@item 
Ping also contributed another hook for handling uncaught exceptions.
@ref{a0c,,sys.excepthook()} can be set to a callable object.  When an exception isn’t
caught by any @ref{8f7,,try}…@ref{1ab,,except} blocks, the exception will be
passed to @code{sys.excepthook()}, which can then do whatever it likes.  At the
Ninth Python Conference, Ping demonstrated an application for this hook:
printing an extended traceback that not only lists the stack frames, but also
lists the function arguments and the local variables for each frame.

@item 
Various functions in the @ref{f4,,time} module, such as @ref{13ec,,asctime()} and
@ref{16fe,,localtime()}, require a floating-point argument containing the time in
seconds since the epoch.  The most common use of these functions is to work with
the current time, so the floating-point argument has been made optional; when a
value isn’t provided, the current time will be used.  For example, log file
entries usually need a string containing the current time; in Python 2.1,
@code{time.asctime()} can be used, instead of the lengthier
@code{time.asctime(time.localtime(time.time()))} that was previously required.

This change was proposed and implemented by Thomas Wouters.

@item 
The @ref{62,,ftplib} module now defaults to retrieving files in passive mode,
because passive mode is more likely to work from behind a firewall.  This
request came from the Debian bug tracking system, since other Debian packages
use @code{ftplib} to retrieve files and then don’t work from behind a firewall.
It’s deemed unlikely that this will cause problems for anyone, because Netscape
defaults to passive mode and few people complain, but if passive mode is
unsuitable for your application or network setup, call @code{set_pasv(0)} on
FTP objects to disable passive mode.

@item 
Support for raw socket access has been added to the @ref{d1,,socket} module,
contributed by Grant Edwards.

@item 
The @ref{b5,,pstats} module now contains a simple interactive statistics browser
for displaying timing profiles for Python programs, invoked when the module is
run as a script.  Contributed by  Eric S. Raymond.

@item 
A new implementation-dependent function, @code{sys._getframe([depth])}, has
been added to return a given frame object from the current call stack.
@ref{8ef,,sys._getframe()} returns the frame at the top of the call stack;  if the
optional integer argument `depth' is supplied, the function returns the frame
that is `depth' calls below the top of the stack.  For example,
@code{sys._getframe(1)} returns the caller’s frame object.

This function is only present in CPython, not in Jython or the .NET
implementation.  Use it for debugging, and resist the temptation to put it into
production code.
@end itemize

@c ======================================================================

@node Other Changes and Fixes<4>,Acknowledgements<7>,New and Improved Modules<4>,What’s New in Python 2 1
@anchor{whatsnew/2 1 other-changes-and-fixes}@anchor{1728}
@subsection Other Changes and Fixes


There were relatively few smaller changes made in Python 2.1 due to the shorter
release cycle.  A search through the CVS change logs turns up 117 patches
applied, and 136 bugs fixed; both figures are likely to be underestimates.  Some
of the more notable changes are:


@itemize *

@item 
A specialized object allocator is now optionally available, that should be
faster than the system @code{malloc()} and have less memory overhead.  The
allocator uses C’s @code{malloc()} function to get large pools of memory, and
then fulfills smaller memory requests from these pools.  It can be enabled by
providing the @code{--with-pymalloc} option to the @code{configure}
script; see @code{Objects/obmalloc.c} for the implementation details.

Authors of C extension modules should test their code with the object allocator
enabled, because some incorrect code may break, causing core dumps at runtime.
There are a bunch of memory allocation functions in Python’s C API that have
previously been just aliases for the C library’s @code{malloc()} and
@code{free()}, meaning that if you accidentally called mismatched functions, the
error wouldn’t be noticeable.  When the object allocator is enabled, these
functions aren’t aliases of @code{malloc()} and @code{free()} any more, and
calling the wrong function to free memory will get you a core dump.  For
example, if memory was allocated using @ref{1729,,PyMem_New}, it has to be freed
using @ref{172a,,PyMem_Del()}, not @code{free()}.  A few modules included with Python
fell afoul of this and had to be fixed; doubtless there are more third-party
modules that will have the same problem.

The object allocator was contributed by Vladimir Marangozov.

@item 
The speed of line-oriented file I/O has been improved because people often
complain about its lack of speed, and because it’s often been used as a naïve
benchmark.  The @ref{bf,,readline()} method of file objects has therefore been
rewritten to be much faster.  The exact amount of the speedup will vary from
platform to platform depending on how slow the C library’s @code{getc()} was, but
is around 66%, and potentially much faster on some particular operating systems.
Tim Peters did much of the benchmarking and coding for this change, motivated by
a discussion in comp.lang.python.

A new module and method for file objects was also added, contributed by Jeff
Epler. The new method, @code{xreadlines()}, is similar to the existing
@code{xrange()} built-in.  @code{xreadlines()} returns an opaque sequence object
that only supports being iterated over, reading a line on every iteration but
not reading the entire file into memory as the existing @code{readlines()} method
does. You’d use it like this:

@example
for line in sys.stdin.xreadlines():
    # ... do something for each line ...
    ...
@end example

For a fuller discussion of the line I/O changes, see the python-dev summary for
January 1–15, 2001 at @indicateurl{https://mail.python.org/pipermail/python-dev/2001-January/}.

@item 
A new method, @ref{172b,,popitem()}, was added to dictionaries to enable
destructively iterating through the contents of a dictionary; this can be faster
for large dictionaries because there’s no need to construct a list containing
all the keys or values. @code{D.popitem()} removes a random @code{(key, value)} pair
from the dictionary @code{D} and returns it as a 2-tuple.  This was implemented
mostly by Tim Peters and Guido van Rossum, after a suggestion and preliminary
patch by Moshe Zadka.

@item 
Modules can now control which names are imported when @code{from module import *}
is used, by defining an @code{__all__} attribute containing a list of names that
will be imported.  One common complaint is that if the module imports other
modules such as @ref{df,,sys} or @ref{d8,,string}, @code{from module import *} will add
them to the importing module’s namespace.  To fix this, simply list the public
names in @code{__all__}:

@example
# List public names
__all__ = ['Database', 'open']
@end example

A stricter version of this patch was first suggested and implemented by Ben
Wolfson, but after some python-dev discussion, a weaker final version was
checked in.

@item 
Applying @ref{1c1,,repr()} to strings previously used octal escapes for
non-printable characters; for example, a newline was @code{'\012'}.  This was a
vestigial trace of Python’s C ancestry, but today octal is of very little
practical use.  Ka-Ping Yee suggested using hex escapes instead of octal ones,
and using the @code{\n}, @code{\t}, @code{\r} escapes for the appropriate characters,
and implemented this new formatting.

@item 
Syntax errors detected at compile-time can now raise exceptions containing the
filename and line number of the error, a pleasant side effect of the compiler
reorganization done by Jeremy Hylton.

@item 
C extensions which import other modules have been changed to use
@ref{3dc,,PyImport_ImportModule()}, which means that they will use any import hooks
that have been installed.  This is also encouraged for third-party extensions
that need to import some other module from C code.

@item 
The size of the Unicode character database was shrunk by another 340K thanks
to Fredrik Lundh.

@item 
Some new ports were contributed: MacOS X (by Steven Majewski), Cygwin (by
Jason Tishler); RISCOS (by Dietmar Schwertberger); Unixware 7  (by Billy G.
Allie).
@end itemize

And there’s the usual list of minor bugfixes, minor memory leaks, docstring
edits, and other tweaks, too lengthy to be worth itemizing; see the CVS logs for
the full details if you want them.

@c ======================================================================

@node Acknowledgements<7>,,Other Changes and Fixes<4>,What’s New in Python 2 1
@anchor{whatsnew/2 1 acknowledgements}@anchor{172c}
@subsection Acknowledgements


The author would like to thank the following people for offering suggestions on
various drafts of this article: Graeme Cross, David Goodger, Jay Graves, Michael
Hudson, Marc-André Lemburg, Fredrik Lundh, Neil Schemenauer, Thomas Wouters.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node What’s New in Python 2 0,Changelog,What’s New in Python 2 1,파이썬의 새로운 기능
@anchor{whatsnew/2 0 doc}@anchor{172d}@anchor{whatsnew/2 0 translation-repo}@anchor{172e}@anchor{whatsnew/2 0 what-s-new-in-python-2-0}@anchor{172f}
@section What’s New in Python 2.0


@*Author: 
A.M. Kuchling and Moshe Zadka


@c $Id: whatsnew20.tex 50964 2006-07-30 03:03:43Z fred.drake $

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

@end menu

@node Introduction<3>,What About Python 1 6?,,What’s New in Python 2 0
@anchor{whatsnew/2 0 introduction}@anchor{1730}
@subsection Introduction


A new release of Python, version 2.0, was released on October 16, 2000. This
article covers the exciting new features in 2.0, highlights some other useful
changes, and points out a few incompatible changes that may require rewriting
code.

Python’s development never completely stops between releases, and a steady flow
of bug fixes and improvements are always being submitted. A host of minor fixes,
a few optimizations, additional docstrings, and better error messages went into
2.0; to list them all would be impossible, but they’re certainly significant.
Consult the publicly available CVS logs if you want to see the full list.  This
progress is due to the five developers working for  PythonLabs are now getting
paid to spend their days fixing bugs, and also due to the improved communication
resulting  from moving to SourceForge.

@c ======================================================================

@node What About Python 1 6?,New Development Process,Introduction<3>,What’s New in Python 2 0
@anchor{whatsnew/2 0 what-about-python-1-6}@anchor{1731}
@subsection What About Python 1.6?


Python 1.6 can be thought of as the Contractual Obligations Python release.
After the core development team left CNRI in May 2000, CNRI requested that a 1.6
release be created, containing all the work on Python that had been performed at
CNRI.  Python 1.6 therefore represents the state of the CVS tree as of May 2000,
with the most significant new feature being Unicode support.  Development
continued after May, of course, so the 1.6 tree received a few fixes to ensure
that it’s forward-compatible with Python 2.0.  1.6 is therefore part of Python’s
evolution, and not a side branch.

So, should you take much interest in Python 1.6?  Probably not.  The 1.6final
and 2.0beta1 releases were made on the same day (September 5, 2000), the plan
being to finalize Python 2.0 within a month or so.  If you have applications to
maintain, there seems little point in breaking things by moving to 1.6, fixing
them, and then having another round of breakage within a month by moving to 2.0;
you’re better off just going straight to 2.0.  Most of the really interesting
features described in this document are only in 2.0, because a lot of work was
done between May and September.

@c ======================================================================

@node New Development Process,Unicode<2>,What About Python 1 6?,What’s New in Python 2 0
@anchor{whatsnew/2 0 new-development-process}@anchor{1732}
@subsection New Development Process


The most important change in Python 2.0 may not be to the code at all, but to
how Python is developed: in May 2000 the Python developers began using the tools
made available by SourceForge for storing  source code, tracking bug reports,
and managing the queue of patch submissions.  To report bugs or submit patches
for Python 2.0, use the bug tracking and patch manager tools available from
Python’s project page, located at @indicateurl{https://sourceforge.net/projects/python/}.

The most important of the services now hosted at SourceForge is the Python CVS
tree, the version-controlled repository containing the source code for Python.
Previously, there were roughly 7 or so people who had write access to the CVS
tree, and all patches had to be inspected and checked in by one of the people on
this short list. Obviously, this wasn’t very scalable.  By moving the CVS tree
to SourceForge, it became possible to grant write access to more people; as of
September 2000 there were 27 people able to check in changes, a fourfold
increase.  This makes possible large-scale changes that wouldn’t be attempted if
they’d have to be filtered through the small group of core developers.  For
example, one day Peter Schneider-Kamp took it into his head to drop K&R C
compatibility and convert the C source for Python to ANSI C. After getting
approval on the python-dev mailing list, he launched into a flurry of checkins
that lasted about a week, other developers joined in to help, and the job was
done.  If there were only 5 people with write access, probably that task would
have been viewed as “nice, but not worth the time and effort needed” and it
would never have gotten done.

The shift to using SourceForge’s services has resulted in a remarkable increase
in the speed of development.  Patches now get submitted, commented on, revised
by people other than the original submitter, and bounced back and forth between
people until the patch is deemed worth checking in.  Bugs are tracked in one
central location and can be assigned to a specific person for fixing, and we can
count the number of open bugs to measure progress.  This didn’t come without a
cost: developers now have more e-mail to deal with, more mailing lists to
follow, and special tools had to be written for the new environment. For
example, SourceForge sends default patch and bug notification e-mail messages
that are completely unhelpful, so Ka-Ping Yee wrote an HTML screen-scraper that
sends more useful messages.

The ease of adding code caused a few initial growing pains, such as code was
checked in before it was ready or without getting clear agreement from the
developer group.  The approval process that has emerged is somewhat similar to
that used by the Apache group. Developers can vote +1, +0, -0, or -1 on a patch;
+1 and -1 denote acceptance or rejection, while +0 and -0 mean the developer is
mostly indifferent to the change, though with a slight positive or negative
slant.  The most significant change from the Apache model is that the voting is
essentially advisory, letting Guido van Rossum, who has Benevolent Dictator For
Life status, know what the general opinion is. He can still ignore the result of
a vote, and approve or reject a change even if the community disagrees with him.

Producing an actual patch is the last step in adding a new feature, and is
usually easy compared to the earlier task of coming up with a good design.
Discussions of new features can often explode into lengthy mailing list threads,
making the discussion hard to follow, and no one can read every posting to
python-dev.  Therefore, a relatively formal process has been set up to write
Python Enhancement Proposals (PEPs), modelled on the internet RFC process.  PEPs
are draft documents that describe a proposed new feature, and are continually
revised until the community reaches a consensus, either accepting or rejecting
the proposal.  Quoting from the introduction to 
@geindex Python 향상 제안; PEP 1
PEP 1@footnote{https://peps.python.org/pep-0001/}, “PEP Purpose and
Guidelines”:

@quotation

PEP stands for Python Enhancement Proposal.  A PEP is a design document
providing information to the Python community, or describing a new feature for
Python.  The PEP should provide a concise technical specification of the feature
and a rationale for the feature.

We intend PEPs to be the primary mechanisms for proposing new features, for
collecting community input on an issue, and for documenting the design decisions
that have gone into Python.  The PEP author is responsible for building
consensus within the community and documenting dissenting opinions.
@end quotation

Read the rest of 
@geindex Python 향상 제안; PEP 1
PEP 1@footnote{https://peps.python.org/pep-0001/} for the details of the PEP editorial process, style, and
format.  PEPs are kept in the Python CVS tree on SourceForge, though they’re not
part of the Python 2.0 distribution, and are also available in HTML form from
@indicateurl{https://peps.python.org/}.  As of September 2000, there are 25 PEPs, ranging
from 
@geindex Python 향상 제안; PEP 201
PEP 201@footnote{https://peps.python.org/pep-0201/}, “Lockstep Iteration”, to PEP 225, “Elementwise/Objectwise
Operators”.

@c ======================================================================

@node Unicode<2>,List Comprehensions,New Development Process,What’s New in Python 2 0
@anchor{whatsnew/2 0 unicode}@anchor{1733}
@subsection Unicode


The largest new feature in Python 2.0 is a new fundamental data type: Unicode
strings.  Unicode uses 16-bit numbers to represent characters instead of the
8-bit number used by ASCII, meaning that 65,536 distinct characters can be
supported.

The final interface for Unicode support was arrived at through countless
often-stormy discussions on the python-dev mailing list, and mostly implemented by
Marc-André Lemburg, based on a Unicode string type implementation by Fredrik
Lundh.  A detailed explanation of the interface was written up as 
@geindex Python 향상 제안; PEP 100
PEP 100@footnote{https://peps.python.org/pep-0100/},
“Python Unicode Integration”. This article will simply cover the most
significant points about the Unicode interfaces.

In Python source code, Unicode strings are written as @code{u"string"}.  Arbitrary
Unicode characters can be written using a new escape sequence, @code{\u@var{HHHH}}, where
`HHHH' is a 4-digit hexadecimal number from 0000 to FFFF.  The existing
@code{\x@var{HH}} escape sequence can also be used, and octal escapes can be used for
characters up to U+01FF, which is represented by @code{\777}.

Unicode strings, just like regular strings, are an immutable sequence type.
They can be indexed and sliced, but not modified in place. Unicode strings have
an @code{encode( [encoding] )} method that returns an 8-bit string in the desired
encoding.  Encodings are named by strings, such as @code{'ascii'}, @code{'utf-8'},
@code{'iso-8859-1'}, or whatever.  A codec API is defined for implementing and
registering new encodings that are then available throughout a Python program.
If an encoding isn’t specified, the default encoding is usually 7-bit ASCII,
though it can be changed for your Python installation by calling the
@code{sys.setdefaultencoding(encoding)} function in a customized version of
@code{site.py}.

Combining 8-bit and Unicode strings always coerces to Unicode, using the default
ASCII encoding; the result of @code{'a' + u'bc'} is @code{u'abc'}.

New built-in functions have been added, and existing built-ins modified to
support Unicode:


@itemize *

@item 
@code{unichr(ch)} returns a Unicode string 1 character long, containing the
character `ch'.

@item 
@code{ord(u)}, where `u' is a 1-character regular or Unicode string, returns the
number of the character as an integer.

@item 
@code{unicode(string [, encoding]  [, errors] )} creates a Unicode string
from an 8-bit string.  @code{encoding} is a string naming the encoding to use. The
@code{errors} parameter specifies the treatment of characters that are invalid for
the current encoding; passing @code{'strict'} as the value causes an exception to
be raised on any encoding error, while @code{'ignore'} causes errors to be silently
ignored and @code{'replace'} uses U+FFFD, the official replacement character, in
case of any problems.

@item 
The @code{exec} statement, and various built-ins such as @code{eval()},
@code{getattr()}, and @code{setattr()} will also accept Unicode strings as well as
regular strings.  (It’s possible that the process of fixing this missed some
built-ins; if you find a built-in function that accepts strings but doesn’t
accept Unicode strings at all, please report it as a bug.)
@end itemize

A new module, @ref{10b,,unicodedata}, provides an interface to Unicode character
properties.  For example, @code{unicodedata.category(u'A')} returns the 2-character
string ‘Lu’, the ‘L’ denoting it’s a letter, and ‘u’ meaning that it’s
uppercase. @code{unicodedata.bidirectional(u'\u0660')} returns ‘AN’, meaning that
U+0660 is an Arabic number.

The @ref{1c,,codecs} module contains functions to look up existing encodings and
register new ones.  Unless you want to implement a new encoding, you’ll most
often use the @code{codecs.lookup(encoding)} function, which returns a
4-element tuple: @code{(encode_func, decode_func, stream_reader, stream_writer)}.


@itemize *

@item 
`encode_func' is a function that takes a Unicode string, and returns a 2-tuple
@code{(string, length)}.  `string' is an 8-bit string containing a portion (perhaps
all) of the Unicode string converted into the given encoding, and `length' tells
you how much of the Unicode string was converted.

@item 
`decode_func' is the opposite of `encode_func', taking an 8-bit string and
returning a 2-tuple @code{(ustring, length)}, consisting of the resulting Unicode
string `ustring' and the integer `length' telling how much of the 8-bit string
was consumed.

@item 
`stream_reader' is a class that supports decoding input from a stream.
`stream_reader(file_obj)' returns an object that supports the @code{read()},
@code{readline()}, and @code{readlines()} methods.  These methods will all
translate from the given encoding and return Unicode strings.

@item 
`stream_writer', similarly, is a class that supports encoding output to a
stream.  `stream_writer(file_obj)' returns an object that supports the
@code{write()} and @code{writelines()} methods.  These methods expect Unicode
strings, translating them to the given encoding on output.
@end itemize

For example, the following code writes a Unicode string into a file,  encoding
it as UTF-8:

@example
import codecs

unistr = u'\u0660\u2000ab ...'

(UTF8_encode, UTF8_decode,
 UTF8_streamreader, UTF8_streamwriter) = codecs.lookup('UTF-8')

output = UTF8_streamwriter( open( '/tmp/output', 'wb') )
output.write( unistr )
output.close()
@end example

The following code would then read UTF-8 input from the file:

@example
input = UTF8_streamreader( open( '/tmp/output', 'rb') )
print repr(input.read())
input.close()
@end example

Unicode-aware regular expressions are available through the @ref{be,,re} module,
which has a new underlying implementation called SRE written by Fredrik Lundh of
Secret Labs AB.

A @code{-U} command line option was added which causes the Python compiler to
interpret all string literals as Unicode string literals. This is intended to be
used in testing and future-proofing your Python code, since some future version
of Python may drop support for 8-bit strings and provide only Unicode strings.

@c ======================================================================

@node List Comprehensions,Augmented Assignment,Unicode<2>,What’s New in Python 2 0
@anchor{whatsnew/2 0 list-comprehensions}@anchor{1734}
@subsection List Comprehensions


Lists are a workhorse data type in Python, and many programs manipulate a list
at some point.  Two common operations on lists are to loop over them, and either
pick out the elements that meet a certain criterion, or apply some function to
each element.  For example, given a list of strings, you might want to pull out
all the strings containing a given substring, or strip off trailing whitespace
from each line.

The existing @ref{19f,,map()} and @ref{a64,,filter()} functions can be used for this
purpose, but they require a function as one of their arguments.  This is fine if
there’s an existing built-in function that can be passed directly, but if there
isn’t, you have to create a little function to do the required work, and
Python’s scoping rules make the result ugly if the little function needs
additional information.  Take the first example in the previous paragraph,
finding all the strings in the list containing a given substring.  You could
write the following to do it:

@example
# Given the list L, make a list of all strings
# containing the substring S.
sublist = filter( lambda s, substring=S:
                     string.find(s, substring) != -1,
                  L)
@end example

Because of Python’s scoping rules, a default argument is used so that the
anonymous function created by the @ref{14a2,,lambda} expression knows what
substring is being searched for.  List comprehensions make this cleaner:

@example
sublist = [ s for s in L if string.find(s, S) != -1 ]
@end example

List comprehensions have the form:

@example
[ expression for expr in sequence1
             for expr2 in sequence2 ...
             for exprN in sequenceN
             if condition ]
@end example

The @code{for}…@code{in} clauses contain the sequences to be
iterated over.  The sequences do not have to be the same length, because they
are `not' iterated over in parallel, but from left to right; this is explained
more clearly in the following paragraphs.  The elements of the generated list
will be the successive values of `expression'.  The final @code{if} clause
is optional; if present, `expression' is only evaluated and added to the result
if `condition' is true.

To make the semantics very clear, a list comprehension is equivalent to the
following Python code:

@example
for expr1 in sequence1:
    for expr2 in sequence2:
    ...
        for exprN in sequenceN:
             if (condition):
                  # Append the value of
                  # the expression to the
                  # resulting list.
@end example

This means that when there are multiple @code{for}…@code{in}
clauses, the resulting list will be equal to the product of the lengths of all
the sequences.  If you have two lists of length 3, the output list is 9 elements
long:

@example
seq1 = 'abc'
seq2 = (1,2,3)
>>> [ (x,y) for x in seq1 for y in seq2]
[('a', 1), ('a', 2), ('a', 3), ('b', 1), ('b', 2), ('b', 3), ('c', 1),
('c', 2), ('c', 3)]
@end example

To avoid introducing an ambiguity into Python’s grammar, if `expression' is
creating a tuple, it must be surrounded with parentheses.  The first list
comprehension below is a syntax error, while the second one is correct:

@example
# Syntax error
[ x,y for x in seq1 for y in seq2]
# Correct
[ (x,y) for x in seq1 for y in seq2]
@end example

The idea of list comprehensions originally comes from the functional programming
language Haskell (@indicateurl{https://www.haskell.org}).  Greg Ewing argued most effectively
for adding them to Python and wrote the initial list comprehension patch, which
was then discussed for a seemingly endless time on the python-dev mailing list
and kept up-to-date by Skip Montanaro.

@c ======================================================================

@node Augmented Assignment,String Methods,List Comprehensions,What’s New in Python 2 0
@anchor{whatsnew/2 0 augmented-assignment}@anchor{1735}
@subsection Augmented Assignment


Augmented assignment operators, another long-requested feature, have been added
to Python 2.0.  Augmented assignment operators include @code{+=}, @code{-=}, @code{*=},
and so forth.  For example, the statement @code{a += 2} increments the value of the
variable  @code{a} by 2, equivalent to the slightly lengthier @code{a = a + 2}.

The full list of supported assignment operators is @code{+=}, @code{-=}, @code{*=},
@code{/=}, @code{%=}, @code{**=}, @code{&=}, @code{|=}, @code{^=}, @code{>>=}, and @code{<<=}.  Python
classes can override the augmented assignment operators by defining methods
named @code{__iadd__()}, @code{__isub__()}, etc.  For example, the following
@code{Number} class stores a number and supports using += to create a new
instance with an incremented value.

@c The empty groups below prevent conversion to guillemets.

@example
class Number:
    def __init__(self, value):
        self.value = value
    def __iadd__(self, increment):
        return Number( self.value + increment)

n = Number(5)
n += 3
print n.value
@end example

The @code{__iadd__()} special method is called with the value of the increment,
and should return a new instance with an appropriately modified value; this
return value is bound as the new value of the variable on the left-hand side.

Augmented assignment operators were first introduced in the C programming
language, and most C-derived languages, such as @code{awk}, C++, Java, Perl,
and PHP also support them.  The augmented assignment patch was implemented by
Thomas Wouters.

@c ======================================================================

@node String Methods,Garbage Collection of Cycles,Augmented Assignment,What’s New in Python 2 0
@anchor{whatsnew/2 0 string-methods}@anchor{1736}
@subsection String Methods


Until now string-manipulation functionality was in the @ref{d8,,string} module,
which was usually a front-end for the @code{strop} module written in C.  The
addition of Unicode posed a difficulty for the @code{strop} module, because the
functions would all need to be rewritten in order to accept either 8-bit or
Unicode strings.  For functions such as @code{string.replace()}, which takes 3
string arguments, that means eight possible permutations, and correspondingly
complicated code.

Instead, Python 2.0 pushes the problem onto the string type, making string
manipulation functionality available through methods on both 8-bit strings and
Unicode strings.

@example
>>> 'andrew'.capitalize()
'Andrew'
>>> 'hostname'.replace('os', 'linux')
'hlinuxtname'
>>> 'moshe'.find('sh')
2
@end example

One thing that hasn’t changed, a noteworthy April Fools’ joke notwithstanding,
is that Python strings are immutable. Thus, the string methods return new
strings, and do not modify the string on which they operate.

The old @ref{d8,,string} module is still around for backwards compatibility, but it
mostly acts as a front-end to the new string methods.

Two methods which have no parallel in pre-2.0 versions, although they did exist
in JPython for quite some time, are @code{startswith()} and @code{endswith()}.
@code{s.startswith(t)} is equivalent to @code{s[:len(t)] == t}, while
@code{s.endswith(t)} is equivalent to @code{s[-len(t):] == t}.

One other method which deserves special mention is @code{join()}.  The
@code{join()} method of a string receives one parameter, a sequence of strings,
and is equivalent to the @code{string.join()} function from the old @ref{d8,,string}
module, with the arguments reversed. In other words, @code{s.join(seq)} is
equivalent to the old @code{string.join(seq, s)}.

@c ======================================================================

@node Garbage Collection of Cycles,Other Core Changes,String Methods,What’s New in Python 2 0
@anchor{whatsnew/2 0 garbage-collection-of-cycles}@anchor{1737}
@subsection Garbage Collection of Cycles


The C implementation of Python uses reference counting to implement garbage
collection.  Every Python object maintains a count of the number of references
pointing to itself, and adjusts the count as references are created or
destroyed.  Once the reference count reaches zero, the object is no longer
accessible, since you need to have a reference to an object to access it, and if
the count is zero, no references exist any longer.

Reference counting has some pleasant properties: it’s easy to understand and
implement, and the resulting implementation is portable, fairly fast, and reacts
well with other libraries that implement their own memory handling schemes.  The
major problem with reference counting is that it sometimes doesn’t realise that
objects are no longer accessible, resulting in a memory leak.  This happens when
there are cycles of references.

Consider the simplest possible cycle,  a class instance which has a reference to
itself:

@example
instance = SomeClass()
instance.myself = instance
@end example

After the above two lines of code have been executed, the reference count of
@code{instance} is 2; one reference is from the variable named @code{'instance'}, and
the other is from the @code{myself} attribute of the instance.

If the next line of code is @code{del instance}, what happens?  The reference count
of @code{instance} is decreased by 1, so it has a reference count of 1; the
reference in the @code{myself} attribute still exists.  Yet the instance is no
longer accessible through Python code, and it could be deleted.  Several objects
can participate in a cycle if they have references to each other, causing all of
the objects to be leaked.

Python 2.0 fixes this problem by periodically executing a cycle detection
algorithm which looks for inaccessible cycles and deletes the objects involved.
A new @ref{64,,gc} module provides functions to perform a garbage collection,
obtain debugging statistics, and tuning the collector’s parameters.

Running the cycle detection algorithm takes some time, and therefore will result
in some additional overhead.  It is hoped that after we’ve gotten experience
with the cycle collection from using 2.0, Python 2.1 will be able to minimize
the overhead with careful tuning.  It’s not yet obvious how much performance is
lost, because benchmarking this is tricky and depends crucially on how often the
program creates and destroys objects.  The detection of cycles can be disabled
when Python is compiled, if you can’t afford even a tiny speed penalty or
suspect that the cycle collection is buggy, by specifying the
@code{--without-cycle-gc} switch when running the @code{configure}
script.

Several people tackled this problem and contributed to a solution.  An early
implementation of the cycle detection approach was written by Toby Kelsey.  The
current algorithm was suggested by Eric Tiedemann during a visit to CNRI, and
Guido van Rossum and Neil Schemenauer wrote two different implementations, which
were later integrated by Neil.  Lots of other people offered suggestions along
the way; the March 2000 archives of the python-dev mailing list contain most of
the relevant discussion, especially in the threads titled “Reference cycle
collection for Python” and “Finalization again”.

@c ======================================================================

@node Other Core Changes,Porting to 2 0,Garbage Collection of Cycles,What’s New in Python 2 0
@anchor{whatsnew/2 0 other-core-changes}@anchor{1738}
@subsection Other Core Changes


Various minor changes have been made to Python’s syntax and built-in functions.
None of the changes are very far-reaching, but they’re handy conveniences.

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

@end menu

@node Minor Language Changes,Changes to Built-in Functions,,Other Core Changes
@anchor{whatsnew/2 0 minor-language-changes}@anchor{1739}
@subsubsection Minor Language Changes


A new syntax makes it more convenient to call a given function with a tuple of
arguments and/or a dictionary of keyword arguments. In Python 1.5 and earlier,
you’d use the @code{apply()} built-in function: @code{apply(f, args, kw)} calls the
function @code{f()} with the argument tuple `args' and the keyword arguments in
the dictionary `kw'.  @code{apply()}  is the same in 2.0, but thanks to a patch
from Greg Ewing, @code{f(*args, **kw)} is a shorter and clearer way to achieve the
same effect.  This syntax is symmetrical with the syntax for defining
functions:

@example
def f(*args, **kw):
    # args is a tuple of positional args,
    # kw is a dictionary of keyword args
    ...
@end example

The @code{print} statement can now have its output directed to a file-like
object by following the @code{print} with  @code{>> file}, similar to the
redirection operator in Unix shells. Previously you’d either have to use the
@code{write()} method of the file-like object, which lacks the convenience and
simplicity of @code{print}, or you could assign a new value to
@code{sys.stdout} and then restore the old value.  For sending output to standard
error, it’s much easier to write this:

@example
print >> sys.stderr, "Warning: action field not supplied"
@end example

Modules can now be renamed on importing them, using the syntax @code{import module
as name} or @code{from module import name as othername}.  The patch was submitted
by Thomas Wouters.

A new format style is available when using the @code{%} operator; ‘%r’ will insert
the @ref{1c1,,repr()} of its argument.  This was also added from symmetry
considerations, this time for symmetry with the existing ‘%s’ format style,
which inserts the @ref{169,,str()} of its argument.  For example, @code{'%r %s' % ('abc',
'abc')} returns a string containing @code{'abc' abc}.

Previously there was no way to implement a class that overrode Python’s built-in
@ref{34b,,in} operator and implemented a custom version.  @code{obj in seq} returns
true if `obj' is present in the sequence `seq'; Python computes this by simply
trying every index of the sequence until either `obj' is found or an
@ref{173a,,IndexError} is encountered.  Moshe Zadka contributed a patch which adds a
@code{__contains__()} magic method for providing a custom implementation for
@code{in}. Additionally, new built-in objects written in C can define what
@code{in} means for them via a new slot in the sequence protocol.

Earlier versions of Python used a recursive algorithm for deleting objects.
Deeply nested data structures could cause the interpreter to fill up the C stack
and crash; Christian Tismer rewrote the deletion logic to fix this problem.  On
a related note, comparing recursive objects recursed infinitely and crashed;
Jeremy Hylton rewrote the code to no longer crash, producing a useful result
instead.  For example, after this code:

@example
a = []
b = []
a.append(a)
b.append(b)
@end example

The comparison @code{a==b} returns true, because the two recursive data structures
are isomorphic. See the thread “trashcan and PR#7” in the April 2000 archives of
the python-dev mailing list for the discussion leading up to this
implementation, and some useful relevant links.    Note that comparisons can now
also raise exceptions. In earlier versions of Python, a comparison operation
such as @code{cmp(a,b)} would always produce an answer, even if a user-defined
@code{__cmp__()} method encountered an error, since the resulting exception would
simply be silently swallowed.

@c Starting URL:

@c https://www.python.org/pipermail/python-dev/2000-April/004834.html

Work has been done on porting Python to 64-bit Windows on the Itanium processor,
mostly by Trent Mick of ActiveState.  (Confusingly, @code{sys.platform} is still
@code{'win32'} on Win64 because it seems that for ease of porting, MS Visual C++
treats code as 32 bit on Itanium.) PythonWin also supports Windows CE; see the
Python CE page at @indicateurl{https://pythonce.sourceforge.net/} for more information.

Another new platform is Darwin/MacOS X; initial support for it is in Python 2.0.
Dynamic loading works, if you specify “configure –with-dyld –with-suffix=.x”.
Consult the README in the Python source distribution for more instructions.

An attempt has been made to alleviate one of Python’s warts, the often-confusing
@ref{452,,NameError} exception when code refers to a local variable before the
variable has been assigned a value.  For example, the following code raises an
exception on the @code{print} statement in both 1.5.2 and 2.0; in 1.5.2 a
@code{NameError} exception is raised, while 2.0 raises a new
@ref{173b,,UnboundLocalError} exception. @code{UnboundLocalError} is a subclass of
@code{NameError}, so any existing code that expects @code{NameError} to be
raised should still work.

@example
def f():
    print "i=",i
    i = i + 1
f()
@end example

Two new exceptions, @ref{764,,TabError} and @ref{9ab,,IndentationError}, have been
introduced.  They’re both subclasses of @ref{18e,,SyntaxError}, and are raised when
Python code is found to be improperly indented.

@node Changes to Built-in Functions,,Minor Language Changes,Other Core Changes
@anchor{whatsnew/2 0 changes-to-built-in-functions}@anchor{173c}
@subsubsection Changes to Built-in Functions


A new built-in, @code{zip(seq1, seq2, ...)}, has been added.  @ref{1a0,,zip()}
returns a list of tuples where each tuple contains the i-th element from each of
the argument sequences.  The difference between @code{zip()} and @code{map(None,
seq1, seq2)} is that @ref{19f,,map()} pads the sequences with @code{None} if the
sequences aren’t all of the same length, while @code{zip()} truncates the
returned list to the length of the shortest argument sequence.

The @ref{19b,,int()} and @code{long()} functions now accept an optional “base”
parameter when the first argument is a string. @code{int('123', 10)} returns 123,
while @code{int('123', 16)} returns 291.  @code{int(123, 16)} raises a
@ref{198,,TypeError} exception with the message “can’t convert non-string with
explicit base”.

A new variable holding more detailed version information has been added to the
@ref{df,,sys} module.  @code{sys.version_info} is a tuple @code{(major, minor, micro,
level, serial)} For example, in a hypothetical 2.0.1beta1, @code{sys.version_info}
would be @code{(2, 0, 1, 'beta', 1)}. `level' is a string such as @code{"alpha"},
@code{"beta"}, or @code{"final"} for a final release.

Dictionaries have an odd new method, @code{setdefault(key, default)}, which
behaves similarly to the existing @code{get()} method.  However, if the key is
missing, @code{setdefault()} both returns the value of `default' as @code{get()}
would do, and also inserts it into the dictionary as the value for `key'.  Thus,
the following lines of code:

@example
if dict.has_key( key ): return dict[key]
else:
    dict[key] = []
    return dict[key]
@end example

can be reduced to a single @code{return dict.setdefault(key, [])} statement.

The interpreter sets a maximum recursion depth in order to catch runaway
recursion before filling the C stack and causing a core dump or GPF..
Previously this limit was fixed when you compiled Python, but in 2.0 the maximum
recursion depth can be read and modified using @ref{6ea,,sys.getrecursionlimit()} and
@ref{6e9,,sys.setrecursionlimit()}. The default value is 1000, and a rough maximum
value for a given platform can be found by running a new script,
@code{Misc/find_recursionlimit.py}.

@c ======================================================================

@node Porting to 2 0,Extending/Embedding Changes,Other Core Changes,What’s New in Python 2 0
@anchor{whatsnew/2 0 porting-to-2-0}@anchor{173d}
@subsection Porting to 2.0


New Python releases try hard to be compatible with previous releases, and the
record has been pretty good.  However, some changes are considered useful
enough, usually because they fix initial design decisions that turned out to be
actively mistaken, that breaking backward compatibility can’t always be avoided.
This section lists the changes in Python 2.0 that may cause old Python code to
break.

The change which will probably break the most code is tightening up the
arguments accepted by some methods.  Some methods would take multiple arguments
and treat them as a tuple, particularly various list methods such as
@ref{8db,,append()} and @ref{139d,,insert()}.
In earlier versions of Python, if @code{L} is
a list, @code{L.append( 1,2 )} appends the tuple @code{(1,2)} to the list.  In Python
2.0 this causes a @ref{198,,TypeError} exception to be raised, with the message:
‘append requires exactly 1 argument; 2 given’.  The fix is to simply add an
extra set of parentheses to pass both values as a tuple:  @code{L.append( (1,2) )}.

The earlier versions of these methods were more forgiving because they used an
old function in Python’s C interface to parse their arguments; 2.0 modernizes
them to use @ref{3c1,,PyArg_ParseTuple()}, the current argument parsing function,
which provides more helpful error messages and treats multi-argument calls as
errors.  If you absolutely must use 2.0 but can’t fix your code, you can edit
@code{Objects/listobject.c} and define the preprocessor symbol
@code{NO_STRICT_LIST_APPEND} to preserve the old behaviour; this isn’t recommended.

Some of the functions in the @ref{d1,,socket} module are still forgiving in this
way.  For example, @code{socket.connect( ('hostname', 25) )} is the correct
form, passing a tuple representing an IP address, but @code{socket.connect('hostname', 25)}
also works. @ref{173e,,socket.connect_ex} and @ref{173f,,socket.bind}
are similarly easy-going.  2.0alpha1 tightened these functions up, but because
the documentation actually used the erroneous multiple argument form, many
people wrote code which would break with the stricter checking.  GvR backed out
the changes in the face of public reaction, so for the @code{socket} module, the
documentation was fixed and the multiple argument form is simply marked as
deprecated; it `will' be tightened up again in a future Python version.

The @code{\x} escape in string literals now takes exactly 2 hex digits.  Previously
it would consume all the hex digits following the ‘x’ and take the lowest 8 bits
of the result, so @code{\x123456} was equivalent to @code{\x56}.

The @ref{5ee,,AttributeError} and @ref{452,,NameError} exceptions have a more friendly
error message, whose text will be something like @code{'Spam' instance has no
attribute 'eggs'} or @code{name 'eggs' is not defined}.  Previously the error
message was just the missing attribute name @code{eggs}, and code written to take
advantage of this fact will break in 2.0.

Some work has been done to make integers and long integers a bit more
interchangeable.  In 1.5.2, large-file support was added for Solaris, to allow
reading files larger than 2 GiB; this made the @code{tell()} method of file
objects return a long integer instead of a regular integer.  Some code would
subtract two file offsets and attempt to use the result to multiply a sequence
or slice a string, but this raised a @ref{198,,TypeError}.  In 2.0, long integers
can be used to multiply or slice a sequence, and it’ll behave as you’d
intuitively expect it to; @code{3L * 'abc'} produces ‘abcabcabc’, and
@code{(0,1,2,3)[2L:4L]} produces (2,3). Long integers can also be used in various
contexts where previously only integers were accepted, such as in the
@code{seek()} method of file objects, and in the formats supported by the @code{%}
operator (@code{%d}, @code{%i}, @code{%x}, etc.).  For example, @code{"%d" % 2L**64} will
produce the string @code{18446744073709551616}.

The subtlest long integer change of all is that the @ref{169,,str()} of a long
integer no longer has a trailing ‘L’ character, though @ref{1c1,,repr()} still
includes it.  The ‘L’ annoyed many people who wanted to print long integers that
looked just like regular integers, since they had to go out of their way to chop
off the character.  This is no longer a problem in 2.0, but code which does
@code{str(longval)[:-1]} and assumes the ‘L’ is there, will now lose the final
digit.

Taking the @ref{1c1,,repr()} of a float now uses a different formatting precision
than @ref{169,,str()}.  @code{repr()} uses @code{%.17g} format string for C’s
@code{sprintf()}, while @code{str()} uses @code{%.12g} as before.  The effect is that
@code{repr()} may occasionally show more decimal places than  @code{str()}, for
certain numbers.  For example, the number 8.1 can’t be represented exactly in
binary, so @code{repr(8.1)} is @code{'8.0999999999999996'}, while str(8.1) is
@code{'8.1'}.

The @code{-X} command-line option, which turned all standard exceptions into
strings instead of classes, has been removed; the standard exceptions will now
always be classes.  The @code{exceptions} module containing the standard
exceptions was translated from Python to a built-in C module, written by Barry
Warsaw and Fredrik Lundh.

@c Commented out for now -- I don't think anyone will care.
@c The pattern and match objects provided by SRE are C types, not Python
@c class instances as in 1.5.  This means you can no longer inherit from
@c \class{RegexObject} or \class{MatchObject}, but that shouldn't be much
@c of a problem since no one should have been doing that in the first
@c place.

@c ======================================================================

@node Extending/Embedding Changes,Distutils Making Modules Easy to Install,Porting to 2 0,What’s New in Python 2 0
@anchor{whatsnew/2 0 extending-embedding-changes}@anchor{1740}
@subsection Extending/Embedding Changes


Some of the changes are under the covers, and will only be apparent to people
writing C extension modules or embedding a Python interpreter in a larger
application.  If you aren’t dealing with Python’s C API, you can safely skip
this section.

The version number of the Python C API was incremented, so C extensions compiled
for 1.5.2 must be recompiled in order to work with 2.0.  On Windows, it’s not
possible for Python 2.0 to import a third party extension built for Python 1.5.x
due to how Windows DLLs work, so Python will raise an exception and the import
will fail.

Users of Jim Fulton’s ExtensionClass module will be pleased to find out that
hooks have been added so that ExtensionClasses are now supported by
@ref{2ad,,isinstance()} and @ref{9c4,,issubclass()}. This means you no longer have to
remember to write code such as @code{if type(obj) == myExtensionClass}, but can use
the more natural @code{if isinstance(obj, myExtensionClass)}.

The @code{Python/importdl.c} file, which was a mass of #ifdefs to support
dynamic loading on many different platforms, was cleaned up and reorganised by
Greg Stein.  @code{importdl.c} is now quite small, and platform-specific code
has been moved into a bunch of @code{Python/dynload_*.c} files.  Another
cleanup: there were also a number of @code{my*.h} files in the Include/
directory that held various portability hacks; they’ve been merged into a single
file, @code{Include/pyport.h}.

Vladimir Marangozov’s long-awaited malloc restructuring was completed, to make
it easy to have the Python interpreter use a custom allocator instead of C’s
standard @code{malloc()}.  For documentation, read the comments in
@code{Include/pymem.h} and @code{Include/objimpl.h}.  For the lengthy
discussions during which the interface was hammered out, see the web archives of
the ‘patches’ and ‘python-dev’ lists at python.org.

Recent versions of the GUSI development environment for MacOS support POSIX
threads.  Therefore, Python’s POSIX threading support now works on the
Macintosh.  Threading support using the user-space GNU @code{pth} library was also
contributed.

Threading support on Windows was enhanced, too.  Windows supports thread locks
that use kernel objects only in case of contention; in the common case when
there’s no contention, they use simpler functions which are an order of
magnitude faster.  A threaded version of Python 1.5.2 on NT is twice as slow as
an unthreaded version; with the 2.0 changes, the difference is only 10%.  These
improvements were contributed by Yakov Markovitch.

Python 2.0’s source now uses only ANSI C prototypes, so compiling Python now
requires an ANSI C compiler, and can no longer be done using a compiler that
only supports K&R C.

Previously the Python virtual machine used 16-bit numbers in its bytecode,
limiting the size of source files.  In particular, this affected the maximum
size of literal lists and dictionaries in Python source; occasionally people who
are generating Python code would run into this limit.  A patch by Charles G.
Waldman raises the limit from @code{2**16} to @code{2**32}.

Three new convenience functions intended for adding constants to a module’s
dictionary at module initialization time were added: @ref{608,,PyModule_AddObject()},
@ref{1741,,PyModule_AddIntConstant()}, and @ref{1742,,PyModule_AddStringConstant()}.  Each
of these functions takes a module object, a null-terminated C string containing
the name to be added, and a third argument for the value to be assigned to the
name.  This third argument is, respectively, a Python object, a C long, or a C
string.

A wrapper API was added for Unix-style signal handlers. @ref{1743,,PyOS_getsig()} gets
a signal handler and @ref{1744,,PyOS_setsig()} will set a new handler.

@c ======================================================================

@node Distutils Making Modules Easy to Install,XML Modules,Extending/Embedding Changes,What’s New in Python 2 0
@anchor{whatsnew/2 0 distutils-making-modules-easy-to-install}@anchor{1745}
@subsection Distutils: Making Modules Easy to Install


Before Python 2.0, installing modules was a tedious affair – there was no way
to figure out automatically where Python is installed, or what compiler options
to use for extension modules.  Software authors had to go through an arduous
ritual of editing Makefiles and configuration files, which only really work on
Unix and leave Windows and MacOS unsupported.  Python users faced wildly
differing installation instructions which varied between different extension
packages, which made administering a Python installation something of  a chore.

The SIG for distribution utilities, shepherded by Greg Ward, has created the
Distutils, a system to make package installation much easier.  They form the
@code{distutils} package, a new part of Python’s standard library. In the best
case, installing a Python module from source will require the same steps: first
you simply mean unpack the tarball or zip archive, and the run “@code{python
setup.py install}”.  The platform will be automatically detected, the compiler
will be recognized, C extension modules will be compiled, and the distribution
installed into the proper directory.  Optional command-line arguments provide
more control over the installation process, the distutils package offers many
places to override defaults – separating the build from the install, building
or installing in non-default directories, and more.

In order to use the Distutils, you need to write a @code{setup.py} script.  For
the simple case, when the software contains only .py files, a minimal
@code{setup.py} can be just a few lines long:

@example
from distutils.core import setup
setup (name = "foo", version = "1.0",
       py_modules = ["module1", "module2"])
@end example

The @code{setup.py} file isn’t much more complicated if the software consists
of a few packages:

@example
from distutils.core import setup
setup (name = "foo", version = "1.0",
       packages = ["package", "package.subpackage"])
@end example

A C extension can be the most complicated case; here’s an example taken from
the PyXML package:

@example
from distutils.core import setup, Extension

expat_extension = Extension('xml.parsers.pyexpat',
     define_macros = [('XML_NS', None)],
     include_dirs = [ 'extensions/expat/xmltok',
                      'extensions/expat/xmlparse' ],
     sources = [ 'extensions/pyexpat.c',
                 'extensions/expat/xmltok/xmltok.c',
                 'extensions/expat/xmltok/xmlrole.c', ]
       )
setup (name = "PyXML", version = "0.5.4",
       ext_modules =[ expat_extension ] )
@end example

The Distutils can also take care of creating source and binary distributions.
The “sdist” command, run by “@code{python setup.py sdist}’, builds a source
distribution such as @code{foo-1.0.tar.gz}. Adding new commands isn’t
difficult, “bdist_rpm” and “bdist_wininst” commands have already been
contributed to create an RPM distribution and a Windows installer for the
software, respectively.  Commands to create other distribution formats such as
Debian packages and Solaris @code{.pkg} files are in various stages of
development.

All this is documented in a new manual, `Distributing Python Modules', that
joins the basic set of Python documentation.

@c ======================================================================

@node XML Modules,Module changes,Distutils Making Modules Easy to Install,What’s New in Python 2 0
@anchor{whatsnew/2 0 xml-modules}@anchor{1746}
@subsection XML Modules


Python 1.5.2 included a simple XML parser in the form of the @code{xmllib}
module, contributed by Sjoerd Mullender.  Since 1.5.2’s release, two different
interfaces for processing XML have become common: SAX2 (version 2 of the Simple
API for XML) provides an event-driven interface with some similarities to
@code{xmllib}, and the DOM (Document Object Model) provides a tree-based
interface, transforming an XML document into a tree of nodes that can be
traversed and modified.  Python 2.0 includes a SAX2 interface and a stripped-down
DOM interface as part of the @ref{126,,xml} package. Here we will give a brief
overview of these new interfaces; consult the Python documentation or the source
code for complete details. The Python XML SIG is also working on improved
documentation.

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

@end menu

@node SAX2 Support,DOM Support,,XML Modules
@anchor{whatsnew/2 0 sax2-support}@anchor{1747}
@subsubsection SAX2 Support


SAX defines an event-driven interface for parsing XML.  To use SAX, you must
write a SAX handler class.  Handler classes inherit from various classes
provided by SAX, and override various methods that will then be called by the
XML parser.  For example, the @ref{1748,,startElement()} and @ref{1749,,endElement()}
methods are called for every starting and end tag encountered by the parser, the
@ref{174a,,characters()} method is called for every chunk of character data, and so
forth.

The advantage of the event-driven approach is that the whole document doesn’t
have to be resident in memory at any one time, which matters if you are
processing really huge documents.  However, writing the SAX handler class can
get very complicated if you’re trying to modify the document structure in some
elaborate way.

For example, this little example program defines a handler that prints a message
for every starting and ending tag, and then parses the file @code{hamlet.xml}
using it:

@example
from xml import sax

class SimpleHandler(sax.ContentHandler):
    def startElement(self, name, attrs):
        print 'Start of element:', name, attrs.keys()

    def endElement(self, name):
        print 'End of element:', name

# Create a parser object
parser = sax.make_parser()

# Tell it what handler to use
handler = SimpleHandler()
parser.setContentHandler( handler )

# Parse a file!
parser.parse( 'hamlet.xml' )
@end example

For more information, consult the Python documentation, or the XML HOWTO at
@indicateurl{https://pyxml.sourceforge.net/topics/howto/xml-howto.html}.

@node DOM Support,Relationship to PyXML,SAX2 Support,XML Modules
@anchor{whatsnew/2 0 dom-support}@anchor{174b}
@subsubsection DOM Support


The Document Object Model is a tree-based representation for an XML document.  A
top-level @code{Document} instance is the root of the tree, and has a single
child which is the top-level @code{Element} instance. This @code{Element}
has children nodes representing character data and any sub-elements, which may
have further children of their own, and so forth.  Using the DOM you can
traverse the resulting tree any way you like, access element and attribute
values, insert and delete nodes, and convert the tree back into XML.

The DOM is useful for modifying XML documents, because you can create a DOM
tree, modify it by adding new nodes or rearranging subtrees, and then produce a
new XML document as output.  You can also construct a DOM tree manually and
convert it to XML, which can be a more flexible way of producing XML output than
simply writing @code{<tag1>}…@code{</tag1>} to a file.

The DOM implementation included with Python lives in the @ref{128,,xml.dom.minidom}
module.  It’s a lightweight implementation of the Level 1 DOM with support for
XML namespaces.  The  @code{parse()} and @code{parseString()} convenience
functions are provided for generating a DOM tree:

@example
from xml.dom import minidom
doc = minidom.parse('hamlet.xml')
@end example

@code{doc} is a @code{Document} instance.  @code{Document}, like all the other
DOM classes such as @code{Element} and @code{Text}, is a subclass of the
@code{Node} base class.  All the nodes in a DOM tree therefore support certain
common methods, such as @code{toxml()} which returns a string containing the XML
representation of the node and its children.  Each class also has special
methods of its own; for example, @code{Element} and @code{Document}
instances have a method to find all child elements with a given tag name.
Continuing from the previous 2-line example:

@example
perslist = doc.getElementsByTagName( 'PERSONA' )
print perslist[0].toxml()
print perslist[1].toxml()
@end example

For the `Hamlet' XML file, the above few lines output:

@example
<PERSONA>CLAUDIUS, king of Denmark. </PERSONA>
<PERSONA>HAMLET, son to the late, and nephew to the present king.</PERSONA>
@end example

The root element of the document is available as @code{doc.documentElement}, and
its children can be easily modified by deleting, adding, or removing nodes:

@example
root = doc.documentElement

# Remove the first child
root.removeChild( root.childNodes[0] )

# Move the new first child to the end
root.appendChild( root.childNodes[0] )

# Insert the new first child (originally,
# the third child) before the 20th child.
root.insertBefore( root.childNodes[0], root.childNodes[20] )
@end example

Again, I will refer you to the Python documentation for a complete listing of
the different @code{Node} classes and their various methods.

@node Relationship to PyXML,,DOM Support,XML Modules
@anchor{whatsnew/2 0 relationship-to-pyxml}@anchor{174c}
@subsubsection Relationship to PyXML


The XML Special Interest Group has been working on XML-related Python code for a
while.  Its code distribution, called PyXML, is available from the SIG’s web
pages at @indicateurl{https://www.python.org/community/sigs/current/xml-sig}. The PyXML distribution also used
the package name @code{xml}.  If you’ve written programs that used PyXML, you’re
probably wondering about its compatibility with the 2.0 @ref{126,,xml} package.

The answer is that Python 2.0’s @ref{126,,xml} package isn’t compatible with PyXML,
but can be made compatible by installing a recent version PyXML.  Many
applications can get by with the XML support that is included with Python 2.0,
but more complicated applications will require that the full PyXML package will
be installed.  When installed, PyXML versions 0.6.0 or greater will replace the
@code{xml} package shipped with Python, and will be a strict superset of the
standard package, adding a bunch of additional features.  Some of the additional
features in PyXML include:


@itemize *

@item 
4DOM, a full DOM implementation from FourThought, Inc.

@item 
The xmlproc validating parser, written by Lars Marius Garshol.

@item 
The @code{sgmlop} parser accelerator module, written by Fredrik Lundh.
@end itemize

@c ======================================================================

@node Module changes,New modules<2>,XML Modules,What’s New in Python 2 0
@anchor{whatsnew/2 0 module-changes}@anchor{174d}
@subsection Module changes


Lots of improvements and bugfixes were made to Python’s extensive standard
library; some of the affected modules include @ref{bf,,readline},
@ref{26,,ConfigParser}, @code{cgi}, @ref{15,,calendar}, @ref{b2,,posix}, @code{readline},
@code{xmllib}, @code{aifc}, @code{chunk}, @ref{119,,wave}, @ref{bd,,random}, @ref{c8,,shelve},
and @code{nntplib}.  Consult the CVS logs for the exact patch-by-patch details.

Brian Gallew contributed OpenSSL support for the @ref{d1,,socket} module.  OpenSSL
is an implementation of the Secure Socket Layer, which encrypts the data being
sent over a socket.  When compiling Python, you can edit @code{Modules/Setup}
to include SSL support, which adds an additional function to the @code{socket}
module: @code{socket.ssl(socket, keyfile, certfile)}, which takes a socket
object and returns an SSL socket.  The @ref{72,,httplib} and @ref{10e,,urllib} modules
were also changed to support @code{https://} URLs, though no one has implemented
FTP or SMTP over SSL.

The @ref{72,,httplib} module has been rewritten by Greg Stein to support HTTP/1.1.

Backward compatibility with the 1.5 version of @code{httplib} is provided,
though using HTTP/1.1 features such as pipelining will require rewriting code to
use a different set of interfaces.

The @code{Tkinter} module now supports Tcl/Tk version 8.1, 8.2, or 8.3, and
support for the older 7.x versions has been dropped.  The Tkinter module now
supports displaying Unicode strings in Tk widgets. Also, Fredrik Lundh
contributed an optimization which makes operations like @code{create_line} and
@code{create_polygon} much faster, especially when using lots of coordinates.

The @ref{2f,,curses} module has been greatly extended, starting from Oliver
Andrich’s enhanced version, to provide many additional functions from ncurses
and SYSV curses, such as colour, alternative character set support, pads, and
mouse support.  This means the module is no longer compatible with operating
systems that only have BSD curses, but there don’t seem to be any currently
maintained OSes that fall into this category.

As mentioned in the earlier discussion of 2.0’s Unicode support, the underlying
implementation of the regular expressions provided by the @ref{be,,re} module has
been changed.  SRE, a new regular expression engine written by Fredrik Lundh and
partially funded by Hewlett Packard, supports matching against both 8-bit
strings and Unicode strings.

@c ======================================================================

@node New modules<2>,IDLE Improvements,Module changes,What’s New in Python 2 0
@anchor{whatsnew/2 0 new-modules}@anchor{174e}
@subsection New modules


A number of new modules were added.  We’ll simply list them with brief
descriptions; consult the 2.0 documentation for the details of a particular
module.


@itemize *

@item 
@ref{d,,atexit}:  For registering functions to be called before the Python
interpreter exits. Code that currently sets @code{sys.exitfunc} directly should be
changed to  use the @code{atexit} module instead, importing @code{atexit} and
calling @ref{a7e,,atexit.register()} with  the function to be called on exit.
(Contributed by Skip Montanaro.)

@item 
@ref{1c,,codecs}, @code{encodings}, @ref{10b,,unicodedata}:  Added as part of the new
Unicode support.

@item 
@ref{5e,,filecmp}: Supersedes the old @code{cmp}, @code{cmpcache} and
@code{dircmp} modules, which have now become deprecated. (Contributed by Gordon
MacMillan and Moshe Zadka.)

@item 
@ref{67,,gettext}: This module provides internationalization (I18N) and
localization (L10N) support for Python programs by providing an interface to the
GNU gettext message catalog library. (Integrated by Barry Warsaw, from separate
contributions by Martin  von Löwis, Peter Funk, and James Henstridge.)

@item 
@code{linuxaudiodev}: Support for the @code{/dev/audio} device on Linux, a
twin to the existing @code{sunaudiodev} module. (Contributed by Peter Bosch,
with fixes by Jeremy Hylton.)

@item 
@ref{94,,mmap}: An interface to memory-mapped files on both Windows and Unix.  A
file’s contents can be mapped directly into memory, at which point it behaves
like a mutable string, so its contents can be read and modified.  They can even
be passed to functions that expect ordinary strings, such as the @ref{be,,re}
module. (Contributed by Sam Rushing, with some extensions by A.M. Kuchling.)

@item 
@code{pyexpat}: An interface to the Expat XML parser. (Contributed by Paul
Prescod.)

@item 
@ref{113,,robotparser}: Parse a @code{robots.txt} file, which is used for writing
web spiders that politely avoid certain areas of a web site.  The parser accepts
the contents of a @code{robots.txt} file, builds a set of rules from it, and
can then answer questions about the fetchability of a given URL.  (Contributed
by Skip Montanaro.)

@item 
@ref{e3,,tabnanny}: A module/script to  check Python source code for ambiguous
indentation. (Contributed by Tim Peters.)

@item 
@code{UserString}: A base class useful for deriving objects that behave like
strings.

@item 
@ref{11b,,webbrowser}: A module that provides a platform independent way to launch
a web browser on a specific URL. For each platform, various browsers are tried
in a specific order. The user can alter which browser is launched by setting the
`BROWSER' environment variable.  (Originally inspired by Eric S. Raymond’s patch
to @ref{10e,,urllib} which added similar functionality, but the final module comes
from code originally  implemented by Fred Drake as
@code{Tools/idle/BrowserControl.py}, and adapted for the standard library by
Fred.)

@item 
@ref{11c,,_winreg}: An interface to the Windows registry.  @code{_winreg} is an
adaptation of functions that have been part of PythonWin since 1995, but has now
been added to the core  distribution, and enhanced to support Unicode.
@code{_winreg} was written by Bill Tutt and Mark Hammond.

@item 
@ref{137,,zipfile}: A module for reading and writing ZIP-format archives.  These
are archives produced by @code{PKZIP} on DOS/Windows or @code{zip} on
Unix, not to be confused with @code{gzip}-format files (which are
supported by the @ref{6b,,gzip} module) (Contributed by James C. Ahlstrom.)

@item 
@code{imputil}: A module that provides a simpler way for writing customized
import hooks, in comparison to the existing @code{ihooks} module.  (Implemented
by Greg Stein, with much discussion on python-dev along the way.)
@end itemize

@c ======================================================================

@node IDLE Improvements,Deleted and Deprecated Modules,New modules<2>,What’s New in Python 2 0
@anchor{whatsnew/2 0 idle-improvements}@anchor{174f}
@subsection IDLE Improvements


IDLE is the official Python cross-platform IDE, written using Tkinter. Python
2.0 includes IDLE 0.6, which adds a number of new features and improvements.  A
partial list:


@itemize *

@item 
UI improvements and optimizations, especially in the area of syntax
highlighting and auto-indentation.

@item 
The class browser now shows more information, such as the top level functions
in a module.

@item 
Tab width is now a user settable option. When opening an existing Python file,
IDLE automatically detects the indentation conventions, and adapts.

@item 
There is now support for calling browsers on various platforms, used to open
the Python documentation in a browser.

@item 
IDLE now has a command line, which is largely similar to  the vanilla Python
interpreter.

@item 
Call tips were added in many places.

@item 
IDLE can now be installed as a package.

@item 
In the editor window, there is now a line/column bar at the bottom.

@item 
Three new keystroke commands: Check module (@code{Alt}-@code{F5}), Import module (@code{F5}) and
Run script (@code{Ctrl}-@code{F5}).
@end itemize

@c ======================================================================

@node Deleted and Deprecated Modules,Acknowledgements<8>,IDLE Improvements,What’s New in Python 2 0
@anchor{whatsnew/2 0 deleted-and-deprecated-modules}@anchor{1750}
@subsection Deleted and Deprecated Modules


A few modules have been dropped because they’re obsolete, or because there are
now better ways to do the same thing.  The @code{stdwin} module is gone; it was
for a platform-independent windowing toolkit that’s no longer developed.

A number of modules have been moved to the @code{lib-old} subdirectory:
@code{cmp}, @code{cmpcache}, @code{dircmp}, @code{dump},  @code{find},
@code{grep}, @code{packmail},  @code{poly}, @code{util}, @code{whatsound},
@code{zmod}.  If you have code which relies on a module  that’s been moved to
@code{lib-old}, you can simply add that directory to @code{sys.path}   to get them
back, but you’re encouraged to update any code that uses these modules.

@node Acknowledgements<8>,,Deleted and Deprecated Modules,What’s New in Python 2 0
@anchor{whatsnew/2 0 acknowledgements}@anchor{1751}
@subsection Acknowledgements


The authors would like to thank the following people for offering suggestions on
various drafts of this article: David Bolen, Mark Hammond, Gregg Hauser, Jeremy
Hylton, Fredrik Lundh, Detlef Lannert, Aahz Maruch, Skip Montanaro, Vladimir
Marangozov, Tobias Polzin, Guido van Rossum, Neil Schemenauer, and Russ Schmidt.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

“Changelog” 는 Misc/NEWS.d@footnote{https://github.com/python/cpython/tree/3.14/Misc/NEWS.d} 디렉터리 트리의 내용으로부터 만들어진 파일@footnote{https://pypi.org/project/blurb/}의 HTML 버전입니다. 현재 버전의 파이썬에 적용된 `모든' 사소하지 않은 변경들을 담고 있습니다

@node Changelog,,What’s New in Python 2 0,파이썬의 새로운 기능
@anchor{whatsnew/changelog doc}@anchor{1752}@anchor{whatsnew/changelog changelog}@anchor{142}@anchor{whatsnew/changelog id1}@anchor{1753}@anchor{whatsnew/changelog translation-repo}@anchor{1754}
@section Changelog


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

@end menu

@node Python next,Python 3 14 3 final,,Changelog
@anchor{whatsnew/changelog python-next}@anchor{1755}
@subsection Python next


`Release date: XXXX-XX-XX'

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

@end menu

@node macOS,Windows,,Python next
@anchor{whatsnew/changelog macos}@anchor{1756}
@subsubsection macOS



@itemize -

@item 
gh-144551@footnote{https://github.com/python/cpython/issues/144551}: Update macOS installer to use OpenSSL 3.0.19.
@end itemize

@node Windows,Tests,macOS,Python next
@anchor{whatsnew/changelog windows}@anchor{1757}
@subsubsection Windows



@itemize -

@item 
gh-145307@footnote{https://github.com/python/cpython/issues/145307}: Defers loading of the @code{psapi.dll} module until it is used by
@ref{1f0,,ctypes.util.dllist()}.

@item 
gh-144551@footnote{https://github.com/python/cpython/issues/144551}: Updated bundled version of OpenSSL to 3.0.19.

@item 
gh-140131@footnote{https://github.com/python/cpython/issues/140131}: Fix REPL cursor position on Windows when module completion
suggestion line hits console width.
@end itemize

@node Tests,Security,Windows,Python next
@anchor{whatsnew/changelog tests}@anchor{1758}
@subsubsection Tests



@itemize -

@item 
gh-146202@footnote{https://github.com/python/cpython/issues/146202}: Fix a race condition in regrtest: make sure that the temporary
directory is created in the worker process. Previously, temp_cwd() could
fail on Windows if the “build” directory was not created.  Patch by Victor
Stinner.

@item 
gh-144739@footnote{https://github.com/python/cpython/issues/144739}: When Python was compiled with system expat older then 2.7.2 but
tests run with newer expat, still skip
@code{test.test_pyexpat.MemoryProtectionTest}.
@end itemize

@node Security,Library,Tests,Python next
@anchor{whatsnew/changelog security}@anchor{1759}
@subsubsection Security



@itemize -

@item 
gh-145986@footnote{https://github.com/python/cpython/issues/145986}: @ref{12c,,xml.parsers.expat}: Fixed a crash caused by unbounded C
recursion when converting deeply nested XML content models with
@ref{175a,,ElementDeclHandler()}. This addresses
@geindex Common Vulnerabilities and Exposures; CVE 2026-4224
CVE 2026-4224@footnote{https://www.cve.org/CVERecord?id=CVE-2026-4224}.

@item 
gh-145599@footnote{https://github.com/python/cpython/issues/145599}: Reject control characters in @ref{dfa,,http.cookies.Morsel}
@ref{10c8,,update()} and
@ref{175b,,js_output()}. This addresses
@geindex Common Vulnerabilities and Exposures; CVE 2026-3644
CVE 2026-3644@footnote{https://www.cve.org/CVERecord?id=CVE-2026-3644}.

@item 
gh-145506@footnote{https://github.com/python/cpython/issues/145506}: Fixes 
@geindex Common Vulnerabilities and Exposures; CVE 2026-2297
CVE 2026-2297@footnote{https://www.cve.org/CVERecord?id=CVE-2026-2297} by ensuring that
@code{SourcelessFileLoader} uses @ref{175c,,io.open_code()} when opening @code{.pyc}
files.

@item 
gh-144370@footnote{https://github.com/python/cpython/issues/144370}: Disallow usage of control characters in status in
@ref{11f,,wsgiref.handlers} to prevent HTTP header injections. Patch by
Benedikt Johannes.

@item 
gh-143930@footnote{https://github.com/python/cpython/issues/143930}: Reject leading dashes in URLs passed to @ref{175d,,webbrowser.open()}
@end itemize

@node Library,Documentation<2>,Security,Python next
@anchor{whatsnew/changelog library}@anchor{175e}
@subsubsection Library



@itemize -

@item 
gh-146080@footnote{https://github.com/python/cpython/issues/146080}: @ref{d5,,ssl}: fix a crash when an SNI callback tries to use an
SSL object that has already been garbage-collected. Patch by Bénédikt
Tran.

@item 
gh-146556@footnote{https://github.com/python/cpython/issues/146556}: Fix @ref{459,,annotationlib.get_annotations()} hanging indefinitely
when called with @code{eval_str=True} on a callable that has a circular
@code{__wrapped__} chain (e.g. @code{f.__wrapped__ = f}). Cycle detection using
an id-based visited set now stops the traversal and falls back to the
globals found so far, mirroring the approach of @ref{115b,,inspect.unwrap()}.

@item 
gh-146090@footnote{https://github.com/python/cpython/issues/146090}: @ref{d4,,sqlite3}: fix a crash when
@ref{885,,sqlite3.Connection.create_collation()} fails with SQLITE_BUSY@footnote{https://sqlite.org/rescode.html#busy}. Patch by Bénédikt Tran.

@item 
gh-146090@footnote{https://github.com/python/cpython/issues/146090}: @ref{d4,,sqlite3}: properly raise @ref{175f,,MemoryError} instead of
@ref{794,,SystemError} when a context callback fails to be allocated. Patch by
Bénédikt Tran.

@item 
gh-145633@footnote{https://github.com/python/cpython/issues/145633}: Fix @code{struct.pack('f', float)}: use @ref{969,,PyFloat_Pack4()} to
raise @ref{a81,,OverflowError}. Patch by Sergey B Kirpichev and Victor
Stinner.

@item 
gh-146310@footnote{https://github.com/python/cpython/issues/146310}: The @ref{59,,ensurepip} module no longer looks for @code{pip-*.whl}
wheel packages in the current directory.

@item 
gh-146083@footnote{https://github.com/python/cpython/issues/146083}: Update bundled libexpat@footnote{https://libexpat.github.io/} to
version 2.7.5.

@item 
gh-146076@footnote{https://github.com/python/cpython/issues/146076}: @ref{13a,,zoneinfo}: fix crashes when deleting @code{_weak_cache} from
a @ref{adc,,zoneinfo.ZoneInfo} subclass.

@item 
gh-146054@footnote{https://github.com/python/cpython/issues/146054}: Limit the size of @ref{1760,,encodings.search_function()} cache.
Found by OSS Fuzz in #493449985@footnote{https://issues.oss-fuzz.com/issues/493449985}.

@item 
gh-146004@footnote{https://github.com/python/cpython/issues/146004}: All @ref{16f,,-X} options from the Python command line are now
propagated to child processes spawned by @ref{98,,multiprocessing}, not just
a hard-coded subset.  This makes the behavior consistent between default
“spawn” and “forkserver” start methods and the old “fork” start method.
The options that were previously not propagated are:
@code{context_aware_warnings}, @code{cpu_count}, @code{disable-remote-debug},
@code{int_max_str_digits}, @code{lazy_imports}, @code{no_debug_ranges},
@code{pathconfig_warnings}, @code{perf}, @code{perf_jit}, @code{presite},
@code{pycache_prefix}, @code{thread_inherit_context}, and
@code{warn_default_encoding}.

@item 
gh-145754@footnote{https://github.com/python/cpython/issues/145754}: Request signature during mock autospec with @code{FORWARDREF}
annotation format. This prevents runtime errors when an annotation uses a
name that is not defined at runtime.

@item 
gh-145750@footnote{https://github.com/python/cpython/issues/145750}: Avoid undefined behaviour from signed integer overflow when
parsing format strings in the @ref{db,,struct} module. Found by OSS Fuzz in
#488466741@footnote{https://issues.oss-fuzz.com/issues/488466741}.

@item 
gh-145492@footnote{https://github.com/python/cpython/issues/145492}: Fix infinite recursion in @ref{13c1,,collections.defaultdict}
@code{__repr__} when a @code{defaultdict} contains itself. Based on analysis by
KowalskiThomas in gh-145492@footnote{https://github.com/python/cpython/issues/145492}.

@item 
gh-145623@footnote{https://github.com/python/cpython/issues/145623}: Fix crash in @ref{db,,struct} when calling @ref{1c1,,repr()} or
@code{__sizeof__()} on an uninitialized @ref{1761,,struct.Struct} object created
via @code{Struct.__new__()} without calling @code{__init__()}.

@item 
gh-145616@footnote{https://github.com/python/cpython/issues/145616}: Detect Android sysconfig ABI correctly on 32-bit ARM Android on
64-bit ARM kernel

@item 
gh-145551@footnote{https://github.com/python/cpython/issues/145551}: Fix InvalidStateError when cancelling process created by
@ref{c6a,,asyncio.create_subprocess_exec()} or
@ref{c6b,,asyncio.create_subprocess_shell()}. Patch by Daan De Meyer.

@item 
gh-145446@footnote{https://github.com/python/cpython/issues/145446}: Now @ref{63,,functools} is safer in free-threaded build when using
keywords in @ref{217,,functools.partial()}

@item 
gh-145417@footnote{https://github.com/python/cpython/issues/145417}: @ref{117,,venv}: Prevent incorrect preservation of SELinux context
when copying the @code{Activate.ps1} script. The script inherited the SELinux
security context of the system template directory, rather than the
destination project directory.

@item 
gh-145376@footnote{https://github.com/python/cpython/issues/145376}: Fix double free and null pointer dereference in unusual error
scenarios in @ref{6c,,hashlib} and @ref{6e,,hmac} modules.

@item 
gh-145301@footnote{https://github.com/python/cpython/issues/145301}: @ref{6e,,hmac}: fix a crash when the initialization of the
underlying C extension module fails.

@item 
gh-145301@footnote{https://github.com/python/cpython/issues/145301}: @ref{6c,,hashlib}: fix a crash when the initialization of the
underlying C extension module fails.

@item 
gh-145264@footnote{https://github.com/python/cpython/issues/145264}: Base64 decoder (see @ref{1762,,binascii.a2b_base64()},
@ref{1763,,base64.b64decode()}, etc) no longer ignores excess data after the
first padded quad in non-strict (default) mode.  Instead, in conformance
with 
@geindex RFC; RFC 4648
RFC 4648@footnote{https://datatracker.ietf.org/doc/html/rfc4648.html}, section 3.3, it now ignores the pad character, “=”, if
it is present before the end of the encoded data.

@item 
gh-145158@footnote{https://github.com/python/cpython/issues/145158}: Avoid undefined behaviour from signed integer overflow when
parsing format strings in the @ref{db,,struct} module.

@item 
gh-144984@footnote{https://github.com/python/cpython/issues/144984}: Fix crash in
@ref{1764,,xml.parsers.expat.xmlparser.ExternalEntityParserCreate()} when an
allocation fails. The error paths could dereference NULL @code{handlers} and
double-decrement the parent parser’s reference count.

@item 
gh-88091@footnote{https://github.com/python/cpython/issues/88091}: Fix @ref{1765,,unicodedata.decomposition()} for Hangul characters.

@item 
gh-144986@footnote{https://github.com/python/cpython/issues/144986}: Fix a memory leak in @ref{a7e,,atexit.register()}. Patch by Shamil
Abdulaev.

@item 
gh-144777@footnote{https://github.com/python/cpython/issues/144777}: Fix data races in @ref{1766,,io.IncrementalNewlineDecoder} in the
@ref{1767,,free-threaded build}.

@item 
gh-144809@footnote{https://github.com/python/cpython/issues/144809}: Make @ref{7f3,,collections.deque} copy atomic in the
@ref{1767,,free-threaded build}.

@item 
gh-144835@footnote{https://github.com/python/cpython/issues/144835}: Added missing explanations for some parameters in
@ref{59f,,glob.glob()} and @ref{a08,,glob.iglob()}.

@item 
gh-144833@footnote{https://github.com/python/cpython/issues/144833}: Fixed a use-after-free in @ref{d5,,ssl} when @code{SSL_new()} returns
NULL in @code{newPySSLSocket()}. The error was reported via a dangling
pointer after the object had already been freed.

@item 
gh-144782@footnote{https://github.com/python/cpython/issues/144782}: Fix @ref{1bd,,argparse.ArgumentParser} to be @ref{ab,,pickleable}.

@item 
gh-144259@footnote{https://github.com/python/cpython/issues/144259}: Fix inconsistent display of long multiline pasted content in
the REPL.

@item 
gh-144156@footnote{https://github.com/python/cpython/issues/144156}: Fix the folding of headers by the @ref{3f,,email} library when
@geindex RFC; RFC 2047
RFC 2047@footnote{https://datatracker.ietf.org/doc/html/rfc2047.html} encoded words are used.  Now whitespace is correctly preserved
and also correctly added between adjacent encoded words.  The latter
property was broken by the fix for gh-92081@footnote{https://github.com/python/cpython/issues/92081}, which mostly fixed previous
failures to preserve whitespace.

@item 
gh-66305@footnote{https://github.com/python/cpython/issues/66305}: Fixed a hang on Windows in the @ref{e6,,tempfile} module when
trying to create a temporary file or subdirectory in a non-writable
directory.

@item 
gh-140814@footnote{https://github.com/python/cpython/issues/140814}: @ref{1768,,multiprocessing.freeze_support()} no longer sets the
default start method as a side effect, which previously caused a
subsequent @ref{24b,,multiprocessing.set_start_method()} call to raise
@ref{244,,RuntimeError}.

@item 
gh-144475@footnote{https://github.com/python/cpython/issues/144475}: Calling @ref{1c1,,repr()} on @ref{217,,functools.partial()} is now safer
when the partial object’s internal attributes are replaced while the
string representation is being generated.

@item 
gh-144538@footnote{https://github.com/python/cpython/issues/144538}: Bump the version of pip bundled in ensurepip to version 26.0.1

@item 
gh-144494@footnote{https://github.com/python/cpython/issues/144494}: Fix performance regression in @ref{b4f,,asyncio.all_tasks()} on
@ref{1767,,free-threaded builds}. Patch by Kumar Aditya.

@item 
gh-144316@footnote{https://github.com/python/cpython/issues/144316}: Fix crash in @code{_remote_debugging} that caused
@code{test_external_inspection} to intermittently fail. Patch by Taegyun Kim.

@item 
gh-144363@footnote{https://github.com/python/cpython/issues/144363}: Update bundled libexpat@footnote{https://libexpat.github.io/} to
2.7.4

@item 
gh-143637@footnote{https://github.com/python/cpython/issues/143637}: Fixed a crash in socket.sendmsg() that could occur if ancillary
data is mutated re-entrantly during argument parsing.

@item 
gh-143543@footnote{https://github.com/python/cpython/issues/143543}: Fix a crash in itertools.groupby that could occur when a
user-defined @ref{cf1,,__eq__()} method re-enters the iterator during
key comparison.

@item 
gh-140652@footnote{https://github.com/python/cpython/issues/140652}: Fix a crash in @code{_interpchannels.list_all()} after closing
a channel.

@item 
gh-143698@footnote{https://github.com/python/cpython/issues/143698}: Allow `scheduler' and `setpgroup' arguments to be explicitly
@ref{884,,None} when calling @ref{52e,,os.posix_spawn()} or
@ref{1769,,os.posix_spawnp()}. Patch by Bénédikt Tran.

@item 
gh-143698@footnote{https://github.com/python/cpython/issues/143698}: Raise @ref{198,,TypeError} instead of @ref{794,,SystemError} when the
`scheduler' in @ref{52e,,os.posix_spawn()} or @ref{1769,,os.posix_spawnp()} is not a
tuple. Patch by Bénédikt Tran.

@item 
gh-142516@footnote{https://github.com/python/cpython/issues/142516}: @ref{d5,,ssl}: fix reference leaks in @ref{357,,ssl.SSLContext}
objects. Patch by Bénédikt Tran.

@item 
gh-143304@footnote{https://github.com/python/cpython/issues/143304}: Fix @ref{bdb,,ctypes.CDLL} to honor the @code{handle} parameter on
POSIX systems.

@item 
gh-142781@footnote{https://github.com/python/cpython/issues/142781}: @ref{13a,,zoneinfo}: fix a crash when instantiating
@ref{adc,,ZoneInfo} objects for which the internal class-level
cache is inconsistent.

@item 
gh-142763@footnote{https://github.com/python/cpython/issues/142763}: Fix a race condition between @ref{adc,,zoneinfo.ZoneInfo}
creation and @ref{176a,,zoneinfo.ZoneInfo.clear_cache()} that could raise
@ref{5e5,,KeyError}.

@item 
gh-142787@footnote{https://github.com/python/cpython/issues/142787}: Fix assertion failure in @ref{d4,,sqlite3} blob subscript when
slicing with indices that result in an empty slice.

@item 
gh-142352@footnote{https://github.com/python/cpython/issues/142352}: Fix @ref{818,,asyncio.StreamWriter.start_tls()} to transfer buffered
data from @ref{176b,,StreamReader} to the SSL layer, preventing data
loss when upgrading a connection to TLS mid-stream (e.g., when
implementing PROXY protocol support).

@item 
gh-141707@footnote{https://github.com/python/cpython/issues/141707}: Don’t change @ref{1416,,tarfile.TarInfo} type from @code{AREGTYPE} to
@code{DIRTYPE} when parsing GNU long name or link headers.

@item 
gh-139933@footnote{https://github.com/python/cpython/issues/139933}: Improve @ref{5ee,,AttributeError} suggestions for classes with a
custom @ref{176c,,__dir__()} method returning a list of unsortable
values. Patch by Bénédikt Tran.

@item 
gh-137335@footnote{https://github.com/python/cpython/issues/137335}: Get rid of any possibility of a name conflict for named pipes
in @ref{98,,multiprocessing} and @ref{b,,asyncio} on Windows, no matter how
small.

@item 
gh-80667@footnote{https://github.com/python/cpython/issues/80667}: Support lookup for Tangut Ideographs in @ref{10b,,unicodedata}.

@item 
bpo-40243@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40243}: Fix @code{unicodedata.ucd_3_2_0.numeric()} for non-decimal
values.
@end itemize

@node Documentation<2>,Core and Builtins,Library,Python next
@anchor{whatsnew/changelog documentation}@anchor{176d}
@subsubsection Documentation



@itemize -

@item 
gh-145649@footnote{https://github.com/python/cpython/issues/145649}: Fix text wrapping and formatting of @code{-X} option descriptions
in the @code{python(1)@footnote{https://manpages.debian.org/python(1)}} man page by using proper roff markup.

@item 
gh-145450@footnote{https://github.com/python/cpython/issues/145450}: Document missing public @ref{337,,wave.Wave_write} getter
methods.

@item 
gh-136246@footnote{https://github.com/python/cpython/issues/136246}: A new “Improve this page” link is available in the left-hand
sidebar of the docs, offering links to create GitHub issues, discussion
forum posts, or pull requests.
@end itemize

@node Core and Builtins,C API,Documentation<2>,Python next
@anchor{whatsnew/changelog core-and-builtins}@anchor{176e}
@subsubsection Core and Builtins



@itemize -

@item 
gh-146615@footnote{https://github.com/python/cpython/issues/146615}: Fix a crash in @ref{16ed,,__get__()} for
@ref{b68,,METH_METHOD} descriptors when an invalid (non-type) object is
passed as the second argument. Patch by Steven Sun.

@item 
gh-146308@footnote{https://github.com/python/cpython/issues/146308}: Fixed several error handling issues in the
@code{_remote_debugging} module, including safer validation of remote
@code{int} objects, clearer asyncio task chain failures, and cache cleanup
fixes that avoid leaking or double-freeing metadata on allocation failure.
Patch by Pablo Galindo.

@item 
gh-146250@footnote{https://github.com/python/cpython/issues/146250}: Fixed a memory leak in @ref{18e,,SyntaxError} when re-initializing
it.

@item 
gh-146245@footnote{https://github.com/python/cpython/issues/146245}: Fixed reference leaks in @ref{d1,,socket} when audit hooks raise
exceptions in @ref{176f,,socket.getaddrinfo()} and @code{socket.sendto()}.

@item 
gh-146196@footnote{https://github.com/python/cpython/issues/146196}: Fix potential Undefined Behavior in
@ref{3b9,,PyUnicodeWriter_WriteASCII()} by adding a zero-length check. Patch
by Shamil Abdulaev.

@item 
gh-146227@footnote{https://github.com/python/cpython/issues/146227}: Fix wrong type in @code{_Py_atomic_load_uint16} in the C11 atomics
backend (@code{pyatomic_std.h}), which used a 32-bit atomic load instead of
16-bit. Found by Mohammed Zuhaib.

@item 
gh-146056@footnote{https://github.com/python/cpython/issues/146056}: Fix @ref{1c1,,repr()} for lists and tuples containing @code{NULL}s.

@item 
gh-146092@footnote{https://github.com/python/cpython/issues/146092}: Handle properly memory allocation failures on str and float
opcodes. Patch by Victor Stinner.

@item 
gh-146041@footnote{https://github.com/python/cpython/issues/146041}: Fix free-threading scaling bottleneck in @ref{14e0,,sys.intern()} and
@ref{1770,,PyObject_SetAttr()} by avoiding the interpreter-wide lock when the
string is already interned and immortalized.

@item 
gh-145990@footnote{https://github.com/python/cpython/issues/145990}: @code{python --help-env} sections are now sorted by environment
variable name.

@item 
gh-145990@footnote{https://github.com/python/cpython/issues/145990}: @code{python --help-xoptions} is now sorted by @code{-X} option name.

@item 
gh-145376@footnote{https://github.com/python/cpython/issues/145376}: Fix GC tracking in @code{structseq.__replace__()}.

@item 
gh-145792@footnote{https://github.com/python/cpython/issues/145792}: Fix out-of-bounds access when invoking faulthandler on a
CPython build compiled without support for VLAs.

@item 
gh-142183@footnote{https://github.com/python/cpython/issues/142183}: Avoid a pathological case where repeated calls at a specific
stack depth could be significantly slower.

@item 
gh-145779@footnote{https://github.com/python/cpython/issues/145779}: Improve scaling of @ref{48f,,classmethod()} and @ref{453,,staticmethod()}
calls in the free-threaded build by avoiding the descriptor @code{__get__}
call.

@item 
gh-145783@footnote{https://github.com/python/cpython/issues/145783}: Fix an unlikely crash in the parser when certain errors were
erroneously not propagated. Found by OSS Fuzz in #491369109@footnote{https://issues.oss-fuzz.com/issues/491369109}.

@item 
gh-145685@footnote{https://github.com/python/cpython/issues/145685}: Improve scaling of type attribute lookups in the
@ref{1767,,free-threaded build} by avoiding contention on the internal type
lock.

@item 
gh-145701@footnote{https://github.com/python/cpython/issues/145701}: Fix @ref{794,,SystemError} when @code{__classdict__} or
@code{__conditional_annotations__} is in a class-scope inlined comprehension.
Found by OSS Fuzz in #491105000@footnote{https://issues.oss-fuzz.com/issues/491105000}.

@item 
gh-145713@footnote{https://github.com/python/cpython/issues/145713}: Make @ref{1771,,bytearray.resize()} thread-safe in the free-threaded
build by using a critical section and calling the lock-held variant of the
resize function.

@item 
gh-145615@footnote{https://github.com/python/cpython/issues/145615}: Fixed a memory leak in the @ref{1767,,free-threaded build} where
mimalloc pages could become permanently unreclaimable until the owning
thread exited.

@item 
gh-145566@footnote{https://github.com/python/cpython/issues/145566}: In the free threading build, skip the stop-the-world pause when
reassigning @code{__class__} on a newly created object.

@item 
gh-145335@footnote{https://github.com/python/cpython/issues/145335}: Fix a crash in @ref{1300,,os.pathconf()} when called with @code{-1} as
the path argument.

@item 
gh-145036@footnote{https://github.com/python/cpython/issues/145036}: In free-threaded build, fix race condition when calling
@code{__sizeof__()} on a @ref{24d,,list}

@item 
gh-145376@footnote{https://github.com/python/cpython/issues/145376}: Fix reference leaks in various unusual error scenarios.

@item 
gh-145234@footnote{https://github.com/python/cpython/issues/145234}: Fixed a @code{SystemError} in the parser when an encoding cookie
(for example, UTF-7) decodes to carriage returns (@code{\r}). Newlines are
now normalized after decoding in the string tokenizer.

Patch by Pablo Galindo.

@item 
gh-130555@footnote{https://github.com/python/cpython/issues/130555}: Fix use-after-free in @ref{1772,,dict.clear()} when the dictionary
values are embedded in an object and a destructor causes re-entrant
mutation of the dictionary.

@item 
gh-145187@footnote{https://github.com/python/cpython/issues/145187}: Fix compiler assertion fail when a type parameter bound
contains an invalid expression in a conditional block.

@item 
gh-145142@footnote{https://github.com/python/cpython/issues/145142}: Fix a crash in the free-threaded build when the dictionary
argument to @ref{fd8,,str.maketrans()} is concurrently modified.

@item 
gh-144872@footnote{https://github.com/python/cpython/issues/144872}: Fix heap buffer overflow in the parser found by OSS-Fuzz.

@item 
gh-144766@footnote{https://github.com/python/cpython/issues/144766}: Fix a crash in fork child process when perf support is enabled.

@item 
gh-144759@footnote{https://github.com/python/cpython/issues/144759}: Fix undefined behavior in the lexer when @code{start} and
@code{multi_line_start} pointers are @code{NULL} in
@code{_PyLexer_remember_fstring_buffers()} and
@code{_PyLexer_restore_fstring_buffers()}. The @code{NULL} pointer arithmetic
(@code{NULL - valid_pointer}) is now guarded with explicit @code{NULL} checks.

@item 
gh-144563@footnote{https://github.com/python/cpython/issues/144563}: Fix interaction of the Tachyon profiler and @ref{2e,,ctypes} and
other modules that load the Python shared library (if present) in an
independent map as this was causing the mechanism that loads the binary
information to be confused. Patch by Pablo Galindo

@item 
gh-144601@footnote{https://github.com/python/cpython/issues/144601}: Fix crash when importing a module whose @code{PyInit} function
raises an exception from a subinterpreter.

@item 
gh-144438@footnote{https://github.com/python/cpython/issues/144438}: Align the QSBR thread state array to a 64-byte cache line
boundary to avoid false sharing in the @ref{1767,,free-threaded build}.

@item 
gh-144513@footnote{https://github.com/python/cpython/issues/144513}: Fix potential deadlock when using critical sections during
stop-the-world pauses in the free-threaded build.

@item 
gh-144446@footnote{https://github.com/python/cpython/issues/144446}: Fix data races in the free-threaded build when reading frame
object attributes while another thread is executing the frame.

@item 
gh-143636@footnote{https://github.com/python/cpython/issues/143636}: Fix a crash when calling @ref{4e5,,SimpleNamespace.__replace__()} on non-namespace instances. Patch by Bénédikt
Tran.

@item 
gh-143650@footnote{https://github.com/python/cpython/issues/143650}: Fix race condition in @ref{7b,,importlib} where a thread could
receive a stale module reference when another thread’s import fails.

@item 
gh-141732@footnote{https://github.com/python/cpython/issues/141732}: Ensure the @ref{82e,,__repr__()} for @ref{4d3,,ExceptionGroup}
and @ref{564,,BaseExceptionGroup} does not change when the exception sequence
that was original passed in to its constructor is subsequently mutated.

@item 
gh-140594@footnote{https://github.com/python/cpython/issues/140594}: Fix an out of bounds read when a single NUL character is read
from the standard input. Patch by Shamil Abdulaev.

@item 
gh-91636@footnote{https://github.com/python/cpython/issues/91636}: While performing garbage collection, clear weakrefs to
unreachable objects that are created during running of finalizers.  If
those weakrefs were are not cleared, they could reveal unreachable
objects.

@item 
gh-130327@footnote{https://github.com/python/cpython/issues/130327}: Fix erroneous clearing of an object’s @ref{77c,,__dict__}
if overwritten at runtime.

@item 
gh-80667@footnote{https://github.com/python/cpython/issues/80667}: Literals using the @code{\N@{name@}} escape syntax can now construct
CJK ideographs and Hangul syllables using case-insensitive names.
@end itemize

@node C API,Build,Core and Builtins,Python next
@anchor{whatsnew/changelog c-api}@anchor{1773}
@subsubsection C API



@itemize -

@item 
gh-146056@footnote{https://github.com/python/cpython/issues/146056}: @ref{3bb,,PyUnicodeWriter_WriteRepr()} now supports @code{NULL}
argument.

@item 
gh-145010@footnote{https://github.com/python/cpython/issues/145010}: Use GCC dialect alternatives for inline assembly in
@code{object.h} so that the Python headers compile correctly with
@code{-masm=intel}.

@item 
gh-144981@footnote{https://github.com/python/cpython/issues/144981}: Made @ref{1774,,PyUnstable_Code_SetExtra()},
@ref{1775,,PyUnstable_Code_GetExtra()}, and
@ref{1776,,PyUnstable_Eval_RequestCodeExtraIndex()} thread-safe on the
@ref{1f4,,free threaded} build.
@end itemize

@node Build,,C API,Python next
@anchor{whatsnew/changelog build}@anchor{1777}
@subsubsection Build



@itemize -

@item 
gh-146498@footnote{https://github.com/python/cpython/issues/146498}: The iOS XCframework build script now ensures libpython isn’t
included in installed app content, and is more robust in identifying
standard library binary content that requires processing.

@item 
gh-146446@footnote{https://github.com/python/cpython/issues/146446}: The clean target for the Apple/iOS XCframework build script is
now more selective when targeting a single architecture.

@item 
gh-145801@footnote{https://github.com/python/cpython/issues/145801}: When Python build is optimized with GCC using PGO, use
@code{-fprofile-update=atomic} option to use atomic operations when updating
profile information. This option reduces the risk of gcov Data Files
(.gcda) corruption which can cause random GCC crashes. Patch by Victor
Stinner.
@end itemize

@node Python 3 14 3 final,Python 3 14 2 final,Python next,Changelog
@anchor{whatsnew/changelog python-3-14-3-final}@anchor{1778}
@subsection Python 3.14.3 final


`Release date: 2026-02-03'

@menu
* Windows: Windows<2>. 
* Tools/Demos:: 
* Tests: Tests<2>. 
* Security: Security<2>. 
* Library: Library<2>. 
* IDLE: IDLE<3>. 
* Documentation: Documentation<3>. 
* Core and Builtins: Core and Builtins<2>. 
* C API: C API<2>. 
* Build: Build<2>. 

@end menu

@node Windows<2>,Tools/Demos,,Python 3 14 3 final
@anchor{whatsnew/changelog id3}@anchor{1779}
@subsubsection Windows



@itemize -

@item 
gh-128067@footnote{https://github.com/python/cpython/issues/128067}: Fix a bug in PyREPL on Windows where output without a trailing
newline was overwritten by the next prompt.
@end itemize

@node Tools/Demos,Tests<2>,Windows<2>,Python 3 14 3 final
@anchor{whatsnew/changelog tools-demos}@anchor{177a}
@subsubsection Tools/Demos



@itemize -

@item 
gh-142095@footnote{https://github.com/python/cpython/issues/142095}: Make gdb ‘py-bt’ command use frame from thread local state when
available. Patch by Sam Gross and Victor Stinner.
@end itemize

@node Tests<2>,Security<2>,Tools/Demos,Python 3 14 3 final
@anchor{whatsnew/changelog id4}@anchor{177b}
@subsubsection Tests



@itemize -

@item 
gh-144415@footnote{https://github.com/python/cpython/issues/144415}: The Android testbed now distinguishes between stdout/stderr
messages which were triggered by a newline, and those triggered by a
manual call to @code{flush}. This fixes logging of progress indicators and
similar content.

@item 
gh-143460@footnote{https://github.com/python/cpython/issues/143460}: Skip tests relying on infinite recusion if stack size is
unlimited.

@item 
gh-65784@footnote{https://github.com/python/cpython/issues/65784}: Add support for parametrized resource @code{wantobjects} in
regrtests, which allows to run Tkinter tests with the specified value of
@code{tkinter.wantobjects}, for example @code{-u wantobjects=0}.

@item 
gh-143553@footnote{https://github.com/python/cpython/issues/143553}: Add support for parametrized resources, such as @code{-u
xpickle=2.7}.

@item 
gh-142836@footnote{https://github.com/python/cpython/issues/142836}: Accommodated Solaris in
@code{test_pdb.test_script_target_anonymous_pipe}.

@item 
bpo-31391@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31391}: Forward-port test_xpickle from Python 2 to Python 3 and add the
resource back to test’s command line.
@end itemize

@node Security<2>,Library<2>,Tests<2>,Python 3 14 3 final
@anchor{whatsnew/changelog id5}@anchor{177c}
@subsubsection Security



@itemize -

@item 
gh-144125@footnote{https://github.com/python/cpython/issues/144125}: @ref{13d4,,BytesGenerator} will now refuse to
serialize (write) headers that are unsafely folded or delimited; see
@ref{4f2,,verify_generated_headers}. (Contributed by Bas
Bloemsaat and Petr Viktorin in gh-121650@footnote{https://github.com/python/cpython/issues/121650}).

@item 
gh-143935@footnote{https://github.com/python/cpython/issues/143935}: Fixed a bug in the folding of comments when flattening an email
message using a modern email policy. Comments consisting of a very long
sequence of non-foldable characters could trigger a forced line wrap that
omitted the required leading space on the continuation line, causing the
remainder of the comment to be interpreted as a new header field. This
enabled header injection with carefully crafted inputs.

@item 
gh-143925@footnote{https://github.com/python/cpython/issues/143925}: Reject control characters in @code{data:} URL media types.

@item 
gh-143919@footnote{https://github.com/python/cpython/issues/143919}: Reject control characters in @ref{dfa,,http.cookies.Morsel}
fields and values.

@item 
gh-143916@footnote{https://github.com/python/cpython/issues/143916}: Reject C0 control characters within wsgiref.headers.Headers
fields, values, and parameters.
@end itemize

@node Library<2>,IDLE<3>,Security<2>,Python 3 14 3 final
@anchor{whatsnew/changelog id6}@anchor{177d}
@subsubsection Library



@itemize -

@item 
gh-144380@footnote{https://github.com/python/cpython/issues/144380}: Improve performance of @ref{1413,,io.BufferedReader} line
iteration by ~49%.

@item 
gh-144169@footnote{https://github.com/python/cpython/issues/144169}: Fix three crashes when non-string keyword arguments are
supplied to objects in the @ref{9,,ast} module.

@item 
gh-144100@footnote{https://github.com/python/cpython/issues/144100}: Fixed a crash in ctypes when using a deprecated
@code{POINTER(str)} type in @code{argtypes}. Instead of aborting, ctypes now
raises a proper Python exception when the pointer target type is
unresolved.

@item 
gh-144050@footnote{https://github.com/python/cpython/issues/144050}: Fix @ref{1350,,stat.filemode()} in the pure-Python implementation to
avoid misclassifying invalid mode values as block devices.

@item 
gh-144023@footnote{https://github.com/python/cpython/issues/144023}: Fixed validation of file descriptor 0 in posix functions when
used with follow_symlinks parameter.

@item 
gh-143999@footnote{https://github.com/python/cpython/issues/143999}: Fix an issue where @ref{143b,,inspect.getgeneratorstate()} and
@ref{1019,,inspect.getcoroutinestate()} could fail for generators wrapped by
@ref{1087,,types.coroutine()} in the suspended state.

@item 
gh-143831@footnote{https://github.com/python/cpython/issues/143831}: @ref{177e,,annotationlib.ForwardRef} objects are now hashable when
created from annotation scopes with closures. Previously, hashing such
objects would throw an exception. Patch by Bartosz Sławecki.

@item 
gh-143874@footnote{https://github.com/python/cpython/issues/143874}: Fixed a bug in @ref{aa,,pdb} where expression results were not
sent back to remote client.

@item 
gh-143880@footnote{https://github.com/python/cpython/issues/143880}: Fix data race in @ref{217,,functools.partial()} in the @ref{1f4,,free threading} build.

@item 
gh-143706@footnote{https://github.com/python/cpython/issues/143706}: Fix @ref{98,,multiprocessing} forkserver so that @ref{1469,,sys.argv}
is correctly set before @code{__main__} is preloaded. Previously,
@code{sys.argv} was empty during main module import in forkserver child
processes. This fixes a regression introduced in 3.13.8 and 3.14.1. Root
caused by Aaron Wieczorek, test provided by Thomas Watson, thanks!

@item 
gh-143638@footnote{https://github.com/python/cpython/issues/143638}: Forbid reentrant calls of the @ref{c12,,pickle.Pickler} and
@ref{177f,,pickle.Unpickler} methods for the C implementation. Previously,
this could cause crash or data corruption, now concurrent calls of methods
of the same object raise @ref{244,,RuntimeError}.

@item 
gh-78724@footnote{https://github.com/python/cpython/issues/78724}: Raise @ref{244,,RuntimeError}’s when user attempts to call methods
on half-initialized @ref{1761,,Struct} objects, For example, created
by @code{Struct.__new__(Struct)}.  Patch by Sergey B Kirpichev.

@item 
gh-143196@footnote{https://github.com/python/cpython/issues/143196}: Fix crash when the internal encoder object returned by
undocumented function @code{json.encoder.c_make_encoder()} was called with
non-zero second (`_current_indent_level') argument.

@item 
gh-143191@footnote{https://github.com/python/cpython/issues/143191}: @ref{1780,,_thread.stack_size()} now raises @ref{2ec,,ValueError} if the
stack size is too small. Patch by Victor Stinner.

@item 
gh-143602@footnote{https://github.com/python/cpython/issues/143602}: Fix a inconsistency issue in @ref{15b0,,write()} that
leads to unexpected buffer overwrite by deduplicating the buffer exports.

@item 
gh-143547@footnote{https://github.com/python/cpython/issues/143547}: Fix @ref{506,,sys.unraisablehook()} when the hook raises an
exception and changes @code{sys.unraisablehook()}: hold a strong reference
to the old hook. Patch by Victor Stinner.

@item 
gh-143517@footnote{https://github.com/python/cpython/issues/143517}: @ref{459,,annotationlib.get_annotations()} no longer raises a
@ref{18e,,SyntaxError} when evaluating a stringified starred annotation that
starts with one or more whitespace characters followed by a @code{*}. Patch
by Bartosz Sławecki.

@item 
gh-143378@footnote{https://github.com/python/cpython/issues/143378}: Fix use-after-free crashes when a @ref{10a3,,BytesIO} object
is concurrently mutated during @ref{15b0,,write()} or
@ref{1781,,writelines()}.

@item 
gh-143346@footnote{https://github.com/python/cpython/issues/143346}: Fix incorrect wrapping of the Base64 data in
@code{plistlib._PlistWriter} when the indent contains a mix of tabs and
spaces.

@item 
gh-143310@footnote{https://github.com/python/cpython/issues/143310}: @ref{f6,,tkinter}: fix a crash when a Python @ref{24d,,list} is
mutated during the conversion to a Tcl object (e.g., when setting a Tcl
variable). Patch by Bénédikt Tran.

@item 
gh-143309@footnote{https://github.com/python/cpython/issues/143309}: Fix a crash in @ref{12fe,,os.execve()} on non-Windows platforms when
given a custom environment mapping which is then mutated during parsing.
Patch by Bénédikt Tran.

@item 
gh-143308@footnote{https://github.com/python/cpython/issues/143308}: @ref{ab,,pickle}: fix use-after-free crashes when a
@ref{1782,,PickleBuffer} is concurrently mutated by a custom buffer
callback during pickling. Patch by Bénédikt Tran and Aaron Wieczorek.

@item 
gh-143237@footnote{https://github.com/python/cpython/issues/143237}: Fix support of named pipes in the rotating @ref{8b,,logging}
handlers.

@item 
gh-143249@footnote{https://github.com/python/cpython/issues/143249}: Fix possible buffer leaks in Windows overlapped I/O on error
handling.

@item 
gh-143241@footnote{https://github.com/python/cpython/issues/143241}: @ref{13a,,zoneinfo}: fix infinite loop in @ref{1783,,ZoneInfo.from_file} when parsing a malformed TZif file. Patch
by Fatih Celik.

@item 
gh-142830@footnote{https://github.com/python/cpython/issues/142830}: @ref{d4,,sqlite3}: fix use-after-free crashes when the
connection’s callbacks are mutated during a callback execution. Patch by
Bénédikt Tran.

@item 
gh-143200@footnote{https://github.com/python/cpython/issues/143200}: @ref{12b,,xml.etree.ElementTree}: fix use-after-free crashes in
@ref{588,,__getitem__()} and @ref{14d0,,__setitem__()} methods of
@ref{363,,Element} when the element is concurrently
mutated. Patch by Bénédikt Tran.

@item 
gh-142195@footnote{https://github.com/python/cpython/issues/142195}: Updated timeout evaluation logic in @ref{dc,,subprocess} to be
compatible with deterministic environments like Shadow where time moves
exactly as requested.

@item 
gh-142164@footnote{https://github.com/python/cpython/issues/142164}: Fix the ctypes bitfield overflow error message to report the
correct offset and size calculation.

@item 
gh-143145@footnote{https://github.com/python/cpython/issues/143145}: Fixed a possible reference leak in ctypes when constructing
results with multiple output parameters on error.

@item 
gh-122431@footnote{https://github.com/python/cpython/issues/122431}: Corrected the error message in
@ref{1050,,readline.append_history_file()} to state that @code{nelements} must be
non-negative instead of positive.

@item 
gh-143004@footnote{https://github.com/python/cpython/issues/143004}: Fix a potential use-after-free in
@ref{1784,,collections.Counter.update()} when user code mutates the Counter
during an update.

@item 
gh-143046@footnote{https://github.com/python/cpython/issues/143046}: The @ref{b,,asyncio} REPL no longer prints copyright and version
messages in the quiet mode (@ref{1785,,-q}). Patch by Bartosz Sławecki.

@item 
gh-140648@footnote{https://github.com/python/cpython/issues/140648}: The @ref{b,,asyncio} REPL now respects the @ref{b56,,-I} flag
(isolated mode). Previously, it would load and execute
@geindex PYTHONSTARTUP
@geindex 환경 변수; PYTHONSTARTUP
@ref{1b8,,PYTHONSTARTUP} even if the flag was set. Contributed by Bartosz
Sławecki.

@item 
gh-142991@footnote{https://github.com/python/cpython/issues/142991}: Fixed socket operations such as recvfrom() and sendto() for
FreeBSD divert(4) socket.

@item 
gh-143010@footnote{https://github.com/python/cpython/issues/143010}: Fixed a bug in @ref{8f,,mailbox} where the precise timing of an
external event could result in the library opening an existing file
instead of a file it expected to create.

@item 
gh-142881@footnote{https://github.com/python/cpython/issues/142881}: Fix concurrent and reentrant call of @ref{1786,,atexit.unregister()}.

@item 
gh-112127@footnote{https://github.com/python/cpython/issues/112127}: Fix possible use-after-free in @ref{1786,,atexit.unregister()} when
the callback is unregistered during comparison.

@item 
gh-142783@footnote{https://github.com/python/cpython/issues/142783}: Fix zoneinfo use-after-free with descriptor _weak_cache. a
descriptor as _weak_cache could cause crashes during object creation. The
fix ensures proper reference counting for descriptor-provided objects.

@item 
gh-142754@footnote{https://github.com/python/cpython/issues/142754}: Add the `ownerDocument' attribute to @ref{128,,xml.dom.minidom}
elements and attributes created by directly instantiating the @code{Element}
or @code{Attr} class. Note that this way of creating nodes is not supported;
creator functions like @ref{1787,,xml.dom.Document.documentElement()} should
be used instead.

@item 
gh-142784@footnote{https://github.com/python/cpython/issues/142784}: The @ref{b,,asyncio} REPL now properly closes the loop upon the
end of interactive session. Previously, it could cause surprising
warnings. Contributed by Bartosz Sławecki.

@item 
gh-142555@footnote{https://github.com/python/cpython/issues/142555}: @ref{8,,array}: fix a crash in @code{a[i] = v} when converting `i'
to an index via @ref{19e,,i.__index__} or
@ref{bc0,,i.__float__} mutates the array.

@item 
gh-142594@footnote{https://github.com/python/cpython/issues/142594}: Fix crash in @code{TextIOWrapper.close()} when the underlying
buffer’s @code{closed} property calls @ref{1788,,detach()}.

@item 
gh-142451@footnote{https://github.com/python/cpython/issues/142451}: @ref{6e,,hmac}: Ensure that the @ref{1149,,HMAC.block_size} attribute is correctly copied by @ref{1789,,HMAC.copy}. Patch by Bénédikt Tran.

@item 
gh-142495@footnote{https://github.com/python/cpython/issues/142495}: @ref{13c1,,collections.defaultdict} now prioritizes
@ref{14d0,,__setitem__()} when inserting default values from
@code{default_factory}. This prevents race conditions where a default value
would overwrite a value set before @code{default_factory} returns.

@item 
gh-142651@footnote{https://github.com/python/cpython/issues/142651}: @ref{10d,,unittest.mock}: fix a thread safety issue where
@ref{178a,,Mock.call_count} may return
inaccurate values when the mock is called concurrently from multiple
threads.

@item 
gh-142595@footnote{https://github.com/python/cpython/issues/142595}: Added type check during initialization of the @ref{3a,,decimal}
module to prevent a crash in case of broken stdlib.  Patch by Sergey B
Kirpichev.

@item 
gh-142556@footnote{https://github.com/python/cpython/issues/142556}: Fix crash when a task gets re-registered during finalization in
@ref{b,,asyncio}. Patch by Kumar Aditya.

@item 
gh-123241@footnote{https://github.com/python/cpython/issues/123241}: Avoid reference count operations in garbage collection of
@ref{2e,,ctypes} objects.

@item 
gh-142517@footnote{https://github.com/python/cpython/issues/142517}: The non-@code{compat32} @ref{3f,,email} policies now correctly handle
refolding encoded words that contain bytes that can not be decoded in
their specified character set.  Previously this resulted in an encoding
exception during folding.

@item 
gh-112527@footnote{https://github.com/python/cpython/issues/112527}: The help text for required options in @ref{7,,argparse} no longer
extended with “ (default: None)”.

@item 
gh-142346@footnote{https://github.com/python/cpython/issues/142346}: Fix usage formatting for mutually exclusive groups in
@ref{7,,argparse} when they are preceded by positional arguments or followed
or intermixed with other optional arguments.

@item 
gh-142315@footnote{https://github.com/python/cpython/issues/142315}: Pdb can now run scripts from anonymous pipes used in process
substitution. Patch by Bartosz Sławecki.

@item 
gh-142332@footnote{https://github.com/python/cpython/issues/142332}: Fix usage formatting for positional arguments in mutually
exclusive groups in @ref{7,,argparse}. in @code{argparse}.

@item 
gh-142282@footnote{https://github.com/python/cpython/issues/142282}: Fix @ref{178b,,winreg.QueryValueEx()} to not accidentally read
garbage buffer under race condition.

@item 
gh-75949@footnote{https://github.com/python/cpython/issues/75949}: Fix @ref{7,,argparse} to preserve @code{|} separators in mutually
exclusive groups when the usage line wraps due to length.

@item 
gh-142267@footnote{https://github.com/python/cpython/issues/142267}: Improve @ref{7,,argparse} performance by caching the formatter
used for argument validation.

@item 
gh-68552@footnote{https://github.com/python/cpython/issues/68552}: @code{MisplacedEnvelopeHeaderDefect} and @code{Missing header name}
defects are now correctly passed to the @code{handle_defect} method of
@code{policy} in @ref{178c,,FeedParser}.

@item 
gh-142006@footnote{https://github.com/python/cpython/issues/142006}: Fix a bug in the @ref{178d,,email.policy.default} folding algorithm
which incorrectly resulted in a doubled newline when a line ending at
exactly max_line_length was followed by an unfoldable token.

@item 
gh-105836@footnote{https://github.com/python/cpython/issues/105836}: Fix @ref{a82,,asyncio.run_coroutine_threadsafe()} leaving underlying
cancelled asyncio task running.

@item 
gh-139971@footnote{https://github.com/python/cpython/issues/139971}: @ref{ba,,pydoc}: Ensure that the link to the online documentation
of a @ref{178e,,stdlib} module is correct.

@item 
gh-139262@footnote{https://github.com/python/cpython/issues/139262}: Some keystrokes can be swallowed in the new @code{PyREPL} on
Windows, especially when used together with the ALT key. Fix by Chris
Eibl.

@item 
gh-138897@footnote{https://github.com/python/cpython/issues/138897}: Improved @ref{178f,,license}/@ref{1790,,copyright}/@ref{1791,,credits}
display in the @ref{492,,REPL}: now uses a pager.

@item 
gh-79986@footnote{https://github.com/python/cpython/issues/79986}: Add parsing for @code{References} and @code{In-Reply-To} headers to
the @ref{3f,,email} library that parses the header content as lists of
message id tokens.  This prevents them from being folded incorrectly.

@item 
gh-136282@footnote{https://github.com/python/cpython/issues/136282}: Add support for @ref{1792,,UNNAMED_SECTION} when
creating a section via the mapping protocol access

@item 
gh-109263@footnote{https://github.com/python/cpython/issues/109263}: Starting a process from spawn context in @ref{98,,multiprocessing}
no longer sets the start method globally.

@item 
gh-133253@footnote{https://github.com/python/cpython/issues/133253}: Fix thread-safety issues in @ref{89,,linecache}.

@item 
gh-132715@footnote{https://github.com/python/cpython/issues/132715}: Skip writing objects during marshalling once a failure has
occurred.
@end itemize

@node IDLE<3>,Documentation<3>,Library<2>,Python 3 14 3 final
@anchor{whatsnew/changelog idle}@anchor{1793}
@subsubsection IDLE



@itemize -

@item 
gh-143774@footnote{https://github.com/python/cpython/issues/143774}: Better explain the operation of Format / Format Paragraph.
@end itemize

@node Documentation<3>,Core and Builtins<2>,IDLE<3>,Python 3 14 3 final
@anchor{whatsnew/changelog id7}@anchor{1794}
@subsubsection Documentation



@itemize -

@item 
gh-140806@footnote{https://github.com/python/cpython/issues/140806}: Add documentation for @ref{1795,,enum.bin()}.
@end itemize

@node Core and Builtins<2>,C API<2>,Documentation<3>,Python 3 14 3 final
@anchor{whatsnew/changelog id8}@anchor{1796}
@subsubsection Core and Builtins



@itemize -

@item 
gh-144307@footnote{https://github.com/python/cpython/issues/144307}: Prevent a reference leak in module teardown at interpreter
finalization.

@item 
gh-144194@footnote{https://github.com/python/cpython/issues/144194}: Fix error handling in perf jitdump initialization on memory
allocation failure.

@item 
gh-144012@footnote{https://github.com/python/cpython/issues/144012}: Check if the result is @code{NULL} in @code{BINARY_OP_EXTENT} opcode.

@item 
gh-141805@footnote{https://github.com/python/cpython/issues/141805}: Fix crash in @ref{184,,set} when objects with the same hash are
concurrently added to the set after removing an element with the same hash
while the set still contains elements with the same hash.

@item 
gh-143670@footnote{https://github.com/python/cpython/issues/143670}: Fixes a crash in @code{ga_repr_items_list} function.

@item 
gh-143377@footnote{https://github.com/python/cpython/issues/143377}: Fix a crash in @code{_interpreters.capture_exception()} when
the exception is incorrectly formatted. Patch by Bénédikt Tran.

@item 
gh-136924@footnote{https://github.com/python/cpython/issues/136924}: The interactive help mode in the @ref{492,,REPL} no longer
incorrectly syntax highlights text input as Python code. Contributed by
Olga Matoula.

@item 
gh-143189@footnote{https://github.com/python/cpython/issues/143189}: Fix crash when inserting a non-@ref{169,,str} key into a split
table dictionary when the key matches an existing key in the split table
but has no corresponding value in the dict.

@item 
gh-143228@footnote{https://github.com/python/cpython/issues/143228}: Fix use-after-free in perf trampoline when toggling profiling
while threads are running or during interpreter finalization with daemon
threads active. The fix uses reference counting to ensure trampolines are
not freed while any code object could still reference them. Pach by Pablo
Galindo

@item 
gh-142664@footnote{https://github.com/python/cpython/issues/142664}: Fix a use-after-free crash in @ref{cf2,,memoryview.__hash__} when the @code{__hash__} method of the referenced object
mutates that object or the view. Patch by Bénédikt Tran.

@item 
gh-142557@footnote{https://github.com/python/cpython/issues/142557}: Fix a use-after-free crash in @ref{f80,,bytearray.__mod__} when the @code{bytearray} is mutated while
formatting the @code{%}-style arguments. Patch by Bénédikt Tran.

@item 
gh-143195@footnote{https://github.com/python/cpython/issues/143195}: Fix use-after-free crashes in @ref{f65,,bytearray.hex()} and
@ref{f66,,memoryview.hex()} when the separator’s @ref{1797,,__len__()}
mutates the original object. Patch by Bénédikt Tran.

@item 
gh-142975@footnote{https://github.com/python/cpython/issues/142975}: Fix crash after unfreezing all objects tracked by the garbage
collector on the @ref{1f4,,free threaded} build.

@item 
gh-143135@footnote{https://github.com/python/cpython/issues/143135}: Set @ref{1798,,sys.flags.inspect} to @code{1} when
@geindex PYTHONINSPECT
@geindex 환경 변수; PYTHONINSPECT
@ref{16df,,PYTHONINSPECT} is @code{0}. Previously, it was set to @code{0} in this
case.

@item 
gh-143003@footnote{https://github.com/python/cpython/issues/143003}: Fix an overflow of the shared empty buffer in
@ref{1799,,bytearray.extend()} when @code{__length_hint__()} returns 0 for
non-empty iterator.

@item 
gh-143006@footnote{https://github.com/python/cpython/issues/143006}: Fix a possible assertion error when comparing negative
non-integer @code{float} and @code{int} with the same number of bits in the
integer part.

@item 
gh-143057@footnote{https://github.com/python/cpython/issues/143057}: Avoid locking in @ref{dae,,PyTraceMalloc_Track()} and
@ref{daf,,PyTraceMalloc_Untrack()} when @ref{105,,tracemalloc} is not enabled.

@item 
gh-142776@footnote{https://github.com/python/cpython/issues/142776}: Fix a file descriptor leak in import.c

@item 
gh-142829@footnote{https://github.com/python/cpython/issues/142829}: Fix a use-after-free crash in @ref{177,,contextvars.Context}
comparison when a custom @code{__eq__} method modifies the context via
@ref{179a,,set()}.

@item 
gh-142766@footnote{https://github.com/python/cpython/issues/142766}: Clear the frame of a generator when @ref{179b,,generator.close()} is
called.

@item 
gh-142737@footnote{https://github.com/python/cpython/issues/142737}: Tracebacks will be displayed in fallback mode even if
@ref{73f,,io.open()} is lost. Previously, this would crash the interpreter.
Patch by Bartosz Sławecki.

@item 
gh-142554@footnote{https://github.com/python/cpython/issues/142554}: Fix a crash in @ref{b98,,divmod()} when @code{_pylong.int_divmod()}
does not return a tuple of length two exactly. Patch by Bénédikt Tran.

@item 
gh-142560@footnote{https://github.com/python/cpython/issues/142560}: Fix use-after-free in @ref{344,,bytearray} search-like methods
(@ref{15a8,,find()}, @ref{179c,,count()},
@ref{179d,,index()}, @ref{179e,,rindex()}, and
@ref{15a9,,rfind()}) by marking the storage as exported which causes
reallocation attempts to raise @ref{179f,,BufferError}. For
@ref{ad7,,contains()}, @ref{17a0,,split()}, and
@ref{17a1,,rsplit()} the @ref{260,,buffer protocol} is
used for this.

@item 
gh-142531@footnote{https://github.com/python/cpython/issues/142531}: Fix a free-threaded GC performance regression.  If there are
many untracked tuples, the GC will run too often, resulting in poor
performance.  The fix is to include untracked tuples in the “long lived”
object count. The number of frozen objects is also now included since the
free-threaded GC must scan those too.

@item 
gh-142402@footnote{https://github.com/python/cpython/issues/142402}: Fix reference counting when adjacent literal parts are merged
while constructing @ref{16a,,string.templatelib.Template}, preventing the
displaced string object from leaking.

@item 
gh-133932@footnote{https://github.com/python/cpython/issues/133932}: Fix crash in the free threading build when clearing frames that
hold tagged integers.

@item 
gh-142343@footnote{https://github.com/python/cpython/issues/142343}: Fix SIGILL crash on m68k due to incorrect assembly constraint.

@item 
gh-100964@footnote{https://github.com/python/cpython/issues/100964}: Fix reference cycle in exhausted generator frames. Patch by
Savannah Ostrowski.

@item 
gh-69605@footnote{https://github.com/python/cpython/issues/69605}: Fix edge-cases around already imported modules in the
@ref{492,,REPL} auto-completion of imports.

@item 
gh-138568@footnote{https://github.com/python/cpython/issues/138568}: Adjusted the built-in @ref{ad4,,help()} function so that empty
inputs are ignored in interactive mode.

@item 
gh-137007@footnote{https://github.com/python/cpython/issues/137007}: Fix a bug during JIT compilation failure which caused garbage
collection debug assertions to fail.
@end itemize

@node C API<2>,Build<2>,Core and Builtins<2>,Python 3 14 3 final
@anchor{whatsnew/changelog id9}@anchor{17a2}
@subsubsection C API



@itemize -

@item 
gh-142589@footnote{https://github.com/python/cpython/issues/142589}: Fix @ref{3c7,,PyUnstable_Object_IsUniqueReferencedTemporary()}
handling of tagged ints on the interpreter stack.

@item 
gh-142571@footnote{https://github.com/python/cpython/issues/142571}: @code{PyUnstable_CopyPerfMapFile()} now checks that opening
the file succeeded before flushing.
@end itemize

@node Build<2>,,C API<2>,Python 3 14 3 final
@anchor{whatsnew/changelog id10}@anchor{17a3}
@subsubsection Build



@itemize -

@item 
gh-142454@footnote{https://github.com/python/cpython/issues/142454}: When calculating the digest of the JIT stencils input, sort the
hashed files by filenames before adding their content to the hasher. This
ensures deterministic hash input and hence deterministic hash, independent
on filesystem order.

@item 
gh-141808@footnote{https://github.com/python/cpython/issues/141808}: When running @code{make clean-retain-profile}, keep the generated
JIT stencils. That way, the stencils are not generated twice when
Profile-guided optimization (PGO) is used. It also allows distributors to
supply their own pre-built JIT stencils.

@item 
gh-138061@footnote{https://github.com/python/cpython/issues/138061}: Ensure reproducible builds by making JIT stencil header
generation deterministic.
@end itemize

@node Python 3 14 2 final,Python 3 14 1 final,Python 3 14 3 final,Changelog
@anchor{whatsnew/changelog python-3-14-2-final}@anchor{17a4}
@subsection Python 3.14.2 final


`Release date: 2025-12-05'

@menu
* Security: Security<3>. 
* Library: Library<3>. 
* Core and Builtins: Core and Builtins<3>. 
* Library: Library<4>. 

@end menu

@node Security<3>,Library<3>,,Python 3 14 2 final
@anchor{whatsnew/changelog id11}@anchor{17a5}
@subsubsection Security



@itemize -

@item 
gh-142145@footnote{https://github.com/python/cpython/issues/142145}: Remove quadratic behavior in @code{xml.minidom} node ID cache
clearing.

@item 
gh-119452@footnote{https://github.com/python/cpython/issues/119452}: Fix a potential memory denial of service in the
@ref{76,,http.server} module. When a malicious user is connected to the CGI
server on Windows, it could cause an arbitrary amount of memory to be
allocated. This could have led to symptoms including a @ref{175f,,MemoryError},
swapping, out of memory (OOM) killed processes or containers, or even
system crashes.
@end itemize

@node Library<3>,Core and Builtins<3>,Security<3>,Python 3 14 2 final
@anchor{whatsnew/changelog id12}@anchor{17a6}
@subsubsection Library



@itemize -

@item 
gh-140797@footnote{https://github.com/python/cpython/issues/140797}: Revert changes to the undocumented @code{re.Scanner} class.
Capturing groups are still allowed for backward compatibility, although
using them can lead to incorrect result. They will be forbidden in future
Python versions.

@item 
gh-142206@footnote{https://github.com/python/cpython/issues/142206}: The resource tracker in the @ref{98,,multiprocessing} module now
uses the original communication protocol, as in Python 3.14.0 and below,
by default. This avoids issues with upgrading Python while it is running.
(Note that such ‘in-place’ upgrades are not tested.) The tracker remains
compatible with subprocesses that use new protocol (that is, subprocesses
using Python 3.13.10, 3.14.1 and 3.15).

@item 
gh-142214@footnote{https://github.com/python/cpython/issues/142214}: Fix two regressions in @ref{33,,dataclasses} in Python 3.14.1
related to annotations.


@itemize *

@item 
An exception is no longer raised if @code{slots=True} is used and the
@code{__init__} method does not have an @code{__annotate__} attribute
(likely because @code{init=False} was used).

@item 
An exception is no longer raised if annotations are requested on the
@code{__init__} method and one of the fields is not present in the class
annotations. This can occur in certain dynamic scenarios.
@end itemize

Patch by Jelle Zijlstra.
@end itemize

@node Core and Builtins<3>,Library<4>,Library<3>,Python 3 14 2 final
@anchor{whatsnew/changelog id13}@anchor{17a7}
@subsubsection Core and Builtins



@itemize -

@item 
gh-142218@footnote{https://github.com/python/cpython/issues/142218}: Fix crash when inserting into a split table dictionary with a
non @ref{169,,str} key that matches an existing key.
@end itemize

@node Library<4>,,Core and Builtins<3>,Python 3 14 2 final
@anchor{whatsnew/changelog id14}@anchor{17a8}
@subsubsection Library



@itemize -

@item 
gh-116738@footnote{https://github.com/python/cpython/issues/116738}: Fix @ref{19,,cmath} data race when initializing trigonometric
tables with subinterpreters.
@end itemize

@node Python 3 14 1 final,Python 3 14 0 final,Python 3 14 2 final,Changelog
@anchor{whatsnew/changelog python-3-14-1-final}@anchor{17a9}
@subsection Python 3.14.1 final


`Release date: 2025-12-02'

@menu
* Windows: Windows<3>. 
* Tools/Demos: Tools/Demos<2>. 
* Tests: Tests<3>. 
* Security: Security<4>. 
* Library: Library<5>. 
* IDLE: IDLE<4>. 
* Documentation: Documentation<4>. 
* Core and Builtins: Core and Builtins<4>. 
* Library: Library<6>. 
* Core and Builtins: Core and Builtins<5>. 
* Library: Library<7>. 
* Core and Builtins: Core and Builtins<6>. 
* Library: Library<8>. 
* Core and Builtins: Core and Builtins<7>. 
* Library: Library<9>. 
* Core and Builtins: Core and Builtins<8>. 
* Library: Library<10>. 
* Core and Builtins: Core and Builtins<9>. 
* Library: Library<11>. 
* Core and Builtins: Core and Builtins<10>. 
* C API: C API<3>. 
* Build: Build<3>. 

@end menu

@node Windows<3>,Tools/Demos<2>,,Python 3 14 1 final
@anchor{whatsnew/changelog id15}@anchor{17aa}
@subsubsection Windows



@itemize -

@item 
gh-139810@footnote{https://github.com/python/cpython/issues/139810}: Installing with @code{py install 3[.x]-dev} will now select final
versions as well as prereleases.
@end itemize

@node Tools/Demos<2>,Tests<3>,Windows<3>,Python 3 14 1 final
@anchor{whatsnew/changelog id16}@anchor{17ab}
@subsubsection Tools/Demos



@itemize -

@item 
gh-141692@footnote{https://github.com/python/cpython/issues/141692}: Each slice of an iOS XCframework now contains a @code{lib} folder
that contains a symlink to the libpython dylib. This allows binary modules
to be compiled for iOS using dynamic libreary linking, rather than
Framework linking.

@item 
gh-141442@footnote{https://github.com/python/cpython/issues/141442}: The iOS testbed now correctly handles test arguments that
contain spaces.

@item 
gh-140702@footnote{https://github.com/python/cpython/issues/140702}: The iOS testbed app will now expose the @code{GITHUB_ACTIONS}
environment variable to iOS apps being tested.

@item 
gh-137484@footnote{https://github.com/python/cpython/issues/137484}: Have @code{Tools/wasm/wasi} put the build Python into a directory
named after the build triple instead of “build”.

@item 
gh-137248@footnote{https://github.com/python/cpython/issues/137248}: Add a @code{--logdir} option to @code{Tools/wasm/wasi} for specifying
where to write log files.

@item 
gh-137243@footnote{https://github.com/python/cpython/issues/137243}: Have Tools/wasm/wasi detect a WASI SDK install in /opt when it
was directly extracted from a release tarball.
@end itemize

@node Tests<3>,Security<4>,Tools/Demos<2>,Python 3 14 1 final
@anchor{whatsnew/changelog id17}@anchor{17ac}
@subsubsection Tests



@itemize -

@item 
gh-140482@footnote{https://github.com/python/cpython/issues/140482}: Preserve and restore the state of @code{stty echo} as part of the
test environment.

@item 
gh-140082@footnote{https://github.com/python/cpython/issues/140082}: Update @code{python -m test} to set @code{FORCE_COLOR=1} when being
run with color enabled so that @ref{10c,,unittest} which is run by it with
redirected output will output in color.

@item 
gh-139208@footnote{https://github.com/python/cpython/issues/139208}: Fix regrtest @code{--fast-ci --verbose}: don’t ignore the
@code{--verbose} option anymore. Patch by Victor Stinner.

@item 
gh-136442@footnote{https://github.com/python/cpython/issues/136442}: Use exitcode @code{1} instead of @code{5} if
@ref{c40,,unittest.TestCase.setUpClass()} raises an exception
@end itemize

@node Security<4>,Library<5>,Tests<3>,Python 3 14 1 final
@anchor{whatsnew/changelog id18}@anchor{17ad}
@subsubsection Security



@itemize -

@item 
gh-139700@footnote{https://github.com/python/cpython/issues/139700}: Check consistency of the zip64 end of central directory record.
Support records with “zip64 extensible data” if there are no bytes
prepended to the ZIP file.

@item 
gh-139283@footnote{https://github.com/python/cpython/issues/139283}: @ref{d4,,sqlite3}: correctly handle maximum number of rows to
fetch in @ref{17ae,,Cursor.fetchmany} and reject
negative values for @ref{17af,,Cursor.arraysize}.
Patch by Bénédikt Tran.

@item 
gh-137836@footnote{https://github.com/python/cpython/issues/137836}: Add support of the “plaintext” element, RAWTEXT elements “xmp”,
“iframe”, “noembed” and “noframes”, and optionally RAWTEXT element
“noscript” in @ref{a77,,html.parser.HTMLParser}.

@item 
gh-136063@footnote{https://github.com/python/cpython/issues/136063}: @ref{48,,email.message}: ensure linear complexity for legacy HTTP
parameters parsing. Patch by Bénédikt Tran.

@item 
gh-136065@footnote{https://github.com/python/cpython/issues/136065}: Fix quadratic complexity in @ref{15de,,os.path.expandvars()}.

@item 
gh-119451@footnote{https://github.com/python/cpython/issues/119451}: Fix a potential memory denial of service in the
@ref{73,,http.client} module. When connecting to a malicious server, it could
cause an arbitrary amount of memory to be allocated. This could have led
to symptoms including a @ref{175f,,MemoryError}, swapping, out of memory (OOM)
killed processes or containers, or even system crashes.

@item 
gh-119342@footnote{https://github.com/python/cpython/issues/119342}: Fix a potential memory denial of service in the @ref{b0,,plistlib}
module. When reading a Plist file received from untrusted source, it could
cause an arbitrary amount of memory to be allocated. This could have led
to symptoms including a @ref{175f,,MemoryError}, swapping, out of memory (OOM)
killed processes or containers, or even system crashes.
@end itemize

@node Library<5>,IDLE<4>,Security<4>,Python 3 14 1 final
@anchor{whatsnew/changelog id19}@anchor{17b0}
@subsubsection Library



@itemize -

@item 
gh-74389@footnote{https://github.com/python/cpython/issues/74389}: When the stdin being used by a @ref{4b8,,subprocess.Popen}
instance is closed, this is now ignored in
@ref{17b1,,subprocess.Popen.communicate()} instead of leaving the class in an
inconsistent state.

@item 
gh-87512@footnote{https://github.com/python/cpython/issues/87512}: Fix @ref{17b1,,subprocess.Popen.communicate()} timeout handling on
Windows when writing large input. Previously, the timeout was ignored
during stdin writing, causing the method to block indefinitely if the
child process did not consume input quickly. The stdin write is now
performed in a background thread, allowing the timeout to be properly
enforced.

@item 
gh-141473@footnote{https://github.com/python/cpython/issues/141473}: When @ref{17b1,,subprocess.Popen.communicate()} was called with
`input' and a `timeout' and is called for a second time after a
@ref{17b2,,TimeoutExpired} exception before the process has died,
it should no longer hang.

@item 
gh-59000@footnote{https://github.com/python/cpython/issues/59000}: Fix @ref{aa,,pdb} breakpoint resolution for class methods when the
module defining the class is not imported.

@item 
gh-141570@footnote{https://github.com/python/cpython/issues/141570}: Support @ref{17b3,,file-like object} raising @ref{2c0,,OSError} from
@ref{17b4,,fileno()} in color detection
(@code{_colorize.can_colorize()}). This can occur when @code{sys.stdout} is
redirected.

@item 
gh-141659@footnote{https://github.com/python/cpython/issues/141659}: Fix bad file descriptor errors from @code{_posixsubprocess} on
AIX.

@item 
gh-141600@footnote{https://github.com/python/cpython/issues/141600}: Fix musl version detection on Void Linux.

@item 
gh-141497@footnote{https://github.com/python/cpython/issues/141497}: @ref{84,,ipaddress}: ensure that the methods
@ref{17b5,,IPv4Network.hosts()} and
@ref{17b6,,IPv6Network.hosts()} always return an
iterator.

@item 
gh-140938@footnote{https://github.com/python/cpython/issues/140938}: The @ref{8e2,,statistics.stdev()} and @ref{17b7,,statistics.pstdev()}
functions now raise a @ref{2ec,,ValueError} when the input contains an
infinity or a NaN.

@item 
gh-124111@footnote{https://github.com/python/cpython/issues/124111}: Updated Tcl threading configuration in @ref{3,,_tkinter} to
assume that threads are always available in Tcl 9 and later.

@item 
gh-137109@footnote{https://github.com/python/cpython/issues/137109}: The @ref{4b6,,os.fork} and related forking APIs will no longer warn
in the common case where Linux or macOS platform APIs return the number of
threads in a process and find the answer to be 1 even when a
@ref{355,,os.register_at_fork()} @code{after_in_parent=} callback (re)starts a
thread.

@item 
gh-141314@footnote{https://github.com/python/cpython/issues/141314}: Fix assertion failure in @ref{17b8,,io.TextIOWrapper.tell()} when
reading files with standalone carriage return (@code{\r}) line endings.

@item 
gh-141311@footnote{https://github.com/python/cpython/issues/141311}: Fix assertion failure in @code{io.BytesIO.readinto()} and
undefined behavior arising when read position is above capcity in
@ref{10a3,,io.BytesIO}.

@item 
gh-141141@footnote{https://github.com/python/cpython/issues/141141}: Fix a thread safety issue with @ref{1122,,base64.b85decode()}.
Contributed by Benel Tayar.

@item 
gh-137969@footnote{https://github.com/python/cpython/issues/137969}: Fix @ref{17b9,,annotationlib.ForwardRef.evaluate()} returning
@ref{177e,,ForwardRef} objects which don’t update with new
globals.

@item 
gh-140911@footnote{https://github.com/python/cpython/issues/140911}: @ref{1e,,collections}: Ensure that the methods
@code{UserString.rindex()} and @code{UserString.index()} accept
@ref{fd2,,collections.UserString} instances as the sub argument.

@item 
gh-140797@footnote{https://github.com/python/cpython/issues/140797}: The undocumented @code{re.Scanner} class now forbids regular
expressions containing capturing groups in its lexicon patterns. Patterns
using capturing groups could previously lead to crashes with segmentation
fault. Use non-capturing groups (?:…) instead.

@item 
gh-125115@footnote{https://github.com/python/cpython/issues/125115}: Refactor the @ref{aa,,pdb} parsing issue so positional arguments
can pass through intuitively.

@item 
gh-140815@footnote{https://github.com/python/cpython/issues/140815}: @ref{5c,,faulthandler} now detects if a frame or a code object is
invalid or freed. Patch by Victor Stinner.

@item 
gh-100218@footnote{https://github.com/python/cpython/issues/100218}: Correctly set @ref{17ba,,errno} when
@ref{c22,,socket.if_nametoindex()} or @ref{c23,,socket.if_indextoname()} raise an
@ref{2c0,,OSError}. Patch by Bénédikt Tran.

@item 
gh-140875@footnote{https://github.com/python/cpython/issues/140875}: Fix handling of unclosed character references (named and
numerical) followed by the end of file in @ref{a77,,html.parser.HTMLParser}
with @code{convert_charrefs=False}.

@item 
gh-140734@footnote{https://github.com/python/cpython/issues/140734}: @ref{98,,multiprocessing}: fix off-by-one error when checking the
length of a temporary socket file path. Patch by Bénédikt Tran.

@item 
gh-140874@footnote{https://github.com/python/cpython/issues/140874}: Bump the version of pip bundled in ensurepip to version 25.3

@item 
gh-140691@footnote{https://github.com/python/cpython/issues/140691}: In @ref{111,,urllib.request}, when opening a FTP URL fails because
a data connection cannot be made, the control connection’s socket is now
closed to avoid a @ref{54e,,ResourceWarning}.

@item 
gh-103847@footnote{https://github.com/python/cpython/issues/103847}: Fix hang when cancelling process created by
@ref{c6a,,asyncio.create_subprocess_exec()} or
@ref{c6b,,asyncio.create_subprocess_shell()}. Patch by Kumar Aditya.

@item 
gh-120057@footnote{https://github.com/python/cpython/issues/120057}: Add @ref{258,,os.reload_environ()} to @code{os.__all__}.

@item 
gh-140228@footnote{https://github.com/python/cpython/issues/140228}: Avoid making unnecessary filesystem calls for frozen modules in
@ref{89,,linecache} when the global module cache is not present.

@item 
gh-140590@footnote{https://github.com/python/cpython/issues/140590}: Fix arguments checking for the
@code{functools.partial.__setstate__()} that may lead to internal state
corruption and crash. Patch by Sergey Miryanov.

@item 
gh-125434@footnote{https://github.com/python/cpython/issues/125434}: Display thread name in @ref{5c,,faulthandler} on Windows. Patch by
Victor Stinner.

@item 
gh-140634@footnote{https://github.com/python/cpython/issues/140634}: Fix a reference counting bug in
@code{os.sched_param.__reduce__()}.

@item 
gh-140633@footnote{https://github.com/python/cpython/issues/140633}: Ignore @ref{5ee,,AttributeError} when setting a module’s
@code{__file__} attribute when loading an extension module packaged as Apple
Framework.

@item 
gh-140593@footnote{https://github.com/python/cpython/issues/140593}: @ref{12c,,xml.parsers.expat}: Fix a memory leak that could affect
users with @ref{175a,,ElementDeclHandler()} set to
a custom element declaration handler. Patch by Sebastian Pipping.

@item 
gh-140607@footnote{https://github.com/python/cpython/issues/140607}: Inside @ref{101b,,io.RawIOBase.read()}, validate that the count of
bytes returned by @ref{101c,,io.RawIOBase.readinto()} is valid (inside the
provided buffer).

@item 
gh-138162@footnote{https://github.com/python/cpython/issues/138162}: Fix @ref{14fa,,logging.LoggerAdapter} with @code{merge_extra=True}
and without the `extra' argument.

@item 
gh-138774@footnote{https://github.com/python/cpython/issues/138774}: @ref{ae2,,ast.unparse()} now generates full source code when
handling @ref{17bb,,ast.Interpolation} nodes that do not have a specified
source.

@item 
gh-140474@footnote{https://github.com/python/cpython/issues/140474}: Fix memory leak in @ref{4c0,,array.array} when creating arrays
from an empty @ref{169,,str} and the @code{u} type code.

@item 
gh-137530@footnote{https://github.com/python/cpython/issues/137530}: @ref{33,,dataclasses} Fix annotations for generated @code{__init__}
methods by replacing the annotations that were in-line in the generated
source code with @code{__annotate__} functions attached to the methods.

@item 
gh-140348@footnote{https://github.com/python/cpython/issues/140348}: Fix regression in Python 3.14.0 where using the @code{|} operator
on a @ref{2a8,,typing.Union} object combined with an object that is not a
type would raise an error.

@item 
gh-140272@footnote{https://github.com/python/cpython/issues/140272}: Fix memory leak in the @code{clear()} method of the
@ref{37,,dbm.gnu} database.

@item 
gh-140041@footnote{https://github.com/python/cpython/issues/140041}: Fix import of @ref{2e,,ctypes} on Android and Cygwin when ABI
flags are present.

@item 
gh-140120@footnote{https://github.com/python/cpython/issues/140120}: Fixed a memory leak in @ref{6e,,hmac} when it was using the
hacl-star backend. Discovered by @code{@@ashm-dev} using AddressSanitizer.

@item 
gh-139905@footnote{https://github.com/python/cpython/issues/139905}: Add suggestion to error message for @ref{17bc,,typing.Generic}
subclasses when @code{cls.__parameters__} is missing due to a parent class
failing to call @ref{842,,super().__init_subclass__()} in its @code{__init_subclass__}.

@item 
gh-139894@footnote{https://github.com/python/cpython/issues/139894}: Fix incorrect sharing of current task with the child process
while forking in @ref{b,,asyncio}. Patch by Kumar Aditya.

@item 
gh-139845@footnote{https://github.com/python/cpython/issues/139845}: Fix to not print KeyboardInterrupt twice in default asyncio
REPL.

@item 
gh-139783@footnote{https://github.com/python/cpython/issues/139783}: Fix @ref{17bd,,inspect.getsourcelines()} for the case when a
decorator is followed by a comment or an empty line.

@item 
gh-139809@footnote{https://github.com/python/cpython/issues/139809}: Prevent premature colorization of subparser @code{prog} in
@ref{e10,,argparse.ArgumentParser.add_subparsers()} to respect color
environment variable changes after parser creation.

@item 
gh-139736@footnote{https://github.com/python/cpython/issues/139736}: Fix excessive indentation in the default @ref{7,,argparse}
@code{HelpFormatter}. Patch by Alexander Edland.

@item 
gh-70765@footnote{https://github.com/python/cpython/issues/70765}: @ref{76,,http.server}: fix default handling of HTTP/0.9 requests in
@ref{12d0,,BaseHTTPRequestHandler}. Previously,
@code{BaseHTTPRequestHandler.parse_request()} incorrectly waited for
headers in the request although those are not supported in HTTP/0.9. Patch
by Bénédikt Tran.

@item 
gh-63161@footnote{https://github.com/python/cpython/issues/63161}: Fix @ref{17be,,tokenize.detect_encoding()}. Support non-UTF-8 shebang
and comments if non-UTF-8 encoding is specified. Detect decoding error for
non-UTF-8 encoding. Detect null bytes in source code.

@item 
gh-139391@footnote{https://github.com/python/cpython/issues/139391}: Fix an issue when, on non-Windows platforms, it was not
possible to gracefully exit a @code{python -m asyncio} process suspended by
Ctrl+Z and later resumed by @code{fg@footnote{https://manpages.debian.org/fg}} other than with @code{kill@footnote{https://manpages.debian.org/kill}}.

@item 
gh-101828@footnote{https://github.com/python/cpython/issues/101828}: Fix @code{'shift_jisx0213'}, @code{'shift_jis_2004'},
@code{'euc_jisx0213'} and @code{'euc_jis_2004'} codecs truncating null chars as
they were treated as part of multi-character sequences.

@item 
gh-139289@footnote{https://github.com/python/cpython/issues/139289}: Do a real lazy-import on @ref{c2,,rlcompleter} in @ref{aa,,pdb} and
restore the existing completer after importing @code{rlcompleter}.

@item 
gh-139246@footnote{https://github.com/python/cpython/issues/139246}: fix: paste zero-width in default repl width is wrong.

@item 
gh-90949@footnote{https://github.com/python/cpython/issues/90949}: Add
@ref{17bf,,SetAllocTrackerActivationThreshold()}
and
@ref{17c0,,SetAllocTrackerMaximumAmplification()}
to @ref{17c1,,xmlparser} objects to prevent use of
disproportional amounts of dynamic memory from within an Expat parser.
Patch by Bénédikt Tran.

@item 
gh-139210@footnote{https://github.com/python/cpython/issues/139210}: Fix use-after-free when reporting unknown event in
@ref{579,,xml.etree.ElementTree.iterparse()}. Patch by Ken Jin.

@item 
gh-138860@footnote{https://github.com/python/cpython/issues/138860}: Lazy import @ref{c2,,rlcompleter} in @ref{aa,,pdb} to avoid deadlock
in subprocess.

@item 
gh-112729@footnote{https://github.com/python/cpython/issues/112729}: Fix crash when calling @ref{17c2,,concurrent.interpreters.create()}
when the process is out of memory.

@item 
gh-135729@footnote{https://github.com/python/cpython/issues/135729}: Fix unraisable exception during finalization when using
@ref{25,,concurrent.interpreters} in the REPL.

@item 
gh-139076@footnote{https://github.com/python/cpython/issues/139076}: Fix a bug in the @ref{ba,,pydoc} module that was hiding functions
in a Python module if they were implemented in an extension module and the
module did not have @code{__all__}.

@item 
gh-139065@footnote{https://github.com/python/cpython/issues/139065}: Fix trailing space before a wrapped long word if the line
length is exactly `width' in @ref{f2,,textwrap}.

@item 
gh-139001@footnote{https://github.com/python/cpython/issues/139001}: Fix race condition in @ref{266,,pathlib.Path} on the internal
@code{_raw_paths} field.

@item 
gh-138813@footnote{https://github.com/python/cpython/issues/138813}: @code{multiprocessing.BaseProcess} defaults @code{kwargs} to
@code{None} instead of a shared dictionary.

@item 
gh-138993@footnote{https://github.com/python/cpython/issues/138993}: Dedent @ref{1791,,credits} text.

@item 
gh-138891@footnote{https://github.com/python/cpython/issues/138891}: Fix @code{SyntaxError} when @code{inspect.get_annotations(f,
eval_str=True)} is called on a function annotated with a 
@geindex Python 향상 제안; PEP 646
PEP 646@footnote{https://peps.python.org/pep-0646/}
@code{star_expression}

@item 
gh-130567@footnote{https://github.com/python/cpython/issues/130567}: Fix possible crash in @ref{17c3,,locale.strxfrm()} due to a platform
bug on macOS.

@item 
gh-138859@footnote{https://github.com/python/cpython/issues/138859}: Fix generic type parameterization raising a @ref{198,,TypeError}
when omitting a @code{ParamSpec} that has a default which is not a list
of types.

@item 
gh-138764@footnote{https://github.com/python/cpython/issues/138764}: Prevent @ref{17c4,,annotationlib.call_annotate_function()} from
calling @code{__annotate__} functions that don’t support
@code{VALUE_WITH_FAKE_GLOBALS} in a fake globals namespace with empty
globals.

Make @code{FORWARDREF} and @code{STRING} annotations fall back to using
@code{VALUE} annotations in the case that neither their own format, nor
@code{VALUE_WITH_FAKE_GLOBALS} are supported.

@item 
gh-138775@footnote{https://github.com/python/cpython/issues/138775}: Use of @code{python -m} with @ref{f,,base64} has been fixed to
detect input from a terminal so that it properly notices EOF.

@item 
gh-138779@footnote{https://github.com/python/cpython/issues/138779}: Support device numbers larger than @code{2**63-1} for the
@ref{17c5,,st_rdev} field of the @ref{16c6,,os.stat_result}
structure.

@item 
gh-137706@footnote{https://github.com/python/cpython/issues/137706}: Fix the partial evaluation of annotations that use
@code{typing.Annotated[T, x]} where @code{T} is a forward reference.

@item 
gh-88375@footnote{https://github.com/python/cpython/issues/88375}: Fix normalization of the @code{robots.txt} rules and URLs in the
@ref{113,,urllib.robotparser} module. No longer ignore trailing @code{?}.
Distinguish raw special characters @code{?}, @code{=} and @code{&} from the
percent-encoded ones.

@item 
gh-111788@footnote{https://github.com/python/cpython/issues/111788}: Fix parsing errors in the @ref{113,,urllib.robotparser} module.
Don’t fail trying to parse weird paths. Don’t fail trying to decode
non-UTF-8 @code{robots.txt} files.

@item 
gh-98896@footnote{https://github.com/python/cpython/issues/98896}: Fix a failure in multiprocessing resource_tracker when
SharedMemory names contain colons. Patch by Rani Pinchuk.

@item 
gh-138425@footnote{https://github.com/python/cpython/issues/138425}: Fix partial evaluation of @ref{177e,,annotationlib.ForwardRef}
objects which rely on names defined as globals.

@item 
gh-138432@footnote{https://github.com/python/cpython/issues/138432}: @ref{17c6,,zoneinfo.reset_tzpath()} will now convert any
@ref{e4a,,os.PathLike} objects it receives into strings before adding them
to @code{TZPATH}. It will raise @code{TypeError} if anything other than a string
is found after this conversion. If given an @code{os.PathLike} object
that represents a relative path, it will now raise @code{ValueError} instead
of @code{TypeError}, and present a more informative error message.

@item 
gh-138008@footnote{https://github.com/python/cpython/issues/138008}: Fix segmentation faults in the @ref{2e,,ctypes} module due to
invalid @ref{17c7,,argtypes}. Patch by Dung Nguyen.

@item 
gh-60462@footnote{https://github.com/python/cpython/issues/60462}: Fix @ref{17c3,,locale.strxfrm()} on Solaris (and possibly other
platforms).

@item 
gh-138239@footnote{https://github.com/python/cpython/issues/138239}: The REPL now highlights @ref{66b,,type} as a soft keyword in
@ref{66b,,type statements}.

@item 
gh-138204@footnote{https://github.com/python/cpython/issues/138204}: Forbid expansion of shared anonymous @ref{94,,memory maps}
on Linux, which caused a bus error.

@item 
gh-138010@footnote{https://github.com/python/cpython/issues/138010}: Fix an issue where defining a class with an
@ref{48a,,@@warnings.deprecated}-decorated base class
may not invoke the correct @ref{842,,__init_subclass__()} method in
cases involving multiple inheritance. Patch by Brian Schubert.

@item 
gh-138151@footnote{https://github.com/python/cpython/issues/138151}: In @ref{6,,annotationlib}, improve evaluation of forward
references to nonlocal variables that are not yet defined when the
annotations are initially evaluated.

@item 
gh-137317@footnote{https://github.com/python/cpython/issues/137317}: @ref{22f,,inspect.signature()} now correctly handles classes that
use a descriptor on a wrapped @code{__init__()} or @code{__new__()}
method. Contributed by Yongyu Yan.

@item 
gh-137754@footnote{https://github.com/python/cpython/issues/137754}: Fix import of the @ref{13a,,zoneinfo} module if the C
implementation of the @ref{34,,datetime} module is not available.

@item 
gh-137490@footnote{https://github.com/python/cpython/issues/137490}: Handle @ref{17c8,,ECANCELED} in the same way as
@ref{f86,,EINTR} in @ref{faa,,signal.sigwaitinfo()} on NetBSD.

@item 
gh-137477@footnote{https://github.com/python/cpython/issues/137477}: Fix @code{inspect.getblock()}, @ref{17bd,,inspect.getsourcelines()}
and @ref{17c9,,inspect.getsource()} for generator expressions.

@item 
gh-137044@footnote{https://github.com/python/cpython/issues/137044}: Return large limit values as positive integers instead of
negative integers in @ref{17ca,,resource.getrlimit()}. Accept large values and
reject negative values (except @ref{17cb,,RLIM_INFINITY}) for limits
in @ref{17cc,,resource.setrlimit()}.

@item 
gh-75989@footnote{https://github.com/python/cpython/issues/75989}: @ref{29b,,tarfile.TarFile.extractall()} and
@ref{29c,,tarfile.TarFile.extract()} now overwrite symlinks when extracting
hardlinks. (Contributed by Alexander Enrique Urieles Nieto in
gh-75989@footnote{https://github.com/python/cpython/issues/75989}.)

@item 
gh-137017@footnote{https://github.com/python/cpython/issues/137017}: Fix @ref{b46,,threading.Thread.is_alive} to remain @code{True} until
the underlying OS thread is fully cleaned up. This avoids false negatives
in edge cases involving thread monitoring or premature
@code{threading.Thread.is_alive} calls.

@item 
gh-137273@footnote{https://github.com/python/cpython/issues/137273}: Fix debug assertion failure in @ref{328,,locale.setlocale()} on
Windows.

@item 
gh-137239@footnote{https://github.com/python/cpython/issues/137239}: @ref{6d,,heapq}: Update @code{heapq.__all__} with @code{*_max}
functions.

@item 
gh-81325@footnote{https://github.com/python/cpython/issues/81325}: @ref{1415,,tarfile.TarFile} now accepts a @ref{5a0,,path-like} when working on a tar archive. (Contributed by
Alexander Enrique Urieles Nieto in gh-81325@footnote{https://github.com/python/cpython/issues/81325}.)

@item 
gh-137185@footnote{https://github.com/python/cpython/issues/137185}: Fix a potential async-signal-safety issue in
@ref{5c,,faulthandler} when printing C stack traces.

@item 
gh-136914@footnote{https://github.com/python/cpython/issues/136914}: Fix retrieval of @ref{17cd,,doctest.DocTest.lineno} for objects
decorated with @ref{17ce,,functools.cache()} or
@ref{762,,functools.cached_property}.

@item 
gh-136912@footnote{https://github.com/python/cpython/issues/136912}: @ref{d31,,hmac.digest()} now properly handles large keys and
messages by falling back to the pure Python implementation when necessary.
Patch by Bénédikt Tran.

@item 
gh-83424@footnote{https://github.com/python/cpython/issues/83424}: Allows creating a @ref{bdb,,ctypes.CDLL} without name when passing
a handle as an argument.

@item 
gh-136234@footnote{https://github.com/python/cpython/issues/136234}: Fix @ref{17cf,,asyncio.WriteTransport.writelines()} to be robust to
connection failure, by using the same behavior as
@ref{17d0,,write()}.

@item 
gh-136507@footnote{https://github.com/python/cpython/issues/136507}: Fix mimetypes CLI to handle multiple file parameters.

@item 
gh-136057@footnote{https://github.com/python/cpython/issues/136057}: Fixed the bug in @ref{aa,,pdb} and @ref{10,,bdb} where @code{next} and
@code{step} can’t go over the line if a loop exists in the line.

@item 
gh-135386@footnote{https://github.com/python/cpython/issues/135386}: Fix opening a @ref{39,,dbm.sqlite3} database for reading from
read-only file or directory.

@item 
gh-135444@footnote{https://github.com/python/cpython/issues/135444}: Fix @ref{4cc,,asyncio.DatagramTransport.sendto()} to account for
datagram header size when data cannot be sent.

@item 
gh-126631@footnote{https://github.com/python/cpython/issues/126631}: Fix @ref{98,,multiprocessing} @code{forkserver} bug which prevented
@code{__main__} from being preloaded.

@item 
gh-135307@footnote{https://github.com/python/cpython/issues/135307}: @ref{3f,,email}: Fix exception in @code{set_content()} when encoding
text and max_line_length is set to @code{0} or @code{None} (unlimited).

@item 
gh-134453@footnote{https://github.com/python/cpython/issues/134453}: Fixed @ref{17b1,,subprocess.Popen.communicate()} @code{input=} handling
of @ref{165,,memoryview} instances that were non-byte shaped on POSIX
platforms. Those are now properly cast to a byte shaped view instead of
truncating the input.  Windows platforms did not have this bug.

@item 
gh-134698@footnote{https://github.com/python/cpython/issues/134698}: Fix a crash when calling methods of @ref{357,,ssl.SSLContext} or
@ref{ae7,,ssl.SSLSocket} across multiple threads.

@item 
gh-125996@footnote{https://github.com/python/cpython/issues/125996}: Fix thread safety of @ref{7f2,,collections.OrderedDict}. Patch by
Kumar Aditya.

@item 
gh-133789@footnote{https://github.com/python/cpython/issues/133789}: Fix unpickling of @ref{a8,,pathlib} objects that were pickled in
Python 3.13.

@item 
gh-127081@footnote{https://github.com/python/cpython/issues/127081}: Fix libc thread safety issues with @ref{35,,dbm} by performing
stateful operations in critical sections.

@item 
gh-132551@footnote{https://github.com/python/cpython/issues/132551}: Make @ref{10a3,,io.BytesIO} safe in @ref{1f4,,free-threaded} build.

@item 
gh-131788@footnote{https://github.com/python/cpython/issues/131788}: Make @code{ResourceTracker.send} from @ref{98,,multiprocessing}
re-entrant safe

@item 
gh-118981@footnote{https://github.com/python/cpython/issues/118981}: Fix potential hang in @code{multiprocessing.popen_spawn_posix}
that can happen when the child proc dies early by closing the child fds
right away.

@item 
gh-102431@footnote{https://github.com/python/cpython/issues/102431}: Clarify constraints for “logical” arguments in methods of
@ref{12b4,,decimal.Context}.

@item 
gh-78319@footnote{https://github.com/python/cpython/issues/78319}: UTF8 support for the IMAP APPEND command has been made RFC
compliant.

@item 
bpo-38735@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38735}: Fix failure when importing a module from the root directory on
unix-like platforms with sys.pycache_prefix set.

@item 
bpo-41839@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41839}: Allow negative priority values from
@ref{130e,,os.sched_get_priority_min()} and @ref{130d,,os.sched_get_priority_max()}
functions.
@end itemize

@node IDLE<4>,Documentation<4>,Library<5>,Python 3 14 1 final
@anchor{whatsnew/changelog id20}@anchor{17d1}
@subsubsection IDLE



@itemize -

@item 
gh-96491@footnote{https://github.com/python/cpython/issues/96491}: Deduplicate version number in IDLE shell title bar after saving
to a file.

@item 
gh-139742@footnote{https://github.com/python/cpython/issues/139742}: Colorize t-string prefixes for template strings in IDLE, as
done for f-string prefixes.
@end itemize

@node Documentation<4>,Core and Builtins<4>,IDLE<4>,Python 3 14 1 final
@anchor{whatsnew/changelog id21}@anchor{17d2}
@subsubsection Documentation



@itemize -

@item 
gh-141994@footnote{https://github.com/python/cpython/issues/141994}: @ref{130,,xml.sax.handler}: Make Documentation of
@ref{17d3,,xml.sax.handler.feature_external_ges} warn of opening up to
external entity attacks@footnote{https://en.wikipedia.org/wiki/XML_external_entity_attack}. Patch by
Sebastian Pipping.

@item 
gh-140578@footnote{https://github.com/python/cpython/issues/140578}: Remove outdated sencence in the documentation for
@ref{98,,multiprocessing}, that implied that
@ref{948,,concurrent.futures.ThreadPoolExecutor} did not exist.
@end itemize

@node Core and Builtins<4>,Library<6>,Documentation<4>,Python 3 14 1 final
@anchor{whatsnew/changelog id22}@anchor{17d4}
@subsubsection Core and Builtins



@itemize -

@item 
gh-142048@footnote{https://github.com/python/cpython/issues/142048}: Fix quadratically increasing garbage collection delays in
free-threaded build.
@end itemize

@node Library<6>,Core and Builtins<5>,Core and Builtins<4>,Python 3 14 1 final
@anchor{whatsnew/changelog id23}@anchor{17d5}
@subsubsection Library



@itemize -

@item 
gh-116738@footnote{https://github.com/python/cpython/issues/116738}: Fix thread safety issue with @ref{be,,re} scanner objects in
free-threaded builds.
@end itemize

@node Core and Builtins<5>,Library<7>,Library<6>,Python 3 14 1 final
@anchor{whatsnew/changelog id24}@anchor{17d6}
@subsubsection Core and Builtins



@itemize -

@item 
gh-141930@footnote{https://github.com/python/cpython/issues/141930}: When importing a module, use Python’s regular file object to
ensure that writes to @code{.pyc} files are complete or an appropriate error
is raised.

@item 
gh-120158@footnote{https://github.com/python/cpython/issues/120158}: Fix inconsistent state when enabling or disabling monitoring
events too many times.

@item 
gh-139653@footnote{https://github.com/python/cpython/issues/139653}: Only raise a @code{RecursionError} or trigger a fatal error if the
stack pointer is both below the limit pointer `and' above the stack base.
If outside of these bounds assume that it is OK. This prevents false
positives when user-space threads swap stacks.

@item 
gh-139103@footnote{https://github.com/python/cpython/issues/139103}: Improve multithreaded scaling of dataclasses on the
free-threaded build.

@item 
gh-141579@footnote{https://github.com/python/cpython/issues/141579}: Fix @ref{699,,sys.activate_stack_trampoline()} to properly support
the @code{perf_jit} backend. Patch by Pablo Galindo.

@item 
gh-114203@footnote{https://github.com/python/cpython/issues/114203}: Skip locking if object is already locked by two-mutex critical
section.

@item 
gh-141528@footnote{https://github.com/python/cpython/issues/141528}: Suggest using @ref{17d7,,concurrent.interpreters.Interpreter.close()}
instead of the private @code{_interpreters.destroy} function when warning
about remaining subinterpreters. Patch by Sergey Miryanov.

@item 
gh-141312@footnote{https://github.com/python/cpython/issues/141312}: Fix the assertion failure in the @code{__setstate__} method of the
range iterator when a non-integer argument is passed. Patch by Sergey
Miryanov.
@end itemize

@node Library<7>,Core and Builtins<6>,Core and Builtins<5>,Python 3 14 1 final
@anchor{whatsnew/changelog id25}@anchor{17d8}
@subsubsection Library



@itemize -

@item 
gh-116738@footnote{https://github.com/python/cpython/issues/116738}: Make csv module thread-safe on the @ref{1f4,,free threaded} build.
@end itemize

@node Core and Builtins<6>,Library<8>,Library<7>,Python 3 14 1 final
@anchor{whatsnew/changelog id26}@anchor{17d9}
@subsubsection Core and Builtins



@itemize -

@item 
gh-140939@footnote{https://github.com/python/cpython/issues/140939}: Fix memory leak when @ref{344,,bytearray} or @ref{192,,bytes} is
formated with the @code{%*b} format with a large width that results in a
@ref{175f,,MemoryError}.
@end itemize

@node Library<8>,Core and Builtins<7>,Core and Builtins<6>,Python 3 14 1 final
@anchor{whatsnew/changelog id27}@anchor{17da}
@subsubsection Library



@itemize -

@item 
gh-140260@footnote{https://github.com/python/cpython/issues/140260}: Fix @ref{db,,struct} data race in endian table initialization with
subinterpreters. Patch by Shamil Abdulaev.
@end itemize

@node Core and Builtins<7>,Library<9>,Library<8>,Python 3 14 1 final
@anchor{whatsnew/changelog id28}@anchor{17db}
@subsubsection Core and Builtins



@itemize -

@item 
gh-140530@footnote{https://github.com/python/cpython/issues/140530}: Fix a reference leak when @code{raise exc from cause} fails. Patch
by Bénédikt Tran.

@item 
gh-140373@footnote{https://github.com/python/cpython/issues/140373}: Correctly emit @code{PY_UNWIND} event when generator object is
closed. Patch by Mikhail Efimov.

@item 
gh-140576@footnote{https://github.com/python/cpython/issues/140576}: Fixed crash in @ref{700,,tokenize.generate_tokens()} in case of
specific incorrect input. Patch by Mikhail Efimov.

@item 
gh-140551@footnote{https://github.com/python/cpython/issues/140551}: Fixed crash in @ref{183,,dict} if @ref{1772,,dict.clear()} is called at
the lookup stage. Patch by Mikhail Efimov and Inada Naoki.

@item 
gh-140517@footnote{https://github.com/python/cpython/issues/140517}: Fixed a reference leak when iterating over the result of
@ref{19f,,map()} with @code{strict=True} when the input iterables have different
lengths. Patch by Mikhail Efimov.

@item 
gh-140471@footnote{https://github.com/python/cpython/issues/140471}: Fix potential buffer overflow in @ref{4c5,,ast.AST} node
initialization when encountering malformed @ref{17dc,,_fields}
containing non-@ref{169,,str}.

@item 
gh-140431@footnote{https://github.com/python/cpython/issues/140431}: Fix a crash in Python’s @ref{17dd,,garbage collector} due to partially initialized @ref{6b8,,coroutine} objects when
coroutine origin tracking depth is enabled
(@ref{d84,,sys.set_coroutine_origin_tracking_depth()}).
@end itemize

@node Library<9>,Core and Builtins<8>,Core and Builtins<7>,Python 3 14 1 final
@anchor{whatsnew/changelog id29}@anchor{17de}
@subsubsection Library



@itemize -

@item 
gh-140398@footnote{https://github.com/python/cpython/issues/140398}: Fix memory leaks in @ref{bf,,readline} functions
@ref{17df,,read_init_file()}, @ref{17e0,,read_history_file()},
@ref{17e1,,write_history_file()}, and
@ref{1050,,append_history_file()} when @ref{611,,PySys_Audit()} fails.
@end itemize

@node Core and Builtins<8>,Library<10>,Library<9>,Python 3 14 1 final
@anchor{whatsnew/changelog id30}@anchor{17e2}
@subsubsection Core and Builtins



@itemize -

@item 
gh-140406@footnote{https://github.com/python/cpython/issues/140406}: Fix memory leak when an object’s @ref{cf2,,__hash__()}
method returns an object that isn’t an @ref{19b,,int}.

@item 
gh-140358@footnote{https://github.com/python/cpython/issues/140358}: Restore elapsed time and unreachable object count in GC debug
output. These were inadvertently removed during a refactor of @code{gc.c}.
The debug log now again reports elapsed collection time and the number of
unreachable objects. Contributed by Pål Grønås Drange.

@item 
gh-140306@footnote{https://github.com/python/cpython/issues/140306}: Fix memory leaks in cross-interpreter channel operations and
shared namespace handling.

@item 
gh-140301@footnote{https://github.com/python/cpython/issues/140301}: Fix memory leak of @code{PyConfig} in subinterpreters.

@item 
gh-140257@footnote{https://github.com/python/cpython/issues/140257}: Fix data race between interpreter_clear() and take_gil() on
eval_breaker during finalization with daemon threads.

@item 
gh-139951@footnote{https://github.com/python/cpython/issues/139951}: Fixes a regression in GC performance for a growing heap
composed mostly of small tuples.


@itemize *

@item 
Counts number of actually tracked objects, instead of trackable objects.
This ensures that untracking tuples has the desired effect of reducing GC overhead.

@item 
Does not track most untrackable tuples during creation.
This prevents large numbers of small tuples causing excessive GCs.
@end itemize

@item 
gh-140104@footnote{https://github.com/python/cpython/issues/140104}: Fix a bug with exception handling in the JIT. Patch by Ken Jin.
Bug reported by Daniel Diniz.

@item 
gh-140061@footnote{https://github.com/python/cpython/issues/140061}: Fixing the checking of whether an object is uniquely referenced
to ensure free-threaded compatibility. Patch by Sergey Miryanov.

@item 
gh-140067@footnote{https://github.com/python/cpython/issues/140067}: Fix memory leak in sub-interpreter creation.

@item 
gh-140000@footnote{https://github.com/python/cpython/issues/140000}: Fix potential memory leak when a reference cycle exists between
an instance of @ref{2ae,,typing.TypeAliasType}, @ref{487,,typing.TypeVar},
@ref{488,,typing.ParamSpec}, or @ref{489,,typing.TypeVarTuple} and its
@code{__name__} attribute. Patch by Mikhail Efimov.

@item 
gh-139914@footnote{https://github.com/python/cpython/issues/139914}: Restore support for HP PA-RISC, which has an upwards-growing
stack.

@item 
gh-139988@footnote{https://github.com/python/cpython/issues/139988}: Fix a memory leak when failing to create a
@ref{2a8,,Union} type. Patch by Bénédikt Tran.

@item 
gh-139748@footnote{https://github.com/python/cpython/issues/139748}: Fix reference leaks in error branches of functions accepting
path strings or bytes such as @ref{4b2,,compile()} and @ref{1662,,os.system()}. Patch
by Bénédikt Tran.

@item 
gh-139516@footnote{https://github.com/python/cpython/issues/139516}: Fix lambda colon erroneously start format spec in f-string in
tokenizer.

@item 
gh-139640@footnote{https://github.com/python/cpython/issues/139640}: @ref{1c2,,ast.parse()} no longer emits syntax warnings for
@code{return}/@code{break}/@code{continue} in @code{finally} (see 
@geindex Python 향상 제안; PEP 765
PEP 765@footnote{https://peps.python.org/pep-0765/}) – they
are only emitted during compilation.

@item 
gh-139640@footnote{https://github.com/python/cpython/issues/139640}: Fix swallowing some syntax warnings in different modules if
they accidentally have the same message and are emitted from the same
line. Fix duplicated warnings in the @code{finally} block.

@item 
gh-63161@footnote{https://github.com/python/cpython/issues/63161}: Support non-UTF-8 shebang and comments in Python source files if
non-UTF-8 encoding is specified. Detect decoding error in comments for
default (UTF-8) encoding. Show the line and position of decoding error for
default encoding in a traceback. Show the line containing the coding
cookie when it conflicts with the BOM in a traceback.
@end itemize

@node Library<10>,Core and Builtins<9>,Core and Builtins<8>,Python 3 14 1 final
@anchor{whatsnew/changelog id31}@anchor{17e3}
@subsubsection Library



@itemize -

@item 
gh-116738@footnote{https://github.com/python/cpython/issues/116738}: Make @ref{94,,mmap} thread-safe on the @ref{1f4,,free threaded} build.
@end itemize

@node Core and Builtins<9>,Library<11>,Library<10>,Python 3 14 1 final
@anchor{whatsnew/changelog id32}@anchor{17e4}
@subsubsection Core and Builtins



@itemize -

@item 
gh-138558@footnote{https://github.com/python/cpython/issues/138558}: Fix handling of unusual t-string annotations in annotationlib.
Patch by Dave Peck.

@item 
gh-134466@footnote{https://github.com/python/cpython/issues/134466}: Don’t run PyREPL in a degraded environment where setting
termios attributes is not allowed.

@item 
gh-138944@footnote{https://github.com/python/cpython/issues/138944}: Fix @ref{18e,,SyntaxError} message when invalid syntax appears on
the same line as a valid @code{import ... as ...} or @code{from ... import ... as
...} statement. Patch by Brian Schubert.

@item 
gh-105487@footnote{https://github.com/python/cpython/issues/105487}: Remove non-existent @ref{17e5,,__copy__()},
@ref{17e6,,__deepcopy__()}, and @ref{16b1,,__bases__} from the
@ref{176c,,__dir__()} entries of @ref{9ec,,types.GenericAlias}.

@item 
gh-69605@footnote{https://github.com/python/cpython/issues/69605}: Fix some standard library submodules missing from the
@ref{492,,REPL} auto-completion of imports.
@end itemize

@node Library<11>,Core and Builtins<10>,Core and Builtins<9>,Python 3 14 1 final
@anchor{whatsnew/changelog id33}@anchor{17e7}
@subsubsection Library



@itemize -

@item 
gh-116738@footnote{https://github.com/python/cpython/issues/116738}: Make @ref{2b,,cProfile} thread-safe on the @ref{1f4,,free threaded} build.

@item 
gh-138004@footnote{https://github.com/python/cpython/issues/138004}: On Solaris/Illumos platforms, thread names are now encoded as
ASCII to avoid errors on systems (e.g. OpenIndiana) that don’t support
non-ASCII names.
@end itemize

@node Core and Builtins<10>,C API<3>,Library<11>,Python 3 14 1 final
@anchor{whatsnew/changelog id34}@anchor{17e8}
@subsubsection Core and Builtins



@itemize -

@item 
gh-137433@footnote{https://github.com/python/cpython/issues/137433}: Fix a potential deadlock in the @ref{1f4,,free threading} build
when daemon threads enable or disable profiling or tracing while the main
thread is shutting down the interpreter.

@item 
gh-137400@footnote{https://github.com/python/cpython/issues/137400}: Fix a crash in the @ref{1f4,,free threading} build when disabling
profiling or tracing across all threads with
@ref{780,,PyEval_SetProfileAllThreads()} or
@ref{662,,PyEval_SetTraceAllThreads()} or their Python equivalents
@ref{6ee,,threading.settrace_all_threads()} and
@ref{6ef,,threading.setprofile_all_threads()}.

@item 
gh-58124@footnote{https://github.com/python/cpython/issues/58124}: Fix name of the Python encoding in Unicode errors of the code
page codec: use “cp65000” and “cp65001” instead of “CP_UTF7” and “CP_UTF8”
which are not valid Python code names. Patch by Victor Stinner.

@item 
gh-132657@footnote{https://github.com/python/cpython/issues/132657}: Improve performance of @ref{7f1,,frozenset} by removing locks in
the free-threading build.

@item 
gh-133400@footnote{https://github.com/python/cpython/issues/133400}: Fixed Ctrl+D (^D) behavior in _pyrepl module to match old
pre-3.13 REPL behavior.

@item 
gh-128640@footnote{https://github.com/python/cpython/issues/128640}: Fix a crash when using threads inside of a subinterpreter.
@end itemize

@node C API<3>,Build<3>,Core and Builtins<10>,Python 3 14 1 final
@anchor{whatsnew/changelog id35}@anchor{17e9}
@subsubsection C API



@itemize -

@item 
gh-137422@footnote{https://github.com/python/cpython/issues/137422}: Fix @ref{1f4,,free threading} race condition in
@ref{5fa,,PyImport_AddModuleRef()}. It was previously possible for two calls
to the function return two different objects, only one of which was stored
in @ref{17ea,,sys.modules}.

@item 
gh-140042@footnote{https://github.com/python/cpython/issues/140042}: Removed the sqlite3_shutdown call that could cause closing
connections for sqlite when used with multiple sub interpreters.

@item 
gh-141042@footnote{https://github.com/python/cpython/issues/141042}: Make qNaN in @ref{968,,PyFloat_Pack2()} and
@ref{969,,PyFloat_Pack4()}, if while conversion to a narrower precision
floating-point format — the remaining after truncation payload will be
zero.  Patch by Sergey B Kirpichev.

@item 
gh-140487@footnote{https://github.com/python/cpython/issues/140487}: Fix @ref{17eb,,Py_RETURN_NOTIMPLEMENTED} in limited C API 3.11
and older: don’t treat @code{Py_NotImplemented} as immortal. Patch by Victor
Stinner.

@item 
gh-140153@footnote{https://github.com/python/cpython/issues/140153}: Fix @ref{2cf,,Py_REFCNT()} definition on limited C API 3.11-3.13.
Patch by Victor Stinner.

@item 
gh-139653@footnote{https://github.com/python/cpython/issues/139653}: Add @ref{466,,PyUnstable_ThreadState_SetStackProtection()} and
@ref{467,,PyUnstable_ThreadState_ResetStackProtection()} functions to set the
stack protection base address and stack protection size of a Python thread
state. Patch by Victor Stinner.
@end itemize

@node Build<3>,,C API<3>,Python 3 14 1 final
@anchor{whatsnew/changelog id36}@anchor{17ec}
@subsubsection Build



@itemize -

@item 
gh-141808@footnote{https://github.com/python/cpython/issues/141808}: Do not generate the jit stencils twice in case of PGO builds on
Windows.

@item 
gh-141784@footnote{https://github.com/python/cpython/issues/141784}: Fix @code{_remote_debugging_module.c} compilation on 32-bit Linux.
Include Python.h before system headers to make sure that
@code{_remote_debugging_module.c} uses the same types (ABI) than Python.
Patch by Victor Stinner.

@item 
gh-140768@footnote{https://github.com/python/cpython/issues/140768}: Warn when the WASI SDK version doesn’t match what’s supported.

@item 
gh-140513@footnote{https://github.com/python/cpython/issues/140513}: Generate a clear compilation error when
@code{_Py_TAIL_CALL_INTERP} is enabled but either @code{preserve_none} or
@code{musttail} is not supported.

@item 
gh-140189@footnote{https://github.com/python/cpython/issues/140189}: iOS builds were added to CI.

@item 
gh-138489@footnote{https://github.com/python/cpython/issues/138489}: When cross-compiling for WASI by @code{build_wasm} or
@code{build_emscripten}, the @code{build-details.json} step is now included in
the build process, just like with native builds.

This fixes the @code{libinstall} task which requires the
@code{build-details.json} file during the process.

@item 
gh-137618@footnote{https://github.com/python/cpython/issues/137618}: @code{PYTHON_FOR_REGEN} now requires Python 3.10 to Python 3.15.
Patch by Adam Turner.

@item 
gh-123681@footnote{https://github.com/python/cpython/issues/123681}: Check the @code{strftime()} behavior at runtime instead of at the
compile time to support cross-compiling. Remove the internal macro
@code{_Py_NORMALIZE_CENTURY}.
@end itemize

@node Python 3 14 0 final,Python 3 14 0 release candidate 3,Python 3 14 1 final,Changelog
@anchor{whatsnew/changelog python-3-14-0-final}@anchor{17ed}
@subsection Python 3.14.0 final


`Release date: 2025-10-07'

@menu
* macOS: macOS<2>. 
* Windows: Windows<4>. 
* Tools/Demos: Tools/Demos<3>. 
* Security: Security<5>. 
* Library: Library<12>. 

@end menu

@node macOS<2>,Windows<4>,,Python 3 14 0 final
@anchor{whatsnew/changelog id37}@anchor{17ee}
@subsubsection macOS



@itemize -

@item 
gh-124111@footnote{https://github.com/python/cpython/issues/124111}: Update macOS installer to use Tcl/Tk 8.6.17.

@item 
gh-139573@footnote{https://github.com/python/cpython/issues/139573}: Updated bundled version of OpenSSL to 3.0.18.
@end itemize

@node Windows<4>,Tools/Demos<3>,macOS<2>,Python 3 14 0 final
@anchor{whatsnew/changelog id38}@anchor{17ef}
@subsubsection Windows



@itemize -

@item 
gh-139573@footnote{https://github.com/python/cpython/issues/139573}: Updated bundled version of OpenSSL to 3.0.18.
@end itemize

@node Tools/Demos<3>,Security<5>,Windows<4>,Python 3 14 0 final
@anchor{whatsnew/changelog id39}@anchor{17f0}
@subsubsection Tools/Demos



@itemize -

@item 
gh-139330@footnote{https://github.com/python/cpython/issues/139330}: SBOM generation tool didn’t cross-check the version and
checksum values against the @code{Modules/expat/refresh.sh} script, leading
to the values becoming out-of-date during routine updates.

@item 
gh-132006@footnote{https://github.com/python/cpython/issues/132006}: XCframeworks now include privacy manifests to satisfy Apple App
Store submission requirements.

@item 
gh-138171@footnote{https://github.com/python/cpython/issues/138171}: A script for building an iOS XCframework was added. As part of
this change, the top level @code{iOS} folder has been moved to be a
subdirectory of the @code{Apple} folder.
@end itemize

@node Security<5>,Library<12>,Tools/Demos<3>,Python 3 14 0 final
@anchor{whatsnew/changelog id40}@anchor{17f1}
@subsubsection Security



@itemize -

@item 
gh-139400@footnote{https://github.com/python/cpython/issues/139400}: @ref{12c,,xml.parsers.expat}: Make sure that parent Expat parsers
are only garbage-collected once they are no longer referenced by
subparsers created by
@ref{1764,,ExternalEntityParserCreate()}. Patch by
Sebastian Pipping.
@end itemize

@node Library<12>,,Security<5>,Python 3 14 0 final
@anchor{whatsnew/changelog id41}@anchor{17f2}
@subsubsection Library



@itemize -

@item 
gh-139312@footnote{https://github.com/python/cpython/issues/139312}: Upgrade bundled libexpat to 2.7.3
@end itemize

@node Python 3 14 0 release candidate 3,Python 3 14 0 release candidate 2,Python 3 14 0 final,Changelog
@anchor{whatsnew/changelog python-3-14-0-release-candidate-3}@anchor{17f3}
@subsection Python 3.14.0 release candidate 3


`Release date: 2025-09-18'

@menu
* Windows: Windows<5>. 
* Tools/Demos: Tools/Demos<4>. 
* Security: Security<6>. 
* Library: Library<13>. 
* Core and Builtins: Core and Builtins<11>. 

@end menu

@node Windows<5>,Tools/Demos<4>,,Python 3 14 0 release candidate 3
@anchor{whatsnew/changelog id42}@anchor{17f4}
@subsubsection Windows



@itemize -

@item 
gh-138896@footnote{https://github.com/python/cpython/issues/138896}: Fix error installing C runtime on non-updated Windows machines
@end itemize

@node Tools/Demos<4>,Security<6>,Windows<5>,Python 3 14 0 release candidate 3
@anchor{whatsnew/changelog id43}@anchor{17f5}
@subsubsection Tools/Demos



@itemize -

@item 
gh-137873@footnote{https://github.com/python/cpython/issues/137873}: The iOS test runner has been simplified, resolving some issues
that have been observed using the runner in GitHub Actions and Azure
Pipelines test environments.
@end itemize

@node Security<6>,Library<13>,Tools/Demos<4>,Python 3 14 0 release candidate 3
@anchor{whatsnew/changelog id44}@anchor{17f6}
@subsubsection Security



@itemize -

@item 
gh-135661@footnote{https://github.com/python/cpython/issues/135661}: Fix CDATA section parsing in @ref{a77,,html.parser.HTMLParser}
according to the HTML5 standard: @code{] ]>} and @code{]] >} no longer end the
CDATA section. Add private method @code{_set_support_cdata()} which can be
used to specify how to parse @code{<[CDATA[} — as a CDATA section in
foreign content (SVG or MathML) or as a bogus comment in the HTML
namespace.
@end itemize

@node Library<13>,Core and Builtins<11>,Security<6>,Python 3 14 0 release candidate 3
@anchor{whatsnew/changelog id45}@anchor{17f7}
@subsubsection Library



@itemize -

@item 
gh-138998@footnote{https://github.com/python/cpython/issues/138998}: Update bundled libexpat to 2.7.2

@item 
gh-118803@footnote{https://github.com/python/cpython/issues/118803}: Add back @ref{342,,collections.abc.ByteString} and
@ref{345,,typing.ByteString}. Both had been removed in prior alpha, beta and
release candidates for Python 3.14, but their removal has now been
postponed to Python 3.17.

@item 
gh-137226@footnote{https://github.com/python/cpython/issues/137226}: Fix @ref{8bf,,typing.get_type_hints()} calls on generic
@ref{332,,typing.TypedDict} classes defined with string annotations.

@item 
gh-138804@footnote{https://github.com/python/cpython/issues/138804}: Raise @ref{198,,TypeError} instead of @ref{5ee,,AttributeError} when an
argument of incorrect type is passed to @ref{581,,shlex.quote()}. This restores
the behavior of the function prior to 3.14.

@item 
gh-128636@footnote{https://github.com/python/cpython/issues/128636}: Fix crash in PyREPL when os.environ is overwritten with an
invalid value for mac

@item 
gh-138514@footnote{https://github.com/python/cpython/issues/138514}: Raise @ref{2ec,,ValueError} when a multi-character string is passed
to the `echo_char' parameter of @ref{21d,,getpass.getpass()}. Patch by Benjamin
Johnson.

@item 
gh-138515@footnote{https://github.com/python/cpython/issues/138515}: @ref{3f,,email} is added to Emscripten build.

@item 
gh-99948@footnote{https://github.com/python/cpython/issues/99948}: @ref{f44,,ctypes.util.find_library()} now works in Emscripten build.

@item 
gh-138253@footnote{https://github.com/python/cpython/issues/138253}: Add the `block' parameter in the @code{put()} and @code{get()}
methods of the @ref{25,,concurrent.interpreters} queues for compatibility
with the @ref{1599,,queue.Queue} interface.

@item 
gh-138133@footnote{https://github.com/python/cpython/issues/138133}: Prevent infinite traceback loop when sending CTRL^C to Python
through @code{strace}.

@item 
gh-134869@footnote{https://github.com/python/cpython/issues/134869}: Fix an issue where pressing Ctrl+C during tab completion in the
REPL would leave the autocompletion menu in a corrupted state.

@item 
gh-90548@footnote{https://github.com/python/cpython/issues/90548}: Fix @code{musl} detection for @ref{17f8,,platform.libc_ver()} on Alpine
Linux if compiled with –strip-all.

@item 
gh-136134@footnote{https://github.com/python/cpython/issues/136134}: @code{SMTP.auth_cram_md5()} now raises an
@ref{11a0,,SMTPException} instead of a @ref{2ec,,ValueError} if Python has
been built without MD5 support. In particular, @ref{b27,,SMTP}
clients will not attempt to use this method even if the remote server is
assumed to support it. Patch by Bénédikt Tran.

@item 
gh-136134@footnote{https://github.com/python/cpython/issues/136134}: @ref{17f9,,IMAP4.login_cram_md5} now
raises an @ref{17fa,,IMAP4.error} if CRAM-MD5
authentication is not supported. Patch by Bénédikt Tran.

@item 
gh-134953@footnote{https://github.com/python/cpython/issues/134953}: Expand @code{_colorize} theme with @code{keyword_constant} and
implement in @ref{492,,repl}.
@end itemize

@node Core and Builtins<11>,,Library<13>,Python 3 14 0 release candidate 3
@anchor{whatsnew/changelog id46}@anchor{17fb}
@subsubsection Core and Builtins



@itemize -

@item 
gh-71810@footnote{https://github.com/python/cpython/issues/71810}: Raise @ref{a81,,OverflowError} for @code{(-1).to_bytes()} for signed
conversions when bytes count is zero.  Patch by Sergey B Kirpichev.

@item 
gh-138192@footnote{https://github.com/python/cpython/issues/138192}: Fix @ref{28,,contextvars} initialization so that all
subinterpreters are assigned the @ref{17fc,,MISSING} value.

@item 
gh-138479@footnote{https://github.com/python/cpython/issues/138479}: Fix a crash when a generic object’s @code{__typing_subst__}
returns an object that isn’t a @ref{610,,tuple}.

@item 
gh-138372@footnote{https://github.com/python/cpython/issues/138372}: Fix @ref{1ae,,SyntaxWarning} emitted for erroneous subscript
expressions involving @ref{17fd,,template string literals}. Patch
by Brian Schubert.

@item 
gh-138318@footnote{https://github.com/python/cpython/issues/138318}: The default REPL now avoids highlighting built-in names (for
instance @ref{184,,set} or @ref{199,,format()}) when they are used as attribute
names (for instance in @code{value.set} or @code{text.format}).

@item 
gh-138349@footnote{https://github.com/python/cpython/issues/138349}: Fix crash in certain cases where a module contains both a
module-level annotation and a comprehension.

@item 
gh-137384@footnote{https://github.com/python/cpython/issues/137384}: Fix a crash when using the @ref{118,,warnings} module in a
finalizer at shutdown. Patch by Kumar Aditya.

@item 
gh-137883@footnote{https://github.com/python/cpython/issues/137883}: Fix runaway recursion when calling a function with keyword
arguments.

@item 
gh-137079@footnote{https://github.com/python/cpython/issues/137079}: Fix keyword typo recognition when parsing files. Patch by Pablo
Galindo.

@item 
gh-137728@footnote{https://github.com/python/cpython/issues/137728}: Fix the JIT’s handling of many local variables. This previously
caused a segfault.

@item 
gh-137576@footnote{https://github.com/python/cpython/issues/137576}: Fix for incorrect source code being shown in tracebacks from
the Basic REPL when 
@geindex PYTHONSTARTUP
@geindex 환경 변수; PYTHONSTARTUP
@ref{1b8,,PYTHONSTARTUP} is given. Patch by Adam Hartz.
@end itemize

@node Python 3 14 0 release candidate 2,Python 3 14 0 release candidate 1,Python 3 14 0 release candidate 3,Changelog
@anchor{whatsnew/changelog python-3-14-0-release-candidate-2}@anchor{17fe}
@subsection Python 3.14.0 release candidate 2


`Release date: 2025-08-14'

@menu
* macOS: macOS<3>. 
* Windows: Windows<6>. 
* Library: Library<14>. 
* Documentation: Documentation<5>. 
* Core and Builtins: Core and Builtins<12>. 
* C API: C API<4>. 
* Build: Build<4>. 

@end menu

@node macOS<3>,Windows<6>,,Python 3 14 0 release candidate 2
@anchor{whatsnew/changelog id47}@anchor{17ff}
@subsubsection macOS



@itemize -

@item 
gh-137450@footnote{https://github.com/python/cpython/issues/137450}: macOS installer shell path management improvements: separate
the installer @code{Shell profile updater} postinstall script from the
@code{Update Shell Profile.command} to enable more robust error handling.

@item 
gh-137134@footnote{https://github.com/python/cpython/issues/137134}: Update macOS installer to ship with SQLite version 3.50.4.
@end itemize

@node Windows<6>,Library<14>,macOS<3>,Python 3 14 0 release candidate 2
@anchor{whatsnew/changelog id48}@anchor{1800}
@subsubsection Windows



@itemize -

@item 
gh-137134@footnote{https://github.com/python/cpython/issues/137134}: Update Windows installer to ship with SQLite 3.50.4.
@end itemize

@node Library<14>,Documentation<5>,Windows<6>,Python 3 14 0 release candidate 2
@anchor{whatsnew/changelog id49}@anchor{1801}
@subsubsection Library



@itemize -

@item 
gh-137426@footnote{https://github.com/python/cpython/issues/137426}: Remove the code deprecation of
@code{importlib.abc.ResourceLoader}. It is documented as deprecated, but left
for backwards compatibility with other classes in @code{importlib.abc}.

@item 
gh-137282@footnote{https://github.com/python/cpython/issues/137282}: Fix tab completion and @ref{843,,dir()} on
@ref{24,,concurrent.futures}.

@item 
gh-137257@footnote{https://github.com/python/cpython/issues/137257}: Bump the version of pip bundled in ensurepip to version 25.2

@item 
gh-137226@footnote{https://github.com/python/cpython/issues/137226}: Fix behavior of @ref{17b9,,annotationlib.ForwardRef.evaluate()} when
the `type_params' parameter is passed and the name of a type param is also
present in an enclosing scope.

@item 
gh-130522@footnote{https://github.com/python/cpython/issues/130522}: Fix unraisable @ref{198,,TypeError} raised during
@ref{47a,,interpreter shutdown} in the @ref{f3,,threading} module.

@item 
gh-137059@footnote{https://github.com/python/cpython/issues/137059}: Fix handling of file URLs with a Windows drive letter in the
URL authority by @ref{2bd,,urllib.request.url2pathname()}. This fixes a
regression in earlier pre-releases of Python 3.14.

@item 
gh-130577@footnote{https://github.com/python/cpython/issues/130577}: @ref{e4,,tarfile} now validates archives to ensure member offsets
are non-negative.  (Contributed by Alexander Enrique Urieles Nieto in
gh-130577@footnote{https://github.com/python/cpython/issues/130577}.)

@item 
gh-135228@footnote{https://github.com/python/cpython/issues/135228}: When @ref{33,,dataclasses} replaces a class with a slotted
dataclass, the original class can now be garbage collected again. Earlier
changes in Python 3.14 caused this class to always remain in existence
together with the replacement class synthesized by @code{dataclasses}.
@end itemize

@node Documentation<5>,Core and Builtins<12>,Library<14>,Python 3 14 0 release candidate 2
@anchor{whatsnew/changelog id50}@anchor{1802}
@subsubsection Documentation



@itemize -

@item 
gh-136155@footnote{https://github.com/python/cpython/issues/136155}: We are now checking for fatal errors in EPUB builds in CI.
@end itemize

@node Core and Builtins<12>,C API<4>,Documentation<5>,Python 3 14 0 release candidate 2
@anchor{whatsnew/changelog id51}@anchor{1803}
@subsubsection Core and Builtins



@itemize -

@item 
gh-137400@footnote{https://github.com/python/cpython/issues/137400}: Fix a crash in the @ref{1f4,,free threading} build when disabling
profiling or tracing across all threads with
@ref{780,,PyEval_SetProfileAllThreads()} or
@ref{662,,PyEval_SetTraceAllThreads()} or their Python equivalents
@ref{6ee,,threading.settrace_all_threads()} and
@ref{6ef,,threading.setprofile_all_threads()}.

@item 
gh-137314@footnote{https://github.com/python/cpython/issues/137314}: Fixed a regression where raw f-strings incorrectly interpreted
escape sequences in format specifications. Raw f-strings now properly
preserve literal backslashes in format specs, matching the behavior from
Python 3.11. For example, @code{rf"@{obj:\xFF@}"} now correctly produces
@code{'\\xFF'} instead of @code{'ÿ'}. Patch by Pablo Galindo.

@item 
gh-137308@footnote{https://github.com/python/cpython/issues/137308}: A standalone docstring in a node body is optimized as a
@ref{17e,,pass} statement to ensure that the node’s body is never empty.
There was a @ref{2ec,,ValueError} in @ref{4b2,,compile()} otherwise.

@item 
gh-137288@footnote{https://github.com/python/cpython/issues/137288}: Fix bug where some bytecode instructions of a boolean
expression are not associated with the correct exception handler.

@item 
gh-134291@footnote{https://github.com/python/cpython/issues/134291}: Remove some newer macOS API usage from the JIT compiler in
order to restore compatibility with older OSX 10.15 deployment targets.

@item 
gh-131338@footnote{https://github.com/python/cpython/issues/131338}: Disable computed stack limit checks on non-glibc linux
platforms to fix crashes on deep recursion.

@item 
gh-136870@footnote{https://github.com/python/cpython/issues/136870}: Fix data races while de-instrumenting bytecode of code objects
running concurrently in threads.
@end itemize

@node C API<4>,Build<4>,Core and Builtins<12>,Python 3 14 0 release candidate 2
@anchor{whatsnew/changelog id52}@anchor{1804}
@subsubsection C API



@itemize -

@item 
gh-137573@footnote{https://github.com/python/cpython/issues/137573}: Mark @code{_PyOptimizer_Optimize} as @ref{1805,,Py_NO_INLINE} to
prevent stack overflow crashes on macOS.
@end itemize

@node Build<4>,,C API<4>,Python 3 14 0 release candidate 2
@anchor{whatsnew/changelog id53}@anchor{1806}
@subsubsection Build



@itemize -

@item 
gh-132339@footnote{https://github.com/python/cpython/issues/132339}: Add support for OpenSSL 3.5.
@end itemize

@node Python 3 14 0 release candidate 1,Python 3 14 0 beta 4,Python 3 14 0 release candidate 2,Changelog
@anchor{whatsnew/changelog python-3-14-0-release-candidate-1}@anchor{1807}
@subsection Python 3.14.0 release candidate 1


`Release date: 2025-07-22'

@menu
* Tools/Demos: Tools/Demos<5>. 
* Security: Security<7>. 
* Library: Library<15>. 
* Core and Builtins: Core and Builtins<13>. 
* Library: Library<16>. 
* Core and Builtins: Core and Builtins<14>. 
* Library: Library<17>. 
* Core and Builtins: Core and Builtins<15>. 
* C API: C API<5>. 
* Build: Build<5>. 

@end menu

@node Tools/Demos<5>,Security<7>,,Python 3 14 0 release candidate 1
@anchor{whatsnew/changelog id54}@anchor{1808}
@subsubsection Tools/Demos



@itemize -

@item 
gh-136251@footnote{https://github.com/python/cpython/issues/136251}: Fixes and usability improvements for
@code{Tools/wasm/emscripten/web_example}
@end itemize

@node Security<7>,Library<15>,Tools/Demos<5>,Python 3 14 0 release candidate 1
@anchor{whatsnew/changelog id55}@anchor{1809}
@subsubsection Security



@itemize -

@item 
gh-135661@footnote{https://github.com/python/cpython/issues/135661}: Fix parsing attributes with whitespaces around the @code{=}
separator in @ref{a77,,html.parser.HTMLParser} according to the HTML5
standard.

@item 
gh-118350@footnote{https://github.com/python/cpython/issues/118350}: Fix support of escapable raw text mode (elements “textarea” and
“title”) in @ref{a77,,html.parser.HTMLParser}.
@end itemize

@node Library<15>,Core and Builtins<13>,Security<7>,Python 3 14 0 release candidate 1
@anchor{whatsnew/changelog id56}@anchor{180a}
@subsubsection Library



@itemize -

@item 
gh-136170@footnote{https://github.com/python/cpython/issues/136170}: Removed the unreleased @code{zipfile.ZipFile.data_offset} property
added in 3.14.0a7 as it wasn’t fully clear which behavior it should have
in some situations so the result was not always what a user might expect.

@item 
gh-124621@footnote{https://github.com/python/cpython/issues/124621}: pyrepl now works in Emscripten.

@item 
gh-136874@footnote{https://github.com/python/cpython/issues/136874}: Discard URL query and fragment in
@ref{2bd,,urllib.request.url2pathname()}.

@item 
gh-130645@footnote{https://github.com/python/cpython/issues/130645}: Enable color help by default in @ref{7,,argparse}.

@item 
gh-136549@footnote{https://github.com/python/cpython/issues/136549}: Fix signature of @ref{a4b,,threading.excepthook()}.

@item 
gh-136523@footnote{https://github.com/python/cpython/issues/136523}: Fix @ref{337,,wave.Wave_write} emitting an unraisable when open
raises.

@item 
gh-52876@footnote{https://github.com/python/cpython/issues/52876}: Add missing @code{keepends} (default @code{True}) parameter to
@code{codecs.StreamReaderWriter.readline()} and
@code{codecs.StreamReaderWriter.readlines()}.

@item 
gh-136470@footnote{https://github.com/python/cpython/issues/136470}: Correct @ref{1d2,,concurrent.futures.InterpreterPoolExecutor}’s
default thread name.

@item 
gh-136476@footnote{https://github.com/python/cpython/issues/136476}: Fix a bug that was causing the @code{get_async_stack_trace}
function to miss some frames in the stack trace.

@item 
gh-136434@footnote{https://github.com/python/cpython/issues/136434}: Fix docs generation of @code{UnboundItem} in
@ref{25,,concurrent.interpreters} when running with @ref{fb4,,-OO}.

@item 
gh-136380@footnote{https://github.com/python/cpython/issues/136380}: Raises @ref{5ee,,AttributeError} when accessing
@ref{1d2,,concurrent.futures.InterpreterPoolExecutor} and subinterpreters
are not available.

@item 
gh-134759@footnote{https://github.com/python/cpython/issues/134759}: Fix @ref{173b,,UnboundLocalError} in
@ref{13d2,,email.message.Message.get_payload()} when the payload to decode is a
@ref{192,,bytes} object. Patch by Kliment Lamonov.

@item 
gh-134657@footnote{https://github.com/python/cpython/issues/134657}: @ref{b,,asyncio}: Remove some private names from
@code{asyncio.__all__}.
@end itemize

@node Core and Builtins<13>,Library<16>,Library<15>,Python 3 14 0 release candidate 1
@anchor{whatsnew/changelog id57}@anchor{180b}
@subsubsection Core and Builtins



@itemize -

@item 
gh-136801@footnote{https://github.com/python/cpython/issues/136801}: Fix PyREPL syntax highlighting on match cases after multi-line
case. Contributed by Olga Matoula.
@end itemize

@node Library<16>,Core and Builtins<14>,Core and Builtins<13>,Python 3 14 0 release candidate 1
@anchor{whatsnew/changelog id58}@anchor{180c}
@subsubsection Library



@itemize -

@item 
gh-136421@footnote{https://github.com/python/cpython/issues/136421}: Fix crash when initializing @ref{34,,datetime} concurrently.
@end itemize

@node Core and Builtins<14>,Library<17>,Library<16>,Python 3 14 0 release candidate 1
@anchor{whatsnew/changelog id59}@anchor{180d}
@subsubsection Core and Builtins



@itemize -

@item 
gh-136541@footnote{https://github.com/python/cpython/issues/136541}: Fix some issues with the perf trampolines on x86-64 and
aarch64.  The trampolines were not being generated correctly for some
cases, which could lead to the perf integration not working correctly.
Patch by Pablo Galindo.

@item 
gh-136517@footnote{https://github.com/python/cpython/issues/136517}: Fixed a typo that prevented printing of uncollectable objects
when the @ref{13c7,,gc.DEBUG_UNCOLLECTABLE} mode was set.

@item 
gh-136525@footnote{https://github.com/python/cpython/issues/136525}: Fix issue where per-thread bytecode was not instrumented for
newly created threads.

@item 
gh-132661@footnote{https://github.com/python/cpython/issues/132661}: @code{Interpolation.expression} now has a default, the empty
string.

@item 
gh-132661@footnote{https://github.com/python/cpython/issues/132661}: Reflect recent 
@geindex Python 향상 제안; PEP 750
PEP 750@footnote{https://peps.python.org/pep-0750/} change.

Disallow concatenation of @code{string.templatelib.Template} and
@ref{169,,str}. Also, disallow implicit concatenation of t-string literals
with string or f-string literals.
@end itemize

@node Library<17>,Core and Builtins<15>,Core and Builtins<14>,Python 3 14 0 release candidate 1
@anchor{whatsnew/changelog id60}@anchor{180e}
@subsubsection Library



@itemize -

@item 
gh-116738@footnote{https://github.com/python/cpython/issues/116738}: Make functions in @ref{6a,,grp} thread-safe on the @ref{1f4,,free threaded} build.
@end itemize

@node Core and Builtins<15>,C API<5>,Library<17>,Python 3 14 0 release candidate 1
@anchor{whatsnew/changelog id61}@anchor{180f}
@subsubsection Core and Builtins



@itemize -

@item 
gh-135148@footnote{https://github.com/python/cpython/issues/135148}: Fixed a bug where f-string debug expressions (using =) would
incorrectly strip out parts of strings containing escaped quotes and #
characters. Patch by Pablo Galindo.

@item 
gh-133136@footnote{https://github.com/python/cpython/issues/133136}: Limit excess memory usage in the @ref{1f4,,free threading} build
when a large dictionary or list is resized and accessed by multiple
threads.

@item 
gh-91153@footnote{https://github.com/python/cpython/issues/91153}: Fix a crash when a @ref{344,,bytearray} is concurrently mutated
during item assignment.

@item 
gh-127971@footnote{https://github.com/python/cpython/issues/127971}: Fix off-by-one read beyond the end of a string in string
search.
@end itemize

@node C API<5>,Build<5>,Core and Builtins<15>,Python 3 14 0 release candidate 1
@anchor{whatsnew/changelog id62}@anchor{1810}
@subsubsection C API



@itemize -

@item 
gh-112068@footnote{https://github.com/python/cpython/issues/112068}: Revert support of nullable arguments in @ref{1811,,PyArg_Parse()}.

@item 
gh-133296@footnote{https://github.com/python/cpython/issues/133296}: New variants for the critical section API that accept one or
two @ref{485,,PyMutex} pointers rather than @ref{5dc,,PyObject} instances
are now public in the non-limited C API.

@item 
gh-134009@footnote{https://github.com/python/cpython/issues/134009}: Expose @ref{463,,PyMutex_IsLocked()} as part of the public C API.
@end itemize

@node Build<5>,,C API<5>,Python 3 14 0 release candidate 1
@anchor{whatsnew/changelog id63}@anchor{1812}
@subsubsection Build



@itemize -

@item 
gh-135621@footnote{https://github.com/python/cpython/issues/135621}: PyREPL no longer depends on the @ref{2f,,curses} standard library.
Contributed by Łukasz Langa.
@end itemize

@node Python 3 14 0 beta 4,Python 3 14 0 beta 3,Python 3 14 0 release candidate 1,Changelog
@anchor{whatsnew/changelog python-3-14-0-beta-4}@anchor{1813}
@subsection Python 3.14.0 beta 4


`Release date: 2025-07-08'

@menu
* Tools/Demos: Tools/Demos<6>. 
* Tests: Tests<4>. 
* Security: Security<8>. 
* Library: Library<18>. 
* Documentation: Documentation<6>. 
* Core and Builtins: Core and Builtins<16>. 
* C API: C API<6>. 
* Build: Build<6>. 

@end menu

@node Tools/Demos<6>,Tests<4>,,Python 3 14 0 beta 4
@anchor{whatsnew/changelog id64}@anchor{1814}
@subsubsection Tools/Demos



@itemize -

@item 
gh-135968@footnote{https://github.com/python/cpython/issues/135968}: Stubs for @code{strip} are now provided as part of an iOS install.

@item 
gh-133600@footnote{https://github.com/python/cpython/issues/133600}: Backport file reorganization for Tools/wasm/wasi.

This should make backporting future code changes easier. It also
simplifies instructions around how to do WASI builds in the devguide.
@end itemize

@node Tests<4>,Security<8>,Tools/Demos<6>,Python 3 14 0 beta 4
@anchor{whatsnew/changelog id65}@anchor{1815}
@subsubsection Tests



@itemize -

@item 
gh-135966@footnote{https://github.com/python/cpython/issues/135966}: The iOS testbed now handles the @code{app_packages} folder as a
site directory.

@item 
gh-135494@footnote{https://github.com/python/cpython/issues/135494}: Fix regrtest to support excluding tests from @code{--pgo} tests.
Patch by Victor Stinner.
@end itemize

@node Security<8>,Library<18>,Tests<4>,Python 3 14 0 beta 4
@anchor{whatsnew/changelog id66}@anchor{1816}
@subsubsection Security



@itemize -

@item 
gh-136053@footnote{https://github.com/python/cpython/issues/136053}: @ref{91,,marshal}: fix a possible crash when deserializing
@ref{693,,slice} objects.

@item 
gh-135661@footnote{https://github.com/python/cpython/issues/135661}: Fix parsing start and end tags in
@ref{a77,,html.parser.HTMLParser} according to the HTML5 standard.


@itemize *

@item 
Whitespaces no longer accepted between @code{</} and the tag name.
E.g. @code{</ script>} does not end the script section.

@item 
Vertical tabulation (@code{\v}) and non-ASCII whitespaces no longer recognized
as whitespaces. The only whitespaces are @code{\t\n\r\f} and space.

@item 
Null character (U+0000) no longer ends the tag name.

@item 
Attributes and slashes after the tag name in end tags are now ignored,
instead of terminating after the first @code{>} in quoted attribute value.
E.g. @code{</script/foo=">"/>}.

@item 
Multiple slashes and whitespaces between the last attribute and closing @code{>}
are now ignored in both start and end tags. E.g. @code{<a foo=bar/ //>}.

@item 
Multiple @code{=} between attribute name and value are no longer collapsed.
E.g. @code{<a foo==bar>} produces attribute “foo” with value “=bar”.

@item 
[Reverted in gh-136927@footnote{https://github.com/python/cpython/issues/136927}] Whitespaces between the @code{=} separator and attribute name or value are no
longer ignored. E.g. @code{<a foo =bar>} produces two attributes “foo” and
“=bar”, both with value None; @code{<a foo= bar>} produces two attributes:
“foo” with value “” and “bar” with value None.
@end itemize

@item 
gh-102555@footnote{https://github.com/python/cpython/issues/102555}: Fix comment parsing in @ref{a77,,html.parser.HTMLParser}
according to the HTML5 standard. @code{--!>} now ends the comment. @code{-- >}
no longer ends the comment. Support abnormally ended empty comments
@code{<-->} and @code{<--->}.
@end itemize

@node Library<18>,Documentation<6>,Security<8>,Python 3 14 0 beta 4
@anchor{whatsnew/changelog id67}@anchor{1817}
@subsubsection Library



@itemize -

@item 
gh-136286@footnote{https://github.com/python/cpython/issues/136286}: Fix pickling failures for protocols 0 and 1 for many objects
realted to subinterpreters.

@item 
gh-136316@footnote{https://github.com/python/cpython/issues/136316}: Improve support for evaluating nested forward references in
@ref{1818,,typing.evaluate_forward_ref()}.

@item 
gh-85702@footnote{https://github.com/python/cpython/issues/85702}: If @code{zoneinfo._common.load_tzdata} is given a package without a
resource a @ref{1819,,zoneinfo.ZoneInfoNotFoundError} is raised rather than a
@ref{f3d,,PermissionError}. Patch by Victor Stinner.

@item 
gh-136028@footnote{https://github.com/python/cpython/issues/136028}: Fix parsing month names containing “İ” (U+0130, LATIN CAPITAL
LETTER I WITH DOT ABOVE) in @ref{1632,,time.strptime()}. This affects locales
az_AZ, ber_DZ, ber_MA and crh_UA.

@item 
gh-135995@footnote{https://github.com/python/cpython/issues/135995}: In the palmos encoding, make byte @code{0x9b} decode to @code{›}
(U+203A - SINGLE RIGHT-POINTING ANGLE QUOTATION MARK).

@item 
gh-53203@footnote{https://github.com/python/cpython/issues/53203}: Fix @ref{1632,,time.strptime()} for @code{%c} and @code{%x} formats on
locales byn_ER, wal_ET and lzh_TW, and for @code{%X} format on locales ar_SA,
bg_BG and lzh_TW.

@item 
gh-91555@footnote{https://github.com/python/cpython/issues/91555}: An earlier change, which was introduced in 3.14.0b2, has been
reverted. It disabled logging for a logger during handling of log messages
for that logger. Since the reversion, the behaviour should be as it was
before 3.14.0b2.

@item 
gh-135878@footnote{https://github.com/python/cpython/issues/135878}: Fixes a crash of @ref{4e5,,types.SimpleNamespace} on @ref{1f4,,free threading} builds, when several threads were calling its
@ref{82e,,__repr__()} method at the same time.

@item 
gh-135836@footnote{https://github.com/python/cpython/issues/135836}: Fix @ref{173a,,IndexError} in @ref{817,,asyncio.loop.create_connection()}
that could occur when non-@ref{2c0,,OSError} exception is raised during
connection and socket’s @code{close()} raises @code{OSError}.

@item 
gh-135836@footnote{https://github.com/python/cpython/issues/135836}: Fix @ref{173a,,IndexError} in @ref{817,,asyncio.loop.create_connection()}
that could occur when the Happy Eyeballs algorithm resulted in an empty
exceptions list during connection attempts.

@item 
gh-135855@footnote{https://github.com/python/cpython/issues/135855}: Raise @ref{198,,TypeError} instead of @ref{794,,SystemError} when
@code{_interpreters.set___main___attrs()} is passed a non-dict object.
Patch by Brian Schubert.

@item 
gh-135815@footnote{https://github.com/python/cpython/issues/135815}: @ref{9f,,netrc}: skip security checks if @ref{181a,,os.getuid()} is
missing. Patch by Bénédikt Tran.

@item 
gh-135640@footnote{https://github.com/python/cpython/issues/135640}: Address bug where it was possible to call
@ref{c8b,,xml.etree.ElementTree.ElementTree.write()} on an ElementTree object
with an invalid root element. This behavior blanked the file passed to
@code{write} if it already existed.

@item 
gh-135645@footnote{https://github.com/python/cpython/issues/135645}: Added @code{supports_isolated_interpreters} field to
@ref{73a,,sys.implementation}.

@item 
gh-135646@footnote{https://github.com/python/cpython/issues/135646}: Raise consistent @ref{452,,NameError} exceptions in
@ref{17b9,,annotationlib.ForwardRef.evaluate()}

@item 
gh-135557@footnote{https://github.com/python/cpython/issues/135557}: Fix races on @ref{6d,,heapq} updates and @ref{24d,,list} reads on
the @ref{1f4,,free threaded} build.

@item 
gh-119180@footnote{https://github.com/python/cpython/issues/119180}: Only fetch globals and locals if necessary in
@ref{459,,annotationlib.get_annotations()}

@item 
gh-135561@footnote{https://github.com/python/cpython/issues/135561}: Fix a crash on DEBUG builds when an HACL* HMAC routine fails.
Patch by Bénédikt Tran.

@item 
gh-135487@footnote{https://github.com/python/cpython/issues/135487}: Fix @code{reprlib.Repr.repr_int()} when given integers with
more than @ref{181b,,sys.get_int_max_str_digits()} digits. Patch by Bénédikt
Tran.

@item 
gh-135335@footnote{https://github.com/python/cpython/issues/135335}: @ref{98,,multiprocessing}: Flush @code{stdout} and @code{stderr} after
preloading modules in the @code{forkserver}.

@item 
gh-135069@footnote{https://github.com/python/cpython/issues/135069}: Fix the “Invalid error handling” exception in
@code{encodings.idna.IncrementalDecoder} to correctly replace the
‘errors’ parameter.

@item 
gh-130662@footnote{https://github.com/python/cpython/issues/130662}: +Accept leading zeros in precision and width fields for
+:class:@ref{1fe,,Decimal} formatting, for example @code{format(Decimal(1.25),
'.016f')}.

@item 
gh-130662@footnote{https://github.com/python/cpython/issues/130662}: Accept leading zeros in precision and width fields for
@ref{213,,Fraction} formatting, for example @code{format(Fraction(1,
3), '.016f')}.

@item 
gh-87790@footnote{https://github.com/python/cpython/issues/87790}: Support underscore and comma as thousands separators in the
fractional part for @ref{213,,Fraction}’s formatting.  Patch by
Sergey B Kirpichev.

@item 
gh-87790@footnote{https://github.com/python/cpython/issues/87790}: Support underscore and comma as thousands separators in the
fractional part for @ref{1fe,,Decimal}’s formatting.  Patch by
Sergey B Kirpichev.

@item 
gh-130664@footnote{https://github.com/python/cpython/issues/130664}: Handle corner-case for @ref{213,,Fraction}’s
formatting: treat zero-padding (preceding the width field by a zero
(@code{'0'}) character) as an equivalent to a fill character of @code{'0'} with
an alignment type of @code{'='}, just as in case of @ref{196,,float}’s.
@end itemize

@node Documentation<6>,Core and Builtins<16>,Library<18>,Python 3 14 0 beta 4
@anchor{whatsnew/changelog id68}@anchor{181c}
@subsubsection Documentation



@itemize -

@item 
gh-136155@footnote{https://github.com/python/cpython/issues/136155}: EPUB builds are fixed by excluding non-XHTML-compatible tags.
@end itemize

@node Core and Builtins<16>,C API<6>,Documentation<6>,Python 3 14 0 beta 4
@anchor{whatsnew/changelog id69}@anchor{181d}
@subsubsection Core and Builtins



@itemize -

@item 
gh-109700@footnote{https://github.com/python/cpython/issues/109700}: Fix memory error handling in @ref{5e1,,PyDict_SetDefault()}.

@item 
gh-78465@footnote{https://github.com/python/cpython/issues/78465}: Fix error message for @code{cls.__new__(cls, ...)} where @code{cls} is
not instantiable builtin or extension type (with @code{tp_new} set to
@code{NULL}).

@item 
gh-129958@footnote{https://github.com/python/cpython/issues/129958}: Differentiate between t-strings and f-strings in syntax error
for newlines in format specifiers of single-quoted interpolated strings.

@item 
gh-135871@footnote{https://github.com/python/cpython/issues/135871}: Non-blocking mutex lock attempts now return immediately when
the lock is busy instead of briefly spinning in the @ref{1f4,,free threading}
build.

@item 
gh-135106@footnote{https://github.com/python/cpython/issues/135106}: Restrict the trashcan mechanism to GC’ed objects and untrack
them while in the trashcan to prevent the GC and trashcan mechanisms
conflicting.

@item 
gh-135607@footnote{https://github.com/python/cpython/issues/135607}: Fix potential @ref{11a,,weakref} races in an object’s destructor on
the @ref{1f4,,free threaded} build.

@item 
gh-135608@footnote{https://github.com/python/cpython/issues/135608}: Fix a crash in the JIT involving attributes of modules.

@item 
gh-135543@footnote{https://github.com/python/cpython/issues/135543}: Emit @code{sys.remote_exec} audit event when
@ref{16d,,sys.remote_exec()} is called and migrate @code{remote_debugger_script}
to @code{cpython.remote_debugger_script}.

@item 
gh-134280@footnote{https://github.com/python/cpython/issues/134280}: Disable constant folding for @code{~} with a boolean argument.
This moves the deprecation warning from compile time to runtime.
@end itemize

@node C API<6>,Build<6>,Core and Builtins<16>,Python 3 14 0 beta 4
@anchor{whatsnew/changelog id70}@anchor{181e}
@subsubsection C API



@itemize -

@item 
gh-135906@footnote{https://github.com/python/cpython/issues/135906}: Fix compilation errors when compiling the internal headers with
a C++ compiler.
@end itemize

@node Build<6>,,C API<6>,Python 3 14 0 beta 4
@anchor{whatsnew/changelog id71}@anchor{181f}
@subsubsection Build



@itemize -

@item 
gh-134273@footnote{https://github.com/python/cpython/issues/134273}: Add support for configuring compiler flags for the JIT with
@code{CFLAGS_JIT}
@end itemize

@node Python 3 14 0 beta 3,Python 3 14 0 beta 2,Python 3 14 0 beta 4,Changelog
@anchor{whatsnew/changelog python-3-14-0-beta-3}@anchor{1820}
@subsection Python 3.14.0 beta 3


`Release date: 2025-06-17'

@menu
* Windows: Windows<7>. 
* Tests: Tests<5>. 
* Security: Security<9>. 
* Library: Library<19>. 
* Documentation: Documentation<7>. 
* Core and Builtins: Core and Builtins<17>. 
* Library: Library<20>. 
* Core and Builtins: Core and Builtins<18>. 
* Library: Library<21>. 
* Core and Builtins: Core and Builtins<19>. 
* Library: Library<22>. 
* Core and Builtins: Core and Builtins<20>. 
* C API: C API<7>. 
* Build: Build<7>. 

@end menu

@node Windows<7>,Tests<5>,,Python 3 14 0 beta 3
@anchor{whatsnew/changelog id72}@anchor{1821}
@subsubsection Windows



@itemize -

@item 
gh-135099@footnote{https://github.com/python/cpython/issues/135099}: Fix a crash that could occur on Windows when a background
thread waits on a @ref{485,,PyMutex} while the main thread is shutting down
the interpreter.
@end itemize

@node Tests<5>,Security<9>,Windows<7>,Python 3 14 0 beta 3
@anchor{whatsnew/changelog id73}@anchor{1822}
@subsubsection Tests



@itemize -

@item 
gh-132815@footnote{https://github.com/python/cpython/issues/132815}: Fix test__opcode: add @code{JUMP_BACKWARD} to specialization
stats.

@item 
gh-135489@footnote{https://github.com/python/cpython/issues/135489}: Show verbose output for failing tests during PGO profiling step
with –enable-optimizations.

@item 
gh-135120@footnote{https://github.com/python/cpython/issues/135120}: Add @code{test.support.subTests()}.
@end itemize

@node Security<9>,Library<19>,Tests<5>,Python 3 14 0 beta 3
@anchor{whatsnew/changelog id74}@anchor{1823}
@subsubsection Security



@itemize -

@item 
gh-135462@footnote{https://github.com/python/cpython/issues/135462}: Fix quadratic complexity in processing specially crafted input
in @ref{a77,,html.parser.HTMLParser}. End-of-file errors are now handled
according to the HTML5 specs – comments and declarations are
automatically closed, tags are ignored.

@item 
gh-135034@footnote{https://github.com/python/cpython/issues/135034}: Fixes multiple issues that allowed @code{tarfile} extraction
filters (@code{filter="data"} and @code{filter="tar"}) to be bypassed using
crafted symlinks and hard links.

Addresses 
@geindex Common Vulnerabilities and Exposures; CVE 2024-12718
CVE 2024-12718@footnote{https://www.cve.org/CVERecord?id=CVE-2024-12718}, 
@geindex Common Vulnerabilities and Exposures; CVE 2025-4138
CVE 2025-4138@footnote{https://www.cve.org/CVERecord?id=CVE-2025-4138}, 
@geindex Common Vulnerabilities and Exposures; CVE 2025-4330
CVE 2025-4330@footnote{https://www.cve.org/CVERecord?id=CVE-2025-4330}, and
@geindex Common Vulnerabilities and Exposures; CVE 2025-4517
CVE 2025-4517@footnote{https://www.cve.org/CVERecord?id=CVE-2025-4517}.
@end itemize

@node Library<19>,Documentation<7>,Security<9>,Python 3 14 0 beta 3
@anchor{whatsnew/changelog id75}@anchor{1824}
@subsubsection Library



@itemize -

@item 
gh-65697@footnote{https://github.com/python/cpython/issues/65697}: @ref{26,,configparser}’s error message when attempting to write
an invalid key is now more helpful.

@item 
gh-135497@footnote{https://github.com/python/cpython/issues/135497}: Fix @ref{1825,,os.getlogin()} failing for longer usernames on
BSD-based platforms.

@item 
gh-135429@footnote{https://github.com/python/cpython/issues/135429}: Fix the argument mismatch in @code{_lsprof} for @code{PY_THROW}
event.

@item 
gh-135368@footnote{https://github.com/python/cpython/issues/135368}: Fix @ref{c3d,,unittest.mock.Mock} generation on
@ref{4e1,,dataclasses.dataclass()} objects. Now all special attributes are set
as it was before gh-124429@footnote{https://github.com/python/cpython/issues/124429}.

@item 
gh-133967@footnote{https://github.com/python/cpython/issues/133967}: Do not normalize @ref{8a,,locale} name ‘C.UTF-8’ to ‘en_US.UTF-8’.

@item 
gh-135321@footnote{https://github.com/python/cpython/issues/135321}: Raise a correct exception for values greater than 0x7fffffff
for the @code{BINSTRING} opcode in the C implementation of @ref{ab,,pickle}.

@item 
gh-135276@footnote{https://github.com/python/cpython/issues/135276}: Backported bugfixes in zipfile.Path from zipp 3.23. Fixed
@code{.name}, @code{.stem} and other basename-based properties on Windows when
working with a zipfile on disk.

@item 
gh-135244@footnote{https://github.com/python/cpython/issues/135244}: @ref{116,,uuid}: when the MAC address cannot be determined, the
48-bit node ID is now generated with a cryptographically-secure
pseudo-random number generator (CSPRNG) as per 
@geindex RFC; RFC 9562 Section 6.10-3
RFC 9562@comma{} §6.10.3@footnote{https://datatracker.ietf.org/doc/html/rfc9562.html#section-6.10-3}. This affects @ref{da0,,uuid1()} and
@ref{2c2,,uuid6()}.

@item 
gh-134970@footnote{https://github.com/python/cpython/issues/134970}: Fix the “unknown action” exception in
@ref{2eb,,argparse.ArgumentParser.add_argument_group()} to correctly replace
the action class.

@item 
gh-134718@footnote{https://github.com/python/cpython/issues/134718}: @ref{ae1,,ast.dump()} now only omits @code{None} and @code{[]} values if
they are default values.

@item 
gh-134939@footnote{https://github.com/python/cpython/issues/134939}: Add the @ref{25,,concurrent.interpreters} module.  See 
@geindex Python 향상 제안; PEP 734
PEP 734@footnote{https://peps.python.org/pep-0734/}.

@item 
gh-134885@footnote{https://github.com/python/cpython/issues/134885}: Fix possible crash in the @ref{23,,compression.zstd} module
related to setting parameter types. Patch by Jelle Zijlstra.

@item 
gh-134857@footnote{https://github.com/python/cpython/issues/134857}: Improve error report for @ref{3e,,doctest}s run with
@ref{10c,,unittest}. Remove @code{doctest} module frames from tracebacks and
redundant newline character from a failure message.

@item 
gh-128840@footnote{https://github.com/python/cpython/issues/128840}: Fix parsing long IPv6 addresses with embedded IPv4 address.

@item 
gh-134637@footnote{https://github.com/python/cpython/issues/134637}: Fix performance regression in calling a @ref{2e,,ctypes} function
pointer in @ref{1f4,,free threading}.

@item 
gh-134696@footnote{https://github.com/python/cpython/issues/134696}: Built-in HACL* and OpenSSL implementations of hash function
constructors now correctly accept the same `documented' named arguments.
For instance, @ref{1826,,md5()} could be previously invoked as
@code{md5(data=data)} or @code{md5(string=string)} depending on the underlying
implementation but these calls were not compatible. Patch by Bénédikt
Tran.

@item 
gh-134151@footnote{https://github.com/python/cpython/issues/134151}: @ref{3f,,email}: Fix @ref{198,,TypeError} in
@ref{1827,,email.utils.decode_params()} when sorting 
@geindex RFC; RFC 2231
RFC 2231@footnote{https://datatracker.ietf.org/doc/html/rfc2231.html} continuations
that contain an unnumbered section.

@item 
gh-134210@footnote{https://github.com/python/cpython/issues/134210}: @ref{1828,,curses.window.getch()} now correctly handles signals.
Patch by Bénédikt Tran.

@item 
gh-134152@footnote{https://github.com/python/cpython/issues/134152}: @ref{3f,,email}: Fix parsing of email message ID with invalid
domain.

@item 
gh-133489@footnote{https://github.com/python/cpython/issues/133489}: @ref{120c,,random.getrandbits()} can now generate more that 2@w{^31} bits. @ref{1829,,random.randbytes()} can now generate more that 256
MiB.

@item 
gh-132813@footnote{https://github.com/python/cpython/issues/132813}: Improve error messages for incorrect types and values of
@ref{182a,,csv.Dialect} attributes.

@item 
gh-132969@footnote{https://github.com/python/cpython/issues/132969}: Prevent the @ref{1d6,,ProcessPoolExecutor}
executor thread, which remains running when @ref{aea,,shutdown(wait=False)}, from attempting to adjust the
pool’s worker processes after the object state has already been reset
during shutdown. A combination of conditions, including a worker process
having terminated abormally, resulted in an exception and a potential hang
when the still-running executor thread attempted to replace dead workers
within the pool.

@item 
gh-127081@footnote{https://github.com/python/cpython/issues/127081}: Fix libc thread safety issues with @ref{a5,,os} by replacing
@code{getlogin} with @code{getlogin_r} re-entrant version.

@item 
gh-131884@footnote{https://github.com/python/cpython/issues/131884}: Fix formatting issues in @ref{f3f,,json.dump()} when both `indent'
and `skipkeys' are used.

@item 
gh-130999@footnote{https://github.com/python/cpython/issues/130999}: Avoid exiting the new REPL and offer suggestions even if there
are non-string candidates when errors occur.
@end itemize

@node Documentation<7>,Core and Builtins<17>,Library<19>,Python 3 14 0 beta 3
@anchor{whatsnew/changelog id76}@anchor{182b}
@subsubsection Documentation



@itemize -

@item 
gh-135171@footnote{https://github.com/python/cpython/issues/135171}: Document that the @ref{4ca,,iterator} for the leftmost
@code{for} clause in the generator expression is created immediately.

@item 
bpo-45210@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45210}: Document that error indicator may be set in tp_dealloc, and how
to avoid clobbering it.
@end itemize

@node Core and Builtins<17>,Library<20>,Documentation<7>,Python 3 14 0 beta 3
@anchor{whatsnew/changelog id77}@anchor{182c}
@subsubsection Core and Builtins



@itemize -

@item 
gh-135496@footnote{https://github.com/python/cpython/issues/135496}: Fix typo in the f-string conversion type error (“exclamanation”
-> “exclamation”).

@item 
gh-135371@footnote{https://github.com/python/cpython/issues/135371}: Fixed @ref{b,,asyncio} debugging tools to properly display
internal coroutine call stacks alongside external task dependencies. The
@code{python -m asyncio ps} and @code{python -m asyncio pstree} commands now
show complete execution context. Patch by Pablo Galindo.
@end itemize

@node Library<20>,Core and Builtins<18>,Core and Builtins<17>,Python 3 14 0 beta 3
@anchor{whatsnew/changelog id78}@anchor{182d}
@subsubsection Library



@itemize -

@item 
gh-127319@footnote{https://github.com/python/cpython/issues/127319}: Set the @code{allow_reuse_port} class variable to @code{False} on the
XMLRPC, logging, and HTTP servers. This matches the behavior in prior
Python releases, which is to not allow port reuse.
@end itemize

@node Core and Builtins<18>,Library<21>,Library<20>,Python 3 14 0 beta 3
@anchor{whatsnew/changelog id79}@anchor{182e}
@subsubsection Core and Builtins



@itemize -

@item 
gh-135171@footnote{https://github.com/python/cpython/issues/135171}: Reverts the behavior of async generator expressions when
created with object w/o __aiter__ method to the pre-3.13 behavior of
raising a TypeError.

@item 
gh-130077@footnote{https://github.com/python/cpython/issues/130077}: Properly raise custom syntax errors when incorrect syntax
containing names that are prefixes of soft keywords is encountered.  Patch
by Pablo Galindo.

@item 
gh-135171@footnote{https://github.com/python/cpython/issues/135171}: Reverts the behavior of generator expressions when created with
a non-iterable to the pre-3.13 behavior of raising a TypeError. It is no
longer possible to cause a crash in the debugger by altering the generator
expression’s local variables. This is achieved by moving the @code{GET_ITER}
instruction back to the creation of the generator expression and adding an
additional check to @code{FOR_ITER}.
@end itemize

@node Library<21>,Core and Builtins<19>,Core and Builtins<18>,Python 3 14 0 beta 3
@anchor{whatsnew/changelog id80}@anchor{182f}
@subsubsection Library



@itemize -

@item 
gh-116738@footnote{https://github.com/python/cpython/issues/116738}: Make methods in @ref{6d,,heapq} thread-safe on the @ref{1f4,,free threaded} build.
@end itemize

@node Core and Builtins<19>,Library<22>,Library<21>,Python 3 14 0 beta 3
@anchor{whatsnew/changelog id81}@anchor{1830}
@subsubsection Core and Builtins



@itemize -

@item 
gh-134876@footnote{https://github.com/python/cpython/issues/134876}: Add support to 
@geindex Python 향상 제안; PEP 768
PEP 768@footnote{https://peps.python.org/pep-0768/} remote debugging for Linux kernels
which don’t have CONFIG_CROSS_MEMORY_ATTACH configured.

@item 
gh-134889@footnote{https://github.com/python/cpython/issues/134889}: Fix handling of a few opcodes that leave operands on the stack
when optimizing @code{LOAD_FAST}.
@end itemize

@node Library<22>,Core and Builtins<20>,Core and Builtins<19>,Python 3 14 0 beta 3
@anchor{whatsnew/changelog id82}@anchor{1831}
@subsubsection Library



@itemize -

@item 
gh-134908@footnote{https://github.com/python/cpython/issues/134908}: Fix crash when iterating over lines in a text file on the
@ref{1f4,,free threaded} build.
@end itemize

@node Core and Builtins<20>,C API<7>,Library<22>,Python 3 14 0 beta 3
@anchor{whatsnew/changelog id83}@anchor{1832}
@subsubsection Core and Builtins



@itemize -

@item 
gh-132617@footnote{https://github.com/python/cpython/issues/132617}: Fix @ref{166a,,dict.update()} modification check that could
incorrectly raise a “dict mutated during update” error when a different
dictionary was modified that happens to share the same underlying keys
object.

@item 
gh-134679@footnote{https://github.com/python/cpython/issues/134679}: Fix crash in the @ref{1f4,,free threading} build’s QSBR code that
could occur when changing an object’s @code{__dict__} attribute.

@item 
gh-127682@footnote{https://github.com/python/cpython/issues/127682}: No longer call @code{__iter__} twice in list comprehensions. This
brings the behavior of list comprehensions in line with other forms of
iteration

@item 
gh-133912@footnote{https://github.com/python/cpython/issues/133912}: Fix the C API function @code{PyObject_GenericSetDict} to handle
extension classes with inline values.
@end itemize

@node C API<7>,Build<7>,Core and Builtins<20>,Python 3 14 0 beta 3
@anchor{whatsnew/changelog id84}@anchor{1833}
@subsubsection C API



@itemize -

@item 
gh-134989@footnote{https://github.com/python/cpython/issues/134989}: Fix @code{Py_RETURN_NONE}, @code{Py_RETURN_TRUE} and
@code{Py_RETURN_FALSE} macros in the limited C API 3.11 and older: don’t
treat @code{Py_None}, @code{Py_True} and @code{Py_False} as immortal. Patch by
Victor Stinner.

@item 
gh-134989@footnote{https://github.com/python/cpython/issues/134989}: Implement @ref{1834,,PyObject_DelAttr()} and
@ref{1835,,PyObject_DelAttrString()} as macros in the limited C API 3.12 and
older. Patch by Victor Stinner.

@item 
gh-133968@footnote{https://github.com/python/cpython/issues/133968}: Add @ref{3b9,,PyUnicodeWriter_WriteASCII()} function to write an
ASCII string into a @ref{3b3,,PyUnicodeWriter}. The function is faster than
@ref{3bf,,PyUnicodeWriter_WriteUTF8()}, but has an undefined behavior if the
input string contains non-ASCII characters. Patch by Victor Stinner.
@end itemize

@node Build<7>,,C API<7>,Python 3 14 0 beta 3
@anchor{whatsnew/changelog id85}@anchor{1836}
@subsubsection Build



@itemize -

@item 
gh-119132@footnote{https://github.com/python/cpython/issues/119132}: Remove “experimental” tag from the CPython free-threading
build.

@item 
gh-135497@footnote{https://github.com/python/cpython/issues/135497}: Fix the detection of @code{MAXLOGNAME} in the @code{configure.ac}
script.

@item 
gh-134923@footnote{https://github.com/python/cpython/issues/134923}: Windows builds with profile-guided optimization enabled now use
@code{/GENPROFILE} and @code{/USEPROFILE} instead of deprecated @code{/LTCG:}
options.

@item 
gh-134774@footnote{https://github.com/python/cpython/issues/134774}: Fix @ref{1837,,Py_DEBUG} macro redefinition warnings on Windows
debug builds. Patch by Chris Eibl.

@item 
gh-134632@footnote{https://github.com/python/cpython/issues/134632}: Fixed @code{build-details.json} generation to use @code{INCLUDEPY},
in order to reference the @code{pythonX.Y} subdirectory of the include
directory, as required in 
@geindex Python 향상 제안; PEP 739
PEP 739@footnote{https://peps.python.org/pep-0739/}, instead of the top-level include
directory.
@end itemize

@node Python 3 14 0 beta 2,Python 3 14 0 beta 1,Python 3 14 0 beta 3,Changelog
@anchor{whatsnew/changelog python-3-14-0-beta-2}@anchor{1838}
@subsection Python 3.14.0 beta 2


`Release date: 2025-05-26'

@menu
* Windows: Windows<8>. 
* Tools/Demos: Tools/Demos<7>. 
* Tests: Tests<6>. 
* Security: Security<10>. 
* Library: Library<23>. 
* Core and Builtins: Core and Builtins<21>. 
* C API: C API<8>. 
* Build: Build<8>. 

@end menu

@node Windows<8>,Tools/Demos<7>,,Python 3 14 0 beta 2
@anchor{whatsnew/changelog id86}@anchor{1839}
@subsubsection Windows



@itemize -

@item 
gh-130727@footnote{https://github.com/python/cpython/issues/130727}: Fix a race in internal calls into WMI that can result in an
“invalid handle” exception under high load. Patch by Chris Eibl.

@item 
gh-76023@footnote{https://github.com/python/cpython/issues/76023}: Make @ref{262,,os.path.realpath()} ignore Windows error 1005 when in
non-strict mode.

@item 
gh-133779@footnote{https://github.com/python/cpython/issues/133779}: Reverts the change to generate different @code{pyconfig.h}
files based on compiler settings, as it was frequently causing extension
builds to break. In particular, the @code{Py_GIL_DISABLED} preprocessor
variable must now always be defined explicitly when compiling for the
experimental free-threaded runtime. The @ref{174,,sysconfig.get_config_var()}
function can be used to determine whether the current runtime was compiled
with that flag or not.

@item 
gh-133626@footnote{https://github.com/python/cpython/issues/133626}: Ensures packages are not accidentally bundled into the
traditional installer.
@end itemize

@node Tools/Demos<7>,Tests<6>,Windows<8>,Python 3 14 0 beta 2
@anchor{whatsnew/changelog id87}@anchor{183a}
@subsubsection Tools/Demos



@itemize -

@item 
gh-134215@footnote{https://github.com/python/cpython/issues/134215}: @ref{492,,REPL} import autocomplete only suggests private modules
when explicitly specified.
@end itemize

@node Tests<6>,Security<10>,Tools/Demos<7>,Python 3 14 0 beta 2
@anchor{whatsnew/changelog id88}@anchor{183b}
@subsubsection Tests



@itemize -

@item 
gh-133744@footnote{https://github.com/python/cpython/issues/133744}: Fix multiprocessing interrupt test. Add an event to synchronize
the parent process with the child process: wait until the child process
starts sleeping. Patch by Victor Stinner.

@item 
gh-133682@footnote{https://github.com/python/cpython/issues/133682}: Fixed test case
@code{test.test_annotationlib.TestStringFormat.test_displays} which ensures
proper handling of complex data structures (lists, sets, dictionaries, and
tuples) in string annotations.

@item 
gh-133639@footnote{https://github.com/python/cpython/issues/133639}: Fix @code{TestPyReplAutoindent.test_auto_indent_default()} doesn’t
run @code{input_code}.
@end itemize

@node Security<10>,Library<23>,Tests<6>,Python 3 14 0 beta 2
@anchor{whatsnew/changelog id89}@anchor{183c}
@subsubsection Security



@itemize -

@item 
gh-133767@footnote{https://github.com/python/cpython/issues/133767}: Fix use-after-free in the “unicode-escape” decoder with a
non-“strict” error handler.

@item 
gh-128840@footnote{https://github.com/python/cpython/issues/128840}: Short-circuit the processing of long IPv6 addresses early in
@ref{84,,ipaddress} to prevent excessive memory consumption and a minor
denial-of-service.
@end itemize

@node Library<23>,Core and Builtins<21>,Security<10>,Python 3 14 0 beta 2
@anchor{whatsnew/changelog id90}@anchor{183d}
@subsubsection Library



@itemize -

@item 
gh-132710@footnote{https://github.com/python/cpython/issues/132710}: If possible, ensure that @ref{d9f,,uuid.getnode()} returns the same
result even across different processes. Previously, the result was
constant only within the same process. Patch by Bénédikt Tran.

@item 
gh-80334@footnote{https://github.com/python/cpython/issues/80334}: @ref{1768,,multiprocessing.freeze_support()} now checks for work on
any “spawn” start method platform rather than only on Windows.

@item 
gh-134582@footnote{https://github.com/python/cpython/issues/134582}: Fix tokenize.untokenize() round-trip errors related to
t-strings braces escaping

@item 
gh-134546@footnote{https://github.com/python/cpython/issues/134546}: Ensure @ref{aa,,pdb} remote debugging script is readable by remote
Python process.

@item 
gh-134451@footnote{https://github.com/python/cpython/issues/134451}: Converted @code{asyncio.tools.CycleFoundException} from dataclass
to a regular exception type.

@item 
gh-114177@footnote{https://github.com/python/cpython/issues/114177}: Fix @ref{b,,asyncio} to not close subprocess pipes which would
otherwise error out when the event loop is already closed.

@item 
gh-90871@footnote{https://github.com/python/cpython/issues/90871}: Fixed an off by one error concerning the backlog parameter in
@ref{4cb,,create_unix_server()}. Contributed by Christian
Harries.

@item 
gh-134323@footnote{https://github.com/python/cpython/issues/134323}: Fix the @ref{183e,,threading.RLock.locked()} method.

@item 
gh-86802@footnote{https://github.com/python/cpython/issues/86802}: Fixed asyncio memory leak in cancelled shield tasks. For
shielded tasks where the shield was cancelled, log potential exceptions
through the exception handler. Contributed by Christian Harries.

@item 
gh-134209@footnote{https://github.com/python/cpython/issues/134209}: @ref{2f,,curses}: The @ref{183f,,curses.window.instr()} and
@ref{1840,,curses.window.getstr()} methods now allocate their internal buffer on
the heap instead of the stack; in addition, the max buffer size is
increased from 1023 to 2047.

@item 
gh-134235@footnote{https://github.com/python/cpython/issues/134235}: Updated tab completion on REPL to include builtin modules.
Contributed by Tom Wang, Hunter Young

@item 
gh-134152@footnote{https://github.com/python/cpython/issues/134152}: Fixed @ref{173b,,UnboundLocalError} that could occur during
@ref{3f,,email} header parsing if an expected trailing delimiter is missing
in some contexts.

@item 
gh-134168@footnote{https://github.com/python/cpython/issues/134168}: @ref{76,,http.server}: Fix IPv6 address binding and
@ref{1841,,--directory} handling when using HTTPS.

@item 
gh-62184@footnote{https://github.com/python/cpython/issues/62184}: Remove import of C implementation of @ref{1514,,io.FileIO} from
Python implementation which has its own implementation

@item 
gh-133982@footnote{https://github.com/python/cpython/issues/133982}: Emit @ref{4d8,,RuntimeWarning} in the Python implementation of
@ref{83,,io} when the @ref{13c8,,file-like object} is not closed
explicitly in the presence of multiple I/O layers.

@item 
gh-133890@footnote{https://github.com/python/cpython/issues/133890}: The @ref{e4,,tarfile} module now handles @ref{886,,UnicodeEncodeError}
in the same way as @ref{2c0,,OSError} when cannot extract a member.

@item 
gh-134097@footnote{https://github.com/python/cpython/issues/134097}: Fix interaction of the new @ref{492,,REPL} and @ref{16f,,-X showrefcount} command line option.

@item 
gh-133889@footnote{https://github.com/python/cpython/issues/133889}: The generated directory listing page in
@ref{d37,,http.server.SimpleHTTPRequestHandler} now only shows the decoded
path component of the requested URL, and not the query and fragment.

@item 
gh-134098@footnote{https://github.com/python/cpython/issues/134098}: Fix handling paths that end with a percent-encoded slash
(@code{%2f} or @code{%2F}) in @ref{d37,,http.server.SimpleHTTPRequestHandler}.

@item 
gh-132124@footnote{https://github.com/python/cpython/issues/132124}: On POSIX-compliant systems,
@code{multiprocessing.util.get_temp_dir()} now ignores 
@geindex TMPDIR
@geindex 환경 변수; TMPDIR
@code{TMPDIR}
(and similar environment variables) if the path length of @code{AF_UNIX}
socket files exceeds the platform-specific maximum length when using the
@ref{1d4,,forkserver} start method.
Patch by Bénédikt Tran.

@item 
gh-134062@footnote{https://github.com/python/cpython/issues/134062}: @ref{84,,ipaddress}: fix collisions in @ref{cf2,,__hash__()}
for @ref{50d,,IPv4Network} and @ref{50e,,IPv6Network}
objects.

@item 
gh-133970@footnote{https://github.com/python/cpython/issues/133970}: Make @code{string.templatelib.Template} and
@code{string.templatelib.Interpolation} generic.

@item 
gh-71253@footnote{https://github.com/python/cpython/issues/71253}: Raise @ref{2ec,,ValueError} in @ref{316,,open()} if `opener' returns a
negative file-descriptor in the Python implementation of @ref{83,,io} to
match the C implementation.

@item 
gh-133960@footnote{https://github.com/python/cpython/issues/133960}: Simplify and improve @ref{1818,,typing.evaluate_forward_ref()}. It
now no longer raises errors on certain invalid types. In several
situations, it is now able to evaluate forward references that were
previously unsupported.

@item 
gh-133925@footnote{https://github.com/python/cpython/issues/133925}: Make the private class @code{typing._UnionGenericAlias} hashable.

@item 
gh-133653@footnote{https://github.com/python/cpython/issues/133653}: Fix @ref{1bd,,argparse.ArgumentParser} with the `formatter_class'
argument. Fix TypeError when `formatter_class' is a custom subclass of
@code{HelpFormatter}. Fix TypeError when `formatter_class' is not a
subclass of @code{HelpFormatter} and non-standard `prefix_char' is
used. Fix support of colorizing when `formatter_class' is not a subclass
of @code{HelpFormatter}.

@item 
gh-132641@footnote{https://github.com/python/cpython/issues/132641}: Fixed a race in @ref{be1,,functools.lru_cache()} under
free-threading.

@item 
gh-133783@footnote{https://github.com/python/cpython/issues/133783}: Fix bug with applying @ref{1c0,,copy.replace()} to @ref{9,,ast}
objects. Attributes that default to @code{None} were incorrectly treated as
required for manually created AST nodes.

@item 
gh-133684@footnote{https://github.com/python/cpython/issues/133684}: Fix bug where @ref{459,,annotationlib.get_annotations()} would
return the wrong result for certain classes that are part of a class
hierarchy where @code{from __future__ import annotations} is used.

@item 
gh-77057@footnote{https://github.com/python/cpython/issues/77057}: Fix handling of invalid markup declarations in
@ref{a77,,html.parser.HTMLParser}.

@item 
gh-130328@footnote{https://github.com/python/cpython/issues/130328}: Speedup pasting in @code{PyREPL} on Windows in a legacy console.
Patch by Chris Eibl.

@item 
gh-133701@footnote{https://github.com/python/cpython/issues/133701}: Fix bug where @ref{332,,typing.TypedDict} classes defined under
@code{from __future__ import annotations} and inheriting from another
@code{TypedDict} had an incorrect @code{__annotations__} attribute.

@item 
gh-133581@footnote{https://github.com/python/cpython/issues/133581}: Improve unparsing of t-strings in @ref{ae2,,ast.unparse()} and
@code{from __future__ import annotations}. Empty t-strings now round-trip
correctly and formatting in interpolations is preserved. Patch by Jelle
Zijlstra.

@item 
gh-133551@footnote{https://github.com/python/cpython/issues/133551}: Support t-strings (
@geindex Python 향상 제안; PEP 750
PEP 750@footnote{https://peps.python.org/pep-0750/}) in @ref{6,,annotationlib}. Patch
by Jelle Zijlstra.

@item 
gh-133439@footnote{https://github.com/python/cpython/issues/133439}: Fix dot commands with trailing spaces are mistaken for
multi-line SQL statements in the sqlite3 command-line interface.

@item 
gh-132493@footnote{https://github.com/python/cpython/issues/132493}: Avoid accessing @code{__annotations__} unnecessarily in
@ref{22f,,inspect.signature()}.

@item 
gh-132876@footnote{https://github.com/python/cpython/issues/132876}: @code{ldexp()} on Windows doesn’t round subnormal results before
Windows 11, but should.  Python’s @ref{1842,,math.ldexp()} wrapper now does
round them, so results may change slightly, in rare cases of very small
results, on Windows versions before 11.

@item 
gh-133009@footnote{https://github.com/python/cpython/issues/133009}: @ref{12b,,xml.etree.ElementTree}: Fix a crash in
@ref{17e6,,Element.__deepcopy__} when the element is
concurrently mutated. Patch by Bénédikt Tran.

@item 
gh-91555@footnote{https://github.com/python/cpython/issues/91555}: Ignore log messages generated during handling of log messages,
to avoid deadlock or infinite recursion. [NOTE: This change has since been
reverted.]

@item 
gh-125028@footnote{https://github.com/python/cpython/issues/125028}: @ref{216,,functools.Placeholder} cannot be passed to
@ref{217,,functools.partial()} as a keyword argument.

@item 
gh-62824@footnote{https://github.com/python/cpython/issues/62824}: Fix aliases for @code{iso8859_8} encoding. Patch by Dave Goncalves.

@item 
gh-86155@footnote{https://github.com/python/cpython/issues/86155}: @ref{1843,,html.parser.HTMLParser.close()} no longer loses data when
the @code{<script>} tag is not closed. Patch by Waylan Limberg.

@item 
gh-69426@footnote{https://github.com/python/cpython/issues/69426}: Fix @ref{a77,,html.parser.HTMLParser} to not unescape character
entities in attribute values if they are followed by an ASCII alphanumeric
or an equals sign.

@item 
bpo-28494@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28494}: Improve Zip file validation false positive rate in
@ref{152f,,zipfile.is_zipfile()}.

@item 
gh-134381@footnote{https://github.com/python/cpython/issues/134381}: Fix @ref{244,,RuntimeError} when using a not-started
@ref{176,,threading.Thread} after calling @ref{4b6,,os.fork()}
@end itemize

@node Core and Builtins<21>,C API<8>,Library<23>,Python 3 14 0 beta 2
@anchor{whatsnew/changelog id91}@anchor{1844}
@subsubsection Core and Builtins



@itemize -

@item 
gh-127960@footnote{https://github.com/python/cpython/issues/127960}: PyREPL interactive shell no longer starts with @code{__package__}
and @code{__file__} global names set to @code{_pyrepl} package internals.
Contributed by Yuichiro Tachibana.

@item 
gh-130397@footnote{https://github.com/python/cpython/issues/130397}: Remove special-casing for C stack depth limits for WASI. Due to
WebAssembly’s built-in stack protection this does not pose a security
concern.

@item 
gh-128066@footnote{https://github.com/python/cpython/issues/128066}: Fixes an edge case where PyREPL improperly threw an error when
Python is invoked on a read only filesystem while trying to write history
file entries.

@item 
gh-69605@footnote{https://github.com/python/cpython/issues/69605}: When auto-completing an import in the @ref{492,,REPL}, finding no
candidates now issues no suggestion, rather than suggestions from the
current namespace.

@item 
gh-134158@footnote{https://github.com/python/cpython/issues/134158}: Fix coloring of double braces in f-strings and t-strings in the
@ref{492,,REPL}.

@item 
gh-134119@footnote{https://github.com/python/cpython/issues/134119}: Fix crash when calling @ref{9d8,,next()} on an exhausted template
string iterator. Patch by Jelle Zijlstra.

@item 
gh-134100@footnote{https://github.com/python/cpython/issues/134100}: Fix a use-after-free bug that occurs when an imported module
isn’t in @ref{17ea,,sys.modules} after its initial import. Patch by
Nico-Posada.

@item 
gh-133999@footnote{https://github.com/python/cpython/issues/133999}: Fix @ref{18e,,SyntaxError} regression in @ref{1ab,,except} parsing
after gh-123440@footnote{https://github.com/python/cpython/issues/123440}.

@item 
gh-133886@footnote{https://github.com/python/cpython/issues/133886}: Fix @ref{16d,,sys.remote_exec()} for non-ASCII paths in non-UTF-8
locales and non-UTF-8 paths in UTF-8 locales.

@item 
gh-133703@footnote{https://github.com/python/cpython/issues/133703}: Fix hashtable in dict can be bigger than intended in some
situations.

@item 
gh-133778@footnote{https://github.com/python/cpython/issues/133778}: Fix bug where assigning to the @ref{1845,,__annotations__}
attributes of classes defined under @code{from __future__ import annotations}
had no effect.

@item 
gh-132762@footnote{https://github.com/python/cpython/issues/132762}: @ref{24e,,fromkeys()} no longer loops forever when adding a
small set of keys to a large base dict. Patch by Angela Liss.

@item 
gh-133541@footnote{https://github.com/python/cpython/issues/133541}: Inconsistent indentation in user input crashed the new REPL
when syntax highlighting was active. This is now fixed.

@item 
gh-133516@footnote{https://github.com/python/cpython/issues/133516}: Raise @ref{2ec,,ValueError} when constants @code{True}, @code{False} or
@code{None} are used as an identifier after NFKC normalization.

@item 
gh-132542@footnote{https://github.com/python/cpython/issues/132542}: Update @ref{c32,,Thread.native_id}
after @code{fork(2)@footnote{https://manpages.debian.org/fork(2)}} to ensure accuracy. Patch by Noam Cohen.
@end itemize

@node C API<8>,Build<8>,Core and Builtins<21>,Python 3 14 0 beta 2
@anchor{whatsnew/changelog id92}@anchor{1846}
@subsubsection C API



@itemize -

@item 
gh-134144@footnote{https://github.com/python/cpython/issues/134144}: Fix crash when calling @ref{1847,,Py_EndInterpreter()} with a
@ref{1848,,thread state} that isn’t the initial thread for the interpreter.
@end itemize

@node Build<8>,,C API<8>,Python 3 14 0 beta 2
@anchor{whatsnew/changelog id93}@anchor{1849}
@subsubsection Build



@itemize -

@item 
gh-134455@footnote{https://github.com/python/cpython/issues/134455}: Fixed @code{build-details.json} generation to use the correct
@code{c_api.headers} as defined in 
@geindex Python 향상 제안; PEP 739
PEP 739@footnote{https://peps.python.org/pep-0739/}, instead of @code{c_api.include}.

@item 
gh-131769@footnote{https://github.com/python/cpython/issues/131769}: Fix detecting when the build Python in a cross-build is a
pydebug build.

@item 
gh-117088@footnote{https://github.com/python/cpython/issues/117088}: AIX linker don’t support -h option, so avoid it through
platform check
@end itemize

@node Python 3 14 0 beta 1,Python 3 14 0 alpha 7,Python 3 14 0 beta 2,Changelog
@anchor{whatsnew/changelog python-3-14-0-beta-1}@anchor{184a}
@subsection Python 3.14.0 beta 1


`Release date: 2025-05-06'

@menu
* Windows: Windows<9>. 
* Tools/Demos: Tools/Demos<8>. 
* Tests: Tests<7>. 
* Security: Security<11>. 
* Library: Library<24>. 
* IDLE: IDLE<5>. 
* Documentation: Documentation<8>. 
* Core and Builtins: Core and Builtins<22>. 
* Library: Library<25>. 
* Core and Builtins: Core and Builtins<23>. 
* Library: Library<26>. 
* Core and Builtins: Core and Builtins<24>. 
* Library: Library<27>. 
* C API: C API<9>. 
* Build: Build<9>. 

@end menu

@node Windows<9>,Tools/Demos<8>,,Python 3 14 0 beta 1
@anchor{whatsnew/changelog id94}@anchor{184b}
@subsubsection Windows



@itemize -

@item 
gh-132930@footnote{https://github.com/python/cpython/issues/132930}: Marks the installer for Windows as deprecated and updates
documentation to cover the new Python install manager.

@item 
gh-127405@footnote{https://github.com/python/cpython/issues/127405}: Add @code{ABIFLAGS} to @ref{298,,sysconfig.get_config_vars()} on
Windows. Patch by Xuehai Pan.
@end itemize

@node Tools/Demos<8>,Tests<7>,Windows<9>,Python 3 14 0 beta 1
@anchor{whatsnew/changelog id95}@anchor{184c}
@subsubsection Tools/Demos



@itemize -

@item 
gh-130453@footnote{https://github.com/python/cpython/issues/130453}: Allow passing multiple keyword arguments with the same function
name in @code{pygettext}.

@item 
gh-130195@footnote{https://github.com/python/cpython/issues/130195}: Add warning messages when @code{pygettext} unimplemented
@code{-a/--extract-all} option is called.
@end itemize

@node Tests<7>,Security<11>,Tools/Demos<8>,Python 3 14 0 beta 1
@anchor{whatsnew/changelog id96}@anchor{184d}
@subsubsection Tests



@itemize -

@item 
gh-133131@footnote{https://github.com/python/cpython/issues/133131}: The iOS testbed will now select the most recently released
“SE-class” device for testing if a device isn’t explicitly specified.

@item 
gh-91048@footnote{https://github.com/python/cpython/issues/91048}: Add ability to externally inspect all pending asyncio tasks,
even if no task is currently entered on the event loop.

@item 
gh-109981@footnote{https://github.com/python/cpython/issues/109981}: The test helper that counts the list of open file descriptors
now uses the optimised @code{/dev/fd} approach on all Apple platforms, not
just macOS. This avoids crashes caused by guarded file descriptors.

@item 
gh-132678@footnote{https://github.com/python/cpython/issues/132678}: Add @code{--prioritize} to @code{-m test}. This option allows the
user to specify which selected tests should execute first, even if the
order is otherwise randomized. This is particularly useful for tests that
run the longest.

@item 
gh-131290@footnote{https://github.com/python/cpython/issues/131290}: Tests in @code{Lib/test} can now be correctly executed as
standalone scripts.
@end itemize

@node Security<11>,Library<24>,Tests<7>,Python 3 14 0 beta 1
@anchor{whatsnew/changelog id97}@anchor{184e}
@subsubsection Security



@itemize -

@item 
gh-115322@footnote{https://github.com/python/cpython/issues/115322}: The underlying extension modules behind @ref{bf,,readline}:,
@ref{dc,,subprocess}, and @ref{2e,,ctypes} now raise audit events on previously
uncovered code paths that could lead to file system access related to C
function calling and external binary execution.  The
@code{ctypes.call_function} audit hook has also been fixed to use an unsigned
value for its @code{function pointer}.
@end itemize

@node Library<24>,IDLE<5>,Security<11>,Python 3 14 0 beta 1
@anchor{whatsnew/changelog id98}@anchor{184f}
@subsubsection Library



@itemize -

@item 
gh-133490@footnote{https://github.com/python/cpython/issues/133490}: Add color support to PDB in remote mode.

@item 
gh-132493@footnote{https://github.com/python/cpython/issues/132493}: Avoid eagerly evaluating annotations in functions decorated
with @ref{13f8,,reprlib.recursive_repr()}.

@item 
gh-130645@footnote{https://github.com/python/cpython/issues/130645}: Add color to stdlib argparse CLIs. Patch by Hugo van Kemenade.

@item 
gh-119180@footnote{https://github.com/python/cpython/issues/119180}: Make @ref{459,,annotationlib.get_annotations()} succeed with the
@code{FORWARDREF} format if evaluating the annotations throws an exception
other than @ref{452,,NameError} or @ref{5ee,,AttributeError}.

@item 
gh-133351@footnote{https://github.com/python/cpython/issues/133351}: Fix remote PDB to correctly request tab completions for Python
expressions from the server when completing a continuation line of a
multi-line Python block.

@item 
gh-133367@footnote{https://github.com/python/cpython/issues/133367}: Add the @code{--feature-version}, @code{--optimize}, and
@code{--show-empty} options to the @ref{9,,ast} command-line interface. Patch
by Semyon Moroz.

@item 
gh-133363@footnote{https://github.com/python/cpython/issues/133363}: The @ref{1850,,cmd.Cmd} class has been fixed to reliably call the
@code{completedefault} method whenever the @code{do_shell} method is not defined
and tab completion is requested for a line beginning with @code{!}.

@item 
gh-113081@footnote{https://github.com/python/cpython/issues/113081}: Highlight syntax on source code in @ref{aa,,pdb}.

@item 
gh-133349@footnote{https://github.com/python/cpython/issues/133349}: Introduced auto-indent in @ref{aa,,pdb} multi-line input.

@item 
gh-133306@footnote{https://github.com/python/cpython/issues/133306}: Use @code{\z} instead of @code{\Z} in @ref{1851,,fnmatch.translate()} and
@ref{1852,,glob.translate()}.

@item 
gh-133306@footnote{https://github.com/python/cpython/issues/133306}: Support @code{\z} as a synonym for @code{\Z} in @ref{be,,regular expressions}.

@item 
gh-133300@footnote{https://github.com/python/cpython/issues/133300}: Make @ref{1bd,,argparse.ArgumentParser}’s @code{suggest_on_error} a
keyword-only parameter. Patch by Hugo van Kemenade.

@item 
gh-133290@footnote{https://github.com/python/cpython/issues/133290}: Fix attribute caching issue when setting
@ref{1853,,ctypes._Pointer._type_} in the undocumented and deprecated
@code{ctypes.SetPointerType()} function and the undocumented
@code{set_type()} method.

@item 
gh-133223@footnote{https://github.com/python/cpython/issues/133223}: When PDB is attached to a remote process, do a better job of
intercepting Ctrl+C and forwarding it to the remote process.

@item 
gh-133153@footnote{https://github.com/python/cpython/issues/133153}: Do not complete @ref{aa,,pdb} commands in @code{interact} mode of
@code{pdb}.

@item 
gh-133139@footnote{https://github.com/python/cpython/issues/133139}: Add the @ref{1f6,,curses.assume_default_colors()} function, a
refinement of the @ref{1f7,,curses.use_default_colors()} function which allows
to change the color pair @code{0}.

@item 
gh-133089@footnote{https://github.com/python/cpython/issues/133089}: Use original timeout value for @ref{17b2,,subprocess.TimeoutExpired}
when the func @ref{d7e,,subprocess.run()} is called with a timeout instead of
sometimes a confusing partial remaining time out value used internally on
the final @code{wait()}.

@item 
gh-133036@footnote{https://github.com/python/cpython/issues/133036}: @ref{315,,codecs.open()} is now deprecated. Use @ref{316,,open()}
instead. Contributed by Inada Naoki.

@item 
gh-132987@footnote{https://github.com/python/cpython/issues/132987}: Many builtin and extension functions which accept an unsigned
integer argument, now use @ref{19e,,__index__()} if available.

@item 
gh-124703@footnote{https://github.com/python/cpython/issues/124703}: Set return code to @code{1} when aborting process from @ref{aa,,pdb}.

@item 
gh-133005@footnote{https://github.com/python/cpython/issues/133005}: Support passing @code{preset} option to @ref{1076,,tarfile.open()} when
using @code{'w|xz'} mode.

@item 
gh-115032@footnote{https://github.com/python/cpython/issues/115032}: Support for custom logging handlers with the `strm' argument is
deprecated and scheduled for removal in Python 3.16. Define handlers with
the `stream' argument instead. Patch by Mariusz Felisiak.

@item 
gh-132991@footnote{https://github.com/python/cpython/issues/132991}: Add @code{socket.IP_FREEBIND} constant on Linux 2.4 and
later.

@item 
gh-132995@footnote{https://github.com/python/cpython/issues/132995}: Bump the version of pip bundled in ensurepip to version 25.1.1

@item 
gh-132933@footnote{https://github.com/python/cpython/issues/132933}: The zipapp module now applies the filter when creating the list
of files to add, rather than waiting until the file is being added to the
archive.

@item 
gh-121249@footnote{https://github.com/python/cpython/issues/121249}: Always support the float complex and double complex C types in the @ref{db,,struct} module.  Patch by Sergey B
Kirpichev.

@item 
gh-132915@footnote{https://github.com/python/cpython/issues/132915}: @ref{1854,,fcntl.fcntl()} and @ref{1680,,fcntl.ioctl()} can now detect a
buffer overflow and raise @ref{794,,SystemError}. The stack and memory can be
corrupted in such case, so treat this error as fatal.

@item 
gh-132017@footnote{https://github.com/python/cpython/issues/132017}: Fix error when @code{pyrepl} is suspended, then resumed and
terminated.

@item 
gh-132893@footnote{https://github.com/python/cpython/issues/132893}: Improved @ref{1855,,statistics.NormalDist.cdf()} accuracy for inputs
smaller than the mean.

@item 
gh-130328@footnote{https://github.com/python/cpython/issues/130328}: Speedup pasting in @code{PyREPL} on Windows. Fix by Chris Eibl.

@item 
gh-132882@footnote{https://github.com/python/cpython/issues/132882}: Fix copying of @ref{2a8,,typing.Union} objects containing objects
that do not support the @code{|} operator.

@item 
gh-93696@footnote{https://github.com/python/cpython/issues/93696}: Fixed the breakpoint display error for frozen modules in
@ref{aa,,pdb}.

@item 
gh-129965@footnote{https://github.com/python/cpython/issues/129965}: Add MIME types for @code{.7z}, @code{.apk}, @code{.deb}, @code{.glb},
@code{.gltf}, @code{.gz}, @code{.m4v}, @code{.php}, @code{.rar}, @code{.rpm}, @code{.stl} and
@code{.wmv}. Patch by Hugo van Kemenade.

@item 
gh-132742@footnote{https://github.com/python/cpython/issues/132742}: @ref{1854,,fcntl.fcntl()} now supports arbitrary @ref{193,,bytes-like objects}, not only @ref{192,,bytes}. @ref{1680,,fcntl.ioctl()}
now automatically retries system calls failing with EINTR and releases the
GIL during a system call even for large bytes-like object.

@item 
gh-132451@footnote{https://github.com/python/cpython/issues/132451}: The CLI for the PDB debugger now accepts a @code{-p PID} argument
to allow attaching to a running process. The process must be running the
same version of Python as the one running PDB.

@item 
gh-125618@footnote{https://github.com/python/cpython/issues/125618}: Add a `format' parameter to
@ref{17b9,,annotationlib.ForwardRef.evaluate()}. Evaluating annotations in the
@code{FORWARDREF} format now succeeds in more cases that would previously
have raised an exception.

@item 
gh-132805@footnote{https://github.com/python/cpython/issues/132805}: Fix incorrect handling of nested non-constant values in the
FORWARDREF format in @ref{6,,annotationlib}.

@item 
gh-132734@footnote{https://github.com/python/cpython/issues/132734}: Add new constants for Bluetooth @ref{d1,,sockets}.

@item 
gh-132673@footnote{https://github.com/python/cpython/issues/132673}: Fix @ref{8b7,,AssertionError} raised on @ref{1e5,,ctypes.Structure}
with @code{_align_ = 0} and @code{_fields_ = []}.

@item 
gh-132578@footnote{https://github.com/python/cpython/issues/132578}: Rename the @code{threading.Thread._handle} field to avoid
shadowing methods defined on subclasses of @code{threading.Thread}.

@item 
gh-132561@footnote{https://github.com/python/cpython/issues/132561}: Fix the public @code{locked} method of @code{multiprocessing.SemLock}
class. Also adding 2 tests for the derivated @ref{1856,,multiprocessing.Lock}
and @ref{1857,,multiprocessing.RLock} classes.

@item 
gh-121468@footnote{https://github.com/python/cpython/issues/121468}: Add @ref{279,,pdb.set_trace_async()} function to support
@ref{18d,,await} statements in @ref{aa,,pdb}.

@item 
gh-132493@footnote{https://github.com/python/cpython/issues/132493}: @ref{569,,typing.Protocol} now uses
@ref{459,,annotationlib.get_annotations()} when checking whether or not an
instance implements the protocol with @ref{2ad,,isinstance()}. This enables
support for @code{isinstance} checks against classes with deferred
annotations.

@item 
gh-132536@footnote{https://github.com/python/cpython/issues/132536}: Do not disable @ref{1858,,PY_THROW} event in @ref{10,,bdb}
because it can’t be disabled.

@item 
gh-132527@footnote{https://github.com/python/cpython/issues/132527}: Include the valid typecode ‘w’ in the error message when an
invalid typecode is passed to @ref{4c0,,array.array}.

@item 
gh-132099@footnote{https://github.com/python/cpython/issues/132099}: The Bluetooth socket with the @ref{281,,BTPROTO_HCI}
protocol on Linux now accepts an address in the format of an integer
@code{device_id}, not only a tuple  @code{(device_id,)}.

@item 
gh-81793@footnote{https://github.com/python/cpython/issues/81793}: Fix @ref{12f4,,os.link()} on platforms (like Linux) where the system
@code{link()} function does not follow symlinks. On Linux, it now
follows symlinks by default or if @code{follow_symlinks=True} is specified.
On Windows, it now raises an error if @code{follow_symlinks=True} is passed.
On macOS, it now raises an error if @code{follow_symlinks=False} is passed
and the system @code{linkat()} function is not available at runtime.

@item 
gh-132493@footnote{https://github.com/python/cpython/issues/132493}: Support creation of @ref{569,,typing.Protocol} classes with
annotations that cannot be resolved at class creation time.

@item 
gh-132491@footnote{https://github.com/python/cpython/issues/132491}: Rename @code{annotationlib.value_to_string} to
@ref{1859,,annotationlib.type_repr()} and provide better handling for function
objects.

@item 
gh-132426@footnote{https://github.com/python/cpython/issues/132426}: Add @ref{45b,,annotationlib.get_annotate_from_class_namespace()} as
a helper for accessing annotations in metaclasses, and remove
@code{annotationlib.get_annotate_function}.

@item 
gh-70145@footnote{https://github.com/python/cpython/issues/70145}: Add support for channels in Bluetooth HCI protocol
(@ref{281,,BTPROTO_HCI}).

@item 
gh-131913@footnote{https://github.com/python/cpython/issues/131913}: Add a shortcut function
@ref{251,,multiprocessing.Process.interrupt()} alongside the existing
@ref{185a,,multiprocessing.Process.terminate()} and
@ref{d4e,,multiprocessing.Process.kill()} for an improved control over child
process termination.

@item 
gh-132439@footnote{https://github.com/python/cpython/issues/132439}: Fix @code{PyREPL} on Windows: characters entered via AltGr are
swallowed. Patch by Chris Eibl.

@item 
gh-132429@footnote{https://github.com/python/cpython/issues/132429}: Fix support of Bluetooth sockets on NetBSD and DragonFly BSD.
Add support for `cid' and `bdaddr_type' in the BTPROTO_L2CAP address on
FreeBSD. Return `cid' in @code{getsockname()} for BTPROTO_L2CAP if it is not
zero.

@item 
gh-132106@footnote{https://github.com/python/cpython/issues/132106}: @ref{243,,QueueListener.start} now raises a @ref{244,,RuntimeError}
if the listener is already started.

@item 
gh-132417@footnote{https://github.com/python/cpython/issues/132417}: Fix a @code{NULL} pointer dereference when a C function called
using @ref{2e,,ctypes} with @code{restype} @ref{1f3,,py_object} returns
@code{NULL}.

@item 
gh-132385@footnote{https://github.com/python/cpython/issues/132385}: Fix instance error suggestions trigger potential exceptions in
@ref{6f9,,object.__getattr__()} in @ref{104,,traceback}.

@item 
gh-125866@footnote{https://github.com/python/cpython/issues/125866}: Add optional `add_scheme' argument to
@ref{2bf,,urllib.request.pathname2url()}; when set to true, a complete URL is
returned. Likewise add optional `require_scheme' argument to
@ref{2bd,,url2pathname()}; when set to true, a complete URL is
accepted.

@item 
gh-132308@footnote{https://github.com/python/cpython/issues/132308}: A @ref{561,,traceback.TracebackException} now correctly renders
the @code{__context__} and @code{__cause__} attributes from @ref{185b,,falsey} @ref{bcc,,Exception}, and the @code{exceptions} attribute from falsey
@ref{4d3,,ExceptionGroup}.

@item 
gh-130645@footnote{https://github.com/python/cpython/issues/130645}: Add colour to @ref{7,,argparse} help output. Patch by Hugo van
Kemenade.

@item 
gh-127495@footnote{https://github.com/python/cpython/issues/127495}: In PyREPL, append a new entry to the @code{PYTHON_HISTORY} file
`after' every statement.  This should preserve command-line history after
interpreter is terminated.  Patch by Sergey B Kirpichev.

@item 
gh-129463@footnote{https://github.com/python/cpython/issues/129463}: Comparison of @ref{177e,,annotationlib.ForwardRef} objects no
longer uses the internal @code{__code__} and @code{__ast_node__} attributes,
which are used as caches.

@item 
gh-132250@footnote{https://github.com/python/cpython/issues/132250}: Fixed the @ref{794,,SystemError} in @ref{2b,,cProfile} when locating
the actual C function of a method raises an exception.

@item 
gh-132064@footnote{https://github.com/python/cpython/issues/132064}: @ref{459,,annotationlib.get_annotations()} now uses the
@code{__annotate__} attribute if it is present, even if @code{__annotations__}
is not present. Additionally, the function now raises a
@ref{198,,TypeError} if it is passed an object that does not have any
annotatins.

@item 
gh-130664@footnote{https://github.com/python/cpython/issues/130664}: Support the @code{'_'} digit separator in formatting of the
integral part of @ref{1fe,,Decimal}’s.  Patch by Sergey B
Kirpichev.

@item 
gh-131952@footnote{https://github.com/python/cpython/issues/131952}: Add color output to the @code{json} CLI. Patch by Tomas
Roun.

@item 
gh-132063@footnote{https://github.com/python/cpython/issues/132063}: Prevent exceptions that evaluate as falsey (namely, when their
@code{__bool__} method returns @code{False} or their @code{__len__} method returns
0) from being ignored by @ref{1d6,,concurrent.futures.ProcessPoolExecutor}
and @ref{948,,concurrent.futures.ThreadPoolExecutor}.

@item 
gh-132106@footnote{https://github.com/python/cpython/issues/132106}: @ref{242,,logging.handlers.QueueListener} now implements the
context manager protocol, allowing it to be used in a @ref{186,,with}
statement.

@item 
gh-132054@footnote{https://github.com/python/cpython/issues/132054}: The @code{application/yaml} mime type (
@geindex RFC; RFC 9512
RFC 9512@footnote{https://datatracker.ietf.org/doc/html/rfc9512.html}) is now
supported by @ref{93,,mimetypes}. Patch by Sasha “Nelie” Chernykh and Hugo
van Kemenade.

@item 
gh-119605@footnote{https://github.com/python/cpython/issues/119605}: Respect @code{follow_wrapped} for @code{__init__()} and
@code{__new__()} methods when getting the class signature for a class with
@ref{22f,,inspect.signature()}. Preserve class signature after wrapping with
@ref{48a,,warnings.deprecated()}. Patch by Xuehai Pan.

@item 
gh-118761@footnote{https://github.com/python/cpython/issues/118761}: Improve import times by up to 33x for the @ref{c9,,shlex} module,
and improve the performance of @ref{581,,shlex.quote()} by up to 12x. Patch by
Adam Turner.

@item 
gh-85302@footnote{https://github.com/python/cpython/issues/85302}: Add support for @ref{282,,BTPROTO_SCO} in sockets on
FreeBSD.

@item 
gh-131757@footnote{https://github.com/python/cpython/issues/131757}: Make @ref{be1,,functools.lru_cache()} call the cached function
unlocked to allow concurrency.

@item 
gh-131423@footnote{https://github.com/python/cpython/issues/131423}: @ref{d5,,ssl} can show descriptions for errors added in OpenSSL
3.4.1. Patch by Bénédikt Tran.

@item 
gh-131434@footnote{https://github.com/python/cpython/issues/131434}: Improve error reporting for incorrect format in
@ref{1632,,time.strptime()}.

@item 
gh-131524@footnote{https://github.com/python/cpython/issues/131524}: Add help message to @ref{af,,platform} command-line interface.
Contributed by Harry Lees.

@item 
gh-100926@footnote{https://github.com/python/cpython/issues/100926}: Move @ref{1f1,,ctypes.POINTER()} types cache from a global internal
cache (@code{_pointer_type_cache}) to the
@ref{1f2,,ctypes._CData.__pointer_type__} attribute of the corresponding
@ref{2e,,ctypes} types. This will stop the cache from growing without limits
in some situations.

@item 
gh-85702@footnote{https://github.com/python/cpython/issues/85702}: If @code{zoneinfo._common.load_tzdata} is given a package without a
resource a @code{ZoneInfoNotFoundError} is raised rather than a
@ref{1258,,IsADirectoryError}.

@item 
gh-123471@footnote{https://github.com/python/cpython/issues/123471}: Make concurrent iterations over @ref{185c,,itertools.repeat} safe
under free-threading.

@item 
gh-131127@footnote{https://github.com/python/cpython/issues/131127}: Systems using LibreSSL now successfully build.

@item 
gh-89157@footnote{https://github.com/python/cpython/issues/89157}: Make the pure Python implementation of
@ref{827,,datetime.date.fromisoformat()}, only accept ASCII strings for
consistency with the C implementation.

@item 
gh-130941@footnote{https://github.com/python/cpython/issues/130941}: Fix @ref{4de,,configparser.ConfigParser} parsing empty
interpolation with @code{allow_no_value} set to @code{True}.

@item 
gh-110067@footnote{https://github.com/python/cpython/issues/110067}: Make @ref{6d,,heapq} max-heap functions @ref{221,,heapq.heapify_max()},
@ref{222,,heapq.heappush_max()}, @ref{223,,heapq.heappop_max()}, and
@ref{224,,heapq.heapreplace_max()} public. Previous underscored naming is kept
for backwards compatibility. Additionally, the missing function
@ref{225,,heapq.heappushpop_max()} has been added to both the C and Python
implementations.

@item 
gh-129098@footnote{https://github.com/python/cpython/issues/129098}: Fix REPL traceback reporting when using @ref{4b2,,compile()} with an
inexisting file. Patch by Bénédikt Tran.

@item 
gh-130631@footnote{https://github.com/python/cpython/issues/130631}: @code{http.cookiejar.join_header_words()} is now more similar
to the original Perl version. It now quotes the same set of characters and
always quote values that end with @code{"\n"}.

@item 
gh-130482@footnote{https://github.com/python/cpython/issues/130482}: Add ability to specify name for @code{tkinter.OptionMenu}
and @code{tkinter.ttk.OptionMenu}.

@item 
gh-77065@footnote{https://github.com/python/cpython/issues/77065}: Add keyword-only optional argument `echo_char' for
@ref{21d,,getpass.getpass()} for optional visual keyboard feedback support.
Patch by Semyon Moroz.

@item 
gh-130317@footnote{https://github.com/python/cpython/issues/130317}: Fix @ref{968,,PyFloat_Pack2()} and @ref{96b,,PyFloat_Unpack2()} for
NaN’s with payload.  This corrects round-trip for @ref{185d,,struct.unpack()}
and @ref{147b,,struct.pack()} in case of the IEEE 754 binary16 “half precision”
type. Patch by Sergey B Kirpichev.

@item 
gh-130402@footnote{https://github.com/python/cpython/issues/130402}: Joining running daemon threads during interpreter shutdown now
raises @ref{479,,PythonFinalizationError}.

@item 
gh-130167@footnote{https://github.com/python/cpython/issues/130167}: Improve speed of @ref{2d7,,difflib.IS_LINE_JUNK()}. Patch by Semyon
Moroz.

@item 
gh-101410@footnote{https://github.com/python/cpython/issues/101410}: Added more detailed messages for domain errors in the
@ref{92,,math} module.

@item 
gh-128384@footnote{https://github.com/python/cpython/issues/128384}: Make @ref{179,,warnings.catch_warnings} use a context variable
for holding the warning filtering state if the
@ref{18a,,sys.flags.context_aware_warnings} flag is set to true.  This makes
using the context manager thread-safe in multi-threaded programs.  The
flag is true by default in free-threaded builds and is otherwise false.
The value of the flag can be overridden by the the @ref{16f,,-X context_aware_warnings} command-line option or by the
@geindex PYTHON_CONTEXT_AWARE_WARNINGS
@geindex 환경 변수; PYTHON_CONTEXT_AWARE_WARNINGS
@ref{185e,,PYTHON_CONTEXT_AWARE_WARNINGS} environment variable.

@item 
gh-129719@footnote{https://github.com/python/cpython/issues/129719}: Fix missing @code{socket.CAN_RAW_ERR_FILTER} constant in the
socket module on Linux systems. It was missing since Python 3.11.

@item 
gh-129027@footnote{https://github.com/python/cpython/issues/129027}: Raise @ref{1a3,,DeprecationWarning} for
@ref{292,,sys._clear_type_cache()}. This function was deprecated in Python 3.13
but it didn’t raise a runtime warning.

@item 
gh-128307@footnote{https://github.com/python/cpython/issues/128307}: Add @code{eager_start} keyword argument to
@ref{1ca,,asyncio.loop.create_task()}

@item 
gh-127604@footnote{https://github.com/python/cpython/issues/127604}: Add support for printing the C stack trace on systems that
support it via @ref{20e,,faulthandler.dump_c_stack()} or via the `c_stack'
argument in @ref{20f,,faulthandler.enable()}.

@item 
gh-127385@footnote{https://github.com/python/cpython/issues/127385}: Add the @code{F_DUPFD_QUERY} constant to the @ref{5d,,fcntl} module.

@item 
gh-126838@footnote{https://github.com/python/cpython/issues/126838}: Add `resolve_host' keyword-only parameter to
@ref{2bd,,urllib.request.url2pathname()}, and fix handling of file URLs with
authorities.

@item 
gh-82129@footnote{https://github.com/python/cpython/issues/82129}: Fix @ref{452,,NameError} when calling @ref{8bf,,typing.get_type_hints()}
on a @ref{4e1,,dataclasses.dataclass()} created by
@ref{185f,,dataclasses.make_dataclass()} with un-annotated fields.

@item 
gh-122559@footnote{https://github.com/python/cpython/issues/122559}: Remove @code{__reduce__()} and @code{__reduce_ex__()} methods
that always raise @ref{198,,TypeError} in the C implementation of
@ref{1514,,io.FileIO}, @ref{1413,,io.BufferedReader}, @ref{15b6,,io.BufferedWriter}
and @ref{15b7,,io.BufferedRandom} and replace them with default
@code{__getstate__()} methods that raise @code{TypeError}. This restores
fine details of behavior of Python 3.11 and older versions.

@item 
gh-122179@footnote{https://github.com/python/cpython/issues/122179}: @ref{853,,hashlib.file_digest()} now raises @ref{235,,BlockingIOError}
when no data is available during non-blocking I/O. Before, it added
spurious null bytes to the digest.

@item 
gh-53032@footnote{https://github.com/python/cpython/issues/53032}: Expose @ref{1ff,,decimal.IEEEContext()} to support creation of
contexts corresponding to the IEEE 754 (2008) decimal interchange formats.
Patch by Sergey B Kirpichev.

@item 
gh-120220@footnote{https://github.com/python/cpython/issues/120220}: Deprecate the @code{tkinter.Variable} methods
@code{trace_variable()}, @code{trace_vdelete()} and @code{trace_vinfo()}.
Methods @code{trace_add()}, @code{trace_remove()} and @code{trace_info()}
can be used instead.

@item 
gh-113539@footnote{https://github.com/python/cpython/issues/113539}: @ref{11b,,webbrowser}: Names in the 
@geindex BROWSER
@geindex 환경 변수; BROWSER
@code{BROWSER} environment
variable can now refer to already registered web browsers, instead of
always generating a new browser command.

This makes it possible to set 
@geindex BROWSER
@geindex 환경 변수; BROWSER
@code{BROWSER} to the value of one of the
supported browsers on macOS.

@item 
bpo-44172@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44172}: Keep a reference to original @ref{2f,,curses} windows in
subwindows so that the original window does not get deleted before
subwindows.

@item 
gh-75223@footnote{https://github.com/python/cpython/issues/75223}: Deprecate undotted extensions in
@ref{319,,mimetypes.MimeTypes.add_type()}. Patch by Hugo van Kemenade.
@end itemize

@node IDLE<5>,Documentation<8>,Library<24>,Python 3 14 0 beta 1
@anchor{whatsnew/changelog id99}@anchor{1860}
@subsubsection IDLE



@itemize -

@item 
gh-112936@footnote{https://github.com/python/cpython/issues/112936}: fix IDLE: no Shell menu item in single-process mode.
@end itemize

@node Documentation<8>,Core and Builtins<22>,IDLE<5>,Python 3 14 0 beta 1
@anchor{whatsnew/changelog id100}@anchor{1861}
@subsubsection Documentation



@itemize -

@item 
gh-107006@footnote{https://github.com/python/cpython/issues/107006}: Move documentation and example code for
@ref{1862,,threading.local} from its docstring to the official docs.

@item 
gh-125142@footnote{https://github.com/python/cpython/issues/125142}: As part of the builtin help intro text, show the keyboard
shortcuts for the new, non-basic REPL (F1, F2, and F3).
@end itemize

@node Core and Builtins<22>,Library<25>,Documentation<8>,Python 3 14 0 beta 1
@anchor{whatsnew/changelog id101}@anchor{1863}
@subsubsection Core and Builtins



@itemize -

@item 
gh-133336@footnote{https://github.com/python/cpython/issues/133336}: @code{-J} is no longer reserved for use by Jython. Patch by
Adam Turner.

@item 
gh-133261@footnote{https://github.com/python/cpython/issues/133261}: Fix bug where the cycle GC could untrack objects in the
trashcan because they looked like they were immortal. When objects are
added to the trashcan, we take care to ensure they keep a mortal reference
count.

@item 
gh-133346@footnote{https://github.com/python/cpython/issues/133346}: Added experimental color theming support to the @code{_colorize}
module.

@item 
gh-132917@footnote{https://github.com/python/cpython/issues/132917}: For the free-threaded build, check the process memory usage
increase before triggering a full automatic garbage collection.  If the
memory used has not increased 10% since the last collection then defer it.

@item 
gh-91048@footnote{https://github.com/python/cpython/issues/91048}: Add a new @code{python -m asyncio ps PID} command-line interface to
inspect asyncio tasks in a running Python process. Displays a flat table
of await relationships. A variant showing a tree view is also available as
@code{python -m asyncio pstree PID}. Both are useful for debugging async
code. Patch by Pablo Galindo, Łukasz Langa, Yury Selivanov, and Marta
Gomez Macias.

@item 
gh-133304@footnote{https://github.com/python/cpython/issues/133304}: Workaround NaN’s “canonicalization” in @ref{969,,PyFloat_Pack4()}
and @ref{96c,,PyFloat_Unpack4()} on RISC-V.

@item 
gh-133197@footnote{https://github.com/python/cpython/issues/133197}: Improve @ref{18e,,SyntaxError} error messages for incompatible
string / bytes prefixes.

@item 
gh-133231@footnote{https://github.com/python/cpython/issues/133231}: Add new utilities of observing JIT compilation:
@ref{44f,,sys._jit.is_available()}, @ref{450,,sys._jit.is_enabled()}, and
@ref{1864,,sys._jit.is_active()}.
@end itemize

@node Library<25>,Core and Builtins<23>,Core and Builtins<22>,Python 3 14 0 beta 1
@anchor{whatsnew/changelog id102}@anchor{1865}
@subsubsection Library



@itemize -

@item 
gh-133194@footnote{https://github.com/python/cpython/issues/133194}: @ref{1c2,,ast.parse()} will no longer parse new 
@geindex Python 향상 제안; PEP 758
PEP 758@footnote{https://peps.python.org/pep-0758/} syntax
with older `feature_version' passed.
@end itemize

@node Core and Builtins<23>,Library<26>,Library<25>,Python 3 14 0 beta 1
@anchor{whatsnew/changelog id103}@anchor{1866}
@subsubsection Core and Builtins



@itemize -

@item 
gh-131798@footnote{https://github.com/python/cpython/issues/131798}: Split @code{CALL_LEN} into several uops allowing the JIT to remove
them when optimizing. Patch by Diego Russo.

@item 
gh-131798@footnote{https://github.com/python/cpython/issues/131798}: Use @code{sym_new_type} instead of @code{sym_new_not_null} for
_BUILD_STRING, _BUILD_SET

@item 
gh-132942@footnote{https://github.com/python/cpython/issues/132942}: Fix two races in the type lookup cache.  This affected the
free-threaded build and could cause crashes (apparently quite difficult to
trigger).

@item 
gh-131798@footnote{https://github.com/python/cpython/issues/131798}: Propagate the return type of @code{_BINARY_OP_SUBSCR_TUPLE_INT} in
JIT. Patch by Tomas Roun

@item 
gh-132952@footnote{https://github.com/python/cpython/issues/132952}: Speed up startup with the @code{-S} argument by importing the
private @code{_io} module instead of @ref{83,,io}. This fixes a performance
regression introduced earlier in Python 3.14 development and restores
performance to the level of Python 3.13.

@item 
gh-131798@footnote{https://github.com/python/cpython/issues/131798}: Allow the JIT to remove int guards after @code{_CALL_LEN} by
setting the return type to int. Patch by Diego Russo

@item 
gh-131798@footnote{https://github.com/python/cpython/issues/131798}: Split @code{CALL_TUPLE_1} into several uops allowing the JIT to
remove some of them. Patch by Tomas Roun

@item 
gh-131798@footnote{https://github.com/python/cpython/issues/131798}: Split @code{CALL_STR_1} into several uops allowing the JIT to
remove some of them. Patch by Tomas Roun

@item 
gh-132825@footnote{https://github.com/python/cpython/issues/132825}: Enhance unhashable key/element error messages for @ref{183,,dict}
and @ref{184,,set}. Patch by Victor Stinner.

@item 
gh-131591@footnote{https://github.com/python/cpython/issues/131591}: Reset any 
@geindex Python 향상 제안; PEP 768
PEP 768@footnote{https://peps.python.org/pep-0768/} remote debugging pending call in children
after @ref{4b6,,os.fork()} calls.

@item 
gh-132713@footnote{https://github.com/python/cpython/issues/132713}: Fix @code{repr(list)} race condition: hold a strong reference to
the item while calling @code{repr(item)}. Patch by Victor Stinner.

@item 
gh-132661@footnote{https://github.com/python/cpython/issues/132661}: Implement 
@geindex Python 향상 제안; PEP 750
PEP 750@footnote{https://peps.python.org/pep-0750/} (Template Strings). Add new syntax for
t-strings and implement new internal @code{string.templatelib.Template}
and @code{string.templatelib.Interpolation} types.

@item 
gh-132479@footnote{https://github.com/python/cpython/issues/132479}: Fix compiler crash in certain circumstances where multiple
module-level annotations include comprehensions and other nested scopes.

@item 
gh-132747@footnote{https://github.com/python/cpython/issues/132747}: Fix a crash when calling @ref{16ed,,__get__()} of a
@ref{1867,,method} with a @ref{884,,None} second argument.

@item 
gh-132744@footnote{https://github.com/python/cpython/issues/132744}: Certain calls now check for runaway recursion and respect the
system recursion limit.

@item 
gh-132449@footnote{https://github.com/python/cpython/issues/132449}: Syntax errors that look like misspellings of Python keywords
now provide a helpful fix suggestion for the typo.  Contributed by Pablo
Galindo Salgado.
@end itemize

@node Library<26>,Core and Builtins<24>,Core and Builtins<23>,Python 3 14 0 beta 1
@anchor{whatsnew/changelog id104}@anchor{1868}
@subsubsection Library



@itemize -

@item 
gh-132737@footnote{https://github.com/python/cpython/issues/132737}: Support profiling code that requires @code{__main__}, such as
@ref{ab,,pickle}.
@end itemize

@node Core and Builtins<24>,Library<27>,Library<26>,Python 3 14 0 beta 1
@anchor{whatsnew/changelog id105}@anchor{1869}
@subsubsection Core and Builtins



@itemize -

@item 
gh-132639@footnote{https://github.com/python/cpython/issues/132639}: Added @ref{604,,PyLong_AsNativeBytes()},
@ref{605,,PyLong_FromNativeBytes()} and
@ref{606,,PyLong_FromUnsignedNativeBytes()} to the limited C API.

@item 
gh-100239@footnote{https://github.com/python/cpython/issues/100239}: Add specialisation for @code{BINARY_OP/SUBSCR} on list and slice.

@item 
gh-132508@footnote{https://github.com/python/cpython/issues/132508}: Uses tagged integers on the evaluation stack to represent the
instruction offsets when reraising an exception. This avoids the need to
box the integer which could fail in low memory conditions.

@item 
gh-124476@footnote{https://github.com/python/cpython/issues/124476}: Fix decoding from the locale encoding in the C.UTF-8 locale.

@item 
gh-131927@footnote{https://github.com/python/cpython/issues/131927}: Compiler warnings originating from the same module and line
number are now only emitted once, matching the behaviour of warnings
emitted from user code. This can also be configured with @ref{118,,warnings}
filters.

@item 
gh-132457@footnote{https://github.com/python/cpython/issues/132457}: Make @ref{453,,staticmethod()} and @ref{48f,,classmethod()} generic.

@item 
gh-131798@footnote{https://github.com/python/cpython/issues/131798}: Use @code{sym_new_type} instead of @code{sym_new_not_null} for
_BUILD_LIST, _BUILD_SET, _BUILD_MAP

@item 
gh-131798@footnote{https://github.com/python/cpython/issues/131798}: Split @code{CALL_TYPE_1} into several uops allowing the JIT to
remove some of them.

@item 
gh-132386@footnote{https://github.com/python/cpython/issues/132386}: Fix crash when passing a dict subclass as the @code{globals}
parameter to @ref{4a3,,exec()}.

@item 
gh-127682@footnote{https://github.com/python/cpython/issues/127682}: No longer call @code{__iter__} twice when creating and executing a
generator expression. Creating a generator expression from a non-interable
will raise only when the generator expression is executed. This brings the
behavior of generator expressions in line with other generators.

@item 
gh-132261@footnote{https://github.com/python/cpython/issues/132261}: The internal storage for annotations and annotate functions on
classes now uses different keys in the class dictionary. This eliminates
various edge cases where access to the @code{__annotate__} and
@code{__annotations__} attributes would behave unpredictably.

@item 
gh-132284@footnote{https://github.com/python/cpython/issues/132284}: Don’t wrap base @code{PyCFunction} slots on class creation if not
overridden.

@item 
gh-130415@footnote{https://github.com/python/cpython/issues/130415}: Improve the JIT’s ability to remove unused constant and local
variable loads, and fix an issue where deallocating unused values could
cause JIT code to crash or behave incorrectly.

@item 
gh-126703@footnote{https://github.com/python/cpython/issues/126703}: Fix possible use after free in cases where a method’s
definition has the same lifetime as its @code{self}.

@item 
gh-132286@footnote{https://github.com/python/cpython/issues/132286}: Fix that @ref{186a,,type.__annotate__} was not deleted, when
@ref{1845,,type.__annotations__} was deleted.

@item 
gh-131798@footnote{https://github.com/python/cpython/issues/131798}: Allow the JIT to remove an extra @code{_TO_BOOL_BOOL} instruction
after @code{_CONTAINS_OP_DICT} by setting the return type to bool.

@item 
gh-124715@footnote{https://github.com/python/cpython/issues/124715}: Prevents against stack overflows when calling
@ref{78f,,Py_DECREF()}. Third-party extension objects no longer need to use
the “trashcan” mechanism, as protection is now built into the
@code{Py_DECREF()} macro.

@item 
gh-131798@footnote{https://github.com/python/cpython/issues/131798}: Allow the JIT compiler to remove some type checks for
operations on lists, tuples, dictionaries, and sets.

@item 
gh-128398@footnote{https://github.com/python/cpython/issues/128398}: Improve error message when an object supporting the synchronous
(resp. asynchronous) context manager protocol is entered using
@ref{185,,async with} (resp. @ref{186,,with}) instead of @code{with}
(resp. @code{async with}). Patch by Bénédikt Tran.

@item 
gh-131798@footnote{https://github.com/python/cpython/issues/131798}: Allow the JIT to remove unicode guards after
@code{_BINARY_OP_SUBSCR_STR_INT} by setting the return type to string.

@item 
gh-131878@footnote{https://github.com/python/cpython/issues/131878}: Handle uncaught exceptions in the main input loop for the new
REPL.

@item 
gh-131878@footnote{https://github.com/python/cpython/issues/131878}: Fix support of unicode characters with two or more codepoints
on Windows in the new REPL.

@item 
gh-126835@footnote{https://github.com/python/cpython/issues/126835}: Move constant folding to the peephole optimizer. Rename AST
optimization related files (Python/ast_opt.c -> Python/ast_preprocess.c),
structs (_PyASTOptimizeState -> _PyASTPreprocessState) and functions
(_PyAST_Optimize -> _PyAST_Preprocess, _PyCompile_AstOptimize ->
_PyCompile_AstPreprocess).

@item 
gh-114809@footnote{https://github.com/python/cpython/issues/114809}: Add support for macOS multi-arch builds with the JIT enabled

@item 
gh-131507@footnote{https://github.com/python/cpython/issues/131507}: PyREPL now supports syntax highlighting. Contributed by Łukasz
Langa.

@item 
gh-130907@footnote{https://github.com/python/cpython/issues/130907}: If the @code{__annotations__} of a module object are accessed
while the module is executing, return the annotations that have been
defined so far, without caching them.

@item 
gh-130104@footnote{https://github.com/python/cpython/issues/130104}: Three-argument @ref{1a4,,pow()} now try calling
@ref{1a5,,__rpow__()} if necessary. Previously it was only called in
two-argument @code{pow()} and the binary power operator.

@item 
gh-130070@footnote{https://github.com/python/cpython/issues/130070}: Fixed an assertion error for @ref{4a3,,exec()} passed a string
@code{source} and a non-@code{None} @code{closure}. Patch by Bartosz Sławecki.

@item 
gh-129958@footnote{https://github.com/python/cpython/issues/129958}: Fix a bug that was allowing newlines inconsistently in format
specifiers for single-quoted f-strings. Patch by Pablo Galindo.

@item 
gh-129858@footnote{https://github.com/python/cpython/issues/129858}: @code{elif} statements that follow an @code{else} block now have a
specific error message.

@item 
gh-69605@footnote{https://github.com/python/cpython/issues/69605}: Add module autocomplete to PyREPL.

@item 
gh-128555@footnote{https://github.com/python/cpython/issues/128555}: Add the @ref{175,,sys.flags.thread_inherit_context} flag.


@itemize *

@item 
This flag is set to true by default on the free-threaded build
and false otherwise.  If the flag is true, starting a new thread using
@ref{176,,threading.Thread} will, by default, use a copy of the
@ref{177,,contextvars.Context} from the caller of
@ref{178,,threading.Thread.start()} rather than using an empty context.

@item 
Add the @ref{16f,,-X thread_inherit_context} command-line option and
@geindex PYTHON_THREAD_INHERIT_CONTEXT
@geindex 환경 변수; PYTHON_THREAD_INHERIT_CONTEXT
@ref{186b,,PYTHON_THREAD_INHERIT_CONTEXT} environment variable, which set the
@ref{175,,thread_inherit_context} flag.

@item 
Add the @code{context} keyword parameter to @ref{176,,Thread}.  It can
be used to explicitly pass a context value to be used by a new thread.

@item 
Make the @code{_contextvars} module built-in.
@end itemize

@item 
gh-123539@footnote{https://github.com/python/cpython/issues/123539}: Improve @ref{18e,,SyntaxError} message for using @code{import ... as}
and @code{from ... import ... as} with not a name.

@item 
gh-102567@footnote{https://github.com/python/cpython/issues/102567}: @ref{16f,,-X importtime} now accepts value @code{2}, which
indicates that an @code{importtime} entry should also be printed if an
imported module has already been loaded. Patch by Noah Kim and Adam
Turner.

@item 
gh-116436@footnote{https://github.com/python/cpython/issues/116436}: Improve error message when @ref{198,,TypeError} occurs during
@ref{166a,,dict.update()}

@item 
gh-103997@footnote{https://github.com/python/cpython/issues/103997}: String arguments passed to “-c” are now automatically dedented
as if by @ref{1a9,,textwrap.dedent()}. This allows “python -c” invocations to
be indented in shell scripts without causing indentation errors. (Patch by
Jon Crall and Steven Sun)
@end itemize

@node Library<27>,C API<9>,Core and Builtins<24>,Python 3 14 0 beta 1
@anchor{whatsnew/changelog id106}@anchor{186c}
@subsubsection Library



@itemize -

@item 
gh-89562@footnote{https://github.com/python/cpython/issues/89562}: Remove @code{hostflags} member from @code{PySSLContext} struct.
@end itemize

@node C API<9>,Build<9>,Library<27>,Python 3 14 0 beta 1
@anchor{whatsnew/changelog id107}@anchor{186d}
@subsubsection C API



@itemize -

@item 
gh-133166@footnote{https://github.com/python/cpython/issues/133166}: Fix regression where @ref{633,,PyType_GetModuleByDef()} returns
NULL without setting @ref{198,,TypeError} when a static type is passed.

@item 
gh-133164@footnote{https://github.com/python/cpython/issues/133164}: Add @ref{3c7,,PyUnstable_Object_IsUniqueReferencedTemporary()}
function for determining if an object exists as a unique temporary
variable on the interpreter’s stack.  This is a replacement for some cases
where checking that @ref{2cf,,Py_REFCNT()} is one is no longer sufficient to
determine if it’s safe to modify a Python object in-place with no visible
side effects.

@item 
gh-133140@footnote{https://github.com/python/cpython/issues/133140}: Add @ref{3c6,,PyUnstable_Object_IsUniquelyReferenced()} as a
replacement for @code{Py_REFNCT(op) == 1} on @ref{1f4,,free threaded} builds of Python.

@item 
gh-131747@footnote{https://github.com/python/cpython/issues/131747}: On non-Windows platforms, deprecate using
@ref{317,,ctypes.Structure._pack_} to use a Windows-compatible layout on
non-Windows platforms. The layout should be specified explicitly by
setting @ref{1e7,,ctypes.Structure._layout_} to @code{'ms'}.

@item 
gh-128972@footnote{https://github.com/python/cpython/issues/128972}: For non-free-threaded builds, the memory layout of
@ref{137a,,PyASCIIObject} is reverted to match Python 3.13. (Note that the
structure is not part of stable ABI and so its memory layout is
`guaranteed' to remain stable.)

@item 
gh-133079@footnote{https://github.com/python/cpython/issues/133079}: The undocumented APIs @code{Py_C_RECURSION_LIMIT} and
@code{PyThreadState.c_recursion_remaining}, added in 3.13, are
removed without a deprecation period.

@item 
gh-132987@footnote{https://github.com/python/cpython/issues/132987}: The @code{k} and @code{K} formats in @ref{1811,,PyArg_Parse()} now
support the @ref{19e,,__index__()} special method, like all other
integer formats.

@item 
gh-132909@footnote{https://github.com/python/cpython/issues/132909}: Fix an overflow when handling the @ref{186e,,K} format in @ref{3c2,,Py_BuildValue()}. Patch by
Bénédikt Tran.

@item 
gh-132798@footnote{https://github.com/python/cpython/issues/132798}: Deprecated and undocumented functions
@code{PyUnicode_AsEncodedObject()},
@code{PyUnicode_AsDecodedObject()},
@code{PyUnicode_AsEncodedUnicode()} and
@code{PyUnicode_AsDecodedUnicode()} are scheduled for removal in 3.15.

@item 
gh-132470@footnote{https://github.com/python/cpython/issues/132470}: Creating a @ref{1e8,,ctypes.CField} with a `byte_size' that does
not match the actual type size now raises a @ref{2ec,,ValueError} instead of
crashing the interpreter.

@item 
gh-112068@footnote{https://github.com/python/cpython/issues/112068}: [Reverted in gh-136991@footnote{https://github.com/python/cpython/issues/136991}] Add support of nullable arguments in
@ref{1811,,PyArg_Parse()} and similar functions. Adding @code{?} after any format
unit makes @code{None} be accepted as a value.

@item 
gh-50333@footnote{https://github.com/python/cpython/issues/50333}: Non-tuple sequences are deprecated as argument for the
@code{(items)} format unit in @ref{3c1,,PyArg_ParseTuple()} and other
@ref{3d5,,argument parsing} functions if `items' contains format
units which store a @ref{3d6,,borrowed buffer} or a
@ref{3d7,,borrowed reference}.
@end itemize

@node Build<9>,,C API<9>,Python 3 14 0 beta 1
@anchor{whatsnew/changelog id108}@anchor{186f}
@subsubsection Build



@itemize -

@item 
gh-113464@footnote{https://github.com/python/cpython/issues/113464}: Use the cpython-bin-deps “externals” repository for Windows
LLVM dependency management. Installing LLVM manually is no longer
necessary for Windows JIT builds.

@item 
gh-133183@footnote{https://github.com/python/cpython/issues/133183}: iOS compiler shims now include @code{IPHONEOS_DEPLOYMENT_TARGET}
in target triples, ensuring that SDK version minimums are honored.

@item 
gh-133167@footnote{https://github.com/python/cpython/issues/133167}: Fix compilation process with @code{--enable-optimizations} and
@code{--without-docstrings}.

@item 
gh-133171@footnote{https://github.com/python/cpython/issues/133171}: Since free-threaded builds do not support the experimental JIT
compiler, prevent these configurations from being combined.

@item 
gh-132758@footnote{https://github.com/python/cpython/issues/132758}: Fix building with tail call interpreter and pystats.

@item 
gh-132649@footnote{https://github.com/python/cpython/issues/132649}: The @code{PClayout} script now allows passing
@code{--include-tcltk} on Windows ARM64.

@item 
gh-132257@footnote{https://github.com/python/cpython/issues/132257}: Change the default LTO flags on GCC to not pass
@code{-flto-partition=none}, and allow parallelization of LTO. For newer GNU
makes and GCC, this has a multiple factor speedup for LTO build times,
with no noticeable loss in performance.

@item 
gh-132026@footnote{https://github.com/python/cpython/issues/132026}: Fix use of undefined identifiers in platform triplet detection
on MIPS Linux platforms.
@end itemize

@node Python 3 14 0 alpha 7,Python 3 14 0 alpha 6,Python 3 14 0 beta 1,Changelog
@anchor{whatsnew/changelog python-3-14-0-alpha-7}@anchor{1870}
@subsection Python 3.14.0 alpha 7


`Release date: 2025-04-08'

@menu
* macOS: macOS<4>. 
* Windows: Windows<10>. 
* Tools/Demos: Tools/Demos<9>. 
* Tests: Tests<8>. 
* Security: Security<12>. 
* Library: Library<28>. 
* Documentation: Documentation<9>. 
* Core and Builtins: Core and Builtins<25>. 
* Library: Library<29>. 
* Core and Builtins: Core and Builtins<26>. 
* C API: C API<10>. 
* Build: Build<10>. 

@end menu

@node macOS<4>,Windows<10>,,Python 3 14 0 alpha 7
@anchor{whatsnew/changelog id109}@anchor{1871}
@subsubsection macOS



@itemize -

@item 
gh-124111@footnote{https://github.com/python/cpython/issues/124111}: Update macOS installer to use Tcl/Tk 8.6.16.

@item 
gh-131423@footnote{https://github.com/python/cpython/issues/131423}: Update macOS installer to use OpenSSL 3.0.16. Patch by Bénédikt
Tran.

@item 
gh-131025@footnote{https://github.com/python/cpython/issues/131025}: Update macOS installer to ship with SQLite 3.49.1.
@end itemize

@node Windows<10>,Tools/Demos<9>,macOS<4>,Python 3 14 0 alpha 7
@anchor{whatsnew/changelog id110}@anchor{1872}
@subsubsection Windows



@itemize -

@item 
gh-131423@footnote{https://github.com/python/cpython/issues/131423}: Update bundled version of OpenSSL to 3.0.16. The new build also
disables uplink support, which may be relevant to embedders but has no
impact on normal use.

@item 
gh-131453@footnote{https://github.com/python/cpython/issues/131453}: Some @code{SND_*} and @code{MB_*} constants are added to
@ref{11d,,winsound}.

@item 
gh-91349@footnote{https://github.com/python/cpython/issues/91349}: Replaces our copy of @code{zlib} with @code{zlib-ng}, for performance
improvements in @ref{139,,zlib}.

@item 
gh-131025@footnote{https://github.com/python/cpython/issues/131025}: Update Windows installer to ship with SQLite 3.49.1.
@end itemize

@node Tools/Demos<9>,Tests<8>,Windows<10>,Python 3 14 0 alpha 7
@anchor{whatsnew/changelog id111}@anchor{1873}
@subsubsection Tools/Demos



@itemize -

@item 
gh-132121@footnote{https://github.com/python/cpython/issues/132121}: Always escape non-printable Unicode characters in
@code{pygettext}.

@item 
gh-131852@footnote{https://github.com/python/cpython/issues/131852}: @code{msgfmt} no longer adds the @code{POT-Creation-Date} to
generated @code{.mo} files for consistency with GNU @code{msgfmt}.
@end itemize

@node Tests<8>,Security<12>,Tools/Demos<9>,Python 3 14 0 alpha 7
@anchor{whatsnew/changelog id112}@anchor{1874}
@subsubsection Tests



@itemize -

@item 
gh-131277@footnote{https://github.com/python/cpython/issues/131277}: Allow to unset one or more environment variables at once via
@ref{1875,,EnvironmentVarGuard.unset()}. Patch by Bénédikt
Tran.

@item 
gh-131050@footnote{https://github.com/python/cpython/issues/131050}: @code{test_ssl.test_dh_params} is skipped if the underlying TLS
library does not support finite-field ephemeral Diffie-Hellman.
@end itemize

@node Security<12>,Library<28>,Tests<8>,Python 3 14 0 alpha 7
@anchor{whatsnew/changelog id113}@anchor{1876}
@subsubsection Security



@itemize -

@item 
gh-131809@footnote{https://github.com/python/cpython/issues/131809}: Update bundled libexpat to 2.7.1

@item 
gh-131261@footnote{https://github.com/python/cpython/issues/131261}: Upgrade to libexpat 2.7.0

@item 
gh-121284@footnote{https://github.com/python/cpython/issues/121284}: Fix bug in the folding of rfc2047 encoded-words when flattening
an email message using a modern email policy. Previously when an
encoded-word was too long for a line, it would be decoded, split across
lines, and re-encoded. But commas and other special characters in the
original text could be left unencoded and unquoted. This could
theoretically be used to spoof header lines using a carefully constructed
encoded-word if the resulting rendered email was transmitted or re-parsed.
@end itemize

@node Library<28>,Documentation<9>,Security<12>,Python 3 14 0 alpha 7
@anchor{whatsnew/changelog id114}@anchor{1877}
@subsubsection Library



@itemize -

@item 
gh-132174@footnote{https://github.com/python/cpython/issues/132174}: Fix function name in error message of
@code{_interpreters.run_string}.

@item 
gh-132171@footnote{https://github.com/python/cpython/issues/132171}: Fix crash of @code{_interpreters.run_string} on string subclasses.

@item 
gh-129204@footnote{https://github.com/python/cpython/issues/129204}: Introduce new @code{_PYTHON_SUBPROCESS_USE_POSIX_SPAWN}
environment variable knob in @ref{dc,,subprocess} to control the use of
@ref{52e,,os.posix_spawn()}.

@item 
gh-132159@footnote{https://github.com/python/cpython/issues/132159}: Do not shadow user arguments in generated @code{__new__()} by
decorator @ref{48a,,warnings.deprecated}. Patch by Xuehai Pan.

@item 
gh-132168@footnote{https://github.com/python/cpython/issues/132168}: The @ref{1f3,,ctypes.py_object} type now supports subscription,
making it a @ref{1a1,,generic type}.

@item 
gh-84481@footnote{https://github.com/python/cpython/issues/84481}: Add the @code{zipfile.ZipFile.data_offset} attribute, which
stores the offset to the beginning of ZIP data in a file when available.
When the @ref{8d2,,zipfile.ZipFile} is opened in either mode @code{'w'} or
@code{'x'} and the underlying file does not support @code{tell()}, the value
will be @code{None} instead.

@item 
gh-132075@footnote{https://github.com/python/cpython/issues/132075}: Fix possible use of @ref{d1,,socket} address structures with
uninitialized members. Now all structure members are initialized with
zeroes by default.

@item 
gh-118761@footnote{https://github.com/python/cpython/issues/118761}: Improve import times by up to 27x for the @ref{d8,,string} module.
Patch by Adam Turner.

@item 
gh-125434@footnote{https://github.com/python/cpython/issues/125434}: Display thread name in @ref{5c,,faulthandler}. Patch by Victor
Stinner.

@item 
gh-132002@footnote{https://github.com/python/cpython/issues/132002}: Fix crash when deallocating @ref{1878,,contextvars.ContextVar}
with weird unahashable string names.

@item 
gh-131938@footnote{https://github.com/python/cpython/issues/131938}: @ref{12b,,xml.etree.ElementTree}: update the error message when an
element to remove via @ref{1879,,Element.remove} is not found. Patch by Bénédikt
Tran.

@item 
gh-115942@footnote{https://github.com/python/cpython/issues/115942}: Add @ref{183e,,threading.RLock.locked()},
@ref{187a,,multiprocessing.Lock.locked()}, @ref{187b,,multiprocessing.RLock.locked()},
and allow @ref{159c,,multiprocessing.managers.SyncManager.Lock()} and
@ref{159d,,multiprocessing.managers.SyncManager.RLock()} to proxy @code{locked()}
call.

@item 
gh-131974@footnote{https://github.com/python/cpython/issues/131974}: Fix several thread-safety issues in @ref{2e,,ctypes} on the
@ref{1f4,,free threaded} build.

@item 
gh-118761@footnote{https://github.com/python/cpython/issues/118761}: Improve the import time of the @ref{9,,ast} module by extracting
the @ref{ae2,,unparse()} function to a helper module.

@item 
gh-107369@footnote{https://github.com/python/cpython/issues/107369}: Improved performance of @ref{57c,,textwrap.indent()} by an average
of ~1.3x. Patch by Adam Turner.

@item 
gh-131792@footnote{https://github.com/python/cpython/issues/131792}: Improved performance of @ref{1a9,,textwrap.dedent()} by an average
of ~2.4x, (with improvements of up to 4x for large inputs), and fixed a
bug where blank lines with whitespace characters other than space or
horizontal tab were not normalised to the newline. Patch by Adam Turner,
Marius Juston, and Pieter Eendebak.

@item 
gh-131668@footnote{https://github.com/python/cpython/issues/131668}: @ref{d1,,socket}: Fix code parsing AF_BLUETOOTH socket addresses.

@item 
gh-60115@footnote{https://github.com/python/cpython/issues/60115}: Support frozen modules for @ref{240,,linecache.getline()}.

@item 
gh-131492@footnote{https://github.com/python/cpython/issues/131492}: Fix a resource leak when constructing a @ref{65a,,gzip.GzipFile}
with a filename fails, for example when passing an invalid
@code{compresslevel}.

@item 
gh-131435@footnote{https://github.com/python/cpython/issues/131435}: 10-20% performance improvement of @ref{1434,,random.randint()}.

@item 
gh-131461@footnote{https://github.com/python/cpython/issues/131461}: Fix @ref{54e,,ResourceWarning} when constructing a
@ref{65a,,gzip.GzipFile} in write mode with a broken file object.

@item 
gh-125866@footnote{https://github.com/python/cpython/issues/125866}: Deprecate the @code{nturl2path} module. Call
@ref{2bd,,urllib.request.url2pathname()} and
@ref{2bf,,pathname2url()} instead.

@item 
gh-126367@footnote{https://github.com/python/cpython/issues/126367}: Fix issue where @ref{2bd,,urllib.request.url2pathname()} raised
@ref{2c0,,OSError} when given a Windows URI containing a colon character not
following a drive letter, such as before an NTFS alternate data stream.

@item 
gh-120144@footnote{https://github.com/python/cpython/issues/120144}: Disable @code{CALL} event in @ref{10,,bdb} in @code{monitoring} backend
when we don’t need any new events on the code object to get a better
performance.

@item 
gh-131358@footnote{https://github.com/python/cpython/issues/131358}: Register @code{cseuckr} as an encoding alias for @code{euc_kr}.

@item 
gh-131325@footnote{https://github.com/python/cpython/issues/131325}: Fix sendfile fallback implementation to drain data after
writing to transport in @ref{b,,asyncio}.

@item 
gh-90548@footnote{https://github.com/python/cpython/issues/90548}: @ref{17f8,,platform.libc_ver()} can now detect and report the version
of @code{musl} on Alpine Linux.

@item 
gh-129843@footnote{https://github.com/python/cpython/issues/129843}: Fix incorrect argument passing in
@ref{efc,,warnings.warn_explicit()}.

@item 
gh-70647@footnote{https://github.com/python/cpython/issues/70647}: When creating a @ref{34,,datetime} object with an out of range date
a more informative error is raised.

@item 
gh-130914@footnote{https://github.com/python/cpython/issues/130914}: Allow @ref{21f,,graphlib.TopologicalSorter.prepare()} to be called
more than once as long as sorting has not started. Patch by Daniel Pope.

@item 
gh-131236@footnote{https://github.com/python/cpython/issues/131236}: Allow to generate multiple UUIDs at once via @ref{2c7,,python -m uuid --count}.

@item 
gh-126895@footnote{https://github.com/python/cpython/issues/126895}: Fix @ref{bf,,readline} in @ref{1f4,,free-threaded}
build.

@item 
gh-121468@footnote{https://github.com/python/cpython/issues/121468}: @code{$_asynctask} is added as a @ref{aa,,pdb} convenience variable
to access the current asyncio task if applicable.

@item 
gh-118761@footnote{https://github.com/python/cpython/issues/118761}: Improve import time of @ref{8a,,locale} using lazy import @code{re}.
Patch by Semyon Moroz.

@item 
gh-129598@footnote{https://github.com/python/cpython/issues/129598}: Fix @ref{ae2,,ast.unparse()} when @ref{187c,,ast.Interactive} contains
multiple statements.

@item 
gh-85162@footnote{https://github.com/python/cpython/issues/85162}: The @ref{76,,http.server} module now includes built-in support for
HTTPS servers exposed by @ref{228,,http.server.HTTPSServer}. This
functionality is exposed by the command-line interface (@code{python -m
http.server}) through the @code{--tls-cert}, @code{--tls-key} and
@code{--tls-password-file} options. Patch by Semyon Moroz.

@item 
gh-129463@footnote{https://github.com/python/cpython/issues/129463}: The implementations of equality and hashing for
@ref{177e,,annotationlib.ForwardRef} now use all attributes on the object.
Two @code{ForwardRef} objects are equal only if all attributes are
equal.

@item 
gh-128593@footnote{https://github.com/python/cpython/issues/128593}: @ref{177e,,annotationlib.ForwardRef} objects no longer cache their
value when they are successfully evaluated. Successive calls to
@ref{17b9,,annotationlib.ForwardRef.evaluate()} may return different values.

@item 
gh-117779@footnote{https://github.com/python/cpython/issues/117779}: Fix reading duplicated entries in @ref{137,,zipfile} by name.
Reading duplicated entries (except the last one) by @code{ZipInfo} now emits
a warning instead of raising an exception.

@item 
gh-128715@footnote{https://github.com/python/cpython/issues/128715}: The class of @ref{1e5,,Structure}/@ref{1e6,,Union}
field descriptors is now available as @ref{1e8,,CField}, and has new
attributes to aid debugging and introspection.

@item 
gh-128055@footnote{https://github.com/python/cpython/issues/128055}: Fix @code{test.test_sysconfig.test_sysconfigdata_json} when
running outside the build directory (eg. after installing).

@item 
gh-126037@footnote{https://github.com/python/cpython/issues/126037}: @ref{12b,,xml.etree.ElementTree}: Fix a crash in
@ref{187d,,Element.find},
@ref{187e,,Element.findtext} and
@ref{187f,,Element.findall} when the
tag to find implements an @ref{cf1,,__eq__()} method mutating the
element being queried. Patch by Bénédikt Tran.

@item 
gh-127794@footnote{https://github.com/python/cpython/issues/127794}: When headers are added to @ref{580,,email.message.Message}
objects, either through @ref{1880,,email.message.Message.__setitem__()} or
@ref{1881,,email.message.Message.add_header()}, the field name is now validated
according to 
@geindex RFC; RFC 5322 Section 2.2
RFC 5322@comma{} Section 2.2@footnote{https://datatracker.ietf.org/doc/html/rfc5322.html#section-2.2} and a
@ref{2ec,,ValueError} is raised if the field name contains any invalid
characters.

@item 
gh-123599@footnote{https://github.com/python/cpython/issues/123599}: Deprecate @code{pathlib.PurePath.as_uri()}; use
@ref{31c,,pathlib.Path.as_uri()} instead.

@item 
gh-126033@footnote{https://github.com/python/cpython/issues/126033}: @ref{12b,,xml.etree.ElementTree}: Fix a crash in
@ref{1879,,Element.remove} when the
element is concurrently mutated. Patch by Bénédikt Tran.

@item 
gh-120144@footnote{https://github.com/python/cpython/issues/120144}: Add the optional backend of @code{sys.monitoring} to @ref{10,,bdb}
and use it for @ref{aa,,pdb}.

@item 
gh-74598@footnote{https://github.com/python/cpython/issues/74598}: Add @ref{211,,fnmatch.filterfalse()} for excluding names matching a
pattern. Patch by Bénédikt Tran.

@item 
gh-114917@footnote{https://github.com/python/cpython/issues/114917}: Add support for AI_NUMERICSERV in getaddrinfo emulation

@item 
bpo-17254@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17254}: Added aliases for Thai Language using Microsoft Code Pages.
@end itemize

@node Documentation<9>,Core and Builtins<25>,Library<28>,Python 3 14 0 alpha 7
@anchor{whatsnew/changelog id115}@anchor{1882}
@subsubsection Documentation



@itemize -

@item 
gh-131417@footnote{https://github.com/python/cpython/issues/131417}: Mention @ref{dc5,,asyncio.Future} and @ref{1c7,,asyncio.Task} in
generic classes list.
@end itemize

@node Core and Builtins<25>,Library<29>,Documentation<9>,Python 3 14 0 alpha 7
@anchor{whatsnew/changelog id116}@anchor{1883}
@subsubsection Core and Builtins



@itemize -

@item 
gh-131798@footnote{https://github.com/python/cpython/issues/131798}: Allow the JIT to remove an extra @code{_TO_BOOL_BOOL} instruction
after @code{_CONTAINS_OP_SET} by setting the return type to bool.

@item 
gh-132011@footnote{https://github.com/python/cpython/issues/132011}: Fix crash when calling @ref{8db,,list.append()} as an unbound
method.

@item 
gh-131998@footnote{https://github.com/python/cpython/issues/131998}: Fix a crash when using an unbound method @ref{1884,,descriptor}
object in a function where a bound method descriptor was used.

@item 
gh-131591@footnote{https://github.com/python/cpython/issues/131591}: Implement 
@geindex Python 향상 제안; PEP 768
PEP 768@footnote{https://peps.python.org/pep-0768/} (Safe external debugger interface for
CPython). Add a new @ref{16d,,sys.remote_exec()} function to the @ref{df,,sys}
module. This function schedules the execution of a Python file in a
separate process. Patch by Pablo Galindo, Matt Wozniski and Ivona
Stojanovic.

@item 
gh-131798@footnote{https://github.com/python/cpython/issues/131798}: Allow JIT to omit str guard in truthiness test when str type is
known.

@item 
gh-131833@footnote{https://github.com/python/cpython/issues/131833}: Add support for optionally dropping grouping parentheses when
using multiple exception types as per 
@geindex Python 향상 제안; PEP 758
PEP 758@footnote{https://peps.python.org/pep-0758/}. Patch by Pablo Galindo

@item 
gh-130924@footnote{https://github.com/python/cpython/issues/130924}: Usage of a name in a function-scope annotation no longer
triggers creation of a cell for that variable. This fixes a regression in
earlier alphas of Python 3.14.

@item 
gh-131800@footnote{https://github.com/python/cpython/issues/131800}: Improve the experimental JIT’s ability to remove type checks
for certain subscripting operations.

@item 
gh-131738@footnote{https://github.com/python/cpython/issues/131738}: Compiler emits optimized code for builtin any/all/tuple calls
over a generator expression.

@item 
gh-131719@footnote{https://github.com/python/cpython/issues/131719}: Fix missing NULL check in @code{_PyMem_FreeDelayed} in
@ref{1f4,,free-threaded} build.

@item 
gh-131670@footnote{https://github.com/python/cpython/issues/131670}: Fix @ref{9d6,,anext()} failing on sync @ref{1885,,__anext__()}
raising an exception.

@item 
gh-131666@footnote{https://github.com/python/cpython/issues/131666}: Fix signature of @code{anext_awaitable.close} objects. Patch by
Bénédikt Tran.

@item 
gh-130415@footnote{https://github.com/python/cpython/issues/130415}: Optimize comparison of two constants in JIT builds

@item 
gh-129149@footnote{https://github.com/python/cpython/issues/129149}: Add fast path for small and medium-size integers in
@ref{3a3,,PyLong_FromInt32()}, @ref{3a5,,PyLong_FromUInt32()},
@ref{3a4,,PyLong_FromInt64()} and @ref{3a6,,PyLong_FromUInt64()}. Patch by Chris
Eibl.

@item 
gh-130887@footnote{https://github.com/python/cpython/issues/130887}: Optimize the AArch64 code generation for the JIT. Patch by
Diego Russo

@item 
gh-130956@footnote{https://github.com/python/cpython/issues/130956}: Optimize the AArch64 code generation for the JIT. Patch by
Diego Russo

@item 
gh-130928@footnote{https://github.com/python/cpython/issues/130928}: Fix error message when formatting bytes using the @code{'i'} flag.
Patch by Maxim Ageev.

@item 
gh-130935@footnote{https://github.com/python/cpython/issues/130935}: Annotations at the class and module level that are
conditionally defined are now only reflected in @code{__annotations__} if the
block they are in is executed. Patch by Jelle Zijlstra.

@item 
gh-130775@footnote{https://github.com/python/cpython/issues/130775}: Do not crash on negative @code{column} and @code{end_column} in
@ref{9,,ast} locations.

@item 
gh-130704@footnote{https://github.com/python/cpython/issues/130704}: Optimize @code{LOAD_FAST} and its superinstruction form to reduce
reference counting overhead. These instructions are replaced with faster
variants that load borrowed references onto the operand stack when we can
prove that the reference in the frame outlives the reference loaded onto
the stack.

@item 
gh-88887@footnote{https://github.com/python/cpython/issues/88887}: Fixing multiprocessing Resource Tracker process leaking, usually
observed when running Python as PID 1.

@item 
gh-130115@footnote{https://github.com/python/cpython/issues/130115}: Fix an issue with thread identifiers being sign-extended on
some platforms.
@end itemize

@node Library<29>,Core and Builtins<26>,Core and Builtins<25>,Python 3 14 0 alpha 7
@anchor{whatsnew/changelog id117}@anchor{1886}
@subsubsection Library



@itemize -

@item 
gh-99108@footnote{https://github.com/python/cpython/issues/99108}: Add support for built-in implementation of HMAC (
@geindex RFC; RFC 2104
RFC 2104@footnote{https://datatracker.ietf.org/doc/html/rfc2104.html})
based on HACL*. Patch by Bénédikt Tran.
@end itemize

@node Core and Builtins<26>,C API<10>,Library<29>,Python 3 14 0 alpha 7
@anchor{whatsnew/changelog id118}@anchor{1887}
@subsubsection Core and Builtins



@itemize -

@item 
gh-130080@footnote{https://github.com/python/cpython/issues/130080}: Implement PEP 765: Disallow return/break/continue that exit a
finally block.

@item 
gh-129900@footnote{https://github.com/python/cpython/issues/129900}: Fix return codes inside @ref{f3b,,SystemExit} not getting returned
by the REPL.

@item 
gh-128632@footnote{https://github.com/python/cpython/issues/128632}: Disallow @code{__classdict__} as the name of a type parameter.
Using this name would previously crash the interpreter in some
circumstances.

@item 
gh-126703@footnote{https://github.com/python/cpython/issues/126703}: Improve performance of builtin methods by using a freelist.

@item 
gh-126703@footnote{https://github.com/python/cpython/issues/126703}: Improve performance of  @ref{b3d,,range} by using a freelist.
@end itemize

@node C API<10>,Build<10>,Core and Builtins<26>,Python 3 14 0 alpha 7
@anchor{whatsnew/changelog id119}@anchor{1888}
@subsubsection C API



@itemize -

@item 
gh-131740@footnote{https://github.com/python/cpython/issues/131740}: Update PyUnstable_GC_VisitObjects to traverse perm gen.

@item 
gh-131525@footnote{https://github.com/python/cpython/issues/131525}: The PyTupleObject now caches the computed hash value in the new
field ob_hash.
@end itemize

@node Build<10>,,C API<10>,Python 3 14 0 alpha 7
@anchor{whatsnew/changelog id120}@anchor{1889}
@subsubsection Build



@itemize -

@item 
gh-131865@footnote{https://github.com/python/cpython/issues/131865}: The DTrace build now properly passes the @code{CC} and @code{CFLAGS}
variables to the @code{dtrace} command when utilizing SystemTap on Linux.

@item 
gh-131675@footnote{https://github.com/python/cpython/issues/131675}: Fix mimalloc library builds for 32-bit ARM targets.

@item 
gh-131691@footnote{https://github.com/python/cpython/issues/131691}: clang-cl on Windows needs option @code{/EHa} to support SEH
(structured exception handling) correctly. Fix by Chris Eibl.

@item 
gh-131278@footnote{https://github.com/python/cpython/issues/131278}: Add optimizing flag @code{WITH_COMPUTED_GOTOS} to Windows builds
for when using a compiler that supports it (currently clang-cl). Patch by
Chris Eibl.

@item 
gh-130213@footnote{https://github.com/python/cpython/issues/130213}: Update the vendored HACL* library to fix build issues with
older clang compilers.

@item 
gh-130673@footnote{https://github.com/python/cpython/issues/130673}: Fix potential @code{KeyError} when handling object sections during
JIT building process.
@end itemize

@node Python 3 14 0 alpha 6,Python 3 14 0 alpha 5,Python 3 14 0 alpha 7,Changelog
@anchor{whatsnew/changelog python-3-14-0-alpha-6}@anchor{188a}
@subsection Python 3.14.0 alpha 6


`Release date: 2025-03-14'

@menu
* macOS: macOS<5>. 
* Windows: Windows<11>. 
* Tools/Demos: Tools/Demos<10>. 
* Tests: Tests<9>. 
* Security: Security<13>. 
* Library: Library<30>. 
* Documentation: Documentation<10>. 
* Core and Builtins: Core and Builtins<27>. 
* Library: Library<31>. 
* Core and Builtins: Core and Builtins<28>. 
* Library: Library<32>. 
* Core and Builtins: Core and Builtins<29>. 
* C API: C API<11>. 
* Build: Build<11>. 

@end menu

@node macOS<5>,Windows<11>,,Python 3 14 0 alpha 6
@anchor{whatsnew/changelog id121}@anchor{188b}
@subsubsection macOS



@itemize -

@item 
gh-128540@footnote{https://github.com/python/cpython/issues/128540}: Ensure web browser is launched by @ref{175d,,webbrowser.open()} on
macOS, even for @code{file://} URLs.
@end itemize

@node Windows<11>,Tools/Demos<10>,macOS<5>,Python 3 14 0 alpha 6
@anchor{whatsnew/changelog id122}@anchor{188c}
@subsubsection Windows



@itemize -

@item 
gh-131020@footnote{https://github.com/python/cpython/issues/131020}: pylauncher@footnote{https://github.com/python/cpython/tree/3.14/PC/launcher2.c} correctly detects a BOM
when searching for the shebang. Fix by Chris Eibl.
@end itemize

@node Tools/Demos<10>,Tests<9>,Windows<11>,Python 3 14 0 alpha 6
@anchor{whatsnew/changelog id123}@anchor{188d}
@subsubsection Tools/Demos



@itemize -

@item 
gh-130453@footnote{https://github.com/python/cpython/issues/130453}: Make it possible to override default keywords in
@code{pygettext}.

@item 
gh-85012@footnote{https://github.com/python/cpython/issues/85012}: Correctly reset @code{msgctxt} when compiling messages in
@code{msgfmt}.

@item 
gh-130453@footnote{https://github.com/python/cpython/issues/130453}: Extend support for specifying custom keywords in
@code{pygettext}.

@item 
gh-130195@footnote{https://github.com/python/cpython/issues/130195}: Add warning messages when @code{pygettext} unimplemented
@code{-a/--extract-all} option is called.

@item 
gh-130057@footnote{https://github.com/python/cpython/issues/130057}: Add support for translator comments in @code{pygettext.py}.

@item 
gh-130025@footnote{https://github.com/python/cpython/issues/130025}: The iOS testbed now correctly handles symlinks used as Python
framework references.

@item 
gh-129911@footnote{https://github.com/python/cpython/issues/129911}: Fix the keyword entry in the help output of
@code{pygettext}.
@end itemize

@node Tests<9>,Security<13>,Tools/Demos<10>,Python 3 14 0 alpha 6
@anchor{whatsnew/changelog id124}@anchor{188e}
@subsubsection Tests



@itemize -

@item 
gh-129200@footnote{https://github.com/python/cpython/issues/129200}: Multiple iOS testbed runners can now be started at the same
time without introducing an ambiguity over simulator ownership.

@item 
gh-130292@footnote{https://github.com/python/cpython/issues/130292}: The iOS testbed will now run successfully on a machine that has
not previously run Xcode tests (such as CI configurations).

@item 
gh-130293@footnote{https://github.com/python/cpython/issues/130293}: The tests of terminal colorization are no longer sensitive to
the value of the @code{TERM} variable in the testing environment.

@item 
gh-129401@footnote{https://github.com/python/cpython/issues/129401}: Fix a flaky test in @code{test_repr_rlock} that checks the
representation of @ref{1857,,multiprocessing.RLock}.

@item 
gh-126332@footnote{https://github.com/python/cpython/issues/126332}: Add unit tests for pyrepl.
@end itemize

@node Security<13>,Library<30>,Tests<9>,Python 3 14 0 alpha 6
@anchor{whatsnew/changelog id125}@anchor{188f}
@subsubsection Security



@itemize -

@item 
gh-127371@footnote{https://github.com/python/cpython/issues/127371}: Avoid unbounded buffering for
@code{tempfile.SpooledTemporaryFile.writelines()}. Previously, disk
spillover was only checked after the lines iterator had been exhausted.
This is now done after each line is written.
@end itemize

@node Library<30>,Documentation<10>,Security<13>,Python 3 14 0 alpha 6
@anchor{whatsnew/changelog id126}@anchor{1890}
@subsubsection Library



@itemize -

@item 
gh-131204@footnote{https://github.com/python/cpython/issues/131204}: Use monospace font from System Font Stack for cross-platform
support in @ref{201,,difflib.HtmlDiff}.

@item 
gh-131196@footnote{https://github.com/python/cpython/issues/131196}: Improve performance of @ref{1891,,uuid.UUID.hex} and
@ref{82f,,uuid.UUID.__str__}.

@item 
gh-130940@footnote{https://github.com/python/cpython/issues/130940}: The behavior of @code{PyConfig.use_system_logger} was modified to
be enabled by default on iOS. It remains disabled by default on macOS.

@item 
gh-131123@footnote{https://github.com/python/cpython/issues/131123}: Supported completions for attributes of convenience variables
in @ref{aa,,pdb}.

@item 
gh-93096@footnote{https://github.com/python/cpython/issues/93096}: Removed undocumented CLI @code{python -m difflib}. Use @code{python -m
doctest Lib/difflib.py -v} instead. Patch by Semyon Moroz.

@item 
gh-93096@footnote{https://github.com/python/cpython/issues/93096}: Removed undocumented @code{-t} and @code{-v} arguments of @code{python -m
pickle}. Use @code{python -m doctest Lib/pickle.py -v} instead. Patch by
Semyon Moroz.

@item 
gh-81267@footnote{https://github.com/python/cpython/issues/81267}: Correct @ref{8ab,,time.sleep()} error message when an object that
cannot be interpreted as an integer or float is provided.

@item 
gh-93096@footnote{https://github.com/python/cpython/issues/93096}: Removed undocumented @code{-t} and @code{-v} arguments of @code{python -m
pickletools}. Use @code{python -m doctest Lib/pickletools.py -v} instead.
Patch by Semyon Moroz.

@item 
gh-131045@footnote{https://github.com/python/cpython/issues/131045}: Fix issue with @code{__contains__}, values, and pseudo-members for
@ref{834,,enum.Flag}.

@item 
gh-130959@footnote{https://github.com/python/cpython/issues/130959}: Fix pure-Python implementation of
@ref{828,,datetime.time.fromisoformat()} to reject times with spaces in
fractional part (for example, @code{12:34:56.400 +02:00}), matching the C
implementation. Patch by Michał Gorny.

@item 
gh-130806@footnote{https://github.com/python/cpython/issues/130806}: Deleting @ref{65a,,gzip.GzipFile} before it is closed now emits a
@ref{54e,,ResourceWarning}.

@item 
gh-130637@footnote{https://github.com/python/cpython/issues/130637}: Add validation for numeric response data in poplib.POP3.stat()
method

@item 
gh-130665@footnote{https://github.com/python/cpython/issues/130665}: Only apply locale to @ref{1d0,,calendar CLI} when
set via @code{--locale} and not via @code{LANG} environment variable.

@item 
gh-130660@footnote{https://github.com/python/cpython/issues/130660}: @code{sys.ps1} and @code{sys.ps2} are now restored after
@ref{1892,,code.interact()} call.

@item 
gh-130608@footnote{https://github.com/python/cpython/issues/130608}: Remove `dirs_exist_ok' argument from @ref{267,,pathlib.Path.copy()}
and @ref{268,,copy_into()}. These methods are new in Python 3.14.

@item 
gh-130461@footnote{https://github.com/python/cpython/issues/130461}: Remove @code{.. index::} directives from the @ref{116,,uuid} module
documentation. These directives previously created entries in the general
index for @ref{d9f,,getnode()} as well as the @ref{da0,,uuid1()},
@ref{2e5,,uuid3()}, @ref{2e7,,uuid4()}, @ref{2e6,,uuid5()}, and
@ref{2c4,,uuid8()} constructor functions.

@item 
gh-130379@footnote{https://github.com/python/cpython/issues/130379}: The zipapp module now calculates the list of files to be added
to the archive before creating the archive. This avoids accidentally
including the target when it is being created in the source directory.

@item 
gh-82987@footnote{https://github.com/python/cpython/issues/82987}: Inline breakpoints like @ref{271,,breakpoint()} or
@ref{272,,pdb.set_trace()} will always stop the program at calling frame,
ignoring the @code{skip} pattern (if any).

@item 
gh-125377@footnote{https://github.com/python/cpython/issues/125377}: @code{<tab>} at the beginning of the line in @ref{aa,,pdb} multi-line
input will fill in a 4-space indentation now, instead of inserting a
@code{\t} character.

@item 
gh-125413@footnote{https://github.com/python/cpython/issues/125413}: Ensure the path returned from @ref{267,,pathlib.Path.copy()} or
@ref{269,,move()} has fresh @ref{26b,,info}.

@item 
gh-65697@footnote{https://github.com/python/cpython/issues/65697}: stdlib configparser will now attempt to validate that keys it
writes will not result in file corruption (creating a file unable to be
accurately parsed by a future read() call from the same parser).
Attempting a corrupting write() will raise an InvalidWriteError.

@item 
gh-125413@footnote{https://github.com/python/cpython/issues/125413}: Speed up @ref{267,,Path.copy} by making better
use of @ref{26b,,info} internally.

@item 
gh-130285@footnote{https://github.com/python/cpython/issues/130285}: Fix corner case for @ref{94c,,random.sample()} allowing the `counts'
parameter to specify an empty population. So now, @code{sample([], 0,
counts=[])} and @code{sample('abc', k=0, counts=[0, 0, 0])} both give the
same result as @code{sample([], 0)}.

@item 
gh-124703@footnote{https://github.com/python/cpython/issues/124703}: Executing @code{quit} command in @ref{aa,,pdb} will raise
@ref{278,,bdb.BdbQuit} when @code{pdb} is started from an interactive console
using @ref{271,,breakpoint()} or @ref{272,,pdb.set_trace()}.

@item 
gh-107773@footnote{https://github.com/python/cpython/issues/107773}: Make @ref{34,,datetime} subclass @ref{82e,,__repr__()}
consistent both implementations. Patch by Semyon Moroz.

@item 
gh-130250@footnote{https://github.com/python/cpython/issues/130250}: Fix regression in @code{traceback.print_last()}.

@item 
gh-123471@footnote{https://github.com/python/cpython/issues/123471}: Make concurrent iterations over @ref{510,,itertools.batched} safe
under free-threading.

@item 
gh-57537@footnote{https://github.com/python/cpython/issues/57537}: Support breakpoints for @ref{138,,zipimport} modules on @ref{aa,,pdb}

@item 
gh-130230@footnote{https://github.com/python/cpython/issues/130230}: Fix crash in @ref{1a4,,pow()} with only @ref{1fe,,Decimal}
third argument.

@item 
gh-126944@footnote{https://github.com/python/cpython/issues/126944}: Show explicit errors when required arguments of @ref{aa,,pdb}
commands are missing

@item 
gh-127750@footnote{https://github.com/python/cpython/issues/127750}: Improve repr of @ref{be4,,functools.singledispatchmethod} methods
and descriptors.

@item 
gh-128520@footnote{https://github.com/python/cpython/issues/128520}: Apply type conversion consistently in @ref{6cc,,pathlib.PurePath}
and @ref{266,,Path} methods can accept a path object as an
argument, such as @ref{6d2,,match()} and
@ref{1893,,rename()}. The argument is now converted to path object
if it lacks a @ref{6cd,,with_segments()} attribute, and not
otherwise.

@item 
gh-118761@footnote{https://github.com/python/cpython/issues/118761}: Reverts a change in the previous release attempting to make
some stdlib imports used within the @ref{dc,,subprocess} module lazy as this
was causing errors during @code{__del__} finalizers calling methods such as
@code{terminate}, or @code{kill}, or @code{send_signal}.

@item 
gh-130164@footnote{https://github.com/python/cpython/issues/130164}: Fixed failure to raise @ref{198,,TypeError} in
@ref{1894,,inspect.Signature.bind()} for positional-only arguments provided by
keyword when a variadic keyword argument (e.g. @code{**kwargs}) is present.

@item 
gh-130151@footnote{https://github.com/python/cpython/issues/130151}: Fix reference leaks in @code{_hashlib.hmac_new()} and
@code{_hashlib.hmac_digest()}. Patch by Bénédikt Tran.

@item 
gh-130145@footnote{https://github.com/python/cpython/issues/130145}: Fix @code{asyncio.AbstractEventloop.run_forever()} when another
loop is already running.

@item 
gh-130139@footnote{https://github.com/python/cpython/issues/130139}: Fix bug where @ref{1c2,,ast.parse()} did not error on AST input
which is not of the correct type, when called with optimize=False.

@item 
gh-127260@footnote{https://github.com/python/cpython/issues/127260}: Forbid the use of colon (“:”) as a fractional component
separator and other improvements to the consistency of error raising
between the C and Python implementations of
@ref{828,,datetime.time.fromisoformat()} and
@ref{829,,datetime.datetime.fromisoformat()}. Patch by Semyon Moroz.

@item 
gh-85795@footnote{https://github.com/python/cpython/issues/85795}: Using @ref{1a6,,super()} and @code{__class__} @ref{1895,,closure variable}
in user-defined methods of @ref{331,,typing.NamedTuple} subclasses is now
explicitly prohibited at runtime. Contributed by Bartosz Sławecki in
gh-130082@footnote{https://github.com/python/cpython/issues/130082}.

@item 
gh-118761@footnote{https://github.com/python/cpython/issues/118761}: Improve import time of @ref{1a,,cmd} by lazy importing
@ref{82,,inspect} and removing @ref{d8,,string}. Patch by Semyon Moroz.

@item 
gh-129726@footnote{https://github.com/python/cpython/issues/129726}: Fix @ref{65a,,gzip.GzipFile} raising an unraisable exception
during garbage collection when referring to a temporary object by breaking
the reference loop with @ref{11a,,weakref}.

@item 
gh-127750@footnote{https://github.com/python/cpython/issues/127750}: Remove broken @ref{be4,,functools.singledispatchmethod()} caching
introduced in gh-85160@footnote{https://github.com/python/cpython/issues/85160}. Achieve the same performance using different
optimization.

@item 
gh-129948@footnote{https://github.com/python/cpython/issues/129948}: Add support for shared @ref{184,,set} to
@ref{1896,,multiprocessing.managers.SyncManager} via @ref{24f,,SyncManager.set()}.

@item 
gh-129965@footnote{https://github.com/python/cpython/issues/129965}: Update MIME types for @code{.avi} and @code{.wav}. Add MIME types for
@code{.docx}, @code{.pptx}, @code{.xlsx}, @code{.epub}, @code{.flac}, @code{.m4a}, @code{.odg},
@code{.odp}, @code{.ods}, @code{.odt}, @code{.oga}, @code{.ogg}, @code{.ogx} and @code{.weba}.
Patch by Hugo van Kemenade.

@item 
gh-129889@footnote{https://github.com/python/cpython/issues/129889}: Support context manager protocol by @ref{1e2,,contextvars.Token}.
Patch by Andrew Svetlov.

@item 
gh-97850@footnote{https://github.com/python/cpython/issues/97850}: Update the deprecation warning of
@ref{a69,,importlib.abc.Loader.load_module()}.

@item 
gh-129678@footnote{https://github.com/python/cpython/issues/129678}: @ref{4de,,configparser.ConfigParser}: do not write an empty
unnamed section

@item 
gh-128641@footnote{https://github.com/python/cpython/issues/128641}: Restore @ref{166d,,configparser.ConfigParser.read()} performance.

@item 
gh-129569@footnote{https://github.com/python/cpython/issues/129569}: Fix @ref{8e3,,unicodedata.normalize()} to always return a built-in
@ref{169,,str} object when given an input of a @code{str} subclass,
regardless of whether the string is already normalized.

@item 
gh-128231@footnote{https://github.com/python/cpython/issues/128231}: Execution of multiple statements in the new REPL now stops
immediately upon the first exception encountered. Patch by Bartosz
Sławecki.

@item 
gh-96092@footnote{https://github.com/python/cpython/issues/96092}: Fix bug in @ref{1080,,traceback.walk_stack()} called with None where
it was skipping more frames than in prior versions. This bug fix also
changes walk_stack to walk the stack in the frame where it was called
rather than where it first gets used.

@item 
gh-129288@footnote{https://github.com/python/cpython/issues/129288}: Add optional @code{l2_cid} and @code{l2_bdaddr_type} fields to
@ref{d1,,socket} @code{BTPROTO_L2CAP} sockaddr tuple.

@item 
gh-128703@footnote{https://github.com/python/cpython/issues/128703}: Fix @ref{516,,mimetypes.guess_type()} to use default mapping for
empty @code{Content-Type} in registry.

@item 
gh-128647@footnote{https://github.com/python/cpython/issues/128647}: Eagerly write to buffers passed to @ref{65a,,gzip.GzipFile}’s
@ref{1897,,readinto()} and
@ref{101d,,readinto1()} implementations, avoiding unnecessary
allocations. Patch by Chris Markiewicz.

@item 
gh-128184@footnote{https://github.com/python/cpython/issues/128184}: Improve display of @ref{177e,,annotationlib.ForwardRef} object
within @ref{4e3,,inspect.Signature} representations. This also fixes a
@ref{452,,NameError} that was raised when using @ref{4e1,,dataclasses.dataclass()}
on classes with unresolvable forward references.

@item 
gh-128041@footnote{https://github.com/python/cpython/issues/128041}: Add
@ref{1da,,concurrent.futures.ProcessPoolExecutor.terminate_workers()} and
@ref{1db,,concurrent.futures.ProcessPoolExecutor.kill_workers()} as ways to
terminate or kill all living worker processes in the given pool.
(Contributed by Charles Machalow in gh-130849@footnote{https://github.com/python/cpython/issues/130849}.)

@item 
gh-127647@footnote{https://github.com/python/cpython/issues/127647}: Add protocols @ref{236,,io.Reader} and @ref{237,,io.Writer} as
alternatives to @ref{238,,typing.IO}, @ref{239,,typing.TextIO}, and
@ref{23a,,typing.BinaryIO}.

@item 
gh-109798@footnote{https://github.com/python/cpython/issues/109798}: Added additional information into error messages in
@ref{34,,datetime}, and made the messages more consistent between the C and
Python implementations. Patch by Semyon Moroz.

@item 
gh-125746@footnote{https://github.com/python/cpython/issues/125746}: Delay deprecated @ref{338,,zipimport.zipimporter.load_module()}
removal time to 3.15. Use @ref{339,,zipimport.zipimporter.exec_module()}
instead.

@item 
gh-74028@footnote{https://github.com/python/cpython/issues/74028}: Add the optional @code{buffersize} parameter to
@ref{1dc,,concurrent.futures.Executor.map()} to limit the number of submitted
tasks whose results have not yet been yielded. If the buffer is full,
iteration over the `iterables' pauses until a result is yielded from the
buffer.

@item 
gh-124927@footnote{https://github.com/python/cpython/issues/124927}: Non-printing characters are now properly handled in the new
REPL.

@item 
gh-124096@footnote{https://github.com/python/cpython/issues/124096}: Turn on virtual terminal mode and enable bracketed paste in
REPL on Windows console. (If the terminal does not support bracketed
paste, enabling it does nothing.)

@item 
gh-89083@footnote{https://github.com/python/cpython/issues/89083}: Add @ref{2c3,,uuid.uuid7()} for generating UUIDv7 objects as
specified in 
@geindex RFC; RFC 9562
RFC 9562@footnote{https://datatracker.ietf.org/doc/html/rfc9562.html}. Patch by Bénédikt Tran.

@item 
gh-89083@footnote{https://github.com/python/cpython/issues/89083}: Add @ref{2c2,,uuid.uuid6()} for generating UUIDv6 objects as
specified in 
@geindex RFC; RFC 9562
RFC 9562@footnote{https://datatracker.ietf.org/doc/html/rfc9562.html}. Patch by Bénédikt Tran.

@item 
gh-117151@footnote{https://github.com/python/cpython/issues/117151}: Increase @code{io.DEFAULT_BUFFER_SIZE} from 8k to 128k and adjust
@ref{316,,open()} on platforms where @ref{f8b,,os.fstat()} provides a @code{st_blksize}
field (such as Linux) to use @code{max(min(blocksize, 8 MiB),
io.DEFAULT_BUFFER_SIZE)} rather than always using the device block size.
This should improve I/O performance. Patch by Romain Morotti.

@item 
gh-105499@footnote{https://github.com/python/cpython/issues/105499}: Make @ref{2a7,,types.UnionType} an alias for
@ref{2a8,,typing.Union}. Both @code{int | str} and @code{Union[int, str]} now
create instances of the same type. Patch by Jelle Zijlstra.

@item 
gh-93096@footnote{https://github.com/python/cpython/issues/93096}: Document the command-line for @ref{93,,mimetypes}. It now exits
with @code{1} on failure instead of @code{0} and @code{2} on incorrect command-line
parameters instead of @code{1}. Also, errors are printed to stderr instead of
stdout and their text is made tighter. Patch by Oleg Iarygin and Hugo van
Kemenade.
@end itemize

@node Documentation<10>,Core and Builtins<27>,Library<30>,Python 3 14 0 alpha 6
@anchor{whatsnew/changelog id127}@anchor{1898}
@subsubsection Documentation



@itemize -

@item 
gh-125722@footnote{https://github.com/python/cpython/issues/125722}: Require Sphinx 8.2.0 or later to build the Python
documentation. Patch by Adam Turner.

@item 
gh-129712@footnote{https://github.com/python/cpython/issues/129712}: The wheel tags supported by each macOS universal SDK option are
now documented.

@item 
gh-46236@footnote{https://github.com/python/cpython/issues/46236}: C API: Document @ref{1899,,PyUnicode_RSplit()},
@ref{189a,,PyUnicode_Partition()} and @ref{189b,,PyUnicode_RPartition()}.
@end itemize

@node Core and Builtins<27>,Library<31>,Documentation<10>,Python 3 14 0 alpha 6
@anchor{whatsnew/changelog id128}@anchor{189c}
@subsubsection Core and Builtins



@itemize -

@item 
gh-131141@footnote{https://github.com/python/cpython/issues/131141}: Fix data race in @ref{e0,,sys.monitoring} instrumentation while
registering callback.

@item 
gh-130804@footnote{https://github.com/python/cpython/issues/130804}: Fix support of unicode characters on Windows in the new REPL.

@item 
gh-130932@footnote{https://github.com/python/cpython/issues/130932}: Fix incorrect exception handling in
@code{_PyModule_IsPossiblyShadowing}

@item 
gh-122029@footnote{https://github.com/python/cpython/issues/122029}: @ref{1703,,sys.setprofile()} and @ref{2e1,,sys.settrace()} will not
generate a @code{c_call} event for @code{INSTRUMENTED_CALL_FUNCTION_EX} if the
callable is a method with a C function wrapped, because we do not generate
@code{c_return} event in such case.

@item 
gh-129964@footnote{https://github.com/python/cpython/issues/129964}: Fix JIT crash on Windows on Arm. Patch by Diego Russo and
Brandt Bucher.

@item 
gh-130851@footnote{https://github.com/python/cpython/issues/130851}: Fix a crash in the @ref{1f4,,free threading} build when
constructing a @ref{1b,,code} object with @ref{189d,,co_consts}
that contains instances of types that are not otherwise generated by the
bytecode compiler.

@item 
gh-128534@footnote{https://github.com/python/cpython/issues/128534}: Ensure that both left and right branches have the same source
for @code{async for} loops. Add these branches to the @code{co_branches()}
iterator.

@item 
gh-130794@footnote{https://github.com/python/cpython/issues/130794}: Fix memory leak in the @ref{1f4,,free threaded}
build when resizing a shared list or dictionary from multiple short-lived
threads.

@item 
gh-130415@footnote{https://github.com/python/cpython/issues/130415}: Improve JIT understanding of integers in boolean context.

@item 
gh-130382@footnote{https://github.com/python/cpython/issues/130382}: Fix @code{PyRefTracer_DESTROY} not being sent from
@code{Python/ceval.c} @code{Py_DECREF()}.

@item 
gh-130574@footnote{https://github.com/python/cpython/issues/130574}: Renumber @ref{5b9,,RESUME} from 149 to 128.

@item 
gh-124878@footnote{https://github.com/python/cpython/issues/124878}: Fix race conditions during runtime finalization that could lead
to accessing freed memory.

@item 
gh-130415@footnote{https://github.com/python/cpython/issues/130415}: Improve the experimental JIT’s ability to narrow boolean values
based on the results of truthiness tests.

@item 
gh-130618@footnote{https://github.com/python/cpython/issues/130618}: Fix a bug that was causing @code{UnicodeDecodeError} or
@code{SystemError} to be raised when using f-strings with @code{lambda}
expressions with non-ASCII characters. Patch by Pablo Galindo

@item 
gh-123044@footnote{https://github.com/python/cpython/issues/123044}: Make sure that the location of branch targets in @code{match}
cases is in the body, not the pattern.

@item 
gh-128534@footnote{https://github.com/python/cpython/issues/128534}: Add branch monitoring (@code{BRANCH_LEFT} and @code{BRANCH_RIGHT}
events) for @code{async for} loops.

@item 
gh-130163@footnote{https://github.com/python/cpython/issues/130163}: Fix possible crashes related to concurrent change and use of
the @ref{df,,sys} module attributes.

@item 
gh-122029@footnote{https://github.com/python/cpython/issues/122029}: @code{INSTRUMENTED_CALL_KW} will expand the method before
monitoring to reflect the actual behavior more accurately.

@item 
gh-130415@footnote{https://github.com/python/cpython/issues/130415}: Improve JIT’s ability to optimize strings in boolean contexts.

@item 
gh-130396@footnote{https://github.com/python/cpython/issues/130396}: Use actual stack limits (from
@code{pthread_getattr_np(3)@footnote{https://manpages.debian.org/pthread_getattr_np(3)}}) for linux, and other systems with
@code{_GNU_SOURCE} defined, when determining limits for C stack protection.

@item 
gh-128396@footnote{https://github.com/python/cpython/issues/128396}: Fix a crash that occurs when calling @ref{46f,,locals()} inside an
inline comprehension that uses the same local variable as the outer frame
scope where the variable is a free or cell var.

@item 
gh-129107@footnote{https://github.com/python/cpython/issues/129107}: Fix two more @ref{344,,bytearray} functions for @ref{1f4,,free threading}.

@item 
gh-127705@footnote{https://github.com/python/cpython/issues/127705}: Use tagged references (@code{_PyStackRef}) for the default build
as well as for the free-threading build. This has a small negative
performance impact short-term but will enable larger speedups in the
future and significantly reduce maintenance costs by allowing a single
implementation of tagged references in the future.

@item 
gh-130094@footnote{https://github.com/python/cpython/issues/130094}: Fix two race conditions involving concurrent imports that could
lead to spurious failures with @ref{d3c,,ModuleNotFoundError}.

@item 
gh-129107@footnote{https://github.com/python/cpython/issues/129107}: Make @ref{344,,bytearray} iterator safe under @ref{1f4,,free threading}.

@item 
gh-115802@footnote{https://github.com/python/cpython/issues/115802}: Use the more efficient “medium” code model for JIT-compiled
code on supported platforms.

@item 
gh-107956@footnote{https://github.com/python/cpython/issues/107956}: A @code{build-details.json} file is now install in the
platform-independent standard library directory (
@geindex Python 향상 제안; PEP 739
PEP 739@footnote{https://peps.python.org/pep-0739/}
implementation).

@item 
gh-116042@footnote{https://github.com/python/cpython/issues/116042}: Fix location for SyntaxErrors of invalid escapes in the
tokenizer. Patch by Pablo Galindo

@item 
gh-91079@footnote{https://github.com/python/cpython/issues/91079}: Change C stack overflow protection to consider the amount of
stack consumed, rather than a counter. This allows deeper recursion in
many cases, but remains safe.

@item 
gh-129715@footnote{https://github.com/python/cpython/issues/129715}: Improve the experimental JIT’s handling of returns to unknown
callers.
@end itemize

@node Library<31>,Core and Builtins<28>,Core and Builtins<27>,Python 3 14 0 alpha 6
@anchor{whatsnew/changelog id129}@anchor{189e}
@subsubsection Library



@itemize -

@item 
gh-129983@footnote{https://github.com/python/cpython/issues/129983}: Fix data race in compile_template in @code{sre.c}.
@end itemize

@node Core and Builtins<28>,Library<32>,Library<31>,Python 3 14 0 alpha 6
@anchor{whatsnew/changelog id130}@anchor{189f}
@subsubsection Core and Builtins



@itemize -

@item 
gh-129967@footnote{https://github.com/python/cpython/issues/129967}: Fix a race condition in the @ref{1f4,,free threading} build when
@code{repr(set)} is called concurrently with @code{set.clear()}.

@item 
gh-129953@footnote{https://github.com/python/cpython/issues/129953}: The internal (evaluation) stack is now spilled to memory
whenever execution escapes from the interpreter or JIT compiled code. This
should have no observable effect in either Python or builtin extensions,
but will allow various important optimizations in the future.

@item 
gh-129515@footnote{https://github.com/python/cpython/issues/129515}: Clarify syntax error messages for conditional expressions when
a statement is specified before an @ref{181,,if} or after an
@ref{17c,,else} keyword.

@item 
gh-129349@footnote{https://github.com/python/cpython/issues/129349}: @ref{190,,bytes.fromhex()} and @ref{191,,bytearray.fromhex()} now accepts
ASCII @ref{192,,bytes} and @ref{193,,bytes-like objects}.

@item 
gh-129149@footnote{https://github.com/python/cpython/issues/129149}: Add fast path for medium-size integers in
@ref{18a0,,PyLong_FromSsize_t()}. Patch by Chris Eibl.

@item 
gh-129107@footnote{https://github.com/python/cpython/issues/129107}: Make the @ref{344,,bytearray} safe under @ref{1f4,,free threading}.

@item 
gh-128974@footnote{https://github.com/python/cpython/issues/128974}: Fix a crash in @ref{82f,,UnicodeError.__str__}
when custom attributes implement @code{__str__()} with
side-effects. Patch by Bénédikt Tran.

@item 
gh-126085@footnote{https://github.com/python/cpython/issues/126085}: @ref{2ae,,typing.TypeAliasType} now supports star unpacking.

@item 
gh-125331@footnote{https://github.com/python/cpython/issues/125331}: @code{from __future__ import barry_as_FLUFL} now works in more
contexts, including when it is used in files, with the @code{-c} flag, and in
the REPL when there are multiple statements on the same line. Previously,
it worked only on subsequent lines in the REPL, and when the appropriate
flags were passed directly to @ref{4b2,,compile()}. Patch by Pablo Galindo.

@item 
gh-121464@footnote{https://github.com/python/cpython/issues/121464}: Make concurrent iterations over the same @ref{1686,,enumerate()}
iterator safe under free-threading. See Strategy for Iterators in Free Threading@footnote{https://github.com/python/cpython/issues/124397}.

@item 
gh-87790@footnote{https://github.com/python/cpython/issues/87790}: Support underscore and comma as thousands separators in the
fractional part for floating-point presentation types of the new-style
string formatting (with @ref{199,,format()} or @ref{19a,,포맷 문자열 리터럴}).  Patch by
Sergey B Kirpichev.

@item 
gh-124445@footnote{https://github.com/python/cpython/issues/124445}: Fix specialization of generic aliases that are generic over a
@ref{488,,typing.ParamSpec} and have been specialized with a nested type
variable.

@item 
gh-120608@footnote{https://github.com/python/cpython/issues/120608}: Adapt @ref{a65,,reversed()} for use in the free-threading build. The
@code{reversed()} is still not thread-safe in the sense that concurrent
iterations may see the same object, but they will not corrupt the
interpreter state.
@end itemize

@node Library<32>,Core and Builtins<29>,Core and Builtins<28>,Python 3 14 0 alpha 6
@anchor{whatsnew/changelog id131}@anchor{18a1}
@subsubsection Library



@itemize -

@item 
gh-100388@footnote{https://github.com/python/cpython/issues/100388}: Fix the @code{platform._sys_version()} method when @code{__DATE__} is
undefined at buildtime by changing default buildtime datetime string to
the UNIX epoch.
@end itemize

@node Core and Builtins<29>,C API<11>,Library<32>,Python 3 14 0 alpha 6
@anchor{whatsnew/changelog id132}@anchor{18a2}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-44369@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44369}: Improve syntax errors for incorrectly closed strings. Patch by
Pablo Galindo
@end itemize

@node C API<11>,Build<11>,Core and Builtins<29>,Python 3 14 0 alpha 6
@anchor{whatsnew/changelog id133}@anchor{18a3}
@subsubsection C API



@itemize -

@item 
gh-111178@footnote{https://github.com/python/cpython/issues/111178}: Fix @ref{967,,PyCMethod} API: replace @code{size_t nargs} with
@code{Py_ssize_t nargs} in @code{PyCMethod}. Patch by Victor Stinner.

@item 
gh-130947@footnote{https://github.com/python/cpython/issues/130947}: Add again @ref{18a4,,PySequence_Fast()} to the limited C API. Patch
by Victor Stinner.

@item 
gh-128863@footnote{https://github.com/python/cpython/issues/128863}: The following private functions are deprecated and planned for
removal in Python 3.18:


@itemize *

@item 
@code{_PyUnicodeWriter_Init()}:
replace @code{_PyUnicodeWriter_Init(&writer)} with
@ref{3b4,,writer = PyUnicodeWriter_Create(0)}.

@item 
@code{_PyUnicodeWriter_Finish()}:
replace @code{_PyUnicodeWriter_Finish(&writer)} with
@ref{3b7,,PyUnicodeWriter_Finish(writer)}.

@item 
@code{_PyUnicodeWriter_Dealloc()}:
replace @code{_PyUnicodeWriter_Dealloc(&writer)} with
@ref{3b6,,PyUnicodeWriter_Discard(writer)}.

@item 
@code{_PyUnicodeWriter_WriteChar()}:
replace @code{_PyUnicodeWriter_WriteChar(&writer, ch)} with
@ref{3ba,,PyUnicodeWriter_WriteChar(writer@comma{} ch)}.

@item 
@code{_PyUnicodeWriter_WriteStr()}:
replace @code{_PyUnicodeWriter_WriteStr(&writer, str)} with
@ref{3bc,,PyUnicodeWriter_WriteStr(writer@comma{} str)}.

@item 
@code{_PyUnicodeWriter_WriteSubstring()}:
replace @code{_PyUnicodeWriter_WriteSubstring(&writer, str, start, end)} with
@ref{3bd,,PyUnicodeWriter_WriteSubstring(writer@comma{} str@comma{} start@comma{} end)}.

@item 
@code{_PyUnicodeWriter_WriteASCIIString()}:
replace @code{_PyUnicodeWriter_WriteASCIIString(&writer, str)} with
@ref{3bf,,PyUnicodeWriter_WriteUTF8(writer@comma{} str)}.

@item 
@code{_PyUnicodeWriter_WriteLatin1String()}:
replace @code{_PyUnicodeWriter_WriteLatin1String(&writer, str)} with
@ref{3bf,,PyUnicodeWriter_WriteUTF8(writer@comma{} str)}.

@item 
@code{_PyUnicodeWriter_Prepare()}: (no replacement).

@item 
@code{_PyUnicodeWriter_PrepareKind()}: (no replacement).
@end itemize

The pythoncapi-compat project@footnote{https://github.com/python/pythoncapi-compat/} can be used to get these
new public functions on Python 3.13 and older.

Patch by Victor Stinner.

@item 
gh-45325@footnote{https://github.com/python/cpython/issues/45325}: Add a new @code{p} format parameter to @ref{3c2,,Py_BuildValue()} that
allows to take a C integer and produce a Python @ref{3c3,,bool} object.
Patch by Pablo Galindo.
@end itemize

@node Build<11>,,C API<11>,Python 3 14 0 alpha 6
@anchor{whatsnew/changelog id134}@anchor{18a5}
@subsubsection Build



@itemize -

@item 
gh-131035@footnote{https://github.com/python/cpython/issues/131035}: Use @code{-flto=thin} for faster build times using clang-cl on
Windows. Patch by Chris Eibl.

@item 
gh-130740@footnote{https://github.com/python/cpython/issues/130740}: Ensure that @code{Python.h} is included before @code{stdbool.h}
unless @code{pyconfig.h} is included before or in some platform-specific
contexts.

@item 
gh-130090@footnote{https://github.com/python/cpython/issues/130090}: Building with @code{PlatformToolset=ClangCL} on Windows now
supports PGO (profile guided optimization). Patch by Chris Eibl with
invaluable support from Steve Dover.

@item 
gh-129819@footnote{https://github.com/python/cpython/issues/129819}: Allow building the JIT with the tailcall interpreter.

@item 
gh-129989@footnote{https://github.com/python/cpython/issues/129989}: Fix a bug where the tailcall interpreter was enabled when
@code{--without-tail-call-interp} was provided to the configure script.

@item 
gh-129838@footnote{https://github.com/python/cpython/issues/129838}: Don’t redefine @code{_Py_NO_SANITIZE_UNDEFINED} when compiling
with a recent GCC version and undefined sanitizer enabled.

@item 
gh-82909@footnote{https://github.com/python/cpython/issues/82909}: @code{#pragma}-based linking with @code{python3*.lib} can now be
switched off with @ref{444,,Py_NO_LINK_LIB}. Patch by Jean-Christophe
Fillion-Robin.
@end itemize

@node Python 3 14 0 alpha 5,Python 3 14 0 alpha 4,Python 3 14 0 alpha 6,Changelog
@anchor{whatsnew/changelog python-3-14-0-alpha-5}@anchor{18a6}
@subsection Python 3.14.0 alpha 5


`Release date: 2025-02-11'

@menu
* macOS: macOS<6>. 
* Tools/Demos: Tools/Demos<11>. 
* Tests: Tests<10>. 
* Security: Security<14>. 
* Library: Library<33>. 
* IDLE: IDLE<6>. 
* Documentation: Documentation<11>. 
* Core and Builtins: Core and Builtins<30>. 
* Library: Library<34>. 
* Core and Builtins: Core and Builtins<31>. 
* Library: Library<35>. 
* Core and Builtins: Core and Builtins<32>. 
* Library: Library<36>. 
* C API: C API<12>. 
* Build: Build<12>. 

@end menu

@node macOS<6>,Tools/Demos<11>,,Python 3 14 0 alpha 5
@anchor{whatsnew/changelog id135}@anchor{18a7}
@subsubsection macOS



@itemize -

@item 
gh-91132@footnote{https://github.com/python/cpython/issues/91132}: Update macOS installer to use ncurses 6.5.
@end itemize

@node Tools/Demos<11>,Tests<10>,macOS<6>,Python 3 14 0 alpha 5
@anchor{whatsnew/changelog id136}@anchor{18a8}
@subsubsection Tools/Demos



@itemize -

@item 
gh-129248@footnote{https://github.com/python/cpython/issues/129248}: The iOS test runner now strips the log prefix from each line
output by the test suite.

@item 
gh-104400@footnote{https://github.com/python/cpython/issues/104400}: Fix several bugs in extraction by switching to an AST parser in
@code{pygettext}.
@end itemize

@node Tests<10>,Security<14>,Tools/Demos<11>,Python 3 14 0 alpha 5
@anchor{whatsnew/changelog id137}@anchor{18a9}
@subsubsection Tests



@itemize -

@item 
gh-129386@footnote{https://github.com/python/cpython/issues/129386}: Add @code{test.support.reset_code}, which can be used to reset
various bytecode-level optimizations and local instrumentation for a
function.

@item 
gh-128474@footnote{https://github.com/python/cpython/issues/128474}: Disable @code{test_embed} test cases that segfault on BOLT
instrument binaries. The tests are only disabled when BOLT is enabled.

@item 
gh-128003@footnote{https://github.com/python/cpython/issues/128003}: Add an option @code{--parallel-threads=N} to the regression test
runner that runs individual tests in multiple threads in parallel in order
to find concurrency bugs.  Note that most of the test suite is not yet
reviewed for thread-safety or annotated with @code{@@thread_unsafe} when
necessary.
@end itemize

@node Security<14>,Library<33>,Tests<10>,Python 3 14 0 alpha 5
@anchor{whatsnew/changelog id138}@anchor{18aa}
@subsubsection Security



@itemize -

@item 
gh-105704@footnote{https://github.com/python/cpython/issues/105704}: When using @ref{f39,,urllib.parse.urlsplit()} and
@ref{362,,urllib.parse.urlparse()} host parsing would not reject domain names
containing square brackets (@code{[} and @code{]}). Square brackets are only
valid for IPv6 and IPvFuture hosts according to RFC 3986 Section 3.2.2@footnote{https://www.rfc-editor.org/rfc/rfc3986#section-3.2.2}.

@item 
gh-126108@footnote{https://github.com/python/cpython/issues/126108}: Fix a possible @code{NULL} pointer dereference in
@code{PySys_AddWarnOptionUnicode()}.

@item 
gh-80222@footnote{https://github.com/python/cpython/issues/80222}: Fix bug in the folding of quoted strings when flattening an
email message using a modern email policy. Previously when a quoted string
was folded so that it spanned more than one line, the surrounding quotes
and internal escapes would be omitted. This could theoretically be used to
spoof header lines using a carefully constructed quoted string if the
resulting rendered email was transmitted or re-parsed.

@item 
gh-119511@footnote{https://github.com/python/cpython/issues/119511}: Fix a potential denial of service in the @ref{78,,imaplib} module.
When connecting to a malicious server, it could cause an arbitrary amount
of memory to be allocated. On many systems this is harmless as unused
virtual memory is only a mapping, but if this hit a virtual address size
limit it could lead to a @ref{175f,,MemoryError} or other process crash. On
unusual systems or builds where all allocated memory is touched and backed
by actual ram or storage it could’ve consumed resources doing so until
similarly crashing.
@end itemize

@node Library<33>,IDLE<6>,Security<14>,Python 3 14 0 alpha 5
@anchor{whatsnew/changelog id139}@anchor{18ab}
@subsubsection Library



@itemize -

@item 
gh-129939@footnote{https://github.com/python/cpython/issues/129939}: Comparison pages with highlighted changes generated by the
@ref{201,,difflib.HtmlDiff} class now support dark mode.

@item 
gh-129928@footnote{https://github.com/python/cpython/issues/129928}: Raise @ref{305,,sqlite3.ProgrammingError} if a user-defined SQL
function with invalid number of parameters is created. Patch by Erlend
Aasland.

@item 
gh-129583@footnote{https://github.com/python/cpython/issues/129583}: Update bundled pip to 25.0.1

@item 
gh-129766@footnote{https://github.com/python/cpython/issues/129766}: Fix crash in @ref{118,,warnings}, when calling @code{_release_lock()}
with no existing lock.

@item 
gh-129005@footnote{https://github.com/python/cpython/issues/129005}: @code{_pyio.FileIO.readall()} now allocates, resizes, and fills a
data buffer using the same algorithm @code{_io.FileIO.readall()} uses.

@item 
gh-129646@footnote{https://github.com/python/cpython/issues/129646}: Update the locale alias mapping in the @ref{8a,,locale} module to
match the latest X Org locale alias mapping and support new locales in
Glibc 2.41.

@item 
gh-128317@footnote{https://github.com/python/cpython/issues/128317}: Put CLI calendar highlighting in private class, removing
@code{highlight_day} from public @ref{18ac,,calendar.TextCalendar} API. Patch by
Hugo van Kemenade.

@item 
gh-129603@footnote{https://github.com/python/cpython/issues/129603}: Fix bugs where @ref{1070,,sqlite3.Row} objects could segfault if
their inherited @ref{18ad,,description} was set to @code{None}.
Patch by Erlend Aasland.

@item 
gh-129559@footnote{https://github.com/python/cpython/issues/129559}: Add @ref{1771,,bytearray.resize()} method so @ref{344,,bytearray} can
be efficiently resized in place.

@item 
gh-129502@footnote{https://github.com/python/cpython/issues/129502}: Unlikely errors in preparing arguments for @ref{2e,,ctypes}
callback are now handled in the same way as errors raised in the callback
of in converting the result of the callback – using
@ref{506,,sys.unraisablehook()} instead of @ref{a0c,,sys.excepthook()} and not
setting @ref{6e4,,sys.last_exc} and other variables.

@item 
gh-129403@footnote{https://github.com/python/cpython/issues/129403}: Corrected @ref{2ec,,ValueError} message for
@ref{815,,asyncio.Barrier} and @ref{13e8,,threading.Barrier}.

@item 
gh-129409@footnote{https://github.com/python/cpython/issues/129409}: Fix an integer overflow in the @ref{2d,,csv} module when writing a
data field larger than 2GB.

@item 
gh-126400@footnote{https://github.com/python/cpython/issues/126400}: Add a socket `timeout' keyword argument to
@ref{86b,,logging.handlers.SysLogHandler}.

@item 
gh-118761@footnote{https://github.com/python/cpython/issues/118761}: Always lazy import @code{warnings} in @ref{f3,,threading}. Patch by
Taneli Hukkinen.

@item 
gh-118761@footnote{https://github.com/python/cpython/issues/118761}: Improve import time of @ref{dc,,subprocess} by lazy importing
@code{locale} and @code{signal}. Patch by Taneli Hukkinen.

@item 
gh-129346@footnote{https://github.com/python/cpython/issues/129346}: In @ref{d4,,sqlite3}, handle out-of-memory when creating
user-defined SQL functions.

@item 
gh-129005@footnote{https://github.com/python/cpython/issues/129005}: Optimize @code{_pyio.FileIO.readinto} by avoiding unnecessary
objects and copies using @ref{25f,,os.readinto()}.

@item 
gh-129195@footnote{https://github.com/python/cpython/issues/129195}: Support reporting call graph information from
@code{asyncio.staggered.staggered_race()}.

@item 
gh-129205@footnote{https://github.com/python/cpython/issues/129205}: Add @ref{25f,,os.readinto()} to read into a @ref{260,,buffer object} from a file descriptor.

@item 
gh-128772@footnote{https://github.com/python/cpython/issues/128772}: Fix @ref{ba,,pydoc} for methods with the @code{__module__} attribute
equal to @code{None}.

@item 
gh-129061@footnote{https://github.com/python/cpython/issues/129061}: Fix FORCE_COLOR and NO_COLOR when empty strings. Patch by Hugo
van Kemenade.

@item 
gh-92897@footnote{https://github.com/python/cpython/issues/92897}: Scheduled the deprecation of the @code{check_home} argument of
@ref{32d,,sysconfig.is_python_build()} to Python 3.15.

@item 
gh-129064@footnote{https://github.com/python/cpython/issues/129064}: Deprecate @code{sysconfig.expand_makefile_vars()}, in favor of
using @ref{340,,sysconfig.get_paths()} with the @code{vars} argument.

@item 
gh-128550@footnote{https://github.com/python/cpython/issues/128550}: Removed an incorrect optimization relating to eager tasks in
@ref{4d2,,asyncio.TaskGroup} that resulted in cancellations being missed.

@item 
gh-128991@footnote{https://github.com/python/cpython/issues/128991}: Release the enter frame reference within @ref{10,,bdb} callback

@item 
gh-118761@footnote{https://github.com/python/cpython/issues/118761}: Reduce import time of @ref{b5,,pstats} and @ref{137,,zipfile} by up to
20%, by removing unnecessary imports to @ref{10a,,typing}. Patch by Bénédikt
Tran.

@item 
gh-128978@footnote{https://github.com/python/cpython/issues/128978}: Fix a @ref{452,,NameError} in
@code{sysconfig.expand_makefile_vars()}. Patch by Bénédikt Tran.

@item 
gh-128961@footnote{https://github.com/python/cpython/issues/128961}: Fix a crash when setting state on an exhausted
@ref{4c0,,array.array} iterator.

@item 
gh-128894@footnote{https://github.com/python/cpython/issues/128894}: Fix @code{traceback.TracebackException._format_syntax_error} not
to fail on exceptions with custom metadata.

@item 
gh-128916@footnote{https://github.com/python/cpython/issues/128916}: Do not attempt to set @code{SO_REUSEPORT} on sockets of address
families other than @code{AF_INET} and @code{AF_INET6}, as it is meaningless
with these address families, and the call with fail with Linux kernel
6.12.9 and newer.

@item 
gh-118761@footnote{https://github.com/python/cpython/issues/118761}: Improve import time of @ref{102,,tomllib} by removing @code{typing},
@code{string}, and @code{tomllib._types} imports. Patch by Taneli Hukkinen.

@item 
gh-128679@footnote{https://github.com/python/cpython/issues/128679}: @ref{105,,tracemalloc}: Fix race conditions when
@ref{18ae,,tracemalloc.stop()} is called by a thread, while other threads are
tracing memory allocations. Patch by Victor Stinner.

@item 
gh-128891@footnote{https://github.com/python/cpython/issues/128891}: Add specialized opcodes to @code{opcode.opname}.

@item 
gh-118761@footnote{https://github.com/python/cpython/issues/118761}: Reduce import time of @ref{67,,gettext} by up to ten times, by
importing @ref{be,,re} on demand. In particular, @code{re} is no longer
implicitly exposed as @code{gettext.re}. Patch by Eli Schwartz.

@item 
gh-118761@footnote{https://github.com/python/cpython/issues/118761}: Reduce the import time of @ref{a4,,optparse} when no help text is
printed. Patch by Eli Schwartz.

@item 
gh-128657@footnote{https://github.com/python/cpython/issues/128657}: Fix possible extra reference when using objects returned by
@ref{18af,,hashlib.sha256()} under @ref{1f4,,free threading}.

@item 
gh-118761@footnote{https://github.com/python/cpython/issues/118761}: Reduce the import time of @ref{2d,,csv} by up to five times, by
importing @ref{be,,re} on demand. In particular, @code{re} is no more implicitly
exposed as @code{csv.re}. Patch by Bénédikt Tran.

@item 
gh-128308@footnote{https://github.com/python/cpython/issues/128308}: Support the `name' keyword argument for eager tasks in
@ref{1ca,,asyncio.loop.create_task()},  @ref{1c9,,asyncio.create_task()} and
@ref{1cb,,asyncio.TaskGroup.create_task()}, by passing on all `kwargs' to the
task factory set by @ref{1c8,,asyncio.loop.set_task_factory()}.

@item 
gh-118761@footnote{https://github.com/python/cpython/issues/118761}: Improve the performance of @ref{2d3,,base64.b16decode()} by up to
ten times by more efficiently checking the byte-string for hexadecimal
digits. Reduce the import time of @ref{f,,base64} by up to six times, by no
longer importing @ref{be,,re}. Patch by Bénédikt Tran, Chris Markiewicz, and
Adam Turner.

@item 
gh-128156@footnote{https://github.com/python/cpython/issues/128156}: When using macOS system @code{libffi}, support for complex types
in @ref{2e,,ctypes} is now checked at runtime (macOS 10.15 or newer). The
types must also be available at build time.

@item 
gh-128636@footnote{https://github.com/python/cpython/issues/128636}: Fix PyREPL failure when @ref{259,,os.environ} is overwritten with
an invalid value.

@item 
gh-128498@footnote{https://github.com/python/cpython/issues/128498}: Default to stdout isatty for color detection instead of stderr.
Patch by Hugo van Kemenade.

@item 
gh-128384@footnote{https://github.com/python/cpython/issues/128384}: Add locking to @ref{118,,warnings} to avoid some data races when
free-threading is used.  Change @code{_warnings_runtime_state.mutex} to be a
recursive mutex and expose it to @code{warnings}, via the
@code{_acquire_lock()} and @code{_release_lock()} functions. The lock is
held when @code{filters} and @code{_filters_version} are updated.

@item 
gh-128509@footnote{https://github.com/python/cpython/issues/128509}: Add @ref{28f,,sys._is_immortal()} for identifying @ref{290,,immortal}
objects at runtime.

@item 
gh-128479@footnote{https://github.com/python/cpython/issues/128479}: Fix @code{asyncio.staggered.staggered_race()} leaking tasks and
issuing an unhandled exception.

@item 
gh-128427@footnote{https://github.com/python/cpython/issues/128427}: @ref{2c5,,uuid.NIL} and @ref{2c6,,uuid.MAX} are now available to
represent the Nil and Max UUID formats as defined by 
@geindex RFC; RFC 9562
RFC 9562@footnote{https://datatracker.ietf.org/doc/html/rfc9562.html}.

@item 
gh-91279@footnote{https://github.com/python/cpython/issues/91279}: @ref{2cc,,zipfile.ZipFile.writestr()} now respect
@code{SOURCE_DATE_EPOCH} that distributions can set centrally and have build
tools consume this in order to produce reproducible output.

@item 
gh-112064@footnote{https://github.com/python/cpython/issues/112064}: Fix incorrect handling of negative read sizes in
@ref{18b0,,HTTPResponse.read}. Patch by Yury
Manushkin.

@item 
gh-58956@footnote{https://github.com/python/cpython/issues/58956}: Fixed a frame reference leak in @ref{10,,bdb}.

@item 
gh-128131@footnote{https://github.com/python/cpython/issues/128131}: Completely support random access of uncompressed unencrypted
read-only zip files obtained by @ref{65b,,ZipFile.open}.

@item 
gh-127975@footnote{https://github.com/python/cpython/issues/127975}: Avoid reusing quote types in @ref{ae2,,ast.unparse()} if not needed.

@item 
gh-115514@footnote{https://github.com/python/cpython/issues/115514}: Fix exceptions and incomplete writes after
@code{asyncio._SelectorTransport} is closed before writes are
completed.

@item 
gh-121604@footnote{https://github.com/python/cpython/issues/121604}: Add missing Deprecation warnings for
@ref{18b1,,importlib.machinery.DEBUG_BYTECODE_SUFFIXES},
@ref{18b2,,importlib.machinery.OPTIMIZED_BYTECODE_SUFFIXES},
@ref{f25,,importlib.machinery.WindowsRegistryFinder},
@ref{de1,,importlib.abc.ResourceLoader},
@ref{138e,,importlib.abc.SourceLoader.path_mtime()}.

@item 
gh-127873@footnote{https://github.com/python/cpython/issues/127873}: When @code{-E} is set, only ignore @code{PYTHON_COLORS} and not
@code{FORCE_COLOR}/@code{NO_COLOR}/@code{TERM} when colourising output. Patch by
Hugo van Kemenade.

@item 
gh-125413@footnote{https://github.com/python/cpython/issues/125413}: Add @ref{26b,,pathlib.Path.info} attribute, which stores an object
implementing the @ref{26c,,pathlib.types.PathInfo} protocol (also new). The
object supports querying the file type and internally caching
@ref{26d,,stat()} results. Path objects generated by
@ref{26e,,iterdir()} are initialized with file type information
gleaned from scanning the parent directory.

@item 
gh-127712@footnote{https://github.com/python/cpython/issues/127712}: Fix handling of the @code{secure} argument of
@ref{18b3,,logging.handlers.SMTPHandler}.

@item 
gh-127096@footnote{https://github.com/python/cpython/issues/127096}: Do not recreate unnamed section on every read in
@ref{4de,,configparser.ConfigParser}. Patch by Andrey Efremov.

@item 
gh-124369@footnote{https://github.com/python/cpython/issues/124369}: Deprecate @code{pdb.Pdb.curframe_locals}

@item 
gh-126332@footnote{https://github.com/python/cpython/issues/126332}: Fix _pyrepl crash when entering a double CTRL-Z on an
overflowing line.

@item 
gh-125553@footnote{https://github.com/python/cpython/issues/125553}: Fix round-trip invariance for backslash continuations in
@ref{18b4,,tokenize.untokenize()}.

@item 
gh-91048@footnote{https://github.com/python/cpython/issues/91048}: Add @ref{1cc,,asyncio.capture_call_graph()} and
@ref{1cd,,asyncio.print_call_graph()} functions.

@item 
gh-124703@footnote{https://github.com/python/cpython/issues/124703}: Quitting @ref{aa,,pdb} in @code{inline} mode will emit a confirmation
prompt and exit gracefully now, instead of printing an exception
traceback.

@item 
gh-123987@footnote{https://github.com/python/cpython/issues/123987}: Fixed issue in NamespaceReader where a non-path item in a
namespace path, such as a sentinel added by an editable installer, would
break resource loading.

@item 
gh-119349@footnote{https://github.com/python/cpython/issues/119349}: Add the @ref{1f0,,ctypes.util.dllist()} function to list the loaded
shared libraries for the current process.

@item 
gh-55454@footnote{https://github.com/python/cpython/issues/55454}: Add IMAP4 @code{IDLE} support to the @ref{78,,imaplib} module.  Patch
by Forest.

@item 
gh-119257@footnote{https://github.com/python/cpython/issues/119257}: Show tab completions menu below the current line, which results
in less janky behaviour, and fixes a cursor movement bug. Patch by Daniel
Hollas

@item 
gh-101410@footnote{https://github.com/python/cpython/issues/101410}: Support custom messages for domain errors in the @ref{92,,math}
module (@ref{bf8,,math.sqrt()}, @ref{16c5,,math.log()} and @ref{15dc,,math.atanh()} were
modified as examples).  Patch by Charlie Zhao and Sergey B Kirpichev.

@item 
gh-81340@footnote{https://github.com/python/cpython/issues/81340}: Use @ref{18b5,,os.copy_file_range()} in @ref{c4e,,shutil.copy()},
@ref{c4f,,shutil.copy2()}, and @ref{c4d,,shutil.copyfile()} functions by default. An
underlying Linux system call gives filesystems an opportunity to implement
the use of copy-on-write (in case of btrfs and XFS) or server-side copy
(in the case of NFS.) Patch by Illia Volochii.

@item 
bpo-27307@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27307}: Add attribute and item access support to
@ref{10bc,,string.Formatter} in auto-numbering mode, which allows format
strings like ‘@{.name@}’ and ‘@{[1]@}’.
@end itemize

@node IDLE<6>,Documentation<11>,Library<33>,Python 3 14 0 alpha 5
@anchor{whatsnew/changelog id140}@anchor{18b6}
@subsubsection IDLE



@itemize -

@item 
gh-129873@footnote{https://github.com/python/cpython/issues/129873}: Simplify displaying the IDLE doc by only copying the text
section of idle.html to idlelib/help.html. Patch by Stan Ulbrych.
@end itemize

@node Documentation<11>,Core and Builtins<30>,IDLE<6>,Python 3 14 0 alpha 5
@anchor{whatsnew/changelog id141}@anchor{18b7}
@subsubsection Documentation



@itemize -

@item 
gh-125722@footnote{https://github.com/python/cpython/issues/125722}: Require Sphinx 8.1.3 or later to build the Python
documentation. Patch by Adam Turner.

@item 
gh-67206@footnote{https://github.com/python/cpython/issues/67206}: Document that @ref{18b8,,string.printable} is not printable in the
POSIX sense. In particular, @ref{fd7,,string.printable.isprintable()} returns @ref{d2a,,False}. Patch by Bénédikt Tran.
@end itemize

@node Core and Builtins<30>,Library<34>,Documentation<11>,Python 3 14 0 alpha 5
@anchor{whatsnew/changelog id142}@anchor{18b9}
@subsubsection Core and Builtins



@itemize -

@item 
gh-100239@footnote{https://github.com/python/cpython/issues/100239}: Replace the opcode BINARY_SUBSCR and its family by BINARY_OP
with oparg NB_SUBSCR.

@item 
gh-129732@footnote{https://github.com/python/cpython/issues/129732}: Fixed a race in @code{_Py_qsbr_reserve} in the free threading
build.

@item 
gh-129763@footnote{https://github.com/python/cpython/issues/129763}: Remove the internal @code{LLTRACE} macro (use @ref{1837,,Py_DEBUG}
instead).

@item 
gh-129715@footnote{https://github.com/python/cpython/issues/129715}: Improve JIT performance for generators.

@item 
gh-129643@footnote{https://github.com/python/cpython/issues/129643}: Fix thread safety of @ref{18ba,,PyList_Insert()} in free-threading
builds.

@item 
gh-129668@footnote{https://github.com/python/cpython/issues/129668}: Fix race condition when raising @ref{175f,,MemoryError} in the free
threaded build.

@item 
gh-129643@footnote{https://github.com/python/cpython/issues/129643}: Fix thread safety of @ref{18bb,,PyList_SetItem()} in free-threading
builds. Patch by Kumar Aditya.

@item 
gh-128563@footnote{https://github.com/python/cpython/issues/128563}: Fix an issue where the “lltrace” debug feature could have been
incorrectly enabled for some frames.

@item 
gh-129393@footnote{https://github.com/python/cpython/issues/129393}: On FreeBSD, @ref{291,,sys.platform} doesn’t contain the major
version anymore. It is always @code{'freebsd'}, instead of @code{'freebsd13'} or
@code{'freebsd14'}.
@end itemize

@node Library<34>,Core and Builtins<31>,Core and Builtins<30>,Python 3 14 0 alpha 5
@anchor{whatsnew/changelog id143}@anchor{18bc}
@subsubsection Library



@itemize -

@item 
gh-129345@footnote{https://github.com/python/cpython/issues/129345}: Fix null pointer dereference in @ref{75f,,syslog.openlog()} when an
audit hook raises an exception.
@end itemize

@node Core and Builtins<31>,Library<35>,Library<34>,Python 3 14 0 alpha 5
@anchor{whatsnew/changelog id144}@anchor{18bd}
@subsubsection Core and Builtins



@itemize -

@item 
gh-129231@footnote{https://github.com/python/cpython/issues/129231}: Improve memory layout of JIT traces. Patch by Diego Russo

@item 
gh-129149@footnote{https://github.com/python/cpython/issues/129149}: Add fast path for medium-size integers in
@ref{18be,,PyLong_FromUnsignedLong()}, @ref{18bf,,PyLong_FromUnsignedLongLong()}
and @ref{18c0,,PyLong_FromSize_t()}.

@item 
gh-129201@footnote{https://github.com/python/cpython/issues/129201}: The free-threaded version of the cyclic garbage collector has
been optimized to conditionally use CPU prefetch instructions during the
collection.  This can reduce collection times by making it more likely
that data is in the CPU cache when it is needed.  The prefetch
instructions are enabled if the number of long-lived objects (objects
surviving a full collection) exceeds a threshold.

@item 
gh-129093@footnote{https://github.com/python/cpython/issues/129093}: Fix f-strings such as @code{f'@{expr=@}'} sometimes not displaying
the full expression when the expression contains @code{!=}.

@item 
gh-124363@footnote{https://github.com/python/cpython/issues/124363}: Treat debug expressions in f-string as raw strings. Patch by
Pablo Galindo

@item 
gh-128714@footnote{https://github.com/python/cpython/issues/128714}: Fix the potential races in get/set dunder methods
@code{__annotations__}, @code{__annotate__} and @code{__type_params__} for function
object, and add related tests.

@item 
gh-128799@footnote{https://github.com/python/cpython/issues/128799}: Add frame of @code{except*} to traceback when it wraps a naked
exception.

@item 
gh-128842@footnote{https://github.com/python/cpython/issues/128842}: Collect JIT memory stats using pystats. Patch by Diego Russo.

@item 
gh-100239@footnote{https://github.com/python/cpython/issues/100239}: Specialize @code{BINARY_OP} for bitwise logical operations on
compact ints.

@item 
gh-128910@footnote{https://github.com/python/cpython/issues/128910}: Undocumented and unused private C-API functions
@code{_PyTrash_begin} and @code{_PyTrash_end} are removed.

@item 
gh-128807@footnote{https://github.com/python/cpython/issues/128807}: Add a marking phase to the free-threaded GC.  This is similar
to what was done in gh-126491@footnote{https://github.com/python/cpython/issues/126491}.  Since the free-threaded GC does not have
generations and is not incremental, the marking phase looks for all
objects reachable from known roots.  The roots are objects known to not be
garbage, like the module dictionary for @ref{df,,sys}.  For most programs,
this marking phase should make the GC a bit faster since typically less
work is done per object.

@item 
gh-100239@footnote{https://github.com/python/cpython/issues/100239}: Add opcode @code{BINARY_OP_EXTEND} which executes a pair of
functions (guard and specialization functions) accessed from the inline
cache.

@item 
gh-128563@footnote{https://github.com/python/cpython/issues/128563}: A new type of interpreter has been added to CPython. This
interpreter uses tail calls for its instruction handlers. Preliminary
benchmark results suggest 7-11% geometric mean faster on pyperformance
(depending on platform), and up to 30% faster on Python-intensive
workloads. This interpreter currently only works on newer compilers, such
as @code{clang-19}. Other compilers will continue using the old interpreter.
Patch by Ken Jin, with ideas on how to implement this in CPython by Mark
Shannon, Garret Gu, Haoran Xu, and Josh Haberman.

@item 
gh-126703@footnote{https://github.com/python/cpython/issues/126703}: Improve performance of iterating over lists and tuples by using
a freelist for the iterator objects.

@item 
gh-127953@footnote{https://github.com/python/cpython/issues/127953}: The time to handle a @code{LINE} event in sys.monitoring (and
sys.settrace) is now independent of the number of lines in the code
object.

@item 
gh-128330@footnote{https://github.com/python/cpython/issues/128330}: Restore terminal control characters on REPL exit.

@item 
gh-128016@footnote{https://github.com/python/cpython/issues/128016}: Improved the @code{SyntaxWarning} message for invalid escape
sequences to clarify that such sequences will raise a @code{SyntaxError} in
future Python releases. The new message also suggests a potential fix,
i.e., @code{Did you mean "\\e"?}.

@item 
gh-126004@footnote{https://github.com/python/cpython/issues/126004}: Fix handling of @ref{18c1,,UnicodeError.start} and
@ref{18c2,,UnicodeError.end} values in the @ref{18c3,,codecs.replace_errors()} error
handler. Patch by Bénédikt Tran.

@item 
gh-126004@footnote{https://github.com/python/cpython/issues/126004}: Fix handling of @ref{18c1,,UnicodeError.start} and
@ref{18c2,,UnicodeError.end} values in the
@ref{18c4,,codecs.backslashreplace_errors()} error handler. Patch by Bénédikt
Tran.

@item 
gh-126004@footnote{https://github.com/python/cpython/issues/126004}: Fix handling of @ref{18c1,,UnicodeError.start} and
@ref{18c2,,UnicodeError.end} values in the
@ref{18c5,,codecs.xmlcharrefreplace_errors()} error handler. Patch by Bénédikt
Tran.

@item 
gh-127119@footnote{https://github.com/python/cpython/issues/127119}: Slightly optimize the @ref{19b,,int} deallocator.

@item 
gh-127349@footnote{https://github.com/python/cpython/issues/127349}: Fixed the error when resizing terminal in Python REPL. Patch by
Semyon Moroz.

@item 
gh-125723@footnote{https://github.com/python/cpython/issues/125723}: Fix crash with @code{gi_frame.f_locals} when generator frames
outlive their generator. Patch by Mikhail Efimov.
@end itemize

@node Library<35>,Core and Builtins<32>,Core and Builtins<31>,Python 3 14 0 alpha 5
@anchor{whatsnew/changelog id145}@anchor{18c6}
@subsubsection Library



@itemize -

@item 
gh-126349@footnote{https://github.com/python/cpython/issues/126349}: Add @ref{2a3,,turtle.fill()}, @ref{2a4,,turtle.poly()} and
@ref{2a5,,turtle.no_animation()} context managers. Patch by Marie Roald and
Yngve Mardal Moe.
@end itemize

@node Core and Builtins<32>,Library<36>,Library<35>,Python 3 14 0 alpha 5
@anchor{whatsnew/changelog id146}@anchor{18c7}
@subsubsection Core and Builtins



@itemize -

@item 
gh-115911@footnote{https://github.com/python/cpython/issues/115911}: If the current working directory cannot be determined due to
permissions, then import will no longer raise @ref{f3d,,PermissionError}.
Patch by Alex Willmer.
@end itemize

@node Library<36>,C API<12>,Core and Builtins<32>,Python 3 14 0 alpha 5
@anchor{whatsnew/changelog id147}@anchor{18c8}
@subsubsection Library



@itemize -

@item 
gh-112713@footnote{https://github.com/python/cpython/issues/112713}: Added support for the @code{Partitioned} cookie flag in
@ref{75,,http.cookies}.
@end itemize

@node C API<12>,Build<12>,Library<36>,Python 3 14 0 alpha 5
@anchor{whatsnew/changelog id148}@anchor{18c9}
@subsubsection C API



@itemize -

@item 
gh-129533@footnote{https://github.com/python/cpython/issues/129533}: Update @ref{aa4,,PyGC_Enable()}, @ref{aa5,,PyGC_Disable()},
@ref{aa6,,PyGC_IsEnabled()} to use atomic operation for thread-safety at
free-threading build. Patch by Donghee Na.

@item 
gh-89188@footnote{https://github.com/python/cpython/issues/89188}: Implement @ref{1382,,PyUnicode_KIND()} and @ref{137e,,PyUnicode_DATA()}
as function, in addition to the macros with the same names. The macros
rely on C bit fields which have compiler-specific layout. Patch by Victor
Stinner.

@item 
gh-91417@footnote{https://github.com/python/cpython/issues/91417}: Remove @ref{18a4,,PySequence_Fast()} from the limited C API, since
this function has to be used with @ref{3cb,,PySequence_Fast_GET_ITEM}
which never worked in the limited C API. Patch by Victor Stinner.

@item 
gh-128509@footnote{https://github.com/python/cpython/issues/128509}: Add @ref{3c4,,PyUnstable_IsImmortal()} for determining whether an
object is @ref{290,,immortal}.

@item 
gh-129033@footnote{https://github.com/python/cpython/issues/129033}: Remove @code{_PyInterpreterState_GetConfigCopy()} and
@code{_PyInterpreterState_SetConfig()} private functions. Use instead
@ref{37c,,PyConfig_Get()} and @ref{37d,,PyConfig_Set()}, public C API added by
@geindex Python 향상 제안; PEP 741
PEP 741@footnote{https://peps.python.org/pep-0741/} “Python Configuration C API”. Patch by Victor Stinner.

@item 
gh-129033@footnote{https://github.com/python/cpython/issues/129033}: Remove the private @code{_Py_InitializeMain()} function. It was a
@ref{3d1,,provisional API} added to Python 3.8 by 
@geindex Python 향상 제안; PEP 587
PEP 587@footnote{https://peps.python.org/pep-0587/}. Patch by Victor
Stinner.

@item 
gh-128844@footnote{https://github.com/python/cpython/issues/128844}: Add @ref{18ca,,PyUnstable_TryIncRef()} and
@ref{18cb,,PyUnstable_EnableTryIncRef()} unstable APIs.  These are helpers for
dealing with unowned references in a thread-safe way, particularly in the
free threading build.

@item 
gh-128911@footnote{https://github.com/python/cpython/issues/128911}: Add @ref{396,,PyImport_ImportModuleAttr()} and
@ref{397,,PyImport_ImportModuleAttrString()} helper functions to import a
module and get an attribute of the module. Patch by Victor Stinner.

@item 
gh-128863@footnote{https://github.com/python/cpython/issues/128863}: The following private functions are deprecated and planned for
removal in Python 3.18:


@itemize *

@item 
@code{_PyBytes_Join()}: use @ref{383,,PyBytes_Join()}.

@item 
@code{_PyDict_GetItemStringWithError()}: use @ref{421,,PyDict_GetItemStringRef()}.

@item 
@code{_PyDict_Pop()}: use @ref{422,,PyDict_Pop()}.

@item 
@code{_PyLong_Sign()}: use @ref{39a,,PyLong_GetSign()}.

@item 
@code{_PyLong_FromDigits()} and @code{_PyLong_New()}:
use @ref{3aa,,PyLongWriter_Create()}.

@item 
@code{_PyThreadState_UncheckedGet()}: use @ref{423,,PyThreadState_GetUnchecked()}.

@item 
@code{_PyUnicode_AsString()}: use @ref{424,,PyUnicode_AsUTF8()}.

@item 
@code{_Py_HashPointer()}: use @ref{425,,Py_HashPointer()}.

@item 
@code{_Py_fopen_obj()}: use @ref{393,,Py_fopen()}.
@end itemize

The pythoncapi-compat project@footnote{https://github.com/python/pythoncapi-compat/} can be used to get these
new public functions on Python 3.13 and older.

Patch by Victor Stinner.

@item 
gh-126599@footnote{https://github.com/python/cpython/issues/126599}: Remove some internal test APIs for the experimental JIT
compiler.

@item 
gh-127925@footnote{https://github.com/python/cpython/issues/127925}: Convert the @ref{3a,,decimal} module to use 
@geindex Python 향상 제안; PEP 757
PEP 757@footnote{https://peps.python.org/pep-0757/} C API
(export-import integers), offering some speed-up if the integer part of
the @ref{1fe,,Decimal} instance is small.  Patch by Sergey B
Kirpichev.
@end itemize

@node Build<12>,,C API<12>,Python 3 14 0 alpha 5
@anchor{whatsnew/changelog id149}@anchor{18cc}
@subsubsection Build



@itemize -

@item 
gh-129660@footnote{https://github.com/python/cpython/issues/129660}: Drop @code{test_embed} from PGO training, whose contribution in
recent versions is considered to be ignorable.

@item 
gh-128902@footnote{https://github.com/python/cpython/issues/128902}: Fix compile errors with Clang 9 and older due to lack of
@code{__attribute__((fallthrough))} support.
@end itemize

@node Python 3 14 0 alpha 4,Python 3 14 0 alpha 3,Python 3 14 0 alpha 5,Changelog
@anchor{whatsnew/changelog python-3-14-0-alpha-4}@anchor{18cd}
@subsection Python 3.14.0 alpha 4


`Release date: 2025-01-14'

@menu
* macOS: macOS<7>. 
* Tools/Demos: Tools/Demos<12>. 
* Tests: Tests<11>. 
* Library: Library<37>. 
* Core and Builtins: Core and Builtins<33>. 
* Library: Library<38>. 
* Core and Builtins: Core and Builtins<34>. 
* Library: Library<39>. 
* Core and Builtins: Core and Builtins<35>. 
* C API: C API<13>. 
* Build: Build<13>. 

@end menu

@node macOS<7>,Tools/Demos<12>,,Python 3 14 0 alpha 4
@anchor{whatsnew/changelog id150}@anchor{18ce}
@subsubsection macOS



@itemize -

@item 
gh-127592@footnote{https://github.com/python/cpython/issues/127592}: Usage of the unified Apple System Log APIs was disabled when
the minimum macOS version is earlier than 10.12.
@end itemize

@node Tools/Demos<12>,Tests<11>,macOS<7>,Python 3 14 0 alpha 4
@anchor{whatsnew/changelog id151}@anchor{18cf}
@subsubsection Tools/Demos



@itemize -

@item 
gh-128152@footnote{https://github.com/python/cpython/issues/128152}: Fix a bug where Argument Clinic’s C pre-processor parser tried
to parse pre-processor directives inside C comments. Patch by Erlend
Aasland.
@end itemize

@node Tests<11>,Library<37>,Tools/Demos<12>,Python 3 14 0 alpha 4
@anchor{whatsnew/changelog id152}@anchor{18d0}
@subsubsection Tests



@itemize -

@item 
gh-128690@footnote{https://github.com/python/cpython/issues/128690}: Temporarily do not use test_embed in PGO profile builds until
the problem with test_init_pyvenv_cfg failing in some configurations is
resolved.
@end itemize

@node Library<37>,Core and Builtins<33>,Tests<11>,Python 3 14 0 alpha 4
@anchor{whatsnew/changelog id153}@anchor{18d1}
@subsubsection Library



@itemize -

@item 
gh-128731@footnote{https://github.com/python/cpython/issues/128731}: Fix @ref{54e,,ResourceWarning} in
@ref{18d2,,urllib.robotparser.RobotFileParser.read()}.

@item 
gh-71339@footnote{https://github.com/python/cpython/issues/71339}: Add new assertion methods for @ref{10c,,unittest}:
@ref{2b4,,assertHasAttr()},
@ref{2b5,,assertNotHasAttr()},
@ref{2b6,,assertIsSubclass()},
@ref{2b7,,assertNotIsSubclass()}
@ref{2b8,,assertStartsWith()},
@ref{2b9,,assertNotStartsWith()},
@ref{2ba,,assertEndsWith()} and
@ref{2bb,,assertNotEndsWith()}.

@item 
gh-118761@footnote{https://github.com/python/cpython/issues/118761}: Improve import time of @ref{ab,,pickle} by 25% by removing an
unnecessary regular expression. As such, @ref{be,,re} is no more implicitly
available as @code{pickle.re}. Patch by Bénédikt Tran.

@item 
gh-128661@footnote{https://github.com/python/cpython/issues/128661}: Fixes @ref{1818,,typing.evaluate_forward_ref()} not showing
deprecation when @code{type_params} arg is not passed.

@item 
gh-128562@footnote{https://github.com/python/cpython/issues/128562}: Fix possible conflicts in generated @ref{f6,,tkinter} widget names
if the widget class name ends with a digit.

@item 
gh-128559@footnote{https://github.com/python/cpython/issues/128559}: Improved import time of @ref{b,,asyncio}.

@item 
gh-128552@footnote{https://github.com/python/cpython/issues/128552}: Fix cyclic garbage introduced by
@ref{1ca,,asyncio.loop.create_task()} and @ref{1cb,,asyncio.TaskGroup.create_task()}
holding a reference to the created task if it is eager.

@item 
gh-128340@footnote{https://github.com/python/cpython/issues/128340}: Add internal thread safe handle to be used in
@ref{cfa,,asyncio.loop.call_soon_threadsafe()} for thread safe cancellation.

@item 
gh-128182@footnote{https://github.com/python/cpython/issues/128182}: Fix crash when using @ref{2e,,ctypes} pointers concurrently on the
@ref{1f4,,free threaded} build.

@item 
gh-128400@footnote{https://github.com/python/cpython/issues/128400}: Only show the current thread in @ref{5c,,faulthandler} on the
@ref{1f4,,free threaded} build to prevent races.

@item 
gh-128400@footnote{https://github.com/python/cpython/issues/128400}: Fix crash when using @ref{ffe,,faulthandler.dump_traceback()} while
other threads are active on the @ref{1f4,,free threaded}
build.

@item 
gh-128388@footnote{https://github.com/python/cpython/issues/128388}: Fix @code{PyREPL} on Windows to support more keybindings, like the
@code{Control}-@code{←} and @code{Control}-@code{→} word-skipping keybindings and those
with meta (i.e. @code{Alt}), e.g. @code{Alt}-@code{d} to @code{kill-word} or
@code{Alt}-@code{Backspace} @code{backward-kill-word}.

@item 
gh-88834@footnote{https://github.com/python/cpython/issues/88834}: Unify the instance check for @ref{2a8,,typing.Union} and
@ref{2a7,,types.UnionType}: @code{Union} now uses the instance checks
against its parameters instead of the subclass checks.

@item 
gh-128302@footnote{https://github.com/python/cpython/issues/128302}: Fix
@code{xml.dom.xmlbuilder.DOMEntityResolver.resolveEntity()}, which was
broken by the Python 3.0 transition.

@item 
gh-128317@footnote{https://github.com/python/cpython/issues/128317}: Highlight today in colour in @ref{15,,calendar}’s CLI output.
Patch by Hugo van Kemenade.

@item 
gh-128302@footnote{https://github.com/python/cpython/issues/128302}: Allow @code{xml.dom.xmlbuilder.DOMParser.parse()} to correctly
handle @code{xml.dom.xmlbuilder.DOMInputSource} instances that only
have a @code{systemId} attribute set.

@item 
gh-128151@footnote{https://github.com/python/cpython/issues/128151}: Improve generation of @ref{c55,,UUID} objects version 3, 4,
5, and 8 via their dedicated functions by 30%. Patch by Bénédikt Tran.

@item 
gh-128118@footnote{https://github.com/python/cpython/issues/128118}: Improve performance of @ref{756,,copy.copy()} by 30% via a fast path
for atomic types and container types.

@item 
gh-127946@footnote{https://github.com/python/cpython/issues/127946}: Fix crash when modifying @ref{18d3,,ctypes._CFuncPtr} objects
concurrently on the @ref{1f4,,free threaded} build.

@item 
gh-128062@footnote{https://github.com/python/cpython/issues/128062}: Revert the font of @ref{108,,turtledemo}’s menu bar to its default
value and display the shortcut keys in the correct position.

@item 
gh-128014@footnote{https://github.com/python/cpython/issues/128014}: Fix resetting the default window icon by passing @code{default='@w{'}}
to the @ref{f6,,tkinter} method @code{wm_iconbitmap()}.

@item 
gh-41872@footnote{https://github.com/python/cpython/issues/41872}: Fix quick extraction of module docstrings from a file in
@ref{ba,,pydoc}. It now supports docstrings with single quotes, escape
sequences, raw string literals, and other Python syntax.

@item 
gh-127060@footnote{https://github.com/python/cpython/issues/127060}: Set TERM environment variable to “dumb” to disable traceback
colors in IDLE, since IDLE doesn’t understand ANSI escape sequences. Patch
by Victor Stinner.

@item 
gh-126742@footnote{https://github.com/python/cpython/issues/126742}: Fix support of localized error messages reported by
@code{dlerror(3)@footnote{https://manpages.debian.org/dlerror(3)}} and @code{gdbm_strerror@footnote{https://manpages.debian.org/gdbm(3)}} in
@ref{2e,,ctypes} and @ref{37,,dbm.gnu} functions respectively. Patch by Bénédikt
Tran.

@item 
gh-122548@footnote{https://github.com/python/cpython/issues/122548}: Adds two new local events to sys.monitoring, @code{BRANCH_LEFT}
and @code{BRANCH_RIGHT}. This allows the two arms of the branch to be
disabled independently, which should hugely improve performance of
branch-level coverage tools. The old branch event, @code{BRANCH} is now
deprecated.

@item 
gh-127847@footnote{https://github.com/python/cpython/issues/127847}: Fix the position when doing interleaved seeks and reads in
uncompressed, unencrypted zip files returned by
@ref{65b,,zipfile.ZipFile.open()}.

@item 
gh-127688@footnote{https://github.com/python/cpython/issues/127688}: Add the @ref{25d,,SCHED_DEADLINE} and @ref{25e,,SCHED_NORMAL}
constants to the @ref{a5,,os} module.

@item 
gh-83662@footnote{https://github.com/python/cpython/issues/83662}: Add missing @code{__class_getitem__} method to the Python
implementation of @ref{217,,functools.partial()}, to make it compatible with
the C version. This is mainly relevant for alternative Python
implementations like PyPy and GraalPy, because CPython will usually use
the C-implementation of that function.

@item 
gh-127586@footnote{https://github.com/python/cpython/issues/127586}: @ref{116a,,multiprocessing.pool.Pool} now properly restores
blocked signal handlers of the parent thread when creating processes via
either `spawn' or `forkserver'.

@item 
gh-98188@footnote{https://github.com/python/cpython/issues/98188}: Fix an issue in @ref{13d2,,email.message.Message.get_payload()} where
data cannot be decoded if the Content Transfer Encoding mechanism contains
trailing whitespaces or additional junk text. Patch by Hui Liu.

@item 
gh-127529@footnote{https://github.com/python/cpython/issues/127529}: Correct behavior of
@code{asyncio.selector_events.BaseSelectorEventLoop._accept_connection()}
in handling @ref{125c,,ConnectionAbortedError} in a loop. This improves
performance on OpenBSD.

@item 
gh-127360@footnote{https://github.com/python/cpython/issues/127360}: When a descriptive error message cannot be provided for an
@ref{147e,,ssl.SSLError}, the “unknown error” message now shows the internal
error code (as retrieved by @code{ERR_get_error} and similar OpenSSL
functions).

@item 
gh-127196@footnote{https://github.com/python/cpython/issues/127196}: Fix crash when dict with keys in invalid encoding were passed
to several functions in @code{_interpreters} module.

@item 
gh-124130@footnote{https://github.com/python/cpython/issues/124130}: Fix a bug in matching regular expression @code{\B} in empty input
string. Now it is always the opposite of @code{\b}. To get an old behavior,
use @code{(?!\A\Z)\B}. To get a new behavior in old Python versions, use
@code{(?!\b)}.

@item 
gh-126639@footnote{https://github.com/python/cpython/issues/126639}: @ref{6ec,,tempfile.NamedTemporaryFile} will now issue a
@ref{54e,,ResourceWarning} when it is finalized by the garbage collector
without being explicitly closed.

@item 
gh-126624@footnote{https://github.com/python/cpython/issues/126624}: Expose error code
@ref{18d4,,XML_ERROR_NOT_STARTED} of Expat >=2.6.4
in @ref{12d,,xml.parsers.expat.errors}.

@item 
gh-126225@footnote{https://github.com/python/cpython/issues/126225}: @ref{65,,getopt} and @ref{a4,,optparse} are no longer marked as
deprecated. There are legitimate reasons to use one of these modules in
preference to @ref{7,,argparse}, and none of these modules are at risk of
being removed from the standard library. Of the three, @code{argparse}
remains the recommended default choice, `unless' one of the concerns noted
at the top of the @code{optparse} module documentation applies.

@item 
gh-124761@footnote{https://github.com/python/cpython/issues/124761}: Add @ref{18d5,,SO_REUSEPORT_LB} constant to @ref{d1,,socket}
for FreeBSD.

@item 
gh-121720@footnote{https://github.com/python/cpython/issues/121720}: @ref{4f6,,enum.EnumDict} can now be used without resorting to
private API.

@item 
gh-123424@footnote{https://github.com/python/cpython/issues/123424}: Add @ref{2ca,,zipfile.ZipInfo._for_archive()} setting default
properties on @ref{2cb,,ZipInfo} objects. Patch by Bénédikt Tran
and Jason R. Coombs.

@item 
gh-121676@footnote{https://github.com/python/cpython/issues/121676}: Deprecate calling the Python implementation of
@ref{21a,,functools.reduce()} with a @code{function} or @code{sequence} as a
@ref{f0d,,keyword argument}. This will be forbidden in Python 3.16 in order
to match the C implementation.

@item 
gh-112015@footnote{https://github.com/python/cpython/issues/112015}: @ref{1eb,,ctypes.memoryview_at()} now exists to create a
@ref{165,,memoryview} object that refers to the supplied pointer and length.
This works like @ref{1ec,,ctypes.string_at()} except it avoids a buffer copy,
and is typically useful when implementing pure Python callback functions
that are passed dynamically-sized buffers.

@item 
gh-95371@footnote{https://github.com/python/cpython/issues/95371}: Added support for other image formats (PNG, PGM, and PPM) to the
turtle module. Patch by Shin-myoung-serp.
@end itemize

@node Core and Builtins<33>,Library<38>,Library<37>,Python 3 14 0 alpha 4
@anchor{whatsnew/changelog id154}@anchor{18d6}
@subsubsection Core and Builtins



@itemize -

@item 
gh-128078@footnote{https://github.com/python/cpython/issues/128078}: Fix a @ref{794,,SystemError} when using @ref{9d6,,anext()} with a
default tuple value. Patch by Bénédikt Tran.

@item 
gh-128717@footnote{https://github.com/python/cpython/issues/128717}: Fix a crash when setting the recursion limit while other
threads are active on the @ref{1f4,,free threaded} build.

@item 
gh-124483@footnote{https://github.com/python/cpython/issues/124483}: Treat @code{Py_DECREF} and variants as escaping when generating
opcode and uop metadata. This prevents the possibility of a @code{__del__}
method causing the JIT to behave incorrectly.

@item 
gh-126703@footnote{https://github.com/python/cpython/issues/126703}: Improve performance of class methods by using a freelist.

@item 
gh-128137@footnote{https://github.com/python/cpython/issues/128137}: Update @ref{137a,,PyASCIIObject} layout to handle interned field
with the atomic operation. Patch by Donghee Na.
@end itemize

@node Library<38>,Core and Builtins<34>,Core and Builtins<33>,Python 3 14 0 alpha 4
@anchor{whatsnew/changelog id155}@anchor{18d7}
@subsubsection Library



@itemize -

@item 
gh-128192@footnote{https://github.com/python/cpython/issues/128192}: Upgrade HTTP digest authentication algorithm for
@ref{111,,urllib.request} by supporting SHA-256 digest authentication as
specified in 
@geindex RFC; RFC 7616
RFC 7616@footnote{https://datatracker.ietf.org/doc/html/rfc7616.html}.
@end itemize

@node Core and Builtins<34>,Library<39>,Library<38>,Python 3 14 0 alpha 4
@anchor{whatsnew/changelog id156}@anchor{18d8}
@subsubsection Core and Builtins



@itemize -

@item 
gh-126868@footnote{https://github.com/python/cpython/issues/126868}: Increase usage of freelist for @ref{19b,,int} allocation.

@item 
gh-114203@footnote{https://github.com/python/cpython/issues/114203}: Optimize @code{Py_BEGIN_CRITICAL_SECTION} for simple recursive
calls.

@item 
gh-127705@footnote{https://github.com/python/cpython/issues/127705}: Adds stackref debugging when @code{Py_STACKREF_DEBUG} is set.
Finds all double-closes and leaks, logging the origin and last borrow.

Inspired by HPy’s debug mode.
@indicateurl{https://docs.hpyproject.org/en/latest/debug-mode.html}

@item 
gh-128079@footnote{https://github.com/python/cpython/issues/128079}: Fix a bug where @ref{1ac,,except*} does not
properly check the return value of an @ref{4d3,,ExceptionGroup}’s
@ref{18d9,,split()} function, leading to a crash in some
cases. Now when @code{split()} returns an invalid
object, @code{except*} raises a @ref{198,,TypeError} with
the original raised @code{ExceptionGroup} object chained to it.

@item 
gh-128030@footnote{https://github.com/python/cpython/issues/128030}: Avoid error from calling @code{PyModule_GetFilenameObject} on a
non-module object when importing a non-existent symbol from a non-module
object.
@end itemize

@node Library<39>,Core and Builtins<35>,Core and Builtins<34>,Python 3 14 0 alpha 4
@anchor{whatsnew/changelog id157}@anchor{18da}
@subsubsection Library



@itemize -

@item 
gh-128035@footnote{https://github.com/python/cpython/issues/128035}: Indicate through @ref{286,,ssl.HAS_PHA} whether the @ref{d5,,ssl}
module supports TLSv1.3 post-handshake client authentication (PHA). Patch
by Will Childs-Klein.
@end itemize

@node Core and Builtins<35>,C API<13>,Library<39>,Python 3 14 0 alpha 4
@anchor{whatsnew/changelog id158}@anchor{18db}
@subsubsection Core and Builtins



@itemize -

@item 
gh-127274@footnote{https://github.com/python/cpython/issues/127274}: Add a new flag, @code{CO_METHOD}, to @ref{18dc,,co_flags}
that indicates whether the code object belongs to a function defined in
class scope.

@item 
gh-66409@footnote{https://github.com/python/cpython/issues/66409}: During the @ref{18dd,,path initialization}, we now
check if @code{base_exec_prefix} is the same as @code{base_prefix} before
falling back to searching the Python interpreter directory.

@item 
gh-127970@footnote{https://github.com/python/cpython/issues/127970}: We now use the location of the @code{libpython} runtime library
used in the current process to determine @ref{3e6,,sys.base_prefix} on all
platforms implementing the dladdr@footnote{https://pubs.opengroup.org/onlinepubs/9799919799/functions/dladdr.html}
function defined by the UNIX standard — this includes Linux, Android,
macOS, iOS, FreeBSD, etc. This was already the case on Windows and macOS
Framework builds.

@item 
gh-127773@footnote{https://github.com/python/cpython/issues/127773}: Do not use the type attribute cache for types with incompatible
@ref{18de,,MRO}.

@item 
gh-127903@footnote{https://github.com/python/cpython/issues/127903}: @code{Objects/unicodeobject.c}: fix a crash on DEBUG builds in
@code{_copy_characters} when there is nothing to copy.

@item 
gh-127809@footnote{https://github.com/python/cpython/issues/127809}: Fix an issue where the experimental JIT may infer an incorrect
result type for exponentiation (@code{**} and @code{**=}), leading to bugs or
crashes.

@item 
gh-126862@footnote{https://github.com/python/cpython/issues/126862}: Fix a possible overflow when a class inherits from an absurd
number of super-classes. Reported by Valery Fedorenko. Patch by Bénédikt
Tran.
@end itemize

@node C API<13>,Build<13>,Core and Builtins<35>,Python 3 14 0 alpha 4
@anchor{whatsnew/changelog id159}@anchor{18df}
@subsubsection C API



@itemize -

@item 
gh-128400@footnote{https://github.com/python/cpython/issues/128400}: @ref{b79,,Py_FatalError()} no longer shows all threads on the
@ref{1f4,,free threaded} build to prevent crashes.

@item 
gh-128629@footnote{https://github.com/python/cpython/issues/128629}: Add macros @ref{37f,,Py_PACK_VERSION()} and
@ref{380,,Py_PACK_FULL_VERSION()} for bit-packing Python version numbers.

@item 
gh-128008@footnote{https://github.com/python/cpython/issues/128008}: Add @ref{18e0,,PyWeakref_IsDead()} function, which tests if a weak
reference is dead.

@item 
gh-127350@footnote{https://github.com/python/cpython/issues/127350}: Add @ref{393,,Py_fopen()} function to open a file. Similar to the
@code{fopen()} function, but the `path' parameter is a Python object and
an exception is set on error. Add also @ref{394,,Py_fclose()} function to
close a file, function needed for Windows support. Patch by Victor
Stinner.
@end itemize

@node Build<13>,,C API<13>,Python 3 14 0 alpha 4
@anchor{whatsnew/changelog id160}@anchor{18e1}
@subsubsection Build



@itemize -

@item 
gh-128627@footnote{https://github.com/python/cpython/issues/128627}: For Emscripten builds the function pointer cast call trampoline
now uses the wasm-gc ref.test instruction if it’s available instead of
Wasm JS type reflection.

@item 
gh-128472@footnote{https://github.com/python/cpython/issues/128472}: Skip BOLT optimization of functions using computed gotos,
fixing errors on build with LLVM 19.

@item 
gh-115765@footnote{https://github.com/python/cpython/issues/115765}: GNU Autoconf 2.72 is now required to generate
@code{configure}. Patch by Erlend Aasland.

@item 
gh-123925@footnote{https://github.com/python/cpython/issues/123925}: Fix building the @ref{2f,,curses} module on platforms with
libncurses but without libncursesw.

@item 
gh-90905@footnote{https://github.com/python/cpython/issues/90905}: Add support for cross-compiling to x86_64 on aarch64/arm64
macOS.

@item 
gh-128321@footnote{https://github.com/python/cpython/issues/128321}: Set @code{LIBS} instead of @code{LDFLAGS} when checking if
@ref{d4,,sqlite3} library functions are available. This fixes the ordering of
linked libraries during checks, which was incorrect when using a
statically linked @code{libsqlite3}.

@item 
gh-100384@footnote{https://github.com/python/cpython/issues/100384}: Error on @code{unguarded-availability} in macOS builds, preventing
invalid use of symbols that are not available in older versions of the OS.

@item 
gh-128104@footnote{https://github.com/python/cpython/issues/128104}: Remove @code{Py_STRFTIME_C99_SUPPORT} conditions in favor of
requiring C99 @code{strftime(3)@footnote{https://manpages.debian.org/strftime(3)}} specifier support at build time. When
cross-compiling, there is no build time check and support is assumed.

@item 
gh-127951@footnote{https://github.com/python/cpython/issues/127951}: Add option @code{--pystats} to the Windows build to enable
performance statistics collection.
@end itemize

@node Python 3 14 0 alpha 3,Python 3 14 0 alpha 2,Python 3 14 0 alpha 4,Changelog
@anchor{whatsnew/changelog python-3-14-0-alpha-3}@anchor{18e2}
@subsection Python 3.14.0 alpha 3


`Release date: 2024-12-17'

@menu
* Windows: Windows<12>. 
* Tools/Demos: Tools/Demos<13>. 
* Tests: Tests<12>. 
* Security: Security<15>. 
* Library: Library<40>. 
* Documentation: Documentation<12>. 
* Core and Builtins: Core and Builtins<36>. 
* Library: Library<41>. 
* Core and Builtins: Core and Builtins<37>. 
* C API: C API<14>. 
* Build: Build<14>. 

@end menu

@node Windows<12>,Tools/Demos<13>,,Python 3 14 0 alpha 3
@anchor{whatsnew/changelog id161}@anchor{18e3}
@subsubsection Windows



@itemize -

@item 
gh-127353@footnote{https://github.com/python/cpython/issues/127353}: Allow to force color output on Windows using environment
variables. Patch by Andrey Efremov.

@item 
gh-125729@footnote{https://github.com/python/cpython/issues/125729}: Makes the presence of the @ref{107,,turtle} module dependent on the
Tcl/Tk installer option. Previously, the module was always installed but
would be unusable without Tcl/Tk.
@end itemize

@node Tools/Demos<13>,Tests<12>,Windows<12>,Python 3 14 0 alpha 3
@anchor{whatsnew/changelog id162}@anchor{18e4}
@subsubsection Tools/Demos



@itemize -

@item 
gh-126700@footnote{https://github.com/python/cpython/issues/126700}: Add support for multi-argument @ref{67,,gettext} functions in
@code{pygettext.py}.
@end itemize

@node Tests<12>,Security<15>,Tools/Demos<13>,Python 3 14 0 alpha 3
@anchor{whatsnew/changelog id163}@anchor{18e5}
@subsubsection Tests



@itemize -

@item 
gh-127906@footnote{https://github.com/python/cpython/issues/127906}: Test the limited C API in test_cppext. Patch by Victor Stinner.

@item 
gh-127637@footnote{https://github.com/python/cpython/issues/127637}: Add tests for the @ref{3c,,dis} command-line interface. Patch by
Bénédikt Tran.

@item 
gh-126925@footnote{https://github.com/python/cpython/issues/126925}: iOS test results are now streamed during test execution, and
the deprecated xcresulttool is no longer used.

@item 
gh-127076@footnote{https://github.com/python/cpython/issues/127076}: Disable strace based system call tests when LD_PRELOAD is set.

@item 
gh-127076@footnote{https://github.com/python/cpython/issues/127076}: Filter out memory-related @code{mmap}, @code{munmap}, and
@code{mprotect}  calls from file-related ones when testing @ref{83,,io} behavior
using strace.
@end itemize

@node Security<15>,Library<40>,Tests<12>,Python 3 14 0 alpha 3
@anchor{whatsnew/changelog id164}@anchor{18e6}
@subsubsection Security



@itemize -

@item 
gh-127655@footnote{https://github.com/python/cpython/issues/127655}: Fixed the
@code{asyncio.selector_events._SelectorSocketTransport} transport not
pausing writes for the protocol when the buffer reaches the high water
mark when using @ref{17cf,,asyncio.WriteTransport.writelines()}.
@end itemize

@node Library<40>,Documentation<12>,Security<15>,Python 3 14 0 alpha 3
@anchor{whatsnew/changelog id165}@anchor{18e7}
@subsubsection Library



@itemize -

@item 
gh-126907@footnote{https://github.com/python/cpython/issues/126907}: Fix crash when using @ref{d,,atexit} concurrently on the
@ref{1f4,,free-threaded} build.

@item 
gh-127870@footnote{https://github.com/python/cpython/issues/127870}: Detect recursive calls in ctypes @code{_as_parameter_} handling.
Patch by Victor Stinner.

@item 
gh-127732@footnote{https://github.com/python/cpython/issues/127732}: The @ref{af,,platform} module now correctly detects Windows Server
2025.

@item 
gh-126789@footnote{https://github.com/python/cpython/issues/126789}: Fixed @ref{298,,sysconfig.get_config_vars()},
@ref{340,,sysconfig.get_paths()}, and siblings, returning outdated cached data
if the value  of @ref{3e7,,sys.prefix} or @ref{3eb,,sys.exec_prefix} changes.
Overwriting @code{sys.prefix} or @code{sys.exec_prefix} still is
discouraged, as that might break other parts of the code.

@item 
gh-127718@footnote{https://github.com/python/cpython/issues/127718}: Add colour to @ref{e9,,test.regrtest} output. Patch by Hugo van
Kemenade.

@item 
gh-127610@footnote{https://github.com/python/cpython/issues/127610}: Added validation for more than one var-positional or
var-keyword parameters in @ref{4e3,,inspect.Signature}. Patch by Maxim
Ageev.

@item 
gh-127627@footnote{https://github.com/python/cpython/issues/127627}: Added @code{posix._emscripten_debugger()} to help with debugging
the test suite on the Emscripten target.

@item 
gh-126821@footnote{https://github.com/python/cpython/issues/126821}: macOS and iOS apps can now choose to redirect stdout and stderr
to the system log during interpreter configuration.

@item 
gh-93312@footnote{https://github.com/python/cpython/issues/93312}: Include @code{<sys/pidfd.h>} to get @code{os.PIDFD_NONBLOCK} constant.
Patch by Victor Stinner.

@item 
gh-127481@footnote{https://github.com/python/cpython/issues/127481}: Add the @code{EPOLLWAKEUP} constant to the @ref{c6,,select} module.

@item 
gh-127065@footnote{https://github.com/python/cpython/issues/127065}: Make @ref{1033,,operator.methodcaller()} thread-safe and re-entrant
safe.

@item 
gh-127321@footnote{https://github.com/python/cpython/issues/127321}: @ref{272,,pdb.set_trace()} will not stop at an opcode that does not
have an associated line number anymore.

@item 
gh-127429@footnote{https://github.com/python/cpython/issues/127429}: Fixed bug where, on cross-builds, the @ref{e1,,sysconfig} POSIX
data was being generated with the host Python’s @code{Makefile}. The data is
now generated from current build’s @code{Makefile}.

@item 
gh-127413@footnote{https://github.com/python/cpython/issues/127413}: Add the @ref{209,,dis --specialized} command-line option to show
specialized bytecode. Patch by Bénédikt Tran.

@item 
gh-125413@footnote{https://github.com/python/cpython/issues/125413}: Revert addition of @code{pathlib.Path.scandir()}. This method
was added in 3.14.0a2. The optimizations remain for file system paths, but
other subclasses should only have to implement
@ref{26e,,pathlib.Path.iterdir()}.

@item 
gh-127257@footnote{https://github.com/python/cpython/issues/127257}: In @ref{d5,,ssl}, system call failures that OpenSSL reports using
@code{ERR_LIB_SYS} are now raised as @ref{2c0,,OSError}.

@item 
gh-59705@footnote{https://github.com/python/cpython/issues/59705}: On Linux, @ref{176,,threading.Thread} now sets the thread name to
the operating system. Patch by Victor Stinner.

@item 
gh-127303@footnote{https://github.com/python/cpython/issues/127303}: Publicly expose @ref{18e8,,EXACT_TOKEN_TYPES} in
@code{token.__all__}.

@item 
gh-127331@footnote{https://github.com/python/cpython/issues/127331}: @ref{d5,,ssl} can show descriptions for errors added in OpenSSL
3.4.

@item 
gh-123967@footnote{https://github.com/python/cpython/issues/123967}: Fix faulthandler for trampoline frames. If the top-most frame
is a trampoline frame, skip it. Patch by Victor Stinner.

@item 
gh-127178@footnote{https://github.com/python/cpython/issues/127178}: A @code{_sysconfig_vars_(...).json} file is now shipped in the
standard library directory. It contains the output of
@ref{298,,sysconfig.get_config_vars()} on the default environment encoded as
JSON data. This is an implementation detail, and may change at any time.

@item 
gh-127072@footnote{https://github.com/python/cpython/issues/127072}: Remove outdated @code{socket.NETLINK_*} constants not present in
Linux kernels beyond 2.6.17.

@item 
gh-127255@footnote{https://github.com/python/cpython/issues/127255}: The @ref{1ea,,CopyComPointer()} function is now public.
Previously, this was private and only available in @code{_ctypes}.

@item 
gh-127182@footnote{https://github.com/python/cpython/issues/127182}: Fix @code{io.StringIO.__setstate__()} crash, when @ref{884,,None}
was passed as the first value.

@item 
gh-127217@footnote{https://github.com/python/cpython/issues/127217}: Fix @ref{2bf,,urllib.request.pathname2url()} for paths starting with
multiple slashes on Posix.

@item 
gh-125866@footnote{https://github.com/python/cpython/issues/125866}: @ref{2bf,,urllib.request.pathname2url()} now adds an empty authority
when generating a URL for a path that begins with exactly one slash. For
example, the path @code{/etc/hosts} is converted to the scheme-less URL
@code{///etc/hosts}. As a result of this change, URLs without authorities are
only generated for relative paths.

@item 
gh-127221@footnote{https://github.com/python/cpython/issues/127221}: Add colour to @ref{10c,,unittest} output. Patch by Hugo van
Kemenade.

@item 
gh-127035@footnote{https://github.com/python/cpython/issues/127035}: Fix @ref{6da,,shutil.which} on Windows. Now it looks at direct
match if and only if the command ends with a PATHEXT extension or X_OK is
not in mode. Support extensionless files if “.” is in PATHEXT. Support
PATHEXT extensions that end with a dot.

@item 
gh-122273@footnote{https://github.com/python/cpython/issues/122273}: Support PyREPL history on Windows. Patch by devdanzin and
Victor Stinner.

@item 
gh-125866@footnote{https://github.com/python/cpython/issues/125866}: @ref{2bf,,urllib.request.pathname2url()} and
@ref{2bd,,url2pathname()} no longer convert Windows drive
letters to uppercase.

@item 
gh-127078@footnote{https://github.com/python/cpython/issues/127078}: Fix issue where @ref{2bd,,urllib.request.url2pathname()} failed to
discard an extra slash before a UNC drive in the URL path on Windows.

@item 
gh-126766@footnote{https://github.com/python/cpython/issues/126766}: Fix issue where @ref{2bd,,urllib.request.url2pathname()} failed to
discard any ‘localhost’ authority present in the URL.

@item 
gh-127065@footnote{https://github.com/python/cpython/issues/127065}: Fix crash when calling a @ref{1033,,operator.methodcaller()} instance
from multiple threads in the free threading build.

@item 
gh-127090@footnote{https://github.com/python/cpython/issues/127090}: Fix value of @ref{18e9,,urllib.response.addinfourl.url} for
@code{file:} URLs that express relative paths and absolute Windows paths. The
canonical URL generated by @ref{2bf,,urllib.request.pathname2url()} is now
used.

@item 
gh-126992@footnote{https://github.com/python/cpython/issues/126992}: Fix LONG and INT opcodes to only use base 10 for string to
integer conversion in @ref{ab,,pickle}.

@item 
gh-126997@footnote{https://github.com/python/cpython/issues/126997}: Fix support of STRING and GLOBAL opcodes with non-ASCII
arguments in @ref{ac,,pickletools}. @ref{ebd,,pickletools.dis()} now outputs
non-ASCII bytes in STRING, BINSTRING and SHORT_BINSTRING arguments as
escaped (@code{\xXX}).

@item 
gh-126316@footnote{https://github.com/python/cpython/issues/126316}: @ref{6a,,grp}: Make @ref{18ea,,grp.getgrall()} thread-safe by adding a
mutex. Patch by Victor Stinner.

@item 
gh-126618@footnote{https://github.com/python/cpython/issues/126618}: Fix the representation of @ref{1488,,itertools.count} objects when
the count value is @ref{13ca,,sys.maxsize}.

@item 
gh-126615@footnote{https://github.com/python/cpython/issues/126615}: The @ref{1e9,,COMError} exception is now public.
Previously, this was private and only available in @code{_ctypes}.

@item 
gh-126985@footnote{https://github.com/python/cpython/issues/126985}: When running under a virtual environment with the @ref{cc,,site}
disabled (see @ref{13ad,,-S}), @ref{3e7,,sys.prefix} and
@ref{3e6,,sys.base_prefix} will now point to the virtual environment, instead
of the base installation.

@item 
gh-112192@footnote{https://github.com/python/cpython/issues/112192}: In the @ref{103,,trace} module, increase the coverage precision
(@code{cov%}) to one decimal.

@item 
gh-118761@footnote{https://github.com/python/cpython/issues/118761}: Improve import time of @ref{93,,mimetypes} by around 11-16 times.
Patch by Hugo van Kemenade.

@item 
gh-126947@footnote{https://github.com/python/cpython/issues/126947}: Raise @ref{198,,TypeError} in
@code{_pydatetime.timedelta.__new__()} if the passed arguments are not
@ref{19b,,int} or @ref{196,,float}, so that the Python implementation is in
line with the C implementation.

@item 
gh-126946@footnote{https://github.com/python/cpython/issues/126946}: Improve the @ref{18eb,,GetoptError} error message when a
long option prefix matches multiple accepted options in
@ref{16c0,,getopt.getopt()} and @ref{16bf,,getopt.gnu_getopt()}.

@item 
gh-126899@footnote{https://github.com/python/cpython/issues/126899}: Make tkinter widget methods @code{after()} and
@code{after_idle()} accept arguments passed by keyword.

@item 
gh-85168@footnote{https://github.com/python/cpython/issues/85168}: Fix issue where @ref{2bd,,urllib.request.url2pathname()} and
@ref{2bf,,pathname2url()} always used UTF-8 when quoting and
unquoting file URIs. They now use the @ref{75c,,filesystem encoding and error handler}.

@item 
gh-126780@footnote{https://github.com/python/cpython/issues/126780}: Fix @ref{151e,,os.path.normpath()} for drive-relative paths on
Windows.

@item 
gh-126775@footnote{https://github.com/python/cpython/issues/126775}: Make @ref{18ec,,linecache.checkcache()} thread safe and GC
re-entrancy safe.

@item 
gh-126601@footnote{https://github.com/python/cpython/issues/126601}: Fix issue where @ref{2bf,,urllib.request.pathname2url()} raised
@ref{2c0,,OSError} when given a Windows path containing a colon character not
following a drive letter, such as before an NTFS alternate data stream.

@item 
gh-126727@footnote{https://github.com/python/cpython/issues/126727}: @code{locale.nl_langinfo(locale.ERA)} now returns multiple era
description segments separated by semicolons. Previously it only returned
the first segment on platforms with Glibc.

@item 
gh-85046@footnote{https://github.com/python/cpython/issues/85046}: Add @ref{20b,,EHWPOISON} error code to @ref{5b,,errno}.

@item 
gh-118201@footnote{https://github.com/python/cpython/issues/118201}: Fixed intermittent failures of @ref{18ed,,os.confstr},
@ref{1300,,os.pathconf} and @ref{18ee,,os.sysconf} on iOS and Android.

@item 
gh-86463@footnote{https://github.com/python/cpython/issues/86463}: The @code{usage} parameter of @ref{1bd,,argparse.ArgumentParser} no
longer affects the default value of the @code{prog} parameter in subparsers.

@item 
gh-124008@footnote{https://github.com/python/cpython/issues/124008}: Fix possible crash (in debug build), incorrect output or
returning incorrect value from raw binary @code{write()} when writing to
console on Windows.

@item 
gh-123401@footnote{https://github.com/python/cpython/issues/123401}: The @ref{75,,http.cookies} module now supports parsing obsolete
@geindex RFC; RFC 850
RFC 850@footnote{https://datatracker.ietf.org/doc/html/rfc850.html} date formats, in accordance with 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html} requirements.
Patch by Nano Zheng.

@item 
gh-122431@footnote{https://github.com/python/cpython/issues/122431}: @ref{1050,,readline.append_history_file()} now raises a
@ref{2ec,,ValueError} when given a negative value.

@item 
gh-122356@footnote{https://github.com/python/cpython/issues/122356}: Guarantee that the position of a file-like object passed to
@ref{152f,,zipfile.is_zipfile()} is left untouched after the call. Patch by
Bénédikt Tran.

@item 
gh-122288@footnote{https://github.com/python/cpython/issues/122288}: Improve the performances of @ref{1851,,fnmatch.translate()} by a
factor 1.7. Patch by Bénédikt Tran.

@item 
gh-88110@footnote{https://github.com/python/cpython/issues/88110}: Fixed @ref{252,,multiprocessing.Process} reporting a @code{.exitcode}
of 1 even on success when using the @code{"fork"} start method while using a
@ref{948,,concurrent.futures.ThreadPoolExecutor}.

@item 
gh-97514@footnote{https://github.com/python/cpython/issues/97514}: Authentication was added to the @ref{98,,multiprocessing}
forkserver start method control socket so that only processes with the
authentication key generated by the process that spawned the forkserver
can control it.  This is an enhancement over the other gh-97514@footnote{https://github.com/python/cpython/issues/97514} fixes
so that access is no longer limited only by filesystem permissions.

The file descriptor exchange of control pipes with the forked worker
process now requires an explicit acknowledgement byte to be sent over the
socket after the exchange on all forkserver supporting platforms. That
makes testing the above much easier.
@end itemize

@node Documentation<12>,Core and Builtins<36>,Library<40>,Python 3 14 0 alpha 3
@anchor{whatsnew/changelog id166}@anchor{18ef}
@subsubsection Documentation



@itemize -

@item 
gh-127347@footnote{https://github.com/python/cpython/issues/127347}: Publicly expose @ref{18f0,,traceback.print_list()} in
@code{traceback.__all__}.
@end itemize

@node Core and Builtins<36>,Library<41>,Documentation<12>,Python 3 14 0 alpha 3
@anchor{whatsnew/changelog id167}@anchor{18f1}
@subsubsection Core and Builtins



@itemize -

@item 
gh-127740@footnote{https://github.com/python/cpython/issues/127740}: Fix error message in @ref{190,,bytes.fromhex()} when given an odd
number of digits to properly indicate that an even number of hexadecimal
digits is required.

@item 
gh-127058@footnote{https://github.com/python/cpython/issues/127058}: @code{PySequence_Tuple} now creates the resulting tuple
atomically, preventing partially created tuples being visible to the
garbage collector or through @code{gc.get_referrers()}

@item 
gh-127599@footnote{https://github.com/python/cpython/issues/127599}: Fix statistics for increments of object reference counts (in
particular, when a reference count was increased by more than 1 in a
single operation).

@item 
gh-127651@footnote{https://github.com/python/cpython/issues/127651}: When raising @ref{659,,ImportError} for missing symbols in @code{from}
imports, use @code{__file__} in the error message if @code{__spec__.origin} is
not a location

@item 
gh-127582@footnote{https://github.com/python/cpython/issues/127582}: Fix non-thread-safe object resurrection when calling finalizers
and watcher callbacks in the free threading build.

@item 
gh-127434@footnote{https://github.com/python/cpython/issues/127434}: The iOS compiler shims can now accept arguments with spaces.

@item 
gh-127536@footnote{https://github.com/python/cpython/issues/127536}: Add missing locks around some list assignment operations in the
free threading build.

@item 
gh-127085@footnote{https://github.com/python/cpython/issues/127085}: Fix race when exporting a buffer from a @ref{165,,memoryview}
object on the @ref{1f4,,free-threaded} build.

@item 
gh-127238@footnote{https://github.com/python/cpython/issues/127238}: Correct error message for @ref{18f2,,sys.set_int_max_str_digits()}.

@item 
gh-113841@footnote{https://github.com/python/cpython/issues/113841}: Fix possible undefined behavior division by zero in
@ref{197,,complex}’s @ref{18f3,,_Py_c_pow()}.
@end itemize

@node Library<41>,Core and Builtins<37>,Core and Builtins<36>,Python 3 14 0 alpha 3
@anchor{whatsnew/changelog id168}@anchor{18f4}
@subsubsection Library



@itemize -

@item 
gh-127133@footnote{https://github.com/python/cpython/issues/127133}: Calling @ref{2eb,,argparse.ArgumentParser.add_argument_group()} on
an argument group, and calling
@code{argparse.ArgumentParser.add_argument_group()} or
@ref{2ed,,argparse.ArgumentParser.add_mutually_exclusive_group()} on a mutually
exclusive group now raise exceptions. This nesting was never supported,
often failed to work correctly, and was unintentionally exposed through
inheritance. This functionality has been deprecated since Python 3.11.
@end itemize

@node Core and Builtins<37>,C API<14>,Library<41>,Python 3 14 0 alpha 3
@anchor{whatsnew/changelog id169}@anchor{18f5}
@subsubsection Core and Builtins



@itemize -

@item 
gh-126491@footnote{https://github.com/python/cpython/issues/126491}: Add a marking phase to the GC. All objects that can be
transitively reached from builtin modules or the stacks are marked as
reachable before cycle detection. This reduces the amount of work done by
the GC by approximately half.

@item 
gh-127020@footnote{https://github.com/python/cpython/issues/127020}: Fix a crash in the free threading build when
@ref{97b,,PyCode_GetCode()}, @ref{97c,,PyCode_GetVarnames()},
@ref{97d,,PyCode_GetCellvars()}, or @ref{97e,,PyCode_GetFreevars()} were called
from multiple threads at the same time.

@item 
gh-127010@footnote{https://github.com/python/cpython/issues/127010}: Simplify GC tracking of dictionaries. All dictionaries are
tracked when created, rather than being lazily tracked when a trackable
object was added to them. This simplifies the code considerably and
results in a slight speedup.

@item 
gh-126980@footnote{https://github.com/python/cpython/issues/126980}: Fix @ref{68b,,__buffer__()} of @ref{344,,bytearray} crashing
when @ref{18f6,,READ} or
@ref{18f7,,WRITE} are passed as flags.

@item 
gh-126937@footnote{https://github.com/python/cpython/issues/126937}: Fix @ref{198,,TypeError} when a @ref{1e5,,ctypes.Structure} has a
field size that doesn’t fit into an unsigned 16-bit integer. Instead, the
maximum number of `bits' is @ref{13ca,,sys.maxsize}.

@item 
gh-126868@footnote{https://github.com/python/cpython/issues/126868}: Increase performance of @ref{19b,,int} by adding a freelist for
compact ints.

@item 
gh-126881@footnote{https://github.com/python/cpython/issues/126881}: Fix crash in finalization of dtoa state. Patch by Kumar Aditya.

@item 
gh-126892@footnote{https://github.com/python/cpython/issues/126892}: Require cold or invalidated code to “warm up” before being JIT
compiled again.

@item 
gh-126091@footnote{https://github.com/python/cpython/issues/126091}: Ensure stack traces are complete when throwing into a generator
chain that ends in a custom generator.

@item 
gh-126024@footnote{https://github.com/python/cpython/issues/126024}: Optimize decoding of short UTF-8 sequences containing non-ASCII
characters by approximately 15%.

@item 
gh-125420@footnote{https://github.com/python/cpython/issues/125420}: Add @ref{18f8,,memoryview.index()} to @ref{165,,memoryview} objects.
Patch by Bénédikt Tran.

@item 
gh-125420@footnote{https://github.com/python/cpython/issues/125420}: Add @ref{18f9,,memoryview.count()} to @ref{165,,memoryview} objects.
Patch by Bénédikt Tran.

@item 
gh-124470@footnote{https://github.com/python/cpython/issues/124470}: Fix crash in free-threaded builds when replacing object
dictionary while reading attribute on another thread

@item 
gh-69639@footnote{https://github.com/python/cpython/issues/69639}: Implement mixed-mode arithmetic rules combining real and complex
numbers as specified by C standards since C99.  Patch by Sergey B
Kirpichev.

@item 
gh-120010@footnote{https://github.com/python/cpython/issues/120010}: Correct invalid corner cases which resulted in @code{(nan+nanj)}
output in complex multiplication, e.g., @code{(1e300+1j)*(nan+infj)}.  Patch
by Sergey B Kirpichev.

@item 
gh-109746@footnote{https://github.com/python/cpython/issues/109746}: If @code{_thread.start_new_thread()} fails to start a new
thread, it deletes its state from interpreter and thus avoids its repeated
cleanup on finalization.
@end itemize

@node C API<14>,Build<14>,Core and Builtins<37>,Python 3 14 0 alpha 3
@anchor{whatsnew/changelog id170}@anchor{18fa}
@subsubsection C API



@itemize -

@item 
gh-127896@footnote{https://github.com/python/cpython/issues/127896}: The previously undocumented function @ref{3d8,,PySequence_In()} is
@ref{23d,,soft deprecated}. Use @ref{3d9,,PySequence_Contains()} instead.

@item 
gh-127791@footnote{https://github.com/python/cpython/issues/127791}: Fix loss of callbacks after more than one call to
@ref{18fb,,PyUnstable_AtExit()}.

@item 
gh-127691@footnote{https://github.com/python/cpython/issues/127691}: The @ref{461,,Unicode Exception Objects} C API
now raises a @ref{198,,TypeError} if its exception argument is not a
@ref{462,,UnicodeError} object. Patch by Bénédikt Tran.

@item 
gh-123378@footnote{https://github.com/python/cpython/issues/123378}: Ensure that the value of @ref{18c2,,UnicodeEncodeError.end} retrieved by @ref{18fc,,PyUnicodeEncodeError_GetEnd()}
lies in @code{[min(1, objlen), max(min(1, objlen), objlen)]} where `objlen'
is the length of @ref{18fd,,UnicodeEncodeError.object}.
Similar arguments apply to @ref{c07,,UnicodeDecodeError} and
@ref{18fe,,UnicodeTranslateError} and their corresponding C interface. Patch by
Bénédikt Tran.

@item 
gh-127314@footnote{https://github.com/python/cpython/issues/127314}: Improve error message when calling the C API without an active
thread state on the @ref{1f4,,free-threaded} build.

@item 
gh-123378@footnote{https://github.com/python/cpython/issues/123378}: Ensure that the value of @ref{18c1,,UnicodeEncodeError.start} retrieved by @ref{18ff,,PyUnicodeEncodeError_GetStart()}
lies in @code{[0, max(0, objlen - 1)]} where `objlen' is the length of
@ref{18fd,,UnicodeEncodeError.object}. Similar arguments
apply to @ref{c07,,UnicodeDecodeError} and @ref{18fe,,UnicodeTranslateError} and
their corresponding C interface. Patch by Bénédikt Tran.

@item 
gh-109523@footnote{https://github.com/python/cpython/issues/109523}: Reading text from a non-blocking stream with @code{read} may now
raise a @ref{235,,BlockingIOError} if the operation cannot immediately return
bytes.

@item 
gh-102471@footnote{https://github.com/python/cpython/issues/102471}: Add a new import and export API for Python @ref{19b,,int} objects
(
@geindex Python 향상 제안; PEP 757
PEP 757@footnote{https://peps.python.org/pep-0757/}):


@itemize *

@item 
@ref{3a7,,PyLong_GetNativeLayout()};

@item 
@ref{3a8,,PyLong_Export()};

@item 
@ref{3a9,,PyLong_FreeExport()};

@item 
@ref{3aa,,PyLongWriter_Create()};

@item 
@ref{3ab,,PyLongWriter_Finish()};

@item 
@ref{3ac,,PyLongWriter_Discard()}.
@end itemize

Patch by Victor Stinner.

@item 
gh-121058@footnote{https://github.com/python/cpython/issues/121058}: @code{PyThreadState_Clear()} now warns (and calls
@code{sys.excepthook}) if the thread state still has an active exception.
@end itemize

@node Build<14>,,C API<14>,Python 3 14 0 alpha 3
@anchor{whatsnew/changelog id171}@anchor{1900}
@subsubsection Build



@itemize -

@item 
gh-127865@footnote{https://github.com/python/cpython/issues/127865}: Fix build failure on systems without thread-locals support.

@item 
gh-127629@footnote{https://github.com/python/cpython/issues/127629}: Emscripten builds now include ctypes support.

@item 
gh-127111@footnote{https://github.com/python/cpython/issues/127111}: Updated the Emscripten web example to use ES6 modules and be
built into a distinct @code{web_example} subfolder.

@item 
gh-115869@footnote{https://github.com/python/cpython/issues/115869}: Make @code{jit_stencils.h} (which is produced during JIT builds)
reproducible.

@item 
gh-126898@footnote{https://github.com/python/cpython/issues/126898}: The Emscripten build of Python is now based on ES6 modules.
@end itemize

@node Python 3 14 0 alpha 2,Python 3 14 0 alpha 1,Python 3 14 0 alpha 3,Changelog
@anchor{whatsnew/changelog python-3-14-0-alpha-2}@anchor{1901}
@subsection Python 3.14.0 alpha 2


`Release date: 2024-11-19'

@menu
* Windows: Windows<13>. 
* Tools/Demos: Tools/Demos<14>. 
* Tests: Tests<13>. 
* Security: Security<16>. 
* Library: Library<42>. 
* Documentation: Documentation<13>. 
* Core and Builtins: Core and Builtins<38>. 
* Library: Library<43>. 
* Core and Builtins: Core and Builtins<39>. 
* Library: Library<44>. 
* Core and Builtins: Core and Builtins<40>. 
* Library: Library<45>. 
* C API: C API<15>. 
* Build: Build<15>. 

@end menu

@node Windows<13>,Tools/Demos<14>,,Python 3 14 0 alpha 2
@anchor{whatsnew/changelog id172}@anchor{1902}
@subsubsection Windows



@itemize -

@item 
gh-126911@footnote{https://github.com/python/cpython/issues/126911}: Update credits command output.

@item 
gh-118973@footnote{https://github.com/python/cpython/issues/118973}: Ensures the experimental free-threaded install includes the
@code{_tkinter} module. The optional Tcl/Tk component must also be installed
in order for the module to work.

@item 
gh-126497@footnote{https://github.com/python/cpython/issues/126497}: Fixes venv failure due to missing redirector executables in
experimental free-threaded installs.

@item 
gh-126074@footnote{https://github.com/python/cpython/issues/126074}: Removed unnecessary DLLs from Windows embeddable package

@item 
gh-125315@footnote{https://github.com/python/cpython/issues/125315}: Avoid crashing in @ref{af,,platform} due to slow WMI calls on some
Windows machines.

@item 
gh-126084@footnote{https://github.com/python/cpython/issues/126084}: Fix venvwlauncher to launch pythonw instead of python so no
extra console window is created.

@item 
gh-125842@footnote{https://github.com/python/cpython/issues/125842}: Fix a @ref{794,,SystemError} when @ref{277,,sys.exit()} is called with
@code{0xffffffff} on Windows.

@item 
gh-125550@footnote{https://github.com/python/cpython/issues/125550}: Enable the @ref{7d9,,Python install manager} to detect Python 3.14 installs from
the Windows Store.

@item 
gh-123803@footnote{https://github.com/python/cpython/issues/123803}: All Windows code pages are now supported as “cpXXX” codecs on
Windows.
@end itemize

@node Tools/Demos<14>,Tests<13>,Windows<13>,Python 3 14 0 alpha 2
@anchor{whatsnew/changelog id173}@anchor{1903}
@subsubsection Tools/Demos



@itemize -

@item 
gh-126807@footnote{https://github.com/python/cpython/issues/126807}: Fix extraction warnings in @code{pygettext.py} caused by
mistaking function definitions for function calls.

@item 
gh-126167@footnote{https://github.com/python/cpython/issues/126167}: The iOS testbed was modified so that it can be used by
third-party projects for testing purposes.
@end itemize

@node Tests<13>,Security<16>,Tools/Demos<14>,Python 3 14 0 alpha 2
@anchor{whatsnew/changelog id174}@anchor{1904}
@subsubsection Tests



@itemize -

@item 
gh-126909@footnote{https://github.com/python/cpython/issues/126909}: Fix test_os extended attribute tests to work on filesystems
with 1 KiB xattr size limit.

@item 
gh-125730@footnote{https://github.com/python/cpython/issues/125730}: Change @code{make test} to not run GUI tests by default. Use
@code{make ci} to run tests with GUI tests instead.

@item 
gh-124295@footnote{https://github.com/python/cpython/issues/124295}: Add translation tests to the @ref{7,,argparse} module.
@end itemize

@node Security<16>,Library<42>,Tests<13>,Python 3 14 0 alpha 2
@anchor{whatsnew/changelog id175}@anchor{1905}
@subsubsection Security



@itemize -

@item 
gh-126623@footnote{https://github.com/python/cpython/issues/126623}: Upgrade libexpat to 2.6.4
@end itemize

@node Library<42>,Documentation<13>,Security<16>,Python 3 14 0 alpha 2
@anchor{whatsnew/changelog id176}@anchor{1906}
@subsubsection Library



@itemize -

@item 
gh-85957@footnote{https://github.com/python/cpython/issues/85957}: Add missing MIME types for images with RFCs: emf, fits, g3fax,
jp2, jpm, jpx, t38, tiff-fx and wmf. Patch by Hugo van Kemenade.

@item 
gh-126920@footnote{https://github.com/python/cpython/issues/126920}: Fix the @code{prefix} and @code{exec_prefix} keys from
@ref{298,,sysconfig.get_config_vars()} incorrectly having the same value as
@ref{3e6,,sys.base_prefix} and @ref{3ea,,sys.base_exec_prefix},
respectively, inside virtual environments. They now accurately reflect
@ref{3e7,,sys.prefix} and @ref{3eb,,sys.exec_prefix}.

@item 
gh-67877@footnote{https://github.com/python/cpython/issues/67877}: Fix memory leaks when @ref{be,,regular expression} matching
terminates abruptly, either because of a signal or because memory
allocation fails.

@item 
gh-125063@footnote{https://github.com/python/cpython/issues/125063}: @ref{91,,marshal} now supports @ref{693,,slice} objects. The marshal
format version was increased to 5.

@item 
gh-126789@footnote{https://github.com/python/cpython/issues/126789}: Fixed the values of @ref{298,,sysconfig.get_config_vars()},
@ref{340,,sysconfig.get_paths()}, and their siblings when the @ref{cc,,site}
initialization happens after @ref{e1,,sysconfig} has built a cache for
@code{sysconfig.get_config_vars()}.

@item 
gh-126188@footnote{https://github.com/python/cpython/issues/126188}: Update bundled pip to 24.3.1

@item 
gh-126766@footnote{https://github.com/python/cpython/issues/126766}: Fix issue where @ref{2bd,,urllib.request.url2pathname()} failed to
discard two leading slashes introducing an empty authority section.

@item 
gh-126705@footnote{https://github.com/python/cpython/issues/126705}: Allow @ref{e4a,,os.PathLike} to be a base for Protocols.

@item 
gh-126699@footnote{https://github.com/python/cpython/issues/126699}: Allow @ref{fdd,,collections.abc.AsyncIterator} to be a base for
Protocols.

@item 
gh-126654@footnote{https://github.com/python/cpython/issues/126654}: Fix crash when non-dict was passed to several functions in
@code{_interpreters} module.

@item 
gh-104745@footnote{https://github.com/python/cpython/issues/104745}: Limit starting a patcher (from @ref{1091,,unittest.mock.patch()} or
@ref{1907,,unittest.mock.patch.object()}) more than once without stopping it

@item 
gh-126595@footnote{https://github.com/python/cpython/issues/126595}: Fix a crash when instantiating @ref{1488,,itertools.count} with an
initial count of @ref{13ca,,sys.maxsize} on debug builds. Patch by Bénédikt
Tran.

@item 
gh-120423@footnote{https://github.com/python/cpython/issues/120423}: Fix issue where @ref{2bf,,urllib.request.pathname2url()} mishandled
Windows paths with embedded forward slashes.

@item 
gh-126565@footnote{https://github.com/python/cpython/issues/126565}: Improve performances of @ref{1908,,zipfile.Path.open()} for
non-reading modes.

@item 
gh-126505@footnote{https://github.com/python/cpython/issues/126505}: Fix bugs in compiling case-insensitive @ref{be,,regular expressions} with character classes containing non-BMP characters:
upper-case non-BMP character did was ignored and the ASCII flag was
ignored when matching a character range whose upper bound is beyond the
BMP region.

@item 
gh-117378@footnote{https://github.com/python/cpython/issues/117378}: Fixed the @ref{98,,multiprocessing} @code{"forkserver"} start method
forkserver process to correctly inherit the parent’s @ref{3e4,,sys.path}
during the importing of @ref{1909,,multiprocessing.set_forkserver_preload()}
modules in the same manner as @code{sys.path} is configured in workers
before executing work items.

This bug caused some forkserver module preloading to silently fail to
preload. This manifested as a performance degradation in child processes
when the @code{sys.path} was required due to additional repeated work in
every worker.

It could also have a side effect of @code{""} remaining in @ref{3e4,,sys.path}
during forkserver preload imports instead of the absolute path from
@ref{190a,,os.getcwd()} at multiprocessing import time used in the worker
@code{sys.path}.

The @code{sys.path} differences between phases in the child process could
potentially have caused preload to import incorrect things from the wrong
location.  We are unaware of that actually having happened in practice.

@item 
gh-125679@footnote{https://github.com/python/cpython/issues/125679}: The @ref{1856,,multiprocessing.Lock} and
@ref{1857,,multiprocessing.RLock} @code{repr} values no longer say “unknown” on
macOS.

@item 
gh-126476@footnote{https://github.com/python/cpython/issues/126476}: Raise @ref{190b,,calendar.IllegalMonthError} (now a subclass of
@ref{173a,,IndexError}) for @ref{190c,,calendar.month()} when the input month is
not correct.

@item 
gh-126489@footnote{https://github.com/python/cpython/issues/126489}: The Python implementation of @ref{ab,,pickle} no longer calls
@ref{190d,,pickle.Pickler.persistent_id()} for the result of
@code{persistent_id()}.

@item 
gh-126451@footnote{https://github.com/python/cpython/issues/126451}: Register the @ref{177,,contextvars.Context} type to
@ref{ac7,,collections.abc.Mapping}.

@item 
gh-126175@footnote{https://github.com/python/cpython/issues/126175}: Add @code{msg}, @code{doc}, @code{pos}, @code{lineno} and @code{colno}
attributes to @ref{190e,,tomllib.TOMLDecodeError}. Deprecate instantiating with
free-form arguments.

@item 
gh-89416@footnote{https://github.com/python/cpython/issues/89416}: Add 
@geindex RFC; RFC 9559
RFC 9559@footnote{https://datatracker.ietf.org/doc/html/rfc9559.html} MIME types for Matroska audiovisual container
formats. Patch by Hugo van Kemenade.

@item 
gh-126417@footnote{https://github.com/python/cpython/issues/126417}: Register the @code{multiprocessing.managers.DictProxy} and
@code{multiprocessing.managers.ListProxy} types in
@ref{9b,,multiprocessing.managers} to @ref{12b1,,collections.abc.MutableMapping}
and @ref{4c1,,collections.abc.MutableSequence}, respectively.

@item 
gh-126390@footnote{https://github.com/python/cpython/issues/126390}: Add support for returning intermixed options and non-option
arguments in order in @ref{16bf,,getopt.gnu_getopt()}.

@item 
gh-126374@footnote{https://github.com/python/cpython/issues/126374}: Add support for options with optional arguments in the
@ref{65,,getopt} module.

@item 
gh-126363@footnote{https://github.com/python/cpython/issues/126363}: Speed up pattern parsing in @ref{537,,pathlib.Path.glob()} by
skipping creation of a @ref{266,,pathlib.Path} object for the pattern.

@item 
gh-126353@footnote{https://github.com/python/cpython/issues/126353}: @ref{2f2,,asyncio.get_event_loop()} now does not implicitly creates
an event loop. It now raises a @ref{244,,RuntimeError} if there is no set
event loop. Patch by Kumar Aditya.

@item 
gh-126313@footnote{https://github.com/python/cpython/issues/126313}: Fix an issue in @ref{190f,,curses.napms()} when
@ref{1910,,curses.initscr()} has not yet been called. Patch by Bénédikt Tran.

@item 
gh-126303@footnote{https://github.com/python/cpython/issues/126303}: Fix pickling and copying of @ref{1911,,os.sched_param} objects.

@item 
gh-126138@footnote{https://github.com/python/cpython/issues/126138}: Fix a use-after-free crash on @ref{1c7,,asyncio.Task} objects
whose underlying coroutine yields an object that implements an evil
@ref{dca,,__getattribute__()}. Patch by Nico Posada.

@item 
gh-120057@footnote{https://github.com/python/cpython/issues/120057}: Replace the @code{os.environ.refresh()} method with a new
@ref{258,,os.reload_environ()} function. Patch by Victor Stinner.

@item 
gh-126220@footnote{https://github.com/python/cpython/issues/126220}: Fix crash in @code{cProfile.Profile} and
@code{_lsprof.Profiler} when their callbacks were directly called with
0 arguments.

@item 
gh-126212@footnote{https://github.com/python/cpython/issues/126212}: Fix issue where @ref{2bf,,urllib.request.pathname2url()} and
@ref{2bd,,url2pathname()} removed slashes from Windows DOS
drive paths and URLs.

@item 
gh-126223@footnote{https://github.com/python/cpython/issues/126223}: Raise a @ref{886,,UnicodeEncodeError} instead of a
@ref{794,,SystemError} upon calling @code{_interpreters.create()} with an
invalid Unicode character.

@item 
gh-126205@footnote{https://github.com/python/cpython/issues/126205}: Fix issue where @ref{2bf,,urllib.request.pathname2url()} generated
URLs beginning with four slashes (rather than two) when given a Windows
UNC path.

@item 
gh-126156@footnote{https://github.com/python/cpython/issues/126156}: Improved performances of creating
@ref{dfa,,Morsel} objects by a factor of 3.8x.

@item 
gh-126105@footnote{https://github.com/python/cpython/issues/126105}: Fix a crash in @ref{9,,ast} when the @ref{17dc,,ast.AST._fields}
attribute is deleted.

@item 
gh-126106@footnote{https://github.com/python/cpython/issues/126106}: Fixes a possible @code{NULL} pointer dereference in @ref{d5,,ssl}.

@item 
gh-126080@footnote{https://github.com/python/cpython/issues/126080}: Fix a use-after-free crash on @ref{1c7,,asyncio.Task} objects for
which the underlying event loop implements an evil
@ref{dca,,__getattribute__()}. Reported by Nico-Posada. Patch by
Bénédikt Tran.

@item 
gh-125322@footnote{https://github.com/python/cpython/issues/125322}: Correct detection of complex numbers support in libffi.

@item 
gh-126083@footnote{https://github.com/python/cpython/issues/126083}: Fixed a reference leak in @ref{1c7,,asyncio.Task} objects when
reinitializing the same object with a non-@code{None} context. Patch by Nico
Posada.

@item 
gh-126068@footnote{https://github.com/python/cpython/issues/126068}: Fix exceptions in the @ref{7,,argparse} module so that only error
messages for ArgumentError and ArgumentTypeError are now translated.
ArgumentError is now only used for command line errors, not for logical
errors in the program. TypeError is now raised instead of ValueError for
some logical errors.

@item 
gh-125413@footnote{https://github.com/python/cpython/issues/125413}: Add @code{pathlib.Path.scandir()} method to efficiently fetch
directory children and their file attributes. This is a trivial wrapper of
@ref{c53,,os.scandir()}.

@item 
gh-125984@footnote{https://github.com/python/cpython/issues/125984}: Fix use-after-free crashes on @ref{dc5,,asyncio.Future} objects
for which the underlying event loop implements an evil
@ref{dca,,__getattribute__()}. Reported by Nico-Posada. Patch by
Bénédikt Tran.

@item 
gh-125926@footnote{https://github.com/python/cpython/issues/125926}: Fix @ref{1095,,urllib.parse.urljoin()} for base URI with undefined
authority. Although 
@geindex RFC; RFC 3986
RFC 3986@footnote{https://datatracker.ietf.org/doc/html/rfc3986.html} only specify reference resolution for
absolute base URI, @code{urljoin()} should continue to return sensible
result for relative base URI.

@item 
gh-125969@footnote{https://github.com/python/cpython/issues/125969}: Fix an out-of-bounds crash when an evil
@ref{cf9,,asyncio.loop.call_soon()} mutates the length of the internal
callbacks list. Patch by Bénédikt Tran.

@item 
gh-125966@footnote{https://github.com/python/cpython/issues/125966}: Fix a use-after-free crash in
@ref{1912,,asyncio.Future.remove_done_callback()}. Patch by Bénédikt Tran.

@item 
gh-125789@footnote{https://github.com/python/cpython/issues/125789}: Fix possible crash when mutating list of callbacks returned by
@code{asyncio.Future._callbacks}. It now always returns a new copy in C
implementation @code{_asyncio}. Patch by Kumar Aditya.

@item 
gh-126916@footnote{https://github.com/python/cpython/issues/126916}: Allow the `initial' parameter of @ref{21a,,functools.reduce()} to be
passed as a keyword argument. Patch by Sayandip Dutta.

@item 
gh-124452@footnote{https://github.com/python/cpython/issues/124452}: Fix an issue in
@ref{1913,,email.policy.EmailPolicy.header_source_parse()} and
@ref{1914,,email.policy.Compat32.header_source_parse()} that introduced spurious
leading whitespaces into header values when the header includes a newline
character after the header name delimiter (@code{:}) and before the value.

@item 
gh-117941@footnote{https://github.com/python/cpython/issues/117941}: @code{argparse.BooleanOptionalAction} now rejects option
names starting with @code{--no-}.

@item 
gh-125884@footnote{https://github.com/python/cpython/issues/125884}: Fixed the bug for @ref{aa,,pdb} where it can’t set breakpoints on
functions with certain annotations.

@item 
gh-125355@footnote{https://github.com/python/cpython/issues/125355}: Fix several bugs in
@ref{cf6,,argparse.ArgumentParser.parse_intermixed_args()}.


@itemize *

@item 
The parser no longer changes temporarily during parsing.

@item 
Default values are not processed twice.

@item 
Required mutually exclusive groups containing positional arguments are now supported.

@item 
The missing arguments report now includes the names of all required optional and positional arguments.

@item 
Unknown options can be intermixed with positional arguments in parse_known_intermixed_args().
@end itemize

@item 
gh-125767@footnote{https://github.com/python/cpython/issues/125767}: @ref{1a6,,super} objects are now @ref{ab,,pickleable} and
@ref{29,,copyable}.

@item 
gh-124969@footnote{https://github.com/python/cpython/issues/124969}: @code{locale.nl_langinfo(locale.ALT_DIGITS)} now returns a string
again. The returned value consists of up to 100 semicolon-separated
symbols.

@item 
gh-84850@footnote{https://github.com/python/cpython/issues/84850}: Remove @code{URLopener} and @code{FancyURLopener} classes
from @ref{111,,urllib.request}. They had previously raised
@ref{1a3,,DeprecationWarning} since Python 3.3.

@item 
gh-125666@footnote{https://github.com/python/cpython/issues/125666}: Avoid the exiting the interpreter if a null byte is given as
input in the new REPL.

@item 
gh-125710@footnote{https://github.com/python/cpython/issues/125710}: [Enum] fix hashable<->nonhashable comparisons for member values

@item 
gh-125631@footnote{https://github.com/python/cpython/issues/125631}: Restore ability to set @ref{190d,,persistent_id}
and @ref{1915,,persistent_load} attributes of instances of
the @code{Pickler} and @code{Unpickler} classes in the @ref{ab,,pickle}
module.

@item 
gh-125378@footnote{https://github.com/python/cpython/issues/125378}: Fixed the bug in @ref{aa,,pdb} where after a multi-line command,
an empty line repeats the first line of the multi-line command, instead of
the full command.

@item 
gh-125682@footnote{https://github.com/python/cpython/issues/125682}: Reject non-ASCII digits in the Python implementation of
@ref{b4e,,json.loads()} conforming to the JSON specification.

@item 
gh-125660@footnote{https://github.com/python/cpython/issues/125660}: Reject invalid unicode escapes for Python implementation of
@ref{b4e,,json.loads()}.

@item 
gh-52551@footnote{https://github.com/python/cpython/issues/52551}: Use @code{wcsftime()} to implement @ref{13ee,,time.strftime()} on
Windows.

@item 
gh-125259@footnote{https://github.com/python/cpython/issues/125259}: Fix the notes removal logic for errors thrown in enum
initialization.

@item 
gh-125633@footnote{https://github.com/python/cpython/issues/125633}: Add function @ref{232,,inspect.ispackage()} to determine whether an
object is a @ref{233,,package} or not.

@item 
gh-125614@footnote{https://github.com/python/cpython/issues/125614}: In the @ref{15f,,FORWARDREF} format of
@ref{6,,annotationlib}, fix bug where nested expressions were not returned
as @ref{177e,,annotationlib.ForwardRef} format.

@item 
gh-125590@footnote{https://github.com/python/cpython/issues/125590}: Allow @code{FrameLocalsProxy} to delete and pop if the key is not
a fast variable.

@item 
gh-125600@footnote{https://github.com/python/cpython/issues/125600}: Only show stale code warning in @ref{aa,,pdb} when we display
source code.

@item 
gh-125542@footnote{https://github.com/python/cpython/issues/125542}: Deprecate passing keyword-only `prefix_chars' argument to
@ref{2eb,,argparse.ArgumentParser.add_argument_group()}.

@item 
gh-125541@footnote{https://github.com/python/cpython/issues/125541}: Pressing @code{Ctrl}-@code{C} while blocked in
@ref{8a6,,threading.Lock.acquire()}, @ref{107a,,threading.RLock.acquire()}, and
@ref{13e9,,threading.Thread.join()} now interrupts the function call and raises
a @ref{bc4,,KeyboardInterrupt} exception on Windows, similar to how those
functions behave on macOS and Linux.

@item 
gh-125519@footnote{https://github.com/python/cpython/issues/125519}: Improve traceback if @ref{73c,,importlib.reload()} is called with an
object that is not a module. Patch by Alex Waygood.

@item 
gh-125451@footnote{https://github.com/python/cpython/issues/125451}: Fix deadlock when
@ref{1d6,,concurrent.futures.ProcessPoolExecutor} shuts down concurrently
with an error when feeding a job to a worker process.

@item 
gh-125115@footnote{https://github.com/python/cpython/issues/125115}: Fixed a bug in @ref{aa,,pdb} where arguments starting with @code{-}
can’t be passed to the debugged script.

@item 
gh-125398@footnote{https://github.com/python/cpython/issues/125398}: Fix the conversion of the @code{VIRTUAL_ENV} path in the
activate script in @ref{117,,venv} when running in Git Bash for Windows.

@item 
gh-125245@footnote{https://github.com/python/cpython/issues/125245}: Fix race condition when importing @ref{1f,,collections.abc}, which
could incorrectly return an empty module.

@item 
gh-52551@footnote{https://github.com/python/cpython/issues/52551}: Fix encoding issues in @ref{13ee,,time.strftime()}, the
@ref{e8d,,strftime()} method of the @ref{34,,datetime} classes
@ref{4e2,,datetime}, @ref{1fa,,date} and
@ref{1fb,,time} and formatting of these classes. Characters not
encodable in the current locale are now acceptable in the format string.
Surrogate pairs and sequence of surrogatescape-encoded bytes are no longer
recombinated. Embedded null character no longer terminates the format
string.

@item 
gh-124984@footnote{https://github.com/python/cpython/issues/124984}: Fixed thread safety in @ref{d5,,ssl} in the free-threaded build.
OpenSSL operations are now protected by a per-object lock.

@item 
gh-124651@footnote{https://github.com/python/cpython/issues/124651}: Properly quote template strings in @ref{117,,venv} activation
scripts.

@item 
gh-124694@footnote{https://github.com/python/cpython/issues/124694}: We’ve added
@ref{1d2,,concurrent.futures.InterpreterPoolExecutor}, which allows you to
run code in multiple isolated interpreters.  This allows you to circumvent
the limitations of CPU-bound threads (due to the GIL). Patch by Eric Snow.

This addition is unrelated to 
@geindex Python 향상 제안; PEP 734
PEP 734@footnote{https://peps.python.org/pep-0734/}.

@item 
gh-58032@footnote{https://github.com/python/cpython/issues/58032}: Deprecate the @ref{30c,,argparse.FileType} type converter.

@item 
gh-99749@footnote{https://github.com/python/cpython/issues/99749}: Adds a feature to optionally enable suggestions for argument
choices and subparser names if mistyped by the user.

@item 
gh-58956@footnote{https://github.com/python/cpython/issues/58956}: Fixed a bug in @ref{aa,,pdb} where sometimes the breakpoint won’t
trigger if it was set on a function which is already in the call stack.

@item 
gh-124111@footnote{https://github.com/python/cpython/issues/124111}: The tkinter module can now be built to use either the new
version 9.0.0 of Tcl/Tk or the latest release 8.6.15 of Tcl/Tk 8.  Tcl/Tk
9 includes many improvements, both to the Tcl language and to the
appearance and utility of the graphical user interface provided by Tk.

@item 
gh-80958@footnote{https://github.com/python/cpython/issues/80958}: unittest discovery supports PEP 420 namespace packages as start
directory again.

@item 
gh-123370@footnote{https://github.com/python/cpython/issues/123370}: Fix the canvas not clearing after running turtledemo clock.

@item 
gh-89083@footnote{https://github.com/python/cpython/issues/89083}: Add @ref{2c4,,uuid.uuid8()} for generating UUIDv8 objects as
specified in 
@geindex RFC; RFC 9562
RFC 9562@footnote{https://datatracker.ietf.org/doc/html/rfc9562.html}. Patch by Bénédikt Tran

@item 
gh-122549@footnote{https://github.com/python/cpython/issues/122549}: Add @ref{27d,,platform.invalidate_caches()} to invalidate cached
results.

@item 
gh-120754@footnote{https://github.com/python/cpython/issues/120754}: Update unbounded @code{read} calls in @ref{137,,zipfile} to specify an
explicit @code{size} putting a limit on how much data they may read. This
also updates handling around ZIP max comment size to match the standard
instead of reading comments that are one byte too long.

@item 
gh-121267@footnote{https://github.com/python/cpython/issues/121267}: Improve the performance of @ref{e4,,tarfile} when writing files,
by caching user names and group names.

@item 
gh-70764@footnote{https://github.com/python/cpython/issues/70764}: Fixed an issue where @ref{12da,,inspect.getclosurevars()} would
incorrectly classify an attribute name as a global variable when the name
exists both as an attribute name and a global variable.

@item 
gh-118289@footnote{https://github.com/python/cpython/issues/118289}: @code{posixpath.realpath()} now raises
@ref{1259,,NotADirectoryError} when `strict' mode is enabled and a
non-directory path with a trailing slash is supplied.

@item 
gh-119826@footnote{https://github.com/python/cpython/issues/119826}: Always return an absolute path for @ref{151f,,os.path.abspath()} on
Windows.

@item 
gh-97850@footnote{https://github.com/python/cpython/issues/97850}: Remove deprecated @code{pkgutil.get_loader()} and
@code{pkgutil.find_loader()}.

@item 
gh-118986@footnote{https://github.com/python/cpython/issues/118986}: Add @code{socket.IPV6_RECVERR} constant (available since
Linux 2.2).

@item 
gh-116897@footnote{https://github.com/python/cpython/issues/116897}: Accepting objects with false values (like @code{0} and @code{[]})
except empty strings, byte-like objects and @code{None} in
@ref{110,,urllib.parse} functions @ref{31e,,parse_qsl()} and
@ref{31f,,parse_qs()} is now deprecated.

@item 
gh-101955@footnote{https://github.com/python/cpython/issues/101955}: Fix SystemError when match regular expression pattern
containing some combination of possessive quantifier, alternative and
capture group.

@item 
gh-71936@footnote{https://github.com/python/cpython/issues/71936}: Fix a race condition in @ref{116a,,multiprocessing.pool.Pool}.

@item 
bpo-46128@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46128}: Strip @ref{361,,unittest.IsolatedAsyncioTestCase} stack frames
from reported stacktraces.

@item 
gh-84852@footnote{https://github.com/python/cpython/issues/84852}: Add MIME types for MS Embedded OpenType, OpenType Layout,
TrueType, WOFF 1.0 and 2.0 fonts. Patch by Sahil Prajapati and Hugo van
Kemenade.
@end itemize

@node Documentation<13>,Core and Builtins<38>,Library<42>,Python 3 14 0 alpha 2
@anchor{whatsnew/changelog id177}@anchor{1916}
@subsubsection Documentation



@itemize -

@item 
gh-126622@footnote{https://github.com/python/cpython/issues/126622}: Added stub pages for removed modules explaining their removal,
where to find replacements, and linking to the last Python version that
supported them. Contributed by Ned Batchelder.

@item 
gh-125277@footnote{https://github.com/python/cpython/issues/125277}: Require Sphinx 7.2.6 or later to build the Python
documentation. Patch by Adam Turner.

@item 
gh-60712@footnote{https://github.com/python/cpython/issues/60712}: Include the @ref{c7d,,object} type in the lists of documented
types. Change by Furkan Onder and Martin Panter.
@end itemize

@node Core and Builtins<38>,Library<43>,Documentation<13>,Python 3 14 0 alpha 2
@anchor{whatsnew/changelog id178}@anchor{1917}
@subsubsection Core and Builtins



@itemize -

@item 
gh-126795@footnote{https://github.com/python/cpython/issues/126795}: Increase the threshold for JIT code warmup. Depending on
platform and workload, this can result in performance gains of 1-9% and
memory savings of 3-5%.

@item 
gh-126341@footnote{https://github.com/python/cpython/issues/126341}: Now @ref{2ec,,ValueError} is raised instead of @ref{794,,SystemError}
when trying to iterate over a released @ref{165,,memoryview} object.

@item 
gh-126688@footnote{https://github.com/python/cpython/issues/126688}: Fix a crash when calling @ref{4b6,,os.fork()} on some operating
systems, including SerenityOS.
@end itemize

@node Library<43>,Core and Builtins<39>,Core and Builtins<38>,Python 3 14 0 alpha 2
@anchor{whatsnew/changelog id179}@anchor{1918}
@subsubsection Library



@itemize -

@item 
gh-126066@footnote{https://github.com/python/cpython/issues/126066}: Fix @ref{7b,,importlib} to not write an incomplete .pyc files when
a ulimit or some other operating system mechanism is preventing the write
to go through fully.
@end itemize

@node Core and Builtins<39>,Library<44>,Library<43>,Python 3 14 0 alpha 2
@anchor{whatsnew/changelog id180}@anchor{1919}
@subsubsection Core and Builtins



@itemize -

@item 
gh-126222@footnote{https://github.com/python/cpython/issues/126222}: Do not include count of “peek” items in @code{_PyUop_num_popped}.
This ensures that the correct number of items are popped from the stack
when a micro-op exits with an error.

@item 
gh-126366@footnote{https://github.com/python/cpython/issues/126366}: Fix crash when using @code{yield from} on an object that raises an
exception in its @code{__iter__}.
@end itemize

@node Library<44>,Core and Builtins<40>,Core and Builtins<39>,Python 3 14 0 alpha 2
@anchor{whatsnew/changelog id181}@anchor{191a}
@subsubsection Library



@itemize -

@item 
gh-126209@footnote{https://github.com/python/cpython/issues/126209}: Fix an issue with @code{skip_file_prefixes} parameter which
resulted in an inconsistent behaviour between the C and Python
implementations of @ref{171e,,warnings.warn()}. Patch by Daehee Kim.
@end itemize

@node Core and Builtins<40>,Library<45>,Library<44>,Python 3 14 0 alpha 2
@anchor{whatsnew/changelog id182}@anchor{191b}
@subsubsection Core and Builtins



@itemize -

@item 
gh-126312@footnote{https://github.com/python/cpython/issues/126312}: Fix crash during garbage collection on an object frozen by
@ref{d2d,,gc.freeze()} on the free-threaded build.

@item 
gh-103951@footnote{https://github.com/python/cpython/issues/103951}: Relax optimization requirements to allow fast attribute access
to module subclasses.

@item 
gh-126072@footnote{https://github.com/python/cpython/issues/126072}: Following gh-126101@footnote{https://github.com/python/cpython/issues/126101}, for @ref{7d1,,코드 객체} like lambda,
annotation and type alias, we no longer  add @code{None} to its
@ref{189d,,co_consts}.

@item 
gh-126195@footnote{https://github.com/python/cpython/issues/126195}: Improve JIT performance by 1.4% on macOS Apple Silicon by using
platform-specific memory protection APIs. Patch by Diego Russo.

@item 
gh-126139@footnote{https://github.com/python/cpython/issues/126139}: Provide better error location when attempting to use a
@ref{fac,,future statement} with an unknown future feature.

@item 
gh-126072@footnote{https://github.com/python/cpython/issues/126072}: Add a new attribute in @ref{18dc,,co_flags} to indicate
whether the first item in @ref{189d,,co_consts} is the docstring.
If a code object has no docstring, @code{None} will `NOT' be inserted.

@item 
gh-126076@footnote{https://github.com/python/cpython/issues/126076}: Relocated objects such as @code{tuple}, @code{bytes} and @code{str}
objects are properly tracked by @ref{105,,tracemalloc} and its associated
hooks. Patch by Pablo Galindo.

@item 
gh-90370@footnote{https://github.com/python/cpython/issues/90370}: Avoid temporary tuple creation for vararg in argument passing
with Argument Clinic generated code (if arguments either vararg or
positional-only).

@item 
gh-126018@footnote{https://github.com/python/cpython/issues/126018}: Fix a crash in @ref{191c,,sys.audit()} when passing a non-string as
first argument and Python was compiled in debug mode.

@item 
gh-126012@footnote{https://github.com/python/cpython/issues/126012}: The @ref{165,,memoryview} type now supports subscription, making
it a @ref{1a1,,generic type}.

@item 
gh-125837@footnote{https://github.com/python/cpython/issues/125837}: Adds @ref{36e,,LOAD_SMALL_INT} and @ref{375,,LOAD_CONST_IMMORTAL}
instructions. @code{LOAD_SMALL_INT} pushes a small integer equal to the
@code{oparg} to the stack. @code{LOAD_CONST_IMMORTAL} does the same as
@code{LOAD_CONST} but is more efficient for immortal objects. Removes
@code{RETURN_CONST}  instruction.

@item 
gh-125942@footnote{https://github.com/python/cpython/issues/125942}: On Android, the @code{errors} setting of @ref{ccc,,sys.stdout} was
changed from @code{surrogateescape} to @code{backslashreplace}.

@item 
gh-125859@footnote{https://github.com/python/cpython/issues/125859}: Fix a crash in the free threading build when
@ref{a04,,gc.get_objects()} or @ref{a05,,gc.get_referrers()} is called during an
in-progress garbage collection.

@item 
gh-125868@footnote{https://github.com/python/cpython/issues/125868}: It was possible in 3.14.0a1 only for attribute lookup to give
the wrong value. This was due to an incorrect specialization in very
specific circumstances. This is fixed in 3.14.0a2.

@item 
gh-125498@footnote{https://github.com/python/cpython/issues/125498}: The JIT has been updated to leverage Clang 19’s new
@code{preserve_none} attribute, which supports more platforms and is more
useful than LLVM’s existing @code{ghccc} calling convention. This also
removes the need to manually patch the calling convention in LLVM IR,
simplifying the JIT compilation process.

@item 
gh-125703@footnote{https://github.com/python/cpython/issues/125703}: Correctly honour @ref{105,,tracemalloc} hooks in specialized
@code{Py_DECREF} paths. Patch by Pablo Galindo

@item 
gh-125593@footnote{https://github.com/python/cpython/issues/125593}: Use color to highlight error locations in traceback from
exception group

@item 
gh-125017@footnote{https://github.com/python/cpython/issues/125017}: Fix crash on certain accesses to the @code{__annotations__} of
@ref{453,,staticmethod} and @ref{48f,,classmethod} objects.

@item 
gh-125588@footnote{https://github.com/python/cpython/issues/125588}: The Python PEG generator can now use f-strings in the grammar
actions. Patch by Pablo Galindo

@item 
gh-125444@footnote{https://github.com/python/cpython/issues/125444}: Fix illegal instruction for older Arm architectures. Patch by
Diego Russo, testing by Ross Burton.

@item 
gh-118423@footnote{https://github.com/python/cpython/issues/118423}: Add a new @code{INSTRUCTION_SIZE} macro to the cases generator
which returns the current instruction size.

@item 
gh-125038@footnote{https://github.com/python/cpython/issues/125038}: Fix crash when iterating over a generator expression after
direct changes on @code{gi_frame.f_locals}. Patch by Mikhail Efimov.

@item 
gh-124855@footnote{https://github.com/python/cpython/issues/124855}: Don’t allow the JIT and perf support to be active at the same
time. Patch by Pablo Galindo

@item 
gh-123714@footnote{https://github.com/python/cpython/issues/123714}: Update JIT compilation to use LLVM 19

@item 
gh-123930@footnote{https://github.com/python/cpython/issues/123930}: Improve the error message when a script shadowing a module from
the standard library causes @ref{659,,ImportError} to be raised during a
“from” import. Similarly, improve the error message when a script
shadowing a third party module attempts to “from” import an attribute from
that third party module while still initialising.

@item 
gh-119793@footnote{https://github.com/python/cpython/issues/119793}: The @ref{19f,,map()} built-in now has an optional keyword-only
`strict' flag like @ref{1a0,,zip()} to check that all the iterables are of
equal length. Patch by Wannes Boeykens.
@end itemize

@node Library<45>,C API<15>,Core and Builtins<40>,Python 3 14 0 alpha 2
@anchor{whatsnew/changelog id183}@anchor{191d}
@subsubsection Library



@itemize -

@item 
gh-118950@footnote{https://github.com/python/cpython/issues/118950}: Fix bug where SSLProtocol.connection_lost wasn’t getting called
when OSError was thrown on writing to socket.

@item 
gh-113570@footnote{https://github.com/python/cpython/issues/113570}: Fixed a bug in @code{reprlib.repr} where it incorrectly called the
repr method on shadowed Python built-in types.
@end itemize

@node C API<15>,Build<15>,Library<45>,Python 3 14 0 alpha 2
@anchor{whatsnew/changelog id184}@anchor{191e}
@subsubsection C API



@itemize -

@item 
gh-126554@footnote{https://github.com/python/cpython/issues/126554}: Fix error handling in @ref{bdb,,ctypes.CDLL} objects which could
result in a crash in rare situations.

@item 
gh-126061@footnote{https://github.com/python/cpython/issues/126061}: Add @ref{39b,,PyLong_IsPositive()}, @ref{39c,,PyLong_IsNegative()}
and @ref{39d,,PyLong_IsZero()} for checking if a @ref{39e,,PyLongObject} is
positive, negative, or zero, respectively.

@item 
gh-125608@footnote{https://github.com/python/cpython/issues/125608}: Fix a bug where dictionary watchers (e.g.,
@ref{783,,PyDict_Watch()}) on an object’s attribute dictionary
(@ref{77c,,__dict__}) were not triggered when the object’s attributes
were modified.

@item 
gh-123619@footnote{https://github.com/python/cpython/issues/123619}: Added the @ref{3c5,,PyUnstable_Object_EnableDeferredRefcount()}
function for enabling 
@geindex Python 향상 제안; PEP 703
PEP 703@footnote{https://peps.python.org/pep-0703/} deferred reference counting.

@item 
gh-121654@footnote{https://github.com/python/cpython/issues/121654}: Add @ref{3af,,PyType_Freeze()} function to make a type immutable.
Patch by Victor Stinner.

@item 
gh-120026@footnote{https://github.com/python/cpython/issues/120026}: The @code{Py_HUGE_VAL} macro is @ref{23d,,soft deprecated}.
@end itemize

@node Build<15>,,C API<15>,Python 3 14 0 alpha 2
@anchor{whatsnew/changelog id185}@anchor{191f}
@subsubsection Build



@itemize -

@item 
gh-126691@footnote{https://github.com/python/cpython/issues/126691}: Removed the @code{--with-emscripten-target} configure flag. We
unified the @code{node} and @code{browser} options and the same build can now be
used, independent of target runtime.

@item 
gh-123877@footnote{https://github.com/python/cpython/issues/123877}: Use @code{wasm32-wasip1} as the target triple for WASI instead of
@code{wasm32-wasi}. The latter will eventually be reclaimed for WASI 1.0
while CPython currently only supports WASI preview1.

@item 
gh-126458@footnote{https://github.com/python/cpython/issues/126458}: Disable SIMD support for HACL under WASI.

@item 
gh-89640@footnote{https://github.com/python/cpython/issues/89640}: Hard-code float word ordering as little endian on WASM.

@item 
gh-126206@footnote{https://github.com/python/cpython/issues/126206}: @code{make clinic} now runs Argument Clinic using the @code{--force}
option, thus forcefully regenerating generated code.

@item 
gh-126187@footnote{https://github.com/python/cpython/issues/126187}: Introduced @code{Tools/wasm/emscripten.py} to simplify doing
Emscripten builds.

@item 
gh-124932@footnote{https://github.com/python/cpython/issues/124932}: For cross builds, there is now support for having a different
install @code{prefix} than the @code{host_prefix} used by @code{getpath.py}. This
is set to @code{/} by default for Emscripten, on other platforms the default
behavior is the same as before.

@item 
gh-125946@footnote{https://github.com/python/cpython/issues/125946}: The minimum supported Android version is now 7.0 (API level
24).

@item 
gh-125940@footnote{https://github.com/python/cpython/issues/125940}: The Android build now supports 16 KB page sizes@footnote{https://developer.android.com/guide/practices/page-sizes}.

@item 
gh-89640@footnote{https://github.com/python/cpython/issues/89640}: Improve detection of float word ordering on Linux when link-time
optimizations are enabled.

@item 
gh-124928@footnote{https://github.com/python/cpython/issues/124928}: Emscripten builds now require node >= 18.

@item 
gh-115382@footnote{https://github.com/python/cpython/issues/115382}: Fix cross compile failures when the host and target SOABIs
match.
@end itemize

@node Python 3 14 0 alpha 1,Python 3 13 0 beta 1,Python 3 14 0 alpha 2,Changelog
@anchor{whatsnew/changelog python-3-14-0-alpha-1}@anchor{1920}
@subsection Python 3.14.0 alpha 1


`Release date: 2024-10-15'

@menu
* macOS: macOS<8>. 
* Windows: Windows<14>. 
* Tools/Demos: Tools/Demos<15>. 
* Tests: Tests<14>. 
* Security: Security<17>. 
* Library: Library<46>. 
* IDLE: IDLE<7>. 
* Documentation: Documentation<14>. 
* Core and Builtins: Core and Builtins<41>. 
* Library: Library<47>. 
* Core and Builtins: Core and Builtins<42>. 
* Library: Library<48>. 
* Core and Builtins: Core and Builtins<43>. 
* Library: Library<49>. 
* Core and Builtins: Core and Builtins<44>. 
* Library: Library<50>. 
* Core and Builtins: Core and Builtins<45>. 
* Library: Library<51>. 
* Core and Builtins: Core and Builtins<46>. 
* Library: Library<52>. 
* Core and Builtins: Core and Builtins<47>. 
* Library: Library<53>. 
* Core and Builtins: Core and Builtins<48>. 
* C API: C API<16>. 
* Build: Build<16>. 

@end menu

@node macOS<8>,Windows<14>,,Python 3 14 0 alpha 1
@anchor{whatsnew/changelog id186}@anchor{1921}
@subsubsection macOS



@itemize -

@item 
gh-124448@footnote{https://github.com/python/cpython/issues/124448}: Update bundled Tcl/Tk in macOS installer to 8.6.15.

@item 
gh-123797@footnote{https://github.com/python/cpython/issues/123797}: Check for runtime availability of @code{ptsname_r} function on
macos.

@item 
gh-123418@footnote{https://github.com/python/cpython/issues/123418}: Updated macOS installer build to use OpenSSL 3.0.15.
@end itemize

@node Windows<14>,Tools/Demos<15>,macOS<8>,Python 3 14 0 alpha 1
@anchor{whatsnew/changelog id187}@anchor{1922}
@subsubsection Windows



@itemize -

@item 
gh-124487@footnote{https://github.com/python/cpython/issues/124487}: Increases Windows required OS and API level to Windows 10.

@item 
gh-124609@footnote{https://github.com/python/cpython/issues/124609}: Fix @code{_Py_ThreadId} for Windows builds using MinGW. Patch by
Tony Roberts.

@item 
gh-124448@footnote{https://github.com/python/cpython/issues/124448}: Updated bundled Tcl/Tk to 8.6.15.

@item 
gh-124254@footnote{https://github.com/python/cpython/issues/124254}: Ensures experimental free-threaded binaries remain installed
when updating.

@item 
gh-123915@footnote{https://github.com/python/cpython/issues/123915}: Ensure that @code{Tools\msi\buildrelease.bat} uses different
directories for AMD64 and ARM64 builds.

@item 
gh-123418@footnote{https://github.com/python/cpython/issues/123418}: Updated Windows build to use OpenSSL 3.0.15.

@item 
gh-123476@footnote{https://github.com/python/cpython/issues/123476}: Add support for @code{socket.TCP_QUICKACK} on Windows platforms.

@item 
gh-122573@footnote{https://github.com/python/cpython/issues/122573}: The Windows build of CPython now requires 3.10 or newer.

@item 
gh-100256@footnote{https://github.com/python/cpython/issues/100256}: @ref{93,,mimetypes} no longer fails when it encounters an
inaccessible registry key.

@item 
gh-119679@footnote{https://github.com/python/cpython/issues/119679}: Ensures correct import libraries are included in Windows
installs.

@item 
gh-119690@footnote{https://github.com/python/cpython/issues/119690}: Adds Unicode support and fixes audit events for
@code{_winapi.CreateNamedPipe}.

@item 
gh-111201@footnote{https://github.com/python/cpython/issues/111201}: Add support for new pyrepl on Windows

@item 
gh-119070@footnote{https://github.com/python/cpython/issues/119070}: Fixes @code{py.exe} handling of shebangs like @code{/usr/bin/env
python3.12}, which were previously interpreted as @code{python3.exe} instead
of @code{python3.12.exe}.

@item 
gh-117505@footnote{https://github.com/python/cpython/issues/117505}: Fixes an issue with the Windows installer not running ensurepip
in a fully isolated environment. This could cause unexpected interactions
with the user site-packages.

@item 
gh-118209@footnote{https://github.com/python/cpython/issues/118209}: Avoid crashing in @ref{94,,mmap} on Windows when the mapped memory
is inaccessible due to file system errors or access violations.

@item 
gh-79846@footnote{https://github.com/python/cpython/issues/79846}: Makes @code{ssl.create_default_context()} ignore invalid
certificates in the Windows certificate store
@end itemize

@node Tools/Demos<15>,Tests<14>,Windows<14>,Python 3 14 0 alpha 1
@anchor{whatsnew/changelog id188}@anchor{1923}
@subsubsection Tools/Demos



@itemize -

@item 
gh-123418@footnote{https://github.com/python/cpython/issues/123418}: Update GitHub CI workflows to use OpenSSL 3.0.15 and
multissltests to use 3.0.15, 3.1.7, and 3.2.3.
@end itemize

@node Tests<14>,Security<17>,Tools/Demos<15>,Python 3 14 0 alpha 1
@anchor{whatsnew/changelog id189}@anchor{1924}
@subsubsection Tests



@itemize -

@item 
gh-125041@footnote{https://github.com/python/cpython/issues/125041}: Re-enable skipped tests for @ref{139,,zlib} on the s390x
architecture: only skip checks of the compressed bytes, which can be
different between zlib’s software implementation and the
hardware-accelerated implementation.

@item 
gh-124378@footnote{https://github.com/python/cpython/issues/124378}: Updated @code{test_ttk} to pass with Tcl/Tk 8.6.15.

@item 
gh-124213@footnote{https://github.com/python/cpython/issues/124213}: Detect whether the test suite is running inside a
systemd-nspawn container with @code{--suppress-sync=true} option, and skip
the @code{test_os} and @code{test_mmap} tests that are failing in this scenario.

@item 
gh-124190@footnote{https://github.com/python/cpython/issues/124190}: Add capability to ignore entire files or directories in check
warning CI tool

@item 
gh-121921@footnote{https://github.com/python/cpython/issues/121921}: Update @code{Lib/test/crashers/bogus_code_obj.py} so that it
crashes properly again.

@item 
gh-112301@footnote{https://github.com/python/cpython/issues/112301}: Add tooling to check for changes in compiler warnings. Patch by
Nate Ohlson.

@item 
gh-59022@footnote{https://github.com/python/cpython/issues/59022}: Add tests for @ref{1925,,pkgutil.extend_path()}. Patch by Andreas
Stocker.

@item 
gh-99242@footnote{https://github.com/python/cpython/issues/99242}: @ref{1926,,os.getloadavg()} may throw @ref{2c0,,OSError} when running
regression tests under certain conditions (e.g. chroot). This error is now
caught and ignored, since reporting load average is optional.

@item 
gh-121084@footnote{https://github.com/python/cpython/issues/121084}: Fix test_typing random leaks. Clear typing ABC caches when
running tests for refleaks (@code{-R} option): call @code{_abc_caches_clear()}
on typing abstract classes and their subclasses. Patch by Victor Stinner.

@item 
gh-121160@footnote{https://github.com/python/cpython/issues/121160}: Add a test for @ref{1927,,readline.set_history_length()}. Note that
this test may fail on readline libraries.

@item 
gh-121200@footnote{https://github.com/python/cpython/issues/121200}: Fix @code{test_expanduser_pwd2()} of @code{test_posixpath}.  Call
@code{getpwnam()} to get @code{pw_dir}, since it can be different than
@code{getpwall()} @code{pw_dir}. Patch by Victor Stinner.

@item 
gh-121188@footnote{https://github.com/python/cpython/issues/121188}: When creating the JUnit XML file, regrtest now escapes
characters which are invalid in XML, such as the chr(27) control character
used in ANSI escape sequences. Patch by Victor Stinner.

@item 
gh-120801@footnote{https://github.com/python/cpython/issues/120801}: Cleaned up fixtures for importlib.metadata tests and
consolidated behavior with ‘test.support.os_helper’.

@item 
gh-119727@footnote{https://github.com/python/cpython/issues/119727}: Add @code{--single-process} command line option to Python test
runner (regrtest). Patch by Victor Stinner.

@item 
gh-119273@footnote{https://github.com/python/cpython/issues/119273}: Python test runner no longer runs tests using TTY (ex:
test_ioctl) in a process group (using @code{setsid()}). Previously, tests
using TTY were skipped. Patch by Victor Stinner.

@item 
gh-119050@footnote{https://github.com/python/cpython/issues/119050}: regrtest test runner: Add XML support to the refleak checker
(-R option). Patch by Victor Stinner.

@item 
gh-101525@footnote{https://github.com/python/cpython/issues/101525}: Skip @code{test_gdb} if the binary is relocated by BOLT. Patch by
Donghee Na.

@item 
gh-107562@footnote{https://github.com/python/cpython/issues/107562}: Test certificates have been updated to expire far in the
future. This allows testing Y2038 with system time set to after that, so
that actual Y2038 issues can be exposed, and not masked by expired
certificate errors.
@end itemize

@node Security<17>,Library<46>,Tests<14>,Python 3 14 0 alpha 1
@anchor{whatsnew/changelog id190}@anchor{1928}
@subsubsection Security



@itemize -

@item 
gh-125140@footnote{https://github.com/python/cpython/issues/125140}: Remove the current directory from @code{sys.path} when using
PyREPL.

@item 
gh-123678@footnote{https://github.com/python/cpython/issues/123678}: Upgrade libexpat to 2.6.3

@item 
gh-112301@footnote{https://github.com/python/cpython/issues/112301}: Enable compiler options that warn of potential security
vulnerabilities.

@item 
gh-122792@footnote{https://github.com/python/cpython/issues/122792}: Changed IPv4-mapped @code{ipaddress.IPv6Address} to consistently
use the mapped IPv4 address value for deciding properties. Properties
which have their behavior fixed are @code{is_multicast}, @code{is_reserved},
@code{is_link_local}, @code{is_global}, and @code{is_unspecified}.

@item 
gh-112301@footnote{https://github.com/python/cpython/issues/112301}: Add ability to ignore warnings per file with warning count in
warning checking tooling. Patch by Nate Ohlson.

@item 
gh-112301@footnote{https://github.com/python/cpython/issues/112301}: Add macOS warning tracking to warning check tooling. Patch by
Nate Ohlson.

@item 
gh-122133@footnote{https://github.com/python/cpython/issues/122133}: Authenticate the socket connection for the
@code{socket.socketpair()} fallback on platforms where @code{AF_UNIX} is not
available like Windows.

Patch by Gregory P. Smith <@email{greg@@krypto.org}> and Seth Larson
<@email{seth@@python.org}>. Reported by Ellie <@email{el@@horse64.org}>

@item 
gh-121957@footnote{https://github.com/python/cpython/issues/121957}: Fixed missing audit events around interactive use of Python,
now also properly firing for @code{python -i}, as well as for @code{python -m
asyncio}. The events in question are @code{cpython.run_stdin} and
@code{cpython.run_startup}.

@item 
gh-112301@footnote{https://github.com/python/cpython/issues/112301}: Enable runtime protections for glibc to abort execution when
unsafe behavior is encountered, for all platforms except Windows.

@item 
gh-121285@footnote{https://github.com/python/cpython/issues/121285}: Remove backtracking from tarfile header parsing for
@code{hdrcharset}, PAX, and GNU sparse headers.

@item 
gh-112301@footnote{https://github.com/python/cpython/issues/112301}: Add default compiler options to improve security. Enable
-Wimplicit-fallthrough, -fstack-protector-strong, -Wtrampolines.

@item 
gh-118773@footnote{https://github.com/python/cpython/issues/118773}: Fixes creation of ACLs in @ref{52b,,os.mkdir()} on Windows to work
correctly on non-English machines.

@item 
gh-118486@footnote{https://github.com/python/cpython/issues/118486}: @ref{52b,,os.mkdir()} on Windows now accepts `mode' of @code{0o700} to
restrict the new directory to the current user. This fixes
@geindex Common Vulnerabilities and Exposures; CVE 2024-4030
CVE 2024-4030@footnote{https://www.cve.org/CVERecord?id=CVE-2024-4030} affecting @ref{52d,,tempfile.mkdtemp()} in scenarios where the
base temporary directory is more permissive than the default.
@end itemize

@node Library<46>,IDLE<7>,Security<17>,Python 3 14 0 alpha 1
@anchor{whatsnew/changelog id191}@anchor{1929}
@subsubsection Library



@itemize -

@item 
gh-125422@footnote{https://github.com/python/cpython/issues/125422}: Fixed the bug where @ref{aa,,pdb} and @ref{10,,bdb} can step into the
bottom caller frame.

@item 
gh-100141@footnote{https://github.com/python/cpython/issues/100141}: Fixed the bug where @ref{aa,,pdb} will be stuck in an infinite
loop when debugging an empty file.

@item 
gh-53203@footnote{https://github.com/python/cpython/issues/53203}: Fix @ref{1632,,time.strptime()} for @code{%c}, @code{%x} and @code{%X} formats
in many locales that use non-ASCII digits, like Persian, Burmese, Odia and
Shan.

@item 
gh-125206@footnote{https://github.com/python/cpython/issues/125206}: Workaround for old libffi versions is added. Module ctypes
supports double complex only with libffi >= 3.3.0. Patch by
Mikhail Efimov.

@item 
gh-89967@footnote{https://github.com/python/cpython/issues/89967}: Make @ref{192a,,WeakKeyDictionary} and
@ref{192b,,WeakValueDictionary} safe against concurrent mutations
from other threads. Patch by Kumar Aditya.

@item 
gh-125260@footnote{https://github.com/python/cpython/issues/125260}: The @ref{84d,,gzip.compress()} `mtime' parameter now defaults to 0
for reproducible output. Patch by Bernhard M. Wiedemann and Adam Turner.

@item 
gh-125243@footnote{https://github.com/python/cpython/issues/125243}: Fix data race when creating @ref{adc,,zoneinfo.ZoneInfo} objects
in the free threading build.

@item 
gh-125254@footnote{https://github.com/python/cpython/issues/125254}: Fix a bug where ArgumentError includes the incorrect ambiguous
option in @ref{7,,argparse}.

@item 
gh-125235@footnote{https://github.com/python/cpython/issues/125235}: Keep @ref{f6,,tkinter} TCL paths in venv pointing to base
installation on Windows.

@item 
gh-61011@footnote{https://github.com/python/cpython/issues/61011}: Fix inheritance of nested mutually exclusive groups from parent
parser in @ref{1bd,,argparse.ArgumentParser}. Previously, all nested
mutually exclusive groups lost their connection to the group containing
them and were displayed as belonging directly to the parser.

@item 
gh-125118@footnote{https://github.com/python/cpython/issues/125118}: Don’t copy arbitrary values to _Bool in the
@ref{db,,struct} module.

@item 
gh-125069@footnote{https://github.com/python/cpython/issues/125069}: Fix an issue where providing a @ref{6cc,,pathlib.PurePath} object
as an initializer argument to a second @code{PurePath} object
with a different @ref{536,,parser} resulted in arguments to
the former object’s initializer being joined by the latter object’s
parser.

@item 
gh-125096@footnote{https://github.com/python/cpython/issues/125096}: If the 
@geindex PYTHON_BASIC_REPL
@geindex 환경 변수; PYTHON_BASIC_REPL
@ref{1b6,,PYTHON_BASIC_REPL} environment variable is set,
the @ref{cc,,site} module no longer imports the @code{_pyrepl} module.
Moreover, the @code{site} module now respects @ref{b55,,-E} and
@ref{b56,,-I} command line options: ignore 
@geindex PYTHON_BASIC_REPL
@geindex 환경 변수; PYTHON_BASIC_REPL
@code{PYTHON_BASIC_REPL} in
this case. Patch by Victor Stinner.

@item 
gh-124969@footnote{https://github.com/python/cpython/issues/124969}: Fix @code{locale.nl_langinfo(locale.ALT_DIGITS)}. Now it returns a
tuple of up to 100 strings (an empty tuple on most locales). Previously it
returned the first item of that tuple or an empty string.

@item 
gh-124960@footnote{https://github.com/python/cpython/issues/124960}: Fix support for the @code{barry_as_FLUFL} future flag in the new
REPL.

@item 
gh-69998@footnote{https://github.com/python/cpython/issues/69998}: Fix @ref{454,,locale.nl_langinfo()} in case when different categories
have different locales. The function now sets temporarily the @code{LC_CTYPE}
locale in some cases. This temporary change affects other threads.

@item 
gh-124958@footnote{https://github.com/python/cpython/issues/124958}: Fix refcycles in exceptions raised from
@ref{4d2,,asyncio.TaskGroup} and the python implementation of
@ref{dc5,,asyncio.Future}

@item 
gh-53203@footnote{https://github.com/python/cpython/issues/53203}: Fix @ref{1632,,time.strptime()} for @code{%c} and @code{%x} formats in many
locales: Arabic, Bislama, Breton, Bodo, Kashubian, Chuvash, Estonian,
French, Irish, Ge’ez, Gurajati, Manx Gaelic, Hebrew, Hindi, Chhattisgarhi,
Haitian Kreyol, Japanese, Kannada, Korean, Marathi, Malay, Norwegian,
Nynorsk, Punjabi, Rajasthani, Tok Pisin, Yoruba, Yue Chinese, Yau/Nungon
and Chinese.

@item 
gh-123961@footnote{https://github.com/python/cpython/issues/123961}: Convert @ref{2f,,curses} to multi-phase initialization
(
@geindex Python 향상 제안; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}), thereby fixing reference leaks at interpreter shutdown.
Patch by Bénédikt Tran.

@item 
gh-124944@footnote{https://github.com/python/cpython/issues/124944}: Add @code{SO_ORIGINAL_DST} to the @ref{d1,,socket} module.

@item 
gh-117151@footnote{https://github.com/python/cpython/issues/117151}: The default buffer size used by @ref{c51,,shutil.copyfileobj()} has
been increased from 64k to 256k on non-Windows platforms. It was already
larger on Windows.

@item 
gh-90102@footnote{https://github.com/python/cpython/issues/90102}: Skip the @code{isatty} system call during open() when the file is
known to not be a character device. This provides a slight performance
improvement when reading whole files.

@item 
gh-124917@footnote{https://github.com/python/cpython/issues/124917}: Allow calling @ref{c02,,os.path.exists()} and
@ref{c03,,os.path.lexists()} with keyword arguments on Windows. Fixes a
regression in 3.13.0.

@item 
gh-65865@footnote{https://github.com/python/cpython/issues/65865}: @ref{7,,argparse} now raises early error for invalid @code{help}
arguments to @ref{4bd,,add_argument()},
@ref{e10,,add_subparsers()} and @code{add_parser()}.

@item 
gh-124653@footnote{https://github.com/python/cpython/issues/124653}: Fix detection of the minimal Queue API needed by the
@ref{8b,,logging} module. Patch by Bénédikt Tran.

@item 
gh-91818@footnote{https://github.com/python/cpython/issues/91818}: The CLI of many modules (@ref{9,,ast}, @ref{59,,ensurepip},
@ref{86,,json}, @ref{aa,,pdb}, @ref{d4,,sqlite3}, @ref{101,,tokenize}, @ref{117,,venv}) now
uses the actual executable name instead of simply “python” to display in
the usage message.

@item 
gh-124858@footnote{https://github.com/python/cpython/issues/124858}: Fix reference cycles left in tracebacks in
@ref{d0d,,asyncio.open_connection()} when used with @code{happy_eyeballs_delay}

@item 
gh-124390@footnote{https://github.com/python/cpython/issues/124390}: Fixed @ref{8b7,,AssertionError} when using
@code{asyncio.staggered.staggered_race()} with
@ref{6a1,,asyncio.eager_task_factory}.

@item 
gh-85935@footnote{https://github.com/python/cpython/issues/85935}: @ref{4bd,,argparse.ArgumentParser.add_argument()} now raises an
exception if an @ref{192c,,action} that does not consume arguments (like
‘store_const’ or ‘store_true’) or explicit @code{nargs=0} are specified for
positional arguments.

@item 
gh-124835@footnote{https://github.com/python/cpython/issues/124835}: Make @ref{192d,,tomllib.loads()} raise @ref{198,,TypeError} not
@ref{5ee,,AttributeError} on bad input types that do not have the @code{replace}
attribute. Improve error message when @ref{192,,bytes} is received.

@item 
gh-124693@footnote{https://github.com/python/cpython/issues/124693}: Fix a bug where @ref{7,,argparse} doesn’t recognize negative
complex numbers or negative numbers using scientific notation.

@item 
gh-124787@footnote{https://github.com/python/cpython/issues/124787}: Fix @ref{2ae,,typing.TypeAliasType} with incorrect
@code{type_params} argument. Now it raises a @ref{198,,TypeError} when a type
parameter without a default follows one with a default, and when an entry
in the @code{type_params} tuple is not a type parameter object.

@item 
gh-66436@footnote{https://github.com/python/cpython/issues/66436}: Improved @ref{1bc,,prog} default value for
@ref{1bd,,argparse.ArgumentParser}. It will now include the name of the
Python executable along with the module or package name, or the path to a
directory, ZIP file, or directory within a ZIP file if the code was run
that way.

@item 
gh-116850@footnote{https://github.com/python/cpython/issues/116850}: Fix @ref{7,,argparse} for namespaces with not directly writable
dict (e.g. classes).

@item 
gh-101552@footnote{https://github.com/python/cpython/issues/101552}: Add an `annoation_format' parameter to
@ref{22f,,inspect.signature()}. Add an `quote_annotation_strings' parameter to
@ref{231,,inspect.Signature.format()}. Use the new functionality to improve the
display of annotations in signatures in @ref{ba,,pydoc}. Patch by Jelle
Zijlstra.

@item 
gh-58573@footnote{https://github.com/python/cpython/issues/58573}: Fix conflicts between abbreviated long options in the parent
parser and subparsers in @ref{7,,argparse}.

@item 
gh-124594@footnote{https://github.com/python/cpython/issues/124594}: All @ref{b,,asyncio} REPL prompts run in the same @ref{177,,context}. Contributed by Bartosz Sławecki.

@item 
gh-61181@footnote{https://github.com/python/cpython/issues/61181}: Fix support of @ref{192e,,choices} with string value in
@ref{7,,argparse}. Substrings of the specified string no longer considered
valid values.

@item 
gh-116750@footnote{https://github.com/python/cpython/issues/116750}: Provide @ref{192f,,sys.monitoring.clear_tool_id()} to unregister all
events and callbacks set by the tool.

@item 
gh-124552@footnote{https://github.com/python/cpython/issues/124552}: Improve the accuracy of @ref{10,,bdb}’s check for the possibility
of breakpoint in a frame. This makes it possible to disable unnecessary
events in functions.

@item 
gh-124538@footnote{https://github.com/python/cpython/issues/124538}: Fixed crash when using @ref{a06,,gc.get_referents()} on a capsule
object.

@item 
gh-80259@footnote{https://github.com/python/cpython/issues/80259}: Fix @ref{7,,argparse} support of positional arguments with
@code{nargs='?'}, @code{default=argparse.SUPPRESS} and specified @code{type}.

@item 
gh-120378@footnote{https://github.com/python/cpython/issues/120378}: Fix a crash related to an integer overflow in
@ref{1930,,curses.resizeterm()} and @ref{1931,,curses.resize_term()}.

@item 
gh-124498@footnote{https://github.com/python/cpython/issues/124498}: Fix @ref{2ae,,typing.TypeAliasType} not to be generic, when
@code{type_params} is an empty tuple.

@item 
gh-53834@footnote{https://github.com/python/cpython/issues/53834}: Fix support of arguments with @ref{192e,,choices} in @ref{7,,argparse}.
Positional arguments with @ref{1932,,nargs} equal to @code{'?'} or @code{'*'} no
longer check @ref{1933,,default} against @code{choices}. Optional arguments with
@code{nargs} equal to @code{'?'} no longer check @ref{1934,,const} against
@code{choices}.

@item 
gh-123884@footnote{https://github.com/python/cpython/issues/123884}: Fixed bug in itertools.tee() handling of other tee inputs (a
tee in a tee). The output now has the promised `n' independent new
iterators.  Formerly, the first iterator was identical (not independent)
to the input iterator. This would sometimes give surprising results.

@item 
gh-123017@footnote{https://github.com/python/cpython/issues/123017}: Due to unreliable results on some devices,
@ref{13ee,,time.strftime()} no longer accepts negative years on Android.

@item 
gh-123014@footnote{https://github.com/python/cpython/issues/123014}: @ref{6a3,,os.pidfd_open()} and @ref{b25,,signal.pidfd_send_signal()} are
now unavailable when building against Android API levels older than 31,
since the underlying system calls may cause a crash.

@item 
gh-124176@footnote{https://github.com/python/cpython/issues/124176}: Add support for @ref{4e1,,dataclasses.dataclass()} in
@ref{1935,,unittest.mock.create_autospec()}. Now @code{create_autospec} will check
for potential dataclasses and use @ref{1936,,dataclasses.fields()} function to
retrieve the spec information.

@item 
gh-124345@footnote{https://github.com/python/cpython/issues/124345}: @ref{7,,argparse} supports abbreviated single-dash long options
separated by @code{=} from its value.

@item 
gh-124400@footnote{https://github.com/python/cpython/issues/124400}: Fixed a @ref{aa,,pdb} bug where @code{until} has no effect when it
appears in a @code{commands} sequence. Also avoid printing the frame
information at a breakpoint that has a command list containing a command
that resumes execution.

@item 
gh-90562@footnote{https://github.com/python/cpython/issues/90562}: Modify dataclasses to support zero-argument super() when
@code{slots=True} is specified.  This works by modifying all references to
@code{__class__} to point to the newly created class.

@item 
gh-104860@footnote{https://github.com/python/cpython/issues/104860}: Fix disallowing abbreviation of single-dash long options in
@ref{7,,argparse} with @code{allow_abbrev=False}.

@item 
gh-63143@footnote{https://github.com/python/cpython/issues/63143}: Fix parsing mutually exclusive arguments in @ref{7,,argparse}.
Arguments with the value identical to the default value (e.g. booleans,
small integers, empty or 1-character strings) are no longer considered
“not present”.

@item 
gh-72795@footnote{https://github.com/python/cpython/issues/72795}: Positional arguments with @ref{1932,,nargs} equal to @code{'*'} or
@code{argparse.REMAINDER} are no longer required. This allows to use
positional argument with @code{nargs='*'} and without @code{default} in mutually
exclusive group and improves error message about required arguments.

@item 
gh-59317@footnote{https://github.com/python/cpython/issues/59317}: Fix parsing positional argument with @ref{1932,,nargs} equal to
@code{'?'} or @code{'*'} if it is preceded by an option and another positional
argument.

@item 
gh-100980@footnote{https://github.com/python/cpython/issues/100980}: The @ref{1937,,_fields_} attribute of
@ref{1e5,,ctypes.Structure} and @ref{1e6,,Union} is no longer set if
the setattr operation raises an error.

@item 
gh-53780@footnote{https://github.com/python/cpython/issues/53780}: @ref{7,,argparse} now ignores the first @code{"--"} (double dash)
between an option and command.

@item 
gh-124217@footnote{https://github.com/python/cpython/issues/124217}: Add RFC 9637 reserved IPv6 block @code{3fff::/20} in
@ref{84,,ipaddress} module.

@item 
gh-111513@footnote{https://github.com/python/cpython/issues/111513}: Improve the error message that may be raised by
@ref{dcc,,datetime.date.fromtimestamp()}.

@item 
gh-124248@footnote{https://github.com/python/cpython/issues/124248}: Fixed potential crash when using @ref{db,,struct} to process
zero-width ‘Pascal string’ fields (@code{0p}).

@item 
gh-81691@footnote{https://github.com/python/cpython/issues/81691}: Fix handling of multiple @code{"--"} (double dashes) in
@ref{7,,argparse}. Only the first one has now been removed, all subsequent
ones are now taken literally.

@item 
gh-87041@footnote{https://github.com/python/cpython/issues/87041}: Fix a bug in @ref{7,,argparse} where lengthy subparser argument
help is incorrectly indented.

@item 
gh-84559@footnote{https://github.com/python/cpython/issues/84559}: The default @ref{98,,multiprocessing} start method on Linux and
other POSIX systems has been changed away from often unsafe @code{"fork"} to
@code{"forkserver"} (when the platform supports sending file handles over
pipes as most do) or @code{"spawn"}.  Mac and Windows are unchanged as they
already default to @code{"spawn"}.

@item 
gh-124212@footnote{https://github.com/python/cpython/issues/124212}: Fix invalid variable in @ref{117,,venv} handling of failed symlink
on Windows

@item 
gh-124171@footnote{https://github.com/python/cpython/issues/124171}: Add workaround for broken @code{fmod()} implementations on
Windows, that loose zero sign (e.g. @code{fmod(-10, 1)} returns @code{0.0}).
Patch by Sergey B Kirpichev.

@item 
gh-123978@footnote{https://github.com/python/cpython/issues/123978}: Remove broken @ref{b30,,time.thread_time()} and
@ref{d89,,time.thread_time_ns()} on NetBSD.

@item 
gh-123934@footnote{https://github.com/python/cpython/issues/123934}: Fix @ref{108e,,unittest.mock.MagicMock} resetting magic methods
return values after @code{.reset_mock(return_value=True)} was called.

@item 
gh-124016@footnote{https://github.com/python/cpython/issues/124016}: Update @ref{10b,,unicodedata} database to Unicode 16.0.0.

@item 
gh-123968@footnote{https://github.com/python/cpython/issues/123968}: Fix the command-line interface for the @ref{bd,,random} module to
select floats between 0 and N, not 1 and N.

@item 
gh-123945@footnote{https://github.com/python/cpython/issues/123945}: Fix a bug where @ref{7,,argparse} doesn’t recognize negative
numbers with underscores

@item 
gh-123935@footnote{https://github.com/python/cpython/issues/123935}: Fix parent slots detection for dataclasses that inherit from
classes with @code{__dictoffset__}.

@item 
gh-123892@footnote{https://github.com/python/cpython/issues/123892}: Add @code{"_wmi"} to @ref{a42,,sys.stdlib_module_names}. Patch by
Victor Stinner.

@item 
gh-84808@footnote{https://github.com/python/cpython/issues/84808}: Fix error handling in @ref{fa0,,socket} method
@ref{173e,,connect_ex()} on platforms where @code{errno}
can be negative.

@item 
gh-123756@footnote{https://github.com/python/cpython/issues/123756}: Added a new argument @code{mode} to @ref{273,,pdb.Pdb}. Only allow
@ref{aa,,pdb} from command line to use @code{restart} command.

@item 
gh-122765@footnote{https://github.com/python/cpython/issues/122765}: Fix unbalanced quote errors occurring when activate.csh in
@ref{117,,venv} was sourced with a custom prompt containing unpaired quotes or
newlines.

@item 
gh-123657@footnote{https://github.com/python/cpython/issues/123657}: Fix crash and memory leak in @ref{1938,,decimal.getcontext()}. It
crashed when using a thread-local context by
@code{--with-decimal-contextvar=no}.

@item 
gh-123339@footnote{https://github.com/python/cpython/issues/123339}: Fix @ref{17c9,,inspect.getsource()} for classes in
@ref{1f,,collections.abc} and @ref{3a,,decimal} (for pure Python implementation)
modules. @ref{1939,,inspect.getcomments()} now raises OSError instead of
IndexError if the @code{__firstlineno__} value for a class is out of bound.

@item 
gh-123374@footnote{https://github.com/python/cpython/issues/123374}: Remove check for redefined memo entry in
@ref{ebd,,pickletools.dis()}.

@item 
gh-123504@footnote{https://github.com/python/cpython/issues/123504}: Fixed reference leak in the finalization of @ref{f6,,tkinter}.

@item 
gh-123430@footnote{https://github.com/python/cpython/issues/123430}: Pages generated by the @ref{76,,http.server} module allow the
browser to apply its default dark mode.

@item 
gh-123446@footnote{https://github.com/python/cpython/issues/123446}: Fix empty function name in @ref{198,,TypeError} when
@ref{6ad,,csv.reader()}, @ref{6ae,,csv.writer()}, or @ref{193a,,csv.register_dialect()}
are used without the required args.

@item 
gh-123448@footnote{https://github.com/python/cpython/issues/123448}: Fixed memory leak of @ref{568,,typing.NoDefault} by moving it to
the static types array.

@item 
gh-123409@footnote{https://github.com/python/cpython/issues/123409}: Fix @ref{193b,,ipaddress.IPv6Address.reverse_pointer} output
according to 
@geindex RFC; RFC 3596 Section 2.5
RFC 3596@comma{} §2.5@footnote{https://datatracker.ietf.org/doc/html/rfc3596.html#section-2.5}.  Patch by Bénédikt
Tran.

@item 
gh-123089@footnote{https://github.com/python/cpython/issues/123089}: Make @ref{7f4,,weakref.WeakSet} safe against concurrent mutations
while it is being iterated. Patch by Kumar Aditya.

@item 
gh-123363@footnote{https://github.com/python/cpython/issues/123363}: Show string value of @ref{193c,,CONTAINS_OP} oparg in @ref{3c,,dis}
output. Patch by Alexandr153.

@item 
gh-123341@footnote{https://github.com/python/cpython/issues/123341}: Add @ref{942,,__class_getitem__()} to
@code{tkinter.Event} for type subscript support at runtime. Patch by
Adonis Rakateli.

@item 
gh-123340@footnote{https://github.com/python/cpython/issues/123340}: Show string value of @ref{193d,,IS_OP} oparg in @ref{3c,,dis}
output.

@item 
gh-119518@footnote{https://github.com/python/cpython/issues/119518}: Speed up normalization of @ref{6cc,,pathlib.PurePath} and
@ref{266,,Path} objects by not interning string parts.

@item 
gh-123270@footnote{https://github.com/python/cpython/issues/123270}: Applied a more surgical fix for malformed payloads in
@ref{8d7,,zipfile.Path} causing infinite loops (gh-122905@footnote{https://github.com/python/cpython/issues/122905}) without breaking
contents using legitimate characters.

@item 
gh-73991@footnote{https://github.com/python/cpython/issues/73991}: Add @ref{268,,pathlib.Path.copy_into()} and
@ref{26a,,move_into()}, which copy and move files and directories
into `existing' directories.

@item 
gh-123228@footnote{https://github.com/python/cpython/issues/123228}: Fix return type for
@code{_pyrepl.readline._ReadlineWrapper.get_line_buffer()} to be
@ref{169,,str()}.  Patch by Sergey B Kirpichev.

@item 
gh-123240@footnote{https://github.com/python/cpython/issues/123240}: Raise audit events for the @ref{14dd,,input()} in the new REPL.

@item 
gh-76960@footnote{https://github.com/python/cpython/issues/76960}: Fix @ref{1095,,urllib.parse.urljoin()} and
@ref{144c,,urllib.parse.urldefrag()} for URIs containing empty components. For
example, @code{urljoin()} with relative reference “?” now sets empty query
and removes fragment. Preserve empty components (authority, params, query,
fragment) in @code{urljoin()}. Preserve empty components (authority,
params, query) in @code{urldefrag()}.

@item 
gh-116810@footnote{https://github.com/python/cpython/issues/116810}: Resolve a memory leak introduced in CPython 3.10’s @ref{d5,,ssl}
when the @ref{193e,,ssl.SSLSocket.session} property was accessed.  Speeds up
read and write access to said property by no longer unnecessarily cloning
session objects via serialization.

@item 
gh-123243@footnote{https://github.com/python/cpython/issues/123243}: Fix memory leak in @code{_decimal}.

@item 
gh-122546@footnote{https://github.com/python/cpython/issues/122546}: Consistently use same file name for different exceptions in the
new repl. Patch by Sergey B Kirpichev.

@item 
gh-123213@footnote{https://github.com/python/cpython/issues/123213}: @ref{13d8,,xml.etree.ElementTree.Element.extend()} and
@ref{363,,Element} assignment no longer hide the
internal exception if an erroneous generator is passed. Patch by Bar
Harel.

@item 
gh-85110@footnote{https://github.com/python/cpython/issues/85110}: Preserve relative path in URL without netloc in
@ref{193f,,urllib.parse.urlunsplit()} and @ref{1940,,urllib.parse.urlunparse()}.

@item 
gh-123165@footnote{https://github.com/python/cpython/issues/123165}: Add support for rendering @ref{1941,,Positions} in
@ref{3c,,dis}.

@item 
gh-122909@footnote{https://github.com/python/cpython/issues/122909}: In urllib.request when URLError is raised opening an ftp URL,
the exception argument is now consistently a string. Earlier versions
passed either a string or an ftplib exception instance as the argument to
URLError.

@item 
gh-123084@footnote{https://github.com/python/cpython/issues/123084}: Deprecate @code{shutil.ExecError}, which hasn’t been raised
by any @ref{ca,,shutil} function since Python 3.4. It’s now an alias for
@ref{244,,RuntimeError}.

@item 
gh-123085@footnote{https://github.com/python/cpython/issues/123085}: In a bare call to @ref{6b5,,importlib.resources.files()}, ensure the
caller’s frame is properly detected when @code{importlib.resources} is itself
available as a compiled module only (no source).

@item 
gh-123067@footnote{https://github.com/python/cpython/issues/123067}: Fix quadratic complexity in parsing @code{"}-quoted cookie values
with backslashes by @ref{75,,http.cookies}.

@item 
gh-123049@footnote{https://github.com/python/cpython/issues/123049}: Add support for @ref{1792,,UNNAMED_SECTION} in
@ref{1472,,configparser.ConfigParser.add_section()}.

@item 
gh-121735@footnote{https://github.com/python/cpython/issues/121735}: When working with zip archives, importlib.resources now
properly honors module-adjacent references (e.g. @code{files(pkg.mod)} and
not just @code{files(pkg)}).

@item 
gh-122981@footnote{https://github.com/python/cpython/issues/122981}: Fix @ref{17c9,,inspect.getsource()} for generated classes with Python
base classes (e.g. enums).

@item 
gh-122903@footnote{https://github.com/python/cpython/issues/122903}: @code{zipfile.Path.glob} now correctly matches directories instead
of silently omitting them.

@item 
gh-122905@footnote{https://github.com/python/cpython/issues/122905}: @ref{8d7,,zipfile.Path} objects now sanitize names from the
zipfile.

@item 
gh-122873@footnote{https://github.com/python/cpython/issues/122873}: Enable @ref{86,,json} module to work as a script using the
@ref{23c,,-m} switch: @code{python -m json}. See the @ref{23e,,JSON command-line interface} documentation. Patch by Trey Hunner.

@item 
gh-122858@footnote{https://github.com/python/cpython/issues/122858}: Deprecate @code{asyncio.iscoroutinefunction()} in favor of
@ref{30d,,inspect.iscoroutinefunction()}.

@item 
gh-116263@footnote{https://github.com/python/cpython/issues/116263}: @ref{1942,,logging.handlers.RotatingFileHandler} no longer rolls
over empty log files.

@item 
gh-105376@footnote{https://github.com/python/cpython/issues/105376}: Restore the deprecated @ref{8b,,logging} @code{warn()} method. It was
removed in Python 3.13 alpha 1. Keep the deprecated @code{warn()} method in
Python 3.13. Patch by Victor Stinner.

@item 
gh-122311@footnote{https://github.com/python/cpython/issues/122311}: Improve errors in the @ref{ab,,pickle} module.
@ref{1943,,PicklingError} is now raised more often instead of
@ref{886,,UnicodeEncodeError}, @ref{2ec,,ValueError} and @ref{5ee,,AttributeError},
and the original exception is chained to it. Improve and unify error
messages in Python and C implementations.

@item 
gh-122744@footnote{https://github.com/python/cpython/issues/122744}: Bump the version of pip bundled in ensurepip to version 24.2.

@item 
gh-118761@footnote{https://github.com/python/cpython/issues/118761}: Improve import time of @ref{b3,,pprint} by around seven times.
Patch by Hugo van Kemenade.

@item 
gh-118974@footnote{https://github.com/python/cpython/issues/118974}: Add @code{decorator} parameter to
@ref{185f,,dataclasses.make_dataclass()} to customize the functional creation of
dataclasses.

@item 
gh-118814@footnote{https://github.com/python/cpython/issues/118814}: Fix the @ref{487,,typing.TypeVar} constructor when name is passed
by keyword.

@item 
gh-122637@footnote{https://github.com/python/cpython/issues/122637}: Adjust @code{cmath.tanh(nanj)} and @code{cmath.tanh(infj)} for recent
C standards.

@item 
gh-122478@footnote{https://github.com/python/cpython/issues/122478}: Remove internal frames from tracebacks shown in
@ref{1944,,code.InteractiveInterpreter} with non-default
@ref{a0c,,sys.excepthook()}. Save correct tracebacks in
@ref{6e7,,sys.last_traceback} and update @code{__traceback__} attribute of
@ref{6e6,,sys.last_value} and @ref{6e4,,sys.last_exc}.

@item 
gh-116622@footnote{https://github.com/python/cpython/issues/116622}: On Android, the @code{FICLONE} and @code{FICLONERANGE} constants are
no longer exposed by @ref{5d,,fcntl}, as these ioctls are blocked by SELinux.

@item 
gh-82378@footnote{https://github.com/python/cpython/issues/82378}: Make sure that the new @ref{492,,REPL} interprets
@ref{1945,,sys.tracebacklimit} in the same way that the classic REPL did.

@item 
gh-122334@footnote{https://github.com/python/cpython/issues/122334}: Fix crash when importing @ref{d5,,ssl} after the main interpreter
restarts.

@item 
gh-122459@footnote{https://github.com/python/cpython/issues/122459}: Optimize @ref{ab,,pickling} by name objects without the
@code{__module__} attribute.

@item 
gh-87320@footnote{https://github.com/python/cpython/issues/87320}: In @ref{1944,,code.InteractiveInterpreter}, handle exceptions
caused by calling a non-default @ref{a0c,,sys.excepthook()}. Before, the
exception bubbled up to the caller, ending the @ref{492,,REPL}.

@item 
gh-122272@footnote{https://github.com/python/cpython/issues/122272}: On some platforms such as Linux, year with century was not
0-padded when formatted by @ref{e8d,,strftime()} with C99-specific
specifiers @code{'%C'} or @code{'%F'}. The 0-padding behavior is now guaranteed
when the format specifiers @code{'%C'} and @code{'%F'} are supported by the C
library. Patch by Ben Hsing

@item 
gh-122400@footnote{https://github.com/python/cpython/issues/122400}: Handle @ref{2ec,,ValueError}s raised by @ref{26d,,os.stat()} in
@ref{113f,,filecmp.dircmp} and @ref{1946,,filecmp.cmpfiles()}. Patch by Bénédikt
Tran.

@item 
gh-122311@footnote{https://github.com/python/cpython/issues/122311}: Fix some error messages in @ref{ab,,pickle}.

@item 
gh-121650@footnote{https://github.com/python/cpython/issues/121650}: @ref{3f,,email} headers with embedded newlines are now quoted on
output. The @ref{44,,generator} will now refuse to serialize (write)
headers that are unsafely folded or delimited; see
@ref{4f2,,verify_generated_headers}. (Contributed by Bas
Bloemsaat and Petr Viktorin in gh-121650@footnote{https://github.com/python/cpython/issues/121650}.)

@item 
gh-122332@footnote{https://github.com/python/cpython/issues/122332}: Fixed segfault with @ref{bce,,asyncio.Task.get_coro()} when using an
eager task factory.

@item 
gh-105733@footnote{https://github.com/python/cpython/issues/105733}: @ref{59d,,ctypes.ARRAY()} is now @ref{23d,,soft deprecated}: it no
longer emits deprecation warnings and is not scheduled for removal.

@item 
gh-122213@footnote{https://github.com/python/cpython/issues/122213}: Add notes for pickle serialization errors that allow to
identify the source of the error.

@item 
gh-119180@footnote{https://github.com/python/cpython/issues/119180}: As part of 
@geindex Python 향상 제안; PEP 749
PEP 749@footnote{https://peps.python.org/pep-0749/}, add the following attributes for
customizing evaluation of annotation scopes:


@itemize *

@item 
@code{evaluate_value} on @ref{2ae,,typing.TypeAliasType}

@item 
@code{evaluate_bound}, @code{evaluate_constraints}, and @code{evaluate_default} on @ref{487,,typing.TypeVar}

@item 
@code{evaluate_default} on @ref{488,,typing.ParamSpec}

@item 
@code{evaluate_default} on @ref{489,,typing.TypeVarTuple}
@end itemize

@item 
gh-119180@footnote{https://github.com/python/cpython/issues/119180}: Fix handling of classes with custom metaclasses in
@code{annotationlib.get_annotations}.

@item 
gh-122170@footnote{https://github.com/python/cpython/issues/122170}: Handle @ref{2ec,,ValueError}s raised by @ref{26d,,os.stat()} in
@ref{89,,linecache}. Patch by Bénédikt Tran.

@item 
gh-122163@footnote{https://github.com/python/cpython/issues/122163}: Add notes for JSON serialization errors that allow to identify
the source of the error.

@item 
gh-122129@footnote{https://github.com/python/cpython/issues/122129}: Improve support of method descriptors and wrappers in the help
title.

@item 
gh-122145@footnote{https://github.com/python/cpython/issues/122145}: Fix an issue when reporting tracebacks corresponding to Python
code emitting an empty AST body. Patch by Nikita Sobolev and Bénédikt
Tran.

@item 
gh-121723@footnote{https://github.com/python/cpython/issues/121723}: Make @ref{13b5,,logging.config.dictConfig()} accept any object
implementing the Queue public API. See the @ref{1947,,queue configuration} section for details. Patch by Bénédikt Tran.

@item 
gh-82951@footnote{https://github.com/python/cpython/issues/82951}: Serializing objects with complex @code{__qualname__} (such as
unbound methods and nested classes) by name no longer involves serializing
parent objects by value in pickle protocols < 4.

@item 
gh-120754@footnote{https://github.com/python/cpython/issues/120754}: @code{Pathlib.read_bytes} no longer opens the file in Python’s
buffered I/O mode. This reduces overheads as the code reads a file in
whole leading to a modest speedup.

@item 
gh-113785@footnote{https://github.com/python/cpython/issues/113785}: @ref{2d,,csv} now correctly parses numeric fields (when used with
@ref{1948,,csv.QUOTE_NONNUMERIC} or @ref{6ac,,csv.QUOTE_STRINGS}) which start
with an escape character.

@item 
gh-122088@footnote{https://github.com/python/cpython/issues/122088}: @ref{48a,,@@warnings.deprecated} now copies the coroutine status of
functions and methods so that @ref{30d,,inspect.iscoroutinefunction()} returns
the correct result.

@item 
gh-122081@footnote{https://github.com/python/cpython/issues/122081}: Fix a crash in the @code{decimal.IEEEContext()} optional
function available via the @code{EXTRA_FUNCTIONALITY} configuration flag.

@item 
gh-73991@footnote{https://github.com/python/cpython/issues/73991}: Add @ref{269,,pathlib.Path.move()}, which moves a file or directory
tree.

@item 
gh-121268@footnote{https://github.com/python/cpython/issues/121268}: Remove workarounds for non-IEEE 754 systems in @ref{19,,cmath}.

@item 
gh-119698@footnote{https://github.com/python/cpython/issues/119698}: Due to the lack of interest for
@ref{31d,,symtable.Class.get_methods()}, the method is marked as deprecated and
will be removed in Python 3.16. Patch by Bénédikt Tran.

@item 
gh-121889@footnote{https://github.com/python/cpython/issues/121889}: Adjusts @code{cmath.acosh(complex('0+nanj'))} for recent C
standards.

@item 
gh-121804@footnote{https://github.com/python/cpython/issues/121804}: Correctly show error locations, when @ref{18e,,SyntaxError} raised
in new repl. Patch by Sergey B Kirpichev.

@item 
gh-121797@footnote{https://github.com/python/cpython/issues/121797}: Add alternative @ref{213,,Fraction} constructor
@ref{214,,Fraction.from_number()}.

@item 
gh-121798@footnote{https://github.com/python/cpython/issues/121798}: Add alternative @ref{1fe,,Decimal} constructor
@ref{1fd,,Decimal.from_number()}.

@item 
gh-120930@footnote{https://github.com/python/cpython/issues/120930}: Fixed a bug introduced by gh-92081@footnote{https://github.com/python/cpython/issues/92081} that added an incorrect
extra blank to encoded words occurring in wrapped headers.

@item 
gh-57141@footnote{https://github.com/python/cpython/issues/57141}: The `shallow' argument to @ref{113f,,filecmp.dircmp} (new in Python
3.13) is now keyword-only.

@item 
gh-121245@footnote{https://github.com/python/cpython/issues/121245}: Simplify handling of the history file in
@code{site.register_readline()} helper. The @code{CAN_USE_PYREPL} variable now
will be initialized, when imported.  Patch by Sergey B Kirpichev.

@item 
gh-121249@footnote{https://github.com/python/cpython/issues/121249}: Support the float complex and double complex C types in the @ref{db,,struct} module if the compiler has C11
complex arithmetic.  Patch by Sergey B Kirpichev.

@item 
gh-121486@footnote{https://github.com/python/cpython/issues/121486}: @ref{92,,math} functions @ref{bf7,,isqrt()}, @ref{16c5,,log()},
@ref{12e0,,log2()} and @ref{1949,,log10()} now support integers larger
than @code{2**2**32} on 32-bit platforms.

@item 
gh-121474@footnote{https://github.com/python/cpython/issues/121474}: Fix missing sanity check for @code{parties} arg in
@ref{13e8,,threading.Barrier} constructor. Patch by Clinton Christian
(pygeek).

@item 
gh-121450@footnote{https://github.com/python/cpython/issues/121450}: Hard-coded breakpoints (@ref{271,,breakpoint()} and
@ref{272,,pdb.set_trace()}) now reuse the most recent @code{Pdb} instance that
calls @code{Pdb.set_trace()}, instead of creating a new one each time. As a
result, all the instance specific data like @code{display} and @code{commands}
are preserved across Hard-coded breakpoints.

@item 
gh-119169@footnote{https://github.com/python/cpython/issues/119169}: Slightly speed up @ref{6cf,,os.walk()} by simplifying exception
handling.

@item 
gh-121423@footnote{https://github.com/python/cpython/issues/121423}: Improve import time of @ref{d1,,socket} by lazy importing modules
and writing @code{socket.errorTab} as a constant.

@item 
gh-59110@footnote{https://github.com/python/cpython/issues/59110}: @ref{138,,zipimport} supports now namespace packages when no
directory entry exists.

@item 
gh-119004@footnote{https://github.com/python/cpython/issues/119004}: Fix a crash in @ref{194a,,OrderedDict.__eq__} when operands are mutated during the
check. Patch by Bénédikt Tran.

@item 
gh-121313@footnote{https://github.com/python/cpython/issues/121313}: Limit the reading size in the
@ref{12e5,,multiprocessing.connection.Connection} class to 64 KiB to prevent
memory overallocation and unnecessary memory management system calls.

@item 
gh-121332@footnote{https://github.com/python/cpython/issues/121332}: Fix constructor of @ref{9,,ast} nodes with custom
@code{_attributes}. Previously, passing custom attributes would raise a
@ref{1a3,,DeprecationWarning}. Passing arguments to the constructor that
are not in @code{_fields} or @code{_attributes} remains deprecated. Patch by
Jelle Zijlstra.

@item 
gh-121245@footnote{https://github.com/python/cpython/issues/121245}: Fix a bug in the handling of the command history of the new
@ref{492,,REPL} that caused the history file to be wiped at REPL exit.

@item 
gh-121210@footnote{https://github.com/python/cpython/issues/121210}: Handle AST nodes with missing runtime fields or attributes in
@ref{1bf,,ast.compare()}. Patch by Bénédikt Tran.

@item 
gh-121163@footnote{https://github.com/python/cpython/issues/121163}: Add support for @code{all} as an valid @code{action} for
@ref{8cf,,warnings.simplefilter()} and @ref{16ae,,warnings.filterwarnings()}.

@item 
gh-121151@footnote{https://github.com/python/cpython/issues/121151}: Fix wrapping of long usage text of arguments inside a mutually
exclusive group in @ref{7,,argparse}.

@item 
gh-121141@footnote{https://github.com/python/cpython/issues/121141}: Add support for @ref{1c0,,copy.replace()} to AST nodes. Patch by
Bénédikt Tran.

@item 
gh-87744@footnote{https://github.com/python/cpython/issues/87744}: Fix waitpid race while calling
@ref{194b,,send_signal()} in asyncio. Patch by Kumar
Aditya.

@item 
gh-121027@footnote{https://github.com/python/cpython/issues/121027}: Add a future warning in @code{functools.partial.__get__()}. In
future Python versions @ref{217,,functools.partial} will be a method
descriptor.

@item 
gh-121027@footnote{https://github.com/python/cpython/issues/121027}: Make the @ref{217,,functools.partial} object a method descriptor.

@item 
gh-117784@footnote{https://github.com/python/cpython/issues/117784}: CPython now detects whether its linked TLS library supports
TLSv1.3 post-handshake authentication and disables that feature if support
is lacking.

@item 
gh-121025@footnote{https://github.com/python/cpython/issues/121025}: Improve the @ref{82e,,__repr__()} of
@ref{218,,functools.partialmethod}. Patch by Bénédikt Tran.

@item 
gh-121018@footnote{https://github.com/python/cpython/issues/121018}: Fixed issues where @code{argparse.ArgumentParser.parse_args()}
did not honor @code{exit_on_error=False}. Based on patch by Ben Hsing.

@item 
gh-119614@footnote{https://github.com/python/cpython/issues/119614}: Fix truncation of strings with embedded null characters in some
internal operations in @ref{f6,,tkinter}.

@item 
gh-120910@footnote{https://github.com/python/cpython/issues/120910}: When reading installed files from an egg, use
@code{relative_to(walk_up=True)} to honor files installed outside of the
installation root.

@item 
gh-61103@footnote{https://github.com/python/cpython/issues/61103}: Support float complex, double complex and
long double complex C types in @ref{2e,,ctypes} as
@ref{1ed,,c_float_complex}, @ref{1ee,,c_double_complex} and
@ref{1ef,,c_longdouble_complex} if the compiler has C11 complex
arithmetic. Patch by Sergey B Kirpichev.

@item 
gh-120888@footnote{https://github.com/python/cpython/issues/120888}: Upgrade pip wheel bundled with ensurepip (pip 24.1.1)

@item 
gh-101830@footnote{https://github.com/python/cpython/issues/101830}: Accessing the @ref{f6,,tkinter} object’s string representation no
longer converts the underlying Tcl object to a string on Windows.

@item 
gh-120678@footnote{https://github.com/python/cpython/issues/120678}: Fix regression in the new REPL that meant that globals from
files passed using the @code{-i} argument would not be included in the REPL’s
global namespace. Patch by Alex Waygood.

@item 
gh-120811@footnote{https://github.com/python/cpython/issues/120811}: Fix possible memory leak in @ref{194c,,contextvars.Context.run()}.

@item 
gh-120782@footnote{https://github.com/python/cpython/issues/120782}: Fix wrong references of the @ref{34,,datetime} types after
reloading the module.

@item 
gh-120713@footnote{https://github.com/python/cpython/issues/120713}: @ref{e8d,,datetime.datetime.strftime()} now 0-pads years with less
than four digits for the format specifiers @code{%Y} and @code{%G} on Linux.
Patch by Ben Hsing

@item 
gh-120769@footnote{https://github.com/python/cpython/issues/120769}: Make empty line in @ref{aa,,pdb} repeats the last command even
when the command is from @code{cmdqueue}.

@item 
gh-120780@footnote{https://github.com/python/cpython/issues/120780}: Show string value of LOAD_SPECIAL oparg in @ref{3c,,dis} output.

@item 
gh-41431@footnote{https://github.com/python/cpython/issues/41431}: Add @ref{194d,,datetime.time.strptime()} and
@ref{1f9,,datetime.date.strptime()}. Contributed by Wannes Boeykens.

@item 
gh-120743@footnote{https://github.com/python/cpython/issues/120743}: @ref{23d,,Soft deprecate} @ref{31a,,os.popen()} and
@ref{31b,,os.spawn*} functions. They should no longer be used to
write new code. The @ref{dc,,subprocess} module is recommended instead. Patch
by Victor Stinner.

@item 
gh-120732@footnote{https://github.com/python/cpython/issues/120732}: Fix @code{name} passing to @ref{c3d,,unittest.mock.Mock} object when
using @ref{1935,,unittest.mock.create_autospec()}.

@item 
gh-111259@footnote{https://github.com/python/cpython/issues/111259}: @ref{be,,re} now handles patterns like @code{"[\s\S]"} or @code{"\s|\S"}
which match any character as effectively as a dot with the @code{DOTALL}
modifier (@code{"(?s:.)"}).

@item 
gh-120683@footnote{https://github.com/python/cpython/issues/120683}: Fix an error in @ref{11e5,,logging.LogRecord}, when the integer
part of the timestamp is rounded up, while the millisecond calculation
truncates, causing the log timestamp to be wrong by up to 999 ms (affected
roughly 1 in 8 million timestamps).

@item 
gh-118710@footnote{https://github.com/python/cpython/issues/118710}: @ref{50b,,ipaddress.IPv4Address} and
@ref{50c,,ipaddress.IPv6Address} attributes @code{version} and
@code{max_prefixlen} are now available on the class.

@item 
gh-120633@footnote{https://github.com/python/cpython/issues/120633}: Move scrollbar and remove tear-off menus in turtledemo.

@item 
gh-120606@footnote{https://github.com/python/cpython/issues/120606}: Allow users to use EOF to exit @code{commands} definition in
@ref{aa,,pdb}

@item 
gh-120284@footnote{https://github.com/python/cpython/issues/120284}: Allow @ref{194e,,asyncio.Runner.run()} to accept @ref{4c9,,awaitable}
objects instead of simply @ref{6b8,,coroutine}s.

@item 
gh-120541@footnote{https://github.com/python/cpython/issues/120541}: Improve the prompt in the “less” pager when @ref{ad4,,help()} is
called with non-string argument.

@item 
gh-120495@footnote{https://github.com/python/cpython/issues/120495}: Fix incorrect exception handling in Tab Nanny. Patch by
Wulian233.

@item 
gh-120388@footnote{https://github.com/python/cpython/issues/120388}: Improve a warning message when a test method in @ref{10c,,unittest}
returns something other than @code{None}. Now we show the returned object
type and optional asyncio-related tip.

@item 
gh-120381@footnote{https://github.com/python/cpython/issues/120381}: Correct @ref{194f,,inspect.ismethoddescriptor()} to check also for
the lack of @ref{1950,,__delete__()}.  Patch by Jan Kaliszewski.

@item 
gh-90425@footnote{https://github.com/python/cpython/issues/90425}: The OS byte in gzip headers is now always set to 255 when using
@ref{84d,,gzip.compress()}.

@item 
gh-120343@footnote{https://github.com/python/cpython/issues/120343}: Fix column offset reporting for tokens that come after
multiline f-strings in the @ref{101,,tokenize} module.

@item 
gh-119180@footnote{https://github.com/python/cpython/issues/119180}: As part of implementing 
@geindex Python 향상 제안; PEP 649
PEP 649@footnote{https://peps.python.org/pep-0649/} and 
@geindex Python 향상 제안; PEP 749
PEP 749@footnote{https://peps.python.org/pep-0749/}, add a new
module @code{annotationlib}. Add support for unresolved forward references in
annotations to @ref{33,,dataclasses}, @ref{332,,typing.TypedDict}, and
@ref{331,,typing.NamedTuple}.

@item 
gh-119600@footnote{https://github.com/python/cpython/issues/119600}: Fix @ref{1091,,unittest.mock.patch()} to not read attributes of the
target when @code{new_callable} is set. Patch by Robert Collins.

@item 
gh-120289@footnote{https://github.com/python/cpython/issues/120289}: Fixed the use-after-free issue in @ref{2b,,cProfile} by
disallowing @code{disable()} and @code{clear()} in external timers.

@item 
gh-82017@footnote{https://github.com/python/cpython/issues/82017}: Added support for converting any objects that have the
@code{as_integer_ratio()} method to a @ref{213,,Fraction}.

@item 
gh-114053@footnote{https://github.com/python/cpython/issues/114053}: Fix edge-case bug where @ref{8bf,,typing.get_type_hints()} would
produce incorrect results if type parameters in a class scope were
overridden by assignments in a class scope and @code{from __future__ import
annotations} semantics were enabled. Patch by Alex Waygood.

@item 
gh-114053@footnote{https://github.com/python/cpython/issues/114053}: Fix erroneous @ref{452,,NameError} when calling
@ref{a14,,inspect.get_annotations()} with @code{eval_str=True`} on a class that
made use of 
@geindex Python 향상 제안; PEP 695
PEP 695@footnote{https://peps.python.org/pep-0695/} type parameters in a module that had @code{from
__future__ import annotations} at the top of the file. Patch by Alex
Waygood.

@item 
gh-120268@footnote{https://github.com/python/cpython/issues/120268}: Prohibit passing @code{None} to pure-Python
@ref{dcc,,datetime.date.fromtimestamp()} to achieve consistency with
C-extension implementation.

@item 
gh-120244@footnote{https://github.com/python/cpython/issues/120244}: Fix memory leak in @ref{5a2,,re.sub()} when the replacement string
contains backreferences.

@item 
gh-120254@footnote{https://github.com/python/cpython/issues/120254}: Added @code{commands} argument to @ref{272,,pdb.set_trace()} which
allows users to send debugger commands from the source file.

@item 
gh-120211@footnote{https://github.com/python/cpython/issues/120211}: Fix @ref{ff,,tkinter.ttk} with Tcl/Tk 9.0.

@item 
gh-71587@footnote{https://github.com/python/cpython/issues/71587}: Fix crash in C version of @ref{1951,,datetime.datetime.strptime()}
when called again on the restarted interpreter.

@item 
gh-117983@footnote{https://github.com/python/cpython/issues/117983}: Defer the @code{threading} import in @code{importlib.util} until lazy
loading is used.

@item 
gh-120157@footnote{https://github.com/python/cpython/issues/120157}: Remove unused constant
@code{concurrent.futures._base._FUTURE_STATES} in @ref{24,,concurrent.futures}.
Patch by Clinton Christian (pygeek).

@item 
gh-120161@footnote{https://github.com/python/cpython/issues/120161}: @ref{34,,datetime} no longer crashes in certain complex reference
cycle situations.

@item 
gh-119698@footnote{https://github.com/python/cpython/issues/119698}: Fix @ref{31d,,symtable.Class.get_methods()} and document its
behaviour. Patch by Bénédikt Tran.

@item 
gh-120121@footnote{https://github.com/python/cpython/issues/120121}: Add @ref{1952,,concurrent.futures.InvalidStateError} to module’s
@code{__all__}.

@item 
gh-119933@footnote{https://github.com/python/cpython/issues/119933}: Add the @ref{1953,,symtable.SymbolTableType} enumeration to
represent the possible outputs of the
@ref{1954,,symtable.SymbolTable.get_type} method. Patch by Bénédikt Tran.

@item 
gh-120029@footnote{https://github.com/python/cpython/issues/120029}: Expose @ref{289,,symtable.Symbol} methods
@ref{28c,,is_free_class()},
@ref{28b,,is_comp_iter()} and
@ref{28a,,is_comp_cell()}. Patch by Bénédikt Tran.

@item 
gh-120108@footnote{https://github.com/python/cpython/issues/120108}: Fix calling @ref{d64,,copy.deepcopy()} on @ref{9,,ast} trees that have
been modified to have references to parent nodes. Patch by Jelle Zijlstra.

@item 
gh-120056@footnote{https://github.com/python/cpython/issues/120056}: Add @code{socket.IP_RECVERR} and @code{socket.IP_RECVTTL}
constants (both available since Linux 2.2). And
@code{socket.IP_RECVORIGDSTADDR} constant (available since Linux
2.6.29).

@item 
gh-112672@footnote{https://github.com/python/cpython/issues/112672}: Support building @ref{f6,,tkinter} with Tcl 9.0.

@item 
gh-120057@footnote{https://github.com/python/cpython/issues/120057}: Added the @ref{259,,os.environ.refresh()} method to
update @code{os.environ} with changes to the environment made by
@ref{25b,,os.putenv()}, by @ref{25c,,os.unsetenv()}, or made outside Python in the
same process. Patch by Victor Stinner.

@item 
gh-120029@footnote{https://github.com/python/cpython/issues/120029}: Expose @ref{1955,,symtable.Symbol.is_type_parameter()} in the
@ref{de,,symtable} module. Patch by Bénédikt Tran.

@item 
gh-119819@footnote{https://github.com/python/cpython/issues/119819}: Fix regression to allow logging configuration with
multiprocessing queue types.

@item 
gh-65454@footnote{https://github.com/python/cpython/issues/65454}: @ref{1956,,unittest.mock.Mock.attach_mock()} no longer triggers a call
to a @code{PropertyMock} being attached.

@item 
gh-117142@footnote{https://github.com/python/cpython/issues/117142}: The @ref{2e,,ctypes} module may now be imported in all
subinterpreters, including those that have their own GIL.

@item 
gh-118835@footnote{https://github.com/python/cpython/issues/118835}: Fix _pyrepl crash when using custom prompt with ANSI escape
codes.

@item 
gh-81936@footnote{https://github.com/python/cpython/issues/81936}: @code{help()} and @code{showtopic()} methods now respect a
configured `output' argument to @code{pydoc.Helper} and not use the
pager in such cases. Patch by Enrico Tröger.

@item 
gh-117398@footnote{https://github.com/python/cpython/issues/117398}: The @code{_datetime} module (C implementation for @ref{34,,datetime})
now supports being imported in multiple interpreters.

@item 
gh-119824@footnote{https://github.com/python/cpython/issues/119824}: Print stack entry in @ref{aa,,pdb} when and only when user input
is needed.

@item 
gh-119838@footnote{https://github.com/python/cpython/issues/119838}: In mixed arithmetic operations with
@ref{213,,Fraction} and complex, the fraction is now converted to
@ref{196,,float} instead of @ref{197,,complex}.

@item 
gh-119770@footnote{https://github.com/python/cpython/issues/119770}: Make @ref{e7,,termios} @code{ioctl()} constants positive. Patch by
Victor Stinner.

@item 
gh-89727@footnote{https://github.com/python/cpython/issues/89727}: Fix issue with @ref{356,,shutil.rmtree()} where a
@ref{f67,,RecursionError} is raised on deep directory trees.

@item 
gh-119577@footnote{https://github.com/python/cpython/issues/119577}: The @ref{1a3,,DeprecationWarning} emitted when testing the truth
value of an @ref{363,,xml.etree.ElementTree.Element} now describes
unconditionally returning @code{True} in a future version rather than raising
an exception in Python 3.14.

@item 
gh-89727@footnote{https://github.com/python/cpython/issues/89727}: Partially fix issue with @ref{356,,shutil.rmtree()} where a
@ref{f67,,RecursionError} is raised on deep directory trees. A recursion error
is no longer raised when @code{rmtree.avoids_symlink_attacks} is false.

@item 
gh-93963@footnote{https://github.com/python/cpython/issues/93963}: Remove deprecated names from @code{importlib.abc} as found in
@code{importlib.resources.abc}.

@item 
gh-119118@footnote{https://github.com/python/cpython/issues/119118}: Fix performance regression in the @ref{101,,tokenize} module by
caching the @code{line} token attribute and calculating the column offset
more efficiently.

@item 
gh-89727@footnote{https://github.com/python/cpython/issues/89727}: Fix issue with @ref{d51,,os.fwalk()} where a @ref{f67,,RecursionError}
was raised on deep directory trees by adjusting the implementation to be
iterative instead of recursive.

@item 
gh-119594@footnote{https://github.com/python/cpython/issues/119594}: If one calls pow(fractions.Fraction, x, module) with modulo not
None, the error message now says that the types are incompatible rather
than saying pow only takes 2 arguments. Patch by Wim Jeantine-Glenn and
Mark Dickinson.

@item 
gh-119588@footnote{https://github.com/python/cpython/issues/119588}: @code{zipfile.Path.is_symlink} now assesses if the given path is a
symlink.

@item 
gh-119562@footnote{https://github.com/python/cpython/issues/119562}: Remove @code{ast.Num}, @code{ast.Str},
@code{ast.Bytes}, @code{ast.NameConstant} and
@code{ast.Ellipsis}. They had all emitted deprecation warnings since
Python 3.12. Patch by Alex Waygood.

@item 
gh-119555@footnote{https://github.com/python/cpython/issues/119555}: Catch @ref{18e,,SyntaxError} from @ref{4b2,,compile()} in the
runsource() method of the InteractiveColoredConsole.  Patch by Sergey B
Kirpichev.

@item 
gh-118908@footnote{https://github.com/python/cpython/issues/118908}: Limit exposed globals from internal imports and definitions on
new REPL startup. Patch by Eugene Triguba and Pablo Galindo.

@item 
gh-117865@footnote{https://github.com/python/cpython/issues/117865}: Improve the import time of the @ref{9,,ast} module by deferring
the import of @ref{be,,re}. Patch by Jelle Zijlstra.

@item 
gh-119127@footnote{https://github.com/python/cpython/issues/119127}: Positional arguments of @ref{217,,functools.partial()} objects now
support placeholders via @ref{216,,functools.Placeholder}.

@item 
gh-113892@footnote{https://github.com/python/cpython/issues/113892}: Now, the method @code{sock_connect} of
@ref{81c,,asyncio.ProactorEventLoop} raises a @ref{2ec,,ValueError} if given
socket is not in non-blocking mode, as well as in other loop
implementations.

@item 
gh-119506@footnote{https://github.com/python/cpython/issues/119506}: Fix @code{io.TextIOWrapper.write()} method breaks internal
buffer when the method is called again during flushing internal buffer.

@item 
gh-69214@footnote{https://github.com/python/cpython/issues/69214}: Fix @code{fcntl.ioctl()} `request' parameter: use an @code{unsigned
long} instead of an @code{unsigned int} for the `request' parameter of
@ref{1680,,fcntl.ioctl()} to support requests larger than @code{UINT_MAX}. Patch by
Victor Stinner.

@item 
gh-119105@footnote{https://github.com/python/cpython/issues/119105}: @code{difflib}’s @code{DIffer.compare()} (and so also @code{ndiff}) can
no longer be provoked into cubic-time behavior, or into unbounded
recursion, and should generally be faster in ordinary cases too. Results
may change in some cases, although that should be rare. Correctness of
diffs is not affected. Some similar lines far apart may be reported as
deleting one and adding the other, where before they were displayed on
adjacent output lines with markup showing the intraline differences.

@item 
gh-119443@footnote{https://github.com/python/cpython/issues/119443}: The interactive REPL no longer runs with @code{from __future__
import annotations} enabled. Patch by Jelle Zijlstra.

@item 
gh-119461@footnote{https://github.com/python/cpython/issues/119461}: Add @code{socket.VMADDR_CID_LOCAL} constant. Patch by Victor
Stinner.

@item 
gh-117398@footnote{https://github.com/python/cpython/issues/117398}: Objects in the datetime C-API are now all statically allocated,
which means better memory safety, especially when the module is reloaded.
This should be transparent to users.

@item 
gh-118894@footnote{https://github.com/python/cpython/issues/118894}: @ref{b,,asyncio} REPL now has the same capabilities as PyREPL.

@item 
gh-118830@footnote{https://github.com/python/cpython/issues/118830}: Bump @ref{ab,,pickle} default protocol to @code{5}.

@item 
gh-118911@footnote{https://github.com/python/cpython/issues/118911}: In PyREPL, updated @code{maybe-accept}’s logic so that if the user
hits @code{Enter} twice, they are able to terminate the block even if
there’s trailing whitespace. Also, now when the user hits arrow up, the
cursor is on the last functional line. This matches IPython’s behavior.
Patch by Aya Elsayed.

@item 
gh-115225@footnote{https://github.com/python/cpython/issues/115225}: Raise error on certain technically valid but pathological ISO
8601 strings passed to @ref{828,,datetime.time.fromisoformat()} that were
previously parsed incorrectly.

@item 
gh-111201@footnote{https://github.com/python/cpython/issues/111201}: Remove dependency to @ref{bf,,readline} from the new Python REPL.

@item 
gh-119189@footnote{https://github.com/python/cpython/issues/119189}: When using the @code{**} operator or @ref{1a4,,pow()} with
@ref{213,,Fraction} as the base and an exponent that is not
rational, a float, or a complex, the fraction is no longer converted to a
float.

@item 
gh-119174@footnote{https://github.com/python/cpython/issues/119174}: Fix high DPI causes turtledemo(turtle-graphics examples)
windows blurry Patch by Wulian233 and Terry Jan Reedy

@item 
gh-119121@footnote{https://github.com/python/cpython/issues/119121}: Fix a NameError happening in
@code{asyncio.staggered.staggered_race}. This function is now tested.

@item 
gh-119105@footnote{https://github.com/python/cpython/issues/119105}: @code{difflib.Differ} is much faster for some cases of diffs where
many pairs of lines are equally similar.

@item 
gh-119113@footnote{https://github.com/python/cpython/issues/119113}: Fix issue where @ref{1957,,pathlib.PurePath.with_suffix()} didn’t
raise @ref{198,,TypeError} when given @code{None} as a suffix.

@item 
gh-118643@footnote{https://github.com/python/cpython/issues/118643}: Fix an AttributeError in the @ref{3f,,email} module when re-fold a
long address list. Also fix more cases of incorrect encoding of the
address separator in the address list.

@item 
gh-73991@footnote{https://github.com/python/cpython/issues/73991}: Add @ref{267,,pathlib.Path.copy()}, which copies a file or directory
to another.

@item 
gh-58933@footnote{https://github.com/python/cpython/issues/58933}: Make @ref{aa,,pdb} return to caller frame correctly when
@code{f_trace} of the caller frame is not set

@item 
gh-82805@footnote{https://github.com/python/cpython/issues/82805}: Support single-dot file extensions in
@ref{1958,,pathlib.PurePath.suffix} and related attributes and methods. For
example, the @ref{1959,,suffixes} of
@code{PurePath('foo.bar.')} are now @code{['.bar', '.']} rather than @code{[]}.
This brings file extension splitting in line with
@ref{195a,,os.path.splitext()}.

@item 
gh-118924@footnote{https://github.com/python/cpython/issues/118924}: Remove @code{version} and @code{version_info} from
@ref{d4,,sqlite3}. Patch by Hugo van Kemenade.

@item 
gh-118928@footnote{https://github.com/python/cpython/issues/118928}: Disallow using a sequence of parameters with named placeholders
in @ref{d4,,sqlite3} queries. Patch by Erlend E. Aasland.

@item 
gh-118895@footnote{https://github.com/python/cpython/issues/118895}: Setting attributes on @ref{568,,typing.NoDefault} now raises
@ref{5ee,,AttributeError} instead of @ref{198,,TypeError}.

@item 
gh-118868@footnote{https://github.com/python/cpython/issues/118868}: Fixed issue where kwargs were no longer passed to the logging
handler QueueHandler

@item 
gh-118827@footnote{https://github.com/python/cpython/issues/118827}: Remove deprecated @code{Quoter} class from
@ref{110,,urllib.parse}. It had previously raised a @ref{1a3,,DeprecationWarning}
since Python 3.11. Patch by Nikita Sobolev.

@item 
gh-118824@footnote{https://github.com/python/cpython/issues/118824}: Remove deprecated @code{pty.master_open()} and
@code{pty.slave_open()}. Use @ref{301,,pty.openpty()} instead. Patch by Nikita
Sobolev.

@item 
gh-118851@footnote{https://github.com/python/cpython/issues/118851}: @code{ctx} arguments to the constructors of @ref{9,,ast} node
classes now default to @ref{4c3,,ast.Load()}. Patch by Jelle
Zijlstra.

@item 
gh-101588@footnote{https://github.com/python/cpython/issues/101588}: Remove copy, deepcopy, and pickle from itertools. These had
previously raised a DeprecationWarning since Python 3.12.

@item 
gh-118805@footnote{https://github.com/python/cpython/issues/118805}: Remove `type', `choices', and `metavar' parameters of
@code{argparse.BooleanOptionalAction}. They were deprecated since
Python 3.12.

@item 
gh-118803@footnote{https://github.com/python/cpython/issues/118803}: @code{typing.ByteString} and
@code{collections.abc.ByteString} are removed. They had previously
raised a @ref{1a3,,DeprecationWarning} since Python 3.12.

@item 
gh-118798@footnote{https://github.com/python/cpython/issues/118798}: The `isdst' parameter has been removed from
@ref{2f7,,email.utils.localtime()}. Patch by Hugo van Kemenade.

@item 
gh-118760@footnote{https://github.com/python/cpython/issues/118760}: Restore the default value of @code{tkiter.wantobjects} to @code{1}.

@item 
gh-118760@footnote{https://github.com/python/cpython/issues/118760}: Fix errors in calling Tkinter bindings on Windows.

@item 
gh-74033@footnote{https://github.com/python/cpython/issues/74033}: Drop support for passing keyword arguments to
@ref{266,,pathlib.Path}.

@item 
gh-101357@footnote{https://github.com/python/cpython/issues/101357}: Suppress all @ref{2c0,,OSError} exceptions from
@ref{c0a,,pathlib.Path.exists()} and @code{is_*()} methods, rather than a
selection of more common errors. The new behaviour is consistent with
@ref{c02,,os.path.exists()}, @ref{c04,,os.path.isdir()}, etc. Use
@ref{a24,,pathlib.Path.stat()} to retrieve the file status without suppressing
exceptions.

@item 
gh-78707@footnote{https://github.com/python/cpython/issues/78707}: Drop support for passing additional positional arguments to
@ref{2fd,,pathlib.PurePath.relative_to()} and
@ref{2fe,,is_relative_to()}.

@item 
gh-118507@footnote{https://github.com/python/cpython/issues/118507}: Fix @ref{c05,,os.path.isfile()} on Windows for pipes. Speedup
@ref{6c9,,os.path.isjunction()} and @ref{c03,,os.path.lexists()} on Windows with a
native implementation.

@item 
gh-118772@footnote{https://github.com/python/cpython/issues/118772}: Allow @ref{487,,typing.TypeVar} instances without a default to
follow instances without a default in some cases. Patch by Jelle Zijlstra.

@item 
gh-118714@footnote{https://github.com/python/cpython/issues/118714}: Allow @code{restart} in post-mortem debugging of @ref{aa,,pdb}.
Removed restart message when the user quits pdb from post-mortem mode.

@item 
gh-118673@footnote{https://github.com/python/cpython/issues/118673}: Removed executable bits and shebang from stdlib modules.

@item 
gh-110863@footnote{https://github.com/python/cpython/issues/110863}: @ref{262,,os.path.realpath()} now suppresses any @ref{2c0,,OSError} from
@ref{b19,,os.readlink()} when `strict' mode is disabled (the default).

@item 
gh-118263@footnote{https://github.com/python/cpython/issues/118263}: Speed up @ref{6ca,,os.path.splitroot()} & @ref{151e,,os.path.normpath()}
with a direct C call.

@item 
gh-110190@footnote{https://github.com/python/cpython/issues/110190}: Fix ctypes structs with array on SPARC by setting
@code{MAX_STRUCT_SIZE} to 32 in stgdict. Patch by Jakub Kulik

@item 
gh-118033@footnote{https://github.com/python/cpython/issues/118033}: Fix @ref{4e1,,dataclasses.dataclass()} not creating a
@code{__weakref__} slot when subclassing @ref{17bc,,typing.Generic}.

@item 
gh-117766@footnote{https://github.com/python/cpython/issues/117766}: Always use @ref{169,,str()} to print @code{choices} in @ref{7,,argparse}.

@item 
gh-106531@footnote{https://github.com/python/cpython/issues/106531}: In @ref{7f,,importlib.resources}, sync with importlib_resources 6.3.2@footnote{https://importlib-resources.readthedocs.io/en/latest/history.html#v6-3-2},
including: @code{MultiplexedPath} now expects @code{Traversable} paths,
deprecating string arguments to @code{MultiplexedPath}; Enabled support for
resources in namespace packages in zip files; Fixed @code{NotADirectoryError}
when calling files on a subdirectory of a namespace package.

@item 
gh-115937@footnote{https://github.com/python/cpython/issues/115937}: Removed extra preprocessing for the @code{__signature__}
attribute: the code just check if it’s a @ref{4e3,,inspect.Signature}
instance.  Patch by Sergey B Kirpichev.

@item 
gh-115808@footnote{https://github.com/python/cpython/issues/115808}: Add @ref{255,,operator.is_none()} and @ref{256,,operator.is_not_none()}
functions.

@item 
gh-114264@footnote{https://github.com/python/cpython/issues/114264}: Improve performance of @ref{d64,,copy.deepcopy()} by adding a fast
path for atomic types.

@item 
gh-113878@footnote{https://github.com/python/cpython/issues/113878}: Add `doc' parameter to @ref{195b,,dataclasses.field()}, so it can be
stored and shown as a documentation / metadata. If
@code{@@dataclass(slots=True)} is used, then the supplied string is available
in the @ref{16f0,,__slots__} dict. Otherwise, the supplied string is
only available in the corresponding @ref{195c,,dataclasses.Field} object.

In order to support this feature we are changing the @code{__slots__} format
in dataclasses from @ref{610,,tuple} to @ref{183,,dict} when documentation /
metadata is present.

@item 
gh-113978@footnote{https://github.com/python/cpython/issues/113978}: Ignore warnings on text completion inside REPL.

@item 
gh-113008@footnote{https://github.com/python/cpython/issues/113008}: Correct argparse usage output for required, mutually exclusive
groups containing a positional argument

@item 
gh-108172@footnote{https://github.com/python/cpython/issues/108172}: @code{webbrowser} honors OS preferred browser on Linux when its
desktop entry name contains the text of a known browser name.

@item 
gh-109109@footnote{https://github.com/python/cpython/issues/109109}: You can now get the raw TLS certificate chains from TLS
connections via @ref{195d,,ssl.SSLSocket.get_verified_chain()} and
@ref{195e,,ssl.SSLSocket.get_unverified_chain()} methods.

Contributed by Mateusz Nowak.

@item 
gh-105623@footnote{https://github.com/python/cpython/issues/105623}: Fix performance degradation in
@ref{1942,,logging.handlers.RotatingFileHandler}. Patch by Craig Robson.

@item 
gh-102450@footnote{https://github.com/python/cpython/issues/102450}: Add missing ISO-8601 24:00 alternative to midnight of next day
to @ref{829,,datetime.datetime.fromisoformat()} and
@ref{828,,datetime.time.fromisoformat()}. Patch by Izan “TizzySaurus” Robinson
(@email{tizzysaurus@@gmail.com})

@item 
gh-103956@footnote{https://github.com/python/cpython/issues/103956}: Fix lack of newline characters in @ref{103,,trace} module output
when line tracing is enabled but source code line for current frame is not
available.

@item 
gh-92081@footnote{https://github.com/python/cpython/issues/92081}: Fix missing spaces in email headers when the spaces are mixed
with encoded 8-bit characters.

@item 
gh-103194@footnote{https://github.com/python/cpython/issues/103194}: Prepare Tkinter for C API changes in Tcl 8.7/9.0 to avoid
@code{_tkinter.Tcl_Obj} being unexpectedly returned instead of
@ref{3c3,,bool}, @ref{169,,str}, @ref{344,,bytearray}, or @ref{19b,,int}.

@item 
gh-87106@footnote{https://github.com/python/cpython/issues/87106}: Fixed handling in @ref{1894,,inspect.Signature.bind()} of keyword
arguments having the same name as positional-only arguments when a
variadic keyword argument (e.g. @code{**kwargs}) is present.

@item 
gh-103134@footnote{https://github.com/python/cpython/issues/103134}: Add additional methods to @ref{24c,,proxy objects} in the @code{multiprocessing} module:


@itemize *

@item 
@code{clear()} and @code{copy()} for proxies of @ref{24d,,list}

@item 
@ref{24e,,fromkeys()}, @code{reversed(d)}, @code{d | @{@}}, @code{@{@} | d},
@code{d |= @{'b': 2@}} for proxies of @ref{183,,dict}
@end itemize

@item 
bpo-45767@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45767}: Fix integer conversion in @ref{195f,,os.major()}, @ref{1960,,os.minor()},
and @ref{1961,,os.makedev()}. Support device numbers larger than @code{2**63-1}.
Support non-existent device number (@code{NODEV}).

@item 
bpo-44864@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44864}: Do not translate user-provided strings in
@ref{1bd,,argparse.ArgumentParser}.

@item 
bpo-41843@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41843}: Solaris now uses @ref{d04,,os.sendfile()} fast-copy syscall for more
efficient @ref{ca,,shutil} file copy related functions.

@item 
bpo-15987@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15987}: Implemented @ref{1bf,,ast.compare()} for comparing two ASTs. Patch
by Batuhan Taskaya with some help from Jeremy Hylton.

@item 
gh-67693@footnote{https://github.com/python/cpython/issues/67693}: Fix @ref{1940,,urllib.parse.urlunparse()} and
@ref{193f,,urllib.parse.urlunsplit()} for URIs with path starting with multiple
slashes and no authority. Based on patch by Ashwin Ramaswami.

@item 
bpo-14074@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14074}: Fix @ref{7,,argparse} metavar processing to allow positional
arguments to have a tuple metavar.
@end itemize

@node IDLE<7>,Documentation<14>,Library<46>,Python 3 14 0 alpha 1
@anchor{whatsnew/changelog id192}@anchor{1962}
@subsubsection IDLE



@itemize -

@item 
gh-122392@footnote{https://github.com/python/cpython/issues/122392}: Increase currently inadequate vertical spacing for the IDLE
browsers (path, module, and stack) on high-resolution monitors.

@item 
gh-112938@footnote{https://github.com/python/cpython/issues/112938}: Fix uninteruptable hang when Shell gets rapid continuous
output.

@item 
gh-122482@footnote{https://github.com/python/cpython/issues/122482}: Change About IDLE to direct users to discuss.python.org instead
of the now unused idle-dev email and mailing list.

@item 
gh-78889@footnote{https://github.com/python/cpython/issues/78889}: Stop Shell freezes by blocking user access to non-method
sys.stdout.shell attributes, which are all private.

@item 
gh-120083@footnote{https://github.com/python/cpython/issues/120083}: Add explicit black IDLE Hovertip foreground color needed for
recent macOS. Fixes Sonoma showing unreadable white on pale yellow.  Patch
by John Riggles.

@item 
gh-120104@footnote{https://github.com/python/cpython/issues/120104}: Fix padding in config and search dialog windows in IDLE.
@end itemize

@node Documentation<14>,Core and Builtins<41>,IDLE<7>,Python 3 14 0 alpha 1
@anchor{whatsnew/changelog id193}@anchor{1963}
@subsubsection Documentation



@itemize -

@item 
gh-124872@footnote{https://github.com/python/cpython/issues/124872}: Added definitions for @ref{1964,,context}, @ref{1965,,current context},
and @ref{1966,,context management protocol}, updated related definitions to be
consistent, and expanded the documentation for
@ref{177,,contextvars.Context}.

@item 
gh-125018@footnote{https://github.com/python/cpython/issues/125018}: The @ref{7e,,importlib.metadata} documentation now includes
semantic cross-reference targets for the significant documented APIs. This
means intersphinx references like @ref{1967,,importlib.metadata.version()} will
now work as expected.

@item 
gh-124720@footnote{https://github.com/python/cpython/issues/124720}: Update “Using Python on a Mac” section of the “Python Setup and
Usage” document and include information on installing free-threading
support.

@item 
gh-124457@footnote{https://github.com/python/cpython/issues/124457}: Remove coverity scan from the CPython repo. It has not been
used since 2020 and is currently unmaintained.

@item 
gh-116622@footnote{https://github.com/python/cpython/issues/116622}: Add an Android platform guide, and flag modules not available
on Android.

@item 
gh-123976@footnote{https://github.com/python/cpython/issues/123976}: Refresh docs around custom providers.

@item 
gh-70870@footnote{https://github.com/python/cpython/issues/70870}: Clarified the dual usage of the term “free variable” (both the
formal meaning of any reference to names defined outside the local scope,
and the narrower pragmatic meaning of nonlocal variables named in
@code{co_freevars}).

@item 
gh-121277@footnote{https://github.com/python/cpython/issues/121277}: Writers of CPython’s documentation can now use @code{next} as the
version for the @code{versionchanged}, @code{versionadded}, @code{deprecated}
directives.

@item 
gh-117765@footnote{https://github.com/python/cpython/issues/117765}: Improved documentation for @ref{1968,,unittest.mock.patch.dict()}

@item 
gh-121749@footnote{https://github.com/python/cpython/issues/121749}: Fix documentation for @ref{607,,PyModule_AddObjectRef()}.

@item 
gh-120012@footnote{https://github.com/python/cpython/issues/120012}: Clarify the behaviours of @ref{1969,,multiprocessing.Queue.empty()}
and @ref{196a,,multiprocessing.SimpleQueue.empty()} on closed queues. Patch by
Bénédikt Tran.

@item 
gh-119574@footnote{https://github.com/python/cpython/issues/119574}: Added some missing environment variables to the output of
@ref{807,,--help-env}.

@item 
bpo-34008@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34008}: The @ref{e1d,,Py_Main()} documentation moved from the “Very High
Level API” section to the “Initialization and Finalization” section.

Also make it explicit that we expect @code{Py_Main} to typically be called
instead of @code{Py_Initialize} rather than after it (since @code{Py_Main} makes
its own call to @code{Py_Initialize}). Document that calling both is
supported but is version dependent on which settings will be applied
correctly.
@end itemize

@node Core and Builtins<41>,Library<47>,Documentation<14>,Python 3 14 0 alpha 1
@anchor{whatsnew/changelog id194}@anchor{196b}
@subsubsection Core and Builtins



@itemize -

@item 
gh-124375@footnote{https://github.com/python/cpython/issues/124375}: Fix a crash in the free threading build when the GC runs
concurrently with a new thread starting.

@item 
gh-125221@footnote{https://github.com/python/cpython/issues/125221}: Fix possible race condition when calling
@ref{196c,,__reduce_ex__()} for the first time in the free threading
build.

@item 
gh-125174@footnote{https://github.com/python/cpython/issues/125174}: Make the handling of reference counts of immortal objects more
robust. Immortal objects with reference counts that deviate from their
original reference count by up to a billion (half a billion on 32 bit
builds) are still counted as immortal.

@item 
gh-125039@footnote{https://github.com/python/cpython/issues/125039}: Make @code{this_instr} and @code{prev_instr} const in cases
generator.
@end itemize

@node Library<47>,Core and Builtins<42>,Core and Builtins<41>,Python 3 14 0 alpha 1
@anchor{whatsnew/changelog id195}@anchor{196d}
@subsubsection Library



@itemize -

@item 
gh-125008@footnote{https://github.com/python/cpython/issues/125008}: Fix @ref{18b4,,tokenize.untokenize()} producing invalid syntax for
double braces preceded by certain escape characters.
@end itemize

@node Core and Builtins<42>,Library<48>,Library<47>,Python 3 14 0 alpha 1
@anchor{whatsnew/changelog id196}@anchor{196e}
@subsubsection Core and Builtins



@itemize -

@item 
gh-124871@footnote{https://github.com/python/cpython/issues/124871}: Fix compiler bug (in some versions of 3.13) where an assertion
fails during reachability analysis.

@item 
gh-123378@footnote{https://github.com/python/cpython/issues/123378}: Fix a crash in the @ref{82f,,__str__()} method of
@ref{462,,UnicodeError} objects when the @ref{18c1,,UnicodeError.start} and
@ref{18c2,,UnicodeError.end} values are invalid or out-of-range. Patch by
Bénédikt Tran.

@item 
gh-118093@footnote{https://github.com/python/cpython/issues/118093}: Improve the experimental JIT compiler’s ability to stay “on
trace” when encountering highly-biased branches.

@item 
gh-124642@footnote{https://github.com/python/cpython/issues/124642}: Fixed scalability issue in free-threaded builds for lock-free
reads from dictionaries in multi-threaded scenarios

@item 
gh-116510@footnote{https://github.com/python/cpython/issues/116510}: Fix a crash caused by immortal interned strings being shared
between sub-interpreters that use basic single-phase init.  In that case,
the string can be used by an interpreter that outlives the interpreter
that created and interned it.  For interpreters that share obmalloc state,
also share the interned dict with the main interpreter.

@item 
gh-116510@footnote{https://github.com/python/cpython/issues/116510}: Fix a bug that can cause a crash when sub-interpreters use
“basic” single-phase extension modules.  Shared objects could refer to
PyGC_Head nodes that had been freed as part of interpreter cleanup.

@item 
gh-119180@footnote{https://github.com/python/cpython/issues/119180}: The @code{__main__} module no longer always contains an
@code{__annotations__} dictionary in its global namespace.

@item 
gh-124547@footnote{https://github.com/python/cpython/issues/124547}: When deallocating an object with inline values whose
@code{__dict__} is still live: if memory allocation for the inline values
fails, clear the dictionary. Prevents an interpreter crash.

@item 
gh-124513@footnote{https://github.com/python/cpython/issues/124513}: Fix a crash in FrameLocalsProxy constructor: check the number
of arguments. Patch by Victor Stinner.

@item 
gh-124442@footnote{https://github.com/python/cpython/issues/124442}: Fix nondeterminism in compilation by sorting the value of
@ref{477,,__static_attributes__}. Patch by kp2pml30.

@item 
gh-124285@footnote{https://github.com/python/cpython/issues/124285}: Fix bug where @code{bool(a)} can be invoked more than once during
the evaluation of a compound boolean expression.

@item 
gh-123856@footnote{https://github.com/python/cpython/issues/123856}: Fix PyREPL failure when a keyboard interrupt is triggered after
using a history search

@item 
gh-65961@footnote{https://github.com/python/cpython/issues/65961}: Deprecate the setting and using @code{__package__} and
@code{__cached__}.

@item 
gh-119726@footnote{https://github.com/python/cpython/issues/119726}: The JIT now generates more efficient code for calls to C
functions resulting in up to 0.8% memory savings and 1.5% speed
improvement on AArch64. Patch by Diego Russo.

@item 
gh-122878@footnote{https://github.com/python/cpython/issues/122878}: Use the @code{pager} binary, if available (e.g. on Debian and
derivatives), to display REPL @code{help()}.

@item 
gh-124188@footnote{https://github.com/python/cpython/issues/124188}: Fix reading and decoding a line from the source file with
non-UTF-8 encoding for syntax errors raised in the compiler.

@item 
gh-124027@footnote{https://github.com/python/cpython/issues/124027}: Support @code{<page up>}, @code{<page down>}, and @code{<delete>} keys
in the Python REPL when @code{$TERM} is set to @code{vt100}.

@item 
gh-124022@footnote{https://github.com/python/cpython/issues/124022}: Fix bug where docstring is removed from classes in interactive
mode.

@item 
gh-123958@footnote{https://github.com/python/cpython/issues/123958}: docstrings are now removed from the optimized AST in
optimization level 2.

@item 
gh-123923@footnote{https://github.com/python/cpython/issues/123923}: The @code{f_executable} field in the internal
@ref{196f,,_PyInterpreterFrame} struct now uses a tagged pointer.
Profilers and debuggers that uses this field should clear the least
significant bit to recover the @ref{5dc,,PyObject}* pointer.

@item 
gh-77894@footnote{https://github.com/python/cpython/issues/77894}: Fix possible crash in the garbage collector when it tries to
break a reference loop containing a @ref{165,,memoryview} object. Now a
@code{memoryview} object can only be cleared if there are no buffers
that refer it.

@item 
gh-120221@footnote{https://github.com/python/cpython/issues/120221}: asyncio REPL is now again properly recognizing
KeyboardInterrupts. Display of exceptions raised in secondary threads is
fixed.

@item 
gh-119310@footnote{https://github.com/python/cpython/issues/119310}: Allow the new interactive shell to read history files written
with the editline library that use unicode-escaped entries.  Patch by
aorcajo and Łukasz Langa.

@item 
gh-123572@footnote{https://github.com/python/cpython/issues/123572}: Fix key mappings for various F-keys in Windows for the new
REPL. Patch by devdanzin
@end itemize

@node Library<48>,Core and Builtins<43>,Core and Builtins<42>,Python 3 14 0 alpha 1
@anchor{whatsnew/changelog id197}@anchor{1970}
@subsubsection Library



@itemize -

@item 
gh-123614@footnote{https://github.com/python/cpython/issues/123614}: Add @ref{1971,,turtle.save()} to easily save Turtle drawings as
PostScript files. Patch by Marie Roald and Yngve Mardal Moe.
@end itemize

@node Core and Builtins<43>,Library<49>,Library<48>,Python 3 14 0 alpha 1
@anchor{whatsnew/changelog id198}@anchor{1972}
@subsubsection Core and Builtins



@itemize -

@item 
gh-123339@footnote{https://github.com/python/cpython/issues/123339}: Setting the @code{__module__} attribute for a class now
removes the @code{__firstlineno__} item from the type’s dict, so they will no
longer be inconsistent.

@item 
gh-119034@footnote{https://github.com/python/cpython/issues/119034}: Change @code{<page up>} and @code{<page down>} keys of the Python
REPL to history search forward/backward. Patch by Victor Stinner.

@item 
gh-123562@footnote{https://github.com/python/cpython/issues/123562}: Improve @ref{18e,,SyntaxError} message for using @code{case ... as
...} with not a name.

@item 
gh-123545@footnote{https://github.com/python/cpython/issues/123545}: Fix a double decref in rare cases on experimental JIT builds.

@item 
gh-123484@footnote{https://github.com/python/cpython/issues/123484}: Fix @code{_Py_DebugOffsets} for long objects to be relative to the
start of the object rather than the start of a subobject.

@item 
gh-123446@footnote{https://github.com/python/cpython/issues/123446}: Fix empty function name in @ref{198,,TypeError} when builtin magic
methods are used without the required args.

@item 
gh-123440@footnote{https://github.com/python/cpython/issues/123440}: Improve @ref{18e,,SyntaxError} message for using @code{except as} with
not a name.

@item 
gh-116017@footnote{https://github.com/python/cpython/issues/116017}: Improved JIT memory consumption by periodically freeing memory
used by infrequently-executed code. This change is especially likely to
improve the memory footprint of long-running programs.

@item 
gh-123344@footnote{https://github.com/python/cpython/issues/123344}: Add AST optimizations for type parameter defaults.

@item 
gh-123321@footnote{https://github.com/python/cpython/issues/123321}: Prevent Parser/myreadline race condition from segfaulting on
multi-threaded use. Patch by Bar Harel and Amit Wienner.

@item 
gh-123177@footnote{https://github.com/python/cpython/issues/123177}: Fix a bug causing stray prompts to appear in the middle of
wrapped lines in the new REPL.

@item 
gh-122982@footnote{https://github.com/python/cpython/issues/122982}: Extend the deprecation period for bool inversion (@code{~}) by two
years.

@item 
gh-123271@footnote{https://github.com/python/cpython/issues/123271}: Make concurrent iterations over the same @ref{1a0,,zip()} iterator
safe under free-threading.

@item 
gh-123275@footnote{https://github.com/python/cpython/issues/123275}: Support @ref{16f,,-X gil=1} and 
@geindex PYTHON_GIL
@geindex 환경 변수; PYTHON_GIL
@ref{49b,,PYTHON_GIL=1} on non-free-threaded builds.

@item 
gh-123177@footnote{https://github.com/python/cpython/issues/123177}: Deactivate line wrap in the Apple Terminal via a ANSI escape
code. Patch by Pablo Galindo

@item 
gh-123229@footnote{https://github.com/python/cpython/issues/123229}: Fix valgrind warning by initializing the f-string buffers to 0
in the tokenizer. Patch by Pablo Galindo

@item 
gh-122298@footnote{https://github.com/python/cpython/issues/122298}: Restore printout of GC stats when
@code{gc.set_debug(gc.DEBUG_STATS)} is called. This feature was accidentally
removed when implementing incremental GC.

@item 
gh-121804@footnote{https://github.com/python/cpython/issues/121804}: Correctly show error locations when a @ref{18e,,SyntaxError} is
raised in the basic REPL. Patch by Sergey B Kirpichev.

@item 
gh-115776@footnote{https://github.com/python/cpython/issues/115776}: Enables inline values (Python’s equivalent of hidden classes)
on any class who’s instances are of a fixed size.

@item 
gh-123142@footnote{https://github.com/python/cpython/issues/123142}: Fix too-wide source location in exception tracebacks coming
from broken iterables in comprehensions.

@item 
gh-123048@footnote{https://github.com/python/cpython/issues/123048}: Fix a bug where pattern matching code could emit a
@ref{1973,,JUMP_FORWARD} with no source location.

@item 
gh-118093@footnote{https://github.com/python/cpython/issues/118093}: Break up @code{CALL_ALLOC_AND_ENTER_INIT} into micro-ops and relax
requirement for exact args, in order to increase the amount of code
supported by tier 2.

@item 
gh-123123@footnote{https://github.com/python/cpython/issues/123123}: Fix displaying @ref{18e,,SyntaxError} exceptions covering multiple
lines. Patch by Pablo Galindo

@item 
gh-123083@footnote{https://github.com/python/cpython/issues/123083}: Fix a potential use-after-free in @code{STORE_ATTR_WITH_HINT}.

@item 
gh-123022@footnote{https://github.com/python/cpython/issues/123022}: Fix crash in free-threaded build when calling
@ref{460,,Py_Initialize()} from a non-main thread.

@item 
gh-118093@footnote{https://github.com/python/cpython/issues/118093}: Add three specializations for @ref{372,,CALL_KW}:


@itemize *

@item 
@code{CALL_KW_PY} for calls to Python functions

@item 
@code{CALL_KW_BOUND_METHOD} for calls to bound methods

@item 
@code{CALL_KW_NON_PY} for all other calls
@end itemize

@item 
gh-122821@footnote{https://github.com/python/cpython/issues/122821}: Make sure that branches in @ref{1974,,while} statements have
consistent offsets for @ref{e0,,sys.monitoring}. @code{while} statements
are now compiled with a simple jump at the end of the body, instead of
duplicating the test.

@item 
gh-122907@footnote{https://github.com/python/cpython/issues/122907}: Building with @code{HAVE_DYNAMIC_LOADING} now works as well as it
did in 3.12. Existing deficiences will be addressed separately. (See
@indicateurl{https://github.com/python/cpython/issues/122950}.)

@item 
gh-122888@footnote{https://github.com/python/cpython/issues/122888}: Fix crash on certain calls to @code{str()} with positional
arguments of the wrong type. Patch by Jelle Zijlstra.

@item 
gh-118093@footnote{https://github.com/python/cpython/issues/118093}: Improve the experimental JIT’s handling of polymorphic code.

@item 
gh-122697@footnote{https://github.com/python/cpython/issues/122697}: Fixed memory leaks at interpreter shutdown in the free-threaded
build, and also reporting of leaked memory blocks via @ref{16f,,-X showrefcount}.

@item 
gh-116622@footnote{https://github.com/python/cpython/issues/116622}: Fix Android stdout and stderr messages being truncated or lost.

@item 
gh-122527@footnote{https://github.com/python/cpython/issues/122527}: Fix a crash that occurred when a @code{PyStructSequence} was
deallocated after its type’s dictionary was cleared by the GC.  The type’s
@ref{b7d,,tp_basicsize} now accounts for non-sequence
fields that aren’t included in the @ref{984,,Py_SIZE} of the sequence.

@item 
gh-122445@footnote{https://github.com/python/cpython/issues/122445}: Add only fields which are modified via self.* to
@ref{477,,__static_attributes__}.

@item 
gh-122417@footnote{https://github.com/python/cpython/issues/122417}: In the free-threaded build, the reference counts for heap type
objects are now partially stored in a distributed manner in per-thread
arrays.  This reduces contention on the heap type’s reference count fields
when creating or destroying instances of the same type from multiple
threads concurrently.

@item 
gh-116090@footnote{https://github.com/python/cpython/issues/116090}: Fix an issue in JIT builds that prevented some @ref{34a,,for}
loops from correctly firing @ref{1975,,RAISE} monitoring events.

@item 
gh-122300@footnote{https://github.com/python/cpython/issues/122300}: Preserve AST nodes for f-string with single-element format
specifiers. Patch by Pablo Galindo

@item 
gh-120906@footnote{https://github.com/python/cpython/issues/120906}: @ref{4a6,,frame.f_locals} now supports arbitrary hashable objects
as keys.

@item 
gh-122239@footnote{https://github.com/python/cpython/issues/122239}: When a @ref{24d,,list}, @ref{610,,tuple} or @ref{183,,dict} with too
many elements is unpacked, show the actual length in the error message.

@item 
gh-122245@footnote{https://github.com/python/cpython/issues/122245}: Detection of writes to @code{__debug__} is moved from the
compiler’s codegen stage to the symtable. This means that these errors are
now detected even in code that is optimized away before codegen (such as
assertions with the @ref{18c,,-O} command line option).

@item 
gh-122234@footnote{https://github.com/python/cpython/issues/122234}: Specializations for sums with float and complex inputs in
@ref{694,,sum()} now always use compensated summation.  Also, for integer items
in above specializations: @ref{1976,,PyLong_AsDouble()} is used, instead of
@ref{146b,,PyLong_AsLongAndOverflow()}.  Patch by Sergey B Kirpichev.

@item 
gh-122208@footnote{https://github.com/python/cpython/issues/122208}: Dictionary watchers now only deliver the PyDict_EVENT_ADDED
event when the insertion is in a known good state to succeed.

@item 
gh-122160@footnote{https://github.com/python/cpython/issues/122160}: Remove the @code{BUILD_CONST_KEY_MAP} opcode. Use
@ref{369,,BUILD_MAP} instead.

@item 
gh-122029@footnote{https://github.com/python/cpython/issues/122029}: Emit @code{c_call} events in @ref{1703,,sys.setprofile()} when a
@code{PyMethodObject} pointing to a @code{PyCFunction} is called.

@item 
gh-122026@footnote{https://github.com/python/cpython/issues/122026}: Fix a bug that caused the tokenizer to not correctly identify
mismatched parentheses inside f-strings in some situations. Patch by Pablo
Galindo

@item 
gh-99108@footnote{https://github.com/python/cpython/issues/99108}: Python’s hashlib now unconditionally uses the vendored HACL*
library for Blake2. Python no longer accepts libb2 as an optional
dependency for Blake2.

We refreshed HACL* to the latest version, and now vendor HACL*’s 128-bit
and 256-bit wide vector implementations for Blake2, which are used on
x86/x64 toolchains when the required CPU features are available at
runtime.

HACL*’s 128-bit wide vector implementation of Blake2 can also run on ARM
NEON and Power8, but lacking evidence of a performance gain, these are not
enabled (yet).
@end itemize

@node Library<49>,Core and Builtins<44>,Core and Builtins<43>,Python 3 14 0 alpha 1
@anchor{whatsnew/changelog id199}@anchor{1977}
@subsubsection Library



@itemize -

@item 
gh-121999@footnote{https://github.com/python/cpython/issues/121999}: The default extraction filter for the @ref{e4,,tarfile} module is
now set to @ref{29a,,'data'}.
@end itemize

@node Core and Builtins<44>,Library<50>,Library<49>,Python 3 14 0 alpha 1
@anchor{whatsnew/changelog id200}@anchor{1978}
@subsubsection Core and Builtins



@itemize -

@item 
gh-121860@footnote{https://github.com/python/cpython/issues/121860}: Fix crash when rematerializing a managed dictionary after it
was deleted.

@item 
gh-121795@footnote{https://github.com/python/cpython/issues/121795}: Improve performance of set membership testing, @code{set.remove()}
and @code{set.discard()} when the argument is a set.

@item 
gh-121814@footnote{https://github.com/python/cpython/issues/121814}: Fixed the SegFault when @ref{661,,PyEval_SetTrace()} is used with
no Python frame on stack.

@item 
gh-121295@footnote{https://github.com/python/cpython/issues/121295}: Fix PyREPL console getting into a blocked state after
interrupting a long paste

@item 
gh-121794@footnote{https://github.com/python/cpython/issues/121794}: Fix bug in free-threaded Python where a resurrected object
could lead to a negative ref count assertion failure.

@item 
gh-121657@footnote{https://github.com/python/cpython/issues/121657}: Improve the @ref{18e,,SyntaxError} message if the user tries to use
@ref{bc1,,yield from} outside a function.

@item 
gh-121609@footnote{https://github.com/python/cpython/issues/121609}: Fix pasting of characters containing unicode character joiners
in the new REPL. Patch by Marta Gomez Macias

@item 
gh-121297@footnote{https://github.com/python/cpython/issues/121297}: Previously, incorrect usage of @ref{18d,,await} or asynchronous
comprehensions in code removed by the @ref{18c,,-O} option was not flagged
by the Python compiler. Now, such code raises @ref{18e,,SyntaxError}. Patch by
Jelle Zijlstra.

@item 
gh-117482@footnote{https://github.com/python/cpython/issues/117482}: Unexpected slot wrappers are no longer created for builtin
static types in subinterpreters.

@item 
gh-121562@footnote{https://github.com/python/cpython/issues/121562}: Optimized performance of hex_from_char by replacing switch-case
with a lookup table

@item 
gh-121499@footnote{https://github.com/python/cpython/issues/121499}: Fix a bug affecting how multi-line history was being rendered
in the new REPL after interacting with the new screen cache. Patch by
Pablo Galindo

@item 
gh-121497@footnote{https://github.com/python/cpython/issues/121497}: Fix a bug that was preventing the REPL to correctly respect the
history when an input hook was set. Patch by Pablo Galindo

@item 
gh-121012@footnote{https://github.com/python/cpython/issues/121012}: Tier 2 execution now ensures that list iterators remain
exhausted, once they become exhausted.

@item 
gh-121439@footnote{https://github.com/python/cpython/issues/121439}: Allow tuples of length 20 in the freelist to be reused.

@item 
gh-121288@footnote{https://github.com/python/cpython/issues/121288}: @ref{2ec,,ValueError} messages for @ref{15c9,,list.index()},
@ref{1979,,range.index()}, @code{deque.index()}, @code{deque.remove()} and
@code{ShareableList.index()} no longer contain the repr of the searched
value (which can be arbitrary large) and are consistent with error
messages for other @ref{197a,,index()} and @ref{197b,,remove()}
methods.

@item 
gh-121368@footnote{https://github.com/python/cpython/issues/121368}: Fix race condition in @code{_PyType_Lookup} in the free-threaded
build due to a missing memory fence.  This could lead to
@code{_PyType_Lookup} returning incorrect results on arm64.

@item 
gh-121149@footnote{https://github.com/python/cpython/issues/121149}: Added specialization for summation of complexes, this also
improves accuracy of builtin @ref{694,,sum()} for such inputs.  Patch by Sergey
B Kirpichev.

@item 
gh-121130@footnote{https://github.com/python/cpython/issues/121130}: Fix f-strings with debug expressions in format specifiers.
Patch by Pablo Galindo
@end itemize

@node Library<50>,Core and Builtins<45>,Core and Builtins<44>,Python 3 14 0 alpha 1
@anchor{whatsnew/changelog id201}@anchor{197c}
@subsubsection Library



@itemize -

@item 
gh-121381@footnote{https://github.com/python/cpython/issues/121381}: Remove @code{subprocess._USE_VFORK} escape hatch code and
documentation. It was added just in case, and doesn’t have any known cases
that require it.
@end itemize

@node Core and Builtins<45>,Library<51>,Library<50>,Python 3 14 0 alpha 1
@anchor{whatsnew/changelog id202}@anchor{197d}
@subsubsection Core and Builtins



@itemize -

@item 
gh-119726@footnote{https://github.com/python/cpython/issues/119726}: Optimize code layout for calls to C functions from the JIT on
AArch64. Patch by Diego Russo.

@item 
gh-121115@footnote{https://github.com/python/cpython/issues/121115}: @ref{604,,PyLong_AsNativeBytes()} no longer uses
@ref{19e,,__index__()} methods by default. The
@code{Py_ASNATIVEBYTES_ALLOW_INDEX} flag has been added to allow it.

@item 
gh-120838@footnote{https://github.com/python/cpython/issues/120838}: @ref{45f,,Py_Finalize()} and @ref{f10,,Py_FinalizeEx()} now
always run with the main interpreter active.

@item 
gh-113433@footnote{https://github.com/python/cpython/issues/113433}: Subinterpreters now get cleaned up automatically during runtime
finalization.

@item 
gh-119726@footnote{https://github.com/python/cpython/issues/119726}: Improve the speed and memory use of C function calls from JIT
code on AArch64. Patch by Diego Russo

@item 
gh-116017@footnote{https://github.com/python/cpython/issues/116017}: Simplify the warmup mechanism used for “side exits” in JIT
code, resulting in slightly better performance and slightly lower memory
usage for most platforms.

@item 
gh-98442@footnote{https://github.com/python/cpython/issues/98442}: Fix too wide source locations of the cleanup instructions of a
with statement.

@item 
gh-120754@footnote{https://github.com/python/cpython/issues/120754}: Reduce the number of system calls invoked when reading a whole
file (ex. @code{open('a.txt').read()}). For a sample program that reads the
contents of the 400+ @code{.rst} files in the cpython repository @code{Doc}
folder, there is an over 10% reduction in system call count.

@item 
gh-119462@footnote{https://github.com/python/cpython/issues/119462}: Make sure that invariants of type versioning are maintained: *
Superclasses always have their version number assigned before subclasses *
The version tag is always zero if the tag is not valid. * The version tag
is always non-if the tag is valid.

@item 
gh-120437@footnote{https://github.com/python/cpython/issues/120437}: Fix @code{_CHECK_STACK_SPACE} optimization problems introduced in
gh-118322@footnote{https://github.com/python/cpython/issues/118322}.

@item 
gh-120722@footnote{https://github.com/python/cpython/issues/120722}: Correctly set the bytecode position on return instructions
within lambdas. Patch by Jelle Zijlstra.

@item 
gh-120367@footnote{https://github.com/python/cpython/issues/120367}: Fix bug where compiler creates a redundant jump during
pseudo-op replacement. Can only happen with a synthetic AST that has a try
on the same line as the instruction following the exception handler.

@item 
gh-120507@footnote{https://github.com/python/cpython/issues/120507}: Remove the @code{BEFORE_WITH} and @code{BEFORE_ASYNC_WITH}
instructions. Add the new @ref{36f,,LOAD_SPECIAL} instruction. Generate
code for @code{with} and @code{async with} statements using the new instruction.

@item 
gh-113993@footnote{https://github.com/python/cpython/issues/113993}: Strings interned with @ref{14e0,,sys.intern()} are again
garbage-collected when no longer used, as per the documentation. Strings
interned with the C function @ref{aae,,PyUnicode_InternInPlace()} are still
immortal. Internals of the string interning mechanism have been changed.
This may affect performance and identities of @ref{169,,str} objects.
@end itemize

@node Library<51>,Core and Builtins<46>,Core and Builtins<45>,Python 3 14 0 alpha 1
@anchor{whatsnew/changelog id203}@anchor{197e}
@subsubsection Library



@itemize -

@item 
gh-120485@footnote{https://github.com/python/cpython/issues/120485}: Add an override of @code{allow_reuse_port} on classes subclassing
@code{socketserver.TCPServer} where @code{allow_reuse_address} is also
overridden.
@end itemize

@node Core and Builtins<46>,Library<52>,Library<51>,Python 3 14 0 alpha 1
@anchor{whatsnew/changelog id204}@anchor{197f}
@subsubsection Core and Builtins



@itemize -

@item 
gh-120384@footnote{https://github.com/python/cpython/issues/120384}: Fix an array out of bounds crash in @code{list_ass_subscript},
which could be invoked via some specifically tailored input: including
concurrent modification of a list object, where one thread assigns a slice
and another clears it.

@item 
gh-120367@footnote{https://github.com/python/cpython/issues/120367}: Fix crash in compiler on code with redundant NOPs and JUMPs
which show up after exception handlers are moved to the end of the code.
@end itemize

@node Library<52>,Core and Builtins<47>,Core and Builtins<46>,Python 3 14 0 alpha 1
@anchor{whatsnew/changelog id205}@anchor{1980}
@subsubsection Library



@itemize -

@item 
gh-120380@footnote{https://github.com/python/cpython/issues/120380}: Fix Python implementation of @ref{c12,,pickle.Pickler} for
@ref{192,,bytes} and @ref{344,,bytearray} objects when using protocol version
5. Patch by Bénédikt Tran.
@end itemize

@node Core and Builtins<47>,Library<53>,Library<52>,Python 3 14 0 alpha 1
@anchor{whatsnew/changelog id206}@anchor{1981}
@subsubsection Core and Builtins



@itemize -

@item 
gh-120397@footnote{https://github.com/python/cpython/issues/120397}: Improve the throughput by up to two times for the
@ref{1982,,str.count()}, @ref{1983,,bytes.count()} and @ref{179c,,bytearray.count()} methods
for counting single characters.

@item 
gh-120221@footnote{https://github.com/python/cpython/issues/120221}: Deliver real signals on Ctrl-C and Ctrl-Z in the new REPL.
Patch by Pablo Galindo

@item 
gh-120346@footnote{https://github.com/python/cpython/issues/120346}: Respect 
@geindex PYTHON_BASIC_REPL
@geindex 환경 변수; PYTHON_BASIC_REPL
@ref{1b6,,PYTHON_BASIC_REPL} when running in interactive
inspect mode (@code{python -i}). Patch by Pablo Galindo

@item 
gh-93691@footnote{https://github.com/python/cpython/issues/93691}: Fix source locations of instructions generated for the iterator
of a for statement.

@item 
gh-120198@footnote{https://github.com/python/cpython/issues/120198}: Fix a crash when multiple threads read and write to the same
@code{__class__} of an object concurrently.

@item 
gh-120298@footnote{https://github.com/python/cpython/issues/120298}: Fix use-after free in @code{list_richcompare_impl} which can be
invoked via some specifically tailored evil input.

@item 
gh-119666@footnote{https://github.com/python/cpython/issues/119666}: Fix a compiler crash in the case where two comprehensions in
class scope both reference @code{__class__}.

@item 
gh-119726@footnote{https://github.com/python/cpython/issues/119726}: JIT: Re-use trampolines on AArch64 when creating stencils.
Patch by Diego Russo

@item 
gh-120225@footnote{https://github.com/python/cpython/issues/120225}: Fix crash in compiler on empty block at end of exception
handler.

@item 
gh-93691@footnote{https://github.com/python/cpython/issues/93691}: Fix source locations of instructions generated for with
statements.

@item 
gh-120097@footnote{https://github.com/python/cpython/issues/120097}: @code{FrameLocalsProxy} now subclasses @code{collections.abc.Mapping}
and can be matched as a mapping in @code{match} statements

@item 
gh-120080@footnote{https://github.com/python/cpython/issues/120080}: Direct call to the @code{int.__round__()} now accepts @code{None}
as a valid argument.

@item 
gh-119933@footnote{https://github.com/python/cpython/issues/119933}: Improve @ref{18e,,SyntaxError} messages for invalid expressions in
a type parameters bound, a type parameter constraint tuple or a default
type parameter. Patch by Bénédikt Tran.

@item 
gh-119724@footnote{https://github.com/python/cpython/issues/119724}: Reverted improvements to error messages for @code{elif}/@code{else}
statements not matching any valid statements, which made in hard to locate
the syntax errors inside those @code{elif}/@code{else} blocks.

@item 
gh-119879@footnote{https://github.com/python/cpython/issues/119879}: String search is now slightly faster for certain cases. It now
utilizes last character gap (good suffix rule) for two-way periodic
needles.

@item 
gh-119842@footnote{https://github.com/python/cpython/issues/119842}: Honor @ref{7a3,,PyOS_InputHook()} in the new REPL. Patch by Pablo
Galindo

@item 
gh-119180@footnote{https://github.com/python/cpython/issues/119180}: @ref{48f,,classmethod()} and @ref{453,,staticmethod()} now wrap the
@ref{458,,__annotations__} and @ref{1984,,__annotate__}
attributes of their underlying callable lazily. See 
@geindex Python 향상 제안; PEP 649
PEP 649@footnote{https://peps.python.org/pep-0649/}. Patch by
Jelle Zijlstra.

@item 
gh-119821@footnote{https://github.com/python/cpython/issues/119821}: Fix execution of @ref{4ac,,annotation scopes}
within classes when @code{globals} is set to a non-dict. Patch by Jelle
Zijlstra.

@item 
gh-118934@footnote{https://github.com/python/cpython/issues/118934}: Make @code{PyEval_GetLocals} return borrowed reference

@item 
gh-119740@footnote{https://github.com/python/cpython/issues/119740}: Remove the previously-deprecated delegation of @ref{19b,,int()} to
@ref{19c,,__trunc__()}.

@item 
gh-119689@footnote{https://github.com/python/cpython/issues/119689}: Generate stack effect metadata for pseudo instructions from
bytecodes.c.

@item 
gh-109218@footnote{https://github.com/python/cpython/issues/109218}: @ref{197,,complex()} accepts now a string only as a positional
argument. Passing a complex number as the “real” or “imag” argument is
deprecated; it should only be passed as a single positional argument.

@item 
gh-119548@footnote{https://github.com/python/cpython/issues/119548}: Add a @code{clear} command to the REPL. Patch by Pablo Galindo

@item 
gh-111999@footnote{https://github.com/python/cpython/issues/111999}: Fix the signature of @ref{fd6,,str.format_map()}.

@item 
gh-119560@footnote{https://github.com/python/cpython/issues/119560}: An invalid assert in beta 1 has been removed.  The assert would
fail if @code{PyState_FindModule()} was used in an extension module’s init
function before the module def had been initialized.

@item 
gh-119369@footnote{https://github.com/python/cpython/issues/119369}: Fix deadlock during thread deletion in free-threaded build,
which could occur when the GIL was enabled at runtime.

@item 
gh-119525@footnote{https://github.com/python/cpython/issues/119525}: Fix deadlock involving @code{_PyType_Lookup()} cache in the
free-threaded build when the GIL is dynamically enabled at runtime.

@item 
gh-119258@footnote{https://github.com/python/cpython/issues/119258}: Eliminate type version guards in the tier two interpreter.

Note that setting the @code{tp_version_tag} manually (which has never been
supported) may result in crashes.

@item 
gh-119311@footnote{https://github.com/python/cpython/issues/119311}: Fix bug where names are unexpectedly mangled in the bases of
generic classes.

@item 
gh-119395@footnote{https://github.com/python/cpython/issues/119395}: Fix bug where names appearing after a generic class are mangled
as if they are in the generic class.

@item 
gh-119372@footnote{https://github.com/python/cpython/issues/119372}: Correct invalid corner cases in complex division (resulted in
@code{(nan+nanj)} output), e.g.  @code{1/complex('(inf+infj)')}.  Patch by
Sergey B Kirpichev.

@item 
gh-119180@footnote{https://github.com/python/cpython/issues/119180}: Evaluation of annotations is now deferred. See 
@geindex Python 향상 제안; PEP 649
PEP 649@footnote{https://peps.python.org/pep-0649/} for
details.

@item 
gh-119180@footnote{https://github.com/python/cpython/issues/119180}: Replace @code{LOAD_ASSERTION_ERROR} opcode with
@ref{36a,,LOAD_COMMON_CONSTANT} and add support for
@ref{36b,,NotImplementedError}.

@item 
gh-119213@footnote{https://github.com/python/cpython/issues/119213}: Non-builtin modules built with argument clinic were crashing if
used in a subinterpreter before the main interpreter.  The objects that
were causing the problem by leaking between interpreters carelessly have
been fixed.

@item 
gh-119011@footnote{https://github.com/python/cpython/issues/119011}: Fixes @code{type.__type_params__} to return an empty tuple instead
of a descriptor.

@item 
gh-118692@footnote{https://github.com/python/cpython/issues/118692}: Avoid creating unnecessary @ref{df4,,StopIteration} instances for
monitoring.

@item 
gh-119180@footnote{https://github.com/python/cpython/issues/119180}: Add an @code{__annotate__} attribute to functions, classes, and
modules as part of 
@geindex Python 향상 제안; PEP 649
PEP 649@footnote{https://peps.python.org/pep-0649/}. Patch by Jelle Zijlstra.

@item 
gh-119049@footnote{https://github.com/python/cpython/issues/119049}: Fix displaying the source line for warnings created by the C
API if the @ref{118,,warnings} module had not yet been imported.

@item 
gh-119057@footnote{https://github.com/python/cpython/issues/119057}: Improve @ref{b3f,,ZeroDivisionError} error message. Now, all error
messages are harmonized: all @code{/}, @code{//}, and @code{%} operations just use
“division by zero” message. And @code{0 ** -1} operation uses “zero to a
negative power”.

@item 
gh-118844@footnote{https://github.com/python/cpython/issues/118844}: Fix build failures when configuring with both @code{--disable-gil}
and @code{--enable-experimental-jit}.

@item 
gh-118921@footnote{https://github.com/python/cpython/issues/118921}: Add @code{copy()} method for @code{FrameLocalsProxy} which returns a
snapshot @code{dict} for local variables.

@item 
gh-117657@footnote{https://github.com/python/cpython/issues/117657}: Fix data races on the field that stores a pointer to the
interpreter’s main thread that occur in free-threaded builds.

@item 
gh-118750@footnote{https://github.com/python/cpython/issues/118750}: If the C version of the @code{decimal} module is available,
@code{int(str)} now uses it to supply an asymptotically much faster
conversion. However, this only applies if the string contains over about 2
million digits.

@item 
gh-118767@footnote{https://github.com/python/cpython/issues/118767}: Using @ref{1a2,,NotImplemented} in a boolean context now raises
@ref{198,,TypeError}. Contributed by Jelle Zijlstra.

@item 
gh-118561@footnote{https://github.com/python/cpython/issues/118561}: Fix race condition in free-threaded build where
@ref{600,,list.extend()} could expose uninitialised memory to concurrent
readers.

@item 
gh-117139@footnote{https://github.com/python/cpython/issues/117139}: Convert the Python evaluation stack to use internal stack
references. The purpose is to support tagged pointers. In 
@geindex Python 향상 제안; PEP 703
PEP 703@footnote{https://peps.python.org/pep-0703/}, this
will allow for its form of deferred reference counting. For both the
default and free-threaded builds, this sets up the infrastructure for
unboxed integers in the future.
@end itemize

@node Library<53>,Core and Builtins<48>,Core and Builtins<47>,Python 3 14 0 alpha 1
@anchor{whatsnew/changelog id207}@anchor{1985}
@subsubsection Library



@itemize -

@item 
gh-115801@footnote{https://github.com/python/cpython/issues/115801}: Raise @code{TypeError} when passing a string to
@ref{1986,,difflib.unified_diff()} and @ref{1987,,difflib.context_diff()}.
@end itemize

@node Core and Builtins<48>,C API<16>,Library<53>,Python 3 14 0 alpha 1
@anchor{whatsnew/changelog id208}@anchor{1988}
@subsubsection Core and Builtins



@itemize -

@item 
gh-117558@footnote{https://github.com/python/cpython/issues/117558}: Improve error messages when a string, bytes or bytearray object
of length 1 is expected.

@item 
gh-117195@footnote{https://github.com/python/cpython/issues/117195}: Avoid assertion failure for debug builds when calling
@code{object.__sizeof__(1)}

@item 
gh-116022@footnote{https://github.com/python/cpython/issues/116022}: Improve the @ref{82e,,__repr__()} output of
@ref{4c5,,AST} nodes.

@item 
gh-114091@footnote{https://github.com/python/cpython/issues/114091}: Changed the error message for awaiting something that can’t be
awaited from “object <type> can’t be used in an await expression” to
“’<type>’ object can’t be awaited”.

@item 
gh-113190@footnote{https://github.com/python/cpython/issues/113190}: @ref{45f,,Py_Finalize()} now deletes all interned strings.

@item 
gh-84978@footnote{https://github.com/python/cpython/issues/84978}: Add class methods @ref{194,,float.from_number()} and
@ref{195,,complex.from_number()}.

@item 
gh-95144@footnote{https://github.com/python/cpython/issues/95144}: Improve the error message from @code{a in b} when @code{b} is not a
container to mention the term “container”.

@item 
bpo-24766@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24766}: Fix handling of @code{doc} argument to subclasses of @code{property}.
@end itemize

@node C API<16>,Build<16>,Core and Builtins<48>,Python 3 14 0 alpha 1
@anchor{whatsnew/changelog id209}@anchor{1989}
@subsubsection C API



@itemize -

@item 
gh-123961@footnote{https://github.com/python/cpython/issues/123961}: Convert the @ref{198a,,curses.window} static
type exposed by the @code{PyCursesWindow_Type} macro in
@code{Include/py_curses.h} to a @ref{b5e,,heap type}. Patch by
Bénédikt Tran.

@item 
gh-124502@footnote{https://github.com/python/cpython/issues/124502}: Add @ref{3b2,,PyUnicode_Equal()} function to the limited C API:
test if two strings are equal. Patch by Victor Stinner.

@item 
gh-124296@footnote{https://github.com/python/cpython/issues/124296}: @ref{64d,,PyDictObject} no longer maintains a private version
tag field @code{ma_version_tag} per 
@geindex Python 향상 제안; PEP 699
PEP 699@footnote{https://peps.python.org/pep-0699/}.  This field was originally
added in Python 3.6 (
@geindex Python 향상 제안; PEP 509
PEP 509@footnote{https://peps.python.org/pep-0509/}) and deprecated in Python 3.12.

@item 
gh-124160@footnote{https://github.com/python/cpython/issues/124160}: Fix crash when importing modules containing state and
single-phase initialization in a subinterpreter.

@item 
gh-124153@footnote{https://github.com/python/cpython/issues/124153}: Add @ref{3b0,,PyType_GetBaseByToken()} and @ref{3b1,,Py_tp_token}
slot for easier type checking, related to 
@geindex Python 향상 제안; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/} and 
@geindex Python 향상 제안; PEP 630
PEP 630@footnote{https://peps.python.org/pep-0630/}.

@item 
gh-124127@footnote{https://github.com/python/cpython/issues/124127}: In the limited C API 3.14 and newer, @ref{2cf,,Py_REFCNT()} is now
implemented as an opaque function call to hide implementation details.
Patch by Victor Stinner.

@item 
gh-123880@footnote{https://github.com/python/cpython/issues/123880}: Fixed a bug that prevented circular imports of extension
modules that use single-phase initialization.

@item 
gh-123909@footnote{https://github.com/python/cpython/issues/123909}: @ref{79c,,PyType_FromSpec()}, @ref{79d,,PyType_FromSpecWithBases()}
and @ref{772,,PyType_FromModuleAndSpec()} will now fail if the metaclass of
the new type has custom @ref{79e,,tp_new}.

@item 
gh-107954@footnote{https://github.com/python/cpython/issues/107954}: Add functions to configure the Python initialization
(
@geindex Python 향상 제안; PEP 741
PEP 741@footnote{https://peps.python.org/pep-0741/}):


@itemize *

@item 
@ref{387,,PyInitConfig_Create()}

@item 
@ref{388,,PyInitConfig_Free()}

@item 
@ref{38a,,PyInitConfig_GetError()}

@item 
@ref{38b,,PyInitConfig_GetExitCode()}

@item 
@ref{38f,,PyInitConfig_HasOption()}

@item 
@ref{38c,,PyInitConfig_GetInt()}

@item 
@ref{38d,,PyInitConfig_GetStr()}

@item 
@ref{38e,,PyInitConfig_GetStrList()}

@item 
@ref{389,,PyInitConfig_FreeStrList()}

@item 
@ref{390,,PyInitConfig_SetInt()}

@item 
@ref{391,,PyInitConfig_SetStr()}

@item 
@ref{392,,PyInitConfig_SetStrList()}

@item 
@ref{37b,,PyInitConfig_AddModule()}

@item 
@ref{386,,Py_InitializeFromInitConfig()}
@end itemize

Patch by Victor Stinner.

@item 
gh-107954@footnote{https://github.com/python/cpython/issues/107954}: Add functions to get and set the current runtime Python
configuration:


@itemize *

@item 
@ref{37c,,PyConfig_Get()}

@item 
@ref{384,,PyConfig_GetInt()}

@item 
@ref{37d,,PyConfig_Set()}

@item 
@ref{385,,PyConfig_Names()}
@end itemize

Patch by Victor Stinner.

@item 
gh-123465@footnote{https://github.com/python/cpython/issues/123465}: @ref{76f,,Py_RELATIVE_OFFSET} is now allowed in
@ref{770,,PyMemberDef} for the special offset member
@code{"__vectorcalloffset__"}, as well as the discouraged special offset
members @code{"__dictoffset__"} and @code{"__weaklistoffset__"}

@item 
gh-100554@footnote{https://github.com/python/cpython/issues/100554}: Added a slot @code{Py_tp_vectorcall} to set
@ref{198b,,tp_vectorcall} via the @ref{79c,,PyType_FromSpec()}
function family. Limited API extensions can use this feature to provide
more efficient vector call-based implementation of @code{__new__} and
@code{__init__}.

@item 
gh-122854@footnote{https://github.com/python/cpython/issues/122854}: Add @ref{395,,Py_HashBuffer()} to compute and return the hash
value of a buffer. Patch by Antoine Pitrou and Victor Stinner.

@item 
gh-122728@footnote{https://github.com/python/cpython/issues/122728}: Fix @ref{5f5,,PyEval_GetLocals()} to avoid @ref{794,,SystemError}
(“bad argument to internal function”). Patch by Victor Stinner.

@item 
gh-116622@footnote{https://github.com/python/cpython/issues/116622}: Make @ref{198c,,PyObject_Print} work around a bug in Android and
OpenBSD which prevented it from throwing an exception when trying to write
to a read-only stream.

@item 
gh-105201@footnote{https://github.com/python/cpython/issues/105201}: Add @ref{398,,PyIter_NextItem()} to replace @ref{399,,PyIter_Next()},
which has an ambiguous return value. Patch by Irit Katriel and Erlend
Aasland.

@item 
gh-121489@footnote{https://github.com/python/cpython/issues/121489}: Export private @code{_PyBytes_Join()} again.

@item 
gh-121645@footnote{https://github.com/python/cpython/issues/121645}: Add @ref{383,,PyBytes_Join(sep@comma{} iterable)}
function, similar to @code{sep.join(iterable)} in Python. Patch by Victor
Stinner.

@item 
gh-89364@footnote{https://github.com/python/cpython/issues/89364}: Export the @ref{15e0,,PySignal_SetWakeupFd()} function. Previously,
the function was documented but it couldn’t be used in 3rd party code.
Patch by Victor Stinner.

@item 
gh-113993@footnote{https://github.com/python/cpython/issues/113993}: @ref{aae,,PyUnicode_InternInPlace()} no longer prevents its
argument from being garbage collected.

Several functions that take @code{char *} are now documented as possibly
preventing string objects from being garbage collected; refer to their
documentation for details: @ref{198d,,PyUnicode_InternFromString()},
@ref{198e,,PyDict_SetItemString()}, @ref{198f,,PyObject_SetAttrString()},
@ref{1835,,PyObject_DelAttrString()}, @code{PyUnicode_InternFromString()},
and @code{PyModule_Add*} convenience functions.

@item 
gh-113601@footnote{https://github.com/python/cpython/issues/113601}: Removed debug build assertions related to interning strings,
which were falsely triggered by stable ABI extensions.

@item 
gh-112136@footnote{https://github.com/python/cpython/issues/112136}: Restore the private @code{_PyArg_Parser} structure and the private
@code{_PyArg_ParseTupleAndKeywordsFast()} function, previously removed in
Python 3.13 alpha 1. Patch by Victor Stinner.

@item 
gh-120642@footnote{https://github.com/python/cpython/issues/120642}: Remove the private @code{_Py_CODEUNIT} type from the public C API.
The internal @code{pycore_code.h} header should now be used to get this
internal type. Patch by Victor Stinner.

@item 
gh-120858@footnote{https://github.com/python/cpython/issues/120858}: @ref{1990,,PyDict_Next()} no longer locks the dictionary in the
free-threaded build.  The locking needs to be done by the caller around
the entire iteration loop.

@item 
gh-120642@footnote{https://github.com/python/cpython/issues/120642}: Remove the following unstable functions:


@itemize *

@item 
@code{PyUnstable_Replace_Executor()}

@item 
@code{PyUnstable_SetOptimizer()}

@item 
@code{PyUnstable_GetOptimizer()}

@item 
@code{PyUnstable_GetExecutor()}

@item 
@code{PyUnstable_Optimizer_NewCounter()}

@item 
@code{PyUnstable_Optimizer_NewUOpOptimizer()}
@end itemize

Patch by Victor Stinner.

@item 
gh-120389@footnote{https://github.com/python/cpython/issues/120389}: Add new functions to convert C @code{<stdint.h>} numbers from/to
Python @ref{19b,,int}:


@itemize *

@item 
@ref{3a3,,PyLong_FromInt32()}

@item 
@ref{3a5,,PyLong_FromUInt32()}

@item 
@ref{3a4,,PyLong_FromInt64()}

@item 
@ref{3a6,,PyLong_FromUInt64()}

@item 
@ref{39f,,PyLong_AsInt32()}

@item 
@ref{3a1,,PyLong_AsUInt32()}

@item 
@ref{3a0,,PyLong_AsInt64()}

@item 
@ref{3a2,,PyLong_AsUInt64()}
@end itemize

Patch by Victor Stinner.

@item 
gh-120600@footnote{https://github.com/python/cpython/issues/120600}: In the limited C API 3.14 and newer, @ref{3c9,,Py_TYPE()} is now
implemented as an opaque function call to hide implementation details.
Patch by Victor Stinner.

@item 
gh-70278@footnote{https://github.com/python/cpython/issues/70278}: @ref{629,,PyUnicode_FromFormat()} no longer produces the ending
@code{\ufffd} character for truncated C string when use precision with @code{%s}
and @code{%V}. It now truncates the string before the start of truncated
multibyte sequences.

@item 
gh-119771@footnote{https://github.com/python/cpython/issues/119771}: Set @ref{5b,,errno} in @ref{18f3,,_Py_c_pow()} on overflows.  Patch
by Sergey B Kirpichev.

@item 
gh-119182@footnote{https://github.com/python/cpython/issues/119182}: Add a new @ref{3b3,,PyUnicodeWriter} API to create a Python
@ref{169,,str} object:


@itemize *

@item 
@ref{3b4,,PyUnicodeWriter_Create()}.

@item 
@ref{3b6,,PyUnicodeWriter_Discard()}.

@item 
@ref{3b7,,PyUnicodeWriter_Finish()}.

@item 
@ref{3ba,,PyUnicodeWriter_WriteChar()}.

@item 
@ref{3bf,,PyUnicodeWriter_WriteUTF8()}.

@item 
@ref{3be,,PyUnicodeWriter_WriteUCS4()}.

@item 
@ref{3c0,,PyUnicodeWriter_WriteWideChar()}.

@item 
@ref{3bc,,PyUnicodeWriter_WriteStr()}.

@item 
@ref{3bb,,PyUnicodeWriter_WriteRepr()}.

@item 
@ref{3bd,,PyUnicodeWriter_WriteSubstring()}.

@item 
@ref{3b8,,PyUnicodeWriter_Format()}.

@item 
@ref{3b5,,PyUnicodeWriter_DecodeUTF8Stateful()}.
@end itemize

Patch by Victor Stinner.

@item 
gh-119613@footnote{https://github.com/python/cpython/issues/119613}: Soft deprecate the @ref{1991,,Py_MEMCPY} macro: use directly
@code{memcpy()} instead.  Patch by Victor Stinner.

@item 
gh-119775@footnote{https://github.com/python/cpython/issues/119775}: Creating @ref{3cf,,immutable types}
with mutable bases was deprecated since 3.12 and now raises a
@ref{198,,TypeError}.

@item 
gh-119585@footnote{https://github.com/python/cpython/issues/119585}: Fix crash when a thread state that was created by
@ref{648,,PyGILState_Ensure()} calls a destructor that during
@ref{1992,,PyThreadState_Clear()} that calls back into
@code{PyGILState_Ensure()} and @ref{649,,PyGILState_Release()}. This might
occur when in the free-threaded build or when using thread-local variables
whose destructors call @code{PyGILState_Ensure()}.

@item 
gh-119613@footnote{https://github.com/python/cpython/issues/119613}: Macros @code{Py_IS_NAN}, @code{Py_IS_INFINITY} and @code{Py_IS_FINITE}
are @ref{23d,,soft deprecated}.

@item 
gh-119336@footnote{https://github.com/python/cpython/issues/119336}: Restore the removed @code{_PyLong_NumBits()} function. It is used
by the pywin32 project. Patch by Ethan Smith

@item 
gh-119344@footnote{https://github.com/python/cpython/issues/119344}: The critical section API is now public as part of the
non-limited C API.

@item 
gh-119333@footnote{https://github.com/python/cpython/issues/119333}: Add @ref{1993,,PyContext_AddWatcher()} and
@ref{1994,,PyContext_ClearWatcher()} APIs to register callbacks to receive
notification on enter and exit of context objects.

@item 
gh-119247@footnote{https://github.com/python/cpython/issues/119247}: Added @code{Py_BEGIN_CRITICAL_SECTION_SEQUENCE_FAST} and
@code{Py_END_CRITICAL_SECTION_SEQUENCE_FAST} macros to make it possible to
use PySequence_Fast APIs safely when free-threaded, and update str.join to
work without the GIL using them.

@item 
gh-111389@footnote{https://github.com/python/cpython/issues/111389}: Add @ref{1995,,PyHASH_MULTIPLIER} constant: prime multiplier
used in string and various other hashes. Patch by Victor Stinner.

@item 
gh-118771@footnote{https://github.com/python/cpython/issues/118771}: Several C declarations with names that didn’t start with the
@code{Py} or @code{_Py} prefixes, which were added by mistake in 3.13 alpha and
beta releases, were moved to internal headers.

@item 
gh-116984@footnote{https://github.com/python/cpython/issues/116984}: Make mimalloc includes relative to the current file to avoid
embedders or extensions needing to include @code{Internal/mimalloc} if they
are already including internal CPython headers.

@item 
gh-118789@footnote{https://github.com/python/cpython/issues/118789}: Add @ref{1996,,PyUnstable_Object_ClearWeakRefsNoCallbacks()}, which
clears weakrefs without calling their callbacks.

@item 
gh-118789@footnote{https://github.com/python/cpython/issues/118789}: Restore @code{_PyWeakref_ClearRef} that was previously removed in
Python 3.13 alpha 1.

@item 
gh-117511@footnote{https://github.com/python/cpython/issues/117511}: Make the @ref{485,,PyMutex} public in the non-limited C API.

@item 
gh-116560@footnote{https://github.com/python/cpython/issues/116560}: Add @ref{39a,,PyLong_GetSign()} function.  Patch by Sergey B
Kirpichev.

@item 
gh-97588@footnote{https://github.com/python/cpython/issues/97588}: Fix creating bitfields in @ref{2e,,ctypes} structures and unions.
Fields no longer overlap.

@item 
gh-87135@footnote{https://github.com/python/cpython/issues/87135}: Attempting to acquire the GIL after runtime finalization has
begun in a different thread now causes the thread to hang rather than
terminate, which avoids potential crashes or memory corruption caused by
attempting to terminate a thread that is running code not specifically
designed to support termination. In most cases this hanging is harmless
since the process will soon exit anyway.

The @code{PyThread_exit_thread} function is now deprecated.  Its behavior is
inconsistent across platforms, and it can only be used safely in the
unlikely case that every function in the entire call stack has been
designed to support the platform-dependent termination mechanism.  It is
recommended that users of this function change their design to not require
thread termination.  In the unlikely case that thread termination is
needed and can be done safely, users may migrate to calling
platform-specific APIs such as @code{pthread_exit} (POSIX) or
@code{_endthreadex} (Windows) directly.

@item 
bpo-34008@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34008}: Added @code{Py_IsInitialized} to the list of APIs that are safe to
call before the interpreter is initialized, and updated the embedding
tests to cover it.
@end itemize

@node Build<16>,,C API<16>,Python 3 14 0 alpha 1
@anchor{whatsnew/changelog id210}@anchor{1997}
@subsubsection Build



@itemize -

@item 
gh-125269@footnote{https://github.com/python/cpython/issues/125269}: Fix detection of whether @code{-latomic} is needed when
cross-compiling CPython using the configure script.

@item 
gh-123990@footnote{https://github.com/python/cpython/issues/123990}: Remove @code{WITH_FREELISTS} macro and @code{--without-freelists}
build configuration

@item 
gh-124102@footnote{https://github.com/python/cpython/issues/124102}: Update internal documentation under PCbuild, so it now
correctly states that Windows requires VS2017 or later and Python 3.10 or
later

@item 
gh-124043@footnote{https://github.com/python/cpython/issues/124043}: Building using @ref{634,,--with-trace-refs} is (temporarily)
disallowed when the GIL is disabled.

@item 
gh-123418@footnote{https://github.com/python/cpython/issues/123418}: Updated Android build to use OpenSSL 3.0.15.

@item 
gh-123297@footnote{https://github.com/python/cpython/issues/123297}: Propagate the value of @code{LDFLAGS} to @code{LDCXXSHARED} in
@ref{e1,,sysconfig}. Patch by Pablo Galindo

@item 
gh-121634@footnote{https://github.com/python/cpython/issues/121634}: Allow for specifying the target compile triple for WASI.

@item 
gh-122578@footnote{https://github.com/python/cpython/issues/122578}: Use WASI SDK 24 for testing.

@item 
gh-116622@footnote{https://github.com/python/cpython/issues/116622}: Rename build variable @code{MODULE_LDFLAGS} back to @code{LIBPYTHON},
as it’s used by package build systems (e.g. Meson).

@item 
gh-118943@footnote{https://github.com/python/cpython/issues/118943}: Fix an issue where the experimental JIT could be built several
times by the @code{make regen-all} target, leading to possible race
conditions on heavily parallelized builds.

@item 
gh-121996@footnote{https://github.com/python/cpython/issues/121996}: Introduce ./configure –disable-safety and
–enable-slower-safety options. Patch by Donghee Na.

@item 
gh-120522@footnote{https://github.com/python/cpython/issues/120522}: Added a @ref{1998,,--with-app-store-compliance} option to patch
out known issues with macOS/iOS App Store review processes.

@item 
gh-120371@footnote{https://github.com/python/cpython/issues/120371}: Support WASI SDK 22 by explicitly skipping functions that are
just stubs in wasi-libc.

@item 
gh-121731@footnote{https://github.com/python/cpython/issues/121731}: Fix mimalloc compile error on GNU/Hurd

@item 
gh-121487@footnote{https://github.com/python/cpython/issues/121487}: Fix deprecation warning for ATOMIC_VAR_INIT in mimalloc.

@item 
gh-121467@footnote{https://github.com/python/cpython/issues/121467}: Fix a Makefile bug that prevented mimalloc header files from
being installed.

@item 
gh-121103@footnote{https://github.com/python/cpython/issues/121103}: On POSIX systems, excluding macOS framework installs, the lib
directory for the free-threaded build now includes a “t” suffix to avoid
conflicts with a co-located default build installation.

@item 
gh-120831@footnote{https://github.com/python/cpython/issues/120831}: The default minimum iOS version was increased to 13.0.

@item 
gh-121082@footnote{https://github.com/python/cpython/issues/121082}: Fix build failure when the developer use @code{--enable-pystats}
arguments in configuration command after #118450.

@item 
gh-120671@footnote{https://github.com/python/cpython/issues/120671}: Fix failing configure tests due to a missing space when
appending to CFLAGS.

@item 
gh-120602@footnote{https://github.com/python/cpython/issues/120602}: Correctly handle LLVM installs with @code{LLVM_VERSION_SUFFIX}
when building with @code{--enable-experimental-jit}.

@item 
gh-120688@footnote{https://github.com/python/cpython/issues/120688}: On WASI in debug mode, Python is now built with compiler flag
@code{-O3} instead of @code{-Og}, to support more recursive calls. Patch by
Victor Stinner.

@item 
gh-118943@footnote{https://github.com/python/cpython/issues/118943}: Fix a possible race condition affecting parallel builds
configured with @code{--enable-experimental-jit}, in which
@ref{264,,FileNotFoundError} could be caused by another process already moving
@code{jit_stencils.h.new} to @code{jit_stencils.h}.

@item 
gh-120326@footnote{https://github.com/python/cpython/issues/120326}: On Windows, fix build error when @code{--disable-gil} and
@code{--experimental-jit} options are combined.

@item 
gh-120291@footnote{https://github.com/python/cpython/issues/120291}: Make the @code{python-config} shell script compatible with
non-bash shells.

@item 
gh-113565@footnote{https://github.com/python/cpython/issues/113565}: Improve @ref{2f,,curses} and @ref{31,,curses.panel} dependency checks
in @code{configure}.

@item 
gh-119729@footnote{https://github.com/python/cpython/issues/119729}: On POSIX systems, the pkg-config (@code{.pc}) filenames now
include the ABI flags, which may include debug (“d”) and free-threaded
(“t”).  For example: * @code{python-3.14.pc} (default, non-debug build) *
@code{python-3.14d.pc} (default, debug build) * @code{python-3.14t.pc}
(free-threaded build)

@item 
gh-119400@footnote{https://github.com/python/cpython/issues/119400}: @code{make_ssl_certs}, the script that prepares certificate data
for the test suite, now allows specifying expiration dates.

@item 
gh-115119@footnote{https://github.com/python/cpython/issues/115119}: Fall back to the bundled libmpdec if a system version cannot be
found.

@item 
gh-119132@footnote{https://github.com/python/cpython/issues/119132}: Update @ref{49d,,sys.version} to identify whether the build is
default build or free-threading build. Patch By Donghee Na.

@item 
gh-118836@footnote{https://github.com/python/cpython/issues/118836}: Fix an @code{AssertionError} when building with
@code{--enable-experimental-jit} and the compiler emits a @code{SHT_NOTE}
section.

@item 
gh-118943@footnote{https://github.com/python/cpython/issues/118943}: Fix a possible race condition affecting parallel builds
configured with @code{--enable-experimental-jit}, in which compilation errors
could be caused by an incompletely-generated header file.
@end itemize

@node Python 3 13 0 beta 1,Python 3 13 0 alpha 6,Python 3 14 0 alpha 1,Changelog
@anchor{whatsnew/changelog python-3-13-0-beta-1}@anchor{1999}
@subsection Python 3.13.0 beta 1


`Release date: 2024-05-08'

@menu
* Security: Security<18>. 
* Core and Builtins: Core and Builtins<49>. 
* Library: Library<54>. 
* Core and Builtins: Core and Builtins<50>. 
* Library: Library<55>. 
* Documentation: Documentation<15>. 
* Build: Build<17>. 
* Windows: Windows<15>. 
* macOS: macOS<9>. 
* IDLE: IDLE<8>. 
* C API: C API<17>. 

@end menu

@node Security<18>,Core and Builtins<49>,,Python 3 13 0 beta 1
@anchor{whatsnew/changelog id211}@anchor{199a}
@subsubsection Security



@itemize -

@item 
gh-116741@footnote{https://github.com/python/cpython/issues/116741}: Update bundled libexpat to 2.6.2

@item 
gh-117233@footnote{https://github.com/python/cpython/issues/117233}: Detect BLAKE2, SHA3, Shake, & truncated SHA512 support in the
OpenSSL-ish libcrypto library at build time.  This allows @ref{6c,,hashlib}
to be used with libraries that do not to support every algorithm that
upstream OpenSSL does.
@end itemize

@node Core and Builtins<49>,Library<54>,Security<18>,Python 3 13 0 beta 1
@anchor{whatsnew/changelog id212}@anchor{199b}
@subsubsection Core and Builtins



@itemize -

@item 
gh-118414@footnote{https://github.com/python/cpython/issues/118414}: Add instrumented opcodes to YIELD_VALUE assertion for tracing
cases.

@item 
gh-117953@footnote{https://github.com/python/cpython/issues/117953}: When a builtin or extension module is imported for the first
time, while a subinterpreter is active, the module’s init function is now
run by the main interpreter first before import continues in the
subinterpreter. Consequently, single-phase init modules now fail in an
isolated subinterpreter without the init function running under that
interpreter, whereas before it would run under the subinterpreter `before'
failing, potentially leaving behind global state and callbacks and
otherwise leaving the module in an inconsistent state.

@item 
gh-117549@footnote{https://github.com/python/cpython/issues/117549}: Don’t use designated initializer syntax in inline functions in
internal headers. They cause problems for C++ or MSVC users who aren’t yet
using the latest C++ standard (C++20). While internal, pycore_backoff.h,
is included (indirectly, via pycore_code.h) by some key 3rd party software
that does so for speed.
@end itemize

@node Library<54>,Core and Builtins<50>,Core and Builtins<49>,Python 3 13 0 beta 1
@anchor{whatsnew/changelog id213}@anchor{199c}
@subsubsection Library



@itemize -

@item 
gh-95382@footnote{https://github.com/python/cpython/issues/95382}: Improve performance of @ref{f40,,json.dumps()} and @ref{f3f,,json.dump()}
when using the argument `indent'. Depending on the data the encoding using
@code{json.dumps()} with `indent' can be up to 2 to 3 times faster.
@end itemize

@node Core and Builtins<50>,Library<55>,Library<54>,Python 3 13 0 beta 1
@anchor{whatsnew/changelog id214}@anchor{199d}
@subsubsection Core and Builtins



@itemize -

@item 
gh-116322@footnote{https://github.com/python/cpython/issues/116322}: In @code{--disable-gil} builds, the GIL will be enabled while
loading C extension modules. If the module indicates that it supports
running without the GIL, the GIL will be disabled once loading is
complete. Otherwise, the GIL will remain enabled for the remainder of the
interpreter’s lifetime. This behavior does not apply if the GIL has been
explicitly enabled or disabled with @code{PYTHON_GIL} or @code{-Xgil}.

@item 
gh-118513@footnote{https://github.com/python/cpython/issues/118513}: Fix incorrect @ref{173b,,UnboundLocalError} when two comprehensions
in the same function both reference the same name, and in one
comprehension the name is bound while in the other it’s an implicit
global.

@item 
gh-118518@footnote{https://github.com/python/cpython/issues/118518}: Allow the Linux perf support to work without frame pointers
using perf’s advanced JIT support. The feature is activated when using the
@code{PYTHON_PERF_JIT_SUPPORT} environment variable or when running Python
with @code{-Xperf_jit}. Patch by Pablo Galindo.

@item 
gh-117514@footnote{https://github.com/python/cpython/issues/117514}: Add @code{sys._is_gil_enabled()} function that returns whether the
GIL is currently enabled.  In the default build it always returns @code{True}
because the GIL is always enabled.  In the free-threaded build, it may
return @code{True} or @code{False}.

@item 
gh-118164@footnote{https://github.com/python/cpython/issues/118164}: Break a loop between the Python implementation of the
@ref{3a,,decimal} module and the Python code for integer to string
conversion. Also optimize integer to string conversion for values in the
range from 9_000 to 135_000 decimal digits.

@item 
gh-118473@footnote{https://github.com/python/cpython/issues/118473}: Fix @ref{199e,,sys.set_asyncgen_hooks()} not to be partially set when
raising @ref{198,,TypeError}.

@item 
gh-118465@footnote{https://github.com/python/cpython/issues/118465}: Compiler populates the new @code{__firstlineno__} field on a class
with the line number of the first line of the class definition.

@item 
gh-118492@footnote{https://github.com/python/cpython/issues/118492}: Fix an issue where the type cache can expose a previously
accessed attribute when a finalizer is run.

@item 
gh-117714@footnote{https://github.com/python/cpython/issues/117714}: update @code{async_generator.athrow().close()} and
@code{async_generator.asend().close()} to close their section of the
underlying async generator

@item 
gh-111201@footnote{https://github.com/python/cpython/issues/111201}: The @ref{1b5,,interactive} interpreter is now implemented in
Python, which allows for a number of new features like colors, multiline
input, history viewing, and paste mode. Contributed by Pablo Galindo,
Łukasz Langa and Lysandros Nikolaou based on code from the PyPy project.

@item 
gh-74929@footnote{https://github.com/python/cpython/issues/74929}: Implement PEP 667: converted @ref{4a6,,FrameType.f_locals} and @ref{65f,,PyFrame_GetLocals()} to return a
write-through proxy object when the frame refers to a function or
comprehension.

@item 
gh-116767@footnote{https://github.com/python/cpython/issues/116767}: Fix crash in compiler on ‘async with’ that has many context
managers.

@item 
gh-118335@footnote{https://github.com/python/cpython/issues/118335}: Change how to use the tier 2 interpreter. Instead of running
Python with @code{-X uops} or setting the environment variable
@code{PYTHON_UOPS=1}, this choice is now made at build time by configuring
with @code{--enable-experimental-jit=interpreter}.

`Beware!' This changes the environment variable to enable or disable
micro-ops to @code{PYTHON_JIT}. The old @code{PYTHON_UOPS} is no longer used.

@item 
gh-118306@footnote{https://github.com/python/cpython/issues/118306}: Update JIT compilation to use LLVM 18

@item 
gh-118160@footnote{https://github.com/python/cpython/issues/118160}: @ref{4ac,,Annotation scopes} within classes can
now contain comprehensions. However, such comprehensions are not inlined
into their parent scope at runtime. Patch by Jelle Zijlstra.

@item 
gh-118272@footnote{https://github.com/python/cpython/issues/118272}: Fix bug where @code{generator.close} does not free the generator
frame’s locals.

@item 
gh-118216@footnote{https://github.com/python/cpython/issues/118216}: Don’t consider @ref{0,,__future__} imports with dots before the
module name.

@item 
gh-118074@footnote{https://github.com/python/cpython/issues/118074}: Make sure that the Executor objects in the COLD_EXITS array
aren’t assumed to be GC-able (which would access bytes outside the
object).

@item 
gh-107674@footnote{https://github.com/python/cpython/issues/107674}: Lazy load frame line number to improve performance of tracing

@item 
gh-118082@footnote{https://github.com/python/cpython/issues/118082}: Improve @ref{18e,,SyntaxError} message for imports without names,
like in @code{from x import} and @code{import} cases. It now points out to users
that @ref{7f7,,import} expects at least one name after it.

@item 
gh-118090@footnote{https://github.com/python/cpython/issues/118090}: Improve @ref{18e,,SyntaxError} message for empty type param
brackets.

@item 
gh-117958@footnote{https://github.com/python/cpython/issues/117958}: Added a @code{get_jit_code()} method to access JIT compiled
machine code from the UOp Executor when the experimental JIT is enabled.
Patch by Anthony Shaw.

@item 
gh-117901@footnote{https://github.com/python/cpython/issues/117901}: Add option for compiler’s codegen to save nested instruction
sequences for introspection.

@item 
gh-116622@footnote{https://github.com/python/cpython/issues/116622}: Redirect stdout and stderr to system log when embedded in an
Android app.

@item 
gh-109118@footnote{https://github.com/python/cpython/issues/109118}: @ref{4ac,,annotation scope} within class scopes
can now contain lambdas.

@item 
gh-117894@footnote{https://github.com/python/cpython/issues/117894}: Prevent @code{agen.aclose()} objects being re-used after
@code{.throw()}.

@item 
gh-117881@footnote{https://github.com/python/cpython/issues/117881}: prevent concurrent access to an async generator via
athrow().throw() or asend().throw()

@item 
gh-117536@footnote{https://github.com/python/cpython/issues/117536}: Fix a @ref{4d8,,RuntimeWarning} when calling
@code{agen.aclose().throw(Exception)}.

@item 
gh-117755@footnote{https://github.com/python/cpython/issues/117755}: Fix mimalloc allocator for huge memory allocation (around
8,589,934,592 GiB) on s390x. Patch by Victor Stinner.

@item 
gh-117750@footnote{https://github.com/python/cpython/issues/117750}: Fix issue where an object’s dict would get out of sync with the
object’s internal values when being cleared. @code{obj.__dict__.clear()} now
clears the internal values, but leaves the dict attached to the object.

@item 
gh-117431@footnote{https://github.com/python/cpython/issues/117431}: Improve the performance of the following @ref{192,,bytes} and
@ref{344,,bytearray} methods by adapting them to the
@ref{199f,,METH_FASTCALL} calling convention:


@itemize *

@item 
@code{count()}

@item 
@code{find()}

@item 
@code{index()}

@item 
@code{rfind()}

@item 
@code{rindex()}
@end itemize

@item 
gh-117709@footnote{https://github.com/python/cpython/issues/117709}: Speed up calls to @ref{169,,str()} with positional-only argument, by
using the 
@geindex Python 향상 제안; PEP 590
PEP 590@footnote{https://peps.python.org/pep-0590/} @code{vectorcall} calling convention. Patch by Erlend
Aasland.

@item 
gh-117680@footnote{https://github.com/python/cpython/issues/117680}: Give @code{_PyInstructionSequence} a Python interface and use it
in tests.

@item 
gh-115776@footnote{https://github.com/python/cpython/issues/115776}: Statically allocated objects are, by definition, immortal so
must be marked as such regardless of whether they are in extension modules
or not.

@item 
gh-117385@footnote{https://github.com/python/cpython/issues/117385}: Remove unhandled @code{PY_MONITORING_EVENT_BRANCH} and
@code{PY_MONITORING_EVENT_EXCEPTION_HANDLED} events from
@ref{2e1,,sys.settrace()}.

@item 
gh-116322@footnote{https://github.com/python/cpython/issues/116322}: Extension modules may indicate to the runtime that they can run
without the GIL. Multi-phase init modules do so by calling providing
@code{Py_MOD_GIL_NOT_USED} for the @code{Py_mod_gil} slot, while single-phase
init modules call @code{PyUnstable_Module_SetGIL(mod, Py_MOD_GIL_NOT_USED)}
from their init function.

@item 
gh-116129@footnote{https://github.com/python/cpython/issues/116129}: Implement 
@geindex Python 향상 제안; PEP 696
PEP 696@footnote{https://peps.python.org/pep-0696/}, adding support for defaults on type
parameters. Patch by Jelle Zijlstra.

@item 
gh-93502@footnote{https://github.com/python/cpython/issues/93502}: Add two new functions to the C-API,
@ref{60e,,PyRefTracer_SetTracer()} and @ref{60f,,PyRefTracer_GetTracer()}, that
allows to track object creation and destruction the same way the
@ref{105,,tracemalloc} module does. Patch by Pablo Galindo

@item 
gh-107674@footnote{https://github.com/python/cpython/issues/107674}: Improved the performance of @ref{2e1,,sys.settrace()} significantly

@item 
gh-95754@footnote{https://github.com/python/cpython/issues/95754}: Improve the error message when a script shadowing a module from
the standard library causes @ref{5ee,,AttributeError} to be raised. Similarly,
improve the error message when a script shadowing a third party module
attempts to access an attribute from that third party module while still
initialising.

@item 
gh-99180@footnote{https://github.com/python/cpython/issues/99180}: Elide uninformative traceback indicators in @code{return} and
simple @code{assignment} statements. Patch by Pablo Galindo.

@item 
gh-105879@footnote{https://github.com/python/cpython/issues/105879}: Allow the `globals' and `locals' arguments to @ref{4a3,,exec()} and
@ref{4a4,,eval()} to be passed as keywords.
@end itemize

@node Library<55>,Documentation<15>,Core and Builtins<50>,Python 3 13 0 beta 1
@anchor{whatsnew/changelog id215}@anchor{19a0}
@subsubsection Library



@itemize -

@item 
gh-118418@footnote{https://github.com/python/cpython/issues/118418}: A @ref{1a3,,DeprecationWarning} is now emitted if you fail to pass
a value to the new `type_params' parameter of @code{typing._eval_type()} or
@code{typing.ForwardRef._evaluate()}. (Using either of these private and
undocumented functions is discouraged to begin with, but failing to pass a
value to the @code{type_params} parameter may lead to incorrect behaviour on
Python 3.12 or newer.)

@item 
gh-118660@footnote{https://github.com/python/cpython/issues/118660}: Add an optional second type parameter to
@ref{e8a,,typing.ContextManager} and @ref{19a1,,typing.AsyncContextManager},
representing the return types of @ref{1505,,__exit__()} and
@ref{19a2,,__aexit__()} respectively. This parameter defaults to @code{bool
| None}.

@item 
gh-118650@footnote{https://github.com/python/cpython/issues/118650}: The @code{enum} module allows method named @code{_repr_*} to be
defined on @code{Enum} types.

@item 
gh-118648@footnote{https://github.com/python/cpython/issues/118648}: Add type parameter defaults to @ref{19a3,,typing.Generator} and
@ref{19a4,,typing.AsyncGenerator}.

@item 
gh-101137@footnote{https://github.com/python/cpython/issues/101137}: Mime type @code{text/x-rst} is now supported by @ref{93,,mimetypes}.

@item 
gh-118164@footnote{https://github.com/python/cpython/issues/118164}: The Python implementation of the @code{decimal} module could
appear to hang in relatively small power cases (like @code{2**117}) if
context precision was set to a very high value. A different method to
check for exactly representable results is used now that doesn’t rely on
computing @code{10**precision} (which could be effectively too large to
compute).

@item 
gh-111744@footnote{https://github.com/python/cpython/issues/111744}: @code{breakpoint()} and @code{pdb.set_trace()} now enter the debugger
immediately after the call rather than before the next line is executed.

@item 
gh-118500@footnote{https://github.com/python/cpython/issues/118500}: Add @ref{aa,,pdb} support for zipapps

@item 
gh-118406@footnote{https://github.com/python/cpython/issues/118406}: Add signature for @ref{54c,,sqlite3.Connection} objects.

@item 
gh-101732@footnote{https://github.com/python/cpython/issues/101732}: Use a Y2038 compatible openssl time function when available.

@item 
gh-118404@footnote{https://github.com/python/cpython/issues/118404}: Fix @ref{22f,,inspect.signature()} for non-comparable callables.

@item 
gh-118402@footnote{https://github.com/python/cpython/issues/118402}: Fix @ref{22f,,inspect.signature()} for the result of the
@ref{13df,,functools.cmp_to_key()} call.

@item 
gh-116622@footnote{https://github.com/python/cpython/issues/116622}: On Android, @ref{1447,,sysconfig.get_platform} now returns the
format specified by 
@geindex Python 향상 제안; PEP 738
PEP 738@footnote{https://peps.python.org/pep-0738/}.

@item 
gh-118285@footnote{https://github.com/python/cpython/issues/118285}: Allow to specify the signature of custom callable instances of
extension type by the @code{__text_signature__} attribute. Specify signatures
of @ref{1032,,operator.attrgetter}, @ref{c56,,operator.itemgetter}, and
@ref{1033,,operator.methodcaller} instances.

@item 
gh-118314@footnote{https://github.com/python/cpython/issues/118314}: Fix an edge case in @ref{1762,,binascii.a2b_base64()} strict mode,
where excessive padding is not detected when no padding is necessary.

@item 
gh-118271@footnote{https://github.com/python/cpython/issues/118271}: Add the @code{PhotoImage} methods @code{read()} to read an
image from a file and @code{data()} to get the image data. Add
`background' and `grayscale' parameters to @code{PhotoImage} method
@code{write()}.

@item 
gh-118225@footnote{https://github.com/python/cpython/issues/118225}: Add the @code{PhotoImage} method @code{copy_replace()} to
copy a region from one image to other image, possibly with pixel zooming
and/or subsampling. Add `from_coords' parameter to @code{PhotoImage}
methods @code{copy()}, @code{zoom()} and @code{subsample()}. Add `zoom'
and `subsample' parameters to @code{PhotoImage} method @code{copy()}.

@item 
gh-118221@footnote{https://github.com/python/cpython/issues/118221}: Fix a bug where @ref{54f,,sqlite3.Connection.iterdump()} could fail
if a custom @ref{19a5,,row factory} was used.
Patch by Erlend Aasland.

@item 
gh-118013@footnote{https://github.com/python/cpython/issues/118013}: Fix regression introduced in gh-103193@footnote{https://github.com/python/cpython/issues/103193} that meant that calling
@ref{6bb,,inspect.getattr_static()} on an instance would cause a strong
reference to that instance’s class to persist in an internal cache in the
@ref{82,,inspect} module. This caused unexpected memory consumption if the
class was dynamically created, the class held strong references to other
objects which took up a significant amount of memory, and the cache
contained the sole strong reference to the class. The fix for the
regression leads to a slowdown in @code{getattr_static()}, but the
function should still be significantly faster than it was in Python 3.11.
Patch by Alex Waygood.

@item 
gh-118218@footnote{https://github.com/python/cpython/issues/118218}: Speed up @ref{a16,,itertools.pairwise()} in the common case by up to
1.8x.

@item 
gh-117486@footnote{https://github.com/python/cpython/issues/117486}: Improve the behavior of user-defined subclasses of
@ref{4c5,,ast.AST}. Such classes will now require no changes in the usual
case to conform with the behavior changes of the @ref{9,,ast} module in
Python 3.13. Patch by Jelle Zijlstra.

@item 
gh-90848@footnote{https://github.com/python/cpython/issues/90848}: Fixed @ref{1935,,unittest.mock.create_autospec()} to configure parent
mock with keyword arguments.

@item 
gh-118168@footnote{https://github.com/python/cpython/issues/118168}: Fix incorrect argument substitution when @ref{19a6,,typing.Unpack}
is used with the builtin @ref{610,,tuple}. @code{typing.Unpack} now raises
@ref{198,,TypeError} when used with certain invalid types. Patch by Jelle
Zijlstra.

@item 
gh-118131@footnote{https://github.com/python/cpython/issues/118131}: Add command-line interface for the @ref{bd,,random} module. Patch
by Hugo van Kemenade.

@item 
gh-118107@footnote{https://github.com/python/cpython/issues/118107}: Fix @ref{138,,zipimport} reading of ZIP64 files with file entries
that are too big or offset too far.

@item 
gh-102511@footnote{https://github.com/python/cpython/issues/102511}: Fix @ref{151e,,os.path.normpath()} for UNC paths on Windows. Speed up
@ref{6ca,,os.path.splitroot()} with a native implementation.

@item 
gh-117535@footnote{https://github.com/python/cpython/issues/117535}: Change the unknown filename of @ref{118,,warnings} from @code{sys} to
@code{<sys>} to clarify that it’s not a real filename.

@item 
gh-114053@footnote{https://github.com/python/cpython/issues/114053}: Fix erroneous @ref{452,,NameError} when calling
@ref{8bf,,typing.get_type_hints()} on a class that made use of 
@geindex Python 향상 제안; PEP 695
PEP 695@footnote{https://peps.python.org/pep-0695/} type
parameters in a module that had @code{from __future__ import annotations} at
the top of the file. Patch by Alex Waygood.

@item 
gh-116931@footnote{https://github.com/python/cpython/issues/116931}: Add parameter `fileobj' check for
@ref{19a7,,tarfile.TarFile.addfile()}

@item 
gh-117995@footnote{https://github.com/python/cpython/issues/117995}: Don’t raise @ref{1a3,,DeprecationWarning} when a @ref{715,,sequence}
of parameters is used to bind indexed, nameless placeholders. See also
gh-100668@footnote{https://github.com/python/cpython/issues/100668}.

@item 
gh-80361@footnote{https://github.com/python/cpython/issues/80361}: Fix TypeError in @ref{13d2,,email.message.Message.get_payload()} when
the charset is 
@geindex RFC; RFC 2231
RFC 2231@footnote{https://datatracker.ietf.org/doc/html/rfc2231.html} encoded.

@item 
gh-86650@footnote{https://github.com/python/cpython/issues/86650}: Fix IndexError when parse some emails with invalid Message-ID
(including one-off addresses generated by Microsoft Outlook).

@item 
gh-117691@footnote{https://github.com/python/cpython/issues/117691}: Improve the error messages emitted by @ref{e4,,tarfile}
deprecation warnings relating to PEP 706. If a @code{filter} argument is not
provided to @code{extract()} or @code{extractall}, the deprecation warning now
points to the line in the user’s code where the relevant function was
called. Patch by Alex Waygood.

@item 
gh-115874@footnote{https://github.com/python/cpython/issues/115874}: Fixed a possible segfault during garbage collection of
@code{_asyncio.FutureIter} objects. Patch by Savannah Ostrowski.

@item 
gh-115060@footnote{https://github.com/python/cpython/issues/115060}: Speed up @ref{537,,pathlib.Path.glob()} by omitting an initial
@ref{53a,,is_dir()} call. As a result of this change,
@code{glob()} can no longer raise @ref{2c0,,OSError}.

@item 
gh-77102@footnote{https://github.com/python/cpython/issues/77102}: @ref{cc,,site} module now parses @code{.pth} file with UTF-8 first,
and @ref{54a,,locale encoding} if @code{UnicodeDecodeError} happened. It
supported only locale encoding before.

@item 
gh-76785@footnote{https://github.com/python/cpython/issues/76785}: We’ve exposed the low-level @code{_interpreters} module for the
sake of the PyPI implementation of 
@geindex Python 향상 제안; PEP 734
PEP 734@footnote{https://peps.python.org/pep-0734/}.  It was sometimes available
as the @code{_xxsubinterpreters} module and was formerly used only for
testing. For the most part, it should be considered an internal module,
like @code{_thread} and @code{_imp}. See
@indicateurl{https://discuss.python.org/t/pep-734-multiple-interpreters-in-the-stdlib/41147/26}.

@item 
gh-115060@footnote{https://github.com/python/cpython/issues/115060}: Speed up @ref{537,,pathlib.Path.glob()} by not scanning directories
for non-wildcard pattern segments.

@item 
gh-117727@footnote{https://github.com/python/cpython/issues/117727}: Speed up @ref{26e,,pathlib.Path.iterdir()} by using
@ref{c53,,os.scandir()} internally.

@item 
gh-117586@footnote{https://github.com/python/cpython/issues/117586}: Speed up @ref{6ce,,pathlib.Path.walk()} by working with strings
internally.

@item 
gh-117722@footnote{https://github.com/python/cpython/issues/117722}: Change the new multi-separator support in
@ref{4d1,,asyncio.StreamReader.readuntil()} to only accept tuples of separators
rather than arbitrary iterables.

@item 
gh-117692@footnote{https://github.com/python/cpython/issues/117692}: Fixes a bug when @ref{19a8,,doctest.DocTestFinder} was failing on
wrapped @code{builtin_function_or_method}.

@item 
gh-117348@footnote{https://github.com/python/cpython/issues/117348}: Largely restored import time performance of configparser by
avoiding dataclasses.

@item 
gh-117641@footnote{https://github.com/python/cpython/issues/117641}: Speedup @ref{103c,,os.path.commonpath()} on Unix.

@item 
gh-117663@footnote{https://github.com/python/cpython/issues/117663}: Fix @code{_simple_enum} to detect aliases when multiple arguments
are present but only one is the member value.

@item 
gh-117636@footnote{https://github.com/python/cpython/issues/117636}: Speedup @ref{19a9,,os.path.join()}.

@item 
gh-117618@footnote{https://github.com/python/cpython/issues/117618}: Support @code{package.module} as @code{filename} for @code{break}
command of @ref{aa,,pdb}

@item 
gh-102247@footnote{https://github.com/python/cpython/issues/102247}: the status codes enum with constants in http.HTTPStatus are
updated to include the names from RFC9110. This RFC includes some HTTP
statuses previously only used for WEBDAV and assigns more generic names to
them.

The old constants are preserved for backwards compatibility.

@item 
gh-117607@footnote{https://github.com/python/cpython/issues/117607}: Speedup @ref{6d0,,os.path.relpath()}.

@item 
gh-117586@footnote{https://github.com/python/cpython/issues/117586}: Speed up @ref{537,,pathlib.Path.glob()} by working with strings
internally.

@item 
gh-117225@footnote{https://github.com/python/cpython/issues/117225}: Add colour to doctest output. Patch by Hugo van Kemenade.

@item 
gh-117566@footnote{https://github.com/python/cpython/issues/117566}: @ref{19aa,,ipaddress.IPv6Address.is_loopback()} will now return
@code{True} for IPv4-mapped loopback addresses, i.e. addresses in the
@code{::ffff:127.0.0.0/104} address space.

@item 
gh-117546@footnote{https://github.com/python/cpython/issues/117546}: Fix issue where @ref{262,,os.path.realpath()} stopped resolving
symlinks after encountering a symlink loop on POSIX.

@item 
gh-116720@footnote{https://github.com/python/cpython/issues/116720}: Improved behavior of @ref{4d2,,asyncio.TaskGroup} when an
external cancellation collides with an internal cancellation. For example,
when two task groups are nested and both experience an exception in a
child task simultaneously, it was possible that the outer task group would
misbehave, because its internal cancellation was swallowed by the inner
task group.

In the case where a task group is cancelled externally and also must raise
an @ref{4d3,,ExceptionGroup}, it will now call the parent task’s
@ref{4d4,,cancel()} method. This ensures that a
@ref{4d5,,asyncio.CancelledError} will be raised at the next @ref{18d,,await},
so the cancellation is not lost.

An added benefit of these changes is that task groups now preserve the
cancellation count (@ref{4d6,,asyncio.Task.cancelling()}).

In order to handle some corner cases, @ref{4d7,,asyncio.Task.uncancel()} may
now reset the undocumented @code{_must_cancel} flag when the cancellation
count reaches zero.

@item 
gh-117516@footnote{https://github.com/python/cpython/issues/117516}: Add @ref{48c,,typing.TypeIs}, implementing 
@geindex Python 향상 제안; PEP 742
PEP 742@footnote{https://peps.python.org/pep-0742/}. Patch by
Jelle Zijlstra.

@item 
gh-117503@footnote{https://github.com/python/cpython/issues/117503}: Fix support of non-ASCII user names in bytes paths in
@ref{c08,,os.path.expanduser()} on Posix.

@item 
gh-117394@footnote{https://github.com/python/cpython/issues/117394}: @ref{c06,,os.path.ismount()} is now 2-3 times faster if the user has
permissions.

@item 
gh-117313@footnote{https://github.com/python/cpython/issues/117313}: Only treat @code{'\n'}, @code{'\r'} and @code{'\r\n'} as line separators
in re-folding the @ref{3f,,email} messages. Preserve control characters
@code{'\v'}, @code{'\f'}, @code{'\x1c'}, @code{'\x1d'} and @code{'\x1e'} and Unicode line
separators @code{'\x85'}, @code{'\u2028'} and @code{'\u2029'} as is.

@item 
gh-117142@footnote{https://github.com/python/cpython/issues/117142}: Convert @code{_ctypes} to multi-phase initialisation
(
@geindex Python 향상 제안; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}).

@item 
gh-66543@footnote{https://github.com/python/cpython/issues/66543}: Add the @ref{515,,mimetypes.guess_file_type()} function which works
with file path. Passing file path instead of URL in
@ref{516,,guess_type()} is @ref{23d,,soft deprecated}.

@item 
gh-68583@footnote{https://github.com/python/cpython/issues/68583}: webbrowser CLI: replace getopt with argparse, add long options.
Patch by Hugo van Kemenade.

@item 
gh-116871@footnote{https://github.com/python/cpython/issues/116871}: Name suggestions for @ref{5ee,,AttributeError} and
@ref{659,,ImportError} now only include underscored names if the original name
was underscored.

@item 
gh-116023@footnote{https://github.com/python/cpython/issues/116023}: Don’t show empty fields (value @code{None} or @code{[]}) in
@ref{ae1,,ast.dump()} by default. Add @code{show_empty=False} parameter to
optionally show them.

@item 
gh-115961@footnote{https://github.com/python/cpython/issues/115961}: Added @code{name} and @code{mode} attributes for compressed
and archived file-like objects in modules @ref{14,,bz2}, @ref{8e,,lzma},
@ref{e4,,tarfile} and @ref{137,,zipfile}. The value of the @code{mode}
attribute of @ref{65a,,gzip.GzipFile} was changed from integer (@code{1} or
@code{2}) to string (@code{'rb'} or @code{'wb'}). The value of the @code{mode}
attribute of the readable file-like object returned by
@ref{65b,,zipfile.ZipFile.open()} was changed from @code{'r'} to @code{'rb'}.

@item 
gh-82062@footnote{https://github.com/python/cpython/issues/82062}: Fix @ref{22f,,inspect.signature()} to correctly handle parameter
defaults on methods in extension modules that use names defined in the
module namespace.

@item 
gh-83856@footnote{https://github.com/python/cpython/issues/83856}: Honor @ref{d,,atexit} for all @ref{98,,multiprocessing} start methods

@item 
gh-113081@footnote{https://github.com/python/cpython/issues/113081}: Print colorized exception just like built-in traceback in
@ref{aa,,pdb}

@item 
gh-112855@footnote{https://github.com/python/cpython/issues/112855}: Speed up pickling of @ref{6cc,,pathlib.PurePath} objects. Patch
by Barney Gale.

@item 
gh-111744@footnote{https://github.com/python/cpython/issues/111744}: Support opcode events in @ref{10,,bdb}

@item 
gh-109617@footnote{https://github.com/python/cpython/issues/109617}: @code{ncurses}: fixed a crash that could occur on macOS 13 or
earlier when Python was built with Apple Xcode 15’s SDK.

@item 
gh-83151@footnote{https://github.com/python/cpython/issues/83151}: Enabled arbitrary statements and evaluations in @ref{aa,,pdb} shell
to access the local variables of the current frame, which made it possible
for multi-scope code like generators or nested function to work.

@item 
gh-110209@footnote{https://github.com/python/cpython/issues/110209}: Add @ref{942,,__class_getitem__()} to
@ref{19ab,,types.GeneratorType} and @ref{1088,,types.CoroutineType} for type
hinting purposes. Patch by James Hilton-Balfe.

@item 
gh-108191@footnote{https://github.com/python/cpython/issues/108191}: The @ref{4e5,,types.SimpleNamespace} now accepts an optional
positional argument which specifies initial values of attributes as a dict
or an iterable of key-value pairs.

@item 
gh-62090@footnote{https://github.com/python/cpython/issues/62090}: Fix assertion errors caused by whitespace in metavars or
@code{SUPPRESS}-ed groups in @ref{7,,argparse} by simplifying usage formatting.
Patch by Ali Hamdan.

@item 
gh-102402@footnote{https://github.com/python/cpython/issues/102402}: Adjust @code{logging.LogRecord} to use @code{time.time_ns()} and fix
minor bug related to floating-point math.

@item 
gh-100242@footnote{https://github.com/python/cpython/issues/100242}: Bring pure Python implementation @code{functools.partial.__new__}
more in line with the C-implementation by not just always checking for the
presence of the attribute @code{'func'} on the first argument of @code{partial}.
Instead, both the Python version and the C version perform an
@code{isinstance(func, partial)} check on the first argument of @code{partial}.

@item 
gh-99730@footnote{https://github.com/python/cpython/issues/99730}: HEAD requests are no longer upgraded to GET request during
redirects in urllib.

@item 
gh-66410@footnote{https://github.com/python/cpython/issues/66410}: Setting the @code{tkinter} module global @code{wantobjects}
to @code{2} before creating the @ref{19ac,,Tk} object or call the
@code{wantobjects()} method of the @code{Tk} object with argument @code{2}
makes now arguments to callbacks registered in the @ref{f6,,tkinter} module
to be passed as various Python objects (@code{int}, @code{float}, @code{bytes},
@code{tuple}), depending on their internal representation in Tcl, instead of
always @code{str}. @code{tkinter.wantobjects} is now set to @code{2} by
default.

@item 
bpo-40943@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40943}: Fix several IndexError when parse emails with truncated
Message-ID, address, routes, etc, e.g. @code{example@@}.

@item 
bpo-39324@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39324}: Add mime type mapping for .md <-> text/markdown

@item 
bpo-18108@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18108}: @ref{548,,shutil.chown()} now supports `dir_fd' and
`follow_symlinks' keyword arguments.

@item 
bpo-30988@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30988}: Fix parsing of emails with invalid address headers having a
leading or trailing dot. Patch by tsufeki.

@item 
bpo-32839@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32839}: Add the @code{after_info()} method for Tkinter widgets.
@end itemize

@node Documentation<15>,Build<17>,Library<55>,Python 3 13 0 beta 1
@anchor{whatsnew/changelog id216}@anchor{19ad}
@subsubsection Documentation



@itemize -

@item 
gh-117928@footnote{https://github.com/python/cpython/issues/117928}: The minimum Sphinx version required for the documentation is
now 6.2.1.
@end itemize

@node Build<17>,Windows<15>,Documentation<15>,Python 3 13 0 beta 1
@anchor{whatsnew/changelog id217}@anchor{19ae}
@subsubsection Build



@itemize -

@item 
gh-118734@footnote{https://github.com/python/cpython/issues/118734}: Fixes Windows build when invoked directly (not through the
@code{build.bat} script) without specifying a value for @code{UseTIER2}.

@item 
gh-115119@footnote{https://github.com/python/cpython/issues/115119}: The @code{configure} option @ref{655,,--with-system-libmpdec}
now defaults to @code{yes}. The bundled copy of @code{libmpdecimal} will be
removed in Python 3.15.

@item 
gh-117845@footnote{https://github.com/python/cpython/issues/117845}: Fix building against recent libedit versions by detecting
readline hook signatures in @code{configure}.

@item 
gh-116622@footnote{https://github.com/python/cpython/issues/116622}: A testbed project was added to run the test suite on Android.

@item 
gh-117645@footnote{https://github.com/python/cpython/issues/117645}: Increase WASI stack size from 512 KiB to 8 MiB and the initial
memory from 10 MiB to 20 MiB. Patch by Victor Stinner.

@item 
gh-115119@footnote{https://github.com/python/cpython/issues/115119}: @code{configure} now uses @code{pkg-config} to detect
@ref{3a,,decimal} dependencies if the @ref{655,,--with-system-libmpdec} option
is given.
@end itemize

@node Windows<15>,macOS<9>,Build<17>,Python 3 13 0 beta 1
@anchor{whatsnew/changelog id218}@anchor{19af}
@subsubsection Windows



@itemize -

@item 
gh-115119@footnote{https://github.com/python/cpython/issues/115119}: Update Windows installer to use libmpdecimal 4.0.0.

@item 
gh-118486@footnote{https://github.com/python/cpython/issues/118486}: @ref{52b,,os.mkdir()} now accepts `mode' of @code{0o700} to restrict
the new directory to the current user.

@item 
gh-118347@footnote{https://github.com/python/cpython/issues/118347}: Fixes launcher updates not being installed.

@item 
gh-118293@footnote{https://github.com/python/cpython/issues/118293}: The @code{multiprocessing} module now passes the
@code{STARTF_FORCEOFFFEEDBACK} flag when spawning processes to tell Windows
not to change the mouse cursor.

@item 
gh-115009@footnote{https://github.com/python/cpython/issues/115009}: Update Windows installer to use SQLite 3.45.3.

@item 
gh-90329@footnote{https://github.com/python/cpython/issues/90329}: Suppress the warning displayed on virtual environment creation
when the requested and created paths differ only by a short (8.3 style)
name. Warnings will continue to be shown if a junction or symlink in the
path caused the venv to be created in a different location than originally
requested.

@item 
gh-117786@footnote{https://github.com/python/cpython/issues/117786}: Fixes virtual environments not correctly launching when created
from a Store install.
@end itemize

@node macOS<9>,IDLE<8>,Windows<15>,Python 3 13 0 beta 1
@anchor{whatsnew/changelog id219}@anchor{19b0}
@subsubsection macOS



@itemize -

@item 
gh-115119@footnote{https://github.com/python/cpython/issues/115119}: Update macOS installer to use libmpdecimal 4.0.0.

@item 
gh-114099@footnote{https://github.com/python/cpython/issues/114099}: iOS preprocessor symbol usage was made compatible with older
macOS SDKs.

@item 
gh-115009@footnote{https://github.com/python/cpython/issues/115009}: Update macOS installer to use SQLite 3.45.3.

@item 
gh-91629@footnote{https://github.com/python/cpython/issues/91629}: Use @code{~/.config/fish/conf.d} configs and
@code{fish_add_path} to set 
@geindex PATH
@geindex 환경 변수; PATH
@code{PATH} when installing for the
Fish shell.
@end itemize

@node IDLE<8>,C API<17>,macOS<9>,Python 3 13 0 beta 1
@anchor{whatsnew/changelog id220}@anchor{19b1}
@subsubsection IDLE



@itemize -

@item 
bpo-34774@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34774}: Use user-selected color theme for Help => IDLE Doc.
@end itemize

@node C API<17>,,IDLE<8>,Python 3 13 0 beta 1
@anchor{whatsnew/changelog id221}@anchor{19b2}
@subsubsection C API



@itemize -

@item 
gh-118124@footnote{https://github.com/python/cpython/issues/118124}: Fix @ref{19b3,,Py_BUILD_ASSERT} and
@ref{19b4,,Py_BUILD_ASSERT_EXPR} for non-constant expressions: use
@code{static_assert()} on C11 and newer. Patch by Victor Stinner.

@item 
gh-110850@footnote{https://github.com/python/cpython/issues/110850}: Add “Raw” variant of PyTime functions


@itemize *

@item 
@ref{5d6,,PyTime_MonotonicRaw()}

@item 
@ref{5d8,,PyTime_PerfCounterRaw()}

@item 
@ref{5da,,PyTime_TimeRaw()}
@end itemize

Patch by Victor Stinner.

@item 
gh-117987@footnote{https://github.com/python/cpython/issues/117987}: Restore functions removed in Python 3.13 alpha 1:


@itemize *

@item 
@ref{19b5,,Py_SetPythonHome()}

@item 
@ref{19b6,,Py_SetProgramName()}

@item 
@ref{19b7,,PySys_SetArgvEx()}

@item 
@ref{19b8,,PySys_SetArgv()}
@end itemize

Patch by Victor Stinner.

@item 
gh-117929@footnote{https://github.com/python/cpython/issues/117929}: Restore removed @ref{19b9,,PyEval_InitThreads()} function. Patch by
Victor Stinner.

@item 
gh-117534@footnote{https://github.com/python/cpython/issues/117534}: Improve validation logic in the C implementation of
@ref{829,,datetime.datetime.fromisoformat()} to better handle invalid years.
Patch by Vlad Efanov.

@item 
gh-68114@footnote{https://github.com/python/cpython/issues/68114}: Fixed skipitem()’s handling of the old ‘w’ and ‘w#’ formatters.
These are no longer supported and now raise an exception if used.

@item 
gh-111997@footnote{https://github.com/python/cpython/issues/111997}: Add a C-API for firing monitoring events.
@end itemize

@node Python 3 13 0 alpha 6,Python 3 13 0 alpha 5,Python 3 13 0 beta 1,Changelog
@anchor{whatsnew/changelog python-3-13-0-alpha-6}@anchor{19ba}
@subsection Python 3.13.0 alpha 6


`Release date: 2024-04-09'

@menu
* Core and Builtins: Core and Builtins<51>. 
* Library: Library<56>. 
* Core and Builtins: Core and Builtins<52>. 
* Library: Library<57>. 
* Documentation: Documentation<16>. 
* Tests: Tests<15>. 
* Build: Build<18>. 
* Windows: Windows<16>. 
* C API: C API<18>. 

@end menu

@node Core and Builtins<51>,Library<56>,,Python 3 13 0 alpha 6
@anchor{whatsnew/changelog id222}@anchor{19bb}
@subsubsection Core and Builtins



@itemize -

@item 
gh-117494@footnote{https://github.com/python/cpython/issues/117494}: Refactored the instruction sequence data structure out of
compile.c into instruction_sequence.c.

@item 
gh-116968@footnote{https://github.com/python/cpython/issues/116968}: Introduce a unified 16-bit backoff counter type
(@code{_Py_BackoffCounter}), shared between the Tier 1 adaptive specializer
and the Tier 2 optimizer. The API used for adaptive specialization
counters is changed but the behavior is (supposed to be) identical.

The behavior of the Tier 2 counters is changed:


@itemize *

@item 
There are no longer dynamic thresholds (we never varied these).

@item 
All counters now use the same exponential backoff.

@item 
The counter for @code{JUMP_BACKWARD} starts counting down from 16.

@item 
The @code{temperature} in side exits starts counting down from 64.
@end itemize

@item 
gh-117431@footnote{https://github.com/python/cpython/issues/117431}: Improve the performance of the following @ref{192,,bytes} and
@ref{344,,bytearray} methods by adapting them to the
@ref{199f,,METH_FASTCALL} calling convention:


@itemize *

@item 
@code{endswith()}

@item 
@code{startswith()}
@end itemize

@item 
gh-117431@footnote{https://github.com/python/cpython/issues/117431}: Improve the performance of the following @ref{169,,str} methods
by adapting them to the @ref{199f,,METH_FASTCALL} calling convention:


@itemize *

@item 
@ref{1982,,count()}

@item 
@ref{10cb,,endswith()}

@item 
@ref{10a7,,find()}

@item 
@ref{19bc,,index()}

@item 
@ref{10a8,,rfind()}

@item 
@ref{145c,,rindex()}

@item 
@ref{10ca,,startswith()}
@end itemize

@item 
gh-117411@footnote{https://github.com/python/cpython/issues/117411}: Move @code{PyFutureFeatures} to an internal header and make it
private.

@item 
gh-109120@footnote{https://github.com/python/cpython/issues/109120}: Added handle of incorrect star expressions, e.g @code{f(3, *)}.
Patch by Grigoryev Semyon

@item 
gh-117266@footnote{https://github.com/python/cpython/issues/117266}: Fix crashes for certain user-created subclasses of
@ref{4c5,,ast.AST}. Such classes are now expected to set the
@code{_field_types} attribute.

@item 
gh-99108@footnote{https://github.com/python/cpython/issues/99108}: Updated the @ref{6c,,hashlib} built-in HACL* project@footnote{https://github.com/hacl-star/hacl-star} C code
from upstream that we use for many implementations when they are not
present via OpenSSL in a given build.  This also avoids the rare potential
for a C symbol name one definition rule linking issue.

@item 
gh-117108@footnote{https://github.com/python/cpython/issues/117108}: Change the old space bit of objects in the young generation
from 0 to gcstate->visited, so that any objects created during GC will
have the old bit set correctly if they get moved into the old generation.

@item 
gh-117108@footnote{https://github.com/python/cpython/issues/117108}: The cycle GC now chooses the size of increments based on the
total heap size, instead of the rate of object creation. This ensures that
it can keep up with growing heaps.

@item 
gh-116735@footnote{https://github.com/python/cpython/issues/116735}: For @code{INSTRUMENTED_CALL_FUNCTION_EX}, set @code{arg0} to
@code{sys.monitoring.MISSING} instead of @code{None} for
@ref{19bd,,CALL} event.

@item 
gh-113964@footnote{https://github.com/python/cpython/issues/113964}: Starting new threads and process creation through
@ref{4b6,,os.fork()} are now only prevented once all non-daemon threads exit.

@item 
gh-116626@footnote{https://github.com/python/cpython/issues/116626}: Ensure @code{INSTRUMENTED_CALL_FUNCTION_EX} always emits
@ref{19bd,,CALL}

@item 
gh-116554@footnote{https://github.com/python/cpython/issues/116554}: @code{list.sort()} now exploits more cases of partial ordering,
particularly those with long descending runs with sub-runs of equal
values. Those are recognized as single runs now (previously, each block of
repeated values caused a new run to be created).

@item 
gh-114099@footnote{https://github.com/python/cpython/issues/114099}: Added a Loader that can discover extension modules in an
iOS-style Frameworks folder.

@item 
gh-115775@footnote{https://github.com/python/cpython/issues/115775}: Compiler populates the new @code{__static_attributes__} field on a
class with the names of attributes of this class which are accessed
through self.X from any function in its body.

@item 
gh-115776@footnote{https://github.com/python/cpython/issues/115776}: The array of values, the @code{PyDictValues} struct is now
embedded in the object during allocation. This provides better performance
in the common case, and does not degrade as much when the object’s
@code{__dict__} is materialized.

@item 
gh-108362@footnote{https://github.com/python/cpython/issues/108362}: Implement an incremental cyclic garbage collector. By
collecting the old generation in increments, there is no need for a full
heap scan. This can hugely reduce maximum pause time for programs with
large heaps.

Reduce the number of generations from three to two. The old generation is
split into two spaces, “visited” and “pending”.

Collection happens in two steps:: * An increment is formed from the young
generation and a small part of the pending space. * This increment is
scanned and the survivors moved to the end of the visited space.

When the collecting space becomes empty, the two spaces are swapped.
@end itemize

@node Library<56>,Core and Builtins<52>,Core and Builtins<51>,Python 3 13 0 alpha 6
@anchor{whatsnew/changelog id223}@anchor{19be}
@subsubsection Library



@itemize -

@item 
gh-109870@footnote{https://github.com/python/cpython/issues/109870}: Dataclasses now calls @ref{4a3,,exec()} once per dataclass, instead
of once per method being added.  This can speed up dataclass creation by
up to 20%.

@item 
gh-97901@footnote{https://github.com/python/cpython/issues/97901}: Mime type @code{text/rtf} is now supported by @ref{93,,mimetypes}.
@end itemize

@node Core and Builtins<52>,Library<57>,Library<56>,Python 3 13 0 alpha 6
@anchor{whatsnew/changelog id224}@anchor{19bf}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-24612@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24612}: Improve the @ref{18e,,SyntaxError} that happens when ‘not’ appears
after an operator. Patch by Pablo Galindo
@end itemize

@node Library<57>,Documentation<16>,Core and Builtins<52>,Python 3 13 0 alpha 6
@anchor{whatsnew/changelog id225}@anchor{19c0}
@subsubsection Library



@itemize -

@item 
gh-117648@footnote{https://github.com/python/cpython/issues/117648}: Improve performance of @ref{19a9,,os.path.join()} and
@ref{c08,,os.path.expanduser()}.

@item 
gh-117584@footnote{https://github.com/python/cpython/issues/117584}: Raise @ref{198,,TypeError} for non-paths in
@ref{6d0,,posixpath.relpath}.

@item 
gh-117467@footnote{https://github.com/python/cpython/issues/117467}: Preserve mailbox ownership when rewriting in
@ref{19c1,,mailbox.mbox.flush}. Patch by Tony
Mountifield.

@item 
gh-114848@footnote{https://github.com/python/cpython/issues/114848}: Raise @ref{264,,FileNotFoundError} when @code{getcwd()} returns
‘(unreachable)’, which can happen on Linux >= 2.6.36 with glibc < 2.27.

@item 
gh-117459@footnote{https://github.com/python/cpython/issues/117459}: @code{asyncio.asyncio.run_coroutine_threadsafe()} now keeps the
traceback of @code{CancelledError}, @ref{a36,,TimeoutError} and
@code{InvalidStateError} which are raised in the coroutine.

@item 
gh-117381@footnote{https://github.com/python/cpython/issues/117381}: Fix error message for @code{ntpath.commonpath()}.

@item 
gh-117337@footnote{https://github.com/python/cpython/issues/117337}: Deprecate undocumented @code{glob.glob0()} and
@code{glob.glob1()} functions. Use @ref{59f,,glob.glob()} and pass a directory
to its `root_dir' argument instead.

@item 
gh-117349@footnote{https://github.com/python/cpython/issues/117349}: Optimise several functions in @ref{a6,,os.path}.

@item 
gh-117348@footnote{https://github.com/python/cpython/issues/117348}: Refactored @code{configparser.RawConfigParser._read()} to reduce
cyclometric complexity and improve comprehensibility.

@item 
gh-117335@footnote{https://github.com/python/cpython/issues/117335}: Raise TypeError for non-sequences for
@code{ntpath.commonpath()}.

@item 
gh-66449@footnote{https://github.com/python/cpython/issues/66449}: @ref{4de,,configparser.ConfigParser} now accepts unnamed sections
before named ones, if configured to do so.

@item 
gh-88014@footnote{https://github.com/python/cpython/issues/88014}: In documentation of @ref{65a,,gzip.GzipFile} in module gzip,
explain data type of optional constructor argument `mtime', and recommend
@code{mtime = 0} for generating deterministic streams.

@item 
gh-117310@footnote{https://github.com/python/cpython/issues/117310}: Fixed an unlikely early & extra @code{Py_DECREF} triggered crash
in @ref{d5,,ssl} when creating a new @code{_ssl._SSLContext} if CPython was
built implausibly such that the default cipher list is empty `or' the
SSL library it was linked against reports a failure from its C
@code{SSL_CTX_set_cipher_list()} API.

@item 
gh-117294@footnote{https://github.com/python/cpython/issues/117294}: A @code{DocTestCase} now reports as skipped if all examples in the
doctest are skipped.

@item 
gh-98966@footnote{https://github.com/python/cpython/issues/98966}: In @ref{dc,,subprocess}, raise a more informative message when
@code{stdout=STDOUT}.

@item 
gh-117225@footnote{https://github.com/python/cpython/issues/117225}: doctest: only print “and X failed” when non-zero, don’t
pluralise “1 items”. Patch by Hugo van Kemenade.

@item 
gh-117205@footnote{https://github.com/python/cpython/issues/117205}: Speed up @ref{d1a,,compileall.compile_dir()} by 20% when using
multiprocessing by increasing @code{chunksize}.

@item 
gh-117178@footnote{https://github.com/python/cpython/issues/117178}: Fix regression in lazy loading of self-referential modules,
introduced in gh-114781@footnote{https://github.com/python/cpython/issues/114781}.

@item 
gh-112383@footnote{https://github.com/python/cpython/issues/112383}: Fix @ref{3c,,dis} module’s handling of @code{ENTER_EXECUTOR}
instructions.

@item 
gh-117182@footnote{https://github.com/python/cpython/issues/117182}: Lazy-loading of modules that modify their own @code{__class__} no
longer reverts the @code{__class__} to @ref{1013,,types.ModuleType}.

@item 
gh-117084@footnote{https://github.com/python/cpython/issues/117084}: Fix @ref{137,,zipfile} extraction for directory entries with the
name containing backslashes on Windows.

@item 
gh-117114@footnote{https://github.com/python/cpython/issues/117114}: Make @ref{19c2,,os.path.isdevdrive()} available on all platforms. For
those that do not offer Dev Drives, it will always return @code{False}.

@item 
gh-117110@footnote{https://github.com/python/cpython/issues/117110}: Fix a bug that prevents subclasses of @ref{8ba,,typing.Any} to be
instantiated with arguments. Patch by Chris Fu.

@item 
gh-109653@footnote{https://github.com/python/cpython/issues/109653}: Deferred select imports in importlib.metadata and
importlib.resources for a 14% speedup.

@item 
gh-70647@footnote{https://github.com/python/cpython/issues/70647}: Start the deprecation period for the current behavior of
@ref{1951,,datetime.datetime.strptime()} and @ref{1632,,time.strptime()} which always
fails to parse a date string with a @ref{2ec,,ValueError} involving a day of
month such as @code{strptime("02-29", "%m-%d")} when a year is `not'
specified and the date happen to be February 29th.  This should help avoid
users finding new bugs every four years due to a natural mistaken
assumption about the API when parsing partial date values.

@item 
gh-116987@footnote{https://github.com/python/cpython/issues/116987}: Fixed @code{inspect.findsource()} for class code objects.

@item 
gh-114099@footnote{https://github.com/python/cpython/issues/114099}: Modify standard library to allow for iOS platform differences.

@item 
gh-90872@footnote{https://github.com/python/cpython/issues/90872}: On Windows, @ref{edf,,subprocess.Popen.wait()} no longer calls
@code{WaitForSingleObject()} with a negative timeout: pass @code{0} ms if the
timeout is negative. Patch by Victor Stinner.

@item 
gh-116957@footnote{https://github.com/python/cpython/issues/116957}: configparser: Don’t leave ConfigParser values in an invalid
state (stored as a list instead of a str) after an earlier read raised
DuplicateSectionError or DuplicateOptionError.

@item 
gh-115538@footnote{https://github.com/python/cpython/issues/115538}: @code{_io.WindowsConsoleIO} now emit a warning if a boolean
value is passed as a filedescriptor argument.

@item 
gh-90095@footnote{https://github.com/python/cpython/issues/90095}: Ignore empty lines and comments in @code{.pdbrc}

@item 
gh-106531@footnote{https://github.com/python/cpython/issues/106531}: Refreshed zipfile._path from zipp 3.18@footnote{https://zipp.readthedocs.io/en/latest/history.html#v3-18-0}, providing
better compatibility for PyPy, better glob performance for deeply nested
zipfiles, and providing internal access to @code{CompleteDirs.inject} for use
in other tests (like importlib.resources).

@item 
gh-63207@footnote{https://github.com/python/cpython/issues/63207}: On Windows, @ref{55c,,time.time()} now uses the
@code{GetSystemTimePreciseAsFileTime()} clock to have a resolution better
than 1 us, instead of the @code{GetSystemTimeAsFileTime()} clock which has a
resolution of 15.6 ms. Patch by Victor Stinner.

@item 
gh-116764@footnote{https://github.com/python/cpython/issues/116764}: Restore support of @code{None} and other false values in
@ref{110,,urllib.parse} functions @ref{31f,,parse_qs()} and
@ref{31e,,parse_qsl()}. Also, they now raise a TypeError for
non-zero integers and non-empty sequences.

@item 
gh-116811@footnote{https://github.com/python/cpython/issues/116811}: In @code{PathFinder.invalidate_caches}, delegate to
@code{MetadataPathFinder.invalidate_caches}.

@item 
gh-116647@footnote{https://github.com/python/cpython/issues/116647}: Fix recursive child in dataclasses

@item 
gh-113171@footnote{https://github.com/python/cpython/issues/113171}: Fixed various false positives and false negatives in


@itemize *

@item 
@ref{19c3,,ipaddress.IPv4Address.is_private} (see these docs for details)

@item 
@ref{115e,,ipaddress.IPv4Address.is_global}

@item 
@ref{19c4,,ipaddress.IPv6Address.is_private}

@item 
@ref{19c5,,ipaddress.IPv6Address.is_global}
@end itemize

Also in the corresponding @ref{50d,,ipaddress.IPv4Network} and
@ref{50e,,ipaddress.IPv6Network} attributes.

@item 
gh-63283@footnote{https://github.com/python/cpython/issues/63283}: In @ref{56,,encodings.idna}, any capitalization of the ACE prefix
(@code{xn--}) is now acceptable. Patch by Pepijn de Vos and Zackery Spytz.

@item 
gh-71042@footnote{https://github.com/python/cpython/issues/71042}: Add @ref{19c6,,platform.android_ver()}, which provides device and OS
information on Android.

@item 
gh-73468@footnote{https://github.com/python/cpython/issues/73468}: Added new @ref{513,,math.fma()} function, wrapping C99’s @code{fma()}
operation: fused multiply-add function. Patch by Mark Dickinson and Victor
Stinner.

@item 
gh-116608@footnote{https://github.com/python/cpython/issues/116608}: The @ref{7f,,importlib.resources} functions
@ref{4fc,,is_resource()},
@ref{4fd,,open_binary()},
@ref{4fe,,open_text()}, @ref{4ff,,path()},
@ref{500,,read_binary()}, and
@ref{501,,read_text()} are un-deprecated, and support
subdirectories via multiple positional arguments. The
@ref{502,,contents()} function also allows subdirectories,
but remains deprecated.

@item 
gh-116484@footnote{https://github.com/python/cpython/issues/116484}: Change automatically generated @code{tkinter.Checkbutton}
widget names to avoid collisions with automatically generated
@code{tkinter.ttk.Checkbutton} widget names within the same parent
widget.

@item 
gh-114314@footnote{https://github.com/python/cpython/issues/114314}: In @ref{2e,,ctypes}, ctype data is now stored in type objects
directly rather than in a dict subclass. This is an internal change that
should not affect usage.

@item 
gh-116401@footnote{https://github.com/python/cpython/issues/116401}: Fix blocking @ref{d51,,os.fwalk()} and @ref{356,,shutil.rmtree()} on
opening named pipe.

@item 
gh-71052@footnote{https://github.com/python/cpython/issues/71052}: Implement @ref{f44,,ctypes.util.find_library()} on Android.

@item 
gh-90535@footnote{https://github.com/python/cpython/issues/90535}: Fix support of `interval' values > 1 in
@code{logging.TimedRotatingFileHandler} for @code{when='MIDNIGHT'} and
@code{when='Wx'}.

@item 
gh-113308@footnote{https://github.com/python/cpython/issues/113308}: Remove some internal protected parts from @ref{116,,uuid}:
@code{_has_uuid_generate_time_safe}, @code{_netbios_getnode},
@code{_ipconfig_getnode}, and @code{_load_system_functions}. They were unused.

@item 
gh-115627@footnote{https://github.com/python/cpython/issues/115627}: Fix the @ref{d5,,ssl} module error handling of connection
terminate by peer. It now throws an OSError with the appropriate error
code instead of an EOFError.

@item 
gh-114847@footnote{https://github.com/python/cpython/issues/114847}: Speed up @ref{262,,os.path.realpath()} on non-Windows platforms.

@item 
gh-114271@footnote{https://github.com/python/cpython/issues/114271}: Fix a race in @code{threading.Thread.join()}.

@code{threading._MainThread} now always represents the main thread of the
main interpreter.

@code{PyThreadState.on_delete} and @code{PyThreadState.on_delete_data} have been
removed.

@item 
gh-113538@footnote{https://github.com/python/cpython/issues/113538}: Add @ref{4cf,,asyncio.Server.close_clients()} and
@ref{4d0,,asyncio.Server.abort_clients()} methods which allow to more
forcefully close an asyncio server.

@item 
gh-85287@footnote{https://github.com/python/cpython/issues/85287}: Changes Unicode codecs to return UnicodeEncodeError or
UnicodeDecodeError, rather than just UnicodeError.

@item 
gh-113548@footnote{https://github.com/python/cpython/issues/113548}: @ref{aa,,pdb} now allows CLI arguments to @code{pdb -m}.

@item 
gh-112948@footnote{https://github.com/python/cpython/issues/112948}: Make completion of @ref{aa,,pdb} similar to Python REPL

@item 
gh-105866@footnote{https://github.com/python/cpython/issues/105866}: Fixed @code{_get_slots} bug which caused error when defining
dataclasses with slots and a weakref_slot.

@item 
gh-96471@footnote{https://github.com/python/cpython/issues/96471}: Add @ref{c69,,asyncio.Queue} termination with
@ref{4cd,,shutdown()} method.

@item 
gh-89739@footnote{https://github.com/python/cpython/issues/89739}: The @ref{138,,zipimport} module can now read ZIP64 files.

@item 
bpo-33533@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33533}: @ref{4c7,,asyncio.as_completed()} now returns an object that is both
an asynchronous iterator and plain iterator. The new asynchronous
iteration pattern allows for easier correlation between prior tasks and
their completed results. This is a closer match to
@ref{19c7,,concurrent.futures.as_completed()}’s iteration pattern. Patch by
Justin Arthur.

@item 
bpo-27578@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27578}: @ref{17c9,,inspect.getsource()} (and related functions) work with
empty module files, returning @code{'\n'} (or reasonable equivalent) instead
of raising @code{OSError}. Patch by Kernc.

@item 
bpo-37141@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37141}: Accept an iterable of separators in
@ref{4d1,,asyncio.StreamReader.readuntil()}, stopping when one of them is
encountered.

@item 
gh-66543@footnote{https://github.com/python/cpython/issues/66543}: Make @ref{516,,mimetypes.guess_type()} properly parsing of URLs with
only a host name, URLs containing fragment or query, and filenames with
only a UNC sharepoint on Windows. Based on patch by Dong-hee Na.

@item 
bpo-15010@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15010}: @ref{11e4,,unittest.TestLoader.discover()} now saves the original
value of @code{unittest.TestLoader._top_level_dir} and restores it at the end
of the call.
@end itemize

@node Documentation<16>,Tests<15>,Library<57>,Python 3 13 0 alpha 6
@anchor{whatsnew/changelog id226}@anchor{19c8}
@subsubsection Documentation



@itemize -

@item 
gh-115977@footnote{https://github.com/python/cpython/issues/115977}: Remove compatibility references to Emscripten.

@item 
gh-114099@footnote{https://github.com/python/cpython/issues/114099}: Add an iOS platform guide, and flag modules not available on
iOS.

@item 
gh-91565@footnote{https://github.com/python/cpython/issues/91565}: Changes to documentation files and config outputs to reflect the
new location for reporting bugs - i.e. GitHub rather than bugs.python.org.
@end itemize

@node Tests<15>,Build<18>,Documentation<16>,Python 3 13 0 alpha 6
@anchor{whatsnew/changelog id227}@anchor{19c9}
@subsubsection Tests



@itemize -

@item 
gh-83434@footnote{https://github.com/python/cpython/issues/83434}: Disable JUnit XML output (@code{--junit-xml=FILE} command line
option) in regrtest when hunting for reference leaks (@code{-R} option).
Patch by Victor Stinner.

@item 
gh-117187@footnote{https://github.com/python/cpython/issues/117187}: Fix XML tests for vanilla Expat <2.6.0.

@item 
gh-116333@footnote{https://github.com/python/cpython/issues/116333}: Tests of TLS related things (error codes, etc) were updated to
be more lenient about specific error message strings and behaviors as seen
in the BoringSSL and AWS-LC forks of OpenSSL.

@item 
gh-117089@footnote{https://github.com/python/cpython/issues/117089}: Consolidated tests for importlib.metadata in their own
@code{metadata} package.

@item 
gh-115979@footnote{https://github.com/python/cpython/issues/115979}: Update test_importlib so that it passes under WASI SDK 21.

@item 
gh-112536@footnote{https://github.com/python/cpython/issues/112536}: Add –tsan to test.regrtest for running TSAN tests in
reasonable execution times. Patch by Donghee Na.

@item 
gh-116307@footnote{https://github.com/python/cpython/issues/116307}: Added import helper @code{isolated_modules} as @code{CleanImport}
does not remove modules imported during the context. Use it in
importlib.resources tests to avoid leaving @code{mod} around to impede
importlib.metadata tests.
@end itemize

@node Build<18>,Windows<16>,Tests<15>,Python 3 13 0 alpha 6
@anchor{whatsnew/changelog id228}@anchor{19ca}
@subsubsection Build



@itemize -

@item 
gh-114736@footnote{https://github.com/python/cpython/issues/114736}: Have WASI builds use WASI SDK 21.

@item 
gh-115983@footnote{https://github.com/python/cpython/issues/115983}: Skip building test modules that must be built as shared under
WASI.

@item 
gh-71052@footnote{https://github.com/python/cpython/issues/71052}: Add Android build script and instructions.
@end itemize

@node Windows<16>,C API<18>,Build<18>,Python 3 13 0 alpha 6
@anchor{whatsnew/changelog id229}@anchor{19cb}
@subsubsection Windows



@itemize -

@item 
gh-117267@footnote{https://github.com/python/cpython/issues/117267}: Ensure @code{DirEntry.stat().st_ctime} behaves consistently with
@ref{26d,,os.stat()} during the deprecation period of @code{st_ctime} by
containing the same value as @code{st_birthtime}. After the deprecation
period, @code{st_ctime} will be the metadata change time (or unavailable
through @code{DirEntry}), and only @code{st_birthtime} will contain the creation
time.

@item 
gh-116195@footnote{https://github.com/python/cpython/issues/116195}: Improves performance of @ref{19cc,,os.getppid()} by using an
alternate system API when available. Contributed by vxiiduu.

@item 
gh-88494@footnote{https://github.com/python/cpython/issues/88494}: On Windows, @ref{55b,,time.monotonic()} now uses the
@code{QueryPerformanceCounter()} clock to have a resolution better than 1 us,
instead of the @code{GetTickCount64()} clock which has a resolution of 15.6
ms. Patch by Victor Stinner.

@item 
gh-116773@footnote{https://github.com/python/cpython/issues/116773}: Fix instances of @code{<_overlapped.Overlapped object at 0xXXX>
still has pending operation at deallocation, the process may crash}.

@item 
gh-91227@footnote{https://github.com/python/cpython/issues/91227}: Fix the asyncio ProactorEventLoop implementation so that sending
a datagram to an address that is not listening does not prevent receiving
any more datagrams.

@item 
gh-115119@footnote{https://github.com/python/cpython/issues/115119}: Switched from vendored @code{libmpdecimal} code to a
separately-hosted external package in the @code{cpython-source-deps}
repository when building the @code{_decimal} module.
@end itemize

@node C API<18>,,Windows<16>,Python 3 13 0 alpha 6
@anchor{whatsnew/changelog id230}@anchor{19cd}
@subsubsection C API



@itemize -

@item 
gh-117642@footnote{https://github.com/python/cpython/issues/117642}: Fix 
@geindex Python 향상 제안; PEP 737
PEP 737@footnote{https://peps.python.org/pep-0737/} implementation for @code{%#T} and @code{%#N}.

@item 
gh-87193@footnote{https://github.com/python/cpython/issues/87193}: @ref{19ce,,_PyBytes_Resize()} can now be called for bytes objects
with reference count > 1, including 1-byte bytes objects. It creates a new
bytes object and destroys the old one if it has reference count > 1.

@item 
gh-117021@footnote{https://github.com/python/cpython/issues/117021}: Fix integer overflow in @ref{19cf,,PyLong_AsPid()} on non-Windows
64-bit platforms.

@item 
gh-115756@footnote{https://github.com/python/cpython/issues/115756}: @code{PyCode_GetFirstFree()} is an ustable API now and has
been renamed to @ref{625,,PyUnstable_Code_GetFirstFree()}. (Contributed by
Bogdan Romanyuk in gh-115781@footnote{https://github.com/python/cpython/issues/115781})

@item 
gh-116869@footnote{https://github.com/python/cpython/issues/116869}: Add @code{test_cext} test: build a C extension to check if the
Python C API emits C compiler warnings. Patch by Victor Stinner.

@item 
gh-116869@footnote{https://github.com/python/cpython/issues/116869}: Make the C API compatible with
@code{-Werror=declaration-after-statement} compiler flag again. Patch by
Victor Stinner.

@item 
gh-116936@footnote{https://github.com/python/cpython/issues/116936}: Add @ref{633,,PyType_GetModuleByDef()} to the limited C API. Patch
by Victor Stinner.

@item 
gh-116809@footnote{https://github.com/python/cpython/issues/116809}: Restore removed private @code{_PyErr_ChainExceptions1()} function.
Patch by Victor Stinner.

@item 
gh-115754@footnote{https://github.com/python/cpython/issues/115754}: In the limited C API version 3.13, getting @code{Py_None},
@code{Py_False}, @code{Py_True}, @code{Py_Ellipsis} and @code{Py_NotImplemented}
singletons is now implemented as function calls at the stable ABI level to
hide implementation details. Getting these constants still return borrowed
references. Patch by Victor Stinner.

@item 
gh-115754@footnote{https://github.com/python/cpython/issues/115754}: Add @ref{5f7,,Py_GetConstant()} and
@ref{5f8,,Py_GetConstantBorrowed()} functions to get constants. For example,
@code{Py_GetConstant(Py_CONSTANT_ZERO)} returns a @ref{5df,,strong reference} to
the constant zero. Patch by Victor Stinner.

@item 
gh-111696@footnote{https://github.com/python/cpython/issues/111696}: Add support for @code{%T}, @code{%T#}, @code{%N} and @code{%N#} formats to
@ref{629,,PyUnicode_FromFormat()}: format the fully qualified name of an
object type and of a type: call @ref{616,,PyType_GetModuleName()}. See
@geindex Python 향상 제안; PEP 737
PEP 737@footnote{https://peps.python.org/pep-0737/} for more information. Patch by Victor Stinner.

@item 
gh-111696@footnote{https://github.com/python/cpython/issues/111696}: Add @ref{616,,PyType_GetModuleName()} function to get the type’s
module name. Equivalent to getting the @code{type.__module__} attribute.
Patch by Eric Snow and Victor Stinner.

@item 
gh-111696@footnote{https://github.com/python/cpython/issues/111696}: Add @ref{614,,PyType_GetFullyQualifiedName()} function to get the
type’s fully qualified name. Equivalent to
@code{f"@{type.__module__@}.@{type.__qualname__@}"}, or @code{type.__qualname__} if
@code{type.__module__} is not a string or is equal to @code{"builtins"}. Patch
by Victor Stinner.

@item 
gh-85283@footnote{https://github.com/python/cpython/issues/85283}: The @code{fcntl}, @code{grp}, @code{pwd}, @code{termios}, @code{_statistics}
and @code{_testconsole} C extensions are now built with the @ref{635,,limited C API}. Patch by Victor Stinner.

@item 
gh-111140@footnote{https://github.com/python/cpython/issues/111140}: Add additional flags to @ref{604,,PyLong_AsNativeBytes()} and
@ref{605,,PyLong_FromNativeBytes()} to allow the caller to determine how to
handle edge cases around values that fill the entire buffer.

@item 
gh-113024@footnote{https://github.com/python/cpython/issues/113024}: Add @ref{60a,,PyObject_GenericHash()} function.
@end itemize

@node Python 3 13 0 alpha 5,Python 3 13 0 alpha 4,Python 3 13 0 alpha 6,Changelog
@anchor{whatsnew/changelog python-3-13-0-alpha-5}@anchor{19d0}
@subsection Python 3.13.0 alpha 5


`Release date: 2024-03-12'

@menu
* Security: Security<19>. 
* Core and Builtins: Core and Builtins<53>. 
* Library: Library<58>. 
* Core and Builtins: Core and Builtins<54>. 
* Library: Library<59>. 
* Core and Builtins: Core and Builtins<55>. 
* Library: Library<60>. 
* Documentation: Documentation<17>. 
* Tests: Tests<16>. 
* Build: Build<19>. 
* Windows: Windows<17>. 
* macOS: macOS<10>. 
* IDLE: IDLE<9>. 
* Tools/Demos: Tools/Demos<16>. 
* C API: C API<19>. 

@end menu

@node Security<19>,Core and Builtins<53>,,Python 3 13 0 alpha 5
@anchor{whatsnew/changelog id231}@anchor{19d1}
@subsubsection Security



@itemize -

@item 
gh-115398@footnote{https://github.com/python/cpython/issues/115398}: Allow controlling Expat >=2.6.0 reparse deferral
(
@geindex Common Vulnerabilities and Exposures; CVE 2023-52425
CVE 2023-52425@footnote{https://www.cve.org/CVERecord?id=CVE-2023-52425}) by adding five new methods:


@itemize *

@item 
@ref{575,,xml.etree.ElementTree.XMLParser.flush()}

@item 
@ref{576,,xml.etree.ElementTree.XMLPullParser.flush()}

@item 
@ref{577,,xml.parsers.expat.xmlparser.GetReparseDeferralEnabled()}

@item 
@ref{578,,xml.parsers.expat.xmlparser.SetReparseDeferralEnabled()}

@item 
@code{xml.sax.expatreader.ExpatParser.flush()}
@end itemize

@item 
gh-114572@footnote{https://github.com/python/cpython/issues/114572}: @ref{11ab,,ssl.SSLContext.cert_store_stats()} and
@ref{11ac,,ssl.SSLContext.get_ca_certs()} now correctly lock access to the
certificate store, when the @ref{357,,ssl.SSLContext} is shared across
multiple threads.
@end itemize

@node Core and Builtins<53>,Library<58>,Security<19>,Python 3 13 0 alpha 5
@anchor{whatsnew/changelog id232}@anchor{19d2}
@subsubsection Core and Builtins



@itemize -

@item 
gh-116604@footnote{https://github.com/python/cpython/issues/116604}: Respect the status of the garbage collector when indirect calls
are made via @ref{692,,PyErr_CheckSignals()} and the evaluation breaker.
Patch by Pablo Galindo

@item 
gh-112087@footnote{https://github.com/python/cpython/issues/112087}: @ref{24d,,list} is now compatible with the implementation of
@geindex Python 향상 제안; PEP 703
PEP 703@footnote{https://peps.python.org/pep-0703/}.

@item 
gh-116381@footnote{https://github.com/python/cpython/issues/116381}: Add specialization for @code{CONTAINS_OP}.

@item 
gh-116296@footnote{https://github.com/python/cpython/issues/116296}: Fix possible refleak in @code{object.__reduce__()} internal
error handling.

@item 
gh-115823@footnote{https://github.com/python/cpython/issues/115823}: Properly calculate error ranges in the parser when raising
@ref{18e,,SyntaxError} exceptions caused by invalid byte sequences. Patch by
Pablo Galindo

@item 
gh-115778@footnote{https://github.com/python/cpython/issues/115778}: Add @code{tierN} annotation for instruction definition in
interpreter DSL.

@item 
gh-115733@footnote{https://github.com/python/cpython/issues/115733}: Fix crash when calling @code{next()} on exhausted list iterators.

@item 
gh-115700@footnote{https://github.com/python/cpython/issues/115700}: The regen-cases build stage now works on Windows.

@item 
gh-115347@footnote{https://github.com/python/cpython/issues/115347}: Fix bug where docstring was replaced by a redundant NOP when
Python is run with @code{-OO}.

@item 
gh-115323@footnote{https://github.com/python/cpython/issues/115323}: Make error message more meaningful for when
@ref{1799,,bytearray.extend()} is called with a @ref{169,,str} object.

@item 
gh-112175@footnote{https://github.com/python/cpython/issues/112175}: Every @code{PyThreadState} now has its own @code{eval_breaker},
allowing specific threads to be interrupted.
@end itemize

@node Library<58>,Core and Builtins<54>,Core and Builtins<53>,Python 3 13 0 alpha 5
@anchor{whatsnew/changelog id233}@anchor{19d3}
@subsubsection Library



@itemize -

@item 
gh-115154@footnote{https://github.com/python/cpython/issues/115154}: Fix a bug that was causing the @ref{18b4,,tokenize.untokenize()}
function to handle unicode named literals incorrectly. Patch by Pablo
Galindo
@end itemize

@node Core and Builtins<54>,Library<59>,Library<58>,Python 3 13 0 alpha 5
@anchor{whatsnew/changelog id234}@anchor{19d4}
@subsubsection Core and Builtins



@itemize -

@item 
gh-112433@footnote{https://github.com/python/cpython/issues/112433}: Add ability to force alignment of @ref{1e5,,ctypes.Structure} by
way of the new @code{_align_} attribute on the class.
@end itemize

@node Library<59>,Core and Builtins<55>,Core and Builtins<54>,Python 3 13 0 alpha 5
@anchor{whatsnew/changelog id235}@anchor{19d5}
@subsubsection Library



@itemize -

@item 
gh-104090@footnote{https://github.com/python/cpython/issues/104090}: The multiprocessing resource tracker now exits with non-zero
status code if a resource leak was detected. It still exits with status
code 0 otherwise.
@end itemize

@node Core and Builtins<55>,Library<60>,Library<59>,Python 3 13 0 alpha 5
@anchor{whatsnew/changelog id236}@anchor{19d6}
@subsubsection Core and Builtins



@itemize -

@item 
gh-105858@footnote{https://github.com/python/cpython/issues/105858}: Improve the constructors for @ref{9,,ast} nodes. Arguments of
list types now default to an empty list if omitted, and optional fields
default to @code{None}. AST nodes now have an @code{__annotations__} attribute
with the expected types of their attributes. Passing unrecognized extra
arguments to AST nodes is deprecated and will become an error in Python
3.15. Omitting a required argument to an AST node is deprecated and will
become an error in Python 3.15. Patch by Jelle Zijlstra.

@item 
gh-101860@footnote{https://github.com/python/cpython/issues/101860}: Expose @code{__name__} attribute on property.

@item 
gh-96497@footnote{https://github.com/python/cpython/issues/96497}: Fix incorrect resolution of mangled class variables used in
assignment expressions in comprehensions.
@end itemize

@node Library<60>,Documentation<17>,Core and Builtins<55>,Python 3 13 0 alpha 5
@anchor{whatsnew/changelog id237}@anchor{19d7}
@subsubsection Library



@itemize -

@item 
gh-116600@footnote{https://github.com/python/cpython/issues/116600}: Fix @ref{1c1,,repr()} for global @ref{834,,Flag} members.

@item 
gh-116349@footnote{https://github.com/python/cpython/issues/116349}: @ref{32c,,platform.java_ver()} is deprecated and will be removed in
3.15. It was largely untested, had a confusing API, and was only useful
for Jython support.

@item 
gh-116143@footnote{https://github.com/python/cpython/issues/116143}: Fix a race in pydoc @code{_start_server}, eliminating a window in
which @code{_start_server} can return a thread that is “serving” but without
a @code{docserver} set.

@item 
gh-116127@footnote{https://github.com/python/cpython/issues/116127}: @ref{10a,,typing}: implement 
@geindex Python 향상 제안; PEP 705
PEP 705@footnote{https://peps.python.org/pep-0705/} which adds
@ref{48b,,typing.ReadOnly} support to @ref{332,,typing.TypedDict}.

@item 
gh-116325@footnote{https://github.com/python/cpython/issues/116325}: @ref{10a,,typing}: raise @ref{18e,,SyntaxError} instead of
@ref{5ee,,AttributeError} on forward references as empty strings.

@item 
gh-115957@footnote{https://github.com/python/cpython/issues/115957}: When @code{asyncio.TaskGroup.create_task} is called on an inactive
@code{asyncio.TaskGroup}, the given coroutine will be closed (which prevents
a @code{RuntimeWarning}).

@item 
gh-115978@footnote{https://github.com/python/cpython/issues/115978}: Disable preadv(), readv(), pwritev(), and writev() on WASI.

Under wasmtime for WASI 0.2, these functions don’t pass test_posix
(@indicateurl{https://github.com/bytecodealliance/wasmtime/issues/7830}).

@item 
gh-88352@footnote{https://github.com/python/cpython/issues/88352}: Fix the computation of the next rollover time in the
@code{logging.TimedRotatingFileHandler} handler.
@code{computeRollover()} now always returns a timestamp larger than the
specified time and works correctly during the DST change.
@code{doRollover()} no longer overwrite the already rolled over file,
saving from data loss when run at midnight or during repeated time at the
DST change.

@item 
gh-87115@footnote{https://github.com/python/cpython/issues/87115}: Set @code{__main__.__spec__} to @code{None} when running a script with
@ref{aa,,pdb}

@item 
gh-76511@footnote{https://github.com/python/cpython/issues/76511}: Fix UnicodeEncodeError in @code{email.Message.as_string()} that
results when a message that claims to be in the ascii character set
actually has non-ascii characters. Non-ascii characters are now replaced
with the U+FFFD replacement character, like in the @code{replace} error
handler.

@item 
gh-89547@footnote{https://github.com/python/cpython/issues/89547}: Add support for nested typing special forms like
Final[ClassVar[int]].

@item 
gh-65824@footnote{https://github.com/python/cpython/issues/65824}: Improve the @code{less} prompt in @ref{ba,,pydoc}.

@item 
gh-116040@footnote{https://github.com/python/cpython/issues/116040}: [Enum] fix by-value calls when second value is falsey; e.g.
Cardinal(1, 0)

@item 
gh-115821@footnote{https://github.com/python/cpython/issues/115821}: [Enum] Improve error message when calling super().__new__() in
custom __new__.

@item 
gh-85644@footnote{https://github.com/python/cpython/issues/85644}: Use the @code{XDG_CURRENT_DESKTOP} environment variable in
@ref{11b,,webbrowser} to check desktop. Prefer it to the deprecated
@code{GNOME_DESKTOP_SESSION_ID} for GNOME detection.

@item 
gh-75988@footnote{https://github.com/python/cpython/issues/75988}: Fixed @ref{1935,,unittest.mock.create_autospec()} to pass the call
through to the wrapped object to return the real result.

@item 
gh-115881@footnote{https://github.com/python/cpython/issues/115881}: Fix issue where @ref{1c2,,ast.parse()} would incorrectly flag
conditional context managers (such as @code{with (x() if y else z()): ...})
as invalid syntax if @code{feature_version=(3, 8)} was passed. This reverts
changes to the grammar made as part of gh-94949@footnote{https://github.com/python/cpython/issues/94949}.

@item 
gh-115886@footnote{https://github.com/python/cpython/issues/115886}: Fix silent truncation of the name with an embedded null
character in @ref{19d8,,multiprocessing.shared_memory.SharedMemory}.

@item 
gh-115532@footnote{https://github.com/python/cpython/issues/115532}: Add kernel density estimation to the statistics module.

@item 
gh-115714@footnote{https://github.com/python/cpython/issues/115714}: On WASI, the @ref{f4,,time} module no longer get process time
using @code{times()} or @code{CLOCK_PROCESS_CPUTIME_ID}, system API is that is
unreliable and is likely to be removed from WASI. The affected clock
functions fall back to calling @code{clock()}.

@item 
gh-115809@footnote{https://github.com/python/cpython/issues/115809}: Improve algorithm for computing which rolled-over log files to
delete in @code{logging.TimedRotatingFileHandler}. It is now reliable
for handlers without @code{namer} and with arbitrary deterministic @code{namer}
that leaves the datetime part in the file name unmodified.

@item 
gh-74668@footnote{https://github.com/python/cpython/issues/74668}: @ref{110,,urllib.parse} functions @ref{31f,,parse_qs()} and
@ref{31e,,parse_qsl()} now support bytes arguments containing raw
and percent-encoded non-ASCII data.

@item 
gh-67044@footnote{https://github.com/python/cpython/issues/67044}: @ref{6ae,,csv.writer()} now always quotes or escapes @code{'\r'} and
@code{'\n'}, regardless of `lineterminator' value.

@item 
gh-115712@footnote{https://github.com/python/cpython/issues/115712}: Restore support of space delimiter with
@code{skipinitialspace=True} in @ref{2d,,csv}. @ref{6ae,,csv.writer()} now quotes
empty fields if delimiter is a space and skipinitialspace is true and
raises exception if quoting is not possible.

@item 
gh-112364@footnote{https://github.com/python/cpython/issues/112364}: Fixed @ref{ae2,,ast.unparse()} to handle format_spec with @code{"},
@code{'} or @code{\\}. Patched by Frank Hoffmann.

@item 
gh-112997@footnote{https://github.com/python/cpython/issues/112997}: Stop logging potentially sensitive callback arguments in
@ref{b,,asyncio} unless debug mode is active.

@item 
gh-114914@footnote{https://github.com/python/cpython/issues/114914}: Fix an issue where an abandoned @code{StreamWriter} would not
be garbage collected.

@item 
gh-111358@footnote{https://github.com/python/cpython/issues/111358}: Fix a bug in
@code{asyncio.BaseEventLoop.shutdown_default_executor()} to ensure the
timeout passed to the coroutine behaves as expected.

@item 
gh-115618@footnote{https://github.com/python/cpython/issues/115618}: Fix improper decreasing the reference count for @code{None}
argument in @ref{4b3,,property} methods @ref{19d9,,getter()},
@ref{19da,,setter()} and @ref{19db,,deleter()}.

@item 
gh-112720@footnote{https://github.com/python/cpython/issues/112720}: Refactor @code{dis.ArgResolver} to make it possible to
subclass and change the way jump args are interpreted.

@item 
gh-112006@footnote{https://github.com/python/cpython/issues/112006}: Fix @ref{115b,,inspect.unwrap()} for types with the @code{__wrapper__}
data descriptor. Fix @ref{941,,inspect.Signature.from_callable()} for builtins
@ref{48f,,classmethod()} and @ref{453,,staticmethod()}.

@item 
gh-101293@footnote{https://github.com/python/cpython/issues/101293}: Support callables with the @code{__call__()} method and types with
@code{__new__()} and @code{__init__()} methods set to class methods, static
methods, bound methods, partial functions, and other types of methods and
descriptors in @ref{941,,inspect.Signature.from_callable()}.

@item 
gh-103092@footnote{https://github.com/python/cpython/issues/103092}: Isolate @code{_lsprof} (apply 
@geindex Python 향상 제안; PEP 687
PEP 687@footnote{https://peps.python.org/pep-0687/}).

@item 
gh-113942@footnote{https://github.com/python/cpython/issues/113942}: @ref{ba,,pydoc} no longer skips global functions implemented as
builtin methods, such as @code{MethodDescriptorType} and
@code{WrapperDescriptorType}.

@item 
gh-115256@footnote{https://github.com/python/cpython/issues/115256}: Added DeprecationWarning when accessing the tarfile attribute
of TarInfo objects. The attribute is never used internally and is only
attached to TarInfos when the tarfile is opened in write-mode, not
read-mode. The attribute creates an unnecessary reference cycle which may
cause corruption when not closing the handle after writing a tarfile.

@item 
gh-115197@footnote{https://github.com/python/cpython/issues/115197}: @code{urllib.request} no longer resolves the hostname before
checking it against the system’s proxy bypass list on macOS and Windows.

@item 
gh-113812@footnote{https://github.com/python/cpython/issues/113812}: @code{DatagramTransport.sendto()} will now send zero-length
datagrams if called with an empty bytes object. The transport flow control
also now accounts for the datagram header when calculating the buffer
size.

@item 
gh-114763@footnote{https://github.com/python/cpython/issues/114763}: Protect modules loaded with @ref{eaa,,importlib.util.LazyLoader}
from race conditions when multiple threads try to access attributes before
the loading is complete.

@item 
gh-114709@footnote{https://github.com/python/cpython/issues/114709}: @code{posixpath.commonpath()} now raises a @ref{2ec,,ValueError}
exception when passed an empty iterable. Previously, @ref{173a,,IndexError} was
raised.

@code{posixpath.commonpath()} now raises a @ref{198,,TypeError} exception when
passed @code{None}. Previously, @ref{2ec,,ValueError} was raised.

@item 
gh-114610@footnote{https://github.com/python/cpython/issues/114610}: Fix bug where @ref{19dc,,pathlib.PurePath.with_stem()} converted a
non-empty path suffix to a stem when given an empty `stem' argument. It
now raises @ref{2ec,,ValueError}, just like
@ref{1957,,pathlib.PurePath.with_suffix()} does when called on a path with an
empty stem, given a non-empty `suffix' argument.

@item 
gh-107361@footnote{https://github.com/python/cpython/issues/107361}: Add @ref{481,,ssl.VERIFY_X509_PARTIAL_CHAIN} and
@code{VERIFY_X509_STRICT} to the default SSL context created with
@ref{480,,ssl.create_default_context()}.

@item 
gh-112281@footnote{https://github.com/python/cpython/issues/112281}: Allow creating @ref{9c5,,union of types} for
@ref{b37,,typing.Annotated} with unhashable metadata.

@item 
gh-111775@footnote{https://github.com/python/cpython/issues/111775}: Fix @code{importlib.resources.simple.ResourceHandle.open()} for
text mode, added missed @code{stream} argument.

@item 
gh-90095@footnote{https://github.com/python/cpython/issues/90095}: Make .pdbrc and -c work with any valid pdb commands.

@item 
gh-107625@footnote{https://github.com/python/cpython/issues/107625}: Raise @ref{728,,configparser.ParsingError} from
@ref{166d,,read()} and
@ref{729,,read_file()} methods of
@ref{4de,,configparser.ConfigParser} if a key without a corresponding value
is continued (that is, followed by an indented line).

@item 
gh-107155@footnote{https://github.com/python/cpython/issues/107155}: Fix incorrect output of @code{help(x)} where @code{x} is a
@ref{14a2,,lambda} function, which has an @code{__annotations__} dictionary
attribute with a @code{"return"} key.

@item 
gh-57141@footnote{https://github.com/python/cpython/issues/57141}: Add option for `non-shallow' comparisons to
@ref{113f,,filecmp.dircmp} like @ref{19dd,,filecmp.cmp()}. Original patch by Steven
Ward. Enhanced by Tobias Rautenkranz

@item 
gh-69990@footnote{https://github.com/python/cpython/issues/69990}: @code{Profile.print_stats()} has been improved to accept multiple
sort arguments. Patched by Chiu-Hsiang Hsu and Furkan Onder.

@item 
gh-104061@footnote{https://github.com/python/cpython/issues/104061}: Add @code{socket.SO_BINDTOIFINDEX} constant.

@item 
gh-60346@footnote{https://github.com/python/cpython/issues/60346}: Fix ArgumentParser inconsistent with parse_known_args.

@item 
gh-102389@footnote{https://github.com/python/cpython/issues/102389}: Add @code{windows_31j} to aliases for @code{cp932} codec

@item 
gh-72249@footnote{https://github.com/python/cpython/issues/72249}: Always include the @ref{19de,,module} name in the @ref{1c1,,repr()} of
@ref{217,,functools.partial()} objects.  Patch by Furkan Onder and Anilyka
Barry.

@item 
gh-100985@footnote{https://github.com/python/cpython/issues/100985}: Update HTTPSConnection to consistently wrap IPv6 Addresses when
using a proxy.

@item 
gh-100884@footnote{https://github.com/python/cpython/issues/100884}: email: fix misfolding of comma in address-lists over multiple
lines in combination with unicode encoding.

@item 
gh-95782@footnote{https://github.com/python/cpython/issues/95782}: Fix @code{io.BufferedReader.tell()},
@code{io.BufferedReader.seek()}, @code{_pyio.BufferedReader.tell()},
@code{io.BufferedRandom.tell()}, @code{io.BufferedRandom.seek()} and
@code{_pyio.BufferedRandom.tell()} being able to return negative offsets.

@item 
gh-96310@footnote{https://github.com/python/cpython/issues/96310}: Fix a traceback in @ref{7,,argparse} when all options in a
mutually exclusive group are suppressed.

@item 
gh-93205@footnote{https://github.com/python/cpython/issues/93205}: Fixed a bug in
@ref{1160,,logging.handlers.TimedRotatingFileHandler} where multiple rotating
handler instances pointing to files with the same name but different
extensions would conflict and not delete the correct files.

@item 
bpo-31116@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31116}: Add Z85 encoding to @code{base64}.

@item 
bpo-44865@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44865}: Add missing call to localization function in @ref{7,,argparse}.

@item 
bpo-43952@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43952}: Fix @ref{19df,,multiprocessing.connection.Listener.accept()} to
accept empty bytes as authkey. Not accepting empty bytes as key causes it
to hang indefinitely.

@item 
bpo-42125@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42125}: linecache: get module name from @code{__spec__} if available. This
allows getting source code for the @code{__main__} module when a custom
loader is used.

@item 
bpo-41122@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41122}: Failing to pass arguments properly to
@ref{be4,,functools.singledispatchmethod()} now throws a TypeError instead of
hitting an index out of bounds internally.

@item 
bpo-40818@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40818}: The asyncio REPL now runs @ref{11c7,,sys.__interactivehook__} on
startup. The default implementation of @code{sys.__interactivehook__}
provides auto-completion to the asyncio REPL. Patch contributed by Rémi
Lapeyre.

@item 
bpo-33775@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33775}: Add ‘default’ and ‘version’ help text for localization in
argparse.
@end itemize

@node Documentation<17>,Tests<16>,Library<60>,Python 3 13 0 alpha 5
@anchor{whatsnew/changelog id238}@anchor{19e0}
@subsubsection Documentation



@itemize -

@item 
gh-115399@footnote{https://github.com/python/cpython/issues/115399}: Document 
@geindex Common Vulnerabilities and Exposures; CVE 2023-52425
CVE 2023-52425@footnote{https://www.cve.org/CVERecord?id=CVE-2023-52425} of Expat <2.6.0 under “XML
vulnerabilities”.

@item 
gh-109653@footnote{https://github.com/python/cpython/issues/109653}: Improve import time of @ref{116,,uuid} on Linux.
@end itemize

@node Tests<16>,Build<19>,Documentation<17>,Python 3 13 0 alpha 5
@anchor{whatsnew/changelog id239}@anchor{19e1}
@subsubsection Tests



@itemize -

@item 
gh-71052@footnote{https://github.com/python/cpython/issues/71052}: Add test exclusions to support running the test suite on
Android.

@item 
gh-71052@footnote{https://github.com/python/cpython/issues/71052}: Enable @code{test_concurrent_futures} on platforms that support
threading but not multiprocessing.

@item 
gh-115796@footnote{https://github.com/python/cpython/issues/115796}: Make ‘_testinternalcapi.assemble_code_object’ construct the
exception table for the code object.

@item 
gh-115720@footnote{https://github.com/python/cpython/issues/115720}: Leak tests (@code{-R}, @code{--huntrleaks}) now show a summary of the
number of leaks found in each iteration.

@item 
gh-115122@footnote{https://github.com/python/cpython/issues/115122}: Add @code{--bisect} option to regrtest test runner: run failed
tests with @code{test.bisect_cmd} to identify failing tests. Patch by Victor
Stinner.

@item 
gh-115596@footnote{https://github.com/python/cpython/issues/115596}: Fix @code{ProgramPriorityTests} in @code{test_os} permanently
changing the process priority.

@item 
gh-115556@footnote{https://github.com/python/cpython/issues/115556}: On Windows, commas passed in arguments to
@code{Tools\buildbot\test.bat} and @code{PCbuild\\rt.bat} are now properly
handled.

@item 
gh-115420@footnote{https://github.com/python/cpython/issues/115420}: Fix translation of exception handler targets by
@code{_testinternalcapi.optimize_cfg}.

@item 
gh-115376@footnote{https://github.com/python/cpython/issues/115376}: Fix segfault in @code{_testinternalcapi.compiler_codegen} on bad
input.
@end itemize

@node Build<19>,Windows<17>,Tests<16>,Python 3 13 0 alpha 5
@anchor{whatsnew/changelog id240}@anchor{19e2}
@subsubsection Build



@itemize -

@item 
gh-116313@footnote{https://github.com/python/cpython/issues/116313}: Get WASI builds to work under wasmtime 18 w/ WASI 0.2/preview2
primitives.

@item 
gh-71052@footnote{https://github.com/python/cpython/issues/71052}: Change Android’s @ref{291,,sys.platform} from @code{"linux"} to
@code{"android"}.

@item 
gh-116117@footnote{https://github.com/python/cpython/issues/116117}: Backport @code{libb2}’s PR #42 to fix compiling CPython on 32-bit
Windows with @code{clang-cl}.

@item 
gh-71052@footnote{https://github.com/python/cpython/issues/71052}: Fix several Android build issues

@item 
gh-114099@footnote{https://github.com/python/cpython/issues/114099}: A testbed project was added to run the test suite on iOS.

@item 
gh-115350@footnote{https://github.com/python/cpython/issues/115350}: Fix building ctypes module with -DWIN32_LEAN_AND_MEAN defined

@item 
gh-111225@footnote{https://github.com/python/cpython/issues/111225}: Link extension modules against libpython on Android.

@item 
gh-115737@footnote{https://github.com/python/cpython/issues/115737}: The install name for libPython is now correctly set for
non-framework macOS builds.

@item 
gh-114099@footnote{https://github.com/python/cpython/issues/114099}: Makefile targets were added to support compiling an
iOS-compatible framework build.
@end itemize

@node Windows<17>,macOS<10>,Build<19>,Python 3 13 0 alpha 5
@anchor{whatsnew/changelog id241}@anchor{19e3}
@subsubsection Windows



@itemize -

@item 
gh-116012@footnote{https://github.com/python/cpython/issues/116012}: Ensure the value of @code{GetLastError()} is preserved across GIL
operations.

@item 
gh-115582@footnote{https://github.com/python/cpython/issues/115582}: Building extensions intended for free-threaded builds of
CPython now require compiling with @code{/DPy_GIL_DISABLED} manually when
using a regular install. This is expected to change in future releases.

@item 
gh-115554@footnote{https://github.com/python/cpython/issues/115554}: The installer now has more strict rules about updating the
@ref{7d9,,Python install manager}. In general, most users only have a single launcher
installed and will see no difference. When multiple launchers have been
installed, the option to install the launcher is disabled until all but
one have been removed. Downgrading the launcher (which was never allowed)
is now more obviously blocked.

@item 
gh-115543@footnote{https://github.com/python/cpython/issues/115543}: @ref{7d9,,Python install manager} can now detect Python 3.13 when installed from
the Microsoft Store, and will install Python 3.12 by default when
@geindex PYLAUNCHER_ALLOW_INSTALL
@geindex 환경 변수; PYLAUNCHER_ALLOW_INSTALL
@code{PYLAUNCHER_ALLOW_INSTALL} is set.
@end itemize

@node macOS<10>,IDLE<9>,Windows<17>,Python 3 13 0 alpha 5
@anchor{whatsnew/changelog id242}@anchor{19e4}
@subsubsection macOS



@itemize -

@item 
gh-116145@footnote{https://github.com/python/cpython/issues/116145}: Update macOS installer to Tcl/Tk 8.6.14.
@end itemize

@node IDLE<9>,Tools/Demos<16>,macOS<10>,Python 3 13 0 alpha 5
@anchor{whatsnew/changelog id243}@anchor{19e5}
@subsubsection IDLE



@itemize -

@item 
gh-88516@footnote{https://github.com/python/cpython/issues/88516}: On macOS show a proxy icon in the title bar of editor windows to
match platform behaviour.
@end itemize

@node Tools/Demos<16>,C API<19>,IDLE<9>,Python 3 13 0 alpha 5
@anchor{whatsnew/changelog id244}@anchor{19e6}
@subsubsection Tools/Demos



@itemize -

@item 
gh-100176@footnote{https://github.com/python/cpython/issues/100176}: Remove outdated Tools/@{io,cc,string@}bench

@item 
bpo-45101@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45101}: Add consistency in usage message IO between 2 versions of
python-config.
@end itemize

@node C API<19>,,Tools/Demos<16>,Python 3 13 0 alpha 5
@anchor{whatsnew/changelog id245}@anchor{19e7}
@subsubsection C API



@itemize -

@item 
gh-114626@footnote{https://github.com/python/cpython/issues/114626}: Add again @code{_PyCFunctionFastWithKeywords} name, removed in
Python 3.13 alpha 4 by mistake.  Keep the old private
@code{_PyCFunctionFastWithKeywords} name (Python 3.7) as an alias to the new
public name @code{PyCFunctionFastWithKeywords} (Python 3.13a4). Patch by
Victor Stinner.

@item 
gh-111418@footnote{https://github.com/python/cpython/issues/111418}: Add @ref{19e8,,PyHASH_MODULUS}, @ref{19e9,,PyHASH_BITS},
@ref{19ea,,PyHASH_INF} and @ref{19eb,,PyHASH_IMAG} C macros.  Patch by
Sergey B Kirpichev.
@end itemize

@node Python 3 13 0 alpha 4,Python 3 13 0 alpha 3,Python 3 13 0 alpha 5,Changelog
@anchor{whatsnew/changelog python-3-13-0-alpha-4}@anchor{19ec}
@subsection Python 3.13.0 alpha 4


`Release date: 2024-02-15'

@menu
* Security: Security<20>. 
* Core and Builtins: Core and Builtins<56>. 
* Library: Library<61>. 
* Documentation: Documentation<18>. 
* Tests: Tests<17>. 
* Build: Build<20>. 
* Windows: Windows<18>. 
* macOS: macOS<11>. 
* IDLE: IDLE<10>. 
* Tools/Demos: Tools/Demos<17>. 
* C API: C API<20>. 

@end menu

@node Security<20>,Core and Builtins<56>,,Python 3 13 0 alpha 4
@anchor{whatsnew/changelog id246}@anchor{19ed}
@subsubsection Security



@itemize -

@item 
gh-115399@footnote{https://github.com/python/cpython/issues/115399}: Update bundled libexpat to 2.6.0

@item 
gh-115243@footnote{https://github.com/python/cpython/issues/115243}: Fix possible crashes in @ref{fcf,,collections.deque.index()} when
the deque is concurrently modified.
@end itemize

@node Core and Builtins<56>,Library<61>,Security<20>,Python 3 13 0 alpha 4
@anchor{whatsnew/changelog id247}@anchor{19ee}
@subsubsection Core and Builtins



@itemize -

@item 
gh-112087@footnote{https://github.com/python/cpython/issues/112087}: For an empty reverse iterator for list will be reduced to
@ref{a65,,reversed()}. Patch by Donghee Na

@item 
gh-114570@footnote{https://github.com/python/cpython/issues/114570}: Add @ref{479,,PythonFinalizationError} exception. This exception
derived from @ref{244,,RuntimeError} is raised when an operation is blocked
during the @ref{47a,,Python finalization}. Patch by
Victor Stinner.

@item 
gh-114695@footnote{https://github.com/python/cpython/issues/114695}: Add @ref{364,,sys._clear_internal_caches()}, which clears all
internal performance-related caches (and deprecate the less-general
@ref{292,,sys._clear_type_cache()} function).

@item 
gh-114828@footnote{https://github.com/python/cpython/issues/114828}: Fix compilation crashes in uncommon code examples using
@ref{1a6,,super()} inside a comprehension in a class body.

@item 
gh-112069@footnote{https://github.com/python/cpython/issues/112069}: Adapt @ref{184,,set} and @ref{7f1,,frozenset} methods to Argument
Clinic.

@item 
gh-115011@footnote{https://github.com/python/cpython/issues/115011}: Setters for members with an unsigned integer type now support
the same range of valid values for objects that has a
@ref{19e,,__index__()} method as for @ref{19b,,int}.

@item 
gh-114887@footnote{https://github.com/python/cpython/issues/114887}: Changed socket type validation in
@ref{93b,,create_datagram_endpoint()} to accept all non-stream
sockets. This fixes a regression in compatibility with raw sockets.

@item 
gh-114944@footnote{https://github.com/python/cpython/issues/114944}: Fixes a race between @code{PyParkingLot_Park} and
@code{_PyParkingLot_UnparkAll}.

@item 
gh-113462@footnote{https://github.com/python/cpython/issues/113462}: Limit the number of versions that a single class can use.
Prevents a few wayward classes using up all the version numbers.

@item 
gh-76763@footnote{https://github.com/python/cpython/issues/76763}: The @ref{19ef,,chr()} builtin function now always raises
@ref{2ec,,ValueError} for values outside the valid range. Previously it raised
@ref{a81,,OverflowError} for very large or small values.

@item 
gh-114806@footnote{https://github.com/python/cpython/issues/114806}: No longer specialize calls to classes, if those classes have
metaclasses. Fixes bug where the @code{__call__} method of the metaclass was
not being called.

@item 
gh-107944@footnote{https://github.com/python/cpython/issues/107944}: Improve error message for function calls with bad keyword
arguments via getargs

@item 
gh-112529@footnote{https://github.com/python/cpython/issues/112529}: The free-threaded build no longer allocates space for the
@code{PyGC_Head} structure in objects that support cyclic garbage collection.
A number of other fields and data structures are used as replacements,
including @code{ob_gc_bits}, @code{ob_tid}, and mimalloc internal data
structures.

@item 
gh-114456@footnote{https://github.com/python/cpython/issues/114456}: Lower the recursion limit under a debug build of WASI.

@item 
gh-114083@footnote{https://github.com/python/cpython/issues/114083}: Compiler applies folding of LOAD_CONST with following
instruction in a separate pass before other optimisations. This enables
jump threading in certain circumstances.

@item 
gh-114388@footnote{https://github.com/python/cpython/issues/114388}: Fix a @ref{4d8,,RuntimeWarning} emitted when assign an integer-like
value that is not an instance of @ref{19b,,int} to an attribute that
corresponds to a C struct member of @ref{19f0,,type} T_UINT
and T_ULONG. Fix a double @code{RuntimeWarning} emitted when assign a
negative integer value to an attribute that corresponds to a C struct
member of type T_UINT.

@item 
gh-114265@footnote{https://github.com/python/cpython/issues/114265}: Compiler propagates line numbers before optimization, leading
to more optimization opportunities and removing the need for the
@code{guarantee_lineno_for_exits} hack.

@item 
gh-112529@footnote{https://github.com/python/cpython/issues/112529}: The free-threaded build now has its own thread-safe GC
implementation that uses mimalloc to find GC tracked objects. It is
non-generational, unlike the existing GC implementation.

@item 
gh-114050@footnote{https://github.com/python/cpython/issues/114050}: Fix segmentation fault caused by an incorrect format string in
@code{TypeError} exception when more than two arguments are passed to
@code{int}.

@item 
gh-112354@footnote{https://github.com/python/cpython/issues/112354}: The @code{END_FOR} instruction now pops only one value. This is to
better support side exits in loops.

@item 
gh-113884@footnote{https://github.com/python/cpython/issues/113884}: Make @ref{d60,,queue.SimpleQueue} thread safe when the GIL is
disabled.

@item 
gh-114058@footnote{https://github.com/python/cpython/issues/114058}: Implement the foundations of the Tier 2 redundancy eliminator.

@item 
gh-113939@footnote{https://github.com/python/cpython/issues/113939}: frame.clear(): Clear frame.f_locals as well, and not only the
fast locals. This is relevant once frame.f_locals was accessed, which
would contain also references to all the locals.

@item 
gh-112050@footnote{https://github.com/python/cpython/issues/112050}: Convert @ref{7f3,,collections.deque} to use Argument Clinic.

@item 
gh-112050@footnote{https://github.com/python/cpython/issues/112050}: Make methods on @ref{7f3,,collections.deque} thread-safe when the
GIL is disabled.

@item 
gh-113464@footnote{https://github.com/python/cpython/issues/113464}: Add an option (@code{--enable-experimental-jit} for
@code{configure}-based builds or @code{--experimental-jit} for @code{PCbuild}-based
ones) to build an `experimental' just-in-time compiler, based on
copy-and-patch@footnote{https://fredrikbk.com/publications/copy-and-patch.pdf}

@item 
gh-113055@footnote{https://github.com/python/cpython/issues/113055}: Make interp->obmalloc a pointer. For interpreters that share
state with the main interpreter, this points to the same static memory
structure. For interpreters with their own obmalloc state, it is heap
allocated. Add free_obmalloc_arenas() which will free the obmalloc arenas
and radix tree structures for interpreters with their own obmalloc state.

@item 
gh-55664@footnote{https://github.com/python/cpython/issues/55664}: Add warning when creating @ref{f43,,type} using a namespace
dictionary with non-string keys. Patched by Daniel Urban and Furkan Onder.

@item 
gh-104530@footnote{https://github.com/python/cpython/issues/104530}: Use native Win32 condition variables.
@end itemize

@node Library<61>,Documentation<18>,Core and Builtins<56>,Python 3 13 0 alpha 4
@anchor{whatsnew/changelog id248}@anchor{19f1}
@subsubsection Library



@itemize -

@item 
gh-115392@footnote{https://github.com/python/cpython/issues/115392}: Fix a bug in @ref{3e,,doctest} where incorrect line numbers would
be reported for decorated functions.

@item 
gh-114563@footnote{https://github.com/python/cpython/issues/114563}: Fix several @ref{199,,format()} bugs when using the C implementation
of @ref{1fe,,Decimal}: * memory leak in some rare cases when using
the @code{z} format option (coerce negative 0) * incorrect output when
applying the @code{z} format option to type @code{F} (fixed-point with capital
@code{NAN} / @code{INF}) * incorrect output when applying the @code{#} format
option (alternate form)

@item 
gh-102840@footnote{https://github.com/python/cpython/issues/102840}: Fix confused traceback when floordiv, mod, or divmod operations
happens between instances of @ref{213,,fractions.Fraction} and
@ref{197,,complex}.

@item 
gh-115165@footnote{https://github.com/python/cpython/issues/115165}: Most exceptions are now ignored when attempting to set the
@code{__orig_class__} attribute on objects returned when calling
@ref{10a,,typing} generic aliases (including generic aliases created using
@ref{b37,,typing.Annotated}). Previously only @ref{5ee,,AttributeError} was
ignored. Patch by Dave Shawley.

@item 
gh-112903@footnote{https://github.com/python/cpython/issues/112903}: Fix “issubclass() arg 1 must be a class” errors in certain
cases of multiple inheritance with generic aliases (regression in early
3.13 alpha releases).

@item 
gh-115133@footnote{https://github.com/python/cpython/issues/115133}: Fix tests for @ref{11f2,,XMLPullParser}
with Expat 2.6.0.

@item 
gh-115059@footnote{https://github.com/python/cpython/issues/115059}: @code{io.BufferedRandom.read1()} now flushes the underlying
write buffer.

@item 
gh-79382@footnote{https://github.com/python/cpython/issues/79382}: Trailing @code{**} no longer allows to match files and non-existing
paths in recursive @ref{59f,,glob()}.

@item 
gh-67837@footnote{https://github.com/python/cpython/issues/67837}: Avoid race conditions in the creation of directories during
concurrent extraction in @ref{e4,,tarfile} and @ref{137,,zipfile}.

@item 
gh-115060@footnote{https://github.com/python/cpython/issues/115060}: Speed up @ref{537,,pathlib.Path.glob()} by removing redundant regex
matching.

@item 
gh-97928@footnote{https://github.com/python/cpython/issues/97928}: Partially revert the behavior of @code{tkinter.Text.count()}. By
default it preserves the behavior of older Python versions, except that
setting @code{wantobjects} to 0 no longer has effect. Add a new parameter
`return_ints': specifying @code{return_ints=True} makes @code{Text.count()}
always returning the single count as an integer instead of a 1-tuple or
@code{None}.

@item 
gh-114628@footnote{https://github.com/python/cpython/issues/114628}: When csv.Error is raised when handling TypeError, do not print
the TypeError traceback.

@item 
gh-85984@footnote{https://github.com/python/cpython/issues/85984}: Added @code{_POSIX_VDISABLE} from C’s @code{<unistd.h>} to
@ref{e7,,termios}.

@item 
gh-114965@footnote{https://github.com/python/cpython/issues/114965}: Update bundled pip to 24.0

@item 
gh-114959@footnote{https://github.com/python/cpython/issues/114959}: @ref{e4,,tarfile} no longer ignores errors when trying to extract
a directory on top of a file.

@item 
gh-114894@footnote{https://github.com/python/cpython/issues/114894}: Add @ref{4bf,,array.array.clear()}.

@item 
gh-114071@footnote{https://github.com/python/cpython/issues/114071}: Support tuple subclasses using auto() for enum member value.

@item 
gh-109475@footnote{https://github.com/python/cpython/issues/109475}: Fix support of explicit option value “–” in @ref{7,,argparse}
(e.g. @code{--option=--}).

@item 
gh-49766@footnote{https://github.com/python/cpython/issues/49766}: Fix @ref{1fa,,date}-@ref{4e2,,datetime}
comparison. Now the special comparison methods like @code{__eq__} and
@code{__lt__} return @ref{1a2,,NotImplemented} if one of comparands is
@code{date} and other is @code{datetime} instead of ignoring the
time part and the time zone or forcefully return “not equal” or raise
@ref{198,,TypeError}. It makes comparison of @code{date} and
@code{datetime} subclasses more symmetric and allows to change the
default behavior by overriding the special comparison methods in
subclasses.

@item 
gh-110190@footnote{https://github.com/python/cpython/issues/110190}: Fix ctypes structs with array on Windows ARM64 platform by
setting @code{MAX_STRUCT_SIZE} to 32 in stgdict. Patch by Diego Russo

@item 
gh-114678@footnote{https://github.com/python/cpython/issues/114678}: Ensure that deprecation warning for ‘N’ specifier in
@ref{1fe,,Decimal} format is not raised for cases where ‘N’ appears
in other places in the format specifier. Based on patch by Stefan Krah.

@item 
gh-70303@footnote{https://github.com/python/cpython/issues/70303}: Return both files and directories from @ref{537,,pathlib.Path.glob()}
if a pattern ends with “@code{**}”. Previously only directories were
returned.

@item 
gh-109653@footnote{https://github.com/python/cpython/issues/109653}: Improve import time of @ref{7e,,importlib.metadata} and
@ref{54,,email.utils}.

@item 
gh-113280@footnote{https://github.com/python/cpython/issues/113280}: Fix a leak of open socket in rare cases when error occurred in
@ref{ae7,,ssl.SSLSocket} creation.

@item 
gh-77749@footnote{https://github.com/python/cpython/issues/77749}: @ref{19f2,,email.policy.EmailPolicy.fold()} now always encodes
non-ASCII characters in headers if @ref{ff8,,utf8}
is false.

@item 
gh-83383@footnote{https://github.com/python/cpython/issues/83383}: Synchronization of the @ref{36,,dbm.dumb} database is now no-op if
there was no modification since opening or last synchronization. The
directory file for a newly created empty @code{dbm.dumb} database is now
created immediately after opening instead of deferring this until
synchronizing or closing.

@item 
gh-91602@footnote{https://github.com/python/cpython/issues/91602}: Add `filter' keyword-only parameter to
@ref{54f,,sqlite3.Connection.iterdump()} for filtering database objects to
dump. Patch by Mariusz Felisiak.

@item 
gh-112451@footnote{https://github.com/python/cpython/issues/112451}: Prohibit subclassing pure-Python @ref{12c4,,datetime.timezone}.
This is consistent with C-extension implementation. Patch by Mariusz
Felisiak.

@item 
gh-69893@footnote{https://github.com/python/cpython/issues/69893}: Add the @code{close()} method for the iterator returned by
@ref{579,,xml.etree.ElementTree.iterparse()}.

@item 
gh-109653@footnote{https://github.com/python/cpython/issues/109653}: Reduce the import time of @ref{f3,,threading} module by ~50%.
Patch by Daniel Hollas.

@item 
gh-114492@footnote{https://github.com/python/cpython/issues/114492}: Make the result of @ref{19f3,,termios.tcgetattr()} reproducible on
Alpine Linux. Previously it could leave a random garbage in some fields.

@item 
gh-114315@footnote{https://github.com/python/cpython/issues/114315}: Make @ref{19f4,,threading.Lock} a real class, not a factory
function. Add @code{__new__} to @code{_thread.lock} type.

@item 
gh-100414@footnote{https://github.com/python/cpython/issues/100414}: Add @ref{39,,dbm.sqlite3} as a backend to @ref{35,,dbm}, and make it
the new default @code{dbm} backend. Patch by Raymond Hettinger and Erlend
E. Aasland.

@item 
gh-113267@footnote{https://github.com/python/cpython/issues/113267}: Revert changes in gh-106584@footnote{https://github.com/python/cpython/issues/106584} which made calls of
@code{TestResult} methods @code{startTest()} and @code{stopTest()} unbalanced.

@item 
gh-75128@footnote{https://github.com/python/cpython/issues/75128}: Ignore an @ref{2c0,,OSError} in
@code{asyncio.BaseEventLoop.create_server()} when IPv6 is available but the
interface cannot actually support it.

@item 
gh-114423@footnote{https://github.com/python/cpython/issues/114423}: @code{_DummyThread} entries in @code{threading._active} are now
automatically removed when the related thread dies.

@item 
gh-114257@footnote{https://github.com/python/cpython/issues/114257}: Dismiss the @code{FileNotFound} error in
@ref{f44,,ctypes.util.find_library()} and just return @code{None} on Linux.

@item 
gh-114321@footnote{https://github.com/python/cpython/issues/114321}: Expose more platform specific constants in the @ref{5d,,fcntl}
module on Linux, macOS, FreeBSD and NetBSD.

@item 
gh-114328@footnote{https://github.com/python/cpython/issues/114328}: The @ref{19f5,,tty.setcbreak()} and new @ref{19f6,,tty.cfmakecbreak()} no
longer clears the terminal input ICRLF flag. This fixes a regression
introduced in 3.12 that no longer matched how OSes define cbreak mode in
their @code{stty(1)} manual pages.

@item 
gh-114281@footnote{https://github.com/python/cpython/issues/114281}: Remove type hints from @code{Lib/asyncio/staggered.py}. The
annotations in the typeshed@footnote{https://github.com/python/typeshed}
project should be used instead.

@item 
gh-101438@footnote{https://github.com/python/cpython/issues/101438}: Avoid reference cycle in ElementTree.iterparse. The iterator
returned by @code{ElementTree.iterparse} may hold on to a file descriptor.
The reference cycle prevented prompt clean-up of the file descriptor if
the returned iterator was not exhausted.

@item 
gh-114198@footnote{https://github.com/python/cpython/issues/114198}: The signature for the @code{__replace__} method on
@ref{33,,dataclasses} now has the first argument named @code{self}, rather than
@code{obj}.

@item 
gh-104522@footnote{https://github.com/python/cpython/issues/104522}: @ref{2c0,,OSError} raised when run a subprocess now only has
`filename' attribute set to `cwd' if the error was caused by a failed
attempt to change the current directory.

@item 
gh-114149@footnote{https://github.com/python/cpython/issues/114149}: Enum: correctly handle tuple subclasses in custom @code{__new__}.

@item 
gh-83648@footnote{https://github.com/python/cpython/issues/83648}: Support deprecation of options, positional arguments and
subcommands in @ref{7,,argparse}.

@item 
gh-114087@footnote{https://github.com/python/cpython/issues/114087}: Speed up @code{dataclasses.asdict} up to 1.35x.

@item 
gh-109534@footnote{https://github.com/python/cpython/issues/109534}: Fix a reference leak in
@code{asyncio.selector_events.BaseSelectorEventLoop} when SSL handshakes
fail. Patch contributed by Jamie Phan.

@item 
gh-79634@footnote{https://github.com/python/cpython/issues/79634}: Accept @ref{5a0,,path-like objects} as patterns
in @ref{537,,pathlib.Path.glob()} and @ref{538,,rglob()}.

@item 
gh-112202@footnote{https://github.com/python/cpython/issues/112202}: Ensure that a @ref{19f7,,asyncio.Condition.notify()} call does not
get lost if the awakened @code{Task} is simultaneously cancelled or
encounters any other error.

@item 
gh-113951@footnote{https://github.com/python/cpython/issues/113951}: Fix the behavior of @code{tag_unbind()} methods of
@code{tkinter.Text} and @code{tkinter.Canvas} classes with three
arguments. Previously, @code{widget.tag_unbind(tag, sequence, funcid)}
destroyed the current binding for `sequence', leaving `sequence' unbound,
and deleted the `funcid' command. Now it removes only `funcid' from the
binding for `sequence', keeping other commands, and deletes the `funcid'
command. It leaves `sequence' unbound only if `funcid' was the last bound
command.

@item 
gh-97959@footnote{https://github.com/python/cpython/issues/97959}: Fix rendering class methods, bound methods, method and function
aliases in @ref{ba,,pydoc}. Class methods no longer have “method of
builtins.type instance” note. Corresponding notes are now added for class
and unbound methods. Method and function aliases now have references to
the module or the class where the origin was defined if it differs from
the current. Bound methods are now listed in the static methods section.
Methods of builtin classes are now supported as well as methods of Python
classes.

@item 
gh-113796@footnote{https://github.com/python/cpython/issues/113796}: Add more validation checks in the @ref{182a,,csv.Dialect}
constructor. @ref{2ec,,ValueError} is now raised if the same character is used
in different roles.

@item 
gh-113732@footnote{https://github.com/python/cpython/issues/113732}: Fix support of @ref{6ab,,QUOTE_NOTNULL} and
@ref{6ac,,QUOTE_STRINGS} in @ref{6ad,,csv.reader()}.

@item 
gh-113225@footnote{https://github.com/python/cpython/issues/113225}: Speed up @ref{6ce,,pathlib.Path.walk()} by using
@ref{19f8,,os.DirEntry.path} where possible.

@item 
gh-89039@footnote{https://github.com/python/cpython/issues/89039}: When replace() method is called on a subclass of datetime, date
or time, properly call derived constructor. Previously, only the base
class’s constructor was called.

Also, make sure to pass non-zero fold values when creating subclasses in
various methods. Previously, fold was silently ignored.

@item 
gh-112919@footnote{https://github.com/python/cpython/issues/112919}: Speed-up @ref{16d0,,datetime.datetime.replace()},
@ref{19f9,,datetime.date.replace()} and @ref{19fa,,datetime.time.replace()}.

@item 
gh-59013@footnote{https://github.com/python/cpython/issues/59013}: Set breakpoint on the first executable line of the function,
instead of the line of function definition when the user do @code{break func}
using @ref{aa,,pdb}

@item 
gh-112343@footnote{https://github.com/python/cpython/issues/112343}: Improve handling of pdb convenience variables to avoid
replacing string contents.

@item 
gh-112240@footnote{https://github.com/python/cpython/issues/112240}: Add option to calendar module CLI to specify the weekday to
start each week. Patch by Steven Ward.

@item 
gh-111741@footnote{https://github.com/python/cpython/issues/111741}: Recognise @code{image/webp} as a standard format in the
@ref{93,,mimetypes} module.

@item 
gh-43457@footnote{https://github.com/python/cpython/issues/43457}: Fix the @ref{f6,,tkinter} widget method @code{wm_attributes()}. It
now accepts the attribute name without the minus prefix to get window
attributes and allows to specify attributes and values to set as keyword
arguments. Add new optional keyword argument `return_python_dict': calling
@code{w.wm_attributes(return_python_dict=True)} returns the attributes as a
dict instead of a tuple. Calling @code{w.wm_attributes()} now returns a tuple
instead of string if `wantobjects' was set to 0.

@item 
gh-82626@footnote{https://github.com/python/cpython/issues/82626}: Many functions now emit a warning if a boolean value is passed
as a file descriptor argument.

@item 
gh-111051@footnote{https://github.com/python/cpython/issues/111051}: Added check for file modification during debugging with
@ref{aa,,pdb}

@item 
gh-110345@footnote{https://github.com/python/cpython/issues/110345}: Show the Tcl/Tk patchlevel (rather than version) in
@code{tkinter._test()}.

@item 
gh-38807@footnote{https://github.com/python/cpython/issues/38807}: Fix race condition in @ref{103,,trace}. Instead of checking if a
directory exists and creating it, directly call @ref{52c,,os.makedirs()} with
the kwarg @code{exist_ok=True}.

@item 
gh-75705@footnote{https://github.com/python/cpython/issues/75705}: Set unixfrom envelope in @ref{19fb,,mailbox.mbox} and
@ref{19fc,,mailbox.MMDF}.

@item 
gh-106233@footnote{https://github.com/python/cpython/issues/106233}: Fix stacklevel in @code{InvalidTZPathWarning} during
@ref{13a,,zoneinfo} module import.

@item 
gh-105102@footnote{https://github.com/python/cpython/issues/105102}: Allow @ref{1e6,,ctypes.Union} to be nested in
@ref{1e5,,ctypes.Structure} when the system endianness is the opposite of
the classes.

@item 
gh-104282@footnote{https://github.com/python/cpython/issues/104282}: Fix null pointer dereference in
@code{lzma._decode_filter_properties()} due to improper handling of BCJ
filters with properties of zero length. Patch by Radislav Chugunov.

@item 
gh-96471@footnote{https://github.com/python/cpython/issues/96471}: Add @ref{1599,,queue.Queue} termination with
@ref{542,,shutdown()}.

@item 
gh-101599@footnote{https://github.com/python/cpython/issues/101599}: Changed argparse flag options formatting to remove redundancy.

@item 
gh-85984@footnote{https://github.com/python/cpython/issues/85984}: Add POSIX pseudo-terminal functions @ref{19fd,,os.posix_openpt()},
@ref{19fe,,os.grantpt()}, @ref{19ff,,os.unlockpt()}, and @ref{1a00,,os.ptsname()}.

@item 
gh-102512@footnote{https://github.com/python/cpython/issues/102512}: When @ref{4b6,,os.fork()} is called from a foreign thread (aka
@code{_DummyThread}), the type of the thread in a child process is changed to
@code{_MainThread}. Also changed its name and daemonic status, it can be now
joined.

@item 
gh-88569@footnote{https://github.com/python/cpython/issues/88569}: Add @ref{32b,,os.path.isreserved()}, which identifies reserved
pathnames such as “NUL”, “AUX” and “CON”. This function is only available
on Windows.

Deprecate @ref{32a,,pathlib.PurePath.is_reserved()}.

@item 
bpo-38364@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38364}: The @code{inspect} functions @code{isgeneratorfunction},
@code{iscoroutinefunction}, @code{isasyncgenfunction} now support
@code{functools.partialmethod} wrapped functions the same way they support
@code{functools.partial}.
@end itemize

@node Documentation<18>,Tests<17>,Library<61>,Python 3 13 0 alpha 4
@anchor{whatsnew/changelog id249}@anchor{1a01}
@subsubsection Documentation



@itemize -

@item 
gh-115233@footnote{https://github.com/python/cpython/issues/115233}: Fix an example for @ref{14fa,,LoggerAdapter} in the
Logging Cookbook.

@item 
gh-114123@footnote{https://github.com/python/cpython/issues/114123}: Move the @ref{2d,,csv} module docstring to the @code{csv} module
instead of reexporting it from the internal @code{_csv} module, and
remove @code{__doc__} from @code{csv.__all__}.

Move @code{csv.__version__} to the @code{csv} module instead of
reexporting it from the internal @code{_csv} module, and remove
@code{__version__} from @code{csv.__all__}.
@end itemize

@node Tests<17>,Build<20>,Documentation<18>,Python 3 13 0 alpha 4
@anchor{whatsnew/changelog id250}@anchor{1a02}
@subsubsection Tests



@itemize -

@item 
gh-114099@footnote{https://github.com/python/cpython/issues/114099}: Added test exclusions required to run the test suite on iOS.

@item 
gh-105089@footnote{https://github.com/python/cpython/issues/105089}: Fix
@code{test.test_zipfile.test_core.TestWithDirectory.test_create_directory_with_write}
test in AIX by doing a bitwise AND of 0xFFFF on mode , so that it will be
in sync with @code{zinfo.external_attr}
@end itemize

@node Build<20>,Windows<18>,Tests<17>,Python 3 13 0 alpha 4
@anchor{whatsnew/changelog id251}@anchor{1a03}
@subsubsection Build



@itemize -

@item 
gh-115167@footnote{https://github.com/python/cpython/issues/115167}: Avoid vendoring @code{vcruntime140_threads.dll} when building with
Visual Studio 2022 version 17.8.

@item 
gh-113632@footnote{https://github.com/python/cpython/issues/113632}: Promote WASI to a tier 2 platform and drop Emscripten from tier
3 in configure.ac.

@item 
gh-114099@footnote{https://github.com/python/cpython/issues/114099}: configure and Makefile were refactored to accommodate framework
builds on Apple platforms other than macOS.

@item 
gh-114875@footnote{https://github.com/python/cpython/issues/114875}: Add @code{getgrent()} as a prerequisite for building the
@ref{6a,,grp} module.
@end itemize

@node Windows<18>,macOS<11>,Build<20>,Python 3 13 0 alpha 4
@anchor{whatsnew/changelog id252}@anchor{1a04}
@subsubsection Windows



@itemize -

@item 
gh-115049@footnote{https://github.com/python/cpython/issues/115049}: Fixes @code{py.exe} launcher failing when run as users without
user profiles.

@item 
gh-115009@footnote{https://github.com/python/cpython/issues/115009}: Update Windows installer to use SQLite 3.45.1.

@item 
gh-109991@footnote{https://github.com/python/cpython/issues/109991}: Update Windows build to use OpenSSL 3.0.13.

@item 
gh-111239@footnote{https://github.com/python/cpython/issues/111239}: Update Windows builds to use zlib v1.3.1.

@item 
gh-100107@footnote{https://github.com/python/cpython/issues/100107}: The @code{py.exe} launcher will no longer attempt to run the
Microsoft Store redirector when launching a script containing a
@code{/usr/bin/env} shebang

@item 
gh-112984@footnote{https://github.com/python/cpython/issues/112984}: Adds free-threaded binaries to Windows installer as an optional
component.

@item 
gh-89240@footnote{https://github.com/python/cpython/issues/89240}: Allows @ref{98,,multiprocessing} to create pools of greater than 62
processes.
@end itemize

@node macOS<11>,IDLE<10>,Windows<18>,Python 3 13 0 alpha 4
@anchor{whatsnew/changelog id253}@anchor{1a05}
@subsubsection macOS



@itemize -

@item 
gh-115009@footnote{https://github.com/python/cpython/issues/115009}: Update macOS installer to use SQLite 3.45.1.

@item 
gh-109991@footnote{https://github.com/python/cpython/issues/109991}: Update macOS installer to use OpenSSL 3.0.13.

@item 
gh-114490@footnote{https://github.com/python/cpython/issues/114490}: Add Mach-O linkage support for @ref{1a06,,platform.architecture()}.

@item 
gh-87804@footnote{https://github.com/python/cpython/issues/87804}: On macOS the result of @code{os.statvfs} and @code{os.fstatvfs} now
correctly report the size of very large disks, in previous versions the
reported number of blocks was wrong for disks with at least 2**32 blocks.
@end itemize

@node IDLE<10>,Tools/Demos<17>,macOS<11>,Python 3 13 0 alpha 4
@anchor{whatsnew/changelog id254}@anchor{1a07}
@subsubsection IDLE



@itemize -

@item 
gh-96905@footnote{https://github.com/python/cpython/issues/96905}: In idlelib code, stop redefining built-ins ‘dict’ and ‘object’.

@item 
gh-103820@footnote{https://github.com/python/cpython/issues/103820}: Revise IDLE bindings so that events from mouse button 4/5 on
non-X11 windowing systems (i.e. Win32 and Aqua) are not mistaken for
scrolling.
@end itemize

@node Tools/Demos<17>,C API<20>,IDLE<10>,Python 3 13 0 alpha 4
@anchor{whatsnew/changelog id255}@anchor{1a08}
@subsubsection Tools/Demos



@itemize -

@item 
gh-113516@footnote{https://github.com/python/cpython/issues/113516}: Don’t set @code{LDSHARED} when building for WASI.

@item 
gh-109991@footnote{https://github.com/python/cpython/issues/109991}: Update GitHub CI workflows to use OpenSSL 3.0.13 and
multissltests to use 1.1.1w, 3.0.13, 3.1.5, and 3.2.1.

@item 
gh-115015@footnote{https://github.com/python/cpython/issues/115015}: Fix a bug in Argument Clinic that generated incorrect code for
methods with no parameters that use the @ref{1a09,,METH_METHOD | METH_FASTCALL | METH_KEYWORDS} calling
convention. Only the positional parameter count was checked; any keyword
argument passed would be silently accepted.
@end itemize

@node C API<20>,,Tools/Demos<17>,Python 3 13 0 alpha 4
@anchor{whatsnew/changelog id256}@anchor{1a0a}
@subsubsection C API



@itemize -

@item 
gh-111140@footnote{https://github.com/python/cpython/issues/111140}: Adds @ref{604,,PyLong_AsNativeBytes()},
@ref{605,,PyLong_FromNativeBytes()} and
@ref{606,,PyLong_FromUnsignedNativeBytes()} functions.

@item 
gh-114685@footnote{https://github.com/python/cpython/issues/114685}: @ref{963,,PyBuffer_FillInfo()} now raises a @ref{794,,SystemError} if
called with @ref{1a0b,,PyBUF_READ} or @ref{1a0c,,PyBUF_WRITE} as flags.
These flags should only be used with the @code{PyMemoryView_*} C API.

@item 
gh-114685@footnote{https://github.com/python/cpython/issues/114685}: @ref{638,,PyObject_GetBuffer()} now raises a @ref{794,,SystemError} if
called with @ref{1a0b,,PyBUF_READ} or @ref{1a0c,,PyBUF_WRITE} as flags.
These flags should only be used with the @code{PyMemoryView_*} C API.

@item 
gh-114626@footnote{https://github.com/python/cpython/issues/114626}: Add @code{PyCFunctionFast} and @code{PyCFunctionFastWithKeywords}
typedefs (identical to the existing @code{_PyCFunctionFast} and
@code{_PyCFunctionFastWithKeywords} typedefs, just without a leading @code{_}
prefix).

@item 
gh-114329@footnote{https://github.com/python/cpython/issues/114329}: Add @ref{5fd,,PyList_GetItemRef()}, which is similar to
@ref{5fc,,PyList_GetItem()} but returns a @ref{5df,,strong reference} instead of
a @ref{3d7,,borrowed reference}.

@item 
gh-110850@footnote{https://github.com/python/cpython/issues/110850}: Add PyTime C API:


@itemize *

@item 
@ref{5d1,,PyTime_t} type.

@item 
@ref{5d2,,PyTime_MIN} and @ref{5d3,,PyTime_MAX} constants.

@item 
@ref{5d4,,PyTime_AsSecondsDouble()},
@ref{5d5,,PyTime_Monotonic()}, @ref{5d7,,PyTime_PerfCounter()}, and
@ref{5d9,,PyTime_Time()} functions.
@end itemize

Patch by Victor Stinner.

@item 
gh-112066@footnote{https://github.com/python/cpython/issues/112066}: Add @ref{5e2,,PyDict_SetDefaultRef()}: insert a key and value into
a dictionary if the key is not already present. This is similar to
@ref{1278,,dict.setdefault()}, but returns an integer value indicating if the
key was already present. It is also similar to
@ref{5e1,,PyDict_SetDefault()}, but returns a strong reference instead of a
borrowed reference.
@end itemize

@node Python 3 13 0 alpha 3,Python 3 13 0 alpha 2,Python 3 13 0 alpha 4,Changelog
@anchor{whatsnew/changelog python-3-13-0-alpha-3}@anchor{1a0d}
@subsection Python 3.13.0 alpha 3


`Release date: 2024-01-17'

@menu
* Security: Security<21>. 
* Core and Builtins: Core and Builtins<57>. 
* Library: Library<62>. 
* Documentation: Documentation<19>. 
* Tests: Tests<18>. 
* Build: Build<21>. 
* Windows: Windows<19>. 
* macOS: macOS<12>. 
* IDLE: IDLE<11>. 
* C API: C API<21>. 

@end menu

@node Security<21>,Core and Builtins<57>,,Python 3 13 0 alpha 3
@anchor{whatsnew/changelog id257}@anchor{1a0e}
@subsubsection Security



@itemize -

@item 
gh-113659@footnote{https://github.com/python/cpython/issues/113659}: Skip @code{.pth} files with names starting with a dot or hidden
file attribute.

@item 
gh-112302@footnote{https://github.com/python/cpython/issues/112302}: Created a Software Bill-of-Materials document and tooling for
tracking dependencies.
@end itemize

@node Core and Builtins<57>,Library<62>,Security<21>,Python 3 13 0 alpha 3
@anchor{whatsnew/changelog id258}@anchor{1a0f}
@subsubsection Core and Builtins



@itemize -

@item 
gh-107901@footnote{https://github.com/python/cpython/issues/107901}: Compiler duplicates basic blocks that have an eval breaker
check, no line number, and multiple predecessors.

@item 
gh-107901@footnote{https://github.com/python/cpython/issues/107901}: A jump leaving an exception handler back to normal code no
longer checks the eval breaker.

@item 
gh-113655@footnote{https://github.com/python/cpython/issues/113655}: Set the C recursion limit to 4000 on Windows, and 10000 on
Linux/OSX. This seems to be near the sweet spot to maintain safety, but
not compromise backwards compatibility.

@item 
gh-113710@footnote{https://github.com/python/cpython/issues/113710}: Add typed stack effects to the interpreter DSL, along with
various instruction annotations.

@item 
gh-77046@footnote{https://github.com/python/cpython/issues/77046}: On Windows, file descriptors wrapping Windows handles are now
created non inheritable by default (
@geindex Python 향상 제안; PEP 446
PEP 446@footnote{https://peps.python.org/pep-0446/}). Patch by Zackery Spytz
and Victor Stinner.

@item 
gh-113853@footnote{https://github.com/python/cpython/issues/113853}: Guarantee that all executors make progress. This then
guarantees that tier 2 execution always makes progress.

@item 
gh-113753@footnote{https://github.com/python/cpython/issues/113753}: Fix an issue where the finalizer of @code{PyAsyncGenASend} objects
might not be called if they were allocated from a free list.

@item 
gh-107901@footnote{https://github.com/python/cpython/issues/107901}: Compiler changed so that synthetic jumps which are not at loop
end no longer check the eval breaker.

@item 
gh-113703@footnote{https://github.com/python/cpython/issues/113703}: Fix a regression in the @ref{1d,,codeop} module that was causing
it to incorrectly identify incomplete f-strings. Patch by Pablo Galindo

@item 
gh-89811@footnote{https://github.com/python/cpython/issues/89811}: Check for a valid @code{tp_version_tag} before performing bytecode
specializations that rely on this value being usable.

@item 
gh-111488@footnote{https://github.com/python/cpython/issues/111488}: Changed error message in case of no ‘in’ keyword after ‘for’ in
list comprehensions

@item 
gh-113657@footnote{https://github.com/python/cpython/issues/113657}: Fix an issue that caused important instruction pointer updates
to be optimized out of tier two traces.

@item 
gh-113603@footnote{https://github.com/python/cpython/issues/113603}: Fixed bug where a redundant NOP is not removed, causing an
assertion to fail in the compiler in debug mode.

@item 
gh-113602@footnote{https://github.com/python/cpython/issues/113602}: Fix an error that was causing the parser to try to overwrite
existing errors and crashing in the process. Patch by Pablo Galindo

@item 
gh-113486@footnote{https://github.com/python/cpython/issues/113486}: No longer issue spurious @code{PY_UNWIND} events for optimized
calls to classes.

@item 
gh-113297@footnote{https://github.com/python/cpython/issues/113297}: Fix segfault in the compiler on with statement with 19 context
managers.

@item 
gh-113212@footnote{https://github.com/python/cpython/issues/113212}: Improve @ref{1a6,,super} error messages.

@item 
gh-111375@footnote{https://github.com/python/cpython/issues/111375}: Only use @code{NULL} in the exception stack to indicate an
exception was handled. Patch by Carey Metcalfe.

@item 
gh-112215@footnote{https://github.com/python/cpython/issues/112215}: Increase the C recursion limit by a factor of 3 for non-debug
builds, except for webassembly and s390 platforms which are unchanged.
This mitigates some regressions in 3.12 with deep recursion mixing builtin
(C) and Python code.

@item 
gh-113054@footnote{https://github.com/python/cpython/issues/113054}: Fixed bug where a redundant NOP is not removed, causing an
assertion to fail in the compiler in debug mode.

@item 
gh-106905@footnote{https://github.com/python/cpython/issues/106905}: Use per AST-parser state rather than global state to track
recursion depth within the AST parser to prevent potential race condition
due to simultaneous parsing.

The issue primarily showed up in 3.11 by multithreaded users of
@ref{1c2,,ast.parse()}.  In 3.12 a change to when garbage collection can be
triggered prevented the race condition from occurring.

@item 
gh-108866@footnote{https://github.com/python/cpython/issues/108866}: Change the API and contract of @code{_PyExecutorObject} to return
the next_instr pointer, instead of the frame, and to always execute at
least one instruction.

@item 
gh-90350@footnote{https://github.com/python/cpython/issues/90350}: Optimize builtin functions @ref{110a,,min()} and @ref{110b,,max()}.

@item 
gh-112943@footnote{https://github.com/python/cpython/issues/112943}: Correctly compute end column offsets for multiline tokens in
the @ref{101,,tokenize} module. Patch by Pablo Galindo

@item 
gh-112125@footnote{https://github.com/python/cpython/issues/112125}: Fix @code{None.__ne__(None)} returning @code{NotImplemented} instead
of @code{False}.

@item 
gh-74616@footnote{https://github.com/python/cpython/issues/74616}: @ref{14dd,,input()} now raises a ValueError when output on the
terminal if the prompt contains embedded null characters instead of
silently truncating it.

@item 
gh-112716@footnote{https://github.com/python/cpython/issues/112716}: Fix SystemError in the @code{import} statement and in
@code{__reduce__()} methods of builtin types when @code{__builtins__} is not a
dict.

@item 
gh-112730@footnote{https://github.com/python/cpython/issues/112730}: Use color to highlight error locations in tracebacks. Patch by
Pablo Galindo

@item 
gh-112625@footnote{https://github.com/python/cpython/issues/112625}: Fixes a bug where a bytearray object could be cleared while
iterating over an argument in the @code{bytearray.join()} method that could
result in reading memory after it was freed.

@item 
gh-112660@footnote{https://github.com/python/cpython/issues/112660}: Do not clear unexpected errors during formatting error messages
for ImportError and AttributeError for modules.

@item 
gh-105967@footnote{https://github.com/python/cpython/issues/105967}: Workaround a bug in Apple’s macOS platform zlib library where
@ref{1a10,,zlib.crc32()} and @ref{1a11,,binascii.crc32()} could produce incorrect
results on multi-gigabyte inputs. Including when using @ref{137,,zipfile} on
zips containing large data.

@item 
gh-95754@footnote{https://github.com/python/cpython/issues/95754}: Provide a better error message when accessing invalid attributes
on partially initialized modules. The origin of the module being accessed
is now included in the message to help with the common issue of shadowing
other modules.

@item 
gh-112217@footnote{https://github.com/python/cpython/issues/112217}: Add check for the type of @code{__cause__} returned from calling
the type @code{T} in @code{raise from T}.

@item 
gh-111058@footnote{https://github.com/python/cpython/issues/111058}: Change coro.cr_frame/gen.gi_frame to return @code{None} after the
coroutine/generator has been closed. This fixes a bug where
@ref{1019,,getcoroutinestate()} and @ref{143b,,getgeneratorstate()}
return the wrong state for a closed coroutine/generator.

@item 
gh-112388@footnote{https://github.com/python/cpython/issues/112388}: Fix an error that was causing the parser to try to overwrite
tokenizer errors. Patch by pablo Galindo

@item 
gh-112387@footnote{https://github.com/python/cpython/issues/112387}: Fix error positions for decoded strings with backwards tokenize
errors. Patch by Pablo Galindo

@item 
gh-99606@footnote{https://github.com/python/cpython/issues/99606}: Make code generated for an empty f-string identical to the code
of an empty normal string.

@item 
gh-112367@footnote{https://github.com/python/cpython/issues/112367}: Avoid undefined behaviour when using the perf trampolines by
not freeing the code arenas until shutdown. Patch by Pablo Galindo

@item 
gh-112320@footnote{https://github.com/python/cpython/issues/112320}: The Tier 2 translator now tracks the confidence level for
staying “on trace” (i.e. not exiting back to the Tier 1 interpreter) for
branch instructions based on the number of bits set in the branch
“counter”. Trace translation ends when the confidence drops below 1/3rd.

@item 
gh-109598@footnote{https://github.com/python/cpython/issues/109598}:
@ref{1a12,,PyComplex_RealAsDouble()}/@ref{1a13,,PyComplex_ImagAsDouble()} now
tries to convert an object to a @ref{197,,complex} instance using its
@code{__complex__()} method before falling back to the @code{__float__()}
method. Patch by Sergey B Kirpichev.

@item 
gh-94606@footnote{https://github.com/python/cpython/issues/94606}: Fix UnicodeEncodeError when @code{email.message.get_payload()}
reads a message with a Unicode surrogate character and the message content
is not well-formed for surrogateescape encoding. Patch by Sidney
Markowitz.

@item 
bpo-21861@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21861}: Use the object’s actual class name in
@code{_io.FileIO.__repr__()}, @code{_io._WindowsConsoleIO()} and
@code{_io.TextIOWrapper.__repr__()}, to make these methods subclass
friendly.

@item 
bpo-45369@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45369}: Remove LibreSSL workarounds as per 
@geindex Python 향상 제안; PEP 644
PEP 644@footnote{https://peps.python.org/pep-0644/}.

@item 
bpo-34392@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34392}: Added @ref{558,,sys._is_interned()}.
@end itemize

@node Library<62>,Documentation<19>,Core and Builtins<57>,Python 3 13 0 alpha 3
@anchor{whatsnew/changelog id259}@anchor{1a14}
@subsubsection Library



@itemize -

@item 
gh-114077@footnote{https://github.com/python/cpython/issues/114077}: Fix possible @ref{a81,,OverflowError} in
@ref{105c,,socket.socket.sendfile()} when pass `count' larger than 2 GiB on
32-bit platform.

@item 
gh-111803@footnote{https://github.com/python/cpython/issues/111803}: @ref{b0,,plistlib} now supports loading more deeply nested lists
in binary format.

@item 
gh-114014@footnote{https://github.com/python/cpython/issues/114014}: Fixed a bug in @ref{213,,fractions.Fraction} where an invalid
string using @code{d} in the decimals part creates a different error compared
to other invalid letters/characters. Patch by Jeremiah Gabriel Pascual.

@item 
gh-108364@footnote{https://github.com/python/cpython/issues/108364}: @ref{54f,,sqlite3.Connection.iterdump()} now ensures that foreign
key support is disabled before dumping the database schema, if there is
any foreign key violation. Patch by Erlend E. Aasland and Mariusz
Felisiak.

@item 
gh-113971@footnote{https://github.com/python/cpython/issues/113971}: The @ref{2cb,,zipfile.ZipInfo} previously protected
@code{._compresslevel} attribute has been made public as @code{.compress_level}
with the old @code{_compresslevel} name remaining available as a property to
retain compatibility.

@item 
gh-113877@footnote{https://github.com/python/cpython/issues/113877}: Fix @ref{f6,,tkinter} method @code{winfo_pathname()} on 64-bit
Windows.

@item 
gh-113868@footnote{https://github.com/python/cpython/issues/113868}: Added @ref{1a15,,mmap.MAP_NORESERVE}, @ref{1a16,,mmap.MAP_NOEXTEND},
@ref{1a17,,mmap.MAP_HASSEMAPHORE}, @ref{1a18,,mmap.MAP_NOCACHE},
@ref{1a19,,mmap.MAP_JIT}, @ref{1a1a,,mmap.MAP_RESILIENT_CODESIGN},
@ref{1a1b,,mmap.MAP_RESILIENT_MEDIA}, @ref{1a1c,,mmap.MAP_32BIT},
@ref{1a1d,,mmap.MAP_TRANSLATED_ALLOW_EXECUTE}, @ref{1a1e,,mmap.MAP_UNIX03} and
@ref{1a1f,,mmap.MAP_TPRO}. All of them are @code{mmap(2)} flags on macOS.

@item 
gh-113848@footnote{https://github.com/python/cpython/issues/113848}: @ref{4d2,,asyncio.TaskGroup()} and @ref{813,,asyncio.timeout()} context
managers now handle @ref{4d5,,CancelledError} subclasses as well as
exact @code{CancelledError}.

@item 
gh-113661@footnote{https://github.com/python/cpython/issues/113661}: unittest runner: Don’t exit 5 if tests were skipped. The
intention of exiting 5 was to detect issues where the test suite wasn’t
discovered at all. If we skipped tests, it was correctly discovered.

@item 
gh-96037@footnote{https://github.com/python/cpython/issues/96037}: Insert @ref{a36,,TimeoutError} in the context of the exception that
was raised during exiting an expired @ref{813,,asyncio.timeout()} block.

@item 
gh-113781@footnote{https://github.com/python/cpython/issues/113781}: Silence unraisable AttributeError when warnings are emitted
during Python finalization.

@item 
gh-113238@footnote{https://github.com/python/cpython/issues/113238}: Add @code{Anchor} to @code{importlib.resources} (in order for the
code to comply with the documentation)

@item 
gh-111693@footnote{https://github.com/python/cpython/issues/111693}: @ref{1a20,,asyncio.Condition.wait()} now re-raises the same
@code{CancelledError} instance that may have caused it to be interrupted.
Fixed race condition in @ref{1a21,,asyncio.Semaphore.acquire()} when interrupted
with a @code{CancelledError}.

@item 
gh-113791@footnote{https://github.com/python/cpython/issues/113791}: Add @code{CLOCK_MONOTONIC_RAW_APPROX} and
@code{CLOCK_UPTIME_RAW_APPROX} to @ref{f4,,time} on macOS. These are clocks
available on macOS 10.12 or later.

@item 
gh-112932@footnote{https://github.com/python/cpython/issues/112932}: Restore the ability for @ref{137,,zipfile} to @code{extractall} from
zip files with a “/” directory entry in them as is commonly added to zips
by some wiki or bug tracker data exporters.

@item 
gh-113568@footnote{https://github.com/python/cpython/issues/113568}: Raise deprecation warnings from @ref{6cc,,pathlib.PurePath} and
not its private base class @code{PurePathBase}.

@item 
gh-113594@footnote{https://github.com/python/cpython/issues/113594}: Fix @ref{886,,UnicodeEncodeError} in @ref{3f,,email} when re-fold
lines that contain unknown-8bit encoded part followed by non-unknown-8bit
encoded part.

@item 
gh-113538@footnote{https://github.com/python/cpython/issues/113538}: In @code{asyncio.StreamReaderProtocol.connection_made()}, there
is callback that logs an error if the task wrapping the “connected
callback” fails. This callback would itself fail if the task was
cancelled. Prevent this by checking whether the task was cancelled first.
If so, close the transport but don’t log an error.

@item 
gh-113626@footnote{https://github.com/python/cpython/issues/113626}: Add support for the `allow_code' argument in the @ref{91,,marshal}
module. Passing @code{allow_code=False} prevents serialization and
de-serialization of code objects which is incompatible between Python
versions.

@item 
gh-85567@footnote{https://github.com/python/cpython/issues/85567}: Fix resource warnings for unclosed files in @ref{ab,,pickle} and
@ref{ac,,pickletools} command line interfaces.

@item 
gh-113537@footnote{https://github.com/python/cpython/issues/113537}: Support loads @code{str} in @ref{b49,,plistlib.loads()}.

@item 
gh-89850@footnote{https://github.com/python/cpython/issues/89850}: Add default implementations of
@ref{190d,,pickle.Pickler.persistent_id()} and
@ref{1915,,pickle.Unpickler.persistent_load()} methods in the C implementation.
Calling @code{super().persistent_id()} and @code{super().persistent_load()} in
subclasses of the C implementation of @ref{c12,,pickle.Pickler} and
@ref{177f,,pickle.Unpickler} classes no longer causes infinite recursion.

@item 
gh-113569@footnote{https://github.com/python/cpython/issues/113569}: Indicate if there were no actual calls in unittest
@ref{1a22,,assert_has_calls()} failure.

@item 
gh-101225@footnote{https://github.com/python/cpython/issues/101225}: Increase the backlog for
@ref{1a23,,multiprocessing.connection.Listener} objects created by
@code{multiprocessing.manager} and @code{multiprocessing.resource_sharer}
to significantly reduce the risk of getting a connection refused error
when creating a @ref{12e5,,multiprocessing.connection.Connection} to them.

@item 
gh-113568@footnote{https://github.com/python/cpython/issues/113568}: Raise audit events from @ref{266,,pathlib.Path} and not its
private base class @code{PathBase}.

@item 
gh-113543@footnote{https://github.com/python/cpython/issues/113543}: Make sure that @code{webbrowser.MacOSXOSAScript} sends
@code{webbrowser.open} audit event.

@item 
gh-113028@footnote{https://github.com/python/cpython/issues/113028}: When a second reference to a string appears in the input to
@ref{ab,,pickle}, and the Python implementation is in use, we are guaranteed
that a single copy gets pickled and a single object is shared when
reloaded. Previously, in protocol 0, when a string contained certain
characters (e.g. newline) it resulted in duplicate objects.

@item 
gh-113421@footnote{https://github.com/python/cpython/issues/113421}: Fix multiprocessing logger for @code{%(filename)s}.

@item 
gh-111784@footnote{https://github.com/python/cpython/issues/111784}: Fix segfaults in the @code{_elementtree} module. Fix first
segfault during deallocation of @code{_elementtree.XMLParser} instances by
keeping strong reference to @code{pyexpat} module in module state for capsule
lifetime. Fix second segfault which happens in the same deallocation
process  by keeping strong reference to @code{_elementtree} module in
@code{XMLParser} structure for @code{_elementtree} module lifetime.

@item 
gh-113407@footnote{https://github.com/python/cpython/issues/113407}: Fix import of @ref{10d,,unittest.mock} when CPython is built
without docstrings.

@item 
gh-113320@footnote{https://github.com/python/cpython/issues/113320}: Fix regression in Python 3.12 where @ref{569,,Protocol}
classes that were not marked as @ref{673,,runtime-checkable} would be unnecessarily introspected,
potentially causing exceptions to be raised if the protocol had
problematic members. Patch by Alex Waygood.

@item 
gh-53502@footnote{https://github.com/python/cpython/issues/53502}: Add a new option @code{aware_datetime} in @ref{b0,,plistlib} to loads
or dumps aware datetime.

@item 
gh-113358@footnote{https://github.com/python/cpython/issues/113358}: Fix rendering tracebacks with exceptions with a broken
__getattr__

@item 
gh-113214@footnote{https://github.com/python/cpython/issues/113214}: Fix an @code{AttributeError} during asyncio SSL protocol aborts in
SSL-over-SSL scenarios.

@item 
gh-113246@footnote{https://github.com/python/cpython/issues/113246}: Update bundled pip to 23.3.2.

@item 
gh-87264@footnote{https://github.com/python/cpython/issues/87264}: Fixed tarfile list() method to show file type.

@item 
gh-112182@footnote{https://github.com/python/cpython/issues/112182}: @code{asyncio.futures.Future.set_exception()} now transforms
@ref{df4,,StopIteration} into @ref{244,,RuntimeError} instead of hanging or other
misbehavior. Patch contributed by Jamie Phan.

@item 
gh-113225@footnote{https://github.com/python/cpython/issues/113225}: Speed up @ref{537,,pathlib.Path.glob()} by using
@ref{19f8,,os.DirEntry.path} where possible.

@item 
gh-113149@footnote{https://github.com/python/cpython/issues/113149}: Improve error message when a JSON array or object contains a
trailing comma. Patch by Carson Radtke.

@item 
gh-113117@footnote{https://github.com/python/cpython/issues/113117}: The @ref{dc,,subprocess} module can now use the
@ref{52e,,os.posix_spawn()} function with @code{close_fds=True} on platforms where
@code{posix_spawn_file_actions_addclosefrom_np} is available. Patch by Jakub
Kulik.

@item 
gh-113199@footnote{https://github.com/python/cpython/issues/113199}: Make @code{http.client.HTTPResponse.read1} and
@code{http.client.HTTPResponse.readline} close IO after reading all data when
content length is known. Patch by Illia Volochii.

@item 
gh-113191@footnote{https://github.com/python/cpython/issues/113191}: Add support of @ref{52a,,os.fchmod()} and a file descriptor in
@ref{529,,os.chmod()} on Windows.

@item 
gh-113188@footnote{https://github.com/python/cpython/issues/113188}: Fix @ref{1a24,,shutil.copymode()} and @ref{1333,,shutil.copystat()} on
Windows. Previously they worked differently if `dst' is a symbolic link:
they modified the permission bits of `dst' itself rather than the file it
points to if `follow_symlinks' is true or `src' is not a symbolic link,
and did not modify the permission bits if `follow_symlinks' is false and
`src' is a symbolic link.

@item 
gh-113119@footnote{https://github.com/python/cpython/issues/113119}: @ref{52e,,os.posix_spawn()} now accepts @code{env=None}, which makes
the newly spawned process use the current process environment. Patch by
Jakub Kulik.

@item 
gh-113202@footnote{https://github.com/python/cpython/issues/113202}: Add a @code{strict} option to @code{batched()} in the @code{itertools}
module.

@item 
gh-61648@footnote{https://github.com/python/cpython/issues/61648}: Detect line numbers of properties in doctests.

@item 
gh-113175@footnote{https://github.com/python/cpython/issues/113175}: Sync with importlib_metadata 7.0, including improved type
annotations, fixed issue with symlinked packages in
@code{package_distributions}, added @code{EntryPoints.__repr__}, introduced the
@code{diagnose} script, added @code{Distribution.origin} property, and removed
deprecated @code{EntryPoint} access by numeric index (tuple behavior).

@item 
gh-59616@footnote{https://github.com/python/cpython/issues/59616}: Add support of @ref{528,,os.lchmod()} and the `follow_symlinks'
argument in @ref{529,,os.chmod()} on Windows. Note that the default value of
`follow_symlinks' in @code{os.lchmod()} is @code{False} on Windows.

@item 
gh-112559@footnote{https://github.com/python/cpython/issues/112559}: @ref{1339,,signal.signal()} and @ref{1a25,,signal.getsignal()} no longer
call @code{repr} on callable handlers. @ref{2f3,,asyncio.run()} and
@ref{194e,,asyncio.Runner.run()} no longer call @code{repr} on the task results.
Patch by Yilei Yang.

@item 
gh-112962@footnote{https://github.com/python/cpython/issues/112962}: @ref{3c,,dis} module functions add cache information to the
@ref{203,,Instruction} instance rather than creating fake
@code{Instruction} instances to represent the cache entries.

@item 
gh-112989@footnote{https://github.com/python/cpython/issues/112989}: Reduce overhead to connect sockets with @ref{b,,asyncio}
SelectorEventLoop.

@item 
gh-112970@footnote{https://github.com/python/cpython/issues/112970}: Use @code{closefrom()} on Linux where available (e.g.
glibc-2.34), rather than only FreeBSD.

@item 
gh-110190@footnote{https://github.com/python/cpython/issues/110190}: Fix ctypes structs with array on PPC64LE platform by setting
@code{MAX_STRUCT_SIZE} to 64 in stgdict. Patch by Diego Russo.

@item 
gh-112540@footnote{https://github.com/python/cpython/issues/112540}: The statistics.geometric_mean() function now returns zero for
datasets containing a zero.  Formerly, it would raise an exception.

@item 
gh-87286@footnote{https://github.com/python/cpython/issues/87286}: Added @code{LOG_FTP}, @code{LOG_NETINFO},
@code{LOG_REMOTEAUTH}, @code{LOG_INSTALL}, @code{LOG_RAS}, and
@code{LOG_LAUNCHD} tot the @ref{e2,,syslog} module, all of them constants
on used on macOS.

@item 
gh-112800@footnote{https://github.com/python/cpython/issues/112800}: Fix @ref{b,,asyncio} @code{SubprocessTransport.close()} not to throw
@code{PermissionError} when used with setuid executables.

@item 
gh-51944@footnote{https://github.com/python/cpython/issues/51944}: Add the following constants to the @ref{e7,,termios} module. These
values are present in macOS system headers: @code{ALTWERASE}, @code{B14400},
@code{B28800}, @code{B7200}, @code{B76800}, @code{CCAR_OFLOW}, @code{CCTS_OFLOW},
@code{CDSR_OFLOW}, @code{CDTR_IFLOW}, @code{CIGNORE}, @code{CRTS_IFLOW}, @code{EXTPROC},
@code{IUTF8}, @code{MDMBUF}, @code{NL2}, @code{NL3}, @code{NOKERNINFO}, @code{ONOEOT},
@code{OXTABS}, @code{VDSUSP}, @code{VSTATUS}.

@item 
gh-79325@footnote{https://github.com/python/cpython/issues/79325}: Fix an infinite recursion error in
@ref{1439,,tempfile.TemporaryDirectory()} cleanup on Windows.

@item 
gh-94692@footnote{https://github.com/python/cpython/issues/94692}: @ref{356,,shutil.rmtree()} now only catches OSError exceptions.
Previously a symlink attack resistant version of @code{shutil.rmtree()} could
ignore or pass to the error handler arbitrary exception when invalid
arguments were provided.

@item 
gh-112736@footnote{https://github.com/python/cpython/issues/112736}: The use of del-safe symbols in @code{subprocess} was refactored to
allow for use in cross-platform build environments.

@item 
gh-112727@footnote{https://github.com/python/cpython/issues/112727}: Speed up @ref{1a26,,pathlib.Path.absolute()}. Patch by Barney Gale.

@item 
gh-74690@footnote{https://github.com/python/cpython/issues/74690}: Speedup @ref{9c4,,issubclass()} checks against simple
@ref{673,,runtime-checkable protocols} by around
6%. Patch by Alex Waygood.

@item 
gh-74690@footnote{https://github.com/python/cpython/issues/74690}: Speedup @ref{2ad,,isinstance()} checks by roughly 20% for
@ref{673,,runtime-checkable protocols} that only
have one callable member. Speedup @ref{9c4,,issubclass()} checks for these
protocols by roughly 10%. Patch by Alex Waygood.

@item 
gh-112645@footnote{https://github.com/python/cpython/issues/112645}: Remove deprecation error on passing @code{onerror} to
@ref{356,,shutil.rmtree()}.

@item 
gh-112640@footnote{https://github.com/python/cpython/issues/112640}: Add @code{kwdefaults} parameter to @ref{a83,,types.FunctionType} to
set default keyword argument values.

@item 
gh-112622@footnote{https://github.com/python/cpython/issues/112622}: Ensure @code{name} parameter is passed to event loop in
@ref{1c9,,asyncio.create_task()}.

@item 
gh-112618@footnote{https://github.com/python/cpython/issues/112618}: Fix a caching bug relating to @ref{b37,,typing.Annotated}.
@code{Annotated[str, True]} is no longer identical to @code{Annotated[str, 1]}.

@item 
gh-112334@footnote{https://github.com/python/cpython/issues/112334}: Fixed a performance regression in 3.12’s @ref{dc,,subprocess} on
Linux where it would no longer use the fast-path @code{vfork()} system call
when it could have due to a logic bug, instead falling back to the safe
but slower @code{fork()}.

Also fixed a second 3.12.0 potential security bug.  If a value of
@code{extra_groups=[]} was passed to @ref{4b8,,subprocess.Popen} or related APIs,
the underlying @code{setgroups(0, NULL)} system call to clear the groups list
would not be made in the child process prior to @code{exec()}.

This was identified via code inspection in the process of fixing the first
bug.

@item 
gh-110190@footnote{https://github.com/python/cpython/issues/110190}: Fix ctypes structs with array on Arm platform by setting
@code{MAX_STRUCT_SIZE} to 32 in stgdict. Patch by Diego Russo.

@item 
gh-81194@footnote{https://github.com/python/cpython/issues/81194}: Fix a crash in @ref{c23,,socket.if_indextoname()} with specific value
(UINT_MAX). Fix an integer overflow in @code{socket.if_indextoname()} on
64-bit non-Windows platforms.

@item 
gh-112578@footnote{https://github.com/python/cpython/issues/112578}: Fix a spurious @ref{4d8,,RuntimeWarning} when executing the
@ref{137,,zipfile} module.

@item 
gh-112516@footnote{https://github.com/python/cpython/issues/112516}: Update the bundled copy of pip to version 23.3.1.

@item 
gh-112510@footnote{https://github.com/python/cpython/issues/112510}: Add @ref{1a27,,readline.backend} for the backend readline uses
(@code{editline} or @code{readline})

@item 
gh-112328@footnote{https://github.com/python/cpython/issues/112328}: [Enum] Make @code{EnumDict}, @code{EnumDict.member_names},
@code{EnumType._add_alias_} and @code{EnumType._add_value_alias_} public.

@item 
gh-112509@footnote{https://github.com/python/cpython/issues/112509}: Fix edge cases that could cause a key to be present in both the
@code{__required_keys__} and @code{__optional_keys__} attributes of a
@ref{332,,typing.TypedDict}. Patch by Jelle Zijlstra.

@item 
gh-101336@footnote{https://github.com/python/cpython/issues/101336}: Add @code{keep_alive} keyword parameter for
@code{AbstractEventLoop.create_server()} and
@code{BaseEventLoop.create_server()}.

@item 
gh-63284@footnote{https://github.com/python/cpython/issues/63284}: Added support for TLS-PSK (pre-shared key) mode to the
@ref{d5,,ssl} module.

@item 
gh-112414@footnote{https://github.com/python/cpython/issues/112414}: Fix regression in Python 3.12 where calling @ref{1c1,,repr()} on a
module that had been imported using a custom @ref{1a28,,loader} could fail
with @ref{5ee,,AttributeError}. Patch by Alex Waygood.

@item 
gh-112358@footnote{https://github.com/python/cpython/issues/112358}: Revert change to @ref{1761,,struct.Struct} initialization that
broke some cases of subclassing.

@item 
gh-112405@footnote{https://github.com/python/cpython/issues/112405}: Optimize @ref{2fd,,pathlib.PurePath.relative_to()}. Patch by Alex
Waygood.

@item 
gh-94722@footnote{https://github.com/python/cpython/issues/94722}: Fix bug where comparison between instances of
@ref{1a29,,DocTest} fails if one of them has @code{None} as its lineno.

@item 
gh-112361@footnote{https://github.com/python/cpython/issues/112361}: Speed up a small handful of @ref{a8,,pathlib} methods by removing
some temporary objects.

@item 
gh-112345@footnote{https://github.com/python/cpython/issues/112345}: Improve error message when trying to call @ref{9c4,,issubclass()}
against a @ref{569,,typing.Protocol} that has non-method members. Patch by
Randolf Scholz.

@item 
gh-112137@footnote{https://github.com/python/cpython/issues/112137}: Change @ref{3c,,dis} output to display no-lineno as “–” instead
of “None”.

@item 
gh-112332@footnote{https://github.com/python/cpython/issues/112332}: Deprecate the @code{exc_type} field of
@ref{561,,traceback.TracebackException}. Add @code{exc_type_str} to replace it.

@item 
gh-81620@footnote{https://github.com/python/cpython/issues/81620}: Add extra tests for @ref{6d6,,random.binomialvariate()}

@item 
gh-112292@footnote{https://github.com/python/cpython/issues/112292}: Fix a crash in @ref{bf,,readline} when imported from a sub
interpreter. Patch by Anthony Shaw

@item 
gh-77621@footnote{https://github.com/python/cpython/issues/77621}: Slightly improve the import time of the @ref{a8,,pathlib} module by
deferring some imports. Patch by Barney Gale.

@item 
gh-112137@footnote{https://github.com/python/cpython/issues/112137}: Change @ref{3c,,dis} output to display logical labels for jump
targets instead of offsets.

@item 
gh-112139@footnote{https://github.com/python/cpython/issues/112139}: Add @code{Signature.format()} to format signatures to string
with extra options. And use it in @ref{ba,,pydoc} to render more readable
signatures that have new lines between parameters.

@item 
gh-112105@footnote{https://github.com/python/cpython/issues/112105}: Make @ref{1a2a,,readline.set_completer_delims()} work with libedit

@item 
gh-106922@footnote{https://github.com/python/cpython/issues/106922}: Display multiple lines with @code{traceback} when errors span
multiple lines.

@item 
gh-111874@footnote{https://github.com/python/cpython/issues/111874}: When creating a @ref{331,,typing.NamedTuple} class, ensure
@ref{e47,,__set_name__()} is called on all objects that define
@code{__set_name__} and exist in the values of the @code{NamedTuple} class’s
class dictionary. Patch by Alex Waygood.

@item 
gh-68166@footnote{https://github.com/python/cpython/issues/68166}: Add support of the “vsapi” element type in
@ref{55f,,tkinter.ttk.Style.element_create()}.

@item 
gh-110275@footnote{https://github.com/python/cpython/issues/110275}: Named tuple’s methods @code{_replace()} and @code{__replace__()} now
raise TypeError instead of ValueError for invalid keyword arguments.

@item 
gh-99367@footnote{https://github.com/python/cpython/issues/99367}: Do not mangle @code{sys.path[0]} in @ref{aa,,pdb} if safe_path is set

@item 
gh-111615@footnote{https://github.com/python/cpython/issues/111615}: Fix a regression caused by a fix to gh-93162@footnote{https://github.com/python/cpython/issues/93162} whereby you
couldn’t configure a @code{QueueHandler} without specifying handlers.

@item 
gh-75666@footnote{https://github.com/python/cpython/issues/75666}: Fix the behavior of @ref{f6,,tkinter} widget’s @code{unbind()} method
with two arguments. Previously, @code{widget.unbind(sequence, funcid)}
destroyed the current binding for `sequence', leaving `sequence' unbound,
and deleted the `funcid' command. Now it removes only `funcid' from the
binding for `sequence', keeping other commands, and deletes the `funcid'
command. It leaves `sequence' unbound only if `funcid' was the last bound
command.

@item 
gh-67790@footnote{https://github.com/python/cpython/issues/67790}: Implement basic formatting support (minimum width, alignment,
fill) for @ref{213,,fractions.Fraction}.

@item 
gh-111049@footnote{https://github.com/python/cpython/issues/111049}: Fix crash during garbage collection of the @ref{10a3,,io.BytesIO}
buffer object.

@item 
gh-102980@footnote{https://github.com/python/cpython/issues/102980}: Redirect the output of @code{interact} command of @ref{aa,,pdb} to
the same channel as the debugger. Add tests and improve docs.

@item 
gh-102988@footnote{https://github.com/python/cpython/issues/102988}: @ref{4f3,,email.utils.getaddresses()} and
@ref{4f4,,email.utils.parseaddr()} now return @code{('@w{'}, '@w{'})} 2-tuples in more
situations where invalid email addresses are encountered instead of
potentially inaccurate values. Add optional `strict' parameter to these
two functions: use @code{strict=False} to get the old behavior, accept
malformed inputs. @code{getattr(email.utils, 'supports_strict_parsing',
False)} can be use to check if the `strict' parameter is available. Patch
by Thomas Dwyer and Victor Stinner to improve the 
@geindex Common Vulnerabilities and Exposures; CVE 2023-27043
CVE 2023-27043@footnote{https://www.cve.org/CVERecord?id=CVE-2023-27043} fix.

@item 
gh-52161@footnote{https://github.com/python/cpython/issues/52161}: @ref{1a2b,,cmd.Cmd.do_help()} now cleans docstrings with
@ref{1a2c,,inspect.cleandoc()} before writing them. Patch by Filip Łapkiewicz.

@item 
gh-82300@footnote{https://github.com/python/cpython/issues/82300}: Add @code{track} parameter to
@ref{19d8,,multiprocessing.shared_memory.SharedMemory} that allows using
shared memory blocks without having to register with the POSIX resource
tracker that automatically releases them upon process exit.

@item 
gh-110109@footnote{https://github.com/python/cpython/issues/110109}: Add private @code{pathlib._PurePathBase} class: a base class for
@ref{6cc,,pathlib.PurePath} that omits certain magic methods. It may be made
public (along with @code{_PathBase}) in future.

@item 
gh-109858@footnote{https://github.com/python/cpython/issues/109858}: Protect @ref{137,,zipfile} from “quoted-overlap” zipbomb. It now
raises BadZipFile when try to read an entry that overlaps with other entry
or central directory.

@item 
gh-109786@footnote{https://github.com/python/cpython/issues/109786}: Fix possible reference leaks and crash when re-enter the
@code{__next__()} method of @ref{a16,,itertools.pairwise}.

@item 
gh-91539@footnote{https://github.com/python/cpython/issues/91539}: Small (10 - 20%) and trivial performance improvement of
@code{urllib.request.getproxies_environment()}, typically useful when there
are many environment variables to go over.

@item 
gh-103363@footnote{https://github.com/python/cpython/issues/103363}: Add `follow_symlinks' keyword-only argument to
@ref{53b,,pathlib.Path.owner()} and @ref{53c,,group()}, defaulting to
@code{True}.

@item 
gh-102130@footnote{https://github.com/python/cpython/issues/102130}: Support tab completion in @ref{1a,,cmd} for @code{editline}.

@item 
gh-99437@footnote{https://github.com/python/cpython/issues/99437}: @ref{4a5,,runpy.run_path()} now decodes path-like objects, making
sure __file__ and sys.argv[0] of the module being run are always strings.

@item 
gh-104003@footnote{https://github.com/python/cpython/issues/104003}: Add @ref{48a,,warnings.deprecated()}, a decorator to mark deprecated
functions to static type checkers and to warn on usage of deprecated
classes and functions. See 
@geindex Python 향상 제안; PEP 702
PEP 702@footnote{https://peps.python.org/pep-0702/}. Patch by Jelle Zijlstra.

@item 
gh-103708@footnote{https://github.com/python/cpython/issues/103708}: Make hardcoded python name, a configurable parameter so that
different implementations of python can override it instead of making huge
diffs in sysconfig.py

@item 
gh-66515@footnote{https://github.com/python/cpython/issues/66515}: @ref{1a2d,,mailbox.MH} now supports folders that do not contain a
@code{.mh_sequences} file (e.g. Claws Mail IMAP-cache folders). Patch by
Serhiy Storchaka.

@item 
gh-83162@footnote{https://github.com/python/cpython/issues/83162}: Renamed @code{re.error} to @code{PatternError} for clarity, and
kept @code{re.error} for backward compatibility. Patch by Matthias
Bussonnier and Adam Chhina.

@item 
gh-91133@footnote{https://github.com/python/cpython/issues/91133}: Fix a bug in @ref{1439,,tempfile.TemporaryDirectory} cleanup, which
now no longer dereferences symlinks when working around file system
permission errors.

@item 
bpo-43153@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43153}: On Windows, @code{tempfile.TemporaryDirectory} previously masked a
@code{PermissionError} with @code{NotADirectoryError} during directory cleanup.
It now correctly raises @code{PermissionError} if errors are not ignored.
Patch by Andrei Kulakov and Ken Jin.

@item 
bpo-32731@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32731}: @ref{658,,getpass.getuser()} now raises @ref{2c0,,OSError} for all
failures rather than @ref{659,,ImportError} on systems lacking the @ref{b7,,pwd}
module or @ref{5e5,,KeyError} if the password database is empty.

@item 
bpo-34321@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34321}: @ref{518,,mmap.mmap} now has a `trackfd' parameter on Unix; if it
is @code{False}, the file descriptor specified by `fileno' will not be
duplicated.

@item 
bpo-35332@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35332}: The @ref{356,,shutil.rmtree()} function now ignores errors when
calling @ref{d6a,,os.close()} when `ignore_errors' is @code{True}, and
@code{os.close()} no longer retried after error.

@item 
bpo-35928@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35928}: @ref{9be,,io.TextIOWrapper} now correctly handles the decoding
buffer after @code{read()} and @code{write()}.

@item 
bpo-26791@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26791}: @ref{c50,,shutil.move()} now moves a symlink into a directory when
that directory is the target of the symlink.  This provides the same
behavior as the mv shell command.  The previous behavior raised an
exception.  Patch by Jeffrey Kintscher.

@item 
bpo-41422@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41422}: Fixed memory leaks of @ref{c12,,pickle.Pickler} and
@ref{177f,,pickle.Unpickler} involving cyclic references via the internal
memo mapping.

@item 
bpo-19821@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19821}: The @code{pydoc.ispackage()} function has been deprecated.

@item 
bpo-40262@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40262}: The @code{ssl.SSLSocket.recv_into()} method no longer requires
the `buffer' argument to implement @code{__len__} and supports buffers with
arbitrary item size.

@item 
bpo-39912@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39912}: @ref{16ae,,warnings.filterwarnings()} and
@ref{8cf,,warnings.simplefilter()} now raise appropriate exceptions instead of
@code{AssertionError}. Patch contributed by Rémi Lapeyre.

@item 
bpo-37260@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37260}: Fixed a race condition in @ref{356,,shutil.rmtree()} in which
directory entries removed by another process or thread while
@code{shutil.rmtree()} is running can cause it to raise FileNotFoundError.
Patch by Jeffrey Kintscher.

@item 
bpo-36959@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36959}: Fix some error messages for invalid ISO format string
combinations in @code{strptime()} that referred to directives not contained
in the format string. Patch by Gordon P. Hemsley.

@item 
bpo-18060@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18060}: Fixed a class inheritance issue that can cause segfaults when
deriving two or more levels of subclasses from a base class of Structure
or Union.

@item 
bpo-29779@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29779}: Add a new 
@geindex PYTHON_HISTORY
@geindex 환경 변수; PYTHON_HISTORY
@ref{4b1,,PYTHON_HISTORY} environment variable to set
the location of a @code{.python_history} file.

@item 
bpo-21360@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21360}: @ref{65c,,mailbox.Maildir} now ignores files with a leading dot.
@end itemize

@node Documentation<19>,Tests<18>,Library<62>,Python 3 13 0 alpha 3
@anchor{whatsnew/changelog id260}@anchor{1a2e}
@subsubsection Documentation



@itemize -

@item 
gh-111699@footnote{https://github.com/python/cpython/issues/111699}: Relocate @code{smtpd} deprecation notice to its own section rather
than under @code{locale} in What’s New in Python 3.12 document

@item 
gh-110746@footnote{https://github.com/python/cpython/issues/110746}: Improved markup for valid options/values for methods
ttk.treeview.column and ttk.treeview.heading, and for Layouts.

@item 
gh-95649@footnote{https://github.com/python/cpython/issues/95649}: Document that the @ref{b,,asyncio} module contains code taken from
v0.16.0 of the uvloop project@footnote{https://github.com/MagicStack/uvloop/tree/v0.16.0}, as well as the
required MIT licensing information.
@end itemize

@node Tests<18>,Build<21>,Documentation<19>,Python 3 13 0 alpha 3
@anchor{whatsnew/changelog id261}@anchor{1a2f}
@subsubsection Tests



@itemize -

@item 
gh-111798@footnote{https://github.com/python/cpython/issues/111798}: Disable @code{test_super_deep()} from @code{test_call} under pydebug
builds on WASI; the stack depth is too small to make the test useful.

@item 
gh-111801@footnote{https://github.com/python/cpython/issues/111801}: Lower the recursion limit in @code{test_isinstance} for
@code{test_infinitely_many_bases()}. This prevents a stack overflow on a
pydebug build of WASI.

@item 
gh-111802@footnote{https://github.com/python/cpython/issues/111802}: Specify a low recursion depth for @code{test_bad_getattr()} in
@code{test.pickletester} to avoid exhausting the stack under a pydebug build
for WASI.

@item 
gh-44626@footnote{https://github.com/python/cpython/issues/44626}: Fix @ref{531,,os.path.isabs()} incorrectly returning @code{True} when
given a path that starts with exactly one (back)slash on Windows.

Fix @code{pathlib.PureWindowsPath.is_absolute()} incorrectly returning
@code{False} for some paths beginning with two (back)slashes.

@item 
gh-113633@footnote{https://github.com/python/cpython/issues/113633}: Use module state for the _testcapi extension module.

@item 
gh-109980@footnote{https://github.com/python/cpython/issues/109980}: Fix @code{test_tarfile_vs_tar} in @code{test_shutil} for macOS, where
system tar can include more information in the archive than
@ref{6d9,,shutil.make_archive}.

@item 
gh-112769@footnote{https://github.com/python/cpython/issues/112769}: The tests now correctly compare zlib version when
@ref{1373,,zlib.ZLIB_RUNTIME_VERSION} contains non-integer suffixes. For
example zlib-ng defines the version as @code{1.3.0.zlib-ng}.

@item 
gh-112334@footnote{https://github.com/python/cpython/issues/112334}: Adds a regression test to verify that @code{vfork()} is used when
expected by @ref{dc,,subprocess} on vfork enabled POSIX systems (Linux).

@item 
gh-108927@footnote{https://github.com/python/cpython/issues/108927}: Fixed order dependence in running tests in the same process
when a test that has submodules (e.g. test_importlib) follows a test that
imports its submodule (e.g. test_importlib.util) and precedes a test (e.g.
test_unittest or test_compileall) that uses that submodule.

@item 
bpo-40648@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40648}: Test modes that file can get with chmod() on Windows.
@end itemize

@node Build<21>,Windows<19>,Tests<18>,Python 3 13 0 alpha 3
@anchor{whatsnew/changelog id262}@anchor{1a30}
@subsubsection Build



@itemize -

@item 
gh-114013@footnote{https://github.com/python/cpython/issues/114013}: Fix @code{Tools/wasm/wasi.py} to not include the path to
@code{python.wasm} as part of @code{HOSTRUNNER}. The environment variable is
meant to specify how to run the WASI host only, having @code{python.wasm} and
relevant flags appended to the @code{HOSTRUNNER}. This fixes @code{make test}
work.

@item 
gh-113258@footnote{https://github.com/python/cpython/issues/113258}: Changed the Windows build to write out generated frozen modules
into the build tree instead of the source tree.

@item 
gh-112305@footnote{https://github.com/python/cpython/issues/112305}: Fixed the @code{check-clean-src} step performed on out of tree
builds to detect errant @code{$(srcdir)/Python/frozen_modules/*.h} files and
recommend appropriate source tree cleanup steps to get a working build
again.

@item 
gh-112536@footnote{https://github.com/python/cpython/issues/112536}: Add support for thread sanitizer (TSAN)

@item 
gh-112867@footnote{https://github.com/python/cpython/issues/112867}: Fix the build for the case that WITH_PYMALLOC_RADIX_TREE=0 set.

@item 
gh-103065@footnote{https://github.com/python/cpython/issues/103065}: Introduce @code{Tools/wasm/wasi.py} to simplify doing a WASI
build.

@item 
bpo-11102@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11102}: The @ref{195f,,os.major()}, @ref{1961,,os.makedev()}, and @ref{1960,,os.minor()}
functions are now available on HP-UX v3.

@item 
bpo-36351@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36351}: Do not set ipv6type when cross-compiling.
@end itemize

@node Windows<19>,macOS<12>,Build<21>,Python 3 13 0 alpha 3
@anchor{whatsnew/changelog id263}@anchor{1a31}
@subsubsection Windows



@itemize -

@item 
gh-114096@footnote{https://github.com/python/cpython/issues/114096}: Process privileges that are activated for creating directory
junctions are now restored afterwards, avoiding behaviour changes in other
parts of the program.

@item 
gh-111877@footnote{https://github.com/python/cpython/issues/111877}: @ref{26d,,os.stat()} calls were returning incorrect time values for
files that could not be accessed directly.

@item 
gh-111973@footnote{https://github.com/python/cpython/issues/111973}: Update Windows installer to use SQLite 3.44.2.

@item 
gh-113009@footnote{https://github.com/python/cpython/issues/113009}: @ref{98,,multiprocessing}: On Windows, fix a race condition in
@code{Process.terminate()}: no longer set the @code{returncode} attribute to
always call @code{WaitForSingleObject()} in @code{Process.wait()}.  Previously,
sometimes the process was still running after @code{TerminateProcess()} even
if @code{GetExitCodeProcess()} is not @code{STILL_ACTIVE}. Patch by Victor
Stinner.

@item 
gh-86179@footnote{https://github.com/python/cpython/issues/86179}: Fixes path calculations when launching Python on Windows through
a symlink.

@item 
gh-71383@footnote{https://github.com/python/cpython/issues/71383}: Update Tcl/Tk in Windows installer to 8.6.13 with a patch to
suppress incorrect ThemeChanged warnings.

@item 
gh-111650@footnote{https://github.com/python/cpython/issues/111650}: Ensures the @code{Py_GIL_DISABLED} preprocessor variable is
defined in @code{pyconfig.h} so that extension modules written in C are
able to use it.

@item 
gh-112278@footnote{https://github.com/python/cpython/issues/112278}: Reduce the time cost for some functions in @ref{af,,platform} on
Windows if current user has no permission to the WMI.

@item 
gh-73427@footnote{https://github.com/python/cpython/issues/73427}: Deprecate @ref{33e,,sys._enablelegacywindowsfsencoding()}. Use
@geindex PYTHONLEGACYWINDOWSFSENCODING
@geindex 환경 변수; PYTHONLEGACYWINDOWSFSENCODING
@ref{33f,,PYTHONLEGACYWINDOWSFSENCODING} instead. Patch by Inada Naoki.

@item 
gh-87868@footnote{https://github.com/python/cpython/issues/87868}: Correctly sort and remove duplicate environment variables in
@code{_winapi.CreateProcess()}.

@item 
bpo-37308@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37308}: Fix mojibake in @ref{518,,mmap.mmap} when using a non-ASCII
`tagname' argument on Windows.
@end itemize

@node macOS<12>,IDLE<11>,Windows<19>,Python 3 13 0 alpha 3
@anchor{whatsnew/changelog id264}@anchor{1a32}
@subsubsection macOS



@itemize -

@item 
gh-113666@footnote{https://github.com/python/cpython/issues/113666}: Add the following constants to module @ref{d6,,stat}:
@code{UF_SETTABLE}, @code{UF_TRACKED}, @code{UF_DATAVAULT}, @code{SF_SUPPORTED},
@code{SF_SETTABLE}, @code{SF_SYNTHETIC}, @code{SF_RESTRICTED}, @code{SF_FIRMLINK} and
@code{SF_DATALESS}. The values @code{UF_SETTABLE}, @code{SF_SUPPORTED},
@code{SF_SETTABLE} and @code{SF_SYNTHETIC} are only available on macOS.

@item 
gh-113536@footnote{https://github.com/python/cpython/issues/113536}: @ref{f98,,os.waitid()} is now available on macOS

@item 
gh-110459@footnote{https://github.com/python/cpython/issues/110459}: Running @code{configure ... --with-openssl-rpath=X/Y/Z} no longer
fails to detect OpenSSL on macOS.

@item 
gh-74573@footnote{https://github.com/python/cpython/issues/74573}: Document that @ref{38,,dbm.ndbm} can silently corrupt DBM files on
updates when exceeding undocumented platform limits, and can crash
(segmentation fault) when reading such a corrupted file. (FB8919203)

@item 
gh-65701@footnote{https://github.com/python/cpython/issues/65701}: The @code{freeze} tool doesn’t work with framework builds of
Python. Document this and bail out early when running the tool with such a
build.

@item 
gh-87277@footnote{https://github.com/python/cpython/issues/87277}: webbrowser: Don’t look for X11 browsers on macOS. Those are
generally not used and probing for them can result in starting XQuartz
even if it isn’t used otherwise.

@item 
gh-111973@footnote{https://github.com/python/cpython/issues/111973}: Update macOS installer to use SQLite 3.44.2.

@item 
gh-108269@footnote{https://github.com/python/cpython/issues/108269}: Set @code{CFBundleAllowMixedLocalizations} to true in the
Info.plist for the framework, embedded Python.app and IDLE.app with
framework installs on macOS.  This allows applications to pick up the
user’s preferred locale when that’s different from english.

@item 
gh-102362@footnote{https://github.com/python/cpython/issues/102362}: Make sure the result of @code{sysconfig.get_plaform()} includes
at least a major and minor versions, even if @code{MACOSX_DEPLOYMENT_TARGET}
is set to only a major version during build to match the format expected
by pip.

@item 
gh-110017@footnote{https://github.com/python/cpython/issues/110017}: Disable a signal handling stress test on macOS due to a bug in
macOS (FB13453490).

@item 
gh-110820@footnote{https://github.com/python/cpython/issues/110820}: Make sure the preprocessor definitions for
@code{ALIGNOF_MAX_ALIGN_T}, @code{SIZEOF_LONG_DOUBLE} and
@code{HAVE_GCC_ASM_FOR_X64} are correct for Universal 2 builds on macOS.

@item 
gh-109981@footnote{https://github.com/python/cpython/issues/109981}: Use @code{/dev/fd} on macOS to determine the number of open files
in @code{test.support.os_helper.fd_count} to avoid a crash with “guarded”
file descriptors when probing for open files.
@end itemize

@node IDLE<11>,C API<21>,macOS<12>,Python 3 13 0 alpha 3
@anchor{whatsnew/changelog id265}@anchor{1a33}
@subsubsection IDLE



@itemize -

@item 
gh-72284@footnote{https://github.com/python/cpython/issues/72284}: Improve the lists of features, editor key bindings, and shell
key bingings in the IDLE doc.

@item 
gh-113903@footnote{https://github.com/python/cpython/issues/113903}: Fix rare failure of test.test_idle, in test_configdialog.

@item 
gh-113729@footnote{https://github.com/python/cpython/issues/113729}: Fix the “Help -> IDLE Doc” menu bug in 3.11.7 and 3.12.1.

@item 
gh-113269@footnote{https://github.com/python/cpython/issues/113269}: Fix test_editor hang on macOS Catalina.

@item 
gh-112898@footnote{https://github.com/python/cpython/issues/112898}: Fix processing unsaved files when quitting IDLE on macOS.

@item 
bpo-13586@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13586}: Enter the selected text when opening the “Replace” dialog.
@end itemize

@node C API<21>,,IDLE<11>,Python 3 13 0 alpha 3
@anchor{whatsnew/changelog id266}@anchor{1a34}
@subsubsection C API



@itemize -

@item 
gh-106560@footnote{https://github.com/python/cpython/issues/106560}: Fix redundant declarations in the public C API. Declare
PyBool_Type, PyLong_Type and PySys_Audit() only once. Patch by Victor
Stinner.

@item 
gh-112438@footnote{https://github.com/python/cpython/issues/112438}: Fix support of format units “es”, “et”, “es#”, and “et#” in
nested tuples in @ref{3c1,,PyArg_ParseTuple()}-like functions.

@item 
gh-111545@footnote{https://github.com/python/cpython/issues/111545}: Add @ref{425,,Py_HashPointer()} function to hash a pointer. Patch
by Victor Stinner.

@item 
gh-65210@footnote{https://github.com/python/cpython/issues/65210}: Change the declaration of the `keywords' parameter of
@ref{622,,PyArg_ParseTupleAndKeywords()} and
@ref{623,,PyArg_VaParseTupleAndKeywords()} for better compatibility with C++.
@end itemize

@node Python 3 13 0 alpha 2,Python 3 13 0 alpha 1,Python 3 13 0 alpha 3,Changelog
@anchor{whatsnew/changelog python-3-13-0-alpha-2}@anchor{1a35}
@subsection Python 3.13.0 alpha 2


`Release date: 2023-11-22'

@menu
* Core and Builtins: Core and Builtins<58>. 
* Library: Library<63>. 
* Tests: Tests<19>. 
* Build: Build<22>. 
* Windows: Windows<20>. 
* macOS: macOS<13>. 
* IDLE: IDLE<12>. 
* Tools/Demos: Tools/Demos<18>. 
* C API: C API<22>. 

@end menu

@node Core and Builtins<58>,Library<63>,,Python 3 13 0 alpha 2
@anchor{whatsnew/changelog id267}@anchor{1a36}
@subsubsection Core and Builtins



@itemize -

@item 
gh-112243@footnote{https://github.com/python/cpython/issues/112243}: Don’t include comments in f-string debug expressions. Patch by
Pablo Galindo

@item 
gh-112287@footnote{https://github.com/python/cpython/issues/112287}: Slightly optimize the Tier 2 (uop) interpreter by only loading
@code{oparg} and @code{operand} when needed. Also double the trace size limit
again, to 512 this time.

@item 
gh-112266@footnote{https://github.com/python/cpython/issues/112266}: Change docstrings of @ref{77c,,__dict__} and
@code{__weakref__}.

@item 
gh-111807@footnote{https://github.com/python/cpython/issues/111807}: Lower the max parser stack depth to 1000 under WASI debug
builds.

@item 
gh-111798@footnote{https://github.com/python/cpython/issues/111798}: When Python is built in debug mode, set the C recursion limit
to 500 instead of 1500. A debug build is likely built with low
optimization level which implies higher stack memory usage than a release
build. Patch by Victor Stinner.

@item 
gh-106529@footnote{https://github.com/python/cpython/issues/106529}: Enable translating unspecialized @code{FOR_ITER} to Tier 2.

@item 
gh-111916@footnote{https://github.com/python/cpython/issues/111916}: Make hashlib related modules thread-safe without the GIL

@item 
gh-81137@footnote{https://github.com/python/cpython/issues/81137}: Deprecate assignment to a function’s @code{__code__} field when the
new code object is of a mismatched type (e.g., from a generator to a plain
function).

@item 
gh-79932@footnote{https://github.com/python/cpython/issues/79932}: Raise exception if @ref{584,,frame.clear()} is called on a suspended
frame.

@item 
gh-81925@footnote{https://github.com/python/cpython/issues/81925}: Implement native thread ids for GNU KFreeBSD.

@item 
gh-111843@footnote{https://github.com/python/cpython/issues/111843}: Use exponential backoff to reduce the number of failed tier 2
optimization attempts by over 99%.

@item 
gh-110829@footnote{https://github.com/python/cpython/issues/110829}: Joining a thread now ensures the underlying OS thread has
exited. This is required for safer fork() in multi-threaded processes.

@item 
gh-109369@footnote{https://github.com/python/cpython/issues/109369}: Make sure that tier 2 traces are de-optimized if the code is
instrumented

@item 
gh-111772@footnote{https://github.com/python/cpython/issues/111772}: Specialize slot loads and stores for _Py_T_OBJECT as well as
Py_T_OBJECT_EX

@item 
gh-111666@footnote{https://github.com/python/cpython/issues/111666}: Speed up @ref{1a37,,BaseExceptionGroup.derive()},
@ref{1a38,,BaseExceptionGroup.subgroup()}, and @ref{18d9,,BaseExceptionGroup.split()}
by changing how they parse passed arguments.

@item 
gh-111654@footnote{https://github.com/python/cpython/issues/111654}: Fix runtime crash when some error happens in opcode
@code{LOAD_FROM_DICT_OR_DEREF}.

@item 
gh-111623@footnote{https://github.com/python/cpython/issues/111623}: Add support for sharing tuples between interpreters using the
cross-interpreter API.  Patch by Anthony Shaw.

@item 
gh-111354@footnote{https://github.com/python/cpython/issues/111354}: The oparg of @ref{1a39,,YIELD_VALUE} is now @code{1} if the
instruction is part of a yield-from or await, and @code{0} otherwise.

The SUSPENDED frame state is now split into @code{SUSPENDED} and
@code{SUSPENDED_YIELD_FROM}. This simplifies the code in @code{_PyGen_yf}.

@item 
gh-111520@footnote{https://github.com/python/cpython/issues/111520}: Merge the Tier 1 (bytecode) and Tier 2 (micro-ops) interpreters
together, moving the Tier 2 interpreter loop and switch into
@code{_PyEval_EvalFrameDefault()} in @code{Python/ceval.c}. The
@code{Python/executor.c} file is gone. Also the @code{TIER_ONE} and @code{TIER_TWO}
macros are now handled by the code generator.

`Beware!' This changes the environment variables to enable micro-ops and
their debugging to @code{PYTHON_UOPS} and @code{PYTHON_LLTRACE}.

@item 
gh-109181@footnote{https://github.com/python/cpython/issues/109181}: Speed up @code{Traceback} object creation by lazily compute
the line number. Patch by Pablo Galindo

@item 
gh-111420@footnote{https://github.com/python/cpython/issues/111420}: Allow type comments in parenthesized @code{with} statements

@item 
gh-111438@footnote{https://github.com/python/cpython/issues/111438}: Add support for sharing floats between interpreters using the
cross-interpreter API.  Patch by Anthony Shaw.

@item 
gh-111435@footnote{https://github.com/python/cpython/issues/111435}: Add support for sharing of @code{True} and @code{False} between
interpreters using the cross-interpreter API.  Patch by Anthony Shaw.

@item 
gh-102388@footnote{https://github.com/python/cpython/issues/102388}: Fix a bug where @code{iso2022_jp_3} and @code{iso2022_jp_2004} codecs
read out of bounds

@item 
gh-111366@footnote{https://github.com/python/cpython/issues/111366}: Fix an issue in the @ref{1d,,codeop} that was causing
@ref{18e,,SyntaxError} exceptions raised in the presence of invalid syntax to
not contain precise error messages. Patch by Pablo Galindo

@item 
gh-111380@footnote{https://github.com/python/cpython/issues/111380}: Fix a bug that was causing @ref{1ae,,SyntaxWarning} to appear twice
when parsing if invalid syntax is encountered later. Patch by Pablo
galindo

@item 
gh-111374@footnote{https://github.com/python/cpython/issues/111374}: Added a new environment variable
@geindex PYTHON_FROZEN_MODULES
@geindex 환경 변수; PYTHON_FROZEN_MODULES
@ref{4ae,,PYTHON_FROZEN_MODULES}. It determines whether or not frozen
modules are ignored by the import machinery, equivalent of the @ref{16f,,-X frozen_modules} command-line option.

@item 
gh-111354@footnote{https://github.com/python/cpython/issues/111354}: Remove @code{oparg} from @ref{1a39,,YIELD_VALUE}. Change @code{oparg}
of @ref{5b9,,RESUME} to include information about the except-depth. These
changes make it possible to simplify the code in generator close.

@item 
gh-94438@footnote{https://github.com/python/cpython/issues/94438}: Fix a regression that prevented jumping across @code{is None} and
@code{is not None} when debugging. Patch by Savannah Ostrowski.

@item 
gh-67224@footnote{https://github.com/python/cpython/issues/67224}: Show source lines in tracebacks when using the @code{-c} option
when running Python. Patch by Pablo Galindo

@item 
gh-111123@footnote{https://github.com/python/cpython/issues/111123}: Fix a bug where a @ref{4ad,,global} declaration in an
@ref{1ab,,except} block is rejected when the global is used in the
@ref{17c,,else} block.

@item 
gh-110938@footnote{https://github.com/python/cpython/issues/110938}: Fix error messages for indented blocks with functions and
classes with generic type parameters. Patch by Pablo Galindo

@item 
gh-109214@footnote{https://github.com/python/cpython/issues/109214}: Remove unnecessary instruction pointer updates before returning
from frames.

@item 
gh-110912@footnote{https://github.com/python/cpython/issues/110912}: Correctly display the traceback for @ref{175f,,MemoryError}
exceptions using the @ref{104,,traceback} module. Patch by Pablo Galindo

@item 
gh-109894@footnote{https://github.com/python/cpython/issues/109894}: Fixed crash due to improperly initialized static
@ref{175f,,MemoryError} in subinterpreter.

@item 
gh-110892@footnote{https://github.com/python/cpython/issues/110892}: Return @code{NULL} for @code{PyTrace_RETURN} events caused by an
exception

@item 
gh-110864@footnote{https://github.com/python/cpython/issues/110864}: Fix argument parsing by @code{_PyArg_UnpackKeywordsWithVararg} for
functions defining pos-or-keyword, vararg, and kw-only parameters.

@item 
gh-109094@footnote{https://github.com/python/cpython/issues/109094}: Replace @code{prev_instr} on the interpreter frame by
@code{instr_ptr} which points to the beginning of the instruction that is
currently executing (or will execute once the frame resumes).

@item 
gh-110805@footnote{https://github.com/python/cpython/issues/110805}: Allow the repl to show source code and complete tracebacks.
Patch by Pablo Galindo

@item 
gh-110722@footnote{https://github.com/python/cpython/issues/110722}: Add 
@geindex PYTHON_PRESITE=package.module
@geindex 환경 변수; PYTHON_PRESITE=package.module
@code{PYTHON_PRESITE=package.module} to import a module
early in the interpreter lifecycle before @code{site.py} is executed.  Python
needs to be @ref{508,,built in debug mode} for this option to
exist.

@item 
gh-110481@footnote{https://github.com/python/cpython/issues/110481}: Implement biased reference counting in @code{--disable-gil}
builds.

@item 
gh-110543@footnote{https://github.com/python/cpython/issues/110543}: Fix regression in Python 3.12 where
@code{types.CodeType.replace()} would produce a broken code object if
called on a module or class code object that contains a comprehension.
Patch by Jelle Zijlstra.

@item 
gh-89519@footnote{https://github.com/python/cpython/issues/89519}: Removed chained @ref{48f,,classmethod} descriptors (introduced in
bpo-19072@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19072}).  This can no longer be used to wrap other descriptors
such as @ref{4b3,,property}.  The core design of this feature was flawed and
caused a number of downstream problems.  To “pass-through” a
@code{classmethod}, consider using the @code{__wrapped__} attribute
that was added in Python 3.10.

@item 
gh-103615@footnote{https://github.com/python/cpython/issues/103615}: Use local events for opcode tracing

@item 
bpo-46657@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46657}: Add mimalloc memory allocator support.

@item 
gh-106718@footnote{https://github.com/python/cpython/issues/106718}: When PyConfig.stdlib_dir is explicitly set, it’s now respected
and won’t be overridden by PyConfig.home.

@item 
gh-106905@footnote{https://github.com/python/cpython/issues/106905}: Fix incorrect SystemError about AST constructor recursion depth
mismatch.

@item 
gh-100445@footnote{https://github.com/python/cpython/issues/100445}: Improve error message for unterminated strings with escapes.

@item 
bpo-45759@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45759}: Improved error messages for @code{elif}/@code{else} statements not
matching any valid statements. Patch by Jeremiah Vivian.
@end itemize

@node Library<63>,Tests<19>,Core and Builtins<58>,Python 3 13 0 alpha 2
@anchor{whatsnew/changelog id268}@anchor{1a3a}
@subsubsection Library



@itemize -

@item 
gh-111942@footnote{https://github.com/python/cpython/issues/111942}: Fix SystemError in the TextIOWrapper constructor with
non-encodable “errors” argument in non-debug mode.

@item 
gh-111995@footnote{https://github.com/python/cpython/issues/111995}: Added the @code{NI_IDN} constant to the @ref{d1,,socket} module when
present in C at build time for use with @ref{1a3b,,socket.getnameinfo()}.

@item 
gh-109538@footnote{https://github.com/python/cpython/issues/109538}: Issue warning message instead of having @ref{244,,RuntimeError}
be displayed when event loop has already been closed at
@code{StreamWriter.__del__()}.

@item 
gh-111942@footnote{https://github.com/python/cpython/issues/111942}: Fix crashes in @ref{d3f,,io.TextIOWrapper.reconfigure()} when pass
invalid arguments, e.g. non-string encoding.

@item 
gh-111460@footnote{https://github.com/python/cpython/issues/111460}: @ref{2f,,curses}: restore wide character support (including
@ref{129d,,curses.unget_wch()} and @ref{129c,,get_wch()}) on macOS,
which was unavailable due to a regression in Python 3.12.

@item 
gh-103791@footnote{https://github.com/python/cpython/issues/103791}: @ref{1127,,contextlib.suppress} now supports suppressing
exceptions raised as part of a @ref{564,,BaseExceptionGroup}, in addition to
the recent support for @ref{4d3,,ExceptionGroup}.

@item 
gh-111835@footnote{https://github.com/python/cpython/issues/111835}: The @ref{518,,mmap.mmap} class now has an
@ref{519,,seekable()} method that can be used when a seekable
file-like object is required. The @ref{51a,,seek()} method now
returns the new absolute position. Patch by Donghee Na.

@item 
gh-111804@footnote{https://github.com/python/cpython/issues/111804}: Remove posix.fallocate() under WASI as the underlying
posix_fallocate() is not available in WASI preview2.

@item 
gh-111841@footnote{https://github.com/python/cpython/issues/111841}: Fix truncating arguments on an embedded null character in
@ref{25b,,os.putenv()} and @ref{25c,,os.unsetenv()} on Windows.

@item 
gh-111768@footnote{https://github.com/python/cpython/issues/111768}: @ref{1a3c,,wsgiref.util.is_hop_by_hop()} is now exposed correctly in
@code{__all__}.

@item 
gh-80731@footnote{https://github.com/python/cpython/issues/80731}: Avoid executing the default function in @ref{1850,,cmd.Cmd} in an
except block

@item 
gh-111541@footnote{https://github.com/python/cpython/issues/111541}: Fix @ref{3e,,doctest} for @ref{18e,,SyntaxError} not-builtin
subclasses.

@item 
gh-111719@footnote{https://github.com/python/cpython/issues/111719}: Add extra argument validation for @code{alias} command in
@ref{aa,,pdb}

@item 
gh-111482@footnote{https://github.com/python/cpython/issues/111482}: @ref{f4,,time}: Make @ref{1363,,time.clock_gettime()} and
@ref{cda,,time.clock_gettime_ns()} functions up to 2x faster by faster calling
convention. Patch by Victor Stinner.

@item 
gh-110894@footnote{https://github.com/python/cpython/issues/110894}: Call loop exception handler for exceptions in
@code{client_connected_cb} of @ref{d0e,,asyncio.start_server()} so that
applications can handle it. Patch by Kumar Aditya.

@item 
gh-111531@footnote{https://github.com/python/cpython/issues/111531}: Fix reference leaks in @code{bind_class()} and @code{bind_all()}
methods of @ref{f6,,tkinter} widgets.

@item 
gh-111246@footnote{https://github.com/python/cpython/issues/111246}: @ref{4cb,,asyncio.loop.create_unix_server()} will now automatically
remove the Unix socket when the server is closed.

@item 
gh-111356@footnote{https://github.com/python/cpython/issues/111356}: Added @ref{1a3d,,io.text_encoding()}, @ref{1a3e,,io.DEFAULT_BUFFER_SIZE},
and @ref{1766,,io.IncrementalNewlineDecoder} to @code{io.__all__}.

@item 
gh-66425@footnote{https://github.com/python/cpython/issues/66425}: Remove the code to set the REMOTE_HOST header from wsgiref
module, as it is unreachable. This header is used for performance reasons,
which is not necessary in the wsgiref module.

@item 
gh-111429@footnote{https://github.com/python/cpython/issues/111429}: Speed up @ref{2fd,,pathlib.PurePath.relative_to()} and
@ref{2fe,,is_relative_to()}.

@item 
gh-111342@footnote{https://github.com/python/cpython/issues/111342}: Fixed typo in @ref{6be,,math.sumprod()}.

@item 
gh-68166@footnote{https://github.com/python/cpython/issues/68166}: Remove mention of not supported “vsapi” element type in
@ref{55f,,tkinter.ttk.Style.element_create()}. Add tests for
@code{element_create()} and other @code{ttk.Style} methods. Add examples for
@code{element_create()} in the documentation.

@item 
gh-111388@footnote{https://github.com/python/cpython/issues/111388}: Add @code{show_group} parameter to
@ref{a4e,,traceback.format_exception_only()}, which allows to format
@ref{4d3,,ExceptionGroup} instances.

@item 
gh-79033@footnote{https://github.com/python/cpython/issues/79033}: Another attempt at fixing @ref{1a3f,,asyncio.Server.wait_closed()}. It
now blocks until both conditions are true: the server is closed, `and'
there are no more active connections. (This means that in some cases where
in 3.12.0 this function would `incorrectly' have returned immediately, it
will now block; in particular, when there are no active connections but
the server hasn’t been closed yet.)

@item 
gh-111259@footnote{https://github.com/python/cpython/issues/111259}: Optimize recursive wildcards in @ref{a8,,pathlib}.

@item 
gh-111295@footnote{https://github.com/python/cpython/issues/111295}: Fix @ref{f4,,time} not checking for errors when initializing.

@item 
gh-111253@footnote{https://github.com/python/cpython/issues/111253}: Add error checking during @code{_socket} module init.

@item 
gh-111251@footnote{https://github.com/python/cpython/issues/111251}: Fix @code{_blake2} not checking for errors when initializing.

@item 
gh-111233@footnote{https://github.com/python/cpython/issues/111233}: Fix @ref{c6,,select} not checking for errors when initializing.

@item 
gh-111230@footnote{https://github.com/python/cpython/issues/111230}: Fix @ref{d5,,ssl} not checking for errors when initializing.

@item 
gh-111174@footnote{https://github.com/python/cpython/issues/111174}: Fix crash in @ref{13f6,,io.BytesIO.getbuffer()} called repeatedly for
empty BytesIO.

@item 
gh-111187@footnote{https://github.com/python/cpython/issues/111187}: Postpone removal version for locale.getdefaultlocale() to
Python 3.15.

@item 
gh-111159@footnote{https://github.com/python/cpython/issues/111159}: Fix @ref{3e,,doctest} output comparison for exceptions with notes.

@item 
gh-110910@footnote{https://github.com/python/cpython/issues/110910}: Fix invalid state handling in @ref{4d2,,asyncio.TaskGroup} and
@ref{1a40,,asyncio.Timeout}. They now raise proper RuntimeError if they are
improperly used and are left in consistent state after this.

@item 
gh-111092@footnote{https://github.com/python/cpython/issues/111092}: Make turtledemo run without default root enabled.

@item 
gh-110944@footnote{https://github.com/python/cpython/issues/110944}: Support alias and convenience vars for @ref{aa,,pdb} completion

@item 
gh-110745@footnote{https://github.com/python/cpython/issues/110745}: Added `newline' parameter to @ref{1044,,pathlib.Path.read_text()}.
Patch by Junya Okabe.

@item 
gh-84583@footnote{https://github.com/python/cpython/issues/84583}: Make @ref{aa,,pdb} enter post-mortem mode even for
@ref{18e,,SyntaxError}

@item 
gh-80675@footnote{https://github.com/python/cpython/issues/80675}: Set @code{f_trace_lines = True} on all frames upon
@ref{272,,pdb.set_trace()}

@item 
gh-110771@footnote{https://github.com/python/cpython/issues/110771}: Expose the setup and cleanup portions of
@code{asyncio.run_forever()} as the standalone methods
@code{asyncio.run_forever_setup()} and @code{asyncio.run_forever_cleanup()}.
This allows for tighter integration with GUI event loops.

@item 
gh-110774@footnote{https://github.com/python/cpython/issues/110774}: Support setting the @ref{2f5,,asyncio.Runner} loop_factory kwarg
in @ref{361,,unittest.IsolatedAsyncioTestCase}

@item 
gh-110392@footnote{https://github.com/python/cpython/issues/110392}: Fix @ref{1a41,,tty.setraw()} and @ref{19f5,,tty.setcbreak()}: previously
they returned partially modified list of the original tty attributes.
@ref{1a42,,tty.cfmakeraw()} and @ref{19f6,,tty.cfmakecbreak()} now make a copy of the
list of special characters before modifying it.

@item 
gh-59013@footnote{https://github.com/python/cpython/issues/59013}: Make line number of function breakpoint more precise in
@ref{aa,,pdb}

@item 
gh-88434@footnote{https://github.com/python/cpython/issues/88434}: Emit deprecation warning for non-integer numbers in
@ref{67,,gettext} functions and methods that consider plural forms even if
the translation was not found.

@item 
gh-110395@footnote{https://github.com/python/cpython/issues/110395}: Ensure that @ref{1a43,,select.kqueue()} objects correctly appear as
closed in forked children, to prevent operations on an invalid file
descriptor.

@item 
gh-110196@footnote{https://github.com/python/cpython/issues/110196}: Add @code{__reduce__} method to @code{IPv6Address} in order to
keep @code{scope_id}

@item 
gh-109747@footnote{https://github.com/python/cpython/issues/109747}: Improve errors for unsupported look-behind patterns. Now
re.error is raised instead of OverflowError or RuntimeError for too large
width of look-behind pattern.

@item 
gh-109466@footnote{https://github.com/python/cpython/issues/109466}: Add the @ref{50a,,ipaddress.IPv4Address.ipv6_mapped} property,
which returns the IPv4-mapped IPv6 address.

@item 
gh-85098@footnote{https://github.com/python/cpython/issues/85098}: Implement the CLI of the @ref{de,,symtable} module and improve the
repr of @ref{289,,Symbol}.

@item 
gh-108791@footnote{https://github.com/python/cpython/issues/108791}: Improved error handling in @ref{aa,,pdb} command line interface,
making it produce more concise error messages.

@item 
gh-105931@footnote{https://github.com/python/cpython/issues/105931}: Change @ref{21,,compileall} to only strip the stripdir prefix from
the full path recorded in the compiled @code{.pyc} file, when the prefix
matches the start of the full path in its entirety. When the prefix does
not match, no stripping is performed and a warning to this effect is
displayed.

Previously all path components of the stripdir prefix that matched the
full path were removed, while those that did not match were left alone
(including ones interspersed between matching components).

@item 
gh-107431@footnote{https://github.com/python/cpython/issues/107431}: Make the @code{DictProxy} and @code{ListProxy} types in
@ref{9b,,multiprocessing.managers} @ref{8c0,,Generic Alias Types} for @code{[]} use in typing contexts.

@item 
gh-72904@footnote{https://github.com/python/cpython/issues/72904}: Add @ref{1852,,glob.translate()}. This function converts a pathname
with shell-style wildcards to a regular expression.

@item 
gh-90026@footnote{https://github.com/python/cpython/issues/90026}: Define @code{USE_XATTRS} on Cygwin so that XATTR-related functions
in the @ref{a5,,os} module become available.

@item 
gh-90890@footnote{https://github.com/python/cpython/issues/90890}: New methods @ref{1a44,,mailbox.Maildir.get_info()},
@ref{1a45,,mailbox.Maildir.set_info()}, @ref{1a46,,mailbox.Maildir.get_flags()},
@ref{1a47,,mailbox.Maildir.set_flags()}, @ref{1a48,,mailbox.Maildir.add_flag()},
@ref{1a49,,mailbox.Maildir.remove_flag()}. These methods speed up accessing a
message’s info and/or flags and are useful when it is not necessary to
access the message’s contents, as when iterating over a Maildir to find
messages with specific flags.

@item 
gh-102956@footnote{https://github.com/python/cpython/issues/102956}: Fix returning of empty byte strings after seek in zipfile
module

@item 
gh-102895@footnote{https://github.com/python/cpython/issues/102895}: Added a parameter @code{local_exit} for @ref{1892,,code.interact()} to
prevent @code{exit()} and @code{quit} from closing @code{sys.stdin} and raise
@code{SystemExit}.

@item 
gh-97928@footnote{https://github.com/python/cpython/issues/97928}: Change the behavior of @code{tkinter.Text.count()}. It now always
returns an integer if one or less counting options are specified.
Previously it could return a single count as a 1-tuple, an integer (only
if option @code{"update"} was specified) or @code{None} if no items found. The
result is now the same if @code{wantobjects} is set to @code{0}.

@item 
gh-96954@footnote{https://github.com/python/cpython/issues/96954}: Switch the storage of the unicode codepoint names to use a
different data-structure, a directed acyclic word graph@footnote{https://en.wikipedia.org/wiki/Deterministic_acyclic_finite_state_automaton}.
This makes the unicodedata shared library about 440 KiB smaller.
Contributed by Carl Friedrich Bolz-Tereick using code from the PyPy
project.

@item 
gh-73561@footnote{https://github.com/python/cpython/issues/73561}: Omit the interface scope from an IPv6 address when used as Host
header by @ref{73,,http.client}.

@item 
gh-86826@footnote{https://github.com/python/cpython/issues/86826}: @code{zipinfo} now supports the full range of values in the TZ
string determined by RFC 8536 and detects all invalid formats. Both Python
and C implementations now raise exceptions of the same type on invalid
data.
@end itemize

@node Tests<19>,Build<22>,Library<63>,Python 3 13 0 alpha 2
@anchor{whatsnew/changelog id269}@anchor{1a4a}
@subsubsection Tests



@itemize -

@item 
gh-111808@footnote{https://github.com/python/cpython/issues/111808}: Make the default value of @code{test.support.infinite_recursion()}
to be conditional based on whether optimizations were used when compiling
the interpreter. This helps with platforms like WASI whose stack size is
greatly restricted in debug builds.

@item 
gh-110722@footnote{https://github.com/python/cpython/issues/110722}: Gathering line coverage of standard libraries within the
regression test suite is now precise, as well as much faster. Patch by
Łukasz Langa.

@item 
gh-110367@footnote{https://github.com/python/cpython/issues/110367}: Make regrtest @code{--verbose3} option compatible with
@code{--huntrleaks -jN} options. The @code{./python -m test -j1 -R 3:3
--verbose3} command now works as expected. Patch by Victor Stinner.

@item 
gh-111165@footnote{https://github.com/python/cpython/issues/111165}: Remove no longer used functions @code{run_unittest()} and
@code{run_doctest()} from the @ref{ea,,test.support} module.

@item 
gh-110932@footnote{https://github.com/python/cpython/issues/110932}: Fix regrtest if the @code{SOURCE_DATE_EPOCH} environment variable
is defined: use the variable value as the random seed. Patch by Victor
Stinner.

@item 
gh-110995@footnote{https://github.com/python/cpython/issues/110995}: test_gdb: Fix detection of gdb built without Python scripting
support. Patch by Victor Stinner.

@item 
gh-110918@footnote{https://github.com/python/cpython/issues/110918}: Test case matching patterns specified by options @code{--match},
@code{--ignore}, @code{--matchfile} and @code{--ignorefile} are now tested in the
order of specification, and the last match determines whether the test
case be run or ignored.

@item 
gh-108747@footnote{https://github.com/python/cpython/issues/108747}: Add unit test for @code{usercustomize} and @code{sitecustomize} hooks
from @ref{cc,,site}.
@end itemize

@node Build<22>,Windows<20>,Tests<19>,Python 3 13 0 alpha 2
@anchor{whatsnew/changelog id270}@anchor{1a4b}
@subsubsection Build



@itemize -

@item 
gh-96954@footnote{https://github.com/python/cpython/issues/96954}: Make @code{make regen-unicodedata} work for out-of-tree builds of
CPython.

@item 
gh-112088@footnote{https://github.com/python/cpython/issues/112088}: Add @code{Tools/build/regen-configure.sh} script to regenerate the
@code{configure} with an Ubuntu container image. The
@code{quay.io/tiran/cpython_autoconf:271} container image
(tiran/cpython_autoconf@footnote{https://github.com/tiran/cpython_autoconf}) is
no longer used. Patch by Victor Stinner.

@item 
gh-111046@footnote{https://github.com/python/cpython/issues/111046}: For wasi-threads, memory is now exported to fix compatibility
issues with some wasm runtimes.

@item 
gh-110828@footnote{https://github.com/python/cpython/issues/110828}: AIX 32bit needs @code{-latomic} to build the @code{_testcapi}
extension module.

@item 
gh-85283@footnote{https://github.com/python/cpython/issues/85283}: The @code{errno}, @code{md5}, @code{resource}, @code{winsound},
@code{_ctypes_test}, @code{_multiprocessing.posixshmem}, @code{_scproxy},
@code{_stat}, @code{_testimportmultiple} and @code{_uuid} C extensions are now
built with the @ref{635,,limited C API}. Patch by Victor
Stinner.
@end itemize

@node Windows<20>,macOS<13>,Build<22>,Python 3 13 0 alpha 2
@anchor{whatsnew/changelog id271}@anchor{1a4c}
@subsubsection Windows



@itemize -

@item 
gh-111856@footnote{https://github.com/python/cpython/issues/111856}: Fixes @ref{f8b,,fstat()} on file systems that do not support
file ID requests. This includes FAT32 and exFAT.

@item 
gh-111293@footnote{https://github.com/python/cpython/issues/111293}: Fix @ref{1a4d,,os.DirEntry.inode} dropping higher 64 bits of a file
id on some filesystems on Windows.

@item 
gh-110913@footnote{https://github.com/python/cpython/issues/110913}: WindowsConsoleIO now correctly chunks large buffers without
splitting up UTF-8 sequences.
@end itemize

@node macOS<13>,IDLE<12>,Windows<20>,Python 3 13 0 alpha 2
@anchor{whatsnew/changelog id272}@anchor{1a4e}
@subsubsection macOS



@itemize -

@item 
gh-59703@footnote{https://github.com/python/cpython/issues/59703}: For macOS framework builds, in @code{getpath.c} use the system
@code{dladdr} function to find the path to the shared library rather than
depending on deprecated macOS APIs.

@item 
gh-110950@footnote{https://github.com/python/cpython/issues/110950}: Update macOS installer to include an upstream Tcl/Tk fix for
the @code{Secure coding is not enabled for restorable state!} warning
encountered in Tkinter on macOS 14 Sonoma.

@item 
gh-111015@footnote{https://github.com/python/cpython/issues/111015}: Ensure that IDLE.app and Python Launcher.app are installed with
appropriate permissions on macOS builds.

@item 
gh-71383@footnote{https://github.com/python/cpython/issues/71383}: Update macOS installer to include an upstream Tcl/Tk fix for the
@code{ttk::ThemeChanged} error encountered in Tkinter.

@item 
gh-92603@footnote{https://github.com/python/cpython/issues/92603}: Update macOS installer to include a fix accepted by upstream
Tcl/Tk for a crash encountered after the first @ref{19ac,,tkinter.Tk()} instance
is destroyed.
@end itemize

@node IDLE<12>,Tools/Demos<18>,macOS<13>,Python 3 13 0 alpha 2
@anchor{whatsnew/changelog id273}@anchor{1a4f}
@subsubsection IDLE



@itemize -

@item 
bpo-35668@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35668}: Add docstrings to the IDLE debugger module. Fix two bugs:
initialize @code{Idb.botframe} (should be in Bdb); in @code{Idb.in_rpc_code},
check whether @code{prev_frame} is @code{None} before trying to use it. Greatly
expand test_debugger.
@end itemize

@node Tools/Demos<18>,C API<22>,IDLE<12>,Python 3 13 0 alpha 2
@anchor{whatsnew/changelog id274}@anchor{1a50}
@subsubsection Tools/Demos



@itemize -

@item 
gh-111903@footnote{https://github.com/python/cpython/issues/111903}: Argument Clinic now supports the @code{@@critical_section}
directive that instructs Argument Clinic to generate a critical section
around the function call, which locks the @code{self} object in
@code{--disable-gil} builds. Patch by Sam Gross.
@end itemize

@node C API<22>,,Tools/Demos<18>,Python 3 13 0 alpha 2
@anchor{whatsnew/changelog id275}@anchor{1a51}
@subsubsection C API



@itemize -

@item 
gh-112026@footnote{https://github.com/python/cpython/issues/112026}: Add again the private @code{_PyThreadState_UncheckedGet()}
function as an alias to the new public
@ref{423,,PyThreadState_GetUnchecked()} function. Patch by Victor Stinner.

@item 
gh-112026@footnote{https://github.com/python/cpython/issues/112026}: Restore the removed @code{_PyDict_GetItemStringWithError()}
function. It is used by numpy. Patch by Victor Stinner.

@item 
gh-112026@footnote{https://github.com/python/cpython/issues/112026}: Restore removed private C API functions, macros and structures
which have no simple replacement for now:


@itemize *

@item 
_PyDict_GetItem_KnownHash()

@item 
_PyDict_NewPresized()

@item 
_PyHASH_BITS

@item 
_PyHASH_IMAG

@item 
_PyHASH_INF

@item 
_PyHASH_MODULUS

@item 
_PyHASH_MULTIPLIER

@item 
_PyLong_Copy()

@item 
_PyLong_FromDigits()

@item 
_PyLong_New()

@item 
_PyLong_Sign()

@item 
_PyObject_CallMethodId()

@item 
_PyObject_CallMethodNoArgs()

@item 
_PyObject_CallMethodOneArg()

@item 
_PyObject_CallOneArg()

@item 
_PyObject_EXTRA_INIT

@item 
_PyObject_FastCallDict()

@item 
_PyObject_GetAttrId()

@item 
_PyObject_Vectorcall()

@item 
_PyObject_VectorcallMethod()

@item 
_PyStack_AsDict()

@item 
_PyThread_CurrentFrames()

@item 
_PyUnicodeWriter structure

@item 
_PyUnicodeWriter_Dealloc()

@item 
_PyUnicodeWriter_Finish()

@item 
_PyUnicodeWriter_Init()

@item 
_PyUnicodeWriter_Prepare()

@item 
_PyUnicodeWriter_PrepareKind()

@item 
_PyUnicodeWriter_WriteASCIIString()

@item 
_PyUnicodeWriter_WriteChar()

@item 
_PyUnicodeWriter_WriteLatin1String()

@item 
_PyUnicodeWriter_WriteStr()

@item 
_PyUnicodeWriter_WriteSubstring()

@item 
_PyUnicode_AsString()

@item 
_PyUnicode_FromId()

@item 
_PyVectorcall_Function()

@item 
_Py_IDENTIFIER()

@item 
_Py_c_abs()

@item 
_Py_c_diff()

@item 
_Py_c_neg()

@item 
_Py_c_pow()

@item 
_Py_c_prod()

@item 
_Py_c_quot()

@item 
_Py_c_sum()

@item 
_Py_static_string()

@item 
_Py_static_string_init()
@end itemize

Patch by Victor Stinner.

@item 
gh-112026@footnote{https://github.com/python/cpython/issues/112026}: Add again @code{<ctype.h>} and @code{<unistd.h>} includes in
@code{Python.h}, but don’t include them in the limited C API version 3.13 and
newer. Patch by Victor Stinner.

@item 
gh-111956@footnote{https://github.com/python/cpython/issues/111956}: Add internal-only one-time initialization API: @code{_PyOnceFlag}
and @code{_PyOnceFlag_CallOnce}.

@item 
gh-111262@footnote{https://github.com/python/cpython/issues/111262}: Add @ref{422,,PyDict_Pop()} and @ref{5e3,,PyDict_PopString()}
functions: remove a key from a dictionary and optionally return the
removed value. This is similar to @ref{5e4,,dict.pop()}, but without the
default value and not raising @ref{5e5,,KeyError} if the key missing. Patch by
Stefan Behnel and Victor Stinner.

@item 
gh-111863@footnote{https://github.com/python/cpython/issues/111863}: Rename @code{Py_NOGIL} to @code{Py_GIL_DISABLED}. Patch by Hugo van
Kemenade.

@item 
gh-111138@footnote{https://github.com/python/cpython/issues/111138}: Add @ref{5fe,,PyList_Extend()} and @ref{5ff,,PyList_Clear()}
functions: similar to Python @code{list.extend()} and @code{list.clear()}
methods. Patch by Victor Stinner.

@item 
gh-108765@footnote{https://github.com/python/cpython/issues/108765}: On Windows, @code{Python.h} no longer includes the @code{<stddef.h>}
standard header file. If needed, it should now be included explicitly.
Patch by Victor Stinner.

@item 
gh-111569@footnote{https://github.com/python/cpython/issues/111569}: Implement “Python Critical Sections” from 
@geindex Python 향상 제안; PEP 703
PEP 703@footnote{https://peps.python.org/pep-0703/}. These are
macros to help replace the GIL with per-object locks in the
@code{--disable-gil} build of CPython. The macros are no-ops in the default
build.

@item 
gh-111506@footnote{https://github.com/python/cpython/issues/111506}: In the limited C API version 3.13, @ref{aa8,,Py_SET_REFCNT()}
function is now implemented as an opaque function call. Patch by Victor
Stinner.

@item 
gh-108082@footnote{https://github.com/python/cpython/issues/108082}: Add @ref{5f0,,PyErr_FormatUnraisable()} function.

@item 
gh-110964@footnote{https://github.com/python/cpython/issues/110964}: Move the undocumented private _PyArg functions and
_PyArg_Parser structure to internal C API (@code{pycore_modsupport.h}). Patch
by Victor Stinner.

@item 
gh-110815@footnote{https://github.com/python/cpython/issues/110815}: Support non-ASCII keyword names in
@ref{622,,PyArg_ParseTupleAndKeywords()}.

@item 
gh-109587@footnote{https://github.com/python/cpython/issues/109587}: Introduced @code{PyUnstable_PerfTrampoline_CompileCode()},
@code{PyUnstable_PerfTrampoline_SetPersistAfterFork()} and
@code{PyUnstable_CopyPerfMapFile()}. These functions allow extension
modules to initialize trampolines eagerly, after the application is
“warmed up”. This makes it possible to have perf-trampolines running in an
always-enabled fashion.

@item 
gh-85283@footnote{https://github.com/python/cpython/issues/85283}: Add the @ref{611,,PySys_Audit()} function to the limited C API.
Patch by Victor Stinner.

@item 
gh-85283@footnote{https://github.com/python/cpython/issues/85283}: Add @ref{62f,,PyMem_RawMalloc()}, @ref{630,,PyMem_RawCalloc()},
@ref{631,,PyMem_RawRealloc()} and @ref{632,,PyMem_RawFree()} to the limited C
API. Patch by Victor Stinner.

@item 
gh-106672@footnote{https://github.com/python/cpython/issues/106672}: Functions @ref{626,,PyDict_GetItem()},
@ref{627,,PyDict_GetItemString()}, @ref{61d,,PyMapping_HasKey()},
@ref{61f,,PyMapping_HasKeyString()}, @ref{619,,PyObject_HasAttr()},
@ref{61b,,PyObject_HasAttrString()}, and @ref{628,,PySys_GetObject()}, which
clear all errors occurred during calling the function, report now them
using @ref{506,,sys.unraisablehook()}.

@item 
gh-67565@footnote{https://github.com/python/cpython/issues/67565}: Remove redundant C-contiguity check in @code{getargs.c},
@ref{11,,binascii}, @ref{d5,,ssl} and Argument Clinic. Patched by Stefan Krah
and Furkan Onder
@end itemize

@node Python 3 13 0 alpha 1,Python 3 12 0 beta 1,Python 3 13 0 alpha 2,Changelog
@anchor{whatsnew/changelog python-3-13-0-alpha-1}@anchor{1a52}
@subsection Python 3.13.0 alpha 1


`Release date: 2023-10-13'

@menu
* Security: Security<22>. 
* Core and Builtins: Core and Builtins<59>. 
* Library: Library<64>. 
* Documentation: Documentation<20>. 
* Tests: Tests<20>. 
* Build: Build<23>. 
* Windows: Windows<21>. 
* macOS: macOS<14>. 
* IDLE: IDLE<13>. 
* Tools/Demos: Tools/Demos<19>. 
* C API: C API<23>. 

@end menu

@node Security<22>,Core and Builtins<59>,,Python 3 13 0 alpha 1
@anchor{whatsnew/changelog id276}@anchor{1a53}
@subsubsection Security



@itemize -

@item 
gh-108310@footnote{https://github.com/python/cpython/issues/108310}: Fixed an issue where instances of @ref{ae7,,ssl.SSLSocket} were
vulnerable to a bypass of the TLS handshake and included protections (like
certificate verification) and treating sent unencrypted data as if it were
post-handshake TLS encrypted data.  Security issue reported as
@geindex Common Vulnerabilities and Exposures; CVE 2023-40217
CVE 2023-40217@footnote{https://www.cve.org/CVERecord?id=CVE-2023-40217} by Aapo Oksman. Patch by Gregory P. Smith.

@item 
gh-107774@footnote{https://github.com/python/cpython/issues/107774}: PEP 669 specifies that @code{sys.monitoring.register_callback}
will generate an audit event. Pre-releases of Python 3.12 did not generate
the audit event. This is now fixed.

@item 
gh-102988@footnote{https://github.com/python/cpython/issues/102988}: Reverted the @ref{54,,email.utils} security improvement change
released in 3.12beta4 that unintentionally caused
@ref{4f3,,email.utils.getaddresses} to fail to parse email addresses with a
comma in the quoted name field. See gh-106669@footnote{https://github.com/python/cpython/issues/106669}.

@item 
gh-99108@footnote{https://github.com/python/cpython/issues/99108}: Refresh our new HACL* built-in @ref{6c,,hashlib} code from
upstream. Built-in SHA2 should be faster and an issue with SHA3 on 32-bit
platforms is fixed.

@item 
gh-102509@footnote{https://github.com/python/cpython/issues/102509}: Start initializing @code{ob_digit} during creation of
@ref{39e,,PyLongObject} objects. Patch by Illia Volochii.
@end itemize

@node Core and Builtins<59>,Library<64>,Security<22>,Python 3 13 0 alpha 1
@anchor{whatsnew/changelog id277}@anchor{1a54}
@subsubsection Core and Builtins



@itemize -

@item 
gh-110782@footnote{https://github.com/python/cpython/issues/110782}: Fix crash when @ref{487,,typing.TypeVar} is constructed with a
keyword argument. Patch by Jelle Zijlstra.

@item 
gh-110752@footnote{https://github.com/python/cpython/issues/110752}: Reset @code{ceval.eval_breaker} in @code{interpreter_clear()}

@item 
gh-110721@footnote{https://github.com/python/cpython/issues/110721}: Use the @ref{104,,traceback} implementation for the default
@code{PyErr_Display()} functionality. Patch by Pablo Galindo

@item 
gh-110696@footnote{https://github.com/python/cpython/issues/110696}: Fix incorrect error message for invalid argument unpacking.
Patch by Pablo Galindo

@item 
gh-104169@footnote{https://github.com/python/cpython/issues/104169}: Split the tokenizer into two separate directories: - One part
includes the actual lexeme producing logic and lives in @code{Parser/lexer}.
- The second part wraps the lexer according to the different tokenization
modes   we have (string, utf-8, file, interactive, readline) and lives in
@code{Parser/tokenizer}.

@item 
gh-110688@footnote{https://github.com/python/cpython/issues/110688}: Remove undocumented @code{test_c_api} method from @ref{184,,set},
which was only defined for testing purposes under @code{Py_DEBUG}. Now we
have proper CAPI tests.

@item 
gh-104584@footnote{https://github.com/python/cpython/issues/104584}: Fix a reference leak when running with 
@geindex PYTHONUOPS
@geindex 환경 변수; PYTHONUOPS
@code{PYTHONUOPS} or
@ref{16f,,-X uops} enabled.

@item 
gh-110514@footnote{https://github.com/python/cpython/issues/110514}: Add @code{PY_THROW} to @ref{1703,,sys.setprofile()} events

@item 
gh-110489@footnote{https://github.com/python/cpython/issues/110489}: Optimise @ref{15c3,,math.ceil()} when the input is exactly a float,
resulting in about a 10% improvement.

@item 
gh-110455@footnote{https://github.com/python/cpython/issues/110455}: Guard @code{assert(tstate->thread_id > 0)} with @code{#ifndef
HAVE_PTHREAD_STUBS}. This allows for for pydebug builds to work under
WASI which (currently) lacks thread support.

@item 
gh-110309@footnote{https://github.com/python/cpython/issues/110309}: Remove unnecessary empty constant nodes in the ast of f-string
specs.

@item 
gh-110259@footnote{https://github.com/python/cpython/issues/110259}: Correctly identify the format spec in f-strings (with single or
triple quotes) that have multiple lines in the expression part and include
a formatting spec. Patch by Pablo Galindo

@item 
gh-110237@footnote{https://github.com/python/cpython/issues/110237}: Fix missing error checks for calls to @code{PyList_Append} in
@code{_PyEval_MatchClass}.

@item 
gh-110164@footnote{https://github.com/python/cpython/issues/110164}: regrtest: If the @code{SOURCE_DATE_EPOCH} environment variable is
defined, regrtest now disables tests randomization. Patch by Victor
Stinner.

@item 
gh-109889@footnote{https://github.com/python/cpython/issues/109889}: Fix the compiler’s redundant NOP detection algorithm to skip
over NOPs with no line number when looking for the next instruction’s
lineno.

@item 
gh-109853@footnote{https://github.com/python/cpython/issues/109853}: @code{sys.path[0]} is now set correctly for subinterpreters.

@item 
gh-109923@footnote{https://github.com/python/cpython/issues/109923}: Set line number on the @code{POP_TOP} that follows a
@code{RETURN_GENERATOR}.

@item 
gh-105716@footnote{https://github.com/python/cpython/issues/105716}: Subinterpreters now correctly handle the case where they have
threads running in the background.  Before, such threads would interfere
with cleaning up and destroying them, as well as prevent running another
script.

@item 
gh-109369@footnote{https://github.com/python/cpython/issues/109369}: The internal eval_breaker and supporting flags, plus the
monitoring version have been merged into a single atomic integer to speed
up checks.

@item 
gh-109823@footnote{https://github.com/python/cpython/issues/109823}: Fix bug where compiler does not adjust labels when removing an
empty basic block which is a jump target.

@item 
gh-109793@footnote{https://github.com/python/cpython/issues/109793}: The main thread no longer exits prematurely when a
subinterpreter is cleaned up during runtime finalization.  The bug was a
problem particularly because, when triggered, the Python process would
always return with a 0 exitcode, even if it failed.

@item 
gh-109719@footnote{https://github.com/python/cpython/issues/109719}: Fix missing jump target labels when compiler reorders cold/warm
blocks.

@item 
gh-109595@footnote{https://github.com/python/cpython/issues/109595}: Add @ref{16f,,-X cpu_count}  command line option to
override return results of @ref{4db,,os.cpu_count()} and
@ref{51d,,os.process_cpu_count()}. This option is useful for users who need to
limit CPU resources of a container system without having to modify the
container (application code). Patch by Donghee Na.

@item 
gh-109627@footnote{https://github.com/python/cpython/issues/109627}: Fix bug where the compiler does not assign a new jump target
label to a duplicated small exit block.

@item 
gh-109596@footnote{https://github.com/python/cpython/issues/109596}: Fix some tokens in the grammar that were incorrectly marked as
soft keywords. Also fix some repeated rule names and ensure that repeated
rules are not allowed. Patch by Pablo Galindo

@item 
gh-109496@footnote{https://github.com/python/cpython/issues/109496}: On a Python built in debug mode, @ref{78f,,Py_DECREF()} now
calls @code{_Py_NegativeRefcount()} if the object is a dangling pointer to
deallocated memory: memory filled with @code{0xDD} “dead byte” by the debug
hook on memory allocators. The fix is to check the reference count
`before' checking for @code{_Py_IsImmortal()}. Patch by Victor Stinner.

@item 
gh-107265@footnote{https://github.com/python/cpython/issues/107265}: Deopt opcodes hidden by the executor when base opcode is needed

@item 
gh-109371@footnote{https://github.com/python/cpython/issues/109371}: Deopted instructions correctly for tool initialization and
modified the incorrect assertion in instrumentation, when a previous tool
already sets INSTRUCTION events

@item 
gh-105658@footnote{https://github.com/python/cpython/issues/105658}: Fix bug where the line trace of an except block ending with a
conditional includes an excess event with the line of the conditional
expression.

@item 
gh-109219@footnote{https://github.com/python/cpython/issues/109219}: Fix compiling type param scopes that use a name which is also
free in an inner scope.

@item 
gh-109351@footnote{https://github.com/python/cpython/issues/109351}: Fix crash when compiling an invalid AST involving a named
(walrus) expression.

@item 
gh-109341@footnote{https://github.com/python/cpython/issues/109341}: Fix crash when compiling an invalid AST involving a
@ref{1a55,,ast.TypeAlias}.

@item 
gh-109195@footnote{https://github.com/python/cpython/issues/109195}: Fix source location for the @code{LOAD_*} instruction preceding a
@code{LOAD_SUPER_ATTR} to load the @code{super} global (or shadowing variable)
so that it encompasses only the name @code{super} and not the following
parentheses.

@item 
gh-109256@footnote{https://github.com/python/cpython/issues/109256}: Opcode IDs for specialized opcodes are allocated in their own
range to improve stability of the IDs for the ‘real’ opcodes.

@item 
gh-109216@footnote{https://github.com/python/cpython/issues/109216}: Fix possible memory leak in @ref{369,,BUILD_MAP}.

@item 
gh-109207@footnote{https://github.com/python/cpython/issues/109207}: Fix a SystemError in @code{__repr__} of symtable entry object.

@item 
gh-109179@footnote{https://github.com/python/cpython/issues/109179}: Fix bug where the C traceback display drops notes from
@ref{18e,,SyntaxError}.

@item 
gh-109118@footnote{https://github.com/python/cpython/issues/109118}: Disallow nested scopes (lambdas, generator expressions, and
comprehensions) within PEP 695 annotation scopes that are nested within
classes.

@item 
gh-109156@footnote{https://github.com/python/cpython/issues/109156}: Add tests for de-instrumenting instructions while keeping the
instrumentation for lines

@item 
gh-109114@footnote{https://github.com/python/cpython/issues/109114}: Relax the detection of the error message for invalid lambdas
inside f-strings to not search for arbitrary replacement fields to avoid
false positives. Patch by Pablo Galindo

@item 
gh-105848@footnote{https://github.com/python/cpython/issues/105848}: Add a new @ref{372,,CALL_KW} opcode, used for calls containing
keyword arguments. Also, fix a possible crash when jumping over method
calls in a debugger.

@item 
gh-109052@footnote{https://github.com/python/cpython/issues/109052}: Use the base opcode when comparing code objects to avoid
interference from instrumentation

@item 
gh-109118@footnote{https://github.com/python/cpython/issues/109118}: Fix interpreter crash when a NameError is raised inside the
type parameters of a generic class.

@item 
gh-88943@footnote{https://github.com/python/cpython/issues/88943}: Improve syntax error for non-ASCII character that follows a
numerical literal. It now points on the invalid non-ASCII character, not
on the valid numerical literal.

@item 
gh-108976@footnote{https://github.com/python/cpython/issues/108976}: Fix crash that occurs after de-instrumenting a code object in a
monitoring callback.

@item 
gh-108732@footnote{https://github.com/python/cpython/issues/108732}: Make iteration variables of module- and class-scoped
comprehensions visible to pdb and other tools that use @code{frame.f_locals}
again.

@item 
gh-108959@footnote{https://github.com/python/cpython/issues/108959}: Fix caret placement for error locations for subscript and
binary operations that involve non-semantic parentheses and spaces. Patch
by Pablo Galindo

@item 
gh-104584@footnote{https://github.com/python/cpython/issues/104584}: Fix a crash when running with 
@geindex PYTHONUOPS
@geindex 환경 변수; PYTHONUOPS
@code{PYTHONUOPS} or
@ref{16f,,-X uops} enabled and an error occurs during optimization.

@item 
gh-108727@footnote{https://github.com/python/cpython/issues/108727}: Define @code{tp_dealloc} for @code{CounterOptimizer_Type}. This fixes
a segfault on deallocation.

@item 
gh-108520@footnote{https://github.com/python/cpython/issues/108520}: Fix @code{multiprocessing.synchronize.SemLock.__setstate__()} to
properly initialize
@code{multiprocessing.synchronize.SemLock._is_fork_ctx}. This fixes a
regression when passing a SemLock across nested processes.

Rename @code{multiprocessing.synchronize.SemLock.is_fork_ctx} to
@code{multiprocessing.synchronize.SemLock._is_fork_ctx} to avoid exposing
it as public API.

@item 
gh-108654@footnote{https://github.com/python/cpython/issues/108654}: Restore locals shadowed by an inlined comprehension if the
comprehension raises an exception.

@item 
gh-108488@footnote{https://github.com/python/cpython/issues/108488}: Change the initialization of inline cache entries so that the
cache entry for @code{JUMP_BACKWARD} is initialized to zero, instead of the
@code{adaptive_counter_warmup()} value used for all other instructions. This
counter, unique among instructions, counts up from zero.

@item 
gh-108716@footnote{https://github.com/python/cpython/issues/108716}: Turn off deep-freezing of code objects. Modules are still
frozen, so that a file system search is not needed for common modules.

@item 
gh-108614@footnote{https://github.com/python/cpython/issues/108614}: Add RESUME_CHECK instruction, to avoid having to handle
instrumentation, signals, and contexts switches in the tier 2 execution
engine.

@item 
gh-108487@footnote{https://github.com/python/cpython/issues/108487}: Move an assert that would cause a spurious crash in a devious
case that should only trigger deoptimization.

@item 
gh-106176@footnote{https://github.com/python/cpython/issues/106176}: Use a @code{WeakValueDictionary} to track the lists containing the
modules each thread is currently importing. This helps avoid a reference
leak from keeping the list around longer than necessary. Weakrefs are used
as GC can’t interrupt the cleanup.

@item 
gh-105481@footnote{https://github.com/python/cpython/issues/105481}: The regen-opcode build stage was removed and its work is now
done in regen-cases.

@item 
gh-107901@footnote{https://github.com/python/cpython/issues/107901}: Fix missing line number on @ref{919,,JUMP_BACKWARD} at the end
of a for loop.

@item 
gh-108113@footnote{https://github.com/python/cpython/issues/108113}: The @ref{4b2,,compile()} built-in can now accept a new flag,
@code{ast.PyCF_OPTIMIZED_AST}, which is similar to @code{ast.PyCF_ONLY_AST}
except that the returned @code{AST} is optimized according to the value of
the @code{optimize} argument.

@ref{1c2,,ast.parse()} now accepts an optional argument @code{optimize} which is
passed on to the @ref{4b2,,compile()} built-in. This makes it possible to
obtain an optimized @code{AST}.

@item 
gh-107971@footnote{https://github.com/python/cpython/issues/107971}: Opcode IDs are generated from bytecodes.c instead of being hard
coded in opcode.py.

@item 
gh-107944@footnote{https://github.com/python/cpython/issues/107944}: Improve error message for function calls with bad keyword
arguments. Patch by Pablo Galindo

@item 
gh-108390@footnote{https://github.com/python/cpython/issues/108390}: Raise an exception when setting a non-local event (@code{RAISE},
@code{EXCEPTION_HANDLED}, etc.) in @code{sys.monitoring.set_local_events}.

Fixes crash when tracing in recursive calls to Python classes.

@item 
gh-108035@footnote{https://github.com/python/cpython/issues/108035}: Remove the @code{_PyCFrame} struct, moving the pointer to the
current interpreter frame back to the threadstate, as it was for 3.10 and
earlier. The @code{_PyCFrame} existed as a performance optimization for
tracing. Since PEP 669 has been implemented, this optimization no longer
applies.

@item 
gh-91051@footnote{https://github.com/python/cpython/issues/91051}: Fix abort / segfault when using all eight type watcher slots, on
platforms where @code{char} is signed by default.

@item 
gh-106581@footnote{https://github.com/python/cpython/issues/106581}: Fix possible assertion failures and missing instrumentation
events when 
@geindex PYTHONUOPS
@geindex 환경 변수; PYTHONUOPS
@code{PYTHONUOPS} or @ref{16f,,-X uops} is enabled.

@item 
gh-107526@footnote{https://github.com/python/cpython/issues/107526}: Revert converting @code{vars}, @code{dir}, @code{next}, @code{getattr}, and
@code{iter} to argument clinic.

@item 
gh-84805@footnote{https://github.com/python/cpython/issues/84805}: Autogenerate signature for @ref{16d9,,METH_NOARGS} and
@ref{170c,,METH_O} extension functions.

@item 
gh-107758@footnote{https://github.com/python/cpython/issues/107758}: Make the @code{dump_stack()} routine used by the @code{lltrace}
feature (low-level interpreter debugging) robust against recursion by
ensuring that it never calls a @code{__repr__} method implemented in Python.
Also make the similar output for Tier-2 uops appear on @code{stdout} (instead
of @code{stderr}), to match the @code{lltrace} code in ceval.c.

@item 
gh-107659@footnote{https://github.com/python/cpython/issues/107659}: Add docstrings for @ref{1a56,,ctypes.pointer()} and
@ref{1f1,,ctypes.POINTER()}.

@item 
gh-105848@footnote{https://github.com/python/cpython/issues/105848}: Modify the bytecode so that the actual callable for a
@ref{914,,CALL} is at a consistent position on the stack (regardless of
whether or not bound-method-calling optimizations are active).

@item 
gh-107674@footnote{https://github.com/python/cpython/issues/107674}: Fixed performance regression in @code{sys.settrace}.

@item 
gh-107724@footnote{https://github.com/python/cpython/issues/107724}: In pre-release versions of 3.12, up to rc1, the sys.monitoring
callback function for the @code{PY_THROW} event was missing the third,
exception argument. That is now fixed.

@item 
gh-84436@footnote{https://github.com/python/cpython/issues/84436}: Skip reference count modifications for many known immortal
objects.

@item 
gh-107596@footnote{https://github.com/python/cpython/issues/107596}: Specialize subscripting @ref{169,,str} objects by @ref{19b,,int}
indexes.

@item 
gh-107080@footnote{https://github.com/python/cpython/issues/107080}: Trace refs builds (@code{--with-trace-refs}) were crashing when
used with isolated subinterpreters.  The problematic global state has been
isolated to each interpreter.  Other fixing the crashes, this change does
not affect users.

@item 
gh-107557@footnote{https://github.com/python/cpython/issues/107557}: Generate the cases needed for the barebones tier 2 abstract
interpreter for optimization passes in CPython.

@item 
gh-106608@footnote{https://github.com/python/cpython/issues/106608}: Make @code{_PyUOpExecutorObject} variable length.

@item 
gh-100964@footnote{https://github.com/python/cpython/issues/100964}: Clear generators’ exception state after @code{return} to break
reference cycles.

@item 
gh-107455@footnote{https://github.com/python/cpython/issues/107455}: Improve error messages when converting an incompatible type to
@ref{1a57,,ctypes.c_char_p}, @ref{1a58,,ctypes.c_wchar_p} and
@ref{1a59,,ctypes.c_void_p}.

@item 
gh-107263@footnote{https://github.com/python/cpython/issues/107263}: Increase C recursion limit for functions other than the main
interpreter from 800 to 1500. This should allow functions like
@code{list.__repr__} and @code{json.dumps} to handle all the inputs that they
could prior to 3.12

@item 
gh-104584@footnote{https://github.com/python/cpython/issues/104584}: Fix an issue which caused incorrect inline caches to be read
when running with 
@geindex PYTHONUOPS
@geindex 환경 변수; PYTHONUOPS
@code{PYTHONUOPS} or @ref{16f,,-X uops} enabled.

@item 
gh-104432@footnote{https://github.com/python/cpython/issues/104432}: Fix potential unaligned memory access on C APIs involving
returned sequences of @code{char *} pointers within the @ref{6a,,grp} and
@ref{d1,,socket} modules. These were revealed using a
@code{-fsaniziter=alignment} build on ARM macOS. Patch by Christopher Chavez.

@item 
gh-106078@footnote{https://github.com/python/cpython/issues/106078}: Isolate @code{_decimal} (apply 
@geindex Python 향상 제안; PEP 687
PEP 687@footnote{https://peps.python.org/pep-0687/}). Patch by Charlie
Zhao.

@item 
gh-106898@footnote{https://github.com/python/cpython/issues/106898}: Add the exception as the third argument to @code{PY_UNIND}
callbacks in @code{sys.monitoring}. This makes the @code{PY_UNWIND} callback
consistent with the other exception handling callbacks.

@item 
gh-106895@footnote{https://github.com/python/cpython/issues/106895}: Raise a @code{ValueError} when a monitoring callback function
returns @code{DISABLE} for events that cannot be disabled locally.

@item 
gh-106897@footnote{https://github.com/python/cpython/issues/106897}: Add a @code{RERAISE} event to @code{sys.monitoring}, which occurs
when an exception is reraise, either explicitly by a plain @code{raise}
statement, or implicitly in an @code{except} or @code{finally} block.

@item 
gh-77377@footnote{https://github.com/python/cpython/issues/77377}: Ensure that multiprocessing synchronization objects created in a
fork context are not sent to a different process created in a spawn
context. This changes a segfault into an actionable RuntimeError in the
parent process.

@item 
gh-106931@footnote{https://github.com/python/cpython/issues/106931}: Statically allocated string objects are now interned globally
instead of per-interpreter.  This fixes a situation where such a string
would only be interned in a single interpreter. Normal string objects are
unaffected.

@item 
gh-104621@footnote{https://github.com/python/cpython/issues/104621}: Unsupported modules now always fail to be imported.

@item 
gh-107122@footnote{https://github.com/python/cpython/issues/107122}: Add @code{dbm.ndbm.ndbm.clear()} to @ref{38,,dbm.ndbm}. Patch By
Donghee Na.

@item 
gh-107122@footnote{https://github.com/python/cpython/issues/107122}: Add @code{dbm.gnu.gdbm.clear()} to @ref{37,,dbm.gnu}. Patch By
Donghee Na.

@item 
gh-107015@footnote{https://github.com/python/cpython/issues/107015}: The ASYNC and AWAIT tokens are removed from the Grammar, which
removes the possibility of making @code{async} and @code{await} soft keywords
when using @code{feature_version<7} in @ref{1c2,,ast.parse()}.

@item 
gh-106917@footnote{https://github.com/python/cpython/issues/106917}: Fix classmethod-style @ref{1a6,,super()} method calls (i.e., where
the second argument to @code{super()}, or the implied second argument drawn
from @code{self/cls} in the case of zero-arg super, is a type) when the
target of the call is not a classmethod.

@item 
gh-105699@footnote{https://github.com/python/cpython/issues/105699}: Python no longer crashes due an infrequent race when
initializing per-interpreter interned strings.  The crash would manifest
when the interpreter was finalized.

@item 
gh-105699@footnote{https://github.com/python/cpython/issues/105699}: Python no longer crashes due to an infrequent race in setting
@code{Py_FileSystemDefaultEncoding} and @code{Py_FileSystemDefaultEncodeErrors}
(both deprecated), when simultaneously initializing two isolated
subinterpreters.  Now they are only set during runtime initialization.

@item 
gh-106908@footnote{https://github.com/python/cpython/issues/106908}: Fix various hangs, reference leaks, test failures, and
tracing/introspection bugs when running with 
@geindex PYTHONUOPS
@geindex 환경 변수; PYTHONUOPS
@code{PYTHONUOPS} or
@ref{16f,,-X uops} enabled.

@item 
gh-106092@footnote{https://github.com/python/cpython/issues/106092}: Fix a segmentation fault caused by a use-after-free bug in
@code{frame_dealloc} when the trashcan delays the deallocation of a
@code{PyFrameObject}.

@item 
gh-106485@footnote{https://github.com/python/cpython/issues/106485}: Reduce the number of materialized instances dictionaries by
dematerializing them when possible.

@item 
gh-106719@footnote{https://github.com/python/cpython/issues/106719}: No longer suppress arbitrary errors in the @code{__annotations__}
getter and setter in the type and module types.

@item 
gh-106723@footnote{https://github.com/python/cpython/issues/106723}: Propagate @code{frozen_modules} to multiprocessing spawned process
interpreters.

@item 
gh-104909@footnote{https://github.com/python/cpython/issues/104909}: Split @code{LOAD_ATTR_INSTANCE_VALUE} into micro-ops.

@item 
gh-104909@footnote{https://github.com/python/cpython/issues/104909}: Split @ref{1a5a,,LOAD_GLOBAL} specializations into micro-ops.

@item 
gh-106597@footnote{https://github.com/python/cpython/issues/106597}: A new debug structure of offsets has been added to the
@code{_PyRuntimeState} that will help out-of-process debuggers and profilers
to obtain the offsets to relevant interpreter structures in a way that is
agnostic of how Python was compiled and that doesn’t require copying the
headers. Patch by Pablo Galindo

@item 
gh-106487@footnote{https://github.com/python/cpython/issues/106487}: Allow the `count' argument of @ref{4b9,,str.replace()} to be a
keyword. Patch by Hugo van Kemenade.

@item 
gh-96844@footnote{https://github.com/python/cpython/issues/96844}: Improve error message of @ref{1a5b,,list.remove()}. Patch by Donghee
Na.

@item 
gh-81283@footnote{https://github.com/python/cpython/issues/81283}: Compiler now strips indents from docstrings. It reduces @code{pyc}
file size 5% when the module is heavily documented. This change affects to
@code{__doc__} so tools like doctest will be affected.

@item 
gh-106396@footnote{https://github.com/python/cpython/issues/106396}: When the format specification of an f-string expression is
empty, the parser now generates an empty @ref{1a5c,,ast.JoinedStr} node for
it instead of an one-element @code{ast.JoinedStr} with an empty string
@ref{2ef,,ast.Constant}.

@item 
gh-100288@footnote{https://github.com/python/cpython/issues/100288}: Specialize @ref{703,,LOAD_ATTR} for non-descriptors on the
class. Adds @code{LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES} and
@code{LOAD_ATTR_NONDESCRIPTOR_NO_DICT}.

@item 
gh-106008@footnote{https://github.com/python/cpython/issues/106008}: Fix possible reference leaks when failing to optimize
comparisons with @ref{884,,None} in the bytecode compiler.

@item 
gh-106145@footnote{https://github.com/python/cpython/issues/106145}: Make @code{end_lineno} and @code{end_col_offset} required on
@code{type_param} ast nodes.

@item 
gh-106213@footnote{https://github.com/python/cpython/issues/106213}: Changed the way that Emscripten call trampolines work for
compatibility with Wasm/JS Promise integration.

@item 
gh-106182@footnote{https://github.com/python/cpython/issues/106182}: @ref{e52,,sys.getfilesystemencoding()} and
@ref{ee1,,sys.getfilesystemencodeerrors} now return interned Unicode object.

@item 
gh-106210@footnote{https://github.com/python/cpython/issues/106210}: Removed Emscripten import trampoline as it was no longer
necessary for Pyodide.

@item 
gh-104584@footnote{https://github.com/python/cpython/issues/104584}: Added a new, experimental, tracing optimizer and interpreter
(a.k.a. “tier 2”). This currently pessimizes, so don’t use yet – this is
infrastructure so we can experiment with optimizing passes. To enable it,
pass @code{-Xuops} or set @code{PYTHONUOPS=1}. To get debug output, set
@code{PYTHONUOPSDEBUG=N} where @code{N} is a debug level (0-4, where 0 is no
debug output and 4 is excessively verbose).

@item 
gh-105775@footnote{https://github.com/python/cpython/issues/105775}: @ref{1a5d,,LOAD_CLOSURE} is now a pseudo-op.

@item 
gh-105730@footnote{https://github.com/python/cpython/issues/105730}: Allow any callable other than type objects as the condition
predicate in @ref{18d9,,BaseExceptionGroup.split()} and
@ref{1a38,,BaseExceptionGroup.subgroup()}.

@item 
gh-105979@footnote{https://github.com/python/cpython/issues/105979}: Fix crash in @code{_imp.get_frozen_object()} due to improper
exception handling.

@item 
gh-106003@footnote{https://github.com/python/cpython/issues/106003}: Add a new @ref{1a5e,,TO_BOOL} instruction, which performs boolean
conversions for @ref{1a5f,,POP_JUMP_IF_TRUE}, @ref{1a60,,POP_JUMP_IF_FALSE},
and @ref{1a61,,UNARY_NOT} (which all expect exact @ref{3c3,,bool} values now).
Also, modify the oparg of @ref{b61,,COMPARE_OP} to include an optional
“boolean conversion” flag.

@item 
gh-98931@footnote{https://github.com/python/cpython/issues/98931}: Ensure custom @ref{18e,,SyntaxError} error messages are raised for
invalid imports with multiple targets. Patch by Pablo Galindo

@item 
gh-105724@footnote{https://github.com/python/cpython/issues/105724}: Improve @code{assert} error messages by providing exact error
range.

@item 
gh-105908@footnote{https://github.com/python/cpython/issues/105908}: Fixed bug where gh-99111@footnote{https://github.com/python/cpython/issues/99111} breaks future import
@code{barry_as_FLUFL} in the Python REPL.

@item 
gh-105840@footnote{https://github.com/python/cpython/issues/105840}: Fix possible crashes when specializing function calls with too
many @code{__defaults__}.

@item 
gh-105831@footnote{https://github.com/python/cpython/issues/105831}: Fix an f-string bug, where using a debug expression (the @code{=}
sign) that appears in the last line of a file results to the debug buffer
that holds the expression text being one character too small.

@item 
gh-105800@footnote{https://github.com/python/cpython/issues/105800}: Correctly issue @ref{1ae,,SyntaxWarning} in f-strings if invalid
sequences are used. Patch by Pablo Galindo

@item 
gh-105340@footnote{https://github.com/python/cpython/issues/105340}: Include the comprehension iteration variable in @code{locals()}
inside a module- or class-scope comprehension.

@item 
gh-105331@footnote{https://github.com/python/cpython/issues/105331}: Raise @ref{2ec,,ValueError} if the @code{delay} argument to
@ref{c63,,asyncio.sleep()} is a NaN (matching @ref{8ab,,time.sleep()}).

@item 
gh-105587@footnote{https://github.com/python/cpython/issues/105587}: The runtime can’t guarantee that immortal objects will not be
mutated by Extensions. Thus, this modifies _PyStaticObject_CheckRefcnt to
warn instead of asserting.

@item 
gh-105564@footnote{https://github.com/python/cpython/issues/105564}: Don’t include artificil newlines in the @code{line} attribute of
tokens in the APIs of the @ref{101,,tokenize} module. Patch by Pablo Galindo

@item 
gh-105549@footnote{https://github.com/python/cpython/issues/105549}: Tokenize separately @code{NUMBER} and @code{NAME} tokens that are not
ambiguous. Patch by Pablo Galindo.

@item 
gh-105588@footnote{https://github.com/python/cpython/issues/105588}: Fix an issue that could result in crashes when compiling
malformed @ref{9,,ast} nodes.

@item 
gh-100987@footnote{https://github.com/python/cpython/issues/100987}: Allow objects other than code objects as the “executable” in
internal frames. In the long term, this can help tools like Cython and
PySpy interact more efficiently. In the shorter term, it allows us to
perform some optimizations more simply.

@item 
gh-105375@footnote{https://github.com/python/cpython/issues/105375}: Fix bugs in the @ref{13,,builtins} module where exceptions could
end up being overwritten.

@item 
gh-105375@footnote{https://github.com/python/cpython/issues/105375}: Fix bug in the compiler where an exception could end up being
overwritten.

@item 
gh-105375@footnote{https://github.com/python/cpython/issues/105375}: Improve error handling in @ref{1a62,,PyUnicode_BuildEncodingMap()}
where an exception could end up being overwritten.

@item 
gh-105486@footnote{https://github.com/python/cpython/issues/105486}: Change the repr of @code{ParamSpec} list of args in
@code{types.GenericAlias}.

@item 
gh-105678@footnote{https://github.com/python/cpython/issues/105678}: Break the @code{MAKE_FUNCTION} instruction into two parts,
@code{MAKE_FUNCTION} which makes the function and @code{SET_FUNCTION_ATTRIBUTE}
which sets the attributes on the function. This makes the stack effect of
@code{MAKE_FUNCTION} regular to ease optimization and code generation.

@item 
gh-105435@footnote{https://github.com/python/cpython/issues/105435}: Fix spurious newline character if file ends on a comment
without a newline. Patch by Pablo Galindo

@item 
gh-105390@footnote{https://github.com/python/cpython/issues/105390}: Correctly raise @ref{763,,tokenize.TokenError} exceptions instead
of @ref{18e,,SyntaxError} for tokenize errors such as incomplete input. Patch
by Pablo Galindo

@item 
gh-105259@footnote{https://github.com/python/cpython/issues/105259}: Don’t include newline character for trailing @code{NEWLINE} tokens
emitted in the @ref{101,,tokenize} module. Patch by Pablo Galindo

@item 
gh-104635@footnote{https://github.com/python/cpython/issues/104635}: Eliminate redundant @ref{1a63,,STORE_FAST} instructions in the
compiler. Patch by Donghee Na and Carl Meyer.

@item 
gh-105324@footnote{https://github.com/python/cpython/issues/105324}: Fix the main function of the @ref{101,,tokenize} module when
reading from @code{sys.stdin}. Patch by Pablo Galindo

@item 
gh-33092@footnote{https://github.com/python/cpython/issues/33092}: Simplify and speed up interpreter for f-strings. Removes
@code{FORMAT_VALUE} opcode. Add @code{CONVERT_VALUE}, @code{FORMAT_SIMPLE} and
@code{FORMAT_WITH_SPEC} opcode. Compiler emits more efficient sequence for
each format expression.

@item 
gh-105229@footnote{https://github.com/python/cpython/issues/105229}: Remove remaining two-codeunit superinstructions. All remaining
superinstructions only take a single codeunit, simplifying instrumentation
and quickening.

@item 
gh-105235@footnote{https://github.com/python/cpython/issues/105235}: Prevent out-of-bounds memory access during @code{mmap.find()}
calls.

@item 
gh-98963@footnote{https://github.com/python/cpython/issues/98963}: Restore the ability for a subclass of @ref{4b3,,property} to
define @code{__slots__} or otherwise be dict-less by ignoring failures to set
a docstring on such a class.  This behavior had regressed in 3.12beta1.
An @ref{5ee,,AttributeError} where there had not previously been one was
disruptive to existing code.

@item 
gh-104812@footnote{https://github.com/python/cpython/issues/104812}: The “pending call” machinery now works for all interpreters,
not just the main interpreter, and runs in all threads, not just the main
thread. Some calls are still only done in the main thread, ergo in the
main interpreter. This change does not affect signal handling nor the
existing public C-API (@code{Py_AddPendingCall()}), which both still only
target the main thread. The new functionality is meant strictly for
internal use for now, since consequences of its use are not well
understood yet outside some very restricted cases.  This change brings the
capability in line with the intention when the state was made
per-interpreter several years ago.

@item 
gh-105194@footnote{https://github.com/python/cpython/issues/105194}: Do not escape with backslashes f-string format specifiers.
Patch by Pablo Galindo

@item 
gh-105229@footnote{https://github.com/python/cpython/issues/105229}: Replace some dynamic superinstructions with single instruction
equivalents.

@item 
gh-105162@footnote{https://github.com/python/cpython/issues/105162}: Fixed bug in generator.close()/throw() where an inner iterator
would be ignored when the outer iterator was instrumented.

@item 
gh-105164@footnote{https://github.com/python/cpython/issues/105164}: Ensure annotations are set up correctly if the only annotation
in a block is within a @ref{a0e,,match} block. Patch by Jelle Zijlstra.

@item 
gh-105148@footnote{https://github.com/python/cpython/issues/105148}: Make @code{_PyASTOptimizeState} internal to ast_opt.c. Make
@code{_PyAST_Optimize} take two integers instead of a pointer to this struct.
This avoids the need to include pycore_compile.h in ast_opt.c.

@item 
gh-104799@footnote{https://github.com/python/cpython/issues/104799}: Attributes of @ref{9,,ast} nodes that are lists now default to
the empty list if omitted. This means that some code that previously
raised @ref{198,,TypeError} when the AST node was used will now proceed with
the empty list instead. Patch by Jelle Zijlstra.

@item 
gh-105111@footnote{https://github.com/python/cpython/issues/105111}: Remove the old trashcan macros @code{Py_TRASHCAN_SAFE_BEGIN} and
@code{Py_TRASHCAN_SAFE_END}. They should be replaced by the new macros
@code{Py_TRASHCAN_BEGIN} and @code{Py_TRASHCAN_END}.

@item 
gh-105035@footnote{https://github.com/python/cpython/issues/105035}: Fix @ref{1a6,,super()} calls on types with custom
@ref{1a64,,tp_getattro} implementation (e.g. meta-types.)

@item 
gh-105017@footnote{https://github.com/python/cpython/issues/105017}: Show CRLF lines in the tokenize string attribute in both NL and
NEWLINE tokens. Patch by Marta Gómez.

@item 
gh-105013@footnote{https://github.com/python/cpython/issues/105013}: Fix handling of multiline parenthesized lambdas in
@ref{17c9,,inspect.getsource()}. Patch by Pablo Galindo

@item 
gh-105017@footnote{https://github.com/python/cpython/issues/105017}: Do not include an additional final @code{NL} token when parsing
files having CRLF lines. Patch by Marta Gómez.

@item 
gh-104976@footnote{https://github.com/python/cpython/issues/104976}: Ensure that trailing @code{DEDENT} @code{tokenize.TokenInfo}
objects emitted by the @ref{101,,tokenize} module are reported as in Python
3.11. Patch by Pablo Galindo

@item 
gh-104972@footnote{https://github.com/python/cpython/issues/104972}: Ensure that the @code{line} attribute in
@code{tokenize.TokenInfo} objects in the @ref{101,,tokenize} module are
always correct. Patch by Pablo Galindo

@item 
gh-104955@footnote{https://github.com/python/cpython/issues/104955}: Fix signature for the new @ref{1a65,,__release_buffer__()}
slot. Patch by Jelle Zijlstra.

@item 
gh-104690@footnote{https://github.com/python/cpython/issues/104690}: Starting new threads and process creation through
@ref{4b6,,os.fork()} during interpreter shutdown (such as from @ref{d,,atexit}
handlers) is no longer supported.  It can lead to race condition between
the main Python runtime thread freeing thread states while internal
@ref{f3,,threading} routines are trying to allocate and use the state of just
created threads. Or forked children trying to use the mid-shutdown runtime
and thread state in the child process.

@item 
gh-104879@footnote{https://github.com/python/cpython/issues/104879}: Fix crash when accessing the @code{__module__} attribute of type
aliases defined outside a module. Patch by Jelle Zijlstra.

@item 
gh-104825@footnote{https://github.com/python/cpython/issues/104825}: Tokens emitted by the @ref{101,,tokenize} module do not include an
implicit @code{\n} character in the @code{line} attribute anymore. Patch by
Pablo Galindo

@item 
gh-104770@footnote{https://github.com/python/cpython/issues/104770}: If a generator returns a value upon being closed, the value is
now returned by @ref{179b,,generator.close()}.

@item 
gh-89091@footnote{https://github.com/python/cpython/issues/89091}: Raise @ref{4d8,,RuntimeWarning} for unawaited async generator
methods like @ref{ad6,,asend()}, @ref{71c,,athrow()} and
@ref{ad5,,aclose()}. Patch by Kumar Aditya.

@item 
gh-96663@footnote{https://github.com/python/cpython/issues/96663}: Add a better, more introspect-able error message when setting
attributes on classes without a @code{__dict__} and no slot member for the
attribute.

@item 
gh-93627@footnote{https://github.com/python/cpython/issues/93627}: Update the Python pickle module implementation to match the C
implementation of the pickle module. For objects setting reduction methods
like @ref{196c,,__reduce_ex__()} or @ref{bc5,,__reduce__()} to
@code{None}, pickling will result in a @ref{198,,TypeError}.

@item 
gh-101006@footnote{https://github.com/python/cpython/issues/101006}: Improve error handling when read @ref{91,,marshal} data.

@item 
gh-91095@footnote{https://github.com/python/cpython/issues/91095}: Specializes calls to most Python classes. Specifically, any
class that inherits from @code{object}, or another Python class, and does not
override @code{__new__}.

The specialized instruction does the following:


@enumerate 

@item 
Creates the object (by calling @code{object.__new__})

@item 
Pushes a shim frame to the frame stack (to cleanup after @code{__init__})

@item 
Pushes the frame for @code{__init__} to the frame stack
@end enumerate

Speeds up the instantiation of most Python classes.
@end itemize

@node Library<64>,Documentation<20>,Core and Builtins<59>,Python 3 13 0 alpha 1
@anchor{whatsnew/changelog id278}@anchor{1a66}
@subsubsection Library



@itemize -

@item 
gh-110786@footnote{https://github.com/python/cpython/issues/110786}: @ref{e1,,sysconfig}’s CLI now ignores @ref{125b,,BrokenPipeError},
making it exit normally if its output is being piped and the pipe closes.

@item 
gh-103480@footnote{https://github.com/python/cpython/issues/103480}: The @ref{e1,,sysconfig} module is now a package, instead of a
single-file module.

@item 
gh-110733@footnote{https://github.com/python/cpython/issues/110733}: Micro-optimization: Avoid calling @code{min()}, @code{max()} in
@code{BaseEventLoop._run_once()}.

@item 
gh-94597@footnote{https://github.com/python/cpython/issues/94597}: Added @ref{1a67,,asyncio.EventLoop} for use with the
@ref{2f3,,asyncio.run()} `loop_factory' kwarg to avoid calling the asyncio
policy system.

@item 
gh-110682@footnote{https://github.com/python/cpython/issues/110682}: @ref{673,,runtime-checkable protocols}
used to consider @code{__match_args__} a protocol member in
@code{__instancecheck__} if it was present on the protocol. Now, this
attribute is ignored if it is present.

@item 
gh-110488@footnote{https://github.com/python/cpython/issues/110488}: Fix a couple of issues in @ref{1a68,,pathlib.PurePath.with_name()}: a
single dot was incorrectly considered a valid name, and in
@code{PureWindowsPath}, a name with an NTFS alternate data stream, like
@code{a:b}, was incorrectly considered invalid.

@item 
gh-110590@footnote{https://github.com/python/cpython/issues/110590}: Fix a bug in @code{_sre.compile()} where @ref{198,,TypeError} would
be overwritten by @ref{a81,,OverflowError} when the `code' argument was a list
of non-ints.

@item 
gh-65052@footnote{https://github.com/python/cpython/issues/65052}: Prevent @ref{aa,,pdb} from crashing when trying to display
undisplayable objects

@item 
gh-110519@footnote{https://github.com/python/cpython/issues/110519}: Deprecation warning about non-integer number in @ref{67,,gettext}
now always refers to the line in the user code where gettext function or
method is used. Previously it could refer to a line in @code{gettext} code.

@item 
gh-89902@footnote{https://github.com/python/cpython/issues/89902}: Deprecate non-standard format specifier “N” for
@ref{1fe,,decimal.Decimal}. It was not documented and only supported in the
C implementation.

@item 
gh-110378@footnote{https://github.com/python/cpython/issues/110378}: @ref{1407,,contextmanager()} and
@ref{d1e,,asynccontextmanager()} context managers now close an
invalid underlying generator object that yields more then one value.

@item 
gh-106670@footnote{https://github.com/python/cpython/issues/106670}: In @ref{aa,,pdb}, set convenience variable @code{$_exception} for
post mortem debugging.

@item 
gh-110365@footnote{https://github.com/python/cpython/issues/110365}: Fix @ref{1a69,,termios.tcsetattr()} bug that was overwriting existing
errors during parsing integers from @code{term} list.

@item 
gh-109653@footnote{https://github.com/python/cpython/issues/109653}: Slightly improve the import time of several standard-library
modules by deferring imports of @ref{118,,warnings} within those modules.
Patch by Alex Waygood.

@item 
gh-110273@footnote{https://github.com/python/cpython/issues/110273}: @ref{1a6a,,dataclasses.replace()} now raises TypeError instead of
ValueError if specify keyword argument for a field declared with
init=False or miss keyword argument for required InitVar field.

@item 
gh-110249@footnote{https://github.com/python/cpython/issues/110249}: Add @code{--inline-caches} flag to @code{dis} command line.

@item 
gh-109653@footnote{https://github.com/python/cpython/issues/109653}: Fix a Python 3.12 regression in the import time of
@ref{bd,,random}. Patch by Alex Waygood.

@item 
gh-110222@footnote{https://github.com/python/cpython/issues/110222}: Add support of struct sequence objects in @ref{1c0,,copy.replace()}.
Patched by Xuehai Pan.

@item 
gh-109649@footnote{https://github.com/python/cpython/issues/109649}: @ref{98,,multiprocessing}, @ref{24,,concurrent.futures},
@ref{21,,compileall}: Replace @ref{4db,,os.cpu_count()} with
@ref{51d,,os.process_cpu_count()} to select the default number of worker
threads and processes. Get the CPU affinity if supported. Patch by Victor
Stinner.

@item 
gh-110150@footnote{https://github.com/python/cpython/issues/110150}: Fix base case handling in statistics.quantiles.  Now allows a
single data point.

@item 
gh-110036@footnote{https://github.com/python/cpython/issues/110036}: On Windows, multiprocessing @code{Popen.terminate()} now catches
@ref{f3d,,PermissionError} and get the process exit code. If the process is
still running, raise again the @code{PermissionError}. Otherwise, the
process terminated as expected: store its exit code. Patch by Victor
Stinner.

@item 
gh-110038@footnote{https://github.com/python/cpython/issues/110038}: Fixed an issue that caused @code{KqueueSelector.select()} to not
return all the ready events in some cases when a file descriptor is
registered for both read and write.

@item 
gh-110045@footnote{https://github.com/python/cpython/issues/110045}: Update the @ref{de,,symtable} module to support the new scopes
introduced by 
@geindex Python 향상 제안; PEP 695
PEP 695@footnote{https://peps.python.org/pep-0695/}.

@item 
gh-88402@footnote{https://github.com/python/cpython/issues/88402}: Add new variables to @ref{298,,sysconfig.get_config_vars()} on
Windows: @code{LIBRARY}, @code{LDLIBRARY}, @code{LIBDIR}, @code{SOABI}, and
@code{Py_NOGIL}.

@item 
gh-109631@footnote{https://github.com/python/cpython/issues/109631}: @ref{be,,re} functions such as @ref{1229,,re.findall()},
@ref{5a1,,re.split()}, @ref{1431,,re.search()} and @ref{5a2,,re.sub()} which perform short
repeated matches can now be interrupted by user.

@item 
gh-109653@footnote{https://github.com/python/cpython/issues/109653}: Reduce the import time of @ref{54,,email.utils} by around 43%.
This results in the import time of @ref{48,,email.message} falling by around
18%, which in turn reduces the import time of @ref{7e,,importlib.metadata} by
around 6%. Patch by Alex Waygood.

@item 
gh-109818@footnote{https://github.com/python/cpython/issues/109818}: Fix @ref{13f8,,reprlib.recursive_repr()} not copying
@code{__type_params__} from decorated function.

@item 
gh-109047@footnote{https://github.com/python/cpython/issues/109047}: @ref{24,,concurrent.futures}: The `executor manager thread' now
catches exceptions when adding an item to the `call queue'. During Python
finalization, creating a new thread can now raise @ref{244,,RuntimeError}.
Catch the exception and call @code{terminate_broken()} in this case. Patch by
Victor Stinner.

@item 
gh-109782@footnote{https://github.com/python/cpython/issues/109782}: Ensure the signature of @ref{c04,,os.path.isdir()} is identical on
all platforms. Patch by Amin Alaee.

@item 
gh-109653@footnote{https://github.com/python/cpython/issues/109653}: Improve import time of @ref{63,,functools} by around 13%. Patch by
Alex Waygood.

@item 
gh-109590@footnote{https://github.com/python/cpython/issues/109590}: @ref{6da,,shutil.which()} will prefer files with an extension in
@code{PATHEXT} if the given mode includes @code{os.X_OK} on win32. If no
@code{PATHEXT} match is found, a file without an extension in @code{PATHEXT} can
be returned. This change will have @code{shutil.which()} act more similarly
to previous behavior in Python 3.11.

@item 
gh-109653@footnote{https://github.com/python/cpython/issues/109653}: Reduce the import time of @ref{5a,,enum} by over 50%. Patch by
Alex Waygood.

@item 
gh-109593@footnote{https://github.com/python/cpython/issues/109593}: Avoid deadlocking on a reentrant call to the multiprocessing
resource tracker. Such a reentrant call, though unlikely, can happen if a
GC pass invokes the finalizer for a multiprocessing object such as
SemLock.

@item 
gh-109653@footnote{https://github.com/python/cpython/issues/109653}: Reduce the import time of @ref{10a,,typing} by around a third.
Patch by Alex Waygood.

@item 
gh-109649@footnote{https://github.com/python/cpython/issues/109649}: Add @ref{51d,,os.process_cpu_count()} function to get the number of
logical CPUs usable by the calling thread of the current process. Patch by
Victor Stinner.

@item 
gh-74481@footnote{https://github.com/python/cpython/issues/74481}: Add @code{set_error_mode} related constants in @code{msvcrt} module in
Python debug build.

@item 
gh-109613@footnote{https://github.com/python/cpython/issues/109613}: Fix @ref{26d,,os.stat()} and @ref{1a6b,,os.DirEntry.stat()}: check for
exceptions. Previously, on Python built in debug mode, these functions
could trigger a fatal Python error (and abort the process) when a function
succeeded with an exception set. Patch by Victor Stinner.

@item 
gh-109599@footnote{https://github.com/python/cpython/issues/109599}: Expose the type of PyCapsule objects as @code{types.CapsuleType}.

@item 
gh-109109@footnote{https://github.com/python/cpython/issues/109109}: You can now get the raw TLS certificate chains from TLS
connections via @ref{195d,,ssl.SSLSocket.get_verified_chain()} and
@ref{195e,,ssl.SSLSocket.get_unverified_chain()} methods.

Contributed by Mateusz Nowak.

@item 
gh-109559@footnote{https://github.com/python/cpython/issues/109559}: Update @ref{10b,,unicodedata} database to Unicode 15.1.0.

@item 
gh-109543@footnote{https://github.com/python/cpython/issues/109543}: Remove unnecessary @ref{6f8,,hasattr()} check during
@ref{332,,typing.TypedDict} creation.

@item 
gh-109495@footnote{https://github.com/python/cpython/issues/109495}: Remove unnecessary extra @code{__slots__} in
@ref{4e2,,datetime}'s pure python implementation to reduce memory
size, as they are defined in the superclass. Patch by James Hilton-Balfe

@item 
gh-109461@footnote{https://github.com/python/cpython/issues/109461}: @ref{8b,,logging}: Use a context manager for lock acquisition.

@item 
gh-109096@footnote{https://github.com/python/cpython/issues/109096}: @ref{325,,http.server.CGIHTTPRequestHandler} has been deprecated
for removal in 3.15.  Its design is old and the web world has long since
moved beyond CGI.

@item 
gh-109409@footnote{https://github.com/python/cpython/issues/109409}: Fix error when it was possible to inherit a frozen dataclass
from multiple parents some of which were possibly not frozen.

@item 
gh-109375@footnote{https://github.com/python/cpython/issues/109375}: The @ref{aa,,pdb} @code{alias} command now prevents registering
aliases without arguments.

@item 
gh-109319@footnote{https://github.com/python/cpython/issues/109319}: Deprecate the @code{dis.HAVE_ARGUMENT} field in favour of
@code{dis.hasarg}.

@item 
gh-107219@footnote{https://github.com/python/cpython/issues/107219}: Fix a race condition in @code{concurrent.futures}. When a process
in the process pool was terminated abruptly (while the future was running
or pending), close the connection write end. If the call queue is blocked
on sending bytes to a worker process, closing the connection write end
interrupts the send, so the queue can be closed. Patch by Victor Stinner.

@item 
gh-66143@footnote{https://github.com/python/cpython/issues/66143}: The @ref{1a6c,,codecs.CodecInfo} object has been made copyable and
pickleable. Patched by Robert Lehmann and Furkan Onder.

@item 
gh-109187@footnote{https://github.com/python/cpython/issues/109187}: @ref{1a6d,,pathlib.Path.resolve()} now treats symlink loops like
other errors: in strict mode, @ref{2c0,,OSError} is raised, and in non-strict
mode, no exception is raised.

@item 
gh-50644@footnote{https://github.com/python/cpython/issues/50644}: Attempts to pickle or create a shallow or deep copy of
@ref{1c,,codecs} streams now raise a TypeError. Previously, copying failed
with a RecursionError, while pickling produced wrong results that
eventually caused unpickling to fail with a RecursionError.

@item 
gh-109174@footnote{https://github.com/python/cpython/issues/109174}: Add support of @ref{4e5,,types.SimpleNamespace} in
@ref{1c0,,copy.replace()}.

@item 
gh-109164@footnote{https://github.com/python/cpython/issues/109164}: @ref{aa,,pdb}: Replace @ref{65,,getopt} with @ref{7,,argparse} for
parsing command line arguments.

@item 
gh-109151@footnote{https://github.com/python/cpython/issues/109151}: Enable @code{readline} editing features in the @ref{672,,sqlite3 command-line interface} (@code{python -m sqlite3}).

@item 
gh-108987@footnote{https://github.com/python/cpython/issues/108987}: Fix @ref{4b5,,_thread.start_new_thread()} race condition. If a
thread is created during Python finalization, the newly spawned thread now
exits immediately instead of trying to access freed memory and lead to a
crash. Patch by Victor Stinner.

@item 
gh-108682@footnote{https://github.com/python/cpython/issues/108682}: Enum: require @code{names=()} or @code{type=...} to create an empty
enum using the functional syntax.

@item 
gh-109033@footnote{https://github.com/python/cpython/issues/109033}: Exceptions raised by os.utime builtin function now include the
related filename

@item 
gh-108843@footnote{https://github.com/python/cpython/issues/108843}: Fix an issue in @ref{ae2,,ast.unparse()} when unparsing f-strings
containing many quote types.

@item 
gh-108469@footnote{https://github.com/python/cpython/issues/108469}: @ref{ae2,,ast.unparse()} now supports new @ref{669,,f-string} syntax
introduced in Python 3.12. Note that the f-string quotes are
reselected for simplicity under the new syntax. (Patch by Steven Sun)

@item 
gh-108751@footnote{https://github.com/python/cpython/issues/108751}: Add @ref{1c0,,copy.replace()} function which allows to create a
modified copy of an object. It supports named tuples, dataclasses, and
many other objects.

@item 
gh-108682@footnote{https://github.com/python/cpython/issues/108682}: Enum: raise @ref{198,,TypeError} if @code{super().__new__()} is called
from a custom @code{__new__}.

@item 
gh-108278@footnote{https://github.com/python/cpython/issues/108278}: Deprecate passing the callback callable by keyword for the
following @ref{54c,,sqlite3.Connection} APIs:


@itemize *

@item 
@ref{5a8,,set_authorizer()}

@item 
@ref{5a9,,set_progress_handler()}

@item 
@ref{5aa,,set_trace_callback()}
@end itemize

The affected parameters will become positional-only in Python 3.15.

Patch by Erlend E. Aasland.

@item 
gh-105829@footnote{https://github.com/python/cpython/issues/105829}: Fix concurrent.futures.ProcessPoolExecutor deadlock

@item 
gh-108295@footnote{https://github.com/python/cpython/issues/108295}: Fix crashes related to use of weakrefs on
@ref{487,,typing.TypeVar}.

@item 
gh-108463@footnote{https://github.com/python/cpython/issues/108463}: Make expressions/statements work as expected in pdb

@item 
gh-108277@footnote{https://github.com/python/cpython/issues/108277}: Add @ref{51f,,os.timerfd_create()}, @ref{520,,os.timerfd_settime()},
@ref{522,,os.timerfd_gettime()}, @ref{521,,os.timerfd_settime_ns()}, and
@ref{523,,os.timerfd_gettime_ns()} to provide a low level interface for Linux’s
timer notification file descriptor.

@item 
gh-107811@footnote{https://github.com/python/cpython/issues/107811}: @ref{e4,,tarfile}: extraction of members with overly large UID or
GID (e.g. on an OS with 32-bit @code{id_t}) now fails in the same way
as failing to set the ID.

@item 
gh-64662@footnote{https://github.com/python/cpython/issues/64662}: Fix support for virtual tables in
@ref{54f,,sqlite3.Connection.iterdump()}. Patch by Aviv Palivoda.

@item 
gh-108111@footnote{https://github.com/python/cpython/issues/108111}: Fix a regression introduced in gh-101251@footnote{https://github.com/python/cpython/issues/101251} for 3.12, resulting in
an incorrect offset calculation in @code{gzip.GzipFile.seek()}.

@item 
gh-108294@footnote{https://github.com/python/cpython/issues/108294}: @ref{8ab,,time.sleep()} now raises an auditing event.

@item 
gh-108278@footnote{https://github.com/python/cpython/issues/108278}: Deprecate passing name, number of arguments, and the callable
as keyword arguments, for the following @ref{54c,,sqlite3.Connection} APIs:


@itemize *

@item 
@ref{5a6,,create_function()}

@item 
@ref{5a7,,create_aggregate()}
@end itemize

The affected parameters will become positional-only in Python 3.15.

Patch by Erlend E. Aasland.

@item 
gh-108322@footnote{https://github.com/python/cpython/issues/108322}: Speed-up NormalDist.samples() by using the inverse CDF method
instead of calling random.gauss().

@item 
gh-83417@footnote{https://github.com/python/cpython/issues/83417}: Add the ability for venv to create a @code{.gitignore} file which
causes the created environment to be ignored by Git. It is on by default
when venv is called via its CLI.

@item 
gh-105736@footnote{https://github.com/python/cpython/issues/105736}: Harmonized the pure Python version of
@ref{7f2,,OrderedDict} with the C version. Now, both versions
set up their internal state in @code{__new__}.  Formerly, the pure Python
version did the set up in @code{__init__}.

@item 
gh-108083@footnote{https://github.com/python/cpython/issues/108083}: Fix bugs in the constructor of @ref{54c,,sqlite3.Connection} and
@ref{54d,,sqlite3.Connection.close()} where exceptions could be leaked. Patch
by Erlend E. Aasland.

@item 
gh-107932@footnote{https://github.com/python/cpython/issues/107932}: Fix @code{dis} module to properly report and display bytecode that
do not have source lines.

@item 
gh-105539@footnote{https://github.com/python/cpython/issues/105539}: @ref{d4,,sqlite3} now emits an @ref{54e,,ResourceWarning} if a
@ref{54c,,sqlite3.Connection} object is not @code{closed} explicitly. Patch by Erlend E. Aasland.

@item 
gh-107995@footnote{https://github.com/python/cpython/issues/107995}: The @code{__module__} attribute on instances of
@ref{762,,functools.cached_property} is now set to the name of the module in
which the cached_property is defined, rather than “functools”. This means
that doctests in @code{cached_property} docstrings are now properly collected
by the @ref{3e,,doctest} module. Patch by Tyler Smart.

@item 
gh-107963@footnote{https://github.com/python/cpython/issues/107963}: Fix @ref{1909,,multiprocessing.set_forkserver_preload()} to check the
given list of modules names. Patch by Donghee Na.

@item 
gh-106242@footnote{https://github.com/python/cpython/issues/106242}: Fixes @ref{151e,,os.path.normpath()} to handle embedded null
characters without truncating the path.

@item 
gh-81555@footnote{https://github.com/python/cpython/issues/81555}: @ref{128,,xml.dom.minidom} now only quotes @code{"} in attributes.

@item 
gh-50002@footnote{https://github.com/python/cpython/issues/50002}: @ref{128,,xml.dom.minidom} now preserves whitespaces in attributes.

@item 
gh-93057@footnote{https://github.com/python/cpython/issues/93057}: Passing more than one positional argument to
@ref{5a5,,sqlite3.connect()} and the @ref{54c,,sqlite3.Connection} constructor is
deprecated. The remaining parameters will become keyword-only in Python
3.15. Patch by Erlend E. Aasland.

@item 
gh-76913@footnote{https://github.com/python/cpython/issues/76913}: Add `merge_extra' parameter/feature to
@ref{14fa,,logging.LoggerAdapter}

@item 
gh-107913@footnote{https://github.com/python/cpython/issues/107913}: Fix possible losses of @code{errno} and @code{winerror} values in
@ref{2c0,,OSError} exceptions if they were cleared or modified by the cleanup
code before creating the exception object.

@item 
gh-107845@footnote{https://github.com/python/cpython/issues/107845}: @ref{29a,,tarfile.data_filter()} now takes the location of symlinks
into account when determining their target, so it will no longer reject
some valid tarballs with @code{LinkOutsideDestinationError}.

@item 
gh-107812@footnote{https://github.com/python/cpython/issues/107812}: Extend socket’s netlink support to the FreeBSD platform.

@item 
gh-107805@footnote{https://github.com/python/cpython/issues/107805}: Fix signatures of module-level generated functions in
@ref{107,,turtle}.

@item 
gh-107782@footnote{https://github.com/python/cpython/issues/107782}: @ref{ba,,pydoc} is now able to show signatures which are not
representable in Python, e.g. for @code{getattr} and @code{dict.pop}.

@item 
gh-56166@footnote{https://github.com/python/cpython/issues/56166}: Deprecate passing optional arguments `maxsplit', `count' and
`flags' in module-level functions @ref{5a1,,re.split()}, @ref{5a2,,re.sub()} and
@ref{5a3,,re.subn()} as positional. They should only be passed by keyword.

@item 
gh-107710@footnote{https://github.com/python/cpython/issues/107710}: Speed up @ref{1a6e,,logging.getHandlerNames()}.

@item 
gh-107715@footnote{https://github.com/python/cpython/issues/107715}: Fix @ref{1a6f,,doctest.DocTestFinder.find()} in presence of class
names with special characters. Patch by Gertjan van Zwieten.

@item 
gh-100814@footnote{https://github.com/python/cpython/issues/100814}: Passing a callable object as an option value to a Tkinter image
now raises the expected TclError instead of an AttributeError.

@item 
gh-72684@footnote{https://github.com/python/cpython/issues/72684}: Add @ref{f6,,tkinter} widget methods: @code{tk_busy_hold()},
@code{tk_busy_configure()}, @code{tk_busy_cget()},
@code{tk_busy_forget()}, @code{tk_busy_current()}, and
@code{tk_busy_status()}.

@item 
gh-106684@footnote{https://github.com/python/cpython/issues/106684}: Raise @ref{54e,,ResourceWarning} when @ref{1a70,,asyncio.StreamWriter}
is not closed leading to memory leaks. Patch by Kumar Aditya.

@item 
gh-107465@footnote{https://github.com/python/cpython/issues/107465}: Add @ref{534,,pathlib.Path.from_uri()} classmethod.

@item 
gh-107077@footnote{https://github.com/python/cpython/issues/107077}: Seems that in some conditions, OpenSSL will return
@code{SSL_ERROR_SYSCALL} instead of @code{SSL_ERROR_SSL} when a certification
verification has failed, but the error parameters will still contain
@code{ERR_LIB_SSL} and @code{SSL_R_CERTIFICATE_VERIFY_FAILED}. We are now
detecting this situation and raising the appropriate
@code{ssl.SSLCertVerificationError}. Patch by Pablo Galindo

@item 
gh-107576@footnote{https://github.com/python/cpython/issues/107576}: Fix @ref{6f4,,types.get_original_bases()} to only return
@code{__orig_bases__} if it is present on @code{cls} directly. Patch by
James Hilton-Balfe.

@item 
gh-105481@footnote{https://github.com/python/cpython/issues/105481}: Remove @code{opcode.is_pseudo}, @code{opcode.MIN_PSEUDO_OPCODE} and
@code{opcode.MAX_PSEUDO_OPCODE}, which were added in 3.12, were never
documented and were not intended to be used externally.

@item 
gh-105481@footnote{https://github.com/python/cpython/issues/105481}: @code{opcode.ENABLE_SPECIALIZATION} (which was added in 3.12
but never documented or intended for external usage) is moved to
@code{_opcode.ENABLE_SPECIALIZATION} where tests can access it.

@item 
gh-107396@footnote{https://github.com/python/cpython/issues/107396}: tarfiles; Fixed use before assignment of self.exception for
gzip decompression

@item 
gh-107409@footnote{https://github.com/python/cpython/issues/107409}: Set @code{__wrapped__} attribute in
@ref{13f8,,reprlib.recursive_repr()}.

@item 
gh-107406@footnote{https://github.com/python/cpython/issues/107406}: Implement new @code{__repr__()} method for
@ref{1761,,struct.Struct}. Now it returns @code{Struct(<format repr>)}.

@item 
gh-107369@footnote{https://github.com/python/cpython/issues/107369}: Optimize @ref{57c,,textwrap.indent()}. It is ~30% faster for large
input. Patch by Inada Naoki.

@item 
gh-78722@footnote{https://github.com/python/cpython/issues/78722}: Fix issue where @ref{26e,,pathlib.Path.iterdir()} did not raise
@ref{2c0,,OSError} until iterated.

@item 
gh-105578@footnote{https://github.com/python/cpython/issues/105578}: Deprecate @ref{5ab,,typing.AnyStr} in favor of the new Type
Parameter syntax. See PEP 695.

@item 
gh-62519@footnote{https://github.com/python/cpython/issues/62519}: Make @ref{be7,,gettext.pgettext()} search plural definitions when
translation is not found.

@item 
gh-107089@footnote{https://github.com/python/cpython/issues/107089}: Shelves opened with @ref{1a71,,shelve.open()} have a much faster
@code{clear()} method. Patch by James Cave.

@item 
gh-82500@footnote{https://github.com/python/cpython/issues/82500}: Fix overflow on 32-bit systems with @ref{b,,asyncio}
@ref{d04,,os.sendfile()} implementation.

@item 
gh-83006@footnote{https://github.com/python/cpython/issues/83006}: Document behavior of @ref{1332,,shutil.disk_usage()} for non-mounted
filesystems on Unix.

@item 
gh-65495@footnote{https://github.com/python/cpython/issues/65495}: Use lowercase @code{mail from} and @code{rcpt to} in
@code{smptlib.SMTP}.

@item 
gh-106186@footnote{https://github.com/python/cpython/issues/106186}: Do not report @code{MultipartInvariantViolationDefect} defect when
the @ref{13a2,,email.parser.Parser} class is used to parse emails with
@code{headersonly=True}.

@item 
gh-105002@footnote{https://github.com/python/cpython/issues/105002}: Fix invalid result from @code{PurePath.relative_to()} method
when attempting to walk a “@code{..}” segment in `other' with `walk_up'
enabled. A @ref{2ec,,ValueError} exception is now raised in this case.

@item 
gh-106739@footnote{https://github.com/python/cpython/issues/106739}: Add the @code{rtype_cache} to the warning message (as an addition
to the type of leaked objects and the number of leaked objects already
included in the message) to make debugging leaked objects easier when the
multiprocessing resource tracker process finds leaked objects at shutdown.
This helps more quickly identify what was leaked and/or why the leaked
object was not properly cleaned up.

@item 
gh-106751@footnote{https://github.com/python/cpython/issues/106751}: Optimize @code{SelectSelector.select()} for many iteration case.
Patch By Donghee Na.

@item 
gh-106751@footnote{https://github.com/python/cpython/issues/106751}: Optimize @code{_PollLikeSelector.select()} for many iteration
case.

@item 
gh-106751@footnote{https://github.com/python/cpython/issues/106751}: Optimize @code{KqueueSelector.select()} for many iteration case.
Patch By Donghee Na.

@item 
gh-106831@footnote{https://github.com/python/cpython/issues/106831}: Fix potential missing @code{NULL} check of @code{d2i_SSL_SESSION}
result in @code{_ssl.c}.

@item 
gh-105481@footnote{https://github.com/python/cpython/issues/105481}: The various opcode lists in the @ref{3c,,dis} module are now
generated from bytecodes.c instead of explicitly constructed in opcode.py.

@item 
gh-106727@footnote{https://github.com/python/cpython/issues/106727}: Make @ref{17c9,,inspect.getsource()} smarter for class for same name
definitions

@item 
gh-106789@footnote{https://github.com/python/cpython/issues/106789}: Remove import of @ref{b3,,pprint} from @ref{e1,,sysconfig}.

@item 
gh-105726@footnote{https://github.com/python/cpython/issues/105726}: Added @code{__slots__} to
@ref{e89,,contextlib.AbstractContextManager} and
@ref{d1f,,contextlib.AbstractAsyncContextManager} so that child classes can
use @code{__slots__}.

@item 
gh-106774@footnote{https://github.com/python/cpython/issues/106774}: Update the bundled copy of pip to version 23.2.1.

@item 
gh-106751@footnote{https://github.com/python/cpython/issues/106751}: @ref{c7,,selectors}: Optimize @code{EpollSelector.select()} code by
moving some code outside of the loop.

@item 
gh-106752@footnote{https://github.com/python/cpython/issues/106752}: Fixed several bugs in zipfile.Path, including: in
@code{zipfile.Path.match()}, Windows separators are no longer honored (and
never were meant to be); Fixed @code{name}/@code{suffix}/@code{suffixes}/@code{stem}
operations when no filename is present and the Path is not at the root of
the zipfile; Reworked glob for performance and more correct matching
behavior.

@item 
gh-105293@footnote{https://github.com/python/cpython/issues/105293}: Remove call to @code{SSL_CTX_set_session_id_context} during client
side context creation in the @ref{d5,,ssl} module.

@item 
gh-106734@footnote{https://github.com/python/cpython/issues/106734}: Disable tab completion in multiline mode of @ref{aa,,pdb}

@item 
gh-105481@footnote{https://github.com/python/cpython/issues/105481}: Expose opcode metadata through @code{_opcode}.

@item 
gh-106670@footnote{https://github.com/python/cpython/issues/106670}: Add the new @code{exceptions} command to the Pdb debugger. It
makes it possible to move between chained exceptions when using post
mortem debugging.

@item 
gh-106602@footnote{https://github.com/python/cpython/issues/106602}: Add __copy__ and __deepcopy__ in @ref{5a,,enum}

@item 
gh-106664@footnote{https://github.com/python/cpython/issues/106664}: @ref{c7,,selectors}: Add @code{_SelectorMapping.get()} method and
optimize @code{_SelectorMapping.__getitem__()}.

@item 
gh-106628@footnote{https://github.com/python/cpython/issues/106628}: Speed up parsing of emails by about 20% by not compiling a new
regular expression for every single email.

@item 
gh-89427@footnote{https://github.com/python/cpython/issues/89427}: Set the environment variable @code{VIRTUAL_ENV_PROMPT} at
@ref{117,,venv} activation, even when @code{VIRTUAL_ENV_DISABLE_PROMPT} is set.

@item 
gh-106530@footnote{https://github.com/python/cpython/issues/106530}: Revert a change to @ref{1a72,,colorsys.rgb_to_hls()} that caused
division by zero for certain almost-white inputs.  Patch by Terry Jan
Reedy.

@item 
gh-106584@footnote{https://github.com/python/cpython/issues/106584}: Fix exit code for @code{unittest} if all tests are skipped. Patch
by Egor Eliseev.

@item 
gh-106566@footnote{https://github.com/python/cpython/issues/106566}: Optimize @code{(?!)} (pattern which always fails) in regular
expressions.

@item 
gh-106554@footnote{https://github.com/python/cpython/issues/106554}: @ref{c7,,selectors}: Reduce Selector overhead by using a
@code{dict.get()} to lookup file descriptors.

@item 
gh-106558@footnote{https://github.com/python/cpython/issues/106558}: Remove ref cycle in callers of
@code{convert_to_error()} by deleting @code{result}
from scope in a @code{finally} block.

@item 
gh-100502@footnote{https://github.com/python/cpython/issues/100502}: Add @code{pathlib.PurePath.pathmod} class attribute that
stores the implementation of @ref{a6,,os.path} used for low-level path
operations: either @code{posixpath} or @code{ntpath}.

@item 
gh-106527@footnote{https://github.com/python/cpython/issues/106527}: Reduce overhead to add and remove @ref{b,,asyncio} readers and
writers.

@item 
gh-106524@footnote{https://github.com/python/cpython/issues/106524}: Fix crash in @code{_sre.template()} with templates containing
invalid group indices.

@item 
gh-106531@footnote{https://github.com/python/cpython/issues/106531}: Removed @code{_legacy} and the names it provided from
@code{importlib.resources}: @code{Resource}, @code{contents}, @code{is_resource},
@code{open_binary}, @code{open_text}, @code{path}, @code{read_binary}, and
@code{read_text}.

@item 
gh-106052@footnote{https://github.com/python/cpython/issues/106052}: @ref{be,,re} module: fix the matching of possessive quantifiers in
the case of a subpattern containing backtracking.

@item 
gh-106510@footnote{https://github.com/python/cpython/issues/106510}: Improve debug output for atomic groups in regular expressions.

@item 
gh-106503@footnote{https://github.com/python/cpython/issues/106503}: Fix ref cycle in @code{asyncio._SelectorSocketTransport} by
removing @code{_write_ready} in @code{close}.

@item 
gh-105497@footnote{https://github.com/python/cpython/issues/105497}: Fix flag mask inversion when unnamed flags exist.

@item 
gh-90876@footnote{https://github.com/python/cpython/issues/90876}: Prevent @code{multiprocessing.spawn} from failing to `import' in
environments where @code{sys.executable} is @code{None}.  This regressed in 3.11
with the addition of support for path-like objects in multiprocessing.

@item 
gh-106403@footnote{https://github.com/python/cpython/issues/106403}: Instances of @ref{487,,typing.TypeVar},
@ref{488,,typing.ParamSpec}, @ref{9c9,,typing.ParamSpecArgs},
@ref{9ca,,typing.ParamSpecKwargs}, and @ref{489,,typing.TypeVarTuple} once
again support weak references, fixing a regression introduced in Python
3.12.0 beta 1. Patch by Jelle Zijlstra.

@item 
gh-89812@footnote{https://github.com/python/cpython/issues/89812}: Add private @code{pathlib._PathBase} class, which provides
experimental support for virtual filesystems, and may be made public in a
future version of Python.

@item 
gh-106292@footnote{https://github.com/python/cpython/issues/106292}: Check for an instance-dict cached value in the @code{__get__()}
method of @ref{762,,functools.cached_property()}. This better matches the
pre-3.12 behavior and improves compatibility for users subclassing
@code{functools.cached_property()} and adding a @code{__set__()} method.

@item 
gh-106350@footnote{https://github.com/python/cpython/issues/106350}: Detect possible memory allocation failure in the libtommath
function @code{mp_init()} used by the @code{_tkinter} module.

@item 
gh-106330@footnote{https://github.com/python/cpython/issues/106330}: Fix incorrect matching of empty paths in
@ref{6d2,,pathlib.PurePath.match()}. This bug was introduced in Python 3.12.0
beta 1.

@item 
gh-106309@footnote{https://github.com/python/cpython/issues/106309}: Deprecate @ref{333,,typing.no_type_check_decorator()}. No major type
checker ever added support for this decorator. Patch by Alex Waygood.

@item 
gh-102541@footnote{https://github.com/python/cpython/issues/102541}: Make @code{pydoc.doc()} catch bad module @ref{659,,ImportError} when
output stream is not @code{None}.

@item 
gh-106263@footnote{https://github.com/python/cpython/issues/106263}: Fix crash when calling @code{repr} with a manually constructed
SignalDict object. Patch by Charlie Zhao.

@item 
gh-106236@footnote{https://github.com/python/cpython/issues/106236}: Replace @code{assert} statements with @code{raise RuntimeError} in
@ref{f3,,threading}, so that @code{_DummyThread} cannot be joined even with
@code{-OO}.

@item 
gh-106238@footnote{https://github.com/python/cpython/issues/106238}: Fix rare concurrency bug in lock acquisition by the logging
package.

@item 
gh-106152@footnote{https://github.com/python/cpython/issues/106152}: Added PY_THROW event hook for @ref{2b,,cProfile} for generators

@item 
gh-106075@footnote{https://github.com/python/cpython/issues/106075}: Added @code{asyncio.taskgroups.__all__} to @code{asyncio.__all__} for
export in star imports.

@item 
gh-104527@footnote{https://github.com/python/cpython/issues/104527}: Zipapp will now skip over appending an archive to itself.

@item 
gh-106046@footnote{https://github.com/python/cpython/issues/106046}: Improve the error message from @ref{e4c,,os.fspath()} if called on
an object where @code{__fspath__} is set to @code{None}. Patch by Alex Waygood.

@item 
gh-105987@footnote{https://github.com/python/cpython/issues/105987}: Fix crash due to improper reference counting in @ref{b,,asyncio}
eager task factory internal routines.

@item 
gh-105974@footnote{https://github.com/python/cpython/issues/105974}: Fix bug where a @ref{569,,typing.Protocol} class that had one or
more non-callable members would raise @ref{198,,TypeError} when
@ref{9c4,,issubclass()} was called against it, even if it defined a custom
@code{__subclasshook__} method. The behaviour in Python 3.11 and lower –
which has now been restored – was not to raise @code{TypeError} in these
situations if a custom @code{__subclasshook__} method was defined. Patch by
Alex Waygood.

@item 
gh-96145@footnote{https://github.com/python/cpython/issues/96145}: Reverted addition of @code{json.AttrDict}.

@item 
gh-89812@footnote{https://github.com/python/cpython/issues/89812}: Add @ref{533,,pathlib.UnsupportedOperation}, which is raised instead
of @ref{36b,,NotImplementedError} when a path operation isn’t supported.

@item 
gh-105808@footnote{https://github.com/python/cpython/issues/105808}: Fix a regression introduced in gh-101251@footnote{https://github.com/python/cpython/issues/101251} for 3.12, causing
@code{gzip.GzipFile.flush()} to not flush the compressor (nor pass along
the @code{zip_mode} argument).

@item 
gh-105481@footnote{https://github.com/python/cpython/issues/105481}: @ref{1130,,stack_effect()} no longer raises an exception if an
@code{oparg} is provided for an @code{opcode} that doesn’t use its arg, or when
it is not provided for an @code{opcode} that does use it. In the latter case,
the stack effect is returned for @code{oparg=0}.

@item 
gh-104799@footnote{https://github.com/python/cpython/issues/104799}: Enable @ref{ae2,,ast.unparse()} to unparse function and class
definitions created without the new @code{type_params} field from 
@geindex Python 향상 제안; PEP 695
PEP 695@footnote{https://peps.python.org/pep-0695/}.
Patch by Jelle Zijlstra.

@item 
gh-105793@footnote{https://github.com/python/cpython/issues/105793}: Add `follow_symlinks' keyword-only argument to
@ref{53a,,pathlib.Path.is_dir()} and @ref{539,,is_file()}, defaulting
to @code{True}.

@item 
gh-105570@footnote{https://github.com/python/cpython/issues/105570}: Deprecate two methods of creating @ref{332,,typing.TypedDict}
classes with 0 fields using the functional syntax: @code{TD =
TypedDict("TD")} and @code{TD = TypedDict("TD", None)}. Both will be
disallowed in Python 3.15. To create a @code{TypedDict} class with 0 fields,
either use @code{class TD(TypedDict): pass} or @code{TD = TypedDict("TD", @{@})}.

@item 
gh-105745@footnote{https://github.com/python/cpython/issues/105745}: Fix @code{webbrowser.Konqueror.open} method.

@item 
gh-105733@footnote{https://github.com/python/cpython/issues/105733}: @ref{2e,,ctypes}: Deprecate undocumented
@code{ctypes.SetPointerType()} and @code{ctypes.ARRAY()} functions. Patch
by Victor Stinner.

@item 
gh-105687@footnote{https://github.com/python/cpython/issues/105687}: Remove deprecated @code{re.template}, @code{re.T}, @code{re.TEMPLATE},
@code{sre_constans.SRE_FLAG_TEMPLATE}.

@item 
gh-105684@footnote{https://github.com/python/cpython/issues/105684}: Supporting @ref{bcf,,asyncio.Task.set_name()} is now mandatory for
third party task implementations. The undocumented @code{_set_task_name()}
function (deprecated since 3.8) has been removed. Patch by Kumar Aditya.

@item 
gh-105375@footnote{https://github.com/python/cpython/issues/105375}: Fix a bug in @code{_Unpickler_SetInputStream()} where an
exception could end up being overwritten in case of failure.

@item 
gh-105626@footnote{https://github.com/python/cpython/issues/105626}: Change the default return value of
@ref{1a73,,http.client.HTTPConnection.get_proxy_response_headers()} to be
@code{None} and not @code{@{@}}.

@item 
gh-105375@footnote{https://github.com/python/cpython/issues/105375}: Fix bugs in @ref{df,,sys} where exceptions could end up being
overwritten because of deferred error handling.

@item 
gh-105605@footnote{https://github.com/python/cpython/issues/105605}: Harden @code{pyexpat} error handling during module
initialisation to prevent exceptions from possibly being overwritten, and
objects from being dereferenced twice.

@item 
gh-105375@footnote{https://github.com/python/cpython/issues/105375}: Fix bug in @ref{3a,,decimal} where an exception could end up being
overwritten.

@item 
gh-105375@footnote{https://github.com/python/cpython/issues/105375}: Fix bugs in @code{_datetime} where exceptions could be
overwritten in case of module initialisation failure.

@item 
gh-105375@footnote{https://github.com/python/cpython/issues/105375}: Fix bugs in @code{_ssl} initialisation which could lead to
leaked references and overwritten exceptions.

@item 
gh-105375@footnote{https://github.com/python/cpython/issues/105375}: Fix a bug in @ref{4c0,,array.array} where an exception could end
up being overwritten.

@item 
gh-105375@footnote{https://github.com/python/cpython/issues/105375}: Fix bugs in @code{_ctypes} where exceptions could end up being
overwritten.

@item 
gh-105375@footnote{https://github.com/python/cpython/issues/105375}: Fix a bug in the @ref{b2,,posix} module where an exception could
be overwritten.

@item 
gh-105375@footnote{https://github.com/python/cpython/issues/105375}: Fix bugs in @code{_elementtree} where exceptions could be
overwritten.

@item 
gh-105375@footnote{https://github.com/python/cpython/issues/105375}: Fix bugs in @ref{13a,,zoneinfo} where exceptions could be
overwritten.

@item 
gh-105375@footnote{https://github.com/python/cpython/issues/105375}: Fix bugs in @ref{5b,,errno} where exceptions could be overwritten.

@item 
gh-105566@footnote{https://github.com/python/cpython/issues/105566}: Deprecate creating a @ref{331,,typing.NamedTuple} class using
keyword arguments to denote the fields (@code{NT = NamedTuple("NT", x=int,
y=str)}). This will be disallowed in Python 3.15. Use the class-based
syntax or the functional syntax instead.

Two methods of creating @code{NamedTuple} classes with 0 fields using the
functional syntax are also deprecated, and will be disallowed in Python
3.15: @code{NT = NamedTuple("NT")} and @code{NT = NamedTuple("NT", None)}. To
create a @code{NamedTuple} class with 0 fields, either use @code{class
NT(NamedTuple): pass} or @code{NT = NamedTuple("NT", [])}.

@item 
gh-105545@footnote{https://github.com/python/cpython/issues/105545}: Remove deprecated in 3.11 @code{webbrowser.MacOSXOSAScript._name}
attribute.

@item 
gh-105497@footnote{https://github.com/python/cpython/issues/105497}: Fix flag inversion when alias/mask members exist.

@item 
gh-105509@footnote{https://github.com/python/cpython/issues/105509}: @ref{b37,,typing.Annotated} is now implemented as an instance of
@code{typing._SpecialForm} rather than a class. This should have no
user-facing impact for users of the @ref{10a,,typing} module public API.

@item 
gh-105375@footnote{https://github.com/python/cpython/issues/105375}: Fix bugs in @ref{ab,,pickle} where exceptions could be
overwritten.

@item 
gh-70303@footnote{https://github.com/python/cpython/issues/70303}: Emit @ref{657,,FutureWarning} from @ref{537,,pathlib.Path.glob()} and
@ref{538,,rglob()} if the given pattern ends with “@code{**}”. In a
future Python release, patterns with this ending will match both files and
directories. Add a trailing slash to only match directories.

@item 
gh-105375@footnote{https://github.com/python/cpython/issues/105375}: Fix a bug in @ref{d4,,sqlite3} where an exception could be
overwritten in the @ref{885,,collation}
callback.

@item 
gh-105382@footnote{https://github.com/python/cpython/issues/105382}: Remove `cafile', `capath' and `cadefault' parameters of the
@ref{307,,urllib.request.urlopen()} function, deprecated in Python 3.6. Patch
by Victor Stinner.

@item 
gh-105376@footnote{https://github.com/python/cpython/issues/105376}: @ref{8b,,logging}: Remove undocumented and untested
@code{Logger.warn()} and @code{LoggerAdapter.warn()} methods and
@code{logging.warn()} function. Deprecated since Python 3.3, they were
aliases to the @ref{1a74,,logging.Logger.warning()} method,
@code{logging.LoggerAdapter.warning()} method and @ref{354,,logging.warning()}
function. Patch by Victor Stinner.

@item 
gh-105332@footnote{https://github.com/python/cpython/issues/105332}: Revert pickling method from by-name back to by-value.

@item 
gh-104554@footnote{https://github.com/python/cpython/issues/104554}: Add RTSPS scheme support in urllib.parse

@item 
gh-105292@footnote{https://github.com/python/cpython/issues/105292}: Add option to @ref{a4e,,traceback.format_exception_only()} to
recurse into the nested exception of a @ref{564,,BaseExceptionGroup}.

@item 
gh-105280@footnote{https://github.com/python/cpython/issues/105280}: Fix bug where @code{isinstance([], collections.abc.Mapping)} could
evaluate to @code{True} if garbage collection happened at the wrong time. The
bug was caused by changes to the implementation of
@ref{569,,typing.Protocol} in Python 3.12.

@item 
gh-80480@footnote{https://github.com/python/cpython/issues/80480}: @ref{8,,array}: Add @code{'w'} typecode that represents @code{Py_UCS4}.

@item 
gh-105239@footnote{https://github.com/python/cpython/issues/105239}: Fix longstanding bug where @code{issubclass(object,
typing.Protocol)} would evaluate to @code{True} in some edge cases. Patch by
Alex Waygood.

@item 
gh-104310@footnote{https://github.com/python/cpython/issues/104310}: In the beta 1 release we added a utility function for extension
module authors, to use when testing their module for support in multiple
interpreters or under a per-interpreter GIL.  The name of that function
has changed from @code{allowing_all_extensions} to
@code{_incompatible_extension_module_restrictions}.  The default for the
“disable_check” argument has change from @code{True} to @code{False}, to better
match the new function name.

@item 
gh-105080@footnote{https://github.com/python/cpython/issues/105080}: Fixed inconsistent signature on derived classes for
@ref{22f,,inspect.signature()}

@item 
gh-105144@footnote{https://github.com/python/cpython/issues/105144}: Fix a recent regression in the @ref{10a,,typing} module. The
regression meant that doing @code{class Foo(X, typing.Protocol)}, where @code{X}
was a class that had @ref{111a,,abc.ABCMeta} as its metaclass, would then
cause subsequent @code{isinstance(1, X)} calls to erroneously raise
@ref{198,,TypeError}. Patch by Alex Waygood.

@item 
gh-62948@footnote{https://github.com/python/cpython/issues/62948}: The @ref{504,,io.IOBase} finalizer now logs the @code{close()} method
errors with @ref{506,,sys.unraisablehook}. Previously, errors were ignored
silently by default, and only logged in @ref{507,,Python Development Mode} or on @ref{508,,Python built on debug mode}.  Patch
by Victor Stinner.

@item 
gh-105096@footnote{https://github.com/python/cpython/issues/105096}: @ref{119,,wave}: Deprecate the @code{getmark()}, @code{setmark()} and
@code{getmarkers()} methods of the @ref{336,,wave.Wave_read} and
@ref{337,,wave.Wave_write} classes. They will be removed in Python 3.15.
Patch by Victor Stinner.

@item 
gh-104992@footnote{https://github.com/python/cpython/issues/104992}: Remove the untested and undocumented
@code{unittest.TestProgram.usageExit()} method, deprecated in Python 3.11.
Patch by Hugo van Kemenade.

@item 
gh-104996@footnote{https://github.com/python/cpython/issues/104996}: Improve performance of @ref{6cc,,pathlib.PurePath} initialisation
by deferring joining of paths when multiple arguments are given.

@item 
gh-101588@footnote{https://github.com/python/cpython/issues/101588}: Deprecate undocumented copy/deepcopy/pickle support for
itertools.

@item 
gh-103631@footnote{https://github.com/python/cpython/issues/103631}: Fix @code{pathlib.PurePosixPath(pathlib.PureWindowsPath(...))} not
converting path separators to restore 3.11 compatible behavior.

@item 
gh-104947@footnote{https://github.com/python/cpython/issues/104947}: Make comparisons between @ref{1a75,,pathlib.PureWindowsPath}
objects consistent across Windows and Posix to match 3.11 behavior.

@item 
gh-104773@footnote{https://github.com/python/cpython/issues/104773}: 
@geindex Python 향상 제안; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/}: Remove the @code{audioop} module, deprecated in
Python 3.11. Patch by Victor Stinner.

@item 
gh-104773@footnote{https://github.com/python/cpython/issues/104773}: 
@geindex Python 향상 제안; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/}: Remove the @code{aifc} module, deprecated in
Python 3.11. Patch by Victor Stinner.

@item 
gh-104773@footnote{https://github.com/python/cpython/issues/104773}: 
@geindex Python 향상 제안; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/}: Remove the @code{uu} module, deprecated in Python
3.11. Patch by Victor Stinner.

@item 
gh-104935@footnote{https://github.com/python/cpython/issues/104935}: Fix bugs with the interaction between
@ref{673,,typing.runtime_checkable()} and @ref{17bc,,typing.Generic} that were
introduced by the 
@geindex Python 향상 제안; PEP 695
PEP 695@footnote{https://peps.python.org/pep-0695/} implementation. Patch by Jelle Zijlstra.

@item 
gh-104773@footnote{https://github.com/python/cpython/issues/104773}: 
@geindex Python 향상 제안; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/}: Remove the @code{crypt} module and its private
@code{_crypt} extension, deprecated in Python 3.11. Patch by Victor
Stinner.

@item 
gh-104773@footnote{https://github.com/python/cpython/issues/104773}: 
@geindex Python 향상 제안; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/}: Remove the @code{nis} module, deprecated in Python
3.11. Patch by Victor Stinner.

@item 
gh-104898@footnote{https://github.com/python/cpython/issues/104898}: Add missing @ref{16f0,,__slots__} to @ref{e4a,,os.PathLike}.

@item 
gh-104773@footnote{https://github.com/python/cpython/issues/104773}: 
@geindex Python 향상 제안; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/}: Remove the @code{xdrlib} module, deprecated in
Python 3.11. Patch by Victor Stinner.

@item 
gh-104773@footnote{https://github.com/python/cpython/issues/104773}: 
@geindex Python 향상 제안; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/}: Remove the @code{nntplib} module, deprecated in
Python 3.11. Patch by Victor Stinner.

@item 
gh-104886@footnote{https://github.com/python/cpython/issues/104886}: Remove the undocumented
@code{configparser.LegacyInterpolation} class, deprecated in the
docstring since Python 3.2, and with a deprecation warning since Python
3.11. Patch by Hugo van Kemenade.

@item 
gh-104786@footnote{https://github.com/python/cpython/issues/104786}: Remove kwargs-based @ref{332,,typing.TypedDict} creation

@item 
gh-104876@footnote{https://github.com/python/cpython/issues/104876}: Remove the @code{turtle.RawTurtle.settiltangle()} method,
deprecated in docs since Python 3.1 and with a deprecation warning since
Python 3.11. Patch by Hugo van Kemenade.

@item 
gh-104773@footnote{https://github.com/python/cpython/issues/104773}: 
@geindex Python 향상 제안; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/}: Removed the @code{msilib} package, deprecated in
Python 3.11.

@item 
gh-104773@footnote{https://github.com/python/cpython/issues/104773}: 
@geindex Python 향상 제안; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/}: Remove the @code{spwd} module, deprecated in
Python 3.11: the python-pam@footnote{https://pypi.org/project/python-pam/} project can be used instead. Patch by
Victor Stinner.

@item 
gh-75552@footnote{https://github.com/python/cpython/issues/75552}: Removed the @code{tkinter.tix} module, deprecated since Python 3.6.

@item 
gh-104773@footnote{https://github.com/python/cpython/issues/104773}: 
@geindex Python 향상 제안; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/}: Remove the @code{chunk} module, deprecated in
Python 3.11. Patch by Victor Stinner.

@item 
gh-104773@footnote{https://github.com/python/cpython/issues/104773}: 
@geindex Python 향상 제안; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/}: Remove the @code{mailcap} module, deprecated in
Python 3.11. Patch by Victor Stinner.

@item 
gh-104773@footnote{https://github.com/python/cpython/issues/104773}: 
@geindex Python 향상 제안; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/}: Remove the @code{sunau} module, deprecated in
Python 3.11. Patch by Victor Stinner.

@item 
gh-104780@footnote{https://github.com/python/cpython/issues/104780}: 
@geindex Python 향상 제안; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/}: Remove the @code{ossaudiodev} module, deprecated
in Python 3.11. Patch Victor Stinner.

@item 
gh-104773@footnote{https://github.com/python/cpython/issues/104773}: 
@geindex Python 향상 제안; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/}: Remove the @code{pipes} module, deprecated in
Python 3.11. Patch by Victor Stinner.

@item 
gh-104873@footnote{https://github.com/python/cpython/issues/104873}: Add @ref{56a,,typing.get_protocol_members()} to return the set of
members defining a @ref{569,,typing.Protocol}.  Add
@ref{56b,,typing.is_protocol()} to check whether a class is a
@code{typing.Protocol}. Patch by Jelle Zijlstra.

@item 
gh-104874@footnote{https://github.com/python/cpython/issues/104874}: Document the @code{__name__} and @code{__supertype__} attributes of
@ref{ef0,,typing.NewType}. Patch by Jelle Zijlstra.

@item 
gh-104835@footnote{https://github.com/python/cpython/issues/104835}: Removed the following @ref{10c,,unittest} functions, deprecated in
Python 3.11:


@itemize *

@item 
@code{unittest.findTestCases()}

@item 
@code{unittest.makeSuite()}

@item 
@code{unittest.getTestCaseNames()}
@end itemize

Use @ref{592,,TestLoader} methods instead:


@itemize *

@item 
@ref{593,,unittest.TestLoader.loadTestsFromModule()}

@item 
@ref{594,,unittest.TestLoader.loadTestsFromTestCase()}

@item 
@ref{595,,unittest.TestLoader.getTestCaseNames()}
@end itemize

Patch by Hugo van Kemenade.

@item 
gh-104804@footnote{https://github.com/python/cpython/issues/104804}: Remove the untested and undocumented @ref{11b,,webbrowser}
@code{MacOSX} class, deprecated in Python 3.11. Patch by Hugo van
Kemenade.

@item 
gh-83863@footnote{https://github.com/python/cpython/issues/83863}: Support for using @ref{266,,pathlib.Path} objects as context
managers has been removed. Before Python 3.9, exiting the context manager
marked a path as “closed”, which caused some (but not all!) methods to
raise when called. Since Python 3.9, using a path as a context manager
does nothing.

@item 
gh-104799@footnote{https://github.com/python/cpython/issues/104799}: Adjust the location of the (see 
@geindex Python 향상 제안; PEP 695
PEP 695@footnote{https://peps.python.org/pep-0695/}) @code{type_params}
field on @ref{1a76,,ast.ClassDef}, @ref{1a77,,ast.AsyncFunctionDef}, and
@ref{1a78,,ast.FunctionDef} to better preserve backward compatibility. Patch
by Jelle Zijlstra

@item 
gh-104797@footnote{https://github.com/python/cpython/issues/104797}: Allow @ref{569,,typing.Protocol} classes to inherit from
@ref{343,,collections.abc.Buffer}. Patch by Jelle Zijlstra.

@item 
gh-104783@footnote{https://github.com/python/cpython/issues/104783}: Remove @code{locale.resetlocale()} function deprecated in Python
3.11. Patch by Victor Stinner.

@item 
gh-104780@footnote{https://github.com/python/cpython/issues/104780}: Remove the @code{2to3} program and the @code{lib2to3} module,
deprecated in Python 3.11. Patch by Victor Stinner.

@item 
gh-104773@footnote{https://github.com/python/cpython/issues/104773}: 
@geindex Python 향상 제안; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/}: Remove the @code{telnetlib} module, deprecated in
Python 3.11. Patch by Victor Stinner.

@item 
gh-104773@footnote{https://github.com/python/cpython/issues/104773}: 
@geindex Python 향상 제안; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/}: Remove the @code{imghdr} module, deprecated in
Python 3.11. Patch by Victor Stinner.

@item 
gh-104773@footnote{https://github.com/python/cpython/issues/104773}: 
@geindex Python 향상 제안; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/}: Remove the @code{cgi} and @code{cgitb} modules,
deprecated in Python 3.11. Patch by Victor Stinner.

@item 
gh-104773@footnote{https://github.com/python/cpython/issues/104773}: 
@geindex Python 향상 제안; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/}: Remove the @code{sndhdr} module, deprecated in
Python 3.11. Patch by Victor Stinner.

@item 
gh-104372@footnote{https://github.com/python/cpython/issues/104372}: On Linux where @ref{dc,,subprocess} can use the @code{vfork()}
syscall for faster spawning, prevent the parent process from blocking
other threads by dropping the GIL while it waits for the vfork’ed child
process @code{exec()} outcome. This prevents spawning a binary from a slow
filesystem from blocking the rest of the application.

@item 
gh-99108@footnote{https://github.com/python/cpython/issues/99108}: We now release the GIL around built-in @ref{6c,,hashlib}
computations of reasonable size for the SHA families and MD5 hash
functions, matching what our OpenSSL backed hash computations already
does.

@item 
gh-102613@footnote{https://github.com/python/cpython/issues/102613}: Improve performance of @ref{537,,pathlib.Path.glob()} when expanding
a pattern with a non-terminal “@code{**}” component by filtering walked paths
through a regular expression, rather than calling @ref{c53,,os.scandir()} more
than once on each directory.

@item 
gh-104399@footnote{https://github.com/python/cpython/issues/104399}: Prepare the @code{_tkinter} module for building with Tcl 9.0 and
future libtommath by replacing usage of deprecated functions
@code{mp_to_unsigned_bin_n()} and @code{mp_unsigned_bin_size()} when
necessary.

@item 
gh-102676@footnote{https://github.com/python/cpython/issues/102676}: Add fields @code{start_offset}, @code{cache_offset}, @code{end_offset},
@code{baseopname}, @code{baseopcode}, @code{jump_target} and @code{oparg} to
@ref{203,,dis.Instruction}.

@item 
gh-103558@footnote{https://github.com/python/cpython/issues/103558}: Fixed @code{parent} argument validation mechanism of
@ref{7,,argparse}. Improved test coverage.

@item 
gh-103464@footnote{https://github.com/python/cpython/issues/103464}: Provide helpful usage messages when parsing incorrect
@ref{aa,,pdb} commands.

@item 
gh-103384@footnote{https://github.com/python/cpython/issues/103384}: Generalize the regex pattern @code{BaseConfigurator.INDEX_PATTERN}
to allow spaces and non-alphanumeric characters in keys.

@item 
gh-103124@footnote{https://github.com/python/cpython/issues/103124}: Added multiline statement support for @ref{aa,,pdb}

@item 
gh-101162@footnote{https://github.com/python/cpython/issues/101162}: Forbid using @code{builtins.issubclass()} with
@ref{9ec,,types.GenericAlias} as the first argument.

@item 
gh-103200@footnote{https://github.com/python/cpython/issues/103200}: Fix cache repopulation semantics of
zipimport.invalidate_caches(). The cache is now repopulated upon
retrieving files with an invalid cache, not when the cache is invalidated.

@item 
gh-100061@footnote{https://github.com/python/cpython/issues/100061}: Fix a bug that causes wrong matches for regular expressions
with possessive qualifier.

@item 
gh-77609@footnote{https://github.com/python/cpython/issues/77609}: Add `follow_symlinks' argument to @ref{537,,pathlib.Path.glob()} and
@ref{538,,rglob()}, defaulting to false.

@item 
gh-102541@footnote{https://github.com/python/cpython/issues/102541}: Hide traceback in @ref{ad4,,help()} prompt, when import failed.

@item 
gh-102120@footnote{https://github.com/python/cpython/issues/102120}: Added a stream mode to @code{tarfile} that allows for reading
archives without caching info about the inner files.

@item 
gh-102029@footnote{https://github.com/python/cpython/issues/102029}: Deprecate passing any arguments to @ref{32e,,threading.RLock()}.

@item 
gh-88233@footnote{https://github.com/python/cpython/issues/88233}: Refactored @code{zipfile._strip_extra} to use higher level
abstractions for extras instead of a heavy-state loop.

@item 
gh-102024@footnote{https://github.com/python/cpython/issues/102024}: Reduce calls of @code{_idle_semaphore.release()} in
@code{concurrent.futures.thread._worker()}.

@item 
gh-73435@footnote{https://github.com/python/cpython/issues/73435}: Add support for recursive wildcards in
@ref{6d2,,pathlib.PurePath.match()}.

@item 
gh-84867@footnote{https://github.com/python/cpython/issues/84867}: @ref{592,,unittest.TestLoader} no longer loads test cases from
exact @ref{2b3,,unittest.TestCase} and @ref{1a79,,unittest.FunctionTestCase}
classes.

@item 
gh-99203@footnote{https://github.com/python/cpython/issues/99203}: Restore following CPython <= 3.10.5 behavior of
@ref{6d9,,shutil.make_archive()}: do not create an empty archive if
@code{root_dir} is not a directory, and, in that case, raise
@ref{264,,FileNotFoundError} or @ref{1259,,NotADirectoryError} regardless of
@code{format} choice. Beyond the brought-back behavior, the function may now
also raise these exceptions in @code{dry_run} mode.

@item 
gh-80480@footnote{https://github.com/python/cpython/issues/80480}: Emit @ref{1a3,,DeprecationWarning} for @ref{8,,array}’s @code{'u'} type
code, deprecated in docs since Python 3.3.

@item 
gh-94924@footnote{https://github.com/python/cpython/issues/94924}: @ref{1935,,unittest.mock.create_autospec()} now properly returns
coroutine functions compatible with @ref{30d,,inspect.iscoroutinefunction()}

@item 
gh-94777@footnote{https://github.com/python/cpython/issues/94777}: Fix hanging @ref{98,,multiprocessing} @code{ProcessPoolExecutor} when
a child process crashes while data is being written in the call queue.

@item 
gh-92871@footnote{https://github.com/python/cpython/issues/92871}: Remove the @code{typing.io} and @code{typing.re} namespaces,
deprecated since Python 3.8. All items are still available from the main
@ref{10a,,typing} module.

@item 
bpo-43633@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43633}: Improve the textual representation of IPv4-mapped IPv6
addresses (
@geindex RFC; RFC 4291
RFC 4291@footnote{https://datatracker.ietf.org/doc/html/rfc4291.html} Sections 2.2, 2.5.5.2) in @ref{84,,ipaddress}. Patch
by Oleksandr Pavliuk.

@item 
bpo-44850@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44850}: Improve performance of @ref{1033,,operator.methodcaller()} using the
@geindex Python 향상 제안; PEP 590
PEP 590@footnote{https://peps.python.org/pep-0590/} @code{vectorcall} convention. Patch by Anthony Lee and Pieter
Eendebak.

@item 
bpo-44185@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44185}: @ref{11e6,,unittest.mock.mock_open()} will call the @code{close()}
method of the file handle mock when it is exiting from the context
manager. Patch by Samet Yaslan.

@item 
bpo-40988@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40988}: Improve performance of @ref{be4,,functools.singledispatchmethod}
by caching the generated dispatch wrapper. Optimization suggested by
frederico. Patch by @@mental32, Alex Waygood and Pieter Eendebak.

@item 
bpo-41768@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41768}: @ref{10d,,unittest.mock} speccing no longer calls class properties.
Patch by Melanie Witt.

@item 
bpo-18319@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18319}: Ensure @code{gettext(msg)} retrieve translations even if a plural
form exists. In other words: @code{gettext(msg) == ngettext(msg, '@w{'}, 1)}.

@item 
bpo-17013@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17013}: Add @code{ThreadingMock} to @ref{10d,,unittest.mock} that can be used
to create Mock objects that can wait until they are called. Patch by
Karthikeyan Singaravelan and Mario Corchero.
@end itemize

@node Documentation<20>,Tests<20>,Library<64>,Python 3 13 0 alpha 1
@anchor{whatsnew/changelog id279}@anchor{1a7a}
@subsubsection Documentation



@itemize -

@item 
gh-109209@footnote{https://github.com/python/cpython/issues/109209}: The minimum Sphinx version required for the documentation is
now 4.2.

@item 
gh-108826@footnote{https://github.com/python/cpython/issues/108826}: @ref{3c,,dis} module command-line interface is now mentioned in
documentation.

@item 
gh-107305@footnote{https://github.com/python/cpython/issues/107305}: Add documentation for @ref{78d,,PyInterpreterConfig} and
@ref{688,,Py_NewInterpreterFromConfig()}.  Also clarify some of the nearby
docs relative to per-interpreter GIL.

@item 
gh-107008@footnote{https://github.com/python/cpython/issues/107008}: Document the @ref{2f,,curses} module variables
@ref{feb,,LINES} and @ref{fec,,COLS}.

@item 
gh-106948@footnote{https://github.com/python/cpython/issues/106948}: Add a number of standard external names to @code{nitpick_ignore}.

@item 
gh-106232@footnote{https://github.com/python/cpython/issues/106232}: Make timeit doc command lines compatible with Windows by using
double quotes for arguments.  This works on linux and macOS also.

@item 
gh-105172@footnote{https://github.com/python/cpython/issues/105172}: Fixed @ref{be1,,functools.lru_cache()} docstring accounting for
@code{typed} argument’s different handling of str and int. Patch by Bar
Harel.

@item 
gh-105052@footnote{https://github.com/python/cpython/issues/105052}: Update @code{timeit} doc to specify that time in seconds is just
the default.

@item 
gh-89455@footnote{https://github.com/python/cpython/issues/89455}: Add missing documentation for the @code{max_group_depth} and
@code{max_group_width} parameters and the @code{exceptions} attribute of the
@ref{561,,traceback.TracebackException} class.

@item 
gh-89412@footnote{https://github.com/python/cpython/issues/89412}: Add missing documentation for the @code{end_lineno} and
@code{end_offset} attributes of the @ref{561,,traceback.TracebackException}
class.

@item 
gh-104943@footnote{https://github.com/python/cpython/issues/104943}: Remove mentions of old Python versions in
@ref{331,,typing.NamedTuple}.

@item 
gh-54738@footnote{https://github.com/python/cpython/issues/54738}: Add documentation on how to localize the @ref{7,,argparse} module.

@item 
gh-102823@footnote{https://github.com/python/cpython/issues/102823}: Document the return type of @code{x // y} when @code{x} and @code{y}
have type @ref{196,,float}.

@item 
gh-102759@footnote{https://github.com/python/cpython/issues/102759}: Align function signature for @code{functools.reduce} in
documentation and docstring with the C implementation.
@end itemize

@node Tests<20>,Build<23>,Documentation<20>,Python 3 13 0 alpha 1
@anchor{whatsnew/changelog id280}@anchor{1a7b}
@subsubsection Tests



@itemize -

@item 
gh-110647@footnote{https://github.com/python/cpython/issues/110647}: Fix test_stress_modifying_handlers() of test_signal. Patch by
Victor Stinner.

@item 
gh-103053@footnote{https://github.com/python/cpython/issues/103053}: Fix test_tools.test_freeze on FreeBSD: run “make distclean”
instead of “make clean” in the copied source directory to remove also the
“python” program. Patch by Victor Stinner.

@item 
gh-110167@footnote{https://github.com/python/cpython/issues/110167}: Fix a deadlock in test_socket when server fails with a timeout
but the client is still running in its thread. Don’t hold a lock to call
cleanup functions in doCleanups(). One of the cleanup function waits until
the client completes, whereas the client could deadlock if it called
addCleanup() in such situation. Patch by Victor Stinner.

@item 
gh-110388@footnote{https://github.com/python/cpython/issues/110388}: Add tests for @ref{106,,tty}.

@item 
gh-81002@footnote{https://github.com/python/cpython/issues/81002}: Add tests for @ref{e7,,termios}.

@item 
gh-110367@footnote{https://github.com/python/cpython/issues/110367}: regrtest: When using worker processes (-jN) with –verbose3
option, regrtest can now display the worker output even if a worker
process does crash. Previously, sys.stdout and sys.stderr were replaced
and so the worker output was lost on a crash. Patch by Victor Stinner.

@item 
gh-110267@footnote{https://github.com/python/cpython/issues/110267}: Add tests for pickling and copying PyStructSequence objects.
Patched by Xuehai Pan.

@item 
gh-110171@footnote{https://github.com/python/cpython/issues/110171}: @code{libregrtest} now always sets and shows @code{random.seed}, so
tests are more reproducible. Use @code{--randseed} flag to pass the explicit
random seed for tests.

@item 
gh-110152@footnote{https://github.com/python/cpython/issues/110152}: Remove @code{Tools/scripts/run_tests.py} and @code{make
hostrunnertest}. Just run @code{./python -m test --slow-ci}, @code{make
buildbottest} or @code{make test} instead. Python test runner (regrtest) now
handles cross-compilation and HOSTRUNNER. It also adds options to Python
such fast @code{-u -E -W default -bb} when @code{--fast-ci} or @code{--slow-ci}
option is used. Patch by Victor Stinner.

@item 
gh-110031@footnote{https://github.com/python/cpython/issues/110031}: Skip test_threading tests using thread+fork if Python is built
with Address Sanitizer (ASAN). Patch by Victor Stinner.

@item 
gh-110088@footnote{https://github.com/python/cpython/issues/110088}: Fix test_asyncio timeouts: don’t measure the maximum duration,
a test should not measure a CI performance. Only measure the minimum
duration when a task has a timeout or delay. Add @code{CLOCK_RES} to
@code{test_asyncio.utils}. Patch by Victor Stinner.

@item 
gh-109974@footnote{https://github.com/python/cpython/issues/109974}: Fix race conditions in test_threading lock tests. Wait until a
condition is met rather than using @ref{8ab,,time.sleep()} with a hardcoded
number of seconds. Patch by Victor Stinner.

@item 
gh-110033@footnote{https://github.com/python/cpython/issues/110033}: Fix @code{test_interprocess_signal()} of @code{test_signal}. Make
sure that the @code{subprocess.Popen} object is deleted before the test
raising an exception in a signal handler. Otherwise, @code{Popen.__del__()}
can get the exception which is logged as @code{Exception ignored in: ...} and
the test fails. Patch by Victor Stinner.

@item 
gh-109594@footnote{https://github.com/python/cpython/issues/109594}: Fix test_timeout() of test_concurrent_futures.test_wait. Remove
the future which may or may not complete depending if it takes longer than
the timeout or not. Keep the second future which does not complete before
wait() timeout. Patch by Victor Stinner.

@item 
gh-109972@footnote{https://github.com/python/cpython/issues/109972}: Split test_gdb.py file into a test_gdb package made of multiple
tests, so tests can now be run in parallel. Patch by Victor Stinner.

@item 
gh-109566@footnote{https://github.com/python/cpython/issues/109566}: regrtest: When @code{--fast-ci} or @code{--slow-ci} option is used,
regrtest now replaces the current process with a new process to add @code{-u
-W default -bb -E} options to Python. Patch by Victor Stinner.

@item 
gh-109748@footnote{https://github.com/python/cpython/issues/109748}: Fix @code{test_zippath_from_non_installed_posix()} of test_venv:
don’t copy @code{__pycache__/} sub-directories, because they can be modified
by other Python tests running in parallel. Patch by Victor Stinner.

@item 
gh-109739@footnote{https://github.com/python/cpython/issues/109739}: regrtest: Fix reference leak check on Windows. Disable the load
tracker on Windows in the reference leak check mode (-R option). Patch by
Victor Stinner.

@item 
gh-109276@footnote{https://github.com/python/cpython/issues/109276}: regrtest: When a test fails with “env changed” and the –rerun
option is used, the test is now re-run in verbose mode in a fresh process.
Patch by Victor Stinner.

@item 
gh-103053@footnote{https://github.com/python/cpython/issues/103053}: Skip test_freeze_simple_script() of test_tools.test_freeze if
Python is built with @code{./configure --enable-optimizations}, which means
with Profile Guided Optimization (PGO): it just makes the test too slow.
The freeze tool is tested by many other CIs with other (faster) compiler
flags. Patch by Victor Stinner.

@item 
gh-109580@footnote{https://github.com/python/cpython/issues/109580}: Skip @code{test_perf_profiler} if Python is built with ASAN, MSAN
or UBSAN sanitizer. Python does crash randomly in this test on such build.
Patch by Victor Stinner.

@item 
gh-109566@footnote{https://github.com/python/cpython/issues/109566}: regrtest: Add @code{--fast-ci} and @code{--slow-ci} options.
@code{--fast-ci} uses a default timeout of 10 minutes and @code{-u all,-cpu}
(skip slowest tests). @code{--slow-ci} uses a default timeout of 20 minutes
and @code{-u all} (run all tests). Patch by Victor Stinner.

@item 
gh-109425@footnote{https://github.com/python/cpython/issues/109425}: libregrtest now decodes stdout of test worker processes with
the “backslashreplace” error handler to log corrupted stdout, instead of
failing with an error and not logging the stdout. Patch by Victor Stinner.

@item 
gh-109396@footnote{https://github.com/python/cpython/issues/109396}: Fix @code{test_socket.test_hmac_sha1()} in FIPS mode. Use a longer
key: FIPS mode requires at least of at least 112 bits. The previous key
was only 32 bits. Patch by Victor Stinner.

@item 
gh-104736@footnote{https://github.com/python/cpython/issues/104736}: Fix test_gdb on Python built with LLVM clang 16 on Linux
ppc64le (ex: Fedora 38). Search patterns in gdb “bt” command output to
detect when gdb fails to retrieve the traceback. For example, skip a test
if @code{Backtrace stopped: frame did not save the PC} is found. Patch by
Victor Stinner.

@item 
gh-109276@footnote{https://github.com/python/cpython/issues/109276}: libregrtest now calls @ref{1478,,random.seed()} before running each
test file when @code{-r/--randomize} command line option is used. Moreover,
it’s also called in worker processes.  It should help to make tests more
deterministic. Previously, it was only called once in the main process
before running all test files and it was not called in worker processes.
Patch by Victor Stinner.

@item 
gh-109276@footnote{https://github.com/python/cpython/issues/109276}: libregrtest now uses a separated file descriptor to write test
result as JSON. Previously, if a test wrote debug messages late around the
JSON, the main test process failed to parse JSON. Patch by Victor Stinner.

@item 
gh-108996@footnote{https://github.com/python/cpython/issues/108996}: Fix and enable @code{test_msvcrt}.

@item 
gh-109237@footnote{https://github.com/python/cpython/issues/109237}: Fix @code{test_site.test_underpth_basic()} when the working
directory contains at least one non-ASCII character: encode the @code{._pth}
file to UTF-8 and enable the UTF-8 Mode to use UTF-8 for the child process
stdout. Patch by Victor Stinner.

@item 
gh-109230@footnote{https://github.com/python/cpython/issues/109230}: Fix @code{test_pyexpat.test_exception()}: it can now be run from a
directory different than Python source code directory. Before, the test
failed in this case.  Skip the test if Modules/pyexpat.c source is not
available. Skip also the test on Python implementations other than
CPython. Patch by Victor Stinner.

@item 
gh-108996@footnote{https://github.com/python/cpython/issues/108996}: Add tests for @code{msvcrt}.

@item 
gh-109015@footnote{https://github.com/python/cpython/issues/109015}: Fix test_asyncio, test_imaplib and test_socket tests on FreeBSD
if the TCP blackhole is enabled (@code{sysctl net.inet.tcp.blackhole}). Skip
the few tests which failed with @code{ETIMEDOUT} which such non standard
configuration. Currently, the FreeBSD GCP image enables TCP and UDP blackhole@footnote{https://reviews.freebsd.org/D41751} (@code{sysctl
net.inet.tcp.blackhole=2} and @code{sysctl net.inet.udp.blackhole=1}).
Patch by Victor Stinner.

@item 
gh-91960@footnote{https://github.com/python/cpython/issues/91960}: Skip @code{test_gdb} if gdb is unable to retrieve Python frame
objects: if a frame is @code{<optimized out>}. When Python is built with
“clang -Og”, gdb can fail to retrieve the `frame' parameter of
@code{_PyEval_EvalFrameDefault()}. In this case, tests like @code{py_bt()} are
likely to fail. Without getting access to Python frames, @code{python-gdb.py}
is mostly clueless on retrieving the Python traceback. Moreover,
@code{test_gdb} is no longer skipped on macOS if Python is built with Clang.
Patch by Victor Stinner.

@item 
gh-108962@footnote{https://github.com/python/cpython/issues/108962}: Skip @code{test_tempfile.test_flags()} if @code{chflags()} fails with
“OSError: [Errno 45] Operation not supported” (ex: on FreeBSD 13). Patch
by Victor Stinner.

@item 
gh-91960@footnote{https://github.com/python/cpython/issues/91960}: FreeBSD 13.2 CI coverage for pull requests is now provided by
Cirrus-CI (a hosted CI service that supports Linux, macOS, Windows, and
FreeBSD).

@item 
gh-89392@footnote{https://github.com/python/cpython/issues/89392}: Removed support of @code{test_main()} function in tests. They now
always use normal unittest test runner.

@item 
gh-108851@footnote{https://github.com/python/cpython/issues/108851}: Fix @code{test_tomllib} recursion tests for WASI buildbots: reduce
the recursion limit and compute the maximum nested array/dict depending on
the current available recursion limit. Patch by Victor Stinner.

@item 
gh-108851@footnote{https://github.com/python/cpython/issues/108851}: Add @code{get_recursion_available()} and @code{get_recursion_depth()}
functions to the @ref{ea,,test.support} module. Patch by Victor Stinner.

@item 
gh-108834@footnote{https://github.com/python/cpython/issues/108834}: Add @code{--fail-rerun option} option to regrtest: if a test
failed when then passed when rerun in verbose mode, exit the process with
exit code 2 (error), instead of exit code 0 (success). Patch by Victor
Stinner.

@item 
gh-108834@footnote{https://github.com/python/cpython/issues/108834}: Rename regrtest @code{--verbose2} option (@code{-w}) to @code{--rerun}.
Keep @code{--verbose2} as a deprecated alias. Patch by Victor Stinner.

@item 
gh-108834@footnote{https://github.com/python/cpython/issues/108834}: When regrtest reruns failed tests in verbose mode (@code{./python
-m test --rerun}), tests are now rerun in fresh worker processes rather
than being executed in the main process. If a test does crash or is killed
by a timeout, the main process can detect and handle the killed worker
process. Tests are rerun in parallel if the @code{-jN} option is used to run
tests in parallel. Patch by Victor Stinner.

@item 
gh-108822@footnote{https://github.com/python/cpython/issues/108822}: @code{regrtest} now computes statistics on all tests: successes,
failures and skipped. @code{test_netrc}, @code{test_pep646_syntax} and
@code{test_xml_etree} now return results in their @code{test_main()} function.
Patch by Victor Stinner and Alex Waygood.

@item 
gh-108794@footnote{https://github.com/python/cpython/issues/108794}: The @ref{4ee,,doctest.DocTestRunner.run()} method now counts the
number of skipped tests. Add @ref{4ef,,doctest.DocTestRunner.skips} and
@ref{4f0,,doctest.TestResults.skipped} attributes. Patch by Victor Stinner.

@item 
gh-108388@footnote{https://github.com/python/cpython/issues/108388}: Convert test_concurrent_futures to a package of 7 sub-tests.
Patch by Victor Stinner.

@item 
gh-108388@footnote{https://github.com/python/cpython/issues/108388}: Split test_multiprocessing_fork,
test_multiprocessing_forkserver and test_multiprocessing_spawn into test
packages. Each package is made of 4 sub-tests: processes, threads, manager
and misc. It allows running more tests in parallel and so reduce the total
test duration. Patch by Victor Stinner.

@item 
gh-105776@footnote{https://github.com/python/cpython/issues/105776}: Fix test_cppext when the C compiler command @code{-std=c11}
option: remove @code{-std=} options from the compiler command. Patch by
Victor Stinner.

@item 
gh-107652@footnote{https://github.com/python/cpython/issues/107652}: Set up CIFuzz to run fuzz targets in GitHub Actions. Patch by
Illia Volochii.

@item 
gh-107237@footnote{https://github.com/python/cpython/issues/107237}: @code{test_logging}: Fix @code{test_udp_reconnection()} by increasing
the timeout from 100 ms to 5 minutes (LONG_TIMEOUT). Patch by Victor
Stinner.

@item 
gh-107178@footnote{https://github.com/python/cpython/issues/107178}: Add the C API test for functions in the Mapping Protocol, the
Sequence Protocol and some functions in the Object Protocol.

@item 
gh-106714@footnote{https://github.com/python/cpython/issues/106714}: test_capi: Fix test_no_FatalError_infinite_loop() to no longer
write a coredump, by using test.support.SuppressCrashReport. Patch by
Victor Stinner.

@item 
gh-104090@footnote{https://github.com/python/cpython/issues/104090}: Avoid creating a reference to the test object in
@ref{1a7c,,collectedDurations()}.

@item 
gh-106752@footnote{https://github.com/python/cpython/issues/106752}: Moved tests for @code{zipfile.Path} into
@code{Lib/test/test_zipfile/_path}. Made @code{zipfile._path} a package.

@item 
gh-106690@footnote{https://github.com/python/cpython/issues/106690}: Add .coveragerc to cpython repository for use with coverage
package.

@item 
gh-101634@footnote{https://github.com/python/cpython/issues/101634}: When running the Python test suite with @code{-jN} option, if a
worker stdout cannot be decoded from the locale encoding report a failed
testn so the exitcode is non-zero. Patch by Victor Stinner.

@item 
gh-105084@footnote{https://github.com/python/cpython/issues/105084}: When the Python build is configured @code{--with-wheel-pkg-dir},
tests requiring the @code{setuptools} and @code{wheel} wheels will search for
the wheels in @code{WHEEL_PKG_DIR}.

@item 
gh-81005@footnote{https://github.com/python/cpython/issues/81005}: String tests are modified to reflect that @code{str} and
@code{unicode} are merged in Python 3. Patch by Daniel Fortunov.

@item 
gh-103186@footnote{https://github.com/python/cpython/issues/103186}: Suppress and assert expected RuntimeWarnings in
test_sys_settrace.py

@item 
gh-69714@footnote{https://github.com/python/cpython/issues/69714}: Add additional tests to @ref{15,,calendar} to achieve full test
coverage.
@end itemize

@node Build<23>,Windows<21>,Tests<20>,Python 3 13 0 alpha 1
@anchor{whatsnew/changelog id281}@anchor{1a7d}
@subsubsection Build



@itemize -

@item 
gh-103053@footnote{https://github.com/python/cpython/issues/103053}: “make check-clean-src” now also checks if the “python” program
is found in the source directory: fail with an error if it does exist.
Patch by Victor Stinner.

@item 
gh-109191@footnote{https://github.com/python/cpython/issues/109191}: Fix compile error when building with recent versions of
libedit.

@item 
gh-110276@footnote{https://github.com/python/cpython/issues/110276}: No longer ignore 
@geindex PROFILE_TASK
@geindex 환경 변수; PROFILE_TASK
@ref{1a7e,,PROFILE_TASK} failure silently:
command used by Profile Guided Optimization (PGO). Patch by Victor
Stinner.

@item 
gh-109566@footnote{https://github.com/python/cpython/issues/109566}: Remove @code{make testall} target: use @code{make buildbottest}
instead. Patch by Victor Stinner.

@item 
gh-109740@footnote{https://github.com/python/cpython/issues/109740}: The experimental @code{--disable-gil} configure flag now includes
“t” (for “threaded”) in extension ABI tags.

@item 
gh-109054@footnote{https://github.com/python/cpython/issues/109054}: Fix building the @code{_testcapi} extension on Linux AArch64 which
requires linking to libatomic when @code{<cpython/pyatomic.h>} is used: the
@code{_Py_atomic_or_uint64()} function requires libatomic
@code{__atomic_fetch_or_8()} on this platform. The configure script now
checks if linking to libatomic is needed and generates a new LIBATOMIC
variable used to build the _testcapi extension. Patch by Victor Stinner.

@item 
gh-63760@footnote{https://github.com/python/cpython/issues/63760}: Fix Solaris build: no longer redefine the @code{gethostname()}
function. Solaris defines the function since 2005. Patch by Victor
Stinner, original patch by Jakub Kulík.

@item 
gh-108740@footnote{https://github.com/python/cpython/issues/108740}: Fix a race condition in @code{make regen-all}. The
@code{deepfreeze.c} source and files generated by Argument Clinic are now
generated or updated before generating “global objects”. Previously, some
identifiers may miss depending on the order in which these files were
generated. Patch by Victor Stinner.

@item 
gh-108634@footnote{https://github.com/python/cpython/issues/108634}: Python built with @code{configure} @ref{634,,--with-trace-refs}
(tracing references) is now ABI compatible with Python release build and
@ref{508,,debug build}. Patch by Victor Stinner.

@item 
gh-85283@footnote{https://github.com/python/cpython/issues/85283}: The @code{_stat} C extension is now built with the @ref{635,,limited C API}. Patch by Victor Stinner.

@item 
gh-108447@footnote{https://github.com/python/cpython/issues/108447}: Fix x86_64 GNU/Hurd build

@item 
gh-107814@footnote{https://github.com/python/cpython/issues/107814}: When calling @code{find_python.bat} with @code{-q} it did not
properly silence the output of nuget. That is now fixed.

@item 
gh-105481@footnote{https://github.com/python/cpython/issues/105481}: Remove the make target @code{regen-opcode-targets}, merge its work
into @code{regen-opcode} which repeats most of the calculation. This
simplifies the code for the build and reduces code duplication.

@item 
gh-106881@footnote{https://github.com/python/cpython/issues/106881}: Check for @code{linux/limits.h} before including it in
@code{Modules/posixmodule.c}.

@item 
gh-95855@footnote{https://github.com/python/cpython/issues/95855}: Refactor platform triplet detection code and add detection for
MIPS soft float and musl libc.

@item 
gh-106962@footnote{https://github.com/python/cpython/issues/106962}: Detect MPI compilers in @code{configure}.

@item 
gh-106118@footnote{https://github.com/python/cpython/issues/106118}: Fix compilation for platforms without @code{O_CLOEXEC}. The
issue was introduced with Python 3.12b1 in gh-103295@footnote{https://github.com/python/cpython/issues/103295}. Patch by Erlend
Aasland.

@item 
gh-105875@footnote{https://github.com/python/cpython/issues/105875}: SQLite 3.15.2 or newer is required to build the @ref{d4,,sqlite3}
extension module. Patch by Erlend Aasland.

@item 
gh-90005@footnote{https://github.com/python/cpython/issues/90005}: Fix a regression in @code{configure} where we could end up
unintentionally linking with @code{libbsd}.

@item 
gh-102404@footnote{https://github.com/python/cpython/issues/102404}: Document how to perform a WASI build on Linux. Also add
Tools/wasm/build_wasi.sh as a reference implementation of the docs.

@item 
gh-89886@footnote{https://github.com/python/cpython/issues/89886}: Autoconf 2.71 and aclocal 1.16.4 is now required to regenerate
@code{configure}.

@item 
gh-104692@footnote{https://github.com/python/cpython/issues/104692}: Include @code{commoninstall} as a prerequisite for @code{bininstall}

This ensures that @code{commoninstall} is completed before @code{bininstall} is
started when parallel builds are used (@code{make -j install}), and so the
@code{python3} symlink is only installed after all standard library modules
are installed.

@item 
gh-101538@footnote{https://github.com/python/cpython/issues/101538}: Add experimental wasi-threads support. Patch by Takashi
Yamamoto.
@end itemize

@node Windows<21>,macOS<14>,Build<23>,Python 3 13 0 alpha 1
@anchor{whatsnew/changelog id282}@anchor{1a7f}
@subsubsection Windows



@itemize -

@item 
gh-110437@footnote{https://github.com/python/cpython/issues/110437}: Allows overriding the source of VC redistributables so that
releases can be guaranteed to never downgrade between updates.

@item 
gh-109286@footnote{https://github.com/python/cpython/issues/109286}: Update Windows installer to use SQLite 3.43.1.

@item 
gh-82367@footnote{https://github.com/python/cpython/issues/82367}: @ref{262,,os.path.realpath()} now resolves MS-DOS style file names
even if the file is not accessible. Patch by Moonsik Park.

@item 
gh-109991@footnote{https://github.com/python/cpython/issues/109991}: Update Windows build to use OpenSSL 3.0.11.

@item 
gh-106242@footnote{https://github.com/python/cpython/issues/106242}: Fixes @ref{262,,realpath()} to behave consistently when
passed a path containing an embedded null character on Windows. In strict
mode, it now raises @ref{2c0,,OSError} instead of the unexpected
@ref{2ec,,ValueError}, and in non-strict mode will make the path absolute.

@item 
gh-83180@footnote{https://github.com/python/cpython/issues/83180}: Changes the @ref{7d9,,Python install manager} to prefer an active virtual
environment when the launched script has a shebang line using a Unix-like
virtual command, even if the command requests a specific version of
Python.

@item 
gh-106844@footnote{https://github.com/python/cpython/issues/106844}: Fix integer overflow and truncating by the null character in
@code{_winapi.LCMapStringEx()} which affects @code{ntpath.normcase()}.

@item 
gh-105436@footnote{https://github.com/python/cpython/issues/105436}: Ensure that an empty environment block is terminated by two
null characters, as is required by Windows.

@item 
gh-105146@footnote{https://github.com/python/cpython/issues/105146}: Updated the links at the end of the installer to point to
Discourse rather than the mailing lists.

@item 
gh-103646@footnote{https://github.com/python/cpython/issues/103646}: When installed from the Microsoft Store, @code{pip} no longer
defaults to per-user installs. However, as the install directory is
unwritable, it should automatically decide to do a per-user install
anyway. This should resolve issues when @code{pip} is passed an option that
conflicts with @code{--user}.

@item 
gh-88745@footnote{https://github.com/python/cpython/issues/88745}: Improve performance of @ref{c4f,,shutil.copy2()} by using the
operating system’s @code{CopyFile2} function. This may result in subtle
changes to metadata copied along with some files, bringing them in line
with normal OS behavior.

@item 
gh-104820@footnote{https://github.com/python/cpython/issues/104820}: Fixes @ref{26d,,stat()} and related functions on file systems
that do not support file ID requests. This includes FAT32 and exFAT.

@item 
gh-104803@footnote{https://github.com/python/cpython/issues/104803}: Add @ref{19c2,,os.path.isdevdrive()} to detect whether a path is on a
Windows Dev Drive. Returns @code{False} on platforms that do not support Dev
Drive, and is absent on non-Windows platforms.
@end itemize

@node macOS<14>,IDLE<13>,Windows<21>,Python 3 13 0 alpha 1
@anchor{whatsnew/changelog id283}@anchor{1a80}
@subsubsection macOS



@itemize -

@item 
gh-109286@footnote{https://github.com/python/cpython/issues/109286}: Update macOS installer to use SQLite 3.43.1.

@item 
gh-109991@footnote{https://github.com/python/cpython/issues/109991}: Update macOS installer to use OpenSSL 3.0.11.

@item 
gh-99079@footnote{https://github.com/python/cpython/issues/99079}: Update macOS installer to use OpenSSL 3.0.9.
@end itemize

@node IDLE<13>,Tools/Demos<19>,macOS<14>,Python 3 13 0 alpha 1
@anchor{whatsnew/changelog id284}@anchor{1a81}
@subsubsection IDLE



@itemize -

@item 
gh-104719@footnote{https://github.com/python/cpython/issues/104719}: Remove IDLE’s modification of tokenize.tabsize and test other
uses of tokenize data and methods.
@end itemize

@node Tools/Demos<19>,C API<23>,IDLE<13>,Python 3 13 0 alpha 1
@anchor{whatsnew/changelog id285}@anchor{1a82}
@subsubsection Tools/Demos



@itemize -

@item 
gh-109991@footnote{https://github.com/python/cpython/issues/109991}: Update GitHub CI workflows to use OpenSSL 3.0.11 and
multissltests to use 1.1.1w, 3.0.11, and 3.1.3.

@item 
gh-108494@footnote{https://github.com/python/cpython/issues/108494}: Argument Clinic@footnote{https://devguide.python.org/development-tools/clinic/} now has a
partial support of the @ref{635,,Limited API}: see
documentation in the Python Developer's Guide@footnote{https://devguide.python.org/development-tools/clinic/#clinic-howto-limited-capi}
Patch by Victor Stinner.

@item 
gh-107704@footnote{https://github.com/python/cpython/issues/107704}: It is now possible to deprecate passing keyword arguments for
keyword-or-positional parameters with Argument Clinic, using the new @code{/
[from X.Y]} syntax. (To be read as `“positional-only from Python version
X.Y”'.) See documentation in the Python Developer's Guide@footnote{https://devguide.python.org/development-tools/clinic/#clinic-howto-deprecate-keyword}
for more information.

@item 
gh-107880@footnote{https://github.com/python/cpython/issues/107880}: Argument Clinic can now clone @code{__init__()} and
@code{__new__()} methods.

@item 
gh-104683@footnote{https://github.com/python/cpython/issues/104683}: Add @code{--exclude} option to Argument Clinic CLI.

@item 
gh-95065@footnote{https://github.com/python/cpython/issues/95065}: Argument Clinic now supports overriding automatically generated
signature by using directive @code{@@text_signature}. See documentation in the Python Developer's Guide@footnote{https://devguide.python.org/development-tools/clinic/#clinic-howto-override-signature}

@item 
gh-107609@footnote{https://github.com/python/cpython/issues/107609}: Fix duplicate module check in Argument Clinic. Previously, a
duplicate definition would incorrectly be silently accepted. Patch by
Erlend E. Aasland.

@item 
gh-107467@footnote{https://github.com/python/cpython/issues/107467}: The Argument Clinic command-line tool now prints to stderr
instead of stdout on failure.

@item 
gh-106970@footnote{https://github.com/python/cpython/issues/106970}: Fix bugs in the Argument Clinic @code{destination <name> clear}
command; the destination buffers would never be cleared, and the
@code{destination} directive parser would simply continue to the fault
handler after processing the command. Patch by Erlend E. Aasland.

@item 
gh-106706@footnote{https://github.com/python/cpython/issues/106706}: Change bytecode syntax for families to remove redundant name
matching pseudo syntax.

@item 
gh-106359@footnote{https://github.com/python/cpython/issues/106359}: Argument Clinic now explicitly forbids “kwarg splats” in
function calls used as annotations.

@item 
gh-103186@footnote{https://github.com/python/cpython/issues/103186}: @code{freeze} now fetches @code{CONFIG_ARGS} from the original
CPython instance the Makefile uses to call utility scripts. Patch by
Ijtaba Hussain.

@item 
gh-95065@footnote{https://github.com/python/cpython/issues/95065}: It is now possible to deprecate passing parameters positionally
with Argument Clinic, using the new @code{* [from X.Y]} syntax. (To be read
as `“keyword-only from Python version X.Y”'.) See documentation in the Python Developer's Guide@footnote{https://devguide.python.org/development-tools/clinic/#clinic-howto-deprecate-positional}
for more information. Patch by Erlend E. Aasland with help from Alex
Waygood, Nikita Sobolev, and Serhiy Storchaka.
@end itemize

@node C API<23>,,Tools/Demos<19>,Python 3 13 0 alpha 1
@anchor{whatsnew/changelog id286}@anchor{1a83}
@subsubsection C API



@itemize -

@item 
gh-85283@footnote{https://github.com/python/cpython/issues/85283}: If the @ref{65e,,Py_LIMITED_API} macro is defined,
@code{Py_BUILD_CORE}, @code{Py_BUILD_CORE_BUILTIN} and
@code{Py_BUILD_CORE_MODULE} macros are now undefined by
@code{<Python.h>}. Patch by Victor Stinner.

@item 
gh-110289@footnote{https://github.com/python/cpython/issues/110289}: Add @ref{617,,PyUnicode_EqualToUTF8AndSize()} and
@ref{618,,PyUnicode_EqualToUTF8()} functions.

@item 
gh-110235@footnote{https://github.com/python/cpython/issues/110235}: Raise @ref{198,,TypeError} for duplicate/unknown fields in
@code{PyStructSequence} constructor. Patched by Xuehai Pan.

@item 
gh-110014@footnote{https://github.com/python/cpython/issues/110014}: Remove undocumented @code{PY_TIMEOUT_MAX} constant from the
limited C API. Patch by Victor Stinner.

@item 
gh-109521@footnote{https://github.com/python/cpython/issues/109521}: @ref{1a84,,PyImport_GetImporter()} now sets RuntimeError if it
fails to get @ref{1223,,sys.path_hooks} or @ref{7f9,,sys.path_importer_cache} or
they are not list and dict correspondingly. Previously it could return
NULL without setting error in obscure cases, crash or raise SystemError if
these attributes have wrong type.

@item 
gh-108724@footnote{https://github.com/python/cpython/issues/108724}: Add @ref{485,,PyMutex} internal-only lightweight locking API.

@item 
gh-85283@footnote{https://github.com/python/cpython/issues/85283}: Add @ref{612,,PySys_AuditTuple()} function: similar to
@ref{611,,PySys_Audit()}, but pass event arguments as a Python @ref{610,,tuple}
object.  Patch by Victor Stinner.

@item 
gh-108867@footnote{https://github.com/python/cpython/issues/108867}: Add @ref{423,,PyThreadState_GetUnchecked()} function: similar to
@ref{613,,PyThreadState_Get()}, but don’t kill the process with a fatal
error if it is NULL. The caller is responsible to check if the result is
NULL. Previously, the function was private and known as
@code{_PyThreadState_UncheckedGet()}. Patch by Victor Stinner.

@item 
gh-108765@footnote{https://github.com/python/cpython/issues/108765}: @code{Python.h} no longer includes the @code{<ctype.h>} standard
header file. If needed, it should now be included explicitly. For example,
it provides @code{isalpha()} and @code{tolower()} functions which are locale
dependent. Python provides locale independent functions, like
@code{Py_ISALPHA()} and @code{Py_TOLOWER()}. Patch by Victor Stinner.

@item 
gh-108765@footnote{https://github.com/python/cpython/issues/108765}: @code{Python.h} no longer includes the @code{<unistd.h>} standard
header file. If needed, it should now be included explicitly. For example,
it provides the functions: @code{close()}, @code{getpagesize()}, @code{getpid()}
and @code{sysconf()}. Patch by Victor Stinner.

@item 
gh-108765@footnote{https://github.com/python/cpython/issues/108765}: @code{Python.h} no longer includes the @code{<ieeefp.h>} standard
header. It was included for the @code{finite()} function which is now
provided by the @code{<math.h>} header. It should now be included explicitly
if needed. Remove also the @code{HAVE_IEEEFP_H} macro. Patch by Victor
Stinner.

@item 
gh-108765@footnote{https://github.com/python/cpython/issues/108765}: @code{Python.h} no longer includes these standard header files:
@code{<time.h>}, @code{<sys/select.h>} and @code{<sys/time.h>}. If needed, they
should now be included explicitly. For example, @code{<time.h>} provides the
@code{clock()} and @code{gmtime()} functions, @code{<sys/select.h>} provides the
@code{select()} function, and @code{<sys/time.h>} provides the @code{futimes()},
@code{gettimeofday()} and @code{setitimer()} functions. Patch by Victor Stinner.

@item 
gh-108511@footnote{https://github.com/python/cpython/issues/108511}: Add functions @ref{61a,,PyObject_HasAttrWithError()},
@ref{61c,,PyObject_HasAttrStringWithError()},
@ref{61e,,PyMapping_HasKeyWithError()} and
@ref{620,,PyMapping_HasKeyStringWithError()}.

@item 
gh-107073@footnote{https://github.com/python/cpython/issues/107073}: Add @ref{60b,,PyObject_VisitManagedDict()} and
@ref{60c,,PyObject_ClearManagedDict()} functions which must be called by the
traverse and clear functions of a type using
@ref{60d,,Py_TPFLAGS_MANAGED_DICT} flag. Patch by Victor Stinner.

@item 
gh-108634@footnote{https://github.com/python/cpython/issues/108634}: Python built with @code{configure} @ref{634,,--with-trace-refs}
(tracing references) now supports the @ref{635,,Limited API}.
Patch by Victor Stinner.

@item 
gh-108014@footnote{https://github.com/python/cpython/issues/108014}: Add @ref{602,,PyLong_AsInt()} function: similar to
@ref{603,,PyLong_AsLong()}, but store the result in a C int instead
of a C long. Previously, it was known as the private function
@code{_PyLong_AsInt()} (with an underscore prefix). Patch by Victor
Stinner.

@item 
gh-108314@footnote{https://github.com/python/cpython/issues/108314}: Add @ref{5dd,,PyDict_ContainsString()} function: same as
@ref{5db,,PyDict_Contains()}, but `key' is specified as a const char* UTF-8 encoded bytes string, rather than a @ref{5dc,,PyObject}*.
Patch by Victor Stinner.

@item 
gh-108337@footnote{https://github.com/python/cpython/issues/108337}: Add atomic operations on additional data types in pyatomic.h.

@item 
gh-108014@footnote{https://github.com/python/cpython/issues/108014}: Add @ref{5fb,,Py_IsFinalizing()} function: check if the main
Python interpreter is @ref{47a,,shutting down}. Patch
by Victor Stinner.

@item 
gh-107916@footnote{https://github.com/python/cpython/issues/107916}: C API functions @ref{1a85,,PyErr_SetFromErrnoWithFilename()},
@ref{1a86,,PyErr_SetExcFromWindowsErrWithFilename()} and
@ref{1a87,,PyErr_SetFromWindowsErrWithFilename()} save now the error code
before calling @ref{1a88,,PyUnicode_DecodeFSDefault()}.

@item 
gh-107915@footnote{https://github.com/python/cpython/issues/107915}: Such C API functions as @code{PyErr_SetString()},
@code{PyErr_Format()}, @code{PyErr_SetFromErrnoWithFilename()} and many others
no longer crash or ignore errors if it failed to format the error message
or decode the filename. Instead, they keep a corresponding error.

@item 
gh-107810@footnote{https://github.com/python/cpython/issues/107810}: Improve @ref{1a3,,DeprecationWarning} for uses of
@ref{1a89,,PyType_Spec} with metaclasses that have custom @code{tp_new}.

@item 
gh-107249@footnote{https://github.com/python/cpython/issues/107249}: Implement the @ref{1a8a,,Py_UNUSED} macro for Windows MSVC
compiler. Patch by Victor Stinner.

@item 
gh-107226@footnote{https://github.com/python/cpython/issues/107226}: @ref{607,,PyModule_AddObjectRef()} is now only available in the
limited API version 3.10 or later.

@item 
gh-106320@footnote{https://github.com/python/cpython/issues/106320}: Remove private @code{_PyUnicode_AsString()} alias to
@ref{424,,PyUnicode_AsUTF8()}. It was kept for backward compatibility with
Python 3.0 - 3.2. The @code{PyUnicode_AsUTF8()} is available since Python
3.3. The @ref{1393,,PyUnicode_AsUTF8String()} function can be used to keep
compatibility with Python 3.2 and older. Patch by Victor Stinner.

@item 
gh-106572@footnote{https://github.com/python/cpython/issues/106572}: Convert @ref{1834,,PyObject_DelAttr()} and
@ref{1835,,PyObject_DelAttrString()} macros to functions. Patch by Victor
Stinner.

@item 
gh-106307@footnote{https://github.com/python/cpython/issues/106307}: Add @ref{5e8,,PyMapping_GetOptionalItem()} function.

@item 
gh-106521@footnote{https://github.com/python/cpython/issues/106521}: Add @ref{5ea,,PyObject_GetOptionalAttr()} and
@ref{5eb,,PyObject_GetOptionalAttrString()} functions.

@item 
gh-106320@footnote{https://github.com/python/cpython/issues/106320}: Remove @code{_PyInterpreterState_Get()} alias to
@ref{64a,,PyInterpreterState_Get()} which was kept for backward
compatibility with Python 3.8. Patch by Victor Stinner.

@item 
gh-106316@footnote{https://github.com/python/cpython/issues/106316}: Remove @code{cpython/pytime.h} header file: it only contained
private functions. Patch by Victor Stinner.

@item 
gh-106023@footnote{https://github.com/python/cpython/issues/106023}: Remove private @code{_PyObject_FastCall()} function: use
@code{PyObject_Vectorcall()} which is available since Python 3.8
(
@geindex Python 향상 제안; PEP 590
PEP 590@footnote{https://peps.python.org/pep-0590/}). Patch by Victor Stinner.

@item 
gh-106168@footnote{https://github.com/python/cpython/issues/106168}: If Python is built in @ref{508,,debug mode} or
@ref{62b,,with assertions}, @ref{62c,,PyTuple_SET_ITEM()}
and @ref{62d,,PyList_SET_ITEM()} now check the index argument with an
assertion. If the assertion fails, make sure that the size is set before.
Patch by Victor Stinner.

@item 
gh-106084@footnote{https://github.com/python/cpython/issues/106084}: Remove the old aliases to functions calling functions which
were kept for backward compatibility with Python 3.8 provisional API:


@itemize *

@item 
@code{_PyObject_CallMethodNoArgs()}: use @code{PyObject_CallMethodNoArgs()}

@item 
@code{_PyObject_CallMethodOneArg()}: use @code{PyObject_CallMethodOneArg()}

@item 
@code{_PyObject_CallOneArg()}: use @code{PyObject_CallOneArg()}

@item 
@code{_PyObject_FastCallDict()}: use @code{PyObject_VectorcallDict()}

@item 
@code{_PyObject_Vectorcall()}: use @code{PyObject_Vectorcall()}

@item 
@code{_PyObject_VectorcallMethod()}: use @code{PyObject_VectorcallMethod()}

@item 
@code{_PyVectorcall_Function()}: use @code{PyVectorcall_Function()}
@end itemize

Just remove the underscore prefix to update your code. Patch by Victor
Stinner.

@item 
gh-106004@footnote{https://github.com/python/cpython/issues/106004}: Adds @ref{5e0,,PyDict_GetItemRef()} and
@ref{421,,PyDict_GetItemStringRef()} functions: similar to
@ref{5de,,PyDict_GetItemWithError()} but returning a @ref{5df,,strong reference}
instead of a @ref{3d7,,borrowed reference}. Patch by Victor Stinner.

@item 
gh-105927@footnote{https://github.com/python/cpython/issues/105927}: Deprecate the @ref{3dd,,PyWeakref_GetObject()} and
@ref{3de,,PyWeakref_GET_OBJECT()} functions: use the new
@ref{3df,,PyWeakref_GetRef()} function instead. Patch by Victor Stinner.

@item 
gh-105927@footnote{https://github.com/python/cpython/issues/105927}: Add @ref{3df,,PyWeakref_GetRef()} function: similar to
@ref{3dd,,PyWeakref_GetObject()} but returns a @ref{5df,,strong reference}, or
@code{NULL} if the referent is no longer live. Patch by Victor Stinner.

@item 
gh-105922@footnote{https://github.com/python/cpython/issues/105922}: Add @ref{5fa,,PyImport_AddModuleRef()}: similar to
@ref{5f9,,PyImport_AddModule()}, but return a @ref{5df,,strong reference}
instead of a @ref{3d7,,borrowed reference}. Patch by Victor Stinner.

@item 
gh-105227@footnote{https://github.com/python/cpython/issues/105227}: The new @ref{1a8b,,PyType_GetDict()} provides the dictionary for
the given type object that is normally exposed by @code{cls.__dict__}.
Normally it’s sufficient to use @ref{1a8c,,tp_dict}, but for
the static builtin types @code{tp_dict} is now always @code{NULL}.
@code{PyType_GetDict()} provides the correct dict object instead.

@item 
gh-105375@footnote{https://github.com/python/cpython/issues/105375}: Fix a bug in @ref{1a8d,,PyErr_WarnExplicit()} where an exception
could end up being overwritten if the API failed internally.

@item 
gh-105603@footnote{https://github.com/python/cpython/issues/105603}: We’ve renamed the new (in 3.12) @code{PyInterpreterConfig.own_gil}
to @code{PyInterpreterConfig.gil} and changed the meaning of the value from
“bool” to an integer with supported values of
@code{PyInterpreterConfig_DEFAULT_GIL}, @code{PyInterpreterConfig_SHARED_GIL},
and @code{PyInterpreterConfig_OWN_GIL}. The default is “shared”.

@item 
gh-105387@footnote{https://github.com/python/cpython/issues/105387}: In the limited C API version 3.12, @ref{78e,,Py_INCREF()} and
@ref{78f,,Py_DECREF()} functions are now implemented as opaque function calls
to hide implementation details. Patch by Victor Stinner.

@item 
gh-105396@footnote{https://github.com/python/cpython/issues/105396}: Deprecate the @ref{3db,,PyImport_ImportModuleNoBlock()} function
which is just an alias to @ref{3dc,,PyImport_ImportModule()} since Python
3.3. Patch by Victor Stinner.

@item 
gh-103968@footnote{https://github.com/python/cpython/issues/103968}: @ref{771,,PyType_FromMetaclass()} now allows metaclasses with
@code{tp_new} set to @code{NULL}.

@item 
gh-105268@footnote{https://github.com/python/cpython/issues/105268}: Remove the old private, undocumented and untested
@code{_PyGC_FINALIZED()} macro which was kept for backward compatibility with
Python 3.8 and older. Patch by Victor Stinner.

@item 
gh-105182@footnote{https://github.com/python/cpython/issues/105182}: Remove @code{PyEval_AcquireLock()} and @code{PyEval_ReleaseLock()}
functions, deprecated in Python 3.2. Patch by Victor Stinner.

@item 
gh-105182@footnote{https://github.com/python/cpython/issues/105182}: Remove @code{PyEval_InitThreads()} and
@code{PyEval_ThreadsInitialized()} functions, deprecated in Python 3.9. Patch
by Victor Stinner.

@item 
gh-105145@footnote{https://github.com/python/cpython/issues/105145}: Deprecate old Python initialization functions:


@itemize *

@item 
@ref{3f4,,PySys_ResetWarnOptions()}

@item 
@ref{3e9,,Py_GetExecPrefix()}

@item 
@ref{3e3,,Py_GetPath()}

@item 
@ref{3e5,,Py_GetPrefix()}

@item 
@ref{3ec,,Py_GetProgramFullPath()}

@item 
@ref{3ee,,Py_GetProgramName()}

@item 
@ref{3ef,,Py_GetPythonHome()}
@end itemize

Patch by Victor Stinner.

@item 
gh-85275@footnote{https://github.com/python/cpython/issues/85275}: @code{PyObject_AsCharBuffer()}, @code{PyObject_AsReadBuffer()},
@code{PyObject_CheckReadBuffer()}, and @code{PyObject_AsWriteBuffer()} are
removed. Please migrate to new buffer protocol;
@ref{638,,PyObject_GetBuffer()} and @ref{639,,PyBuffer_Release()}.

@item 
gh-105156@footnote{https://github.com/python/cpython/issues/105156}: Deprecate the old @code{Py_UNICODE} and @code{PY_UNICODE_TYPE} types:
use directly the @code{wchar_t} type instead. Since Python 3.3,
@code{Py_UNICODE} and @code{PY_UNICODE_TYPE} are just aliases to
@code{wchar_t}. Patch by Victor Stinner.

@item 
gh-105145@footnote{https://github.com/python/cpython/issues/105145}: Remove the following old functions to configure the Python
initialization, deprecated in Python 3.11:


@itemize *

@item 
@code{PySys_AddWarnOptionUnicode()}

@item 
@code{PySys_AddWarnOption()}

@item 
@code{PySys_AddXOption()}

@item 
@code{PySys_HasWarnOptions()}

@item 
@code{PySys_SetArgvEx()}

@item 
@code{PySys_SetArgv()}

@item 
@code{PySys_SetPath()}

@item 
@code{Py_SetPath()}

@item 
@code{Py_SetProgramName()}

@item 
@code{Py_SetPythonHome()}

@item 
@code{Py_SetStandardStreamEncoding()}

@item 
@code{_Py_SetProgramFullPath()}
@end itemize

Patch by Victor Stinner.

@item 
gh-105107@footnote{https://github.com/python/cpython/issues/105107}: Remove functions deprecated in Python 3.9.


@itemize *

@item 
@code{PyEval_CallObject()}, @code{PyEval_CallObjectWithKeywords()}: use
@ref{63a,,PyObject_CallNoArgs()} and @ref{63b,,PyObject_Call()} (positional
arguments must not be `NULL') instead.

@item 
@code{PyEval_CallFunction()}: use @ref{63d,,PyObject_CallFunction()} instead.

@item 
@code{PyEval_CallMethod()}: use @ref{63e,,PyObject_CallMethod()} instead.

@item 
@code{PyCFunction_Call()}: use @ref{63b,,PyObject_Call()} instead.
@end itemize

Patch by Victor Stinner.

@item 
gh-105115@footnote{https://github.com/python/cpython/issues/105115}: @code{PyTypeObject.tp_bases} (and @code{tp_mro}) for builtin static
types are now shared by all interpreters, whereas in 3.12-beta1 they were
stored on @code{PyInterpreterState}.  Also note that now the tuples are
immortal objects.

@item 
gh-105071@footnote{https://github.com/python/cpython/issues/105071}: Add @code{PyUnstable_Exc_PrepReraiseStar} to the unstable C api to
expose the implementation of @ref{1ac,,except*}.

@item 
gh-104922@footnote{https://github.com/python/cpython/issues/104922}: @code{PY_SSIZE_T_CLEAN} is no longer required to use @code{'#'}
formats in APIs like @ref{3c1,,PyArg_ParseTuple()} and
@ref{3c2,,Py_BuildValue()}. They uses @code{Py_ssize_t} for @code{'#'} regardless
@code{PY_SSIZE_T_CLEAN}.

@item 
gh-104584@footnote{https://github.com/python/cpython/issues/104584}: Add an unstable C API for hooking in an optimizer. This is
mainly internal, but marked “unstable” to allow third-party
experimentation.

@item 
gh-104668@footnote{https://github.com/python/cpython/issues/104668}: Don’t call @ref{7a3,,PyOS_InputHook} or
@ref{7a4,,PyOS_ReadlineFunctionPointer} in subinterpreters, since it’s
generally difficult to avoid using global state in their registered
callbacks. This also avoids situations where extensions may find
themselves running in a subinterpreter they don’t support (or haven’t yet
been loaded in).

@item 
bpo-42327@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42327}: Add @ref{609,,PyModule_Add()} function: similar to
@ref{607,,PyModule_AddObjectRef()} and @ref{608,,PyModule_AddObject()}, but
always steals a reference to the value.

@item 
bpo-40309@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40309}: Properly handle trailing spaces before closing parenthesis in
@ref{3c2,,Py_BuildValue()} format strings.
@end itemize

@node Python 3 12 0 beta 1,Python 3 12 0 alpha 7,Python 3 13 0 alpha 1,Changelog
@anchor{whatsnew/changelog python-3-12-0-beta-1}@anchor{1a8e}
@subsection Python 3.12.0 beta 1


`Release date: 2023-05-22'

@menu
* Security: Security<23>. 
* Library: Library<65>. 
* Core and Builtins: Core and Builtins<60>. 
* Library: Library<66>. 
* Core and Builtins: Core and Builtins<61>. 
* Library: Library<67>. 
* Documentation: Documentation<21>. 
* Tests: Tests<21>. 
* Build: Build<24>. 
* Windows: Windows<22>. 
* macOS: macOS<15>. 
* IDLE: IDLE<14>. 
* Tools/Demos: Tools/Demos<20>. 
* C API: C API<24>. 

@end menu

@node Security<23>,Library<65>,,Python 3 12 0 beta 1
@anchor{whatsnew/changelog id287}@anchor{1a8f}
@subsubsection Security



@itemize -

@item 
gh-99889@footnote{https://github.com/python/cpython/issues/99889}: Fixed a security in flaw in @code{uu.decode()} that could allow
for directory traversal based on the input if no @code{out_file} was
specified.

@item 
gh-104049@footnote{https://github.com/python/cpython/issues/104049}: Do not expose the local on-disk location in directory indexes
produced by @code{http.client.SimpleHTTPRequestHandler}.

@item 
gh-99108@footnote{https://github.com/python/cpython/issues/99108}: Upgrade built-in @ref{6c,,hashlib} SHA3 implementation to a
verified implementation from the @code{HACL*} project.  Used when OpenSSL is
not present or lacks SHA3.

@item 
gh-102153@footnote{https://github.com/python/cpython/issues/102153}: @ref{f39,,urllib.parse.urlsplit()} now strips leading C0 control and
space characters following the specification for URLs defined by WHATWG in
response to 
@geindex Common Vulnerabilities and Exposures; CVE 2023-24329
CVE 2023-24329@footnote{https://www.cve.org/CVERecord?id=CVE-2023-24329}. Patch by Illia Volochii.
@end itemize

@node Library<65>,Core and Builtins<60>,Security<23>,Python 3 12 0 beta 1
@anchor{whatsnew/changelog id288}@anchor{1a90}
@subsubsection Library



@itemize -

@item 
gh-102856@footnote{https://github.com/python/cpython/issues/102856}: Implement PEP 701 changes in the @ref{101,,tokenize} module. Patch
by Marta Gómez Macías and Pablo Galindo Salgado
@end itemize

@node Core and Builtins<60>,Library<66>,Library<65>,Python 3 12 0 beta 1
@anchor{whatsnew/changelog id289}@anchor{1a91}
@subsubsection Core and Builtins



@itemize -

@item 
gh-104615@footnote{https://github.com/python/cpython/issues/104615}: Fix wrong ordering of assignments in code like @code{a, a = x, y}.
Contributed by Carl Meyer.

@item 
gh-104572@footnote{https://github.com/python/cpython/issues/104572}: Improve syntax error message for invalid constructs in
@geindex Python 향상 제안; PEP 695
PEP 695@footnote{https://peps.python.org/pep-0695/} contexts and in annotations when @code{from __future__ import
annotations} is active.

@item 
gh-104482@footnote{https://github.com/python/cpython/issues/104482}: Fix three error handling bugs in ast.c’s validation of pattern
matching statements.

@item 
gh-102818@footnote{https://github.com/python/cpython/issues/102818}: Do not add a frame to the traceback in the @code{sys.setprofile}
and @code{sys.settrace} trampoline functions. This ensures that frames are
not duplicated if an exception is raised in the callback function, and
ensures that frames are not omitted if a C callback is used and that does
not add the frame.

@item 
gh-104405@footnote{https://github.com/python/cpython/issues/104405}: Fix an issue where some @ref{4ab,,bytecode} instructions could
ignore 
@geindex Python 향상 제안; PEP 523
PEP 523@footnote{https://peps.python.org/pep-0523/} when “inlining” calls.

@item 
gh-103082@footnote{https://github.com/python/cpython/issues/103082}: Change behavior of @code{sys.monitoring.events.LINE} events in
@code{sys.monitoring}: Line events now occur when a new line is reached
dynamically, instead of using a static approximation, as before. This
makes the behavior very similar to that of “line” events in
@code{sys.settrace}. This should ease porting of tools from 3.11 to 3.12.

@item 
gh-104263@footnote{https://github.com/python/cpython/issues/104263}: Fix @code{float("nan")} to produce a quiet NaN on platforms (like
MIPS) where the meaning of the signalling / quiet bit is inverted from its
usual meaning. Also introduce a new macro @code{Py_INFINITY} matching C99’s
@code{INFINITY}, and refactor internals to rely on C99’s @code{NAN} and
@code{INFINITY} macros instead of hard-coding bit patterns for infinities and
NaNs. Thanks Sebastian Berg.

@item 
gh-99113@footnote{https://github.com/python/cpython/issues/99113}: Multi-phase init extension modules may now indicate that they
support running in subinterpreters that have their own GIL.  This is done
by using @code{Py_MOD_PER_INTERPRETER_GIL_SUPPORTED} as the value for the
@code{Py_mod_multiple_interpreters} module def slot.  Otherwise the module,
by default, cannot be imported in such subinterpreters.  (This does not
affect the main interpreter or subinterpreters that do not have their own
GIL.)  In addition to the isolation that multi-phase init already normally
requires, support for per-interpreter GIL involves one additional
constraint: thread-safety.  If the module has external (linked)
dependencies and those libraries have any state that isn’t thread-safe
then the module must do the additional work to add thread-safety.  This
should be an uncommon case.

@item 
gh-99113@footnote{https://github.com/python/cpython/issues/99113}: The GIL is now (optionally) per-interpreter.  This is the
fundamental change for PEP 684.  This is all made possible by virtue of
the isolated state of each interpreter in the process.  The behavior of
the main interpreter remains unchanged.  Likewise, interpreters created
using @code{Py_NewInterpreter()} are not affected.  To get an interpreter
with its own GIL, call @code{Py_NewInterpreterFromConfig()}.

@item 
gh-104108@footnote{https://github.com/python/cpython/issues/104108}: Multi-phase init extension modules may now indicate whether or
not they actually support multiple interpreters.  By default such modules
are expected to support use in multiple interpreters.  In the uncommon
case that one does not, it may use the new
@code{Py_mod_multiple_interpreters} module def slot.  A value of @code{0} means
the module does not support them. @code{1} means it does.  The default is
@code{1}.

@item 
gh-104142@footnote{https://github.com/python/cpython/issues/104142}: Fix an issue where @ref{24d,,list} or @ref{610,,tuple} repetition
could fail to respect 
@geindex Python 향상 제안; PEP 683
PEP 683@footnote{https://peps.python.org/pep-0683/}.

@item 
gh-104078@footnote{https://github.com/python/cpython/issues/104078}: Improve the performance of @ref{61b,,PyObject_HasAttrString()}

@item 
gh-104066@footnote{https://github.com/python/cpython/issues/104066}: Improve the performance of @ref{6f8,,hasattr()} for module objects
with a missing attribute.

@item 
gh-104028@footnote{https://github.com/python/cpython/issues/104028}: Reduce object creation while calling callback function from gc.
Patch by Donghee Na.

@item 
gh-104018@footnote{https://github.com/python/cpython/issues/104018}: Disallow the “z” format specifier in %-format of bytes objects.

@item 
gh-102213@footnote{https://github.com/python/cpython/issues/102213}: Fix performance loss when accessing an object’s attributes with
@code{__getattr__}  defined.

@item 
gh-103895@footnote{https://github.com/python/cpython/issues/103895}: Improve handling of edge cases in showing
@code{Exception.__notes__}. Ensures that the messages always end with a
newline and that string/bytes are not exploded over multiple lines. Patch
by Carey Metcalfe.

@item 
gh-103907@footnote{https://github.com/python/cpython/issues/103907}: Don’t modify the refcounts of known immortal objects
(@ref{e06,,True}, @ref{d2a,,False}, and @ref{884,,None}) in the main interpreter
loop.

@item 
gh-103899@footnote{https://github.com/python/cpython/issues/103899}: Provide a helpful hint in the @ref{198,,TypeError} message when
accidentally calling a @ref{19de,,module} object that has a callable attribute
of the same name (such as @ref{205,,dis.dis()} or @ref{4e2,,datetime.datetime}).

@item 
gh-103845@footnote{https://github.com/python/cpython/issues/103845}: Remove both line and instruction instrumentation before adding
new ones for monitoring, to avoid newly added instrumentation being
removed immediately.

@item 
gh-103763@footnote{https://github.com/python/cpython/issues/103763}: Implement 
@geindex Python 향상 제안; PEP 695
PEP 695@footnote{https://peps.python.org/pep-0695/}, adding syntactic support for generic
classes, generic functions, and type aliases.

A new @code{type X = ...} syntax is added for type aliases, which resolves at
runtime to an instance of the new class @code{typing.TypeAliasType}. The
value is lazily evaluated and is accessible through the @code{.__value__}
attribute. This is implemented as a new AST node @code{ast.TypeAlias}.

New syntax (@code{class X[T]: ...}, @code{def func[T](): ...}) is added for
defining generic functions and classes. This is implemented as a new
@code{type_params} attribute on the AST nodes for classes and functions. This
node holds instances of the new AST classes @code{ast.TypeVar},
@code{ast.ParamSpec}, and @code{ast.TypeVarTuple}.

@code{typing.TypeVar}, @code{typing.ParamSpec}, @code{typing.ParamSpecArgs},
@code{typing.ParamSpecKwargs}, @code{typing.TypeVarTuple}, and
@code{typing.Generic} are now implemented in C rather than Python.

There are new bytecode instructions @code{LOAD_LOCALS},
@code{LOAD_CLASSDICT_OR_GLOBAL}, and @code{LOAD_CLASSDICT_OR_DEREF} to support
correct resolution of names in class namespaces.

Patch by Eric Traut, Larry Hastings, and Jelle Zijlstra.
@end itemize

@node Library<66>,Core and Builtins<61>,Core and Builtins<60>,Python 3 12 0 beta 1
@anchor{whatsnew/changelog id290}@anchor{1a92}
@subsubsection Library



@itemize -

@item 
gh-103801@footnote{https://github.com/python/cpython/issues/103801}: Adds three minor linting fixes to the wasm module caught that
were caught by ruff.

@item 
gh-103793@footnote{https://github.com/python/cpython/issues/103793}: Optimized asyncio Task creation by deferring expensive string
formatting (task name generation) from Task creation to the first time
@code{get_name} is called. This makes asyncio benchmarks up to 5% faster.
@end itemize

@node Core and Builtins<61>,Library<67>,Library<66>,Python 3 12 0 beta 1
@anchor{whatsnew/changelog id291}@anchor{1a93}
@subsubsection Core and Builtins



@itemize -

@item 
gh-102310@footnote{https://github.com/python/cpython/issues/102310}: Change the error range for invalid bytes literals.

@item 
gh-103590@footnote{https://github.com/python/cpython/issues/103590}: Do not wrap a single exception raised from a @code{try-except*}
construct in an @ref{4d3,,ExceptionGroup}.

@item 
gh-103650@footnote{https://github.com/python/cpython/issues/103650}: Change the perf map format to remove the ‘0x’ prefix from the
addresses

@item 
gh-102856@footnote{https://github.com/python/cpython/issues/102856}: Implement the required C tokenizer changes for PEP 701. Patch
by Pablo Galindo Salgado, Lysandros Nikolaou, Batuhan Taskaya, Marta Gómez
Macías and sunmy2019.

@item 
gh-100530@footnote{https://github.com/python/cpython/issues/100530}: Clarify the error message raised when the called part of a
class pattern isn’t actually a class.

@item 
gh-101517@footnote{https://github.com/python/cpython/issues/101517}: Fix bug in line numbers of instructions emitted for
@ref{1ac,,except*}.

@item 
gh-103492@footnote{https://github.com/python/cpython/issues/103492}: Clarify @ref{1ae,,SyntaxWarning} with literal @code{is} comparison by
specifying which literal is problematic, since comparisons using @code{is}
with e.g. @code{None} and bool literals are idiomatic.

@item 
gh-87729@footnote{https://github.com/python/cpython/issues/87729}: Add @ref{701,,LOAD_SUPER_ATTR} (and a specialization for
@code{super().method()}) to speed up @code{super().method()} and
@code{super().attr}. This makes @code{super().method()} roughly 2.3x faster and
brings it within 20% of the performance of a simple method call. Patch by
Vladimir Matveev and Carl Meyer.

@item 
gh-103488@footnote{https://github.com/python/cpython/issues/103488}: Change the internal offset distinguishing yield and return
target addresses, so that the instruction pointer is correct for exception
handling and other stack unwinding.

@item 
gh-82012@footnote{https://github.com/python/cpython/issues/82012}: The bitwise inversion operator (@code{~}) on bool is deprecated. It
returns the bitwise inversion of the underlying @code{int} representation
such that @code{bool(~True) == True}, which can be confusing. Use @code{not} for
logical negation of bools. In the rare case that you really need the
bitwise inversion of the underlying @code{int}, convert to int explicitly
@code{~int(x)}.

@item 
gh-77757@footnote{https://github.com/python/cpython/issues/77757}: Exceptions raised in a typeobject’s @code{__set_name__} method are
no longer wrapped by a @ref{244,,RuntimeError}. Context information is added
to the exception as a 
@geindex Python 향상 제안; PEP 678
PEP 678@footnote{https://peps.python.org/pep-0678/} note.

@item 
gh-103333@footnote{https://github.com/python/cpython/issues/103333}: @ref{5ee,,AttributeError} now retains the @code{name} attribute when
pickled and unpickled.

@item 
gh-103242@footnote{https://github.com/python/cpython/issues/103242}: Migrate @ref{1348,,set_ecdh_curve()} method not to
use deprecated OpenSSL APIs. Patch by Donghee Na.

@item 
gh-103323@footnote{https://github.com/python/cpython/issues/103323}: We’ve replaced our use of @code{_PyRuntime.tstate_current} with a
thread-local variable.  This is a fairly low-level implementation detail,
and there should be no change in behavior.

@item 
gh-84436@footnote{https://github.com/python/cpython/issues/84436}: The implementation of PEP-683 which adds Immortal Objects by
using a fixed reference count that skips reference counting to make
objects truly immutable.

@item 
gh-102700@footnote{https://github.com/python/cpython/issues/102700}: Allow built-in modules to be submodules. This allows submodules
to be statically linked into a CPython binary.

@item 
gh-103082@footnote{https://github.com/python/cpython/issues/103082}: Implement 
@geindex Python 향상 제안; PEP 669
PEP 669@footnote{https://peps.python.org/pep-0669/} Low Impact Monitoring for CPython.

@item 
gh-88691@footnote{https://github.com/python/cpython/issues/88691}: Reduce the number of inline @ref{907,,CACHE} entries for
@ref{914,,CALL}.

@item 
gh-102500@footnote{https://github.com/python/cpython/issues/102500}: Make the buffer protocol accessible in Python code using the
new @code{__buffer__} and @code{__release_buffer__} magic methods. See
@geindex Python 향상 제안; PEP 688
PEP 688@footnote{https://peps.python.org/pep-0688/} for details. Patch by Jelle Zijlstra.

@item 
gh-97933@footnote{https://github.com/python/cpython/issues/97933}: 
@geindex Python 향상 제안; PEP 709
PEP 709@footnote{https://peps.python.org/pep-0709/}: inline list, dict and set comprehensions to improve
performance and reduce bytecode size.

@item 
gh-99184@footnote{https://github.com/python/cpython/issues/99184}: Bypass instance attribute access of @code{__name__} in @code{repr} of
@ref{11ef,,weakref.ref}.

@item 
gh-98003@footnote{https://github.com/python/cpython/issues/98003}: Complex function calls are now faster and consume no C stack
space.

@item 
bpo-39610@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39610}: @code{len()} for 0-dimensional @ref{165,,memoryview} objects (such
as @code{memoryview(ctypes.c_uint8(42))}) now raises a @ref{198,,TypeError}.
Previously this returned @code{1}, which was not consistent with
@code{mem_0d[0]} raising an @ref{173a,,IndexError}.
@end itemize

@node Library<67>,Documentation<21>,Core and Builtins<61>,Python 3 12 0 beta 1
@anchor{whatsnew/changelog id292}@anchor{1a94}
@subsubsection Library



@itemize -

@item 
bpo-31821@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31821}: Fix @code{pause_reading()} to work when called from
@code{connection_made()} in @ref{b,,asyncio}.

@item 
gh-104600@footnote{https://github.com/python/cpython/issues/104600}: @ref{1221,,functools.update_wrapper()} now sets the
@code{__type_params__} attribute (added by 
@geindex Python 향상 제안; PEP 695
PEP 695@footnote{https://peps.python.org/pep-0695/}).

@item 
gh-104340@footnote{https://github.com/python/cpython/issues/104340}: When an @code{asyncio} pipe protocol loses its connection due to
an error, and the caller doesn’t await @code{wait_closed()} on the
corresponding @code{StreamWriter}, don’t log a warning about an exception
that was never retrieved. After all, according to the
@code{StreamWriter.close()} docs, the @code{wait_closed()} call is optional
(“not mandatory”).

@item 
gh-104555@footnote{https://github.com/python/cpython/issues/104555}: Fix issue where an @ref{9c4,,issubclass()} check comparing a class
@code{X} against a @ref{673,,runtime-checkable protocol} @code{Y} with non-callable members would not
cause @ref{198,,TypeError} to be raised if an @ref{2ad,,isinstance()} call had
previously been made comparing an instance of @code{X} to @code{Y}. This issue
was present in edge cases on Python 3.11, but became more prominent in
3.12 due to some unrelated changes that were made to runtime-checkable
protocols. Patch by Alex Waygood.

@item 
gh-104372@footnote{https://github.com/python/cpython/issues/104372}: Refactored the @code{_posixsubprocess} internals to avoid Python C
API usage between fork and exec when marking @code{pass_fds=} file
descriptors inheritable.

@item 
gh-104484@footnote{https://github.com/python/cpython/issues/104484}: Added `case_sensitive' argument to
@ref{6d2,,pathlib.PurePath.match()}

@item 
gh-75367@footnote{https://github.com/python/cpython/issues/75367}: Fix data descriptor detection in
@ref{6bb,,inspect.getattr_static()}.

@item 
gh-104536@footnote{https://github.com/python/cpython/issues/104536}: Fix a race condition in the internal
@code{multiprocessing.process} cleanup logic that could manifest as an
unintended @code{AttributeError} when calling @code{process.close()}.

@item 
gh-103857@footnote{https://github.com/python/cpython/issues/103857}: Update datetime deprecations’ stracktrace to point to the
calling line

@item 
gh-101520@footnote{https://github.com/python/cpython/issues/101520}: Move the core functionality of the @code{tracemalloc} module in
the @code{Python/} folder, leaving just the module wrapper in @code{Modules/}.

@item 
gh-104392@footnote{https://github.com/python/cpython/issues/104392}: Remove undocumented and unused @code{_paramspec_tvars} attribute
from some classes in @ref{10a,,typing}.

@item 
gh-102613@footnote{https://github.com/python/cpython/issues/102613}: Fix issue where @ref{537,,pathlib.Path.glob()} raised
@ref{f67,,RecursionError} when walking deep directory trees.

@item 
gh-103000@footnote{https://github.com/python/cpython/issues/103000}: Improve performance of @ref{1a95,,dataclasses.asdict()} for the
common case where `dict_factory' is @code{dict}. Patch by David C Ellis.

@item 
gh-104301@footnote{https://github.com/python/cpython/issues/104301}: Allow leading whitespace in disambiguated statements in
@ref{aa,,pdb}.

@item 
gh-104139@footnote{https://github.com/python/cpython/issues/104139}: Teach @code{urllib.parse.unsplit()} to retain the @code{"//"} when
assembling @code{itms-services://?action=generate-bugs} style Apple Platform Deployment@footnote{https://support.apple.com/en-gb/guide/deployment/depce7cefc4d/web}
URLs.

@item 
gh-104307@footnote{https://github.com/python/cpython/issues/104307}: @ref{1a3b,,socket.getnameinfo()} now releases the GIL while
contacting the DNS server

@item 
gh-104310@footnote{https://github.com/python/cpython/issues/104310}: Users may now use @code{importlib.util.allowing_all_extensions()}
(a context manager) to temporarily disable the strict compatibility checks
for importing extension modules in subinterpreters.

@item 
gh-87695@footnote{https://github.com/python/cpython/issues/87695}: Fix issue where @ref{537,,pathlib.Path.glob()} raised @ref{2c0,,OSError}
when it encountered a symlink to an overly long path.

@item 
gh-104265@footnote{https://github.com/python/cpython/issues/104265}: Prevent possible crash by disallowing instantiation of the
@code{_csv.Reader} and @code{_csv.Writer} types. The regression was
introduced in 3.10.0a4 with PR 23224 (bpo-14935@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14935}). Patch by Radislav
Chugunov.

@item 
gh-102613@footnote{https://github.com/python/cpython/issues/102613}: Improve performance of @ref{537,,pathlib.Path.glob()} when expanding
recursive wildcards (”@code{**}”) by merging adjacent wildcards and
de-duplicating results only when necessary.

@item 
gh-65772@footnote{https://github.com/python/cpython/issues/65772}: Remove unneeded comments and code in turtle.py.

@item 
gh-90208@footnote{https://github.com/python/cpython/issues/90208}: Fixed issue where @ref{537,,pathlib.Path.glob()} returned incomplete
results when it encountered a @ref{f3d,,PermissionError}. This method now
suppresses all @ref{2c0,,OSError} exceptions, except those raised from calling
@ref{53a,,is_dir()} on the top-level path.

@item 
gh-104144@footnote{https://github.com/python/cpython/issues/104144}: Optimize @ref{4d2,,asyncio.TaskGroup} when using
@ref{6a1,,asyncio.eager_task_factory()}. Skip scheduling a done callback if a
TaskGroup task completes eagerly.

@item 
gh-104144@footnote{https://github.com/python/cpython/issues/104144}: Optimize @ref{812,,asyncio.gather()} when using
@ref{6a1,,asyncio.eager_task_factory()} to complete eagerly if all fututres
completed eagerly. Avoid scheduling done callbacks for futures that
complete eagerly.

@item 
gh-104114@footnote{https://github.com/python/cpython/issues/104114}: Fix issue where @ref{537,,pathlib.Path.glob()} returns paths using
the case of non-wildcard segments for corresponding path segments, rather
than the real filesystem case.

@item 
gh-104104@footnote{https://github.com/python/cpython/issues/104104}: Improve performance of @ref{537,,pathlib.Path.glob()} by using
@ref{1a96,,re.IGNORECASE} to implement case-insensitive matching.

@item 
gh-104102@footnote{https://github.com/python/cpython/issues/104102}: Improve performance of @ref{537,,pathlib.Path.glob()} when
evaluating patterns that contain @code{'../'} segments.

@item 
gh-103822@footnote{https://github.com/python/cpython/issues/103822}: Update the return type of @code{weekday} to the newly added Day
attribute

@item 
gh-103629@footnote{https://github.com/python/cpython/issues/103629}: Update the @code{repr} of @ref{19a6,,typing.Unpack} according to
@geindex Python 향상 제안; PEP 692
PEP 692@footnote{https://peps.python.org/pep-0692/}.

@item 
gh-103963@footnote{https://github.com/python/cpython/issues/103963}: Make @ref{3c,,dis} display the names of the args for
@code{CALL_INTRINSIC_*}.

@item 
gh-104035@footnote{https://github.com/python/cpython/issues/104035}: Do not ignore user-defined @code{__getstate__} and
@code{__setstate__} methods for slotted frozen dataclasses.

@item 
gh-103987@footnote{https://github.com/python/cpython/issues/103987}: In @ref{94,,mmap}, fix several bugs that could lead to access to
memory-mapped files after they have been invalidated.

@item 
gh-103977@footnote{https://github.com/python/cpython/issues/103977}: Improve import time of @ref{af,,platform} module.

@item 
gh-88773@footnote{https://github.com/python/cpython/issues/88773}: Added @ref{1a97,,turtle.teleport()} to the @ref{107,,turtle} module to
move a turtle to a new point without tracing a line, visible or invisible.
Patch by Liam Gersten.

@item 
gh-103935@footnote{https://github.com/python/cpython/issues/103935}: Use @ref{175c,,io.open_code()} for files to be executed instead of
raw @ref{316,,open()}

@item 
gh-68968@footnote{https://github.com/python/cpython/issues/68968}: Fixed garbled output of @ref{74b,,assertEqual()}
when an input lacks final newline.

@item 
gh-100370@footnote{https://github.com/python/cpython/issues/100370}: Fix potential @ref{a81,,OverflowError} in
@ref{890,,sqlite3.Connection.blobopen()} for 32-bit builds. Patch by Erlend E.
Aasland.

@item 
gh-102628@footnote{https://github.com/python/cpython/issues/102628}: Substitute CTRL-D with CTRL-Z in @ref{d4,,sqlite3} CLI banner when
running on Windows.

@item 
gh-103636@footnote{https://github.com/python/cpython/issues/103636}: Module-level attributes @code{January} and @code{February} are
deprecated from @ref{15,,calendar}.

@item 
gh-103583@footnote{https://github.com/python/cpython/issues/103583}: Isolate @code{_multibytecodec} and codecs extension modules.
Patches by Erlend E. Aasland.

@item 
gh-103848@footnote{https://github.com/python/cpython/issues/103848}: Add checks to ensure that @code{[} bracketed @code{]} hosts found by
@ref{f39,,urllib.parse.urlsplit()} are of IPv6 or IPvFuture format.

@item 
gh-103872@footnote{https://github.com/python/cpython/issues/103872}: Update the bundled copy of pip to version 23.1.2.

@item 
gh-99944@footnote{https://github.com/python/cpython/issues/99944}: Make @ref{3c,,dis} display the value of oparg of
@code{KW_NAMES}.

@item 
gh-74940@footnote{https://github.com/python/cpython/issues/74940}: The C.UTF-8 locale is no longer converted to en_US.UTF-8,
enabling the use of UTF-8 encoding on systems which have no locales
installed.

@item 
gh-103861@footnote{https://github.com/python/cpython/issues/103861}: Fix @code{zipfile.Zipfile} creating invalid zip files when
@code{force_zip64} was used to add files to them. Patch by Carey Metcalfe.

@item 
gh-103857@footnote{https://github.com/python/cpython/issues/103857}: Deprecated @ref{351,,datetime.datetime.utcnow()} and
@ref{352,,datetime.datetime.utcfromtimestamp()}. (Patch by Paul Ganssle)

@item 
gh-103839@footnote{https://github.com/python/cpython/issues/103839}: Avoid compilation error due to tommath.h not being found when
building Tkinter against Tcl 8.7 built with bundled libtommath.

@item 
gh-103791@footnote{https://github.com/python/cpython/issues/103791}: @ref{1127,,contextlib.suppress} now supports suppressing
exceptions raised as part of an @ref{4d3,,ExceptionGroup}. If other exceptions
exist on the group, they are re-raised in a group that does not contain
the suppressed exceptions.

@item 
gh-90750@footnote{https://github.com/python/cpython/issues/90750}: Use @ref{bdf,,datetime.datetime.fromisocalendar()} in the
implementation of @ref{1951,,datetime.datetime.strptime()}, which should now
accept only valid ISO dates. (Patch by Paul Ganssle)

@item 
gh-103685@footnote{https://github.com/python/cpython/issues/103685}: Prepare @code{tkinter.Menu.index()} for Tk 8.7 so that it does
not raise @code{TclError: expected integer but got ""} when it should return
@code{None}.

@item 
gh-81403@footnote{https://github.com/python/cpython/issues/81403}: @ref{1a98,,urllib.request.CacheFTPHandler} no longer raises
@code{URLError} if a cached FTP instance is reused. ftplib’s endtransfer
method calls voidresp to drain the connection to handle FTP instance reuse
properly.

@item 
gh-103699@footnote{https://github.com/python/cpython/issues/103699}: Add @code{__orig_bases__} to non-generic TypedDicts, call-based
TypedDicts, and call-based NamedTuples. Other TypedDicts and NamedTuples
already had the attribute.

@item 
gh-103693@footnote{https://github.com/python/cpython/issues/103693}: Add convenience variable feature to @ref{aa,,pdb}

@item 
gh-92248@footnote{https://github.com/python/cpython/issues/92248}: Deprecate @code{type}, @code{choices}, and @code{metavar} parameters of
@code{argparse.BooleanOptionalAction}.

@item 
gh-89415@footnote{https://github.com/python/cpython/issues/89415}: Add @ref{d1,,socket} constants for source-specific multicast. Patch
by Reese Hyde.

@item 
gh-103673@footnote{https://github.com/python/cpython/issues/103673}: @ref{d2,,socketserver} gains @code{ForkingUnixStreamServer} and
@code{ForkingUnixDatagramServer} classes. Patch by Jay Berry.

@item 
gh-103636@footnote{https://github.com/python/cpython/issues/103636}: Added Enum for months and days in the calendar module.

@item 
gh-84976@footnote{https://github.com/python/cpython/issues/84976}: Create a new @code{Lib/_pydatetime.py} file that defines the Python
version of the @code{datetime} module, and make @code{datetime} import the
contents of the new library only if the C implementation is missing.
Currently, the full Python implementation is defined and then deleted if
the C implementation is not available, slowing down @code{import datetime}
unnecessarily.

@item 
gh-103596@footnote{https://github.com/python/cpython/issues/103596}: Attributes/methods are no longer shadowed by same-named enum
members, although they may be shadowed by enum.property’s.

@item 
gh-103584@footnote{https://github.com/python/cpython/issues/103584}: Updated @code{importlib.metadata} with changes from
@code{importlib_metadata} 5.2 through 6.5.0, including: Support
@code{installed-files.txt} for @code{Distribution.files} when present.
@code{PackageMetadata} now stipulates an additional @code{get} method allowing
for easy querying of metadata keys that may not be present.
@code{packages_distributions} now honors packages and modules with Python
modules that not @code{.py} sources (e.g. @code{.pyc}, @code{.so}). Expand protocol
for @code{PackageMetadata.get_all} to match the upstream implementation of
@code{email.message.Message.get_all} in python/typeshed#9620. Deprecated use
of @code{Distribution} without defining abstract methods. Deprecated
expectation that @code{PackageMetadata.__getitem__} will return @code{None} for
missing keys. In the future, it will raise a @code{KeyError}.

@item 
gh-103578@footnote{https://github.com/python/cpython/issues/103578}: Fixed a bug where @ref{aa,,pdb} crashes when reading source file
with different encoding by replacing @ref{73f,,io.open()} with
@ref{175c,,io.open_code()}. The new method would also call into the hook set by
@ref{1a99,,PyFile_SetOpenCodeHook()}.

@item 
gh-103556@footnote{https://github.com/python/cpython/issues/103556}: Now creating @ref{4e3,,inspect.Signature} objects with
positional-only parameter with a default followed by a
positional-or-keyword parameter without one is impossible.

@item 
gh-103559@footnote{https://github.com/python/cpython/issues/103559}: Update the bundled copy of pip to version 23.1.1.

@item 
gh-103548@footnote{https://github.com/python/cpython/issues/103548}: Improve performance of @ref{1a26,,pathlib.Path.absolute()} and
@ref{1a9a,,cwd()} by joining paths only when necessary. Also
improve performance of @ref{1a9b,,pathlib.PurePath.is_absolute()} on Posix by
skipping path parsing and normalization.

@item 
gh-103538@footnote{https://github.com/python/cpython/issues/103538}: Remove @code{_tkinter} module code guarded by definition of the
@code{TK_AQUA} macro which was only needed for Tk 8.4.7 or earlier and was
never actually defined by any build system or documented for manual use.

@item 
gh-103533@footnote{https://github.com/python/cpython/issues/103533}: Update @ref{2b,,cProfile} to use PEP 669 API

@item 
gh-103525@footnote{https://github.com/python/cpython/issues/103525}: Fix misleading exception message when mixed @code{str} and
@code{bytes} arguments are supplied to @ref{6cc,,pathlib.PurePath} and
@ref{266,,Path}.

@item 
gh-103489@footnote{https://github.com/python/cpython/issues/103489}: Add @ref{6df,,getconfig()} and
@ref{6e0,,setconfig()} to @ref{54c,,Connection} to
make configuration changes to a database connection. Patch by Erlend E.
Aasland.

@item 
gh-103365@footnote{https://github.com/python/cpython/issues/103365}: Set default Flag boundary to @code{STRICT} and fix bitwise
operations.

@item 
gh-103472@footnote{https://github.com/python/cpython/issues/103472}: Avoid a potential @ref{54e,,ResourceWarning} in
@ref{d34,,http.client.HTTPConnection} by closing the proxy / tunnel’s
CONNECT response explicitly.

@item 
gh-103462@footnote{https://github.com/python/cpython/issues/103462}: Fixed an issue with using
@ref{17cf,,writelines()} in @ref{b,,asyncio} to send very
large payloads that exceed the amount of data that can be written in one
call to @ref{fa6,,socket.socket.send()} or @ref{6a0,,socket.socket.sendmsg()},
resulting in the remaining buffer being left unwritten.

@item 
gh-103449@footnote{https://github.com/python/cpython/issues/103449}: Fix a bug in doc string generation in
@ref{4e1,,dataclasses.dataclass()}.

@item 
gh-103092@footnote{https://github.com/python/cpython/issues/103092}: Isolate @code{_collections} (apply 
@geindex Python 향상 제안; PEP 687
PEP 687@footnote{https://peps.python.org/pep-0687/}). Patch by
Erlend E. Aasland.

@item 
gh-103357@footnote{https://github.com/python/cpython/issues/103357}: Added support for @ref{169c,,logging.Formatter} @code{defaults}
parameter to @ref{13b5,,logging.config.dictConfig()} and
@ref{d47,,logging.config.fileConfig()}. Patch by Bar Harel.

@item 
gh-103092@footnote{https://github.com/python/cpython/issues/103092}: Adapt the @ref{11c,,winreg} extension module to 
@geindex Python 향상 제안; PEP 687
PEP 687@footnote{https://peps.python.org/pep-0687/}.

@item 
gh-74690@footnote{https://github.com/python/cpython/issues/74690}: The performance of @ref{2ad,,isinstance()} checks against
@ref{673,,runtime-checkable protocols} has been
considerably improved for protocols that only have a few members. To
achieve this improvement, several internal implementation details of the
@ref{10a,,typing} module have been refactored, including
@code{typing._ProtocolMeta.__instancecheck__},
@code{typing._is_callable_members_only}, and @code{typing._get_protocol_attrs}.
Patches by Alex Waygood.

@item 
gh-74690@footnote{https://github.com/python/cpython/issues/74690}: The members of a runtime-checkable protocol are now considered
“frozen” at runtime as soon as the class has been created. See
@ref{6f7,,“What’s new in Python 3.12”} for more
details.

@item 
gh-103256@footnote{https://github.com/python/cpython/issues/103256}: Fixed a bug that caused @ref{6e,,hmac} to raise an exception when
the requested hash algorithm was not available in OpenSSL despite being
available separately as part of @code{hashlib} itself.  It now falls back
properly to the built-in. This could happen when, for example, your
OpenSSL does not include SHA3 support and you want to compute
@code{hmac.digest(b'K', b'M', 'sha3_256')}.

@item 
gh-102778@footnote{https://github.com/python/cpython/issues/102778}: Support @code{sys.last_exc} in @ref{77,,idlelib}.

@item 
gh-103285@footnote{https://github.com/python/cpython/issues/103285}: Improve performance of @ref{bca,,ast.get_source_segment()}.

@item 
gh-103225@footnote{https://github.com/python/cpython/issues/103225}: Fix a bug in @ref{aa,,pdb} when displaying line numbers of
module-level source code.

@item 
gh-103092@footnote{https://github.com/python/cpython/issues/103092}: Adapt the @ref{97,,msvcrt} extension module to 
@geindex Python 향상 제안; PEP 687
PEP 687@footnote{https://peps.python.org/pep-0687/}.

@item 
gh-103092@footnote{https://github.com/python/cpython/issues/103092}: Adapt the @ref{11d,,winsound} extension module to 
@geindex Python 향상 제안; PEP 687
PEP 687@footnote{https://peps.python.org/pep-0687/}.

@item 
gh-93910@footnote{https://github.com/python/cpython/issues/93910}: Remove deprecation of enum @code{member.member} access.

@item 
gh-102978@footnote{https://github.com/python/cpython/issues/102978}: Fixes @ref{1091,,unittest.mock.patch()} not enforcing function
signatures for methods decorated with @code{@@classmethod} or
@code{@@staticmethod} when patch is called with @code{autospec=True}.

@item 
gh-103092@footnote{https://github.com/python/cpython/issues/103092}: Isolate @code{_socket} (apply 
@geindex Python 향상 제안; PEP 687
PEP 687@footnote{https://peps.python.org/pep-0687/}). Patch by Erlend E.
Aasland.

@item 
gh-100479@footnote{https://github.com/python/cpython/issues/100479}: Add @ref{6cd,,pathlib.PurePath.with_segments()}, which creates a
path object from arguments. This method is called whenever a derivative
path is created, such as from @ref{1a9c,,pathlib.PurePath.parent}. Subclasses
may override this method to share information between path objects.

@item 
gh-103220@footnote{https://github.com/python/cpython/issues/103220}: Fix issue where @ref{19a9,,os.path.join()} added a slash when joining
onto an incomplete UNC drive with a trailing slash on Windows.

@item 
gh-103204@footnote{https://github.com/python/cpython/issues/103204}: Fixes @ref{76,,http.server} accepting HTTP requests with HTTP
version numbers preceded by ‘+’, or ‘-’, or with digit-separating ‘_’
characters.  The length of the version numbers is also constrained.

@item 
gh-75586@footnote{https://github.com/python/cpython/issues/75586}: Fix various Windows-specific issues with @code{shutil.which}.

@item 
gh-103193@footnote{https://github.com/python/cpython/issues/103193}: Improve performance of @ref{6bb,,inspect.getattr_static()}. Patch by
Alex Waygood.

@item 
gh-103176@footnote{https://github.com/python/cpython/issues/103176}: @ref{6e8,,sys._current_exceptions()} now returns a mapping from
thread-id to an exception instance, rather than to a @code{(typ, exc, tb)}
tuple.

@item 
gh-103143@footnote{https://github.com/python/cpython/issues/103143}: Polish the help messages and docstrings of @ref{aa,,pdb}.

@item 
gh-103015@footnote{https://github.com/python/cpython/issues/103015}: Add `entrypoint' keyword-only parameter to
@ref{6de,,sqlite3.Connection.load_extension()}, for overriding the SQLite
extension entry point. Patch by Erlend E. Aasland.

@item 
gh-103000@footnote{https://github.com/python/cpython/issues/103000}: Improve performance of @ref{1a9d,,dataclasses.astuple()} and
@ref{1a95,,dataclasses.asdict()} in cases where the contents are common Python
types.

@item 
gh-102953@footnote{https://github.com/python/cpython/issues/102953}: The extraction methods in @ref{e4,,tarfile}, and
@ref{695,,shutil.unpack_archive()}, have a new a `filter' argument that allows
limiting tar features than may be surprising or dangerous, such as
creating files outside the destination directory. See
@ref{696,,Extraction filters} for details.

@item 
gh-97696@footnote{https://github.com/python/cpython/issues/97696}: Implemented an eager task factory in asyncio. When used as a
task factory on an event loop, it performs eager execution of coroutines.
Coroutines that are able to complete synchronously (e.g. return or raise
without blocking) are returned immediately as a finished task, and the
task is never scheduled to the event loop. If the coroutine blocks, the
(pending) task is scheduled and returned.

@item 
gh-81079@footnote{https://github.com/python/cpython/issues/81079}: Add `case_sensitive' keyword-only argument to
@ref{537,,pathlib.Path.glob()} and @ref{538,,rglob()}.

@item 
gh-101819@footnote{https://github.com/python/cpython/issues/101819}: Isolate the @ref{83,,io} extension module by applying 
@geindex Python 향상 제안; PEP 687
PEP 687@footnote{https://peps.python.org/pep-0687/}.
Patch by Kumar Aditya, Victor Stinner, and Erlend E. Aasland.

@item 
gh-91896@footnote{https://github.com/python/cpython/issues/91896}: Deprecate @ref{342,,collections.abc.ByteString}

@item 
gh-101362@footnote{https://github.com/python/cpython/issues/101362}: Speed up @ref{266,,pathlib.Path} construction by omitting the
path anchor from the internal list of path parts.

@item 
gh-102114@footnote{https://github.com/python/cpython/issues/102114}: Functions in the @ref{3c,,dis} module that accept a source code
string as argument now print a more concise traceback when the string
contains a syntax or indentation error.

@item 
gh-62432@footnote{https://github.com/python/cpython/issues/62432}: The @ref{10c,,unittest} runner will now exit with status code 5 if
no tests were run. It is common for test runner misconfiguration to fail
to find any tests, this should be an error.

@item 
gh-78079@footnote{https://github.com/python/cpython/issues/78079}: Fix incorrect normalization of UNC device path roots, and
partial UNC share path roots, in @ref{6cc,,pathlib.PurePath}. Pathlib no
longer appends a trailing slash to such paths.

@item 
gh-85984@footnote{https://github.com/python/cpython/issues/85984}: Add @ref{1a42,,tty.cfmakeraw()} and @ref{19f6,,tty.cfmakecbreak()} to
@ref{106,,tty} and modernize, the behavior of @ref{1a41,,tty.setraw()} and
@ref{19f5,,tty.setcbreak()} to use POSIX.1-2017 Chapter 11 “General Terminal
Interface” flag masks by default.

@item 
gh-101688@footnote{https://github.com/python/cpython/issues/101688}: Implement @ref{6f4,,types.get_original_bases()} to provide further
introspection for types.

@item 
gh-101640@footnote{https://github.com/python/cpython/issues/101640}: @ref{1bd,,argparse.ArgumentParser} now catches errors when
writing messages, such as when @ref{b33,,sys.stderr} is @code{None}. Patch by
Oleg Iarygin.

@item 
gh-83861@footnote{https://github.com/python/cpython/issues/83861}: Fix datetime.astimezone method return value when invoked on a
naive datetime instance that represents local time falling in a timezone
transition gap. PEP 495 requires that instances with fold=1 produce
earlier times than those with fold=0 in this case.

@item 
gh-89550@footnote{https://github.com/python/cpython/issues/89550}: Decrease execution time of some @ref{6b,,gzip} file writes by 15%
by adding more appropriate buffering.

@item 
gh-95299@footnote{https://github.com/python/cpython/issues/95299}: Remove the bundled setuptools wheel from @code{ensurepip}, and stop
installing setuptools in environments created by @code{venv}.

@item 
gh-99353@footnote{https://github.com/python/cpython/issues/99353}: Respect the @ref{d34,,http.client.HTTPConnection} @code{.debuglevel}
flag in @code{urllib.request.AbstractHTTPHandler} when its constructor
parameter @code{debuglevel} is not set. And do the same for @code{*HTTPS*}.

@item 
gh-98040@footnote{https://github.com/python/cpython/issues/98040}: Remove the long-deprecated @code{imp} module.

@item 
gh-97850@footnote{https://github.com/python/cpython/issues/97850}: Deprecate @code{pkgutil.find_loader()} and
@code{pkgutil.get_loader()} in favor of @ref{5ae,,importlib.util.find_spec()}.

@item 
gh-94473@footnote{https://github.com/python/cpython/issues/94473}: Flatten arguments in @code{tkinter.Canvas.coords()}. It now
accepts not only @code{x1, y1, x2, y2, ...} and @code{[x1, y1, x2, y2, ...]},
but also @code{(x1, y1), (x2, y2), ...} and @code{[(x1, y1), (x2, y2), ...]}.

@item 
gh-98040@footnote{https://github.com/python/cpython/issues/98040}: Remove more deprecated importlib APIs: @code{find_loader()},
@code{find_module()}, @code{importlib.abc.Finder}, @code{pkgutil.ImpImporter},
@code{pkgutil.ImpLoader}.

@item 
gh-96522@footnote{https://github.com/python/cpython/issues/96522}: Fix potential deadlock in pty.spawn()

@item 
gh-96534@footnote{https://github.com/python/cpython/issues/96534}: Support divert(4) added in FreeBSD 14.

@item 
gh-87474@footnote{https://github.com/python/cpython/issues/87474}: Fix potential file descriptor leaks in
@ref{4b8,,subprocess.Popen}.

@item 
gh-94906@footnote{https://github.com/python/cpython/issues/94906}: Support multiple steps in @ref{6bf,,math.nextafter()}. Patch by
Shantanu Jain and Matthias Gorgens.

@item 
gh-51574@footnote{https://github.com/python/cpython/issues/51574}: Make @ref{52d,,tempfile.mkdtemp()} return absolute paths when its
`dir' parameter is relative.

@item 
gh-94518@footnote{https://github.com/python/cpython/issues/94518}: Convert private @code{_posixsubprocess.fork_exec()} to use
Argument Clinic.

@item 
gh-92184@footnote{https://github.com/python/cpython/issues/92184}: When creating zip files using @ref{137,,zipfile}, @code{os.altsep}, if
not @code{None}, will always be treated as a path separator even when it is
not @code{/}. Patch by Carey Metcalfe.

@item 
bpo-46797@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46797}: Deprecation warnings are now emitted for @code{ast.Num},
@code{ast.Bytes}, @code{ast.Str}, @code{ast.NameConstant} and
@code{ast.Ellipsis}. These have been documented as deprecated since
Python 3.8, and will be removed in Python 3.14.

@item 
bpo-44844@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44844}: Enables @ref{11b,,webbrowser} to detect and launch Microsoft Edge
browser.

@item 
bpo-45606@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45606}: Fixed the bug in @ref{537,,pathlib.Path.glob()} – previously a
dangling symlink would not be found by this method when the pattern is an
exact match, but would be found when the pattern contains a wildcard or
the recursive wildcard (@code{**}). With this change, a dangling symlink will
be found in both cases.

@item 
bpo-23041@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23041}: Add @ref{6ac,,QUOTE_STRINGS} and @ref{6ab,,QUOTE_NOTNULL}
to the suite of @ref{2d,,csv} module quoting styles.

@item 
bpo-24964@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24964}: Added
@ref{1a73,,http.client.HTTPConnection.get_proxy_response_headers()} that
provides access to the HTTP headers on a proxy server response to the
@code{CONNECT} request.

@item 
bpo-17258@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17258}: @ref{98,,multiprocessing} now supports stronger HMAC algorithms
for inter-process connection authentication rather than only HMAC-MD5.

@item 
bpo-39744@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39744}: Make @ref{1a9e,,asyncio.subprocess.Process.communicate()} close the
subprocess’s stdin even when called with @code{input=None}.

@item 
bpo-22708@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22708}: http.client CONNECT method tunnel improvements: Use HTTP 1.1
protocol; send a matching Host: header with CONNECT, if one is not
provided; convert IDN domain names to Punycode. Patch by Michael Handler.
@end itemize

@node Documentation<21>,Tests<21>,Library<67>,Python 3 12 0 beta 1
@anchor{whatsnew/changelog id293}@anchor{1a9f}
@subsubsection Documentation



@itemize -

@item 
gh-67056@footnote{https://github.com/python/cpython/issues/67056}: Document that the effect of registering or unregistering an
@ref{d,,atexit} cleanup function from within a registered cleanup function
is undefined.

@item 
gh-103629@footnote{https://github.com/python/cpython/issues/103629}: Mention the new way of typing @code{**kwargs} with @code{Unpack} and
@code{TypedDict} introduced in 
@geindex Python 향상 제안; PEP 692
PEP 692@footnote{https://peps.python.org/pep-0692/}.

@item 
gh-48241@footnote{https://github.com/python/cpython/issues/48241}: Clarifying documentation about the url parameter to
urllib.request.urlopen and urllib.request.Request needing to be encoded
properly.

@item 
gh-86094@footnote{https://github.com/python/cpython/issues/86094}: Add support for Unicode Path Extra Field in ZipFile. Patch by
Yeojin Kim and Andrea Giudiceandrea

@item 
gh-99202@footnote{https://github.com/python/cpython/issues/99202}: Fix extension type from documentation for compiling in C++20
mode
@end itemize

@node Tests<21>,Build<24>,Documentation<21>,Python 3 12 0 beta 1
@anchor{whatsnew/changelog id294}@anchor{1aa0}
@subsubsection Tests



@itemize -

@item 
gh-104494@footnote{https://github.com/python/cpython/issues/104494}: Update @code{test_pack_configure_in} and
@code{test_place_configure_in} for changes to error message formatting in Tk
8.7.

@item 
gh-104461@footnote{https://github.com/python/cpython/issues/104461}: Run test_configure_screen on X11 only, since the @code{DISPLAY}
environment variable and @code{-screen} option for toplevels are not useful
on Tk for Win32 or Aqua.

@item 
gh-86275@footnote{https://github.com/python/cpython/issues/86275}: Added property-based tests to the @ref{13a,,zoneinfo} tests, along
with stubs for the @code{hypothesis} interface. (Patch by Paul Ganssle)

@item 
gh-103329@footnote{https://github.com/python/cpython/issues/103329}: Regression tests for the behaviour of
@code{unittest.mock.PropertyMock} were added.

@item 
gh-102795@footnote{https://github.com/python/cpython/issues/102795}: fix use of poll in test_epoll’s test_control_and_wait

@item 
gh-75729@footnote{https://github.com/python/cpython/issues/75729}: Fix the @ref{31b,,os.spawn*} tests failing on Windows
when the working directory or interpreter path contains spaces.
@end itemize

@node Build<24>,Windows<22>,Tests<21>,Python 3 12 0 beta 1
@anchor{whatsnew/changelog id295}@anchor{1aa1}
@subsubsection Build



@itemize -

@item 
gh-101282@footnote{https://github.com/python/cpython/issues/101282}: BOLT optimization is now applied to the libpython shared
library if building a shared library. BOLT instrumentation and application
settings can now be influenced via the @code{BOLT_INSTRUMENT_FLAGS} and
@code{BOLT_APPLY_FLAGS} configure variables.

@item 
gh-99017@footnote{https://github.com/python/cpython/issues/99017}: @code{PYTHON_FOR_REGEN} now require Python 3.10 or newer.

@item 
gh-104490@footnote{https://github.com/python/cpython/issues/104490}: Define @code{.PHONY} / virtual make targets consistently and
properly.

@item 
gh-104106@footnote{https://github.com/python/cpython/issues/104106}: Add gcc fallback of mkfifoat/mknodat for macOS. Patch by
Donghee Na.

@item 
gh-103532@footnote{https://github.com/python/cpython/issues/103532}: The @code{TKINTER_PROTECT_LOADTK} macro is no longer defined or
used in the @code{_tkinter} module.  It was previously only defined when
building against Tk 8.4.13 and older, but Tk older than 8.5.12 has been
unsupported since gh-91152@footnote{https://github.com/python/cpython/issues/91152}.

@item 
gh-99069@footnote{https://github.com/python/cpython/issues/99069}: Extended workaround defining @code{static_assert} when missing from
the libc headers to all clang and gcc builds. In particular, this fixes
building on macOS <= 10.10.

@item 
gh-100220@footnote{https://github.com/python/cpython/issues/100220}: Changed the default value of the @code{SHELL} Makefile variable
from @code{/bin/sh} to @code{/bin/sh -e} to ensure that complex recipes
correctly fail after an error. Previously, @code{make install} could fail to
install some files and yet return a successful result.

@item 
gh-90656@footnote{https://github.com/python/cpython/issues/90656}: Add platform triplets for 64-bit LoongArch:


@itemize *

@item 
loongarch64-linux-gnusf

@item 
loongarch64-linux-gnuf32

@item 
loongarch64-linux-gnu
@end itemize

Patch by Zhang Na.
@end itemize

@node Windows<22>,macOS<15>,Build<24>,Python 3 12 0 beta 1
@anchor{whatsnew/changelog id296}@anchor{1aa2}
@subsubsection Windows



@itemize -

@item 
gh-104623@footnote{https://github.com/python/cpython/issues/104623}: Update Windows installer to use SQLite 3.42.0.

@item 
gh-82814@footnote{https://github.com/python/cpython/issues/82814}: Fix a potential @code{[Errno 13] Permission denied} when using
@ref{1333,,shutil.copystat()} within Windows Subsystem for Linux (WSL) on a
mounted filesystem by adding @code{errno.EACCES} to the list of ignored
errors within the internal implementation.

@item 
gh-103088@footnote{https://github.com/python/cpython/issues/103088}: Fix virtual environment @code{activate} script having
incorrect line endings for Cygwin.

@item 
gh-103088@footnote{https://github.com/python/cpython/issues/103088}: Fixes venvs not working in bash on Windows across different
disks

@item 
gh-102997@footnote{https://github.com/python/cpython/issues/102997}: Update Windows installer to use SQLite 3.41.2.

@item 
gh-88013@footnote{https://github.com/python/cpython/issues/88013}: Fixed a bug where @ref{198,,TypeError} was raised when calling
@code{ntpath.realpath()} with a bytes parameter in some cases.
@end itemize

@node macOS<15>,IDLE<14>,Windows<22>,Python 3 12 0 beta 1
@anchor{whatsnew/changelog id297}@anchor{1aa3}
@subsubsection macOS



@itemize -

@item 
gh-99834@footnote{https://github.com/python/cpython/issues/99834}: Update macOS installer to Tcl/Tk 8.6.13.

@item 
gh-104623@footnote{https://github.com/python/cpython/issues/104623}: Update macOS installer to SQLite 3.42.0.

@item 
gh-103545@footnote{https://github.com/python/cpython/issues/103545}: Add @code{os.PRIO_DARWIN_THREAD}, @code{os.PRIO_DARWIN_PROCESS},
@code{os.PRIO_DARWIN_BG} and @code{os.PRIO_DARWIN_NONUI}. These can be used with
@code{os.setpriority} to run the process at a lower priority and make use of
the efficiency cores on Apple Silicon systems.

@item 
gh-104180@footnote{https://github.com/python/cpython/issues/104180}: Support reading SOCKS proxy configuration from macOS System
Configuration. Patch by Sam Schott.

@item 
gh-60436@footnote{https://github.com/python/cpython/issues/60436}: update curses textbox to additionally handle backspace using the
@code{curses.ascii.DEL} key press.

@item 
gh-102997@footnote{https://github.com/python/cpython/issues/102997}: Update macOS installer to SQLite 3.41.2.
@end itemize

@node IDLE<14>,Tools/Demos<20>,macOS<15>,Python 3 12 0 beta 1
@anchor{whatsnew/changelog id298}@anchor{1aa4}
@subsubsection IDLE



@itemize -

@item 
gh-104499@footnote{https://github.com/python/cpython/issues/104499}: Fix completions for Tk Aqua 8.7 (currently blank).

@item 
gh-104496@footnote{https://github.com/python/cpython/issues/104496}: About prints both tcl and tk versions if different (expected
someday).

@item 
gh-88496@footnote{https://github.com/python/cpython/issues/88496}: Fix IDLE test hang on macOS.
@end itemize

@node Tools/Demos<20>,C API<24>,IDLE<14>,Python 3 12 0 beta 1
@anchor{whatsnew/changelog id299}@anchor{1aa5}
@subsubsection Tools/Demos



@itemize -

@item 
gh-104389@footnote{https://github.com/python/cpython/issues/104389}: Argument Clinic C converters now accept the @code{unused} keyword,
for wrapping a parameter with @ref{1a8a,,Py_UNUSED}. Patch by Erlend E.
Aasland.
@end itemize

@node C API<24>,,Tools/Demos<20>,Python 3 12 0 beta 1
@anchor{whatsnew/changelog id300}@anchor{1aa6}
@subsubsection C API



@itemize -

@item 
gh-101291@footnote{https://github.com/python/cpython/issues/101291}: Added unstable C API for extracting the value of “compact”
integers: @ref{7a5,,PyUnstable_Long_IsCompact()} and
@ref{7a6,,PyUnstable_Long_CompactValue()}.

@item 
gh-104109@footnote{https://github.com/python/cpython/issues/104109}: We’ve added @code{Py_NewInterpreterFromConfig()} and
@code{PyInterpreterConfig} to the public C-API (but not the stable ABI; not
yet at least).  The new function may be used to create a new interpreter
with various features configured.  The function was added to support PEP
684 (per-interpreter GIL).

@item 
gh-103968@footnote{https://github.com/python/cpython/issues/103968}: @ref{79c,,PyType_FromSpec()} and its variants now allow creating
classes whose metaclass overrides @ref{79e,,tp_new}. The
@code{tp_new} is ignored. This behavior is deprecated and will be disallowed
in 3.14+. The new @ref{771,,PyType_FromMetaclass()} already disallows it.

@item 
gh-103743@footnote{https://github.com/python/cpython/issues/103743}: Add @ref{1aa7,,PyUnstable_Object_GC_NewWithExtraData()} function
that can be used to allocate additional memory after an object for data
not managed by Python.

@item 
gh-103295@footnote{https://github.com/python/cpython/issues/103295}: Introduced @ref{1aa8,,PyUnstable_WritePerfMapEntry()},
@ref{1aa9,,PyUnstable_PerfMapState_Init()} and
@ref{1aaa,,PyUnstable_PerfMapState_Fini()}. These allow extension modules (JIT
compilers in particular) to write to perf-map files in a thread safe
manner. The @ref{1aab,,Python support for the Linux perf profiler} also uses these APIs to write
entries in the perf-map file.

@item 
gh-103509@footnote{https://github.com/python/cpython/issues/103509}: Added C API for extending types whose instance memory layout is
opaque: @ref{769,,PyType_Spec.basicsize} can now be zero or negative,
@ref{76a,,PyObject_GetTypeData()} can be used to get subclass-specific data,
and @ref{76c,,Py_TPFLAGS_ITEMS_AT_END} can be used to safely extend
variable-size objects. See 
@geindex Python 향상 제안; PEP 697
PEP 697@footnote{https://peps.python.org/pep-0697/} for details.

@item 
gh-103091@footnote{https://github.com/python/cpython/issues/103091}: Add a new C-API function to eagerly assign a version tag to a
PyTypeObject: @code{PyUnstable_Type_AssignVersionTag()}.

@item 
gh-101408@footnote{https://github.com/python/cpython/issues/101408}: @ref{1aac,,PyObject_GC_Resize} should calculate preheader size
if needed. Patch by Donghee Na.

@item 
gh-98836@footnote{https://github.com/python/cpython/issues/98836}: Add support of more formatting options (left aligning, octals,
uppercase hexadecimals, @code{intmax_t}, @code{ptrdiff_t},
@code{wchar_t} C strings, variable width and precision) in
@ref{629,,PyUnicode_FromFormat()} and @ref{793,,PyUnicode_FromFormatV()}.

@item 
gh-96803@footnote{https://github.com/python/cpython/issues/96803}: Add unstable C-API functions to get the code object, lasti and
line number from the internal @code{_PyInterpreterFrame} in the limited API.
The functions are:


@itemize *

@item 
@code{PyCodeObject * PyUnstable_InterpreterFrame_GetCode(struct _PyInterpreterFrame *frame)}

@item 
@code{int PyUnstable_InterpreterFrame_GetLasti(struct _PyInterpreterFrame *frame)}

@item 
@code{int PyUnstable_InterpreterFrame_GetLine(struct _PyInterpreterFrame *frame)}
@end itemize
@end itemize

@node Python 3 12 0 alpha 7,Python 3 12 0 alpha 6,Python 3 12 0 beta 1,Changelog
@anchor{whatsnew/changelog python-3-12-0-alpha-7}@anchor{1aad}
@subsection Python 3.12.0 alpha 7


`Release date: 2023-04-04'

@menu
* Core and Builtins: Core and Builtins<62>. 
* Library: Library<68>. 
* Core and Builtins: Core and Builtins<63>. 
* Build: Build<25>. 
* Core and Builtins: Core and Builtins<64>. 
* Library: Library<69>. 
* Documentation: Documentation<22>. 
* Tests: Tests<22>. 
* Build: Build<26>. 
* Windows: Windows<23>. 
* Tools/Demos: Tools/Demos<21>. 
* C API: C API<25>. 

@end menu

@node Core and Builtins<62>,Library<68>,,Python 3 12 0 alpha 7
@anchor{whatsnew/changelog id301}@anchor{1aae}
@subsubsection Core and Builtins



@itemize -

@item 
gh-102192@footnote{https://github.com/python/cpython/issues/102192}: Deprecated @code{_PyErr_ChainExceptions} in favour of
@code{_PyErr_ChainExceptions1}.

@item 
gh-89987@footnote{https://github.com/python/cpython/issues/89987}: Reduce the number of inline @ref{907,,CACHE} entries for
@code{BINARY_SUBSCR}.

@item 
gh-102859@footnote{https://github.com/python/cpython/issues/102859}: Removed @code{JUMP_IF_FALSE_OR_POP} and
@code{JUMP_IF_TRUE_OR_POP} instructions.

@item 
gh-101975@footnote{https://github.com/python/cpython/issues/101975}: Fixed @code{stacktop} value on tracing entries to avoid corruption
on garbage collection.

@item 
gh-102778@footnote{https://github.com/python/cpython/issues/102778}: Add @ref{6e4,,sys.last_exc} and deprecate @ref{6e5,,sys.last_type},
@ref{6e6,,sys.last_value} and @ref{6e7,,sys.last_traceback}, which hold the same
information in its legacy form.

@item 
gh-100982@footnote{https://github.com/python/cpython/issues/100982}: Replace all occurrences of @code{COMPARE_AND_BRANCH} with
@ref{b61,,COMPARE_OP}.

@item 
gh-102701@footnote{https://github.com/python/cpython/issues/102701}: Fix overflow when creating very large dict.

@item 
gh-102755@footnote{https://github.com/python/cpython/issues/102755}: Add @ref{435,,PyErr_DisplayException()} which takes just an
exception instance, to replace the legacy @code{PyErr_Display()} which
takes the @code{(typ, exc, tb)} triplet.

@item 
gh-102594@footnote{https://github.com/python/cpython/issues/102594}: Add note to exception raised in @code{PyErr_SetObject} when
normalization fails.

@item 
gh-90997@footnote{https://github.com/python/cpython/issues/90997}: Shrink the number of inline @ref{907,,CACHE} entries used by
@ref{1a5a,,LOAD_GLOBAL}.
@end itemize

@node Library<68>,Core and Builtins<63>,Core and Builtins<62>,Python 3 12 0 alpha 7
@anchor{whatsnew/changelog id302}@anchor{1aaf}
@subsubsection Library



@itemize -

@item 
gh-102491@footnote{https://github.com/python/cpython/issues/102491}: Improve import time of @code{platform} by removing IronPython
version parsing. The IronPython version parsing was not functional (see
@indicateurl{https://github.com/IronLanguages/ironpython3/issues/1667}).
@end itemize

@node Core and Builtins<63>,Build<25>,Library<68>,Python 3 12 0 alpha 7
@anchor{whatsnew/changelog id303}@anchor{1ab0}
@subsubsection Core and Builtins



@itemize -

@item 
gh-101291@footnote{https://github.com/python/cpython/issues/101291}: Rearrage bits in first field (after header) of PyLongObject. *
Bits 0 and 1: 1 - sign. I.e. 0 for positive numbers, 1 for zero and 2 for
negative numbers. * Bit 2 reserved (probably for the immortal bit) * Bits
3+ the unsigned size.

This makes a few operations slightly more efficient, and will enable a
more compact and faster 2s-complement representation of most ints in
future.

@item 
gh-102397@footnote{https://github.com/python/cpython/issues/102397}: Fix segfault from race condition in signal handling during
garbage collection. Patch by Kumar Aditya.

@item 
gh-102406@footnote{https://github.com/python/cpython/issues/102406}: @ref{1c,,codecs} encoding/decoding errors now get the context
information (which operation and which codecs) attached as 
@geindex Python 향상 제안; PEP 678
PEP 678@footnote{https://peps.python.org/pep-0678/}
notes instead of through chaining a new instance of the exception.

@item 
gh-102281@footnote{https://github.com/python/cpython/issues/102281}: Fix potential nullptr dereference and use of uninitialized
memory in fileutils. Patch by Max Bachmann.

@item 
gh-102300@footnote{https://github.com/python/cpython/issues/102300}: Reuse operands with refcount of 1 in float specializations of
BINARY_OP.

@item 
gh-102213@footnote{https://github.com/python/cpython/issues/102213}: Fix performance loss when accessing an object’s attributes with
@code{__getattr__}  defined.

@item 
gh-102255@footnote{https://github.com/python/cpython/issues/102255}: Improve build support for the Xbox. Patch by Max Bachmann.
@end itemize

@node Build<25>,Core and Builtins<64>,Core and Builtins<63>,Python 3 12 0 alpha 7
@anchor{whatsnew/changelog id304}@anchor{1ab1}
@subsubsection Build



@itemize -

@item 
gh-102027@footnote{https://github.com/python/cpython/issues/102027}: Fix SSE2 and SSE3 detection in @code{_blake2} internal module.
Patch by Max Bachmann.
@end itemize

@node Core and Builtins<64>,Library<69>,Build<25>,Python 3 12 0 alpha 7
@anchor{whatsnew/changelog id305}@anchor{1ab2}
@subsubsection Core and Builtins



@itemize -

@item 
gh-101865@footnote{https://github.com/python/cpython/issues/101865}: Deprecate @code{co_lnotab} in code objects, schedule it for
removal in Python 3.14
@end itemize

@node Library<69>,Documentation<22>,Core and Builtins<64>,Python 3 12 0 alpha 7
@anchor{whatsnew/changelog id306}@anchor{1ab3}
@subsubsection Library



@itemize -

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Adapt @code{_pickle} to 
@geindex Python 향상 제안; PEP 687
PEP 687@footnote{https://peps.python.org/pep-0687/}. Patch by Mohamed Koubaa
and Erlend Aasland.

@item 
gh-103085@footnote{https://github.com/python/cpython/issues/103085}: Pure python @ref{329,,locale.getencoding()} will not warn
deprecation.

@item 
gh-103068@footnote{https://github.com/python/cpython/issues/103068}: It’s no longer possible to register conditional breakpoints in
@ref{273,,Pdb} that raise @ref{18e,,SyntaxError}. Patch by Tian Gao.

@item 
gh-102549@footnote{https://github.com/python/cpython/issues/102549}: Don’t ignore exceptions in member type creation.

@item 
gh-103056@footnote{https://github.com/python/cpython/issues/103056}: Ensure final @code{_generate_next_value_} is a @code{staticmethod}.

@item 
gh-103046@footnote{https://github.com/python/cpython/issues/103046}: Display current line label correctly in @ref{3c,,dis} when
@code{show_caches} is False and @code{lasti} points to a CACHE entry.

@item 
gh-102433@footnote{https://github.com/python/cpython/issues/102433}: @ref{2ad,,isinstance()} checks against @ref{673,,runtime-checkable protocols} now use
@ref{6bb,,inspect.getattr_static()} rather than @ref{6f8,,hasattr()} to lookup
whether attributes exist. This means that descriptors and
@ref{6f9,,__getattr__()} methods are no longer unexpectedly evaluated
during @code{isinstance()} checks against runtime-checkable protocols.
However, it may also mean that some objects which used to be considered
instances of a runtime-checkable protocol may no longer be considered
instances of that protocol on Python 3.12+, and vice versa. Most users are
unlikely to be affected by this change. Patch by Alex Waygood.

@item 
gh-103023@footnote{https://github.com/python/cpython/issues/103023}: It’s no longer possible to register expressions to display in
@ref{273,,Pdb} that raise @ref{18e,,SyntaxError}. Patch by Tian Gao.

@item 
gh-102947@footnote{https://github.com/python/cpython/issues/102947}: Improve traceback when @ref{1936,,dataclasses.fields()} is called on
a non-dataclass. Patch by Alex Waygood

@item 
gh-102780@footnote{https://github.com/python/cpython/issues/102780}: The @ref{1a40,,asyncio.Timeout} context manager now works reliably
even when performing cleanup due to task cancellation.  Previously it
could raise a @ref{4d5,,CancelledError} instead of an
@ref{1ab4,,TimeoutError} in such cases.

@item 
gh-102871@footnote{https://github.com/python/cpython/issues/102871}: Remove support for obsolete browsers from @ref{11b,,webbrowser}.
Removed browsers include Grail, Mosaic, Netscape, Galeon, Skipstone,
Iceape, Firebird, and Firefox versions 35 and below.

@item 
gh-102839@footnote{https://github.com/python/cpython/issues/102839}: Improve performance of @ref{16c5,,math.log()} arguments handling by
removing the argument clinic.

@item 
gh-102828@footnote{https://github.com/python/cpython/issues/102828}: Add the @code{onexc} arg to @ref{356,,shutil.rmtree()}, which is like
@code{onerror} but expects an exception instance rather than an exc_info
tuple. Deprecate @code{onerror}.

@item 
gh-88965@footnote{https://github.com/python/cpython/issues/88965}: typing: Fix a bug relating to substitution in custom classes
generic over a @ref{488,,ParamSpec}. Previously, if the
@code{ParamSpec} was substituted with a parameters list that itself contained
a @ref{487,,TypeVar}, the @code{TypeVar} in the parameters list could
not be subsequently substituted. This is now fixed.

Patch by Nikita Sobolev.

@item 
gh-76846@footnote{https://github.com/python/cpython/issues/76846}: Fix issue where @code{__new__()} and @code{__init__()} methods of
@ref{6cc,,pathlib.PurePath} and @ref{266,,Path} subclasses were not
called in some circumstances.

@item 
gh-78530@footnote{https://github.com/python/cpython/issues/78530}: @ref{6a6,,asyncio.wait()} now accepts generators yielding tasks.
Patch by Kumar Aditya.

@item 
gh-102748@footnote{https://github.com/python/cpython/issues/102748}: @ref{6a5,,asyncio.iscoroutine()} now returns @code{False} for
generators as @ref{b,,asyncio} does not support legacy generator-based
coroutines. Patch by Kumar Aditya.

@item 
gh-102670@footnote{https://github.com/python/cpython/issues/102670}: Optimized fmean(), correlation(), covariance(), and
linear_regression() using the new math.sumprod() function.

@item 
gh-102615@footnote{https://github.com/python/cpython/issues/102615}: Typing: Improve the @code{repr} of generic aliases for classes
generic over a @ref{488,,ParamSpec}. (Use square brackets to
represent a parameter list.)

@item 
gh-100112@footnote{https://github.com/python/cpython/issues/100112}: @ref{bce,,asyncio.Task.get_coro()} now always returns a coroutine
when wrapping an awaitable object. Patch by Kumar Aditya.

@item 
gh-102578@footnote{https://github.com/python/cpython/issues/102578}: Speed up setting or deleting mutable attributes on
non-dataclass subclasses of frozen dataclasses. Due to the implementation
of @code{__setattr__} and @code{__delattr__} for frozen dataclasses, this
previously had a time complexity of `O'(`n'). It now has a time
complexity of `O'(1).

@item 
gh-102519@footnote{https://github.com/python/cpython/issues/102519}: Add @ref{6c4,,os.listdrives()}, @ref{6c5,,os.listvolumes()} and
@ref{6c6,,os.listmounts()} functions on Windows for enumerating drives, volumes
and mount points

@item 
gh-74468@footnote{https://github.com/python/cpython/issues/74468}: Attribute name of the extracted @ref{e4,,tarfile} file object now
holds filename of itself rather than of the archive it is contained in.
Patch by Oleg Iarygin.

@item 
gh-102378@footnote{https://github.com/python/cpython/issues/102378}: Private helper method
@code{inspect._signature_strip_non_python_syntax} will no longer strip @code{/}
from the input string.

@item 
gh-79940@footnote{https://github.com/python/cpython/issues/79940}: Add @ref{6b9,,inspect.getasyncgenstate()} and
@ref{6ba,,inspect.getasyncgenlocals()}. Patch by Thomas Krennwallner.

@item 
gh-102103@footnote{https://github.com/python/cpython/issues/102103}: Add @code{module} argument to @ref{185f,,dataclasses.make_dataclass()}
and make classes produced by it pickleable.

@item 
gh-102069@footnote{https://github.com/python/cpython/issues/102069}: Fix @code{__weakref__} descriptor generation for custom
dataclasses.

@item 
gh-102038@footnote{https://github.com/python/cpython/issues/102038}: Skip a @code{stat} in @ref{cc,,site} if we have already found a
@code{pyvenv.cfg}

@item 
gh-98886@footnote{https://github.com/python/cpython/issues/98886}: Fix issues when defining dataclasses that have fields with
specific underscore names that aren’t clearly reserved by
@ref{33,,dataclasses}.

@item 
gh-101673@footnote{https://github.com/python/cpython/issues/101673}: Fix a @ref{aa,,pdb} bug where @code{ll} clears the changes to local
variables.

@item 
gh-101313@footnote{https://github.com/python/cpython/issues/101313}: Added -h and –help arguments to the webbrowser CLI

@item 
gh-100372@footnote{https://github.com/python/cpython/issues/100372}: @ref{10ed,,ssl.SSLContext.load_verify_locations()} no longer
incorrectly accepts some cases of trailing data when parsing DER.

@item 
gh-89727@footnote{https://github.com/python/cpython/issues/89727}: Fix pathlib.Path.walk RecursionError on deep directory trees by
rewriting it using iteration instead of recursion.

@item 
gh-100131@footnote{https://github.com/python/cpython/issues/100131}: Added an optional @code{delete} keyword argument to
@ref{1439,,tempfile.TemporaryDirectory}.

@item 
gh-48330@footnote{https://github.com/python/cpython/issues/48330}: Added @code{--durations} command line option, showing the N slowest
test cases. @ref{1ab5,,unittest.TextTestRunner} and
@ref{753,,unittest.TextTestResult} constructors accept a new `durations'
keyword argument. Subclasses should take this into account or accept
@code{**kwargs}. Added @ref{1ab6,,unittest.TestResult.addDuration()} method and
@ref{1a7c,,unittest.TestResult.collectedDurations} attribute.

(Contributed by Giampaolo Rodola)

@item 
gh-98169@footnote{https://github.com/python/cpython/issues/98169}: Fix @ref{1a9d,,dataclasses.astuple()} crash when
@ref{13c1,,collections.defaultdict} is present in the attributes.

@item 
gh-96931@footnote{https://github.com/python/cpython/issues/96931}: Fix incorrect results from @ref{106b,,ssl.SSLSocket.shared_ciphers()}

@item 
gh-95495@footnote{https://github.com/python/cpython/issues/95495}: When built against OpenSSL 3.0, the @ref{d5,,ssl} module had a bug
where it reported unauthenticated EOFs (i.e. without close_notify) as a
clean TLS-level EOF. It now raises @ref{1ab7,,SSLEOFError}, matching the
behavior in previous versions of OpenSSL. The
@ref{a39,,options} attribute on @ref{357,,SSLContext} also
no longer includes @ref{a38,,OP_IGNORE_UNEXPECTED_EOF} by default. This
option may be set to specify the previous OpenSSL 3.0 behavior.

@item 
gh-94684@footnote{https://github.com/python/cpython/issues/94684}: Now @ref{2e5,,uuid.uuid3()} and @ref{2e6,,uuid.uuid5()} functions support
@ref{192,,bytes} objects as their `name' argument.

@item 
gh-94440@footnote{https://github.com/python/cpython/issues/94440}: Fix a @code{concurrent.futures.process} bug where
@code{ProcessPoolExecutor} shutdown could hang after a future has been
quickly submitted and canceled.

@item 
gh-72346@footnote{https://github.com/python/cpython/issues/72346}: Added deprecation warning to `isdst' parameter of
@ref{2f7,,email.utils.localtime()}.

@item 
bpo-36305@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36305}: Fix handling of Windows filenames that resemble drives, such as
@code{./a:b}, in @ref{a8,,pathlib}.
@end itemize

@node Documentation<22>,Tests<22>,Library<69>,Python 3 12 0 alpha 7
@anchor{whatsnew/changelog id307}@anchor{1ab8}
@subsubsection Documentation



@itemize -

@item 
gh-103112@footnote{https://github.com/python/cpython/issues/103112}: Add docstring to @ref{18b0,,http.client.HTTPResponse.read()} to fix
@code{pydoc} output.
@end itemize

@node Tests<22>,Build<26>,Documentation<22>,Python 3 12 0 alpha 7
@anchor{whatsnew/changelog id308}@anchor{1ab9}
@subsubsection Tests



@itemize -

@item 
gh-102980@footnote{https://github.com/python/cpython/issues/102980}: Improve test coverage on @ref{aa,,pdb}.

@item 
gh-102537@footnote{https://github.com/python/cpython/issues/102537}: Adjust the error handling strategy in
@code{test_zoneinfo.TzPathTest.python_tzpath_context}. Patch by Paul Ganssle.

@item 
gh-101377@footnote{https://github.com/python/cpython/issues/101377}: Improved test_locale_calendar_formatweekday of calendar.
@end itemize

@node Build<26>,Windows<23>,Tests<22>,Python 3 12 0 alpha 7
@anchor{whatsnew/changelog id309}@anchor{1aba}
@subsubsection Build



@itemize -

@item 
gh-102973@footnote{https://github.com/python/cpython/issues/102973}: Add a dev container (along with accompanying Dockerfile) for
development purposes.

@item 
gh-102711@footnote{https://github.com/python/cpython/issues/102711}: Fix @code{-Wstrict-prototypes} compiler warnings.
@end itemize

@node Windows<23>,Tools/Demos<21>,Build<26>,Python 3 12 0 alpha 7
@anchor{whatsnew/changelog id310}@anchor{1abb}
@subsubsection Windows



@itemize -

@item 
gh-102690@footnote{https://github.com/python/cpython/issues/102690}: Update @ref{11b,,webbrowser} to fall back to Microsoft Edge instead
of Internet Explorer.

@item 
gh-99726@footnote{https://github.com/python/cpython/issues/99726}: Improves correctness of stat results for Windows, and uses
faster API when available
@end itemize

@node Tools/Demos<21>,C API<25>,Windows<23>,Python 3 12 0 alpha 7
@anchor{whatsnew/changelog id311}@anchor{1abc}
@subsubsection Tools/Demos



@itemize -

@item 
gh-102809@footnote{https://github.com/python/cpython/issues/102809}: @code{Misc/gdbinit} was removed.
@end itemize

@node C API<25>,,Tools/Demos<21>,Python 3 12 0 alpha 7
@anchor{whatsnew/changelog id312}@anchor{1abd}
@subsubsection C API



@itemize -

@item 
gh-102013@footnote{https://github.com/python/cpython/issues/102013}: Add a new (unstable) C-API function for iterating over GC’able
objects using a callback: @code{PyUnstable_VisitObjects}.
@end itemize

@node Python 3 12 0 alpha 6,Python 3 12 0 alpha 5,Python 3 12 0 alpha 7,Changelog
@anchor{whatsnew/changelog python-3-12-0-alpha-6}@anchor{1abe}
@subsection Python 3.12.0 alpha 6


`Release date: 2023-03-07'

@menu
* Security: Security<24>. 
* Core and Builtins: Core and Builtins<65>. 
* Library: Library<70>. 
* Documentation: Documentation<23>. 
* Tests: Tests<23>. 
* Build: Build<27>. 
* Windows: Windows<24>. 
* macOS: macOS<16>. 
* C API: C API<26>. 

@end menu

@node Security<24>,Core and Builtins<65>,,Python 3 12 0 alpha 6
@anchor{whatsnew/changelog id313}@anchor{1abf}
@subsubsection Security



@itemize -

@item 
gh-99108@footnote{https://github.com/python/cpython/issues/99108}: Replace builtin hashlib implementations of MD5 and SHA1 with
verified ones from the HACL* project.

@item 
gh-101727@footnote{https://github.com/python/cpython/issues/101727}: Updated the OpenSSL version used in Windows and macOS binary
release builds to 1.1.1t to address 
@geindex Common Vulnerabilities and Exposures; CVE 2023-0286
CVE 2023-0286@footnote{https://www.cve.org/CVERecord?id=CVE-2023-0286}, 
@geindex Common Vulnerabilities and Exposures; CVE 2022-4303
CVE 2022-4303@footnote{https://www.cve.org/CVERecord?id=CVE-2022-4303},
and 
@geindex Common Vulnerabilities and Exposures; CVE 2022-4303
CVE 2022-4303@footnote{https://www.cve.org/CVERecord?id=CVE-2022-4303} per the OpenSSL 2023-02-07 security advisory@footnote{https://openssl-library.org/news/secadv/20230207.txt}.

@item 
gh-99108@footnote{https://github.com/python/cpython/issues/99108}: Replace the builtin @ref{6c,,hashlib} implementations of SHA2-384
and SHA2-512 originally from LibTomCrypt with formally verified,
side-channel resistant code from the HACL*@footnote{https://github.com/hacl-star/hacl-star/} project. The builtins remain a
fallback only used when OpenSSL does not provide them.

@item 
gh-101283@footnote{https://github.com/python/cpython/issues/101283}: @ref{4b8,,subprocess.Popen} now uses a safer approach to find
@code{cmd.exe} when launching with @code{shell=True}. Patch by Eryk Sun, based
on a patch by Oleg Iarygin.
@end itemize

@node Core and Builtins<65>,Library<70>,Security<24>,Python 3 12 0 alpha 6
@anchor{whatsnew/changelog id314}@anchor{1ac0}
@subsubsection Core and Builtins



@itemize -

@item 
gh-102493@footnote{https://github.com/python/cpython/issues/102493}: Fix regression in semantics of normalisation in
@code{PyErr_SetObject}.

@item 
gh-102416@footnote{https://github.com/python/cpython/issues/102416}: Do not memoize incorrectly automatically generated loop rules
in the parser. Patch by Pablo Galindo.

@item 
gh-102356@footnote{https://github.com/python/cpython/issues/102356}: Fix a bug that caused a crash when deallocating deeply nested
filter objects. Patch by Marta Gómez Macías.

@item 
gh-102336@footnote{https://github.com/python/cpython/issues/102336}: Cleanup Windows 7 specific special handling. Patch by Max
Bachmann.

@item 
gh-102250@footnote{https://github.com/python/cpython/issues/102250}: Fixed a segfault occurring when the interpreter calls a
@code{__bool__} method that raises.

@item 
gh-102126@footnote{https://github.com/python/cpython/issues/102126}: Fix deadlock at shutdown when clearing thread states if any
finalizer tries to acquire the runtime head lock. Patch by Kumar Aditya.

@item 
gh-102027@footnote{https://github.com/python/cpython/issues/102027}: Use @code{GetCurrentProcessId} on Windows when @code{getpid} is
unavailable. Patch by Max Bachmann.

@item 
gh-102056@footnote{https://github.com/python/cpython/issues/102056}: Fix error handling bugs in interpreter’s exception printing
code, which could cause a crash on infinite recursion.

@item 
gh-100982@footnote{https://github.com/python/cpython/issues/100982}: Restrict the scope of the @code{FOR_ITER_RANGE} instruction
to the scope of the original @ref{1ac1,,FOR_ITER} instruction, to allow
instrumentation.

@item 
gh-101967@footnote{https://github.com/python/cpython/issues/101967}: Fix possible segfault in @code{positional_only_passed_as_keyword}
function, when new list created.

@item 
gh-101952@footnote{https://github.com/python/cpython/issues/101952}: Fix possible segfault in @code{BUILD_SET} opcode, when new set
created.

@item 
gh-74895@footnote{https://github.com/python/cpython/issues/74895}: @ref{176f,,socket.getaddrinfo} no longer raises
@ref{a81,,OverflowError} for @ref{19b,,int} `port' values outside of the C
long range. Out of range values are left up to the underlying string based
C library API to report. A @ref{1ac2,,socket.gaierror} @code{SAI_SERVICE} may
occur instead, or no error at all as not all platform C libraries generate
an error.

@item 
gh-101799@footnote{https://github.com/python/cpython/issues/101799}: Add @ref{707,,CALL_INTRINSIC_2} and use it instead of
@code{PREP_RERAISE_STAR}.

@item 
gh-101857@footnote{https://github.com/python/cpython/issues/101857}: Fix xattr support detection on Linux systems by widening the
check to linux, not just glibc. This fixes support for musl.

@item 
gh-84783@footnote{https://github.com/python/cpython/issues/84783}: Make the slice object hashable. Patch by Will Bradshaw and
Furkan Onder.

@item 
gh-87849@footnote{https://github.com/python/cpython/issues/87849}: Change the @code{SEND} instruction to leave the receiver on the
stack. This allows the specialized form of @code{SEND} to skip the chain of C
calls and jump directly to the @code{RESUME} in the generator or coroutine.

@item 
gh-101765@footnote{https://github.com/python/cpython/issues/101765}: Fix SystemError / segmentation fault in iter @code{__reduce__}
when internal access of @code{builtins.__dict__} keys mutates the iter
object.

@item 
gh-101430@footnote{https://github.com/python/cpython/issues/101430}: Update @ref{105,,tracemalloc} to handle presize of object properly.
Patch by Donghee Na.

@item 
gh-101696@footnote{https://github.com/python/cpython/issues/101696}: Invalidate type version tag in @code{_PyStaticType_Dealloc} for
static types, avoiding bug where a false cache hit could crash the
interpreter. Patch by Kumar Aditya.

@item 
gh-101632@footnote{https://github.com/python/cpython/issues/101632}: Adds a new @code{RETURN_CONST} instruction.

@item 
gh-100719@footnote{https://github.com/python/cpython/issues/100719}: Remove gi_code field from generator (and coroutine and async
generator) objects as it is redundant. The frame already includes a
reference to the code object.

@item 
gh-98627@footnote{https://github.com/python/cpython/issues/98627}: When an interpreter is configured to check (and only then),
importing an extension module will now fail when the extension does not
support multiple interpreters (i.e. doesn’t implement PEP 489 multi-phase
init). This does not apply to the main interpreter, nor to subinterpreters
created with @code{Py_NewInterpreter()}.
@end itemize

@node Library<70>,Documentation<23>,Core and Builtins<65>,Python 3 12 0 alpha 6
@anchor{whatsnew/changelog id315}@anchor{1ac3}
@subsubsection Library



@itemize -

@item 
gh-102302@footnote{https://github.com/python/cpython/issues/102302}: Micro-optimise hashing of @ref{4e4,,inspect.Parameter}, reducing
the time it takes to hash an instance by around 40%.

@item 
gh-101979@footnote{https://github.com/python/cpython/issues/101979}: Fix a bug where parentheses in the @code{metavar} argument to
@ref{4bd,,argparse.ArgumentParser.add_argument()} were dropped. Patch by Yeojin
Kim.

@item 
gh-91038@footnote{https://github.com/python/cpython/issues/91038}: @ref{1ac4,,platform.platform()} now has boolean default arguments.

@item 
gh-81652@footnote{https://github.com/python/cpython/issues/81652}: Add @ref{1ac5,,mmap.MAP_ALIGNED_SUPER} FreeBSD and
@ref{1ac6,,mmap.MAP_CONCEAL} OpenBSD constants to @ref{94,,mmap}. Patch by
Yeojin Kim.

@item 
gh-102179@footnote{https://github.com/python/cpython/issues/102179}: Fix @ref{d59,,os.dup2()} error message for negative fds.

@item 
gh-101961@footnote{https://github.com/python/cpython/issues/101961}: For the binary mode, @code{fileinput.hookcompressed()} doesn’t
set the @code{encoding} value even if the value is @code{None}. Patch by Gihwan
Kim.

@item 
gh-101936@footnote{https://github.com/python/cpython/issues/101936}: The default value of @code{fp} becomes @ref{10a3,,io.BytesIO} if
@ref{11dd,,HTTPError} is initialized without a designated @code{fp}
parameter. Patch by Long Vo.

@item 
gh-101566@footnote{https://github.com/python/cpython/issues/101566}: In zipfile, sync Path with zipp 3.14@footnote{https://zipp.readthedocs.io/en/latest/history.html#v3-14-0}, including
fix for extractall on the underlying zipfile after being wrapped in
@code{Path}.

@item 
gh-97930@footnote{https://github.com/python/cpython/issues/97930}: Apply changes from importlib_resources 5.12@footnote{https://importlib-resources.readthedocs.io/en/latest/history.html#v5-12-0},
including fix for @code{MultiplexedPath} to support directories in multiple
namespaces (python/importlib_resources#265).

@item 
gh-101997@footnote{https://github.com/python/cpython/issues/101997}: Upgrade pip wheel bundled with ensurepip (pip 23.0.1)

@item 
gh-99108@footnote{https://github.com/python/cpython/issues/99108}: The built-in extension modules for @ref{6c,,hashlib} SHA2
algorithms, used when OpenSSL does not provide them, now live in a single
internal @code{_sha2} module instead of separate @code{_sha256} and @code{_sha512}
modules.

@item 
gh-101892@footnote{https://github.com/python/cpython/issues/101892}: Callable iterators no longer raise @ref{794,,SystemError} when
the callable object exhausts the iterator but forgets to either return a
sentinel value or raise @ref{df4,,StopIteration}.

@item 
gh-87634@footnote{https://github.com/python/cpython/issues/87634}: Remove locking behavior from @ref{762,,functools.cached_property()}.

@item 
gh-97786@footnote{https://github.com/python/cpython/issues/97786}: Fix potential undefined behaviour in corner cases of
floating-point-to-time conversions.

@item 
gh-101517@footnote{https://github.com/python/cpython/issues/101517}: Fixed bug where @ref{10,,bdb} looks up the source line with
@ref{89,,linecache} with a @code{lineno=None}, which causes it to fail with an
unhandled exception.

@item 
gh-101773@footnote{https://github.com/python/cpython/issues/101773}: Optimize @ref{213,,fractions.Fraction} for small components. The
private argument @code{_normalize} of the @code{fractions.Fraction}
constructor has been removed.

@item 
gh-101693@footnote{https://github.com/python/cpython/issues/101693}: In @ref{5af,,sqlite3.Cursor.execute()}, @ref{1a3,,DeprecationWarning} is
now emitted when @ref{5b1,,named placeholders} are used
together with parameters supplied as a @ref{715,,sequence} instead of as a
@ref{183,,dict}. Starting from Python 3.14, using named placeholders with
parameters supplied as a sequence will raise a
@ref{305,,ProgrammingError}. Patch by Erlend E. Aasland.

@item 
gh-101446@footnote{https://github.com/python/cpython/issues/101446}: Change repr of @ref{7f2,,collections.OrderedDict} to use regular
dictionary formatting instead of pairs of keys and values.

@item 
gh-101362@footnote{https://github.com/python/cpython/issues/101362}: Speed up @ref{6cc,,pathlib.PurePath} construction by handling
arguments more uniformly. When a @ref{266,,pathlib.Path} argument is
supplied, we use its string representation rather than joining its parts
with @ref{19a9,,os.path.join()}.

@item 
gh-101362@footnote{https://github.com/python/cpython/issues/101362}: Speed up @ref{6cc,,pathlib.PurePath} construction by calling
@ref{19a9,,os.path.join()} only when two or more arguments are given.

@item 
gh-101362@footnote{https://github.com/python/cpython/issues/101362}: Speed up @ref{266,,pathlib.Path} construction by running the path
flavour compatibility check only when pathlib is imported.

@item 
gh-85984@footnote{https://github.com/python/cpython/issues/85984}: Refactored the implementation of @ref{1ac7,,pty.fork()} to use
@ref{1ac8,,os.login_tty()}.

A @ref{1a3,,DeprecationWarning} is now raised by @code{pty.master_open()} and
@code{pty.slave_open()}. They were undocumented and deprecated long long ago
in the docstring in favor of @ref{301,,pty.openpty()}.

@item 
gh-101561@footnote{https://github.com/python/cpython/issues/101561}: Add a new decorator @ref{67b,,typing.override()}. See 
@geindex Python 향상 제안; PEP 698
PEP 698@footnote{https://peps.python.org/pep-0698/} for
details. Patch by Steven Troxler.

@item 
gh-63301@footnote{https://github.com/python/cpython/issues/63301}: Set exit code when @ref{e3,,tabnanny} CLI exits on error.

@item 
gh-101360@footnote{https://github.com/python/cpython/issues/101360}: Fix anchor matching in @code{pathlib.PureWindowsPath.match()}.
Path and pattern anchors are now matched with @ref{60,,fnmatch}, just like
other path parts. This allows patterns such as @code{"*:/Users/*"} to be
matched.

@item 
gh-101277@footnote{https://github.com/python/cpython/issues/101277}: Remove global state from @ref{85,,itertools} module (
@geindex Python 향상 제안; PEP 687
PEP 687@footnote{https://peps.python.org/pep-0687/}).
Patches by Erlend E. Aasland.

@item 
gh-100809@footnote{https://github.com/python/cpython/issues/100809}: Fix handling of drive-relative paths (like ‘C:’ and ‘C:foo’) in
@ref{1a26,,pathlib.Path.absolute()}. This method now uses the OS API to retrieve
the correct current working directory for the drive.

@item 
gh-99138@footnote{https://github.com/python/cpython/issues/99138}: Apply 
@geindex Python 향상 제안; PEP 687
PEP 687@footnote{https://peps.python.org/pep-0687/} to @ref{13a,,zoneinfo}. Patch by Erlend E. Aasland.

@item 
gh-96764@footnote{https://github.com/python/cpython/issues/96764}: @ref{814,,asyncio.wait_for()} now uses @ref{813,,asyncio.timeout()} as its
underlying implementation. Patch by Kumar Aditya.

@item 
gh-88233@footnote{https://github.com/python/cpython/issues/88233}: Correctly preserve “extra” fields in @code{zipfile} regardless of
their ordering relative to a zip64 “extra.”

@item 
bpo-23224@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23224}: Fix segfaults when creating @ref{1ac9,,lzma.LZMADecompressor} and
@ref{1aca,,bz2.BZ2Decompressor} objects without calling @code{__init__()}, and
fix leakage of locks and internal buffers when calling the @code{__init__()}
methods of @code{lzma.LZMADecompressor}, @ref{1acb,,lzma.LZMACompressor},
@ref{1acc,,bz2.BZ2Compressor}, and @code{bz2.BZ2Decompressor} objects
multiple times.
@end itemize

@node Documentation<23>,Tests<23>,Library<70>,Python 3 12 0 alpha 6
@anchor{whatsnew/changelog id316}@anchor{1acd}
@subsubsection Documentation



@itemize -

@item 
gh-85417@footnote{https://github.com/python/cpython/issues/85417}: Update @ref{19,,cmath} documentation to clarify behaviour on branch
cuts.

@item 
gh-97725@footnote{https://github.com/python/cpython/issues/97725}: Fix @ref{1ace,,asyncio.Task.print_stack()} description for
@code{file=None}. Patch by Oleg Iarygin.
@end itemize

@node Tests<23>,Build<27>,Documentation<23>,Python 3 12 0 alpha 6
@anchor{whatsnew/changelog id317}@anchor{1acf}
@subsubsection Tests



@itemize -

@item 
gh-102019@footnote{https://github.com/python/cpython/issues/102019}: Fix deadlock on shutdown if @code{test_current_@{exception,frames@}}
fails. Patch by Jacob Bower.

@item 
gh-85984@footnote{https://github.com/python/cpython/issues/85984}: Utilize new “winsize” functions from termios in pty tests.

@item 
gh-89792@footnote{https://github.com/python/cpython/issues/89792}: @code{test_tools} now copies up to 10x less source data to a
temporary directory during the @code{freeze} test by ignoring git metadata
and other artifacts.  It also limits its python build parallelism based on
os.cpu_count instead of hard coding it as 8 cores.
@end itemize

@node Build<27>,Windows<24>,Tests<23>,Python 3 12 0 alpha 6
@anchor{whatsnew/changelog id318}@anchor{1ad0}
@subsubsection Build



@itemize -

@item 
gh-99942@footnote{https://github.com/python/cpython/issues/99942}: On Android, in a static build, python-config in embed mode no
longer incorrectly reports a library to link to.

@item 
gh-99942@footnote{https://github.com/python/cpython/issues/99942}: On Android, python.pc now correctly reports the library to link
to, the same as python-config.sh.

@item 
gh-100221@footnote{https://github.com/python/cpython/issues/100221}: Fix creating install directories in @code{make sharedinstall} if
they exist outside @code{DESTDIR} already.

@item 
gh-96821@footnote{https://github.com/python/cpython/issues/96821}: Explicitly mark C extension modules that need defined signed
integer overflow, and add a configure option
@ref{1ad1,,--with-strict-overflow}. Patch by Matthias Görgens and Shantanu
Jain.
@end itemize

@node Windows<24>,macOS<16>,Build<27>,Python 3 12 0 alpha 6
@anchor{whatsnew/changelog id319}@anchor{1ad2}
@subsubsection Windows



@itemize -

@item 
gh-102344@footnote{https://github.com/python/cpython/issues/102344}: Implement @code{winreg.QueryValue} using @code{QueryValueEx} and
@code{winreg.SetValue} using @code{SetValueEx}. Patch by Max Bachmann.

@item 
gh-101881@footnote{https://github.com/python/cpython/issues/101881}: Handle read and write operations on non-blocking pipes properly
on Windows.

@item 
gh-101881@footnote{https://github.com/python/cpython/issues/101881}: Add support for the os.get_blocking() and os.set_blocking()
functions on Windows.

@item 
gh-101849@footnote{https://github.com/python/cpython/issues/101849}: Ensures installer will correctly upgrade existing @code{py.exe}
launcher installs.

@item 
gh-101763@footnote{https://github.com/python/cpython/issues/101763}: Updates copy of libffi bundled with Windows installs to 3.4.4.

@item 
gh-101759@footnote{https://github.com/python/cpython/issues/101759}: Update Windows installer to SQLite 3.40.1.

@item 
gh-101614@footnote{https://github.com/python/cpython/issues/101614}: Correctly handle extensions built against debug binaries that
reference @code{python3_d.dll}.

@item 
gh-101196@footnote{https://github.com/python/cpython/issues/101196}: The functions @code{os.path.isdir}, @code{os.path.isfile},
@code{os.path.islink} and @code{os.path.exists} are now 13% to 28% faster on
Windows, by making fewer Win32 API calls.
@end itemize

@node macOS<16>,C API<26>,Windows<24>,Python 3 12 0 alpha 6
@anchor{whatsnew/changelog id320}@anchor{1ad3}
@subsubsection macOS



@itemize -

@item 
gh-101759@footnote{https://github.com/python/cpython/issues/101759}: Update macOS installer to SQLite 3.40.1.
@end itemize

@node C API<26>,,macOS<16>,Python 3 12 0 alpha 6
@anchor{whatsnew/changelog id321}@anchor{1ad4}
@subsubsection C API



@itemize -

@item 
gh-101907@footnote{https://github.com/python/cpython/issues/101907}: Removes use of non-standard C++ extension in public header
files.

@item 
gh-99293@footnote{https://github.com/python/cpython/issues/99293}: Document that the Py_TPFLAGS_VALID_VERSION_TAG is an internal
feature, should not be used, and will be removed.

@item 
gh-101578@footnote{https://github.com/python/cpython/issues/101578}: Add @ref{429,,PyErr_GetRaisedException()} and
@ref{42c,,PyErr_SetRaisedException()} for saving and restoring the current
exception. These functions return and accept a single exception object,
rather than the triple arguments of the now-deprecated
@ref{428,,PyErr_Fetch()} and @ref{42b,,PyErr_Restore()}. This is less error
prone and a bit more efficient.

Add @ref{78a,,PyException_GetArgs()} and @ref{78b,,PyException_SetArgs()} as
convenience functions for retrieving and modifying the
@ref{78c,,args} passed to the exception’s constructor.

@item 
gh-91744@footnote{https://github.com/python/cpython/issues/91744}: Introduced the `Unstable C API tier', marking APi that is
allowed to change in minor releases without a deprecation period. See
@geindex Python 향상 제안; PEP 689
PEP 689@footnote{https://peps.python.org/pep-0689/} for details.
@end itemize

@node Python 3 12 0 alpha 5,Python 3 12 0 alpha 4,Python 3 12 0 alpha 6,Changelog
@anchor{whatsnew/changelog python-3-12-0-alpha-5}@anchor{1ad5}
@subsection Python 3.12.0 alpha 5


`Release date: 2023-02-07'

@menu
* Security: Security<25>. 
* Core and Builtins: Core and Builtins<66>. 
* Library: Library<71>. 
* Documentation: Documentation<24>. 
* Tests: Tests<24>. 
* Build: Build<28>. 
* Windows: Windows<25>. 

@end menu

@node Security<25>,Core and Builtins<66>,,Python 3 12 0 alpha 5
@anchor{whatsnew/changelog id322}@anchor{1ad6}
@subsubsection Security



@itemize -

@item 
gh-99108@footnote{https://github.com/python/cpython/issues/99108}: Replace the builtin @ref{6c,,hashlib} implementations of SHA2-224
and SHA2-256 originally from LibTomCrypt with formally verified,
side-channel resistant code from the HACL*@footnote{https://github.com/hacl-star/hacl-star/} project. The builtins remain a
fallback only used when OpenSSL does not provide them.
@end itemize

@node Core and Builtins<66>,Library<71>,Security<25>,Python 3 12 0 alpha 5
@anchor{whatsnew/changelog id324}@anchor{1ad7}
@subsubsection Core and Builtins



@itemize -

@item 
gh-92173@footnote{https://github.com/python/cpython/issues/92173}: Fix the @code{defs} and @code{kwdefs} arguments to
@ref{1ad8,,PyEval_EvalCodeEx()} and a reference leak in that function.

@item 
gh-59956@footnote{https://github.com/python/cpython/issues/59956}: The GILState API is now partially compatible with
subinterpreters. Previously, @code{PyThreadState_GET()} and
@code{PyGILState_GetThisThreadState()} would get out of sync, causing
inconsistent behavior and crashes.

@item 
gh-101400@footnote{https://github.com/python/cpython/issues/101400}: Fix wrong lineno in exception message on @ref{180,,continue} or
@ref{17f,,break} which are not in a loop. Patch by Donghee Na.

@item 
gh-101372@footnote{https://github.com/python/cpython/issues/101372}: Fix @ref{c3b,,is_normalized()} to properly handle the
UCD 3.2.0 cases. Patch by Donghee Na.

@item 
gh-101266@footnote{https://github.com/python/cpython/issues/101266}: Fix @ref{1ad9,,sys.getsizeof()} reporting for @ref{19b,,int}
subclasses.

@item 
gh-101291@footnote{https://github.com/python/cpython/issues/101291}: Refactor the @code{PyLongObject} struct into a normal Python
object header and a @code{PyLongValue} struct.

@item 
gh-101046@footnote{https://github.com/python/cpython/issues/101046}: Fix a possible memory leak in the parser when raising
@ref{175f,,MemoryError}. Patch by Pablo Galindo

@item 
gh-101037@footnote{https://github.com/python/cpython/issues/101037}: Fix potential memory underallocation issue for instances of
@ref{19b,,int} subclasses with value zero.

@item 
gh-100762@footnote{https://github.com/python/cpython/issues/100762}: Record the (virtual) exception block depth in the oparg of
@ref{1a39,,YIELD_VALUE}. Use this to avoid the expensive @code{throw()} when
closing generators (and coroutines) that can be closed trivially.

@item 
gh-100982@footnote{https://github.com/python/cpython/issues/100982}: Adds a new @code{COMPARE_AND_BRANCH} instruction. This is a
bit more efficient when performing a comparison immediately followed by a
branch, and restores the design intent of PEP 659 that specializations are
local to a single instruction.

@item 
gh-100942@footnote{https://github.com/python/cpython/issues/100942}: Fixed segfault in property.getter/setter/deleter that occurred
when a property subclass overrode the @code{__new__} method to return a
non-property instance.

@item 
gh-100923@footnote{https://github.com/python/cpython/issues/100923}: Remove the @code{mask} cache entry for the @ref{b61,,COMPARE_OP}
instruction and embed the mask into the oparg.

@item 
gh-100892@footnote{https://github.com/python/cpython/issues/100892}: Fix race while iterating over thread states in clearing
@ref{1862,,threading.local}. Patch by Kumar Aditya.

@item 
gh-91351@footnote{https://github.com/python/cpython/issues/91351}: Fix a case where re-entrant imports could corrupt the import
deadlock detection code and cause a @ref{5e5,,KeyError} to be raised out of
@code{importlib/_bootstrap}.  In addition to the straightforward cases,
this could also happen when garbage collection leads to a warning being
emitted – as happens when it collects an open socket or file)

@item 
gh-100726@footnote{https://github.com/python/cpython/issues/100726}: Optimize construction of @code{range} object for medium size
integers.

@item 
gh-100712@footnote{https://github.com/python/cpython/issues/100712}: Added option to build cpython with specialization disabled, by
setting @code{ENABLE_SPECIALIZATION=False} in @code{opcode}, followed by
@code{make regen-all}.
@end itemize

@node Library<71>,Documentation<24>,Core and Builtins<66>,Python 3 12 0 alpha 5
@anchor{whatsnew/changelog id325}@anchor{1ada}
@subsubsection Library



@itemize -

@item 
bpo-32780@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32780}: Inter-field padding is now inserted into the PEP3118 format
strings obtained from @ref{1e5,,ctypes.Structure} objects, reflecting their
true representation in memory.

@item 
gh-101541@footnote{https://github.com/python/cpython/issues/101541}: [Enum] - fix psuedo-flag creation

@item 
gh-101570@footnote{https://github.com/python/cpython/issues/101570}: Upgrade pip wheel bundled with ensurepip (pip 23.0)

@item 
gh-101323@footnote{https://github.com/python/cpython/issues/101323}: Fix a bug where errors where not thrown by
zlib._ZlibDecompressor if encountered during decompressing.

@item 
gh-101317@footnote{https://github.com/python/cpython/issues/101317}: Add `ssl_shutdown_timeout' parameter for
@ref{818,,asyncio.StreamWriter.start_tls()}.

@item 
gh-101326@footnote{https://github.com/python/cpython/issues/101326}: Fix regression when passing @code{None} as second or third
argument to @code{FutureIter.throw}.

@item 
gh-92123@footnote{https://github.com/python/cpython/issues/92123}: Adapt the @code{_elementtree} extension module to multi-phase init
(
@geindex Python 향상 제안; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}). Patches by Erlend E. Aasland.

@item 
gh-100795@footnote{https://github.com/python/cpython/issues/100795}: Avoid potential unexpected @code{freeaddrinfo} call (double free)
in @ref{d1,,socket} when when a libc @code{getaddrinfo()} implementation leaves
garbage in an output pointer when returning an error. Original patch by
Sergey G. Brester.

@item 
gh-101143@footnote{https://github.com/python/cpython/issues/101143}: Remove unused references to @ref{1adb,,TimerHandle} in
@code{asyncio.base_events.BaseEventLoop._add_callback}.

@item 
gh-101144@footnote{https://github.com/python/cpython/issues/101144}: Make @ref{1908,,zipfile.Path.open()} and
@ref{1adc,,zipfile.Path.read_text()} also accept @code{encoding} as a positional
argument. This was the behavior in Python 3.9 and earlier.  3.10
introduced a regression where supplying it as a positional argument would
lead to a @ref{198,,TypeError}.

@item 
gh-94518@footnote{https://github.com/python/cpython/issues/94518}: Group-related variables of @code{_posixsubprocess} module are
renamed to stress that supplementary group affinity is added to a fork,
not replace the inherited ones. Patch by Oleg Iarygin.

@item 
gh-101015@footnote{https://github.com/python/cpython/issues/101015}: Fix @ref{8bf,,typing.get_type_hints()} on @code{'*tuple[...]'} and
@code{*tuple[...]}. It must not drop the @code{Unpack} part.

@item 
gh-101000@footnote{https://github.com/python/cpython/issues/101000}: Add @ref{6ca,,os.path.splitroot()}, which splits a path into a
3-item tuple @code{(drive, root, tail)}. This new function is used by
@ref{a8,,pathlib} to improve the performance of path construction by up to a
third.

@item 
gh-100573@footnote{https://github.com/python/cpython/issues/100573}: Fix a Windows @ref{b,,asyncio} bug with named pipes where a
client doing @code{os.stat()} on the pipe would cause an error in the server
that disabled serving future requests.

@item 
gh-39615@footnote{https://github.com/python/cpython/issues/39615}: @ref{171e,,warnings.warn()} now has the ability to skip stack frames
based on code filename prefix rather than only a numeric @code{stacklevel}
via the new @code{skip_file_prefixes} keyword argument.

@item 
gh-100750@footnote{https://github.com/python/cpython/issues/100750}: pass encoding kwarg to subprocess in platform

@item 
gh-100160@footnote{https://github.com/python/cpython/issues/100160}: Emit a deprecation warning in
@code{asyncio.DefaultEventLoopPolicy.get_event_loop()} if there is no
current event loop set and it decides to create one.

@item 
gh-96290@footnote{https://github.com/python/cpython/issues/96290}: Fix handling of partial and invalid UNC drives in
@code{ntpath.splitdrive()}, and in @code{ntpath.normpath()} on non-Windows
systems. Paths such as ‘\server’ and ‘\’ are now considered by
@code{splitdrive()} to contain only a drive, and consequently are not
modified by @code{normpath()} on non-Windows systems. The behaviour of
@code{normpath()} on Windows systems is unaffected, as native OS APIs are
used. Patch by Eryk Sun, with contributions by Barney Gale.

@item 
gh-99952@footnote{https://github.com/python/cpython/issues/99952}: Fix a reference undercounting issue in @ref{1e5,,ctypes.Structure}
with @code{from_param()} results larger than a C pointer.

@item 
gh-67790@footnote{https://github.com/python/cpython/issues/67790}: Add float-style formatting support for
@ref{213,,fractions.Fraction} instances.

@item 
gh-99266@footnote{https://github.com/python/cpython/issues/99266}: Preserve more detailed error messages in @ref{2e,,ctypes}.

@item 
gh-86682@footnote{https://github.com/python/cpython/issues/86682}: Ensure runtime-created collections have the correct module name
using the newly added (internal) @ref{1add,,sys._getframemodulename()}.

@item 
gh-88597@footnote{https://github.com/python/cpython/issues/88597}: @ref{116,,uuid} now has a command line interface. Try @code{python -m
uuid -h}.

@item 
gh-60580@footnote{https://github.com/python/cpython/issues/60580}: @code{ctypes.wintypes.BYTE} definition changed from
@ref{1ade,,c_byte} to @ref{1adf,,c_ubyte} to match Windows SDK.
Patch by Anatoly Techtonik and Oleg Iarygin.

@item 
gh-94518@footnote{https://github.com/python/cpython/issues/94518}: @code{_posixsubprocess} now initializes all UID and GID variables
using a reserved @code{-1} value instead of a separate flag. Patch by Oleg
Iarygin.

@item 
bpo-38941@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38941}: The @ref{12b,,xml.etree.ElementTree} module now emits
@ref{1a3,,DeprecationWarning} when testing the truth value of an
@ref{363,,xml.etree.ElementTree.Element}. Before, the Python implementation
emitted @ref{657,,FutureWarning}, and the C implementation emitted nothing.

@item 
bpo-40077@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40077}: Convert @code{elementtree} types to heap types. Patch by Erlend
E. Aasland.

@item 
bpo-29847@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29847}: Fix a bug where @ref{266,,pathlib.Path} accepted and ignored
keyword arguments. Patch provided by Yurii Karabas.

@item 
gh-77772@footnote{https://github.com/python/cpython/issues/77772}: @ref{bdb,,ctypes.CDLL}, @ref{1ae0,,ctypes.OleDLL},
@ref{1ae1,,ctypes.WinDLL}, and @ref{1ae2,,ctypes.PyDLL} now accept
@ref{5a0,,path-like objects} as their @code{name} argument.
Patch by Robert Hoelzl.
@end itemize

@node Documentation<24>,Tests<24>,Library<71>,Python 3 12 0 alpha 5
@anchor{whatsnew/changelog id326}@anchor{1ae3}
@subsubsection Documentation



@itemize -

@item 
gh-88324@footnote{https://github.com/python/cpython/issues/88324}: Reword @ref{dc,,subprocess} to emphasize default behavior of
`stdin', `stdout', and `stderr' arguments. Remove inaccurate statement
about child file handle inheritance.
@end itemize

@node Tests<24>,Build<28>,Documentation<24>,Python 3 12 0 alpha 5
@anchor{whatsnew/changelog id327}@anchor{1ae4}
@subsubsection Tests



@itemize -

@item 
gh-101334@footnote{https://github.com/python/cpython/issues/101334}: @code{test_tarfile} has been updated to pass when run as a high
UID.
@end itemize

@node Build<28>,Windows<25>,Tests<24>,Python 3 12 0 alpha 5
@anchor{whatsnew/changelog id328}@anchor{1ae5}
@subsubsection Build



@itemize -

@item 
gh-101282@footnote{https://github.com/python/cpython/issues/101282}: Update BOLT configuration not to use deprecated usage of
@code{--split functions}. Patch by Donghee Na.

@item 
gh-101522@footnote{https://github.com/python/cpython/issues/101522}: Allow overriding Windows dependencies versions and paths using
MSBuild properties.

@item 
gh-77532@footnote{https://github.com/python/cpython/issues/77532}: Minor fixes to allow building with @code{PlatformToolset=ClangCL}
on Windows.

@item 
gh-101152@footnote{https://github.com/python/cpython/issues/101152}: In accordance with 
@geindex Python 향상 제안; PEP 699
PEP 699@footnote{https://peps.python.org/pep-0699/}, the @code{ma_version_tag} field in
@ref{64d,,PyDictObject} is deprecated for extension modules. Accessing this
field will generate a compiler warning at compile time. This field will be
removed in Python 3.14.

@item 
gh-100340@footnote{https://github.com/python/cpython/issues/100340}: Allows -Wno-int-conversion for wasm-sdk 17 and onwards, thus
enables building WASI builds once against the latest sdk.

@item 
gh-101060@footnote{https://github.com/python/cpython/issues/101060}: Conditionally add @code{-fno-reorder-blocks-and-partition} in
configure. Effectively fixes @code{--enable-bolt} when using Clang, as this
appears to be a GCC-only flag.

@item 
gh-98705@footnote{https://github.com/python/cpython/issues/98705}: @code{__bool__} is defined in AIX system header files which breaks
the build in AIX, so undefine it.

@item 
gh-98636@footnote{https://github.com/python/cpython/issues/98636}: Fix a regression in detecting @code{gdbm_compat} library for the
@code{_gdbm} module build.

@item 
gh-96305@footnote{https://github.com/python/cpython/issues/96305}: @code{_aix_support} now uses a simple code to get platform details
rather than the now non-existent @code{_bootsubprocess} during bootstrap.
@end itemize

@node Windows<25>,,Build<28>,Python 3 12 0 alpha 5
@anchor{whatsnew/changelog id329}@anchor{1ae6}
@subsubsection Windows



@itemize -

@item 
gh-101543@footnote{https://github.com/python/cpython/issues/101543}: Ensure the install path in the registry is only used when the
standard library hasn’t been located in any other way.

@item 
gh-101467@footnote{https://github.com/python/cpython/issues/101467}: The @code{py.exe} launcher now correctly filters when only a
single runtime is installed. It also correctly handles prefix matches on
tags so that @code{-3.1} does not match @code{3.11}, but would still match
@code{3.1-32}.

@item 
gh-99834@footnote{https://github.com/python/cpython/issues/99834}: Updates bundled copy of Tcl/Tk to 8.6.13.0

@item 
gh-101135@footnote{https://github.com/python/cpython/issues/101135}: Restore ability to launch older 32-bit versions from the
@code{py.exe} launcher when both 32-bit and 64-bit installs of the same
version are available.

@item 
gh-82052@footnote{https://github.com/python/cpython/issues/82052}: Fixed an issue where writing more than 32K of Unicode output to
the console screen in one go can result in mojibake.

@item 
gh-100320@footnote{https://github.com/python/cpython/issues/100320}: Ensures the @code{PythonPath} registry key from an install is used
when launching from a different copy of Python that relies on an existing
install to provide a copy of its modules and standard library.

@item 
gh-100247@footnote{https://github.com/python/cpython/issues/100247}: Restores support for the @code{py.exe} launcher finding
shebang commands in its configuration file using the full command name.
@end itemize

@node Python 3 12 0 alpha 4,Python 3 12 0 alpha 3,Python 3 12 0 alpha 5,Changelog
@anchor{whatsnew/changelog python-3-12-0-alpha-4}@anchor{1ae7}
@subsection Python 3.12.0 alpha 4


`Release date: 2023-01-10'

@menu
* Core and Builtins: Core and Builtins<67>. 
* Library: Library<72>. 
* Core and Builtins: Core and Builtins<68>. 
* Library: Library<73>. 
* Core and Builtins: Core and Builtins<69>. 
* Library: Library<74>. 
* Documentation: Documentation<25>. 
* Tests: Tests<25>. 
* Build: Build<29>. 
* Windows: Windows<26>. 
* macOS: macOS<17>. 
* Tools/Demos: Tools/Demos<22>. 
* C API: C API<27>. 

@end menu

@node Core and Builtins<67>,Library<72>,,Python 3 12 0 alpha 4
@anchor{whatsnew/changelog id330}@anchor{1ae8}
@subsubsection Core and Builtins



@itemize -

@item 
gh-100776@footnote{https://github.com/python/cpython/issues/100776}: Fix misleading default value in @ref{14dd,,input()}’s
@code{__text_signature__}.

@item 
gh-99005@footnote{https://github.com/python/cpython/issues/99005}: Remove @code{UNARY_POSITIVE}, @code{ASYNC_GEN_WRAP} and
@code{LIST_TO_TUPLE}, replacing them with intrinsics.

@item 
gh-99005@footnote{https://github.com/python/cpython/issues/99005}: Add new @ref{706,,CALL_INTRINSIC_1} instruction. Remove
@code{IMPORT_STAR}, @code{PRINT_EXPR} and
@code{STOPITERATION_ERROR}, replacing them with the
@code{CALL_INTRINSIC_1} instruction.

@item 
gh-100288@footnote{https://github.com/python/cpython/issues/100288}: Remove the LOAD_ATTR_METHOD_WITH_DICT specialized instruction.
Stats show it is not useful.

@item 
gh-100720@footnote{https://github.com/python/cpython/issues/100720}: Added @code{_PyFrame_NumSlotsForCodeObject}, which returns the
number of slots needed in a frame for a given code object.

@item 
gh-100719@footnote{https://github.com/python/cpython/issues/100719}: Removed the co_nplaincellvars field from the code object, as it
is redundant.

@item 
gh-100637@footnote{https://github.com/python/cpython/issues/100637}: Fix @code{int.__sizeof__()} calculation to include the 1-element
@code{ob_digit} array for @code{0} and @code{False}.

@item 
gh-100649@footnote{https://github.com/python/cpython/issues/100649}: Update the native_thread_id field of PyThreadState after fork.

@item 
gh-100126@footnote{https://github.com/python/cpython/issues/100126}: Fix an issue where “incomplete” frames could be briefly visible
to C code while other frames are being torn down, possibly resulting in
corruption or hard crashes of the interpreter while running finalizers.

@item 
gh-87447@footnote{https://github.com/python/cpython/issues/87447}: Fix @ref{18e,,SyntaxError} on comprehension rebind checking with
names that are not actually redefined.

Now reassigning @code{b} in @code{[(b := 1) for a, b.prop in some_iter]} is
allowed. Reassigning @code{a} is still disallowed as per 
@geindex Python 향상 제안; PEP 572
PEP 572@footnote{https://peps.python.org/pep-0572/}.

@item 
gh-100268@footnote{https://github.com/python/cpython/issues/100268}: Add @ref{1ae9,,int.is_integer()} to improve duck type compatibility
between @ref{19b,,int} and @ref{196,,float}.

@item 
gh-100425@footnote{https://github.com/python/cpython/issues/100425}: Improve the accuracy of @code{sum()} with compensated summation.
@end itemize

@node Library<72>,Core and Builtins<68>,Core and Builtins<67>,Python 3 12 0 alpha 4
@anchor{whatsnew/changelog id331}@anchor{1aea}
@subsubsection Library



@itemize -

@item 
gh-100374@footnote{https://github.com/python/cpython/issues/100374}: Fix incorrect result and delay in @ref{1aeb,,socket.getfqdn()}. Patch
by Dominic Socular.
@end itemize

@node Core and Builtins<68>,Library<73>,Library<72>,Python 3 12 0 alpha 4
@anchor{whatsnew/changelog id332}@anchor{1aec}
@subsubsection Core and Builtins



@itemize -

@item 
gh-100357@footnote{https://github.com/python/cpython/issues/100357}: Convert @code{vars}, @code{dir}, @code{next}, @code{getattr}, and @code{iter}
to argument clinic.

@item 
gh-100117@footnote{https://github.com/python/cpython/issues/100117}: Improve the output of @ref{350,,codeobject.co_lines()} by emitting
only one entry for each line range.

@item 
gh-90043@footnote{https://github.com/python/cpython/issues/90043}: Handle NaNs when specializing @ref{b61,,COMPARE_OP} for
@ref{196,,float} values.

@item 
gh-100222@footnote{https://github.com/python/cpython/issues/100222}: Redefine the @code{_Py_CODEUNIT} typedef as a union to describe
its layout to the C compiler, avoiding type punning and improving clarity.

@item 
gh-99955@footnote{https://github.com/python/cpython/issues/99955}: Internal compiler functions (in compile.c) now consistently
return -1 on error and 0 on success.

@item 
gh-100188@footnote{https://github.com/python/cpython/issues/100188}: The @code{BINARY_SUBSCR_LIST_INT} and @code{BINARY_SUBSCR_TUPLE_INT}
instructions are no longer used for negative integers because those
instructions always miss when encountering negative integers.

@item 
gh-99110@footnote{https://github.com/python/cpython/issues/99110}: Initialize frame->previous in frameobject.c to fix a
segmentation fault when accessing frames created by @ref{1aed,,PyFrame_New()}.

@item 
gh-94155@footnote{https://github.com/python/cpython/issues/94155}: Improved the hashing algorithm for code objects, mitigating some
hash collisions.

@item 
gh-99540@footnote{https://github.com/python/cpython/issues/99540}: @code{None} now hashes to a constant value. This is not a
requirements change.

@item 
gh-100143@footnote{https://github.com/python/cpython/issues/100143}: When built with @code{--enable-pystats}, stats collection is now
off by default. To enable it early at startup, pass the @code{-Xpystats}
flag.  Stats are now always dumped, even if switched off.

@item 
gh-100146@footnote{https://github.com/python/cpython/issues/100146}: Improve @code{BUILD_LIST} opcode so that it works similarly to the
@code{BUILD_TUPLE} opcode, by stealing references from the stack rather than
repeatedly using stack operations to set list elements.  Implementation
details are in a new private API @code{_PyList_FromArraySteal()}.

@item 
gh-100110@footnote{https://github.com/python/cpython/issues/100110}: Specialize @code{FOR_ITER} for tuples.

@item 
gh-100050@footnote{https://github.com/python/cpython/issues/100050}: Honor existing errors obtained when searching for mismatching
parentheses in the tokenizer. Patch by Pablo Galindo

@item 
gh-92216@footnote{https://github.com/python/cpython/issues/92216}: Improve the performance of @ref{6f8,,hasattr()} for type objects with
a missing attribute.

@item 
gh-99582@footnote{https://github.com/python/cpython/issues/99582}: Freeze @ref{138,,zipimport} module into @code{_bootstrap_python}.

@item 
gh-99554@footnote{https://github.com/python/cpython/issues/99554}: Pack debugging location tables more efficiently during bytecode
compilation.

@item 
gh-98522@footnote{https://github.com/python/cpython/issues/98522}: Add an internal version number to code objects, to give better
versioning of inner functions and comprehensions, and thus better
specialization of those functions. This change is invisible to both Python
and C extensions.

@item 
gh-94603@footnote{https://github.com/python/cpython/issues/94603}: Improve performance of @code{list.pop} for small lists.
@end itemize

@node Library<73>,Core and Builtins<69>,Core and Builtins<68>,Python 3 12 0 alpha 4
@anchor{whatsnew/changelog id333}@anchor{1aee}
@subsubsection Library



@itemize -

@item 
gh-89051@footnote{https://github.com/python/cpython/issues/89051}: Add @ref{1aef,,ssl.OP_LEGACY_SERVER_CONNECT}
@end itemize

@node Core and Builtins<69>,Library<74>,Library<73>,Python 3 12 0 alpha 4
@anchor{whatsnew/changelog id334}@anchor{1af0}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-32782@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32782}: @code{ctypes} arrays of length 0 now report a correct itemsize
when a @code{memoryview} is constructed from them, rather than always giving
a value of 0.
@end itemize

@node Library<74>,Documentation<25>,Core and Builtins<69>,Python 3 12 0 alpha 4
@anchor{whatsnew/changelog id335}@anchor{1af1}
@subsubsection Library



@itemize -

@item 
gh-100833@footnote{https://github.com/python/cpython/issues/100833}: Speed up @ref{15d9,,math.fsum()} by removing defensive @code{volatile}
qualifiers.

@item 
gh-100805@footnote{https://github.com/python/cpython/issues/100805}: Modify @ref{1435,,random.choice()} implementation to once again work
with NumPy arrays.

@item 
gh-100813@footnote{https://github.com/python/cpython/issues/100813}: Add @code{socket.IP_PKTINFO} constant.

@item 
gh-100792@footnote{https://github.com/python/cpython/issues/100792}: Make @ref{1af2,,email.message.Message.__contains__()} twice as fast.

@item 
gh-91851@footnote{https://github.com/python/cpython/issues/91851}: Microoptimizations for @ref{1af3,,fractions.Fraction.__round__()},
@ref{1af4,,fractions.Fraction.__ceil__()} and
@ref{1af5,,fractions.Fraction.__floor__()}.

@item 
gh-90104@footnote{https://github.com/python/cpython/issues/90104}: Avoid RecursionError on @code{repr} if a dataclass field definition
has a cyclic reference.

@item 
gh-100689@footnote{https://github.com/python/cpython/issues/100689}: Fix crash in @code{pyexpat} by statically allocating
@code{PyExpat_CAPI} capsule.

@item 
gh-100740@footnote{https://github.com/python/cpython/issues/100740}: Fix @code{unittest.mock.Mock} not respecting the spec for
attribute names prefixed with @code{assert}.

@item 
gh-91219@footnote{https://github.com/python/cpython/issues/91219}: Change @code{SimpleHTTPRequestHandler} to support subclassing to
provide a different set of index file names instead of using @code{__init__}
parameters.

@item 
gh-100690@footnote{https://github.com/python/cpython/issues/100690}: @code{Mock} objects which are not unsafe will now raise an
@code{AttributeError} when accessing an attribute that matches the name of an
assertion but without the prefix @code{assert_}, e.g. accessing
@code{called_once} instead of @code{assert_called_once}. This is in addition to
this already happening for accessing attributes with prefixes @code{assert},
@code{assret}, @code{asert}, @code{aseert}, and @code{assrt}.

@item 
gh-89727@footnote{https://github.com/python/cpython/issues/89727}: Simplify and optimize @ref{6cf,,os.walk()} by using
@ref{2ad,,isinstance()} checks to check the top of the stack.

@item 
gh-100485@footnote{https://github.com/python/cpython/issues/100485}: Add math.sumprod() to compute the sum of products.

@item 
gh-86508@footnote{https://github.com/python/cpython/issues/86508}: Fix @ref{d0d,,asyncio.open_connection()} to skip binding to local
addresses of different family. Patch by Kumar Aditya.

@item 
gh-97930@footnote{https://github.com/python/cpython/issues/97930}: @code{importlib.resources.files} now accepts a module as an anchor
instead of only accepting packages. If a module is passed, resources are
resolved adjacent to that module (in the same package or at the package
root). The parameter was renamed from @code{package} to @code{anchor} with a
compatibility shim for those passing by keyword. Additionally, the new
@code{anchor} parameter is now optional and will default to the caller’s
module.

@item 
gh-100585@footnote{https://github.com/python/cpython/issues/100585}: Fixed a bug where importlib.resources.as_file was leaving file
pointers open

@item 
gh-100562@footnote{https://github.com/python/cpython/issues/100562}: Improve performance of @ref{1a26,,pathlib.Path.absolute()} by nearly
2x. This comes at the cost of a performance regression in
@ref{1a9a,,pathlib.Path.cwd()}, which is generally used less frequently in user
code.

@item 
gh-100519@footnote{https://github.com/python/cpython/issues/100519}: Small simplification of @code{http.cookiejar.eff_request_host()}
that improves readability and better matches the RFC wording.

@item 
gh-100287@footnote{https://github.com/python/cpython/issues/100287}: Fix the interaction of @ref{d99,,unittest.mock.seal()} with
@ref{c3e,,unittest.mock.AsyncMock}.

@item 
gh-100488@footnote{https://github.com/python/cpython/issues/100488}: Add @code{Fraction.is_integer()} to check whether a
@ref{213,,fractions.Fraction} is an integer. This improves duck type
compatibility with @ref{196,,float} and @ref{19b,,int}.

@item 
gh-100474@footnote{https://github.com/python/cpython/issues/100474}: @ref{76,,http.server} now checks that an index page is actually a
regular file before trying to serve it.  This avoids issues with
directories named @code{index.html}.

@item 
gh-100363@footnote{https://github.com/python/cpython/issues/100363}: Speed up @ref{d00,,asyncio.get_running_loop()} by removing redundant
@code{getpid} checks. Patch by Kumar Aditya.

@item 
gh-78878@footnote{https://github.com/python/cpython/issues/78878}: Fix crash when creating an instance of @code{_ctypes.CField}.

@item 
gh-100348@footnote{https://github.com/python/cpython/issues/100348}: Fix ref cycle in @code{asyncio._SelectorSocketTransport} by
removing @code{_read_ready_cb} in @code{close}.

@item 
gh-100344@footnote{https://github.com/python/cpython/issues/100344}: Provide C implementation for @ref{6a4,,asyncio.current_task()} for a
4x-6x speedup.

@item 
gh-100272@footnote{https://github.com/python/cpython/issues/100272}: Fix JSON serialization of OrderedDict.  It now preserves the
order of keys.

@item 
gh-83076@footnote{https://github.com/python/cpython/issues/83076}: Instantiation of @code{Mock()} and @code{AsyncMock()} is now 3.8x
faster.

@item 
gh-100234@footnote{https://github.com/python/cpython/issues/100234}: Set a default value of 1.0 for the @code{lambd} parameter in
random.expovariate().

@item 
gh-100228@footnote{https://github.com/python/cpython/issues/100228}: A @ref{1a3,,DeprecationWarning} may be raised when @ref{4b6,,os.fork()}
or @ref{4b7,,os.forkpty()} is called from multi-threaded processes.  Forking
with threads is unsafe and can cause deadlocks, crashes and subtle
problems. Lack of a warning does not indicate that the fork call was
actually safe, as Python may not be aware of all threads.

@item 
gh-100039@footnote{https://github.com/python/cpython/issues/100039}: Improve signatures for enums and flags.

@item 
gh-100133@footnote{https://github.com/python/cpython/issues/100133}: Fix regression in @ref{b,,asyncio} where a subprocess would
sometimes lose data received from pipe.

@item 
bpo-44592@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44592}: Fixes inconsistent handling of case sensitivity of
`extrasaction' arg in @ref{1403,,csv.DictWriter}.

@item 
gh-100098@footnote{https://github.com/python/cpython/issues/100098}: Fix @code{tuple} subclasses being cast to @code{tuple} when used as
enum values.

@item 
gh-85432@footnote{https://github.com/python/cpython/issues/85432}: Rename the `fmt' parameter of the pure-Python implementation of
@ref{1af6,,datetime.time.strftime()} to `format'. Rename the `t' parameter of
@ref{711,,datetime.datetime.fromtimestamp()} to `timestamp'. These changes mean
the parameter names in the pure-Python implementation now match the
parameter names in the C implementation. Patch by Alex Waygood.

@item 
gh-98778@footnote{https://github.com/python/cpython/issues/98778}: Update @ref{11dd,,HTTPError} to be initialized
properly, even if the @code{fp} is @code{None}. Patch by Donghee Na.

@item 
gh-99925@footnote{https://github.com/python/cpython/issues/99925}: Unify error messages in JSON serialization between
@code{json.dumps(float('nan'), allow_nan=False)} and
@code{json.dumps(float('nan'), allow_nan=False, indent=<SOMETHING>)}. Now
both include the representation of the value that could not be serialized.

@item 
gh-89727@footnote{https://github.com/python/cpython/issues/89727}: Fix issue with @ref{6cf,,os.walk()} where a @ref{f67,,RecursionError}
would occur on deep directory structures by adjusting the implementation
of @code{os.walk()} to be iterative instead of recursive.

@item 
gh-94943@footnote{https://github.com/python/cpython/issues/94943}: Add @ref{1af7,,Dataclass support} to the @ref{841,,Enum}
@ref{1af8,,__repr__()}. When inheriting from a
@ref{4e1,,dataclass}, only show the field names in the value
section of the member @ref{1c1,,repr()}, and not the dataclass’ class name.

@item 
gh-83035@footnote{https://github.com/python/cpython/issues/83035}: Fix @ref{17c9,,inspect.getsource()} handling of decorator calls with
nested parentheses.

@item 
gh-99576@footnote{https://github.com/python/cpython/issues/99576}: Fix @code{.save()} method for @code{LWPCookieJar} and
@code{MozillaCookieJar}: saved file was not truncated on repeated save.

@item 
gh-94912@footnote{https://github.com/python/cpython/issues/94912}: Add @ref{6b7,,inspect.markcoroutinefunction()} decorator which
manually marks a function as a coroutine for the benefit of
@code{iscoroutinefunction()}.

@item 
gh-99509@footnote{https://github.com/python/cpython/issues/99509}: Add 
@geindex Python 향상 제안; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/} support for
@code{multiprocessing.queues.Queue}.

@item 
gh-99482@footnote{https://github.com/python/cpython/issues/99482}: Remove @code{Jython} partial compatibility code from several stdlib
modules.

@item 
gh-99433@footnote{https://github.com/python/cpython/issues/99433}: Fix @ref{3e,,doctest} failure on @ref{85a,,types.MethodWrapperType}
in modules.

@item 
gh-85267@footnote{https://github.com/python/cpython/issues/85267}: Several improvements to @ref{22f,,inspect.signature()}’s handling of
@code{__text_signature}. - Fixes a case where @code{inspect.signature()}
dropped parameters - Fixes a case where @code{inspect.signature()} raised
@ref{763,,tokenize.TokenError} - Allows @code{inspect.signature()} to
understand defaults involving binary operations of constants -
@code{inspect.signature()} is documented as only raising @ref{198,,TypeError}
or @ref{2ec,,ValueError}, but sometimes raised @ref{244,,RuntimeError}. These
cases now raise @code{ValueError} - Removed a dead code path

@item 
gh-91166@footnote{https://github.com/python/cpython/issues/91166}: @ref{b,,asyncio} is optimized to avoid excessive copying when
writing to socket and use @ref{6a0,,sendmsg()} if the platform
supports it. Patch by Kumar Aditya.

@item 
gh-98030@footnote{https://github.com/python/cpython/issues/98030}: Add missing TCP socket options from Linux: @code{TCP_MD5SIG},
@code{TCP_THIN_LINEAR_TIMEOUTS}, @code{TCP_THIN_DUPACK}, @code{TCP_REPAIR},
@code{TCP_REPAIR_QUEUE}, @code{TCP_QUEUE_SEQ}, @code{TCP_REPAIR_OPTIONS},
@code{TCP_TIMESTAMP}, @code{TCP_CC_INFO}, @code{TCP_SAVE_SYN}, @code{TCP_SAVED_SYN},
@code{TCP_REPAIR_WINDOW}, @code{TCP_FASTOPEN_CONNECT}, @code{TCP_ULP},
@code{TCP_MD5SIG_EXT}, @code{TCP_FASTOPEN_KEY}, @code{TCP_FASTOPEN_NO_COOKIE},
@code{TCP_ZEROCOPY_RECEIVE}, @code{TCP_INQ}, @code{TCP_TX_DELAY}.

@item 
gh-88500@footnote{https://github.com/python/cpython/issues/88500}: Reduced the memory usage of @ref{1af9,,urllib.parse.unquote()} and
@ref{1afa,,urllib.parse.unquote_to_bytes()} on large values.

@item 
gh-96127@footnote{https://github.com/python/cpython/issues/96127}: @code{inspect.signature} was raising @code{TypeError} on call with
mock objects. Now it correctly returns @code{(*args, **kwargs)} as inferred
signature.

@item 
gh-95882@footnote{https://github.com/python/cpython/issues/95882}: Fix a 3.11 regression in
@ref{d1e,,asynccontextmanager()}, which caused it to propagate
exceptions with incorrect tracebacks and fix a 3.11 regression in
@ref{1407,,contextmanager()}, which caused it to propagate
exceptions with incorrect tracebacks for @ref{df4,,StopIteration}.

@item 
gh-78707@footnote{https://github.com/python/cpython/issues/78707}: Deprecate passing more than one positional argument to
@ref{2fd,,pathlib.PurePath.relative_to()} and
@ref{2fe,,is_relative_to()}.

@item 
gh-92122@footnote{https://github.com/python/cpython/issues/92122}: Fix reStructuredText syntax errors in docstrings in the
@ref{5a,,enum} module.

@item 
gh-91851@footnote{https://github.com/python/cpython/issues/91851}: Optimize the @ref{213,,Fraction} arithmetics for small
components.

@item 
bpo-24132@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24132}: Make @ref{6cc,,pathlib.PurePath} and @ref{266,,Path}
subclassable (private to start). Previously, attempting to instantiate a
subclass resulted in an @ref{5ee,,AttributeError} being raised. Patch by
Barney Gale.

@item 
bpo-40447@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40447}: Accept @ref{e4a,,os.PathLike} (such as @ref{266,,pathlib.Path}) in
the @code{stripdir} arguments of @ref{fe0,,compileall.compile_file()} and
@ref{d1a,,compileall.compile_dir()}.

@item 
bpo-36880@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36880}: Fix a reference counting issue when a @ref{2e,,ctypes} callback
with return type @ref{1f3,,py_object} returns @code{None}, which could
cause crashes.
@end itemize

@node Documentation<25>,Tests<25>,Library<74>,Python 3 12 0 alpha 4
@anchor{whatsnew/changelog id336}@anchor{1afb}
@subsubsection Documentation



@itemize -

@item 
gh-100616@footnote{https://github.com/python/cpython/issues/100616}: Document existing @code{attr} parameter to
@ref{1afc,,curses.window.vline()} function in @ref{2f,,curses}.

@item 
gh-100472@footnote{https://github.com/python/cpython/issues/100472}: Remove claim in documentation that the @code{stripdir},
@code{prependdir} and @code{limit_sl_dest} parameters of
@ref{d1a,,compileall.compile_dir()} and @ref{fe0,,compileall.compile_file()} could
be @ref{192,,bytes}.

@item 
bpo-25377@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25377}: Clarify use of octal format of mode argument in help(os.chmod)
as well as help(os.fchmod)
@end itemize

@node Tests<25>,Build<29>,Documentation<25>,Python 3 12 0 alpha 4
@anchor{whatsnew/changelog id337}@anchor{1afd}
@subsubsection Tests



@itemize -

@item 
gh-100454@footnote{https://github.com/python/cpython/issues/100454}: Start running SSL tests with OpenSSL 3.1.0-beta1.

@item 
gh-100086@footnote{https://github.com/python/cpython/issues/100086}: The Python test runner (libregrtest) now logs Python build
information like “debug” vs “release” build, or LTO and PGO optimizations.
Patch by Victor Stinner.

@item 
gh-93018@footnote{https://github.com/python/cpython/issues/93018}: Make two tests forgiving towards host system libexpat with
backported security fixes applied.
@end itemize

@node Build<29>,Windows<26>,Tests<25>,Python 3 12 0 alpha 4
@anchor{whatsnew/changelog id338}@anchor{1afe}
@subsubsection Build



@itemize -

@item 
gh-100540@footnote{https://github.com/python/cpython/issues/100540}: Removed the @code{--with-system-ffi} @code{configure} option;
@code{libffi} must now always be supplied by the system on all non-Windows
platforms.  The option has had no effect on non-Darwin platforms for
several releases, and in 3.11 only had the non-obvious effect of invoking
@code{pkg-config} to find @code{libffi} and never setting
@code{-DUSING_APPLE_OS_LIBFFI}.  Now on Darwin platforms @code{configure} will
first check for the OS @code{libffi} and then fall back to the same
processing as other platforms if it is not found.

@item 
gh-88267@footnote{https://github.com/python/cpython/issues/88267}: Avoid exporting Python symbols in linked Windows applications
when the core is built as static.

@item 
bpo-41916@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41916}: Allow override of ac_cv_cxx_thread so that cross compiled
python can set -pthread for CXX.
@end itemize

@node Windows<26>,macOS<17>,Build<29>,Python 3 12 0 alpha 4
@anchor{whatsnew/changelog id339}@anchor{1aff}
@subsubsection Windows



@itemize -

@item 
gh-100180@footnote{https://github.com/python/cpython/issues/100180}: Update Windows installer to OpenSSL 1.1.1s

@item 
gh-99191@footnote{https://github.com/python/cpython/issues/99191}: Use @code{_MSVC_LANG >= 202002L} instead of less-precise @code{_MSC_VER
>=1929} to more accurately test for C++20 support in
@code{PC/_wmimodule.cpp}.

@item 
gh-79218@footnote{https://github.com/python/cpython/issues/79218}: Define @code{MS_WIN64} for Mingw-w64 64bit, fix cython compilation
failure.

@item 
gh-99941@footnote{https://github.com/python/cpython/issues/99941}: Ensure that @ref{1b00,,asyncio.Protocol.data_received()} receives an
immutable @ref{192,,bytes} object (as documented), instead of
@ref{344,,bytearray}.

@item 
bpo-43984@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43984}: @ref{1b01,,winreg.SetValueEx()} now leaves the target value untouched
in the case of conversion errors. Previously, @code{-1} would be written in
case of such errors.

@item 
bpo-34816@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34816}: @code{hasattr(ctypes.windll, 'nonexistant')} now returns @code{False}
instead of raising @ref{2c0,,OSError}.
@end itemize

@node macOS<17>,Tools/Demos<22>,Windows<26>,Python 3 12 0 alpha 4
@anchor{whatsnew/changelog id340}@anchor{1b02}
@subsubsection macOS



@itemize -

@item 
gh-100180@footnote{https://github.com/python/cpython/issues/100180}: Update macOS installer to OpenSSL 1.1.1s

@item 
gh-100540@footnote{https://github.com/python/cpython/issues/100540}: Removed obsolete @code{dlfcn.h} shim from the @code{_ctypes}
extension module, which has not been necessary since Mac OS X 10.2.
@end itemize

@node Tools/Demos<22>,C API<27>,macOS<17>,Python 3 12 0 alpha 4
@anchor{whatsnew/changelog id341}@anchor{1b03}
@subsubsection Tools/Demos



@itemize -

@item 
bpo-45256@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45256}: Fix a bug that caused an @ref{5ee,,AttributeError} to be raised in
@code{python-gdb.py} when @code{py-locals} is used without a frame.

@item 
gh-100342@footnote{https://github.com/python/cpython/issues/100342}: Add missing @code{NULL} check for possible allocation failure in
@code{*args} parsing in Argument Clinic.
@end itemize

@node C API<27>,,Tools/Demos<22>,Python 3 12 0 alpha 4
@anchor{whatsnew/changelog id342}@anchor{1b04}
@subsubsection C API



@itemize -

@item 
gh-99947@footnote{https://github.com/python/cpython/issues/99947}: Raising SystemError on import will now have its cause be set to
the original unexpected exception.

@item 
gh-99240@footnote{https://github.com/python/cpython/issues/99240}: In argument parsing, after deallocating newly allocated memory,
reset its pointer to NULL.

@item 
gh-98724@footnote{https://github.com/python/cpython/issues/98724}: The @ref{797,,Py_CLEAR}, @ref{798,,Py_SETREF} and
@ref{799,,Py_XSETREF} macros now only evaluate their arguments once. If an
argument has side effects, these side effects are no longer duplicated.
Patch by Victor Stinner.
@end itemize

@node Python 3 12 0 alpha 3,Python 3 12 0 alpha 2,Python 3 12 0 alpha 4,Changelog
@anchor{whatsnew/changelog python-3-12-0-alpha-3}@anchor{1b05}
@subsection Python 3.12.0 alpha 3


`Release date: 2022-12-06'

@menu
* Security: Security<26>. 
* Core and Builtins: Core and Builtins<70>. 
* Library: Library<75>. 
* Core and Builtins: Core and Builtins<71>. 
* Library: Library<76>. 
* Documentation: Documentation<26>. 
* Tests: Tests<26>. 
* Build: Build<30>. 
* Windows: Windows<27>. 
* macOS: macOS<18>. 
* Tools/Demos: Tools/Demos<23>. 
* C API: C API<28>. 

@end menu

@node Security<26>,Core and Builtins<70>,,Python 3 12 0 alpha 3
@anchor{whatsnew/changelog id343}@anchor{1b06}
@subsubsection Security



@itemize -

@item 
gh-100001@footnote{https://github.com/python/cpython/issues/100001}: @code{python -m http.server} no longer allows terminal control
characters sent within a garbage request to be printed to the stderr
server log.

This is done by changing the @ref{76,,http.server}
@code{BaseHTTPRequestHandler} @code{.log_message} method to replace control
characters with a @code{\x@var{HH}} hex escape before printing.

@item 
gh-87604@footnote{https://github.com/python/cpython/issues/87604}: Avoid publishing list of active per-interpreter audit hooks via
the @ref{64,,gc} module
@end itemize

@node Core and Builtins<70>,Library<75>,Security<26>,Python 3 12 0 alpha 3
@anchor{whatsnew/changelog id344}@anchor{1b07}
@subsubsection Core and Builtins



@itemize -

@item 
gh-99891@footnote{https://github.com/python/cpython/issues/99891}: Fix a bug in the tokenizer that could cause infinite recursion
when showing syntax warnings that happen in the first line of the source.
Patch by Pablo Galindo

@item 
gh-91054@footnote{https://github.com/python/cpython/issues/91054}: Add @ref{786,,PyCode_AddWatcher()} and
@ref{787,,PyCode_ClearWatcher()} APIs to register callbacks to receive
notification on creation and destruction of code objects.

@item 
gh-99729@footnote{https://github.com/python/cpython/issues/99729}: Fix an issue that could cause frames to be visible to Python
code as they are being torn down, possibly leading to memory corruption or
hard crashes of the interpreter.

@item 
gh-99708@footnote{https://github.com/python/cpython/issues/99708}: Fix bug where compiler crashes on an if expression with an empty
body block.

@item 
gh-99578@footnote{https://github.com/python/cpython/issues/99578}: Fix a reference bug in @code{_imp.create_builtin()} after the
creation of the first sub-interpreter for modules @code{builtins} and
@code{sys}. Patch by Victor Stinner.

@item 
gh-99581@footnote{https://github.com/python/cpython/issues/99581}: Fixed a bug that was causing a buffer overflow if the tokenizer
copies a line missing the newline character from a file that is as long as
the available tokenizer buffer. Patch by Pablo galindo

@item 
gh-99553@footnote{https://github.com/python/cpython/issues/99553}: Fix bug where an @ref{4d3,,ExceptionGroup} subclass can wrap a
@ref{7d6,,BaseException}.
@end itemize

@node Library<75>,Core and Builtins<71>,Core and Builtins<70>,Python 3 12 0 alpha 3
@anchor{whatsnew/changelog id345}@anchor{1b08}
@subsubsection Library



@itemize -

@item 
gh-99547@footnote{https://github.com/python/cpython/issues/99547}: Add a function to os.path to check if a path is a junction:
isjunction. Add similar functionality to pathlib.Path as is_junction.

@item 
gh-99370@footnote{https://github.com/python/cpython/issues/99370}: Fix zip path for venv created from a non-installed python on
POSIX platforms.
@end itemize

@node Core and Builtins<71>,Library<76>,Library<75>,Python 3 12 0 alpha 3
@anchor{whatsnew/changelog id346}@anchor{1b09}
@subsubsection Core and Builtins



@itemize -

@item 
gh-99377@footnote{https://github.com/python/cpython/issues/99377}: Add audit events for thread creation and clear operations.

@item 
gh-98686@footnote{https://github.com/python/cpython/issues/98686}: Remove the @code{BINARY_OP_GENERIC} and @code{COMPARE_OP_GENERIC}
“specializations”.

@item 
gh-99298@footnote{https://github.com/python/cpython/issues/99298}: Remove the remaining error paths for attribute specializations,
and refuse to specialize attribute accesses on types that haven’t had
@ref{97f,,PyType_Ready()} called on them yet.

@item 
gh-99127@footnote{https://github.com/python/cpython/issues/99127}: Allow some features of @ref{e2,,syslog} to the main interpreter
only. Patch by Donghee Na.

@item 
gh-91053@footnote{https://github.com/python/cpython/issues/91053}: Optimizing interpreters and JIT compilers may need to invalidate
internal metadata when functions are modified. This change adds the
ability to provide a callback that will be invoked each time a function is
created, modified, or destroyed.

@item 
gh-90994@footnote{https://github.com/python/cpython/issues/90994}: Improve error messages when there’s a syntax error with call
arguments. The following three cases are covered: - No value is assigned
to a named argument, eg @code{foo(a=)}. - A value is assigned to a star
argument, eg @code{foo(*args=[0])}. - A value is assigned to a double-star
keyword argument, eg @code{foo(**kwarg=@{'a': 0@})}.

@item 
bpo-45026@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45026}: Optimize the @ref{b3d,,range} object iterator. It is now smaller,
faster iteration of ranges containing large numbers. Smaller pickles,
faster unpickling.

@item 
bpo-31718@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31718}: Raise @ref{2ec,,ValueError} instead of @ref{794,,SystemError} when
methods of uninitialized @ref{1766,,io.IncrementalNewlineDecoder} objects are
called. Patch by Oren Milman.

@item 
bpo-38031@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38031}: Fix a possible assertion failure in @ref{1514,,io.FileIO} when the
opener returns an invalid file descriptor.
@end itemize

@node Library<76>,Documentation<26>,Core and Builtins<71>,Python 3 12 0 alpha 3
@anchor{whatsnew/changelog id347}@anchor{1b0a}
@subsubsection Library



@itemize -

@item 
gh-100001@footnote{https://github.com/python/cpython/issues/100001}: Also escape s in the http.server
BaseHTTPRequestHandler.log_message so that it is technically possible to
parse the line and reconstruct what the original data was.  Without this a
xHH is ambiguous as to if it is a hex replacement we put in or the
characters r”x” came through in the original request line.

@item 
gh-99957@footnote{https://github.com/python/cpython/issues/99957}: Add @code{frozen_default} parameter to
@ref{6fa,,typing.dataclass_transform()}.

@item 
gh-79033@footnote{https://github.com/python/cpython/issues/79033}: Fix @ref{1a3f,,asyncio.Server.wait_closed()} to actually do what the
docs promise – wait for all existing connections to complete, after
closing the server.

@item 
gh-51524@footnote{https://github.com/python/cpython/issues/51524}: Fix bug when calling trace.CoverageResults with valid infile.

@item 
gh-99645@footnote{https://github.com/python/cpython/issues/99645}: Fix a bug in handling class cleanups in
@ref{2b3,,unittest.TestCase}.  Now @code{addClassCleanup()} uses separate lists
for different @code{TestCase} subclasses, and @code{doClassCleanups()} only
cleans up the particular class.

@item 
gh-99508@footnote{https://github.com/python/cpython/issues/99508}: Fix @code{TypeError} in @code{Lib/importlib/_bootstrap_external.py}
while calling @code{_imp.source_hash()}.

@item 
gh-66285@footnote{https://github.com/python/cpython/issues/66285}: Fix @ref{b,,asyncio} to not share event loop and signal wakeupfd
in forked processes. Patch by Kumar Aditya.

@item 
gh-97001@footnote{https://github.com/python/cpython/issues/97001}: Release the GIL when calling termios APIs to avoid blocking
threads.

@item 
gh-92647@footnote{https://github.com/python/cpython/issues/92647}: Use final status of an enum to determine lookup or creation
branch of functional API.

@item 
gh-99388@footnote{https://github.com/python/cpython/issues/99388}: Add `loop_factory' parameter to @ref{2f3,,asyncio.run()} to allow
specifying a custom event loop factory. Patch by Kumar Aditya.

@item 
gh-99341@footnote{https://github.com/python/cpython/issues/99341}: Fix @ref{1b0b,,ast.increment_lineno()} to also cover
@ref{1b0c,,ast.TypeIgnore} when changing line numbers.

@item 
gh-99382@footnote{https://github.com/python/cpython/issues/99382}: Check the number of arguments in substitution in user generics
containing a @ref{489,,TypeVarTuple} and one or more
@ref{487,,TypeVar}.

@item 
gh-99379@footnote{https://github.com/python/cpython/issues/99379}: Fix substitution of @ref{488,,ParamSpec} followed by
@ref{489,,TypeVarTuple} in generic aliases.

@item 
gh-99344@footnote{https://github.com/python/cpython/issues/99344}: Fix substitution of @ref{489,,TypeVarTuple} and
@ref{488,,ParamSpec} together in user generics.

@item 
gh-99284@footnote{https://github.com/python/cpython/issues/99284}: Remove @code{_use_broken_old_ctypes_structure_semantics_} old
untested and undocumented hack from @ref{2e,,ctypes}.

@item 
gh-99201@footnote{https://github.com/python/cpython/issues/99201}: Fix @ref{173a,,IndexError} when initializing the config variables on
Windows if @code{HAVE_DYNAMIC_LOADING} is not set.

@item 
gh-99240@footnote{https://github.com/python/cpython/issues/99240}: Fix double-free bug in Argument Clinic @code{str_converter} by
extracting memory clean up to a new @code{post_parsing} section.

@item 
gh-64490@footnote{https://github.com/python/cpython/issues/64490}: Fix refcount error when arguments are packed to tuple in
Argument Clinic.

@item 
gh-99029@footnote{https://github.com/python/cpython/issues/99029}: @ref{2fd,,pathlib.PurePath.relative_to()} now treats naked Windows
drive paths as relative. This brings its behaviour in line with other
parts of pathlib.

@item 
gh-98253@footnote{https://github.com/python/cpython/issues/98253}: The implementation of the typing module is now more resilient to
reference leaks in binary extension modules.

Previously, a reference leak in a typed C API-based extension module could
leak internals of the typing module, which could in turn introduce leaks
in essentially any other package with typed function signatures. Although
the typing package is not the original source of the problem, such
non-local dependences exacerbate debugging of large-scale projects, and
the implementation was therefore changed to reduce harm by providing
better isolation.

@item 
gh-98458@footnote{https://github.com/python/cpython/issues/98458}: Fix infinite loop in unittest when a self-referencing chained
exception is raised

@item 
gh-93453@footnote{https://github.com/python/cpython/issues/93453}: @ref{2f2,,asyncio.get_event_loop()} and many other @ref{b,,asyncio}
functions like @ref{e70,,asyncio.ensure_future()}, @ref{c64,,asyncio.shield()} or
@ref{812,,asyncio.gather()}, and also the
@code{get_event_loop()} method of
@code{asyncio.BaseDefaultEventLoopPolicy} now raise a
@ref{244,,RuntimeError} if called when there is no running event loop and the
current event loop was not set. Previously they implicitly created and set
a new current event loop. @ref{1a3,,DeprecationWarning} is no longer emitted
if there is no running event loop but the current event loop was set.

@item 
gh-97966@footnote{https://github.com/python/cpython/issues/97966}: On @code{uname_result}, restored expectation that @code{_fields} and
@code{_asdict} would include all six properties including @code{processor}.

@item 
gh-98248@footnote{https://github.com/python/cpython/issues/98248}: Provide informative error messages in @ref{147b,,struct.pack()} when
its integral arguments are not in range.

@item 
gh-98108@footnote{https://github.com/python/cpython/issues/98108}: @code{zipfile.Path} is now pickleable if its initialization
parameters were pickleable (e.g. for file system paths).

@item 
gh-98098@footnote{https://github.com/python/cpython/issues/98098}: Created packages from zipfile and test_zipfile modules,
separating @code{zipfile.Path} functionality.

@item 
gh-82836@footnote{https://github.com/python/cpython/issues/82836}: Fix @ref{19c3,,is_private} properties in the
@ref{84,,ipaddress} module. Previously non-private networks (0.0.0.0/0) would
return @code{True} from this method; now they correctly return @code{False}.

@item 
gh-96828@footnote{https://github.com/python/cpython/issues/96828}: Add an @ref{1b0d,,OP_ENABLE_KTLS} option for enabling the use
of the kernel TLS (kTLS). Patch by Illia Volochii.

@item 
gh-88863@footnote{https://github.com/python/cpython/issues/88863}: To avoid apparent memory leaks when
@ref{d0d,,asyncio.open_connection()} raises, break reference cycles generated
by local exception and future instances (which has exception instance as
its member var). Patch by Dong Uk, Kang.

@item 
gh-91078@footnote{https://github.com/python/cpython/issues/91078}: @code{TarFile.next()} now returns @code{None} when called on an
empty tarfile.

@item 
bpo-47220@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47220}: Document the optional `callback' parameter of
@code{WeakMethod}. Patch by Géry Ogam.

@item 
bpo-44817@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44817}: Ignore WinError 53 (ERROR_BAD_NETPATH), 65
(ERROR_NETWORK_ACCESS_DENIED) and 161 (ERROR_BAD_PATHNAME) when using
ntpath.realpath().

@item 
bpo-41260@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41260}: Rename the `fmt' parameter of the pure Python implementation of
@ref{e8e,,datetime.date.strftime()} to `format'.

@item 
bpo-15999@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15999}: All built-in functions now accept arguments of any type instead
of just @code{bool} and @code{int} for boolean parameters.
@end itemize

@node Documentation<26>,Tests<26>,Library<76>,Python 3 12 0 alpha 3
@anchor{whatsnew/changelog id348}@anchor{1b0e}
@subsubsection Documentation



@itemize -

@item 
gh-99931@footnote{https://github.com/python/cpython/issues/99931}: Use sphinxext-opengraph@footnote{https://sphinxext-opengraph.readthedocs.io/} to generate OpenGraph metadata@footnote{https://ogp.me/}.

@item 
gh-89682@footnote{https://github.com/python/cpython/issues/89682}: Reworded docstring of the default @code{__contains__} to clarify
that it returns a @ref{3c3,,bool}.

@item 
gh-88330@footnote{https://github.com/python/cpython/issues/88330}: Improved the description of what a resource is in
importlib.resources docs.

@item 
gh-92892@footnote{https://github.com/python/cpython/issues/92892}: Document that calling variadic functions with ctypes requires
special care on macOS/arm64 (and possibly other platforms).

@item 
bpo-41825@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41825}: Restructured the documentation for the @ref{f97,,os.wait*} family of functions, and improved the docs for
@ref{f98,,os.waitid()} with more explanation of the possible argument
constants.
@end itemize

@node Tests<26>,Build<30>,Documentation<26>,Python 3 12 0 alpha 3
@anchor{whatsnew/changelog id349}@anchor{1b0f}
@subsubsection Tests



@itemize -

@item 
gh-99892@footnote{https://github.com/python/cpython/issues/99892}: Skip test_normalization() of test_unicodedata if it fails to
download NormalizationTest.txt file from pythontest.net. Patch by Victor
Stinner.

@item 
gh-99934@footnote{https://github.com/python/cpython/issues/99934}: Correct test_marsh on (32 bit) x86: test_deterministic sets was
failing.

@item 
gh-99741@footnote{https://github.com/python/cpython/issues/99741}: We’ve implemented multi-phase init (PEP 489/630/687) for the
internal (for testing) _xxsubinterpreters module.

@item 
gh-99659@footnote{https://github.com/python/cpython/issues/99659}: Optional big memory tests in @code{test_sqlite3} now catch the
correct @code{sqlite.DataError} exception type in case of too large
strings and/or blobs passed.

@item 
gh-99593@footnote{https://github.com/python/cpython/issues/99593}: Cover the Unicode C API with tests.

@item 
gh-96002@footnote{https://github.com/python/cpython/issues/96002}: Add functional test for Argument Clinic.
@end itemize

@node Build<30>,Windows<27>,Tests<26>,Python 3 12 0 alpha 3
@anchor{whatsnew/changelog id350}@anchor{1b10}
@subsubsection Build



@itemize -

@item 
gh-99086@footnote{https://github.com/python/cpython/issues/99086}: Fix @code{-Wimplicit-int}, @code{-Wstrict-prototypes}, and
@code{-Wimplicit-function-declaration} compiler warnings in
@code{configure} checks.

@item 
gh-99337@footnote{https://github.com/python/cpython/issues/99337}: Fix a compilation issue with GCC 12 on macOS.

@item 
gh-99289@footnote{https://github.com/python/cpython/issues/99289}: Add a @code{COMPILEALL_OPTS} variable in Makefile to override
@ref{21,,compileall} options (default: @code{-j0}) in @code{make install}. Also
merged the @code{compileall} commands into a single command building .pyc
files for the all optimization levels (0, 1, 2) at once. Patch by Victor
Stinner.

@item 
gh-98872@footnote{https://github.com/python/cpython/issues/98872}: Fix a possible fd leak in @code{Programs/_freeze_module.c}
introduced in Python 3.11.

@item 
gh-88226@footnote{https://github.com/python/cpython/issues/88226}: Always define @code{TARGET_*} labels in @code{Python/ceval.c}, even if
@code{USE_COMPUTED_GOTOS} is disabled.  This allows breakpoints to be set at
those labels in (for instance) @code{gdb}.
@end itemize

@node Windows<27>,macOS<18>,Build<30>,Python 3 12 0 alpha 3
@anchor{whatsnew/changelog id351}@anchor{1b11}
@subsubsection Windows



@itemize -

@item 
gh-99345@footnote{https://github.com/python/cpython/issues/99345}: Use faster initialization functions to detect install location
for Windows Store package

@item 
gh-98629@footnote{https://github.com/python/cpython/issues/98629}: Fix initialization of @ref{49d,,sys.version} and @code{sys._git} on
Windows

@item 
gh-99442@footnote{https://github.com/python/cpython/issues/99442}: Fix handling in @ref{7d9,,Python install manager} when @code{argv[0]} does not
include a file extension.

@item 
bpo-40882@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40882}: Fix a memory leak in
@ref{19d8,,multiprocessing.shared_memory.SharedMemory} on Windows.
@end itemize

@node macOS<18>,Tools/Demos<23>,Windows<27>,Python 3 12 0 alpha 3
@anchor{whatsnew/changelog id352}@anchor{1b12}
@subsubsection macOS



@itemize -

@item 
gh-87235@footnote{https://github.com/python/cpython/issues/87235}: On macOS @code{python3 /dev/fd/9 9</path/to/script.py} failed for
any script longer than a couple of bytes.

@item 
gh-98940@footnote{https://github.com/python/cpython/issues/98940}: Fix @code{Mac/Extras.install.py} file filter bug.
@end itemize

@node Tools/Demos<23>,C API<28>,macOS<18>,Python 3 12 0 alpha 3
@anchor{whatsnew/changelog id353}@anchor{1b13}
@subsubsection Tools/Demos



@itemize -

@item 
gh-64490@footnote{https://github.com/python/cpython/issues/64490}: Argument Clinic varargs bugfixes


@itemize *

@item 
Fix out-of-bounds error in @code{_PyArg_UnpackKeywordsWithVararg()}.

@item 
Fix incorrect check which allowed more than one varargs in clinic.py.

@item 
Fix miscalculation of @code{noptargs} in generated code.

@item 
Do not generate @code{noptargs} when there is a vararg argument and no optional argument.
@end itemize
@end itemize

@node C API<28>,,Tools/Demos<23>,Python 3 12 0 alpha 3
@anchor{whatsnew/changelog id354}@anchor{1b14}
@subsubsection C API



@itemize -

@item 
gh-98680@footnote{https://github.com/python/cpython/issues/98680}: @code{PyBUF_*} constants were marked as part of Limited API of
Python 3.11+. These were available in 3.11.0 with
@ref{65e,,Py_LIMITED_API} defined for 3.11, and are necessary to use the
buffer API.

@item 
gh-99612@footnote{https://github.com/python/cpython/issues/99612}: Fix @ref{1b15,,PyUnicode_DecodeUTF8Stateful()} for ASCII-only data:
@code{*consumed} was not set.

@item 
gh-47146@footnote{https://github.com/python/cpython/issues/47146}: The @code{structmember.h} header is deprecated. Its non-deprecated
contents are now available just by including @code{Python.h}, with a @code{Py_}
prefix added if it was missing. (Deprecated contents are
@ref{7af,,T_OBJECT}, @ref{7b1,,T_NONE}, and no-op flags.) Patch by Petr
Viktorin, based on earlier work by Alexander Belopolsky and Matthias
Braun.
@end itemize

@node Python 3 12 0 alpha 2,Python 3 12 0 alpha 1,Python 3 12 0 alpha 3,Changelog
@anchor{whatsnew/changelog python-3-12-0-alpha-2}@anchor{1b16}
@subsection Python 3.12.0 alpha 2


`Release date: 2022-11-14'

@menu
* Security: Security<27>. 
* Core and Builtins: Core and Builtins<72>. 
* Build: Build<31>. 
* Core and Builtins: Core and Builtins<73>. 
* Library: Library<77>. 
* Documentation: Documentation<27>. 
* Tests: Tests<27>. 
* Build: Build<32>. 
* Windows: Windows<28>. 
* macOS: macOS<19>. 
* C API: C API<29>. 

@end menu

@node Security<27>,Core and Builtins<72>,,Python 3 12 0 alpha 2
@anchor{whatsnew/changelog id355}@anchor{1b17}
@subsubsection Security



@itemize -

@item 
gh-98433@footnote{https://github.com/python/cpython/issues/98433}: The IDNA codec decoder used on DNS hostnames by @ref{d1,,socket} or
@ref{b,,asyncio} related name resolution functions no longer involves a
quadratic algorithm. This prevents a potential CPU denial of service if an
out-of-spec excessive length hostname involving bidirectional characters
were decoded. Some protocols such as @ref{10e,,urllib} http @code{3@var{xx}}
redirects potentially allow for an attacker to supply such a name.

Individual labels within an IDNA encoded DNS name will now raise an error
early during IDNA decoding if they are longer than 1024 unicode characters
given that each decoded DNS label must be 63 or fewer characters and the
entire decoded DNS name is limited to 255. Only an application presenting
a hostname or label consisting primarily of 
@geindex RFC; RFC 3454
RFC 3454@footnote{https://datatracker.ietf.org/doc/html/rfc3454.html} section 3.1
“Nothing” characters to be removed would run into of this new limit. See
also 
@geindex RFC; RFC 5894
RFC 5894@footnote{https://datatracker.ietf.org/doc/html/rfc5894.html} section 6 and 
@geindex RFC; RFC 3491
RFC 3491@footnote{https://datatracker.ietf.org/doc/html/rfc3491.html}.

@item 
gh-98739@footnote{https://github.com/python/cpython/issues/98739}: Update bundled libexpat to 2.5.0
@end itemize

@node Core and Builtins<72>,Build<31>,Security<27>,Python 3 12 0 alpha 2
@anchor{whatsnew/changelog id356}@anchor{1b18}
@subsubsection Core and Builtins



@itemize -

@item 
gh-81057@footnote{https://github.com/python/cpython/issues/81057}: The docs clearly say that @ref{1b19,,PyImport_Inittab},
@ref{1b1a,,PyImport_AppendInittab()}, and @ref{1b1b,,PyImport_ExtendInittab()}
should not be used after @ref{460,,Py_Initialize()} has been called. We now
enforce this for the two functions.  Additionally, the runtime now uses an
internal copy of @code{PyImport_Inittab}, to guard against
modification.

@item 
gh-99298@footnote{https://github.com/python/cpython/issues/99298}: Fix an issue that could potentially cause incorrect error
handling for some bytecode instructions.

@item 
gh-99254@footnote{https://github.com/python/cpython/issues/99254}: The compiler now removes all unused constants from code objects
(except the first one, which may be a docstring).

@item 
gh-99205@footnote{https://github.com/python/cpython/issues/99205}: Fix an issue that prevented @ref{98f,,PyThreadState} and
@ref{aba,,PyInterpreterState} memory from being freed properly.

@item 
gh-81057@footnote{https://github.com/python/cpython/issues/81057}: The 18 global C variables holding the state of the allocators
have been moved to @code{_PyRuntimeState}.  This is a strictly internal
change with no change in behavior.

@item 
gh-99181@footnote{https://github.com/python/cpython/issues/99181}: Fix failure in @ref{1ac,,except*} with unhashable
exceptions.

@item 
gh-99204@footnote{https://github.com/python/cpython/issues/99204}: Fix calculation of @code{sys._base_executable} when inside a
POSIX virtual environment using copies of the python binary when the base
installation does not provide the executable name used by the venv.
Calculation will fall back to alternative names (“python<MAJOR>”,
“python<MAJOR>.<MINOR>”).

@item 
gh-96055@footnote{https://github.com/python/cpython/issues/96055}: Update @ref{5c,,faulthandler} to emit an error message with the
proper unexpected signal number. Patch by Donghee Na.

@item 
gh-99153@footnote{https://github.com/python/cpython/issues/99153}: Fix location of @ref{18e,,SyntaxError} for a @ref{8f7,,try} block
with both @ref{1ab,,except} and @ref{1ac,,except*}.

@item 
gh-98686@footnote{https://github.com/python/cpython/issues/98686}: Merge the adaptive opcode logic into each instruction’s
unquickened variant, and merge the logic in @code{EXTENDED_ARG_QUICK} into
@ref{1b1c,,EXTENDED_ARG}. With these changes, the quickening that happens at
code object creation is now only responsible for initializing warmup
counters and inserting superinstructions.

@item 
gh-99103@footnote{https://github.com/python/cpython/issues/99103}: Fix the error reporting positions of specialized traceback
anchors when the source line contains Unicode characters.

@item 
gh-99139@footnote{https://github.com/python/cpython/issues/99139}: Improve the error suggestion for @ref{452,,NameError} exceptions for
instances. Now if a @code{NameError} is raised in a method and the
instance has an attribute that’s exactly equal to the name in the
exception, the suggestion will include @code{self.<NAME>} instead of the
closest match in the method scope. Patch by Pablo Galindo

@item 
gh-98401@footnote{https://github.com/python/cpython/issues/98401}: Octal escapes with value larger than @code{0o377} (ex: @code{"\477"}),
deprecated in Python 3.11, now produce a @ref{1ae,,SyntaxWarning}, instead of
@ref{1a3,,DeprecationWarning}. In a future Python version they will be
eventually a @ref{18e,,SyntaxError}. Patch by Victor Stinner.

@item 
gh-98401@footnote{https://github.com/python/cpython/issues/98401}: A backslash-character pair that is not a valid escape sequence
now generates a @ref{1ae,,SyntaxWarning}, instead of
@ref{1a3,,DeprecationWarning}.  For example, @code{re.compile("\d+\.\d+")} now
emits a @code{SyntaxWarning} (@code{"\d"} is an invalid escape sequence), use
raw strings for regular expression: @code{re.compile(r"\d+\.\d+")}. In a
future Python version, @ref{18e,,SyntaxError} will eventually be raised,
instead of @code{SyntaxWarning}. Patch by Victor Stinner.

@item 
gh-96793@footnote{https://github.com/python/cpython/issues/96793}: Handle StopIteration and StopAsyncIteration raised in generator
or coroutines in the bytecode, rather than in wrapping C code.

@item 
gh-98931@footnote{https://github.com/python/cpython/issues/98931}: Improve the @ref{18e,,SyntaxError} error message when the user types
@code{import x from y} instead of @code{from y import x}. Patch by Pablo Galindo

@item 
gh-98852@footnote{https://github.com/python/cpython/issues/98852}: Fix subscription of type aliases containing bare generic types
or types like @ref{487,,TypeVar}: for example @code{tuple[A, T][int]}
and @code{tuple[TypeVar, T][int]}, where @code{A} is a generic type, and @code{T}
is a type variable.

@item 
gh-98925@footnote{https://github.com/python/cpython/issues/98925}: Lower the recursion depth for marshal on WASI to support
(in-development) wasmtime 2.0.

@item 
gh-98783@footnote{https://github.com/python/cpython/issues/98783}: Fix multiple crashes in debug mode when @code{str} subclasses are
used instead of @code{str} itself.

@item 
gh-98811@footnote{https://github.com/python/cpython/issues/98811}: Use complete source locations to simplify detection of
@code{__future__} imports which are not at the beginning of the file. Also
corrects the offset in the exception raised in one case, which was off by
one and impeded highlighting.

@item 
gh-96793@footnote{https://github.com/python/cpython/issues/96793}: Add specialization of @ref{1ac1,,FOR_ITER} for generators. Saves
multiple layers of dispatch and checking to get from the
@code{FOR_ITER} instruction in the caller to the @ref{5b9,,RESUME} in
the generator.

@item 
gh-98762@footnote{https://github.com/python/cpython/issues/98762}: Fix source locations of @ref{a0e,,match} sub-patterns.

@item 
gh-98586@footnote{https://github.com/python/cpython/issues/98586}: Added the methods @ref{77d,,PyObject_Vectorcall()} and
@ref{77e,,PyObject_VectorcallMethod()} to the @ref{774,,Limited API}
along with the auxiliary macro constant
@ref{77f,,PY_VECTORCALL_ARGUMENTS_OFFSET}.

The availability of these functions enables more efficient 
@geindex Python 향상 제안; PEP 590
PEP 590@footnote{https://peps.python.org/pep-0590/}
vector calls from binary extension modules that avoid argument
boxing/unboxing overheads.

@item 
gh-99257@footnote{https://github.com/python/cpython/issues/99257}: Fix an issue where member descriptors (such as those for
@ref{16f0,,__slots__}) could behave incorrectly or crash instead of
raising a @ref{198,,TypeError} when accessed via an instance of an invalid
type.

@item 
gh-93143@footnote{https://github.com/python/cpython/issues/93143}: Rather than changing @code{co_code}, the
interpreter will now display a @ref{4d8,,RuntimeWarning} and assign
@ref{884,,None} to any fast locals that are left unbound after jumps or
@ref{1b1d,,del} statements executed while tracing.

@item 
gh-96421@footnote{https://github.com/python/cpython/issues/96421}: When calling into Python code from C code, through
@ref{122d,,PyEval_EvalFrameEx()} or a related C-API function, a shim frame in
inserted into the call stack. This occurs in the
@code{_PyEval_EvalFrameDefault()} function. The extra frame should be
invisible to all Python and most C extensions, but out-of-process
profilers and debuggers need to be aware of it. These shim frames can be
detected by checking @code{frame->owner == FRAME_OWNED_BY_CSTACK}.

Extensions implementing their own interpreters using PEP 523 need to be
aware of this shim frame and the changes to the semantics of
@ref{1b1e,,RETURN_VALUE}, @ref{1a39,,YIELD_VALUE}, and
@ref{90a,,RETURN_GENERATOR}, which now clear the frame.
@end itemize

@node Build<31>,Core and Builtins<73>,Core and Builtins<72>,Python 3 12 0 alpha 2
@anchor{whatsnew/changelog id357}@anchor{1b1f}
@subsubsection Build



@itemize -

@item 
gh-98415@footnote{https://github.com/python/cpython/issues/98415}: Fix detection of MAC addresses for @ref{116,,uuid} on certain OSs.
Patch by Chaim Sanders
@end itemize

@node Core and Builtins<73>,Library<77>,Build<31>,Python 3 12 0 alpha 2
@anchor{whatsnew/changelog id358}@anchor{1b20}
@subsubsection Core and Builtins



@itemize -

@item 
gh-98686@footnote{https://github.com/python/cpython/issues/98686}: Quicken all code objects, and specialize adaptive bytecode
instructions more aggressively.

@item 
gh-92119@footnote{https://github.com/python/cpython/issues/92119}: Print exception class name instead of its string representation
when raising errors from @ref{2e,,ctypes} calls.

@item 
gh-91058@footnote{https://github.com/python/cpython/issues/91058}: @ref{659,,ImportError} raised from failed @code{from <module> import
<name>} now include suggestions for the value of @code{<name>} based on the
available names in @code{<module>}. Patch by Pablo Galindo

@item 
gh-96793@footnote{https://github.com/python/cpython/issues/96793}: The @ref{1ac1,,FOR_ITER} now leaves the iterator on the stack on
termination of the loop. This is to assist specialization of loops for
generators.

@item 
gh-90716@footnote{https://github.com/python/cpython/issues/90716}: Add _pylong.py module.  It includes asymptotically faster
algorithms that can be used for operations on integers with many digits.
It is used by longobject.c to speed up some operations.

@item 
gh-95389@footnote{https://github.com/python/cpython/issues/95389}: Expose @ref{1b21,,ETH_P_ALL} and some of the
@ref{1b22,,ETHERTYPE_* constants} in @ref{d1,,socket}.
Patch by Noam Cohen.
@end itemize

@node Library<77>,Documentation<27>,Core and Builtins<73>,Python 3 12 0 alpha 2
@anchor{whatsnew/changelog id359}@anchor{1b23}
@subsubsection Library



@itemize -

@item 
gh-93696@footnote{https://github.com/python/cpython/issues/93696}: Allow @ref{aa,,pdb} to locate source for frozen modules in the
standard library.

@item 
gh-99418@footnote{https://github.com/python/cpython/issues/99418}: Fix bug in @ref{362,,urllib.parse.urlparse()} that causes URL schemes
that begin with a digit, a plus sign, or a minus sign to be parsed
incorrectly.

@item 
gh-94597@footnote{https://github.com/python/cpython/issues/94597}: Deprecate @code{asyncio.AbstractChildWatcher} to be removed in
Python 3.14. Patch by Kumar Aditya.

@item 
gh-99305@footnote{https://github.com/python/cpython/issues/99305}: Improve performance of @ref{1b24,,secrets.token_hex()}.

@item 
gh-74044@footnote{https://github.com/python/cpython/issues/74044}: Fixed bug where @ref{22f,,inspect.signature()} reported incorrect
arguments for decorated methods.

@item 
gh-99275@footnote{https://github.com/python/cpython/issues/99275}: Fix @code{SystemError} in @ref{2e,,ctypes} when exception was not set
during @code{__initsubclass__}.

@item 
gh-99277@footnote{https://github.com/python/cpython/issues/99277}: Remove older version of
@code{_SSLProtocolTransport.get_write_buffer_limits} in
@code{asyncio.sslproto}

@item 
gh-99248@footnote{https://github.com/python/cpython/issues/99248}: fix negative numbers failing in verify()

@item 
gh-99155@footnote{https://github.com/python/cpython/issues/99155}: Fix @ref{c2c,,statistics.NormalDist} pickle with @code{0} and @code{1}
protocols.

@item 
gh-93464@footnote{https://github.com/python/cpython/issues/93464}: @code{enum.auto()} is now correctly activated when combined with
other assignment values.  E.g. @code{ONE = auto(), 'some text'} will now
evaluate as @code{(1, 'some text')}.

@item 
gh-99134@footnote{https://github.com/python/cpython/issues/99134}: Update the bundled copy of pip to version 22.3.1.

@item 
gh-92584@footnote{https://github.com/python/cpython/issues/92584}: Remove the @code{distutils} package. It was deprecated in Python
3.10 by 
@geindex Python 향상 제안; PEP 632
PEP 632@footnote{https://peps.python.org/pep-0632/} “Deprecate distutils module”. For projects still using
@code{distutils} and cannot be updated to something else, the @code{setuptools}
project can be installed: it still provides @code{distutils}. Patch by Victor
Stinner.

@item 
gh-98999@footnote{https://github.com/python/cpython/issues/98999}: Now @code{_pyio} is consistent with @code{_io} in raising
@code{ValueError} when executing methods over closed buffers.

@item 
gh-83004@footnote{https://github.com/python/cpython/issues/83004}: Clean up refleak on failed module initialisation in
@code{_zoneinfo}

@item 
gh-83004@footnote{https://github.com/python/cpython/issues/83004}: Clean up refleaks on failed module initialisation in
@code{_pickle}

@item 
gh-83004@footnote{https://github.com/python/cpython/issues/83004}: Clean up refleak on failed module initialisation in @code{_io}.

@item 
gh-98897@footnote{https://github.com/python/cpython/issues/98897}: Fix memory leak in @ref{bf4,,math.dist()} when both points don’t have
the same dimension. Patch by Kumar Aditya.

@item 
gh-98878@footnote{https://github.com/python/cpython/issues/98878}: Use the frame bound builtins when offering a name suggestion in
@ref{104,,traceback} to prevent crashing when @code{__builtins__} is not a dict.

@item 
gh-98139@footnote{https://github.com/python/cpython/issues/98139}: In @code{importlib._bootstrap}, enhance namespace package repr
to @code{<module 'x' (namespace) from ['path']>}.

@item 
gh-90352@footnote{https://github.com/python/cpython/issues/90352}: Fix @code{_SelectorDatagramTransport} to inherit from
@ref{1b25,,DatagramTransport} in @ref{b,,asyncio}. Patch by Kumar
Aditya.

@item 
gh-98793@footnote{https://github.com/python/cpython/issues/98793}: Fix argument typechecks in @code{_overlapped.WSAConnect()} and
@code{_overlapped.Overlapped.WSASendTo()} functions.

@item 
gh-98744@footnote{https://github.com/python/cpython/issues/98744}: Prevent crashing in @ref{104,,traceback} when retrieving the
byte-offset for some source files that contain certain unicode characters.

@item 
gh-98740@footnote{https://github.com/python/cpython/issues/98740}: Fix internal error in the @ref{be,,re} module which in very rare
circumstances prevented compilation of a regular expression containing a
@ref{1b26,,conditional expression} without the
“else” branch.

@item 
gh-98703@footnote{https://github.com/python/cpython/issues/98703}: Fix @ref{1b27,,asyncio.StreamWriter.drain()} to call
@code{protocol.connection_lost} callback only once on Windows.

@item 
gh-98624@footnote{https://github.com/python/cpython/issues/98624}: Add a mutex to unittest.mock.NonCallableMock to protect
concurrent access to mock attributes.

@item 
gh-98658@footnote{https://github.com/python/cpython/issues/98658}: The @ref{4c0,,array.array} class now supports subscripting, making
it a @ref{1a1,,generic type}.

@item 
gh-98284@footnote{https://github.com/python/cpython/issues/98284}: Improved @ref{198,,TypeError} message for undefined abstract
methods of a @ref{1119,,abc.ABC} instance. The names of the missing methods
are surrounded by single-quotes to highlight them.

@item 
gh-96151@footnote{https://github.com/python/cpython/issues/96151}: Allow @code{BUILTINS} to be a valid field name for frozen
dataclasses.

@item 
gh-98086@footnote{https://github.com/python/cpython/issues/98086}: Make sure @code{patch.dict()} can be applied on async functions.

@item 
gh-72719@footnote{https://github.com/python/cpython/issues/72719}: Remove modules @code{asyncore} and @code{asynchat}, which were
deprecated by 
@geindex Python 향상 제안; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/}.

@item 
gh-96192@footnote{https://github.com/python/cpython/issues/96192}: Fix handling of @code{bytes} @ref{5a0,,path-like objects} in @code{os.ismount()}.

@item 
gh-94172@footnote{https://github.com/python/cpython/issues/94172}: @ref{62,,ftplib}: Remove the @code{FTP_TLS.ssl_version} class
attribute: use the `context' parameter instead. Patch by Victor Stinner

@item 
gh-94172@footnote{https://github.com/python/cpython/issues/94172}: Remove the `keyfile' and `certfile' parameters from the
@ref{62,,ftplib}, @ref{78,,imaplib}, @ref{b1,,poplib} and @ref{cf,,smtplib} modules,
and the `key_file', `cert_file' and `check_hostname' parameters from the
@ref{73,,http.client} module, all deprecated since Python 3.6. Use the
`context' parameter (`ssl_context' in @code{imaplib}) instead. Patch by
Victor Stinner.

@item 
gh-83638@footnote{https://github.com/python/cpython/issues/83638}: Add the @ref{6dc,,autocommit} attribute to
@ref{54c,,sqlite3.Connection} and the `autocommit' parameter to
@ref{5a5,,sqlite3.connect()} to control 
@geindex Python 향상 제안; PEP 249
PEP 249@footnote{https://peps.python.org/pep-0249/}-compliant @ref{6dd,,transaction handling}. Patch by Erlend E.
Aasland.

@item 
gh-92452@footnote{https://github.com/python/cpython/issues/92452}: Fixed a race condition that could cause
@ref{174,,sysconfig.get_config_var()} to incorrectly return @ref{884,,None} in
multi-threaded programs.

@item 
gh-91803@footnote{https://github.com/python/cpython/issues/91803}: Fix an error when using a method of objects mocked with
@ref{1935,,unittest.mock.create_autospec()} after it was sealed with
@ref{d99,,unittest.mock.seal()} function.

@item 
bpo-38523@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38523}: @ref{c1d,,shutil.copytree()} now applies the
`ignore_dangling_symlinks' argument recursively.

@item 
bpo-40358@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40358}: Add walk_up argument in @ref{2fd,,pathlib.PurePath.relative_to()}.

@item 
bpo-36267@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36267}: Fix IndexError in @ref{1bd,,argparse.ArgumentParser} when a
@code{store_true} action is given an explicit argument.
@end itemize

@node Documentation<27>,Tests<27>,Library<77>,Python 3 12 0 alpha 2
@anchor{whatsnew/changelog id360}@anchor{1b28}
@subsubsection Documentation



@itemize -

@item 
gh-98832@footnote{https://github.com/python/cpython/issues/98832}: Changes wording of docstring for @ref{26e,,pathlib.Path.iterdir()}.

@item 
gh-97966@footnote{https://github.com/python/cpython/issues/97966}: Update uname docs to clarify the special nature of the platform
attribute and to indicate when it became late-bound.
@end itemize

@node Tests<27>,Build<32>,Documentation<27>,Python 3 12 0 alpha 2
@anchor{whatsnew/changelog id361}@anchor{1b29}
@subsubsection Tests



@itemize -

@item 
gh-98903@footnote{https://github.com/python/cpython/issues/98903}: The Python test suite now fails with exit code 4 if no tests
ran. It should help detecting typos in test names and test methods.

@item 
gh-98713@footnote{https://github.com/python/cpython/issues/98713}: Fix a bug in the @ref{10a,,typing} tests where a test relying on
CPython-specific implementation details was not decorated with
@code{@@cpython_only} and was not skipped on other implementations.

@item 
gh-87390@footnote{https://github.com/python/cpython/issues/87390}: Add tests for star-unpacking with PEP 646, and some other
miscellaneous PEP 646 tests.

@item 
gh-96853@footnote{https://github.com/python/cpython/issues/96853}: Added explicit coverage of @code{Py_Initialize} (and hence
@code{Py_InitializeEx}) back to the embedding tests (all other embedding
tests migrated to @code{Py_InitializeFromConfig} in Python 3.11)

@item 
bpo-34272@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34272}: Some C API tests were moved into the new Lib/test/test_capi/
directory.
@end itemize

@node Build<32>,Windows<28>,Tests<27>,Python 3 12 0 alpha 2
@anchor{whatsnew/changelog id362}@anchor{1b2a}
@subsubsection Build



@itemize -

@item 
gh-99086@footnote{https://github.com/python/cpython/issues/99086}: Fix @code{-Wimplicit-int} compiler warning in @code{configure}
check for @code{PTHREAD_SCOPE_SYSTEM}.

@item 
gh-99016@footnote{https://github.com/python/cpython/issues/99016}: Fix build with @code{PYTHON_FOR_REGEN=python3.8}.

@item 
gh-97731@footnote{https://github.com/python/cpython/issues/97731}: Specify the full path to the source location for @code{make
docclean} (needed for cross-builds).

@item 
gh-98949@footnote{https://github.com/python/cpython/issues/98949}: Drop unused build dependency on @code{readelf}.

@item 
gh-98989@footnote{https://github.com/python/cpython/issues/98989}: Use @code{python3.11}, if available, for regeneration and freezing.

@item 
gh-98831@footnote{https://github.com/python/cpython/issues/98831}: Add new tooling, in @code{Tools/cases_generator}, to generate the
interpreter switch statement from a list of opcode definitions. This only
affects adding, modifying or removing instruction definitions. The
instruction definitions now live in @code{Python/bytecodes.c}, in the form of
a custom DSL (under development)@footnote{https://github.com/faster-cpython/ideas/blob/main/3.12/interpreter_definition.md}.
The tooling reads this file and writes @code{Python/generated_cases.c.h},
which is then included by @code{Python/ceval.c} to provide most of the cases
of the main interpreter switch.

@item 
gh-98817@footnote{https://github.com/python/cpython/issues/98817}: Remove PCbuild/lib.pyproj: it’s not used for anything, is only a
minor convenience for Visual Studio users (who probably mostly don’t even
know about it), and it takes a lot of maintenance effort to keep updated.

@item 
gh-98776@footnote{https://github.com/python/cpython/issues/98776}: Fix @code{make regen-test-levenshtein} for out-of-tree builds.

@item 
gh-98707@footnote{https://github.com/python/cpython/issues/98707}: Don’t use vendored @code{libmpdec} headers if
@ref{655,,--with-system-libmpdec} is passed to @code{configure}. Don’t
use vendored @code{libexpat} headers if @ref{1b2b,,--with-system-expat} is
passed to @code{configure}.
@end itemize

@node Windows<28>,macOS<19>,Build<32>,Python 3 12 0 alpha 2
@anchor{whatsnew/changelog id363}@anchor{1b2c}
@subsubsection Windows



@itemize -

@item 
gh-98689@footnote{https://github.com/python/cpython/issues/98689}: Update Windows builds to zlib v1.2.13.  v1.2.12 has
@geindex Common Vulnerabilities and Exposures; CVE 2022-37434
CVE 2022-37434@footnote{https://www.cve.org/CVERecord?id=CVE-2022-37434}, but the vulnerable @code{inflateGetHeader} API is not used
by Python.

@item 
gh-98790@footnote{https://github.com/python/cpython/issues/98790}: Assumes that a missing @code{DLLs} directory means that standard
extension modules are in the executable’s directory.

@item 
gh-98745@footnote{https://github.com/python/cpython/issues/98745}: Update @code{py.exe} launcher to install 3.11 by default and
3.12 on request.

@item 
gh-98692@footnote{https://github.com/python/cpython/issues/98692}: Fix the @ref{7d9,,Python install manager} ignoring unrecognized shebang lines
instead of treating them as local paths

@item 
gh-94328@footnote{https://github.com/python/cpython/issues/94328}: Update Windows installer to use SQLite 3.39.4.
@end itemize

@node macOS<19>,C API<29>,Windows<28>,Python 3 12 0 alpha 2
@anchor{whatsnew/changelog id364}@anchor{1b2d}
@subsubsection macOS



@itemize -

@item 
gh-94328@footnote{https://github.com/python/cpython/issues/94328}: Update macOS installer to SQLite 3.39.4.
@end itemize

@node C API<29>,,macOS<19>,Python 3 12 0 alpha 2
@anchor{whatsnew/changelog id365}@anchor{1b2e}
@subsubsection C API



@itemize -

@item 
gh-98724@footnote{https://github.com/python/cpython/issues/98724}: The @ref{797,,Py_CLEAR}, @ref{798,,Py_SETREF} and
@ref{799,,Py_XSETREF} macros now only evaluate their argument once. If the
argument has side effects, these side effects are no longer duplicated.
Patch by Victor Stinner.

@item 
gh-98978@footnote{https://github.com/python/cpython/issues/98978}: Fix use-after-free in @code{Py_SetPythonHome(NULL)},
@code{Py_SetProgramName(NULL)} and @code{_Py_SetProgramFullPath(NULL)} function
calls. Issue reported by Benedikt Reinartz. Patch by Victor Stinner.

@item 
gh-98410@footnote{https://github.com/python/cpython/issues/98410}: Add @code{getbufferproc} and @code{releasebufferproc} to the stable
API.

@item 
gh-98610@footnote{https://github.com/python/cpython/issues/98610}: Some configurable capabilities of sub-interpreters have changed.
They always allow subprocesses (@ref{dc,,subprocess}) now, whereas before
subprocesses could be optionally disallowed for a sub-interpreter. Instead
@code{os.exec()} can now be disallowed. Disallowing daemon threads is now
supported.  Disallowing all threads is still allowed, but is never done by
default. Note that the optional restrictions are only available through
@code{_Py_NewInterpreterFromConfig()}, which isn’t a public API. They do not
affect the main interpreter, nor @ref{1b2f,,Py_NewInterpreter()}.

@item 
gh-98608@footnote{https://github.com/python/cpython/issues/98608}: A @code{_PyInterpreterConfig} has been added and
@code{_Py_NewInterpreter()} has been renamed to
@code{_Py_NewInterpreterFromConfig()}.  The “isolated_subinterpreters”
argument is now a granular config that captures the previous behavior.
Note that this is all “private” API.

@item 
gh-96853@footnote{https://github.com/python/cpython/issues/96853}: @code{Py_InitializeEx} now correctly calls @code{PyConfig_Clear} after
initializing the interpreter (the omission didn’t cause a memory leak only
because none of the dynamically allocated config fields are populated by
the wrapper function)

@item 
gh-91248@footnote{https://github.com/python/cpython/issues/91248}: Add @ref{788,,PyFrame_GetVar()} and @ref{789,,PyFrame_GetVarString()}
functions to get a frame variable by its name. Patch by Victor Stinner.
@end itemize

@node Python 3 12 0 alpha 1,Python 3 11 0 beta 1,Python 3 12 0 alpha 2,Changelog
@anchor{whatsnew/changelog python-3-12-0-alpha-1}@anchor{1b30}
@subsection Python 3.12.0 alpha 1


`Release date: 2022-10-25'

@menu
* Security: Security<28>. 
* Core and Builtins: Core and Builtins<74>. 
* Library: Library<78>. 
* Core and Builtins: Core and Builtins<75>. 
* Library: Library<79>. 
* Core and Builtins: Core and Builtins<76>. 
* Library: Library<80>. 
* Core and Builtins: Core and Builtins<77>. 
* Library: Library<81>. 
* Core and Builtins: Core and Builtins<78>. 
* Library: Library<82>. 
* Core and Builtins: Core and Builtins<79>. 
* Library: Library<83>. 
* Core and Builtins: Core and Builtins<80>. 
* Library: Library<84>. 
* Core and Builtins: Core and Builtins<81>. 
* Library: Library<85>. 
* Core and Builtins: Core and Builtins<82>. 
* Library: Library<86>. 
* Core and Builtins: Core and Builtins<83>. 
* Library: Library<87>. 
* Documentation: Documentation<28>. 
* Tests: Tests<28>. 
* Build: Build<33>. 
* Windows: Windows<29>. 
* macOS: macOS<20>. 
* IDLE: IDLE<15>. 
* Tools/Demos: Tools/Demos<24>. 
* C API: C API<30>. 

@end menu

@node Security<28>,Core and Builtins<74>,,Python 3 12 0 alpha 1
@anchor{whatsnew/changelog id366}@anchor{1b31}
@subsubsection Security



@itemize -

@item 
gh-97616@footnote{https://github.com/python/cpython/issues/97616}: Fix multiplying a list by an integer (@code{list *= int}): detect
the integer overflow when the new allocated length is close to the maximum
size. Issue reported by Jordan Limor.  Patch by Victor Stinner.

@item 
gh-97514@footnote{https://github.com/python/cpython/issues/97514}: On Linux the @ref{98,,multiprocessing} module returns to using
filesystem backed unix domain sockets for communication with the
`forkserver' process instead of the Linux abstract socket namespace.  Only
code that chooses to use the @ref{1d5,,“forkserver” start method} is affected.

Abstract sockets have no permissions and could allow any user on the
system in the same network namespace@footnote{https://man7.org/linux/man-pages/man7/network_namespaces.7.html} (often
the whole system) to inject code into the multiprocessing `forkserver'
process. This was a potential privilege escalation. Filesystem based
socket permissions restrict this to the `forkserver' process user as was
the default in Python 3.8 and earlier.

This prevents Linux 
@geindex Common Vulnerabilities and Exposures; CVE 2022-42919
CVE 2022-42919@footnote{https://www.cve.org/CVERecord?id=CVE-2022-42919}.

@item 
gh-87389@footnote{https://github.com/python/cpython/issues/87389}: @ref{76,,http.server}: Fix an open redirection vulnerability in the
HTTP server when an URI path starts with @code{//}.  Vulnerability
discovered, and initial fix proposed, by Hamza Avvan.

@item 
gh-79096@footnote{https://github.com/python/cpython/issues/79096}: LWPCookieJar and MozillaCookieJar create files with file mode
600 instead of 644 (Microsoft Windows is not affected)

@item 
gh-92888@footnote{https://github.com/python/cpython/issues/92888}: Fix @code{memoryview} use after free when accessing the backing
buffer in certain cases.

@item 
gh-68966@footnote{https://github.com/python/cpython/issues/68966}: The deprecated mailcap module now refuses to inject unsafe text
(filenames, MIME types, parameters) into shell commands. Instead of using
such text, it will warn and act as if a match was not found (or for test
commands, as if the test failed).
@end itemize

@node Core and Builtins<74>,Library<78>,Security<28>,Python 3 12 0 alpha 1
@anchor{whatsnew/changelog id367}@anchor{1b32}
@subsubsection Core and Builtins



@itemize -

@item 
gh-98374@footnote{https://github.com/python/cpython/issues/98374}: Suppress ImportError for invalid query for help() command. Patch
by Donghee Na.

@item 
gh-98461@footnote{https://github.com/python/cpython/issues/98461}: Fix source location in bytecode for list, set and dict
comprehensions as well as generator expressions.

@item 
gh-98354@footnote{https://github.com/python/cpython/issues/98354}: Added unicode check for @code{name} attribute of @code{spec} argument
passed in @code{_imp.create_builtin()} function.

@item 
gh-98398@footnote{https://github.com/python/cpython/issues/98398}: Fix source location of ‘assert’ bytecodes.

@item 
gh-98390@footnote{https://github.com/python/cpython/issues/98390}: Fix location of sub-expressions of boolean expressions, by
reducing their scope to that of the sub-expression.

@item 
gh-98254@footnote{https://github.com/python/cpython/issues/98254}: Modules from the standard library are now potentially suggested
as part of the error messages displayed by the interpreter when an
@ref{452,,NameError} is raised to the top level. Patch by Pablo Galindo

@item 
gh-97997@footnote{https://github.com/python/cpython/issues/97997}: Add running column offset to the tokenizer state to avoid
calculating AST column information with pointer arithmetic.

@item 
gh-97973@footnote{https://github.com/python/cpython/issues/97973}: Modify the tokenizer to return all necessary information the
parser needs to set location information in the AST nodes, so that the
parser does not have to calculate those doing pointer arithmetic.
@end itemize

@node Library<78>,Core and Builtins<75>,Core and Builtins<74>,Python 3 12 0 alpha 1
@anchor{whatsnew/changelog id368}@anchor{1b33}
@subsubsection Library



@itemize -

@item 
gh-96078@footnote{https://github.com/python/cpython/issues/96078}: @ref{1316,,os.sched_yield()} now release the GIL while calling
sched_yield(2). Patch by Donghee Na.

@item 
gh-97955@footnote{https://github.com/python/cpython/issues/97955}: Migrate @ref{13a,,zoneinfo} to Argument Clinic.
@end itemize

@node Core and Builtins<75>,Library<79>,Library<78>,Python 3 12 0 alpha 1
@anchor{whatsnew/changelog id369}@anchor{1b34}
@subsubsection Core and Builtins



@itemize -

@item 
gh-97912@footnote{https://github.com/python/cpython/issues/97912}: The compiler now avoids quadratic behavior when finding which
instructions should use the @ref{70a,,LOAD_FAST_CHECK} opcode.

@item 
gh-97002@footnote{https://github.com/python/cpython/issues/97002}: Fix an issue where several frame objects could be backed by the
same interpreter frame, possibly leading to corrupted memory and hard
crashes of the interpreter.

@item 
gh-97943@footnote{https://github.com/python/cpython/issues/97943}: Bugfix: @ref{1b35,,PyFunction_GetAnnotations()} should return a
borrowed reference. It was returning a new reference.

@item 
gh-97922@footnote{https://github.com/python/cpython/issues/97922}: The Garbage Collector now runs only on the eval breaker
mechanism of the Python bytecode evaluation loop instead on object
allocations. The GC can also run when @ref{692,,PyErr_CheckSignals()} is
called so C extensions that need to run for a long time without executing
any Python code also have a chance to execute the GC periodically.

@item 
gh-65961@footnote{https://github.com/python/cpython/issues/65961}: When @code{__package__} is different than @code{__spec__.parent},
raise a @code{DeprecationWarning} instead of @code{ImportWarning}.

Also remove @code{importlib.util.set_package()} which was scheduled for
removal.

@item 
gh-97850@footnote{https://github.com/python/cpython/issues/97850}: Long deprecated, @code{module_repr()} should now be completely
eradicated.

@item 
gh-86298@footnote{https://github.com/python/cpython/issues/86298}: In cases where @code{warnings.warn_explicit()} consults the
module’s loader, an @code{DeprecationWarning} is issued when @code{m.__loader__}
differs from @code{m.__spec__.loader}.

@item 
gh-97779@footnote{https://github.com/python/cpython/issues/97779}: Ensure that all Python frame objects are backed by “complete”
frames.

@item 
gh-91052@footnote{https://github.com/python/cpython/issues/91052}: Add API for subscribing to modification events on selected
dictionaries.

@item 
gh-97752@footnote{https://github.com/python/cpython/issues/97752}: Fix possible data corruption or crashes when accessing the
@code{f_back} member of newly-created generator or coroutine frames.

@item 
gh-97591@footnote{https://github.com/python/cpython/issues/97591}: Fixed a missing incref/decref pair in
@code{Exception.__setstate__()}. Patch by Ofey Chan.

@item 
gh-97670@footnote{https://github.com/python/cpython/issues/97670}: Remove the @code{sys.getdxp()} function and the
@code{Tools/scripts/analyze_dxp.py} script. DXP stands for “dynamic execution
pairs”. They were related to @code{DYNAMIC_EXECUTION_PROFILE} and @code{DXPAIRS}
macros which have been removed in Python 3.11. Python can now be built
with @ref{1b36,,./configure --enable-pystats} to gather
statistics on Python opcodes.  Patch by Victor Stinner.

@item 
gh-94526@footnote{https://github.com/python/cpython/issues/94526}: Fix the Python path configuration used to initialized
@ref{3e4,,sys.path} at Python startup. Paths are no longer encoded to
UTF-8/strict to avoid encoding errors if it contains surrogate characters
(bytes paths are decoded with the surrogateescape error handler). Patch by
Victor Stinner.

@item 
gh-96670@footnote{https://github.com/python/cpython/issues/96670}: The parser now raises @ref{18e,,SyntaxError} when parsing source
code containing null bytes. Patch by Pablo Galindo

@item 
gh-96975@footnote{https://github.com/python/cpython/issues/96975}: Fix a crash occurring when @ref{1b37,,PyEval_GetFrame()} is called
while the topmost Python frame is in a partially-initialized state.

@item 
gh-96848@footnote{https://github.com/python/cpython/issues/96848}: Fix command line parsing: reject @ref{16f,,-X int_max_str_digits} option with no value (invalid) when the
@geindex PYTHONINTMAXSTRDIGITS
@geindex 환경 변수; PYTHONINTMAXSTRDIGITS
@ref{1b38,,PYTHONINTMAXSTRDIGITS} environment variable is set to a valid
limit. Patch by Victor Stinner.

@item 
gh-95921@footnote{https://github.com/python/cpython/issues/95921}: Fix overly-broad source position information for chained
comparisons used as branching conditions.
@end itemize

@node Library<79>,Core and Builtins<76>,Core and Builtins<75>,Python 3 12 0 alpha 1
@anchor{whatsnew/changelog id370}@anchor{1b39}
@subsubsection Library



@itemize -

@item 
gh-96821@footnote{https://github.com/python/cpython/issues/96821}: Fix undefined behaviour in @code{audioop.c}.
@end itemize

@node Core and Builtins<76>,Library<80>,Library<79>,Python 3 12 0 alpha 1
@anchor{whatsnew/changelog id371}@anchor{1b3a}
@subsubsection Core and Builtins



@itemize -

@item 
gh-96821@footnote{https://github.com/python/cpython/issues/96821}: Fix undefined behaviour in @code{_testcapimodule.c}.

@item 
gh-95778@footnote{https://github.com/python/cpython/issues/95778}: When @ref{2ec,,ValueError} is raised if an integer is larger than
the limit, mention the @ref{18f2,,sys.set_int_max_str_digits()} function in the
error message. Patch by Victor Stinner.

@item 
gh-96387@footnote{https://github.com/python/cpython/issues/96387}: At Python exit, sometimes a thread holding the GIL can wait
forever for a thread (usually a daemon thread) which requested to drop the
GIL, whereas the thread already exited. To fix the race condition, the
thread which requested the GIL drop now resets its request before exiting.
Issue discovered and analyzed by Mingliang ZHAO. Patch by Victor Stinner.

@item 
gh-96864@footnote{https://github.com/python/cpython/issues/96864}: Fix a possible assertion failure, fatal error, or
@ref{794,,SystemError} if a line tracing event raises an exception while
opcode tracing is enabled.

@item 
gh-95778@footnote{https://github.com/python/cpython/issues/95778}: The @code{PyLong_FromString} function was refactored to make it
more maintainable and extensible.

@item 
gh-96678@footnote{https://github.com/python/cpython/issues/96678}: Fix undefined behaviour in C code of null pointer arithmetic.

@item 
gh-96754@footnote{https://github.com/python/cpython/issues/96754}: Make sure that all frame objects created are created from valid
interpreter frames. Prevents the possibility of invalid frames in
backtraces and signal handlers.

@item 
gh-90997@footnote{https://github.com/python/cpython/issues/90997}: Improve the performance of reading and writing inline bytecode
caches on some platforms.

@item 
gh-96751@footnote{https://github.com/python/cpython/issues/96751}: Remove dead code from @code{CALL_FUNCTION_EX} opcode.

@item 
gh-90751@footnote{https://github.com/python/cpython/issues/90751}: @ref{165,,memoryview} now supports half-floats. Patch by Donghee
Na and Antoine Pitrou.

@item 
gh-96678@footnote{https://github.com/python/cpython/issues/96678}: Fix case of undefined behavior in ceval.c
@end itemize

@node Library<80>,Core and Builtins<77>,Core and Builtins<76>,Python 3 12 0 alpha 1
@anchor{whatsnew/changelog id372}@anchor{1b3b}
@subsubsection Library



@itemize -

@item 
gh-64373@footnote{https://github.com/python/cpython/issues/64373}: Convert @code{_functools} to argument clinic.

@item 
gh-96641@footnote{https://github.com/python/cpython/issues/96641}: Do not expose @code{KeyWrapper} in @code{_functools}.
@end itemize

@node Core and Builtins<77>,Library<81>,Library<80>,Python 3 12 0 alpha 1
@anchor{whatsnew/changelog id373}@anchor{1b3c}
@subsubsection Core and Builtins



@itemize -

@item 
gh-96636@footnote{https://github.com/python/cpython/issues/96636}: Ensure that tracing, @code{sys.setrace()}, is turned on
immediately. In pre-release versions of 3.11, some tracing events might
have been lost when turning on tracing in a @code{__del__} method or
interrupt.

@item 
gh-96572@footnote{https://github.com/python/cpython/issues/96572}: Fix use after free in trace refs build mode. Patch by Kumar
Aditya.

@item 
gh-96611@footnote{https://github.com/python/cpython/issues/96611}: When loading a file with invalid UTF-8 inside a multi-line
string, a correct SyntaxError is emitted.

@item 
gh-96612@footnote{https://github.com/python/cpython/issues/96612}: Make sure that incomplete frames do not show up in tracemalloc
traces.

@item 
gh-90230@footnote{https://github.com/python/cpython/issues/90230}: Fix compiler warnings and test failures when building with
@code{--enable-pystats}.

@item 
gh-96587@footnote{https://github.com/python/cpython/issues/96587}: Correctly raise @code{SyntaxError} on exception groups (
@geindex Python 향상 제안; PEP 654
PEP 654@footnote{https://peps.python.org/pep-0654/})
on python versions prior to 3.11

@item 
gh-96569@footnote{https://github.com/python/cpython/issues/96569}: Remove two cases of undefined behavior, by adding NULL checks.

@item 
gh-96582@footnote{https://github.com/python/cpython/issues/96582}: Fix possible @code{NULL} pointer dereference in
@code{_PyThread_CurrentFrames}. Patch by Kumar Aditya.

@item 
gh-91079@footnote{https://github.com/python/cpython/issues/91079}: Separate Python recursion checking from C recursion checking
which reduces the chance of C stack overflow and allows the recursion
limit to be increased safely.

@item 
gh-93911@footnote{https://github.com/python/cpython/issues/93911}: Fix an issue that could prevent @ref{703,,LOAD_ATTR} from
specializing properly when accessing properties.

@item 
gh-96348@footnote{https://github.com/python/cpython/issues/96348}: Emit a DeprecationWarning when @ref{71b,,throw()},
@ref{71a,,throw()} or @ref{71c,,athrow()} are called with more than
one argument.

@item 
gh-95196@footnote{https://github.com/python/cpython/issues/95196}: Disable incorrect pickling of the C implemented classmethod
descriptors.

@item 
gh-96364@footnote{https://github.com/python/cpython/issues/96364}: Fix text signatures of @code{list.__getitem__} and
@code{dict.__getitem__}.

@item 
gh-96352@footnote{https://github.com/python/cpython/issues/96352}: Fix @ref{5ee,,AttributeError} missing @code{name} and @code{obj}
attributes in @ref{dca,,object.__getattribute__()}. Patch by Philip Georgi.

@item 
gh-93554@footnote{https://github.com/python/cpython/issues/93554}: Change the jump opcodes so that all conditional jumps are
forward jumps. Backward jumps are converted by the assembler into a
conditional forward jump whose target is the fallthrough block (and with a
reversed condition), followed by an unconditional backward jump. For
example:

@code{POP_JUMP_IF_TRUE BACKWARD_TARGET} becomes @code{POP_JUMP_IF_FALSE
NEXT_BLOCK; JUMP BACKWARD_TARGET}.

All the directed conditional jump opcodes were removed:
@code{POP_JUMP_FORWARD_IF_TRUE}, @code{POP_JUMP_BACKWARD_IF_TRUE},
@code{POP_JUMP_FORWARD_IF_FALSE}, @code{POP_JUMP_BACKWARD_IF_FALSE},
@code{POP_JUMP_FORWARD_IF_NONE}, @code{POP_JUMP_BACKWARD_IF_NONE},
@code{POP_JUMP_FORWARD_IF_NOT_NONE}, @code{POP_JUMP_BACKWARD_IF_NOT_NONE}.

The corresponding opcodes without direction are no longer
pseudo-instructions, and they implement the forward conditional jumps.

@item 
gh-96268@footnote{https://github.com/python/cpython/issues/96268}: Loading a file with invalid UTF-8 will now report the broken
character at the correct location.

@item 
gh-96237@footnote{https://github.com/python/cpython/issues/96237}: The internal field @code{_PyInterpreterFrame.f_func} is renamed to
@code{_PyInterpreterFrame.f_funcobj} and may be any object. The @code{f_globals}
and @code{f_builtin} fields may hold junk values.

It is safest to treat the @code{_PyInterpreterFrame} struct as opaque.

@item 
gh-96187@footnote{https://github.com/python/cpython/issues/96187}: Fixed a bug that caused @code{_PyCode_GetExtra} to return garbage
for negative indexes. Patch by Pablo Galindo

@item 
gh-96143@footnote{https://github.com/python/cpython/issues/96143}: Add a new @code{-X perf} Python command line option as well as
@ref{699,,sys.activate_stack_trampoline()} and
@ref{69a,,sys.deactivate_stack_trampoline()} function in the @ref{df,,sys} module
that allows to set/unset the interpreter in a way that the Linux @code{perf}
profiler can detect Python calls. The new
@ref{69b,,sys.is_stack_trampoline_active()} function allows to query the state
of the perf trampoline. Design by Pablo Galindo. Patch by Pablo Galindo
and Christian Heimes with contributions from Gregory P. Smith [Google] and
Mark Shannon.

@item 
gh-96071@footnote{https://github.com/python/cpython/issues/96071}: Fix a deadlock in @ref{648,,PyGILState_Ensure()} when allocating
new thread state. Patch by Kumar Aditya.

@item 
gh-96046@footnote{https://github.com/python/cpython/issues/96046}: @ref{97f,,PyType_Ready()} now initializes @code{ht_cached_keys} and
performs additional checks to ensure that type objects are properly
configured. This avoids crashes in 3rd party packages that don’t use
regular API to create new types.

@item 
gh-96005@footnote{https://github.com/python/cpython/issues/96005}: On WASI @ref{1b3d,,ENOTCAPABLE} is now mapped to
@ref{f3d,,PermissionError}. The @ref{5b,,errno} modules exposes the new error
number. @code{getpath.py} now ignores @code{PermissionError} when it cannot
open landmark files @code{pybuilddir.txt} and @code{pyenv.cfg}.

@item 
gh-93678@footnote{https://github.com/python/cpython/issues/93678}: Added test a harness for direct unit tests of the compiler’s
optimization stage. The @code{_testinternalcapi.optimize_cfg()} function runs
the optimiser on a sequence of instructions. The
@code{CfgOptimizationTestCase} class in @code{test.support} has utilities for
invoking the optimizer and checking the output.

@item 
gh-95245@footnote{https://github.com/python/cpython/issues/95245}: Reduces the size of a “simple” Python object from 8 to 6 words
by moving the weakreflist pointer into the pre-header directly before the
object’s dict/values pointer.

@item 
gh-90997@footnote{https://github.com/python/cpython/issues/90997}: Compile virtual @ref{8f7,,try}/@ref{1ab,,except} blocks to
handle exceptions raised during @ref{179b,,close()} or
@ref{71b,,throw()} calls through a suspended frame.

@item 
gh-95977@footnote{https://github.com/python/cpython/issues/95977}: Optimized calling @ref{16ed,,__get__()} with vectorcall. Patch
by Kumar Aditya.

@item 
gh-91210@footnote{https://github.com/python/cpython/issues/91210}: Improve error message when a parameter without a default value
follows one with a default value, and show the same message, even when the
non-default/default sequence is preceded by positional-only parameters.

@item 
gh-95922@footnote{https://github.com/python/cpython/issues/95922}: Fixed bug where the compiler’s @code{eliminate_empty_basic_blocks}
function ignores the last block of the code unit.

@item 
gh-95818@footnote{https://github.com/python/cpython/issues/95818}: Skip over incomplete frames in @ref{990,,PyThreadState_GetFrame()}.

@item 
gh-95876@footnote{https://github.com/python/cpython/issues/95876}: Fix format string in @code{_PyPegen_raise_error_known_location}
that can lead to memory corruption on some 64bit systems. The function was
building a tuple with @code{i} (int) instead of @code{n} (Py_ssize_t) for
Py_ssize_t arguments.

@item 
gh-95605@footnote{https://github.com/python/cpython/issues/95605}: Fix misleading contents of error message when converting an
all-whitespace string to @ref{196,,float}.

@item 
gh-95150@footnote{https://github.com/python/cpython/issues/95150}: Update code object hashing and equality to consider all
debugging and exception handling tables. This fixes an issue where certain
non-identical code objects could be “deduplicated” during compilation.

@item 
gh-91146@footnote{https://github.com/python/cpython/issues/91146}: Reduce allocation size of @ref{24d,,list} from @ref{10a9,,str.split()}
and @ref{145a,,str.rsplit()}. Patch by Donghee Na and Inada Naoki.

@item 
gh-87092@footnote{https://github.com/python/cpython/issues/87092}: Create a ‘jump target label’ abstraction in the compiler so that
the compiler’s codegen stage does not work directly with basic blocks.
This prepares the code for changes to the underlying CFG generation
mechanism.

@item 
gh-95355@footnote{https://github.com/python/cpython/issues/95355}: @code{_PyPegen_Parser_New} now properly detects token memory
allocation errors. Patch by Honglin Zhu.

@item 
gh-90081@footnote{https://github.com/python/cpython/issues/90081}: Run Python code in tracer/profiler function at full speed. Fixes
slowdown in earlier versions of 3.11.

@item 
gh-95324@footnote{https://github.com/python/cpython/issues/95324}: Emit a warning in debug mode if an object does not call
@ref{170a,,PyObject_GC_UnTrack()} before deallocation. Patch by Pablo Galindo.

@item 
gh-95245@footnote{https://github.com/python/cpython/issues/95245}: Merge managed dict and values pointer into a single tagged
pointer to save one word in the pre-header.

@item 
gh-93678@footnote{https://github.com/python/cpython/issues/93678}: Add cfg_builder struct and refactor the relevant code so that a
cfg can be constructed without an instance of the compiler struct.

@item 
gh-95185@footnote{https://github.com/python/cpython/issues/95185}: Prevented crashes in the AST constructor when compiling some
absurdly long expressions like @code{"+0"*1000000}. @ref{f67,,RecursionError} is
now raised instead. Patch by Pablo Galindo

@item 
gh-93351@footnote{https://github.com/python/cpython/issues/93351}: @ref{4c5,,ast.AST} node positions are now validated when provided
to @ref{4b2,,compile()} and other related functions. If invalid positions are
detected, a @ref{2ec,,ValueError} will be raised.

@item 
gh-94438@footnote{https://github.com/python/cpython/issues/94438}: Fix an issue that caused extended opcode arguments and some
conditional pops to be ignored when calculating valid jump targets for
assignments to the @code{f_lineno} attribute of frame objects. In some cases,
this could cause inconsistent internal state, resulting in a hard crash of
the interpreter.

@item 
gh-95060@footnote{https://github.com/python/cpython/issues/95060}: Undocumented @code{PyCode_Addr2Location} function now properly
returns when @code{addrq} argument is less than zero.

@item 
gh-95113@footnote{https://github.com/python/cpython/issues/95113}: Replace all @code{EXTENDED_ARG_QUICK} instructions with basic
@ref{1b1c,,EXTENDED_ARG} instructions in unquickened code. Consumers of
non-adaptive bytecode should be able to handle extended arguments the same
way they were handled in CPython 3.10 and older.

@item 
gh-91409@footnote{https://github.com/python/cpython/issues/91409}: Fix incorrect source location info caused by certain
optimizations in the bytecode compiler.
@end itemize

@node Library<81>,Core and Builtins<78>,Core and Builtins<77>,Python 3 12 0 alpha 1
@anchor{whatsnew/changelog id374}@anchor{1b3e}
@subsubsection Library



@itemize -

@item 
gh-95023@footnote{https://github.com/python/cpython/issues/95023}: Implement @ref{1b3f,,os.setns()} and  @ref{1b40,,os.unshare()} for Linux.
Patch by Noam Cohen.
@end itemize

@node Core and Builtins<78>,Library<82>,Library<81>,Python 3 12 0 alpha 1
@anchor{whatsnew/changelog id375}@anchor{1b41}
@subsubsection Core and Builtins



@itemize -

@item 
gh-94036@footnote{https://github.com/python/cpython/issues/94036}: Fix incorrect source location info for some multi-line attribute
accesses and method calls.

@item 
gh-94938@footnote{https://github.com/python/cpython/issues/94938}: Fix error detection in some builtin functions when keyword
argument name is an instance of a str subclass with overloaded @code{__eq__}
and @code{__hash__}. Previously it could cause SystemError or other undesired
behavior.
@end itemize

@node Library<82>,Core and Builtins<79>,Core and Builtins<78>,Python 3 12 0 alpha 1
@anchor{whatsnew/changelog id376}@anchor{1b42}
@subsubsection Library



@itemize -

@item 
gh-94996@footnote{https://github.com/python/cpython/issues/94996}: @ref{1c2,,ast.parse()} will no longer parse function definitions with
positional-only params when passed @code{feature_version} less than @code{(3,
8)}. Patch by Shantanu Jain.
@end itemize

@node Core and Builtins<79>,Library<83>,Library<82>,Python 3 12 0 alpha 1
@anchor{whatsnew/changelog id377}@anchor{1b43}
@subsubsection Core and Builtins



@itemize -

@item 
gh-94739@footnote{https://github.com/python/cpython/issues/94739}: Allow jumping within, out of, and across exception handlers in
the debugger.
@end itemize

@node Library<83>,Core and Builtins<80>,Core and Builtins<79>,Python 3 12 0 alpha 1
@anchor{whatsnew/changelog id378}@anchor{1b44}
@subsubsection Library



@itemize -

@item 
gh-94949@footnote{https://github.com/python/cpython/issues/94949}: @ref{1c2,,ast.parse()} will no longer parse parenthesized context
managers when passed @code{feature_version} less than @code{(3, 9)}. Patch by
Shantanu Jain.

@item 
gh-94947@footnote{https://github.com/python/cpython/issues/94947}: @ref{1c2,,ast.parse()} will no longer parse assignment expressions
when passed @code{feature_version} less than @code{(3, 8)}. Patch by Shantanu
Jain.
@end itemize

@node Core and Builtins<80>,Library<84>,Library<83>,Python 3 12 0 alpha 1
@anchor{whatsnew/changelog id379}@anchor{1b45}
@subsubsection Core and Builtins



@itemize -

@item 
gh-91256@footnote{https://github.com/python/cpython/issues/91256}: Ensures the program name is known for help text during
interpreter startup.

@item 
gh-94869@footnote{https://github.com/python/cpython/issues/94869}: Fix the column offsets for some expressions in multi-line
f-strings @ref{9,,ast} nodes. Patch by Pablo Galindo.

@item 
gh-94893@footnote{https://github.com/python/cpython/issues/94893}: Fix an issue where frame object manipulations could corrupt
inline bytecode caches.

@item 
gh-94822@footnote{https://github.com/python/cpython/issues/94822}: Fix an issue where lookups of metaclass descriptors may be
ignored when an identically-named attribute also exists on the class
itself.

@item 
gh-91153@footnote{https://github.com/python/cpython/issues/91153}: Fix an issue where a @ref{344,,bytearray} item assignment could
crash if it’s resized by the new value’s @code{__index__()} method.

@item 
gh-90699@footnote{https://github.com/python/cpython/issues/90699}: Fix reference counting bug in @code{bool.__repr__()}. Patch by
Kumar Aditya.

@item 
gh-94694@footnote{https://github.com/python/cpython/issues/94694}: Fix an issue that could cause code with multi-line method
lookups to have misleading or incorrect column offset information. In some
cases (when compiling a hand-built AST) this could have resulted in a hard
crash of the interpreter.

@item 
gh-93252@footnote{https://github.com/python/cpython/issues/93252}: Fix an issue that caused internal frames to outlive failed
Python function calls, possibly resulting in memory leaks or hard
interpreter crashes.

@item 
gh-94215@footnote{https://github.com/python/cpython/issues/94215}: Fix an issue where exceptions raised by line-tracing events
would cause frames to be left in an invalid state, possibly resulting in a
hard crash of the interpreter.

@item 
gh-92228@footnote{https://github.com/python/cpython/issues/92228}: Disable the compiler’s inline-small-exit-blocks optimization for
exit blocks that are associated with source code lines. This fixes a bug
where the debugger cannot tell where an exception handler ends and the
following code block begins.

@item 
gh-94485@footnote{https://github.com/python/cpython/issues/94485}: Line number of a module’s @code{RESUME} instruction is set to 0 as
specified in 
@geindex Python 향상 제안; PEP 626
PEP 626@footnote{https://peps.python.org/pep-0626/}.

@item 
gh-94438@footnote{https://github.com/python/cpython/issues/94438}: Account for instructions that can push NULL to the stack when
setting line number in a frame. Prevents some (unlikely) crashes.

@item 
gh-91719@footnote{https://github.com/python/cpython/issues/91719}: Reload @code{opcode} when raising @code{unknown opcode error} in the
interpreter main loop, for C compilers to generate dispatching code
independently.

@item 
gh-94329@footnote{https://github.com/python/cpython/issues/94329}: Compile and run code with unpacking of extremely large sequences
(1000s of elements). Such code failed to compile. It now compiles and runs
correctly.

@item 
gh-94360@footnote{https://github.com/python/cpython/issues/94360}: Fixed a tokenizer crash when reading encoded files with syntax
errors from @code{stdin} with non utf-8 encoded text. Patch by Pablo Galindo

@item 
gh-88116@footnote{https://github.com/python/cpython/issues/88116}: Fix an issue when reading line numbers from code objects if the
encoded line numbers are close to @code{INT_MIN}. Patch by Pablo Galindo

@item 
gh-94262@footnote{https://github.com/python/cpython/issues/94262}: Don’t create frame objects for incomplete frames. Prevents the
creation of generators and closures from being observable to Python and C
extensions, restoring the behavior of 3.10 and earlier.

@item 
gh-94192@footnote{https://github.com/python/cpython/issues/94192}: Fix error for dictionary literals with invalid expression as
value.

@item 
gh-87995@footnote{https://github.com/python/cpython/issues/87995}: @ref{697,,types.MappingProxyType} instances are now hashable if
the underlying mapping is hashable.

@item 
gh-93883@footnote{https://github.com/python/cpython/issues/93883}: Revise the display strategy of traceback enhanced error
locations.  The indicators are only shown when the location doesn’t span
the whole line.

@item 
gh-94163@footnote{https://github.com/python/cpython/issues/94163}: Add @ref{704,,BINARY_SLICE} and @ref{705,,STORE_SLICE}
instructions for more efficient handling and better specialization of
slicing operations, where the slice is explicit in the source code.

@item 
gh-94021@footnote{https://github.com/python/cpython/issues/94021}: Fix unreachable code warning in @code{Python/specialize.c}.

@item 
gh-93911@footnote{https://github.com/python/cpython/issues/93911}: Specialize @code{LOAD_ATTR} for objects with custom
@code{__getattribute__}.

@item 
gh-93955@footnote{https://github.com/python/cpython/issues/93955}: Improve performance of attribute lookups on objects with custom
@code{__getattribute__} and @code{__getattr__}. Patch by Ken Jin.

@item 
gh-93911@footnote{https://github.com/python/cpython/issues/93911}: Specialize @code{LOAD_ATTR} for @code{property()} attributes.

@item 
gh-93678@footnote{https://github.com/python/cpython/issues/93678}: Refactor compiler optimisation code so that it no longer needs
the @code{struct assembler} and @code{struct compiler} passed around. Instead,
each function takes the CFG and other data that it actually needs. This
will make it possible to test this code directly.

@item 
gh-93841@footnote{https://github.com/python/cpython/issues/93841}: When built with @code{-enable-pystats}, @code{sys._stats_on()},
@code{sys._stats_off()}, @code{sys._stats_clear()} and @code{sys._stats_dump()}
functions have been added to enable gathering stats for parts of programs.

@item 
gh-93516@footnote{https://github.com/python/cpython/issues/93516}: Store offset of first traceable instruction in code object to
avoid having to recompute it for each instruction when tracing.

@item 
gh-93516@footnote{https://github.com/python/cpython/issues/93516}: Lazily create a table mapping bytecode offsets to line numbers
to speed up calculation of line numbers when tracing.

@item 
gh-89828@footnote{https://github.com/python/cpython/issues/89828}: @ref{9ec,,types.GenericAlias} no longer relays the @code{__class__}
attribute. For example, @code{isinstance(list[int], type)} no longer returns
@code{True}.

@item 
gh-93678@footnote{https://github.com/python/cpython/issues/93678}: Refactor the compiler to reduce boilerplate and repetition.

@item 
gh-93671@footnote{https://github.com/python/cpython/issues/93671}: Fix some exponential backtrace case happening with deeply nested
sequence patterns in match statements. Patch by Pablo Galindo

@item 
gh-93662@footnote{https://github.com/python/cpython/issues/93662}: Make sure that the end column offsets are correct in multi-line
method calls. Previously, the end column could precede the column offset.
@end itemize

@node Library<84>,Core and Builtins<81>,Core and Builtins<80>,Python 3 12 0 alpha 1
@anchor{whatsnew/changelog id380}@anchor{1b46}
@subsubsection Library



@itemize -

@item 
gh-93461@footnote{https://github.com/python/cpython/issues/93461}: @ref{e09,,importlib.invalidate_caches()} now drops entries from
@ref{7f9,,sys.path_importer_cache} with a relative path as name. This solves
a caching issue when a process changes its current working directory.

@code{FileFinder} no longer inserts a dot in the path, e.g. @code{/egg/./spam}
is now @code{/egg/spam}.
@end itemize

@node Core and Builtins<81>,Library<85>,Library<84>,Python 3 12 0 alpha 1
@anchor{whatsnew/changelog id381}@anchor{1b47}
@subsubsection Core and Builtins



@itemize -

@item 
gh-93621@footnote{https://github.com/python/cpython/issues/93621}: Change order of bytecode instructions emitted for
@ref{186,,with} and @ref{185,,async with} to reduce the number of entries
in the exception table.

@item 
gh-93533@footnote{https://github.com/python/cpython/issues/93533}: Reduce the size of the inline cache for @code{LOAD_METHOD} by 2
bytes.

@item 
gh-93444@footnote{https://github.com/python/cpython/issues/93444}: Removed redundant fields from the compiler’s basicblock struct:
@code{b_nofallthrough}, @code{b_exit}, @code{b_return}. They can be easily
calculated from the opcode of the last instruction of the block.

@item 
gh-93429@footnote{https://github.com/python/cpython/issues/93429}: @code{LOAD_METHOD} instruction has been removed. It was merged back
into @code{LOAD_ATTR}.

@item 
gh-93418@footnote{https://github.com/python/cpython/issues/93418}: Fixed an assert where an f-string has an equal sign ‘=’
following an expression, but there’s no trailing brace. For example,
f”@{i=”.

@item 
gh-93382@footnote{https://github.com/python/cpython/issues/93382}: Cache the result of @ref{97b,,PyCode_GetCode()} function to restore
the `O'(1) lookup of the @code{co_code} attribute.

@item 
gh-93359@footnote{https://github.com/python/cpython/issues/93359}: Ensure that custom @ref{9,,ast} nodes without explicit end
positions can be compiled. Patch by Pablo Galindo.

@item 
gh-93356@footnote{https://github.com/python/cpython/issues/93356}: Code for exception handlers is emitted at the end of the code
unit’s bytecode. This avoids one jump when no exception is raised.

@item 
gh-93354@footnote{https://github.com/python/cpython/issues/93354}: Use exponential backoff for specialization counters in the
interpreter. Can reduce the number of failed specializations significantly
and avoid slowdown for those parts of a program that are not suitable for
specialization.

@item 
gh-93283@footnote{https://github.com/python/cpython/issues/93283}: Improve error message for invalid syntax of conversion character
in f-string expressions.

@item 
gh-93345@footnote{https://github.com/python/cpython/issues/93345}: Fix a crash in substitution of a @code{TypeVar} in nested generic
alias after @code{TypeVarTuple}.

@item 
gh-93223@footnote{https://github.com/python/cpython/issues/93223}: When a bytecode instruction jumps to an unconditional jump
instruction, the first instruction can often be optimized to target the
unconditional jump’s target directly. For tracing reasons, this would
previously only occur if both instructions have the same line number. This
also now occurs if the unconditional jump is artificial, i.e., if it has
no associated line number.

@item 
gh-84694@footnote{https://github.com/python/cpython/issues/84694}: The @code{--experimental-isolated-subinterpreters} configure option
and @code{EXPERIMENTAL_ISOLATED_SUBINTERPRETERS} macro have been removed.

@item 
gh-91924@footnote{https://github.com/python/cpython/issues/91924}: Fix @code{__lltrace__} debug feature if the stdout encoding is not
UTF-8. Patch by Victor Stinner.

@item 
gh-93040@footnote{https://github.com/python/cpython/issues/93040}: Wraps unused parameters in @code{Objects/obmalloc.c} with
@code{Py_UNUSED}.

@item 
gh-93143@footnote{https://github.com/python/cpython/issues/93143}: Avoid @code{NULL} checks for uninitialized local variables by
determining at compile time which variables must be initialized.

@item 
gh-93061@footnote{https://github.com/python/cpython/issues/93061}: Backward jumps after @code{async for} loops are no longer given
dubious line numbers.

@item 
gh-93065@footnote{https://github.com/python/cpython/issues/93065}: Fix contextvars HAMT implementation to handle iteration over
deep trees.

The bug was discovered and fixed by Eli Libman. See
MagicStack/immutables#84@footnote{https://github.com/MagicStack/immutables/issues/84} for more details.

@item 
gh-93012@footnote{https://github.com/python/cpython/issues/93012}: Added the new function @ref{771,,PyType_FromMetaclass()}, which
generalizes the existing @ref{772,,PyType_FromModuleAndSpec()} using an
additional metaclass argument. This is useful for language binding tools,
where it can be used to intercept type-related operations like subclassing
or static attribute access by specifying a metaclass with custom slots.

Importantly, @ref{771,,PyType_FromMetaclass()} is available in the Limited
API, which provides a path towards migrating more binding tools onto the
Stable ABI.

@item 
gh-93021@footnote{https://github.com/python/cpython/issues/93021}: Fix the @code{__text_signature__} for @code{__get__()} methods
implemented in C. Patch by Jelle Zijlstra.

@item 
gh-89914@footnote{https://github.com/python/cpython/issues/89914}: The operand of the @code{YIELD_VALUE} instruction is set to the
stack depth. This is done to help frame handling on @code{yield} and may
assist debuggers.

@item 
gh-92955@footnote{https://github.com/python/cpython/issues/92955}: Fix memory leak in code object’s lines and positions iterators
as they were not finalized at exit. Patch by Kumar Aditya.

@item 
gh-92930@footnote{https://github.com/python/cpython/issues/92930}: Fixed a crash in @code{_pickle.c} from mutating collections during
@code{__reduce__} or @code{persistent_id}.

@item 
gh-90690@footnote{https://github.com/python/cpython/issues/90690}: The PRECALL instruction has been removed. It offered only a
small advantage for specialization and is not needed in the vast majority
of cases.

@item 
gh-92914@footnote{https://github.com/python/cpython/issues/92914}: Always round the allocated size for lists up to the nearest even
number.

@item 
gh-92858@footnote{https://github.com/python/cpython/issues/92858}: Improve error message for some suites with syntax error before
‘:’

@item 
gh-90473@footnote{https://github.com/python/cpython/issues/90473}: Decrease default recursion limit on WASI to address limited call
stack size.

@item 
gh-92804@footnote{https://github.com/python/cpython/issues/92804}: Fix memory leak in @code{memoryview} iterator as it was not
finalized at exit. Patch by Kumar Aditya.

@item 
gh-92777@footnote{https://github.com/python/cpython/issues/92777}: Specialize @code{LOAD_METHOD} for objects with lazy dictionaries.
Patch by Ken Jin.

@item 
gh-92658@footnote{https://github.com/python/cpython/issues/92658}: Add support for connecting and binding to Hyper-V sockets on
Windows Hyper-V hosts and guests.

@item 
gh-92236@footnote{https://github.com/python/cpython/issues/92236}: Remove spurious “LINE” event when starting a generator or
coroutine, visible tracing functions implemented in C.
@end itemize

@node Library<85>,Core and Builtins<82>,Core and Builtins<81>,Python 3 12 0 alpha 1
@anchor{whatsnew/changelog id382}@anchor{1b48}
@subsubsection Library



@itemize -

@item 
gh-91102@footnote{https://github.com/python/cpython/issues/91102}: @code{_warnings.warn_explicit()} is ported to Argument Clinic.
@end itemize

@node Core and Builtins<82>,Library<86>,Library<85>,Python 3 12 0 alpha 1
@anchor{whatsnew/changelog id383}@anchor{1b49}
@subsubsection Core and Builtins



@itemize -

@item 
gh-92619@footnote{https://github.com/python/cpython/issues/92619}: Make the compiler duplicate an exit block only if none of its
instructions have a lineno (previously only the first instruction in the
block was checked, leading to unnecessarily duplicated blocks).

@item 
gh-88750@footnote{https://github.com/python/cpython/issues/88750}: The deprecated debug build only @code{PYTHONTHREADDEBUG}
environment variable no longer does anything.
@end itemize

@node Library<86>,Core and Builtins<83>,Core and Builtins<82>,Python 3 12 0 alpha 1
@anchor{whatsnew/changelog id384}@anchor{1b4a}
@subsubsection Library



@itemize -

@item 
gh-92261@footnote{https://github.com/python/cpython/issues/92261}: Fix hang when trying to iterate over a @code{typing.Union}.
@end itemize

@node Core and Builtins<83>,Library<87>,Library<86>,Python 3 12 0 alpha 1
@anchor{whatsnew/changelog id385}@anchor{1b4b}
@subsubsection Core and Builtins



@itemize -

@item 
gh-91432@footnote{https://github.com/python/cpython/issues/91432}: Specialized the @ref{1ac1,,FOR_ITER} opcode using the PEP 659
machinery

@item 
gh-91399@footnote{https://github.com/python/cpython/issues/91399}: Removed duplicate ‘@{0, 0, 0, 0, 0, 0@}’ entry in
‘Objects/unicodetype_db.h’.

@item 
gh-91578@footnote{https://github.com/python/cpython/issues/91578}: Updates the error message for abstract class.

@item 
bpo-47091@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47091}: Improve performance of repetition of @ref{24d,,list} and
@ref{610,,tuple} by using @code{memcpy} to copy data and performing the
reference increments in one step.

@item 
bpo-46142@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46142}: Make @code{--help} output shorter by moving some info to the new
@code{--help-env} and @code{--help-xoptions} command-line options. Also add
@code{--help-all} option to print complete usage.

@item 
bpo-42316@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42316}: Document some places where an assignment expression needs
parentheses.
@end itemize

@node Library<87>,Documentation<28>,Core and Builtins<83>,Python 3 12 0 alpha 1
@anchor{whatsnew/changelog id386}@anchor{1b4c}
@subsubsection Library



@itemize -

@item 
gh-89237@footnote{https://github.com/python/cpython/issues/89237}: Fix hang on Windows in @code{subprocess.wait_closed()} in
@ref{b,,asyncio} with @ref{81c,,ProactorEventLoop}. Patch by Kumar
Aditya.

@item 
gh-97928@footnote{https://github.com/python/cpython/issues/97928}: @code{tkinter.Text.count()} raises now an exception for options
starting with “-” instead of silently ignoring them.

@item 
gh-98393@footnote{https://github.com/python/cpython/issues/98393}: The @ref{a5,,os} module no longer accepts bytes-like paths, like
@ref{344,,bytearray} and @ref{165,,memoryview} types: only the exact
@ref{192,,bytes} type is accepted for bytes strings. Patch by Victor
Stinner.

@item 
gh-98363@footnote{https://github.com/python/cpython/issues/98363}: Added itertools.batched() to batch data into lists of a given
length with the last list possibly being shorter than the others.

@item 
gh-98331@footnote{https://github.com/python/cpython/issues/98331}: Update the bundled copies of pip and setuptools to versions 22.3
and 65.5.0 respectively.

@item 
gh-98307@footnote{https://github.com/python/cpython/issues/98307}: A @ref{86a,,createSocket()} method
was added to @ref{86b,,SysLogHandler}.

@item 
gh-96035@footnote{https://github.com/python/cpython/issues/96035}: Fix bug in @ref{362,,urllib.parse.urlparse()} that causes certain
port numbers containing whitespace, underscores, plus and minus signs, or
non-ASCII digits to be incorrectly accepted.

@item 
gh-98257@footnote{https://github.com/python/cpython/issues/98257}: Make @ref{1703,,sys.setprofile()} and @ref{2e1,,sys.settrace()} functions
reentrant. They can no long fail with: @code{RuntimeError("Cannot install a
trace function while another trace function is being installed")}. Patch
by Victor Stinner.

@item 
gh-98251@footnote{https://github.com/python/cpython/issues/98251}: Allow @ref{117,,venv} to pass along @code{PYTHON*} variables to
@code{ensurepip} and @code{pip} when they do not impact path resolution

@item 
gh-94597@footnote{https://github.com/python/cpython/issues/94597}: Deprecated
@code{asyncio.AbstractEventLoopPolicy.get_child_watcher()} and
@code{asyncio.AbstractEventLoopPolicy.set_child_watcher()} methods to be
removed in Python 3.14. Patch by Kumar Aditya.

@item 
gh-98178@footnote{https://github.com/python/cpython/issues/98178}: On macOS, fix a crash in @ref{761,,syslog.syslog()} in multi-threaded
applications. On macOS, the libc @code{syslog()} function is not thread-safe,
so @code{syslog.syslog()} no longer releases the GIL to call it. Patch by
Victor Stinner.

@item 
gh-44098@footnote{https://github.com/python/cpython/issues/44098}: Release the GIL when creating @ref{518,,mmap.mmap} objects on
Unix.

@item 
gh-87730@footnote{https://github.com/python/cpython/issues/87730}: Wrap network errors consistently in urllib FTP support, so the
test suite doesn’t fail when a network is available but the public
internet is not reachable.

@item 
gh-94597@footnote{https://github.com/python/cpython/issues/94597}: The child watcher classes
@code{MultiLoopChildWatcher},
@code{FastChildWatcher} and @code{SafeChildWatcher}
are deprecated and will be removed in Python 3.14. Patch by Kumar Aditya.

@item 
gh-98023@footnote{https://github.com/python/cpython/issues/98023}: Change default child watcher to
@code{PidfdChildWatcher} on Linux systems which supports it.
Patch by Kumar Aditya.

@item 
gh-90985@footnote{https://github.com/python/cpython/issues/90985}: Earlier in 3.11 we deprecated
@code{asyncio.Task.cancel("message")}. We realized we were too harsh, and
have undeprecated it.

@item 
gh-65961@footnote{https://github.com/python/cpython/issues/65961}: Do not rely solely on @code{__cached__} on modules; code will also
support @code{__spec__.cached}.

@item 
gh-97646@footnote{https://github.com/python/cpython/issues/97646}: Replace deprecated @code{application/javascript} with
@code{text/javascript} in @ref{93,,mimetypes}. See 
@geindex RFC; RFC 9239
RFC 9239@footnote{https://datatracker.ietf.org/doc/html/rfc9239.html}. Patch by Noam
Cohen.

@item 
gh-97930@footnote{https://github.com/python/cpython/issues/97930}: Apply changes from importlib_resources 5.8 and 5.9:
@code{Traversable.joinpath} provides a concrete implementation. @code{as_file}
now supports directories of resources.

@item 
gh-97850@footnote{https://github.com/python/cpython/issues/97850}: Remove deprecated @code{importlib.util.set_loader()} and
@code{importlib.util.module_for_loader()} from @ref{81,,importlib.util}.

@item 
gh-97837@footnote{https://github.com/python/cpython/issues/97837}: Change deprecate warning message in @ref{10c,,unittest} from

@code{It is deprecated to return a value!=None}

to

@code{It is deprecated to return a value that is not None from a test case}

@item 
gh-97825@footnote{https://github.com/python/cpython/issues/97825}: Fixes @ref{5ee,,AttributeError} when @ref{11c1,,subprocess.check_output()}
is used with argument @code{input=None} and either of the arguments
`encoding' or `errors' are used.

@item 
gh-97008@footnote{https://github.com/python/cpython/issues/97008}: @ref{452,,NameError} and @ref{5ee,,AttributeError} spelling suggestions
provided since gh-82711@footnote{https://github.com/python/cpython/issues/82711} are now also emitted by the pure Python
@ref{104,,traceback} module. Tests for those suggestions now exercise both
implementations to ensure they are equivalent. Patch by Carl Friedrich
Bolz-Tereick and Łukasz Langa.

@item 
gh-97799@footnote{https://github.com/python/cpython/issues/97799}: @code{dataclass} now uses @ref{a14,,inspect.get_annotations()} to
examine the annotations on class objects.

@item 
gh-97781@footnote{https://github.com/python/cpython/issues/97781}: Removed deprecated interfaces in @code{importlib.metadata} (entry
points accessed as dictionary, implicit dictionary construction of
sequence of @code{EntryPoint} objects, mutablility of @code{EntryPoints} result,
access of entry point by index). @code{entry_points} now has a simpler, more
straightforward API (returning @code{EntryPoints}).

@item 
gh-96827@footnote{https://github.com/python/cpython/issues/96827}: Avoid spurious tracebacks from @ref{b,,asyncio} when default
executor cleanup is delayed until after the event loop is closed (e.g. as
the result of a keyboard interrupt).

@item 
gh-95534@footnote{https://github.com/python/cpython/issues/95534}: @code{gzip.GzipFile.read()} reads 10% faster.

@item 
gh-97592@footnote{https://github.com/python/cpython/issues/97592}: Avoid a crash in the C version of
@ref{1912,,asyncio.Future.remove_done_callback()} when an evil argument is
passed.

@item 
gh-97639@footnote{https://github.com/python/cpython/issues/97639}: Remove @code{tokenize.NL} check from @ref{e3,,tabnanny}.

@item 
gh-97545@footnote{https://github.com/python/cpython/issues/97545}: Make Semaphore run faster.

@item 
gh-73588@footnote{https://github.com/python/cpython/issues/73588}: Fix generation of the default name of
@code{tkinter.Checkbutton}. Previously, checkbuttons in different parent
widgets could have the same short name and share the same state if
arguments “name” and “variable” are not specified. Now they are globally
unique.

@item 
gh-96865@footnote{https://github.com/python/cpython/issues/96865}: fix Flag to use boundary CONFORM

This restores previous Flag behavior of allowing flags with non-sequential
values to be combined; e.g.

class Skip(Flag):         TWO = 2         EIGHT = 8

Skip.TWO | Skip.EIGHT -> <Skip.TWO|EIGHT: 10>

@item 
gh-97005@footnote{https://github.com/python/cpython/issues/97005}: Update bundled libexpat to 2.4.9

@item 
gh-85760@footnote{https://github.com/python/cpython/issues/85760}: Fix race condition in @ref{b,,asyncio} where
@ref{1b4d,,process_exited()} called before the
@ref{1b4e,,pipe_data_received()} leading to
inconsistent output. Patch by Kumar Aditya.

@item 
gh-96704@footnote{https://github.com/python/cpython/issues/96704}: Pass the correct @code{contextvars.Context} when a @code{asyncio}
exception handler is called on behalf of a task or callback handle. This
adds a new @code{Task} method, @code{get_context}, and also a new @code{Handle}
method with the same name. If this method is not found on a task object
(perhaps because it is a third-party library that does not yet provide
this method), the context prevailing at the time the exception handler is
called is used.

@item 
gh-96819@footnote{https://github.com/python/cpython/issues/96819}: Fixed check in @code{multiprocessing.resource_tracker} that
guarantees that the length of a write to a pipe is not greater than
@code{PIPE_BUF}.

@item 
gh-95865@footnote{https://github.com/python/cpython/issues/95865}: Reduce @ref{1b4f,,urllib.parse.quote_from_bytes()} memory use on large
values.

Contributed by Dennis Sweeney.

@item 
gh-96741@footnote{https://github.com/python/cpython/issues/96741}: Corrected type annotation for dataclass attribute
@code{pstats.FunctionProfile.ncalls} to be @code{str}.

@item 
gh-96734@footnote{https://github.com/python/cpython/issues/96734}: Update @ref{10b,,unicodedata} database to Unicode 15.0.0.

@item 
gh-96735@footnote{https://github.com/python/cpython/issues/96735}: Fix undefined behaviour in @ref{185d,,struct.unpack()}.

@item 
gh-46412@footnote{https://github.com/python/cpython/issues/46412}: Improve performance of @code{bool(db)} for large ndb/gdb databases.
Previously this would call @code{len(db)} which would iterate over all keys
– the answer (empty or not) is known after the first key.

@item 
gh-96652@footnote{https://github.com/python/cpython/issues/96652}: Fix the faulthandler implementation of
@code{faulthandler.register(signal, chain=True)} if the @code{sigaction()}
function is not available: don’t call the previous signal handler if it’s
NULL. Patch by Victor Stinner.

@item 
gh-68163@footnote{https://github.com/python/cpython/issues/68163}: Correct conversion of @ref{14c3,,numbers.Rational}’s to
@ref{196,,float}.

@item 
gh-96538@footnote{https://github.com/python/cpython/issues/96538}: Speed up @code{bisect.bisect()} functions by taking advantage of
type-stability.

@item 
gh-96465@footnote{https://github.com/python/cpython/issues/96465}: Fraction hashes are now cached.

@item 
gh-96079@footnote{https://github.com/python/cpython/issues/96079}: In @ref{10a,,typing}, fix missing field @code{name} and incorrect
@code{__module__} in _AnnotatedAlias.

@item 
gh-96415@footnote{https://github.com/python/cpython/issues/96415}: Remove @code{types._cell_factory} from module namespace.

@item 
gh-95987@footnote{https://github.com/python/cpython/issues/95987}: Fix @code{repr} of @code{Any} subclasses.

@item 
gh-96388@footnote{https://github.com/python/cpython/issues/96388}: Work around missing socket functions in
@ref{fa0,,socket}’s @code{__repr__}.

@item 
gh-96385@footnote{https://github.com/python/cpython/issues/96385}: Fix @code{TypeVarTuple.__typing_prepare_subst__}. @code{TypeError} was
not raised when using more than one @code{TypeVarTuple}, like @code{[*T, *V]} in
type alias substitutions.

@item 
gh-96142@footnote{https://github.com/python/cpython/issues/96142}: Add @code{match_args}, @code{kw_only}, @code{slots}, and @code{weakref_slot}
to @code{_DataclassParams}.

@item 
gh-96073@footnote{https://github.com/python/cpython/issues/96073}: In @ref{82,,inspect}, fix overeager replacement of “@code{typing.}” in
formatting annotations.

@item 
gh-89258@footnote{https://github.com/python/cpython/issues/89258}: Added a @ref{1b50,,getChildren()} method to
@ref{d45,,logging.Logger}, to get the immediate child loggers of a logger.

@item 
gh-96346@footnote{https://github.com/python/cpython/issues/96346}: Use double caching for compiled RE patterns.

@item 
gh-96349@footnote{https://github.com/python/cpython/issues/96349}: Fixed a minor performance regression in
@code{threading.Event.__init__()}

@item 
gh-90467@footnote{https://github.com/python/cpython/issues/90467}: Fix @code{asyncio.streams.StreamReaderProtocol} to keep a
strong reference to the created task, so that it’s not garbage collected

@item 
gh-96172@footnote{https://github.com/python/cpython/issues/96172}: Fix a bug in @code{unicodedata}: @code{east_asian_width} used to
return the wrong value for unassigned characters; and for yet unassigned,
but reserved characters.

@item 
gh-96159@footnote{https://github.com/python/cpython/issues/96159}: Fix a performance regression in logging
TimedRotatingFileHandler. Only check for special files when the rollover
time has passed.

@item 
gh-96175@footnote{https://github.com/python/cpython/issues/96175}: Fix unused @code{localName} parameter in the @code{Attr} class in
@ref{128,,xml.dom.minidom}.

@item 
gh-96145@footnote{https://github.com/python/cpython/issues/96145}: Add AttrDict to JSON module for use with object_hook.

@item 
gh-96052@footnote{https://github.com/python/cpython/issues/96052}: Fix handling compiler warnings (SyntaxWarning and
DeprecationWarning) in @ref{1b51,,codeop.compile_command()} when checking for
incomplete input. Previously it emitted warnings and raised a SyntaxError.
Now it always returns @code{None} for incomplete input without emitting any
warnings.

@item 
gh-96125@footnote{https://github.com/python/cpython/issues/96125}: Fix incorrect condition that causes @code{sys.thread_info.name} to
be wrong on pthread platforms.

@item 
gh-96019@footnote{https://github.com/python/cpython/issues/96019}: Fix a bug in the @code{makeunicodedata.py} script leading to about
13 KiB of space saving in the @code{unicodedata} module, specifically the
character decomposition data.

@item 
gh-95463@footnote{https://github.com/python/cpython/issues/95463}: Remove an incompatible change from bpo-28080@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28080} that caused a
regression that ignored the utf8 in @code{ZipInfo.flag_bits}. Patch by Pablo
Galindo.

@item 
gh-69142@footnote{https://github.com/python/cpython/issues/69142}: Add @code{%:z} strftime format code (generates tzoffset with colons
as separator), see @ref{1b52,,strftime() and strptime() behavior}.

@item 
gh-95899@footnote{https://github.com/python/cpython/issues/95899}: Fix @ref{2f5,,asyncio.Runner} to call
@ref{1b53,,asyncio.set_event_loop()} only once to avoid calling
@code{attach_loop()} multiple times on child
watchers. Patch by Kumar Aditya.

@item 
gh-95736@footnote{https://github.com/python/cpython/issues/95736}: Fix @ref{361,,unittest.IsolatedAsyncioTestCase} to set event loop
before calling setup functions. Patch by Kumar Aditya.

@item 
gh-95865@footnote{https://github.com/python/cpython/issues/95865}: Speed up @ref{1b4f,,urllib.parse.quote_from_bytes()} by replacing a
list comprehension with @code{map()}.

@item 
gh-95861@footnote{https://github.com/python/cpython/issues/95861}: Add support for computing Spearman’s correlation coefficient to
the existing statistics.correlation() function.

@item 
gh-95804@footnote{https://github.com/python/cpython/issues/95804}: Fix @code{logging} shutdown handler so it respects
@code{MemoryHandler.flushOnClose}.

@item 
gh-95704@footnote{https://github.com/python/cpython/issues/95704}: When a task catches @ref{4d5,,asyncio.CancelledError} and raises
some other error, the other error should generally not silently be
suppressed.

@item 
gh-95149@footnote{https://github.com/python/cpython/issues/95149}: The @ref{afc,,HTTPStatus} enum offers a couple
of properties to indicate the HTTP status category e.g.
@code{HTTPStatus.OK.is_success}.

@item 
gh-95609@footnote{https://github.com/python/cpython/issues/95609}: Update bundled pip to 22.2.2.

@item 
gh-95289@footnote{https://github.com/python/cpython/issues/95289}: Fix @ref{4d2,,asyncio.TaskGroup} to propagate exception when
@ref{4d5,,asyncio.CancelledError} was replaced with another exception by a
context manager. Patch by Kumar Aditya and Guido van Rossum.

@item 
gh-94909@footnote{https://github.com/python/cpython/issues/94909}: Fix incorrect joining of relative Windows paths with drives in
@ref{6cc,,pathlib.PurePath} initializer.

@item 
gh-95385@footnote{https://github.com/python/cpython/issues/95385}: Faster @code{json.dumps()} when sorting of keys is not requested
(default).

@item 
gh-83901@footnote{https://github.com/python/cpython/issues/83901}: Improve @ref{1894,,Signature.bind} error
message for missing keyword-only arguments.

@item 
gh-95339@footnote{https://github.com/python/cpython/issues/95339}: Update bundled pip to 22.2.1.

@item 
gh-95045@footnote{https://github.com/python/cpython/issues/95045}: Fix GC crash when deallocating @code{_lsprof.Profiler} by
untracking it before calling any callbacks. Patch by Kumar Aditya.

@item 
gh-95231@footnote{https://github.com/python/cpython/issues/95231}: Fail gracefully if @ref{1b54,,EPERM} or
@ref{1b55,,ENOSYS} is raised when loading @code{crypt} methods. This
may happen when trying to load @code{MD5} on a Linux kernel with @abbr{FIPS,Federal Information Processing Standard} enabled.

@item 
gh-95097@footnote{https://github.com/python/cpython/issues/95097}: Fix @ref{2f3,,asyncio.run()} for @ref{1c7,,asyncio.Task}
implementations without @ref{4d7,,uncancel()} method. Patch by
Kumar Aditya.

@item 
gh-95087@footnote{https://github.com/python/cpython/issues/95087}: Fix IndexError in parsing invalid date in the @ref{3f,,email}
module.

@item 
gh-95199@footnote{https://github.com/python/cpython/issues/95199}: Upgrade bundled setuptools to 63.2.0.

@item 
gh-95194@footnote{https://github.com/python/cpython/issues/95194}: Upgrade bundled pip to 22.2.

@item 
gh-93899@footnote{https://github.com/python/cpython/issues/93899}: Fix check for existence of @ref{1b56,,os.EFD_CLOEXEC},
@ref{1b57,,os.EFD_NONBLOCK} and @ref{1b58,,os.EFD_SEMAPHORE} flags on older
kernel versions where these flags are not present. Patch by Kumar Aditya.

@item 
gh-95166@footnote{https://github.com/python/cpython/issues/95166}: Fix @ref{1dc,,concurrent.futures.Executor.map()} to cancel the
currently waiting on future on an error - e.g. TimeoutError or
KeyboardInterrupt.

@item 
gh-95132@footnote{https://github.com/python/cpython/issues/95132}: Fix a @ref{d4,,sqlite3} regression where @code{*args} and @code{**kwds}
were incorrectly relayed from @ref{5a5,,connect()} to the
@ref{54c,,Connection} factory. The regression was introduced in
3.11a1 with PR 24421 (gh-85128@footnote{https://github.com/python/cpython/issues/85128}). Patch by Erlend E. Aasland.

@item 
gh-93157@footnote{https://github.com/python/cpython/issues/93157}: Fix @ref{5f,,fileinput} module didn’t support @code{errors} option
when @code{inplace} is true.

@item 
gh-91212@footnote{https://github.com/python/cpython/issues/91212}: Fixed flickering of the turtle window when the tracer is turned
off. Patch by Shin-myoung-serp.

@item 
gh-95077@footnote{https://github.com/python/cpython/issues/95077}: Add deprecation warning for enum @code{member.member} access (e.g.
@code{Color.RED.BLUE}). Remove @code{EnumMeta.__getattr__}.

@item 
gh-95109@footnote{https://github.com/python/cpython/issues/95109}: Ensure that timeouts scheduled with @ref{1a40,,asyncio.Timeout}
that have already expired are delivered promptly.

@item 
gh-95105@footnote{https://github.com/python/cpython/issues/95105}: @code{wsgiref.types.InputStream.__iter__()} should return
@code{Iterator[bytes]}, not @code{Iterable[bytes]}. Patch by Shantanu Jain.

@item 
gh-95066@footnote{https://github.com/python/cpython/issues/95066}: Replaced assert with exception in @ref{1c2,,ast.parse()}, when
@code{feature_version} has an invalid major version. Patch by Shantanu Jain.

@item 
gh-77617@footnote{https://github.com/python/cpython/issues/77617}: Add @ref{d4,,sqlite3} @ref{672,,command-line interface}.
Patch by Erlend Aasland.

@item 
gh-95005@footnote{https://github.com/python/cpython/issues/95005}: Replace _PyAccu with _PyUnicodeWriter in
JSON encoder and StringIO and remove the _PyAccu implementation.

@item 
gh-90085@footnote{https://github.com/python/cpython/issues/90085}: Remove @code{-c/--clock} and @code{-t/--time} CLI options of
@ref{f5,,timeit}. The options had been deprecated since Python 3.3 and the
functionality was removed in Python 3.7. Patch by Shantanu Jain.

@item 
gh-94857@footnote{https://github.com/python/cpython/issues/94857}: Fix refleak in @code{_io.TextIOWrapper.reconfigure}. Patch by Kumar
Aditya.

@item 
gh-94821@footnote{https://github.com/python/cpython/issues/94821}: Fix binding of unix socket to empty address on Linux to use an
available address from the abstract namespace, instead of “0”.

@item 
gh-94736@footnote{https://github.com/python/cpython/issues/94736}: Fix crash when deallocating an instance of a subclass of
@code{_multiprocessing.SemLock}. Patch by Kumar Aditya.

@item 
gh-81620@footnote{https://github.com/python/cpython/issues/81620}: Add random.binomialvariate().

@item 
gh-74116@footnote{https://github.com/python/cpython/issues/74116}: Allow @ref{1b27,,asyncio.StreamWriter.drain()} to be awaited
concurrently by multiple tasks. Patch by Kumar Aditya.

@item 
gh-87822@footnote{https://github.com/python/cpython/issues/87822}: When called with @code{capture_locals=True}, the @ref{104,,traceback}
module functions swallow exceptions raised from calls to @code{repr()} on
local variables of frames. This is in order to prioritize the original
exception over rendering errors.  An indication of the failure is printed
in place of the missing value.  (Patch by Simon-Martin Schroeder).

@item 
gh-88050@footnote{https://github.com/python/cpython/issues/88050}: Fix @ref{b,,asyncio} subprocess transport to kill process cleanly
when process is blocked and avoid @code{RuntimeError} when loop is closed.
Patch by Kumar Aditya.

@item 
gh-94637@footnote{https://github.com/python/cpython/issues/94637}: @code{SSLContext.set_default_verify_paths()} now releases the GIL
around @code{SSL_CTX_set_default_verify_paths} call. The function call
performs I/O and CPU intensive work.

@item 
gh-94309@footnote{https://github.com/python/cpython/issues/94309}: Deprecate aliases @ref{716,,typing.Hashable} and
@ref{717,,typing.Sized}

@item 
gh-92546@footnote{https://github.com/python/cpython/issues/92546}: An undocumented @code{python -m pprint} benchmark is moved into
@code{pprint} suite of pyperformance. Patch by Oleg Iarygin.

@item 
gh-94607@footnote{https://github.com/python/cpython/issues/94607}: Fix subclassing complex generics with type variables in
@ref{10a,,typing}. Previously an error message saying @code{Some type variables
... are not listed in Generic[...]} was shown. @code{typing} no longer
populates @code{__parameters__} with the @code{__parameters__} of a Python
class.

@item 
gh-94619@footnote{https://github.com/python/cpython/issues/94619}: Remove the long-deprecated @code{module_repr()} from
@ref{7b,,importlib}.

@item 
gh-93910@footnote{https://github.com/python/cpython/issues/93910}: The ability to access the other values of an enum on an enum
(e.g. @code{Color.RED.BLUE}) has been restored in order to fix a performance
regression.

@item 
gh-93896@footnote{https://github.com/python/cpython/issues/93896}: Fix @ref{2f3,,asyncio.run()} and
@ref{361,,unittest.IsolatedAsyncioTestCase} to always the set event loop as
it was done in Python 3.10 and earlier. Patch by Kumar Aditya.

@item 
gh-94343@footnote{https://github.com/python/cpython/issues/94343}: Allow setting the attributes of @code{reprlib.Repr} during object
initialization

@item 
gh-94382@footnote{https://github.com/python/cpython/issues/94382}: Port static types of @code{_multiprocessing} module to heap types.
Patch by Kumar Aditya.

@item 
gh-78724@footnote{https://github.com/python/cpython/issues/78724}: Fix crash in @ref{1761,,struct.Struct} when it was not completely
initialized by initializing it in @ref{79f,,__new__()}.  Patch by Kumar
Aditya.

@item 
gh-94510@footnote{https://github.com/python/cpython/issues/94510}: Re-entrant calls to @ref{1703,,sys.setprofile()} and
@ref{2e1,,sys.settrace()} now raise @ref{244,,RuntimeError}. Patch by Pablo
Galindo.

@item 
gh-92336@footnote{https://github.com/python/cpython/issues/92336}: Fix bug where @ref{240,,linecache.getline()} fails on bad files with
@ref{c07,,UnicodeDecodeError} or @ref{18e,,SyntaxError}. It now returns an empty
string as per the documentation.

@item 
gh-94398@footnote{https://github.com/python/cpython/issues/94398}: Once a @ref{4d2,,asyncio.TaskGroup} has started shutting down
(i.e., at least one task has failed and the task group has started
cancelling the remaining tasks), it should not be possible to add new
tasks to the task group.

@item 
gh-94383@footnote{https://github.com/python/cpython/issues/94383}: @code{xml.etree}: Remove the @code{ElementTree.Element.copy()}
method of the pure Python implementation, deprecated in Python 3.10, use
the @ref{756,,copy.copy()} function instead. The C implementation of
@code{xml.etree} has no @code{copy()} method, only a @code{__copy__()} method.
Patch by Victor Stinner.

@item 
gh-94379@footnote{https://github.com/python/cpython/issues/94379}: @ref{138,,zipimport}: Remove @code{find_loader()} and @code{find_module()}
methods, deprecated in Python 3.10: use the @code{find_spec()} method
instead. See 
@geindex Python 향상 제안; PEP 451
PEP 451@footnote{https://peps.python.org/pep-0451/} for the rationale. Patch by Victor Stinner.

@item 
gh-94352@footnote{https://github.com/python/cpython/issues/94352}: @ref{75d,,shlex.split()}: Passing @code{None} for `s' argument now
raises an exception, rather than reading @ref{75e,,sys.stdin}. The feature
was deprecated in Python 3.9. Patch by Victor Stinner.

@item 
gh-94318@footnote{https://github.com/python/cpython/issues/94318}: Strip trailing spaces in @ref{ba,,pydoc} text output.

@item 
gh-89988@footnote{https://github.com/python/cpython/issues/89988}: Fix memory leak in @ref{c12,,pickle.Pickler} when looking up
@code{dispatch_table}. Patch by Kumar Aditya.

@item 
gh-90016@footnote{https://github.com/python/cpython/issues/90016}: Deprecate @ref{d4,,sqlite3} @ref{713,,default adapters and converters}. Patch by Erlend E. Aasland.

@item 
gh-94254@footnote{https://github.com/python/cpython/issues/94254}: Fixed types of @ref{db,,struct} module to be immutable. Patch by
Kumar Aditya.

@item 
gh-93259@footnote{https://github.com/python/cpython/issues/93259}: Now raise @code{ValueError} when @code{None} or an empty string are
passed to @code{Distribution.from_name} (and other callers).

@item 
gh-74696@footnote{https://github.com/python/cpython/issues/74696}: @ref{6d9,,shutil.make_archive()} now passes the `root_dir' argument
to custom archivers which support it.

@item 
gh-94216@footnote{https://github.com/python/cpython/issues/94216}: The @ref{3c,,dis} module now has the opcodes for pseudo
instructions (those which are used by the compiler during code generation
but then removed or replaced by real opcodes before the final bytecode is
emitted).

@item 
gh-93096@footnote{https://github.com/python/cpython/issues/93096}: Removed undocumented @code{python -m codecs}. Use @code{python -m
unittest test.test_codecs.EncodedFileTest} instead.

@item 
gh-94207@footnote{https://github.com/python/cpython/issues/94207}: Made @code{_struct.Struct} GC-tracked in order to fix a
reference leak in the @code{_struct} module.

@item 
gh-93096@footnote{https://github.com/python/cpython/issues/93096}: Removed undocumented @code{-t} argument of @code{python -m base64}.
Use @code{python -m unittest
test.test_base64.LegacyBase64TestCase.test_encodebytes} instead.

@item 
gh-94226@footnote{https://github.com/python/cpython/issues/94226}: Remove the @code{locale.format()} function, deprecated in Python
3.7: use @ref{741,,locale.format_string()} instead. Patch by Victor Stinner.

@item 
gh-94199@footnote{https://github.com/python/cpython/issues/94199}: Remove the @code{ssl.match_hostname()} function. The
@code{ssl.match_hostname()} was deprecated in Python 3.7. OpenSSL performs
hostname matching since Python 3.7, Python no longer uses the
@code{ssl.match_hostname()} function. Patch by Victor Stinner.

@item 
gh-94214@footnote{https://github.com/python/cpython/issues/94214}: Document the @code{context} object used in the @code{venv.EnvBuilder}
class, and add the new environment’s library path to it.

@item 
gh-94199@footnote{https://github.com/python/cpython/issues/94199}: Remove the @code{ssl.wrap_socket()} function, deprecated in
Python 3.7: instead, create a @ref{357,,ssl.SSLContext} object and call its
@ref{747,,ssl.SSLContext.wrap_socket} method. Any package that still uses
@code{ssl.wrap_socket()} is broken and insecure. The function neither sends
a SNI TLS extension nor validates server hostname. Code is subject to
@geindex Common Weakness Enumeration; CWE 295
CWE 295@footnote{https://cwe.mitre.org/data/definitions/295.html} Improper Certificate Validation. Patch by Victor Stinner.

@item 
gh-94199@footnote{https://github.com/python/cpython/issues/94199}: Remove the @code{ssl.RAND_pseudo_bytes()} function, deprecated in
Python 3.6: use @ref{745,,os.urandom()} or @ref{746,,ssl.RAND_bytes()} instead.
Patch by Victor Stinner.

@item 
gh-94199@footnote{https://github.com/python/cpython/issues/94199}: @ref{6c,,hashlib}: Remove the pure Python implementation of
@ref{732,,hashlib.pbkdf2_hmac()}, deprecated in Python 3.10. Python 3.10 and
newer requires OpenSSL 1.1.1 (
@geindex Python 향상 제안; PEP 644
PEP 644@footnote{https://peps.python.org/pep-0644/}): this OpenSSL version provides a
C implementation of @code{pbkdf2_hmac()} which is faster. Patch by
Victor Stinner.

@item 
gh-94196@footnote{https://github.com/python/cpython/issues/94196}: @ref{6b,,gzip}: Remove the @code{filename} attribute of
@ref{65a,,gzip.GzipFile}, deprecated since Python 2.6, use the
@ref{730,,name} attribute instead. In write mode, the
@code{filename} attribute added @code{'.gz'} file extension if it was not
present. Patch by Victor Stinner.

@item 
gh-94182@footnote{https://github.com/python/cpython/issues/94182}: run the @code{asyncio.PidfdChildWatcher} on the running loop,
this allows event loops to run subprocesses when there is no default event
loop running on the main thread

@item 
gh-94169@footnote{https://github.com/python/cpython/issues/94169}: Remove @code{io.OpenWrapper} and @code{_pyio.OpenWrapper}, deprecated
in Python 3.10: just use @ref{316,,open()} instead. The @code{open()}
(@ref{73f,,io.open()}) function is a built-in function. Since Python 3.10,
@code{_pyio.open()} is also a static method. Patch by Victor Stinner.

@item 
gh-91742@footnote{https://github.com/python/cpython/issues/91742}: Fix @ref{aa,,pdb} crash after jump caused by a null pointer
dereference. Patch by Kumar Aditya.

@item 
gh-94101@footnote{https://github.com/python/cpython/issues/94101}: Manual instantiation of @ref{ed8,,ssl.SSLSession} objects is no
longer allowed as it lead to misconfigured instances that crashed the
interpreter when attributes where accessed on them.

@item 
gh-84753@footnote{https://github.com/python/cpython/issues/84753}: @ref{30d,,inspect.iscoroutinefunction()},
@ref{1b59,,inspect.isgeneratorfunction()}, and
@ref{1b5a,,inspect.isasyncgenfunction()} now properly return @code{True} for
duck-typed function-like objects like instances of
@ref{c3e,,unittest.mock.AsyncMock}.

This makes @ref{30d,,inspect.iscoroutinefunction()} consistent with the
behavior of @code{asyncio.iscoroutinefunction()}.  Patch by Mehdi ABAAKOUK.

@item 
gh-94028@footnote{https://github.com/python/cpython/issues/94028}: Fix a regression in the @ref{d4,,sqlite3} where statement objects
were not properly cleared and reset after use in cursor iters. The
regression was introduced by PR 27884 in Python 3.11a1. Patch by Erlend E.
Aasland.

@item 
gh-93973@footnote{https://github.com/python/cpython/issues/93973}: Add keyword argument @code{all_errors} to
@code{asyncio.create_connection} so that multiple connection errors can be
raised as an @code{ExceptionGroup}.

@item 
gh-93963@footnote{https://github.com/python/cpython/issues/93963}: Officially deprecate from @code{importlib.abc} classes moved to
@code{importlib.resources.abc}.

@item 
gh-93858@footnote{https://github.com/python/cpython/issues/93858}: Prevent error when activating venv in nested fish instances.

@item 
gh-93820@footnote{https://github.com/python/cpython/issues/93820}: Pickle @ref{834,,enum.Flag} by name.

@item 
gh-93847@footnote{https://github.com/python/cpython/issues/93847}: Fix repr of enum of generic aliases.

@item 
gh-91404@footnote{https://github.com/python/cpython/issues/91404}: Revert the @ref{be,,re} memory leak when a match is terminated by a
signal or memory allocation failure as the implemented fix caused a major
performance regression.

@item 
gh-83499@footnote{https://github.com/python/cpython/issues/83499}: Fix double closing of file description in @ref{e6,,tempfile}.

@item 
gh-93820@footnote{https://github.com/python/cpython/issues/93820}: Fixed a regression when @ref{756,,copy.copy()}-ing @ref{834,,enum.Flag}
with multiple flag members.

@item 
gh-79512@footnote{https://github.com/python/cpython/issues/79512}: Fixed names and @code{__module__} value of @ref{11a,,weakref} classes
@ref{1b5b,,ReferenceType}, @ref{1b5c,,ProxyType},
@ref{1b5d,,CallableProxyType}. It makes them pickleable.

@item 
gh-91389@footnote{https://github.com/python/cpython/issues/91389}: Fix an issue where @ref{3c,,dis} utilities could report missing or
incorrect position information in the presence of @code{CACHE} entries.

@item 
gh-93626@footnote{https://github.com/python/cpython/issues/93626}: Set @code{__future__.annotations} to have a @code{None}
mandatoryRelease to indicate that it is currently ‘TBD’.

@item 
gh-90473@footnote{https://github.com/python/cpython/issues/90473}: Emscripten and WASI have no home directory and cannot provide
@geindex Python 향상 제안; PEP 370
PEP 370@footnote{https://peps.python.org/pep-0370/} user site directory.

@item 
gh-90494@footnote{https://github.com/python/cpython/issues/90494}: @ref{756,,copy.copy()} and @ref{d64,,copy.deepcopy()} now always raise a
TypeError if @code{__reduce__()} returns a tuple with length 6 instead of
silently ignore the 6th item or produce incorrect result.

@item 
gh-90549@footnote{https://github.com/python/cpython/issues/90549}: Fix a multiprocessing bug where a global named resource (such as
a semaphore) could leak when a child process is spawned (as opposed to
forked).

@item 
gh-93521@footnote{https://github.com/python/cpython/issues/93521}: Fixed a case where dataclasses would try to add @code{__weakref__}
into the @code{__slots__} for a dataclass that specified
@code{weakref_slot=True} when it was already defined in one of its bases.
This resulted in a @code{TypeError} upon the new class being created.

@item 
gh-79579@footnote{https://github.com/python/cpython/issues/79579}: @ref{d4,,sqlite3} now correctly detects DML queries with leading
comments. Patch by Erlend E. Aasland.

@item 
gh-93421@footnote{https://github.com/python/cpython/issues/93421}: Update @ref{1b5e,,sqlite3.Cursor.rowcount} when a DML statement has
run to completion. This fixes the row count for SQL queries like @code{UPDATE
... RETURNING}. Patch by Erlend E. Aasland.

@item 
gh-93475@footnote{https://github.com/python/cpython/issues/93475}: Expose @code{FICLONE} and @code{FICLONERANGE} constants in
@ref{5d,,fcntl}. Patch by Illia Volochii.

@item 
gh-93370@footnote{https://github.com/python/cpython/issues/93370}: Deprecate @code{version} and @code{version_info}.

@item 
gh-91810@footnote{https://github.com/python/cpython/issues/91810}: Suppress writing an XML declaration in open files in
@code{ElementTree.write()} with @code{encoding='unicode'} and
@code{xml_declaration=None}.

@item 
gh-91162@footnote{https://github.com/python/cpython/issues/91162}: Support splitting of unpacked arbitrary-length tuple over
@code{TypeVar} and @code{TypeVarTuple} parameters. For example:


@itemize *

@item 
@code{A[T, *Ts][*tuple[int, ...]]} -> @code{A[int, *tuple[int, ...]]}

@item 
@code{A[*Ts, T][*tuple[int, ...]]} -> @code{A[*tuple[int, ...], int]}
@end itemize

@item 
gh-93353@footnote{https://github.com/python/cpython/issues/93353}: Fix the @ref{6b4,,importlib.resources.as_file()} context manager to
remove the temporary file if destroyed late during Python finalization:
keep a local reference to the @ref{12f5,,os.remove()} function. Patch by Victor
Stinner.

@item 
gh-83658@footnote{https://github.com/python/cpython/issues/83658}: Make @code{multiprocessing.Pool} raise an exception if
@code{maxtasksperchild} is not @code{None} or a positive int.

@item 
gh-93312@footnote{https://github.com/python/cpython/issues/93312}: Add @ref{6c1,,os.PIDFD_NONBLOCK} flag to open a file descriptor
for a process with @ref{6a3,,os.pidfd_open()} in non-blocking mode. Patch by
Kumar Aditya.

@item 
gh-88123@footnote{https://github.com/python/cpython/issues/88123}: Implement @code{Enum.__contains__} that returns @code{True} or
@code{False} to replace the deprecated behaviour that would sometimes raise a
@ref{198,,TypeError}.

@item 
gh-93297@footnote{https://github.com/python/cpython/issues/93297}: Make asyncio task groups prevent child tasks from being GCed

@item 
gh-85308@footnote{https://github.com/python/cpython/issues/85308}: Changed @ref{1bd,,argparse.ArgumentParser} to use
@ref{75c,,filesystem encoding and error handler} instead of default text
encoding to read arguments from file (e.g. @code{fromfile_prefix_chars}
option). This change affects Windows; argument file should be encoded with
UTF-8 instead of ANSI Codepage.

@item 
gh-93156@footnote{https://github.com/python/cpython/issues/93156}: Accessing the @ref{a21,,pathlib.PurePath.parents} sequence of an
absolute path using negative index values produced incorrect results.

@item 
gh-93162@footnote{https://github.com/python/cpython/issues/93162}: Add the ability for @ref{13b5,,logging.config.dictConfig()} to
usefully configure @ref{1b5f,,QueueHandler} and
@ref{242,,QueueListener} as a pair, and add
@ref{1b60,,logging.getHandlerByName()} and @ref{1a6e,,logging.getHandlerNames()} APIs
to allow access to handlers by name.

@item 
gh-93243@footnote{https://github.com/python/cpython/issues/93243}: The @code{smtpd} module was removed per the schedule in
@geindex Python 향상 제안; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/}.

@item 
gh-92886@footnote{https://github.com/python/cpython/issues/92886}: Replace @code{assert} statements with @code{raise AssertionError()} in
@code{BaseHandler} so that the tested behaviour is maintained
running with optimizations @code{(-O)}.

@item 
gh-90155@footnote{https://github.com/python/cpython/issues/90155}: Fix broken @ref{c67,,asyncio.Semaphore} when acquire is cancelled.

@item 
gh-90817@footnote{https://github.com/python/cpython/issues/90817}: The @code{locale.resetlocale()} function is deprecated and will
be removed in Python 3.13. Use @code{locale.setlocale(locale.LC_ALL, "")}
instead. Patch by Victor Stinner.

@item 
gh-91513@footnote{https://github.com/python/cpython/issues/91513}: Added @code{taskName} attribute to @ref{8b,,logging} module for use
with @ref{b,,asyncio} tasks.

@item 
gh-74696@footnote{https://github.com/python/cpython/issues/74696}: @ref{6d9,,shutil.make_archive()} no longer temporarily changes the
current working directory during creation of standard @code{.zip} or tar
archives.

@item 
gh-92728@footnote{https://github.com/python/cpython/issues/92728}: The @code{re.template()} function and the corresponding
@code{re.TEMPLATE} and @code{re.T} flags are restored after they were
removed in 3.11.0b1, but they are now deprecated, so they might be removed
from Python 3.13.

@item 
gh-93033@footnote{https://github.com/python/cpython/issues/93033}: Search in some strings (platform dependent i.e [U+0xFFFF,
U+0x0100] on Windows or [U+0xFFFFFFFF, U+0x00010000] on Linux 64-bit) are
now up to 10 times faster.

@item 
gh-89973@footnote{https://github.com/python/cpython/issues/89973}: Fix @code{re.error} raised in @ref{60,,fnmatch} if the pattern
contains a character range with upper bound lower than lower bound (e.g.
@code{[c-a]}). Now such ranges are interpreted as empty ranges.

@item 
gh-93044@footnote{https://github.com/python/cpython/issues/93044}: No longer convert the database argument of
@ref{5a5,,sqlite3.connect()} to bytes before passing it to the factory.

@item 
gh-93010@footnote{https://github.com/python/cpython/issues/93010}: In a very special case, the email package tried to append the
nonexistent @code{InvalidHeaderError} to the defect list. It should have been
@code{InvalidHeaderDefect}.

@item 
gh-92986@footnote{https://github.com/python/cpython/issues/92986}: Fix @ref{ae2,,ast.unparse()} when @code{ImportFrom.level} is @code{None}

@item 
gh-92932@footnote{https://github.com/python/cpython/issues/92932}: Now @ref{205,,dis()} and @ref{4ec,,get_instructions()} handle
operand values for instructions prefixed by @code{EXTENDED_ARG_QUICK}. Patch
by Sam Gross and Donghee Na.

@item 
gh-92675@footnote{https://github.com/python/cpython/issues/92675}: Fix @code{venv.ensure_directories()} to accept
@ref{266,,pathlib.Path} arguments in addition to @ref{169,,str} paths. Patch
by David Foster.

@item 
gh-87901@footnote{https://github.com/python/cpython/issues/87901}: Removed the @code{encoding} argument from @ref{31a,,os.popen()} that was
added in 3.11b1.

@item 
gh-91922@footnote{https://github.com/python/cpython/issues/91922}: Fix function @code{sqlite.connect()} and the
@code{sqlite.Connection} constructor on non-UTF-8 locales. Also, they
now support bytes paths non-decodable with the current FS encoding.

@item 
gh-92869@footnote{https://github.com/python/cpython/issues/92869}: Added @ref{1b61,,c_time_t} to @ref{2e,,ctypes}, which has the
same size as the @code{time_t} type in C.

@item 
gh-92839@footnote{https://github.com/python/cpython/issues/92839}: Fixed crash resulting from calling bisect.insort() or
bisect.insort_left() with the key argument not equal to @code{None}.

@item 
gh-90473@footnote{https://github.com/python/cpython/issues/90473}: @ref{dc,,subprocess} now fails early on Emscripten and WASI
platforms to work around missing @ref{1b62,,os.pipe()} on WASI.

@item 
gh-89325@footnote{https://github.com/python/cpython/issues/89325}: Removed many old deprecated @ref{10c,,unittest} features:
@ref{2b3,,TestCase} method aliases, undocumented and broken
@code{TestCase} method @code{assertDictContainsSubset},
undocumented @ref{593,,TestLoader.loadTestsFromModule} parameter `use_load_tests', and
an underscored alias of the @ref{753,,TextTestResult} class.

@item 
gh-92734@footnote{https://github.com/python/cpython/issues/92734}: Allow multi-element reprs emitted by @ref{c0,,reprlib} to be
pretty-printed using configurable indentation.

@item 
gh-92671@footnote{https://github.com/python/cpython/issues/92671}: Fixed @ref{ae2,,ast.unparse()} for empty tuples in the assignment
target context.

@item 
gh-91581@footnote{https://github.com/python/cpython/issues/91581}: @ref{352,,utcfromtimestamp()} no longer attempts
to resolve @code{fold} in the pure Python implementation, since the fold is
never 1 in UTC. In addition to being slightly faster in the common case,
this also prevents some errors when the timestamp is close to
@ref{1b63,,datetime.min}.  Patch by Paul Ganssle.

@item 
gh-86388@footnote{https://github.com/python/cpython/issues/86388}: Removed randrange() functionality deprecated since Python 3.10.
Formerly, randrange(10.0) losslessly converted to randrange(10). Now, it
raises a TypeError. Also, the exception raised for non-integral values
such as randrange(10.5) or randrange(‘10’) has been changed from
ValueError to TypeError.

@item 
gh-90385@footnote{https://github.com/python/cpython/issues/90385}: Add @ref{6ce,,pathlib.Path.walk()} as an alternative to
@ref{6cf,,os.walk()}.

@item 
gh-92550@footnote{https://github.com/python/cpython/issues/92550}: Fix @ref{538,,pathlib.Path.rglob()} for empty pattern.

@item 
gh-92591@footnote{https://github.com/python/cpython/issues/92591}: Allow @ref{8b,,logging} filters to return a
@ref{11e5,,logging.LogRecord} instance so that filters attached to
@ref{169b,,logging.Handler}s can enrich records without side effects on
other handlers.

@item 
gh-92445@footnote{https://github.com/python/cpython/issues/92445}: Fix a bug in @ref{7,,argparse} where @code{nargs="*"} would raise an
error instead of returning an empty list when 0 arguments were supplied if
choice was also defined in @code{parser.add_argument}.

@item 
gh-92547@footnote{https://github.com/python/cpython/issues/92547}: Remove undocumented @ref{d4,,sqlite3} features deprecated in Python
3.10:


@itemize *

@item 
@code{sqlite3.enable_shared_cache()}

@item 
@code{sqlite3.OptimizedUnicode}
@end itemize

Patch by Erlend E. Aasland.

@item 
gh-92530@footnote{https://github.com/python/cpython/issues/92530}: Fix an issue that occurred after interrupting
@ref{1b64,,threading.Condition.notify()}.

@item 
gh-92531@footnote{https://github.com/python/cpython/issues/92531}: The statistics.median_grouped() function now always return a
float. Formerly, it did not convert the input type when for sequences of
length one.

@item 
gh-84131@footnote{https://github.com/python/cpython/issues/84131}: The @ref{266,,pathlib.Path} deprecated method @code{link_to} has been
removed. Use 3.10’s @ref{a22,,hardlink_to()} method instead as
its semantics are consistent with that of
@ref{a23,,symlink_to()}.

@item 
gh-89336@footnote{https://github.com/python/cpython/issues/89336}: Removed @ref{26,,configparser} module APIs: the
@code{SafeConfigParser} class alias, the @code{ParsingError.filename} property
and parameter, and the @code{ConfigParser.readfp} method, all of which were
deprecated since Python 3.2.

@item 
gh-92391@footnote{https://github.com/python/cpython/issues/92391}: Add @ref{942,,__class_getitem__()} to
@ref{bd7,,csv.DictReader} and @ref{1403,,csv.DictWriter}, allowing them to be
parameterized at runtime. Patch by Marc Mueller.

@item 
gh-91968@footnote{https://github.com/python/cpython/issues/91968}: Add @code{SO_RTABLE} and @code{SO_USER_COOKIE} constants to
@ref{d1,,socket}.

@item 
gh-91810@footnote{https://github.com/python/cpython/issues/91810}: @ref{b47,,ElementTree} method
@ref{c8b,,write()} and function
@ref{11f4,,tostring()} now use the text file’s encoding
(“UTF-8” if not available) instead of locale encoding in XML declaration
when @code{encoding="unicode"} is specified.

@item 
gh-81790@footnote{https://github.com/python/cpython/issues/81790}: @ref{dee,,os.path.splitdrive()} now understands DOS device paths with
UNC links (beginning @code{\\?\UNC\}). Contributed by Barney Gale.

@item 
gh-91760@footnote{https://github.com/python/cpython/issues/91760}: Apply more strict rules for numerical group references and group
names in regular expressions. Only sequence of ASCII digits is now
accepted as a numerical reference. The group name in bytes patterns and
replacement strings can now only contain ASCII letters and digits and
underscore.

@item 
gh-90622@footnote{https://github.com/python/cpython/issues/90622}: Worker processes for
@ref{1d6,,concurrent.futures.ProcessPoolExecutor} are no longer spawned on
demand (a feature added in 3.9) when the multiprocessing context start
method is @code{"fork"} as that can lead to deadlocks in the child processes
due to a fork happening while threads are running.

@item 
gh-91577@footnote{https://github.com/python/cpython/issues/91577}: Move imports in @code{SharedMemory} methods
to module level so that they can be executed late in python finalization.

@item 
gh-91581@footnote{https://github.com/python/cpython/issues/91581}: Remove an unhandled error case in the C implementation of calls
to @ref{711,,datetime.fromtimestamp} with
no time zone (i.e. getting a local time from an epoch timestamp). This
should have no user-facing effect other than giving a possibly more
accurate error message when called with timestamps that fall on
10000-01-01 in the local time. Patch by Paul Ganssle.

@item 
gh-91539@footnote{https://github.com/python/cpython/issues/91539}: Improve performance of @code{urllib.request.getproxies_environment}
when there are many environment variables

@item 
gh-91524@footnote{https://github.com/python/cpython/issues/91524}: Speed up the regular expression substitution (functions
@ref{5a2,,re.sub()} and @ref{5a3,,re.subn()} and corresponding @ref{1b65,,re.Pattern}
methods) for replacement strings containing group references by 2–3
times.

@item 
gh-91447@footnote{https://github.com/python/cpython/issues/91447}: Fix findtext in the xml module to only give an empty string when
the text attribute is set to @code{None}.

@item 
gh-91456@footnote{https://github.com/python/cpython/issues/91456}: Deprecate current default auto() behavior:  In 3.13 the default
will be for for auto() to always return the largest member value
incremented by 1, and to raise if incompatible value types are used.

@item 
bpo-47231@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47231}: Fixed an issue with inconsistent trailing slashes in tarfile
longname directories.

@item 
bpo-39064@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39064}: @ref{8d2,,zipfile.ZipFile} now raises @ref{1b66,,zipfile.BadZipFile}
instead of @code{ValueError} when reading a corrupt zip file in which the
central directory offset is negative.

@item 
bpo-41287@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41287}: Fix handling of the @code{doc} argument in subclasses of
@ref{4b3,,property()}.

@item 
gh-90005@footnote{https://github.com/python/cpython/issues/90005}: @ref{2e,,ctypes} dependency @code{libffi} is now detected with
@code{pkg-config}.

@item 
bpo-32547@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32547}: The constructors for @ref{1403,,DictWriter} and
@ref{bd7,,DictReader} now coerce the @code{fieldnames} argument to a
@ref{24d,,list} if it is an iterator.

@item 
bpo-35540@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35540}: Fix @ref{1a95,,dataclasses.asdict()} crash when
@ref{13c1,,collections.defaultdict} is present in the attributes.

@item 
bpo-47063@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47063}: Add an index_pages parameter to support using non-default index
page names.

@item 
bpo-47025@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47025}: Drop support for @ref{192,,bytes} on @ref{3e4,,sys.path}.

@item 
bpo-46951@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46951}: Order the contents of zipapp archives, to make builds more
reproducible.

@item 
bpo-42777@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42777}: Implement @ref{c0b,,pathlib.Path.is_mount()} for Windows paths.

@item 
bpo-46755@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46755}: In @code{QueueHandler}, clear @code{stack_info} from
@code{LogRecord} to prevent stack trace from being written twice.

@item 
bpo-45393@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45393}: Fix the formatting for @code{await x} and @code{not x} in the
operator precedence table when using the @ref{ad4,,help()} system.

@item 
bpo-46642@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46642}: Improve error message when trying to subclass an instance of
@ref{487,,typing.TypeVar}, @ref{488,,typing.ParamSpec},
@ref{489,,typing.TypeVarTuple}, etc. Based on patch by Gregory Beauregard.

@item 
bpo-46364@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46364}: Restrict use of sockets instead of pipes for stdin of
subprocesses created by @ref{b,,asyncio} to AIX platform only.

@item 
bpo-28249@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28249}: Set @ref{17cd,,doctest.DocTest.lineno} to @code{None} when an object
does not have @ref{b21,,__doc__}.

@item 
bpo-46197@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46197}: Fix @ref{59,,ensurepip} environment isolation for subprocess
running @code{pip}.

@item 
bpo-45924@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45924}: Fix @ref{b,,asyncio} incorrect traceback when future’s exception
is raised multiple times. Patch by Kumar Aditya.

@item 
bpo-45046@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45046}: Add support of context managers in @ref{10c,,unittest}: methods
@ref{8c7,,enterContext()} and
@ref{8c8,,enterClassContext()} of class
@ref{2b3,,TestCase}, method
@ref{8c9,,enterAsyncContext()} of class
@ref{361,,IsolatedAsyncioTestCase} and function
@ref{8ca,,unittest.enterModuleContext()}.

@item 
bpo-44173@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44173}: Enable fast seeking of uncompressed unencrypted
@code{zipfile.ZipExtFile}

@item 
bpo-42627@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42627}: Fix incorrect parsing of Windows registry proxy settings

@item 
bpo-42047@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42047}: Add @ref{c31,,threading.get_native_id()} support for DragonFly BSD.
Patch by David Carlier.

@item 
bpo-14243@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14243}: The @ref{6ec,,tempfile.NamedTemporaryFile} function has a new
optional parameter `delete_on_close'

@item 
bpo-41246@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41246}: Give the same callback function for when the overlapped
operation is done to the functions @code{recv}, @code{recv_into}, @code{recvfrom},
@code{sendto}, @code{send} and @code{sendfile} inside @code{IocpProactor}.

@item 
bpo-39264@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39264}: Fixed @code{collections.UserDict.get()} to not call
@ref{13c2,,__missing__()} when a value is not found. This matches the
behavior of @ref{183,,dict}. Patch by Bar Harel.

@item 
bpo-38693@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38693}: @ref{7b,,importlib} now uses f-strings internally instead of
@code{str.format}.

@item 
bpo-38267@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38267}: Add `timeout' parameter to
@ref{ae4,,asyncio.loop.shutdown_default_executor()}. The default value is
@code{None}, which means the executor will be given an unlimited amount of
time. When called from @ref{2f5,,asyncio.Runner} or @ref{2f3,,asyncio.run()}, the
default timeout is 5 minutes.

@item 
bpo-34828@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34828}: @ref{54f,,sqlite3.Connection.iterdump()} now handles databases that
use @code{AUTOINCREMENT} in one or more tables.

@item 
bpo-32990@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32990}: Support reading wave files with the @code{WAVE_FORMAT_EXTENSIBLE}
format in the @ref{119,,wave} module.

@item 
bpo-26253@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26253}: Allow adjustable compression level for tarfile streams in
@ref{1076,,tarfile.open()}.
@end itemize

@node Documentation<28>,Tests<28>,Library<87>,Python 3 12 0 alpha 1
@anchor{whatsnew/changelog id387}@anchor{1b67}
@subsubsection Documentation



@itemize -

@item 
gh-85525@footnote{https://github.com/python/cpython/issues/85525}: Remove extra row

@item 
gh-86404@footnote{https://github.com/python/cpython/issues/86404}: Deprecated tools @code{make suspicious} and @code{rstlint.py} are now
removed. They have been replaced by sphinx-lint@footnote{https://pypi.org/project/sphinx-lint/}.

@item 
gh-97741@footnote{https://github.com/python/cpython/issues/97741}: Fix @code{!} in c domain ref target syntax via a @code{conf.py} patch,
so it works as intended to disable ref target resolution.

@item 
gh-96432@footnote{https://github.com/python/cpython/issues/96432}: Fraction literals now support whitespace around the forward
slash, @code{Fraction('2 / 3')}.

@item 
gh-96098@footnote{https://github.com/python/cpython/issues/96098}: Improve discoverability of the higher level concurrent.futures
module by providing clearer links from the lower level threading and
multiprocessing modules.

@item 
gh-95957@footnote{https://github.com/python/cpython/issues/95957}: What’s New 3.11 now has instructions for how to provide compiler
and linker flags for Tcl/Tk and OpenSSL on RHEL 7 and CentOS 7.

@item 
gh-95588@footnote{https://github.com/python/cpython/issues/95588}: Clarified the conflicting advice given in the @ref{9,,ast}
documentation about @ref{e11,,ast.literal_eval()} being “safe” for use on
untrusted input while at the same time warning that it can crash the
process. The latter statement is true and is deemed unfixable without a
large amount of work unsuitable for a bugfix. So we keep the warning and
no longer claim that @code{literal_eval} is safe.

@item 
gh-91207@footnote{https://github.com/python/cpython/issues/91207}: Fix stylesheet not working in Windows CHM htmlhelp docs and add
warning that they are deprecated. Contributed by C.A.M. Gerlach.

@item 
gh-95454@footnote{https://github.com/python/cpython/issues/95454}: Replaced incorrectly written true/false values in documentation.
Patch by Robert O’Shea

@item 
gh-95451@footnote{https://github.com/python/cpython/issues/95451}: Update library documentation with @ref{1b68,,availability information} on WebAssembly platforms @code{wasm32-emscripten} and
@code{wasm32-wasi}.

@item 
gh-95415@footnote{https://github.com/python/cpython/issues/95415}: Use consistent syntax for platform availability. The directive
now supports a content body and emits a warning when it encounters an
unknown platform.

@item 
gh-94321@footnote{https://github.com/python/cpython/issues/94321}: Document the 
@geindex Python 향상 제안; PEP 246
PEP 246@footnote{https://peps.python.org/pep-0246/} style protocol type
@ref{1b69,,sqlite3.PrepareProtocol}.

@item 
gh-86128@footnote{https://github.com/python/cpython/issues/86128}: Document a limitation in ThreadPoolExecutor where its exit
handler is executed before any handlers in atexit.

@item 
gh-61162@footnote{https://github.com/python/cpython/issues/61162}: Clarify @ref{d4,,sqlite3} behavior when
@ref{1b6a,,How to use the connection context manager}.

@item 
gh-87260@footnote{https://github.com/python/cpython/issues/87260}: Align @ref{d4,,sqlite3} argument specs with the actual
implementation.

@item 
gh-86986@footnote{https://github.com/python/cpython/issues/86986}: The minimum Sphinx version required to build the documentation
is now 3.2.

@item 
gh-88831@footnote{https://github.com/python/cpython/issues/88831}: Augmented documentation of asyncio.create_task(). Clarified the
need to keep strong references to tasks and added a code snippet detailing
how to do this.

@item 
gh-86438@footnote{https://github.com/python/cpython/issues/86438}: Clarify that @ref{ac5,,-W} and 
@geindex PYTHONWARNINGS
@geindex 환경 변수; PYTHONWARNINGS
@ref{da2,,PYTHONWARNINGS} are
matched literally and case-insensitively, rather than as regular
expressions, in @ref{118,,warnings}.

@item 
gh-93031@footnote{https://github.com/python/cpython/issues/93031}: Update tutorial introduction output to use 3.10+ SyntaxError
invalid range.

@item 
gh-92240@footnote{https://github.com/python/cpython/issues/92240}: Added release dates for “What’s New in Python 3.X” for 3.0, 3.1,
3.2, 3.8 and 3.10

@item 
bpo-47161@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47161}: Document that @ref{6cc,,pathlib.PurePath} does not collapse
initial double slashes because they denote UNC paths.

@item 
bpo-40838@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40838}: Document that @ref{bec,,inspect.getdoc()},
@ref{1b6b,,inspect.getmodule()}, and @ref{1b6c,,inspect.getsourcefile()} might return
@code{None}.

@item 
bpo-43689@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43689}: The @code{Differ} documentation now also mentions other whitespace
characters, which make it harder to understand the diff output.

@item 
bpo-38056@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38056}: Overhaul the @ref{1b6d,,에러 처리기} documentation in
@ref{1c,,codecs}.

@item 
bpo-13553@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13553}: Document tkinter.Tk args.
@end itemize

@node Tests<28>,Build<33>,Documentation<28>,Python 3 12 0 alpha 1
@anchor{whatsnew/changelog id388}@anchor{1b6e}
@subsubsection Tests



@itemize -

@item 
gh-95027@footnote{https://github.com/python/cpython/issues/95027}: On Windows, when the Python test suite is run with the @code{-jN}
option, the ANSI code page is now used as the encoding for the stdout
temporary file, rather than using UTF-8 which can lead to decoding errors.
Patch by Victor Stinner.

@item 
gh-96624@footnote{https://github.com/python/cpython/issues/96624}: Fixed the failure of repeated runs of @code{test.test_unittest}
caused by side effects in @code{test_dotted_but_module_not_loaded}.

@item 
gh-95243@footnote{https://github.com/python/cpython/issues/95243}: Mitigate the inherent race condition from using
find_unused_port() in testSockName() by trying to find an unused port a
few times before failing. Patch by Ross Burton.

@item 
gh-95573@footnote{https://github.com/python/cpython/issues/95573}: Lib/test/test_asyncio/test_ssl.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/test/test_asyncio/test_ssl.py} exposed a bug in the
macOS kernel where intense concurrent load on non-blocking sockets
occasionally causes @ref{1b6f,,errno.ENOBUFS} (“No buffer space available”)
to be emitted. FB11063974 filed with Apple, in the mean time as a
workaround buffer size used in tests on macOS is decreased to avoid
intermittent failures.  Patch by Fantix King.

@item 
gh-95280@footnote{https://github.com/python/cpython/issues/95280}: Fix problem with @code{test_ssl} @code{test_get_ciphers} on systems
that require perfect forward secrecy (PFS) ciphers.

@item 
gh-95212@footnote{https://github.com/python/cpython/issues/95212}: Make multiprocessing test case @code{test_shared_memory_recreate}
parallel-safe.

@item 
gh-95218@footnote{https://github.com/python/cpython/issues/95218}: Move tests for importlib.resources into
test_importlib.resources.

@item 
gh-93963@footnote{https://github.com/python/cpython/issues/93963}: Updated tests to use preferred location for
@code{importlib.resources} ABCs.

@item 
gh-94675@footnote{https://github.com/python/cpython/issues/94675}: Add a regression test for @ref{be,,re} exponentional slowdown when
using rjsmin.

@item 
gh-91330@footnote{https://github.com/python/cpython/issues/91330}: Added more tests for @ref{33,,dataclasses} to cover behavior with
data descriptor-based fields.

@item 
gh-94208@footnote{https://github.com/python/cpython/issues/94208}: @code{test_ssl} is now checking for supported TLS version and
protocols in more tests.

@item 
gh-94315@footnote{https://github.com/python/cpython/issues/94315}: Tests now check for DAC override capability instead of relying
on @ref{1b70,,os.geteuid()}.

@item 
gh-54781@footnote{https://github.com/python/cpython/issues/54781}: Rename test_tk to test_tkinter, and rename test_ttk_guionly to
test_ttk. Patch by Victor Stinner.

@item 
gh-93839@footnote{https://github.com/python/cpython/issues/93839}: Move @code{Lib/ctypes/test/} to @code{Lib/test/test_ctypes/}. Patch by
Victor Stinner.

@item 
gh-93951@footnote{https://github.com/python/cpython/issues/93951}: In test_bdb.StateTestCase.test_skip, avoid including auxiliary
importers.

@item 
gh-93957@footnote{https://github.com/python/cpython/issues/93957}: Provide nicer error reporting from subprocesses in
test_venv.EnsurePipTest.test_with_pip.

@item 
gh-93884@footnote{https://github.com/python/cpython/issues/93884}: Add test cases for @ref{1b71,,PyNumber_ToBase()} that take a large
number or a non-int object as parameter.

@item 
gh-93852@footnote{https://github.com/python/cpython/issues/93852}: test_asyncio, test_logging, test_socket and test_socketserver
now create AF_UNIX domains in the current directory to no longer fail with
@code{OSError("AF_UNIX path too long")} if the temporary directory (the
@geindex TMPDIR
@geindex 환경 변수; TMPDIR
@code{TMPDIR} environment variable) is too long. Patch by Victor
Stinner.

@item 
gh-93353@footnote{https://github.com/python/cpython/issues/93353}: regrtest now checks if a test leaks temporary files or
directories if run with -jN option. Patch by Victor Stinner.

@item 
gh-84461@footnote{https://github.com/python/cpython/issues/84461}: @code{run_tests.py} now handles cross compiling env vars correctly
and pass @code{HOSTRUNNER} to regression tests.

@item 
gh-93616@footnote{https://github.com/python/cpython/issues/93616}: @code{test_modulefinder} now creates a temporary directory in
@code{ModuleFinderTest.setUp()} instead of module scope.

@item 
gh-93575@footnote{https://github.com/python/cpython/issues/93575}: Fix issue with test_unicode test_raiseMemError. The test case
now use @code{test.support.calcobjsize} to calculate size of PyUnicode
structs. @ref{1ad9,,sys.getsizeof()} may return different size when string has
UTF-8 memory.

@item 
gh-90473@footnote{https://github.com/python/cpython/issues/90473}: WASI does not have a @code{chmod(2)} syscall. @ref{529,,os.chmod()} is
now a dummy function on WASI. Skip all tests that depend on working
@code{os.chmod()}.

@item 
gh-90473@footnote{https://github.com/python/cpython/issues/90473}: Skip tests on WASI that require symlinks with absolute paths.

@item 
gh-57539@footnote{https://github.com/python/cpython/issues/57539}: Increase calendar test coverage for
@code{calendar.LocaleTextCalendar.formatweekday()}.

@item 
gh-90473@footnote{https://github.com/python/cpython/issues/90473}: Skip symlink tests on WASI. wasmtime uses @code{openat2(2)} with
@code{RESOLVE_BENEATH} flag, which prevents symlinks with absolute paths.

@item 
gh-89858@footnote{https://github.com/python/cpython/issues/89858}: Fix @code{test_embed} for out-of-tree builds. Patch by Kumar
Aditya.

@item 
gh-92886@footnote{https://github.com/python/cpython/issues/92886}: Fixing tests that fail when running with optimizations (@code{-O})
in @code{test_imaplib.py}.

@item 
gh-92886@footnote{https://github.com/python/cpython/issues/92886}: Fixing tests that fail when running with optimizations (@code{-O})
in @code{test_zipimport.py}

@item 
gh-92886@footnote{https://github.com/python/cpython/issues/92886}: Fixing tests that fail when running with optimizations (@code{-O})
in @code{test_py_compile.py}

@item 
gh-92886@footnote{https://github.com/python/cpython/issues/92886}: Fixing tests that fail when running with optimizations (@code{-O})
in @code{test_sys_settrace.py}.

@item 
gh-92886@footnote{https://github.com/python/cpython/issues/92886}: Fixing tests that fail when running with optimizations (@code{-O})
in @code{_test_multiprocessing.py}

@item 
gh-92670@footnote{https://github.com/python/cpython/issues/92670}: Skip @code{test_shutil.TestCopy.test_copyfile_nonexistent_dir} test
on AIX as the test uses a trailing slash to force the OS consider the path
as a directory, but on AIX the trailing slash has no effect and is
considered as a file.

@item 
gh-92514@footnote{https://github.com/python/cpython/issues/92514}: Remove unused @code{test.support.BasicTestRunner}. Patch by Jelle
Zijlstra.

@item 
bpo-47016@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47016}: Create a GitHub Actions workflow for verifying bundled pip and
setuptools. Patch by Illia Volochii and Adam Turner.
@end itemize

@node Build<33>,Windows<29>,Tests<28>,Python 3 12 0 alpha 1
@anchor{whatsnew/changelog id389}@anchor{1b72}
@subsubsection Build



@itemize -

@item 
gh-96761@footnote{https://github.com/python/cpython/issues/96761}: Fix the build process of clang compiler for
@code{_bootstrap_python} if LTO optimization is applied. Patch by
Matthias Görgens and Donghee Na.

@item 
gh-96883@footnote{https://github.com/python/cpython/issues/96883}: @code{wasm32-emscripten} builds for browsers now include
@ref{24,,concurrent.futures} for @ref{b,,asyncio} and @ref{10d,,unittest.mock}.

@item 
gh-85936@footnote{https://github.com/python/cpython/issues/85936}: CPython now uses the ThinLTO option as the default policy if the
Clang compiler accepts the flag. Patch by Donghee Na.

@item 
gh-96729@footnote{https://github.com/python/cpython/issues/96729}: Ensure that Windows releases built with
@code{Tools\msi\buildrelease.bat} are upgradable to and from official Python
releases.

@item 
gh-96269@footnote{https://github.com/python/cpython/issues/96269}: Shared module targets now depend on new @code{MODULE_DEPS}
variable, which includes @code{EXPORTSYMS}. This fixes a build order issue on
unsupported AIX platform.

@item 
gh-84461@footnote{https://github.com/python/cpython/issues/84461}: @code{wasm32-emscripten} platform no longer builds @ref{c1,,resource}
module, @ref{151a,,getresuid()}, @ref{1519,,getresgid()}, and their setters.
The APIs are stubs and not functional.

@item 
gh-95973@footnote{https://github.com/python/cpython/issues/95973}: Add a new @code{--with-dsymutil} configure option to link debug
information in macOS. Patch by Pablo Galindo.

@item 
gh-90536@footnote{https://github.com/python/cpython/issues/90536}: Use the BOLT post-link optimizer to improve performance,
particularly on medium-to-large applications.

@item 
gh-93744@footnote{https://github.com/python/cpython/issues/93744}: Remove the @code{configure --with-cxx-main} build option: it didn’t
work for many years. Remove the @code{MAINCC} variable from @code{configure} and
@code{Makefile}. Patch by Victor Stinner.

@item 
gh-94801@footnote{https://github.com/python/cpython/issues/94801}: Fix a regression in @code{configure} script that caused some header
checks to ignore custom @code{CPPFLAGS}. The regression was introduced in
gh-94802@footnote{https://github.com/python/cpython/issues/94802}.

@item 
gh-95145@footnote{https://github.com/python/cpython/issues/95145}: wasm32-wasi builds no longer depend on WASIX’s pthread stubs.
Python now has its own stubbed pthread API.

@item 
gh-95174@footnote{https://github.com/python/cpython/issues/95174}: Python now detects missing @code{dup} function in WASI and works
around some missing @ref{5b,,errno}, @ref{c6,,select}, and @ref{d1,,socket}
constants.

@item 
gh-95174@footnote{https://github.com/python/cpython/issues/95174}: Python now skips missing @ref{d1,,socket} functions and methods on
WASI. WASI can only create sockets from existing fd / accept and has no
netdb.

@item 
gh-95085@footnote{https://github.com/python/cpython/issues/95085}: Platforms @code{wasm32-unknown-emscripten} and
@code{wasm32-unknown-wasi} have been promoted to 
@geindex Python 향상 제안; PEP 11
PEP 11@footnote{https://peps.python.org/pep-0011/} tier 3 platform
support.

@item 
gh-94847@footnote{https://github.com/python/cpython/issues/94847}: Fixed @code{_decimal} module build issue on GCC when compiling with
LTO and pydebug. Debug builds no longer force inlining of functions.

@item 
gh-94841@footnote{https://github.com/python/cpython/issues/94841}: Fix the possible performance regression of
@ref{e5f,,PyObject_Free()} compiled with MSVC version 1932.

@item 
gh-94801@footnote{https://github.com/python/cpython/issues/94801}: @code{configure} now uses custom flags like @code{ZLIB_CFLAGS} and
@code{ZLIB_LIBS} when searching for headers and libraries.

@item 
gh-94773@footnote{https://github.com/python/cpython/issues/94773}: @code{deepfreeze.py} now supports code object with frozensets that
contain incompatible, unsortable types.

@item 
gh-94682@footnote{https://github.com/python/cpython/issues/94682}: Build and test with OpenSSL 1.1.1q

@item 
gh-90005@footnote{https://github.com/python/cpython/issues/90005}: Dependencies of @ref{bf,,readline} and @ref{2f,,curses} module are now
detected in @code{configure} script with @code{pkg-config}. Only @code{ncurses} /
@code{ncursesw} are detected automatically. The old @code{curses} library is not
configured automatically. Workaround for missing @code{termcap} or @code{tinfo}
library has been removed.

@item 
gh-90005@footnote{https://github.com/python/cpython/issues/90005}: Fix building @code{_ctypes} extension without @code{pkg-config}.

@item 
gh-90005@footnote{https://github.com/python/cpython/issues/90005}: @code{_dbm} module dependencies are now detected by configure.

@item 
gh-94404@footnote{https://github.com/python/cpython/issues/94404}: @code{makesetup} now works around an issue with sed on macOS and
uses correct CFLAGS for object files that end up in a shared extension.
Module CFLAGS are used before PY_STDMODULE_CFLAGS to avoid clashes with
system headers.

@item 
gh-93939@footnote{https://github.com/python/cpython/issues/93939}: C extension modules are now built by @code{configure} and @code{make}
instead of @code{distutils} and @code{setup.py}.

@item 
gh-93939@footnote{https://github.com/python/cpython/issues/93939}: The @code{2to3}, @code{idle}, and @code{pydoc} scripts are now generated
and installed by @code{Makefile} instead of @code{setup.py}.

@item 
gh-94280@footnote{https://github.com/python/cpython/issues/94280}: Updated pegen regeneration script on Windows to find and use
Python 3.9 or higher.  Prior to this, pegen regeneration already required
3.9 or higher, but the script may have used lower versions of Python.

@item 
gh-93584@footnote{https://github.com/python/cpython/issues/93584}: Address race condition in @code{Makefile} when installing a PGO
build. All @code{test} and @code{install} targets now depend on @code{all} target.

@item 
gh-93491@footnote{https://github.com/python/cpython/issues/93491}: @code{configure} now detects and reports 
@geindex Python 향상 제안; PEP 11
PEP 11@footnote{https://peps.python.org/pep-0011/} support tiers.

@item 
gh-69093@footnote{https://github.com/python/cpython/issues/69093}: Fix @code{Modules/Setup.stdlib.in} rule for @code{_sqlite3} extension.

@item 
gh-93207@footnote{https://github.com/python/cpython/issues/93207}: @code{va_start()} with two parameters, like @code{va_start(args,
format),} is now required to build Python. @code{va_start()} is no longer
called with a single parameter. Patch by Kumar Aditya.

@item 
gh-93202@footnote{https://github.com/python/cpython/issues/93202}: Python now always use the @code{%zu} and @code{%zd} printf formats to
format a @code{size_t} or @code{Py_ssize_t} number. Building Python 3.12
requires a C11 compiler, so these printf formats are now always supported.
Patch by Victor Stinner.

@item 
gh-90473@footnote{https://github.com/python/cpython/issues/90473}: Disable pymalloc and increase stack size on @code{wasm32-wasi}.

@item 
bpo-34449@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34449}: Drop invalid compiler switch @code{-fPIC} for HP aCC on HP-UX.
Patch by Michael Osipov.
@end itemize

@node Windows<29>,macOS<20>,Build<33>,Python 3 12 0 alpha 1
@anchor{whatsnew/changelog id390}@anchor{1b73}
@subsubsection Windows



@itemize -

@item 
gh-98360@footnote{https://github.com/python/cpython/issues/98360}: Fixes @ref{98,,multiprocessing} spawning child processes on Windows
from a virtual environment to ensure that child processes that also use
@code{multiprocessing} to spawn more children will recognize that they are
in a virtual environment.

@item 
gh-98414@footnote{https://github.com/python/cpython/issues/98414}: Fix @code{py.exe} launcher handling of @code{-V:@var{<company>}/}
option when default preferences have been set in environment variables or
configuration files.

@item 
gh-97728@footnote{https://github.com/python/cpython/issues/97728}: Fix possible crashes caused by the use of uninitialized
variables when pass invalid arguments in @ref{1662,,os.system()} on Windows and
in Windows-specific modules (like @code{winreg}).

@item 
gh-90989@footnote{https://github.com/python/cpython/issues/90989}: Made @ref{7d9,,Python install manager} install per-user by default (unless an all
users install already exists), and clarify some text in the installer.

@item 
gh-97649@footnote{https://github.com/python/cpython/issues/97649}: The @code{Tools} directory is no longer installed on Windows

@item 
gh-96965@footnote{https://github.com/python/cpython/issues/96965}: Update libffi to 3.4.3

@item 
gh-96577@footnote{https://github.com/python/cpython/issues/96577}: Fixes a potential buffer overrun in @code{msilib}.

@item 
gh-96559@footnote{https://github.com/python/cpython/issues/96559}: Fixes the Windows launcher not using the compatible
interpretation of default tags found in configuration files when no tag
was passed to the command.

@item 
gh-94781@footnote{https://github.com/python/cpython/issues/94781}: Fix @code{pcbuild.proj} to clean previous instances of output
files in @code{Python\deepfreeze} and @code{Python\frozen_modules} directories
on Windows. Patch by Charlie Zhao.

@item 
gh-89545@footnote{https://github.com/python/cpython/issues/89545}: Updates @ref{af,,platform} code getting the Windows version to use
native Windows Management Instrumentation (WMI) queries to determine OS
version, type, and architecture.

@item 
gh-95733@footnote{https://github.com/python/cpython/issues/95733}: Make certain requirements of the Windows Store package optional
to allow installing on earlier updates of Windows.

@item 
gh-95656@footnote{https://github.com/python/cpython/issues/95656}: Enable the @ref{a3f,,enable_load_extension()}
@ref{d4,,sqlite3} API.

@item 
gh-95587@footnote{https://github.com/python/cpython/issues/95587}: Fixes some issues where the Windows installer would incorrectly
detect certain features of an existing install when upgrading.

@item 
gh-94399@footnote{https://github.com/python/cpython/issues/94399}: Restores the behaviour of @ref{7d9,,Python install manager} for @code{/usr/bin/env}
shebang lines, which will now search 
@geindex PATH
@geindex 환경 변수; PATH
@code{PATH} for an executable
matching the given command. If none is found, the usual search process is
used.

@item 
gh-95445@footnote{https://github.com/python/cpython/issues/95445}: Fixes the unsuccessful removal of the HTML document directory
when uninstalling with Windows msi.

@item 
gh-95359@footnote{https://github.com/python/cpython/issues/95359}: Fix @ref{7d9,,Python install manager} handling of @code{py.ini} commands (it was
incorrectly expecting a @code{py_} prefix on keys) and crashes when reading
per-user configuration file.

@item 
gh-95285@footnote{https://github.com/python/cpython/issues/95285}: Fix @ref{7d9,,Python install manager} handling of command lines where it is only
passed a short executable name.

@item 
gh-90844@footnote{https://github.com/python/cpython/issues/90844}: Allow virtual environments to correctly launch when they have
spaces in the path.

@item 
gh-94772@footnote{https://github.com/python/cpython/issues/94772}: Fix incorrect handling of shebang lines in py.exe launcher

@item 
gh-94018@footnote{https://github.com/python/cpython/issues/94018}: @ref{137,,zipfile} will now remove trailing spaces from path
components when extracting files on Windows.

@item 
gh-93824@footnote{https://github.com/python/cpython/issues/93824}: Drag and drop of files onto Python files in Windows Explorer has
been enabled for Windows ARM64.

@item 
gh-43414@footnote{https://github.com/python/cpython/issues/43414}: @ref{1307,,os.get_terminal_size()} now attempts to read the size from
any provided handle, rather than only supporting file descriptors 0, 1 and
2.

@item 
gh-92817@footnote{https://github.com/python/cpython/issues/92817}: Ensures that @code{py.exe} will prefer an active virtual
environment over default tags specified with environment variables or
through a @code{py.ini} file.

@item 
gh-92984@footnote{https://github.com/python/cpython/issues/92984}: Explicitly disable incremental linking for non-Debug builds

@item 
gh-92841@footnote{https://github.com/python/cpython/issues/92841}: @ref{b,,asyncio} no longer throws @code{RuntimeError: Event loop is
closed} on interpreter exit after asynchronous socket activity. Patch by
Oleg Iarygin.

@item 
bpo-46907@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46907}: Update Windows installer to use SQLite 3.38.4.

@item 
gh-91061@footnote{https://github.com/python/cpython/issues/91061}: Accept os.PathLike for the argument to winsound.PlaySound

@item 
bpo-42658@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42658}: Support native Windows case-insensitive path comparisons by
using @code{LCMapStringEx} instead of @ref{1b74,,str.lower()} in
@code{ntpath.normcase()}. Add @code{LCMapStringEx} to the @code{_winapi}
module.

@item 
bpo-38704@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38704}: Prevent installation on unsupported Windows versions.
@end itemize

@node macOS<20>,IDLE<15>,Windows<29>,Python 3 12 0 alpha 1
@anchor{whatsnew/changelog id391}@anchor{1b75}
@subsubsection macOS



@itemize -

@item 
gh-97897@footnote{https://github.com/python/cpython/issues/97897}: The macOS 13 SDK includes support for the @code{mkfifoat} and
@code{mknodat} system calls. Using the @code{dir_fd} option with either
@ref{f8f,,os.mkfifo()} or @ref{f90,,os.mknod()} could result in a segfault if
cpython is built with the macOS 13 SDK but run on an earlier version of
macOS. Prevent this by adding runtime support for detection of these
system calls (“weaklinking”) as is done for other newer syscalls on macOS.
@end itemize

@node IDLE<15>,Tools/Demos<24>,macOS<20>,Python 3 12 0 alpha 1
@anchor{whatsnew/changelog id392}@anchor{1b76}
@subsubsection IDLE



@itemize -

@item 
gh-97527@footnote{https://github.com/python/cpython/issues/97527}: Fix a bug in the previous bugfix that caused IDLE to not start
when run with 3.10.8, 3.12.0a1, and at least Microsoft Python 3.10.2288.0
installed without the Lib/test package.  3.11.0 was never affected.

@item 
gh-65802@footnote{https://github.com/python/cpython/issues/65802}: Document handling of extensions in Save As dialogs.

@item 
gh-95191@footnote{https://github.com/python/cpython/issues/95191}: Include prompts when saving Shell (interactive input and
output).

@item 
gh-95511@footnote{https://github.com/python/cpython/issues/95511}: Fix the Shell context menu copy-with-prompts bug of copying an
extra line when one selects whole lines.

@item 
gh-95471@footnote{https://github.com/python/cpython/issues/95471}: In the Edit menu, move @code{Select All} and add a new separator.

@item 
gh-95411@footnote{https://github.com/python/cpython/issues/95411}: Enable using IDLE’s module browser with .pyw files.

@item 
gh-89610@footnote{https://github.com/python/cpython/issues/89610}: Add .pyi as a recognized extension for IDLE on macOS.    This
allows opening stub files by double clicking on them in the Finder.
@end itemize

@node Tools/Demos<24>,C API<30>,IDLE<15>,Python 3 12 0 alpha 1
@anchor{whatsnew/changelog id393}@anchor{1b77}
@subsubsection Tools/Demos



@itemize -

@item 
gh-68686@footnote{https://github.com/python/cpython/issues/68686}: Remove ptags and eptags scripts.

@item 
gh-97681@footnote{https://github.com/python/cpython/issues/97681}: Remove the @code{Tools/demo/} directory which contained old demo
scripts. A copy can be found in the old-demos project@footnote{https://github.com/gvanrossum/old-demos}.  Patch by Victor Stinner.

@item 
gh-97669@footnote{https://github.com/python/cpython/issues/97669}: Remove outdated example scripts of the @code{Tools/scripts/}
directory. A copy can be found in the old-demos project@footnote{https://github.com/gvanrossum/old-demos}. Patch by Victor Stinner.

@item 
gh-95853@footnote{https://github.com/python/cpython/issues/95853}: The @code{wasm_build.py} script now pre-builds Emscripten ports,
checks for broken EMSDK versions, and warns about pkg-config env vars.

@item 
gh-95853@footnote{https://github.com/python/cpython/issues/95853}: The new tool @code{Tools/wasm/wasm_builder.py} automates configure,
compile, and test steps for building CPython on WebAssembly platforms.

@item 
gh-95731@footnote{https://github.com/python/cpython/issues/95731}: Fix handling of module docstrings in
@code{Tools/i18n/pygettext.py}.

@item 
gh-93939@footnote{https://github.com/python/cpython/issues/93939}: Add script @code{Tools/scripts/check_modules.py} to check and
validate builtin and shared extension modules. The script also handles
@code{Modules/Setup} and will eventually replace @code{setup.py}.

@item 
gh-94538@footnote{https://github.com/python/cpython/issues/94538}: Fix Argument Clinic output to custom file destinations. Patch by
Erlend E. Aasland.

@item 
gh-94430@footnote{https://github.com/python/cpython/issues/94430}: Allow parameters named @code{module} and @code{self} with custom C
names in Argument Clinic. Patch by Erlend E. Aasland

@item 
gh-86087@footnote{https://github.com/python/cpython/issues/86087}: The @code{Tools/scripts/parseentities.py} script used to parse
HTML4 entities has been removed.
@end itemize

@node C API<30>,,Tools/Demos<24>,Python 3 12 0 alpha 1
@anchor{whatsnew/changelog id395}@anchor{1b78}
@subsubsection C API



@itemize -

@item 
gh-98393@footnote{https://github.com/python/cpython/issues/98393}: The @ref{796,,PyUnicode_FSDecoder()} function no longer accepts
bytes-like paths, like @ref{344,,bytearray} and @ref{165,,memoryview} types:
only the exact @ref{192,,bytes} type is accepted for bytes strings. Patch by
Victor Stinner.

@item 
gh-91051@footnote{https://github.com/python/cpython/issues/91051}: Add @ref{785,,PyType_Watch()} and related APIs to allow callbacks
on @ref{1b79,,PyType_Modified()}.

@item 
gh-95756@footnote{https://github.com/python/cpython/issues/95756}: Lazily create and cache @code{co_} attributes for better
performance for code getters.

@item 
gh-96512@footnote{https://github.com/python/cpython/issues/96512}: Configuration for the @ref{80a,,integer string conversion length limitation} now lives in the PyConfig C API struct.

@item 
gh-95589@footnote{https://github.com/python/cpython/issues/95589}: Extensions classes that set @code{tp_dictoffset} and
@code{tp_weaklistoffset} lose the support for multiple inheritance, but are
now safe. Extension classes should use @ref{60d,,Py_TPFLAGS_MANAGED_DICT}
and @ref{77b,,Py_TPFLAGS_MANAGED_WEAKREF} instead.

@item 
gh-95781@footnote{https://github.com/python/cpython/issues/95781}: An unrecognized format character in
@ref{629,,PyUnicode_FromFormat()} and @ref{793,,PyUnicode_FromFormatV()} now
sets a @ref{794,,SystemError}. In previous versions it caused all the rest of
the format string to be copied as-is to the result string, and any extra
arguments discarded.

@item 
gh-92678@footnote{https://github.com/python/cpython/issues/92678}: Restore the 3.10 behavior for multiple inheritance of C
extension classes that store their dictionary at the end of the struct.

@item 
gh-92678@footnote{https://github.com/python/cpython/issues/92678}: Support C extensions using managed dictionaries by setting the
@code{Py_TPFLAGS_MANAGED_DICT} flag.

@item 
gh-93274@footnote{https://github.com/python/cpython/issues/93274}: API for implementing vectorcall
(@ref{775,,Py_TPFLAGS_HAVE_VECTORCALL}, @ref{776,,PyVectorcall_NARGS()} and
@ref{777,,PyVectorcall_Call()}) was added to the limited API and stable ABI.

@item 
gh-95504@footnote{https://github.com/python/cpython/issues/95504}: Fix sign placement when specifying width or precision in
@ref{629,,PyUnicode_FromFormat()} and @ref{793,,PyUnicode_FromFormatV()}. Patch
by Philip Georgi.

@item 
gh-93012@footnote{https://github.com/python/cpython/issues/93012}: The @ref{775,,Py_TPFLAGS_HAVE_VECTORCALL} flag is now removed
from a class when the class’s @ref{779,,__call__()} method is
reassigned. This makes vectorcall safe to use with mutable types (i.e.
heap types without the @code{immutable}
flag). Mutable types that do not override
@ref{77a,,tp_call} now inherit the
@code{Py_TPFLAGS_HAVE_VECTORCALL} flag.

@item 
gh-95388@footnote{https://github.com/python/cpython/issues/95388}: Creating @ref{3cf,,immutable types}
with mutable bases is deprecated and is planned to be disabled in Python
3.14.

@item 
gh-92678@footnote{https://github.com/python/cpython/issues/92678}: Adds unstable C-API functions @code{_PyObject_VisitManagedDict} and
@code{_PyObject_ClearManagedDict} to allow C extensions to allow the VM to
manage their object’s dictionaries.

@item 
gh-94936@footnote{https://github.com/python/cpython/issues/94936}: Added @ref{97c,,PyCode_GetVarnames()}, @ref{97d,,PyCode_GetCellvars()}
and @ref{97e,,PyCode_GetFreevars()} for accessing @code{co_varnames},
@code{co_cellvars} and @code{co_freevars} respectively via the C API.

@item 
gh-94930@footnote{https://github.com/python/cpython/issues/94930}: Fix @code{SystemError} raised when
@ref{622,,PyArg_ParseTupleAndKeywords()} is used with @code{#} in @code{(...)} but
without @code{PY_SSIZE_T_CLEAN} defined.

@item 
gh-94731@footnote{https://github.com/python/cpython/issues/94731}: Python again uses C-style casts for most casting operations when
compiled with C++. This may trigger compiler warnings, if they are enabled
with e.g. @code{-Wold-style-cast} or @code{-Wzero-as-null-pointer-constant}
options for @code{g++}.

@item 
gh-93937@footnote{https://github.com/python/cpython/issues/93937}: The following frame functions and type are now directly
available with @code{#include <Python.h>}, it’s no longer needed to add
@code{#include <frameobject.h>}:


@itemize *

@item 
@ref{987,,PyFrame_Check()}

@item 
@ref{988,,PyFrame_GetBack()}

@item 
@ref{96e,,PyFrame_GetBuiltins()}

@item 
@ref{96f,,PyFrame_GetGenerator()}

@item 
@ref{970,,PyFrame_GetGlobals()}

@item 
@ref{971,,PyFrame_GetLasti()}

@item 
@ref{65f,,PyFrame_GetLocals()}

@item 
@ref{989,,PyFrame_Type}
@end itemize

Patch by Victor Stinner.

@item 
gh-91321@footnote{https://github.com/python/cpython/issues/91321}: Fix the compatibility of the Python C API with C++ older than
C++11. Patch by Victor Stinner.

@item 
gh-91731@footnote{https://github.com/python/cpython/issues/91731}: Avoid defining the @code{static_assert} when compiling with C++ 11,
where this is a keyword and redefining it can lead to undefined behavior.
Patch by Pablo Galindo

@item 
gh-89546@footnote{https://github.com/python/cpython/issues/89546}: @ref{771,,PyType_FromMetaclass()} (and other @code{PyType_From*}
functions) now check that offsets and the base class’s
@ref{b7d,,tp_basicsize} fit in the new class’s
@code{tp_basicsize}.

@item 
gh-93503@footnote{https://github.com/python/cpython/issues/93503}: Add two new public functions to the public C-API,
@ref{780,,PyEval_SetProfileAllThreads()} and
@ref{662,,PyEval_SetTraceAllThreads()}, that allow to set tracing and
profiling functions in all running threads in addition to the calling one.
Also, two analogous functions to the @ref{f3,,threading} module
(@ref{6ef,,threading.setprofile_all_threads()} and
@ref{6ee,,threading.settrace_all_threads()}) that allow to do the same from
Python. Patch by Pablo Galindo

@item 
gh-93442@footnote{https://github.com/python/cpython/issues/93442}: Add C++ overloads for _Py_CAST_impl() to handle 0/NULL.  This
will allow C++ extensions that pass 0 or NULL to macros using _Py_CAST()
to continue to compile.

@item 
gh-93466@footnote{https://github.com/python/cpython/issues/93466}: Slot IDs in PyType_Spec may not be repeated. The documentation
was updated to mention this. For some cases of repeated slots,
PyType_FromSpec and related functions will now raise an exception.

@item 
gh-92898@footnote{https://github.com/python/cpython/issues/92898}: Fix C++ compiler warnings when casting function arguments to
@code{PyObject*}. Patch by Serge Guelton.

@item 
gh-93103@footnote{https://github.com/python/cpython/issues/93103}: Deprecate global configuration variables, like
@ref{40a,,Py_IgnoreEnvironmentFlag}, in the documentation: the
@ref{3f6,,Py_InitializeFromConfig()} API should be instead. Patch by Victor
Stinner.

@item 
gh-77782@footnote{https://github.com/python/cpython/issues/77782}: Deprecate global configuration variable like
@ref{40a,,Py_IgnoreEnvironmentFlag}: the @ref{3f6,,Py_InitializeFromConfig()}
API should be instead. Patch by Victor Stinner.

@item 
gh-92913@footnote{https://github.com/python/cpython/issues/92913}: Ensures changes to @ref{641,,PyConfig.module_search_paths} are
ignored unless @ref{804,,PyConfig.module_search_paths_set} is set

@item 
gh-92781@footnote{https://github.com/python/cpython/issues/92781}: Avoid mixing declarations and code in the C API to fix the
compiler warning: “ISO C90 forbids mixed declarations and code”
[-Werror=declaration-after-statement]. Patch by Victor Stinner.

@item 
gh-92651@footnote{https://github.com/python/cpython/issues/92651}: Remove the @code{token.h} header file. There was never any public
tokenizer C API. The @code{token.h} header file was only designed to be used
by Python internals. Patch by Victor Stinner.

@item 
gh-92536@footnote{https://github.com/python/cpython/issues/92536}: Remove legacy Unicode APIs based on @code{Py_UNICODE*}.

@item 
gh-85858@footnote{https://github.com/python/cpython/issues/85858}: Remove the @code{PyUnicode_InternImmortal()} function and the
@code{SSTATE_INTERNED_IMMORTAL} macro. Patch by Victor Stinner.

@item 
gh-92193@footnote{https://github.com/python/cpython/issues/92193}: Add new function @ref{781,,PyFunction_SetVectorcall()} to the C API
which sets the vectorcall field of a given @ref{782,,PyFunctionObject}.

Warning: extensions using this API must preserve the behavior of the
unaltered function!

@item 
gh-59121@footnote{https://github.com/python/cpython/issues/59121}: Fixed an assert that prevented @code{PyRun_InteractiveOne} from
providing tracebacks when parsing from the provided FD.

@item 
bpo-45383@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45383}: The @ref{79c,,PyType_FromSpec()} API will now find and use a
metaclass based on the provided bases. An error will be raised if there is
a metaclass conflict.
@end itemize

@node Python 3 11 0 beta 1,Python 3 11 0 alpha 7,Python 3 12 0 alpha 1,Changelog
@anchor{whatsnew/changelog python-3-11-0-beta-1}@anchor{1b7a}
@subsection Python 3.11.0 beta 1


`Release date: 2022-05-06'

@menu
* Security: Security<29>. 
* Core and Builtins: Core and Builtins<84>. 
* Library: Library<88>. 
* Core and Builtins: Core and Builtins<85>. 
* Build: Build<34>. 
* Core and Builtins: Core and Builtins<86>. 
* Library: Library<89>. 
* Documentation: Documentation<29>. 
* Tests: Tests<29>. 
* Build: Build<35>. 
* Windows: Windows<30>. 
* macOS: macOS<21>. 
* Tools/Demos: Tools/Demos<25>. 
* C API: C API<31>. 

@end menu

@node Security<29>,Core and Builtins<84>,,Python 3 11 0 beta 1
@anchor{whatsnew/changelog id396}@anchor{1b7b}
@subsubsection Security



@itemize -

@item 
gh-57684@footnote{https://github.com/python/cpython/issues/57684}: Add the @ref{7c0,,-P} command line option and the
@geindex PYTHONSAFEPATH
@geindex 환경 변수; PYTHONSAFEPATH
@ref{7c1,,PYTHONSAFEPATH} environment variable to not prepend a potentially
unsafe path to @ref{3e4,,sys.path}. Patch by Victor Stinner.
@end itemize

@node Core and Builtins<84>,Library<88>,Security<29>,Python 3 11 0 beta 1
@anchor{whatsnew/changelog id397}@anchor{1b7c}
@subsubsection Core and Builtins



@itemize -

@item 
gh-89519@footnote{https://github.com/python/cpython/issues/89519}: Chaining classmethod descriptors (introduced in bpo-19072@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19072}) is
deprecated. It can no longer be used to wrap other descriptors such as
property().  The core design of this feature was flawed, and it caused a
number of downstream problems.

@item 
gh-92345@footnote{https://github.com/python/cpython/issues/92345}: @code{pymain_run_python()} now imports @code{readline} and
@code{rlcompleter} before sys.path is extended to include the current working
directory of an interactive interpreter. Non-interactive interpreters are
not affected.

@item 
bpo-43857@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43857}: Improve the @ref{5ee,,AttributeError} message when deleting a
missing attribute. Patch by Géry Ogam.

@item 
gh-92245@footnote{https://github.com/python/cpython/issues/92245}: Make sure that PEP 523 is respected in all cases. In 3.11a7,
specialization may have prevented Python-to-Python calls respecting PEP
523.

@item 
gh-92203@footnote{https://github.com/python/cpython/issues/92203}: Add a closure keyword-only parameter to @ref{4a3,,exec()}. It can
only be specified when exec-ing a code object that uses free variables.
When specified, it must be a tuple, with exactly the number of cell
variables referenced by the code object. closure has a default value of
@code{None}, and it must be @code{None} if the code object doesn’t refer to any
free variables.

@item 
gh-91173@footnote{https://github.com/python/cpython/issues/91173}: Disable frozen modules in debug builds. Patch by Kumar Aditya.

@item 
gh-92114@footnote{https://github.com/python/cpython/issues/92114}: Improve error message when subscript a type with
@code{__class_getitem__} set to @code{None}.

@item 
gh-92112@footnote{https://github.com/python/cpython/issues/92112}: Fix crash triggered by an evil custom @code{mro()} on a metaclass.

@item 
gh-92063@footnote{https://github.com/python/cpython/issues/92063}: The @code{PRECALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS} instruction
now ensures methods are called only on objects of the correct type.

@item 
gh-92031@footnote{https://github.com/python/cpython/issues/92031}: Deoptimize statically allocated code objects during
@code{Py_FINALIZE()} so that future @code{_PyCode_Quicken} calls always start
with unquickened code.

@item 
gh-92036@footnote{https://github.com/python/cpython/issues/92036}: Fix a crash in subinterpreters related to the garbage collector.
When a subinterpreter is deleted, untrack all objects tracked by its GC.
To prevent a crash in deallocator functions expecting objects to be
tracked by the GC, leak a strong reference to these objects on purpose, so
they are never deleted and their deallocator functions are not called.
Patch by Victor Stinner.

@item 
gh-92032@footnote{https://github.com/python/cpython/issues/92032}: The interpreter can now autocomplete soft keywords, as of now
@code{match}, @code{case}, and @code{_} (wildcard pattern) from 
@geindex Python 향상 제안; PEP 634
PEP 634@footnote{https://peps.python.org/pep-0634/}.

@item 
gh-87999@footnote{https://github.com/python/cpython/issues/87999}: The warning emitted by the Python parser for a numeric literal
immediately followed by keyword has been changed from deprecation warning
to syntax warning.

@item 
gh-91869@footnote{https://github.com/python/cpython/issues/91869}: Fix an issue where specialized opcodes with extended arguments
could produce incorrect tracing output or lead to assertion failures.

@item 
gh-91603@footnote{https://github.com/python/cpython/issues/91603}: Speed up @ref{2a7,,types.UnionType} instantiation. Based on patch
provided by Yurii Karabas.

@item 
gh-89373@footnote{https://github.com/python/cpython/issues/89373}: If Python is built in debug mode, Python now ensures that
deallocator functions leave the current exception unchanged. Patch by
Victor Stinner.

@item 
gh-91632@footnote{https://github.com/python/cpython/issues/91632}: Fix a minor memory leak at exit: release the memory of the
@code{generic_alias_iterator} type. Patch by Donghee Na.

@item 
gh-81548@footnote{https://github.com/python/cpython/issues/81548}: Octal escapes with value larger than @code{0o377} now produce a
@ref{1a3,,DeprecationWarning}. In a future Python version they will be a
@ref{1ae,,SyntaxWarning} and eventually a @ref{18e,,SyntaxError}.

@item 
bpo-43950@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43950}: Use a single compact table for line starts, ends and column
offsets. Reduces memory consumption for location info by half

@item 
gh-91102@footnote{https://github.com/python/cpython/issues/91102}: Use Argument Clinic for @code{EncodingMap}.  Patch by Oleg
Iarygin.

@item 
gh-91636@footnote{https://github.com/python/cpython/issues/91636}: Fixed a crash in a garbage-collection edge-case, in which a
@code{PyFunction_Type.tp_clear} function could leave a python function object
in an inconsistent state.

@item 
gh-91603@footnote{https://github.com/python/cpython/issues/91603}: Speed up @ref{2ad,,isinstance()} and @ref{9c4,,issubclass()} checks for
@ref{2a7,,types.UnionType}. Patch by Yurii Karabas.

@item 
gh-91625@footnote{https://github.com/python/cpython/issues/91625}: Fixed a bug in which adaptive opcodes ignored any preceding
@code{EXTENDED_ARG}s on specialization failure.

@item 
gh-78607@footnote{https://github.com/python/cpython/issues/78607}: The LLTRACE special build now looks for the name @code{__lltrace__}
defined in module globals, rather than the name @code{__ltrace__}, which had
been introduced as a typo.

@item 
gh-91576@footnote{https://github.com/python/cpython/issues/91576}: Speed up iteration of ascii strings by 50%. Patch by Kumar
Aditya.

@item 
gh-89279@footnote{https://github.com/python/cpython/issues/89279}: Improve interpreter performance on Windows by inlining a few
specific macros.

@item 
gh-91502@footnote{https://github.com/python/cpython/issues/91502}: Add a new @code{_PyFrame_IsEntryFrame()} API function, to
check if a @ref{98b,,PyFrameObject} is an entry frame. Patch by Pablo
Galindo.

@item 
gh-91266@footnote{https://github.com/python/cpython/issues/91266}: Refactor the @code{bytearray} strip methods @code{strip}, @code{lstrip}
and @code{rstrip} to use a common implementation.

@item 
gh-91479@footnote{https://github.com/python/cpython/issues/91479}: Replaced the @code{__note__} field of @ref{7d6,,BaseException} (added
in an earlier version of 3.11) with the final design of 
@geindex Python 향상 제안; PEP 678
PEP 678@footnote{https://peps.python.org/pep-0678/}.
Namely, @code{BaseException} gets an @code{add_note()} method, and its
@code{__notes__} field is created when necessary.

@item 
gh-46055@footnote{https://github.com/python/cpython/issues/46055}: Speed up right shift of negative integers, by removing
unnecessary creation of temporaries. Original patch by Xinhang Xu,
reworked by Mark Dickinson.

@item 
gh-91462@footnote{https://github.com/python/cpython/issues/91462}: Make the interpreter’s low-level tracing (lltrace) feature
output more readable by displaying opcode names (rather than just
numbers), and by displaying stack contents before each opcode.

@item 
gh-89455@footnote{https://github.com/python/cpython/issues/89455}: Fixed an uninitialized bool value in the traceback printing code
path that was introduced by the initial bpo-45292@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45292} exception groups work.

@item 
gh-91421@footnote{https://github.com/python/cpython/issues/91421}: Fix a potential integer overflow in _Py_DecodeUTF8Ex.

@item 
gh-91428@footnote{https://github.com/python/cpython/issues/91428}: Add @code{static const char *const _PyOpcode_OpName[256] = @{...@};}
to @code{opcode.h} for debug builds to assist in debugging the Python
interpreter. It is now more convenient to make various forms of debugging
output more human-readable by including opcode names rather than just the
corresponding decimal digits.

@item 
bpo-47120@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47120}: Make @ref{1a5f,,POP_JUMP_IF_TRUE}, @ref{1a60,,POP_JUMP_IF_FALSE},
@ref{1b7d,,POP_JUMP_IF_NONE} and @ref{1b7e,,POP_JUMP_IF_NOT_NONE} virtual,
mapping to new relative jump opcodes.

@item 
bpo-45317@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45317}: Add internal documentation explaining design of new (for 3.11)
frame stack.
@end itemize

@node Library<88>,Core and Builtins<85>,Core and Builtins<84>,Python 3 11 0 beta 1
@anchor{whatsnew/changelog id398}@anchor{1b7f}
@subsubsection Library



@itemize -

@item 
bpo-47197@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47197}: ctypes used to mishandle @code{void} return types, so that for
instance a function declared like @code{ctypes.CFUNCTYPE(None, ctypes.c_int)}
would be called with signature @code{int f(int)} instead of @code{void f(int)}.
Wasm targets require function pointers to be called with the correct
signatures so this led to crashes. The problem is now fixed.
@end itemize

@node Core and Builtins<85>,Build<34>,Library<88>,Python 3 11 0 beta 1
@anchor{whatsnew/changelog id399}@anchor{1b80}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-47120@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47120}: Make opcodes @code{JUMP_IF_TRUE_OR_POP} and
@code{JUMP_IF_FALSE_OR_POP} relative rather than absolute.

@item 
bpo-47177@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47177}: Replace the @code{f_lasti} member of the internal
@code{_PyInterpreterFrame} structure with a @code{prev_instr} pointer, which
reduces overhead in the main interpreter loop. The @code{f_lasti} attribute
of Python-layer frame objects is preserved for backward-compatibility.

@item 
bpo-46961@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46961}: Integer mod/remainder operations, including the three-argument
form of @ref{1a4,,pow()}, now consistently return ints from the global small
integer cache when applicable.

@item 
bpo-46962@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46962}: Classes and functions that unconditionally declared their
docstrings ignoring the @code{--without-doc-strings} compilation flag no
longer do so.

The classes affected are @code{ctypes.UnionType},
@ref{1782,,pickle.PickleBuffer}, @code{testcapi.RecursingInfinitelyError},
and @ref{9ec,,types.GenericAlias}.

The functions affected are 24 methods in @ref{2e,,ctypes}.

Patch by Oleg Iarygin.

@item 
bpo-46942@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46942}: Use Argument Clinic for the @ref{1b81,,types.MethodType}
constructor.  Patch by Oleg Iarygin.

@item 
bpo-46764@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46764}: Fix wrapping bound methods with @@classmethod

@item 
bpo-43464@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43464}: Optimize @ref{1b82,,set.intersection()} for non-set arguments.

@item 
bpo-46721@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46721}: Optimize @ref{1b83,,set.issuperset()} for non-set argument.

@item 
bpo-46509@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46509}: Add type-specialized versions of the @code{Py_DECREF()}, and use
them for @code{float}, @code{int}, @code{str}, @code{bool}, and @code{None} to avoid
pointer-chasing at runtime where types are known at C compile time.
@end itemize

@node Build<34>,Core and Builtins<86>,Core and Builtins<85>,Python 3 11 0 beta 1
@anchor{whatsnew/changelog id400}@anchor{1b84}
@subsubsection Build



@itemize -

@item 
bpo-46045@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46045}: Do not use POSIX semaphores on NetBSD
@end itemize

@node Core and Builtins<86>,Library<89>,Build<34>,Python 3 11 0 beta 1
@anchor{whatsnew/changelog id401}@anchor{1b85}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-36819@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36819}: Fix crashes in built-in encoders with error handlers that
return position less or equal than the starting position of non-encodable
characters.

@item 
bpo-34093@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34093}: @code{marshal.dumps()} uses @code{FLAG_REF} for all interned strings.
This makes output more deterministic and helps reproducible build.

@item 
bpo-26579@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26579}: Added @code{object.__getstate__} which provides the default
implementation of the @code{__getstate__()} method.

Copying and pickling instances of subclasses of builtin types bytearray,
set, frozenset, collections.OrderedDict, collections.deque,
weakref.WeakSet, and datetime.tzinfo now copies and pickles instance
attributes implemented as slots.
@end itemize

@node Library<89>,Documentation<29>,Core and Builtins<86>,Python 3 11 0 beta 1
@anchor{whatsnew/changelog id402}@anchor{1b86}
@subsubsection Library



@itemize -

@item 
gh-87901@footnote{https://github.com/python/cpython/issues/87901}: Add the `encoding' parameter to @ref{31a,,os.popen()}.

@item 
gh-90997@footnote{https://github.com/python/cpython/issues/90997}: Fix an issue where @ref{3c,,dis} utilities may interpret populated
inline cache entries as valid instructions.

@item 
gh-92332@footnote{https://github.com/python/cpython/issues/92332}: Deprecate @ref{360,,typing.Text} (removal of the class is
currently not planned). Patch by Alex Waygood.

@item 
gh-78157@footnote{https://github.com/python/cpython/issues/78157}: Deprecate nested classes in enum definitions becoming members –
in 3.13 they will be normal classes; add @code{member} and @code{nonmember}
functions to allow control over results now.

@item 
gh-92356@footnote{https://github.com/python/cpython/issues/92356}: Fixed a performance regression in ctypes function calls.

@item 
gh-90997@footnote{https://github.com/python/cpython/issues/90997}: Show the actual named values stored in inline caches when
@code{show_caches=True} is passed to @ref{3c,,dis} utilities.

@item 
gh-92301@footnote{https://github.com/python/cpython/issues/92301}: Prefer @code{close_range()} to iterating over procfs for file
descriptor closing in @ref{dc,,subprocess} for better performance.

@item 
gh-67248@footnote{https://github.com/python/cpython/issues/67248}: Sort the miscellaneous topics in Cmd.do_help()

@item 
gh-92210@footnote{https://github.com/python/cpython/issues/92210}: Port @code{socket.__init__} to Argument Clinic. Patch by Cinder.

@item 
gh-80010@footnote{https://github.com/python/cpython/issues/80010}: Add support for generalized ISO 8601 parsing to
@ref{829,,datetime.datetime.fromisoformat()},
@ref{827,,datetime.date.fromisoformat()} and
@ref{828,,datetime.time.fromisoformat()}. Patch by Paul Ganssle.

@item 
gh-92118@footnote{https://github.com/python/cpython/issues/92118}: Fix a 3.11 regression in @ref{1407,,contextmanager()},
which caused it to propagate exceptions with incorrect tracebacks.

@item 
gh-90887@footnote{https://github.com/python/cpython/issues/90887}: Adding @code{COPYFILE_STAT}, @code{COPYFILE_ACL} and
@code{COPYFILE_XATTR} constants for @code{os.fcopyfile()} available in macOs.

@item 
gh-91215@footnote{https://github.com/python/cpython/issues/91215}: For @ref{4e1,,@@~dataclasses.dataclass}, add `weakref_slot'. The new
parameter defaults to @code{False}. If true, and if @code{slots=True}, add a
slot named @code{"__weakref__"}, which will allow instances to be weakref’d.
Contributed by Eric V. Smith

@item 
gh-85984@footnote{https://github.com/python/cpython/issues/85984}: New function os.login_tty() for Unix.

@item 
gh-92128@footnote{https://github.com/python/cpython/issues/92128}: Add @ref{942,,__class_getitem__()} to
@ref{14fa,,logging.LoggerAdapter} and @ref{13fd,,logging.StreamHandler},
allowing them to be parameterized at runtime. Patch by Alex Waygood.

@item 
gh-92049@footnote{https://github.com/python/cpython/issues/92049}: Forbid pickling constants @code{re._constants.SUCCESS} etc.
Previously, pickling did not fail, but the result could not be unpickled.

@item 
gh-92062@footnote{https://github.com/python/cpython/issues/92062}: @ref{4e4,,inspect.Parameter} now raises @ref{2ec,,ValueError} if
@code{name} is a keyword, in addition to the existing check that it is an
identifier.

@item 
gh-87390@footnote{https://github.com/python/cpython/issues/87390}: Add an @code{__unpacked__} attribute to
@ref{9ec,,types.GenericAlias}. Patch by Jelle Zijlstra.

@item 
gh-88089@footnote{https://github.com/python/cpython/issues/88089}: Add support for generic @ref{331,,typing.NamedTuple}.

@item 
gh-91996@footnote{https://github.com/python/cpython/issues/91996}: New http.HTTPMethod enum to represent all the available HTTP
request methods in a convenient way

@item 
gh-91984@footnote{https://github.com/python/cpython/issues/91984}: Modified test strings in test_argparse.py to not contain
trailing spaces before end of line.

@item 
gh-91952@footnote{https://github.com/python/cpython/issues/91952}: Add @code{encoding="locale"} support to
@code{TextIOWrapper.reconfigure()}.

@item 
gh-91954@footnote{https://github.com/python/cpython/issues/91954}: Add `encoding' and `errors' arguments to
@ref{11c2,,subprocess.getoutput()} and @ref{11c3,,subprocess.getstatusoutput()}.

@item 
bpo-47029@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47029}: Always close the read end of the pipe used by
@ref{1b87,,multiprocessing.Queue} `after' the last write of buffered data to
the write end of the pipe to avoid @ref{125b,,BrokenPipeError} at garbage
collection and at @ref{1b88,,multiprocessing.Queue.close()} calls. Patch by Géry
Ogam.

@item 
gh-91928@footnote{https://github.com/python/cpython/issues/91928}: Add @code{datetime.UTC} alias for @code{datetime.timezone.utc}.

Patch by Kabir Kwatra.

@item 
gh-68966@footnote{https://github.com/python/cpython/issues/68966}: The @code{mailcap} module is now deprecated and will be removed
in Python 3.13. See 
@geindex Python 향상 제안; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/} for the rationale and the @ref{93,,mimetypes}
module for an alternative. Patch by Victor Stinner.

@item 
gh-91401@footnote{https://github.com/python/cpython/issues/91401}: Provide a way to disable @ref{dc,,subprocess} use of @code{vfork()}
just in case it is ever needed and document the existing mechanism for
@code{posix_spawn()}.

@item 
gh-64783@footnote{https://github.com/python/cpython/issues/64783}: Fix @ref{1b89,,signal.NSIG} value on FreeBSD to accept signal
numbers greater than 32, like @code{signal.SIGRTMIN} and
@code{signal.SIGRTMAX}. Patch by Victor Stinner.

@item 
gh-91910@footnote{https://github.com/python/cpython/issues/91910}: Add missing f prefix to f-strings in error messages from the
@ref{98,,multiprocessing} and @ref{b,,asyncio} modules.

@item 
gh-91860@footnote{https://github.com/python/cpython/issues/91860}: Add @ref{6fa,,typing.dataclass_transform()}, implementing 
@geindex Python 향상 제안; PEP 681
PEP 681@footnote{https://peps.python.org/pep-0681/}.
Patch by Jelle Zijlstra.

@item 
gh-91832@footnote{https://github.com/python/cpython/issues/91832}: Add @code{required} attribute to @ref{1b8a,,argparse.Action} repr
output.

@item 
gh-91827@footnote{https://github.com/python/cpython/issues/91827}: In the @ref{f6,,tkinter} module add method @code{info_patchlevel()}
which returns the exact version of the Tcl library as a named tuple
similar to @ref{8ae,,sys.version_info}.

@item 
gh-84461@footnote{https://github.com/python/cpython/issues/84461}: Add @ref{1b8b,,--enable-wasm-pthreads} to enable pthreads support
for WASM builds. @code{Emscripten/node} no longer has threading enabled by
default. Include additional file systems.

@item 
gh-91821@footnote{https://github.com/python/cpython/issues/91821}: Fix unstable @code{test_from_tuple} test in @code{test_decimal.py}.

@item 
gh-91217@footnote{https://github.com/python/cpython/issues/91217}: Deprecate the xdrlib module.

@item 
gh-91217@footnote{https://github.com/python/cpython/issues/91217}: Deprecate the uu module.

@item 
gh-91760@footnote{https://github.com/python/cpython/issues/91760}: More strict rules will be applied for numerical group references
and group names in regular expressions. For now, a deprecation warning is
emitted for group references and group names which will be errors in
future Python versions.

@item 
gh-84461@footnote{https://github.com/python/cpython/issues/84461}: Add provisional @ref{1b8c,,sys._emscripten_info} named tuple with
build-time and run-time information about Emscripten platform.

@item 
gh-90623@footnote{https://github.com/python/cpython/issues/90623}: @ref{1b8d,,signal.raise_signal()} and @ref{156c,,os.kill()} now check
immediately for pending signals. Patch by Victor Stinner.

@item 
gh-91734@footnote{https://github.com/python/cpython/issues/91734}: Fix OSS audio support on Solaris.

@item 
gh-90633@footnote{https://github.com/python/cpython/issues/90633}: Include the passed value in the exception thrown by
@ref{8b5,,typing.assert_never()}. Patch by Jelle Zijlstra.

@item 
gh-91700@footnote{https://github.com/python/cpython/issues/91700}: Compilation of regular expression containing a conditional
expression @code{(?(group)...)} now raises an appropriate @code{re.error} if
the group number refers to not defined group. Previously an internal
RuntimeError was raised.

@item 
gh-91231@footnote{https://github.com/python/cpython/issues/91231}: Add an optional keyword `shutdown_timeout' parameter to the
@code{multiprocessing.BaseManager} constructor. Kill the process if
terminate() takes longer than the timeout. Patch by Victor Stinner.

@item 
gh-91621@footnote{https://github.com/python/cpython/issues/91621}: Fix @ref{8bf,,typing.get_type_hints()} for
@ref{9eb,,collections.abc.Callable}. Patch by Shantanu Jain.

@item 
gh-90568@footnote{https://github.com/python/cpython/issues/90568}: Parsing @code{\N} escapes of Unicode Named Character Sequences in a
@ref{be,,regular expression} raises now @code{re.error} instead of
@code{TypeError}.

@item 
gh-91670@footnote{https://github.com/python/cpython/issues/91670}: Remove deprecated @code{SO} config variable in @ref{e1,,sysconfig}.

@item 
gh-91217@footnote{https://github.com/python/cpython/issues/91217}: Deprecate the telnetlib module.

@item 
gh-91217@footnote{https://github.com/python/cpython/issues/91217}: Deprecate the sunau module.

@item 
gh-91217@footnote{https://github.com/python/cpython/issues/91217}: Deprecate the spwd module.

@item 
gh-91217@footnote{https://github.com/python/cpython/issues/91217}: Deprecate the sndhdr module, as well as inline needed
functionality for @code{email.mime.MIMEAudio}.

@item 
gh-91616@footnote{https://github.com/python/cpython/issues/91616}: @ref{be,,re} module, fix @ref{1185,,fullmatch()} mismatch
when using Atomic Grouping or Possessive Quantifiers.

@item 
gh-91217@footnote{https://github.com/python/cpython/issues/91217}: Deprecate the ‘pipes’ module.

@item 
gh-91217@footnote{https://github.com/python/cpython/issues/91217}: Deprecate the ossaudiodev module.

@item 
bpo-47256@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47256}: @ref{be,,re} module, limit the maximum capturing group to
1,073,741,823 in 64-bit build, this increases the depth of backtracking.

@item 
gh-91217@footnote{https://github.com/python/cpython/issues/91217}: Deprecate the nis module.

@item 
gh-91595@footnote{https://github.com/python/cpython/issues/91595}: Fix the comparison of character and integer inside
@code{Tools.gdb.libpython.write_repr()}. Patch by Yu Liu.

@item 
gh-74166@footnote{https://github.com/python/cpython/issues/74166}: Add option to raise all errors from
@ref{881,,create_connection()} in an @ref{4d3,,ExceptionGroup} when it
fails to create a connection. The default remains to raise only the last
error that had occurred when multiple addresses were tried.

@item 
gh-91487@footnote{https://github.com/python/cpython/issues/91487}: Optimize asyncio UDP speed, over 100 times faster when
transferring a large file.

@item 
gh-91575@footnote{https://github.com/python/cpython/issues/91575}: Update case-insensitive matching in the @ref{be,,re} module to the
latest Unicode version.

@item 
gh-90622@footnote{https://github.com/python/cpython/issues/90622}: In @code{concurrent.futures.process.ProcessPoolExecutor} disallow
the “fork” multiprocessing start method when the new
@code{max_tasks_per_child} feature is used as the mix of threads+fork can
hang the child processes. Default to using the safe “spawn” start method
in that circumstance if no @code{mp_context} was supplied.

@item 
gh-89022@footnote{https://github.com/python/cpython/issues/89022}: In @ref{d4,,sqlite3}, @code{SQLITE_MISUSE} result codes are now mapped
to @ref{88c,,InterfaceError} instead of
@ref{305,,ProgrammingError}. Also, more accurate exceptions are
raised when binding parameters fail. Patch by Erlend E. Aasland.

@item 
gh-91526@footnote{https://github.com/python/cpython/issues/91526}: Stop calling @code{os.device_encoding(file.fileno())} in
@code{TextIOWrapper}. It was complex, never documented, and didn’t work
for most cases. (Patch by Inada Naoki.)

@item 
gh-88116@footnote{https://github.com/python/cpython/issues/88116}: Change the frame-related functions in the @ref{82,,inspect} module
to return a regular object (that is backwards compatible with the old
tuple-like interface) that include the extended 
@geindex Python 향상 제안; PEP 657
PEP 657@footnote{https://peps.python.org/pep-0657/} position
information (end line number, column and end column). The affected
functions are: @ref{85e,,inspect.getframeinfo()},
@ref{85f,,inspect.getouterframes()}, @ref{860,,inspect.getinnerframes()},
@ref{861,,inspect.stack()} and @ref{862,,inspect.trace()}. Patch by Pablo Galindo.

@item 
gh-69093@footnote{https://github.com/python/cpython/issues/69093}: Add indexing and slicing support to @ref{891,,sqlite3.Blob}. Patch
by Aviv Palivoda and Erlend E. Aasland.

@item 
gh-69093@footnote{https://github.com/python/cpython/issues/69093}: Add @ref{1e1,,context manager} support to @ref{891,,sqlite3.Blob}.
Patch by Aviv Palivoda and Erlend E. Aasland.

@item 
gh-91217@footnote{https://github.com/python/cpython/issues/91217}: Deprecate nntplib.

@item 
gh-91217@footnote{https://github.com/python/cpython/issues/91217}: Deprecate msilib.

@item 
gh-91404@footnote{https://github.com/python/cpython/issues/91404}: Improve the performance of @ref{be,,re} matching by using computed
gotos (or “threaded code”) on supported platforms and removing expensive
pointer indirections.

@item 
gh-91217@footnote{https://github.com/python/cpython/issues/91217}: Deprecate the imghdr module.

@item 
gh-91217@footnote{https://github.com/python/cpython/issues/91217}: Deprecate the crypt module.

@item 
gh-91276@footnote{https://github.com/python/cpython/issues/91276}: Make space for longer opcodes in @ref{3c,,dis} output.

@item 
bpo-47000@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47000}: Make @code{TextIOWrapper} uses locale encoding when
@code{encoding="locale"} is specified even in UTF-8 mode.

@item 
gh-91230@footnote{https://github.com/python/cpython/issues/91230}: @ref{179,,warnings.catch_warnings()} now accepts arguments for
@ref{8cf,,warnings.simplefilter()}, providing a more concise way to locally
ignore warnings or convert them to errors.

@item 
gh-91217@footnote{https://github.com/python/cpython/issues/91217}: Deprecate the chunk module.

@item 
gh-91498@footnote{https://github.com/python/cpython/issues/91498}: Add the @code{TCP_CONNECTION_INFO} option (available on macOS) to
@ref{d1,,socket}.

@item 
bpo-47260@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47260}: Fix @code{os.closerange()} potentially being a no-op in a Linux
seccomp sandbox.

@item 
bpo-47087@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47087}: Implement @code{typing.Required} and @code{typing.NotRequired}
(
@geindex Python 향상 제안; PEP 655
PEP 655@footnote{https://peps.python.org/pep-0655/}). Patch by David Foster and Jelle Zijlstra.

@item 
bpo-47061@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47061}: Deprecate cgi and cgitb.

@item 
bpo-47061@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47061}: Deprecate audioop.

@item 
bpo-47000@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47000}: Add @ref{329,,locale.getencoding()} to get the current locale
encoding. It is similar to @code{locale.getpreferredencoding(False)} but
ignores the @ref{865,,Python UTF-8 Mode}.

@item 
bpo-42012@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42012}: Add @ref{122,,wsgiref.types}, containing WSGI-specific types for
static type checking.

@item 
bpo-47227@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47227}: Suppress expression chaining for more @ref{be,,re} parsing errors.

@item 
bpo-47211@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47211}: Remove undocumented and never working function
@code{re.template()} and flag @code{re.TEMPLATE}. This was later reverted in
3.11.0b2 and deprecated instead.

@item 
bpo-47135@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47135}: @ref{158b,,decimal.localcontext()} now accepts context attributes via
keyword arguments

@item 
bpo-43323@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43323}: Fix errors in the @ref{3f,,email} module if the charset itself
contains undecodable/unencodable characters.

@item 
bpo-46841@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46841}: Disassembly of quickened code.

@item 
bpo-46681@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46681}: Forward gzip.compress() compresslevel to zlib.

@item 
bpo-45100@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45100}: Add @ref{8bc,,typing.get_overloads()} and
@ref{8bd,,typing.clear_overloads()}. Patch by Jelle Zijlstra.

@item 
bpo-44807@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44807}: @ref{569,,typing.Protocol} no longer silently replaces
@code{__init__()} methods defined on subclasses. Patch by Adrian Garcia
Badaracco.

@item 
bpo-46787@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46787}: Fix @ref{1d6,,concurrent.futures.ProcessPoolExecutor} exception
memory leak

@item 
bpo-46720@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46720}: Add support for path-like objects to
@ref{1b8e,,multiprocessing.set_executable()} for Windows to be on a par with
Unix-like systems. Patch by Géry Ogam.

@item 
bpo-46696@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46696}: Add @code{SO_INCOMING_CPU} constant to @ref{d1,,socket}.

@item 
bpo-46053@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46053}: Fix OSS audio support on NetBSD.

@item 
bpo-45639@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45639}: @code{image/avif} and @code{image/webp} were added to
@ref{93,,mimetypes}.

@item 
bpo-46285@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46285}: Add command-line option @code{-p}/@code{--protocol} to module
@ref{76,,http.server} which specifies the HTTP version to which the server is
conformant (HTTP/1.1 conformant servers can now be run from the
command-line interface of module @code{http.server}). Patch by Géry Ogam.

@item 
bpo-44791@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44791}: Accept ellipsis as the last argument of
@ref{9c7,,typing.Concatenate}.

@item 
bpo-46547@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46547}: Remove variables leaking into @code{pydoc.Helper} class namespace.

@item 
bpo-46415@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46415}: Fix ipaddress.ip_@{address,interface,network@} raising TypeError
instead of ValueError if given invalid tuple as address parameter.

@item 
bpo-46075@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46075}: @code{CookieJar} with @code{DefaultCookiePolicy} now can process
cookies from localhost with domain=localhost explicitly specified in
Set-Cookie header.

@item 
bpo-45995@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45995}: Add a “z” option to the string formatting specification that
coerces negative zero floating-point values to positive zero after
rounding to the format precision.  Contributed by John Belmonte.

@item 
bpo-26175@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26175}: Fully implement the @ref{8a2,,io.BufferedIOBase} or
@ref{8a3,,io.TextIOBase} interface for
@ref{8a1,,tempfile.SpooledTemporaryFile} objects. This lets them work
correctly with higher-level layers (like compression modules). Patch by
Carey Metcalfe.

@item 
bpo-45138@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45138}: Fix a regression in the @ref{d4,,sqlite3} trace callback where
bound parameters were not expanded in the passed statement string. The
regression was introduced in Python 3.10 by bpo-40318@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40318}. Patch by
Erlend E. Aasland.

@item 
bpo-44863@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44863}: Allow @ref{332,,TypedDict} subclasses to also include
@ref{17bc,,Generic} as a base class in class based syntax. Thereby
allowing the user to define a generic @code{TypedDict}, just like a
user-defined generic but with @code{TypedDict} semantics.

@item 
bpo-44587@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44587}: Fix BooleanOptionalAction to not automatically add a default
string.  If a default string is desired, use a formatter to add it.

@item 
bpo-43827@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43827}: All positional-or-keyword parameters to @code{ABCMeta.__new__} are
now positional-only to avoid conflicts with keyword arguments to be passed
to @code{__init_subclass__()}.

@item 
bpo-43218@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43218}: Prevent creation of a venv whose path contains the PATH
separator. This could affect the usage of the activate script. Patch by
Dustin Rodrigues.

@item 
bpo-38435@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38435}: Add a @code{process_group} parameter to @ref{4b8,,subprocess.Popen}
to help move more things off of the unsafe @code{preexec_fn} parameter.

@item 
bpo-42066@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42066}: Fix cookies getting sorted in @code{CookieJar.__iter__()} which
is an extra behavior and not mentioned in RFC 2965 or Netscape cookie
protocol. Now the cookies in @code{CookieJar} follows the order of the
@code{Set-Cookie} header. Patch by Iman Kermani.

@item 
bpo-40617@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40617}: Add @ref{88f,,create_window_function()} to
@ref{54c,,sqlite3.Connection} for creating aggregate window functions. Patch
by Erlend E. Aasland.

@item 
bpo-40676@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40676}: Convert @ref{2d,,csv} to use Argument Clinic for
@ref{1b8f,,csv.field_size_limit()}, @ref{1b90,,csv.get_dialect()},
@ref{1b91,,csv.unregister_dialect()} and @ref{1b92,,csv.list_dialects()}.

@item 
bpo-39716@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39716}: Raise an @code{ArgumentError} when the same subparser name is
added twice to an @code{argparse.ArgumentParser}.  This is consistent with
the (default) behavior when the same option string is added twice to an
@code{ArgumentParser}.

@item 
bpo-36073@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36073}: Raise @ref{305,,ProgrammingError} instead of segfaulting
on recursive usage of cursors in @ref{d4,,sqlite3} converters. Patch by
Sergey Fedoseev.

@item 
bpo-34975@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34975}: Adds a @code{start_tls()} method to
@code{StreamWriter}, which upgrades the connection with
TLS using the given @ref{357,,SSLContext}.

@item 
bpo-22276@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22276}: @ref{266,,Path} methods @ref{537,,glob()} and
@ref{538,,rglob()} return only directories if `pattern' ends with
a pathname components separator (@code{/} or @ref{879,,sep}). Patch by
Eisuke Kawashima.

@item 
bpo-24905@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24905}: Add @ref{890,,blobopen()} to
@ref{54c,,sqlite3.Connection}. @ref{891,,sqlite3.Blob} allows incremental I/O
operations on blobs. Patch by Aviv Palivoda and Erlend E. Aasland.
@end itemize

@node Documentation<29>,Tests<29>,Library<89>,Python 3 11 0 beta 1
@anchor{whatsnew/changelog id403}@anchor{1b93}
@subsubsection Documentation



@itemize -

@item 
gh-91888@footnote{https://github.com/python/cpython/issues/91888}: Add a new @code{gh} role to the documentation to link to GitHub
issues.

@item 
gh-91783@footnote{https://github.com/python/cpython/issues/91783}: Document security issues concerning the use of the function
@ref{695,,shutil.unpack_archive()}

@item 
gh-91547@footnote{https://github.com/python/cpython/issues/91547}: Remove “Undocumented modules” page.

@item 
gh-91298@footnote{https://github.com/python/cpython/issues/91298}: In @code{importlib.resources.abc}, refined the documentation of the
Traversable Protocol, applying changes from importlib_resources 5.7.1.

@item 
bpo-44347@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44347}: Clarify the meaning of `dirs_exist_ok', a kwarg of
@ref{c1d,,shutil.copytree()}.

@item 
bpo-36329@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36329}: Remove ‘make -C Doc serve’ in favour of ‘make -C Doc htmlview’

@item 
bpo-47189@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47189}: Add a What’s New in Python 3.11 entry for the Faster CPython
project. Documentation by Ken Jin and Kumar Aditya.

@item 
bpo-38668@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38668}: Update the introduction to documentation for @ref{a6,,os.path} to
remove warnings that became irrelevant after the implementations of
@geindex Python 향상 제안; PEP 383
PEP 383@footnote{https://peps.python.org/pep-0383/} and 
@geindex Python 향상 제안; PEP 529
PEP 529@footnote{https://peps.python.org/pep-0529/}.

@item 
bpo-47115@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47115}: The documentation now lists which members of C structs are part
of the @ref{774,,Limited API/Stable ABI}.

@item 
bpo-46962@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46962}: All docstrings in code snippets are now wrapped into
@ref{1b94,,PyDoc_STR} to follow the guideline of 
@geindex Python 향상 제안; PEP 0007#documentation-strings
PEP 7’s Documentation Strings paragraph@footnote{https://peps.python.org/pep-0007/#documentation-strings}. Patch by
Oleg Iarygin.

@item 
bpo-26792@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26792}: Improve the docstrings of @ref{1b95,,runpy.run_module()} and
@ref{4a5,,runpy.run_path()}. Original patch by Andrew Brezovsky.
@end itemize

@node Tests<29>,Build<35>,Documentation<29>,Python 3 11 0 beta 1
@anchor{whatsnew/changelog id404}@anchor{1b96}
@subsubsection Tests



@itemize -

@item 
gh-92169@footnote{https://github.com/python/cpython/issues/92169}: Use @code{warnings_helper.import_deprecated()} to import deprecated
modules uniformly in tests. Patch by Hugo van Kemenade.

@item 
gh-84461@footnote{https://github.com/python/cpython/issues/84461}: When multiprocessing is enabled, libregrtest can now use a
Python executable other than @code{sys.executable} via the @code{--python}
flag.

@item 
gh-91904@footnote{https://github.com/python/cpython/issues/91904}: Fix initialization of 
@geindex PYTHONREGRTEST_UNICODE_GUARD
@geindex 환경 변수; PYTHONREGRTEST_UNICODE_GUARD
@code{PYTHONREGRTEST_UNICODE_GUARD}
which prevented running regression tests on non-UTF-8 locale.

@item 
gh-91752@footnote{https://github.com/python/cpython/issues/91752}: Added @@requires_zlib to test.test_tools.test_freeze.TestFreeze.

@item 
gh-91607@footnote{https://github.com/python/cpython/issues/91607}: Fix @code{test_concurrent_futures} to test the correct
multiprocessing start method context in several cases where the test logic
mixed this up.

@item 
bpo-40280@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40280}: Threading tests are now skipped on WASM targets without pthread
support.

@item 
bpo-47109@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47109}: Test for @code{ctypes.macholib.dyld},
@code{ctypes.macholib.dylib}, and @code{ctypes.macholib.framework} are
brought from manual pre-@ref{10c,,unittest} times to @code{ctypes.test}
location and structure. Patch by Oleg Iarygin.

@item 
bpo-29890@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29890}: Add tests for @ref{1b97,,ipaddress.IPv4Interface} and
@ref{1b98,,ipaddress.IPv6Interface} construction with tuple arguments.
Original patch and tests by louisom.
@end itemize

@node Build<35>,Windows<30>,Tests<29>,Python 3 11 0 beta 1
@anchor{whatsnew/changelog id405}@anchor{1b99}
@subsubsection Build



@itemize -

@item 
gh-89452@footnote{https://github.com/python/cpython/issues/89452}: gdbm-compat is now preferred over ndbm if both are available on
the system. This allows avoiding the problematic ndbm.h on macOS.

@item 
gh-91731@footnote{https://github.com/python/cpython/issues/91731}: Python is now built with @code{-std=c11} compiler option, rather
than @code{-std=c99}. Patch by Victor Stinner.

@item 
bpo-47152@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47152}: Add script and make target for generating @code{sre_constants.h}.

@item 
bpo-47103@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47103}: Windows @code{PGInstrument} builds now copy a required DLL into
the output directory, making it easier to run the profile stage of a PGO
build.
@end itemize

@node Windows<30>,macOS<21>,Build<35>,Python 3 11 0 beta 1
@anchor{whatsnew/changelog id406}@anchor{1b9a}
@subsubsection Windows



@itemize -

@item 
bpo-46907@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46907}: Update Windows installer to use SQLite 3.38.3.

@item 
bpo-47239@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47239}: Fixed –list and –list-paths output for @ref{7d9,,Python install manager} when
used in an active virtual environment.

@item 
bpo-46907@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46907}: Update Windows installer to use SQLite 3.38.2.

@item 
bpo-46785@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46785}: Fix race condition between @ref{26d,,os.stat()} and unlinking a file
on Windows, by using errors codes returned by @code{FindFirstFileW()} when
appropriate in @code{win32_xstat_impl}.

@item 
bpo-40859@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40859}: Update Windows build to use xz-5.2.5
@end itemize

@node macOS<21>,Tools/Demos<25>,Windows<30>,Python 3 11 0 beta 1
@anchor{whatsnew/changelog id407}@anchor{1b9b}
@subsubsection macOS



@itemize -

@item 
bpo-46907@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46907}: Update macOS installer to SQLite 3.38.4.
@end itemize

@node Tools/Demos<25>,C API<31>,macOS<21>,Python 3 11 0 beta 1
@anchor{whatsnew/changelog id408}@anchor{1b9c}
@subsubsection Tools/Demos



@itemize -

@item 
gh-91583@footnote{https://github.com/python/cpython/issues/91583}: Fix regression in the code generated by Argument Clinic for
functions with the @code{defining_class} parameter.

@item 
gh-91575@footnote{https://github.com/python/cpython/issues/91575}: Add script @code{Tools/scripts/generate_re_casefix.py} and the make
target @code{regen-re} for generating additional data for case-insensitive
matching according to the current Unicode version.

@item 
gh-91551@footnote{https://github.com/python/cpython/issues/91551}: Remove the ancient Pynche color editor.  It has moved to
@indicateurl{https://gitlab.com/warsaw/pynche}
@end itemize

@node C API<31>,,Tools/Demos<25>,Python 3 11 0 beta 1
@anchor{whatsnew/changelog id409}@anchor{1b9d}
@subsubsection C API



@itemize -

@item 
gh-88279@footnote{https://github.com/python/cpython/issues/88279}: Deprecate the C functions: @code{PySys_SetArgv()},
@code{PySys_SetArgvEx()}, @code{PySys_SetPath()}. Patch by Victor
Stinner.

@item 
gh-92154@footnote{https://github.com/python/cpython/issues/92154}: Added the @ref{97b,,PyCode_GetCode()} function. This function does
the equivalent of the Python code @code{getattr(code_object, 'co_code')}.

@item 
gh-92173@footnote{https://github.com/python/cpython/issues/92173}: Fix the @code{closure} argument to @ref{1ad8,,PyEval_EvalCodeEx()}.

@item 
gh-91320@footnote{https://github.com/python/cpython/issues/91320}: Fix C++ compiler warnings about “old-style cast” (@code{g++
-Wold-style-cast}) in the Python C API. Use C++ @code{reinterpret_cast<>}
and @code{static_cast<>} casts when the Python C API is used in C++. Patch by
Victor Stinner.

@item 
gh-80527@footnote{https://github.com/python/cpython/issues/80527}: Mark functions as deprecated by 
@geindex Python 향상 제안; PEP 623
PEP 623@footnote{https://peps.python.org/pep-0623/}:
@code{PyUnicode_AS_DATA()}, @code{PyUnicode_AS_UNICODE()},
@code{PyUnicode_GET_DATA_SIZE()}, @code{PyUnicode_GET_SIZE()}. Patch
by Victor Stinner.

@item 
gh-91768@footnote{https://github.com/python/cpython/issues/91768}: @ref{2cf,,Py_REFCNT()}, @ref{3c9,,Py_TYPE()}, @ref{984,,Py_SIZE()} and
@ref{1b9e,,Py_IS_TYPE()} functions argument type is now @code{PyObject*}, rather
than @code{const PyObject*}. Patch by Victor Stinner.

@item 
gh-91020@footnote{https://github.com/python/cpython/issues/91020}: Add @code{PyBytes_Type.tp_alloc} to initialize
@code{PyBytesObject.ob_shash} for bytes subclasses.

@item 
bpo-40421@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40421}: Add @code{PyFrame_GetLasti} C-API function to access frame
object’s @code{f_lasti} attribute safely from C code.

@item 
bpo-35134@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35134}: Remove the @code{Include/code.h} header file. C extensions should
only include the main @code{<Python.h>} header file. Patch by Victor Stinner.

@item 
bpo-47169@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47169}: @ref{1b9f,,PyOS_CheckStack()} is now exported in the Stable ABI on
Windows.

@item 
bpo-47169@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47169}: @ref{1ba0,,PyThread_get_thread_native_id()} is excluded from the
stable ABI on platforms where it doesn’t exist (like Solaris).

@item 
bpo-46343@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46343}: Added @ref{972,,PyErr_GetHandledException()} and
@ref{973,,PyErr_SetHandledException()} as simpler alternatives to
@ref{975,,PyErr_GetExcInfo()} and @ref{974,,PyErr_SetExcInfo()}.

They are included in the stable ABI.
@end itemize

@node Python 3 11 0 alpha 7,Python 3 11 0 alpha 6,Python 3 11 0 beta 1,Changelog
@anchor{whatsnew/changelog python-3-11-0-alpha-7}@anchor{1ba1}
@subsection Python 3.11.0 alpha 7


`Release date: 2022-04-05'

@menu
* Core and Builtins: Core and Builtins<87>. 
* Library: Library<90>. 
* Core and Builtins: Core and Builtins<88>. 
* Library: Library<91>. 
* Core and Builtins: Core and Builtins<89>. 
* Library: Library<92>. 
* Documentation: Documentation<30>. 
* Tests: Tests<30>. 
* Build: Build<36>. 
* Windows: Windows<31>. 
* macOS: macOS<22>. 
* Tools/Demos: Tools/Demos<26>. 
* C API: C API<32>. 

@end menu

@node Core and Builtins<87>,Library<90>,,Python 3 11 0 alpha 7
@anchor{whatsnew/changelog id410}@anchor{1ba2}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-47212@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47212}: Raise @ref{9ab,,IndentationError} instead of @ref{18e,,SyntaxError} for
a bare @code{except} with no following indent. Improve @code{SyntaxError}
locations for an un-parenthesized generator used as arguments. Patch by
Matthieu Dartiailh.

@item 
bpo-47186@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47186}: Replace @code{JUMP_IF_NOT_EG_MATCH} by
@ref{910,,CHECK_EG_MATCH} + jump.

@item 
bpo-47176@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47176}: Emscripten builds cannot handle signals in the usual way due to
platform limitations. Python can now handle signals. To use, set
Module.Py_EmscriptenSignalBuffer to be a single byte SharedArrayBuffer and
set Py_EMSCRIPTEN_SIGNAL_HANDLING to 1. Writing a number into the
SharedArrayBuffer will cause the corresponding signal to be raised into
the Python thread.

@item 
bpo-47186@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47186}: Replace @code{JUMP_IF_NOT_EXC_MATCH} by
@ref{918,,CHECK_EXC_MATCH} + jump.

@item 
bpo-47120@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47120}: Replace the absolute jump opcode @ref{1ba3,,JUMP_NO_INTERRUPT} by
the relative @ref{90d,,JUMP_BACKWARD_NO_INTERRUPT}.

@item 
bpo-46841@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46841}: Avoid unnecessary allocations when comparing code objects.

@item 
bpo-47182@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47182}: Fix a crash when using a named unicode character like
@code{"\N@{digit nine@}"} after the main interpreter has been initialized a
second time.

@item 
bpo-47162@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47162}: WebAssembly cannot deal with bad function pointer casts
(different count or types of arguments). Python can now use call
trampolines to mitigate the problem. Define @code{PY_CALL_TRAMPOLINE}
to enable call trampolines.

@item 
bpo-46775@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46775}: Some Windows system error codes(>= 10000) are now mapped into
the correct errno and may now raise a subclass of @ref{2c0,,OSError}. Patch by
Donghee Na.

@item 
bpo-47129@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47129}: Improve error messages in f-string syntax errors concerning
empty expressions.

@item 
bpo-47117@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47117}: Fix a crash if we fail to decode characters in interactive mode
if the tokenizer buffers are uninitialized. Patch by Pablo Galindo.

@item 
bpo-47127@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47127}: Speed up calls to c functions with keyword arguments by 25%
with specialization. Patch by Kumar Aditya.

@item 
bpo-47120@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47120}: Replaced @code{JUMP_ABSOLUTE} by the relative jump
@ref{919,,JUMP_BACKWARD}.

@item 
bpo-42197@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42197}: @code{PyFrame_FastToLocalsWithError()} and
@code{PyFrame_LocalsToFast()} are no longer called during profiling nor
tracing. C code can access the @code{f_locals} attribute of
@ref{98b,,PyFrameObject} by calling @ref{65f,,PyFrame_GetLocals()}.

@item 
bpo-47070@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47070}: Improve performance of @code{array_inplace_repeat} by reducing the
number of invocations of @code{memcpy}. Refactor the @code{repeat} and inplace
@code{repeat} methods of @code{array}, @code{bytes}, @code{bytearray} and
@code{unicodeobject} to use the common @code{_PyBytes_Repeat}.

@item 
bpo-47053@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47053}: Reduce de-optimization in the specialized
@code{BINARY_OP_INPLACE_ADD_UNICODE} opcode.

@item 
bpo-47045@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47045}: Remove the @code{f_state} field from the _PyInterpreterFrame
struct. Add the @code{owner} field to the _PyInterpreterFrame struct to make
ownership explicit to simplify clearing and deallocing frames and
generators.
@end itemize

@node Library<90>,Core and Builtins<88>,Core and Builtins<87>,Python 3 11 0 alpha 7
@anchor{whatsnew/changelog id411}@anchor{1ba4}
@subsubsection Library



@itemize -

@item 
bpo-46968@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46968}: Check for the existence of the “sys/auxv.h” header in
@ref{5c,,faulthandler} to avoid compilation problems in systems where this
header doesn’t exist. Patch by Pablo Galindo
@end itemize

@node Core and Builtins<88>,Library<91>,Library<90>,Python 3 11 0 alpha 7
@anchor{whatsnew/changelog id412}@anchor{1ba5}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-46329@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46329}: Use low bit of @code{LOAD_GLOBAL} to indicate whether to push a
@code{NULL} before the global. Helps streamline the call sequence a bit.

@item 
bpo-46841@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46841}: Quicken bytecode in-place by storing it as part of the
corresponding @code{PyCodeObject}.

@item 
bpo-47012@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47012}: Speed up iteration of @ref{192,,bytes} and @ref{344,,bytearray} by
30%. Patch by Kumar Aditya.

@item 
bpo-47009@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47009}: Improved the performance of @ref{8db,,list.append()} and list
comprehensions by optimizing for the common case, where no resize is
needed. Patch by Dennis Sweeney.

@item 
bpo-47005@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47005}: Improve performance of @code{bytearray_repeat} and
@code{bytearray_irepeat} by reducing the number of invocations of @code{memcpy}.
@end itemize

@node Library<91>,Core and Builtins<89>,Core and Builtins<88>,Python 3 11 0 alpha 7
@anchor{whatsnew/changelog id413}@anchor{1ba6}
@subsubsection Library



@itemize -

@item 
bpo-46829@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46829}: Deprecate passing a message into @ref{1ba7,,asyncio.Future.cancel()}
and @ref{4d4,,asyncio.Task.cancel()}
@end itemize

@node Core and Builtins<89>,Library<92>,Library<91>,Python 3 11 0 alpha 7
@anchor{whatsnew/changelog id414}@anchor{1ba8}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-46993@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46993}: Speed up @ref{344,,bytearray} creation from @ref{24d,,list} and
@ref{610,,tuple} by 40%. Patch by Kumar Aditya.

@item 
bpo-39829@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39829}: Removed the @code{__len__()} call when initializing a list and
moved initializing to @code{list_extend}. Patch by Jeremiah Pascual.

@item 
bpo-46944@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46944}: Speed up throwing exception in generator with
@ref{199f,,METH_FASTCALL} calling convention. Patch by Kumar Aditya.

@item 
bpo-46841@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46841}: Modify @ref{1ba9,,STORE_SUBSCR} to use an inline cache entry
(rather than its oparg) as an adaptive counter.

@item 
bpo-46841@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46841}: Use inline caching for @code{PRECALL} and @ref{914,,CALL},
and remove the internal machinery for managing the (now unused) non-inline
caches.

@item 
bpo-46881@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46881}: Statically allocate and initialize the latin1 characters.

@item 
bpo-46838@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46838}: Improve syntax errors for incorrect function definitions. Patch
by Pablo Galindo

@item 
bpo-43721@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43721}: Fix docstrings of @ref{19d9,,getter},
@ref{19da,,setter}, and @ref{19db,,deleter} to clarify that
they create a new copy of the property.

@item 
bpo-43224@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43224}: Make grammar changes required for PEP 646.
@end itemize

@node Library<92>,Documentation<30>,Core and Builtins<89>,Python 3 11 0 alpha 7
@anchor{whatsnew/changelog id415}@anchor{1baa}
@subsubsection Library



@itemize -

@item 
bpo-47208@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47208}: Allow vendors to override @code{CTYPES_MAX_ARGCOUNT}.

@item 
bpo-23689@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23689}: @ref{be,,re} module: fix memory leak when a match is terminated by
a signal or memory allocation failure. Patch by Ma Lin.

@item 
bpo-47167@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47167}: Allow overriding a future compliance check in
@ref{1c7,,asyncio.Task}.

@item 
bpo-47151@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47151}: When subprocess tries to use vfork, it now falls back to fork
if vfork returns an error. This allows use in situations where vfork isn’t
allowed by the OS kernel.

@item 
bpo-47152@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47152}: Convert the @ref{be,,re} module into a package. Deprecate modules
@code{sre_compile}, @code{sre_constants} and @code{sre_parse}.

@item 
bpo-4833@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4833}: Add @code{ZipFile.mkdir()}

@item 
bpo-27929@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27929}: Fix @ref{fc7,,asyncio.loop.sock_connect()} to only resolve names for
@ref{1bab,,socket.AF_INET} or @ref{1bac,,socket.AF_INET6} families. Resolution
may not make sense for other families, like @ref{1bad,,socket.AF_BLUETOOTH}
and @ref{1bae,,socket.AF_UNIX}.

@item 
bpo-14265@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14265}: Adds the fully qualified test name to unittest output

@item 
bpo-47061@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47061}: Deprecate the aifc module.

@item 
bpo-39622@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39622}: Handle Ctrl+C in asyncio programs to interrupt the main task.

@item 
bpo-47101@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47101}: @ref{1579,,hashlib.algorithms_available} now lists only algorithms
that are provided by activated crypto providers on OpenSSL 3.0. Legacy
algorithms are not listed unless the legacy provider has been loaded into
the default OSSL context.

@item 
bpo-47099@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47099}: All @code{URLError} exception messages raised in
@code{urllib.request.URLopener} now contain a colon between @code{ftp
error} and the rest of the message. Previously,
@code{open_ftp()} missed the colon. Patch by Oleg
Iarygin.

@item 
bpo-47099@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47099}: Exception chaining is changed from
@code{Exception.with_traceback()}/@ref{899,,sys.exc_info()} to 
@geindex Python 향상 제안; PEP 3134
PEP 3134@footnote{https://peps.python.org/pep-3134/}.
Patch by Oleg Iarygin.

@item 
bpo-47095@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47095}: @ref{6c,,hashlib}’s internal @code{_blake2} module now prefers
@code{libb2} from @indicateurl{https://www.blake2.net/} over Python’s vendored copy of
blake2.

@item 
bpo-47098@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47098}: The Keccak Code Package for @ref{6c,,hashlib}’s internal @code{_sha3}
module has been replaced with tiny_sha3. The module is used as fallback
when Python is built without OpenSSL.

@item 
bpo-47088@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47088}: Implement @ref{7e5,,typing.LiteralString}, part of 
@geindex Python 향상 제안; PEP 675
PEP 675@footnote{https://peps.python.org/pep-0675/}.
Patch by Jelle Zijlstra.

@item 
bpo-42885@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42885}: Optimize @ref{1431,,re.search()}, @ref{5a1,,re.split()},
@ref{1229,,re.findall()}, @ref{16ff,,re.finditer()} and @ref{5a2,,re.sub()} for regular
expressions starting with @code{\A} or @code{^}.

@item 
bpo-23691@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23691}: Protect the @ref{16ff,,re.finditer()} iterator from re-entering.

@item 
bpo-47067@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47067}: Optimize calling @code{GenericAlias} objects by using 
@geindex Python 향상 제안; PEP 590
PEP 590@footnote{https://peps.python.org/pep-0590/}
@code{vectorcall} and by replacing @code{PyObject_SetAttrString} with
@code{PyObject_SetAttr}.

@item 
bpo-28080@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28080}: Add the `metadata_encoding' parameter in the
@ref{8d2,,zipfile.ZipFile} constructor and the @code{--metadata-encoding}
option in the @ref{137,,zipfile} CLI to allow reading zipfiles using
non-standard codecs to encode the filenames within the archive.

@item 
bpo-47000@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47000}: Make @ref{1a3d,,io.text_encoding()} returns “utf-8” when UTF-8 mode
is enabled.

@item 
bpo-42369@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42369}: Fix thread safety of @code{zipfile._SharedFile.tell()} to avoid
a “zipfile.BadZipFile: Bad CRC-32 for file” exception when reading a
@code{ZipFile} from multiple threads.

@item 
bpo-38256@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38256}: Fix @ref{1a11,,binascii.crc32()} when it is compiled to use zlib’c
crc32 to work properly on inputs 4+GiB in length instead of returning the
wrong result. The workaround prior to this was to always feed the function
data in increments smaller than 4GiB or to just call the zlib module
function.

We also have @ref{1a11,,binascii.crc32()} release the GIL when computing on
larger inputs as @ref{1a10,,zlib.crc32()} and @ref{6c,,hashlib} do.

This also boosts performance on Windows as it now uses the zlib crc32
implementation for @ref{1a11,,binascii.crc32()} for a 2-3x speedup.

That the stdlib has a crc32 API in two modules is a known historical
oddity. This moves us closer to a single implementation behind them.

@item 
bpo-47066@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47066}: Global inline flags (e.g. @code{(?i)}) can now only be used at the
start of the regular expressions.  Using them not at the start of
expression was deprecated since Python 3.6.

@item 
bpo-39394@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39394}: A warning about inline flags not at the start of the regular
expression now contains the position of the flag.

@item 
bpo-433030@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=433030}: Add support of atomic grouping (@code{(?>...)}) and possessive
quantifiers (@code{*+}, @code{++}, @code{?+}, @code{@{m,n@}+}) in @ref{be,,regular expressions}.

@item 
bpo-47062@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47062}: Implement @ref{2f5,,asyncio.Runner} context manager.

@item 
bpo-46382@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46382}: @ref{4e1,,dataclass()} @code{slots=True} now correctly
omits slots already defined in base classes. Patch by Arie Bovenberg.

@item 
bpo-47057@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47057}: Use FASTCALL convention for @code{FutureIter.throw()}

@item 
bpo-47061@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47061}: Deprecate the various modules listed by 
@geindex Python 향상 제안; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/}:

aifc, asynchat, asyncore, audioop, cgi, cgitb, chunk, crypt, imghdr,
msilib, nntplib, nis, ossaudiodev, pipes, smtpd, sndhdr, spwd, sunau,
telnetlib, uu, xdrlib

@item 
bpo-34790@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34790}: Remove passing coroutine objects to @ref{6a6,,asyncio.wait()}.

@item 
bpo-47039@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47039}: Normalize @code{repr()} of asyncio future and task objects.

@item 
bpo-2604@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2604}: Fix bug where doctests using globals would fail when run
multiple times.

@item 
bpo-45150@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45150}: Add @ref{853,,hashlib.file_digest()} helper for efficient hashing of
file object.

@item 
bpo-34861@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34861}: Made cumtime the default sorting key for cProfile

@item 
bpo-45997@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45997}: Fix @ref{c67,,asyncio.Semaphore} re-aquiring FIFO order.

@item 
bpo-47022@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47022}: The @code{asynchat}, @code{asyncore} and  @code{smtpd}
modules have been deprecated since at least Python 3.6. Their
documentation and deprecation warnings and have now been updated to note
they will removed in Python 3.12 (
@geindex Python 향상 제안; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/}).

@item 
bpo-43253@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43253}: Fix a crash when closing transports where the underlying socket
handle is already invalid on the Proactor event loop.

@item 
bpo-40280@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40280}: @ref{f9f,,select.select()} now passes @code{NULL} to @code{select} for
each empty fdset.

@item 
bpo-47004@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47004}: Apply bugfixes from importlib_metadata 4.11.3, including bugfix
for EntryPoint.extras, which was returning match objects and not the
extras strings.

@item 
bpo-46998@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46998}: Allow subclassing of @ref{8ba,,typing.Any}. Patch by Shantanu
Jain.

@item 
bpo-46995@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46995}: Deprecate missing @ref{bcf,,asyncio.Task.set_name()} for third-party
task implementations, schedule making it mandatory in Python 3.13.

@item 
bpo-46994@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46994}: Accept explicit contextvars.Context in
@ref{1c9,,asyncio.create_task()} and @ref{1ca,,asyncio.loop.create_task()}.

@item 
bpo-46981@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46981}: @code{typing.get_args(typing.Tuple[()])} now returns @code{()}
instead of @code{((),)}.

@item 
bpo-46968@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46968}: Add @code{os.sysconf_names['SC_MINSIGSTKSZ']}.

@item 
bpo-46985@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46985}: Upgrade pip wheel bundled with ensurepip (pip 22.0.4)

@item 
bpo-46968@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46968}: @ref{5c,,faulthandler}: On Linux 5.14 and newer, dynamically
determine size of signal handler stack size CPython allocates using
@code{getauxval(AT_MINSIGSTKSZ)}. This changes allows for Python extension’s
request to Linux kernel to use AMX_TILE instruction set on Sapphire Rapids
Xeon processor to succeed, unblocking use of the ISA in frameworks.

@item 
bpo-46917@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46917}: The @ref{872,,math.nan} value is now always available. Patch by
Victor Stinner.

@item 
bpo-46955@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46955}: Expose @code{asyncio.base_events.Server} as
@ref{d07,,asyncio.Server}. Patch by Stefan Zabka.

@item 
bpo-23325@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23325}: The @ref{cb,,signal} module no longer assumes that
@ref{1baf,,SIG_IGN} and @ref{1bb0,,SIG_DFL} are small int
singletons.

@item 
bpo-46932@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46932}: Update bundled libexpat to 2.4.7

@item 
bpo-46933@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46933}: The @ref{b7,,pwd} module is now optional.
@ref{c08,,os.path.expanduser()} returns the path when the @code{pwd} module is
not available.

@item 
bpo-40059@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40059}: 
@geindex Python 향상 제안; PEP 680
PEP 680@footnote{https://peps.python.org/pep-0680/}, the @ref{102,,tomllib} module. Adds support for parsing
TOML.

@item 
bpo-464471@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=464471}: @ref{813,,asyncio.timeout()} and @ref{1bb1,,asyncio.timeout_at()} context
managers added. Patch by Tin Tvrtković and Andrew Svetlov.

@item 
bpo-46805@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46805}: Added raw datagram socket functions for asyncio:
@code{sock_sendto()},
@code{sock_recvfrom()} and
@code{sock_recvfrom_into()}.

@item 
bpo-46644@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46644}: No longer require valid typeforms to be callable. This allows
@ref{b37,,typing.Annotated} to wrap @ref{9c9,,typing.ParamSpecArgs} and
@ref{1bb2,,dataclasses.InitVar}. Patch by Gregory Beauregard.

@item 
bpo-46581@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46581}: Brings @code{ParamSpec} propagation for @code{GenericAlias}
in line with @code{Concatenate} (and others).

@item 
bpo-45413@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45413}: Define `posix_venv' and `nt_venv' @ref{449,,sysconfig installation schemes} to be used for bootstrapping new virtual
environments. Add `venv' sysconfig installation scheme to get the
appropriate one of the above. The schemes are identical to the
pre-existing `posix_prefix' and `nt' install schemes. The @ref{117,,venv}
module now uses the `venv' scheme to create new virtual environments
instead of hardcoding the paths depending only on the platform. Downstream
Python distributors customizing the `posix_prefix' or `nt' install scheme
in a way that is not compatible with the install scheme used in virtual
environments are encouraged not to customize the `venv' schemes. When
Python itself runs in a virtual environment,
@ref{1bb3,,sysconfig.get_default_scheme()} and
@ref{89e,,sysconfig.get_preferred_scheme()} with @code{key="prefix"} returns
`venv'.

@item 
bpo-43224@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43224}: Implement support for PEP 646 in typing.py.

@item 
bpo-43224@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43224}: Allow unpacking types.GenericAlias objects, e.g. @code{*tuple[int,
str]}.

@item 
bpo-46557@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46557}: Warnings captured by the logging module are now logged without
a format string to prevent systems that group logs by the msg argument
from grouping captured warnings together.

@item 
bpo-41370@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41370}: @ref{8bf,,typing.get_type_hints()} now supports evaluating strings
as forward references in @ref{8c0,,PEP 585 generic aliases}.

@item 
bpo-46607@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46607}: Add @ref{1a3,,DeprecationWarning} to @code{LegacyInterpolation},
deprecated in the docstring since Python 3.2. Will be removed in Python
3.13. Use @code{BasicInterpolation} or @code{ExtendedInterpolation}
instead.

@item 
bpo-26120@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26120}: @ref{ba,,pydoc} now excludes __future__ imports from the module’s
data items.

@item 
bpo-46480@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46480}: Add @ref{8b9,,typing.assert_type()}. Patch by Jelle Zijlstra.

@item 
bpo-46421@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46421}: Fix a unittest issue where if the command was invoked as
@code{python -m unittest} and the filename(s) began with a dot (.), a
@code{ValueError} is returned.

@item 
bpo-46245@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46245}: Add optional parameter `dir_fd' in @ref{356,,shutil.rmtree()}.

@item 
bpo-22859@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22859}: @code{unittest.TestProgram.usageExit()} is marked as
deprecated, to be removed in Python 3.13.

@item 
bpo-46170@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46170}: Improve the error message when you try to subclass an instance
of @ref{ef0,,typing.NewType}.

@item 
bpo-40296@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40296}: Fix supporting generic aliases in @ref{ba,,pydoc}.

@item 
bpo-20392@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20392}: Fix inconsistency with uppercase file extensions in
@code{MimeTypes.guess_type()}. Patch by Kumar Aditya.

@item 
bpo-46030@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46030}: Add @code{LOCAL_CREDS}, @code{LOCAL_CREDS_PERSISTENT} and
@code{SCM_CREDS2} FreeBSD constants to the socket module.

@item 
bpo-44439@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44439}: Fix @code{.write()} method of a member file in @code{ZipFile}, when
the input data is an object that supports the buffer protocol, the file
length may be wrong.

@item 
bpo-45171@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45171}: Fix handling of the @code{stacklevel} argument to logging
functions in the @ref{8b,,logging} module so that it is consistent across all
logging functions and, as advertised, similar to the @code{stacklevel}
argument used in @ref{171e,,warn()}.

@item 
bpo-24959@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24959}: Fix bug where @ref{10c,,unittest} sometimes drops frames from
tracebacks of exceptions raised in tests.

@item 
bpo-44859@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44859}: Raise more accurate and 
@geindex Python 향상 제안; PEP 249
PEP 249@footnote{https://peps.python.org/pep-0249/} compatible exceptions in
@ref{d4,,sqlite3}.


@itemize *

@item 
Raise @ref{88c,,InterfaceError} instead of
@ref{305,,ProgrammingError} for @code{SQLITE_MISUSE} errors.

@item 
Don’t overwrite @ref{179f,,BufferError} with @ref{2ec,,ValueError} when conversion to
BLOB fails.

@item 
Raise @ref{305,,ProgrammingError} instead of @ref{1bb4,,Warning} if
user tries to @ref{5af,,execute()} more than one SQL statement.

@item 
Raise @ref{305,,ProgrammingError} instead of @ref{2ec,,ValueError} if an SQL
query contains null characters.
@end itemize

@item 
bpo-44493@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44493}: Add missing terminated NUL in sockaddr_un’s length

This was potentially observable when using non-abstract AF_UNIX datagram
sockets to processes written in another programming language.

@item 
bpo-41930@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41930}: Add @ref{88d,,serialize()} and
@ref{88e,,deserialize()} support to @ref{d4,,sqlite3}. Patch
by Erlend E. Aasland.

@item 
bpo-33178@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33178}: Added @ref{1bb5,,ctypes.BigEndianUnion} and
@ref{1bb6,,ctypes.LittleEndianUnion} classes, as originally documented in the
library docs but not yet implemented.

@item 
bpo-43352@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43352}: Add an Barrier object in synchronization primitives of
`asyncio' Lib in order to be consistent with Barrier from `threading' and
`multiprocessing' libs*

@item 
bpo-35859@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35859}: @ref{be,,re} module, fix a few bugs about capturing group. In rare
cases, capturing group gets an incorrect string. Patch by Ma Lin.
@end itemize

@node Documentation<30>,Tests<30>,Library<92>,Python 3 11 0 alpha 7
@anchor{whatsnew/changelog id416}@anchor{1bb7}
@subsubsection Documentation



@itemize -

@item 
bpo-45099@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45099}: Document internal @ref{b,,asyncio} API.

@item 
bpo-47126@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47126}: Update PEP URLs to 
@geindex Python 향상 제안; PEP 676
PEP 676@footnote{https://peps.python.org/pep-0676/}’s new canonical form.

@item 
bpo-47040@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47040}: Clarified the old Python versions compatibility note of
@ref{1a11,,binascii.crc32()} / @ref{1bb8,,zlib.adler32()} / @ref{1a10,,zlib.crc32()}
functions.

@item 
bpo-46033@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46033}: Clarify @code{for} statement execution in its doc.

@item 
bpo-45790@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45790}: Adjust inaccurate phrasing in
@ref{1bb9,,확장형 정의하기; 자습서} about the @code{ob_base} field and the
macros used to access its contents.

@item 
bpo-42340@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42340}: Document that in some circumstances @ref{bc4,,KeyboardInterrupt}
may cause the code to enter an inconsistent state. Provided a sample
workaround to avoid it if needed.

@item 
bpo-41233@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41233}: Link the errnos referenced in @code{Doc/library/exceptions.rst} to
their respective section in @code{Doc/library/errno.rst}, and vice versa.
Previously this was only done for EINTR and InterruptedError. Patch by Yan
“yyyyyyyan” Orestes.
@end itemize

@node Tests<30>,Build<36>,Documentation<30>,Python 3 11 0 alpha 7
@anchor{whatsnew/changelog id417}@anchor{1bba}
@subsubsection Tests



@itemize -

@item 
bpo-47205@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47205}: Skip test for @ref{130f,,sched_getaffinity()} and
@ref{1313,,sched_setaffinity()} error case on FreeBSD.

@item 
bpo-46126@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46126}: Restore ‘descriptions’ when running tests internally.

@item 
bpo-47104@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47104}: Rewrite @ref{ae5,,asyncio.to_thread()} tests to use
@ref{361,,unittest.IsolatedAsyncioTestCase}.

@item 
bpo-40280@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40280}: The test suite is now passing on the Emscripten platform. All
fork, socket, and subprocess-based tests are skipped.

@item 
bpo-47037@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47037}: Skip @code{strftime("%4Y")} feature test on Windows. It can cause
an assertion error in debug builds.

@item 
bpo-46587@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46587}: Skip tests if platform’s @code{strftime} does not support
non-portable glibc extensions.

@item 
bpo-47015@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47015}: A test case for @ref{d04,,os.sendfile()} is converted from
deprecated @code{asyncore} (see 
@geindex Python 향상 제안; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/}) to @ref{b,,asyncio}. Patch by
Oleg Iarygin.
@end itemize

@node Build<36>,Windows<31>,Tests<30>,Python 3 11 0 alpha 7
@anchor{whatsnew/changelog id418}@anchor{1bbb}
@subsubsection Build



@itemize -

@item 
bpo-40280@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40280}: Add configure option @ref{1bbc,,--enable-wasm-dynamic-linking} to
enable @code{dlopen} and MAIN_MODULE / SIDE_MODULE on @code{wasm32-emscripten}.

@item 
bpo-46023@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46023}: @code{makesetup} now detects and skips all duplicated module
definitions. The first entry wins.

@item 
bpo-40280@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40280}: Add SOABI @code{wasm32-emscripten} for Emscripten and
@code{wasm32-wasi} for WASI on 32bit WASM as well as @code{wasm64} counter
parts.

@item 
bpo-47032@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47032}: Ensure Windows install builds fail correctly with a non-zero
exit code when part of the build fails.

@item 
bpo-47024@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47024}: Update OpenSSL to 1.1.1n for macOS installers and all Windows
builds.

@item 
bpo-46996@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46996}: The @ref{f6,,tkinter} package now requires Tcl/Tk version 8.5.12
or newer.

@item 
bpo-46973@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46973}: Add @code{regen-configure} make target to regenerate configure
script with Christian’s container image
@code{quay.io/tiran/cpython_autoconf:269}.

@item 
bpo-46917@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46917}: Building Python now requires support of IEEE 754 floating-point
numbers. Patch by Victor Stinner.

@item 
bpo-45774@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45774}: @code{configure} now verifies that all SQLite C APIs needed for
the @ref{d4,,sqlite3} extension module are found.
@end itemize

@node Windows<31>,macOS<22>,Build<36>,Python 3 11 0 alpha 7
@anchor{whatsnew/changelog id419}@anchor{1bbd}
@subsubsection Windows



@itemize -

@item 
bpo-47194@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47194}: Update @code{zlib} to v1.2.12 to resolve 
@geindex Common Vulnerabilities and Exposures; CVE 2018-25032
CVE 2018-25032@footnote{https://www.cve.org/CVERecord?id=CVE-2018-25032}.

@item 
bpo-47171@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47171}: Enables installing the @code{py.exe} launcher on Windows
ARM64.

@item 
bpo-46566@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46566}: Upgraded @ref{7d9,,Python install manager} to support a new @code{-V:company/tag}
argument for full 
@geindex Python 향상 제안; PEP 514
PEP 514@footnote{https://peps.python.org/pep-0514/} support and to detect ARM64 installs. The
@code{-64} suffix on arguments is deprecated, but still selects any
non-32-bit install. Setting 
@geindex PYLAUNCHER_ALLOW_INSTALL
@geindex 환경 변수; PYLAUNCHER_ALLOW_INSTALL
@code{PYLAUNCHER_ALLOW_INSTALL} and
specifying a version that is not installed will attempt to install the
requested version from the Microsoft Store.

@item 
bpo-47086@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=47086}: The installer for Windows now includes documentation as loose
HTML files rather than a single compiled @code{.chm} file.

@item 
bpo-46907@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46907}: Update Windows installer to use SQLite 3.38.1.

@item 
bpo-44549@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44549}: Update bzip2 to 1.0.8 in Windows builds to mitigate
@geindex Common Vulnerabilities and Exposures; CVE 2016-3189
CVE 2016-3189@footnote{https://www.cve.org/CVERecord?id=CVE-2016-3189} and 
@geindex Common Vulnerabilities and Exposures; CVE 2019-12900
CVE 2019-12900@footnote{https://www.cve.org/CVERecord?id=CVE-2019-12900}.

@item 
bpo-46948@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46948}: Prevent 
@geindex Common Vulnerabilities and Exposures; CVE 2022-26488
CVE 2022-26488@footnote{https://www.cve.org/CVERecord?id=CVE-2022-26488} by ensuring the Add to PATH option in
the Windows installer uses the correct path when being repaired.
@end itemize

@node macOS<22>,Tools/Demos<26>,Windows<31>,Python 3 11 0 alpha 7
@anchor{whatsnew/changelog id420}@anchor{1bbe}
@subsubsection macOS



@itemize -

@item 
bpo-46890@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46890}: Fix a regression in the setting of @code{sys._base_executable} in
framework builds, and thereby fix a regression in @ref{117,,venv} virtual
environments with such builds.

@item 
bpo-46907@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46907}: Update macOS installer to SQLite 3.38.1.
@end itemize

@node Tools/Demos<26>,C API<32>,macOS<22>,Python 3 11 0 alpha 7
@anchor{whatsnew/changelog id421}@anchor{1bbf}
@subsubsection Tools/Demos



@itemize -

@item 
bpo-40280@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40280}: Replace Emscripten’s limited shell with Katie Bell’s browser-ui
REPL from python-wasm project.
@end itemize

@node C API<32>,,Tools/Demos<26>,Python 3 11 0 alpha 7
@anchor{whatsnew/changelog id422}@anchor{1bc0}
@subsubsection C API



@itemize -

@item 
bpo-40421@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40421}: Add @code{PyFrame_GetBuiltins}, @code{PyFrame_GetGenerator} and
@code{PyFrame_GetGlobals} C-API functions to access frame object attributes
safely from C code.

@item 
bpo-46850@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46850}: Move the private @code{_PyFrameEvalFunction} type, and private
@code{_PyInterpreterState_GetEvalFrameFunc()} and
@code{_PyInterpreterState_SetEvalFrameFunc()} functions to the internal C
API. The @code{_PyFrameEvalFunction} callback function type now uses the
@code{_PyInterpreterFrame} type which is part of the internal C API. Patch by
Victor Stinner.

@item 
bpo-46850@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46850}: Move the private undocumented @code{_PyEval_EvalFrameDefault()}
function to the internal C API. The function now uses the
@code{_PyInterpreterFrame} type which is part of the internal C API. Patch by
Victor Stinner.

@item 
bpo-46850@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46850}: Remove the private undocumented function
@code{_PyEval_CallTracing()} from the C API. Call the public
@ref{1bc1,,sys.call_tracing()} function instead. Patch by Victor Stinner.

@item 
bpo-46850@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46850}: Remove the private undocumented function
@code{_PyEval_GetCoroutineOriginTrackingDepth()} from the C API. Call the
public @ref{d83,,sys.get_coroutine_origin_tracking_depth()} function instead.
Patch by Victor Stinner.

@item 
bpo-46850@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46850}: Remove the following private undocumented functions from the C
API:


@itemize *

@item 
@code{_PyEval_GetAsyncGenFirstiter()}

@item 
@code{_PyEval_GetAsyncGenFinalizer()}

@item 
@code{_PyEval_SetAsyncGenFirstiter()}

@item 
@code{_PyEval_SetAsyncGenFinalizer()}
@end itemize

Call the public @ref{1bc2,,sys.get_asyncgen_hooks()} and
@ref{199e,,sys.set_asyncgen_hooks()} functions instead. Patch by Victor Stinner.

@item 
bpo-46987@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46987}: Remove private functions @code{_PySys_GetObjectId()} and
@code{_PySys_SetObjectId()}. Patch by Donghee Na.

@item 
bpo-46906@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46906}: Add new functions to pack and unpack C double (serialize and
deserialize): @ref{968,,PyFloat_Pack2()}, @ref{969,,PyFloat_Pack4()},
@ref{96a,,PyFloat_Pack8()}, @ref{96b,,PyFloat_Unpack2()},
@ref{96c,,PyFloat_Unpack4()} and @ref{96d,,PyFloat_Unpack8()}. Patch by Victor
Stinner.
@end itemize

@node Python 3 11 0 alpha 6,Python 3 11 0 alpha 5,Python 3 11 0 alpha 7,Changelog
@anchor{whatsnew/changelog python-3-11-0-alpha-6}@anchor{1bc3}
@subsection Python 3.11.0 alpha 6


`Release date: 2022-03-07'

@menu
* Core and Builtins: Core and Builtins<90>. 
* Library: Library<93>. 
* Core and Builtins: Core and Builtins<91>. 
* Library: Library<94>. 
* Core and Builtins: Core and Builtins<92>. 
* Library: Library<95>. 
* Core and Builtins: Core and Builtins<93>. 
* Library: Library<96>. 
* Documentation: Documentation<31>. 
* Tests: Tests<31>. 
* Build: Build<37>. 
* Windows: Windows<32>. 
* IDLE: IDLE<16>. 
* C API: C API<33>. 

@end menu

@node Core and Builtins<90>,Library<93>,,Python 3 11 0 alpha 6
@anchor{whatsnew/changelog id423}@anchor{1bc4}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-46940@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46940}: Avoid overriding @ref{5ee,,AttributeError} metadata information for
nested attribute access calls. Patch by Pablo Galindo.

@item 
bpo-46927@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46927}: Include the type’s name in the error message for subscripting
non-generic types.

@item 
bpo-46921@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46921}: Support vectorcall for @code{super()}. Patch by Ken Jin.

@item 
bpo-46841@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46841}: Fix incorrect handling of inline cache entries when
specializing @ref{366,,BINARY_OP}.

@item 
bpo-46841@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46841}: Use an oparg to simplify the construction of helpful error
messages in @ref{1bc5,,GET_AWAITABLE}.

@item 
bpo-46903@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46903}: Make sure that str subclasses can be used as attribute names
for instances with virtual dictionaries. Fixes regression in 3.11alpha

@item 
bpo-46841@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46841}: Add more detailed specialization failure stats for
@ref{b61,,COMPARE_OP} followed by @ref{1b1c,,EXTENDED_ARG}.

@item 
bpo-46891@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46891}: Fix bug introduced during 3.11alpha where subclasses of
@code{types.ModuleType} with @code{__slots__} were not initialized correctly,
resulting in an interpreter crash.

@item 
bpo-46841@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46841}: Use inline caching for @ref{703,,LOAD_ATTR},
@code{LOAD_METHOD}, and @ref{1bc6,,STORE_ATTR}.

@item 
bpo-46841@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46841}: Use inline cache for @code{BINARY_SUBSCR}.

@item 
bpo-46841@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46841}: Use inline caching for @ref{b61,,COMPARE_OP}.

@item 
bpo-46864@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46864}: Deprecate @code{PyBytesObject.ob_shash}. It will be removed in
Python 3.13.

@item 
bpo-46841@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46841}: Use inline caching for @ref{1bc7,,UNPACK_SEQUENCE}.

@item 
bpo-46845@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46845}: Reduces dict size by removing hash value from hash table when
all inserted keys are Unicode. For example,
@code{sys.getsizeof(dict.fromkeys("abcdefg"))} becomes 272 bytes from 352
bytes on 64bit platform.

@item 
bpo-46841@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46841}: Use inline cache for @ref{1a5a,,LOAD_GLOBAL}.

@item 
bpo-46852@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46852}: Rename the private undocumented @code{float.__set_format__()}
method to @code{float.__setformat__()} to fix a typo introduced in Python
3.7. The method is only used by test_float. Patch by Victor Stinner.

@item 
bpo-46852@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46852}: Remove the undocumented private @code{float.__set_format__()}
method, previously known as @code{float.__setformat__()} in Python 3.7. Its
docstring said: “You probably don’t want to use this function. It exists
mainly to be used in Python’s test suite.” Patch by Victor Stinner.

@item 
bpo-40116@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40116}: Fix regression that dict.update(other) may don’t respect
iterate order of other when other is key sharing dict.

@item 
bpo-46712@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46712}: Share global string identifiers in deep-frozen modules.

@item 
bpo-46430@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46430}: Fix memory leak in interned strings of deep-frozen modules.

@item 
bpo-46841@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46841}: Store @ref{366,,BINARY_OP} caches inline using a new
@ref{907,,CACHE} instruction.

@item 
bpo-45107@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45107}: Specialize @code{LOAD_METHOD} for instances with a dict.

@item 
bpo-44337@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44337}: Reduce the memory usage of specialized @ref{703,,LOAD_ATTR} and
@ref{1bc6,,STORE_ATTR} instructions.

@item 
bpo-46729@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46729}: Add number of sub-exceptions to @code{BaseException.__str__()}.

@item 
bpo-45885@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45885}: Don’t un-adapt @ref{b61,,COMPARE_OP} when collecting
specialization stats.

@item 
bpo-46329@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46329}: Fix specialization stats gathering for @code{PRECALL}
instructions.
@end itemize

@node Library<93>,Core and Builtins<91>,Core and Builtins<90>,Python 3 11 0 alpha 6
@anchor{whatsnew/changelog id424}@anchor{1bc8}
@subsubsection Library



@itemize -

@item 
bpo-46794@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46794}: Bump up the libexpat version into 2.4.6
@end itemize

@node Core and Builtins<91>,Library<94>,Library<93>,Python 3 11 0 alpha 6
@anchor{whatsnew/changelog id425}@anchor{1bc9}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-46823@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46823}: Implement a specialized combined opcode
@code{LOAD_FAST__LOAD_ATTR_INSTANCE_VALUE}.  Patch by Dennis Sweeney.

@item 
bpo-46820@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46820}: Fix parsing a numeric literal immediately (without spaces)
followed by “not in” keywords, like in @code{1not in x}. Now the parser only
emits a warning, not a syntax error.

@item 
bpo-46329@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46329}: Move @code{KW_NAMES} before @code{PRECALL} instruction in call
sequence. Change @code{operand} of @code{CALL} to match @code{PRECALL} for easier
specialization.

@item 
bpo-46808@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46808}: Remove the @code{NEXT_BLOCK} macro from compile.c, and make the
compiler automatically generate implicit blocks when they are needed.

@item 
bpo-46329@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46329}: Add @code{PUSH_NULL} instruction. This is used as a prefix when
evaluating a callable, so that the stack has the same shape for methods
and other calls. @code{PRECALL_FUNCTION} and @code{PRECALL_METHOD} are merged
into a single @code{PRECALL} instruction.

There is no change in semantics.

@item 
bpo-46762@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46762}: Fix an assert failure in debug builds when a ‘<’, ‘>’, or ‘=’
is the last character in an f-string that’s missing a closing right brace.

@item 
bpo-46730@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46730}: Message of AttributeError caused by getting, setting or
deleting a property without the corresponding function now mentions that
the attribute is in fact a property and also specifies type of the class
that it belongs to.

@item 
bpo-46724@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46724}: Make sure that all backwards jumps use the @code{JUMP_ABSOLUTE}
instruction, rather than @code{JUMP_FORWARD} with an argument of
@code{(2**32)+offset}.

@item 
bpo-46732@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46732}: Correct the docstring for the @ref{14da,,__bool__()} method.
Patch by Jelle Zijlstra.

@item 
bpo-46072@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46072}: Add more detailed specialization failure statistics for
@ref{366,,BINARY_OP}.

@item 
bpo-46707@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46707}: Avoid potential exponential backtracking when producing some
syntax errors involving lots of brackets. Patch by Pablo Galindo.
@end itemize

@node Library<94>,Core and Builtins<92>,Core and Builtins<91>,Python 3 11 0 alpha 6
@anchor{whatsnew/changelog id426}@anchor{1bca}
@subsubsection Library



@itemize -

@item 
bpo-46323@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46323}: @ref{2e,,ctypes} now allocates memory on the stack instead of on
the heap to pass arguments while calling a Python callback function. Patch
by Donghee Na.
@end itemize

@node Core and Builtins<92>,Library<95>,Library<94>,Python 3 11 0 alpha 6
@anchor{whatsnew/changelog id427}@anchor{1bcb}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-45923@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45923}: Add a quickened form of @ref{5b9,,RESUME} that skips quickening
checks.

@item 
bpo-46702@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46702}: Specialize @ref{1bc7,,UNPACK_SEQUENCE} for @ref{610,,tuple} and
@ref{24d,,list} unpackings.

@item 
bpo-46072@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46072}: Opcode pair stats are now gathered with @code{--enable-pystats}.
Defining @code{DYNAMIC_EXECUTION_PROFILE} or  @code{DXPAIRS} no longer has any
effect.

@item 
bpo-46675@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46675}: Allow more than 16 items in a split dict before it is combined.
The limit is now 254.
@end itemize

@node Library<95>,Core and Builtins<93>,Core and Builtins<92>,Python 3 11 0 alpha 6
@anchor{whatsnew/changelog id428}@anchor{1bcc}
@subsubsection Library



@itemize -

@item 
bpo-40479@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40479}: Add a missing call to @code{va_end()} in
@code{Modules/_hashopenssl.c}.

@item 
bpo-46323@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46323}: Use @ref{77d,,PyObject_Vectorcall()} while calling ctypes callback
function. Patch by Donghee Na.
@end itemize

@node Core and Builtins<93>,Library<96>,Library<95>,Python 3 11 0 alpha 6
@anchor{whatsnew/changelog id429}@anchor{1bcd}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-46615@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46615}: When iterating over sets internally in @code{setobject.c}, acquire
strong references to the resulting items from the set.  This prevents
crashes in corner-cases of various set operations where the set gets
mutated.

@item 
bpo-45828@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45828}: The bytecode compiler now attempts to apply runtime stack
manipulations at compile-time (whenever it is feasible to do so).

@item 
bpo-30496@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30496}: Fixed a minor portability issue in the implementation of
@ref{1bce,,PyLong_FromLong()}, and added a fast path for single-digit integers
to @ref{1bcf,,PyLong_FromLongLong()}.
@end itemize

@node Library<96>,Documentation<31>,Core and Builtins<93>,Python 3 11 0 alpha 6
@anchor{whatsnew/changelog id430}@anchor{1bd0}
@subsubsection Library



@itemize -

@item 
bpo-25707@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25707}: Fixed a file leak in @ref{579,,xml.etree.ElementTree.iterparse()}
when the iterator is not exhausted. Patch by Jacob Walls.

@item 
bpo-46877@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46877}: Export @ref{1bd1,,unittest.doModuleCleanups()} in @ref{10c,,unittest}.
Patch by Kumar Aditya.

@item 
bpo-46848@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46848}: For performance, use the optimized string-searching
implementations from @ref{1bd2,,find()} and @ref{1bd3,,rfind()} for
@code{find()} and @code{rfind()}.

@item 
bpo-46736@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46736}: @ref{d37,,SimpleHTTPRequestHandler} now uses HTML5
grammar. Patch by Donghee Na.

@item 
bpo-44886@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44886}: Inherit asyncio proactor datagram transport from
@ref{1b25,,asyncio.DatagramTransport}.

@item 
bpo-46827@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46827}: Support UDP sockets in  @ref{fc7,,asyncio.loop.sock_connect()} for
selector-based event loops.  Patch by Thomas Grainger.

@item 
bpo-46811@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46811}: Make test suite support Expat >=2.4.5

@item 
bpo-46252@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46252}: Raise @ref{198,,TypeError} if @ref{ae7,,ssl.SSLSocket} is passed to
transport-based APIs.

@item 
bpo-46784@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46784}: Fix libexpat symbols collisions with user dynamically loaded or
statically linked libexpat in embedded Python.

@item 
bpo-46786@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46786}: The HTML serialisation in xml.etree.ElementTree now writes
@code{embed}, @code{source}, @code{track} and @code{wbr} as empty tags, as defined in
HTML 5.

@item 
bpo-39327@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39327}: @ref{356,,shutil.rmtree()} can now work with VirtualBox shared
folders when running from the guest operating-system.

@item 
bpo-45390@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45390}: Propagate @ref{4d5,,asyncio.CancelledError} message from inner task
to outer awaiter.

@item 
bpo-46756@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46756}: Fix a bug in
@ref{1bd4,,urllib.request.HTTPPasswordMgr.find_user_password()} and
@ref{1bd5,,urllib.request.HTTPPasswordMgrWithPriorAuth.is_authenticated()} which
allowed to bypass authorization. For example, access to URI
@code{example.org/foobar} was allowed if the user was authorized for URI
@code{example.org/foo}.

@item 
bpo-46737@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46737}: @ref{1bd6,,random.gauss()} and @ref{1bd7,,random.normalvariate()} now have
default arguments.

@item 
bpo-46752@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46752}: Add task groups to asyncio (structured concurrency, inspired by
Trio’s nurseries). This also introduces a change to task cancellation,
where a cancelled task can’t be cancelled again until it calls
.uncancel().

@item 
bpo-46724@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46724}: Fix @ref{3c,,dis} behavior on negative jump offsets.

@item 
bpo-46333@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46333}: The @code{__repr__()} method of @ref{1bd8,,typing.ForwardRef} now
includes the @code{module} parameter of @code{typing.ForwardRef} when it is
set.

@item 
bpo-46643@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46643}: In @ref{8bf,,typing.get_type_hints()}, support evaluating
stringified @code{ParamSpecArgs} and @code{ParamSpecKwargs} annotations. Patch
by Gregory Beauregard.

@item 
bpo-45863@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45863}: When the @ref{e4,,tarfile} module creates a pax format archive, it
will put an integer representation of timestamps in the ustar header (if
possible) for the benefit of older unarchivers, in addition to the
existing full-precision timestamps in the pax extended header.

@item 
bpo-46066@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46066}: Deprecate kwargs-based syntax for @ref{332,,typing.TypedDict}
definitions. It had confusing semantics when specifying totality, and was
largely unused. Patch by Jingchen Ye.

@item 
bpo-46676@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46676}: Make @ref{488,,typing.ParamSpec} args and kwargs equal to
themselves. Patch by Gregory Beauregard.

@item 
bpo-46323@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46323}: @code{ctypes.CFUNCTYPE()} and @code{ctypes.WINFUNCTYPE()} now fail to
create the type if its @code{_argtypes_} member contains too many arguments.
Previously, the error was only raised when calling a function. Patch by
Victor Stinner.

@item 
bpo-46672@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46672}: Fix @code{NameError} in @ref{812,,asyncio.gather()} when initial type
check fails.

@item 
bpo-46659@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46659}: The @ref{94a,,calendar.LocaleTextCalendar} and
@ref{94b,,calendar.LocaleHTMLCalendar} classes now use
@ref{327,,locale.getlocale()}, instead of using
@ref{326,,locale.getdefaultlocale()}, if no locale is specified. Patch by
Victor Stinner.

@item 
bpo-46659@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46659}: The @ref{326,,locale.getdefaultlocale()} function is deprecated and
will be removed in Python 3.13. Use @ref{328,,locale.setlocale()},
@ref{75b,,locale.getpreferredencoding(False)}
and @ref{327,,locale.getlocale()} functions instead.  Patch by Victor Stinner.

@item 
bpo-46655@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46655}: In @ref{8bf,,typing.get_type_hints()}, support evaluating bare
stringified @code{TypeAlias} annotations. Patch by Gregory Beauregard.

@item 
bpo-45948@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45948}: Fixed a discrepancy in the C implementation of the
@ref{12b,,xml.etree.ElementTree} module. Now, instantiating an
@ref{c48,,xml.etree.ElementTree.XMLParser} with a @code{target=None} keyword
provides a default @ref{c49,,xml.etree.ElementTree.TreeBuilder} target as
the Python implementation does.

@item 
bpo-46626@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46626}: Expose Linux’s @code{IP_BIND_ADDRESS_NO_PORT} option in
@ref{d1,,socket}.

@item 
bpo-46521@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46521}: Fix a bug in the @ref{1d,,codeop} module that was incorrectly
identifying invalid code involving string quotes as valid code.

@item 
bpo-46571@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46571}: Improve @ref{8c2,,typing.no_type_check()}.

Now it does not modify external classes and functions. We also now
correctly mark classmethods as not to be type checked.

@item 
bpo-46400@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46400}: expat: Update libexpat from 2.4.1 to 2.4.4

@item 
bpo-46556@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46556}: Deprecate undocumented support for using a
@ref{266,,pathlib.Path} object as a context manager.

@item 
bpo-46534@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46534}: Implement 
@geindex Python 향상 제안; PEP 673
PEP 673@footnote{https://peps.python.org/pep-0673/} @ref{7e2,,typing.Self}. Patch by James
Hilton-Balfe.

@item 
bpo-46522@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46522}: Make various module @code{__getattr__} AttributeErrors more
closely match a typical AttributeError

@item 
bpo-46475@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46475}: Add @ref{8b6,,typing.Never} and @ref{8b5,,typing.assert_never()}. Patch
by Jelle Zijlstra.

@item 
bpo-46333@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46333}: The @code{__eq__()} and @code{__hash__()} methods of
@ref{1bd8,,typing.ForwardRef} now honor the @code{module} parameter of
@code{typing.ForwardRef}. Forward references from different modules are
now differentiated.

@item 
bpo-46246@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46246}: Add missing @code{__slots__} to
@code{importlib.metadata.DeprecatedList}. Patch by Arie Bovenberg.

@item 
bpo-46232@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46232}: The @ref{d5,,ssl} module now handles certificates with bit strings
in DN correctly.

@item 
bpo-46195@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46195}: @ref{8bf,,typing.get_type_hints()} no longer adds @code{Optional} to
parameters with @code{None} as a default. This aligns to changes to PEP 484
in @indicateurl{https://github.com/python/peps/pull/689}

@item 
bpo-31369@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31369}: Add @ref{83e,,RegexFlag} to @code{re.__all__} and documented it.
Add @code{NOFLAG} to indicate no flags being set.

@item 
bpo-45898@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45898}: @ref{2e,,ctypes} no longer defines @code{ffi_type_*} symbols in
@code{cfield.c}. The symbols have been provided by libffi for over a decade.

@item 
bpo-44953@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44953}: Calling @code{operator.itemgetter} objects and
@code{operator.attrgetter} objects is now faster due to use of the vectorcall
calling convention.

@item 
bpo-44289@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44289}: Fix an issue with @ref{1bd9,,is_tarfile()} method when using
`fileobj' argument: position in the `fileobj' was advanced forward which
made it unreadable with @ref{1bda,,tarfile.TarFile.open()}.

@item 
bpo-44011@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44011}: Reimplement SSL/TLS support in asyncio, borrow the
implementation from uvloop library.

@item 
bpo-41086@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41086}: Make the @ref{4de,,configparser.ConfigParser} constructor raise
@ref{198,,TypeError} if the @code{interpolation} parameter is not of type
@code{configparser.Interpolation}

@item 
bpo-29418@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29418}: Implement @ref{859,,inspect.ismethodwrapper()} and fix
@ref{1bdb,,inspect.isroutine()} for cases where methodwrapper is given. Patch by
Hakan Çelik.

@item 
bpo-14156@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14156}: argparse.FileType now supports an argument of ‘-’ in binary
mode, returning the .buffer attribute of sys.stdin/sys.stdout as
appropriate. Modes including ‘x’ and ‘a’ are treated equivalently to ‘w’
when argument is ‘-’. Patch contributed by Josh Rosenberg
@end itemize

@node Documentation<31>,Tests<31>,Library<96>,Python 3 11 0 alpha 6
@anchor{whatsnew/changelog id431}@anchor{1bdc}
@subsubsection Documentation



@itemize -

@item 
bpo-42238@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42238}: @code{Doc/tools/rstlint.py} has moved to its own repository and is
now packaged on PyPI as @code{sphinx-lint}.
@end itemize

@node Tests<31>,Build<37>,Documentation<31>,Python 3 11 0 alpha 6
@anchor{whatsnew/changelog id432}@anchor{1bdd}
@subsubsection Tests



@itemize -

@item 
bpo-46913@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46913}: Fix test_faulthandler.test_sigfpe() if Python is built with
undefined behavior sanitizer (UBSAN): disable UBSAN on the
faulthandler_sigfpe() function. Patch by Victor Stinner.

@item 
bpo-46760@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46760}: Remove bytecode offsets from expected values in test.test_dis
module. Reduces the obstacles to modifying the VM or compiler.

@item 
bpo-46708@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46708}: Prevent default asyncio event loop policy modification warning
after @code{test_asyncio} execution.

@item 
bpo-46678@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46678}: The function @code{make_legacy_pyc} in
@code{Lib/test/support/import_helper.py} no longer fails when
@code{PYTHONPYCACHEPREFIX} is set to a directory on a different device from
where tempfiles are stored.

@item 
bpo-46623@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46623}: Skip test_pair() and test_speech128() of test_zlib on s390x
since they fail if zlib uses the s390x hardware accelerator. Patch by
Victor Stinner.
@end itemize

@node Build<37>,Windows<32>,Tests<31>,Python 3 11 0 alpha 6
@anchor{whatsnew/changelog id433}@anchor{1bde}
@subsubsection Build



@itemize -

@item 
bpo-46860@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46860}: Respect @code{--with-suffix} when building on case-insensitive
file systems.

@item 
bpo-46656@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46656}: Building Python now requires a C11 compiler. Optional C11
features are not required. Patch by Victor Stinner.

@item 
bpo-46656@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46656}: Building Python now requires support for floating-point
Not-a-Number (NaN): remove the @code{Py_NO_NAN} macro. Patch by Victor
Stinner.

@item 
bpo-46640@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46640}: Building Python now requires a C99 @code{<math.h>} header file
providing a @code{NAN} constant, or the @code{__builtin_nan()} built-in
function. Patch by Victor Stinner.

@item 
bpo-46608@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46608}: Exclude marshalled-frozen data if deep-freezing to save 300 KB
disk space. This includes adding a new @code{is_package} field to
@ref{978,,_frozen}. Patch by Kumar Aditya.

@item 
bpo-40280@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40280}: Fix wasm32-emscripten test failures and platform issues. -
Disable syscalls that are not supported or don’t work, e.g.   wait,
getrusage, prlimit, mkfifo, mknod, setres[gu]id, setgroups. - Use fd_count
to count open fds. - Add more checks for subprocess and fork. - Add
workarounds for missing _multiprocessing and failing socket.accept(). -
Enable bzip2. - Disable large file support. - Disable signal.alarm.

@item 
bpo-46430@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46430}: Intern strings in deep-frozen modules. Patch by Kumar Aditya.
@end itemize

@node Windows<32>,IDLE<16>,Build<37>,Python 3 11 0 alpha 6
@anchor{whatsnew/changelog id434}@anchor{1bdf}
@subsubsection Windows



@itemize -

@item 
bpo-46744@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46744}: The default all users install directory for ARM64 is now under
the native @code{Program Files} folder, rather than @code{Program Files (Arm)}
which is intended for ARM (32-bit) files.

@item 
bpo-46567@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46567}: Adds Tcl and Tk support for Windows ARM64. This also adds IDLE
to the installation.

@item 
bpo-46638@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46638}: Ensures registry virtualization is consistently disabled. For
3.10 and earlier, it remains enabled (some registry writes are protected),
while for 3.11 and later it is disabled (registry modifications affect all
applications).
@end itemize

@node IDLE<16>,C API<33>,Windows<32>,Python 3 11 0 alpha 6
@anchor{whatsnew/changelog id435}@anchor{1be0}
@subsubsection IDLE



@itemize -

@item 
bpo-46630@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46630}: Make query dialogs on Windows start with a cursor in the entry
box.

@item 
bpo-45447@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45447}: Apply IDLE syntax highlighting to @code{.pyi} files. Patch by Alex
Waygood and Terry Jan Reedy.
@end itemize

@node C API<33>,,IDLE<16>,Python 3 11 0 alpha 6
@anchor{whatsnew/changelog id436}@anchor{1be1}
@subsubsection C API



@itemize -

@item 
bpo-46748@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46748}: Python’s public headers no longer import @code{<stdbool.h>},
leaving code that embeds/extends Python free to define @code{bool}, @code{true}
and @code{false}.

@item 
bpo-46836@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46836}: Move the @ref{98b,,PyFrameObject} type definition (@code{struct
_frame}) to the internal C API @code{pycore_frame.h} header file. Patch by
Victor Stinner.

@item 
bpo-45459@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45459}: Rename @code{Include/buffer.h} header file to
@code{Include/pybuffer.h} to avoid conflicts with projects having an existing
@code{buffer.h} header file. Patch by Victor Stinner.

@item 
bpo-45412@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45412}: Remove the @code{HAVE_PY_SET_53BIT_PRECISION} macro (moved to the
internal C API). Patch by Victor Stinner.

@item 
bpo-46613@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46613}: Added function @ref{633,,PyType_GetModuleByDef()}, which allows
access to module state when a method’s defining class is not available.
@end itemize

@node Python 3 11 0 alpha 5,Python 3 11 0 alpha 4,Python 3 11 0 alpha 6,Changelog
@anchor{whatsnew/changelog python-3-11-0-alpha-5}@anchor{1be2}
@subsection Python 3.11.0 alpha 5


`Release date: 2022-02-03'

@menu
* Core and Builtins: Core and Builtins<94>. 
* Library: Library<97>. 
* Core and Builtins: Core and Builtins<95>. 
* Library: Library<98>. 
* Build: Build<38>. 
* Core and Builtins: Core and Builtins<96>. 
* Library: Library<99>. 
* Documentation: Documentation<32>. 
* Tests: Tests<32>. 
* Build: Build<39>. 
* Windows: Windows<33>. 
* macOS: macOS<23>. 
* IDLE: IDLE<17>. 
* C API: C API<34>. 

@end menu

@node Core and Builtins<94>,Library<97>,,Python 3 11 0 alpha 5
@anchor{whatsnew/changelog id437}@anchor{1be3}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-45773@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45773}: Remove two invalid “peephole” optimizations from the bytecode
compiler.

@item 
bpo-46564@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46564}: Do not create frame objects when creating @ref{1a6,,super}
object. Patch by Kumar Aditya.

@item 
bpo-45885@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45885}: Added more fined-grained specialization failure stats regarding
the @code{COMPARE_OP} bytecode.

@item 
bpo-44977@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44977}: The delegation of @ref{19b,,int()} to @code{__trunc__()} is now
deprecated. Calling @code{int(a)} when @code{type(a)} implements
@code{__trunc__()} but not @code{__int__()} or @code{__index__()} now raises
a @ref{1a3,,DeprecationWarning}.

@item 
bpo-46458@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46458}: Reorder code emitted by the compiler for a
@ref{8f7,,try}-@ref{1ab,,except} block so that the @ref{17c,,else} block’s
code immediately follows the @code{try} body (without a jump). This is
more optimal for the happy path.

@item 
bpo-46527@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46527}: Allow passing @code{iterable} as a keyword argument to
@ref{1686,,enumerate()} again. Patch by Jelle Zijlstra.

@item 
bpo-46528@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46528}: Replace several stack manipulation instructions (@code{DUP_TOP},
@code{DUP_TOP_TWO}, @code{ROT_TWO}, @code{ROT_THREE}, @code{ROT_FOUR}, and @code{ROT_N})
with new @ref{916,,COPY} and @ref{917,,SWAP} instructions.

@item 
bpo-46329@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46329}: Use two or three bytecodes to implement most calls.

Calls without named arguments are implemented as a sequence of two
instructions: @code{PRECALL; CALL}. Calls with named arguments are
implemented as a sequence of three instructions: @code{PRECALL; KW_NAMES;
CALL}. There are two different @code{PRECALL} instructions:
@code{PRECALL_FUNTION} and @code{PRECALL_METHOD}. The latter pairs with
@code{LOAD_METHOD}.

This partition into pre-call and call allows better specialization, and
thus better performance ultimately.

There is no change in semantics.

@item 
bpo-46503@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46503}: Fix an assert when parsing some invalid N escape sequences in
f-strings.

@item 
bpo-46431@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46431}: Improve error message on invalid calls to
@code{BaseExceptionGroup.__new__()}.

@item 
bpo-46476@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46476}: Fix memory leak in code objects generated by deepfreeze. Patch
by Kumar Aditya.

@item 
bpo-46481@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46481}: Speed up calls to @code{weakref.ref.__call__()} by using the
@geindex Python 향상 제안; PEP 590
PEP 590@footnote{https://peps.python.org/pep-0590/} @code{vectorcall} calling convention. Patch by Donghee Na.

@item 
bpo-46417@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46417}: Fix a race condition on setting a type @code{__bases__} attribute:
the internal function @code{add_subclass()} now gets the
@code{PyTypeObject.tp_subclasses} member after calling
@ref{1be4,,PyWeakref_NewRef()} which can trigger a garbage collection which
can indirectly modify @code{PyTypeObject.tp_subclasses}. Patch by Victor
Stinner.

@item 
bpo-46417@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46417}: @code{python -X showrefcount} now shows the total reference count
after clearing and destroyed the main Python interpreter. Previously, it
was shown before. Patch by Victor Stinner.

@item 
bpo-43683@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43683}: Add ASYNC_GEN_WRAP opcode to wrap the value to be yielded in
async generators. Removes the need to special case async generators in the
@code{YIELD_VALUE} instruction.

@item 
bpo-46407@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46407}: Optimize some modulo operations in @code{Objects/longobject.c}.
Patch by Jeremiah Vivian.

@item 
bpo-46409@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46409}: Add new @code{RETURN_GENERATOR} bytecode to make generators.
Simplifies calling Python functions in the VM, as they no longer any need
to special case generator functions.

Also add @code{JUMP_NO_INTERRUPT} bytecode that acts like @code{JUMP_ABSOLUTE},
but does not check for interrupts.

@item 
bpo-46406@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46406}: The integer division @code{//} implementation has been optimized
to better let the compiler understand its constraints. It can be 20%
faster on the amd64 platform when dividing an int by a value smaller than
@code{2**30}.
@end itemize

@node Library<97>,Core and Builtins<95>,Core and Builtins<94>,Python 3 11 0 alpha 5
@anchor{whatsnew/changelog id438}@anchor{1be5}
@subsubsection Library



@itemize -

@item 
bpo-46383@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46383}: Fix invalid signature of @code{_zoneinfo}’s @code{module_free}
function to resolve a crash on wasm32-emscripten platform.
@end itemize

@node Core and Builtins<95>,Library<98>,Library<97>,Python 3 11 0 alpha 5
@anchor{whatsnew/changelog id439}@anchor{1be6}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-46361@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46361}: Ensure that “small” integers created by @ref{1be7,,int.from_bytes()}
and @ref{1fe,,decimal.Decimal} are properly cached.

@item 
bpo-46161@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46161}: Fix the class building error when the arguments are constants
and CALL_FUNCTION_EX is used.

@item 
bpo-46028@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46028}: Fixes calculation of @code{sys._base_executable} when inside a
virtual environment that uses symlinks with different binary names than
the base environment provides.

@item 
bpo-46091@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46091}: Correctly calculate indentation levels for lines with
whitespace character that are ended by line continuation characters. Patch
by Pablo Galindo
@end itemize

@node Library<98>,Build<38>,Core and Builtins<95>,Python 3 11 0 alpha 5
@anchor{whatsnew/changelog id440}@anchor{1be8}
@subsubsection Library



@itemize -

@item 
bpo-30512@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30512}: Add CAN Socket support for NetBSD.
@end itemize

@node Build<38>,Core and Builtins<96>,Library<98>,Python 3 11 0 alpha 5
@anchor{whatsnew/changelog id441}@anchor{1be9}
@subsubsection Build



@itemize -

@item 
bpo-46045@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46045}: Do not use POSIX semaphores on NetBSD
@end itemize

@node Core and Builtins<96>,Library<99>,Build<38>,Python 3 11 0 alpha 5
@anchor{whatsnew/changelog id442}@anchor{1bea}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-44024@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44024}: Improve the @ref{198,,TypeError} message for non-string second
arguments passed to the built-in functions @ref{dc9,,getattr()} and
@ref{6f8,,hasattr()}. Patch by Géry Ogam.
@end itemize

@node Library<99>,Documentation<32>,Core and Builtins<96>,Python 3 11 0 alpha 5
@anchor{whatsnew/changelog id443}@anchor{1beb}
@subsubsection Library



@itemize -

@item 
bpo-46624@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46624}: Restore support for non-integer arguments of
@ref{a6b,,random.randrange()} and @ref{1434,,random.randint()}.

@item 
bpo-46591@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46591}: Make the IDLE doc URL on the About IDLE dialog clickable.

@item 
bpo-46565@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46565}: Remove loop variables that are leaking into modules’
namespaces.

@item 
bpo-46553@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46553}: In @ref{8bf,,typing.get_type_hints()}, support evaluating bare
stringified @code{ClassVar} annotations. Patch by Gregory Beauregard.

@item 
bpo-46544@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46544}: Don’t leak @code{x} & @code{uspace} intermediate vars in
@ref{11cc,,textwrap.TextWrapper}.

@item 
bpo-46487@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46487}: Add the @code{get_write_buffer_limits} method to
@code{asyncio.transports.WriteTransport} and to the SSL transport.

@item 
bpo-45173@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45173}: Note the configparser deprecations will be removed in Python
3.12.

@item 
bpo-45162@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45162}: The deprecated @ref{10c,,unittest} APIs removed in 3.11a1 have been
temporarily restored to be removed in 3.12 while cleanups in external
projects go in.

@item 
bpo-46539@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46539}: In @ref{8bf,,typing.get_type_hints()}, support evaluating
stringified @code{ClassVar} and @code{Final} annotations inside @code{Annotated}.
Patch by Gregory Beauregard.

@item 
bpo-46510@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46510}: Add missing test for @ref{ce9,,types.TracebackType} and
@ref{1bec,,types.FrameType}. Calculate them directly from the caught
exception without calling @ref{899,,sys.exc_info()}.

@item 
bpo-46491@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46491}: Allow @ref{b37,,typing.Annotated} to wrap @ref{56d,,typing.Final} and
@ref{56c,,typing.ClassVar}. Patch by Gregory Beauregard.

@item 
bpo-46483@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46483}: Remove @ref{942,,__class_getitem__()} from
@ref{6cc,,pathlib.PurePath} as this class was not supposed to be generic.

@item 
bpo-46436@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46436}: Fix command-line option @code{-d}/@code{--directory} in module
@ref{76,,http.server} which is ignored when combined with command-line option
@code{--cgi}. Patch by Géry Ogam.

@item 
bpo-41403@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41403}: Make @code{mock.patch()} raise a @ref{198,,TypeError} with a
relevant error message on invalid arg. Previously it allowed a cryptic
@ref{5ee,,AttributeError} to escape.

@item 
bpo-46474@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46474}: In @code{importlib.metadata.EntryPoint.pattern}, avoid potential
REDoS by limiting ambiguity in consecutive whitespace.

@item 
bpo-46474@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46474}: Removed private method from @code{importlib.metadata.Path}. Sync
with importlib_metadata 4.10.0.

@item 
bpo-46470@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46470}: Remove unused branch from @code{typing._remove_dups_flatten}

@item 
bpo-46469@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46469}: @ref{b,,asyncio} generic classes now return
@ref{9ec,,types.GenericAlias} in @code{__class_getitem__} instead of the same
class.

@item 
bpo-41906@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41906}: Support passing filter instances in the @code{filters} values of
@code{handlers} and @code{loggers} in the dictionary passed to
@ref{13b5,,logging.config.dictConfig()}.

@item 
bpo-46422@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46422}: Use @code{dis.Positions} in @code{dis.Instruction} instead of a
regular @code{tuple}.

@item 
bpo-46434@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46434}: @ref{aa,,pdb} now gracefully handles @code{help} when
@ref{1bed,,__doc__} is missing, for example when run with pregenerated
optimized @code{.pyc} files.

@item 
bpo-43869@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43869}: Python uses the same time Epoch on all platforms. Add an
explicit unit test to ensure that it’s the case. Patch by Victor Stinner.

@item 
bpo-46414@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46414}: Add @ref{8b8,,typing.reveal_type()}. Patch by Jelle Zijlstra.

@item 
bpo-40280@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40280}: @ref{dc,,subprocess} now imports Windows-specific imports when
@code{msvcrt} module is available, and POSIX-specific imports on all other
platforms. This gives a clean exception when @code{_posixsubprocess} is not
available (e.g. Emscripten browser target).

@item 
bpo-40066@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40066}: @code{IntEnum}, @code{IntFlag}, and @code{StrEnum} use the mixed-in type
for their @code{str()} and @code{format()} output.

@item 
bpo-46316@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46316}: Optimize @ref{26e,,pathlib.Path.iterdir()} by removing an
unnecessary check for special entries.

@item 
bpo-29688@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29688}: Document @ref{1a26,,pathlib.Path.absolute()} (which has always
existed).

@item 
bpo-43012@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43012}: The pathlib module’s obsolete and internal @code{_Accessor} class
has been removed to prepare the terrain for upcoming enhancements to the
module.

@item 
bpo-46258@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46258}: Speed up @ref{bf7,,math.isqrt()} for small positive integers by
replacing two division steps with a lookup table.

@item 
bpo-46242@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46242}: Improve error message when creating a new @ref{841,,enum.Enum}
type subclassing an existing @code{Enum} with @code{_member_names_} using
@code{enum.Enum.__call__()}.

@item 
bpo-43118@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43118}: Fix a bug in @ref{22f,,inspect.signature()} that was causing it to
fail on some subclasses of classes with a @code{__text_signature__}
referencing module globals. Patch by Weipeng Hong.

@item 
bpo-26552@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26552}: Fixed case where failing @ref{e70,,asyncio.ensure_future()} did not
close the coroutine. Patch by Kumar Aditya.

@item 
bpo-21987@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21987}: Fix an issue with @ref{1bee,,tarfile.TarFile.getmember()} getting a
directory name with a trailing slash.

@item 
bpo-46124@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46124}: Update @ref{13a,,zoneinfo} to rely on importlib.resources
traversable API.

@item 
bpo-46103@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46103}: Now @ref{1bef,,inspect.getmembers()} only gets @code{__bases__}
attribute from class type. Patch by Weipeng Hong.

@item 
bpo-46080@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46080}: Fix exception in argparse help text generation if a
@ref{1bf0,,argparse.BooleanOptionalAction} argument’s default is
@code{argparse.SUPPRESS} and it has @code{help} specified.  Patch by Felix
Fontein.

@item 
bpo-44791@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44791}: Fix substitution of @ref{488,,ParamSpec} in
@ref{9c7,,Concatenate} with different parameter expressions.
Substitution with a list of types returns now a tuple of types.
Substitution with @code{Concatenate} returns now a @code{Concatenate} with
concatenated lists of arguments.
@end itemize

@node Documentation<32>,Tests<32>,Library<99>,Python 3 11 0 alpha 5
@anchor{whatsnew/changelog id444}@anchor{1bf1}
@subsubsection Documentation



@itemize -

@item 
bpo-46463@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46463}: Fixes @code{escape4chm.py} script used when building the CHM
documentation file
@end itemize

@node Tests<32>,Build<39>,Documentation<32>,Python 3 11 0 alpha 5
@anchor{whatsnew/changelog id445}@anchor{1bf2}
@subsubsection Tests



@itemize -

@item 
bpo-43478@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43478}: Mocks can no longer be provided as the specs for other Mocks.
As a result, an already-mocked object cannot be passed to @code{mock.Mock()}.
This can uncover bugs in tests since these Mock-derived Mocks will always
pass certain tests (e.g. isinstance) and builtin assert functions (e.g.
assert_called_once_with) will unconditionally pass.

@item 
bpo-46616@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46616}: Ensures @code{test_importlib.test_windows} cleans up registry keys
after completion.

@item 
bpo-44359@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44359}: test_ftplib now silently ignores socket errors to prevent
logging unhandled threading exceptions. Patch by Victor Stinner.

@item 
bpo-46600@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46600}: Fix test_gdb.test_pycfunction() for Python built with @code{clang
-Og}. Tolerate inlined functions in the gdb traceback. Patch by Victor
Stinner.

@item 
bpo-46542@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46542}: Fix a Python crash in test_lib2to3 when using Python built in
debug mode: limit the recursion limit. Patch by Victor Stinner.

@item 
bpo-46576@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46576}: test_peg_generator now disables compiler optimization when
testing compilation of its own C extensions to significantly speed up the
testing on non-debug builds of CPython.

@item 
bpo-46542@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46542}: Fix @code{test_json} tests checking for @ref{f67,,RecursionError}:
modify these tests to use @code{support.infinite_recursion()}. Patch by
Victor Stinner.

@item 
bpo-13886@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13886}: Skip test_builtin PTY tests on non-ASCII characters if the
readline module is loaded. The readline module changes input() behavior,
but test_builtin is not intended to test the readline module. Patch by
Victor Stinner.

@item 
bpo-40280@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40280}: Add @code{test.support.requires_fork()} decorators to mark tests
that require a working @ref{4b6,,os.fork()}.

@item 
bpo-40280@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40280}: Add @code{test.support.requires_subprocess()} decorator to mark
tests which require working @ref{dc,,subprocess} module or @code{os.spawn*}. The
wasm32-emscripten platform has no support for processes.

@item 
bpo-46126@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46126}: Disable ‘descriptions’ when running tests internally.
@end itemize

@node Build<39>,Windows<33>,Tests<32>,Python 3 11 0 alpha 5
@anchor{whatsnew/changelog id446}@anchor{1bf3}
@subsubsection Build



@itemize -

@item 
bpo-46602@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46602}: Tidied up configure.ac so that conftest.c is truncated rather
than appended. This assists in the case where the ‘rm’ of conftest.c fails
to happen between tests.  Downstream issues such as a clobbered SOABI can
result.

@item 
bpo-46600@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46600}: Fix the test checking if the C compiler supports @code{-Og} option
in the @code{./configure} script to also use @code{-Og} on clang which supports
it. Patch by Victor Stinner.

@item 
bpo-38472@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38472}: Fix GCC detection in setup.py when cross-compiling. The C
compiler is now run with LC_ALL=C. Previously, the detection failed with a
German locale.

@item 
bpo-46513@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46513}: @code{configure} no longer uses @code{AC_C_CHAR_UNSIGNED}
macro and @code{pyconfig.h} no longer defines reserved symbol
@code{__CHAR_UNSIGNED__}.

@item 
bpo-46471@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46471}: Use global singletons for single byte bytes objects in
deepfreeze.

@item 
bpo-46443@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46443}: Deepfreeze now uses cached small integers as it saves some
space for common small integers.

@item 
bpo-46429@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46429}: Merge all deep-frozen files into one for space savings. Patch
by Kumar Aditya.

@item 
bpo-45569@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45569}: The build now defaults to using 30-bit digits for Python
integers. Previously either 15-bit or 30-bit digits would be selected,
depending on the platform. 15-bit digits may still be selected using the
@code{--enable-big-digits=15} option to the @code{configure} script, or by
defining @code{PYLONG_BITS_IN_DIGIT} in @code{pyconfig.h}.

@item 
bpo-45925@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45925}: Update Windows installer to use SQLite 3.37.2.

@item 
bpo-43112@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43112}: Detect musl libc as a separate SOABI (tagged as
@code{linux-musl}).
@end itemize

@node Windows<33>,macOS<23>,Build<39>,Python 3 11 0 alpha 5
@anchor{whatsnew/changelog id447}@anchor{1bf4}
@subsubsection Windows



@itemize -

@item 
bpo-33125@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33125}: The traditional EXE/MSI based installer for Windows is now
available for ARM64

@item 
bpo-46362@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46362}: os.path.abspath(“C:CON”) is now fixed to return “\.CON”, not
the same path. The regression was true of all legacy DOS devices such as
COM1, LPT1, or NUL.

@item 
bpo-44934@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44934}: The installer now offers a command-line only option to add the
installation directory to the end of 
@geindex PATH
@geindex 환경 변수; PATH
@code{PATH} instead of at the
start.
@end itemize

@node macOS<23>,IDLE<17>,Windows<33>,Python 3 11 0 alpha 5
@anchor{whatsnew/changelog id448}@anchor{1bf5}
@subsubsection macOS



@itemize -

@item 
bpo-45925@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45925}: Update macOS installer to SQLite 3.37.2.
@end itemize

@node IDLE<17>,C API<34>,macOS<23>,Python 3 11 0 alpha 5
@anchor{whatsnew/changelog id449}@anchor{1bf6}
@subsubsection IDLE



@itemize -

@item 
bpo-45296@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45296}: Clarify close, quit, and exit in IDLE.  In the File menu,
‘Close’ and ‘Exit’ are now ‘Close Window’ (the current one) and ‘Exit’ is
now ‘Exit IDLE’ (by closing all windows).  In Shell, ‘quit()’ and ‘exit()’
mean ‘close Shell’. If there are no other windows, this also exits IDLE.
@end itemize

@node C API<34>,,IDLE<17>,Python 3 11 0 alpha 5
@anchor{whatsnew/changelog id450}@anchor{1bf7}
@subsubsection C API



@itemize -

@item 
bpo-40170@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40170}: Remove the @code{PyHeapType_GET_MEMBERS()} macro. It was exposed
in the public C API by mistake, it must only be used by Python internally.
Use the @code{PyTypeObject.tp_members} member instead. Patch by Victor
Stinner.

@item 
bpo-40170@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40170}: Move _Py_GetAllocatedBlocks() and _PyObject_DebugMallocStats()
private functions to the internal C API. Patch by Victor Stinner.

@item 
bpo-46433@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46433}: The internal function _PyType_GetModuleByDef now correctly
handles inheritance patterns involving static types.

@item 
bpo-45459@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45459}: @ref{95b,,Py_buffer} and various @code{Py_buffer} related functions
are now part of the limited API and stable ABI.

@item 
bpo-14916@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14916}: Fixed bug in the tokenizer that prevented
@code{PyRun_InteractiveOne} from parsing from the provided FD.
@end itemize

@node Python 3 11 0 alpha 4,Python 3 11 0 alpha 3,Python 3 11 0 alpha 5,Changelog
@anchor{whatsnew/changelog python-3-11-0-alpha-4}@anchor{1bf8}
@subsection Python 3.11.0 alpha 4


`Release date: 2022-01-13'

@menu
* Core and Builtins: Core and Builtins<97>. 
* Library: Library<100>. 
* Core and Builtins: Core and Builtins<98>. 
* Library: Library<101>. 
* Core and Builtins: Core and Builtins<99>. 
* Library: Library<102>. 
* Core and Builtins: Core and Builtins<100>. 
* Library: Library<103>. 
* Documentation: Documentation<33>. 
* Tests: Tests<33>. 
* Build: Build<40>. 
* Windows: Windows<34>. 
* macOS: macOS<24>. 
* C API: C API<35>. 

@end menu

@node Core and Builtins<97>,Library<100>,,Python 3 11 0 alpha 4
@anchor{whatsnew/changelog id451}@anchor{1bf9}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-46070@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46070}: @ref{1847,,Py_EndInterpreter()} now explicitly untracks all objects
currently tracked by the GC. Previously, if an object was used later by
another interpreter, calling @ref{170a,,PyObject_GC_UnTrack()} on the object
crashed if the previous or the next object of the @code{PyGC_Head}
structure became a dangling pointer. Patch by Victor Stinner.

@item 
bpo-46347@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46347}: Fix memory leak in PyEval_EvalCodeEx.

@item 
bpo-46339@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46339}: Fix a crash in the parser when retrieving the error text for
multi-line f-strings expressions that do not start in the first line of
the string. Patch by Pablo Galindo

@item 
bpo-46331@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46331}: Do not set line number of instruction storing doc-string. Fixes
regression introduced in 3.11 alpha.

@item 
bpo-46314@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46314}: Remove spurious “call” event when creating a lambda function
that was accidentally introduced in 3.11a4.

@item 
bpo-46289@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46289}: ASDL declaration of @code{FormattedValue} has changed to reflect
@code{conversion} field is not optional.

@item 
bpo-46297@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46297}: Fixed an interpreter crash on bootup with multiple PythonPaths
set in the Windows registry. Patch by Derzsi Dániel.

@item 
bpo-46237@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46237}: Fix the line number of tokenizer errors inside f-strings. Patch
by Pablo Galindo.

@item 
bpo-46263@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46263}: We always expect the “use_frozen_modules” config to be set, now
that getpath.c was rewritten in pure Python and the logic improved.

@item 
bpo-46006@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46006}: Fix a regression when a type method like @code{__init__()} is
modified in a subinterpreter. Fix a regression in
@code{_PyUnicode_EqualToASCIIId()} and type @code{update_slot()}. Revert the
change which made the Unicode dictionary of interned strings compatible
with subinterpreters: the internal interned dictionary is shared again by
all interpreters. Patch by Victor Stinner.

@item 
bpo-45923@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45923}: Add RESUME opcode. This is a logical no-op. It is emitted by
the compiler anywhere a Python function can be entered. It is used by the
interpreter to perform tracing and optimizer checks.
@end itemize

@node Library<100>,Core and Builtins<98>,Core and Builtins<97>,Python 3 11 0 alpha 4
@anchor{whatsnew/changelog id452}@anchor{1bfa}
@subsubsection Library



@itemize -

@item 
bpo-46208@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46208}: Fix the regression of os.path.normpath(“A/../../B”) not
returning expected “../B” but “B”.
@end itemize

@node Core and Builtins<98>,Library<101>,Library<100>,Python 3 11 0 alpha 4
@anchor{whatsnew/changelog id453}@anchor{1bfb}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-46240@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46240}: Correct the error message for unclosed parentheses when the
tokenizer doesn’t reach the end of the source when the error is reported.
Patch by Pablo Galindo

@item 
bpo-46009@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46009}: Remove the @code{GEN_START} opcode.

@item 
bpo-46235@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46235}: Certain sequence multiplication operations like @code{[0] * 1_000}
are now faster due to reference-counting optimizations. Patch by Dennis
Sweeney.

@item 
bpo-46221@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46221}: @code{PREP_RERAISE_STAR} no longer pushes @code{lasti} to the
stack.

@item 
bpo-46202@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46202}: Remove @code{POP_EXCEPT_AND_RERAISE} and replace it by an
equivalent sequence of other opcodes.
@end itemize

@node Library<101>,Core and Builtins<99>,Core and Builtins<98>,Python 3 11 0 alpha 4
@anchor{whatsnew/changelog id454}@anchor{1bfc}
@subsubsection Library



@itemize -

@item 
bpo-46085@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46085}: Fix iterator cache mechanism of @code{OrderedDict}.
@end itemize

@node Core and Builtins<99>,Library<102>,Library<101>,Python 3 11 0 alpha 4
@anchor{whatsnew/changelog id455}@anchor{1bfd}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-46055@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46055}: Speed up shifting operation involving integers less than
@ref{1bfe,,PyLong_BASE}. Patch by Xinhang Xu.

@item 
bpo-46110@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46110}: Add a maximum recursion check to the PEG parser to avoid stack
overflow. Patch by Pablo Galindo

@item 
bpo-46107@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46107}: Fix bug where @code{ExceptionGroup.split()} and
@code{ExceptionGroup.subgroup()} did not copy the exception group’s
@code{__note__} field to the parts.

@item 
bpo-45711@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45711}: The interpreter state’s representation of handled exceptions
(a.k.a exc_info, or _PyErr_StackItem) now has only the @code{exc_value}
field, @code{exc_type} and @code{exc_traceback} have been removed as their
values can be derived from @code{exc_value}.

@item 
bpo-44525@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44525}: Replace the four call bytecode instructions which one pre-call
instruction and two call instructions.

Removes @code{CALL_FUNCTION}, @code{CALL_FUNCTION_KW}, @code{CALL_METHOD} and
@code{CALL_METHOD_KW}.

Adds @code{CALL_NO_KW} and @code{CALL_KW} call instructions, and
@code{PRECALL_METHOD} prefix for pairing with @code{LOAD_METHOD}.

@item 
bpo-46039@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46039}: Remove the @code{YIELD_FROM} instruction and replace it with the
@code{SEND} instruction which performs the same operation, but without the
loop.

@item 
bpo-45635@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45635}: The code called from @code{_PyErr_Display()} was refactored
to improve error handling. It now exits immediately upon an unrecoverable
error.

@item 
bpo-46054@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46054}: Fix parser error when parsing non-utf8 characters in source
files. Patch by Pablo Galindo.

@item 
bpo-46042@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46042}: Improve the location of the caret in @ref{18e,,SyntaxError}
exceptions emitted by the symbol table. Patch by Pablo Galindo.

@item 
bpo-46049@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46049}: Ensure @code{._pth} files work as intended on platforms other
than Windows.

@item 
bpo-46048@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46048}: Fixes parsing of @code{._pth} files on startup so that
single-character paths are correctly read.

@item 
bpo-37971@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37971}: Fix a bug where the line numbers given in a traceback when a
decorator application raised an exception were wrong.

@item 
bpo-46031@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46031}: Add @ref{1b7e,,POP_JUMP_IF_NOT_NONE} and
@ref{1b7d,,POP_JUMP_IF_NONE} opcodes to speed up conditional jumps.

@item 
bpo-45654@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45654}: Deepfreeze @ref{c3,,runpy}, patch by Kumar Aditya.

@item 
bpo-46025@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46025}: Fix a crash in the @ref{d,,atexit} module involving functions
that unregister themselves before raising exceptions. Patch by Pablo
Galindo.
@end itemize

@node Library<102>,Core and Builtins<100>,Core and Builtins<99>,Python 3 11 0 alpha 4
@anchor{whatsnew/changelog id456}@anchor{1bff}
@subsubsection Library



@itemize -

@item 
bpo-46000@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46000}: Improve compatibility of the @ref{2f,,curses} module with NetBSD
curses.
@end itemize

@node Core and Builtins<100>,Library<103>,Library<102>,Python 3 11 0 alpha 4
@anchor{whatsnew/changelog id457}@anchor{1c00}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-44525@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44525}: Specialize the CALL_FUNCTION instruction for calls to builtin
types with a single argument. Speeds up @code{range(x)}, @code{list(x)}, and
specifically @code{type(obj)}.

@item 
bpo-42918@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42918}: Fix bug where the built-in @ref{4b2,,compile()} function did not
always raise a @ref{18e,,SyntaxError} when passed multiple statements in
‘single’ mode. Patch by Weipeng Hong.

@item 
bpo-45953@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45953}: The main interpreter in _PyRuntimeState.interpreters is now
statically allocated (as part of _PyRuntime).  Likewise for the initial
thread state of each interpreter.  This means less allocation during
runtime init, as well as better memory locality for these key state
objects.

@item 
bpo-45292@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45292}: Complete the 
@geindex Python 향상 제안; PEP 654
PEP 654@footnote{https://peps.python.org/pep-0654/} implementation: add @code{except*}.

@item 
bpo-43413@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43413}: Revert changes in @code{set.__init__}. Subclass of @ref{184,,set}
needs to define a @code{__init__()} method if it defines a @code{__new__()}
method with additional keyword parameters.

@item 
bpo-43931@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43931}: Added the @ref{381,,Py_Version} constant which bears the same
value as @ref{382,,PY_VERSION_HEX}. Patch by Gabriele N. Tornetta.
@end itemize

@node Library<103>,Documentation<33>,Core and Builtins<100>,Python 3 11 0 alpha 4
@anchor{whatsnew/changelog id458}@anchor{1c01}
@subsubsection Library



@itemize -

@item 
bpo-46342@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46342}: The @code{@@typing.final} decorator now sets the @code{__final__}
attribute on the decorated object to allow runtime introspection. Patch by
Jelle Zijlstra.

@item 
bpo-46328@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46328}: Added the @ref{89a,,sys.exception()} method which returns the active
exception instance.

@item 
bpo-46307@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46307}: Add @ref{895,,string.Template.is_valid()} and
@ref{894,,string.Template.get_identifiers()} methods.

@item 
bpo-46306@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46306}: Assume that @ref{32f,,types.CodeType} always has
@code{types.CodeType.co_firstlineno} in @ref{3e,,doctest}.

@item 
bpo-40479@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40479}: Fix @ref{6c,,hashlib} `usedforsecurity' option to work correctly
with OpenSSL 3.0.0 in FIPS mode.

@item 
bpo-46070@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46070}: Fix possible segfault when importing the @ref{b,,asyncio} module
from different sub-interpreters in parallel. Patch by Erlend E. Aasland.

@item 
bpo-46244@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46244}: Removed @code{__slots__} from @ref{488,,typing.ParamSpec} and
@ref{487,,typing.TypeVar}. They served no purpose. Patch by Arie Bovenberg.

@item 
bpo-46278@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46278}: Reflect @code{context} argument in @code{AbstractEventLoop.call_*()}
methods. Loop implementations already support it.

@item 
bpo-46269@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46269}: Remove special-casing of @code{__new__} in
@ref{1c02,,enum.Enum.__dir__()}.

@item 
bpo-46266@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46266}: Improve day constants in @ref{15,,calendar}.

Now all constants (@code{MONDAY} … @code{SUNDAY}) are documented, tested, and
added to @code{__all__}.

@item 
bpo-46257@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46257}: Optimized the mean, variance, and stdev functions in the
statistics module. If the input is an iterator, it is consumed in a single
pass rather than eating memory by conversion to a list.  The single pass
algorithm is about twice as fast as the previous two pass code.

@item 
bpo-41011@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41011}: Added two new variables to `pyvenv.cfg' which is generated by
@ref{117,,venv} module: `executable' for the executable and `command' for the
command line used to create the environment.

@item 
bpo-46239@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46239}: Improve error message when importing
@code{asyncio.windows_events} on non-Windows.

@item 
bpo-46238@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46238}: Reuse @code{_winapi} constants in @code{asyncio.windows_events}.

@item 
bpo-46222@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46222}: Adding @code{SF_NOCACHE} sendfile constant for FreeBSD for the
posixmodule.

@item 
bpo-37295@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37295}: Add fast path for @code{0 <= k <= n <= 67} for @ref{8de,,math.comb()}.

@item 
bpo-46176@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46176}: Adding the @code{MAP_STACK} constant for the mmap module.

@item 
bpo-43424@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43424}: Deprecate @code{webbrowser.MacOSXOSAScript._name} and use
@code{name} instead.

@item 
bpo-45321@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45321}: Added missing error codes to module
@code{xml.parsers.expat.errors}.

@item 
bpo-46125@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46125}: Refactor tests to test traversable API directly. Includes
changes from importlib 5.4.0.

@item 
bpo-46118@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46118}: Moved importlib.resources and its related functionality to a
package.

@item 
bpo-37578@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37578}: Add `include_hidden' parameter to @ref{59f,,glob()} and
@ref{a08,,iglob()} to match hidden files and directories when using
special characters like @code{*}, @code{**}, @code{?} and @code{[]}.

@item 
bpo-20369@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20369}: @ref{1c03,,concurrent.futures.wait()} no longer blocks forever when
given duplicate Futures. Patch by Kumar Aditya.

@item 
bpo-46105@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46105}: Honor spec when generating requirement specs with urls and
extras (importlib_metadata 4.8.3).

@item 
bpo-44893@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44893}: EntryPoint objects are no longer tuples. Recommended means to
access is by attribute (‘.name’, ‘.group’) or accessor (‘.load()’). Access
by index is deprecated and will raise deprecation warning.

@item 
bpo-22815@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22815}: Print unexpected successes together with failures and errors in
summary in @ref{753,,unittest.TextTestResult}.

@item 
bpo-22047@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22047}: Calling @code{add_argument_group()} on an argument group is
deprecated. Calling @code{add_argument_group()} or
@code{add_mutually_exclusive_group()} on a mutually exclusive group is
deprecated.

These features were never supported and do not always work correctly. The
functions exist on the API by accident through inheritance and will be
removed in the future.

@item 
bpo-26952@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26952}: @ref{7,,argparse} raises @ref{2ec,,ValueError} with clear message
when trying to render usage for an empty mutually exclusive group.
Previously it raised a cryptic @ref{173a,,IndexError}.

@item 
bpo-45615@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45615}: Functions in the @ref{104,,traceback} module raise @ref{198,,TypeError}
rather than @ref{5ee,,AttributeError} when an exception argument is not of
type @ref{7d6,,BaseException}.

@item 
bpo-16594@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16594}: Add allow allow_reuse_port flag in socketserver.

@item 
bpo-27718@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27718}: Fix help for the @ref{cb,,signal} module. Some functions (e.g.
@code{signal()} and @code{getsignal()}) were omitted.

@item 
bpo-46032@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46032}: The @code{registry()} method of @ref{84a,,functools.singledispatch()}
functions checks now the first argument or the first parameter annotation
and raises a TypeError if it is not supported. Previously unsupported
“types” were ignored (e.g. @code{typing.List[int]}) or caused an error at
calling time (e.g. @code{list[int]}).

@item 
bpo-46014@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46014}: Add ability to use @code{typing.Union} and @code{types.UnionType} as
dispatch argument to @code{functools.singledispatch}. Patch provided by Yurii
Karabas.

@item 
bpo-27062@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27062}: Add @code{__all__} to @ref{82,,inspect}, patch by Kumar Aditya.

@item 
bpo-46018@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46018}: Ensure that @ref{13f1,,math.expm1()} does not raise on underflow.

@item 
bpo-46016@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46016}: Adding @code{F_DUP2FD} and @code{F_DUP2FD_CLOEXEC}
constants from FreeBSD into the @ref{5d,,fcntl} module.

@item 
bpo-45755@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45755}: @ref{10a,,typing} generic aliases now reveal the class attributes
of the original generic class when passed to @code{dir()}. This was the
behavior up to Python 3.6, but was changed in 3.7-3.9.

@item 
bpo-45874@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45874}: The empty query string, consisting of no query arguments, is
now handled correctly in @code{urllib.parse.parse_qsl}. This caused problems
before when strict parsing was enabled.

@item 
bpo-44674@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44674}: Change how dataclasses disallows mutable default values.  It
used to use a list of known types (list, dict, set).  Now it disallows
unhashable objects to be defaults.  It’s using unhashability as a proxy
for mutability.  Patch by Eric V. Smith, idea by Raymond Hettinger.

@item 
bpo-23882@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23882}: Remove namespace package (PEP 420) support from unittest
discovery. It was introduced in Python 3.4 but has been broken since
Python 3.7.

@item 
bpo-25066@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25066}: Added a @code{__repr__()} method to
@ref{1c04,,multiprocessing.Event} objects, patch by Kumar Aditya.

@item 
bpo-45643@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45643}: Added @ref{1c05,,signal.SIGSTKFLT} on platforms where this signal
is defined.

@item 
bpo-44092@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44092}: Fetch across rollback no longer raises
@ref{88c,,InterfaceError}. Instead we leave it to the SQLite library
to handle these cases. Patch by Erlend E. Aasland.

@item 
bpo-42413@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42413}: Replace @code{concurrent.futures.TimeoutError} and
@code{asyncio.TimeoutError} with builtin @ref{a36,,TimeoutError}, keep these
names as deprecated aliases.
@end itemize

@node Documentation<33>,Tests<33>,Library<103>,Python 3 11 0 alpha 4
@anchor{whatsnew/changelog id459}@anchor{1c06}
@subsubsection Documentation



@itemize -

@item 
bpo-46196@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46196}: Document method @ref{1c07,,cmd.Cmd.columnize()}.

@item 
bpo-46120@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46120}: State that @code{|} is preferred for readability over @code{Union} in
the @ref{10a,,typing} docs.

@item 
bpo-46109@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46109}: Extracted @code{importlib.resources} and
@code{importlib.resources.abc} documentation into separate files.

@item 
bpo-19737@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19737}: Update the documentation for the @ref{1c08,,globals()} function.
@end itemize

@node Tests<33>,Build<40>,Documentation<33>,Python 3 11 0 alpha 4
@anchor{whatsnew/changelog id460}@anchor{1c09}
@subsubsection Tests



@itemize -

@item 
bpo-46296@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46296}: Add a test case for @ref{5a,,enum} with @code{_use_args_ == True} and
@code{_member_type_ == object}.

@item 
bpo-46205@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46205}: Fix hang in runtest_mp due to race condition

@item 
bpo-46263@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46263}: Fix test_capi on FreeBSD 14-dev: instruct jemalloc to not fill
freed memory with junk byte.

@item 
bpo-46262@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46262}: Cover @code{ValueError} path in tests for
@code{enum.Flag._missing_()}.

@item 
bpo-46150@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46150}: Now @code{fakename} in
@code{test_pathlib.PosixPathTest.test_expanduser} is checked to be
non-existent.

@item 
bpo-46129@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46129}: Rewrite @code{asyncio.locks} tests with
@ref{361,,unittest.IsolatedAsyncioTestCase} usage.

@item 
bpo-23819@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23819}: Fixed @ref{b,,asyncio} tests in python optimized mode. Patch by
Kumar Aditya.

@item 
bpo-46114@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46114}: Fix test case for OpenSSL 3.0.1 version. OpenSSL 3.0 uses
@code{0xMNN00PP0L}.
@end itemize

@node Build<40>,Windows<34>,Tests<33>,Python 3 11 0 alpha 4
@anchor{whatsnew/changelog id461}@anchor{1c0a}
@subsubsection Build



@itemize -

@item 
bpo-44133@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44133}: When Python is configured with
@ref{a8e,,--without-static-libpython}, the Python static library
(libpython.a) is no longer built. Patch by Victor Stinner.

@item 
bpo-44133@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44133}: When Python is built without @ref{a63,,--enable-shared}, the
@code{python} program is now linked to object files, rather than being linked
to the Python static library (libpython.a), to make sure that all symbols
are exported. Previously, the linker omitted some symbols like the
@code{Py_FrozenMain()} function. Patch by Victor Stinner.

@item 
bpo-40280@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40280}: The @code{configure} script has a new option
@code{--with-emscripten-target} to select browser or node as Emscripten build
target.

@item 
bpo-46315@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46315}: Added and fixed @code{#ifdef HAVE_FEATURE} checks for
functionality that is not available on WASI platform.

@item 
bpo-45723@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45723}: Fixed a regression in @code{configure} check for
@ref{1193,,select.epoll()}.

@item 
bpo-46263@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46263}: @code{configure} no longer sets @code{MULTIARCH} on FreeBSD
platforms.

@item 
bpo-46106@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46106}: Updated OpenSSL to 1.1.1m in Windows builds, macOS installer
builds, and CI. Patch by Kumar Aditya.

@item 
bpo-46088@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46088}: Automatically detect or install bootstrap Python runtime when
building from Visual Studio.

@item 
bpo-46072@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46072}: Add a –with-pystats configure option to turn on internal
statistics gathering.

@item 
bpo-40280@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40280}: A new directory @code{Tools/wasm} contains WebAssembly-related
helpers like @code{config.site} override for wasm32-emscripten, wasm assets
generator to bundle the stdlib, and a README.

@item 
bpo-46023@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46023}: @code{makesetup} no longer builds extensions that have been
marked as `disabled'. This allows users to disable modules in
@code{Modules/Setup.local}.

@item 
bpo-45949@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45949}: Use pure Python @code{freeze_module} for all but importlib
bootstrap files. @code{--with-freeze-module} @code{configure} option is
no longer needed for cross builds.
@end itemize

@node Windows<34>,macOS<24>,Build<40>,Python 3 11 0 alpha 4
@anchor{whatsnew/changelog id462}@anchor{1c0b}
@subsubsection Windows



@itemize -

@item 
bpo-46217@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46217}: Removed parameter that is unsupported on Windows 8.1 and early
Windows 10 and may have caused build or runtime failures.
@end itemize

@node macOS<24>,C API<35>,Windows<34>,Python 3 11 0 alpha 4
@anchor{whatsnew/changelog id463}@anchor{1c0c}
@subsubsection macOS



@itemize -

@item 
bpo-40477@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40477}: The Python Launcher app for macOS now properly launches scripts
and, if necessary, the Terminal app when running on recent macOS releases.
@end itemize

@node C API<35>,,macOS<24>,Python 3 11 0 alpha 4
@anchor{whatsnew/changelog id464}@anchor{1c0d}
@subsubsection C API



@itemize -

@item 
bpo-46236@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46236}: Fix a bug in @ref{1b35,,PyFunction_GetAnnotations()} that caused it
to return a @code{tuple} instead of a @code{dict}.

@item 
bpo-46140@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46140}: @ref{95c,,PyBuffer_GetPointer()},
@ref{95f,,PyBuffer_FromContiguous()}, @ref{95e,,PyBuffer_ToContiguous()} and
@ref{964,,PyMemoryView_FromBuffer()} now take buffer info by @code{const
Py_buffer *} instead of @code{Py_buffer *}, as they do not need mutability.
@code{PyBuffer_FromContiguous()} also now takes the source buffer as
@code{const void *}, and similarly @code{PyBuffer_GetPointer()} takes the
strides as @code{const Py_ssize_t *}.

@item 
bpo-45855@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45855}: Document that the `no_block' argument to
@ref{1c0e,,PyCapsule_Import()} is a no-op now.

@item 
bpo-45855@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45855}: Replaced deprecated usage of
@ref{3db,,PyImport_ImportModuleNoBlock()} with
@ref{3dc,,PyImport_ImportModule()} in stdlib modules. Patch by Kumar Aditya.

@item 
bpo-46007@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46007}: The @code{PyUnicode_CHECK_INTERNED()} macro has been excluded
from the limited C API. It was never usable there, because it used
internal structures which are not available in the limited C API. Patch by
Victor Stinner.
@end itemize

@node Python 3 11 0 alpha 3,Python 3 11 0 alpha 2,Python 3 11 0 alpha 4,Changelog
@anchor{whatsnew/changelog python-3-11-0-alpha-3}@anchor{1c0f}
@subsection Python 3.11.0 alpha 3


`Release date: 2021-12-08'

@menu
* Core and Builtins: Core and Builtins<101>. 
* Library: Library<104>. 
* Core and Builtins: Core and Builtins<102>. 
* Library: Library<105>. 
* Documentation: Documentation<34>. 
* Tests: Tests<34>. 
* Build: Build<41>. 
* Windows: Windows<35>. 
* macOS: macOS<25>. 
* C API: C API<36>. 

@end menu

@node Core and Builtins<101>,Library<104>,,Python 3 11 0 alpha 3
@anchor{whatsnew/changelog id465}@anchor{1c10}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-46009@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46009}: Restore behavior from 3.9 and earlier when sending non-None to
newly started generator. In 3.9 this did not affect the state of the
generator. In 3.10.0 and 3.10.1 @code{gen_func().send(0)} is equivalent to
@code{gen_func().throw(TypeError(...)} which exhausts the generator. In
3.10.2 onward, the behavior has been reverted to that of 3.9.

@item 
bpo-46004@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46004}: Fix the @ref{18e,,SyntaxError} location for errors involving for
loops with invalid targets. Patch by Pablo Galindo

@item 
bpo-45711@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45711}: @code{_PyErr_ChainStackItem()} no longer normalizes
@code{exc_info} (including setting the traceback on the exception instance)
because @code{exc_info} is always normalized.

@item 
bpo-45607@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45607}: The @code{__note__} field was added to @ref{7d6,,BaseException}. It is
@code{None} by default but can be set to a string which is added to the
exception’s traceback.

@item 
bpo-45947@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45947}: Place pointers to dict and values immediately before GC header.
This reduces number of dependent memory loads to access either dict or
values from 3 to 1.

@item 
bpo-45915@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45915}: @code{is_valid_fd} now uses faster @code{fcntl(fd, F_GETFD)} on
Linux, macOS, and Windows.

@item 
bpo-44530@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44530}: Reverts a change to the @code{code.__new__} @ref{1c11,,audit event} from an earlier prerelease.

@item 
bpo-42268@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42268}: Fail the configure step if the selected compiler doesn’t
support memory sanitizer. Patch by Pablo Galindo

@item 
bpo-45711@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45711}: The three values of @code{exc_info} are now always consistent with
each other. In particular, the @code{type} and @code{traceback} fields are now
derived from the exception instance. This impacts the return values of
@ref{899,,sys.exc_info()} and @ref{975,,PyErr_GetExcInfo()} if the exception
instance is modified while the exception is handled, as well as
@ref{974,,PyErr_SetExcInfo()}, which now ignores the @code{type} and
@code{traceback} arguments provided to it.

@item 
bpo-45727@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45727}: Refine the custom syntax error that suggests that a comma may
be missing to trigger only when the expressions are detected between
parentheses or brackets. Patch by Pablo Galindo

@item 
bpo-45885@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45885}: Specialized the @code{COMPARE_OP} opcode using the PEP 659
machinery.

@item 
bpo-45786@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45786}: Allocate space for the interpreter frame in the frame object,
to avoid an additional allocation when the frame object outlives the frame
activation.
@end itemize

@node Library<104>,Core and Builtins<102>,Core and Builtins<101>,Python 3 11 0 alpha 3
@anchor{whatsnew/changelog id466}@anchor{1c12}
@subsubsection Library



@itemize -

@item 
bpo-45614@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45614}: Fix @ref{104,,traceback} display for exceptions with invalid module
name.
@end itemize

@node Core and Builtins<102>,Library<105>,Library<104>,Python 3 11 0 alpha 3
@anchor{whatsnew/changelog id467}@anchor{1c13}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-45813@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45813}: Fix crash when calling coro.cr_frame.clear() after coroutine
has been freed.

@item 
bpo-45811@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45811}: Improve the tokenizer errors when encountering invisible
control characters in the parser. Patch by Pablo Galindo

@item 
bpo-45848@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45848}: Allow the parser to obtain error lines directly from encoded
files. Patch by Pablo Galindo

@item 
bpo-45709@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45709}: Restore behavior from 3.10 when tracing an exception raised
within a with statement.

@item 
bpo-44525@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44525}: Adds new @ref{90c,,COPY_FREE_VARS} opcode, to make copying of
free variables from function to frame explicit. Helps optimization of
calls to Python function.

@item 
bpo-45829@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45829}: Specialize @code{BINARY_SUBSCR} for classes with a
@code{__getitem__} method implemented in Python

@item 
bpo-45826@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45826}: Fixed a crash when calling @code{.with_traceback(None)} on
@code{NameError}. This occurs internally in
@code{unittest.TestCase.assertRaises()}.

@item 
bpo-45822@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45822}: Fixed a bug in the parser that was causing it to not respect
@geindex Python 향상 제안; PEP 263
PEP 263@footnote{https://peps.python.org/pep-0263/} coding cookies when no flags are provided. Patch by Pablo
Galindo

@item 
bpo-45820@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45820}: Fix a segfault when the parser fails without reading any input.
Patch by Pablo Galindo

@item 
bpo-45636@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45636}: Simplify the implementation of @ref{366,,BINARY_OP} by indexing
into an array of function pointers (rather than switching on the oparg).

@item 
bpo-42540@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42540}: Fix crash when @ref{4b6,,os.fork()} is called with an active
non-default memory allocator.

@item 
bpo-45738@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45738}: Fix computation of error location for invalid continuation
characters in the parser. Patch by Pablo Galindo.

@item 
bpo-45636@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45636}: Remove an existing “fast path” for old-style string formatting,
since it no longer appears to have any measurable impact.

@item 
bpo-45753@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45753}: Make recursion checks a bit more efficient by tracking amount
of calls left before overflow.

@item 
bpo-45773@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45773}: Fix a compiler hang when attempting to optimize certain jump
patterns.

@item 
bpo-45764@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45764}: The parser now gives a better error message when leaving out
the opening parenthesis @code{(} after a @code{def}-statement:

@example
>>> def f:
  File "<stdin>", line 1
    def f:
         ^
SyntaxError: expected '('
@end example

@item 
bpo-45609@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45609}: Specialized the @code{STORE_SUBSCR} opcode using the PEP 659
machinery.

@item 
bpo-45636@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45636}: Replace all numeric @code{BINARY_*} and @code{INPLACE_*} instructions
with a single @ref{366,,BINARY_OP} implementation.

@item 
bpo-45582@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45582}: Path calculation (known as @code{getpath}) has been reimplemented
as a frozen Python module. This should have no visible impact, but may
affect calculation of all paths referenced in @ref{df,,sys} and
@ref{e1,,sysconfig}.

@item 
bpo-45450@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45450}: Improve the syntax error message for parenthesized arguments.
Patch by Pablo Galindo.
@end itemize

@node Library<105>,Documentation<34>,Core and Builtins<102>,Python 3 11 0 alpha 3
@anchor{whatsnew/changelog id468}@anchor{1c14}
@subsubsection Library



@itemize -

@item 
bpo-27946@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27946}: Fix possible crash when getting an attribute of
@ref{363,,xml.etree.ElementTree.Element} simultaneously with replacing the
@code{attrib} dict.

@item 
bpo-45711@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45711}: Make @ref{b,,asyncio} normalize exceptions as soon as they are
captured with @ref{428,,PyErr_Fetch()}, and before they are stored as an
exc_info triplet. This brings @code{asyncio} in line with the rest of the
codebase, where an exc_info triplet is always normalized.

@item 
bpo-23819@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23819}: Replaced asserts with exceptions in asyncio, patch by Kumar
Aditya.

@item 
bpo-13236@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13236}: @ref{753,,unittest.TextTestResult} and
@ref{1ab5,,unittest.TextTestRunner} flush now the output stream more often.

@item 
bpo-45917@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45917}: Added @ref{86f,,math.exp2()}:, which returns 2 raised to the power
of x.

@item 
bpo-37658@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37658}: Fix issue when on certain conditions @code{asyncio.wait_for()} may
allow a coroutine to complete successfully, but fail to return the result,
potentially causing memory leaks or other issues.

@item 
bpo-45876@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45876}: Improve the accuracy of stdev() and pstdev() in the statistics
module.  When the inputs are floats or fractions, the output is a
correctly rounded float

@item 
bpo-44649@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44649}: Handle dataclass(slots=True) with a field that has default a
default value, but for which init=False.

@item 
bpo-45803@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45803}: Added missing kw_only parameter to
dataclasses.make_dataclass().

@item 
bpo-45837@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45837}: The @code{turtle.RawTurtle.settiltangle()} is deprecated since
Python 3.1, it now emits a deprecation warning and will be removed in
Python 3.13.

Use @code{turtle.RawTurtle.tiltangle()} instead.

@code{turtle.RawTurtle.tiltangle()} was earlier incorrectly marked as
deprecated, its docstring has been corrected.

Patch by Hugo van Kemenade.

@item 
bpo-45831@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45831}: @ref{5c,,faulthandler} can now write ASCII-only strings (like
filenames and function names) with a single write() syscall when dumping a
traceback. It reduces the risk of getting an unreadable dump when two
threads or two processes dump a traceback to the same file (like stderr)
at the same time. Patch by Victor Stinner.

@item 
bpo-45828@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45828}: @code{sqlite} C callbacks now use unraisable exceptions if
callback tracebacks are enabled. Patch by Erlend E. Aasland.

@item 
bpo-41735@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41735}: Fix thread lock in @code{zlib.Decompress.flush()} method before
@code{PyObject_GetBuffer}.

@item 
bpo-45235@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45235}: Reverted an argparse bugfix that caused regression in the
handling of default arguments for subparsers.  This prevented leaf level
arguments from taking precedence over root level arguments.

@item 
bpo-45754@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45754}: Fix a regression in Python 3.11a1 and 3.11a2 where
@ref{d4,,sqlite3} incorrectly would use @code{SQLITE_LIMIT_LENGTH} when checking
SQL statement lengths. Now, @code{SQLITE_LIMIT_SQL_LENGTH} is used. Patch by
Erlend E. Aasland.

@item 
bpo-45766@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45766}: Added `proportional' option to
@ref{a32,,statistics.linear_regression()}.

@item 
bpo-45765@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45765}: In importlib.metadata, fix distribution discovery for an empty
path.

@item 
bpo-45757@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45757}: Fix bug where @ref{3c,,dis} produced an incorrect oparg when
@ref{1b1c,,EXTENDED_ARG} is followed by an opcode that does not use its
argument.

@item 
bpo-45644@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45644}: In-place JSON file formatting using @code{python3 -m json.tool
infile infile} now works correctly, previously it left the file empty.
Patch by Chris Wesseling.

@item 
bpo-45703@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45703}: When a namespace package is imported before another module from
the same namespace is created/installed in a different @ref{3e4,,sys.path}
location while the program is running, calling the
@ref{e09,,importlib.invalidate_caches()} function will now also guarantee the
new module is noticed.

@item 
bpo-45535@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45535}: Improve output of @code{dir()} with Enums.

@item 
bpo-45664@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45664}: Fix @ref{d94,,types.resolve_bases()} and @ref{1366,,types.new_class()} for
@ref{9ec,,types.GenericAlias} instance as a base.

@item 
bpo-45663@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45663}: Fix @ref{1c15,,dataclasses.is_dataclass()} for dataclasses which are
subclasses of @ref{9ec,,types.GenericAlias}.

@item 
bpo-45662@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45662}: Fix the repr of @ref{1bb2,,dataclasses.InitVar} with a type alias
to the built-in class, e.g. @code{InitVar[list[int]]}.

@item 
bpo-43137@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43137}: Launch GNOME web browsers via gio tool instead of obsolete
gvfs-open

@item 
bpo-45429@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45429}: On Windows, @ref{8ab,,time.sleep()} now uses a waitable timer which
supports high-resolution timers. Patch by Donghee Na and Eryk Sun.

@item 
bpo-37295@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37295}: Optimize @ref{8de,,math.comb()} and @ref{8df,,math.perm()}.

@item 
bpo-45514@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45514}: Deprecated legacy functions in @ref{7f,,importlib.resources}.

@item 
bpo-45507@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45507}: Add tests for truncated/missing trailers in gzip.decompress
implementation.

@item 
bpo-45359@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45359}: Implement 
@geindex Python 향상 제안; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/} for @ref{ade,,graphlib.TopologicalSorter}.

@item 
bpo-44733@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44733}: Add @code{max_tasks_per_child} to
@ref{1d6,,concurrent.futures.ProcessPoolExecutor}. This allows users to
specify the maximum number of tasks a single process should execute before
the process needs to be restarted.

@item 
bpo-28806@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28806}: Improve netrc library. netrc file no longer needs to contain
all tokens. And if the login name is anonymous, security check is no
longer need.

@item 
bpo-43498@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43498}: Avoid a possible `“RuntimeError: dictionary changed size during
iteration”' when adjusting the process count of
@code{ProcessPoolExecutor}.

@item 
bpo-42158@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42158}: Add MIME types for N-quads, N-triples, Notation3 and TriG to
@code{mimetypes}.

@item 
bpo-30533@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30533}: Add @ref{858,,inspect.getmembers_static()} , it return all members
without triggering dynamic lookup via the descriptor protocol. Patch by
Weipeng Hong.
@end itemize

@node Documentation<34>,Tests<34>,Library<105>,Python 3 11 0 alpha 3
@anchor{whatsnew/changelog id469}@anchor{1c16}
@subsubsection Documentation



@itemize -

@item 
bpo-42238@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42238}: @code{make -C Doc suspicious} will be removed soon in favor of
@code{make -C Doc check}, mark it as deprecated.

@item 
bpo-45840@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45840}: Improve cross-references in the documentation for the data
model.

@item 
bpo-45640@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45640}: Properly marked-up grammar tokens in the documentation are now
clickable and take you to the definition of a given piece of grammar.
Patch by Arthur Milchior.

@item 
bpo-45788@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45788}: Link doc for sys.prefix to sysconfig doc on installation paths.

@item 
bpo-45772@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45772}: @code{socket.socket} documentation is corrected to a class from a
function.

@item 
bpo-45392@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45392}: Update the docstring of the @ref{f43,,type} built-in to remove a
redundant line and to mention keyword arguments for the constructor.

@item 
bpo-45250@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45250}: Update the documentation to note that CPython does not
consistently require iterators to define @code{__iter__}.

@item 
bpo-25381@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25381}: In the extending chapter of the extending doc, update a
paragraph about the global variables containing exception information.

@item 
bpo-43905@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43905}: Expanded @ref{1a9d,,astuple()} and
@ref{1a95,,asdict()} docs, warning about deepcopy being applied and
providing a workaround.
@end itemize

@node Tests<34>,Build<41>,Documentation<34>,Python 3 11 0 alpha 3
@anchor{whatsnew/changelog id470}@anchor{1c17}
@subsubsection Tests



@itemize -

@item 
bpo-45695@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45695}: Out-of-tree builds with a read-only source directory are now
tested by CI.

@item 
bpo-19460@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19460}: Add new Test for
@code{Lib/email/mime/nonmultipart.py::MIMENonMultipart}.

@item 
bpo-45835@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45835}: Fix race condition in test_queue tests with multiple “feeder”
threads.

@item 
bpo-45783@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45783}: The test for the freeze tool now handles file moves and
deletions.

@item 
bpo-45745@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45745}: Remove the @code{--findleaks} command line option of regrtest: use
the @code{--fail-env-changed} option instead. Since Python 3.7, it was a
deprecated alias to the @code{--fail-env-changed} option.

@item 
bpo-45701@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45701}: Add tests with @code{tuple} type with @ref{be1,,functools.lru_cache()}
to @code{test_functools}.
@end itemize

@node Build<41>,Windows<35>,Tests<34>,Python 3 11 0 alpha 3
@anchor{whatsnew/changelog id471}@anchor{1c18}
@subsubsection Build



@itemize -

@item 
bpo-44035@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44035}: CI now verifies that autoconf files have been regenerated with
a current and unpatched autoconf package.

@item 
bpo-45950@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45950}: The build system now uses a @code{_bootstrap_python}
interpreter for freezing and deepfreezing again. To speed up build process
the build tools @code{_bootstrap_python} and @code{_freeze_module}
are no longer build with LTO.

@item 
bpo-45881@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45881}: The @code{configure} script now accepts
@code{--with-build-python} and @code{--with-freeze-module} options to make cross
compiling easier.

@item 
bpo-40280@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40280}: Emscripten platform now uses @code{.wasm} suffix by default.

@item 
bpo-40280@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40280}: Disable unusable core extension modules on WASM/Emscripten
targets.

@item 
bpo-40280@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40280}: @code{configure} now checks for socket @code{shutdown} function. The
check makes it possible to disable @code{SYS_shutdown} with
@code{ac_cv_func_shutdown=no} in CONFIG_SITE.

@item 
bpo-40280@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40280}: @code{configure} now checks for functions @code{fork1, getegid,
geteuid, getgid, getppid, getuid, opendir, pipe, system, wait, ttyname}.

@item 
bpo-33393@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33393}: Update @code{config.guess} to 2021-06-03 and @code{config.sub} to
2021-08-14. @code{Makefile} now has an @code{update-config} target to make
updating more convenient.

@item 
bpo-45866@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45866}: @code{make regen-all} now produces the same output when run from a
directory other than the source tree: when building Python out of the
source tree. pegen now strips directory of the “generated by pygen from
<FILENAME>” header Patch by Victor Stinner.

@item 
bpo-40280@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40280}: @code{configure} now accepts machine @code{wasm32} or @code{wasm64} and
OS @code{wasi} or @code{emscripten} for cross building, e.g.
@code{wasm32-unknown-emscripten}, @code{wasm32-wasi}, or
@code{wasm32-unknown-wasi}.

@item 
bpo-41498@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41498}: Python now compiles on platforms without @code{sigset_t}. Several
functions in @ref{cb,,signal} are not available when @code{sigset_t} is missing.

Based on patch by Roman Yurchak for pyodide.

@item 
bpo-45881@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45881}: @code{setup.py} now uses @code{CC} from environment first to discover
multiarch and cross compile paths.

@item 
bpo-45886@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45886}: The @code{_freeze_module} program path can now be overridden on
the command line, e.g. @code{make
FREEZE_MODULE=../x86_64/Program/_freeze_module}.

@item 
bpo-45873@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45873}: Get rid of the @code{_bootstrap_python} build step. The
deepfreeze.py script is now run using @code{$(PYTHON_FOR_REGEN)} which can be
Python 3.7 or newer (on Windows, 3.8 or newer).

@item 
bpo-45847@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45847}: Port builtin hashlib extensions to @code{PY_STDLIB_MOD} macro and
@code{addext()}.

@item 
bpo-45723@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45723}: Add @code{autoconf} helpers for saving and restoring environment
variables:


@itemize *

@item 
@code{SAVE_ENV}: Save @code{$CFLAGS}, @code{$LDFLAGS}, @code{$LIBS}, and
@code{$CPPFLAGS}.

@item 
@code{RESTORE_ENV}: Restore @code{$CFLAGS}, @code{$LDFLAGS}, @code{$LIBS}, and
@code{$CPPFLAGS}.

@item 
@code{WITH_SAVE_ENV([SCRIPT])}: Run @code{SCRIPT} wrapped with @code{SAVE_ENV} and
@code{RESTORE_ENV}.
@end itemize

Patch by Erlend E. Aasland.

@item 
bpo-45573@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45573}: Mandatory core modules, that are required to bootstrap Python,
are now in @code{Modules/Setup.bootstrap}.

@item 
bpo-45573@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45573}: @code{configure} now creates @code{Modules/Setup.stdlib} with
conditionally enabled/disabled extension module lines. The file is not
used, yet.

@item 
bpo-45573@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45573}: @code{configure} now uses a unified format to set state, compiler
flags, and linker flags in Makefile. The new macro @code{PY_STDLIB_MOD} sets
three variables that are consumed by @code{Modules/Setup} and @code{setup.py}.

@item 
bpo-45816@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45816}: Python now supports building with Visual Studio 2022 (MSVC
v143, VS Version 17.0). Patch by Jeremiah Vivian.

@item 
bpo-45800@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45800}: Settings for @code{pyexpat} C extension are now detected by
@code{configure}. The bundled @code{expat} library is built in @code{Makefile}.

@item 
bpo-45798@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45798}: Settings for @ref{3a,,decimal} internal C extension are now
detected by @code{configure}. The bundled @code{libmpdec} library is built in
@code{Makefile}.

@item 
bpo-45723@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45723}: @code{configure} has a new option @code{--with-pkg-config} to
disable or require pkg-config.

@item 
bpo-45774@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45774}: The build dependencies for @ref{d4,,sqlite3} are now detected by
@code{configure} and @code{pkg-config}. Patch by Erlend E. Aasland.

@item 
bpo-45763@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45763}: The build dependencies for @ref{139,,zlib}, @ref{14,,bz2}, and
@ref{8e,,lzma} are now detected by @code{configure}.

@item 
bpo-45747@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45747}: gdbm and dbm build dependencies are now detected by
@code{configure}.

@item 
bpo-45743@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45743}: On macOS, the build system no longer passes
@code{search_paths_first} to the linker. The flag has been the default since
Xcode 4 / macOS 10.6.

@item 
bpo-45723@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45723}: @code{configure.ac} is now compatible with autoconf 2.71.
Deprecated checks @code{STDC_HEADERS} and @code{AC_HEADER_TIME} have been
removed.

@item 
bpo-45723@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45723}: @code{configure} now prints a warning when pkg-config is missing.

@item 
bpo-45731@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45731}: @code{configure --enable-loadable-sqlite-extensions} is now
handled by new @code{PY_SQLITE_ENABLE_LOAD_EXTENSION} macro instead of logic
in setup.py.

@item 
bpo-45723@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45723}: configure.ac now uses custom helper macros and
@code{AC_CACHE_CHECK} to simplify and speed up configure runs.

@item 
bpo-45696@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45696}: Skip the marshal step for frozen modules by generating C code
that produces a set of ready-to-use code objects. This speeds up startup
time by another 10% or more.

@item 
bpo-45561@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45561}: Run smelly.py tool from $(srcdir).
@end itemize

@node Windows<35>,macOS<25>,Build<41>,Python 3 11 0 alpha 3
@anchor{whatsnew/changelog id472}@anchor{1c19}
@subsubsection Windows



@itemize -

@item 
bpo-46105@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=46105}: Fixed calculation of @ref{3e4,,sys.path} in a venv on Windows.

@item 
bpo-45901@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45901}: When installed through the Microsoft Store and set as the
default app for @code{*.py} files, command line arguments will now be
passed to Python when invoking a script without explicitly launching
Python (that is, @code{script.py args} rather than @code{python script.py
args}).

@item 
bpo-45616@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45616}: Fix Python Launcher’s ability to distinguish between versions
3.1 and 3.10 when either one is explicitly requested.  Previously, 3.1
would be used if 3.10 was requested but not installed, and 3.10 would be
used if 3.1 was requested but 3.10 was installed.

@item 
bpo-45850@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45850}: Implement changes to build with deep-frozen modules on Windows.
Note that we now require Python 3.10 as the “bootstrap” or “host” Python.

@item 
bpo-45732@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45732}: Updates bundled Tcl/Tk to 8.6.12.

@item 
bpo-45720@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45720}: Internal reference to @code{shlwapi.dll} was dropped to help
improve startup time. This DLL will no longer be loaded at the start of
every Python process.
@end itemize

@node macOS<25>,C API<36>,Windows<35>,Python 3 11 0 alpha 3
@anchor{whatsnew/changelog id473}@anchor{1c1a}
@subsubsection macOS



@itemize -

@item 
bpo-45732@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45732}: Update python.org macOS installer to use Tcl/Tk 8.6.12.
@end itemize

@node C API<36>,,macOS<25>,Python 3 11 0 alpha 3
@anchor{whatsnew/changelog id474}@anchor{1c1b}
@subsubsection C API



@itemize -

@item 
bpo-39026@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39026}: Fix Python.h to build C extensions with Xcode: remove a
relative include from @code{Include/cpython/pystate.h}.
@end itemize

@node Python 3 11 0 alpha 2,Python 3 11 0 alpha 1,Python 3 11 0 alpha 3,Changelog
@anchor{whatsnew/changelog python-3-11-0-alpha-2}@anchor{1c1c}
@subsection Python 3.11.0 alpha 2


`Release date: 2021-11-05'

@menu
* Core and Builtins: Core and Builtins<103>. 
* Library: Library<106>. 
* Documentation: Documentation<35>. 
* Tests: Tests<35>. 
* Build: Build<42>. 
* Windows: Windows<36>. 
* macOS: macOS<26>. 
* IDLE: IDLE<18>. 
* C API: C API<37>. 

@end menu

@node Core and Builtins<103>,Library<106>,,Python 3 11 0 alpha 2
@anchor{whatsnew/changelog id475}@anchor{1c1d}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-45716@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45716}: Improve the @ref{18e,,SyntaxError} message when using @code{True},
@code{None} or @code{False} as keywords in a function call. Patch by Pablo
Galindo.

@item 
bpo-45688@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45688}: @ref{a42,,sys.stdlib_module_names} now contains the macOS-specific
module @code{_scproxy}.

@item 
bpo-45379@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45379}: Clarify @ref{659,,ImportError} message when we try to explicitly
import a frozen module but frozen modules are disabled.

@item 
bpo-44525@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44525}: Specialize simple calls to Python functions (no starargs,
keyword dict, or closure)

@item 
bpo-45530@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45530}: Cases of sorting using tuples as keys may now be significantly
faster in some cases. Patch by Tim Peters.

The order of the result may differ from earlier releases if the tuple
elements don’t define a total ordering (see
@ref{1c1e,,값 비교} for information on total ordering).
It’s generally true that the result of sorting simply isn’t well-defined
in the absence of a total ordering on list elements.

@item 
bpo-45526@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45526}: In obmalloc, set ADDRESS_BITS to not ignore any bits (ignored
16 before). That is safer in the case that the kernel gives user-space
virtual addresses that span a range greater than 48 bits.

@item 
bpo-30570@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30570}: Fixed a crash in @code{issubclass()} from infinite recursion when
searching pathological @code{__bases__} tuples.

@item 
bpo-45521@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45521}: Fix a bug in the obmalloc radix tree code.  On 64-bit machines,
the bug causes the tree to hold 46-bits of virtual addresses, rather than
the intended 48-bits.

@item 
bpo-45494@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45494}: Fix parser crash when reporting errors involving invalid
continuation characters. Patch by Pablo Galindo.

@item 
bpo-45445@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45445}: Python now fails to initialize if it finds an invalid
@ref{16f,,-X} option in the command line. Patch by Pablo Galindo.

@item 
bpo-45340@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45340}: Object attributes are held in an array instead of a dictionary.
An object’s dictionary are created lazily, only when needed. Reduces the
memory consumption of a typical Python object by about 30%. Patch by Mark
Shannon.

@item 
bpo-45408@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45408}: Fix a crash in the parser when reporting tokenizer errors that
occur at the same time unclosed parentheses are detected. Patch by Pablo
Galindo.

@item 
bpo-29410@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29410}: Add SipHash13 for string hash algorithm and use it by default.

@item 
bpo-45385@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45385}: Fix reference leak from descr_check. Patch by Donghee Na.

@item 
bpo-45367@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45367}: Specialized the @code{BINARY_MULTIPLY} opcode to
@code{BINARY_MULTIPLY_INT} and @code{BINARY_MULTIPLY_FLOAT} using the PEP 659
machinery.

@item 
bpo-21736@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21736}: Frozen stdlib modules now have @code{__file__} to the .py file
they would otherwise be loaded from, if possible.  For packages,
@code{__path__} now has the correct entry instead of being an empty list,
which allows unfrozen submodules to be imported.  These are set only if
the stdlib directory is known when the runtime is initialized.  Note that
the file at @code{__file__} is not guaranteed to exist.  None of this affects
non-stdlib frozen modules nor, for now, frozen modules imported using
@code{PyImport_ImportFrozenModule()}.  Also, at the moment @code{co_filename} is
not updated for the module.

@item 
bpo-45020@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45020}: For frozen stdlib modules, record the original module name as
@code{module.__spec__.loader_state.origname}.  If the value is different than
@code{module.__spec__.name} then the module was defined as an alias in
Tools/scripts/freeze_modules.py.  If it is @code{None} then the module comes
from a source file outside the stdlib.

@item 
bpo-45324@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45324}: In FrozenImporter.find_spec(), we now preserve the information
needed in exec_module() to load the module.  This change mostly impacts
internal details, rather than changing the importer’s behavior.

@item 
bpo-45292@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45292}: Implement 
@geindex Python 향상 제안; PEP 654
PEP 654@footnote{https://peps.python.org/pep-0654/}. Add @ref{4d3,,ExceptionGroup} and
@ref{564,,BaseExceptionGroup}. Update traceback display code.

@item 
bpo-40116@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40116}: Change to the implementation of split dictionaries. Classes
where the instances differ either in the exact set of attributes, or in
the order in which those attributes are set, can still share keys. This
should have no observable effect on users of Python or the C-API. Patch by
Mark Shannon.

@item 
bpo-44050@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44050}: Extensions that indicate they use global state (by setting
@code{m_size} to -1) can again be used in multiple interpreters. This reverts
to behavior of Python 3.8.

@item 
bpo-44525@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44525}: Setup initial specialization infrastructure for the
@code{CALL_FUNCTION} opcode. Implemented initial specializations for C
function calls:


@itemize *

@item 
@code{CALL_FUNCTION_BUILTIN_O} for @code{METH_O} flag.

@item 
@code{CALL_FUNCTION_BUILTIN_FAST} for @code{METH_FASTCALL} flag without keywords.

@item 
@code{CALL_FUNCTION_LEN} for @code{len(o)}.

@item 
@code{CALL_FUNCTION_ISINSTANCE} for @code{isinstance(o, t)}.
@end itemize

@item 
bpo-44511@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44511}: Improve the generated bytecode for class and mapping patterns.

@item 
bpo-43706@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43706}: Speed up calls to @code{enumerate()} by using the 
@geindex Python 향상 제안; PEP 590
PEP 590@footnote{https://peps.python.org/pep-0590/}
@code{vectorcall} calling convention. Patch by Donghee Na.
@end itemize

@node Library<106>,Documentation<35>,Core and Builtins<103>,Python 3 11 0 alpha 2
@anchor{whatsnew/changelog id476}@anchor{1c1f}
@subsubsection Library



@itemize -

@item 
bpo-45679@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45679}: Fix caching of multi-value @ref{a55,,typing.Literal}.
@code{Literal[True, 2]} is no longer equal to @code{Literal[1, 2]}.

@item 
bpo-42064@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42064}: Convert @ref{d4,,sqlite3} to multi-phase initialisation (PEP 489).
Patches by Erlend E. Aasland.

@item 
bpo-45438@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45438}: Fix typing.Signature string representation for generic builtin
types.

@item 
bpo-45613@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45613}: @ref{d4,,sqlite3} now sets @ref{88b,,sqlite3.threadsafety} based on
the default threading mode the underlying SQLite library has been compiled
with. Patch by Erlend E. Aasland.

@item 
bpo-45574@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45574}: Fix warning about @code{print_escape} being unused.

@item 
bpo-45581@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45581}: @ref{5a5,,sqlite3.connect()} now correctly raises @ref{175f,,MemoryError}
if the underlying SQLite API signals memory error. Patch by Erlend E.
Aasland.

@item 
bpo-45557@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45557}: @ref{a29,,pprint.pprint()} now handles `underscore_numbers'
correctly. Previously it was always setting it to @code{False}.

@item 
bpo-44019@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44019}: Add @ref{1c20,,operator.call()} to @code{operator.__all__}. Patch by
Kreusada.

@item 
bpo-42174@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42174}: @ref{1308,,shutil.get_terminal_size()} now falls back to sane values
if the column or line count are 0.

@item 
bpo-35673@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35673}: Improve the introspectability of the @code{__loader__} attribute
for namespace packages.  @ref{1155,,importlib.machinery.NamespaceLoader} is
now public, and implements the @ref{1153,,importlib.abc.InspectLoader}
interface. @code{_NamespaceLoader} is kept for backward compatibility.

@item 
bpo-45515@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45515}: Add references to @ref{13a,,zoneinfo} in the @ref{34,,datetime}
documentation, mostly replacing outdated references to @code{dateutil.tz}.
Change by Paul Ganssle.

@item 
bpo-45475@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45475}: Reverted optimization of iterating @ref{65a,,gzip.GzipFile},
@ref{a66,,bz2.BZ2File}, and @ref{120b,,lzma.LZMAFile} (see bpo-43787@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43787}) because
it caused regression when user iterate them without having reference of
them. Patch by Inada Naoki.

@item 
bpo-45489@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45489}: Update @ref{1bd8,,ForwardRef} to support @code{|} operator.
Patch by Donghee Na.

@item 
bpo-42222@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42222}: Removed deprecated support for float arguments in
`randrange()'.

@item 
bpo-45428@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45428}: Fix a regression in py_compile when reading filenames from
standard input.

@item 
bpo-45467@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45467}: Fix incremental decoder and stream reader in the
“raw-unicode-escape” codec. Previously they failed if the escape sequence
was split.

@item 
bpo-45461@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45461}: Fix incremental decoder and stream reader in the
“unicode-escape” codec. Previously they failed if the escape sequence was
split.

@item 
bpo-45239@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45239}: Fixed @ref{1c21,,email.utils.parsedate_tz()} crashing with
@ref{173b,,UnboundLocalError} on certain invalid input instead of returning
@code{None}. Patch by Ben Hoyt.

@item 
bpo-45417@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45417}: Fix quadratic behaviour in the enum module: Creation of enum
classes with a lot of entries was quadratic.

@item 
bpo-45249@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45249}: Fix the behaviour of @ref{1c22,,traceback.print_exc()} when
displaying the caret when the @code{end_offset} in the exception is set to 0.
Patch by Pablo Galindo

@item 
bpo-45416@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45416}: Fix use of @ref{c66,,asyncio.Condition} with explicit
@ref{c65,,asyncio.Lock} objects, which was a regression due to removal of
explicit loop arguments. Patch by Joongi Kim.

@item 
bpo-20028@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20028}: Empty escapechar/quotechar is not allowed when initializing
@ref{182a,,csv.Dialect}. Patch by Vajrasky Kok and Donghee Na.

@item 
bpo-44904@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44904}: Fix bug in the @ref{3e,,doctest} module that caused it to fail if
a docstring included an example with a @code{classmethod} @code{property}. Patch
by Alex Waygood.

@item 
bpo-45406@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45406}: Make @ref{1b6b,,inspect.getmodule()} catch @code{FileNotFoundError}
raised by @code{inspect.getabsfile()}, and return @code{None} to indicate that
the module could not be determined.

@item 
bpo-45411@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45411}: Add extensions for files containing subtitles - .srt & .vtt -
to the mimetypes.py module.

@item 
bpo-10716@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10716}: Migrated pydoc to HTML5 (without changing the look of it). Side
effect is to update xmlrpc’s @code{ServerHTMLDoc} which now uses the CSS too.
cgitb now relies less on pydoc (as it can’t use the CSS file).

@item 
bpo-27580@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27580}: Add support of null characters in @ref{2d,,csv}.

@item 
bpo-45262@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45262}: Prevent use-after-free in asyncio. Make sure the cached running
loop holder gets cleared on dealloc to prevent use-after-free in
get_running_loop

@item 
bpo-45386@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45386}: Make @ref{134,,xmlrpc.client} more robust to C runtimes where the
underlying C @code{strftime} function results in a @code{ValueError} when
testing for year formatting options.

@item 
bpo-20028@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20028}: Improve error message of @ref{182a,,csv.Dialect} when
initializing. Patch by Vajrasky Kok and Donghee Na.

@item 
bpo-45343@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45343}: Update bundled pip to 21.2.4 and setuptools to 58.1.0

@item 
bpo-45328@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45328}: Fixed @ref{d34,,http.client.HTTPConnection} to work properly in
OSs that don’t support the @code{TCP_NODELAY} socket option.

@item 
bpo-45243@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45243}: Add @ref{889,,setlimit()} and
@ref{88a,,getlimit()} to @ref{54c,,sqlite3.Connection} for
setting and getting SQLite limits by connection basis. Patch by Erlend E.
Aasland.

@item 
bpo-45320@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45320}: Removed from the @ref{82,,inspect} module:


@itemize *

@item 

@table @asis

@item the @code{getargspec} function, deprecated since Python 3.0;

use @ref{22f,,inspect.signature()} or @ref{940,,inspect.getfullargspec()} instead.
@end table

@item 
the @code{formatargspec} function, deprecated since Python 3.5;
use the @ref{22f,,inspect.signature()} function and @code{Signature} object
directly.

@item 
the undocumented @code{Signature.from_builtin} and @code{Signature.from_function}
functions, deprecated since Python 3.5; use the
@ref{941,,Signature.from_callable()} method
instead.
@end itemize

Patch by Hugo van Kemenade.

@item 
bpo-45192@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45192}: Fix the @code{tempfile._infer_return_type} function so that the
@code{dir} argument of the @ref{e6,,tempfile} functions accepts an object
implementing the @code{os.PathLike} protocol.

Patch by Kyungmin Lee.

@item 
bpo-45160@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45160}: When tracing a tkinter variable used by a ttk OptionMenu,
callbacks are no longer made twice.

@item 
bpo-25625@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25625}: Added non parallel-safe @ref{81f,,chdir()} context
manager to change the current working directory and then restore it on
exit. Simple wrapper around @ref{820,,chdir()}.

@item 
bpo-24139@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24139}: Add support for SQLite extended result codes in
@ref{1c23,,sqlite3.Error}. Patch by Erlend E. Aasland.

@item 
bpo-24444@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24444}: Fixed an error raised in @ref{7,,argparse} help display when help
for an option is set to 1+ blank spaces or when `choices' arg is an empty
container.

@item 
bpo-44547@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44547}: Implement @code{Fraction.__int__}, so that a
@ref{213,,fractions.Fraction} instance @code{f} passes an @code{isinstance(f,
typing.SupportsInt)} check.

@item 
bpo-40321@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40321}: Adds support for HTTP 308 redirects to @ref{10e,,urllib}. See
@geindex RFC; RFC 7538
RFC 7538@footnote{https://datatracker.ietf.org/doc/html/rfc7538.html} for details. Patch by Jochem Schulenklopper.

@item 
bpo-41374@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41374}: Ensure that @code{socket.TCP_*} constants are exposed on Cygwin
3.1.6 and greater.

@item 
bpo-35970@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35970}: Add help flag to the base64 module’s command line interface.
Patch contributed by Robert Kuska.
@end itemize

@node Documentation<35>,Tests<35>,Library<106>,Python 3 11 0 alpha 2
@anchor{whatsnew/changelog id477}@anchor{1c24}
@subsubsection Documentation



@itemize -

@item 
bpo-45726@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45726}: Improve documentation for @ref{84a,,functools.singledispatch()} and
@ref{be4,,functools.singledispatchmethod}.

@item 
bpo-45680@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45680}: Amend the docs on @code{GenericAlias} objects to clarify that
non-container classes can also implement @code{__class_getitem__}. Patch
contributed by Alex Waygood.

@item 
bpo-45618@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45618}: Update Sphinx version used to build the documentation to 4.2.0.
Patch by Maciej Olko.

@item 
bpo-45655@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45655}: Add a new “relevant PEPs” section to the top of the
documentation for the @code{typing} module. Patch by Alex Waygood.

@item 
bpo-45604@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45604}: Add @code{level} argument to @code{multiprocessing.log_to_stderr}
function docs.

@item 
bpo-45516@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45516}: Add protocol description to the
@code{importlib.abc.TraversableResources} documentation.

@item 
bpo-45464@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45464}: Mention in the documentation of @ref{1c25,,Built-in Exceptions} that inheriting from multiple exception types in a
single subclass is not recommended due to possible memory layout
incompatibility.

@item 
bpo-45449@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45449}: Add note about 
@geindex Python 향상 제안; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/} in @ref{1f,,collections.abc}.

@item 
bpo-45516@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45516}: Add protocol description to the
@code{importlib.abc.Traversable} documentation.

@item 
bpo-20692@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20692}: Add Programming FAQ entry explaining that int literal attribute
access requires either a space after or parentheses around the literal.
@end itemize

@node Tests<35>,Build<42>,Documentation<35>,Python 3 11 0 alpha 2
@anchor{whatsnew/changelog id478}@anchor{1c26}
@subsubsection Tests



@itemize -

@item 
bpo-45678@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45678}: Add tests for scenarios in which
@ref{be4,,functools.singledispatchmethod} is stacked on top of a method that
has already been wrapped by two other decorators. Patch by Alex Waygood.

@item 
bpo-45578@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45578}: Add tests for @ref{206,,dis.distb()}

@item 
bpo-45678@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45678}: Add tests to ensure that @code{functools.singledispatchmethod}
correctly wraps the attributes of the target function.

@item 
bpo-45668@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45668}: PGO tests now pass when Python is built without test extension
modules.

@item 
bpo-45577@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45577}: Add subtests for all @code{pickle} protocols in @code{test_zoneinfo}.

@item 
bpo-45566@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45566}: Fix @code{test_frozen_pickle} in @code{test_dataclasses} to check all
@code{pickle} versions.

@item 
bpo-43592@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43592}: @code{test.libregrtest} now raises the soft resource limit for
the maximum number of file descriptors when the default is too low for our
test suite as was often the case on macOS.

@item 
bpo-39679@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39679}: Add more test cases for @code{@@functools.singledispatchmethod}
when combined with @code{@@classmethod} or @code{@@staticmethod}.

@item 
bpo-45410@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45410}: When libregrtest spawns a worker process, stderr is now written
into stdout to keep messages order. Use a single pipe for stdout and
stderr, rather than two pipes. Previously, messages were out of order
which made analysis of buildbot logs harder Patch by Victor Stinner.

@item 
bpo-45402@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45402}: Fix test_tools.test_sundry() when Python is built out of tree:
fix how the freeze_modules.py tool locates the _freeze_module program.
Patch by Victor Stinner.

@item 
bpo-45403@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45403}: Fix test_sys.test_stdlib_dir() when Python is built outside the
source tree: compare normalized paths. Patch by Victor Stinner.

@item 
bpo-45400@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45400}: Fix
test_name_error_suggestions_do_not_trigger_for_too_many_locals() of
test_exceptions if a directory name contains “a1” (like
“Python-3.11.0a1”): use a stricter regular expression. Patch by Victor
Stinner.

@item 
bpo-10572@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10572}: Rename @ref{d4,,sqlite3} tests from @code{test_sqlite} to
@code{test_sqlite3}, and relocate them to @code{Lib/test/test_sqlite3}. Patch by
Erlend E. Aasland.
@end itemize

@node Build<42>,Windows<36>,Tests<35>,Python 3 11 0 alpha 2
@anchor{whatsnew/changelog id479}@anchor{1c27}
@subsubsection Build



@itemize -

@item 
bpo-43158@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43158}: @code{setup.py} now uses values from configure script to build the
@code{_uuid} extension module. Configure now detects util-linux’s
@code{libuuid}, too.

@item 
bpo-45666@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45666}: Fix warning of @code{swprintf} and @code{%s} usage in
@code{_testembed.c}

@item 
bpo-45548@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45548}: @code{Modules/Setup} and @code{Modules/makesetup} have been improved.
The @code{Setup} file now contains working rules for all extensions. Outdated
comments have been removed. Rules defined by @code{makesetup} track
dependencies correctly.

@item 
bpo-45548@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45548}: The @ref{92,,math} and @ref{19,,cmath} implementation now require a
C99 compatible @code{libm} and no longer ship with workarounds for missing
acosh, asinh, atanh, expm1, and log1p functions.

@item 
bpo-45595@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45595}: @code{setup.py} and @code{makesetup} now track build dependencies on
all Python header files and module specific header files.

@item 
bpo-45571@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45571}: @code{Modules/Setup} now use @code{PY_CFLAGS_NODIST} instead of
@code{PY_CFLAGS} to compile shared modules.

@item 
bpo-45570@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45570}: @code{pyexpat} and @code{_elementtree} no longer define
obsolete macros @code{HAVE_EXPAT_CONFIG_H} and @code{USE_PYEXPAT_CAPI}.
@code{XML_POOR_ENTROPY} is now defined in @code{expat_config.h}.

@item 
bpo-43974@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43974}: @code{setup.py} no longer defines @code{Py_BUILD_CORE_MODULE}.
Instead every module, that uses the internal API, defines the macro.

@item 
bpo-45548@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45548}: Fill in missing entries in Modules/Setup.

@item 
bpo-45532@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45532}: Update @ref{49d,,sys.version} to use @code{main} as fallback
information. Patch by Jeong YunWon.

@item 
bpo-45536@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45536}: The @code{configure} script now checks whether OpenSSL headers and
libraries provide required APIs. Most common APIs are verified. The check
detects outdated or missing OpenSSL. Failures do not stop configure.

@item 
bpo-45221@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45221}: Fixed regression in handling of @code{LDFLAGS} and @code{CPPFLAGS}
options where @code{argparse.parse_known_args()} could interpret an option
as one of the built-in command line argument, for example @code{-h} for help.

@item 
bpo-45440@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45440}: Building Python now requires a C99 @code{<math.h>} header file
providing the following functions: @code{copysign()}, @code{hypot()},
@code{isfinite()}, @code{isinf()}, @code{isnan()}, @code{round()}. Patch by Victor
Stinner.

@item 
bpo-45405@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45405}: Prevent @code{internal configure error} when running @code{configure}
with recent versions of non-Apple clang.  Patch by David Bohman.

@item 
bpo-45433@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45433}: Avoid linking libpython with libcrypt.
@end itemize

@node Windows<36>,macOS<26>,Build<42>,Python 3 11 0 alpha 2
@anchor{whatsnew/changelog id480}@anchor{1c28}
@subsubsection Windows



@itemize -

@item 
bpo-43652@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43652}: Update Tcl/Tk to 8.6.11, actually this time. The previous
update incorrectly included 8.6.10.

@item 
bpo-45337@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45337}: venv now warns when the created environment may need to be
accessed at a different path, due to redirections, links or junctions. It
also now correctly installs or upgrades components when the alternate path
is required.

@item 
bpo-43851@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43851}: Build SQLite @code{SQLITE_OMIT_AUTOINIT} on Windows. Patch by
Erlend E. Aasland.
@end itemize

@node macOS<26>,IDLE<18>,Windows<36>,Python 3 11 0 alpha 2
@anchor{whatsnew/changelog id481}@anchor{1c29}
@subsubsection macOS



@itemize -

@item 
bpo-44828@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44828}: Avoid tkinter file dialog failure on macOS 12 Monterey when
using the Tk 8.6.11 provided by python.org macOS installers. Patch by Marc
Culler of the Tk project.
@end itemize

@node IDLE<18>,C API<37>,macOS<26>,Python 3 11 0 alpha 2
@anchor{whatsnew/changelog id482}@anchor{1c2a}
@subsubsection IDLE



@itemize -

@item 
bpo-45495@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45495}: Add context keywords ‘case’ and ‘match’ to completions list.
@end itemize

@node C API<37>,,IDLE<18>,Python 3 11 0 alpha 2
@anchor{whatsnew/changelog id483}@anchor{1c2b}
@subsubsection C API



@itemize -

@item 
bpo-29103@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29103}: @ref{772,,PyType_FromSpec*} now
copies the class name from the spec to a buffer owned by the class, so the
original can be safely deallocated. Patch by Petr Viktorin.

@item 
bpo-45522@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45522}: The internal freelists for frame, float, list, dict, async
generators, and context objects can now be disabled.

@item 
bpo-35134@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35134}: Exclude @ref{3de,,PyWeakref_GET_OBJECT()} from the limited C API.
It never worked since the @code{PyWeakReference} structure is opaque
in the limited C API.

@item 
bpo-35081@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35081}: Move the @code{interpreteridobject.h} header file from
@code{Include/} to @code{Include/internal/}. It only provides private functions.
Patch by Victor Stinner.

@item 
bpo-35134@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35134}: The non-limited API files @code{cellobject.h}, @code{classobject.h},
@code{context.h}, @code{funcobject.h}, @code{genobject.h} and @code{longintrepr.h}
have been moved to the @code{Include/cpython} directory. Moreover, the
@code{eval.h} header file was removed. These files must not be included
directly, as they are already included in @code{Python.h}: @ref{986,,Include Files}. If they have been included directly, consider
including @code{Python.h} instead. Patch by Victor Stinner.

@item 
bpo-45474@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45474}: The following items are no longer available when
@code{Py_LIMITED_API} is defined:


@itemize *

@item 
@ref{998,,PyMarshal_WriteLongToFile()}

@item 
@ref{999,,PyMarshal_WriteObjectToFile()}

@item 
@ref{99a,,PyMarshal_ReadObjectFromString()}

@item 
@ref{99b,,PyMarshal_WriteObjectToString()}

@item 
the @code{Py_MARSHAL_VERSION} macro
@end itemize

These are not part of the @ref{99c,,limited API}.

Patch by Victor Stinner.

@item 
bpo-45434@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45434}: Remove the @code{pystrhex.h} header file. It only contains private
functions. C extensions should only include the main @code{<Python.h>} header
file. Patch by Victor Stinner.

@item 
bpo-45440@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45440}: Remove the @code{Py_FORCE_DOUBLE()} macro. It was used by the
@code{Py_IS_INFINITY()} macro. Patch by Victor Stinner.

@item 
bpo-45434@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45434}: @code{<Python.h>} no longer includes the header files
@code{<stdlib.h>}, @code{<stdio.h>}, @code{<errno.h>} and @code{<string.h>} when the
@code{Py_LIMITED_API} macro is set to @code{0x030b0000} (Python 3.11) or higher.
C extensions should explicitly include the header files after @code{#include
<Python.h>}. Patch by Victor Stinner.

@item 
bpo-41123@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41123}: Remove @code{Py_UNICODE_COPY()} and @code{Py_UNICODE_FILL()} macros,
deprecated since Python 3.3. Use @code{PyUnicode_CopyCharacters()} or
@code{memcpy()} (@code{wchar_t*} string), and @code{PyUnicode_Fill()} functions
instead. Patch by Victor Stinner.

@item 
bpo-45412@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45412}: Remove the following math macros using the @code{errno} variable:


@itemize *

@item 
@code{Py_ADJUST_ERANGE1()}

@item 
@code{Py_ADJUST_ERANGE2()}

@item 
@code{Py_OVERFLOWED()}

@item 
@code{Py_SET_ERANGE_IF_OVERFLOW()}

@item 
@code{Py_SET_ERRNO_ON_MATH_ERROR()}
@end itemize

Patch by Victor Stinner.

@item 
bpo-45395@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45395}: Custom frozen modules (the array set to
@code{PyImport_FrozenModules}) are now treated as additions, rather than
replacing all the default frozen modules. Frozen stdlib modules can still
be disabled by setting the “code” field of the custom array entry to NULL.

@item 
bpo-43760@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43760}: Add new @ref{959,,PyThreadState_EnterTracing()}, and
@ref{95a,,PyThreadState_LeaveTracing()} functions to the limited C API to
suspend and resume tracing and profiling. Patch by Victor Stinner.

@item 
bpo-44220@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44220}: @ref{b78,,PyStructSequence_UnnamedField} is added to the Stable
ABI.
@end itemize

@node Python 3 11 0 alpha 1,Python 3 10 0 beta 1,Python 3 11 0 alpha 2,Changelog
@anchor{whatsnew/changelog python-3-11-0-alpha-1}@anchor{1c2c}
@subsection Python 3.11.0 alpha 1


`Release date: 2021-10-05'

@menu
* Security: Security<30>. 
* Core and Builtins: Core and Builtins<104>. 
* Library: Library<107>. 
* Core and Builtins: Core and Builtins<105>. 
* Library: Library<108>. 
* Core and Builtins: Core and Builtins<106>. 
* Library: Library<109>. 
* Core and Builtins: Core and Builtins<107>. 
* Library: Library<110>. 
* Core and Builtins: Core and Builtins<108>. 
* Library: Library<111>. 
* Core and Builtins: Core and Builtins<109>. 
* Library: Library<112>. 
* Core and Builtins: Core and Builtins<110>. 
* Library: Library<113>. 
* Core and Builtins: Core and Builtins<111>. 
* Library: Library<114>. 
* Core and Builtins: Core and Builtins<112>. 
* Library: Library<115>. 
* Core and Builtins: Core and Builtins<113>. 
* Library: Library<116>. 
* Documentation: Documentation<36>. 
* Tests: Tests<36>. 
* Build: Build<43>. 
* Windows: Windows<37>. 
* macOS: macOS<27>. 
* IDLE: IDLE<19>. 
* Tools/Demos: Tools/Demos<27>. 
* C API: C API<38>. 

@end menu

@node Security<30>,Core and Builtins<104>,,Python 3 11 0 alpha 1
@anchor{whatsnew/changelog id484}@anchor{1c2d}
@subsubsection Security



@itemize -

@item 
bpo-42278@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42278}: Replaced usage of @ref{1c2e,,tempfile.mktemp()} with
@ref{1439,,TemporaryDirectory} to avoid a potential race condition.

@item 
bpo-44600@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44600}: Fix incorrect line numbers while tracing some failed patterns
in @ref{a0e,,match} statements. Patch by Charles Burkland.

@item 
bpo-41180@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41180}: Add auditing events to the @ref{91,,marshal} module, and stop
raising @code{code.__init__} events for every unmarshalled code object.
Directly instantiated code objects will continue to raise an event, and
audit event handlers should inspect or collect the raw marshal data. This
reduces a significant performance overhead when loading from @code{.pyc}
files.

@item 
bpo-44394@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44394}: Update the vendored copy of libexpat to 2.4.1 (from 2.2.8) to
get the fix for the 
@geindex Common Vulnerabilities and Exposures; CVE 2013-0340
CVE 2013-0340@footnote{https://www.cve.org/CVERecord?id=CVE-2013-0340} “Billion Laughs” vulnerability. This
copy is most used on Windows and macOS.

@item 
bpo-43124@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43124}: Made the internal @code{putcmd} function in @ref{cf,,smtplib}
sanitize input for presence of @code{\r} and @code{\n} characters to avoid
(unlikely) command injection.

@item 
bpo-44022@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44022}: @ref{73,,http.client} now avoids infinitely reading potential HTTP
headers after a @code{100 Continue} status response from the server.
@end itemize

@node Core and Builtins<104>,Library<107>,Security<30>,Python 3 11 0 alpha 1
@anchor{whatsnew/changelog id485}@anchor{1c2f}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-43760@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43760}: The number of hardware branches per instruction dispatch is
reduced from two to one by adding a special instruction for tracing. Patch
by Mark Shannon.

@item 
bpo-45061@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45061}: Add a deallocator to the bool type to detect refcount bugs in C
extensions which call Py_DECREF(Py_True) or Py_DECREF(Py_False) by
mistake. Detect also refcount bugs when the empty tuple singleton or the
Unicode empty string singleton is destroyed by mistake. Patch by Victor
Stinner.

@item 
bpo-24076@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24076}: sum() was further optimised for summing up single digit
integers.

@item 
bpo-45190@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45190}: Update Unicode databases to Unicode 14.0.0.

@item 
bpo-45167@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45167}: Fix deepcopying of @ref{9ec,,types.GenericAlias} objects.

@item 
bpo-45155@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45155}: @ref{1c30,,int.to_bytes()} and @ref{1be7,,int.from_bytes()} now take a
default value of @code{"big"} for the @code{byteorder} argument.
@code{int.to_bytes()} also takes a default value of @code{1} for the
@code{length} argument.
@end itemize

@node Library<107>,Core and Builtins<105>,Core and Builtins<104>,Python 3 11 0 alpha 1
@anchor{whatsnew/changelog id486}@anchor{1c31}
@subsubsection Library



@itemize -

@item 
bpo-44219@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44219}: Release the GIL while performing @code{isatty} system calls on
arbitrary file descriptors. In particular, this affects @ref{1c32,,os.isatty()},
@ref{1c33,,os.device_encoding()} and @ref{9be,,io.TextIOWrapper}. By extension,
@ref{73f,,io.open()} in text mode is also affected. This change solves a
deadlock in @code{os.isatty()}. Patch by Vincent Michel in bpo-44219@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44219}.
@end itemize

@node Core and Builtins<105>,Library<108>,Library<107>,Python 3 11 0 alpha 1
@anchor{whatsnew/changelog id487}@anchor{1c34}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-44959@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44959}: Added fallback to extension modules with ‘.sl’ suffix on HP-UX
@end itemize

@node Library<108>,Core and Builtins<106>,Core and Builtins<105>,Python 3 11 0 alpha 1
@anchor{whatsnew/changelog id488}@anchor{1c35}
@subsubsection Library



@itemize -

@item 
bpo-45121@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45121}: Fix issue where @code{Protocol.__init__} raises @code{RecursionError}
when it’s called directly or via @code{super()}. Patch provided by Yurii
Karabas.
@end itemize

@node Core and Builtins<106>,Library<109>,Library<108>,Python 3 11 0 alpha 1
@anchor{whatsnew/changelog id489}@anchor{1c36}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-44348@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44348}: The deallocator function of the @ref{7d6,,BaseException} type now
uses the trashcan mechanism to prevent stack overflow. For example, when a
@ref{f67,,RecursionError} instance is raised, it can be linked to another
RecursionError through the @code{__context__} attribute or the
@code{__traceback__} attribute, and then a chain of exceptions is created.
When the chain is destroyed, nested deallocator function calls can crash
with a stack overflow if the chain is too long compared to the available
stack memory. Patch by Victor Stinner.

@item 
bpo-45123@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45123}: Fix PyAiter_Check to only check for the __anext__ presence (not
for __aiter__). Rename PyAiter_Check to PyAIter_Check, PyObject_GetAiter
-> PyObject_GetAIter.

@item 
bpo-1514420@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1514420}: Interpreter no longer attempts to open files with names in
angle brackets (like “<string>” or “<stdin>”) when formatting an
exception.

@item 
bpo-41031@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41031}: Match C and Python code formatting of unprintable exceptions
and exceptions in the @ref{1,,__main__} module.

@item 
bpo-37330@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37330}: @ref{316,,open()}, @ref{73f,,io.open()}, @ref{315,,codecs.open()} and
@ref{93f,,fileinput.FileInput} no longer accept @code{'U'} (“universal
newline”) in the file mode. This flag was deprecated since Python 3.3.
Patch by Victor Stinner.

@item 
bpo-45083@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45083}: When the interpreter renders an exception, its name now has a
complete qualname. Previously only the class name was concatenated to the
module name, which sometimes resulted in an incorrect full name being
displayed.

(This issue impacted only the C code exception rendering, the
@ref{104,,traceback} module was using qualname already).

@item 
bpo-34561@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34561}: List sorting now uses the merge-ordering strategy from Munro
and Wild’s @code{powersort()}. Unlike the former strategy, this is provably
near-optimal in the entropy of the distribution of run lengths. Most uses
of @code{list.sort()} probably won’t see a significant time difference, but
may see significant improvements in cases where the former strategy was
exceptionally poor. However, as these are all fast linear-time
approximations to a problem that’s inherently at best quadratic-time to
solve truly optimally, it’s also possible to contrive cases where the
former strategy did better.

@item 
bpo-45056@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45056}: Compiler now removes trailing unused constants from co_consts.

@item 
bpo-45020@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45020}: Add a new command line option, “-X frozen_modules=[on|off]” to
opt out of (or into) using optional frozen modules.  This defaults to “on”
(or “off” if it’s running out of the source tree).
@end itemize

@node Library<109>,Core and Builtins<107>,Core and Builtins<106>,Python 3 11 0 alpha 1
@anchor{whatsnew/changelog id490}@anchor{1c37}
@subsubsection Library



@itemize -

@item 
bpo-45012@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45012}: In @ref{b2,,posix}, release GIL during @code{stat()}, @code{lstat()},
and @code{fstatat()} syscalls made by @ref{1a6b,,os.DirEntry.stat()}. Patch by
Stanisław Skonieczny.
@end itemize

@node Core and Builtins<107>,Library<110>,Library<109>,Python 3 11 0 alpha 1
@anchor{whatsnew/changelog id491}@anchor{1c38}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-45018@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45018}: Fixed pickling of range iterators that iterated for over
@code{2**32} times.

@item 
bpo-45000@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45000}: A @ref{18e,,SyntaxError} is now raised when trying to delete
@ref{9da,,__debug__}. Patch by Donghee Na.

@item 
bpo-44963@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44963}: Implement @code{send()} and @code{throw()} methods for
@code{anext_awaitable} objects. Patch by Pablo Galindo.
@end itemize

@node Library<110>,Core and Builtins<108>,Core and Builtins<107>,Python 3 11 0 alpha 1
@anchor{whatsnew/changelog id492}@anchor{1c39}
@subsubsection Library



@itemize -

@item 
bpo-44962@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44962}: Fix a race in WeakKeyDictionary, WeakValueDictionary and
WeakSet when two threads attempt to commit the last pending removal. This
fixes asyncio.create_task and fixes a data loss in asyncio.run where
shutdown_asyncgens is not run
@end itemize

@node Core and Builtins<108>,Library<111>,Library<110>,Python 3 11 0 alpha 1
@anchor{whatsnew/changelog id493}@anchor{1c3a}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-24234@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24234}: Implement the @code{__bytes__()} special method on the
@ref{192,,bytes} type, so a bytes object @code{b}  passes an @code{isinstance(b,
typing.SupportsBytes)} check.

@item 
bpo-24234@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24234}: Implement the @code{__complex__()} special method on the
@ref{197,,complex} type, so a complex number @code{z} passes an @code{isinstance(z,
typing.SupportsComplex)} check.

@item 
bpo-44954@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44954}: Fixed a corner case bug where the result of
@code{float.fromhex('0x.8p-1074')} was rounded the wrong way.

@item 
bpo-44947@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44947}: Refine the syntax error for trailing commas in import
statements. Patch by Pablo Galindo.

@item 
bpo-44945@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44945}: Specialize the BINARY_ADD instruction using the PEP 659
machinery. Adds five new instructions:


@itemize *

@item 
BINARY_ADD_ADAPTIVE

@item 
BINARY_ADD_FLOAT

@item 
BINARY_ADD_INT

@item 
BINARY_ADD_UNICODE

@item 
BINARY_ADD_UNICODE_INPLACE_FAST
@end itemize
@end itemize

@node Library<111>,Core and Builtins<109>,Core and Builtins<108>,Python 3 11 0 alpha 1
@anchor{whatsnew/changelog id494}@anchor{1c3b}
@subsubsection Library



@itemize -

@item 
bpo-44929@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44929}: Fix some edge cases of @code{enum.Flag} string representation in
the REPL. Patch by Pablo Galindo.
@end itemize

@node Core and Builtins<109>,Library<112>,Library<111>,Python 3 11 0 alpha 1
@anchor{whatsnew/changelog id495}@anchor{1c3c}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-44914@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44914}: Class version tags are no longer recycled.

This means that a version tag serves as a unique identifier for the state
of a class. We rely on this for effective specialization of the LOAD_ATTR
and other instructions.

@item 
bpo-44698@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44698}: Restore behaviour of complex exponentiation with integer-valued
exponent of type @ref{196,,float} or @ref{197,,complex}.

@item 
bpo-44895@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44895}: A debug variable 
@geindex PYTHONDUMPREFSFILE
@geindex 환경 변수; PYTHONDUMPREFSFILE
@ref{1c3d,,PYTHONDUMPREFSFILE} is added for
creating a dump file which is generated by @ref{634,,--with-trace-refs}.
Patch by Donghee Na.

@item 
bpo-44900@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44900}: Add five superinstructions for PEP 659 quickening:


@itemize *

@item 
LOAD_FAST LOAD_FAST

@item 
STORE_FAST LOAD_FAST

@item 
LOAD_FAST LOAD_CONST

@item 
LOAD_CONST LOAD_FAST

@item 
STORE_FAST STORE_FAST
@end itemize

@item 
bpo-44889@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44889}: Initial implementation of adaptive specialization of
@code{LOAD_METHOD}. The following specialized forms were added:


@itemize *

@item 
@code{LOAD_METHOD_CACHED}

@item 
@code{LOAD_METHOD_MODULE}

@item 
@code{LOAD_METHOD_CLASS}
@end itemize

@item 
bpo-44890@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44890}: Specialization stats are always collected in debug builds.

@item 
bpo-44885@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44885}: Correct the ast locations of f-strings with format specs and
repeated expressions. Patch by Pablo Galindo

@item 
bpo-44878@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44878}: Remove the loop from the bytecode interpreter. All instructions
end with a DISPATCH macro, so the loop is now redundant.

@item 
bpo-44878@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44878}: Remove switch statement for interpreter loop when using
computed gotos. This makes sure that we only have one dispatch table in
the interpreter.

@item 
bpo-44874@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44874}: Deprecate the old trashcan macros
(@code{Py_TRASHCAN_SAFE_BEGIN}/@code{Py_TRASHCAN_SAFE_END}). They should be
replaced by the new macros @code{Py_TRASHCAN_BEGIN} and @code{Py_TRASHCAN_END}.

@item 
bpo-44872@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44872}: Use new trashcan macros (Py_TRASHCAN_BEGIN/END) in
frameobject.c instead of the old ones (Py_TRASHCAN_SAFE_BEGIN/END).

@item 
bpo-33930@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33930}: Fix segmentation fault with deep recursion when cleaning method
objects. Patch by Augusto Goulart and Pablo Galindo.

@item 
bpo-25782@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25782}: Fix bug where @code{PyErr_SetObject} hangs when the current
exception has a cycle in its context chain.

@item 
bpo-44856@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44856}: Fix reference leaks in the error paths of @code{update_bases()}
and @code{__build_class__}. Patch by Pablo Galindo.

@item 
bpo-44826@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44826}: Initial implementation of adaptive specialization of STORE_ATTR

Three specialized forms of STORE_ATTR are added:


@itemize *

@item 
STORE_ATTR_SLOT

@item 
STORE_ATTR_SPLIT_KEYS

@item 
STORE_ATTR_WITH_HINT
@end itemize

@item 
bpo-44838@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44838}: Fixed a bug that was causing the parser to raise an incorrect
custom @ref{18e,,SyntaxError} for invalid ‘if’ expressions. Patch by Pablo
Galindo.

@item 
bpo-44821@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44821}: Create instance dictionaries (__dict__) eagerly, to improve
regularity of object layout and assist specialization.

@item 
bpo-44792@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44792}: Improve syntax errors for if expressions. Patch by Miguel Brito

@item 
bpo-34013@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34013}: Generalize the invalid legacy statement custom error message
(like the one generated when “print” is called without parentheses) to
include more generic expressions. Patch by Pablo Galindo

@item 
bpo-44732@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44732}: Rename @code{types.Union} to @code{types.UnionType}.

@item 
bpo-44725@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44725}: Expose specialization stats in python via
@code{_opcode.get_specialization_stats()}.

@item 
bpo-44717@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44717}: Improve AttributeError on circular imports of submodules.

@item 
bpo-44698@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44698}: Fix undefined behaviour in complex object exponentiation.

@item 
bpo-44653@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44653}: Support @ref{10a,,typing} types in parameter substitution in the
union type.

@item 
bpo-44676@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44676}: Add ability to serialise @code{types.Union} objects. Patch
provided by Yurii Karabas.

@item 
bpo-44633@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44633}: Parameter substitution of the union type with wrong types now
raises @code{TypeError} instead of returning @ref{1a2,,NotImplemented}.

@item 
bpo-44661@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44661}: Update @code{property_descr_set} to use vectorcall if possible.
Patch by Donghee Na.

@item 
bpo-44662@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44662}: Add @code{__module__} to @code{types.Union}. This also fixes
@code{types.Union} issues with @code{typing.Annotated}. Patch provided by Yurii
Karabas.

@item 
bpo-44655@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44655}: Include the name of the type in unset __slots__ attribute
errors. Patch by Pablo Galindo

@item 
bpo-44655@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44655}: Don’t include a missing attribute with the same name as the
failing one when offering suggestions for missing attributes. Patch by
Pablo Galindo

@item 
bpo-44646@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44646}: Fix the hash of the union type: it no longer depends on the
order of arguments.

@item 
bpo-44636@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44636}: Collapse union of equal types. E.g. the result of @code{int | int}
is now @code{int}. Fix comparison of the union type with non-hashable
objects. E.g. @code{int | str == @{@}} no longer raises a TypeError.
@end itemize

@node Library<112>,Core and Builtins<110>,Core and Builtins<109>,Python 3 11 0 alpha 1
@anchor{whatsnew/changelog id496}@anchor{1c3e}
@subsubsection Library



@itemize -

@item 
bpo-44611@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44611}: On Windows, @ref{745,,os.urandom()}: uses BCryptGenRandom API
instead of CryptGenRandom API which is deprecated from Microsoft Windows
API. Patch by Donghee Na.
@end itemize

@node Core and Builtins<110>,Library<113>,Library<112>,Python 3 11 0 alpha 1
@anchor{whatsnew/changelog id497}@anchor{1c3f}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-44635@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44635}: Convert @code{None} to @code{type(None)} in the union type
constructor.

@item 
bpo-26280@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26280}: Implement adaptive specialization for BINARY_SUBSCR

Three specialized forms of BINARY_SUBSCR are added:


@itemize *

@item 
BINARY_SUBSCR_LIST_INT

@item 
BINARY_SUBSCR_TUPLE_INT

@item 
BINARY_SUBSCR_DICT
@end itemize

@item 
bpo-44589@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44589}: Mapping patterns in @code{match} statements with two or more equal
literal keys will now raise a @ref{18e,,SyntaxError} at compile-time.

@item 
bpo-44606@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44606}: Fix @code{__instancecheck__} and @code{__subclasscheck__} for the
union type.

@item 
bpo-42073@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42073}: The @code{@@classmethod} decorator can now wrap other
classmethod-like descriptors.

@item 
bpo-41972@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41972}: Tuned the string-searching algorithm of fastsearch.h to have a
shorter inner loop for most cases.

@item 
bpo-44590@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44590}: All necessary data for executing a Python function (local
variables, stack, etc) is now kept in a per-thread stack. Frame objects
are lazily allocated on demand. This increases performance by about 7% on
the standard benchmark suite. Introspection and debugging are unaffected
as frame objects are always available when needed. Patch by Mark Shannon.

@item 
bpo-44584@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44584}: The threading debug (@code{PYTHONTHREADDEBUG} environment
variable) is deprecated in Python 3.10 and will be removed in Python 3.12.
This feature requires a debug build of Python. Patch by Victor Stinner.

@item 
bpo-43895@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43895}: An obsolete internal cache of shared object file handles added
in 1995 that attempted, but did not guarantee, that a .so would not be
dlopen’ed twice to work around flaws in mid-1990s posix-ish operating
systems has been removed from dynload_shlib.c.
@end itemize

@node Library<113>,Core and Builtins<111>,Core and Builtins<110>,Python 3 11 0 alpha 1
@anchor{whatsnew/changelog id498}@anchor{1c40}
@subsubsection Library



@itemize -

@item 
bpo-44490@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44490}: @ref{10a,,typing} now searches for type parameters in
@code{types.Union} objects. @code{get_type_hints} will also properly resolve
annotations with nested @code{types.Union} objects. Patch provided by Yurii
Karabas.
@end itemize

@node Core and Builtins<111>,Library<114>,Library<113>,Python 3 11 0 alpha 1
@anchor{whatsnew/changelog id499}@anchor{1c41}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-43950@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43950}: Code objects can now provide the column information for
instructions when available. This is levaraged during traceback printing
to show the expressions responsible for errors.

Contributed by Pablo Galindo, Batuhan Taskaya and Ammar Askar as part of
@geindex Python 향상 제안; PEP 657
PEP 657@footnote{https://peps.python.org/pep-0657/}.

@item 
bpo-44562@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44562}: Remove uses of @ref{1708,,PyObject_GC_Del()} in error path when
initializing @ref{9ec,,types.GenericAlias}.
@end itemize

@node Library<114>,Core and Builtins<112>,Core and Builtins<111>,Python 3 11 0 alpha 1
@anchor{whatsnew/changelog id500}@anchor{1c42}
@subsubsection Library



@itemize -

@item 
bpo-41486@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41486}: Fix a memory consumption and copying performance regression in
earlier 3.10 beta releases if someone used an output buffer larger than
4GiB with zlib.decompress on input data that expands that large.
@end itemize

@node Core and Builtins<112>,Library<115>,Library<114>,Python 3 11 0 alpha 1
@anchor{whatsnew/changelog id501}@anchor{1c43}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-43908@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43908}: Heap types with the @ref{3cf,,Py_TPFLAGS_IMMUTABLETYPE} flag
can now inherit the 
@geindex Python 향상 제안; PEP 590
PEP 590@footnote{https://peps.python.org/pep-0590/} vectorcall protocol.  Previously, this was
only possible for @ref{982,,static types}.  Patch by Erlend E.
Aasland.

@item 
bpo-44553@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44553}: Implement GC methods for @code{types.Union} to break reference
cycles and prevent memory leaks.

@item 
bpo-44490@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44490}: Add @code{__parameters__} attribute and @code{__getitem__} operator
to @code{types.Union}. Patch provided by Yurii Karabas.

@item 
bpo-44523@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44523}: Remove the pass-through for @ref{800,,hash()} of
@ref{c45,,weakref.proxy} objects to prevent unintended consequences when the
original referred object dies while the proxy is part of a hashable
object. Patch by Pablo Galindo.

@item 
bpo-44483@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44483}: Fix a crash in @code{types.Union} objects when creating a union of
an object with bad @code{__module__} field.

@item 
bpo-44486@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44486}: Modules will always have a dictionary, even when created by
@code{types.ModuleType.__new__()}

@item 
bpo-44472@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44472}: Fix ltrace functionality when exceptions are raised. Patch by
Pablo Galindo

@item 
bpo-12022@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12022}: A @ref{198,,TypeError} is now raised instead of an
@ref{5ee,,AttributeError} in @ref{186,,with} and @ref{185,,async with}
statements for objects which do not support the @ref{1e1,,context manager} or
@ref{7ef,,asynchronous context manager} protocols correspondingly.

@item 
bpo-44297@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44297}: Make sure that the line number is set when entering a
comprehension scope. This ensures that backtraces including generator
expressions show the correct line number.

@item 
bpo-44456@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44456}: Improve the syntax error when mixing positional and keyword
patterns. Patch by Pablo Galindo.

@item 
bpo-44409@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44409}: Fix error location information for tokenizer errors raised on
initialization of the tokenizer. Patch by Pablo Galindo.

@item 
bpo-44396@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44396}: Fix a possible crash in the tokenizer when raising syntax
errors for unclosed strings. Patch by Pablo Galindo.

@item 
bpo-44376@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44376}: Exact integer exponentiation (like @code{i**2} or @code{pow(i, 2)})
with a small exponent is much faster, due to reducing overhead in such
cases.

@item 
bpo-44313@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44313}: Directly imported objects and modules (through import and from
import statements) don’t generate @code{LOAD_METHOD}/@code{CALL_METHOD} for
directly accessed objects on their namespace. They now use the regular
@code{LOAD_ATTR}/@code{CALL_FUNCTION}.

@item 
bpo-44338@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44338}: Implement adaptive specialization for LOAD_GLOBAL

Two specialized forms of LOAD_GLOBAL are added:


@itemize *

@item 
LOAD_GLOBAL_MODULE

@item 
LOAD_GLOBAL_BUILTIN
@end itemize

@item 
bpo-44368@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44368}: Improve syntax errors for invalid “as” targets. Patch by Pablo
Galindo

@item 
bpo-44349@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44349}: Fix an edge case when displaying text from files with encoding
in syntax errors. Patch by Pablo Galindo.

@item 
bpo-44337@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44337}: Initial implementation of adaptive specialization of LOAD_ATTR

Four specialized forms of LOAD_ATTR are added:


@itemize *

@item 
LOAD_ATTR_SLOT

@item 
LOAD_ATTR_SPLIT_KEYS

@item 
LOAD_ATTR_WITH_HINT

@item 
LOAD_ATTR_MODULE
@end itemize

@item 
bpo-44335@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44335}: Fix a regression when identifying incorrect characters in
syntax errors. Patch by Pablo Galindo

@item 
bpo-43693@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43693}: Computation of the offsets of cell variables is done in the
compiler instead of at runtime. This reduces the overhead of handling cell
and free variables, especially in the case where a variable is both an
argument and cell variable.

@item 
bpo-44317@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44317}: Improve tokenizer error with improved locations. Patch by Pablo
Galindo.
@end itemize

@node Library<115>,Core and Builtins<113>,Core and Builtins<112>,Python 3 11 0 alpha 1
@anchor{whatsnew/changelog id502}@anchor{1c44}
@subsubsection Library



@itemize -

@item 
bpo-44304@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44304}: Fix a crash in the @ref{d4,,sqlite3} module that happened when the
garbage collector clears @code{sqlite.Statement} objects. Patch by Pablo
Galindo
@end itemize

@node Core and Builtins<113>,Library<116>,Library<115>,Python 3 11 0 alpha 1
@anchor{whatsnew/changelog id503}@anchor{1c45}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-44305@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44305}: Improve error message for @code{try} blocks without @code{except} or
@code{finally} blocks. Patch by Pablo Galindo.

@item 
bpo-43413@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43413}: Constructors of subclasses of some builtin classes (e.g.
@ref{610,,tuple}, @ref{24d,,list}, @ref{7f1,,frozenset}) no longer accept
arbitrary keyword arguments. [reverted in 3.11a4] Subclass of @ref{184,,set}
can now define a @code{__new__()} method with additional keyword parameters
without overriding also @code{__init__()}.

@item 
bpo-43667@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43667}: Improve Unicode support in non-UTF locales on Oracle Solaris.
This issue does not affect other Solaris systems.

@item 
bpo-43693@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43693}: A new opcode MAKE_CELL has been added that effectively moves
some of the work done on function entry into the compiler and into the
eval loop.  In addition to creating the required cell objects, the new
opcode converts relevant arguments (and other locals) to cell variables on
function entry.

@item 
bpo-44232@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44232}: Fix a regression in @ref{f43,,type()} when a metaclass raises an
exception. The C function @code{type_new()} must properly report the
exception when a metaclass constructor raises an exception and the winner
class is not the metaclass. Patch by Victor Stinner.

@item 
bpo-44201@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44201}: Avoid side effects of checking for specialized syntax errors in
the REPL that was causing it to ask for extra tokens after a syntax error
had been detected. Patch by Pablo Galindo

@item 
bpo-43693@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43693}: @code{PyCodeObject} gained @code{co_fastlocalnames} and
@code{co_fastlocalkinds} as the authoritative source of fast locals info.
Marshaled code objects have changed accordingly.

@item 
bpo-44184@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44184}: Fix a crash at Python exit when a deallocator function removes
the last strong reference to a heap type. Patch by Victor Stinner.

@item 
bpo-44187@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44187}: Implement quickening in the interpreter. This offers no
advantages as yet, but is an enabler of future optimizations. See PEP 659
for full explanation.

@item 
bpo-44180@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44180}: The parser doesn’t report generic syntax errors that happen in
a position further away that the one it reached in the first pass. Patch
by Pablo Galindo

@item 
bpo-44168@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44168}: Fix error message in the parser involving keyword arguments
with invalid expressions. Patch by Pablo Galindo

@item 
bpo-44156@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44156}: String caches in @code{compile.c} are now subinterpreter
compatible.

@item 
bpo-44143@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44143}: Fixed a crash in the parser that manifest when raising
tokenizer errors when an existing exception was present. Patch by Pablo
Galindo.

@item 
bpo-44032@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44032}: Move ‘fast’ locals and other variables from the frame object to
a per-thread datastack.

@item 
bpo-44114@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44114}: Fix incorrect dictkeys_reversed and dictitems_reversed function
signatures in C code, which broke webassembly builds.

@item 
bpo-44110@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44110}: Improve @code{str.__getitem__()} error message

@item 
bpo-26110@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26110}: Add @code{CALL_METHOD_KW} opcode to speed up method calls with
keyword arguments.  Idea originated from PyPy.  A side effect is executing
@code{CALL_METHOD} is now branchless in the evaluation loop.

@item 
bpo-28307@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28307}: Compiler now optimizes simple C-style formatting with literal
format containing only format codes %s, %r and %a by converting them to
f-string expressions.

@item 
bpo-43149@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43149}: Correct the syntax error message regarding multiple exception
types to not refer to “exception groups”. Patch by Pablo Galindo

@item 
bpo-43822@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43822}: The parser will prioritize tokenizer errors over custom syntax
errors when raising exceptions. Patch by Pablo Galindo.

@item 
bpo-40222@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40222}: “Zero cost” exception handling.


@itemize *

@item 
Uses a lookup table to determine how to handle exceptions.

@item 
Removes SETUP_FINALLY and POP_TOP block instructions, eliminating the runtime overhead of try statements.

@item 
Reduces the size of the frame object by about 60%.
@end itemize

Patch by Mark Shannon

@item 
bpo-43918@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43918}: Document the signature and @code{default} argument in the
docstring of the new @code{anext} builtin.

@item 
bpo-43833@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43833}: Emit a deprecation warning if the numeric literal is
immediately followed by one of keywords: and, else, for, if, in, is, or.
Raise a syntax error with more informative message if it is immediately
followed by other keyword or identifier.

@item 
bpo-43879@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43879}: Add native_thread_id to PyThreadState. Patch by Gabriele N.
Tornetta.

@item 
bpo-43693@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43693}: Compute cell offsets relative to locals in compiler. Allows the
interpreter to treats locals and cells a single array, which is slightly
more efficient. Also make the LOAD_CLOSURE opcode an alias for LOAD_FAST.
Preserving LOAD_CLOSURE helps keep bytecode a bit more readable.

@item 
bpo-17792@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17792}: More accurate error messages for access of unbound locals or
free vars.

@item 
bpo-28146@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28146}: Fix a confusing error message in @ref{832,,str.format()}.

@item 
bpo-11105@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11105}: When compiling @ref{4c5,,ast.AST} objects with recursive
references through @ref{4b2,,compile()}, the interpreter doesn’t crash anymore
instead it raises a @ref{f67,,RecursionError}.

@item 
bpo-39091@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39091}: Fix crash when using passing a non-exception to a generator’s
@code{throw()} method. Patch by Noah Oxer

@item 
bpo-33346@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33346}: Asynchronous comprehensions are now allowed inside
comprehensions in asynchronous functions.  Outer comprehensions implicitly
become asynchronous.
@end itemize

@node Library<116>,Documentation<36>,Core and Builtins<113>,Python 3 11 0 alpha 1
@anchor{whatsnew/changelog id504}@anchor{1c46}
@subsubsection Library



@itemize -

@item 
bpo-45371@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45371}: Fix clang rpath issue in @code{distutils}. The UnixCCompiler now
uses correct clang option to add a runtime library directory (rpath) to a
shared library.

@item 
bpo-45329@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45329}: Fix freed memory access in @code{pyexpat.xmlparser} when
building it with an installed expat library <= 2.2.0.

@item 
bpo-41710@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41710}: On Unix, if the @code{sem_clockwait()} function is available in
the C library (glibc 2.30 and newer), the @ref{8a6,,threading.Lock.acquire()}
method now uses the monotonic clock (@ref{8a7,,time.CLOCK_MONOTONIC}) for
the timeout, rather than using the system clock
(@ref{8a8,,time.CLOCK_REALTIME}), to not be affected by system clock
changes. Patch by Victor Stinner.

@item 
bpo-1596321@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1596321}: Fix the @code{threading._shutdown()} function when the
@ref{f3,,threading} module was imported first from a thread different than
the main thread: no longer log an error at Python exit.

@item 
bpo-45274@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45274}: Fix a race condition in the @ref{13e9,,Thread.join()} method of the @ref{f3,,threading} module. If the
function is interrupted by a signal and the signal handler raises an
exception, make sure that the thread remains in a consistent state to
prevent a deadlock. Patch by Victor Stinner.

@item 
bpo-21302@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21302}: In Unix operating systems, @ref{8ab,,time.sleep()} now uses the
@code{nanosleep()} function, if @code{clock_nanosleep()} is not available but
@code{nanosleep()} is available. @code{nanosleep()} allows to sleep with
nanosecond precision.

@item 
bpo-21302@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21302}: On Windows, @ref{8ab,,time.sleep()} now uses a waitable timer which
has a resolution of 100 nanoseconds (10@w{^-7} seconds). Previously,
it had a resolution of 1 millisecond (10@w{^-3} seconds). Patch by
Benjamin Szőke and Victor Stinner.

@item 
bpo-45238@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45238}: Fix @code{unittest.IsolatedAsyncioTestCase.debug()}: it runs now
asynchronous methods and callbacks.

@item 
bpo-36674@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36674}: @ref{1c47,,unittest.TestCase.debug()} raises now a
@ref{11e3,,unittest.SkipTest} if the class or the test method are decorated
with the skipping decorator.

@item 
bpo-45235@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45235}: Fix an issue where argparse would not preserve values in a
provided namespace when using a subparser with defaults.

@item 
bpo-45183@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45183}: Have zipimport.zipimporter.find_spec() not raise an exception
when the underlying zip file has been deleted and the internal cache has
been reset via invalidate_cache().

@item 
bpo-45234@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45234}: Fixed a regression in @ref{c4d,,copyfile()},
@ref{c4e,,copy()}, @ref{c4f,,copy2()} raising
@ref{264,,FileNotFoundError} when source is a directory, which should raise
@ref{1258,,IsADirectoryError}

@item 
bpo-45228@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45228}: Fix stack buffer overflow in parsing J1939 network address.

@item 
bpo-45225@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45225}: use map function instead of genexpr in capwords.

@item 
bpo-42135@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42135}: Fix typo: @code{importlib.find_loader} is really slated for
removal in Python 3.12 not 3.10, like the others in PR 25169.

Patch by Hugo van Kemenade.

@item 
bpo-20524@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20524}: Improves error messages on @code{.format()} operation for @code{str},
@code{float}, @code{int}, and @code{complex}. New format now shows the problematic
pattern and the object type.

@item 
bpo-45168@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45168}: Change @ref{205,,dis.dis()} output to omit op arg values that cannot
be resolved due to @code{co_consts}, @code{co_names} etc not being provided.
Previously the oparg itself was repeated in the value field, which is not
useful and can be confusing.

@item 
bpo-21302@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21302}: In Unix operating systems, @ref{8ab,,time.sleep()} now uses the
@code{clock_nanosleep()} function, if available, which allows to sleep for an
interval specified with nanosecond precision.

@item 
bpo-45173@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45173}: Remove from the @ref{26,,configparser} module: the
@code{SafeConfigParser} class, the @code{filename} property of the
@ref{728,,ParsingError} class, the @code{readfp()} method of
the @ref{4de,,ConfigParser} class, deprecated since Python
3.2.

Patch by Hugo van Kemenade.

@item 
bpo-44987@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44987}: Pure ASCII strings are now normalized in constant time by
@ref{8e3,,unicodedata.normalize()}. Patch by Donghee Na.

@item 
bpo-35474@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35474}: Calling @ref{1c48,,mimetypes.guess_all_extensions()} with
@code{strict=False} no longer affects the result of the following call with
@code{strict=True}. Also, mutating the returned list no longer affects the
global state.

@item 
bpo-45166@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45166}: @ref{8bf,,typing.get_type_hints()} now works with
@ref{56d,,Final} wrapped in @ref{1bd8,,ForwardRef}.

@item 
bpo-45162@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45162}: Remove many old deprecated @ref{10c,,unittest} features:


@itemize *

@item 
“@code{fail*}” and “@code{assert*}” aliases of @ref{2b3,,TestCase} methods.

@item 
Broken from start @ref{2b3,,TestCase} method @code{assertDictContainsSubset()}.

@item 
Ignored @code{<unittest.TestLoader.loadTestsFromModule> TestLoader.loadTestsFromModule()} parameter `use_load_tests'.

@item 
Old alias @code{_TextTestResult} of @ref{753,,TextTestResult}.
@end itemize

@item 
bpo-38371@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38371}: Remove the deprecated @code{split()} method of
@code{_tkinter.TkappType}. Patch by Erlend E. Aasland.

@item 
bpo-20499@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20499}: Improve the speed and accuracy of statistics.pvariance().

@item 
bpo-45132@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45132}: Remove @ref{588,,__getitem__()} methods of
@ref{93d,,xml.dom.pulldom.DOMEventStream}, @ref{93e,,wsgiref.util.FileWrapper}
and @ref{93f,,fileinput.FileInput}, deprecated since Python 3.9.

Patch by Hugo van Kemenade.

@item 
bpo-45129@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45129}: Due to significant security concerns, the `reuse_address'
parameter of @ref{93b,,asyncio.loop.create_datagram_endpoint()}, disabled in
Python 3.9, is now entirely removed. This is because of the behavior of
the socket option @code{SO_REUSEADDR} in UDP.

Patch by Hugo van Kemenade.

@item 
bpo-45124@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45124}: The @code{bdist_msi} command, deprecated in Python 3.9, is now
removed.

Use @code{bdist_wheel} (wheel packages) instead.

Patch by Hugo van Kemenade.

@item 
bpo-30856@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30856}: @ref{136c,,unittest.TestResult} methods
@ref{1c49,,addFailure()},
@ref{1c4a,,addError()},
@ref{1c4b,,addSkip()} and
@ref{1c4c,,addSubTest()} are now called immediately after
raising an exception in test or finishing a subtest. Previously they were
called only after finishing the test clean up.

@item 
bpo-45034@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45034}: Changes how error is formatted for @code{struct.pack} with @code{'H'}
and @code{'h'} modes and too large / small numbers. Now it shows the actual
numeric limits, while previously it was showing arithmetic expressions.

@item 
bpo-25894@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25894}: @ref{10c,,unittest} now always reports skipped and failed subtests
separately: separate characters in default mode and separate lines in
verbose mode. Also the test description is now output for errors in test
method, class and module cleanups.

@item 
bpo-45081@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45081}: Fix issue when dataclasses that inherit from
@code{typing.Protocol} subclasses have wrong @code{__init__}. Patch provided by
Yurii Karabas.

@item 
bpo-45085@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45085}: The @code{binhex} module, deprecated in Python 3.9, is now
removed. The following @ref{11,,binascii} functions, deprecated in Python
3.9, are now also removed:


@itemize *

@item 
@code{a2b_hqx()}, @code{b2a_hqx()};

@item 
@code{rlecode_hqx()}, @code{rledecode_hqx()}.
@end itemize

The @ref{93c,,binascii.crc_hqx()} function remains available.

Patch by Victor Stinner.

@item 
bpo-40360@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40360}: The @code{lib2to3} package is now deprecated and may not be
able to parse Python 3.10 or newer. See the 
@geindex Python 향상 제안; PEP 617
PEP 617@footnote{https://peps.python.org/pep-0617/} (New PEG parser for
CPython). Patch by Victor Stinner.

@item 
bpo-45075@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45075}: Rename @code{traceback.StackSummary.format_frame()} to
@ref{8b1,,traceback.StackSummary.format_frame_summary()}. This method was added
for 3.11 so it was not released yet.

Updated code and docs to better distinguish frame and FrameSummary.

@item 
bpo-31299@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31299}: Add option to completely drop frames from a traceback by
returning @code{None} from a @code{format_frame()}
override.

@item 
bpo-41620@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41620}: @ref{136b,,run()} now always return a
@ref{136c,,TestResult} instance. Previously it returned @code{None} if
the test class or method was decorated with a skipping decorator.

@item 
bpo-45021@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45021}: Fix a potential deadlock at shutdown of forked children when
using @ref{24,,concurrent.futures} module

@item 
bpo-43913@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43913}: Fix bugs in cleaning up classes and modules in @ref{10c,,unittest}:


@itemize *

@item 
Functions registered with @ref{c41,,addModuleCleanup()} were not called unless the user defines @code{tearDownModule()} in their test module.

@item 
Functions registered with @ref{c42,,addClassCleanup()} were not called if @code{tearDownClass} is set to @code{None}.

@item 
Buffering in @ref{136c,,TestResult} did not work with functions registered with @code{addClassCleanup()} and @code{addModuleCleanup()}.

@item 
Errors in functions registered with @code{addClassCleanup()} and @code{addModuleCleanup()} were not handled correctly in buffered and debug modes.

@item 
Errors in @code{setUpModule()} and functions registered with @code{addModuleCleanup()} were reported in wrong order.

@item 
And several lesser bugs.
@end itemize

@item 
bpo-45030@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45030}: Fix integer overflow in pickling and copying the range
iterator.

@item 
bpo-45001@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45001}: Made email date parsing more robust against malformed input,
namely a whitespace-only @code{Date:} header. Patch by Wouter Bolsterlee.

@item 
bpo-45010@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45010}: Remove support of special method @code{__div__} in
@ref{10d,,unittest.mock}. It is not used in Python 3.

@item 
bpo-39218@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39218}: Improve accuracy of variance calculations by using @code{x*x}
instead of @code{x**2}.

@item 
bpo-43613@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43613}: Improve the speed of @ref{84d,,gzip.compress()} and
@ref{1412,,gzip.decompress()} by compressing and decompressing at once in memory
instead of in a streamed fashion.

@item 
bpo-37596@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37596}: Ensure that @ref{184,,set} and @ref{7f1,,frozenset} objects are
always @ref{91,,marshalled} reproducibly.

@item 
bpo-44019@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44019}: A new function @code{operator.call} has been added, such that
@code{operator.call(obj, *args, **kwargs) == obj(*args, **kwargs)}.

@item 
bpo-42255@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42255}: @code{webbrowser.MacOSX} is deprecated and will be removed
in Python 3.13. It is untested and undocumented and also not used by
@ref{11b,,webbrowser} itself. Patch by Donghee Na.

@item 
bpo-44955@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44955}: Method @ref{154f,,stopTestRun()} is now always
called in pair with method @ref{154e,,startTestRun()} for
@ref{136c,,TestResult} objects implicitly created in
@ref{136b,,run()}. Previously it was not called for test
methods and classes decorated with a skipping decorator.

@item 
bpo-39039@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39039}: tarfile.open raises @ref{1c4d,,ReadError} when a zlib error
occurs during file extraction.

@item 
bpo-44935@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44935}: @ref{dc,,subprocess} on Solaris now also uses
@ref{52e,,os.posix_spawn()} for better performance.

@item 
bpo-44911@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44911}: @ref{361,,IsolatedAsyncioTestCase} will no longer throw
an exception while cancelling leaked tasks. Patch by Bar Harel.

@item 
bpo-41322@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41322}: Added @code{DeprecationWarning} for tests and async tests that
return a value!=None (as this may indicate an improperly written test, for
example a test written as a generator function).

@item 
bpo-44524@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44524}: Make exception message more useful when subclass from typing
special form alias. Patch provided by Yurii Karabas.

@item 
bpo-38956@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38956}: @ref{1bf0,,argparse.BooleanOptionalAction}’s default value is no
longer printed twice when used with
@ref{1c4e,,argparse.ArgumentDefaultsHelpFormatter}.

@item 
bpo-44860@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44860}: Fix the @code{posix_user} scheme in @ref{e1,,sysconfig} to not depend
on @ref{b32,,sys.platlibdir}.

@item 
bpo-44859@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44859}: Improve error handling in @ref{d4,,sqlite3} and raise more
accurate exceptions.


@itemize *

@item 
@ref{175f,,MemoryError} is now raised instead of @ref{1bb4,,sqlite3.Warning} when memory is not enough for encoding a statement to UTF-8 in @code{Connection.__call__()} and @code{Cursor.execute()}.

@item 
@code{UnicodEncodeError} is now raised instead of @ref{1bb4,,sqlite3.Warning} when the statement contains surrogate characters in @code{Connection.__call__()} and @code{Cursor.execute()}.

@item 
@ref{198,,TypeError} is now raised instead of @ref{2ec,,ValueError} for non-string script argument in @code{Cursor.executescript()}.

@item 
@ref{2ec,,ValueError} is now raised for script containing the null character instead of truncating it in @code{Cursor.executescript()}.

@item 
Correctly handle exceptions raised when getting boolean value of the result of the progress handler.

@item 
Add many tests covering different corner cases.
@end itemize

@item 
bpo-44581@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44581}: Upgrade bundled pip to 21.2.3 and setuptools to 57.4.0

@item 
bpo-44849@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44849}: Fix the @ref{10fd,,os.set_inheritable()} function on FreeBSD 14 for
file descriptor opened with the @ref{1171,,O_PATH} flag: ignore the
@ref{b54,,EBADF} error on @code{ioctl()}, fallback on the @code{fcntl()}
implementation. Patch by Victor Stinner.

@item 
bpo-44605@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44605}: The @@functools.total_ordering() decorator now works with
metaclasses.

@item 
bpo-44524@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44524}: Fixed an issue wherein the @code{__name__} and @code{__qualname__}
attributes of subscribed specialforms could be @code{None}.

@item 
bpo-44839@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44839}: @ref{175f,,MemoryError} raised in user-defined functions will now
produce a @code{MemoryError} in @ref{d4,,sqlite3}. @ref{a81,,OverflowError} will
now be converted to @ref{1c4f,,DataError}. Previously
@ref{1c50,,OperationalError} was produced in these cases.

@item 
bpo-44822@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44822}: @ref{d4,,sqlite3} user-defined functions and aggregators returning
@ref{169,,strings} with embedded NUL characters are no longer
truncated. Patch by Erlend E. Aasland.

@item 
bpo-44801@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44801}: Ensure that the @ref{488,,ParamSpec} variable in Callable
can only be substituted with a parameters expression (a list of types, an
ellipsis, ParamSpec or Concatenate).

@item 
bpo-44806@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44806}: Non-protocol subclasses of @ref{569,,typing.Protocol} ignore now
the @code{__init__} method inherited from protocol base classes.

@item 
bpo-27275@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27275}: @ref{14f2,,collections.OrderedDict.popitem()} and
@code{collections.OrderedDict.pop()} no longer call @code{__getitem__} and
@code{__delitem__} methods of the OrderedDict subclasses.

@item 
bpo-44793@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44793}: Fix checking the number of arguments when subscribe a generic
type with @code{ParamSpec} parameter.

@item 
bpo-44784@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44784}: In importlib.metadata tests, override warnings behavior under
expected DeprecationWarnings (importlib_metadata 4.6.3).

@item 
bpo-44667@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44667}: The @ref{6ff,,tokenize.tokenize()} doesn’t incorrectly generate a
@code{NEWLINE} token if the source doesn’t end with a new line character but
the last line is a comment, as the function is already generating a @code{NL}
token. Patch by Pablo Galindo

@item 
bpo-44771@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44771}: Added @code{importlib.simple} module implementing adapters from a
low-level resources reader interface to a @code{TraversableResources}
interface. Legacy API (@code{path}, @code{contents}, …) is now supported
entirely by the @code{.files()} API with a compatibility shim supplied for
resource loaders without that functionality. Feature parity with
@code{importlib_resources} 5.2.

@item 
bpo-44752@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44752}: @code{rcompleter} does not call @ref{dc9,,getattr()} on
@ref{4b3,,property} objects to avoid the side-effect of  evaluating the
corresponding method.

@item 
bpo-44747@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44747}: Refactor usage of @code{sys._getframe} in @code{typing} module. Patch
provided by Yurii Karabas.

@item 
bpo-42378@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42378}: Fixes the issue with log file being overwritten when
@ref{1c51,,logging.FileHandler} is used in @ref{d,,atexit} with `filemode' set
to @code{'w'}. Note this will cause the message in `atexit' not being logged
if the log stream is already closed due to shutdown of logging.

@item 
bpo-44720@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44720}: @code{weakref.proxy} objects referencing non-iterators now raise
@code{TypeError} rather than dereferencing the null @code{tp_iternext} slot and
crashing.

@item 
bpo-44704@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44704}: The implementation of @code{collections.abc.Set._hash()} now
matches that of @code{frozenset.__hash__()}.

@item 
bpo-44666@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44666}: Fixed issue in @ref{fe0,,compileall.compile_file()} when
@code{sys.stdout} is redirected. Patch by Stefan Hölzl.

@item 
bpo-44688@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44688}: @ref{885,,sqlite3.Connection.create_collation()} now accepts
non-ASCII collation names. Patch by Erlend E. Aasland.

@item 
bpo-44690@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44690}: Adopt `binacii.a2b_base64'’s strict mode in `base64.b64decode'.

@item 
bpo-42854@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42854}: Fixed a bug in the @code{_ssl} module that was throwing
@ref{a81,,OverflowError} when using @code{_ssl._SSLSocket.write()} and
@code{_ssl._SSLSocket.read()} for a big value of the @code{len} parameter.
Patch by Pablo Galindo.

@item 
bpo-44686@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44686}: Replace @code{unittest.mock._importer} with
@code{pkgutil.resolve_name}.

@item 
bpo-44353@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44353}: Make @code{NewType.__call__} faster by implementing it in C. Patch
provided by Yurii Karabas.

@item 
bpo-44682@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44682}: Change the @ref{aa,,pdb} `commands' directive to disallow setting
commands for an invalid breakpoint and to display an appropriate error.

@item 
bpo-44353@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44353}: Refactor @code{typing.NewType} from function into callable class.
Patch provided by Yurii Karabas.

@item 
bpo-44678@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44678}: Added a separate error message for discontinuous padding in
`binascii.a2b_base64' strict mode.

@item 
bpo-44524@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44524}: Add missing @code{__name__} and @code{__qualname__} attributes to
@code{typing} module classes. Patch provided by Yurii Karabas.

@item 
bpo-40897@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40897}: Give priority to using the current class constructor in
@ref{22f,,inspect.signature()}. Patch by Weipeng Hong.

@item 
bpo-44638@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44638}: Add a reference to the zipp project and hint as to how to use
it.

@item 
bpo-44648@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44648}: Fixed wrong error being thrown by @ref{17c9,,inspect.getsource()}
when examining a class in the interactive session. Instead of
@ref{198,,TypeError}, it should be @ref{2c0,,OSError} with appropriate error
message.

@item 
bpo-44608@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44608}: Fix memory leak in @code{_tkinter._flatten()} if it is called
with a sequence or set, but not list or tuple.

@item 
bpo-44594@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44594}: Fix an edge case of @code{ExitStack} and
@code{AsyncExitStack} exception chaining.  They will now match @code{with}
block behavior when @code{__context__} is explicitly set to @code{None} when the
exception is in flight.

@item 
bpo-42799@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42799}: In @ref{60,,fnmatch}, the cache size for compiled regex patterns
(@ref{be1,,functools.lru_cache()}) was bumped up from 256 to 32768, affecting
functions: @ref{1c52,,fnmatch.fnmatch()}, @ref{1c53,,fnmatch.fnmatchcase()},
@ref{1c54,,fnmatch.filter()}.

@item 
bpo-41928@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41928}: Update @ref{c4d,,shutil.copyfile()} to raise
@ref{264,,FileNotFoundError} instead of confusing @ref{1258,,IsADirectoryError}
when a path ending with a @code{os.path.sep} does not exist;
@ref{c4e,,shutil.copy()} and @ref{c4f,,shutil.copy2()} are also affected.

@item 
bpo-44569@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44569}: Added the @code{StackSummary.format_frame()} function in
@ref{104,,traceback}. This allows users to customize the way individual lines
are formatted in tracebacks without re-implementing logic to handle
recursive tracebacks.

@item 
bpo-44566@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44566}: handle StopIteration subclass raised from
@@contextlib.contextmanager generator

@item 
bpo-44558@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44558}: Make the implementation consistency of
@ref{ad8,,indexOf()} between C and Python versions. Patch by Donghee
Na.

@item 
bpo-41249@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41249}: Fixes @code{TypedDict} to work with @code{typing.get_type_hints()}
and postponed evaluation of annotations across modules.

@item 
bpo-44554@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44554}: Refactor argument processing in @code{pdb.main()} to simplify
detection of errors in input loading and clarify behavior around module or
script invocation.

@item 
bpo-34798@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34798}: Break up paragraph about @ref{117e,,pprint.PrettyPrinter}
construction parameters to make it easier to read.

@item 
bpo-44539@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44539}: Added support for recognizing JPEG files without JFIF or Exif
markers.

@item 
bpo-44461@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44461}: Fix bug with @ref{aa,,pdb}’s handling of import error due to a
package which does not have a @code{__main__} module

@item 
bpo-43625@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43625}: Fix a bug in the detection of CSV file headers by
@ref{1c55,,csv.Sniffer.has_header()} and improve documentation of same.

@item 
bpo-44516@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44516}: Update vendored pip to 21.1.3

@item 
bpo-42892@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42892}: Fixed an exception thrown while parsing a malformed multipart
email by @ref{57f,,email.message.EmailMessage}.

@item 
bpo-44468@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44468}: @ref{8bf,,typing.get_type_hints()} now finds annotations in classes
and base classes with unexpected @code{__module__}. Previously, it skipped
those MRO elements.

@item 
bpo-44491@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44491}: Allow clearing the @ref{d4,,sqlite3} authorizer callback by
passing @ref{884,,None} to @ref{5a8,,set_authorizer()}. Patch
by Erlend E. Aasland.

@item 
bpo-43977@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43977}: Set the proper @ref{1c56,,Py_TPFLAGS_MAPPING} and
@ref{1c57,,Py_TPFLAGS_SEQUENCE} flags for subclasses created before a
parent has been registered as a @ref{ac7,,collections.abc.Mapping} or
@ref{13c9,,collections.abc.Sequence}.

@item 
bpo-44482@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44482}: Fix very unlikely resource leak in @ref{68,,glob} in alternate
Python implementations.

@item 
bpo-44466@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44466}: The @ref{5c,,faulthandler} module now detects if a fatal error
occurs during a garbage collector collection. Patch by Victor Stinner.

@item 
bpo-44471@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44471}: A @ref{198,,TypeError} is now raised instead of an
@ref{5ee,,AttributeError} in @ref{7ed,,contextlib.ExitStack.enter_context()} and
@ref{7ee,,contextlib.AsyncExitStack.enter_async_context()} for objects which do
not support the @ref{1e1,,context manager} or @ref{7ef,,asynchronous context manager} protocols correspondingly.

@item 
bpo-44404@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44404}: @ref{f6,,tkinter}’s @code{after()} method now supports callables
without the @code{__name__} attribute.

@item 
bpo-41546@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41546}: Make @ref{b3,,pprint} (like the builtin @code{print}) not attempt to
write to @code{stdout} when it is @code{None}.

@item 
bpo-44458@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44458}: @code{BUFFER_BLOCK_SIZE} is now declared static, to avoid linking
collisions when bz2, lmza or zlib are statically linked.

@item 
bpo-44464@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44464}: Remove exception for flake8 in deprecated importlib.metadata
interfaces. Sync with importlib_metadata 4.6.

@item 
bpo-44446@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44446}: Take into account that @code{lineno} might be @code{None} in
@ref{1083,,traceback.FrameSummary}.

@item 
bpo-44439@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44439}: Fix in @code{bz2.BZ2File.write()} / @code{lzma.LZMAFile.write()}
methods, when the input data is an object that supports the buffer
protocol, the file length may be wrong.

@item 
bpo-44434@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44434}: _thread.start_new_thread() no longer calls
PyThread_exit_thread() explicitly at the thread exit, the call was
redundant. On Linux with the glibc, pthread_exit() aborts the whole
process if dlopen() fails to open libgcc_s.so file (ex: EMFILE error).
Patch by Victor Stinner.

@item 
bpo-42972@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42972}: The _thread.RLock type now fully implement the GC protocol: add
a traverse function and the @ref{980,,Py_TPFLAGS_HAVE_GC} flag. Patch by
Victor Stinner.

@item 
bpo-44422@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44422}: The @ref{1c58,,threading.enumerate()} function now uses a reentrant
lock to prevent a hang on reentrant call. Patch by Victor Stinner.

@item 
bpo-38291@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38291}: Importing typing.io or typing.re now prints a
@code{DeprecationWarning}.

@item 
bpo-37880@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37880}: argparse actions store_const and append_const each receive a
default value of @code{None} when the @code{const} kwarg is not provided.
Previously, this raised a @ref{198,,TypeError}.

@item 
bpo-44389@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44389}: Fix deprecation of @ref{1c59,,ssl.OP_NO_TLSv1_3}

@item 
bpo-27827@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27827}: @code{pathlib.PureWindowsPath.is_reserved()} now identifies a
greater range of reserved filenames, including those with trailing spaces
or colons.

@item 
bpo-44395@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44395}: Fix @code{as_string()} to pass unixfrom
properly. Patch by Donghee Na.

@item 
bpo-34266@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34266}: Handle exceptions from parsing the arg of @ref{aa,,pdb}’s
run/restart command.

@item 
bpo-44362@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44362}: Improve @ref{d5,,ssl} module’s deprecation messages, error
reporting, and documentation for deprecations.

@item 
bpo-44342@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44342}: [Enum] Change pickling from by-value to by-name.

@item 
bpo-44356@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44356}: [Enum] Allow multiple data-type mixins if they are all the
same.

@item 
bpo-44351@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44351}: Restore back @code{parse_makefile()} in @code{distutils.sysconfig}
because it behaves differently than the similar implementation in
@ref{e1,,sysconfig}.

@item 
bpo-35800@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35800}: @code{smtpd.MailmanProxy} is now removed as it is unusable
without an external module, @code{mailman}. Patch by Donghee Na.

@item 
bpo-44357@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44357}: Added a function that returns cube root of the given number
@ref{870,,math.cbrt()}

@item 
bpo-44339@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44339}: Change @code{math.pow(±0.0, -math.inf)} to return @code{inf} instead
of raising @code{ValueError}. This brings the special-case handling of
@code{math.pow} into compliance with the IEEE 754 standard.

@item 
bpo-44242@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44242}: Remove missing flag check from Enum creation and move into a
@code{verify} decorator.

@item 
bpo-44246@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44246}: In @code{importlib.metadata}, restore compatibility in the result
from @code{Distribution.entry_points} (@code{EntryPoints}) to honor expectations
in older implementations and issuing deprecation warnings for these cases:
A. @code{EntryPoints} objects are once again mutable, allowing   for
@code{sort()} and other list-based mutation operations.   Avoid deprecation
warnings by casting to a   mutable sequence (e.g.
@code{list(dist.entry_points).sort()}). B. @code{EntryPoints} results once again
allow   for access by index. To avoid deprecation warnings,   cast the
result to a Sequence first   (e.g. @code{tuple(dist.entry_points)[0]}).

@item 
bpo-44246@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44246}: In importlib.metadata.entry_points, de-duplication of
distributions no longer requires loading the full metadata for
PathDistribution objects, improving entry point loading performance by
~10x.

@item 
bpo-43858@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43858}: Added a function that returns a copy of a dict of logging
levels: @ref{868,,logging.getLevelNamesMapping()}

@item 
bpo-44260@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44260}: The @ref{1c5a,,random.Random} constructor no longer reads system
entropy without need.

@item 
bpo-44254@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44254}: On Mac, give turtledemo button text a color that works on both
light or dark background.  Programmers cannot control the latter.

@item 
bpo-44258@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44258}: Support PEP 515 for Fraction’s initialization from string.

@item 
bpo-44235@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44235}: Remove deprecated functions in the @ref{67,,gettext}. Patch by
Donghee Na.

@item 
bpo-38693@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38693}: Prefer f-strings to @code{.format} in importlib.resources.

@item 
bpo-33693@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33693}: Importlib.metadata now prefers f-strings to .format.

@item 
bpo-44241@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44241}: Incorporate minor tweaks from importlib_metadata 4.1:
SimplePath protocol, support for Metadata 2.2.

@item 
bpo-43216@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43216}: Remove the @code{@@asyncio.coroutine} @ref{939,,decorator} enabling
legacy generator-based coroutines to be compatible with async/await code;
remove @code{asyncio.coroutines.CoroWrapper} used for wrapping legacy
coroutine objects in the debug mode. The decorator has been deprecated
since Python 3.8 and the removal was initially scheduled for Python 3.10.
Patch by Illia Volochii.

@item 
bpo-44210@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44210}: Make importlib.metadata._meta.PackageMetadata public.

@item 
bpo-43643@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43643}: Declare readers.MultiplexedPath.name as a property per the
spec.

@item 
bpo-27334@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27334}: The @ref{d4,,sqlite3} context manager now performs a rollback
(thus releasing the database lock) if commit failed.  Patch by Luca Citi
and Erlend E. Aasland.

@item 
bpo-4928@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4928}: Documented existing behavior on POSIX: NamedTemporaryFiles are
not deleted when creating process is killed with SIGKILL

@item 
bpo-44154@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44154}: Optimize @ref{213,,fractions.Fraction} pickling for large
components.

@item 
bpo-33433@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33433}: For IPv4 mapped IPv6 addresses (
@geindex RFC; RFC 4291
RFC 4291@footnote{https://datatracker.ietf.org/doc/html/rfc4291.html} Section 2.5.5.2),
the @ref{19c4,,ipaddress.IPv6Address.is_private} check is deferred to the
mapped IPv4 address. This solves a bug where public mapped IPv4 addresses
were considered private by the IPv6 check.

@item 
bpo-44150@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44150}: Add optional `weights' argument to statistics.fmean().

@item 
bpo-44142@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44142}: @ref{ae2,,ast.unparse()} will now drop the redundant parentheses
when tuples used as assignment targets (e.g in for loops).

@item 
bpo-44145@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44145}: @ref{6e,,hmac} computations were not releasing the GIL while
calling the OpenSSL @code{HMAC_Update} C API (a new feature in 3.9).  This
unintentionally prevented parallel computation as other @ref{6c,,hashlib}
algorithms support.

@item 
bpo-44095@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44095}: @ref{8d7,,zipfile.Path} now supports @ref{8d4,,zipfile.Path.stem},
@ref{8d6,,zipfile.Path.suffixes}, and @ref{8d5,,zipfile.Path.suffix} attributes.

@item 
bpo-44077@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44077}: It’s now possible to receive the type of service (ToS), a.k.a.
differentiated services (DS), a.k.a. differentiated services code point
(DSCP) and explicit congestion notification (ECN) IP header fields with
@code{socket.IP_RECVTOS}.

@item 
bpo-37788@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37788}: Fix a reference leak when a Thread object is never joined.

@item 
bpo-38908@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38908}: Subclasses of @code{typing.Protocol} which only have data
variables declared will now raise a @code{TypeError} when checked with
@code{isinstance} unless they are decorated with @code{runtime_checkable()}.
Previously, these checks passed silently. Patch provided by Yurii Karabas.

@item 
bpo-44098@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44098}: @code{typing.ParamSpec} will no longer be found in the
@code{__parameters__} of most @ref{10a,,typing} generics except in valid use
locations specified by 
@geindex Python 향상 제안; PEP 612
PEP 612@footnote{https://peps.python.org/pep-0612/}. This prevents incorrect usage like
@code{typing.List[P][int]}. This change means incorrect usage which may have
passed silently in 3.10 beta 1 and earlier will now error.

@item 
bpo-44089@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44089}: Allow subclassing @code{csv.Error} in 3.10 (it was allowed in 3.9
and earlier but was disallowed in early versions of 3.10).

@item 
bpo-44081@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44081}: @ref{ae2,,ast.unparse()} now doesn’t use redundant spaces to
separate @code{lambda} and the @code{:} if there are no parameters.

@item 
bpo-44061@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44061}: Fix regression in previous release when calling
@ref{f46,,pkgutil.iter_modules()} with a list of @ref{266,,pathlib.Path} objects

@item 
bpo-44059@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44059}: Register the SerenityOS Browser in the @ref{11b,,webbrowser}
module.

@item 
bpo-36515@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36515}: The @ref{6c,,hashlib} module no longer does unaligned memory
accesses when compiled for ARM platforms.

@item 
bpo-40465@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40465}: Remove random module features deprecated in Python 3.9.

@item 
bpo-44018@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44018}: random.seed() no longer mutates bytearray inputs.

@item 
bpo-38352@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38352}: Add @code{IO}, @code{BinaryIO}, @code{TextIO}, @code{Match}, and
@code{Pattern} to @code{typing.__all__}. Patch by Jelle Zijlstra.

@item 
bpo-44002@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44002}: @ref{110,,urllib.parse} now uses @code{functool.lru_cache()} for its
internal URL splitting and quoting caches instead of rolling its own like
its the ‘90s.

The undocumented internal @ref{110,,urllib.parse} @code{Quoted} class API is now
deprecated, for removal in 3.14.

@item 
bpo-43972@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43972}: When @ref{d37,,http.server.SimpleHTTPRequestHandler} sends a
@code{301 (Moved Permanently)} for a directory path not ending with @code{/},
add a @code{Content-Length: 0} header. This improves the behavior for certain
clients.

@item 
bpo-28528@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28528}: Fix a bug in @ref{aa,,pdb} where @code{checkline()} raises
@ref{5ee,,AttributeError} if it is called after @code{reset()}.

@item 
bpo-43853@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43853}: Improved string handling for @ref{d4,,sqlite3} user-defined
functions and aggregates:


@itemize *

@item 
It is now possible to pass strings with embedded null characters to UDFs

@item 
Conversion failures now correctly raise @ref{175f,,MemoryError}
@end itemize

Patch by Erlend E. Aasland.

@item 
bpo-43666@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43666}: AIX: @code{Lib/_aix_support.get_platform()} may fail in an AIX
WPAR. The fileset bos.rte appears to have a builddate in both LPAR and
WPAR so this fileset is queried rather than bos.mp64. To prevent a similar
situation (no builddate in ODM) a value (9988) sufficient for completing a
build is provided. Patch by M Felt.

@item 
bpo-43650@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43650}: Fix @ref{175f,,MemoryError} in @ref{695,,shutil.unpack_archive()} which
fails inside @code{shutil._unpack_zipfile()} on large files. Patch by Igor
Bolshakov.

@item 
bpo-43612@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43612}: @ref{84e,,zlib.compress()} now accepts a wbits parameter which
allows users to compress data as a raw deflate block without zlib headers
and trailers in one go. Previously this required instantiating a
@code{zlib.compressobj}. It also provides a faster alternative to
@code{gzip.compress} when wbits=31 is used.

@item 
bpo-43392@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43392}: @code{importlib._bootstrap._find_and_load()} now implements a
two-step check to avoid locking when modules have been already imported
and are ready. This improves performance of repeated calls to
@ref{73b,,importlib.import_module()} and @ref{126c,,importlib.__import__()}.

@item 
bpo-43318@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43318}: Fix a bug where @ref{aa,,pdb} does not always echo cleared
breakpoints.

@item 
bpo-43234@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43234}: Prohibit passing
non-@ref{948,,concurrent.futures.ThreadPoolExecutor} executors to
@code{loop.set_default_executor()} following a deprecation in Python 3.8.
Patch by Illia Volochii.

@item 
bpo-43232@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43232}: Prohibit previously deprecated potentially disruptive
operations on @code{asyncio.trsock.TransportSocket}. Patch by Illia
Volochii.

@item 
bpo-30077@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30077}: Added support for Apple’s aifc/sowt pseudo-compression

@item 
bpo-42971@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42971}: Add definition of @code{errno.EQFULL} for platforms that define
this constant (such as macOS).

@item 
bpo-43086@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43086}: Added a new optional @code{strict_mode} parameter to
`binascii.a2b_base64'. When @code{scrict_mode} is set to @code{True},
the `a2b_base64' function will accept only valid base64 content. More
details about what “valid base64 content” is, can be found in the
function’s documentation.

@item 
bpo-43024@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43024}: Improve the help signature of
@ref{a4f,,traceback.print_exception()}, @ref{a4d,,traceback.format_exception()} and
@ref{a4e,,traceback.format_exception_only()}.

@item 
bpo-33809@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33809}: Add the @ref{8b2,,traceback.TracebackException.print()} method which
prints the formatted exception information.

@item 
bpo-42862@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42862}: @ref{d4,,sqlite3} now utilizes @ref{be1,,functools.lru_cache()} to
implement the connection statement cache. As a small optimisation, the
default statement cache size has been increased from 100 to 128. Patch by
Erlend E. Aasland.

@item 
bpo-41818@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41818}: Soumendra Ganguly: add termios.tcgetwinsize(),
termios.tcsetwinsize().

@item 
bpo-40497@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40497}: @ref{11c1,,subprocess.check_output()} now raises @ref{2ec,,ValueError}
when the invalid keyword argument `check' is passed by user code.
Previously such use would fail later with a @ref{198,,TypeError}. Patch by
Rémi Lapeyre.

@item 
bpo-37449@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37449}: @code{ensurepip} now uses @code{importlib.resources.files()}
traversable APIs

@item 
bpo-40956@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40956}: Use Argument Clinic in @ref{d4,,sqlite3}.  Patches by Erlend E.
Aasland.

@item 
bpo-41730@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41730}: @code{DeprecationWarning} is now raised when importing
@code{tkinter.tix}, which has been deprecated in documentation since
Python 3.6.

@item 
bpo-20684@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20684}: Remove unused @code{_signature_get_bound_param} function from
@ref{82,,inspect} - by Anthony Sottile.

@item 
bpo-41402@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41402}: Fix @ref{1c5b,,email.message.EmailMessage.set_content()} when called
with binary data and @code{7bit} content transfer encoding.

@item 
bpo-32695@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32695}: The `compresslevel' and `preset' keyword arguments of
@ref{1076,,tarfile.open()} are now both documented and tested.

@item 
bpo-41137@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41137}: Use utf-8 encoding while reading .pdbrc files. Patch by
Srinivas Reddy Thatiparthy

@item 
bpo-24391@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24391}: Improved reprs of @ref{f3,,threading} synchronization objects:
@ref{135b,,Semaphore}, @ref{135c,,BoundedSemaphore},
@ref{135d,,Event} and @ref{13e8,,Barrier}.

@item 
bpo-5846@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5846}: Deprecated the following @ref{10c,,unittest} functions, scheduled
for removal in Python 3.13:


@itemize *

@item 
@code{findTestCases()}

@item 
@code{makeSuite()}

@item 
@code{getTestCaseNames()}
@end itemize

Use @ref{592,,TestLoader} methods instead:


@itemize *

@item 
@ref{593,,unittest.TestLoader.loadTestsFromModule()}

@item 
@ref{594,,unittest.TestLoader.loadTestsFromTestCase()}

@item 
@ref{595,,unittest.TestLoader.getTestCaseNames()}
@end itemize

Patch by Erlend E. Aasland.

@item 
bpo-40563@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40563}: Support pathlike objects on dbm/shelve. Patch by Hakan Çelik
and Henry-Joseph Audéoud.

@item 
bpo-34990@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34990}: Fixed a Y2k38 bug in the compileall module where it would fail
to compile files with a modification time after the year 2038.

@item 
bpo-39549@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39549}: Whereas the code for reprlib.Repr had previously used a
hardcoded string value of ‘…’, this PR updates it to use of a
“fillvalue” attribute, whose value defaults to ‘…’ and can be reset in
either individual reprlib.Repr instances or in subclasses thereof.

@item 
bpo-37022@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37022}: @ref{aa,,pdb} now displays exceptions from @code{repr()} with its
@code{p} and @code{pp} commands.

@item 
bpo-38840@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38840}: Fix @code{test___all__} on platforms lacking a shared memory
implementation.

@item 
bpo-39359@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39359}: Add one missing check that the password is a bytes object for
an encrypted zipfile.

@item 
bpo-38741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38741}: @ref{26,,configparser}: using ‘]’ inside a section header will no
longer cut the section name short at the ‘]’

@item 
bpo-38415@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38415}: Added missing behavior to
@ref{d1e,,contextlib.asynccontextmanager()} to match
@ref{1407,,contextlib.contextmanager()} so decorated functions can themselves be
decorators.

@item 
bpo-30256@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30256}: Pass multiprocessing BaseProxy argument @code{manager_owned}
through AutoProxy.

@item 
bpo-27513@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27513}: @ref{4f3,,email.utils.getaddresses()} now accepts
@ref{1c5c,,email.header.Header} objects along with string values. Patch by
Zackery Spytz.

@item 
bpo-16379@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16379}: Add SQLite error code and name to @ref{d4,,sqlite3} exceptions.
Patch by Aviv Palivoda, Daniel Shahaf, and Erlend E. Aasland.

@item 
bpo-26228@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26228}: pty.spawn no longer hangs on FreeBSD, macOS, and Solaris.

@item 
bpo-33349@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33349}: lib2to3 now recognizes async generators everywhere.

@item 
bpo-29298@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29298}: Fix @code{TypeError} when required subparsers without @code{dest} do
not receive arguments. Patch by Anthony Sottile.
@end itemize

@node Documentation<36>,Tests<36>,Library<116>,Python 3 11 0 alpha 1
@anchor{whatsnew/changelog id505}@anchor{1c5d}
@subsubsection Documentation



@itemize -

@item 
bpo-45216@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45216}: Remove extra documentation listing methods in @code{difflib}. It
was rendering twice in pydoc and was outdated in some places.

@item 
bpo-45024@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45024}: @ref{1f,,collections.abc} documentation has been expanded to
explicitly cover how instance and subclass checks work, with additional
doctest examples and an exhaustive list of ABCs which test membership
purely by presence of the right @ref{1c5e,,special method}s. Patch by Raymond
Hettinger.

@item 
bpo-44957@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44957}: Promote PEP 604 union syntax by using it where possible. Also,
mention @code{X | Y} more prominently in section about @code{Union} and mention
@code{X | None} at all in section about @code{Optional}.

@item 
bpo-16580@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16580}: Added code equivalents for the @ref{1c30,,int.to_bytes()} and
@ref{1be7,,int.from_bytes()} methods, as well as tests ensuring that these code
equivalents are valid.

@item 
bpo-44903@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44903}: Removed the @code{othergui.rst} file, any references to it, and
the list of GUI frameworks in the FAQ. In their place I’ve added links to
the Python Wiki page on GUI frameworks@footnote{https://wiki.python.org/moin/GuiProgramming}.

@item 
bpo-33479@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33479}: Tkinter documentation has been greatly expanded with new
“Architecture” and “Threading model” sections.

@item 
bpo-36700@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36700}: @ref{f,,base64} RFC references were updated to point to
@geindex RFC; RFC 4648
RFC 4648@footnote{https://datatracker.ietf.org/doc/html/rfc4648.html}; a section was added to point users to the new “security
considerations” section of the RFC.

@item 
bpo-44740@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44740}: Replaced occurrences of uppercase “Web” and “Internet” with
lowercase versions per the 2016 revised Associated Press Style Book.

@item 
bpo-44693@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44693}: Update the definition of __future__ in the glossary by
replacing the confusing word “pseudo-module” with a more accurate
description.

@item 
bpo-35183@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35183}: Add typical examples to os.path.splitext docs

@item 
bpo-30511@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30511}: Clarify that @ref{6d9,,shutil.make_archive()} is not thread-safe due
to reliance on changing the current working directory.

@item 
bpo-44561@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44561}: Update of three expired hyperlinks in
Doc/distributing/index.rst: “Project structure”, “Building and packaging
the project”, and “Uploading the project to the Python Packaging Index”.

@item 
bpo-44651@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44651}: Delete entry “coercion” in Doc/glossary.rst for its outdated
definition.

@item 
bpo-42958@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42958}: Updated the docstring and docs of @ref{19dd,,filecmp.cmp()} to be
more accurate and less confusing especially in respect to `shallow' arg.

@item 
bpo-44631@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44631}: Refactored the @code{repr()} code of the @code{_Environ} (os module).

@item 
bpo-44613@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44613}: importlib.metadata is no longer provisional.

@item 
bpo-44558@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44558}: Match the docstring and python implementation of
@ref{ad9,,countOf()} to the behavior of its c implementation.

@item 
bpo-44544@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44544}: List all kwargs for @ref{16cc,,textwrap.wrap()},
@ref{16cb,,textwrap.fill()}, and @ref{11cf,,textwrap.shorten()}. Now, there are nav
links to attributes of @code{TextWrap}, which makes navigation much
easier while minimizing duplication in the documentation.

@item 
bpo-38062@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38062}: Clarify that atexit uses equality comparisons internally.

@item 
bpo-40620@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40620}: Convert examples in tutorial controlflow.rst section 4.3 to be
interpreter-demo style.

@item 
bpo-43066@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43066}: Added a warning to @ref{137,,zipfile} docs: filename arg with a
leading slash may cause archive to be un-openable on Windows systems.

@item 
bpo-39452@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39452}: Rewrote @code{Doc/library/__main__.rst}. Broadened scope of the
document to explicitly discuss and differentiate between @code{__main__.py}
in packages versus the @code{__name__ == '__main__'} expression (and the
idioms that surround it).

@item 
bpo-13814@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13814}: In the Design FAQ, answer “Why don’t generators support the
with statement?”

@item 
bpo-27752@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27752}: Documentation of csv.Dialect is more descriptive.

@item 
bpo-44453@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44453}: Fix documentation for the return type of
@ref{1532,,sysconfig.get_path()}.

@item 
bpo-44392@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44392}: Added a new section in the C API documentation for types used
in type hinting.  Documented @code{Py_GenericAlias} and
@code{Py_GenericAliasType}.

@item 
bpo-38291@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38291}: Mark @code{typing.io} and @code{typing.re} as deprecated since Python
3.8 in the documentation. They were never properly supported by type
checkers.

@item 
bpo-44322@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44322}: Document that SyntaxError args have a details tuple and that
details are adjusted for errors in f-string field replacement expressions.

@item 
bpo-42392@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42392}: Document the deprecation and removal of the @code{loop} parameter
for many functions and classes in @ref{b,,asyncio}.

@item 
bpo-44195@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44195}: Corrected references to @code{TraversableResources} in docs. There
is no @code{TraversableReader}.

@item 
bpo-41963@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41963}: Document that @code{ConfigParser} strips off comments when reading
configuration files.

@item 
bpo-44072@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44072}: Correct where in the numeric ABC hierarchy @code{**} support is
added, i.e., in numbers.Complex, not numbers.Integral.

@item 
bpo-43558@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43558}: Add the remark to @ref{33,,dataclasses} documentation that the
@code{__init__()} of any base class has to be called in
@code{__post_init__()}, along with a code example.

@item 
bpo-44025@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44025}: Clarify when ‘_’ in match statements is a keyword, and when
not.

@item 
bpo-41706@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41706}: Fix docs about how methods like @code{__add__} are invoked when
evaluating operator expressions.

@item 
bpo-41621@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41621}: Document that @ref{13c1,,collections.defaultdict} parameter
@code{default_factory} defaults to @code{None} and is positional-only.

@item 
bpo-41576@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41576}: document BaseException in favor of bare except

@item 
bpo-21760@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21760}: The description for __file__ fixed. Patch by Furkan Onder

@item 
bpo-39498@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39498}: Add a “Security Considerations” index which links to standard
library modules that have explicitly documented security considerations.

@item 
bpo-33479@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33479}: Remove the unqualified claim that tkinter is threadsafe. It has
not been true for several years and likely never was. An explanation of
what is true may be added later, after more discussion, and possibly after
patching _tkinter.c,
@end itemize

@node Tests<36>,Build<43>,Documentation<36>,Python 3 11 0 alpha 1
@anchor{whatsnew/changelog id506}@anchor{1c5f}
@subsubsection Tests



@itemize -

@item 
bpo-40173@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40173}: Fix @ref{1c60,,test.support.import_helper.import_fresh_module()}.

@item 
bpo-45280@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45280}: Add a test case for empty @ref{331,,typing.NamedTuple}.

@item 
bpo-45269@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45269}: Cover case when invalid @code{markers} type is supplied to
@code{c_make_encoder}.

@item 
bpo-45128@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45128}: Fix @code{test_multiprocessing_fork} failure due to
@code{test_logging} and @code{sys.modules} manipulation.

@item 
bpo-45209@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45209}: Fix @code{UserWarning: resource_tracker} warning in
@code{_test_multiprocessing._TestSharedMemory.test_shared_memory_cleaned_after_process_termination}

@item 
bpo-45185@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45185}: Enables @code{TestEnumerations} test cases in @code{test_ssl} suite.

@item 
bpo-45195@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45195}: Fix test_readline.test_nonascii(): sometimes, the newline
character is not written at the end, so don’t expect it in the output.
Patch by Victor Stinner.

@item 
bpo-45156@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45156}: Fixes infinite loop on @ref{d99,,unittest.mock.seal()} of mocks
created by @code{create_autospec()}.

@item 
bpo-45125@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45125}: Improves pickling tests and docs of @code{SharedMemory} and
@code{SharableList} objects.

@item 
bpo-44860@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44860}: Update @code{test_sysconfig.test_user_similar()} for the
posix_user scheme: @code{platlib} doesn’t use @ref{b32,,sys.platlibdir}. Patch
by Victor Stinner.

@item 
bpo-45052@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45052}: @code{WithProcessesTestSharedMemory.test_shared_memory_basics}
test was ignored, because @code{self.assertEqual(sms.size, sms2.size)} line
was failing. It is now removed and test is unskipped.

The main motivation for this line to be removed from the test is that the
@code{size} of @code{SharedMemory} is not ever guaranteed to be the same. It is
decided by the platform.

@item 
bpo-44895@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44895}: libregrtest now clears the type cache later to reduce the risk
of false alarm when checking for reference leaks. Previously, the type
cache was cleared too early and libregrtest raised a false alarm about
reference leaks under very specific conditions. Patch by Irit Katriel and
Victor Stinner.

@item 
bpo-45042@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45042}: Fixes that test classes decorated with
@code{@@hashlib_helper.requires_hashdigest} were skipped all the time.

@item 
bpo-25130@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25130}: Add calls of @ref{1b3,,gc.collect()} in tests to support PyPy.

@item 
bpo-45011@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45011}: Made tests relying on the @code{_asyncio} C extension module
optional to allow running on alternative Python implementations. Patch by
Serhiy Storchaka.

@item 
bpo-44949@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44949}: Fix auto history tests of test_readline: sometimes, the newline
character is not written at the end, so don’t expect it in the output.

@item 
bpo-44891@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44891}: Tests were added to clarify @ref{1628,,id()} is preserved when @code{obj
* 1} is used on @ref{169,,str} and @ref{192,,bytes} objects. Patch by Nikita
Sobolev.

@item 
bpo-44852@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44852}: Add ability to wholesale silence DeprecationWarnings while
running the regression test suite.

@item 
bpo-40928@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40928}: Notify users running test_decimal regression tests on macOS of
potential harmless “malloc can’t allocate region” messages spewed by
test_decimal.

@item 
bpo-44734@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44734}: Fixed floating-point precision issue in turtle tests.

@item 
bpo-44708@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44708}: Regression tests, when run with -w, are now re-running only the
affected test methods instead of re-running the entire test file.

@item 
bpo-42095@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42095}: Added interop tests for Apple plists: generate plist files with
Python plistlib and parse with Apple plutil; and the other way round.

@item 
bpo-44647@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44647}: Added a permanent Unicode-valued environment variable to
regression tests to ensure they handle this use case in the future. If
your test environment breaks because of that, report a bug to us, and
temporarily set PYTHONREGRTEST_UNICODE_GUARD=0 in your test environment.

@item 
bpo-44515@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44515}: Adjust recently added contextlib tests to avoid assuming the
use of a refcounted GC

@item 
bpo-44287@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44287}: Fix asyncio test_popen() of test_windows_utils by using a
longer timeout. Use military grade battle-tested
@ref{1c61,,test.support.SHORT_TIMEOUT} timeout rather than a hardcoded timeout
of 10 seconds: it’s 30 seconds by default, but it is made longer on slow
buildbots. Patch by Victor Stinner.

@item 
bpo-44451@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44451}: Reset @code{DeprecationWarning} filters in
@code{test.test_importlib.test_metadata_api.APITests.test_entry_points_by_index}
to avoid @code{StopIteration} error if @code{DeprecationWarnings} are ignored.

@item 
bpo-44363@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44363}: Account for address sanitizer in test_capi. test_capi now
passes when run GCC address sanitizer.

@item 
bpo-44364@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44364}: Add non integral tests for @ref{bf8,,math.sqrt()} function.

@item 
bpo-43921@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43921}: Fix test_ssl.test_wrong_cert_tls13(): use
@code{suppress_ragged_eofs=False}, since @code{read()} can raise
@ref{1ab7,,ssl.SSLEOFError} on Windows. Patch by Victor Stinner.

@item 
bpo-43921@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43921}: Fix test_pha_required_nocert() of test_ssl: catch two more EOF
cases (when the @code{recv()} method returns an empty string). Patch by
Victor Stinner.

@item 
bpo-44131@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44131}: Add test_frozenmain to test_embed to test the
@code{Py_FrozenMain()} C function. Patch by Victor Stinner.

@item 
bpo-31904@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31904}: Ignore error string case in test_file_not_exists().

@item 
bpo-42083@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42083}: Add test to check that @code{PyStructSequence_NewType} accepts a
@code{PyStructSequence_Desc} with @code{doc} field set to @code{NULL}.

@item 
bpo-35753@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35753}: Fix crash in doctest when doctest parses modules that include
unwrappable functions by skipping those functions.

@item 
bpo-30256@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30256}: Add test for nested queues when using @code{multiprocessing}
shared objects @code{AutoProxy[Queue]} inside @code{ListProxy} and @code{DictProxy}
@end itemize

@node Build<43>,Windows<37>,Tests<36>,Python 3 11 0 alpha 1
@anchor{whatsnew/changelog id507}@anchor{1c62}
@subsubsection Build



@itemize -

@item 
bpo-45220@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45220}: Avoid building with the Windows 11 SDK previews automatically.
This may be overridden by setting the @code{DefaultWindowsSDKVersion}
environment variable before building.

@item 
bpo-45020@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45020}: Freeze stdlib modules that are imported during startup.  This
provides significant performance improvements to startup.  If necessary,
use the previously added “-X frozen_modules=off” commandline option to
force importing the source modules.

@item 
bpo-45188@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45188}: Windows builds now regenerate frozen modules as the first part
of the build. Previously the regeneration was later in the build, which
would require it to be restarted if any modules had changed.

@item 
bpo-45163@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45163}: Fixes Haiku platform build.

@item 
bpo-45067@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45067}: The ncurses function extended_color_content was introduced in
2017

(@indicateurl{https://invisible-island.net/ncurses/NEWS.html#index-t20170401}).  The

ncurses-devel package in CentOS 7 had a older version ncurses resulted in
compilation error.  For compiling ncurses with extended color support, we
verify the version of the ncurses library >= 20170401.

@item 
bpo-45019@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45019}: Generate lines in relevant files for frozen modules.  Up until
now each of the files had to be edited manually.  This change makes it
easier to add to and modify the frozen modules.

@item 
bpo-44340@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44340}: Add support for building with clang thin lto via
–with-lto=thin/full. Patch by Donghee Na and Brett Holman.

@item 
bpo-44535@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44535}: Enable building using a Visual Studio 2022 install on Windows.

@item 
bpo-43298@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43298}: Improved error message when building without a Windows SDK
installed.

@item 
bpo-44381@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44381}: The Windows build now accepts 
@geindex EnableControlFlowGuard
@geindex 환경 변수; EnableControlFlowGuard
@code{EnableControlFlowGuard}
set to @code{guard} to enable CFG.

@item 
bpo-41282@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41282}: Fix broken @code{make install} that caused standard library
extension modules to be unnecessarily and incorrectly rebuilt during the
install phase of cpython.
@end itemize

@node Windows<37>,macOS<27>,Build<43>,Python 3 11 0 alpha 1
@anchor{whatsnew/changelog id508}@anchor{1c63}
@subsubsection Windows



@itemize -

@item 
bpo-45375@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45375}: Fixes an assertion failure due to searching for the standard
library in unnormalised paths.

@item 
bpo-45022@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45022}: Update Windows release to include libffi 3.4.2

@item 
bpo-45007@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45007}: Update to OpenSSL 1.1.1l in Windows build

@item 
bpo-44848@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44848}: Upgrade Windows installer to use SQLite 3.36.0.

@item 
bpo-44572@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44572}: Avoid consuming standard input in the @ref{af,,platform} module

@item 
bpo-44582@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44582}: Accelerate speed of @ref{93,,mimetypes} initialization using a
native implementation of the registry scan.

@item 
bpo-41299@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41299}: Fix 16 milliseconds jitter when using timeouts in
@ref{f3,,threading}, such as with @ref{8a6,,threading.Lock.acquire()} or
@ref{1c64,,threading.Condition.wait()}.

@item 
bpo-42686@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42686}: Build @ref{d4,,sqlite3} with math functions enabled. Patch by
Erlend E. Aasland.

@item 
bpo-40263@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40263}: This is a follow-on bug from
@indicateurl{https://bugs.python.org/issue26903}. Once that is applied we run into an
off-by-one assertion problem. The assert was not correct.
@end itemize

@node macOS<27>,IDLE<19>,Windows<37>,Python 3 11 0 alpha 1
@anchor{whatsnew/changelog id509}@anchor{1c65}
@subsubsection macOS



@itemize -

@item 
bpo-45007@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45007}: Update macOS installer builds to use OpenSSL 1.1.1l.

@item 
bpo-34602@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34602}: When building CPython on macOS with @code{./configure
--with-undefined-behavior-sanitizer --with-pydebug}, the stack size is
now quadrupled to allow for the entire test suite to pass.

@item 
bpo-44848@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44848}: Update macOS installer to use SQLite 3.36.0.

@item 
bpo-44689@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44689}: @ref{f44,,ctypes.util.find_library()} now works correctly on macOS
11 Big Sur even if Python is built on an older version of macOS.
Previously, when built on older macOS systems, @code{find_library} was not
able to find  macOS system libraries when running on Big Sur due to
changes in  how system libraries are stored.

@item 
bpo-41972@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41972}: The framework build’s user header path in sysconfig is changed
to add a ‘pythonX.Y’ component to match distutils’s behavior.

@item 
bpo-43109@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43109}: Allow –with-lto configure option to work with Apple-supplied
Xcode or Command Line Tools.

@item 
bpo-34932@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34932}: Add socket.TCP_KEEPALIVE support for macOS. Patch by Shane
Harvey.
@end itemize

@node IDLE<19>,Tools/Demos<27>,macOS<27>,Python 3 11 0 alpha 1
@anchor{whatsnew/changelog id510}@anchor{1c66}
@subsubsection IDLE



@itemize -

@item 
bpo-45296@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45296}: On Windows, change exit/quit message to suggest Ctrl-D, which
works, instead of <Ctrl-Z Return>, which does not work in IDLE.

@item 
bpo-45193@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45193}: Make completion boxes appear on Ubuntu again.

@item 
bpo-40128@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40128}: Mostly fix completions on macOS when not using tcl/tk 8.6.11
(as with 3.9). The added update_idletask call should be harmless and
possibly helpful otherwise.

@item 
bpo-33962@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33962}: Move the indent space setting from the Font tab to the new
Windows tab. Patch by Mark Roseman and Terry Jan Reedy.

@item 
bpo-40468@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40468}: Split the settings dialog General tab into Windows and Shell/ED
tabs. Move help sources, which extend the Help menu, to the Extensions
tab. Make space for new options and shorten the dialog. The latter makes
the dialog better fit small screens.

@item 
bpo-41611@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41611}: Avoid uncaught exceptions in
@code{AutoCompleteWindow.winconfig_event()}.

@item 
bpo-41611@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41611}: Fix IDLE sometimes freezing upon tab-completion on macOS.

@item 
bpo-44010@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44010}: Highlight the new @ref{a0e,,match} statement’s @ref{a0d,,soft keywords}: @ref{a0e,,match}, @code{case}, and
@ref{a0f,,_}. However, this highlighting is not
perfect and will be incorrect in some rare cases, including some @code{_}-s
in @code{case} patterns.

@item 
bpo-44026@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44026}: Include interpreter’s typo fix suggestions in message line for
NameErrors and AttributeErrors.  Patch by E. Paine.
@end itemize

@node Tools/Demos<27>,C API<38>,IDLE<19>,Python 3 11 0 alpha 1
@anchor{whatsnew/changelog id511}@anchor{1c67}
@subsubsection Tools/Demos



@itemize -

@item 
bpo-44786@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44786}: Fix a warning in regular expression in the c-analyzer script.

@item 
bpo-44967@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44967}: pydoc now returns a non-zero status code when a module cannot
be found.

@item 
bpo-44978@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44978}: Allow the Argument Clinic tool to handle @code{__complex__}
special methods.

@item 
bpo-43425@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43425}: Removed the ‘test2to3’ demo project that demonstrated using
lib2to3 to support Python 2.x and Python 3.x from a single source in a
distutils package. Patch by Donghee Na

@item 
bpo-44074@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44074}: Make patchcheck automatically detect the correct base branch
name (previously it was hardcoded to ‘master’)

@item 
bpo-20291@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20291}: Added support for variadic positional parameters in Argument
Clinic.
@end itemize

@node C API<38>,,Tools/Demos<27>,Python 3 11 0 alpha 1
@anchor{whatsnew/changelog id512}@anchor{1c68}
@subsubsection C API



@itemize -

@item 
bpo-41710@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41710}: The PyThread_acquire_lock_timed() function now clamps the
timeout if it is too large, rather than aborting the process. Patch by
Victor Stinner.

@item 
bpo-44687@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44687}: @code{BufferedReader.peek()} no longer raises @ref{2ec,,ValueError}
when the entire file has already been buffered.

@item 
bpo-45116@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45116}: Add the @ref{1c69,,Py_ALWAYS_INLINE} macro to ask the compiler
to always inline a static inline function. The compiler can ignore it and
decides to not inline the function. Patch by Victor Stinner.

@item 
bpo-45094@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45094}: Add the @ref{1805,,Py_NO_INLINE} macro to disable inlining on a
function. Patch by Victor Stinner.

@item 
bpo-45061@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=45061}: Add a deallocator to the @ref{3c3,,bool} type to detect refcount
bugs in C extensions which call @code{Py_DECREF(Py_True);} or
@code{Py_DECREF(Py_False);} by mistake. Patch by Victor Stinner.

@item 
bpo-42035@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42035}: Add a new @ref{958,,PyType_GetQualName()} function to get type’s
qualified name.

@item 
bpo-41103@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41103}: Reverts removal of the old buffer protocol because they are
part of stable ABI.

@item 
bpo-44751@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44751}: Remove @code{crypt.h} include from the public @code{Python.h} header.

@item 
bpo-42747@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42747}: The @code{Py_TPFLAGS_HAVE_VERSION_TAG} type flag now does nothing.
The @code{Py_TPFLAGS_HAVE_AM_SEND} flag (which was added in 3.10) is removed.
Both were unnecessary because it is not possible to have type objects with
the relevant fields missing.

@item 
bpo-44530@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44530}: Added the @code{co_qualname} to the @code{PyCodeObject} structure to
propagate the qualified name from the compiler to code objects.

Patch by Gabriele N. Tornetta

@item 
bpo-44441@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44441}: @ref{bbb,,Py_RunMain()} now resets @ref{1b19,,PyImport_Inittab} to
its initial value at exit. It must be possible to call
@ref{1b1a,,PyImport_AppendInittab()} or @ref{1b1b,,PyImport_ExtendInittab()} at
each Python initialization. Patch by Victor Stinner.

@item 
bpo-39947@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39947}: Remove 4 private trashcan C API functions which were only kept
for the backward compatibility of the stable ABI with Python 3.8 and
older, since the trashcan API was not usable with the limited C API on
Python 3.8 and older. The trashcan API was excluded from the limited C API
in Python 3.9.

Removed functions:


@itemize *

@item 
_PyTrash_deposit_object()

@item 
_PyTrash_destroy_chain()

@item 
_PyTrash_thread_deposit_object()

@item 
_PyTrash_thread_destroy_chain()
@end itemize

The trashcan C API was never usable with the limited C API, since old
trashcan macros accessed directly @ref{98f,,PyThreadState} members like
@code{_tstate->trash_delete_nesting}, whereas the @code{PyThreadState}
structure is opaque in the limited C API.

Exclude also the @code{PyTrash_UNWIND_LEVEL} constant from the C API.

Patch by Victor Stinner.

@item 
bpo-40939@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40939}: Removed documentation for the removed @code{PyParser_*} C API.

@item 
bpo-43795@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43795}: The list in @ref{99c,,Contents of Limited API} now shows the public name
@ref{98b,,PyFrameObject} rather than @code{_frame}. The non-existing entry
@code{_node} no longer appears in the list.

@item 
bpo-44378@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44378}: @ref{1b9e,,Py_IS_TYPE()} no longer uses @ref{3c9,,Py_TYPE()} to avoid
a compiler warning: no longer cast @code{const PyObject*} to @code{PyObject*}.
Patch by Victor Stinner.

@item 
bpo-39573@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39573}: Convert the @ref{3c9,,Py_TYPE()} and @ref{984,,Py_SIZE()} macros to
static inline functions. The @ref{983,,Py_SET_TYPE()} and
@ref{985,,Py_SET_SIZE()} functions must now be used to set an object type and
size. Patch by Victor Stinner.

@item 
bpo-44263@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44263}: The @ref{97f,,PyType_Ready()} function now raises an error if a
type is defined with the @ref{980,,Py_TPFLAGS_HAVE_GC} flag set but has no
traverse function (@ref{981,,PyTypeObject.tp_traverse}). Patch by Victor
Stinner.

@item 
bpo-43795@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43795}: The undocumented function @code{Py_FrozenMain()} is removed
from the Limited API.

@item 
bpo-44113@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44113}: Deprecate the following functions to configure the Python
initialization:


@itemize *

@item 
@code{PySys_AddWarnOptionUnicode()}

@item 
@code{PySys_AddWarnOption()}

@item 
@code{PySys_AddXOption()}

@item 
@code{PySys_HasWarnOptions()}

@item 
@code{Py_SetPath()}

@item 
@code{Py_SetProgramName()}

@item 
@code{Py_SetPythonHome()}

@item 
@code{Py_SetStandardStreamEncoding()}

@item 
@code{_Py_SetProgramFullPath()}
@end itemize

Use the new @ref{3f7,,PyConfig} API of the @ref{644,,Python Initialization Configuration} instead (
@geindex Python 향상 제안; PEP 587
PEP 587@footnote{https://peps.python.org/pep-0587/}).

@item 
bpo-44094@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44094}: Remove @code{PyErr_SetFromErrnoWithUnicodeFilename()},
@code{PyErr_SetFromWindowsErrWithUnicodeFilename()}, and
@code{PyErr_SetExcFromWindowsErrWithUnicodeFilename()}. They are not
documented and have been deprecated since Python 3.3.

@item 
bpo-43795@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43795}: @ref{a97,,PyCodec_Unregister()} is now properly exported as a
function in the Windows Stable ABI DLL.

@item 
bpo-44029@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44029}: Remove deprecated @code{Py_UNICODE} APIs: @code{PyUnicode_Encode},
@code{PyUnicode_EncodeUTF7}, @code{PyUnicode_EncodeUTF8},
@code{PyUnicode_EncodeUTF16}, @code{PyUnicode_EncodeUTF32},
@code{PyUnicode_EncodeLatin1}, @code{PyUnicode_EncodeMBCS},
@code{PyUnicode_EncodeDecimal}, @code{PyUnicode_EncodeRawUnicodeEscape},
@code{PyUnicode_EncodeCharmap}, @code{PyUnicode_EncodeUnicodeEscape},
@code{PyUnicode_TransformDecimalToASCII}, @code{PyUnicode_TranslateCharmap},
@code{PyUnicodeEncodeError_Create}, @code{PyUnicodeTranslateError_Create}. See
@geindex Python 향상 제안; PEP 393
PEP 393@footnote{https://peps.python.org/pep-0393/} and 
@geindex Python 향상 제안; PEP 624
PEP 624@footnote{https://peps.python.org/pep-0624/} for reference.

@item 
bpo-42035@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42035}: Add a new @ref{957,,PyType_GetName()} function to get type’s short
name.
@end itemize

@node Python 3 10 0 beta 1,Python 3 10 0 alpha 7,Python 3 11 0 alpha 1,Changelog
@anchor{whatsnew/changelog python-3-10-0-beta-1}@anchor{1c6a}
@subsection Python 3.10.0 beta 1


`Release date: 2021-05-03'

@menu
* Security: Security<31>. 
* Core and Builtins: Core and Builtins<114>. 
* Library: Library<117>. 
* Core and Builtins: Core and Builtins<115>. 
* Library: Library<118>. 
* Core and Builtins: Core and Builtins<116>. 
* Library: Library<119>. 
* Documentation: Documentation<37>. 
* Tests: Tests<37>. 
* Build: Build<44>. 
* Windows: Windows<38>. 
* macOS: macOS<28>. 
* IDLE: IDLE<20>. 
* C API: C API<39>. 

@end menu

@node Security<31>,Core and Builtins<114>,,Python 3 10 0 beta 1
@anchor{whatsnew/changelog id513}@anchor{1c6b}
@subsubsection Security



@itemize -

@item 
bpo-43434@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43434}: Creating @ref{54c,,sqlite3.Connection} objects now also produces
@code{sqlite3.connect} and @code{sqlite3.connect/handle} @ref{1c6c,,auditing events}. Previously these events were only produced by
@ref{5a5,,sqlite3.connect()} calls. Patch by Erlend E. Aasland.

@item 
bpo-43998@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43998}: The @ref{d5,,ssl} module sets more secure cipher suites defaults.
Ciphers without forward secrecy and with SHA-1 MAC are disabled by
default. Security level 2 prohibits weak RSA, DH, and ECC keys with less
than 112 bits of security. @ref{357,,SSLContext} defaults to minimum
protocol version TLS 1.2. Settings are based on Hynek Schlawack’s
research.

@item 
bpo-43882@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43882}: The presence of newline or tab characters in parts of a URL
could allow some forms of attacks.

Following the controlling specification for URLs defined by WHATWG
@ref{110,,urllib.parse()} now removes ASCII newlines and tabs from URLs,
preventing such attacks.

@item 
bpo-43472@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43472}: Ensures interpreter-level audit hooks receive the
@code{cpython.PyInterpreterState_New} event when called through the
@code{_xxsubinterpreters} module.

@item 
bpo-43362@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43362}: Fix invalid free in _sha3 module. The issue was introduced in
3.10.0a1. Python 3.9 and earlier are not affected.

@item 
bpo-43762@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43762}: Add audit events for @code{sqlite3.connect/handle()},
@ref{a3f,,sqlite3.Connection.enable_load_extension()}, and
@ref{6de,,sqlite3.Connection.load_extension()}. Patch by Erlend E. Aasland.

@item 
bpo-43756@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43756}: Add new audit event @code{glob.glob/2} to incorporate the new
`root_dir' and `dir_fd' arguments added to @ref{59f,,glob.glob()} and
@ref{a08,,glob.iglob()}.

@item 
bpo-36384@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36384}: @ref{84,,ipaddress} module no longer accepts any leading zeros in
IPv4 address strings. Leading zeros are ambiguous and interpreted as octal
notation by some libraries. For example the legacy function
@ref{b5a,,socket.inet_aton()} treats leading zeros as octal notation. glibc
implementation of modern @ref{b5b,,inet_pton()} does not accept any
leading zeros. For a while the @code{ipaddress} module used to accept
ambiguous leading zeros.

@item 
bpo-43075@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43075}: Fix Regular Expression Denial of Service (ReDoS) vulnerability
in @ref{1c6d,,urllib.request.AbstractBasicAuthHandler}.  The ReDoS-vulnerable
regex has quadratic worst-case complexity and it allows cause a denial of
service when identifying crafted invalid RFCs. This ReDoS issue is on the
client side and needs remote attackers to control the HTTP server.

@item 
bpo-42800@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42800}: Audit hooks are now fired for frame.f_code, traceback.tb_frame,
and generator code/frame attribute access.

@item 
bpo-37363@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37363}: Add audit events to the @ref{73,,http.client} module.
@end itemize

@node Core and Builtins<114>,Library<117>,Security<31>,Python 3 10 0 beta 1
@anchor{whatsnew/changelog id514}@anchor{1c6e}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-43977@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43977}: Prevent classes being both a sequence and a mapping when
pattern matching.

@item 
bpo-43977@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43977}: Use @ref{1c6f,,tp_flags} on the class object to
determine if the subject is a sequence or mapping when pattern matching.
Avoids the need to import @ref{1f,,collections.abc} when pattern matching.

@item 
bpo-43892@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43892}: Restore proper validation of complex literal value patterns
when parsing @code{match} blocks.

@item 
bpo-43933@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43933}: Set frame.f_lineno to the line number of the ‘with’ kweyword
when executing the call to @code{__exit__}.

@item 
bpo-43933@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43933}: If the current position in a frame has no line number then set
the f_lineno attribute to None, instead of -1, to conform to PEP 626. This
should not normally be possible, but might occur in some unusual
circumstances.

@item 
bpo-43963@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43963}: Importing the @code{_signal} module in a subinterpreter has no
longer side effects.

@item 
bpo-42739@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42739}: The internal representation of line number tables is changed to
not use sentinels, and an explicit length parameter is added to the out of
process API function @code{PyLineTable_InitAddressRange}. This makes the
handling of line number tables more robust in some circumstances.
@end itemize

@node Library<117>,Core and Builtins<115>,Core and Builtins<114>,Python 3 10 0 beta 1
@anchor{whatsnew/changelog id515}@anchor{1c70}
@subsubsection Library



@itemize -

@item 
bpo-43908@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43908}: Make @ref{be,,re} types immutable. Patch by Erlend E. Aasland.

@item 
bpo-43908@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43908}: Make the @ref{4c0,,array.array} type immutable. Patch by Erlend
E. Aasland.
@end itemize

@node Core and Builtins<115>,Library<118>,Library<117>,Python 3 10 0 beta 1
@anchor{whatsnew/changelog id516}@anchor{1c71}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-43901@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43901}: Change class and module objects to lazy-create empty
annotations dicts on demand.  The annotations dicts are stored in the
object’s __dict__ for backwards compatibility.

@item 
bpo-43892@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43892}: Match patterns now use new dedicated AST nodes (@code{MatchValue},
@code{MatchSingleton}, @code{MatchSequence}, @code{MatchStar}, @code{MatchMapping},
@code{MatchClass}) rather than reusing expression AST nodes. @code{MatchAs} and
@code{MatchOr} are now defined as pattern nodes rather than as expression
nodes. Patch by Nick Coghlan.

@item 
bpo-42725@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42725}: Usage of @code{await}/@code{yield}/@code{yield from} and named
expressions within an annotation is now forbidden when PEP 563 is
activated.

@item 
bpo-43754@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43754}: When performing structural pattern matching (
@geindex Python 향상 제안; PEP 634
PEP 634@footnote{https://peps.python.org/pep-0634/}),
captured names are now left unbound until the `entire' pattern has matched
successfully.

@item 
bpo-42737@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42737}: Annotations for complex targets (everything beside simple
names) no longer cause any runtime effects with @code{from __future__ import
annotations}.

@item 
bpo-43914@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43914}: @ref{18e,,SyntaxError} exceptions raised by the interpreter will
highlight the full error range of the expression that constitutes the
syntax error itself, instead of just where the problem is detected. Patch
by Pablo Galindo.

@item 
bpo-38605@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38605}: Revert making @code{from __future__ import annotations} the
default. This follows the Steering Council decision to postpone PEP 563
changes to at least Python 3.11. See the original email for more
information regarding the decision:
@indicateurl{https://mail.python.org/archives/list/python-dev@@python.org/thread/CLVXXPQ2T2LQ5MP2Y53VVQFCXYWQJHKZ/}.
Patch by Pablo Galindo.

@item 
bpo-43475@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43475}: Hashes of NaN values now depend on object identity.  Formerly,
they always hashed to 0 even though NaN values are not equal to one
another.  Having the same hash for unequal values caused pile-ups in hash
tables.

@item 
bpo-43859@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43859}: Improve the error message for @ref{9ab,,IndentationError}
exceptions. Patch by Pablo Galindo

@item 
bpo-41323@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41323}: Constant tuple folding in bytecode optimizer now reuses tuple
in constant table.

@item 
bpo-43846@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43846}: Data stack usage is much reduced for large literal and call
expressions.

@item 
bpo-38530@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38530}: When printing @ref{452,,NameError} raised by the interpreter,
@code{PyErr_Display()} will offer suggestions of similar variable names
in the function that the exception was raised from. Patch by Pablo Galindo

@item 
bpo-43823@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43823}: Improve syntax errors for invalid dictionary literals. Patch by
Pablo Galindo.

@item 
bpo-43822@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43822}: Improve syntax errors in the parser for missing commas between
expressions. Patch by Pablo Galindo.

@item 
bpo-43798@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43798}: @ref{1c72,,ast.alias} nodes now include source location metadata
attributes e.g. lineno, col_offset.

@item 
bpo-43797@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43797}: Improve @code{SyntaxError} error messages for invalid comparisons.
Patch by Pablo Galindo.

@item 
bpo-43760@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43760}: Move the flag for checking whether tracing is enabled to the C
stack, from the heap. Should speed up dispatch in the interpreter.

@item 
bpo-43682@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43682}: Static methods (@ref{453,,@@staticmethod}) and class methods
(@ref{48f,,@@classmethod}) now inherit the method attributes (@code{__module__},
@code{__name__}, @code{__qualname__}, @code{__doc__}, @code{__annotations__}) and have
a new @code{__wrapped__} attribute. Patch by Victor Stinner.

@item 
bpo-43751@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43751}: Fixed a bug where @code{anext(ait, default)} would erroneously
return None.

@item 
bpo-42128@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42128}: @ref{1c73,,__match_args__} is no longer allowed to be a
list.

@item 
bpo-43683@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43683}: Add GEN_START opcode. Marks start of generator, including
async, or coroutine and handles sending values to a newly created
generator or coroutine.
@end itemize

@node Library<118>,Core and Builtins<116>,Core and Builtins<115>,Python 3 10 0 beta 1
@anchor{whatsnew/changelog id517}@anchor{1c74}
@subsubsection Library



@itemize -

@item 
bpo-43105@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43105}: Importlib now resolves relative paths when creating module spec
objects from file locations.
@end itemize

@node Core and Builtins<116>,Library<119>,Library<118>,Python 3 10 0 beta 1
@anchor{whatsnew/changelog id518}@anchor{1c75}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-43682@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43682}: Static methods (@ref{453,,@@staticmethod}) are now callable as
regular functions. Patch by Victor Stinner.

@item 
bpo-42609@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42609}: Prevented crashes in the AST validator and optimizer when
compiling some absurdly long expressions like @code{"+0"*1000000}.
@ref{f67,,RecursionError} is now raised instead.

@item 
bpo-38530@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38530}: When printing @ref{5ee,,AttributeError}, @code{PyErr_Display()}
will offer suggestions of similar attribute names in the object that the
exception was raised from. Patch by Pablo Galindo
@end itemize

@node Library<119>,Documentation<37>,Core and Builtins<116>,Python 3 10 0 beta 1
@anchor{whatsnew/changelog id519}@anchor{1c76}
@subsubsection Library



@itemize -

@item 
bpo-44015@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44015}: In @@dataclass(), raise a TypeError if KW_ONLY is specified more
than once.

@item 
bpo-25478@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25478}: Added a `total()' method to collections.Counter() to compute
the sum of the counts.

@item 
bpo-43733@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43733}: Change @ref{1c77,,netrc.netrc} to use UTF-8 encoding before using
locale encoding.

@item 
bpo-43979@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43979}: Removed an unnecessary list comprehension before looping from
@ref{31e,,urllib.parse.parse_qsl()}.  Patch by Christoph Zwerschke and Donghee
Na.

@item 
bpo-43993@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43993}: Update bundled pip to 21.1.1.

@item 
bpo-43957@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43957}: [Enum] Deprecate @code{TypeError} when non-member is used in a
containment check; In 3.12 @code{True} or @code{False} will be returned instead,
and containment will return @code{True} if the value is either a member of
that enum or one of its members’ value.

@item 
bpo-42904@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42904}: For backwards compatibility with previous minor versions of
Python, if @ref{8bf,,typing.get_type_hints()} receives no namespace dictionary
arguments, @code{typing.get_type_hints()} will search through the global
then local namespaces during evaluation of stringized type annotations
(string forward references) inside a class.

@item 
bpo-43945@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43945}: [Enum] Deprecate non-standard mixin format() behavior: in 3.12
the enum member, not the member’s value, will be used for format() calls.

@item 
bpo-41139@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41139}: Deprecate undocumented @code{cgi.log()} API.

@item 
bpo-43937@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43937}: Fixed the @ref{107,,turtle} module working with non-default root
window.

@item 
bpo-43930@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43930}: Update bundled pip to 21.1 and setuptools to 56.0.0

@item 
bpo-43907@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43907}: Fix a bug in the pure-Python pickle implementation when using
protocol 5, where bytearray instances that occur several time in the
pickled object graph would incorrectly unpickle into repeated copies of
the bytearray object.

@item 
bpo-43926@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43926}: In @code{importlib.metadata}, provide a uniform interface to
@code{Description}, allow for any field to be encoded with multiline values,
remove continuation lines from multiline values, and add a @code{.json}
property for easy access to the PEP 566 JSON-compatible form. Sync with
@code{importlib_metadata 4.0}.

@item 
bpo-43920@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43920}: OpenSSL 3.0.0: @ref{10ed,,load_verify_locations()}
now returns a consistent error message when cadata contains no valid
certificate.

@item 
bpo-43607@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43607}: @ref{10e,,urllib} can now convert Windows paths with @code{\\?\}
prefixes into URL paths.

@item 
bpo-43817@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43817}: Add @ref{a14,,inspect.get_annotations()}, which safely computes the
annotations defined on an object.  It works around the quirks of accessing
the annotations from various types of objects, and makes very few
assumptions about the object passed in. @code{inspect.get_annotations()}
can also correctly un-stringize stringized annotations.

@ref{22f,,inspect.signature()}, @code{inspect.from_callable()}, and
@code{inspect.from_function()} now call @ref{a14,,inspect.get_annotations()} to
retrieve annotations.  This means @code{inspect.signature()} and
@code{inspect.from_callable()} can now un-stringize stringized annotations,
too.

@item 
bpo-43284@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43284}: platform.win32_ver derives the windows version from
sys.getwindowsversion().platform_version which in turn derives the version
from kernel32.dll (which can be of a different version than Windows
itself). Therefore change the platform.win32_ver to determine the version
using the platform module’s _syscmd_ver private function to return an
accurate version.

@item 
bpo-42854@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42854}: The @ref{d5,,ssl} module now uses @code{SSL_read_ex} and
@code{SSL_write_ex} internally. The functions support reading and writing of
data larger than 2 GB. Writing zero-length data no longer fails with a
protocol violation error.

@item 
bpo-42333@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42333}: Port @code{_ssl} extension module to multiphase initialization.

@item 
bpo-43880@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43880}: @ref{d5,,ssl} now raises DeprecationWarning for OP_NO_SSL/TLS*
options, old TLS versions, old protocols, and other features that have
been deprecated since Python 3.6, 3.7, or OpenSSL 1.1.0.

@item 
bpo-41559@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41559}: 
@geindex Python 향상 제안; PEP 612
PEP 612@footnote{https://peps.python.org/pep-0612/} is now implemented purely in Python; builtin
@code{types.GenericAlias} objects no longer include @code{typing.ParamSpec} in
@code{__parameters__} (with the exception of @code{collections.abc.Callable}‘s
@code{GenericAlias}). This means previously invalid uses of @code{ParamSpec}
(such as @code{list[P]}) which worked in earlier versions of Python 3.10
alpha, will now raise @code{TypeError} during substitution.

@item 
bpo-43867@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43867}: The @ref{98,,multiprocessing} @code{Server} class now explicitly
catches @ref{f3b,,SystemExit} and closes the client connection in this case.
It happens when the @code{Server.serve_client()} method reaches the end of
file (EOF).

@item 
bpo-40443@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40443}: Remove unused imports: pyclbr no longer uses copy, and typing
no longer uses ast. Patch by Victor Stinner.

@item 
bpo-43820@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43820}: Remove an unneeded copy of the namespace passed to
dataclasses.make_dataclass().

@item 
bpo-43787@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43787}: Add @code{__iter__()} method to @ref{a66,,bz2.BZ2File},
@ref{65a,,gzip.GzipFile}, and @ref{120b,,lzma.LZMAFile}. It makes iterating
them about 2x faster. Patch by Inada Naoki.

@item 
bpo-43680@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43680}: Deprecate io.OpenWrapper and _pyio.OpenWrapper: use io.open and
_pyio.open instead. Until Python 3.9, _pyio.open was not a static method
and builtins.open was set to OpenWrapper to not become a bound method when
set to a class variable. _io.open is a built-in function whereas
_pyio.open is a Python function. In Python 3.10, _pyio.open() is now a
static method, and builtins.open() is now io.open().

@item 
bpo-43680@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43680}: The Python @code{_pyio.open()} function becomes a static method
to behave as @ref{73f,,io.open()} built-in function: don’t become a bound
method when stored as a class variable. It becomes possible since static
methods are now callable in Python 3.10. Moreover,
@code{_pyio.OpenWrapper()} becomes a simple alias to @code{_pyio.open()}.
Patch by Victor Stinner.

@item 
bpo-41515@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41515}: Fix @ref{5e5,,KeyError} raised in @ref{8bf,,typing.get_type_hints()} due
to synthetic modules that don’t appear in @code{sys.modules}.

@item 
bpo-43776@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43776}: When @ref{4b8,,subprocess.Popen} args are provided as a string or
as @ref{266,,pathlib.Path}, the Popen instance repr now shows the right
thing.

@item 
bpo-42248@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42248}: [Enum] ensure exceptions raised in @code{_missing__} are released

@item 
bpo-43744@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43744}: fix issue with enum member name matching the start of a private
variable name

@item 
bpo-43772@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43772}: Fixed the return value of @code{TypeVar.__ror__}. Patch by Jelle
Zijlstra.

@item 
bpo-43764@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43764}: Add match_args parameter to @@dataclass decorator to allow
suppression of __match_args__ generation.

@item 
bpo-43799@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43799}: OpenSSL 3.0.0: define @code{OPENSSL_API_COMPAT} 1.1.1 to suppress
deprecation warnings. Python requires OpenSSL 1.1.1 APIs.

@item 
bpo-43478@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43478}: Mocks can no longer be used as the specs for other Mocks. As a
result, an already-mocked object cannot have an attribute mocked using
@code{autospec=True} or be the subject of a @code{create_autospec(...)} call.
This can uncover bugs in tests since these Mock-derived Mocks will always
pass certain tests (e.g. @ref{2ad,,isinstance()}) and builtin assert functions
(e.g. assert_called_once_with) will unconditionally pass.

@item 
bpo-43794@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43794}: Add @ref{a38,,ssl.OP_IGNORE_UNEXPECTED_EOF} constants (OpenSSL
3.0.0)

@item 
bpo-43785@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43785}: Improve @code{bz2.BZ2File} performance by removing the RLock from
BZ2File. This makes BZ2File thread unsafe in the face of multiple
simultaneous readers or writers, just like its equivalent classes in
@ref{6b,,gzip} and @ref{8e,,lzma} have always been.  Patch by Inada Naoki.

@item 
bpo-43789@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43789}: OpenSSL 3.0.0: Don’t call the password callback function a
second time when first call has signaled an error condition.

@item 
bpo-43788@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43788}: The header files for @ref{d5,,ssl} error codes are now OpenSSL
version-specific. Exceptions will now show correct reason and library
codes. The @code{make_ssl_data.py} script has been rewritten to use OpenSSL’s
text file with error codes.

@item 
bpo-43766@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43766}: Implement 
@geindex Python 향상 제안; PEP 647
PEP 647@footnote{https://peps.python.org/pep-0647/} in the @ref{10a,,typing} module by adding
@code{TypeGuard}.

@item 
bpo-25264@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25264}: @ref{262,,os.path.realpath()} now accepts a `strict' keyword-only
argument. When set to @code{True}, @ref{2c0,,OSError} is raised if a path doesn’t
exist or a symlink loop is encountered.

@item 
bpo-43780@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43780}: In @code{importlib.metadata}, incorporate changes from
importlib_metadata 3.10: Add mtime-based caching during distribution
discovery. Flagged use of dict result from @code{entry_points()} as
deprecated.

@item 
gh-47383@footnote{https://github.com/python/cpython/issues/47383}: The @code{P.args} and @code{P.kwargs} attributes of
@ref{488,,typing.ParamSpec} are now instances of the new classes
@ref{9c9,,typing.ParamSpecArgs} and @ref{9ca,,typing.ParamSpecKwargs}, which
enables a more useful @code{repr()}. Patch by Jelle Zijlstra.

@item 
bpo-43731@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43731}: Add an @code{encoding} parameter @code{logging.fileConfig()}.

@item 
bpo-43712@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43712}: Add @code{encoding} and @code{errors} parameters to
@ref{a00,,fileinput.input()} and @ref{93f,,fileinput.FileInput}.

@item 
bpo-38659@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38659}: A @code{simple_enum} decorator is added to the @code{enum} module to
convert a normal class into an Enum. @code{test_simple_enum} added to test
simple enums against a corresponding normal Enum.  Standard library
modules updated to use @code{simple_enum}.

@item 
bpo-43764@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43764}: Fix an issue where @ref{1c73,,__match_args__} generation
could fail for some @ref{33,,dataclasses}.

@item 
bpo-43752@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43752}: Fix @ref{d4,,sqlite3} regression for zero-sized blobs with
converters, where @code{b""} was returned instead of @code{None}. The regression
was introduced by PR 24723. Patch by Erlend E. Aasland.

@item 
bpo-43655@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43655}: @ref{f6,,tkinter} dialog windows are now recognized as dialogs by
window managers on macOS and X Window.

@item 
bpo-43723@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43723}: The following @code{threading} methods are now deprecated and
should be replaced:


@itemize -

@item 
@code{currentThread} => @ref{35e,,threading.current_thread()}

@item 
@code{activeCount} => @ref{35f,,threading.active_count()}

@item 
@code{Condition.notifyAll} => @ref{359,,threading.Condition.notify_all()}

@item 
@code{Event.isSet} => @ref{35a,,threading.Event.is_set()}

@item 
@code{Thread.setName} => @ref{2a0,,threading.Thread.name}

@item 
@code{thread.getName} => @ref{2a0,,threading.Thread.name}

@item 
@code{Thread.isDaemon} => @ref{35c,,threading.Thread.daemon}

@item 
@code{Thread.setDaemon} => @ref{35c,,threading.Thread.daemon}
@end itemize

Patch by Jelle Zijlstra.

@item 
bpo-2135@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2135}: Deprecate find_module() and find_loader() implementations in
importlib and zipimport.

@item 
bpo-43534@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43534}: @ref{1c78,,turtle.textinput()} and @ref{1c79,,turtle.numinput()} create now
a transient window working on behalf of the canvas window.

@item 
bpo-43532@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43532}: Add the ability to specify keyword-only fields to dataclasses.
These fields will become keyword-only arguments to the generated __init__.

@item 
bpo-43522@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43522}: Fix problem with
@ref{d75,,hostname_checks_common_name}. OpenSSL does not copy
hostflags from `struct SSL_CTX' to `struct SSL'.

@item 
bpo-8978@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8978}: Improve error message for @ref{1076,,tarfile.open()} when @ref{8e,,lzma}
/ @ref{14,,bz2} are unavailable.  Patch by Anthony Sottile.

@item 
bpo-42967@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42967}: Allow @ref{192,,bytes} @code{separator} argument in
@code{urllib.parse.parse_qs} and @code{urllib.parse.parse_qsl} when parsing
@ref{169,,str} query strings. Previously, this raised a @code{TypeError}.

@item 
bpo-43296@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43296}: Improve @ref{d4,,sqlite3} error handling: @code{sqlite3_value_blob()}
errors that set @code{SQLITE_NOMEM} now raise @ref{175f,,MemoryError}. Patch by
Erlend E. Aasland.

@item 
bpo-43312@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43312}: New functions @ref{89e,,sysconfig.get_preferred_scheme()} and
@ref{1bb3,,sysconfig.get_default_scheme()} are added to query a platform for its
preferred “user”, “home”, and “prefix” (default) scheme names.

@item 
bpo-43265@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43265}: Improve @ref{d72,,sqlite3.Connection.backup()} error handling. The
error message for non-existent target database names is now @code{unknown
database <database name>} instead of @code{SQL logic error}. Patch by Erlend
E. Aasland.

@item 
bpo-41282@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41282}: Install schemes in @code{distutils.command.install} are now loaded
from @ref{e1,,sysconfig}.

@item 
bpo-41282@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41282}: @code{distutils.sysconfig} has been merged to @ref{e1,,sysconfig}.

@item 
bpo-43176@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43176}: Fixed processing of a dataclass that inherits from a frozen
dataclass with no fields.  It is now correctly detected as an error.

@item 
bpo-43080@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43080}: @ref{b3,,pprint} now has support for
@ref{4e1,,dataclasses.dataclass}. Patch by Lewis Gaul.

@item 
bpo-39950@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39950}: Add @code{pathlib.Path.hardlink_to()} method that supersedes
@code{link_to()}. The new method has the same argument order as
@code{symlink_to()}.

@item 
bpo-42904@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42904}: @ref{8bf,,typing.get_type_hints()} now checks the local namespace of
a class when evaluating 
@geindex Python 향상 제안; PEP 563
PEP 563@footnote{https://peps.python.org/pep-0563/} annotations inside said class.

@item 
bpo-42269@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42269}: Add @code{slots} parameter to @code{dataclasses.dataclass} decorator
to automatically generate @code{__slots__} for class. Patch provided by Yurii
Karabas.

@item 
bpo-39529@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39529}: Deprecated use of @ref{2f2,,asyncio.get_event_loop()} without
running event loop. Emit deprecation warning for @ref{b,,asyncio} functions
which implicitly create a @ref{dc5,,Future} or
@ref{1c7,,Task} objects if there is no running event loop and no
explicit `loop' argument is passed: @ref{e70,,ensure_future()},
@ref{1c7a,,wrap_future()}, @ref{812,,gather()},
@ref{c64,,shield()}, @ref{4c7,,as_completed()} and constructors of
@code{Future}, @code{Task},
@ref{176b,,StreamReader}, @code{StreamReaderProtocol}.

@item 
bpo-18369@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18369}: Certificate and PrivateKey classes were added to the ssl
module. Certificates and keys can now be loaded from memory buffer, too.

@item 
bpo-41486@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41486}: Use a new output buffer management code for @ref{14,,bz2} /
@ref{8e,,lzma} / @ref{139,,zlib} modules, and add @code{.readall()} function to
@code{_compression.DecompressReader} class. These bring some performance
improvements. Patch by Ma Lin.

@item 
bpo-31870@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31870}: The @ref{a3d,,ssl.get_server_certificate()} function now has a
`timeout' parameter.

@item 
bpo-41735@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41735}: Fix thread locks in zlib module may go wrong in rare case.
Patch by Ma Lin.

@item 
bpo-36470@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36470}: Fix dataclasses with @code{InitVar}s and
@ref{1a6a,,replace()}. Patch by Claudiu Popa.

@item 
bpo-40849@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40849}: Expose X509_V_FLAG_PARTIAL_CHAIN ssl flag

@item 
bpo-35114@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35114}: @ref{1c7b,,ssl.RAND_status()} now returns a boolean value (as
documented) instead of @code{1} or @code{0}.

@item 
bpo-39906@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39906}: @ref{a24,,pathlib.Path.stat()} and @ref{a25,,chmod()} now
accept a `follow_symlinks' keyword-only argument for consistency with
corresponding functions in the @ref{a5,,os} module.

@item 
bpo-39899@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39899}: @ref{c08,,os.path.expanduser()} now refuses to guess Windows home
directories if the basename of current user’s home directory does not
match their username.

@ref{1041,,pathlib.Path.expanduser()} and @ref{1042,,home()} now
consistently raise @ref{244,,RuntimeError} exception when a home directory
cannot be resolved. Previously a @ref{5e5,,KeyError} exception could be raised
on Windows when the @code{"USERNAME"}  environment variable was unset.

@item 
bpo-36076@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36076}: Added SNI support to @ref{a3d,,ssl.get_server_certificate()}.

@item 
bpo-38490@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38490}: Covariance, Pearson’s correlation, and simple linear regression
functionality was added to statistics module. Patch by Tymoteusz Wołodźko.

@item 
bpo-33731@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33731}: Provide a locale.localize() function, which converts a
normalized number string into a locale format.

@item 
bpo-32745@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32745}: Fix a regression in the handling of ctypes’
@ref{1a58,,ctypes.c_wchar_p} type: embedded null characters would cause a
@ref{2ec,,ValueError} to be raised. Patch by Zackery Spytz.
@end itemize

@node Documentation<37>,Tests<37>,Library<119>,Python 3 10 0 beta 1
@anchor{whatsnew/changelog id520}@anchor{1c7c}
@subsubsection Documentation



@itemize -

@item 
bpo-43987@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43987}: Add “Annotations Best Practices” document as a new HOWTO.

@item 
bpo-43977@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43977}: Document the new @ref{1c56,,Py_TPFLAGS_MAPPING} and
@ref{1c57,,Py_TPFLAGS_SEQUENCE} type flags.

@item 
bpo-43959@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43959}: The documentation on the PyContextVar C-API was clarified.

@item 
bpo-43938@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43938}: Update dataclasses documentation to express that
FrozenInstanceError is derived from AttributeError.

@item 
bpo-43778@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43778}: Fix the Sphinx glossary_search extension: create the _static/
sub-directory if it doesn’t exist.

@item 
bpo-43755@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43755}: Update documentation to reflect that unparenthesized lambda
expressions can no longer be the expression part in an @code{if} clause in
comprehensions and generator expressions since Python 3.9.

@item 
bpo-43739@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43739}: Fixing the example code in Doc/extending/extending.rst to
declare and initialize the pmodule variable to be of the right type.
@end itemize

@node Tests<37>,Build<44>,Documentation<37>,Python 3 10 0 beta 1
@anchor{whatsnew/changelog id521}@anchor{1c7d}
@subsubsection Tests



@itemize -

@item 
bpo-43961@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43961}: Fix test_logging.test_namer_rotator_inheritance() on Windows:
use @ref{12f7,,os.replace()} rather than @ref{12f6,,os.rename()}. Patch by Victor
Stinner.

@item 
bpo-43842@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43842}: Fix a race condition in the SMTP test of test_logging. Don’t
close a file descriptor (socket) from a different thread while
asyncore.loop() is polling the file descriptor. Patch by Victor Stinner.

@item 
bpo-43843@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43843}: @code{test.libregrtest} now marks a test as ENV_CHANGED
(altered the execution environment) if a thread raises an exception but
does not catch it. It sets a hook on @ref{a4b,,threading.excepthook()}. Use
@code{--fail-env-changed} option to mark the test as failed. Patch by Victor
Stinner.

@item 
bpo-43811@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43811}: Tests multiple OpenSSL versions on GitHub Actions. Use ccache
to speed up testing.

@item 
bpo-43791@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43791}: OpenSSL 3.0.0: Disable testing of legacy protocols TLS 1.0 and
1.1. Tests are failing with TLSV1_ALERT_INTERNAL_ERROR.
@end itemize

@node Build<44>,Windows<38>,Tests<37>,Python 3 10 0 beta 1
@anchor{whatsnew/changelog id522}@anchor{1c7e}
@subsubsection Build



@itemize -

@item 
bpo-43567@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43567}: Improved generated code refresh (AST/tokens/opcodes/keywords)
on Windows.

@item 
bpo-43669@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43669}: Implement 
@geindex Python 향상 제안; PEP 644
PEP 644@footnote{https://peps.python.org/pep-0644/}. Python now requires OpenSSL 1.1.1 or
newer.
@end itemize

@node Windows<38>,macOS<28>,Build<44>,Python 3 10 0 beta 1
@anchor{whatsnew/changelog id523}@anchor{1c7f}
@subsubsection Windows



@itemize -

@item 
bpo-35306@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35306}: Adds additional arguments to @ref{1c80,,os.startfile()} function.

@item 
bpo-43538@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43538}: Avoid raising errors from @ref{c0a,,pathlib.Path.exists()} when
passed an invalid filename.

@item 
bpo-38822@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38822}: Fixed @ref{26d,,os.stat()} failing on inaccessible directories with
a trailing slash, rather than falling back to the parent directory’s
metadata. This implicitly affected @ref{c02,,os.path.exists()} and
@ref{c04,,os.path.isdir()}.

@item 
bpo-26227@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26227}: Fixed decoding of host names in @ref{1c81,,socket.gethostbyaddr()}
and @ref{1c82,,socket.gethostbyname_ex()}.

@item 
bpo-40432@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40432}: Updated pegen regeneration script on Windows to find and use
Python 3.8 or higher.  Prior to this, pegen regeneration already required
3.8 or higher, but the script may have used lower versions of Python.

@item 
bpo-43745@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43745}: Actually updates Windows release to OpenSSL 1.1.1k. Earlier
releases were mislabelled and actually included 1.1.1i again.

@item 
bpo-43652@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43652}: Update Tcl and Tk to 8.6.11 in Windows installer.

@item 
bpo-43492@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43492}: Upgrade Windows installer to use SQLite 3.35.5.

@item 
bpo-30555@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30555}: Fix @code{WindowsConsoleIO} errors in the presence of fd
redirection. Patch by Segev Finer.
@end itemize

@node macOS<28>,IDLE<20>,Windows<38>,Python 3 10 0 beta 1
@anchor{whatsnew/changelog id524}@anchor{1c83}
@subsubsection macOS



@itemize -

@item 
bpo-42119@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42119}: Fix check for macOS SDK paths when building Python. Narrow
search to match contents of SDKs, namely only files in
@code{/System/Library}, @code{/System/IOSSupport}, and @code{/usr} other than
@code{/usr/local}. Previously, anything under @code{/System} was assumed to be
in an SDK which causes problems with the new file system layout in 10.15+
where user file systems may appear to be mounted under @code{/System}.  Paths
in @code{/Library} were also incorrectly treated as SDK locations.

@item 
bpo-43568@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43568}: Drop support for MACOSX_DEPLOYMENT_TARGET < 10.3

@item 
bpo-44009@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=44009}: Provide “python3.x-intel64” executable to allow reliably
forcing macOS universal2 framework builds to run under Rosetta 2 Intel-64
emulation on Apple Silicon Macs.  This can be useful for testing or when
universal2 wheels are not yet available.

@item 
bpo-43851@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43851}: Build SQLite with @code{SQLITE_OMIT_AUTOINIT} on macOS. Patch by
Erlend E. Aasland.

@item 
bpo-43492@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43492}: Update macOS installer to use SQLite 3.35.4.

@item 
bpo-42235@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42235}: @code{Mac/BuildScript/build-installer.py} will now use
“–enable-optimizations” and @code{--with-lto} when building on macOS 10.15
or later.
@end itemize

@node IDLE<20>,C API<39>,macOS<28>,Python 3 10 0 beta 1
@anchor{whatsnew/changelog id525}@anchor{1c84}
@subsubsection IDLE



@itemize -

@item 
bpo-37903@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37903}: Add mouse actions to the shell sidebar.  Left click and
optional drag selects one or more lines, as with the editor line number
sidebar.  Right click after selecting raises a context menu with ‘copy
with prompts’.  This zips together prompts from the sidebar with lines
from the selected text.

@item 
bpo-43981@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43981}: Fix reference leak in test_sidebar and test_squeezer. Patches
by Terry Jan Reedy and Pablo Galindo

@item 
bpo-37892@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37892}: Indent IDLE Shell input with spaces instead of tabs

@item 
bpo-43655@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43655}: IDLE dialog windows are now recognized as dialogs by window
managers on macOS and X Window.

@item 
bpo-37903@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37903}: IDLE’s shell now shows prompts in a separate side-bar.
@end itemize

@node C API<39>,,IDLE<20>,Python 3 10 0 beta 1
@anchor{whatsnew/changelog id526}@anchor{1c85}
@subsubsection C API



@itemize -

@item 
bpo-43916@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43916}: Add a new @ref{7a1,,Py_TPFLAGS_DISALLOW_INSTANTIATION} type
flag to disallow creating type instances. Patch by Victor Stinner.

@item 
bpo-43774@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43774}: Remove the now unused @code{PYMALLOC_DEBUG} macro. Debug hooks on
memory allocators are now installed by default if Python is built in debug
mode (if @code{Py_DEBUG} macro is defined). Moreover, they can now be used on
Python build in release mode (ex: using @code{PYTHONMALLOC=debug} environment
variable).

@item 
bpo-43962@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43962}: _PyInterpreterState_IDIncref() now calls
_PyInterpreterState_IDInitref() and always increments id_refcount.
Previously, calling _xxsubinterpreters.get_current() could create an
id_refcount inconsistency when a _xxsubinterpreters.InterpreterID object
was deallocated. Patch by Victor Stinner.

@item 
bpo-28254@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28254}: Add new C-API functions to control the state of the garbage
collector: @ref{aa4,,PyGC_Enable()}, @ref{aa5,,PyGC_Disable()},
@ref{aa6,,PyGC_IsEnabled()}, corresponding to the functions in the
@ref{64,,gc} module.

@item 
bpo-43908@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43908}: Introduce @ref{3cf,,Py_TPFLAGS_IMMUTABLETYPE} flag for
immutable type objects, and modify @ref{97f,,PyType_Ready()} to set it for
static types. Patch by Erlend E. Aasland.

@item 
bpo-43795@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43795}: @ref{10ac,,PyMem_Calloc()} is now available in the limited C API
(@code{Py_LIMITED_API}).

@item 
bpo-43868@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43868}: @ref{7a4,,PyOS_ReadlineFunctionPointer()} is no longer exported by
limited C API headers and by @code{python3.dll} on Windows. Like any function
that takes @code{FILE*}, it is not part of the stable ABI.

@item 
bpo-43795@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43795}: Stable ABI and limited API definitions are generated from a
central manifest (
@geindex Python 향상 제안; PEP 652
PEP 652@footnote{https://peps.python.org/pep-0652/}).

@item 
bpo-43753@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43753}: Add the @ref{aa0,,Py_Is(x@comma{} y)} function to test if the
`x' object is the `y' object, the same as @code{x is y} in Python. Add also
the @ref{aa1,,Py_IsNone()}, @ref{aa2,,Py_IsTrue()}, @ref{aa3,,Py_IsFalse()}
functions to test if an object is, respectively, the @code{None} singleton,
the @code{True} singleton or the @code{False} singleton. Patch by Victor
Stinner.
@end itemize

@node Python 3 10 0 alpha 7,Python 3 10 0 alpha 6,Python 3 10 0 beta 1,Changelog
@anchor{whatsnew/changelog python-3-10-0-alpha-7}@anchor{1c86}
@subsection Python 3.10.0 alpha 7


`Release date: 2021-04-05'

@menu
* Security: Security<32>. 
* Core and Builtins: Core and Builtins<117>. 
* Library: Library<120>. 
* Core and Builtins: Core and Builtins<118>. 
* Library: Library<121>. 
* Documentation: Documentation<38>. 
* Tests: Tests<38>. 
* Build: Build<45>. 
* Windows: Windows<39>. 
* IDLE: IDLE<21>. 
* C API: C API<40>. 

@end menu

@node Security<32>,Core and Builtins<117>,,Python 3 10 0 alpha 7
@anchor{whatsnew/changelog id527}@anchor{1c87}
@subsubsection Security



@itemize -

@item 
bpo-42988@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42988}: 
@geindex Common Vulnerabilities and Exposures; CVE 2021-3426
CVE 2021-3426@footnote{https://www.cve.org/CVERecord?id=CVE-2021-3426}: Remove the @code{getfile} feature of the
@ref{ba,,pydoc} module which could be abused to read arbitrary files on the
disk (directory traversal vulnerability). Moreover, even source code of
Python modules can contain sensitive data like passwords. Vulnerability
reported by David Schwörer.

@item 
bpo-43285@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43285}: @ref{62,,ftplib} no longer trusts the IP address value returned
from the server in response to the PASV command by default.  This prevents
a malicious FTP server from using the response to probe IPv4 address and
port combinations on the client network.

Code that requires the former vulnerable behavior may set a
@code{trust_server_pasv_ipv4_address} attribute on their @ref{af6,,ftplib.FTP}
instances to @code{True} to re-enable it.

@item 
bpo-43439@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43439}: Add audit hooks for @ref{a04,,gc.get_objects()},
@ref{a05,,gc.get_referrers()} and @ref{a06,,gc.get_referents()}. Patch by Pablo
Galindo.
@end itemize

@node Core and Builtins<117>,Library<120>,Security<32>,Python 3 10 0 alpha 7
@anchor{whatsnew/changelog id528}@anchor{1c88}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-27129@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27129}: Update CPython bytecode magic number.

@item 
bpo-43672@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43672}: Raise ImportWarning when calling find_loader().

@item 
bpo-43660@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43660}: Fix crash that happens when replacing @code{sys.stderr} with a
callable that can remove the object while an exception is being printed.
Patch by Pablo Galindo.

@item 
bpo-27129@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27129}: The bytecode interpreter uses instruction, rather byte, offsets
internally. This reduces the number of EXTENDED_ARG instructions needed
and streamlines instruction dispatch a bit.
@end itemize

@node Library<120>,Core and Builtins<118>,Core and Builtins<117>,Python 3 10 0 alpha 7
@anchor{whatsnew/changelog id529}@anchor{1c89}
@subsubsection Library



@itemize -

@item 
bpo-40645@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40645}: Fix reference leak in the @code{_hashopenssl} extension. Patch
by Pablo Galindo.
@end itemize

@node Core and Builtins<118>,Library<121>,Library<120>,Python 3 10 0 alpha 7
@anchor{whatsnew/changelog id530}@anchor{1c8a}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-42134@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42134}: Calls to find_module() by the import system now raise
ImportWarning.

@item 
bpo-41064@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41064}: Improve the syntax error for invalid usage of double starred
elements (‘**’) in f-strings. Patch by Pablo Galindo.

@item 
bpo-43575@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43575}: Speed up calls to @code{map()} by using the 
@geindex Python 향상 제안; PEP 590
PEP 590@footnote{https://peps.python.org/pep-0590/}
@code{vectorcall} calling convention. Patch by Donghee Na.

@item 
bpo-42137@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42137}: The import system now prefers using @code{__spec__} for
@code{ModuleType.__repr__} over @code{module_repr()}.

@item 
bpo-43452@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43452}: Added micro-optimizations to @code{_PyType_Lookup()} to improve
cache lookup performance in the common case of cache hits.

@item 
bpo-43555@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43555}: Report the column offset for @ref{18e,,SyntaxError} for invalid
line continuation characters. Patch by Pablo Galindo.

@item 
bpo-43517@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43517}: Fix misdetection of circular imports when using @code{from pkg.mod
import attr}, which caused false positives in non-trivial multi-threaded
code.

@item 
bpo-43497@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43497}: Emit SyntaxWarnings for assertions with tuple constants, this
is a regression introduced in python3.7

@item 
bpo-39316@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39316}: Tracing now has correct line numbers for attribute accesses
when the attribute is on a different line from the object. Improves
debugging and profiling for multi-line method chains.

@item 
bpo-35883@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35883}: Python no longer fails at startup with a fatal error if a
command line argument contains an invalid Unicode character. The
@ref{dbf,,Py_DecodeLocale()} function now escapes byte sequences which would
be decoded as Unicode characters outside the [U+0000; U+10ffff] range.

@item 
bpo-43410@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43410}: Fix a bug that was causing the parser to crash when emitting
syntax errors when reading input from stdin. Patch by Pablo Galindo

@item 
bpo-43406@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43406}: Fix a possible race condition where @code{PyErr_CheckSignals}
tries to execute a non-Python signal handler.

@item 
bpo-42128@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42128}: Add @code{__match_args__} to @ref{13c4,,struct sequence objects}. Patch by Pablo Galindo.

@item 
bpo-43390@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43390}: CPython now sets the @code{SA_ONSTACK} flag in @code{PyOS_setsig} for
the VM’s default signal handlers.  This is friendlier to other in-process
code that an extension module or embedding use could pull in (such as
Golang’s cgo) where tiny thread stacks are the norm and @code{sigaltstack()}
has been used to provide for signal handlers.  This is a no-op change for
the vast majority of processes that don’t use sigaltstack.

@item 
bpo-43287@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43287}: Speed up calls to @code{filter()} by using the 
@geindex Python 향상 제안; PEP 590
PEP 590@footnote{https://peps.python.org/pep-0590/}
@code{vectorcall} calling convention. Patch by Donghee Na.

@item 
bpo-37448@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37448}: Add a radix tree based memory map to track in-use obmalloc
arenas. Use to replace the old implementation of address_in_range(). The
radix tree approach makes it easy to increase pool sizes beyond the OS
page size. Boosting the pool and arena size allows obmalloc to handle a
significantly higher percentage of requests from its ultra-fast paths.

It also has the advantage of eliminating the memory unsanitary behavior of
the previous address_in_range(). The old address_in_range() was marked
with the annotations _Py_NO_SANITIZE_ADDRESS, _Py_NO_SANITIZE_THREAD, and
_Py_NO_SANITIZE_MEMORY. Those annotations are no longer needed.

To disable the radix tree map, set a preprocessor flag as follows:
@code{-DWITH_PYMALLOC_RADIX_TREE=0}.

Co-authored-by: Tim Peters <@email{tim.peters@@gmail.com}>

@item 
bpo-29988@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29988}: Only handle asynchronous exceptions and requests to drop the
GIL when returning from a call or on the back edges of loops. Makes sure
that @ref{1505,,__exit__()} is always called in with statements, even
for interrupts.
@end itemize

@node Library<121>,Documentation<38>,Core and Builtins<118>,Python 3 10 0 alpha 7
@anchor{whatsnew/changelog id531}@anchor{1c8b}
@subsubsection Library



@itemize -

@item 
bpo-43720@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43720}: Document various stdlib deprecations in imp, pkgutil, and
importlib.util for removal in Python 3.12.

@item 
bpo-43433@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43433}: @ref{c4b,,xmlrpc.client.ServerProxy} no longer ignores query and
fragment in the URL of the server.

@item 
bpo-31956@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31956}: The @ref{9e1,,index()} method of @ref{4c0,,array.array}
now has optional `start' and `stop' parameters.

@item 
bpo-40066@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40066}: Enum: adjust @code{repr()} to show only enum and member name (not
value, nor angle brackets) and @code{str()} to show only member name.  Update
and improve documentation to match.

@item 
bpo-42136@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42136}: Deprecate all module_repr() methods found in importlib as their
use is being phased out by Python 3.12.

@item 
bpo-35930@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35930}: Raising an exception raised in a “future” instance will create
reference cycles.

@item 
bpo-41369@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41369}: Finish updating the vendored libmpdec to version 2.5.1.  Patch
by Stefan Krah.

@item 
bpo-43422@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43422}: Revert the _decimal C API which was added in bpo-41324@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41324}.

@item 
bpo-43577@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43577}: Fix deadlock when using @ref{357,,ssl.SSLContext} debug callback
with @ref{1c8c,,ssl.SSLContext.sni_callback()}.

@item 
bpo-43571@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43571}: It’s now possible to create MPTCP sockets with IPPROTO_MPTCP

@item 
bpo-43542@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43542}: @code{image/heic} and @code{image/heif} were added to
@ref{93,,mimetypes}.

@item 
bpo-40645@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40645}: The @ref{6e,,hmac} module now uses OpenSSL’s HMAC implementation
when digestmod argument is a hash name or builtin hash function.

@item 
bpo-43510@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43510}: Implement 
@geindex Python 향상 제안; PEP 597
PEP 597@footnote{https://peps.python.org/pep-0597/}: Add @code{EncodingWarning} warning, @code{-X
warn_default_encoding} option, 
@geindex PYTHONWARNDEFAULTENCODING
@geindex 환경 변수; PYTHONWARNDEFAULTENCODING
@ref{9bf,,PYTHONWARNDEFAULTENCODING}
environment variable and @code{encoding="locale"} argument value.

@item 
bpo-43521@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43521}: @code{ast.unparse} can now render NaNs and empty sets.

@item 
bpo-42914@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42914}: @ref{a29,,pprint.pprint()} gains a new boolean
@code{underscore_numbers} optional argument to emit integers with thousands
separated by an underscore character for improved readability (for example
@code{1_000_000} instead of @code{1000000}).

@item 
bpo-41361@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41361}: @ref{1c8d,,rotate()} calls are now slightly faster
due to faster argument parsing.

@item 
bpo-43423@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43423}: @code{subprocess.communicate()} no longer raises an IndexError
when there is an empty stdout or stderr IO buffer during a timeout on
Windows.

@item 
bpo-27820@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27820}: Fixed long-standing bug of smtplib.SMTP where doing AUTH LOGIN
with initial_response_ok=False will fail.

The cause is that SMTP.auth_login _always_ returns a password if provided
with a challenge string, thus non-compliant with the standard for AUTH
LOGIN.

Also fixes bug with the test for smtpd.

@item 
bpo-43445@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43445}: Add frozen modules to @ref{a42,,sys.stdlib_module_names}. For
example, add @code{"_frozen_importlib"} and @code{"_frozen_importlib_external"}
names.

@item 
bpo-43245@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43245}: Add keyword arguments support to @code{ChainMap.new_child()}.

@item 
bpo-29982@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29982}: Add optional parameter `ignore_cleanup_errors' to
@ref{1439,,tempfile.TemporaryDirectory()} and allow multiple @code{cleanup()}
attempts. Contributed by C.A.M. Gerlach.

@item 
bpo-43428@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43428}: Include changes from importlib_metadata 3.7@footnote{https://importlib-metadata.readthedocs.io/en/latest/history.html#v3-7-0}:

Performance enhancements to distribution discovery.

@code{entry_points} only returns unique distributions.

Introduces new @code{EntryPoints} object for containing a set of entry points
with convenience methods for selecting entry points by group or name.
@code{entry_points} now returns this object if selection parameters are
supplied but continues to return a dict object for compatibility. Users
are encouraged to rely on the selection interface. The dict object result
is likely to be deprecated in the future.

Added packages_distributions function to return a mapping of packages to
the distributions that provide them.

@item 
bpo-43332@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43332}: Improves the networking efficiency of @ref{73,,http.client} when
using a proxy via @code{set_tunnel()}.  Fewer small send
calls are made during connection setup.

@item 
bpo-43420@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43420}: Improve performance of @ref{213,,fractions.Fraction} arithmetics
for large components.  Contributed by Sergey B. Kirpichev.

@item 
bpo-43356@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43356}: Allow passing a signal number to @code{_thread.interrupt_main()}.

@item 
bpo-43399@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43399}: Fix @code{ElementTree.extend} not working on iterators when using
the Python implementation

@item 
bpo-43369@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43369}: Improve @ref{d4,,sqlite3} error handling: If
@code{sqlite3_column_text()} and @code{sqlite3_column_blob()} set
@code{SQLITE_NOMEM}, @ref{175f,,MemoryError} is now raised. Patch by Erlend E.
Aasland.

@item 
bpo-43368@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43368}: Fix a regression introduced in PR 24562, where an empty
bytestring was fetched as @code{None} instead of @code{b'@w{'}} in @ref{d4,,sqlite3}.
Patch by Mariusz Felisiak.

@item 
bpo-41282@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41282}: Fixed stacklevel of @code{DeprecationWarning} emitted from
@code{import distutils}.

@item 
bpo-42129@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42129}: @code{importlib.resources} now honors namespace packages, merging
resources from each location in the namespace as introduced in
@code{importlib_resources} 3.2 and including incidental changes through
5.0.3.

@item 
bpo-43295@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43295}: @ref{1951,,datetime.datetime.strptime()} now raises @code{ValueError}
instead of @code{IndexError} when matching @code{'z'} with the @code{%z} format
specifier.

@item 
bpo-43125@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43125}: Return empty string if base64mime.body_encode receive empty
bytes

@item 
bpo-43084@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43084}: @ref{1c8e,,curses.window.enclose()} returns now @code{True} or @code{False}
(as was documented) instead of @code{1} or @code{0}.

@item 
bpo-42994@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42994}: Add MIME types for opus, AAC, 3gpp and 3gpp2

@item 
bpo-14678@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14678}: Add an invalidate_caches() method to the zipimport.zipimporter
class to support importlib.invalidate_caches(). Patch by Desmond Cheong.

@item 
bpo-42782@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42782}: Fail fast in @ref{c50,,shutil.move()} to avoid creating destination
directories on failure.

@item 
bpo-40066@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40066}: Enum’s @code{repr()} and @code{str()} have changed: @code{repr()} is now
`EnumClass.MemberName' and @code{str()} is `MemberName'.  Additionally,
stdlib Enum’s whose contents are available as module attributes, such as
@code{RegexFlag.IGNORECASE}, have their @code{repr()} as `module.name', e.g.
@code{re.IGNORECASE}.

@item 
bpo-26053@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26053}: Fixed bug where the @ref{aa,,pdb} interactive run command echoed
the args from the shell command line, even if those have been overridden
at the pdb prompt.

@item 
bpo-24160@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24160}: Fixed bug where breakpoints did not persist across multiple
debugger sessions in @ref{aa,,pdb}’s interactive mode.

@item 
bpo-40701@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40701}: When the @ref{1c8f,,tempfile.tempdir} global variable is set to a
value of type bytes, it is now handled consistently.  Previously
exceptions could be raised from some tempfile APIs when the directory did
not already exist in this situation.  Also ensures that the
@ref{1c90,,tempfile.gettempdir()} and @ref{1c91,,tempfile.gettempdirb()} functions
`always' return @code{str} and @code{bytes} respectively.

@item 
bpo-39342@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39342}: Expose @code{X509_V_FLAG_ALLOW_PROXY_CERTS} as
@ref{1c92,,VERIFY_ALLOW_PROXY_CERTS} to allow proxy certificate
validation as explained in
@indicateurl{https://docs.openssl.org/1.1.1/man7/proxy-certificates/}.

@item 
bpo-31861@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31861}: Add builtins.aiter and builtins.anext. Patch by Joshua Bronson
(@@jab), Daniel Pope (@@lordmauve), and Justin Wang (@@justin39).
@end itemize

@node Documentation<38>,Tests<38>,Library<121>,Python 3 10 0 alpha 7
@anchor{whatsnew/changelog id532}@anchor{1c93}
@subsubsection Documentation



@itemize -

@item 
bpo-43199@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43199}: Answer “Why is there no goto?” in the Design and History FAQ.

@item 
bpo-43407@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43407}: Clarified that a result from @ref{55b,,time.monotonic()},
@ref{c79,,time.perf_counter()}, @ref{c7a,,time.process_time()}, or
@ref{b30,,time.thread_time()} can be compared with the result from any
following call to the same function - not just the next immediate call.

@item 
bpo-43354@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43354}: Fix type documentation for @code{Fault.faultCode}; the type has to
be @code{int} instead of @code{str}.

@item 
bpo-41933@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41933}: Clarified wording of s * n in the Common Sequence Operations
@end itemize

@node Tests<38>,Build<45>,Documentation<38>,Python 3 10 0 alpha 7
@anchor{whatsnew/changelog id533}@anchor{1c94}
@subsubsection Tests



@itemize -

@item 
bpo-37945@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37945}: Fix test_getsetlocale_issue1813() of test_locale: skip the test
if @code{setlocale()} fails. Patch by Victor Stinner.

@item 
bpo-41561@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41561}: Add workaround for Ubuntu’s custom OpenSSL security level
policy.
@end itemize

@node Build<45>,Windows<39>,Tests<38>,Python 3 10 0 alpha 7
@anchor{whatsnew/changelog id534}@anchor{1c95}
@subsubsection Build



@itemize -

@item 
bpo-43179@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43179}: Introduce and correctly use ALIGNOF_X in place of SIZEOF_X for
alignment-related code in optimized string routines. Patch by Jessica
Clarke.

@item 
bpo-43631@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43631}: Update macOS, Windows, and CI to OpenSSL 1.1.1k.

@item 
bpo-43617@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43617}: Improve configure.ac: Check for presence of autoconf-archive
package and remove our copies of M4 macros.

@item 
bpo-43466@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43466}: The @code{configure} script now supports @code{--with-openssl-rpath}
option.

@item 
bpo-43372@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43372}: Use @code{_freeze_importlib} to generate code for the
@code{__hello__} module. This approach ensures the code matches the
interpreter version.  Previously, PYTHON_FOR_REGEN was used to generate
the code, which might be wrong.  The marshal format for code objects has
changed with bpo-42246@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42246}, commit 877df851. Update the code and the expected
code sizes in ctypes test_frozentable.
@end itemize

@node Windows<39>,IDLE<21>,Build<45>,Python 3 10 0 alpha 7
@anchor{whatsnew/changelog id535}@anchor{1c96}
@subsubsection Windows



@itemize -

@item 
bpo-43440@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43440}: Build @ref{d4,,sqlite3} with the @code{R*Tree} module enabled. Patch
by Erlend E. Aasland.
@end itemize

@node IDLE<21>,C API<40>,Windows<39>,Python 3 10 0 alpha 7
@anchor{whatsnew/changelog id536}@anchor{1c97}
@subsubsection IDLE



@itemize -

@item 
bpo-42225@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42225}: Document that IDLE can fail on Unix either from misconfigured
IP masquerade rules or failure displaying complex colored (non-ascii)
characters.
@end itemize

@node C API<40>,,IDLE<21>,Python 3 10 0 alpha 7
@anchor{whatsnew/changelog id537}@anchor{1c98}
@subsubsection C API



@itemize -

@item 
bpo-43688@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43688}: The limited C API is now supported if Python is built in debug
mode (if the @code{Py_DEBUG} macro is defined). In the limited C API, the
@ref{78e,,Py_INCREF()} and @ref{78f,,Py_DECREF()} functions are now implemented
as opaque function calls, rather than accessing directly the
@ref{a9f,,PyObject.ob_refcnt} member, if Python is built in debug mode
and the @code{Py_LIMITED_API} macro targets Python 3.10 or newer. It became
possible to support the limited C API in debug mode because the
@ref{5dc,,PyObject} structure is the same in release and debug mode since
Python 3.8 (see bpo-36465@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36465}).

The limited C API is still not supported in the @code{--with-trace-refs}
special build (@code{Py_TRACE_REFS} macro).

Patch by Victor Stinner.

@item 
bpo-43244@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43244}: Remove the @code{pyarena.h} header file with functions:


@itemize *

@item 
@code{PyArena_New()}

@item 
@code{PyArena_Free()}

@item 
@code{PyArena_Malloc()}

@item 
@code{PyArena_AddPyObject()}
@end itemize

These functions were undocumented, excluded from the limited C API, and
were only used internally by the compiler. Patch by Victor Stinner.

@item 
bpo-43244@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43244}: Remove the compiler and parser functions using @code{struct _mod}
type, because the public AST C API was removed:


@itemize *

@item 
@code{PyAST_Compile()}

@item 
@code{PyAST_CompileEx()}

@item 
@code{PyAST_CompileObject()}

@item 
@code{PyFuture_FromAST()}

@item 
@code{PyFuture_FromASTObject()}

@item 
@code{PyParser_ASTFromFile()}

@item 
@code{PyParser_ASTFromFileObject()}

@item 
@code{PyParser_ASTFromFilename()}

@item 
@code{PyParser_ASTFromString()}

@item 
@code{PyParser_ASTFromStringObject()}
@end itemize

These functions were undocumented and excluded from the limited C API.
Patch by Victor Stinner.

@item 
bpo-43244@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43244}: Remove @code{ast.h}, @code{asdl.h}, and @code{Python-ast.h} header
files. These functions were undocumented and excluded from the limited C
API. Most names defined by these header files were not prefixed by @code{Py}
and so could create names conflicts. For example, @code{Python-ast.h} defined
a @code{Yield} macro which was conflict with the @code{Yield} name used by the
Windows @code{<winbase.h>} header. Use the Python @ref{9,,ast} module instead.
Patch by Victor Stinner.

@item 
bpo-43541@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43541}: Fix a @code{PyEval_EvalCodeEx()} regression: fix reference
counting on builtins. Patch by Victor Stinner.

@item 
bpo-43244@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43244}: Remove the @code{symtable.h} header file and the undocumented
functions:


@itemize *

@item 
@code{PyST_GetScope()}

@item 
@code{PySymtable_Build()}

@item 
@code{PySymtable_BuildObject()}

@item 
@code{PySymtable_Free()}

@item 
@code{Py_SymtableString()}

@item 
@code{Py_SymtableStringObject()}
@end itemize

The @code{Py_SymtableString()} function was part the stable ABI by mistake
but it could not be used, because the @code{symtable.h} header file was
excluded from the limited C API.

The Python @ref{de,,symtable} module remains available and is unchanged.

Patch by Victor Stinner.

@item 
bpo-43244@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43244}: Remove the @code{PyAST_Validate()} function. It is no longer
possible to build a AST object (@code{mod_ty} type) with the public C API.
The function was already excluded from the limited C API (
@geindex Python 향상 제안; PEP 384
PEP 384@footnote{https://peps.python.org/pep-0384/}).
Patch by Victor Stinner.
@end itemize

@node Python 3 10 0 alpha 6,Python 3 10 0 alpha 5,Python 3 10 0 alpha 7,Changelog
@anchor{whatsnew/changelog python-3-10-0-alpha-6}@anchor{1c99}
@subsection Python 3.10.0 alpha 6


`Release date: 2021-03-01'

@menu
* Security: Security<33>. 
* Core and Builtins: Core and Builtins<119>. 
* Library: Library<122>. 
* Core and Builtins: Core and Builtins<120>. 
* Library: Library<123>. 
* Core and Builtins: Core and Builtins<121>. 
* Library: Library<124>. 
* Documentation: Documentation<39>. 
* Tests: Tests<39>. 
* Build: Build<46>. 
* Windows: Windows<40>. 
* macOS: macOS<29>. 
* IDLE: IDLE<22>. 
* C API: C API<41>. 

@end menu

@node Security<33>,Core and Builtins<119>,,Python 3 10 0 alpha 6
@anchor{whatsnew/changelog id538}@anchor{1c9a}
@subsubsection Security



@itemize -

@item 
bpo-42967@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42967}: Fix web cache poisoning vulnerability by defaulting the query
args separator to @code{&}, and allowing the user to choose a custom
separator.
@end itemize

@node Core and Builtins<119>,Library<122>,Security<33>,Python 3 10 0 alpha 6
@anchor{whatsnew/changelog id539}@anchor{1c9b}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-43321@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43321}: Fix @code{SystemError} raised when @code{PyArg_Parse*()} is used with
@code{#} but without @code{PY_SSIZE_T_CLEAN} defined.

@item 
bpo-36346@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36346}: @code{PyArg_Parse*()} functions now emits @code{DeprecationWarning}
when @code{u} or @code{Z} format is used. See 
@geindex Python 향상 제안; PEP 623
PEP 623@footnote{https://peps.python.org/pep-0623/} for detail.

@item 
bpo-43277@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43277}: Add a new @ref{a9d,,PySet_CheckExact()} function to the C-API to
check if an object is an instance of @ref{184,,set} but not an instance of a
subtype. Patch by Pablo Galindo.

@item 
bpo-42990@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42990}: The @ref{a83,,types.FunctionType} constructor now inherits the
current builtins if the `globals' dictionary has no @code{"__builtins__"}
key, rather than using @code{@{"None": None@}} as builtins: same behavior as
@ref{4a4,,eval()} and @ref{4a3,,exec()} functions. Defining a function with @code{def
function(...): ...} in Python is not affected, globals cannot be
overridden with this syntax: it also inherits the current builtins. Patch
by Victor Stinner.

@item 
bpo-42990@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42990}: Functions have a new @code{__builtins__} attribute which is used
to look for builtin symbols when a function is executed, instead of
looking into @code{__globals__['__builtins__']}. Patch by Mark Shannon and
Victor Stinner.

@item 
bpo-43149@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43149}: Improve the error message in the parser for exception groups
without parentheses. Patch by Pablo Galindo.

@item 
bpo-43121@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43121}: Fixed an incorrect @ref{18e,,SyntaxError} message for missing comma
in literals. Patch by Pablo Galindo.
@end itemize

@node Library<122>,Core and Builtins<120>,Core and Builtins<119>,Python 3 10 0 alpha 6
@anchor{whatsnew/changelog id540}@anchor{1c9c}
@subsubsection Library



@itemize -

@item 
bpo-42819@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42819}: @ref{bf,,readline}: Explicitly disable bracketed paste in the
interactive interpreter, even if it’s set in the inputrc, is enabled by
default (eg GNU Readline 8.1), or a user calls
@code{readline.read_init_file()}. The Python REPL has not implemented
bracketed paste support. Also, bracketed mode writes the @code{"\x1b[?2004h"}
escape sequence into stdout which causes test failures in applications
that don’t support it. It can still be explicitly enabled by calling
@code{readline.parse_and_bind("set enable-bracketed-paste on")}. Patch by
Dustin Rodrigues.
@end itemize

@node Core and Builtins<120>,Library<123>,Library<122>,Python 3 10 0 alpha 6
@anchor{whatsnew/changelog id541}@anchor{1c9d}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-42808@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42808}: Simple calls to @code{type(object)} are now faster due to the
@code{vectorcall} calling convention. Patch by Dennis Sweeney.

@item 
bpo-42217@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42217}: Make the compiler merges same co_code and co_linetable objects
in a module like already did for co_consts.

@item 
bpo-41972@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41972}: Substring search functions such as @code{str1 in str2} and
@code{str2.find(str1)} now sometimes use the “Two-Way” string comparison
algorithm to avoid quadratic behavior on long strings.

@item 
bpo-42128@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42128}: Implement 
@geindex Python 향상 제안; PEP 634
PEP 634@footnote{https://peps.python.org/pep-0634/} (structural pattern matching). Patch by
Brandt Bucher.
@end itemize

@node Library<123>,Core and Builtins<121>,Core and Builtins<120>,Python 3 10 0 alpha 6
@anchor{whatsnew/changelog id542}@anchor{1c9e}
@subsubsection Library



@itemize -

@item 
bpo-40692@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40692}: In the @ref{1d6,,concurrent.futures.ProcessPoolExecutor},
validate that @code{multiprocess.synchronize()} is available on a given
platform and rely on that check in the @ref{24,,concurrent.futures} test
suite so we can run tests that are unrelated to
@code{ProcessPoolExecutor} on those platforms.
@end itemize

@node Core and Builtins<121>,Library<124>,Library<123>,Python 3 10 0 alpha 6
@anchor{whatsnew/changelog id543}@anchor{1c9f}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-38302@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38302}: If @ref{9d3,,object.__ipow__()} returns @ref{1a2,,NotImplemented}, the
operator will correctly fall back to @ref{9d4,,object.__pow__()} and
@ref{1a5,,object.__rpow__()} as expected.
@end itemize

@node Library<124>,Documentation<39>,Core and Builtins<121>,Python 3 10 0 alpha 6
@anchor{whatsnew/changelog id544}@anchor{1ca0}
@subsubsection Library



@itemize -

@item 
bpo-43316@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43316}: The @code{python -m gzip} command line application now properly
fails when detecting an unsupported extension. It exits with a non-zero
exit code and prints an error message to stderr.

@item 
bpo-43317@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43317}: Set the chunk size for the @code{gzip} module main function to
io.DEFAULT_BUFFER_SIZE. This is slightly faster than the 1024 bytes
constant that was used previously.

@item 
bpo-43146@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43146}: Handle None in single-arg versions of
@ref{a4f,,print_exception()} and
@ref{a4d,,format_exception()}.

@item 
bpo-43260@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43260}: Fix TextIOWrapper can not flush internal buffer forever after
very large text is written.

@item 
bpo-43258@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43258}: Prevent needless allocation of @ref{d4,,sqlite3} aggregate
function context when no rows match an aggregate query. Patch by Erlend E.
Aasland.

@item 
bpo-43251@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43251}: Improve @ref{d4,,sqlite3} error handling:
@code{sqlite3_column_name()} failures now result in @ref{175f,,MemoryError}. Patch
by Erlend E. Aasland.

@item 
bpo-40956@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40956}: Fix segfault in @ref{d72,,sqlite3.Connection.backup()} if no
argument was provided. The regression was introduced by PR 23838. Patch by
Erlend E. Aasland.

@item 
bpo-43172@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43172}: The readline module now passes its tests when built directly
against libedit. Existing irreconcilable API differences remain in
@ref{1ca1,,readline.get_begidx()} and @ref{1ca2,,readline.get_endidx()} behavior based
on libreadline vs libedit use.

@item 
bpo-43163@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43163}: Fix a bug in @ref{1d,,codeop} that was causing it to not ask for
more input when multi-line snippets have unclosed parentheses. Patch by
Pablo Galindo

@item 
bpo-43162@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43162}: deprecate unsupported ability to access enum members as
attributes of other enum members

@item 
bpo-43146@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43146}: Fix recent regression in None argument handling in
@ref{104,,traceback} module functions.

@item 
bpo-43102@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43102}: The namedtuple __new__ method had its __builtins__ set to None
instead of an actual dictionary.  This created problems for introspection
tools.

@item 
bpo-43106@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43106}: Added @ref{a1b,,O_EVTONLY}, @ref{a1c,,O_FSYNC},
@ref{a1d,,O_SYMLINK} and @ref{a1e,,O_NOFOLLOW_ANY} for macOS. Patch by
Donghee Na.

@item 
bpo-42960@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42960}: Adds @ref{1ca3,,resource.RLIMIT_KQUEUES} constant from FreeBSD to
the @ref{c1,,resource} module.

@item 
bpo-42151@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42151}: Make the pure Python implementation of
@ref{12b,,xml.etree.ElementTree} behave the same as the C implementation
(@code{_elementree}) regarding default attribute values (by not setting
@code{specified_attributes=1}).

@item 
bpo-29753@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29753}: In ctypes, now packed bitfields are calculated properly and the
first item of packed bitfields is now shrank correctly.
@end itemize

@node Documentation<39>,Tests<39>,Library<124>,Python 3 10 0 alpha 6
@anchor{whatsnew/changelog id545}@anchor{1ca4}
@subsubsection Documentation



@itemize -

@item 
bpo-27646@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27646}: Clarify that ‘yield from <expr>’ works with any iterable, not
just iterators.

@item 
bpo-36346@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36346}: Update some deprecated unicode APIs which are documented as
“will be removed in 4.0” to “3.12”. See 
@geindex Python 향상 제안; PEP 623
PEP 623@footnote{https://peps.python.org/pep-0623/} for detail.
@end itemize

@node Tests<39>,Build<46>,Documentation<39>,Python 3 10 0 alpha 6
@anchor{whatsnew/changelog id546}@anchor{1ca5}
@subsubsection Tests



@itemize -

@item 
bpo-43288@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43288}: Fix test_importlib to correctly skip Unicode file tests if the
filesystem does not support them.
@end itemize

@node Build<46>,Windows<40>,Tests<39>,Python 3 10 0 alpha 6
@anchor{whatsnew/changelog id547}@anchor{1ca6}
@subsubsection Build



@itemize -

@item 
bpo-43174@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43174}: Windows build now uses @code{/utf-8} compiler option.

@item 
bpo-43103@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43103}: Add a new configure @code{--without-static-libpython} option to
not build the @code{libpythonMAJOR.MINOR.a} static library and not install
the @code{python.o} object file.

@item 
bpo-13501@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13501}: The configure script can now use `libedit' instead of
`readline' with the command line option @code{--with-readline=editline}.

@item 
bpo-42603@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42603}: Make configure script use pkg-config to detect the location of
Tcl/Tk headers and libraries, used to build tkinter.

On macOS, a Tcl/Tk configuration provided by pkg-config will be preferred
over Tcl/Tk frameworks installed in @code{/@{System/,@}Library/Frameworks}. If
both exist and the latter is preferred, the appropriate @code{--with-tcltk-*}
configuration options need to be explicitly set.

@item 
bpo-39448@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39448}: Add the “regen-frozen” makefile target that regenerates the
code for the frozen @code{__hello__} module.
@end itemize

@node Windows<40>,macOS<29>,Build<46>,Python 3 10 0 alpha 6
@anchor{whatsnew/changelog id548}@anchor{1ca7}
@subsubsection Windows



@itemize -

@item 
bpo-43155@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43155}: @ref{1ca8,,PyCMethod_New()} is now present in @code{python3.lib}.
@end itemize

@node macOS<29>,IDLE<22>,Windows<40>,Python 3 10 0 alpha 6
@anchor{whatsnew/changelog id549}@anchor{1ca9}
@subsubsection macOS



@itemize -

@item 
bpo-41837@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41837}: Update macOS installer build to use OpenSSL 1.1.1j.
@end itemize

@node IDLE<22>,C API<41>,macOS<29>,Python 3 10 0 alpha 6
@anchor{whatsnew/changelog id550}@anchor{1caa}
@subsubsection IDLE



@itemize -

@item 
bpo-43283@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43283}: Document why printing to IDLE’s Shell is often slower than
printing to a system terminal and that it can be made faster by
pre-formatting a single string before printing.
@end itemize

@node C API<41>,,IDLE<22>,Python 3 10 0 alpha 6
@anchor{whatsnew/changelog id551}@anchor{1cab}
@subsubsection C API



@itemize -

@item 
bpo-43278@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43278}: Always put compiler and system information on the first line of
the REPL welcome message.

@item 
bpo-43270@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43270}: Remove the private @code{_PyErr_OCCURRED()} macro: use the public
@ref{1cac,,PyErr_Occurred()} function instead.

@item 
bpo-35134@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35134}: Move odictobject.h, parser_interface.h, picklebufobject.h,
pydebug.h, and pyfpe.h into the cpython/ directory. They must not be
included directly, as they are already included by Python.h: @ref{986,,Include Files}.

@item 
bpo-35134@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35134}: Move pyarena.h, pyctype.h, and pytime.h into the cpython/
directory. They must not be included directly, as they are already
included by Python.h: @ref{986,,Include Files}.

@item 
bpo-40170@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40170}: @ref{c5a,,PyExceptionClass_Name()} is now always declared as a
function, in order to hide implementation details. The macro accessed
@ref{1cad,,PyTypeObject.tp_name} directly.  Patch by Erlend E. Aasland.

@item 
bpo-43239@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43239}: The @ref{1cae,,PyCFunction_New()} function is now exported in the
ABI when compiled with @code{-fvisibility=hidden}.

@item 
bpo-40170@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40170}: @ref{1caf,,PyIter_Check()} is now always declared as a function, in
order to hide implementation details. The macro accessed
@ref{16f5,,PyTypeObject.tp_iternext} directly. Patch by Erlend E. Aasland.

@item 
bpo-40170@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40170}: Convert @ref{1cb0,,PyDescr_IsData()} macro to a function to hide
implementation details: The macro accessed
@ref{1cb1,,PyTypeObject.tp_descr_set} directly. Patch by Erlend E.
Aasland.

@item 
bpo-43181@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43181}: Convert @ref{1cb2,,PyObject_TypeCheck()} macro to a static inline
function. Patch by Erlend E. Aasland.
@end itemize

@node Python 3 10 0 alpha 5,Python 3 10 0 alpha 4,Python 3 10 0 alpha 6,Changelog
@anchor{whatsnew/changelog python-3-10-0-alpha-5}@anchor{1cb3}
@subsection Python 3.10.0 alpha 5


`Release date: 2021-02-02'

@menu
* Security: Security<34>. 
* Core and Builtins: Core and Builtins<122>. 
* Library: Library<125>. 
* Core and Builtins: Core and Builtins<123>. 
* Library: Library<126>. 
* Documentation: Documentation<40>. 
* Tests: Tests<40>. 
* Build: Build<47>. 
* Windows: Windows<41>. 
* macOS: macOS<30>. 
* IDLE: IDLE<23>. 
* C API: C API<42>. 

@end menu

@node Security<34>,Core and Builtins<122>,,Python 3 10 0 alpha 5
@anchor{whatsnew/changelog id552}@anchor{1cb4}
@subsubsection Security



@itemize -

@item 
bpo-42938@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42938}: Avoid static buffers when computing the repr of
@ref{1cb5,,ctypes.c_double} and @ref{1cb6,,ctypes.c_longdouble} values.
@end itemize

@node Core and Builtins<122>,Library<125>,Security<34>,Python 3 10 0 alpha 5
@anchor{whatsnew/changelog id553}@anchor{1cb7}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-42990@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42990}: Refactor the @code{PyEval_} family of functions.


@itemize *

@item 
An new function @code{_PyEval_Vector} is added to simplify calls to Python from C.

@item 
@code{_PyEval_EvalCodeWithName} is removed

@item 
@code{PyEval_EvalCodeEx} is retained as part of the API, but is not used internally
@end itemize

@item 
bpo-38631@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38631}: Replace @ref{b79,,Py_FatalError()} calls in the compiler with
regular @ref{794,,SystemError} exceptions. Patch by Victor Stinner.

@item 
bpo-42997@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42997}: Improve error message for missing “:” before blocks. Patch by
Pablo Galindo.

@item 
bpo-43017@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43017}: Improve error message in the parser when using un-parenthesised
tuples in comprehensions. Patch by Pablo Galindo.

@item 
bpo-42986@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42986}: Fix parser crash when reporting syntax errors in f-string with
newlines. Patch by Pablo Galindo.

@item 
bpo-40176@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40176}: Syntax errors for unterminated string literals now point to the
start of the string instead of reporting EOF/EOL.

@item 
bpo-42927@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42927}: The inline cache for @code{LOAD_ATTR} now also optimizes access to
attributes defined by @code{__slots__}. This makes reading such attribute up
to 30% faster.

@item 
bpo-42864@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42864}: Improve error messages in the parser when parentheses are not
closed. Patch by Pablo Galindo.

@item 
bpo-42924@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42924}: Fix @code{bytearray} repetition incorrectly copying data from the
start of the buffer, even if the data is offset within the buffer (e.g.
after reassigning a slice at the start of the @code{bytearray} to a shorter
byte string).

@item 
bpo-42882@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42882}: Fix the @code{_PyUnicode_FromId()} function
(_Py_IDENTIFIER(var) API) when @ref{460,,Py_Initialize()} /
@ref{45f,,Py_Finalize()} is called multiple times: preserve
@code{_PyRuntime.unicode_ids.next_index} value.

@item 
bpo-42827@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42827}: Fix a crash when working out the error line of a
@ref{18e,,SyntaxError} in some multi-line expressions.

@item 
bpo-42823@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42823}: frame.f_lineno is correct even if frame.f_trace is set to True
@end itemize

@node Library<125>,Core and Builtins<123>,Core and Builtins<122>,Python 3 10 0 alpha 5
@anchor{whatsnew/changelog id554}@anchor{1cb8}
@subsubsection Library



@itemize -

@item 
bpo-37324@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37324}: Remove deprecated aliases to
@ref{a78,,Collections 추상 베이스 클래스} from the @ref{1e,,collections}
module.
@end itemize

@node Core and Builtins<123>,Library<126>,Library<125>,Python 3 10 0 alpha 5
@anchor{whatsnew/changelog id555}@anchor{1cb9}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-41994@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41994}: Fixed possible leak in @code{import} when @code{sys.modules} is not a
@code{dict}.

@item 
bpo-27772@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27772}: In string formatting, preceding the `width' field by @code{'0'} no
longer affects the default alignment for strings.
@end itemize

@node Library<126>,Documentation<40>,Core and Builtins<123>,Python 3 10 0 alpha 5
@anchor{whatsnew/changelog id556}@anchor{1cba}
@subsubsection Library



@itemize -

@item 
bpo-43108@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43108}: Fixed a reference leak in the @ref{2f,,curses} module. Patch by
Pablo Galindo

@item 
bpo-43077@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43077}: Update the bundled pip to 21.0.1 and setuptools to 52.0.0.

@item 
bpo-41282@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41282}: Deprecate @code{distutils} in documentation and add warning on
import.

@item 
bpo-43014@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43014}: Improve performance of @ref{101,,tokenize} by 20-30%.  Patch by
Anthony Sottile.

@item 
bpo-42323@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42323}: Fix @ref{6bf,,math.nextafter()} for NaN on AIX.

@item 
bpo-42955@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42955}: Add @ref{a42,,sys.stdlib_module_names}, containing the list of the
standard library module names. Patch by Victor Stinner.

@item 
bpo-42944@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42944}: Fix @code{random.Random.sample} when @code{counts} argument is not
@code{None}.

@item 
bpo-42934@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42934}: Use @ref{561,,TracebackException}’s new @code{compact}
param in @ref{136c,,TestResult} to reduce time and memory consumed
by traceback formatting.

@item 
bpo-42931@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42931}: Add @code{randbytes()} to @code{random.__all__}.

@item 
bpo-38250@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38250}: [Enum] Flags consisting of a single bit are now considered
canonical, and will be the only flags returned from listing and iterating
over a Flag class or a Flag member.  Multi-bit flags are considered
aliases; they will be returned from lookups and operations that result in
their value. Iteration for both Flag and Flag members is in definition
order.

@item 
bpo-42877@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42877}: Added the @code{compact} parameter to the constructor of
@ref{561,,traceback.TracebackException} to reduce time and memory for use
cases that only need to call @code{TracebackException.format()} and
@code{TracebackException.format_exception_only()}.

@item 
bpo-42923@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42923}: The @ref{b79,,Py_FatalError()} function and the
@ref{5c,,faulthandler} module now dump the list of extension modules on a
fatal error.

@item 
bpo-42848@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42848}: Removed recursion from @ref{561,,TracebackException}
to allow it to handle long exception chains.

@item 
bpo-42901@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42901}: [Enum] move member creation from @code{EnumMeta.__new__} to
@code{_proto_member.__set_name__}, allowing members to be created and visible
in @code{__init_subclass__}.

@item 
bpo-42780@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42780}: Fix os.set_inheritable() for O_PATH file descriptors on Linux.

@item 
bpo-42866@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42866}: Fix a reference leak in the @code{getcodec()} function of CJK
codecs. Patch by Victor Stinner.

@item 
bpo-42846@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42846}: Convert the 6 CJK codec extension modules (_codecs_cn,
_codecs_hk, _codecs_iso2022, _codecs_jp, _codecs_kr and _codecs_tw) to the
multiphase initialization API (
@geindex Python 향상 제안; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}). Patch by Victor Stinner.

@item 
bpo-42851@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42851}: remove __init_subclass__ support for Enum members

@item 
bpo-42834@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42834}: Make internal caches of the @code{_json} module compatible with
subinterpreters.

@item 
bpo-41748@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41748}: Fix HTMLParser parsing rules for element attributes containing
commas with spaces. Patch by Karl Dubost.

@item 
bpo-40810@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40810}: Require SQLite 3.7.15 or newer. Patch by Erlend E. Aasland.

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Convert the _multibytecodec extension module (CJK codecs) to
multi-phase initialization (
@geindex Python 향상 제안; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}).  Patch by Erlend E. Aasland.

@item 
bpo-42802@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42802}: The distutils @code{bdist_wininst} command deprecated in Python
3.8 has been removed. The distutils @code{bdist_wheel} command is now
recommended to distribute binary packages on Windows.

@item 
bpo-24464@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24464}: The undocumented built-in function
@code{sqlite3.enable_shared_cache} is now deprecated, scheduled for removal
in Python 3.12.  Its use is strongly discouraged by the SQLite3
documentation.  Patch by Erlend E. Aasland.

@item 
bpo-42384@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42384}: Make pdb populate sys.path[0] exactly the same as regular
python execution.

@item 
bpo-42383@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42383}: Fix pdb: previously pdb would fail to restart the debugging
target if it was specified using a relative path and the current directory
changed.

@item 
bpo-42005@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42005}: Fix CLI of @ref{2b,,cProfile} and @ref{b4,,profile} to catch
@ref{125b,,BrokenPipeError}.

@item 
bpo-41604@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41604}: Don’t decrement the reference count of the previous user_ptr
when set_panel_userptr fails.

@item 
bpo-41149@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41149}: Allow executing callables that have a boolean value of
@code{False} when passed to @code{Threading.thread} as the target. Patch
contributed by Barney Stratford.

@item 
bpo-38307@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38307}: Add an ‘end_lineno’ attribute to the Class and Function objects
that appear in the tree returned by pyclbr functions.  This and the
existing ‘lineno’ attribute define the extent of class and def statements.
Patch by Aviral Srivastava.

@item 
bpo-39273@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39273}: The @code{BUTTON5_*} constants are now exposed in the
@ref{2f,,curses} module if available.

@item 
bpo-33289@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33289}: Correct call to @ref{f7,,tkinter.colorchooser} to return RGB
triplet of ints instead of floats.  Patch by Cheryl Sabella.
@end itemize

@node Documentation<40>,Tests<40>,Library<126>,Python 3 10 0 alpha 5
@anchor{whatsnew/changelog id557}@anchor{1cbb}
@subsubsection Documentation



@itemize -

@item 
bpo-40304@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40304}: Fix doc for type(name, bases, dict).  Patch by Boris
Verkhovskiy and Éric Araujo.

@item 
bpo-42811@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42811}: Updated importlib.util.resolve_name() doc to use
__spec__.parent instead of __package__. (Thanks Yair Frid.)
@end itemize

@node Tests<40>,Build<47>,Documentation<40>,Python 3 10 0 alpha 5
@anchor{whatsnew/changelog id558}@anchor{1cbc}
@subsubsection Tests



@itemize -

@item 
bpo-40823@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40823}: Use @code{unittest.TestLoader().loadTestsFromTestCase()} instead
of @code{unittest.makeSuite()} in @ref{d4,,sqlite3} tests. Patch by Erlend E.
Aasland.

@item 
bpo-40810@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40810}: In @ref{d4,,sqlite3}, fix @code{CheckTraceCallbackContent} for SQLite
pre 3.7.15.
@end itemize

@node Build<47>,Windows<41>,Tests<40>,Python 3 10 0 alpha 5
@anchor{whatsnew/changelog id559}@anchor{1cbd}
@subsubsection Build



@itemize -

@item 
bpo-43031@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43031}: Pass @code{--timeout=$(TESTTIMEOUT)} option to the default profile
task @code{./python -m test --pgo} command.

@item 
bpo-36143@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36143}: @code{make regen-all} now also runs @code{regen-keyword}. Patch by
Victor Stinner.

@item 
bpo-42874@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42874}: Removed the grep -q and -E flags in the tzpath validation
section of the configure script to better accommodate users of some
platforms (specifically Solaris 10).

@item 
bpo-31904@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31904}: Add library search path by wr-cc in add_cross_compiling_paths()
for VxWorks.

@item 
bpo-42856@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42856}: Add @code{--with-wheel-pkg-dir=PATH} option to the @code{./configure}
script. If specified, the @ref{59,,ensurepip} module looks for @code{setuptools}
and @code{pip} wheel packages in this directory: if both are present, these
wheel packages are used instead of ensurepip bundled wheel packages.

Some Linux distribution packaging policies recommend against bundling
dependencies. For example, Fedora installs wheel packages in the
@code{/usr/share/python-wheels/} directory and don’t install the
@code{ensurepip._bundled} package.
@end itemize

@node Windows<41>,macOS<30>,Build<47>,Python 3 10 0 alpha 5
@anchor{whatsnew/changelog id560}@anchor{1cbe}
@subsubsection Windows



@itemize -

@item 
bpo-41837@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41837}: Updated Windows installer to include OpenSSL 1.1.1i

@item 
bpo-42584@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42584}: Upgrade Windows installer to use SQLite 3.34.0.
@end itemize

@node macOS<30>,IDLE<23>,Windows<41>,Python 3 10 0 alpha 5
@anchor{whatsnew/changelog id561}@anchor{1cbf}
@subsubsection macOS



@itemize -

@item 
bpo-42504@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42504}: Ensure that the value of
sysconfig.get_config_var(‘MACOSX_DEPLOYMENT_TARGET’) is always a string,
even in when the value is parsable as an integer.
@end itemize

@node IDLE<23>,C API<42>,macOS<30>,Python 3 10 0 alpha 5
@anchor{whatsnew/changelog id562}@anchor{1cc0}
@subsubsection IDLE



@itemize -

@item 
bpo-43008@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43008}: Make IDLE invoke @ref{a0c,,sys.excepthook()} in normal, 2-process
mode. Patch by Ken Hilton.

@item 
bpo-33065@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33065}: Fix problem debugging user classes with __repr__ method.

@item 
bpo-23544@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23544}: Disable Debug=>Stack Viewer when user code is running or
Debugger is active, to prevent hang or crash.  Patch by Zackery Spytz.

@item 
bpo-32631@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32631}: Finish zzdummy example extension module: make menu entries
work; add docstrings and tests with 100% coverage.
@end itemize

@node C API<42>,,IDLE<23>,Python 3 10 0 alpha 5
@anchor{whatsnew/changelog id563}@anchor{1cc1}
@subsubsection C API



@itemize -

@item 
bpo-42979@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42979}: When Python is built in debug mode (with C assertions), calling
a type slot like @code{sq_length} (@code{__len__()} in Python) now fails with a
fatal error if the slot succeeded with an exception set, or failed with no
exception set. The error message contains the slot, the type name, and the
current exception (if an exception is set). Patch by Victor Stinner.

@item 
bpo-43030@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=43030}: Fixed a compiler warning in @ref{1cc2,,Py_UNICODE_ISSPACE()} on
platforms with signed @code{wchar_t}.
@end itemize

@node Python 3 10 0 alpha 4,Python 3 10 0 alpha 3,Python 3 10 0 alpha 5,Changelog
@anchor{whatsnew/changelog python-3-10-0-alpha-4}@anchor{1cc3}
@subsection Python 3.10.0 alpha 4


`Release date: 2021-01-04'

@menu
* Core and Builtins: Core and Builtins<124>. 
* Library: Library<127>. 
* Core and Builtins: Core and Builtins<125>. 
* Library: Library<128>. 
* Core and Builtins: Core and Builtins<126>. 
* Library: Library<129>. 
* Documentation: Documentation<41>. 
* Tests: Tests<41>. 
* Build: Build<48>. 
* macOS: macOS<31>. 
* Tools/Demos: Tools/Demos<28>. 
* C API: C API<43>. 

@end menu

@node Core and Builtins<124>,Library<127>,,Python 3 10 0 alpha 4
@anchor{whatsnew/changelog id564}@anchor{1cc4}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-42814@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42814}: Fix undefined behavior in @code{Objects/genericaliasobject.c}.

@item 
bpo-42806@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42806}: Fix the column offsets for f-strings @ref{9,,ast} nodes
surrounded by parentheses and for nodes that spawn multiple lines. Patch
by Pablo Galindo.

@item 
bpo-40631@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40631}: Fix regression where a single parenthesized starred expression
was a valid assignment target.

@item 
bpo-27794@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27794}: Improve the error message for failed writes/deletes to property
objects. When possible, the attribute name is now shown. Patch provided by
Yurii Karabas.

@item 
bpo-42745@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42745}: Make the type attribute lookup cache per-interpreter. Patch by
Victor Stinner.

@item 
bpo-42246@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42246}: Jumps to jumps are not eliminated when it would break PEP 626.

@item 
bpo-42246@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42246}: Make sure that the @code{f_lasti} and @code{f_lineno} attributes of a
frame are set correctly when an exception is raised or re-raised. Required
for PEP 626.

@item 
bpo-32381@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32381}: The coding cookie (ex: @code{# coding: latin1}) is now ignored in
the command passed to the @ref{1a8,,-c} command line option. Patch by
Victor Stinner.

@item 
bpo-30858@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30858}: Improve error location in expressions that contain assignments.
Patch by Pablo Galindo and Lysandros Nikolaou.

@item 
bpo-42615@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42615}: Remove jump commands made redundant by the deletion of
unreachable bytecode blocks
@end itemize

@node Library<127>,Core and Builtins<125>,Core and Builtins<124>,Python 3 10 0 alpha 4
@anchor{whatsnew/changelog id565}@anchor{1cc5}
@subsubsection Library



@itemize -

@item 
bpo-42639@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42639}: Make the @ref{d,,atexit} module state per-interpreter. It is now
safe have more than one @code{atexit} module instance. Patch by Donghee Na
and Victor Stinner.
@end itemize

@node Core and Builtins<125>,Library<128>,Library<127>,Python 3 10 0 alpha 4
@anchor{whatsnew/changelog id566}@anchor{1cc6}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-32381@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32381}: Fix encoding name when running a @code{.pyc} file on Windows:
@ref{1cc7,,PyRun_SimpleFileExFlags()} now uses the correct encoding to
decode the filename.
@end itemize

@node Library<128>,Core and Builtins<126>,Core and Builtins<125>,Python 3 10 0 alpha 4
@anchor{whatsnew/changelog id567}@anchor{1cc8}
@subsubsection Library



@itemize -

@item 
bpo-42195@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42195}: The @code{__args__} of the parameterized generics for
@ref{9c8,,typing.Callable} and @ref{9eb,,collections.abc.Callable} are now
consistent.  The @code{__args__} for @code{collections.abc.Callable} are
now flattened while @code{typing.Callable}’s have not changed.  To allow
this change, @ref{9ec,,types.GenericAlias} can now be subclassed and
@code{collections.abc.Callable}’s @code{__class_getitem__} will now return a
subclass of @code{types.GenericAlias}.  Tests for typing were also updated to
not subclass things like @code{Callable[..., T]} as that is not a valid base
class.  Finally, both @code{Callable}s no longer validate their
@code{argtypes}, in @code{Callable[[argtypes], resulttype]} to prepare for
@geindex Python 향상 제안; PEP 612
PEP 612@footnote{https://peps.python.org/pep-0612/}.  Patch by Ken Jin.

@item 
bpo-40137@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40137}: Convert functools module to use
@ref{772,,PyType_FromModuleAndSpec()}.

@item 
bpo-40077@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40077}: Convert @ref{8,,array} to use heap types, and establish module
state for these.

@item 
bpo-42008@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42008}: Fix _random.Random() seeding.

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port the @code{pyexpat} extension module to multi-phase
initialization (
@geindex Python 향상 제안; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}).
@end itemize

@node Core and Builtins<126>,Library<129>,Library<128>,Python 3 10 0 alpha 4
@anchor{whatsnew/changelog id568}@anchor{1cc9}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-40521@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40521}: Make the Unicode dictionary of interned strings compatible with
subinterpreters. Patch by Victor Stinner.

@item 
bpo-39465@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39465}: Make @code{_PyUnicode_FromId()} function compatible with
subinterpreters. Each interpreter now has an array of identifier objects
(interned strings decoded from UTF-8). Patch by Victor Stinner.
@end itemize

@node Library<129>,Documentation<41>,Core and Builtins<126>,Python 3 10 0 alpha 4
@anchor{whatsnew/changelog id569}@anchor{1cca}
@subsubsection Library



@itemize -

@item 
bpo-42257@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42257}: Handle empty string in variable executable in
platform.libc_ver()

@item 
bpo-42772@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42772}: randrange() now raises a TypeError when step is specified
without a stop argument.  Formerly, it silently ignored the step argument.

@item 
bpo-42759@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42759}: Fixed equality comparison of @code{tkinter.Variable} and
@ref{1ccb,,tkinter.font.Font}. Objects which belong to different Tcl
interpreters are now always different, even if they have the same name.

@item 
bpo-42756@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42756}: Configure LMTP Unix-domain socket to use socket global default
timeout when a timeout is not explicitly provided.

@item 
bpo-23328@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23328}: Allow / character in username, password fields on _PROXY
envars.

@item 
bpo-42740@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42740}: @ref{2ac,,typing.get_args()} and @ref{2ab,,typing.get_origin()} now
support 
@geindex Python 향상 제안; PEP 604
PEP 604@footnote{https://peps.python.org/pep-0604/} union types and 
@geindex Python 향상 제안; PEP 612
PEP 612@footnote{https://peps.python.org/pep-0612/} additions to @code{Callable}.

@item 
bpo-42655@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42655}: @ref{dc,,subprocess} `extra_groups' is now correctly passed into
setgroups() system call.

@item 
bpo-42727@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42727}: @code{EnumMeta.__prepare__} now accepts @code{**kwds} to properly
support @code{__init_subclass__}

@item 
bpo-38308@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38308}: Add optional `weights' to `statistics.harmonic_mean()'.

@item 
bpo-42721@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42721}: When simple query dialogs (@ref{fe,,tkinter.simpledialog}),
message boxes (@ref{fc,,tkinter.messagebox}) or color choose dialog
(@ref{f7,,tkinter.colorchooser}) are created without arguments `master' and
`parent', and the default root window is not yet created, and
@code{NoDefaultRoot()} was not called, a new temporal hidden root
window will be created automatically. It will not be set as the default
root window and will be destroyed right after closing the dialog window.
It will help to use these simple dialog windows in programs which do not
need other GUI.

@item 
bpo-25246@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25246}: Optimized @ref{1ccc,,collections.deque.remove()}.

@item 
bpo-35728@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35728}: Added a root parameter to @ref{1ccd,,tkinter.font.nametofont()}.

@item 
bpo-15303@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15303}: @ref{f6,,tkinter} supports now widgets with boolean value False.

@item 
bpo-42681@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42681}: Fixed range checks for color and pair numbers in @ref{2f,,curses}.

@item 
bpo-42685@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42685}: Improved placing of simple query windows in Tkinter (such as
@ref{1cce,,tkinter.simpledialog.askinteger()}). They are now centered at the
center of the parent window if it is specified and shown, otherwise at the
center of the screen.

@item 
bpo-9694@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9694}: Argparse help no longer uses the confusing phrase, “optional
arguments”. It uses “options” instead.

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port the @code{_thread} extension module to the multiphase
initialization API (
@geindex Python 향상 제안; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}) and convert its static types to heap
types.

@item 
bpo-37961@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37961}: Fix crash in @code{tracemalloc.Traceback.__repr__()} (regressed
in Python 3.9).

@item 
bpo-42630@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42630}: @ref{f6,,tkinter} functions and constructors which need a default
root window raise now @ref{244,,RuntimeError} with descriptive message instead
of obscure @ref{5ee,,AttributeError} or @ref{452,,NameError} if it is not created
yet or cannot be created automatically.

@item 
bpo-42639@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42639}: @code{atexit._run_exitfuncs()} now logs callback exceptions
using @ref{506,,sys.unraisablehook}, rather than logging them directly into
@ref{b33,,sys.stderr} and raise the last exception.

@item 
bpo-42644@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42644}: @code{logging.disable} will now validate the types and value of
its parameter. It also now accepts strings representing the levels (as
does @code{logging.setLevel}) instead of only the numerical values.

@item 
bpo-42639@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42639}: At Python exit, if a callback registered with
@ref{a7e,,atexit.register()} fails, its exception is now logged. Previously,
only some exceptions were logged, and the last exception was always
silently ignored.

@item 
bpo-36541@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36541}: Fixed lib2to3.pgen2 to be able to parse PEP-570 positional only
argument syntax.

@item 
bpo-42382@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42382}: In @code{importlib.metadata}: -  @code{EntryPoint} objects now expose
a @code{.dist} object referencing the @code{Distribution} when constructed from
a @code{Distribution}. - Add support for package discovery under package
normalization rules. - The object returned by @code{metadata()} now has a
formally defined protocol called @code{PackageMetadata} with declared support
for the @code{.get_all()} method. - Synced with importlib_metadata 3.3.

@item 
bpo-41877@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41877}: A check is added against misspellings of autospect, auto_spec
and set_spec being passed as arguments to patch, patch.object and
create_autospec.

@item 
bpo-39717@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39717}: [tarfile] update nested exception raising to use @code{from None}
or @code{from e}

@item 
bpo-41877@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41877}: AttributeError for suspected misspellings of assertions on
mocks are now pointing out that the cause are misspelled assertions and
also what to do if the misspelling is actually an intended attribute name.
The unittest.mock document is also updated to reflect the current set of
recognised misspellings.

@item 
bpo-41559@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41559}: Implemented 
@geindex Python 향상 제안; PEP 612
PEP 612@footnote{https://peps.python.org/pep-0612/}: added @code{ParamSpec} and @code{Concatenate}
to @ref{10a,,typing}.  Patch by Ken Jin.

@item 
bpo-42385@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42385}: StrEnum: fix _generate_next_value_ to return a str

@item 
bpo-31904@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31904}: Define THREAD_STACK_SIZE for VxWorks.

@item 
bpo-34750@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34750}: [Enum] @code{_EnumDict.update()} is now supported.

@item 
bpo-42517@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42517}: Enum: private names do not become members / do not generate
errors – they remain normal attributes

@item 
bpo-42678@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42678}: @code{Enum}: call @code{__init_subclass__} after members have been
added

@item 
bpo-28964@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28964}: @ref{e11,,ast.literal_eval()} adds line number information (if
available) in error message for malformed nodes.

@item 
bpo-42470@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42470}: @ref{94c,,random.sample()} no longer warns on a sequence which is
also a set.

@item 
bpo-31904@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31904}: @code{posixpath.expanduser()} returns the input `path' unchanged
if user home directory is None on VxWorks.

@item 
bpo-42388@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42388}: Fix subprocess.check_output(…, input=None) behavior when
text=True to be consistent with that of the documentation and
universal_newlines=True.

@item 
bpo-34463@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34463}: Fixed discrepancy between @ref{104,,traceback} and the interpreter
in formatting of SyntaxError with lineno not set (@code{traceback} was
changed to match interpreter).

@item 
bpo-42393@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42393}: Raise @ref{a81,,OverflowError} instead of silent truncation in
@ref{a80,,socket.ntohs()} and @ref{a7f,,socket.htons()}.  Silent truncation was
deprecated in Python 3.7. Patch by Erlend E. Aasland

@item 
bpo-42222@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42222}: Harmonized @ref{a6b,,random.randrange()} argument handling to match
@ref{b3d,,range()}.


@itemize *

@item 
The integer test and conversion in @code{randrange()} now uses
@ref{1ccf,,operator.index()}.

@item 
Non-integer arguments to @code{randrange()} are deprecated.

@item 
The @code{ValueError} is deprecated in favor of a @code{TypeError}.

@item 
It now runs a little faster than before.
@end itemize

(Contributed by Raymond Hettinger and Serhiy Storchaka.)

@item 
bpo-42163@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42163}: Restore compatibility for @code{uname_result} around deepcopy and
_replace.

@item 
bpo-42090@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42090}: @code{zipfile.Path.joinpath} now accepts arbitrary arguments, same
as @code{pathlib.Path.joinpath}.

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port the _csv module to the multi-phase initialization API
(
@geindex Python 향상 제안; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}).

@item 
bpo-42059@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42059}: @ref{332,,typing.TypedDict} types created using the alternative
call-style syntax now correctly respect the @code{total} keyword argument
when setting their @code{__required_keys__} and @code{__optional_keys__} class
attributes.

@item 
bpo-41960@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41960}: Add @code{globalns} and @code{localns} parameters to the
@ref{22f,,inspect.signature()} and @ref{941,,inspect.Signature.from_callable()}.

@item 
bpo-41907@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41907}: fix @code{format()} behavior for @code{IntFlag}

@item 
bpo-41891@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41891}: Ensure asyncio.wait_for waits for task completion

@item 
bpo-24792@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24792}: Fixed bug where @code{zipimporter} sometimes reports an
incorrect cause of import errors.

@item 
bpo-31904@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31904}: Fix site and sysconfig modules for VxWorks RTOS which has no
home directories.

@item 
bpo-41462@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41462}: Add @ref{1039,,os.set_blocking()} support for VxWorks RTOS.

@item 
bpo-40219@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40219}: Lowered @code{tkinter.ttk.LabeledScale} dummy widget to
prevent hiding part of the content label.

@item 
bpo-37193@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37193}: Fixed memory leak in @code{socketserver.ThreadingMixIn} introduced
in Python 3.7.

@item 
bpo-39068@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39068}: Fix initialization race condition in @code{a85encode()} and
@code{b85encode()} in @ref{f,,base64}. Patch by Brandon Stansbury.
@end itemize

@node Documentation<41>,Tests<41>,Library<129>,Python 3 10 0 alpha 4
@anchor{whatsnew/changelog id570}@anchor{1cd0}
@subsubsection Documentation



@itemize -

@item 
bpo-17140@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17140}: Add documentation for the
@ref{1cd1,,multiprocessing.pool.ThreadPool} class.

@item 
bpo-34398@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34398}: Prominently feature listings from the glossary in documentation
search results. Patch by Ammar Askar.
@end itemize

@node Tests<41>,Build<48>,Documentation<41>,Python 3 10 0 alpha 4
@anchor{whatsnew/changelog id571}@anchor{1cd2}
@subsubsection Tests



@itemize -

@item 
bpo-42794@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42794}: Update test_nntplib to use official group name of news.aioe.org
for testing. Patch by Donghee Na.

@item 
bpo-31904@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31904}: Skip some asyncio tests on VxWorks.

@item 
bpo-42641@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42641}: Enhance @code{test_select.test_select()}: it now takes 500
milliseconds rather than 10 seconds. Use Python rather than a shell to
make the test more portable.

@item 
bpo-31904@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31904}: Skip some tests in _test_all_chown_common() on VxWorks.

@item 
bpo-42199@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42199}: Fix bytecode helper assertNotInBytecode.

@item 
bpo-41443@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41443}: Add more attribute checking in test_posix.py

@item 
bpo-31904@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31904}: Disable os.popen and impacted tests on VxWorks

@item 
bpo-41439@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41439}: Port test_ssl and test_uuid to VxWorks RTOS.
@end itemize

@node Build<48>,macOS<31>,Tests<41>,Python 3 10 0 alpha 4
@anchor{whatsnew/changelog id572}@anchor{1cd3}
@subsubsection Build



@itemize -

@item 
bpo-42692@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42692}: Fix __builtin_available check on older compilers. Patch by
Joshua Root.

@item 
bpo-27640@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27640}: Added @code{--disable-test-modules} option to the @code{configure}
script: don’t build nor install test modules. Patch by Xavier de Gaye,
Thomas Petazzoni and Peixing Xin.

@item 
bpo-42604@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42604}: Now all platforms use a value for the “EXT_SUFFIX” build
variable derived from SOABI (for instance in freeBSD, “EXT_SUFFIX” is now
“.cpython-310d.so” instead of “.so”). Previously only Linux, Mac and
VxWorks were using a value for “EXT_SUFFIX” that included “SOABI”.

@item 
bpo-42598@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42598}: Fix implicit function declarations in configure which could
have resulted in incorrect configuration checks.  Patch contributed by
Joshua Root.

@item 
bpo-31904@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31904}: Enable libpython3.so for VxWorks.

@item 
bpo-29076@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29076}: Add fish shell support to macOS installer.
@end itemize

@node macOS<31>,Tools/Demos<28>,Build<48>,Python 3 10 0 alpha 4
@anchor{whatsnew/changelog id573}@anchor{1cd4}
@subsubsection macOS



@itemize -

@item 
bpo-42361@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42361}: Update macOS installer build to use Tcl/Tk 8.6.11 (rc2,
expected to be final release).

@item 
bpo-41837@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41837}: Update macOS installer build to use OpenSSL 1.1.1i.

@item 
bpo-42584@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42584}: Update macOS installer to use SQLite 3.34.0.
@end itemize

@node Tools/Demos<28>,C API<43>,macOS<31>,Python 3 10 0 alpha 4
@anchor{whatsnew/changelog id574}@anchor{1cd5}
@subsubsection Tools/Demos



@itemize -

@item 
bpo-42726@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42726}: Fixed Python 3 compatibility issue with gdb/libpython.py
handling of attribute dictionaries.

@item 
bpo-42613@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42613}: Fix @code{freeze.py} tool to use the prope config and library
directories. Patch by Victor Stinner.
@end itemize

@node C API<43>,,Tools/Demos<28>,Python 3 10 0 alpha 4
@anchor{whatsnew/changelog id575}@anchor{1cd6}
@subsubsection C API



@itemize -

@item 
bpo-42591@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42591}: Export the @code{Py_FrozenMain()} function: fix a Python 3.9.0
regression. Python 3.9 uses @code{-fvisibility=hidden} and the function was
not exported explicitly and so not exported.

@item 
bpo-32381@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32381}: Remove the private @code{_Py_fopen()} function which is no
longer needed. Use @code{_Py_wfopen()} or @code{_Py_fopen_obj()}
instead. Patch by Victor Stinner.

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port @ref{c1,,resource} extension module to module state

@item 
bpo-42111@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42111}: Update the @code{xxlimited} module to be a better example of how
to use the limited C API.

@item 
bpo-40052@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40052}: Fix an alignment build warning/error in function
@code{PyVectorcall_Function()}. Patch by Andreas Schneider, Antoine Pitrou
and Petr Viktorin.
@end itemize

@node Python 3 10 0 alpha 3,Python 3 10 0 alpha 2,Python 3 10 0 alpha 4,Changelog
@anchor{whatsnew/changelog python-3-10-0-alpha-3}@anchor{1cd7}
@subsection Python 3.10.0 alpha 3


`Release date: 2020-12-07'

@menu
* Security: Security<35>. 
* Core and Builtins: Core and Builtins<127>. 
* Library: Library<130>. 
* Core and Builtins: Core and Builtins<128>. 
* Library: Library<131>. 
* Core and Builtins: Core and Builtins<129>. 
* Library: Library<132>. 
* Core and Builtins: Core and Builtins<130>. 
* Library: Library<133>. 
* Documentation: Documentation<42>. 
* Tests: Tests<42>. 
* Build: Build<49>. 
* Windows: Windows<42>. 
* macOS: macOS<32>. 
* IDLE: IDLE<24>. 
* Tools/Demos: Tools/Demos<29>. 
* C API: C API<44>. 

@end menu

@node Security<35>,Core and Builtins<127>,,Python 3 10 0 alpha 3
@anchor{whatsnew/changelog id576}@anchor{1cd8}
@subsubsection Security



@itemize -

@item 
bpo-40791@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40791}: Add @code{volatile} to the accumulator variable in
@code{hmac.compare_digest}, making constant-time-defeating optimizations less
likely.
@end itemize

@node Core and Builtins<127>,Library<130>,Security<35>,Python 3 10 0 alpha 3
@anchor{whatsnew/changelog id577}@anchor{1cd9}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-42576@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42576}: @code{types.GenericAlias} will now raise a @code{TypeError} when
attempting to initialize with a keyword argument.  Previously, this would
cause the interpreter to crash if the interpreter was compiled with debug
symbols. This does not affect interpreters compiled for release.  Patch by
Ken Jin.

@item 
bpo-42536@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42536}: Several built-in and standard library types now ensure that
their internal result tuples are always tracked by the @ref{17dd,,garbage collector}:


@itemize -

@item 
@ref{7f2,,collections.OrderedDict.items()}

@item 
@ref{9d2,,dict.items()}

@item 
@ref{1686,,enumerate()}

@item 
@ref{21a,,functools.reduce()}

@item 
@ref{1516,,itertools.combinations()}

@item 
@ref{1486,,itertools.combinations_with_replacement()}

@item 
@ref{1cda,,itertools.permutations()}

@item 
@ref{1517,,itertools.product()}

@item 
@ref{14a3,,itertools.zip_longest()}

@item 
@ref{1a0,,zip()}
@end itemize

Previously, they could have become untracked by a prior garbage
collection. Patch by Brandt Bucher.

@item 
bpo-42500@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42500}: Improve handling of exceptions near recursion limit. Converts a
number of Fatal Errors in RecursionErrors.

@item 
bpo-42246@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42246}: PEP 626: After a return, the f_lineno attribute of a frame is
always the last line executed.

@item 
bpo-42435@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42435}: Speed up comparison of bytes objects with non-bytes objects
when option @ref{7f8,,-b} is specified. Speed up comparison of bytarray
objects with non-buffer object.
@end itemize

@node Library<130>,Core and Builtins<128>,Core and Builtins<127>,Python 3 10 0 alpha 3
@anchor{whatsnew/changelog id578}@anchor{1cdb}
@subsubsection Library



@itemize -

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port the @code{_warnings} extension module to the multi-phase
initialization API (
@geindex Python 향상 제안; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}). Patch by Victor Stinner.
@end itemize

@node Core and Builtins<128>,Library<131>,Library<130>,Python 3 10 0 alpha 3
@anchor{whatsnew/changelog id579}@anchor{1cdc}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-41686@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41686}: On Windows, the @code{SIGINT} event, @code{_PyOS_SigintEvent()}, is
now created even if Python is configured to not install signal handlers
(if @ref{abb,,PyConfig.install_signal_handlers} equals to 0, or
@code{Py_InitializeEx(0)}).

@item 
bpo-42381@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42381}: Allow assignment expressions in set literals and set
comprehensions as per PEP 572. Patch by Pablo Galindo.

@item 
bpo-42202@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42202}: Change function parameters annotations internal representation
to tuple of strings. Patch provided by Yurii Karabas.

@item 
bpo-42374@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42374}: Fix a regression introduced by the new parser, where an
unparenthesized walrus operator was not allowed within generator
expressions.

@item 
bpo-42316@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42316}: Allow an unparenthesized walrus in subscript indexes.

@item 
bpo-42349@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42349}: Make sure that the compiler front-end produces a well-formed
control flow graph. Be more aggressive in the compiler back-end, as it is
now safe to do so.

@item 
bpo-42296@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42296}: On Windows, fix a regression in signal handling which prevented
to interrupt a program using CTRL+C. The signal handler can be run in a
thread different than the Python thread, in which case the test deciding
if the thread can handle signals is wrong.

@item 
bpo-42332@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42332}: @ref{9ec,,types.GenericAlias} objects can now be the targets of
weakrefs.

@item 
bpo-42282@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42282}: Optimise constant subexpressions that appear as part of named
expressions (previously the AST optimiser did not descend into named
expressions). Patch by Nick Coghlan.

@item 
bpo-42266@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42266}: Fixed a bug with the LOAD_ATTR opcode cache that was not
respecting monkey-patching a class-level attribute to make it a
descriptor. Patch by Pablo Galindo.
@end itemize

@node Library<131>,Core and Builtins<129>,Core and Builtins<128>,Python 3 10 0 alpha 3
@anchor{whatsnew/changelog id580}@anchor{1cdd}
@subsubsection Library



@itemize -

@item 
bpo-40077@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40077}: Convert @ref{bb,,queue} to use heap types.
@end itemize

@node Core and Builtins<129>,Library<132>,Library<131>,Python 3 10 0 alpha 3
@anchor{whatsnew/changelog id581}@anchor{1cde}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-42246@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42246}: Improved accuracy of line tracing events and f_lineno attribute
of Frame objects. See PEP 626 for details.
@end itemize

@node Library<132>,Core and Builtins<130>,Core and Builtins<129>,Python 3 10 0 alpha 3
@anchor{whatsnew/changelog id582}@anchor{1cdf}
@subsubsection Library



@itemize -

@item 
bpo-40077@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40077}: Convert @ref{94,,mmap} to use heap types.
@end itemize

@node Core and Builtins<130>,Library<133>,Library<132>,Python 3 10 0 alpha 3
@anchor{whatsnew/changelog id583}@anchor{1ce0}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-42233@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42233}: Allow @code{GenericAlias} objects to use @ref{9c5,,union type expressions}. This allows expressions like @code{list[int] |
dict[float, str]} where previously a @code{TypeError} would have been
thrown.  This also fixes union type expressions not de-duplicating
@code{GenericAlias} objects. (Contributed by Ken Jin in bpo-42233@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42233}.)

@item 
bpo-26131@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26131}: The import system triggers a @code{ImportWarning} when it falls
back to using @code{load_module()}.
@end itemize

@node Library<133>,Documentation<42>,Core and Builtins<130>,Python 3 10 0 alpha 3
@anchor{whatsnew/changelog id584}@anchor{1ce1}
@subsubsection Library



@itemize -

@item 
bpo-5054@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5054}: CGIHTTPRequestHandler.run_cgi() HTTP_ACCEPT improperly parsed.
Replace the special purpose getallmatchingheaders with generic get_all
method and add relevant tests.

Original Patch by Martin Panter. Modified by Senthil Kumaran.

@item 
bpo-42562@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42562}: Fix issue when dis failed to parse function that has no line
numbers. Patch provided by Yurii Karabas.

@item 
bpo-17735@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17735}: @code{inspect.findsource()} now raises @ref{2c0,,OSError} instead of
@ref{173a,,IndexError} when @code{co_lineno} of a code object is greater than
the file length. This can happen, for example, when a file is edited after
it was imported.  PR by Irit Katriel.

@item 
bpo-42116@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42116}: Fix handling of trailing comments by @ref{17c9,,inspect.getsource()}.

@item 
bpo-42532@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42532}: Remove unexpected call of @code{__bool__} when passing a
@code{spec_arg} argument to a Mock.

@item 
bpo-38200@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38200}: Added itertools.pairwise()

@item 
bpo-41818@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41818}: Fix test_master_read() so that it succeeds on all platforms
that either raise OSError or return b”” upon reading from master.

@item 
bpo-42487@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42487}: ChainMap.__iter__ no longer calls __getitem__ on underlying
maps

@item 
bpo-42482@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42482}: @ref{561,,TracebackException} no longer holds a
reference to the exception’s traceback object. Consequently, instances of
TracebackException for equivalent but non-equal exceptions now compare as
equal.

@item 
bpo-41818@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41818}: Make test_openpty() avoid unexpected success due to number of
rows and/or number of columns being == 0.

@item 
bpo-42392@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42392}: Remove loop parameter from @code{asyncio.subprocess} and
@code{asyncio.tasks} functions. Patch provided by Yurii Karabas.

@item 
bpo-42392@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42392}: Remove loop parameter from @code{asyncio.open_connection} and
@code{asyncio.start_server} functions. Patch provided by Yurii Karabas.

@item 
bpo-28468@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28468}: Add @ref{a27,,platform.freedesktop_os_release()} function to parse
freedesktop.org @code{os-release} files.

@item 
bpo-42299@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42299}: Removed the @code{formatter} module, which was deprecated in
Python 3.4. It is somewhat obsolete, little used, and not tested. It was
originally scheduled to be removed in Python 3.6, but such removals were
delayed until after Python 2.7 EOL. Existing users should copy whatever
classes they use into their code. Patch by Donghee Na and and Terry J.
Reedy.

@item 
bpo-26131@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26131}: Deprecate zipimport.zipimporter.load_module() in favour of
exec_module().

@item 
bpo-41818@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41818}: Updated tests for the pty library. test_basic() has been
changed to test_openpty(); this additionally checks if slave termios and
slave winsize are being set properly by pty.openpty(). In order to add
support for FreeBSD, NetBSD, OpenBSD, and Darwin, this also adds
test_master_read(), which demonstrates that pty.spawn() should not depend
on an OSError to exit from its copy loop.

@item 
bpo-42392@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42392}: Remove loop parameter from @code{__init__} in all
@code{asyncio.locks} and @code{asyncio.Queue} classes. Patch provided by Yurii
Karabas.

@item 
bpo-15450@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15450}: Make @ref{113f,,filecmp.dircmp} respect subclassing. Now the
@ref{1ce2,,filecmp.dircmp.subdirs} behaves as expected when subclassing
dircmp.

@item 
bpo-42413@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42413}: The exception @ref{a35,,socket.timeout} is now an alias of
@ref{a36,,TimeoutError}.

@item 
bpo-31904@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31904}: Support signal module on VxWorks.

@item 
bpo-42406@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42406}: We fixed an issue in @code{pickle.whichmodule} in which importing
@code{multiprocessing} could change the how pickle identifies which module an
object belongs to, potentially breaking the unpickling of those objects.

@item 
bpo-42403@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42403}: Simplify the @ref{7b,,importlib} external bootstrap code:
@code{importlib._bootstrap_external} now uses regular imports to import
builtin modules. When it is imported, the builtin @ref{ad1,,__import__()}
function is already fully working and so can be used to import builtin
modules like @ref{df,,sys}. Patch by Victor Stinner.

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Convert _sre module types to heap types (PEP 384). Patch by
Erlend E. Aasland.

@item 
bpo-42375@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42375}: subprocess module update for DragonFlyBSD support.

@item 
bpo-41713@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41713}: Port the @code{_signal} extension module to the multi-phase
initialization API (
@geindex Python 향상 제안; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}). Patch by Victor Stinner and Mohamed
Koubaa.

@item 
bpo-37205@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37205}: @ref{55c,,time.time()}, @ref{c79,,time.perf_counter()} and
@ref{55b,,time.monotonic()} functions can no longer fail with a Python fatal
error, instead raise a regular Python exception on failure.

@item 
bpo-42328@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42328}: Fixed @ref{1ce3,,tkinter.ttk.Style.map()}. The function accepts now
the representation of the default state as empty sequence (as returned by
@code{Style.map()}). The structure of the result is now the same on all
platform and does not depend on the value of @code{wantobjects}.

@item 
bpo-42345@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42345}: Fix various issues with @code{typing.Literal} parameter handling
(flatten, deduplicate, use type to cache key). Patch provided by Yurii
Karabas.

@item 
bpo-37205@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37205}: @ref{c79,,time.perf_counter()} on Windows and @ref{55b,,time.monotonic()}
on macOS are now system-wide. Previously, they used an offset computed at
startup to reduce the precision loss caused by the float type. Use
@ref{cdd,,time.perf_counter_ns()} and @ref{cdc,,time.monotonic_ns()} added in Python
3.7 to avoid this precision loss.

@item 
bpo-42318@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42318}: Fixed support of non-BMP characters in @ref{f6,,tkinter} on macOS.

@item 
bpo-42350@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42350}: Fix the @ref{176,,threading.Thread} class at fork: do nothing if
the thread is already stopped (ex: fork called at Python exit).
Previously, an error was logged in the child process.

@item 
bpo-42333@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42333}: Port _ssl extension module to heap types.

@item 
bpo-42014@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42014}: The @code{onerror} callback from @code{shutil.rmtree} now receives
correct function when @code{os.open} fails.

@item 
bpo-42237@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42237}: Fix @code{os.sendfile()} on illumos.

@item 
bpo-42308@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42308}: Add @ref{a4a,,threading.__excepthook__} to allow retrieving the
original value of @ref{a4b,,threading.excepthook()} in case it is set to a
broken or a different value. Patch by Mario Corchero.

@item 
bpo-42131@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42131}: Implement PEP 451/spec methods on zipimport.zipimporter:
find_spec(), create_module(), and exec_module().

This also allows for the documented deprecation of find_loader(),
find_module(), and load_module().

@item 
bpo-41877@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41877}: Mock objects which are not unsafe will now raise an
AttributeError if an attribute with the prefix asert, aseert, or assrt is
accessed, in addition to this already happening for the prefixes assert or
assret.

@item 
bpo-42264@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42264}: @code{sqlite3.OptimizedUnicode} has been undocumented and obsolete
since Python 3.3, when it was made an alias to @ref{169,,str}.  It is now
deprecated, scheduled for removal in Python 3.12.

@item 
bpo-42251@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42251}: Added @ref{a46,,threading.gettrace()} and
@ref{a47,,threading.getprofile()} to retrieve the functions set by
@ref{a48,,threading.settrace()} and @ref{a49,,threading.setprofile()} respectively.
Patch by Mario Corchero.

@item 
bpo-42249@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42249}: Fixed writing binary Plist files larger than 4 GiB.

@item 
bpo-42236@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42236}: On Unix, the @ref{1c33,,os.device_encoding()} function now returns
@code{'UTF-8'} rather than the device encoding if the @ref{865,,Python UTF-8 Mode} is enabled.

@item 
bpo-41754@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41754}: webbrowser: Ignore `NotADirectoryError' when calling
@code{xdg-settings}.

@item 
bpo-42183@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42183}: Fix a stack overflow error for asyncio Task or Future repr().

The overflow occurs under some circumstances when a Task or Future
recursively returns itself.

@item 
bpo-42140@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42140}: Improve asyncio.wait function to create the futures set just
one time.

@item 
bpo-42133@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42133}: Update various modules in the stdlib to fall back on
@code{__spec__.loader} when @code{__loader__} isn’t defined on a module.

@item 
bpo-26131@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26131}: The @code{load_module()} methods found in @code{importlib} now
trigger a @code{DeprecationWarning}.

@item 
bpo-39825@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39825}: Windows: Change @code{sysconfig.get_config_var('EXT_SUFFIX')} to
the expected full @code{platform_tag.extension} format. Previously it was
hard-coded to @code{.pyd}, now it is compatible with @code{distutils.sysconfig}
and will result in something like @code{.cp38-win_amd64.pyd}. This brings
windows into conformance with the other platforms.

@item 
bpo-26389@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26389}: The @ref{a4d,,traceback.format_exception()},
@ref{a4e,,traceback.format_exception_only()}, and
@ref{a4f,,traceback.print_exception()} functions can now take an exception
object as a positional-only argument.

@item 
bpo-41889@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41889}: Enum: fix regression involving inheriting a multiply inherited
enum

@item 
bpo-41861@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41861}: Convert @ref{d4,,sqlite3} to use heap types (PEP 384). Patch by
Erlend E. Aasland.

@item 
bpo-40624@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40624}: Added support for the XPath @code{!=} operator in xml.etree

@item 
bpo-28850@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28850}: Fix @ref{1ce4,,pprint.PrettyPrinter.format()} overrides being ignored
for contents of small containers. The @code{pprint._safe_repr()} function
was removed.

@item 
bpo-41625@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41625}: Expose the @code{splice()} as @ref{a1a,,os.splice()} in the
@ref{a5,,os} module. Patch by Pablo Galindo

@item 
bpo-34215@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34215}: Clarify the error message for
@ref{1ce5,,asyncio.IncompleteReadError} when @code{expected} is @code{None}.

@item 
bpo-41543@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41543}: Add async context manager support for contextlib.nullcontext.

@item 
bpo-21041@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21041}: @ref{a21,,pathlib.PurePath.parents} now supports negative
indexing. Patch contributed by Yaroslav Pankovych.

@item 
bpo-41332@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41332}: Added missing connect_accepted_socket() method to
@code{asyncio.AbstractEventLoop}.

@item 
bpo-12800@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12800}: Extracting a symlink from a tarball should succeed and
overwrite the symlink if it already exists. The fix is to remove the
existing file or symlink before extraction. Based on patch by Chris AtLee,
Jeffrey Kintscher, and Senthil Kumaran.

@item 
bpo-40968@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40968}: @ref{111,,urllib.request} and @ref{73,,http.client} now send
@code{http/1.1} ALPN extension during TLS handshake when no custom context is
supplied.

@item 
bpo-41001@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41001}: Add @ref{a19,,os.eventfd()} to provide a low level interface for
Linux’s event notification file descriptor.

@item 
bpo-40816@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40816}: Add AsyncContextDecorator to contextlib to support async
context manager as a decorator.

@item 
bpo-40550@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40550}: Fix time-of-check/time-of-action issue in
subprocess.Popen.send_signal.

@item 
bpo-39411@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39411}: Add an @code{is_async} identifier to @ref{b9,,pyclbr}’s @code{Function}
objects. Patch by Batuhan Taskaya

@item 
bpo-35498@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35498}: Add slice support to @ref{a21,,pathlib.PurePath.parents}.
@end itemize

@node Documentation<42>,Tests<42>,Library<133>,Python 3 10 0 alpha 3
@anchor{whatsnew/changelog id585}@anchor{1ce6}
@subsubsection Documentation



@itemize -

@item 
bpo-42238@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42238}: Tentative to deprecate @code{make suspicious} by first removing it
from the CI and documentation builds, but keeping it around for manual
uses.

@item 
bpo-42153@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42153}: Fix the URL for the IMAP protocol documents.

@item 
bpo-41028@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41028}: Language and version switchers, previously maintained in every
cpython branches, are now handled by docsbuild-script.
@end itemize

@node Tests<42>,Build<49>,Documentation<42>,Python 3 10 0 alpha 3
@anchor{whatsnew/changelog id586}@anchor{1ce7}
@subsubsection Tests



@itemize -

@item 
bpo-41473@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41473}: Re-enable test_gdb on gdb 9.2 and newer:
@indicateurl{https://bugzilla.redhat.com/show_bug.cgi?id=1866884} bug is fixed in gdb
10.1.

@item 
bpo-42553@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42553}: Fix @code{test_asyncio.test_call_later()} race condition: don’t
measure asyncio performance in the @code{call_later()} unit test. The test
failed randomly on the CI.

@item 
bpo-31904@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31904}: Fix test_netrc on VxWorks: create temporary directories using
temp_cwd().

@item 
bpo-31904@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31904}: skip test_getaddrinfo_ipv6_scopeid_symbolic and
test_getnameinfo_ipv6_scopeid_symbolic on VxWorks

@item 
bpo-31904@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31904}: skip test_test of test_mailcap on VxWorks

@item 
bpo-31904@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31904}: add shell requirement for test_pipes

@item 
bpo-31904@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31904}: skip some tests related to fifo on VxWorks

@item 
bpo-31904@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31904}: Fix test_doctest.py failures for VxWorks.

@item 
bpo-40754@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40754}: Include @code{_testinternalcapi} module in Windows installer for
test suite

@item 
bpo-41561@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41561}: test_ssl: skip test_min_max_version_mismatch when TLS 1.0 is
not available

@item 
bpo-31904@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31904}: Fix os module failures for VxWorks RTOS.

@item 
bpo-31904@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31904}: Fix fifo test cases for VxWorks RTOS.
@end itemize

@node Build<49>,Windows<42>,Tests<42>,Python 3 10 0 alpha 3
@anchor{whatsnew/changelog id587}@anchor{1ce8}
@subsubsection Build



@itemize -

@item 
bpo-31904@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31904}: remove libnet dependency from detect_socket() for VxWorks

@item 
bpo-42398@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42398}: Fix a race condition in “make regen-all” when make -jN option
is used to run jobs in parallel. The clinic.py script now only use atomic
write to write files. Moveover, generated files are now left unchanged if
the content does not change, to not change the file modification time.

@item 
bpo-41617@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41617}: Fix building @code{pycore_bitutils.h} internal header on old clang
version without @code{__builtin_bswap16()} (ex: Xcode 4.6.3 on Mac OS X
10.7). Patch by Joshua Root and Victor Stinner.

@item 
bpo-38823@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38823}: It is no longer possible to build the @code{_ctypes} extension
module without @code{wchar_t} type: remove @code{CTYPES_UNICODE} macro.
Anyway, the @code{wchar_t} type is required to build Python. Patch by
Victor Stinner.

@item 
bpo-42087@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42087}: Support was removed for AIX 5.3 and below. See bpo-40680@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40680}.

@item 
bpo-40998@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40998}: Addressed three compiler warnings found by undefined behavior
sanitizer (ubsan).
@end itemize

@node Windows<42>,macOS<32>,Build<49>,Python 3 10 0 alpha 3
@anchor{whatsnew/changelog id588}@anchor{1ce9}
@subsubsection Windows



@itemize -

@item 
bpo-42120@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42120}: Remove macro definition of @code{copysign} (to @code{_copysign}) in
headers.

@item 
bpo-38506@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38506}: The Windows launcher now properly handles Python 3.10 when
listing installed Python versions.
@end itemize

@node macOS<32>,IDLE<24>,Windows<42>,Python 3 10 0 alpha 3
@anchor{whatsnew/changelog id589}@anchor{1cea}
@subsubsection macOS



@itemize -

@item 
bpo-42504@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42504}: Fix build on macOS Big Sur when MACOSX_DEPLOYMENT_TARGET=11

@item 
bpo-41116@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41116}: Ensure distutils.unixxcompiler.find_library_file can find
system provided libraries on macOS 11.

@item 
bpo-41100@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41100}: Add support for macOS 11 and Apple Silicon systems.

It is now possible to build “Universal 2” binaries using
“–enable-universalsdk –with-universal-archs=universal2”.

Binaries build on later macOS versions can be deployed back to older
versions (tested up to macOS 10.9), when using the correct deployment
target. This is tested using Xcode 11 and later.

@item 
bpo-42232@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42232}: Added Darwin specific madvise options to mmap module.

@item 
bpo-38443@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38443}: The @code{--enable-universalsdk} and @code{--with-universal-archs}
options for the configure script now check that the specified
architectures can be used.
@end itemize

@node IDLE<24>,Tools/Demos<29>,macOS<32>,Python 3 10 0 alpha 3
@anchor{whatsnew/changelog id590}@anchor{1ceb}
@subsubsection IDLE



@itemize -

@item 
bpo-42508@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42508}: Keep IDLE running on macOS.  Remove obsolete workaround that
prevented running files with shortcuts when using new universal2
installers built on macOS 11.

@item 
bpo-42426@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42426}: Fix reporting offset of the RE error in searchengine.

@item 
bpo-42415@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42415}: Get docstrings for IDLE calltips more often by using
inspect.getdoc.
@end itemize

@node Tools/Demos<29>,C API<44>,IDLE<24>,Python 3 10 0 alpha 3
@anchor{whatsnew/changelog id591}@anchor{1cec}
@subsubsection Tools/Demos



@itemize -

@item 
bpo-42212@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42212}: The smelly.py script now also checks the Python dynamic library
and extension modules, not only the Python static library. Make also the
script more verbose: explain what it does.

@item 
bpo-36310@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36310}: Allow @code{Tools/i18n/pygettext.py} to detect calls to
@code{gettext} in f-strings.
@end itemize

@node C API<44>,,Tools/Demos<29>,Python 3 10 0 alpha 3
@anchor{whatsnew/changelog id592}@anchor{1ced}
@subsubsection C API



@itemize -

@item 
bpo-42423@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42423}: The @ref{79d,,PyType_FromSpecWithBases()} and
@ref{772,,PyType_FromModuleAndSpec()} functions now accept a single class as
the `bases' argument.

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port @ref{c6,,select} extension module to multiphase
initialization (
@geindex Python 향상 제안; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}).

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port _posixsubprocess extension module to multiphase
initialization (
@geindex Python 향상 제안; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}).

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port _posixshmem extension module to multiphase
initialization (
@geindex Python 향상 제안; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/})

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port _struct extension module to multiphase initialization
(
@geindex Python 향상 제안; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/})

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port @code{spwd} extension module to multiphase
initialization (
@geindex Python 향상 제안; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/})

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port @ref{64,,gc} extension module to multiphase initialization
(
@geindex Python 향상 제안; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/})

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port _queue extension module to multiphase initialization
(
@geindex Python 향상 제안; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/})

@item 
bpo-39573@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39573}: Convert @ref{3c9,,Py_TYPE()} and @ref{984,,Py_SIZE()} back to macros
to allow using them as an l-value. Many third party C extension modules
rely on the ability of using Py_TYPE() and Py_SIZE() to set an object type
and size: @code{Py_TYPE(obj) = type;} and @code{Py_SIZE(obj) = size;}.

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port @ref{de,,symtable} extension module to multiphase
initialization (
@geindex Python 향상 제안; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/})

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port @ref{6a,,grp} and @ref{b7,,pwd} extension modules to
multiphase initialization (
@geindex Python 향상 제안; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/})

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port _random extension module to multiphase initialization
(
@geindex Python 향상 제안; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/})

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port _hashlib extension module to multiphase initialization
(
@geindex Python 향상 제안; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/})

@item 
bpo-41713@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41713}: Removed the undocumented @code{PyOS_InitInterrupts()} function.
Initializing Python already implicitly installs signal handlers: see
@ref{abb,,PyConfig.install_signal_handlers}. Patch by Victor Stinner.

@item 
bpo-40170@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40170}: The @code{Py_TRASHCAN_BEGIN} macro no longer accesses PyTypeObject
attributes, but now can get the condition by calling the new private
@code{_PyTrash_cond()} function which hides implementation details.

@item 
bpo-42260@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42260}: @ref{3e3,,Py_GetPath()}, @ref{3e5,,Py_GetPrefix()},
@ref{3e9,,Py_GetExecPrefix()}, @ref{3ec,,Py_GetProgramFullPath()},
@ref{3ef,,Py_GetPythonHome()} and @ref{3ee,,Py_GetProgramName()} functions now
return @code{NULL} if called before @ref{460,,Py_Initialize()} (before Python is
initialized). Use the new @ref{644,,Python Initialization Configuration API} to get the @ref{aaa,,Python Path Configuration.}. Patch by Victor Stinner.

@item 
bpo-42260@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42260}: The @ref{992,,PyConfig_Read()} function now only parses
@ref{3f1,,PyConfig.argv} arguments once: @ref{1cee,,PyConfig.parse_argv}
is set to @code{2} after arguments are parsed. Since Python arguments are
strippped from @code{PyConfig.argv}, parsing arguments twice would
parse the application options as Python options.

@item 
bpo-42262@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42262}: Added @ref{a9a,,Py_NewRef()} and @ref{a9b,,Py_XNewRef()} functions to
increment the reference count of an object and return the object. Patch by
Victor Stinner.

@item 
bpo-42260@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42260}: When @ref{460,,Py_Initialize()} is called twice, the second call
now updates more @ref{df,,sys} attributes for the configuration, rather than
only @ref{1469,,sys.argv}. Patch by Victor Stinner.

@item 
bpo-41832@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41832}: The @ref{772,,PyType_FromModuleAndSpec()} function now accepts
NULL @code{tp_doc} slot.

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Added @ref{607,,PyModule_AddObjectRef()} function: similar to
@ref{608,,PyModule_AddObject()} but don’t steal a reference to the value on
success. Patch by Victor Stinner.

@item 
bpo-42171@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42171}: The @ref{199f,,METH_FASTCALL} calling convention is added to the
limited API. The functions  @ref{b6c,,PyModule_AddType()},
@ref{772,,PyType_FromModuleAndSpec()}, @ref{b66,,PyType_GetModule()} and
@ref{b67,,PyType_GetModuleState()} are added to the limited API on Windows.

@item 
bpo-42085@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42085}: Add dedicated entry to PyAsyncMethods for sending values

@item 
bpo-41073@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41073}: @ref{a9c,,PyType_GetSlot()} can now accept static types.

@item 
bpo-30459@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30459}: @ref{62d,,PyList_SET_ITEM()}, @ref{62c,,PyTuple_SET_ITEM()} and
@ref{aab,,PyCell_SET()} macros can no longer be used as l-value or r-value.
For example, @code{x = PyList_SET_ITEM(a, b, c)} and @code{PyList_SET_ITEM(a, b,
c) = x} now fail with a compiler error. It prevents bugs like @code{if
(PyList_SET_ITEM (a, b, c) < 0) ...} test. Patch by Zackery Spytz and
Victor Stinner.
@end itemize

@node Python 3 10 0 alpha 2,Python 3 10 0 alpha 1,Python 3 10 0 alpha 3,Changelog
@anchor{whatsnew/changelog python-3-10-0-alpha-2}@anchor{1cef}
@subsection Python 3.10.0 alpha 2


`Release date: 2020-11-03'

@menu
* Security: Security<36>. 
* Core and Builtins: Core and Builtins<131>. 
* Library: Library<134>. 
* Core and Builtins: Core and Builtins<132>. 
* Library: Library<135>. 
* Documentation: Documentation<43>. 
* Tests: Tests<43>. 
* Build: Build<50>. 
* Windows: Windows<43>. 
* macOS: macOS<33>. 
* IDLE: IDLE<25>. 
* C API: C API<45>. 

@end menu

@node Security<36>,Core and Builtins<131>,,Python 3 10 0 alpha 2
@anchor{whatsnew/changelog id593}@anchor{1cf0}
@subsubsection Security



@itemize -

@item 
bpo-42103@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42103}: Prevented potential DoS attack via CPU and RAM exhaustion when
processing malformed Apple Property List files in binary format.

@item 
bpo-42051@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42051}: The @ref{b0,,plistlib} module no longer accepts entity
declarations in XML plist files to avoid XML vulnerabilities. This should
not affect users as entity declarations are not used in regular plist
files.
@end itemize

@node Core and Builtins<131>,Library<134>,Security<36>,Python 3 10 0 alpha 2
@anchor{whatsnew/changelog id594}@anchor{1cf1}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-42236@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42236}: If the @code{nl_langinfo(CODESET)} function returns an empty
string, Python now uses UTF-8 as the filesystem encoding. Patch by Victor
Stinner.

@item 
bpo-42218@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42218}: Fixed a bug in the PEG parser that was causing crashes in debug
mode. Now errors are checked in left-recursive rules to avoid cases where
such errors do not get handled in time and appear as long-distance crashes
in other places.

@item 
bpo-42214@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42214}: Fixed a possible crash in the PEG parser when checking for the
‘!=’ token in the @code{barry_as_flufl} rule. Patch by Pablo Galindo.

@item 
bpo-42206@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42206}: Propagate and raise the errors caused by
@code{PyAST_Validate()} in the parser.

@item 
bpo-41796@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41796}: The @ref{9,,ast} module internal state is now per interpreter.
Patch by Victor Stinner.

@item 
bpo-42143@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42143}: Fix handling of errors during creation of @code{PyFunctionObject},
which resulted in operations on uninitialized memory. Patch by Yonatan
Goldschmidt.

@item 
bpo-41659@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41659}: Fix a bug in the parser, where a curly brace following a
@code{primary} didn’t fail immediately. This led to invalid expressions like
@code{a @{b@}} to throw a @ref{18e,,SyntaxError} with a wrong offset, or invalid
expressions ending with a curly brace like @code{a @{} to not fail immediately
in the REPL.

@item 
bpo-42150@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42150}: Fix possible buffer overflow in the new parser when checking
for continuation lines. Patch by Pablo Galindo.

@item 
bpo-42123@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42123}: Run the parser two times. On the first run, disable all the
rules that only generate better error messages to gain performance. If
there’s a parse failure, run the parser a second time with those enabled.

@item 
bpo-42093@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42093}: The @code{LOAD_ATTR} instruction now uses new “per opcode cache”
mechanism and it is about 36% faster now. Patch by Pablo Galindo and Yury
Selivanov.

@item 
bpo-42030@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42030}: Support for the legacy AIX-specific shared library loading
support has been removed. All versions of AIX since 4.3 have supported and
defaulted to using the common Unix mechanism instead.

@item 
bpo-41984@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41984}: The garbage collector now tracks all user-defined classes.
Patch by Brandt Bucher.

@item 
bpo-41993@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41993}: Fixed potential issues with removing not completely initialized
module from @code{sys.modules} when import fails.

@item 
bpo-41979@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41979}: Star-unpacking is now allowed for with item’s targets in the
PEG parser.

@item 
bpo-41974@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41974}: Removed special methods @code{__int__}, @code{__float__},
@code{__floordiv__}, @code{__mod__}, @code{__divmod__}, @code{__rfloordiv__},
@code{__rmod__} and @code{__rdivmod__} of the @ref{197,,complex} class.  They
always raised a @ref{198,,TypeError}.

@item 
bpo-41902@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41902}: Micro optimization when compute
@ref{1cf2,,sq_item} and
@ref{1cf3,,mp_subscript} of @ref{b3d,,range}. Patch by
Donghee Na.

@item 
bpo-41894@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41894}: When loading a native module and a load failure occurs, prevent
a possible UnicodeDecodeError when not running in a UTF-8 locale by
decoding the load error message using the current locale’s encoding.

@item 
bpo-41902@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41902}: Micro optimization for range.index if step is 1. Patch by
Donghee Na.
@end itemize

@node Library<134>,Core and Builtins<132>,Core and Builtins<131>,Python 3 10 0 alpha 2
@anchor{whatsnew/changelog id595}@anchor{1cf4}
@subsubsection Library



@itemize -

@item 
bpo-41435@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41435}: Add @code{sys._current_exceptions()} function to retrieve a
dictionary mapping each thread’s identifier to the topmost exception
currently active in that thread at the time the function is called.
@end itemize

@node Core and Builtins<132>,Library<135>,Library<134>,Python 3 10 0 alpha 2
@anchor{whatsnew/changelog id596}@anchor{1cf5}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-38605@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38605}: Enable @code{from __future__ import annotations} (
@geindex Python 향상 제안; PEP 563
PEP 563@footnote{https://peps.python.org/pep-0563/}) by
default. The values found in @ref{458,,__annotations__} dicts are now
strings, for example @code{@{"x": "int"@}} instead of @code{@{"x": int@}}.
@end itemize

@node Library<135>,Documentation<43>,Core and Builtins<132>,Python 3 10 0 alpha 2
@anchor{whatsnew/changelog id597}@anchor{1cf6}
@subsubsection Library



@itemize -

@item 
bpo-35455@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35455}: On Solaris, @ref{b30,,thread_time()} is now implemented with
@code{gethrvtime()} because @code{clock_gettime(CLOCK_THREAD_CPUTIME_ID)} is not
always available. Patch by Jakub Kulik.

@item 
bpo-42233@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42233}: The @ref{1c1,,repr()} of @ref{10a,,typing} types containing
@ref{8c0,,Generic Alias Types} previously did not show
the parameterized types in the @code{GenericAlias}.  They have now been
changed to do so.

@item 
bpo-29566@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29566}: @code{binhex.binhex()} consistently writes macOS 9 line endings.

@item 
bpo-26789@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26789}: The @ref{1c51,,logging.FileHandler} class now keeps a reference to
the builtin @ref{316,,open()} function to be able to open or reopen the file
during Python finalization. Fix errors like: @code{NameError: name 'open' is
not defined}. Patch by Victor Stinner.

@item 
bpo-42157@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42157}: Removed the @code{unicodedata.ucnhash_CAPI} attribute which was an
internal PyCapsule object. The related private @code{_PyUnicode_Name_CAPI}
structure was moved to the internal C API. Patch by Victor Stinner.

@item 
bpo-42157@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42157}: Convert the @ref{10b,,unicodedata} extension module to the
multiphase initialization API (
@geindex Python 향상 제안; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}) and convert the
@code{unicodedata.UCD} static type to a heap type. Patch by Mohamed Koubaa
and Victor Stinner.

@item 
bpo-42146@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42146}: Fix memory leak in @ref{4b8,,subprocess.Popen()} in case an uid
(gid) specified in @code{user} (@code{group}, @code{extra_groups}) overflows
@code{uid_t} (@code{gid_t}).

@item 
bpo-42103@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42103}: @ref{1cf7,,InvalidFileException} and @ref{f67,,RecursionError}
are now the only errors caused by loading malformed binary Plist file
(previously ValueError and TypeError could be raised in some specific
cases).

@item 
bpo-41490@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41490}: In @code{importlib.resources}, @code{.path} method is more aggressive
about releasing handles to zipfile objects early, enabling use-cases like
certifi to leave the context open but delete the underlying zip file.

@item 
bpo-41052@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41052}: Pickling heap types implemented in C with protocols 0 and 1
raises now an error instead of producing incorrect data.

@item 
bpo-42089@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42089}: In @code{importlib.metadata.PackageNotFoundError}, make reference
to the package metadata being missing to improve the user experience.

@item 
bpo-41491@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41491}: plistlib: fix parsing XML plists with hexadecimal integer
values

@item 
bpo-42065@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42065}: Fix an incorrectly formatted error from
@code{_codecs.charmap_decode()} when called with a mapped value outside
the range of valid Unicode code points. PR by Max Bernstein.

@item 
bpo-41966@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41966}: Fix pickling pure Python @ref{1fb,,datetime.time} subclasses.
Patch by Dean Inwood.

@item 
bpo-19270@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19270}: @ref{1cf8,,sched.scheduler.cancel()} will now cancel the correct
event, if two events with same priority are scheduled for the same time.
Patch by Bar Harel.

@item 
bpo-28660@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28660}: @ref{16cc,,textwrap.wrap()} now attempts to break long words after
hyphens when @code{break_long_words=True} and @code{break_on_hyphens=True}.

@item 
bpo-35823@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35823}: Use @code{vfork()} instead of @code{fork()} for
@ref{4b8,,subprocess.Popen()} on Linux to improve performance in cases where it
is deemed safe.

@item 
bpo-42043@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42043}: Add support for @code{zipfile.Path} inheritance.
@code{zipfile.Path.is_file()} now returns False for non-existent names.
@code{zipfile.Path} objects now expose a @code{.filename} attribute and rely on
that to resolve @code{.name} and @code{.parent} when the @code{Path} object is at
the root of the zipfile.

@item 
bpo-42021@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42021}: Fix possible ref leaks in @ref{d4,,sqlite3} module init.

@item 
bpo-39101@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39101}: Fixed tests using IsolatedAsyncioTestCase from hanging on
BaseExceptions.

@item 
bpo-41976@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41976}: Fixed a bug that was causing @ref{f44,,ctypes.util.find_library()}
to return @code{None} when triying to locate a library in an environment when
gcc>=9 is available and @code{ldconfig} is not. Patch by Pablo Galindo

@item 
bpo-41943@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41943}: Fix bug where TestCase.assertLogs doesn’t correctly filter
messages by level.

@item 
bpo-41923@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41923}: Implement 
@geindex Python 향상 제안; PEP 613
PEP 613@footnote{https://peps.python.org/pep-0613/}, introducing @ref{9cc,,typing.TypeAlias}
annotation.

@item 
bpo-41905@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41905}: A new function in abc: `update_abstractmethods' to re-calculate
an abstract class’s abstract status. In addition, `dataclass' has been
changed to call this function.

@item 
bpo-23706@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23706}: Added `newline' parameter to @code{pathlib.Path.write_text()}.

@item 
bpo-41876@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41876}: Tkinter font class repr uses font name

@item 
bpo-41831@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41831}: @code{str()} for the @code{type} attribute of the @code{tkinter.Event}
object always returns now the numeric code returned by Tk instead of the
name of the event type.

@item 
bpo-39337@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39337}: @ref{9fd,,encodings.normalize_encoding()} now ignores non-ASCII
characters.

@item 
bpo-41747@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41747}: Ensure all methods that generated from
@ref{4e1,,dataclasses.dataclass()} objects now have the proper @code{__qualname__}
attribute referring to the class they belong to. Patch by Batuhan Taskaya.

@item 
bpo-30681@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30681}: Handle exceptions caused by unparsable date headers when using
email “default” policy.  Patch by Tim Bell, Georges Toth

@item 
bpo-41586@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41586}: Add F_SETPIPE_SZ and F_GETPIPE_SZ to fcntl module. Allow
setting pipesize on subprocess.Popen.

@item 
bpo-41229@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41229}: Add @code{contextlib.aclosing} for deterministic cleanup of async
generators which is analogous to @code{contextlib.closing} for non-async
generators. Patch by Joongi Kim and John Belmonte.

@item 
bpo-16396@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16396}: Allow @code{ctypes.wintypes} to be imported on non-Windows
systems.

@item 
bpo-4356@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4356}: Add a key function to the bisect module.

@item 
bpo-40592@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40592}: @ref{6da,,shutil.which()} now ignores empty entries in
@geindex PATHEXT
@geindex 환경 변수; PATHEXT
@code{PATHEXT} instead of treating them as a match.

@item 
bpo-40492@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40492}: Fix @code{--outfile} for @ref{2b,,cProfile} / @ref{b4,,profile} not
writing the output file in the original directory when the program being
profiled changes the working directory.  PR by Anthony Sottile.

@item 
bpo-34204@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34204}: The @ref{c8,,shelve} module now uses
@ref{a2f,,pickle.DEFAULT_PROTOCOL} by default instead of @ref{ab,,pickle}
protocol @code{3}.

@item 
bpo-27321@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27321}: Fixed KeyError exception when flattening an email to a string
attempts to replace a non-existent Content-Transfer-Encoding header.

@item 
bpo-38976@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38976}: The @ref{74,,http.cookiejar} module now supports the parsing of
cookies in CURL-style cookiejar files through MozillaCookieJar on all
platforms. Previously, such cookie entries would be silently ignored when
loading a cookiejar with such entries.

Additionally, the HTTP Only attribute is persisted in the object, and will
be correctly written to file if the MozillaCookieJar object is
subsequently dumped.
@end itemize

@node Documentation<43>,Tests<43>,Library<135>,Python 3 10 0 alpha 2
@anchor{whatsnew/changelog id598}@anchor{1cf9}
@subsubsection Documentation



@itemize -

@item 
bpo-42061@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42061}: Document __format__ functionality for IP addresses.

@item 
bpo-41910@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41910}: Document the default implementation of @code{object.__eq__}.

@item 
bpo-42010@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42010}: Clarify that subscription expressions are also valid for
certain @ref{1cfa,,classes} and @ref{1cfb,,types} in the standard
library, and for user-defined classes and types if the classmethod
@code{__class_getitem__()} is provided.

@item 
bpo-41805@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41805}: Documented @ref{8c0,,generic alias type} and
@ref{9ec,,types.GenericAlias}. Also added an entry in glossary for
@ref{1a1,,generic types}.

@item 
bpo-39693@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39693}: Fix tarfile’s extractfile documentation

@item 
bpo-39416@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39416}: Document some restrictions on the default string
representations of numeric classes.
@end itemize

@node Tests<43>,Build<50>,Documentation<43>,Python 3 10 0 alpha 2
@anchor{whatsnew/changelog id599}@anchor{1cfc}
@subsubsection Tests



@itemize -

@item 
bpo-41739@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41739}: Fix test_logging.test_race_between_set_target_and_flush(): the
test now waits until all threads complete to avoid leaking running
threads.

@item 
bpo-41970@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41970}: Avoid a test failure in @code{test_lib2to3} if the module has
already imported at the time the test executes. Patch by Pablo Galindo.

@item 
bpo-41944@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41944}: Tests for CJK codecs no longer call @code{eval()} on content
received via HTTP.

@item 
bpo-41306@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41306}: Fixed a failure in @code{test_tk.test_widgets.ScaleTest} happening
when executing the test with Tk 8.6.10.
@end itemize

@node Build<50>,Windows<43>,Tests<43>,Python 3 10 0 alpha 2
@anchor{whatsnew/changelog id600}@anchor{1cfd}
@subsubsection Build



@itemize -

@item 
bpo-38980@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38980}: Add @code{-fno-semantic-interposition} to both the compile and
link line when building with @code{--enable-optimizations}. Patch by Victor
Stinner and Pablo Galindo.
@end itemize

@node Windows<43>,macOS<33>,Build<50>,Python 3 10 0 alpha 2
@anchor{whatsnew/changelog id601}@anchor{1cfe}
@subsubsection Windows



@itemize -

@item 
bpo-38439@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38439}: Updates the icons for IDLE in the Windows Store package.

@item 
bpo-38252@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38252}: Use 8-byte step to detect ASCII sequence in 64-bit Windows
build.

@item 
bpo-39107@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39107}: Update Tcl and Tk to 8.6.10 in Windows installer.

@item 
bpo-41557@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41557}: Update Windows installer to use SQLite 3.33.0.

@item 
bpo-38324@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38324}: Avoid Unicode errors when accessing certain locale data on
Windows.
@end itemize

@node macOS<33>,IDLE<25>,Windows<43>,Python 3 10 0 alpha 2
@anchor{whatsnew/changelog id602}@anchor{1cff}
@subsubsection macOS



@itemize -

@item 
bpo-41471@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41471}: Ignore invalid prefix lengths in system proxy excludes.
@end itemize

@node IDLE<25>,C API<45>,macOS<33>,Python 3 10 0 alpha 2
@anchor{whatsnew/changelog id603}@anchor{1d00}
@subsubsection IDLE



@itemize -

@item 
bpo-33987@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33987}: Mostly finish using ttk widgets, mainly for editor, settings,
and searches. Some patches by Mark Roseman.

@item 
bpo-40511@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40511}: Typing opening and closing parentheses inside the parentheses
of a function call will no longer cause unnecessary “flashing” off and on
of an existing open call-tip, e.g. when typed in a string literal.

@item 
bpo-38439@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38439}: Add a 256×256 pixel IDLE icon to the Windows .ico file. Created
by Andrew Clover. Remove the low-color gif variations from the .ico file.
@end itemize

@node C API<45>,,IDLE<25>,Python 3 10 0 alpha 2
@anchor{whatsnew/changelog id604}@anchor{1d01}
@subsubsection C API



@itemize -

@item 
bpo-42157@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42157}: The private @code{_PyUnicode_Name_CAPI} structure of the PyCapsule
API @code{unicodedata.ucnhash_CAPI} has been moved to the internal C API.
Patch by Victor Stinner.

@item 
bpo-42015@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42015}: Fix potential crash in deallocating method objects when
dynamically allocated @ref{16dc,,PyMethodDef}’s lifetime is managed through
the @code{self} argument of a @ref{167d,,PyCFunction}.

@item 
bpo-40423@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40423}: The @ref{dc,,subprocess} module and @code{os.closerange} will now use
the @code{close_range(low, high, flags)} syscall when it is available for
more efficient closing of ranges of descriptors.

@item 
bpo-41845@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41845}: @ref{1d02,,PyObject_GenericGetDict()} is available again in the
limited API when targeting 3.10 or later.

@item 
bpo-40422@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40422}: Add @code{_Py_closerange} function to provide performant closing
of a range of file descriptors.

@item 
bpo-41986@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41986}: @code{Py_FileSystemDefaultEncodeErrors} and
@code{Py_UTF8Mode} are available again in limited API.

@item 
bpo-41756@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41756}: Add @code{PyIter_Send} function to allow sending value into
generator/coroutine/iterator without raising StopIteration exception to
signal return.

@item 
bpo-41784@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41784}: Added @code{PyUnicode_AsUTF8AndSize} to the limited C API.
@end itemize

@node Python 3 10 0 alpha 1,Python 3 9 0 beta 1,Python 3 10 0 alpha 2,Changelog
@anchor{whatsnew/changelog python-3-10-0-alpha-1}@anchor{1d03}
@subsection Python 3.10.0 alpha 1


`Release date: 2020-10-05'

@menu
* Security: Security<37>. 
* Core and Builtins: Core and Builtins<133>. 
* Library: Library<136>. 
* Core and Builtins: Core and Builtins<134>. 
* Library: Library<137>. 
* Core and Builtins: Core and Builtins<135>. 
* Library: Library<138>. 
* Core and Builtins: Core and Builtins<136>. 
* Library: Library<139>. 
* Core and Builtins: Core and Builtins<137>. 
* Library: Library<140>. 
* Core and Builtins: Core and Builtins<138>. 
* Library: Library<141>. 
* Core and Builtins: Core and Builtins<139>. 
* Library: Library<142>. 
* Core and Builtins: Core and Builtins<140>. 
* Library: Library<143>. 
* Core and Builtins: Core and Builtins<141>. 
* Library: Library<144>. 
* Core and Builtins: Core and Builtins<142>. 
* Library: Library<145>. 
* Core and Builtins: Core and Builtins<143>. 
* Library: Library<146>. 
* Core and Builtins: Core and Builtins<144>. 
* Library: Library<147>. 
* Core and Builtins: Core and Builtins<145>. 
* Library: Library<148>. 
* Core and Builtins: Core and Builtins<146>. 
* Library: Library<149>. 
* Core and Builtins: Core and Builtins<147>. 
* Library: Library<150>. 
* Documentation: Documentation<44>. 
* Tests: Tests<44>. 
* Build: Build<51>. 
* Windows: Windows<44>. 
* macOS: macOS<34>. 
* IDLE: IDLE<26>. 
* C API: C API<46>. 

@end menu

@node Security<37>,Core and Builtins<133>,,Python 3 10 0 alpha 1
@anchor{whatsnew/changelog id605}@anchor{1d04}
@subsubsection Security



@itemize -

@item 
bpo-41304@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41304}: Fixes @code{python3x._pth} being ignored on Windows, caused by the
fix for bpo-29778@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29778} (
@geindex Common Vulnerabilities and Exposures; CVE 2020-15801
CVE 2020-15801@footnote{https://www.cve.org/CVERecord?id=CVE-2020-15801}).

@item 
bpo-41162@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41162}: Audit hooks are now cleared later during finalization to avoid
missing events.

@item 
bpo-29778@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29778}: Ensure @code{python3.dll} is loaded from correct locations
when Python is embedded (
@geindex Common Vulnerabilities and Exposures; CVE 2020-15523
CVE 2020-15523@footnote{https://www.cve.org/CVERecord?id=CVE-2020-15523}).

@item 
bpo-41004@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41004}: The __hash__() methods of  ipaddress.IPv4Interface and
ipaddress.IPv6Interface incorrectly generated constant hash values of 32
and 128 respectively. This resulted in always causing hash collisions. The
fix uses hash() to generate hash values for the tuple of (address, mask
length, network address).

@item 
bpo-39603@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39603}: Prevent http header injection by rejecting control characters
in http.client.putrequest(…).
@end itemize

@node Core and Builtins<133>,Library<136>,Security<37>,Python 3 10 0 alpha 1
@anchor{whatsnew/changelog id606}@anchor{1d05}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-41909@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41909}: Fixed stack overflow in @ref{9c4,,issubclass()} and
@ref{2ad,,isinstance()} when getting the @code{__bases__} attribute leads to
infinite recursion.

@item 
bpo-41922@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41922}: Speed up calls to @code{reversed()} by using the 
@geindex Python 향상 제안; PEP 590
PEP 590@footnote{https://peps.python.org/pep-0590/}
@code{vectorcall} calling convention. Patch by Donghee Na.

@item 
bpo-41873@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41873}: Calls to @code{float()} are now faster due to the @code{vectorcall}
calling convention. Patch by Dennis Sweeney.

@item 
bpo-41870@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41870}: Speed up calls to @code{bool()} by using the 
@geindex Python 향상 제안; PEP 590
PEP 590@footnote{https://peps.python.org/pep-0590/}
@code{vectorcall} calling convention. Patch by Donghee Na.
@end itemize

@node Library<136>,Core and Builtins<134>,Core and Builtins<133>,Python 3 10 0 alpha 1
@anchor{whatsnew/changelog id607}@anchor{1d06}
@subsubsection Library



@itemize -

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port the @code{_bisect} module to the multi-phase
initialization API (
@geindex Python 향상 제안; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}).
@end itemize

@node Core and Builtins<134>,Library<137>,Library<136>,Python 3 10 0 alpha 1
@anchor{whatsnew/changelog id608}@anchor{1d07}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-39934@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39934}: Correctly count control blocks in ‘except’ in compiler. Ensures
that a syntax error, rather a fatal error, occurs for deeply nested, named
exception handlers.

@item 
bpo-41780@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41780}: Fix @code{__dir__()} of @ref{9ec,,types.GenericAlias}. Patch by
Batuhan Taskaya.
@end itemize

@node Library<137>,Core and Builtins<135>,Core and Builtins<134>,Python 3 10 0 alpha 1
@anchor{whatsnew/changelog id609}@anchor{1d08}
@subsubsection Library



@itemize -

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port the @code{_lsprof} extension module to multi-phase
initialization (
@geindex Python 향상 제안; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}).

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port the @ref{19,,cmath} extension module to multi-phase
initialization (
@geindex Python 향상 제안; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}).

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port the @code{_scproxy} extension module to multi-phase
initialization (
@geindex Python 향상 제안; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}).

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port the @ref{e7,,termios} extension module to multi-phase
initialization (
@geindex Python 향상 제안; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}).

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Convert the @code{_sha256} extension module types to heap
types.
@end itemize

@node Core and Builtins<135>,Library<138>,Library<137>,Python 3 10 0 alpha 1
@anchor{whatsnew/changelog id610}@anchor{1d09}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-41690@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41690}: Fix a possible stack overflow in the parser when parsing
functions and classes with a huge amount of arguments. Patch by Pablo
Galindo.
@end itemize

@node Library<138>,Core and Builtins<136>,Core and Builtins<135>,Python 3 10 0 alpha 1
@anchor{whatsnew/changelog id611}@anchor{1d0a}
@subsubsection Library



@itemize -

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port the @code{_overlapped} extension module to multi-phase
initialization (
@geindex Python 향상 제안; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}).

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port the @code{_curses_panel} extension module to
multi-phase initialization (
@geindex Python 향상 제안; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}).

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port the @code{_opcode} extension module to multi-phase
initialization (
@geindex Python 향상 제안; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}).
@end itemize

@node Core and Builtins<136>,Library<139>,Library<138>,Python 3 10 0 alpha 1
@anchor{whatsnew/changelog id612}@anchor{1d0b}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-41681@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41681}: Fixes the wrong error description in the error raised by using
2 @code{,} in format string in f-string and @ref{832,,str.format()}.
@end itemize

@node Library<139>,Core and Builtins<137>,Core and Builtins<136>,Python 3 10 0 alpha 1
@anchor{whatsnew/changelog id613}@anchor{1d0c}
@subsubsection Library



@itemize -

@item 
bpo-41675@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41675}: The implementation of @ref{133a,,signal.siginterrupt()} now uses
@code{sigaction()} (if it is available in the system) instead of the
deprecated @code{siginterrupt()}. Patch by Pablo Galindo.
@end itemize

@node Core and Builtins<137>,Library<140>,Library<139>,Python 3 10 0 alpha 1
@anchor{whatsnew/changelog id614}@anchor{1d0d}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-41670@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41670}: Prevent line trace being skipped on platforms not compiled with
@code{USE_COMPUTED_GOTOS}. Fixes issue where some lines nested within a
try-except block were not being traced on Windows.

@item 
bpo-41654@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41654}: Fix a crash that occurred when destroying subclasses of
@ref{175f,,MemoryError}. Patch by Pablo Galindo.
@end itemize

@node Library<140>,Core and Builtins<138>,Core and Builtins<137>,Python 3 10 0 alpha 1
@anchor{whatsnew/changelog id615}@anchor{1d0e}
@subsubsection Library



@itemize -

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port the @ref{139,,zlib} extension module to multi-phase
initialization (
@geindex Python 향상 제안; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}).
@end itemize

@node Core and Builtins<138>,Library<141>,Library<140>,Python 3 10 0 alpha 1
@anchor{whatsnew/changelog id616}@anchor{1d0f}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-41631@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41631}: The @code{_ast} module uses again a global state. Using a module
state per module instance is causing subtle practical problems. For
example, the Mercurial project replaces the @code{__import__()} function to
implement lazy import, whereas Python expected that @code{import _ast} always
return a fully initialized @code{_ast} module.
@end itemize

@node Library<141>,Core and Builtins<139>,Core and Builtins<138>,Python 3 10 0 alpha 1
@anchor{whatsnew/changelog id617}@anchor{1d10}
@subsubsection Library



@itemize -

@item 
bpo-40077@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40077}: Convert @code{_operator} to use @ref{79c,,PyType_FromSpec()}.
@end itemize

@node Core and Builtins<139>,Library<142>,Library<141>,Python 3 10 0 alpha 1
@anchor{whatsnew/changelog id618}@anchor{1d11}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-1653741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1653741}: Port @code{_sha3} to multi-phase init.  Convert static types
to heap types.
@end itemize

@node Library<142>,Core and Builtins<140>,Core and Builtins<139>,Python 3 10 0 alpha 1
@anchor{whatsnew/changelog id619}@anchor{1d12}
@subsubsection Library



@itemize -

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port the @code{_blake2} extension module to the multi-phase
initialization API (
@geindex Python 향상 제안; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}).
@end itemize

@node Core and Builtins<140>,Library<143>,Library<142>,Python 3 10 0 alpha 1
@anchor{whatsnew/changelog id620}@anchor{1d13}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-41533@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41533}: Free the stack allocated in @code{va_build_stack} if
@code{do_mkstack} fails and the stack is not a @code{small_stack}.

@item 
bpo-41531@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41531}: Fix a bug that was dropping keys when compiling dict literals
with more than 0xFFFF elements. Patch by Pablo Galindo.

@item 
bpo-41525@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41525}: The output of @code{python --help} contains now only ASCII
characters.
@end itemize

@node Library<143>,Core and Builtins<141>,Core and Builtins<140>,Python 3 10 0 alpha 1
@anchor{whatsnew/changelog id621}@anchor{1d14}
@subsubsection Library



@itemize -

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port the @code{_sha1}, @code{_sha512}, and @code{_md5}
extension modules to multi-phase initialization API (
@geindex Python 향상 제안; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}).
@end itemize

@node Core and Builtins<141>,Library<144>,Library<143>,Python 3 10 0 alpha 1
@anchor{whatsnew/changelog id622}@anchor{1d15}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-41431@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41431}: Optimize @code{dict_merge()} for copying dict (e.g. @code{dict(d)}
and @code{@{@}.update(d)}).

@item 
bpo-41428@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41428}: Implement PEP 604. This supports (int | str) etc. in place of
Union[str, int].

@item 
bpo-41340@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41340}: Removed fallback implementation for @code{strdup}.

@item 
bpo-38156@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38156}: Handle interrupts that come after EOF correctly in
@code{PyOS_StdioReadline}.

@item 
bpo-41342@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41342}: @ref{14df,,round()} with integer argument is now faster (9–60%).

@item 
bpo-41334@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41334}: Constructors @ref{169,,str()}, @ref{192,,bytes()} and @ref{344,,bytearray()}
are now faster (around 30–40% for small objects).

@item 
bpo-41295@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41295}: Resolve a regression in CPython 3.8.4 where defining
“__setattr__” in a multi-inheritance setup and calling up the hierarchy
chain could fail if builtins/extension types were involved in the base
types.

@item 
bpo-41323@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41323}: Bytecode optimizations are performed directly on the control
flow graph. This will result in slightly more compact code objects in some
circumstances.

@item 
bpo-41247@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41247}: Always cache the running loop holder when running
@code{asyncio.set_running_loop}.

@item 
bpo-41252@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41252}: Fix incorrect refcounting in _ssl.c’s
@code{_servername_callback()}.

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port @ref{98,,multiprocessing} to multi-phase initialization
@end itemize

@node Library<144>,Core and Builtins<142>,Core and Builtins<141>,Python 3 10 0 alpha 1
@anchor{whatsnew/changelog id623}@anchor{1d16}
@subsubsection Library



@itemize -

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port @code{winapi} to multiphase initialization
@end itemize

@node Core and Builtins<142>,Library<145>,Library<144>,Python 3 10 0 alpha 1
@anchor{whatsnew/changelog id624}@anchor{1d17}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-41215@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41215}: Use non-NULL default values in the PEG parser keyword list to
overcome a bug that was preventing Python from being properly compiled
when using the XLC compiler. Patch by Pablo Galindo.

@item 
bpo-41218@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41218}: Python 3.8.3 had a regression where compiling with
ast.PyCF_ALLOW_TOP_LEVEL_AWAIT would aggressively mark list comprehension
with CO_COROUTINE. Now only list comprehension making use of async/await
will tagged as so.
@end itemize

@node Library<145>,Core and Builtins<143>,Core and Builtins<142>,Python 3 10 0 alpha 1
@anchor{whatsnew/changelog id625}@anchor{1d18}
@subsubsection Library



@itemize -

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port @ref{5c,,faulthandler} to multiphase initialization.

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port @code{sha256} to multiphase initialization
@end itemize

@node Core and Builtins<143>,Library<146>,Library<145>,Python 3 10 0 alpha 1
@anchor{whatsnew/changelog id626}@anchor{1d19}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-41175@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41175}: Guard against a NULL pointer dereference within bytearrayobject
triggered by the @code{bytearray() + bytearray()} operation.

@item 
bpo-41100@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41100}: add arm64 to the allowable Mac OS arches in mpdecimal.h

@item 
bpo-41094@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41094}: Fix decoding errors with audit when open files with non-ASCII
names on non-UTF-8 locale.

@item 
bpo-39960@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39960}: The “hackcheck” that prevents sneaking around a type’s
__setattr__() by calling the superclass method was rewritten to allow C
implemented heap types.

@item 
bpo-41084@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41084}: Prefix the error message with ‘f-string: ‘, when parsing an
f-string expression which throws a @ref{18e,,SyntaxError}.

@item 
bpo-40521@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40521}: Empty frozensets are no longer singletons.

@item 
bpo-41076@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41076}: Pre-feed the parser with the location of the f-string
expression, not the f-string itself, which allows us to skip the shifting
of the AST node locations after the parsing is completed.

@item 
bpo-41056@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41056}: Fixes a reference to deallocated stack space during startup
when constructing sys.path involving a relative symlink when code was
supplied via -c.  (discovered via Coverity)

@item 
bpo-41061@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41061}: Fix incorrect expressions and asserts in hashtable code and
tests.

@item 
bpo-41052@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41052}: Opt out serialization/deserialization for _random.Random

@item 
bpo-40939@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40939}: Rename @code{PyPegen*} functions to @code{PyParser*}, so that we can
remove the old set of @code{PyParser*} functions that were using the old
parser, but keep everything backwards-compatible.

@item 
bpo-35975@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35975}: Stefan Behnel reported that cf_feature_version is used even
when PyCF_ONLY_AST is not set. This is against the intention and against
the documented behavior, so it’s been fixed.

@item 
bpo-40939@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40939}: Remove the remaining files from the old parser and the
@code{symbol} module.
@end itemize

@node Library<146>,Core and Builtins<144>,Core and Builtins<143>,Python 3 10 0 alpha 1
@anchor{whatsnew/changelog id627}@anchor{1d1a}
@subsubsection Library



@itemize -

@item 
bpo-40077@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40077}: Convert @code{_bz2} to use @ref{79c,,PyType_FromSpec()}.
@end itemize

@node Core and Builtins<144>,Library<147>,Library<146>,Python 3 10 0 alpha 1
@anchor{whatsnew/changelog id628}@anchor{1d1b}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-41006@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41006}: The @code{encodings.latin_1} module is no longer imported at
startup. Now it is only imported when it is the filesystem encoding or the
stdio encoding.

@item 
bpo-40636@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40636}: @ref{1a0,,zip()} now supports 
@geindex Python 향상 제안; PEP 618
PEP 618@footnote{https://peps.python.org/pep-0618/}’s @code{strict} parameter,
which raises a @ref{2ec,,ValueError} if the arguments are exhausted at
different lengths. Patch by Brandt Bucher.

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port @code{_gdbm} to multiphase initialization.

@item 
bpo-40985@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40985}: Fix a bug that caused the @ref{18e,,SyntaxError} text to be empty
when a file ends with a line ending in a line continuation character (i.e.
backslash). The error text should contain the text of the last line.

@item 
bpo-40958@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40958}: Fix a possible buffer overflow in the PEG parser when gathering
information for emitting syntax errors. Patch by Pablo Galindo.

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port @code{_dbm} to multiphase initialization.

@item 
bpo-40957@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40957}: Fix refleak in _Py_fopen_obj() when PySys_Audit() fails
@end itemize

@node Library<147>,Core and Builtins<145>,Core and Builtins<144>,Python 3 10 0 alpha 1
@anchor{whatsnew/changelog id629}@anchor{1d1c}
@subsubsection Library



@itemize -

@item 
bpo-40950@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40950}: Add a state to the @code{nis} module (
@geindex Python 향상 제안; PEP 3121
PEP 3121@footnote{https://peps.python.org/pep-3121/}) and apply
the multiphase initialization. Patch by Donghee Na.
@end itemize

@node Core and Builtins<145>,Library<148>,Library<147>,Python 3 10 0 alpha 1
@anchor{whatsnew/changelog id630}@anchor{1d1d}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-40947@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40947}: The Python @ref{aaa,,Path Configuration} now
takes @ref{1d1e,,PyConfig.platlibdir} in account.

@item 
bpo-40939@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40939}: Remove the old parser, the @code{parser} module and all
associated support code, command-line options and environment variables.
Patch by Pablo Galindo.

@item 
bpo-40847@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40847}: Fix a bug where a line with only a line continuation character
is not considered a blank line at tokenizer level. In such cases, more
than a single @code{NEWLINE} token was emitted. The old parser was working
around the issue, but the new parser threw a @ref{18e,,SyntaxError} for valid
input due to this. For example, an empty line following a line
continuation character was interpreted as a @code{SyntaxError}.

@item 
bpo-40890@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40890}: Each dictionary view now has a @code{mapping} attribute that
provides a @ref{697,,types.MappingProxyType} wrapping the original
dictionary.  Patch contributed by Dennis Sweeney.

@item 
bpo-40889@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40889}: Improved the performance of symmetric difference operations on
dictionary item views.  Patch by Dennis Sweeney.

@item 
bpo-40904@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40904}: Fix possible segfault in the new PEG parser when parsing
f-string containing yield statements with no value (@code{f"@{yield@}"}).
Patch by Pablo Galindo

@item 
bpo-40903@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40903}: Fixed a possible segfault in the new PEG parser when producing
error messages for invalid assignments of the form @code{p=p=}. Patch by
Pablo Galindo

@item 
bpo-40880@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40880}: Fix invalid memory read in the new parser when checking
newlines in string literals. Patch by Pablo Galindo.

@item 
bpo-40883@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40883}: Fix memory leak in when parsing f-strings in the new parser.
Patch by Pablo Galindo

@item 
bpo-40870@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40870}: Raise @ref{2ec,,ValueError} when validating custom AST’s where the
constants @code{True}, @code{False} and @code{None} are used within a
@ref{1d1f,,ast.Name} node.

@item 
bpo-40854@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40854}: Allow overriding @ref{b32,,sys.platlibdir} via a new
@geindex PYTHONPLATLIBDIR
@geindex 환경 변수; PYTHONPLATLIBDIR
@ref{1d20,,PYTHONPLATLIBDIR} environment variable.

@item 
bpo-40826@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40826}: Fix GIL usage in @code{PyOS_Readline()}: lock the GIL to set
an exception and pass the Python thread state when checking if there is a
pending signal.

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port @ref{5d,,fcntl} to multiphase initialization.

@item 
bpo-19468@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19468}: Delete unnecessary instance check in importlib.reload(). Patch
by Furkan Önder.

@item 
bpo-40824@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40824}: Unexpected errors in calling the @code{__iter__} method are no
longer masked by @code{TypeError} in the @ref{34b,,in} operator and functions
@ref{ad7,,contains()}, @ref{ad8,,indexOf()} and
@ref{ad9,,countOf()} of the @ref{a3,,operator} module.

@item 
bpo-40792@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40792}: Attributes @code{start}, @code{stop} and @code{step} of the
@ref{b3d,,range} object now always has exact type @ref{19b,,int}.  Previously,
they could have been an instance of a subclass of @code{int}.

@item 
bpo-40780@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40780}: Fix a corner case where g-style string formatting of a float
failed to remove trailing zeros.

@item 
bpo-38964@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38964}: When there’s a @ref{18e,,SyntaxError} in the expression part of an
fstring, the filename attribute of the @code{SyntaxError} gets correctly
set to the name of the file the fstring resides in.

@item 
bpo-40750@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40750}: Support the “-d” debug flag in the new PEG parser. Patch by
Pablo Galindo

@item 
bpo-40217@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40217}: Instances of types created with
@ref{79d,,PyType_FromSpecWithBases()} will no longer automatically visit
their class object when traversing references in the garbage collector.
The user is expected to manually visit the object’s class. Patch by Pablo
Galindo.

@item 
bpo-39573@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39573}: @ref{3c9,,Py_TYPE()} is changed to the inline static function.
Patch by Donghee Na.

@item 
bpo-40696@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40696}: Fix a hang that can arise after @ref{71b,,generator.throw()} due to
a cycle in the exception context chain.

@item 
bpo-40521@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40521}: Each interpreter now its has own free lists, singletons and
caches:


@itemize *

@item 
Free lists: float, tuple, list, dict, frame, context,
asynchronous generator, MemoryError.

@item 
Singletons: empty tuple, empty bytes string, empty Unicode string,
single byte character, single Unicode (latin1) character.

@item 
Slice cache.
@end itemize

They are no longer shared by all interpreters.

@item 
bpo-40679@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40679}: Certain @ref{198,,TypeError} messages about missing or extra
arguments now include the function’s @ref{1d21,,qualified name}.  Patch by
Dennis Sweeney.

@item 
bpo-29590@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29590}: Make the stack trace correct after calling
@ref{71b,,generator.throw()} on a generator that has yielded from a @code{yield
from}.

@item 
bpo-4022@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4022}: Improve performance of generators by not raising internal
StopIteration.
@end itemize

@node Library<148>,Core and Builtins<146>,Core and Builtins<145>,Python 3 10 0 alpha 1
@anchor{whatsnew/changelog id631}@anchor{1d22}
@subsubsection Library



@itemize -

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port @ref{94,,mmap} to multiphase initialization.

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port @code{_lzma} to multiphase initialization.
@end itemize

@node Core and Builtins<146>,Library<149>,Library<148>,Python 3 10 0 alpha 1
@anchor{whatsnew/changelog id632}@anchor{1d23}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-37999@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37999}: Builtin and extension functions that take integer arguments no
longer accept @ref{1fe,,Decimal}s, @ref{213,,Fraction}s and other objects that can be converted to integers only with a loss
(e.g. that have the @ref{19d,,__int__()} method but do not have the
@ref{19e,,__index__()} method).

@item 
bpo-29882@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29882}: Add @ref{9cf,,int.bit_count()}, counting the number of ones in the
binary representation of an integer. Patch by Niklas Fiekas.
@end itemize

@node Library<149>,Core and Builtins<147>,Core and Builtins<146>,Python 3 10 0 alpha 1
@anchor{whatsnew/changelog id633}@anchor{1d24}
@subsubsection Library



@itemize -

@item 
bpo-36982@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36982}: Use ncurses extended color functions when available to support
terminals with 256 colors, and add the new function
@ref{9f6,,curses.has_extended_color_support()} to indicate whether extended
color support is provided by the underlying ncurses library.
@end itemize

@node Core and Builtins<147>,Library<150>,Library<149>,Python 3 10 0 alpha 1
@anchor{whatsnew/changelog id634}@anchor{1d25}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-19569@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19569}: Add the private macros @code{_Py_COMP_DIAG_PUSH},
@code{_Py_COMP_DIAG_IGNORE_DEPR_DECLS}, and @code{_Py_COMP_DIAG_POP}.

@item 
bpo-26680@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26680}: The int type now supports the x.is_integer() method for
compatibility with float.
@end itemize

@node Library<150>,Documentation<44>,Core and Builtins<147>,Python 3 10 0 alpha 1
@anchor{whatsnew/changelog id635}@anchor{1d26}
@subsubsection Library



@itemize -

@item 
bpo-41900@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41900}: C14N 2.0 serialisation in xml.etree.ElementTree failed for
unprefixed attributes when a default namespace was defined.

@item 
bpo-41887@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41887}: Strip leading spaces and tabs on @ref{e11,,ast.literal_eval()}. Also
document stripping of spaces and tabs for @ref{4a4,,eval()}.

@item 
bpo-41773@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41773}: Note in documentation that @ref{ec0,,random.choices()} doesn’t
support non-finite weights, raise @ref{2ec,,ValueError} when given non-finite
weights.

@item 
bpo-41840@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41840}: Fix a bug in the @ref{de,,symtable} module that was causing
module-scope global variables to not be reported as both local and global.
Patch by Pablo Galindo.

@item 
bpo-41842@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41842}: Add @ref{9e9,,codecs.unregister()} function to unregister a codec
search function.

@item 
bpo-40564@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40564}: In @code{zipfile.Path}, mutate the passed ZipFile object type
instead of making a copy. Prevents issues when both the local copy and the
caller’s copy attempt to close the same file handle.

@item 
bpo-40670@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40670}: More reliable validation of statements in
@ref{16cd,,timeit.Timer}. It now accepts “empty” statements (only whitespaces
and comments) and rejects misindentent statements.

@item 
bpo-41833@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41833}: The @ref{176,,threading.Thread} constructor now uses the target
name if the `target' argument is specified but the `name' argument is
omitted.

@item 
bpo-41817@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41817}: fix @code{tkinter.EventType} Enum so all members are strings, and
none are tuples

@item 
bpo-41810@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41810}: @ref{a51,,types.EllipsisType}, @ref{a53,,types.NotImplementedType}
and @ref{a52,,types.NoneType} have been reintroduced, providing a new set of
types readily interpretable by static type checkers.

@item 
bpo-41815@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41815}: Fix SQLite3 segfault when backing up closed database. Patch
contributed by Peter David McCormick.

@item 
bpo-41816@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41816}: StrEnum added: it ensures that all members are already strings
or string candidates

@item 
bpo-41517@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41517}: fix bug allowing Enums to be extended via multiple inheritance

@item 
bpo-39587@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39587}: use the correct mix-in data type when constructing Enums

@item 
bpo-41792@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41792}: Add is_typeddict function to typing.py to check if a type is a
TypedDict class

Previously there was no way to check that without using private API. See
the relevant issue in python/typing@footnote{https://github.com/python/typing/issues/751}.

@item 
bpo-41789@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41789}: Honor @code{object} overrides in @code{Enum} class creation
(specifically, @code{__str__}, @code{__repr__}, @code{__format__}, and
@code{__reduce_ex__}).

@item 
bpo-32218@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32218}: @code{enum.Flag} and @code{enum.IntFlag} members are now iterable.

@item 
bpo-39651@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39651}: Fix a race condition in the @code{call_soon_threadsafe()} method
of @code{asyncio.ProactorEventLoop}: do nothing if the self-pipe socket has
been closed.

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port the @code{mashal} extension module to the multi-phase
initialization API (
@geindex Python 향상 제안; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}).

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port the @code{_string} extension module to the multi-phase
initialization API (
@geindex Python 향상 제안; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}).

@item 
bpo-41732@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41732}: Added an @ref{4ca,,iterator} to @ref{165,,memoryview}.

@item 
bpo-41720@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41720}: Fixed @code{turtle.Vec2D.__rmul__()} for arguments which are not
int or float.

@item 
bpo-41696@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41696}: Fix handling of debug mode in @ref{2f3,,asyncio.run()}. This allows
setting @code{PYTHONASYNCIODEBUG} or @code{-X dev} to enable asyncio debug mode
when using @code{asyncio.run()}.

@item 
bpo-41687@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41687}: Fix implementation of sendfile to be compatible with Solaris.

@item 
bpo-41662@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41662}: No longer override exceptions raised in @code{__len__()} of a
sequence of parameters in @ref{d4,,sqlite3} with
@ref{305,,ProgrammingError}.

@item 
bpo-39010@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39010}: Restarting a @code{ProactorEventLoop} on Windows no longer logs
spurious @code{ConnectionResetErrors}.

@item 
bpo-41638@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41638}: @ref{305,,ProgrammingError} message for absent parameter
in @ref{d4,,sqlite3} contains now the name of the parameter instead of its
index when parameters are supplied as a dict.

@item 
bpo-41662@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41662}: Fixed crash when mutate list of parameters during iteration in
@ref{d4,,sqlite3}.

@item 
bpo-41513@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41513}: Improved the accuracy of math.hypot().  Internally, each step
is computed with extra precision so that the result is now almost always
correctly rounded.

@item 
bpo-41609@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41609}: The pdb whatis command correctly reports instance methods as
‘Method’ rather than ‘Function’.

@item 
bpo-39994@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39994}: Fixed pprint’s handling of dict subclasses that override
__repr__.

@item 
bpo-32751@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32751}: When cancelling the task due to a timeout,
@ref{814,,asyncio.wait_for()} will now wait until the cancellation is complete
also in the case when `timeout' is <= 0, like it does with positive
timeouts.

@item 
bpo-37658@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37658}: @ref{814,,asyncio.wait_for()} now properly handles races between
cancellation of itself and the completion of the wrapped awaitable.

@item 
bpo-40782@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40782}: Change the method asyncio.AbstractEventLoop.run_in_executor to
not be a coroutine.

@item 
bpo-41520@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41520}: Fix @ref{1d,,codeop} regression that prevented turning compile
warnings into errors.

@item 
bpo-41528@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41528}: turtle uses math module functions to convert degrees to radians
and vice versa and to calculate vector norm

@item 
bpo-41513@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41513}: Minor algorithmic improvement to math.hypot() and math.dist()
giving small gains in speed and accuracy.

@item 
bpo-41503@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41503}: Fixed a race between setTarget and flush in
logging.handlers.MemoryHandler.

@item 
bpo-41497@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41497}: Fix potential UnicodeDecodeError in dis module.

@item 
bpo-41467@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41467}: On Windows, fix asyncio @code{recv_into()} return value when the
socket/pipe is closed (@ref{125b,,BrokenPipeError}): return @code{0} rather than
an empty byte string (@code{b'@w{'}}).

@item 
bpo-41425@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41425}: Make tkinter doc example runnable.

@item 
bpo-41421@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41421}: Make an algebraic simplification to random.paretovariate().  It
now is slightly less subject to round-off error and is slightly faster.
Inputs that used to cause ZeroDivisionError now cause an OverflowError
instead.

@item 
bpo-41440@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41440}: Add @ref{4db,,os.cpu_count()} support for VxWorks RTOS.

@item 
bpo-41316@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41316}: Fix the @ref{e4,,tarfile} module to write only basename of TAR
file to GZIP compression header.

@item 
bpo-41384@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41384}: Raise TclError instead of TypeError when an unknown option is
passed to tkinter.OptionMenu.

@item 
bpo-41317@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41317}: Use add_done_callback() in asyncio.loop.sock_accept() to
unsubscribe reader early on cancellation.

@item 
bpo-41364@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41364}: Reduce import overhead of @ref{116,,uuid}.

@item 
bpo-35328@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35328}: Set the environment variable @code{VIRTUAL_ENV_PROMPT} at
@ref{117,,venv} activation.

@item 
bpo-41341@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41341}: Recursive evaluation of @code{typing.ForwardRef} in
@code{get_type_hints}.

@item 
bpo-41344@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41344}: Prevent creating @code{shared_memory.SharedMemory} objects
with @code{size=0}.

@item 
bpo-41333@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41333}: @code{collections.OrderedDict.pop()} is now 2 times faster.

@item 
bpo-41288@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41288}: Unpickling invalid NEWOBJ_EX opcode with the C implementation
raises now UnpicklingError instead of crashing.

@item 
bpo-39017@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39017}: Avoid infinite loop when reading specially crafted TAR files
using the tarfile module (
@geindex Common Vulnerabilities and Exposures; CVE 2019-20907
CVE 2019-20907@footnote{https://www.cve.org/CVERecord?id=CVE-2019-20907}).

@item 
bpo-41273@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41273}: Speed up any transport using @code{_ProactorReadPipeTransport} by
calling @code{recv_into} instead of @code{recv}, thus not creating a new buffer
for each @code{recv} call in the transport’s read loop.

@item 
bpo-41235@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41235}: Fix the error handling in
@ref{1347,,ssl.SSLContext.load_dh_params()}.

@item 
bpo-41207@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41207}: In distutils.spawn, restore expectation that DistutilsExecError
is raised when the command is not found.

@item 
bpo-29727@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29727}: Register @ref{4c0,,array.array} as a
@ref{4c1,,MutableSequence}. Patch by Pablo Galindo.

@item 
bpo-39168@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39168}: Remove the @code{__new__} method of @ref{17bc,,typing.Generic}.

@item 
bpo-41194@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41194}: Fix a crash in the @code{_ast} module: it can no longer be loaded
more than once. It now uses a global state rather than a module state.

@item 
bpo-41195@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41195}: Add read-only ssl.SSLContext.security_level attribute to
retrieve the context’s security level.

@item 
bpo-41193@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41193}: The @code{write_history()} atexit function of the readline
completer now ignores any @ref{2c0,,OSError} to ignore error if the filesystem
is read-only, instead of only ignoring @ref{264,,FileNotFoundError} and
@ref{f3d,,PermissionError}.

@item 
bpo-41182@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41182}: selector: use DefaultSelector based upon implementation

@item 
bpo-41161@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41161}: The decimal module now requires libmpdec-2.5.0. Users of
–with-system-libmpdec should update their system library.

@item 
bpo-40874@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40874}: The decimal module now requires libmpdec-2.5.0.

@item 
bpo-41138@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41138}: Fixed the @ref{103,,trace} module CLI for Python source files with
non-UTF-8 encoding.

@item 
bpo-31082@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31082}: Use the term “iterable” in the docstring for
@ref{21a,,functools.reduce()}.

@item 
bpo-40521@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40521}: Remove freelist from collections.deque().

@item 
bpo-31938@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31938}: Fix default-value signatures of several functions in the
@ref{c6,,select} module - by Anthony Sottile.

@item 
bpo-41068@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41068}: Fixed reading files with non-ASCII names from ZIP archive
directly after writing them.

@item 
bpo-41058@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41058}: @code{pdb.find_function()} now correctly determines the source
file encoding.

@item 
bpo-41056@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41056}: Invalid file descriptor values are now prevented from being
passed to os.fpathconf. (discovered by Coverity)

@item 
bpo-41056@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41056}: Fix a NULL pointer dereference within the ssl module during a
MemoryError in the keylog callback. (discovered by Coverity)

@item 
bpo-41056@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41056}: Fixed an instance where a MemoryError within the zoneinfo
module might not be reported or not reported at its source. (found by
Coverity)

@item 
bpo-41048@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41048}: @ref{1d27,,mimetypes.read_mime_types()} function reads the rule file
using UTF-8 encoding, not the locale encoding. Patch by Srinivas Reddy
Thatiparthy.

@item 
bpo-41043@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41043}: Fixed the use of @ref{59f,,glob()} in the stdlib: literal part
of the path is now always correctly escaped.

@item 
bpo-41025@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41025}: Fixed an issue preventing the C implementation of
@ref{adc,,zoneinfo.ZoneInfo} from being subclassed.

@item 
bpo-35018@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35018}: Add the @ref{a5c,,xml.sax.handler.LexicalHandler} class that is
present in other SAX XML implementations.

@item 
bpo-41002@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41002}: Improve performance of HTTPResponse.read with a given amount.
Patch by Bruce Merry.

@item 
bpo-40448@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40448}: @ref{59,,ensurepip} now disables the use of @code{pip} cache when
installing the bundled versions of @code{pip} and @code{setuptools}.  Patch by
Krzysztof Konopko.

@item 
bpo-40967@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40967}: Removed @code{asyncio.Task.current_task()} and
@code{asyncio.Task.all_tasks()}. Patch contributed by Rémi Lapeyre.

@item 
bpo-40924@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40924}: Ensure @code{importlib.resources.path} returns an extant path for
the SourceFileLoader’s resource reader. Avoids the regression identified
in master while a long-term solution is devised.

@item 
bpo-40955@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40955}: Fix a minor memory leak in @ref{dc,,subprocess} module when
extra_groups was specified.

@item 
bpo-40855@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40855}: The standard deviation and variance functions in the statistics
module were ignoring their mu and xbar arguments.

@item 
bpo-40939@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40939}: Use the new PEG parser when generating the stdlib
@ref{88,,keyword} module.

@item 
bpo-23427@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23427}: Add @ref{a41,,sys.orig_argv} attribute: the list of the original
command line arguments passed to the Python executable.

@item 
bpo-33689@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33689}: Ignore empty or whitespace-only lines in .pth files. This
matches the documentated behavior. Before, empty lines caused the
site-packages dir to appear multiple times in sys.path. By Ido Michael,
contributors Malcolm Smith and Tal Einat.

@item 
bpo-40884@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40884}: Added a @code{defaults} parameter to @ref{169c,,logging.Formatter},
to allow specifying default values for custom fields. Patch by Asaf Alon
and Bar Harel.

@item 
bpo-40876@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40876}: Clarify error message in the @ref{2d,,csv} module.

@item 
bpo-39791@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39791}: Refresh importlib.metadata from importlib_metadata 1.6.1.

@item 
bpo-40807@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40807}: Stop codeop._maybe_compile, used by code.InteractiveInterpreter
(and IDLE). from emitting each warning three times.

@item 
bpo-32604@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32604}: Fix reference leak in the @ref{c6,,select} module when the module
is imported in a subinterpreter.

@item 
bpo-39791@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39791}: Built-in loaders (SourceFileLoader and ZipImporter) now supply
@code{TraversableResources} implementations for @code{ResourceReader}, and the
fallback function has been removed.

@item 
bpo-39314@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39314}: @ref{1d28,,rlcompleter.Completer} and the standard Python shell
now close the parenthesis for functions that take no arguments. Patch
contributed by Rémi Lapeyre.

@item 
bpo-17005@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17005}: The topological sort functionality that was introduced
initially in the @ref{63,,functools} module has been moved to a new
@ref{69,,graphlib} module to better accommodate the new tools and keep the
original scope of the @code{functools} module. Patch by Pablo Galindo

@item 
bpo-40834@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40834}: Fix truncate when sending str object
with_xxsubinterpreters.channel_send.

@item 
bpo-40755@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40755}: Add rich comparisons to collections.Counter().

@item 
bpo-26407@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26407}: Unexpected errors in calling the @code{__iter__} method are no
longer masked by @code{TypeError} in @ref{6ad,,csv.reader()},
@code{csv.writer.writerow()} and @code{csv.writer.writerows()}.

@item 
bpo-39384@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39384}: Fixed email.contentmanager to allow set_content() to set a null
string.

@item 
bpo-40744@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40744}: The @ref{d4,,sqlite3} module uses SQLite API functions that
require SQLite v3.7.3 or higher.  This patch removes support for older
SQLite versions, and explicitly requires SQLite 3.7.3 both at build,
compile and runtime.  Patch by Sergey Fedoseev and Erlend E. Aasland.

@item 
bpo-40777@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40777}: Initialize PyDateTime_IsoCalendarDateType.tp_base at run-time
to avoid errors on some compilers.

@item 
bpo-38488@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38488}: Update ensurepip to install pip 20.1.1 and setuptools 47.1.0.

@item 
bpo-40792@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40792}: The result of @ref{1ccf,,operator.index()} now always has exact type
@ref{19b,,int}. Previously, the result could have been an instance of a
subclass of @code{int}.

@item 
bpo-40767@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40767}: @ref{11b,,webbrowser} now properly finds the default browser in
pure Wayland systems by checking the WAYLAND_DISPLAY environment variable.
Patch contributed by Jérémy Attali.

@item 
bpo-40791@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40791}: @code{hashlib.compare_digest()} uses OpenSSL’s
@code{CRYPTO_memcmp()} function when OpenSSL is available.

@item 
bpo-40795@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40795}: @ref{2e,,ctypes} module: If ctypes fails to convert the result of
a callback or if a ctypes callback function raises an exception,
sys.unraisablehook is now called with an exception set. Previously, the
error was logged into stderr by @ref{1d29,,PyErr_Print()}.

@item 
bpo-16995@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16995}: Add @ref{9e4,,base64.b32hexencode()} and @ref{9e5,,base64.b32hexdecode()}
to support the Base32 Encoding with Extended Hex Alphabet.

@item 
bpo-30008@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30008}: Fix @ref{d5,,ssl} code to be compatible with OpenSSL 1.1.x builds
that use @code{no-deprecated} and @code{--api=1.1.0}.

@item 
bpo-30064@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30064}: Fix asyncio @code{loop.sock_*} race condition issue

@item 
bpo-40759@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40759}: Deprecate the @code{symbol} module.

@item 
bpo-40756@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40756}: The second argument (extra) of @code{LoggerAdapter.__init__} now
defaults to None.

@item 
bpo-37129@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37129}: Add a new @ref{1d2a,,os.RWF_APPEND} flag for @ref{d56,,os.pwritev()}.

@item 
bpo-40737@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40737}: Fix possible reference leak for @ref{d4,,sqlite3} initialization.

@item 
bpo-40726@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40726}: Handle cases where the @code{end_lineno} is @code{None} on
@ref{1b0b,,ast.increment_lineno()}.

@item 
bpo-40698@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40698}: @code{distutils} upload creates SHA2-256 and Blake2b-256 digests.
MD5 digests is skipped if platform blocks MD5.

@item 
bpo-40695@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40695}: @ref{6c,,hashlib} no longer falls back to builtin hash
implementations when OpenSSL provides a hash digest and the algorithm is
blocked by security policy.

@item 
bpo-9216@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9216}: @ref{1d2b,,hashlib.new()} passed @code{usedforsecurity} to OpenSSL EVP
constructor @code{_hashlib.new()}. test_hashlib and test_smtplib handle
strict security policy better.

@item 
bpo-40614@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40614}: @ref{1c2,,ast.parse()} will not parse self documenting expressions
in f-strings when passed @code{feature_version} is less than @code{(3, 8)}.

@item 
bpo-40626@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40626}: Add h5 file extension as MIME Type application/x-hdf5, as per
HDF Group recommendation for HDF5 formatted data files. Patch contributed
by Mark Schwab.

@item 
bpo-25920@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25920}: On macOS, when building Python for macOS 10.4 and older, which
wasn’t the case for python.org macOS installer, @ref{176f,,socket.getaddrinfo()}
no longer uses an internal lock to prevent race conditions when calling
@code{getaddrinfo()} which is thread-safe since macOS 10.5. Python 3.9
requires macOS 10.6 or newer. The internal lock caused random hang on fork
when another thread was calling @code{socket.getaddrinfo()}. The lock was
also used on FreeBSD older than 5.3, OpenBSD older than 201311 and NetBSD
older than 4.

@item 
bpo-40671@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40671}: Prepare @code{_hashlib} for 
@geindex Python 향상 제안; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/} and use
@ref{b6c,,PyModule_AddType()}.

@item 
bpo-32309@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32309}: Added a new @ref{6b8,,coroutine} @ref{ae5,,asyncio.to_thread()}. It is
mainly used for running IO-bound functions in a separate thread to avoid
blocking the event loop, and essentially works as a high-level version of
@ref{ae6,,run_in_executor()} that can directly take keyword
arguments.

@item 
bpo-36543@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36543}: Restored the deprecated @code{xml.etree.cElementTree} module.

@item 
bpo-40611@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40611}: @ref{1d2c,,MAP_POPULATE} constant has now been added to the
list of exported @ref{94,,mmap} module flags.

@item 
bpo-39881@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39881}: PEP 554 for use in the test suite. (Patch By Joannah Nanjekye)

@item 
bpo-13097@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13097}: @code{ctypes} now raises an @code{ArgumentError} when a callback is
invoked with more than 1024 arguments.

@item 
bpo-39385@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39385}: A new test assertion context-manager,
@code{unittest.assertNoLogs()} will ensure a given block of code emits no
log messages using the logging module. Contributed by Kit Yan Choi.

@item 
bpo-23082@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23082}: Updated the error message and docs of PurePath.relative_to() to
better reflect the function behaviour.

@item 
bpo-40318@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40318}: Use SQLite3 trace v2 API, if it is available.

@item 
bpo-40105@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40105}: ZipFile truncates files to avoid corruption when a shorter
comment is provided in append (“a”) mode. Patch by Jan Mazur.

@item 
bpo-40084@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40084}: Fix @code{Enum.__dir__}: dir(Enum.member) now includes attributes
as well as methods.

@item 
bpo-31122@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31122}: ssl.wrap_socket() now raises ssl.SSLEOFError rather than
OSError when peer closes connection during TLS negotiation

@item 
bpo-39728@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39728}: fix default @code{_missing_} so a duplicate @code{ValueError} is not
set as the @code{__context__} of the original @code{ValueError}.

@item 
bpo-39244@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39244}: Fixed @code{multiprocessing.context.get_all_start_methods} to
properly return the default method first on macOS.

@item 
bpo-39040@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39040}: Fix parsing of invalid mime headers parameters by collapsing
whitespace between encoded words in a bare-quote-string.

@item 
bpo-38731@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38731}: Add @code{--quiet} option to command-line interface of
@ref{b8,,py_compile}. Patch by Gregory Schevchenko.

@item 
bpo-35714@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35714}: @ref{1528,,struct.error} is now raised if there is a null character
in a @ref{db,,struct} format string.

@item 
bpo-38144@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38144}: Added the `root_dir' and `dir_fd' parameters in
@ref{59f,,glob.glob()}.

@item 
bpo-26543@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26543}: Fix @code{IMAP4.noop()} when debug mode is enabled (ex:
@code{imaplib.Debug = 3}).

@item 
bpo-12178@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12178}: @ref{6ae,,csv.writer()} now correctly escapes `escapechar' when
input contains `escapechar'.  Patch by Catalin Iacob, Berker Peksag, and
Itay Elbirt.

@item 
bpo-36290@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36290}: AST nodes are now raising @ref{198,,TypeError} on conflicting
keyword arguments. Patch contributed by Rémi Lapeyre.

@item 
bpo-33944@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33944}: Added site.py site-packages tracing in verbose mode.

@item 
bpo-35078@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35078}: Refactor formatweekday, formatmonthname methods in
LocaleHTMLCalendar and LocaleTextCalendar classes in calendar module to
call the base class methods.This enables customizable CSS classes for
LocaleHTMLCalendar. Patch by Srinivas Reddy Thatiparthy

@item 
bpo-29620@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29620}: @ref{1369,,assertWarns()} no longer raises a
@code{RuntimeException} when accessing a module’s @code{__warningregistry__}
causes importation of a new module, or when a new module is imported in
another thread. Patch by Kernc.

@item 
bpo-31844@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31844}: Remove @code{ParserBase.error()} method from the private and
undocumented @code{_markupbase} module.  @ref{a77,,html.parser.HTMLParser} is
the only subclass of @code{ParserBase} and its @code{error()} implementation was
deprecated in Python 3.4 and removed in Python 3.5.

@item 
bpo-34226@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34226}: Fix @code{cgi.parse_multipart} without content_length. Patch by
Roger Duran

@item 
bpo-33660@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33660}: Fix pathlib.PosixPath to resolve a relative path located on the
root directory properly.

@item 
bpo-28557@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28557}: Improve the error message for a misbehaving @code{rawio.readinto}

@item 
bpo-26680@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26680}: The d.is_integer() method is added to the Decimal type, for
compatibility with other number types.

@item 
bpo-26680@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26680}: The x.is_integer() method is incorporated into the abstract
types of the numeric tower, Real, Rational and Integral, with appropriate
default implementations.
@end itemize

@node Documentation<44>,Tests<44>,Library<150>,Python 3 10 0 alpha 1
@anchor{whatsnew/changelog id636}@anchor{1d2d}
@subsubsection Documentation



@itemize -

@item 
bpo-41428@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41428}: Add documentation for 
@geindex Python 향상 제안; PEP 604
PEP 604@footnote{https://peps.python.org/pep-0604/} (Allow writing union types as
@code{X | Y}).

@item 
bpo-41774@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41774}: In Programming FAQ “Sequences (Tuples/Lists)” section, add “How
do you remove multiple items from a list”.

@item 
bpo-35293@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35293}: Fix RemovedInSphinx40Warning when building the documentation.
Patch by Donghee Na.

@item 
bpo-37149@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37149}: Change Shipman tkinter doc link from archive.org to TkDocs.
(The doc has been removed from the NMT server.)  The new link responds
much faster and includes a short explanatory note.

@item 
bpo-41726@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41726}: Update the refcounts info of @code{PyType_FromModuleAndSpec}.

@item 
bpo-41624@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41624}: Fix the signature of @ref{1d2e,,typing.Coroutine}.

@item 
bpo-40204@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40204}: Enable Sphinx 3.2 @code{c_allow_pre_v3} option and disable
@code{c_warn_on_allowed_pre_v3} option to make the documentation compatible
with Sphinx 2 and Sphinx 3.

@item 
bpo-41045@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41045}: Add documentation for debug feature of f-strings.

@item 
bpo-41314@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41314}: Changed the release when @code{from __future__ import annotations}
becomes the default from @code{4.0} to @code{3.10} (following a change in PEP
563).

@item 
bpo-40979@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40979}: Refactored typing.rst, arranging more than 70 classes,
functions, and decorators into new sub-sections.

@item 
bpo-40552@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40552}: Fix in tutorial section 4.2. Code snippet is now correct.

@item 
bpo-39883@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39883}: Make code, examples, and recipes in the Python documentation be
licensed under the more permissive BSD0 license in addition to the
existing Python 2.0 license.

@item 
bpo-37703@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37703}: Updated Documentation to comprehensively elaborate on the
behaviour of gather.cancel()
@end itemize

@node Tests<44>,Build<51>,Documentation<44>,Python 3 10 0 alpha 1
@anchor{whatsnew/changelog id637}@anchor{1d2f}
@subsubsection Tests



@itemize -

@item 
bpo-41939@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41939}: Fix test_site.test_license_exists_at_url(): call
@code{urllib.request.urlcleanup()} to reset the global
@code{urllib.request._opener}. Patch by Victor Stinner.

@item 
bpo-41731@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41731}: Make test_cmd_line_script pass with option ‘-vv’.

@item 
bpo-41602@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41602}: Add tests for SIGINT handling in the runpy module.

@item 
bpo-41521@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41521}: @ref{ea,,test.support}: Rename @code{blacklist} parameter of
@ref{1d30,,check__all__()} to @code{not_exported}.

@item 
bpo-41477@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41477}: Make ctypes optional in test_genericalias.

@item 
bpo-41085@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41085}: Fix integer overflow in the @ref{9e1,,array.array.index()} method on
64-bit Windows for index larger than @code{2**31}.

@item 
bpo-41069@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41069}: @code{test.support.TESTFN} and the current directory for tests
when run via @code{test.regrtest} contain now non-ascii characters if
possible.

@item 
bpo-38377@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38377}: On Linux, skip tests using multiprocessing if the current user
cannot create a file in @code{/dev/shm/} directory. Add the
@ref{1d31,,skip_if_broken_multiprocessing_synchronize()} function
to the @ref{ea,,test.support} module.

@item 
bpo-41009@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41009}: Fix use of @code{support.require_@{linux|mac|freebsd@}_version()}
decorators as class decorator.

@item 
bpo-41003@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41003}: Fix @code{test_copyreg} when @code{numpy} is installed:
@code{test.pickletester} now saves/restores warnings filters when importing
@code{numpy}, to ignore filters installed by @code{numpy}.

@item 
bpo-40964@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40964}: Disable remote @ref{78,,imaplib} tests, host cyrus.andrew.cmu.edu
is blocking incoming connections.

@item 
bpo-40927@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40927}: Fix test_binhex when run twice: it now uses
import_fresh_module() to ensure that it raises DeprecationWarning each
time.

@item 
bpo-17258@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17258}: Skip some @ref{98,,multiprocessing} tests when MD5 hash digest is
blocked.

@item 
bpo-31904@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31904}: Increase LOOPBACK_TIMEOUT to 10 for VxWorks RTOS.

@item 
bpo-38169@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38169}: Increase code coverage for SharedMemory and ShareableList

@item 
bpo-34401@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34401}: Make test_gdb properly run on HP-UX. Patch by Michael Osipov.
@end itemize

@node Build<51>,Windows<44>,Tests<44>,Python 3 10 0 alpha 1
@anchor{whatsnew/changelog id638}@anchor{1d32}
@subsubsection Build



@itemize -

@item 
bpo-38249@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38249}: Update @ref{dad,,Py_UNREACHABLE} to use __builtin_unreachable()
if only the compiler is able to use it. Patch by Donghee Na.

@item 
bpo-41617@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41617}: Fix @code{pycore_bitutils.h} header file to support old clang
versions: @code{__builtin_bswap16()} is not available in LLVM clang 3.0.

@item 
bpo-40204@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40204}: Pin Sphinx version to 2.3.1 in @code{Doc/Makefile}.

@item 
bpo-36020@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36020}: The C99 functions @code{snprintf()} and @code{vsnprintf()}
are now required to build Python.

@item 
bpo-40684@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40684}: @code{make install} now uses the @code{PLATLIBDIR} variable for the
destination @code{lib-dynload/} directory when @code{./configure
--with-platlibdir} is used.

@item 
bpo-40683@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40683}: Fixed an issue where the @ref{13a,,zoneinfo} module and its tests
were not included when Python is installed with @code{make}.
@end itemize

@node Windows<44>,macOS<34>,Build<51>,Python 3 10 0 alpha 1
@anchor{whatsnew/changelog id639}@anchor{1d33}
@subsubsection Windows



@itemize -

@item 
bpo-41744@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41744}: Fixes automatic import of props file when using the Nuget
package.

@item 
bpo-41627@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41627}: The user site directory for 32-bit now includes a @code{-32}
suffix to distinguish it from the 64-bit interpreter’s directory.

@item 
bpo-41526@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41526}: Fixed layout of final page of the installer by removing the
special thanks to Mark Hammond (with his permission).

@item 
bpo-41492@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41492}: Fixes the description that appears in UAC prompts.

@item 
bpo-40948@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40948}: Improve post-install message to direct people to the “py”
command.

@item 
bpo-41412@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41412}: The installer will now fail to install on Windows 7 and Windows
8. Further, the UCRT dependency is now always downloaded on demand.

@item 
bpo-40741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40741}: Update Windows release to include SQLite 3.32.3.

@item 
bpo-41142@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41142}: @code{msilib} now supports creating CAB files with non-ASCII
file path and adding files with non-ASCII file path to them.

@item 
bpo-41074@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41074}: Fixed support of non-ASCII names in functions
@code{msilib.OpenDatabase()} and @code{msilib.init_database()} and
non-ASCII SQL in method @code{msilib.Database.OpenView()}.

@item 
bpo-41039@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41039}: Stable ABI redirection DLL (python3.dll) now uses @code{#pragma
comment(linker)} for re-exporting.

@item 
bpo-40164@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40164}: Updates Windows OpenSSL to 1.1.1g

@item 
bpo-39631@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39631}: Changes the registered MIME type for @code{.py} files on Windows
to @code{text/x-python} instead of @code{text/plain}.

@item 
bpo-40677@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40677}: Manually define IO_REPARSE_TAG_APPEXECLINK in case some old
Windows SDK doesn’t have it.

@item 
bpo-37556@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37556}: Extend py.exe help to mention overrides via venv, shebang,
environmental variables & ini files.
@end itemize

@node macOS<34>,IDLE<26>,Windows<44>,Python 3 10 0 alpha 1
@anchor{whatsnew/changelog id640}@anchor{1d34}
@subsubsection macOS



@itemize -

@item 
bpo-41557@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41557}: Update macOS installer to use SQLite 3.33.0.

@item 
bpo-39580@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39580}: Avoid opening Finder window if running installer from the
command line. Patch contributed by Rick Heil.

@item 
bpo-41100@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41100}: Fix configure error when building on macOS 11. Note that the
current Python release was released shortly after the first developer
preview of macOS 11 (Big Sur); there are other known issues with building
and running on the developer preview. Big Sur is expected to be fully
supported in a future bugfix release of Python 3.8.x and with 3.9.0.

@item 
bpo-40741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40741}: Update macOS installer to use SQLite 3.32.3.

@item 
bpo-41005@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41005}: fixed an XDG settings issue not allowing macos to open browser
in webbrowser.py

@item 
bpo-40741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40741}: Update macOS installer to use SQLite 3.32.2.
@end itemize

@node IDLE<26>,C API<46>,macOS<34>,Python 3 10 0 alpha 1
@anchor{whatsnew/changelog id641}@anchor{1d35}
@subsubsection IDLE



@itemize -

@item 
bpo-41775@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41775}: Use ‘IDLE Shell’ as shell title

@item 
bpo-35764@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35764}: Rewrite the Calltips doc section.

@item 
bpo-40181@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40181}: In calltips, stop reminding that ‘/’ marks the end of
positional-only arguments.

@item 
bpo-41468@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41468}: Improve IDLE run crash error message (which users should never
see).

@item 
bpo-41373@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41373}: Save files loaded with no line ending, as when blank, or
different line endings, by setting its line ending to the system default.
Fix regression in 3.8.4 and 3.9.0b4.

@item 
bpo-41300@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41300}: Save files with non-ascii chars. Fix regression released in
3.9.0b4 and 3.8.4.

@item 
bpo-37765@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37765}: Add keywords to module name completion list.  Rewrite
Completions section of IDLE doc.

@item 
bpo-41152@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41152}: The encoding of @code{stdin}, @code{stdout} and @code{stderr} in IDLE is
now always UTF-8.

@item 
bpo-41144@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41144}: Make Open Module open a special module such as os.path.

@item 
bpo-39885@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39885}: Make context menu Cut and Copy work again when right-clicking
within a selection.

@item 
bpo-40723@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40723}: Make test_idle pass when run after import.
@end itemize

@node C API<46>,,IDLE<26>,Python 3 10 0 alpha 1
@anchor{whatsnew/changelog id642}@anchor{1d36}
@subsubsection C API



@itemize -

@item 
bpo-41936@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41936}: Removed undocumented macros @code{Py_ALLOW_RECURSION} and
@code{Py_END_ALLOW_RECURSION} and the @code{recursion_critical} field of the
@ref{aba,,PyInterpreterState} structure.

@item 
bpo-41692@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41692}: The @code{PyUnicode_InternImmortal()} function is now deprecated
and will be removed in Python 3.12: use @ref{aae,,PyUnicode_InternInPlace()}
instead. Patch by Victor Stinner.

@item 
bpo-41842@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41842}: Add @ref{a97,,PyCodec_Unregister()} function to unregister a codec
search function.

@item 
bpo-41834@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41834}: Remove the @code{_Py_CheckRecursionLimit} variable: it has been
replaced by @code{ceval.recursion_limit} of the @ref{aba,,PyInterpreterState}
structure. Patch by Victor Stinner.

@item 
bpo-41689@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41689}: Types created with @ref{79c,,PyType_FromSpec()} now make any
signature in their @code{tp_doc} slot accessible from @code{__text_signature__}.

@item 
bpo-41524@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41524}: Fix bug in @ref{1d37,,PyOS_mystrnicmp()} and
@ref{1d38,,PyOS_mystricmp()} that incremented pointers beyond the end of a
string.

@item 
bpo-41324@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41324}: Add a minimal decimal capsule API.  The API supports fast
conversions between Decimals up to 38 digits and their triple
representation as a C struct.

@item 
bpo-30155@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30155}: Add @ref{a95,,PyDateTime_DATE_GET_TZINFO()} and
@ref{a96,,PyDateTime_TIME_GET_TZINFO()} macros for accessing the @code{tzinfo}
attributes of @ref{4e2,,datetime.datetime} and @ref{1fb,,datetime.time}
objects.

@item 
bpo-40170@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40170}: Revert @ref{1d39,,PyType_HasFeature()} change: it reads again
directly the @ref{1c6f,,PyTypeObject.tp_flags} member when the limited C
API is not used, rather than always calling @ref{1d3a,,PyType_GetFlags()}
which hides implementation details.

@item 
bpo-41123@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41123}: Remove @code{PyUnicode_AsUnicodeCopy}.

@item 
bpo-41123@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41123}: Removed @code{PyLong_FromUnicode()}.

@item 
bpo-41123@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41123}: Removed @code{PyUnicode_GetMax()}.

@item 
bpo-41123@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41123}: Removed @code{Py_UNICODE_str*} functions manipulating
@code{Py_UNICODE*} strings.

@item 
bpo-41103@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=41103}: @code{PyObject_AsCharBuffer()}, @code{PyObject_AsReadBuffer()},
@code{PyObject_CheckReadBuffer()}, and @code{PyObject_AsWriteBuffer()} are
removed. Please migrate to new buffer protocol;
@ref{638,,PyObject_GetBuffer()} and @ref{639,,PyBuffer_Release()}.

@item 
bpo-36346@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36346}: Raises DeprecationWarning for @code{PyUnicode_FromUnicode(NULL,
size)} and @code{PyUnicode_FromStringAndSize(NULL, size)} with @code{size > 0}.

@item 
bpo-36346@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36346}: Mark @code{Py_UNICODE_COPY}, @code{Py_UNICODE_FILL},
@code{PyUnicode_WSTR_LENGTH}, @code{PyUnicode_FromUnicode},
@code{PyUnicode_AsUnicode}, and @code{PyUnicode_AsUnicodeAndSize} as deprecated
in C. Remove @code{Py_UNICODE_MATCH} which was deprecated and broken since
Python 3.3.

@item 
bpo-40989@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40989}: The @ref{1d3b,,PyObject_INIT()} and @ref{1d3c,,PyObject_INIT_VAR()}
macros become aliases to, respectively, @ref{c60,,PyObject_Init()} and
@ref{1d3d,,PyObject_InitVar()} functions.

@item 
bpo-36020@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36020}: On Windows, @code{#include "pyerrors.h"} no longer defines
@code{snprintf} and @code{vsnprintf} macros.

@item 
bpo-40943@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40943}: The @code{PY_SSIZE_T_CLEAN} macro must now be defined to use
@ref{3c1,,PyArg_ParseTuple()} and @ref{3c2,,Py_BuildValue()} formats which use
@code{#}: @code{es#}, @code{et#}, @code{s#}, @code{u#}, @code{y#}, @code{z#}, @code{U#} and
@code{Z#}. See @ref{3d5,,Parsing arguments and building values} and
the 
@geindex Python 향상 제안; PEP 353
PEP 353@footnote{https://peps.python.org/pep-0353/}.

@item 
bpo-40910@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40910}: Export explicitly the @ref{1d3e,,Py_GetArgcArgv()} function to the
C API and document the function. Previously, it was exported implicitly
which no longer works since Python is built with @code{-fvisibility=hidden}.

@item 
bpo-40724@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40724}: Allow defining buffer slots in type specs.

@item 
bpo-40679@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40679}: Fix a @code{_PyEval_EvalCode()} crash if `qualname' argument is
NULL.

@item 
bpo-40839@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40839}: Calling @ref{626,,PyDict_GetItem()} without @ref{164,,GIL} held had
been allowed for historical reason. It is no longer allowed.

@item 
bpo-40826@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40826}: @ref{1d3f,,PyOS_InterruptOccurred()} now fails with a fatal error
if it is called with the GIL released.

@item 
bpo-40792@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40792}: The result of @ref{a93,,PyNumber_Index()} now always has exact
type @ref{19b,,int}. Previously, the result could have been an instance of a
subclass of @code{int}.

@item 
bpo-39573@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39573}: Convert @ref{2cf,,Py_REFCNT()} and @ref{984,,Py_SIZE()} macros to
static inline functions. They cannot be used as l-value anymore: use
@ref{aa8,,Py_SET_REFCNT()} and @ref{985,,Py_SET_SIZE()} to set an object
reference count and size. This change is backward incompatible on purpose,
to prepare the C API for an opaque @ref{5dc,,PyObject} structure.

@item 
bpo-40703@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40703}: The PyType_FromSpec*() functions no longer overwrite the type’s
“__module__” attribute if it is set via “Py_tp_members” or “Py_tp_getset”.

@item 
bpo-39583@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39583}: Remove superfluous “extern C” declarations from
@code{Include/cpython/*.h}.
@end itemize

@node Python 3 9 0 beta 1,Python 3 9 0 alpha 6,Python 3 10 0 alpha 1,Changelog
@anchor{whatsnew/changelog python-3-9-0-beta-1}@anchor{1d40}
@subsection Python 3.9.0 beta 1


`Release date: 2020-05-19'

@menu
* Security: Security<38>. 
* Core and Builtins: Core and Builtins<148>. 
* Library: Library<151>. 
* Documentation: Documentation<45>. 
* Tests: Tests<45>. 
* Build: Build<52>. 
* Windows: Windows<45>. 
* macOS: macOS<35>. 
* Tools/Demos: Tools/Demos<30>. 
* C API: C API<47>. 

@end menu

@node Security<38>,Core and Builtins<148>,,Python 3 9 0 beta 1
@anchor{whatsnew/changelog id643}@anchor{1d41}
@subsubsection Security



@itemize -

@item 
bpo-40501@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40501}: @ref{116,,uuid} no longer uses @ref{2e,,ctypes} to load
@code{libuuid} or @code{rpcrt4.dll} at runtime.
@end itemize

@node Core and Builtins<148>,Library<151>,Security<38>,Python 3 9 0 beta 1
@anchor{whatsnew/changelog id644}@anchor{1d42}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-40663@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40663}: Correctly generate annotations where parentheses are omitted
but required (e.g: @code{Type[(str, int, *other))]}.

@item 
bpo-40596@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40596}: Fixed @ref{1d43,,str.isidentifier()} for non-canonicalized strings
containing non-BMP characters on Windows.

@item 
bpo-40593@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40593}: Improved syntax errors for invalid characters in source code.

@item 
bpo-40585@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40585}: Fixed a bug when using @ref{1b51,,codeop.compile_command()} that was
causing exceptions to be swallowed with the new parser. Patch by Pablo
Galindo

@item 
bpo-40566@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40566}: Apply 
@geindex Python 향상 제안; PEP 573
PEP 573@footnote{https://peps.python.org/pep-0573/} to @ref{4,,abc}.

@item 
bpo-40502@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40502}: Initialize @code{n->n_col_offset}. (Patch by Joannah Nanjekye)

@item 
bpo-40527@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40527}: Fix command line argument parsing: no longer write errors
multiple times into stderr.

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port @ref{5b,,errno} to multiphase initialization (
@geindex Python 향상 제안; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}).

@item 
bpo-40523@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40523}: Add pass-throughs for @ref{800,,hash()} and @ref{a65,,reversed()} to
@ref{c45,,weakref.proxy} objects. Patch by Pablo Galindo.

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port @ref{e2,,syslog} to multiphase initialization (
@geindex Python 향상 제안; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}).

@item 
bpo-40246@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40246}: Reporting a specialised error message for invalid string
prefixes, which was introduced in bpo-40246@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40246}, is being reverted due to
backwards compatibility concerns for strings that immediately follow a
reserved keyword without whitespace between them. Constructs like
@code{bg="#d00" if clear else"#fca"} were failing to parse, which is not an
acceptable breakage on such short notice.

@item 
bpo-40417@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40417}: Fix imp module deprecation warning when PyImport_ReloadModule
is called. Patch by Robert Rouhani.

@item 
bpo-40408@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40408}: Fixed support of nested type variables in GenericAlias (e.g.
@code{list[list[T]]}).

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port _stat module to multiphase initialization (
@geindex Python 향상 제안; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}).

@item 
bpo-29587@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29587}: Enable implicit exception chaining when calling
@ref{71b,,generator.throw()}.

@item 
bpo-40328@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40328}: Add tools for generating mappings headers for CJKCodecs.

@item 
bpo-40228@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40228}: Setting frame.f_lineno is now robust w.r.t. changes in the
source-to-bytecode compiler

@item 
bpo-38880@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38880}: Added the ability to list interpreters associated with channel
ends in the internal subinterpreters module.

@item 
bpo-37986@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37986}: Improve performance of @ref{b3c,,PyLong_FromDouble()} for values
that fit into long.
@end itemize

@node Library<151>,Documentation<45>,Core and Builtins<148>,Python 3 9 0 beta 1
@anchor{whatsnew/changelog id645}@anchor{1d44}
@subsubsection Library



@itemize -

@item 
bpo-40662@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40662}: Fixed @ref{bca,,ast.get_source_segment()} for ast nodes that have
incomplete location information. Patch by Irit Katriel.

@item 
bpo-40665@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40665}: Convert @ref{12,,bisect} to use Argument Clinic.

@item 
bpo-40536@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40536}: Added the @ref{1d45,,available_timezones()} function to the
@ref{13a,,zoneinfo} module. Patch by Paul Ganssle.

@item 
bpo-40645@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40645}: The @ref{d32,,hmac.HMAC} exposes internal implementation details.
The attributes @code{digest_cons}, @code{inner}, and @code{outer} are deprecated
and will be removed in the future.

@item 
bpo-40645@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40645}: The internal module @code{_hashlib} wraps and exposes OpenSSL’s
HMAC API. The new code will be used in Python 3.10 after the internal
implementation details of the pure Python HMAC module are no longer part
of the public API.

@item 
bpo-40637@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40637}: Builtin hash modules can now be disabled or selectively enabled
with @code{configure --with-builtin-hashlib-hashes=sha3,blake1} or
@code{--without-builtin-hashlib-hashes}.

@item 
bpo-37630@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37630}: The @ref{6c,,hashlib} module can now use SHA3 hashes and SHAKE XOF
from OpenSSL when available.

@item 
bpo-40479@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40479}: The @ref{6c,,hashlib} now compiles with OpenSSL 3.0.0-alpha2.

@item 
bpo-40257@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40257}: Revert changes to @ref{bec,,inspect.getdoc()}.

@item 
bpo-40607@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40607}: When cancelling a task due to timeout, @ref{814,,asyncio.wait_for()}
will now propagate the exception if an error happens during cancellation.
Patch by Roman Skurikhin.

@item 
bpo-40612@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40612}: Fix edge cases in SyntaxError formatting. If the offset is <=
0, no caret is printed. If the offset is > line length, the caret is
printed pointing just after the last character.

@item 
bpo-40597@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40597}: If text content lines are longer than policy.max_line_length,
always use a content-encoding to make sure they are wrapped.

@item 
bpo-40571@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40571}: Added functools.cache() as a simpler, more discoverable way to
access the unbounded cache variant of lru_cache(maxsize=None).

@item 
bpo-40503@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40503}: 
@geindex Python 향상 제안; PEP 615
PEP 615@footnote{https://peps.python.org/pep-0615/}, the @ref{13a,,zoneinfo} module. Adds support for the
IANA time zone database.

@item 
bpo-40397@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40397}: Removed attributes @code{__args__} and @code{__parameters__} from
special generic aliases like @code{typing.List} (not subscripted).

@item 
bpo-40549@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40549}: Convert posixmodule.c (“posix” or “nt” module) to the
multiphase initialization (PEP 489).

@item 
bpo-31033@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31033}: Add a @code{msg} argument to @code{Future.cancel()} and
@code{Task.cancel()}.

@item 
bpo-40541@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40541}: Added an optional `counts' parameter to random.sample().

@item 
bpo-40515@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40515}: The @ref{d5,,ssl} and @ref{6c,,hashlib} modules now actively check
that OpenSSL is build with thread support. Python 3.7.0 made thread
support mandatory and no longer works safely with a no-thread builds.

@item 
bpo-31033@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31033}: When a @ref{1c7,,asyncio.Task} is cancelled, the exception
traceback now chains all the way back to where the task was first
interrupted.

@item 
bpo-40504@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40504}: @ref{be1,,functools.lru_cache()} objects can now be the targets of
weakrefs.

@item 
bpo-40559@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40559}: Fix possible memory leak in the C implementation of
@ref{1c7,,asyncio.Task}.

@item 
bpo-40480@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40480}: @code{fnmatch.fnmatch()} could take exponential time in the
presence of multiple @code{*} pattern characters.  This was repaired by
generating more elaborate regular expressions to avoid futile
backtracking.

@item 
bpo-40495@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40495}: @ref{21,,compileall} is now able to use hardlinks to prevent
duplicates in a case when @code{.pyc} files for different optimization levels
have the same content.

@item 
bpo-40457@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40457}: The ssl module now support OpenSSL builds without TLS 1.0 and
1.1 methods.

@item 
bpo-40355@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40355}: Improve error reporting in @ref{e11,,ast.literal_eval()} in the
presence of malformed @ref{1d46,,ast.Dict} nodes instead of silently ignoring
any non-conforming elements. Patch by Curtis Bucher.

@item 
bpo-40465@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40465}: Deprecated the optional `random' argument to
`random.shuffle()'.

@item 
bpo-40459@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40459}: @ref{1d47,,platform.win32_ver()} now produces correct `ptype' strings
instead of empty strings.

@item 
bpo-39435@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39435}: The first argument of @ref{f0c,,pickle.loads()} is now
positional-only.

@item 
bpo-39305@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39305}: Update @code{nntplib} to merge @code{nntplib.NNTP} and
@code{nntplib._NNTPBase}. Patch by Donghee Na.

@item 
bpo-32494@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32494}: Update @ref{37,,dbm.gnu} to use gdbm_count if possible when
calling @ref{83f,,len()}. Patch by Donghee Na.

@item 
bpo-40453@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40453}: Add @code{isolated=True} keyword-only parameter to
@code{_xxsubinterpreters.create()}. An isolated subinterpreter cannot spawn
threads, spawn a child process or call @code{os.fork()}.

@item 
bpo-40286@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40286}: Remove @code{_random.Random.randbytes()}: the C implementation of
@code{randbytes()}. Implement the method in Python to ease subclassing:
@code{randbytes()} now directly reuses @code{getrandbits()}.

@item 
bpo-40394@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40394}: Added default arguments to
@ref{1d48,,difflib.SequenceMatcher.find_longest_match()}.

@item 
bpo-39995@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39995}: Fix a race condition in concurrent.futures._ThreadWakeup:
access to _ThreadWakeup is now protected with the shutdown lock.

@item 
bpo-30966@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30966}: @code{Process.shutdown(wait=True)} of @ref{24,,concurrent.futures}
now closes explicitly the result queue.

@item 
bpo-30966@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30966}: Add a new @ref{b11,,close()} method to
the @ref{b10,,SimpleQueue} class to explicitly close the
queue.

@item 
bpo-39966@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39966}: Revert bpo-25597@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25597}. @ref{108e,,unittest.mock.MagicMock} with wraps’
set uses default return values for magic methods.

@item 
bpo-39791@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39791}: Added @code{files()} function to importlib.resources with support
for subdirectories in package data, matching backport in
importlib_resources 1.5.

@item 
bpo-40375@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40375}: @ref{b03,,imaplib.IMAP4.unselect()} is added. Patch by Donghee Na.

@item 
bpo-40389@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40389}: @code{repr()} now returns @code{typing.Optional[T]} when called for
@code{typing.Union} of two types, one of which is @code{NoneType}.

@item 
bpo-40291@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40291}: Add support for CAN_J1939 sockets (available on Linux 5.4+)

@item 
bpo-40273@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40273}: @ref{697,,types.MappingProxyType} is now reversible.

@item 
bpo-39075@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39075}: The repr for @ref{4e5,,types.SimpleNamespace} is now insertion
ordered rather than alphabetical.

@item 
bpo-40192@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40192}: On AIX, @ref{b30,,thread_time()} is now implemented with
@code{thread_cputime()} which has nanosecond resolution, rather than
@code{clock_gettime(CLOCK_THREAD_CPUTIME_ID)} which has a resolution of 10
milliseconds. Patch by Batuhan Taskaya.

@item 
bpo-40025@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40025}: Raise TypeError when _generate_next_value_ is defined after
members. Patch by Ethan Onstott.

@item 
bpo-39058@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39058}: In the argparse module, the repr for Namespace() and other
argument holders now displayed in the order attributes were added.
Formerly, it displayed in alphabetical order even though argument order is
preserved the user visible parts of the module.

@item 
bpo-24416@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24416}: The @code{isocalendar()} methods of @ref{1fa,,datetime.date} and
@ref{4e2,,datetime.datetime} now return a @ref{85d,,named tuple} instead of a
@ref{610,,tuple}.
@end itemize

@node Documentation<45>,Tests<45>,Library<151>,Python 3 9 0 beta 1
@anchor{whatsnew/changelog id646}@anchor{1d49}
@subsubsection Documentation



@itemize -

@item 
bpo-34790@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34790}: Add version of removal for explicit passing of coros to
@code{asyncio.wait()}’s documentation

@item 
bpo-40561@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40561}: Provide docstrings for webbrowser open functions.

@item 
bpo-40499@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40499}: Mention that @ref{6a6,,asyncio.wait()} requires a non-empty set of
awaitables.

@item 
bpo-39705@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39705}: Tutorial example for sorted() in the Loop Techniques section is
given a better explanation. Also a new example is included to explain
sorted()’s basic behavior.

@item 
bpo-39435@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39435}: Fix an incorrect signature for @ref{f0c,,pickle.loads()} in the docs
@end itemize

@node Tests<45>,Build<52>,Documentation<45>,Python 3 9 0 beta 1
@anchor{whatsnew/changelog id647}@anchor{1d4a}
@subsubsection Tests



@itemize -

@item 
bpo-40055@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40055}: distutils.tests now saves/restores warnings filters to leave
them unchanged. Importing tests imports docutils which imports
pkg_resources which adds a warnings filter.

@item 
bpo-40436@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40436}: test_gdb and test.pythoninfo now check gdb command exit code.
@end itemize

@node Build<52>,Windows<45>,Tests<45>,Python 3 9 0 beta 1
@anchor{whatsnew/changelog id648}@anchor{1d4b}
@subsubsection Build



@itemize -

@item 
bpo-40653@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40653}: Move _dirnameW out of HAVE_SYMLINK to fix a potential compiling
issue.

@item 
bpo-40514@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40514}: Add @code{--with-experimental-isolated-subinterpreters} build
option to @code{configure}: better isolate subinterpreters, experimental
build mode.
@end itemize

@node Windows<45>,macOS<35>,Build<52>,Python 3 9 0 beta 1
@anchor{whatsnew/changelog id649}@anchor{1d4c}
@subsubsection Windows



@itemize -

@item 
bpo-40650@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40650}: Include winsock2.h in pytime.c for timeval.

@item 
bpo-40458@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40458}: Increase reserved stack space to prevent overflow crash on
Windows.

@item 
bpo-39148@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39148}: Add IPv6 support to @ref{b,,asyncio} datagram endpoints in
ProactorEventLoop. Change the raised exception for unknown address
families to ValueError as it’s not coming from Windows API.
@end itemize

@node macOS<35>,Tools/Demos<30>,Windows<45>,Python 3 9 0 beta 1
@anchor{whatsnew/changelog id650}@anchor{1d4d}
@subsubsection macOS



@itemize -

@item 
bpo-34956@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34956}: When building Python on macOS from source, @code{_tkinter} now
links with non-system Tcl and Tk frameworks if they are installed in
@code{/Library/Frameworks}, as had been the case on older releases of macOS.
If a macOS SDK is explicitly configured, by using
@code{--enable-universalsdk=} or @code{-isysroot}, only the SDK itself is
searched. The default behavior can still be overridden with
@code{--with-tcltk-includes} and @code{--with-tcltk-libs}.

@item 
bpo-35569@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35569}: Expose RFC 3542 IPv6 socket options.
@end itemize

@node Tools/Demos<30>,C API<47>,macOS<35>,Python 3 9 0 beta 1
@anchor{whatsnew/changelog id651}@anchor{1d4e}
@subsubsection Tools/Demos



@itemize -

@item 
bpo-40479@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40479}: Update multissltest helper to test with latest OpenSSL 1.0.2,
1.1.0, 1.1.1, and 3.0.0-alpha.

@item 
bpo-40431@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40431}: Fix a syntax typo in @code{turtledemo} that now raises a
@code{SyntaxError}.

@item 
bpo-40163@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40163}: Fix multissltest tool. OpenSSL has changed download URL for old
releases. The multissltest tool now tries to download from current and old
download URLs.
@end itemize

@node C API<47>,,Tools/Demos<30>,Python 3 9 0 beta 1
@anchor{whatsnew/changelog id652}@anchor{1d4f}
@subsubsection C API



@itemize -

@item 
bpo-39465@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39465}: Remove the @code{_PyUnicode_ClearStaticStrings()} function from
the C API.

@item 
bpo-38787@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38787}: Add PyCFunction_CheckExact() macro for exact type checks now
that we allow subtypes of PyCFunction, as well as PyCMethod_CheckExact()
and PyCMethod_Check() for the new PyCMethod subtype.

@item 
bpo-40545@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40545}: Declare @code{_PyErr_GetTopmostException()} with @code{PyAPI_FUNC()}
to properly export the function in the C API. The function remains private
(@code{_Py}) prefix.

@item 
bpo-40412@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40412}: Nullify inittab_copy during finalization, preventing future
interpreter initializations in an embedded situation from crashing. Patch
by Gregory Szorc.

@item 
bpo-40429@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40429}: The @ref{990,,PyThreadState_GetFrame()} function now returns a
strong reference to the frame.

@item 
bpo-40428@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40428}: Remove the following functions from the C API. Call
@ref{b84,,PyGC_Collect()} explicitly to free all free lists.


@itemize *

@item 
@code{PyAsyncGen_ClearFreeLists()}

@item 
@code{PyContext_ClearFreeList()}

@item 
@code{PyDict_ClearFreeList()}

@item 
@code{PyFloat_ClearFreeList()}

@item 
@code{PyFrame_ClearFreeList()}

@item 
@code{PyList_ClearFreeList()}

@item 
@code{PySet_ClearFreeList()}

@item 
@code{PyTuple_ClearFreeList()}
@end itemize

@item 
bpo-40421@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40421}: New @ref{988,,PyFrame_GetBack()} function: get the frame next
outer frame.

@item 
bpo-40421@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40421}: New @ref{98c,,PyFrame_GetCode()} function: return a borrowed
reference to the frame code.

@item 
bpo-40217@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40217}: Ensure that instances of types created with
@ref{79d,,PyType_FromSpecWithBases()} will visit its class object when
traversing references in the garbage collector (implemented as an
extension of the provided @ref{981,,tp_traverse}). Patch by
Pablo Galindo.

@item 
bpo-38787@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38787}: Module C state is now accessible from C-defined heap type
methods (
@geindex Python 향상 제안; PEP 573
PEP 573@footnote{https://peps.python.org/pep-0573/}). Patch by Marcel Plch and Petr Viktorin.
@end itemize

@node Python 3 9 0 alpha 6,Python 3 9 0 alpha 5,Python 3 9 0 beta 1,Changelog
@anchor{whatsnew/changelog python-3-9-0-alpha-6}@anchor{1d50}
@subsection Python 3.9.0 alpha 6


`Release date: 2020-04-27'

@menu
* Security: Security<39>. 
* Core and Builtins: Core and Builtins<149>. 
* Library: Library<152>. 
* Documentation: Documentation<46>. 
* Tests: Tests<46>. 
* Build: Build<53>. 
* Windows: Windows<46>. 
* macOS: macOS<36>. 
* IDLE: IDLE<27>. 
* Tools/Demos: Tools/Demos<31>. 
* C API: C API<48>. 

@end menu

@node Security<39>,Core and Builtins<149>,,Python 3 9 0 alpha 6
@anchor{whatsnew/changelog id653}@anchor{1d51}
@subsubsection Security



@itemize -

@item 
bpo-40121@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40121}: Fixes audit events raised on creating a new socket.

@item 
bpo-39073@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39073}: Disallow CR or LF in email.headerregistry.Address arguments to
guard against header injection attacks.

@item 
bpo-39503@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39503}: 
@geindex Common Vulnerabilities and Exposures; CVE 2020-8492
CVE 2020-8492@footnote{https://www.cve.org/CVERecord?id=CVE-2020-8492}: The
@ref{1c6d,,AbstractBasicAuthHandler} class of the
@ref{111,,urllib.request} module uses an inefficient regular expression which
can be exploited by an attacker to cause a denial of service. Fix the
regex to prevent the catastrophic backtracking. Vulnerability reported by
Ben Caller and Matt Schwager.
@end itemize

@node Core and Builtins<149>,Library<152>,Security<39>,Python 3 9 0 alpha 6
@anchor{whatsnew/changelog id654}@anchor{1d52}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-40313@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40313}: Improve the performance of bytes.hex().

@item 
bpo-40334@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40334}: Switch to a new parser, based on PEG.  For more details see PEP
617. To temporarily switch back to the old parser, use @code{-X oldparser} or
@code{PYTHONOLDPARSER=1}.  In Python 3.10 we will remove the old parser
completely, including the @code{parser} module (already deprecated) and
anything that depends on it.

@item 
bpo-40267@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40267}: Fix the tokenizer to display the correct error message, when
there is a @code{SyntaxError} on the last input character and no newline
follows. It used to be @code{unexpected EOF while parsing}, while it should
be @code{invalid syntax}.

@item 
bpo-39522@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39522}: Correctly unparse explicit @code{u} prefix for strings when
postponed evaluation for annotations activated. Patch by Batuhan Taskaya.

@item 
bpo-40246@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40246}: Report a specialized error message, @code{invalid string prefix},
when the tokenizer encounters a string with an invalid prefix.

@item 
bpo-40082@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40082}: Fix the signal handler: it now always uses the main
interpreter, rather than trying to get the current Python thread state.

@item 
bpo-37388@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37388}: str.encode() and str.decode() no longer check the encoding and
errors in development mode or in debug mode during Python finalization.
The codecs machinery can no longer work on very late calls to str.encode()
and str.decode().

@item 
bpo-40077@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40077}: Fix possible refleaks in @code{_json}, memo of PyScannerObject
should be traversed.

@item 
bpo-37207@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37207}: Speed up calls to @code{dict()} by using the 
@geindex Python 향상 제안; PEP 590
PEP 590@footnote{https://peps.python.org/pep-0590/}
@code{vectorcall} calling convention.

@item 
bpo-40141@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40141}: Add column and line information to @code{ast.keyword} nodes. Patch
by Pablo Galindo.

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port @ref{c1,,resource} to multiphase initialization
(
@geindex Python 향상 제안; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}).

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port @ref{92,,math} to multiphase initialization (
@geindex Python 향상 제안; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}).

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port _uuid module to multiphase initialization (
@geindex Python 향상 제안; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}).

@item 
bpo-40077@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40077}: Convert json module to use @ref{79c,,PyType_FromSpec()}.

@item 
bpo-40067@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40067}: Improve the error message for multiple star expressions in an
assignment. Patch by Furkan Onder

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port _functools module to multiphase initialization (PEP
489). Patch by Paulo Henrique Silva.

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port operator module to multiphase initialization (PEP 489).
Patch by Paulo Henrique Silva.

@item 
bpo-20526@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20526}: Fix @ref{1992,,PyThreadState_Clear()}. @code{PyThreadState.frame} is
a borrowed reference, not a strong reference: @code{PyThreadState_Clear()}
must not call @code{Py_CLEAR(tstate->frame)}.

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port time module to multiphase initialization (
@geindex Python 향상 제안; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}).
Patch by Paulo Henrique Silva.

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port _weakref extension module to multiphase initialization
(
@geindex Python 향상 제안; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}).

@item 
bpo-40020@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40020}: Fix a leak and subsequent crash in parsetok.c caused by realloc
misuse on a rare codepath.

@item 
bpo-39939@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39939}: Added str.removeprefix and str.removesuffix methods and
corresponding bytes, bytearray, and collections.UserString methods to
remove affixes from a string if present. See 
@geindex Python 향상 제안; PEP 616
PEP 616@footnote{https://peps.python.org/pep-0616/} for a full
description. Patch by Dennis Sweeney.

@item 
bpo-39481@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39481}: Implement PEP 585. This supports list[int], tuple[str, …]
etc.

@item 
bpo-32894@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32894}: Support unparsing of infinity numbers in postponed annotations.
Patch by Batuhan Taşkaya.

@item 
bpo-37207@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37207}: Speed up calls to @code{list()} by using the 
@geindex Python 향상 제안; PEP 590
PEP 590@footnote{https://peps.python.org/pep-0590/}
@code{vectorcall} calling convention. Patch by Mark Shannon.
@end itemize

@node Library<152>,Documentation<46>,Core and Builtins<149>,Python 3 9 0 alpha 6
@anchor{whatsnew/changelog id655}@anchor{1d53}
@subsubsection Library



@itemize -

@item 
bpo-40398@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40398}: @ref{2ac,,typing.get_args()} now always returns an empty tuple for
special generic aliases.

@item 
bpo-40396@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40396}: Functions @ref{2ab,,typing.get_origin()}, @ref{2ac,,typing.get_args()}
and @ref{8bf,,typing.get_type_hints()} support now generic aliases like
@code{list[int]}.

@item 
bpo-38061@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38061}: Optimize the @ref{dc,,subprocess} module on FreeBSD using
@code{closefrom()}. A single @code{close(fd)} syscall is cheap, but when
@code{sysconf(_SC_OPEN_MAX)} is high, the loop calling @code{close(fd)} on each
file descriptor can take several milliseconds.

The workaround on FreeBSD to improve performance was to load and mount the
fdescfs kernel module, but this is not enabled by default.

Initial patch by Ed Maste (emaste), Conrad Meyer (cem), Kyle Evans
(kevans) and Kubilay Kocak (koobs):
@indicateurl{https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=242274}

@item 
bpo-38061@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38061}: On FreeBSD, @code{os.closerange(fd_low, fd_high)} now calls
@code{closefrom(fd_low)} if `fd_high' is greater than or equal to
@code{sysconf(_SC_OPEN_MAX)}.

Initial patch by Ed Maste (emaste), Conrad Meyer (cem), Kyle Evans
(kevans) and Kubilay Kocak (koobs):
@indicateurl{https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=242274}

@item 
bpo-40360@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40360}: The @code{lib2to3} module is pending deprecation due to
@geindex Python 향상 제안; PEP 617
PEP 617@footnote{https://peps.python.org/pep-0617/}.

@item 
bpo-40138@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40138}: Fix the Windows implementation of @ref{f99,,os.waitpid()} for exit
code larger than @code{INT_MAX >> 8}. The exit status is now interpreted as
an unsigned number.

@item 
bpo-39942@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39942}: Set “__main__” as the default module name when “__name__” is
missing in @ref{487,,typing.TypeVar}. Patch by Weipeng Hong.

@item 
bpo-40275@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40275}: The @ref{8b,,logging} package is now imported lazily in
@ref{10c,,unittest} only when the @ref{a59,,assertLogs()}
assertion is used.

@item 
bpo-40275@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40275}: The @ref{b,,asyncio} package is now imported lazily in
@ref{10c,,unittest} only when the @ref{361,,IsolatedAsyncioTestCase}
class is used.

@item 
bpo-40330@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40330}: In @code{ShareableList.__setitem__()}, check the size of a new
string item after encoding it to utf-8, not before.

@item 
bpo-40148@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40148}: Added @code{pathlib.Path.with_stem()} to create a new Path with
the stem replaced.

@item 
bpo-40325@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40325}: Deprecated support for set objects in random.sample().

@item 
bpo-40257@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40257}: Improved help for the @ref{10a,,typing} module. Docstrings are now
shown for all special forms and special generic aliases (like @code{Union}
and @code{List}). Using @code{help()} with generic alias like @code{List[int]} will
show the help for the correspondent concrete type (@code{list} in this case).

@item 
bpo-40257@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40257}: @ref{bec,,inspect.getdoc()} no longer returns docstring inherited
from the type of the object or from parent class if it is a class if it is
not defined in the object itself. In @ref{ba,,pydoc} the documentation string
is now shown not only for class, function, method etc, but for any object
that has its own @code{__doc__} attribute.

@item 
bpo-40287@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40287}: Fixed @code{SpooledTemporaryFile.seek()} to return the position.

@item 
bpo-40290@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40290}: Added zscore() to statistics.NormalDist().

@item 
bpo-40282@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40282}: Allow @code{random.getrandbits(0)} to succeed and to return 0.

@item 
bpo-40286@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40286}: Add @ref{1829,,random.randbytes()} function and
@ref{b23,,random.Random.randbytes()} method to generate random bytes.

@item 
bpo-40277@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40277}: @ref{4e0,,collections.namedtuple()} now provides a human-readable
repr for its field accessors.

@item 
bpo-40270@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40270}: The included copy of sqlite3 on Windows is now compiled with
the json extension. This allows the use of functions such as
@code{json_object}.

@item 
bpo-29255@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29255}: Wait in @code{KqueueSelector.select} when no fds are registered

@item 
bpo-40260@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40260}: Ensure @ref{95,,modulefinder} uses @ref{175c,,io.open_code()} and
respects coding comments.

@item 
bpo-40234@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40234}: Allow again to spawn daemon threads in subinterpreters (revert
change which denied them).

@item 
bpo-39207@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39207}: Workers in @ref{1d6,,ProcessPoolExecutor} are
now spawned on demand, only when there are no available idle workers to
reuse. This optimizes startup overhead and reduces the amount of lost CPU
time to idle workers. Patch by Kyle Stanley.

@item 
bpo-40091@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40091}: Fix a hang at fork in the logging module: the new private
_at_fork_reinit() method is now used to reinitialize locks at fork in the
child process.

@item 
bpo-40149@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40149}: Implement traverse and clear slots in _abc._abc_data type.

@item 
bpo-40208@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40208}: Remove deprecated @code{symtable.SymbolTable.has_exec()}.

@item 
bpo-40196@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40196}: Fix a bug in the @ref{de,,symtable} module that was causing
incorrectly report global variables as local. Patch by Pablo Galindo.

@item 
bpo-40190@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40190}: Add support for @code{_SC_AIX_REALMEM} to @code{posix.sysconf()}.

@item 
bpo-40182@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40182}: Removed the @code{_field_types} attribute of the
@ref{331,,typing.NamedTuple} class.

@item 
bpo-36517@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36517}: Multiple inheritance with @ref{331,,typing.NamedTuple} now raises
an error instead of silently ignoring other types.

@item 
bpo-40126@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40126}: Fixed reverting multiple patches in unittest.mock. Patcher’s
@code{__exit__()} is now never called if its @code{__enter__()} is failed.
Returning true from @code{__exit__()} silences now the exception.

@item 
bpo-40094@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40094}: CGIHTTPRequestHandler of http.server now logs the CGI script
exit code, rather than the CGI script exit status of os.waitpid(). For
example, if the script is killed by signal 11, it now logs: “CGI script
exit code -11.”

@item 
bpo-40108@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40108}: Improve the error message when triying to import a module using
@ref{c3,,runpy} and incorrectly using the “.py” extension at the end of the
module name. Patch by Pablo Galindo.

@item 
bpo-40094@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40094}: Add @ref{b17,,os.waitstatus_to_exitcode()} function: convert a wait
status to an exit code.

@item 
bpo-40089@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40089}: Fix threading._after_fork(): if fork was not called by a thread
spawned by threading.Thread, threading._after_fork() now creates a
_MainThread instance for _main_thread, instead of a _DummyThread instance.

@item 
bpo-40089@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40089}: Add a private @code{_at_fork_reinit()} method to
@code{_thread.Lock}, @code{_thread.RLock}, @ref{32e,,threading.RLock}
and @ref{135a,,threading.Condition} classes: reinitialize the lock at fork in
the child process, reset the lock to the unlocked state. Rename also the
private @code{_reset_internal_locks()} method of @ref{135d,,threading.Event} to
@code{_at_fork_reinit()}.

@item 
bpo-25780@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25780}: Expose @ref{b2b,,CAN_RAW_JOIN_FILTERS} in the
@ref{d1,,socket} module.

@item 
bpo-39503@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39503}: @ref{1c6d,,AbstractBasicAuthHandler} of
@ref{111,,urllib.request} now parses all WWW-Authenticate HTTP headers and
accepts multiple challenges per header: use the realm of the first Basic
challenge.

@item 
bpo-39812@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39812}: Removed daemon threads from @ref{24,,concurrent.futures} by adding
an internal @code{threading._register_atexit()}, which calls registered
functions prior to joining all non-daemon threads. This allows for
compatibility with subinterpreters, which don’t support daemon threads.

@item 
bpo-40050@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40050}: Fix @code{importlib._bootstrap_external}: avoid creating a new
@code{winreg} builtin module if it’s already available in
@ref{17ea,,sys.modules}, and remove redundant imports.

@item 
bpo-40014@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40014}: Fix @code{os.getgrouplist()}: if @code{getgrouplist()} function fails
because the group list is too small, retry with a larger group list. On
failure, the glibc implementation of @code{getgrouplist()} sets @code{ngroups}
to the total number of groups. For other implementations, double the group
list size.

@item 
bpo-40017@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40017}: Add @ref{1d54,,time.CLOCK_TAI} constant if the operating system
support it.

@item 
bpo-40016@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40016}: In re docstring, clarify the relationship between inline and
argument compile flags.

@item 
bpo-39953@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39953}: Update internal table of OpenSSL error codes in the @code{ssl}
module.

@item 
bpo-36144@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36144}: Added 
@geindex Python 향상 제안; PEP 584
PEP 584@footnote{https://peps.python.org/pep-0584/} operators to
@ref{192b,,weakref.WeakValueDictionary}.

@item 
bpo-36144@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36144}: Added 
@geindex Python 향상 제안; PEP 584
PEP 584@footnote{https://peps.python.org/pep-0584/} operators to
@ref{192a,,weakref.WeakKeyDictionary}.

@item 
bpo-38891@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38891}: Fix linear runtime behaviour of the @code{__getitem__} and
@code{__setitem__} methods in
@ref{1d55,,multiprocessing.shared_memory.ShareableList}. This avoids
quadratic performance when iterating a @code{ShareableList}. Patch by Thomas
Krennwallner.

@item 
bpo-39682@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39682}: Remove undocumented support for `closing' a @code{pathlib.Path}
object via its context manager. The context manager magic methods remain,
but they are now a no-op, making @code{Path} objects immutable.

@item 
bpo-36144@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36144}: Added 
@geindex Python 향상 제안; PEP 584
PEP 584@footnote{https://peps.python.org/pep-0584/} operators (@code{|} and @code{|=}) to
@ref{e15,,collections.ChainMap}.

@item 
bpo-39011@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39011}: Normalization of line endings in ElementTree attributes was
removed, as line endings which were replaced by entity numbers should be
preserved in original form.

@item 
bpo-38410@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38410}: Properly handle @ref{191c,,sys.audit()} failures in
@ref{199e,,sys.set_asyncgen_hooks()}.

@item 
bpo-36541@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36541}: lib2to3 now recognizes named assignment expressions (the walrus
operator, @code{:=})

@item 
bpo-35967@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35967}: In platform, delay the invocation of ‘uname -p’ until the
processor attribute is requested.

@item 
bpo-35113@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35113}: @ref{17c9,,inspect.getsource()} now returns correct source code for
inner class with same name as module level class. Decorators are also
returned as part of source of the class. Patch by Karthikeyan
Singaravelan.

@item 
bpo-33262@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33262}: Deprecate passing None as an argument for @ref{75d,,shlex.split()}’s
@code{s} parameter.  Patch by Zackery Spytz.

@item 
bpo-31758@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31758}: Prevent crashes when using an uninitialized
@code{_elementtree.XMLParser} object. Patch by Oren Milman.
@end itemize

@node Documentation<46>,Tests<46>,Library<152>,Python 3 9 0 alpha 6
@anchor{whatsnew/changelog id656}@anchor{1d56}
@subsubsection Documentation



@itemize -

@item 
bpo-27635@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27635}: The pickle documentation incorrectly claimed that @code{__new__}
isn’t called by default when unpickling.

@item 
bpo-39879@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39879}: Updated @ref{1d57,,데이터 모델} docs to include @ref{183,,dict()} insertion
order preservation. Patch by Furkan Onder and Samy Lahfa.

@item 
bpo-38387@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38387}: Document @ref{1d58,,PyDoc_STRVAR} macro in the C-API reference.

@item 
bpo-13743@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13743}: Some methods within xml.dom.minidom.Element class are now
better documented.
@end itemize

@node Tests<46>,Build<53>,Documentation<46>,Python 3 9 0 alpha 6
@anchor{whatsnew/changelog id657}@anchor{1d59}
@subsubsection Tests



@itemize -

@item 
bpo-31904@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31904}: Set expected default encoding in test_c_locale_coercion.py for
VxWorks RTOS.

@item 
bpo-40162@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40162}: Update Travis CI configuration to OpenSSL 1.1.1f.

@item 
bpo-40146@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40146}: Update OpenSSL to 1.1.1f in Azure Pipelines.

@item 
bpo-40094@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40094}: Add @ref{1d5a,,test.support.wait_process()} function.

@item 
bpo-40003@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40003}: @code{test.bisect_cmd} now copies Python command line options like
@code{-O} or @code{-W}. Moreover, emit a warning if @code{test.bisect_cmd} is used
with @code{-w}/@code{--verbose2} option.

@item 
bpo-39380@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39380}: Add the encoding in @ref{af6,,ftplib.FTP} and
@ref{af7,,ftplib.FTP_TLS} to the constructor as keyword-only and change the
default from @code{latin-1} to @code{utf-8} to follow 
@geindex RFC; RFC 2640
RFC 2640@footnote{https://datatracker.ietf.org/doc/html/rfc2640.html}.

@item 
bpo-39793@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39793}: Use the same domain when testing @code{make_msgid}. Patch by
Batuhan Taskaya.

@item 
bpo-1812@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1812}: Fix newline handling in doctest.testfile when loading from a
package whose loader has a get_data method. Patch by Peter Donis.
@end itemize

@node Build<53>,Windows<46>,Tests<46>,Python 3 9 0 alpha 6
@anchor{whatsnew/changelog id658}@anchor{1d5b}
@subsubsection Build



@itemize -

@item 
bpo-38360@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38360}: Support single-argument form of macOS -isysroot flag.

@item 
bpo-40158@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40158}: Fix CPython MSBuild Properties in NuGet Package
(build/native/python.props)

@item 
bpo-38527@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38527}: Fix configure check on Solaris for “float word ordering”:
sometimes, the correct “grep” command was not being used. Patch by Arnon
Yaari.
@end itemize

@node Windows<46>,macOS<36>,Build<53>,Python 3 9 0 alpha 6
@anchor{whatsnew/changelog id659}@anchor{1d5c}
@subsubsection Windows



@itemize -

@item 
bpo-40164@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40164}: Updates Windows to OpenSSL 1.1.1f

@item 
bpo-8901@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8901}: Ignore the Windows registry when the @code{-E} option is used.
@end itemize

@node macOS<36>,IDLE<27>,Windows<46>,Python 3 9 0 alpha 6
@anchor{whatsnew/changelog id660}@anchor{1d5d}
@subsubsection macOS



@itemize -

@item 
bpo-38329@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38329}: python.org macOS installers now update the Current version
symlink of /Library/Frameworks/Python.framework/Versions for 3.9 installs.
Previously, Current was only updated for Python 2.x installs. This should
make it easier to embed Python 3 into other macOS applications.

@item 
bpo-40164@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40164}: Update macOS installer builds to use OpenSSL 1.1.1g.
@end itemize

@node IDLE<27>,Tools/Demos<31>,macOS<36>,Python 3 9 0 alpha 6
@anchor{whatsnew/changelog id661}@anchor{1d5e}
@subsubsection IDLE



@itemize -

@item 
bpo-38439@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38439}: Add a 256×256 pixel IDLE icon to support more modern
environments. Created by Andrew Clover. Delete the unused macOS idle.icns
icon file.

@item 
bpo-38689@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38689}: IDLE will no longer freeze when inspect.signature fails when
fetching a calltip.
@end itemize

@node Tools/Demos<31>,C API<48>,IDLE<27>,Python 3 9 0 alpha 6
@anchor{whatsnew/changelog id662}@anchor{1d5f}
@subsubsection Tools/Demos



@itemize -

@item 
bpo-40385@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40385}: Removed the checkpyc.py tool. Please see compileall without
force mode as a potential alternative.

@item 
bpo-40179@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40179}: Fixed translation of @code{#elif} in Argument Clinic.

@item 
bpo-40094@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40094}: Fix @code{which.py} script exit code: it now uses
@ref{b17,,os.waitstatus_to_exitcode()} to convert @ref{1662,,os.system()} exit status
into an exit code.
@end itemize

@node C API<48>,,Tools/Demos<31>,Python 3 9 0 alpha 6
@anchor{whatsnew/changelog id663}@anchor{1d60}
@subsubsection C API



@itemize -

@item 
bpo-40241@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40241}: Move the @code{PyGC_Head} structure to the internal C API.

@item 
bpo-40170@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40170}: Convert @ref{b7a,,PyObject_IS_GC()} macro to a function to hide
implementation details.

@item 
bpo-40241@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40241}: Add the functions @ref{b6d,,PyObject_GC_IsTracked()} and
@ref{b6e,,PyObject_GC_IsFinalized()} to the public API to allow to query if
Python objects are being currently tracked or have been already finalized
by the garbage collector respectively. Patch by Pablo Galindo.

@item 
bpo-40170@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40170}: The @code{PyObject_NEW()} macro becomes an alias to the
@ref{b7b,,PyObject_New()} macro, and the @code{PyObject_NEW_VAR()} macro
becomes an alias to the @ref{b7c,,PyObject_NewVar()} macro, to hide
implementation details. They no longer access directly the
@ref{b7d,,PyTypeObject.tp_basicsize} member.

@item 
bpo-40170@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40170}: @ref{1d39,,PyType_HasFeature()} now always calls
@ref{1d3a,,PyType_GetFlags()} to hide implementation details. Previously, it
accessed directly the @ref{1c6f,,PyTypeObject.tp_flags} member when the
limited C API was not used.

@item 
bpo-40170@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40170}: Convert the @code{PyObject_GET_WEAKREFS_LISTPTR()} macro to a
function to hide implementation details: the macro accessed directly to
the @ref{b7e,,PyTypeObject.tp_weaklistoffset} member.

@item 
bpo-40170@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40170}: Convert @ref{637,,PyObject_CheckBuffer()} macro to a function to
hide implementation details: the macro accessed directly the
@ref{b7f,,PyTypeObject.tp_as_buffer} member.

@item 
bpo-40170@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40170}: Always declare @ref{b80,,PyIndex_Check()} as an opaque function to
hide implementation details: remove @code{PyIndex_Check()} macro. The macro
accessed directly the @ref{b81,,PyTypeObject.tp_as_number} member.

@item 
bpo-39947@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39947}: Add @ref{b6a,,PyThreadState_GetID()} function: get the unique
identifier of a Python thread state.
@end itemize

@node Python 3 9 0 alpha 5,Python 3 9 0 alpha 4,Python 3 9 0 alpha 6,Changelog
@anchor{whatsnew/changelog python-3-9-0-alpha-5}@anchor{1d61}
@subsection Python 3.9.0 alpha 5


`Release date: 2020-03-23'

@menu
* Security: Security<40>. 
* Core and Builtins: Core and Builtins<150>. 
* Library: Library<153>. 
* Documentation: Documentation<47>. 
* Tests: Tests<47>. 
* Build: Build<54>. 
* Windows: Windows<47>. 
* macOS: macOS<37>. 
* IDLE: IDLE<28>. 
* Tools/Demos: Tools/Demos<32>. 
* C API: C API<49>. 

@end menu

@node Security<40>,Core and Builtins<150>,,Python 3 9 0 alpha 5
@anchor{whatsnew/changelog id664}@anchor{1d62}
@subsubsection Security



@itemize -

@item 
bpo-38576@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38576}: Disallow control characters in hostnames in http.client,
addressing 
@geindex Common Vulnerabilities and Exposures; CVE 2019-18348
CVE 2019-18348@footnote{https://www.cve.org/CVERecord?id=CVE-2019-18348}. Such potentially malicious header injection
URLs now cause a InvalidURL to be raised.
@end itemize

@node Core and Builtins<150>,Library<153>,Security<40>,Python 3 9 0 alpha 5
@anchor{whatsnew/changelog id665}@anchor{1d63}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-40010@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40010}: Optimize pending calls in multithreaded applications. If a
thread different than the main thread schedules a pending call
(@ref{b77,,Py_AddPendingCall()}), the bytecode evaluation loop is no longer
interrupted at each bytecode instruction to check for pending calls which
cannot be executed. Only the main thread can execute pending calls.

Previously, the bytecode evaluation loop was interrupted at each
instruction until the main thread executes pending calls.

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port _weakref extension module to multiphase initialization
(
@geindex Python 향상 제안; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}).

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port _collections module to multiphase initialization
(
@geindex Python 향상 제안; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}).

@item 
bpo-40010@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40010}: Optimize signal handling in multithreaded applications. If a
thread different than the main thread gets a signal, the bytecode
evaluation loop is no longer interrupted at each bytecode instruction to
check for pending signals which cannot be handled. Only the main thread of
the main interpreter can handle signals.

Previously, the bytecode evaluation loop was interrupted at each
instruction until the main thread handles signals.

@item 
bpo-39984@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39984}: If @ref{b77,,Py_AddPendingCall()} is called in a subinterpreter,
the function is now scheduled to be called from the subinterpreter, rather
than being called from the main interpreter. Each subinterpreter now has
its own list of scheduled calls.

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port _heapq module to multiphase initialization.

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port itertools module to multiphase initialization
(
@geindex Python 향상 제안; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}).

@item 
bpo-37207@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37207}: Speed up calls to @code{frozenset()} by using the 
@geindex Python 향상 제안; PEP 590
PEP 590@footnote{https://peps.python.org/pep-0590/}
@code{vectorcall} calling convention. Patch by Donghee Na.

@item 
bpo-39984@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39984}: subinterpreters: Move
@code{_PyRuntimeState.ceval.tracing_possible} to
@code{PyInterpreterState.ceval.tracing_possible}: each interpreter now has
its own variable.

@item 
bpo-37207@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37207}: Speed up calls to @code{set()} by using the 
@geindex Python 향상 제안; PEP 590
PEP 590@footnote{https://peps.python.org/pep-0590/}
@code{vectorcall} calling convention. Patch by Donghee Na.

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port _statistics module to multiphase initialization
(
@geindex Python 향상 제안; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}).

@item 
bpo-39968@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39968}: Use inline function to replace extension modules’
get_module_state macros.

@item 
bpo-39965@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39965}: Correctly raise @code{SyntaxError} if `await' is used inside
non-async functions and @code{PyCF_ALLOW_TOP_LEVEL_AWAIT} is set (like in the
asyncio REPL). Patch by Pablo Galindo.

@item 
bpo-39562@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39562}: Allow executing asynchronous comprehensions on the top level
when the @code{PyCF_ALLOW_TOP_LEVEL_AWAIT} flag is given. Patch by Batuhan
Taskaya.

@item 
bpo-37207@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37207}: Speed up calls to @code{tuple()} by using the 
@geindex Python 향상 제안; PEP 590
PEP 590@footnote{https://peps.python.org/pep-0590/}
@code{vectorcall} calling convention. Patch by Donghee Na.

@item 
bpo-38373@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38373}: Changed list overallocation strategy. It no longer
overallocates if the new size is closer to overallocated size than to the
old size and adds padding.

@item 
bpo-39926@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39926}: Update Unicode database to Unicode version 13.0.0.

@item 
bpo-19466@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19466}: Clear the frames of daemon threads earlier during the Python
shutdown to call objects destructors. So “unclosed file” resource warnings
are now emitted for daemon threads in a more reliable way.

@item 
bpo-38894@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38894}: Fix a bug that was causing incomplete results when calling
@code{pathlib.Path.glob} in the presence of symlinks that point to files
where the user does not have read access. Patch by Pablo Galindo and Matt
Wozniski.

@item 
bpo-39877@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39877}: Fix @ref{646,,PyEval_RestoreThread()} random crash at exit with
daemon threads. It now accesses the @code{_PyRuntime} variable directly
instead of using @code{tstate->interp->runtime}, since @code{tstate} can be a
dangling pointer after @ref{45f,,Py_Finalize()} has been called. Moreover,
the daemon thread now exits before trying to take the GIL.

@item 
bpo-39871@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39871}: Fix a possible @ref{794,,SystemError} in
@code{math.@{atan2,copysign,remainder@}()} when the first argument cannot be
converted to a @ref{196,,float}. Patch by Zackery Spytz.

@item 
bpo-39776@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39776}: Fix race condition where threads created by PyGILState_Ensure()
could get a duplicate id.

This affects consumers of tstate->id like the contextvar caching
machinery, which could return invalid cached objects under heavy thread
load (observed in embedded scenarios).

@item 
bpo-39778@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39778}: Fixed a crash due to incorrect handling of weak references in
@code{collections.OrderedDict} classes. Patch by Pablo Galindo.

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port audioop extension module to multiphase initialization
(
@geindex Python 향상 제안; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}).

@item 
bpo-39702@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39702}: Relax @ref{939,,decorator} grammar restrictions to allow any valid
expression (
@geindex Python 향상 제안; PEP 614
PEP 614@footnote{https://peps.python.org/pep-0614/}).

@item 
bpo-38091@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38091}: Tweak import deadlock detection code to not deadlock itself.

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port _locale extension module to multiphase initialization
(
@geindex Python 향상 제안; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}).

@item 
bpo-39087@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39087}: Optimize @ref{424,,PyUnicode_AsUTF8()} and
@ref{a99,,PyUnicode_AsUTF8AndSize()} slightly when they need to create
internal UTF-8 cache.

@item 
bpo-39520@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39520}: Fix unparsing of ext slices with no items (@code{foo[:,]}). Patch
by Batuhan Taskaya.

@item 
bpo-39220@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39220}: Do not optimize annotations if ‘from __future__ import
annotations’ is used. Patch by Pablo Galindo.

@item 
bpo-35712@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35712}: Using @ref{1a2,,NotImplemented} in a boolean context has been
deprecated. Patch contributed by Josh Rosenberg.

@item 
bpo-22490@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22490}: Don’t leak environment variable @code{__PYVENV_LAUNCHER__} into
the interpreter session on macOS.
@end itemize

@node Library<153>,Documentation<47>,Core and Builtins<150>,Python 3 9 0 alpha 5
@anchor{whatsnew/changelog id666}@anchor{1d64}
@subsubsection Library



@itemize -

@item 
bpo-39830@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39830}: Add @ref{8d7,,zipfile.Path} to @code{__all__} in the @ref{137,,zipfile}
module.

@item 
bpo-40000@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40000}: Improved error messages for validation of @code{ast.Constant}
nodes. Patch by Batuhan Taskaya.

@item 
bpo-39999@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39999}: @code{__module__} of the AST node classes is now set to “ast”
instead of “_ast”. Added docstrings for dummy AST node classes and
deprecated attributes.

@item 
bpo-39991@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39991}: @ref{d9f,,uuid.getnode()} now skips IPv6 addresses with the same
string length than a MAC address (17 characters): only use MAC addresses.

@item 
bpo-39988@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39988}: Deprecated @code{ast.AugLoad} and @code{ast.AugStore} node classes
because they are no longer used.

@item 
bpo-39656@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39656}: Ensure @code{bin/python3.#} is always present in virtual
environments on POSIX platforms - by Anthony Sottile.

@item 
bpo-39969@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39969}: Deprecated @code{ast.Param} node class because it’s no longer
used. Patch by Batuhan Taskaya.

@item 
bpo-39360@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39360}: Ensure all workers exit when finalizing a
@code{multiprocessing.Pool} implicitly via the module finalization
handlers of multiprocessing. This fixes a deadlock situation that can be
experienced when the Pool is not properly finalized via the context
manager or a call to @code{multiprocessing.Pool.terminate}. Patch by Batuhan
Taskaya and Pablo Galindo.

@item 
bpo-35370@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35370}: sys.settrace(), sys.setprofile() and _lsprof.Profiler.enable()
now properly report @ref{611,,PySys_Audit()} error if “sys.setprofile” or
“sys.settrace” audit event is denied.

@item 
bpo-39936@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39936}: AIX: Fix _aix_support module when the subprocess is not
available, when building Python from scratch. It now uses new private
_bootsubprocess module, rather than having two implementations depending
if subprocess is available or not. So _aix_support.aix_platform() result
is now the same if subprocess is available or not.

@item 
bpo-36144@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36144}: @ref{7f2,,collections.OrderedDict} now implements @code{|} and
@code{|=} (
@geindex Python 향상 제안; PEP 584
PEP 584@footnote{https://peps.python.org/pep-0584/}).

@item 
bpo-39652@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39652}: The column name found in @code{sqlite3.Cursor.description} is now
truncated on the first ‘[’ only if the PARSE_COLNAMES option is set.

@item 
bpo-39915@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39915}: Ensure @ref{1d65,,unittest.mock.AsyncMock.await_args_list} has call
objects in the order of awaited arguments instead of using
@ref{1d66,,unittest.mock.Mock.call_args} which has the last value of the call.
Patch by Karthikeyan Singaravelan.

@item 
bpo-36144@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36144}: Updated @ref{259,,os.environ} and @ref{25a,,os.environb} to support
@geindex Python 향상 제안; PEP 584
PEP 584@footnote{https://peps.python.org/pep-0584/}’s merge (@code{|}) and update (@code{|=}) operators.

@item 
bpo-38662@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38662}: The @code{ensurepip} module now invokes @code{pip} via the @code{runpy}
module. Hence it is no longer tightly coupled with the internal API of the
bundled @code{pip} version, allowing easier updates to a newer @code{pip}
version both internally and for distributors.

@item 
bpo-38075@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38075}: Fix the @ref{1d67,,random.Random.seed()} method when a @ref{3c3,,bool}
is passed as the seed.

@item 
bpo-39916@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39916}: More reliable use of @code{os.scandir()} in @code{Path.glob()}. It no
longer emits a ResourceWarning when interrupted.

@item 
bpo-39850@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39850}: @ref{98,,multiprocessing} now supports abstract socket addresses
(if abstract sockets are supported in the running platform). When creating
arbitrary addresses (like when default-constructing
@ref{1a23,,multiprocessing.connection.Listener} objects) abstract sockets are
preferred to avoid the case when the temporary-file-generated address is
too large for an AF_UNIX socket address. Patch by Pablo Galindo.

@item 
bpo-36287@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36287}: @ref{ae1,,ast.dump()} no longer outputs optional fields and
attributes with default values. The default values for optional fields and
attributes of AST nodes are now set as class attributes (e.g.
@code{Constant.kind} is set to @code{None}).

@item 
bpo-39889@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39889}: Fixed @ref{ae2,,ast.unparse()} for extended slices containing a
single element (e.g. @code{a[i:j,]}). Remove redundant tuples when index with
a tuple (e.g. @code{a[i, j]}).

@item 
bpo-39828@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39828}: Fix @ref{87,,json.tool} to catch @ref{125b,,BrokenPipeError}. Patch by
Donghee Na.

@item 
bpo-13487@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13487}: Avoid a possible `“RuntimeError: dictionary changed size during
iteration”' from @ref{1b6b,,inspect.getmodule()} when it tried to loop through
@ref{17ea,,sys.modules}.

@item 
bpo-39674@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39674}: Revert “bpo-37330@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37330}: open() no longer accept ‘U’ in file mode”.
The “U” mode of open() is kept in Python 3.9 to ease transition from
Python 2.7, but will be removed in Python 3.10.

@item 
bpo-28577@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28577}: The hosts method on 32-bit prefix length IPv4Networks and
128-bit prefix IPv6Networks now returns a list containing the single
Address instead of an empty list.

@item 
bpo-39826@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39826}: Add getConnection method to logging HTTPHandler to enable
custom connections.

@item 
bpo-39763@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39763}: Reimplement @code{distutils.spawn.spawn} function with the
@ref{dc,,subprocess} module.

@item 
bpo-39794@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39794}: Add –without-decimal-contextvar build option.  This enables a
thread-local rather than a coroutine local context.

@item 
bpo-36144@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36144}: @ref{13c1,,collections.defaultdict} now implements @code{|}
(
@geindex Python 향상 제안; PEP 584
PEP 584@footnote{https://peps.python.org/pep-0584/}).

@item 
bpo-39517@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39517}: Fix runpy.run_path() when using pathlike objects

@item 
bpo-39775@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39775}: Change @code{inspect.Signature.parameters} back to
@code{collections.OrderedDict}. This was changed to @code{dict} in Python
3.9.0a4.

@item 
bpo-39678@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39678}: Refactor queue_manager in
@ref{1d6,,concurrent.futures.ProcessPoolExecutor} to make it easier to
maintain.

@item 
bpo-39764@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39764}: Fix AttributeError when calling get_stack on a PyAsyncGenObject
Task

@item 
bpo-39769@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39769}: The @ref{d1a,,compileall.compile_dir()} function’s `ddir' parameter
and the compileall command line flag @code{-d} no longer write the wrong
pathname to the generated pyc file for submodules beneath the root of the
directory tree being compiled.  This fixes a regression introduced with
Python 3.5.

@item 
bpo-36144@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36144}: @ref{697,,types.MappingProxyType} objects now support the merge
(@code{|}) operator from 
@geindex Python 향상 제안; PEP 584
PEP 584@footnote{https://peps.python.org/pep-0584/}.

@item 
bpo-38691@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38691}: The @ref{7b,,importlib} module now ignores the
@geindex PYTHONCASEOK
@geindex 환경 변수; PYTHONCASEOK
@ref{b57,,PYTHONCASEOK} environment variable when the @ref{b55,,-E} or
@ref{b56,,-I} command line options are being used.

@item 
bpo-39719@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39719}: Remove @code{tempfile.SpooledTemporaryFile.softspace()} as files
no longer have the @code{softspace} attribute in Python 3. Patch by Shantanu.

@item 
bpo-39667@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39667}: Improve pathlib.Path compatibility on zipfile.Path and correct
performance degradation as found in zipp 3.0.

@item 
bpo-39638@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39638}: Keep ASDL signatures in the docstrings for @code{AST} nodes. Patch
by Batuhan Taskaya

@item 
bpo-39639@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39639}: Deprecated @code{ast.Suite} node class because it’s no longer
used. Patch by Batuhan Taskaya.

@item 
bpo-39609@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39609}: Add thread_name_prefix to default asyncio executor

@item 
bpo-39548@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39548}: Fix handling of header in
@ref{1d68,,urllib.request.AbstractDigestAuthHandler} when the optional
@code{qop} parameter is not present.

@item 
bpo-39509@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39509}: HTTP status codes @code{103 EARLY_HINTS} and @code{425 TOO_EARLY} are
added to @ref{afc,,http.HTTPStatus}. Patch by Donghee Na.

@item 
bpo-39507@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39507}: Adding HTTP status 418 “I’m a Teapot” to HTTPStatus in http
library. Patch by Ross Rhodes.

@item 
bpo-39495@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39495}: Remove default value from `attrs' parameter of
@ref{1d69,,xml.etree.ElementTree.TreeBuilder.start()} for consistency between
Python and C implementations.

@item 
bpo-38971@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38971}: Open issue in the BPO indicated a desire to make the
implementation of codecs.open() at parity with io.open(), which implements
a try/except to assure file stream gets closed before an exception is
raised.

@item 
bpo-38641@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38641}: Added starred expressions support to @code{return} and @code{yield}
statements for @code{lib2to3}. Patch by Vlad Emelianov.

@item 
bpo-37534@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37534}: When using minidom module to generate XML documents the ability
to add Standalone Document Declaration is added. All the changes are made
to generate a document in compliance with Extensible Markup Language (XML)
1.0 (Fifth Edition) W3C Recommendation (available here:
@indicateurl{https://www.w3.org/TR/xml/#sec-prolog-dtd}).

@item 
bpo-34788@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34788}: Add support for scoped IPv6 addresses to @ref{84,,ipaddress}.
Patch by Oleksandr Pavliuk.

@item 
bpo-34822@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34822}: Simplified AST for subscription. Simple indices are now
represented by their value, extended slices are represented as tuples.
@ref{9,,ast} classes @code{Index} and @code{ExtSlice} are considered deprecated
and will be removed in future Python versions. In the meantime,
@code{Index(value)} now returns a @code{value} itself, @code{ExtSlice(slices)}
returns @code{Tuple(slices, Load())}.
@end itemize

@node Documentation<47>,Tests<47>,Library<153>,Python 3 9 0 alpha 5
@anchor{whatsnew/changelog id667}@anchor{1d6a}
@subsubsection Documentation



@itemize -

@item 
bpo-39868@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39868}: Updated the Language Reference for 
@geindex Python 향상 제안; PEP 572
PEP 572@footnote{https://peps.python.org/pep-0572/}.

@item 
bpo-13790@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13790}: Change ‘string’ to ‘specification’ in format doc.

@item 
bpo-17422@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17422}: The language reference no longer restricts default class
namespaces to dicts only.

@item 
bpo-39530@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39530}: Fix misleading documentation about mixed-type numeric
comparisons.

@item 
bpo-39718@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39718}: Update @ref{100,,token} documentation to reflect additions in
Python 3.8

@item 
bpo-39677@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39677}: Changed operand name of `MAKE_FUNCTION' from `argc' to
`flags' for module @ref{3c,,dis}
@end itemize

@node Tests<47>,Build<54>,Documentation<47>,Python 3 9 0 alpha 5
@anchor{whatsnew/changelog id668}@anchor{1d6b}
@subsubsection Tests



@itemize -

@item 
bpo-40019@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40019}: test_gdb now skips tests if it detects that gdb failed to read
debug information because the Python binary is optimized.

@item 
bpo-27807@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27807}: @code{test_site.test_startup_imports()} is now skipped if a path
of @ref{3e4,,sys.path} contains a @code{.pth} file.

@item 
bpo-26067@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26067}: Do not fail test_shutil test_chown test when uid or gid of user
cannot be resolved to a name.

@item 
bpo-39855@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39855}: test_subprocess.test_user() now skips the test on an user name
if the user name doesn’t exist. For example, skip the test if the user
“nobody” doesn’t exist on Linux.
@end itemize

@node Build<54>,Windows<47>,Tests<47>,Python 3 9 0 alpha 5
@anchor{whatsnew/changelog id669}@anchor{1d6c}
@subsubsection Build



@itemize -

@item 
bpo-39761@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39761}: Fix build with DTrace but without additional DFLAGS.

@item 
bpo-39763@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39763}: setup.py now uses a basic implementation of the
@ref{dc,,subprocess} module if the @code{subprocess} module is not available:
before required C extension modules are built.

@item 
bpo-1294959@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1294959}: Add @code{--with-platlibdir} option to the configure script:
name of the platform-specific library directory, stored in the new
@ref{b32,,sys.platlibdir} attribute. It is used to build the path of
platform-specific extension modules and the path of the standard library.
It is equal to @code{"lib"} on most platforms. On Fedora and SuSE, it is
equal to @code{"lib64"} on 64-bit platforms. Patch by Jan Matějek, Matěj
Cepl, Charalampos Stratakis and Victor Stinner.
@end itemize

@node Windows<47>,macOS<37>,Build<54>,Python 3 9 0 alpha 5
@anchor{whatsnew/changelog id670}@anchor{1d6d}
@subsubsection Windows



@itemize -

@item 
bpo-39930@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39930}: Ensures the required @code{vcruntime140.dll} is included in
install packages.

@item 
bpo-39847@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39847}: Avoid hang when computer is hibernated whilst waiting for a
mutex (for lock-related objects from @ref{f3,,threading}) around 49-day
uptime.

@item 
bpo-38597@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38597}: @code{distutils} will no longer statically link
@code{vcruntime140.dll} when a redistributable version is unavailable.
All future releases of CPython will include a copy of this DLL to ensure
distributed extensions can continue to load.

@item 
bpo-38380@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38380}: Update Windows builds to use SQLite 3.31.1

@item 
bpo-39789@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39789}: Update Windows release build machines to Visual Studio 2019
(MSVC 14.2).

@item 
bpo-34803@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34803}: Package for nuget.org now includes repository reference and
bundled icon image.
@end itemize

@node macOS<37>,IDLE<28>,Windows<47>,Python 3 9 0 alpha 5
@anchor{whatsnew/changelog id671}@anchor{1d6e}
@subsubsection macOS



@itemize -

@item 
bpo-38380@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38380}: Update macOS builds to use SQLite 3.31.1
@end itemize

@node IDLE<28>,Tools/Demos<32>,macOS<37>,Python 3 9 0 alpha 5
@anchor{whatsnew/changelog id672}@anchor{1d6f}
@subsubsection IDLE



@itemize -

@item 
bpo-27115@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27115}: For ‘Go to Line’, use a Query box subclass with IDLE standard
behavior and improved error checking.

@item 
bpo-39885@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39885}: Since clicking to get an IDLE context menu moves the cursor,
any text selection should be and now is cleared.

@item 
bpo-39852@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39852}: Edit “Go to line” now clears any selection, preventing
accidental deletion. It also updates Ln and Col on the status bar.

@item 
bpo-39781@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39781}: Selecting code context lines no longer causes a jump.
@end itemize

@node Tools/Demos<32>,C API<49>,IDLE<28>,Python 3 9 0 alpha 5
@anchor{whatsnew/changelog id673}@anchor{1d70}
@subsubsection Tools/Demos



@itemize -

@item 
bpo-36184@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36184}: Port python-gdb.py to FreeBSD. python-gdb.py now checks for
“take_gil” function name to check if a frame tries to acquire the GIL,
instead of checking for “pthread_cond_timedwait” which is specific to
Linux and can be a different condition than the GIL.

@item 
bpo-38080@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38080}: Added support to fix @code{getproxies} in the
@code{lib2to3.fixes.fix_urllib} module. Patch by José Roberto Meza
Cabrera.
@end itemize

@node C API<49>,,Tools/Demos<32>,Python 3 9 0 alpha 5
@anchor{whatsnew/changelog id674}@anchor{1d71}
@subsubsection C API



@itemize -

@item 
bpo-40024@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=40024}: Add @ref{b6c,,PyModule_AddType()} helper function: add a type to a
module. Patch by Donghee Na.

@item 
bpo-39946@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39946}: Remove @code{_PyRuntime.getframe} hook and remove
@code{_PyThreadState_GetFrame} macro which was an alias to
@code{_PyRuntime.getframe}. They were only exposed by the internal C API.
Remove also @code{PyThreadFrameGetter} type.

@item 
bpo-39947@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39947}: Add @ref{990,,PyThreadState_GetFrame()} function: get the current
frame of a Python thread state.

@item 
bpo-37207@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37207}: Add _PyArg_NoKwnames helper function. Patch by Donghee Na.

@item 
bpo-39947@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39947}: Add @ref{b69,,PyThreadState_GetInterpreter()}: get the interpreter
of a Python thread state.

@item 
bpo-39947@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39947}: Add @ref{64a,,PyInterpreterState_Get()} function to the limited C
API.

@item 
bpo-35370@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35370}: If @ref{611,,PySys_Audit()} fails in @ref{1702,,PyEval_SetProfile()}
or @ref{661,,PyEval_SetTrace()}, log the error as an unraisable exception.

@item 
bpo-39947@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39947}: Move the static inline function flavor of
Py_EnterRecursiveCall() and Py_LeaveRecursiveCall() to the internal C API:
they access PyThreadState attributes. The limited C API provides regular
functions which hide implementation details.

@item 
bpo-39947@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39947}: Py_TRASHCAN_BEGIN_CONDITION and Py_TRASHCAN_END macro no longer
access PyThreadState attributes, but call new private _PyTrash_begin() and
_PyTrash_end() functions which hide implementation details.

@item 
bpo-39884@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39884}: @ref{1d72,,PyDescr_NewMethod()} and @ref{1d73,,PyCFunction_NewEx()} now
include the method name in the SystemError “bad call flags” error message
to ease debug.

@item 
bpo-39877@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39877}: Deprecated @code{PyEval_InitThreads()} and
@code{PyEval_ThreadsInitialized()}. Calling
@code{PyEval_InitThreads()} now does nothing.

@item 
bpo-38249@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38249}: @ref{dad,,Py_UNREACHABLE} is now implemented with
@code{__builtin_unreachable()} and analogs in release mode.

@item 
bpo-38643@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38643}: @ref{1b71,,PyNumber_ToBase()} now raises a @ref{794,,SystemError}
instead of crashing when called with invalid base.

@item 
bpo-39882@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39882}: The @ref{b79,,Py_FatalError()} function is replaced with a macro
which logs automatically the name of the current function, unless the
@code{Py_LIMITED_API} macro is defined.

@item 
bpo-39824@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39824}: Extension modules: @ref{b72,,m_traverse},
@ref{b73,,m_clear} and @ref{b74,,m_free}
functions of @ref{b71,,PyModuleDef} are no longer called if the module
state was requested but is not allocated yet. This is the case immediately
after the module is created and before the module is executed
(@ref{b75,,Py_mod_exec} function). More precisely, these functions are not
called if @ref{1d74,,m_size} is greater than 0 and the module
state (as returned by @ref{b76,,PyModule_GetState()}) is @code{NULL}.

Extension modules without module state (@code{m_size <= 0}) are not affected.

@item 
bpo-38913@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38913}: Fixed segfault in @code{Py_BuildValue()} called with a format
containing “#” and undefined PY_SSIZE_T_CLEAN whwn an exception is set.

@item 
bpo-38500@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38500}: Add a private API to get and set the frame evaluation function:
add @ref{1d75,,_PyInterpreterState_GetEvalFrameFunc()} and
@ref{1d76,,_PyInterpreterState_SetEvalFrameFunc()} C functions. The
@ref{979,,_PyFrameEvalFunction} function type now takes a `tstate'
parameter.
@end itemize

@node Python 3 9 0 alpha 4,Python 3 9 0 alpha 3,Python 3 9 0 alpha 5,Changelog
@anchor{whatsnew/changelog python-3-9-0-alpha-4}@anchor{1d77}
@subsection Python 3.9.0 alpha 4


`Release date: 2020-02-25'

@menu
* Security: Security<41>. 
* Core and Builtins: Core and Builtins<151>. 
* Library: Library<154>. 
* Documentation: Documentation<48>. 
* Tests: Tests<48>. 
* Build: Build<55>. 
* Windows: Windows<48>. 
* IDLE: IDLE<29>. 
* C API: C API<50>. 

@end menu

@node Security<41>,Core and Builtins<151>,,Python 3 9 0 alpha 4
@anchor{whatsnew/changelog id675}@anchor{1d78}
@subsubsection Security



@itemize -

@item 
bpo-39184@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39184}: Add audit events to functions in @code{fcntl}, @code{msvcrt}, @code{os},
@code{resource}, @code{shutil}, @code{signal} and @code{syslog}.

@item 
bpo-39401@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39401}: Avoid unsafe DLL load at startup on Windows 7 and earlier.

@item 
bpo-39184@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39184}: Add audit events to command execution functions in os and pty
modules.
@end itemize

@node Core and Builtins<151>,Library<154>,Security<41>,Python 3 9 0 alpha 4
@anchor{whatsnew/changelog id676}@anchor{1d79}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-39382@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39382}: Fix a use-after-free in the single inheritance path of
@code{issubclass()}, when the @code{__bases__} of an object has a single
reference, and so does its first item. Patch by Yonatan Goldschmidt.

@item 
bpo-39573@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39573}: Update clinic tool to use @ref{1b9e,,Py_IS_TYPE()}. Patch by
Donghee Na.

@item 
bpo-39619@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39619}: Enable use of @ref{1d7a,,os.chroot()} on HP-UX systems.

@item 
bpo-39573@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39573}: Add @ref{1b9e,,Py_IS_TYPE()} static inline function to check
whether the object `o' type is `type'.

@item 
bpo-39606@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39606}: Fix regression caused by fix for bpo-39386@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39386}, that prevented
calling @code{aclose} on an async generator that had already been closed or
exhausted.

@item 
bpo-39579@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39579}: Change the ending column offset of @code{Attribute} nodes
constructed in @code{ast_for_dotted_name} to point at the end of the current
node and not at the end of the last @code{NAME} node.

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port _crypt extension module to multiphase initialization
(
@geindex Python 향상 제안; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}).

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port _contextvars extension module to multiphase
initialization (
@geindex Python 향상 제안; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}).

@item 
bpo-39510@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39510}: Fix segfault in @code{readinto()} method on closed BufferedReader.

@item 
bpo-39502@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39502}: Fix @ref{16fe,,time.localtime()} on 64-bit AIX  to support years
before 1902 and after 2038. Patch by M Felt.

@item 
bpo-39492@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39492}: Fix a reference cycle in the C Pickler that was preventing the
garbage collection of deleted, pickled objects.

@item 
bpo-39453@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39453}: Fixed a possible crash in @code{list.__contains__()} when a list
is changed during comparing items. Patch by Donghee Na.

@item 
bpo-39434@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39434}: @ref{b3e,,floor division} of float operation now has a better
performance. Also the message of @ref{b3f,,ZeroDivisionError} for this
operation is updated. Patch by Donghee Na.

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port _codecs extension module to multiphase initialization
(
@geindex Python 향상 제안; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}).

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port _bz2 extension module to multiphase initialization
(
@geindex Python 향상 제안; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}).

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port _abc extension module to multiphase initialization
(
@geindex Python 향상 제안; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}).

@item 
bpo-39320@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39320}: Replace two complex bytecodes for building dicts with two
simpler ones. The new bytecodes @code{DICT_MERGE} and @code{DICT_UPDATE} have
been added The old bytecodes @code{BUILD_MAP_UNPACK} and
@code{BUILD_MAP_UNPACK_WITH_CALL} have been removed.

@item 
bpo-39219@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39219}: Syntax errors raised in the tokenizer now always set correct
“text” and “offset” attributes.

@item 
bpo-36051@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36051}: Drop the GIL during large @code{bytes.join} operations. Patch by
Bruce Merry.

@item 
bpo-38960@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38960}: Fix DTrace build issues on FreeBSD. Patch by David Carlier.

@item 
bpo-37207@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37207}: Speed up calls to @code{range()} by about 30%, by using the PEP
590 @code{vectorcall} calling convention. Patch by Mark Shannon.

@item 
bpo-36144@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36144}: @ref{183,,dict} (and @ref{1d7b,,collections.UserDict}) objects now
support PEP 584’s merge (@code{|}) and update (@code{|=}) operators. Patch by
Brandt Bucher.

@item 
bpo-32856@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32856}: Optimized the idiom for assignment a temporary variable in
comprehensions. Now @code{for y in [expr]} in comprehensions is as fast as a
simple assignment @code{y = expr}.
@end itemize

@node Library<154>,Documentation<48>,Core and Builtins<151>,Python 3 9 0 alpha 4
@anchor{whatsnew/changelog id677}@anchor{1d7c}
@subsubsection Library



@itemize -

@item 
bpo-30566@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30566}: Fix @ref{173a,,IndexError} when trying to decode an invalid string
with punycode codec.

@item 
bpo-39649@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39649}: Remove obsolete check for @code{__args__} in
@code{bdb.Bdb.format_stack_entry}.

@item 
bpo-39648@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39648}: Expanded @ref{b0c,,math.gcd()} and @ref{b0d,,math.lcm()} to handle
multiple arguments.

@item 
bpo-39681@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39681}: Fix a regression where the C pickle module wouldn’t allow
unpickling from a file-like object that doesn’t expose a readinto()
method.

@item 
bpo-35950@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35950}: Raise @ref{1d7d,,io.UnsupportedOperation} in
@code{io.BufferedReader.truncate()} when it is called on a read-only
@ref{1413,,io.BufferedReader} instance.

@item 
bpo-39479@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39479}: Add @ref{b0d,,math.lcm()} function: least common multiple.

@item 
bpo-39674@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39674}: Revert “Do not expose abstract collection classes in the
collections module” change (bpo-25988@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25988}). Aliases to ABC like
collections.Mapping are kept in Python 3.9 to ease transition from Python
2.7, but will be removed in Python 3.10.

@item 
bpo-39104@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39104}: Fix hanging ProcessPoolExcutor on @code{shutdown(wait=False)} when
a task has failed pickling.

@item 
bpo-39627@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39627}: Fixed TypedDict totality check for inherited keys.

@item 
bpo-39474@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39474}: Fixed starting position of AST for expressions like @code{(a)(b)},
@code{(a)[b]} and @code{(a).b}.

@item 
bpo-21016@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21016}: The @ref{ba,,pydoc} and @ref{103,,trace} modules now use the
@ref{e1,,sysconfig} module to get the path to the Python standard library, to
support uncommon installation path like @code{/usr/lib64/python3.9/} on
Fedora. Patch by Jan Matějek.

@item 
bpo-39590@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39590}: Collections.deque now holds strong references during
deque.__contains__ and deque.count, fixing crashes.

@item 
bpo-39586@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39586}: The distutils @code{bdist_msi} command is deprecated in Python
3.9, use @code{bdist_wheel} (wheel packages) instead.

@item 
bpo-39595@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39595}: Improved performance of zipfile.Path for files with a large
number of entries. Also improved performance and fixed minor issue as
published with importlib_metadata 1.5@footnote{https://importlib-metadata.readthedocs.io/en/latest/history.html#v1-5-0}.

@item 
bpo-39350@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39350}: Fix regression in @ref{213,,fractions.Fraction} if the numerator
and/or the denominator is an @ref{19b,,int} subclass. The @ref{b0c,,math.gcd()}
function is now used to normalize the `numerator' and `denominator'.
@code{math.gcd()} always return a @code{int} type. Previously, the GCD
type depended on `numerator' and `denominator'.

@item 
bpo-39567@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39567}: Added audit for @ref{6cf,,os.walk()}, @ref{d51,,os.fwalk()},
@ref{537,,pathlib.Path.glob()} and @ref{538,,pathlib.Path.rglob()}.

@item 
bpo-39559@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39559}: Remove unused, undocumented argument @code{getters} from
@ref{d9f,,uuid.getnode()}

@item 
bpo-38149@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38149}: @ref{191c,,sys.audit()} is now called only once per call of
@ref{59f,,glob.glob()} and @ref{a08,,glob.iglob()}.

@item 
bpo-39546@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39546}: Fix a regression in @ref{1bd,,ArgumentParser} where
@code{allow_abbrev=False} was ignored for long options that used a prefix
character other than “-“.

@item 
bpo-39450@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39450}: Striped whitespace from docstring before returning it from
@code{unittest.case.shortDescription()}.

@item 
bpo-12915@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12915}: A new function @code{resolve_name} has been added to the
@code{pkgutil} module. This resolves a string of the form @code{'a.b.c.d'} or
@code{'a.b:c.d'} to an object. In the example, @code{a.b} is a package/module
and @code{c.d} is an object within that package/module reached via recursive
attribute access.

@item 
bpo-39353@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39353}: The @ref{93c,,binascii.crc_hqx()} function is no longer deprecated.

@item 
bpo-39493@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39493}: Mark @code{typing.IO.closed} as a property

@item 
bpo-39491@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39491}: Add @ref{b37,,typing.Annotated} and @code{include_extras} parameter
to @ref{8bf,,typing.get_type_hints()} as part of 
@geindex Python 향상 제안; PEP 593
PEP 593@footnote{https://peps.python.org/pep-0593/}. Patch by Till
Varoquaux, documentation by Till Varoquaux and Konstantin Kashin.

@item 
bpo-39485@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39485}: Fix a bug in @ref{1935,,unittest.mock.create_autospec()} that would
complain about the wrong number of arguments for custom descriptors
defined in an extension module returning functions.

@item 
bpo-38932@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38932}: Mock fully resets child objects on reset_mock(). Patch by
Vegard Stikbakke

@item 
bpo-39082@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39082}: Allow AsyncMock to correctly patch static/class methods

@item 
bpo-39432@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39432}: Implement PEP-489 algorithm for non-ascii “PyInit_…” symbol
names in distutils to make it export the correct init symbol also on
Windows.

@item 
bpo-18819@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18819}: Omit @code{devmajor} and @code{devminor} fields for non-device files
in @ref{e4,,tarfile} archives, enabling bit-for-bit compatibility with GNU
@code{tar(1)}.

@item 
bpo-39349@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39349}: Added a new `cancel_futures' parameter to
@ref{aea,,concurrent.futures.Executor.shutdown()} that cancels all pending
futures which have not started running, instead of waiting for them to
complete before shutting down the executor.

@item 
bpo-39274@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39274}: @code{bool(fraction.Fraction)} now returns a boolean even if
(numerator != 0) does not return a boolean (ex: numpy number).

@item 
bpo-34793@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34793}: Remove support for @code{with (await asyncio.lock):} and @code{with
(yield from asyncio.lock):}.  The same is correct for
@code{asyncio.Condition} and @code{asyncio.Semaphore}.

@item 
bpo-25597@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25597}: Ensure, if @code{wraps} is supplied to
@ref{108e,,unittest.mock.MagicMock}, it is used to calculate return values
for the magic methods instead of using the default return values. Patch by
Karthikeyan Singaravelan.

@item 
bpo-36350@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36350}: @code{inspect.Signature.parameters} and
@code{inspect.BoundArguments.arguments} are now dicts instead of
OrderedDicts. Patch contributed by Rémi Lapeyre.

@item 
bpo-35727@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35727}: Fix sys.exit() and sys.exit(None) exit code propagation when
used in multiprocessing.Process.

@item 
bpo-32173@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32173}: * Add @code{lazycache} function to @code{__all__}. * Use
@code{dict.clear} to clear the cache. * Refactoring @code{getline} function and
@code{checkcache} function.
@end itemize

@node Documentation<48>,Tests<48>,Library<154>,Python 3 9 0 alpha 4
@anchor{whatsnew/changelog id678}@anchor{1d7e}
@subsubsection Documentation



@itemize -

@item 
bpo-17422@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17422}: The language reference now specifies restrictions on class
namespaces. Adapted from a patch by Ethan Furman.

@item 
bpo-39572@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39572}: Updated documentation of @code{total} flag of @code{TypedDict}.

@item 
bpo-39654@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39654}: In pyclbr doc, update ‘class’ to ‘module’ where appropriate and
add readmodule comment. Patch by Hakan Çelik.

@item 
bpo-39153@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39153}: Clarify refcounting semantics for the following functions: -
PyObject_SetItem - PyMapping_SetItemString - PyDict_SetItem -
PyDict_SetItemString

@item 
bpo-39392@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39392}: Explain that when filling with turtle, overlap regions may be
left unfilled.

@item 
bpo-39369@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39369}: Update mmap readline method description. The fact that the
readline method does update the file position should not be ignored since
this might give the impression for the programmer that it doesn’t update
it.

@item 
bpo-9056@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9056}: Include subsection in TOC for PDF version of docs.
@end itemize

@node Tests<48>,Build<55>,Documentation<48>,Python 3 9 0 alpha 4
@anchor{whatsnew/changelog id679}@anchor{1d7f}
@subsubsection Tests



@itemize -

@item 
bpo-38325@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38325}: Skip tests on non-BMP characters of test_winconsoleio.

@item 
bpo-39502@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39502}: Skip test_zipfile.test_add_file_after_2107() if
@ref{16fe,,time.localtime()} fails with @ref{a81,,OverflowError}. It is the case on
AIX 6.1 for example.
@end itemize

@node Build<55>,Windows<48>,Tests<48>,Python 3 9 0 alpha 4
@anchor{whatsnew/changelog id680}@anchor{1d80}
@subsubsection Build



@itemize -

@item 
bpo-39489@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39489}: Remove @code{COUNT_ALLOCS} special build.
@end itemize

@node Windows<48>,IDLE<29>,Build<55>,Python 3 9 0 alpha 4
@anchor{whatsnew/changelog id681}@anchor{1d81}
@subsubsection Windows



@itemize -

@item 
bpo-39553@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39553}: Delete unused code related to SxS manifests.

@item 
bpo-39439@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39439}: Honor the Python path when a virtualenv is active on Windows.

@item 
bpo-39393@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39393}: Improve the error message when attempting to load a DLL with
unresolved dependencies.

@item 
bpo-38883@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38883}: @ref{1042,,home()} and @ref{1041,,expanduser()}
on Windows now prefer 
@geindex USERPROFILE
@geindex 환경 변수; USERPROFILE
@code{USERPROFILE} and no longer use
@geindex HOME
@geindex 환경 변수; HOME
@code{HOME}, which is not normally set for regular user accounts. This
makes them again behave like @ref{c08,,os.path.expanduser()}, which was changed
to ignore 
@geindex HOME
@geindex 환경 변수; HOME
@code{HOME} in 3.8, see bpo-36264@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36264}.

@item 
bpo-39185@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39185}: The build.bat script has additional options for very-quiet
output (-q) and very-verbose output (-vv)
@end itemize

@node IDLE<29>,C API<50>,Windows<48>,Python 3 9 0 alpha 4
@anchor{whatsnew/changelog id682}@anchor{1d82}
@subsubsection IDLE



@itemize -

@item 
bpo-39663@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39663}: Add tests for pyparse find_good_parse_start().

@item 
bpo-39600@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39600}: In the font configuration window, remove duplicated font names.

@item 
bpo-30780@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30780}: Add remaining configdialog tests for buttons and highlights and
keys tabs.

@item 
bpo-39388@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39388}: IDLE Settings Cancel button now cancels pending changes

@item 
bpo-38792@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38792}: Close an IDLE shell calltip if a @ref{bc4,,KeyboardInterrupt} or
shell restart occurs.  Patch by Zackery Spytz.
@end itemize

@node C API<50>,,IDLE<29>,Python 3 9 0 alpha 4
@anchor{whatsnew/changelog id683}@anchor{1d83}
@subsubsection C API



@itemize -

@item 
bpo-35081@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35081}: Move the @code{bytes_methods.h} header file to the internal C API
as @code{pycore_bytes_methods.h}: it only contains private symbols (prefixed
by @code{_Py}), except of the @code{PyDoc_STRVAR_shared()} macro.

@item 
bpo-35081@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35081}: Move the @code{dtoa.h} header file to the internal C API as
@code{pycore_dtoa.h}: it only contains private functions (prefixed by
@code{_Py}). The @ref{92,,math} and @ref{19,,cmath} modules must now be compiled
with the @code{Py_BUILD_CORE} macro defined.

@item 
bpo-39573@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39573}: Add @ref{985,,Py_SET_SIZE()} function to set the size of an
object.

@item 
bpo-39500@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39500}: @ref{1d84,,PyUnicode_IsIdentifier()} does not call
@ref{b79,,Py_FatalError()} anymore if the string is not ready.

@item 
bpo-39573@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39573}: Add @ref{983,,Py_SET_TYPE()} function to set the type of an
object.

@item 
bpo-39573@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39573}: Add a @ref{aa8,,Py_SET_REFCNT()} function to set the reference
counter of an object.

@item 
bpo-39542@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39542}: Convert @ref{1d39,,PyType_HasFeature()}, @ref{1d85,,PyType_Check()} and
@ref{1d86,,PyType_CheckExact()} macros to static inline functions.

@item 
bpo-39542@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39542}: In the limited C API, @code{PyObject_INIT()} and
@code{PyObject_INIT_VAR()} are now defined as aliases to
@ref{c60,,PyObject_Init()} and @ref{1d3d,,PyObject_InitVar()} to make their
implementation opaque. It avoids to leak implementation details in the
limited C API. Exclude the following functions from the limited C API:
@code{_Py_NewReference()}, @code{_Py_ForgetReference()},
@code{_PyTraceMalloc_NewReference()} and @code{_Py_GetRefTotal()}.

@item 
bpo-39542@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39542}: Exclude trashcan mechanism from the limited C API: it requires
access to PyTypeObject and PyThreadState structure fields, whereas these
structures are opaque in the limited C API.

@item 
bpo-39511@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39511}: The @ref{1992,,PyThreadState_Clear()} function now calls the
@code{PyThreadState.on_delete} callback. Previously, that happened in
@ref{1d87,,PyThreadState_Delete()}.

@item 
bpo-38076@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38076}: Fix to clear the interpreter state only after clearing module
globals to guarantee module state access from C Extensions during runtime
destruction

@item 
bpo-39245@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39245}: The Vectorcall API (PEP 590) was made public, adding the
functions @code{PyObject_Vectorcall}, @code{PyObject_VectorcallMethod},
@code{PyVectorcall_Function}, @code{PyObject_CallOneArg},
@code{PyObject_CallMethodNoArgs}, @code{PyObject_CallMethodOneArg},
@code{PyObject_FastCallDict}, and the flag @code{Py_TPFLAGS_HAVE_VECTORCALL}.
@end itemize

@node Python 3 9 0 alpha 3,Python 3 9 0 alpha 2,Python 3 9 0 alpha 4,Changelog
@anchor{whatsnew/changelog python-3-9-0-alpha-3}@anchor{1d88}
@subsection Python 3.9.0 alpha 3


`Release date: 2020-01-24'

@menu
* Core and Builtins: Core and Builtins<152>. 
* Library: Library<155>. 
* Documentation: Documentation<49>. 
* Build: Build<56>. 
* IDLE: IDLE<30>. 
* C API: C API<51>. 

@end menu

@node Core and Builtins<152>,Library<155>,,Python 3 9 0 alpha 3
@anchor{whatsnew/changelog id684}@anchor{1d89}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-39427@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39427}: Document all possibilities for the @code{-X} options in the
command line help section. Patch by Pablo Galindo.

@item 
bpo-39421@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39421}: Fix possible crashes when operating with the functions in the
@ref{6d,,heapq} module and custom comparison operators.

@item 
bpo-39386@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39386}: Prevent double awaiting of async iterator.

@item 
bpo-17005@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17005}: Add @code{functools.TopologicalSorter} to the
@ref{63,,functools} module to offers functionality to perform topological
sorting of graphs. Patch by Pablo Galindo, Tim Peters and Larry Hastings.

@item 
bpo-39320@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39320}: Replace four complex bytecodes for building sequences with
three simpler ones.

The following four bytecodes have been removed:


@itemize *

@item 
BUILD_LIST_UNPACK

@item 
BUILD_TUPLE_UNPACK

@item 
BUILD_SET_UNPACK

@item 
BUILD_TUPLE_UNPACK_WITH_CALL
@end itemize

The following three bytecodes have been added:


@itemize *

@item 
LIST_TO_TUPLE

@item 
LIST_EXTEND

@item 
SET_UPDATE
@end itemize

@item 
bpo-39336@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39336}: Import loaders which publish immutable module objects can now
publish immutable packages in addition to individual modules.

@item 
bpo-39322@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39322}: Added a new function @ref{af9,,gc.is_finalized()} to check if an
object has been finalized by the garbage collector. Patch by Pablo
Galindo.

@item 
bpo-39048@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39048}: Improve the displayed error message when incorrect types are
passed to @code{async with} statements by looking up the @code{__aenter__()}
special method before the @code{__aexit__()} special method when entering
an asynchronous context manager. Patch by Géry Ogam.

@item 
bpo-39235@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39235}: Fix AST end location for lone generator expression in function
call, e.g. f(i for i in a).

@item 
bpo-39209@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39209}: Correctly handle multi-line tokens in interactive mode. Patch
by Pablo Galindo.

@item 
bpo-1635741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1635741}: Port _json extension module to multiphase initialization
(
@geindex Python 향상 제안; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}).

@item 
bpo-39216@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39216}: Fix constant folding optimization for positional only arguments
- by Anthony Sottile.

@item 
bpo-39215@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39215}: Fix @code{SystemError} when nested function has annotation on
positional-only argument - by Anthony Sottile.

@item 
bpo-39200@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39200}: Correct the error message when calling the @ref{110a,,min()} or
@ref{110b,,max()} with no arguments. Patch by Donghee Na.

@item 
bpo-39200@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39200}: Correct the error message when trying to construct
@ref{b3d,,range} objects with no arguments. Patch by Pablo Galindo.

@item 
bpo-39166@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39166}: Fix incorrect line execution reporting in trace functions when
tracing the last iteration of asynchronous for loops. Patch by Pablo
Galindo.

@item 
bpo-39114@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39114}: Fix incorrect line execution reporting in trace functions when
tracing exception handlers with name binding. Patch by Pablo Galindo.

@item 
bpo-39156@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39156}: Split the COMPARE_OP bytecode instruction into four distinct
instructions.


@itemize *

@item 
COMPARE_OP for rich comparisons

@item 
IS_OP for ‘is’ and ‘is not’ tests

@item 
CONTAINS_OP for ‘in’ and ‘is not’ tests

@item 
JUMP_IF_NOT_EXC_MATCH for checking exceptions in ‘try-except’ statements.
@end itemize

This improves the clarity of the interpreter and should provide a modest
speedup.

@item 
bpo-38588@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38588}: Fix possible crashes in dict and list when calling
@ref{1d8a,,PyObject_RichCompareBool()}.

@item 
bpo-13601@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13601}: By default, @code{sys.stderr} is line-buffered now, even if
@code{stderr} is redirected to a file. You can still make @code{sys.stderr}
unbuffered by passing the @ref{1d8b,,-u} command-line option or setting the
@geindex PYTHONUNBUFFERED
@geindex 환경 변수; PYTHONUNBUFFERED
@ref{1d8c,,PYTHONUNBUFFERED} environment variable.

(Contributed by Jendrik Seipp in bpo-13601@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13601}.)

@item 
bpo-38610@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38610}: Fix possible crashes in several list methods by holding strong
references to list elements when calling
@ref{1d8a,,PyObject_RichCompareBool()}.

@item 
bpo-32021@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32021}: Include brotli .br encoding in mimetypes encodings_map
@end itemize

@node Library<155>,Documentation<49>,Core and Builtins<152>,Python 3 9 0 alpha 3
@anchor{whatsnew/changelog id685}@anchor{1d8d}
@subsubsection Library



@itemize -

@item 
bpo-39430@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39430}: Fixed race condition in lazy imports in @ref{e4,,tarfile}.

@item 
bpo-39413@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39413}: The @ref{25c,,os.unsetenv()} function is now also available on
Windows.

@item 
bpo-39390@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39390}: Fixed a regression with the @code{ignore} callback of
@ref{c1d,,shutil.copytree()}. The argument types are now @code{str} and
@code{List[str]} again.

@item 
bpo-39395@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39395}: The @ref{25b,,os.putenv()} and @ref{25c,,os.unsetenv()} functions are now
always available.

@item 
bpo-39406@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39406}: If @code{setenv()} C function is available, @ref{25b,,os.putenv()} is
now implemented with @code{setenv()} instead of @code{putenv()}, so Python
doesn’t have to handle the environment variable memory.

@item 
bpo-39396@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39396}: Fix @code{math.nextafter(-0.0, +0.0)} on AIX 7.1.

@item 
bpo-29435@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29435}: Allow @ref{1bd9,,tarfile.is_tarfile()} to be used with file and
file-like objects, like @ref{152f,,zipfile.is_zipfile()}. Patch by William
Woodruff.

@item 
bpo-39377@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39377}: Removed @code{encoding} option from @ref{b4e,,json.loads()}.  It has
been deprecated since Python 3.1.

@item 
bpo-39389@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39389}: Write accurate compression level metadata in @ref{6b,,gzip}
archives, rather than always signaling maximum compression.

@item 
bpo-39366@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39366}: The previously deprecated @code{xpath()} and @code{xgtitle()} methods
of @code{nntplib.NNTP} have been removed.

@item 
bpo-39357@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39357}: Remove the `buffering' parameter of @ref{a66,,bz2.BZ2File}. Since
Python 3.0, it was ignored and using it was emitting
@ref{1a3,,DeprecationWarning}. Pass an open file object, to control how the
file is opened. The `compresslevel' parameter becomes keyword-only.

@item 
bpo-39353@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39353}: Deprecate binhex4 and hexbin4 standards. Deprecate the
@code{binhex} module and the following @ref{11,,binascii} functions:
@code{b2a_hqx()}, @code{a2b_hqx()},
@code{rlecode_hqx()}, @code{rledecode_hqx()},
@ref{93c,,crc_hqx()}.

@item 
bpo-39351@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39351}: Remove @code{base64.encodestring()} and @code{base64.decodestring()},
aliases deprecated since Python 3.1: use @ref{b4c,,base64.encodebytes()} and
@ref{b4d,,base64.decodebytes()} instead.

@item 
bpo-39350@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39350}: Remove @code{fractions.gcd()} function, deprecated since Python
3.5 (bpo-22486@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22486}): use @ref{b0c,,math.gcd()} instead.

@item 
bpo-39329@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39329}: @ref{b29,,LMTP} constructor now has an optional
`timeout' parameter. Patch by Donghee Na.

@item 
bpo-39313@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39313}: Add a new @code{exec_function} option (`–exec-function' in the
CLI) to @code{RefactoringTool} for making @code{exec} a function. Patch by
Batuhan Taskaya.

@item 
bpo-39259@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39259}: @ref{af7,,FTP_TLS} and @code{FTP_TLS} now raise
a @ref{2ec,,ValueError} if the given timeout for their constructor is zero
to prevent the creation of a non-blocking socket. Patch by Donghee Na.

@item 
bpo-39259@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39259}: @ref{b27,,SMTP} and @ref{b28,,SMTP_SSL} now raise
a @ref{2ec,,ValueError} if the given timeout for their constructor is zero
to prevent the creation of a non-blocking socket. Patch by Donghee Na.

@item 
bpo-39310@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39310}: Add @ref{b0e,,math.ulp()}: return the value of the least significant
bit of a float.

@item 
bpo-39297@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39297}: Improved performance of importlib.metadata distribution
discovery and resilients to inaccessible sys.path entries
(importlib_metadata v1.4.0).

@item 
bpo-39259@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39259}: @code{NNTP} and @code{NNTP_SSL} now raise a
@ref{2ec,,ValueError} if the given timeout for their constructor is zero to
prevent the creation of a non-blocking socket. Patch by Donghee Na.

@item 
bpo-38901@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38901}: When you specify prompt=’.’ or equivalently python -m venv
–prompt . … the basename of the current directory is used to set the
created venv’s prompt when it’s activated.

@item 
bpo-39288@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39288}: Add @ref{6bf,,math.nextafter()}: return the next floating-point
value after `x' towards `y'.

@item 
bpo-39259@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39259}: @ref{b1d,,POP3} and @ref{b1e,,POP3_SSL} now raise a
@ref{2ec,,ValueError} if the given timeout for their constructor is zero to
prevent the creation of a non-blocking socket. Patch by Donghee Na.

@item 
bpo-39242@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39242}: Updated the Gmane domain from news.gmane.org to news.gmane.io
which is used for examples of @code{NNTP} news reader server and
nntplib tests.

@item 
bpo-35292@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35292}: Proxy the @code{SimpleHTTPRequestHandler.guess_type} to
@code{mimetypes.guess_type} so the @code{mimetypes.init} is called lazily to
avoid unnecessary costs when @ref{76,,http.server} module is imported.

@item 
bpo-39239@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39239}: The @ref{b53,,select.epoll.unregister()} method no longer ignores
the @ref{b54,,EBADF} error.

@item 
bpo-38907@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38907}: In http.server script, restore binding to IPv4 on Windows.

@item 
bpo-39152@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39152}: Fix ttk.Scale.configure([name]) to return configuration tuple
for name or all options.  Giovanni Lombardo contributed part of the patch.

@item 
bpo-39198@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39198}: If an exception were to be thrown in @code{Logger.isEnabledFor}
(say, by asyncio timeouts or stopit) , the @code{logging} global lock may not
be released appropriately, resulting in deadlock.  This change wraps that
block of code with @code{try...finally} to ensure the lock is released.

@item 
bpo-39191@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39191}: Perform a check for running loop before starting a new task in
@code{loop.run_until_complete()} to fail fast; it prevents the side effect of
new task spawning before exception raising.

@item 
bpo-38871@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38871}: Correctly parenthesize filter-based statements that contain
lambda expressions in @code{lib2to3}. Patch by Donghee Na.

@item 
bpo-39142@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39142}: A change was made to logging.config.dictConfig to avoid
converting instances of named tuples to ConvertingTuple. It’s assumed that
named tuples are too specialised to be treated like ordinary tuples; if a
user of named tuples requires ConvertingTuple functionality, they will
have to implement that themselves in their named tuple class.

@item 
bpo-39158@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39158}: ast.literal_eval() now supports empty sets.

@item 
bpo-39129@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39129}: Fix import path for @code{asyncio.TimeoutError}

@item 
bpo-39057@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39057}: @code{urllib.request.proxy_bypass_environment()} now ignores
leading dots and no longer ignores a trailing newline.

@item 
bpo-39056@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39056}: Fixed handling invalid warning category in the -W option.  No
longer import the re module if it is not needed.

@item 
bpo-39055@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39055}: @ref{1763,,base64.b64decode()} with @code{validate=True} raises now a
binascii.Error if the input ends with a single @code{\n}.

@item 
bpo-21600@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21600}: Fix @code{mock.patch.stopall()} to stop active patches that were
created with @code{mock.patch.dict()}.

@item 
bpo-39019@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39019}: Implement dummy @code{__class_getitem__} for
@ref{8a1,,tempfile.SpooledTemporaryFile}.

@item 
bpo-39019@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39019}: Implement dummy @code{__class_getitem__} for @code{subprocess.Popen},
@code{subprocess.CompletedProcess}

@item 
bpo-38914@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38914}: Adjusted the wording of the warning issued by distutils’
@code{check} command when the @code{author} and @code{maintainer} fields are
supplied but no corresponding e-mail field (@code{author_email} or
@code{maintainer_email}) is found. The wording now reflects the fact that
these fields are suggested, but not required. Patch by Juergen Gmach.

@item 
bpo-38878@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38878}: Fixed __subclasshook__ of @ref{e4a,,os.PathLike} to return a
correct result upon inheritance. Patch by Bar Harel.

@item 
bpo-38615@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38615}: @ref{aff,,IMAP4} and @ref{b00,,IMAP4_SSL} now
have an optional `timeout' parameter for their constructors. Also, the
@ref{b01,,open()} method now has an optional `timeout' parameter
with this change. The overridden methods of @code{IMAP4_SSL}
and @ref{b02,,IMAP4_stream} were applied to this change. Patch by
Donghee Na.

@item 
bpo-35182@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35182}: Fixed @code{Popen.communicate()} subsequent call crash when the
child process has already closed any piped standard stream, but still
continues to be running. Patch by Andriy Maletsky.

@item 
bpo-38630@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38630}: On Unix, @ref{15e3,,subprocess.Popen.send_signal()} now polls the
process status. Polling reduces the risk of sending a signal to the wrong
process if the process completed, the @ref{c82,,subprocess.Popen.returncode}
attribute is still @code{None}, and the pid has been reassigned (recycled) to
a new different process.

@item 
bpo-38536@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38536}: Removes trailing space in formatted currency with
@code{international=True} and a locale with symbol following value. E.g.
@code{locale.currency(12.34, international=True)} returned @code{'12,34 EUR '}
instead of @code{'12,34 EUR'}.

@item 
bpo-38473@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38473}: Use signature from inner mock for autospecced methods attached
with @code{unittest.mock.attach_mock()}. Patch by Karthikeyan Singaravelan.

@item 
bpo-38361@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38361}: Fixed an issue where @code{ident} could include a leading path
separator when @ref{75f,,syslog.openlog()} was called without arguments.

@item 
bpo-38293@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38293}: Add @ref{756,,copy.copy()} and @ref{d64,,copy.deepcopy()} support to
@ref{4b3,,property()} objects.

@item 
bpo-37958@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37958}: Added the pstats.Stats.get_profile_dict() method to return the
profile data as a StatsProfile instance.

@item 
bpo-28367@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28367}: Termios magic constants for the following baud rates:   -
B500000   - B576000   - B921600   - B1000000   - B1152000   - B1500000   -
B2000000   - B2500000   - B3000000   - B3500000   - B4000000 Patch by
Andrey Smirnov
@end itemize

@node Documentation<49>,Build<56>,Library<155>,Python 3 9 0 alpha 3
@anchor{whatsnew/changelog id686}@anchor{1d8e}
@subsubsection Documentation



@itemize -

@item 
bpo-39381@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39381}: Mention in docs that @ref{2f2,,asyncio.get_event_loop()} implicitly
creates new event loop only if called from the main thread.

@item 
bpo-38918@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38918}: Add an entry for @code{__module__} in the “function” & “method”
sections of the @ref{82,,inspect} docs’ @ref{1d8f,,형과 멤버} table.

@item 
bpo-3530@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=3530}: In the @ref{9,,ast} module documentation, fix a misleading
@code{NodeTransformer} example and add advice on when to use the
@code{fix_missing_locations} function.
@end itemize

@node Build<56>,IDLE<30>,Documentation<49>,Python 3 9 0 alpha 3
@anchor{whatsnew/changelog id687}@anchor{1d90}
@subsubsection Build



@itemize -

@item 
bpo-39395@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39395}: On non-Windows platforms, the @code{setenv()} and
@code{unsetenv()} functions are now required to build Python.

@item 
bpo-39160@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39160}: Updated the documentation in @code{./configure --help} to show
default values, reference documentation where required and add additional
explanation where needed.

@item 
bpo-39144@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39144}: The ctags and etags build targets both include Modules/_ctypes
and Python standard library source files.
@end itemize

@node IDLE<30>,C API<51>,Build<56>,Python 3 9 0 alpha 3
@anchor{whatsnew/changelog id688}@anchor{1d91}
@subsubsection IDLE



@itemize -

@item 
bpo-39050@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39050}: Make IDLE Settings dialog Help button work again.

@item 
bpo-34118@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34118}: Tag memoryview, range, and tuple as classes, the same as list,
etcetera, in the library manual built-in functions list.

@item 
bpo-32989@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32989}: Add tests for editor newline_and_indent_event method. Remove
dead code from pyparse find_good_parse_start method.
@end itemize

@node C API<51>,,IDLE<30>,Python 3 9 0 alpha 3
@anchor{whatsnew/changelog id689}@anchor{1d92}
@subsubsection C API



@itemize -

@item 
bpo-39372@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39372}: Clean header files of interfaces defined but with no
implementation. The public API symbols being removed are:
@code{_PyBytes_InsertThousandsGroupingLocale},
@code{_PyBytes_InsertThousandsGrouping}, @code{_Py_InitializeFromArgs},
@code{_Py_InitializeFromWideArgs}, @code{_PyFloat_Repr}, @code{_PyFloat_Digits},
@code{_PyFloat_DigitsInit}, @code{PyFrame_ExtendStack},
@code{_PyAIterWrapper_Type}, @code{PyNullImporter_Type}, @code{PyCmpWrapper_Type},
@code{PySortWrapper_Type}, @code{PyNoArgsFunction}.

@item 
bpo-39164@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39164}: Add a private @code{_PyErr_GetExcInfo()} function to retrieve
exception information of the specified Python thread state.
@end itemize

@node Python 3 9 0 alpha 2,Python 3 9 0 alpha 1,Python 3 9 0 alpha 3,Changelog
@anchor{whatsnew/changelog python-3-9-0-alpha-2}@anchor{1d93}
@subsection Python 3.9.0 alpha 2


`Release date: 2019-12-18'

@menu
* Security: Security<42>. 
* Core and Builtins: Core and Builtins<153>. 
* Library: Library<156>. 
* Documentation: Documentation<50>. 
* Tests: Tests<49>. 
* Build: Build<57>. 
* Windows: Windows<49>. 
* macOS: macOS<38>. 
* IDLE: IDLE<31>. 
* C API: C API<52>. 

@end menu

@node Security<42>,Core and Builtins<153>,,Python 3 9 0 alpha 2
@anchor{whatsnew/changelog id690}@anchor{1d94}
@subsubsection Security



@itemize -

@item 
bpo-38945@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38945}: Newline characters have been escaped when performing uu
encoding to prevent them from overflowing into to content section of the
encoded file. This prevents malicious or accidental modification of data
during the decoding process.

@item 
bpo-37228@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37228}: Due to significant security concerns, the `reuse_address'
parameter of @ref{93b,,asyncio.loop.create_datagram_endpoint()} is no longer
supported. This is because of the behavior of @code{SO_REUSEADDR} in UDP. For
more details, see the documentation for
@code{loop.create_datagram_endpoint()}. (Contributed by Kyle Stanley, Antoine
Pitrou, and Yury Selivanov in bpo-37228@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37228}.)

@item 
bpo-38804@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38804}: Fixes a ReDoS vulnerability in @ref{74,,http.cookiejar}. Patch by
Ben Caller.
@end itemize

@node Core and Builtins<153>,Library<156>,Security<42>,Python 3 9 0 alpha 2
@anchor{whatsnew/changelog id691}@anchor{1d95}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-39028@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39028}: Slightly improve the speed of keyword argument parsing with
many kwargs by strengthening the assumption that kwargs are interned
strings.

@item 
bpo-39080@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39080}: Fix the value of `end_col_offset' for Starred Expression AST
nodes when they are among the elements in the `args' attribute of Call AST
nodes.

@item 
bpo-39031@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39031}: When parsing an “elif” node, lineno and col_offset of the node
now point to the “elif” keyword and not to its condition, making it
consistent with the “if” node. Patch by Lysandros Nikolaou.

@item 
bpo-20443@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20443}: In Python 3.9.0a1, sys.argv[0] was made an absolute path if a
filename was specified on the command line. Revert this change, since most
users expect sys.argv to be unmodified.

@item 
bpo-39008@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39008}: @ref{611,,PySys_Audit()} now requires @code{Py_ssize_t} to be used
for size arguments in the format string, regardless of whether
@code{PY_SSIZE_T_CLEAN} was defined at include time.

@item 
bpo-38673@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38673}: In REPL mode, don’t switch to PS2 if the line starts with
comment or whitespace. Based on work by Batuhan Taşkaya.

@item 
bpo-38922@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38922}: Calling @code{replace} on a code object now raises the
@code{code.__new__} audit event.

@item 
bpo-38920@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38920}: Add audit hooks for when @ref{a0c,,sys.excepthook()} and
@ref{506,,sys.unraisablehook()} are invoked.

@item 
bpo-38892@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38892}: Improve documentation for audit events table and functions.

@item 
bpo-38852@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38852}: Set the thread stack size to 8 Mb for debug builds on android
platforms.

@item 
bpo-38858@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38858}: Each Python subinterpreter now has its own “small integer
singletons”: numbers in [-5; 257] range. It is no longer possible to
change the number of small integers at build time by overriding
@code{NSMALLNEGINTS} and @code{NSMALLPOSINTS} macros: macros should now be
modified manually in @code{pycore_pystate.h} header file.

@item 
bpo-36854@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36854}: The garbage collector state becomes per interpreter
(@code{PyInterpreterState.gc}), rather than being global
(@code{_PyRuntimeState.gc}).

@item 
bpo-38835@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38835}: The @code{PyFPE_START_PROTECT()} and @code{PyFPE_END_PROTECT()}
macros are empty: they have been doing nothing for the last year, so stop
using them.

@item 
bpo-38328@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38328}: Sped up the creation time of constant @ref{24d,,list} and
@ref{184,,set} displays. Patch by Brandt Bucher.

@item 
bpo-38707@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38707}: @code{MainThread.native_id} is now correctly reset in child
processes spawned using @ref{252,,multiprocessing.Process}, instead of
retaining the parent’s value.

@item 
bpo-38629@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38629}: Added @code{__floor__} and @code{__ceil__} methods to float object.
Patch by Batuhan Taşkaya.

@item 
bpo-27145@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27145}: int + int and int - int operators can now return small integer
singletons. Patch by hongweipeng.

@item 
bpo-38021@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38021}: Provide a platform tag for AIX that is sufficient for PEP425
binary distribution identification. Patch by Michael Felt.

@item 
bpo-35409@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35409}: Ignore GeneratorExit exceptions when throwing an exception into
the aclose coroutine of an asynchronous generator.

@item 
bpo-33387@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33387}: Removed WITH_CLEANUP_START, WITH_CLEANUP_FINISH, BEGIN_FINALLY,
END_FINALLY, CALL_FINALLY and POP_FINALLY bytecodes. Replaced with RERAISE
and WITH_EXCEPT_START bytecodes. The compiler now generates different code
for exceptional and non-exceptional branches for ‘with’ and ‘try-except’
statements. For ‘try-finally’ statements the ‘finally’ block is replicated
for each exit from the ‘try’ body.
@end itemize

@node Library<156>,Documentation<50>,Core and Builtins<153>,Python 3 9 0 alpha 2
@anchor{whatsnew/changelog id692}@anchor{1d96}
@subsubsection Library



@itemize -

@item 
bpo-39033@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39033}: Fix @ref{452,,NameError} in @ref{138,,zipimport}. Patch by Karthikeyan
Singaravelan.

@item 
bpo-39022@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39022}: Update importlib.metadata to include improvements from
importlib_metadata 1.3 including better serialization of EntryPoints and
improved documentation for custom finders.

@item 
bpo-39006@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39006}: Fix asyncio when the ssl module is missing: only check for
ssl.SSLSocket instance if the ssl module is available.

@item 
bpo-38708@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38708}: Fix a potential IndexError in email parser when parsing an
empty msg-id.

@item 
bpo-38698@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38698}: Add a new @code{InvalidMessageID} token to email parser to
represent invalid Message-ID headers.  Also, add defects when there is
remaining value after parsing the header.

@item 
bpo-38994@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38994}: Implement @code{__class_getitem__} for @code{os.PathLike},
@code{pathlib.Path}.

@item 
bpo-38979@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38979}: Return class from @code{ContextVar.__class_getitem__} to simplify
subclassing.

@item 
bpo-38978@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38978}: Implement @code{__class_getitem__} on asyncio objects (Future,
Task, Queue). Patch by Batuhan Taskaya.

@item 
bpo-38916@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38916}: @ref{4c0,,array.array}: Remove @code{tostring()} and
@code{fromstring()} methods. They were aliases to @code{tobytes()} and
@code{frombytes()}, deprecated since Python 3.2.

@item 
bpo-38986@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38986}: Make repr of C accelerated TaskWakeupMethWrapper the same as of
pure Python version.

@item 
bpo-38982@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38982}: Fix asyncio @code{PidfdChildWatcher}: handle @code{waitpid()} error.
If @code{waitpid()} is called elsewhere, @code{waitpid()} call fails with
@ref{1257,,ChildProcessError}: use return code 255 in this case, and log a
warning. It ensures that the pidfd file descriptor is closed if this error
occurs.

@item 
bpo-38529@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38529}: Drop too noisy asyncio warning about deletion of a stream
without explicit @code{.close()} call.

@item 
bpo-27413@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27413}: Added ability to pass through @code{ensure_ascii} options to
json.dumps in the @code{json.tool} command-line interface.

@item 
bpo-38634@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38634}: The @ref{bf,,readline} module now detects if Python is linked to
libedit at runtime on all platforms.  Previously, the check was only done
on macOS.

@item 
bpo-33684@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33684}: Fix @code{json.tool} failed to read a JSON file with non-ASCII
characters when locale encoding is not UTF-8.

@item 
bpo-38698@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38698}: Prevent UnboundLocalError to pop up in parse_message_id.

parse_message_id() was improperly using a token defined inside an
exception handler, which was raising @code{UnboundLocalError} on parsing an
invalid value. Patch by Claudiu Popa.

@item 
bpo-38927@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38927}: Use @code{python -m pip} instead of @code{pip} to upgrade
dependencies in venv.

@item 
bpo-26730@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26730}: Fix @code{SpooledTemporaryFile.rollover()} might corrupt the file
when it is in text mode. Patch by Serhiy Storchaka.

@item 
bpo-38881@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38881}: random.choices() now raises a ValueError when all the weights
are zero.

@item 
bpo-38876@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38876}: Raise pickle.UnpicklingError when loading an item from memo for
invalid input.

The previous code was raising a @code{KeyError} for both the Python and C
implementation. This was caused by the specified index of an invalid input
which did not exist in the memo structure, where the pickle stores what
objects it has seen. The malformed input would have caused either a
@code{BINGET} or @code{LONG_BINGET} load from the memo, leading to a
@code{KeyError} as the determined index was bogus. Patch by Claudiu Popa.

@item 
bpo-38688@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38688}: Calling func:@code{shutil.copytree} to copy a directory tree from
one directory to another subdirectory resulted in an endless loop and a
RecursionError. A fix was added to consume an iterator and create the list
of the entries to be copied, avoiding the recursion for newly created
directories. Patch by Bruno P. Kinoshita.

@item 
bpo-38863@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38863}: Improve @code{is_cgi()} function in @ref{76,,http.server}, which
enables processing the case that cgi directory is a child of another
directory other than root.

@item 
bpo-37838@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37838}: @ref{8bf,,typing.get_type_hints()} properly handles functions
decorated with @ref{115c,,functools.wraps()}.

@item 
bpo-38870@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38870}: Expose @ref{ae2,,ast.unparse()} as a function of the @ref{9,,ast}
module that can be used to unparse an @ref{4c5,,ast.AST} object and produce
a string with code that would produce an equivalent @code{ast.AST}
object when parsed. Patch by Pablo Galindo and Batuhan Taskaya.

@item 
bpo-38859@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38859}: AsyncMock now returns StopAsyncIteration on the exhaustion of a
side_effects iterable. Since PEP-479 its Impossible to raise a
StopIteration exception from a coroutine.

@item 
bpo-38857@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38857}: AsyncMock fix for return values that are awaitable types.  This
also covers side_effect iterable values that happened to be awaitable, and
wraps callables that return an awaitable type. Before these awaitables
were being awaited instead of being returned as is.

@item 
bpo-38834@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38834}: @ref{332,,typing.TypedDict} subclasses now track which keys are
optional using the @code{__required_keys__} and @code{__optional_keys__}
attributes, to enable runtime validation by downstream projects.  Patch by
Zac Hatfield-Dodds.

@item 
bpo-38821@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38821}: Fix unhandled exceptions in @ref{7,,argparse} when
internationalizing error messages for arguments with @code{nargs} set to
special (non-integer) values. Patch by Federico Bond.

@item 
bpo-38820@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38820}: Make Python compatible with OpenSSL 3.0.0.
@ref{11b7,,ssl.SSLSocket.getpeercert()} no longer returns IPv6 addresses with a
trailing new line.

@item 
bpo-38811@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38811}: Fix an unhandled exception in @ref{a8,,pathlib} when
@ref{12f4,,os.link()} is missing. Patch by Toke Høiland-Jørgensen.

@item 
bpo-38686@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38686}: Added support for multiple @code{qop} values in
@ref{1d68,,urllib.request.AbstractDigestAuthHandler}.

@item 
bpo-38712@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38712}: Add the Linux-specific @ref{b25,,signal.pidfd_send_signal()}
function, which allows sending a signal to a process identified by a file
descriptor rather than a pid.

@item 
bpo-38348@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38348}: Add @code{-i} and @code{--indent} (indentation level), and
@code{--no-type-comments} (type comments) command line options to ast parsing
tool.

@item 
bpo-37523@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37523}: Change @code{zipfile.ZipExtFile} to raise @code{ValueError} when
trying to access the underlying file object after it has been closed. This
new behavior is consistent with how accessing closed files is handled in
other parts of Python.

@item 
bpo-38045@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38045}: Improve the performance of @code{enum._decompose()} in
@ref{5a,,enum}. Patch by hongweipeng.

@item 
bpo-36820@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36820}: Break cycle generated when saving an exception in socket.py,
codeop.py and dyld.py as they keep alive not only the exception but user
objects through the @code{__traceback__} attribute. Patch by Mario Corchero.

@item 
bpo-36406@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36406}: Handle namespace packages in @ref{3e,,doctest}. Patch by
Karthikeyan Singaravelan.

@item 
bpo-34776@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34776}: Fix dataclasses to support forward references in type
annotations

@item 
bpo-20928@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20928}: ElementTree supports recursive XInclude processing.  Patch by
Stefan Behnel.

@item 
bpo-29636@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29636}: Add whitespace options for formatting JSON with the
@code{json.tool} CLI. The following mutually exclusive options are now
supported: @code{--indent} for setting the indent level in spaces; @code{--tab}
for indenting with tabs; @code{--no-indent} for suppressing newlines; and
@code{--compact} for suppressing all whitespace. The default behavior remains
the same as @code{--indent=4}.
@end itemize

@node Documentation<50>,Tests<49>,Library<156>,Python 3 9 0 alpha 2
@anchor{whatsnew/changelog id693}@anchor{1d97}
@subsubsection Documentation



@itemize -

@item 
bpo-38928@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38928}: Correct when venv’s @code{upgrade_dependencies()} and
@code{--upgrade-deps} are added.

@item 
bpo-38899@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38899}: Update documentation to state that to activate virtual
environments under fish one should use @code{source}, not @code{.} as documented
at @indicateurl{https://fishshell.com/docs/current/cmds/source.html}.

@item 
bpo-22377@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22377}: Improves documentation of the values that
@ref{1951,,datetime.datetime.strptime()} accepts for @code{%Z}. Patch by Karl
Dubost.
@end itemize

@node Tests<49>,Build<57>,Documentation<50>,Python 3 9 0 alpha 2
@anchor{whatsnew/changelog id694}@anchor{1d98}
@subsubsection Tests



@itemize -

@item 
bpo-38546@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38546}: Fix test_ressources_gced_in_workers() of
test_concurrent_futures: explicitly stop the manager to prevent leaking a
child process running in the background after the test completes.

@item 
bpo-38546@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38546}: Multiprocessing and concurrent.futures tests now stop the
resource tracker process when tests complete.

@item 
bpo-38614@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38614}: Replace hardcoded timeout constants in tests with new
@ref{ea,,test.support} constants: @ref{1d99,,LOOPBACK_TIMEOUT},
@ref{1d9a,,INTERNET_TIMEOUT},
@ref{1c61,,SHORT_TIMEOUT} and
@ref{1d9b,,LONG_TIMEOUT}. It becomes easier to adjust these four
timeout constants for all tests at once, rather than having to adjust
every single test file.

@item 
bpo-38547@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38547}: Fix test_pty: if the process is the session leader, closing the
master file descriptor raises a SIGHUP signal: simply ignore SIGHUP when
running the tests.

@item 
bpo-38992@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38992}: Fix a test for @ref{15d9,,math.fsum()} that was failing due to
constant folding.

@item 
bpo-38991@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38991}: @ref{ea,,test.support}:
@code{run_python_until_end()},
@code{assert_python_ok()} and
@code{assert_python_failure()} functions no longer strip
whitespaces from stderr. Remove @code{test.support.strip_python_stderr()}
function.

@item 
bpo-38965@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38965}: Fix test_faulthandler on GCC 10. Use the “volatile” keyword in
@code{faulthandler._stack_overflow()} to prevent tail call optimization on
any compiler, rather than relying on compiler specific pragma.

@item 
bpo-38875@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38875}: test_capi: trashcan tests now require the test “cpu” resource.

@item 
bpo-38841@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38841}: Skip asyncio test_create_datagram_endpoint_existing_sock_unix
on platforms lacking a functional bind() for named unix domain sockets.

@item 
bpo-38692@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38692}: Skip the test_posix.test_pidfd_open() test if
@code{os.pidfd_open()} fails with a @ref{f3d,,PermissionError}. This situation
can happen in a Linux sandbox using a syscall whitelist which doesn’t
allow the @code{pidfd_open()} syscall yet.

@item 
bpo-38839@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38839}: Fix some unused functions in tests. Patch by Adam Johnson.

@item 
bpo-38669@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38669}: Raise @ref{198,,TypeError} when passing target as a string with
@ref{1907,,unittest.mock.patch.object()}.

@item 
bpo-37957@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37957}: test.regrtest now can receive a list of test patterns to ignore
(using the -i/–ignore argument) or a file with a list of patterns to
ignore (using the –ignore-file argument). Patch by Pablo Galindo.
@end itemize

@node Build<57>,Windows<49>,Tests<49>,Python 3 9 0 alpha 2
@anchor{whatsnew/changelog id695}@anchor{1d9c}
@subsubsection Build



@itemize -

@item 
bpo-37404@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37404}: @ref{b,,asyncio} now raises @ref{198,,TypeError} when calling
incompatible methods with an @ref{ae7,,ssl.SSLSocket} socket.  Patch by Ido
Michael.

@item 
bpo-36500@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36500}: Added an optional “regen” project to the Visual Studio solution
that will regenerate all grammar, tokens, and opcodes.
@end itemize

@node Windows<49>,macOS<38>,Build<57>,Python 3 9 0 alpha 2
@anchor{whatsnew/changelog id696}@anchor{1d9d}
@subsubsection Windows



@itemize -

@item 
bpo-39007@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=39007}: Add auditing events to functions in @ref{11c,,winreg}.

@item 
bpo-33125@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33125}: Add support for building and releasing Windows ARM64 packages.
@end itemize

@node macOS<38>,IDLE<31>,Windows<49>,Python 3 9 0 alpha 2
@anchor{whatsnew/changelog id697}@anchor{1d9e}
@subsubsection macOS



@itemize -

@item 
bpo-37931@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37931}: Fixed a crash on OSX dynamic builds that occurred when
re-initializing the posix module after a Py_Finalize if the environment
had changed since the previous @code{import posix}. Patch by Benoît Hudson.
@end itemize

@node IDLE<31>,C API<52>,macOS<38>,Python 3 9 0 alpha 2
@anchor{whatsnew/changelog id698}@anchor{1d9f}
@subsubsection IDLE



@itemize -

@item 
bpo-38944@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38944}: Escape key now closes IDLE completion windows.  Patch by Johnny
Najera.

@item 
bpo-38943@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38943}: Fix IDLE autocomplete windows not always appearing on some
systems. Patch by Johnny Najera.

@item 
bpo-38862@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38862}: ‘Strip Trailing Whitespace’ on the Format menu removes extra
newlines at the end of non-shell files.

@item 
bpo-38636@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38636}: Fix IDLE Format menu tab toggle and file indent width. These
functions (default shortcuts Alt-T and Alt-U) were mistakenly disabled in
3.7.5 and 3.8.0.
@end itemize

@node C API<52>,,IDLE<31>,Python 3 9 0 alpha 2
@anchor{whatsnew/changelog id699}@anchor{1da0}
@subsubsection C API



@itemize -

@item 
bpo-38896@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38896}: Remove @code{PyUnicode_ClearFreeList()} function: the Unicode free
list has been removed in Python 3.3.

@item 
bpo-37340@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37340}: Remove @code{PyMethod_ClearFreeList()} and
@code{PyCFunction_ClearFreeList()} functions: the free lists of bound method
objects have been removed.

@item 
bpo-38835@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38835}: Exclude @code{PyFPE_START_PROTECT()} and @code{PyFPE_END_PROTECT()}
macros of @code{pyfpe.h} from @code{Py_LIMITED_API} (stable API).
@end itemize

@node Python 3 9 0 alpha 1,Python 3 8 0 beta 1,Python 3 9 0 alpha 2,Changelog
@anchor{whatsnew/changelog python-3-9-0-alpha-1}@anchor{1da1}
@subsection Python 3.9.0 alpha 1


`Release date: 2019-11-19'

@menu
* Security: Security<43>. 
* Core and Builtins: Core and Builtins<154>. 
* Library: Library<157>. 
* Documentation: Documentation<51>. 
* Tests: Tests<50>. 
* Build: Build<58>. 
* Windows: Windows<50>. 
* macOS: macOS<39>. 
* IDLE: IDLE<32>. 
* Tools/Demos: Tools/Demos<33>. 
* C API: C API<53>. 

@end menu

@node Security<43>,Core and Builtins<154>,,Python 3 9 0 alpha 1
@anchor{whatsnew/changelog id700}@anchor{1da2}
@subsubsection Security



@itemize -

@item 
bpo-38722@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38722}: @ref{c3,,runpy} now uses @ref{175c,,io.open_code()} to open code files.
Patch by Jason Killen.

@item 
bpo-38622@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38622}: Add additional audit events for the @ref{2e,,ctypes} module.

@item 
bpo-38418@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38418}: Fixes audit event for @ref{1662,,os.system()} to be named
@code{os.system}.

@item 
bpo-38243@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38243}: Escape the server title of
@ref{1da3,,xmlrpc.server.DocXMLRPCServer} when rendering the document page as
HTML. (Contributed by Donghee Na in bpo-38243@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38243}.)

@item 
bpo-38174@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38174}: Update vendorized expat library version to 2.2.8, which
resolves 
@geindex Common Vulnerabilities and Exposures; CVE 2019-15903
CVE 2019-15903@footnote{https://www.cve.org/CVERecord?id=CVE-2019-15903}.

@item 
bpo-37764@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37764}: Fixes email._header_value_parser.get_unstructured going into an
infinite loop for a specific case in which the email header does not have
trailing whitespace, and the case in which it contains an invalid encoded
word. Patch by Ashwin Ramaswami.

@item 
bpo-37461@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37461}: Fix an infinite loop when parsing specially crafted email
headers. Patch by Abhilash Raj.

@item 
bpo-37363@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37363}: Adds audit events for the range of supported run commands (see
@ref{1da4,,명령 줄과 환경}).

@item 
bpo-37463@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37463}: ssl.match_hostname() no longer accepts IPv4 addresses with
additional text after the address and only quad-dotted notation without
trailing whitespaces. Some inet_aton() implementations ignore whitespace
and all data after whitespace, e.g. ‘127.0.0.1 whatever’.

@item 
bpo-37363@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37363}: Adds audit events for @ref{59,,ensurepip}, @ref{62,,ftplib},
@ref{68,,glob}, @ref{78,,imaplib}, @code{nntplib}, @ref{aa,,pdb}, @ref{b1,,poplib},
@ref{ca,,shutil}, @ref{cf,,smtplib}, @ref{d4,,sqlite3}, @ref{dc,,subprocess},
@code{telnetlib}, @ref{e6,,tempfile} and @ref{11b,,webbrowser}, as well as
@ref{12ff,,os.listdir()}, @ref{c53,,os.scandir()} and @ref{271,,breakpoint()}.

@item 
bpo-37364@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37364}: @ref{175c,,io.open_code()} is now used when reading @code{.pth}
files.

@item 
bpo-34631@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34631}: Updated OpenSSL to 1.1.1c in Windows installer

@item 
bpo-34155@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34155}: Fix parsing of invalid email addresses with more than one @code{@@}
(e.g. a@@b@@c.com.) to not return the part before 2nd @code{@@} as valid email
address. Patch by maxking & jpic.
@end itemize

@node Core and Builtins<154>,Library<157>,Security<43>,Python 3 9 0 alpha 1
@anchor{whatsnew/changelog id701}@anchor{1da5}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-38631@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38631}: Replace @code{Py_FatalError()} call with a regular
@ref{244,,RuntimeError} exception in @code{float.__getformat__()}.

@item 
bpo-38639@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38639}: Optimized @ref{15c2,,math.floor()}, @ref{15c3,,math.ceil()} and
@ref{15c4,,math.trunc()} for floats.

@item 
bpo-38640@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38640}: Fixed a bug in the compiler that was causing to raise in the
presence of break statements and continue statements inside always false
while loops. Patch by Pablo Galindo.

@item 
bpo-38613@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38613}: Optimized some set operations (e.g. @code{|}, @code{^}, and @code{-}) of
@code{dict_keys}. @code{d.keys() | other} was slower than @code{set(d) | other} but
they are almost same performance for now.

@item 
bpo-28029@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28029}: @code{"".replace("", s, n)} now returns @code{s} instead of an empty
string for all non-zero @code{n}.  There are similar changes for
@ref{192,,bytes} and @ref{344,,bytearray} objects.

@item 
bpo-38535@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38535}: Fixed line numbers and column offsets for AST nodes for calls
without arguments in decorators.

@item 
bpo-38525@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38525}: Fix a segmentation fault when using reverse iterators of empty
@code{dict} objects. Patch by Donghee Na and Inada Naoki.

@item 
bpo-38465@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38465}: @ref{344,,bytearray}, @ref{4c0,,array} and
@ref{518,,mmap} objects allow now to export more than @code{2**31}
buffers at a time.

@item 
bpo-38469@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38469}: Fixed a bug where the scope of named expressions was not being
resolved correctly in the presence of the `global' keyword. Patch by Pablo
Galindo.

@item 
bpo-38437@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38437}: Activate the @code{GC_DEBUG} macro for debug builds of the
interpreter (when @code{Py_DEBUG} is set). Patch by Pablo Galindo.

@item 
bpo-38379@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38379}: When the garbage collector makes a collection in which some
objects resurrect (they are reachable from outside the isolated cycles
after the finalizers have been executed), do not block the collection of
all objects that are still unreachable. Patch by Pablo Galindo and Tim
Peters.

@item 
bpo-38379@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38379}: When cyclic garbage collection (gc) runs finalizers that
resurrect unreachable objects, the current gc run ends, without collecting
any cyclic trash.  However, the statistics reported by @code{collect()} and
@code{get_stats()} claimed that all cyclic trash found was collected, and
that the resurrected objects were collected.   Changed the stats to report
that none were collected.

@item 
bpo-38392@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38392}: In debug mode, @ref{1709,,PyObject_GC_Track()} now calls
@code{tp_traverse()} of the object type to ensure that the object is valid:
test that objects visited by @code{tp_traverse()} are valid.

@item 
bpo-38210@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38210}: Remove unnecessary intersection and update set operation in
dictview with empty set. (Contributed by Donghee Na in bpo-38210@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38210}.)

@item 
bpo-38402@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38402}: Check the error from the system’s underlying @code{crypt} or
@code{crypt_r}.

@item 
bpo-37474@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37474}: On FreeBSD, Python no longer calls @code{fedisableexcept()} at
startup to control the floating-point control mode. The call became
useless since FreeBSD 6: it became the default mode.

@item 
bpo-38006@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38006}: Fix a bug due to the interaction of weakrefs and the cyclic
garbage collector. We must clear any weakrefs in garbage in order to
prevent their callbacks from executing and causing a crash.

@item 
bpo-38317@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38317}: Fix warnings options priority: @code{PyConfig.warnoptions} has the
highest priority, as stated in the 
@geindex Python 향상 제안; PEP 587
PEP 587@footnote{https://peps.python.org/pep-0587/}.

@item 
bpo-38310@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38310}: Predict @code{BUILD_MAP_UNPACK_WITH_CALL} -> @code{CALL_FUNCTION_EX}
opcode pairs in the main interpreter loop. Patch by Brandt Bucher.

@item 
bpo-36871@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36871}: Improve error handling for the assert_has_calls and
assert_has_awaits methods of mocks. Fixed a bug where any errors
encountered while binding the expected calls to the mock’s spec were
silently swallowed, leading to misleading error output.

@item 
bpo-11410@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11410}: Better control over symbol visibility is provided through use
of the visibility attributes available in gcc >= 4.0, provided in a
uniform way across POSIX and Windows. The POSIX build files have been
updated to compile with -fvisibility=hidden, minimising exported symbols.

@item 
bpo-38219@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38219}: Optimized the @ref{183,,dict} constructor and the
@ref{166a,,update()} method for the case when the argument is a dict.

@item 
bpo-38236@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38236}: Python now dumps path configuration if it fails to import the
Python codecs of the filesystem and stdio encodings.

@item 
bpo-38013@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38013}: Allow to call @code{async_generator_athrow().throw(...)} even for
non-started async generator helper. It fixes annoying warning at the end
of @ref{2f3,,asyncio.run()} call.

@item 
bpo-38124@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38124}: Fix an off-by-one error in PyState_AddModule that could cause
out-of-bounds memory access.

@item 
bpo-38116@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38116}: The select module is now PEP-384 compliant and no longer has
static state

@item 
bpo-38113@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38113}: ast module updated to PEP-384 and all statics removed

@item 
bpo-38076@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38076}: The struct module is now PEP-384 compatible

@item 
bpo-38075@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38075}: The random module is now PEP-384 compatible

@item 
bpo-38074@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38074}: zlib module made PEP-384 compatible

@item 
bpo-38073@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38073}: Make pwd extension module PEP-384 compatible

@item 
bpo-38072@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38072}: grp module made PEP-384 compatible

@item 
bpo-38069@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38069}: Make _posixsubprocess PEP-384 compatible

@item 
bpo-38071@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38071}: Make termios extension module PEP-384 compatible

@item 
bpo-38005@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38005}: Fixed comparing and creating of InterpreterID and ChannelID.

@item 
bpo-36946@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36946}: Fix possible signed integer overflow when handling slices.
Patch by hongweipeng.

@item 
bpo-37994@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37994}: Fixed silencing arbitrary errors if an attribute lookup fails
in several sites. Only AttributeError should be silenced.

@item 
bpo-8425@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8425}: Optimize set difference_update for the case when the other set
is much larger than the base set.  (Suggested by Evgeny Kapun with code
contributed by Michele Orrù).

@item 
bpo-37966@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37966}: The implementation of @ref{c3b,,is_normalized()} has
been greatly sped up on strings that aren’t normalized, by implementing
the full normalization-quick-check algorithm from the Unicode standard.

@item 
bpo-37947@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37947}: Adjust correctly the recursion level in the symtable generation
for named expressions. Patch by Pablo Galindo.

@item 
bpo-37812@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37812}: The @code{CHECK_SMALL_INT} macro used inside
@code{Object/longobject.c} has been replaced with an explicit @code{return}
at each call site.

@item 
bpo-37751@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37751}: Fix @ref{b5c,,codecs.lookup()} to normalize the encoding name the
same way than @ref{9fd,,encodings.normalize_encoding()}, except that
@code{codecs.lookup()} also converts the name to lower case.

@item 
bpo-37830@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37830}: Fixed compilation of @ref{17f,,break} and @ref{180,,continue}
in the @ref{1b0,,finally} block when the corresponding @ref{8f7,,try}
block contains @ref{1af,,return} with a non-constant value.

@item 
bpo-20490@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20490}: Improve import error message for partially initialized module
on circular @code{from} imports - by Anthony Sottile.

@item 
bpo-37840@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37840}: Fix handling of negative indices in
@ref{1cf2,,sq_item} of @ref{344,,bytearray}. Patch by
Sergey Fedoseev.

@item 
bpo-37802@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37802}: Slightly improve performance of
@ref{18be,,PyLong_FromUnsignedLong()}, @ref{18bf,,PyLong_FromUnsignedLongLong()}
and @ref{18c0,,PyLong_FromSize_t()}. Patch by Sergey Fedoseev.

@item 
bpo-37409@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37409}: Ensure explicit relative imports from interactive sessions and
scripts (having no parent package) always raise ImportError, rather than
treating the current module as the package. Patch by Ben Lewis.

@item 
bpo-32912@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32912}: Reverted bpo-32912@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32912}: emitting @ref{1ae,,SyntaxWarning} instead
of @ref{1a3,,DeprecationWarning} for invalid escape sequences in string and
bytes literals.

@item 
bpo-37757@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37757}: 
@geindex Python 향상 제안; PEP 572
PEP 572@footnote{https://peps.python.org/pep-0572/}: As described in the PEP, assignment expressions now
raise @ref{18e,,SyntaxError} when their interaction with comprehension scoping
results in an ambiguous target scope.

The @code{TargetScopeError} subclass originally proposed by the PEP has been
removed in favour of just raising regular syntax errors for the disallowed
cases.

@item 
bpo-36279@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36279}: Fix potential use of uninitialized memory in @ref{f95,,os.wait3()}.

@item 
bpo-36311@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36311}: Decoding bytes objects larger than 2GiB is faster and no longer
fails when a multibyte characters spans a chunk boundary.

@item 
bpo-34880@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34880}: The @ref{b60,,assert} statement now works properly if the
@ref{8b7,,AssertionError} exception is being shadowed. Patch by Zackery Spytz.

@item 
bpo-37340@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37340}: Removed object cache (@code{free_list}) for bound method objects.
Temporary bound method objects are less used than before thanks to the
@code{LOAD_METHOD} opcode and the @code{_PyObject_VectorcallMethod} C API.

@item 
bpo-37648@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37648}: Fixed minor inconsistency in @code{list.__contains__()},
@code{tuple.__contains__()} and a few other places. The collection’s item
is now always at the left and the needle is on the right of @code{==}.

@item 
bpo-37444@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37444}: Update differing exception between @code{builtins.__import__()}
and @ref{126c,,importlib.__import__()}.

@item 
bpo-37619@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37619}: When adding a wrapper descriptor from one class to a different
class (for example, setting @code{__add__ = str.__add__} on an @code{int}
subclass), an exception is correctly raised when the operator is called.

@item 
bpo-37593@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37593}: Swap the positions of the `posonlyargs' and `args' parameters
in the constructor of @code{ast.parameters} nodes.

@item 
bpo-37543@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37543}: Optimized pymalloc for non PGO build.

@item 
bpo-37537@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37537}: Compute allocated pymalloc blocks inside
_Py_GetAllocatedBlocks().  This slows down _Py_GetAllocatedBlocks() but
gives a small speedup to _PyObject_Malloc() and _PyObject_Free().

@item 
bpo-37467@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37467}: Fix @ref{a0c,,sys.excepthook()} and @code{PyErr_Display()} if a
filename is a bytes string. For example, for a SyntaxError exception where
the filename attribute is a bytes string.

@item 
bpo-37433@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37433}: Fix @code{SyntaxError} indicator printing too many spaces for
multi-line strings - by Anthony Sottile.

@item 
bpo-37417@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37417}: @ref{1799,,bytearray.extend()} now correctly handles errors that
arise during iteration. Patch by Brandt Bucher.

@item 
bpo-37414@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37414}: The undocumented @code{sys.callstats()} function has been removed.
Since Python 3.7, it was deprecated and always returned @code{None}. It
required a special build option @code{CALL_PROFILE} which was already removed
in Python 3.7.

@item 
bpo-37392@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37392}: Remove @code{sys.getcheckinterval()} and
@code{sys.setcheckinterval()} functions. They were deprecated since Python
3.2. Use @ref{b43,,sys.getswitchinterval()} and @ref{b44,,sys.setswitchinterval()}
instead. Remove also @code{check_interval} field of the
@code{PyInterpreterState} structure.

@item 
bpo-37388@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37388}: In development mode and in debug build, `encoding' and `errors'
arguments are now checked on string encoding and decoding operations.
Examples: @ref{316,,open()}, @ref{ad2,,str.encode()} and @ref{ad3,,bytes.decode()}.

By default, for best performances, the `errors' argument is only checked
at the first encoding/decoding error, and the `encoding' argument is
sometimes ignored for empty strings.

@item 
bpo-37348@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37348}: Optimized decoding short ASCII string with UTF-8 and ascii
codecs. @code{b"foo".decode()} is about 15% faster.  Patch by Inada Naoki.

@item 
bpo-24214@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24214}: Improved support of the surrogatepass error handler in the
UTF-8 and UTF-16 incremental decoders.

@item 
bpo-37330@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37330}: @ref{316,,open()}, @ref{73f,,io.open()}, @ref{315,,codecs.open()} and
@ref{93f,,fileinput.FileInput} no longer accept @code{'U'} (“universal
newline”) in the file mode. This flag was deprecated since Python 3.3.

@item 
bpo-35224@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35224}: Reverse evaluation order of key: value in dict comprehensions
as proposed in PEP 572. I.e. in @code{@{k: v for ...@}}, @code{k} will be
evaluated before @code{v}.

@item 
bpo-37316@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37316}: Fix the @ref{611,,PySys_Audit()} call in @ref{518,,mmap.mmap}.

@item 
bpo-37300@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37300}: Remove an unnecessary Py_XINCREF in classobject.c.

@item 
bpo-37269@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37269}: Fix a bug in the peephole optimizer that was not treating
correctly constant conditions with binary operators. Patch by Pablo
Galindo.

@item 
bpo-20443@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20443}: Python now gets the absolute path of the script filename
specified on the command line (ex: “python3 script.py”): the __file__
attribute of the __main__ module and sys.path[0] become an absolute path,
rather than a relative path.

@item 
bpo-37257@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37257}: Python’s small object allocator (@code{obmalloc.c}) now allows (no
more than) one empty arena to remain available for immediate reuse,
without returning it to the OS.  This prevents thrashing in simple loops
where an arena could be created and destroyed anew on each iteration.

@item 
bpo-37231@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37231}: The dispatching of type slots to special methods (for example
calling @code{__mul__} when doing @code{x * y}) has been made faster.

@item 
bpo-36974@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36974}: Implemented separate vectorcall functions for every calling
convention of builtin functions and methods. This improves performance for
calls.

@item 
bpo-37213@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37213}: Handle correctly negative line offsets in the peephole
optimizer. Patch by Pablo Galindo.

@item 
bpo-37219@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37219}: Remove erroneous optimization for empty set differences.

@item 
bpo-15913@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15913}: Implement @ref{95d,,PyBuffer_SizeFromFormat()} function
(previously documented but not implemented): call @ref{1da6,,struct.calcsize()}.
Patch by Joannah Nanjekye.

@item 
bpo-36922@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36922}: Slot functions optimize any callable with
@code{Py_TPFLAGS_METHOD_DESCRIPTOR} instead of only instances of
@code{function}.

@item 
bpo-36974@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36974}: The slot @code{tp_vectorcall_offset} is inherited unconditionally
to support @code{super().__call__()} when the base class uses vectorcall.

@item 
bpo-37160@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37160}: @ref{c31,,threading.get_native_id()} now also supports NetBSD.

@item 
bpo-37077@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37077}: Add @ref{c31,,threading.get_native_id()} support for AIX. Patch by
M. Felt

@item 
bpo-36781@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36781}: @ref{694,,sum()} has been optimized for boolean values.

@item 
bpo-34556@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34556}: Add @code{--upgrade-deps} to venv module. Patch by Cooper Ry Lees

@item 
bpo-20523@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20523}: @code{pdb.Pdb} supports ~/.pdbrc in Windows 7. Patch by Tim Hopper
and Dan Lidral-Porter.

@item 
bpo-35551@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35551}: Updated encodings: - Removed the “tis260” encoding, which was
an alias for the nonexistent “tactis” codec. - Added “mac_centeuro” as an
alias for the mac_latin2 encoding.

@item 
bpo-19072@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19072}: The @ref{48f,,classmethod} decorator can now wrap other
descriptors such as property objects.  Adapted from a patch written by
Graham Dumpleton.

@item 
bpo-27575@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27575}: Improve speed of dictview intersection by directly using set
intersection logic. Patch by David Su.

@item 
bpo-30773@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30773}: Prohibit parallel running of aclose() / asend() / athrow(). Fix
ag_running to reflect the actual running status of the AG.
@end itemize

@node Library<157>,Documentation<51>,Core and Builtins<154>,Python 3 9 0 alpha 1
@anchor{whatsnew/changelog id702}@anchor{1da7}
@subsubsection Library



@itemize -

@item 
bpo-36589@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36589}: The @ref{fea,,curses.update_lines_cols()} function now returns
@code{None} instead of @code{1} on success.

@item 
bpo-38807@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38807}: Update @ref{198,,TypeError} messages for @ref{19a9,,os.path.join()} to
include @ref{e4a,,os.PathLike} objects as acceptable input types.

@item 
bpo-38724@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38724}: Add a repr for @code{subprocess.Popen} objects. Patch by Andrey
Doroschenko.

@item 
bpo-38786@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38786}: pydoc now recognizes and parses HTTPS URLs. Patch by python273.

@item 
bpo-38785@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38785}: Prevent asyncio from crashing if parent @code{__init__} is not
called from a constructor of object derived from @code{asyncio.Future}.

@item 
bpo-38723@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38723}: @ref{aa,,pdb} now uses @ref{175c,,io.open_code()} to trigger auditing
events.

@item 
bpo-27805@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27805}: Allow opening pipes and other non-seekable files in append mode
with @ref{316,,open()}.

@item 
bpo-38438@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38438}: Simplify the @ref{7,,argparse} usage message for @code{nargs="*"}.

@item 
bpo-38761@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38761}: WeakSet is now registered as a collections.abc.MutableSet.

@item 
bpo-38716@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38716}: logging: change RotatingHandler namer and rotator to
class-level attributes. This stops __init__ from setting them to None in
the case where a subclass defines them with eponymous methods.

@item 
bpo-38713@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38713}: Add @ref{b16,,os.P_PIDFD} constant, which may be passed to
@ref{f98,,os.waitid()} to wait on a Linux process file descriptor.

@item 
bpo-38692@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38692}: Add @code{asyncio.PidfdChildWatcher}, a Linux-specific child
watcher implementation that polls process file descriptors.

@item 
bpo-38692@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38692}: Expose the Linux @code{pidfd_open} syscall as
@ref{6a3,,os.pidfd_open()}.

@item 
bpo-38602@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38602}: Added constants @code{F_OFD_GETLK},
@code{F_OFD_SETLK} and @code{F_OFD_SETLKW} to the
@ref{5d,,fcntl} module. Patch by Donghee Na.

@item 
bpo-38334@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38334}: Fixed seeking backward on an encrypted
@code{zipfile.ZipExtFile}.

@item 
bpo-38312@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38312}: Add @ref{aec,,curses.get_escdelay()}, @ref{aed,,curses.set_escdelay()},
@ref{aee,,curses.get_tabsize()}, and @ref{aef,,curses.set_tabsize()} functions - by
Anthony Sottile.

@item 
bpo-38586@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38586}: Now @ref{d47,,fileConfig()} correctly sets the .name
of handlers loaded.

@item 
bpo-38565@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38565}: Add new cache_parameters() method for functools.lru_cache() to
better support pickling.

@item 
bpo-34679@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34679}: asynci.ProactorEventLoop.close() now only calls
signal.set_wakeup_fd() in the main thread.

@item 
bpo-31202@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31202}: The case the result of @code{pathlib.WindowsPath.glob()} matches
now the case of the pattern for literal parts.

@item 
bpo-36321@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36321}: Remove misspelled attribute.  The 3.8 changelog noted that this
would be removed in 3.9.

@item 
bpo-38521@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38521}: Fixed erroneous equality comparison in statistics.NormalDist().

@item 
bpo-38493@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38493}: Added @ref{b14,,CLD_KILLED} and @ref{b15,,CLD_STOPPED} for
@code{si_code}. Patch by Donghee Na.

@item 
bpo-38478@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38478}: Fixed a bug in @code{inspect.signature.bind()} that was causing
it to fail when handling a keyword argument with same name as
positional-only parameter. Patch by Pablo Galindo.

@item 
bpo-33604@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33604}: Fixed @code{hmac.new} and @code{hmac.HMAC} to raise TypeError instead
of ValueError when the digestmod parameter, now required in 3.8, is
omitted. Also clarified the hmac module documentation and docstrings.

@item 
bpo-38378@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38378}: Parameters `out' and `in' of @ref{d04,,os.sendfile()} was renamed to
`out_fd' and `in_fd'.

@item 
bpo-38417@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38417}: Added support for setting the umask in the child process to the
subprocess module on POSIX systems.

@item 
bpo-38449@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38449}: Revert PR 15522, which introduces a regression in
@ref{516,,mimetypes.guess_type()} due to improper handling of filenames as
urls.

@item 
bpo-38431@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38431}: Fix @code{__repr__} method for @ref{1bb2,,dataclasses.InitVar} to
support typing objects, patch by Samuel Colvin.

@item 
bpo-38109@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38109}: Add missing @ref{11ba,,stat.S_IFDOOR}, @ref{11bb,,stat.S_IFPORT},
@ref{11bc,,stat.S_IFWHT}, @ref{1da8,,stat.S_ISDOOR()}, @ref{1da9,,stat.S_ISPORT()}, and
@ref{1daa,,stat.S_ISWHT()} values to the Python implementation of @ref{d6,,stat}.

@item 
bpo-38422@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38422}: Clarify docstrings of pathlib suffix(es)

@item 
bpo-38405@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38405}: Nested subclasses of @ref{331,,typing.NamedTuple} are now
pickleable.

@item 
bpo-38332@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38332}: Prevent @ref{5e5,,KeyError} thrown by
@code{_encoded_words.decode()} when given an encoded-word with invalid
content-type encoding from propagating all the way to
@code{email.message.get()}.

@item 
bpo-38371@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38371}: Deprecated the @code{split()} method in
@code{_tkinter.TkappType} in favour of the @code{splitlist()} method which
has more consistent and predictable behavior.

@item 
bpo-38341@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38341}: Add @ref{1dab,,smtplib.SMTPNotSupportedError} to the @ref{cf,,smtplib}
exported names.

@item 
bpo-38319@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38319}: sendfile() used in socket and shutil modules was raising
OverflowError for files >= 2GiB on 32-bit architectures.  (patch by
Giampaolo Rodola)

@item 
bpo-38242@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38242}: Revert the new asyncio Streams API

@item 
bpo-13153@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13153}: OS native encoding is now used for converting between Python
strings and Tcl objects.  This allows to display, copy and paste to
clipboard emoji and other non-BMP characters.  Converting strings from Tcl
to Python and back now never fails (except MemoryError).

@item 
bpo-38019@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38019}: Correctly handle pause/resume reading of closed asyncio unix
pipe.

@item 
bpo-38163@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38163}: Child mocks will now detect their type as either synchronous or
asynchronous, asynchronous child mocks will be AsyncMocks and synchronous
child mocks will be either MagicMock or Mock (depending on their parent
type).

@item 
bpo-38161@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38161}: Removes _AwaitEvent from AsyncMock.

@item 
bpo-38216@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38216}: Allow the rare code that wants to send invalid http requests
from the @code{http.client} library a way to do so.  The fixes for bpo-30458@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30458}
led to breakage for some projects that were relying on this ability to
test their own behavior in the face of bad requests.

@item 
bpo-28286@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28286}: Deprecate opening @ref{65a,,GzipFile} for writing
implicitly.  Always specify the `mode' argument for writing.

@item 
bpo-38108@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38108}: Any synchronous magic methods on an AsyncMock now return a
MagicMock. Any asynchronous magic methods on a MagicMock now return an
AsyncMock.

@item 
bpo-38265@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38265}: Update the `length' parameter of @ref{d55,,os.pread()} to accept
@ref{c54,,Py_ssize_t} instead of int.

@item 
bpo-38112@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38112}: @ref{21,,compileall} has a higher default recursion limit and new
command-line arguments for path manipulation, symlinks handling, and
multiple optimization levels.

@item 
bpo-38248@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38248}: asyncio: Fix inconsistent immediate Task cancellation

@item 
bpo-38237@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38237}: The arguments for the builtin pow function are more
descriptive. They can now also be passed in as keywords.

@item 
bpo-34002@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34002}: Improve efficiency in parts of email package by changing
while-pop to a for loop, using isdisjoint instead of set intersections.

@item 
bpo-38191@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38191}: Constructors of @ref{331,,NamedTuple} and
@ref{332,,TypedDict} types now accept arbitrary keyword argument
names, including “cls”, “self”, “typename”, “_typename”, “fields” and
“_fields”.

@item 
bpo-38155@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38155}: Add @code{__all__} to  @ref{34,,datetime}. Patch by Tahia Khan.

@item 
bpo-38185@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38185}: Fixed case-insensitive string comparison in
@ref{1070,,sqlite3.Row} indexing.

@item 
bpo-38136@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38136}: Changes AsyncMock call count and await count to be two
different counters. Now await count only counts when a coroutine has been
awaited, not when it has been called, and vice-versa. Update the
documentation around this.

@item 
bpo-37828@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37828}: Fix default mock name in
@ref{ef3,,unittest.mock.Mock.assert_called()} exceptions. Patch by Abraham
Toriz Cruz.

@item 
bpo-38175@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38175}: Fix a memory leak in comparison of @ref{1070,,sqlite3.Row}
objects.

@item 
bpo-33936@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33936}: _hashlib no longer calls obsolete OpenSSL initialization
function with OpenSSL 1.1.0+.

@item 
bpo-34706@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34706}: Preserve subclassing in inspect.Signature.from_callable.

@item 
bpo-38153@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38153}: Names of hashing algorithms from OpenSSL are now normalized to
follow Python’s naming conventions. For example OpenSSL uses sha3-512
instead of sha3_512 or blake2b512 instead of blake2b.

@item 
bpo-38115@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38115}: Fix a bug in dis.findlinestarts() where it would return invalid
bytecode offsets. Document that a code object’s co_lnotab can contain
invalid bytecode offsets.

@item 
bpo-38148@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38148}: Add slots to @ref{b,,asyncio} transport classes, which can reduce
memory usage.

@item 
bpo-38142@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38142}: The _hashlib OpenSSL wrapper extension module is now PEP-384
compliant.

@item 
bpo-9216@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9216}: hashlib constructors now support usedforsecurity flag to signal
that a hashing algorithm is not used in a security context.

@item 
bpo-36991@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36991}: Fixes a potential incorrect AttributeError exception escaping
ZipFile.extract() in some unsupported input error situations.

@item 
bpo-38134@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38134}: Remove obsolete copy of PBKDF2_HMAC_fast. All supported OpenSSL
versions contain a fast implementation.

@item 
bpo-38132@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38132}: The OpenSSL hashlib wrapper uses a simpler implementation.
Several Macros and pointless caches are gone. The hash name now comes from
OpenSSL’s EVP. The algorithm name stays the same, except it is now always
lower case.

@item 
bpo-38008@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38008}: Fix parent class check in protocols to correctly identify the
module that provides a builtin protocol, instead of assuming they all come
from the @ref{1f,,collections.abc} module

@item 
bpo-34037@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34037}: For @ref{b,,asyncio}, add a new coroutine
@code{loop.shutdown_default_executor()}. The new coroutine provides an API
to schedule an executor shutdown that waits on the threadpool to finish
closing. Also, @ref{2f3,,asyncio.run()} has been updated to utilize the new
coroutine. Patch by Kyle Stanley.

@item 
bpo-37405@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37405}: Fixed regression bug for socket.getsockname() for non-CAN_ISOTP
AF_CAN address family sockets by returning a 1-tuple instead of string.

@item 
bpo-38121@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38121}: Update parameter names on functions in importlib.metadata
matching the changes in the 0.22 release of importlib_metadata.

@item 
bpo-38110@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38110}: The os.closewalk() implementation now uses the libc fdwalk()
API on platforms where it is available.

@item 
bpo-38093@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38093}: Fixes AsyncMock so it doesn’t crash when used with
AsyncContextManagers or AsyncIterators.

@item 
bpo-37488@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37488}: Add warning to @code{datetime.utctimetuple()},
@code{datetime.utcnow()} and @code{datetime.utcfromtimestamp()} .

@item 
bpo-35640@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35640}: Allow passing a @ref{5a0,,path-like object} as @code{directory}
argument to the @ref{d37,,http.server.SimpleHTTPRequestHandler} class. Patch
by Géry Ogam.

@item 
bpo-38086@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38086}: Update importlib.metadata with changes from importlib_metadata 0.21@footnote{https://gitlab.com/python-devs/importlib_metadata/blob/0.21/importlib_metadata/docs/changelog.rst}.

@item 
bpo-37251@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37251}: Remove @code{__code__} check in AsyncMock that incorrectly
evaluated function specs as async objects but failed to evaluate classes
with @code{__await__} but no @code{__code__} attribute defined as async objects.

@item 
bpo-38037@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38037}: Fix reference counters in the @ref{cb,,signal} module.

@item 
bpo-38066@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38066}: Hide internal asyncio.Stream methods: feed_eof(), feed_data(),
set_exception() and set_transport().

@item 
bpo-38059@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38059}: inspect.py now uses sys.exit() instead of exit()

@item 
bpo-38049@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38049}: Added command-line interface for the @ref{9,,ast} module.

@item 
bpo-37953@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37953}: In @ref{10a,,typing}, improved the @code{__hash__} and @code{__eq__}
methods for @code{ForwardReferences}.

@item 
bpo-38026@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38026}: Fixed @ref{6bb,,inspect.getattr_static()} used @code{isinstance} while
it should avoid dynamic lookup.

@item 
bpo-35923@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35923}: Update @ref{eac,,importlib.machinery.BuiltinImporter} to use
@code{loader._ORIGIN} instead of a hardcoded value. Patch by Donghee Na.

@item 
bpo-38010@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38010}: In @code{importlib.metadata} sync with @code{importlib_metadata}
0.20, clarifying behavior of @code{files()} and fixing issue where only one
requirement was returned for @code{requires()} on @code{dist-info} packages.

@item 
bpo-38006@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38006}: weakref.WeakValueDictionary defines a local remove() function
used as callback for weak references. This function was created with a
closure. Modify the implementation to avoid the closure.

@item 
bpo-37995@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37995}: Added the `indent' option to @ref{ae1,,ast.dump()} which allows it
to produce a multiline indented output.

@item 
bpo-34410@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34410}: Fixed a crash in the @code{tee()} iterator when re-enter it.
RuntimeError is now raised in this case.

@item 
bpo-37140@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37140}: Fix a ctypes regression of Python 3.8. When a ctypes.Structure
is passed by copy to a function, ctypes internals created a temporary
object which had the side effect of calling the structure finalizer
(__del__) twice. The Python semantics requires a finalizer to be called
exactly once. Fix ctypes internals to no longer call the finalizer twice.

@item 
bpo-37587@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37587}: @code{_json.scanstring} is now up to 3x faster when there are many
backslash escaped characters in the JSON string.

@item 
bpo-37834@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37834}: Prevent shutil.rmtree exception when built on non-Windows
system without fd system call support, like older versions of macOS.

@item 
bpo-10978@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10978}: Semaphores and BoundedSemaphores can now release more than one
waiting thread at a time.

@item 
bpo-37972@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37972}: Subscripts to the @code{unittest.mock.call} objects now receive
the same chaining mechanism as any other custom attributes, so that the
following usage no longer raises a @code{TypeError}:

@code{call().foo().__getitem__('bar')}

Patch by blhsing

@item 
bpo-37965@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37965}: Fix C compiler warning caused by
distutils.ccompiler.CCompiler.has_function.

@item 
bpo-37964@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37964}: Add @code{F_GETPATH} command to @ref{5d,,fcntl}.

@item 
bpo-37960@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37960}: @code{repr()} of buffered and text streams now silences only
expected exceptions when get the value of “name” and “mode” attributes.

@item 
bpo-37961@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37961}: Add a @code{total_nframe} field to the traces collected by the
tracemalloc module. This field indicates the original number of frames
before it was truncated.

@item 
bpo-37951@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37951}: Most features of the subprocess module now work again in
subinterpreters. Only `preexec_fn' is restricted in subinterpreters.

@item 
bpo-36205@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36205}: Fix the rusage implementation of time.process_time() to
correctly report the sum of the system and user CPU time.

@item 
bpo-37950@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37950}: Fix @ref{ae1,,ast.dump()} when call with incompletely initialized
node.

@item 
bpo-34679@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34679}: Restores instantiation of Windows IOCP event loops from the
non-main thread.

@item 
bpo-36917@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36917}: Add default implementation of the
@ref{c62,,ast.NodeVisitor.visit_Constant()} method which emits a deprecation
warning and calls corresponding methods @code{visit_Num()}, @code{visit_Str()},
etc.

@item 
bpo-37798@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37798}: Update test_statistics.py to verify that the statistics module
works well for both C and Python implementations. Patch by Donghee Na

@item 
bpo-26589@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26589}: Added a new status code to the http module: 451
UNAVAILABLE_FOR_LEGAL_REASONS

@item 
bpo-37915@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37915}: Fix a segmentation fault that appeared when comparing instances
of @code{datetime.timezone} and @code{datetime.tzinfo} objects. Patch by Pablo
Galindo.

@item 
bpo-32554@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32554}: Deprecate having random.seed() call hash on arbitrary types.

@item 
bpo-9938@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9938}: Add optional keyword argument @code{exit_on_error} for
@code{ArgumentParser}.

@item 
bpo-37851@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37851}: The @ref{5c,,faulthandler} module no longer allocates its
alternative stack at Python startup. Now the stack is only allocated at
the first faulthandler usage.

@item 
bpo-32793@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32793}: Fix a duplicated debug message when
@ref{1dac,,smtplib.SMTP.connect()} is called.

@item 
bpo-37885@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37885}: venv: Don’t generate unset variable warning on deactivate.

@item 
bpo-37868@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37868}: Fix dataclasses.is_dataclass when given an instance that never
raises AttributeError in __getattr__.  That is, an object that returns
something for __dataclass_fields__ even if it’s not a dataclass.

@item 
bpo-37811@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37811}: Fix @code{socket} module’s @code{socket.connect(address)} function
being unable to establish connection in case of interrupted system call.
The problem was observed on all OSes which @code{poll(2)} system call can
take only non-negative integers and -1 as a timeout value.

@item 
bpo-37863@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37863}: Optimizations for Fraction.__hash__ suggested by Tim Peters.

@item 
bpo-21131@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21131}: Fix @code{faulthandler.register(chain=True)} stack. faulthandler
now allocates a dedicated stack of @code{SIGSTKSZ*2} bytes, instead of just
@code{SIGSTKSZ} bytes. Calling the previous signal handler in faulthandler
signal handler uses more than @code{SIGSTKSZ} bytes of stack memory on some
platforms.

@item 
bpo-37798@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37798}: Add C fastpath for statistics.NormalDist.inv_cdf() Patch by
Donghee Na

@item 
bpo-37804@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37804}: Remove the deprecated method @code{threading.Thread.isAlive()}.
Patch by Donghee Na.

@item 
bpo-37819@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37819}: Add Fraction.as_integer_ratio() to match the corresponding
methods in bool, int, float, and decimal.

@item 
bpo-14465@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14465}: Add an xml.etree.ElementTree.indent() function for
pretty-printing XML trees. Contributed by Stefan Behnel.

@item 
bpo-37810@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37810}: Fix @ref{3b,,difflib} @code{?} hint in diff output when dealing with
tabs.  Patch by Anthony Sottile.

@item 
bpo-37772@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37772}: In @code{zipfile.Path}, when adding implicit dirs, ensure that
ancestral directories are added and that duplicates are excluded.

@item 
bpo-18578@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18578}: Renamed and documented @code{test.bytecode_helper} as
@code{test.support.bytecode_helper}. Patch by Joannah Nanjekye.

@item 
bpo-37785@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37785}: Fix xgettext warnings in @ref{7,,argparse}.

@item 
bpo-34488@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34488}: @code{writelines()} method of @ref{10a3,,io.BytesIO} is now
slightly faster when many small lines are passed. Patch by Sergey
Fedoseev.

@item 
bpo-37449@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37449}: @code{ensurepip} now uses @code{importlib.resources.read_binary()} to
read data instead of @code{pkgutil.get_data()}. Patch by Joannah Nanjekye.

@item 
bpo-28292@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28292}: Mark calendar.py helper functions as being private.  The
follows PEP 8 guidance to maintain the style conventions in the module and
it addresses a known case of user confusion.

@item 
bpo-18049@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18049}: Add definition of THREAD_STACK_SIZE for AIX in
Python/thread_pthread.h The default thread stacksize caused crashes with
the default recursion limit Patch by M Felt

@item 
bpo-37742@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37742}: The logging.getLogger() API now returns the root logger when
passed the name ‘root’, whereas previously it returned a non-root logger
named ‘root’. This could affect cases where user code explicitly wants a
non-root logger named ‘root’, or instantiates a logger using
logging.getLogger(__name__) in some top-level module called ‘root.py’.

@item 
bpo-37738@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37738}: Fix the implementation of curses @code{addch(str, color_pair)}:
pass the color pair to @code{setcchar()}, instead of always passing 0 as the
color pair.

@item 
bpo-37723@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37723}: Fix performance regression on regular expression parsing with
huge character sets. Patch by Yann Vaginay.

@item 
bpo-35943@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35943}: The function @ref{dab,,PyImport_GetModule()} now ensures any
module it returns is fully initialized. Patch by Joannah Nanjekye.

@item 
bpo-32178@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32178}: Fix IndexError in @ref{3f,,email} package when trying to parse
invalid address fields starting with @code{:}.

@item 
bpo-37268@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37268}: The @code{parser} module is deprecated and will be removed in
future versions of Python.

@item 
bpo-11953@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11953}: Completing WSA* error codes in @ref{d1,,socket}.

@item 
bpo-37685@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37685}: Fixed comparisons of @ref{bc2,,datetime.timedelta} and
@ref{12c4,,datetime.timezone}.

@item 
bpo-37697@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37697}: Synchronize @code{importlib.metadata} with importlib_metadata 0.19@footnote{https://gitlab.com/python-devs/importlib_metadata/-/milestones/20},
improving handling of EGG-INFO files and fixing a crash when entry point
names contained colons.

@item 
bpo-37695@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37695}: Correct @ref{129d,,curses.unget_wch()} error message.  Patch by
Anthony Sottile.

@item 
bpo-37689@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37689}: Add @code{is_relative_to()} in @code{PurePath} to determine
whether or not one path is relative to another.

@item 
bpo-29553@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29553}: Fixed @ref{1dad,,argparse.ArgumentParser.format_usage()} for mutually
exclusive groups. Patch by Andrew Nester.

@item 
bpo-37691@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37691}: Let math.dist() accept coordinates as sequences (or iterables)
rather than just tuples.

@item 
bpo-37685@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37685}: Fixed @code{__eq__}, @code{__lt__} etc implementations in some
classes. They now return @ref{1a2,,NotImplemented} for unsupported type of
the other operand. This allows the other operand to play role (for example
the equality comparison with @ref{1dae,,ANY} will return
@code{True}).

@item 
bpo-37354@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37354}: Make Activate.ps1 Powershell script static to allow for signing
it.

@item 
bpo-37664@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37664}: Update wheels bundled with ensurepip (pip 19.2.3 and setuptools
41.2.0)

@item 
bpo-37663@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37663}: Bring consistency to venv shell activation scripts by always
using __VENV_PROMPT__.

@item 
bpo-37642@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37642}: Allowed the pure Python implementation of
@ref{12c4,,datetime.timezone} to represent sub-minute offsets close to
minimum and maximum boundaries, specifically in the ranges (23:59, 24:00)
and (-23:59, 24:00). Patch by Ngalim Siregar

@item 
bpo-36161@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36161}: In @ref{b2,,posix}, use @code{ttyname_r} instead of @code{ttyname} for
thread safety.

@item 
bpo-36324@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36324}: Make internal attributes for statistics.NormalDist() private.

@item 
bpo-37555@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37555}: Fix @code{NonCallableMock._call_matcher} returning tuple instead
of @code{_Call} object when @code{self._spec_signature} exists. Patch by
Elizabeth Uselton

@item 
bpo-29446@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29446}: Make @code{from tkinter import *} import only the expected
objects.

@item 
bpo-16970@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16970}: Adding a value error when an invalid value in passed to nargs
Patch by Robert Leenders

@item 
bpo-34443@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34443}: Exceptions from @ref{5a,,enum} now use the @code{__qualname} of the
enum class in the exception message instead of the @code{__name__}.

@item 
bpo-37491@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37491}: Fix @code{IndexError} when parsing email headers with unexpectedly
ending bare-quoted string value. Patch by Abhilash Raj.

@item 
bpo-37587@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37587}: Make json.loads faster for long strings. (Patch by Marco
Paolini)

@item 
bpo-18378@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18378}: Recognize “UTF-8” as a valid value for LC_CTYPE in
locale._parse_localename.

@item 
bpo-37579@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37579}: Return @ref{1a2,,NotImplemented} in Python implementation of
@code{__eq__} for @ref{bc2,,timedelta} and @ref{1fb,,time}
when the other object being compared is not of the same type to match C
implementation. Patch by Karthikeyan Singaravelan.

@item 
bpo-21478@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21478}: Record calls to parent when autospecced object is attached to a
mock using @code{unittest.mock.attach_mock()}. Patch by Karthikeyan
Singaravelan.

@item 
bpo-37531@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37531}: “python3 -m test -jN –timeout=TIMEOUT” now kills a worker
process if it runs longer than `TIMEOUT' seconds.

@item 
bpo-37482@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37482}: Fix serialization of display name in originator or destination
address fields with both encoded words and special chars.

@item 
bpo-36993@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36993}: Improve error reporting for corrupt zip files with bad zip64
extra data. Patch by Daniel Hillier.

@item 
bpo-37502@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37502}: pickle.loads() no longer raises TypeError when the buffers
argument is set to None

@item 
bpo-37520@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37520}: Correct behavior for zipfile.Path.parent when the path object
identifies a subdirectory.

@item 
bpo-18374@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18374}: Fix the @code{.col_offset} attribute of nested @ref{1daf,,ast.BinOp}
instances which had a too large value in some situations.

@item 
bpo-37424@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37424}: Fixes a possible hang when using a timeout on
@code{subprocess.run()} while capturing output.  If the child process spawned
its own children or otherwise connected its stdout or stderr handles with
another process, we could hang after the timeout was reached and our child
was killed when attempting to read final output from the pipes.

@item 
bpo-37421@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37421}: Fix @code{multiprocessing.util.get_temp_dir()} finalizer: clear
also the ‘tempdir’ configuration of the current process, so next call to
@code{get_temp_dir()} will create a new temporary directory, rather than
reusing the removed temporary directory.

@item 
bpo-37481@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37481}: The distutils @code{bdist_wininst} command is deprecated in Python
3.8, use @code{bdist_wheel} (wheel packages) instead.

@item 
bpo-37479@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37479}: When @code{Enum.__str__} is overridden in a derived class, the
override will be used by @code{Enum.__format__} regardless of whether mixin
classes are present.

@item 
bpo-37440@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37440}: http.client now enables TLS 1.3 post-handshake authentication
for default context or if a cert_file is passed to HTTPSConnection.

@item 
bpo-37437@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37437}: Update vendorized expat version to 2.2.7.

@item 
bpo-37428@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37428}: SSLContext.post_handshake_auth = True no longer sets
SSL_VERIFY_POST_HANDSHAKE verify flag for client connections. Although the
option is documented as ignored for clients, OpenSSL implicitly enables
cert chain validation when the flag is set.

@item 
bpo-37420@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37420}: @ref{1313,,os.sched_setaffinity()} now correctly handles errors that
arise during iteration over its @code{mask} argument. Patch by Brandt Bucher.

@item 
bpo-37412@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37412}: The @ref{c81,,os.getcwdb()} function now uses the UTF-8 encoding on
Windows, rather than the ANSI code page: see 
@geindex Python 향상 제안; PEP 529
PEP 529@footnote{https://peps.python.org/pep-0529/} for the rationale.
The function is no longer deprecated on Windows.

@item 
bpo-37406@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37406}: The sqlite3 module now raises TypeError, rather than
ValueError, if operation argument type is not str: execute(),
executemany() and calling a connection.

@item 
bpo-29412@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29412}: Fix IndexError in parsing a header value ending unexpectedly.
Patch by Abhilash Raj.

@item 
bpo-36546@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36546}: The `dist' argument for statistics.quantiles() is now
positional only. The current name doesn’t reflect that the argument can be
either a dataset or a distribution.  Marking the parameter as positional
avoids confusion and makes it possible to change the name later.

@item 
bpo-37394@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37394}: Fix a bug that was causing the @ref{bb,,queue} module to fail if
the accelerator module was not available. Patch by Pablo Galindo.

@item 
bpo-37376@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37376}: @ref{b3,,pprint} now has support for
@ref{4e5,,types.SimpleNamespace}. Patch by Carl Bordum Hansen.

@item 
bpo-26967@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26967}: An @ref{1bd,,ArgumentParser} with
@code{allow_abbrev=False} no longer disables grouping of short flags, such as
@code{-vv}, but only disables abbreviation of long flags as documented. Patch
by Zac Hatfield-Dodds.

@item 
bpo-37212@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37212}: @ref{1db0,,unittest.mock.call()} now preserves the order of keyword
arguments in repr output. Patch by Karthikeyan Singaravelan.

@item 
bpo-37372@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37372}: Fix error unpickling datetime.time objects from Python 2 with
seconds>=24. Patch by Justin Blanchard.

@item 
bpo-37345@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37345}: Add formal support for UDPLITE sockets. Support was present
before, but it is now easier to detect support with @code{hasattr(socket,
'IPPROTO_UDPLITE')} and there are constants defined for each of the
values needed: @code{socket.IPPROTO_UDPLITE}, @code{UDPLITE_SEND_CSCOV}, and
@code{UDPLITE_RECV_CSCOV}. Patch by Gabe Appleton.

@item 
bpo-37358@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37358}: Optimized @code{functools.partial} by using vectorcall.

@item 
bpo-37347@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37347}: @ref{5a7,,sqlite3.Connection.create_aggregate()},
@ref{5a6,,sqlite3.Connection.create_function()},
@ref{5a8,,sqlite3.Connection.set_authorizer()},
@ref{5a9,,sqlite3.Connection.set_progress_handler()}
@ref{5aa,,sqlite3.Connection.set_trace_callback()} methods lead to segfaults if
some of these methods are called twice with an equal object but not the
same. Now callbacks are stored more carefully. Patch by Aleksandr Balezin.

@item 
bpo-37163@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37163}: The `obj' argument of @ref{1a6a,,dataclasses.replace()} is
positional-only now.

@item 
bpo-37085@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37085}: Add the optional Linux SocketCAN Broadcast Manager constants,
used as flags to configure the BCM behaviour, in the socket module.  Patch
by Karl Ding.

@item 
bpo-37328@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37328}: @code{HTMLParser.unescape} is removed.  It was undocumented and
deprecated since Python 3.4.

@item 
bpo-37305@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37305}: Add .webmanifest -> application/manifest+json to list of
recognized file types and content type headers

@item 
bpo-37320@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37320}: @code{aifc.openfp()} alias to @code{aifc.open()}, @code{sunau.openfp()}
alias to @code{sunau.open()}, and @code{wave.openfp()} alias to @code{wave.open()}
have been removed. They were deprecated since Python 3.7.

@item 
bpo-37315@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37315}: Deprecated accepting floats with integral value (like @code{5.0})
in @ref{b41,,math.factorial()}.

@item 
bpo-37312@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37312}: @code{_dummy_thread} and @code{dummy_threading} modules have been
removed. These modules were deprecated since Python 3.7 which requires
threading support.

@item 
bpo-33972@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33972}: Email with single part but content-type set to @code{multipart/*}
doesn’t raise AttributeError anymore.

@item 
bpo-37280@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37280}: Use threadpool for reading from file for sendfile fallback
mode.

@item 
bpo-37279@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37279}: Fix asyncio sendfile support when sendfile sends extra data in
fallback mode.

@item 
bpo-19865@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19865}: @ref{1db1,,ctypes.create_unicode_buffer()} now also supports non-BMP
characters on platforms with 16-bit @code{wchar_t} (for example,
Windows and AIX).

@item 
bpo-37266@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37266}: In a subinterpreter, spawning a daemon thread now raises an
exception. Daemon threads were never supported in subinterpreters.
Previously, the subinterpreter finalization crashed with a Python fatal
error if a daemon thread was still running.

@item 
bpo-37210@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37210}: Allow pure Python implementation of @ref{ab,,pickle} to work even
when the C @code{_pickle} module is unavailable.

@item 
bpo-21872@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21872}: Fix @ref{8e,,lzma}: module decompresses data incompletely. When
decompressing a FORMAT_ALONE format file, and it doesn’t have the end
marker, sometimes the last one to dozens bytes can’t be output. Patch by
Ma Lin.

@item 
bpo-35922@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35922}: Fix @code{RobotFileParser.crawl_delay()} and
@code{RobotFileParser.request_rate()} to return @code{None} rather than raise
@ref{5ee,,AttributeError} when no relevant rule is defined in the robots.txt
file.  Patch by Rémi Lapeyre.

@item 
bpo-35766@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35766}: Change the format of feature_version to be a (major, minor)
tuple.

@item 
bpo-36607@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36607}: Eliminate @ref{244,,RuntimeError} raised by
@ref{b4f,,asyncio.all_tasks()} if internal tasks weak set is changed by another
thread during iteration.

@item 
bpo-18748@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18748}: @code{_pyio.IOBase} destructor now does nothing if getting
the @code{closed} attribute fails to better mimic @code{_io.IOBase}
finalizer.

@item 
bpo-36402@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36402}: Fix a race condition at Python shutdown when waiting for
threads. Wait until the Python thread state of all non-daemon threads get
deleted (join all non-daemon threads), rather than just wait until
non-daemon Python threads complete.

@item 
bpo-37206@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37206}: Default values which cannot be represented as Python objects no
longer improperly represented as @code{None} in function signatures.

@item 
bpo-37111@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37111}: Added @code{encoding} and @code{errors} keyword parameters to
@code{logging.basicConfig}.

@item 
bpo-12144@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12144}: Ensure cookies with @code{expires} attribute are handled in
@code{CookieJar.make_cookies()}.

@item 
bpo-34886@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34886}: Fix an unintended ValueError from @ref{d7e,,subprocess.run()} when
checking for conflicting `input' and `stdin' or `capture_output' and
`stdout' or `stderr' args when they were explicitly provided but with
@code{None} values within a passed in @code{**kwargs} dict rather than as passed
directly by name. Patch contributed by Rémi Lapeyre.

@item 
bpo-37173@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37173}: The exception message for @code{inspect.getfile()} now correctly
reports the passed class rather than the builtins module.

@item 
bpo-37178@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37178}: Give math.perm() a one argument form that means the same as
math.factorial().

@item 
bpo-37178@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37178}: For math.perm(n, k), let k default to n, giving the same result
as factorial.

@item 
bpo-37165@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37165}: Converted _collections._count_elements to use the Argument
Clinic.

@item 
bpo-34767@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34767}: Do not always create a @ref{7f3,,collections.deque} in
@ref{c65,,asyncio.Lock}.

@item 
bpo-37158@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37158}: Speed-up statistics.fmean() by switching from a function to a
generator.

@item 
bpo-34282@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34282}: Remove @code{Enum._convert} method, deprecated in 3.8.

@item 
bpo-37150@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37150}: @code{argparse._ActionsContainer.add_argument} now throws error,
if someone accidentally pass FileType class object instead of instance of
FileType as @code{type} argument.

@item 
bpo-28724@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28724}: The socket module now has the @ref{b2d,,socket.send_fds()} and
@code{socket.recv.fds()} methods. Contributed by Joannah Nanjekye, Shinya
Okano and Victor Stinner.

@item 
bpo-35621@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35621}: Support running asyncio subprocesses when execution event loop
in a thread on UNIX.

@item 
bpo-36520@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36520}: Lengthy email headers with UTF-8 characters are now properly
encoded when they are folded. Patch by Jeffrey Kintscher.

@item 
bpo-30835@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30835}: Fixed a bug in email parsing where a message with invalid bytes
in content-transfer-encoding of a multipart message can cause an
AttributeError. Patch by Andrew Donnellan.

@item 
bpo-31163@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31163}: pathlib.Path instance’s rename and replace methods now return
the new Path instance.

@item 
bpo-25068@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25068}: @ref{1db2,,urllib.request.ProxyHandler} now lowercases the keys of
the passed dictionary.

@item 
bpo-26185@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26185}: Fix @ref{1c1,,repr()} on empty @code{ZipInfo} object. Patch by
Mickaël Schoentgen.

@item 
bpo-21315@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21315}: Email headers containing RFC2047 encoded words are parsed
despite the missing whitespace, and a defect registered. Also missing
trailing whitespace after encoded words is now registered as a defect.

@item 
bpo-31904@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31904}: Port test_datetime to VxWorks: skip zoneinfo tests on VxWorks

@item 
bpo-35805@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35805}: Add parser for Message-ID header and add it to default
HeaderRegistry. This should prevent folding of Message-ID using RFC 2048
encoded words.

@item 
bpo-36871@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36871}: Ensure method signature is used instead of constructor
signature of a class while asserting mock object against method calls.
Patch by Karthikeyan Singaravelan.

@item 
bpo-35070@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35070}: posix.getgrouplist() now works correctly when the user belongs
to NGROUPS_MAX supplemental groups. Patch by Jeffrey Kintscher.

@item 
bpo-31783@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31783}: Fix race condition in ThreadPoolExecutor when worker threads
are created during interpreter shutdown.

@item 
bpo-36582@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36582}: Fix @code{UserString.encode()} to correctly return @code{bytes}
rather than a @code{UserString} instance.

@item 
bpo-32424@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32424}: Deprecate xml.etree.ElementTree.Element.copy() in favor of
copy.copy().

Patch by Gordon P. Hemsley

@item 
bpo-36564@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36564}: Fix infinite loop in email header folding logic that would be
triggered when an email policy’s max_line_length is not long enough to
include the required markup and any values in the message. Patch by Paul
Ganssle

@item 
bpo-36543@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36543}: Removed methods Element.getchildren(), Element.getiterator()
and ElementTree.getiterator() and the xml.etree.cElementTree module.

@item 
bpo-36409@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36409}: Remove the old plistlib API deprecated in Python 3.4

@item 
bpo-36302@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36302}: distutils sorts source file lists so that Extension .so files
build more reproducibly by default

@item 
bpo-36250@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36250}: Ignore @code{ValueError} from @code{signal} with @code{interaction} in
non-main thread.

@item 
bpo-36046@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36046}: Added @code{user}, @code{group} and @code{extra_groups} parameters to
the subprocess.Popen constructor. Patch by Patrick McLean.

@item 
bpo-32627@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32627}: Fix compile error when @code{_uuid} headers conflicting included.

@item 
bpo-35800@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35800}: Deprecate @code{smtpd.MailmanProxy} ready for future removal.

@item 
bpo-35168@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35168}: @ref{1db3,,shlex.shlex.punctuation_chars} is now a read-only
property.

@item 
bpo-8538@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8538}: Add support for boolean actions like @code{--foo} and @code{--no-foo}
to argparse. Patch contributed by Rémi Lapeyre.

@item 
bpo-20504@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20504}: Fixes a bug in @code{cgi} module when a multipart/form-data
request has no @code{Content-Length} header.

@item 
bpo-25988@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25988}: The abstract base classes in @ref{1f,,collections.abc} no longer
are exposed in the regular @ref{1e,,collections} module.

@item 
bpo-11122@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11122}: Distutils won’t check for rpmbuild in specified paths only.

@item 
bpo-34775@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34775}: Division handling of PurePath now returns NotImplemented
instead of raising a TypeError when passed something other than an
instance of str or PurePath. Patch by Roger Aiudi.

@item 
bpo-34749@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34749}: @ref{1762,,binascii.a2b_base64()} is now up to 2 times faster. Patch
by Sergey Fedoseev.

@item 
bpo-34519@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34519}: Add additional aliases for HP Roman 8. Patch by Michael Osipov.

@item 
bpo-28009@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28009}: Fix uuid.getnode() on platforms with ‘.’ as MAC Addr delimiter
as well fix for MAC Addr format that omits a leading 0 in MAC Addr values.
Currently, AIX is the only know platform with these settings. Patch by
Michael Felt.

@item 
bpo-30618@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30618}: Add @ref{b1a,,readlink()}. Patch by Girts Folkmanis.

@item 
bpo-32498@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32498}: Made @ref{1af9,,urllib.parse.unquote()} accept bytes in addition to
strings. Patch by Stein Karlsen.

@item 
bpo-33348@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33348}: lib2to3 now recognizes expressions after @code{*} and @code{**} like
in @code{f(*[] or [])}.

@item 
bpo-32689@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32689}: Update @ref{c50,,shutil.move()} function to allow for Path objects
to be used as source argument. Patch by Emily Morehouse and Maxwell
“5.13b” McKinnon.

@item 
bpo-32820@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32820}: Added @code{__format__} to IPv4 and IPv6 classes.  Always outputs
a fully zero-padded string. Supports b/x/n modifiers (bin/hex/native
format). Native format for IPv4 is bin, native format for IPv6 is hex.
Also supports ‘#’ and ‘_’ modifiers.

@item 
bpo-27657@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27657}: Fix urllib.parse.urlparse() with numeric paths. A string like
“path:80” is no longer parsed as a path but as a scheme (“path”) and a
path (“80”).

@item 
bpo-4963@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4963}: Fixed non-deterministic behavior related to mimetypes extension
mapping and module reinitialization.
@end itemize

@node Documentation<51>,Tests<50>,Library<157>,Python 3 9 0 alpha 1
@anchor{whatsnew/changelog id703}@anchor{1db4}
@subsubsection Documentation



@itemize -

@item 
bpo-21767@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21767}: Explicitly mention abc support in functools.singledispatch

@item 
bpo-38816@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38816}: Provides more details about the interaction between
@code{fork()} and CPython’s runtime, focusing just on the C-API.  This
includes cautions about where @code{fork()} should and shouldn’t be
called.

@item 
bpo-38351@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38351}: Modernize @ref{3f,,email} examples from %-formatting to f-strings.

@item 
bpo-38778@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38778}: Document the fact that @ref{244,,RuntimeError} is raised if
@ref{4b6,,os.fork()} is called in a subinterpreter.

@item 
bpo-38592@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38592}: Add Brazilian Portuguese to the language switcher at Python
Documentation website.

@item 
bpo-38294@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38294}: Add list of no-longer-escaped chars to re.escape documentation

@item 
bpo-38053@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38053}: Modernized the plistlib documentation

@item 
bpo-26868@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26868}: Fix example usage of @ref{608,,PyModule_AddObject()} to properly
handle errors.

@item 
bpo-36797@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36797}: Fix a dead link in the distutils API Reference.

@item 
bpo-37977@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37977}: Warn more strongly and clearly about pickle insecurity

@item 
bpo-37979@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37979}: Added a link to dateutil.parser.isoparse in the
datetime.fromisoformat documentation. Patch by Paul Ganssle

@item 
bpo-12707@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12707}: Deprecate info(), geturl(), getcode() methods in favor of the
headers, url, and status properties, respectively, for HTTPResponse and
addinfourl. Also deprecate the code attribute of addinfourl in favor of
the status attribute. Patch by Ashwin Ramaswami

@item 
bpo-37937@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37937}: Mention @code{frame.f_trace} in @ref{2e1,,sys.settrace()} docs.

@item 
bpo-37878@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37878}: Make @ref{1db5,,PyThreadState_DeleteCurrent()} Internal.

@item 
bpo-37759@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37759}: Beginning edits to Whatsnew 3.8

@item 
bpo-37726@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37726}: Stop recommending getopt in the tutorial for command line
argument parsing and promote argparse.

@item 
bpo-32910@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32910}: Remove implementation-specific behaviour of how venv’s
Deactivate works.

@item 
bpo-37256@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37256}: Fix wording of arguments for @code{Request} in
@ref{111,,urllib.request}

@item 
bpo-37284@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37284}: Add a brief note to indicate that any new
@code{sys.implementation} required attributes must go through the PEP
process.

@item 
bpo-30088@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30088}: Documented that @ref{65c,,mailbox.Maildir} constructor doesn’t
attempt to verify the maildir folder layout correctness. Patch by
Sviatoslav Sydorenko.

@item 
bpo-37521@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37521}: Fix @code{importlib} examples to insert any newly created modules
via importlib.util.module_from_spec() immediately into sys.modules instead
of after calling loader.exec_module().

Thanks to Benjamin Mintz for finding the bug.

@item 
bpo-37456@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37456}: Slash (‘/’) is now part of syntax.

@item 
bpo-37487@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37487}: Fix PyList_GetItem index description to include 0.

@item 
bpo-37149@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37149}: Replace the dead link to the Tkinter 8.5 reference by John
Shipman, New Mexico Tech, with a link to the archive.org copy.

@item 
bpo-37478@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37478}: Added possible exceptions to the description of os.chdir().

@item 
bpo-34903@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34903}: Documented that in @ref{1951,,datetime.datetime.strptime()}, the
leading zero in some two-digit formats is optional. Patch by Mike Gleen.

@item 
bpo-36260@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36260}: Add decompression pitfalls to zipfile module documentation.

@item 
bpo-37004@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37004}: In the documentation for difflib, a note was added explicitly
warning that the results of SequenceMatcher’s ratio method may depend on
the order of the input strings.

@item 
bpo-36960@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36960}: Restructured the @ref{34,,datetime} docs in the interest of making
them more user-friendly and improving readability. Patch by Brad Solomon.

@item 
bpo-36487@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36487}: Make C-API docs clear about what the “main” interpreter is.

@item 
bpo-23460@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23460}: The documentation for decimal string formatting using the
@code{:g} specifier has been updated to reflect the correct exponential
notation cutoff point. Original patch contributed by Tuomas Suutari.

@item 
bpo-35803@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35803}: Document and test that @code{tempfile} functions may accept a
@ref{5a0,,path-like object} for the @code{dir} argument.  Patch by Anthony
Sottile.

@item 
bpo-33944@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33944}: Added a note about the intended use of code in .pth files.

@item 
bpo-34293@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34293}: Fix the Doc/Makefile regarding PAPER environment variable and
PDF builds

@item 
bpo-25237@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25237}: Add documentation for tkinter modules
@end itemize

@node Tests<50>,Build<58>,Documentation<51>,Python 3 9 0 alpha 1
@anchor{whatsnew/changelog id704}@anchor{1db6}
@subsubsection Tests



@itemize -

@item 
bpo-38614@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38614}: Fix test_communicate() of test_asyncio.test_subprocess: use
@code{support.LONG_TIMEOUT} (5 minutes), instead of just 1 minute.

@item 
bpo-38614@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38614}: Add timeout constants to @ref{ea,,test.support}:
@ref{1d99,,LOOPBACK_TIMEOUT},
@ref{1d9a,,INTERNET_TIMEOUT},
@ref{1c61,,SHORT_TIMEOUT} and
@ref{1d9b,,LONG_TIMEOUT}.

@item 
bpo-38502@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38502}: test.regrtest now uses process groups in the multiprocessing
mode (-jN command line option) if process groups are available: if
@ref{1db7,,os.setsid()} and @ref{1db8,,os.killpg()} functions are available.

@item 
bpo-35998@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35998}: Fix a race condition in test_asyncio.test_start_tls_server_1().
Previously, there was a race condition between the test main() function
which replaces the protocol and the test ServerProto protocol which sends
ANSWER once it gets HELLO. Now, only the test main() function is
responsible to send data, ServerProto no longer sends data.

@item 
bpo-38470@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38470}: Fix @code{test_compileall.test_compile_dir_maxlevels()} on Windows
without long path support: only create 3 subdirectories instead of between
20 and 100 subdirectories.

@item 
bpo-37531@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37531}: On timeout, regrtest no longer attempts to call
@code{popen.communicate()} again: it can hang until all child processes using
stdout and stderr pipes completes. Kill the worker process and ignores its
output. Change also the faulthandler timeout of the main process from 1
minute to 5 minutes, for Python slowest buildbots.

@item 
bpo-38239@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38239}: Fix test_gdb for Link Time Optimization (LTO) builds.

@item 
bpo-38275@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38275}: test_ssl now handles disabled TLS/SSL versions better.
OpenSSL’s crypto policy and run-time settings are recognized and tests for
disabled versions are skipped. Tests also accept more TLS minimum_versions
for platforms that override OpenSSL’s default with strict settings.

@item 
bpo-38271@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38271}: The private keys for test_ssl were encrypted with 3DES in
traditional PKCS#5 format. 3DES and the digest algorithm of PKCS#5 are
blocked by some strict crypto policies. Use PKCS#8 format with AES256
encryption instead.

@item 
bpo-38270@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38270}: test.support now has a helper function to check for
availability of a hash digest function. Several tests are refactored avoid
MD5 and use SHA256 instead. Other tests are marked to use MD5 and skipped
when MD5 is disabled.

@item 
bpo-37123@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37123}: Multiprocessing test test_mymanager() now also expects
-SIGTERM, not only exitcode 0. BaseManager._finalize_manager() sends
SIGTERM to the manager process if it takes longer than 1 second to stop,
which happens on slow buildbots.

@item 
bpo-38212@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38212}: Multiprocessing tests: increase
test_queue_feeder_donot_stop_onexc() timeout from 1 to 60 seconds.

@item 
bpo-38117@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38117}: Test with OpenSSL 1.1.1d

@item 
bpo-38018@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38018}: Increase code coverage for multiprocessing.shared_memory.

@item 
bpo-37805@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37805}: Add tests for json.dump(…, skipkeys=True). Patch by Donghee
Na.

@item 
bpo-37531@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37531}: Enhance regrtest multiprocess timeout: write a message when
killing a worker process, catch popen.kill() and popen.wait() exceptions,
put a timeout on the second call to popen.communicate().

@item 
bpo-37876@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37876}: Add tests for ROT-13 codec.

@item 
bpo-36833@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36833}: Added tests for @code{PyDateTime_@var{xxx}_GET_@var{xxx}()} macros of
the C API of the @ref{34,,datetime} module. Patch by Joannah Nanjekye.

@item 
bpo-37558@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37558}: Fix test_shared_memory_cleaned_after_process_termination name
handling

@item 
bpo-37526@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37526}: Add @code{test.support.catch_threading_exception()}: context
manager catching @ref{176,,threading.Thread} exception using
@ref{a4b,,threading.excepthook()}.

@item 
bpo-37421@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37421}: test_concurrent_futures now explicitly stops the ForkServer
instance if it’s running.

@item 
bpo-37421@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37421}: multiprocessing tests now stop the ForkServer instance if it’s
running: close the “alive” file descriptor to ask the server to stop and
then remove its UNIX address.

@item 
bpo-37421@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37421}: test_distutils.test_build_ext() is now able to remove the
temporary directory on Windows: don’t import the newly built C extension
(“xx”) in the current process, but test it in a separated process.

@item 
bpo-37421@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37421}: test_concurrent_futures now cleans up multiprocessing to remove
immediately temporary directories created by
multiprocessing.util.get_temp_dir().

@item 
bpo-37421@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37421}: test_winconsoleio doesn’t leak a temporary file anymore: use
tempfile.TemporaryFile() to remove it when the test completes.

@item 
bpo-37421@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37421}: multiprocessing tests now explicitly call @code{_run_finalizers()}
to immediately remove temporary directories created by tests.

@item 
bpo-37421@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37421}: urllib.request tests now call
@ref{1db9,,urlcleanup()} to remove temporary files created by
@code{urlretrieve()} tests and to clear the @code{_opener} global variable set
by @code{urlopen()} and functions calling indirectly @code{urlopen()}.

@item 
bpo-37472@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37472}: Remove @code{Lib/test/outstanding_bugs.py}.

@item 
bpo-37199@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37199}: Fix test failures when IPv6 is unavailable or disabled.

@item 
bpo-19696@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19696}: Replace deprecated method “random.choose” with “random.choice”
in “test_pkg_import.py”.

@item 
bpo-37335@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37335}: Remove no longer necessary code from c locale coercion tests

@item 
bpo-37421@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37421}: Fix test_shutil to no longer leak temporary files.

@item 
bpo-37411@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37411}: Fix test_wsgiref.testEnviron() to no longer depend on the
environment variables (don’t fail if “X” variable is set).

@item 
bpo-37400@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37400}: Fix test_os.test_chown(): use os.getgroups() rather than
grp.getgrall() to get groups. Rename also the test to test_chown_gid().

@item 
bpo-37359@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37359}: Add –cleanup option to python3 -m test to remove
@code{test_python_*} directories of previous failed jobs. Add “make
cleantest” to run @code{python3 -m test --cleanup}.

@item 
bpo-37362@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37362}: test_gdb no longer fails if it gets an “unexpected” message on
stderr: it now ignores stderr. The purpose of test_gdb is to test that
python-gdb.py commands work as expected, not to test gdb.

@item 
bpo-35998@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35998}: Avoid TimeoutError in test_asyncio: test_start_tls_server_1()

@item 
bpo-37278@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37278}: Fix test_asyncio ProactorLoopCtrlC: join the thread to prevent
leaking a running thread and leaking a reference.

@item 
bpo-37261@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37261}: Fix @ref{1dba,,test.support.catch_unraisable_exception()}: its
__exit__() method now ignores unraisable exception raised when clearing
its @code{unraisable} attribute.

@item 
bpo-37069@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37069}: regrtest now uses @ref{506,,sys.unraisablehook()} to mark a test as
“environment altered” (ENV_CHANGED) if it emits an “unraisable exception”.
Moreover, regrtest logs a warning in this case.

Use @code{python3 -m test --fail-env-changed} to catch unraisable exceptions
in tests.

@item 
bpo-37252@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37252}: Fix assertions in @code{test_close} and
@code{test_events_mask_overflow} devpoll tests.

@item 
bpo-37169@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37169}: Rewrite @code{_PyObject_IsFreed()} unit tests.

@item 
bpo-37153@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37153}: @code{test_venv.test_multiprocessing()} now explicitly calls
@code{pool.terminate()} to wait until the pool completes.

@item 
bpo-34001@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34001}: Make test_ssl pass with LibreSSL. LibreSSL handles minimum and
maximum TLS version differently than OpenSSL.

@item 
bpo-36919@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36919}: Make @code{test_source_encoding.test_issue2301} implementation
independent. The test will work now for both CPython and IronPython.

@item 
bpo-30202@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30202}: Update @code{test.test_importlib.test_abc} to test
@code{find_spec()}.

@item 
bpo-28009@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28009}: Modify the test_uuid logic to test when a program is available
AND can be used to obtain a MACADDR as basis for an UUID. Patch by M. Felt

@item 
bpo-34596@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34596}: Fallback to a default reason when @ref{1dbb,,unittest.skip()} is
uncalled. Patch by Naitree Zhu.
@end itemize

@node Build<58>,Windows<50>,Tests<50>,Python 3 9 0 alpha 1
@anchor{whatsnew/changelog id705}@anchor{1dbc}
@subsubsection Build



@itemize -

@item 
bpo-38809@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38809}: On Windows, build scripts will now recognize and use python.exe
from an active virtual env.

@item 
bpo-38684@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38684}: Fix _hashlib build when Blake2 is disabled, but OpenSSL
supports it.

@item 
bpo-38468@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38468}: Misc/python-config.in now uses @code{getvar()} for all still
existing @code{sysconfig.get_config_var()} calls. Patch by Joannah Nanjekye.

@item 
bpo-37415@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37415}: Fix stdatomic.h header check for ICC compiler: the ICC
implementation lacks atomic_uintptr_t type which is needed by Python.

@item 
bpo-38301@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38301}: In Solaris family, we must be sure to use @code{-D_REENTRANT}.
Patch by Jesús Cea Avión.

@item 
bpo-36002@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36002}: Locate @code{llvm-profdata} and @code{llvm-ar} binaries using
@code{AC_PATH_TOOL} rather than @code{AC_PATH_TARGET_TOOL}.

@item 
bpo-37936@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37936}: The @code{.gitignore} file systematically keeps “rooted”, with
a non-trailing slash, all the rules that are meant to apply to files in a
specific place in the repo.  Previously, when the intended file to ignore
happened to be at the root of the repo, we’d most often accidentally also
ignore files and directories with the same name anywhere in the tree.

@item 
bpo-37760@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37760}: The @code{Tools/unicode/makeunicodedata.py} script, which is
used for converting information from the Unicode Character Database into
generated code and data used by the methods of @ref{169,,str} and by the
@ref{10b,,unicodedata} module, now handles each character’s data as a
@code{dataclass} with named attributes, rather than a length-18 list of
different fields.

@item 
bpo-37936@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37936}: The @code{.gitignore} file no longer applies to any files that
are in fact tracked in the Git repository.  Patch by Greg Price.

@item 
bpo-37725@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37725}: Change “clean” makefile target to also clean the program guided
optimization (PGO) data.  Previously you would have to use “make clean”
and “make profile-removal”, or “make clobber”.

@item 
bpo-37707@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37707}: Mark some individual tests to skip when –pgo is used.  The
tests marked increase the PGO task time significantly and likely don’t
help improve optimization of the final executable.

@item 
bpo-36044@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36044}: Reduce the number of unit tests run for the PGO generation
task.  This speeds up the task by a factor of about 15x.  Running the full
unit test suite is slow.  This change may result in a slightly less
optimized build since not as many code branches will be executed.  If you
are willing to wait for the much slower build, the old behavior can be
restored using ‘./configure [..] PROFILE_TASK=”-m test –pgo-extended”’.
We make no guarantees as to which PGO task set produces a faster build.
Users who care should run their own relevant benchmarks as results can
depend on the environment, workload, and compiler tool chain.

@item 
bpo-37468@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37468}: @code{make install} no longer installs @code{wininst-*.exe} files
used by distutils bdist_wininst: bdist_wininst only works on Windows.

@item 
bpo-37189@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37189}: Many @code{PyRun_@var{XXX}()} functions like
@ref{1dbd,,PyRun_String()} were no longer exported in @code{libpython38.dll} by
mistake. Export them again to fix the ABI compatibility.

@item 
bpo-25361@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25361}: Enables use of SSE2 instructions in Windows 32-bit build.

@item 
bpo-36210@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36210}: Update optional extension module detection for AIX. ossaudiodev
and spwd are not applicable for AIX, and are no longer reported as
missing. 3rd-party packaging of ncurses (with ASIS support) conflicts with
officially supported AIX curses library, so configure AIX to use
libcurses.a. However, skip trying to build _curses_panel.

patch by M Felt
@end itemize

@node Windows<50>,macOS<39>,Build<58>,Python 3 9 0 alpha 1
@anchor{whatsnew/changelog id706}@anchor{1dbe}
@subsubsection Windows



@itemize -

@item 
bpo-38589@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38589}: Fixes HTML Help shortcut when Windows is not installed to C
drive

@item 
bpo-38453@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38453}: Ensure ntpath.realpath() correctly resolves relative paths.

@item 
bpo-38519@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38519}: Restores the internal C headers that were missing from the
nuget.org and Microsoft Store packages.

@item 
bpo-38492@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38492}: Remove @code{pythonw.exe} dependency on the Microsoft C++ runtime.

@item 
bpo-38344@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38344}: Fix error message in activate.bat

@item 
bpo-38359@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38359}: Ensures @code{pyw.exe} launcher reads correct registry key.

@item 
bpo-38355@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38355}: Fixes @code{ntpath.realpath} failing on @code{sys.executable}.

@item 
bpo-38117@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38117}: Update bundled OpenSSL to 1.1.1d

@item 
bpo-38092@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38092}: Reduce overhead when using multiprocessing in a Windows virtual
environment.

@item 
bpo-38133@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38133}: Allow py.exe launcher to locate installations from the
Microsoft Store and improve display of active virtual environments.

@item 
bpo-38114@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38114}: The @code{pip.ini} is no longer included in the Nuget package.

@item 
bpo-32592@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32592}: Set Windows 8 as the minimum required version for API support

@item 
bpo-36634@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36634}: @ref{4db,,os.cpu_count()} now returns active processors rather than
maximum processors.

@item 
bpo-36634@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36634}: venv activate.bat now works when the existing variables contain
double quote characters.

@item 
bpo-38081@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38081}: Prevent error calling @ref{262,,os.path.realpath()} on @code{'NUL'}.

@item 
bpo-38087@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38087}: Fix case sensitivity in test_pathlib and test_ntpath.

@item 
bpo-38088@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38088}: Fixes distutils not finding vcruntime140.dll with only the v142
toolset installed.

@item 
bpo-37283@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37283}: Ensure command-line and unattend.xml setting override
previously detected states in Windows installer.

@item 
bpo-38030@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38030}: Fixes @ref{26d,,os.stat()} failing for block devices on Windows

@item 
bpo-38020@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38020}: Fixes potential crash when calling @ref{b19,,os.readlink()} (or
indirectly through @ref{262,,realpath()}) on a file that is not a
supported link.

@item 
bpo-37705@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37705}: Improve the implementation of @code{winerror_to_errno()}.

@item 
bpo-37549@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37549}: @ref{1dbf,,os.dup()} no longer fails for standard streams on Windows
7.

@item 
bpo-1311@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1311}: The @code{nul} file on Windows now returns True from
@ref{c02,,exists()} and a valid result from @ref{26d,,os.stat()} with
@code{S_IFCHR} set.

@item 
bpo-9949@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9949}: Enable support for following symlinks in @code{os.realpath()}.

@item 
bpo-37834@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37834}: Treat all name surrogate reparse points on Windows in
@ref{6c7,,os.lstat()} and other reparse points as regular files in
@ref{26d,,os.stat()}.

@item 
bpo-36266@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36266}: Add the module name in the formatted error message when DLL
load fail happens during module import in
@code{_PyImport_FindSharedFuncptrWindows()}. Patch by Srinivas Nyayapati.

@item 
bpo-25172@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25172}: Trying to import the @code{crypt} module on Windows will
result in an @ref{659,,ImportError} with a message explaining that the module
isn’t supported on Windows. On other platforms, if the underlying
@code{_crypt} module is not available, the ImportError will include a message
explaining the problem.

@item 
bpo-37778@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37778}: Fixes the icons used for file associations to the Microsoft
Store package.

@item 
bpo-37734@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37734}: Fix use of registry values to launch Python from Microsoft
Store app.

@item 
bpo-37702@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37702}: Fix memory leak on Windows in creating an SSLContext object or
running @code{urllib.request.urlopen('https://...')}.

@item 
bpo-37672@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37672}: Switch Windows Store package’s pip to use bundled
@code{pip.ini} instead of 
@geindex PIP_USER
@geindex 환경 변수; PIP_USER
@code{PIP_USER} variable.

@item 
bpo-10945@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10945}: Officially drop support for creating bdist_wininst installers
on non-Windows systems.

@item 
bpo-37445@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37445}: Include the @code{FORMAT_MESSAGE_IGNORE_INSERTS} flag in
@code{FormatMessageW()} calls.

@item 
bpo-37369@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37369}: Fixes path for @ref{3ed,,sys.executable} when running from the
Microsoft Store.

@item 
bpo-37380@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37380}: Don’t collect unfinished processes with @code{subprocess._active}
on Windows to cleanup later. Patch by Ruslan Kuprieiev.

@item 
bpo-37351@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37351}: Removes libpython38.a from standard Windows distribution.

@item 
bpo-35360@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35360}: Update Windows builds to use SQLite 3.28.0.

@item 
bpo-37267@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37267}: On Windows, @ref{1dbf,,os.dup()} no longer creates an inheritable fd
when handling a character file.

@item 
bpo-36779@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36779}: Ensure @code{time.tzname} is correct on Windows when the active
code page is set to CP_UTF7 or CP_UTF8.

@item 
bpo-32587@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32587}: Make @ref{1dc0,,winreg.REG_MULTI_SZ} support zero-length strings.

@item 
bpo-28269@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28269}: Replace use of @code{strcasecmp()} for the system function
@code{_stricmp()}. Patch by Minmin Gong.

@item 
bpo-36590@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36590}: Add native Bluetooth RFCOMM support to socket module.
@end itemize

@node macOS<39>,IDLE<32>,Windows<50>,Python 3 9 0 alpha 1
@anchor{whatsnew/changelog id707}@anchor{1dc1}
@subsubsection macOS



@itemize -

@item 
bpo-38117@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38117}: Updated OpenSSL to 1.1.1d in macOS installer.

@item 
bpo-38089@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38089}: Move Azure Pipelines to latest VM versions and make macOS tests
optional

@item 
bpo-18049@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18049}: Increase the default stack size of threads from 5MB to 16MB on
macOS, to match the stack size of the main thread. This avoids crashes on
deep recursion in threads.

@item 
bpo-34602@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34602}: Avoid test suite failures on macOS by no longer calling
resource.setrlimit to increase the process stack size limit at runtime.
The runtime change is no longer needed since the interpreter is being
built with a larger default stack size.

@item 
bpo-35360@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35360}: Update macOS installer to use SQLite 3.28.0.

@item 
bpo-34631@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34631}: Updated OpenSSL to 1.1.1c in macOS installer.
@end itemize

@node IDLE<32>,Tools/Demos<33>,macOS<39>,Python 3 9 0 alpha 1
@anchor{whatsnew/changelog id708}@anchor{1dc2}
@subsubsection IDLE



@itemize -

@item 
bpo-26353@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26353}: Stop adding newline when saving an IDLE shell window.

@item 
bpo-4630@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4630}: Add an option to toggle IDLE’s cursor blink for shell, editor,
and output windows.  See Settings, General, Window Preferences, Cursor
Blink. Patch by Zackery Spytz.

@item 
bpo-38598@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38598}: Do not try to compile IDLE shell or output windows

@item 
bpo-36698@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36698}: IDLE no longer fails when write non-encodable characters to
stderr.  It now escapes them with a backslash, as the regular Python
interpreter. Added the @code{errors} field to the standard streams.

@item 
bpo-35379@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35379}: When exiting IDLE, catch any AttributeError.  One happens when
EditorWindow.close is called twice.  Printing a traceback, when IDLE is
run from a terminal, is useless and annoying.

@item 
bpo-38183@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38183}: To avoid problems, test_idle ignores the user config directory.
It no longer tries to create or access .idlerc or any files within. Users
must run IDLE to discover problems with saving settings.

@item 
bpo-38077@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38077}: IDLE no longer adds ‘argv’ to the user namespace when
initializing it.  This bug only affected 3.7.4 and 3.8.0b2 to 3.8.0b4.

@item 
bpo-38041@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38041}: Shell restart lines now fill the window width, always start
with ‘=’, and avoid wrapping unnecessarily. The line will still wrap if
the included file name is long relative to the width.

@item 
bpo-35771@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35771}: To avoid occasional spurious test_idle failures on slower
machines, increase the @code{hover_delay} in test_tooltip.

@item 
bpo-37824@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37824}: Properly handle user input warnings in IDLE shell. Cease
turning SyntaxWarnings into SyntaxErrors.

@item 
bpo-37929@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37929}: IDLE Settings dialog now closes properly when there is no shell
window.

@item 
bpo-37902@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37902}: Add mousewheel scrolling for IDLE module, path, and stack
browsers. Patch by George Zhang.

@item 
bpo-37849@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37849}: Fixed completions list appearing too high or low when shown
above the current line.

@item 
bpo-36419@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36419}: Refactor IDLE autocomplete and improve testing.

@item 
bpo-37748@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37748}: Reorder the Run menu.  Put the most common choice, Run Module,
at the top.

@item 
bpo-37692@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37692}: Improve highlight config sample with example shell interaction
and better labels for shell elements.

@item 
bpo-37628@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37628}: Settings dialog no longer expands with font size.

@item 
bpo-37627@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37627}: Initialize the Customize Run dialog with the command line
arguments most recently entered before.  The user can optionally edit
before submitting them.

@item 
bpo-33610@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33610}: Fix code context not showing the correct context when first
toggled on.

@item 
bpo-37530@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37530}: Optimize code context to reduce unneeded background activity.
Font and highlight changes now occur along with text changes instead of
after a random delay.

@item 
bpo-27452@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27452}: Cleanup @code{config.py} by inlining @code{RemoveFile} and
simplifying the handling of @code{file} in @code{CreateConfigHandlers}.

@item 
bpo-37325@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37325}: Fix tab focus traversal order for help source and custom run
dialogs.

@item 
bpo-37321@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37321}: Both subprocess connection error messages now refer to the
‘Startup failure’ section of the IDLE doc.

@item 
bpo-17535@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17535}: Add optional line numbers for IDLE editor windows.  Windows
open without line numbers unless set otherwise in the General tab of the
configuration dialog.

@item 
bpo-26806@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26806}: To compensate for stack frames added by IDLE and avoid possible
problems with low recursion limits, add 30 to limits in the user code
execution process.  Subtract 30 when reporting recursion limits to make
this addition mostly transparent.

@item 
bpo-37177@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37177}: Properly ‘attach’ search dialogs to their main window so that
they behave like other dialogs and do not get hidden behind their main
window.

@item 
bpo-37039@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37039}: Adjust “Zoom Height” to individual screens by momentarily
maximizing the window on first use with a particular screen.  Changing
screen settings may invalidate the saved height.  While a window is
maximized, “Zoom Height” has no effect.

@item 
bpo-35763@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35763}: Make calltip reminder about ‘/’ meaning positional-only less
obtrusive by only adding it when there is room on the first line.

@item 
bpo-5680@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5680}: Add ‘Run… Customized’ to the Run menu to run a module with
customized settings.  Any ‘command line arguments’ entered are added to
sys.argv. One can suppress the normal Shell main module restart.

@item 
bpo-36390@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36390}: Gather Format menu functions into format.py.  Combine
paragraph.py, rstrip.py, and format methods from editor.py.
@end itemize

@node Tools/Demos<33>,C API<53>,IDLE<32>,Python 3 9 0 alpha 1
@anchor{whatsnew/changelog id709}@anchor{1dc3}
@subsubsection Tools/Demos



@itemize -

@item 
bpo-38118@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38118}: Update Valgrind suppression file to ignore a false alarm in
@ref{1dc4,,PyUnicode_Decode()} when using GCC builtin strcmp().

@item 
bpo-38347@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38347}: pathfix.py: Assume all files that end on ‘.py’ are Python
scripts when working recursively.

@item 
bpo-37803@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37803}: pdb’s @code{--help} and @code{--version} long options now work.

@item 
bpo-37942@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37942}: Improve ArgumentClinic converter for floats.

@item 
bpo-37704@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37704}: Remove @code{Tools/scripts/h2py.py}: use cffi to access a C API in
Python.

@item 
bpo-37675@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37675}: 2to3 now works when run from a zipped standard library.

@item 
bpo-37034@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37034}: Argument Clinic now uses the argument name on errors with
keyword-only argument instead of their position. Patch contributed by Rémi
Lapeyre.

@item 
bpo-37064@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37064}: Add option -k to pathscript.py script: preserve shebang flags.
Add option -a to pathscript.py script: add flags.
@end itemize

@node C API<53>,,Tools/Demos<33>,Python 3 9 0 alpha 1
@anchor{whatsnew/changelog id710}@anchor{1dc5}
@subsubsection C API



@itemize -

@item 
bpo-37633@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37633}: Re-export some function compatibility wrappers for macros in
@code{pythonrun.h}.

@item 
bpo-38644@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38644}: Provide @ref{3d2,,Py_EnterRecursiveCall()} and
@ref{b6b,,Py_LeaveRecursiveCall()} as regular functions for the limited API.
Previously, there were defined as macros, but these macros didn’t work
with the limited API which cannot access @code{PyThreadState.recursion_depth}
field. Remove @code{_Py_CheckRecursionLimit} from the stable ABI.

@item 
bpo-38650@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38650}: The global variable @ref{b78,,PyStructSequence_UnnamedField} is
now a constant and refers to a constant string.

@item 
bpo-38540@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38540}: Fixed possible leak in @ref{1811,,PyArg_Parse()} and similar
functions for format units @code{"es#"} and @code{"et#"} when the macro
@code{PY_SSIZE_T_CLEAN} is not defined.

@item 
bpo-38395@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38395}: Fix a crash in @ref{c45,,weakref.proxy} objects due to incorrect
lifetime management when calling some associated methods that may delete
the last reference to object being referenced by the proxy. Patch by Pablo
Galindo.

@item 
bpo-36389@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36389}: The @code{_PyObject_CheckConsistency()} function is now also
available in release mode. For example, it can be used to debug a crash in
the @code{visit_decref()} function of the GC.

@item 
bpo-38266@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38266}: Revert the removal of PyThreadState_DeleteCurrent() with
documentation.

@item 
bpo-38303@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38303}: Update audioop extension module to use the stable ABI
(PEP-384). Patch by Tyler Kieft.

@item 
bpo-38234@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38234}: @code{Py_SetPath()} now sets @ref{3ed,,sys.executable} to the
program full path (@ref{3ec,,Py_GetProgramFullPath()}) rather than to the
program name (@ref{3ee,,Py_GetProgramName()}).

@item 
bpo-38234@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38234}: Python ignored arguments passed to @code{Py_SetPath()},
@code{Py_SetPythonHome()} and @code{Py_SetProgramName()}: fix Python
initialization to use specified arguments.

@item 
bpo-38205@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38205}: The @ref{dad,,Py_UNREACHABLE()} macro now calls
@ref{b79,,Py_FatalError()}.

@item 
bpo-38140@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=38140}: Make dict and weakref offsets opaque for C heap types by
passing the offsets through PyMemberDef

@item 
bpo-15088@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15088}: The C function @code{PyGen_NeedsFinalizing} has been removed. It
was not documented, tested or used anywhere within CPython after the
implementation of 
@geindex Python 향상 제안; PEP 442
PEP 442@footnote{https://peps.python.org/pep-0442/}. Patch by Joannah Nanjekye. (Patch by Joannah
Nanjekye)

@item 
bpo-36763@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36763}: Options added by @code{PySys_AddXOption()} are now handled the
same way than @code{PyConfig.xoptions} and command line @code{-X} options.

@item 
bpo-37926@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37926}: Fix a crash in @code{PySys_SetArgvEx(0, NULL, 0)}.

@item 
bpo-37879@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37879}: Fix subtype_dealloc to suppress the type decref when the base
type is a C heap type

@item 
bpo-37645@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37645}: Add @code{_PyObject_FunctionStr()} to get a user-friendly
string representation of a function-like object. Patch by Jeroen Demeyer.

@item 
bpo-29548@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29548}: The functions @code{PyEval_CallObject}, @code{PyEval_CallFunction},
@code{PyEval_CallMethod} and @code{PyEval_CallObjectWithKeywords} are
deprecated. Use @ref{63b,,PyObject_Call()} and its variants instead.

@item 
bpo-37151@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37151}: @code{PyCFunction_Call} is now a deprecated alias of
@ref{63b,,PyObject_Call()}.

@item 
bpo-37540@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37540}: The vectorcall protocol now requires that the caller passes
only strings as keyword names.

@item 
bpo-37207@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37207}: The vectorcall protocol is now enabled for @code{type} objects:
set @code{tp_vectorcall} to a vectorcall function to be used instead of
@code{tp_new} and @code{tp_init} when calling the class itself.

@item 
bpo-21120@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21120}: Exclude Python-ast.h, ast.h and asdl.h from the limited API.

@item 
bpo-37483@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37483}: Add new function @code{_PyObject_CallOneArg} for calling an object
with one positional argument.

@item 
bpo-36763@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36763}: Add @ref{1dc6,,PyConfig_SetWideStringList()} function.

@item 
bpo-37337@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37337}: Add fast functions for calling methods:
@code{_PyObject_VectorcallMethod()},
@code{_PyObject_CallMethodNoArgs()} and
@code{_PyObject_CallMethodOneArg()}.

@item 
bpo-28805@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28805}: The @ref{199f,,METH_FASTCALL} calling convention has been
documented.

@item 
bpo-37221@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37221}: The new function @code{PyCode_NewWithPosOnlyArgs()} allows to
create code objects like @code{PyCode_New()}, but with an extra
`posonlyargcount' parameter for indicating the number of positonal-only
arguments.

@item 
bpo-37215@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37215}: Fix dtrace issue introduce by bpo-36842@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36842}

@item 
bpo-37194@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37194}: Add a new public @ref{63a,,PyObject_CallNoArgs()} function to the
C API: call a callable Python object without any arguments. It is the most
efficient way to call a callback without any argument. On x86-64, for
example, @code{PyObject_CallFunctionObjArgs(func, NULL)} allocates 960 bytes
on the stack per call, whereas @code{PyObject_CallNoArgs(func)} only
allocates 624 bytes per call.

@item 
bpo-37170@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37170}: Fix the cast on error in
@ref{1dc7,,PyLong_AsUnsignedLongLongMask()}.

@item 
bpo-35381@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35381}: Convert posixmodule.c statically allocated types
@code{DirEntryType} and @code{ScandirIteratorType} to heap-allocated types.

@item 
bpo-34331@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34331}: Use singular/plural noun in error message when instantiating an
abstract class with non-overridden abstract method(s).
@end itemize

@node Python 3 8 0 beta 1,Python 3 8 0 alpha 4,Python 3 9 0 alpha 1,Changelog
@anchor{whatsnew/changelog python-3-8-0-beta-1}@anchor{1dc8}
@subsection Python 3.8.0 beta 1


`Release date: 2019-06-04'

@menu
* Security: Security<44>. 
* Core and Builtins: Core and Builtins<155>. 
* Library: Library<158>. 
* Documentation: Documentation<52>. 
* Tests: Tests<51>. 
* Build: Build<59>. 
* Windows: Windows<51>. 
* macOS: macOS<40>. 
* IDLE: IDLE<33>. 
* Tools/Demos: Tools/Demos<34>. 
* C API: C API<54>. 

@end menu

@node Security<44>,Core and Builtins<155>,,Python 3 8 0 beta 1
@anchor{whatsnew/changelog id711}@anchor{1dc9}
@subsubsection Security



@itemize -

@item 
bpo-35907@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35907}: 
@geindex Common Vulnerabilities and Exposures; CVE 2019-9948
CVE 2019-9948@footnote{https://www.cve.org/CVERecord?id=CVE-2019-9948}: Avoid file reading by disallowing
@code{local-file://} and @code{local_file://} URL schemes in
@code{URLopener().open()} and @code{URLopener().retrieve()} of
@ref{111,,urllib.request}.

@item 
bpo-33529@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33529}: Prevent fold function used in email header encoding from
entering infinite loop when there are too many non-ASCII characters in a
header.

@item 
bpo-33164@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33164}: Updated blake2 implementation which uses secure memset
implementation provided by platform.
@end itemize

@node Core and Builtins<155>,Library<158>,Security<44>,Python 3 8 0 beta 1
@anchor{whatsnew/changelog id712}@anchor{1dca}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-35814@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35814}: Allow unpacking in the right hand side of annotated
assignments. In particular, @code{t: Tuple[int, ...] = x, y, *z} is now
allowed.

@item 
bpo-37126@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37126}: All structseq objects are now tracked by the garbage collector.
Patch by Pablo Galindo.

@item 
bpo-37122@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37122}: Make the `co_argcount' attribute of code objects represent the
total number of positional arguments (including positional-only
arguments). The value of `co_posonlyargcount' can be used to distinguish
which arguments are positional only, and the difference (`co_argcount' -
`co_posonlyargcount') is the number of positional-or-keyword arguments.
Patch by Pablo Galindo.

@item 
bpo-20092@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20092}: Constructors of @ref{19b,,int}, @ref{196,,float} and
@ref{197,,complex} will now use the @ref{19e,,__index__()} special
method, if available and the corresponding method @ref{19d,,__int__()},
@ref{bc0,,__float__()} or @ref{7fc,,__complex__()} is not available.

@item 
bpo-37087@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37087}: Add native thread ID (TID) support to OpenBSD.

@item 
bpo-26219@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26219}: Implemented per opcode cache mechanism and @code{LOAD_GLOBAL}
instruction use it. @code{LOAD_GLOBAL} is now about 40% faster. Contributed
by Yury Selivanov, and Inada Naoki.

@item 
bpo-37072@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37072}: Fix crash in PyAST_FromNodeObject() when flags is NULL.

@item 
bpo-37029@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37029}: Freeing a great many small objects could take time quadratic in
the number of arenas, due to using linear search to keep @code{obmalloc.c}’s
list of usable arenas sorted by order of number of free memory pools.
This is accomplished without search now, leaving the worst-case time
linear in the number of arenas.  For programs where this quite visibly
matters (typically with more than 100 thousand small objects alive
simultaneously), this can greatly reduce the time needed to release their
memory.

@item 
bpo-26423@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26423}: Fix possible overflow in @code{wrap_lenfunc()} when @code{sizeof(long)
< sizeof(Py_ssize_t)} (e.g., 64-bit Windows).

@item 
bpo-37050@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37050}: Improve the AST for “debug” f-strings, which use ‘=’ to print
out the source of the expression being evaluated.  Delete expr_text from
the FormattedValue node, and instead use a Constant string node (possibly
merged with adjacent constant expressions inside the f-string).

@item 
bpo-22385@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22385}: The @code{bytes.hex}, @code{bytearray.hex}, and @code{memoryview.hex}
methods as well as the @code{binascii.hexlify} and @code{b2a_hex} functions now
have the ability to include an optional separator between hex bytes.  This
functionality was inspired by MicroPython’s hexlify implementation.

@item 
bpo-26836@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26836}: Add @ref{bfd,,os.memfd_create()}.

@item 
bpo-37032@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37032}: Added new @code{replace()} method to the code type
(@ref{32f,,types.CodeType}).

@item 
bpo-37007@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37007}: Implement @ref{c21,,socket.if_nameindex()},
@ref{c22,,socket.if_nametoindex()}, and @ref{c23,,socket.if_indextoname()} on
Windows.

@item 
bpo-36829@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36829}: @ref{5ef,,PyErr_WriteUnraisable()} now creates a traceback object
if there is no current traceback. Moreover, call
@ref{42a,,PyErr_NormalizeException()} and @ref{1dcb,,PyException_SetTraceback()}
to normalize the exception value. Ignore any error.

@item 
bpo-36878@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36878}: Only accept text after @code{# type: ignore} if the first
character is ASCII. This is to disallow things like @code{# type: ignoreé}.

@item 
bpo-36878@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36878}: Store text appearing after a @code{# type: ignore} comment in the
AST. For example a type ignore like @code{# type: ignore[E1000]} will have
the string @code{"[E1000]"} stored in its AST node.

@item 
bpo-2180@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2180}: Treat line continuation at EOF as a @code{SyntaxError} by Anthony
Sottile.

@item 
bpo-36907@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36907}: Fix a crash when calling a C function with a keyword dict
(@code{f(**kwargs)}) and changing the dict @code{kwargs} while that function is
running.

@item 
bpo-36946@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36946}: Fix possible signed integer overflow when handling slices.

@item 
bpo-36826@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36826}: Add NamedExpression kind support to ast_unparse.c

@item 
bpo-1875@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1875}: A @ref{18e,,SyntaxError} is now raised if a code blocks that will be
optimized away (e.g. if conditions that are always false) contains syntax
errors. Patch by Pablo Galindo.

@item 
bpo-36027@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36027}: Allow computation of modular inverses via three-argument
@code{pow}: the second argument is now permitted to be negative in the case
where the first and third arguments are relatively prime.

@item 
bpo-36861@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36861}: Update the Unicode database to version 12.1.0.

@item 
bpo-28866@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28866}: Avoid caching attributes of classes which type defines mro() to
avoid a hard cache invalidation problem.

@item 
bpo-36851@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36851}: The @code{FrameType} stack is now correctly cleaned up if the
execution ends with a return and the stack is not empty.

@item 
bpo-34616@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34616}: The @code{compile()} builtin functions now support the
@code{ast.PyCF_ALLOW_TOP_LEVEL_AWAIT} flag,  which allow to compile sources
that  contains top-level @code{await}, @code{async with} or @code{async for}. This
is useful to evaluate async-code from with an already async functions; for
example in a custom REPL.

@item 
bpo-36842@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36842}: Implement PEP 578, adding sys.audit, io.open_code and related
APIs.

@item 
bpo-27639@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27639}: Correct return type for UserList slicing operations. Patch by
Michael Blahay, Erick Cervantes, and vaultah

@item 
bpo-36737@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36737}: Move PyRuntimeState.warnings into per-interpreter state (via
“module state”).

@item 
bpo-36793@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36793}: Removed @code{__str__} implementations from builtin types
@ref{3c3,,bool}, @ref{19b,,int}, @ref{196,,float}, @ref{197,,complex} and few
classes from the standard library. They now inherit @code{__str__()} from
@ref{c7d,,object}.

@item 
bpo-36817@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36817}: Add a @code{=} feature f-strings for debugging. This can precede
@code{!s}, @code{!r}, or @code{!a}. It produces the text of the expression,
followed by an equal sign, followed by the repr of the value of the
expression. So @code{f'@{3*9+15=@}'} would be equal to the string
@code{'3*9+15=42'}.  If @code{=} is specified, the default conversion is set to
@code{!r}, unless a format spec is given, in which case the formatting
behavior is unchanged, and __format__ will be used.

@item 
bpo-24048@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24048}: Save the live exception during import.c’s @code{remove_module()}.

@item 
bpo-27987@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27987}: pymalloc returns memory blocks aligned by 16 bytes, instead of
8 bytes, on 64-bit platforms to conform x86-64 ABI. Recent compilers
assume this alignment more often. Patch by Inada Naoki.

@item 
bpo-36601@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36601}: A long-since-meaningless check for @code{getpid() == main_pid} was
removed from Python’s internal C signal handler.

@item 
bpo-36594@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36594}: Fix incorrect use of @code{%p} in format strings. Patch by Zackery
Spytz.

@item 
bpo-36045@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36045}: @code{builtins.help()} now prefixes @code{async} for async functions.

@item 
bpo-36084@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36084}: Add native thread ID (TID) to threading.Thread objects
(supported platforms: Windows, FreeBSD, Linux, macOS)

@item 
bpo-36035@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36035}: Added fix for broken symlinks in combination with pathlib

@item 
bpo-35983@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35983}: Added new trashcan macros to deal with a double deallocation
that could occur when the @code{tp_dealloc} of a subclass calls the
@code{tp_dealloc} of a base class and that base class uses the trashcan
mechanism. Patch by Jeroen Demeyer.

@item 
bpo-20602@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20602}: Do not clear @ref{89b,,sys.flags} and @ref{1dcc,,sys.float_info}
during shutdown. Patch by Zackery Spytz.

@item 
bpo-26826@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26826}: Expose @code{copy_file_range()} as a low level API in the
@ref{a5,,os} module.

@item 
bpo-32388@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32388}: Remove cross-version binary compatibility requirement in
tp_flags.

@item 
bpo-31862@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31862}: Port binascii to PEP 489 multiphase initialization. Patch by
Marcel Plch.
@end itemize

@node Library<158>,Documentation<52>,Core and Builtins<155>,Python 3 8 0 beta 1
@anchor{whatsnew/changelog id713}@anchor{1dcd}
@subsubsection Library



@itemize -

@item 
bpo-37128@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37128}: Added @ref{8df,,math.perm()}.

@item 
bpo-37120@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37120}: Add SSLContext.num_tickets to control the number of TLSv1.3
session tickets.

@item 
bpo-12202@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12202}: Fix the error handling in
@code{msilib.SummaryInformation.GetProperty()}. Patch by Zackery Spytz.

@item 
bpo-26835@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26835}: The fcntl module now contains file sealing constants for
sealing of memfds.

@item 
bpo-29262@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29262}: Add @code{get_origin()} and @code{get_args()} introspection helpers
to @code{typing} module.

@item 
bpo-12639@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12639}: @code{msilib.Directory.start_component()} no longer fails if
`keyfile' is not @code{None}.

@item 
bpo-36999@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36999}: Add the @code{asyncio.Task.get_coro()} method to publicly expose
the tasks’s coroutine object.

@item 
bpo-35246@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35246}: Make @ref{c6a,,asyncio.create_subprocess_exec()} accept path-like
arguments.

@item 
bpo-35279@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35279}: Change default `max_workers' of @code{ThreadPoolExecutor} from
@code{cpu_count() * 5} to @code{min(32, cpu_count() + 4)}.  Previous value was
unreasonably large on many cores machines.

@item 
bpo-37076@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37076}: @ref{4b5,,_thread.start_new_thread()} now logs uncaught exception
raised by the function using @ref{506,,sys.unraisablehook()}, rather than
@ref{a0c,,sys.excepthook()}, so the hook gets access to the function which
raised the exception.

@item 
bpo-33725@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33725}: On macOS, the @ref{98,,multiprocessing} module now uses `spawn'
start method by default.

@item 
bpo-37054@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37054}: Fix destructor @code{_pyio.BytesIO} and
@code{_pyio.TextIOWrapper}: initialize their @code{_buffer} attribute as
soon as possible (in the class body), because it’s used by @code{__del__()}
which calls @code{close()}.

@item 
bpo-37058@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37058}: PEP 544: Add @code{Protocol} and @code{@@runtime_checkable} to the
@code{typing} module.

@item 
bpo-36933@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36933}: The functions @code{sys.set_coroutine_wrapper} and
@code{sys.get_coroutine_wrapper} that were deprecated and marked for removal
in 3.8 have been removed.

@item 
bpo-37047@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37047}: Handle late binding and attribute access in
@ref{c3e,,unittest.mock.AsyncMock} setup for autospeccing. Document newly
implemented async methods in @ref{108e,,unittest.mock.MagicMock}.

@item 
bpo-37049@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37049}: PEP 589: Add @code{TypedDict} to the @code{typing} module.

@item 
bpo-37046@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37046}: PEP 586: Add @code{Literal} to the @code{typing} module.

@item 
bpo-37045@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37045}: PEP 591: Add @code{Final} qualifier and @code{@@final} decorator to
the @code{typing} module.

@item 
bpo-37035@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37035}: Don’t log OSError based exceptions if a fatal error has
occurred in asyncio transport. Peer can generate almost any OSError, user
cannot avoid these exceptions by fixing own code. Errors are still
propagated to user code, it’s just logging them is pointless and pollute
asyncio logs.

@item 
bpo-37001@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37001}: @ref{1dce,,symtable.symtable()} now accepts the same input types for
source code as the built-in @ref{4b2,,compile()} function. Patch by Dino
Viehland.

@item 
bpo-37028@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37028}: Implement asyncio REPL

@item 
bpo-37027@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37027}: Return safe to use proxy socket object from
transport.get_extra_info(‘socket’)

@item 
bpo-32528@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32528}: Make asyncio.CancelledError a BaseException.

This will address the common mistake many asyncio users make: an “except
Exception” clause breaking Tasks cancellation.

In addition to this change, we stop inheriting asyncio.TimeoutError and
asyncio.InvalidStateError from their concurrent.futures.* counterparts.
There’s no point for these exceptions to share the inheritance chain.

@item 
bpo-1230540@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1230540}: Add a new @ref{a4b,,threading.excepthook()} function which handles
uncaught @ref{c30,,threading.Thread.run()} exception. It can be overridden to
control how uncaught @code{threading.Thread.run()} exceptions are handled.

@item 
bpo-36996@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36996}: Handle @ref{1091,,unittest.mock.patch()} used as a decorator on async
functions.

@item 
bpo-37008@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37008}: Add support for calling @ref{9d8,,next()} with the mock resulting
from @ref{11e6,,unittest.mock.mock_open()}

@item 
bpo-27737@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27737}: Allow whitespace only header encoding in @code{email.header} - by
Batuhan Taskaya

@item 
bpo-36969@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36969}: PDB command @code{args} now  display positional only arguments.
Patch contributed by Rémi Lapeyre.

@item 
bpo-36969@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36969}: PDB command @code{args} now  display keyword only arguments. Patch
contributed by Rémi Lapeyre.

@item 
bpo-36983@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36983}: Add missing names to @code{typing.__all__}: @code{ChainMap},
@code{ForwardRef}, @code{OrderedDict} - by Anthony Sottile.

@item 
bpo-36972@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36972}: Add SupportsIndex protocol to the typing module to allow type
checking to detect classes that can be passed to @code{hex()}, @code{oct()} and
@code{bin()}.

@item 
bpo-32972@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32972}: Implement @code{unittest.IsolatedAsyncioTestCase} to help testing
asyncio-based code.

@item 
bpo-36952@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36952}: @ref{a00,,fileinput.input()} and @ref{93f,,fileinput.FileInput}
`bufsize' argument has been removed (was deprecated and ignored since
Python 3.6), and as a result the `mode' and `openhook' arguments have
been made keyword-only.

@item 
bpo-36952@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36952}: Starting with Python 3.3, importing ABCs from
@ref{1e,,collections} is deprecated, and import should be done from
@ref{1f,,collections.abc}. Still being able to import from @code{collections}
was marked for removal in 3.8, but has been delayed to 3.9; documentation
and @code{DeprecationWarning} clarified.

@item 
bpo-36949@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36949}: Implement __repr__ for WeakSet objects.

@item 
bpo-36948@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36948}: Fix @ref{452,,NameError} in
@code{urllib.request.URLopener.retrieve()}. Patch by Karthikeyan
Singaravelan.

@item 
bpo-33524@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33524}: Fix the folding of email header when the max_line_length is 0
or None and the header contains non-ascii characters.  Contributed by
Licht Takeuchi (@@Licht-T).

@item 
bpo-24564@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24564}: @ref{1333,,shutil.copystat()} now ignores @ref{1dcf,,errno.EINVAL} on
@ref{130c,,os.setxattr()} which may occur when copying files on filesystems
without extended attributes support.

Original patch by Giampaolo Rodola, updated by Ying Wang.

@item 
bpo-36888@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36888}: Python child processes can now access the status of their
parent process using multiprocessing.process.parent_process

@item 
bpo-36921@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36921}: Deprecate @code{@@coroutine} for sake of @code{async def}.

@item 
bpo-25652@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25652}: Fix bug in @code{__rmod__} of @code{UserString} - by Batuhan Taskaya.

@item 
bpo-36916@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36916}: Remove a message about an unhandled exception in a task when
writer.write() is used without await and writer.drain() fails with an
exception.

@item 
bpo-36889@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36889}: Introduce @code{asyncio.Stream} class that merges
@ref{176b,,asyncio.StreamReader} and @ref{1a70,,asyncio.StreamWriter}
functionality. @code{asyncio.Stream} can work in readonly, writeonly and
readwrite modes. Provide @code{asyncio.connect()},
@code{asyncio.connect_unix()}, @code{asyncio.connect_read_pipe()} and
@code{asyncio.connect_write_pipe()} factories to open
@code{asyncio.Stream} connections. Provide @code{asyncio.StreamServer}
and @code{UnixStreamServer} to serve servers with asyncio.Stream API.
Modify @ref{c6b,,asyncio.create_subprocess_shell()} and
@ref{c6a,,asyncio.create_subprocess_exec()} to use @code{asyncio.Stream}
instead of deprecated @code{StreamReader} and @code{StreamWriter}.
Deprecate @code{asyncio.StreamReader} and @code{asyncio.StreamWriter}.
Deprecate usage of private classes, e.g.
@code{asyncio.FlowControlMixing} and
@code{asyncio.StreamReaderProtocol} outside of asyncio package.

@item 
bpo-36845@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36845}: Added validation of integer prefixes to the construction of IP
networks and interfaces in the ipaddress module.

@item 
bpo-23378@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23378}: Add an extend action to argparser.

@item 
bpo-36867@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36867}: Fix a bug making a SharedMemoryManager instance and its parent
process use two separate resource_tracker processes.

@item 
bpo-23896@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23896}: Adds a grammar to lib2to3.pygram that contains exec as a
function not as statement.

@item 
bpo-36895@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36895}: The function @code{time.clock()} was deprecated in 3.3 in favor of
@code{time.perf_counter()} and marked for removal in 3.8, it has removed.

@item 
bpo-35545@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35545}: Fix asyncio discarding IPv6 scopes when ensuring hostname
resolutions internally

@item 
bpo-36887@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36887}: Add new function @ref{bf7,,math.isqrt()} to compute integer square
roots.

@item 
bpo-34632@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34632}: Introduce the @code{importlib.metadata} module with (provisional)
support for reading metadata from third-party packages.

@item 
bpo-36878@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36878}: When using @code{type_comments=True} in @code{ast.parse}, treat @code{#
type: ignore} followed by a non-alphanumeric character and then arbitrary
text as a type ignore, instead of requiring nothing but whitespace or
another comment. This is to permit formations such as @code{# type:
ignore[E1000]}.

@item 
bpo-36778@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36778}: @code{cp65001} encoding (Windows code page 65001) becomes an alias
to @code{utf_8} encoding.

@item 
bpo-36867@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36867}: The multiprocessing.resource_tracker replaces the
multiprocessing.semaphore_tracker module. Other than semaphores,
resource_tracker also tracks shared_memory segments.

@item 
bpo-30262@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30262}: The @code{Cache} and @code{Statement} objects of the @ref{d4,,sqlite3}
module are not exposed to the user.  Patch by Aviv Palivoda.

@item 
bpo-24538@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24538}: In @code{shutil.copystat()}, first copy extended file attributes
and then file permissions, since extended attributes can only be set on
the destination while it is still writeable.

@item 
bpo-36829@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36829}: Add new @ref{506,,sys.unraisablehook()} function which can be
overridden to control how “unraisable exceptions” are handled. It is
called when an exception has occurred but there is no way for Python to
handle it. For example, when a destructor raises an exception or during
garbage collection (@ref{1b3,,gc.collect()}).

@item 
bpo-36832@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36832}: Introducing @code{zipfile.Path}, a pathlib-compatible wrapper for
traversing zip files.

@item 
bpo-36814@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36814}: Fix an issue where os.posix_spawnp() would incorrectly raise a
TypeError when file_actions is None.

@item 
bpo-33110@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33110}: Handle exceptions raised by functions added by
concurrent.futures add_done_callback correctly when the Future has already
completed.

@item 
bpo-26903@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26903}: Limit @code{max_workers} in @code{ProcessPoolExecutor} to 61 to work
around a WaitForMultipleObjects limitation.

@item 
bpo-36813@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36813}: Fix @ref{242,,QueueListener} to call
@code{queue.task_done()} upon stopping. Patch by Bar Harel.

@item 
bpo-36806@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36806}: Forbid creation of asyncio stream objects like StreamReader,
StreamWriter, Process, and their protocols outside of asyncio package.

@item 
bpo-36802@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36802}: Provide both sync and async calls for StreamWriter.write() and
StreamWriter.close()

@item 
bpo-36801@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36801}: Properly handle SSL connection closing in asyncio
StreamWriter.drain() call.

@item 
bpo-36785@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36785}: Implement PEP 574 (pickle protocol 5 with out-of-band buffers).

@item 
bpo-36772@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36772}: functools.lru_cache() can now be used as a straight decorator
in addition to its existing usage as a function that returns a decorator.

@item 
bpo-6584@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6584}: Add a @ref{be9,,BadGzipFile} exception to the @ref{6b,,gzip}
module.

@item 
bpo-36748@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36748}: Optimized write buffering in C implementation of
@code{TextIOWrapper}. Writing ASCII string to @code{TextIOWrapper} with ascii,
latin1, or utf-8 encoding is about 20% faster.  Patch by Inada Naoki.

@item 
bpo-8138@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8138}: Don’t mark @code{wsgiref.simple_server.SimpleServer} as
multi-threaded since @code{wsgiref.simple_server.WSGIServer} is
single-threaded.

@item 
bpo-22640@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22640}: @ref{c19,,py_compile.compile()} now supports silent mode. Patch by
Joannah Nanjekye

@item 
bpo-29183@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29183}: Fix double exceptions in @ref{1dd0,,wsgiref.handlers.BaseHandler}
by calling its @code{close()} method only
when no exception is raised.

@item 
bpo-36548@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36548}: Improved the repr of regular expression flags.

@item 
bpo-36542@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36542}: The signature of Python functions can now be overridden by
specifying the @code{__text_signature__} attribute.

@item 
bpo-36533@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36533}: Reinitialize logging.Handler locks in forked child processes
instead of attempting to acquire them all in the parent before forking
only to be released in the child process.  The acquire/release pattern was
leading to deadlocks in code that has implemented any form of chained
logging handlers that depend upon one another as the lock acquisition
order cannot be guaranteed.

@item 
bpo-35252@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35252}: Throw a TypeError instead of an AssertionError when using an
invalid type annotation with singledispatch.

@item 
bpo-35900@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35900}: Allow reduction methods to return a 6-item tuple where the 6th
item specifies a custom state-setting method that’s called instead of the
regular @code{__setstate__} method.

@item 
bpo-35900@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35900}: enable custom reduction callback registration for functions and
classes in _pickle.c, using the new Pickler’s attribute
@code{reducer_override}

@item 
bpo-36368@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36368}: Fix a bug crashing SharedMemoryManager instances in interactive
sessions after a ctrl-c (KeyboardInterrupt) was sent

@item 
bpo-31904@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31904}: Fix mmap fail for VxWorks

@item 
bpo-27497@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27497}: @ref{1404,,csv.DictWriter.writeheader()} now returns the return value
of the underlying @code{csv.Writer.writerow()} method. Patch contributed by
Ashish Nitin Patil.

@item 
bpo-36239@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36239}: Parsing .mo files now ignores comments starting and ending with
#-#-#-#-#.

@item 
bpo-26707@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26707}: Enable plistlib to read and write binary plist files that were
created as a KeyedArchive file. Specifically, this allows the plistlib to
process 0x80 tokens as UID objects.

@item 
bpo-31904@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31904}: Add posix module support for VxWorks.

@item 
bpo-35125@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35125}: Asyncio: Remove inner callback on outer cancellation in shield

@item 
bpo-35721@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35721}: Fix @code{asyncio.SelectorEventLoop.subprocess_exec()} leaks
file descriptors if @code{Popen} fails and called with
@code{stdin=subprocess.PIPE}. Patch by Niklas Fiekas.

@item 
bpo-31855@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31855}: @ref{11e6,,unittest.mock.mock_open()} results now respects the
argument of read([size]). Patch contributed by Rémi Lapeyre.

@item 
bpo-35431@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35431}: Implement @ref{8de,,math.comb()} that returns binomial coefficient,
that computes the number of ways to choose k items from n items without
repetition and without order. Patch by Yash Aggarwal and Keller Fuchs.

@item 
bpo-26660@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26660}: Fixed permission errors in
@ref{1439,,TemporaryDirectory} clean up. Previously
@code{TemporaryDirectory.cleanup()} failed when non-writeable or
non-searchable files or directories were created inside a temporary
directory.

@item 
bpo-34271@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34271}: Add debugging helpers to ssl module. It’s now possible to dump
key material and to trace TLS protocol. The default and stdlib contexts
also support SSLKEYLOGFILE env var.

@item 
bpo-26467@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26467}: Added AsyncMock to support using unittest to mock asyncio
coroutines. Patch by Lisa Roach.

@item 
bpo-33569@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33569}: dataclasses.InitVar: Exposes the type used to create the init
var.

@item 
bpo-34424@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34424}: Fix serialization of messages containing encoded strings when
the policy.linesep is set to a multi-character string. Patch by Jens
Troeger.

@item 
bpo-34303@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34303}: Performance of @ref{21a,,functools.reduce()} is slightly improved.
Patch by Sergey Fedoseev.

@item 
bpo-33361@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33361}: Fix a bug in @ref{1dd1,,codecs.StreamRecoder} where seeking might
leave old data in a buffer and break subsequent read calls. Patch by Ammar
Askar.

@item 
bpo-22454@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22454}: The @ref{c9,,shlex} module now exposes @ref{c1b,,shlex.join()}, the
inverse of @ref{75d,,shlex.split()}. Patch by Bo Bayles.

@item 
bpo-31922@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31922}: @code{asyncio.AbstractEventLoop.create_datagram_endpoint()}: Do
not connect UDP socket when broadcast is allowed. This allows to receive
replies after a UDP broadcast.

@item 
bpo-24882@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24882}: Change ThreadPoolExecutor to use existing idle threads before
spinning up new ones.

@item 
bpo-31961@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31961}: Added support for bytes and path-like objects in
@ref{4b8,,subprocess.Popen()} on Windows.  The `args' parameter now accepts a
@ref{5a0,,path-like object} if `shell' is @code{False} and a sequence containing
bytes and path-like objects. The `executable' parameter now accepts a
bytes and path-like object. The `cwd' parameter now accepts a
bytes object. Based on patch by Anders Lorentsen.

@item 
bpo-33123@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33123}: @ref{1dd2,,pathlib.Path.unlink} now accepts a `missing_ok'
parameter to avoid a @ref{264,,FileNotFoundError} from being raised. Patch by
Robert Buchholz.

@item 
bpo-32941@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32941}: Allow @ref{518,,mmap.mmap} objects to access the madvise() system
call (through @ref{bfa,,mmap.mmap.madvise()}).

@item 
bpo-22102@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22102}: Added support for ZIP files with disks set to 0. Such files are
commonly created by builtin tools on Windows when use ZIP64 extension.
Patch by Francisco Facioni.

@item 
bpo-32515@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32515}: trace.py can now run modules via python3 -m trace -t –module
module_name

@item 
bpo-32299@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32299}: Changed @ref{1968,,unittest.mock.patch.dict()} to return the patched
dictionary when used as context manager. Patch by Vadim Tsander.

@item 
bpo-27141@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27141}: Added a @code{__copy__()} to @code{collections.UserList} and
@code{collections.UserDict} in order to correctly implement shallow copying
of the objects. Patch by Bar Harel.

@item 
bpo-31829@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31829}: @code{\r}, @code{\0} and @code{\x1a} (end-of-file on Windows) are now
escaped in protocol 0 pickles of Unicode strings. This allows to load them
without loss from files open in text mode in Python 2.

@item 
bpo-23395@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23395}: @code{_thread.interrupt_main()} now avoids setting the Python
error status if the @code{SIGINT} signal is ignored or not handled by Python.
@end itemize

@node Documentation<52>,Tests<51>,Library<158>,Python 3 8 0 beta 1
@anchor{whatsnew/changelog id714}@anchor{1dd3}
@subsubsection Documentation



@itemize -

@item 
bpo-36896@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36896}: Clarify that some types have unstable constructor signature
between Python versions.

@item 
bpo-36686@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36686}: Improve documentation of the stdin, stdout, and stderr
arguments of the @code{asyncio.subprocess_exec} function to specify which
values are supported. Also mention that decoding as text is not supported.

Add a few tests to verify that the various values passed to the std*
arguments actually work.

@item 
bpo-36984@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36984}: Improve version added references in @code{typing} module - by
Anthony Sottile.

@item 
bpo-36868@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36868}: What’s new now mentions SSLContext.hostname_checks_common_name
instead of SSLContext.host_flags.

@item 
bpo-35924@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35924}: Add a note to the @code{curses.addstr()} documentation to warn
that multiline strings can cause segfaults because of an ncurses bug.

@item 
bpo-36783@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36783}: Added C API Documentation for Time_FromTimeAndFold and
PyDateTime_FromDateAndTimeAndFold as per PEP 495. Patch by Edison
Abahurire.

@item 
bpo-36797@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36797}: More of the legacy distutils documentation has been either
pruned, or else more clearly marked as being retained solely until the
setuptools documentation covers it independently.

@item 
bpo-22865@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22865}: Add detail to the documentation on the @code{pty.spawn} function.

@item 
bpo-35397@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35397}: Remove deprecation and document urllib.parse.unwrap(). Patch
contributed by Rémi Lapeyre.

@item 
bpo-32995@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32995}: Added the context variable in glossary.

@item 
bpo-33519@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33519}: Clarify that @code{copy()} is not part of the @code{MutableSequence}
ABC.

@item 
bpo-33482@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33482}: Make @code{codecs.StreamRecoder.writelines} take a list of bytes.

@item 
bpo-25735@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25735}: Added documentation for func factorial to indicate that returns
integer values

@item 
bpo-20285@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20285}: Expand object.__doc__ (docstring) to make it clearer. Modify
pydoc.py so that help(object) lists object methods (for other classes,
help omits methods of the object base class.)
@end itemize

@node Tests<51>,Build<59>,Documentation<52>,Python 3 8 0 beta 1
@anchor{whatsnew/changelog id715}@anchor{1dd4}
@subsubsection Tests



@itemize -

@item 
bpo-37069@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37069}: Modify test_coroutines, test_cprofile, test_generators,
test_raise, test_ssl and test_yield_from to use
@ref{1dba,,test.support.catch_unraisable_exception()} rather than
@ref{1dd5,,test.support.captured_stderr()}.

@item 
bpo-37098@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37098}: Fix test_memfd_create on older Linux Kernels.

@item 
bpo-37081@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37081}: Test with OpenSSL 1.1.1c

@item 
bpo-36829@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36829}: Add @ref{1dba,,test.support.catch_unraisable_exception()}: context
manager catching unraisable exception using @ref{506,,sys.unraisablehook()}.

@item 
bpo-36915@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36915}: The main regrtest process now always removes all temporary
directories of worker processes even if they crash or if they are killed
on KeyboardInterrupt (CTRL+c).

@item 
bpo-36719@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36719}: “python3 -m test -jN …” now continues the execution of next
tests when a worker process crash (CHILD_ERROR state). Previously, the
test suite stopped immediately. Use –failfast to stop at the first error.

@item 
bpo-36816@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36816}: Update Lib/test/selfsigned_pythontestdotnet.pem to match
self-signed.pythontest.net’s new TLS certificate.

@item 
bpo-35925@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35925}: Skip httplib and nntplib networking tests when they would
otherwise fail due to a modern OS or distro with a default OpenSSL policy
of rejecting connections to servers with weak certificates.

@item 
bpo-36782@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36782}: Add tests for several C API functions in the @ref{34,,datetime}
module. Patch by Edison Abahurire.

@item 
bpo-36342@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36342}: Fix test_multiprocessing in test_venv if platform lacks
functioning sem_open.
@end itemize

@node Build<59>,Windows<51>,Tests<51>,Python 3 8 0 beta 1
@anchor{whatsnew/changelog id716}@anchor{1dd6}
@subsubsection Build



@itemize -

@item 
bpo-36721@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36721}: To embed Python into an application, a new @code{--embed} option
must be passed to @code{python3-config --libs --embed} to get @code{-lpython3.8}
(link the application to libpython). To support both 3.8 and older, try
@code{python3-config --libs --embed} first and fallback to @code{python3-config
--libs} (without @code{--embed}) if the previous command fails.

Add a pkg-config @code{python-3.8-embed} module to embed Python into an
application: @code{pkg-config python-3.8-embed --libs} includes
@code{-lpython3.8}. To support both 3.8 and older, try @code{pkg-config
python-X.Y-embed --libs} first and fallback to @code{pkg-config python-X.Y
--libs} (without @code{--embed}) if the previous command fails (replace
@code{X.Y} with the Python version).

On the other hand, @code{pkg-config python3.8 --libs} no longer contains
@code{-lpython3.8}. C extensions must not be linked to libpython (except on
Android, case handled by the script); this change is backward incompatible
on purpose.

@item 
bpo-36786@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36786}: “make install” now runs compileall in parallel.
@end itemize

@node Windows<51>,macOS<40>,Build<59>,Python 3 8 0 beta 1
@anchor{whatsnew/changelog id717}@anchor{1dd7}
@subsubsection Windows



@itemize -

@item 
bpo-36965@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36965}: include of STATUS_CONTROL_C_EXIT without depending on MSC
compiler

@item 
bpo-35926@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35926}: Update to OpenSSL 1.1.1b for Windows.

@item 
bpo-29883@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29883}: Add Windows support for UDP transports for the Proactor Event
Loop. Patch by Adam Meily.

@item 
bpo-33407@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33407}: The @ref{c9a,,Py_DEPRECATED()} macro has been implemented for
MSVC.
@end itemize

@node macOS<40>,IDLE<33>,Windows<51>,Python 3 8 0 beta 1
@anchor{whatsnew/changelog id718}@anchor{1dd8}
@subsubsection macOS



@itemize -

@item 
bpo-36231@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36231}: Support building Python on macOS without /usr/include
installed. As of macOS 10.14, system header files are only available
within an SDK provided by either the Command Line Tools or the Xcode app.
@end itemize

@node IDLE<33>,Tools/Demos<34>,macOS<40>,Python 3 8 0 beta 1
@anchor{whatsnew/changelog id719}@anchor{1dd9}
@subsubsection IDLE



@itemize -

@item 
bpo-35610@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35610}: Replace now redundant .context_use_ps1 with .prompt_last_line.
This finishes change started in bpo-31858@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31858}.

@item 
bpo-37038@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37038}: Make idlelib.run runnable; add test clause.

@item 
bpo-36958@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36958}: Print any argument other than None or int passed to SystemExit
or sys.exit().

@item 
bpo-36807@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36807}: When saving a file, call os.fsync() so bits are flushed to e.g.
USB drive.

@item 
bpo-32411@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32411}: In browser.py, remove extraneous sorting by line number since
dictionary was created in line number order.
@end itemize

@node Tools/Demos<34>,C API<54>,IDLE<33>,Python 3 8 0 beta 1
@anchor{whatsnew/changelog id720}@anchor{1dda}
@subsubsection Tools/Demos



@itemize -

@item 
bpo-37053@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37053}: Handle strings like u”bar” correctly in
Tools/parser/unparse.py. Patch by Chih-Hsuan Yen.
@end itemize

@node C API<54>,,Tools/Demos<34>,Python 3 8 0 beta 1
@anchor{whatsnew/changelog id721}@anchor{1ddb}
@subsubsection C API



@itemize -

@item 
bpo-36763@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36763}: Implement the 
@geindex Python 향상 제안; PEP 587
PEP 587@footnote{https://peps.python.org/pep-0587/} “Python Initialization Configuration”.

@item 
bpo-36379@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36379}: Fix crashes when attempting to use the `modulo' parameter when
@code{__ipow__} is implemented in C.

@item 
bpo-37107@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=37107}: Update @ref{1ddc,,PyObject_CallMethodObjArgs()} and
@code{_PyObject_CallMethodIdObjArgs} to use @code{_PyObject_GetMethod} to avoid
creating a bound method object in many cases. Patch by Michael J.
Sullivan.

@item 
bpo-36974@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36974}: Implement 
@geindex Python 향상 제안; PEP 590
PEP 590@footnote{https://peps.python.org/pep-0590/}: Vectorcall: a fast calling protocol for
CPython. This is a new protocol to optimize calls of custom callable
objects.

@item 
bpo-36763@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36763}: @code{Py_Main()} now returns the exitcode rather than calling
@code{Py_Exit(exitcode)} when calling @code{PyErr_Print()} if the current
exception type is @code{SystemExit}.

@item 
bpo-36922@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36922}: Add new type flag @code{Py_TPFLAGS_METHOD_DESCRIPTOR} for objects
behaving like unbound methods. These are objects supporting the
optimization given by the @code{LOAD_METHOD}/@code{CALL_METHOD} opcodes. See PEP
590.

@item 
bpo-36728@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36728}: The @code{PyEval_ReInitThreads()} function has been removed
from the C API. It should not be called explicitly: use
@ref{430,,PyOS_AfterFork_Child()} instead.
@end itemize

@node Python 3 8 0 alpha 4,Python 3 8 0 alpha 3,Python 3 8 0 beta 1,Changelog
@anchor{whatsnew/changelog python-3-8-0-alpha-4}@anchor{1ddd}
@subsection Python 3.8.0 alpha 4


`Release date: 2019-05-06'

@menu
* Security: Security<45>. 
* Core and Builtins: Core and Builtins<156>. 
* Library: Library<159>. 
* Documentation: Documentation<53>. 
* Tests: Tests<52>. 
* Build: Build<60>. 
* Windows: Windows<52>. 
* macOS: macOS<41>. 
* IDLE: IDLE<34>. 
* Tools/Demos: Tools/Demos<35>. 
* C API: C API<55>. 

@end menu

@node Security<45>,Core and Builtins<156>,,Python 3 8 0 alpha 4
@anchor{whatsnew/changelog id722}@anchor{1dde}
@subsubsection Security



@itemize -

@item 
bpo-36742@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36742}: Fixes mishandling of pre-normalization characters in
urlsplit().

@item 
bpo-30458@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30458}: Address 
@geindex Common Vulnerabilities and Exposures; CVE 2019-9740
CVE 2019-9740@footnote{https://www.cve.org/CVERecord?id=CVE-2019-9740} by disallowing URL paths with embedded
whitespace or control characters through into the underlying http client
request.  Such potentially malicious header injection URLs now cause an
http.client.InvalidURL exception to be raised.

@item 
bpo-35755@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35755}: @ref{6da,,shutil.which()} now uses @code{os.confstr("CS_PATH")} if
available and if the 
@geindex PATH
@geindex 환경 변수; PATH
@code{PATH} environment variable is not set.
Remove also the current directory from @code{posixpath.defpath}. On Unix,
@code{shutil.which()} and the @ref{dc,,subprocess} module no longer search the
executable in the current directory if the 
@geindex PATH
@geindex 환경 변수; PATH
@code{PATH} environment
variable is not set.
@end itemize

@node Core and Builtins<156>,Library<159>,Security<45>,Python 3 8 0 alpha 4
@anchor{whatsnew/changelog id723}@anchor{1ddf}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-36722@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36722}: In debug build, import now also looks for C extensions compiled
in release mode and for C extensions compiled in the stable ABI.

@item 
bpo-32849@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32849}: Fix Python Initialization code on FreeBSD to detect properly
when stdin file descriptor (fd 0) is invalid.

@item 
bpo-36623@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36623}: Remove parser headers and related function declarations that
lack implementations after the removal of pgen.

@item 
bpo-20180@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20180}: @code{dict.pop()} is now up to 33% faster thanks to Argument
Clinic. Patch by Inada Naoki.

@item 
bpo-36611@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36611}: Debug memory allocators: disable serialno field by default from
debug hooks on Python memory allocators to reduce the memory footprint by
5%. Enable @ref{105,,tracemalloc} to get the traceback where a memory block
has been allocated when a fatal memory error is logged to decide where to
put a breakpoint. Compile Python with @code{PYMEM_DEBUG_SERIALNO} defined to
get back the field.

@item 
bpo-36588@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36588}: On AIX, @ref{291,,sys.platform} doesn’t contain the major version
anymore. Always return @code{'aix'}, instead of @code{'aix3'} .. @code{'aix7'}.
Since older Python versions include the version number, it is recommended
to always use @code{sys.platform.startswith('aix')}. Contributed by M. Felt.

@item 
bpo-36549@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36549}: Change str.capitalize to use titlecase for the first character
instead of uppercase.

@item 
bpo-36540@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36540}: Implement 
@geindex Python 향상 제안; PEP 570
PEP 570@footnote{https://peps.python.org/pep-0570/} (Python positional-only parameters). Patch
by Pablo Galindo.

@item 
bpo-36475@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36475}: @code{PyEval_AcquireLock()} and
@code{PyEval_AcquireThread()} now terminate the current thread if called
while the interpreter is finalizing, making them consistent with
@ref{646,,PyEval_RestoreThread()}, @ref{c7e,,Py_END_ALLOW_THREADS()}, and
@ref{648,,PyGILState_Ensure()}.

@item 
bpo-36504@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36504}: Fix signed integer overflow in _ctypes.c’s
@code{PyCArrayType_new()}.

@item 
bpo-20844@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20844}: Fix running script with encoding cookie and LF line ending may
fail on Windows.

@item 
bpo-24214@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24214}: Fixed support of the surrogatepass error handler in the UTF-8
incremental decoder.

@item 
bpo-36452@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36452}: Changing @code{dict} keys during iteration of the dict itself,
@code{keys()}, @code{values()}, or @code{items()} will now be detected in certain
corner cases where keys are deleted/added so that the number of keys isn’t
changed. A @code{RuntimeError} will be raised after @code{len(dict)} iterations.
Contributed by Thomas Perl.

@item 
bpo-36459@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36459}: Fix a possible double @code{PyMem_FREE()} due to tokenizer.c’s
@code{tok_nextc()}.

@item 
bpo-36433@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36433}: Fixed TypeError message in classmethoddescr_call.

@item 
bpo-36430@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36430}: Fix a possible reference leak in @ref{1488,,itertools.count()}.

@item 
bpo-36440@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36440}: Include node names in @code{ParserError} messages, instead of
numeric IDs. Patch by A. Skrobov.

@item 
bpo-36143@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36143}: Regenerate @ref{88,,keyword} from the Grammar and Tokens file
using pgen. Patch by Pablo Galindo.

@item 
bpo-18372@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18372}: Add missing @ref{1709,,PyObject_GC_Track()} calls in the
@ref{ab,,pickle} module. Patch by Zackery Spytz.
@end itemize

@node Library<159>,Documentation<53>,Core and Builtins<156>,Python 3 8 0 alpha 4
@anchor{whatsnew/changelog id724}@anchor{1de0}
@subsubsection Library



@itemize -

@item 
bpo-35952@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35952}: Fix pythoninfo when the compiler is missing.

@item 
bpo-28238@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28238}: The @code{.find*()} methods of xml.etree.ElementTree can now
search for wildcards like @code{@{*@}tag} and @code{@{ns@}*} that match a tag in any
namespace or all tags in a namespace.  Patch by Stefan Behnel.

@item 
bpo-26978@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26978}: @code{pathlib.path.link_to()} is now implemented. It creates a
hard link pointing to a path.

@item 
bpo-1613500@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1613500}: @ref{93f,,fileinput.FileInput} now uses the input file mode to
correctly set the output file mode (previously it was hardcoded to
@code{'w'})  when @code{inplace=True} is passed to its constructor.

@item 
bpo-36734@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36734}: Fix compilation of @code{faulthandler.c} on HP-UX. Initialize
@code{stack_t current_stack} to zero using @code{memset()}.

@item 
bpo-13611@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13611}: The xml.etree.ElementTree packages gained support for C14N 2.0
serialisation. Patch by Stefan Behnel.

@item 
bpo-36669@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36669}: Add missing matrix multiplication operator support to
weakref.proxy.

@item 
bpo-36676@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36676}: The XMLParser() in xml.etree.ElementTree provides namespace
prefix context to the parser target if it defines the callback methods
“start_ns()” and/or “end_ns()”. Patch by Stefan Behnel.

@item 
bpo-36673@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36673}: The TreeBuilder and XMLPullParser in xml.etree.ElementTree
gained support for parsing comments and processing instructions. Patch by
Stefan Behnel.

@item 
bpo-36650@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36650}: The C version of functools.lru_cache() was treating calls with
an empty @code{**kwargs} dictionary as being distinct from calls with no
keywords at all. This did not result in an incorrect answer, but it did
trigger an unexpected cache miss.

@item 
bpo-28552@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28552}: Fix @code{distutils.sysconfig} if @ref{3ed,,sys.executable} is
@code{None} or an empty string: use @ref{190a,,os.getcwd()} to initialize
@code{project_base}.  Fix also the distutils build command: don’t use
@code{sys.executable} if it is @code{None} or an empty string.

@item 
bpo-35755@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35755}: @ref{6da,,shutil.which()} and @code{distutils.spawn.find_executable}
now use @code{os.confstr("CS_PATH")} if available instead of
@ref{1de1,,os.defpath}, if the @code{PATH} environment variable is not set.
Moreover, don’t use @code{os.confstr("CS_PATH")} nor @code{os.defpath} if
the @code{PATH} environment variable is set to an empty string.

@item 
bpo-25430@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25430}: improve performance of @code{IPNetwork.__contains__()}

@item 
bpo-30485@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30485}: Path expressions in xml.etree.ElementTree can now avoid
explicit namespace prefixes for tags (or the “@{namespace@}tag” notation) by
passing a default namespace with an empty string prefix.

@item 
bpo-36613@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36613}: Fix @ref{b,,asyncio} wait() not removing callback if exception

@item 
bpo-36598@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36598}: Fix @code{isinstance} check for Mock objects with spec when the
code is executed under tracing. Patch by Karthikeyan Singaravelan.

@item 
bpo-18748@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18748}: In development mode (@ref{16f,,-X} @code{dev}) and in debug build,
the @ref{504,,io.IOBase} destructor now logs @code{close()} exceptions. These
exceptions are silent by default in release mode.

@item 
bpo-36575@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36575}: The @code{_lsprof} module now uses internal timer same to
@code{time.perf_counter()} by default. @code{gettimeofday(2)} was used on Unix.
New timer has better resolution on most Unix platforms and timings are no
longer impacted by system clock updates since @code{perf_counter()} is
monotonic. Patch by Inada Naoki.

@item 
bpo-33461@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33461}: @code{json.loads} now emits @code{DeprecationWarning} when
@code{encoding} option is specified.  Patch by Matthias Bussonnier.

@item 
bpo-36559@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36559}: The random module now prefers the lean internal _sha512 module
over hashlib for seed(version=2) to optimize import time.

@item 
bpo-17561@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17561}: Set backlog=None as the default for socket.create_server.

@item 
bpo-34373@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34373}: Fix @ref{13ed,,time.mktime()} error handling on AIX for year before
1970.

@item 
bpo-36232@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36232}: Improve error message when trying to open existing DBM database
that actually doesn’t exist. Patch by Marco Rougeth.

@item 
bpo-36546@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36546}: Add statistics.quantiles()

@item 
bpo-36050@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36050}: Optimized @code{http.client.HTTPResponse.read()} for large
response. Patch by Inada Naoki.

@item 
bpo-36522@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36522}: If `debuglevel' is set to >0 in @ref{73,,http.client}, print all
values for headers with multiple values for the same header name. Patch by
Matt Houglum.

@item 
bpo-36492@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36492}: Deprecated passing required arguments like `func' as keyword
arguments in functions which should accept arbitrary keyword arguments and
pass them to other function. Arbitrary keyword arguments (even with names
“self” and “func”) can now be passed to these functions if the required
arguments are passed as positional arguments.

@item 
bpo-27181@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27181}: Add statistics.geometric_mean().

@item 
bpo-30427@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30427}: @code{os.path.normcase()} relies on @code{os.fspath()} to check the
type of its argument. Redundant checks have been removed from its
@code{posixpath.normcase()} and @code{ntpath.normcase()} implementations. Patch
by Wolfgang Maier.

@item 
bpo-36385@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36385}: Stop rejecting IPv4 octets for being ambiguously octal. Leading
zeros are ignored, and no longer are assumed to specify octal octets.
Octets are always decimal numbers. Octets must still be no more than three
digits, including leading zeroes.

@item 
bpo-36434@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36434}: Errors during writing to a ZIP file no longer prevent to
properly close it.

@item 
bpo-36407@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36407}: Fixed wrong indentation writing for CDATA section in
xml.dom.minidom. Patch by Vladimir Surjaninov.

@item 
bpo-36326@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36326}: inspect.getdoc() can now find docstrings for member objects
when __slots__ is a dictionary.

@item 
bpo-36366@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36366}: Calling @code{stop()} on an unstarted or stopped
@ref{1091,,unittest.mock.patch()} object will now return @code{None} instead of
raising @ref{244,,RuntimeError}, making the method idempotent. Patch by
Karthikeyan Singaravelan.

@item 
bpo-36348@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36348}: The @code{imap.IMAP4.logout()} method no longer ignores silently
arbitrary exceptions.

@item 
bpo-31904@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31904}: Add time module support and fix test_time failures for VxWorks.

@item 
bpo-36227@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36227}: Added support for keyword arguments @code{default_namespace} and
@code{xml_declaration} in functions @code{ElementTree.tostring()} and
@code{ElementTree.tostringlist()}.

@item 
bpo-36004@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36004}: Added new alternate constructors
@ref{bde,,datetime.date.fromisocalendar()} and
@ref{bdf,,datetime.datetime.fromisocalendar()}, which construct date objects
from ISO year, week number and weekday; these are the inverse of each
class’s @code{isocalendar} method. Patch by Paul Ganssle.

@item 
bpo-35936@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35936}: @ref{95,,modulefinder} no longer depends on the deprecated
@ref{7a,,imp} module, and the initializer for
@ref{1de2,,modulefinder.ModuleFinder} now has immutable default arguments.
Patch by Brandt Bucher.

@item 
bpo-35376@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35376}: @ref{95,,modulefinder} correctly handles modules that have the
same name as a bad package. Patch by Brandt Bucher.

@item 
bpo-17396@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17396}: @ref{95,,modulefinder} no longer crashes when encountering syntax
errors in followed imports. Patch by Brandt Bucher.

@item 
bpo-35934@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35934}: Added @ref{c1f,,create_server()} and
@ref{c20,,has_dualstack_ipv6()} convenience functions to automate the
necessary tasks usually involved when creating a server socket, including
accepting both IPv4 and IPv6 connections on the same socket.  (Contributed
by Giampaolo Rodola in bpo-17561@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17561}.)

@item 
bpo-23078@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23078}: Add support for @ref{48f,,classmethod()} and @ref{453,,staticmethod()} to
@ref{1935,,unittest.mock.create_autospec()}.  Initial patch by Felipe Ochoa.

@item 
bpo-35416@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35416}: Fix potential resource warnings in distutils. Patch by Mickaël
Schoentgen.

@item 
bpo-25451@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25451}: Add transparency methods to @code{tkinter.PhotoImage}.  Patch
by Zackery Spytz.

@item 
bpo-35082@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35082}: Don’t return deleted attributes when calling dir on a
@ref{c3d,,unittest.mock.Mock}.

@item 
bpo-34547@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34547}: @ref{1dd0,,wsgiref.handlers.BaseHandler} now handles abrupt client
connection terminations gracefully. Patch by Petter Strandmark.

@item 
bpo-31658@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31658}: @ref{1de3,,xml.sax.parse()} now supports @ref{5a0,,path-like}. Patch by Mickaël Schoentgen.

@item 
bpo-34139@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34139}: Remove stale unix datagram socket before binding

@item 
bpo-33530@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33530}: Implemented Happy Eyeballs in @code{asyncio.create_connection()}.
Added two new arguments, `happy_eyeballs_delay' and `interleave', to
specify Happy Eyeballs behavior.

@item 
bpo-33291@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33291}: Do not raise AttributeError when calling the inspect functions
isgeneratorfunction, iscoroutinefunction, isasyncgenfunction on a method
created from an arbitrary callable. Instead, return False.

@item 
bpo-31310@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31310}: Fix the multiprocessing.semaphore_tracker so it is reused by
child processes

@item 
bpo-31292@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31292}: Fix @code{setup.py check --restructuredtext} for files containing
@code{include} directives.
@end itemize

@node Documentation<53>,Tests<52>,Library<159>,Python 3 8 0 alpha 4
@anchor{whatsnew/changelog id725}@anchor{1de4}
@subsubsection Documentation



@itemize -

@item 
bpo-36625@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36625}: Remove obsolete comments from docstrings in fractions.Fraction

@item 
bpo-30840@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30840}: Document relative imports

@item 
bpo-36523@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36523}: Add docstring for io.IOBase.writelines().

@item 
bpo-36425@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36425}: New documentation translation: Simplified Chinese@footnote{https://docs.python.org/zh-cn/}.

@item 
bpo-36345@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36345}: Avoid the duplication of code from @code{Tools/scripts/serve.py}
in using the @code{literalinclude} directive for the basic
wsgiref-based web server in the documentation of @ref{11e,,wsgiref}.
Contributed by Stéphane Wirtel.

@item 
bpo-36345@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36345}: Using the code of the @code{Tools/scripts/serve.py} script as an
example in the @ref{11e,,wsgiref} documentation.  Contributed by Stéphane
Wirtel.

@item 
bpo-36157@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36157}: Added documentation for PyInterpreterState_Main().

@item 
bpo-33043@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33043}: Updates the docs.python.org page with the addition of a
‘Contributing to Docs’ link at the end of the page (between ‘Reporting
Bugs’ and ‘About Documentation’). Updates the ‘Found a Bug’ page with
additional links and information in the Documentation Bugs section.

@item 
bpo-35581@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35581}: @@typing.type_check_only now allows type stubs to mark functions
and classes not available during runtime.

@item 
bpo-33832@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33832}: Add glossary entry for ‘magic method’.

@item 
bpo-32913@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32913}: Added re.Match.groupdict example to regex HOWTO.
@end itemize

@node Tests<52>,Build<60>,Documentation<53>,Python 3 8 0 alpha 4
@anchor{whatsnew/changelog id726}@anchor{1de5}
@subsubsection Tests



@itemize -

@item 
bpo-36719@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36719}: regrtest now always detects uncollectable objects. Previously,
the check was only enabled by @code{--findleaks}. The check now also works
with @code{-jN/--multiprocess N}. @code{--findleaks} becomes a deprecated alias
to @code{--fail-env-changed}.

@item 
bpo-36725@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36725}: When using multiprocessing mode (-jN), regrtest now better
reports errors if a worker process fails, and it exits immediately on a
worker thread failure or when interrupted.

@item 
bpo-36454@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36454}: Change test_time.test_monotonic() to test only the lower bound
of elapsed time after a sleep command rather than the upper bound. This
prevents unnecessary test failures on slow buildbots. Patch by Victor
Stinner.

@item 
bpo-32424@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32424}: Improve test coverage for xml.etree.ElementTree. Patch by
Gordon P. Hemsley.

@item 
bpo-32424@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32424}: Fix typo in test_cyclic_gc() test for xml.etree.ElementTree.
Patch by Gordon P. Hemsley.

@item 
bpo-36635@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36635}: Add a new @code{_testinternalcapi} module to test the internal
C API.

@item 
bpo-36629@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36629}: Fix @code{test_imap4_host_default_value()} of @code{test_imaplib}:
catch also @ref{1de6,,errno.ENETUNREACH} error.

@item 
bpo-36611@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36611}: Fix @code{test_sys.test_getallocatedblocks()} when
@ref{105,,tracemalloc} is enabled.

@item 
bpo-36560@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36560}: Fix reference leak hunting in regrtest: compute also deltas (of
reference count, allocated memory blocks, file descriptor count) during
warmup, to ensure that everything is initialized before starting to hunt
reference leaks.

@item 
bpo-36565@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36565}: Fix reference hunting (@code{python3 -m test -R 3:3}) when Python
has no built-in abc module.

@item 
bpo-31904@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31904}: Port test_resource to VxWorks: skip tests cases setting
RLIMIT_FSIZE and RLIMIT_CPU.

@item 
bpo-31904@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31904}: Fix test_tabnanny on VxWorks: adjust ENOENT error message.

@item 
bpo-36436@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36436}: Fix @code{_testcapi.pymem_buffer_overflow()}: handle memory
allocation failure.

@item 
bpo-31904@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31904}: Fix test_utf8_mode on VxWorks: Python always use UTF-8 on
VxWorks.

@item 
bpo-36341@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36341}: Fix tests that may fail with PermissionError upon calling
bind() on AF_UNIX sockets.
@end itemize

@node Build<60>,Windows<52>,Tests<52>,Python 3 8 0 alpha 4
@anchor{whatsnew/changelog id727}@anchor{1de7}
@subsubsection Build



@itemize -

@item 
bpo-36747@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36747}: Remove the stale scriptsinstall Makefile target.

@item 
bpo-21536@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21536}: On Unix, C extensions are no longer linked to libpython except
on Android and Cygwin.

It is now possible for a statically linked Python to load a C extension
built using a shared library Python.

When Python is embedded, @code{libpython} must not be loaded with
@code{RTLD_LOCAL}, but @code{RTLD_GLOBAL} instead. Previously, using
@code{RTLD_LOCAL}, it was already not possible to load C extensions which
were not linked to @code{libpython}, such as C extensions of the standard
library built by the @code{*shared*} section of @code{Modules/Setup}.

distutils, python-config and python-config.py have been modified.

@item 
bpo-36707@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36707}: @code{./configure --with-pymalloc} no longer adds the @code{m} flag
to SOABI (sys.implementation.cache_tag). Enabling or disabling pymalloc
has no impact on the ABI.

@item 
bpo-36635@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36635}: Change @code{PyAPI_FUNC(type)}, @code{PyAPI_DATA(type)} and
@code{PyMODINIT_FUNC} macros of @code{pyport.h} when @code{Py_BUILD_CORE_MODULE} is
defined. The @code{Py_BUILD_CORE_MODULE} define must be now be used to build
a C extension as a dynamic library accessing Python internals: export the
@code{PyInit_@var{xxx}()} function in DLL exports on Windows.

@item 
bpo-31904@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31904}: Don’t build the @code{_crypt} extension on VxWorks.

@item 
bpo-36618@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36618}: Add @code{-fmax-type-align=8} to CFLAGS when clang compiler is
detected. The pymalloc memory allocator aligns memory on 8 bytes. On
x86-64, clang expects alignment on 16 bytes by default and so uses MOVAPS
instruction which can lead to segmentation fault. Instruct clang that
Python is limited to alignment on 8 bytes to use MOVUPS instruction
instead: slower but don’t trigger a SIGSEGV if the memory is not aligned
on 16 bytes. Sadly, the flag must be added to @code{CFLAGS} and not just
@code{CFLAGS_NODIST}, since third party C extensions can have the same issue.

@item 
bpo-36605@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36605}: @code{make tags} and @code{make TAGS} now also parse
@code{Modules/_io/*.c} and @code{Modules/_io/*.h}.

@item 
bpo-36465@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36465}: Release builds and debug builds are now ABI compatible:
defining the @code{Py_DEBUG} macro no longer implies the @code{Py_TRACE_REFS}
macro, which introduces the only ABI incompatibility. The
@code{Py_TRACE_REFS} macro, which adds the @ref{28e,,sys.getobjects()} function
and the 
@geindex PYTHONDUMPREFS
@geindex 환경 변수; PYTHONDUMPREFS
@ref{b9d,,PYTHONDUMPREFS} environment variable, can be set using
the new @code{./configure --with-trace-refs} build option.

@item 
bpo-36577@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36577}: setup.py now correctly reports missing OpenSSL headers and
libraries again.

@item 
bpo-36544@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36544}: Fix regression introduced in bpo-36146@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36146} refactoring setup.py

@item 
bpo-36508@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36508}: @code{python-config --ldflags} no longer includes flags of the
@code{LINKFORSHARED} variable. The @code{LINKFORSHARED} variable must only be
used to build executables.

@item 
bpo-36503@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36503}: Remove references to “aix3” and “aix4”. Patch by M. Felt.
@end itemize

@node Windows<52>,macOS<41>,Build<60>,Python 3 8 0 alpha 4
@anchor{whatsnew/changelog id728}@anchor{1de8}
@subsubsection Windows



@itemize -

@item 
bpo-35920@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35920}: Added platform.win32_edition() and platform.win32_is_iot().
Added support for cross-compiling packages for Windows ARM32. Skip tests
that are not expected to work on Windows IoT Core ARM32.

@item 
bpo-36649@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36649}: Remove trailing spaces for registry keys when installed via the
Store.

@item 
bpo-34144@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34144}: Fixed activate.bat to correctly update codepage when chcp.com
returns dots in output. Patch by Lorenz Mende.

@item 
bpo-36509@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36509}: Added preset-iot layout for Windows IoT ARM containers. This
layout doesn’t contain UI components like tkinter or IDLE. It also doesn’t
contain files to support on-target builds since Windows ARM32 builds must
be cross-compiled when using MSVC.

@item 
bpo-35941@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35941}: enum_certificates function of the ssl module now returns
certificates from all available certificate stores inside windows in a
query instead of returning only certificates from the system wide
certificate store. This includes certificates from these certificate
stores: local machine, local machine enterprise, local machine group
policy, current user, current user group policy, services, users.
ssl.enum_crls() function is changed in the same way to return all
certificate revocation lists inside the windows certificate revocation
list stores.

@item 
bpo-36441@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36441}: Fixes creating a venv when debug binaries are installed.

@item 
bpo-36085@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36085}: Enable better DLL resolution on Windows by using safe DLL
search paths and adding @ref{bdc,,os.add_dll_directory()}.

@item 
bpo-36010@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36010}: Add the venv standard library module to the nuget distribution
for Windows.

@item 
bpo-29515@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29515}: Add the following socket module constants on Windows:
IPPROTO_AH IPPROTO_CBT IPPROTO_DSTOPTS IPPROTO_EGP IPPROTO_ESP
IPPROTO_FRAGMENT IPPROTO_GGP IPPROTO_HOPOPTS IPPROTO_ICLFXBM
IPPROTO_ICMPV6 IPPROTO_IDP IPPROTO_IGMP IPPROTO_IGP IPPROTO_IPV4
IPPROTO_IPV6 IPPROTO_L2TP IPPROTO_MAX IPPROTO_ND IPPROTO_NONE IPPROTO_PGM
IPPROTO_PIM IPPROTO_PUP IPPROTO_RDP IPPROTO_ROUTING IPPROTO_SCTP
IPPROTO_ST

@item 
bpo-35947@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35947}: Added current version of libffi to cpython-source-deps. Change
_ctypes to use current version of libffi on Windows.

@item 
bpo-34060@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34060}: Report system load when running test suite on Windows. Patch by
Ammar Askar. Based on prior work by Jeremy Kloth.

@item 
bpo-31512@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31512}: With the Windows 10 Creators Update, non-elevated users can now
create symlinks as long as the computer has Developer Mode enabled.
@end itemize

@node macOS<41>,IDLE<34>,Windows<52>,Python 3 8 0 alpha 4
@anchor{whatsnew/changelog id729}@anchor{1de9}
@subsubsection macOS



@itemize -

@item 
bpo-34602@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34602}: Avoid failures setting macOS stack resource limit with
resource.setrlimit. This reverts an earlier fix for bpo-18075@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18075} which forced
a non-default stack size when building the interpreter executable on
macOS.
@end itemize

@node IDLE<34>,Tools/Demos<35>,macOS<41>,Python 3 8 0 alpha 4
@anchor{whatsnew/changelog id730}@anchor{1dea}
@subsubsection IDLE



@itemize -

@item 
bpo-36429@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36429}: Fix starting IDLE with pyshell. Add idlelib.pyshell alias at
top; remove pyshell alias at bottom. Remove obsolete __name__==’__main__’
command.
@end itemize

@node Tools/Demos<35>,C API<55>,IDLE<34>,Python 3 8 0 alpha 4
@anchor{whatsnew/changelog id731}@anchor{1deb}
@subsubsection Tools/Demos



@itemize -

@item 
bpo-14546@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14546}: Fix the argument handling in Tools/scripts/lll.py.
@end itemize

@node C API<55>,,Tools/Demos<35>,Python 3 8 0 alpha 4
@anchor{whatsnew/changelog id732}@anchor{1dec}
@subsubsection C API



@itemize -

@item 
bpo-36763@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36763}: Fix memory leak in @code{Py_SetStandardStreamEncoding()}:
release memory if the function is called twice.

@item 
bpo-36641@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36641}: @ref{1ded,,PyDoc_VAR}(name) and @ref{1d58,,PyDoc_STRVAR}(name, str)
now create @code{static const char name[]} instead of @code{static char name[]}.
Patch by Inada Naoki.

@item 
bpo-36389@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36389}: Change the value of @code{CLEANBYTE}, @code{DEADDYTE} and
@code{FORBIDDENBYTE} internal constants used by debug hooks on Python memory
allocators (@ref{e63,,PyMem_SetupDebugHooks()} function). Byte patterns
@code{0xCB}, @code{0xDB} and @code{0xFB} have been replaced with @code{0xCD}, @code{0xDD}
and @code{0xFD} to use the same values than Windows CRT debug @code{malloc()}
and @code{free()}.

@item 
bpo-36443@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36443}: Since Python 3.7.0, calling @ref{dbf,,Py_DecodeLocale()} before
@ref{460,,Py_Initialize()} produces mojibake if the @code{LC_CTYPE} locale is
coerced and/or if the UTF-8 Mode is enabled by the user configuration. The
LC_CTYPE coercion and UTF-8 Mode are now disabled by default to fix the
mojibake issue. They must now be enabled explicitly (opt-in) using the new
@code{_Py_PreInitialize()} API with @code{_PyPreConfig}.

@item 
bpo-36025@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36025}: Fixed an accidental change to the datetime C API where the
arguments to the @ref{1dee,,PyDate_FromTimestamp()} function were incorrectly
interpreted as a single timestamp rather than an arguments tuple, which
causes existing code to start raising @ref{198,,TypeError}. The
backwards-incompatible change was only present in alpha releases of Python
3.8. Patch by Paul Ganssle.

@item 
bpo-35810@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35810}: Modify @code{PyObject_Init} to correctly increase the refcount of
heap-allocated Type objects. Also fix the refcounts of the heap-allocated
types that were either doing this manually or not decreasing the type’s
refcount in tp_dealloc
@end itemize

@node Python 3 8 0 alpha 3,Python 3 8 0 alpha 2,Python 3 8 0 alpha 4,Changelog
@anchor{whatsnew/changelog python-3-8-0-alpha-3}@anchor{1def}
@subsection Python 3.8.0 alpha 3


`Release date: 2019-03-25'

@menu
* Security: Security<46>. 
* Core and Builtins: Core and Builtins<157>. 
* Library: Library<160>. 
* Documentation: Documentation<54>. 
* Tests: Tests<53>. 
* Build: Build<61>. 
* Windows: Windows<53>. 
* IDLE: IDLE<35>. 
* Tools/Demos: Tools/Demos<36>. 
* C API: C API<56>. 

@end menu

@node Security<46>,Core and Builtins<157>,,Python 3 8 0 alpha 3
@anchor{whatsnew/changelog id733}@anchor{1df0}
@subsubsection Security



@itemize -

@item 
bpo-36216@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36216}: Changes urlsplit() to raise ValueError when the URL contains
characters that decompose under IDNA encoding (NFKC-normalization) into
characters that affect how the URL is parsed.

@item 
bpo-35121@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35121}: Don’t send cookies of domain A without Domain attribute to
domain B when domain A is a suffix match of domain B while using a
cookiejar with @ref{1df1,,http.cookiejar.DefaultCookiePolicy} policy. Patch
by Karthikeyan Singaravelan.
@end itemize

@node Core and Builtins<157>,Library<160>,Security<46>,Python 3 8 0 alpha 3
@anchor{whatsnew/changelog id734}@anchor{1df2}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-36421@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36421}: Fix a possible double decref in _ctypes.c’s
@code{PyCArrayType_new()}.

@item 
bpo-36412@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36412}: Fix a possible crash when creating a new dictionary.

@item 
bpo-36398@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36398}: Fix a possible crash in @code{structseq_repr()}.

@item 
bpo-36256@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36256}: Fix bug in parsermodule when parsing a state in a DFA that has
two or more arcs with labels of the same type. Patch by Pablo Galindo.

@item 
bpo-36365@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36365}: repr(structseq) is no longer limited to 512 bytes.

@item 
bpo-36374@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36374}: Fix a possible null pointer dereference in
@code{merge_consts_recursive()}. Patch by Zackery Spytz.

@item 
bpo-36236@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36236}: At Python initialization, the current directory is no longer
prepended to @ref{3e4,,sys.path} if it has been removed.

@item 
bpo-36352@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36352}: Python initialization now fails with an error, rather than
silently truncating paths, if a path is too long.

@item 
bpo-36301@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36301}: Python initialization now fails if decoding @code{pybuilddir.txt}
configuration file fails at startup.

@item 
bpo-36333@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36333}: Fix leak in _PyRuntimeState_Fini. Contributed by Stéphane
Wirtel.

@item 
bpo-36332@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36332}: The builtin @ref{4b2,,compile()} can now handle AST objects that
contain assignment expressions. Patch by Pablo Galindo.

@item 
bpo-36282@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36282}: Improved error message for too much positional arguments in
some builtin functions.

@item 
bpo-30040@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30040}: New empty dict uses fewer memory for now.  It used more memory
than empty dict created by @code{dict.clear()}.  And empty dict creation and
deletion is about 2x faster.  Patch by Inada Naoki.

@item 
bpo-36262@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36262}: Fix an unlikely memory leak on conversion from string to float
in the function @code{_Py_dg_strtod()} used by @code{float(str)},
@code{complex(str)}, @ref{f0b,,pickle.load()}, @ref{1df3,,marshal.load()}, etc.

@item 
bpo-36252@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36252}: Update Unicode databases to version 12.0.0.

@item 
bpo-36218@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36218}: Fix a segfault occurring when sorting a list of heterogeneous
values. Patch contributed by Rémi Lapeyre and Elliot Gorokhovsky.

@item 
bpo-36188@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36188}: Cleaned up left-over vestiges of Python 2 unbound method
handling in method objects and documentation. Patch by Martijn Pieters

@item 
bpo-36124@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36124}: Add a new interpreter-specific dict and expose it in the C-API
via PyInterpreterState_GetDict().  This parallels PyThreadState_GetDict().
However, extension modules should continue using PyModule_GetState() for
their own internal per-interpreter state.

@item 
bpo-35975@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35975}: Add a @code{feature_version} flag to @code{ast.parse()} (documented)
and @code{compile()} (hidden) that allows tweaking the parser to support
older versions of the grammar. In particular, if @code{feature_version} is 5
or 6, the hacks for the @code{async} and @code{await} keyword from PEP 492 are
reinstated. (For 7 or higher, these are unconditionally treated as
keywords, but they are still special tokens rather than @code{NAME} tokens
that the parser driver recognizes.)

@item 
bpo-31904@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31904}: Use UTF-8 as the system encoding on VxWorks.

@item 
bpo-36048@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36048}: The @ref{19e,,__index__()} special method will be used
instead of @ref{19d,,__int__()} for implicit conversion of Python
numbers to C integers.  Using the @code{__int__()} method in implicit
conversions has been deprecated.

@item 
bpo-35808@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35808}: Retire pgen and use a modified version of pgen2 to generate the
parser. Patch by Pablo Galindo.
@end itemize

@node Library<160>,Documentation<54>,Core and Builtins<157>,Python 3 8 0 alpha 3
@anchor{whatsnew/changelog id735}@anchor{1df4}
@subsubsection Library



@itemize -

@item 
bpo-36401@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36401}: The class documentation created by pydoc now has a separate
section for readonly properties.

@item 
bpo-36320@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36320}: The typing.NamedTuple() class has deprecated the _field_types
attribute in favor of the __annotations__ attribute which carried the same
information. Also, both attributes were converted from OrderedDict to a
regular dict.

@item 
bpo-34745@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34745}: Fix @ref{b,,asyncio} ssl memory issues caused by circular
references

@item 
bpo-36324@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36324}: Add method to statistics.NormalDist for computing the inverse
cumulative normal distribution.

@item 
bpo-36321@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36321}: collections.namedtuple() misspelled the name of an attribute.
To be consistent with typing.NamedTuple, the attribute name should have
been “_field_defaults” instead of “_fields_defaults”.  For backwards
compatibility, both spellings are now created.  The misspelled version may
be removed in the future.

@item 
bpo-36297@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36297}: “unicode_internal” codec is removed.  It was deprecated since
Python 3.3. Patch by Inada Naoki.

@item 
bpo-36298@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36298}: Raise ModuleNotFoundError in pyclbr when a module can’t be
found. Thanks to ‘mental’ for the bug report.

@item 
bpo-36268@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36268}: Switch the default format used for writing tars with
@ref{e4,,tarfile} to the modern POSIX.1-2001 pax standard, from the
vendor-specific GNU. Contributed by C.A.M. Gerlach.

@item 
bpo-36285@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36285}: Fix integer overflows in the array module. Patch by Stephan
Hohe.

@item 
bpo-31904@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31904}: Add _signal module support for VxWorks.

@item 
bpo-36272@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36272}: @ref{8b,,logging} does not silently ignore RecursionError anymore.
Patch contributed by Rémi Lapeyre.

@item 
bpo-36280@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36280}: Add a kind field to ast.Constant. It is ‘u’ if the literal has
a ‘u’ prefix (i.e. a Python 2 style unicode literal), else None.

@item 
bpo-35931@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35931}: The @ref{aa,,pdb} @code{debug} command now gracefully handles all
exceptions.

@item 
bpo-36251@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36251}: Fix format strings used for stderrprinter and re.Match reprs.
Patch by Stephan Hohe.

@item 
bpo-36235@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36235}: Fix @code{CFLAGS} in @code{customize_compiler()} of
@code{distutils.sysconfig}: when the @code{CFLAGS} environment variable is
defined, don’t override @code{CFLAGS} variable with the @code{OPT} variable
anymore. Initial patch written by David Malcolm.

@item 
bpo-35807@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35807}: Update ensurepip to install pip 19.0.3 and setuptools 40.8.0.

@item 
bpo-36139@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36139}: Release GIL when closing @ref{518,,mmap} objects.

@item 
bpo-36179@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36179}: Fix two unlikely reference leaks in _hashopenssl. The leaks
only occur in out-of-memory cases.

@item 
bpo-36169@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36169}: Add overlap() method to statistics.NormalDist.  Computes the
overlapping coefficient for two normal distributions.

@item 
bpo-36103@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36103}: Default buffer size used by @code{shutil.copyfileobj()} is changed
from 16 KiB to 64 KiB on non-Windows platform to reduce system call
overhead. Contributed by Inada Naoki.

@item 
bpo-36130@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36130}: Fix @code{pdb} with @code{skip=...} when stepping into a frame
without a @code{__name__} global.  Patch by Anthony Sottile.

@item 
bpo-35652@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35652}: shutil.copytree(copy_function=…) erroneously pass DirEntry
instead of a path string.

@item 
bpo-35178@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35178}: Ensure custom @ref{1df5,,warnings.formatwarning()} function can
receive @code{line} as positional argument. Based on patch by Tashrif Billah.

@item 
bpo-36106@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36106}: Resolve potential name clash with libm’s sinpi(). Patch by
Dmitrii Pasechnik.

@item 
bpo-36091@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36091}: Clean up reference to async generator in Lib/types. Patch by
Henry Chen.

@item 
bpo-36043@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36043}: @code{FileCookieJar} supports @ref{5a0,,path-like object}.
Contributed by Stéphane Wirtel

@item 
bpo-35899@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35899}: Enum has been fixed to correctly handle empty strings and
strings with non-Latin characters (ie. ‘α’, ‘א’) without crashing.
Original patch contributed by Maxwell. Assisted by Stéphane Wirtel.

@item 
bpo-21269@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21269}: Add @code{args} and @code{kwargs} properties to mock call objects.
Contributed by Kumar Akshay.

@item 
bpo-30670@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30670}: @code{pprint.pp} has been added to pretty-print objects with
dictionary keys being sorted with their insertion order by default.
Parameter `sort_dicts' has been added to @code{pprint.pprint},
@code{pprint.pformat} and @code{pprint.PrettyPrinter}. Contributed by Rémi
Lapeyre.

@item 
bpo-35843@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35843}: Implement @code{__getitem__} for @code{_NamespacePath}.  Patch by
Anthony Sottile.

@item 
bpo-35802@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35802}: Clean up code which checked presence of @code{os.stat} /
@code{os.lstat} / @code{os.chmod} which are always present.  Patch by Anthony
Sottile.

@item 
bpo-35715@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35715}: Librates the return value of a ProcessPoolExecutor
_process_worker after it’s no longer needed to free memory

@item 
bpo-35493@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35493}: Use @ref{12e4,,multiprocessing.connection.wait()} instead of polling
each 0.2 seconds for worker updates in @code{multiprocessing.Pool}.
Patch by Pablo Galindo.

@item 
bpo-35661@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35661}: Store the venv prompt in pyvenv.cfg.

@item 
bpo-35121@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35121}: Don’t set cookie for a request when the request path is a
prefix match of the cookie’s path attribute but doesn’t end with “/”.
Patch by Karthikeyan Singaravelan.

@item 
bpo-21478@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21478}: Calls to a child function created with
@ref{1935,,unittest.mock.create_autospec()} should propagate to the parent.
Patch by Karthikeyan Singaravelan.

@item 
bpo-35198@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35198}: Fix C++ extension compilation on AIX
@end itemize

@node Documentation<54>,Tests<53>,Library<160>,Python 3 8 0 alpha 3
@anchor{whatsnew/changelog id736}@anchor{1df6}
@subsubsection Documentation



@itemize -

@item 
bpo-36329@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36329}: Declare the path of the Python binary for the usage of
@code{Tools/scripts/serve.py} when executing @code{make -C Doc/ serve}.
Contributed by Stéphane Wirtel

@item 
bpo-36138@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36138}: Improve documentation about converting datetime.timedelta to
scalars.

@item 
bpo-21314@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21314}: A new entry was added to the Core Language Section of the
Programming FAQ, which explaines the usage of slash(/) in the signature of
a function. Patch by Lysandros Nikolaou
@end itemize

@node Tests<53>,Build<61>,Documentation<54>,Python 3 8 0 alpha 3
@anchor{whatsnew/changelog id737}@anchor{1df7}
@subsubsection Tests



@itemize -

@item 
bpo-36234@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36234}: test_posix.PosixUidGidTests: add tests for invalid uid/gid type
(str). Initial patch written by David Malcolm.

@item 
bpo-29571@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29571}: Fix @code{test_re.test_locale_flag()}:  use
@code{locale.getpreferredencoding()} rather than @code{locale.getlocale()} to
get the locale encoding. With some locales, @code{locale.getlocale()} returns
the wrong encoding.

@item 
bpo-36123@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36123}: Fix race condition in test_socket.
@end itemize

@node Build<61>,Windows<53>,Tests<53>,Python 3 8 0 alpha 3
@anchor{whatsnew/changelog id738}@anchor{1df8}
@subsubsection Build



@itemize -

@item 
bpo-36356@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36356}: Fix leaks that led to build failure when configured with
address sanitizer.

@item 
bpo-36146@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36146}: Add @code{TEST_EXTENSIONS} constant to @code{setup.py} to allow to
not build test extensions like @code{_testcapi}.

@item 
bpo-36146@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36146}: Fix setup.py on macOS: only add @code{/usr/include/ffi} to include
directories of _ctypes, not for all extensions.

@item 
bpo-31904@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31904}: Enable build system to cross-build for VxWorks RTOS.
@end itemize

@node Windows<53>,IDLE<35>,Build<61>,Python 3 8 0 alpha 3
@anchor{whatsnew/changelog id739}@anchor{1df9}
@subsubsection Windows



@itemize -

@item 
bpo-36312@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36312}: Fixed decoders for the following code pages: 50220, 50221,
50222, 50225, 50227, 50229, 57002 through 57011, 65000 and 42.

@item 
bpo-36264@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36264}: Don’t honor POSIX @code{HOME} in @code{os.path.expanduser} on
windows.  Patch by Anthony Sottile.

@item 
bpo-24643@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24643}: Fix name collisions due to @code{#define timezone _timezone} in
PC/pyconfig.h.
@end itemize

@node IDLE<35>,Tools/Demos<36>,Windows<53>,Python 3 8 0 alpha 3
@anchor{whatsnew/changelog id740}@anchor{1dfa}
@subsubsection IDLE



@itemize -

@item 
bpo-36405@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36405}: Use dict unpacking in idlelib.

@item 
bpo-36396@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36396}: Remove fgBg param of idlelib.config.GetHighlight(). This param
was only used twice and changed the return type.

@item 
bpo-36176@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36176}: Fix IDLE autocomplete & calltip popup colors. Prevent conflicts
with Linux dark themes (and slightly darken calltip background).

@item 
bpo-23205@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23205}: For the grep module, add tests for findfiles, refactor
findfiles to be a module-level function, and refactor findfiles to use
os.walk.

@item 
bpo-23216@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23216}: Add docstrings to IDLE search modules.

@item 
bpo-36152@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36152}: Remove colorizer.ColorDelegator.close_when_done and the
corresponding argument of .close().  In IDLE, both have always been None
or False since 2007.

@item 
bpo-32129@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32129}: Avoid blurry IDLE application icon on macOS with Tk 8.6. Patch
by Kevin Walzer.

@item 
bpo-36096@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36096}: Refactor class variables to instance variables in colorizer.

@item 
bpo-30348@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30348}: Increase test coverage of idlelib.autocomplete by 30%. Patch by
Louie Lu
@end itemize

@node Tools/Demos<36>,C API<56>,IDLE<35>,Python 3 8 0 alpha 3
@anchor{whatsnew/changelog id741}@anchor{1dfb}
@subsubsection Tools/Demos



@itemize -

@item 
bpo-35132@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35132}: Fix py-list and py-bt commands of python-gdb.py on gdb7.

@item 
bpo-32217@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32217}: Fix freeze script on Windows.
@end itemize

@node C API<56>,,Tools/Demos<36>,Python 3 8 0 alpha 3
@anchor{whatsnew/changelog id742}@anchor{1dfc}
@subsubsection C API



@itemize -

@item 
bpo-36381@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36381}: Raise @code{DeprecationWarning} when ‘#’ formats are used for
building or parsing values without @code{PY_SSIZE_T_CLEAN}.

@item 
bpo-36142@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36142}: The whole coreconfig.h header is now excluded from
Py_LIMITED_API. Move functions definitions into a new internal
pycore_coreconfig.h header.
@end itemize

@node Python 3 8 0 alpha 2,Python 3 8 0 alpha 1,Python 3 8 0 alpha 3,Changelog
@anchor{whatsnew/changelog python-3-8-0-alpha-2}@anchor{1dfd}
@subsection Python 3.8.0 alpha 2


`Release date: 2019-02-25'

@menu
* Core and Builtins: Core and Builtins<158>. 
* Library: Library<161>. 
* Documentation: Documentation<55>. 
* Tests: Tests<54>. 
* Windows: Windows<54>. 
* IDLE: IDLE<36>. 

@end menu

@node Core and Builtins<158>,Library<161>,,Python 3 8 0 alpha 2
@anchor{whatsnew/changelog id743}@anchor{1dfe}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-36052@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36052}: Raise a @ref{18e,,SyntaxError} when assigning a value to
@code{__debug__} with the Assignment Operator. Contributed by Stéphane Wirtel
and Pablo Galindo.

@item 
bpo-36012@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36012}: Doubled the speed of class variable writes.  When a non-dunder
attribute was updated, there was an unnecessary call to update slots.

@item 
bpo-35942@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35942}: The error message emitted when returning invalid types from
@code{__fspath__} in interfaces that allow passing @ref{e4a,,PathLike}
objects has been improved and now it does explain the origin of the error.

@item 
bpo-36016@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36016}: @code{gc.get_objects} can now receive an optional parameter
indicating a generation to get objects from. Patch by Pablo Galindo.

@item 
bpo-1054041@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1054041}: When the main interpreter exits due to an uncaught
KeyboardInterrupt, the process now exits in the appropriate manner for its
parent process to detect that a SIGINT or ^C terminated the process.  This
allows shells and batch scripts to understand that the user has asked them
to stop.

@item 
bpo-35992@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35992}: Fix @code{__class_getitem__()} not being called on a class with a
custom non-subscriptable metaclass.

@item 
bpo-35993@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35993}: Fix a crash on fork when using subinterpreters. Contributed by
Stéphane Wirtel

@item 
bpo-35991@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35991}: Fix a potential double free in Modules/_randommodule.c.

@item 
bpo-35961@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35961}: Fix a crash in slice_richcompare(): use strong references
rather than stolen references for the two temporary internal tuples.

@item 
bpo-35911@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35911}: Enable the creation of cell objects by adding a
@code{cell.__new__} method, and expose the type @code{cell} in @code{Lib/types.py}
under the name CellType. Patch by Pierre Glaser.

@item 
bpo-12822@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12822}: Use monotonic clock for @code{pthread_cond_timedwait} when
@code{pthread_condattr_setclock} and @code{CLOCK_MONOTONIC} are available.

@item 
bpo-15248@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15248}: The compiler emits now syntax warnings in the case when a comma
is likely missed before tuple or list.

@item 
bpo-35886@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35886}: The implementation of PyInterpreterState has been moved into
the internal header files (guarded by Py_BUILD_CORE).

@item 
bpo-31506@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31506}: Clarify the errors reported when @code{object.__new__} and
@code{object.__init__} receive more than one argument. Contributed by Sanyam
Khurana.

@item 
bpo-35724@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35724}: Signal-handling is now guaranteed to happen relative to the
main interpreter.

@item 
bpo-33608@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33608}: We added a new internal _Py_AddPendingCall() that operates
relative to the provided interpreter.  This allows us to use the existing
implementation to ask another interpreter to do work that cannot be done
in the current interpreter, like decref an object the other interpreter
owns.  The existing Py_AddPendingCall() only operates relative to the main
interpreter.

@item 
bpo-33989@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33989}: Fix a possible crash in @ref{dc7,,list.sort()} when sorting objects
with @code{ob_type->tp_richcompare == NULL}.  Patch by Zackery Spytz.
@end itemize

@node Library<161>,Documentation<55>,Core and Builtins<158>,Python 3 8 0 alpha 2
@anchor{whatsnew/changelog id744}@anchor{1dff}
@subsubsection Library



@itemize -

@item 
bpo-35512@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35512}: @ref{1968,,unittest.mock.patch.dict()} used as a decorator with
string target resolves the target during function call instead of during
decorator construction. Patch by Karthikeyan Singaravelan.

@item 
bpo-36018@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36018}: Add statistics.NormalDist, a tool for creating and manipulating
normal distributions of random variable.  Features a composite class that
treats the mean and standard deviation of measurement data as single
entity.

@item 
bpo-35904@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35904}: Added statistics.fmean() as a faster, floating-point variant of
the existing mean() function.

@item 
bpo-35918@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35918}: Removed broken @code{has_key} method from
multiprocessing.managers.SyncManager.dict. Contributed by Rémi Lapeyre.

@item 
bpo-18283@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18283}: Add support for bytes to @ref{6da,,shutil.which()}.

@item 
bpo-35960@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35960}: Fix @ref{195b,,dataclasses.field()} throwing away empty mapping
objects passed as metadata.

@item 
bpo-35500@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35500}: Write expected and actual call parameters on separate lines in
@ref{1e00,,unittest.mock.Mock.assert_called_with()} assertion errors.
Contributed by Susan Su.

@item 
bpo-35931@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35931}: The @ref{aa,,pdb} @code{debug} command now gracefully handles syntax
errors.

@item 
bpo-24209@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24209}: In http.server script, rely on getaddrinfo to bind to preferred
address based on the bind parameter. Now default bind or binding to a name
may bind to IPv6 or dual-stack, depending on the environment.

@item 
bpo-35321@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35321}: Set @code{__spec__.origin} of  @code{_frozen_importlib} to frozen so
that it matches the behavior of @code{_frozen_importlib_external}.  Patch by
Nina Zakharenko.

@item 
bpo-35378@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35378}: Fix a reference issue inside @code{multiprocessing.Pool} that
caused the pool to remain alive if it was deleted without being closed or
terminated explicitly. A new strong reference is added to the pool
iterators to link the lifetime of the pool to the lifetime of its
iterators so the pool does not get destroyed if a pool iterator is still
alive.

@item 
bpo-34294@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34294}: re module, fix wrong capturing groups in rare cases.
@ref{1431,,re.search()}, @ref{1229,,re.findall()}, @ref{5a2,,re.sub()} and other functions
that scan through string looking for a match, should reset capturing
groups between two match attempts. Patch by Ma Lin.

@item 
bpo-35615@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35615}: @ref{11a,,weakref}: Fix a RuntimeError when copying a
WeakKeyDictionary or a WeakValueDictionary, due to some keys or values
disappearing while iterating.

@item 
bpo-35606@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35606}: Implement @ref{bf6,,math.prod()} as analogous function to
@ref{694,,sum()} that returns the product of a ‘start’ value (default: 1) times
an iterable of numbers. Patch by Pablo Galindo.

@item 
bpo-32417@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32417}: Performing arithmetic between @ref{4e2,,datetime.datetime}
subclasses and @ref{bc2,,datetime.timedelta} now returns an object of the
same type as the @code{datetime.datetime} subclass. As a result,
@ref{bc3,,datetime.datetime.astimezone()} and alternate constructors like
@ref{710,,datetime.datetime.now()} and @code{datetime.fromtimestamp()} called
with a @code{tz} argument now `also' retain their subclass.

@item 
bpo-35153@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35153}: Add `headers' optional keyword-only parameter to
@ref{c4b,,xmlrpc.client.ServerProxy}, @code{xmlrpc.client.Transport} and
@code{xmlrpc.client.SafeTransport}.  Patch by Cédric Krier.

@item 
bpo-34572@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34572}: Fix C implementation of pickle.loads to use importlib’s locking
mechanisms, and thereby avoid using partially loaded modules. Patch by Tim
Burgess.
@end itemize

@node Documentation<55>,Tests<54>,Library<161>,Python 3 8 0 alpha 2
@anchor{whatsnew/changelog id745}@anchor{1e01}
@subsubsection Documentation



@itemize -

@item 
bpo-36083@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36083}: Fix formatting of –check-hash-based-pycs options in the
manpage Synopsis.

@item 
bpo-36007@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36007}: Bump minimum sphinx version to 1.8.  Patch by Anthony Sottile.

@item 
bpo-22062@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22062}: Update documentation and docstrings for pathlib. Original patch
by Mike Short.
@end itemize

@node Tests<54>,Windows<54>,Documentation<55>,Python 3 8 0 alpha 2
@anchor{whatsnew/changelog id746}@anchor{1e02}
@subsubsection Tests



@itemize -

@item 
bpo-27313@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27313}: Avoid test_ttk_guionly ComboboxTest failure with macOS Cocoa
Tk.

@item 
bpo-36019@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36019}: Add test.support.TEST_HTTP_URL and replace references of
@indicateurl{http://www.example.com} by this new constant. Contributed by Stéphane
Wirtel.

@item 
bpo-36037@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=36037}: Fix test_ssl for strict OpenSSL configuration like RHEL8 strict
crypto policy. Use older TLS version for minimum TLS version of the server
SSL context if needed, to test TLS version older than default minimum TLS
version.

@item 
bpo-35798@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35798}: Added @code{test.support.check_syntax_warning()}.

@item 
bpo-35505@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35505}: Make test_imap4_host_default_value independent on whether the
local IMAP server is running.

@item 
bpo-35917@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35917}: multiprocessing: provide unit tests for SyncManager and
SharedMemoryManager classes + all the shareable types which are supposed
to be supported by them.  (patch by Giampaolo Rodola)

@item 
bpo-35704@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35704}: Skip @code{test_shutil.test_unpack_archive_xztar} to prevent a
MemoryError on 32-bit AIX when MAXDATA setting is less than 0x20000000.

Patch by Michael Felt (aixtools)

@item 
bpo-34720@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34720}: Assert m_state != NULL to mimic GC traversal functions that do
not correctly handle module creation when the module state has not been
created.
@end itemize

@node Windows<54>,IDLE<36>,Tests<54>,Python 3 8 0 alpha 2
@anchor{whatsnew/changelog id747}@anchor{1e03}
@subsubsection Windows



@itemize -

@item 
bpo-35976@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35976}: Added ARM build support to Windows build files in PCBuild.

@item 
bpo-35692@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35692}: @code{pathlib} no longer raises when checking file and directory
existence on drives that are not ready

@item 
bpo-35872@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35872}: Uses the base Python executable when invoking venv in a virtual
environment

@item 
bpo-35873@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35873}: Prevents venv paths being inherited by child processes

@item 
bpo-35299@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35299}: Fix sysconfig detection of the source directory and distutils
handling of pyconfig.h during PGO profiling
@end itemize

@node IDLE<36>,,Windows<54>,Python 3 8 0 alpha 2
@anchor{whatsnew/changelog id748}@anchor{1e04}
@subsubsection IDLE



@itemize -

@item 
bpo-24310@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24310}: IDLE – Document settings dialog font tab sample.

@item 
bpo-35833@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35833}: Revise IDLE doc for control codes sent to Shell. Add a code
example block.

@item 
bpo-35689@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35689}: Add docstrings and unittests for colorizer.py.
@end itemize

@node Python 3 8 0 alpha 1,Python 3 7 0 final,Python 3 8 0 alpha 2,Changelog
@anchor{whatsnew/changelog python-3-8-0-alpha-1}@anchor{1e05}
@subsection Python 3.8.0 alpha 1


`Release date: 2019-02-03'

@menu
* Security: Security<47>. 
* Core and Builtins: Core and Builtins<159>. 
* Library: Library<162>. 
* Documentation: Documentation<56>. 
* Tests: Tests<55>. 
* Build: Build<62>. 
* Windows: Windows<55>. 
* macOS: macOS<42>. 
* IDLE: IDLE<37>. 
* Tools/Demos: Tools/Demos<37>. 
* C API: C API<57>. 

@end menu

@node Security<47>,Core and Builtins<159>,,Python 3 8 0 alpha 1
@anchor{whatsnew/changelog id749}@anchor{1e06}
@subsubsection Security



@itemize -

@item 
bpo-35746@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35746}: 
@geindex Common Vulnerabilities and Exposures; CVE 2019-5010
CVE 2019-5010@footnote{https://www.cve.org/CVERecord?id=CVE-2019-5010}: Fix a NULL pointer deref in ssl module. The
cert parser did not handle CRL distribution points with empty DP or URI
correctly. A malicious or buggy certificate can result into segfault.
Vulnerability (TALOS-2018-0758) reported by Colin Read and Nicolas Edet of
Cisco.

@item 
bpo-34812@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34812}: The @ref{b56,,-I} command line option (run Python in isolated
mode) is now also copied by the @ref{98,,multiprocessing} and @code{distutils}
modules when spawning child processes. Previously, only @ref{b55,,-E} and
@ref{1593,,-s} options (enabled by @code{-I}) were copied.

@item 
bpo-34791@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34791}: The xml.sax and xml.dom.domreg no longer use environment
variables to override parser implementations when
sys.flags.ignore_environment is set by -E or -I arguments.

@item 
bpo-17239@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17239}: The xml.sax and xml.dom.minidom parsers no longer processes
external entities by default. External DTD and ENTITY declarations no
longer load files or create network connections.

@item 
bpo-34623@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34623}: 
@geindex Common Vulnerabilities and Exposures; CVE 2018-14647
CVE 2018-14647@footnote{https://www.cve.org/CVERecord?id=CVE-2018-14647}: The C accelerated _elementtree module now
initializes hash randomization salt from _Py_HashSecret instead of
libexpat’s default CSPRNG.

@item 
bpo-34405@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34405}: Updated to OpenSSL 1.1.0i for Windows builds.

@item 
bpo-33871@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33871}: Fixed sending the part of the file in @ref{d04,,os.sendfile()} on
macOS.  Using the `trailers' argument could cause sending more bytes from
the input file than was specified.

@item 
bpo-32533@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32533}: Fixed thread-safety of error handling in _ssl.

@item 
bpo-33136@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33136}: Harden ssl module against LibreSSL 
@geindex Common Vulnerabilities and Exposures; CVE 2018-8970
CVE 2018-8970@footnote{https://www.cve.org/CVERecord?id=CVE-2018-8970}.
X509_VERIFY_PARAM_set1_host() is called with an explicit namelen. A new
test ensures that NULL bytes are not allowed.

@item 
bpo-33001@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33001}: Minimal fix to prevent buffer overrun in os.symlink on Windows

@item 
bpo-32981@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32981}: Regexes in difflib and poplib were vulnerable to catastrophic
backtracking. These regexes formed potential DOS vectors (REDOS). They
have been refactored. This resolves 
@geindex Common Vulnerabilities and Exposures; CVE 2018-1060
CVE 2018-1060@footnote{https://www.cve.org/CVERecord?id=CVE-2018-1060} and 
@geindex Common Vulnerabilities and Exposures; CVE 2018-1061
CVE 2018-1061@footnote{https://www.cve.org/CVERecord?id=CVE-2018-1061}.
Patch by Jamie Davis.

@item 
bpo-28414@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28414}: The ssl module now allows users to perform their own IDN
en/decoding when using SNI.
@end itemize

@node Core and Builtins<159>,Library<162>,Security<47>,Python 3 8 0 alpha 1
@anchor{whatsnew/changelog id750}@anchor{1e07}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-35877@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35877}: Make parenthesis optional for named expressions in while
statement. Patch by Karthikeyan Singaravelan.

@item 
bpo-35814@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35814}: Allow same right hand side expressions in annotated assignments
as in normal ones. In particular, @code{x: Tuple[int, int] = 1, 2} (without
parentheses on the right) is now allowed.

@item 
bpo-35766@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35766}: Add the option to parse PEP 484 type comments in the ast
module. (Off by default.) This is merging the key functionality of the
third party fork thereof,
[typed_ast](@indicateurl{https://github.com/python/typed_ast}).

@item 
bpo-35713@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35713}: Reorganize Python initialization to get working exceptions and
sys.stderr earlier.

@item 
bpo-33416@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33416}: Add end line and end column position information to the Python
AST nodes. This is a C-level backwards incompatible change.

@item 
bpo-35720@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35720}: Fixed a minor memory leak in pymain_parse_cmdline_impl function
in Modules/main.c

@item 
bpo-35634@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35634}: @code{func(**kwargs)} will now raise an error when @code{kwargs} is a
mapping containing multiple entries with the same key. An error was
already raised when other keyword arguments are passed before @code{**kwargs}
since Python 3.6.

@item 
bpo-35623@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35623}: Fix a crash when sorting very long lists. Patch by Stephan
Hohe.

@item 
bpo-35214@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35214}: clang Memory Sanitizer build instrumentation was added to work
around false positives from posix, socket, time, test_io, and
test_faulthandler.

@item 
bpo-35560@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35560}: Fix an assertion error in @ref{199,,format()} in debug build for
floating-point formatting with “n” format, zero padding and small width.
Release build is not impacted. Patch by Karthikeyan Singaravelan.

@item 
bpo-35552@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35552}: Format characters @code{%s} and @code{%V} in
@ref{629,,PyUnicode_FromFormat()} and @code{%s} in @ref{1e08,,PyBytes_FromFormat()}
no longer read memory past the limit if `precision' is specified.

@item 
bpo-35504@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35504}: Fix segfaults and @ref{794,,SystemError}s when deleting certain
attributes. Patch by Zackery Spytz.

@item 
bpo-35504@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35504}: Fixed a SystemError when delete the characters_written
attribute of an OSError.

@item 
bpo-35494@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35494}: Improved syntax error messages for unbalanced parentheses in
f-string.

@item 
bpo-35444@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35444}: Fixed error handling in pickling methods when fail to look up
builtin “getattr”. Sped up pickling iterators.

@item 
bpo-35436@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35436}: Fix various issues with memory allocation error handling.
Patch by Zackery Spytz.

@item 
bpo-35423@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35423}: Separate the signal handling trigger in the eval loop from the
“pending calls” machinery. There is no semantic change and the difference
in performance is insignificant.

@item 
bpo-35357@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35357}: Internal attributes’ names of unittest.mock._Call and
unittest.mock.MagicProxy (name, parent & from_kall) are now prefixed with
_mock_ in order to prevent clashes with widely used object attributes.
Fixed minor typo in test function name.

@item 
bpo-35372@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35372}: Fixed the code page decoder for input longer than 2 GiB
containing undecodable bytes.

@item 
bpo-35336@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35336}: Fix PYTHONCOERCECLOCALE=1 environment variable: only coerce the
C locale if the LC_CTYPE locale is “C”.

@item 
bpo-31241@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31241}: The `lineno' and `col_offset' attributes of AST nodes for list
comprehensions, generator expressions and tuples are now point to the
opening parenthesis or square brace. For tuples without parenthesis they
point to the position of the first item.

@item 
bpo-33954@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33954}: For @ref{832,,str.format()}, @code{float.__format__()} and
@code{complex.__format__()} methods for non-ASCII decimal point when using
the “n” formatter.

@item 
bpo-35269@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35269}: Fix a possible segfault involving a newly created coroutine.
Patch by Zackery Spytz.

@item 
bpo-35224@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35224}: Implement 
@geindex Python 향상 제안; PEP 572
PEP 572@footnote{https://peps.python.org/pep-0572/} (assignment expressions). Patch by Emily
Morehouse.

@item 
bpo-32492@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32492}: Speed up @code{namedtuple()} attribute access by 1.6x using a C
fast-path for the name descriptors. Patch by Pablo Galindo.

@item 
bpo-35214@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35214}: Fixed an out of bounds memory access when parsing a truncated
unicode escape sequence at the end of a string such as @code{'\N'}.  It would
read one byte beyond the end of the memory allocation.

@item 
bpo-35214@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35214}: The interpreter and extension modules have had annotations
added so that they work properly under clang’s Memory Sanitizer.  A new
configure flag –with-memory-sanitizer has been added to make test builds
of this nature easier to perform.

@item 
bpo-35193@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35193}: Fix an off by one error in the bytecode peephole optimizer
where it could read bytes beyond the end of bounds of an array when
removing unreachable code. This bug was present in every release of Python
3.6 and 3.7 until now.

@item 
bpo-35169@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35169}: Improved error messages for forbidden assignments.

@item 
bpo-34022@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34022}: Fix handling of hash-based bytecode files in @ref{138,,zipimport}.
Patch by Elvis Pranskevichus.

@item 
bpo-28401@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28401}: Debug builds will no longer to attempt to import extension
modules built for the ABI as they were never compatible to begin with.
Patch by Stefano Rivera.

@item 
bpo-29341@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29341}: Clarify in the docstrings of @ref{a5,,os} methods that path-like
objects are also accepted as input parameters.

@item 
bpo-35050@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35050}: @ref{d1,,socket}: Fix off-by-one bug in length check for
@code{AF_ALG} name and type.

@item 
bpo-29743@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29743}: Raise @ref{2ec,,ValueError} instead of @ref{a81,,OverflowError} in case
of a negative @code{_length_} in a @ref{1e09,,ctypes.Array} subclass.  Also
raise @ref{198,,TypeError} instead of @ref{5ee,,AttributeError} for non-integer
@code{_length_}. Original patch by Oren Milman.

@item 
bpo-16806@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16806}: Fix @code{lineno} and @code{col_offset} for multi-line string tokens.

@item 
bpo-35029@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35029}: @ref{1ae,,SyntaxWarning} raised as an exception at code generation
time will be now replaced with a @ref{18e,,SyntaxError} for better error
reporting.

@item 
bpo-34983@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34983}: Expose @ref{1e0a,,symtable.Symbol.is_nonlocal()} in the symtable
module. Patch by Pablo Galindo.

@item 
bpo-34974@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34974}: @ref{192,,bytes} and @ref{344,,bytearray} constructors no longer
convert unexpected exceptions (e.g. @ref{175f,,MemoryError} and
@ref{bc4,,KeyboardInterrupt}) to @ref{198,,TypeError}.

@item 
bpo-34939@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34939}: Allow annotated names in module namespace that are declared
global before the annotation happens. Patch by Pablo Galindo.

@item 
bpo-34973@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34973}: Fixed crash in @ref{192,,bytes()} when the @ref{24d,,list} argument is
mutated while it is iterated.

@item 
bpo-34876@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34876}: The `lineno' and `col_offset' attributes of the AST for
decorated function and class refer now to the position of the
corresponding @code{def}, @code{async def} and @code{class} instead of the position
of the first decorator. This leads to more correct line reporting in
tracing. This is the only case when the position of child AST nodes can
precede the position of the parent AST node.

@item 
bpo-34879@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34879}: Fix a possible null pointer dereference in bytesobject.c.
Patch by Zackery Spytz.

@item 
bpo-34784@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34784}: Fix the implementation of PyStructSequence_NewType in order to
create heap allocated StructSequences.

@item 
bpo-32912@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32912}: A @ref{1ae,,SyntaxWarning} is now emitted instead of a
@ref{1a3,,DeprecationWarning} for invalid escape sequences in string and bytes
literals.

@item 
bpo-34854@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34854}: Fixed a crash in compiling string annotations containing a
lambda with a keyword-only argument that doesn’t have a default value.

@item 
bpo-34850@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34850}: The compiler now produces a @ref{1ae,,SyntaxWarning} when identity
checks (@code{is} and @code{is not}) are used with certain types of literals
(e.g. strings, ints).  These can often work by accident in CPython, but
are not guaranteed by the language spec.  The warning advises users to use
equality tests (@code{==} and @code{!=}) instead.

@item 
bpo-34824@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34824}: Fix a possible null pointer dereference in Modules/_ssl.c.
Patch by Zackery Spytz.

@item 
bpo-30156@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30156}: The C function @code{property_descr_get()} uses a “cached” tuple
to optimize function calls. But this tuple can be discovered in debug mode
with @ref{28e,,sys.getobjects()}. Remove the optimization, it’s not really
worth it and it causes 3 different crashes last years.

@item 
bpo-34762@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34762}: Fix contextvars C API to use PyObject* pointer types.

@item 
bpo-34751@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34751}: The hash function for tuples is now based on xxHash which gives
better collision results on (formerly) pathological cases. Additionally,
on 64-bit systems it improves tuple hashes in general. Patch by Jeroen
Demeyer with substantial contributions by Tim Peters.

@item 
bpo-34735@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34735}: Fix a memory leak in Modules/timemodule.c.  Patch by Zackery
Spytz.

@item 
bpo-34683@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34683}: Fixed a bug where some SyntaxError error pointed to locations
that were off-by-one.

@item 
bpo-34651@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34651}: Only allow the main interpreter to fork.  The avoids the
possibility of affecting the main interpreter, which is critical to
operation of the runtime.

@item 
bpo-34653@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34653}: Remove unused function PyParser_SimpleParseStringFilename.

@item 
bpo-32236@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32236}: Warn that line buffering is not supported if @ref{316,,open()} is
called with binary mode and @code{buffering=1}.

@item 
bpo-34641@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34641}: Further restrict the syntax of the left-hand side of keyword
arguments in function calls. In particular, @code{f((keyword)=arg)} is now
disallowed.

@item 
bpo-34637@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34637}: Make the `start' argument to `sum()' visible as a keyword
argument.

@item 
bpo-1621@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1621}: Do not assume signed integer overflow behavior (C undefined
behavior) when performing set hash table resizing.

@item 
bpo-34588@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34588}: Fix an off-by-one in the recursive call pruning feature of
traceback formatting.

@item 
bpo-34485@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34485}: On Windows, the LC_CTYPE is now set to the user preferred
locale at startup. Previously, the LC_CTYPE locale was “C” at startup, but
changed when calling setlocale(LC_CTYPE, “”) or setlocale(LC_ALL, “”).

@item 
bpo-34485@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34485}: Standard streams like sys.stdout now use the “surrogateescape”
error handler, instead of “strict”, on the POSIX locale (when the C locale
is not coerced and the UTF-8 Mode is disabled).

@item 
bpo-34485@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34485}: Fix the error handler of standard streams like sys.stdout:
PYTHONIOENCODING=”:” is now ignored instead of setting the error handler
to “strict”.

@item 
bpo-34485@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34485}: Python now gets the locale encoding with C code to initialize
the encoding of standard streams like sys.stdout. Moreover, the encoding
is now initialized to the Python codec name to get a normalized encoding
name and to ensure that the codec is loaded. The change avoids importing
_bootlocale and _locale modules at startup by default.

@item 
bpo-34527@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34527}: On FreeBSD, Py_DecodeLocale() and Py_EncodeLocale() now also
forces the ASCII encoding if the LC_CTYPE locale is “POSIX”, not only if
the LC_CTYPE locale is “C”.

@item 
bpo-34527@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34527}: The UTF-8 Mode is now also enabled by the “POSIX” locale, not
only by the “C” locale.

@item 
bpo-34403@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34403}: On HP-UX with C or POSIX locale, sys.getfilesystemencoding()
now returns “ascii” instead of “roman8” (when the UTF-8 Mode is disabled
and the C locale is not coerced).

@item 
bpo-34523@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34523}: The Python filesystem encoding is now read earlier during the
Python initialization.

@item 
bpo-12458@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12458}: Tracebacks show now correct line number for subexpressions in
multiline expressions. Tracebacks show now the line number of the first
line for multiline expressions instead of the line number of the last
subexpression.

@item 
bpo-34408@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34408}: Prevent a null pointer dereference and resource leakage in
@code{PyInterpreterState_New()}.

@item 
bpo-34400@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34400}: Fix undefined behavior in parsetok.c.  Patch by Zackery Spytz.

@item 
bpo-33073@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33073}: Added as_integer_ratio to ints to make them more interoperable
with floats.

@item 
bpo-34377@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34377}: Update valgrind suppression list to use
@code{_PyObject_Free}/@code{_PyObject_Realloc} instead of
@code{PyObject_Free}/@code{PyObject_Realloc}.

@item 
bpo-34353@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34353}: Added the “socket” option in the @code{stat.filemode()} Python
implementation to match the C implementation.

@item 
bpo-34320@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34320}: Fix @code{dict(od)} didn’t copy iteration order of OrderedDict.

@item 
bpo-34113@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34113}: Fixed crash on debug builds when opcode stack was adjusted with
negative numbers. Patch by Constantin Petrisor.

@item 
bpo-34100@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34100}: Compiler now merges constants in tuples and frozensets
recursively. Code attributes like @code{co_names} are merged too.

@item 
bpo-34151@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34151}: Performance of list concatenation, repetition and slicing
operations is slightly improved. Patch by Sergey Fedoseev.

@item 
bpo-34170@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34170}: -X dev: it is now possible to override the memory allocator
using PYTHONMALLOC even if the developer mode is enabled.

@item 
bpo-33237@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33237}: Improved @ref{5ee,,AttributeError} message for partially
initialized module.

@item 
bpo-34149@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34149}: Fix min and max functions to get default behavior when key is
None.

@item 
bpo-34125@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34125}: Profiling of unbound built-in methods now works when
@code{**kwargs} is given.

@item 
bpo-34141@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34141}: Optimized pickling atomic types (None, bool, int, float, bytes,
str).

@item 
bpo-34126@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34126}: Fix crashes when profiling certain invalid calls of unbound
methods. Patch by Jeroen Demeyer.

@item 
bpo-24618@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24618}: Fixed reading invalid memory when create the code object with
too small varnames tuple or too large argument counts.

@item 
bpo-34068@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34068}: In @ref{505,,io.IOBase.close()}, ensure that the
@ref{1e0b,,closed} attribute is not set with a live exception.
Patch by Zackery Spytz and Serhiy Storchaka.

@item 
bpo-34087@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34087}: Fix buffer overflow while converting unicode to numeric values.

@item 
bpo-34080@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34080}: Fixed a memory leak in the compiler when it raised some
uncommon errors during tokenizing.

@item 
bpo-34066@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34066}: Disabled interruption by Ctrl-C between calling @code{open()} and
entering a `with' block in @code{with open()}.

@item 
bpo-34042@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34042}: Fix dict.copy() to maintain correct total refcount (as reported
by sys.gettotalrefcount()).

@item 
bpo-33418@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33418}: Fix potential memory leak in function object when it creates
reference cycle.

@item 
bpo-33985@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33985}: Implement contextvars.ContextVar.name attribute.

@item 
bpo-33956@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33956}: Update vendored Expat library copy to version 2.2.5.

@item 
bpo-24596@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24596}: Decref the module object in @ref{1cc7,,PyRun_SimpleFileExFlags()}
before calling @ref{1d29,,PyErr_Print()}.  Patch by Zackery Spytz.

@item 
bpo-33451@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33451}: Close directly executed pyc files before calling
@code{PyEval_EvalCode()}.

@item 
bpo-1617161@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1617161}: The hash of @code{BuiltinMethodType} instances (methods of
built-in classes) now depends on the hash of the identity of `__self__'
instead of its value. The hash and equality of @code{ModuleType} and
@code{MethodWrapperType} instances (methods of user-defined classes and
some methods of built-in classes like @code{str.__add__}) now depend on the
hash and equality of the identity of `__self__' instead of its value.
@code{MethodWrapperType} instances no longer support ordering.

@item 
bpo-33824@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33824}: Fix “LC_ALL=C python3.7 -V”: reset properly the command line
parser when the encoding changes after reading the Python configuration.

@item 
bpo-33803@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33803}: Fix a crash in hamt.c caused by enabling GC tracking for an
object that hadn’t all of its fields set to NULL.

@item 
bpo-33738@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33738}: Seven macro incompatibilities with the Limited API were fixed,
and the macros @ref{1caf,,PyIter_Check()}, @ref{b80,,PyIndex_Check()} and
@ref{c5a,,PyExceptionClass_Name()} were added as functions. A script for
automatic macro checks was added.

@item 
bpo-33786@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33786}: Fix asynchronous generators to handle GeneratorExit in athrow()
correctly

@item 
bpo-30167@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30167}: @code{PyRun_SimpleFileExFlags} removes @code{__cached__} from module
in addition to @code{__file__}.

@item 
bpo-33706@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33706}: Fix a crash in Python initialization when parsing the command
line options. Thanks Christoph Gohlke for the bug report and the fix!

@item 
bpo-33597@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33597}: Reduce @code{PyGC_Head} size from 3 words to 2 words.

@item 
bpo-30654@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30654}: Fixed reset of the SIGINT handler to SIG_DFL on interpreter
shutdown even when there was a custom handler set previously. Patch by
Philipp Kerling.

@item 
bpo-33622@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33622}: Fixed a leak when the garbage collector fails to add an object
with the @code{__del__} method or referenced by it into the
@ref{13c6,,gc.garbage} list. @ref{b84,,PyGC_Collect()} can now be called when an
exception is set and preserves it.

@item 
bpo-33462@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33462}: Make dict and dict views reversible. Patch by Rémi Lapeyre.

@item 
bpo-23722@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23722}: A @ref{244,,RuntimeError} is now raised when the custom metaclass
doesn’t provide the @code{__classcell__} entry in the namespace passed to
@code{type.__new__}.  A @ref{1a3,,DeprecationWarning} was emitted in Python
3.6–3.7.

@item 
bpo-33499@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33499}: Add 
@geindex PYTHONPYCACHEPREFIX
@geindex 환경 변수; PYTHONPYCACHEPREFIX
@ref{b9a,,PYTHONPYCACHEPREFIX} environment variable and
@ref{16f,,-X} @code{pycache_prefix} command-line option to set an alternate
root directory for writing module bytecode cache files.

@item 
bpo-25711@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25711}: The @ref{138,,zipimport} module has been rewritten in pure Python.

@item 
bpo-33509@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33509}: Fix module_globals parameter of warnings.warn_explicit(): don’t
crash if module_globals is not a dict.

@item 
bpo-31849@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31849}: Fix signed/unsigned comparison warning in pyhash.c.

@item 
bpo-33475@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33475}: Fixed miscellaneous bugs in converting annotations to strings
and optimized parentheses in the string representation.

@item 
bpo-20104@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20104}: Added support for the @code{setpgroup}, @code{resetids},
@code{setsigmask}, @code{setsigdef} and @code{scheduler} parameters of
@code{posix_spawn}. Patch by Pablo Galindo.

@item 
bpo-33391@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33391}: Fix a leak in set_symmetric_difference().

@item 
bpo-33363@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33363}: Raise a SyntaxError for @code{async with} and @code{async for}
statements outside of async functions.

@item 
bpo-28055@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28055}: Fix unaligned accesses in siphash24(). Patch by Rolf Eike Beer.

@item 
bpo-33128@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33128}: Fix a bug that causes PathFinder to appear twice on
sys.meta_path. Patch by Pablo Galindo Salgado.

@item 
bpo-33331@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33331}: Modules imported last are now cleared first at interpreter
shutdown.

@item 
bpo-33312@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33312}: Fixed clang ubsan (undefined behavior sanitizer) warnings in
dictobject.c by adjusting how the internal struct _dictkeysobject shared
keys structure is declared.

@item 
bpo-33305@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33305}: Improved syntax error messages for invalid numerical literals.

@item 
bpo-33306@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33306}: Improved syntax error messages for unbalanced parentheses.

@item 
bpo-33234@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33234}: The list constructor will pre-size and not over-allocate when
the input length is known.

@item 
bpo-33270@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33270}: Intern the names for all anonymous code objects.  Patch by
Zackery Spytz.

@item 
bpo-30455@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30455}: The C and Python code and the documentation related to tokens
are now generated from a single source file @code{Grammar/Tokens}.

@item 
bpo-33176@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33176}: Add a @code{toreadonly()} method to memoryviews.

@item 
bpo-33231@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33231}: Fix potential memory leak in @code{normalizestring()}.

@item 
bpo-33205@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33205}: Change dict growth function from
@code{round_up_to_power_2(used*2+hashtable_size/2)} to
@code{round_up_to_power_2(used*3)}.  Previously, dict is shrunk only when
@code{used == 0}. Now dict has more chance to be shrunk.

@item 
bpo-29922@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29922}: Improved error messages in ‘async with’ when @code{__aenter__()}
or @code{__aexit__()} return non-awaitable object.

@item 
bpo-33199@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33199}: Fix @code{ma_version_tag} in dict implementation is uninitialized
when copying from key-sharing dict.

@item 
bpo-33053@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33053}: When using the -m switch, sys.path[0] is now explicitly
expanded as the `starting' working directory, rather than being left as
the empty path (which allows imports from the current working directory at
the time of the import)

@item 
bpo-33138@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33138}: Changed standard error message for non-pickleable and
non-copyable types. It now says “cannot pickle” instead of “can’t pickle”
or “cannot serialize”.

@item 
bpo-33018@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33018}: Improve consistency of errors raised by @code{issubclass()} when
called with a non-class and an abstract base class as the first and second
arguments, respectively. Patch by Josh Bronson.

@item 
bpo-33083@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33083}: @code{math.factorial} no longer accepts arguments that are not
int-like. Patch by Pablo Galindo.

@item 
bpo-33041@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33041}: Added new opcode @ref{ca0,,END_ASYNC_FOR} and fixes the
following issues:


@itemize *

@item 
Setting global @ref{1e0c,,StopAsyncIteration} no longer breaks @code{async for}
loops.

@item 
Jumping into an @code{async for} loop is now disabled.

@item 
Jumping out of an @code{async for} loop no longer corrupts the stack.
@end itemize

@item 
bpo-25750@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25750}: Fix rare Python crash due to bad refcounting in
@code{type_getattro()} if a descriptor deletes itself from the class. Patch
by Jeroen Demeyer.

@item 
bpo-33041@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33041}: Fixed bytecode generation for “async for” with a complex
target. A StopAsyncIteration raised on assigning or unpacking will be now
propagated instead of stopping the iteration.

@item 
bpo-33026@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33026}: Fixed jumping out of “with” block by setting f_lineno.

@item 
bpo-33005@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33005}: Fix a crash on fork when using a custom memory allocator (ex:
using PYTHONMALLOC env var). _PyGILState_Reinit() and
_PyInterpreterState_Enable() now use the default RAW memory allocator to
allocate a new interpreters mutex on fork.

@item 
bpo-32911@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32911}: Due to unexpected compatibility issues discovered during
downstream beta testing, reverted bpo-29463@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29463}. @code{docstring} field is
removed from Module, ClassDef, FunctionDef, and AsyncFunctionDef ast nodes
which was added in 3.7a1.  Docstring expression is restored as a first
statement in their body. Based on patch by Inada Naoki.

@item 
bpo-17288@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17288}: Prevent jumps from ‘return’ and ‘exception’ trace events.

@item 
bpo-32946@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32946}: Importing names from already imported module with “from …
import …” is now 30% faster if the module is not a package.

@item 
bpo-32932@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32932}: Make error message more revealing when there are non-str
objects in @code{__all__}.

@item 
bpo-32925@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32925}: Optimized iterating and containing test for literal lists
consisting of non-constants: @code{x in [a, b]} and @code{for x in [a, b]}. The
case of all constant elements already was optimized.

@item 
bpo-32889@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32889}: Update Valgrind suppression list to account for the rename of
@code{Py_ADDRESS_IN_RANG} to @code{address_in_range}.

@item 
bpo-32836@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32836}: Don’t use temporary variables in cases of list/dict/set
comprehensions

@item 
bpo-31356@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31356}: Remove the new API added in bpo-31356@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31356} (gc.ensure_disabled()
context manager).

@item 
bpo-32305@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32305}: For namespace packages, ensure that both @code{__file__} and
@code{__spec__.origin} are set to None.

@item 
bpo-32303@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32303}: Make sure @code{__spec__.loader} matches @code{__loader__} for
namespace packages.

@item 
bpo-32711@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32711}: Fix the warning messages for Python/ast_unparse.c. Patch by
Stéphane Wirtel

@item 
bpo-32583@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32583}: Fix possible crashing in builtin Unicode decoders caused by
write out-of-bound errors when using customized decode error handlers.

@item 
bpo-32489@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32489}: A @ref{180,,continue} statement is now allowed in the
@ref{1b0,,finally} clause.

@item 
bpo-17611@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17611}: Simplified the interpreter loop by moving the logic of
unrolling the stack of blocks into the compiler. The compiler emits now
explicit instructions for adjusting the stack of values and calling the
cleaning up code for @ref{17f,,break}, @ref{180,,continue} and
@ref{1af,,return}.

Removed opcodes @code{BREAK_LOOP}, @code{CONTINUE_LOOP},
@code{SETUP_LOOP} and @code{SETUP_EXCEPT}. Added new opcodes
@code{ROT_FOUR}, @code{BEGIN_FINALLY} and @code{CALL_FINALLY} and
@code{POP_FINALLY}. Changed the behavior of @code{END_FINALLY} and
@code{WITH_CLEANUP_START}.

@item 
bpo-32285@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32285}: New function unicodedata.is_normalized, which can check whether
a string is in a specific normal form.

@item 
bpo-10544@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10544}: Yield expressions are now disallowed in comprehensions and
generator expressions except the expression for the outermost iterable.

@item 
bpo-32117@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32117}: Iterable unpacking is now allowed without parentheses in yield
and return statements, e.g. @code{yield 1, 2, 3, *rest}. Thanks to David
Cuthbert for the change and Jordan Chapman for added tests.

@item 
bpo-31902@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31902}: Fix the @code{col_offset} attribute for ast nodes
@code{ast.AsyncFor}, @code{ast.AsyncFunctionDef}, and @code{ast.AsyncWith}.
Previously, @code{col_offset} pointed to the keyword after @code{async}.

@item 
bpo-25862@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25862}: Fix assertion failures in the @code{tell()} method of
@code{io.TextIOWrapper}. Patch by Zackery Spytz.

@item 
bpo-21983@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21983}: Fix a crash in @code{ctypes.cast()} in case the type argument is a
ctypes structured data type. Patch by Eryk Sun and Oren Milman.

@item 
bpo-31577@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31577}: Fix a crash in @code{os.utime()} in case of a bad ns argument.
Patch by Oren Milman.

@item 
bpo-29832@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29832}: Remove references to ‘getsockaddrarg’ from various socket error
messages. Patch by Oren Milman.
@end itemize

@node Library<162>,Documentation<56>,Core and Builtins<159>,Python 3 8 0 alpha 1
@anchor{whatsnew/changelog id751}@anchor{1e0d}
@subsubsection Library



@itemize -

@item 
bpo-35845@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35845}: Add ‘order’ parameter to memoryview.tobytes().

@item 
bpo-35864@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35864}: The _asdict() method for collections.namedtuple now returns a
regular dict instead of an OrderedDict.

@item 
bpo-35537@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35537}: An ExitStack is now used internally within subprocess.Popen to
clean up pipe file handles. No behavior change in normal operation. But if
closing one handle were ever to cause an exception, the others will now be
closed instead of leaked.  (patch by Giampaolo Rodola)

@item 
bpo-35847@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35847}: RISC-V needed the CTYPES_PASS_BY_REF_HACK.  Fixes ctypes
Structure test_pass_by_value.

@item 
bpo-35813@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35813}: Shared memory submodule added to multiprocessing to avoid need
for serialization between processes

@item 
bpo-35780@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35780}: Fix lru_cache() errors arising in recursive, reentrant, or
multi-threaded code. These errors could result in orphan links and in the
cache being trapped in a state with fewer than the specified maximum
number of links. Fix handling of negative maxsize which should have been
treated as zero. Fix errors in toggling the “full” status flag. Fix
misordering of links when errors are encountered.  Sync-up the C code and
pure Python code for the space saving path in functions with a single
positional argument. In this common case, the space overhead of an lru
cache entry is reduced by almost half.  Fix counting of cache misses. In
error cases, the miss count was out of sync with the actual number of
times the underlying user function was called.

@item 
bpo-35537@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35537}: @ref{52e,,os.posix_spawn()} and @ref{1769,,os.posix_spawnp()} now have a
`setsid' parameter.

@item 
bpo-23846@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23846}: @ref{81c,,asyncio.ProactorEventLoop} now catches and logs send
errors when the self-pipe is full.

@item 
bpo-34323@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34323}: @ref{b,,asyncio}: Enhance @code{IocpProactor.close()} log: wait 1
second before the first log, then log every second. Log also the number of
seconds since @code{close()} was called.

@item 
bpo-35674@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35674}: Add a new @ref{1769,,os.posix_spawnp()} function. Patch by Joannah
Nanjekye.

@item 
bpo-35733@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35733}: @code{ast.Constant(boolean)} no longer an instance of
@code{ast.Num}.  Patch by Anthony Sottile.

@item 
bpo-35726@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35726}: QueueHandler.prepare() now makes a copy of the record before
modifying and enqueueing it, to avoid affecting other handlers in the
chain.

@item 
bpo-35719@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35719}: Sped up multi-argument @ref{92,,math} functions atan2(),
copysign(), remainder() and hypot() by 1.3–2.5 times.

@item 
bpo-35717@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35717}: Fix KeyError exception raised when using enums and compile.
Patch contributed by Rémi Lapeyre.

@item 
bpo-35699@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35699}: Fixed detection of Visual Studio Build Tools 2017 in distutils

@item 
bpo-32710@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32710}: Fix memory leaks in asyncio ProactorEventLoop on overlapped
operation failure.

@item 
bpo-35702@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35702}: The @ref{c36,,time.CLOCK_UPTIME_RAW} constant is now available
for macOS 10.12.

@item 
bpo-32710@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32710}: Fix a memory leak in asyncio in the ProactorEventLoop when
@code{ReadFile()} or @code{WSASend()} overlapped operation fail immediately:
release the internal buffer.

@item 
bpo-35682@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35682}: Fix @code{asyncio.ProactorEventLoop.sendfile()}: don’t attempt to
set the result of an internal future if it’s already done.

@item 
bpo-35283@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35283}: Add a deprecated warning for the
@code{threading.Thread.isAlive()} method. Patch by Donghee Na.

@item 
bpo-35664@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35664}: Improve operator.itemgetter() performance by 33% with optimized
argument handling and with adding a fast path for the common case of a
single non-negative integer index into a tuple (which is the typical use
case in the standard library).

@item 
bpo-35643@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35643}: Fixed a SyntaxWarning: invalid escape sequence in
Modules/_sha3/cleanup.py. Patch by Mickaël Schoentgen.

@item 
bpo-35619@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35619}: Improved support of custom data descriptors in @ref{ad4,,help()} and
@ref{ba,,pydoc}.

@item 
bpo-28503@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28503}: The @code{crypt} module now internally uses the @code{crypt_r()}
library function instead of @code{crypt()} when available.

@item 
bpo-35614@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35614}: Fixed help() on metaclasses. Patch by Sanyam Khurana.

@item 
bpo-35568@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35568}: Expose @code{raise(signum)} as @code{raise_signal}

@item 
bpo-35588@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35588}: The floor division and modulo operations and the @ref{b98,,divmod()}
function on @ref{213,,fractions.Fraction} types are 2–4x faster. Patch by
Stefan Behnel.

@item 
bpo-35585@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35585}: Speed-up building enums by value, e.g. http.HTTPStatus(200).

@item 
bpo-30561@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30561}: random.gammavariate(1.0, beta) now computes the same result as
random.expovariate(1.0 / beta).  This synchronizes the two algorithms and
eliminates some idiosyncrasies in the old implementation.  It does however
produce a difference stream of random variables than it used to.

@item 
bpo-35537@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35537}: The @ref{dc,,subprocess} module can now use the
@ref{52e,,os.posix_spawn()} function in some cases for better performance.

@item 
bpo-35526@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35526}: Delaying the ‘joke’ of barry_as_FLUFL.mandatory to Python
version 4.0

@item 
bpo-35523@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35523}: Remove @ref{2e,,ctypes} callback workaround: no longer create a
callback at startup. Avoid SELinux alert on @code{import ctypes} and @code{import
uuid}.

@item 
bpo-31784@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31784}: @ref{da0,,uuid.uuid1()} now calls @ref{cdf,,time.time_ns()} rather than
@code{int(time.time() * 1e9)}.

@item 
bpo-35513@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35513}: @code{TextTestRunner} of
@code{unittest.runner} now uses @ref{c79,,time.perf_counter()} rather than
@ref{55c,,time.time()} to measure the execution time of a test:
@code{time.time()} can go backwards, whereas @code{time.perf_counter()} is
monotonic.

@item 
bpo-35502@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35502}: Fixed reference leaks in
@ref{c49,,xml.etree.ElementTree.TreeBuilder} in case of unfinished building
of the tree (in particular when an error was raised during parsing XML).

@item 
bpo-35348@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35348}: Make @ref{1a06,,platform.architecture()} parsing of @code{file} command
output more reliable: add the @code{-b} option to the @code{file} command to
omit the filename, force the usage of the C locale, and search also the
“shared object” pattern.

@item 
bpo-35491@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35491}: @ref{98,,multiprocessing}: Add @code{Pool.__repr__()} and enhance
@code{BaseProcess.__repr__()} (add pid and parent pid) to ease debugging.
Pool state constant values are now strings instead of integers, for
example @code{RUN} value becomes @code{'RUN'} instead of @code{0}.

@item 
bpo-35477@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35477}: @code{multiprocessing.Pool.__enter__()} now fails if the pool is
not running: @code{with pool:} fails if used more than once.

@item 
bpo-31446@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31446}: Copy command line that was passed to CreateProcessW since this
function can change the content of the input buffer.

@item 
bpo-35471@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35471}: Python 2.4 dropped MacOS 9 support. The macpath module was
deprecated in Python 3.7. The module is now removed.

@item 
bpo-23057@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23057}: Unblock Proactor event loop when keyboard interrupt is received
on Windows

@item 
bpo-35052@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35052}: Fix xml.dom.minidom cloneNode() on a document with an entity:
pass the correct arguments to the user data handler of an entity.

@item 
bpo-20239@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20239}: Allow repeated assignment deletion of
@ref{c3d,,unittest.mock.Mock} attributes. Patch by Pablo Galindo.

@item 
bpo-17185@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17185}: Set @code{__signature__} on mock for @ref{82,,inspect} to get
signature. Patch by Karthikeyan Singaravelan.

@item 
bpo-35445@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35445}: Memory errors during creating posix.environ no longer ignored.

@item 
bpo-35415@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35415}: Validate fileno= argument to socket.socket().

@item 
bpo-35424@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35424}: @code{multiprocessing.Pool} destructor now emits
@ref{54e,,ResourceWarning} if the pool is still running.

@item 
bpo-35330@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35330}: When a @code{Mock} instance was used to wrap an object, if
@code{side_effect} is used in one of the mocks of it methods, don’t call the
original implementation and return the result of using the side effect the
same way that it is done with return_value.

@item 
bpo-35346@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35346}: Drop Mac OS 9 and Rhapsody support from the @ref{af,,platform}
module. Rhapsody last release was in 2000. Mac OS 9 last release was in
2001.

@item 
bpo-10496@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10496}: @code{check_environ()} of @code{distutils.utils}
now catches @ref{5e5,,KeyError} on calling @ref{1e0e,,pwd.getpwuid()}: don’t create
the @code{HOME} environment variable in this case.

@item 
bpo-10496@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10496}: @code{posixpath.expanduser()} now returns the input `path'
unchanged if the @code{HOME} environment variable is not set and the current
user has no home directory (if the current user identifier doesn’t exist
in the password database). This change fix the @ref{cc,,site} module if the
current user doesn’t exist in the password database (if the user has no
home directory).

@item 
bpo-35389@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35389}: @ref{17f8,,platform.libc_ver()} now uses
@code{os.confstr('CS_GNU_LIBC_VERSION')} if available and the `executable'
parameter is not set.

@item 
bpo-35394@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35394}: Add empty slots to asyncio abstract protocols.

@item 
bpo-35310@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35310}: Fix a bug in @ref{f9f,,select.select()} where, in some cases, the
file descriptor sequences were returned unmodified after a signal
interruption, even though the file descriptors might not be ready yet.
@code{select.select()} will now always return empty lists if a timeout has
occurred.  Patch by Oran Avraham.

@item 
bpo-35380@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35380}: Enable TCP_NODELAY on Windows for proactor asyncio event loop.

@item 
bpo-35341@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35341}: Add generic version of @code{collections.OrderedDict} to the
@code{typing} module. Patch by Ismo Toijala.

@item 
bpo-35371@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35371}: Fixed possible crash in @code{os.utime()} on Windows when pass
incorrect arguments.

@item 
bpo-35346@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35346}: @ref{1e0f,,platform.uname()} now redirects @code{stderr} to
@ref{1e10,,os.devnull} when running external programs like @code{cmd /c ver}.

@item 
bpo-35066@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35066}: Previously, calling the strftime() method on a datetime object
with a trailing ‘%’ in the format string would result in an exception.
However, this only occurred when the datetime C module was being used; the
python implementation did not match this behavior. Datetime is now PEP-399
compliant, and will not throw an exception on a trailing ‘%’.

@item 
bpo-35345@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35345}: The function @code{platform.popen} has been removed, it was
deprecated since Python 3.3: use @ref{31a,,os.popen()} instead.

@item 
bpo-35344@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35344}: On macOS, @ref{1ac4,,platform.platform()} now uses
@ref{1e11,,platform.mac_ver()}, if it returns a non-empty release string, to get
the macOS version rather than the darwin version.

@item 
bpo-35312@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35312}: Make @code{lib2to3.pgen2.parse.ParseError} round-trip pickle-able.
Patch by Anthony Sottile.

@item 
bpo-35308@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35308}: Fix regression in @code{webbrowser} where default browsers may be
preferred over browsers in the @code{BROWSER} environment variable.

@item 
bpo-24746@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24746}: Avoid stripping trailing whitespace in doctest fancy diff.
Original patch by R. David Murray & Jairo Trad. Enhanced by Sanyam
Khurana.

@item 
bpo-28604@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28604}: @ref{df7,,locale.localeconv()} now sets temporarily the @code{LC_CTYPE}
locale to the @code{LC_MONETARY} locale if the two locales are different and
monetary strings are non-ASCII. This temporary change affects other
threads.

@item 
bpo-35277@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35277}: Update ensurepip to install pip 18.1 and setuptools 40.6.2.

@item 
bpo-24209@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24209}: Adds IPv6 support when invoking http.server directly.

@item 
bpo-35226@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35226}: Recursively check arguments when testing for equality of
@ref{1db0,,unittest.mock.call} objects and add note that tracking of
parameters used to create ancestors of mocks in @code{mock_calls} is not
possible.

@item 
bpo-29564@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29564}: The warnings module now suggests to enable tracemalloc if the
source is specified, the tracemalloc module is available, but tracemalloc
is not tracing memory allocations.

@item 
bpo-35189@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35189}: Modify the following fnctl function to retry if interrupted by
a signal (EINTR): flock, lockf, fnctl

@item 
bpo-30064@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30064}: Use add_done_callback() in sock_* asyncio API to unsubscribe
reader/writer early on calcellation.

@item 
bpo-35186@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35186}: Removed the “built with” comment added when @code{setup.py upload}
is used with either @code{bdist_rpm} or @code{bdist_dumb}.

@item 
bpo-35152@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35152}: Allow sending more than 2 GB at once on a multiprocessing
connection on non-Windows systems.

@item 
bpo-35062@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35062}: Fix incorrect parsing of
@ref{1766,,io.IncrementalNewlineDecoder}’s `translate' argument.

@item 
bpo-35065@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35065}: Remove @code{StreamReaderProtocol._untrack_reader}. The call to
@code{_untrack_reader} is currently performed too soon, causing the protocol
to forget about the reader before @code{connection_lost} can run and feed the
EOF to the reader.

@item 
bpo-34160@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34160}: ElementTree and minidom now preserve the attribute order
specified by the user.

@item 
bpo-35079@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35079}: Improve difflib.SequenceManager.get_matching_blocks doc by
adding ‘non-overlapping’ and changing ‘!=’ to ‘<’.

@item 
bpo-33710@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33710}: Deprecated @code{l*gettext()} functions and methods in the
@ref{67,,gettext} module. They return encoded bytes instead of Unicode
strings and are artifacts from Python 2 times. Also deprecated functions
and methods related to setting the charset for @code{l*gettext()} functions
and methods.

@item 
bpo-35017@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35017}: @ref{1344,,socketserver.BaseServer.serve_forever()} now exits
immediately if it’s @ref{1e12,,shutdown()} method is
called while it is polling for new events.

@item 
bpo-35024@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35024}: @code{importlib} no longer logs @code{wrote <bytecode path>}
redundantly after @code{(created|could not create) <bytecode path>} is
already logged. Patch by Quentin Agren.

@item 
bpo-35047@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35047}: @code{unittest.mock} now includes mock calls in exception messages
if @code{assert_not_called}, @code{assert_called_once}, or
@code{assert_called_once_with} fails. Patch by Petter Strandmark.

@item 
bpo-31047@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31047}: Fix @code{ntpath.abspath} regression where it didn’t remove a
trailing separator on Windows. Patch by Tim Graham.

@item 
bpo-35053@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35053}: tracemalloc now tries to update the traceback when an object is
reused from a “free list” (optimization for faster object creation, used
by the builtin list type for example).

@item 
bpo-31553@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31553}: Add the –json-lines option to json.tool. Patch by hongweipeng.

@item 
bpo-34794@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34794}: Fixed a leak in Tkinter when pass the Python wrapper around
Tcl_Obj back to Tcl/Tk.

@item 
bpo-34909@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34909}: Enum: fix grandchildren subclassing when parent mixed with
concrete data types.

@item 
bpo-35022@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35022}: @ref{108e,,unittest.mock.MagicMock} now supports the
@code{__fspath__} method (from @ref{e4a,,os.PathLike}).

@item 
bpo-35008@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35008}: Fixed references leaks when call the @code{__setstate__()} method
of @ref{363,,xml.etree.ElementTree.Element} in the C implementation for
already initialized element.

@item 
bpo-23420@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23420}: Verify the value for the parameter ‘-s’ of the cProfile CLI.
Patch by Robert Kuska

@item 
bpo-33947@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33947}: dataclasses now handle recursive reprs without raising
RecursionError.

@item 
bpo-34890@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34890}: Make @ref{30d,,inspect.iscoroutinefunction()},
@ref{1b59,,inspect.isgeneratorfunction()} and @ref{1b5a,,inspect.isasyncgenfunction()}
work with @ref{217,,functools.partial()}. Patch by Pablo Galindo.

@item 
bpo-34521@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34521}: Use @ref{1e13,,socket.CMSG_SPACE()} to calculate ancillary data size
instead of @ref{1e14,,socket.CMSG_LEN()} in
@code{multiprocessing.reduction.recvfds()} as 
@geindex RFC; RFC 3542
RFC 3542@footnote{https://datatracker.ietf.org/doc/html/rfc3542.html} requires the use
of the former for portable applications.

@item 
bpo-31522@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31522}: The @code{mailbox.mbox.get_string} function `from_' parameter can
now successfully be set to a non-default value.

@item 
bpo-34970@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34970}: Protect tasks weak set manipulation in @code{asyncio.all_tasks()}

@item 
bpo-34969@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34969}: gzip: Add –fast, –best on the gzip CLI, these parameters will
be used for the fast compression method (quick) or the best method
compress (slower, but smaller file). Also, change the default compression
level to 6 (tradeoff).

@item 
bpo-16965@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16965}: The 2to3 @code{execfile} fixer now opens the file with mode
@code{'rb'}.  Patch by Zackery Spytz.

@item 
bpo-34966@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34966}: @ref{ba,,pydoc} now supports aliases not only to methods defined
in the end class, but also to inherited methods.  The docstring is not
duplicated for aliases.

@item 
bpo-34926@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34926}: @ref{1e15,,mimetypes.MimeTypes.guess_type()} now accepts
@ref{5a0,,path-like object} in addition to url strings. Patch by Mayank
Asthana.

@item 
bpo-23831@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23831}: Add @code{moveto()} method to the @code{tkinter.Canvas} widget. Patch
by Juliette Monsel.

@item 
bpo-34941@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34941}: Methods @code{find()}, @code{findtext()} and @code{findall()} of the
@code{Element} class in the @ref{12b,,xml.etree.ElementTree} module are now able
to find children which are instances of @code{Element} subclasses.

@item 
bpo-32680@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32680}: @ref{b27,,smtplib.SMTP} objects now always have a @code{sock}
attribute present

@item 
bpo-34769@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34769}: Fix for async generators not finalizing when event loop is in
debug mode and garbage collector runs in another thread.

@item 
bpo-34936@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34936}: Fix @code{TclError} in @code{tkinter.Spinbox.selection_element()}.
Patch by Juliette Monsel.

@item 
bpo-34829@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34829}: Add methods @code{selection_from}, @code{selection_range},
@code{selection_present} and @code{selection_to} to the @code{tkinter.Spinbox} for
consistency with the @code{tkinter.Entry} widget. Patch by Juliette Monsel.

@item 
bpo-34911@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34911}: Added `secure_protocols' argument to
`http.cookiejar.DefaultCookiePolicy' to allow for tweaking of protocols
and also to add support by default for `wss', the secure websocket
protocol.

@item 
bpo-34922@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34922}: Fixed integer overflow in the @ref{1e16,,digest()} and
@ref{1e17,,hexdigest()} methods for the SHAKE algorithm in the
@ref{6c,,hashlib} module.

@item 
bpo-34925@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34925}: 25% speedup in argument parsing for the functions in the bisect
module.

@item 
bpo-34900@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34900}: Fixed @ref{1c47,,unittest.TestCase.debug()} when used to call test
methods with subtests.  Patch by Bruno Oliveira.

@item 
bpo-34844@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34844}: logging.Formatter enhancement - Ensure styles and fmt matches
in logging.Formatter - Added validate method in each format style class:
StrFormatStyle, PercentStyle, StringTemplateStyle. - This method is called
in the constructor of logging.Formatter class - Also re-raise the KeyError
in the format method of each style class, so it would a bit clear that
it’s an error with the invalid format fields.

@item 
bpo-34897@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34897}: Adjust test.support.missing_compiler_executable check so that a
nominal command name of “” is ignored. Patch by Michael Felt.

@item 
bpo-34871@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34871}: Fix inspect module polluted @code{sys.modules} when parsing
@code{__text_signature__} of callable.

@item 
bpo-34898@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34898}: Add @code{mtime} argument to @code{gzip.compress} for reproducible
output. Patch by Guo Ci Teo.

@item 
bpo-28441@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28441}: On Cygwin and MinGW, ensure that @code{sys.executable} always
includes the full filename in the path, including the @code{.exe} suffix
(unless it is a symbolic link).

@item 
bpo-34866@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34866}: Adding @code{max_num_fields} to @code{cgi.FieldStorage} to make DOS
attacks harder by limiting the number of @code{MiniFieldStorage} objects
created by @code{FieldStorage}.

@item 
bpo-34711@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34711}: http.server ensures it reports HTTPStatus.NOT_FOUND when the
local path ends with “/” and is not a directory, even if the underlying OS
(e.g. AIX) accepts such paths as a valid file reference. Patch by Michael
Felt.

@item 
bpo-34872@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34872}: Fix self-cancellation in C implementation of asyncio.Task

@item 
bpo-34849@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34849}: Don’t log waiting for @code{selector.select} in asyncio loop
iteration. The waiting is pretty normal for any asyncio program, logging
its time just adds a noise to logs without any useful information
provided.

@item 
bpo-34022@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34022}: The 
@geindex SOURCE_DATE_EPOCH
@geindex 환경 변수; SOURCE_DATE_EPOCH
@code{SOURCE_DATE_EPOCH} environment variable no longer
overrides the value of the `invalidation_mode' argument to
@ref{c19,,py_compile.compile()}, and determines its default value instead.

@item 
bpo-34819@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34819}: Use a monotonic clock to compute timeouts in
@code{Executor.map()} and @code{as_completed()}, in order to prevent
timeouts from deviating when the system clock is adjusted.

@item 
bpo-34758@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34758}: Add .wasm -> application/wasm to list of recognized file types
and content type headers

@item 
bpo-34789@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34789}: @ref{1e18,,xml.sax.make_parser()} now accepts any iterable as its
`parser_list' argument.  Patch by Andrés Delfino.

@item 
bpo-34334@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34334}: In @code{QueueHandler}, clear @code{exc_text} from
@code{LogRecord} to prevent traceback from being written twice.

@item 
bpo-34687@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34687}: On Windows, asyncio now uses ProactorEventLoop, instead of
SelectorEventLoop, by default.

@item 
bpo-5950@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5950}: Support reading zip files with archive comments in
@ref{138,,zipimport}.

@item 
bpo-32892@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32892}: The parser now represents all constants as
@ref{2ef,,ast.Constant} instead of using specific constant AST types
(@code{Num}, @code{Str}, @code{Bytes}, @code{NameConstant} and @code{Ellipsis}). These
classes are considered deprecated and will be removed in future Python
versions.

@item 
bpo-34728@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34728}: Add deprecation warning when @code{loop} is used in methods:
@code{asyncio.sleep}, @code{asyncio.wait} and @code{asyncio.wait_for}.

@item 
bpo-34738@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34738}: ZIP files created by @code{distutils} will now include entries for
directories.

@item 
bpo-34659@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34659}: Add an optional `initial' argument to itertools.accumulate().

@item 
bpo-29577@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29577}: Support multiple mixin classes when creating Enums.

@item 
bpo-34670@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34670}: Add SSLContext.post_handshake_auth and
SSLSocket.verify_client_post_handshake for TLS 1.3’s post handshake
authentication feature.

@item 
bpo-32718@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32718}: The Activate.ps1 script from venv works with PowerShell Core
6.1 and is now available under all operating systems.

@item 
bpo-31177@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31177}: Fix bug that prevented using @ref{ef5,,reset_mock} on mock instances with deleted attributes

@item 
bpo-34672@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34672}: Add a workaround, so the @code{'Z'} @ref{13ee,,time.strftime()}
specifier on the musl C library can work in some cases.

@item 
bpo-34666@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34666}: Implement @code{asyncio.StreamWriter.awrite} and
@code{asyncio.StreamWriter.aclose()} coroutines.  Methods are needed for
providing a consistent stream API with control flow switched on by
default.

@item 
bpo-6721@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6721}: Acquire the logging module’s commonly used internal locks while
fork()ing to avoid deadlocks in the child process.

@item 
bpo-34658@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34658}: Fix a rare interpreter unhandled exception state SystemError
only seen when using subprocess with a preexec_fn while an after_parent
handler has been registered with os.register_at_fork and the fork system
call fails.

@item 
bpo-34652@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34652}: Ensure @ref{528,,os.lchmod()} is never defined on Linux.

@item 
bpo-34638@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34638}: Store a weak reference to stream reader to break strong
references loop between reader and protocol.  It allows to detect and
close the socket if the stream is deleted (garbage collected) without
@code{close()} call.

@item 
bpo-34536@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34536}: @code{Enum._missing_}:  raise @code{ValueError} if None returned and
@code{TypeError} if non-member is returned.

@item 
bpo-34636@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34636}: Speed up re scanning of many non-matching characters for s w
and d within bytes objects. (microoptimization)

@item 
bpo-24412@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24412}: Add @ref{c41,,addModuleCleanup()} and
@ref{c42,,addClassCleanup()} to unittest to support cleanups
for @ref{c3f,,setUpModule()} and
@ref{c40,,setUpClass()}. Patch by Lisa Roach.

@item 
bpo-34630@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34630}: Don’t log SSL certificate errors in asyncio code (connection
error logging is skipped already).

@item 
bpo-32490@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32490}: Prevent filename duplication in @ref{dc,,subprocess} exception
messages.  Patch by Zackery Spytz.

@item 
bpo-34363@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34363}: dataclasses.asdict() and .astuple() now handle namedtuples
correctly.

@item 
bpo-34625@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34625}: Update vendorized expat library version to 2.2.6.

@item 
bpo-32270@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32270}: The subprocess module no longer mistakenly closes redirected
fds even when they were in pass_fds when outside of the default @{0, 1, 2@}
set.

@item 
bpo-34622@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34622}: Create a dedicated @code{asyncio.CancelledError},
@code{asyncio.InvalidStateError} and @code{asyncio.TimeoutError} exception
classes.  Inherit them from corresponding exceptions from
@code{concurrent.futures} package. Extract @code{asyncio} exceptions into a
separate file.

@item 
bpo-34610@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34610}: Fixed iterator of @code{multiprocessing.managers.DictProxy}.

@item 
bpo-34421@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34421}: Fix distutils logging for non-ASCII strings.  This caused
installation issues on Windows.

@item 
bpo-34604@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34604}: Fix possible mojibake in the error message of @code{pwd.getpwnam}
and @code{grp.getgrnam} using string representation because of invisible
characters or trailing whitespaces. Patch by William Grzybowski.

@item 
bpo-30977@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30977}: Make uuid.UUID use @code{__slots__} to reduce its memory
footprint. Based on original patch by Wouter Bolsterlee.

@item 
bpo-34574@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34574}: OrderedDict iterators are not exhausted during pickling
anymore. Patch by Sergey Fedoseev.

@item 
bpo-8110@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8110}: Refactored @ref{dc,,subprocess} to check for Windows-specific
modules rather than @code{sys.platform == 'win32'}.

@item 
bpo-34530@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34530}: @code{distutils.spawn.find_executable()} now falls back on
@ref{1de1,,os.defpath} if the @code{PATH} environment variable is not set.

@item 
bpo-34563@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34563}: On Windows, fix multiprocessing.Connection for very large read:
fix _winapi.PeekNamedPipe() and _winapi.ReadFile() for read larger than
INT_MAX (usually @code{2**31-1}).

@item 
bpo-34558@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34558}: Correct typo in Lib/ctypes/_aix.py

@item 
bpo-34282@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34282}: Move @code{Enum._convert} to @code{EnumMeta._convert_} and fix enum
members getting shadowed by parent attributes.

@item 
bpo-22872@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22872}: When the queue is closed, @ref{2ec,,ValueError} is now raised by
@ref{1e19,,multiprocessing.Queue.put()} and @ref{1e1a,,multiprocessing.Queue.get()}
instead of @ref{8b7,,AssertionError} and @ref{2c0,,OSError}, respectively. Patch
by Zackery Spytz.

@item 
bpo-34515@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34515}: Fix parsing non-ASCII identifiers in
@code{lib2to3.pgen2.tokenize} (
@geindex Python 향상 제안; PEP 3131
PEP 3131@footnote{https://peps.python.org/pep-3131/}).

@item 
bpo-13312@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13312}: Avoids a possible integer underflow (undefined behavior) in the
time module’s year handling code when passed a very low negative year
value.

@item 
bpo-34472@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34472}: Improved compatibility for streamed files in @ref{137,,zipfile}.
Previously an optional signature was not being written and certain ZIP
applications were not supported. Patch by Silas Sewell.

@item 
bpo-34454@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34454}: Fix the .fromisoformat() methods of datetime types crashing
when given unicode with non-UTF-8-encodable code points.  Specifically,
datetime.fromisoformat() now accepts surrogate unicode code points used as
the separator. Report and tests by Alexey Izbyshev, patch by Paul Ganssle.

@item 
bpo-6700@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6700}: Fix inspect.getsourcelines for module level frames/tracebacks.
Patch by Vladimir Matveev.

@item 
bpo-34171@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34171}: Running the @ref{103,,trace} module no longer creates the
@code{trace.cover} file.

@item 
bpo-34441@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34441}: Fix crash when an @code{ABC}-derived class with invalid
@code{__subclasses__} is passed as the second argument to @ref{9c4,,issubclass()}.
Patch by Alexey Izbyshev.

@item 
bpo-34427@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34427}: Fix infinite loop in @code{a.extend(a)} for @code{MutableSequence}
subclasses.

@item 
bpo-34412@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34412}: Make @ref{1e1b,,signal.strsignal()} work on HP-UX. Patch by Michael
Osipov.

@item 
bpo-20849@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20849}: shutil.copytree now accepts a new @code{dirs_exist_ok} keyword
argument. Patch by Josh Bronson.

@item 
bpo-31715@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31715}: Associate @code{.mjs} file extension with
@code{application/javascript} MIME Type.

@item 
bpo-34384@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34384}: @ref{b19,,os.readlink()} now accepts @ref{5a0,,path-like} and @ref{192,,bytes} objects on Windows.

@item 
bpo-22602@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22602}: The UTF-7 decoder now raises @ref{c07,,UnicodeDecodeError} for
ill-formed sequences starting with “+” (as specified in RFC 2152).  Patch
by Zackery Spytz.

@item 
bpo-2122@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2122}: The @ref{c8e,,mmap.flush()} method now returns
@code{None} on success, raises an exception on error under all platforms.

@item 
bpo-34341@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34341}: Appending to the ZIP archive with the ZIP64 extension no longer
grows the size of extra fields of existing entries.

@item 
bpo-34333@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34333}: Fix %-formatting in @ref{1957,,pathlib.PurePath.with_suffix()} when
formatting an error message.

@item 
bpo-18540@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18540}: The @ref{aff,,imaplib.IMAP4} and @ref{b00,,imaplib.IMAP4_SSL}
classes now resolve to the local host IP correctly when the default value
of `host' parameter (@code{'@w{'}}) is used.

@item 
bpo-26502@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26502}: Implement @code{traceback.FrameSummary.__len__()} method to
preserve compatibility with the old tuple API.

@item 
bpo-34318@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34318}: @ref{74f,,assertRaises()},
@ref{751,,assertRaisesRegex()},
@ref{1369,,assertWarns()} and
@ref{136a,,assertWarnsRegex()} no longer success if the
passed callable is None. They no longer ignore unknown keyword arguments
in the context manager mode. A DeprecationWarning was raised in these
cases since Python 3.5.

@item 
bpo-9372@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9372}: Deprecate @ref{588,,__getitem__()} methods of
@ref{93d,,xml.dom.pulldom.DOMEventStream}, @ref{93e,,wsgiref.util.FileWrapper}
and @ref{93f,,fileinput.FileInput}.

@item 
bpo-33613@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33613}: Fix a race condition in @code{multiprocessing.semaphore_tracker}
when the tracker receives SIGINT before it can register signal handlers
for ignoring it.

@item 
bpo-34248@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34248}: Report filename in the exception raised when the database file
cannot be opened by @ref{1e1c,,dbm.gnu.open()} and @ref{1e1d,,dbm.ndbm.open()} due to
OS-related error. Patch by Zsolt Cserna.

@item 
bpo-33089@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33089}: Add math.dist() to compute the Euclidean distance between two
points.

@item 
bpo-34246@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34246}: @ref{1059,,smtplib.SMTP.send_message()} no longer modifies the
content of the `mail_options' argument. Patch by Pablo S. Blum de Aguiar.

@item 
bpo-31047@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31047}: Fix @code{ntpath.abspath} for invalid paths on windows. Patch by
Franz Woellert.

@item 
bpo-32321@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32321}: Add pure Python fallback for functools.reduce. Patch by Robert
Wright.

@item 
bpo-34270@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34270}: The default asyncio task class now always has a name which can
be get or set using two new methods (@ref{bd0,,get_name()} and
@ref{bcf,,set_name()}) and is visible in the @ref{1c1,,repr()} output.
An initial name can also be set using the new @code{name} keyword argument to
@ref{1c9,,asyncio.create_task()} or the
@code{create_task()} method of the event loop.
If no initial name is set, the default Task implementation generates a
name like @code{Task-1} using a monotonic counter.

@item 
bpo-34263@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34263}: asyncio’s event loop will not pass timeouts longer than one day
to epoll/select etc.

@item 
bpo-34035@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34035}: Fix several AttributeError in zipfile seek() methods. Patch by
Mickaël Schoentgen.

@item 
bpo-32215@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32215}: Fix performance regression in @ref{d4,,sqlite3} when a DML
statement appeared in a different line than the rest of the SQL query.

@item 
bpo-34075@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34075}: Deprecate passing non-ThreadPoolExecutor instances to
@code{AbstractEventLoop.set_default_executor()}.

@item 
bpo-34251@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34251}: Restore @code{msilib.Win64} to preserve backwards compatibility
since it’s already used by @code{distutils}’ @code{bdist_msi} command.

@item 
bpo-19891@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19891}: Ignore errors caused by missing / non-writable homedir while
writing history during exit of an interactive session.  Patch by Anthony
Sottile.

@item 
bpo-33089@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33089}: Enhanced math.hypot() to support more than two dimensions.

@item 
bpo-34228@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34228}: tracemalloc: PYTHONTRACEMALLOC=0 environment variable and -X
tracemalloc=0 command line option are now allowed to disable explicitly
tracemalloc at startup.

@item 
bpo-13041@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13041}: Use @ref{1308,,shutil.get_terminal_size()} to calculate the terminal
width correctly in the @code{argparse.HelpFormatter} class.  Initial patch by
Zbyszek Jędrzejewski-Szmek.

@item 
bpo-34213@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34213}: Allow frozen dataclasses to have a field named “object”.
Previously this conflicted with an internal use of “object”.

@item 
bpo-34052@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34052}: @ref{5a7,,sqlite3.Connection.create_aggregate()},
@ref{5a6,,sqlite3.Connection.create_function()},
@ref{5a8,,sqlite3.Connection.set_authorizer()},
@ref{5a9,,sqlite3.Connection.set_progress_handler()} methods raises TypeError
when unhashable objects are passed as callable. These methods now don’t
pass such objects to SQLite API. Previous behavior could lead to
segfaults. Patch by Sergey Fedoseev.

@item 
bpo-34197@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34197}: Attributes `skipinitialspace', `doublequote' and `strict' of
the `dialect' attribute of the @ref{2d,,csv} reader are now @ref{3c3,,bool}
instances instead of integers 0 or 1.

@item 
bpo-32788@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32788}: Errors other than @ref{198,,TypeError} raised in methods
@code{__adapt__()} and @code{__conform__()} in the @ref{d4,,sqlite3} module are now
propagated to the user.

@item 
bpo-21446@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21446}: The @code{reload} fixer now uses @ref{73c,,importlib.reload()} instead
of deprecated @code{imp.reload()}.

@item 
bpo-940286@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=940286}: pydoc’s @code{Helper.showtopic()} method now prints the cross
references of a topic correctly.

@item 
bpo-34164@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34164}: @ref{1224,,base64.b32decode()} could raise UnboundLocalError or
OverflowError for incorrect padding.  Now it always raises
@code{base64.Error} in these cases.

@item 
bpo-33729@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33729}: Fixed issues with arguments parsing in @ref{6c,,hashlib}.

@item 
bpo-34097@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34097}: ZipFile can zip files older than 1980-01-01 and newer than
2107-12-31 using a new @code{strict_timestamps} parameter at the cost of
setting the timestamp to the limit.

@item 
bpo-34108@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34108}: Remove extraneous CR in 2to3 refactor.

@item 
bpo-34070@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34070}: Make sure to only check if the handle is a tty, when opening a
file with @code{buffering=-1}.

@item 
bpo-27494@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27494}: Reverted bpo-27494@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27494}. 2to3 rejects now a trailing comma in
generator expressions.

@item 
bpo-33967@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33967}: functools.singledispatch now raises TypeError instead of
IndexError when no positional arguments are passed.

@item 
bpo-34041@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34041}: Add the parameter `deterministic' to the
@ref{5a6,,sqlite3.Connection.create_function()} method. Patch by Sergey
Fedoseev.

@item 
bpo-34056@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34056}: Ensure the loader shim created by @code{imp.load_module} always
returns bytes from its @code{get_data()} function. This fixes using
@code{imp.load_module} with 
@geindex Python 향상 제안; PEP 552
PEP 552@footnote{https://peps.python.org/pep-0552/} hash-based pycs.

@item 
bpo-34054@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34054}: The multiprocessing module now uses the monotonic clock
@ref{55b,,time.monotonic()} instead of the system clock @ref{55c,,time.time()} to
implement timeout.

@item 
bpo-34043@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34043}: Optimize tarfile uncompress performance about 15% when gzip is
used.

@item 
bpo-34044@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34044}: @code{subprocess.Popen} now copies the `startupinfo' argument to
leave it unchanged: it will modify the copy, so that the same
@code{STARTUPINFO} object can be used multiple times.

@item 
bpo-34010@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34010}: Fixed a performance regression for reading streams with
tarfile. The buffered read should use a list, instead of appending to a
bytes object.

@item 
bpo-34019@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34019}: webbrowser: Correct the arguments passed to Opera Browser when
opening a new URL using the @code{webbrowser} module. Patch by Bumsik Kim.

@item 
bpo-34003@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34003}: csv.DictReader now creates dicts instead of OrderedDicts. Patch
by Michael Selik.

@item 
bpo-33978@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33978}: Closed existing logging handlers before reconfiguration via
fileConfig and dictConfig. Patch by Karthikeyan Singaravelan.

@item 
bpo-14117@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14117}: Make minor tweaks to turtledemo. The ‘wikipedia’ example is now
‘rosette’, describing what it draws.  The ‘penrose’ print output is
reduced. The’1024’ output of ‘tree’ is eliminated.

@item 
bpo-33974@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33974}: Fixed passing lists and tuples of strings containing special
characters @code{"}, @code{\}, @code{@{}, @code{@}} and @code{\n} as options to
@ref{ff,,ttk} widgets.

@item 
bpo-27500@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27500}: Fix getaddrinfo to resolve IPv6 addresses correctly.

@item 
bpo-24567@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24567}: Improve random.choices() to handle subnormal input weights that
could occasionally trigger an IndexError.

@item 
bpo-33871@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33871}: Fixed integer overflow in @ref{d54,,os.readv()}, @ref{d57,,os.writev()},
@ref{d53,,os.preadv()} and @ref{d56,,os.pwritev()} and in @ref{d04,,os.sendfile()} with
`headers' or `trailers' arguments (on BSD-based OSes and macOS).

@item 
bpo-25007@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25007}: Add @ref{756,,copy.copy()} and @ref{d64,,copy.deepcopy()} support to zlib
compressors and decompressors.  Patch by Zackery Spytz.

@item 
bpo-33929@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33929}: multiprocessing: Fix a race condition in Popen of
multiprocessing.popen_spawn_win32. The child process now duplicates the
read end of pipe instead of “stealing” it. Previously, the read end of
pipe was “stolen” by the child process, but it leaked a handle if the
child process had been terminated before it could steal the handle from
the parent process.

@item 
bpo-33899@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33899}: Tokenize module now implicitly emits a NEWLINE when provided
with input that does not have a trailing new line.  This behavior now
matches what the C tokenizer does internally.  Contributed by Ammar Askar.

@item 
bpo-33897@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33897}: Added a ‘force’ keyword argument to logging.basicConfig().

@item 
bpo-33695@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33695}: @ref{c1d,,shutil.copytree()} uses @ref{c53,,os.scandir()} function and
all copy functions depending from it use cached @ref{26d,,os.stat()} values.
The speedup for copying a directory with 8000 files is around +9% on
Linux, +20% on Windows and + 30% on a Windows SMB share. Also the number
of @code{os.stat()} syscalls is reduced by 38% making
@code{shutil.copytree()} especially faster on network filesystems.
(Contributed by Giampaolo Rodola’ in bpo-33695@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33695}.)

@item 
bpo-33916@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33916}: bz2 and lzma: When Decompressor.__init__() is called twice,
free the old lock to not leak memory.

@item 
bpo-32568@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32568}: Make select.epoll() and its documentation consistent regarding
`sizehint' and `flags'.

@item 
bpo-33833@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33833}: Fixed bug in asyncio where ProactorSocketTransport logs
AssertionError if force closed during write.

@item 
bpo-33663@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33663}: Convert content length to string before putting to header.

@item 
bpo-33721@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33721}: @ref{a6,,os.path} functions that return a boolean result like
@ref{c02,,exists()}, @ref{c03,,lexists()}, @ref{c04,,isdir()},
@ref{c05,,isfile()}, @ref{c00,,islink()}, and
@ref{c06,,ismount()}, and @ref{266,,pathlib.Path} methods that return a
boolean result like @ref{c0a,,exists()},
@ref{53a,,is_dir()}, @ref{539,,is_file()},
@ref{c0b,,is_mount()}, @ref{c0c,,is_symlink()},
@ref{c0d,,is_block_device()},
@ref{c0e,,is_char_device()}, @ref{c0f,,is_fifo()},
@ref{c10,,is_socket()} now return @code{False} instead of raising
@ref{2ec,,ValueError} or its subclasses @ref{886,,UnicodeEncodeError} and
@ref{c07,,UnicodeDecodeError} for paths that contain characters or bytes
unrepresentable at the OS level.

@item 
bpo-26544@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26544}: Fixed implementation of @ref{17f8,,platform.libc_ver()}. It almost
always returned version ‘2.9’ for glibc.

@item 
bpo-33843@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33843}: Remove deprecated @code{cgi.escape}, @code{cgi.parse_qs} and
@code{cgi.parse_qsl}.

@item 
bpo-33842@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33842}: Remove @code{tarfile.filemode} which is deprecated since Python
3.3.

@item 
bpo-30167@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30167}: Prevent site.main() exception if PYTHONSTARTUP is set. Patch by
Steve Weber.

@item 
bpo-33805@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33805}: Improve error message of dataclasses.replace() when an InitVar
is not specified

@item 
bpo-33687@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33687}: Fix the call to @code{os.chmod()} for @code{uu.decode()} if a mode is
given or decoded. Patch by Timo Furrer.

@item 
bpo-33812@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33812}: Datetime instance d with non-None tzinfo, but with
d.tzinfo.utcoffset(d) returning None is now treated as naive by the
astimezone() method.

@item 
bpo-32108@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32108}: In configparser, don’t clear section when it is assigned to
itself.

@item 
bpo-27397@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27397}: Make email module properly handle invalid-length base64
strings.

@item 
bpo-33578@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33578}: Implement multibyte encoder/decoder state methods

@item 
bpo-30805@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30805}: Avoid race condition with debug logging

@item 
bpo-33476@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33476}: Fix _header_value_parser.py when address group is missing final
‘;’. Contributed by Enrique Perez-Terron

@item 
bpo-33694@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33694}: asyncio: Fix a race condition causing data loss on
pause_reading()/resume_reading() when using the ProactorEventLoop.

@item 
bpo-32493@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32493}: Correct test for @code{uuid_enc_be} availability in
@code{configure.ac}. Patch by Michael Felt.

@item 
bpo-33792@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33792}: Add asyncio.WindowsSelectorEventLoopPolicy and
asyncio.WindowsProactorEventLoopPolicy.

@item 
bpo-33274@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33274}: W3C DOM Level 1 specifies return value of
Element.removeAttributeNode() as “The Attr node that was removed.”
xml.dom.minidom now complies with this requirement.

@item 
bpo-33778@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33778}: Update @code{unicodedata}’s database to Unicode version 11.0.0.

@item 
bpo-33165@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33165}: Added a stacklevel parameter to logging calls to allow use of
wrapper/helper functions for logging APIs.

@item 
bpo-33770@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33770}: improve base64 exception message for encoded inputs of invalid
length

@item 
bpo-33769@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33769}: asyncio/start_tls: Fix error message; cancel callbacks in case
of an unhandled error; mark SSLTransport as closed if it is aborted.

@item 
bpo-33767@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33767}: The concatenation (@code{+}) and repetition (@code{*}) sequence
operations now raise @ref{198,,TypeError} instead of @ref{794,,SystemError} when
performed on @ref{518,,mmap.mmap} objects.  Patch by Zackery Spytz.

@item 
bpo-33734@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33734}: asyncio/ssl: Fix AttributeError, increase default handshake
timeout

@item 
bpo-31014@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31014}: Fixed creating a controller for @ref{11b,,webbrowser} when a user
specifies a path to an entry in the BROWSER environment variable.  Based
on patch by John Still.

@item 
bpo-2504@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2504}: Add gettext.pgettext() and variants.

@item 
bpo-33197@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33197}: Add description property for _ParameterKind

@item 
bpo-32751@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32751}: When cancelling the task due to a timeout,
@ref{814,,asyncio.wait_for()} will now wait until the cancellation is complete.

@item 
bpo-32684@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32684}: Fix gather to propagate cancellation of itself even with
return_exceptions.

@item 
bpo-33654@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33654}: Support protocol type switching in SSLTransport.set_protocol().

@item 
bpo-33674@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33674}: Pause the transport as early as possible to further reduce the
risk of data_received() being called before connection_made().

@item 
bpo-33671@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33671}: @ref{c4d,,shutil.copyfile()}, @ref{c4e,,shutil.copy()},
@ref{c4f,,shutil.copy2()}, @ref{c1d,,shutil.copytree()} and @ref{c50,,shutil.move()} use
platform-specific fast-copy syscalls on Linux and macOS in order to copy
the file more efficiently. On Windows @code{shutil.copyfile()} uses a
bigger default buffer size (1 MiB instead of 16 KiB) and a
@ref{165,,memoryview()}-based variant of @ref{c51,,shutil.copyfileobj()} is used.
The speedup for copying a 512MiB file is about +26% on Linux, +50% on
macOS and +40% on Windows. Also, much less CPU cycles are consumed.
(Contributed by Giampaolo Rodola’ in bpo-25427@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25427}.)

@item 
bpo-33674@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33674}: Fix a race condition in SSLProtocol.connection_made() of
asyncio.sslproto: start immediately the handshake instead of using
call_soon(). Previously, data_received() could be called before the
handshake started, causing the handshake to hang or fail.

@item 
bpo-31647@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31647}: Fixed bug where calling write_eof() on a
_SelectorSocketTransport after it’s already closed raises AttributeError.

@item 
bpo-32610@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32610}: Make asyncio.all_tasks() return only pending tasks.

@item 
bpo-32410@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32410}: Avoid blocking on file IO in sendfile fallback code

@item 
bpo-33469@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33469}: Fix RuntimeError after closing loop that used run_in_executor

@item 
bpo-33672@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33672}: Fix Task.__repr__ crash with Cython’s bogus coroutines

@item 
bpo-33654@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33654}: Fix transport.set_protocol() to support switching between
asyncio.Protocol and asyncio.BufferedProtocol.  Fix loop.start_tls() to
work with asyncio.BufferedProtocols.

@item 
bpo-33652@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33652}: Pickles of type variables and subscripted generics are now
future-proof and compatible with older Python versions.

@item 
bpo-32493@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32493}: Fixed @ref{da0,,uuid.uuid1()} on FreeBSD.

@item 
bpo-33238@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33238}: Add @code{InvalidStateError} to @ref{24,,concurrent.futures}.
@code{Future.set_result} and @code{Future.set_exception} now raise
@code{InvalidStateError} if the futures are not pending or running. Patch by
Jason Haydaman.

@item 
bpo-33618@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33618}: Finalize and document preliminary and experimental TLS 1.3
support with OpenSSL 1.1.1

@item 
bpo-33625@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33625}: Release GIL on @code{grp.getgrnam}, @code{grp.getgrgid},
@code{pwd.getpwnam} and @code{pwd.getpwuid} if reentrant variants of these
functions are available. Patch by William Grzybowski.

@item 
bpo-33623@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33623}: Fix possible SIGSGV when asyncio.Future is created in __del__

@item 
bpo-11874@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11874}: Use a better regex when breaking usage into wrappable parts.
Avoids bogus assertion errors from custom metavar strings.

@item 
bpo-30877@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30877}: Fixed a bug in the Python implementation of the JSON decoder
that prevented the cache of parsed strings from clearing after finishing
the decoding. Based on patch by c-fos.

@item 
bpo-33604@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33604}: Remove HMAC default to md5 marked for removal in 3.8 (removal
originally planned in 3.6, bump to 3.8 in PR 7062).

@item 
bpo-33582@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33582}: Emit a deprecation warning for inspect.formatargspec

@item 
bpo-21145@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21145}: Add @code{functools.cached_property} decorator, for computed
properties cached for the life of the instance.

@item 
bpo-33570@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33570}: Change TLS 1.3 cipher suite settings for compatibility with
OpenSSL 1.1.1-pre6 and newer. OpenSSL 1.1.1 will have TLS 1.3 ciphers
enabled by default.

@item 
bpo-28556@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28556}: Do not simplify arguments to @code{typing.Union}. Now
@code{Union[Manager, Employee]} is not simplified to @code{Employee} at runtime.
Such simplification previously caused several bugs and limited
possibilities for introspection.

@item 
bpo-12486@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12486}: @ref{700,,tokenize.generate_tokens()} is now documented as a public
API to tokenize unicode strings. It was previously present but
undocumented.

@item 
bpo-33540@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33540}: Add a new @code{block_on_close} class attribute to
@code{ForkingMixIn} and @code{ThreadingMixIn} classes of @ref{d2,,socketserver}.

@item 
bpo-33548@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33548}: tempfile._candidate_tempdir_list should consider common TEMP
locations

@item 
bpo-33109@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33109}: argparse subparsers are once again not required by default,
reverting the change in behavior introduced by bpo-26510@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26510} in 3.7.0a2.

@item 
bpo-33541@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33541}: Remove unused private method @code{_strptime.LocaleTime.__pad}
(a.k.a. @code{_LocaleTime__pad}).

@item 
bpo-33536@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33536}: dataclasses.make_dataclass now checks for invalid field names
and duplicate fields. Also, added a check for invalid field
specifications.

@item 
bpo-33542@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33542}: Prevent @code{uuid.get_node} from using a DUID instead of a MAC on
Windows. Patch by Zvi Effron

@item 
bpo-26819@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26819}: Fix race condition with @code{ReadTransport.resume_reading} in
Windows proactor event loop.

@item 
Fix failure in @code{typing.get_type_hints()} when ClassVar was provided as a
string forward reference.

@item 
bpo-33516@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33516}: @ref{108e,,unittest.mock.MagicMock} now supports the @code{__round__}
magic method.

@item 
bpo-28612@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28612}: Added support for Site Maps to urllib’s @code{RobotFileParser} as
@ref{1e1e,,RobotFileParser.site_maps()}. Patch by Lady Red, based
on patch by Peter Wirtz.

@item 
bpo-28167@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28167}: Remove platform.linux_distribution, which was deprecated since
3.5.

@item 
bpo-33504@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33504}: Switch the default dictionary implementation for
@ref{26,,configparser} from @ref{7f2,,collections.OrderedDict} to the standard
@ref{183,,dict} type.

@item 
bpo-33505@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33505}: Optimize asyncio.ensure_future() by reordering if checks: 1.17x
faster.

@item 
bpo-33497@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33497}: Add errors param to cgi.parse_multipart and make an encoding in
FieldStorage use the given errors (needed for Twisted).  Patch by Amber
Brown.

@item 
bpo-29235@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29235}: The @code{cProfile.Profile} class can now be used as a
context manager. Patch by Scott Sanderson.

@item 
bpo-33495@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33495}: Change dataclasses.Fields repr to use the repr of each of its
members, instead of str.  This makes it more clear what each field
actually represents.  This is especially true for the ‘type’ member.

@item 
bpo-26103@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26103}: Correct @code{inspect.isdatadescriptor} to look for @code{__set__} or
@code{__delete__}.  Patch by Aaron Hall.

@item 
bpo-29209@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29209}: Removed the @code{doctype()} method and the `html' parameter of
the constructor of @ref{c48,,XMLParser}.  The
@code{doctype()} method defined in a subclass will no longer be called.
Deprecated methods @code{getchildren()} and @code{getiterator()} in the
@ref{12b,,ElementTree} module emit now a @ref{1a3,,DeprecationWarning}
instead of @ref{ac6,,PendingDeprecationWarning}.

@item 
bpo-33453@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33453}: Fix dataclasses to work if using literal string type
annotations or if using PEP 563 “Postponed Evaluation of Annotations”.
Only specific string prefixes are detected for both ClassVar (“ClassVar”
and “typing.ClassVar”) and InitVar (“InitVar” and “dataclasses.InitVar”).

@item 
bpo-28556@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28556}: Minor fixes in typing module: add annotations to
@code{NamedTuple.__new__}, pass @code{*args} and @code{**kwds} in
@code{Generic.__new__}.  Original PRs by Paulius Šarka and Chad Dombrova.

@item 
bpo-33365@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33365}: Print the header values besides the header keys instead just
the header keys if `debuglevel' is set to >0 in @ref{73,,http.client}. Patch
by Marco Strigl.

@item 
bpo-20087@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20087}: Updated alias mapping with glibc 2.27 supported locales.

@item 
bpo-33422@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33422}: Fix trailing quotation marks getting deleted when looking up
byte/string literals on pydoc. Patch by Andrés Delfino.

@item 
bpo-28167@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28167}: The function @code{platform.linux_distribution} and
@code{platform.dist} now trigger a @code{DeprecationWarning} and have been
marked for removal in Python 3.8

@item 
bpo-33281@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33281}: Fix ctypes.util.find_library regression on macOS.

@item 
bpo-33311@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33311}: Text and html output generated by cgitb does not display
parentheses if the current call is done directly in the module. Patch by
Stéphane Blondon.

@item 
bpo-27300@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27300}: The file classes in `tempfile' now accept an `errors' parameter
that complements the already existing `encoding'.  Patch by Stephan Hohe.

@item 
bpo-32933@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32933}: @ref{11e6,,unittest.mock.mock_open()} now supports iteration over the
file contents. Patch by Tony Flury.

@item 
bpo-33217@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33217}: Raise @ref{198,,TypeError} when looking up non-Enum objects in Enum
classes and Enum members.

@item 
bpo-33197@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33197}: Update error message when constructing invalid
inspect.Parameters Patch by Donghee Na.

@item 
bpo-33383@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33383}: Fixed crash in the get() method of the @ref{38,,dbm.ndbm} database
object when it is called with a single argument.

@item 
bpo-33375@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33375}: The warnings module now finds the Python file associated with a
warning from the code object, rather than the frame’s global namespace.
This is consistent with how tracebacks and pdb find filenames, and should
work better for dynamically executed code.

@item 
bpo-33336@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33336}: @code{imaplib} now allows @code{MOVE} command in @code{IMAP4.uid()} (RFC
6851: IMAP MOVE Extension) and potentially as a name of supported method
of @code{IMAP4} object.

@item 
bpo-32455@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32455}: Added `jump' parameter to @ref{1130,,dis.stack_effect()}.

@item 
bpo-27485@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27485}: Rename and deprecate undocumented functions in
@ref{110,,urllib.parse()}.

@item 
bpo-33332@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33332}: Add @code{signal.valid_signals()} to expose the POSIX sigfillset()
functionality.

@item 
bpo-33251@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33251}: @code{ConfigParser.items()} was fixed so that key-value pairs
passed in via @ref{1e1f,,vars()} are not included in the resulting output.

@item 
bpo-33329@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33329}: Fix multiprocessing regression on newer glibcs

@item 
bpo-33334@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33334}: @ref{1130,,dis.stack_effect()} now supports all defined opcodes
including NOP and EXTENDED_ARG.

@item 
bpo-991266@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=991266}: Fix quoting of the @code{Comment} attribute of
@ref{1e20,,http.cookies.SimpleCookie}.

@item 
bpo-33131@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33131}: Upgrade bundled version of pip to 10.0.1.

@item 
bpo-33308@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33308}: Fixed a crash in the @code{parser} module when converting an ST
object to a tree of tuples or lists with @code{line_info=False} and
@code{col_info=True}.

@item 
bpo-23403@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23403}: lib2to3 now uses pickle protocol 4 for pre-computed grammars.

@item 
bpo-33266@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33266}: lib2to3 now recognizes @code{rf'...'} strings.

@item 
bpo-11594@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11594}: Ensure line-endings are respected when using lib2to3.

@item 
bpo-33254@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33254}: Have @ref{502,,importlib.resources.contents()} and
@code{importlib.abc.ResourceReader.contents()} return an @ref{142c,,iterable}
instead of an @ref{4ca,,iterator}.

@item 
bpo-33265@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33265}: @code{contextlib.ExitStack} and @code{contextlib.AsyncExitStack} now
use a method instead of a wrapper function for exit callbacks.

@item 
bpo-33263@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33263}: Fix FD leak in @code{_SelectorSocketTransport}  Patch by Vlad
Starostin.

@item 
bpo-33256@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33256}: Fix display of @code{<module>} call in the html produced by
@code{cgitb.html()}. Patch by Stéphane Blondon.

@item 
bpo-33144@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33144}: @code{random.Random()} and its subclassing mechanism got optimized
to check only once at class/subclass instantiation time whether its
@code{getrandbits()} method can be relied on by other methods, including
@code{randrange()}, for the generation of arbitrarily large random integers.
Patch by Wolfgang Maier.

@item 
bpo-33185@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33185}: Fixed regression when running pydoc with the @ref{23c,,-m}
switch. (The regression was introduced in 3.7.0b3 by the resolution of
bpo-33053@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33053})

This fix also changed pydoc to add @code{os.getcwd()} to @ref{3e4,,sys.path}
when necessary, rather than adding @code{"."}.

@item 
bpo-29613@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29613}: Added support for the @code{SameSite} cookie flag to the
@code{http.cookies} module.

@item 
bpo-33169@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33169}: Delete entries of @code{None} in @ref{7f9,,sys.path_importer_cache}
when @code{importlib.machinery.invalidate_caches()} is called.

@item 
bpo-33203@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33203}: @code{random.Random.choice()} now raises @code{IndexError} for empty
sequences consistently even when called from subclasses without a
@code{getrandbits()} implementation.

@item 
bpo-33224@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33224}: Update difflib.mdiff() for 
@geindex Python 향상 제안; PEP 479
PEP 479@footnote{https://peps.python.org/pep-0479/}.  Convert an uncaught
StopIteration in a generator into a return-statement.

@item 
bpo-33209@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33209}: End framing at the end of C implementation of
@ref{1e21,,pickle.Pickler.dump()}.

@item 
bpo-32861@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32861}: The urllib.robotparser’s @code{__str__} representation now
includes wildcard entries and the “Crawl-delay” and “Request-rate” fields.
Also removes extra newlines that were being appended to the end of the
string. Patch by Michael Lazar.

@item 
bpo-23403@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23403}: @code{DEFAULT_PROTOCOL} in @ref{ab,,pickle} was bumped to 4. Protocol
4 is described in 
@geindex Python 향상 제안; PEP 3154
PEP 3154@footnote{https://peps.python.org/pep-3154/} and available since Python 3.4. It offers
better performance and smaller size compared to protocol 3 introduced in
Python 3.0.

@item 
bpo-20104@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20104}: Improved error handling and fixed a reference leak in
@ref{52e,,os.posix_spawn()}.

@item 
bpo-33106@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33106}: Deleting a key from a read-only dbm database raises module
specific error instead of KeyError.

@item 
bpo-33175@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33175}: In dataclasses, Field.__set_name__ now looks up the
__set_name__ special method on the class, not the instance, of the default
value.

@item 
bpo-32380@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32380}: Create functools.singledispatchmethod to support generic single
dispatch on descriptors and methods.

@item 
bpo-33141@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33141}: Have Field objects pass through __set_name__ to their default
values, if they have their own __set_name__.

@item 
bpo-33096@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33096}: Allow ttk.Treeview.insert to insert iid that has a false
boolean value. Note iid=0 and iid=False would be same. Patch by Garvit
Khatri.

@item 
bpo-32873@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32873}: Treat type variables and special typing forms as immutable by
copy and pickle.  This fixes several minor issues and inconsistencies, and
improves backwards compatibility with Python 3.6.

@item 
bpo-33134@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33134}: When computing dataclass’s __hash__, use the lookup table to
contain the function which returns the __hash__ value.  This is an
improvement over looking up a string, and then testing that string to see
what to do.

@item 
bpo-33127@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33127}: The ssl module now compiles with LibreSSL 2.7.1.

@item 
bpo-32505@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32505}: Raise TypeError if a member variable of a dataclass is of type
Field, but doesn’t have a type annotation.

@item 
bpo-33078@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33078}: Fix the failure on OSX caused by the tests relying on
sem_getvalue

@item 
bpo-33116@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33116}: Add ‘Field’ to dataclasses.__all__.

@item 
bpo-32896@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32896}: Fix an error where subclassing a dataclass with a field that
uses a default_factory would generate an incorrect class.

@item 
bpo-33100@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33100}: Dataclasses: If a field has a default value that’s a
MemberDescriptorType, then it’s from that field being in __slots__, not an
actual default value.

@item 
bpo-32953@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32953}: If a non-dataclass inherits from a frozen dataclass, allow
attributes to be added to the derived class.  Only attributes from the
frozen dataclass cannot be assigned to.  Require all dataclasses in a
hierarchy to be either all frozen or all non-frozen.

@item 
bpo-33097@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33097}: Raise RuntimeError when @code{executor.submit} is called during
interpreter shutdown.

@item 
bpo-32968@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32968}: Modulo and floor division involving Fraction and float should
return float.

@item 
bpo-33061@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33061}: Add missing @code{NoReturn} to @code{__all__} in typing.py

@item 
bpo-33078@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33078}: Fix the size handling in multiprocessing.Queue when a pickling
error occurs.

@item 
bpo-33064@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33064}: lib2to3 now properly supports trailing commas after @code{*args}
and @code{**kwargs} in function signatures.

@item 
bpo-33056@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33056}: FIX properly close leaking fds in
concurrent.futures.ProcessPoolExecutor.

@item 
bpo-33021@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33021}: Release the GIL during fstat() calls, avoiding hang of all
threads when calling mmap.mmap(), os.urandom(), and random.seed().  Patch
by Nir Soffer.

@item 
bpo-31804@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31804}: Avoid failing in multiprocessing.Process if the standard
streams are closed or None at exit.

@item 
bpo-33034@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33034}: Providing an explicit error message when casting the port
property to anything that is not an integer value using @code{urlparse()} and
@code{urlsplit()}. Patch by Matt Eaton.

@item 
bpo-30249@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30249}: Improve struct.unpack_from() exception messages for problems
with the buffer size and offset.

@item 
bpo-33037@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33037}: Skip sending/receiving data after SSL transport closing.

@item 
bpo-27683@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27683}: Fix a regression in @ref{84,,ipaddress} that result of
@code{hosts()} is empty when the network is constructed by a tuple
containing an integer mask and only 1 bit left for addresses.

@item 
bpo-22674@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22674}: Add the strsignal() function in the signal module that returns
the system description of the given signal, as returned by strsignal(3).

@item 
bpo-32999@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32999}: Fix C implementation of @code{ABC.__subclasscheck__(cls,
subclass)} crashed when @code{subclass} is not a type object.

@item 
bpo-33009@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33009}: Fix inspect.signature() for single-parameter partialmethods.

@item 
bpo-32969@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32969}: Expose several missing constants in zlib and fix corresponding
documentation.

@item 
bpo-32056@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32056}: Improved exceptions raised for invalid number of channels and
sample width when read an audio file in modules @code{aifc}, @ref{119,,wave}
and @code{sunau}.

@item 
bpo-32970@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32970}: Improved disassembly of the MAKE_FUNCTION instruction.

@item 
bpo-32844@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32844}: Fix wrong redirection of a low descriptor (0 or 1) to stderr in
subprocess if another low descriptor is closed.

@item 
bpo-32960@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32960}: For dataclasses, disallow inheriting frozen from non-frozen
classes, and also disallow inheriting non-frozen from frozen classes. This
restriction will be relaxed at a future date.

@item 
bpo-32713@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32713}: Fixed tarfile.itn handling of out-of-bounds float values. Patch
by Joffrey Fuhrer.

@item 
bpo-32257@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32257}: The ssl module now contains OP_NO_RENEGOTIATION constant,
available with OpenSSL 1.1.0h or 1.1.1.

@item 
bpo-32951@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32951}: Direct instantiation of SSLSocket and SSLObject objects is now
prohibited. The constructors were never documented, tested, or designed as
public constructors. Users were suppose to use ssl.wrap_socket() or
SSLContext.

@item 
bpo-32929@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32929}: Remove the tri-state parameter “hash”, and add the boolean
“unsafe_hash”. If unsafe_hash is True, add a __hash__ function, but if a
__hash__ exists, raise TypeError.  If unsafe_hash is False, add a __hash__
based on the values of eq= and frozen=.  The unsafe_hash=False behavior is
the same as the old hash=None behavior.  unsafe_hash=False is the default,
just as hash=None used to be.

@item 
bpo-32947@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32947}: Add OP_ENABLE_MIDDLEBOX_COMPAT and test workaround for TLSv1.3
for future compatibility with OpenSSL 1.1.1.

@item 
bpo-32146@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32146}: Document the interaction between frozen executables and the
spawn and forkserver start methods in multiprocessing.

@item 
bpo-30622@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30622}: The ssl module now detects missing NPN support in LibreSSL.

@item 
bpo-32922@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32922}: dbm.open() now encodes filename with the filesystem encoding
rather than default encoding.

@item 
bpo-32759@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32759}: Free unused arenas in multiprocessing.heap.

@item 
bpo-32859@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32859}: In @code{os.dup2}, don’t check every call whether the @code{dup3}
syscall exists or not.

@item 
bpo-32556@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32556}: nt._getfinalpathname, nt._getvolumepathname and
nt._getdiskusage now correctly convert from bytes.

@item 
bpo-21060@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21060}: Rewrite confusing message from setup.py upload from “No dist
file created in earlier command” to the more helpful “Must create and
upload files in one command”.

@item 
bpo-32857@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32857}: In @ref{f6,,tkinter}, @code{after_cancel(None)} now raises a
@ref{2ec,,ValueError} instead of canceling the first scheduled function.
Patch by Cheryl Sabella.

@item 
bpo-32852@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32852}: Make sure sys.argv remains as a list when running trace.

@item 
bpo-31333@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31333}: @code{_abc} module is added.  It is a speedup module with C
implementations for various functions and methods in @code{abc}.  Creating an
ABC subclass and calling @code{isinstance} or @code{issubclass} with an ABC
subclass are up to 1.5x faster. In addition, this makes Python start-up up
to 10% faster.

Note that the new implementation hides internal registry and caches,
previously accessible via private attributes @code{_abc_registry},
@code{_abc_cache}, and @code{_abc_negative_cache}.  There are three debugging
helper methods that can be used instead @code{_dump_registry},
@code{_abc_registry_clear}, and @code{_abc_caches_clear}.

@item 
bpo-32841@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32841}: Fixed @code{asyncio.Condition} issue which silently ignored
cancellation after notifying and cancelling a conditional lock. Patch by
Bar Harel.

@item 
bpo-32819@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32819}: ssl.match_hostname() has been simplified and no longer depends
on re and ipaddress module for wildcard and IP addresses. Error reporting
for invalid wildcards has been improved.

@item 
bpo-19675@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19675}: @code{multiprocessing.Pool} no longer leaks processes if its
initialization fails.

@item 
bpo-32394@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32394}: socket: Remove
TCP_FASTOPEN,TCP_KEEPCNT,TCP_KEEPIDLE,TCP_KEEPINTVL flags on older version
Windows during run-time.

@item 
bpo-31787@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31787}: Fixed refleaks of @code{__init__()} methods in various modules.
(Contributed by Oren Milman)

@item 
bpo-30157@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30157}: Fixed guessing quote and delimiter in csv.Sniffer.sniff() when
only the last field is quoted.  Patch by Jake Davis.

@item 
bpo-30688@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30688}: Added support of @code{\N@{name@}} escapes in regular expressions.
Based on patch by Jonathan Eunice.

@item 
bpo-32792@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32792}: collections.ChainMap() preserves the order of the underlying
mappings.

@item 
bpo-32775@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32775}: @ref{1851,,fnmatch.translate()} no longer produces patterns which
contain set operations. Sets starting with ‘[’ or containing ‘–’, ‘&&’,
‘~~’ or ‘||’ will be interpreted differently in regular expressions in
future versions. Currently they emit warnings. fnmatch.translate() now
avoids producing patterns containing such sets by accident.

@item 
bpo-32622@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32622}: Implement native fast sendfile for Windows proactor event loop.

@item 
bpo-32777@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32777}: Fix a rare but potential pre-exec child process deadlock in
subprocess on POSIX systems when marking file descriptors inheritable on
exec in the child process.  This bug appears to have been introduced in
3.4.

@item 
bpo-32647@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32647}: The ctypes module used to depend on indirect linking for
dlopen. The shared extension is now explicitly linked against libdl on
platforms with dl.

@item 
bpo-32749@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32749}: A @ref{36,,dbm.dumb} database opened with flags ‘r’ is now
read-only. @ref{c8c,,dbm.dumb.open()} with flags ‘r’ and ‘w’ no longer creates
a database if it does not exist.

@item 
bpo-32741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32741}: Implement @code{asyncio.TimerHandle.when()} method.

@item 
bpo-32691@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32691}: Use mod_spec.parent when running modules with pdb

@item 
bpo-32734@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32734}: Fixed @code{asyncio.Lock()} safety issue which allowed acquiring
and locking the same lock multiple times, without it being free. Patch by
Bar Harel.

@item 
bpo-32727@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32727}: Do not include name field in SMTP envelope from address. Patch
by Stéphane Wirtel

@item 
bpo-31453@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31453}: Add TLSVersion constants and SSLContext.maximum_version /
minimum_version attributes. The new API wraps OpenSSL 1.1
@indicateurl{https://web.archive.org/web/20180309043602/https://www.openssl.org/docs/man1.1.0/ssl/SSL_CTX_set_min_proto_version.html}
feature.

@item 
bpo-24334@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24334}: Internal implementation details of ssl module were cleaned up.
The SSLSocket has one less layer of indirection. Owner and session
information are now handled by the SSLSocket and SSLObject constructor.
Channel binding implementation has been simplified.

@item 
bpo-31848@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31848}: Fix the error handling in Aifc_read.initfp() when the SSND
chunk is not found. Patch by Zackery Spytz.

@item 
bpo-32585@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32585}: Add Ttk spinbox widget to @ref{ff,,tkinter.ttk}.  Patch by Alan D
Moore.

@item 
bpo-32512@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32512}: @ref{b4,,profile} CLI accepts @code{-m module_name} as an alternative
to script path.

@item 
bpo-8525@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8525}: help() on a type now displays builtin subclasses. This is
intended primarily to help with notification of more specific exception
subclasses.

Patch by Sanyam Khurana.

@item 
bpo-31639@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31639}: http.server now exposes a ThreadingHTTPServer class and uses it
when the module is run with @code{-m} to cope with web browsers pre-opening
sockets.

@item 
bpo-29877@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29877}: compileall: import ProcessPoolExecutor only when needed,
preventing hangs on low resource platforms

@item 
bpo-32221@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32221}: Various functions returning tuple containing IPv6 addresses now
omit @code{%scope} part since the same information is already encoded in
`scopeid' tuple item. Especially this speeds up @code{socket.recvfrom()}
when it receives multicast packet since useless resolving of network
interface name is omitted.

@item 
bpo-32147@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32147}: @ref{1e22,,binascii.unhexlify()} is now up to 2 times faster. Patch
by Sergey Fedoseev.

@item 
bpo-30693@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30693}: The TarFile class now recurses directories in a reproducible
way.

@item 
bpo-30693@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30693}: The ZipFile class now recurses directories in a reproducible
way.

@item 
bpo-31680@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31680}: Added @ref{bd9,,curses.ncurses_version}.

@item 
bpo-31908@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31908}: Fix output of cover files for @code{trace} module command-line
tool. Previously emitted cover files only when @code{--missing} option was
used. Patch by Michael Selik.

@item 
bpo-31608@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31608}: Raise a @code{TypeError} instead of crashing if a
@code{collections.deque} subclass returns a non-deque from @code{__new__}. Patch
by Oren Milman.

@item 
bpo-31425@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31425}: Add support for sockets of the AF_QIPCRTR address family,
supported by the Linux kernel. This is used to communicate with services,
such as GPS or radio, running on Qualcomm devices. Patch by Bjorn
Andersson.

@item 
bpo-22005@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22005}: Implemented unpickling instances of
@ref{4e2,,datetime}, @ref{1fa,,date} and
@ref{1fb,,time} pickled by Python 2. @code{encoding='latin1'} should
be used for successful decoding.

@item 
bpo-27645@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27645}: @ref{54c,,sqlite3.Connection} now exposes a
@ref{d72,,backup} method, if the underlying SQLite
library is at version 3.6.11 or higher.  Patch by Lele Gaifax.

@item 
bpo-16865@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16865}: Support arrays >=2GiB in @ref{2e,,ctypes}.  Patch by Segev Finer.

@item 
bpo-31508@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31508}: Removed support of arguments in
@code{tkinter.ttk.Treeview.selection}. It was deprecated in 3.6.  Use
specialized methods like @code{selection_set} for changing the selection.

@item 
bpo-29456@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29456}: Fix bugs in hangul normalization: u1176, u11a7 and u11c3
@end itemize

@node Documentation<56>,Tests<55>,Library<162>,Python 3 8 0 alpha 1
@anchor{whatsnew/changelog id752}@anchor{1e23}
@subsubsection Documentation



@itemize -

@item 
bpo-21257@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21257}: Document @ref{1e24,,http.client.parse_headers()}.

@item 
bpo-34764@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34764}: Improve example of iter() with 2nd sentinel argument.

@item 
bpo-35564@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35564}: Explicitly set master_doc variable in conf.py for compliance
with Sphinx 2.0

@item 
bpo-35511@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35511}: Specified that profile.Profile class doesn’t not support enable
or disable methods. Also, elaborated that Profile object as a context
manager is only supported in cProfile module.

@item 
bpo-10536@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10536}: Enhance the gettext docs. Patch by Éric Araujo

@item 
bpo-35089@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35089}: Remove mention of @code{typing.io} and @code{typing.re}. Their types
should be imported from @code{typing} directly.

@item 
bpo-35038@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35038}: Fix the documentation about an unexisting @code{f_restricted}
attribute in the frame object. Patch by Stéphane Wirtel

@item 
bpo-35042@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35042}: Replace PEP XYZ by the pep role and allow to use the direct
links to the PEPs.

@item 
bpo-35044@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35044}: Fix the documentation with the role @code{exc} for the
appropriated exception. Patch by Stéphane Wirtel

@item 
bpo-35035@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35035}: Rename documentation for @ref{54,,email.utils} to
@code{email.utils.rst}.

@item 
bpo-34967@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34967}: Use app.add_object_type() instead of the deprecated Sphinx
function app.description_unit()

@item 
bpo-34913@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34913}: Add documentation about the new command line interface of the
gzip module.

@item 
bpo-32174@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32174}: chm document displays non-ASCII characters properly on some
MBCS Windows systems.

@item 
bpo-11233@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11233}: Create availability directive for documentation.  Original
patch by Georg Brandl.

@item 
bpo-34790@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34790}: Document how passing coroutines to asyncio.wait() can be
confusing.

@item 
bpo-34552@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34552}: Make clear that @code{==} operator sometimes is equivalent to
@code{is}. The @code{<}, @code{<=}, @code{>} and @code{>=} operators are only defined
where they make sense.

@item 
bpo-28617@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28617}: Fixed info in the stdtypes docs concerning the types that
support membership tests.

@item 
bpo-20177@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20177}: Migrate datetime.date.fromtimestamp to Argument Clinic. Patch
by Tim Hoffmann.

@item 
bpo-34065@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34065}: Fix wrongly written basicConfig documentation markup syntax

@item 
bpo-33460@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33460}: replaced ellipsis with correct error codes in tutorial chapter
3.

@item 
bpo-33847@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33847}: Add ‘@@’ operator entry to index.

@item 
bpo-33409@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33409}: Clarified the relationship between 
@geindex Python 향상 제안; PEP 538
PEP 538@footnote{https://peps.python.org/pep-0538/}’s
PYTHONCOERCECLOCALE and PEP 540’s PYTHONUTF8 mode.

@item 
bpo-33197@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33197}: Add versionadded tag to the documentation of
ParameterKind.description

@item 
bpo-17045@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17045}: Improve the C-API doc for PyTypeObject.  This includes adding
several quick-reference tables and a lot of missing slot/typedef entries.
The existing entries were also cleaned up with a slightly more consistent
format.

@item 
bpo-33736@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33736}: Improve the documentation of @ref{d0d,,asyncio.open_connection()},
@ref{d0e,,asyncio.start_server()} and their UNIX socket counterparts.

@item 
bpo-23859@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23859}: Document that @code{asyncio.wait()} does not cancel its futures on
timeout.

@item 
bpo-32436@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32436}: Document 
@geindex Python 향상 제안; PEP 567
PEP 567@footnote{https://peps.python.org/pep-0567/} changes to asyncio.

@item 
bpo-33604@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33604}: Update HMAC md5 default to a DeprecationWarning, bump removal
to 3.8.

@item 
bpo-33594@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33594}: Document @code{getargspec}, @code{from_function} and @code{from_builtin}
as deprecated in their respective docstring, and include version since
deprecation in DeprecationWarning message.

@item 
bpo-33503@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33503}: Fix broken pypi link

@item 
bpo-33421@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33421}: Add missing documentation for @code{typing.AsyncContextManager}.

@item 
bpo-33487@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33487}: BZ2file now emit a DeprecationWarning when buffering=None is
passed, the deprecation message and documentation also now explicitly
state it is deprecated since 3.0.

@item 
bpo-33378@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33378}: Add Korean language switcher for @indicateurl{https://docs.python.org/3/}

@item 
bpo-33276@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33276}: Clarify that the @code{__path__} attribute on modules cannot be
just any value.

@item 
bpo-33201@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33201}: Modernize documentation for writing C extension types.

@item 
bpo-33195@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33195}: Deprecate @code{Py_UNICODE} usage in @code{c-api/arg} document.
@code{Py_UNICODE} related APIs are deprecated since Python 3.3, but it is
missed in the document.

@item 
bpo-33126@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33126}: Document PyBuffer_ToContiguous().

@item 
bpo-27212@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27212}: Modify documentation for the @code{islice()} recipe to consume
initial values up to the start index.

@item 
bpo-28247@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28247}: Update @ref{136,,zipapp} documentation to describe how to make
standalone applications.

@item 
bpo-18802@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18802}: Documentation changes for ipaddress.  Patch by Jon Foster and
Berker Peksag.

@item 
bpo-27428@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27428}: Update documentation to clarify that @code{WindowsRegistryFinder}
implements @code{MetaPathFinder}. (Patch by Himanshu Lakhara)

@item 
bpo-28124@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28124}: The ssl module function ssl.wrap_socket() has been
de-emphasized and deprecated in favor of the more secure and efficient
SSLContext.wrap_socket() method.

@item 
bpo-17232@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17232}: Clarify docs for -O and -OO.  Patch by Terry Reedy.

@item 
bpo-32436@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32436}: Add documentation for the contextvars module (PEP 567).

@item 
bpo-32800@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32800}: Update link to w3c doc for xml default namespaces.

@item 
bpo-11015@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11015}: Update @ref{ea,,test.support} documentation.

@item 
bpo-32613@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32613}: Update the faq/windows.html to use the py command from PEP 397
instead of python.

@item 
bpo-8722@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8722}: Document @code{__getattr__()} behavior when property @code{get()}
method raises @ref{5ee,,AttributeError}.

@item 
bpo-32614@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32614}: Modify RE examples in documentation to use raw strings to
prevent @ref{1a3,,DeprecationWarning} and add text to REGEX HOWTO to highlight
the deprecation.

@item 
bpo-20709@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20709}: Remove the paragraph where we explain that os.utime() does not
support a directory as path under Windows. Patch by Jan-Philip Gehrcke

@item 
bpo-32722@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32722}: Remove the bad example in the tutorial of the Generator
Expression. Patch by Stéphane Wirtel

@item 
bpo-31972@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31972}: Improve docstrings for @code{pathlib.PurePath} subclasses.

@item 
bpo-30607@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30607}: Use the externalized @code{python-docs-theme} package when
building the documentation.

@item 
bpo-8243@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8243}: Add a note about curses.addch and curses.addstr exception
behavior when writing outside a window, or pad.

@item 
bpo-32337@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32337}: Update documentation related with @code{dict} order.

@item 
bpo-25041@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25041}: Document @code{AF_PACKET} in the @ref{d1,,socket} module.

@item 
bpo-31432@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31432}: Clarify meaning of CERT_NONE, CERT_OPTIONAL, and CERT_REQUIRED
flags for ssl.SSLContext.verify_mode.
@end itemize

@node Tests<55>,Build<62>,Documentation<56>,Python 3 8 0 alpha 1
@anchor{whatsnew/changelog id753}@anchor{1e25}
@subsubsection Tests



@itemize -

@item 
bpo-35772@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35772}: Fix sparse file tests of test_tarfile on ppc64 with the tmpfs
filesystem. Fix the function testing if the filesystem supports sparse
files: create a file which contains data and “holes”, instead of creating
a file which contains no data. tmpfs effective block size is a page size
(tmpfs lives in the page cache). RHEL uses 64 KiB pages on aarch64, ppc64,
ppc64le, only s390x and x86_64 use 4 KiB pages, whereas the test punch
holes of 4 KiB.

@item 
bpo-35045@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35045}: Make ssl tests less strict and also accept TLSv1 as system
default. The changes unbreaks test_min_max_version on Fedora 29.

@item 
bpo-32710@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32710}: @code{test_asyncio/test_sendfile.py} now resets the event loop
policy using @code{tearDownModule()} as done in other tests, to prevent a
warning when running tests on Windows.

@item 
bpo-33717@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33717}: test.pythoninfo now logs information of all clocks, not only
time.time() and time.perf_counter().

@item 
bpo-35488@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35488}: Add a test to pathlib’s Path.match() to verify it does not
support glob-style ** recursive pattern matching.

@item 
bpo-31731@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31731}: Fix a race condition in @code{check_interrupted_write()} of
test_io: create directly the thread with SIGALRM signal blocked, rather
than blocking the signal later from the thread. Previously, it was
possible that the thread gets the signal before the signal is blocked.

@item 
bpo-35424@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35424}: Fix test_multiprocessing_main_handling: use
@code{multiprocessing.Pool} with a context manager and then explicitly
join the pool.

@item 
bpo-35519@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35519}: Rename @code{test.bisect} module to @code{test.bisect_cmd} to
avoid conflict with @ref{12,,bisect} module when running directly a test like
@code{./python Lib/test/test_xmlrpc.py}.

@item 
bpo-35513@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35513}: Replace @ref{55c,,time.time()} with @ref{55b,,time.monotonic()} in tests
to measure time delta.

@item 
bpo-34279@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34279}: @code{test.support.run_unittest()} no longer raise
@code{TestDidNotRun} if the test result contains skipped tests. The
exception is now only raised if no test have been run and no test have
been skipped.

@item 
bpo-35412@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35412}: Add testcase to @code{test_future4}: check unicode literal.

@item 
bpo-26704@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26704}: Added test demonstrating double-patching of an instance method.
Patch by Anthony Sottile.

@item 
bpo-33725@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33725}: test_multiprocessing_fork may crash on recent versions of
macOS.  Until the issue is resolved, skip the test on macOS.

@item 
bpo-35352@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35352}: Modify test_asyncio to use the certificate set from the test
directory.

@item 
bpo-35317@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35317}: Fix @code{mktime()} overflow error in @code{test_email}: run
@code{test_localtime_daylight_true_dst_true()} and
@code{test_localtime_daylight_false_dst_true()} with a specific timezone.

@item 
bpo-21263@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21263}: After several reports that test_gdb does not work properly on
macOS and since gdb is not shipped by default anymore, test_gdb is now
skipped on macOS when LLVM Clang has been used to compile Python. Patch by
Lysandros Nikolaou

@item 
bpo-34279@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34279}: regrtest issue a warning when no tests have been executed in a
particular test file. Also, a new final result state is issued if no test
have been executed across all test files. Patch by Pablo Galindo.

@item 
bpo-34962@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34962}: make docstest in Doc now passes., and is enforced in CI

@item 
bpo-23596@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23596}: Use argparse for the command line of the gzip module. Patch by
Antony Lee

@item 
bpo-34537@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34537}: Fix @code{test_gdb.test_strings()} when @code{LC_ALL=C} and GDB was
compiled with Python 3.6 or earlier.

@item 
bpo-34587@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34587}: test_socket: Remove RDSTest.testCongestion(). The test tries to
fill the receiver’s socket buffer and expects an error. But the RDS
protocol doesn’t require that. Moreover, the Linux implementation of RDS
expects that the producer of the messages reduces its rate, it’s not the
role of the receiver to trigger an error. The test fails on Fedora 28 by
design, so just remove it.

@item 
bpo-34661@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34661}: Fix test_shutil if unzip doesn’t support -t.

@item 
bpo-34200@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34200}: Fixed non-deterministic flakiness of test_pkg by not using the
scary test.support.module_cleanup() logic to save and restore sys.modules
contents between test cases.

@item 
bpo-34569@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34569}: The experimental PEP 554 data channels now correctly pass
negative PyLong objects between subinterpreters on 32-bit systems. Patch
by Michael Felt.

@item 
bpo-34594@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34594}: Fix usage of hardcoded @code{errno} values in the tests.

@item 
bpo-34579@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34579}: Fix test_embed for AIX Patch by Michael Felt

@item 
bpo-34542@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34542}: Use 3072 RSA keys and SHA-256 signature for test certs and
keys.

@item 
bpo-11193@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11193}: Remove special condition for AIX in
@code{test_subprocess.test_undecodable_env}

@item 
bpo-34347@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34347}: Fix @code{test_utf8_mode.test_cmd_line} for AIX

@item 
bpo-34490@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34490}: On AIX with AF_UNIX family sockets getsockname() does not
provide ‘sockname’, so skip calls to transport.get_extra_info(‘sockname’)

@item 
bpo-34391@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34391}: Fix ftplib test for TLS 1.3 by reading from data socket.

@item 
bpo-11192@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11192}: Fix @code{test_socket} on AIX 6.1 and later IPv6 zone id supports
only supported by @code{inet_pton6_zone()}. Switch to runtime-based
@code{platform.system()} to establish current platform rather than build-time
based @code{sys.platform()}

@item 
bpo-34399@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34399}: Update all RSA keys and DH params to use at least 2048 bits.

@item 
bpo-34373@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34373}: Fix @code{test_mktime} and @code{test_pthread_getcpuclickid} tests
for AIX Add range checking for @code{_PyTime_localtime} for AIX Patch by
Michael Felt

@item 
bpo-11191@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11191}: Skip the distutils test ‘test_search_cpp’ when using XLC as
compiler patch by aixtools (Michael Felt)

@item 
Improved an error message when mock assert_has_calls fails.

@item 
bpo-33746@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33746}: Fix test_unittest when run in verbose mode.

@item 
bpo-33901@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33901}: Fix test_dbm_gnu on macOS with gdbm 1.15: add a larger value to
make sure that the file size changes.

@item 
bpo-33873@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33873}: Fix a bug in @code{regrtest} that caused an extra test to run if
–huntrleaks/-R was used. Exit with error in case that invalid parameters
are specified to –huntrleaks/-R (at least one warmup run and one
repetition must be used).

@item 
bpo-33562@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33562}: Check that a global asyncio event loop policy is not left
behind by any tests.

@item 
bpo-33655@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33655}: Ignore test_posix_fallocate failures on BSD platforms that
might be due to running on ZFS.

@item 
bpo-32962@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32962}: Fixed test_gdb when Python is compiled with flags -mcet
-fcf-protection -O0.

@item 
bpo-33358@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33358}: Fix @code{test_embed.test_pre_initialization_sys_options()} when
the interpreter is built with @code{--enable-shared}.

@item 
bpo-32872@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32872}: Avoid regrtest compatibility issue with namespace packages.

@item 
bpo-32517@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32517}: Fix failing @code{test_asyncio} on macOS 10.12.2+ due to transport
of @code{KqueueSelector} loop was not being closed.

@item 
bpo-32663@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32663}: Making sure the @code{SMTPUTF8SimTests} class of tests gets run in
@code{test_smtplib.py}.

@item 
bpo-27643@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27643}: Test_C test case needs “signed short” bitfields, but the IBM
XLC compiler (on AIX) does not support this Skip the code and test when
AIX and XLC are used

Applicable to Python2-2.7 and later

@item 
bpo-19417@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19417}: Add test_bdb.py.

@item 
bpo-31809@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31809}: Add tests to verify connection with secp ECDH curves.
@end itemize

@node Build<62>,Windows<55>,Tests<55>,Python 3 8 0 alpha 1
@anchor{whatsnew/changelog id754}@anchor{1e26}
@subsubsection Build



@itemize -

@item 
bpo-34691@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34691}: The _contextvars module is now built into the core Python
library on Windows.

@item 
bpo-35683@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35683}: Improved Azure Pipelines build steps and now verifying layouts
correctly

@item 
bpo-35642@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35642}: Remove asynciomodule.c from pythoncore.vcxproj

@item 
bpo-35550@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35550}: Fix incorrect Solaris #ifdef checks to look for __sun && __SVR4
instead of sun when compiling.

@item 
bpo-35499@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35499}: @code{make profile-opt} no longer replaces @code{CFLAGS_NODIST} with
@code{CFLAGS}. It now adds profile-guided optimization (PGO) flags to
@code{CFLAGS_NODIST}: existing @code{CFLAGS_NODIST} flags are kept.

@item 
bpo-35257@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35257}: Avoid leaking the linker flags from Link Time Optimizations
(LTO) into distutils when compiling C extensions.

@item 
bpo-35351@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35351}: When building Python with clang and LTO, LTO flags are no
longer passed into CFLAGS to build third-party C extensions through
distutils.

@item 
bpo-35139@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35139}: Fix a compiler error when statically linking @code{pyexpat} in
@code{Modules/Setup}.

@item 
bpo-35059@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35059}: PCbuild: Set InlineFunctionExpansion to OnlyExplicitInline
(“/Ob1” option) in pyproject.props in Debug mode to expand functions
marked as inline. This change should make Python compiled in Debug mode a
little bit faster on Windows.

@item 
bpo-35011@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35011}: Restores the use of pyexpatns.h to isolate our embedded copy of
the expat C library so that its symbols do not conflict at link or dynamic
loading time with an embedding application or other extension modules with
their own version of libexpat.

@item 
bpo-28015@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28015}: Have –with-lto works correctly with clang.

@item 
bpo-34765@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34765}: Update the outdated install-sh file to the latest revision from
automake v1.16.1

@item 
bpo-34585@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34585}: Check for floating-point byte order in configure.ac using
compilation tests instead of executing code, so that these checks work in
cross-compiled builds.

@item 
bpo-34710@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34710}: Fixed SSL module build with OpenSSL & pedantic CFLAGS.

@item 
bpo-34582@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34582}: Add JUnit XML output for regression tests and update Azure
DevOps builds.

@item 
bpo-34081@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34081}: Make Sphinx warnings as errors in the Docs Makefile.

@item 
bpo-34555@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34555}: Fix for case where it was not possible to have both
@code{HAVE_LINUX_VM_SOCKETS_H} and @code{HAVE_SOCKADDR_ALG} be undefined.

@item 
bpo-33015@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33015}: Fix an undefined behaviour in the pthread implementation of
@ref{1e27,,PyThread_start_new_thread()}: add a function wrapper to always
return @code{NULL}.

@item 
bpo-34245@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34245}: The Python shared library is now installed with write
permission (mode 0755), which is the standard way of installing such
libraries.

@item 
bpo-34121@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34121}: Fix detection of C11 atomic support on clang.

@item 
bpo-32430@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32430}: Rename Modules/Setup.dist to Modules/Setup, and remove the
necessity to copy the former manually to the latter when updating the
local source tree.

@item 
bpo-30345@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30345}: Add -g to LDFLAGS when compiling with LTO to get debug symbols.

@item 
bpo-5755@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5755}: Move @code{-Wstrict-prototypes} option to @code{CFLAGS_NODIST} from
@code{OPT}. This option emitted annoying warnings when building extension
modules written in C++.

@item 
bpo-33614@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33614}: Ensures module definition files for the stable ABI on Windows
are correctly regenerated.

@item 
bpo-33648@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33648}: The –with-c-locale-warning configuration flag has been
removed. It has had no effect for about a year.

@item 
bpo-33522@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33522}: Enable CI builds on Visual Studio Team Services at
@indicateurl{https://python.visualstudio.com/cpython}

@item 
bpo-33512@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33512}: configure’s check for “long double” has been simplified

@item 
bpo-33483@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33483}: C compiler is now correctly detected from the standard
environment variables. –without-gcc and –with-icc options have been
removed.

@item 
bpo-33394@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33394}: Enable the verbose build for extension modules, when GNU make
is passed macros on the command line.

@item 
bpo-33393@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33393}: Update config.guess and config.sub files.

@item 
bpo-33377@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33377}: Add new triplets for mips r6 and riscv variants (used in
extension suffixes).

@item 
bpo-32232@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32232}: By default, modules configured in @code{Modules/Setup} are no
longer built with @code{-DPy_BUILD_CORE}. Instead, modules that specifically
need that preprocessor definition include it in their individual entries.

@item 
bpo-33182@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33182}: The embedding tests can once again be built with clang 6.0

@item 
bpo-33163@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33163}: Upgrade pip to 9.0.3 and setuptools to v39.0.1.

@item 
bpo-33012@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33012}: gcc 8 has added a new warning heuristic to detect invalid
function casts and a stock python build seems to hit that warning quite
often.  The most common is the cast of a METH_NOARGS function (that uses
just one argument) to a PyCFunction. Fix this by adding a dummy argument
to all functions that implement METH_NOARGS.

@item 
bpo-32898@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32898}: Fix the python debug build when using COUNT_ALLOCS.

@item 
bpo-29442@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29442}: Replace optparse with argparse in setup.py
@end itemize

@node Windows<55>,macOS<42>,Build<62>,Python 3 8 0 alpha 1
@anchor{whatsnew/changelog id755}@anchor{1e28}
@subsubsection Windows



@itemize -

@item 
bpo-35890@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35890}: Fix API calling consistency of GetVersionEx and wcstok.

@item 
bpo-32560@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32560}: The @code{py} launcher now forwards its @code{STARTUPINFO} structure
to child processes.

@item 
bpo-35854@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35854}: Fix EnvBuilder and –symlinks in venv on Windows

@item 
bpo-35811@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35811}: Avoid propagating venv settings when launching via py.exe

@item 
bpo-35797@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35797}: Fix default executable used by the multiprocessing module

@item 
bpo-35758@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35758}: Allow building on ARM with MSVC.

@item 
bpo-29734@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29734}: Fix handle leaks in os.stat on Windows.

@item 
bpo-35596@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35596}: Use unchecked PYCs for the embeddable distro to avoid zipimport
restrictions.

@item 
bpo-35596@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35596}: Fix vcruntime140.dll being added to embeddable distro multiple
times.

@item 
bpo-35402@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35402}: Update Windows build to use Tcl and Tk 8.6.9

@item 
bpo-35401@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35401}: Updates Windows build to OpenSSL 1.1.0j

@item 
bpo-34977@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34977}: venv on Windows will now use a python.exe redirector rather
than copying the actual binaries from the base environment.

@item 
bpo-34977@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34977}: Adds support for building a Windows App Store package

@item 
bpo-35067@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35067}: Remove _distutils_findvs module and use vswhere.exe instead.

@item 
bpo-32557@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32557}: Allow shutil.disk_usage to take a file path on Windows

@item 
bpo-34770@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34770}: Fix a possible null pointer dereference in pyshellext.cpp.

@item 
bpo-34603@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34603}: Fix returning structs from functions produced by MSVC

@item 
bpo-34581@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34581}: Guard MSVC-specific code in socketmodule.c with @code{#ifdef
_MSC_VER}.

@item 
bpo-34532@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34532}: Fixes exit code of list version arguments for py.exe.

@item 
bpo-34062@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34062}: Fixed the ‘–list’ and ‘–list-paths’ arguments for the py.exe
launcher

@item 
bpo-34225@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34225}: Ensure INCLUDE and LIB directories do not end with a backslash.

@item 
bpo-34011@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34011}: A suite of code has been changed which copied across DLLs and
init.tcl from the running Python location into a venv being created. These
copies are needed only when running from a Python source build, and the
copying code is now only run when that is the case, rather than whenever a
venv is created.

@item 
bpo-34006@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34006}: Revert line length limit for Windows help docs. The line-length
limit is not needed because the pages appear in a separate app rather than
on a browser tab.  It can also interact badly with the DPI setting.

@item 
bpo-31546@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31546}: Restore running PyOS_InputHook while waiting for user input at
the prompt. The restores integration of interactive GUI windows (such as
Matplotlib figures) with the prompt on Windows.

@item 
bpo-30237@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30237}: Output error when ReadConsole is canceled by
CancelSynchronousIo instead of crashing.

@item 
bpo-33895@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33895}: GIL is released while calling functions that acquire Windows
loader lock.

@item 
bpo-33720@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33720}: Reduces maximum marshal recursion depth on release builds.

@item 
bpo-29097@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29097}: Fix bug where @code{datetime.fromtimestamp()} erroneously throws
an @ref{2c0,,OSError} on Windows for values between 0 and 86400. Patch by
Ammar Askar.

@item 
bpo-33316@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33316}: PyThread_release_lock always fails

@item 
bpo-33184@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33184}: Update Windows installer to use OpenSSL 1.1.0h.

@item 
bpo-32890@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32890}: Fix usage of GetLastError() instead of errno in os.execve() and
os.truncate().

@item 
bpo-33016@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33016}: Fix potential use of uninitialized memory in
nt._getfinalpathname

@item 
bpo-32903@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32903}: Fix a memory leak in os.chdir() on Windows if the current
directory is set to a UNC path.

@item 
bpo-32901@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32901}: Update Tcl and Tk versions to 8.6.8

@item 
bpo-31966@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31966}: Fixed WindowsConsoleIO.write() for writing empty data.

@item 
bpo-32409@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32409}: Ensures activate.bat can handle Unicode contents.

@item 
bpo-32457@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32457}: Improves handling of denormalized executable path when
launching Python.

@item 
bpo-32370@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32370}: Use the correct encoding for ipconfig output in the uuid
module. Patch by Segev Finer.

@item 
bpo-29248@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29248}: Fix @ref{b19,,os.readlink()} on Windows, which was mistakenly
treating the @code{PrintNameOffset} field of the reparse data buffer as a
number of characters instead of bytes. Patch by Craig Holmquist and SSE4.

@item 
bpo-1104@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1104}: Correctly handle string length in
@code{msilib.SummaryInfo.GetProperty()} to prevent it from truncating the
last character.
@end itemize

@node macOS<42>,IDLE<37>,Windows<55>,Python 3 8 0 alpha 1
@anchor{whatsnew/changelog id756}@anchor{1e29}
@subsubsection macOS



@itemize -

@item 
bpo-35401@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35401}: Update macOS installer to use OpenSSL 1.1.0j.

@item 
bpo-35025@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35025}: Properly guard the use of the @code{CLOCK_GETTIME} et al. macros
in @code{timemodule} on macOS.

@item 
bpo-24658@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24658}: On macOS, fix reading from and writing into a file with a size
larger than 2 GiB.

@item 
bpo-34405@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34405}: Update to OpenSSL 1.1.0i for macOS installer builds.

@item 
bpo-33635@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33635}: In macOS stat on some file descriptors (/dev/fd/3 f.e) will
result in bad file descriptor OSError. Guard against this exception was
added in is_dir, is_file and similar methods. DirEntry.is_dir can also
throw this exception so _RecursiveWildcardSelector._iterate_directories
was also extended with the same error ignoring pattern.

@item 
bpo-13631@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13631}: The .editrc file in user’s home directory is now processed
correctly during the readline initialization through editline emulation on
macOS.

@item 
bpo-33184@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33184}: Update macOS installer build to use OpenSSL 1.1.0h.

@item 
bpo-32726@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32726}: Build and link with private copy of Tcl/Tk 8.6 for the macOS
10.6+ installer. The 10.9+ installer variant already does this.  This
means that the Python 3.7 provided by the python.org macOS installers no
longer need or use any external versions of Tcl/Tk, either system-provided
or user-installed, such as ActiveTcl.

@item 
bpo-32901@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32901}: Update macOS 10.9+ installer to Tcl/Tk 8.6.8.

@item 
bpo-31903@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31903}: In @code{_scproxy}, drop the GIL when calling into
@code{SystemConfiguration} to avoid deadlocks.
@end itemize

@node IDLE<37>,Tools/Demos<37>,macOS<42>,Python 3 8 0 alpha 1
@anchor{whatsnew/changelog id757}@anchor{1e2a}
@subsubsection IDLE



@itemize -

@item 
bpo-35770@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35770}: IDLE macosx deletes Options => Configure IDLE. It previously
deleted Window => Zoom Height by mistake. (Zoom Height is now on the
Options menu).  On Mac, the settings dialog is accessed via Preferences on
the IDLE menu.

@item 
bpo-35769@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35769}: Change IDLE’s new file name from ‘Untitled’ to ‘untitled’

@item 
bpo-35660@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35660}: Fix imports in idlelib.window.

@item 
bpo-35641@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35641}: Proper format @code{calltip} when the function has no docstring.

@item 
bpo-33987@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33987}: Use ttk Frame for ttk widgets.

@item 
bpo-34055@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34055}: Fix erroneous ‘smart’ indents and newlines in IDLE Shell.

@item 
bpo-35591@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35591}: Find Selection now works when selection not found.

@item 
bpo-35196@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35196}: Speed up squeezer line counting.

@item 
bpo-35598@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35598}: Update config_key: use PEP 8 names and ttk widgets, make some
objects global, and add tests.

@item 
bpo-28097@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28097}: Add Previous/Next History entries to Shell menu.

@item 
bpo-35208@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35208}: Squeezer now properly counts wrapped lines before newlines.

@item 
bpo-35555@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35555}: Gray out Code Context menu entry when it’s not applicable.

@item 
bpo-35521@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35521}: Document the IDLE editor code context feature. Add some
internal references within the IDLE doc.

@item 
bpo-22703@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22703}: The Code Context menu label now toggles between Show/Hide Code
Context. The Zoom Height menu now toggles between Zoom/Restore Height.
Zoom Height has moved from the Window menu to the Options menu.

@item 
bpo-35213@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35213}: Where appropriate, use ‘macOS’ in idlelib.

@item 
bpo-34864@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34864}: On macOS, warn if the system preference “Prefer tabs when
opening documents” is set to “Always”.

@item 
bpo-34864@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34864}: Document two IDLE on MacOS issues. The System Preferences Dock
“prefer tabs always” setting disables some IDLE features.  Menus are a bit
different than as described for Windows and Linux.

@item 
bpo-35202@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35202}: Remove unused imports from lib/idlelib

@item 
bpo-33000@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33000}: Document that IDLE’s shell has no line limit. A program that
runs indefinitely can overfill memory.

@item 
bpo-23220@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23220}: Explain how IDLE’s Shell displays output.

@item 
bpo-35099@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35099}: Improve the doc about IDLE running user code.   The section is
renamed from “IDLE – console differences” is renamed “Running user code”.
It mostly covers the implications of using custom @code{sys.std@var{xxx}}
objects.

@item 
bpo-35097@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35097}: Add IDLE doc subsection explaining editor windows. Topics
include opening, title and status bar, .py* extension, and running.

@item 
bpo-35093@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35093}: Document the IDLE document viewer in the IDLE doc. Add a
paragraph in “Help and preferences”, “Help sources” subsection.

@item 
bpo-35088@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35088}: Update idlelib.help.copy_string docstring. We now use git and
backporting instead of hg and forward merging.

@item 
bpo-35087@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35087}: Update idlelib help files for the current doc build. The main
change is the elimination of chapter-section numbers.

@item 
bpo-34548@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34548}: Use configured color theme for read-only text views.

@item 
bpo-1529353@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1529353}: Enable “squeezing” of long outputs in the shell, to avoid
performance degradation and to clean up the history without losing it.
Squeezed outputs may be copied, viewed in a separate window, and
“unsqueezed”.

@item 
bpo-34047@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34047}: Fixed mousewheel scrolling direction on macOS.

@item 
bpo-34275@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34275}: Make IDLE calltips always visible on Mac. Some MacOS-tk
combinations need .update_idletasks(). Patch by Kevin Walzer.

@item 
bpo-34120@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34120}: Fix unresponsiveness after closing certain windows and dialogs.

@item 
bpo-33975@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33975}: Avoid small type when running htests. Since part of the purpose
of human-viewed tests is to determine that widgets look right, it is
important that they look the same for testing as when running IDLE.

@item 
bpo-33905@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33905}: Add test for idlelib.stackview.StackBrowser.

@item 
bpo-33924@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33924}: Change mainmenu.menudefs key ‘windows’ to ‘window’. Every other
menudef key is lowercase version of main menu entry.

@item 
bpo-33906@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33906}: Rename idlelib.windows as window Match Window on the main menu
and remove last plural module name.

@item 
bpo-33917@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33917}: Fix and document idlelib/idle_test/template.py. The revised
file compiles, runs, and tests OK.  idle_test/README.txt explains how to
use it to create new IDLE test files.

@item 
bpo-33904@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33904}: IDLE: In rstrip, rename class RstripExtension as Rstrip

@item 
bpo-33907@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33907}: For consistency and clarity, rename an IDLE module and classes.
Module calltips and its class CallTips are now calltip and Calltip. In
module calltip_w, class CallTip is now CalltipWindow.

@item 
bpo-33856@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33856}: Add “help” in the welcome message of IDLE

@item 
bpo-33839@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33839}: IDLE: refactor ToolTip and CallTip and add documentation and
tests

@item 
bpo-33855@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33855}: Minimally test all IDLE modules. Add missing files, import
module, instantiate classes, and check coverage. Check existing files.

@item 
bpo-33656@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33656}: On Windows, add API call saying that tk scales for DPI. On
Windows 8.1+ or 10, with DPI compatibility properties of the Python binary
unchanged, and a monitor resolution greater than 96 DPI, this should make
text and lines sharper.  It should otherwise have no effect.

@item 
bpo-33768@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33768}: Clicking on a context line moves that line to the top of the
editor window.

@item 
bpo-33763@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33763}: IDLE: Use read-only text widget for code context instead of
label widget.

@item 
bpo-33664@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33664}: Scroll IDLE editor text by lines. Previously, the mouse wheel
and scrollbar slider moved text by a fixed number of pixels, resulting in
partial lines at the top of the editor box.  The change also applies to
the shell and grep output windows, but not to read-only text views.

@item 
bpo-33679@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33679}: Enable theme-specific color configuration for Code Context. Use
the Highlights tab to see the setting for built-in themes or add settings
to custom themes.

@item 
bpo-33642@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33642}: Display up to maxlines non-blank lines for Code Context. If
there is no current context, show a single blank line.

@item 
bpo-33628@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33628}: IDLE: Cleanup codecontext.py and its test.

@item 
bpo-33564@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33564}: IDLE’s code context now recognizes async as a block opener.

@item 
bpo-21474@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21474}: Update word/identifier definition from ascii to unicode. In
text and entry boxes, this affects selection by double-click, movement
left/right by control-left/right, and deletion left/right by
control-BACKSPACE/DEL.

@item 
bpo-33204@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33204}: IDLE: consistently color invalid string prefixes. A ‘u’ string
prefix cannot be paired with either ‘r’ or ‘f’. Consistently color as much
of the prefix, starting at the right, as is valid. Revise and extend
colorizer test.

@item 
bpo-32984@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32984}: Set @code{__file__} while running a startup file.  Like Python,
IDLE optionally runs one startup file in the Shell window before
presenting the first interactive input prompt.  For IDLE, @code{-s} runs a
file named in environmental variable  
@geindex IDLESTARTUP
@geindex 환경 변수; IDLESTARTUP
@code{IDLESTARTUP} or
@geindex PYTHONSTARTUP
@geindex 환경 변수; PYTHONSTARTUP
@ref{1b8,,PYTHONSTARTUP}; @code{-r file} runs @code{file}.  Python sets
@code{__file__} to the startup file name before running the file and unsets
it before the first prompt.  IDLE now does the same when run normally,
without the @code{-n} option.

@item 
bpo-32940@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32940}: Simplify and rename StringTranslatePseudoMapping in pyparse.

@item 
bpo-32916@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32916}: Change @code{str} to @code{code} in pyparse.

@item 
bpo-32905@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32905}: Remove unused code in pyparse module.

@item 
bpo-32874@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32874}: Add tests for pyparse.

@item 
bpo-32837@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32837}: Using the system and place-dependent default encoding for
open() is a bad idea for IDLE’s system and location-independent files.

@item 
bpo-32826@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32826}: Add “encoding=utf-8” to open() in IDLE’s test_help_about. GUI
test test_file_buttons() only looks at initial ascii-only lines, but
failed on systems where open() defaults to ‘ascii’ because readline()
internally reads and decodes far enough ahead to encounter a non-ascii
character in CREDITS.txt.

@item 
bpo-32831@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32831}: Add docstrings and tests for codecontext.

@item 
bpo-32765@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32765}: Update configdialog General tab docstring to add new widgets to
the widget list.
@end itemize

@node Tools/Demos<37>,C API<57>,IDLE<37>,Python 3 8 0 alpha 1
@anchor{whatsnew/changelog id758}@anchor{1e2b}
@subsubsection Tools/Demos



@itemize -

@item 
bpo-35884@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35884}: Add a benchmark script for timing various ways to access
variables: @code{Tools/scripts/var_access_benchmark.py}.

@item 
bpo-34989@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34989}: python-gdb.py now handles errors on computing the line number
of a Python frame.

@item 
bpo-20260@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20260}: Argument Clinic now has non-bitwise unsigned int converters.

@item 
bpo-32962@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32962}: python-gdb now catches @code{UnicodeDecodeError} exceptions when
calling @code{string()}.

@item 
bpo-32962@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32962}: python-gdb now catches ValueError on read_var(): when Python
has no debug symbols for example.

@item 
bpo-33189@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33189}: @code{pygettext.py} now recognizes only literal strings as
docstrings and translatable strings, and rejects bytes literals and
f-string expressions.

@item 
bpo-31920@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31920}: Fixed handling directories as arguments in the @code{pygettext}
script. Based on patch by Oleg Krasnikov.

@item 
bpo-29673@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29673}: Fix pystackv and pystack gdbinit macros.

@item 
bpo-25427@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25427}: Remove the pyvenv script in favor of @code{python3 -m venv} in
order to lower confusion as to what Python interpreter a virtual
environment will be created for.

@item 
bpo-32885@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32885}: Add an @code{-n} flag for @code{Tools/scripts/pathfix.py} to disable
automatic backup creation (files with @code{~} suffix).

@item 
bpo-32222@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32222}: Fix pygettext not extracting docstrings for functions with type
annotated arguments. Patch by Toby Harradine.

@item 
bpo-31583@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31583}: Fix 2to3 for using with –add-suffix option but without
–output-dir option for relative path to files in current directory.
@end itemize

@node C API<57>,,Tools/Demos<37>,Python 3 8 0 alpha 1
@anchor{whatsnew/changelog id759}@anchor{1e2c}
@subsubsection C API



@itemize -

@item 
bpo-35713@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35713}: The @code{PyByteArray_Init()} and @code{PyByteArray_Fini()}
functions have been removed. They did nothing since Python 2.7.4 and
Python 3.2.0, were excluded from the limited API (stable ABI), and were
not documented.

@item 
bpo-33817@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33817}: Fixed @ref{19ce,,_PyBytes_Resize()} for empty bytes objects.

@item 
bpo-35322@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35322}: Fix memory leak in @ref{dc2,,PyUnicode_EncodeLocale()} and
@ref{1e2d,,PyUnicode_EncodeFSDefault()} on error handling.

@item 
bpo-35059@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35059}: The following C macros have been converted to static inline
functions: @ref{78e,,Py_INCREF()}, @ref{78f,,Py_DECREF()}, @ref{c59,,Py_XINCREF()},
@ref{991,,Py_XDECREF()}, @ref{1d3b,,PyObject_INIT()},
@ref{1d3c,,PyObject_INIT_VAR()}.

@item 
bpo-35296@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35296}: @code{make install} now also installs the internal API:
@code{Include/internal/*.h} header files.

@item 
bpo-35081@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35081}: Internal APIs surrounded by @code{#ifdef Py_BUILD_CORE} have been
moved from @code{Include/*.h} headers to new header files
@code{Include/internal/pycore_*.h}.

@item 
bpo-35259@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35259}: Conditionally declare @ref{f10,,Py_FinalizeEx()} (new in 3.6)
based on Py_LIMITED_API. Patch by Arthur Neufeld.

@item 
bpo-35081@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35081}: The @code{_PyObject_GC_TRACK()} and
@code{_PyObject_GC_UNTRACK()} macros have been removed from the public C
API.

@item 
bpo-35134@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=35134}: Creation of a new @code{Include/cpython/} subdirectory.

@item 
bpo-34725@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34725}: Adds _Py_SetProgramFullPath so embedders may override
sys.executable

@item 
bpo-34910@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34910}: Ensure that @ref{198c,,PyObject_Print()} always returns @code{-1} on
error.  Patch by Zackery Spytz.

@item 
bpo-34523@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34523}: Py_DecodeLocale() and Py_EncodeLocale() now use the UTF-8
encoding on Windows if Py_LegacyWindowsFSEncodingFlag is zero.

@item 
bpo-34193@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34193}: Fix pluralization in TypeError messages in getargs.c and
typeobject.c: ‘1 argument’ instead of ‘1 arguments’ and ‘1 element’
instead of ‘1 elements’.

@item 
bpo-34127@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34127}: Return grammatically correct error message based on argument
count. Patch by Karthikeyan Singaravelan.

@item 
bpo-23927@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23927}: Fixed @ref{794,,SystemError} in
@ref{622,,PyArg_ParseTupleAndKeywords()} when the @code{w*} format unit is used
for optional parameter.

@item 
bpo-32455@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32455}: Added @ref{1e2e,,PyCompile_OpcodeStackEffectWithJump()}.

@item 
bpo-34008@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34008}: Py_Main() can again be called after Py_Initialize(), as in
Python 3.6.

@item 
bpo-32500@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32500}: Fixed error messages for @ref{1e2f,,PySequence_Size()},
@ref{1e30,,PySequence_GetItem()}, @ref{1e31,,PySequence_SetItem()} and
@ref{1e32,,PySequence_DelItem()} called with a mapping and
@ref{1e33,,PyMapping_Size()} called with a sequence.

@item 
bpo-33818@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33818}: @ref{c5a,,PyExceptionClass_Name()} will now return @code{const char
*} instead of @code{char *}.

@item 
bpo-33042@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33042}: Embedding applications may once again call
PySys_ResetWarnOptions, PySys_AddWarnOption, and PySys_AddXOption prior to
calling Py_Initialize.

@item 
bpo-32374@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32374}: Document that m_traverse for multi-phase initialized modules
can be called with m_state=NULL, and add a sanity check

@item 
bpo-30863@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30863}: @ref{1e34,,PyUnicode_AsWideChar()} and
@ref{ab9,,PyUnicode_AsWideCharString()} no longer cache the @code{wchar_t*}
representation of string objects.
@end itemize

@node Python 3 7 0 final,Python 3 7 0 release candidate 1,Python 3 8 0 alpha 1,Changelog
@anchor{whatsnew/changelog python-3-7-0-final}@anchor{1e35}
@subsection Python 3.7.0 final


`Release date: 2018-06-27'

@menu
* Library: Library<163>. 
* C API: C API<58>. 

@end menu

@node Library<163>,C API<58>,,Python 3 7 0 final
@anchor{whatsnew/changelog id760}@anchor{1e36}
@subsubsection Library



@itemize -

@item 
bpo-33851@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33851}: Fix @ref{1e37,,ast.get_docstring()} for a node that lacks a
docstring.
@end itemize

@node C API<58>,,Library<163>,Python 3 7 0 final
@anchor{whatsnew/changelog id761}@anchor{1e38}
@subsubsection C API



@itemize -

@item 
bpo-33932@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33932}: Calling Py_Initialize() twice does nothing, instead of failing
with a fatal error: restore the Python 3.6 behaviour.
@end itemize

@node Python 3 7 0 release candidate 1,Python 3 7 0 beta 5,Python 3 7 0 final,Changelog
@anchor{whatsnew/changelog python-3-7-0-release-candidate-1}@anchor{1e39}
@subsection Python 3.7.0 release candidate 1


`Release date: 2018-06-12'

@menu
* Core and Builtins: Core and Builtins<160>. 
* Library: Library<164>. 
* Documentation: Documentation<57>. 
* Build: Build<63>. 
* Windows: Windows<56>. 
* IDLE: IDLE<38>. 

@end menu

@node Core and Builtins<160>,Library<164>,,Python 3 7 0 release candidate 1
@anchor{whatsnew/changelog id762}@anchor{1e3a}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-33803@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33803}: Fix a crash in hamt.c caused by enabling GC tracking for an
object that hadn’t all of its fields set to NULL.

@item 
bpo-33706@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33706}: Fix a crash in Python initialization when parsing the command
line options. Thanks Christoph Gohlke for the bug report and the fix!

@item 
bpo-30654@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30654}: Fixed reset of the SIGINT handler to SIG_DFL on interpreter
shutdown even when there was a custom handler set previously. Patch by
Philipp Kerling.

@item 
bpo-31849@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31849}: Fix signed/unsigned comparison warning in pyhash.c.
@end itemize

@node Library<164>,Documentation<57>,Core and Builtins<160>,Python 3 7 0 release candidate 1
@anchor{whatsnew/changelog id763}@anchor{1e3b}
@subsubsection Library



@itemize -

@item 
bpo-30167@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30167}: Prevent site.main() exception if PYTHONSTARTUP is set. Patch by
Steve Weber.

@item 
bpo-33812@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33812}: Datetime instance d with non-None tzinfo, but with
d.tzinfo.utcoffset(d) returning None is now treated as naive by the
astimezone() method.

@item 
bpo-30805@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30805}: Avoid race condition with debug logging

@item 
bpo-33694@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33694}: asyncio: Fix a race condition causing data loss on
pause_reading()/resume_reading() when using the ProactorEventLoop.

@item 
bpo-32493@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32493}: Correct test for @code{uuid_enc_be} availability in
@code{configure.ac}. Patch by Michael Felt.

@item 
bpo-33792@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33792}: Add asyncio.WindowsSelectorEventLoopPolicy and
asyncio.WindowsProactorEventLoopPolicy.

@item 
bpo-33778@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33778}: Update @code{unicodedata}’s database to Unicode version 11.0.0.

@item 
bpo-33770@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33770}: improve base64 exception message for encoded inputs of invalid
length

@item 
bpo-33769@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33769}: asyncio/start_tls: Fix error message; cancel callbacks in case
of an unhandled error; mark SSLTransport as closed if it is aborted.

@item 
bpo-33767@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33767}: The concatenation (@code{+}) and repetition (@code{*}) sequence
operations now raise @ref{198,,TypeError} instead of @ref{794,,SystemError} when
performed on @ref{518,,mmap.mmap} objects.  Patch by Zackery Spytz.

@item 
bpo-33734@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33734}: asyncio/ssl: Fix AttributeError, increase default handshake
timeout

@item 
bpo-11874@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11874}: Use a better regex when breaking usage into wrappable parts.
Avoids bogus assertion errors from custom metavar strings.

@item 
bpo-33582@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33582}: Emit a deprecation warning for inspect.formatargspec
@end itemize

@node Documentation<57>,Build<63>,Library<164>,Python 3 7 0 release candidate 1
@anchor{whatsnew/changelog id764}@anchor{1e3c}
@subsubsection Documentation



@itemize -

@item 
bpo-33409@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33409}: Clarified the relationship between 
@geindex Python 향상 제안; PEP 538
PEP 538@footnote{https://peps.python.org/pep-0538/}’s
PYTHONCOERCECLOCALE and PEP 540’s PYTHONUTF8 mode.

@item 
bpo-33736@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33736}: Improve the documentation of @ref{d0d,,asyncio.open_connection()},
@ref{d0e,,asyncio.start_server()} and their UNIX socket counterparts.

@item 
bpo-31432@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31432}: Clarify meaning of CERT_NONE, CERT_OPTIONAL, and CERT_REQUIRED
flags for ssl.SSLContext.verify_mode.
@end itemize

@node Build<63>,Windows<56>,Documentation<57>,Python 3 7 0 release candidate 1
@anchor{whatsnew/changelog id765}@anchor{1e3d}
@subsubsection Build



@itemize -

@item 
bpo-5755@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5755}: Move @code{-Wstrict-prototypes} option to @code{CFLAGS_NODIST} from
@code{OPT}. This option emitted annoying warnings when building extension
modules written in C++.
@end itemize

@node Windows<56>,IDLE<38>,Build<63>,Python 3 7 0 release candidate 1
@anchor{whatsnew/changelog id766}@anchor{1e3e}
@subsubsection Windows



@itemize -

@item 
bpo-33720@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33720}: Reduces maximum marshal recursion depth on release builds.
@end itemize

@node IDLE<38>,,Windows<56>,Python 3 7 0 release candidate 1
@anchor{whatsnew/changelog id767}@anchor{1e3f}
@subsubsection IDLE



@itemize -

@item 
bpo-33656@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33656}: On Windows, add API call saying that tk scales for DPI. On
Windows 8.1+ or 10, with DPI compatibility properties of the Python binary
unchanged, and a monitor resolution greater than 96 DPI, this should make
text and lines sharper.  It should otherwise have no effect.

@item 
bpo-33768@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33768}: Clicking on a context line moves that line to the top of the
editor window.

@item 
bpo-33763@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33763}: IDLE: Use read-only text widget for code context instead of
label widget.

@item 
bpo-33664@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33664}: Scroll IDLE editor text by lines. Previously, the mouse wheel
and scrollbar slider moved text by a fixed number of pixels, resulting in
partial lines at the top of the editor box.  The change also applies to
the shell and grep output windows, but not to read-only text views.

@item 
bpo-33679@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33679}: Enable theme-specific color configuration for Code Context. Use
the Highlights tab to see the setting for built-in themes or add settings
to custom themes.

@item 
bpo-33642@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33642}: Display up to maxlines non-blank lines for Code Context. If
there is no current context, show a single blank line.
@end itemize

@node Python 3 7 0 beta 5,Python 3 7 0 beta 4,Python 3 7 0 release candidate 1,Changelog
@anchor{whatsnew/changelog python-3-7-0-beta-5}@anchor{1e40}
@subsection Python 3.7.0 beta 5


`Release date: 2018-05-30'

@menu
* Core and Builtins: Core and Builtins<161>. 
* Library: Library<165>. 
* Documentation: Documentation<58>. 
* Tests: Tests<56>. 
* Build: Build<64>. 
* macOS: macOS<43>. 
* IDLE: IDLE<39>. 

@end menu

@node Core and Builtins<161>,Library<165>,,Python 3 7 0 beta 5
@anchor{whatsnew/changelog id768}@anchor{1e41}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-33622@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33622}: Fixed a leak when the garbage collector fails to add an object
with the @code{__del__} method or referenced by it into the
@ref{13c6,,gc.garbage} list. @ref{b84,,PyGC_Collect()} can now be called when an
exception is set and preserves it.

@item 
bpo-33509@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33509}: Fix module_globals parameter of warnings.warn_explicit(): don’t
crash if module_globals is not a dict.

@item 
bpo-20104@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20104}: The new @code{os.posix_spawn} added in 3.7.0b1 was removed as we
are still working on what the API should look like.  Expect this in 3.8
instead.

@item 
bpo-33475@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33475}: Fixed miscellaneous bugs in converting annotations to strings
and optimized parentheses in the string representation.

@item 
bpo-33391@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33391}: Fix a leak in set_symmetric_difference().

@item 
bpo-28055@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28055}: Fix unaligned accesses in siphash24(). Patch by Rolf Eike Beer.

@item 
bpo-32911@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32911}: Due to unexpected compatibility issues discovered during
downstream beta testing, reverted bpo-29463@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29463}. @code{docstring} field is
removed from Module, ClassDef, FunctionDef, and AsyncFunctionDef ast nodes
which was added in 3.7a1.  Docstring expression is restored as a first
statement in their body. Based on patch by Inada Naoki.

@item 
bpo-21983@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21983}: Fix a crash in @code{ctypes.cast()} in case the type argument is a
ctypes structured data type. Patch by Eryk Sun and Oren Milman.
@end itemize

@node Library<165>,Documentation<58>,Core and Builtins<161>,Python 3 7 0 beta 5
@anchor{whatsnew/changelog id769}@anchor{1e42}
@subsubsection Library



@itemize -

@item 
bpo-32751@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32751}: When cancelling the task due to a timeout,
@ref{814,,asyncio.wait_for()} will now wait until the cancellation is complete.

@item 
bpo-32684@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32684}: Fix gather to propagate cancellation of itself even with
return_exceptions.

@item 
bpo-33654@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33654}: Support protocol type switching in SSLTransport.set_protocol().

@item 
bpo-33674@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33674}: Pause the transport as early as possible to further reduce the
risk of data_received() being called before connection_made().

@item 
bpo-33674@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33674}: Fix a race condition in SSLProtocol.connection_made() of
asyncio.sslproto: start immediately the handshake instead of using
call_soon(). Previously, data_received() could be called before the
handshake started, causing the handshake to hang or fail.

@item 
bpo-31647@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31647}: Fixed bug where calling write_eof() on a
_SelectorSocketTransport after it’s already closed raises AttributeError.

@item 
bpo-32610@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32610}: Make asyncio.all_tasks() return only pending tasks.

@item 
bpo-32410@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32410}: Avoid blocking on file IO in sendfile fallback code

@item 
bpo-33469@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33469}: Fix RuntimeError after closing loop that used run_in_executor

@item 
bpo-33672@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33672}: Fix Task.__repr__ crash with Cython’s bogus coroutines

@item 
bpo-33654@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33654}: Fix transport.set_protocol() to support switching between
asyncio.Protocol and asyncio.BufferedProtocol.  Fix loop.start_tls() to
work with asyncio.BufferedProtocols.

@item 
bpo-33652@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33652}: Pickles of type variables and subscripted generics are now
future-proof and compatible with older Python versions.

@item 
bpo-32493@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32493}: Fixed @ref{da0,,uuid.uuid1()} on FreeBSD.

@item 
bpo-33618@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33618}: Finalize and document preliminary and experimental TLS 1.3
support with OpenSSL 1.1.1

@item 
bpo-33623@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33623}: Fix possible SIGSGV when asyncio.Future is created in __del__

@item 
bpo-30877@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30877}: Fixed a bug in the Python implementation of the JSON decoder
that prevented the cache of parsed strings from clearing after finishing
the decoding. Based on patch by c-fos.

@item 
bpo-33570@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33570}: Change TLS 1.3 cipher suite settings for compatibility with
OpenSSL 1.1.1-pre6 and newer. OpenSSL 1.1.1 will have TLS 1.3 ciphers
enabled by default.

@item 
bpo-28556@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28556}: Do not simplify arguments to @code{typing.Union}. Now
@code{Union[Manager, Employee]} is not simplified to @code{Employee} at runtime.
Such simplification previously caused several bugs and limited
possibilities for introspection.

@item 
bpo-33540@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33540}: Add a new @code{block_on_close} class attribute to
@code{ForkingMixIn} and @code{ThreadingMixIn} classes of @ref{d2,,socketserver}.

@item 
bpo-33548@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33548}: tempfile._candidate_tempdir_list should consider common TEMP
locations

@item 
bpo-33109@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33109}: argparse subparsers are once again not required by default,
reverting the change in behavior introduced by bpo-26510@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26510} in 3.7.0a2.

@item 
bpo-33536@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33536}: dataclasses.make_dataclass now checks for invalid field names
and duplicate fields. Also, added a check for invalid field
specifications.

@item 
bpo-33542@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33542}: Prevent @code{uuid.get_node} from using a DUID instead of a MAC on
Windows. Patch by Zvi Effron

@item 
bpo-26819@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26819}: Fix race condition with @code{ReadTransport.resume_reading} in
Windows proactor event loop.

@item 
Fix failure in @code{typing.get_type_hints()} when ClassVar was provided as a
string forward reference.

@item 
bpo-33505@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33505}: Optimize asyncio.ensure_future() by reordering if checks: 1.17x
faster.

@item 
bpo-33497@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33497}: Add errors param to cgi.parse_multipart and make an encoding in
FieldStorage use the given errors (needed for Twisted).  Patch by Amber
Brown.

@item 
bpo-33495@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33495}: Change dataclasses.Fields repr to use the repr of each of its
members, instead of str.  This makes it more clear what each field
actually represents.  This is especially true for the ‘type’ member.

@item 
bpo-33453@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33453}: Fix dataclasses to work if using literal string type
annotations or if using PEP 563 “Postponed Evaluation of Annotations”.
Only specific string prefixes are detected for both ClassVar (“ClassVar”
and “typing.ClassVar”) and InitVar (“InitVar” and “dataclasses.InitVar”).

@item 
bpo-28556@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28556}: Minor fixes in typing module: add annotations to
@code{NamedTuple.__new__}, pass @code{*args} and @code{**kwds} in
@code{Generic.__new__}.  Original PRs by Paulius Šarka and Chad Dombrova.

@item 
bpo-20087@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20087}: Updated alias mapping with glibc 2.27 supported locales.

@item 
bpo-33422@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33422}: Fix trailing quotation marks getting deleted when looking up
byte/string literals on pydoc. Patch by Andrés Delfino.

@item 
bpo-28167@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28167}: The function @code{platform.linux_distribution} and
@code{platform.dist} now trigger a @code{DeprecationWarning} and have been
marked for removal in Python 3.8

@item 
bpo-33197@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33197}: Update error message when constructing invalid
inspect.Parameters Patch by Donghee Na.

@item 
bpo-33263@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33263}: Fix FD leak in @code{_SelectorSocketTransport}  Patch by Vlad
Starostin.

@item 
bpo-32861@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32861}: The urllib.robotparser’s @code{__str__} representation now
includes wildcard entries and the “Crawl-delay” and “Request-rate” fields.
Patch by Michael Lazar.

@item 
bpo-32257@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32257}: The ssl module now contains OP_NO_RENEGOTIATION constant,
available with OpenSSL 1.1.0h or 1.1.1.

@item 
bpo-16865@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16865}: Support arrays >=2GiB in @ref{2e,,ctypes}.  Patch by Segev Finer.
@end itemize

@node Documentation<58>,Tests<56>,Library<165>,Python 3 7 0 beta 5
@anchor{whatsnew/changelog id770}@anchor{1e43}
@subsubsection Documentation



@itemize -

@item 
bpo-23859@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23859}: Document that @code{asyncio.wait()} does not cancel its futures on
timeout.

@item 
bpo-32436@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32436}: Document 
@geindex Python 향상 제안; PEP 567
PEP 567@footnote{https://peps.python.org/pep-0567/} changes to asyncio.

@item 
bpo-33604@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33604}: Update HMAC md5 default to a DeprecationWarning, bump removal
to 3.8.

@item 
bpo-33503@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33503}: Fix broken pypi link

@item 
bpo-33421@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33421}: Add missing documentation for @code{typing.AsyncContextManager}.
@end itemize

@node Tests<56>,Build<64>,Documentation<58>,Python 3 7 0 beta 5
@anchor{whatsnew/changelog id771}@anchor{1e44}
@subsubsection Tests



@itemize -

@item 
bpo-33655@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33655}: Ignore test_posix_fallocate failures on BSD platforms that
might be due to running on ZFS.

@item 
bpo-32604@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32604}: Remove the _xxsubinterpreters module (meant for testing) and
associated helpers.  This module was originally added recently in 3.7b1.
@end itemize

@node Build<64>,macOS<43>,Tests<56>,Python 3 7 0 beta 5
@anchor{whatsnew/changelog id772}@anchor{1e45}
@subsubsection Build



@itemize -

@item 
bpo-33614@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33614}: Ensures module definition files for the stable ABI on Windows
are correctly regenerated.

@item 
bpo-33522@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33522}: Enable CI builds on Visual Studio Team Services at
@indicateurl{https://python.visualstudio.com/cpython}

@item 
bpo-33012@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33012}: Add @code{-Wno-cast-function-type} for gcc 8 for silencing
warnings about function casts like casting to PyCFunction in method
definition lists.
@end itemize

@node macOS<43>,IDLE<39>,Build<64>,Python 3 7 0 beta 5
@anchor{whatsnew/changelog id773}@anchor{1e46}
@subsubsection macOS



@itemize -

@item 
bpo-13631@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13631}: The .editrc file in user’s home directory is now processed
correctly during the readline initialization through editline emulation on
macOS.
@end itemize

@node IDLE<39>,,macOS<43>,Python 3 7 0 beta 5
@anchor{whatsnew/changelog id774}@anchor{1e47}
@subsubsection IDLE



@itemize -

@item 
bpo-33628@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33628}: IDLE: Cleanup codecontext.py and its test.

@item 
bpo-33564@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33564}: IDLE’s code context now recognizes async as a block opener.

@item 
bpo-32831@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32831}: Add docstrings and tests for codecontext.
@end itemize

@node Python 3 7 0 beta 4,Python 3 7 0 beta 3,Python 3 7 0 beta 5,Changelog
@anchor{whatsnew/changelog python-3-7-0-beta-4}@anchor{1e48}
@subsection Python 3.7.0 beta 4


`Release date: 2018-05-02'

@menu
* Core and Builtins: Core and Builtins<162>. 
* Library: Library<166>. 
* Documentation: Documentation<59>. 
* Tests: Tests<57>. 
* Build: Build<65>. 
* Windows: Windows<57>. 
* macOS: macOS<44>. 
* IDLE: IDLE<40>. 
* Tools/Demos: Tools/Demos<38>. 

@end menu

@node Core and Builtins<162>,Library<166>,,Python 3 7 0 beta 4
@anchor{whatsnew/changelog id775}@anchor{1e49}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-33363@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33363}: Raise a SyntaxError for @code{async with} and @code{async for}
statements outside of async functions.

@item 
bpo-33128@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33128}: Fix a bug that causes PathFinder to appear twice on
sys.meta_path. Patch by Pablo Galindo Salgado.

@item 
bpo-33312@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33312}: Fixed clang ubsan (undefined behavior sanitizer) warnings in
dictobject.c by adjusting how the internal struct _dictkeysobject shared
keys structure is declared.

@item 
bpo-33231@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33231}: Fix potential memory leak in @code{normalizestring()}.

@item 
bpo-33205@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33205}: Change dict growth function from
@code{round_up_to_power_2(used*2+hashtable_size/2)} to
@code{round_up_to_power_2(used*3)}.  Previously, dict is shrunk only when
@code{used == 0}. Now dict has more chance to be shrunk.

@item 
bpo-29922@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29922}: Improved error messages in ‘async with’ when @code{__aenter__()}
or @code{__aexit__()} return non-awaitable object.

@item 
bpo-33199@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33199}: Fix @code{ma_version_tag} in dict implementation is uninitialized
when copying from key-sharing dict.
@end itemize

@node Library<166>,Documentation<59>,Core and Builtins<162>,Python 3 7 0 beta 4
@anchor{whatsnew/changelog id776}@anchor{1e4a}
@subsubsection Library



@itemize -

@item 
bpo-33281@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33281}: Fix ctypes.util.find_library regression on macOS.

@item 
bpo-33383@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33383}: Fixed crash in the get() method of the @ref{38,,dbm.ndbm} database
object when it is called with a single argument.

@item 
bpo-33329@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33329}: Fix multiprocessing regression on newer glibcs

@item 
bpo-991266@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=991266}: Fix quoting of the @code{Comment} attribute of
@ref{1e20,,http.cookies.SimpleCookie}.

@item 
bpo-33131@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33131}: Upgrade bundled version of pip to 10.0.1.

@item 
bpo-33308@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33308}: Fixed a crash in the @code{parser} module when converting an ST
object to a tree of tuples or lists with @code{line_info=False} and
@code{col_info=True}.

@item 
bpo-33266@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33266}: lib2to3 now recognizes @code{rf'...'} strings.

@item 
bpo-11594@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11594}: Ensure line-endings are respected when using lib2to3.

@item 
bpo-33254@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33254}: Have @ref{502,,importlib.resources.contents()} and
@code{importlib.abc.ResourceReader.contents()} return an @ref{142c,,iterable}
instead of an @ref{4ca,,iterator}.

@item 
bpo-33256@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33256}: Fix display of @code{<module>} call in the html produced by
@code{cgitb.html()}. Patch by Stéphane Blondon.

@item 
bpo-33185@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33185}: Fixed regression when running pydoc with the @ref{23c,,-m}
switch. (The regression was introduced in 3.7.0b3 by the resolution of
bpo-33053@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33053}) This fix also changed pydoc to add @code{os.getcwd()} to
@ref{3e4,,sys.path} when necessary, rather than adding @code{"."}.

@item 
bpo-33169@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33169}: Delete entries of @code{None} in @ref{7f9,,sys.path_importer_cache}
when @code{importlib.machinery.invalidate_caches()} is called.

@item 
bpo-33217@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33217}: Deprecate looking up non-Enum objects in Enum classes and Enum
members (will raise @ref{198,,TypeError} in 3.8+).

@item 
bpo-33203@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33203}: @code{random.Random.choice()} now raises @code{IndexError} for empty
sequences consistently even when called from subclasses without a
@code{getrandbits()} implementation.

@item 
bpo-33224@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33224}: Update difflib.mdiff() for 
@geindex Python 향상 제안; PEP 479
PEP 479@footnote{https://peps.python.org/pep-0479/}.  Convert an uncaught
StopIteration in a generator into a return-statement.

@item 
bpo-33209@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33209}: End framing at the end of C implementation of
@ref{1e21,,pickle.Pickler.dump()}.

@item 
bpo-20104@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20104}: Improved error handling and fixed a reference leak in
@ref{52e,,os.posix_spawn()}.

@item 
bpo-33175@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33175}: In dataclasses, Field.__set_name__ now looks up the
__set_name__ special method on the class, not the instance, of the default
value.

@item 
bpo-33097@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33097}: Raise RuntimeError when @code{executor.submit} is called during
interpreter shutdown.

@item 
bpo-31908@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31908}: Fix output of cover files for @code{trace} module command-line
tool. Previously emitted cover files only when @code{--missing} option was
used. Patch by Michael Selik.
@end itemize

@node Documentation<59>,Tests<57>,Library<166>,Python 3 7 0 beta 4
@anchor{whatsnew/changelog id777}@anchor{1e4b}
@subsubsection Documentation



@itemize -

@item 
bpo-33378@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33378}: Add Korean language switcher for @indicateurl{https://docs.python.org/3/}

@item 
bpo-33276@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33276}: Clarify that the @code{__path__} attribute on modules cannot be
just any value.

@item 
bpo-33201@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33201}: Modernize documentation for writing C extension types.

@item 
bpo-33195@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33195}: Deprecate @code{Py_UNICODE} usage in @code{c-api/arg} document.
@code{Py_UNICODE} related APIs are deprecated since Python 3.3, but it is
missed in the document.

@item 
bpo-8243@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8243}: Add a note about curses.addch and curses.addstr exception
behavior when writing outside a window, or pad.

@item 
bpo-32337@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32337}: Update documentation related with @code{dict} order.
@end itemize

@node Tests<57>,Build<65>,Documentation<59>,Python 3 7 0 beta 4
@anchor{whatsnew/changelog id778}@anchor{1e4c}
@subsubsection Tests



@itemize -

@item 
bpo-33358@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33358}: Fix @code{test_embed.test_pre_initialization_sys_options()} when
the interpreter is built with @code{--enable-shared}.
@end itemize

@node Build<65>,Windows<57>,Tests<57>,Python 3 7 0 beta 4
@anchor{whatsnew/changelog id779}@anchor{1e4d}
@subsubsection Build



@itemize -

@item 
bpo-33394@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33394}: Enable the verbose build for extension modules, when GNU make
is passed macros on the command line.

@item 
bpo-33393@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33393}: Update config.guess and config.sub files.

@item 
bpo-33377@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33377}: Add new triplets for mips r6 and riscv variants (used in
extension suffixes).

@item 
bpo-32232@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32232}: By default, modules configured in @code{Modules/Setup} are no
longer built with @code{-DPy_BUILD_CORE}. Instead, modules that specifically
need that preprocessor definition include it in their individual entries.

@item 
bpo-33182@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33182}: The embedding tests can once again be built with clang 6.0
@end itemize

@node Windows<57>,macOS<44>,Build<65>,Python 3 7 0 beta 4
@anchor{whatsnew/changelog id780}@anchor{1e4e}
@subsubsection Windows



@itemize -

@item 
bpo-33184@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33184}: Update Windows installer to use OpenSSL 1.1.0h.
@end itemize

@node macOS<44>,IDLE<40>,Windows<57>,Python 3 7 0 beta 4
@anchor{whatsnew/changelog id781}@anchor{1e4f}
@subsubsection macOS



@itemize -

@item 
bpo-33184@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33184}: Update macOS installer build to use OpenSSL 1.1.0h.
@end itemize

@node IDLE<40>,Tools/Demos<38>,macOS<44>,Python 3 7 0 beta 4
@anchor{whatsnew/changelog id782}@anchor{1e50}
@subsubsection IDLE



@itemize -

@item 
bpo-21474@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21474}: Update word/identifier definition from ascii to unicode. In
text and entry boxes, this affects selection by double-click, movement
left/right by control-left/right, and deletion left/right by
control-BACKSPACE/DEL.

@item 
bpo-33204@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33204}: IDLE: consistently color invalid string prefixes. A ‘u’ string
prefix cannot be paired with either ‘r’ or ‘f’. Consistently color as much
of the prefix, starting at the right, as is valid. Revise and extend
colorizer test.
@end itemize

@node Tools/Demos<38>,,IDLE<40>,Python 3 7 0 beta 4
@anchor{whatsnew/changelog id783}@anchor{1e51}
@subsubsection Tools/Demos



@itemize -

@item 
bpo-33189@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33189}: @code{pygettext.py} now recognizes only literal strings as
docstrings and translatable strings, and rejects bytes literals and
f-string expressions.

@item 
bpo-31920@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31920}: Fixed handling directories as arguments in the @code{pygettext}
script. Based on patch by Oleg Krasnikov.

@item 
bpo-29673@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29673}: Fix pystackv and pystack gdbinit macros.

@item 
bpo-31583@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31583}: Fix 2to3 for using with –add-suffix option but without
–output-dir option for relative path to files in current directory.
@end itemize

@node Python 3 7 0 beta 3,Python 3 7 0 beta 2,Python 3 7 0 beta 4,Changelog
@anchor{whatsnew/changelog python-3-7-0-beta-3}@anchor{1e52}
@subsection Python 3.7.0 beta 3


`Release date: 2018-03-29'

@menu
* Security: Security<48>. 
* Core and Builtins: Core and Builtins<163>. 
* Library: Library<167>. 
* Documentation: Documentation<60>. 
* Tests: Tests<58>. 
* Build: Build<66>. 
* Windows: Windows<58>. 
* macOS: macOS<45>. 
* IDLE: IDLE<41>. 
* Tools/Demos: Tools/Demos<39>. 
* C API: C API<59>. 

@end menu

@node Security<48>,Core and Builtins<163>,,Python 3 7 0 beta 3
@anchor{whatsnew/changelog id784}@anchor{1e53}
@subsubsection Security



@itemize -

@item 
bpo-33136@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33136}: Harden ssl module against LibreSSL 
@geindex Common Vulnerabilities and Exposures; CVE 2018-8970
CVE 2018-8970@footnote{https://www.cve.org/CVERecord?id=CVE-2018-8970}.
X509_VERIFY_PARAM_set1_host() is called with an explicit namelen. A new
test ensures that NULL bytes are not allowed.

@item 
bpo-33001@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33001}: Minimal fix to prevent buffer overrun in os.symlink on Windows

@item 
bpo-32981@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32981}: Regexes in difflib and poplib were vulnerable to catastrophic
backtracking. These regexes formed potential DOS vectors (REDOS). They
have been refactored. This resolves 
@geindex Common Vulnerabilities and Exposures; CVE 2018-1060
CVE 2018-1060@footnote{https://www.cve.org/CVERecord?id=CVE-2018-1060} and 
@geindex Common Vulnerabilities and Exposures; CVE 2018-1061
CVE 2018-1061@footnote{https://www.cve.org/CVERecord?id=CVE-2018-1061}.
Patch by Jamie Davis.
@end itemize

@node Core and Builtins<163>,Library<167>,Security<48>,Python 3 7 0 beta 3
@anchor{whatsnew/changelog id785}@anchor{1e54}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-33053@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33053}: When using the -m switch, sys.path[0] is now explicitly
expanded as the `starting' working directory, rather than being left as
the empty path (which allows imports from the current working directory at
the time of the import)

@item 
bpo-33018@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33018}: Improve consistency of errors raised by @code{issubclass()} when
called with a non-class and an abstract base class as the first and second
arguments, respectively. Patch by Josh Bronson.

@item 
bpo-33041@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33041}: Fixed jumping when the function contains an @code{async for} loop.

@item 
bpo-33026@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33026}: Fixed jumping out of “with” block by setting f_lineno.

@item 
bpo-33005@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33005}: Fix a crash on fork when using a custom memory allocator (ex:
using PYTHONMALLOC env var). _PyGILState_Reinit() and
_PyInterpreterState_Enable() now use the default RAW memory allocator to
allocate a new interpreters mutex on fork.

@item 
bpo-17288@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17288}: Prevent jumps from ‘return’ and ‘exception’ trace events.

@item 
bpo-32836@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32836}: Don’t use temporary variables in cases of list/dict/set
comprehensions
@end itemize

@node Library<167>,Documentation<60>,Core and Builtins<163>,Python 3 7 0 beta 3
@anchor{whatsnew/changelog id786}@anchor{1e55}
@subsubsection Library



@itemize -

@item 
bpo-33141@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33141}: Have Field objects pass through __set_name__ to their default
values, if they have their own __set_name__.

@item 
bpo-33096@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33096}: Allow ttk.Treeview.insert to insert iid that has a false
boolean value. Note iid=0 and iid=False would be same. Patch by Garvit
Khatri.

@item 
bpo-32873@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32873}: Treat type variables and special typing forms as immutable by
copy and pickle.  This fixes several minor issues and inconsistencies, and
improves backwards compatibility with Python 3.6.

@item 
bpo-33134@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33134}: When computing dataclass’s __hash__, use the lookup table to
contain the function which returns the __hash__ value.  This is an
improvement over looking up a string, and then testing that string to see
what to do.

@item 
bpo-33127@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33127}: The ssl module now compiles with LibreSSL 2.7.1.

@item 
bpo-32505@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32505}: Raise TypeError if a member variable of a dataclass is of type
Field, but doesn’t have a type annotation.

@item 
bpo-33078@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33078}: Fix the failure on OSX caused by the tests relying on
sem_getvalue

@item 
bpo-33116@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33116}: Add ‘Field’ to dataclasses.__all__.

@item 
bpo-32896@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32896}: Fix an error where subclassing a dataclass with a field that
uses a default_factory would generate an incorrect class.

@item 
bpo-33100@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33100}: Dataclasses: If a field has a default value that’s a
MemberDescriptorType, then it’s from that field being in __slots__, not an
actual default value.

@item 
bpo-32953@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32953}: If a non-dataclass inherits from a frozen dataclass, allow
attributes to be added to the derived class.  Only attributes from the
frozen dataclass cannot be assigned to.  Require all dataclasses in a
hierarchy to be either all frozen or all non-frozen.

@item 
bpo-33061@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33061}: Add missing @code{NoReturn} to @code{__all__} in typing.py

@item 
bpo-33078@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33078}: Fix the size handling in multiprocessing.Queue when a pickling
error occurs.

@item 
bpo-33064@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33064}: lib2to3 now properly supports trailing commas after @code{*args}
and @code{**kwargs} in function signatures.

@item 
bpo-33056@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33056}: FIX properly close leaking fds in
concurrent.futures.ProcessPoolExecutor.

@item 
bpo-33021@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33021}: Release the GIL during fstat() calls, avoiding hang of all
threads when calling mmap.mmap(), os.urandom(), and random.seed().  Patch
by Nir Soffer.

@item 
bpo-31804@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31804}: Avoid failing in multiprocessing.Process if the standard
streams are closed or None at exit.

@item 
bpo-33037@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33037}: Skip sending/receiving data after SSL transport closing.

@item 
bpo-27683@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27683}: Fix a regression in @ref{84,,ipaddress} that result of
@code{hosts()} is empty when the network is constructed by a tuple
containing an integer mask and only 1 bit left for addresses.

@item 
bpo-32999@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32999}: Fix C implementation of @code{ABC.__subclasscheck__(cls,
subclass)} crashed when @code{subclass} is not a type object.

@item 
bpo-33009@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33009}: Fix inspect.signature() for single-parameter partialmethods.

@item 
bpo-32969@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32969}: Expose several missing constants in zlib and fix corresponding
documentation.

@item 
bpo-32056@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32056}: Improved exceptions raised for invalid number of channels and
sample width when read an audio file in modules @code{aifc}, @ref{119,,wave}
and @code{sunau}.

@item 
bpo-32844@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32844}: Fix wrong redirection of a low descriptor (0 or 1) to stderr in
subprocess if another low descriptor is closed.

@item 
bpo-32857@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32857}: In @ref{f6,,tkinter}, @code{after_cancel(None)} now raises a
@ref{2ec,,ValueError} instead of canceling the first scheduled function.
Patch by Cheryl Sabella.

@item 
bpo-31639@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31639}: http.server now exposes a ThreadedHTTPServer class and uses it
when the module is run with @code{-m} to cope with web browsers pre-opening
sockets.

@item 
bpo-27645@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27645}: @ref{54c,,sqlite3.Connection} now exposes a
@ref{d72,,backup} method, if the underlying SQLite
library is at version 3.6.11 or higher.  Patch by Lele Gaifax.
@end itemize

@node Documentation<60>,Tests<58>,Library<167>,Python 3 7 0 beta 3
@anchor{whatsnew/changelog id787}@anchor{1e56}
@subsubsection Documentation



@itemize -

@item 
bpo-33126@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33126}: Document PyBuffer_ToContiguous().

@item 
bpo-27212@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27212}: Modify documentation for the @code{islice()} recipe to consume
initial values up to the start index.

@item 
bpo-28247@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28247}: Update @ref{136,,zipapp} documentation to describe how to make
standalone applications.

@item 
bpo-18802@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18802}: Documentation changes for ipaddress.  Patch by Jon Foster and
Berker Peksag.

@item 
bpo-27428@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27428}: Update documentation to clarify that @code{WindowsRegistryFinder}
implements @code{MetaPathFinder}. (Patch by Himanshu Lakhara)
@end itemize

@node Tests<58>,Build<66>,Documentation<60>,Python 3 7 0 beta 3
@anchor{whatsnew/changelog id788}@anchor{1e57}
@subsubsection Tests



@itemize -

@item 
bpo-32872@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32872}: Avoid regrtest compatibility issue with namespace packages.

@item 
bpo-32517@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32517}: Fix failing @code{test_asyncio} on macOS 10.12.2+ due to transport
of @code{KqueueSelector} loop was not being closed.

@item 
bpo-19417@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19417}: Add test_bdb.py.
@end itemize

@node Build<66>,Windows<58>,Tests<58>,Python 3 7 0 beta 3
@anchor{whatsnew/changelog id789}@anchor{1e58}
@subsubsection Build



@itemize -

@item 
bpo-33163@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33163}: Upgrade pip to 9.0.3 and setuptools to v39.0.1.
@end itemize

@node Windows<58>,macOS<45>,Build<66>,Python 3 7 0 beta 3
@anchor{whatsnew/changelog id790}@anchor{1e59}
@subsubsection Windows



@itemize -

@item 
bpo-33016@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33016}: Fix potential use of uninitialized memory in
nt._getfinalpathname

@item 
bpo-32903@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32903}: Fix a memory leak in os.chdir() on Windows if the current
directory is set to a UNC path.
@end itemize

@node macOS<45>,IDLE<41>,Windows<58>,Python 3 7 0 beta 3
@anchor{whatsnew/changelog id791}@anchor{1e5a}
@subsubsection macOS



@itemize -

@item 
bpo-32726@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32726}: Build and link with private copy of Tcl/Tk 8.6 for the macOS
10.6+ installer. The 10.9+ installer variant already does this.  This
means that the Python 3.7 provided by the python.org macOS installers no
longer need or use any external versions of Tcl/Tk, either system-provided
or user-installed, such as ActiveTcl.
@end itemize

@node IDLE<41>,Tools/Demos<39>,macOS<45>,Python 3 7 0 beta 3
@anchor{whatsnew/changelog id792}@anchor{1e5b}
@subsubsection IDLE



@itemize -

@item 
bpo-32984@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32984}: Set @code{__file__} while running a startup file.  Like Python,
IDLE optionally runs one startup file in the Shell window before
presenting the first interactive input prompt.  For IDLE, @code{-s} runs a
file named in environmental variable  
@geindex IDLESTARTUP
@geindex 환경 변수; IDLESTARTUP
@code{IDLESTARTUP} or
@geindex PYTHONSTARTUP
@geindex 환경 변수; PYTHONSTARTUP
@ref{1b8,,PYTHONSTARTUP}; @code{-r file} runs @code{file}.  Python sets
@code{__file__} to the startup file name before running the file and unsets
it before the first prompt.  IDLE now does the same when run normally,
without the @code{-n} option.

@item 
bpo-32940@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32940}: Simplify and rename StringTranslatePseudoMapping in pyparse.
@end itemize

@node Tools/Demos<39>,C API<59>,IDLE<41>,Python 3 7 0 beta 3
@anchor{whatsnew/changelog id793}@anchor{1e5c}
@subsubsection Tools/Demos



@itemize -

@item 
bpo-32885@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32885}: Add an @code{-n} flag for @code{Tools/scripts/pathfix.py} to disable
automatic backup creation (files with @code{~} suffix).
@end itemize

@node C API<59>,,Tools/Demos<39>,Python 3 7 0 beta 3
@anchor{whatsnew/changelog id794}@anchor{1e5d}
@subsubsection C API



@itemize -

@item 
bpo-33042@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33042}: Embedding applications may once again call
PySys_ResetWarnOptions, PySys_AddWarnOption, and PySys_AddXOption prior to
calling Py_Initialize.

@item 
bpo-32374@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32374}: Document that m_traverse for multi-phase initialized modules
can be called with m_state=NULL, and add a sanity check
@end itemize

@node Python 3 7 0 beta 2,Python 3 7 0 beta 1,Python 3 7 0 beta 3,Changelog
@anchor{whatsnew/changelog python-3-7-0-beta-2}@anchor{1e5e}
@subsection Python 3.7.0 beta 2


`Release date: 2018-02-27'

@menu
* Security: Security<49>. 
* Core and Builtins: Core and Builtins<164>. 
* Library: Library<168>. 
* Documentation: Documentation<61>. 
* Tests: Tests<59>. 
* Build: Build<67>. 
* Windows: Windows<59>. 
* macOS: macOS<46>. 
* IDLE: IDLE<42>. 
* Tools/Demos: Tools/Demos<40>. 

@end menu

@node Security<49>,Core and Builtins<164>,,Python 3 7 0 beta 2
@anchor{whatsnew/changelog id795}@anchor{1e5f}
@subsubsection Security



@itemize -

@item 
bpo-28414@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28414}: The ssl module now allows users to perform their own IDN
en/decoding when using SNI.
@end itemize

@node Core and Builtins<164>,Library<168>,Security<49>,Python 3 7 0 beta 2
@anchor{whatsnew/changelog id796}@anchor{1e60}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-32889@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32889}: Update Valgrind suppression list to account for the rename of
@code{Py_ADDRESS_IN_RANG} to @code{address_in_range}.

@item 
bpo-31356@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31356}: Remove the new API added in bpo-31356@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31356} (gc.ensure_disabled()
context manager).

@item 
bpo-32305@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32305}: For namespace packages, ensure that both @code{__file__} and
@code{__spec__.origin} are set to None.

@item 
bpo-32303@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32303}: Make sure @code{__spec__.loader} matches @code{__loader__} for
namespace packages.

@item 
bpo-32711@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32711}: Fix the warning messages for Python/ast_unparse.c. Patch by
Stéphane Wirtel

@item 
bpo-32583@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32583}: Fix possible crashing in builtin Unicode decoders caused by
write out-of-bound errors when using customized decode error handlers.
@end itemize

@node Library<168>,Documentation<61>,Core and Builtins<164>,Python 3 7 0 beta 2
@anchor{whatsnew/changelog id797}@anchor{1e61}
@subsubsection Library



@itemize -

@item 
bpo-32960@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32960}: For dataclasses, disallow inheriting frozen from non-frozen
classes, and also disallow inheriting non-frozen from frozen classes. This
restriction will be relaxed at a future date.

@item 
bpo-32713@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32713}: Fixed tarfile.itn handling of out-of-bounds float values. Patch
by Joffrey Fuhrer.

@item 
bpo-32951@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32951}: Direct instantiation of SSLSocket and SSLObject objects is now
prohibited. The constructors were never documented, tested, or designed as
public constructors. Users were suppose to use ssl.wrap_socket() or
SSLContext.

@item 
bpo-32929@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32929}: Remove the tri-state parameter “hash”, and add the boolean
“unsafe_hash”. If unsafe_hash is True, add a __hash__ function, but if a
__hash__ exists, raise TypeError.  If unsafe_hash is False, add a __hash__
based on the values of eq= and frozen=.  The unsafe_hash=False behavior is
the same as the old hash=None behavior.  unsafe_hash=False is the default,
just as hash=None used to be.

@item 
bpo-32947@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32947}: Add OP_ENABLE_MIDDLEBOX_COMPAT and test workaround for TLSv1.3
for future compatibility with OpenSSL 1.1.1.

@item 
bpo-30622@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30622}: The ssl module now detects missing NPN support in LibreSSL.

@item 
bpo-32922@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32922}: dbm.open() now encodes filename with the filesystem encoding
rather than default encoding.

@item 
bpo-32859@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32859}: In @code{os.dup2}, don’t check every call whether the @code{dup3}
syscall exists or not.

@item 
bpo-32556@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32556}: nt._getfinalpathname, nt._getvolumepathname and
nt._getdiskusage now correctly convert from bytes.

@item 
bpo-25988@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25988}: Emit a @ref{1a3,,DeprecationWarning} when using or importing an ABC
directly from @ref{1e,,collections} rather than from @ref{1f,,collections.abc}.

@item 
bpo-21060@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21060}: Rewrite confusing message from setup.py upload from “No dist
file created in earlier command” to the more helpful “Must create and
upload files in one command”.

@item 
bpo-32852@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32852}: Make sure sys.argv remains as a list when running trace.

@item 
bpo-31333@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31333}: @code{_abc} module is added.  It is a speedup module with C
implementations for various functions and methods in @code{abc}.  Creating an
ABC subclass and calling @code{isinstance} or @code{issubclass} with an ABC
subclass are up to 1.5x faster. In addition, this makes Python start-up up
to 10% faster. Note that the new implementation hides internal registry
and caches, previously accessible via private attributes
@code{_abc_registry}, @code{_abc_cache}, and @code{_abc_negative_cache}.  There are
three debugging helper methods that can be used instead
@code{_dump_registry}, @code{_abc_registry_clear}, and @code{_abc_caches_clear}.

@item 
bpo-32841@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32841}: Fixed @code{asyncio.Condition} issue which silently ignored
cancellation after notifying and cancelling a conditional lock. Patch by
Bar Harel.

@item 
bpo-32819@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32819}: ssl.match_hostname() has been simplified and no longer depends
on re and ipaddress module for wildcard and IP addresses. Error reporting
for invalid wildcards has been improved.

@item 
bpo-32394@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32394}: socket: Remove
TCP_FASTOPEN,TCP_KEEPCNT,TCP_KEEPIDLE,TCP_KEEPINTVL flags on older version
Windows during run-time.

@item 
bpo-31787@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31787}: Fixed refleaks of @code{__init__()} methods in various modules.
(Contributed by Oren Milman)

@item 
bpo-30157@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30157}: Fixed guessing quote and delimiter in csv.Sniffer.sniff() when
only the last field is quoted.  Patch by Jake Davis.

@item 
bpo-32792@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32792}: collections.ChainMap() preserves the order of the underlying
mappings.

@item 
bpo-32775@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32775}: @ref{1851,,fnmatch.translate()} no longer produces patterns which
contain set operations. Sets starting with ‘[’ or containing ‘–’, ‘&&’,
‘~~’ or ‘||’ will be interpreted differently in regular expressions in
future versions. Currently they emit warnings. fnmatch.translate() now
avoids producing patterns containing such sets by accident.

@item 
bpo-32622@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32622}: Implement native fast sendfile for Windows proactor event loop.

@item 
bpo-32777@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32777}: Fix a rare but potential pre-exec child process deadlock in
subprocess on POSIX systems when marking file descriptors inheritable on
exec in the child process.  This bug appears to have been introduced in
3.4.

@item 
bpo-32647@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32647}: The ctypes module used to depend on indirect linking for
dlopen. The shared extension is now explicitly linked against libdl on
platforms with dl.

@item 
bpo-32741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32741}: Implement @code{asyncio.TimerHandle.when()} method.

@item 
bpo-32691@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32691}: Use mod_spec.parent when running modules with pdb

@item 
bpo-32734@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32734}: Fixed @code{asyncio.Lock()} safety issue which allowed acquiring
and locking the same lock multiple times, without it being free. Patch by
Bar Harel.

@item 
bpo-32727@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32727}: Do not include name field in SMTP envelope from address. Patch
by Stéphane Wirtel

@item 
bpo-31453@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31453}: Add TLSVersion constants and SSLContext.maximum_version /
minimum_version attributes. The new API wraps OpenSSL 1.1
@indicateurl{https://web.archive.org/web/20180309043602/https://www.openssl.org/docs/man1.1.0/ssl/SSL_CTX_set_min_proto_version.html}
feature.

@item 
bpo-24334@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24334}: Internal implementation details of ssl module were cleaned up.
The SSLSocket has one less layer of indirection. Owner and session
information are now handled by the SSLSocket and SSLObject constructor.
Channel binding implementation has been simplified.

@item 
bpo-31848@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31848}: Fix the error handling in Aifc_read.initfp() when the SSND
chunk is not found. Patch by Zackery Spytz.

@item 
bpo-32585@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32585}: Add Ttk spinbox widget to @ref{ff,,tkinter.ttk}.  Patch by Alan D
Moore.

@item 
bpo-32221@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32221}: Various functions returning tuple containing IPv6 addresses now
omit @code{%scope} part since the same information is already encoded in
`scopeid' tuple item. Especially this speeds up @code{socket.recvfrom()}
when it receives multicast packet since useless resolving of network
interface name is omitted.

@item 
bpo-30693@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30693}: The TarFile class now recurses directories in a reproducible
way.

@item 
bpo-30693@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30693}: The ZipFile class now recurses directories in a reproducible
way.
@end itemize

@node Documentation<61>,Tests<59>,Library<168>,Python 3 7 0 beta 2
@anchor{whatsnew/changelog id798}@anchor{1e62}
@subsubsection Documentation



@itemize -

@item 
bpo-28124@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28124}: The ssl module function ssl.wrap_socket() has been
de-emphasized and deprecated in favor of the more secure and efficient
SSLContext.wrap_socket() method.

@item 
bpo-17232@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17232}: Clarify docs for -O and -OO.  Patch by Terry Reedy.

@item 
bpo-32436@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32436}: Add documentation for the contextvars module (PEP 567).

@item 
bpo-32800@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32800}: Update link to w3c doc for xml default namespaces.

@item 
bpo-11015@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11015}: Update @ref{ea,,test.support} documentation.

@item 
bpo-8722@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8722}: Document @code{__getattr__()} behavior when property @code{get()}
method raises @ref{5ee,,AttributeError}.

@item 
bpo-32614@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32614}: Modify RE examples in documentation to use raw strings to
prevent @ref{1a3,,DeprecationWarning} and add text to REGEX HOWTO to highlight
the deprecation.

@item 
bpo-31972@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31972}: Improve docstrings for @code{pathlib.PurePath} subclasses.
@end itemize

@node Tests<59>,Build<67>,Documentation<61>,Python 3 7 0 beta 2
@anchor{whatsnew/changelog id799}@anchor{1e63}
@subsubsection Tests



@itemize -

@item 
bpo-31809@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31809}: Add tests to verify connection with secp ECDH curves.
@end itemize

@node Build<67>,Windows<59>,Tests<59>,Python 3 7 0 beta 2
@anchor{whatsnew/changelog id800}@anchor{1e64}
@subsubsection Build



@itemize -

@item 
bpo-32898@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32898}: Fix the python debug build when using COUNT_ALLOCS.
@end itemize

@node Windows<59>,macOS<46>,Build<67>,Python 3 7 0 beta 2
@anchor{whatsnew/changelog id801}@anchor{1e65}
@subsubsection Windows



@itemize -

@item 
bpo-32901@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32901}: Update Tcl and Tk versions to 8.6.8

@item 
bpo-31966@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31966}: Fixed WindowsConsoleIO.write() for writing empty data.

@item 
bpo-32409@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32409}: Ensures activate.bat can handle Unicode contents.

@item 
bpo-32457@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32457}: Improves handling of denormalized executable path when
launching Python.

@item 
bpo-32370@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32370}: Use the correct encoding for ipconfig output in the uuid
module. Patch by Segev Finer.

@item 
bpo-29248@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29248}: Fix @ref{b19,,os.readlink()} on Windows, which was mistakenly
treating the @code{PrintNameOffset} field of the reparse data buffer as a
number of characters instead of bytes. Patch by Craig Holmquist and SSE4.
@end itemize

@node macOS<46>,IDLE<42>,Windows<59>,Python 3 7 0 beta 2
@anchor{whatsnew/changelog id802}@anchor{1e66}
@subsubsection macOS



@itemize -

@item 
bpo-32901@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32901}: Update macOS 10.9+ installer to Tcl/Tk 8.6.8.
@end itemize

@node IDLE<42>,Tools/Demos<40>,macOS<46>,Python 3 7 0 beta 2
@anchor{whatsnew/changelog id803}@anchor{1e67}
@subsubsection IDLE



@itemize -

@item 
bpo-32916@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32916}: Change @code{str} to @code{code} in pyparse.

@item 
bpo-32905@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32905}: Remove unused code in pyparse module.

@item 
bpo-32874@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32874}: Add tests for pyparse.

@item 
bpo-32837@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32837}: Using the system and place-dependent default encoding for
open() is a bad idea for IDLE’s system and location-independent files.

@item 
bpo-32826@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32826}: Add “encoding=utf-8” to open() in IDLE’s test_help_about. GUI
test test_file_buttons() only looks at initial ascii-only lines, but
failed on systems where open() defaults to ‘ascii’ because readline()
internally reads and decodes far enough ahead to encounter a non-ascii
character in CREDITS.txt.

@item 
bpo-32765@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32765}: Update configdialog General tab docstring to add new widgets to
the widget list.
@end itemize

@node Tools/Demos<40>,,IDLE<42>,Python 3 7 0 beta 2
@anchor{whatsnew/changelog id804}@anchor{1e68}
@subsubsection Tools/Demos



@itemize -

@item 
bpo-32222@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32222}: Fix pygettext not extracting docstrings for functions with type
annotated arguments. Patch by Toby Harradine.
@end itemize

@node Python 3 7 0 beta 1,Python 3 7 0 alpha 4,Python 3 7 0 beta 2,Changelog
@anchor{whatsnew/changelog python-3-7-0-beta-1}@anchor{1e69}
@subsection Python 3.7.0 beta 1


`Release date: 2018-01-30'

@menu
* Core and Builtins: Core and Builtins<165>. 
* Library: Library<169>. 
* Documentation: Documentation<62>. 
* Tests: Tests<60>. 
* Build: Build<68>. 
* Windows: Windows<60>. 
* macOS: macOS<47>. 
* C API: C API<60>. 

@end menu

@node Core and Builtins<165>,Library<169>,,Python 3 7 0 beta 1
@anchor{whatsnew/changelog id805}@anchor{1e6a}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-32703@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32703}: Fix coroutine’s ResourceWarning when there’s an active error
set when it’s being finalized.

@item 
bpo-32650@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32650}: Pdb and other debuggers dependent on bdb.py will correctly step
over (next command) native coroutines. Patch by Pablo Galindo.

@item 
bpo-28685@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28685}: Optimize list.sort() and sorted() by using type specialized
comparisons when possible.

@item 
bpo-32685@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32685}: Improve suggestion when the Python 2 form of print statement is
either present on the same line as the header of a compound statement or
else terminated by a semi-colon instead of a newline. Patch by Nitish
Chandra.

@item 
bpo-32697@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32697}: Python now explicitly preserves the definition order of
keyword-only parameters.  It’s always preserved their order, but this
behavior was never guaranteed before; this behavior is now guaranteed and
tested.

@item 
bpo-32690@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32690}: The locals() dictionary now displays in the lexical order that
variables were defined.  Previously, the order was reversed.

@item 
bpo-32677@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32677}: Add @code{.isascii()} method to @code{str}, @code{bytes} and
@code{bytearray}. It can be used to test that string contains only ASCII
characters.

@item 
bpo-32670@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32670}: Enforce 
@geindex Python 향상 제안; PEP 479
PEP 479@footnote{https://peps.python.org/pep-0479/} for all code. This means that manually
raising a StopIteration exception from a generator is prohibited for all
code, regardless of whether ‘from __future__ import generator_stop’ was
used or not.

@item 
bpo-32591@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32591}: Added built-in support for tracking the origin of coroutine
objects; see sys.set_coroutine_origin_tracking_depth and
CoroutineType.cr_origin. This replaces the asyncio debug mode’s use of
coroutine wrapping for native coroutine objects.

@item 
bpo-31368@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31368}: Expose preadv and pwritev system calls in the os module. Patch
by Pablo Galindo

@item 
bpo-32544@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32544}: @code{hasattr(obj, name)} and @code{getattr(obj, name, default)} are
about 4 times faster than before when @code{name} is not found and @code{obj}
doesn’t override @code{__getattr__} or @code{__getattribute__}.

@item 
bpo-26163@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26163}: Improved frozenset() hash to create more distinct hash values
when faced with datasets containing many similar values.

@item 
bpo-32550@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32550}: Remove the STORE_ANNOTATION bytecode.

@item 
bpo-20104@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20104}: Expose posix_spawn as a low level API in the os module.
(removed before 3.7.0rc1)

@item 
bpo-24340@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24340}: Fixed estimation of the code stack size.

@item 
bpo-32436@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32436}: Implement 
@geindex Python 향상 제안; PEP 567
PEP 567@footnote{https://peps.python.org/pep-0567/} Context Variables.

@item 
bpo-18533@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18533}: @code{repr()} on a dict containing its own @code{values()} or
@code{items()} no longer raises @code{RecursionError}; OrderedDict similarly.
Instead, use @code{...}, as for other recursive structures.  Patch by Ben
North.

@item 
bpo-20891@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20891}: Py_Initialize() now creates the GIL. The GIL is no longer
created “on demand” to fix a race condition when PyGILState_Ensure() is
called in a non-Python thread.

@item 
bpo-32028@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32028}: Leading whitespace is now correctly ignored when generating
suggestions for converting Py2 print statements to Py3 builtin print
function calls. Patch by Sanyam Khurana.

@item 
bpo-31179@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31179}: Make dict.copy() up to 5.5 times faster.

@item 
bpo-31113@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31113}: Get rid of recursion in the compiler for normal control flow.
@end itemize

@node Library<169>,Documentation<62>,Core and Builtins<165>,Python 3 7 0 beta 1
@anchor{whatsnew/changelog id806}@anchor{1e6b}
@subsubsection Library



@itemize -

@item 
bpo-25988@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25988}: Deprecate exposing the contents of collections.abc in the
regular collections module.

@item 
bpo-31429@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31429}: The default cipher suite selection of the ssl module now uses a
blacklist approach rather than a hard-coded whitelist. Python no longer
re-enables ciphers that have been blocked by OpenSSL security update.
Default cipher suite selection can be configured on compile time.

@item 
bpo-30306@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30306}: contextlib.contextmanager now releases the arguments passed to
the underlying generator as soon as the context manager is entered.
Previously it would keep them alive for as long as the context manager was
alive, even when not being used as a function decorator. Patch by Martin
Teichmann.

@item 
bpo-21417@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21417}: Added support for setting the compression level for
zipfile.ZipFile.

@item 
bpo-32251@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32251}: Implement asyncio.BufferedProtocol (provisional API).

@item 
bpo-32513@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32513}: In dataclasses, allow easier overriding of dunder methods
without specifying decorator parameters.

@item 
bpo-32660@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32660}: @ref{e7,,termios} makes available @code{FIONREAD}, @code{FIONCLEX},
@code{FIOCLEX}, @code{FIOASYNC} and @code{FIONBIO} also under Solaris/derivatives.

@item 
bpo-27931@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27931}: Fix email address header parsing error when the username is an
empty quoted string. Patch by Xiang Zhang.

@item 
bpo-32659@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32659}: Under Solaris and derivatives, @ref{16c6,,os.stat_result} provides
a st_fstype attribute.

@item 
bpo-32662@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32662}: Implement Server.start_serving(), Server.serve_forever(), and
Server.is_serving() methods.  Add ‘start_serving’ keyword parameter to
loop.create_server() and loop.create_unix_server().

@item 
bpo-32391@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32391}: Implement @ref{d01,,asyncio.StreamWriter.wait_closed()} and
@ref{d02,,asyncio.StreamWriter.is_closing()} methods

@item 
bpo-32643@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32643}: Make Task._step, Task._wakeup and Future._schedule_callbacks
methods private.

@item 
bpo-32630@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32630}: Refactor decimal module to use contextvars to store decimal
context.

@item 
bpo-32622@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32622}: Add @code{asyncio.AbstractEventLoop.sendfile()} method.

@item 
bpo-32304@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32304}: distutils’ upload command no longer corrupts tar files ending
with a CR byte, and no longer tries to convert CR to CRLF in any of the
upload text fields.

@item 
bpo-32502@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32502}: uuid.uuid1 no longer raises an exception if a 64-bit hardware
address is encountered.

@item 
bpo-32596@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32596}: @code{concurrent.futures} imports @code{ThreadPoolExecutor} and
@code{ProcessPoolExecutor} lazily (using 
@geindex Python 향상 제안; PEP 562
PEP 562@footnote{https://peps.python.org/pep-0562/}). It makes @code{import
asyncio} about 15% faster because asyncio uses only
@code{ThreadPoolExecutor} by default.

@item 
bpo-31801@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31801}: Add @code{_ignore_} to @code{Enum} so temporary variables can be used
during class construction without being turned into members.

@item 
bpo-32576@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32576}: Use queue.SimpleQueue() in places where it can be invoked from
a weakref callback.

@item 
bpo-32574@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32574}: Fix memory leak in asyncio.Queue, when the queue has limited
size and it is full, the cancellation of queue.put() can cause a memory
leak. Patch by: José Melero.

@item 
bpo-32521@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32521}: The nis module is now compatible with new libnsl and headers
location.

@item 
bpo-32467@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32467}: collections.abc.ValuesView now inherits from
collections.abc.Collection.

@item 
bpo-32473@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32473}: Improve ABCMeta._dump_registry() output readability

@item 
bpo-32102@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32102}: New argument @code{capture_output} for subprocess.run

@item 
bpo-32521@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32521}: glibc has removed Sun RPC. Use replacement libtirpc headers and
library in nis module.

@item 
bpo-32493@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32493}: UUID module fixes build for FreeBSD/OpenBSD

@item 
bpo-32503@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32503}: Pickling with protocol 4 no longer creates too small frames.

@item 
bpo-29237@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29237}: Create enum for pstats sorting options

@item 
bpo-32454@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32454}: Add close(fd) function to the socket module.

@item 
bpo-25942@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25942}: The subprocess module is now more graceful when handling a
Ctrl-C KeyboardInterrupt during subprocess.call, subprocess.run, or a
Popen context manager.  It now waits a short amount of time for the child
(presumed to have also gotten the SIGINT) to exit, before continuing the
KeyboardInterrupt exception handling.  This still includes a SIGKILL in
the call() and run() APIs, but at least the child had a chance first.

@item 
bpo-32433@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32433}: The hmac module now has hmac.digest(), which provides an
optimized HMAC digest.

@item 
bpo-28134@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28134}: Sockets now auto-detect family, type and protocol from file
descriptor by default.

@item 
bpo-32404@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32404}: Fix bug where @ref{711,,datetime.datetime.fromtimestamp()} did not
call __new__ in @ref{4e2,,datetime.datetime} subclasses.

@item 
bpo-32403@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32403}: Improved speed of @ref{1fa,,datetime.date} and
@ref{4e2,,datetime.datetime} alternate constructors.

@item 
bpo-32228@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32228}: Ensure that @code{truncate()} preserves the file position (as
reported by @code{tell()}) after writes longer than the buffer size.

@item 
bpo-32410@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32410}: Implement @code{loop.sock_sendfile} for asyncio event loop.

@item 
bpo-22908@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22908}: Added seek and tell to the ZipExtFile class. This only works if
the file object used to open the zipfile is seekable.

@item 
bpo-32373@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32373}: Add socket.getblocking() method.

@item 
bpo-32248@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32248}: Add @ref{7f,,importlib.resources} and
@code{importlib.abc.ResourceReader} as the unified API for reading
resources contained within packages.  Loaders wishing to support resource
reading must implement the @code{get_resource_reader()} method.  File-based
and zipimport-based loaders both implement these APIs.
@ref{de1,,importlib.abc.ResourceLoader} is deprecated in favor of these new
APIs.

@item 
bpo-32320@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32320}: collections.namedtuple() now supports default values.

@item 
bpo-29302@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29302}: Add contextlib.AsyncExitStack. Patch by Alexander Mohr and Ilya
Kulakov.

@item 
bpo-31961@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31961}: `Removed in Python 3.7.0b2.' The `args' argument of
subprocess.Popen can now be a @ref{5a0,,path-like object}. If `args' is given
as a sequence, it’s first element can now be a path-like object as
well.

@item 
bpo-31900@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31900}: The @ref{df7,,locale.localeconv()} function now sets temporarily the
@code{LC_CTYPE} locale to the @code{LC_NUMERIC} locale to decode
@code{decimal_point} and @code{thousands_sep} byte strings if they are non-ASCII
or longer than 1 byte, and the @code{LC_NUMERIC} locale is different than the
@code{LC_CTYPE} locale. This temporary change affects other threads. Same
change for the @ref{832,,str.format()} method when formatting a number
(@ref{19b,,int}, @ref{196,,float}, @code{float} and subclasses) with the
@code{n} type (ex: @code{'@{:n@}'.format(1234)}).

@item 
bpo-31853@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31853}: Use super().method instead of socket.method in SSLSocket.  They
were there most likely for legacy reasons.

@item 
bpo-31399@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31399}: The ssl module now uses OpenSSL’s X509_VERIFY_PARAM_set1_host()
and X509_VERIFY_PARAM_set1_ip() API to verify hostname and IP addresses.
Subject common name fallback can be disabled with
SSLContext.hostname_checks_common_name.

@item 
bpo-14976@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14976}: Add a queue.SimpleQueue class, an unbounded FIFO queue with a
reentrant C implementation of put().
@end itemize

@node Documentation<62>,Tests<60>,Library<169>,Python 3 7 0 beta 1
@anchor{whatsnew/changelog id807}@anchor{1e6c}
@subsubsection Documentation



@itemize -

@item 
bpo-32724@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32724}: Add references to some commands in the documentation of Pdb.
Patch by Stéphane Wirtel

@item 
bpo-32649@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32649}: Complete the C API documentation, profiling and tracing part
with the newly added per-opcode events.

@item 
bpo-17799@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17799}: Explain real behaviour of sys.settrace and sys.setprofile and
their C-API counterparts regarding which type of events are received in
each function. Patch by Pablo Galindo Salgado.
@end itemize

@node Tests<60>,Build<68>,Documentation<62>,Python 3 7 0 beta 1
@anchor{whatsnew/changelog id808}@anchor{1e6d}
@subsubsection Tests



@itemize -

@item 
bpo-32721@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32721}: Fix test_hashlib to not fail if the _md5 module is not built.

@item 
bpo-28414@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28414}: Add test cases for IDNA 2003 and 2008 host names. IDNA 2003
internationalized host names are working since bpo-31399@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31399} has landed. IDNA
2008 are still broken.

@item 
bpo-32604@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32604}: Add a new “_xxsubinterpreters” extension module that exposes
the existing subinterpreter C-API and a new cross-interpreter data sharing
mechanism. The module is primarily intended for more thorough testing of
the existing subinterpreter support. Note that the _xxsubinterpreters
module has been removed in 3.7.0rc1.

@item 
bpo-32602@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32602}: Add test certs and test for ECDSA cert and EC/RSA dual mode.

@item 
bpo-32549@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32549}: On Travis CI, Python now Compiles and uses a local copy of
OpenSSL 1.1.0g for testing.
@end itemize

@node Build<68>,Windows<60>,Tests<60>,Python 3 7 0 beta 1
@anchor{whatsnew/changelog id809}@anchor{1e6e}
@subsubsection Build



@itemize -

@item 
bpo-32635@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32635}: Fix segfault of the crypt module when libxcrypt is provided
instead of libcrypt at the system.

@item 
bpo-32598@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32598}: Use autoconf to detect OpenSSL libs, headers and supported
features. The ax_check_openssl M4 macro uses pkg-config to locate OpenSSL
and falls back to manual search.

@item 
bpo-32593@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32593}: Drop support of FreeBSD 9 and older.

@item 
bpo-29708@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29708}: If the 
@geindex SOURCE_DATE_EPOCH
@geindex 환경 변수; SOURCE_DATE_EPOCH
@code{SOURCE_DATE_EPOCH} environment variable is set,
@ref{b8,,py_compile} will always create hash-based @code{.pyc} files.
@end itemize

@node Windows<60>,macOS<47>,Build<68>,Python 3 7 0 beta 1
@anchor{whatsnew/changelog id810}@anchor{1e6f}
@subsubsection Windows



@itemize -

@item 
bpo-32588@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32588}: Create standalone _distutils_findvs module and add missing
_queue module to installer.

@item 
bpo-29911@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29911}: Ensure separate Modify and Uninstall buttons are displayed.

@item 
bpo-32507@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32507}: Use app-local UCRT install rather than the proper update for
old versions of Windows.
@end itemize

@node macOS<47>,C API<60>,Windows<60>,Python 3 7 0 beta 1
@anchor{whatsnew/changelog id811}@anchor{1e70}
@subsubsection macOS



@itemize -

@item 
bpo-32726@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32726}: Provide an additional, more modern macOS installer variant that
supports macOS 10.9+ systems in 64-bit mode only.  Upgrade the supplied
third-party libraries to OpenSSL 1.1.0g and to SQLite 3.22.0.  The 10.9+
installer now links with and supplies its own copy of Tcl/Tk 8.6.

@item 
bpo-28440@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28440}: No longer add /Library/Python/3.x/site-packages to sys.path for
macOS framework builds to avoid future conflicts.
@end itemize

@node C API<60>,,macOS<47>,Python 3 7 0 beta 1
@anchor{whatsnew/changelog id812}@anchor{1e71}
@subsubsection C API



@itemize -

@item 
bpo-32681@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32681}: Fix uninitialized variable ‘res’ in the C implementation of
os.dup2. Patch by Stéphane Wirtel

@item 
bpo-10381@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10381}: Add C API access to the @code{datetime.timezone} constructor and
@code{datetime.timezone.UTC} singleton.
@end itemize

@node Python 3 7 0 alpha 4,Python 3 7 0 alpha 3,Python 3 7 0 beta 1,Changelog
@anchor{whatsnew/changelog python-3-7-0-alpha-4}@anchor{1e72}
@subsection Python 3.7.0 alpha 4


`Release date: 2018-01-08'

@menu
* Core and Builtins: Core and Builtins<166>. 
* Library: Library<170>. 
* Documentation: Documentation<63>. 
* Tests: Tests<61>. 
* Windows: Windows<61>. 
* Tools/Demos: Tools/Demos<41>. 
* C API: C API<61>. 

@end menu

@node Core and Builtins<166>,Library<170>,,Python 3 7 0 alpha 4
@anchor{whatsnew/changelog id813}@anchor{1e73}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-31975@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31975}: The default warning filter list now starts with a
“default::DeprecationWarning:__main__” entry, so deprecation warnings are
once again shown by default in single-file scripts and at the interactive
prompt.

@item 
bpo-32226@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32226}: @code{__class_getitem__} is now an automatic class method.

@item 
bpo-32399@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32399}: Add AIX uuid library support for RFC4122 using uuid_create() in
libc.a

@item 
bpo-32390@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32390}: Fix the compilation failure on AIX after the f_fsid field has
been added to the object returned by os.statvfs() (bpo-32143@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32143}). Original
patch by Michael Felt.

@item 
bpo-32379@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32379}: Make MRO computation faster when a class inherits from a single
base.

@item 
bpo-32259@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32259}: The error message of a TypeError raised when unpack
non-iterable is now more specific.

@item 
bpo-27169@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27169}: The @code{__debug__} constant is now optimized out at compile
time. This fixes also bpo-22091@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22091}.

@item 
bpo-32329@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32329}: The @ref{1e74,,-R} option now turns on hash randomization when
the 
@geindex PYTHONHASHSEED
@geindex 환경 변수; PYTHONHASHSEED
@ref{127c,,PYTHONHASHSEED} environment variable is set to @code{0}.
Previously, the option was ignored. Moreover,
@code{sys.flags.hash_randomization} is now properly set to 0 when hash
randomization is turned off by @code{PYTHONHASHSEED=0}.

@item 
bpo-30416@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30416}: The optimizer is now protected from spending much time doing
complex calculations and consuming much memory for creating large
constants in constant folding. Increased limits for constants that can be
produced in constant folding.

@item 
bpo-32282@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32282}: Fix an unnecessary ifdef in the include of VersionHelpers.h in
socketmodule on Windows.

@item 
bpo-30579@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30579}: Implement TracebackType.__new__ to allow Python-level creation
of traceback objects, and make TracebackType.tb_next mutable.

@item 
bpo-32260@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32260}: Don’t byte swap the input keys to the SipHash algorithm on
big-endian platforms. This should ensure siphash gives consistent results
across platforms.

@item 
bpo-31506@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31506}: Improve the error message logic for object.__new__ and
object.__init__. Patch by Sanyam Khurana.

@item 
bpo-20361@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20361}: @code{-b} and @code{-bb} now inject @code{'default::BytesWarning'} and
@code{error::BytesWarning} entries into @code{sys.warnoptions}, ensuring that
they take precedence over any other warning filters configured via the
@code{-W} option or the @code{PYTHONWARNINGS} environment variable.

@item 
bpo-32230@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32230}: @code{-X dev} now injects a @code{'default'} entry into
sys.warnoptions, ensuring that it behaves identically to actually passing
@code{-Wdefault} at the command line.

@item 
bpo-29240@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29240}: Add a new UTF-8 mode: implementation of the 
@geindex Python 향상 제안; PEP 540
PEP 540@footnote{https://peps.python.org/pep-0540/}.

@item 
bpo-32226@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32226}: 
@geindex Python 향상 제안; PEP 560
PEP 560@footnote{https://peps.python.org/pep-0560/}: Add support for @code{__mro_entries__} and
@code{__class_getitem__}. Implemented by Ivan Levkivskyi.

@item 
bpo-32225@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32225}: 
@geindex Python 향상 제안; PEP 562
PEP 562@footnote{https://peps.python.org/pep-0562/}: Add support for module @code{__getattr__} and
@code{__dir__}. Implemented by Ivan Levkivskyi.

@item 
bpo-31901@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31901}: The @code{atexit} module now has its callback stored per
interpreter.

@item 
bpo-31650@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31650}: Implement 
@geindex Python 향상 제안; PEP 552
PEP 552@footnote{https://peps.python.org/pep-0552/} (Deterministic pycs). Python now supports
invalidating bytecode cache files bashed on a source content hash rather
than source last-modified time.

@item 
bpo-29469@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29469}: Move constant folding from bytecode layer to AST layer.
Original patch by Eugene Toder.
@end itemize

@node Library<170>,Documentation<63>,Core and Builtins<166>,Python 3 7 0 alpha 4
@anchor{whatsnew/changelog id814}@anchor{1e75}
@subsubsection Library



@itemize -

@item 
bpo-32506@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32506}: Now that dict is defined as keeping insertion order, drop
OrderedDict and just use plain dict.

@item 
bpo-32279@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32279}: Add params to dataclasses.make_dataclasses(): init, repr, eq,
order, hash, and frozen.  Pass them through to dataclass().

@item 
bpo-32278@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32278}: Make type information optional on dataclasses.make_dataclass().
If omitted, the string ‘typing.Any’ is used.

@item 
bpo-32499@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32499}: Add dataclasses.is_dataclass(obj), which returns True if obj is
a dataclass or an instance of one.

@item 
bpo-32468@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32468}: Improve frame repr() to mention filename, code name and current
line number.

@item 
bpo-23749@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23749}: asyncio: Implement loop.start_tls()

@item 
bpo-32441@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32441}: Return the new file descriptor (i.e., the second argument) from
@code{os.dup2}. Previously, @code{None} was always returned.

@item 
bpo-32422@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32422}: @code{functools.lru_cache} uses less memory (3 words for each
cached key) and takes about 1/3 time for cyclic GC.

@item 
bpo-31721@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31721}: Prevent Python crash from happening when Future._log_traceback
is set to True manually.  Now it can only be set to False, or a ValueError
is raised.

@item 
bpo-32415@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32415}: asyncio: Add Task.get_loop() and Future.get_loop()

@item 
bpo-26133@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26133}: Don’t unsubscribe signals in asyncio UNIX event loop on
interpreter shutdown.

@item 
bpo-32363@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32363}: Make asyncio.Task.set_exception() and set_result() raise
NotImplementedError. Task._step() and Future.__await__() raise proper
exceptions when they are in an invalid state, instead of raising an
AssertionError.

@item 
bpo-32357@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32357}: Optimize asyncio.iscoroutine() and loop.create_task() for
non-native coroutines (e.g. async/await compiled with Cython).
‘loop.create_task(python_coroutine)’ used to be 20% faster than
‘loop.create_task(cython_coroutine)’.  Now, the latter is as fast.

@item 
bpo-32356@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32356}: asyncio.transport.resume_reading() and pause_reading() are now
idempotent. New transport.is_reading() method is added.

@item 
bpo-32355@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32355}: Optimize asyncio.gather(); now up to 15% faster.

@item 
bpo-32351@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32351}: Use fastpath in asyncio.sleep if delay<0 (2x boost)

@item 
bpo-32348@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32348}: Optimize asyncio.Future schedule/add/remove callback.  The
optimization shows 3-6% performance improvements of async/await code.

@item 
bpo-32331@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32331}: Fix socket.settimeout() and socket.setblocking() to keep
socket.type as is. Fix socket.socket() constructor to reset any bit flags
applied to socket’s type.  This change only affects OSes that have
SOCK_NONBLOCK and/or SOCK_CLOEXEC.

@item 
bpo-32248@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32248}: Add @code{importlib.abc.ResourceReader} as an ABC for
loaders to provide a unified API for reading resources contained within
packages.  Also add @ref{7f,,importlib.resources} as the port of
@code{importlib_resources}.

@item 
bpo-32311@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32311}: Implement asyncio.create_task(coro) shortcut

@item 
bpo-32327@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32327}: Convert asyncio functions that were documented as coroutines to
coroutines. Affected functions: loop.sock_sendall, loop.sock_recv,
loop.sock_accept, loop.getaddrinfo, loop.getnameinfo.

@item 
bpo-32323@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32323}: @ref{f39,,urllib.parse.urlsplit()} does not convert zone-id (scope)
to lower case for scoped IPv6 addresses in hostnames now.

@item 
bpo-32302@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32302}: Fix bdist_wininst of distutils for CRT v142: it binary
compatible with CRT v140.

@item 
bpo-29711@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29711}: Fix @code{stop_serving} in asyncio proactor loop kill all
listening servers

@item 
bpo-32308@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32308}: @ref{5a2,,re.sub()} now replaces empty matches adjacent to a
previous non-empty match.

@item 
bpo-29970@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29970}: Abort asyncio SSLProtocol connection if handshake not complete
within 10 seconds.

@item 
bpo-32314@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32314}: Implement asyncio.run().

@item 
bpo-17852@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17852}: Revert incorrect fix based on misunderstanding of
_Py_PyAtExit() semantics.

@item 
bpo-32296@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32296}: Implement asyncio._get_running_loop() and get_event_loop() in
C. This makes them 4x faster.

@item 
bpo-32250@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32250}: Implement @code{asyncio.current_task()} and
@code{asyncio.all_tasks()}. Add helpers intended to be used by alternative
task implementations: @code{asyncio._register_task}, @code{asyncio._enter_task},
@code{asyncio._leave_task} and @code{asyncio._unregister_task}. Deprecate
@code{asyncio.Task.current_task()} and @code{asyncio.Task.all_tasks()}.

@item 
bpo-32255@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32255}: A single empty field is now always quoted when written into a
CSV file. This allows to distinguish an empty row from a row consisting of
a single empty field. Patch by Licht Takeuchi.

@item 
bpo-32277@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32277}: Raise @code{NotImplementedError} instead of @code{SystemError} on
platforms where @code{chmod(..., follow_symlinks=False)} is not supported.
Patch by Anthony Sottile.

@item 
bpo-30050@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30050}: New argument warn_on_full_buffer to signal.set_wakeup_fd lets
you control whether Python prints a warning on stderr when the wakeup fd
buffer overflows.

@item 
bpo-29137@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29137}: The @code{fpectl} library has been removed. It was never enabled
by default, never worked correctly on x86-64, and it changed the Python
ABI in ways that caused unexpected breakage of C extensions.

@item 
bpo-32273@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32273}: Move asyncio.test_utils to test.test_asyncio.

@item 
bpo-32272@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32272}: Remove asyncio.async() function.

@item 
bpo-32269@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32269}: Add asyncio.get_running_loop() function.

@item 
bpo-32265@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32265}: All class and static methods of builtin types now are correctly
classified by inspect.classify_class_attrs() and grouped in pydoc output.
Added types.ClassMethodDescriptorType for unbound class methods of builtin
types.

@item 
bpo-32253@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32253}: Deprecate @code{yield from lock}, @code{await lock}, @code{with (yield
from lock)} and @code{with await lock} for asyncio synchronization
primitives.

@item 
bpo-22589@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22589}: Changed MIME type of .bmp from ‘image/x-ms-bmp’ to ‘image/bmp’

@item 
bpo-32193@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32193}: Convert asyncio to use `async/await' syntax. Old styled @code{yield
from} is still supported too.

@item 
bpo-32206@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32206}: Add support to run modules with pdb

@item 
bpo-32227@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32227}: @code{functools.singledispatch} now supports registering
implementations using type annotations.

@item 
bpo-15873@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15873}: Added new alternate constructors
@ref{829,,datetime.datetime.fromisoformat()},
@ref{828,,datetime.time.fromisoformat()} and
@ref{827,,datetime.date.fromisoformat()} as the inverse operation of each
classes’s respective @code{isoformat} methods.

@item 
bpo-32199@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32199}: The getnode() ip getter now uses ‘ip link’ instead of ‘ip link
list’.

@item 
bpo-32143@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32143}: os.statvfs() includes the f_fsid field from statvfs(2)

@item 
bpo-26439@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26439}: Fix ctypes.util.find_library() for AIX by implementing
ctypes._aix.find_library() Patch by: Michael Felt

@item 
bpo-31993@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31993}: The pickler now uses less memory when serializing large bytes
and str objects into a file.  Pickles created with protocol 4 will require
less memory for unpickling large bytes and str objects.

@item 
bpo-27456@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27456}: Ensure TCP_NODELAY is set on Linux. Tests by Victor Stinner.

@item 
bpo-31778@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31778}: ast.literal_eval() is now more strict. Addition and subtraction
of arbitrary numbers no longer allowed.

@item 
bpo-31802@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31802}: Importing native path module (@code{posixpath}, @code{ntpath}) now
works even if the @code{os} module still is not imported.

@item 
bpo-30241@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30241}: Add contextlib.AbstractAsyncContextManager. Patch by Jelle
Zijlstra.

@item 
bpo-31699@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31699}: Fix deadlocks in
@ref{1d6,,concurrent.futures.ProcessPoolExecutor} when task arguments or
results cause pickling or unpickling errors. This should make sure that
calls to the @code{ProcessPoolExecutor} API always eventually return.

@item 
bpo-15216@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15216}: @code{TextIOWrapper.reconfigure()} supports changing `encoding',
`errors', and `newline'.
@end itemize

@node Documentation<63>,Tests<61>,Library<170>,Python 3 7 0 alpha 4
@anchor{whatsnew/changelog id815}@anchor{1e76}
@subsubsection Documentation



@itemize -

@item 
bpo-32418@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32418}: Add get_loop() method to Server and AbstractServer classes.
@end itemize

@node Tests<61>,Windows<61>,Documentation<63>,Python 3 7 0 alpha 4
@anchor{whatsnew/changelog id816}@anchor{1e77}
@subsubsection Tests



@itemize -

@item 
bpo-32252@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32252}: Fix faulthandler_suppress_crash_report() used to prevent core
dump files when testing crashes. getrlimit() returns zero on success.

@item 
bpo-32002@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32002}: Adjust C locale coercion testing for the empty locale and POSIX
locale cases to more readily adjust to platform dependent behaviour.
@end itemize

@node Windows<61>,Tools/Demos<41>,Tests<61>,Python 3 7 0 alpha 4
@anchor{whatsnew/changelog id817}@anchor{1e78}
@subsubsection Windows



@itemize -

@item 
bpo-19764@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19764}: Implement support for @code{subprocess.Popen(close_fds=True)} on
Windows. Patch by Segev Finer.
@end itemize

@node Tools/Demos<41>,C API<61>,Windows<61>,Python 3 7 0 alpha 4
@anchor{whatsnew/changelog id818}@anchor{1e79}
@subsubsection Tools/Demos



@itemize -

@item 
bpo-24960@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24960}: 2to3 and lib2to3 can now read pickled grammar files using
pkgutil.get_data() rather than probing the filesystem. This lets 2to3 and
lib2to3 work when run from a zipfile.
@end itemize

@node C API<61>,,Tools/Demos<41>,Python 3 7 0 alpha 4
@anchor{whatsnew/changelog id819}@anchor{1e7a}
@subsubsection C API



@itemize -

@item 
bpo-32030@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32030}: Py_Initialize() doesn’t reset the memory allocators to default
if the @code{PYTHONMALLOC} environment variable is not set.

@item 
bpo-29084@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29084}: Undocumented C API for OrderedDict has been excluded from the
limited C API. It was added by mistake and actually never worked in the
limited C API.

@item 
bpo-32264@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32264}: Moved the pygetopt.h header into internal/, since it has no
public APIs.

@item 
bpo-32241@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32241}: @code{Py_SetProgramName()} and @code{Py_SetPythonHome()}
now take the @code{const wchar *} arguments instead of @code{wchar *}.
@end itemize

@node Python 3 7 0 alpha 3,Python 3 7 0 alpha 2,Python 3 7 0 alpha 4,Changelog
@anchor{whatsnew/changelog python-3-7-0-alpha-3}@anchor{1e7b}
@subsection Python 3.7.0 alpha 3


`Release date: 2017-12-05'

@menu
* Core and Builtins: Core and Builtins<167>. 
* Library: Library<171>. 
* Documentation: Documentation<64>. 
* Tests: Tests<62>. 
* Build: Build<69>. 
* Windows: Windows<62>. 
* macOS: macOS<48>. 
* IDLE: IDLE<43>. 
* Tools/Demos: Tools/Demos<42>. 
* C API: C API<62>. 

@end menu

@node Core and Builtins<167>,Library<171>,,Python 3 7 0 alpha 3
@anchor{whatsnew/changelog id820}@anchor{1e7c}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-32176@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32176}: co_flags.CO_NOFREE is now always set correctly by the code
object constructor based on freevars and cellvars, rather than needing to
be set correctly by the caller. This ensures it will be cleared
automatically when additional cell references are injected into a modified
code object and function.

@item 
bpo-10544@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10544}: Yield expressions are now deprecated in comprehensions and
generator expressions. They are still permitted in the definition of the
outermost iterable, as that is evaluated directly in the enclosing scope.

@item 
bpo-32137@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32137}: The repr of deeply nested dict now raises a RecursionError
instead of crashing due to a stack overflow.

@item 
bpo-32096@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32096}: Revert memory allocator changes in the C API: move structures
back from _PyRuntime to Objects/obmalloc.c. The memory allocators are once
again initialized statically, and so PyMem_RawMalloc() and
Py_DecodeLocale() can be called before _PyRuntime_Initialize().

@item 
bpo-32043@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32043}: Add a new “developer mode”: new “-X dev” command line option to
enable debug checks at runtime.

@item 
bpo-32023@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32023}: SyntaxError is now correctly raised when a generator expression
without parenthesis is used instead of an inheritance list in a class
definition. The duplication of the parentheses can be omitted only on
calls.

@item 
bpo-32012@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32012}: SyntaxError is now correctly raised when a generator expression
without parenthesis is passed as an argument, but followed by a trailing
comma. A generator expression always needs to be directly inside a set of
parentheses and cannot have a comma on either side.

@item 
bpo-28180@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28180}: A new internal @code{_Py_SetLocaleFromEnv(category)} helper
function has been added in order to improve the consistency of behaviour
across different @code{libc} implementations (e.g. Android doesn’t support
setting the locale from the environment by default).

@item 
bpo-31949@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31949}: Fixed several issues in printing tracebacks
(PyTraceBack_Print()). Setting sys.tracebacklimit to 0 or less now
suppresses printing tracebacks. Setting sys.tracebacklimit to None now
causes using the default limit. Setting sys.tracebacklimit to an integer
larger than LONG_MAX now means using the limit LONG_MAX rather than the
default limit. Fixed integer overflows in the case of more than @code{2**31}
traceback items on Windows. Fixed output errors handling.

@item 
bpo-30696@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30696}: Fix the interactive interpreter looping endlessly when no
memory.

@item 
bpo-20047@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20047}: Bytearray methods partition() and rpartition() now accept only
bytes-like objects as separator, as documented.  In particular they now
raise TypeError rather of returning a bogus result when an integer is
passed as a separator.

@item 
bpo-21720@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21720}: BytesWarning no longer emitted when the `fromlist' argument of
@code{__import__()} or the @code{__all__} attribute of the module contain bytes
instances.

@item 
bpo-31845@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31845}: Environment variables are once more read correctly at
interpreter startup.

@item 
bpo-28936@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28936}: Ensure that lexically first syntax error involving a parameter
and @code{global} or @code{nonlocal} is detected first at a given scope. Patch
by Ivan Levkivskyi.

@item 
bpo-31825@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31825}: Fixed OverflowError in the ‘unicode-escape’ codec and in
codecs.escape_decode() when decode an escaped non-ascii byte.

@item 
bpo-31618@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31618}: The per-frame tracing logic added in 3.7a1 has been altered so
that @code{frame->f_lineno} is updated before either @code{"line"} or
@code{"opcode"} events are emitted. Previously, opcode events were emitted
first, and therefore would occasionally see stale line numbers on the
frame. The behavior of this feature has changed slightly as a result: when
both @code{f_trace_lines} and @code{f_trace_opcodes} are enabled, line events
now occur first.

@item 
bpo-28603@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28603}: Print the full context/cause chain of exceptions on interpreter
exit, even if an exception in the chain is unhashable or compares equal to
later ones. Patch by Zane Bitter.

@item 
bpo-31786@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31786}: Fix timeout rounding in the select module to round correctly
negative timeouts between -1.0 and 0.0. The functions now block waiting
for events as expected. Previously, the call was incorrectly non-blocking.
Patch by Pablo Galindo.

@item 
bpo-31781@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31781}: Prevent crashes when calling methods of an uninitialized
@code{zipimport.zipimporter} object. Patch by Oren Milman.

@item 
bpo-30399@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30399}: Standard repr() of BaseException with a single argument no
longer contains redundant trailing comma.

@item 
bpo-31626@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31626}: Fixed a bug in debug memory allocator.  There was a write to
freed memory after shrinking a memory block.

@item 
bpo-30817@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30817}: @code{PyErr_PrintEx()} clears now the ignored exception that may
be raised by @code{_PySys_SetObjectId()}, for example when no memory.
@end itemize

@node Library<171>,Documentation<64>,Core and Builtins<167>,Python 3 7 0 alpha 3
@anchor{whatsnew/changelog id821}@anchor{1e7d}
@subsubsection Library



@itemize -

@item 
bpo-28556@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28556}: Two minor fixes for @code{typing} module: allow shallow copying
instances of generic classes, improve interaction of @code{__init_subclass__}
with generics. Original PRs by Ivan Levkivskyi.

@item 
bpo-32214@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32214}: PEP 557, Data Classes. Provides a decorator which adds
boilerplate methods to classes which use type annotations so specify
fields.

@item 
bpo-27240@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27240}: The header folding algorithm for the new email policies has
been rewritten, which also fixes bpo-30788@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30788}, bpo-31831@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31831}, and bpo-32182@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32182}.  In
particular, RFC2231 folding is now done correctly.

@item 
bpo-32186@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32186}: io.FileIO.readall() and io.FileIO.read() now release the GIL
when getting the file size. Fixed hang of all threads with inaccessible
NFS server. Patch by Nir Soffer.

@item 
bpo-32101@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32101}: Add @ref{1e7e,,sys.flags.dev_mode} flag

@item 
bpo-32154@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32154}: The @code{asyncio.windows_utils.socketpair()} function has been
removed: use directly @ref{def,,socket.socketpair()} which is available on all
platforms since Python 3.5 (before, it wasn’t available on Windows).
@code{asyncio.windows_utils.socketpair()} was just an alias to
@code{socket.socketpair} on Python 3.5 and newer.

@item 
bpo-32089@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32089}: warnings: In development (-X dev) and debug mode (pydebug
build), use the “default” action for ResourceWarning, rather than the
“always” action, in the default warnings filters.

@item 
bpo-32107@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32107}: @code{uuid.getnode()} now preferentially returns universally
administered MAC addresses if available, over locally administered MAC
addresses.  This makes a better guarantee for global uniqueness of UUIDs
returned from @code{uuid.uuid1()}.  If only locally administered MAC
addresses are available, the first such one found is returned.

@item 
bpo-23033@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23033}: Wildcard is now supported in hostname when it is one and only
character in the left most segment of hostname in second argument of
@code{ssl.match_hostname()}.  Patch by Mandeep Singh.

@item 
bpo-12239@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12239}: Make @code{msilib.SummaryInformation.GetProperty()} return
@code{None} when the value of property is @code{VT_EMPTY}.  Initial patch by
Mark Mc Mahon.

@item 
bpo-28334@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28334}: Use @ref{c08,,os.path.expanduser()} to find the @code{~/.netrc} file in
@ref{1c77,,netrc.netrc}.  If it does not exist, @ref{264,,FileNotFoundError} is
raised.  Patch by Dimitri Merejkowsky.

@item 
bpo-32121@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32121}: Made @code{tracemalloc.Traceback} behave more like the traceback
module, sorting the frames from oldest to most recent.
@code{Traceback.format()} now accepts negative `limit', truncating the result
to the @code{abs(limit)} oldest frames. To get the old behaviour, one can use
the new `most_recent_first' argument to @code{Traceback.format()}. (Patch by
Jesse Bakker.)

@item 
bpo-31325@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31325}: Fix wrong usage of @ref{4e0,,collections.namedtuple()} in the
@ref{1e7f,,RobotFileParser.parse()}
method. Initial patch by Robin Wellner.

@item 
bpo-12382@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12382}: @code{msilib.OpenDatabase()} now raises a better exception
message when it couldn’t open or create an MSI file.  Initial patch by
William Tisäter.

@item 
bpo-19610@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19610}: @code{setup()} now warns about invalid types for some fields. The
@code{distutils.dist.Distribution} class now warns when @code{classifiers},
@code{keywords} and @code{platforms} fields are not specified as a list or a
string.

@item 
bpo-32071@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32071}: Added the @code{-k} command-line option to @code{python -m unittest}
to run only tests that match the given pattern(s).

@item 
bpo-10049@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10049}: Added `nullcontext' no-op context manager to contextlib. This
provides a simpler and faster alternative to ExitStack() when handling
optional context managers.

@item 
bpo-28684@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28684}: The new test.support.skip_unless_bind_unix_socket() decorator
is used here to skip asyncio tests that fail because the platform lacks a
functional bind() function for unix domain sockets (as it is the case for
non root users on the recent Android versions that run now SELinux in
enforcing mode).

@item 
bpo-32110@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32110}: @code{codecs.StreamReader.read(n)} now returns not more than `n'
characters/bytes for non-negative `n'. This makes it compatible with
@code{read()} methods of other file-like objects.

@item 
bpo-27535@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27535}: The warnings module doesn’t leak memory anymore in the hidden
warnings registry for the “ignore” action of warnings filters.
warn_explicit() function doesn’t add the warning key to the registry
anymore for the “ignore” action.

@item 
bpo-32088@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32088}: warnings:  When Python is build is debug mode (@code{Py_DEBUG}),
@ref{1a3,,DeprecationWarning}, @ref{ac6,,PendingDeprecationWarning} and
@ref{71d,,ImportWarning} warnings are now displayed by default.

@item 
bpo-1647489@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1647489}: Fixed searching regular expression patterns that could match
an empty string. Non-empty string can now be correctly found after
matching an empty string.

@item 
bpo-25054@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25054}: Added support of splitting on a pattern that could match an
empty string.

@item 
bpo-32072@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32072}: Fixed issues with binary plists: Fixed saving bytearrays.
Identical objects will be saved only once. Equal references will be load
as identical objects. Added support for saving and loading recursive data
structures.

@item 
bpo-32069@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32069}: Drop legacy SSL transport from asyncio, ssl.MemoryBIO is always
used anyway.

@item 
bpo-32066@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32066}: asyncio: Support pathlib.Path in create_unix_connection; sock
arg should be optional

@item 
bpo-32046@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32046}: Updates 2to3 to convert from operator.isCallable(obj) to
callable(obj). Patch by Donghee Na.

@item 
bpo-32018@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32018}: inspect.signature should follow 
@geindex Python 향상 제안; PEP 8
PEP 8@footnote{https://peps.python.org/pep-0008/}, if the parameter has
an annotation and a default value. Patch by Donghee Na.

@item 
bpo-32025@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32025}: Add time.thread_time() and time.thread_time_ns()

@item 
bpo-32037@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32037}: Integers that fit in a signed 32-bit integer will be now
pickled with protocol 0 using the INT opcode.  This will decrease the size
of a pickle, speed up pickling and unpickling, and make these integers be
unpickled as int instances in Python 2.

@item 
bpo-32034@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32034}: Make asyncio.IncompleteReadError and LimitOverrunError
pickleable.

@item 
bpo-32015@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32015}: Fixed the looping of asyncio in the case of reconnection the
socket during waiting async read/write from/to the socket.

@item 
bpo-32011@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32011}: Restored support of loading marshal files with the TYPE_INT64
code. These files can be produced in Python 2.7.

@item 
bpo-28369@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28369}: Enhance add_reader/writer check that socket is not used by some
transport. Before, only cases when add_reader/writer were called with an
int FD were supported.  Now the check is implemented correctly for all
file-like objects.

@item 
bpo-31976@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31976}: Fix race condition when flushing a file is slow, which can
cause a segfault if closing the file from another thread.

@item 
bpo-31985@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31985}: Formally deprecated aifc.openfp, sunau.openfp, and wave.openfp.
Since change 7bc817d5ba917528e8bd07ec461c635291e7b06a in 1993, openfp in
each of the three modules had been pointing to that module’s open function
as a matter of backwards compatibility, though it had been both untested
and undocumented.

@item 
bpo-21862@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21862}: cProfile command line now accepts @code{-m module_name} as an
alternative to script path. Patch by Sanyam Khurana.

@item 
bpo-31970@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31970}: Reduce performance overhead of asyncio debug mode.

@item 
bpo-31843@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31843}: `database' argument of sqlite3.connect() now accepts a
@ref{5a0,,path-like object}, instead of just a string.

@item 
bpo-31945@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31945}: Add Configurable `blocksize' to @code{HTTPConnection} and
@code{HTTPSConnection} for improved upload throughput.  Patch by Nir Soffer.

@item 
bpo-31943@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31943}: Add a @code{cancelled()} method to @ref{1e80,,asyncio.Handle}.  Patch
by Marat Sharafutdinov.

@item 
bpo-9678@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9678}: Fixed determining the MAC address in the uuid module: Using
ifconfig on NetBSD and OpenBSD. Using arp on Linux, FreeBSD, NetBSD and
OpenBSD. Based on patch by Takayuki Shimizukawa.

@item 
bpo-30057@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30057}: Fix potential missed signal in signal.signal().

@item 
bpo-31933@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31933}: Fix Blake2 params leaf_size and node_offset on big endian
platforms. Patch by Jack O’Connor.

@item 
bpo-21423@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21423}: Add an initializer argument to @{Process,Thread@}PoolExecutor

@item 
bpo-31927@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31927}: Fixed compilation of the socket module on NetBSD 8.  Fixed
assertion failure or reading arbitrary data when parse a AF_BLUETOOTH
address on NetBSD and DragonFly BSD.

@item 
bpo-27666@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27666}: Fixed stack corruption in curses.box() and curses.ungetmouse()
when the size of types chtype or mmask_t is less than the size of C long.
curses.box() now accepts characters as arguments.  Based on patch by Steve
Fink.

@item 
bpo-31917@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31917}: Add 3 new clock identifiers: @ref{d86,,time.CLOCK_BOOTTIME},
@ref{d87,,time.CLOCK_PROF} and @ref{d88,,time.CLOCK_UPTIME}.

@item 
bpo-31897@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31897}: plistlib now catches more errors when read binary plists and
raises InvalidFileException instead of unexpected exceptions.

@item 
bpo-25720@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25720}: Fix the method for checking pad state of curses WINDOW. Patch
by Masayuki Yamamoto.

@item 
bpo-31893@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31893}: Fixed the layout of the kqueue_event structure on OpenBSD and
NetBSD. Fixed the comparison of the kqueue_event objects.

@item 
bpo-31891@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31891}: Fixed building the curses module on NetBSD.

@item 
bpo-31884@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31884}: added required constants to subprocess module for setting
priority on windows

@item 
bpo-28281@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28281}: Remove year (1-9999) limits on the Calendar.weekday() function.
Patch by Mark Gollahon.

@item 
bpo-31702@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31702}: crypt.mksalt() now allows to specify the number of rounds for
SHA-256 and SHA-512 hashing.

@item 
bpo-30639@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30639}: @ref{1e81,,inspect.getfile()} no longer computes the repr of unknown
objects to display in an error message, to protect against badly behaved
custom reprs.

@item 
bpo-30768@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30768}: Fix the pthread+semaphore implementation of
PyThread_acquire_lock_timed() when called with timeout > 0 and
intr_flag=0: recompute the timeout if sem_timedwait() is interrupted by a
signal (EINTR). See also the 
@geindex Python 향상 제안; PEP 475
PEP 475@footnote{https://peps.python.org/pep-0475/}.

@item 
bpo-31854@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31854}: Add @code{mmap.ACCESS_DEFAULT} constant.

@item 
bpo-31834@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31834}: Use optimized code for BLAKE2 only with SSSE3+. The pure SSE2
implementation is slower than the pure C reference implementation.

@item 
bpo-28292@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28292}: Calendar.itermonthdates() will now consistently raise an
exception when a date falls outside of the 0001-01-01 through 9999-12-31
range.  To support applications that cannot tolerate such exceptions, the
new methods itermonthdays3() and itermonthdays4() are added.  The new
methods return tuples and are not restricted by the range supported by
datetime.date.

@item 
bpo-28564@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28564}: The shutil.rmtree() function has been sped up to 20–40%. This
was done using the os.scandir() function.

@item 
bpo-28416@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28416}: Instances of pickle.Pickler subclass with the persistent_id()
method and pickle.Unpickler subclass with the persistent_load() method no
longer create reference cycles.

@item 
bpo-31653@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31653}: Don’t release the GIL if we can acquire a multiprocessing
semaphore immediately.

@item 
bpo-28326@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28326}: Fix multiprocessing.Process when stdout and/or stderr is closed
or None.

@item 
bpo-20825@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20825}: Add @code{subnet_of} and @code{superset_of} containment tests to
@ref{50e,,ipaddress.IPv6Network} and @ref{50d,,ipaddress.IPv4Network}. Patch
by Michel Albert and Cheryl Sabella.

@item 
bpo-31827@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31827}: Remove the os.stat_float_times() function. It was introduced in
Python 2.3 for backward compatibility with Python 2.2, and was deprecated
since Python 3.1.

@item 
bpo-31756@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31756}: Add a @code{subprocess.Popen(text=False)} keyword argument to
@code{subprocess} functions to be more explicit about when the library should
attempt to decode outputs into text. Patch by Andrew Clegg.

@item 
bpo-31819@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31819}: Add AbstractEventLoop.sock_recv_into().

@item 
bpo-31457@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31457}: If nested log adapters are used, the inner @code{process()}
methods are no longer omitted.

@item 
bpo-31457@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31457}: The @code{manager} property on LoggerAdapter objects is now
properly settable.

@item 
bpo-31806@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31806}: Fix timeout rounding in time.sleep(), threading.Lock.acquire()
and socket.socket.settimeout() to round correctly negative timeouts
between -1.0 and 0.0. The functions now block waiting for events as
expected. Previously, the call was incorrectly non-blocking. Patch by
Pablo Galindo.

@item 
bpo-31803@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31803}: time.clock() and time.get_clock_info(‘clock’) now emit a
DeprecationWarning warning.

@item 
bpo-31800@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31800}: Extended support for parsing UTC offsets. strptime ‘%z’ can now
parse the output generated by datetime.isoformat, including seconds and
microseconds.

@item 
bpo-28603@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28603}: traceback: Fix a TypeError that occurred during printing of
exception tracebacks when either the current exception or an exception in
its context/cause chain is unhashable. Patch by Zane Bitter.

@item 
bpo-30541@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30541}: Add new function to seal a mock and prevent the automatically
creation of child mocks. Patch by Mario Corchero.

@item 
bpo-31784@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31784}: Implement the 
@geindex Python 향상 제안; PEP 564
PEP 564@footnote{https://peps.python.org/pep-0564/}, add new 6 new functions with
nanosecond resolution to the @ref{f4,,time} module:
@ref{cda,,clock_gettime_ns()}, @ref{cdb,,clock_settime_ns()},
@ref{cdc,,monotonic_ns()}, @ref{cdd,,perf_counter_ns()},
@ref{cde,,process_time_ns()}, @ref{cdf,,time_ns()}.

@item 
bpo-30143@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30143}: 2to3 now generates a code that uses abstract collection classes
from collections.abc rather than collections.

@item 
bpo-31770@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31770}: Prevent a crash when calling the @code{__init__()} method of a
@code{sqlite3.Cursor} object more than once. Patch by Oren Milman.

@item 
bpo-31764@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31764}: Prevent a crash in @code{sqlite3.Cursor.close()} in case the
@code{Cursor} object is uninitialized. Patch by Oren Milman.

@item 
bpo-31752@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31752}: Fix possible crash in timedelta constructor called with custom
integers.

@item 
bpo-31620@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31620}: an empty asyncio.Queue now doesn’t leak memory when queue.get
pollers timeout

@item 
bpo-31690@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31690}: Allow the flags re.ASCII, re.LOCALE, and re.UNICODE to be used
as group flags for regular expressions.

@item 
bpo-30349@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30349}: FutureWarning is now emitted if a regular expression contains
character set constructs that will change semantically in the future
(nested sets and set operations).

@item 
bpo-31664@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31664}: Added support for the Blowfish hashing in the crypt module.

@item 
bpo-31632@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31632}: Fix method set_protocol() of class _SSLProtocolTransport in
asyncio module. This method was previously modifying a wrong reference to
the protocol.

@item 
bpo-15037@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15037}: Added a workaround for getkey() in curses for ncurses 5.7 and
earlier.

@item 
bpo-31307@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31307}: Allow use of bytes objects for arguments to
@ref{166d,,configparser.ConfigParser.read()}. Patch by Vincent Michel.

@item 
bpo-31334@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31334}: Fix @code{poll.poll([timeout])} in the @code{select} module for
arbitrary negative timeouts on all OSes where it can only be a
non-negative integer or -1. Patch by Riccardo Coccioli.

@item 
bpo-31310@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31310}: multiprocessing’s semaphore tracker should be launched again if
crashed.

@item 
bpo-31308@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31308}: Make multiprocessing’s forkserver process immune to Ctrl-C and
other user interruptions. If it crashes, restart it when necessary.

@item 
bpo-31245@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31245}: Added support for AF_UNIX socket in asyncio
@code{create_datagram_endpoint}.

@item 
bpo-30553@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30553}: Add HTTP/2 status code 421 (Misdirected Request) to
@ref{afc,,http.HTTPStatus}. Patch by Vitor Pereira.
@end itemize

@node Documentation<64>,Tests<62>,Library<171>,Python 3 7 0 alpha 3
@anchor{whatsnew/changelog id822}@anchor{1e82}
@subsubsection Documentation



@itemize -

@item 
bpo-32105@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32105}: Added asyncio.BaseEventLoop.connect_accepted_socket
versionadded marker.
@end itemize

@node Tests<62>,Build<69>,Documentation<64>,Python 3 7 0 alpha 3
@anchor{whatsnew/changelog id823}@anchor{1e83}
@subsubsection Tests



@itemize -

@item 
bpo-31380@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31380}: Skip test_httpservers test_undecodable_file on macOS: fails on
APFS.

@item 
bpo-31705@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31705}: Skip test_socket.test_sha256() on Linux kernel older than 4.5.
The test fails with ENOKEY on kernel 3.10 (on ppc64le). A fix was merged
into the kernel 4.5.

@item 
bpo-32138@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32138}: Skip on Android test_faulthandler tests that raise SIGSEGV and
remove the test.support.requires_android_level decorator.

@item 
bpo-32136@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32136}: The runtime embedding tests have been split out from
@code{Lib/test/test_capi.py} into a new @code{Lib/test/test_embed.py} file.

@item 
bpo-28668@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28668}: test.support.requires_multiprocessing_queue is removed. Skip
tests with test.support.import_module(‘multiprocessing.synchronize’)
instead when the semaphore implementation is broken or missing.

@item 
bpo-32126@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32126}: Skip test_get_event_loop_new_process in
test.test_asyncio.test_events when sem_open() is not functional.

@item 
bpo-31174@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31174}: Fix test_tools.test_unparse: DirectoryTestCase now stores the
names sample to always test the same files. It prevents false alarms when
hunting reference leaks.
@end itemize

@node Build<69>,Windows<62>,Tests<62>,Python 3 7 0 alpha 3
@anchor{whatsnew/changelog id824}@anchor{1e84}
@subsubsection Build



@itemize -

@item 
bpo-28538@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28538}: Revert the previous changes, the if_nameindex structure is
defined by Unified Headers.

@item 
bpo-28762@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28762}: Revert the last commit, the F_LOCK macro is defined by Android
Unified Headers.

@item 
bpo-29040@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29040}: Support building Android with Unified Headers. The first NDK
release to support Unified Headers is android-ndk-r14.

@item 
bpo-32059@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32059}: @code{detect_modules()} in @code{setup.py} now also searches the
sysroot paths when cross-compiling.

@item 
bpo-31957@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31957}: Fixes Windows SDK version detection when building for Windows.

@item 
bpo-31609@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31609}: Fixes quotes in PCbuild/clean.bat

@item 
bpo-31934@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31934}: Abort the build when building out of a not clean source tree.

@item 
bpo-31926@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31926}: Fixed Argument Clinic sometimes causing compilation errors when
there was more than one function and/or method in a .c file with the same
name.

@item 
bpo-28791@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28791}: Update Windows builds to use SQLite 3.21.0.

@item 
bpo-28791@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28791}: Update OS X installer to use SQLite 3.21.0.

@item 
bpo-28643@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28643}: Record profile-opt build progress with stamp files.

@item 
bpo-31866@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31866}: Finish removing support for AtheOS.
@end itemize

@node Windows<62>,macOS<48>,Build<69>,Python 3 7 0 alpha 3
@anchor{whatsnew/changelog id825}@anchor{1e85}
@subsubsection Windows



@itemize -

@item 
bpo-1102@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1102}: Return @code{None} when @code{View.Fetch()} returns
@code{ERROR_NO_MORE_ITEMS} instead of raising @code{MSIError}. Initial patch by
Anthony Tuininga.

@item 
bpo-31944@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31944}: Fixes Modify button in Apps and Features dialog.

@item 
bpo-20486@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20486}: Implement the @code{Database.Close()} method to help closing MSI
database objects.

@item 
bpo-31857@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31857}: Make the behavior of USE_STACKCHECK deterministic in a
multi-threaded environment.
@end itemize

@node macOS<48>,IDLE<43>,Windows<62>,Python 3 7 0 alpha 3
@anchor{whatsnew/changelog id826}@anchor{1e86}
@subsubsection macOS



@itemize -

@item 
bpo-31392@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31392}: Update macOS installer to use OpenSSL 1.0.2m
@end itemize

@node IDLE<43>,Tools/Demos<42>,macOS<48>,Python 3 7 0 alpha 3
@anchor{whatsnew/changelog id827}@anchor{1e87}
@subsubsection IDLE



@itemize -

@item 
bpo-32207@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32207}: Improve tk event exception tracebacks in IDLE. When tk event
handling is driven by IDLE’s run loop, a confusing and distracting
queue.EMPTY traceback context is no longer added to tk event exception
tracebacks.  The traceback is now the same as when event handling is
driven by user code.  Patch based on a suggestion by Serhiy Storchaka.

@item 
bpo-32164@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32164}: Delete unused file idlelib/tabbedpages.py. Use of TabbedPageSet
in configdialog was replaced by ttk.Notebook.

@item 
bpo-32100@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32100}: IDLE: Fix old and new bugs in pathbrowser; improve tests. Patch
mostly by Cheryl Sabella.

@item 
bpo-31858@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31858}: IDLE – Restrict shell prompt manipulation to the shell. Editor
and output windows only see an empty last prompt line.  This simplifies
the code and fixes a minor bug when newline is inserted. Sys.ps1, if
present, is read on Shell start-up, but is not set or changed.

@item 
bpo-31860@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31860}: The font sample in the IDLE configuration dialog is now
editable. Changes persist while IDLE remains open

@item 
bpo-31836@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31836}: Test_code_module now passes if run after test_idle, which sets
ps1. The code module uses sys.ps1 if present or sets it to ‘>>> ‘ if not.
Test_code_module now properly tests both behaviors.  Ditto for ps2.

@item 
bpo-28603@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28603}: Fix a TypeError that caused a shell restart when printing a
traceback that includes an exception that is unhashable. Patch by Zane
Bitter.

@item 
bpo-13802@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13802}: Use non-Latin characters in the IDLE’s Font settings sample.
Even if one selects a font that defines a limited subset of the unicode
Basic Multilingual Plane, tcl/tk will use other fonts that define a
character. The expanded example give users of non-Latin characters a
better idea of what they might see in IDLE’s shell and editors. To make
room for the expanded sample, frames on the Font tab are re-arranged.  The
Font/Tabs help explains a bit about the additions.
@end itemize

@node Tools/Demos<42>,C API<62>,IDLE<43>,Python 3 7 0 alpha 3
@anchor{whatsnew/changelog id828}@anchor{1e88}
@subsubsection Tools/Demos



@itemize -

@item 
bpo-32159@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32159}: Remove CVS and Subversion tools: remove svneol.py and
treesync.py scripts. CPython migrated from CVS to Subversion, to
Mercurial, and then to Git. CVS and Subversion are no longer used to
develop CPython.

@item 
bpo-30722@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30722}: Make redemo work with Python 3.6 and newer versions. Also,
remove the @code{LOCALE} option since it doesn’t work with string patterns in
Python 3. Patch by Christoph Sarnowski.
@end itemize

@node C API<62>,,Tools/Demos<42>,Python 3 7 0 alpha 3
@anchor{whatsnew/changelog id829}@anchor{1e89}
@subsubsection C API



@itemize -

@item 
bpo-20891@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20891}: Fix PyGILState_Ensure(). When PyGILState_Ensure() is called in
a non-Python thread before PyEval_InitThreads(), only call
PyEval_InitThreads() after calling PyThreadState_New() to fix a crash.

@item 
bpo-32125@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32125}: The @code{Py_UseClassExceptionsFlag} flag has been removed. It was
deprecated and wasn’t used anymore since Python 2.0.

@item 
bpo-25612@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25612}: Move the current exception state from the frame object to the
co-routine. This simplifies the interpreter and fixes a couple of obscure
bugs caused by having swap exception state when entering or exiting a
generator.

@item 
bpo-23699@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23699}: Add Py_RETURN_RICHCOMPARE macro to reduce boilerplate code in
rich comparison functions.

@item 
bpo-30697@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30697}: The @code{PyExc_RecursionErrorInst} singleton is removed and
@code{PyErr_NormalizeException()} does not use it anymore. This singleton is
persistent and its members being never cleared may cause a segfault during
finalization of the interpreter. See also bpo-22898@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22898}.
@end itemize

@node Python 3 7 0 alpha 2,Python 3 7 0 alpha 1,Python 3 7 0 alpha 3,Changelog
@anchor{whatsnew/changelog python-3-7-0-alpha-2}@anchor{1e8a}
@subsection Python 3.7.0 alpha 2


`Release date: 2017-10-16'

@menu
* Core and Builtins: Core and Builtins<168>. 
* Library: Library<172>. 
* Documentation: Documentation<65>. 
* Build: Build<70>. 
* IDLE: IDLE<44>. 
* C API: C API<63>. 

@end menu

@node Core and Builtins<168>,Library<172>,,Python 3 7 0 alpha 2
@anchor{whatsnew/changelog id830}@anchor{1e8b}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-31558@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31558}: @code{gc.freeze()} is a new API that allows for moving all objects
currently tracked by the garbage collector to a permanent generation,
effectively removing them from future collection events. This can be used
to protect those objects from having their PyGC_Head mutated. In effect,
this enables great copy-on-write stability at fork().

@item 
bpo-31642@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31642}: Restored blocking “from package import module” by setting
sys.modules[“package.module”] to None.

@item 
bpo-31708@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31708}: Allow use of asynchronous generator expressions in synchronous
functions.

@item 
bpo-31709@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31709}: Drop support of asynchronous __aiter__.

@item 
bpo-30404@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30404}: The -u option now makes the stdout and stderr streams
unbuffered rather than line-buffered.

@item 
bpo-31619@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31619}: Fixed a ValueError when convert a string with large number of
underscores to integer with binary base.

@item 
bpo-31602@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31602}: Fix an assertion failure in @code{zipimporter.get_source()} in
case of a bad @code{zlib.decompress()}. Patch by Oren Milman.

@item 
bpo-31592@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31592}: Fixed an assertion failure in Python parser in case of a bad
@code{unicodedata.normalize()}. Patch by Oren Milman.

@item 
bpo-31588@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31588}: Raise a @code{TypeError} with a helpful error message when class
creation fails due to a metaclass with a bad @code{__prepare__()} method.
Patch by Oren Milman.

@item 
bpo-31574@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31574}: Importlib was instrumented with two dtrace probes to profile
import timing.

@item 
bpo-31566@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31566}: Fix an assertion failure in @code{_warnings.warn()} in case of a
bad @code{__name__} global. Patch by Oren Milman.

@item 
bpo-31506@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31506}: Improved the error message logic for @code{object.__new__} and
@code{object.__init__}.

@item 
bpo-31505@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31505}: Fix an assertion failure in @code{json}, in case
@code{_json.make_encoder()} received a bad @code{encoder()} argument. Patch by
Oren Milman.

@item 
bpo-31492@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31492}: Fix assertion failures in case of failing to import from a
module with a bad @code{__name__} attribute, and in case of failing to access
an attribute of such a module. Patch by Oren Milman.

@item 
bpo-31478@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31478}: Fix an assertion failure in @code{_random.Random.seed()} in case
the argument has a bad @code{__abs__()} method. Patch by Oren Milman.

@item 
bpo-31336@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31336}: Speed up class creation by 10-20% by reducing the overhead in
the necessary special method lookups.  Patch by Stefan Behnel.

@item 
bpo-31415@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31415}: Add @code{-X importtime} option to show how long each import
takes. It can be used to optimize application’s startup time.  Support the
@geindex PYTHONPROFILEIMPORTTIME
@geindex 환경 변수; PYTHONPROFILEIMPORTTIME
@ref{cec,,PYTHONPROFILEIMPORTTIME} as an equivalent way to enable this.

@item 
bpo-31410@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31410}: Optimized calling wrapper and classmethod descriptors.

@item 
bpo-31353@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31353}: 
@geindex Python 향상 제안; PEP 553
PEP 553@footnote{https://peps.python.org/pep-0553/} - Add a new built-in called @code{breakpoint()} which
calls @code{sys.breakpointhook()}.  By default this imports @code{pdb} and calls
@code{pdb.set_trace()}, but users may override @code{sys.breakpointhook()} to
call whatever debugger they want.  The original value of the hook is saved
in @code{sys.__breakpointhook__}.

@item 
bpo-17852@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17852}: Maintain a list of open buffered files, flush them before
exiting the interpreter.  Based on a patch from Armin Rigo.

@item 
bpo-31315@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31315}: Fix an assertion failure in imp.create_dynamic(), when
spec.name is not a string. Patch by Oren Milman.

@item 
bpo-31311@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31311}: Fix a crash in the @code{__setstate__()} method of
@code{ctypes._CData}, in case of a bad @code{__dict__}. Patch by Oren Milman.

@item 
bpo-31293@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31293}: Fix crashes in true division and multiplication of a timedelta
object by a float with a bad as_integer_ratio() method. Patch by Oren
Milman.

@item 
bpo-31285@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31285}: Fix an assertion failure in @code{warnings.warn_explicit}, when
the return value of the received loader’s @code{get_source()} has a bad
@code{splitlines()} method. Patch by Oren Milman.

@item 
bpo-30406@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30406}: Make @code{async} and @code{await} proper keywords, as specified in
@geindex Python 향상 제안; PEP 492
PEP 492@footnote{https://peps.python.org/pep-0492/}.
@end itemize

@node Library<172>,Documentation<65>,Core and Builtins<168>,Python 3 7 0 alpha 2
@anchor{whatsnew/changelog id831}@anchor{1e8c}
@subsubsection Library



@itemize -

@item 
bpo-30058@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30058}: Fixed buffer overflow in select.kqueue.control().

@item 
bpo-31672@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31672}: @code{idpattern} in @code{string.Template} matched some non-ASCII
characters. Now it uses @code{-i} regular expression local flag to avoid
non-ASCII characters.

@item 
bpo-31701@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31701}: On Windows, faulthandler.enable() now ignores MSC and COM
exceptions.

@item 
bpo-31728@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31728}: Prevent crashes in @code{_elementtree} due to unsafe cleanup of
@code{Element.text} and @code{Element.tail}. Patch by Oren Milman.

@item 
bpo-31671@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31671}: Now @code{re.compile()} converts passed RegexFlag to normal int
object before compiling. bm_regex_compile benchmark shows 14% performance
improvements.

@item 
bpo-30397@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30397}: The types of compiled regular objects and match objects are now
exposed as @code{re.Pattern} and @code{re.Match}.  This adds information in
pydoc output for the @code{re} module.

@item 
bpo-31675@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31675}: Fixed memory leaks in Tkinter’s methods splitlist() and split()
when pass a string larger than 2 GiB.

@item 
bpo-31673@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31673}: Fixed typo in the name of Tkinter’s method adderrorinfo().

@item 
bpo-31648@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31648}: Improvements to path predicates in ElementTree: Allow
whitespace around predicate parts, i.e. “[a = ‘text’]” instead of
requiring the less readable “[a=’text’]”. Add support for text comparison
of the current node, like “[.=’text’]”. Patch by Stefan Behnel.

@item 
bpo-30806@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30806}: Fix the string representation of a netrc object.

@item 
bpo-31638@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31638}: Add optional argument @code{compressed} to
@code{zipapp.create_archive}, and add option @code{--compress} to the command
line interface of @code{zipapp}.

@item 
bpo-25351@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25351}: Avoid venv activate failures with undefined variables

@item 
bpo-20519@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20519}: Avoid ctypes use (if possible) and improve import time for
uuid.

@item 
bpo-28293@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28293}: The regular expression cache is no longer completely dumped
when it is full.

@item 
bpo-31596@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31596}: Added pthread_getcpuclockid() to the time module

@item 
bpo-27494@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27494}: Make 2to3 accept a trailing comma in generator expressions. For
example, @code{set(x for x in [],)} is now allowed.

@item 
bpo-30347@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30347}: Stop crashes when concurrently iterate over itertools.groupby()
iterators.

@item 
bpo-30346@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30346}: An iterator produced by itertools.groupby() iterator now
becomes exhausted after advancing the groupby iterator.

@item 
bpo-31556@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31556}: Cancel asyncio.wait_for future faster if timeout <= 0

@item 
bpo-31540@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31540}: Allow passing a context object in
@ref{1d6,,concurrent.futures.ProcessPoolExecutor} constructor. Also, free
job resources in @code{concurrent.futures.ProcessPoolExecutor} earlier
to improve memory usage when a worker waits for new jobs.

@item 
bpo-31516@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31516}: @code{threading.current_thread()} should not return a dummy thread
at shutdown.

@item 
bpo-31525@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31525}: In the sqlite module, require the sqlite3_prepare_v2 API. Thus,
the sqlite module now requires sqlite version at least 3.3.9.

@item 
bpo-26510@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26510}: argparse subparsers are now required by default.  This matches
behaviour in Python 2. For optional subparsers, use the new parameter
@code{add_subparsers(required=False)}. Patch by Anthony Sottile. (As of
3.7.0rc1, the default was changed to not required as had been the case
since Python 3.3.)

@item 
bpo-27541@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27541}: Reprs of subclasses of some collection and iterator classes
(@code{bytearray}, @code{array.array}, @code{collections.deque},
@code{collections.defaultdict}, @code{itertools.count}, @code{itertools.repeat})
now contain actual type name instead of hardcoded names of the base class.

@item 
bpo-31351@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31351}: python -m ensurepip now exits with non-zero exit code if pip
bootstrapping has failed.

@item 
bpo-31389@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31389}: @code{pdb.set_trace()} now takes an optional keyword-only argument
@code{header}. If given, this is printed to the console just before debugging
begins.
@end itemize

@node Documentation<65>,Build<70>,Library<172>,Python 3 7 0 alpha 2
@anchor{whatsnew/changelog id832}@anchor{1e8d}
@subsubsection Documentation



@itemize -

@item 
bpo-31537@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31537}: Fix incorrect usage of @code{get_history_length} in readline
documentation example code. Patch by Brad Smith.

@item 
bpo-30085@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30085}: The operator functions without double underscores are preferred
for clarity. The one with underscores are only kept for
back-compatibility.
@end itemize

@node Build<70>,IDLE<44>,Documentation<65>,Python 3 7 0 alpha 2
@anchor{whatsnew/changelog id833}@anchor{1e8e}
@subsubsection Build



@itemize -

@item 
bpo-31696@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31696}: Improve compiler version information in @ref{49d,,sys.version}
when Python is built with Clang.

@item 
bpo-31625@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31625}: Stop using ranlib on static libraries. Instead, we assume ar
supports the ‘s’ flag.

@item 
bpo-31624@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31624}: Remove support for BSD/OS.

@item 
bpo-22140@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22140}: Prevent double substitution of prefix in python-config.sh.

@item 
bpo-31569@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31569}: Correct PCBuild/ case to PCbuild/ in build scripts and
documentation.

@item 
bpo-31536@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31536}: Avoid wholesale rebuild after @code{make regen-all} if nothing
changed.
@end itemize

@node IDLE<44>,C API<63>,Build<70>,Python 3 7 0 alpha 2
@anchor{whatsnew/changelog id834}@anchor{1e8f}
@subsubsection IDLE



@itemize -

@item 
bpo-31460@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31460}: Simplify the API of IDLE’s Module Browser. Passing a widget
instead of an flist with a root widget opens the option of creating a
browser frame that is only part of a window.  Passing a full file name
instead of pieces assumed to come from a .py file opens the possibility of
browsing python files that do not end in .py.

@item 
bpo-31649@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31649}: IDLE - Make _htest, _utest parameters keyword only.

@item 
bpo-31559@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31559}: Remove test order dependence in idle_test.test_browser.

@item 
bpo-31459@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31459}: Rename IDLE’s module browser from Class Browser to Module
Browser. The original module-level class and method browser became a
module browser, with the addition of module-level functions, years ago.
Nested classes and functions were added yesterday.  For
back-compatibility, the virtual event <<open-class-browser>>, which
appears on the Keys tab of the Settings dialog, is not changed. Patch by
Cheryl Sabella.

@item 
bpo-31500@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31500}: Default fonts now are scaled on HiDPI displays.

@item 
bpo-1612262@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1612262}: IDLE module browser now shows nested classes and functions.
Original patches for code and tests by Guilherme Polo and Cheryl Sabella,
respectively.
@end itemize

@node C API<63>,,IDLE<44>,Python 3 7 0 alpha 2
@anchor{whatsnew/changelog id835}@anchor{1e90}
@subsubsection C API



@itemize -

@item 
bpo-28280@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28280}: Make @code{PyMapping_Keys()}, @code{PyMapping_Values()} and
@code{PyMapping_Items()} always return a @code{list} (rather than a @code{list} or
a @code{tuple}). Patch by Oren Milman.

@item 
bpo-31532@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31532}: Fix memory corruption due to allocator mix in getpath.c between
Py_GetPath() and Py_SetPath()

@item 
bpo-25658@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25658}: Implement 
@geindex Python 향상 제안; PEP 539
PEP 539@footnote{https://peps.python.org/pep-0539/} for Thread Specific Storage (TSS) API: it
is a new Thread Local Storage (TLS) API to CPython which would supersede
use of the existing TLS API within the CPython interpreter, while
deprecating the existing API. PEP written by Erik M. Bray, patch by
Masayuki Yamamoto.
@end itemize

@node Python 3 7 0 alpha 1,Python 3 6 6 final,Python 3 7 0 alpha 2,Changelog
@anchor{whatsnew/changelog python-3-7-0-alpha-1}@anchor{1e91}
@subsection Python 3.7.0 alpha 1


`Release date: 2017-09-19'

@menu
* Security: Security<50>. 
* Core and Builtins: Core and Builtins<169>. 
* Library: Library<173>. 
* Documentation: Documentation<66>. 
* Tests: Tests<63>. 
* Build: Build<71>. 
* Windows: Windows<63>. 
* IDLE: IDLE<45>. 
* Tools/Demos: Tools/Demos<43>. 
* C API: C API<64>. 

@end menu

@node Security<50>,Core and Builtins<169>,,Python 3 7 0 alpha 1
@anchor{whatsnew/changelog id836}@anchor{1e92}
@subsubsection Security



@itemize -

@item 
bpo-29781@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29781}: SSLObject.version() now correctly returns None when handshake
over BIO has not been performed yet.

@item 
bpo-29505@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29505}: Add fuzz tests for float(str), int(str), unicode(str); for
oss-fuzz.

@item 
bpo-30947@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30947}: Upgrade libexpat embedded copy from version 2.2.1 to 2.2.3 to
get security fixes.

@item 
bpo-30730@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30730}: Prevent environment variables injection in subprocess on
Windows.  Prevent passing other environment variables and command
arguments.

@item 
bpo-30694@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30694}: Upgrade expat copy from 2.2.0 to 2.2.1 to get fixes of multiple
security vulnerabilities including: 
@geindex Common Vulnerabilities and Exposures; CVE 2017-9233
CVE 2017-9233@footnote{https://www.cve.org/CVERecord?id=CVE-2017-9233} (External entity
infinite loop DoS), 
@geindex Common Vulnerabilities and Exposures; CVE 2016-9063
CVE 2016-9063@footnote{https://www.cve.org/CVERecord?id=CVE-2016-9063} (Integer overflow, re-fix),
@geindex Common Vulnerabilities and Exposures; CVE 2016-0718
CVE 2016-0718@footnote{https://www.cve.org/CVERecord?id=CVE-2016-0718} (Fix regression bugs from 2.2.0’s fix to
@geindex Common Vulnerabilities and Exposures; CVE 2016-0718
CVE 2016-0718@footnote{https://www.cve.org/CVERecord?id=CVE-2016-0718}) and 
@geindex Common Vulnerabilities and Exposures; CVE 2012-0876
CVE 2012-0876@footnote{https://www.cve.org/CVERecord?id=CVE-2012-0876} (Counter hash flooding with
SipHash). Note: the 
@geindex Common Vulnerabilities and Exposures; CVE 2016-5300
CVE 2016-5300@footnote{https://www.cve.org/CVERecord?id=CVE-2016-5300} (Use os-specific entropy sources like
getrandom) doesn’t impact Python, since Python already gets entropy from
the OS to set the expat secret using @code{XML_SetHashSalt()}.

@item 
bpo-30500@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30500}: Fix urllib.parse.splithost() to correctly parse fragments. For
example, @code{splithost('//127.0.0.1#@@evil.com/')} now correctly returns the
@code{127.0.0.1} host, instead of treating @code{@@evil.com} as the host in an
authentication (@code{login@@host}).

@item 
bpo-29591@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29591}: Update expat copy from 2.1.1 to 2.2.0 to get fixes of
@geindex Common Vulnerabilities and Exposures; CVE 2016-0718
CVE 2016-0718@footnote{https://www.cve.org/CVERecord?id=CVE-2016-0718} and 
@geindex Common Vulnerabilities and Exposures; CVE 2016-4472
CVE 2016-4472@footnote{https://www.cve.org/CVERecord?id=CVE-2016-4472}. See
@indicateurl{https://sourceforge.net/p/expat/bugs/537/} for more information.
@end itemize

@node Core and Builtins<169>,Library<173>,Security<50>,Python 3 7 0 alpha 1
@anchor{whatsnew/changelog id837}@anchor{1e93}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-31490@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31490}: Fix an assertion failure in @code{ctypes} class definition, in
case the class has an attribute whose name is specified in @code{_anonymous_}
but not in @code{_fields_}. Patch by Oren Milman.

@item 
bpo-31471@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31471}: Fix an assertion failure in @code{subprocess.Popen()} on Windows,
in case the env argument has a bad @code{keys()} method. Patch by Oren
Milman.

@item 
bpo-31418@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31418}: Fix an assertion failure in @code{PyErr_WriteUnraisable()} in case
of an exception with a bad @code{__module__} attribute. Patch by Oren Milman.

@item 
bpo-31416@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31416}: Fix assertion failures in case of a bad warnings.filters or
warnings.defaultaction. Patch by Oren Milman.

@item 
bpo-28411@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28411}: Change direct usage of PyInterpreterState.modules to
PyImport_GetModuleDict(). Also introduce more uniformity in other code
that deals with sys.modules. This helps reduce complications when working
on sys.modules.

@item 
bpo-28411@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28411}: Switch to the abstract API when dealing with
@code{PyInterpreterState.modules}. This allows later support for all dict
subclasses and other Mapping implementations.  Also add a
@code{PyImport_GetModule()} function to reduce a bunch of duplicated code.

@item 
bpo-31411@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31411}: Raise a TypeError instead of SystemError in case
warnings.onceregistry is not a dictionary. Patch by Oren Milman.

@item 
bpo-31344@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31344}: For finer control of tracing behaviour when testing the
interpreter, two new frame attributes have been added to control the
emission of particular trace events: @code{f_trace_lines} (@code{True} by
default) to turn off per-line trace events; and @code{f_trace_opcodes}
(@code{False} by default) to turn on per-opcode trace events.

@item 
bpo-31373@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31373}: Fix several possible instances of undefined behavior due to
floating-point demotions.

@item 
bpo-30465@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30465}: Location information (@code{lineno} and @code{col_offset}) in
f-strings is now (mostly) correct.  This fixes tools like flake8 from
showing warnings on the wrong line (typically the first line of the file).

@item 
bpo-30860@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30860}: Consolidate CPython’s global runtime state under a single
struct.  This improves discoverability of the runtime state.

@item 
bpo-31347@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31347}: Fix possible undefined behavior in _PyObject_FastCall_Prepend.

@item 
bpo-31343@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31343}: Include sys/sysmacros.h for major(), minor(), and makedev().
GNU C library plans to remove the functions from sys/types.h.

@item 
bpo-31291@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31291}: Fix an assertion failure in @code{zipimport.zipimporter.get_data}
on Windows, when the return value of @code{pathname.replace('/','\\')} isn’t
a string. Patch by Oren Milman.

@item 
bpo-31271@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31271}: Fix an assertion failure in the @code{write()} method of
@code{io.TextIOWrapper}, when the encoder doesn’t return a bytes object.
Patch by Oren Milman.

@item 
bpo-31243@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31243}: Fix a crash in some methods of @code{io.TextIOWrapper}, when the
decoder’s state is invalid. Patch by Oren Milman.

@item 
bpo-30721@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30721}: @code{print} now shows correct usage hint for using Python 2
redirection syntax.  Patch by Sanyam Khurana.

@item 
bpo-31070@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31070}: Fix a race condition in importlib _get_module_lock().

@item 
bpo-30747@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30747}: Add a non-dummy implementation of _Py_atomic_store and
_Py_atomic_load on MSVC.

@item 
bpo-31095@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31095}: Fix potential crash during GC caused by @code{tp_dealloc} which
doesn’t call @code{PyObject_GC_UnTrack()}.

@item 
bpo-31071@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31071}: Avoid masking original TypeError in call with * unpacking when
other arguments are passed.

@item 
bpo-30978@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30978}: str.format_map() now passes key lookup exceptions through.
Previously any exception was replaced with a KeyError exception.

@item 
bpo-30808@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30808}: Use _Py_atomic API for concurrency-sensitive signal state.

@item 
bpo-30876@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30876}: Relative import from unloaded package now reimports the package
instead of failing with SystemError.  Relative import from non-package now
fails with ImportError rather than SystemError.

@item 
bpo-30703@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30703}: Improve signal delivery. Avoid using Py_AddPendingCall from
signal handler, to avoid calling signal-unsafe functions. The tests I’m
adding here fail without the rest of the patch, on Linux and OS X. This
means our signal delivery logic had defects (some signals could be lost).

@item 
bpo-30765@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30765}: Avoid blocking in pthread_mutex_lock() when
PyThread_acquire_lock() is asked not to block.

@item 
bpo-31161@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31161}: Make sure the ‘Missing parentheses’ syntax error message is
only applied to SyntaxError, not to subclasses. Patch by Martijn Pieters.

@item 
bpo-30814@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30814}: Fixed a race condition when import a submodule from a package.

@item 
bpo-30736@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30736}: The internal unicodedata database has been upgraded to Unicode
10.0.

@item 
bpo-30604@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30604}: Move co_extra_freefuncs from per-thread to per-interpreter to
avoid crashes.

@item 
bpo-30597@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30597}: @code{print} now shows expected input in custom error message when
used as a Python 2 statement. Patch by Sanyam Khurana.

@item 
bpo-30682@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30682}: Removed a too-strict assertion that failed for certain
f-strings, such as eval(“f’\n’”) and eval(“f’\r’”).

@item 
bpo-30501@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30501}: The compiler now produces more optimal code for complex
condition expressions in the “if”, “while” and “assert” statement, the
“if” expression, and generator expressions and comprehensions.

@item 
bpo-28180@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28180}: Implement 
@geindex Python 향상 제안; PEP 538
PEP 538@footnote{https://peps.python.org/pep-0538/} (legacy C locale coercion). This means
that when a suitable coercion target locale is available, both the core
interpreter and locale-aware C extensions will assume the use of UTF-8 as
the default text encoding, rather than ASCII.

@item 
bpo-30486@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30486}: Allows setting cell values for __closure__. Patch by Lisa
Roach.

@item 
bpo-30537@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30537}: itertools.islice now accepts integer-like objects (having an
__index__ method) as start, stop, and slice arguments

@item 
bpo-25324@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25324}: Tokens needed for parsing in Python moved to C. @code{COMMENT},
@code{NL} and @code{ENCODING}. This way the tokens and tok_names in the token
module don’t get changed when you import the tokenize module.

@item 
bpo-29104@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29104}: Fixed parsing backslashes in f-strings.

@item 
bpo-27945@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27945}: Fixed various segfaults with dict when input collections are
mutated during searching, inserting or comparing.  Based on patches by
Duane Griffin and Tim Mitchell.

@item 
bpo-25794@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25794}: Fixed type.__setattr__() and type.__delattr__() for
non-interned attribute names.  Based on patch by Eryk Sun.

@item 
bpo-30039@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30039}: If a KeyboardInterrupt happens when the interpreter is in the
middle of resuming a chain of nested ‘yield from’ or ‘await’ calls, it’s
now correctly delivered to the innermost frame.

@item 
bpo-28974@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28974}: @code{object.__format__(x, '@w{'})} is now equivalent to @code{str(x)}
rather than @code{format(str(self), '@w{'})}.

@item 
bpo-30024@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30024}: Circular imports involving absolute imports with binding a
submodule to a name are now supported.

@item 
bpo-12414@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12414}: sys.getsizeof() on a code object now returns the sizes which
includes the code struct and sizes of objects which it references. Patch
by Donghee Na.

@item 
bpo-29839@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29839}: len() now raises ValueError rather than OverflowError if
__len__() returned a large negative integer.

@item 
bpo-11913@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11913}: README.rst is now included in the list of distutils standard
READMEs and therefore included in source distributions.

@item 
bpo-29914@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29914}: Fixed default implementations of __reduce__ and
__reduce_ex__(). object.__reduce__() no longer takes arguments,
object.__reduce_ex__() now requires one argument.

@item 
bpo-29949@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29949}: Fix memory usage regression of set and frozenset object.

@item 
bpo-29935@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29935}: Fixed error messages in the index() method of tuple, list and
deque when pass indices of wrong type.

@item 
bpo-29816@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29816}: Shift operation now has less opportunity to raise
OverflowError. ValueError always is raised rather than OverflowError for
negative counts. Shifting zero with non-negative count always returns
zero.

@item 
bpo-24821@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24821}: Fixed the slowing down to 25 times in the searching of some
unlucky Unicode characters.

@item 
bpo-29102@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29102}: Add a unique ID to PyInterpreterState.  This makes it easier to
identify each subinterpreter.

@item 
bpo-29894@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29894}: The deprecation warning is emitted if __complex__ returns an
instance of a strict subclass of complex.  In a future versions of Python
this can be an error.

@item 
bpo-29859@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29859}: Show correct error messages when any of the pthread_* calls in
thread_pthread.h fails.

@item 
bpo-29849@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29849}: Fix a memory leak when an ImportError is raised during from
import.

@item 
bpo-28856@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28856}: Fix an oversight that %b format for bytes should support
objects follow the buffer protocol.

@item 
bpo-29723@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29723}: The @code{sys.path[0]} initialization change for bpo-29139@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29139} caused
a regression by revealing an inconsistency in how sys.path is initialized
when executing @code{__main__} from a zipfile, directory, or other import
location. The interpreter now consistently avoids ever adding the import
location’s parent directory to @code{sys.path}, and ensures no other
@code{sys.path} entries are inadvertently modified when inserting the import
location named on the command line.

@item 
bpo-29568@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29568}: Escaped percent “%%” in the format string for classic string
formatting no longer allows any characters between two percents.

@item 
bpo-29714@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29714}: Fix a regression that bytes format may fail when containing
zero bytes inside.

@item 
bpo-29695@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29695}: bool(), float(), list() and tuple() no longer take keyword
arguments. The first argument of int() can now be passes only as
positional argument.

@item 
bpo-28893@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28893}: Set correct __cause__ for errors about invalid awaitables
returned from __aiter__ and __anext__.

@item 
bpo-28876@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28876}: @code{bool(range)} works even if @code{len(range)} raises
@ref{a81,,OverflowError}.

@item 
bpo-29683@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29683}: Fixes to memory allocation in _PyCode_SetExtra.  Patch by Brian
Coleman.

@item 
bpo-29684@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29684}: Fix minor regression of PyEval_CallObjectWithKeywords. It
should raise TypeError when kwargs is not a dict.  But it might cause segv
when args=NULL and kwargs is not a dict.

@item 
bpo-28598@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28598}: Support __rmod__ for subclasses of str being called before
str.__mod__. Patch by Martijn Pieters.

@item 
bpo-29607@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29607}: Fix stack_effect computation for CALL_FUNCTION_EX. Patch by
Matthieu Dartiailh.

@item 
bpo-29602@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29602}: Fix incorrect handling of signed zeros in complex constructor
for complex subclasses and for inputs having a __complex__ method. Patch
by Serhiy Storchaka.

@item 
bpo-29347@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29347}: Fixed possibly dereferencing undefined pointers when creating
weakref objects.

@item 
bpo-29463@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29463}: Add @code{docstring} field to Module, ClassDef, FunctionDef, and
AsyncFunctionDef ast nodes.  docstring is not first stmt in their body
anymore.  It affects @code{co_firstlineno} and @code{co_lnotab} of code object
for module and class. (Reverted in bpo-32911@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32911}.)

@item 
bpo-29438@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29438}: Fixed use-after-free problem in key sharing dict.

@item 
bpo-29546@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29546}: Set the ‘path’ and ‘name’ attribute on ImportError for @code{from
... import ...}.

@item 
bpo-29546@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29546}: Improve from-import error message with location

@item 
bpo-29478@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29478}: If max_line_length=None is specified while using the Compat32
policy, it is no longer ignored.  Patch by Mircea Cosbuc.

@item 
bpo-29319@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29319}: Prevent RunMainFromImporter overwriting sys.path[0].

@item 
bpo-29337@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29337}: Fixed possible BytesWarning when compare the code objects.
Warnings could be emitted at compile time.

@item 
bpo-29327@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29327}: Fixed a crash when pass the iterable keyword argument to
sorted().

@item 
bpo-29034@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29034}: Fix memory leak and use-after-free in os module
(path_converter).

@item 
bpo-29159@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29159}: Fix regression in bytes(x) when x.__index__() raises Exception.

@item 
bpo-29049@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29049}: Call _PyObject_GC_TRACK() lazily when calling Python function.
Calling function is up to 5% faster.

@item 
bpo-28927@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28927}: bytes.fromhex() and bytearray.fromhex() now ignore all ASCII
whitespace, not only spaces.  Patch by Robert Xiao.

@item 
bpo-28932@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28932}: Do not include <sys/random.h> if it does not exist.

@item 
bpo-25677@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25677}: Correct the positioning of the syntax error caret for indented
blocks. Based on patch by Michael Layzell.

@item 
bpo-29000@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29000}: Fixed bytes formatting of octals with zero padding in alternate
form.

@item 
bpo-18896@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18896}: Python function can now have more than 255 parameters.
collections.namedtuple() now supports tuples with more than 255 elements.

@item 
bpo-28596@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28596}: The preferred encoding is UTF-8 on Android. Patch written by
Chi Hsuan Yen.

@item 
bpo-22257@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22257}: Clean up interpreter startup (see 
@geindex Python 향상 제안; PEP 432
PEP 432@footnote{https://peps.python.org/pep-0432/}).

@item 
bpo-26919@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26919}: On Android, operating system data is now always encoded/decoded
to/from UTF-8, instead of the locale encoding to avoid inconsistencies
with os.fsencode() and os.fsdecode() which are already using UTF-8.

@item 
bpo-28991@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28991}: functools.lru_cache() was susceptible to an obscure reentrancy
bug triggerable by a monkey-patched len() function.

@item 
bpo-28147@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28147}: Fix a memory leak in split-table dictionaries: setattr() must
not convert combined table into split table. Patch written by INADA Naoki.

@item 
bpo-28739@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28739}: f-string expressions are no longer accepted as docstrings and
by ast.literal_eval() even if they do not include expressions.

@item 
bpo-28512@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28512}: Fixed setting the offset attribute of SyntaxError by
PyErr_SyntaxLocationEx() and PyErr_SyntaxLocationObject().

@item 
bpo-28918@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28918}: Fix the cross compilation of xxlimited when Python has been
built with Py_DEBUG defined.

@item 
bpo-23722@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23722}: Rather than silently producing a class that doesn’t support
zero-argument @code{super()} in methods, failing to pass the new
@code{__classcell__} namespace entry up to @code{type.__new__} now results in a
@code{DeprecationWarning} and a class that supports zero-argument
@code{super()}.

@item 
bpo-28797@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28797}: Modifying the class __dict__ inside the __set_name__ method of
a descriptor that is used inside that class no longer prevents calling the
__set_name__ method of other descriptors.

@item 
bpo-28799@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28799}: Remove the @code{PyEval_GetCallStats()} function and deprecate the
untested and undocumented @code{sys.callstats()} function. Remove the
@code{CALL_PROFILE} special build: use the @ref{1703,,sys.setprofile()} function,
@ref{2b,,cProfile} or @ref{b4,,profile} to profile function calls.

@item 
bpo-12844@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12844}: More than 255 arguments can now be passed to a function.

@item 
bpo-28782@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28782}: Fix a bug in the implementation @code{yield from} when checking if
the next instruction is YIELD_FROM. Regression introduced by WORDCODE
(bpo-26647@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26647}).

@item 
bpo-28774@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28774}: Fix error position of the unicode error in ASCII and Latin1
encoders when a string returned by the error handler contains multiple
non-encodable characters (non-ASCII for the ASCII codec, characters out of
the U+0000-U+00FF range for Latin1).

@item 
bpo-28731@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28731}: Optimize _PyDict_NewPresized() to create correct size dict.
Improve speed of dict literal with constant keys up to 30%.

@item 
bpo-28532@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28532}: Show sys.version when -V option is supplied twice.

@item 
bpo-27100@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27100}: The with-statement now checks for __enter__ before it checks
for __exit__. This gives less confusing error messages when both methods
are missing. Patch by Jonathan Ellington.

@item 
bpo-28746@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28746}: Fix the set_inheritable() file descriptor method on platforms
that do not have the ioctl FIOCLEX and FIONCLEX commands.

@item 
bpo-26920@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26920}: Fix not getting the locale’s charset upon initializing the
interpreter, on platforms that do not have langinfo.

@item 
bpo-28648@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28648}: Fixed crash in Py_DecodeLocale() in debug build on Mac OS X
when decode astral characters.  Patch by Xiang Zhang.

@item 
bpo-28665@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28665}: Improve speed of the STORE_DEREF opcode by 40%.

@item 
bpo-19398@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19398}: Extra slash no longer added to sys.path components in case of
empty compile-time PYTHONPATH components.

@item 
bpo-28621@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28621}: Sped up converting int to float by reusing faster bits counting
implementation.  Patch by Adrian Wielgosik.

@item 
bpo-28580@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28580}: Optimize iterating split table values. Patch by Xiang Zhang.

@item 
bpo-28583@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28583}: PyDict_SetDefault didn’t combine split table when needed. Patch
by Xiang Zhang.

@item 
bpo-28128@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28128}: Deprecation warning for invalid str and byte escape sequences
now prints better information about where the error occurs. Patch by
Serhiy Storchaka and Eric Smith.

@item 
bpo-28509@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28509}: dict.update() no longer allocate unnecessary large memory.

@item 
bpo-28426@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28426}: Fixed potential crash in PyUnicode_AsDecodedObject() in debug
build.

@item 
bpo-28517@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28517}: Fixed of-by-one error in the peephole optimizer that caused
keeping unreachable code.

@item 
bpo-28214@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28214}: Improved exception reporting for problematic __set_name__
attributes.

@item 
bpo-23782@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23782}: Fixed possible memory leak in _PyTraceback_Add() and exception
loss in PyTraceBack_Here().

@item 
bpo-28183@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28183}: Optimize and cleanup dict iteration.

@item 
bpo-26081@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26081}: Added C implementation of asyncio.Future. Original patch by
Yury Selivanov.

@item 
bpo-28379@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28379}: Added sanity checks and tests for PyUnicode_CopyCharacters().
Patch by Xiang Zhang.

@item 
bpo-28376@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28376}: The type of long range iterator is now registered as Iterator.
Patch by Oren Milman.

@item 
bpo-28376@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28376}: Creating instances of range_iterator by calling range_iterator
type now is disallowed.  Calling iter() on range instance is the only way.
Patch by Oren Milman.

@item 
bpo-26906@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26906}: Resolving special methods of uninitialized type now causes
implicit initialization of the type instead of a fail.

@item 
bpo-18287@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18287}: PyType_Ready() now checks that tp_name is not NULL. Original
patch by Niklas Koep.

@item 
bpo-24098@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24098}: Fixed possible crash when AST is changed in process of
compiling it.

@item 
bpo-28201@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28201}: Dict reduces possibility of 2nd conflict in hash table when
hashes have same lower bits.

@item 
bpo-28350@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28350}: String constants with null character no longer interned.

@item 
bpo-26617@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26617}: Fix crash when GC runs during weakref callbacks.

@item 
bpo-27942@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27942}: String constants now interned recursively in tuples and
frozensets.

@item 
bpo-28289@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28289}: ImportError.__init__ now resets not specified attributes.

@item 
bpo-21578@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21578}: Fixed misleading error message when ImportError called with
invalid keyword args.

@item 
bpo-28203@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28203}: Fix incorrect type in complex(1.0, @{2:3@}) error message. Patch
by Soumya Sharma.

@item 
bpo-28086@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28086}: Single var-positional argument of tuple subtype was passed
unscathed to the C-defined function.  Now it is converted to exact tuple.

@item 
bpo-28214@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28214}: Now __set_name__ is looked up on the class instead of the
instance.

@item 
bpo-27955@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27955}: Fallback on reading /dev/urandom device when the getrandom()
syscall fails with EPERM, for example when blocked by SECCOMP.

@item 
bpo-28192@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28192}: Don’t import readline in isolated mode.

@item 
bpo-27441@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27441}: Remove some redundant assignments to ob_size in longobject.c.
Thanks Oren Milman.

@item 
bpo-27222@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27222}: Clean up redundant code in long_rshift function. Thanks Oren
Milman.

@item 
Upgrade internal unicode databases to Unicode version 9.0.0.

@item 
bpo-28131@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28131}: Fix a regression in zipimport’s compile_source().  zipimport
should use the same optimization level as the interpreter.

@item 
bpo-28126@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28126}: Replace Py_MEMCPY with memcpy(). Visual Studio can properly
optimize memcpy().

@item 
bpo-28120@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28120}: Fix dict.pop() for split dictionary when trying to remove a
“pending key” (Not yet inserted in split-table). Patch by Xiang Zhang.

@item 
bpo-26182@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26182}: Raise DeprecationWarning when async and await keywords are used
as variable/attribute/class/function name.

@item 
bpo-26182@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26182}: Fix a refleak in code that raises DeprecationWarning.

@item 
bpo-28721@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28721}: Fix asynchronous generators aclose() and athrow() to handle
StopAsyncIteration propagation properly.

@item 
bpo-26110@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26110}: Speed-up method calls: add LOAD_METHOD and CALL_METHOD opcodes.
@end itemize

@node Library<173>,Documentation<66>,Core and Builtins<169>,Python 3 7 0 alpha 1
@anchor{whatsnew/changelog id838}@anchor{1e94}
@subsubsection Library



@itemize -

@item 
bpo-31499@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31499}: xml.etree: Fix a crash when a parser is part of a reference
cycle.

@item 
bpo-31482@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31482}: @code{random.seed()} now works with bytes in version=1

@item 
bpo-28556@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28556}: typing.get_type_hints now finds the right globalns for classes
and modules by default (when no @code{globalns} was specified by the caller).

@item 
bpo-28556@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28556}: Speed improvements to the @code{typing} module.  Original PRs by
Ivan Levkivskyi and Mitar.

@item 
bpo-31544@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31544}: The C accelerator module of ElementTree ignored exceptions
raised when looking up TreeBuilder target methods in XMLParser().

@item 
bpo-31234@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31234}: socket.create_connection() now fixes manually a reference
cycle: clear the variable storing the last exception on success.

@item 
bpo-31457@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31457}: LoggerAdapter objects can now be nested.

@item 
bpo-31431@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31431}: SSLContext.check_hostname now automatically sets
SSLContext.verify_mode to ssl.CERT_REQUIRED instead of failing with a
ValueError.

@item 
bpo-31233@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31233}: socketserver.ThreadingMixIn now keeps a list of non-daemonic
threads to wait until all these threads complete in server_close().

@item 
bpo-28638@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28638}: Changed the implementation strategy for
collections.namedtuple() to substantially reduce the use of exec() in
favor of precomputed methods. As a result, the `verbose' parameter and
`_source' attribute are no longer supported.  The benefits include 1)
having a smaller memory footprint for applications using multiple named
tuples, 2) faster creation of the named tuple class (approx 4x to 6x
depending on how it is measured), and 3) minor speed-ups for instance
creation using __new__, _make, and _replace.  (The primary patch
contributor is Jelle Zijlstra with further improvements by INADA Naoki,
Serhiy Storchaka, and Raymond Hettinger.)

@item 
bpo-31400@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31400}: Improves SSL error handling to avoid losing error numbers.

@item 
bpo-27629@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27629}: Make return types of SSLContext.wrap_bio() and
SSLContext.wrap_socket() customizable.

@item 
bpo-28958@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28958}: ssl.SSLContext() now uses OpenSSL error information when a
context cannot be instantiated.

@item 
bpo-28182@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28182}: The SSL module now raises SSLCertVerificationError when OpenSSL
fails to verify the peer’s certificate. The exception contains more
information about the error.

@item 
bpo-27340@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27340}: SSLSocket.sendall() now uses memoryview to create slices of
data. This fixes support for all bytes-like object. It is also more
efficient and avoids costly copies.

@item 
bpo-14191@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14191}: A new function
@code{argparse.ArgumentParser.parse_intermixed_args} provides the ability to
parse command lines where there user intermixes options and positional
arguments.

@item 
bpo-31178@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31178}: Fix string concatenation bug in rare error path in the
subprocess module

@item 
bpo-31350@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31350}: Micro-optimize @code{asyncio._get_running_loop()} to become up
to 10% faster.

@item 
bpo-31170@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31170}: expat: Update libexpat from 2.2.3 to 2.2.4. Fix copying of
partial characters for UTF-8 input (libexpat bug 115):
@indicateurl{https://github.com/libexpat/libexpat/issues/115}

@item 
bpo-29136@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29136}: Add TLS 1.3 cipher suites and OP_NO_TLSv1_3.

@item 
bpo-1198569@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1198569}: @code{string.Template} subclasses can optionally define
@code{braceidpattern} if they want to specify different placeholder patterns
inside and outside the braces.  If None (the default) it falls back to
@code{idpattern}.

@item 
bpo-31326@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31326}: concurrent.futures.ProcessPoolExecutor.shutdown() now
explicitly closes the call queue. Moreover, shutdown(wait=True) now also
join the call queue thread, to prevent leaking a dangling thread.

@item 
bpo-27144@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27144}: The @code{map()} and @code{as_completed()} iterators in
@code{concurrent.futures} now avoid keeping a reference to yielded objects.

@item 
bpo-31281@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31281}: Fix @code{fileinput.FileInput(files, inplace=True)} when @code{files}
contain @code{pathlib.Path} objects.

@item 
bpo-10746@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10746}: Fix ctypes producing wrong 
@geindex Python 향상 제안; PEP 3118
PEP 3118@footnote{https://peps.python.org/pep-3118/} type codes for integer
types.

@item 
bpo-27584@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27584}: @code{AF_VSOCK} has been added to the socket interface which
allows communication between virtual machines and their host.

@item 
bpo-22536@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22536}: The subprocess module now sets the filename when
FileNotFoundError is raised on POSIX systems due to the executable or cwd
not being found.

@item 
bpo-29741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29741}: Update some methods in the _pyio module to also accept integer
types. Patch by Oren Milman.

@item 
bpo-31249@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31249}: concurrent.futures: WorkItem.run() used by ThreadPoolExecutor
now breaks a reference cycle between an exception object and the WorkItem
object.

@item 
bpo-31247@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31247}: xmlrpc.server now explicitly breaks reference cycles when using
sys.exc_info() in code handling exceptions.

@item 
bpo-23835@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23835}: configparser: reading defaults in the @code{ConfigParser()}
constructor is now using @code{read_dict()}, making its behavior consistent
with the rest of the parser.  Non-string keys and values in the defaults
dictionary are now being implicitly converted to strings.  Patch by James
Tocknell.

@item 
bpo-31238@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31238}: pydoc: the stop() method of the private ServerThread class now
waits until DocServer.serve_until_quit() completes and then explicitly
sets its docserver attribute to None to break a reference cycle.

@item 
bpo-5001@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5001}: Many asserts in @code{multiprocessing} are now more informative,
and some error types have been changed to more specific ones.

@item 
bpo-31109@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31109}: Convert zipimport to use Argument Clinic.

@item 
bpo-30102@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30102}: The ssl and hashlib modules now call
OPENSSL_add_all_algorithms_noconf() on OpenSSL < 1.1.0. The function
detects CPU features and enables optimizations on some CPU architectures
such as POWER8. Patch is based on research from Gustavo Serra Scalet.

@item 
bpo-18966@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18966}: Non-daemonic threads created by a multiprocessing.Process are
now joined on child exit.

@item 
bpo-31183@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31183}: @code{dis} now works with asynchronous generator and coroutine
objects. Patch by George Collins based on diagnosis by Luciano Ramalho.

@item 
bpo-5001@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5001}: There are a number of uninformative asserts in the
@code{multiprocessing} module, as noted in issue 5001. This change fixes two
of the most potentially problematic ones, since they are in
error-reporting code, in the @code{multiprocessing.managers.convert_to_error}
function. (It also makes more informative a ValueError message.) The only
potentially problematic change is that the AssertionError is now a
TypeError; however, this should also help distinguish it from an
AssertionError being `reported' by the function/its caller (such as in
issue 31169). - Patch by Allen W. Smith (drallensmith on github).

@item 
bpo-31185@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31185}: Fixed miscellaneous errors in asyncio speedup module.

@item 
bpo-31151@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31151}: socketserver.ForkingMixIn.server_close() now waits until all
child processes completed to prevent leaking zombie processes.

@item 
bpo-31072@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31072}: Add an @code{include_file} parameter to
@code{zipapp.create_archive()}

@item 
bpo-24700@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24700}: Optimize array.array comparison. It is now from 10x up to 70x
faster when comparing arrays holding values of the same integer type.

@item 
bpo-31135@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31135}: ttk: fix the destroy() method of LabeledScale and OptionMenu
classes. Call the parent destroy() method even if the used attribute
doesn’t exist. The LabeledScale.destroy() method now also explicitly
clears label and scale attributes to help the garbage collector to destroy
all widgets.

@item 
bpo-31107@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31107}: Fix @code{copyreg._slotnames()} mangled attribute calculation for
classes whose name begins with an underscore. Patch by Shane Harvey.

@item 
bpo-31080@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31080}: Allow @code{logging.config.fileConfig} to accept kwargs and/or
args.

@item 
bpo-30897@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30897}: @code{pathlib.Path} objects now include an @code{is_mount()} method
(only implemented on POSIX).  This is similar to @code{os.path.ismount(p)}.
Patch by Cooper Ry Lees.

@item 
bpo-31061@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31061}: Fixed a crash when using asyncio and threads.

@item 
bpo-30987@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30987}: Added support for CAN ISO-TP protocol in the socket module.

@item 
bpo-30522@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30522}: Added a @code{setStream} method to @code{logging.StreamHandler} to
allow the stream to be set after creation.

@item 
bpo-30502@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30502}: Fix handling of long oids in ssl.  Based on patch by Christian
Heimes.

@item 
bpo-5288@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5288}: Support tzinfo objects with sub-minute offsets.

@item 
bpo-30919@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30919}: Fix shared memory performance regression in multiprocessing in
3.x. Shared memory used anonymous memory mappings in 2.x, while 3.x mmaps
actual files. Try to be careful to do as little disk I/O as possible.

@item 
bpo-26732@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26732}: Fix too many fds in processes started with the “forkserver”
method. A child process would inherit as many fds as the number of
still-running children.

@item 
bpo-29403@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29403}: Fix @code{unittest.mock}’s autospec to not fail on method-bound
builtin functions.  Patch by Aaron Gallagher.

@item 
bpo-30961@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30961}: Fix decrementing a borrowed reference in tracemalloc.

@item 
bpo-19896@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19896}: Fix multiprocessing.sharedctypes to recognize typecodes @code{'q'}
and @code{'Q'}.

@item 
bpo-30946@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30946}: Remove obsolete code in readline module for platforms where GNU
readline is older than 2.1 or where select() is not available.

@item 
bpo-25684@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25684}: Change @code{ttk.OptionMenu} radiobuttons to be unique across
instances of @code{OptionMenu}.

@item 
bpo-30886@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30886}: Fix multiprocessing.Queue.join_thread(): it now waits until the
thread completes, even if the thread was started by the same process which
created the queue.

@item 
bpo-29854@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29854}: Fix segfault in readline when using readline’s history-size
option.  Patch by Nir Soffer.

@item 
bpo-30794@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30794}: Added multiprocessing.Process.kill method to terminate using
the SIGKILL signal on Unix.

@item 
bpo-30319@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30319}: socket.close() now ignores ECONNRESET error.

@item 
bpo-30828@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30828}: Fix out of bounds write in
@code{asyncio.CFuture.remove_done_callback()}.

@item 
bpo-30302@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30302}: Use keywords in the @code{repr} of @code{datetime.timedelta}.

@item 
bpo-30807@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30807}: signal.setitimer() may disable the timer when passed a tiny
value. Tiny values (such as 1e-6) are valid non-zero values for
setitimer(), which is specified as taking microsecond-resolution
intervals. However, on some platform, our conversion routine could convert
1e-6 into a zero interval, therefore disabling the timer instead of
(re-)scheduling it.

@item 
bpo-30441@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30441}: Fix bug when modifying os.environ while iterating over it

@item 
bpo-29585@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29585}: Avoid importing @code{sysconfig} from @code{site} to improve startup
speed. Python startup is about 5% faster on Linux and 30% faster on macOS.

@item 
bpo-29293@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29293}: Add missing parameter “n” on
multiprocessing.Condition.notify(). The doc claims
multiprocessing.Condition behaves like threading.Condition, but its
notify() method lacked the optional “n” argument (to specify the number of
sleepers to wake up) that threading.Condition.notify() accepts.

@item 
bpo-30532@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30532}: Fix email header value parser dropping folding white space in
certain cases.

@item 
bpo-30596@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30596}: Add a @code{close()} method to @code{multiprocessing.Process}.

@item 
bpo-9146@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9146}: Fix a segmentation fault in _hashopenssl when standard hash
functions such as md5 are not available in the linked OpenSSL library.  As
in some special FIPS-140 build environments.

@item 
bpo-29169@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29169}: Update zlib to 1.2.11.

@item 
bpo-30119@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30119}: ftplib.FTP.putline() now throws ValueError on commands that
contains CR or LF. Patch by Donghee Na.

@item 
bpo-30879@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30879}: os.listdir() and os.scandir() now emit bytes names when called
with bytes-like argument.

@item 
bpo-30746@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30746}: Prohibited the ‘=’ character in environment variable names in
@code{os.putenv()} and @code{os.spawn*()}.

@item 
bpo-30664@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30664}: The description of a unittest subtest now preserves the order
of keyword arguments of TestCase.subTest().

@item 
bpo-21071@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21071}: struct.Struct.format type is now @ref{169,,str} instead of
@ref{192,,bytes}.

@item 
bpo-29212@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29212}: Fix concurrent.futures.thread.ThreadPoolExecutor threads to
have a non repr() based thread name by default when no thread_name_prefix
is supplied. They will now identify themselves as
“ThreadPoolExecutor-y_n”.

@item 
bpo-29755@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29755}: Fixed the lgettext() family of functions in the gettext module.
They now always return bytes.

@item 
bpo-30616@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30616}: Functional API of enum allows to create empty enums. Patched by
Donghee Na

@item 
bpo-30038@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30038}: Fix race condition between signal delivery and wakeup file
descriptor. Patch by Nathaniel Smith.

@item 
bpo-23894@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23894}: lib2to3 now recognizes @code{rb'...'} and @code{f'...'} strings.

@item 
bpo-24744@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24744}: pkgutil.walk_packages function now raises ValueError if `path'
is a string. Patch by Sanyam Khurana.

@item 
bpo-24484@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24484}: Avoid race condition in multiprocessing cleanup.

@item 
bpo-30589@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30589}: Fix multiprocessing.Process.exitcode to return the opposite of
the signal number when the process is killed by a signal (instead of 255)
when using the “forkserver” method.

@item 
bpo-28994@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28994}: The traceback no longer displayed for SystemExit raised in a
callback registered by atexit.

@item 
bpo-30508@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30508}: Don’t log exceptions if Task/Future “cancel()” method was
called.

@item 
bpo-30645@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30645}: Fix path calculation in @code{imp.load_package()}, fixing it for
cases when a package is only shipped with bytecodes. Patch by Alexandru
Ardelean.

@item 
bpo-11822@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11822}: The dis.dis() function now is able to disassemble nested code
objects.

@item 
bpo-30624@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30624}: selectors does not take KeyboardInterrupt and SystemExit into
account, leaving a fd in a bad state in case of error. Patch by Giampaolo
Rodola’.

@item 
bpo-30595@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30595}: multiprocessing.Queue.get() with a timeout now polls its reader
in non-blocking mode if it succeeded to acquire the lock but the acquire
took longer than the timeout.

@item 
bpo-28556@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28556}: Updates to typing module: Add generic AsyncContextManager, add
support for ContextManager on all versions. Original PRs by Jelle Zijlstra
and Ivan Levkivskyi

@item 
bpo-30605@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30605}: re.compile() no longer raises a BytesWarning when compiling a
bytes instance with misplaced inline modifier.  Patch by Roy Williams.

@item 
bpo-29870@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29870}: Fix ssl sockets leaks when connection is aborted in asyncio/ssl
implementation. Patch by Michaël Sghaïer.

@item 
bpo-29743@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29743}: Closing transport during handshake process leaks open socket.
Patch by Nikolay Kim

@item 
bpo-27585@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27585}: Fix waiter cancellation in asyncio.Lock. Patch by Mathieu
Sornay.

@item 
bpo-30014@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30014}: modify() method of poll(), epoll() and devpoll() based classes
of selectors module is around 10% faster.  Patch by Giampaolo Rodola’.

@item 
bpo-30418@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30418}: On Windows, subprocess.Popen.communicate() now also ignore
EINVAL on stdin.write() if the child process is still running but closed
the pipe.

@item 
bpo-30463@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30463}: Added empty __slots__ to abc.ABC.  This allows subclassers to
deny __dict__ and __weakref__ creation.  Patch by Aaron Hall.

@item 
bpo-30520@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30520}: Loggers are now pickleable.

@item 
bpo-30557@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30557}: faulthandler now correctly filters and displays exception codes
on Windows

@item 
bpo-30526@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30526}: Add TextIOWrapper.reconfigure() and a
TextIOWrapper.write_through attribute.

@item 
bpo-30245@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30245}: Fix possible overflow when organize struct.pack_into error
message.  Patch by Yuan Liu.

@item 
bpo-30378@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30378}: Fix the problem that logging.handlers.SysLogHandler cannot
handle IPv6 addresses.

@item 
bpo-16500@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16500}: Allow registering at-fork handlers.

@item 
bpo-30470@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30470}: Deprecate invalid ctypes call protection on Windows.  Patch by
Mariatta Wijaya.

@item 
bpo-30414@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30414}: multiprocessing.Queue._feed background running thread do not
break from main loop on exception.

@item 
bpo-30003@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30003}: Fix handling escape characters in HZ codec.  Based on patch by
Ma Lin.

@item 
bpo-30149@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30149}: inspect.signature() now supports callables with
variable-argument parameters wrapped with partialmethod. Patch by Donghee
Na.

@item 
bpo-30436@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30436}: importlib.find_spec() raises ModuleNotFoundError instead of
AttributeError if the specified parent module is not a package (i.e. lacks
a __path__ attribute).

@item 
bpo-30301@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30301}: Fix AttributeError when using SimpleQueue.empty() under `spawn'
and `forkserver' start methods.

@item 
bpo-30375@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30375}: Warnings emitted when compile a regular expression now always
point to the line in the user code.  Previously they could point into
inners of the re module if emitted from inside of groups or conditionals.

@item 
bpo-30329@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30329}: imaplib and poplib now catch the Windows socket WSAEINVAL error
(code 10022) on shutdown(SHUT_RDWR): An invalid operation was attempted.
This error occurs sometimes on SSL connections.

@item 
bpo-29196@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29196}: Removed previously deprecated in Python 2.4 classes Plist, Dict
and _InternalDict in the plistlib module.  Dict values in the result of
functions readPlist() and readPlistFromBytes() are now normal dicts.  You
no longer can use attribute access to access items of these dictionaries.

@item 
bpo-9850@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9850}: The @code{macpath} is now deprecated and will be removed in
Python 3.8.

@item 
bpo-30299@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30299}: Compiling regular expression in debug mode on CPython now
displays the compiled bytecode in human readable form.

@item 
bpo-30048@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30048}: Fixed @code{Task.cancel()} can be ignored when the task is running
coroutine and the coroutine returned without any more @code{await}.

@item 
bpo-30266@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30266}: contextlib.AbstractContextManager now supports
anti-registration by setting __enter__ = None or __exit__ = None,
following the pattern introduced in bpo-25958@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25958}. Patch by Jelle Zijlstra.

@item 
bpo-30340@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30340}: Enhanced regular expressions optimization. This increased the
performance of matching some patterns up to 25 times.

@item 
bpo-30298@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30298}: Weaken the condition of deprecation warnings for inline
modifiers. Now allowed several subsequential inline modifiers at the start
of the pattern (e.g. @code{'(?i)(?s)...'}).  In verbose mode whitespaces and
comments now are allowed before and between inline modifiers (e.g. @code{'(?x)
(?i) (?s)...'}).

@item 
bpo-30285@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30285}: Optimized case-insensitive matching and searching of regular
expressions.

@item 
bpo-29990@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29990}: Fix range checking in GB18030 decoder.  Original patch by Ma
Lin.

@item 
bpo-29979@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29979}: rewrite cgi.parse_multipart, reusing the FieldStorage class and
making its results consistent with those of FieldStorage for
multipart/form-data requests. Patch by Pierre Quentel.

@item 
bpo-30243@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30243}: Removed the __init__ methods of _json’s scanner and encoder.
Misusing them could cause memory leaks or crashes.  Now scanner and
encoder objects are completely initialized in the __new__ methods.

@item 
bpo-30215@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30215}: Compiled regular expression objects with the re.LOCALE flag no
longer depend on the locale at compile time.  Only the locale at matching
time affects the result of matching.

@item 
bpo-30185@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30185}: Avoid KeyboardInterrupt tracebacks in forkserver helper process
when Ctrl-C is received.

@item 
bpo-30103@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30103}: binascii.b2a_uu() and uu.encode() now support using @code{'`'} as
zero instead of space.

@item 
bpo-28556@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28556}: Various updates to typing module: add typing.NoReturn type, use
WrapperDescriptorType, minor bug-fixes.  Original PRs by Jim
Fasarakis-Hilliard and Ivan Levkivskyi.

@item 
bpo-30205@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30205}: Fix getsockname() for unbound AF_UNIX sockets on Linux.

@item 
bpo-30228@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30228}: The seek() and tell() methods of io.FileIO now set the internal
seekable attribute to avoid one syscall on open() (in buffered or text
mode).

@item 
bpo-30190@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30190}: unittest’s assertAlmostEqual and assertNotAlmostEqual provide a
better message in case of failure which includes the difference between
left and right arguments.  (patch by Giampaolo Rodola’)

@item 
bpo-30101@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30101}: Add support for curses.A_ITALIC.

@item 
bpo-29822@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29822}: inspect.isabstract() now works during __init_subclass__.  Patch
by Nate Soares.

@item 
bpo-29960@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29960}: Preserve generator state when _random.Random.setstate() raises
an exception. Patch by Bryan Olson.

@item 
bpo-30070@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30070}: Fixed leaks and crashes in errors handling in the parser
module.

@item 
bpo-22352@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22352}: Column widths in the output of dis.dis() are now adjusted for
large line numbers and instruction offsets.

@item 
bpo-30061@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30061}: Fixed crashes in IOBase methods __next__() and readlines() when
readline() or __next__() respectively return non-sizeable object. Fixed
possible other errors caused by not checking results of PyObject_Size(),
PySequence_Size(), or PyMapping_Size().

@item 
bpo-30218@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30218}: Fix PathLike support for shutil.unpack_archive. Patch by Jelle
Zijlstra.

@item 
bpo-10076@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10076}: Compiled regular expression and match objects in the re module
now support copy.copy() and copy.deepcopy() (they are considered atomic).

@item 
bpo-30068@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30068}: _io._IOBase.readlines will check if it’s closed first when hint
is present.

@item 
bpo-29694@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29694}: Fixed race condition in pathlib mkdir with flags parents=True.
Patch by Armin Rigo.

@item 
bpo-29692@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29692}: Fixed arbitrary unchaining of RuntimeError exceptions in
contextlib.contextmanager.  Patch by Siddharth Velankar.

@item 
bpo-26187@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26187}: Test that sqlite3 trace callback is not called multiple times
when schema is changing.  Indirectly fixed by switching to use
sqlite3_prepare_v2() in bpo-9303@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9303}.  Patch by Aviv Palivoda.

@item 
bpo-30017@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30017}: Allowed calling the close() method of the zip entry writer
object multiple times.  Writing to a closed writer now always produces a
ValueError.

@item 
bpo-29998@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29998}: Pickling and copying ImportError now preserves name and path
attributes.

@item 
bpo-29995@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29995}: re.escape() now escapes only regex special characters.

@item 
bpo-29962@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29962}: Add math.remainder operation, implementing remainder as
specified in IEEE 754.

@item 
bpo-29649@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29649}: Improve struct.pack_into() exception messages for problems with
the buffer size and offset.  Patch by Andrew Nester.

@item 
bpo-29654@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29654}: Support If-Modified-Since HTTP header (browser cache).  Patch
by Pierre Quentel.

@item 
bpo-29931@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29931}: Fixed comparison check for ipaddress.ip_interface objects.
Patch by Sanjay Sundaresan.

@item 
bpo-29953@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29953}: Fixed memory leaks in the replace() method of datetime and time
objects when pass out of bound fold argument.

@item 
bpo-29942@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29942}: Fix a crash in itertools.chain.from_iterable when encountering
long runs of empty iterables.

@item 
bpo-10030@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10030}: Sped up reading encrypted ZIP files by 2 times.

@item 
bpo-29204@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29204}: Element.getiterator() and the html parameter of XMLParser()
were deprecated only in the documentation (since Python 3.2 and 3.4
correspondingly). Now using them emits a deprecation warning.

@item 
bpo-27863@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27863}: Fixed multiple crashes in ElementTree caused by race conditions
and wrong types.

@item 
bpo-25996@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25996}: Added support of file descriptors in os.scandir() on Unix.
os.fwalk() is sped up by 2 times by using os.scandir().

@item 
bpo-28699@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28699}: Fixed a bug in pools in multiprocessing.pool that raising an
exception at the very first of an iterable may swallow the exception or
make the program hang. Patch by Davin Potts and Xiang Zhang.

@item 
bpo-23890@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23890}: unittest.TestCase.assertRaises() now manually breaks a
reference cycle to not keep objects alive longer than expected.

@item 
bpo-29901@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29901}: The zipapp module now supports general path-like objects, not
just pathlib.Path.

@item 
bpo-25803@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25803}: Avoid incorrect errors raised by Path.mkdir(exist_ok=True) when
the OS gives priority to errors such as EACCES over EEXIST.

@item 
bpo-29861@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29861}: Release references to tasks, their arguments and their results
as soon as they are finished in multiprocessing.Pool.

@item 
bpo-19930@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19930}: The mode argument of os.makedirs() no longer affects the file
permission bits of newly created intermediate-level directories.

@item 
bpo-29884@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29884}: faulthandler: Restore the old sigaltstack during teardown.
Patch by Christophe Zeitouny.

@item 
bpo-25455@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25455}: Fixed crashes in repr of recursive buffered file-like objects.

@item 
bpo-29800@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29800}: Fix crashes in partial.__repr__ if the keys of partial.keywords
are not strings.  Patch by Michael Seifert.

@item 
bpo-8256@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8256}: Fixed possible failing or crashing input() if attributes
“encoding” or “errors” of sys.stdin or sys.stdout are not set or are not
strings.

@item 
bpo-28692@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28692}: Using non-integer value for selecting a plural form in gettext
is now deprecated.

@item 
bpo-26121@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26121}: Use C library implementation for math functions erf() and
erfc().

@item 
bpo-29619@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29619}: os.stat() and os.DirEntry.inode() now convert inode (st_ino)
using unsigned integers.

@item 
bpo-28298@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28298}: Fix a bug that prevented array ‘Q’, ‘L’ and ‘I’ from accepting
big intables (objects that have __int__) as elements.

@item 
bpo-29645@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29645}: Speed up importing the webbrowser module.
webbrowser.register() is now thread-safe.

@item 
bpo-28231@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28231}: The zipfile module now accepts path-like objects for external
paths.

@item 
bpo-26915@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26915}: index() and count() methods of collections.abc.Sequence now
check identity before checking equality when do comparisons.

@item 
bpo-28682@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28682}: Added support for bytes paths in os.fwalk().

@item 
bpo-29728@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29728}: Add new @code{socket.TCP_NOTSENT_LOWAT} (Linux 3.12)
constant. Patch by Nathaniel J. Smith.

@item 
bpo-29623@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29623}: Allow use of path-like object as a single argument in
ConfigParser.read(). Patch by David Ellis.

@item 
bpo-9303@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9303}: Migrate sqlite3 module to _v2 API.  Patch by Aviv Palivoda.

@item 
bpo-28963@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28963}: Fix out of bound iteration in
asyncio.Future.remove_done_callback implemented in C.

@item 
bpo-29704@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29704}: asyncio.subprocess.SubprocessStreamProtocol no longer closes
before all pipes are closed.

@item 
bpo-29271@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29271}: Fix Task.current_task and Task.all_tasks implemented in C to
accept None argument as their pure Python implementation.

@item 
bpo-29703@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29703}: Fix asyncio to support instantiation of new event loops in
child processes.

@item 
bpo-29615@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29615}: SimpleXMLRPCDispatcher no longer chains KeyError (or any other
exception) to exception(s) raised in the dispatched methods. Patch by Petr
Motejlek.

@item 
bpo-7769@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7769}: Method register_function() of
xmlrpc.server.SimpleXMLRPCDispatcher and its subclasses can now be used as
a decorator.

@item 
bpo-29376@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29376}: Fix assertion error in threading._DummyThread.is_alive().

@item 
bpo-28624@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28624}: Add a test that checks that cwd parameter of Popen() accepts
PathLike objects.  Patch by Sayan Chowdhury.

@item 
bpo-28518@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28518}: Start a transaction implicitly before a DML statement. Patch by
Aviv Palivoda.

@item 
bpo-29742@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29742}: get_extra_info() raises exception if get called on closed ssl
transport. Patch by Nikolay Kim.

@item 
bpo-16285@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16285}: urllib.parse.quote is now based on RFC 3986 and hence includes
‘~’ in the set of characters that is not quoted by default. Patch by
Christian Theune and Ratnadeep Debnath.

@item 
bpo-29532@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29532}: Altering a kwarg dictionary passed to functools.partial() no
longer affects a partial object after creation.

@item 
bpo-29110@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29110}: Fix file object leak in aifc.open() when file is given as a
filesystem path and is not in valid AIFF format. Patch by Anthony Zhang.

@item 
bpo-22807@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22807}: Add uuid.SafeUUID and uuid.UUID.is_safe to relay information
from the platform about whether generated UUIDs are generated with a
multiprocessing safe method.

@item 
bpo-29576@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29576}: Improve some deprecations in importlib. Some deprecated methods
now emit DeprecationWarnings and have better descriptive messages.

@item 
bpo-29534@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29534}: Fixed different behaviour of Decimal.from_float() for _decimal
and _pydecimal. Thanks Andrew Nester.

@item 
bpo-10379@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10379}: locale.format_string now supports the ‘monetary’ keyword
argument, and locale.format is deprecated.

@item 
bpo-29851@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29851}: importlib.reload() now raises ModuleNotFoundError if the module
lacks a spec.

@item 
bpo-28556@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28556}: Various updates to typing module: typing.Counter,
typing.ChainMap, improved ABC caching, etc. Original PRs by Jelle
Zijlstra, Ivan Levkivskyi, Manuel Krebber, and Łukasz Langa.

@item 
bpo-29100@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29100}: Fix datetime.fromtimestamp() regression introduced in Python
3.6.0: check minimum and maximum years.

@item 
bpo-29416@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29416}: Prevent infinite loop in pathlib.Path.mkdir

@item 
bpo-29444@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29444}: Fixed out-of-bounds buffer access in the group() method of the
match object. Based on patch by WGH.

@item 
bpo-29377@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29377}: Add WrapperDescriptorType, MethodWrapperType, and
MethodDescriptorType built-in types to types module. Original patch by
Manuel Krebber.

@item 
bpo-29218@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29218}: Unused install_misc command is now removed.  It has been
documented as unused since 2000.  Patch by Eric N. Vander Weele.

@item 
bpo-29368@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29368}: The extend() method is now called instead of the append()
method when unpickle collections.deque and other list-like objects. This
can speed up unpickling to 2 times.

@item 
bpo-29338@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29338}: The help of a builtin or extension class now includes the
constructor signature if __text_signature__ is provided for the class.

@item 
bpo-29335@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29335}: Fix subprocess.Popen.wait() when the child process has exited
to a stopped instead of terminated state (ex: when under ptrace).

@item 
bpo-29290@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29290}: Fix a regression in argparse that help messages would wrap at
non-breaking spaces.

@item 
bpo-28735@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28735}: Fixed the comparison of mock.MagickMock with mock.ANY.

@item 
bpo-29197@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29197}: Removed deprecated function ntpath.splitunc().

@item 
bpo-29210@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29210}: Removed support of deprecated argument “exclude” in
tarfile.TarFile.add().

@item 
bpo-29219@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29219}: Fixed infinite recursion in the repr of uninitialized
ctypes.CDLL instances.

@item 
bpo-29192@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29192}: Removed deprecated features in the http.cookies module.

@item 
bpo-29193@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29193}: A format string argument for string.Formatter.format() is now
positional-only.

@item 
bpo-29195@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29195}: Removed support of deprecated undocumented keyword arguments in
methods of regular expression objects.

@item 
bpo-28969@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28969}: Fixed race condition in C implementation of
functools.lru_cache. KeyError could be raised when cached function with
full cache was simultaneously called from different threads with the same
uncached arguments.

@item 
bpo-20804@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20804}: The unittest.mock.sentinel attributes now preserve their
identity when they are copied or pickled.

@item 
bpo-29142@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29142}: In urllib.request, suffixes in no_proxy environment variable
with leading dots could match related hostnames again (e.g. .b.c matches
a.b.c). Patch by Milan Oberkirch.

@item 
bpo-28961@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28961}: Fix unittest.mock._Call helper: don’t ignore the name parameter
anymore. Patch written by Jiajun Huang.

@item 
bpo-15812@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15812}: inspect.getframeinfo() now correctly shows the first line of a
context. Patch by Sam Breese.

@item 
bpo-28985@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28985}: Update authorizer constants in sqlite3 module. Patch by
Dingyuan Wang.

@item 
bpo-29079@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29079}: Prevent infinite loop in pathlib.resolve() on Windows

@item 
bpo-13051@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13051}: Fixed recursion errors in large or resized
curses.textpad.Textbox.  Based on patch by Tycho Andersen.

@item 
bpo-9770@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9770}: curses.ascii predicates now work correctly with negative
integers.

@item 
bpo-28427@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28427}: old keys should not remove new values from WeakValueDictionary
when collecting from another thread.

@item 
bpo-28923@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28923}: Remove editor artifacts from Tix.py.

@item 
bpo-28871@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28871}: Fixed a crash when deallocate deep ElementTree.

@item 
bpo-19542@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19542}: Fix bugs in WeakValueDictionary.setdefault() and
WeakValueDictionary.pop() when a GC collection happens in another thread.

@item 
bpo-20191@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20191}: Fixed a crash in resource.prlimit() when passing a sequence
that doesn’t own its elements as limits.

@item 
bpo-16255@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16255}: subprocess.Popen uses /system/bin/sh on Android as the shell,
instead of /bin/sh.

@item 
bpo-28779@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28779}: multiprocessing.set_forkserver_preload() would crash the
forkserver process if a preloaded module instantiated some multiprocessing
objects such as locks.

@item 
bpo-26937@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26937}: The chown() method of the tarfile.TarFile class does not fail
now when the grp module cannot be imported, as for example on Android
platforms.

@item 
bpo-28847@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28847}: dbm.dumb now supports reading read-only files and no longer
writes the index file when it is not changed.  A deprecation warning is
now emitted if the index file is missed and recreated in the ‘r’ and ‘w’
modes (will be an error in future Python releases).

@item 
bpo-27030@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27030}: Unknown escapes consisting of @code{'\'} and an ASCII letter in
re.sub() replacement templates regular expressions now are errors.

@item 
bpo-28835@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28835}: Fix a regression introduced in warnings.catch_warnings(): call
warnings.showwarning() if it was overridden inside the context manager.

@item 
bpo-27172@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27172}: To assist with upgrades from 2.7, the previously documented
deprecation of @code{inspect.getfullargspec()} has been reversed. This
decision may be revisited again after the Python 2.7 branch is no longer
officially supported.

@item 
bpo-28740@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28740}: Add sys.getandroidapilevel(): return the build time API version
of Android as an integer. Function only available on Android.

@item 
bpo-26273@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26273}: Add new @code{socket.TCP_CONGESTION} (Linux 2.6.13) and
@code{socket.TCP_USER_TIMEOUT} (Linux 2.6.37) constants. Patch written
by Omar Sandoval.

@item 
bpo-28752@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28752}: Restored the __reduce__() methods of datetime objects.

@item 
bpo-28727@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28727}: Regular expression patterns, _sre.SRE_Pattern objects created
by re.compile(), become comparable (only x==y and x!=y operators). This
change should fix the bpo-18383@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18383}: don’t duplicate warning filters when
the warnings module is reloaded (thing usually only done in unit tests).

@item 
bpo-20572@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20572}: Remove the subprocess.Popen.wait endtime parameter.  It was
deprecated in 3.4 and undocumented prior to that.

@item 
bpo-25659@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25659}: In ctypes, prevent a crash calling the from_buffer() and
from_buffer_copy() methods on abstract classes like Array.

@item 
bpo-28548@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28548}: In the “http.server” module, parse the protocol version if
possible, to avoid using HTTP 0.9 in some error responses.

@item 
bpo-19717@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19717}: Makes Path.resolve() succeed on paths that do not exist. Patch
by Vajrasky Kok

@item 
bpo-28563@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28563}: Fixed possible DoS and arbitrary code execution when handle
plural form selections in the gettext module.  The expression parser now
supports exact syntax supported by GNU gettext.

@item 
bpo-28387@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28387}: Fixed possible crash in _io.TextIOWrapper deallocator when the
garbage collector is invoked in other thread.  Based on patch by Sebastian
Cufre.

@item 
bpo-27517@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27517}: LZMA compressor and decompressor no longer raise exceptions if
given empty data twice.  Patch by Benjamin Fogle.

@item 
bpo-28549@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28549}: Fixed segfault in curses’s addch() with ncurses6.

@item 
bpo-28449@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28449}: tarfile.open() with mode “r” or “r:” now tries to open a tar
file with compression before trying to open it without compression.
Otherwise it had 50% chance failed with ignore_zeros=True.

@item 
bpo-23262@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23262}: The webbrowser module now supports Firefox 36+ and derived
browsers.  Based on patch by Oleg Broytman.

@item 
bpo-24241@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24241}: The webbrowser in an X environment now prefers using the
default browser directly. Also, the webbrowser register() function now has
a documented ‘preferred’ argument, to specify browsers to be returned by
get() with no arguments. Patch by David Steele

@item 
bpo-27939@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27939}: Fixed bugs in tkinter.ttk.LabeledScale and tkinter.Scale caused
by representing the scale as float value internally in Tk.  tkinter.IntVar
now works if float value is set to underlying Tk variable.

@item 
bpo-28255@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28255}: calendar.TextCalendar.prweek() no longer prints a space after a
weeks’s calendar.  calendar.TextCalendar.pryear() no longer prints
redundant newline after a year’s calendar.  Based on patch by Xiang Zhang.

@item 
bpo-28255@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28255}: calendar.TextCalendar.prmonth() no longer prints a space at the
start of new line after printing a month’s calendar.  Patch by Xiang
Zhang.

@item 
bpo-20491@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20491}: The textwrap.TextWrapper class now honors non-breaking spaces.
Based on patch by Kaarle Ritvanen.

@item 
bpo-28353@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28353}: os.fwalk() no longer fails on broken links.

@item 
bpo-28430@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28430}: Fix iterator of C implemented asyncio.Future doesn’t accept
non-None value is passed to it.send(val).

@item 
bpo-27025@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27025}: Generated names for Tkinter widgets now start by the “!” prefix
for readability.

@item 
bpo-25464@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25464}: Fixed HList.header_exists() in tkinter.tix module by addin a
workaround to Tix library bug.

@item 
bpo-28488@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28488}: shutil.make_archive() no longer adds entry “./” to ZIP archive.

@item 
bpo-25953@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25953}: re.sub() now raises an error for invalid numerical group
reference in replacement template even if the pattern is not found in the
string.  Error message for invalid group reference now includes the group
index and the position of the reference. Based on patch by SilentGhost.

@item 
bpo-28469@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28469}: timeit now uses the sequence 1, 2, 5, 10, 20, 50,… instead of
1, 10, 100,… for autoranging.

@item 
bpo-28115@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28115}: Command-line interface of the zipfile module now uses argparse.
Added support of long options.

@item 
bpo-18219@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18219}: Optimize csv.DictWriter for large number of columns. Patch by
Mariatta Wijaya.

@item 
bpo-28448@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28448}: Fix C implemented asyncio.Future didn’t work on Windows.

@item 
bpo-23214@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23214}: In the “io” module, the argument to BufferedReader and
BytesIO’s read1() methods is now optional and can be -1, matching the
BufferedIOBase specification.

@item 
bpo-28480@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28480}: Fix error building socket module when multithreading is
disabled.

@item 
bpo-28240@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28240}: timeit: remove @code{-c/--clock} and @code{-t/--time} command line
options which were deprecated since Python 3.3.

@item 
bpo-28240@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28240}: timeit now repeats the benchmarks 5 times instead of only 3 to
make benchmarks more reliable.

@item 
bpo-28240@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28240}: timeit autorange now uses a single loop iteration if the
benchmark takes less than 10 seconds, instead of 10 iterations. “python3
-m timeit -s ‘import time’ ‘time.sleep(1)’” now takes 4 seconds instead of
40 seconds.

@item 
Distutils.sdist now looks for README and setup.py files with case
sensitivity. This behavior matches that found in Setuptools 6.0 and later.
See setuptools 100@footnote{https://github.com/pypa/setuptools/issues/100} for
rationale.

@item 
bpo-24452@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24452}: Make webbrowser support Chrome on Mac OS X. Patch by Ned
Batchelder.

@item 
bpo-20766@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20766}: Fix references leaked by pdb in the handling of SIGINT
handlers.

@item 
bpo-27998@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27998}: Fixed bytes path support in os.scandir() on Windows. Patch by
Eryk Sun.

@item 
bpo-28317@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28317}: The disassembler now decodes FORMAT_VALUE argument.

@item 
bpo-28380@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28380}: unittest.mock Mock autospec functions now properly support
assert_called, assert_not_called, and assert_called_once.

@item 
bpo-28229@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28229}: lzma module now supports pathlib.

@item 
bpo-28321@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28321}: Fixed writing non-BMP characters with binary format in
plistlib.

@item 
bpo-28225@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28225}: bz2 module now supports pathlib.  Initial patch by Ethan
Furman.

@item 
bpo-28227@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28227}: gzip now supports pathlib.  Patch by Ethan Furman.

@item 
bpo-28332@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28332}: Deprecated silent truncations in socket.htons and socket.ntohs.
Original patch by Oren Milman.

@item 
bpo-27358@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27358}: Optimized merging var-keyword arguments and improved error
message when passing a non-mapping as a var-keyword argument.

@item 
bpo-28257@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28257}: Improved error message when passing a non-iterable as a
var-positional argument.  Added opcode BUILD_TUPLE_UNPACK_WITH_CALL.

@item 
bpo-28322@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28322}: Fixed possible crashes when unpickle itertools objects from
incorrect pickle data.  Based on patch by John Leitch.

@item 
bpo-28228@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28228}: imghdr now supports pathlib.

@item 
bpo-28226@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28226}: compileall now supports pathlib.

@item 
bpo-28314@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28314}: Fix function declaration (C flags) for the getiterator() method
of xml.etree.ElementTree.Element.

@item 
bpo-28148@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28148}: Stop using localtime() and gmtime() in the time module.
Introduced platform independent _PyTime_localtime API that is similar to
POSIX localtime_r, but available on all platforms.  Patch by Ed Schouten.

@item 
bpo-28253@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28253}: Fixed calendar functions for extreme months: 0001-01 and
9999-12. Methods itermonthdays() and itermonthdays2() are reimplemented so
that they don’t call itermonthdates() which can cause datetime.date
under/overflow.

@item 
bpo-28275@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28275}: Fixed possible use after free in the decompress() methods of
the LZMADecompressor and BZ2Decompressor classes. Original patch by John
Leitch.

@item 
bpo-27897@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27897}: Fixed possible crash in sqlite3.Connection.create_collation()
if pass invalid string-like object as a name.  Patch by Xiang Zhang.

@item 
bpo-18844@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18844}: random.choices() now has k as a keyword-only argument to
improve the readability of common cases and come into line with the
signature used in other languages.

@item 
bpo-18893@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18893}: Fix invalid exception handling in Lib/ctypes/macholib/dyld.py.
Patch by Madison May.

@item 
bpo-27611@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27611}: Fixed support of default root window in the tkinter.tix module.
Added the master parameter in the DisplayStyle constructor.

@item 
bpo-27348@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27348}: In the traceback module, restore the formatting of exception
messages like “Exception: None”.  This fixes a regression introduced in
3.5a2.

@item 
bpo-25651@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25651}: Allow false values to be used for msg parameter of subTest().

@item 
bpo-27778@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27778}: Fix a memory leak in os.getrandom() when the getrandom() is
interrupted by a signal and a signal handler raises a Python exception.

@item 
bpo-28200@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28200}: Fix memory leak on Windows in the os module (fix
path_converter() function).

@item 
bpo-25400@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25400}: RobotFileParser now correctly returns default values for
crawl_delay and request_rate.  Initial patch by Peter Wirtz.

@item 
bpo-27932@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27932}: Prevent memory leak in win32_ver().

@item 
Fix UnboundLocalError in socket._sendfile_use_sendfile.

@item 
bpo-28075@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28075}: Check for ERROR_ACCESS_DENIED in Windows implementation of
os.stat().  Patch by Eryk Sun.

@item 
bpo-22493@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22493}: Warning message emitted by using inline flags in the middle of
regular expression now contains a (truncated) regex pattern. Patch by Tim
Graham.

@item 
bpo-25270@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25270}: Prevent codecs.escape_encode() from raising SystemError when an
empty bytestring is passed.

@item 
bpo-28181@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28181}: Get antigravity over HTTPS. Patch by Kaartic Sivaraam.

@item 
bpo-25895@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25895}: Enable WebSocket URL schemes in urllib.parse.urljoin. Patch by
Gergely Imreh and Markus Holtermann.

@item 
bpo-28114@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28114}: Fix a crash in parse_envlist() when env contains byte strings.
Patch by Eryk Sun.

@item 
bpo-27599@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27599}: Fixed buffer overrun in binascii.b2a_qp() and
binascii.a2b_qp().

@item 
bpo-27906@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27906}: Fix socket accept exhaustion during high TCP traffic. Patch by
Kevin Conway.

@item 
bpo-28174@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28174}: Handle when SO_REUSEPORT isn’t properly supported. Patch by
Seth Michael Larson.

@item 
bpo-26654@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26654}: Inspect functools.partial in asyncio.Handle.__repr__. Patch by
iceboy.

@item 
bpo-26909@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26909}: Fix slow pipes IO in asyncio. Patch by INADA Naoki.

@item 
bpo-28176@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28176}: Fix callbacks race in asyncio.SelectorLoop.sock_connect.

@item 
bpo-27759@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27759}: Fix selectors incorrectly retain invalid file descriptors.
Patch by Mark Williams.

@item 
bpo-28325@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28325}: Remove vestigial MacOS 9 macurl2path module and its tests.

@item 
bpo-28368@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28368}: Refuse monitoring processes if the child watcher has no loop
attached. Patch by Vincent Michel.

@item 
bpo-28369@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28369}: Raise RuntimeError when transport’s FD is used with add_reader,
add_writer, etc.

@item 
bpo-28370@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28370}: Speedup asyncio.StreamReader.readexactly. Patch by Коренберг
Марк.

@item 
bpo-28371@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28371}: Deprecate passing asyncio.Handles to run_in_executor.

@item 
bpo-28372@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28372}: Fix asyncio to support formatting of non-python coroutines.

@item 
bpo-28399@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28399}: Remove UNIX socket from FS before binding. Patch by Коренберг
Марк.

@item 
bpo-27972@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27972}: Prohibit Tasks to await on themselves.

@item 
bpo-24142@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24142}: Reading a corrupt config file left configparser in an invalid
state. Original patch by Florian Höch.

@item 
bpo-29581@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29581}: ABCMeta.__new__ now accepts @code{**kwargs}, allowing abstract
base classes to use keyword parameters in __init_subclass__. Patch by Nate
Soares.

@item 
bpo-25532@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25532}: inspect.unwrap() will now only try to unwrap an object
sys.getrecursionlimit() times, to protect against objects which create a
new object on every attribute access.

@item 
bpo-30177@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30177}: path.resolve(strict=False) no longer cuts the path after the
first element not present in the filesystem.  Patch by Antoine Pietri.
@end itemize

@node Documentation<66>,Tests<63>,Library<173>,Python 3 7 0 alpha 1
@anchor{whatsnew/changelog id839}@anchor{1e95}
@subsubsection Documentation



@itemize -

@item 
bpo-31294@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31294}: Fix incomplete code snippet in the ZeroMQSocketListener and
ZeroMQSocketHandler examples and adapt them to Python 3.

@item 
bpo-21649@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21649}: Add RFC 7525 and Mozilla server side TLS links to SSL
documentation.

@item 
bpo-31128@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31128}: Allow the pydoc server to bind to arbitrary hostnames.

@item 
bpo-30803@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30803}: Clarify doc on truth value testing. Original patch by Peter
Thomassen.

@item 
bpo-30176@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30176}: Add missing attribute related constants in curses
documentation.

@item 
bpo-30052@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30052}: the link targets for @ref{192,,bytes()} and @ref{344,,bytearray()} are
now their respective type definitions, rather than the corresponding
builtin function entries. Use @ref{1e96,,bytes} and
@ref{1e97,,bytearray} to reference the latter. In order to
ensure this and future cross-reference updates are applied automatically,
the daily documentation builds now disable the default output caching
features in Sphinx.

@item 
bpo-26985@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26985}: Add missing info of code object in inspect documentation.

@item 
bpo-19824@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19824}: Improve the documentation for, and links to, template strings
by emphasizing their utility for internationalization, and by clarifying
some usage constraints. (See also: bpo-20314@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20314}, bpo-12518@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12518})

@item 
bpo-28929@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28929}: Link the documentation to its source file on GitHub.

@item 
bpo-25008@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25008}: Document smtpd.py as effectively deprecated and add a pointer
to aiosmtpd, a third-party asyncio-based replacement.

@item 
bpo-26355@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26355}: Add canonical header link on each page to corresponding major
version of the documentation. Patch by Matthias Bussonnier.

@item 
bpo-29349@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29349}: Fix Python 2 syntax in code for building the documentation.

@item 
bpo-23722@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23722}: The data model reference and the porting section in the 3.6
What’s New guide now cover the additional @code{__classcell__} handling
needed for custom metaclasses to fully support 
@geindex Python 향상 제안; PEP 487
PEP 487@footnote{https://peps.python.org/pep-0487/} and
zero-argument @code{super()}.

@item 
bpo-28513@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28513}: Documented command-line interface of zipfile.
@end itemize

@node Tests<63>,Build<71>,Documentation<66>,Python 3 7 0 alpha 1
@anchor{whatsnew/changelog id840}@anchor{1e98}
@subsubsection Tests



@itemize -

@item 
bpo-29639@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29639}: test.support.HOST is now “localhost”, a new HOSTv4 constant has
been added for your @code{127.0.0.1} needs, similar to the existing HOSTv6
constant.

@item 
bpo-31320@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31320}: Silence traceback in test_ssl

@item 
bpo-31346@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31346}: Prefer PROTOCOL_TLS_CLIENT and PROTOCOL_TLS_SERVER protocols
for SSLContext.

@item 
bpo-25674@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25674}: Remove sha256.tbs-internet.com ssl test

@item 
bpo-30715@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30715}: Address ALPN callback changes for OpenSSL 1.1.0f. The latest
version behaves like OpenSSL 1.0.2 and no longer aborts handshake.

@item 
bpo-30822@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30822}: regrtest: Exclude tzdata from regrtest –all. When running the
test suite using –use=all / -u all, exclude tzdata since it makes
test_datetime too slow (15-20 min on some buildbots) which then times out
on some buildbots. Fix also regrtest command line parser to allow passing
-u extralargefile to run test_zipfile64.

@item 
bpo-30695@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30695}: Add the @code{set_nomemory(start, stop)} and
@code{remove_mem_hooks()} functions to the @code{_testcapi} module.

@item 
bpo-30357@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30357}: test_thread: setUp() now uses support.threading_setup() and
support.threading_cleanup() to wait until threads complete to avoid random
side effects on following tests. Initial patch written by Grzegorz
Grzywacz.

@item 
bpo-30197@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30197}: Enhanced functions swap_attr() and swap_item() in the
test.support module. They now work when delete replaced attribute or item
inside the with statement.  The old value of the attribute or item (or
None if it doesn’t exist) now will be assigned to the target of the “as”
clause, if there is one.

@item 
bpo-24932@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24932}: Use proper command line parsing in _testembed

@item 
bpo-28950@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28950}: Disallow -j0 to be combined with -T/-l in regrtest command line
arguments.

@item 
bpo-28683@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28683}: Fix the tests that bind() a unix socket and raise
PermissionError on Android for a non-root user.

@item 
bpo-26936@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26936}: Fix the test_socket failures on Android - getservbyname(),
getservbyport() and getaddrinfo() are broken on some Android API levels.

@item 
bpo-28666@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28666}: Now test.support.rmtree is able to remove unwritable or
unreadable directories.

@item 
bpo-23839@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23839}: Various caches now are cleared before running every test file.

@item 
bpo-26944@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26944}: Fix test_posix for Android where ‘id -G’ is entirely wrong or
missing the effective gid.

@item 
bpo-28409@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28409}: regrtest: fix the parser of command line arguments.

@item 
bpo-28217@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28217}: Adds _testconsole module to test console input.

@item 
bpo-26939@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26939}: Add the support.setswitchinterval() function to fix
test_functools hanging on the Android armv7 qemu emulator.
@end itemize

@node Build<71>,Windows<63>,Tests<63>,Python 3 7 0 alpha 1
@anchor{whatsnew/changelog id841}@anchor{1e99}
@subsubsection Build



@itemize -

@item 
bpo-31354@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31354}: Allow @code{--with-lto} to be used on all builds, not just @code{make
profile-opt}.

@item 
bpo-31370@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31370}: Remove support for building –without-threads. This option is
not really useful anymore in the 21st century. Removing lots of
conditional paths allows us to simplify the code base, including in
difficult to maintain low-level internal code.

@item 
bpo-31341@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31341}: Per 
@geindex Python 향상 제안; PEP 11
PEP 11@footnote{https://peps.python.org/pep-0011/}, support for the IRIX operating system was
removed.

@item 
bpo-30854@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30854}: Fix compile error when compiling –without-threads. Patch by
Masayuki Yamamoto.

@item 
bpo-30687@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30687}: Locate msbuild.exe on Windows when building rather than
vcvarsall.bat

@item 
bpo-20210@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20210}: Support the `disabled' marker in Setup files. Extension modules
listed after this marker are not built at all, neither by the Makefile nor
by setup.py.

@item 
bpo-29941@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29941}: Add @code{--with-assertions} configure flag to explicitly enable C
@code{assert()} checks. Defaults to off. @code{--with-pydebug} implies
@code{--with-assertions}.

@item 
bpo-28787@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28787}: Fix out-of-tree builds of Python when configured with
@code{--with--dtrace}.

@item 
bpo-29243@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29243}: Prevent unnecessary rebuilding of Python during @code{make test},
@code{make install} and some other make targets when configured with
@code{--enable-optimizations}.

@item 
bpo-23404@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23404}: Don’t regenerate generated files based on file modification
time anymore: the action is now explicit. Replace @code{make touch} with
@code{make regen-all}.

@item 
bpo-29643@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29643}: Fix @code{--enable-optimization} didn’t work.

@item 
bpo-27593@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27593}: sys.version and the platform module python_build(),
python_branch(), and python_revision() functions now use git information
rather than hg when building from a repo.

@item 
bpo-29572@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29572}: Update Windows build and OS X installers to use OpenSSL 1.0.2k.

@item 
bpo-27659@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27659}: Prohibit implicit C function declarations: use
@code{-Werror=implicit-function-declaration} when possible (GCC and Clang,
but it depends on the compiler version). Patch written by Chi Hsuan Yen.

@item 
bpo-29384@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29384}: Remove old Be OS helper scripts.

@item 
bpo-26851@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26851}: Set Android compilation and link flags.

@item 
bpo-28768@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28768}: Fix implicit declaration of function _setmode. Patch by
Masayuki Yamamoto

@item 
bpo-29080@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29080}: Removes hard dependency on hg.exe from PCBuild/build.bat

@item 
bpo-23903@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23903}: Added missed names to PC/python3.def.

@item 
bpo-28762@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28762}: lockf() is available on Android API level 24, but the F_LOCK
macro is not defined in android-ndk-r13.

@item 
bpo-28538@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28538}: Fix the compilation error that occurs because if_nameindex() is
available on Android API level 24, but the if_nameindex structure is not
defined.

@item 
bpo-20211@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20211}: Do not add the directory for installing C header files and the
directory for installing object code libraries to the cross compilation
search paths. Original patch by Thomas Petazzoni.

@item 
bpo-28849@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28849}: Do not define sys.implementation._multiarch on Android.

@item 
bpo-10656@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10656}: Fix out-of-tree building on AIX.  Patch by Tristan Carel and
Michael Haubenwallner.

@item 
bpo-26359@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26359}: Rename –with-optimiations to –enable-optimizations.

@item 
bpo-28444@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28444}: Fix missing extensions modules when cross compiling.

@item 
bpo-28208@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28208}: Update Windows build and OS X installers to use SQLite 3.14.2.

@item 
bpo-28248@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28248}: Update Windows build and OS X installers to use OpenSSL 1.0.2j.

@item 
bpo-21124@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21124}: Fix building the _struct module on Cygwin by passing @code{NULL}
instead of @code{&PyType_Type} to PyVarObject_HEAD_INIT.  Patch by Masayuki
Yamamoto.

@item 
bpo-13756@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13756}: Fix building extensions modules on Cygwin.  Patch by Roumen
Petrov, based on original patch by Jason Tishler.

@item 
bpo-21085@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21085}: Add configure check for siginfo_t.si_band, which Cygwin does
not provide. Patch by Masayuki Yamamoto with review and rebase by Erik
Bray.

@item 
bpo-28258@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28258}: Fixed build with Estonian locale (python-config and distclean
targets in Makefile).  Patch by Arfrever Frehtes Taifersar Arahesis.

@item 
bpo-26661@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26661}: setup.py now detects system libffi with multiarch wrapper.

@item 
bpo-27979@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27979}: A full copy of libffi is no longer bundled for use when
building _ctypes on non-OSX UNIX platforms.  An installed copy of libffi
is now required when building _ctypes on such platforms.

@item 
bpo-15819@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15819}: Remove redundant include search directory option for building
outside the source tree.

@item 
bpo-28676@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28676}: Prevent missing ‘getentropy’ declaration warning on macOS.
Patch by Gareth Rees.
@end itemize

@node Windows<63>,IDLE<45>,Build<71>,Python 3 7 0 alpha 1
@anchor{whatsnew/changelog id842}@anchor{1e9a}
@subsubsection Windows



@itemize -

@item 
bpo-31392@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31392}: Update Windows build to use OpenSSL 1.1.0f

@item 
bpo-30389@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30389}: Adds detection of Visual Studio 2017 to distutils on Windows.

@item 
bpo-31358@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31358}: zlib is no longer bundled in the CPython source, instead it is
downloaded on demand just like bz2, lzma, OpenSSL, Tcl/Tk, and SQLite.

@item 
bpo-31340@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31340}: Change to building with MSVC v141 (included with Visual Studio
2017)

@item 
bpo-30581@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30581}: os.cpu_count() now returns the correct number of processors on
Windows when the number of logical processors is greater than 64.

@item 
bpo-30916@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30916}: Pre-build OpenSSL, Tcl and Tk and include the binaries in the
build.

@item 
bpo-30731@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30731}: Add a missing xmlns to python.manifest so that it matches the
schema.

@item 
bpo-30291@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30291}: Allow requiring 64-bit interpreters from py.exe using -64
suffix. Contributed by Steve (Gadget) Barnes.

@item 
bpo-30362@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30362}: Adds list options (-0, -0p) to py.exe launcher. Contributed by
Steve Barnes.

@item 
bpo-23451@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23451}: Fix socket deprecation warnings in socketmodule.c. Patch by
Segev Finer.

@item 
bpo-30450@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30450}: The build process on Windows no longer depends on Subversion,
instead pulling external code from GitHub via a Python script.  If Python
3.6 is not found on the system (via @code{py -3.6}), NuGet is used to
download a copy of 32-bit Python.

@item 
bpo-29579@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29579}: Removes readme.txt from the installer.

@item 
bpo-25778@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25778}: winreg does not truncate string correctly (Patch by Eryk Sun)

@item 
bpo-28896@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28896}: Deprecate WindowsRegistryFinder and disable it by default

@item 
bpo-28522@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28522}: Fixes mishandled buffer reallocation in getpathp.c

@item 
bpo-28402@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28402}: Adds signed catalog files for stdlib on Windows.

@item 
bpo-28333@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28333}: Enables Unicode for ps1/ps2 and input() prompts. (Patch by Eryk
Sun)

@item 
bpo-28251@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28251}: Improvements to help manuals on Windows.

@item 
bpo-28110@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28110}: launcher.msi has different product codes between 32-bit and
64-bit

@item 
bpo-28161@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28161}: Opening CON for write access fails

@item 
bpo-28162@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28162}: WindowsConsoleIO readall() fails if first line starts with
Ctrl+Z

@item 
bpo-28163@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28163}: WindowsConsoleIO fileno() passes wrong flags to _open_osfhandle

@item 
bpo-28164@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28164}: _PyIO_get_console_type fails for various paths

@item 
bpo-28137@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28137}: Renames Windows path file to ._pth

@item 
bpo-28138@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28138}: Windows ._pth file should allow import site
@end itemize

@node IDLE<45>,Tools/Demos<43>,Windows<63>,Python 3 7 0 alpha 1
@anchor{whatsnew/changelog id843}@anchor{1e9b}
@subsubsection IDLE



@itemize -

@item 
bpo-31493@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31493}: IDLE code context – fix code update and font update timers.
Canceling timers prevents a warning message when test_idle completes.

@item 
bpo-31488@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31488}: IDLE - Update non-key options in former extension classes. When
applying configdialog changes, call .reload for each feature class. Change
ParenMatch so updated options affect existing instances attached to
existing editor windows.

@item 
bpo-31477@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31477}: IDLE - Improve rstrip entry in doc. Strip trailing whitespace
strips more than blank spaces.  Multiline string literals are not skipped.

@item 
bpo-31480@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31480}: IDLE - make tests pass with zzdummy extension disabled by
default.

@item 
bpo-31421@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31421}: Document how IDLE runs tkinter programs. IDLE calls tcl/tk
update in the background in order to make live interaction and
experimentation with tkinter applications much easier.

@item 
bpo-31414@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31414}: IDLE – fix tk entry box tests by deleting first. Adding to an
int entry is not the same as deleting and inserting because int(‘’) will
fail.

@item 
bpo-31051@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31051}: Rearrange IDLE configdialog GenPage into Window, Editor, and
Help sections.

@item 
bpo-30617@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30617}: IDLE - Add docstrings and tests for outwin subclass of editor.
Move some data and functions from the class to module level. Patch by
Cheryl Sabella.

@item 
bpo-31287@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31287}: IDLE - Do not modify tkinter.message in test_configdialog.

@item 
bpo-27099@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27099}: Convert IDLE’s built-in ‘extensions’ to regular features. About
10 IDLE features were implemented as supposedly optional extensions. Their
different behavior could be confusing or worse for users and not good for
maintenance. Hence the conversion. The main difference for users is that
user configurable key bindings for builtin features are now handled
uniformly. Now, editing a binding in a keyset only affects its value in
the keyset. All bindings are defined together in the system-specific
default keysets in config-extensions.def. All custom keysets are saved as
a whole in config-extension.cfg.  All take effect as soon as one clicks
Apply or Ok. The affected events are ‘<<force-open-completions>>’,
‘<<expand-word>>’, ‘<<force-open-calltip>>’, ‘<<flash-paren>>’,
‘<<format-paragraph>>’, ‘<<run-module>>’, ‘<<check-module>>’, and
‘<<zoom-height>>’.  Any (global) customizations made before 3.6.3 will not
affect their keyset-specific customization after 3.6.3. and vice versa.
Initial patch by Charles Wohlganger.

@item 
bpo-31206@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31206}: IDLE: Factor HighPage(Frame) class from ConfigDialog. Patch by
Cheryl Sabella.

@item 
bpo-31001@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31001}: Add tests for configdialog highlight tab.  Patch by Cheryl
Sabella.

@item 
bpo-31205@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31205}: IDLE: Factor KeysPage(Frame) class from ConfigDialog.  The
slightly modified tests continue to pass.  Patch by Cheryl Sabella.

@item 
bpo-31130@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31130}: IDLE – stop leaks in test_configdialog. Initial patch by
Victor Stinner.

@item 
bpo-31002@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31002}: Add tests for configdialog keys tab. Patch by Cheryl Sabella.

@item 
bpo-19903@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19903}: IDLE: Calltips use @code{inspect.signature} instead of
@code{inspect.getfullargspec}. This improves calltips for builtins converted
to use Argument Clinic. Patch by Louie Lu.

@item 
bpo-31083@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31083}: IDLE - Add an outline of a TabPage class in configdialog.
Update existing classes to match outline. Initial patch by Cheryl Sabella.

@item 
bpo-31050@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31050}: Factor GenPage(Frame) class from ConfigDialog. The slightly
modified tests continue to pass. Patch by Cheryl Sabella.

@item 
bpo-31004@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31004}: IDLE - Factor FontPage(Frame) class from ConfigDialog. Slightly
modified tests continue to pass. Fix General tests. Patch mostly by Cheryl
Sabella.

@item 
bpo-30781@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30781}: IDLE - Use ttk widgets in ConfigDialog. Patches by Terry Jan
Reedy and Cheryl Sabella.

@item 
bpo-31060@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31060}: IDLE - Finish rearranging methods of ConfigDialog Grouping
methods pertaining to each tab and the buttons will aid writing tests and
improving the tabs and will enable splitting the groups into classes.

@item 
bpo-30853@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30853}: IDLE – Factor a VarTrace class out of ConfigDialog. Instance
tracers manages pairs consisting of a tk variable and a callback function.
When tracing is turned on, setting the variable calls the function.  Test
coverage for the new class is 100%.

@item 
bpo-31003@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31003}: IDLE: Add more tests for General tab.

@item 
bpo-30993@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30993}: IDLE - Improve configdialog font page and tests. In
configdialog: Document causal pathways in create_font_tab docstring.
Simplify some attribute names. Move set_samples calls to var_changed_font
(idea from Cheryl Sabella).  Move related functions to positions after the
create widgets function. In test_configdialog: Fix test_font_set so not
order dependent.  Fix renamed test_indent_scale so it tests the widget.
Adjust tests for movement of set_samples call.  Add tests for load
functions.  Put all font tests in one class and tab indent tests in
another.  Except for two lines, these tests completely cover the related
functions.

@item 
bpo-30981@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30981}: IDLE – Add more configdialog font page tests.

@item 
bpo-28523@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28523}: IDLE: replace ‘colour’ with ‘color’ in configdialog.

@item 
bpo-30917@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30917}: Add tests for idlelib.config.IdleConf. Increase coverage from
46% to 96%. Patch by Louie Lu.

@item 
bpo-30934@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30934}: Document coverage details for idlelib tests. Add section to
idlelib/idle-test/README.txt. Include check that branches are taken both
ways. Exclude IDLE-specific code that does not run during unit tests.

@item 
bpo-30913@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30913}: IDLE: Document ConfigDialog tk Vars, methods, and widgets in
docstrings This will facilitate improving the dialog and splitting up the
class. Original patch by Cheryl Sabella.

@item 
bpo-30899@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30899}: IDLE: Add tests for ConfigParser subclasses in config. Patch by
Louie Lu.

@item 
bpo-30881@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30881}: IDLE: Add docstrings to browser.py. Patch by Cheryl Sabella.

@item 
bpo-30851@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30851}: IDLE: Remove unused variables in configdialog.  One is a
duplicate, one is set but cannot be altered by users. Patch by Cheryl
Sabella.

@item 
bpo-30870@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30870}: IDLE: In Settings dialog, select font with Up, Down keys as
well as mouse. Initial patch by Louie Lu.

@item 
bpo-8231@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8231}: IDLE: call config.IdleConf.GetUserCfgDir only once.

@item 
bpo-30779@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30779}: IDLE: Factor ConfigChanges class from configdialog, put in
config; test. * In config, put dump test code in a function; run it and
unittest in   ‘if __name__ == ‘__main__’. * Add class config.ConfigChanges
based on changes_class_v4.py on bpo issue. * Add class
test_config.ChangesTest, partly using configdialog_tests_v1.py. * Revise
configdialog to use ConfigChanges; see tracker msg297804. * Revise
test_configdialog to match configdialog changes. * Remove configdialog
functions unused or moved to ConfigChanges. Cheryl Sabella contributed
parts of the patch.

@item 
bpo-30777@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30777}: IDLE: configdialog - Add docstrings and fix comments. Patch by
Cheryl Sabella.

@item 
bpo-30495@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30495}: IDLE: Improve textview with docstrings, PEP8 names, and more
tests. Patch by Cheryl Sabella.

@item 
bpo-30723@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30723}: IDLE: Make several improvements to parenmatch. Add ‘parens’
style to highlight both opener and closer. Make ‘default’ style, which is
not default, a synonym for ‘opener’. Make time-delay work the same with
all styles. Add help for config dialog extensions tab, including help for
parenmatch. Add new tests.  Original patch by Charles Wohlganger.

@item 
bpo-30674@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30674}: IDLE: add docstrings to grep module. Patch by Cheryl Sabella

@item 
bpo-21519@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21519}: IDLE’s basic custom key entry dialog now detects duplicates
properly. Original patch by Saimadhav Heblikar.

@item 
bpo-29910@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29910}: IDLE no longer deletes a character after commenting out a
region by a key shortcut.  Add @code{return 'break'} for this and other
potential conflicts between IDLE and default key bindings.

@item 
bpo-30728@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30728}: Review and change idlelib.configdialog names. Lowercase method
and attribute names. Replace ‘colour’ with ‘color’, expand overly cryptic
names, delete unneeded underscores. Replace @code{import *} with specific
imports. Patches by Cheryl Sabella.

@item 
bpo-6739@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6739}: IDLE: Verify user-entered key sequences by trying to bind them
with tk. Add tests for all 3 validation functions. Original patch by G
Polo.  Tests added by Cheryl Sabella.

@item 
bpo-15786@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15786}: Fix several problems with IDLE’s autocompletion box. The
following should now work: clicking on selection box items; using the
scrollbar; selecting an item by hitting Return. Hangs on MacOSX should no
longer happen. Patch by Louie Lu.

@item 
bpo-25514@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25514}: Add doc subsubsection about IDLE failure to start. Popup
no-connection message directs users to this section.

@item 
bpo-30642@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30642}: Fix reference leaks in IDLE tests. Patches by Louie Lu and
Terry Jan Reedy.

@item 
bpo-30495@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30495}: Add docstrings for textview.py and use PEP8 names. Patches by
Cheryl Sabella and Terry Jan Reedy.

@item 
bpo-30290@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30290}: Help-about: use pep8 names and add tests. Increase coverage to
100%. Patches by Louie Lu, Cheryl Sabella, and Terry Jan Reedy.

@item 
bpo-30303@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30303}: Add _utest option to textview; add new tests. Increase coverage
to 100%. Patches by Louie Lu and Terry Jan Reedy.

@item 
bpo-29071@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29071}: IDLE colors f-string prefixes (but not invalid ur prefixes).

@item 
bpo-28572@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28572}: Add 10% to coverage of IDLE’s test_configdialog. Update and
augment description of the configuration system.
@end itemize

@node Tools/Demos<43>,C API<64>,IDLE<45>,Python 3 7 0 alpha 1
@anchor{whatsnew/changelog id844}@anchor{1e9c}
@subsubsection Tools/Demos



@itemize -

@item 
bpo-30983@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30983}: gdb integration commands (py-bt, etc.) work on optimized shared
builds now, too.  
@geindex Python 향상 제안; PEP 523
PEP 523@footnote{https://peps.python.org/pep-0523/} introduced _PyEval_EvalFrameDefault which
inlines PyEval_EvalFrameEx on non-debug shared builds.  This broke the
ability to use py-bt, py-up, and a few other Python-specific gdb
integrations. The problem is fixed by only looking for
_PyEval_EvalFrameDefault frames in python-gdb.py.  Original patch by Bruno
“Polaco” Penteado.

@item 
bpo-29748@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29748}: Added the slice index converter in Argument Clinic.

@item 
bpo-24037@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24037}: Argument Clinic now uses the converter @code{bool(accept=@{int@})}
rather than @code{int} for semantical booleans.  This avoids repeating the
default value for Python and C and will help in converting to @code{bool} in
future.

@item 
bpo-29367@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29367}: python-gdb.py now supports also @code{method-wrapper}
(@code{wrapperobject}) objects.

@item 
bpo-28023@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28023}: Fix python-gdb.py didn’t support new dict implementation.

@item 
bpo-15369@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15369}: The pybench and pystone microbenchmark have been removed from
Tools. Please use the new Python benchmark suite
@indicateurl{https://github.com/python/pyperformance} which is more reliable and
includes a portable version of pybench working on Python 2 and Python 3.

@item 
bpo-28102@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28102}: The zipfile module CLI now prints usage to stderr. Patch by
Stephen J. Turnbull.
@end itemize

@node C API<64>,,Tools/Demos<43>,Python 3 7 0 alpha 1
@anchor{whatsnew/changelog id845}@anchor{1e9d}
@subsubsection C API



@itemize -

@item 
bpo-31338@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31338}: Added the @code{Py_UNREACHABLE()} macro for code paths which are
never expected to be reached.  This and a few other useful macros are now
documented in the C API manual.

@item 
bpo-30832@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30832}: Remove own implementation for thread-local storage. CPython has
provided the own implementation for thread-local storage (TLS) on
Python/thread.c, it’s used in the case which a platform has not supplied
native TLS.  However, currently all supported platforms (Windows and
pthreads) have provided native TLS and defined the Py_HAVE_NATIVE_TLS
macro with unconditional in any case.

@item 
bpo-30708@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30708}: PyUnicode_AsWideCharString() now raises a ValueError if the
second argument is NULL and the wchar_t* string contains null characters.

@item 
bpo-16500@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16500}: Deprecate PyOS_AfterFork() and add PyOS_BeforeFork(),
PyOS_AfterFork_Parent() and PyOS_AfterFork_Child().

@item 
bpo-6532@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6532}: The type of results of PyThread_start_new_thread() and
PyThread_get_thread_ident(), and the id parameter of
PyThreadState_SetAsyncExc() changed from “long” to “unsigned long”.

@item 
bpo-27867@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27867}: Function PySlice_GetIndicesEx() is deprecated and replaced with
a macro if Py_LIMITED_API is not set or set to the value between
0x03050400 and 0x03060000 (not including) or 0x03060100 or higher.  Added
functions PySlice_Unpack() and PySlice_AdjustIndices().

@item 
bpo-29083@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29083}: Fixed the declaration of some public API functions.
PyArg_VaParse() and PyArg_VaParseTupleAndKeywords() were not available in
limited API. PyArg_ValidateKeywordArguments(), PyArg_UnpackTuple() and
Py_BuildValue() were not available in limited API of version < 3.3 when
PY_SSIZE_T_CLEAN is defined.

@item 
bpo-28769@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28769}: The result of PyUnicode_AsUTF8AndSize() and PyUnicode_AsUTF8()
is now of type @code{const char *} rather of @code{char *}.

@item 
bpo-29058@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29058}: All stable API extensions added after Python 3.2 are now
available only when Py_LIMITED_API is set to the PY_VERSION_HEX value of
the minimum Python version supporting this API.

@item 
bpo-28822@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28822}: The index parameters `start' and `end' of PyUnicode_FindChar()
are now adjusted to behave like @code{str[start:end]}.

@item 
bpo-28808@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28808}: PyUnicode_CompareWithASCIIString() now never raises exceptions.

@item 
bpo-28761@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28761}: The fields name and doc of structures PyMemberDef, PyGetSetDef,
PyStructSequence_Field, PyStructSequence_Desc, and wrapperbase are now of
type @code{const char *} rather of @code{char *}.

@item 
bpo-28748@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28748}: Private variable _Py_PackageContext is now of type @code{const char
*} rather of @code{char *}.

@item 
bpo-19569@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19569}: Compiler warnings are now emitted if use most of deprecated
functions.

@item 
bpo-28426@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28426}: Deprecated undocumented functions PyUnicode_AsEncodedObject(),
PyUnicode_AsDecodedObject(), PyUnicode_AsDecodedUnicode() and
PyUnicode_AsEncodedUnicode().
@end itemize

@node Python 3 6 6 final,Python 3 6 6 release candidate 1,Python 3 7 0 alpha 1,Changelog
@anchor{whatsnew/changelog python-3-6-6-final}@anchor{1e9e}
@subsection Python 3.6.6 final


`Release date: 2018-06-27'

There were no new changes in version 3.6.6.

@node Python 3 6 6 release candidate 1,Python 3 6 5 final,Python 3 6 6 final,Changelog
@anchor{whatsnew/changelog python-3-6-6-release-candidate-1}@anchor{1e9f}
@subsection Python 3.6.6 release candidate 1


`Release date: 2018-06-11'

@menu
* Core and Builtins: Core and Builtins<170>. 
* Library: Library<174>. 
* Documentation: Documentation<67>. 
* Tests: Tests<64>. 
* Build: Build<72>. 
* Windows: Windows<64>. 
* macOS: macOS<49>. 
* IDLE: IDLE<46>. 
* Tools/Demos: Tools/Demos<44>. 
* C API: C API<65>. 

@end menu

@node Core and Builtins<170>,Library<174>,,Python 3 6 6 release candidate 1
@anchor{whatsnew/changelog id846}@anchor{1ea0}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-33786@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33786}: Fix asynchronous generators to handle GeneratorExit in athrow()
correctly

@item 
bpo-30654@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30654}: Fixed reset of the SIGINT handler to SIG_DFL on interpreter
shutdown even when there was a custom handler set previously. Patch by
Philipp Kerling.

@item 
bpo-33622@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33622}: Fixed a leak when the garbage collector fails to add an object
with the @code{__del__} method or referenced by it into the
@ref{13c6,,gc.garbage} list. @ref{b84,,PyGC_Collect()} can now be called when an
exception is set and preserves it.

@item 
bpo-31849@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31849}: Fix signed/unsigned comparison warning in pyhash.c.

@item 
bpo-33391@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33391}: Fix a leak in set_symmetric_difference().

@item 
bpo-28055@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28055}: Fix unaligned accesses in siphash24(). Patch by Rolf Eike Beer.

@item 
bpo-33231@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33231}: Fix potential memory leak in @code{normalizestring()}.

@item 
bpo-29922@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29922}: Improved error messages in ‘async with’ when @code{__aenter__()}
or @code{__aexit__()} return non-awaitable object.

@item 
bpo-33199@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33199}: Fix @code{ma_version_tag} in dict implementation is uninitialized
when copying from key-sharing dict.

@item 
bpo-33041@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33041}: Fixed jumping when the function contains an @code{async for} loop.

@item 
bpo-32282@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32282}: Fix an unnecessary ifdef in the include of VersionHelpers.h in
socketmodule on Windows.

@item 
bpo-21983@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21983}: Fix a crash in @code{ctypes.cast()} in case the type argument is a
ctypes structured data type. Patch by Eryk Sun and Oren Milman.
@end itemize

@node Library<174>,Documentation<67>,Core and Builtins<170>,Python 3 6 6 release candidate 1
@anchor{whatsnew/changelog id847}@anchor{1ea1}
@subsubsection Library



@itemize -

@item 
bpo-30167@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30167}: Prevent site.main() exception if PYTHONSTARTUP is set. Patch by
Steve Weber.

@item 
bpo-33812@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33812}: Datetime instance d with non-None tzinfo, but with
d.tzinfo.utcoffset(d) returning None is now treated as naive by the
astimezone() method.

@item 
bpo-30805@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30805}: Avoid race condition with debug logging

@item 
bpo-33767@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33767}: The concatenation (@code{+}) and repetition (@code{*}) sequence
operations now raise @ref{198,,TypeError} instead of @ref{794,,SystemError} when
performed on @ref{518,,mmap.mmap} objects.  Patch by Zackery Spytz.

@item 
bpo-32684@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32684}: Fix gather to propagate cancellation of itself even with
return_exceptions.

@item 
bpo-33674@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33674}: Fix a race condition in SSLProtocol.connection_made() of
asyncio.sslproto: start immediately the handshake instead of using
call_soon(). Previously, data_received() could be called before the
handshake started, causing the handshake to hang or fail.

@item 
bpo-31647@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31647}: Fixed bug where calling write_eof() on a
_SelectorSocketTransport after it’s already closed raises AttributeError.

@item 
bpo-33672@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33672}: Fix Task.__repr__ crash with Cython’s bogus coroutines

@item 
bpo-33469@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33469}: Fix RuntimeError after closing loop that used run_in_executor

@item 
bpo-11874@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11874}: Use a better regex when breaking usage into wrappable parts.
Avoids bogus assertion errors from custom metavar strings.

@item 
bpo-30877@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30877}: Fixed a bug in the Python implementation of the JSON decoder
that prevented the cache of parsed strings from clearing after finishing
the decoding. Based on patch by c-fos.

@item 
bpo-33548@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33548}: tempfile._candidate_tempdir_list should consider common TEMP
locations

@item 
bpo-33542@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33542}: Prevent @code{uuid.get_node} from using a DUID instead of a MAC on
Windows. Patch by Zvi Effron

@item 
bpo-26819@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26819}: Fix race condition with @code{ReadTransport.resume_reading} in
Windows proactor event loop.

@item 
bpo-28556@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28556}: Minor fixes in typing module: add annotations to
@code{NamedTuple.__new__}, pass @code{*args} and @code{**kwds} in
@code{Generic.__new__}.  Original PRs by Paulius Šarka and Chad Dombrova.

@item 
bpo-20087@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20087}: Updated alias mapping with glibc 2.27 supported locales.

@item 
bpo-33422@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33422}: Fix trailing quotation marks getting deleted when looking up
byte/string literals on pydoc. Patch by Andrés Delfino.

@item 
bpo-33197@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33197}: Update error message when constructing invalid
inspect.Parameters Patch by Donghee Na.

@item 
bpo-33383@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33383}: Fixed crash in the get() method of the @ref{38,,dbm.ndbm} database
object when it is called with a single argument.

@item 
bpo-33329@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33329}: Fix multiprocessing regression on newer glibcs

@item 
bpo-991266@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=991266}: Fix quoting of the @code{Comment} attribute of
@ref{1e20,,http.cookies.SimpleCookie}.

@item 
bpo-33131@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33131}: Upgrade bundled version of pip to 10.0.1.

@item 
bpo-33308@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33308}: Fixed a crash in the @code{parser} module when converting an ST
object to a tree of tuples or lists with @code{line_info=False} and
@code{col_info=True}.

@item 
bpo-33263@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33263}: Fix FD leak in @code{_SelectorSocketTransport}  Patch by Vlad
Starostin.

@item 
bpo-33256@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33256}: Fix display of @code{<module>} call in the html produced by
@code{cgitb.html()}. Patch by Stéphane Blondon.

@item 
bpo-33203@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33203}: @code{random.Random.choice()} now raises @code{IndexError} for empty
sequences consistently even when called from subclasses without a
@code{getrandbits()} implementation.

@item 
bpo-33224@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33224}: Update difflib.mdiff() for 
@geindex Python 향상 제안; PEP 479
PEP 479@footnote{https://peps.python.org/pep-0479/}.  Convert an uncaught
StopIteration in a generator into a return-statement.

@item 
bpo-33209@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33209}: End framing at the end of C implementation of
@ref{1e21,,pickle.Pickler.dump()}.

@item 
bpo-32861@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32861}: The urllib.robotparser’s @code{__str__} representation now
includes wildcard entries and the “Crawl-delay” and “Request-rate” fields.
Patch by Michael Lazar.

@item 
bpo-33096@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33096}: Allow ttk.Treeview.insert to insert iid that has a false
boolean value. Note iid=0 and iid=False would be same. Patch by Garvit
Khatri.

@item 
bpo-33127@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33127}: The ssl module now compiles with LibreSSL 2.7.1.

@item 
bpo-33021@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33021}: Release the GIL during fstat() calls, avoiding hang of all
threads when calling mmap.mmap(), os.urandom(), and random.seed().  Patch
by Nir Soffer.

@item 
bpo-27683@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27683}: Fix a regression in @ref{84,,ipaddress} that result of
@code{hosts()} is empty when the network is constructed by a tuple
containing an integer mask and only 1 bit left for addresses.

@item 
bpo-32844@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32844}: Fix wrong redirection of a low descriptor (0 or 1) to stderr in
subprocess if another low descriptor is closed.

@item 
bpo-31908@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31908}: Fix output of cover files for @code{trace} module command-line
tool. Previously emitted cover files only when @code{--missing} option was
used. Patch by Michael Selik.

@item 
bpo-31457@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31457}: If nested log adapters are used, the inner @code{process()}
methods are no longer omitted.

@item 
bpo-16865@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16865}: Support arrays >=2GiB in @ref{2e,,ctypes}.  Patch by Segev Finer.

@item 
bpo-31238@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31238}: pydoc: the stop() method of the private ServerThread class now
waits until DocServer.serve_until_quit() completes and then explicitly
sets its docserver attribute to None to break a reference cycle.
@end itemize

@node Documentation<67>,Tests<64>,Library<174>,Python 3 6 6 release candidate 1
@anchor{whatsnew/changelog id848}@anchor{1ea2}
@subsubsection Documentation



@itemize -

@item 
bpo-33503@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33503}: Fix broken pypi link

@item 
bpo-33421@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33421}: Add missing documentation for @code{typing.AsyncContextManager}.

@item 
bpo-33378@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33378}: Add Korean language switcher for @indicateurl{https://docs.python.org/3/}

@item 
bpo-33276@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33276}: Clarify that the @code{__path__} attribute on modules cannot be
just any value.

@item 
bpo-33201@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33201}: Modernize documentation for writing C extension types.

@item 
bpo-33195@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33195}: Deprecate @code{Py_UNICODE} usage in @code{c-api/arg} document.
@code{Py_UNICODE} related APIs are deprecated since Python 3.3, but it is
missed in the document.

@item 
bpo-33126@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33126}: Document PyBuffer_ToContiguous().

@item 
bpo-27212@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27212}: Modify documentation for the @code{islice()} recipe to consume
initial values up to the start index.

@item 
bpo-28247@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28247}: Update @ref{136,,zipapp} documentation to describe how to make
standalone applications.

@item 
bpo-18802@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18802}: Documentation changes for ipaddress.  Patch by Jon Foster and
Berker Peksag.

@item 
bpo-27428@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27428}: Update documentation to clarify that @code{WindowsRegistryFinder}
implements @code{MetaPathFinder}. (Patch by Himanshu Lakhara)

@item 
bpo-8243@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8243}: Add a note about curses.addch and curses.addstr exception
behavior when writing outside a window, or pad.

@item 
bpo-31432@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31432}: Clarify meaning of CERT_NONE, CERT_OPTIONAL, and CERT_REQUIRED
flags for ssl.SSLContext.verify_mode.
@end itemize

@node Tests<64>,Build<72>,Documentation<67>,Python 3 6 6 release candidate 1
@anchor{whatsnew/changelog id849}@anchor{1ea3}
@subsubsection Tests



@itemize -

@item 
bpo-33655@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33655}: Ignore test_posix_fallocate failures on BSD platforms that
might be due to running on ZFS.

@item 
bpo-19417@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19417}: Add test_bdb.py.
@end itemize

@node Build<72>,Windows<64>,Tests<64>,Python 3 6 6 release candidate 1
@anchor{whatsnew/changelog id850}@anchor{1ea4}
@subsubsection Build



@itemize -

@item 
bpo-5755@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5755}: Move @code{-Wstrict-prototypes} option to @code{CFLAGS_NODIST} from
@code{OPT}. This option emitted annoying warnings when building extension
modules written in C++.

@item 
bpo-33614@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33614}: Ensures module definition files for the stable ABI on Windows
are correctly regenerated.

@item 
bpo-33522@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33522}: Enable CI builds on Visual Studio Team Services at
@indicateurl{https://python.visualstudio.com/cpython}

@item 
bpo-33012@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33012}: Add @code{-Wno-cast-function-type} for gcc 8 for silencing
warnings about function casts like casting to PyCFunction in method
definition lists.

@item 
bpo-33394@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33394}: Enable the verbose build for extension modules, when GNU make
is passed macros on the command line.
@end itemize

@node Windows<64>,macOS<49>,Build<72>,Python 3 6 6 release candidate 1
@anchor{whatsnew/changelog id851}@anchor{1ea5}
@subsubsection Windows



@itemize -

@item 
bpo-33184@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33184}: Update Windows installer to OpenSSL 1.0.2o.
@end itemize

@node macOS<49>,IDLE<46>,Windows<64>,Python 3 6 6 release candidate 1
@anchor{whatsnew/changelog id852}@anchor{1ea6}
@subsubsection macOS



@itemize -

@item 
bpo-33184@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33184}: Update macOS installer build to use OpenSSL 1.0.2o.
@end itemize

@node IDLE<46>,Tools/Demos<44>,macOS<49>,Python 3 6 6 release candidate 1
@anchor{whatsnew/changelog id853}@anchor{1ea7}
@subsubsection IDLE



@itemize -

@item 
bpo-33656@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33656}: On Windows, add API call saying that tk scales for DPI. On
Windows 8.1+ or 10, with DPI compatibility properties of the Python binary
unchanged, and a monitor resolution greater than 96 DPI, this should make
text and lines sharper.  It should otherwise have no effect.

@item 
bpo-33768@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33768}: Clicking on a context line moves that line to the top of the
editor window.

@item 
bpo-33763@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33763}: IDLE: Use read-only text widget for code context instead of
label widget.

@item 
bpo-33664@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33664}: Scroll IDLE editor text by lines. Previously, the mouse wheel
and scrollbar slider moved text by a fixed number of pixels, resulting in
partial lines at the top of the editor box.  The change also applies to
the shell and grep output windows, but not to read-only text views.

@item 
bpo-33679@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33679}: Enable theme-specific color configuration for Code Context. Use
the Highlights tab to see the setting for built-in themes or add settings
to custom themes.

@item 
bpo-33642@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33642}: Display up to maxlines non-blank lines for Code Context. If
there is no current context, show a single blank line.

@item 
bpo-33628@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33628}: IDLE: Cleanup codecontext.py and its test.

@item 
bpo-33564@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33564}: IDLE’s code context now recognizes async as a block opener.

@item 
bpo-29706@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29706}: IDLE now colors async and await as keywords in 3.6. They become
full keywords in 3.7.

@item 
bpo-21474@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21474}: Update word/identifier definition from ascii to unicode. In
text and entry boxes, this affects selection by double-click, movement
left/right by control-left/right, and deletion left/right by
control-BACKSPACE/DEL.

@item 
bpo-33204@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33204}: IDLE: consistently color invalid string prefixes. A ‘u’ string
prefix cannot be paired with either ‘r’ or ‘f’. Consistently color as much
of the prefix, starting at the right, as is valid. Revise and extend
colorizer test.

@item 
bpo-32831@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32831}: Add docstrings and tests for codecontext.
@end itemize

@node Tools/Demos<44>,C API<65>,IDLE<46>,Python 3 6 6 release candidate 1
@anchor{whatsnew/changelog id854}@anchor{1ea8}
@subsubsection Tools/Demos



@itemize -

@item 
bpo-33189@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33189}: @code{pygettext.py} now recognizes only literal strings as
docstrings and translatable strings, and rejects bytes literals and
f-string expressions.

@item 
bpo-31920@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31920}: Fixed handling directories as arguments in the @code{pygettext}
script. Based on patch by Oleg Krasnikov.

@item 
bpo-29673@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29673}: Fix pystackv and pystack gdbinit macros.

@item 
bpo-32885@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32885}: Add an @code{-n} flag for @code{Tools/scripts/pathfix.py} to disable
automatic backup creation (files with @code{~} suffix).

@item 
bpo-31583@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31583}: Fix 2to3 for using with –add-suffix option but without
–output-dir option for relative path to files in current directory.
@end itemize

@node C API<65>,,Tools/Demos<44>,Python 3 6 6 release candidate 1
@anchor{whatsnew/changelog id855}@anchor{1ea9}
@subsubsection C API



@itemize -

@item 
bpo-32374@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32374}: Document that m_traverse for multi-phase initialized modules
can be called with m_state=NULL, and add a sanity check
@end itemize

@node Python 3 6 5 final,Python 3 6 5 release candidate 1,Python 3 6 6 release candidate 1,Changelog
@anchor{whatsnew/changelog python-3-6-5-final}@anchor{1eaa}
@subsection Python 3.6.5 final


`Release date: 2018-03-28'

@menu
* Tests: Tests<65>. 
* Build: Build<73>. 

@end menu

@node Tests<65>,Build<73>,,Python 3 6 5 final
@anchor{whatsnew/changelog id856}@anchor{1eab}
@subsubsection Tests



@itemize -

@item 
bpo-32872@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32872}: Avoid regrtest compatibility issue with namespace packages.
@end itemize

@node Build<73>,,Tests<65>,Python 3 6 5 final
@anchor{whatsnew/changelog id857}@anchor{1eac}
@subsubsection Build



@itemize -

@item 
bpo-33163@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33163}: Upgrade pip to 9.0.3 and setuptools to v39.0.1.
@end itemize

@node Python 3 6 5 release candidate 1,Python 3 6 4 final,Python 3 6 5 final,Changelog
@anchor{whatsnew/changelog python-3-6-5-release-candidate-1}@anchor{1ead}
@subsection Python 3.6.5 release candidate 1


`Release date: 2018-03-13'

@menu
* Security: Security<51>. 
* Core and Builtins: Core and Builtins<171>. 
* Library: Library<175>. 
* Documentation: Documentation<68>. 
* Tests: Tests<66>. 
* Build: Build<74>. 
* Windows: Windows<65>. 
* macOS: macOS<50>. 
* IDLE: IDLE<47>. 
* Tools/Demos: Tools/Demos<45>. 
* C API: C API<66>. 

@end menu

@node Security<51>,Core and Builtins<171>,,Python 3 6 5 release candidate 1
@anchor{whatsnew/changelog id858}@anchor{1eae}
@subsubsection Security



@itemize -

@item 
bpo-33001@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33001}: Minimal fix to prevent buffer overrun in os.symlink on Windows

@item 
bpo-32981@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32981}: Regexes in difflib and poplib were vulnerable to catastrophic
backtracking. These regexes formed potential DOS vectors (REDOS). They
have been refactored. This resolves 
@geindex Common Vulnerabilities and Exposures; CVE 2018-1060
CVE 2018-1060@footnote{https://www.cve.org/CVERecord?id=CVE-2018-1060} and 
@geindex Common Vulnerabilities and Exposures; CVE 2018-1061
CVE 2018-1061@footnote{https://www.cve.org/CVERecord?id=CVE-2018-1061}.
Patch by Jamie Davis.
@end itemize

@node Core and Builtins<171>,Library<175>,Security<51>,Python 3 6 5 release candidate 1
@anchor{whatsnew/changelog id859}@anchor{1eaf}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-33026@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33026}: Fixed jumping out of “with” block by setting f_lineno.

@item 
bpo-17288@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17288}: Prevent jumps from ‘return’ and ‘exception’ trace events.

@item 
bpo-32889@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32889}: Update Valgrind suppression list to account for the rename of
@code{Py_ADDRESS_IN_RANG} to @code{address_in_range}.

@item 
bpo-32650@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32650}: Pdb and other debuggers dependent on bdb.py will correctly step
over (next command) native coroutines. Patch by Pablo Galindo.

@item 
bpo-32685@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32685}: Improve suggestion when the Python 2 form of print statement is
either present on the same line as the header of a compound statement or
else terminated by a semi-colon instead of a newline. Patch by Nitish
Chandra.

@item 
bpo-32583@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32583}: Fix possible crashing in builtin Unicode decoders caused by
write out-of-bound errors when using customized decode error handlers.

@item 
bpo-26163@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26163}: Improved frozenset() hash to create more distinct hash values
when faced with datasets containing many similar values.

@item 
bpo-27169@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27169}: The @code{__debug__} constant is now optimized out at compile
time. This fixes also bpo-22091@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22091}.

@item 
bpo-32329@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32329}: @code{sys.flags.hash_randomization} is now properly set to 0 when
hash randomization is turned off by @code{PYTHONHASHSEED=0}.

@item 
bpo-30416@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30416}: The optimizer is now protected from spending much time doing
complex calculations and consuming much memory for creating large
constants in constant folding.

@item 
bpo-18533@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18533}: @code{repr()} on a dict containing its own @code{values()} or
@code{items()} no longer raises @code{RecursionError}; OrderedDict similarly.
Instead, use @code{...}, as for other recursive structures.  Patch by Ben
North.

@item 
bpo-32028@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32028}: Leading whitespace is now correctly ignored when generating
suggestions for converting Py2 print statements to Py3 builtin print
function calls. Patch by Sanyam Khurana.

@item 
bpo-32137@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32137}: The repr of deeply nested dict now raises a RecursionError
instead of crashing due to a stack overflow.
@end itemize

@node Library<175>,Documentation<68>,Core and Builtins<171>,Python 3 6 5 release candidate 1
@anchor{whatsnew/changelog id860}@anchor{1eb0}
@subsubsection Library



@itemize -

@item 
bpo-33064@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33064}: lib2to3 now properly supports trailing commas after @code{*args}
and @code{**kwargs} in function signatures.

@item 
bpo-31804@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31804}: Avoid failing in multiprocessing.Process if the standard
streams are closed or None at exit.

@item 
bpo-33037@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33037}: Skip sending/receiving data after SSL transport closing.

@item 
bpo-30353@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30353}: Fix ctypes pass-by-value for structs on 64-bit Cygwin/MinGW.

@item 
bpo-33009@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33009}: Fix inspect.signature() for single-parameter partialmethods.

@item 
bpo-32969@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32969}: Expose several missing constants in zlib and fix corresponding
documentation.

@item 
bpo-32713@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32713}: Fixed tarfile.itn handling of out-of-bounds float values. Patch
by Joffrey Fuhrer.

@item 
bpo-30622@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30622}: The ssl module now detects missing NPN support in LibreSSL.

@item 
bpo-32922@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32922}: dbm.open() now encodes filename with the filesystem encoding
rather than default encoding.

@item 
bpo-32859@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32859}: In @code{os.dup2}, don’t check every call whether the @code{dup3}
syscall exists or not.

@item 
bpo-21060@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21060}: Rewrite confusing message from setup.py upload from “No dist
file created in earlier command” to the more helpful “Must create and
upload files in one command”.

@item 
bpo-32857@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32857}: In @ref{f6,,tkinter}, @code{after_cancel(None)} now raises a
@ref{2ec,,ValueError} instead of canceling the first scheduled function.
Patch by Cheryl Sabella.

@item 
bpo-32852@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32852}: Make sure sys.argv remains as a list when running trace.

@item 
bpo-32841@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32841}: Fixed @code{asyncio.Condition} issue which silently ignored
cancellation after notifying and cancelling a conditional lock. Patch by
Bar Harel.

@item 
bpo-31787@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31787}: Fixed refleaks of @code{__init__()} methods in various modules.
(Contributed by Oren Milman)

@item 
bpo-30157@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30157}: Fixed guessing quote and delimiter in csv.Sniffer.sniff() when
only the last field is quoted.  Patch by Jake Davis.

@item 
bpo-32394@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32394}: socket: Remove TCP_FASTOPEN, TCP_KEEPCNT flags on older version
Windows during run-time.

@item 
bpo-32777@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32777}: Fix a rare but potential pre-exec child process deadlock in
subprocess on POSIX systems when marking file descriptors inheritable on
exec in the child process.  This bug appears to have been introduced in
3.4.

@item 
bpo-32647@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32647}: The ctypes module used to depend on indirect linking for
dlopen. The shared extension is now explicitly linked against libdl on
platforms with dl.

@item 
bpo-32734@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32734}: Fixed @code{asyncio.Lock()} safety issue which allowed acquiring
and locking the same lock multiple times, without it being free. Patch by
Bar Harel.

@item 
bpo-32727@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32727}: Do not include name field in SMTP envelope from address. Patch
by Stéphane Wirtel

@item 
bpo-27931@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27931}: Fix email address header parsing error when the username is an
empty quoted string. Patch by Xiang Zhang.

@item 
bpo-32304@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32304}: distutils’ upload command no longer corrupts tar files ending
with a CR byte, and no longer tries to convert CR to CRLF in any of the
upload text fields.

@item 
bpo-32502@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32502}: uuid.uuid1 no longer raises an exception if a 64-bit hardware
address is encountered.

@item 
bpo-31848@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31848}: Fix the error handling in Aifc_read.initfp() when the SSND
chunk is not found. Patch by Zackery Spytz.

@item 
bpo-32555@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32555}: On FreeBSD and Solaris, os.strerror() now always decode the
byte string from the current locale encoding, rather than using
ASCII/surrogateescape in some cases.

@item 
bpo-32521@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32521}: The nis module is now compatible with new libnsl and headers
location.

@item 
bpo-32473@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32473}: Improve ABCMeta._dump_registry() output readability

@item 
bpo-32521@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32521}: glibc has removed Sun RPC. Use replacement libtirpc headers and
library in nis module.

@item 
bpo-32228@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32228}: Ensure that @code{truncate()} preserves the file position (as
reported by @code{tell()}) after writes longer than the buffer size.

@item 
bpo-26133@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26133}: Don’t unsubscribe signals in asyncio UNIX event loop on
interpreter shutdown.

@item 
bpo-32185@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32185}: The SSL module no longer sends IP addresses in SNI TLS
extension on platforms with OpenSSL 1.0.2+ or inet_pton.

@item 
bpo-32323@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32323}: @ref{f39,,urllib.parse.urlsplit()} does not convert zone-id (scope)
to lower case for scoped IPv6 addresses in hostnames now.

@item 
bpo-32302@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32302}: Fix bdist_wininst of distutils for CRT v142: it binary
compatible with CRT v140.

@item 
bpo-32255@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32255}: A single empty field is now always quoted when written into a
CSV file. This allows to distinguish an empty row from a row consisting of
a single empty field. Patch by Licht Takeuchi.

@item 
bpo-32277@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32277}: Raise @code{NotImplementedError} instead of @code{SystemError} on
platforms where @code{chmod(..., follow_symlinks=False)} is not supported.
Patch by Anthony Sottile.

@item 
bpo-32199@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32199}: The getnode() ip getter now uses ‘ip link’ instead of ‘ip link
list’.

@item 
bpo-27456@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27456}: Ensure TCP_NODELAY is set on Linux. Tests by Victor Stinner.

@item 
bpo-31900@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31900}: The @ref{df7,,locale.localeconv()} function now sets temporarily the
@code{LC_CTYPE} locale to the @code{LC_NUMERIC} locale to decode
@code{decimal_point} and @code{thousands_sep} byte strings if they are non-ASCII
or longer than 1 byte, and the @code{LC_NUMERIC} locale is different than the
@code{LC_CTYPE} locale. This temporary change affects other threads. Same
change for the @ref{832,,str.format()} method when formatting a number
(@ref{19b,,int}, @ref{196,,float}, @code{float} and subclasses) with the
@code{n} type (ex: @code{'@{:n@}'.format(1234)}).

@item 
bpo-31802@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31802}: Importing native path module (@code{posixpath}, @code{ntpath}) now
works even if the @code{os} module still is not imported.
@end itemize

@node Documentation<68>,Tests<66>,Library<175>,Python 3 6 5 release candidate 1
@anchor{whatsnew/changelog id861}@anchor{1eb1}
@subsubsection Documentation



@itemize -

@item 
bpo-17232@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17232}: Clarify docs for -O and -OO.  Patch by Terry Reedy.

@item 
bpo-32800@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32800}: Update link to w3c doc for xml default namespaces.

@item 
bpo-8722@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8722}: Document @code{__getattr__()} behavior when property @code{get()}
method raises @ref{5ee,,AttributeError}.

@item 
bpo-32614@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32614}: Modify RE examples in documentation to use raw strings to
prevent @ref{1a3,,DeprecationWarning} and add text to REGEX HOWTO to highlight
the deprecation.

@item 
bpo-31972@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31972}: Improve docstrings for @code{pathlib.PurePath} subclasses.

@item 
bpo-17799@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17799}: Explain real behaviour of sys.settrace and sys.setprofile and
their C-API counterparts regarding which type of events are received in
each function. Patch by Pablo Galindo Salgado.
@end itemize

@node Tests<66>,Build<74>,Documentation<68>,Python 3 6 5 release candidate 1
@anchor{whatsnew/changelog id862}@anchor{1eb2}
@subsubsection Tests



@itemize -

@item 
bpo-32517@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32517}: Fix failing @code{test_asyncio} on macOS 10.12.2+ due to transport
of @code{KqueueSelector} loop was not being closed.

@item 
bpo-32721@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32721}: Fix test_hashlib to not fail if the _md5 module is not built.

@item 
bpo-32252@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32252}: Fix faulthandler_suppress_crash_report() used to prevent core
dump files when testing crashes. getrlimit() returns zero on success.

@item 
bpo-31518@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31518}: Debian Unstable has disabled TLS 1.0 and 1.1 for
SSLv23_METHOD(). Change TLS/SSL protocol of some tests to PROTOCOL_TLS or
PROTOCOL_TLSv1_2 to make them pass on Debian.
@end itemize

@node Build<74>,Windows<65>,Tests<66>,Python 3 6 5 release candidate 1
@anchor{whatsnew/changelog id863}@anchor{1eb3}
@subsubsection Build



@itemize -

@item 
bpo-32635@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32635}: Fix segfault of the crypt module when libxcrypt is provided
instead of libcrypt at the system.
@end itemize

@node Windows<65>,macOS<50>,Build<74>,Python 3 6 5 release candidate 1
@anchor{whatsnew/changelog id864}@anchor{1eb4}
@subsubsection Windows



@itemize -

@item 
bpo-33016@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33016}: Fix potential use of uninitialized memory in
nt._getfinalpathname

@item 
bpo-32903@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32903}: Fix a memory leak in os.chdir() on Windows if the current
directory is set to a UNC path.

@item 
bpo-31966@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31966}: Fixed WindowsConsoleIO.write() for writing empty data.

@item 
bpo-32409@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32409}: Ensures activate.bat can handle Unicode contents.

@item 
bpo-32457@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32457}: Improves handling of denormalized executable path when
launching Python.

@item 
bpo-32370@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32370}: Use the correct encoding for ipconfig output in the uuid
module. Patch by Segev Finer.

@item 
bpo-29248@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29248}: Fix @ref{b19,,os.readlink()} on Windows, which was mistakenly
treating the @code{PrintNameOffset} field of the reparse data buffer as a
number of characters instead of bytes. Patch by Craig Holmquist and SSE4.

@item 
bpo-32588@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32588}: Create standalone _distutils_findvs module.
@end itemize

@node macOS<50>,IDLE<47>,Windows<65>,Python 3 6 5 release candidate 1
@anchor{whatsnew/changelog id865}@anchor{1eb5}
@subsubsection macOS



@itemize -

@item 
bpo-32726@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32726}: Provide an additional, more modern macOS installer variant that
supports macOS 10.9+ systems in 64-bit mode only. Upgrade the supplied
third-party libraries to OpenSSL 1.0.2n, XZ 5.2.3, and SQLite 3.22.0. The
10.9+ installer now links with and supplies its own copy of Tcl/Tk 8.6.8.
@end itemize

@node IDLE<47>,Tools/Demos<45>,macOS<50>,Python 3 6 5 release candidate 1
@anchor{whatsnew/changelog id866}@anchor{1eb6}
@subsubsection IDLE



@itemize -

@item 
bpo-32984@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32984}: Set @code{__file__} while running a startup file.  Like Python,
IDLE optionally runs one startup file in the Shell window before
presenting the first interactive input prompt.  For IDLE, @code{-s} runs a
file named in environmental variable  
@geindex IDLESTARTUP
@geindex 환경 변수; IDLESTARTUP
@code{IDLESTARTUP} or
@geindex PYTHONSTARTUP
@geindex 환경 변수; PYTHONSTARTUP
@ref{1b8,,PYTHONSTARTUP}; @code{-r file} runs @code{file}.  Python sets
@code{__file__} to the startup file name before running the file and unsets
it before the first prompt.  IDLE now does the same when run normally,
without the @code{-n} option.

@item 
bpo-32940@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32940}: Simplify and rename StringTranslatePseudoMapping in pyparse.

@item 
bpo-32916@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32916}: Change @code{str} to @code{code} in pyparse.

@item 
bpo-32905@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32905}: Remove unused code in pyparse module.

@item 
bpo-32874@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32874}: Add tests for pyparse.

@item 
bpo-32837@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32837}: Using the system and place-dependent default encoding for
open() is a bad idea for IDLE’s system and location-independent files.

@item 
bpo-32826@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32826}: Add “encoding=utf-8” to open() in IDLE’s test_help_about. GUI
test test_file_buttons() only looks at initial ascii-only lines, but
failed on systems where open() defaults to ‘ascii’ because readline()
internally reads and decodes far enough ahead to encounter a non-ascii
character in CREDITS.txt.

@item 
bpo-32765@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32765}: Update configdialog General tab docstring to add new widgets to
the widget list.
@end itemize

@node Tools/Demos<45>,C API<66>,IDLE<47>,Python 3 6 5 release candidate 1
@anchor{whatsnew/changelog id867}@anchor{1eb7}
@subsubsection Tools/Demos



@itemize -

@item 
bpo-24960@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24960}: 2to3 and lib2to3 can now read pickled grammar files using
pkgutil.get_data() rather than probing the filesystem. This lets 2to3 and
lib2to3 work when run from a zipfile.

@item 
bpo-32222@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32222}: Fix pygettext not extracting docstrings for functions with type
annotated arguments. Patch by Toby Harradine.
@end itemize

@node C API<66>,,Tools/Demos<45>,Python 3 6 5 release candidate 1
@anchor{whatsnew/changelog id868}@anchor{1eb8}
@subsubsection C API



@itemize -

@item 
bpo-29084@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29084}: Undocumented C API for OrderedDict has been excluded from the
limited C API. It was added by mistake and actually never worked in the
limited C API.
@end itemize

@node Python 3 6 4 final,Python 3 6 4 release candidate 1,Python 3 6 5 release candidate 1,Changelog
@anchor{whatsnew/changelog python-3-6-4-final}@anchor{1eb9}
@subsection Python 3.6.4 final


`Release date: 2017-12-18'

There were no new code changes in version 3.6.4 since v3.6.4rc1.

@node Python 3 6 4 release candidate 1,Python 3 6 3 final,Python 3 6 4 final,Changelog
@anchor{whatsnew/changelog python-3-6-4-release-candidate-1}@anchor{1eba}
@subsection Python 3.6.4 release candidate 1


`Release date: 2017-12-05'

@menu
* Core and Builtins: Core and Builtins<172>. 
* Library: Library<176>. 
* Documentation: Documentation<69>. 
* Tests: Tests<67>. 
* Build: Build<75>. 
* Windows: Windows<66>. 
* macOS: macOS<51>. 
* IDLE: IDLE<48>. 
* Tools/Demos: Tools/Demos<46>. 
* C API: C API<67>. 

@end menu

@node Core and Builtins<172>,Library<176>,,Python 3 6 4 release candidate 1
@anchor{whatsnew/changelog id869}@anchor{1ebb}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-32176@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32176}: co_flags.CO_NOFREE is now always set correctly by the code
object constructor based on freevars and cellvars, rather than needing to
be set correctly by the caller. This ensures it will be cleared
automatically when additional cell references are injected into a modified
code object and function.

@item 
bpo-31949@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31949}: Fixed several issues in printing tracebacks
(PyTraceBack_Print()). Setting sys.tracebacklimit to 0 or less now
suppresses printing tracebacks. Setting sys.tracebacklimit to None now
causes using the default limit. Setting sys.tracebacklimit to an integer
larger than LONG_MAX now means using the limit LONG_MAX rather than the
default limit. Fixed integer overflows in the case of more than @code{2**31}
traceback items on Windows. Fixed output errors handling.

@item 
bpo-30696@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30696}: Fix the interactive interpreter looping endlessly when no
memory.

@item 
bpo-20047@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20047}: Bytearray methods partition() and rpartition() now accept only
bytes-like objects as separator, as documented.  In particular they now
raise TypeError rather of returning a bogus result when an integer is
passed as a separator.

@item 
bpo-31852@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31852}: Fix a segmentation fault caused by a combination of the async
soft keyword and continuation lines.

@item 
bpo-21720@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21720}: BytesWarning no longer emitted when the `fromlist' argument of
@code{__import__()} or the @code{__all__} attribute of the module contain bytes
instances.

@item 
bpo-31825@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31825}: Fixed OverflowError in the ‘unicode-escape’ codec and in
codecs.escape_decode() when decode an escaped non-ascii byte.

@item 
bpo-28603@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28603}: Print the full context/cause chain of exceptions on interpreter
exit, even if an exception in the chain is unhashable or compares equal to
later ones. Patch by Zane Bitter.

@item 
bpo-31786@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31786}: Fix timeout rounding in the select module to round correctly
negative timeouts between -1.0 and 0.0. The functions now block waiting
for events as expected. Previously, the call was incorrectly non-blocking.
Patch by Pablo Galindo.

@item 
bpo-31642@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31642}: Restored blocking “from package import module” by setting
sys.modules[“package.module”] to None.

@item 
bpo-31626@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31626}: Fixed a bug in debug memory allocator.  There was a write to
freed memory after shrinking a memory block.

@item 
bpo-31619@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31619}: Fixed a ValueError when convert a string with large number of
underscores to integer with binary base.

@item 
bpo-31592@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31592}: Fixed an assertion failure in Python parser in case of a bad
@code{unicodedata.normalize()}. Patch by Oren Milman.

@item 
bpo-31588@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31588}: Raise a @code{TypeError} with a helpful error message when class
creation fails due to a metaclass with a bad @code{__prepare__()} method.
Patch by Oren Milman.

@item 
bpo-31566@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31566}: Fix an assertion failure in @code{_warnings.warn()} in case of a
bad @code{__name__} global. Patch by Oren Milman.

@item 
bpo-31505@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31505}: Fix an assertion failure in @code{json}, in case
@code{_json.make_encoder()} received a bad @code{encoder()} argument. Patch by
Oren Milman.

@item 
bpo-31492@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31492}: Fix assertion failures in case of failing to import from a
module with a bad @code{__name__} attribute, and in case of failing to access
an attribute of such a module. Patch by Oren Milman.

@item 
bpo-31490@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31490}: Fix an assertion failure in @code{ctypes} class definition, in
case the class has an attribute whose name is specified in @code{_anonymous_}
but not in @code{_fields_}. Patch by Oren Milman.

@item 
bpo-31478@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31478}: Fix an assertion failure in @code{_random.Random.seed()} in case
the argument has a bad @code{__abs__()} method. Patch by Oren Milman.

@item 
bpo-31315@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31315}: Fix an assertion failure in imp.create_dynamic(), when
spec.name is not a string. Patch by Oren Milman.

@item 
bpo-31311@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31311}: Fix a crash in the @code{__setstate__()} method of
@code{ctypes._CData}, in case of a bad @code{__dict__}. Patch by Oren Milman.

@item 
bpo-31293@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31293}: Fix crashes in true division and multiplication of a timedelta
object by a float with a bad as_integer_ratio() method. Patch by Oren
Milman.

@item 
bpo-31285@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31285}: Fix an assertion failure in @code{warnings.warn_explicit}, when
the return value of the received loader’s @code{get_source()} has a bad
@code{splitlines()} method. Patch by Oren Milman.

@item 
bpo-30817@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30817}: @code{PyErr_PrintEx()} clears now the ignored exception that may
be raised by @code{_PySys_SetObjectId()}, for example when no memory.
@end itemize

@node Library<176>,Documentation<69>,Core and Builtins<172>,Python 3 6 4 release candidate 1
@anchor{whatsnew/changelog id870}@anchor{1ebc}
@subsubsection Library



@itemize -

@item 
bpo-28556@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28556}: Two minor fixes for @code{typing} module: allow shallow copying
instances of generic classes, improve interaction of @code{__init_subclass__}
with generics. Original PRs by Ivan Levkivskyi.

@item 
bpo-27240@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27240}: The header folding algorithm for the new email policies has
been rewritten, which also fixes bpo-30788@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30788}, bpo-31831@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31831}, and bpo-32182@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32182}.  In
particular, RFC2231 folding is now done correctly.

@item 
bpo-32186@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32186}: io.FileIO.readall() and io.FileIO.read() now release the GIL
when getting the file size. Fixed hang of all threads with inaccessible
NFS server. Patch by Nir Soffer.

@item 
bpo-12239@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12239}: Make @code{msilib.SummaryInformation.GetProperty()} return
@code{None} when the value of property is @code{VT_EMPTY}.  Initial patch by
Mark Mc Mahon.

@item 
bpo-31325@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31325}: Fix wrong usage of @ref{4e0,,collections.namedtuple()} in the
@ref{1e7f,,RobotFileParser.parse()}
method. Initial patch by Robin Wellner.

@item 
bpo-12382@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12382}: @code{msilib.OpenDatabase()} now raises a better exception
message when it couldn’t open or create an MSI file.  Initial patch by
William Tisäter.

@item 
bpo-32110@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32110}: @code{codecs.StreamReader.read(n)} now returns not more than `n'
characters/bytes for non-negative `n'. This makes it compatible with
@code{read()} methods of other file-like objects.

@item 
bpo-32072@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32072}: Fixed issues with binary plists: Fixed saving bytearrays.
Identical objects will be saved only once. Equal references will be load
as identical objects. Added support for saving and loading recursive data
structures.

@item 
bpo-32034@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32034}: Make asyncio.IncompleteReadError and LimitOverrunError
pickleable.

@item 
bpo-32015@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32015}: Fixed the looping of asyncio in the case of reconnection the
socket during waiting async read/write from/to the socket.

@item 
bpo-32011@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32011}: Restored support of loading marshal files with the TYPE_INT64
code. These files can be produced in Python 2.7.

@item 
bpo-31970@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31970}: Reduce performance overhead of asyncio debug mode.

@item 
bpo-9678@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9678}: Fixed determining the MAC address in the uuid module: Using
ifconfig on NetBSD and OpenBSD. Using arp on Linux, FreeBSD, NetBSD and
OpenBSD. Based on patch by Takayuki Shimizukawa.

@item 
bpo-30057@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30057}: Fix potential missed signal in signal.signal().

@item 
bpo-31933@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31933}: Fix Blake2 params leaf_size and node_offset on big endian
platforms. Patch by Jack O’Connor.

@item 
bpo-31927@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31927}: Fixed compilation of the socket module on NetBSD 8.  Fixed
assertion failure or reading arbitrary data when parse a AF_BLUETOOTH
address on NetBSD and DragonFly BSD.

@item 
bpo-27666@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27666}: Fixed stack corruption in curses.box() and curses.ungetmouse()
when the size of types chtype or mmask_t is less than the size of C long.
curses.box() now accepts characters as arguments.  Based on patch by Steve
Fink.

@item 
bpo-31897@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31897}: plistlib now catches more errors when read binary plists and
raises InvalidFileException instead of unexpected exceptions.

@item 
bpo-25720@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25720}: Fix the method for checking pad state of curses WINDOW. Patch
by Masayuki Yamamoto.

@item 
bpo-31893@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31893}: Fixed the layout of the kqueue_event structure on OpenBSD and
NetBSD. Fixed the comparison of the kqueue_event objects.

@item 
bpo-31891@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31891}: Fixed building the curses module on NetBSD.

@item 
bpo-28416@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28416}: Instances of pickle.Pickler subclass with the persistent_id()
method and pickle.Unpickler subclass with the persistent_load() method no
longer create reference cycles.

@item 
bpo-28326@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28326}: Fix multiprocessing.Process when stdout and/or stderr is closed
or None.

@item 
bpo-31457@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31457}: If nested log adapters are used, the inner @code{process()}
methods are no longer omitted.

@item 
bpo-31457@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31457}: The @code{manager} property on LoggerAdapter objects is now
properly settable.

@item 
bpo-31806@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31806}: Fix timeout rounding in time.sleep(), threading.Lock.acquire()
and socket.socket.settimeout() to round correctly negative timeouts
between -1.0 and 0.0. The functions now block waiting for events as
expected. Previously, the call was incorrectly non-blocking. Patch by
Pablo Galindo.

@item 
bpo-28603@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28603}: traceback: Fix a TypeError that occurred during printing of
exception tracebacks when either the current exception or an exception in
its context/cause chain is unhashable. Patch by Zane Bitter.

@item 
bpo-30058@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30058}: Fixed buffer overflow in select.kqueue.control().

@item 
bpo-31770@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31770}: Prevent a crash when calling the @code{__init__()} method of a
@code{sqlite3.Cursor} object more than once. Patch by Oren Milman.

@item 
bpo-31672@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31672}: @code{idpattern} in @code{string.Template} matched some non-ASCII
characters. Now it uses @code{-i} regular expression local flag to avoid
non-ASCII characters.

@item 
bpo-31764@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31764}: Prevent a crash in @code{sqlite3.Cursor.close()} in case the
@code{Cursor} object is uninitialized. Patch by Oren Milman.

@item 
bpo-31752@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31752}: Fix possible crash in timedelta constructor called with custom
integers.

@item 
bpo-31701@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31701}: On Windows, faulthandler.enable() now ignores MSC and COM
exceptions.

@item 
bpo-31728@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31728}: Prevent crashes in @code{_elementtree} due to unsafe cleanup of
@code{Element.text} and @code{Element.tail}. Patch by Oren Milman.

@item 
bpo-31620@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31620}: an empty asyncio.Queue now doesn’t leak memory when queue.get
pollers timeout

@item 
bpo-31632@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31632}: Fix method set_protocol() of class _SSLProtocolTransport in
asyncio module. This method was previously modifying a wrong reference to
the protocol.

@item 
bpo-31675@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31675}: Fixed memory leaks in Tkinter’s methods splitlist() and split()
when pass a string larger than 2 GiB.

@item 
bpo-31673@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31673}: Fixed typo in the name of Tkinter’s method adderrorinfo().

@item 
bpo-30806@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30806}: Fix the string representation of a netrc object.

@item 
bpo-15037@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15037}: Added a workaround for getkey() in curses for ncurses 5.7 and
earlier.

@item 
bpo-25351@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25351}: Avoid venv activate failures with undefined variables

@item 
bpo-25532@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25532}: inspect.unwrap() will now only try to unwrap an object
sys.getrecursionlimit() times, to protect against objects which create a
new object on every attribute access.

@item 
bpo-30347@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30347}: Stop crashes when concurrently iterate over itertools.groupby()
iterators.

@item 
bpo-31516@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31516}: @code{threading.current_thread()} should not return a dummy thread
at shutdown.

@item 
bpo-31351@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31351}: python -m ensurepip now exits with non-zero exit code if pip
bootstrapping has failed.

@item 
bpo-31482@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31482}: @code{random.seed()} now works with bytes in version=1

@item 
bpo-31334@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31334}: Fix @code{poll.poll([timeout])} in the @code{select} module for
arbitrary negative timeouts on all OSes where it can only be a
non-negative integer or -1. Patch by Riccardo Coccioli.

@item 
bpo-31310@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31310}: multiprocessing’s semaphore tracker should be launched again if
crashed.

@item 
bpo-31308@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31308}: Make multiprocessing’s forkserver process immune to Ctrl-C and
other user interruptions. If it crashes, restart it when necessary.
@end itemize

@node Documentation<69>,Tests<67>,Library<176>,Python 3 6 4 release candidate 1
@anchor{whatsnew/changelog id871}@anchor{1ebd}
@subsubsection Documentation



@itemize -

@item 
bpo-32105@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32105}: Added asyncio.BaseEventLoop.connect_accepted_socket
versionadded marker.

@item 
bpo-31537@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31537}: Fix incorrect usage of @code{get_history_length} in readline
documentation example code. Patch by Brad Smith.

@item 
bpo-30085@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30085}: The operator functions without double underscores are preferred
for clarity. The one with underscores are only kept for
back-compatibility.
@end itemize

@node Tests<67>,Build<75>,Documentation<69>,Python 3 6 4 release candidate 1
@anchor{whatsnew/changelog id872}@anchor{1ebe}
@subsubsection Tests



@itemize -

@item 
bpo-31380@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31380}: Skip test_httpservers test_undecodable_file on macOS: fails on
APFS.

@item 
bpo-31705@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31705}: Skip test_socket.test_sha256() on Linux kernel older than 4.5.
The test fails with ENOKEY on kernel 3.10 (on ppc64le). A fix was merged
into the kernel 4.5.

@item 
bpo-31174@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31174}: Fix test_tools.test_unparse: DirectoryTestCase now stores the
names sample to always test the same files. It prevents false alarms when
hunting reference leaks.

@item 
bpo-30695@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30695}: Add the @code{set_nomemory(start, stop)} and
@code{remove_mem_hooks()} functions to the @code{_testcapi} module.
@end itemize

@node Build<75>,Windows<66>,Tests<67>,Python 3 6 4 release candidate 1
@anchor{whatsnew/changelog id873}@anchor{1ebf}
@subsubsection Build



@itemize -

@item 
bpo-32059@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32059}: @code{detect_modules()} in @code{setup.py} now also searches the
sysroot paths when cross-compiling.

@item 
bpo-31957@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31957}: Fixes Windows SDK version detection when building for Windows.

@item 
bpo-31609@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31609}: Fixes quotes in PCbuild/clean.bat

@item 
bpo-31934@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31934}: Abort the build when building out of a not clean source tree.

@item 
bpo-31926@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31926}: Fixed Argument Clinic sometimes causing compilation errors when
there was more than one function and/or method in a .c file with the same
name.

@item 
bpo-28791@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28791}: Update Windows builds to use SQLite 3.21.0.

@item 
bpo-28791@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28791}: Update OS X installer to use SQLite 3.21.0.

@item 
bpo-22140@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22140}: Prevent double substitution of prefix in python-config.sh.

@item 
bpo-31536@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31536}: Avoid wholesale rebuild after @code{make regen-all} if nothing
changed.
@end itemize

@node Windows<66>,macOS<51>,Build<75>,Python 3 6 4 release candidate 1
@anchor{whatsnew/changelog id874}@anchor{1ec0}
@subsubsection Windows



@itemize -

@item 
bpo-1102@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1102}: Return @code{None} when @code{View.Fetch()} returns
@code{ERROR_NO_MORE_ITEMS} instead of raising @code{MSIError}. Initial patch by
Anthony Tuininga.

@item 
bpo-31944@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31944}: Fixes Modify button in Apps and Features dialog.
@end itemize

@node macOS<51>,IDLE<48>,Windows<66>,Python 3 6 4 release candidate 1
@anchor{whatsnew/changelog id875}@anchor{1ec1}
@subsubsection macOS



@itemize -

@item 
bpo-31392@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31392}: Update macOS installer to use OpenSSL 1.0.2m
@end itemize

@node IDLE<48>,Tools/Demos<46>,macOS<51>,Python 3 6 4 release candidate 1
@anchor{whatsnew/changelog id876}@anchor{1ec2}
@subsubsection IDLE



@itemize -

@item 
bpo-32207@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32207}: Improve tk event exception tracebacks in IDLE. When tk event
handling is driven by IDLE’s run loop, a confusing and distracting
queue.EMPTY traceback context is no longer added to tk event exception
tracebacks.  The traceback is now the same as when event handling is
driven by user code.  Patch based on a suggestion by Serhiy Storchaka.

@item 
bpo-32164@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32164}: Delete unused file idlelib/tabbedpages.py. Use of TabbedPageSet
in configdialog was replaced by ttk.Notebook.

@item 
bpo-32100@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32100}: IDLE: Fix old and new bugs in pathbrowser; improve tests. Patch
mostly by Cheryl Sabella.

@item 
bpo-31858@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31858}: IDLE – Restrict shell prompt manipulation to the shell. Editor
and output windows only see an empty last prompt line.  This simplifies
the code and fixes a minor bug when newline is inserted. Sys.ps1, if
present, is read on Shell start-up, but is not set or changed.

@item 
bpo-31860@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31860}: The font sample in the IDLE configuration dialog is now
editable. Changes persist while IDLE remains open

@item 
bpo-31836@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31836}: Test_code_module now passes if run after test_idle, which sets
ps1. The code module uses sys.ps1 if present or sets it to ‘>>> ‘ if not.
Test_code_module now properly tests both behaviors.  Ditto for ps2.

@item 
bpo-28603@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28603}: Fix a TypeError that caused a shell restart when printing a
traceback that includes an exception that is unhashable. Patch by Zane
Bitter.

@item 
bpo-13802@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13802}: Use non-Latin characters in the IDLE’s Font settings sample.
Even if one selects a font that defines a limited subset of the unicode
Basic Multilingual Plane, tcl/tk will use other fonts that define a
character. The expanded example give users of non-Latin characters a
better idea of what they might see in IDLE’s shell and editors. To make
room for the expanded sample, frames on the Font tab are re-arranged. The
Font/Tabs help explains a bit about the additions.

@item 
bpo-31460@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31460}: Simplify the API of IDLE’s Module Browser. Passing a widget
instead of an flist with a root widget opens the option of creating a
browser frame that is only part of a window.  Passing a full file name
instead of pieces assumed to come from a .py file opens the possibility of
browsing python files that do not end in .py.

@item 
bpo-31649@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31649}: IDLE - Make _htest, _utest parameters keyword only.

@item 
bpo-31559@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31559}: Remove test order dependence in idle_test.test_browser.

@item 
bpo-31459@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31459}: Rename IDLE’s module browser from Class Browser to Module
Browser. The original module-level class and method browser became a
module browser, with the addition of module-level functions, years ago.
Nested classes and functions were added yesterday.  For
back-compatibility, the virtual event <<open-class-browser>>, which
appears on the Keys tab of the Settings dialog, is not changed. Patch by
Cheryl Sabella.

@item 
bpo-31500@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31500}: Default fonts now are scaled on HiDPI displays.

@item 
bpo-1612262@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1612262}: IDLE module browser now shows nested classes and functions.
Original patches for code and tests by Guilherme Polo and Cheryl Sabella,
respectively.
@end itemize

@node Tools/Demos<46>,C API<67>,IDLE<48>,Python 3 6 4 release candidate 1
@anchor{whatsnew/changelog id877}@anchor{1ec3}
@subsubsection Tools/Demos



@itemize -

@item 
bpo-30722@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30722}: Make redemo work with Python 3.6 and newer versions. Also,
remove the @code{LOCALE} option since it doesn’t work with string patterns in
Python 3. Patch by Christoph Sarnowski.
@end itemize

@node C API<67>,,Tools/Demos<46>,Python 3 6 4 release candidate 1
@anchor{whatsnew/changelog id878}@anchor{1ec4}
@subsubsection C API



@itemize -

@item 
bpo-20891@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20891}: Fix PyGILState_Ensure(). When PyGILState_Ensure() is called in
a non-Python thread before PyEval_InitThreads(), only call
PyEval_InitThreads() after calling PyThreadState_New() to fix a crash.

@item 
bpo-31532@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31532}: Fix memory corruption due to allocator mix in getpath.c between
Py_GetPath() and Py_SetPath()

@item 
bpo-30697@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30697}: The @code{PyExc_RecursionErrorInst} singleton is removed and
@code{PyErr_NormalizeException()} does not use it anymore. This singleton is
persistent and its members being never cleared may cause a segfault during
finalization of the interpreter. See also bpo-22898@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22898}.
@end itemize

@node Python 3 6 3 final,Python 3 6 3 release candidate 1,Python 3 6 4 release candidate 1,Changelog
@anchor{whatsnew/changelog python-3-6-3-final}@anchor{1ec5}
@subsection Python 3.6.3 final


`Release date: 2017-10-03'

@menu
* Library: Library<177>. 
* Build: Build<76>. 

@end menu

@node Library<177>,Build<76>,,Python 3 6 3 final
@anchor{whatsnew/changelog id879}@anchor{1ec6}
@subsubsection Library



@itemize -

@item 
bpo-31641@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31641}: Re-allow arbitrary iterables in
@code{concurrent.futures.as_completed()}. Fixes regression in 3.6.3rc1.
@end itemize

@node Build<76>,,Library<177>,Python 3 6 3 final
@anchor{whatsnew/changelog id880}@anchor{1ec7}
@subsubsection Build



@itemize -

@item 
bpo-31662@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31662}: Fix typos in Windows @code{uploadrelease.bat} script. Fix Windows
Doc build issues in @code{Doc/make.bat}.

@item 
bpo-31423@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31423}: Fix building the PDF documentation with newer versions of
Sphinx.
@end itemize

@node Python 3 6 3 release candidate 1,Python 3 6 2 final,Python 3 6 3 final,Changelog
@anchor{whatsnew/changelog python-3-6-3-release-candidate-1}@anchor{1ec8}
@subsection Python 3.6.3 release candidate 1


`Release date: 2017-09-18'

@menu
* Security: Security<52>. 
* Core and Builtins: Core and Builtins<173>. 
* Library: Library<178>. 
* Documentation: Documentation<70>. 
* Tests: Tests<68>. 
* Build: Build<77>. 
* Windows: Windows<67>. 
* IDLE: IDLE<49>. 
* Tools/Demos: Tools/Demos<47>. 

@end menu

@node Security<52>,Core and Builtins<173>,,Python 3 6 3 release candidate 1
@anchor{whatsnew/changelog id881}@anchor{1ec9}
@subsubsection Security



@itemize -

@item 
bpo-29781@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29781}: SSLObject.version() now correctly returns None when handshake
over BIO has not been performed yet.

@item 
bpo-30947@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30947}: Upgrade libexpat embedded copy from version 2.2.1 to 2.2.3 to
get security fixes.
@end itemize

@node Core and Builtins<173>,Library<178>,Security<52>,Python 3 6 3 release candidate 1
@anchor{whatsnew/changelog id882}@anchor{1eca}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-31471@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31471}: Fix an assertion failure in @code{subprocess.Popen()} on Windows,
in case the env argument has a bad @code{keys()} method. Patch by Oren
Milman.

@item 
bpo-31418@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31418}: Fix an assertion failure in @code{PyErr_WriteUnraisable()} in case
of an exception with a bad @code{__module__} attribute. Patch by Oren Milman.

@item 
bpo-31416@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31416}: Fix assertion failures in case of a bad warnings.filters or
warnings.defaultaction. Patch by Oren Milman.

@item 
bpo-31411@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31411}: Raise a TypeError instead of SystemError in case
warnings.onceregistry is not a dictionary. Patch by Oren Milman.

@item 
bpo-31373@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31373}: Fix several possible instances of undefined behavior due to
floating-point demotions.

@item 
bpo-30465@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30465}: Location information (@code{lineno} and @code{col_offset}) in
f-strings is now (mostly) correct.  This fixes tools like flake8 from
showing warnings on the wrong line (typically the first line of the file).

@item 
bpo-31343@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31343}: Include sys/sysmacros.h for major(), minor(), and makedev().
GNU C library plans to remove the functions from sys/types.h.

@item 
bpo-31291@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31291}: Fix an assertion failure in @code{zipimport.zipimporter.get_data}
on Windows, when the return value of @code{pathname.replace('/','\\')} isn’t
a string. Patch by Oren Milman.

@item 
bpo-31271@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31271}: Fix an assertion failure in the @code{write()} method of
@code{io.TextIOWrapper}, when the encoder doesn’t return a bytes object.
Patch by Oren Milman.

@item 
bpo-31243@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31243}: Fix a crash in some methods of @code{io.TextIOWrapper}, when the
decoder’s state is invalid. Patch by Oren Milman.

@item 
bpo-30721@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30721}: @code{print} now shows correct usage hint for using Python 2
redirection syntax.  Patch by Sanyam Khurana.

@item 
bpo-31070@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31070}: Fix a race condition in importlib _get_module_lock().

@item 
bpo-31095@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31095}: Fix potential crash during GC caused by @code{tp_dealloc} which
doesn’t call @code{PyObject_GC_UnTrack()}.

@item 
bpo-31071@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31071}: Avoid masking original TypeError in call with * unpacking when
other arguments are passed.

@item 
bpo-30978@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30978}: str.format_map() now passes key lookup exceptions through.
Previously any exception was replaced with a KeyError exception.

@item 
bpo-30808@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30808}: Use _Py_atomic API for concurrency-sensitive signal state.

@item 
bpo-30876@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30876}: Relative import from unloaded package now reimports the package
instead of failing with SystemError.  Relative import from non-package now
fails with ImportError rather than SystemError.

@item 
bpo-30703@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30703}: Improve signal delivery. Avoid using Py_AddPendingCall from
signal handler, to avoid calling signal-unsafe functions. The tests I’m
adding here fail without the rest of the patch, on Linux and OS X. This
means our signal delivery logic had defects (some signals could be lost).

@item 
bpo-30765@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30765}: Avoid blocking in pthread_mutex_lock() when
PyThread_acquire_lock() is asked not to block.

@item 
bpo-31161@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31161}: Make sure the ‘Missing parentheses’ syntax error message is
only applied to SyntaxError, not to subclasses. Patch by Martijn Pieters.

@item 
bpo-30814@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30814}: Fixed a race condition when import a submodule from a package.

@item 
bpo-30597@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30597}: @code{print} now shows expected input in custom error message when
used as a Python 2 statement. Patch by Sanyam Khurana.
@end itemize

@node Library<178>,Documentation<70>,Core and Builtins<173>,Python 3 6 3 release candidate 1
@anchor{whatsnew/changelog id883}@anchor{1ecb}
@subsubsection Library



@itemize -

@item 
bpo-31499@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31499}: xml.etree: Fix a crash when a parser is part of a reference
cycle.

@item 
bpo-28556@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28556}: typing.get_type_hints now finds the right globalns for classes
and modules by default (when no @code{globalns} was specified by the caller).

@item 
bpo-28556@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28556}: Speed improvements to the @code{typing} module.  Original PRs by
Ivan Levkivskyi and Mitar.

@item 
bpo-31544@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31544}: The C accelerator module of ElementTree ignored exceptions
raised when looking up TreeBuilder target methods in XMLParser().

@item 
bpo-31234@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31234}: socket.create_connection() now fixes manually a reference
cycle: clear the variable storing the last exception on success.

@item 
bpo-31457@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31457}: LoggerAdapter objects can now be nested.

@item 
bpo-31400@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31400}: Improves SSL error handling to avoid losing error numbers.

@item 
bpo-28958@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28958}: ssl.SSLContext() now uses OpenSSL error information when a
context cannot be instantiated.

@item 
bpo-27340@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27340}: SSLSocket.sendall() now uses memoryview to create slices of
data. This fixes support for all bytes-like object. It is also more
efficient and avoids costly copies.

@item 
bpo-31178@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31178}: Fix string concatenation bug in rare error path in the
subprocess module

@item 
bpo-31350@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31350}: Micro-optimize @code{asyncio._get_running_loop()} to become up
to 10% faster.

@item 
bpo-31170@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31170}: expat: Update libexpat from 2.2.3 to 2.2.4. Fix copying of
partial characters for UTF-8 input (libexpat bug 115):
@indicateurl{https://github.com/libexpat/libexpat/issues/115}

@item 
bpo-29136@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29136}: Add TLS 1.3 cipher suites and OP_NO_TLSv1_3.

@item 
bpo-29212@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29212}: Fix concurrent.futures.thread.ThreadPoolExecutor threads to
have a non repr() based thread name by default when no thread_name_prefix
is supplied. They will now identify themselves as
“ThreadPoolExecutor-y_n”.

@item 
bpo-9146@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9146}: Fix a segmentation fault in _hashopenssl when standard hash
functions such as md5 are not available in the linked OpenSSL library.  As
in some special FIPS-140 build environments.

@item 
bpo-27144@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27144}: The @code{map()} and @code{as_completed()} iterators in
@code{concurrent.futures} now avoid keeping a reference to yielded objects.

@item 
bpo-10746@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10746}: Fix ctypes producing wrong 
@geindex Python 향상 제안; PEP 3118
PEP 3118@footnote{https://peps.python.org/pep-3118/} type codes for integer
types.

@item 
bpo-22536@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22536}: The subprocess module now sets the filename when
FileNotFoundError is raised on POSIX systems due to the executable or cwd
not being found.

@item 
bpo-31249@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31249}: concurrent.futures: WorkItem.run() used by ThreadPoolExecutor
now breaks a reference cycle between an exception object and the WorkItem
object.

@item 
bpo-31247@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31247}: xmlrpc.server now explicitly breaks reference cycles when using
sys.exc_info() in code handling exceptions.

@item 
bpo-30102@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30102}: The ssl and hashlib modules now call
OPENSSL_add_all_algorithms_noconf() on OpenSSL < 1.1.0. The function
detects CPU features and enables optimizations on some CPU architectures
such as POWER8. Patch is based on research from Gustavo Serra Scalet.

@item 
bpo-31185@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31185}: Fixed miscellaneous errors in asyncio speedup module.

@item 
bpo-31135@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31135}: ttk: fix the destroy() method of LabeledScale and OptionMenu
classes. Call the parent destroy() method even if the used attribute
doesn’t exist. The LabeledScale.destroy() method now also explicitly
clears label and scale attributes to help the garbage collector to destroy
all widgets.

@item 
bpo-31107@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31107}: Fix @code{copyreg._slotnames()} mangled attribute calculation for
classes whose name begins with an underscore. Patch by Shane Harvey.

@item 
bpo-31061@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31061}: Fixed a crash when using asyncio and threads.

@item 
bpo-30502@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30502}: Fix handling of long oids in ssl.  Based on patch by Christian
Heimes.

@item 
bpo-30119@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30119}: ftplib.FTP.putline() now throws ValueError on commands that
contains CR or LF. Patch by Donghee Na.

@item 
bpo-30595@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30595}: multiprocessing.Queue.get() with a timeout now polls its reader
in non-blocking mode if it succeeded to acquire the lock but the acquire
took longer than the timeout.

@item 
bpo-29403@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29403}: Fix @code{unittest.mock}’s autospec to not fail on method-bound
builtin functions.  Patch by Aaron Gallagher.

@item 
bpo-30961@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30961}: Fix decrementing a borrowed reference in tracemalloc.

@item 
bpo-25684@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25684}: Change @code{ttk.OptionMenu} radiobuttons to be unique across
instances of @code{OptionMenu}.

@item 
bpo-30886@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30886}: Fix multiprocessing.Queue.join_thread(): it now waits until the
thread completes, even if the thread was started by the same process which
created the queue.

@item 
bpo-29854@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29854}: Fix segfault in readline when using readline’s history-size
option.  Patch by Nir Soffer.

@item 
bpo-30319@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30319}: socket.close() now ignores ECONNRESET error.

@item 
bpo-30828@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30828}: Fix out of bounds write in
@code{asyncio.CFuture.remove_done_callback()}.

@item 
bpo-30807@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30807}: signal.setitimer() may disable the timer when passed a tiny
value. Tiny values (such as 1e-6) are valid non-zero values for
setitimer(), which is specified as taking microsecond-resolution
intervals. However, on some platform, our conversion routine could convert
1e-6 into a zero interval, therefore disabling the timer instead of
(re-)scheduling it.

@item 
bpo-30441@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30441}: Fix bug when modifying os.environ while iterating over it

@item 
bpo-30532@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30532}: Fix email header value parser dropping folding white space in
certain cases.

@item 
bpo-30879@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30879}: os.listdir() and os.scandir() now emit bytes names when called
with bytes-like argument.

@item 
bpo-30746@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30746}: Prohibited the ‘=’ character in environment variable names in
@code{os.putenv()} and @code{os.spawn*()}.

@item 
bpo-29755@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29755}: Fixed the lgettext() family of functions in the gettext module.
They now always return bytes.
@end itemize

@node Documentation<70>,Tests<68>,Library<178>,Python 3 6 3 release candidate 1
@anchor{whatsnew/changelog id884}@anchor{1ecc}
@subsubsection Documentation



@itemize -

@item 
bpo-31294@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31294}: Fix incomplete code snippet in the ZeroMQSocketListener and
ZeroMQSocketHandler examples and adapt them to Python 3.

@item 
bpo-21649@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21649}: Add RFC 7525 and Mozilla server side TLS links to SSL
documentation.

@item 
bpo-30803@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30803}: Clarify doc on truth value testing. Original patch by Peter
Thomassen.
@end itemize

@node Tests<68>,Build<77>,Documentation<70>,Python 3 6 3 release candidate 1
@anchor{whatsnew/changelog id885}@anchor{1ecd}
@subsubsection Tests



@itemize -

@item 
bpo-31320@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31320}: Silence traceback in test_ssl

@item 
bpo-25674@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25674}: Remove sha256.tbs-internet.com ssl test

@item 
bpo-30715@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30715}: Address ALPN callback changes for OpenSSL 1.1.0f. The latest
version behaves like OpenSSL 1.0.2 and no longer aborts handshake.

@item 
bpo-30822@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30822}: regrtest: Exclude tzdata from regrtest –all. When running the
test suite using –use=all / -u all, exclude tzdata since it makes
test_datetime too slow (15-20 min on some buildbots) which then times out
on some buildbots. Fix also regrtest command line parser to allow passing
-u extralargefile to run test_zipfile64.
@end itemize

@node Build<77>,Windows<67>,Tests<68>,Python 3 6 3 release candidate 1
@anchor{whatsnew/changelog id886}@anchor{1ece}
@subsubsection Build



@itemize -

@item 
bpo-30854@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30854}: Fix compile error when compiling –without-threads. Patch by
Masayuki Yamamoto.
@end itemize

@node Windows<67>,IDLE<49>,Build<77>,Python 3 6 3 release candidate 1
@anchor{whatsnew/changelog id887}@anchor{1ecf}
@subsubsection Windows



@itemize -

@item 
bpo-30389@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30389}: Adds detection of Visual Studio 2017 to distutils on Windows.

@item 
bpo-31340@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31340}: Change to building with MSVC v141 (included with Visual Studio
2017)

@item 
bpo-30581@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30581}: os.cpu_count() now returns the correct number of processors on
Windows when the number of logical processors is greater than 64.

@item 
bpo-30731@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30731}: Add a missing xmlns to python.manifest so that it matches the
schema.
@end itemize

@node IDLE<49>,Tools/Demos<47>,Windows<67>,Python 3 6 3 release candidate 1
@anchor{whatsnew/changelog id888}@anchor{1ed0}
@subsubsection IDLE



@itemize -

@item 
bpo-31493@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31493}: IDLE code context – fix code update and font update timers.
Canceling timers prevents a warning message when test_idle completes.

@item 
bpo-31488@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31488}: IDLE - Update non-key options in former extension classes. When
applying configdialog changes, call .reload for each feature class. Change
ParenMatch so updated options affect existing instances attached to
existing editor windows.

@item 
bpo-31477@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31477}: IDLE - Improve rstrip entry in doc. Strip trailing whitespace
strips more than blank spaces.  Multiline string literals are not skipped.

@item 
bpo-31480@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31480}: IDLE - make tests pass with zzdummy extension disabled by
default.

@item 
bpo-31421@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31421}: Document how IDLE runs tkinter programs. IDLE calls tcl/tk
update in the background in order to make live interaction and
experimentation with tkinter applications much easier.

@item 
bpo-31414@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31414}: IDLE – fix tk entry box tests by deleting first. Adding to an
int entry is not the same as deleting and inserting because int(‘’) will
fail.

@item 
bpo-31051@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31051}: Rearrange IDLE configdialog GenPage into Window, Editor, and
Help sections.

@item 
bpo-30617@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30617}: IDLE - Add docstrings and tests for outwin subclass of editor.
Move some data and functions from the class to module level. Patch by
Cheryl Sabella.

@item 
bpo-31287@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31287}: IDLE - Do not modify tkinter.message in test_configdialog.

@item 
bpo-27099@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27099}: Convert IDLE’s built-in ‘extensions’ to regular features. About
10 IDLE features were implemented as supposedly optional extensions. Their
different behavior could be confusing or worse for users and not good for
maintenance. Hence the conversion. The main difference for users is that
user configurable key bindings for builtin features are now handled
uniformly. Now, editing a binding in a keyset only affects its value in
the keyset. All bindings are defined together in the system-specific
default keysets in config-extensions.def. All custom keysets are saved as
a whole in config-extension.cfg.  All take effect as soon as one clicks
Apply or Ok. The affected events are ‘<<force-open-completions>>’,
‘<<expand-word>>’, ‘<<force-open-calltip>>’, ‘<<flash-paren>>’,
‘<<format-paragraph>>’, ‘<<run-module>>’, ‘<<check-module>>’, and
‘<<zoom-height>>’.  Any (global) customizations made before 3.6.3 will not
affect their keyset-specific customization after 3.6.3. and vice versa.
Initial patch by Charles Wohlganger.

@item 
bpo-31206@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31206}: IDLE: Factor HighPage(Frame) class from ConfigDialog. Patch by
Cheryl Sabella.

@item 
bpo-31001@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31001}: Add tests for configdialog highlight tab.  Patch by Cheryl
Sabella.

@item 
bpo-31205@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31205}: IDLE: Factor KeysPage(Frame) class from ConfigDialog.  The
slightly modified tests continue to pass.  Patch by Cheryl Sabella.

@item 
bpo-31130@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31130}: IDLE – stop leaks in test_configdialog. Initial patch by
Victor Stinner.

@item 
bpo-31002@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31002}: Add tests for configdialog keys tab. Patch by Cheryl Sabella.

@item 
bpo-19903@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19903}: IDLE: Calltips use @code{inspect.signature} instead of
@code{inspect.getfullargspec}. This improves calltips for builtins converted
to use Argument Clinic. Patch by Louie Lu.

@item 
bpo-31083@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31083}: IDLE - Add an outline of a TabPage class in configdialog.
Update existing classes to match outline. Initial patch by Cheryl Sabella.

@item 
bpo-31050@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31050}: Factor GenPage(Frame) class from ConfigDialog. The slightly
modified tests continue to pass. Patch by Cheryl Sabella.

@item 
bpo-31004@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31004}: IDLE - Factor FontPage(Frame) class from ConfigDialog. Slightly
modified tests continue to pass. Fix General tests. Patch mostly by Cheryl
Sabella.

@item 
bpo-30781@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30781}: IDLE - Use ttk widgets in ConfigDialog. Patches by Terry Jan
Reedy and Cheryl Sabella.

@item 
bpo-31060@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31060}: IDLE - Finish rearranging methods of ConfigDialog Grouping
methods pertaining to each tab and the buttons will aid writing tests and
improving the tabs and will enable splitting the groups into classes.

@item 
bpo-30853@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30853}: IDLE – Factor a VarTrace class out of ConfigDialog. Instance
tracers manages pairs consisting of a tk variable and a callback function.
When tracing is turned on, setting the variable calls the function.  Test
coverage for the new class is 100%.

@item 
bpo-31003@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31003}: IDLE: Add more tests for General tab.

@item 
bpo-30993@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30993}: IDLE - Improve configdialog font page and tests. In
configdialog: Document causal pathways in create_font_tab docstring.
Simplify some attribute names. Move set_samples calls to var_changed_font
(idea from Cheryl Sabella).  Move related functions to positions after the
create widgets function. In test_configdialog: Fix test_font_set so not
order dependent.  Fix renamed test_indent_scale so it tests the widget.
Adjust tests for movement of set_samples call.  Add tests for load
functions.  Put all font tests in one class and tab indent tests in
another.  Except for two lines, these tests completely cover the related
functions.

@item 
bpo-30981@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30981}: IDLE – Add more configdialog font page tests.

@item 
bpo-28523@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28523}: IDLE: replace ‘colour’ with ‘color’ in configdialog.

@item 
bpo-30917@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30917}: Add tests for idlelib.config.IdleConf. Increase coverage from
46% to 96%. Patch by Louie Lu.

@item 
bpo-30934@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30934}: Document coverage details for idlelib tests. Add section to
idlelib/idle-test/README.txt. Include check that branches are taken both
ways. Exclude IDLE-specific code that does not run during unit tests.

@item 
bpo-30913@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30913}: IDLE: Document ConfigDialog tk Vars, methods, and widgets in
docstrings This will facilitate improving the dialog and splitting up the
class. Original patch by Cheryl Sabella.

@item 
bpo-30899@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30899}: IDLE: Add tests for ConfigParser subclasses in config. Patch by
Louie Lu.

@item 
bpo-30881@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30881}: IDLE: Add docstrings to browser.py. Patch by Cheryl Sabella.

@item 
bpo-30851@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30851}: IDLE: Remove unused variables in configdialog.  One is a
duplicate, one is set but cannot be altered by users. Patch by Cheryl
Sabella.

@item 
bpo-30870@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30870}: IDLE: In Settings dialog, select font with Up, Down keys as
well as mouse. Initial patch by Louie Lu.

@item 
bpo-8231@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8231}: IDLE: call config.IdleConf.GetUserCfgDir only once.

@item 
bpo-30779@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30779}: IDLE: Factor ConfigChanges class from configdialog, put in
config; test. * In config, put dump test code in a function; run it and
unittest in   ‘if __name__ == ‘__main__’. * Add class config.ConfigChanges
based on changes_class_v4.py on bpo issue. * Add class
test_config.ChangesTest, partly using configdialog_tests_v1.py. * Revise
configdialog to use ConfigChanges; see tracker msg297804. * Revise
test_configdialog to match configdialog changes. * Remove configdialog
functions unused or moved to ConfigChanges. Cheryl Sabella contributed
parts of the patch.

@item 
bpo-30777@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30777}: IDLE: configdialog - Add docstrings and fix comments. Patch by
Cheryl Sabella.

@item 
bpo-30495@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30495}: IDLE: Improve textview with docstrings, PEP8 names, and more
tests. Patch by Cheryl Sabella.

@item 
bpo-30723@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30723}: IDLE: Make several improvements to parenmatch. Add ‘parens’
style to highlight both opener and closer. Make ‘default’ style, which is
not default, a synonym for ‘opener’. Make time-delay work the same with
all styles. Add help for config dialog extensions tab, including help for
parenmatch. Add new tests.  Original patch by Charles Wohlganger.

@item 
bpo-30674@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30674}: IDLE: add docstrings to grep module. Patch by Cheryl Sabella

@item 
bpo-21519@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21519}: IDLE’s basic custom key entry dialog now detects duplicates
properly. Original patch by Saimadhav Heblikar.

@item 
bpo-29910@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29910}: IDLE no longer deletes a character after commenting out a
region by a key shortcut.  Add @code{return 'break'} for this and other
potential conflicts between IDLE and default key bindings.

@item 
bpo-30728@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30728}: Review and change idlelib.configdialog names. Lowercase method
and attribute names. Replace ‘colour’ with ‘color’, expand overly cryptic
names, delete unneeded underscores. Replace @code{import *} with specific
imports. Patches by Cheryl Sabella.

@item 
bpo-6739@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6739}: IDLE: Verify user-entered key sequences by trying to bind them
with tk. Add tests for all 3 validation functions. Original patch by G
Polo.  Tests added by Cheryl Sabella.
@end itemize

@node Tools/Demos<47>,,IDLE<49>,Python 3 6 3 release candidate 1
@anchor{whatsnew/changelog id889}@anchor{1ed1}
@subsubsection Tools/Demos



@itemize -

@item 
bpo-30983@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30983}: gdb integration commands (py-bt, etc.) work on optimized shared
builds now, too.  
@geindex Python 향상 제안; PEP 523
PEP 523@footnote{https://peps.python.org/pep-0523/} introduced _PyEval_EvalFrameDefault which
inlines PyEval_EvalFrameEx on non-debug shared builds.  This broke the
ability to use py-bt, py-up, and a few other Python-specific gdb
integrations. The problem is fixed by only looking for
_PyEval_EvalFrameDefault frames in python-gdb.py.  Original patch by Bruno
“Polaco” Penteado.
@end itemize

@node Python 3 6 2 final,Python 3 6 2 release candidate 2,Python 3 6 3 release candidate 1,Changelog
@anchor{whatsnew/changelog python-3-6-2-final}@anchor{1ed2}
@subsection Python 3.6.2 final


`Release date: 2017-07-17'

No changes since release candidate 2

@node Python 3 6 2 release candidate 2,Python 3 6 2 release candidate 1,Python 3 6 2 final,Changelog
@anchor{whatsnew/changelog python-3-6-2-release-candidate-2}@anchor{1ed3}
@subsection Python 3.6.2 release candidate 2


`Release date: 2017-07-07'

@menu
* Security: Security<53>. 

@end menu

@node Security<53>,,,Python 3 6 2 release candidate 2
@anchor{whatsnew/changelog id890}@anchor{1ed4}
@subsubsection Security



@itemize -

@item 
bpo-30730@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30730}: Prevent environment variables injection in subprocess on
Windows.  Prevent passing other environment variables and command
arguments.

@item 
bpo-30694@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30694}: Upgrade expat copy from 2.2.0 to 2.2.1 to get fixes of multiple
security vulnerabilities including: 
@geindex Common Vulnerabilities and Exposures; CVE 2017-9233
CVE 2017-9233@footnote{https://www.cve.org/CVERecord?id=CVE-2017-9233} (External entity
infinite loop DoS), 
@geindex Common Vulnerabilities and Exposures; CVE 2016-9063
CVE 2016-9063@footnote{https://www.cve.org/CVERecord?id=CVE-2016-9063} (Integer overflow, re-fix),
@geindex Common Vulnerabilities and Exposures; CVE 2016-0718
CVE 2016-0718@footnote{https://www.cve.org/CVERecord?id=CVE-2016-0718} (Fix regression bugs from 2.2.0’s fix to
@geindex Common Vulnerabilities and Exposures; CVE 2016-0718
CVE 2016-0718@footnote{https://www.cve.org/CVERecord?id=CVE-2016-0718}) and 
@geindex Common Vulnerabilities and Exposures; CVE 2012-0876
CVE 2012-0876@footnote{https://www.cve.org/CVERecord?id=CVE-2012-0876} (Counter hash flooding with
SipHash). Note: the 
@geindex Common Vulnerabilities and Exposures; CVE 2016-5300
CVE 2016-5300@footnote{https://www.cve.org/CVERecord?id=CVE-2016-5300} (Use os-specific entropy sources like
getrandom) doesn’t impact Python, since Python already gets entropy from
the OS to set the expat secret using @code{XML_SetHashSalt()}.

@item 
bpo-30500@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30500}: Fix urllib.parse.splithost() to correctly parse fragments. For
example, @code{splithost('//127.0.0.1#@@evil.com/')} now correctly returns the
@code{127.0.0.1} host, instead of treating @code{@@evil.com} as the host in an
authentication (@code{login@@host}).
@end itemize

@node Python 3 6 2 release candidate 1,Python 3 6 1 final,Python 3 6 2 release candidate 2,Changelog
@anchor{whatsnew/changelog python-3-6-2-release-candidate-1}@anchor{1ed5}
@subsection Python 3.6.2 release candidate 1


`Release date: 2017-06-17'

@menu
* Security: Security<54>. 
* Core and Builtins: Core and Builtins<174>. 
* Library: Library<179>. 
* IDLE: IDLE<50>. 
* C API: C API<68>. 
* Build: Build<78>. 
* Documentation: Documentation<71>. 
* Tools/Demos: Tools/Demos<48>. 
* Tests: Tests<69>. 
* Windows: Windows<68>. 

@end menu

@node Security<54>,Core and Builtins<174>,,Python 3 6 2 release candidate 1
@anchor{whatsnew/changelog id891}@anchor{1ed6}
@subsubsection Security



@itemize -

@item 
bpo-29591@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29591}: Update expat copy from 2.1.1 to 2.2.0 to get fixes of
@geindex Common Vulnerabilities and Exposures; CVE 2016-0718
CVE 2016-0718@footnote{https://www.cve.org/CVERecord?id=CVE-2016-0718} and 
@geindex Common Vulnerabilities and Exposures; CVE 2016-4472
CVE 2016-4472@footnote{https://www.cve.org/CVERecord?id=CVE-2016-4472}. See
@indicateurl{https://sourceforge.net/p/expat/bugs/537/} for more information.
@end itemize

@node Core and Builtins<174>,Library<179>,Security<54>,Python 3 6 2 release candidate 1
@anchor{whatsnew/changelog id892}@anchor{1ed7}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-30682@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30682}: Removed a too-strict assertion that failed for certain
f-strings, such as eval(“f’\n’”) and eval(“f’\r’”).

@item 
bpo-30604@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30604}: Move co_extra_freefuncs to not be per-thread to avoid crashes

@item 
bpo-29104@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29104}: Fixed parsing backslashes in f-strings.

@item 
bpo-27945@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27945}: Fixed various segfaults with dict when input collections are
mutated during searching, inserting or comparing.  Based on patches by
Duane Griffin and Tim Mitchell.

@item 
bpo-25794@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25794}: Fixed type.__setattr__() and type.__delattr__() for
non-interned attribute names.  Based on patch by Eryk Sun.

@item 
bpo-30039@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30039}: If a KeyboardInterrupt happens when the interpreter is in the
middle of resuming a chain of nested ‘yield from’ or ‘await’ calls, it’s
now correctly delivered to the innermost frame.

@item 
bpo-12414@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12414}: sys.getsizeof() on a code object now returns the sizes which
includes the code struct and sizes of objects which it references. Patch
by Donghee Na.

@item 
bpo-29949@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29949}: Fix memory usage regression of set and frozenset object.

@item 
bpo-29935@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29935}: Fixed error messages in the index() method of tuple, list and
deque when pass indices of wrong type.

@item 
bpo-29859@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29859}: Show correct error messages when any of the pthread_* calls in
thread_pthread.h fails.

@item 
bpo-28876@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28876}: @code{bool(range)} works even if @code{len(range)} raises
@ref{a81,,OverflowError}.

@item 
bpo-29600@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29600}: Fix wrapping coroutine return values in StopIteration.

@item 
bpo-28856@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28856}: Fix an oversight that %b format for bytes should support
objects follow the buffer protocol.

@item 
bpo-29714@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29714}: Fix a regression that bytes format may fail when containing
zero bytes inside.

@item 
bpo-29478@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29478}: If max_line_length=None is specified while using the Compat32
policy, it is no longer ignored.  Patch by Mircea Cosbuc.
@end itemize

@node Library<179>,IDLE<50>,Core and Builtins<174>,Python 3 6 2 release candidate 1
@anchor{whatsnew/changelog id893}@anchor{1ed8}
@subsubsection Library



@itemize -

@item 
bpo-30616@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30616}: Functional API of enum allows to create empty enums. Patched by
Donghee Na

@item 
bpo-30038@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30038}: Fix race condition between signal delivery and wakeup file
descriptor. Patch by Nathaniel Smith.

@item 
bpo-23894@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23894}: lib2to3 now recognizes @code{rb'...'} and @code{f'...'} strings.

@item 
bpo-23890@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23890}: unittest.TestCase.assertRaises() now manually breaks a
reference cycle to not keep objects alive longer than expected.

@item 
bpo-30149@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30149}: inspect.signature() now supports callables with
variable-argument parameters wrapped with partialmethod. Patch by Donghee
Na.

@item 
bpo-30645@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30645}: Fix path calculation in imp.load_package(), fixing it for cases
when a package is only shipped with bytecodes. Patch by Alexandru
Ardelean.

@item 
bpo-29931@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29931}: Fixed comparison check for ipaddress.ip_interface objects.
Patch by Sanjay Sundaresan.

@item 
bpo-30605@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30605}: re.compile() no longer raises a BytesWarning when compiling a
bytes instance with misplaced inline modifier.  Patch by Roy Williams.

@item 
bpo-24484@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24484}: Avoid race condition in multiprocessing cleanup (#2159)

@item 
bpo-28994@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28994}: The traceback no longer displayed for SystemExit raised in a
callback registered by atexit.

@item 
bpo-30508@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30508}: Don’t log exceptions if Task/Future “cancel()” method was
called.

@item 
bpo-28556@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28556}: Updates to typing module: Add generic AsyncContextManager, add
support for ContextManager on all versions. Original PRs by Jelle Zijlstra
and Ivan Levkivskyi

@item 
bpo-29870@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29870}: Fix ssl sockets leaks when connection is aborted in asyncio/ssl
implementation. Patch by Michaël Sghaïer.

@item 
bpo-29743@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29743}: Closing transport during handshake process leaks open socket.
Patch by Nikolay Kim

@item 
bpo-27585@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27585}: Fix waiter cancellation in asyncio.Lock. Patch by Mathieu
Sornay.

@item 
bpo-30418@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30418}: On Windows, subprocess.Popen.communicate() now also ignore
EINVAL on stdin.write() if the child process is still running but closed
the pipe.

@item 
bpo-29822@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29822}: inspect.isabstract() now works during __init_subclass__.  Patch
by Nate Soares.

@item 
bpo-29581@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29581}: ABCMeta.__new__ now accepts @code{**kwargs}, allowing abstract
base classes to use keyword parameters in __init_subclass__. Patch by Nate
Soares.

@item 
bpo-30557@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30557}: faulthandler now correctly filters and displays exception codes
on Windows

@item 
bpo-30378@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30378}: Fix the problem that logging.handlers.SysLogHandler cannot
handle IPv6 addresses.

@item 
bpo-29960@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29960}: Preserve generator state when _random.Random.setstate() raises
an exception. Patch by Bryan Olson.

@item 
bpo-30414@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30414}: multiprocessing.Queue._feed background running thread do not
break from main loop on exception.

@item 
bpo-30003@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30003}: Fix handling escape characters in HZ codec.  Based on patch by
Ma Lin.

@item 
bpo-30301@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30301}: Fix AttributeError when using SimpleQueue.empty() under `spawn'
and `forkserver' start methods.

@item 
bpo-30329@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30329}: imaplib and poplib now catch the Windows socket WSAEINVAL error
(code 10022) on shutdown(SHUT_RDWR): An invalid operation was attempted.
This error occurs sometimes on SSL connections.

@item 
bpo-30375@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30375}: Warnings emitted when compile a regular expression now always
point to the line in the user code.  Previously they could point into
inners of the re module if emitted from inside of groups or conditionals.

@item 
bpo-30048@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30048}: Fixed @code{Task.cancel()} can be ignored when the task is running
coroutine and the coroutine returned without any more @code{await}.

@item 
bpo-30266@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30266}: contextlib.AbstractContextManager now supports
anti-registration by setting __enter__ = None or __exit__ = None,
following the pattern introduced in bpo-25958@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25958}. Patch by Jelle Zijlstra.

@item 
bpo-30298@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30298}: Weaken the condition of deprecation warnings for inline
modifiers. Now allowed several subsequential inline modifiers at the start
of the pattern (e.g. @code{'(?i)(?s)...'}).  In verbose mode whitespaces and
comments now are allowed before and between inline modifiers (e.g. @code{'(?x)
(?i) (?s)...'}).

@item 
bpo-29990@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29990}: Fix range checking in GB18030 decoder.  Original patch by Ma
Lin.

@item 
bpo-26293@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26293}: Change resulted because of zipfile breakage. (See also:
bpo-29094@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29094})

@item 
bpo-30243@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30243}: Removed the __init__ methods of _json’s scanner and encoder.
Misusing them could cause memory leaks or crashes.  Now scanner and
encoder objects are completely initialized in the __new__ methods.

@item 
bpo-30185@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30185}: Avoid KeyboardInterrupt tracebacks in forkserver helper process
when Ctrl-C is received.

@item 
bpo-28556@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28556}: Various updates to typing module: add typing.NoReturn type, use
WrapperDescriptorType, minor bug-fixes.  Original PRs by Jim
Fasarakis-Hilliard and Ivan Levkivskyi.

@item 
bpo-30205@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30205}: Fix getsockname() for unbound AF_UNIX sockets on Linux.

@item 
bpo-30070@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30070}: Fixed leaks and crashes in errors handling in the parser
module.

@item 
bpo-30061@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30061}: Fixed crashes in IOBase methods __next__() and readlines() when
readline() or __next__() respectively return non-sizeable object. Fixed
possible other errors caused by not checking results of PyObject_Size(),
PySequence_Size(), or PyMapping_Size().

@item 
bpo-30017@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30017}: Allowed calling the close() method of the zip entry writer
object multiple times.  Writing to a closed writer now always produces a
ValueError.

@item 
bpo-30068@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30068}: _io._IOBase.readlines will check if it’s closed first when hint
is present.

@item 
bpo-29694@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29694}: Fixed race condition in pathlib mkdir with flags parents=True.
Patch by Armin Rigo.

@item 
bpo-29692@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29692}: Fixed arbitrary unchaining of RuntimeError exceptions in
contextlib.contextmanager.  Patch by Siddharth Velankar.

@item 
bpo-29998@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29998}: Pickling and copying ImportError now preserves name and path
attributes.

@item 
bpo-29953@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29953}: Fixed memory leaks in the replace() method of datetime and time
objects when pass out of bound fold argument.

@item 
bpo-29942@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29942}: Fix a crash in itertools.chain.from_iterable when encountering
long runs of empty iterables.

@item 
bpo-27863@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27863}: Fixed multiple crashes in ElementTree caused by race conditions
and wrong types.

@item 
bpo-28699@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28699}: Fixed a bug in pools in multiprocessing.pool that raising an
exception at the very first of an iterable may swallow the exception or
make the program hang. Patch by Davin Potts and Xiang Zhang.

@item 
bpo-25803@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25803}: Avoid incorrect errors raised by Path.mkdir(exist_ok=True) when
the OS gives priority to errors such as EACCES over EEXIST.

@item 
bpo-29861@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29861}: Release references to tasks, their arguments and their results
as soon as they are finished in multiprocessing.Pool.

@item 
bpo-29884@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29884}: faulthandler: Restore the old sigaltstack during teardown.
Patch by Christophe Zeitouny.

@item 
bpo-25455@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25455}: Fixed crashes in repr of recursive buffered file-like objects.

@item 
bpo-29800@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29800}: Fix crashes in partial.__repr__ if the keys of partial.keywords
are not strings.  Patch by Michael Seifert.

@item 
bpo-29742@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29742}: get_extra_info() raises exception if get called on closed ssl
transport. Patch by Nikolay Kim.

@item 
bpo-8256@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8256}: Fixed possible failing or crashing input() if attributes
“encoding” or “errors” of sys.stdin or sys.stdout are not set or are not
strings.

@item 
bpo-28298@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28298}: Fix a bug that prevented array ‘Q’, ‘L’ and ‘I’ from accepting
big intables (objects that have __int__) as elements.  Patch by Oren
Milman.

@item 
bpo-28231@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28231}: The zipfile module now accepts path-like objects for external
paths.

@item 
bpo-26915@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26915}: index() and count() methods of collections.abc.Sequence now
check identity before checking equality when do comparisons.

@item 
bpo-29615@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29615}: SimpleXMLRPCDispatcher no longer chains KeyError (or any other
exception) to exception(s) raised in the dispatched methods. Patch by Petr
Motejlek.

@item 
bpo-30177@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30177}: path.resolve(strict=False) no longer cuts the path after the
first element not present in the filesystem.  Patch by Antoine Pietri.
@end itemize

@node IDLE<50>,C API<68>,Library<179>,Python 3 6 2 release candidate 1
@anchor{whatsnew/changelog id894}@anchor{1ed9}
@subsubsection IDLE



@itemize -

@item 
bpo-15786@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15786}: Fix several problems with IDLE’s autocompletion box. The
following should now work: clicking on selection box items; using the
scrollbar; selecting an item by hitting Return. Hangs on MacOSX should no
longer happen. Patch by Louie Lu.

@item 
bpo-25514@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25514}: Add doc subsubsection about IDLE failure to start. Popup
no-connection message directs users to this section.

@item 
bpo-30642@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30642}: Fix reference leaks in IDLE tests. Patches by Louie Lu and
Terry Jan Reedy.

@item 
bpo-30495@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30495}: Add docstrings for textview.py and use PEP8 names. Patches by
Cheryl Sabella and Terry Jan Reedy.

@item 
bpo-30290@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30290}: Help-about: use pep8 names and add tests. Increase coverage to
100%. Patches by Louie Lu, Cheryl Sabella, and Terry Jan Reedy.

@item 
bpo-30303@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30303}: Add _utest option to textview; add new tests. Increase coverage
to 100%. Patches by Louie Lu and Terry Jan Reedy.
@end itemize

@node C API<68>,Build<78>,IDLE<50>,Python 3 6 2 release candidate 1
@anchor{whatsnew/changelog id895}@anchor{1eda}
@subsubsection C API



@itemize -

@item 
bpo-27867@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27867}: Function PySlice_GetIndicesEx() no longer replaced with a macro
if Py_LIMITED_API is not set.
@end itemize

@node Build<78>,Documentation<71>,C API<68>,Python 3 6 2 release candidate 1
@anchor{whatsnew/changelog id896}@anchor{1edb}
@subsubsection Build



@itemize -

@item 
bpo-29941@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29941}: Add @code{--with-assertions} configure flag to explicitly enable C
@code{assert()} checks. Defaults to off. @code{--with-pydebug} implies
@code{--with-assertions}.

@item 
bpo-28787@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28787}: Fix out-of-tree builds of Python when configured with
@code{--with--dtrace}.

@item 
bpo-29243@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29243}: Prevent unnecessary rebuilding of Python during @code{make test},
@code{make install} and some other make targets when configured with
@code{--enable-optimizations}.

@item 
bpo-23404@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23404}: Don’t regenerate generated files based on file modification
time anymore: the action is now explicit. Replace @code{make touch} with
@code{make regen-all}.

@item 
bpo-29643@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29643}: Fix @code{--enable-optimization} didn’t work.
@end itemize

@node Documentation<71>,Tools/Demos<48>,Build<78>,Python 3 6 2 release candidate 1
@anchor{whatsnew/changelog id897}@anchor{1edc}
@subsubsection Documentation



@itemize -

@item 
bpo-30176@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30176}: Add missing attribute related constants in curses
documentation.

@item 
bpo-30052@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30052}: the link targets for @ref{192,,bytes()} and @ref{344,,bytearray()} are
now their respective type definitions, rather than the corresponding
builtin function entries. Use @ref{1e96,,bytes} and
@ref{1e97,,bytearray} to reference the latter. In order to
ensure this and future cross-reference updates are applied automatically,
the daily documentation builds now disable the default output caching
features in Sphinx.

@item 
bpo-26985@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26985}: Add missing info of code object in inspect documentation.
@end itemize

@node Tools/Demos<48>,Tests<69>,Documentation<71>,Python 3 6 2 release candidate 1
@anchor{whatsnew/changelog id898}@anchor{1edd}
@subsubsection Tools/Demos



@itemize -

@item 
bpo-29367@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29367}: python-gdb.py now supports also @code{method-wrapper}
(@code{wrapperobject}) objects.
@end itemize

@node Tests<69>,Windows<68>,Tools/Demos<48>,Python 3 6 2 release candidate 1
@anchor{whatsnew/changelog id899}@anchor{1ede}
@subsubsection Tests



@itemize -

@item 
bpo-30357@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30357}: test_thread: setUp() now uses support.threading_setup() and
support.threading_cleanup() to wait until threads complete to avoid random
side effects on following tests. Initial patch written by Grzegorz
Grzywacz.

@item 
bpo-30197@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30197}: Enhanced functions swap_attr() and swap_item() in the
test.support module. They now work when delete replaced attribute or item
inside the with statement.  The old value of the attribute or item (or
None if it doesn’t exist) now will be assigned to the target of the “as”
clause, if there is one.
@end itemize

@node Windows<68>,,Tests<69>,Python 3 6 2 release candidate 1
@anchor{whatsnew/changelog id900}@anchor{1edf}
@subsubsection Windows



@itemize -

@item 
bpo-30687@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30687}: Locate msbuild.exe on Windows when building rather than
vcvarsall.bat

@item 
bpo-30450@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30450}: The build process on Windows no longer depends on Subversion,
instead pulling external code from GitHub via a Python script.  If Python
3.6 is not found on the system (via @code{py -3.6}), NuGet is used to
download a copy of 32-bit Python.
@end itemize

@node Python 3 6 1 final,Python 3 6 1 release candidate 1,Python 3 6 2 release candidate 1,Changelog
@anchor{whatsnew/changelog python-3-6-1-final}@anchor{1ee0}
@subsection Python 3.6.1 final


`Release date: 2017-03-21'

@menu
* Core and Builtins: Core and Builtins<175>. 
* Build: Build<79>. 

@end menu

@node Core and Builtins<175>,Build<79>,,Python 3 6 1 final
@anchor{whatsnew/changelog id901}@anchor{1ee1}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-29723@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29723}: The @code{sys.path[0]} initialization change for bpo-29139@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29139} caused
a regression by revealing an inconsistency in how sys.path is initialized
when executing @code{__main__} from a zipfile, directory, or other import
location. The interpreter now consistently avoids ever adding the import
location’s parent directory to @code{sys.path}, and ensures no other
@code{sys.path} entries are inadvertently modified when inserting the import
location named on the command line.
@end itemize

@node Build<79>,,Core and Builtins<175>,Python 3 6 1 final
@anchor{whatsnew/changelog id902}@anchor{1ee2}
@subsubsection Build



@itemize -

@item 
bpo-27593@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27593}: fix format of git information used in sys.version

@item 
Fix incompatible comment in python.h
@end itemize

@node Python 3 6 1 release candidate 1,Python 3 6 0 final,Python 3 6 1 final,Changelog
@anchor{whatsnew/changelog python-3-6-1-release-candidate-1}@anchor{1ee3}
@subsection Python 3.6.1 release candidate 1


`Release date: 2017-03-04'

@menu
* Core and Builtins: Core and Builtins<176>. 
* Library: Library<180>. 
* IDLE: IDLE<51>. 
* Windows: Windows<69>. 
* C API: C API<69>. 
* Documentation: Documentation<72>. 
* Tests: Tests<70>. 
* Build: Build<80>. 

@end menu

@node Core and Builtins<176>,Library<180>,,Python 3 6 1 release candidate 1
@anchor{whatsnew/changelog id903}@anchor{1ee4}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-28893@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28893}: Set correct __cause__ for errors about invalid awaitables
returned from __aiter__ and __anext__.

@item 
bpo-29683@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29683}: Fixes to memory allocation in _PyCode_SetExtra.  Patch by Brian
Coleman.

@item 
bpo-29684@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29684}: Fix minor regression of PyEval_CallObjectWithKeywords. It
should raise TypeError when kwargs is not a dict.  But it might cause segv
when args=NULL and kwargs is not a dict.

@item 
bpo-28598@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28598}: Support __rmod__ for subclasses of str being called before
str.__mod__. Patch by Martijn Pieters.

@item 
bpo-29607@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29607}: Fix stack_effect computation for CALL_FUNCTION_EX. Patch by
Matthieu Dartiailh.

@item 
bpo-29602@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29602}: Fix incorrect handling of signed zeros in complex constructor
for complex subclasses and for inputs having a __complex__ method. Patch
by Serhiy Storchaka.

@item 
bpo-29347@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29347}: Fixed possibly dereferencing undefined pointers when creating
weakref objects.

@item 
bpo-29438@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29438}: Fixed use-after-free problem in key sharing dict.

@item 
bpo-29319@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29319}: Prevent RunMainFromImporter overwriting sys.path[0].

@item 
bpo-29337@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29337}: Fixed possible BytesWarning when compare the code objects.
Warnings could be emitted at compile time.

@item 
bpo-29327@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29327}: Fixed a crash when pass the iterable keyword argument to
sorted().

@item 
bpo-29034@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29034}: Fix memory leak and use-after-free in os module
(path_converter).

@item 
bpo-29159@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29159}: Fix regression in bytes(x) when x.__index__() raises Exception.

@item 
bpo-28932@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28932}: Do not include <sys/random.h> if it does not exist.

@item 
bpo-25677@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25677}: Correct the positioning of the syntax error caret for indented
blocks. Based on patch by Michael Layzell.

@item 
bpo-29000@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29000}: Fixed bytes formatting of octals with zero padding in alternate
form.

@item 
bpo-26919@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26919}: On Android, operating system data is now always encoded/decoded
to/from UTF-8, instead of the locale encoding to avoid inconsistencies
with os.fsencode() and os.fsdecode() which are already using UTF-8.

@item 
bpo-28991@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28991}: functools.lru_cache() was susceptible to an obscure reentrancy
bug triggerable by a monkey-patched len() function.

@item 
bpo-28739@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28739}: f-string expressions are no longer accepted as docstrings and
by ast.literal_eval() even if they do not include expressions.

@item 
bpo-28512@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28512}: Fixed setting the offset attribute of SyntaxError by
PyErr_SyntaxLocationEx() and PyErr_SyntaxLocationObject().

@item 
bpo-28918@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28918}: Fix the cross compilation of xxlimited when Python has been
built with Py_DEBUG defined.

@item 
bpo-28731@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28731}: Optimize _PyDict_NewPresized() to create correct size dict.
Improve speed of dict literal with constant keys up to 30%.
@end itemize

@node Library<180>,IDLE<51>,Core and Builtins<176>,Python 3 6 1 release candidate 1
@anchor{whatsnew/changelog id904}@anchor{1ee5}
@subsubsection Library



@itemize -

@item 
bpo-29169@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29169}: Update zlib to 1.2.11.

@item 
bpo-29623@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29623}: Allow use of path-like object as a single argument in
ConfigParser.read(). Patch by David Ellis.

@item 
bpo-28963@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28963}: Fix out of bound iteration in
asyncio.Future.remove_done_callback implemented in C.

@item 
bpo-29704@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29704}: asyncio.subprocess.SubprocessStreamProtocol no longer closes
before all pipes are closed.

@item 
bpo-29271@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29271}: Fix Task.current_task and Task.all_tasks implemented in C to
accept None argument as their pure Python implementation.

@item 
bpo-29703@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29703}: Fix asyncio to support instantiation of new event loops in
child processes.

@item 
bpo-29376@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29376}: Fix assertion error in threading._DummyThread.is_alive().

@item 
bpo-28624@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28624}: Add a test that checks that cwd parameter of Popen() accepts
PathLike objects.  Patch by Sayan Chowdhury.

@item 
bpo-28518@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28518}: Start a transaction implicitly before a DML statement. Patch by
Aviv Palivoda.

@item 
bpo-29532@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29532}: Altering a kwarg dictionary passed to functools.partial() no
longer affects a partial object after creation.

@item 
bpo-29110@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29110}: Fix file object leak in aifc.open() when file is given as a
filesystem path and is not in valid AIFF format. Patch by Anthony Zhang.

@item 
bpo-28556@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28556}: Various updates to typing module: typing.Counter,
typing.ChainMap, improved ABC caching, etc. Original PRs by Jelle
Zijlstra, Ivan Levkivskyi, Manuel Krebber, and Łukasz Langa.

@item 
bpo-29100@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29100}: Fix datetime.fromtimestamp() regression introduced in Python
3.6.0: check minimum and maximum years.

@item 
bpo-29519@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29519}: Fix weakref spewing exceptions during interpreter shutdown when
used with a rare combination of multiprocessing and custom codecs.

@item 
bpo-29416@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29416}: Prevent infinite loop in pathlib.Path.mkdir

@item 
bpo-29444@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29444}: Fixed out-of-bounds buffer access in the group() method of the
match object. Based on patch by WGH.

@item 
bpo-29335@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29335}: Fix subprocess.Popen.wait() when the child process has exited
to a stopped instead of terminated state (ex: when under ptrace).

@item 
bpo-29290@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29290}: Fix a regression in argparse that help messages would wrap at
non-breaking spaces.

@item 
bpo-28735@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28735}: Fixed the comparison of mock.MagickMock with mock.ANY.

@item 
bpo-29316@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29316}: Restore the provisional status of typing module, add
corresponding note to documentation. Patch by Ivan L.

@item 
bpo-29219@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29219}: Fixed infinite recursion in the repr of uninitialized
ctypes.CDLL instances.

@item 
bpo-29011@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29011}: Fix an important omission by adding Deque to the typing module.

@item 
bpo-28969@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28969}: Fixed race condition in C implementation of
functools.lru_cache. KeyError could be raised when cached function with
full cache was simultaneously called from different threads with the same
uncached arguments.

@item 
bpo-29142@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29142}: In urllib.request, suffixes in no_proxy environment variable
with leading dots could match related hostnames again (e.g. .b.c matches
a.b.c). Patch by Milan Oberkirch.

@item 
bpo-28961@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28961}: Fix unittest.mock._Call helper: don’t ignore the name parameter
anymore. Patch written by Jiajun Huang.

@item 
bpo-29203@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29203}: functools.lru_cache() now respects 
@geindex Python 향상 제안; PEP 468
PEP 468@footnote{https://peps.python.org/pep-0468/} and preserves the
order of keyword arguments.  f(a=1, b=2) is now cached separately from
f(b=2, a=1) since both calls could potentially give different results.

@item 
bpo-15812@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15812}: inspect.getframeinfo() now correctly shows the first line of a
context. Patch by Sam Breese.

@item 
bpo-29094@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29094}: Offsets in a ZIP file created with extern file object and modes
“w” and “x” now are relative to the start of the file.

@item 
bpo-29085@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29085}: Allow random.Random.seed() to use high quality OS randomness
rather than the pid and time.

@item 
bpo-29061@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29061}: Fixed bug in secrets.randbelow() which would hang when given a
negative input.  Patch by Brendan Donegan.

@item 
bpo-29079@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29079}: Prevent infinite loop in pathlib.resolve() on Windows

@item 
bpo-13051@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13051}: Fixed recursion errors in large or resized
curses.textpad.Textbox.  Based on patch by Tycho Andersen.

@item 
bpo-29119@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29119}: Fix weakrefs in the pure python version of
collections.OrderedDict move_to_end() method. Contributed by Andra
Bogildea.

@item 
bpo-9770@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9770}: curses.ascii predicates now work correctly with negative
integers.

@item 
bpo-28427@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28427}: old keys should not remove new values from WeakValueDictionary
when collecting from another thread.

@item 
bpo-28923@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28923}: Remove editor artifacts from Tix.py.

@item 
bpo-29055@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29055}: Neaten-up empty population error on random.choice() by
suppressing the upstream exception.

@item 
bpo-28871@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28871}: Fixed a crash when deallocate deep ElementTree.

@item 
bpo-19542@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19542}: Fix bugs in WeakValueDictionary.setdefault() and
WeakValueDictionary.pop() when a GC collection happens in another thread.

@item 
bpo-20191@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20191}: Fixed a crash in resource.prlimit() when passing a sequence
that doesn’t own its elements as limits.

@item 
bpo-28779@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28779}: multiprocessing.set_forkserver_preload() would crash the
forkserver process if a preloaded module instantiated some multiprocessing
objects such as locks.

@item 
bpo-28847@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28847}: dbm.dumb now supports reading read-only files and no longer
writes the index file when it is not changed.

@item 
bpo-26937@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26937}: The chown() method of the tarfile.TarFile class does not fail
now when the grp module cannot be imported, as for example on Android
platforms.
@end itemize

@node IDLE<51>,Windows<69>,Library<180>,Python 3 6 1 release candidate 1
@anchor{whatsnew/changelog id905}@anchor{1ee6}
@subsubsection IDLE



@itemize -

@item 
bpo-29071@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29071}: IDLE colors f-string prefixes (but not invalid ur prefixes).

@item 
bpo-28572@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28572}: Add 10% to coverage of IDLE’s test_configdialog. Update and
augment description of the configuration system.
@end itemize

@node Windows<69>,C API<69>,IDLE<51>,Python 3 6 1 release candidate 1
@anchor{whatsnew/changelog id906}@anchor{1ee7}
@subsubsection Windows



@itemize -

@item 
bpo-29579@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29579}: Removes readme.txt from the installer

@item 
bpo-29326@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29326}: Ignores blank lines in ._pth files (Patch by Alexey Izbyshev)

@item 
bpo-28164@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28164}: Correctly handle special console filenames (patch by Eryk Sun)

@item 
bpo-29409@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29409}: Implement 
@geindex Python 향상 제안; PEP 529
PEP 529@footnote{https://peps.python.org/pep-0529/} for io.FileIO (Patch by Eryk Sun)

@item 
bpo-29392@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29392}: Prevent crash when passing invalid arguments into msvcrt
module.

@item 
bpo-25778@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25778}: winreg does not truncate string correctly (Patch by Eryk Sun)

@item 
bpo-28896@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28896}: Deprecate WindowsRegistryFinder and disable it by default.
@end itemize

@node C API<69>,Documentation<72>,Windows<69>,Python 3 6 1 release candidate 1
@anchor{whatsnew/changelog id907}@anchor{1ee8}
@subsubsection C API



@itemize -

@item 
bpo-27867@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27867}: Function PySlice_GetIndicesEx() is replaced with a macro if
Py_LIMITED_API is not set or set to the value between 0x03050400 and
0x03060000 (not including) or 0x03060100 or higher.

@item 
bpo-29083@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29083}: Fixed the declaration of some public API functions.
PyArg_VaParse() and PyArg_VaParseTupleAndKeywords() were not available in
limited API. PyArg_ValidateKeywordArguments(), PyArg_UnpackTuple() and
Py_BuildValue() were not available in limited API of version < 3.3 when
PY_SSIZE_T_CLEAN is defined.

@item 
bpo-29058@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29058}: All stable API extensions added after Python 3.2 are now
available only when Py_LIMITED_API is set to the PY_VERSION_HEX value of
the minimum Python version supporting this API.
@end itemize

@node Documentation<72>,Tests<70>,C API<69>,Python 3 6 1 release candidate 1
@anchor{whatsnew/changelog id908}@anchor{1ee9}
@subsubsection Documentation



@itemize -

@item 
bpo-28929@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28929}: Link the documentation to its source file on GitHub.

@item 
bpo-25008@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25008}: Document smtpd.py as effectively deprecated and add a pointer
to aiosmtpd, a third-party asyncio-based replacement.

@item 
bpo-26355@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26355}: Add canonical header link on each page to corresponding major
version of the documentation. Patch by Matthias Bussonnier.

@item 
bpo-29349@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29349}: Fix Python 2 syntax in code for building the documentation.
@end itemize

@node Tests<70>,Build<80>,Documentation<72>,Python 3 6 1 release candidate 1
@anchor{whatsnew/changelog id909}@anchor{1eea}
@subsubsection Tests



@itemize -

@item 
bpo-28087@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28087}: Skip test_asyncore and test_eintr poll failures on macOS. Skip
some tests of select.poll when running on macOS due to unresolved issues
with the underlying system poll function on some macOS versions.

@item 
bpo-29571@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29571}: to match the behaviour of the @code{re.LOCALE} flag,
test_re.test_locale_flag now uses @code{locale.getpreferredencoding(False)}
to determine the candidate encoding for the test regex (allowing it to
correctly skip the test when the default locale encoding is a multi-byte
encoding)

@item 
bpo-28950@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28950}: Disallow -j0 to be combined with -T/-l in regrtest command line
arguments.

@item 
bpo-28683@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28683}: Fix the tests that bind() a unix socket and raise
PermissionError on Android for a non-root user.

@item 
bpo-26939@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26939}: Add the support.setswitchinterval() function to fix
test_functools hanging on the Android armv7 qemu emulator.
@end itemize

@node Build<80>,,Tests<70>,Python 3 6 1 release candidate 1
@anchor{whatsnew/changelog id910}@anchor{1eeb}
@subsubsection Build



@itemize -

@item 
bpo-27593@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27593}: sys.version and the platform module python_build(),
python_branch(), and python_revision() functions now use git information
rather than hg when building from a repo.

@item 
bpo-29572@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29572}: Update Windows build and OS X installers to use OpenSSL 1.0.2k.

@item 
bpo-26851@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26851}: Set Android compilation and link flags.

@item 
bpo-28768@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28768}: Fix implicit declaration of function _setmode. Patch by
Masayuki Yamamoto

@item 
bpo-29080@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29080}: Removes hard dependency on hg.exe from PCBuild/build.bat

@item 
bpo-23903@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23903}: Added missed names to PC/python3.def.

@item 
bpo-28762@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28762}: lockf() is available on Android API level 24, but the F_LOCK
macro is not defined in android-ndk-r13.

@item 
bpo-28538@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28538}: Fix the compilation error that occurs because if_nameindex() is
available on Android API level 24, but the if_nameindex structure is not
defined.

@item 
bpo-20211@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20211}: Do not add the directory for installing C header files and the
directory for installing object code libraries to the cross compilation
search paths. Original patch by Thomas Petazzoni.

@item 
bpo-28849@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28849}: Do not define sys.implementation._multiarch on Android.
@end itemize

@node Python 3 6 0 final,Python 3 6 0 release candidate 2,Python 3 6 1 release candidate 1,Changelog
@anchor{whatsnew/changelog python-3-6-0-final}@anchor{1eec}
@subsection Python 3.6.0 final


`Release date: 2016-12-23'

No changes since release candidate 2

@node Python 3 6 0 release candidate 2,Python 3 6 0 release candidate 1,Python 3 6 0 final,Changelog
@anchor{whatsnew/changelog python-3-6-0-release-candidate-2}@anchor{1eed}
@subsection Python 3.6.0 release candidate 2


`Release date: 2016-12-16'

@menu
* Core and Builtins: Core and Builtins<177>. 
* Tools/Demos: Tools/Demos<49>. 
* Windows: Windows<70>. 
* Build: Build<81>. 

@end menu

@node Core and Builtins<177>,Tools/Demos<49>,,Python 3 6 0 release candidate 2
@anchor{whatsnew/changelog id911}@anchor{1eee}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-28147@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28147}: Fix a memory leak in split-table dictionaries: setattr() must
not convert combined table into split table. Patch written by INADA Naoki.

@item 
bpo-28990@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28990}: Fix asyncio SSL hanging if connection is closed before
handshake is completed. (Patch by HoHo-Ho)
@end itemize

@node Tools/Demos<49>,Windows<70>,Core and Builtins<177>,Python 3 6 0 release candidate 2
@anchor{whatsnew/changelog id912}@anchor{1eef}
@subsubsection Tools/Demos



@itemize -

@item 
bpo-28770@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28770}: Fix python-gdb.py for fastcalls.
@end itemize

@node Windows<70>,Build<81>,Tools/Demos<49>,Python 3 6 0 release candidate 2
@anchor{whatsnew/changelog id913}@anchor{1ef0}
@subsubsection Windows



@itemize -

@item 
bpo-28896@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28896}: Deprecate WindowsRegistryFinder.
@end itemize

@node Build<81>,,Windows<70>,Python 3 6 0 release candidate 2
@anchor{whatsnew/changelog id914}@anchor{1ef1}
@subsubsection Build



@itemize -

@item 
bpo-28898@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28898}: Prevent gdb build errors due to HAVE_LONG_LONG redefinition.
@end itemize

@node Python 3 6 0 release candidate 1,Python 3 6 0 beta 4,Python 3 6 0 release candidate 2,Changelog
@anchor{whatsnew/changelog python-3-6-0-release-candidate-1}@anchor{1ef2}
@subsection Python 3.6.0 release candidate 1


`Release date: 2016-12-06'

@menu
* Core and Builtins: Core and Builtins<178>. 
* Library: Library<181>. 
* C API: C API<70>. 
* Documentation: Documentation<73>. 
* Tools/Demos: Tools/Demos<50>. 

@end menu

@node Core and Builtins<178>,Library<181>,,Python 3 6 0 release candidate 1
@anchor{whatsnew/changelog id915}@anchor{1ef3}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-23722@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23722}: Rather than silently producing a class that doesn’t support
zero-argument @code{super()} in methods, failing to pass the new
@code{__classcell__} namespace entry up to @code{type.__new__} now results in a
@code{DeprecationWarning} and a class that supports zero-argument
@code{super()}.

@item 
bpo-28797@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28797}: Modifying the class __dict__ inside the __set_name__ method of
a descriptor that is used inside that class no longer prevents calling the
__set_name__ method of other descriptors.

@item 
bpo-28782@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28782}: Fix a bug in the implementation @code{yield from} when checking if
the next instruction is YIELD_FROM. Regression introduced by WORDCODE
(bpo-26647@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26647}).
@end itemize

@node Library<181>,C API<70>,Core and Builtins<178>,Python 3 6 0 release candidate 1
@anchor{whatsnew/changelog id916}@anchor{1ef4}
@subsubsection Library



@itemize -

@item 
bpo-27030@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27030}: Unknown escapes in re.sub() replacement template are allowed
again.  But they still are deprecated and will be disabled in 3.7.

@item 
bpo-28835@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28835}: Fix a regression introduced in warnings.catch_warnings(): call
warnings.showwarning() if it was overridden inside the context manager.

@item 
bpo-27172@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27172}: To assist with upgrades from 2.7, the previously documented
deprecation of @code{inspect.getfullargspec()} has been reversed. This
decision may be revisited again after the Python 2.7 branch is no longer
officially supported.

@item 
bpo-26273@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26273}: Add new @code{socket.TCP_CONGESTION} (Linux 2.6.13) and
@code{socket.TCP_USER_TIMEOUT} (Linux 2.6.37) constants. Patch written
by Omar Sandoval.

@item 
bpo-24142@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24142}: Reading a corrupt config file left configparser in an invalid
state. Original patch by Florian Höch.

@item 
bpo-28843@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28843}: Fix asyncio C Task to handle exceptions __traceback__.
@end itemize

@node C API<70>,Documentation<73>,Library<181>,Python 3 6 0 release candidate 1
@anchor{whatsnew/changelog id917}@anchor{1ef5}
@subsubsection C API



@itemize -

@item 
bpo-28808@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28808}: PyUnicode_CompareWithASCIIString() now never raises exceptions.
@end itemize

@node Documentation<73>,Tools/Demos<50>,C API<70>,Python 3 6 0 release candidate 1
@anchor{whatsnew/changelog id918}@anchor{1ef6}
@subsubsection Documentation



@itemize -

@item 
bpo-23722@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23722}: The data model reference and the porting section in the What’s
New guide now cover the additional @code{__classcell__} handling needed for
custom metaclasses to fully support 
@geindex Python 향상 제안; PEP 487
PEP 487@footnote{https://peps.python.org/pep-0487/} and zero-argument
@code{super()}.
@end itemize

@node Tools/Demos<50>,,Documentation<73>,Python 3 6 0 release candidate 1
@anchor{whatsnew/changelog id919}@anchor{1ef7}
@subsubsection Tools/Demos



@itemize -

@item 
bpo-28023@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28023}: Fix python-gdb.py didn’t support new dict implementation.
@end itemize

@node Python 3 6 0 beta 4,Python 3 6 0 beta 3,Python 3 6 0 release candidate 1,Changelog
@anchor{whatsnew/changelog python-3-6-0-beta-4}@anchor{1ef8}
@subsection Python 3.6.0 beta 4


`Release date: 2016-11-21'

@menu
* Core and Builtins: Core and Builtins<179>. 
* Library: Library<182>. 
* Documentation: Documentation<74>. 
* Tests: Tests<71>. 
* Build: Build<82>. 

@end menu

@node Core and Builtins<179>,Library<182>,,Python 3 6 0 beta 4
@anchor{whatsnew/changelog id920}@anchor{1ef9}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-28532@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28532}: Show sys.version when -V option is supplied twice.

@item 
bpo-27100@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27100}: The with-statement now checks for __enter__ before it checks
for __exit__. This gives less confusing error messages when both methods
are missing. Patch by Jonathan Ellington.

@item 
bpo-28746@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28746}: Fix the set_inheritable() file descriptor method on platforms
that do not have the ioctl FIOCLEX and FIONCLEX commands.

@item 
bpo-26920@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26920}: Fix not getting the locale’s charset upon initializing the
interpreter, on platforms that do not have langinfo.

@item 
bpo-28648@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28648}: Fixed crash in Py_DecodeLocale() in debug build on Mac OS X
when decode astral characters.  Patch by Xiang Zhang.

@item 
bpo-19398@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19398}: Extra slash no longer added to sys.path components in case of
empty compile-time PYTHONPATH components.

@item 
bpo-28665@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28665}: Improve speed of the STORE_DEREF opcode by 40%.

@item 
bpo-28583@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28583}: PyDict_SetDefault didn’t combine split table when needed. Patch
by Xiang Zhang.

@item 
bpo-27243@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27243}: Change PendingDeprecationWarning -> DeprecationWarning. As it
was agreed in the issue, __aiter__ returning an awaitable should result in
PendingDeprecationWarning in 3.5 and in DeprecationWarning in 3.6.

@item 
bpo-26182@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26182}: Fix a refleak in code that raises DeprecationWarning.

@item 
bpo-28721@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28721}: Fix asynchronous generators aclose() and athrow() to handle
StopAsyncIteration propagation properly.
@end itemize

@node Library<182>,Documentation<74>,Core and Builtins<179>,Python 3 6 0 beta 4
@anchor{whatsnew/changelog id921}@anchor{1efa}
@subsubsection Library



@itemize -

@item 
bpo-28752@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28752}: Restored the __reduce__() methods of datetime objects.

@item 
bpo-28727@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28727}: Regular expression patterns, _sre.SRE_Pattern objects created
by re.compile(), become comparable (only x==y and x!=y operators). This
change should fix the bpo-18383@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18383}: don’t duplicate warning filters when
the warnings module is reloaded (thing usually only done in unit tests).

@item 
bpo-20572@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20572}: The subprocess.Popen.wait method’s undocumented endtime
parameter now raises a DeprecationWarning.

@item 
bpo-25659@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25659}: In ctypes, prevent a crash calling the from_buffer() and
from_buffer_copy() methods on abstract classes like Array.

@item 
bpo-19717@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19717}: Makes Path.resolve() succeed on paths that do not exist. Patch
by Vajrasky Kok

@item 
bpo-28563@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28563}: Fixed possible DoS and arbitrary code execution when handle
plural form selections in the gettext module.  The expression parser now
supports exact syntax supported by GNU gettext.

@item 
bpo-28387@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28387}: Fixed possible crash in _io.TextIOWrapper deallocator when the
garbage collector is invoked in other thread.  Based on patch by Sebastian
Cufre.

@item 
bpo-28600@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28600}: Optimize loop.call_soon.

@item 
bpo-28613@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28613}: Fix get_event_loop() return the current loop if called from
coroutines/callbacks.

@item 
bpo-28634@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28634}: Fix asyncio.isfuture() to support unittest.Mock.

@item 
bpo-26081@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26081}: Fix refleak in _asyncio.Future.__iter__().throw.

@item 
bpo-28639@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28639}: Fix inspect.isawaitable to always return bool Patch by Justin
Mayfield.

@item 
bpo-28652@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28652}: Make loop methods reject socket kinds they do not support.

@item 
bpo-28653@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28653}: Fix a refleak in functools.lru_cache.

@item 
bpo-28703@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28703}: Fix asyncio.iscoroutinefunction to handle Mock objects.

@item 
bpo-28704@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28704}: Fix create_unix_server to support Path-like objects (PEP 519).

@item 
bpo-28720@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28720}: Add collections.abc.AsyncGenerator.
@end itemize

@node Documentation<74>,Tests<71>,Library<182>,Python 3 6 0 beta 4
@anchor{whatsnew/changelog id922}@anchor{1efb}
@subsubsection Documentation



@itemize -

@item 
bpo-28513@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28513}: Documented command-line interface of zipfile.
@end itemize

@node Tests<71>,Build<82>,Documentation<74>,Python 3 6 0 beta 4
@anchor{whatsnew/changelog id923}@anchor{1efc}
@subsubsection Tests



@itemize -

@item 
bpo-28666@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28666}: Now test.support.rmtree is able to remove unwritable or
unreadable directories.

@item 
bpo-23839@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23839}: Various caches now are cleared before running every test file.
@end itemize

@node Build<82>,,Tests<71>,Python 3 6 0 beta 4
@anchor{whatsnew/changelog id924}@anchor{1efd}
@subsubsection Build



@itemize -

@item 
bpo-10656@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10656}: Fix out-of-tree building on AIX.  Patch by Tristan Carel and
Michael Haubenwallner.

@item 
bpo-26359@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26359}: Rename –with-optimiations to –enable-optimizations.

@item 
bpo-28676@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28676}: Prevent missing ‘getentropy’ declaration warning on macOS.
Patch by Gareth Rees.
@end itemize

@node Python 3 6 0 beta 3,Python 3 6 0 beta 2,Python 3 6 0 beta 4,Changelog
@anchor{whatsnew/changelog python-3-6-0-beta-3}@anchor{1efe}
@subsection Python 3.6.0 beta 3


`Release date: 2016-10-31'

@menu
* Core and Builtins: Core and Builtins<180>. 
* Library: Library<183>. 
* Windows: Windows<71>. 
* Build: Build<83>. 
* Tests: Tests<72>. 

@end menu

@node Core and Builtins<180>,Library<183>,,Python 3 6 0 beta 3
@anchor{whatsnew/changelog id925}@anchor{1eff}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-28128@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28128}: Deprecation warning for invalid str and byte escape sequences
now prints better information about where the error occurs. Patch by
Serhiy Storchaka and Eric Smith.

@item 
bpo-28509@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28509}: dict.update() no longer allocate unnecessary large memory.

@item 
bpo-28426@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28426}: Fixed potential crash in PyUnicode_AsDecodedObject() in debug
build.

@item 
bpo-28517@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28517}: Fixed of-by-one error in the peephole optimizer that caused
keeping unreachable code.

@item 
bpo-28214@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28214}: Improved exception reporting for problematic __set_name__
attributes.

@item 
bpo-23782@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23782}: Fixed possible memory leak in _PyTraceback_Add() and exception
loss in PyTraceBack_Here().

@item 
bpo-28471@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28471}: Fix “Python memory allocator called without holding the GIL”
crash in socket.setblocking.
@end itemize

@node Library<183>,Windows<71>,Core and Builtins<180>,Python 3 6 0 beta 3
@anchor{whatsnew/changelog id926}@anchor{1f00}
@subsubsection Library



@itemize -

@item 
bpo-27517@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27517}: LZMA compressor and decompressor no longer raise exceptions if
given empty data twice.  Patch by Benjamin Fogle.

@item 
bpo-28549@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28549}: Fixed segfault in curses’s addch() with ncurses6.

@item 
bpo-28449@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28449}: tarfile.open() with mode “r” or “r:” now tries to open a tar
file with compression before trying to open it without compression.
Otherwise it had 50% chance failed with ignore_zeros=True.

@item 
bpo-23262@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23262}: The webbrowser module now supports Firefox 36+ and derived
browsers.  Based on patch by Oleg Broytman.

@item 
bpo-27939@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27939}: Fixed bugs in tkinter.ttk.LabeledScale and tkinter.Scale caused
by representing the scale as float value internally in Tk.  tkinter.IntVar
now works if float value is set to underlying Tk variable.

@item 
bpo-18844@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18844}: The various ways of specifying weights for random.choices() now
produce the same result sequences.

@item 
bpo-28255@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28255}: calendar.TextCalendar().prmonth() no longer prints a space at
the start of new line after printing a month’s calendar.  Patch by Xiang
Zhang.

@item 
bpo-20491@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20491}: The textwrap.TextWrapper class now honors non-breaking spaces.
Based on patch by Kaarle Ritvanen.

@item 
bpo-28353@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28353}: os.fwalk() no longer fails on broken links.

@item 
bpo-28430@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28430}: Fix iterator of C implemented asyncio.Future doesn’t accept
non-None value is passed to it.send(val).

@item 
bpo-27025@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27025}: Generated names for Tkinter widgets now start by the “!” prefix
for readability.

@item 
bpo-25464@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25464}: Fixed HList.header_exists() in tkinter.tix module by addin a
workaround to Tix library bug.

@item 
bpo-28488@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28488}: shutil.make_archive() no longer adds entry “./” to ZIP archive.

@item 
bpo-25953@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25953}: re.sub() now raises an error for invalid numerical group
reference in replacement template even if the pattern is not found in the
string.  Error message for invalid group reference now includes the group
index and the position of the reference. Based on patch by SilentGhost.

@item 
bpo-18219@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18219}: Optimize csv.DictWriter for large number of columns. Patch by
Mariatta Wijaya.

@item 
bpo-28448@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28448}: Fix C implemented asyncio.Future didn’t work on Windows.

@item 
bpo-28480@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28480}: Fix error building socket module when multithreading is
disabled.

@item 
bpo-24452@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24452}: Make webbrowser support Chrome on Mac OS X.

@item 
bpo-20766@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20766}: Fix references leaked by pdb in the handling of SIGINT
handlers.

@item 
bpo-28492@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28492}: Fix how StopIteration exception is raised in _asyncio.Future.

@item 
bpo-28500@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28500}: Fix asyncio to handle async gens GC from another thread.

@item 
bpo-26923@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26923}: Fix asyncio.Gather to refuse being cancelled once all children
are done. Patch by Johannes Ebke.

@item 
bpo-26796@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26796}: Don’t configure the number of workers for default threadpool
executor. Initial patch by Hans Lawrenz.

@item 
bpo-28544@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28544}: Implement asyncio.Task in C.
@end itemize

@node Windows<71>,Build<83>,Library<183>,Python 3 6 0 beta 3
@anchor{whatsnew/changelog id927}@anchor{1f01}
@subsubsection Windows



@itemize -

@item 
bpo-28522@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28522}: Fixes mishandled buffer reallocation in getpathp.c
@end itemize

@node Build<83>,Tests<72>,Windows<71>,Python 3 6 0 beta 3
@anchor{whatsnew/changelog id928}@anchor{1f02}
@subsubsection Build



@itemize -

@item 
bpo-28444@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28444}: Fix missing extensions modules when cross compiling.

@item 
bpo-28208@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28208}: Update Windows build and OS X installers to use SQLite 3.14.2.

@item 
bpo-28248@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28248}: Update Windows build and OS X installers to use OpenSSL 1.0.2j.
@end itemize

@node Tests<72>,,Build<83>,Python 3 6 0 beta 3
@anchor{whatsnew/changelog id929}@anchor{1f03}
@subsubsection Tests



@itemize -

@item 
bpo-26944@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26944}: Fix test_posix for Android where ‘id -G’ is entirely wrong or
missing the effective gid.

@item 
bpo-28409@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28409}: regrtest: fix the parser of command line arguments.
@end itemize

@node Python 3 6 0 beta 2,Python 3 6 0 beta 1,Python 3 6 0 beta 3,Changelog
@anchor{whatsnew/changelog python-3-6-0-beta-2}@anchor{1f04}
@subsection Python 3.6.0 beta 2


`Release date: 2016-10-10'

@menu
* Core and Builtins: Core and Builtins<181>. 
* Library: Library<184>. 
* Windows: Windows<72>. 
* C API: C API<71>. 
* Build: Build<84>. 
* Tests: Tests<73>. 

@end menu

@node Core and Builtins<181>,Library<184>,,Python 3 6 0 beta 2
@anchor{whatsnew/changelog id930}@anchor{1f05}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-28183@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28183}: Optimize and cleanup dict iteration.

@item 
bpo-26081@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26081}: Added C implementation of asyncio.Future. Original patch by
Yury Selivanov.

@item 
bpo-28379@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28379}: Added sanity checks and tests for PyUnicode_CopyCharacters().
Patch by Xiang Zhang.

@item 
bpo-28376@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28376}: The type of long range iterator is now registered as Iterator.
Patch by Oren Milman.

@item 
bpo-28376@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28376}: Creating instances of range_iterator by calling range_iterator
type now is deprecated.  Patch by Oren Milman.

@item 
bpo-28376@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28376}: The constructor of range_iterator now checks that step is not
0. Patch by Oren Milman.

@item 
bpo-26906@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26906}: Resolving special methods of uninitialized type now causes
implicit initialization of the type instead of a fail.

@item 
bpo-18287@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18287}: PyType_Ready() now checks that tp_name is not NULL. Original
patch by Niklas Koep.

@item 
bpo-24098@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24098}: Fixed possible crash when AST is changed in process of
compiling it.

@item 
bpo-28201@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28201}: Dict reduces possibility of 2nd conflict in hash table when
hashes have same lower bits.

@item 
bpo-28350@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28350}: String constants with null character no longer interned.

@item 
bpo-26617@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26617}: Fix crash when GC runs during weakref callbacks.

@item 
bpo-27942@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27942}: String constants now interned recursively in tuples and
frozensets.

@item 
bpo-21578@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21578}: Fixed misleading error message when ImportError called with
invalid keyword args.

@item 
bpo-28203@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28203}: Fix incorrect type in complex(1.0, @{2:3@}) error message. Patch
by Soumya Sharma.

@item 
bpo-28086@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28086}: Single var-positional argument of tuple subtype was passed
unscathed to the C-defined function.  Now it is converted to exact tuple.

@item 
bpo-28214@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28214}: Now __set_name__ is looked up on the class instead of the
instance.

@item 
bpo-27955@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27955}: Fallback on reading /dev/urandom device when the getrandom()
syscall fails with EPERM, for example when blocked by SECCOMP.

@item 
bpo-28192@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28192}: Don’t import readline in isolated mode.

@item 
Upgrade internal unicode databases to Unicode version 9.0.0.

@item 
bpo-28131@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28131}: Fix a regression in zipimport’s compile_source().  zipimport
should use the same optimization level as the interpreter.

@item 
bpo-28126@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28126}: Replace Py_MEMCPY with memcpy(). Visual Studio can properly
optimize memcpy().

@item 
bpo-28120@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28120}: Fix dict.pop() for split dictionary when trying to remove a
“pending key” (Not yet inserted in split-table). Patch by Xiang Zhang.

@item 
bpo-26182@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26182}: Raise DeprecationWarning when async and await keywords are used
as variable/attribute/class/function name.
@end itemize

@node Library<184>,Windows<72>,Core and Builtins<181>,Python 3 6 0 beta 2
@anchor{whatsnew/changelog id931}@anchor{1f06}
@subsubsection Library



@itemize -

@item 
bpo-27998@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27998}: Fixed bytes path support in os.scandir() on Windows. Patch by
Eryk Sun.

@item 
bpo-28317@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28317}: The disassembler now decodes FORMAT_VALUE argument.

@item 
bpo-26293@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26293}: Fixed writing ZIP files that starts not from the start of the
file.  Offsets in ZIP file now are relative to the start of the archive in
conforming to the specification.

@item 
bpo-28380@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28380}: unittest.mock Mock autospec functions now properly support
assert_called, assert_not_called, and assert_called_once.

@item 
bpo-27181@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27181}: remove statistics.geometric_mean and defer until 3.7.

@item 
bpo-28229@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28229}: lzma module now supports pathlib.

@item 
bpo-28321@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28321}: Fixed writing non-BMP characters with binary format in
plistlib.

@item 
bpo-28225@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28225}: bz2 module now supports pathlib.  Initial patch by Ethan
Furman.

@item 
bpo-28227@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28227}: gzip now supports pathlib.  Patch by Ethan Furman.

@item 
bpo-27358@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27358}: Optimized merging var-keyword arguments and improved error
message when passing a non-mapping as a var-keyword argument.

@item 
bpo-28257@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28257}: Improved error message when passing a non-iterable as a
var-positional argument.  Added opcode BUILD_TUPLE_UNPACK_WITH_CALL.

@item 
bpo-28322@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28322}: Fixed possible crashes when unpickle itertools objects from
incorrect pickle data.  Based on patch by John Leitch.

@item 
bpo-28228@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28228}: imghdr now supports pathlib.

@item 
bpo-28226@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28226}: compileall now supports pathlib.

@item 
bpo-28314@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28314}: Fix function declaration (C flags) for the getiterator() method
of xml.etree.ElementTree.Element.

@item 
bpo-28148@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28148}: Stop using localtime() and gmtime() in the time module.
Introduced platform independent _PyTime_localtime API that is similar to
POSIX localtime_r, but available on all platforms.  Patch by Ed Schouten.

@item 
bpo-28253@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28253}: Fixed calendar functions for extreme months: 0001-01 and
9999-12. Methods itermonthdays() and itermonthdays2() are reimplemented so
that they don’t call itermonthdates() which can cause datetime.date
under/overflow.

@item 
bpo-28275@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28275}: Fixed possible use after free in the decompress() methods of
the LZMADecompressor and BZ2Decompressor classes. Original patch by John
Leitch.

@item 
bpo-27897@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27897}: Fixed possible crash in sqlite3.Connection.create_collation()
if pass invalid string-like object as a name.  Patch by Xiang Zhang.

@item 
bpo-18844@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18844}: random.choices() now has k as a keyword-only argument to
improve the readability of common cases and come into line with the
signature used in other languages.

@item 
bpo-18893@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18893}: Fix invalid exception handling in Lib/ctypes/macholib/dyld.py.
Patch by Madison May.

@item 
bpo-27611@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27611}: Fixed support of default root window in the tkinter.tix module.
Added the master parameter in the DisplayStyle constructor.

@item 
bpo-27348@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27348}: In the traceback module, restore the formatting of exception
messages like “Exception: None”.  This fixes a regression introduced in
3.5a2.

@item 
bpo-25651@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25651}: Allow false values to be used for msg parameter of subTest().

@item 
bpo-27778@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27778}: Fix a memory leak in os.getrandom() when the getrandom() is
interrupted by a signal and a signal handler raises a Python exception.

@item 
bpo-28200@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28200}: Fix memory leak on Windows in the os module (fix
path_converter() function).

@item 
bpo-25400@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25400}: RobotFileParser now correctly returns default values for
crawl_delay and request_rate.  Initial patch by Peter Wirtz.

@item 
bpo-27932@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27932}: Prevent memory leak in win32_ver().

@item 
Fix UnboundLocalError in socket._sendfile_use_sendfile.

@item 
bpo-28075@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28075}: Check for ERROR_ACCESS_DENIED in Windows implementation of
os.stat().  Patch by Eryk Sun.

@item 
bpo-22493@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22493}: Warning message emitted by using inline flags in the middle of
regular expression now contains a (truncated) regex pattern. Patch by Tim
Graham.

@item 
bpo-25270@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25270}: Prevent codecs.escape_encode() from raising SystemError when an
empty bytestring is passed.

@item 
bpo-28181@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28181}: Get antigravity over HTTPS. Patch by Kaartic Sivaraam.

@item 
bpo-25895@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25895}: Enable WebSocket URL schemes in urllib.parse.urljoin. Patch by
Gergely Imreh and Markus Holtermann.

@item 
bpo-28114@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28114}: Fix a crash in parse_envlist() when env contains byte strings.
Patch by Eryk Sun.

@item 
bpo-27599@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27599}: Fixed buffer overrun in binascii.b2a_qp() and
binascii.a2b_qp().

@item 
bpo-27906@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27906}: Fix socket accept exhaustion during high TCP traffic. Patch by
Kevin Conway.

@item 
bpo-28174@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28174}: Handle when SO_REUSEPORT isn’t properly supported. Patch by
Seth Michael Larson.

@item 
bpo-26654@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26654}: Inspect functools.partial in asyncio.Handle.__repr__. Patch by
iceboy.

@item 
bpo-26909@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26909}: Fix slow pipes IO in asyncio. Patch by INADA Naoki.

@item 
bpo-28176@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28176}: Fix callbacks race in asyncio.SelectorLoop.sock_connect.

@item 
bpo-27759@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27759}: Fix selectors incorrectly retain invalid file descriptors.
Patch by Mark Williams.

@item 
bpo-28368@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28368}: Refuse monitoring processes if the child watcher has no loop
attached. Patch by Vincent Michel.

@item 
bpo-28369@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28369}: Raise RuntimeError when transport’s FD is used with add_reader,
add_writer, etc.

@item 
bpo-28370@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28370}: Speedup asyncio.StreamReader.readexactly. Patch by Коренберг
Марк.

@item 
bpo-28371@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28371}: Deprecate passing asyncio.Handles to run_in_executor.

@item 
bpo-28372@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28372}: Fix asyncio to support formatting of non-python coroutines.

@item 
bpo-28399@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28399}: Remove UNIX socket from FS before binding. Patch by Коренберг
Марк.

@item 
bpo-27972@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27972}: Prohibit Tasks to await on themselves.
@end itemize

@node Windows<72>,C API<71>,Library<184>,Python 3 6 0 beta 2
@anchor{whatsnew/changelog id932}@anchor{1f07}
@subsubsection Windows



@itemize -

@item 
bpo-28402@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28402}: Adds signed catalog files for stdlib on Windows.

@item 
bpo-28333@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28333}: Enables Unicode for ps1/ps2 and input() prompts. (Patch by Eryk
Sun)

@item 
bpo-28251@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28251}: Improvements to help manuals on Windows.

@item 
bpo-28110@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28110}: launcher.msi has different product codes between 32-bit and
64-bit

@item 
bpo-28161@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28161}: Opening CON for write access fails

@item 
bpo-28162@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28162}: WindowsConsoleIO readall() fails if first line starts with
Ctrl+Z

@item 
bpo-28163@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28163}: WindowsConsoleIO fileno() passes wrong flags to _open_osfhandle

@item 
bpo-28164@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28164}: _PyIO_get_console_type fails for various paths

@item 
bpo-28137@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28137}: Renames Windows path file to ._pth

@item 
bpo-28138@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28138}: Windows ._pth file should allow import site
@end itemize

@node C API<71>,Build<84>,Windows<72>,Python 3 6 0 beta 2
@anchor{whatsnew/changelog id933}@anchor{1f08}
@subsubsection C API



@itemize -

@item 
bpo-28426@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28426}: Deprecated undocumented functions PyUnicode_AsEncodedObject(),
PyUnicode_AsDecodedObject(), PyUnicode_AsDecodedUnicode() and
PyUnicode_AsEncodedUnicode().
@end itemize

@node Build<84>,Tests<73>,C API<71>,Python 3 6 0 beta 2
@anchor{whatsnew/changelog id934}@anchor{1f09}
@subsubsection Build



@itemize -

@item 
bpo-28258@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28258}: Fixed build with Estonian locale (python-config and distclean
targets in Makefile).  Patch by Arfrever Frehtes Taifersar Arahesis.

@item 
bpo-26661@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26661}: setup.py now detects system libffi with multiarch wrapper.

@item 
bpo-15819@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15819}: Remove redundant include search directory option for building
outside the source tree.
@end itemize

@node Tests<73>,,Build<84>,Python 3 6 0 beta 2
@anchor{whatsnew/changelog id935}@anchor{1f0a}
@subsubsection Tests



@itemize -

@item 
bpo-28217@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28217}: Adds _testconsole module to test console input.
@end itemize

@node Python 3 6 0 beta 1,Python 3 6 0 alpha 4,Python 3 6 0 beta 2,Changelog
@anchor{whatsnew/changelog python-3-6-0-beta-1}@anchor{1f0b}
@subsection Python 3.6.0 beta 1


`Release date: 2016-09-12'

@menu
* Core and Builtins: Core and Builtins<182>. 
* Library: Library<185>. 
* IDLE: IDLE<52>. 
* C API: C API<72>. 
* Tests: Tests<74>. 
* Build: Build<85>. 
* Tools/Demos: Tools/Demos<51>. 
* Windows: Windows<73>. 

@end menu

@node Core and Builtins<182>,Library<185>,,Python 3 6 0 beta 1
@anchor{whatsnew/changelog id936}@anchor{1f0c}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-23722@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23722}: The __class__ cell used by zero-argument super() is now
initialized from type.__new__ rather than __build_class__, so class
methods relying on that will now work correctly when called from metaclass
methods during class creation. Patch by Martin Teichmann.

@item 
bpo-25221@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25221}: Fix corrupted result from PyLong_FromLong(0) when Python is
compiled with NSMALLPOSINTS = 0.

@item 
bpo-27080@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27080}: Implement formatting support for 
@geindex Python 향상 제안; PEP 515
PEP 515@footnote{https://peps.python.org/pep-0515/}.  Initial patch by
Chris Angelico.

@item 
bpo-27199@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27199}: In tarfile, expose copyfileobj bufsize to improve throughput.
Patch by Jason Fried.

@item 
bpo-27948@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27948}: In f-strings, only allow backslashes inside the braces (where
the expressions are).  This is a breaking change from the 3.6 alpha
releases, where backslashes are allowed anywhere in an f-string.  Also,
require that expressions inside f-strings be enclosed within literal
braces, and not escapes like @code{f'\x7b"hi"\x7d'}.

@item 
bpo-28046@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28046}: Remove platform-specific directories from sys.path.

@item 
bpo-28071@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28071}: Add early-out for differencing from an empty set.

@item 
bpo-25758@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25758}: Prevents zipimport from unnecessarily encoding a filename
(patch by Eryk Sun)

@item 
bpo-25856@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25856}: The __module__ attribute of extension classes and functions now
is interned. This leads to more compact pickle data with protocol 4.

@item 
bpo-27213@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27213}: Rework CALL_FUNCTION* opcodes to produce shorter and more
efficient bytecode. Patch by Demur Rumed, design by Serhiy Storchaka,
reviewed by Serhiy Storchaka and Victor Stinner.

@item 
bpo-26331@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26331}: Implement tokenizing support for 
@geindex Python 향상 제안; PEP 515
PEP 515@footnote{https://peps.python.org/pep-0515/}. Patch by Georg
Brandl.

@item 
bpo-27999@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27999}: Make “global after use” a SyntaxError, and ditto for nonlocal.
Patch by Ivan Levkivskyi.

@item 
bpo-28003@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28003}: Implement 
@geindex Python 향상 제안; PEP 525
PEP 525@footnote{https://peps.python.org/pep-0525/} – Asynchronous Generators.

@item 
bpo-27985@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27985}: Implement 
@geindex Python 향상 제안; PEP 526
PEP 526@footnote{https://peps.python.org/pep-0526/} – Syntax for Variable Annotations. Patch
by Ivan Levkivskyi.

@item 
bpo-26058@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26058}: Add a new private version to the builtin dict type, incremented
at each dictionary creation and at each dictionary change. Implementation
of the PEP 509.

@item 
bpo-27364@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27364}: A backslash-character pair that is not a valid escape sequence
now generates a DeprecationWarning.  Patch by Emanuel Barry.

@item 
bpo-27350@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27350}: @code{dict} implementation is changed like PyPy. It is more
compact and preserves insertion order. (Concept developed by Raymond
Hettinger and patch by Inada Naoki.)

@item 
bpo-27911@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27911}: Remove unnecessary error checks in
@code{exec_builtin_or_dynamic()}.

@item 
bpo-27078@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27078}: Added BUILD_STRING opcode.  Optimized f-strings evaluation.

@item 
bpo-17884@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17884}: Python now requires systems with inttypes.h and stdint.h

@item 
bpo-27961@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27961}: Require platforms to support @code{long long}. Python hasn’t
compiled without @code{long long} for years, so this is basically a
formality.

@item 
bpo-27355@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27355}: Removed support for Windows CE.  It was never finished, and
Windows CE is no longer a relevant platform for Python.

@item 
Implement 
@geindex Python 향상 제안; PEP 523
PEP 523@footnote{https://peps.python.org/pep-0523/}.

@item 
bpo-27870@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27870}: A left shift of zero by a large integer no longer attempts to
allocate large amounts of memory.

@item 
bpo-25402@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25402}: In int-to-decimal-string conversion, improve the estimate of
the intermediate memory required, and remove an unnecessarily strict
overflow check. Patch by Serhiy Storchaka.

@item 
bpo-27214@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27214}: In long_invert, be more careful about modifying object returned
by long_add, and remove an unnecessary check for small longs. Thanks Oren
Milman for analysis and patch.

@item 
bpo-27506@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27506}: Support passing the bytes/bytearray.translate() “delete”
argument by keyword.

@item 
bpo-27812@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27812}: Properly clear out a generator’s frame’s backreference to the
generator to prevent crashes in frame.clear().

@item 
bpo-27811@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27811}: Fix a crash when a coroutine that has not been awaited is
finalized with warnings-as-errors enabled.

@item 
bpo-27587@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27587}: Fix another issue found by PVS-Studio: Null pointer check after
use of ‘def’ in _PyState_AddModule(). Initial patch by Christian Heimes.

@item 
bpo-27792@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27792}: The modulo operation applied to @code{bool} and other @code{int}
subclasses now always returns an @code{int}. Previously the return type
depended on the input values. Patch by Xiang Zhang.

@item 
bpo-26984@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26984}: int() now always returns an instance of exact int.

@item 
bpo-25604@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25604}: Fix a minor bug in integer true division; this bug could
potentially have caused off-by-one-ulp results on platforms with
unreliable ldexp implementations.

@item 
bpo-24254@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24254}: Make class definition namespace ordered by default.

@item 
bpo-27662@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27662}: Fix an overflow check in @code{List_New}: the original code was
checking against @code{Py_SIZE_MAX} instead of the correct upper bound of
@code{Py_SSIZE_T_MAX}. Patch by Xiang Zhang.

@item 
bpo-27782@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27782}: Multi-phase extension module import now correctly allows the
@code{m_methods} field to be used to add module level functions to instances
of non-module types returned from @code{Py_create_mod}. Patch by Xiang Zhang.

@item 
bpo-27936@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27936}: The round() function accepted a second None argument for some
types but not for others.  Fixed the inconsistency by accepting None for
all numeric types.

@item 
bpo-27487@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27487}: Warn if a submodule argument to “python -m” or
runpy.run_module() is found in sys.modules after parent packages are
imported, but before the submodule is executed.

@item 
bpo-27157@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27157}: Make only type() itself accept the one-argument form. Patch by
Eryk Sun and Emanuel Barry.

@item 
bpo-27558@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27558}: Fix a SystemError in the implementation of “raise” statement.
In a brand new thread, raise a RuntimeError since there is no active
exception to reraise. Patch written by Xiang Zhang.

@item 
bpo-28008@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28008}: Implement 
@geindex Python 향상 제안; PEP 530
PEP 530@footnote{https://peps.python.org/pep-0530/} – asynchronous comprehensions.

@item 
bpo-27942@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27942}: Fix memory leak in codeobject.c
@end itemize

@node Library<185>,IDLE<52>,Core and Builtins<182>,Python 3 6 0 beta 1
@anchor{whatsnew/changelog id937}@anchor{1f0d}
@subsubsection Library



@itemize -

@item 
bpo-28732@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28732}: Fix crash in os.spawnv() with no elements in args

@item 
bpo-28485@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28485}: Always raise ValueError for negative
compileall.compile_dir(workers=…) parameter, even when multithreading is
unavailable.

@item 
bpo-28037@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28037}: Use sqlite3_get_autocommit() instead of setting
Connection->inTransaction manually.

@item 
bpo-25283@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25283}: Attributes tm_gmtoff and tm_zone are now available on all
platforms in the return values of time.localtime() and time.gmtime().

@item 
bpo-24454@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24454}: Regular expression match object groups are now accessible using
__getitem__. “mo[x]” is equivalent to “mo.group(x)”.

@item 
bpo-10740@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10740}: sqlite3 no longer implicitly commit an open transaction before
DDL statements.

@item 
bpo-17941@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17941}: Add a `module' parameter to collections.namedtuple().

@item 
bpo-22493@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22493}: Inline flags now should be used only at the start of the
regular expression. Deprecation warning is emitted if uses them in the
middle of the regular expression.

@item 
bpo-26885@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26885}: xmlrpc now supports unmarshalling additional data types used by
Apache XML-RPC implementation for numerics and None.

@item 
bpo-28070@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28070}: Fixed parsing inline verbose flag in regular expressions.

@item 
bpo-19500@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19500}: Add client-side SSL session resumption to the ssl module.

@item 
bpo-28022@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28022}: Deprecate ssl-related arguments in favor of SSLContext. The
deprecation include manual creation of SSLSocket and certfile/keyfile (or
similar) in ftplib, httplib, imaplib, smtplib, poplib and urllib.

@item 
bpo-28043@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28043}: SSLContext has improved default settings: OP_NO_SSLv2,
OP_NO_SSLv3, OP_NO_COMPRESSION, OP_CIPHER_SERVER_PREFERENCE,
OP_SINGLE_DH_USE, OP_SINGLE_ECDH_USE and HIGH ciphers without MD5.

@item 
bpo-24693@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24693}: Changed some RuntimeError’s in the zipfile module to more
appropriate types. Improved some error messages and debugging output.

@item 
bpo-17909@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17909}: @code{json.load} and @code{json.loads} now support binary input
encoded as UTF-8, UTF-16 or UTF-32. Patch by Serhiy Storchaka.

@item 
bpo-27137@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27137}: the pure Python fallback implementation of
@code{functools.partial} now matches the behaviour of its accelerated C
counterpart for subclassing, pickling and text representation purposes.
Patch by Emanuel Barry and Serhiy Storchaka.

@item 
Fix possible integer overflows and crashes in the mmap module with unusual
usage patterns.

@item 
bpo-1703178@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1703178}: Fix the ability to pass the –link-objects option to the
distutils build_ext command.

@item 
bpo-28019@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28019}: itertools.count() no longer rounds non-integer step in range
between 1.0 and 2.0 to 1.

@item 
bpo-18401@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18401}: Pdb now supports the ‘readrc’ keyword argument to control
whether .pdbrc files should be read.  Patch by Martin Matusiak and Sam
Kimbrel.

@item 
bpo-25969@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25969}: Update the lib2to3 grammar to handle the unpacking
generalizations added in 3.5.

@item 
bpo-14977@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14977}: mailcap now respects the order of the lines in the mailcap
files (“first match”), as required by RFC 1542.  Patch by Michael Lazar.

@item 
bpo-28082@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28082}: Convert re flag constants to IntFlag.

@item 
bpo-28025@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28025}: Convert all ssl module constants to IntEnum and IntFlags.
SSLContext properties now return flags and enums.

@item 
bpo-23591@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23591}: Add Flag, IntFlag, and auto() to enum module.

@item 
bpo-433028@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=433028}: Added support of modifier spans in regular expressions.

@item 
bpo-24594@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24594}: Validates persist parameter when opening MSI database

@item 
bpo-17582@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17582}: xml.etree.ElementTree nows preserves whitespaces in attributes
(Patch by Duane Griffin.  Reviewed and approved by Stefan Behnel.)

@item 
bpo-28047@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28047}: Fixed calculation of line length used for the base64 CTE in the
new email policies.

@item 
bpo-27576@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27576}: Fix call order in OrderedDict.__init__().

@item 
email.generator.DecodedGenerator now supports the policy keyword.

@item 
bpo-28027@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28027}: Remove undocumented modules from @code{Lib/plat-*}: IN, CDROM,
DLFCN, TYPES, CDIO, and STROPTS.

@item 
bpo-27445@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27445}: Don’t pass str(_charset) to MIMEText.set_payload(). Patch by
Claude Paroz.

@item 
bpo-24277@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24277}: The new email API is no longer provisional, and the docs have
been reorganized and rewritten to emphasize the new API.

@item 
bpo-22450@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22450}: urllib now includes an @code{Accept: */*} header among the default
headers. This makes the results of REST API requests more consistent and
predictable especially when proxy servers are involved.

@item 
lib2to3.pgen3.driver.load_grammar() now creates a stable cache file
between runs given the same Grammar.txt input regardless of the hash
randomization setting.

@item 
bpo-28005@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28005}: Allow ImportErrors in encoding implementation to propagate.

@item 
bpo-26667@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26667}: Support path-like objects in importlib.util.

@item 
bpo-27570@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27570}: Avoid zero-length memcpy() etc calls with null source pointers
in the “ctypes” and “array” modules.

@item 
bpo-22233@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22233}: Break email header lines `only' on the RFC specified CR and LF
characters, not on arbitrary unicode line breaks.  This also fixes a bug
in HTTP header parsing.

@item 
bpo-27331@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27331}: The email.mime classes now all accept an optional policy
keyword.

@item 
bpo-27988@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27988}: Fix email iter_attachments incorrect mutation of payload list.

@item 
bpo-16113@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16113}: Add SHA-3 and SHAKE support to hashlib module.

@item 
Eliminate a tautological-pointer-compare warning in _scproxy.c.

@item 
bpo-27776@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27776}: The @ref{745,,os.urandom()} function does now block on Linux 3.17
and newer until the system urandom entropy pool is initialized to increase
the security. This change is part of the 
@geindex Python 향상 제안; PEP 524
PEP 524@footnote{https://peps.python.org/pep-0524/}.

@item 
bpo-27778@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27778}: Expose the Linux @code{getrandom()} syscall as a new
@ref{eb8,,os.getrandom()} function. This change is part of the 
@geindex Python 향상 제안; PEP 524
PEP 524@footnote{https://peps.python.org/pep-0524/}.

@item 
bpo-27691@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27691}: Fix ssl module’s parsing of GEN_RID subject alternative name
fields in X.509 certs.

@item 
bpo-18844@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18844}: Add random.choices().

@item 
bpo-25761@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25761}: Improved error reporting about truncated pickle data in C
implementation of unpickler.  UnpicklingError is now raised instead of
AttributeError and ValueError in some cases.

@item 
bpo-26798@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26798}: Add BLAKE2 (blake2b and blake2s) to hashlib.

@item 
bpo-26032@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26032}: Optimized globbing in pathlib by using os.scandir(); it is now
about 1.5–4 times faster.

@item 
bpo-25596@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25596}: Optimized glob() and iglob() functions in the glob module; they
are now about 3–6 times faster.

@item 
bpo-27928@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27928}: Add scrypt (password-based key derivation function) to hashlib
module (requires OpenSSL 1.1.0).

@item 
bpo-27850@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27850}: Remove 3DES from ssl module’s default cipher list to counter
measure sweet32 attack (
@geindex Common Vulnerabilities and Exposures; CVE 2016-2183
CVE 2016-2183@footnote{https://www.cve.org/CVERecord?id=CVE-2016-2183}).

@item 
bpo-27766@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27766}: Add ChaCha20 Poly1305 to ssl module’s default cipher list.
(Required OpenSSL 1.1.0 or LibreSSL).

@item 
bpo-25387@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25387}: Check return value of winsound.MessageBeep.

@item 
bpo-27866@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27866}: Add SSLContext.get_ciphers() method to get a list of all
enabled ciphers.

@item 
bpo-27744@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27744}: Add AF_ALG (Linux Kernel crypto) to socket module.

@item 
bpo-26470@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26470}: Port ssl and hashlib module to OpenSSL 1.1.0.

@item 
bpo-11620@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11620}: Fix support for SND_MEMORY in winsound.PlaySound.  Based on a
patch by Tim Lesher.

@item 
bpo-11734@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11734}: Add support for IEEE 754 half-precision floats to the struct
module. Based on a patch by Eli Stevens.

@item 
bpo-27919@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27919}: Deprecated @code{extra_path} distribution option in distutils
packaging.

@item 
bpo-23229@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23229}: Add new @code{cmath} constants: @code{cmath.inf} and @code{cmath.nan} to
match @code{math.inf} and @code{math.nan}, and also @code{cmath.infj} and
@code{cmath.nanj} to match the format used by complex repr.

@item 
bpo-27842@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27842}: The csv.DictReader now returns rows of type OrderedDict.
(Contributed by Steve Holden.)

@item 
Remove support for passing a file descriptor to os.access. It never worked
but previously didn’t raise.

@item 
bpo-12885@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12885}: Fix error when distutils encounters symlink.

@item 
bpo-27881@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27881}: Fixed possible bugs when setting
sqlite3.Connection.isolation_level. Based on patch by Xiang Zhang.

@item 
bpo-27861@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27861}: Fixed a crash in sqlite3.Connection.cursor() when a factory
creates not a cursor.  Patch by Xiang Zhang.

@item 
bpo-19884@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19884}: Avoid spurious output on OS X with Gnu Readline.

@item 
bpo-27706@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27706}: Restore deterministic behavior of random.Random().seed() for
string seeds using seeding version 1.  Allows sequences of calls to
random() to exactly match those obtained in Python 2. Patch by Nofar
Schnider.

@item 
bpo-10513@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10513}: Fix a regression in Connection.commit().  Statements should not
be reset after a commit.

@item 
bpo-12319@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12319}: Chunked transfer encoding support added to
http.client.HTTPConnection requests.  The
urllib.request.AbstractHTTPHandler class does not enforce a Content-Length
header any more.  If a HTTP request has a file or iterable body, but no
Content-Length header, the library now falls back to use chunked
transfer-encoding.

@item 
A new version of typing.py from @indicateurl{https://github.com/python/typing}: -
Collection (only for 3.6) (bpo-27598@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27598}) - Add FrozenSet to __all__
(upstream #261) - fix crash in _get_type_vars() (upstream #259) - Remove
the dict constraint in ForwardRef._eval_type (upstream #252)

@item 
bpo-27832@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27832}: Make @code{_normalize} parameter to @code{Fraction} constructor
keyword-only, so that @code{Fraction(2, 3, 4)} now raises @code{TypeError}.

@item 
bpo-27539@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27539}: Fix unnormalised @code{Fraction.__pow__} result in the case of
negative exponent and negative base.

@item 
bpo-21718@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21718}: cursor.description is now available for queries using CTEs.

@item 
bpo-27819@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27819}: In distutils sdists, simply produce the “gztar” (gzipped tar
format) distributions on all platforms unless “formats” is supplied.

@item 
bpo-2466@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2466}: posixpath.ismount now correctly recognizes mount points which
the user does not have permission to access.

@item 
bpo-9998@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9998}: On Linux, ctypes.util.find_library now looks in LD_LIBRARY_PATH
for shared libraries.

@item 
bpo-27573@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27573}: exit message for code.interact is now configurable.

@item 
bpo-27930@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27930}: Improved behaviour of logging.handlers.QueueListener. Thanks to
Paulo Andrade and Petr Viktorin for the analysis and patch.

@item 
bpo-6766@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6766}: Distributed reference counting added to multiprocessing to
support nesting of shared values / proxy objects.

@item 
bpo-21201@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21201}: Improves readability of multiprocessing error message.  Thanks
to Wojciech Walczak for patch.

@item 
asyncio: Add set_protocol / get_protocol to Transports.

@item 
bpo-27456@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27456}: asyncio: Set TCP_NODELAY by default.
@end itemize

@node IDLE<52>,C API<72>,Library<185>,Python 3 6 0 beta 1
@anchor{whatsnew/changelog id938}@anchor{1f0e}
@subsubsection IDLE



@itemize -

@item 
bpo-15308@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15308}: Add ‘interrupt execution’ (^C) to Shell menu. Patch by Roger
Serwy, updated by Bayard Randel.

@item 
bpo-27922@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27922}: Stop IDLE tests from ‘flashing’ gui widgets on the screen.

@item 
bpo-27891@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27891}: Consistently group and sort imports within idlelib modules.

@item 
bpo-17642@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17642}: add larger font sizes for classroom projection.

@item 
Add version to title of IDLE help window.

@item 
bpo-25564@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25564}: In section on IDLE – console differences, mention that using
exec means that __builtins__ is defined for each statement.

@item 
bpo-27821@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27821}: Fix 3.6.0a3 regression that prevented custom key sets from
being selected when no custom theme was defined.
@end itemize

@node C API<72>,Tests<74>,IDLE<52>,Python 3 6 0 beta 1
@anchor{whatsnew/changelog id939}@anchor{1f0f}
@subsubsection C API



@itemize -

@item 
bpo-26900@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26900}: Excluded underscored names and other private API from limited
API.

@item 
bpo-26027@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26027}: Add support for path-like objects in PyUnicode_FSConverter() &
PyUnicode_FSDecoder().
@end itemize

@node Tests<74>,Build<85>,C API<72>,Python 3 6 0 beta 1
@anchor{whatsnew/changelog id940}@anchor{1f10}
@subsubsection Tests



@itemize -

@item 
bpo-27427@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27427}: Additional tests for the math module. Patch by Francisco Couzo.

@item 
bpo-27953@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27953}: Skip math and cmath tests that fail on OS X 10.4 due to a poor
libm implementation of tan.

@item 
bpo-26040@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26040}: Improve test_math and test_cmath coverage and rigour. Patch by
Jeff Allen.

@item 
bpo-27787@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27787}: Call gc.collect() before checking each test for “dangling
threads”, since the dangling threads are weak references.
@end itemize

@node Build<85>,Tools/Demos<51>,Tests<74>,Python 3 6 0 beta 1
@anchor{whatsnew/changelog id941}@anchor{1f11}
@subsubsection Build



@itemize -

@item 
bpo-27566@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27566}: Fix clean target in freeze makefile (patch by Lisa Roach)

@item 
bpo-27705@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27705}: Update message in validate_ucrtbase.py

@item 
bpo-27976@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27976}: Deprecate building _ctypes with the bundled copy of libffi on
non-OSX UNIX platforms.

@item 
bpo-27983@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27983}: Cause lack of llvm-profdata tool when using clang as required
for PGO linking to be a configure time error rather than make time when
@code{--with-optimizations} is enabled.  Also improve our ability to find the
llvm-profdata tool on MacOS and some Linuxes.

@item 
bpo-21590@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21590}: Support for DTrace and SystemTap probes.

@item 
bpo-26307@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26307}: The profile-opt build now applies PGO to the built-in modules.

@item 
bpo-26359@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26359}: Add the –with-optimizations flag to turn on LTO and PGO build
support when available.

@item 
bpo-27917@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27917}: Set platform triplets for Android builds.

@item 
bpo-25825@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25825}: Update references to the $(LIBPL) installation path on AIX.
This path was changed in 3.2a4.

@item 
Update OS X installer to use SQLite 3.14.1 and XZ 5.2.2.

@item 
bpo-21122@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21122}: Fix LTO builds on OS X.

@item 
bpo-17128@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17128}: Build OS X installer with a private copy of OpenSSL. Also
provide a sample Install Certificates command script to install a set of
root certificates from the third-party certifi module.
@end itemize

@node Tools/Demos<51>,Windows<73>,Build<85>,Python 3 6 0 beta 1
@anchor{whatsnew/changelog id942}@anchor{1f12}
@subsubsection Tools/Demos



@itemize -

@item 
bpo-27952@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27952}: Get Tools/scripts/fixcid.py working with Python 3 and the
current “re” module, avoid invalid Python backslash escapes, and fix a bug
parsing escaped C quote signs.
@end itemize

@node Windows<73>,,Tools/Demos<51>,Python 3 6 0 beta 1
@anchor{whatsnew/changelog id943}@anchor{1f13}
@subsubsection Windows



@itemize -

@item 
bpo-28065@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28065}: Update xz dependency to 5.2.2 and build it from source.

@item 
bpo-25144@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25144}: Ensures TargetDir is set before continuing with custom install.

@item 
bpo-1602@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1602}: Windows console doesn’t input or print Unicode (PEP 528)

@item 
bpo-27781@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27781}: Change file system encoding on Windows to UTF-8 (PEP 529)

@item 
bpo-27731@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27731}: Opt-out of MAX_PATH on Windows 10

@item 
bpo-6135@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6135}: Adds encoding and errors parameters to subprocess.

@item 
bpo-27959@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27959}: Adds oem encoding, alias ansi to mbcs, move aliasmbcs to codec
lookup.

@item 
bpo-27982@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27982}: The functions of the winsound module now accept keyword
arguments.

@item 
bpo-20366@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20366}: Build full text search support into SQLite on Windows.

@item 
bpo-27756@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27756}: Adds new icons for Python files and processes on Windows.
Designs by Cherry Wang.

@item 
bpo-27883@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27883}: Update sqlite to 3.14.1.0 on Windows.
@end itemize

@node Python 3 6 0 alpha 4,Python 3 6 0 alpha 3,Python 3 6 0 beta 1,Changelog
@anchor{whatsnew/changelog python-3-6-0-alpha-4}@anchor{1f14}
@subsection Python 3.6.0 alpha 4


`Release date: 2016-08-15'

@menu
* Core and Builtins: Core and Builtins<183>. 
* Library: Library<186>. 
* IDLE: IDLE<53>. 
* Tests: Tests<75>. 
* Windows: Windows<74>. 
* Build: Build<86>. 

@end menu

@node Core and Builtins<183>,Library<186>,,Python 3 6 0 alpha 4
@anchor{whatsnew/changelog id944}@anchor{1f15}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-27704@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27704}: Optimized creating bytes and bytearray from byte-like objects
and iterables. Speed up to 3 times for short objects.  Original patch by
Naoki Inada.

@item 
bpo-26823@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26823}: Large sections of repeated lines in tracebacks are now
abbreviated as “[Previous line repeated @{count@} more times]” by the
builtin traceback rendering. Patch by Emanuel Barry.

@item 
bpo-27574@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27574}: Decreased an overhead of parsing keyword arguments in functions
implemented with using Argument Clinic.

@item 
bpo-22557@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22557}: Now importing already imported modules is up to 2.5 times
faster.

@item 
bpo-17596@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17596}: Include <wincrypt.h> to help with Min GW building.

@item 
bpo-17599@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17599}: On Windows, rename the privately defined REPARSE_DATA_BUFFER
structure to avoid conflicting with the definition from Min GW.

@item 
bpo-27507@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27507}: Add integer overflow check in bytearray.extend().  Patch by
Xiang Zhang.

@item 
bpo-27581@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27581}: Don’t rely on wrapping for overflow check in
PySequence_Tuple().  Patch by Xiang Zhang.

@item 
bpo-1621@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1621}: Avoid signed integer overflow in list and tuple operations.
Patch by Xiang Zhang.

@item 
bpo-27419@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27419}: Standard __import__() no longer look up “__import__” in globals
or builtins for importing submodules or “from import”.  Fixed a crash if
raise a warning about unabling to resolve package from __spec__ or
__package__.

@item 
bpo-27083@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27083}: Respect the PYTHONCASEOK environment variable under Windows.

@item 
bpo-27514@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27514}: Make having too many statically nested blocks a SyntaxError
instead of SystemError.

@item 
bpo-27366@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27366}: Implemented 
@geindex Python 향상 제안; PEP 487
PEP 487@footnote{https://peps.python.org/pep-0487/} (Simpler customization of class
creation). Upon subclassing, the __init_subclass__ classmethod is called
on the base class. Descriptors are initialized with __set_name__ after
class creation.
@end itemize

@node Library<186>,IDLE<53>,Core and Builtins<183>,Python 3 6 0 alpha 4
@anchor{whatsnew/changelog id945}@anchor{1f16}
@subsubsection Library



@itemize -

@item 
bpo-26027@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26027}: Add 
@geindex Python 향상 제안; PEP 519
PEP 519@footnote{https://peps.python.org/pep-0519/}/__fspath__() support to the os and os.path
modules. Includes code from Jelle Zijlstra. (See also: bpo-27524@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27524})

@item 
bpo-27598@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27598}: Add Collections to collections.abc. Patch by Ivan Levkivskyi,
docs by Neil Girdhar.

@item 
bpo-25958@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25958}: Support “anti-registration” of special methods from various
ABCs, like __hash__, __iter__ or __len__.  All these (and several more)
can be set to None in an implementation class and the behavior will be as
if the method is not defined at all. (Previously, this mechanism existed
only for __hash__, to make mutable classes unhashable.)  Code contributed
by Andrew Barnert and Ivan Levkivskyi.

@item 
bpo-16764@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16764}: Support keyword arguments to zlib.decompress().  Patch by Xiang
Zhang.

@item 
bpo-27736@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27736}: Prevent segfault after interpreter re-initialization due to ref
count problem introduced in code for bpo-27038@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27038} in 3.6.0a3. Patch by
Xiang Zhang.

@item 
bpo-25628@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25628}: The `verbose' and `rename' parameters for
collections.namedtuple are now keyword-only.

@item 
bpo-12345@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12345}: Add mathematical constant tau to math and cmath. See also
@geindex Python 향상 제안; PEP 628
PEP 628@footnote{https://peps.python.org/pep-0628/}.

@item 
bpo-26823@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26823}: traceback.StackSummary.format now abbreviates large sections of
repeated lines as “[Previous line repeated @{count@} more times]” (this
change then further affects other traceback display operations in the
module). Patch by Emanuel Barry.

@item 
bpo-27664@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27664}: Add to concurrent.futures.thread.ThreadPoolExecutor() the
ability to specify a thread name prefix.

@item 
bpo-27181@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27181}: Add geometric_mean and harmonic_mean to statistics module.

@item 
bpo-27573@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27573}: code.interact now prints an message when exiting.

@item 
bpo-6422@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6422}: Add autorange method to timeit.Timer objects.

@item 
bpo-27773@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27773}: Correct some memory management errors server_hostname in
_ssl.wrap_socket().

@item 
bpo-26750@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26750}: unittest.mock.create_autospec() now works properly for
subclasses of property() and other data descriptors.  Removes the never
publicly used, never documented unittest.mock.DescriptorTypes tuple.

@item 
bpo-26754@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26754}: Undocumented support of general bytes-like objects as path in
compile() and similar functions is now deprecated.

@item 
bpo-26800@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26800}: Undocumented support of general bytes-like objects as paths in
os functions is now deprecated.

@item 
bpo-26981@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26981}: Add _order_ compatibility shim to enum.Enum for Python 2/3 code
bases.

@item 
bpo-27661@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27661}: Added tzinfo keyword argument to datetime.combine.

@item 
In the curses module, raise an error if window.getstr() or window.instr()
is passed a negative value.

@item 
bpo-27783@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27783}: Fix possible usage of uninitialized memory in
operator.methodcaller.

@item 
bpo-27774@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27774}: Fix possible Py_DECREF on unowned object in _sre.

@item 
bpo-27760@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27760}: Fix possible integer overflow in binascii.b2a_qp.

@item 
bpo-27758@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27758}: Fix possible integer overflow in the _csv module for large
record lengths.

@item 
bpo-27568@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27568}: Prevent HTTPoxy attack (
@geindex Common Vulnerabilities and Exposures; CVE 2016-1000110
CVE 2016-1000110@footnote{https://www.cve.org/CVERecord?id=CVE-2016-1000110}). Ignore the
HTTP_PROXY variable when REQUEST_METHOD environment is set, which
indicates that the script is in CGI mode.

@item 
bpo-7063@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7063}: Remove dead code from the “array” module’s slice handling. Patch
by Chuck.

@item 
bpo-27656@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27656}: Do not assume sched.h defines any SCHED_* constants.

@item 
bpo-27130@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27130}: In the “zlib” module, fix handling of large buffers (typically
4 GiB) when compressing and decompressing.  Previously, inputs were
limited to 4 GiB, and compression and decompression operations did not
properly handle results of 4 GiB.

@item 
bpo-24773@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24773}: Implemented 
@geindex Python 향상 제안; PEP 495
PEP 495@footnote{https://peps.python.org/pep-0495/} (Local Time Disambiguation).

@item 
Expose the EPOLLEXCLUSIVE constant (when it is defined) in the select
module.

@item 
bpo-27567@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27567}: Expose the EPOLLRDHUP and POLLRDHUP constants in the select
module.

@item 
bpo-1621@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1621}: Avoid signed int negation overflow in the “audioop” module.

@item 
bpo-27533@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27533}: Release GIL in nt._isdir

@item 
bpo-17711@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17711}: Fixed unpickling by the persistent ID with protocol 0. Original
patch by Alexandre Vassalotti.

@item 
bpo-27522@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27522}: Avoid an unintentional reference cycle in email.feedparser.

@item 
bpo-27512@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27512}: Fix a segfault when os.fspath() called an __fspath__() method
that raised an exception. Patch by Xiang Zhang.
@end itemize

@node IDLE<53>,Tests<75>,Library<186>,Python 3 6 0 alpha 4
@anchor{whatsnew/changelog id946}@anchor{1f17}
@subsubsection IDLE



@itemize -

@item 
bpo-27714@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27714}: text_textview and test_autocomplete now pass when re-run in the
same process.  This occurs when test_idle fails when run with the -w
option but without -jn.  Fix warning from test_config.

@item 
bpo-27621@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27621}: Put query response validation error messages in the query box
itself instead of in a separate messagebox.  Redo tests to match. Add Mac
OSX refinements. Original patch by Mark Roseman.

@item 
bpo-27620@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27620}: Escape key now closes Query box as cancelled.

@item 
bpo-27609@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27609}: IDLE: tab after initial whitespace should tab, not
autocomplete. This fixes problem with writing docstrings at least twice
indented.

@item 
bpo-27609@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27609}: Explicitly return None when there are also non-None returns. In
a few cases, reverse a condition and eliminate a return.

@item 
bpo-25507@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25507}: IDLE no longer runs buggy code because of its tkinter imports.
Users must include the same imports required to run directly in Python.

@item 
bpo-27173@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27173}: Add ‘IDLE Modern Unix’ to the built-in key sets. Make the
default key set depend on the platform. Add tests for the changes to the
config module.

@item 
bpo-27452@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27452}: add line counter and crc to IDLE configHandler test dump.
@end itemize

@node Tests<75>,Windows<74>,IDLE<53>,Python 3 6 0 alpha 4
@anchor{whatsnew/changelog id947}@anchor{1f18}
@subsubsection Tests



@itemize -

@item 
bpo-25805@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25805}: Skip a test in test_pkgutil as needed that doesn’t work when
@code{__name__ == __main__}. Patch by SilentGhost.

@item 
bpo-27472@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27472}: Add test.support.unix_shell as the path to the default shell.

@item 
bpo-27369@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27369}: In test_pyexpat, avoid testing an error message detail that
changed in Expat 2.2.0.

@item 
bpo-27594@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27594}: Prevent assertion error when running test_ast with coverage
enabled: ensure code object has a valid first line number. Patch suggested
by Ivan Levkivskyi.
@end itemize

@node Windows<74>,Build<86>,Tests<75>,Python 3 6 0 alpha 4
@anchor{whatsnew/changelog id948}@anchor{1f19}
@subsubsection Windows



@itemize -

@item 
bpo-27647@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27647}: Update bundled Tcl/Tk to 8.6.6.

@item 
bpo-27610@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27610}: Adds 
@geindex Python 향상 제안; PEP 514
PEP 514@footnote{https://peps.python.org/pep-0514/} metadata to Windows installer

@item 
bpo-27469@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27469}: Adds a shell extension to the launcher so that drag and drop
works correctly.

@item 
bpo-27309@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27309}: Enables proper Windows styles in python[w].exe manifest.
@end itemize

@node Build<86>,,Windows<74>,Python 3 6 0 alpha 4
@anchor{whatsnew/changelog id949}@anchor{1f1a}
@subsubsection Build



@itemize -

@item 
bpo-27713@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27713}: Suppress spurious build warnings when updating importlib’s
bootstrap files. Patch by Xiang Zhang

@item 
bpo-25825@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25825}: Correct the references to Modules/python.exp, which is required
on AIX.  The references were accidentally changed in 3.5.0a1.

@item 
bpo-27453@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27453}: CPP invocation in configure must use CPPFLAGS. Patch by Chi
Hsuan Yen.

@item 
bpo-27641@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27641}: The configure script now inserts comments into the makefile to
prevent the pgen and _freeze_importlib executables from being
cross-compiled.

@item 
bpo-26662@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26662}: Set PYTHON_FOR_GEN in configure as the Python program to be
used for file generation during the build.

@item 
bpo-10910@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10910}: Avoid C++ compilation errors on FreeBSD and OS X. Also update
FreedBSD version checks for the original ctype UTF-8 workaround.
@end itemize

@node Python 3 6 0 alpha 3,Python 3 6 0 alpha 2,Python 3 6 0 alpha 4,Changelog
@anchor{whatsnew/changelog python-3-6-0-alpha-3}@anchor{1f1b}
@subsection Python 3.6.0 alpha 3


`Release date: 2016-07-11'

@menu
* Security: Security<55>. 
* Core and Builtins: Core and Builtins<184>. 
* Library: Library<187>. 
* IDLE: IDLE<54>. 
* C API: C API<73>. 
* Build: Build<87>. 
* Tools/Demos: Tools/Demos<52>. 
* Documentation: Documentation<75>. 
* Tests: Tests<76>. 

@end menu

@node Security<55>,Core and Builtins<184>,,Python 3 6 0 alpha 3
@anchor{whatsnew/changelog id950}@anchor{1f1c}
@subsubsection Security



@itemize -

@item 
bpo-27278@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27278}: Fix os.urandom() implementation using getrandom() on Linux.
Truncate size to INT_MAX and loop until we collected enough random bytes,
instead of casting a directly Py_ssize_t to int.

@item 
bpo-22636@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22636}: Avoid shell injection problems with ctypes.util.find_library().
@end itemize

@node Core and Builtins<184>,Library<187>,Security<55>,Python 3 6 0 alpha 3
@anchor{whatsnew/changelog id951}@anchor{1f1d}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-27473@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27473}: Fixed possible integer overflow in bytes and bytearray
concatenations. Patch by Xiang Zhang.

@item 
bpo-23034@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23034}: The output of a special Python build with defined COUNT_ALLOCS,
SHOW_ALLOC_COUNT or SHOW_TRACK_COUNT macros is now off by  default.  It
can be re-enabled using the “-X showalloccount” option.  It now outputs to
stderr instead of stdout.

@item 
bpo-27443@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27443}: __length_hint__() of bytearray iterators no longer return a
negative integer for a resized bytearray.

@item 
bpo-27007@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27007}: The fromhex() class methods of bytes and bytearray subclasses
now return an instance of corresponding subclass.
@end itemize

@node Library<187>,IDLE<54>,Core and Builtins<184>,Python 3 6 0 alpha 3
@anchor{whatsnew/changelog id952}@anchor{1f1e}
@subsubsection Library



@itemize -

@item 
bpo-26844@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26844}: Fix error message for imp.find_module() to refer to ‘path’
instead of ‘name’. Patch by Lev Maximov.

@item 
bpo-23804@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23804}: Fix SSL zero-length recv() calls to not block and not raise an
error about unclean EOF.

@item 
bpo-27466@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27466}: Change time format returned by http.cookie.time2netscape,
confirming the netscape cookie format and making it consistent with
documentation.

@item 
bpo-21708@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21708}: Deprecated dbm.dumb behavior that differs from common dbm
behavior: creating a database in ‘r’ and ‘w’ modes and modifying a
database in ‘r’ mode.

@item 
bpo-26721@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26721}: Change the socketserver.StreamRequestHandler.wfile attribute to
implement BufferedIOBase. In particular, the write() method no longer does
partial writes.

@item 
bpo-22115@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22115}: Added methods trace_add, trace_remove and trace_info in the
tkinter.Variable class.  They replace old methods trace_variable, trace,
trace_vdelete and trace_vinfo that use obsolete Tcl commands and might not
work in future versions of Tcl.  Fixed old tracing methods:
trace_vdelete() with wrong mode no longer break tracing, trace_vinfo() now
always returns a list of pairs of strings, tracing in the “u” mode now
works.

@item 
bpo-26243@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26243}: Only the level argument to zlib.compress() is keyword argument
now.  The first argument is positional-only.

@item 
bpo-27038@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27038}: Expose the DirEntry type as os.DirEntry. Code patch by Jelle
Zijlstra.

@item 
bpo-27186@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27186}: Update os.fspath()/PyOS_FSPath() to check the return value of
__fspath__() to be either str or bytes.

@item 
bpo-18726@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18726}: All optional parameters of the dump(), dumps(), load() and
loads() functions and JSONEncoder and JSONDecoder class constructors in
the json module are now keyword-only.

@item 
bpo-27319@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27319}: Methods selection_set(), selection_add(), selection_remove()
and selection_toggle() of ttk.TreeView now allow passing multiple items as
multiple arguments instead of passing them as a tuple.  Deprecated
undocumented ability of calling the selection() method with arguments.

@item 
bpo-27079@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27079}: Fixed curses.ascii functions isblank(), iscntrl() and
ispunct().

@item 
bpo-27294@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27294}: Numerical state in the repr for Tkinter event objects is now
represented as a combination of known flags.

@item 
bpo-27177@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27177}: Match objects in the re module now support index-like objects
as group indices.  Based on patches by Jeroen Demeyer and Xiang Zhang.

@item 
bpo-26754@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26754}: Some functions (compile() etc) accepted a filename argument
encoded as an iterable of integers. Now only strings and byte-like objects
are accepted.

@item 
bpo-26536@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26536}: socket.ioctl now supports SIO_LOOPBACK_FAST_PATH. Patch by
Daniel Stokes.

@item 
bpo-27048@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27048}: Prevents distutils failing on Windows when environment
variables contain non-ASCII characters

@item 
bpo-27330@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27330}: Fixed possible leaks in the ctypes module.

@item 
bpo-27238@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27238}: Got rid of bare excepts in the turtle module.  Original patch
by Jelle Zijlstra.

@item 
bpo-27122@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27122}: When an exception is raised within the context being managed by
a contextlib.ExitStack() and one of the exit stack generators catches and
raises it in a chain, do not re-raise the original exception when exiting,
let the new chained one through.  This avoids the 
@geindex Python 향상 제안; PEP 479
PEP 479@footnote{https://peps.python.org/pep-0479/} bug described
in issue25782.

@item 
bpo-16864@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16864}: sqlite3.Cursor.lastrowid now supports REPLACE statement.
Initial patch by Alex LordThorsen.

@item 
bpo-26386@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26386}: Fixed ttk.TreeView selection operations with item id’s
containing spaces.

@item 
bpo-8637@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8637}: Honor a pager set by the env var MANPAGER (in preference to one
set by the env var PAGER).

@item 
bpo-16182@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16182}: Fix various functions in the “readline” module to use the
locale encoding, and fix get_begidx() and get_endidx() to return code
point indexes.

@item 
bpo-27392@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27392}: Add loop.connect_accepted_socket(). Patch by Jim Fulton.
@end itemize

@node IDLE<54>,C API<73>,Library<187>,Python 3 6 0 alpha 3
@anchor{whatsnew/changelog id953}@anchor{1f1f}
@subsubsection IDLE



@itemize -

@item 
bpo-27477@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27477}: IDLE search dialogs now use ttk widgets.

@item 
bpo-27173@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27173}: Add ‘IDLE Modern Unix’ to the built-in key sets. Make the
default key set depend on the platform. Add tests for the changes to the
config module.

@item 
bpo-27452@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27452}: make command line “idle-test> python test_help.py” work.
__file__ is relative when python is started in the file’s directory.

@item 
bpo-27452@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27452}: add line counter and crc to IDLE configHandler test dump.

@item 
bpo-27380@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27380}: IDLE: add query.py with base Query dialog and ttk widgets.
Module had subclasses SectionName, ModuleName, and HelpSource, which are
used to get information from users by configdialog and file =>Load Module.
Each subclass has itw own validity checks.  Using ModuleName allows users
to edit bad module names instead of starting over. Add tests and delete
the two files combined into the new one.

@item 
bpo-27372@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27372}: Test_idle no longer changes the locale.

@item 
bpo-27365@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27365}: Allow non-ascii chars in IDLE NEWS.txt, for contributor names.

@item 
bpo-27245@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27245}: IDLE: Cleanly delete custom themes and key bindings.
Previously, when IDLE was started from a console or by import, a cascade
of warnings was emitted. Patch by Serhiy Storchaka.

@item 
bpo-24137@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24137}: Run IDLE, test_idle, and htest with tkinter default root
disabled.  Fix code and tests that fail with this restriction.  Fix htests
to not create a second and redundant root and mainloop.

@item 
bpo-27310@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27310}: Fix IDLE.app failure to launch on OS X due to vestigial import.
@end itemize

@node C API<73>,Build<87>,IDLE<54>,Python 3 6 0 alpha 3
@anchor{whatsnew/changelog id954}@anchor{1f20}
@subsubsection C API



@itemize -

@item 
bpo-26754@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26754}: PyUnicode_FSDecoder() accepted a filename argument encoded as
an iterable of integers. Now only strings and byte-like objects are
accepted.
@end itemize

@node Build<87>,Tools/Demos<52>,C API<73>,Python 3 6 0 alpha 3
@anchor{whatsnew/changelog id955}@anchor{1f21}
@subsubsection Build



@itemize -

@item 
bpo-28066@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28066}: Fix the logic that searches build directories for generated
include files when building outside the source tree.

@item 
bpo-27442@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27442}: Expose the Android API level that python was built against, in
sysconfig.get_config_vars() as ‘ANDROID_API_LEVEL’.

@item 
bpo-27434@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27434}: The interpreter that runs the cross-build, found in PATH, must
now be of the same feature version (e.g. 3.6) as the source being built.

@item 
bpo-26930@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26930}: Update Windows builds to use OpenSSL 1.0.2h.

@item 
bpo-23968@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23968}: Rename the platform directory from plat-$(MACHDEP) to
plat-$(PLATFORM_TRIPLET). Rename the config directory (LIBPL) from
config-$(LDVERSION) to config-$(LDVERSION)-$(PLATFORM_TRIPLET). Install
the platform specific _sysconfigdata module into the platform directory
and rename it to include the ABIFLAGS.

@item 
Don’t use largefile support for GNU/Hurd.
@end itemize

@node Tools/Demos<52>,Documentation<75>,Build<87>,Python 3 6 0 alpha 3
@anchor{whatsnew/changelog id956}@anchor{1f22}
@subsubsection Tools/Demos



@itemize -

@item 
bpo-27332@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27332}: Fixed the type of the first argument of module-level functions
generated by Argument Clinic.  Patch by Petr Viktorin.

@item 
bpo-27418@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27418}: Fixed Tools/importbench/importbench.py.
@end itemize

@node Documentation<75>,Tests<76>,Tools/Demos<52>,Python 3 6 0 alpha 3
@anchor{whatsnew/changelog id957}@anchor{1f23}
@subsubsection Documentation



@itemize -

@item 
bpo-19489@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19489}: Moved the search box from the sidebar to the header and footer
of each page. Patch by Ammar Askar.

@item 
bpo-27285@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27285}: Update documentation to reflect the deprecation of @code{pyvenv}
and normalize on the term “virtual environment”. Patch by Steve Piercy.
@end itemize

@node Tests<76>,,Documentation<75>,Python 3 6 0 alpha 3
@anchor{whatsnew/changelog id958}@anchor{1f24}
@subsubsection Tests



@itemize -

@item 
bpo-27027@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27027}: Added test.support.is_android that is True when this is an
Android build.
@end itemize

@node Python 3 6 0 alpha 2,Python 3 6 0 alpha 1,Python 3 6 0 alpha 3,Changelog
@anchor{whatsnew/changelog python-3-6-0-alpha-2}@anchor{1f25}
@subsection Python 3.6.0 alpha 2


`Release date: 2016-06-13'

@menu
* Security: Security<56>. 
* Core and Builtins: Core and Builtins<185>. 
* Library: Library<188>. 
* IDLE: IDLE<55>. 
* Documentation: Documentation<76>. 
* Tests: Tests<77>. 
* Windows: Windows<75>. 
* Build: Build<88>. 
* C API: C API<74>. 
* Tools/Demos: Tools/Demos<53>. 

@end menu

@node Security<56>,Core and Builtins<185>,,Python 3 6 0 alpha 2
@anchor{whatsnew/changelog id959}@anchor{1f26}
@subsubsection Security



@itemize -

@item 
bpo-26556@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26556}: Update expat to 2.1.1, fixes 
@geindex Common Vulnerabilities and Exposures; CVE 2015-1283
CVE 2015-1283@footnote{https://www.cve.org/CVERecord?id=CVE-2015-1283}.

@item 
Fix TLS stripping vulnerability in smtplib, 
@geindex Common Vulnerabilities and Exposures; CVE 2016-0772
CVE 2016-0772@footnote{https://www.cve.org/CVERecord?id=CVE-2016-0772}. Reported by
Team Oststrom.

@item 
bpo-26839@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26839}: On Linux, @ref{745,,os.urandom()} now calls @code{getrandom()} with
@code{GRND_NONBLOCK} to fall back on reading @code{/dev/urandom} if the urandom
entropy pool is not initialized yet. Patch written by Colm Buckley.
@end itemize

@node Core and Builtins<185>,Library<188>,Security<56>,Python 3 6 0 alpha 2
@anchor{whatsnew/changelog id960}@anchor{1f27}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-27095@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27095}: Simplified MAKE_FUNCTION and removed MAKE_CLOSURE opcodes.
Patch by Demur Rumed.

@item 
bpo-27190@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27190}: Raise NotSupportedError if sqlite3 is older than 3.3.1. Patch
by Dave Sawyer.

@item 
bpo-27286@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27286}: Fixed compiling BUILD_MAP_UNPACK_WITH_CALL opcode.  Calling
function with generalized unpacking (PEP 448) and conflicting keyword
names could cause undefined behavior.

@item 
bpo-27140@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27140}: Added BUILD_CONST_KEY_MAP opcode.

@item 
bpo-27186@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27186}: Add support for os.PathLike objects to open() (part of
@geindex Python 향상 제안; PEP 519
PEP 519@footnote{https://peps.python.org/pep-0519/}).

@item 
bpo-27066@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27066}: Fixed SystemError if a custom opener (for open()) returns a
negative number without setting an exception.

@item 
bpo-26983@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26983}: float() now always return an instance of exact float. The
deprecation warning is emitted if __float__ returns an instance of a
strict subclass of float.  In a future versions of Python this can be an
error.

@item 
bpo-27097@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27097}: Python interpreter is now about 7% faster due to optimized
instruction decoding.  Based on patch by Demur Rumed.

@item 
bpo-26647@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26647}: Python interpreter now uses 16-bit wordcode instead of
bytecode. Patch by Demur Rumed.

@item 
bpo-23275@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23275}: Allow assigning to an empty target list in round brackets: () =
iterable.

@item 
bpo-27243@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27243}: Update the __aiter__ protocol: instead of returning an
awaitable that resolves to an asynchronous iterator, the asynchronous
iterator should be returned directly.  Doing the former will trigger a
PendingDeprecationWarning.
@end itemize

@node Library<188>,IDLE<55>,Core and Builtins<185>,Python 3 6 0 alpha 2
@anchor{whatsnew/changelog id961}@anchor{1f28}
@subsubsection Library



@itemize -

@item 
Comment out socket (SO_REUSEPORT) and posix (O_SHLOCK, O_EXLOCK) constants
exposed on the API which are not implemented on GNU/Hurd. They would not
work at runtime anyway.

@item 
bpo-27025@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27025}: Generated names for Tkinter widgets are now more meaningful and
recognizable.

@item 
bpo-25455@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25455}: Fixed crashes in repr of recursive ElementTree.Element and
functools.partial objects.

@item 
bpo-27294@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27294}: Improved repr for Tkinter event objects.

@item 
bpo-20508@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20508}: Improve exception message of IPv@{4,6@}Network.__getitem__. Patch
by Gareth Rees.

@item 
bpo-21386@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21386}: Implement missing IPv4Address.is_global property.  It was
documented since 07a5610bae9d.  Initial patch by Roger Luethi.

@item 
bpo-27029@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27029}: Removed deprecated support of universal newlines mode from
ZipFile.open().

@item 
bpo-27030@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27030}: Unknown escapes consisting of @code{'\'} and an ASCII letter in
regular expressions now are errors.  The re.LOCALE flag now can be used
only with bytes patterns.

@item 
bpo-27186@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27186}: Add os.PathLike support to DirEntry (part of 
@geindex Python 향상 제안; PEP 519
PEP 519@footnote{https://peps.python.org/pep-0519/}).
Initial patch by Jelle Zijlstra.

@item 
bpo-20900@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20900}: distutils register command now decodes HTTP responses
correctly.  Initial patch by ingrid.

@item 
bpo-27186@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27186}: Add os.PathLike support to pathlib, removing its provisional
status (part of PEP 519). Initial patch by Dusty Phillips.

@item 
bpo-27186@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27186}: Add support for os.PathLike objects to os.fsencode() and
os.fsdecode() (part of 
@geindex Python 향상 제안; PEP 519
PEP 519@footnote{https://peps.python.org/pep-0519/}).

@item 
bpo-27186@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27186}: Introduce os.PathLike and os.fspath() (part of 
@geindex Python 향상 제안; PEP 519
PEP 519@footnote{https://peps.python.org/pep-0519/}).

@item 
A new version of typing.py provides several new classes and features:
@@overload outside stubs, Reversible, DefaultDict, Text, ContextManager,
Type[], NewType(), TYPE_CHECKING, and numerous bug fixes (note that some
of the new features are not yet implemented in mypy or other static
analyzers). Also classes for 
@geindex Python 향상 제안; PEP 492
PEP 492@footnote{https://peps.python.org/pep-0492/} (Awaitable, AsyncIterable,
AsyncIterator) have been added (in fact they made it into 3.5.1 but were
never mentioned).

@item 
bpo-25738@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25738}: Stop http.server.BaseHTTPRequestHandler.send_error() from
sending a message body for 205 Reset Content.  Also, don’t send Content
header fields in responses that don’t have a body.  Patch by Susumu
Koshiba.

@item 
bpo-21313@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21313}: Fix the “platform” module to tolerate when sys.version contains
truncated build information.

@item 
bpo-23883@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23883}: Added missing APIs to __all__ to match the documented APIs for
the following modules: cgi, mailbox, mimetypes, plistlib and smtpd.
Patches by Jacek Kołodziej.

@item 
bpo-27164@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27164}: In the zlib module, allow decompressing raw Deflate streams
with a predefined zdict.  Based on patch by Xiang Zhang.

@item 
bpo-24291@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24291}: Fix wsgiref.simple_server.WSGIRequestHandler to completely
write data to the client.  Previously it could do partial writes and
truncate data.  Also, wsgiref.handler.ServerHandler can now handle stdout
doing partial writes, but this is deprecated.

@item 
bpo-21272@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21272}: Use _sysconfigdata.py to initialize distutils.sysconfig.

@item 
bpo-19611@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19611}: @ref{82,,inspect} now reports the implicit @code{.0} parameters
generated by the compiler for comprehension and generator expression
scopes as if they were positional-only parameters called @code{implicit0}.
Patch by Jelle Zijlstra.

@item 
bpo-26809@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26809}: Add @code{__all__} to @ref{d8,,string}.  Patch by Emanuel Barry.

@item 
bpo-26373@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26373}: subprocess.Popen.communicate now correctly ignores
BrokenPipeError when the child process dies before .communicate() is
called in more/all circumstances.

@item 
signal, socket, and ssl module IntEnum constant name lookups now return a
consistent name for values having multiple names.  Ex: signal.Signals(6)
now refers to itself as signal.SIGALRM rather than flipping between that
and signal.SIGIOT based on the interpreter’s hash randomization seed.

@item 
bpo-27167@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27167}: Clarify the subprocess.CalledProcessError error message text
when the child process died due to a signal.

@item 
bpo-25931@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25931}: Don’t define socketserver.Forking* names on platforms such as
Windows that do not support os.fork().

@item 
bpo-21776@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21776}: distutils.upload now correctly handles HTTPError. Initial patch
by Claudiu Popa.

@item 
bpo-26526@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26526}: Replace custom parse tree validation in the parser module with
a simple DFA validator.

@item 
bpo-27114@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27114}: Fix SSLContext._load_windows_store_certs fails with
PermissionError

@item 
bpo-18383@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18383}: Avoid creating duplicate filters when using filterwarnings and
simplefilter. Based on patch by Alex Shkop.

@item 
bpo-23026@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23026}: winreg.QueryValueEx() now return an integer for REG_QWORD type.

@item 
bpo-26741@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26741}: subprocess.Popen destructor now emits a ResourceWarning warning
if the child process is still running.

@item 
bpo-27056@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27056}: Optimize pickle.load() and pickle.loads(), up to 10% faster to
deserialize a lot of small objects.

@item 
bpo-21271@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21271}: New keyword only parameters in reset_mock call.
@end itemize

@node IDLE<55>,Documentation<76>,Library<188>,Python 3 6 0 alpha 2
@anchor{whatsnew/changelog id962}@anchor{1f29}
@subsubsection IDLE



@itemize -

@item 
bpo-5124@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5124}: Paste with text selected now replaces the selection on X11. This
matches how paste works on Windows, Mac, most modern Linux apps, and ttk
widgets. Original patch by Serhiy Storchaka.

@item 
bpo-24750@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24750}: Switch all scrollbars in IDLE to ttk versions. Where needed,
minimal tests are added to cover changes.

@item 
bpo-24759@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24759}: IDLE requires tk 8.5 and availability ttk widgets. Delete now
unneeded tk version tests and code for older versions. Add test for IDLE
syntax colorizer.

@item 
bpo-27239@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27239}: idlelib.macosx.isXyzTk functions initialize as needed.

@item 
bpo-27262@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27262}: move Aqua unbinding code, which enable context menus, to
macosx.

@item 
bpo-24759@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24759}: Make clear in idlelib.idle_test.__init__ that the directory is
a private implementation of test.test_idle and tool for maintainers.

@item 
bpo-27196@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27196}: Stop ‘ThemeChanged’ warnings when running IDLE tests. These
persisted after other warnings were suppressed in #20567. Apply Serhiy
Storchaka’s update_idletasks solution to four test files. Record this
additional advice in idle_test/README.txt

@item 
bpo-20567@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20567}: Revise idle_test/README.txt with advice about avoiding tk
warning messages from tests.  Apply advice to several IDLE tests.

@item 
bpo-24225@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24225}: Update idlelib/README.txt with new file names and event
handlers.

@item 
bpo-27156@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27156}: Remove obsolete code not used by IDLE.

@item 
bpo-27117@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27117}: Make colorizer htest and turtledemo work with dark themes. Move
code for configuring text widget colors to a new function.

@item 
bpo-24225@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24225}: Rename many @code{idlelib/*.py} and @code{idle_test/test_*.py} files.
Edit files to replace old names with new names when the old name referred
to the module rather than the class it contained. See the issue and IDLE
section in What’s New in 3.6 for more.

@item 
bpo-26673@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26673}: When tk reports font size as 0, change to size 10. Such fonts
on Linux prevented the configuration dialog from opening.

@item 
bpo-21939@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21939}: Add test for IDLE’s percolator. Original patch by Saimadhav
Heblikar.

@item 
bpo-21676@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21676}: Add test for IDLE’s replace dialog. Original patch by Saimadhav
Heblikar.

@item 
bpo-18410@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18410}: Add test for IDLE’s search dialog. Original patch by Westley
Martínez.

@item 
bpo-21703@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21703}: Add test for undo delegator.  Patch mostly by Saimadhav
Heblikar .

@item 
bpo-27044@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27044}: Add ConfigDialog.remove_var_callbacks to stop memory leaks.

@item 
bpo-23977@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23977}: Add more asserts to test_delegator.
@end itemize

@node Documentation<76>,Tests<77>,IDLE<55>,Python 3 6 0 alpha 2
@anchor{whatsnew/changelog id963}@anchor{1f2a}
@subsubsection Documentation



@itemize -

@item 
bpo-16484@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16484}: Change the default PYTHONDOCS URL to “https:”, and fix the
resulting links to use lowercase.  Patch by Sean Rodman, test by Kaushik
Nadikuditi.

@item 
bpo-24136@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24136}: Document the new 
@geindex Python 향상 제안; PEP 448
PEP 448@footnote{https://peps.python.org/pep-0448/} unpacking syntax of 3.5.

@item 
bpo-22558@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22558}: Add remaining doc links to source code for Python-coded
modules. Patch by Yoni Lavi.
@end itemize

@node Tests<77>,Windows<75>,Documentation<76>,Python 3 6 0 alpha 2
@anchor{whatsnew/changelog id964}@anchor{1f2b}
@subsubsection Tests



@itemize -

@item 
bpo-25285@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25285}: regrtest now uses subprocesses when the -j1 command line option
is used: each test file runs in a fresh child process. Before, the -j1
option was ignored.

@item 
bpo-25285@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25285}: Tools/buildbot/test.bat script now uses -j1 by default to run
each test file in fresh child process.
@end itemize

@node Windows<75>,Build<88>,Tests<77>,Python 3 6 0 alpha 2
@anchor{whatsnew/changelog id965}@anchor{1f2c}
@subsubsection Windows



@itemize -

@item 
bpo-27064@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27064}: The py.exe launcher now defaults to Python 3. The Windows
launcher @code{py.exe} no longer prefers an installed Python 2 version over
Python 3 by default when used interactively.

@item 
bpo-17500@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17500}: Remove unused and outdated icons. (See also:
@indicateurl{https://github.com/python/pythondotorg/issues/945})
@end itemize

@node Build<88>,C API<74>,Windows<75>,Python 3 6 0 alpha 2
@anchor{whatsnew/changelog id966}@anchor{1f2d}
@subsubsection Build



@itemize -

@item 
bpo-27229@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27229}: Fix the cross-compiling pgen rule for in-tree builds.  Patch by
Xavier de Gaye.

@item 
bpo-26930@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26930}: Update OS X 10.5+ 32-bit-only installer to build and link with
OpenSSL 1.0.2h.
@end itemize

@node C API<74>,Tools/Demos<53>,Build<88>,Python 3 6 0 alpha 2
@anchor{whatsnew/changelog id967}@anchor{1f2e}
@subsubsection C API



@itemize -

@item 
bpo-27186@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27186}: Add the PyOS_FSPath() function (part of 
@geindex Python 향상 제안; PEP 519
PEP 519@footnote{https://peps.python.org/pep-0519/}).

@item 
bpo-26282@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26282}: PyArg_ParseTupleAndKeywords() now supports positional-only
parameters.
@end itemize

@node Tools/Demos<53>,,C API<74>,Python 3 6 0 alpha 2
@anchor{whatsnew/changelog id968}@anchor{1f2f}
@subsubsection Tools/Demos



@itemize -

@item 
bpo-26282@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26282}: Argument Clinic now supports positional-only and keyword
parameters in the same function.
@end itemize

@node Python 3 6 0 alpha 1,Python 3 5 5 final,Python 3 6 0 alpha 2,Changelog
@anchor{whatsnew/changelog python-3-6-0-alpha-1}@anchor{1f30}
@subsection Python 3.6.0 alpha 1


`Release date: 2016-05-16'

@menu
* Security: Security<57>. 
* Core and Builtins: Core and Builtins<186>. 
* Library: Library<189>. 
* IDLE: IDLE<56>. 
* Documentation: Documentation<77>. 
* Tests: Tests<78>. 
* Build: Build<89>. 
* Windows: Windows<76>. 
* Tools/Demos: Tools/Demos<54>. 
* C API: C API<75>. 

@end menu

@node Security<57>,Core and Builtins<186>,,Python 3 6 0 alpha 1
@anchor{whatsnew/changelog id969}@anchor{1f31}
@subsubsection Security



@itemize -

@item 
bpo-26657@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26657}: Fix directory traversal vulnerability with http.server on
Windows.  This fixes a regression that was introduced in 3.3.4rc1 and
3.4.0rc1.  Based on patch by Philipp Hagemeister.

@item 
bpo-26313@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26313}: ssl.py _load_windows_store_certs fails if windows cert store is
empty. Patch by Baji.

@item 
bpo-25939@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25939}: On Windows open the cert store readonly in
ssl.enum_certificates.
@end itemize

@node Core and Builtins<186>,Library<189>,Security<57>,Python 3 6 0 alpha 1
@anchor{whatsnew/changelog id970}@anchor{1f32}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-20041@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20041}: Fixed TypeError when frame.f_trace is set to None. Patch by
Xavier de Gaye.

@item 
bpo-26168@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26168}: Fixed possible refleaks in failing Py_BuildValue() with the “N”
format unit.

@item 
bpo-26991@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26991}: Fix possible refleak when creating a function with annotations.

@item 
bpo-27039@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27039}: Fixed bytearray.remove() for values greater than 127.  Based on
patch by Joe Jevnik.

@item 
bpo-23640@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23640}: int.from_bytes() no longer bypasses constructors for
subclasses.

@item 
bpo-27005@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27005}: Optimized the float.fromhex() class method for exact float. It
is now 2 times faster.

@item 
bpo-18531@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18531}: Single var-keyword argument of dict subtype was passed
unscathed to the C-defined function.  Now it is converted to exact dict.

@item 
bpo-26811@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26811}: gc.get_objects() no longer contains a broken tuple with NULL
pointer.

@item 
bpo-20120@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20120}: Use RawConfigParser for .pypirc parsing, removing support for
interpolation unintentionally added with move to Python 3. Behavior no
longer does any interpolation in .pypirc files, matching behavior in
Python 2.7 and Setuptools 19.0.

@item 
bpo-26249@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26249}: Memory functions of the @ref{e5e,,PyMem_Malloc()} domain
(@ref{e62,,PYMEM_DOMAIN_MEM}) now use the @ref{f0a,,pymalloc allocator} rather than system @code{malloc()}. Applications calling
@code{PyMem_Malloc()} without holding the GIL can now crash: use
@code{PYTHONMALLOC=debug} environment variable to validate the usage of
memory allocators in your application.

@item 
bpo-26802@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26802}: Optimize function calls only using unpacking like
@code{func(*tuple)} (no other positional argument, no keyword): avoid copying
the tuple. Patch written by Joe Jevnik.

@item 
bpo-26659@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26659}: Make the builtin slice type support cycle collection.

@item 
bpo-26718@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26718}: super.__init__ no longer leaks memory if called multiple times.
NOTE: A direct call of super.__init__ is not endorsed!

@item 
bpo-27138@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27138}: Fix the doc comment for FileFinder.find_spec().

@item 
bpo-27147@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27147}: Mention 
@geindex Python 향상 제안; PEP 420
PEP 420@footnote{https://peps.python.org/pep-0420/} in the importlib docs.

@item 
bpo-25339@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25339}: PYTHONIOENCODING now has priority over locale in setting the
error handler for stdin and stdout.

@item 
bpo-26494@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26494}: Fixed crash on iterating exhausting iterators. Affected classes
are generic sequence iterators, iterators of str, bytes, bytearray, list,
tuple, set, frozenset, dict, OrderedDict, corresponding views and
os.scandir() iterator.

@item 
bpo-26574@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26574}: Optimize @code{bytes.replace(b'@w{'}, b'.')} and
@code{bytearray.replace(b'@w{'}, b'.')}. Patch written by Josh Snider.

@item 
bpo-26581@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26581}: If coding cookie is specified multiple times on a line in
Python source code file, only the first one is taken to account.

@item 
bpo-19711@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19711}: Add tests for reloading namespace packages.

@item 
bpo-21099@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21099}: Switch applicable importlib tests to use 
@geindex Python 향상 제안; PEP 451
PEP 451@footnote{https://peps.python.org/pep-0451/} API.

@item 
bpo-26563@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26563}: Debug hooks on Python memory allocators now raise a fatal error
if functions of the @ref{e5e,,PyMem_Malloc()} family are called without
holding the GIL.

@item 
bpo-26564@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26564}: On error, the debug hooks on Python memory allocators now use
the @ref{105,,tracemalloc} module to get the traceback where a memory block
was allocated.

@item 
bpo-26558@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26558}: The debug hooks on Python memory allocator
@ref{e61,,PyObject_Malloc()} now detect when functions are called without
holding the GIL.

@item 
bpo-26516@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26516}: Add 
@geindex PYTHONMALLOC
@geindex 환경 변수; PYTHONMALLOC
@ref{e5d,,PYTHONMALLOC} environment variable to set the
Python memory allocators and/or install debug hooks.

@item 
bpo-26516@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26516}: The @ref{e63,,PyMem_SetupDebugHooks()} function can now also be
used on Python compiled in release mode.

@item 
bpo-26516@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26516}: The 
@geindex PYTHONMALLOCSTATS
@geindex 환경 변수; PYTHONMALLOCSTATS
@ref{1f33,,PYTHONMALLOCSTATS} environment variable can now
also be used on Python compiled in release mode. It now has no effect if
set to an empty string.

@item 
bpo-26516@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26516}: In debug mode, debug hooks are now also installed on Python
memory allocators when Python is configured without pymalloc.

@item 
bpo-26464@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26464}: Fix str.translate() when string is ASCII and first replacements
removes character, but next replacement uses a non-ASCII character or a
string longer than 1 character. Regression introduced in Python 3.5.0.

@item 
bpo-22836@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22836}: Ensure exception reports from PyErr_Display() and
PyErr_WriteUnraisable() are sensible even when formatting them produces
secondary errors.  This affects the reports produced by
sys.__excepthook__() and when __del__() raises an exception.

@item 
bpo-26302@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26302}: Correct behavior to reject comma as a legal character for
cookie names.

@item 
bpo-26136@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26136}: Upgrade the warning when a generator raises StopIteration from
PendingDeprecationWarning to DeprecationWarning.  Patch by Anish Shah.

@item 
bpo-26204@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26204}: The compiler now ignores all constant statements: bytes, str,
int, float, complex, name constants (None, False, True), Ellipsis and
ast.Constant; not only str and int. For example, @code{1.0} is now ignored in
@code{def f(): 1.0}.

@item 
bpo-4806@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4806}: Avoid masking the original TypeError exception when using star
(@code{*}) unpacking in function calls.  Based on patch by Hagen Fürstenau
and Daniel Urban.

@item 
bpo-26146@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26146}: Add a new kind of AST node: @code{ast.Constant}. It can be used by
external AST optimizers, but the compiler does not emit directly such
node.

@item 
bpo-23601@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23601}: Sped-up allocation of dict key objects by using Python’s small
object allocator.  (Contributed by Julian Taylor.)

@item 
bpo-18018@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18018}: Import raises ImportError instead of SystemError if a relative
import is attempted without a known parent package.

@item 
bpo-25843@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25843}: When compiling code, don’t merge constants if they are equal
but have a different types. For example, @code{f1, f2 = lambda: 1, lambda:
1.0} is now correctly compiled to two different functions: @code{f1()}
returns @code{1} (@code{int}) and @code{f2()} returns @code{1.0} (@code{float}), even if
@code{1} and @code{1.0} are equal.

@item 
bpo-26107@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26107}: The format of the @code{co_lnotab} attribute of code objects
changes to support negative line number delta.

@item 
bpo-26154@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26154}: Add a new private _PyThreadState_UncheckedGet() function to get
the current Python thread state, but don’t issue a fatal error if it is
NULL. This new function must be used instead of accessing directly the
_PyThreadState_Current variable.  The variable is no more exposed since
Python 3.5.1 to hide the exact implementation of atomic C types, to avoid
compiler issues.

@item 
bpo-25791@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25791}: If __package__ != __spec__.parent or if neither __package__ or
__spec__ are defined then ImportWarning is raised.

@item 
bpo-22995@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22995}: [UPDATE] Comment out the one of the pickleability tests in
_PyObject_GetState() due to regressions observed in Cython-based projects.

@item 
bpo-25961@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25961}: Disallowed null characters in the type name.

@item 
bpo-25973@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25973}: Fix segfault when an invalid nonlocal statement binds a name
starting with two underscores.

@item 
bpo-22995@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22995}: Instances of extension types with a state that aren’t
subclasses of list or dict and haven’t implemented any pickle-related
methods (__reduce__, __reduce_ex__, __getnewargs__, __getnewargs_ex__, or
__getstate__), can no longer be pickled.  Including memoryview.

@item 
bpo-20440@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20440}: Massive replacing unsafe attribute setting code with special
macro Py_SETREF.

@item 
bpo-25766@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25766}: Special method __bytes__() now works in str subclasses.

@item 
bpo-25421@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25421}: __sizeof__ methods of builtin types now use dynamic basic size.
This allows sys.getsize() to work correctly with their subclasses with
__slots__ defined.

@item 
bpo-25709@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25709}: Fixed problem with in-place string concatenation and utf-8
cache.

@item 
bpo-5319@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5319}: New Py_FinalizeEx() API allowing Python to set an exit status of
120 on failure to flush buffered streams.

@item 
bpo-25485@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25485}: telnetlib.Telnet is now a context manager.

@item 
bpo-24097@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24097}: Fixed crash in object.__reduce__() if slot name is freed inside
__getattr__.

@item 
bpo-24731@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24731}: Fixed crash on converting objects with special methods
__bytes__, __trunc__, and __float__ returning instances of subclasses of
bytes, int, and float to subclasses of bytes, int, and float
correspondingly.

@item 
bpo-25630@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25630}: Fix a possible segfault during argument parsing in functions
that accept filesystem paths.

@item 
bpo-23564@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23564}: Fixed a partially broken sanity check in the _posixsubprocess
internals regarding how fds_to_pass were passed to the child.  The bug had
no actual impact as subprocess.py already avoided it.

@item 
bpo-25388@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25388}: Fixed tokenizer crash when processing undecodable source code
with a null byte.

@item 
bpo-25462@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25462}: The hash of the key now is calculated only once in most
operations in C implementation of OrderedDict.

@item 
bpo-22995@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22995}: Default implementation of __reduce__ and __reduce_ex__ now
rejects builtin types with not defined __new__.

@item 
bpo-24802@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24802}: Avoid buffer overreads when int(), float(), compile(), exec()
and eval() are passed bytes-like objects.  These objects are not
necessarily terminated by a null byte, but the functions assumed they
were.

@item 
bpo-25555@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25555}: Fix parser and AST: fill lineno and col_offset of “arg” node
when compiling AST from Python objects.

@item 
bpo-24726@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24726}: Fixed a crash and leaking NULL in repr() of OrderedDict that
was mutated by direct calls of dict methods.

@item 
bpo-25449@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25449}: Iterating OrderedDict with keys with unstable hash now raises
KeyError in C implementations as well as in Python implementation.

@item 
bpo-25395@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25395}: Fixed crash when highly nested OrderedDict structures were
garbage collected.

@item 
bpo-25401@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25401}: Optimize bytes.fromhex() and bytearray.fromhex(): they are now
between 2x and 3.5x faster.

@item 
bpo-25399@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25399}: Optimize bytearray % args using the new private _PyBytesWriter
API. Formatting is now between 2.5 and 5 times faster.

@item 
bpo-25274@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25274}: sys.setrecursionlimit() now raises a RecursionError if the new
recursion limit is too low depending at the current recursion depth.
Modify also the “lower-water mark” formula to make it monotonic. This mark
is used to decide when the overflowed flag of the thread state is reset.

@item 
bpo-24402@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24402}: Fix input() to prompt to the redirected stdout when
sys.stdout.fileno() fails.

@item 
bpo-25349@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25349}: Optimize bytes % args using the new private _PyBytesWriter API.
Formatting is now up to 2 times faster.

@item 
bpo-24806@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24806}: Prevent builtin types that are not allowed to be subclassed
from being subclassed through multiple inheritance.

@item 
bpo-25301@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25301}: The UTF-8 decoder is now up to 15 times as fast for error
handlers: @code{ignore}, @code{replace} and @code{surrogateescape}.

@item 
bpo-24848@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24848}: Fixed a number of bugs in UTF-7 decoding of misformed data.

@item 
bpo-25267@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25267}: The UTF-8 encoder is now up to 75 times as fast for error
handlers: @code{ignore}, @code{replace}, @code{surrogateescape}, @code{surrogatepass}.
Patch co-written with Serhiy Storchaka.

@item 
bpo-25280@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25280}: Import trace messages emitted in verbose (-v) mode are no
longer formatted twice.

@item 
bpo-25227@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25227}: Optimize ASCII and latin1 encoders with the @code{surrogateescape}
error handler: the encoders are now up to 3 times as fast. Initial patch
written by Serhiy Storchaka.

@item 
bpo-25003@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25003}: On Solaris 11.3 or newer, os.urandom() now uses the getrandom()
function instead of the getentropy() function. The getentropy() function
is blocking to generate very good quality entropy, os.urandom() doesn’t
need such high-quality entropy.

@item 
bpo-9232@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9232}: Modify Python’s grammar to allow trailing commas in the argument
list of a function declaration.  For example, “def f(*, a = 3,): pass” is
now legal. Patch from Mark Dickinson.

@item 
bpo-24965@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24965}: Implement 
@geindex Python 향상 제안; PEP 498
PEP 498@footnote{https://peps.python.org/pep-0498/} “Literal String Interpolation”. This
allows you to embed expressions inside f-strings, which are converted to
normal strings at run time. Given x=3, then f’value=@{x@}’ == ‘value=3’.
Patch by Eric V. Smith.

@item 
bpo-26478@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26478}: Fix semantic bugs when using binary operators with dictionary
views and tuples.

@item 
bpo-26171@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26171}: Fix possible integer overflow and heap corruption in
zipimporter.get_data().

@item 
bpo-25660@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25660}: Fix TAB key behaviour in REPL with readline.

@item 
bpo-26288@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26288}: Optimize PyLong_AsDouble.

@item 
bpo-26289@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26289}: Optimize floor and modulo division for single-digit longs.
Microbenchmarks show 2-2.5x improvement.  Built-in ‘divmod’ function is
now also ~10% faster. (See also: bpo-26315@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26315})

@item 
bpo-25887@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25887}: Raise a RuntimeError when a coroutine object is awaited more
than once.
@end itemize

@node Library<189>,IDLE<56>,Core and Builtins<186>,Python 3 6 0 alpha 1
@anchor{whatsnew/changelog id971}@anchor{1f34}
@subsubsection Library



@itemize -

@item 
bpo-27057@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27057}: Fix os.set_inheritable() on Android, ioctl() is blocked by
SELinux and fails with EACCESS. The function now falls back to fcntl().
Patch written by Michał Bednarski.

@item 
bpo-27014@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27014}: Fix infinite recursion using typing.py.  Thanks to Kalle Tuure!

@item 
bpo-27031@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27031}: Removed dummy methods in Tkinter widget classes: tk_menuBar()
and tk_bindForTraversal().

@item 
bpo-14132@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14132}: Fix urllib.request redirect handling when the target only has a
query string.  Original fix by Ján Janech.

@item 
bpo-17214@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17214}: The “urllib.request” module now percent-encodes non-ASCII bytes
found in redirect target URLs.  Some servers send Location header fields
with non-ASCII bytes, but “http.client” requires the request target to be
ASCII-encodable, otherwise a UnicodeEncodeError is raised.  Based on patch
by Christian Heimes.

@item 
bpo-27033@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27033}: The default value of the decode_data parameter for
smtpd.SMTPChannel and smtpd.SMTPServer constructors is changed to False.

@item 
bpo-27034@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27034}: Removed deprecated class asynchat.fifo.

@item 
bpo-26870@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26870}: Added readline.set_auto_history(), which can stop entries being
automatically added to the history list.  Based on patch by Tyler
Crompton.

@item 
bpo-26039@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26039}: zipfile.ZipFile.open() can now be used to write data into a ZIP
file, as well as for extracting data.  Patch by Thomas Kluyver.

@item 
bpo-26892@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26892}: Honor debuglevel flag in urllib.request.HTTPHandler. Patch
contributed by Chi Hsuan Yen.

@item 
bpo-22274@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22274}: In the subprocess module, allow stderr to be redirected to
stdout even when stdout is not redirected.  Patch by Akira Li.

@item 
bpo-26807@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26807}: mock_open ‘files’ no longer error on readline at end of file.
Patch from Yolanda Robla.

@item 
bpo-25745@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25745}: Fixed leaking a userptr in curses panel destructor.

@item 
bpo-26977@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26977}: Removed unnecessary, and ignored, call to sum of squares helper
in statistics.pvariance.

@item 
bpo-26002@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26002}: Use bisect in statistics.median instead of a linear search.
Patch by Upendra Kuma.

@item 
bpo-25974@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25974}: Make use of new Decimal.as_integer_ratio() method in statistics
module. Patch by Stefan Krah.

@item 
bpo-26996@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26996}: Add secrets module as described in 
@geindex Python 향상 제안; PEP 506
PEP 506@footnote{https://peps.python.org/pep-0506/}.

@item 
bpo-26881@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26881}: The modulefinder module now supports extended opcode arguments.

@item 
bpo-23815@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23815}: Fixed crashes related to directly created instances of types in
_tkinter and curses.panel modules.

@item 
bpo-17765@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17765}: weakref.ref() no longer silently ignores keyword arguments.
Patch by Georg Brandl.

@item 
bpo-26873@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26873}: xmlrpc now raises ResponseError on unsupported type tags
instead of silently return incorrect result.

@item 
bpo-26915@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26915}: The __contains__ methods in the collections ABCs now check for
identity before checking equality.  This better matches the behavior of
the concrete classes, allows sensible handling of NaNs, and makes it
easier to reason about container invariants.

@item 
bpo-26711@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26711}: Fixed the comparison of plistlib.Data with other types.

@item 
bpo-24114@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24114}: Fix an uninitialized variable in @code{ctypes.util}. The bug only
occurs on SunOS when the ctypes implementation searches for the @code{crle}
program. Patch by Xiang Zhang.  Tested on SunOS by Kees Bos.

@item 
bpo-26864@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26864}: In urllib.request, change the proxy bypass host checking
against no_proxy to be case-insensitive, and to not match unrelated host
names that happen to have a bypassed hostname as a suffix.  Patch by Xiang
Zhang.

@item 
bpo-24902@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24902}: Print server URL on http.server startup.  Initial patch by
Felix Kaiser.

@item 
bpo-25788@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25788}: fileinput.hook_encoded() now supports an “errors” argument for
passing to open.  Original patch by Joseph Hackman.

@item 
bpo-26634@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26634}: recursive_repr() now sets __qualname__ of wrapper.  Patch by
Xiang Zhang.

@item 
bpo-26804@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26804}: urllib.request will prefer lower_case proxy environment
variables over UPPER_CASE or Mixed_Case ones. Patch contributed by
Hans-Peter Jansen.

@item 
bpo-26837@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26837}: assertSequenceEqual() now correctly outputs non-stringified
differing items (like bytes in the -b mode).  This affects
assertListEqual() and assertTupleEqual().

@item 
bpo-26041@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26041}: Remove “will be removed in Python 3.7” from deprecation
messages of platform.dist() and platform.linux_distribution(). Patch by
Kumaripaba Miyurusara Athukorala.

@item 
bpo-26822@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26822}: itemgetter, attrgetter and methodcaller objects no longer
silently ignore keyword arguments.

@item 
bpo-26733@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26733}: Disassembling a class now disassembles class and static
methods. Patch by Xiang Zhang.

@item 
bpo-26801@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26801}: Fix error handling in @ref{1308,,shutil.get_terminal_size()}, catch
@ref{5ee,,AttributeError} instead of @ref{452,,NameError}. Patch written by
Emanuel Barry.

@item 
bpo-24838@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24838}: tarfile’s ustar and gnu formats now correctly calculate name
and link field limits for multibyte character encodings like utf-8.

@item 
bpo-26717@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26717}: Stop encoding Latin-1-ized WSGI paths with UTF-8.  Patch by
Anthony Sottile.

@item 
bpo-26782@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26782}: Add STARTUPINFO to subprocess.__all__ on Windows.

@item 
bpo-26404@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26404}: Add context manager to socketserver.  Patch by Aviv Palivoda.

@item 
bpo-26735@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26735}: Fix @ref{745,,os.urandom()} on Solaris 11.3 and newer when reading
more than 1,024 bytes: call @code{getrandom()} multiple times with a limit of
1024 bytes per call.

@item 
bpo-26585@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26585}: Eliminate http.server._quote_html() and use
html.escape(quote=False).  Patch by Xiang Zhang.

@item 
bpo-26685@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26685}: Raise OSError if closing a socket fails.

@item 
bpo-16329@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16329}: Add .webm to mimetypes.types_map.  Patch by Giampaolo Rodola’.

@item 
bpo-13952@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13952}: Add .csv to mimetypes.types_map.  Patch by Geoff Wilson.

@item 
bpo-26587@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26587}: the site module now allows .pth files to specify files to be
added to sys.path (e.g. zip files).

@item 
bpo-25609@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25609}: Introduce contextlib.AbstractContextManager and
typing.ContextManager.

@item 
bpo-26709@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26709}: Fixed Y2038 problem in loading binary PLists.

@item 
bpo-23735@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23735}: Handle terminal resizing with Readline 6.3+ by installing our
own SIGWINCH handler.  Patch by Eric Price.

@item 
bpo-25951@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25951}: Change SSLSocket.sendall() to return None, as explicitly
documented for plain socket objects.  Patch by Aviv Palivoda.

@item 
bpo-26586@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26586}: In http.server, respond with “413 Request header fields too
large” if there are too many header fields to parse, rather than killing
the connection and raising an unhandled exception.  Patch by Xiang Zhang.

@item 
bpo-26676@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26676}: Added missing XMLPullParser to ElementTree.__all__.

@item 
bpo-22854@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22854}: Change BufferedReader.writable() and BufferedWriter.readable()
to always return False.

@item 
bpo-26492@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26492}: Exhausted iterator of array.array now conforms with the
behavior of iterators of other mutable sequences: it lefts exhausted even
if iterated array is extended.

@item 
bpo-26641@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26641}: doctest.DocFileTest and doctest.testfile() now support packages
(module split into multiple directories) for the package parameter.

@item 
bpo-25195@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25195}: Fix a regression in mock.MagicMock. _Call is a subclass of
tuple (changeset 3603bae63c13 only works for classes) so we need to
implement __ne__ ourselves.  Patch by Andrew Plummer.

@item 
bpo-26644@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26644}: Raise ValueError rather than SystemError when a negative length
is passed to SSLSocket.recv() or read().

@item 
bpo-23804@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23804}: Fix SSL recv(0) and read(0) methods to return zero bytes
instead of up to 1024.

@item 
bpo-26616@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26616}: Fixed a bug in datetime.astimezone() method.

@item 
bpo-26637@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26637}: The @ref{7b,,importlib} module now emits an @ref{659,,ImportError}
rather than a @ref{198,,TypeError} if @ref{ad1,,__import__()} is tried during the
Python shutdown process but @ref{3e4,,sys.path} is already cleared (set to
@code{None}).

@item 
bpo-21925@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21925}: @ref{1df5,,warnings.formatwarning()} now catches exceptions when
calling @ref{240,,linecache.getline()} and
@ref{1f35,,tracemalloc.get_object_traceback()} to be able to log
@ref{54e,,ResourceWarning} emitted late during the Python shutdown process.

@item 
bpo-23848@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23848}: On Windows, faulthandler.enable() now also installs an
exception handler to dump the traceback of all Python threads on any
Windows exception, not only on UNIX signals (SIGSEGV, SIGFPE, SIGABRT).

@item 
bpo-26530@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26530}: Add C functions @code{_PyTraceMalloc_Track()} and
@code{_PyTraceMalloc_Untrack()} to track memory blocks using the
@ref{105,,tracemalloc} module. Add @code{_PyTraceMalloc_GetTraceback()} to
get the traceback of an object.

@item 
bpo-26588@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26588}: The _tracemalloc now supports tracing memory allocations of
multiple address spaces (domains).

@item 
bpo-24266@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24266}: Ctrl+C during Readline history search now cancels the search
mode when compiled with Readline 7.

@item 
bpo-26590@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26590}: Implement a safe finalizer for the _socket.socket type. It now
releases the GIL to close the socket.

@item 
bpo-18787@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18787}: spwd.getspnam() now raises a PermissionError if the user
doesn’t have privileges.

@item 
bpo-26560@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26560}: Avoid potential ValueError in BaseHandler.start_response.
Initial patch by Peter Inglesby.

@item 
bpo-26567@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26567}: Add a new function @ref{f12,,PyErr_ResourceWarning()} function to
pass the destroyed object. Add a `source' attribute to
@code{warnings.WarningMessage}. Add warnings._showwarnmsg() which uses
tracemalloc to get the traceback where source object was allocated.

@item 
bpo-26569@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26569}: Fix @ref{a2c,,pyclbr.readmodule()} and @ref{a2d,,pyclbr.readmodule_ex()}
to support importing packages.

@item 
bpo-26499@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26499}: Account for remaining Content-Length in HTTPResponse.readline()
and read1(). Based on patch by Silent Ghost. Also document that
HTTPResponse now supports these methods.

@item 
bpo-25320@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25320}: Handle sockets in directories unittest discovery is scanning.
Patch from Victor van den Elzen.

@item 
bpo-16181@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16181}: cookiejar.http2time() now returns None if year is higher than
datetime.MAXYEAR.

@item 
bpo-26513@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26513}: Fixes platform module detection of Windows Server

@item 
bpo-23718@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23718}: Fixed parsing time in week 0 before Jan 1.  Original patch by
Tamás Bence Gedai.

@item 
bpo-26323@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26323}: Add Mock.assert_called() and Mock.assert_called_once() methods
to unittest.mock. Patch written by Amit Saha.

@item 
bpo-20589@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20589}: Invoking Path.owner() and Path.group() on Windows now raise
NotImplementedError instead of ImportError.

@item 
bpo-26177@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26177}: Fixed the keys() method for Canvas and Scrollbar widgets.

@item 
bpo-15068@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15068}: Got rid of excessive buffering in fileinput. The bufsize
parameter is now deprecated and ignored.

@item 
bpo-19475@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19475}: Added an optional argument timespec to the datetime isoformat()
method to choose the precision of the time component.

@item 
bpo-2202@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2202}: Fix UnboundLocalError in
AbstractDigestAuthHandler.get_algorithm_impls. Initial patch by Mathieu
Dupuy.

@item 
bpo-26167@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26167}: Minimized overhead in copy.copy() and copy.deepcopy().
Optimized copying and deepcopying bytearrays, NotImplemented, slices,
short lists, tuples, dicts, sets.

@item 
bpo-25718@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25718}: Fixed pickling and copying the accumulate() iterator with total
is None.

@item 
bpo-26475@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26475}: Fixed debugging output for regular expressions with the (?x)
flag.

@item 
bpo-26482@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26482}: Allowed pickling recursive dequeues.

@item 
bpo-26335@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26335}: Make mmap.write() return the number of bytes written like other
write methods.  Patch by Jakub Stasiak.

@item 
bpo-26457@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26457}: Fixed the subnets() methods in IP network classes for the case
when resulting prefix length is equal to maximal prefix length. Based on
patch by Xiang Zhang.

@item 
bpo-26385@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26385}: Remove the file if the internal open() call in
NamedTemporaryFile() fails. Patch by Silent Ghost.

@item 
bpo-26402@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26402}: Fix XML-RPC client to retry when the server shuts down a
persistent connection.  This was a regression related to the new
http.client.RemoteDisconnected exception in 3.5.0a4.

@item 
bpo-25913@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25913}: Leading @code{<~} is optional now in base64.a85decode() with
adobe=True.  Patch by Swati Jaiswal.

@item 
bpo-26186@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26186}: Remove an invalid type check in importlib.util.LazyLoader.

@item 
bpo-26367@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26367}: importlib.__import__() raises ImportError like
builtins.__import__() when @code{level} is specified but without an
accompanying package specified.

@item 
bpo-26309@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26309}: In the “socketserver” module, shut down the request (closing
the connected socket) when verify_request() returns false.  Patch by Aviv
Palivoda.

@item 
bpo-23430@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23430}: Change the socketserver module to only catch exceptions raised
from a request handler that are derived from Exception (instead of
BaseException). Therefore SystemExit and KeyboardInterrupt no longer
trigger the handle_error() method, and will now to stop a single-threaded
server.

@item 
bpo-25995@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25995}: os.walk() no longer uses FDs proportional to the tree depth.

@item 
bpo-25994@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25994}: Added the close() method and the support of the context manager
protocol for the os.scandir() iterator.

@item 
bpo-23992@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23992}: multiprocessing: make MapResult not fail-fast upon exception.

@item 
bpo-26243@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26243}: Support keyword arguments to zlib.compress().  Patch by Aviv
Palivoda.

@item 
bpo-26117@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26117}: The os.scandir() iterator now closes file descriptor not only
when the iteration is finished, but when it was failed with error.

@item 
bpo-25949@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25949}: __dict__ for an OrderedDict instance is now created only when
needed.

@item 
bpo-25911@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25911}: Restored support of bytes paths in os.walk() on Windows.

@item 
bpo-26045@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26045}: Add UTF-8 suggestion to error message when posting a
non-Latin-1 string with http.client.

@item 
bpo-26039@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26039}: Added zipfile.ZipInfo.from_file() and zipinfo.ZipInfo.is_dir().
Patch by Thomas Kluyver.

@item 
bpo-12923@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12923}: Reset FancyURLopener’s redirect counter even if there is an
exception. Based on patches by Brian Brazil and Daniel Rocco.

@item 
bpo-25945@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25945}: Fixed a crash when unpickle the functools.partial object with
wrong state. Fixed a leak in failed functools.partial constructor. “args”
and “keywords” attributes of functools.partial have now always types tuple
and dict correspondingly.

@item 
bpo-26202@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26202}: copy.deepcopy() now correctly copies range() objects with
non-atomic attributes.

@item 
bpo-23076@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23076}: Path.glob() now raises a ValueError if it’s called with an
invalid pattern. Patch by Thomas Nyberg.

@item 
bpo-19883@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19883}: Fixed possible integer overflows in zipimport.

@item 
bpo-26227@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26227}: On Windows, getnameinfo(), gethostbyaddr() and
gethostbyname_ex() functions of the socket module now decode the hostname
from the ANSI code page rather than UTF-8.

@item 
bpo-26099@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26099}: The site module now writes an error into stderr if
sitecustomize module can be imported but executing the module raise an
ImportError. Same change for usercustomize.

@item 
bpo-26147@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26147}: xmlrpc now works with strings not encodable with used non-UTF-8
encoding.

@item 
bpo-25935@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25935}: Garbage collector now breaks reference loops with OrderedDict.

@item 
bpo-16620@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16620}: Fixed AttributeError in msilib.Directory.glob().

@item 
bpo-26013@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26013}: Added compatibility with broken protocol 2 pickles created in
old Python 3 versions (3.4.3 and lower).

@item 
bpo-26129@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26129}: Deprecated accepting non-integers in grp.getgrgid().

@item 
bpo-25850@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25850}: Use cross-compilation by default for 64-bit Windows.

@item 
bpo-25822@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25822}: Add docstrings to the fields of urllib.parse results. Patch
contributed by Swati Jaiswal.

@item 
bpo-22642@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22642}: Convert trace module option parsing mechanism to argparse.
Patch contributed by SilentGhost.

@item 
bpo-24705@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24705}: Fix sysconfig._parse_makefile not expanding $@{@} vars appearing
before $() vars.

@item 
bpo-26069@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26069}: Remove the deprecated apis in the trace module.

@item 
bpo-22138@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22138}: Fix mock.patch behavior when patching descriptors. Restore
original values after patching. Patch contributed by Sean McCully.

@item 
bpo-25672@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25672}: In the ssl module, enable the SSL_MODE_RELEASE_BUFFERS mode
option if it is safe to do so.

@item 
bpo-26012@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26012}: Don’t traverse into symlinks for @code{**} pattern in
pathlib.Path.[r]glob().

@item 
bpo-24120@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24120}: Ignore PermissionError when traversing a tree with
pathlib.Path.[r]glob(). Patch by Ulrich Petri.

@item 
bpo-21815@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21815}: Accept ] characters in the data portion of imap responses, in
order to handle the flags with square brackets accepted and produced by
servers such as gmail.

@item 
bpo-25447@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25447}: fileinput now uses sys.stdin as-is if it does not have a buffer
attribute (restores backward compatibility).

@item 
bpo-25971@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25971}: Optimized creating Fractions from floats by 2 times and from
Decimals by 3 times.

@item 
bpo-25802@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25802}: Document as deprecated the remaining implementations of
importlib.abc.Loader.load_module().

@item 
bpo-25928@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25928}: Add Decimal.as_integer_ratio().

@item 
bpo-25447@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25447}: Copying the lru_cache() wrapper object now always works,
independently from the type of the wrapped object (by returning the
original object unchanged).

@item 
bpo-25768@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25768}: Have the functions in compileall return booleans instead of
ints and add proper documentation and tests for the return values.

@item 
bpo-24103@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24103}: Fixed possible use after free in ElementTree.XMLPullParser.

@item 
bpo-25860@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25860}: os.fwalk() no longer skips remaining directories when error
occurs. Original patch by Samson Lee.

@item 
bpo-25914@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25914}: Fixed and simplified OrderedDict.__sizeof__.

@item 
bpo-25869@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25869}: Optimized deepcopying ElementTree; it is now 20 times faster.

@item 
bpo-25873@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25873}: Optimized iterating ElementTree.  Iterating elements
Element.iter() is now 40% faster, iterating text Element.itertext() is now
up to 2.5 times faster.

@item 
bpo-25902@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25902}: Fixed various refcount issues in ElementTree iteration.

@item 
bpo-22227@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22227}: The TarFile iterator is reimplemented using generator. This
implementation is simpler that using class.

@item 
bpo-25638@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25638}: Optimized ElementTree.iterparse(); it is now 2x faster.
Optimized ElementTree parsing; it is now 10% faster.

@item 
bpo-25761@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25761}: Improved detecting errors in broken pickle data.

@item 
bpo-25717@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25717}: Restore the previous behaviour of tolerating most fstat()
errors when opening files.  This was a regression in 3.5a1, and stopped
anonymous temporary files from working in special cases.

@item 
bpo-24903@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24903}: Fix regression in number of arguments compileall accepts when
‘-d’ is specified.  The check on the number of arguments has been dropped
completely as it never worked correctly anyway.

@item 
bpo-25764@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25764}: In the subprocess module, preserve any exception caused by
fork() failure when preexec_fn is used.

@item 
bpo-25771@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25771}: Tweak the exception message for importlib.util.resolve_name()
when ‘package’ isn’t specified but necessary.

@item 
bpo-6478@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6478}: _strptime’s regexp cache now is reset after changing timezone
with time.tzset().

@item 
bpo-14285@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14285}: When executing a package with the “python -m package” option,
and package initialization fails, a proper traceback is now reported.  The
“runpy” module now lets exceptions from package initialization pass back
to the caller, rather than raising ImportError.

@item 
bpo-19771@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19771}: Also in runpy and the “-m” option, omit the irrelevant message
“… is a package and cannot be directly executed” if the package could
not even be initialized (e.g. due to a bad @code{*.pyc} file).

@item 
bpo-25177@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25177}: Fixed problem with the mean of very small and very large
numbers. As a side effect, statistics.mean and statistics.variance should
be significantly faster.

@item 
bpo-25718@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25718}: Fixed copying object with state with boolean value is false.

@item 
bpo-10131@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10131}: Fixed deep copying of minidom documents.  Based on patch by
Marian Ganisin.

@item 
bpo-7990@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7990}: dir() on ElementTree.Element now lists properties: “tag”,
“text”, “tail” and “attrib”.  Original patch by Santoso Wijaya.

@item 
bpo-25725@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25725}: Fixed a reference leak in pickle.loads() when unpickling
invalid data including tuple instructions.

@item 
bpo-25663@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25663}: In the Readline completer, avoid listing duplicate global
names, and search the global namespace before searching builtins.

@item 
bpo-25688@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25688}: Fixed file leak in ElementTree.iterparse() raising an error.

@item 
bpo-23914@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23914}: Fixed SystemError raised by unpickler on broken pickle data.

@item 
bpo-25691@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25691}: Fixed crash on deleting ElementTree.Element attributes.

@item 
bpo-25624@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25624}: ZipFile now always writes a ZIP_STORED header for directory
entries.  Patch by Dingyuan Wang.

@item 
bpo-25626@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25626}: Change three zlib functions to accept sizes that fit in
Py_ssize_t, but internally cap those sizes to UINT_MAX.  This resolves a
regression in 3.5 where GzipFile.read() failed to read chunks larger than
2 or 4 GiB.  The change affects the zlib.Decompress.decompress()
max_length parameter, the zlib.decompress() bufsize parameter, and the
zlib.Decompress.flush() length parameter.

@item 
bpo-25583@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25583}: Avoid incorrect errors raised by os.makedirs(exist_ok=True)
when the OS gives priority to errors such as EACCES over EEXIST.

@item 
bpo-25593@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25593}: Change semantics of EventLoop.stop() in asyncio.

@item 
bpo-6973@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6973}: When we know a subprocess.Popen process has died, do not allow
the send_signal(), terminate(), or kill() methods to do anything as they
could potentially signal a different process.

@item 
bpo-23883@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23883}: Added missing APIs to __all__ to match the documented APIs for
the following modules: calendar, csv, enum, fileinput, ftplib, logging,
optparse, tarfile, threading and wave.  Also added a
test.support.check__all__() helper. Patches by Jacek Kołodziej, Mauro S.
M. Rodrigues and Joel Taddei.

@item 
bpo-25590@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25590}: In the Readline completer, only call getattr() once per
attribute.  Also complete names of attributes such as properties and slots
which are listed by dir() but not yet created on an instance.

@item 
bpo-25498@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25498}: Fix a crash when garbage-collecting ctypes objects created by
wrapping a memoryview.  This was a regression made in 3.5a1.  Based on
patch by Eryksun.

@item 
bpo-25584@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25584}: Added “escape” to the __all__ list in the glob module.

@item 
bpo-25584@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25584}: Fixed recursive glob() with patterns starting with @code{**}.

@item 
bpo-25446@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25446}: Fix regression in smtplib’s AUTH LOGIN support.

@item 
bpo-18010@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18010}: Fix the pydoc web server’s module search function to handle
exceptions from importing packages.

@item 
bpo-25554@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25554}: Got rid of circular references in regular expression parsing.

@item 
bpo-18973@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18973}: Command-line interface of the calendar module now uses argparse
instead of optparse.

@item 
bpo-25510@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25510}: fileinput.FileInput.readline() now returns b’’ instead of ‘’ at
the end if the FileInput was opened with binary mode. Patch by Ryosuke
Ito.

@item 
bpo-25503@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25503}: Fixed inspect.getdoc() for inherited docstrings of properties.
Original patch by John Mark Vandenberg.

@item 
bpo-25515@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25515}: Always use os.urandom as a source of randomness in uuid.uuid4.

@item 
bpo-21827@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21827}: Fixed textwrap.dedent() for the case when largest common
whitespace is a substring of smallest leading whitespace. Based on patch
by Robert Li.

@item 
bpo-25447@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25447}: The lru_cache() wrapper objects now can be copied and pickled
(by returning the original object unchanged).

@item 
bpo-25390@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25390}: typing: Don’t crash on Union[str, Pattern].

@item 
bpo-25441@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25441}: asyncio: Raise error from drain() when socket is closed.

@item 
bpo-25410@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25410}: Cleaned up and fixed minor bugs in C implementation of
OrderedDict.

@item 
bpo-25411@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25411}: Improved Unicode support in SMTPHandler through better use of
the email package. Thanks to user simon04 for the patch.

@item 
Move the imp module from a PendingDeprecationWarning to
DeprecationWarning.

@item 
bpo-25407@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25407}: Remove mentions of the formatter module being removed in Python
3.6.

@item 
bpo-25406@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25406}: Fixed a bug in C implementation of OrderedDict.move_to_end()
that caused segmentation fault or hang in iterating after moving several
items to the start of ordered dict.

@item 
bpo-25382@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25382}: pickletools.dis() now outputs implicit memo index for the
MEMOIZE opcode.

@item 
bpo-25357@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25357}: Add an optional newline parameter to binascii.b2a_base64().
base64.b64encode() uses it to avoid a memory copy.

@item 
bpo-24164@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24164}: Objects that need calling @code{__new__} with keyword arguments,
can now be pickled using pickle protocols older than protocol version 4.

@item 
bpo-25364@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25364}: zipfile now works in threads disabled builds.

@item 
bpo-25328@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25328}: smtpd’s SMTPChannel now correctly raises a ValueError if both
decode_data and enable_SMTPUTF8 are set to true.

@item 
bpo-16099@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16099}: RobotFileParser now supports Crawl-delay and Request-rate
extensions.  Patch by Nikolay Bogoychev.

@item 
bpo-25316@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25316}: distutils raises OSError instead of DistutilsPlatformError when
MSVC is not installed.

@item 
bpo-25380@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25380}: Fixed protocol for the STACK_GLOBAL opcode in
pickletools.opcodes.

@item 
bpo-23972@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23972}: Updates asyncio datagram create method allowing reuseport and
reuseaddr socket options to be set prior to binding the socket. Mirroring
the existing asyncio create_server method the reuseaddr option for
datagram sockets defaults to True if the O/S is ‘posix’ (except if the
platform is Cygwin). Patch by Chris Laws.

@item 
bpo-25304@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25304}: Add asyncio.run_coroutine_threadsafe().  This lets you submit a
coroutine to a loop from another thread, returning a
concurrent.futures.Future.  By Vincent Michel.

@item 
bpo-25232@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25232}: Fix CGIRequestHandler to split the query from the URL at the
first question mark (?) rather than the last. Patch from Xiang Zhang.

@item 
bpo-24657@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24657}: Prevent CGIRequestHandler from collapsing slashes in the query
part of the URL as if it were a path. Patch from Xiang Zhang.

@item 
bpo-25287@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25287}: Don’t add crypt.METHOD_CRYPT to crypt.methods if it’s not
supported. Check if it is supported, it may not be supported on OpenBSD
for example.

@item 
bpo-23600@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23600}: Default implementation of tzinfo.fromutc() was returning wrong
results in some cases.

@item 
bpo-25203@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25203}: Failed readline.set_completer_delims() no longer left the
module in inconsistent state.

@item 
bpo-25011@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25011}: rlcompleter now omits private and special attribute names
unless the prefix starts with underscores.

@item 
bpo-25209@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25209}: rlcompleter now can add a space or a colon after completed
keyword.

@item 
bpo-22241@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22241}: timezone.utc name is now plain ‘UTC’, not ‘UTC-00:00’.

@item 
bpo-23517@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23517}: fromtimestamp() and utcfromtimestamp() methods of
datetime.datetime now round microseconds to nearest with ties going to
nearest even integer (ROUND_HALF_EVEN), as round(float), instead of
rounding towards -Infinity (ROUND_FLOOR).

@item 
bpo-23552@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23552}: Timeit now warns when there is substantial (4x) variance
between best and worst times. Patch from Serhiy Storchaka.

@item 
bpo-24633@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24633}: site-packages/README -> README.txt.

@item 
bpo-24879@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24879}: help() and pydoc can now list named tuple fields in the order
they were defined rather than alphabetically.  The ordering is determined
by the _fields attribute if present.

@item 
bpo-24874@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24874}: Improve speed of itertools.cycle() and make its pickle more
compact.

@item 
Fix crash in itertools.cycle.__setstate__() when the first argument wasn’t
a list.

@item 
bpo-20059@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20059}: urllib.parse raises ValueError on all invalid ports. Patch by
Martin Panter.

@item 
bpo-24360@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24360}: Improve __repr__ of argparse.Namespace() for invalid
identifiers.  Patch by Matthias Bussonnier.

@item 
bpo-23426@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23426}: run_setup was broken in distutils. Patch from Alexander
Belopolsky.

@item 
bpo-13938@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13938}: 2to3 converts StringTypes to a tuple. Patch from Mark Hammond.

@item 
bpo-2091@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2091}: open() accepted a ‘U’ mode string containing ‘+’, but ‘U’ can
only be used with ‘r’. Patch from Jeff Balogh and John O’Connor.

@item 
bpo-8585@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8585}: improved tests for zipimporter2. Patch from Mark Lawrence.

@item 
bpo-18622@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18622}: unittest.mock.mock_open().reset_mock would recurse infinitely.
Patch from Nicola Palumbo and Laurent De Buyst.

@item 
bpo-24426@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24426}: Fast searching optimization in regular expressions now works
for patterns that starts with capturing groups.  Fast searching
optimization now can’t be disabled at compile time.

@item 
bpo-23661@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23661}: unittest.mock side_effects can now be exceptions again. This
was a regression vs Python 3.4. Patch from Ignacio Rossi

@item 
bpo-13248@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13248}: Remove deprecated inspect.getmoduleinfo function.

@item 
bpo-25578@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25578}: Fix (another) memory leak in SSLSocket.getpeercer().

@item 
bpo-25530@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25530}: Disable the vulnerable SSLv3 protocol by default when creating
ssl.SSLContext.

@item 
bpo-25569@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25569}: Fix memory leak in SSLSocket.getpeercert().

@item 
bpo-25471@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25471}: Sockets returned from accept() shouldn’t appear to be
nonblocking.

@item 
bpo-25319@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25319}: When threading.Event is reinitialized, the underlying condition
should use a regular lock rather than a recursive lock.

@item 
Skip getaddrinfo if host is already resolved. Patch by A. Jesse Jiryu
Davis.

@item 
bpo-26050@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26050}: Add asyncio.StreamReader.readuntil() method. Patch by Марк
Коренберг.

@item 
bpo-25924@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25924}: Avoid unnecessary serialization of getaddrinfo(3) calls on OS X
versions 10.5 or higher.  Original patch by A. Jesse Jiryu Davis.

@item 
bpo-26406@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26406}: Avoid unnecessary serialization of getaddrinfo(3) calls on
current versions of OpenBSD and NetBSD.  Patch by A. Jesse Jiryu Davis.

@item 
bpo-26848@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26848}: Fix asyncio/subprocess.communicate() to handle empty input.
Patch by Jack O’Connor.

@item 
bpo-27040@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27040}: Add loop.get_exception_handler method

@item 
bpo-27041@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27041}: asyncio: Add loop.create_future method
@end itemize

@node IDLE<56>,Documentation<77>,Library<189>,Python 3 6 0 alpha 1
@anchor{whatsnew/changelog id972}@anchor{1f36}
@subsubsection IDLE



@itemize -

@item 
bpo-20640@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20640}: Add tests for idlelib.configHelpSourceEdit. Patch by Saimadhav
Heblikar.

@item 
In the ‘IDLE-console differences’ section of the IDLE doc, clarify how
running with IDLE affects sys.modules and the standard streams.

@item 
bpo-25507@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25507}: fix incorrect change in IOBinding that prevented printing.
Augment IOBinding htest to include all major IOBinding functions.

@item 
bpo-25905@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25905}: Revert unwanted conversion of ‘ to ’ RIGHT SINGLE QUOTATION
MARK in README.txt and open this and NEWS.txt with ‘ascii’. Re-encode
CREDITS.txt to utf-8 and open it with ‘utf-8’.

@item 
bpo-15348@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15348}: Stop the debugger engine (normally in a user process) before
closing the debugger window (running in the IDLE process). This prevents
the RuntimeErrors that were being caught and ignored.

@item 
bpo-24455@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24455}: Prevent IDLE from hanging when a) closing the shell while the
debugger is active (15347); b) closing the debugger with the [X] button
(15348); and c) activating the debugger when already active (24455). The
patch by Mark Roseman does this by making two changes. 1. Suspend and
resume the gui.interaction method with the tcl vwait mechanism intended
for this purpose (instead of root.mainloop & .quit). 2. In gui.run, allow
any existing interaction to terminate first.

@item 
Change ‘The program’ to ‘Your program’ in an IDLE ‘kill program?’ message
to make it clearer that the program referred to is the currently running
user program, not IDLE itself.

@item 
bpo-24750@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24750}: Improve the appearance of the IDLE editor window status bar.
Patch by Mark Roseman.

@item 
bpo-25313@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25313}: Change the handling of new built-in text color themes to better
address the compatibility problem introduced by the addition of IDLE Dark.
Consistently use the revised idleConf.CurrentTheme everywhere in idlelib.

@item 
bpo-24782@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24782}: Extension configuration is now a tab in the IDLE Preferences
dialog rather than a separate dialog.  The former tabs are now a sorted
list.  Patch by Mark Roseman.

@item 
bpo-22726@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22726}: Re-activate the config dialog help button with some content
about the other buttons and the new IDLE Dark theme.

@item 
bpo-24820@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24820}: IDLE now has an ‘IDLE Dark’ built-in text color theme. It is
more or less IDLE Classic inverted, with a cobalt blue background.
Strings, comments, keywords, … are still green, red, orange, … . To
use it with IDLEs released before November 2015, hit the ‘Save as New
Custom Theme’ button and enter a new name, such as ‘Custom Dark’.  The
custom theme will work with any IDLE release, and can be modified.

@item 
bpo-25224@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25224}: README.txt is now an idlelib index for IDLE developers and
curious users. The previous user content is now in the IDLE doc chapter.
‘IDLE’ now means ‘Integrated Development and Learning Environment’.

@item 
bpo-24820@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24820}: Users can now set breakpoint colors in Settings -> Custom
Highlighting. Original patch by Mark Roseman.

@item 
bpo-24972@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24972}: Inactive selection background now matches active selection
background, as configured by users, on all systems.  Found items are now
always highlighted on Windows.  Initial patch by Mark Roseman.

@item 
bpo-24570@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24570}: Idle: make calltip and completion boxes appear on Macs affected
by a tk regression.  Initial patch by Mark Roseman.

@item 
bpo-24988@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24988}: Idle ScrolledList context menus (used in debugger) now work on
Mac Aqua. Patch by Mark Roseman.

@item 
bpo-24801@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24801}: Make right-click for context menu work on Mac Aqua. Patch by
Mark Roseman.

@item 
bpo-25173@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25173}: Associate tkinter messageboxes with a specific widget. For Mac
OSX, make them a ‘sheet’.  Patch by Mark Roseman.

@item 
bpo-25198@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25198}: Enhance the initial html viewer now used for Idle Help.
Properly indent fixed-pitch text (patch by Mark Roseman). Give code
snippet a very Sphinx-like light blueish-gray background. Re-use initial
width and height set by users for shell and editor. When the Table of
Contents (TOC) menu is used, put the section header at the top of the
screen.

@item 
bpo-25225@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25225}: Condense and rewrite Idle doc section on text colors.

@item 
bpo-21995@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21995}: Explain some differences between IDLE and console Python.

@item 
bpo-22820@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22820}: Explain need for `print' when running file from Idle editor.

@item 
bpo-25224@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25224}: Doc: augment Idle feature list and no-subprocess section.

@item 
bpo-25219@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25219}: Update doc for Idle command line options. Some were missing and
notes were not correct.

@item 
bpo-24861@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24861}: Most of idlelib is private and subject to change. Use
idleib.idle.* to start Idle. See idlelib.__init__.__doc__.

@item 
bpo-25199@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25199}: Idle: add synchronization comments for future maintainers.

@item 
bpo-16893@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16893}: Replace help.txt with help.html for Idle doc display. The new
idlelib/help.html is rstripped Doc/build/html/library/idle.html. It looks
better than help.txt and will better document Idle as released. The
tkinter html viewer that works for this file was written by Rose Roseman.
The now unused EditorWindow.HelpDialog class and helt.txt file are
deprecated.

@item 
bpo-24199@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24199}: Deprecate unused idlelib.idlever with possible removal in 3.6.

@item 
bpo-24790@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24790}: Remove extraneous code (which also create 2 & 3 conflicts).
@end itemize

@node Documentation<77>,Tests<78>,IDLE<56>,Python 3 6 0 alpha 1
@anchor{whatsnew/changelog id973}@anchor{1f37}
@subsubsection Documentation



@itemize -

@item 
bpo-26736@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26736}: Used HTTPS for external links in the documentation if possible.

@item 
bpo-6953@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6953}: Rework the Readline module documentation to group related
functions together, and add more details such as what underlying Readline
functions and variables are accessed.

@item 
bpo-23606@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23606}: Adds note to ctypes documentation regarding cdll.msvcrt.

@item 
bpo-24952@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24952}: Clarify the default size argument of stack_size() in the
“threading” and “_thread” modules. Patch from Mattip.

@item 
bpo-26014@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26014}: Update 3.x packaging documentation: * “See also” links to the
new docs are now provided in the legacy pages * links to setuptools
documentation have been updated
@end itemize

@node Tests<78>,Build<89>,Documentation<77>,Python 3 6 0 alpha 1
@anchor{whatsnew/changelog id974}@anchor{1f38}
@subsubsection Tests



@itemize -

@item 
bpo-21916@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21916}: Added tests for the turtle module.  Patch by ingrid, Gregory
Loyse and Jelle Zijlstra.

@item 
bpo-26295@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26295}: When using “python3 -m test –testdir=TESTDIR”, regrtest
doesn’t add “test.” prefix to test module names.

@item 
bpo-26523@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26523}: The multiprocessing thread pool (multiprocessing.dummy.Pool)
was untested.

@item 
bpo-26015@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26015}: Added new tests for pickling iterators of mutable sequences.

@item 
bpo-26325@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26325}: Added test.support.check_no_resource_warning() to check that no
ResourceWarning is emitted.

@item 
bpo-25940@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25940}: Changed test_ssl to use its internal local server more.  This
avoids relying on svn.python.org, which recently changed root certificate.

@item 
bpo-25616@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25616}: Tests for OrderedDict are extracted from test_collections into
separate file test_ordered_dict.

@item 
bpo-25449@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25449}: Added tests for OrderedDict subclasses.

@item 
bpo-25188@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25188}: Add -P/–pgo to test.regrtest to suppress error output when
running the test suite for the purposes of a PGO build. Initial patch by
Alecsandru Patrascu.

@item 
bpo-22806@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22806}: Add @code{python -m test --list-tests} command to list tests.

@item 
bpo-18174@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18174}: @code{python -m test --huntrleaks ...} now also checks for leak of
file descriptors. Patch written by Richard Oudkerk.

@item 
bpo-25260@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25260}: Fix @code{python -m test --coverage} on Windows. Remove the list
of ignored directories.

@item 
@code{PCbuild\rt.bat} now accepts an unlimited number of arguments to pass
along to regrtest.py.  Previously there was a limit of 9.

@item 
bpo-26583@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26583}: Skip test_timestamp_overflow in test_import if bytecode files
cannot be written.
@end itemize

@node Build<89>,Windows<76>,Tests<78>,Python 3 6 0 alpha 1
@anchor{whatsnew/changelog id975}@anchor{1f39}
@subsubsection Build



@itemize -

@item 
bpo-21277@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21277}: Don’t try to link _ctypes with a ffi_convenience library.

@item 
bpo-26884@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26884}: Fix linking extension modules for cross builds. Patch by Xavier
de Gaye.

@item 
bpo-26932@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26932}: Fixed support of RTLD_* constants defined as enum values, not
via macros (in particular on Android).  Patch by Chi Hsuan Yen.

@item 
bpo-22359@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22359}: Disable the rules for running _freeze_importlib and pgen when
cross-compiling.  The output of these programs is normally saved with the
source code anyway, and is still regenerated when doing a native build.
Patch by Xavier de Gaye.

@item 
bpo-21668@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21668}: Link audioop, _datetime, _ctypes_test modules to libm, except
on Mac OS X. Patch written by Chi Hsuan Yen.

@item 
bpo-25702@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25702}: A –with-lto configure option has been added that will enable
link time optimizations at build time during a make profile-opt. Some
compilers and toolchains are known to not produce stable code when using
LTO, be sure to test things thoroughly before relying on it. It can
provide a few % speed up over profile-opt alone.

@item 
bpo-26624@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26624}: Adds validation of ucrtbase[d].dll version with warning for old
versions.

@item 
bpo-17603@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17603}: Avoid error about nonexistent fileblocks.o file by using a
lower-level check for st_blocks in struct stat.

@item 
bpo-26079@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26079}: Fixing the build output folder for tix-8.4.3.6. Patch by Bjoern
Thiel.

@item 
bpo-26465@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26465}: Update Windows builds to use OpenSSL 1.0.2g.

@item 
bpo-25348@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25348}: Added @code{--pgo} and @code{--pgo-job} arguments to
@code{PCbuild\build.bat} for building with Profile-Guided Optimization.  The
old @code{PCbuild\build_pgo.bat} script is removed.

@item 
bpo-25827@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25827}: Add support for building with ICC to @code{configure}, including a
new @code{--with-icc} flag.

@item 
bpo-25696@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25696}: Fix installation of Python on UNIX with make -j9.

@item 
bpo-24986@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24986}: It is now possible to build Python on Windows without errors
when external libraries are not available.

@item 
bpo-24421@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24421}: Compile Modules/_math.c once, before building extensions.
Previously it could fail to compile properly if the math and cmath builds
were concurrent.

@item 
bpo-26465@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26465}: Update OS X 10.5+ 32-bit-only installer to build and link with
OpenSSL 1.0.2g.

@item 
bpo-26268@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26268}: Update Windows builds to use OpenSSL 1.0.2f.

@item 
bpo-25136@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25136}: Support Apple Xcode 7’s new textual SDK stub libraries.

@item 
bpo-24324@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24324}: Do not enable unreachable code warnings when using gcc as the
option does not work correctly in older versions of gcc and has been
silently removed as of gcc-4.5.
@end itemize

@node Windows<76>,Tools/Demos<54>,Build<89>,Python 3 6 0 alpha 1
@anchor{whatsnew/changelog id976}@anchor{1f3a}
@subsubsection Windows



@itemize -

@item 
bpo-27053@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27053}: Updates make_zip.py to correctly generate library ZIP file.

@item 
bpo-26268@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26268}: Update the prepare_ssl.py script to handle OpenSSL releases
that don’t include the contents of the include directory (that is, 1.0.2e
and later).

@item 
bpo-26071@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26071}: bdist_wininst created binaries fail to start and find 32bit
Python

@item 
bpo-26073@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26073}: Update the list of magic numbers in launcher

@item 
bpo-26065@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26065}: Excludes venv from library when generating embeddable distro.

@item 
bpo-25022@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25022}: Removed very outdated PC/example_nt/ directory.
@end itemize

@node Tools/Demos<54>,C API<75>,Windows<76>,Python 3 6 0 alpha 1
@anchor{whatsnew/changelog id977}@anchor{1f3b}
@subsubsection Tools/Demos



@itemize -

@item 
bpo-26799@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26799}: Fix python-gdb.py: don’t get C types once when the Python code
is loaded, but get C types on demand. The C types can change if
python-gdb.py is loaded before the Python executable. Patch written by
Thomas Ilsche.

@item 
bpo-26271@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26271}: Fix the Freeze tool to properly use flags passed through
configure. Patch by Daniel Shaulov.

@item 
bpo-26489@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26489}: Add dictionary unpacking support to Tools/parser/unparse.py.
Patch by Guo Ci Teo.

@item 
bpo-26316@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26316}: Fix variable name typo in Argument Clinic.

@item 
bpo-25440@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25440}: Fix output of python-config –extension-suffix.

@item 
bpo-25154@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25154}: The pyvenv script has been deprecated in favour of @code{python3 -m
venv}.
@end itemize

@node C API<75>,,Tools/Demos<54>,Python 3 6 0 alpha 1
@anchor{whatsnew/changelog id978}@anchor{1f3c}
@subsubsection C API



@itemize -

@item 
bpo-26312@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26312}: SystemError is now raised in all programming bugs with using
PyArg_ParseTupleAndKeywords().  RuntimeError did raised before in some
programming bugs.

@item 
bpo-26198@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26198}: ValueError is now raised instead of TypeError on buffer
overflow in parsing “es#” and “et#” format units.  SystemError is now
raised instead of TypeError on programmatical error in parsing format
string.
@end itemize

@node Python 3 5 5 final,Python 3 5 5 release candidate 1,Python 3 6 0 alpha 1,Changelog
@anchor{whatsnew/changelog python-3-5-5-final}@anchor{1f3d}
@subsection Python 3.5.5 final


`Release date: 2018-02-04'

There were no new changes in version 3.5.5.

@node Python 3 5 5 release candidate 1,Python 3 5 4 final,Python 3 5 5 final,Changelog
@anchor{whatsnew/changelog python-3-5-5-release-candidate-1}@anchor{1f3e}
@subsection Python 3.5.5 release candidate 1


`Release date: 2018-01-23'

@menu
* Security: Security<58>. 
* Core and Builtins: Core and Builtins<187>. 
* Library: Library<190>. 

@end menu

@node Security<58>,Core and Builtins<187>,,Python 3 5 5 release candidate 1
@anchor{whatsnew/changelog id979}@anchor{1f3f}
@subsubsection Security



@itemize -

@item 
bpo-32551@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32551}: The @code{sys.path[0]} initialization change for bpo-29139@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29139} caused
a regression by revealing an inconsistency in how sys.path is initialized
when executing @code{__main__} from a zipfile, directory, or other import
location. This is considered a potential security issue, as it may lead to
privileged processes unexpectedly loading code from user controlled
directories in situations where that was not previously the case. The
interpreter now consistently avoids ever adding the import location’s
parent directory to @code{sys.path}, and ensures no other @code{sys.path}
entries are inadvertently modified when inserting the import location
named on the command line. (Originally reported as bpo-29723@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29723} against
Python 3.6rc1, but it was missed at the time that the then upcoming Python
3.5.4 release would also be affected)

@item 
bpo-30657@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30657}: Fixed possible integer overflow in PyBytes_DecodeEscape,
@geindex Common Vulnerabilities and Exposures; CVE 2017-1000158
CVE 2017-1000158@footnote{https://www.cve.org/CVERecord?id=CVE-2017-1000158}. Original patch by Jay Bosamiya; rebased to Python 3
by Miro Hrončok.

@item 
bpo-30947@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30947}: Upgrade libexpat embedded copy from version 2.2.1 to 2.2.3 to
get security fixes.
@end itemize

@node Core and Builtins<187>,Library<190>,Security<58>,Python 3 5 5 release candidate 1
@anchor{whatsnew/changelog id980}@anchor{1f40}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-31095@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31095}: Fix potential crash during GC caused by @code{tp_dealloc} which
doesn’t call @code{PyObject_GC_UnTrack()}.
@end itemize

@node Library<190>,,Core and Builtins<187>,Python 3 5 5 release candidate 1
@anchor{whatsnew/changelog id981}@anchor{1f41}
@subsubsection Library



@itemize -

@item 
bpo-32072@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=32072}: Fixed issues with binary plists: Fixed saving bytearrays.
Identical objects will be saved only once. Equal references will be load
as identical objects. Added support for saving and loading recursive data
structures.

@item 
bpo-31170@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=31170}: expat: Update libexpat from 2.2.3 to 2.2.4. Fix copying of
partial characters for UTF-8 input (libexpat bug 115):
@indicateurl{https://github.com/libexpat/libexpat/issues/115}
@end itemize

@node Python 3 5 4 final,Python 3 5 4 release candidate 1,Python 3 5 5 release candidate 1,Changelog
@anchor{whatsnew/changelog python-3-5-4-final}@anchor{1f42}
@subsection Python 3.5.4 final


`Release date: 2017-08-07'

@menu
* Library: Library<191>. 

@end menu

@node Library<191>,,,Python 3 5 4 final
@anchor{whatsnew/changelog id982}@anchor{1f43}
@subsubsection Library



@itemize -

@item 
bpo-30119@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30119}: ftplib.FTP.putline() now throws ValueError on commands that
contains CR or LF. Patch by Donghee Na.
@end itemize

@node Python 3 5 4 release candidate 1,Python 3 5 3 final,Python 3 5 4 final,Changelog
@anchor{whatsnew/changelog python-3-5-4-release-candidate-1}@anchor{1f44}
@subsection Python 3.5.4 release candidate 1


`Release date: 2017-07-23'

@menu
* Security: Security<59>. 
* Core and Builtins: Core and Builtins<188>. 
* Library: Library<192>. 
* Documentation: Documentation<78>. 
* Tests: Tests<79>. 
* Build: Build<90>. 
* Windows: Windows<77>. 
* C API: C API<76>. 

@end menu

@node Security<59>,Core and Builtins<188>,,Python 3 5 4 release candidate 1
@anchor{whatsnew/changelog id983}@anchor{1f45}
@subsubsection Security



@itemize -

@item 
bpo-30730@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30730}: Prevent environment variables injection in subprocess on
Windows.  Prevent passing other environment variables and command
arguments.

@item 
bpo-30694@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30694}: Upgrade expat copy from 2.2.0 to 2.2.1 to get fixes of multiple
security vulnerabilities including: 
@geindex Common Vulnerabilities and Exposures; CVE 2017-9233
CVE 2017-9233@footnote{https://www.cve.org/CVERecord?id=CVE-2017-9233} (External entity
infinite loop DoS), 
@geindex Common Vulnerabilities and Exposures; CVE 2016-9063
CVE 2016-9063@footnote{https://www.cve.org/CVERecord?id=CVE-2016-9063} (Integer overflow, re-fix),
@geindex Common Vulnerabilities and Exposures; CVE 2016-0718
CVE 2016-0718@footnote{https://www.cve.org/CVERecord?id=CVE-2016-0718} (Fix regression bugs from 2.2.0’s fix to
@geindex Common Vulnerabilities and Exposures; CVE 2016-0718
CVE 2016-0718@footnote{https://www.cve.org/CVERecord?id=CVE-2016-0718}) and 
@geindex Common Vulnerabilities and Exposures; CVE 2012-0876
CVE 2012-0876@footnote{https://www.cve.org/CVERecord?id=CVE-2012-0876} (Counter hash flooding with
SipHash). Note: the 
@geindex Common Vulnerabilities and Exposures; CVE 2016-5300
CVE 2016-5300@footnote{https://www.cve.org/CVERecord?id=CVE-2016-5300} (Use os-specific entropy sources like
getrandom) doesn’t impact Python, since Python already gets entropy from
the OS to set the expat secret using @code{XML_SetHashSalt()}.

@item 
bpo-30500@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30500}: Fix urllib.parse.splithost() to correctly parse fragments. For
example, @code{splithost('//127.0.0.1#@@evil.com/')} now correctly returns the
@code{127.0.0.1} host, instead of treating @code{@@evil.com} as the host in an
authentication (@code{login@@host}).

@item 
bpo-29591@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29591}: Update expat copy from 2.1.1 to 2.2.0 to get fixes of
@geindex Common Vulnerabilities and Exposures; CVE 2016-0718
CVE 2016-0718@footnote{https://www.cve.org/CVERecord?id=CVE-2016-0718} and 
@geindex Common Vulnerabilities and Exposures; CVE 2016-4472
CVE 2016-4472@footnote{https://www.cve.org/CVERecord?id=CVE-2016-4472}. See
@indicateurl{https://sourceforge.net/p/expat/bugs/537/} for more information.
@end itemize

@node Core and Builtins<188>,Library<192>,Security<59>,Python 3 5 4 release candidate 1
@anchor{whatsnew/changelog id984}@anchor{1f46}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-30876@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30876}: Relative import from unloaded package now reimports the package
instead of failing with SystemError.  Relative import from non-package now
fails with ImportError rather than SystemError.

@item 
bpo-30765@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30765}: Avoid blocking in pthread_mutex_lock() when
PyThread_acquire_lock() is asked not to block.

@item 
bpo-27945@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27945}: Fixed various segfaults with dict when input collections are
mutated during searching, inserting or comparing.  Based on patches by
Duane Griffin and Tim Mitchell.

@item 
bpo-25794@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25794}: Fixed type.__setattr__() and type.__delattr__() for
non-interned attribute names.  Based on patch by Eryk Sun.

@item 
bpo-29935@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29935}: Fixed error messages in the index() method of tuple, list and
deque when pass indices of wrong type.

@item 
bpo-28876@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28876}: @code{bool(range)} works even if @code{len(range)} raises
@ref{a81,,OverflowError}.

@item 
bpo-29600@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29600}: Fix wrapping coroutine return values in StopIteration.

@item 
bpo-29537@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29537}: Restore runtime compatibility with bytecode files generated by
CPython 3.5.0 to 3.5.2, and adjust the eval loop to avoid the problems
that could be caused by the malformed variant of the
BUILD_MAP_UNPACK_WITH_CALL opcode that they may contain. Patch by Petr
Viktorin, Serhiy Storchaka, and Nick Coghlan.

@item 
bpo-28598@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28598}: Support __rmod__ for subclasses of str being called before
str.__mod__. Patch by Martijn Pieters.

@item 
bpo-29602@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29602}: Fix incorrect handling of signed zeros in complex constructor
for complex subclasses and for inputs having a __complex__ method. Patch
by Serhiy Storchaka.

@item 
bpo-29347@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29347}: Fixed possibly dereferencing undefined pointers when creating
weakref objects.

@item 
bpo-29438@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29438}: Fixed use-after-free problem in key sharing dict.

@item 
bpo-29319@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29319}: Prevent RunMainFromImporter overwriting sys.path[0].

@item 
bpo-29337@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29337}: Fixed possible BytesWarning when compare the code objects.
Warnings could be emitted at compile time.

@item 
bpo-29478@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29478}: If max_line_length=None is specified while using the Compat32
policy, it is no longer ignored.  Patch by Mircea Cosbuc.
@end itemize

@node Library<192>,Documentation<78>,Core and Builtins<188>,Python 3 5 4 release candidate 1
@anchor{whatsnew/changelog id985}@anchor{1f47}
@subsubsection Library



@itemize -

@item 
bpo-29403@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29403}: Fix @code{unittest.mock}’s autospec to not fail on method-bound
builtin functions.  Patch by Aaron Gallagher.

@item 
bpo-30961@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30961}: Fix decrementing a borrowed reference in tracemalloc.

@item 
bpo-30886@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30886}: Fix multiprocessing.Queue.join_thread(): it now waits until the
thread completes, even if the thread was started by the same process which
created the queue.

@item 
bpo-29854@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29854}: Fix segfault in readline when using readline’s history-size
option.  Patch by Nir Soffer.

@item 
bpo-30807@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30807}: signal.setitimer() may disable the timer when passed a tiny
value. Tiny values (such as 1e-6) are valid non-zero values for
setitimer(), which is specified as taking microsecond-resolution
intervals. However, on some platform, our conversion routine could convert
1e-6 into a zero interval, therefore disabling the timer instead of
(re-)scheduling it.

@item 
bpo-30441@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30441}: Fix bug when modifying os.environ while iterating over it

@item 
bpo-30532@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30532}: Fix email header value parser dropping folding white space in
certain cases.

@item 
bpo-29169@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29169}: Update zlib to 1.2.11.

@item 
bpo-30879@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30879}: os.listdir() and os.scandir() now emit bytes names when called
with bytes-like argument.

@item 
bpo-30746@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30746}: Prohibited the ‘=’ character in environment variable names in
@code{os.putenv()} and @code{os.spawn*()}.

@item 
bpo-29755@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29755}: Fixed the lgettext() family of functions in the gettext module.
They now always return bytes.

@item 
bpo-30645@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30645}: Fix path calculation in imp.load_package(), fixing it for cases
when a package is only shipped with bytecodes. Patch by Alexandru
Ardelean.

@item 
bpo-23890@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23890}: unittest.TestCase.assertRaises() now manually breaks a
reference cycle to not keep objects alive longer than expected.

@item 
bpo-30149@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30149}: inspect.signature() now supports callables with
variable-argument parameters wrapped with partialmethod. Patch by Donghee
Na.

@item 
bpo-29931@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29931}: Fixed comparison check for ipaddress.ip_interface objects.
Patch by Sanjay Sundaresan.

@item 
bpo-24484@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24484}: Avoid race condition in multiprocessing cleanup.

@item 
bpo-28994@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28994}: The traceback no longer displayed for SystemExit raised in a
callback registered by atexit.

@item 
bpo-30508@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30508}: Don’t log exceptions if Task/Future “cancel()” method was
called.

@item 
bpo-28556@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28556}: Updates to typing module: Add generic AsyncContextManager, add
support for ContextManager on all versions. Original PRs by Jelle Zijlstra
and Ivan Levkivskyi

@item 
bpo-29870@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29870}: Fix ssl sockets leaks when connection is aborted in asyncio/ssl
implementation. Patch by Michaël Sghaïer.

@item 
bpo-29743@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29743}: Closing transport during handshake process leaks open socket.
Patch by Nikolay Kim

@item 
bpo-27585@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27585}: Fix waiter cancellation in asyncio.Lock. Patch by Mathieu
Sornay.

@item 
bpo-30418@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30418}: On Windows, subprocess.Popen.communicate() now also ignore
EINVAL on stdin.write() if the child process is still running but closed
the pipe.

@item 
bpo-30378@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30378}: Fix the problem that logging.handlers.SysLogHandler cannot
handle IPv6 addresses.

@item 
bpo-29960@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29960}: Preserve generator state when _random.Random.setstate() raises
an exception. Patch by Bryan Olson.

@item 
bpo-30414@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30414}: multiprocessing.Queue._feed background running thread do not
break from main loop on exception.

@item 
bpo-30003@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30003}: Fix handling escape characters in HZ codec.  Based on patch by
Ma Lin.

@item 
bpo-30301@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30301}: Fix AttributeError when using SimpleQueue.empty() under `spawn'
and `forkserver' start methods.

@item 
bpo-30329@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30329}: imaplib and poplib now catch the Windows socket WSAEINVAL error
(code 10022) on shutdown(SHUT_RDWR): An invalid operation was attempted.
This error occurs sometimes on SSL connections.

@item 
bpo-30375@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30375}: Warnings emitted when compile a regular expression now always
point to the line in the user code.  Previously they could point into
inners of the re module if emitted from inside of groups or conditionals.

@item 
bpo-30048@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30048}: Fixed @code{Task.cancel()} can be ignored when the task is running
coroutine and the coroutine returned without any more @code{await}.

@item 
bpo-29990@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29990}: Fix range checking in GB18030 decoder.  Original patch by Ma
Lin.

@item 
bpo-26293@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26293}: Change resulted because of zipfile breakage. (See also:
bpo-29094@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29094})

@item 
bpo-30243@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30243}: Removed the __init__ methods of _json’s scanner and encoder.
Misusing them could cause memory leaks or crashes.  Now scanner and
encoder objects are completely initialized in the __new__ methods.

@item 
bpo-30185@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30185}: Avoid KeyboardInterrupt tracebacks in forkserver helper process
when Ctrl-C is received.

@item 
bpo-28556@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28556}: Various updates to typing module: add typing.NoReturn type, use
WrapperDescriptorType, minor bug-fixes.  Original PRs by Jim
Fasarakis-Hilliard and Ivan Levkivskyi.

@item 
bpo-30205@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30205}: Fix getsockname() for unbound AF_UNIX sockets on Linux.

@item 
bpo-30070@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30070}: Fixed leaks and crashes in errors handling in the parser
module.

@item 
bpo-30061@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30061}: Fixed crashes in IOBase methods __next__() and readlines() when
readline() or __next__() respectively return non-sizeable object. Fixed
possible other errors caused by not checking results of PyObject_Size(),
PySequence_Size(), or PyMapping_Size().

@item 
bpo-30068@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30068}: _io._IOBase.readlines will check if it’s closed first when hint
is present.

@item 
bpo-29694@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29694}: Fixed race condition in pathlib mkdir with flags parents=True.
Patch by Armin Rigo.

@item 
bpo-29692@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29692}: Fixed arbitrary unchaining of RuntimeError exceptions in
contextlib.contextmanager.  Patch by Siddharth Velankar.

@item 
bpo-29998@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29998}: Pickling and copying ImportError now preserves name and path
attributes.

@item 
bpo-29942@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29942}: Fix a crash in itertools.chain.from_iterable when encountering
long runs of empty iterables.

@item 
bpo-27863@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27863}: Fixed multiple crashes in ElementTree caused by race conditions
and wrong types.

@item 
bpo-28699@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28699}: Fixed a bug in pools in multiprocessing.pool that raising an
exception at the very first of an iterable may swallow the exception or
make the program hang. Patch by Davin Potts and Xiang Zhang.

@item 
bpo-25803@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25803}: Avoid incorrect errors raised by Path.mkdir(exist_ok=True) when
the OS gives priority to errors such as EACCES over EEXIST.

@item 
bpo-29861@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29861}: Release references to tasks, their arguments and their results
as soon as they are finished in multiprocessing.Pool.

@item 
bpo-29884@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29884}: faulthandler: Restore the old sigaltstack during teardown.
Patch by Christophe Zeitouny.

@item 
bpo-25455@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25455}: Fixed crashes in repr of recursive buffered file-like objects.

@item 
bpo-29800@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29800}: Fix crashes in partial.__repr__ if the keys of partial.keywords
are not strings.  Patch by Michael Seifert.

@item 
bpo-29742@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29742}: get_extra_info() raises exception if get called on closed ssl
transport. Patch by Nikolay Kim.

@item 
bpo-8256@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8256}: Fixed possible failing or crashing input() if attributes
“encoding” or “errors” of sys.stdin or sys.stdout are not set or are not
strings.

@item 
bpo-28298@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28298}: Fix a bug that prevented array ‘Q’, ‘L’ and ‘I’ from accepting
big intables (objects that have __int__) as elements.  Patch by Oren
Milman.

@item 
bpo-29615@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29615}: SimpleXMLRPCDispatcher no longer chains KeyError (or any other
exception) to exception(s) raised in the dispatched methods. Patch by Petr
Motejlek.

@item 
bpo-29704@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29704}: asyncio.subprocess.SubprocessStreamProtocol no longer closes
before all pipes are closed.

@item 
bpo-29703@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29703}: Fix asyncio to support instantiation of new event loops in
child processes.

@item 
bpo-29376@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29376}: Fix assertion error in threading._DummyThread.is_alive().

@item 
bpo-29110@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29110}: Fix file object leak in aifc.open() when file is given as a
filesystem path and is not in valid AIFF format. Patch by Anthony Zhang.

@item 
bpo-28961@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28961}: Fix unittest.mock._Call helper: don’t ignore the name parameter
anymore. Patch written by Jiajun Huang.

@item 
bpo-29532@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29532}: Altering a kwarg dictionary passed to functools.partial() no
longer affects a partial object after creation.

@item 
bpo-28556@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28556}: Various updates to typing module: typing.Counter,
typing.ChainMap, improved ABC caching, etc. Original PRs by Jelle
Zijlstra, Ivan Levkivskyi, Manuel Krebber, and Łukasz Langa.

@item 
bpo-29100@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29100}: Fix datetime.fromtimestamp() regression introduced in Python
3.6.0: check minimum and maximum years.

@item 
bpo-29519@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29519}: Fix weakref spewing exceptions during interpreter shutdown when
used with a rare combination of multiprocessing and custom codecs.

@item 
bpo-29416@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29416}: Prevent infinite loop in pathlib.Path.mkdir

@item 
bpo-29444@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29444}: Fixed out-of-bounds buffer access in the group() method of the
match object. Based on patch by WGH.

@item 
bpo-29335@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29335}: Fix subprocess.Popen.wait() when the child process has exited
to a stopped instead of terminated state (ex: when under ptrace).

@item 
bpo-29290@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29290}: Fix a regression in argparse that help messages would wrap at
non-breaking spaces.

@item 
bpo-28735@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28735}: Fixed the comparison of mock.MagickMock with mock.ANY.

@item 
bpo-29011@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29011}: Fix an important omission by adding Deque to the typing module.

@item 
bpo-29219@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29219}: Fixed infinite recursion in the repr of uninitialized
ctypes.CDLL instances.

@item 
bpo-28969@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28969}: Fixed race condition in C implementation of
functools.lru_cache. KeyError could be raised when cached function with
full cache was simultaneously called from different threads with the same
uncached arguments.

@item 
bpo-29142@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29142}: In urllib.request, suffixes in no_proxy environment variable
with leading dots could match related hostnames again (e.g. .b.c matches
a.b.c). Patch by Milan Oberkirch.
@end itemize

@node Documentation<78>,Tests<79>,Library<192>,Python 3 5 4 release candidate 1
@anchor{whatsnew/changelog id986}@anchor{1f48}
@subsubsection Documentation



@itemize -

@item 
bpo-30176@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30176}: Add missing attribute related constants in curses
documentation.

@item 
bpo-26985@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26985}: Add missing info of code object in inspect documentation.

@item 
bpo-28929@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28929}: Link the documentation to its source file on GitHub.

@item 
bpo-25008@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25008}: Document smtpd.py as effectively deprecated and add a pointer
to aiosmtpd, a third-party asyncio-based replacement.

@item 
bpo-26355@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26355}: Add canonical header link on each page to corresponding major
version of the documentation. Patch by Matthias Bussonnier.

@item 
bpo-29349@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29349}: Fix Python 2 syntax in code for building the documentation.
@end itemize

@node Tests<79>,Build<90>,Documentation<78>,Python 3 5 4 release candidate 1
@anchor{whatsnew/changelog id987}@anchor{1f49}
@subsubsection Tests



@itemize -

@item 
bpo-30822@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30822}: Fix regrtest command line parser to allow passing -u
extralargefile to run test_zipfile64.

@item 
bpo-30383@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30383}: regrtest: Enhance regrtest and backport features from the
master branch. Add options: –coverage, –testdir, –list-tests (list test
files, don’t run them), –list-cases (list test identifiers, don’t run
them, bpo-30523@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30523}), –matchfile (load a list of test filters from a
text file, bpo-30540@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30540}), –slowest (alias to –slow). Enhance output:
add timestamp, test result, currently running tests, “Tests result: xxx”
summary with total duration, etc. Fix reference leak hunting in regrtest,
–huntrleaks: regrtest now warms up caches, create explicitly all internal
singletons which are created on demand to prevent false positives when
checking for reference leaks. (bpo-30675@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30675}).

@item 
bpo-30357@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30357}: test_thread: setUp() now uses support.threading_setup() and
support.threading_cleanup() to wait until threads complete to avoid random
side effects on following tests. Initial patch written by Grzegorz
Grzywacz.

@item 
bpo-28087@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28087}: Skip test_asyncore and test_eintr poll failures on macOS. Skip
some tests of select.poll when running on macOS due to unresolved issues
with the underlying system poll function on some macOS versions.

@item 
bpo-30197@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30197}: Enhanced functions swap_attr() and swap_item() in the
test.support module. They now work when delete replaced attribute or item
inside the with statement.  The old value of the attribute or item (or
None if it doesn’t exist) now will be assigned to the target of the “as”
clause, if there is one.

@item 
bpo-29571@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29571}: to match the behaviour of the @code{re.LOCALE} flag,
test_re.test_locale_flag now uses @code{locale.getpreferredencoding(False)}
to determine the candidate encoding for the test regex (allowing it to
correctly skip the test when the default locale encoding is a multi-byte
encoding)
@end itemize

@node Build<90>,Windows<77>,Tests<79>,Python 3 5 4 release candidate 1
@anchor{whatsnew/changelog id988}@anchor{1f4a}
@subsubsection Build



@itemize -

@item 
bpo-29243@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29243}: Prevent unnecessary rebuilding of Python during @code{make test},
@code{make install} and some other make targets when configured with
@code{--enable-optimizations}.

@item 
bpo-23404@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23404}: Don’t regenerate generated files based on file modification
time anymore: the action is now explicit. Replace @code{make touch} with
@code{make regen-all}.

@item 
bpo-29643@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29643}: Fix @code{--enable-optimization} didn’t work.
@end itemize

@node Windows<77>,C API<76>,Build<90>,Python 3 5 4 release candidate 1
@anchor{whatsnew/changelog id989}@anchor{1f4b}
@subsubsection Windows



@itemize -

@item 
bpo-30687@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=30687}: Locate msbuild.exe on Windows when building rather than
vcvarsall.bat

@item 
bpo-29392@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29392}: Prevent crash when passing invalid arguments into msvcrt
module.
@end itemize

@node C API<76>,,Windows<77>,Python 3 5 4 release candidate 1
@anchor{whatsnew/changelog id990}@anchor{1f4c}
@subsubsection C API



@itemize -

@item 
bpo-27867@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27867}: Function PySlice_GetIndicesEx() is replaced with a macro if
Py_LIMITED_API is set to the value between 0x03050400 and 0x03060000 (not
including) or 0x03060100 or higher.

@item 
bpo-29083@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29083}: Fixed the declaration of some public API functions.
PyArg_VaParse() and PyArg_VaParseTupleAndKeywords() were not available in
limited API. PyArg_ValidateKeywordArguments(), PyArg_UnpackTuple() and
Py_BuildValue() were not available in limited API of version < 3.3 when
PY_SSIZE_T_CLEAN is defined.
@end itemize

@node Python 3 5 3 final,Python 3 5 3 release candidate 1,Python 3 5 4 release candidate 1,Changelog
@anchor{whatsnew/changelog python-3-5-3-final}@anchor{1f4d}
@subsection Python 3.5.3 final


`Release date: 2017-01-17'

There were no code changes between 3.5.3rc1 and 3.5.3 final.

@node Python 3 5 3 release candidate 1,Python 3 5 2 final,Python 3 5 3 final,Changelog
@anchor{whatsnew/changelog python-3-5-3-release-candidate-1}@anchor{1f4e}
@subsection Python 3.5.3 release candidate 1


`Release date: 2017-01-02'

@menu
* Security: Security<60>. 
* Core and Builtins: Core and Builtins<189>. 
* Library: Library<193>. 
* IDLE: IDLE<57>. 
* C API: C API<77>. 
* Documentation: Documentation<79>. 
* Tests: Tests<80>. 
* Tools/Demos: Tools/Demos<55>. 
* Windows: Windows<78>. 
* Build: Build<91>. 

@end menu

@node Security<60>,Core and Builtins<189>,,Python 3 5 3 release candidate 1
@anchor{whatsnew/changelog id991}@anchor{1f4f}
@subsubsection Security



@itemize -

@item 
bpo-27278@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27278}: Fix os.urandom() implementation using getrandom() on Linux.
Truncate size to INT_MAX and loop until we collected enough random bytes,
instead of casting a directly Py_ssize_t to int.

@item 
bpo-22636@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22636}: Avoid shell injection problems with ctypes.util.find_library().
@end itemize

@node Core and Builtins<189>,Library<193>,Security<60>,Python 3 5 3 release candidate 1
@anchor{whatsnew/changelog id992}@anchor{1f50}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-29073@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29073}: bytearray formatting no longer truncates on first null byte.

@item 
bpo-28932@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28932}: Do not include <sys/random.h> if it does not exist.

@item 
bpo-28147@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28147}: Fix a memory leak in split-table dictionaries: setattr() must
not convert combined table into split table.

@item 
bpo-25677@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25677}: Correct the positioning of the syntax error caret for indented
blocks. Based on patch by Michael Layzell.

@item 
bpo-29000@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29000}: Fixed bytes formatting of octals with zero padding in alternate
form.

@item 
bpo-28512@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28512}: Fixed setting the offset attribute of SyntaxError by
PyErr_SyntaxLocationEx() and PyErr_SyntaxLocationObject().

@item 
bpo-28991@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28991}: functools.lru_cache() was susceptible to an obscure reentrancy
bug caused by a monkey-patched len() function.

@item 
bpo-28648@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28648}: Fixed crash in Py_DecodeLocale() in debug build on Mac OS X
when decode astral characters.  Patch by Xiang Zhang.

@item 
bpo-19398@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19398}: Extra slash no longer added to sys.path components in case of
empty compile-time PYTHONPATH components.

@item 
bpo-28426@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28426}: Fixed potential crash in PyUnicode_AsDecodedObject() in debug
build.

@item 
bpo-23782@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23782}: Fixed possible memory leak in _PyTraceback_Add() and exception
loss in PyTraceBack_Here().

@item 
bpo-28379@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28379}: Added sanity checks and tests for PyUnicode_CopyCharacters().
Patch by Xiang Zhang.

@item 
bpo-28376@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28376}: The type of long range iterator is now registered as Iterator.
Patch by Oren Milman.

@item 
bpo-28376@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28376}: The constructor of range_iterator now checks that step is not
0. Patch by Oren Milman.

@item 
bpo-26906@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26906}: Resolving special methods of uninitialized type now causes
implicit initialization of the type instead of a fail.

@item 
bpo-18287@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18287}: PyType_Ready() now checks that tp_name is not NULL. Original
patch by Niklas Koep.

@item 
bpo-24098@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24098}: Fixed possible crash when AST is changed in process of
compiling it.

@item 
bpo-28350@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28350}: String constants with null character no longer interned.

@item 
bpo-26617@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26617}: Fix crash when GC runs during weakref callbacks.

@item 
bpo-27942@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27942}: String constants now interned recursively in tuples and
frozensets.

@item 
bpo-21578@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21578}: Fixed misleading error message when ImportError called with
invalid keyword args.

@item 
bpo-28203@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28203}: Fix incorrect type in error message from @code{complex(1.0,
@{2:3@})}. Patch by Soumya Sharma.

@item 
bpo-27955@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27955}: Fallback on reading /dev/urandom device when the getrandom()
syscall fails with EPERM, for example when blocked by SECCOMP.

@item 
bpo-28131@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28131}: Fix a regression in zipimport’s compile_source().  zipimport
should use the same optimization level as the interpreter.

@item 
bpo-25221@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25221}: Fix corrupted result from PyLong_FromLong(0) when Python is
compiled with NSMALLPOSINTS = 0.

@item 
bpo-25758@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25758}: Prevents zipimport from unnecessarily encoding a filename
(patch by Eryk Sun)

@item 
bpo-28189@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28189}: dictitems_contains no longer swallows compare errors. (Patch by
Xiang Zhang)

@item 
bpo-27812@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27812}: Properly clear out a generator’s frame’s backreference to the
generator to prevent crashes in frame.clear().

@item 
bpo-27811@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27811}: Fix a crash when a coroutine that has not been awaited is
finalized with warnings-as-errors enabled.

@item 
bpo-27587@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27587}: Fix another issue found by PVS-Studio: Null pointer check after
use of ‘def’ in _PyState_AddModule(). Initial patch by Christian Heimes.

@item 
bpo-26020@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26020}: set literal evaluation order did not match documented
behaviour.

@item 
bpo-27782@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27782}: Multi-phase extension module import now correctly allows the
@code{m_methods} field to be used to add module level functions to instances
of non-module types returned from @code{Py_create_mod}. Patch by Xiang Zhang.

@item 
bpo-27936@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27936}: The round() function accepted a second None argument for some
types but not for others.  Fixed the inconsistency by accepting None for
all numeric types.

@item 
bpo-27487@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27487}: Warn if a submodule argument to “python -m” or
runpy.run_module() is found in sys.modules after parent packages are
imported, but before the submodule is executed.

@item 
bpo-27558@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27558}: Fix a SystemError in the implementation of “raise” statement.
In a brand new thread, raise a RuntimeError since there is no active
exception to reraise. Patch written by Xiang Zhang.

@item 
bpo-27419@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27419}: Standard __import__() no longer look up “__import__” in globals
or builtins for importing submodules or “from import”.  Fixed handling an
error of non-string package name.

@item 
bpo-27083@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27083}: Respect the PYTHONCASEOK environment variable under Windows.

@item 
bpo-27514@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27514}: Make having too many statically nested blocks a SyntaxError
instead of SystemError.

@item 
bpo-27473@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27473}: Fixed possible integer overflow in bytes and bytearray
concatenations. Patch by Xiang Zhang.

@item 
bpo-27507@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27507}: Add integer overflow check in bytearray.extend().  Patch by
Xiang Zhang.

@item 
bpo-27581@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27581}: Don’t rely on wrapping for overflow check in
PySequence_Tuple().  Patch by Xiang Zhang.

@item 
bpo-27443@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27443}: __length_hint__() of bytearray iterators no longer return a
negative integer for a resized bytearray.

@item 
bpo-27942@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27942}: Fix memory leak in codeobject.c
@end itemize

@node Library<193>,IDLE<57>,Core and Builtins<189>,Python 3 5 3 release candidate 1
@anchor{whatsnew/changelog id993}@anchor{1f51}
@subsubsection Library



@itemize -

@item 
bpo-15812@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15812}: inspect.getframeinfo() now correctly shows the first line of a
context. Patch by Sam Breese.

@item 
bpo-29094@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29094}: Offsets in a ZIP file created with extern file object and modes
“w” and “x” now are relative to the start of the file.

@item 
bpo-13051@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13051}: Fixed recursion errors in large or resized
curses.textpad.Textbox.  Based on patch by Tycho Andersen.

@item 
bpo-29119@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29119}: Fix weakrefs in the pure python version of
collections.OrderedDict move_to_end() method. Contributed by Andra
Bogildea.

@item 
bpo-9770@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9770}: curses.ascii predicates now work correctly with negative
integers.

@item 
bpo-28427@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28427}: old keys should not remove new values from WeakValueDictionary
when collecting from another thread.

@item 
bpo-28923@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28923}: Remove editor artifacts from Tix.py.

@item 
bpo-28871@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28871}: Fixed a crash when deallocate deep ElementTree.

@item 
bpo-19542@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19542}: Fix bugs in WeakValueDictionary.setdefault() and
WeakValueDictionary.pop() when a GC collection happens in another thread.

@item 
bpo-20191@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20191}: Fixed a crash in resource.prlimit() when pass a sequence that
doesn’t own its elements as limits.

@item 
bpo-28779@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28779}: multiprocessing.set_forkserver_preload() would crash the
forkserver process if a preloaded module instantiated some multiprocessing
objects such as locks.

@item 
bpo-28847@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28847}: dbm.dumb now supports reading read-only files and no longer
writes the index file when it is not changed.

@item 
bpo-25659@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25659}: In ctypes, prevent a crash calling the from_buffer() and
from_buffer_copy() methods on abstract classes like Array.

@item 
bpo-28732@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28732}: Fix crash in os.spawnv() with no elements in args

@item 
bpo-28485@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28485}: Always raise ValueError for negative
compileall.compile_dir(workers=…) parameter, even when multithreading is
unavailable.

@item 
bpo-28387@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28387}: Fixed possible crash in _io.TextIOWrapper deallocator when the
garbage collector is invoked in other thread.  Based on patch by Sebastian
Cufre.

@item 
bpo-27517@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27517}: LZMA compressor and decompressor no longer raise exceptions if
given empty data twice.  Patch by Benjamin Fogle.

@item 
bpo-28549@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28549}: Fixed segfault in curses’s addch() with ncurses6.

@item 
bpo-28449@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28449}: tarfile.open() with mode “r” or “r:” now tries to open a tar
file with compression before trying to open it without compression.
Otherwise it had 50% chance failed with ignore_zeros=True.

@item 
bpo-23262@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23262}: The webbrowser module now supports Firefox 36+ and derived
browsers.  Based on patch by Oleg Broytman.

@item 
bpo-27939@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27939}: Fixed bugs in tkinter.ttk.LabeledScale and tkinter.Scale caused
by representing the scale as float value internally in Tk.  tkinter.IntVar
now works if float value is set to underlying Tk variable.

@item 
bpo-28255@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28255}: calendar.TextCalendar().prmonth() no longer prints a space at
the start of new line after printing a month’s calendar.  Patch by Xiang
Zhang.

@item 
bpo-20491@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20491}: The textwrap.TextWrapper class now honors non-breaking spaces.
Based on patch by Kaarle Ritvanen.

@item 
bpo-28353@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28353}: os.fwalk() no longer fails on broken links.

@item 
bpo-25464@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25464}: Fixed HList.header_exists() in tkinter.tix module by addin a
workaround to Tix library bug.

@item 
bpo-28488@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28488}: shutil.make_archive() no longer add entry “./” to ZIP archive.

@item 
bpo-24452@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24452}: Make webbrowser support Chrome on Mac OS X.

@item 
bpo-20766@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20766}: Fix references leaked by pdb in the handling of SIGINT
handlers.

@item 
bpo-26293@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26293}: Fixed writing ZIP files that starts not from the start of the
file.  Offsets in ZIP file now are relative to the start of the archive in
conforming to the specification.

@item 
bpo-28321@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28321}: Fixed writing non-BMP characters with binary format in
plistlib.

@item 
bpo-28322@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28322}: Fixed possible crashes when unpickle itertools objects from
incorrect pickle data.  Based on patch by John Leitch.

@item 
Fix possible integer overflows and crashes in the mmap module with unusual
usage patterns.

@item 
bpo-1703178@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1703178}: Fix the ability to pass the –link-objects option to the
distutils build_ext command.

@item 
bpo-28253@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28253}: Fixed calendar functions for extreme months: 0001-01 and
9999-12. Methods itermonthdays() and itermonthdays2() are reimplemented so
that they don’t call itermonthdates() which can cause datetime.date
under/overflow.

@item 
bpo-28275@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28275}: Fixed possible use after free in the decompress() methods of
the LZMADecompressor and BZ2Decompressor classes. Original patch by John
Leitch.

@item 
bpo-27897@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27897}: Fixed possible crash in sqlite3.Connection.create_collation()
if pass invalid string-like object as a name.  Patch by Xiang Zhang.

@item 
bpo-18893@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18893}: Fix invalid exception handling in Lib/ctypes/macholib/dyld.py.
Patch by Madison May.

@item 
bpo-27611@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27611}: Fixed support of default root window in the tkinter.tix module.

@item 
bpo-27348@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27348}: In the traceback module, restore the formatting of exception
messages like “Exception: None”.  This fixes a regression introduced in
3.5a2.

@item 
bpo-25651@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25651}: Allow false values to be used for msg parameter of subTest().

@item 
bpo-27932@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27932}: Prevent memory leak in win32_ver().

@item 
Fix UnboundLocalError in socket._sendfile_use_sendfile.

@item 
bpo-28075@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28075}: Check for ERROR_ACCESS_DENIED in Windows implementation of
os.stat().  Patch by Eryk Sun.

@item 
bpo-25270@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25270}: Prevent codecs.escape_encode() from raising SystemError when an
empty bytestring is passed.

@item 
bpo-28181@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28181}: Get antigravity over HTTPS. Patch by Kaartic Sivaraam.

@item 
bpo-25895@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25895}: Enable WebSocket URL schemes in urllib.parse.urljoin. Patch by
Gergely Imreh and Markus Holtermann.

@item 
bpo-27599@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27599}: Fixed buffer overrun in binascii.b2a_qp() and
binascii.a2b_qp().

@item 
bpo-19003@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19003}: m email.generator now replaces only @code{\r} and/or @code{\n} line
endings, per the RFC, instead of all unicode line endings.

@item 
bpo-28019@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28019}: itertools.count() no longer rounds non-integer step in range
between 1.0 and 2.0 to 1.

@item 
bpo-25969@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25969}: Update the lib2to3 grammar to handle the unpacking
generalizations added in 3.5.

@item 
bpo-14977@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14977}: mailcap now respects the order of the lines in the mailcap
files (“first match”), as required by RFC 1542.  Patch by Michael Lazar.

@item 
bpo-24594@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24594}: Validates persist parameter when opening MSI database

@item 
bpo-17582@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17582}: xml.etree.ElementTree nows preserves whitespaces in attributes
(Patch by Duane Griffin.  Reviewed and approved by Stefan Behnel.)

@item 
bpo-28047@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28047}: Fixed calculation of line length used for the base64 CTE in the
new email policies.

@item 
bpo-27445@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27445}: Don’t pass str(_charset) to MIMEText.set_payload(). Patch by
Claude Paroz.

@item 
bpo-22450@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22450}: urllib now includes an @code{Accept: */*} header among the default
headers. This makes the results of REST API requests more consistent and
predictable especially when proxy servers are involved.

@item 
lib2to3.pgen3.driver.load_grammar() now creates a stable cache file
between runs given the same Grammar.txt input regardless of the hash
randomization setting.

@item 
bpo-27570@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27570}: Avoid zero-length memcpy() etc calls with null source pointers
in the “ctypes” and “array” modules.

@item 
bpo-22233@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22233}: Break email header lines `only' on the RFC specified CR and LF
characters, not on arbitrary unicode line breaks.  This also fixes a bug
in HTTP header parsing.

@item 
bpo-27988@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27988}: Fix email iter_attachments incorrect mutation of payload list.

@item 
bpo-27691@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27691}: Fix ssl module’s parsing of GEN_RID subject alternative name
fields in X.509 certs.

@item 
bpo-27850@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27850}: Remove 3DES from ssl module’s default cipher list to counter
measure sweet32 attack (
@geindex Common Vulnerabilities and Exposures; CVE 2016-2183
CVE 2016-2183@footnote{https://www.cve.org/CVERecord?id=CVE-2016-2183}).

@item 
bpo-27766@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27766}: Add ChaCha20 Poly1305 to ssl module’s default cipher list.
(Required OpenSSL 1.1.0 or LibreSSL).

@item 
bpo-26470@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26470}: Port ssl and hashlib module to OpenSSL 1.1.0.

@item 
Remove support for passing a file descriptor to os.access. It never worked
but previously didn’t raise.

@item 
bpo-12885@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12885}: Fix error when distutils encounters symlink.

@item 
bpo-27881@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27881}: Fixed possible bugs when setting
sqlite3.Connection.isolation_level. Based on patch by Xiang Zhang.

@item 
bpo-27861@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27861}: Fixed a crash in sqlite3.Connection.cursor() when a factory
creates not a cursor.  Patch by Xiang Zhang.

@item 
bpo-19884@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19884}: Avoid spurious output on OS X with Gnu Readline.

@item 
bpo-27706@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27706}: Restore deterministic behavior of random.Random().seed() for
string seeds using seeding version 1.  Allows sequences of calls to
random() to exactly match those obtained in Python 2. Patch by Nofar
Schnider.

@item 
bpo-10513@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10513}: Fix a regression in Connection.commit().  Statements should not
be reset after a commit.

@item 
A new version of typing.py from @indicateurl{https://github.com/python/typing}:
Collection (only for 3.6) (bpo-27598@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27598}). Add FrozenSet to __all__
(upstream #261). Fix crash in _get_type_vars() (upstream #259). Remove the
dict constraint in ForwardRef._eval_type (upstream #252).

@item 
bpo-27539@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27539}: Fix unnormalised @code{Fraction.__pow__} result in the case of
negative exponent and negative base.

@item 
bpo-21718@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21718}: cursor.description is now available for queries using CTEs.

@item 
bpo-2466@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2466}: posixpath.ismount now correctly recognizes mount points which
the user does not have permission to access.

@item 
bpo-27773@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27773}: Correct some memory management errors server_hostname in
_ssl.wrap_socket().

@item 
bpo-26750@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26750}: unittest.mock.create_autospec() now works properly for
subclasses of property() and other data descriptors.

@item 
In the curses module, raise an error if window.getstr() or window.instr()
is passed a negative value.

@item 
bpo-27783@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27783}: Fix possible usage of uninitialized memory in
operator.methodcaller.

@item 
bpo-27774@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27774}: Fix possible Py_DECREF on unowned object in _sre.

@item 
bpo-27760@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27760}: Fix possible integer overflow in binascii.b2a_qp.

@item 
bpo-27758@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27758}: Fix possible integer overflow in the _csv module for large
record lengths.

@item 
bpo-27568@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27568}: Prevent HTTPoxy attack (
@geindex Common Vulnerabilities and Exposures; CVE 2016-1000110
CVE 2016-1000110@footnote{https://www.cve.org/CVERecord?id=CVE-2016-1000110}). Ignore the
HTTP_PROXY variable when REQUEST_METHOD environment is set, which
indicates that the script is in CGI mode.

@item 
bpo-27656@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27656}: Do not assume sched.h defines any SCHED_* constants.

@item 
bpo-27130@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27130}: In the “zlib” module, fix handling of large buffers (typically
4 GiB) when compressing and decompressing.  Previously, inputs were
limited to 4 GiB, and compression and decompression operations did not
properly handle results of 4 GiB.

@item 
bpo-27533@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27533}: Release GIL in nt._isdir

@item 
bpo-17711@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17711}: Fixed unpickling by the persistent ID with protocol 0. Original
patch by Alexandre Vassalotti.

@item 
bpo-27522@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27522}: Avoid an unintentional reference cycle in email.feedparser.

@item 
bpo-26844@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26844}: Fix error message for imp.find_module() to refer to ‘path’
instead of ‘name’. Patch by Lev Maximov.

@item 
bpo-23804@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23804}: Fix SSL zero-length recv() calls to not block and not raise an
error about unclean EOF.

@item 
bpo-27466@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27466}: Change time format returned by http.cookie.time2netscape,
confirming the netscape cookie format and making it consistent with
documentation.

@item 
bpo-26664@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26664}: Fix activate.fish by removing mis-use of @code{$}.

@item 
bpo-22115@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22115}: Fixed tracing Tkinter variables: trace_vdelete() with wrong
mode no longer break tracing, trace_vinfo() now always returns a list of
pairs of strings, tracing in the “u” mode now works.

@item 
Fix a scoping issue in importlib.util.LazyLoader which triggered an
UnboundLocalError when lazy-loading a module that was already put into
sys.modules.

@item 
bpo-27079@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27079}: Fixed curses.ascii functions isblank(), iscntrl() and
ispunct().

@item 
bpo-26754@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26754}: Some functions (compile() etc) accepted a filename argument
encoded as an iterable of integers. Now only strings and byte-like objects
are accepted.

@item 
bpo-27048@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27048}: Prevents distutils failing on Windows when environment
variables contain non-ASCII characters

@item 
bpo-27330@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27330}: Fixed possible leaks in the ctypes module.

@item 
bpo-27238@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27238}: Got rid of bare excepts in the turtle module.  Original patch
by Jelle Zijlstra.

@item 
bpo-27122@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27122}: When an exception is raised within the context being managed by
a contextlib.ExitStack() and one of the exit stack generators catches and
raises it in a chain, do not re-raise the original exception when exiting,
let the new chained one through.  This avoids the 
@geindex Python 향상 제안; PEP 479
PEP 479@footnote{https://peps.python.org/pep-0479/} bug described
in issue25782.

@item 
bpo-26386@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26386}: Fixed ttk.TreeView selection operations with item id’s
containing spaces.

@item 
bpo-16182@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16182}: Fix various functions in the “readline” module to use the
locale encoding, and fix get_begidx() and get_endidx() to return code
point indexes.

@item 
bpo-27392@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27392}: Add loop.connect_accepted_socket(). Patch by Jim Fulton.

@item 
bpo-27930@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27930}: Improved behaviour of logging.handlers.QueueListener. Thanks to
Paulo Andrade and Petr Viktorin for the analysis and patch.

@item 
bpo-21201@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21201}: Improves readability of multiprocessing error message.  Thanks
to Wojciech Walczak for patch.

@item 
bpo-27456@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27456}: asyncio: Set TCP_NODELAY by default.

@item 
bpo-27906@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27906}: Fix socket accept exhaustion during high TCP traffic. Patch by
Kevin Conway.

@item 
bpo-28174@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28174}: Handle when SO_REUSEPORT isn’t properly supported. Patch by
Seth Michael Larson.

@item 
bpo-26654@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26654}: Inspect functools.partial in asyncio.Handle.__repr__. Patch by
iceboy.

@item 
bpo-26909@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26909}: Fix slow pipes IO in asyncio. Patch by INADA Naoki.

@item 
bpo-28176@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28176}: Fix callbacks race in asyncio.SelectorLoop.sock_connect.

@item 
bpo-27759@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27759}: Fix selectors incorrectly retain invalid file descriptors.
Patch by Mark Williams.

@item 
bpo-28368@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28368}: Refuse monitoring processes if the child watcher has no loop
attached. Patch by Vincent Michel.

@item 
bpo-28369@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28369}: Raise RuntimeError when transport’s FD is used with add_reader,
add_writer, etc.

@item 
bpo-28370@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28370}: Speedup asyncio.StreamReader.readexactly. Patch by Коренберг
Марк.

@item 
bpo-28371@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28371}: Deprecate passing asyncio.Handles to run_in_executor.

@item 
bpo-28372@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28372}: Fix asyncio to support formatting of non-python coroutines.

@item 
bpo-28399@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28399}: Remove UNIX socket from FS before binding. Patch by Коренберг
Марк.

@item 
bpo-27972@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27972}: Prohibit Tasks to await on themselves.

@item 
bpo-26923@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26923}: Fix asyncio.Gather to refuse being cancelled once all children
are done. Patch by Johannes Ebke.

@item 
bpo-26796@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26796}: Don’t configure the number of workers for default threadpool
executor. Initial patch by Hans Lawrenz.

@item 
bpo-28600@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28600}: Optimize loop.call_soon().

@item 
bpo-28613@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28613}: Fix get_event_loop() return the current loop if called from
coroutines/callbacks.

@item 
bpo-28639@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28639}: Fix inspect.isawaitable to always return bool Patch by Justin
Mayfield.

@item 
bpo-28652@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28652}: Make loop methods reject socket kinds they do not support.

@item 
bpo-28653@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28653}: Fix a refleak in functools.lru_cache.

@item 
bpo-28703@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28703}: Fix asyncio.iscoroutinefunction to handle Mock objects.

@item 
bpo-24142@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24142}: Reading a corrupt config file left the parser in an invalid
state.  Original patch by Florian Höch.

@item 
bpo-28990@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28990}: Fix SSL hanging if connection is closed before handshake
completed. (Patch by HoHo-Ho)
@end itemize

@node IDLE<57>,C API<77>,Library<193>,Python 3 5 3 release candidate 1
@anchor{whatsnew/changelog id994}@anchor{1f52}
@subsubsection IDLE



@itemize -

@item 
bpo-15308@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15308}: Add ‘interrupt execution’ (^C) to Shell menu. Patch by Roger
Serwy, updated by Bayard Randel.

@item 
bpo-27922@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27922}: Stop IDLE tests from ‘flashing’ gui widgets on the screen.

@item 
Add version to title of IDLE help window.

@item 
bpo-25564@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25564}: In section on IDLE – console differences, mention that using
exec means that __builtins__ is defined for each statement.

@item 
bpo-27714@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27714}: text_textview and test_autocomplete now pass when re-run in the
same process.  This occurs when test_idle fails when run with the -w
option but without -jn.  Fix warning from test_config.

@item 
bpo-25507@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25507}: IDLE no longer runs buggy code because of its tkinter imports.
Users must include the same imports required to run directly in Python.

@item 
bpo-27452@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27452}: add line counter and crc to IDLE configHandler test dump.

@item 
bpo-27365@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27365}: Allow non-ascii chars in IDLE NEWS.txt, for contributor names.

@item 
bpo-27245@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27245}: IDLE: Cleanly delete custom themes and key bindings.
Previously, when IDLE was started from a console or by import, a cascade
of warnings was emitted. Patch by Serhiy Storchaka.
@end itemize

@node C API<77>,Documentation<79>,IDLE<57>,Python 3 5 3 release candidate 1
@anchor{whatsnew/changelog id995}@anchor{1f53}
@subsubsection C API



@itemize -

@item 
bpo-28808@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28808}: PyUnicode_CompareWithASCIIString() now never raises exceptions.

@item 
bpo-26754@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26754}: PyUnicode_FSDecoder() accepted a filename argument encoded as
an iterable of integers. Now only strings and bytes-like objects are
accepted.
@end itemize

@node Documentation<79>,Tests<80>,C API<77>,Python 3 5 3 release candidate 1
@anchor{whatsnew/changelog id996}@anchor{1f54}
@subsubsection Documentation



@itemize -

@item 
bpo-28513@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28513}: Documented command-line interface of zipfile.
@end itemize

@node Tests<80>,Tools/Demos<55>,Documentation<79>,Python 3 5 3 release candidate 1
@anchor{whatsnew/changelog id997}@anchor{1f55}
@subsubsection Tests



@itemize -

@item 
bpo-28950@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28950}: Disallow -j0 to be combined with -T/-l/-M in regrtest command
line arguments.

@item 
bpo-28666@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28666}: Now test.support.rmtree is able to remove unwritable or
unreadable directories.

@item 
bpo-23839@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23839}: Various caches now are cleared before running every test file.

@item 
bpo-28409@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28409}: regrtest: fix the parser of command line arguments.

@item 
bpo-27787@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27787}: Call gc.collect() before checking each test for “dangling
threads”, since the dangling threads are weak references.

@item 
bpo-27369@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27369}: In test_pyexpat, avoid testing an error message detail that
changed in Expat 2.2.0.
@end itemize

@node Tools/Demos<55>,Windows<78>,Tests<80>,Python 3 5 3 release candidate 1
@anchor{whatsnew/changelog id998}@anchor{1f56}
@subsubsection Tools/Demos



@itemize -

@item 
bpo-27952@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27952}: Get Tools/scripts/fixcid.py working with Python 3 and the
current “re” module, avoid invalid Python backslash escapes, and fix a bug
parsing escaped C quote signs.

@item 
bpo-27332@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27332}: Fixed the type of the first argument of module-level functions
generated by Argument Clinic.  Patch by Petr Viktorin.

@item 
bpo-27418@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27418}: Fixed Tools/importbench/importbench.py.
@end itemize

@node Windows<78>,Build<91>,Tools/Demos<55>,Python 3 5 3 release candidate 1
@anchor{whatsnew/changelog id999}@anchor{1f57}
@subsubsection Windows



@itemize -

@item 
bpo-28251@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28251}: Improvements to help manuals on Windows.

@item 
bpo-28110@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28110}: launcher.msi has different product codes between 32-bit and
64-bit

@item 
bpo-25144@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25144}: Ensures TargetDir is set before continuing with custom install.

@item 
bpo-27469@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27469}: Adds a shell extension to the launcher so that drag and drop
works correctly.

@item 
bpo-27309@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27309}: Enabled proper Windows styles in python[w].exe manifest.
@end itemize

@node Build<91>,,Windows<78>,Python 3 5 3 release candidate 1
@anchor{whatsnew/changelog id1000}@anchor{1f58}
@subsubsection Build



@itemize -

@item 
bpo-29080@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=29080}: Removes hard dependency on hg.exe from PCBuild/build.bat

@item 
bpo-23903@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23903}: Added missed names to PC/python3.def.

@item 
bpo-10656@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10656}: Fix out-of-tree building on AIX.  Patch by Tristan Carel and
Michael Haubenwallner.

@item 
bpo-26359@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26359}: Rename –with-optimiations to –enable-optimizations.

@item 
bpo-28444@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28444}: Fix missing extensions modules when cross compiling.

@item 
bpo-28248@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28248}: Update Windows build and OS X installers to use OpenSSL 1.0.2j.

@item 
bpo-28258@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28258}: Fixed build with Estonian locale (python-config and distclean
targets in Makefile).  Patch by Arfrever Frehtes Taifersar Arahesis.

@item 
bpo-26661@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26661}: setup.py now detects system libffi with multiarch wrapper.

@item 
bpo-28066@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28066}: Fix the logic that searches build directories for generated
include files when building outside the source tree.

@item 
bpo-15819@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15819}: Remove redundant include search directory option for building
outside the source tree.

@item 
bpo-27566@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27566}: Fix clean target in freeze makefile (patch by Lisa Roach)

@item 
bpo-27705@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27705}: Update message in validate_ucrtbase.py

@item 
bpo-27983@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27983}: Cause lack of llvm-profdata tool when using clang as required
for PGO linking to be a configure time error rather than make time when
–with-optimizations is enabled.  Also improve our ability to find the
llvm-profdata tool on MacOS and some Linuxes.

@item 
bpo-26307@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26307}: The profile-opt build now applies PGO to the built-in modules.

@item 
bpo-26359@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26359}: Add the –with-optimizations configure flag.

@item 
bpo-27713@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27713}: Suppress spurious build warnings when updating importlib’s
bootstrap files. Patch by Xiang Zhang

@item 
bpo-25825@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25825}: Correct the references to Modules/python.exp and ld_so_aix,
which are required on AIX.  This updates references to an installation
path that was changed in 3.2a4, and undoes changed references to the build
tree that were made in 3.5.0a1.

@item 
bpo-27453@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27453}: CPP invocation in configure must use CPPFLAGS. Patch by Chi
Hsuan Yen.

@item 
bpo-27641@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27641}: The configure script now inserts comments into the makefile to
prevent the pgen and _freeze_importlib executables from being
cross-compiled.

@item 
bpo-26662@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26662}: Set PYTHON_FOR_GEN in configure as the Python program to be
used for file generation during the build.

@item 
bpo-10910@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10910}: Avoid C++ compilation errors on FreeBSD and OS X. Also update
FreedBSD version checks for the original ctype UTF-8 workaround.

@item 
bpo-28676@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28676}: Prevent missing ‘getentropy’ declaration warning on macOS.
Patch by Gareth Rees.
@end itemize

@node Python 3 5 2 final,Python 3 5 2 release candidate 1,Python 3 5 3 release candidate 1,Changelog
@anchor{whatsnew/changelog python-3-5-2-final}@anchor{1f59}
@subsection Python 3.5.2 final


`Release date: 2016-06-26'

@menu
* Core and Builtins: Core and Builtins<190>. 
* Tests: Tests<81>. 
* IDLE: IDLE<58>. 

@end menu

@node Core and Builtins<190>,Tests<81>,,Python 3 5 2 final
@anchor{whatsnew/changelog id1001}@anchor{1f5a}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-26930@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26930}: Update Windows builds to use OpenSSL 1.0.2h.
@end itemize

@node Tests<81>,IDLE<58>,Core and Builtins<190>,Python 3 5 2 final
@anchor{whatsnew/changelog id1002}@anchor{1f5b}
@subsubsection Tests



@itemize -

@item 
bpo-26867@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26867}: Ubuntu’s openssl OP_NO_SSLv3 is forced on by default; fix test.
@end itemize

@node IDLE<58>,,Tests<81>,Python 3 5 2 final
@anchor{whatsnew/changelog id1003}@anchor{1f5c}
@subsubsection IDLE



@itemize -

@item 
bpo-27365@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27365}: Allow non-ascii in idlelib/NEWS.txt - minimal part for 3.5.2.
@end itemize

@node Python 3 5 2 release candidate 1,Python 3 5 1 final,Python 3 5 2 final,Changelog
@anchor{whatsnew/changelog python-3-5-2-release-candidate-1}@anchor{1f5d}
@subsection Python 3.5.2 release candidate 1


`Release date: 2016-06-12'

@menu
* Security: Security<61>. 
* Core and Builtins: Core and Builtins<191>. 
* Library: Library<194>. 
* IDLE: IDLE<59>. 
* Documentation: Documentation<80>. 
* Tests: Tests<82>. 
* Build: Build<92>. 
* Windows: Windows<79>. 
* Tools/Demos: Tools/Demos<56>. 

@end menu

@node Security<61>,Core and Builtins<191>,,Python 3 5 2 release candidate 1
@anchor{whatsnew/changelog id1004}@anchor{1f5e}
@subsubsection Security



@itemize -

@item 
bpo-26556@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26556}: Update expat to 2.1.1, fixes 
@geindex Common Vulnerabilities and Exposures; CVE 2015-1283
CVE 2015-1283@footnote{https://www.cve.org/CVERecord?id=CVE-2015-1283}.

@item 
Fix TLS stripping vulnerability in smtplib, 
@geindex Common Vulnerabilities and Exposures; CVE 2016-0772
CVE 2016-0772@footnote{https://www.cve.org/CVERecord?id=CVE-2016-0772}. Reported by
Team Oststrom.

@item 
bpo-26839@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26839}: On Linux, @ref{745,,os.urandom()} now calls @code{getrandom()} with
@code{GRND_NONBLOCK} to fall back on reading @code{/dev/urandom} if the urandom
entropy pool is not initialized yet. Patch written by Colm Buckley.

@item 
bpo-26657@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26657}: Fix directory traversal vulnerability with http.server on
Windows.  This fixes a regression that was introduced in 3.3.4rc1 and
3.4.0rc1.  Based on patch by Philipp Hagemeister.

@item 
bpo-26313@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26313}: ssl.py _load_windows_store_certs fails if windows cert store is
empty. Patch by Baji.

@item 
bpo-25939@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25939}: On Windows open the cert store readonly in
ssl.enum_certificates.
@end itemize

@node Core and Builtins<191>,Library<194>,Security<61>,Python 3 5 2 release candidate 1
@anchor{whatsnew/changelog id1005}@anchor{1f5f}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-27066@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27066}: Fixed SystemError if a custom opener (for open()) returns a
negative number without setting an exception.

@item 
bpo-20041@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20041}: Fixed TypeError when frame.f_trace is set to None. Patch by
Xavier de Gaye.

@item 
bpo-26168@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26168}: Fixed possible refleaks in failing Py_BuildValue() with the “N”
format unit.

@item 
bpo-26991@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26991}: Fix possible refleak when creating a function with annotations.

@item 
bpo-27039@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27039}: Fixed bytearray.remove() for values greater than 127.  Patch by
Joe Jevnik.

@item 
bpo-23640@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23640}: int.from_bytes() no longer bypasses constructors for
subclasses.

@item 
bpo-26811@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26811}: gc.get_objects() no longer contains a broken tuple with NULL
pointer.

@item 
bpo-20120@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20120}: Use RawConfigParser for .pypirc parsing, removing support for
interpolation unintentionally added with move to Python 3. Behavior no
longer does any interpolation in .pypirc files, matching behavior in
Python 2.7 and Setuptools 19.0.

@item 
bpo-26659@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26659}: Make the builtin slice type support cycle collection.

@item 
bpo-26718@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26718}: super.__init__ no longer leaks memory if called multiple times.
NOTE: A direct call of super.__init__ is not endorsed!

@item 
bpo-25339@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25339}: PYTHONIOENCODING now has priority over locale in setting the
error handler for stdin and stdout.

@item 
bpo-26494@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26494}: Fixed crash on iterating exhausting iterators. Affected classes
are generic sequence iterators, iterators of str, bytes, bytearray, list,
tuple, set, frozenset, dict, OrderedDict, corresponding views and
os.scandir() iterator.

@item 
bpo-26581@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26581}: If coding cookie is specified multiple times on a line in
Python source code file, only the first one is taken to account.

@item 
bpo-26464@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26464}: Fix str.translate() when string is ASCII and first replacements
removes character, but next replacement uses a non-ASCII character or a
string longer than 1 character. Regression introduced in Python 3.5.0.

@item 
bpo-22836@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22836}: Ensure exception reports from PyErr_Display() and
PyErr_WriteUnraisable() are sensible even when formatting them produces
secondary errors.  This affects the reports produced by
sys.__excepthook__() and when __del__() raises an exception.

@item 
bpo-26302@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26302}: Correct behavior to reject comma as a legal character for
cookie names.

@item 
bpo-4806@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4806}: Avoid masking the original TypeError exception when using star
(@code{*}) unpacking in function calls.  Based on patch by Hagen Fürstenau
and Daniel Urban.

@item 
bpo-27138@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27138}: Fix the doc comment for FileFinder.find_spec().

@item 
bpo-26154@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26154}: Add a new private _PyThreadState_UncheckedGet() function to get
the current Python thread state, but don’t issue a fatal error if it is
NULL. This new function must be used instead of accessing directly the
_PyThreadState_Current variable.  The variable is no more exposed since
Python 3.5.1 to hide the exact implementation of atomic C types, to avoid
compiler issues.

@item 
bpo-26194@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26194}: Deque.insert() gave odd results for bounded deques that had
reached their maximum size.  Now an IndexError will be raised when
attempting to insert into a full deque.

@item 
bpo-25843@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25843}: When compiling code, don’t merge constants if they are equal
but have a different types. For example, @code{f1, f2 = lambda: 1, lambda:
1.0} is now correctly compiled to two different functions: @code{f1()}
returns @code{1} (@code{int}) and @code{f2()} returns @code{1.0} (@code{int}), even if
@code{1} and @code{1.0} are equal.

@item 
bpo-22995@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22995}: [UPDATE] Comment out the one of the pickleability tests in
_PyObject_GetState() due to regressions observed in Cython-based projects.

@item 
bpo-25961@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25961}: Disallowed null characters in the type name.

@item 
bpo-25973@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25973}: Fix segfault when an invalid nonlocal statement binds a name
starting with two underscores.

@item 
bpo-22995@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22995}: Instances of extension types with a state that aren’t
subclasses of list or dict and haven’t implemented any pickle-related
methods (__reduce__, __reduce_ex__, __getnewargs__, __getnewargs_ex__, or
__getstate__), can no longer be pickled.  Including memoryview.

@item 
bpo-20440@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20440}: Massive replacing unsafe attribute setting code with special
macro Py_SETREF.

@item 
bpo-25766@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25766}: Special method __bytes__() now works in str subclasses.

@item 
bpo-25421@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25421}: __sizeof__ methods of builtin types now use dynamic basic size.
This allows sys.getsize() to work correctly with their subclasses with
__slots__ defined.

@item 
bpo-25709@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25709}: Fixed problem with in-place string concatenation and utf-8
cache.

@item 
bpo-27147@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27147}: Mention 
@geindex Python 향상 제안; PEP 420
PEP 420@footnote{https://peps.python.org/pep-0420/} in the importlib docs.

@item 
bpo-24097@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24097}: Fixed crash in object.__reduce__() if slot name is freed inside
__getattr__.

@item 
bpo-24731@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24731}: Fixed crash on converting objects with special methods
__bytes__, __trunc__, and __float__ returning instances of subclasses of
bytes, int, and float to subclasses of bytes, int, and float
correspondingly.

@item 
bpo-26478@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26478}: Fix semantic bugs when using binary operators with dictionary
views and tuples.

@item 
bpo-26171@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26171}: Fix possible integer overflow and heap corruption in
zipimporter.get_data().

@item 
bpo-25660@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25660}: Fix TAB key behaviour in REPL with readline.

@item 
bpo-25887@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25887}: Raise a RuntimeError when a coroutine object is awaited more
than once.

@item 
bpo-27243@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27243}: Update the __aiter__ protocol: instead of returning an
awaitable that resolves to an asynchronous iterator, the asynchronous
iterator should be returned directly.  Doing the former will trigger a
PendingDeprecationWarning.
@end itemize

@node Library<194>,IDLE<59>,Core and Builtins<191>,Python 3 5 2 release candidate 1
@anchor{whatsnew/changelog id1006}@anchor{1f60}
@subsubsection Library



@itemize -

@item 
bpo-21386@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21386}: Implement missing IPv4Address.is_global property.  It was
documented since 07a5610bae9d.  Initial patch by Roger Luethi.

@item 
bpo-20900@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20900}: distutils register command now decodes HTTP responses
correctly.  Initial patch by ingrid.

@item 
A new version of typing.py provides several new classes and features:
@@overload outside stubs, Reversible, DefaultDict, Text, ContextManager,
Type[], NewType(), TYPE_CHECKING, and numerous bug fixes (note that some
of the new features are not yet implemented in mypy or other static
analyzers). Also classes for 
@geindex Python 향상 제안; PEP 492
PEP 492@footnote{https://peps.python.org/pep-0492/} (Awaitable, AsyncIterable,
AsyncIterator) have been added (in fact they made it into 3.5.1 but were
never mentioned).

@item 
bpo-25738@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25738}: Stop http.server.BaseHTTPRequestHandler.send_error() from
sending a message body for 205 Reset Content.  Also, don’t send Content
header fields in responses that don’t have a body.  Patch by Susumu
Koshiba.

@item 
bpo-21313@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21313}: Fix the “platform” module to tolerate when sys.version contains
truncated build information.

@item 
bpo-27164@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27164}: In the zlib module, allow decompressing raw Deflate streams
with a predefined zdict.  Based on patch by Xiang Zhang.

@item 
bpo-24291@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24291}: Fix wsgiref.simple_server.WSGIRequestHandler to completely
write data to the client.  Previously it could do partial writes and
truncate data.  Also, wsgiref.handler.ServerHandler can now handle stdout
doing partial writes, but this is deprecated.

@item 
bpo-26809@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26809}: Add @code{__all__} to @ref{d8,,string}.  Patch by Emanuel Barry.

@item 
bpo-26373@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26373}: subprocess.Popen.communicate now correctly ignores
BrokenPipeError when the child process dies before .communicate() is
called in more/all circumstances.

@item 
bpo-21776@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21776}: distutils.upload now correctly handles HTTPError. Initial patch
by Claudiu Popa.

@item 
bpo-27114@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27114}: Fix SSLContext._load_windows_store_certs fails with
PermissionError

@item 
bpo-18383@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18383}: Avoid creating duplicate filters when using filterwarnings and
simplefilter. Based on patch by Alex Shkop.

@item 
bpo-27057@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27057}: Fix os.set_inheritable() on Android, ioctl() is blocked by
SELinux and fails with EACCESS. The function now falls back to fcntl().
Patch written by Michał Bednarski.

@item 
bpo-27014@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27014}: Fix infinite recursion using typing.py.  Thanks to Kalle Tuure!

@item 
bpo-14132@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14132}: Fix urllib.request redirect handling when the target only has a
query string.  Original fix by Ján Janech.

@item 
bpo-17214@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17214}: The “urllib.request” module now percent-encodes non-ASCII bytes
found in redirect target URLs.  Some servers send Location header fields
with non-ASCII bytes, but “http.client” requires the request target to be
ASCII-encodable, otherwise a UnicodeEncodeError is raised.  Based on patch
by Christian Heimes.

@item 
bpo-26892@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26892}: Honor debuglevel flag in urllib.request.HTTPHandler. Patch
contributed by Chi Hsuan Yen.

@item 
bpo-22274@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22274}: In the subprocess module, allow stderr to be redirected to
stdout even when stdout is not redirected.  Patch by Akira Li.

@item 
bpo-26807@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26807}: mock_open ‘files’ no longer error on readline at end of file.
Patch from Yolanda Robla.

@item 
bpo-25745@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25745}: Fixed leaking a userptr in curses panel destructor.

@item 
bpo-26977@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26977}: Removed unnecessary, and ignored, call to sum of squares helper
in statistics.pvariance.

@item 
bpo-26881@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26881}: The modulefinder module now supports extended opcode arguments.

@item 
bpo-23815@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23815}: Fixed crashes related to directly created instances of types in
_tkinter and curses.panel modules.

@item 
bpo-17765@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17765}: weakref.ref() no longer silently ignores keyword arguments.
Patch by Georg Brandl.

@item 
bpo-26873@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26873}: xmlrpc now raises ResponseError on unsupported type tags
instead of silently return incorrect result.

@item 
bpo-26711@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26711}: Fixed the comparison of plistlib.Data with other types.

@item 
bpo-24114@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24114}: Fix an uninitialized variable in @code{ctypes.util}. The bug only
occurs on SunOS when the ctypes implementation searches for the @code{crle}
program. Patch by Xiang Zhang.  Tested on SunOS by Kees Bos.

@item 
bpo-26864@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26864}: In urllib.request, change the proxy bypass host checking
against no_proxy to be case-insensitive, and to not match unrelated host
names that happen to have a bypassed hostname as a suffix.  Patch by Xiang
Zhang.

@item 
bpo-26634@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26634}: recursive_repr() now sets __qualname__ of wrapper.  Patch by
Xiang Zhang.

@item 
bpo-26804@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26804}: urllib.request will prefer lower_case proxy environment
variables over UPPER_CASE or Mixed_Case ones. Patch contributed by
Hans-Peter Jansen.

@item 
bpo-26837@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26837}: assertSequenceEqual() now correctly outputs non-stringified
differing items (like bytes in the -b mode).  This affects
assertListEqual() and assertTupleEqual().

@item 
bpo-26041@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26041}: Remove “will be removed in Python 3.7” from deprecation
messages of platform.dist() and platform.linux_distribution(). Patch by
Kumaripaba Miyurusara Athukorala.

@item 
bpo-26822@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26822}: itemgetter, attrgetter and methodcaller objects no longer
silently ignore keyword arguments.

@item 
bpo-26733@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26733}: Disassembling a class now disassembles class and static
methods. Patch by Xiang Zhang.

@item 
bpo-26801@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26801}: Fix error handling in @ref{1308,,shutil.get_terminal_size()}, catch
@ref{5ee,,AttributeError} instead of @ref{452,,NameError}. Patch written by
Emanuel Barry.

@item 
bpo-24838@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24838}: tarfile’s ustar and gnu formats now correctly calculate name
and link field limits for multibyte character encodings like utf-8.

@item 
bpo-26717@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26717}: Stop encoding Latin-1-ized WSGI paths with UTF-8.  Patch by
Anthony Sottile.

@item 
bpo-26735@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26735}: Fix @ref{745,,os.urandom()} on Solaris 11.3 and newer when reading
more than 1,024 bytes: call @code{getrandom()} multiple times with a limit of
1024 bytes per call.

@item 
bpo-16329@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16329}: Add .webm to mimetypes.types_map.  Patch by Giampaolo Rodola’.

@item 
bpo-13952@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13952}: Add .csv to mimetypes.types_map.  Patch by Geoff Wilson.

@item 
bpo-26709@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26709}: Fixed Y2038 problem in loading binary PLists.

@item 
bpo-23735@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23735}: Handle terminal resizing with Readline 6.3+ by installing our
own SIGWINCH handler.  Patch by Eric Price.

@item 
bpo-26586@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26586}: In http.server, respond with “413 Request header fields too
large” if there are too many header fields to parse, rather than killing
the connection and raising an unhandled exception.  Patch by Xiang Zhang.

@item 
bpo-22854@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22854}: Change BufferedReader.writable() and BufferedWriter.readable()
to always return False.

@item 
bpo-25195@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25195}: Fix a regression in mock.MagicMock. _Call is a subclass of
tuple (changeset 3603bae63c13 only works for classes) so we need to
implement __ne__ ourselves.  Patch by Andrew Plummer.

@item 
bpo-26644@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26644}: Raise ValueError rather than SystemError when a negative length
is passed to SSLSocket.recv() or read().

@item 
bpo-23804@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23804}: Fix SSL recv(0) and read(0) methods to return zero bytes
instead of up to 1024.

@item 
bpo-26616@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26616}: Fixed a bug in datetime.astimezone() method.

@item 
bpo-21925@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21925}: @ref{1df5,,warnings.formatwarning()} now catches exceptions on
@code{linecache.getline(...)} to be able to log @ref{54e,,ResourceWarning}
emitted late during the Python shutdown process.

@item 
bpo-24266@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24266}: Ctrl+C during Readline history search now cancels the search
mode when compiled with Readline 7.

@item 
bpo-26560@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26560}: Avoid potential ValueError in BaseHandler.start_response.
Initial patch by Peter Inglesby.

@item 
bpo-26569@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26569}: Fix @ref{a2c,,pyclbr.readmodule()} and @ref{a2d,,pyclbr.readmodule_ex()}
to support importing packages.

@item 
bpo-26499@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26499}: Account for remaining Content-Length in HTTPResponse.readline()
and read1(). Based on patch by Silent Ghost. Also document that
HTTPResponse now supports these methods.

@item 
bpo-25320@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25320}: Handle sockets in directories unittest discovery is scanning.
Patch from Victor van den Elzen.

@item 
bpo-16181@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16181}: cookiejar.http2time() now returns None if year is higher than
datetime.MAXYEAR.

@item 
bpo-26513@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26513}: Fixes platform module detection of Windows Server

@item 
bpo-23718@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23718}: Fixed parsing time in week 0 before Jan 1.  Original patch by
Tamás Bence Gedai.

@item 
bpo-20589@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20589}: Invoking Path.owner() and Path.group() on Windows now raise
NotImplementedError instead of ImportError.

@item 
bpo-26177@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26177}: Fixed the keys() method for Canvas and Scrollbar widgets.

@item 
bpo-15068@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15068}: Got rid of excessive buffering in the fileinput module. The
bufsize parameter is no longer used.

@item 
bpo-2202@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2202}: Fix UnboundLocalError in
AbstractDigestAuthHandler.get_algorithm_impls. Initial patch by Mathieu
Dupuy.

@item 
bpo-25718@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25718}: Fixed pickling and copying the accumulate() iterator with total
is None.

@item 
bpo-26475@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26475}: Fixed debugging output for regular expressions with the (?x)
flag.

@item 
bpo-26457@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26457}: Fixed the subnets() methods in IP network classes for the case
when resulting prefix length is equal to maximal prefix length. Based on
patch by Xiang Zhang.

@item 
bpo-26385@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26385}: Remove the file if the internal open() call in
NamedTemporaryFile() fails. Patch by Silent Ghost.

@item 
bpo-26402@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26402}: Fix XML-RPC client to retry when the server shuts down a
persistent connection.  This was a regression related to the new
http.client.RemoteDisconnected exception in 3.5.0a4.

@item 
bpo-25913@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25913}: Leading @code{<~} is optional now in base64.a85decode() with
adobe=True.  Patch by Swati Jaiswal.

@item 
bpo-26186@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26186}: Remove an invalid type check in importlib.util.LazyLoader.

@item 
bpo-26367@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26367}: importlib.__import__() raises SystemError like
builtins.__import__() when @code{level} is specified but without an
accompanying package specified.

@item 
bpo-26309@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26309}: In the “socketserver” module, shut down the request (closing
the connected socket) when verify_request() returns false.  Patch by Aviv
Palivoda.

@item 
bpo-25995@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25995}: os.walk() no longer uses FDs proportional to the tree depth.

@item 
bpo-26117@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26117}: The os.scandir() iterator now closes file descriptor not only
when the iteration is finished, but when it was failed with error.

@item 
bpo-25911@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25911}: Restored support of bytes paths in os.walk() on Windows.

@item 
bpo-26045@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26045}: Add UTF-8 suggestion to error message when posting a
non-Latin-1 string with http.client.

@item 
bpo-12923@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12923}: Reset FancyURLopener’s redirect counter even if there is an
exception. Based on patches by Brian Brazil and Daniel Rocco.

@item 
bpo-25945@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25945}: Fixed a crash when unpickle the functools.partial object with
wrong state. Fixed a leak in failed functools.partial constructor. “args”
and “keywords” attributes of functools.partial have now always types tuple
and dict correspondingly.

@item 
bpo-26202@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26202}: copy.deepcopy() now correctly copies range() objects with
non-atomic attributes.

@item 
bpo-23076@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23076}: Path.glob() now raises a ValueError if it’s called with an
invalid pattern. Patch by Thomas Nyberg.

@item 
bpo-19883@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19883}: Fixed possible integer overflows in zipimport.

@item 
bpo-26227@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26227}: On Windows, getnameinfo(), gethostbyaddr() and
gethostbyname_ex() functions of the socket module now decode the hostname
from the ANSI code page rather than UTF-8.

@item 
bpo-26147@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26147}: xmlrpc now works with strings not encodable with used non-UTF-8
encoding.

@item 
bpo-25935@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25935}: Garbage collector now breaks reference loops with OrderedDict.

@item 
bpo-16620@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16620}: Fixed AttributeError in msilib.Directory.glob().

@item 
bpo-26013@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26013}: Added compatibility with broken protocol 2 pickles created in
old Python 3 versions (3.4.3 and lower).

@item 
bpo-25850@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25850}: Use cross-compilation by default for 64-bit Windows.

@item 
bpo-17633@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17633}: Improve zipimport’s support for namespace packages.

@item 
bpo-24705@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24705}: Fix sysconfig._parse_makefile not expanding $@{@} vars appearing
before $() vars.

@item 
bpo-22138@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22138}: Fix mock.patch behavior when patching descriptors. Restore
original values after patching. Patch contributed by Sean McCully.

@item 
bpo-25672@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25672}: In the ssl module, enable the SSL_MODE_RELEASE_BUFFERS mode
option if it is safe to do so.

@item 
bpo-26012@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26012}: Don’t traverse into symlinks for @code{**} pattern in
pathlib.Path.[r]glob().

@item 
bpo-24120@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24120}: Ignore PermissionError when traversing a tree with
pathlib.Path.[r]glob(). Patch by Ulrich Petri.

@item 
bpo-25447@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25447}: fileinput now uses sys.stdin as-is if it does not have a buffer
attribute (restores backward compatibility).

@item 
bpo-25447@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25447}: Copying the lru_cache() wrapper object now always works,
independently from the type of the wrapped object (by returning the
original object unchanged).

@item 
bpo-24103@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24103}: Fixed possible use after free in ElementTree.XMLPullParser.

@item 
bpo-25860@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25860}: os.fwalk() no longer skips remaining directories when error
occurs. Original patch by Samson Lee.

@item 
bpo-25914@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25914}: Fixed and simplified OrderedDict.__sizeof__.

@item 
bpo-25902@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25902}: Fixed various refcount issues in ElementTree iteration.

@item 
bpo-25717@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25717}: Restore the previous behaviour of tolerating most fstat()
errors when opening files.  This was a regression in 3.5a1, and stopped
anonymous temporary files from working in special cases.

@item 
bpo-24903@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24903}: Fix regression in number of arguments compileall accepts when
‘-d’ is specified.  The check on the number of arguments has been dropped
completely as it never worked correctly anyway.

@item 
bpo-25764@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25764}: In the subprocess module, preserve any exception caused by
fork() failure when preexec_fn is used.

@item 
bpo-6478@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6478}: _strptime’s regexp cache now is reset after changing timezone
with time.tzset().

@item 
bpo-14285@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14285}: When executing a package with the “python -m package” option,
and package initialization fails, a proper traceback is now reported.  The
“runpy” module now lets exceptions from package initialization pass back
to the caller, rather than raising ImportError.

@item 
bpo-19771@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19771}: Also in runpy and the “-m” option, omit the irrelevant message
“… is a package and cannot be directly executed” if the package could
not even be initialized (e.g. due to a bad @code{*.pyc} file).

@item 
bpo-25177@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25177}: Fixed problem with the mean of very small and very large
numbers. As a side effect, statistics.mean and statistics.variance should
be significantly faster.

@item 
bpo-25718@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25718}: Fixed copying object with state with boolean value is false.

@item 
bpo-10131@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10131}: Fixed deep copying of minidom documents.  Based on patch by
Marian Ganisin.

@item 
bpo-25725@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25725}: Fixed a reference leak in pickle.loads() when unpickling
invalid data including tuple instructions.

@item 
bpo-25663@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25663}: In the Readline completer, avoid listing duplicate global
names, and search the global namespace before searching builtins.

@item 
bpo-25688@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25688}: Fixed file leak in ElementTree.iterparse() raising an error.

@item 
bpo-23914@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23914}: Fixed SystemError raised by unpickler on broken pickle data.

@item 
bpo-25691@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25691}: Fixed crash on deleting ElementTree.Element attributes.

@item 
bpo-25624@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25624}: ZipFile now always writes a ZIP_STORED header for directory
entries.  Patch by Dingyuan Wang.

@item 
Skip getaddrinfo if host is already resolved. Patch by A. Jesse Jiryu
Davis.

@item 
bpo-26050@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26050}: Add asyncio.StreamReader.readuntil() method. Patch by Марк
Коренберг.

@item 
bpo-25924@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25924}: Avoid unnecessary serialization of getaddrinfo(3) calls on OS X
versions 10.5 or higher.  Original patch by A. Jesse Jiryu Davis.

@item 
bpo-26406@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26406}: Avoid unnecessary serialization of getaddrinfo(3) calls on
current versions of OpenBSD and NetBSD.  Patch by A. Jesse Jiryu Davis.

@item 
bpo-26848@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26848}: Fix asyncio/subprocess.communicate() to handle empty input.
Patch by Jack O’Connor.

@item 
bpo-27040@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27040}: Add loop.get_exception_handler method

@item 
bpo-27041@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27041}: asyncio: Add loop.create_future method

@item 
bpo-27223@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27223}: asyncio: Fix _read_ready and _write_ready to respect
_conn_lost. Patch by Łukasz Langa.

@item 
bpo-22970@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22970}: asyncio: Fix inconsistency cancelling Condition.wait. Patch by
David Coles.
@end itemize

@node IDLE<59>,Documentation<80>,Library<194>,Python 3 5 2 release candidate 1
@anchor{whatsnew/changelog id1007}@anchor{1f61}
@subsubsection IDLE



@itemize -

@item 
bpo-5124@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5124}: Paste with text selected now replaces the selection on X11. This
matches how paste works on Windows, Mac, most modern Linux apps, and ttk
widgets. Original patch by Serhiy Storchaka.

@item 
bpo-24759@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24759}: Make clear in idlelib.idle_test.__init__ that the directory is
a private implementation of test.test_idle and tool for maintainers.

@item 
bpo-27196@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27196}: Stop ‘ThemeChanged’ warnings when running IDLE tests. These
persisted after other warnings were suppressed in #20567. Apply Serhiy
Storchaka’s update_idletasks solution to four test files. Record this
additional advice in idle_test/README.txt

@item 
bpo-20567@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20567}: Revise idle_test/README.txt with advice about avoiding tk
warning messages from tests.  Apply advice to several IDLE tests.

@item 
bpo-27117@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27117}: Make colorizer htest and turtledemo work with dark themes. Move
code for configuring text widget colors to a new function.

@item 
bpo-26673@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26673}: When tk reports font size as 0, change to size 10. Such fonts
on Linux prevented the configuration dialog from opening.

@item 
bpo-21939@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21939}: Add test for IDLE’s percolator. Original patch by Saimadhav
Heblikar.

@item 
bpo-21676@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21676}: Add test for IDLE’s replace dialog. Original patch by Saimadhav
Heblikar.

@item 
bpo-18410@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18410}: Add test for IDLE’s search dialog. Original patch by Westley
Martínez.

@item 
bpo-21703@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21703}: Add test for IDLE’s undo delegator. Original patch by Saimadhav
Heblikar .

@item 
bpo-27044@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27044}: Add ConfigDialog.remove_var_callbacks to stop memory leaks.

@item 
bpo-23977@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23977}: Add more asserts to test_delegator.

@item 
bpo-20640@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20640}: Add tests for idlelib.configHelpSourceEdit. Patch by Saimadhav
Heblikar.

@item 
In the ‘IDLE-console differences’ section of the IDLE doc, clarify how
running with IDLE affects sys.modules and the standard streams.

@item 
bpo-25507@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25507}: fix incorrect change in IOBinding that prevented printing.
Augment IOBinding htest to include all major IOBinding functions.

@item 
bpo-25905@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25905}: Revert unwanted conversion of ‘ to ’ RIGHT SINGLE QUOTATION
MARK in README.txt and open this and NEWS.txt with ‘ascii’. Re-encode
CREDITS.txt to utf-8 and open it with ‘utf-8’.
@end itemize

@node Documentation<80>,Tests<82>,IDLE<59>,Python 3 5 2 release candidate 1
@anchor{whatsnew/changelog id1008}@anchor{1f62}
@subsubsection Documentation



@itemize -

@item 
bpo-19489@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19489}: Moved the search box from the sidebar to the header and footer
of each page. Patch by Ammar Askar.

@item 
bpo-24136@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24136}: Document the new 
@geindex Python 향상 제안; PEP 448
PEP 448@footnote{https://peps.python.org/pep-0448/} unpacking syntax of 3.5.

@item 
bpo-26736@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26736}: Used HTTPS for external links in the documentation if possible.

@item 
bpo-6953@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6953}: Rework the Readline module documentation to group related
functions together, and add more details such as what underlying Readline
functions and variables are accessed.

@item 
bpo-23606@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23606}: Adds note to ctypes documentation regarding cdll.msvcrt.

@item 
bpo-25500@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25500}: Fix documentation to not claim that __import__ is searched for
in the global scope.

@item 
bpo-26014@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26014}: Update 3.x packaging documentation: * “See also” links to the
new docs are now provided in the legacy pages * links to setuptools
documentation have been updated
@end itemize

@node Tests<82>,Build<92>,Documentation<80>,Python 3 5 2 release candidate 1
@anchor{whatsnew/changelog id1009}@anchor{1f63}
@subsubsection Tests



@itemize -

@item 
bpo-21916@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21916}: Added tests for the turtle module.  Patch by ingrid, Gregory
Loyse and Jelle Zijlstra.

@item 
bpo-26523@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26523}: The multiprocessing thread pool (multiprocessing.dummy.Pool)
was untested.

@item 
bpo-26015@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26015}: Added new tests for pickling iterators of mutable sequences.

@item 
bpo-26325@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26325}: Added test.support.check_no_resource_warning() to check that no
ResourceWarning is emitted.

@item 
bpo-25940@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25940}: Changed test_ssl to use self-signed.pythontest.net.  This
avoids relying on svn.python.org, which recently changed root certificate.

@item 
bpo-25616@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25616}: Tests for OrderedDict are extracted from test_collections into
separate file test_ordered_dict.

@item 
bpo-26583@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26583}: Skip test_timestamp_overflow in test_import if bytecode files
cannot be written.
@end itemize

@node Build<92>,Windows<79>,Tests<82>,Python 3 5 2 release candidate 1
@anchor{whatsnew/changelog id1010}@anchor{1f64}
@subsubsection Build



@itemize -

@item 
bpo-26884@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26884}: Fix linking extension modules for cross builds. Patch by Xavier
de Gaye.

@item 
bpo-22359@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22359}: Disable the rules for running _freeze_importlib and pgen when
cross-compiling.  The output of these programs is normally saved with the
source code anyway, and is still regenerated when doing a native build.
Patch by Xavier de Gaye.

@item 
bpo-27229@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27229}: Fix the cross-compiling pgen rule for in-tree builds.  Patch by
Xavier de Gaye.

@item 
bpo-21668@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21668}: Link audioop, _datetime, _ctypes_test modules to libm, except
on Mac OS X. Patch written by Xavier de Gaye.

@item 
bpo-25702@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25702}: A –with-lto configure option has been added that will enable
link time optimizations at build time during a make profile-opt. Some
compilers and toolchains are known to not produce stable code when using
LTO, be sure to test things thoroughly before relying on it. It can
provide a few % speed up over profile-opt alone.

@item 
bpo-26624@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26624}: Adds validation of ucrtbase[d].dll version with warning for old
versions.

@item 
bpo-17603@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17603}: Avoid error about nonexistent fileblocks.o file by using a
lower-level check for st_blocks in struct stat.

@item 
bpo-26079@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26079}: Fixing the build output folder for tix-8.4.3.6. Patch by Bjoern
Thiel.

@item 
bpo-26465@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26465}: Update Windows builds to use OpenSSL 1.0.2g.

@item 
bpo-24421@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24421}: Compile Modules/_math.c once, before building extensions.
Previously it could fail to compile properly if the math and cmath builds
were concurrent.

@item 
bpo-25348@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25348}: Added @code{--pgo} and @code{--pgo-job} arguments to
@code{PCbuild\build.bat} for building with Profile-Guided Optimization.  The
old @code{PCbuild\build_pgo.bat} script is now deprecated, and simply calls
@code{PCbuild\build.bat --pgo %*}.

@item 
bpo-25827@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25827}: Add support for building with ICC to @code{configure}, including a
new @code{--with-icc} flag.

@item 
bpo-25696@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25696}: Fix installation of Python on UNIX with make -j9.

@item 
bpo-26930@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26930}: Update OS X 10.5+ 32-bit-only installer to build and link with
OpenSSL 1.0.2h.

@item 
bpo-26268@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26268}: Update Windows builds to use OpenSSL 1.0.2f.

@item 
bpo-25136@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25136}: Support Apple Xcode 7’s new textual SDK stub libraries.

@item 
bpo-24324@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24324}: Do not enable unreachable code warnings when using gcc as the
option does not work correctly in older versions of gcc and has been
silently removed as of gcc-4.5.
@end itemize

@node Windows<79>,Tools/Demos<56>,Build<92>,Python 3 5 2 release candidate 1
@anchor{whatsnew/changelog id1011}@anchor{1f65}
@subsubsection Windows



@itemize -

@item 
bpo-27053@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=27053}: Updates make_zip.py to correctly generate library ZIP file.

@item 
bpo-26268@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26268}: Update the prepare_ssl.py script to handle OpenSSL releases
that don’t include the contents of the include directory (that is, 1.0.2e
and later).

@item 
bpo-26071@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26071}: bdist_wininst created binaries fail to start and find 32bit
Python

@item 
bpo-26073@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26073}: Update the list of magic numbers in launcher

@item 
bpo-26065@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26065}: Excludes venv from library when generating embeddable distro.

@item 
bpo-17500@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17500}: Remove unused and outdated icons. (See also:
@indicateurl{https://github.com/python/pythondotorg/issues/945})
@end itemize

@node Tools/Demos<56>,,Windows<79>,Python 3 5 2 release candidate 1
@anchor{whatsnew/changelog id1012}@anchor{1f66}
@subsubsection Tools/Demos



@itemize -

@item 
bpo-26799@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26799}: Fix python-gdb.py: don’t get C types once when the Python code
is loaded, but get C types on demand. The C types can change if
python-gdb.py is loaded before the Python executable. Patch written by
Thomas Ilsche.

@item 
bpo-26271@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26271}: Fix the Freeze tool to properly use flags passed through
configure. Patch by Daniel Shaulov.

@item 
bpo-26489@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26489}: Add dictionary unpacking support to Tools/parser/unparse.py.
Patch by Guo Ci Teo.

@item 
bpo-26316@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=26316}: Fix variable name typo in Argument Clinic.
@end itemize

@node Python 3 5 1 final,Python 3 5 1 release candidate 1,Python 3 5 2 release candidate 1,Changelog
@anchor{whatsnew/changelog python-3-5-1-final}@anchor{1f67}
@subsection Python 3.5.1 final


`Release date: 2015-12-06'

@menu
* Core and Builtins: Core and Builtins<192>. 
* Windows: Windows<80>. 

@end menu

@node Core and Builtins<192>,Windows<80>,,Python 3 5 1 final
@anchor{whatsnew/changelog id1013}@anchor{1f68}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-25709@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25709}: Fixed problem with in-place string concatenation and utf-8
cache.
@end itemize

@node Windows<80>,,Core and Builtins<192>,Python 3 5 1 final
@anchor{whatsnew/changelog id1014}@anchor{1f69}
@subsubsection Windows



@itemize -

@item 
bpo-25715@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25715}: Python 3.5.1 installer shows wrong upgrade path and incorrect
logic for launcher detection.
@end itemize

@node Python 3 5 1 release candidate 1,Python 3 5 0 final,Python 3 5 1 final,Changelog
@anchor{whatsnew/changelog python-3-5-1-release-candidate-1}@anchor{1f6a}
@subsection Python 3.5.1 release candidate 1


`Release date: 2015-11-22'

@menu
* Core and Builtins: Core and Builtins<193>. 
* Library: Library<195>. 
* IDLE: IDLE<60>. 
* Documentation: Documentation<81>. 
* Tests: Tests<83>. 
* Build: Build<93>. 
* Windows: Windows<81>. 
* Tools/Demos: Tools/Demos<57>. 

@end menu

@node Core and Builtins<193>,Library<195>,,Python 3 5 1 release candidate 1
@anchor{whatsnew/changelog id1015}@anchor{1f6b}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-25630@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25630}: Fix a possible segfault during argument parsing in functions
that accept filesystem paths.

@item 
bpo-23564@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23564}: Fixed a partially broken sanity check in the _posixsubprocess
internals regarding how fds_to_pass were passed to the child.  The bug had
no actual impact as subprocess.py already avoided it.

@item 
bpo-25388@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25388}: Fixed tokenizer crash when processing undecodable source code
with a null byte.

@item 
bpo-25462@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25462}: The hash of the key now is calculated only once in most
operations in C implementation of OrderedDict.

@item 
bpo-22995@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22995}: Default implementation of __reduce__ and __reduce_ex__ now
rejects builtin types with not defined __new__.

@item 
bpo-25555@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25555}: Fix parser and AST: fill lineno and col_offset of “arg” node
when compiling AST from Python objects.

@item 
bpo-24802@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24802}: Avoid buffer overreads when int(), float(), compile(), exec()
and eval() are passed bytes-like objects.  These objects are not
necessarily terminated by a null byte, but the functions assumed they
were.

@item 
bpo-24726@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24726}: Fixed a crash and leaking NULL in repr() of OrderedDict that
was mutated by direct calls of dict methods.

@item 
bpo-25449@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25449}: Iterating OrderedDict with keys with unstable hash now raises
KeyError in C implementations as well as in Python implementation.

@item 
bpo-25395@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25395}: Fixed crash when highly nested OrderedDict structures were
garbage collected.

@item 
bpo-25274@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25274}: sys.setrecursionlimit() now raises a RecursionError if the new
recursion limit is too low depending at the current recursion depth.
Modify also the “lower-water mark” formula to make it monotonic. This mark
is used to decide when the overflowed flag of the thread state is reset.

@item 
bpo-24402@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24402}: Fix input() to prompt to the redirected stdout when
sys.stdout.fileno() fails.

@item 
bpo-24806@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24806}: Prevent builtin types that are not allowed to be subclassed
from being subclassed through multiple inheritance.

@item 
bpo-24848@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24848}: Fixed a number of bugs in UTF-7 decoding of misformed data.

@item 
bpo-25280@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25280}: Import trace messages emitted in verbose (-v) mode are no
longer formatted twice.

@item 
bpo-25003@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25003}: On Solaris 11.3 or newer, os.urandom() now uses the getrandom()
function instead of the getentropy() function. The getentropy() function
is blocking to generate very good quality entropy, os.urandom() doesn’t
need such high-quality entropy.

@item 
bpo-25182@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25182}: The stdprinter (used as sys.stderr before the io module is
imported at startup) now uses the backslashreplace error handler.

@item 
bpo-25131@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25131}: Make the line number and column offset of set/dict literals and
comprehensions correspond to the opening brace.

@item 
bpo-25150@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25150}: Hide the private @code{_Py_atomic_@var{xxx}} symbols from the
public Python.h header to fix a compilation error with OpenMP.
PyThreadState_GET() becomes an alias to PyThreadState_Get() to avoid ABI
incompatibilities.
@end itemize

@node Library<195>,IDLE<60>,Core and Builtins<193>,Python 3 5 1 release candidate 1
@anchor{whatsnew/changelog id1016}@anchor{1f6c}
@subsubsection Library



@itemize -

@item 
bpo-25626@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25626}: Change three zlib functions to accept sizes that fit in
Py_ssize_t, but internally cap those sizes to UINT_MAX.  This resolves a
regression in 3.5 where GzipFile.read() failed to read chunks larger than
2 or 4 GiB.  The change affects the zlib.Decompress.decompress()
max_length parameter, the zlib.decompress() bufsize parameter, and the
zlib.Decompress.flush() length parameter.

@item 
bpo-25583@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25583}: Avoid incorrect errors raised by os.makedirs(exist_ok=True)
when the OS gives priority to errors such as EACCES over EEXIST.

@item 
bpo-25593@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25593}: Change semantics of EventLoop.stop() in asyncio.

@item 
bpo-6973@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6973}: When we know a subprocess.Popen process has died, do not allow
the send_signal(), terminate(), or kill() methods to do anything as they
could potentially signal a different process.

@item 
bpo-25590@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25590}: In the Readline completer, only call getattr() once per
attribute.

@item 
bpo-25498@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25498}: Fix a crash when garbage-collecting ctypes objects created by
wrapping a memoryview.  This was a regression made in 3.5a1.  Based on
patch by Eryksun.

@item 
bpo-25584@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25584}: Added “escape” to the __all__ list in the glob module.

@item 
bpo-25584@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25584}: Fixed recursive glob() with patterns starting with @code{**}.

@item 
bpo-25446@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25446}: Fix regression in smtplib’s AUTH LOGIN support.

@item 
bpo-18010@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18010}: Fix the pydoc web server’s module search function to handle
exceptions from importing packages.

@item 
bpo-25554@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25554}: Got rid of circular references in regular expression parsing.

@item 
bpo-25510@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25510}: fileinput.FileInput.readline() now returns b’’ instead of ‘’ at
the end if the FileInput was opened with binary mode. Patch by Ryosuke
Ito.

@item 
bpo-25503@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25503}: Fixed inspect.getdoc() for inherited docstrings of properties.
Original patch by John Mark Vandenberg.

@item 
bpo-25515@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25515}: Always use os.urandom as a source of randomness in uuid.uuid4.

@item 
bpo-21827@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21827}: Fixed textwrap.dedent() for the case when largest common
whitespace is a substring of smallest leading whitespace. Based on patch
by Robert Li.

@item 
bpo-25447@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25447}: The lru_cache() wrapper objects now can be copied and pickled
(by returning the original object unchanged).

@item 
bpo-25390@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25390}: typing: Don’t crash on Union[str, Pattern].

@item 
bpo-25441@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25441}: asyncio: Raise error from drain() when socket is closed.

@item 
bpo-25410@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25410}: Cleaned up and fixed minor bugs in C implementation of
OrderedDict.

@item 
bpo-25411@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25411}: Improved Unicode support in SMTPHandler through better use of
the email package. Thanks to user simon04 for the patch.

@item 
bpo-25407@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25407}: Remove mentions of the formatter module being removed in Python
3.6.

@item 
bpo-25406@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25406}: Fixed a bug in C implementation of OrderedDict.move_to_end()
that caused segmentation fault or hang in iterating after moving several
items to the start of ordered dict.

@item 
bpo-25364@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25364}: zipfile now works in threads disabled builds.

@item 
bpo-25328@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25328}: smtpd’s SMTPChannel now correctly raises a ValueError if both
decode_data and enable_SMTPUTF8 are set to true.

@item 
bpo-25316@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25316}: distutils raises OSError instead of DistutilsPlatformError when
MSVC is not installed.

@item 
bpo-25380@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25380}: Fixed protocol for the STACK_GLOBAL opcode in
pickletools.opcodes.

@item 
bpo-23972@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23972}: Updates asyncio datagram create method allowing reuseport and
reuseaddr socket options to be set prior to binding the socket. Mirroring
the existing asyncio create_server method the reuseaddr option for
datagram sockets defaults to True if the O/S is ‘posix’ (except if the
platform is Cygwin). Patch by Chris Laws.

@item 
bpo-25304@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25304}: Add asyncio.run_coroutine_threadsafe().  This lets you submit a
coroutine to a loop from another thread, returning a
concurrent.futures.Future.  By Vincent Michel.

@item 
bpo-25232@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25232}: Fix CGIRequestHandler to split the query from the URL at the
first question mark (?) rather than the last. Patch from Xiang Zhang.

@item 
bpo-24657@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24657}: Prevent CGIRequestHandler from collapsing slashes in the query
part of the URL as if it were a path. Patch from Xiang Zhang.

@item 
bpo-24483@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24483}: C implementation of functools.lru_cache() now calculates key’s
hash only once.

@item 
bpo-22958@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22958}: Constructor and update method of weakref.WeakValueDictionary
now accept the self and the dict keyword arguments.

@item 
bpo-22609@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22609}: Constructor of collections.UserDict now accepts the self
keyword argument.

@item 
bpo-25111@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25111}: Fixed comparison of traceback.FrameSummary.

@item 
bpo-25262@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25262}: Added support for BINBYTES8 opcode in Python implementation of
unpickler. Highest 32 bits of 64-bit size for BINUNICODE8 and BINBYTES8
opcodes no longer silently ignored on 32-bit platforms in C
implementation.

@item 
bpo-25034@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25034}: Fix string.Formatter problem with auto-numbering and nested
format_specs. Patch by Anthon van der Neut.

@item 
bpo-25233@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25233}: Rewrite the guts of asyncio.Queue and asyncio.Semaphore to be
more understandable and correct.

@item 
bpo-25203@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25203}: Failed readline.set_completer_delims() no longer left the
module in inconsistent state.

@item 
bpo-23600@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23600}: Default implementation of tzinfo.fromutc() was returning wrong
results in some cases.

@item 
bpo-23329@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23329}: Allow the ssl module to be built with older versions of
LibreSSL.

@item 
Prevent overflow in _Unpickler_Read.

@item 
bpo-25047@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25047}: The XML encoding declaration written by Element Tree now
respects the letter case given by the user. This restores the ability to
write encoding names in uppercase like “UTF-8”, which worked in Python 2.

@item 
bpo-25135@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25135}: Make deque_clear() safer by emptying the deque before clearing.
This helps avoid possible reentrancy issues.

@item 
bpo-19143@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19143}: platform module now reads Windows version from kernel32.dll to
avoid compatibility shims.

@item 
bpo-25092@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25092}: Fix datetime.strftime() failure when errno was already set to
EINVAL.

@item 
bpo-23517@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23517}: Fix rounding in fromtimestamp() and utcfromtimestamp() methods
of datetime.datetime: microseconds are now rounded to nearest with ties
going to nearest even integer (ROUND_HALF_EVEN), instead of being rounding
towards minus infinity (ROUND_FLOOR). It’s important that these methods
use the same rounding mode than datetime.timedelta to keep the property:
(datetime(1970,1,1) + timedelta(seconds=t)) ==
datetime.utcfromtimestamp(t). It also the rounding mode used by
round(float) for example.

@item 
bpo-25155@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25155}: Fix datetime.datetime.now() and datetime.datetime.utcnow() on
Windows to support date after year 2038. It was a regression introduced in
Python 3.5.0.

@item 
bpo-25108@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25108}: Omitted internal frames in traceback functions print_stack(),
format_stack(), and extract_stack() called without arguments.

@item 
bpo-25118@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25118}: Fix a regression of Python 3.5.0 in os.waitpid() on Windows.

@item 
bpo-24684@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24684}: socket.socket.getaddrinfo() now calls
PyUnicode_AsEncodedString() instead of calling the encode() method of the
host, to handle correctly custom string with an encode() method which
doesn’t return a byte string. The encoder of the IDNA codec is now called
directly instead of calling the encode() method of the string.

@item 
bpo-25060@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25060}: Correctly compute stack usage of the BUILD_MAP opcode.

@item 
bpo-24857@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24857}: Comparing call_args to a long sequence now correctly returns a
boolean result instead of raising an exception.  Patch by A Kaptur.

@item 
bpo-23144@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23144}: Make sure that HTMLParser.feed() returns all the data, even
when convert_charrefs is True.

@item 
bpo-24982@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24982}: shutil.make_archive() with the “zip” format now adds entries
for directories (including empty directories) in ZIP file.

@item 
bpo-25019@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25019}: Fixed a crash caused by setting non-string key of expat parser.
Based on patch by John Leitch.

@item 
bpo-16180@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16180}: Exit pdb if file has syntax error, instead of trapping user in
an infinite loop.  Patch by Xavier de Gaye.

@item 
bpo-24891@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24891}: Fix a race condition at Python startup if the file descriptor
of stdin (0), stdout (1) or stderr (2) is closed while Python is creating
sys.stdin, sys.stdout and sys.stderr objects. These attributes are now set
to None if the creation of the object failed, instead of raising an
OSError exception. Initial patch written by Marco Paolini.

@item 
bpo-24992@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24992}: Fix error handling and a race condition (related to garbage
collection) in collections.OrderedDict constructor.

@item 
bpo-24881@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24881}: Fixed setting binary mode in Python implementation of FileIO on
Windows and Cygwin.  Patch from Akira Li.

@item 
bpo-25578@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25578}: Fix (another) memory leak in SSLSocket.getpeercer().

@item 
bpo-25530@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25530}: Disable the vulnerable SSLv3 protocol by default when creating
ssl.SSLContext.

@item 
bpo-25569@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25569}: Fix memory leak in SSLSocket.getpeercert().

@item 
bpo-25471@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25471}: Sockets returned from accept() shouldn’t appear to be
nonblocking.

@item 
bpo-25319@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25319}: When threading.Event is reinitialized, the underlying condition
should use a regular lock rather than a recursive lock.

@item 
bpo-21112@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21112}: Fix regression in unittest.expectedFailure on subclasses. Patch
from Berker Peksag.

@item 
bpo-24764@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24764}: cgi.FieldStorage.read_multi() now ignores the Content-Length
header in part headers. Patch written by Peter Landry and reviewed by
Pierre Quentel.

@item 
bpo-24913@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24913}: Fix overrun error in deque.index(). Found by John Leitch and
Bryce Darling.

@item 
bpo-24774@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24774}: Fix docstring in http.server.test. Patch from Chiu-Hsiang Hsu.

@item 
bpo-21159@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21159}: Improve message in
configparser.InterpolationMissingOptionError. Patch from Łukasz Langa.

@item 
bpo-20362@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20362}: Honour TestCase.longMessage correctly in assertRegex. Patch
from Ilia Kurenkov.

@item 
bpo-23572@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23572}: Fixed functools.singledispatch on classes with false
metaclasses.  Patch by Ethan Furman.

@item 
asyncio: ensure_future() now accepts awaitable objects.
@end itemize

@node IDLE<60>,Documentation<81>,Library<195>,Python 3 5 1 release candidate 1
@anchor{whatsnew/changelog id1017}@anchor{1f6d}
@subsubsection IDLE



@itemize -

@item 
bpo-15348@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15348}: Stop the debugger engine (normally in a user process) before
closing the debugger window (running in the IDLE process). This prevents
the RuntimeErrors that were being caught and ignored.

@item 
bpo-24455@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24455}: Prevent IDLE from hanging when a) closing the shell while the
debugger is active (15347); b) closing the debugger with the [X] button
(15348); and c) activating the debugger when already active (24455). The
patch by Mark Roseman does this by making two changes. 1. Suspend and
resume the gui.interaction method with the tcl vwait mechanism intended
for this purpose (instead of root.mainloop & .quit). 2. In gui.run, allow
any existing interaction to terminate first.

@item 
Change ‘The program’ to ‘Your program’ in an IDLE ‘kill program?’ message
to make it clearer that the program referred to is the currently running
user program, not IDLE itself.

@item 
bpo-24750@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24750}: Improve the appearance of the IDLE editor window status bar.
Patch by Mark Roseman.

@item 
bpo-25313@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25313}: Change the handling of new built-in text color themes to better
address the compatibility problem introduced by the addition of IDLE Dark.
Consistently use the revised idleConf.CurrentTheme everywhere in idlelib.

@item 
bpo-24782@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24782}: Extension configuration is now a tab in the IDLE Preferences
dialog rather than a separate dialog.  The former tabs are now a sorted
list.  Patch by Mark Roseman.

@item 
bpo-22726@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22726}: Re-activate the config dialog help button with some content
about the other buttons and the new IDLE Dark theme.

@item 
bpo-24820@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24820}: IDLE now has an ‘IDLE Dark’ built-in text color theme. It is
more or less IDLE Classic inverted, with a cobalt blue background.
Strings, comments, keywords, … are still green, red, orange, … . To
use it with IDLEs released before November 2015, hit the ‘Save as New
Custom Theme’ button and enter a new name, such as ‘Custom Dark’.  The
custom theme will work with any IDLE release, and can be modified.

@item 
bpo-25224@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25224}: README.txt is now an idlelib index for IDLE developers and
curious users. The previous user content is now in the IDLE doc chapter.
‘IDLE’ now means ‘Integrated Development and Learning Environment’.

@item 
bpo-24820@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24820}: Users can now set breakpoint colors in Settings -> Custom
Highlighting. Original patch by Mark Roseman.

@item 
bpo-24972@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24972}: Inactive selection background now matches active selection
background, as configured by users, on all systems.  Found items are now
always highlighted on Windows.  Initial patch by Mark Roseman.

@item 
bpo-24570@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24570}: Idle: make calltip and completion boxes appear on Macs affected
by a tk regression.  Initial patch by Mark Roseman.

@item 
bpo-24988@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24988}: Idle ScrolledList context menus (used in debugger) now work on
Mac Aqua. Patch by Mark Roseman.

@item 
bpo-24801@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24801}: Make right-click for context menu work on Mac Aqua. Patch by
Mark Roseman.

@item 
bpo-25173@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25173}: Associate tkinter messageboxes with a specific widget. For Mac
OSX, make them a ‘sheet’.  Patch by Mark Roseman.

@item 
bpo-25198@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25198}: Enhance the initial html viewer now used for Idle Help.
Properly indent fixed-pitch text (patch by Mark Roseman). Give code
snippet a very Sphinx-like light blueish-gray background. Re-use initial
width and height set by users for shell and editor. When the Table of
Contents (TOC) menu is used, put the section header at the top of the
screen.

@item 
bpo-25225@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25225}: Condense and rewrite Idle doc section on text colors.

@item 
bpo-21995@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21995}: Explain some differences between IDLE and console Python.

@item 
bpo-22820@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22820}: Explain need for `print' when running file from Idle editor.

@item 
bpo-25224@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25224}: Doc: augment Idle feature list and no-subprocess section.

@item 
bpo-25219@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25219}: Update doc for Idle command line options. Some were missing and
notes were not correct.

@item 
bpo-24861@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24861}: Most of idlelib is private and subject to change. Use
idleib.idle.* to start Idle. See idlelib.__init__.__doc__.

@item 
bpo-25199@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25199}: Idle: add synchronization comments for future maintainers.

@item 
bpo-16893@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16893}: Replace help.txt with help.html for Idle doc display. The new
idlelib/help.html is rstripped Doc/build/html/library/idle.html. It looks
better than help.txt and will better document Idle as released. The
tkinter html viewer that works for this file was written by Mark Roseman.
The now unused EditorWindow.HelpDialog class and helt.txt file are
deprecated.

@item 
bpo-24199@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24199}: Deprecate unused idlelib.idlever with possible removal in 3.6.

@item 
bpo-24790@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24790}: Remove extraneous code (which also create 2 & 3 conflicts).
@end itemize

@node Documentation<81>,Tests<83>,IDLE<60>,Python 3 5 1 release candidate 1
@anchor{whatsnew/changelog id1018}@anchor{1f6e}
@subsubsection Documentation



@itemize -

@item 
bpo-22558@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22558}: Add remaining doc links to source code for Python-coded
modules. Patch by Yoni Lavi.

@item 
bpo-12067@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12067}: Rewrite Comparisons section in the Expressions chapter of the
language reference. Some of the details of comparing mixed types were
incorrect or ambiguous. NotImplemented is only relevant at a lower level
than the Expressions chapter. Added details of comparing range() objects,
and default behaviour and consistency suggestions for user-defined
classes. Patch from Andy Maier.

@item 
bpo-24952@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24952}: Clarify the default size argument of stack_size() in the
“threading” and “_thread” modules. Patch from Mattip.

@item 
bpo-23725@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23725}: Overhaul tempfile docs. Note deprecated status of mktemp. Patch
from Zbigniew Jędrzejewski-Szmek.

@item 
bpo-24808@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24808}: Update the types of some PyTypeObject fields.  Patch by Joseph
Weston.

@item 
bpo-22812@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22812}: Fix unittest discovery examples. Patch from Pam McA’Nulty.
@end itemize

@node Tests<83>,Build<93>,Documentation<81>,Python 3 5 1 release candidate 1
@anchor{whatsnew/changelog id1019}@anchor{1f6f}
@subsubsection Tests



@itemize -

@item 
bpo-25449@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25449}: Added tests for OrderedDict subclasses.

@item 
bpo-25099@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25099}: Make test_compileall not fail when an entry on sys.path cannot
be written to (commonly seen in administrative installs on Windows).

@item 
bpo-23919@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23919}: Prevents assert dialogs appearing in the test suite.

@item 
@code{PCbuild\rt.bat} now accepts an unlimited number of arguments to pass
along to regrtest.py.  Previously there was a limit of 9.
@end itemize

@node Build<93>,Windows<81>,Tests<83>,Python 3 5 1 release candidate 1
@anchor{whatsnew/changelog id1020}@anchor{1f70}
@subsubsection Build



@itemize -

@item 
bpo-24915@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24915}: Add LLVM support for PGO builds and use the test suite to
generate the profile data. Initial patch by Alecsandru Patrascu of Intel.

@item 
bpo-24910@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24910}: Windows MSIs now have unique display names.

@item 
bpo-24986@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24986}: It is now possible to build Python on Windows without errors
when external libraries are not available.
@end itemize

@node Windows<81>,Tools/Demos<57>,Build<93>,Python 3 5 1 release candidate 1
@anchor{whatsnew/changelog id1021}@anchor{1f71}
@subsubsection Windows



@itemize -

@item 
bpo-25450@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25450}: Updates shortcuts to start Python in installation directory.

@item 
bpo-25164@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25164}: Changes default all-users install directory to match per-user
directory.

@item 
bpo-25143@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25143}: Improves installer error messages for unsupported platforms.

@item 
bpo-25163@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25163}: Display correct directory in installer when using non-default
settings.

@item 
bpo-25361@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25361}: Disables use of SSE2 instructions in Windows 32-bit build

@item 
bpo-25089@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25089}: Adds logging to installer for case where launcher is not
selected on upgrade.

@item 
bpo-25165@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25165}: Windows uninstallation should not remove launcher if other
versions remain

@item 
bpo-25112@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25112}: py.exe launcher is missing icons

@item 
bpo-25102@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25102}: Windows installer does not precompile for -O or -OO.

@item 
bpo-25081@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25081}: Makes Back button in installer go back to upgrade page when
upgrading.

@item 
bpo-25091@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25091}: Increases font size of the installer.

@item 
bpo-25126@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25126}: Clarifies that the non-web installer will download some
components.

@item 
bpo-25213@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25213}: Restores requestedExecutionLevel to manifest to disable UAC
virtualization.

@item 
bpo-25022@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25022}: Removed very outdated PC/example_nt/ directory.
@end itemize

@node Tools/Demos<57>,,Windows<81>,Python 3 5 1 release candidate 1
@anchor{whatsnew/changelog id1022}@anchor{1f72}
@subsubsection Tools/Demos



@itemize -

@item 
bpo-25440@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25440}: Fix output of python-config –extension-suffix.
@end itemize

@node Python 3 5 0 final,Python 3 5 0 release candidate 4,Python 3 5 1 release candidate 1,Changelog
@anchor{whatsnew/changelog python-3-5-0-final}@anchor{1f73}
@subsection Python 3.5.0 final


`Release date: 2015-09-13'

@menu
* Build: Build<94>. 

@end menu

@node Build<94>,,,Python 3 5 0 final
@anchor{whatsnew/changelog id1023}@anchor{1f74}
@subsubsection Build



@itemize -

@item 
bpo-25071@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25071}: Windows installer should not require TargetDir parameter when
installing quietly.
@end itemize

@node Python 3 5 0 release candidate 4,Python 3 5 0 release candidate 3,Python 3 5 0 final,Changelog
@anchor{whatsnew/changelog python-3-5-0-release-candidate-4}@anchor{1f75}
@subsection Python 3.5.0 release candidate 4


`Release date: 2015-09-09'

@menu
* Library: Library<196>. 
* Build: Build<95>. 

@end menu

@node Library<196>,Build<95>,,Python 3 5 0 release candidate 4
@anchor{whatsnew/changelog id1024}@anchor{1f76}
@subsubsection Library



@itemize -

@item 
bpo-25029@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25029}: Fixes MemoryError in test_strptime.
@end itemize

@node Build<95>,,Library<196>,Python 3 5 0 release candidate 4
@anchor{whatsnew/changelog id1025}@anchor{1f77}
@subsubsection Build



@itemize -

@item 
bpo-25027@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=25027}: Reverts partial-static build options and adds vcruntime140.dll
to Windows installation.
@end itemize

@node Python 3 5 0 release candidate 3,Python 3 5 0 release candidate 2,Python 3 5 0 release candidate 4,Changelog
@anchor{whatsnew/changelog python-3-5-0-release-candidate-3}@anchor{1f78}
@subsection Python 3.5.0 release candidate 3


`Release date: 2015-09-07'

@menu
* Core and Builtins: Core and Builtins<194>. 
* Library: Library<197>. 

@end menu

@node Core and Builtins<194>,Library<197>,,Python 3 5 0 release candidate 3
@anchor{whatsnew/changelog id1026}@anchor{1f79}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-24305@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24305}: Prevent import subsystem stack frames from being counted by the
warnings.warn(stacklevel=) parameter.

@item 
bpo-24912@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24912}: Prevent __class__ assignment to immutable built-in objects.

@item 
bpo-24975@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24975}: Fix AST compilation for 
@geindex Python 향상 제안; PEP 448
PEP 448@footnote{https://peps.python.org/pep-0448/} syntax.
@end itemize

@node Library<197>,,Core and Builtins<194>,Python 3 5 0 release candidate 3
@anchor{whatsnew/changelog id1027}@anchor{1f7a}
@subsubsection Library



@itemize -

@item 
bpo-24917@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24917}: time_strftime() buffer over-read.

@item 
bpo-24748@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24748}: To resolve a compatibility problem found with py2exe and
pywin32, imp.load_dynamic() once again ignores previously loaded modules
to support Python modules replacing themselves with extension modules.
Patch by Petr Viktorin.

@item 
bpo-24635@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24635}: Fixed a bug in typing.py where isinstance([], typing.Iterable)
would return True once, then False on subsequent calls.

@item 
bpo-24989@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24989}: Fixed buffer overread in BytesIO.readline() if a position is
set beyond size.  Based on patch by John Leitch.

@item 
bpo-24913@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24913}: Fix overrun error in deque.index(). Found by John Leitch and
Bryce Darling.
@end itemize

@node Python 3 5 0 release candidate 2,Python 3 5 0 release candidate 1,Python 3 5 0 release candidate 3,Changelog
@anchor{whatsnew/changelog python-3-5-0-release-candidate-2}@anchor{1f7b}
@subsection Python 3.5.0 release candidate 2


`Release date: 2015-08-25'

@menu
* Core and Builtins: Core and Builtins<195>. 
* Library: Library<198>. 

@end menu

@node Core and Builtins<195>,Library<198>,,Python 3 5 0 release candidate 2
@anchor{whatsnew/changelog id1028}@anchor{1f7c}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-24769@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24769}: Interpreter now starts properly when dynamic loading is
disabled.  Patch by Petr Viktorin.

@item 
bpo-21167@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21167}: NAN operations are now handled correctly when python is
compiled with ICC even if -fp-model strict is not specified.

@item 
bpo-24492@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24492}: A “package” lacking a __name__ attribute when trying to perform
a @code{from .. import ...} statement will trigger an ImportError instead of
an AttributeError.
@end itemize

@node Library<198>,,Core and Builtins<195>,Python 3 5 0 release candidate 2
@anchor{whatsnew/changelog id1029}@anchor{1f7d}
@subsubsection Library



@itemize -

@item 
bpo-24847@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24847}: Removes vcruntime140.dll dependency from Tcl/Tk.

@item 
bpo-24839@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24839}: platform._syscmd_ver raises DeprecationWarning

@item 
bpo-24867@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24867}: Fix Task.get_stack() for ‘async def’ coroutines
@end itemize

@node Python 3 5 0 release candidate 1,Python 3 5 0 beta 4,Python 3 5 0 release candidate 2,Changelog
@anchor{whatsnew/changelog python-3-5-0-release-candidate-1}@anchor{1f7e}
@subsection Python 3.5.0 release candidate 1


`Release date: 2015-08-09'

@menu
* Core and Builtins: Core and Builtins<196>. 
* Library: Library<199>. 
* IDLE: IDLE<61>. 
* Documentation: Documentation<82>. 
* Tests: Tests<84>. 

@end menu

@node Core and Builtins<196>,Library<199>,,Python 3 5 0 release candidate 1
@anchor{whatsnew/changelog id1030}@anchor{1f7f}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-24667@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24667}: Resize odict in all cases that the underlying dict resizes.
@end itemize

@node Library<199>,IDLE<61>,Core and Builtins<196>,Python 3 5 0 release candidate 1
@anchor{whatsnew/changelog id1031}@anchor{1f80}
@subsubsection Library



@itemize -

@item 
bpo-24824@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24824}: Signatures of codecs.encode() and codecs.decode() now are
compatible with pydoc.

@item 
bpo-24634@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24634}: Importing uuid should not try to load libc on Windows

@item 
bpo-24798@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24798}: _msvccompiler.py doesn’t properly support manifests

@item 
bpo-4395@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4395}: Better testing and documentation of binary operators. Patch by
Martin Panter.

@item 
bpo-23973@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23973}: Update typing.py from GitHub repo.

@item 
bpo-23004@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23004}: mock_open() now reads binary data correctly when the type of
read_data is bytes.  Initial patch by Aaron Hill.

@item 
bpo-23888@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23888}: Handle fractional time in cookie expiry. Patch by ssh.

@item 
bpo-23652@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23652}: Make it possible to compile the select module against the libc
headers from the Linux Standard Base, which do not include some EPOLL
macros.  Patch by Matt Frank.

@item 
bpo-22932@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22932}: Fix timezones in email.utils.formatdate. Patch from Dmitry
Shachnev.

@item 
bpo-23779@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23779}: imaplib raises TypeError if authenticator tries to abort. Patch
from Craig Holmquist.

@item 
bpo-23319@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23319}: Fix ctypes.BigEndianStructure, swap correctly bytes. Patch
written by Matthieu Gautier.

@item 
bpo-23254@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23254}: Document how to close the TCPServer listening socket. Patch
from Martin Panter.

@item 
bpo-19450@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19450}: Update Windows and OS X installer builds to use SQLite 3.8.11.

@item 
bpo-17527@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17527}: Add PATCH to wsgiref.validator. Patch from Luca Sbardella.

@item 
bpo-24791@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24791}: Fix grammar regression for call syntax: ‘g(*a or b)’.
@end itemize

@node IDLE<61>,Documentation<82>,Library<199>,Python 3 5 0 release candidate 1
@anchor{whatsnew/changelog id1032}@anchor{1f81}
@subsubsection IDLE



@itemize -

@item 
bpo-23672@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23672}: Allow Idle to edit and run files with astral chars in name.
Patch by Mohd Sanad Zaki Rizvi.

@item 
bpo-24745@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24745}: Idle editor default font. Switch from Courier to
platform-sensitive TkFixedFont.  This should not affect current customized
font selections.  If there is a problem, edit
$HOME/.idlerc/config-main.cfg and remove ‘@code{font@var{xxx}}’ entries from
[Editor Window].  Patch by Mark Roseman.

@item 
bpo-21192@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21192}: Idle editor. When a file is run, put its name in the restart
bar. Do not print false prompts. Original patch by Adnan Umer.

@item 
bpo-13884@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13884}: Idle menus. Remove tearoff lines. Patch by Roger Serwy.
@end itemize

@node Documentation<82>,Tests<84>,IDLE<61>,Python 3 5 0 release candidate 1
@anchor{whatsnew/changelog id1033}@anchor{1f82}
@subsubsection Documentation



@itemize -

@item 
bpo-24129@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24129}: Clarify the reference documentation for name resolution. This
includes removing the assumption that readers will be familiar with the
name resolution scheme Python used prior to the introduction of lexical
scoping for function namespaces. Patch by Ivan Levkivskyi.

@item 
bpo-20769@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20769}: Improve reload() docs. Patch by Dorian Pula.

@item 
bpo-23589@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23589}: Remove duplicate sentence from the FAQ.  Patch by Yongzhi Pan.

@item 
bpo-24729@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24729}: Correct IO tutorial to match implementation regarding encoding
parameter to open function.
@end itemize

@node Tests<84>,,Documentation<82>,Python 3 5 0 release candidate 1
@anchor{whatsnew/changelog id1034}@anchor{1f83}
@subsubsection Tests



@itemize -

@item 
bpo-24751@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24751}: When running regrtest with the @code{-w} command line option, a
test run is no longer marked as a failure if all tests succeed when
re-run.
@end itemize

@node Python 3 5 0 beta 4,Python 3 5 0 beta 3,Python 3 5 0 release candidate 1,Changelog
@anchor{whatsnew/changelog python-3-5-0-beta-4}@anchor{1f84}
@subsection Python 3.5.0 beta 4


`Release date: 2015-07-26'

@menu
* Core and Builtins: Core and Builtins<197>. 
* Library: Library<200>. 
* Build: Build<96>. 

@end menu

@node Core and Builtins<197>,Library<200>,,Python 3 5 0 beta 4
@anchor{whatsnew/changelog id1035}@anchor{1f85}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-23573@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23573}: Restored optimization of bytes.rfind() and bytearray.rfind()
for single-byte argument on Linux.

@item 
bpo-24569@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24569}: Make 
@geindex Python 향상 제안; PEP 448
PEP 448@footnote{https://peps.python.org/pep-0448/} dictionary evaluation more consistent.

@item 
bpo-24583@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24583}: Fix crash when set is mutated while being updated.

@item 
bpo-24407@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24407}: Fix crash when dict is mutated while being updated.

@item 
bpo-24619@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24619}: New approach for tokenizing async/await. As a consequence, it
is now possible to have one-line ‘async def foo(): await ..’ functions.

@item 
bpo-24687@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24687}: Plug refleak on SyntaxError in function parameters annotations.

@item 
bpo-15944@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15944}: memoryview: Allow arbitrary formats when casting to bytes.
Patch by Martin Panter.
@end itemize

@node Library<200>,Build<96>,Core and Builtins<197>,Python 3 5 0 beta 4
@anchor{whatsnew/changelog id1036}@anchor{1f86}
@subsubsection Library



@itemize -

@item 
bpo-23441@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23441}: rcompleter now prints a tab character instead of displaying
possible completions for an empty word.  Initial patch by Martin Sekera.

@item 
bpo-24683@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24683}: Fixed crashes in _json functions called with arguments of
inappropriate type.

@item 
bpo-21697@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21697}: shutil.copytree() now correctly handles symbolic links that
point to directories.  Patch by Eduardo Seabra and Thomas Kluyver.

@item 
bpo-14373@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14373}: Fixed segmentation fault when gc.collect() is called during
constructing lru_cache (C implementation).

@item 
bpo-24695@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24695}: Fix a regression in traceback.print_exception().  If
exc_traceback is None we shouldn’t print a traceback header like described
in the documentation.

@item 
bpo-24620@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24620}: Random.setstate() now validates the value of state last
element.

@item 
bpo-22485@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22485}: Fixed an issue that caused @code{inspect.getsource} to return
incorrect results on nested functions.

@item 
bpo-22153@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22153}: Improve unittest docs. Patch from Martin Panter and evilzero.

@item 
bpo-24580@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24580}: Symbolic group references to open group in re patterns now are
explicitly forbidden as well as numeric group references.

@item 
bpo-24206@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24206}: Fixed __eq__ and __ne__ methods of inspect classes.

@item 
bpo-24631@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24631}: Fixed regression in the timeit module with multiline setup.

@item 
bpo-18622@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18622}: unittest.mock.mock_open().reset_mock would recurse infinitely.
Patch from Nicola Palumbo and Laurent De Buyst.

@item 
bpo-23661@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23661}: unittest.mock side_effects can now be exceptions again. This
was a regression vs Python 3.4. Patch from Ignacio Rossi

@item 
bpo-24608@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24608}: chunk.Chunk.read() now always returns bytes, not str.

@item 
bpo-18684@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18684}: Fixed reading out of the buffer in the re module.

@item 
bpo-24259@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24259}: tarfile now raises a ReadError if an archive is truncated
inside a data segment.

@item 
bpo-15014@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15014}: SMTP.auth() and SMTP.login() now support RFC 4954’s optional
initial-response argument to the SMTP AUTH command.

@item 
bpo-24669@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24669}: Fix inspect.getsource() for ‘async def’ functions. Patch by Kai
Groner.

@item 
bpo-24688@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24688}: ast.get_docstring() for ‘async def’ functions.
@end itemize

@node Build<96>,,Library<200>,Python 3 5 0 beta 4
@anchor{whatsnew/changelog id1037}@anchor{1f87}
@subsubsection Build



@itemize -

@item 
bpo-24603@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24603}: Update Windows builds and OS X 10.5 installer to use OpenSSL
1.0.2d.
@end itemize

@node Python 3 5 0 beta 3,Python 3 5 0 beta 2,Python 3 5 0 beta 4,Changelog
@anchor{whatsnew/changelog python-3-5-0-beta-3}@anchor{1f88}
@subsection Python 3.5.0 beta 3


`Release date: 2015-07-05'

@menu
* Core and Builtins: Core and Builtins<198>. 
* Library: Library<201>. 
* Tests: Tests<85>. 
* Documentation: Documentation<83>. 
* Build: Build<97>. 

@end menu

@node Core and Builtins<198>,Library<201>,,Python 3 5 0 beta 3
@anchor{whatsnew/changelog id1038}@anchor{1f89}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-24467@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24467}: Fixed possible buffer over-read in bytearray. The bytearray
object now always allocates place for trailing null byte and it’s buffer
now is always null-terminated.

@item 
Upgrade to Unicode 8.0.0.

@item 
bpo-24345@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24345}: Add Py_tp_finalize slot for the stable ABI.

@item 
bpo-24400@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24400}: Introduce a distinct type for 
@geindex Python 향상 제안; PEP 492
PEP 492@footnote{https://peps.python.org/pep-0492/} coroutines; add
types.CoroutineType, inspect.getcoroutinestate,
inspect.getcoroutinelocals; coroutines no longer use CO_GENERATOR flag;
sys.set_coroutine_wrapper works only for ‘async def’ coroutines;
inspect.iscoroutine no longer uses collections.abc.Coroutine, it’s
intended to test for pure ‘async def’ coroutines only; add new opcode:
GET_YIELD_FROM_ITER; fix generators wrapper used in types.coroutine to be
instance of collections.abc.Generator; collections.abc.Awaitable and
collections.abc.Coroutine can no longer be used to detect generator-based
coroutines–use inspect.isawaitable instead.

@item 
bpo-24450@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24450}: Add gi_yieldfrom to generators and cr_await to coroutines.
Contributed by Benno Leslie and Yury Selivanov.

@item 
bpo-19235@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19235}: Add new RecursionError exception. Patch by Georg Brandl.
@end itemize

@node Library<201>,Tests<85>,Core and Builtins<198>,Python 3 5 0 beta 3
@anchor{whatsnew/changelog id1039}@anchor{1f8a}
@subsubsection Library



@itemize -

@item 
bpo-21750@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21750}: mock_open.read_data can now be read from each instance, as it
could in Python 3.3.

@item 
bpo-24552@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24552}: Fix use after free in an error case of the _pickle module.

@item 
bpo-24514@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24514}: tarfile now tolerates number fields consisting of only
whitespace.

@item 
bpo-19176@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19176}: Fixed doctype() related bugs in C implementation of
ElementTree. A deprecation warning no longer issued by XMLParser subclass
with default doctype() method.  Direct call of doctype() now issues a
warning.  Parser’s doctype() now is not called if target’s doctype() is
called.  Based on patch by Martin Panter.

@item 
bpo-20387@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20387}: Restore semantic round-trip correctness in tokenize/untokenize
for tab-indented blocks.

@item 
bpo-24456@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24456}: Fixed possible buffer over-read in adpcm2lin() and lin2adpcm()
functions of the audioop module.

@item 
bpo-24336@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24336}: The contextmanager decorator now works with functions with
keyword arguments called “func” and “self”.  Patch by Martin Panter.

@item 
bpo-24522@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24522}: Fix possible integer overflow in json accelerator module.

@item 
bpo-24489@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24489}: ensure a previously set C errno doesn’t disturb cmath.polar().

@item 
bpo-24408@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24408}: Fixed AttributeError in measure() and metrics() methods of
tkinter.Font.

@item 
bpo-14373@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14373}: C implementation of functools.lru_cache() now can be used with
methods.

@item 
bpo-24347@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24347}: Set KeyError if PyDict_GetItemWithError returns NULL.

@item 
bpo-24348@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24348}: Drop superfluous incref/decref.

@item 
bpo-24359@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24359}: Check for changed OrderedDict size during iteration.

@item 
bpo-24368@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24368}: Support keyword arguments in OrderedDict methods.

@item 
bpo-24362@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24362}: Simplify the C OrderedDict fast nodes resize logic.

@item 
bpo-24377@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24377}: Fix a ref leak in OrderedDict.__repr__.

@item 
bpo-24369@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24369}: Defend against key-changes during iteration.
@end itemize

@node Tests<85>,Documentation<83>,Library<201>,Python 3 5 0 beta 3
@anchor{whatsnew/changelog id1040}@anchor{1f8b}
@subsubsection Tests



@itemize -

@item 
bpo-24373@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24373}: _testmultiphase and xxlimited now use tp_traverse and
tp_finalize to avoid reference leaks encountered when combining tp_dealloc
with PyType_FromSpec (see bpo-16690@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16690} for details)
@end itemize

@node Documentation<83>,Build<97>,Tests<85>,Python 3 5 0 beta 3
@anchor{whatsnew/changelog id1041}@anchor{1f8c}
@subsubsection Documentation



@itemize -

@item 
bpo-24458@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24458}: Update documentation to cover multi-phase initialization for
extension modules (PEP 489). Patch by Petr Viktorin.

@item 
bpo-24351@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24351}: Clarify what is meant by “identifier” in the context of
string.Template instances.
@end itemize

@node Build<97>,,Documentation<83>,Python 3 5 0 beta 3
@anchor{whatsnew/changelog id1042}@anchor{1f8d}
@subsubsection Build



@itemize -

@item 
bpo-24432@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24432}: Update Windows builds and OS X 10.5 installer to use OpenSSL
1.0.2c.
@end itemize

@node Python 3 5 0 beta 2,Python 3 5 0 beta 1,Python 3 5 0 beta 3,Changelog
@anchor{whatsnew/changelog python-3-5-0-beta-2}@anchor{1f8e}
@subsection Python 3.5.0 beta 2


`Release date: 2015-05-31'

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

@end menu

@node Core and Builtins<199>,Library<202>,,Python 3 5 0 beta 2
@anchor{whatsnew/changelog id1043}@anchor{1f8f}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-24284@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24284}: The startswith and endswith methods of the str class no longer
return True when finding the empty string and the indexes are completely
out of range.

@item 
bpo-24115@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24115}: Update uses of PyObject_IsTrue(), PyObject_Not(),
PyObject_IsInstance(), PyObject_RichCompareBool() and _PyDict_Contains()
to check for and handle errors correctly.

@item 
bpo-24328@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24328}: Fix importing one character extension modules.

@item 
bpo-11205@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11205}: In dictionary displays, evaluate the key before the value.

@item 
bpo-24285@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24285}: Fixed regression that prevented importing extension modules
from inside packages. Patch by Petr Viktorin.
@end itemize

@node Library<202>,,Core and Builtins<199>,Python 3 5 0 beta 2
@anchor{whatsnew/changelog id1044}@anchor{1f90}
@subsubsection Library



@itemize -

@item 
bpo-23247@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23247}: Fix a crash in the StreamWriter.reset() of CJK codecs.

@item 
bpo-24270@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24270}: Add math.isclose() and cmath.isclose() functions as per
@geindex Python 향상 제안; PEP 485
PEP 485@footnote{https://peps.python.org/pep-0485/}. Contributed by Chris Barker and Tal Einat.

@item 
bpo-5633@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5633}: Fixed timeit when the statement is a string and the setup is
not.

@item 
bpo-24326@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24326}: Fixed audioop.ratecv() with non-default weightB argument.
Original patch by David Moore.

@item 
bpo-16991@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16991}: Add a C implementation of OrderedDict.

@item 
bpo-23934@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23934}: Fix inspect.signature to fail correctly for builtin types
lacking signature information.  Initial patch by James Powell.
@end itemize

@node Python 3 5 0 beta 1,Python 3 5 0 alpha 4,Python 3 5 0 beta 2,Changelog
@anchor{whatsnew/changelog python-3-5-0-beta-1}@anchor{1f91}
@subsection Python 3.5.0 beta 1


`Release date: 2015-05-24'

@menu
* Core and Builtins: Core and Builtins<200>. 
* Library: Library<203>. 
* IDLE: IDLE<62>. 
* Tests: Tests<86>. 
* Documentation: Documentation<84>. 
* Tools/Demos: Tools/Demos<58>. 

@end menu

@node Core and Builtins<200>,Library<203>,,Python 3 5 0 beta 1
@anchor{whatsnew/changelog id1045}@anchor{1f92}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-24276@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24276}: Fixed optimization of property descriptor getter.

@item 
bpo-24268@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24268}: PEP 489: Multi-phase extension module initialization. Patch by
Petr Viktorin.

@item 
bpo-23955@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23955}: Add pyvenv.cfg option to suppress registry/environment lookup
for generating sys.path on Windows.

@item 
bpo-24257@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24257}: Fixed system error in the comparison of faked
types.SimpleNamespace.

@item 
bpo-22939@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22939}: Fixed integer overflow in iterator object.  Patch by Clement
Rouault.

@item 
bpo-23985@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23985}: Fix a possible buffer overrun when deleting a slice from the
front of a bytearray and then appending some other bytes data.

@item 
bpo-24102@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24102}: Fixed exception type checking in standard error handlers.

@item 
bpo-15027@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15027}: The UTF-32 encoder is now 3x to 7x faster.

@item 
bpo-23290@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23290}: Optimize set_merge() for cases where the target is empty.
(Contributed by Serhiy Storchaka.)

@item 
bpo-2292@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2292}: PEP 448: Additional Unpacking Generalizations.

@item 
bpo-24096@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24096}: Make warnings.warn_explicit more robust against mutation of the
warnings.filters list.

@item 
bpo-23996@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23996}: Avoid a crash when a delegated generator raises an unnormalized
StopIteration exception.  Patch by Stefan Behnel.

@item 
bpo-23910@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23910}: Optimize property() getter calls.  Patch by Joe Jevnik.

@item 
bpo-23911@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23911}: Move path-based importlib bootstrap code to a separate frozen
module.

@item 
bpo-24192@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24192}: Fix namespace package imports.

@item 
bpo-24022@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24022}: Fix tokenizer crash when processing undecodable source code.

@item 
bpo-9951@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9951}: Added a hex() method to bytes, bytearray, and memoryview.

@item 
bpo-22906@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22906}: PEP 479: Change StopIteration handling inside generators.

@item 
bpo-24017@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24017}: PEP 492: Coroutines with async and await syntax.
@end itemize

@node Library<203>,IDLE<62>,Core and Builtins<200>,Python 3 5 0 beta 1
@anchor{whatsnew/changelog id1046}@anchor{1f93}
@subsubsection Library



@itemize -

@item 
bpo-14373@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14373}: Added C implementation of functools.lru_cache().  Based on
patches by Matt Joiner and Alexey Kachayev.

@item 
bpo-24230@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24230}: The tempfile module now accepts bytes for prefix, suffix and
dir parameters and returns bytes in such situations (matching the os
module APIs).

@item 
bpo-22189@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22189}: collections.UserString now supports __getnewargs__(),
__rmod__(), casefold(), format_map(), isprintable(), and maketrans().
Patch by Joe Jevnik.

@item 
bpo-24244@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24244}: Prevents termination when an invalid format string is
encountered on Windows in strftime.

@item 
bpo-23973@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23973}: PEP 484: Add the typing module.

@item 
bpo-23086@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23086}: The collections.abc.Sequence() abstract base class added
`start' and `stop' parameters to the index() mixin. Patch by Devin
Jeanpierre.

@item 
bpo-20035@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20035}: Replaced the @code{tkinter._fix} module used for setting up the
Tcl/Tk environment on Windows with a private function in the @code{_tkinter}
module that makes no permanent changes to the environment.

@item 
bpo-24257@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24257}: Fixed segmentation fault in sqlite3.Row constructor with faked
cursor type.

@item 
bpo-15836@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15836}: assertRaises(), assertRaisesRegex(), assertWarns() and
assertWarnsRegex() assertments now check the type of the first argument to
prevent possible user error.  Based on patch by Daniel Wagner-Hall.

@item 
bpo-9858@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9858}: Add missing method stubs to _io.RawIOBase.  Patch by Laura
Rupprecht.

@item 
bpo-22955@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22955}: attrgetter, itemgetter and methodcaller objects in the operator
module now support pickling.  Added readable and evaluable repr for these
objects. Based on patch by Josh Rosenberg.

@item 
bpo-22107@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22107}: tempfile.gettempdir() and tempfile.mkdtemp() now try again when
a directory with the chosen name already exists on Windows as well as on
Unix. tempfile.mkstemp() now fails early if parent directory is not valid
(not exists or is a file) on Windows.

@item 
bpo-23780@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23780}: Improved error message in os.path.join() with single argument.

@item 
bpo-6598@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6598}: Increased time precision and random number range in
email.utils.make_msgid() to strengthen the uniqueness of the message ID.

@item 
bpo-24091@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24091}: Fixed various crashes in corner cases in C implementation of
ElementTree.

@item 
bpo-21931@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21931}: msilib.FCICreate() now raises TypeError in the case of a bad
argument instead of a ValueError with a bogus FCI error number. Patch by
Jeffrey Armstrong.

@item 
bpo-13866@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13866}: `quote_via' argument added to urllib.parse.urlencode.

@item 
bpo-20098@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20098}: New mangle_from policy option for email, default True for
compat32, but False for all other policies.

@item 
bpo-24211@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24211}: The email library now supports RFC 6532: it can generate
headers using utf-8 instead of encoded words.

@item 
bpo-16314@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16314}: Added support for the LZMA compression in distutils.

@item 
bpo-21804@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21804}: poplib now supports RFC 6856 (UTF8).

@item 
bpo-18682@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18682}: Optimized pprint functions for builtin scalar types.

@item 
bpo-22027@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22027}: smtplib now supports RFC 6531 (SMTPUTF8).

@item 
bpo-23488@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23488}: Random generator objects now consume 2x less memory on 64-bit.

@item 
bpo-1322@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1322}: platform.dist() and platform.linux_distribution() functions are
now deprecated.  Initial patch by Vajrasky Kok.

@item 
bpo-22486@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22486}: Added the math.gcd() function.  The fractions.gcd() function
now is deprecated.  Based on patch by Mark Dickinson.

@item 
bpo-24064@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24064}: Property() docstrings are now writeable. (Patch by Berker
Peksag.)

@item 
bpo-22681@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22681}: Added support for the koi8_t encoding.

@item 
bpo-22682@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22682}: Added support for the kz1048 encoding.

@item 
bpo-23796@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23796}: peek and read1 methods of BufferedReader now raise ValueError
if they called on a closed object. Patch by John Hergenroeder.

@item 
bpo-21795@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21795}: smtpd now supports the 8BITMIME extension whenever the new
`decode_data' constructor argument is set to False.

@item 
bpo-24155@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24155}: optimize heapq.heapify() for better cache performance when
heapifying large lists.

@item 
bpo-21800@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21800}: imaplib now supports RFC 5161 (enable), RFC 6855
(utf8/internationalized email) and automatically encodes non-ASCII
usernames and passwords to UTF8.

@item 
bpo-20274@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20274}: When calling a _sqlite.Connection, it now complains if passed
any keyword arguments.  Previously it silently ignored them.

@item 
bpo-20274@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20274}: Remove ignored and erroneous “kwargs” parameters from three
METH_VARARGS methods on _sqlite.Connection.

@item 
bpo-24134@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24134}: assertRaises(), assertRaisesRegex(), assertWarns() and
assertWarnsRegex() checks now emits a deprecation warning when callable is
None or keyword arguments except msg is passed in the context manager
mode.

@item 
bpo-24018@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24018}: Add a collections.abc.Generator abstract base class.
Contributed by Stefan Behnel.

@item 
bpo-23880@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23880}: Tkinter’s getint() and getdouble() now support Tcl_Obj.
Tkinter’s getdouble() now supports any numbers (in particular int).

@item 
bpo-22619@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22619}: Added negative limit support in the traceback module. Based on
patch by Dmitry Kazakov.

@item 
bpo-24094@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24094}: Fix possible crash in json.encode with poorly behaved dict
subclasses.

@item 
bpo-9246@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9246}: On POSIX, os.getcwd() now supports paths longer than 1025 bytes.
Patch written by William Orr.

@item 
bpo-17445@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17445}: add difflib.diff_bytes() to support comparison of byte strings
(fixes a regression from Python 2).

@item 
bpo-23917@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23917}: Fall back to sequential compilation when ProcessPoolExecutor
doesn’t exist. Patch by Claudiu Popa.

@item 
bpo-23008@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23008}: Fixed resolving attributes with boolean value is False in
pydoc.

@item 
Fix asyncio issue 235: LifoQueue and PriorityQueue’s put didn’t increment
unfinished tasks (this bug was introduced when JoinableQueue was merged
with Queue).

@item 
bpo-23908@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23908}: os functions now reject paths with embedded null character on
Windows instead of silently truncating them.

@item 
bpo-23728@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23728}: binascii.crc_hqx() could return an integer outside of the range
0-0xffff for empty data.

@item 
bpo-23887@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23887}: urllib.error.HTTPError now has a proper repr() representation.
Patch by Berker Peksag.

@item 
asyncio: New event loop APIs: set_task_factory() and get_task_factory().

@item 
asyncio: async() function is deprecated in favour of ensure_future().

@item 
bpo-24178@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24178}: asyncio.Lock, Condition, Semaphore, and BoundedSemaphore
support new ‘async with’ syntax.  Contributed by Yury Selivanov.

@item 
bpo-24179@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24179}: Support ‘async for’ for asyncio.StreamReader. Contributed by
Yury Selivanov.

@item 
bpo-24184@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24184}: Add AsyncIterator and AsyncIterable ABCs to collections.abc.
Contributed by Yury Selivanov.

@item 
bpo-22547@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22547}: Implement informative __repr__ for inspect.BoundArguments.
Contributed by Yury Selivanov.

@item 
bpo-24190@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24190}: Implement inspect.BoundArgument.apply_defaults() method.
Contributed by Yury Selivanov.

@item 
bpo-20691@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20691}: Add ‘follow_wrapped’ argument to
inspect.Signature.from_callable() and inspect.signature(). Contributed by
Yury Selivanov.

@item 
bpo-24248@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24248}: Deprecate inspect.Signature.from_function() and
inspect.Signature.from_builtin().

@item 
bpo-23898@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23898}: Fix inspect.classify_class_attrs() to support attributes with
overloaded __eq__ and __bool__.  Patch by Mike Bayer.

@item 
bpo-24298@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24298}: Fix inspect.signature() to correctly unwrap wrappers around
bound methods.
@end itemize

@node IDLE<62>,Tests<86>,Library<203>,Python 3 5 0 beta 1
@anchor{whatsnew/changelog id1047}@anchor{1f94}
@subsubsection IDLE



@itemize -

@item 
bpo-23184@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23184}: remove unused names and imports in idlelib. Initial patch by Al
Sweigart.
@end itemize

@node Tests<86>,Documentation<84>,IDLE<62>,Python 3 5 0 beta 1
@anchor{whatsnew/changelog id1048}@anchor{1f95}
@subsubsection Tests



@itemize -

@item 
bpo-21520@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21520}: test_zipfile no longer fails if the word ‘bad’ appears anywhere
in the name of the current directory.

@item 
bpo-9517@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9517}: Move script_helper into the support package. Patch by Christie
Wilson.
@end itemize

@node Documentation<84>,Tools/Demos<58>,Tests<86>,Python 3 5 0 beta 1
@anchor{whatsnew/changelog id1049}@anchor{1f96}
@subsubsection Documentation



@itemize -

@item 
bpo-22155@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22155}: Add File Handlers subsection with createfilehandler to tkinter
doc.  Remove obsolete example from FAQ.  Patch by Martin Panter.

@item 
bpo-24029@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24029}: Document the name binding behavior for submodule imports.

@item 
bpo-24077@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24077}: Fix typo in man page for -I command option: -s, not -S
@end itemize

@node Tools/Demos<58>,,Documentation<84>,Python 3 5 0 beta 1
@anchor{whatsnew/changelog id1050}@anchor{1f97}
@subsubsection Tools/Demos



@itemize -

@item 
bpo-24000@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24000}: Improved Argument Clinic’s mapping of converters to legacy
“format units”. Updated the documentation to match.

@item 
bpo-24001@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24001}: Argument Clinic converters now use accept=@{type@} instead of
types=@{‘type’@} to specify the types the converter accepts.

@item 
bpo-23330@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23330}: h2py now supports arbitrary filenames in #include.

@item 
bpo-24031@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24031}: make patchcheck now supports git checkouts, too.
@end itemize

@node Python 3 5 0 alpha 4,Python 3 5 0 alpha 3,Python 3 5 0 beta 1,Changelog
@anchor{whatsnew/changelog python-3-5-0-alpha-4}@anchor{1f98}
@subsection Python 3.5.0 alpha 4


`Release date: 2015-04-19'

@menu
* Core and Builtins: Core and Builtins<201>. 
* Library: Library<204>. 
* Build: Build<98>. 
* Tests: Tests<87>. 
* Tools/Demos: Tools/Demos<59>. 
* C API: C API<78>. 

@end menu

@node Core and Builtins<201>,Library<204>,,Python 3 5 0 alpha 4
@anchor{whatsnew/changelog id1051}@anchor{1f99}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-22980@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22980}: Under Linux, GNU/KFreeBSD and the Hurd, C extensions now
include the architecture triplet in the extension name, to make it easy to
test builds for different ABIs in the same working tree.  Under OS X, the
extension name now includes 
@geindex Python 향상 제안; PEP 3149
PEP 3149@footnote{https://peps.python.org/pep-3149/}-style information.

@item 
bpo-22631@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22631}: Added Linux-specific socket constant CAN_RAW_FD_FRAMES. Patch
courtesy of Joe Jevnik.

@item 
bpo-23731@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23731}: Implement 
@geindex Python 향상 제안; PEP 488
PEP 488@footnote{https://peps.python.org/pep-0488/}: removal of .pyo files.

@item 
bpo-23726@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23726}: Don’t enable GC for user subclasses of non-GC types that don’t
add any new fields.  Patch by Eugene Toder.

@item 
bpo-23309@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23309}: Avoid a deadlock at shutdown if a daemon thread is aborted
while it is holding a lock to a buffered I/O object, and the main thread
tries to use the same I/O object (typically stdout or stderr).  A fatal
error is emitted instead.

@item 
bpo-22977@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22977}: Fixed formatting Windows error messages on Wine. Patch by
Martin Panter.

@item 
bpo-23466@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23466}: %c, %o, %x, and %X in bytes formatting now raise TypeError on
non-integer input.

@item 
bpo-24044@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24044}: Fix possible null pointer dereference in list.sort in out of
memory conditions.

@item 
bpo-21354@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21354}: PyCFunction_New function is exposed by python DLL again.
@end itemize

@node Library<204>,Build<98>,Core and Builtins<201>,Python 3 5 0 alpha 4
@anchor{whatsnew/changelog id1052}@anchor{1f9a}
@subsubsection Library



@itemize -

@item 
bpo-23840@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23840}: tokenize.open() now closes the temporary binary file on error
to fix a resource warning.

@item 
bpo-16914@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16914}: new debuglevel 2 in smtplib adds timestamps to debug output.

@item 
bpo-7159@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7159}: urllib.request now supports sending auth credentials
automatically after the first 401.  This enhancement is a superset of the
enhancement from bpo-19494@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19494} and supersedes that change.

@item 
bpo-23703@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23703}: Fix a regression in urljoin() introduced in 901e4e52b20a. Patch
by Demian Brecht.

@item 
bpo-4254@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4254}: Adds _curses.update_lines_cols().  Patch by Arnon Yaari

@item 
bpo-19933@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19933}: Provide default argument for ndigits in round. Patch by
Vajrasky Kok.

@item 
bpo-23193@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23193}: Add a numeric_owner parameter to tarfile.TarFile.extract and
tarfile.TarFile.extractall. Patch by Michael Vogt and Eric Smith.

@item 
bpo-23342@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23342}: Add a subprocess.run() function than returns a CalledProcess
instance for a more consistent API than the existing call* functions.

@item 
bpo-21217@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21217}: inspect.getsourcelines() now tries to compute the start and end
lines from the code object, fixing an issue when a lambda function is used
as decorator argument. Patch by Thomas Ballinger and Allison Kaptur.

@item 
bpo-24521@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=24521}: Fix possible integer overflows in the pickle module.

@item 
bpo-22931@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22931}: Allow ‘[’ and ‘]’ in cookie values.

@item 
The keywords attribute of functools.partial is now always a dictionary.

@item 
bpo-23811@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23811}: Add missing newline to the PyCompileError error message. Patch
by Alex Shkop.

@item 
bpo-21116@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21116}: Avoid blowing memory when allocating a multiprocessing shared
array that’s larger than 50% of the available RAM.  Patch by Médéric
Boquien.

@item 
bpo-22982@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22982}: Improve BOM handling when seeking to multiple positions of a
writable text file.

@item 
bpo-23464@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23464}: Removed deprecated asyncio JoinableQueue.

@item 
bpo-23529@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23529}: Limit the size of decompressed data when reading from GzipFile,
BZ2File or LZMAFile.  This defeats denial of service attacks using
compressed bombs (i.e. compressed payloads which decompress to a huge
size).  Patch by Martin Panter and Nikolaus Rath.

@item 
bpo-21859@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21859}: Added Python implementation of io.FileIO.

@item 
bpo-23865@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23865}: close() methods in multiple modules now are idempotent and more
robust at shutdown. If they need to release multiple resources, all are
released even if errors occur.

@item 
bpo-23400@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23400}: Raise same exception on both Python 2 and 3 if sem_open is not
available. Patch by Davin Potts.

@item 
bpo-10838@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10838}: The subprocess now module includes SubprocessError and
TimeoutError in its list of exported names for the users wild enough to
use @code{from subprocess import *}.

@item 
bpo-23411@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23411}: Added DefragResult, ParseResult, SplitResult,
DefragResultBytes, ParseResultBytes, and SplitResultBytes to
urllib.parse.__all__. Patch by Martin Panter.

@item 
bpo-23881@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23881}: urllib.request.ftpwrapper constructor now closes the socket if
the FTP connection failed to fix a ResourceWarning.

@item 
bpo-23853@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23853}: @ref{fa7,,socket.socket.sendall()} does no more reset the socket
timeout each time data is sent successfully. The socket timeout is now the
maximum total duration to send all data.

@item 
bpo-22721@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22721}: An order of multiline pprint output of set or dict containing
orderable and non-orderable elements no longer depends on iteration order
of set or dict.

@item 
bpo-15133@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15133}: _tkinter.tkapp.getboolean() now supports Tcl_Obj and always
returns bool. tkinter.BooleanVar now validates input values (accepted
bool, int, str, and Tcl_Obj).  tkinter.BooleanVar.get() now always returns
bool.

@item 
bpo-10590@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10590}: xml.sax.parseString() now supports string argument.

@item 
bpo-23338@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23338}: Fixed formatting ctypes error messages on Cygwin. Patch by
Makoto Kato.

@item 
bpo-15582@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15582}: inspect.getdoc() now follows inheritance chains.

@item 
bpo-2175@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2175}: SAX parsers now support a character stream of InputSource
object.

@item 
bpo-16840@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16840}: Tkinter now supports 64-bit integers added in Tcl 8.4 and
arbitrary precision integers added in Tcl 8.5.

@item 
bpo-23834@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23834}: Fix socket.sendto(), use the C Py_ssize_t type to store the
result of sendto() instead of the C int type.

@item 
bpo-23618@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23618}: @ref{fa2,,socket.socket.connect()} now waits until the connection
completes instead of raising @ref{f87,,InterruptedError} if the connection is
interrupted by signals, signal handlers don’t raise an exception and the
socket is blocking or has a timeout. @code{socket.socket.connect()} still
raise @code{InterruptedError} for non-blocking sockets.

@item 
bpo-21526@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21526}: Tkinter now supports new boolean type in Tcl 8.5.

@item 
bpo-23836@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23836}: Fix the faulthandler module to handle reentrant calls to its
signal handlers.

@item 
bpo-23838@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23838}: linecache now clears the cache and returns an empty result on
MemoryError.

@item 
bpo-10395@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10395}: Added os.path.commonpath(). Implemented in posixpath and
ntpath. Based on patch by Rafik Draoui.

@item 
bpo-23611@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23611}: Serializing more “lookupable” objects (such as unbound methods
or nested classes) now are supported with pickle protocols < 4.

@item 
bpo-13583@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13583}: sqlite3.Row now supports slice indexing.

@item 
bpo-18473@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18473}: Fixed 2to3 and 3to2 compatible pickle mappings.  Fixed
ambiguous reverse mappings.  Added many new mappings.  Import mapping is
no longer applied to modules already mapped with full name mapping.

@item 
bpo-23485@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23485}: select.select() is now retried automatically with the
recomputed timeout when interrupted by a signal, except if the signal
handler raises an exception. This change is part of the 
@geindex Python 향상 제안; PEP 475
PEP 475@footnote{https://peps.python.org/pep-0475/}.

@item 
bpo-23752@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23752}: When built from an existing file descriptor, io.FileIO() now
only calls fstat() once. Before fstat() was called twice, which was not
necessary.

@item 
bpo-23704@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23704}: collections.deque() objects now support __add__, __mul__, and
__imul__().

@item 
bpo-23171@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23171}: csv.Writer.writerow() now supports arbitrary iterables.

@item 
bpo-23745@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23745}: The new email header parser now handles duplicate MIME
parameter names without error, similar to how get_param behaves.

@item 
bpo-22117@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22117}: Fix os.utime(), it now rounds the timestamp towards minus
infinity (-inf) instead of rounding towards zero.

@item 
bpo-23310@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23310}: Fix MagicMock’s initializer to work with __methods__, just like
configure_mock().  Patch by Kasia Jachim.
@end itemize

@node Build<98>,Tests<87>,Library<204>,Python 3 5 0 alpha 4
@anchor{whatsnew/changelog id1053}@anchor{1f9b}
@subsubsection Build



@itemize -

@item 
bpo-23817@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23817}: FreeBSD now uses “1.0” in the SOVERSION as other operating
systems, instead of just “1”.

@item 
bpo-23501@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23501}: Argument Clinic now generates code into separate files by
default.
@end itemize

@node Tests<87>,Tools/Demos<59>,Build<98>,Python 3 5 0 alpha 4
@anchor{whatsnew/changelog id1054}@anchor{1f9c}
@subsubsection Tests



@itemize -

@item 
bpo-23799@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23799}: Added test.support.start_threads() for running and cleaning up
multiple threads.

@item 
bpo-22390@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22390}: test.regrtest now emits a warning if temporary files or
directories are left after running a test.
@end itemize

@node Tools/Demos<59>,C API<78>,Tests<87>,Python 3 5 0 alpha 4
@anchor{whatsnew/changelog id1055}@anchor{1f9d}
@subsubsection Tools/Demos



@itemize -

@item 
bpo-18128@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18128}: pygettext now uses standard +NNNN format in the
POT-Creation-Date header.

@item 
bpo-23935@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23935}: Argument Clinic’s understanding of format units accepting
bytes, bytearrays, and buffers is now consistent with both the
documentation and the implementation.

@item 
bpo-23944@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23944}: Argument Clinic now wraps long impl prototypes at column 78.

@item 
bpo-20586@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20586}: Argument Clinic now ensures that functions without docstrings
have signatures.

@item 
bpo-23492@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23492}: Argument Clinic now generates argument parsing code with
PyArg_Parse instead of PyArg_ParseTuple if possible.

@item 
bpo-23500@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23500}: Argument Clinic is now smarter about generating the “#ifndef”
(empty) definition of the methoddef macro: it’s only generated once, even
if Argument Clinic processes the same symbol multiple times, and it’s
emitted at the end of all processing rather than immediately after the
first use.
@end itemize

@node C API<78>,,Tools/Demos<59>,Python 3 5 0 alpha 4
@anchor{whatsnew/changelog id1056}@anchor{1f9e}
@subsubsection C API



@itemize -

@item 
bpo-23998@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23998}: PyImport_ReInitLock() now checks for lock allocation error
@end itemize

@node Python 3 5 0 alpha 3,Python 3 5 0 alpha 2,Python 3 5 0 alpha 4,Changelog
@anchor{whatsnew/changelog python-3-5-0-alpha-3}@anchor{1f9f}
@subsection Python 3.5.0 alpha 3


`Release date: 2015-03-28'

@menu
* Core and Builtins: Core and Builtins<202>. 
* Library: Library<205>. 
* Build: Build<99>. 
* Tests: Tests<88>. 
* Tools/Demos: Tools/Demos<60>. 

@end menu

@node Core and Builtins<202>,Library<205>,,Python 3 5 0 alpha 3
@anchor{whatsnew/changelog id1057}@anchor{1fa0}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-23573@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23573}: Increased performance of string search operations (str.find,
str.index, str.count, the in operator, str.split, str.partition) with
arguments of different kinds (UCS1, UCS2, UCS4).

@item 
bpo-23753@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23753}: Python doesn’t support anymore platforms without stat() or
fstat(), these functions are always required.

@item 
bpo-23681@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23681}: The -b option now affects comparisons of bytes with int.

@item 
bpo-23632@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23632}: Memoryviews now allow tuple indexing (including for
multi-dimensional memoryviews).

@item 
bpo-23192@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23192}: Fixed generator lambdas.  Patch by Bruno Cauet.

@item 
bpo-23629@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23629}: Fix the default __sizeof__ implementation for variable-sized
objects.
@end itemize

@node Library<205>,Build<99>,Core and Builtins<202>,Python 3 5 0 alpha 3
@anchor{whatsnew/changelog id1058}@anchor{1fa1}
@subsubsection Library



@itemize -

@item 
bpo-14260@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14260}: The groupindex attribute of regular expression pattern object
now is non-modifiable mapping.

@item 
bpo-23792@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23792}: Ignore KeyboardInterrupt when the pydoc pager is active. This
mimics the behavior of the standard unix pagers, and prevents pipepager
from shutting down while the pager itself is still running.

@item 
bpo-23775@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23775}: pprint() of OrderedDict now outputs the same representation as
repr().

@item 
bpo-23765@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23765}: Removed IsBadStringPtr calls in ctypes

@item 
bpo-22364@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22364}: Improved some re error messages using regex for hints.

@item 
bpo-23742@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23742}: ntpath.expandvars() no longer loses unbalanced single quotes.

@item 
bpo-21717@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21717}: The zipfile.ZipFile.open function now supports ‘x’ (exclusive
creation) mode.

@item 
bpo-21802@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21802}: The reader in BufferedRWPair now is closed even when closing
writer failed in BufferedRWPair.close().

@item 
bpo-23622@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23622}: Unknown escapes in regular expressions that consist of @code{'\'}
and ASCII letter now raise a deprecation warning and will be forbidden in
Python 3.6.

@item 
bpo-23671@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23671}: string.Template now allows specifying the “self” parameter as a
keyword argument.  string.Formatter now allows specifying the “self” and
the “format_string” parameters as keyword arguments.

@item 
bpo-23502@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23502}: The pprint module now supports mapping proxies.

@item 
bpo-17530@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17530}: pprint now wraps long bytes objects and bytearrays.

@item 
bpo-22687@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22687}: Fixed some corner cases in breaking words in tetxtwrap. Got rid
of quadratic complexity in breaking long words.

@item 
bpo-4727@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4727}: The copy module now uses pickle protocol 4 (PEP 3154) and
supports copying of instances of classes whose __new__ method takes
keyword-only arguments.

@item 
bpo-23491@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23491}: Added a zipapp module to support creating executable zip file
archives of Python code. Registered “.pyz” and “.pyzw” extensions on
Windows for these archives (PEP 441).

@item 
bpo-23657@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23657}: Avoid explicit checks for str in zipapp, adding support for
pathlib.Path objects as arguments.

@item 
bpo-23688@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23688}: Added support of arbitrary bytes-like objects and avoided
unnecessary copying of memoryview in gzip.GzipFile.write(). Original patch
by Wolfgang Maier.

@item 
bpo-23252@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23252}: Added support for writing ZIP files to unseekable streams.

@item 
bpo-23647@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23647}: Increase imaplib’s MAXLINE to accommodate modern mailbox sizes.

@item 
bpo-23539@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23539}: If body is None, http.client.HTTPConnection.request now sets
Content-Length to 0 for PUT, POST, and PATCH headers to avoid 411 errors
from some web servers.

@item 
bpo-22351@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22351}: The nntplib.NNTP constructor no longer leaves the connection
and socket open until the garbage collector cleans them up.  Patch by
Martin Panter.

@item 
bpo-23704@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23704}: collections.deque() objects now support methods for index(),
insert(), and copy().  This allows deques to be registered as a
MutableSequence and it improves their substitutability for lists.

@item 
bpo-23715@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23715}: @ref{faa,,signal.sigwaitinfo()} and @ref{fa9,,signal.sigtimedwait()} are
now retried when interrupted by a signal not in the `sigset' parameter, if
the signal handler does not raise an exception. signal.sigtimedwait()
recomputes the timeout with a monotonic clock when it is retried.

@item 
bpo-23001@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23001}: Few functions in modules mmap, ossaudiodev, socket, ssl, and
codecs, that accepted only read-only bytes-like object now accept writable
bytes-like object too.

@item 
bpo-23646@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23646}: If time.sleep() is interrupted by a signal, the sleep is now
retried with the recomputed delay, except if the signal handler raises an
exception (PEP 475).

@item 
bpo-23136@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23136}: _strptime now uniformly handles all days in week 0, including
Dec 30 of previous year.  Based on patch by Jim Carroll.

@item 
bpo-23700@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23700}: Iterator of NamedTemporaryFile now keeps a reference to
NamedTemporaryFile instance.  Patch by Bohuslav Kabrda.

@item 
bpo-22903@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22903}: The fake test case created by unittest.loader when it fails
importing a test module is now picklable.

@item 
bpo-22181@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22181}: On Linux, os.urandom() now uses the new getrandom() syscall if
available, syscall introduced in the Linux kernel 3.17. It is more
reliable and more secure, because it avoids the need of a file descriptor
and waits until the kernel has enough entropy.

@item 
bpo-2211@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2211}: Updated the implementation of the http.cookies.Morsel class.
Setting attributes key, value and coded_value directly now is deprecated.
update() and setdefault() now transform and check keys.  Comparing for
equality now takes into account attributes key, value and coded_value.
copy() now returns a Morsel, not a dict.  repr() now contains all
attributes. Optimized checking keys and quoting values.  Added new tests.
Original patch by Demian Brecht.

@item 
bpo-18983@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18983}: Allow selection of output units in timeit. Patch by Julian
Gindi.

@item 
bpo-23631@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23631}: Fix traceback.format_list when a traceback has been mutated.

@item 
bpo-23568@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23568}: Add rdivmod support to MagicMock() objects. Patch by Håkan
Lövdahl.

@item 
bpo-2052@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2052}: Add charset parameter to HtmlDiff.make_file().

@item 
bpo-23668@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23668}: Support os.truncate and os.ftruncate on Windows.

@item 
bpo-23138@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23138}: Fixed parsing cookies with absent keys or values in cookiejar.
Patch by Demian Brecht.

@item 
bpo-23051@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23051}: multiprocessing.Pool methods imap() and imap_unordered() now
handle exceptions raised by an iterator.  Patch by Alon Diamant and Davin
Potts.

@item 
bpo-23581@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23581}: Add matmul support to MagicMock. Patch by Håkan Lövdahl.

@item 
bpo-23566@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23566}: enable(), register(), dump_traceback() and
dump_traceback_later() functions of faulthandler now accept file
descriptors. Patch by Wei Wu.

@item 
bpo-22928@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22928}: Disabled HTTP header injections in http.client. Original patch
by Demian Brecht.

@item 
bpo-23615@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23615}: Modules bz2, tarfile and tokenize now can be reloaded with
imp.reload(). Patch by Thomas Kluyver.

@item 
bpo-23605@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23605}: os.walk() now calls os.scandir() instead of os.listdir(). The
usage of os.scandir() reduces the number of calls to os.stat(). Initial
patch written by Ben Hoyt.
@end itemize

@node Build<99>,Tests<88>,Library<205>,Python 3 5 0 alpha 3
@anchor{whatsnew/changelog id1059}@anchor{1fa2}
@subsubsection Build



@itemize -

@item 
bpo-23585@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23585}: make patchcheck will ensure the interpreter is built.
@end itemize

@node Tests<88>,Tools/Demos<60>,Build<99>,Python 3 5 0 alpha 3
@anchor{whatsnew/changelog id1060}@anchor{1fa3}
@subsubsection Tests



@itemize -

@item 
bpo-23583@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23583}: Added tests for standard IO streams in IDLE.

@item 
bpo-22289@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22289}: Prevent test_urllib2net failures due to ftp connection timeout.
@end itemize

@node Tools/Demos<60>,,Tests<88>,Python 3 5 0 alpha 3
@anchor{whatsnew/changelog id1061}@anchor{1fa4}
@subsubsection Tools/Demos



@itemize -

@item 
bpo-22826@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22826}: The result of open() in Tools/freeze/bkfile.py is now better
compatible with regular files (in particular it now supports the context
management protocol).
@end itemize

@node Python 3 5 0 alpha 2,Python 3 5 0 alpha 1,Python 3 5 0 alpha 3,Changelog
@anchor{whatsnew/changelog python-3-5-0-alpha-2}@anchor{1fa5}
@subsection Python 3.5.0 alpha 2


`Release date: 2015-03-09'

@menu
* Core and Builtins: Core and Builtins<203>. 
* Library: Library<206>. 
* Build: Build<100>. 
* C API: C API<79>. 
* Windows: Windows<82>. 

@end menu

@node Core and Builtins<203>,Library<206>,,Python 3 5 0 alpha 2
@anchor{whatsnew/changelog id1062}@anchor{1fa6}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-23571@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23571}: PyObject_Call() and PyCFunction_Call() now raise a SystemError
if a function returns a result and raises an exception. The SystemError is
chained to the previous exception.
@end itemize

@node Library<206>,Build<100>,Core and Builtins<203>,Python 3 5 0 alpha 2
@anchor{whatsnew/changelog id1063}@anchor{1fa7}
@subsubsection Library



@itemize -

@item 
bpo-22524@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22524}: New os.scandir() function, part of the 
@geindex Python 향상 제안; PEP 471
PEP 471@footnote{https://peps.python.org/pep-0471/}:
“os.scandir() function – a better and faster directory iterator”. Patch
written by Ben Hoyt.

@item 
bpo-23103@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23103}: Reduced the memory consumption of IPv4Address and IPv6Address.

@item 
bpo-21793@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21793}: BaseHTTPRequestHandler again logs response code as numeric, not
as stringified enum.  Patch by Demian Brecht.

@item 
bpo-23476@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23476}: In the ssl module, enable OpenSSL’s X509_V_FLAG_TRUSTED_FIRST
flag on certificate stores when it is available.

@item 
bpo-23576@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23576}: Avoid stalling in SSL reads when EOF has been reached in the
SSL layer but the underlying connection hasn’t been closed.

@item 
bpo-23504@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23504}: Added an __all__ to the types module.

@item 
bpo-23563@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23563}: Optimized utility functions in urllib.parse.

@item 
bpo-7830@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7830}: Flatten nested functools.partial.

@item 
bpo-20204@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20204}: Added the __module__ attribute to _tkinter classes.

@item 
bpo-19980@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19980}: Improved help() for non-recognized strings.  help(‘’) now shows
the help on str.  help(‘help’) now shows the help on help(). Original
patch by Mark Lawrence.

@item 
bpo-23521@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23521}: Corrected pure python implementation of timedelta division.
Eliminated OverflowError from @code{timedelta * float} for some floats;
Corrected rounding in timedelta true division.

@item 
bpo-21619@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21619}: Popen objects no longer leave a zombie after exit in the with
statement if the pipe was broken.  Patch by Martin Panter.

@item 
bpo-22936@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22936}: Make it possible to show local variables in tracebacks for both
the traceback module and unittest.

@item 
bpo-15955@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15955}: Add an option to limit the output size in bz2.decompress().
Patch by Nikolaus Rath.

@item 
bpo-6639@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6639}: Module-level turtle functions no longer raise TclError after
closing the window.

@item 
bpo-814253@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=814253}: Group references and conditional group references now work in
lookbehind assertions in regular expressions. (See also: bpo-9179@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9179})

@item 
bpo-23215@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23215}: Multibyte codecs with custom error handlers that ignores errors
consumed too much memory and raised SystemError or MemoryError. Original
patch by Aleksi Torhamo.

@item 
bpo-5700@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5700}: io.FileIO() called flush() after closing the file. flush() was
not called in close() if closefd=False.

@item 
bpo-23374@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23374}: Fixed pydoc failure with non-ASCII files when stdout encoding
differs from file system encoding (e.g. on Mac OS).

@item 
bpo-23481@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23481}: Remove RC4 from the SSL module’s default cipher list.

@item 
bpo-21548@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21548}: Fix pydoc.synopsis() and pydoc.apropos() on modules with empty
docstrings.

@item 
bpo-22885@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22885}: Fixed arbitrary code execution vulnerability in the dbm.dumb
module. Original patch by Claudiu Popa.

@item 
bpo-23239@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23239}: ssl.match_hostname() now supports matching of IP addresses.

@item 
bpo-23146@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23146}: Fix mishandling of absolute Windows paths with forward slashes
in pathlib.

@item 
bpo-23096@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23096}: Pickle representation of floats with protocol 0 now is the same
for both Python and C implementations.

@item 
bpo-19105@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19105}: pprint now more efficiently uses free space at the right.

@item 
bpo-14910@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14910}: Add allow_abbrev parameter to argparse.ArgumentParser. Patch by
Jonathan Paugh, Steven Bethard, paul j3 and Daniel Eriksson.

@item 
bpo-21717@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21717}: tarfile.open() now supports ‘x’ (exclusive creation) mode.

@item 
bpo-23344@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23344}: marshal.dumps() is now 20-25% faster on average.

@item 
bpo-20416@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20416}: marshal.dumps() with protocols 3 and 4 is now 40-50% faster on
average.

@item 
bpo-23421@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23421}: Fixed compression in tarfile CLI.  Patch by wdv4758h.

@item 
bpo-23367@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23367}: Fix possible overflows in the unicodedata module.

@item 
bpo-23361@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23361}: Fix possible overflow in Windows subprocess creation code.

@item 
logging.handlers.QueueListener now takes a respect_handler_level keyword
argument which, if set to True, will pass messages to handlers taking
handler levels into account.

@item 
bpo-19705@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19705}: turtledemo now has a visual sorting algorithm demo.  Original
patch from Jason Yeo.

@item 
bpo-23801@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23801}: Fix issue where cgi.FieldStorage did not always ignore the
entire preamble to a multipart body.
@end itemize

@node Build<100>,C API<79>,Library<206>,Python 3 5 0 alpha 2
@anchor{whatsnew/changelog id1064}@anchor{1fa8}
@subsubsection Build



@itemize -

@item 
bpo-23445@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23445}: pydebug builds now use “gcc -Og” where possible, to make the
resulting executable faster.

@item 
bpo-23686@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23686}: Update OS X 10.5 installer build to use OpenSSL 1.0.2a.
@end itemize

@node C API<79>,Windows<82>,Build<100>,Python 3 5 0 alpha 2
@anchor{whatsnew/changelog id1065}@anchor{1fa9}
@subsubsection C API



@itemize -

@item 
bpo-20204@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20204}: Deprecation warning is now raised for builtin types without the
__module__ attribute.
@end itemize

@node Windows<82>,,C API<79>,Python 3 5 0 alpha 2
@anchor{whatsnew/changelog id1066}@anchor{1faa}
@subsubsection Windows



@itemize -

@item 
bpo-23465@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23465}: Implement 
@geindex Python 향상 제안; PEP 486
PEP 486@footnote{https://peps.python.org/pep-0486/} - Make the Python Launcher aware of
virtual environments. Patch by Paul Moore.

@item 
bpo-23437@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23437}: Make user scripts directory versioned on Windows. Patch by Paul
Moore.
@end itemize

@node Python 3 5 0 alpha 1,,Python 3 5 0 alpha 2,Changelog
@anchor{whatsnew/changelog python-3-5-0-alpha-1}@anchor{1fab}
@subsection Python 3.5.0 alpha 1


`Release date: 2015-02-08'

@menu
* Core and Builtins: Core and Builtins<204>. 
* Library: Library<207>. 
* IDLE: IDLE<63>. 
* Build: Build<101>. 
* C API: C API<80>. 
* Documentation: Documentation<85>. 
* Tests: Tests<89>. 
* Tools/Demos: Tools/Demos<61>. 
* Windows: Windows<83>. 

@end menu

@node Core and Builtins<204>,Library<207>,,Python 3 5 0 alpha 1
@anchor{whatsnew/changelog id1067}@anchor{1fac}
@subsubsection Core and Builtins



@itemize -

@item 
bpo-23285@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23285}: PEP 475 - EINTR handling.

@item 
bpo-22735@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22735}: Fix many edge cases (including crashes) involving custom mro()
implementations.

@item 
bpo-22896@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22896}: Avoid using PyObject_AsCharBuffer(), PyObject_AsReadBuffer()
and PyObject_AsWriteBuffer().

@item 
bpo-21295@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21295}: Revert some changes (bpo-16795@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16795}) to AST line numbers and
column offsets that constituted a regression.

@item 
bpo-22986@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22986}: Allow changing an object’s __class__ between a dynamic type and
static type in some cases.

@item 
bpo-15859@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15859}: PyUnicode_EncodeFSDefault(), PyUnicode_EncodeMBCS() and
PyUnicode_EncodeCodePage() now raise an exception if the object is not a
Unicode object. For PyUnicode_EncodeFSDefault(), it was already the case
on platforms other than Windows. Patch written by Campbell Barton.

@item 
bpo-21408@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21408}: The default __ne__() now returns NotImplemented if __eq__()
returned NotImplemented.  Original patch by Martin Panter.

@item 
bpo-23321@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23321}: Fixed a crash in str.decode() when error handler returned
replacement string longer than malformed input data.

@item 
bpo-22286@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22286}: The “backslashreplace” error handlers now works with decoding
and translating.

@item 
bpo-23253@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23253}: Delay-load ShellExecute[AW] in os.startfile for reduced startup
overhead on Windows.

@item 
bpo-22038@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22038}: pyatomic.h now uses stdatomic.h or GCC built-in functions for
atomic memory access if available. Patch written by Vitor de Lima and
Gustavo Temple.

@item 
bpo-20284@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20284}: %-interpolation (aka printf) formatting added for bytes and
bytearray.

@item 
bpo-23048@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23048}: Fix jumping out of an infinite while loop in the pdb.

@item 
bpo-20335@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20335}: bytes constructor now raises TypeError when encoding or errors
is specified with non-string argument.  Based on patch by Renaud Blanch.

@item 
bpo-22834@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22834}: If the current working directory ends up being set to a
non-existent directory then import will no longer raise FileNotFoundError.

@item 
bpo-22869@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22869}: Move the interpreter startup & shutdown code to a new dedicated
pylifecycle.c module

@item 
bpo-22847@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22847}: Improve method cache efficiency.

@item 
bpo-22335@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22335}: Fix crash when trying to enlarge a bytearray to 0x7fffffff
bytes on a 32-bit platform.

@item 
bpo-22653@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22653}: Fix an assertion failure in debug mode when doing a reentrant
dict insertion in debug mode.

@item 
bpo-22643@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22643}: Fix integer overflow in Unicode case operations (upper, lower,
title, swapcase, casefold).

@item 
bpo-17636@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17636}: Circular imports involving relative imports are now supported.

@item 
bpo-22604@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22604}: Fix assertion error in debug mode when dividing a complex
number by (nan+0j).

@item 
bpo-21052@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21052}: Do not raise ImportWarning when sys.path_hooks or sys.meta_path
are set to None.

@item 
bpo-16518@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16518}: Use ‘bytes-like object required’ in error messages that
previously used the far more cryptic “‘x’ does not support the buffer
protocol.

@item 
bpo-22470@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22470}: Fixed integer overflow issues in “backslashreplace”,
“xmlcharrefreplace”, and “surrogatepass” error handlers.

@item 
bpo-22540@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22540}: speed up @code{PyObject_IsInstance} and @code{PyObject_IsSubclass} in
the common case that the second argument has metaclass @code{type}.

@item 
bpo-18711@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18711}: Add a new @code{PyErr_FormatV} function, similar to
@code{PyErr_Format} but accepting a @code{va_list} argument.

@item 
bpo-22520@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22520}: Fix overflow checking when generating the repr of a unicode
object.

@item 
bpo-22519@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22519}: Fix overflow checking in PyBytes_Repr.

@item 
bpo-22518@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22518}: Fix integer overflow issues in latin-1 encoding.

@item 
bpo-16324@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16324}: _charset parameter of MIMEText now also accepts
email.charset.Charset instances. Initial patch by Claude Paroz.

@item 
bpo-1764286@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1764286}: Fix inspect.getsource() to support decorated functions. Patch
by Claudiu Popa.

@item 
bpo-18554@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18554}: os.__all__ includes posix functions.

@item 
bpo-21391@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21391}: Use os.path.abspath in the shutil module.

@item 
bpo-11471@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11471}: avoid generating a JUMP_FORWARD instruction at the end of an
if-block if there is no else-clause.  Original patch by Eugene Toder.

@item 
bpo-22215@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22215}: Now ValueError is raised instead of TypeError when str or bytes
argument contains not permitted null character or byte.

@item 
bpo-22258@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22258}: Fix the internal function set_inheritable() on Illumos. This
platform exposes the function @code{ioctl(FIOCLEX)}, but calling it fails
with errno is ENOTTY: “Inappropriate ioctl for device”. set_inheritable()
now falls back to the slower @code{fcntl()} (@code{F_GETFD} and then
@code{F_SETFD}).

@item 
bpo-21389@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21389}: Displaying the __qualname__ of the underlying function in the
repr of a bound method.

@item 
bpo-22206@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22206}: Using pthread, PyThread_create_key() now sets errno to ENOMEM
and returns -1 (error) on integer overflow.

@item 
bpo-20184@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20184}: Argument Clinic based signature introspection added for 30 of
the builtin functions.

@item 
bpo-22116@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22116}: C functions and methods (of the ‘builtin_function_or_method’
type) can now be weakref’ed.  Patch by Wei Wu.

@item 
bpo-22077@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22077}: Improve index error messages for bytearrays, bytes, lists, and
tuples by adding ‘or slices’. Added ‘, not <typename>’ for bytearrays.
Original patch by Claudiu Popa.

@item 
bpo-20179@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20179}: Apply Argument Clinic to bytes and bytearray. Patch by Tal
Einat.

@item 
bpo-22082@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22082}: Clear interned strings in slotdefs.

@item 
Upgrade Unicode database to Unicode 7.0.0.

@item 
bpo-21897@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21897}: Fix a crash with the f_locals attribute with closure variables
when frame.clear() has been called.

@item 
bpo-21205@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21205}: Add a new @code{__qualname__} attribute to generator, the
qualified name, and use it in the representation of a generator
(@code{repr(gen)}). The default name of the generator (@code{__name__}
attribute) is now get from the function instead of the code. Use
@code{gen.gi_code.co_name} to get the name of the code.

@item 
bpo-21669@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21669}: With the aid of heuristics in SyntaxError.__init__, the parser
now attempts to generate more meaningful (or at least more search engine
friendly) error messages when “exec” and “print” are used as statements.

@item 
bpo-21642@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21642}: In the conditional if-else expression, allow an integer written
with no space between itself and the @code{else} keyword (e.g. @code{True if
42else False}) to be valid syntax.

@item 
bpo-21523@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21523}: Fix over-pessimistic computation of the stack effect of some
opcodes in the compiler.  This also fixes a quadratic compilation time
issue noticeable when compiling code with a large number of “and” and “or”
operators.

@item 
bpo-21418@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21418}: Fix a crash in the builtin function super() when called without
argument and without current frame (ex: embedded Python).

@item 
bpo-21425@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21425}: Fix flushing of standard streams in the interactive
interpreter.

@item 
bpo-21435@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21435}: In rare cases, when running finalizers on objects in cyclic
trash a bad pointer dereference could occur due to a subtle flaw in
internal iteration logic.

@item 
bpo-21377@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21377}: PyBytes_Concat() now tries to concatenate in-place when the
first argument has a reference count of 1.  Patch by Nikolaus Rath.

@item 
bpo-20355@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20355}: -W command line options now have higher priority than the
PYTHONWARNINGS environment variable.  Patch by Arfrever.

@item 
bpo-21274@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21274}: Define PATH_MAX for GNU/Hurd in Python/pythonrun.c.

@item 
bpo-20904@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20904}: Support setting FPU precision on m68k.

@item 
bpo-21209@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21209}: Fix sending tuples to custom generator objects with the yield
from syntax.

@item 
bpo-21193@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21193}: pow(a, b, c) now raises ValueError rather than TypeError when b
is negative. Patch by Josh Rosenberg.

@item 
bpo-21176@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21176}: PEP 465: Add the ‘@@’ operator for matrix multiplication.

@item 
bpo-21134@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21134}: Fix segfault when str is called on an uninitialized
UnicodeEncodeError, UnicodeDecodeError, or UnicodeTranslateError object.

@item 
bpo-19537@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19537}: Fix PyUnicode_DATA() alignment under m68k.  Patch by Andreas
Schwab.

@item 
bpo-20929@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20929}: Add a type cast to avoid shifting a negative number.

@item 
bpo-20731@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20731}: Properly position in source code files even if they are opened
in text mode. Patch by Serhiy Storchaka.

@item 
bpo-20637@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20637}: Key-sharing now also works for instance dictionaries of
subclasses.  Patch by Peter Ingebretson.

@item 
bpo-8297@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8297}: Attributes missing from modules now include the module name in
the error text.  Original patch by ysj.ray.

@item 
bpo-19995@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19995}: %c, %o, %x, and %X now raise TypeError on non-integer input.

@item 
bpo-19655@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19655}: The ASDL parser - used by the build process to generate code
for managing the Python AST in C - was rewritten. The new parser is self
contained and does not require to carry long the spark.py parser-generator
library; spark.py was removed from the source base.

@item 
bpo-12546@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12546}: Allow @code{\x00} to be used as a fill character when using str,
int, float, and complex __format__ methods.

@item 
bpo-20480@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20480}: Add ipaddress.reverse_pointer. Patch by Leon Weber.

@item 
bpo-13598@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13598}: Modify string.Formatter to support auto-numbering of
replacement fields. It now matches the behavior of str.format() in this
regard. Patches by Phil Elson and Ramchandra Apte.

@item 
bpo-8931@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8931}: Make alternate formatting (‘#’) for type ‘c’ raise an exception.
In versions prior to 3.5, ‘#’ with ‘c’ had no effect. Now specifying it is
an error. Patch by Torsten Landschoff.

@item 
bpo-23165@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23165}: Perform overflow checks before allocating memory in the
_Py_char2wchar function.
@end itemize

@node Library<207>,IDLE<63>,Core and Builtins<204>,Python 3 5 0 alpha 1
@anchor{whatsnew/changelog id1068}@anchor{1fad}
@subsubsection Library



@itemize -

@item 
bpo-23399@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23399}: pyvenv creates relative symlinks where possible.

@item 
bpo-20289@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20289}: cgi.FieldStorage() now supports the context management
protocol.

@item 
bpo-13128@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13128}: Print response headers for CONNECT requests when debuglevel >
0. Patch by Demian Brecht.

@item 
bpo-15381@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15381}: Optimized io.BytesIO to make less allocations and copyings.

@item 
bpo-22818@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22818}: Splitting on a pattern that could match an empty string now
raises a warning.  Patterns that can only match empty strings are now
rejected.

@item 
bpo-23099@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23099}: Closing io.BytesIO with exported buffer is rejected now to
prevent corrupting exported buffer.

@item 
bpo-23326@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23326}: Removed __ne__ implementations.  Since fixing default __ne__
implementation in bpo-21408@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21408} they are redundant.

@item 
bpo-23363@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23363}: Fix possible overflow in itertools.permutations.

@item 
bpo-23364@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23364}: Fix possible overflow in itertools.product.

@item 
bpo-23366@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23366}: Fixed possible integer overflow in itertools.combinations.

@item 
bpo-23369@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23369}: Fixed possible integer overflow in
_json.encode_basestring_ascii.

@item 
bpo-23353@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23353}: Fix the exception handling of generators in
PyEval_EvalFrameEx(). At entry, save or swap the exception state even if
PyEval_EvalFrameEx() is called with throwflag=0. At exit, the exception
state is now always restored or swapped, not only if why is WHY_YIELD or
WHY_RETURN. Patch co-written with Antoine Pitrou.

@item 
bpo-14099@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14099}: Restored support of writing ZIP files to tellable but
non-seekable streams.

@item 
bpo-14099@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14099}: Writing to ZipFile and reading multiple ZipExtFiles is
threadsafe now.

@item 
bpo-19361@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19361}: JSON decoder now raises JSONDecodeError instead of ValueError.

@item 
bpo-18518@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18518}: timeit now rejects statements which can’t be compiled outside a
function or a loop (e.g. “return” or “break”).

@item 
bpo-23094@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23094}: Fixed readline with frames in Python implementation of pickle.

@item 
bpo-23268@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23268}: Fixed bugs in the comparison of ipaddress classes.

@item 
bpo-21408@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21408}: Removed incorrect implementations of __ne__() which didn’t
returned NotImplemented if __eq__() returned NotImplemented.  The default
__ne__() now works correctly.

@item 
bpo-19996@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19996}: @code{email.feedparser.FeedParser} now handles (malformed)
headers with no key rather than assuming the body has started.

@item 
bpo-20188@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20188}: Support Application-Layer Protocol Negotiation (ALPN) in the
ssl module.

@item 
bpo-23133@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23133}: Pickling of ipaddress objects now produces more compact and
portable representation.

@item 
bpo-23248@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23248}: Update ssl error codes from latest OpenSSL git master.

@item 
bpo-23266@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23266}: Much faster implementation of ipaddress.collapse_addresses()
when there are many non-consecutive addresses.

@item 
bpo-23098@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23098}: 64-bit dev_t is now supported in the os module.

@item 
bpo-21817@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21817}: When an exception is raised in a task submitted to a
ProcessPoolExecutor, the remote traceback is now displayed in the parent
process.  Patch by Claudiu Popa.

@item 
bpo-15955@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15955}: Add an option to limit output size when decompressing LZMA
data.  Patch by Nikolaus Rath and Martin Panter.

@item 
bpo-23250@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23250}: In the http.cookies module, capitalize “HttpOnly” and “Secure”
as they are written in the standard.

@item 
bpo-23063@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23063}: In the distutils’ check command, fix parsing of reST with code
or code-block directives.

@item 
bpo-23209@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23209}: selectors.BaseSelector.get_key() now raises a RuntimeError if
the selector is closed. And selectors.BaseSelector.close() now clears its
internal reference to the selector mapping to break a reference cycle.
Initial patch written by Martin Richard. (See also: bpo-23225@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23225})

@item 
bpo-17911@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17911}: Provide a way to seed the linecache for a PEP-302 module
without actually loading the code.

@item 
bpo-17911@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17911}: Provide a new object API for traceback, including the ability
to not lookup lines at all until the traceback is actually rendered,
without any trace of the original objects being kept alive.

@item 
bpo-19777@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19777}: Provide a home() classmethod on Path objects.  Contributed by
Victor Salgado and Mayank Tripathi.

@item 
bpo-23206@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23206}: Make @code{json.dumps(..., ensure_ascii=False)} as fast as the
default case of @code{ensure_ascii=True}.  Patch by Naoki Inada.

@item 
bpo-23185@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23185}: Add math.inf and math.nan constants.

@item 
bpo-23186@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23186}: Add ssl.SSLObject.shared_ciphers() and
ssl.SSLSocket.shared_ciphers() to fetch the client’s list ciphers sent at
handshake.

@item 
bpo-23143@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23143}: Remove compatibility with OpenSSLs older than 0.9.8.

@item 
bpo-23132@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23132}: Improve performance and introspection support of comparison
methods created by functool.total_ordering.

@item 
bpo-19776@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19776}: Add an expanduser() method on Path objects.

@item 
bpo-23112@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23112}: Fix SimpleHTTPServer to correctly carry the query string and
fragment when it redirects to add a trailing slash.

@item 
bpo-21793@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21793}: Added http.HTTPStatus enums (i.e. HTTPStatus.OK,
HTTPStatus.NOT_FOUND). Patch by Demian Brecht.

@item 
bpo-23093@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23093}: In the io, module allow more operations to work on detached
streams.

@item 
bpo-23111@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23111}: In the ftplib, make ssl.PROTOCOL_SSLv23 the default protocol
version.

@item 
bpo-22585@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22585}: On OpenBSD 5.6 and newer, os.urandom() now calls getentropy(),
instead of reading /dev/urandom, to get pseudo-random bytes.

@item 
bpo-19104@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19104}: pprint now produces evaluable output for wrapped strings.

@item 
bpo-23071@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23071}: Added missing names to codecs.__all__.  Patch by Martin Panter.

@item 
bpo-22783@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22783}: Pickling now uses the NEWOBJ opcode instead of the NEWOBJ_EX
opcode if possible.

@item 
bpo-15513@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15513}: Added a __sizeof__ implementation for pickle classes.

@item 
bpo-19858@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19858}: pickletools.optimize() now aware of the MEMOIZE opcode, can
produce more compact result and no longer produces invalid output if input
data contains MEMOIZE opcodes together with PUT or BINPUT opcodes.

@item 
bpo-22095@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22095}: Fixed HTTPConnection.set_tunnel with default port.  The port
value in the host header was set to “None”.  Patch by Demian Brecht.

@item 
bpo-23016@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23016}: A warning no longer produces an AttributeError when the program
is run with pythonw.exe.

@item 
bpo-21775@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21775}: shutil.copytree(): fix crash when copying to VFAT. An exception
handler assumed that OSError objects always have a ‘winerror’ attribute.
That is not the case, so the exception handler itself raised
AttributeError when run on Linux (and, presumably, any other non-Windows
OS). Patch by Greg Ward.

@item 
bpo-1218234@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1218234}: Fix inspect.getsource() to load updated source of reloaded
module. Initial patch by Berker Peksag.

@item 
bpo-21740@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21740}: Support wrapped callables in doctest. Patch by Claudiu Popa.

@item 
bpo-23009@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23009}: Make sure selectors.EpollSelector.select() works when no FD is
registered.

@item 
bpo-22959@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22959}: In the constructor of http.client.HTTPSConnection, prefer the
context’s check_hostname attribute over the `check_hostname' parameter.

@item 
bpo-22696@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22696}: Add function @ref{c7f,,sys.is_finalizing()} to know about
interpreter shutdown.

@item 
bpo-16043@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16043}: Add a default limit for the amount of data
xmlrpclib.gzip_decode will return. This resolves 
@geindex Common Vulnerabilities and Exposures; CVE 2013-1753
CVE 2013-1753@footnote{https://www.cve.org/CVERecord?id=CVE-2013-1753}.

@item 
bpo-14099@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14099}: ZipFile.open() no longer reopen the underlying file.  Objects
returned by ZipFile.open() can now operate independently of the ZipFile
even if the ZipFile was created by passing in a file-like object as the
first argument to the constructor.

@item 
bpo-22966@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22966}: Fix __pycache__ pyc file name clobber when pyc_compile is asked
to compile a source file containing multiple dots in the source file name.

@item 
bpo-21971@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21971}: Update turtledemo doc and add module to the index.

@item 
bpo-21032@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21032}: Fixed socket leak if HTTPConnection.getresponse() fails.
Original patch by Martin Panter.

@item 
bpo-22407@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22407}: Deprecated the use of re.LOCALE flag with str patterns or
re.ASCII. It was newer worked.

@item 
bpo-22902@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22902}: The “ip” command is now used on Linux to determine MAC address
in uuid.getnode().  Patch by Bruno Cauet.

@item 
bpo-22960@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22960}: Add a context argument to xmlrpclib.ServerProxy constructor.

@item 
bpo-22389@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22389}: Add contextlib.redirect_stderr().

@item 
bpo-21356@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21356}: Make ssl.RAND_egd() optional to support LibreSSL. The
availability of the function is checked during the compilation. Patch
written by Bernard Spil.

@item 
bpo-22915@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22915}: SAX parser now supports files opened with file descriptor or
bytes path.

@item 
bpo-22609@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22609}: Constructors and update methods of mapping classes in the
collections module now accept the self keyword argument.

@item 
bpo-22940@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22940}: Add readline.append_history_file.

@item 
bpo-19676@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19676}: Added the “namereplace” error handler.

@item 
bpo-22788@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22788}: Add `context' parameter to logging.handlers.HTTPHandler.

@item 
bpo-22921@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22921}: Allow SSLContext to take the `hostname' parameter even if
OpenSSL doesn’t support SNI.

@item 
bpo-22894@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22894}: TestCase.subTest() would cause the test suite to be stopped
when in failfast mode, even in the absence of failures.

@item 
bpo-22796@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22796}: HTTP cookie parsing is now stricter, in order to protect
against potential injection attacks.

@item 
bpo-22370@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22370}: Windows detection in pathlib is now more robust.

@item 
bpo-22841@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22841}: Reject coroutines in asyncio add_signal_handler(). Patch by
Ludovic.Gasc.

@item 
bpo-19494@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19494}: Added urllib.request.HTTPBasicPriorAuthHandler. Patch by Matej
Cepl.

@item 
bpo-22578@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22578}: Added attributes to the re.error class.

@item 
bpo-22849@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22849}: Fix possible double free in the io.TextIOWrapper constructor.

@item 
bpo-12728@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12728}: Different Unicode characters having the same uppercase but
different lowercase are now matched in case-insensitive regular
expressions.

@item 
bpo-22821@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22821}: Fixed fcntl() with integer argument on 64-bit big-endian
platforms.

@item 
bpo-21650@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21650}: Add an @code{--sort-keys} option to @code{json.tool} CLI.

@item 
bpo-22824@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22824}: Updated reprlib output format for sets to use set literals.
Patch contributed by Berker Peksag.

@item 
bpo-22824@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22824}: Updated reprlib output format for arrays to display empty
arrays without an unnecessary empty list.  Suggested by Serhiy Storchaka.

@item 
bpo-22406@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22406}: Fixed the uu_codec codec incorrectly ported to 3.x. Based on
patch by Martin Panter.

@item 
bpo-17293@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17293}: uuid.getnode() now determines MAC address on AIX using netstat.
Based on patch by Aivars Kalvāns.

@item 
bpo-22769@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22769}: Fixed ttk.Treeview.tag_has() when called without arguments.

@item 
bpo-22417@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22417}: Verify certificates by default in httplib (PEP 476).

@item 
bpo-22775@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22775}: Fixed unpickling of http.cookies.SimpleCookie with protocol 2
and above. Patch by Tim Graham.

@item 
bpo-22776@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22776}: Brought excluded code into the scope of a try block in
SysLogHandler.emit().

@item 
bpo-22665@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22665}: Add missing get_terminal_size and SameFileError to
shutil.__all__.

@item 
bpo-6623@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6623}: Remove deprecated Netrc class in the ftplib module. Patch by
Matt Chaput.

@item 
bpo-17381@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17381}: Fixed handling of case-insensitive ranges in regular
expressions.

@item 
bpo-22410@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22410}: Module level functions in the re module now cache compiled
locale-dependent regular expressions taking into account the locale.

@item 
bpo-22759@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22759}: Query methods on pathlib.Path() (exists(), is_dir(), etc.) now
return False when the underlying stat call raises NotADirectoryError.

@item 
bpo-8876@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8876}: distutils now falls back to copying files when hard linking
doesn’t work. This allows use with special filesystems such as VirtualBox
shared folders.

@item 
bpo-22217@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22217}: Implemented reprs of classes in the zipfile module.

@item 
bpo-22457@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22457}: Honour load_tests in the start_dir of discovery.

@item 
bpo-18216@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18216}: gettext now raises an error when a .mo file has an unsupported
major version number.  Patch by Aaron Hill.

@item 
bpo-13918@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13918}: Provide a locale.delocalize() function which can remove
locale-specific number formatting from a string representing a number,
without then converting it to a specific type.  Patch by Cédric Krier.

@item 
bpo-22676@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22676}: Make the pickling of global objects which don’t have a
__module__ attribute less slow.

@item 
bpo-18853@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18853}: Fixed ResourceWarning in shlex.__nain__.

@item 
bpo-9351@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9351}: Defaults set with set_defaults on an argparse subparser are no
longer ignored when also set on the parent parser.

@item 
bpo-7559@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7559}: unittest test loading ImportErrors are reported as import errors
with their import exception rather than as attribute errors after the
import has already failed.

@item 
bpo-19746@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19746}: Make it possible to examine the errors from unittest discovery
without executing the test suite. The new @code{errors} attribute on
@code{TestLoader} exposes these non-fatal errors encountered during
discovery.

@item 
bpo-21991@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21991}: Make email.headerregistry’s header ‘params’ attributes be
read-only (MappingProxyType).  Previously the dictionary was modifiable
but a new one was created on each access of the attribute.

@item 
bpo-22638@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22638}: SSLv3 is now disabled throughout the standard library. It can
still be enabled by instantiating a SSLContext manually.

@item 
bpo-22641@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22641}: In asyncio, the default SSL context for client connections is
now created using ssl.create_default_context(), for stronger security.

@item 
bpo-17401@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17401}: Include closefd in io.FileIO repr.

@item 
bpo-21338@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21338}: Add silent mode for compileall. quiet parameters of
compile_@{dir, file, path@} functions now have a multilevel value. Also, -q
option of the CLI now have a multilevel value. Patch by Thomas Kluyver.

@item 
bpo-20152@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20152}: Convert the array and cmath modules to Argument Clinic.

@item 
bpo-18643@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18643}: Add socket.socketpair() on Windows.

@item 
bpo-22435@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22435}: Fix a file descriptor leak when socketserver bind fails.

@item 
bpo-13096@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13096}: Fixed segfault in CTypes POINTER handling of large values.

@item 
bpo-11694@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11694}: Raise ConversionError in xdrlib as documented.  Patch by Filip
Gruszczyński and Claudiu Popa.

@item 
bpo-19380@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19380}: Optimized parsing of regular expressions.

@item 
bpo-1519638@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=1519638}: Now unmatched groups are replaced with empty strings in
re.sub() and re.subn().

@item 
bpo-18615@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18615}: sndhdr.what/whathdr now return a namedtuple.

@item 
bpo-22462@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22462}: Fix pyexpat’s creation of a dummy frame to make it appear in
exception tracebacks.

@item 
bpo-21965@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21965}: Add support for in-memory SSL to the ssl module.  Patch by
Geert Jansen.

@item 
bpo-21173@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21173}: Fix len() on a WeakKeyDictionary when .clear() was called with
an iterator alive.

@item 
bpo-11866@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11866}: Eliminated race condition in the computation of names for new
threads.

@item 
bpo-21905@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21905}: Avoid RuntimeError in pickle.whichmodule() when sys.modules is
mutated while iterating.  Patch by Olivier Grisel.

@item 
bpo-11271@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11271}: concurrent.futures.Executor.map() now takes a `chunksize'
argument to allow batching of tasks in child processes and improve
performance of ProcessPoolExecutor.  Patch by Dan O’Reilly.

@item 
bpo-21883@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21883}: os.path.join() and os.path.relpath() now raise a TypeError with
more helpful error message for unsupported or mismatched types of
arguments.

@item 
bpo-22219@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22219}: The zipfile module CLI now adds entries for directories
(including empty directories) in ZIP file.

@item 
bpo-22449@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22449}: In the ssl.SSLContext.load_default_certs, consult the
environmental variables SSL_CERT_DIR and SSL_CERT_FILE on Windows.

@item 
bpo-22508@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22508}: The email.__version__ variable has been removed; the email code
is no longer shipped separately from the stdlib, and __version__ hasn’t
been updated in several releases.

@item 
bpo-20076@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20076}: Added non derived UTF-8 aliases to locale aliases table.

@item 
bpo-20079@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20079}: Added locales supported in glibc 2.18 to locale alias table.

@item 
bpo-20218@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20218}: Added convenience methods read_text/write_text and read_bytes/
write_bytes to pathlib.Path objects.

@item 
bpo-22396@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22396}: On 32-bit AIX platform, don’t expose os.posix_fadvise() nor
os.posix_fallocate() because their prototypes in system headers are wrong.

@item 
bpo-22517@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22517}: When an io.BufferedRWPair object is deallocated, clear its
weakrefs.

@item 
bpo-22437@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22437}: Number of capturing groups in regular expression is no longer
limited by 100.

@item 
bpo-17442@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17442}: InteractiveInterpreter now displays the full chained traceback
in its showtraceback method, to match the built in interactive
interpreter.

@item 
bpo-23392@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23392}: Added tests for marshal C API that works with FILE*.

@item 
bpo-10510@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10510}: distutils register and upload methods now use HTML standards
compliant CRLF line endings.

@item 
bpo-9850@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9850}: Fixed macpath.join() for empty first component.  Patch by Oleg
Oshmyan.

@item 
bpo-5309@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5309}: distutils’ build and build_ext commands now accept a @code{-j}
option to enable parallel building of extension modules.

@item 
bpo-22448@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22448}: Improve canceled timer handles cleanup to prevent unbound
memory usage. Patch by Joshua Moore-Oliva.

@item 
bpo-22427@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22427}: TemporaryDirectory no longer attempts to clean up twice when
used in the with statement in generator.

@item 
bpo-22362@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22362}: Forbidden ambiguous octal escapes out of range 0-0o377 in
regular expressions.

@item 
bpo-20912@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20912}: Now directories added to ZIP file have correct Unix and MS-DOS
directory attributes.

@item 
bpo-21866@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21866}: ZipFile.close() no longer writes ZIP64 central directory
records if allowZip64 is false.

@item 
bpo-22278@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22278}: Fix urljoin problem with relative urls, a regression observed
after changes to issue22118 were submitted.

@item 
bpo-22415@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22415}: Fixed debugging output of the GROUPREF_EXISTS opcode in the re
module. Removed trailing spaces in debugging output.

@item 
bpo-22423@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22423}: Unhandled exception in thread no longer causes unhandled
AttributeError when sys.stderr is None.

@item 
bpo-21332@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21332}: Ensure that @code{bufsize=1} in subprocess.Popen() selects line
buffering, rather than block buffering.  Patch by Akira Li.

@item 
bpo-21091@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21091}: Fix API bug: email.message.EmailMessage.is_attachment is now a
method.

@item 
bpo-21079@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21079}: Fix email.message.EmailMessage.is_attachment to return the
correct result when the header has parameters as well as a value.

@item 
bpo-22247@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22247}: Add NNTPError to nntplib.__all__.

@item 
bpo-22366@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22366}: urllib.request.urlopen will accept a context object
(SSLContext) as an argument which will then be used for HTTPS connection.
Patch by Alex Gaynor.

@item 
bpo-4180@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4180}: The warnings registries are now reset when the filters are
modified.

@item 
bpo-22419@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22419}: Limit the length of incoming HTTP request in wsgiref server to
65536 bytes and send a 414 error code for higher lengths. Patch
contributed by Devin Cook.

@item 
Lax cookie parsing in http.cookies could be a security issue when combined
with non-standard cookie handling in some web browsers.  Reported by
Sergey Bobrov.

@item 
bpo-20537@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20537}: logging methods now accept an exception instance as well as a
Boolean value or exception tuple. Thanks to Yury Selivanov for the patch.

@item 
bpo-22384@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22384}: An exception in Tkinter callback no longer crashes the program
when it is run with pythonw.exe.

@item 
bpo-22168@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22168}: Prevent turtle AttributeError with non-default Canvas on OS X.

@item 
bpo-21147@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21147}: sqlite3 now raises an exception if the request contains a null
character instead of truncating it.  Based on patch by Victor Stinner.

@item 
bpo-13968@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13968}: The glob module now supports recursive search in subdirectories
using the @code{**} pattern.

@item 
bpo-21951@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21951}: Fixed a crash in Tkinter on AIX when called Tcl command with
empty string or tuple argument.

@item 
bpo-21951@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21951}: Tkinter now most likely raises MemoryError instead of crash if
the memory allocation fails.

@item 
bpo-22338@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22338}: Fix a crash in the json module on memory allocation failure.

@item 
bpo-12410@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12410}: imaplib.IMAP4 now supports the context management protocol.
Original patch by Tarek Ziadé.

@item 
bpo-21270@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21270}: We now override tuple methods in mock.call objects so that they
can be used as normal call attributes.

@item 
bpo-16662@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16662}: @code{load_tests()} is now unconditionally run when it is present
in a package’s @code{__init__.py}.  @code{TestLoader.loadTestsFromModule()}
still accepts use_load_tests, but it is deprecated and ignored.  A new
keyword-only attribute @code{pattern} is added and documented.  Patch given
by Robert Collins, tweaked by Barry Warsaw.

@item 
bpo-22226@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22226}: First letter no longer is stripped from the “status” key in the
result of Treeview.heading().

@item 
bpo-19524@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19524}: Fixed resource leak in the HTTP connection when an invalid
response is received.  Patch by Martin Panter.

@item 
bpo-20421@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20421}: Add a .version() method to SSL sockets exposing the actual
protocol version in use.

@item 
bpo-19546@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19546}: configparser exceptions no longer expose implementation
details. Chained KeyErrors are removed, which leads to cleaner tracebacks.
Patch by Claudiu Popa.

@item 
bpo-22051@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22051}: turtledemo no longer reloads examples to re-run them.
Initialization of variables and gui setup should be done in main(), which
is called each time a demo is run, but not on import.

@item 
bpo-21933@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21933}: Turtledemo users can change the code font size with a menu
selection or control(command) ‘-’ or ‘+’ or control-mousewheel. Original
patch by Lita Cho.

@item 
bpo-21597@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21597}: The separator between the turtledemo text pane and the drawing
canvas can now be grabbed and dragged with a mouse.  The code text pane
can be widened to easily view or copy the full width of the text.  The
canvas can be widened on small screens.  Original patches by Jan Kanis and
Lita Cho.

@item 
bpo-18132@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18132}: Turtledemo buttons no longer disappear when the window is
shrunk.  Original patches by Jan Kanis and Lita Cho.

@item 
bpo-22043@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22043}: time.monotonic() is now always available.
@code{threading.Lock.acquire()}, @code{threading.RLock.acquire()} and socket
operations now use a monotonic clock, instead of the system clock, when a
timeout is used.

@item 
bpo-21527@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21527}: Add a default number of workers to ThreadPoolExecutor equal to
5 times the number of CPUs.  Patch by Claudiu Popa.

@item 
bpo-22216@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22216}: smtplib now resets its state more completely after a quit.  The
most obvious consequence of the previous behavior was a STARTTLS failure
during a connect/starttls/quit/connect/starttls sequence.

@item 
bpo-22098@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22098}: ctypes’ BigEndianStructure and LittleEndianStructure now define
an empty __slots__ so that subclasses don’t always get an instance dict.
Patch by Claudiu Popa.

@item 
bpo-22185@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22185}: Fix an occasional RuntimeError in threading.Condition.wait()
caused by mutation of the waiters queue without holding the lock.  Patch
by Doug Zongker.

@item 
bpo-22287@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22287}: On UNIX, _PyTime_gettimeofday() now uses
clock_gettime(CLOCK_REALTIME) if available. As a side effect, Python now
depends on the librt library on Solaris and on Linux (only with glibc
older than 2.17).

@item 
bpo-22182@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22182}: Use e.args to unpack exceptions correctly in
distutils.file_util.move_file. Patch by Claudiu Popa.

@item 
The webbrowser module now uses subprocess’s start_new_session=True rather
than a potentially risky preexec_fn=os.setsid call.

@item 
bpo-22042@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22042}: signal.set_wakeup_fd(fd) now raises an exception if the file
descriptor is in blocking mode.

@item 
bpo-16808@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16808}: inspect.stack() now returns a named tuple instead of a tuple.
Patch by Daniel Shahaf.

@item 
bpo-22236@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22236}: Fixed Tkinter images copying operations in NoDefaultRoot mode.

@item 
bpo-2527@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=2527}: Add a `globals' argument to timeit functions, in order to
override the globals namespace in which the timed code is executed. Patch
by Ben Roberts.

@item 
bpo-22118@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22118}: Switch urllib.parse to use RFC 3986 semantics for the
resolution of relative URLs, rather than RFCs 1808 and 2396. Patch by
Demian Brecht.

@item 
bpo-21549@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21549}: Added the “members” parameter to TarFile.list().

@item 
bpo-19628@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19628}: Allow compileall recursion depth to be specified with a -r
option.

@item 
bpo-15696@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15696}: Add a __sizeof__ implementation for mmap objects on Windows.

@item 
bpo-22068@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22068}: Avoided reference loops with Variables and Fonts in Tkinter.

@item 
bpo-22165@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22165}: SimpleHTTPRequestHandler now supports undecodable file names.

@item 
bpo-15381@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15381}: Optimized line reading in io.BytesIO.

@item 
bpo-8797@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=8797}: Raise HTTPError on failed Basic Authentication immediately.
Initial patch by Sam Bull.

@item 
bpo-20729@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20729}: Restored the use of lazy iterkeys()/itervalues()/iteritems() in
the mailbox module.

@item 
bpo-21448@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21448}: Changed FeedParser feed() to avoid `O'(`n'@w{^2})
behavior when parsing long line. Original patch by Raymond Hettinger.

@item 
bpo-22184@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22184}: The functools LRU Cache decorator factory now gives an earlier
and clearer error message when the user forgets the required parameters.

@item 
bpo-17923@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17923}: glob() patterns ending with a slash no longer match non-dirs on
AIX.  Based on patch by Delhallt.

@item 
bpo-21725@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21725}: Added support for RFC 6531 (SMTPUTF8) in smtpd.

@item 
bpo-22176@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22176}: Update the ctypes module’s libffi to v3.1.  This release adds
support for the Linux AArch64 and POWERPC ELF ABIv2 little endian
architectures.

@item 
bpo-5411@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5411}: Added support for the “xztar” format in the shutil module.

@item 
bpo-21121@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21121}: Don’t force 3rd party C extensions to be built with
-Werror=declaration-after-statement.

@item 
bpo-21975@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21975}: Fixed crash when using uninitialized sqlite3.Row (in particular
when unpickling pickled sqlite3.Row).  sqlite3.Row is now initialized in
the __new__() method.

@item 
bpo-20170@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20170}: Convert posixmodule to use Argument Clinic.

@item 
bpo-21539@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21539}: Add an `exists_ok' argument to @code{Pathlib.mkdir()} to mimic
@code{mkdir -p} and @code{os.makedirs()} functionality.  When true, ignore
@code{FileExistsErrors}. Patch by Berker Peksag.

@item 
bpo-22127@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22127}: Bypass IDNA for pure-ASCII host names in the socket module (in
particular for numeric IPs).

@item 
bpo-21047@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21047}: set the default value for the `convert_charrefs' argument of
HTMLParser to True.  Patch by Berker Peksag.

@item 
Add an __all__ to html.entities.

@item 
bpo-15114@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15114}: the strict mode and argument of HTMLParser, HTMLParser.error,
and the HTMLParserError exception have been removed.

@item 
bpo-22085@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22085}: Dropped support of Tk 8.3 in Tkinter.

@item 
bpo-21580@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21580}: Now Tkinter correctly handles bytes arguments passed to Tk. In
particular this allows initializing images from binary data.

@item 
bpo-22003@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22003}: When initialized from a bytes object, io.BytesIO() now defers
making a copy until it is mutated, improving performance and memory use on
some use cases. Patch by David Wilson.

@item 
bpo-22018@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22018}: On Windows, signal.set_wakeup_fd() now also supports sockets. A
side effect is that Python depends to the WinSock library.

@item 
bpo-22054@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22054}: Add os.get_blocking() and os.set_blocking() functions to get
and set the blocking mode of a file descriptor (False if the O_NONBLOCK
flag is set, True otherwise). These functions are not available on
Windows.

@item 
bpo-17172@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17172}: Make turtledemo start as active on OS X even when run with
subprocess. Patch by Lita Cho.

@item 
bpo-21704@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21704}: Fix build error for _multiprocessing when semaphores are not
available. Patch by Arfrever Frehtes Taifersar Arahesis.

@item 
bpo-20173@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20173}: Convert sha1, sha256, sha512 and md5 to ArgumentClinic. Patch
by Vajrasky Kok.

@item 
Fix repr(_socket.socket) on Windows 64-bit: don’t fail with OverflowError
on closed socket. repr(socket.socket) already works fine.

@item 
bpo-22033@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22033}: Reprs of most Python implemented classes now contain actual
class name instead of hardcoded one.

@item 
bpo-21947@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21947}: The dis module can now disassemble generator-iterator objects
based on their gi_code attribute. Patch by Clement Rouault.

@item 
bpo-16133@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16133}: The asynchat.async_chat.handle_read() method now ignores
BlockingIOError exceptions.

@item 
bpo-22044@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22044}: Fixed premature DECREF in call_tzinfo_method. Patch by Tom
Flanagan.

@item 
bpo-19884@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19884}: readline: Disable the meta modifier key if stdout is not a
terminal to not write the ANSI sequence @code{"\033[1034h"} into stdout. This
sequence is used on some terminal (ex: TERM=xterm-256color”) to enable
support of 8 bit characters.

@item 
bpo-4350@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4350}: Removed a number of out-of-dated and non-working for a long time
Tkinter methods.

@item 
bpo-6167@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6167}: Scrollbar.activate() now returns the name of active element if
the argument is not specified.  Scrollbar.set() now always accepts only 2
arguments.

@item 
bpo-15275@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15275}: Clean up and speed up the ntpath module.

@item 
bpo-21888@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21888}: plistlib’s load() and loads() now work if the fmt parameter is
specified.

@item 
bpo-22032@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22032}: __qualname__ instead of __name__ is now always used to format
fully qualified class names of Python implemented classes.

@item 
bpo-22031@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22031}: Reprs now always use hexadecimal format with the “0x” prefix
when contain an id in form “ at 0x…”.

@item 
bpo-22018@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22018}: signal.set_wakeup_fd() now raises an OSError instead of a
ValueError on @code{fstat()} failure.

@item 
bpo-21044@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21044}: tarfile.open() now handles fileobj with an integer ‘name’
attribute.  Based on patch by Antoine Pietri.

@item 
bpo-21966@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21966}: Respect -q command-line option when code module is ran.

@item 
bpo-19076@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19076}: Don’t pass the redundant ‘file’ argument to self.error().

@item 
bpo-16382@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16382}: Improve exception message of warnings.warn() for bad category.
Initial patch by Phil Elson.

@item 
bpo-21932@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21932}: os.read() now uses a @ref{c54,,Py_ssize_t()} type instead of
int for the size to support reading more than 2 GB at once. On
Windows, the size is truncated to INT_MAX. As any call to os.read(), the
OS may read less bytes than the number of requested bytes.

@item 
bpo-21942@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21942}: Fixed source file viewing in pydoc’s server mode on Windows.

@item 
bpo-11259@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11259}: asynchat.async_chat().set_terminator() now raises a ValueError
if the number of received bytes is negative.

@item 
bpo-12523@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12523}: asynchat.async_chat.push() now raises a TypeError if it doesn’t
get a bytes string

@item 
bpo-21707@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21707}: Add missing kwonlyargcount argument to
ModuleFinder.replace_paths_in_code().

@item 
bpo-20639@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20639}: calling Path.with_suffix(‘’) allows removing the suffix again.
Patch by July Tikhonov.

@item 
bpo-21714@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21714}: Disallow the construction of invalid paths using
Path.with_name().  Original patch by Antony Lee.

@item 
bpo-15014@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15014}: Added ‘auth’ method to smtplib to make implementing auth
mechanisms simpler, and used it internally in the login method.

@item 
bpo-21151@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21151}: Fixed a segfault in the winreg module when @code{None} is passed
as a @code{REG_BINARY} value to SetValueEx.  Patch by John Ehresman.

@item 
bpo-21090@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21090}: io.FileIO.readall() does not ignore I/O errors anymore. Before,
it ignored I/O errors if at least the first C call read() succeed.

@item 
bpo-5800@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5800}: headers parameter of wsgiref.headers.Headers is now optional.
Initial patch by Pablo Torres Navarrete and SilentGhost.

@item 
bpo-21781@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21781}: ssl.RAND_add() now supports strings longer than 2 GB.

@item 
bpo-21679@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21679}: Prevent extraneous fstat() calls during open().  Patch by
Bohuslav Kabrda.

@item 
bpo-21863@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21863}: cProfile now displays the module name of C extension functions,
in addition to their own name.

@item 
bpo-11453@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11453}: asyncore: emit a ResourceWarning when an unclosed file_wrapper
object is destroyed. The destructor now closes the file if needed. The
close() method can now be called twice: the second call does nothing.

@item 
bpo-21858@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21858}: Better handling of Python exceptions in the sqlite3 module.

@item 
bpo-21476@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21476}: Make sure the email.parser.BytesParser TextIOWrapper is
discarded after parsing, so the input file isn’t unexpectedly closed.

@item 
bpo-20295@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20295}: imghdr now recognizes OpenEXR format images.

@item 
bpo-21729@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21729}: Used the “with” statement in the dbm.dumb module to ensure
files closing. Patch by Claudiu Popa.

@item 
bpo-21491@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21491}: socketserver: Fix a race condition in child processes reaping.

@item 
bpo-21719@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21719}: Added the @code{st_file_attributes} field to os.stat_result on
Windows.

@item 
bpo-21832@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21832}: Require named tuple inputs to be exact strings.

@item 
bpo-21722@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21722}: The distutils “upload” command now exits with a non-zero return
code when uploading fails.  Patch by Martin Dengler.

@item 
bpo-21723@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21723}: asyncio.Queue: support any type of number (ex: float) for the
maximum size. Patch written by Vajrasky Kok.

@item 
bpo-21711@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21711}: support for “site-python” directories has now been removed from
the site module (it was deprecated in 3.4).

@item 
bpo-17552@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17552}: new socket.sendfile() method allowing a file to be sent over a
socket by using high-performance os.sendfile() on UNIX. Patch by Giampaolo
Rodola’.

@item 
bpo-18039@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18039}: dbm.dump.open() now always creates a new database when the flag
has the value ‘n’.  Patch by Claudiu Popa.

@item 
bpo-21326@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21326}: Add a new is_closed() method to asyncio.BaseEventLoop.
run_forever() and run_until_complete() methods of asyncio.BaseEventLoop
now raise an exception if the event loop was closed.

@item 
bpo-21766@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21766}: Prevent a security hole in CGIHTTPServer by URL unquoting paths
before checking for a CGI script at that path.

@item 
bpo-21310@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21310}: Fixed possible resource leak in failed open().

@item 
bpo-21256@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21256}: Printout of keyword args should be in deterministic order in a
mock function call. This will help to write better doctests.

@item 
bpo-21677@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21677}: Fixed chaining nonnormalized exceptions in io close() methods.

@item 
bpo-11709@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11709}: Fix the pydoc.help function to not fail when sys.stdin is not a
valid file.

@item 
bpo-21515@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21515}: tempfile.TemporaryFile now uses os.O_TMPFILE flag is available.

@item 
bpo-13223@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13223}: Fix pydoc.writedoc so that the HTML documentation for methods
that use ‘self’ in the example code is generated correctly.

@item 
bpo-21463@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21463}: In urllib.request, fix pruning of the FTP cache.

@item 
bpo-21618@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21618}: The subprocess module could fail to close open fds that were
inherited by the calling process and already higher than POSIX resource
limits would otherwise allow.  On systems with a functioning /proc/self/fd
or /dev/fd interface the max is now ignored and all fds are closed.

@item 
bpo-20383@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20383}: Introduce importlib.util.module_from_spec() as the preferred
way to create a new module.

@item 
bpo-21552@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21552}: Fixed possible integer overflow of too long string lengths in
the tkinter module on 64-bit platforms.

@item 
bpo-14315@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14315}: The zipfile module now ignores extra fields in the central
directory that are too short to be parsed instead of letting a
struct.unpack error bubble up as this “bad data” appears in many real
world zip files in the wild and is ignored by other zip tools.

@item 
bpo-13742@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13742}: Added “key” and “reverse” parameters to heapq.merge(). (First
draft of patch contributed by Simon Sapin.)

@item 
bpo-21402@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21402}: tkinter.ttk now works when default root window is not set.

@item 
bpo-3015@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=3015}: @code{_tkinter.create()} now creates @code{tkapp} object with
@code{wantobjects=1} by default.

@item 
bpo-10203@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10203}: sqlite3.Row now truly supports sequence protocol.  In
particular it supports reverse() and negative indices.  Original patch by
Claudiu Popa.

@item 
bpo-18807@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18807}: If copying (no symlinks) specified for a venv, then the python
interpreter aliases (python, python3) are now created by copying rather
than symlinking.

@item 
bpo-20197@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20197}: Added support for the WebP image type in the imghdr module.
Patch by Fabrice Aneche and Claudiu Popa.

@item 
bpo-21513@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21513}: Speedup some properties of IP addresses (IPv4Address,
IPv6Address) such as .is_private or .is_multicast.

@item 
bpo-21137@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21137}: Improve the repr for threading.Lock() and its variants by
showing the “locked” or “unlocked” status.  Patch by Berker Peksag.

@item 
bpo-21538@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21538}: The plistlib module now supports loading of binary plist files
when reference or offset size is not a power of two.

@item 
bpo-21455@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21455}: Add a default backlog to socket.listen().

@item 
bpo-21525@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21525}: Most Tkinter methods which accepted tuples now accept lists
too.

@item 
bpo-22166@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22166}: With the assistance of a new internal _codecs._forget_codec
helping function, test_codecs now clears the encoding caches to avoid the
appearance of a reference leak

@item 
bpo-22236@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22236}: Tkinter tests now don’t reuse default root window.  New root
window is created for every test class.

@item 
bpo-10744@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10744}: Fix 
@geindex Python 향상 제안; PEP 3118
PEP 3118@footnote{https://peps.python.org/pep-3118/} format strings on ctypes objects with a
nontrivial shape.

@item 
bpo-20826@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20826}: Optimize ipaddress.collapse_addresses().

@item 
bpo-21487@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21487}: Optimize ipaddress.summarize_address_range() and
ipaddress.@{IPv4Network,IPv6Network@}.subnets().

@item 
bpo-21486@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21486}: Optimize parsing of netmasks in ipaddress.IPv4Network and
ipaddress.IPv6Network.

@item 
bpo-13916@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13916}: Disallowed the surrogatepass error handler for non UTF-*
encodings.

@item 
bpo-20998@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20998}: Fixed re.fullmatch() of repeated single character pattern with
ignore case. Original patch by Matthew Barnett.

@item 
bpo-21075@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21075}: fileinput.FileInput now reads bytes from standard stream if
binary mode is specified.  Patch by Sam Kimbrel.

@item 
bpo-19775@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19775}: Add a samefile() method to pathlib Path objects.  Initial patch
by Vajrasky Kok.

@item 
bpo-21226@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21226}: Set up modules properly in PyImport_ExecCodeModuleObject (and
friends).

@item 
bpo-21398@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21398}: Fix a unicode error in the pydoc pager when the documentation
contains characters not encodable to the stdout encoding.

@item 
bpo-16531@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16531}: ipaddress.IPv4Network and ipaddress.IPv6Network now accept an
(address, netmask) tuple argument, so as to easily construct network
objects from existing addresses.

@item 
bpo-21156@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21156}: importlib.abc.InspectLoader.source_to_code() is now a
staticmethod.

@item 
bpo-21424@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21424}: Simplified and optimized heaqp.nlargest() and nmsmallest() to
make fewer tuple comparisons.

@item 
bpo-21396@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21396}: Fix TextIOWrapper(…, write_through=True) to not force a
flush() on the underlying binary stream.  Patch by akira.

@item 
bpo-18314@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18314}: Unlink now removes junctions on Windows. Patch by Kim Gräsman

@item 
bpo-21088@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21088}: Bugfix for curses.window.addch() regression in 3.4.0. In
porting to Argument Clinic, the first two arguments were reversed.

@item 
bpo-21407@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21407}: _decimal: The module now supports function signatures.

@item 
bpo-10650@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10650}: Remove the non-standard ‘watchexp’ parameter from the
Decimal.quantize() method in the Python version.  It had never been
present in the C version.

@item 
bpo-21469@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21469}: Reduced the risk of false positives in robotparser by checking
to make sure that robots.txt has been read or does not exist prior to
returning True in can_fetch().

@item 
bpo-19414@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19414}: Have the OrderedDict mark deleted links as unusable. This gives
an early failure if the link is deleted during iteration.

@item 
bpo-21421@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21421}: Add __slots__ to the MappingViews ABC. Patch by Josh Rosenberg.

@item 
bpo-21101@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21101}: Eliminate double hashing in the C speed-up code for
collections.Counter().

@item 
bpo-21321@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21321}: itertools.islice() now releases the reference to the source
iterator when the slice is exhausted.  Patch by Anton Afanasyev.

@item 
bpo-21057@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21057}: TextIOWrapper now allows the underlying binary stream’s read()
or read1() method to return an arbitrary bytes-like object (such as a
memoryview). Patch by Nikolaus Rath.

@item 
bpo-20951@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20951}: SSLSocket.send() now raises either SSLWantReadError or
SSLWantWriteError on a non-blocking socket if the operation would block.
Previously, it would return 0.  Patch by Nikolaus Rath.

@item 
bpo-13248@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13248}: removed previously deprecated asyncore.dispatcher __getattr__
cheap inheritance hack.

@item 
bpo-9815@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9815}: assertRaises now tries to clear references to local variables in
the exception’s traceback.

@item 
bpo-19940@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19940}: ssl.cert_time_to_seconds() now interprets the given time string
in the UTC timezone (as specified in RFC 5280), not the local timezone.

@item 
bpo-13204@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13204}: Calling sys.flags.__new__ would crash the interpreter, now it
raises a TypeError.

@item 
bpo-19385@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19385}: Make operations on a closed dbm.dumb database always raise the
same exception.

@item 
bpo-21207@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21207}: Detect when the os.urandom cached fd has been closed or
replaced, and open it anew.

@item 
bpo-21291@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21291}: subprocess’s Popen.wait() is now thread safe so that multiple
threads may be calling wait() or poll() on a Popen instance at the same
time without losing the Popen.returncode value.

@item 
bpo-21127@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21127}: Path objects can now be instantiated from str subclass
instances (such as @code{numpy.str_}).

@item 
bpo-15002@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15002}: urllib.response object to use _TemporaryFileWrapper (and
_TemporaryFileCloser) facility. Provides a better way to handle file
descriptor close. Patch contributed by Christian Theune.

@item 
bpo-12220@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12220}: mindom now raises a custom ValueError indicating it doesn’t
support spaces in URIs instead of letting a ‘split’ ValueError bubble up.

@item 
bpo-21068@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21068}: The ssl.PROTOCOL* constants are now enum members.

@item 
bpo-21276@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21276}: posixmodule: Don’t define USE_XATTRS on KFreeBSD and the Hurd.

@item 
bpo-21262@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21262}: New method assert_not_called for Mock. It raises AssertionError
if the mock has been called.

@item 
bpo-21238@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21238}: New keyword argument @code{unsafe} to Mock. It raises
@code{AttributeError} in case of an attribute startswith assert or assret.

@item 
bpo-20896@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20896}: ssl.get_server_certificate() now uses PROTOCOL_SSLv23, not
PROTOCOL_SSLv3, for maximum compatibility.

@item 
bpo-21239@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21239}: patch.stopall() didn’t work deterministically when the same
name was patched more than once.

@item 
bpo-21203@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21203}: Updated fileConfig and dictConfig to remove inconsistencies.
Thanks to Jure Koren for the patch.

@item 
bpo-21222@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21222}: Passing name keyword argument to mock.create_autospec now
works.

@item 
bpo-21197@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21197}: Add lib64 -> lib symlink in venvs on 64-bit non-OS X POSIX.

@item 
bpo-17498@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17498}: Some SMTP servers disconnect after certain errors, violating
strict RFC conformance.  Instead of losing the error code when we issue
the subsequent RSET, smtplib now returns the error code and defers raising
the SMTPServerDisconnected error until the next command is issued.

@item 
bpo-17826@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17826}: setting an iterable side_effect on a mock function created by
create_autospec now works. Patch by Kushal Das.

@item 
bpo-7776@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=7776}: Fix @code{Host:} header and reconnection when using
http.client.HTTPConnection.set_tunnel(). Patch by Nikolaus Rath.

@item 
bpo-20968@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20968}: unittest.mock.MagicMock now supports division. Patch by
Johannes Baiter.

@item 
bpo-21529@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21529}: Fix arbitrary memory access in JSONDecoder.raw_decode with a
negative second parameter. Bug reported by Guido Vranken. (See also:
@geindex Common Vulnerabilities and Exposures; CVE 2014-4616
CVE 2014-4616@footnote{https://www.cve.org/CVERecord?id=CVE-2014-4616})

@item 
bpo-21169@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21169}: getpass now handles non-ascii characters that the input stream
encoding cannot encode by re-encoding using the replace error handler.

@item 
bpo-21171@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21171}: Fixed undocumented filter API of the rot13 codec. Patch by
Berker Peksag.

@item 
bpo-20539@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20539}: Improved math.factorial error message for large positive inputs
and changed exception type (OverflowError -> ValueError) for large
negative inputs.

@item 
bpo-21172@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21172}: isinstance check relaxed from dict to collections.Mapping.

@item 
bpo-21155@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21155}: asyncio.EventLoop.create_unix_server() now raises a ValueError
if path and sock are specified at the same time.

@item 
bpo-21136@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21136}: Avoid unnecessary normalization of Fractions resulting from
power and other operations.  Patch by Raymond Hettinger.

@item 
bpo-17621@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17621}: Introduce importlib.util.LazyLoader.

@item 
bpo-21076@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21076}: signal module constants were turned into enums. Patch by
Giampaolo Rodola’.

@item 
bpo-20636@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20636}: Improved the repr of Tkinter widgets.

@item 
bpo-19505@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19505}: The items, keys, and values views of OrderedDict now support
reverse iteration using reversed().

@item 
bpo-21149@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21149}: Improved thread-safety in logging cleanup during interpreter
shutdown. Thanks to Devin Jeanpierre for the patch.

@item 
bpo-21058@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21058}: Fix a leak of file descriptor in
@ref{6ec,,tempfile.NamedTemporaryFile()}, close the file descriptor if
@ref{73f,,io.open()} fails

@item 
bpo-21200@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21200}: Return None from pkgutil.get_loader() when __spec__ is missing.

@item 
bpo-21013@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21013}: Enhance ssl.create_default_context() when used for server side
sockets to provide better security by default.

@item 
bpo-20145@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20145}: @code{assertRaisesRegex} and @code{assertWarnsRegex} now raise a
@code{TypeError} if the second argument is not a string or compiled regex.

@item 
bpo-20633@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20633}: Replace relative import by absolute import.

@item 
bpo-20980@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20980}: Stop wrapping exception when using ThreadPool.

@item 
bpo-21082@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21082}: In os.makedirs, do not set the process-wide umask. Note this
changes behavior of makedirs when exist_ok=True.

@item 
bpo-20990@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20990}: Fix issues found by pyflakes for multiprocessing.

@item 
bpo-21015@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21015}: SSL contexts will now automatically select an elliptic curve
for ECDH key exchange on OpenSSL 1.0.2 and later, and otherwise default to
“prime256v1”.

@item 
bpo-21000@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21000}: Improve the command-line interface of json.tool.

@item 
bpo-20995@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20995}: Enhance default ciphers used by the ssl module to enable better
security and prioritize perfect forward secrecy.

@item 
bpo-20884@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20884}: Don’t assume that __file__ is defined on importlib.__init__.

@item 
bpo-21499@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21499}: Ignore __builtins__ in several test_importlib.test_api tests.

@item 
bpo-20627@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20627}: xmlrpc.client.ServerProxy is now a context manager.

@item 
bpo-19165@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19165}: The formatter module now raises DeprecationWarning instead of
PendingDeprecationWarning.

@item 
bpo-13936@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13936}: Remove the ability of datetime.time instances to be considered
false in boolean contexts.

@item 
bpo-18931@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18931}: selectors module now supports /dev/poll on Solaris. Patch by
Giampaolo Rodola’.

@item 
bpo-19977@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19977}: When the @code{LC_TYPE} locale is the POSIX locale (@code{C} locale),
@ref{75e,,sys.stdin} and @ref{ccc,,sys.stdout} are now using the
@code{surrogateescape} error handler, instead of the @code{strict} error
handler.

@item 
bpo-20574@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20574}: Implement incremental decoder for cp65001 code (Windows code
page 65001, Microsoft UTF-8).

@item 
bpo-20879@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20879}: Delay the initialization of encoding and decoding tables for
base32, ascii85 and base85 codecs in the base64 module, and delay the
initialization of the unquote_to_bytes() table of the urllib.parse module,
to not waste memory if these modules are not used.

@item 
bpo-19157@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19157}: Include the broadcast address in the usable hosts for IPv6 in
ipaddress.

@item 
bpo-11599@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11599}: When an external command (e.g. compiler) fails, distutils now
prints out the whole command line (instead of just the command name) if
the environment variable DISTUTILS_DEBUG is set.

@item 
bpo-4931@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4931}: distutils should not produce unhelpful “error: None” messages
anymore. distutils.util.grok_environment_error is kept but doc-deprecated.

@item 
bpo-20875@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20875}: Prevent possible gzip “‘read’ is not defined” NameError. Patch
by Claudiu Popa.

@item 
bpo-11558@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11558}: @code{email.message.Message.attach} now returns a more useful
error message if @code{attach} is called on a message for which
@code{is_multipart} is False.

@item 
bpo-20283@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20283}: RE pattern methods now accept the string keyword parameters as
documented. The pattern and source keyword parameters are left as
deprecated aliases.

@item 
bpo-20778@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20778}: Fix modulefinder to work with bytecode-only modules.

@item 
bpo-20791@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20791}: copy.copy() now doesn’t make a copy when the input is a bytes
object. Initial patch by Peter Otten.

@item 
bpo-19748@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19748}: On AIX, time.mktime() now raises an OverflowError for year
outsize range [1902; 2037].

@item 
bpo-19573@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19573}: inspect.signature: Use enum for parameter kind constants.

@item 
bpo-20726@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20726}: inspect.signature: Make Signature and Parameter picklable.

@item 
bpo-17373@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17373}: Add inspect.Signature.from_callable method.

@item 
bpo-20378@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20378}: Improve repr of inspect.Signature and inspect.Parameter.

@item 
bpo-20816@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20816}: Fix inspect.getcallargs() to raise correct TypeError for
missing keyword-only arguments. Patch by Jeremiah Lowin.

@item 
bpo-20817@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20817}: Fix inspect.getcallargs() to fail correctly if more than 3
arguments are missing. Patch by Jeremiah Lowin.

@item 
bpo-6676@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6676}: Ensure a meaningful exception is raised when attempting to parse
more than one XML document per pyexpat xmlparser instance. (Original
patches by Hirokazu Yamamoto and Amaury Forgeot d’Arc, with suggested
wording by David Gutteridge)

@item 
bpo-21117@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21117}: Fix inspect.signature to better support functools.partial. Due
to the specifics of functools.partial implementation,
positional-or-keyword arguments passed as keyword arguments become
keyword-only.

@item 
bpo-20334@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20334}: inspect.Signature and inspect.Parameter are now hashable.
Thanks to Antony Lee for bug reports and suggestions.

@item 
bpo-15916@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15916}: doctest.DocTestSuite returns an empty unittest.TestSuite
instead of raising ValueError if it finds no tests

@item 
bpo-21209@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21209}: Fix asyncio.tasks.CoroWrapper to workaround a bug in yield-from
implementation in CPythons prior to 3.4.1.

@item 
asyncio: Add gi_@{frame,running,code@} properties to CoroWrapper (upstream
bpo-163@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=163}).

@item 
bpo-21311@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21311}: Avoid exception in _osx_support with non-standard compiler
configurations. Patch by John Szakmeister.

@item 
bpo-11571@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11571}: Ensure that the turtle window becomes the topmost window when
launched on OS X.

@item 
bpo-21801@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21801}: Validate that __signature__ is None or an instance of
Signature.

@item 
bpo-21923@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21923}: Prevent AttributeError in
distutils.sysconfig.customize_compiler due to possible uninitialized
_config_vars.

@item 
bpo-21323@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21323}: Fix http.server to again handle scripts in CGI subdirectories,
broken by the fix for security bpo-19435@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19435}.  Patch by Zach Byrne.

@item 
bpo-22733@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22733}: Fix ffi_prep_args not zero-extending argument values correctly
on 64-bit Windows.

@item 
bpo-23302@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23302}: Default to TCP_NODELAY=1 upon establishing an HTTPConnection.
Removed use of hard-coded MSS as it’s an optimization that’s no longer
needed with Nagle disabled.
@end itemize

@node IDLE<63>,Build<101>,Library<207>,Python 3 5 0 alpha 1
@anchor{whatsnew/changelog id1069}@anchor{1fae}
@subsubsection IDLE



@itemize -

@item 
bpo-20577@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20577}: Configuration of the max line length for the FormatParagraph
extension has been moved from the General tab of the Idle preferences
dialog to the FormatParagraph tab of the Config Extensions dialog. Patch
by Tal Einat.

@item 
bpo-16893@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16893}: Update Idle doc chapter to match current Idle and add new
information.

@item 
bpo-3068@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=3068}: Add Idle extension configuration dialog to Options menu. Changes
are written to HOME/.idlerc/config-extensions.cfg. Original patch by Tal
Einat.

@item 
bpo-16233@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16233}: A module browser (File : Class Browser, Alt+C) requires an
editor window with a filename.  When Class Browser is requested otherwise,
from a shell, output window, or ‘Untitled’ editor, Idle no longer displays
an error box. It now pops up an Open Module box (Alt+M). If a valid name
is entered and a module is opened, a corresponding browser is also opened.

@item 
bpo-4832@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=4832}: Save As to type Python files automatically adds .py to the name
you enter (even if your system does not display it).  Some systems
automatically add .txt when type is Text files.

@item 
bpo-21986@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21986}: Code objects are not normally pickled by the pickle module. To
match this, they are no longer pickled when running under Idle.

@item 
bpo-17390@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17390}: Adjust Editor window title; remove ‘Python’, move version to
end.

@item 
bpo-14105@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14105}: Idle debugger breakpoints no longer disappear when inserting or
deleting lines.

@item 
bpo-17172@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17172}: Turtledemo can now be run from Idle. Currently, the entry is on
the Help menu, but it may move to Run. Patch by Ramchandra Apt and Lita
Cho.

@item 
bpo-21765@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21765}: Add support for non-ascii identifiers to HyperParser.

@item 
bpo-21940@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21940}: Add unittest for WidgetRedirector. Initial patch by Saimadhav
Heblikar.

@item 
bpo-18592@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18592}: Add unittest for SearchDialogBase. Patch by Phil Webster.

@item 
bpo-21694@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21694}: Add unittest for ParenMatch. Patch by Saimadhav Heblikar.

@item 
bpo-21686@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21686}: add unittest for HyperParser. Original patch by Saimadhav
Heblikar.

@item 
bpo-12387@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12387}: Add missing upper(lower)case versions of default Windows key
bindings for Idle so Caps Lock does not disable them. Patch by Roger
Serwy.

@item 
bpo-21695@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21695}: Closing a Find-in-files output window while the search is still
in progress no longer closes Idle.

@item 
bpo-18910@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18910}: Add unittest for textView. Patch by Phil Webster.

@item 
bpo-18292@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18292}: Add unittest for AutoExpand. Patch by Saihadhav Heblikar.

@item 
bpo-18409@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18409}: Add unittest for AutoComplete. Patch by Phil Webster.

@item 
bpo-21477@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21477}: htest.py - Improve framework, complete set of tests. Patches by
Saimadhav Heblikar

@item 
bpo-18104@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18104}: Add idlelib/idle_test/htest.py with a few sample tests to begin
consolidating and improving human-validated tests of Idle. Change other
files as needed to work with htest.  Running the module as __main__ runs
all tests.

@item 
bpo-21139@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21139}: Change default paragraph width to 72, the 
@geindex Python 향상 제안; PEP 8
PEP 8@footnote{https://peps.python.org/pep-0008/}
recommendation.

@item 
bpo-21284@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21284}: Paragraph reformat test passes after user changes reformat
width.

@item 
bpo-17654@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17654}: Ensure IDLE menus are customized properly on OS X for
non-framework builds and for all variants of Tk.

@item 
bpo-23180@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23180}: Rename IDLE “Windows” menu item to “Window”. Patch by Al
Sweigart.
@end itemize

@node Build<101>,C API<80>,IDLE<63>,Python 3 5 0 alpha 1
@anchor{whatsnew/changelog id1070}@anchor{1faf}
@subsubsection Build



@itemize -

@item 
bpo-15506@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15506}: Use standard PKG_PROG_PKG_CONFIG autoconf macro in the
configure script.

@item 
bpo-22935@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22935}: Allow the ssl module to be compiled if openssl doesn’t support
SSL 3.

@item 
bpo-22592@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22592}: Drop support of the Borland C compiler to build Python. The
distutils module still supports it to build extensions.

@item 
bpo-22591@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22591}: Drop support of MS-DOS, especially of the DJGPP compiler
(MS-DOS port of GCC).

@item 
bpo-16537@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16537}: Check whether self.extensions is empty in setup.py. Patch by
Jonathan Hosmer.

@item 
bpo-22359@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22359}: Remove incorrect uses of recursive make.  Patch by Jonas
Wagner.

@item 
bpo-21958@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21958}: Define HAVE_ROUND when building with Visual Studio 2013 and
above.  Patch by Zachary Turner.

@item 
bpo-18093@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18093}: the programs that embed the CPython runtime are now in a
separate “Programs” directory, rather than being kept in the Modules
directory.

@item 
bpo-15759@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15759}: “make suspicious”, “make linkcheck” and “make doctest” in Doc/
now display special message when and only when there are failures.

@item 
bpo-21141@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21141}: The Windows build process no longer attempts to find Perl,
instead relying on OpenSSL source being configured and ready to build.
The @code{PCbuild\build_ssl.py} script has been re-written and re-named to
@code{PCbuild\prepare_ssl.py}, and takes care of configuring OpenSSL source
for both 32 and 64 bit platforms.  OpenSSL sources obtained from
svn.python.org will always be pre-configured and ready to build.

@item 
bpo-21037@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21037}: Add a build option to enable AddressSanitizer support.

@item 
bpo-19962@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19962}: The Windows build process now creates “python.bat” in the root
of the source tree, which passes all arguments through to the most
recently built interpreter.

@item 
bpo-21285@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21285}: Refactor and fix curses configure check to always search in a
ncursesw directory.

@item 
bpo-15234@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15234}: For BerkeleyDB and Sqlite, only add the found library and
include directories if they aren’t already being searched. This avoids an
explicit runtime library dependency.

@item 
bpo-17861@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17861}: Tools/scripts/generate_opcode_h.py automatically regenerates
Include/opcode.h from Lib/opcode.py if the latter gets any change.

@item 
bpo-20644@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20644}: OS X installer build support for documentation build changes in
3.4.1: assume externally supplied sphinx-build is available in /usr/bin.

@item 
bpo-20022@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20022}: Eliminate use of deprecated bundlebuilder in OS X builds.

@item 
bpo-15968@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=15968}: Incorporated Tcl, Tk, and Tix builds into the Windows build
solution.

@item 
bpo-17095@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17095}: Fix Modules/Setup `shared' support.

@item 
bpo-21811@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21811}: Anticipated fixes to support OS X versions > 10.9.

@item 
bpo-21166@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21166}: Prevent possible segfaults and other random failures of python
–generate-posix-vars in pybuilddir.txt build target.

@item 
bpo-18096@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18096}: Fix library order returned by python-config.

@item 
bpo-17219@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17219}: Add library build dir for Python extension cross-builds.

@item 
bpo-22919@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22919}: Windows build updated to support VC 14.0 (Visual Studio 2015),
which will be used for the official release.

@item 
bpo-21236@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21236}: Build _msi.pyd with cabinet.lib instead of fci.lib

@item 
bpo-17128@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17128}: Use private version of OpenSSL for OS X 10.5+ installer.
@end itemize

@node C API<80>,Documentation<85>,Build<101>,Python 3 5 0 alpha 1
@anchor{whatsnew/changelog id1071}@anchor{1fb0}
@subsubsection C API



@itemize -

@item 
bpo-14203@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=14203}: Remove obsolete support for view==NULL in PyBuffer_FillInfo(),
bytearray_getbuffer(), bytesiobuf_getbuffer() and array_buffer_getbuf().
All functions now raise BufferError in that case.

@item 
bpo-22445@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22445}: PyBuffer_IsContiguous() now implements precise contiguity
tests, compatible with NumPy’s NPY_RELAXED_STRIDES_CHECKING compilation
flag.  Previously the function reported false negatives for corner cases.

@item 
bpo-22079@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22079}: PyType_Ready() now checks that statically allocated type has no
dynamically allocated bases.

@item 
bpo-22453@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22453}: Removed non-documented macro PyObject_REPR().

@item 
bpo-18395@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18395}: Rename @code{_Py_char2wchar()} to @ref{dbf,,Py_DecodeLocale()},
rename @code{_Py_wchar2char()} to @ref{dc0,,Py_EncodeLocale()}, and document
these functions.

@item 
bpo-21233@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21233}: Add new C functions: PyMem_RawCalloc(), PyMem_Calloc(),
PyObject_Calloc(), _PyObject_GC_Calloc(). bytes(int) is now using
@code{calloc()} instead of @code{malloc()} for large objects which is faster and
use less memory.

@item 
bpo-20942@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20942}: PyImport_ImportFrozenModuleObject() no longer sets __file__ to
match what importlib does; this affects _frozen_importlib as well as any
module loaded using imp.init_frozen().
@end itemize

@node Documentation<85>,Tests<89>,C API<80>,Python 3 5 0 alpha 1
@anchor{whatsnew/changelog id1072}@anchor{1fb1}
@subsubsection Documentation



@itemize -

@item 
bpo-19548@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19548}: Update the codecs module documentation to better cover the
distinction between text encodings and other codecs, together with other
clarifications. Patch by Martin Panter.

@item 
bpo-22394@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22394}: Doc/Makefile now supports @code{make venv PYTHON=../python} to
create a venv for generating the documentation, e.g., @code{make html
PYTHON=venv/bin/python3}.

@item 
bpo-21514@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21514}: The documentation of the json module now refers to new JSON RFC
7159 instead of obsoleted RFC 4627.

@item 
bpo-21777@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21777}: The binary sequence methods on bytes and bytearray are now
documented explicitly, rather than assuming users will be able to derive
the expected behaviour from the behaviour of the corresponding str
methods.

@item 
bpo-6916@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=6916}: undocument deprecated asynchat.fifo class.

@item 
bpo-17386@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17386}: Expanded functionality of the @code{Doc/make.bat} script to make
it much more comparable to @code{Doc/Makefile}.

@item 
bpo-21312@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21312}: Update the thread_foobar.h template file to include newer
threading APIs. Patch by Jack McCracken.

@item 
bpo-21043@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21043}: Remove the recommendation for specific CA organizations and to
mention the ability to load the OS certificates.

@item 
bpo-20765@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20765}: Add missing documentation for PurePath.with_name() and
PurePath.with_suffix().

@item 
bpo-19407@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19407}: New package installation and distribution guides based on the
Python Packaging Authority tools. Existing guides have been retained as
legacy links from the distutils docs, as they still contain some required
reference material for tool developers that isn’t recorded anywhere else.

@item 
bpo-19697@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19697}: Document cases where __main__.__spec__ is None.
@end itemize

@node Tests<89>,Tools/Demos<61>,Documentation<85>,Python 3 5 0 alpha 1
@anchor{whatsnew/changelog id1073}@anchor{1fb2}
@subsubsection Tests



@itemize -

@item 
bpo-18982@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18982}: Add tests for CLI of the calendar module.

@item 
bpo-19548@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19548}: Added some additional checks to test_codecs to ensure that
statements in the updated documentation remain accurate. Patch by Martin
Panter.

@item 
bpo-22838@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22838}: All test_re tests now work with unittest test discovery.

@item 
bpo-22173@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22173}: Update lib2to3 tests to use unittest test discovery.

@item 
bpo-16000@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16000}: Convert test_curses to use unittest.

@item 
bpo-21456@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21456}: Skip two tests in test_urllib2net.py if _ssl module not
present. Patch by Remi Pointel.

@item 
bpo-20746@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20746}: Fix test_pdb to run in refleak mode (-R).  Patch by Xavier de
Gaye.

@item 
bpo-22060@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22060}: test_ctypes has been somewhat cleaned up and simplified; it now
uses unittest test discovery to find its tests.

@item 
bpo-22104@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22104}: regrtest.py no longer holds a reference to the suite of tests
loaded from test modules that don’t define test_main().

@item 
bpo-22111@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22111}: Assorted cleanups in test_imaplib.  Patch by Milan Oberkirch.

@item 
bpo-22002@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22002}: Added @code{load_package_tests} function to test.support and used
it to implement/augment test discovery in test_asyncio, test_email,
test_importlib, test_json, and test_tools.

@item 
bpo-21976@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21976}: Fix test_ssl to accept LibreSSL version strings.  Thanks to
William Orr.

@item 
bpo-21918@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21918}: Converted test_tools from a module to a package containing
separate test files for each tested script.

@item 
bpo-9554@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=9554}: Use modern unittest features in test_argparse. Initial patch by
Denver Coneybeare and Radu Voicilas.

@item 
bpo-20155@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20155}: Changed HTTP method names in failing tests in test_httpservers
so that packet filtering software (specifically Windows Base Filtering
Engine) does not interfere with the transaction semantics expected by the
tests.

@item 
bpo-19493@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19493}: Refactored the ctypes test package to skip tests explicitly
rather than silently.

@item 
bpo-18492@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18492}: All resources are now allowed when tests are not run by
regrtest.py.

@item 
bpo-21634@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21634}: Fix pystone micro-benchmark: use floor division instead of true
division to benchmark integers instead of floating-point numbers. Set
pystone version to 1.2. Patch written by Lennart Regebro.

@item 
bpo-21605@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21605}: Added tests for Tkinter images.

@item 
bpo-21493@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21493}: Added test for ntpath.expanduser().  Original patch by Claudiu
Popa.

@item 
bpo-19925@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=19925}: Added tests for the spwd module. Original patch by Vajrasky
Kok.

@item 
bpo-21522@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21522}: Added Tkinter tests for Listbox.itemconfigure(),
PanedWindow.paneconfigure(), and Menu.entryconfigure().

@item 
bpo-17756@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17756}: Fix test_code test when run from the installed location.

@item 
bpo-17752@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17752}: Fix distutils tests when run from the installed location.

@item 
bpo-18604@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18604}: Consolidated checks for GUI availability.  All platforms now at
least check whether Tk can be instantiated when the GUI resource is
requested.

@item 
bpo-21275@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21275}: Fix a socket test on KFreeBSD.

@item 
bpo-21223@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21223}: Pass test_site/test_startup_imports when some of the extensions
are built as builtins.

@item 
bpo-20635@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20635}: Added tests for Tk geometry managers.

@item 
Add test case for freeze.

@item 
bpo-20743@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20743}: Fix a reference leak in test_tcl.

@item 
bpo-21097@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21097}: Move test_namespace_pkgs into test_importlib.

@item 
bpo-21503@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21503}: Use test_both() consistently in test_importlib.

@item 
bpo-20939@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20939}: Avoid various network test failures due to new redirect of
@indicateurl{http://www.python.org/} to @indicateurl{https://www.python.org}: use
@indicateurl{http://www.example.com} instead.

@item 
bpo-20668@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20668}: asyncio tests no longer rely on tests.txt file. (Patch by
Vajrasky Kok)

@item 
bpo-21093@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21093}: Prevent failures of ctypes test_macholib on OS X if a copy of
libz exists in $HOME/lib or /usr/local/lib.

@item 
bpo-22770@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22770}: Prevent some Tk segfaults on OS X when running gui tests.

@item 
bpo-23211@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23211}: Workaround test_logging failure on some OS X 10.6 systems.

@item 
bpo-23345@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23345}: Prevent test_ssl failures with large OpenSSL patch level values
(like 0.9.8zc).
@end itemize

@node Tools/Demos<61>,Windows<83>,Tests<89>,Python 3 5 0 alpha 1
@anchor{whatsnew/changelog id1074}@anchor{1fb3}
@subsubsection Tools/Demos



@itemize -

@item 
bpo-22314@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22314}: pydoc now works when the LINES environment variable is set.

@item 
bpo-22615@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22615}: Argument Clinic now supports the “type” argument for the int
converter. This permits using the int converter with enums and typedefs.

@item 
bpo-20076@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20076}: The makelocalealias.py script no longer ignores UTF-8 mapping.

@item 
bpo-20079@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20079}: The makelocalealias.py script now can parse the SUPPORTED file
from glibc sources and supports command line options for source paths.

@item 
bpo-22201@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22201}: Command-line interface of the zipfile module now correctly
extracts ZIP files with directory entries.  Patch by Ryan Wilson.

@item 
bpo-22120@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22120}: For functions using an unsigned integer return converter,
Argument Clinic now generates a cast to that type for the comparison to -1
in the generated code.  (This suppresses a compilation warning.)

@item 
bpo-18974@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18974}: Tools/scripts/diff.py now uses argparse instead of optparse.

@item 
bpo-21906@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21906}: Make Tools/scripts/md5sum.py work in Python 3. Patch by Zachary
Ware.

@item 
bpo-21629@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21629}: Fix Argument Clinic’s “–converters” feature.

@item 
Add support for @code{yield from} to 2to3.

@item 
Add support for the 
@geindex Python 향상 제안; PEP 465
PEP 465@footnote{https://peps.python.org/pep-0465/} matrix multiplication operator to 2to3.

@item 
bpo-16047@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=16047}: Fix module exception list and __file__ handling in freeze.
Patch by Meador Inge.

@item 
bpo-11824@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=11824}: Consider ABI tags in freeze. Patch by Meador Inge.

@item 
bpo-20535@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=20535}: PYTHONWARNING no longer affects the run_tests.py script. Patch
by Arfrever Frehtes Taifersar Arahesis.
@end itemize

@node Windows<83>,,Tools/Demos<61>,Python 3 5 0 alpha 1
@anchor{whatsnew/changelog id1075}@anchor{1fb4}
@subsubsection Windows



@itemize -

@item 
bpo-23260@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=23260}: Update Windows installer

@item 
The bundled version of Tcl/Tk has been updated to 8.6.3.  The most visible
result of this change is the addition of new native file dialogs when
running on Windows Vista or newer.  See Tcl/Tk’s TIP 432 for more
information.  Also, this version of Tcl/Tk includes support for Windows
10.

@item 
bpo-17896@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17896}: The Windows build scripts now expect external library sources
to be in @code{PCbuild\..\externals} rather than @code{PCbuild\..\..}.

@item 
bpo-17717@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17717}: The Windows build scripts now use a copy of NASM pulled from
svn.python.org to build OpenSSL.

@item 
bpo-21907@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21907}: Improved the batch scripts provided for building Python.

@item 
bpo-22644@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22644}: The bundled version of OpenSSL has been updated to 1.0.1j.

@item 
bpo-10747@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=10747}: Use versioned labels in the Windows start menu. Patch by Olive
Kilburn.

@item 
bpo-22980@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=22980}: .pyd files with a version and platform tag (for example,
“.cp35-win32.pyd”) will now be loaded in preference to those without tags.
@end itemize

`(For information about older versions, consult the HISTORY file.)'

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 파이썬 자습서,파이썬 설정 및 사용법,파이썬의 새로운 기능,Top
@anchor{tutorial/index doc}@anchor{1fb5}@anchor{tutorial/index the-python-tutorial}@anchor{1fb6}@anchor{tutorial/index translation-repo}@anchor{1fb7}@anchor{tutorial/index tutorial-index}@anchor{1fb8}
@chapter 파이썬 자습서


@cartouche
@quotation 팁 
This tutorial is designed for
`programmers' that are new to the Python language,
`not' `beginners' who are new to programming.
@end quotation
@end cartouche

파이썬은 배우기 쉬우면서도 강력한 프로그래밍 언어입니다. 효율적인 자료 구조와 객체 지향 프로그래밍에 대한 간단하고도 효과적인 접근법을 제공합니다. 파이썬은 우아한 문법과 동적 타이핑(typing)을 지원하는 인터프리터 언어로서, 대부분 플랫폼과 다양한 문제 영역에서 스크립트 작성과 빠른 응용 프로그램 개발에 이상적인 환경을 제공합니다.

The Python interpreter and the extensive standard library are freely available
in source or binary form for all major platforms from the Python website,
@indicateurl{https://www.python.org/}, and may be freely distributed. The same site also
contains distributions of and pointers to many free third party Python modules,
programs and tools, and additional documentation.

파이썬 인터프리터에는 C 나 C++ (또는 C에서 호출 가능한 다른 언어들)로 구현된 새 함수나 자료 구조를 쉽게 추가할 수 있습니다. 파이썬은 사용자 맞춤화가 가능한 응용 프로그램을 위한 확장 언어로도 적합합니다.

This tutorial introduces the reader informally to the basic concepts and
features of the Python language and system. Be aware that it expects you to
have a basic understanding of programming in general. It helps to have a Python
interpreter handy for hands-on experience, but all examples are self-contained,
so the tutorial can be read off-line as well.

표준 객체와 모듈에 대한 설명은 @ref{149,,파이썬 표준 라이브러리} 에서 확인하세요. @ref{14a,,파이썬 언어 레퍼런스} 는 언어에 대한 좀 더 형식적인 정의를 제공합니다. C 나 C++ 로 확장을 작성하려면 @ref{1fb9,,파이썬 인터프리터 확장 및 내장} 와 @ref{1fba,,Python/C API reference manual} 를 참조하세요. 또한 파이썬을 깊이 있게 다룬 책들도 많습니다.

이 자습서는 포괄적이려고 시도하지 않습니다. 모든 기능을 다루지는 않으며, 이는 자주 사용되는 기능에 있어서도 마찬가지 입니다. 대신 파이썬의 가장 주목할 만한 기능들을 소개하여 언어의 맛과 스타일을 잘 느낄 수 있도록 하고 있습니다. 이 학습서를 읽은 후에는 파이썬 모듈과 프로그램을 읽고 쓸 수 있으며, @ref{149,,파이썬 표준 라이브러리} 에 기술된 다양한 파이썬 라이브러리 모듈에 대해 배울 준비가 될 것입니다.

@ref{1fbb,,용어집} 또한 살펴볼 가치가 있습니다.

@menu
* 입맛 돋우기:: 
* 파이썬 인터프리터 사용하기:: 
* 파이썬의 간략한 소개:: 
* 기타 제어 흐름 도구:: 
* 자료 구조:: 
* 모듈:: 
* 입력과 출력:: 
* 에러와 예외:: 
* 클래스:: 
* Brief tour of the standard library:: 
* 표준 라이브러리 둘러보기 — 2부:: 
* 가상 환경 및 패키지:: 
* 이제 뭘 하지?:: 
* 대화형 입력 편집 및 히스토리 치환:: 
* 부동 소수점 산술; 문제점 및 한계: 부동 소수점 산술 문제점 및 한계. 
* 부록:: 

@end menu

@node 입맛 돋우기,파이썬 인터프리터 사용하기,,파이썬 자습서
@anchor{tutorial/appetite doc}@anchor{1fbc}@anchor{tutorial/appetite tut-intro}@anchor{1fbd}@anchor{tutorial/appetite whetting-your-appetite}@anchor{1fbe}
@section 입맛 돋우기


여러분이 컴퓨터를 많이 사용한다면, 결국 자동화하고 싶은 작업을 발견하게 됩니다. 예를 들어, 많은 텍스트 파일들을 검색-수정하고 싶거나, 사진 파일들을 복잡한 방법으로 이름을 바꾸거나 재배치하고 싶을 수 있습니다. 어쩌면 자그마한 자신만의 데이터베이스나 GUI 응용 프로그램, 또는 간단한 게임을 만들고 싶을 것입니다.

만약 여러분이 전문 소프트웨어 개발자라면, 여러 C/C++/Java 라이브러리들을 갖고 작업해야만 할 수 있는데, 일반적인 코드작성/컴파일/테스트/재컴파일 순환이 너무 느리다는 것을 깨닫게 됩니다. 어쩌면 그 라이브러리들을 위한 테스트 스위트를 작성하다가, 테스트 코드 작성에 따분해하는 자신을 발견하게 됩니다. 또는 확장 언어를 사용하는 프로그램을 작성했는데, 완전히 새로운 언어 전체를 설계하고 구현하고 싶지 않을 수 있습니다.

파이썬은 바로 여러분을 위한 언어입니다.

여러분은 이런 작업들을 유닉스 셸 스크립트나 윈도우 배치 파일을 작성해서 해결할 수도 있습니다. 하지만 셸 스크립트는 파일을 이리저리 옮기거나 텍스트 데이터를 변경하는 데는 쓸모 있지만, GUI 응용 프로그램이나 게임을 만드는 데는 적합하지 않습니다. C/C++/Java 프로그램을 작성할 수도 있지만, 첫 초벌 프로그램을 만드는데도 막대한 개발 시간이 들어갑니다. 파이썬은 사용하기에 더 간단하고, 윈도우, 맥 OS, 유닉스 운영체제에서 사용할 수 있으며, 더 빨리 작업을 완료할 수 있도록 합니다.

파이썬은 사용이 간단하지만, 제대로 갖춰진 프로그래밍 언어인데, 셸 스크립트나 배치 파일보다 더 많은 구조를 제공하고 커다란 프로그램을 위한 지원을 제공합니다. 반면에, 파이썬은 C보다 훨씬 많은 에러 검사를 제공하고, 유연한 배열과 딕셔너리같은 고수준의 자료형들을 내장하고 있습니다. 더 일반적인 자료형들 때문에 Awk 나 Perl보다도 더 많은 문제영역에 쓸모가 있는데, 그러면서도 여전히 많은 것들이 적어도 이들 언어를 사용하는 것만큼 파이썬에서도 쉽게 해결할 수 있습니다.

파이썬은 여러분의 프로그램을 여러 모듈로 나눌 수 있도록 하는데, 각 모듈은 다른 파이썬 프로그램에서 재사용할 수 있습니다. 대규모의 표준 모듈들이 따라오는데 여러분의 프로그램 기초로 사용하거나 파이썬 프로그래밍을 배우기 위한 예제로 활용할 수 있습니다. 이 모듈에는 파일 입출력, 시스템 호출, 소켓들이 포함되는데, 심지어 Tk 와 같은 GUI 도구상자에 대한 인터페이스도 들어있습니다.

파이썬은 인터프리터 언어입니다. 컴파일과 링크 단계가 필요 없으므로 개발 시간을 상당히 단축해줍니다. 인터프리터는 대화형으로 사용할 수 있어서, 언어의 기능을 실험하거나, 쓰고 버릴 프로그램을 만들거나, 바닥부터 프로그램을 만들어가는 동안 함수들을 테스트하기 쉽습니다. 간편한 탁상용 계산기이기도 합니다.

파이썬은 간결하고 읽기 쉽게 프로그램을 작성할 수 있도록 합니다. 파이썬 프로그램은 여러 가지 이유로 같은 기능의 C, C++, Java 프로그램들에 비교해 간결합니다:


@itemize *

@item 
고수준의 자료형 때문에 복잡한 연산을 한 문장으로 표현할 수 있습니다;

@item 
문장의 묶음은 괄호 대신에 들여쓰기를 통해 이루어집니다;

@item 
변수나 인자의 선언이 필요 없다.
@end itemize

파이썬은 `확장 가능' 하다: C로 프로그램하는 법을 안다면, 인터프리터에 새로운 내장 함수나 자료형을 추가해서, 핵심 연산을 최대 속도로 수행하거나 바이너리 형태로만 제공되는 라이브러리(가령 업체가 제공하는 그래픽스 라이브러리)에 파이썬 프로그램을 연결할 수 있습니다. 진짜 파이썬에 매료되었다면, C로 만든 응용 프로그램에 파이썬 인터프리터를 연결하여 그 응용 프로그램의 확장이나 명령 언어로 사용할 수 있습니다.

파이썬 이라는 이름은 “Monty Python’s Flying Circus”라는 BBC 쇼에서 따온 것이고, 파충류와는 아무런 관련이 없습니다. 문서에서 Monty Python의 농담을 인용하는 것은 허락된 것일 뿐만 아니라, 권장되고 있습니다.

이제 여러분은 파이썬에 한껏 흥분한 상태고 좀 더 자세히 들여다보길 원할 것입니다. 언어를 배우는 가장 좋은 방법은 사용하는 것이기 때문에, 이 학습서를 읽으면서 직접 파이썬 인터프리터를 만져볼 것을 권합니다.

다음 장에서, 인터프리터를 사용하는 방법을 설명합니다. 이것은 약간 지루할 수도 있는 정보지만, 이후에 나오는 예제들을 실행하기 위해서는 꼭 필요합니다.

자습서의 나머지는 파이썬 언어와 시스템의 여러 기능을 예제를 통해 소개합니다. 간단한 표현식, 문장, 자료형에서 출발해서 함수와 모듈을 거쳐, 마지막으로 예외와 사용자 정의 클래스와 같은 고급 개념들을 다룹니다.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 파이썬 인터프리터 사용하기,파이썬의 간략한 소개,입맛 돋우기,파이썬 자습서
@anchor{tutorial/interpreter doc}@anchor{1fbf}@anchor{tutorial/interpreter translation-repo}@anchor{1fc0}@anchor{tutorial/interpreter tut-using}@anchor{1fc1}@anchor{tutorial/interpreter using-the-python-interpreter}@anchor{1fc2}
@section 파이썬 인터프리터 사용하기


@menu
* 인터프리터 실행하기:: 
* 인터프리터와 환경:: 

@end menu

@node 인터프리터 실행하기,인터프리터와 환경,,파이썬 인터프리터 사용하기
@anchor{tutorial/interpreter invoking-the-interpreter}@anchor{1fc3}@anchor{tutorial/interpreter tut-invoking}@anchor{1fc4}
@subsection 인터프리터 실행하기


파이썬 인터프리터는 보통 @code{/usr/local/bin/python3.14} 에 설치됩니다; 유닉스 셸의 검색 경로에 @code{/usr/local/bin} 를 넣으면 명령:

@example
python3.14
@end example

을 셸에 입력해서 실행할 수 있습니다. @footnote{
유닉스에서, 파이썬 3.x 인터프리터는 보통 @code{python} 이라는 이름의 실행 파일로 설치되지 않는데, 동시에 설치되는 파이썬 2.x 실행 파일과 충돌하지 않도록 하기 위해섭니다.
}  인터프리터가 위치하는 디렉터리의 선택은 설치 옵션이기 때문에, 다른 장소도 가능합니다; 주변의 파이썬 전문가나 시스템 관리자에게 확인할 필요가 있습니다. (예를 들어, @code{/usr/local/python} 도 널리 사용되는 위치입니다.)

@ref{1fc5,,마이크로소프트 스토어}에서 설치한 파이썬이 있는 윈도우 시스템에서는, @code{python3.14} 명령을 사용할 수 있습니다. @ref{7d9,,py.exe 구동기}를 설치했으면, @code{py} 명령을 사용할 수 있습니다. 파이썬을 구동하는 다른 방법은 @ref{1fc6,,Python install manager}를 참조하십시오.

기본 프롬프트에서 EOF(end-of-file) 문자(유닉스에서는 @code{Control}-@code{D}, 윈도우에서는 @code{Control}-@code{Z})를 입력하면 인터프리터가 종료하고, 종료 상태 코드는 0 이 됩니다. 이 방법이 통하지 않는다면 @code{quit()} 명령을 입력해서 인터프리터를 종료시킬 수 있습니다.

The interpreter’s line-editing features include interactive editing, history
substitution and code completion on most systems.
Perhaps the quickest check to see whether command line editing is supported is
typing a word in on the Python prompt, then pressing Left arrow (or @code{Control}-@code{b}).
If the cursor moves, you have command line editing; see Appendix
@ref{1fc7,,대화형 입력 편집 및 히스토리 치환} for an introduction to the keys.
If nothing appears to happen, or if a sequence like @code{^[[D} or @code{^B} appears,
command line editing isn’t available; you’ll only be able to use
backspace to remove characters from the current line.

인터프리터는 어느 정도 유닉스 셸처럼 동작합니다: tty 장치에 표준 입력이 연결된 상태로 실행되면, 대화형으로 명령을 읽고 실행합니다; 파일명을 인자로 주거나 파일을 표준입력으로 연결한 상태로 실행되면 스크립트를 읽고 실행합니다.

인터프리터를 실행하는 두 번째 방법은 @code{python -c command [arg] ...} 인데, `command' 에 있는 문장들을 실행합니다. 셸의 @ref{1a8,,-c} 옵션에 해당합니다. 파이썬 문장은 종종 셸에서 특별한 의미가 있는 공백이나 다른 문자들을 포함하기 때문에, `command' 전체를 따옴표로 감싸주는 것이 좋습니다.

몇몇 파이썬 모듈들은 스크립트로도 쓸모가 있습니다. @code{python -m module [arg] ...} 로 실행할 수 있는데, 마치 `module' 모듈 소스 파일의 경로명을 명령행에 입력한 것처럼 실행되게 됩니다.

스크립트 파일이 사용될 때, 때로 스크립트를 실행한 후에 대화형 모드로 들어가는 것이 편리할 때가 있습니다. 스크립트 앞에 @ref{16e0,,-i} 를 전달하면 됩니다.

모든 명령행 옵션은 @ref{1da4,,명령 줄과 환경} 에서 찾을 수 있습니다.

@menu
* 인자 전달:: 
* 대화형 모드:: 

@end menu

@node 인자 전달,대화형 모드,,인터프리터 실행하기
@anchor{tutorial/interpreter argument-passing}@anchor{1fc8}@anchor{tutorial/interpreter tut-argpassing}@anchor{1fc9}
@subsubsection 인자 전달


스크립트 이름과 추가의 인자들이 인터프리터로 전달될 때, 문자열의 목록으로 변환된 후 @code{sys} 모듈의 @code{argv} 변수에 저장됩니다. @code{import sys} 를 사용해서 이 목록에 접근할 수 있습니다. 목록의 길이는 최소한 1이고, 스크립트도 추가의 인자도 없는 경우로, @code{sys.argv[0]} 은 빈 문자열입니다. 스크립트 이름을 @code{'-'} (표준 입력을 뜻한다) 로 주면 @code{sys.argv[0]} 는 @code{'-'} 가 됩니다. @ref{1a8,,-c} `command' 가 사용되면 @code{sys.argv[0]} 는 @code{'-c'} 로 설정됩니다. @ref{23c,,-m} `module' 이 사용되면 @code{sys.argv[0]} 는 모듈의 절대 경로명이 됩니다. @code{-c} `command' 나 @code{-m} `module' 뒤에 오는 옵션들은 파이썬 인터프리터가 소모하지 않고 명령이나 모듈이 처리하도록 @code{sys.argv} 로 전달됩니다.

@node 대화형 모드,,인자 전달,인터프리터 실행하기
@anchor{tutorial/interpreter interactive-mode}@anchor{1fca}@anchor{tutorial/interpreter tut-interactive}@anchor{443}
@subsubsection 대화형 모드


명령을 tty 에서 읽을 때, 인터프리터가 `대화형 모드' 로 동작한다고 말합니다. 이 모드에서는 `기본 프롬프트' 를 표시해서 다음 명령을 요청하는데, 보통 세 개의 …보다 크다 기호입니다 (@code{>>>}); 한 줄로 끝나지 않고 이어지는 줄의 입력을 요청할 때는 보조 프롬프트가 사용되는데, 기본적으로 세 개의 점입니다 (@code{...}). 인터프리터는 첫 번째 프롬프트를 인쇄하기 전에 버전 번호와 저작권 공지를 포함하는 환영 메시지를 출력합니다.

@example
$ python3.14
Python 3.14 (default, April 4 2024, 09:25:04)
[GCC 10.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
@end example

@c XXX update for new releases

이어지는 줄은 여러 줄로 구성된 구조물을 입력할 때 필요합니다. 예를 들자면, 이런 식의 @ref{181,,if} 문이 가능합니다:

@example
>>> the_world_is_flat = True
>>> if the_world_is_flat:
...     print("Be careful not to fall off!")
...
Be careful not to fall off!
@end example

대화형 모드에 대해 더 알고 싶다면, @ref{495,,대화형 모드} 를 보세요.

@node 인터프리터와 환경,,인터프리터 실행하기,파이썬 인터프리터 사용하기
@anchor{tutorial/interpreter the-interpreter-and-its-environment}@anchor{1fcb}@anchor{tutorial/interpreter tut-interp}@anchor{1fcc}
@subsection 인터프리터와 환경


@menu
* 소스 코드 인코딩:: 

@end menu

@node 소스 코드 인코딩,,,인터프리터와 환경
@anchor{tutorial/interpreter source-code-encoding}@anchor{1fcd}@anchor{tutorial/interpreter tut-source-encoding}@anchor{1fce}
@subsubsection 소스 코드 인코딩


기본적으로, 파이썬 소스 파일들은 UTF-8으로 인코드 된 것으로 취급됩니다. 이 인코딩에서는 대부분 언어에서 사용되는 문자들을 문자열 상수, 식별자, 주석 등에서 함께 사용할 수 있습니다. (하지만 표준 라이브러리는 오직 ASCII 문자만 식별자로 사용하고 있는데, 범용 코드에서는 이 관례를 따르는 것이 좋습니다.) 이 문자들을 모두 올바로 표시하기 위해서는 편집기가 파일이 UTF-8임을 인식해야 하고, 이 파일에 포함된 모든 문자를 지원할 수 있는 글꼴을 사용해야 합니다.

인코딩을 기본값 외의 것으로 선언하려면, 파일의 첫 줄에 특별한 형태의 주석 문을 추가해야 합니다. 문법은 이렇습니다:

@example
# -*- coding: encoding -*-
@end example

`encoding' 은 파이썬이 지원하는 코덱 (@ref{1c,,codecs}) 중 하나여야 합니다.

예를 들어, Windows-1252 인코딩을 사용하도록 선언하려면, 소스 코드 파일의 첫 줄은 이렇게 되어야 합니다:

@example
# -*- coding: cp1252 -*-
@end example

첫 줄 규칙의 한가지 예외는 소스 코드가 @ref{1fcf,,유닉스 “셔뱅 (shebang)” 줄} 로 시작하는 경우입니다. 이 경우에, 인코딩 선언은 두 번째 줄에 들어갑니다. 예를 들어:

@example
#!/usr/bin/env python3
# -*- coding: cp1252 -*-
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 파이썬의 간략한 소개,기타 제어 흐름 도구,파이썬 인터프리터 사용하기,파이썬 자습서
@anchor{tutorial/introduction doc}@anchor{1fd0}@anchor{tutorial/introduction an-informal-introduction-to-python}@anchor{1fd1}@anchor{tutorial/introduction translation-repo}@anchor{1fd2}@anchor{tutorial/introduction tut-informal}@anchor{1fd3}
@section 파이썬의 간략한 소개


다음에 나올 예에서, 입력과 출력은 프롬프트(@ref{493,,>>>} 와 @ref{494,,…})의 존재 여부로 구분됩니다: 예제를 실행하기 위해서는 프롬프트가 나올 때 프롬프트 뒤에 오는 모든 것들을 입력해야 합니다; 프롬프트로 시작하지 않는 줄들은 인터프리터가 출력하는 것들입니다. 예에서 보조 프롬프트 외에 아무것도 없는 줄은 빈 줄을 입력해야 한다는 뜻임에 주의하세요; 여러 줄로 구성된 명령을 끝내는 방법입니다.


@geindex # (해시);주석

이 설명서에 나오는 많은 예는 (대화형 프롬프트에서 입력되는 것들조차도) 주석을 포함하고 있습니다. 파이썬에서 주석은 해시 문자, @code{#}, 로 시작하고 줄의 끝까지 이어집니다. 주석은 줄의 처음에서 시작할 수도 있고, 공백이나 코드 뒤에 나올 수도 있습니다. 하지만 문자열 리터럴 안에는 들어갈 수 없습니다. 문자열 리터럴 안에 등장하는 해시 문자는 주석이 아니라 해시 문자일 뿐입니다. 주석은 코드의 의미를 정확히 전달하기 위한 것이고, 파이썬이 해석하지 않는 만큼, 예를 입력할 때는 생략해도 됩니다.

몇 가지 예를 듭니다:

@example
# 이 것이 첫 번째 주석입니다
spam = 1  # 그리고 이 것이 두 번째 주석입니다
          # ... 그리고 이제 세 번째!
text = "# 이것은 따옴표 안에 있기 때문에 주석이 아닙니다."
@end example

@menu
* 파이썬을 계산기로 사용하기:: 
* 프로그래밍으로의 첫걸음:: 

@end menu

@node 파이썬을 계산기로 사용하기,프로그래밍으로의 첫걸음,,파이썬의 간략한 소개
@anchor{tutorial/introduction tut-calculator}@anchor{1fd4}@anchor{tutorial/introduction using-python-as-a-calculator}@anchor{1fd5}
@subsection 파이썬을 계산기로 사용하기


몇 가지 간단한 파이썬 명령을 사용해봅시다. 인터프리터를 실행하고 기본 프롬프트, @code{>>>}, 를 기다리세요. (얼마 걸리지 않아야 합니다.)

@menu
* 숫자:: 
* 텍스트:: 
* 리스트:: 

@end menu

@node 숫자,텍스트,,파이썬을 계산기로 사용하기
@anchor{tutorial/introduction numbers}@anchor{1fd6}@anchor{tutorial/introduction tut-numbers}@anchor{1fd7}
@subsubsection 숫자


The interpreter acts as a simple calculator: you can type an expression into it
and it will write the value.  Expression syntax is straightforward: the
operators @code{+}, @code{-}, @code{*} and @code{/} can be used to perform
arithmetic; parentheses (@code{()}) can be used for grouping.
For example:

@example
>>> 2 + 2
4
>>> 50 - 5*6
20
>>> (50 - 5*6) / 4
5.0
>>> 8 / 5  # 나눗셈은 항상 실수를 돌려줍니다
1.6
@end example

정수 (예를 들어 @code{2}, @code{4}, @code{20})는 @ref{19b,,int} 형입니다. 소수부가 있는 것들 (예를 들어 @code{5.0}, @code{1.6})은 @ref{196,,float} 형입니다. 이 자습서 뒤에서 숫자 형들에 관해 더 자세히 살펴볼 예정입니다.

나눗셈 (@code{/}) 은 항상 float를 돌려줍니다. @ref{b3e,,정수 나눗셈} 으로 정수 결과를 얻으려면 @code{//} 연산자를 사용하면 됩니다; 나머지를 얻으려면 @code{%} 를 사용할 수 있습니다:

@example
>>> 17 / 3  # 고전적인 나눗셈은 float를 돌려줍니다
5.666666666666667
>>>
>>> 17 // 3  # 정수 나눗셈은 소수부를 버립니다
5
>>> 17 % 3  # % 연산자는 나눗셈의 나머지를 돌려줍니다
2
>>> 5 * 3 + 2  # 몫 * 제수 + 나머지
17
@end example

파이썬에서는 거듭제곱을 계산할 때 @code{**} 연산자를 사용합니다 @footnote{
@code{**} 가 @code{-} 보다 우선순위가 높으므로, @code{-3**2} 는 @code{-(3**2)} 로 해석되어서 결과는 @code{-9} 가 됩니다. @code{9} 를 얻고 싶으면 @code{(-3)**2} 를 사용할 수 있습니다.
}:

@example
>>> 5 ** 2  # 5 의 제곱
25
>>> 2 ** 7  # 2 의 7 제곱
128
@end example

변수에 값을 대입할 때는 등호(@code{=})를 사용합니다. 이 경우 다음 대화형 프롬프트 전에 표시되는 출력은 없습니다:

@example
>>> width = 20
>>> height = 5 * 9
>>> width * height
900
@end example

변수가 “정의되어” 있지 않을 때 (값을 대입하지 않았을 때) 사용하려고 시도하는 것은 에러를 일으킵니다:

@example
>>> n  # 정의되지 않은 변수에 접근하려고 시도합니다
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'n' is not defined
@end example

실수를 본격적으로 지원합니다; 서로 다른 형의 피연산자를 갖는 연산자는 정수 피연산자를 실수로 변환합니다:

@example
>>> 4 * 3.75 - 1
14.0
@end example

대화형 모드에서는, 마지막에 인쇄된 표현식은 변수 @code{_} 에 대입됩니다. 이것은 파이썬을 탁상용 계산기로 사용할 때, 계산을 이어 가기가 좀 더 쉬워짐을 의미합니다. 예를 들어:

@example
>>> tax = 12.5 / 100
>>> price = 100.50
>>> price * tax
12.5625
>>> price + _
113.0625
>>> round(_, 2)
113.06
@end example

이 변수는 사용자로서는 읽기만 가능한 것처럼 취급되어야 합니다. 값을 직접 대입하지 마세요 — 만약 그렇게 한다면 같은 이름의 지역 변수를 새로 만드는 것이 되는데, 내장 변수의 마술 같은 동작을 차단하는 결과를 낳습니다.

@ref{19b,,int} 와 @ref{196,,float} 에 더해, 파이썬은 @ref{1fe,,Decimal} 이나 @ref{213,,Fraction} 등의 다른 형의 숫자들도 지원합니다. 파이썬은 @ref{1fd8,,복소수} 에 대한 지원도 내장하고 있는데, 허수부를 가리키는데 @code{j} 나 @code{J} 접미사를 사용합니다 (예를 들어 @code{3+5j}).

@node 텍스트,리스트,숫자,파이썬을 계산기로 사용하기
@anchor{tutorial/introduction text}@anchor{1fd9}@anchor{tutorial/introduction tut-strings}@anchor{1fda}
@subsubsection 텍스트


Python can manipulate text (represented by type @ref{169,,str}, so-called
“strings”) as well as numbers.  This includes characters “@code{!}”, words
“@code{rabbit}”, names “@code{Paris}”, sentences “@code{Got your back.}”, etc.
“@code{Yay! :)}”. They can be enclosed in single quotes (@code{'...'}) or double
quotes (@code{"..."}) with the same result @footnote{
다른 언어들과는 달리, @code{\n} 과 같은 특수 문자들은 작은따옴표(@code{'...'})와 큰따옴표(@code{"..."})에서 같은 의미가 있습니다. 둘 간의 유일한 차이는 작은따옴표 안에서 @code{"} 를 이스케이핑할 필요가 없고 (하지만 @code{\'} 는 이스케이핑 시켜야 합니다), 그 역도 성립한다는 것입니다.
}.

@example
>>> 'spam eggs'  # single quotes
'spam eggs'
>>> "Paris rabbit got your back :)! Yay!"  # double quotes
'Paris rabbit got your back :)! Yay!'
>>> '1975'  # digits and numerals enclosed in quotes are also strings
'1975'
@end example

To quote a quote, we need to “escape” it, by preceding it with @code{\}.
Alternatively, we can use the other type of quotation marks:

@example
>>> 'doesn\'t'  # 작은 따옴표를 이스케이프하는데 \' 를 사용합니다...
"doesn't"
>>> "doesn't"  # ...또는 큰따옴표를 사용합니다
"doesn't"
>>> '"Yes," they said.'
'"Yes," they said.'
>>> "\"Yes,\" they said."
'"Yes," they said.'
>>> '"Isn\'t," they said.'
'"Isn\'t," they said.'
@end example

In the Python shell, the string definition and output string can look
different.  The @ref{1174,,print()} function produces a more readable output, by
omitting the enclosing quotes and by printing escaped and special characters:

@example
>>> s = 'First line.\nSecond line.'  # \n 은 줄넘김을 뜻합니다
>>> s  # print() 하지 않으면, 특수 문자가 문자열에 포함됩니다
'First line.\nSecond line.'
>>> print(s)  # print() 하면, 특수 문자가 해석되어, \n 이 새 줄을 만듭니다
First line.
Second line.
@end example

@code{\} 뒤에 나오는 문자가 특수 문자로 취급되게 하고 싶지 않다면, 첫 따옴표 앞에 @code{r} 을 붙여서 `날 문자열 (raw string)' 을 만들 수 있습니다:

@example
>>> print('C:\this\name')  # here \t means tab, \n means newline
C:      his
ame
>>> print(r'C:\this\name')  # note the r before the quote
C:\this\name
@end example

There is one subtle aspect to raw strings: a raw string may not end in
an odd number of @code{\} characters; see
@ref{1fdb,,the FAQ entry} for more information
and workarounds.

문자열 리터럴은 여러 줄로 확장될 수 있습니다. 한 가지 방법은 삼중 따옴표를 사용하는 것입니다: @code{"""..."""} 또는 @code{'@w{'}'...'@w{'}'}. 줄 넘김 문자는 자동으로 문자열에 포함됩니다. 하지만 줄 끝에 @code{\} 를 붙여 이를 방지할 수도 있습니다. 다음 예에서, 첫 번째 줄 넘김 문자는 포함되지 않습니다:

@example
>>> print("""\
... Usage: thingy [OPTIONS]
...      -h                        Display this usage message
...      -H hostname               Hostname to connect to
... """)
Usage: thingy [OPTIONS]
     -h                        Display this usage message
     -H hostname               Hostname to connect to

>>>
@end example

문자열은 @code{+} 연산자로 이어붙이고, @code{*} 연산자로 반복시킬 수 있습니다:

@example
>>> # 'un' 을 3번 반복하고 'ium' 을 붙입니다
>>> 3 * 'un' + 'ium'
'unununium'
@end example

두 개 이상의 `문자열 리터럴' (즉, 따옴표로 둘러싸인 것들) 가 연속해서 나타나면 자동으로 이어 붙여집니다.

@example
>>> 'Py' 'thon'
'Python'
@end example

이 기능은 긴 문자열을 쪼개고자 할 때 특별히 쓸모 있습니다:

@example
>>> text = ('Put several strings within parentheses '
...         'to have them joined together.')
>>> text
'Put several strings within parentheses to have them joined together.'
@end example

이것은 오직 두 개의 리터럴에만 적용될 뿐 변수나 표현식에는 해당하지 않습니다:

@example
>>> prefix = 'Py'
>>> prefix 'thon'  # 변수와 문자열 리터럴을 이어붙이기할 수 없습니다
  File "<stdin>", line 1
    prefix 'thon'
           ^^^^^^
SyntaxError: invalid syntax
>>> ('un' * 3) 'ium'
  File "<stdin>", line 1
    ('un' * 3) 'ium'
               ^^^^^
SyntaxError: invalid syntax
@end example

변수들끼리 혹은 변수와 문자열 리터럴을 이어붙이려면 @code{+} 를 사용해야 합니다

@example
>>> prefix + 'thon'
'Python'
@end example

문자열은 `인덱스' (서브 스크립트) 될 수 있습니다. 첫 번째 문자가 인덱스 0에 대응됩니다. 문자를 위한 별도의 형은 없습니다; 단순히 길이가 1인 문자열입니다:

@example
>>> word = 'Python'
>>> word[0]  # 위치 0의 문자
'P'
>>> word[5]  # 위치 5의 문자
'n'
@end example

인덱스는 음수가 될 수도 있는데, 끝에서부터 셉니다:

@example
>>> word[-1]  # 마지막 문자
'n'
>>> word[-2]  # 끝에서 두 번째 문자
'o'
>>> word[-6]
'P'
@end example

-0은 0과 같으므로, 음의 인덱스는 -1에서 시작한다는 것에 주목하세요.

인덱싱에 더해 `슬라이싱(slicing)' 도 지원됩니다. 인덱싱이 개별 문자를 얻는데 사용되는 반면, `슬라이싱' 은 부분 문자열(substring)을 얻는 데 사용됩니다:

@example
>>> word[0:2]  # 위치 0 (포함) 에서 2 (제외) 까지의 문자들
'Py'
>>> word[2:5]  # 위치 2 (포함) 에서 5 (제외) 까지의 문자들
'tho'
@end example

슬라이스 인덱스는 편리한 기본값을 갖고 있습니다; 첫 번째 인덱스를 생략하면 기본값 0 이 사용되고, 두 번째 인덱스가 생략되면 기본값으로 슬라이싱 되는 문자열의 길이가 사용됩니다.

@example
>>> word[:2]   # 처음부터 위치 2 (제외) 까지의 문자들
'Py'
>>> word[4:]   # 위치 4 (포함) 에서 끝까지의 문자들
'on'
>>> word[-2:]  # 끝에서 두번째 (포함) 부터 끝까지의 문자들
'on'
@end example

시작 위치의 문자는 항상 포함되는 반면, 종료 위치의 문자는 항상 포함되지 않는 것에 주의하세요. 이 때문에 @code{s[:i] + s[i:]} 는 항상 @code{s} 와 같아집니다

@example
>>> word[:2] + word[2:]
'Python'
>>> word[:4] + word[4:]
'Python'
@end example

슬라이스가 동작하는 방법을 기억하는 한 가지 방법은 인덱스가 문자들 `사이의' 위치를 가리킨다고 생각하는 것입니다. 첫 번째 문자의 왼쪽 경계가 0입니다. `n' 개의 문자들로 구성된 문자열의 오른쪽 끝 경계는 인덱스 `n' 이 됩니다, 예를 들어:

@example
+---+---+---+---+---+---+
 | P | y | t | h | o | n |
 +---+---+---+---+---+---+
 0   1   2   3   4   5   6
-6  -5  -4  -3  -2  -1
@end example

첫 번째 숫자 행은 인덱스 0…6 의 위치를 보여주고; 두 번째 행은 대응하는 음의 인덱스들을 보여줍니다. `i' 에서 `j' 범위의 슬라이스는 `i' 와 `j' 로 번호 붙여진 경계 사이의 문자들로 구성됩니다.

음이 아닌 인덱스들의 경우, 두 인덱스 모두 범위 내에 있다면 슬라이스의 길이는 인덱스 간의 차입니다. 예를 들어 @code{word[1:3]} 의 길이는 2입니다.

너무 큰 값을 인덱스로 사용하는 것은 에러입니다:

@example
>>> word[42]  # word 는 6개의 문자 뿐입니다
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: string index out of range
@end example

하지만, 범위를 벗어나는 슬라이스 인덱스는 슬라이싱할 때 부드럽게 처리됩니다:

@example
>>> word[4:42]
'on'
>>> word[42:]
'@w{'}
@end example

파이썬 문자열은 변경할 수 없다 — @ref{1fdc,,불변} 이라고 합니다. 그래서 문자열의 인덱스로 참조한 위치에 대입하려고 하면 에러를 일으킵니다:

@example
>>> word[0] = 'J'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment
>>> word[2:] = 'py'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment
@end example

다른 문자열이 필요하면, 새로 만들어야 합니다:

@example
>>> 'J' + word[1:]
'Jython'
>>> word[:2] + 'py'
'Pypy'
@end example

내장 함수 @ref{83f,,len()} 은 문자열의 길이를 돌려줍니다:

@example
>>> s = 'supercalifragilisticexpialidocious'
>>> len(s)
34
@end example


@subsubheading 더 보기



@table @asis

@item @ref{1fdd,,텍스트 시퀀스 형 — str}

문자열은 `시퀀스 형' 의 일종이고, 시퀀스가 지원하는 공통 연산들이 지원됩니다.

@item @ref{1fde,,문자열 메서드}

문자열은 기본적인 변환과 검색을 위한 여러 가지 메서드들을 지원합니다.

@item @ref{19a,,포맷 문자열 리터럴}

내장된 표현식을 갖는 문자열 리터럴

@item @ref{15a0,,Format string syntax}

@ref{832,,str.format()} 으로 문자열을 포맷하는 방법에 대한 정보.

@item @ref{8da,,printf 스타일 문자열 포매팅}

이곳에서 문자열을 @code{%} 연산자 왼쪽에 사용하는 예전 방식의 포매팅에 관해 좀 더 상세하게 설명하고 있습니다.
@end table


@node 리스트,,텍스트,파이썬을 계산기로 사용하기
@anchor{tutorial/introduction lists}@anchor{1fdf}@anchor{tutorial/introduction tut-lists}@anchor{1fe0}
@subsubsection 리스트


파이썬은 다른 값들을 덩어리로 묶는데 사용되는 여러 가지 `컴파운드 (compound)' 자료 형을 알고 있습니다. 가장 융통성이 있는 것은 `리스트' 인데, 대괄호 사이에 쉼표로 구분된 값(항목)들의 목록으로 표현될 수 있습니다. 리스트는 서로 다른 형의 항목들을 포함할 수 있지만, 항목들이 모두 같은 형인 경우가 많습니다.

@example
>>> squares = [1, 4, 9, 16, 25]
>>> squares
[1, 4, 9, 16, 25]
@end example

문자열(그리고, 다른 모든 내장 @ref{715,,시퀀스} 형들)처럼 리스트는 인덱싱하고 슬라이싱할 수 있습니다:

@example
>>> squares[0]  # 인덱싱은 항목을 돌려줍니다
1
>>> squares[-1]
25
>>> squares[-3:]  # 슬라이싱은 새 리스트를 돌려줍니다
[9, 16, 25]
@end example

리스트는 이어붙이기 같은 연산도 지원합니다:

@example
>>> squares + [36, 49, 64, 81, 100]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
@end example

@ref{1fdc,,불변} 인 문자열과는 달리, 리스트는 @ref{1fe1,,가변} 입니다. 즉 내용을 변경할 수 있습니다:

@example
>>> cubes = [1, 8, 27, 65, 125]  # 여기 뭔가 잘못 됐습니다
>>> 4 ** 3  # 4의 세제곱은 65가 아니라 64입니다!
64
>>> cubes[3] = 64  # 잘못된 값을 고칩니다
>>> cubes
[1, 8, 27, 64, 125]
@end example

You can also add new items at the end of the list, by using
the @ref{8db,,list.append()} `method' (we will see more about methods later):

@example
>>> cubes.append(216)  # 6의 세제곱을 추가합니다
>>> cubes.append(7 ** 3)  # 그리고 7의 세제곱도
>>> cubes
[1, 8, 27, 64, 125, 216, 343]
@end example

Simple assignment in Python never copies data. When you assign a list
to a variable, the variable refers to the `existing list'.
Any changes you make to the list through one variable will be seen
through all other variables that refer to it.:

@example
>>> rgb = ["Red", "Green", "Blue"]
>>> rgba = rgb
>>> id(rgb) == id(rgba)  # 같은 객체를 참조합니다
True
>>> rgba.append("Alph")
>>> rgb
["Red", "Green", "Blue", "Alph"]
@end example

모든 슬라이스 연산은 요청한 항목들을 포함하는 새 리스트를 돌려줍니다. 이는 다음과 같은 슬라이스가 리스트의 새로운 @ref{1fe2,,얕은 복사본}을 돌려준다는 뜻입니다:

@example
>>> correct_rgba = rgba[:]
>>> correct_rgba[-1] = "Alpha"
>>> correct_rgba
["Red", "Green", "Blue", "Alpha"]
>>> rgba
["Red", "Green", "Blue", "Alph"]
@end example

슬라이스에 대입하는 것도 가능한데, 리스트의 길이를 변경할 수 있고, 모든 항목을 삭제할 수조차 있습니다:

@example
>>> letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
>>> letters
['a', 'b', 'c', 'd', 'e', 'f', 'g']
>>> # 몇몇 값을 바꿉니다
>>> letters[2:5] = ['C', 'D', 'E']
>>> letters
['a', 'b', 'C', 'D', 'E', 'f', 'g']
>>> # 이제 그 것들을 지웁니다
>>> letters[2:5] = []
>>> letters
['a', 'b', 'f', 'g']
>>> # 모든 요소들을 빈 리스트로 치환해서 리스트를 비웁니다
>>> letters[:] = []
>>> letters
[]
@end example

내장 함수 @ref{83f,,len()} 은 리스트에도 적용됩니다:

@example
>>> letters = ['a', 'b', 'c', 'd']
>>> len(letters)
4
@end example

리스트를 중첩할 수도 있습니다. (다른 리스트를 포함하는 리스트를 만듭니다). 예를 들어:

@example
>>> a = ['a', 'b', 'c']
>>> n = [1, 2, 3]
>>> x = [a, n]
>>> x
[['a', 'b', 'c'], [1, 2, 3]]
>>> x[0]
['a', 'b', 'c']
>>> x[0][1]
'b'
@end example

@node 프로그래밍으로의 첫걸음,,파이썬을 계산기로 사용하기,파이썬의 간략한 소개
@anchor{tutorial/introduction first-steps-towards-programming}@anchor{1fe3}@anchor{tutorial/introduction tut-firststeps}@anchor{1fe4}
@subsection 프로그래밍으로의 첫걸음


물론, 2 에 2를 더하는 것보다는 더 복잡한 방법으로 파이썬을 사용할 수 있습니다. 예를 들어, 다음처럼 피보나치 수열@footnote{https://en.wikipedia.org/wiki/Fibonacci_sequence}의 앞부분을 계산할 수 있습니다:

@example
>>> # 피보나치 수열:
>>> # 두 요소의 합이 다음을 정의합니다
>>> a, b = 0, 1
>>> while a < 10:
...     print(a)
...     a, b = b, a+b
...
0
1
1
2
3
5
8
@end example

이 예는 몇 가지 새로운 기능을 소개하고 있습니다.


@itemize *

@item 
첫 줄은 `다중 대입' 을 포함하고 있습니다: 변수 @code{a} 와 @code{b} 에 동시에 값 0과1이 대입됩니다. 마지막 줄에서 다시 사용되는데, 대입이 어느 하나라도 이루어지기 전에 우변의 표현식들이 모두 계산됩니다. 우변의 표현식은 왼쪽부터 오른쪽으로 가면서 순서대로 계산됩니다.

@item 
@ref{1974,,while} 루프는 조건(여기서는: @code{a < 10})이 참인 동안 실행됩니다. C와 마찬가지로 파이썬에서 0 이 아닌 모든 정수는 참이고, 0은 거짓입니다. 조건은 문자열이나 리스트 (사실 모든 종류의 시퀀스)가 될 수도 있는데 길이가 0 이 아닌 것은 모두 참이고, 빈 시퀀스는 거짓입니다. 이 예에서 사용한 검사는 간단한 비교입니다. 표준 비교 연산자는 C와 같은 방식으로 표현됩니다: @code{<} (작다), @code{>} (크다), @code{==} (같다), @code{<=} (작거나 같다), @code{>=} (크거나 같다), @code{!=} (다르다).

@item 
루프의 `바디 (body)' 는 `들여쓰기' 됩니다. 들여쓰기는 파이썬에서 문장을 덩어리로 묶는 방법입니다. 대화형 프롬프트에서 각각 들여 쓰는 줄에서 탭(tab)이나 공백(space)을 입력해야 합니다. 실제적으로는 텍스트 편집기를 사용해서 좀 더 복잡한 파이썬 코드를 준비하게 됩니다; 웬만한 텍스트 편집기들은 자동 들여쓰기 기능을 제공합니다. 복합문을 대화형으로 입력할 때는 끝을 알리기 위해 빈 줄을 입력해야 합니다. (해석기가 언제 마지막 줄을 입력할지 짐작할 수 없기 때문입니다.) 같은 블록에 포함되는 모든 줄은 같은 양만큼 들여쓰기 되어야 함에 주의하세요.

@item 
@ref{1174,,print()} 함수는 주어진 인자들의 값을 인쇄합니다. 다중 인자, 실수의 값, 문자열을 다루는 방식에서 (계산기 예제에서 본 것과 같이) 출력하고자 하는 표현식을 그냥 입력하는 것과는 다릅니다. 문자열은 따옴표 없이 출력되고, 인자들 간에는 빈칸이 삽입됩니다. 그래서 이런 식으로 보기 좋게 포매팅할 수 있습니다:

@example
>>> i = 256*256
>>> print('The value of i is', i)
The value of i is 65536
@end example

키워드 인자 `end' 는 출력 끝에 포함되는 개행문자를 제거하거나 출력을 다른 문자열로 끝나게 하고 싶을 때 사용됩니다:

@example
>>> a, b = 0, 1
>>> while a < 1000:
...     print(a, end=',')
...     a, b = b, a+b
...
0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,
@end example
@end itemize

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 기타 제어 흐름 도구,자료 구조,파이썬의 간략한 소개,파이썬 자습서
@anchor{tutorial/controlflow doc}@anchor{1fe5}@anchor{tutorial/controlflow more-control-flow-tools}@anchor{1fe6}@anchor{tutorial/controlflow translation-repo}@anchor{1fe7}@anchor{tutorial/controlflow tut-morecontrol}@anchor{1fe8}
@section 기타 제어 흐름 도구


방금 소개한 @ref{1974,,while} 문 외에도, 파이썬은 이 장에서 만나게 될 몇 가지 추가적인 문법들을 시용합니다.

@menu
* if 문:: 
* for 문:: 
* range() 함수: range 함수. 
* break 와 continue 문:: 
* 루프의 else 절:: 
* pass 문:: 
* match 문:: 
* 함수 정의하기:: 
* 함수 정의 더 보기:: 
* 막간극; 코딩 스타일: 막간극 코딩 스타일. 

@end menu

@node if 문,for 문,,기타 제어 흐름 도구
@anchor{tutorial/controlflow if-statements}@anchor{1fe9}@anchor{tutorial/controlflow tut-if}@anchor{1fea}
@subsection @code{if} 문


아마도 가장 잘 알려진 문장 형은 @ref{181,,if} 문일 것입니다. 예를 들어:

@example
>>> x = int(input("Please enter an integer: "))
Please enter an integer: 42
>>> if x < 0:
...     x = 0
...     print('Negative changed to zero')
... elif x == 0:
...     print('Zero')
... elif x == 1:
...     print('Single')
... else:
...     print('More')
...
More
@end example

없거나 여러 개의 @ref{17b,,elif} 부가 있을 수 있고, @ref{17c,,else} 부는 선택적입니다. 키워드 ‘@code{elif}’ 는 ‘else if’ 의 줄임 표현인데, 과도한 들여쓰기를 피하는 데 유용합니다. @code{if} … @code{elif} … @code{elif} … 시퀀스는 다른 언어들에서 발견되는 @code{switch} 나 @code{case} 문을 대신합니다.

If you’re comparing the same value to several constants, or checking for specific types or
attributes, you may also find the @code{match} statement useful. For more
details see @ref{1feb,,match 문}.

@node for 문,range 함수,if 문,기타 제어 흐름 도구
@anchor{tutorial/controlflow for-statements}@anchor{1fec}@anchor{tutorial/controlflow tut-for}@anchor{1fed}
@subsection @code{for} 문


@geindex 문장;for

파이썬에서 @ref{34a,,for} 문은 C 나 파스칼에서 사용하던 것과 약간 다릅니다. (파스칼처럼) 항상 숫자의 산술적인 진행을 통해 이터레이션 하거나, (C처럼) 사용자가 이터레이션 단계와 중지 조건을 정의할 수 있도록 하는 대신, 파이썬의 @code{for} 문은 임의의 시퀀스 (리스트나 문자열)의 항목들을 그 시퀀스에 들어있는 순서대로 이터레이션 합니다. 예를 들어 (말장난이 아니라):

@c One suggestion was to give a real C example here, but that may only serve to
@c confuse non-C programmers.

@example
>>> # 몇 개의 문자열을 측정합니다:
>>> words = ['cat', 'window', 'defenestrate']
>>> for w in words:
...     print(w, len(w))
...
cat 3
window 6
defenestrate 12
@end example

컬렉션을 이터레이트 하는 동안 같은 컬렉션을 수정하는 코드는 올바르게 동작하도록 만들기 힘듭니다. 대신, 보통 컬렉션의 복사본으로 루프를 만들거나 새 컬렉션을 만드는 것이 더 간단합니다:

@example
# 샘플 컬렉션을 만듭니다
users = @{'Hans': 'active', 'Éléonore': 'inactive', '홍길동': 'active'@}

# 전략:  사본을 이터레이트
for user, status in users.copy().items():
    if status == 'inactive':
        del users[user]

# 전략:  새 컬렉션 만들기
active_users = @{@}
for user, status in users.items():
    if status == 'active':
        active_users[user] = status
@end example

@node range 함수,break 와 continue 문,for 문,기타 제어 흐름 도구
@anchor{tutorial/controlflow the-range-function}@anchor{1fee}@anchor{tutorial/controlflow tut-range}@anchor{1fef}
@subsection @code{range()} 함수


숫자들의 시퀀스로 이터레이트할 필요가 있으면, 내장 함수 @ref{b3d,,range()}가 편리합니다. 수열을 만듭니다:

@example
>>> for i in range(5):
...     print(i)
...
0
1
2
3
4
@end example

끝값은 만들어지는 수열에 포함되지 않습니다; @code{range(10)} 은 10개의 값을 만드는데, 길이 10인 시퀀스의 항목들을 가리키는 올바른 인덱스들입니다. 범위가 다른 숫자로 시작하거나, 다른 증가분을 (음수조차 가능합니다; 때로 이것을 ‘스텝(step)’이라고 부릅니다) 지정하는 것도 가능합니다:

@example
>>> list(range(5, 10))
[5, 6, 7, 8, 9]

>>> list(range(0, 10, 3))
[0, 3, 6, 9]

>>> list(range(-10, -100, -30))
[-10, -40, -70]
@end example

시퀀스의 인덱스들로 이터레이트 하려면, 다음처럼 @ref{b3d,,range()}와 @ref{83f,,len()} 을 결합할 수 있습니다:

@example
>>> a = ['Mary', 'had', 'a', 'little', 'lamb']
>>> for i in range(len(a)):
...     print(i, a[i])
...
0 Mary
1 had
2 a
3 little
4 lamb
@end example

하지만, 그럴 때 대부분은, @ref{1686,,enumerate()} 함수를 쓰는 것이 편리합니다, @ref{1ff0,,루프 테크닉} 를 보세요.

범위를 그냥 인쇄하면 이상한 일이 일어납니다:

@example
>>> range(10)
range(0, 10)
@end example

많은 경우에 @ref{b3d,,range()}가 돌려준 객체는 리스트인 것처럼 동작하지만, 사실 리스트가 아닙니다. 이터레이트할 때 원하는 시퀀스 항목들을 순서대로 돌려주는 객체이지만, 실제로 리스트를 만들지 않아서 공간을 절약합니다.

이런 객체를 @ref{142c,,이터러블} 이라고 부릅니다. 공급이 소진될 때까지 일련의 항목들을 얻을 수 있는 무엇인가를 기대하는 함수와 구조물들의 타깃으로 적합합니다. 우리는 @ref{34a,,for} 문이 그런 구조물임을 보았습니다. 이터러블을 취하는 함수의 예는 @ref{694,,sum()}입니다:

@example
>>> sum(range(4))  # 0 + 1 + 2 + 3
6
@end example

Later we will see more functions that return iterables and take iterables as
arguments.  In chapter @ref{1ff1,,자료 구조}, we will discuss @ref{24d,,list()} in more
detail.

@node break 와 continue 문,루프의 else 절,range 함수,기타 제어 흐름 도구
@anchor{tutorial/controlflow break-and-continue-statements}@anchor{1ff2}@anchor{tutorial/controlflow tut-break}@anchor{1ff3}
@subsection @code{break} 와 @code{continue} 문


@ref{17f,,break} 문은 가장 가까이서 둘러싸는 @ref{34a,,for} 나 @ref{1974,,while} 루프로부터 빠져나가게 만듭니다.

@example
>>> for n in range(2, 10):
...     for x in range(2, n):
...         if n % x == 0:
...             print(f"@{n@} equals @{x@} * @{n//x@}")
...             break
...
4 equals 2 * 2
6 equals 2 * 3
8 equals 2 * 4
9 equals 3 * 3
@end example

@ref{180,,continue} 문은 루프의 다음 이터레이션에서 계속하도록 만듭니다:

@example
>>> for num in range(2, 10):
...     if num % 2 == 0:
...         print(f"Found an even number @{num@}")
...         continue
...     print(f"Found an odd number @{num@}")
...
Found an even number 2
Found an odd number 3
Found an even number 4
Found an odd number 5
Found an even number 6
Found an odd number 7
Found an even number 8
Found an odd number 9
@end example
@anchor{tutorial/controlflow tut-for-else}@anchor{1ff4}
@node 루프의 else 절,pass 문,break 와 continue 문,기타 제어 흐름 도구
@anchor{tutorial/controlflow break-and-continue-statements-and-else-clauses-on-loops}@anchor{1ff5}@anchor{tutorial/controlflow else-clauses-on-loops}@anchor{1ff6}
@subsection 루프의 @code{else} 절


In a @code{for} or @code{while} loop the @code{break} statement
may be paired with an @code{else} clause.  If the loop finishes without
executing the @code{break}, the @code{else} clause executes.

In a @ref{34a,,for} loop, the @code{else} clause is executed
after the loop finishes its final iteration, that is, if no break occurred.

In a @ref{1974,,while} loop, it’s executed after the loop’s condition becomes false.

In either kind of loop, the @code{else} clause is `not' executed if the
loop was terminated by a @ref{17f,,break}.  Of course, other ways of ending the
loop early, such as a @ref{1af,,return} or a raised exception, will also skip
execution of the @ref{17c,,else} clause.

This is exemplified in the following @code{for} loop,
which searches for prime numbers:

@example
>>> for n in range(2, 10):
...     for x in range(2, n):
...         if n % x == 0:
...             print(n, 'equals', x, '*', n//x)
...             break
...     else:
...         # 루프에서 인수를 발견하지 못하고 떨어집니다
...         print(n, 'is a prime number')
...
2 is a prime number
3 is a prime number
4 equals 2 * 2
5 is a prime number
6 equals 2 * 3
7 is a prime number
8 equals 2 * 4
9 equals 3 * 3
@end example

(이것은 올바른 코드입니다. 자세히 들여다보면: @code{else} 절은 @code{if} 문이 `아니라' @code{for} 루프에 속합니다.)

One way to think of the else clause is to imagine it paired with the @code{if}
inside the loop.  As the loop executes, it will run a sequence like
if/if/if/else. The @code{if} is inside the loop, encountered a number of times. If
the condition is ever true, a @code{break} will happen. If the condition is never
true, the @code{else} clause outside the loop will execute.

루프와 함께 사용될 때, @code{else} 절은 @code{if} 문보다는 @ref{8f7,,try} 문의 @code{else} 절과 비슷한 면이 많습니다: @code{try} 문의 @code{else} 절은 예외가 발생하지 않을 때 실행되고, 루프의 @code{else} 절은 @code{break}가 발생하지 않을 때 실행됩니다. @code{try} 문과 예외에 관한 자세한 내용은 @ref{1ff7,,예외 처리하기} 를 보세요.

@geindex ...;ellipsis literal

@node pass 문,match 문,루프의 else 절,기타 제어 흐름 도구
@anchor{tutorial/controlflow pass-statements}@anchor{1ff8}@anchor{tutorial/controlflow tut-pass}@anchor{1ff9}
@subsection @code{pass} 문


@ref{17e,,pass} 문은 아무것도 하지 않습니다. 문법적으로 문장이 필요하지만, 프로그램이 특별히 할 일이 없을 때 사용할 수 있습니다. 예를 들어:

@example
>>> while True:
...     pass  # 키보드 인터럽트(Ctrl+C)를 기다립니다
...
@end example

최소한의 클래스를 만들 때 흔히 사용됩니다:

@example
>>> class MyEmptyClass:
...     pass
...
@end example

@ref{17e,,pass}가 사용될 수 있는 다른 장소는 새 코드를 작업할 때 함수나 조건부 바디의 자리를 채우는 것인데, 여러분이 더 추상적인 수준에서 생각할 수 있게 합니다. @code{pass} 는 조용히 무시됩니다:

@example
>>> def initlog(*args):
...     pass   # 구현을 잊지마세요!
...
@end example

For this last case, many people use the ellipsis literal @code{...} instead of
@code{pass}. This use has no special meaning to Python, and is not part of
the language definition (you could use any constant expression here), but
@code{...} is used conventionally as a placeholder body as well.
See @ref{1ffa,,Ellipsis 객체}.

@node match 문,함수 정의하기,pass 문,기타 제어 흐름 도구
@anchor{tutorial/controlflow match-statements}@anchor{1ffb}@anchor{tutorial/controlflow tut-match}@anchor{1feb}
@subsection @code{match} 문


A @ref{a0e,,match} statement takes an expression and compares its value to successive
patterns given as one or more case blocks.  This is superficially
similar to a switch statement in C, Java or JavaScript (and many
other languages), but it’s more similar to pattern matching in
languages like Rust or Haskell. Only the first pattern that matches
gets executed and it can also extract components (sequence elements
or object attributes) from the value into variables. If no case matches,
none of the branches is executed.

The simplest form compares a subject value against one or more literals:

@example
def http_error(status):
    match status:
        case 400:
            return "Bad request"
        case 404:
            return "Not found"
        case 418:
            return "I'm a teapot"
        case _:
            return "Something's wrong with the internet"
@end example

Note the last block: the “variable name” @code{_} acts as a `wildcard' and
never fails to match.

You can combine several literals in a single pattern using @code{|} (“or”):

@example
case 401 | 403 | 404:
    return "Not allowed"
@end example

Patterns can look like unpacking assignments, and can be used to bind
variables:

@example
# point 는 (x, y) 튜플입니다
match point:
    case (0, 0):
        print("Origin")
    case (0, y):
        print(f"Y=@{y@}")
    case (x, 0):
        print(f"X=@{x@}")
    case (x, y):
        print(f"X=@{x@}, Y=@{y@}")
    case _:
        raise ValueError("Not a point")
@end example

Study that one carefully!  The first pattern has two literals, and can
be thought of as an extension of the literal pattern shown above.  But
the next two patterns combine a literal and a variable, and the
variable `binds' a value from the subject (@code{point}).  The fourth
pattern captures two values, which makes it conceptually similar to
the unpacking assignment @code{(x, y) = point}.

If you are using classes to structure your data
you can use the class name followed by an argument list resembling a
constructor, but with the ability to capture attributes into variables:

@example
class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y

def where_is(point):
    match point:
        case Point(x=0, y=0):
            print("Origin")
        case Point(x=0, y=y):
            print(f"Y=@{y@}")
        case Point(x=x, y=0):
            print(f"X=@{x@}")
        case Point():
            print("Somewhere else")
        case _:
            print("Not a point")
@end example

You can use positional parameters with some builtin classes that provide an
ordering for their attributes (e.g. dataclasses). You can also define a specific
position for attributes in patterns by setting the @code{__match_args__} special
attribute in your classes. If it’s set to (“x”, “y”), the following patterns are all
equivalent (and all bind the @code{y} attribute to the @code{var} variable):

@example
Point(1, var)
Point(1, y=var)
Point(x=1, y=var)
Point(y=var, x=1)
@end example

A recommended way to read patterns is to look at them as an extended form of what you
would put on the left of an assignment, to understand which variables would be set to
what.
Only the standalone names (like @code{var} above) are assigned to by a match statement.
Dotted names (like @code{foo.bar}), attribute names (the @code{x=} and @code{y=} above) or class names
(recognized by the “(…)” next to them like @code{Point} above) are never assigned to.

Patterns can be arbitrarily nested.  For example, if we have a short
list of Points, with @code{__match_args__} added, we could match it like this:

@example
class Point:
    __match_args__ = ('x', 'y')
    def __init__(self, x, y):
        self.x = x
        self.y = y

match points:
    case []:
        print("No points")
    case [Point(0, 0)]:
        print("The origin")
    case [Point(x, y)]:
        print(f"Single point @{x@}, @{y@}")
    case [Point(0, y1), Point(0, y2)]:
        print(f"Two on the Y axis at @{y1@}, @{y2@}")
    case _:
        print("Something else")
@end example

We can add an @code{if} clause to a pattern, known as a “guard”.  If the
guard is false, @code{match} goes on to try the next case block.  Note
that value capture happens before the guard is evaluated:

@example
match point:
    case Point(x, y) if x == y:
        print(f"Y=X at @{x@}")
    case Point(x, y):
        print(f"Not on the diagonal")
@end example

Several other key features of this statement:


@itemize -

@item 
Like unpacking assignments, tuple and list patterns have exactly the
same meaning and actually match arbitrary sequences.  An important
exception is that they don’t match iterators or strings.

@item 
Sequence patterns support extended unpacking: @code{[x, y, *rest]} and @code{(x, y,
*rest)} work similar to unpacking assignments.  The
name after @code{*} may also be @code{_}, so @code{(x, y, *_)} matches a sequence
of at least two items without binding the remaining items.

@item 
Mapping patterns: @code{@{"bandwidth": b, "latency": l@}} captures the
@code{"bandwidth"} and @code{"latency"} values from a dictionary.  Unlike sequence
patterns, extra keys are ignored.  An unpacking like @code{**rest} is also
supported.  (But @code{**_} would be redundant, so it is not allowed.)

@item 
Subpatterns may be captured using the @code{as} keyword:

@example
case (Point(x1, y1), Point(x2, y2) as p2): ...
@end example

will capture the second element of the input as @code{p2} (as long as the input is
a sequence of two points)

@item 
Most literals are compared by equality, however the singletons @code{True},
@code{False} and @code{None} are compared by identity.

@item 
Patterns may use named constants.  These must be dotted names
to prevent them from being interpreted as capture variables:

@example
from enum import Enum
class Color(Enum):
    RED = 'red'
    GREEN = 'green'
    BLUE = 'blue'

color = Color(input("Enter your choice of 'red', 'blue' or 'green': "))

match color:
    case Color.RED:
        print("I see red!")
    case Color.GREEN:
        print("Grass is green")
    case Color.BLUE:
        print("I'm feeling the blues :(")
@end example
@end itemize

For a more detailed explanation and additional examples, you can look into
@geindex Python 향상 제안; PEP 636
PEP 636@footnote{https://peps.python.org/pep-0636/} which is written in a tutorial format.

@node 함수 정의하기,함수 정의 더 보기,match 문,기타 제어 흐름 도구
@anchor{tutorial/controlflow defining-functions}@anchor{1ffc}@anchor{tutorial/controlflow tut-functions}@anchor{1ffd}
@subsection 함수 정의하기


피보나치 수열을 임의의 한도까지 출력하는 함수를 만들 수 있습니다:

@example
>>> def fib(n):    # n 보다 작은 피보나치 수열을 씁니다
...     """n 보다 작은 피보나치 수열을 인쇄합니다."""
...     a, b = 0, 1
...     while a < n:
...         print(a, end=' ')
...         a, b = b, a+b
...     print()
...
>>> # 이제 방금 정의한 함수를 호출합니다:
>>> fib(2000)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597
@end example

@geindex 도큐멘테이션 문자열
@geindex 독스트링
@geindex 문자열@comma{} 도큐멘테이션

키워드 @ref{165f,,def}는 함수 `정의'를 시작합니다. 함수 이름과 괄호로 싸인 형식 매개변수들의 목록이 뒤따릅니다. 함수의 바디를 형성하는 문장들이 다음 줄에서 시작되고, 반드시 들여쓰기 되어야 합니다.

함수 바디의 첫 번째 문장은 선택적으로 문자열 리터럴이 될 수 있습니다; 이 문자열 리터럴은 함수의 도큐멘테이션 문자열, 즉 `독스트링 (docstring)' 입니다. (독스트링에 대한 자세한 내용은 @ref{1ffe,,도큐멘테이션 문자열} 에 나옵니다.) 독스트링을 사용해서 온라인이나 인쇄된 설명서를 자동 생성하거나, 사용자들이 대화형으로 코드를 열람할 수 있도록 하는 도구들이 있습니다; 여러분이 작성하는 코드에 독스트링을 첨부하는 것은 좋은 관습입니다, 그러니 버릇을 들이는 것이 좋습니다.

함수의 `실행'은 함수의 지역 변수들을 위한 새 심볼 테이블을 만듭니다. 좀 더 구체적으로, 함수에서의 모든 변수 대입들은 값을 지역 심볼 테이블에 저장합니다; 반면에 변수 참조는 먼저 지역 심볼 테이블을 본 다음, 전역 심볼 테이블을 본 후, 마지막으로 내장 이름들의 테이블을 살핍니다. 그래서, 참조될 수는 있다 하더라도, 전역 변수들과 둘러싸는 함수의 변수들은 함수 내에서 직접 값이 대입될 수 없습니다 (전역 변수를 @ref{4ad,,global} 문으로 명시하거나 둘러싸는 함수의 변수를 @ref{14ac,,nonlocal} 문으로 명시하지 않는 이상).

함수 호출로 전달되는 실제 매개변수들 (인자들)은 호출될 때 호출되는 함수의 지역 심볼 테이블에 만들어집니다; 그래서 인자들은 `값에 의한 호출(call by value)'로 전달됩니다 (`값'은 항상 객체의 값이 아니라 객체 `참조'입니다). @footnote{
실제로, `객체 참조에 의한 호출 (call by object reference)' 이 더 좋은 표현인데, 가변 객체가 전달되면, 호출자는 피호출자가 만든 변경을 볼 수 있기 때문입니다 (가령 리스트에 항목을 추가합니다).
} 함수가 다른 함수를 호출할 때, 또는 자신을 재귀적으로 호출할 때, 그 호출을 위한 새 지역 심볼 테이블이 만들어집니다.

함수 정의는 함수 이름을 현재 심볼 테이블의 함수 객체와 연결합니다. 인터프리터는 해당 이름이 가리키는 객체를 사용자 정의 함수로 인식합니다. 다른 이름은 같은 함수 객체를 가리킬 수 있으며 함수에 액세스하는 데 사용될 수도 있습니다:

@example
>>> fib
<function fib at 10042ed0>
>>> f = fib
>>> f(100)
0 1 1 2 3 5 8 13 21 34 55 89
@end example

다른 언어들을 사용했다면, @code{fib} 가 값을 돌려주지 않기 때문에 함수가 아니라 프로시저라고 생각할 수 있습니다. 사실, @ref{1af,,return} 문이 없는 함수도 값을 돌려줍니다, 비록 따분한 값이기는 하지만. 이 값은 @code{None}이라고 불립니다 (내장 이름입니다). @code{None} 이 출력할 유일한 값이라면, 인터프리터는 보통 @code{None} 값 출력을 억제합니다. 꼭 보길 원한다면 @ref{1174,,print()}를 사용할 수 있습니다:

@example
>>> fib(0)
>>> print(fib(0))
None
@end example

인쇄하는 대신, 피보나치 수열의 숫자들 리스트를 돌려주는 함수를 작성하는 것도 간단합니다:

@example
>>> def fib2(n):  # n 보다 작은 피보나치 수열을 돌려줍니다
...     """n 보다 작은 피보나치 수열을 담은 리스트를 돌려줍니다."""
...     result = []
...     a, b = 0, 1
...     while a < n:
...         result.append(a)    # 아래를 보세요
...         a, b = b, a+b
...     return result
...
>>> f100 = fib2(100)    # 호출합니다
>>> f100                # 결과를 씁니다
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
@end example

여느 때처럼, 이 예는 몇 가지 새 파이썬 기능을 보여줍니다:


@itemize *

@item 
@ref{1af,,return} 문은 함수로부터 값을 갖고 복귀하게 만듭니다. 표현식 인자 없는 @code{return} 은 @code{None}을 돌려줍니다. 함수의 끝으로 떨어지면 역시 @code{None}을 돌려줍니다.

@item 
The statement @code{result.append(a)} calls a `method' of the list object
@code{result}.  A method is a function that ‘belongs’ to an object and is named
@code{obj.methodname}, where @code{obj} is some object (this may be an expression),
and @code{methodname} is the name of a method that is defined by the object’s type.
Different types define different methods.  Methods of different types may have
the same name without causing ambiguity.  (It is possible to define your own
object types and methods, using `classes', see @ref{1fff,,클래스})
The method @ref{8db,,append()} shown in the example is defined for list objects; it
adds a new element at the end of the list.  In this example it is equivalent to
@code{result = result + [a]}, but more efficient.
@end itemize

@node 함수 정의 더 보기,막간극 코딩 스타일,함수 정의하기,기타 제어 흐름 도구
@anchor{tutorial/controlflow more-on-defining-functions}@anchor{2000}@anchor{tutorial/controlflow tut-defining}@anchor{2001}
@subsection 함수 정의 더 보기


정해지지 않은 개수의 인자들로 함수를 정의하는 것도 가능합니다. 세 가지 형식이 있는데, 조합할 수 있습니다.

@menu
* 기본 인자 값:: 
* 키워드 인자:: 
* 특수 매개 변수:: 
* 임의의 인자 목록:: 
* 인자 목록 언 패킹:: 
* 람다 표현식:: 
* 도큐멘테이션 문자열:: 
* 함수 어노테이션:: 

@end menu

@node 기본 인자 값,키워드 인자,,함수 정의 더 보기
@anchor{tutorial/controlflow default-argument-values}@anchor{2002}@anchor{tutorial/controlflow tut-defaultargs}@anchor{2003}
@subsubsection 기본 인자 값


가장 쓸모 있는 형식은 하나나 그 이상 인자들의 기본값을 지정하는 것입니다. 정의된 것보다 더 적은 개수의 인자들로 호출될 수 있는 함수를 만듭니다. 예를 들어:

@example
def ask_ok(prompt, retries=4, reminder='Please try again!'):
    while True:
        reply = input(prompt)
        if reply in @{'y', 'ye', 'yes'@}:
            return True
        if reply in @{'n', 'no', 'nop', 'nope'@}:
            return False
        retries = retries - 1
        if retries < 0:
            raise ValueError('invalid user response')
        print(reminder)
@end example

이 함수는 여러 가지 방법으로 호출될 수 있습니다:


@itemize *

@item 
오직 꼭 필요한 인자만 전달해서: @code{ask_ok('정말 끝내길 원하세요?')}

@item 
선택적 인자 하나를 제공해서: @code{ask_ok('파일을 덮어써도 좋습니까?', 2)}

@item 
또는 모든 인자를 제공해서: @code{ask_ok('파일을 덮어써도 좋습니까?', 2, '자, 예나 아니요로만 답하세요!')}
@end itemize

이 예는 @ref{34b,,in} 키워드도 소개하고 있습니다. 시퀀스가 어떤 값을 가졌는지 아닌지를 검사합니다.

기본값은 함수 정의 시점에 `정의되고 있는' 스코프에서 구해집니다, 그래서

@example
i = 5

def f(arg=i):
    print(arg)

i = 6
f()
@end example

는 @code{5}를 인쇄합니다.

`중요한 주의사항:' 기본값은 오직 한 번만 값이 구해집니다. 이것은 기본값이 리스트나 딕셔너리나 대부분 클래스의 인스턴스와 같은 가변 객체일 때 차이를 만듭니다. 예를 들어, 다음 함수는 계속되는 호출로 전달된 인자들을 누적합니다:

@example
def f(a, L=[]):
    L.append(a)
    return L

print(f(1))
print(f(2))
print(f(3))
@end example

다음과 같은 것을 인쇄합니다

@example
[1]
[1, 2]
[1, 2, 3]
@end example

연속된 호출 간에 기본값이 공유되지 않기를 원한다면, 대신 함수를 이런 식으로 쓸 수 있습니다:

@example
def f(a, L=None):
    if L is None:
        L = []
    L.append(a)
    return L
@end example

@node 키워드 인자,특수 매개 변수,기본 인자 값,함수 정의 더 보기
@anchor{tutorial/controlflow keyword-arguments}@anchor{2004}@anchor{tutorial/controlflow tut-keywordargs}@anchor{2005}
@subsubsection 키워드 인자


함수는 @code{kwarg=value} 형식의 @ref{f0d,,키워드 인자} 를 사용해서 호출될 수 있습니다. 예를 들어, 다음 함수는:

@example
def parrot(voltage, state='a stiff', action='voom', type='Norwegian Blue'):
    print("-- This parrot wouldn't", action, end=' ')
    print("if you put", voltage, "volts through it.")
    print("-- Lovely plumage, the", type)
    print("-- It's", state, "!")
@end example

하나의 필수 인자(@code{voltage})와 세 개의 선택적 인자 (@code{state}, @code{action}, @code{type}) 를 받아들입니다. 이 함수는 다음과 같은 방법 중 아무것으로나 호출될 수 있습니다.

@example
parrot(1000)                                          # 1개의 위치 인자
parrot(voltage=1000)                                  # 1개의 키워드 인자
parrot(voltage=1000000, action='VOOOOOM')             # 2개의 키워드 인자
parrot(action='VOOOOOM', voltage=1000000)             # 2개의 키워드 인자
parrot('a million', 'bereft of life', 'jump')         # 3개의 위치 인자
parrot('a thousand', state='pushing up the daisies')  # 1개의 위치, 1개의 키워드
@end example

하지만 다음과 같은 호출들은 모두 올바르지 않습니다:

@example
parrot()                     # 필수 인자 누락
parrot(voltage=5.0, 'dead')  # 키워드 인자 뒤에 키워드가 아닌 인자가 옴
parrot(110, voltage=220)     # 같은 인자가 중복됨
parrot(actor='John Cleese')  # 알려지지 않은 키워드 인자
@end example

함수 호출에서, 키워드 인자는 위치 인자 뒤에 나와야 합니다. 전달된 모든 키워드 인자는 함수가 받아들이는 인자 중 하나와 맞아야 하며 (예를 들어, @code{actor}는 @code{parrot} 함수의 올바른 인자가 아니다), 그 순서는 중요하지 않습니다. 이것들에는 필수 인자들도 포함됩니다 (예를 들어, @code{parrot(voltage=1000)} 도 올바릅니다). 어떤 인자도 두 개 이상의 값을 받을 수 없습니다. 여기, 이 제약 때문에 실패하는 예가 있습니다:

@example
>>> def function(a):
...     pass
...
>>> function(0, a=0)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: function() got multiple values for argument 'a'
@end example

@code{**name} 형식의 마지막 형식 매개변수가 존재하면, 형식 매개변수들에 대응하지 않는 모든 키워드 인자들을 담은 딕셔너리 (@ref{cbc,,매핑 형 — dict} 를 보세요) 를 받습니다. 이것은 @code{*name} (다음 서브섹션에서 설명합니다) 형식의 형식 매개변수와 조합될 수 있는데, 형식 매개변수 목록 밖의 위치 인자들을 담은 @ref{2006,,튜플}을 받습니다. (@code{*name}은 @code{**name} 앞에 나와야 합니다.) 예를 들어, 이런 함수를 정의하면:

@example
def cheeseshop(kind, *arguments, **keywords):
    print("-- Do you have any", kind, "?")
    print("-- I'm sorry, we're all out of", kind)
    for arg in arguments:
        print(arg)
    print("-" * 40)
    for kw in keywords:
        print(kw, ":", keywords[kw])
@end example

이런 식으로 호출될 수 있습니다:

@example
cheeseshop("Limburger", "It's very runny, sir.",
           "It's really very, VERY runny, sir.",
           shopkeeper="Michael Palin",
           client="John Cleese",
           sketch="Cheese Shop Sketch")
@end example

그리고 당연히 이렇게 인쇄합니다:

@example
-- Do you have any Limburger ?
-- I'm sorry, we're all out of Limburger
It's very runny, sir.
It's really very, VERY runny, sir.
----------------------------------------
shopkeeper : Michael Palin
client : John Cleese
sketch : Cheese Shop Sketch
@end example

인쇄되는 키워드 인자들의 순서 함수 호출로 전달된 순서와 일치함이 보장됨에 주목하세요.

@node 특수 매개 변수,임의의 인자 목록,키워드 인자,함수 정의 더 보기
@anchor{tutorial/controlflow special-parameters}@anchor{2007}
@subsubsection 특수 매개 변수


기본적으로, 인자는 위치나 명시적인 키워드로 파이썬 함수에 전달될 수 있습니다. 가독성과 성능을 위해, 개발자가 항목이 위치, 위치나 키워드 또는 키워드로 전달되는지를 판단할 때 함수 정의만을 보면 되도록, 인자가 전달될 방법을 제한하면 좋습니다.

함수 정의는 다음과 같습니다:

@example
def f(pos1, pos2, /, pos_or_kwd, *, kwd1, kwd2):
      -----------    ----------     ----------
        |             |                  |
        |        위치-키워드                  |
        |                                - 카워드 전용
         -- 위치 전용
@end example

여기서 @code{/}와 @code{*}는 선택적입니다. 사용하면, 이 기호는 인자가 함수에 전달되는 방식에 따른 매개 변수의 종류를 나타냅니다: 위치 전용, 위치-키워드 및 키워드 전용. 키워드 매개 변수는 명명된(named) 매개 변수라고도 합니다.

@menu
* 위치-키워드(Positional-or-Keyword) 인자: 위치-키워드 Positional-or-Keyword 인자. 
* 위치 전용 매개 변수: 위치 전용 매개 변수<2>. 
* 키워드 전용 인자:: 
* 함수 예제:: 
* 복습:: 

@end menu

@node 위치-키워드 Positional-or-Keyword 인자,위치 전용 매개 변수<2>,,특수 매개 변수
@anchor{tutorial/controlflow positional-or-keyword-arguments}@anchor{2008}
@subsubsection 위치-키워드(Positional-or-Keyword) 인자


함수 정의에 @code{/}와 @code{*}가 없으면, 인자를 위치나 키워드로 함수에 전달할 수 있습니다.

@node 위치 전용 매개 변수<2>,키워드 전용 인자,위치-키워드 Positional-or-Keyword 인자,특수 매개 변수
@anchor{tutorial/controlflow positional-only-parameters}@anchor{2009}
@subsubsection 위치 전용 매개 변수


좀 더 자세하게 살펴보면, 특정 매개 변수를 `위치 전용'으로 표시할 수 있습니다. `위치 전용'이면, 매개 변수의 순서가 중요하며, 키워드로 매개 변수를 전달할 수 없습니다. 위치 전용 매개 변수는 @code{/} (슬래시) 앞에 놓입니다. @code{/}는 위치 전용 매개 변수를 나머지 매개 변수들로부터 논리적으로 분리하는 데 사용됩니다. 함수 정의에 @code{/}가 없으면, 위치 전용 매개 변수는 없습니다.

@code{/} 다음의 매개 변수는 `위치-키워드'나 `키워드 전용'일 수 있습니다.

@node 키워드 전용 인자,함수 예제,위치 전용 매개 변수<2>,특수 매개 변수
@anchor{tutorial/controlflow keyword-only-arguments}@anchor{200a}
@subsubsection 키워드 전용 인자


매개 변수를 키워드 인자로 전달해야 함을 나타내도록, 매개 변수를 `키워드 전용'으로 표시하려면, 첫 번째 `키워드 전용' 매개 변수 바로 전에 인자 목록에 @code{*}를 넣으십시오.

@node 함수 예제,복습,키워드 전용 인자,특수 매개 변수
@anchor{tutorial/controlflow function-examples}@anchor{200b}
@subsubsection 함수 예제


@code{/}와 @code{*} 마커에 주의를 기울이는 다음 예제 함수 정의를 고려하십시오:

@example
>>> def standard_arg(arg):
...     print(arg)
...
>>> def pos_only_arg(arg, /):
...     print(arg)
...
>>> def kwd_only_arg(*, arg):
...     print(arg)
...
>>> def combined_example(pos_only, /, standard, *, kwd_only):
...     print(pos_only, standard, kwd_only)
@end example

첫 번째 함수 정의 @code{standard_arg}는 가장 익숙한 형식으로, 호출 규칙에 아무런 제한을 두지 않으며 인자는 위치나 키워드로 전달될 수 있습니다:

@example
>>> standard_arg(2)
2

>>> standard_arg(arg=2)
2
@end example

두 번째 함수 @code{pos_only_arg}는 함수 정의에 @code{/}가 있으므로 위치 매개 변수만 사용하도록 제한됩니다:

@example
>>> pos_only_arg(1)
1

>>> pos_only_arg(arg=1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: pos_only_arg() got some positional-only arguments passed as keyword arguments: 'arg'
@end example

세 번째 함수 @code{kwd_only_arg}는 함수 정의에서 @code{*}로 표시된 키워드 인자만 허용합니다:

@example
>>> kwd_only_arg(3)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: kwd_only_arg() takes 0 positional arguments but 1 was given

>>> kwd_only_arg(arg=3)
3
@end example

마지막은 같은 함수 정의에서 세 가지 호출 규칙을 모두 사용합니다:

@example
>>> combined_example(1, 2, 3)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: combined_example() takes 2 positional arguments but 3 were given

>>> combined_example(1, 2, kwd_only=3)
1 2 3

>>> combined_example(1, standard=2, kwd_only=3)
1 2 3

>>> combined_example(pos_only=1, standard=2, kwd_only=3)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: combined_example() got some positional-only arguments passed as keyword arguments: 'pos_only'
@end example

마지막으로, 위치 인자 @code{name}과 @code{name}을 키로 가지는 @code{**kwds} 사이에 잠재적인 충돌이 있는 이 함수 정의를 고려하십시오:

@example
def foo(name, **kwds):
    return 'name' in kwds
@end example

@code{'name'} 키워드는 항상 첫 번째 매개 변수에 결합하므로 @code{True}를 반환할 수 있는 호출은 불가능합니다. 예를 들면:

@example
>>> foo(1, **@{'name': 2@})
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: foo() got multiple values for argument 'name'
>>>
@end example

그러나 @code{/}(위치 전용 인자)를 사용하면, @code{name}을 위치 인자로, 동시에 @code{'name'}을 키워드 인자의 키로 사용할 수 있으므로 가능합니다:

@example
>>> def foo(name, /, **kwds):
...     return 'name' in kwds
...
>>> foo(1, **@{'name': 2@})
True
@end example

즉, 위치 전용 매개 변수의 이름을 @code{**kwds}에서 모호함 없이 사용할 수 있습니다.

@node 복습,,함수 예제,특수 매개 변수
@anchor{tutorial/controlflow recap}@anchor{200c}
@subsubsection 복습


사용 사례가 함수 정의에서 어떤 매개 변수를 사용할지 결정합니다:

@example
def f(pos1, pos2, /, pos_or_kwd, *, kwd1, kwd2):
@end example

지침으로서:


@itemize *

@item 
매개 변수의 이름을 사용자가 사용할 수 없도록 하려면 위치 전용을 사용하십시오. 매개 변수 이름이 실제 의미가 없을 때, 함수가 호출될 때 인자의 순서를 강제하려고 할 때, 또는 일부 위치 매개 변수와 임의의 키워드를 받아들이고 싶을 때 유용합니다.

@item 
이름이 의미가 있고 함수 정의가 이름을 명시적으로 지정함으로써 더 이해하기 쉬워지거나, 사용자가 전달되는 인자의 위치에 의존하지 못하도록 하려면 키워드 전용을 사용하십시오.

@item 
API의 경우, 향후 매개 변수의 이름이 수정될 때 비호환 API 변경이 발생하는 것을 방지하려면 위치 전용을 사용하십시오.
@end itemize

@node 임의의 인자 목록,인자 목록 언 패킹,특수 매개 변수,함수 정의 더 보기
@anchor{tutorial/controlflow arbitrary-argument-lists}@anchor{200d}@anchor{tutorial/controlflow tut-arbitraryargs}@anchor{200e}
@subsubsection 임의의 인자 목록


@geindex * (애스터리스크);함수 호출에서

마지막으로, 가장 덜 사용되는 옵션은 함수가 임의의 개수 인자로 호출될 수 있도록 지정하는 것입니다. 이 인자들은 튜플로 묶입니다 (@ref{2006,,튜플과 시퀀스} 을 보세요). 가변 길이 인자 앞에, 없거나 여러 개의 일반 인자들이 올 수 있습니다.

@example
def write_multiple_items(file, separator, *args):
    file.write(separator.join(args))
@end example

보통, 이 `가변 길이' 인자들은 형식 매개변수 목록의 마지막에 옵니다, 함수로 전달된 남은 입력 인자들 전부를 그러모으기 때문입니다. @code{*args} 매개변수 뒤에 등장하는 형식 매개변수들은 모두 ‘키워드-전용’ 인자들인데, 위치 인자 대신 키워드 인자로만 사용될 수 있다는 뜻입니다.

@example
>>> def concat(*args, sep="/"):
...     return sep.join(args)
...
>>> concat("earth", "mars", "venus")
'earth/mars/venus'
>>> concat("earth", "mars", "venus", sep=".")
'earth.mars.venus'
@end example

@node 인자 목록 언 패킹,람다 표현식,임의의 인자 목록,함수 정의 더 보기
@anchor{tutorial/controlflow tut-unpacking-arguments}@anchor{200f}@anchor{tutorial/controlflow unpacking-argument-lists}@anchor{2010}
@subsubsection 인자 목록 언 패킹


인자들이 이미 리스트나 튜플에 있지만, 분리된 위치 인자들을 요구하는 함수 호출을 위해 언 패킹 해야 하는 경우 반대 상황이 벌어집니다. 예를 들어, 내장 @ref{b3d,,range()} 함수는 별도의 `start'와 `stop' 인자를 기대합니다. 그것들이 따로 있지 않으면, 리스트와 튜플로부터 인자를 언 패킹하기 위해 @code{*}-연산자를 사용해서 함수를 호출하면 됩니다:

@example
>>> list(range(3, 6))            # 별도의 인자를 사용하는 일반 호출
[3, 4, 5]
>>> args = [3, 6]
>>> list(range(*args))            # 리스트에서 언패킹된 인자로 호출
[3, 4, 5]
@end example

@geindex **;함수 호출에서

같은 방식으로 딕셔너리도 @code{**}-연산자를 써서 키워드 인자를 전달할 수 있습니다:

@example
>>> def parrot(voltage, state='a stiff', action='voom'):
...     print("-- This parrot wouldn't", action, end=' ')
...     print("if you put", voltage, "volts through it.", end=' ')
...     print("E's", state, "!")
...
>>> d = @{"voltage": "four million", "state": "bleedin' demised", "action": "VOOM"@}
>>> parrot(**d)
-- This parrot wouldn't VOOM if you put four million volts through it. E's bleedin' demised !
@end example

@node 람다 표현식,도큐멘테이션 문자열,인자 목록 언 패킹,함수 정의 더 보기
@anchor{tutorial/controlflow lambda-expressions}@anchor{2011}@anchor{tutorial/controlflow tut-lambda}@anchor{2012}
@subsubsection 람다 표현식


@ref{14a2,,lambda} 키워드들 사용해서 작고 이름 없는 함수를 만들 수 있습니다. 이 함수는 두 인자의 합을 돌려줍니다: @code{lambda a, b: a+b}. 함수 객체가 있어야 하는 곳이면 어디나 람다 함수가 사용될 수 있습니다. 문법적으로는 하나의 표현식으로 제한됩니다. 의미적으로는, 일반적인 함수 정의의 편의 문법일 뿐입니다. 중첩된 함수 정의처럼, 람다 함수는 둘러싸는 스코프에 있는 변수들을 참조할 수 있습니다:

@example
>>> def make_incrementor(n):
...     return lambda x: x + n
...
>>> f = make_incrementor(42)
>>> f(0)
42
>>> f(1)
43
@end example

The above example uses a lambda expression to return a function.  Another use
is to pass a small function as an argument.  For instance, @ref{dc7,,list.sort()}
takes a sorting key function `key' which can be a lambda function:

@example
>>> pairs = [(1, 'one'), (2, 'two'), (3, 'three'), (4, 'four')]
>>> pairs.sort(key=lambda pair: pair[1])
>>> pairs
[(4, 'four'), (1, 'one'), (3, 'three'), (2, 'two')]
@end example

@node 도큐멘테이션 문자열,함수 어노테이션,람다 표현식,함수 정의 더 보기
@anchor{tutorial/controlflow documentation-strings}@anchor{2013}@anchor{tutorial/controlflow tut-docstrings}@anchor{1ffe}
@subsubsection 도큐멘테이션 문자열


@geindex 독스트링
@geindex 도큐멘테이션 문자열
@geindex 문자열@comma{} 도큐멘테이션

여기에 도큐멘테이션 문자열의 내용과 포매팅에 관한 몇 가지 관례가 있습니다.

첫 줄은 항상 객체의 목적을 짧고, 간결하게 요약해야 합니다. 간결함을 위해, 객체의 이름이나 형을 명시적으로 언급하지 않아야 하는데, 이것들은 다른 방법으로 제공되기 때문입니다 (이름이 함수의 작업을 설명하는 동사라면 예외입니다). 이 줄은 대문자로 시작하고 마침표로 끝나야 합니다.

도큐멘테이션 문자열에 여러 줄이 있다면, 두 번째 줄은 비어있어서, 시각적으로 요약과 나머지 설명을 분리해야 합니다. 뒤따르는 줄들은 하나나 그 이상의 문단으로, 객체의 호출 규약, 부작용 등을 설명해야 합니다.

The Python parser strips indentation from multi-line string literals when they
serve as module, class, or function docstrings.

여기 여러 줄 독스트링의 예가 있습니다:

@example
>>> def my_function():
...     """Do nothing, but document it.
...
...     No, really, it doesn't do anything:
...
...         >>> my_function()
...         >>>
...     """
...     pass
...
>>> print(my_function.__doc__)
Do nothing, but document it.

No, really, it doesn't do anything:

    >>> my_function()
    >>>
@end example

@node 함수 어노테이션,,도큐멘테이션 문자열,함수 정의 더 보기
@anchor{tutorial/controlflow function-annotations}@anchor{2014}@anchor{tutorial/controlflow tut-annotations}@anchor{2015}
@subsubsection 함수 어노테이션


@geindex 함수;어노테이션
@geindex ->;함수 어노테이션
@geindex ; (콜론);함수 어노테이션

@ref{2016,,함수 어노테이션} 은 사용자 정의 함수가 사용하는 형들에 대한 완전히 선택적인 메타데이터 정보입니다 (자세한 내용은 
@geindex Python 향상 제안; PEP 3107
PEP 3107@footnote{https://peps.python.org/pep-3107/} 과 
@geindex Python 향상 제안; PEP 484
PEP 484@footnote{https://peps.python.org/pep-0484/} 를 보세요).

@ref{2017,,Annotations} are stored in the @ref{458,,__annotations__}
attribute of the function as a dictionary and have no effect on any other part of the
function.  Parameter annotations are defined by a colon after the parameter name, followed
by an expression evaluating to the value of the annotation.  Return annotations are
defined by a literal @code{->}, followed by an expression, between the parameter
list and the colon denoting the end of the @ref{165f,,def} statement.  The
following example has a required argument, an optional argument, and the return
value annotated:

@example
>>> def f(ham: str, eggs: str = 'eggs') -> str:
...     print("Annotations:", f.__annotations__)
...     print("Arguments:", ham, eggs)
...     return ham + ' and ' + eggs
...
>>> f('spam')
Annotations: @{'ham': <class 'str'>, 'return': <class 'str'>, 'eggs': <class 'str'>@}
Arguments: spam eggs
'spam and eggs'
@end example

@node 막간극 코딩 스타일,,함수 정의 더 보기,기타 제어 흐름 도구
@anchor{tutorial/controlflow intermezzo-coding-style}@anchor{2018}@anchor{tutorial/controlflow tut-codingstyle}@anchor{2019}
@subsection 막간극: 코딩 스타일


@geindex 코딩;스타일

Now that you are about to write longer, more complex pieces of Python, it is a
good time to talk about `coding style'.  Most languages can be written (or more
concisely, `formatted') in different styles; some are more readable than others.
Making it easy for others to read your code is always a good idea, and adopting
a nice coding style helps tremendously for that.

파이썬을 위해, 대부분 프로젝트가 고수하는 스타일 가이드로 
@geindex Python 향상 제안; PEP 8
PEP 8@footnote{https://peps.python.org/pep-0008/}이 나왔습니다; 이것은 매우 읽기 쉽고 눈이 편안한 코딩 스타일을 장려합니다. 모든 파이썬 개발자는 언젠가는 이 문서를 읽어야 합니다; 여러분을 위해 가장 중요한 부분들을 추려봤습니다:


@itemize *

@item 
들려 쓰기에 4-스페이스를 사용하고, 탭을 사용하지 마세요.

4개의 스페이스는 작은 들여쓰기 (더 많은 중첩 도를 허락합니다) 와 큰 들여쓰기 (읽기 쉽습니다) 사이의 좋은 절충입니다. 탭은 혼란을 일으키고, 없애는 것이 최선입니다.

@item 
79자를 넘지 않도록 줄 넘김 하세요.

이것은 작은 화면을 가진 사용자를 돕고 큰 화면에서는 여러 코드 파일들을 나란히 볼 수 있게 합니다.

@item 
함수, 클래스, 함수 내의 큰 코드 블록 사이에 빈 줄을 넣어 분리하세요.

@item 
가능하다면, 주석은 별도의 줄로 넣으세요.

@item 
독스트링을 사용하세요.

@item 
연산자들 주변과 콤마 뒤에 스페이스를 넣고, 괄호 바로 안쪽에는 스페이스를 넣지 마세요: @code{a = f(1, 2) + g(3, 4)}.

@item 
클래스와 함수들에 일관성 있는 이름을 붙이세요; 관례는 클래스의 경우 @code{UpperCamelCase}, 함수와 메서드의 경우 @code{lowercase_with_underscores}입니다. 첫 번째 메서드 인자의 이름으로는 항상 @code{self}를 사용하세요 (클래스와 메서드에 대한 자세한 내용은 @ref{201a,,클래스와의 첫 만남} 을 보세요).

@item 
여러분의 코드를 국제적인 환경에서 사용하려고 한다면 특별한 인코딩을 사용하지 마세요. 어떤 경우에도 파이썬의 기본, UTF-8, 또는 단순 ASCII조차, 이 최선입니다.

@item 
마찬가지로, 다른 언어를 사용하는 사람이 코드를 읽거나 유지할 약간의 가능성만 있더라도, 식별자에 ASCII 이외의 문자를 사용하지 마세요.
@end itemize

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 자료 구조,모듈,기타 제어 흐름 도구,파이썬 자습서
@anchor{tutorial/datastructures doc}@anchor{201b}@anchor{tutorial/datastructures data-structures}@anchor{201c}@anchor{tutorial/datastructures translation-repo}@anchor{201d}@anchor{tutorial/datastructures tut-structures}@anchor{1ff1}
@section 자료 구조


이 장에서는 여러분이 이미 배운 것들을 좀 더 자세히 설명하고, 몇 가지 새로운 것들을 덧붙입니다.

@menu
* 리스트 더 보기:: 
* del 문:: 
* 튜플과 시퀀스:: 
* 집합:: 
* 딕셔너리:: 
* 루프 테크닉:: 
* 조건 더 보기:: 
* 시퀀스와 다른 형들을 비교하기:: 

@end menu

@node 리스트 더 보기,del 문,,자료 구조
@anchor{tutorial/datastructures more-on-lists}@anchor{201e}@anchor{tutorial/datastructures tut-morelists}@anchor{201f}
@subsection 리스트 더 보기


The @ref{2020,,list} data type has some more methods. Here are all
of the methods of list objects:


@deffn {메서드} list.append (value, /)

리스트의 끝에 항목을 더합니다. @code{a[len(a):] = [x]} 와 비슷합니다.
@end deffn


@deffn {메서드} list.extend (iterable, /)

리스트의 끝에 이터러블의 모든 항목을 덧붙여서 확장합니다. @code{a[len(a):] = iterable} 와 비슷합니다.
@end deffn


@deffn {메서드} list.insert (index, value, /)

주어진 위치에 항목을 삽입합니다. 첫 번째 인자는 삽입되는 요소가 갖게 될 인덱스입니다. 그래서 @code{a.insert(0, x)} 는 리스트의 처음에 삽입하고, @code{a.insert(len(a), x)} 는 @code{a.append(x)} 와 동등합니다.
@end deffn


@deffn {메서드} list.remove (value, /)

Remove the first item from the list whose value is equal to `value'.  It raises a
@ref{2ec,,ValueError} if there is no such item.
@end deffn


@deffn {메서드} list.pop (index=-1, /)

리스트에서 주어진 위치에 있는 항목을 삭제하고, 그 항목을 돌려줍니다. 인덱스를 지정하지 않으면, @code{a.pop()} 은 리스트의 마지막 항목을 삭제하고 돌려줍니다. 리스트가 비어 있거나 인덱스가 리스트 범위를 벗어나면 @ref{173a,,IndexError}를 발생시킵니다.
@end deffn


@deffn {메서드} list.clear ()

리스트의 모든 항목을 삭제합니다. @code{del a[:]} 와 비슷합니다.
@end deffn


@deffn {메서드} list.index (value[, start[, stop]])

Return zero-based index of the first occurrence of `value' in the list.
Raises a @ref{2ec,,ValueError} if there is no such item.

선택적인 인자 `start' 와 `end' 는 슬라이스 표기법처럼 해석되고, 검색을 리스트의 특별한 서브 시퀀스로 제한하는 데 사용됩니다. 돌려주는 인덱스는 `start' 인자가 아니라 전체 시퀀스의 시작을 기준으로 합니다.
@end deffn


@deffn {메서드} list.count (value, /)

Return the number of times `value' appears in the list.
@end deffn


@deffn {메서드} list.sort (*, key=None, reverse=False)

리스트의 항목들을 제자리에서 정렬합니다 (인자들은 정렬 커스터마이제이션에 사용될 수 있습니다. 설명은 @ref{dc6,,sorted()} 를 보세요).
@end deffn


@deffn {메서드} list.reverse ()

리스트의 요소들을 제자리에서 뒤집습니다.
@end deffn


@deffn {메서드} list.copy ()

리스트의 얕은 사본을 돌려줍니다. @code{a[:]} 와 비슷합니다.
@end deffn

리스트 메서드 대부분을 사용하는 예:

@example
>>> fruits = ['orange', 'apple', 'pear', 'banana', 'kiwi', 'apple', 'banana']
>>> fruits.count('apple')
2
>>> fruits.count('tangerine')
0
>>> fruits.index('banana')
3
>>> fruits.index('banana', 4)  # 위치 4에서부터 다음 banana 를 찾습니다
6
>>> fruits.reverse()
>>> fruits
['banana', 'apple', 'kiwi', 'banana', 'pear', 'apple', 'orange']
>>> fruits.append('grape')
>>> fruits
['banana', 'apple', 'kiwi', 'banana', 'pear', 'apple', 'orange', 'grape']
>>> fruits.sort()
>>> fruits
['apple', 'apple', 'banana', 'banana', 'grape', 'kiwi', 'orange', 'pear']
>>> fruits.pop()
'pear'
@end example

아마도 여러분은 @code{insert}, @code{remove}, @code{sort} 같은 메서드들이 리스트를 수정할 뿐 반환 값이 출력되지 않는 것을 알아챘을 것입니다 – 기본 @code{None} 을 돌려주고 있습니다. @footnote{
다른 언어들에서는 가변 객체를 돌려주기도 하는데, @code{d->insert("a")->remove("b")->sort();} 와 같은 메서드 연쇄를 허락합니다.
} 이것은 파이썬에서 모든 가변 자료 구조들에 적용되는 설계 원리입니다.

아마도 여러분이 알아챘을 또 다른 사실은 모든 데이터를 정렬하거나 비교할 수는 없다는 것입니다. 예를 들어, 정수를 문자열과 비교할 수 없고 @code{None}을 다른 형과 비교할 수 없기 때문에 @code{[None, 'hello', 10]}는 정렬되지 않습니다. 또한 정의된 대소 관계가 없는 형이 있습니다. 예를 들어, @code{3+4j < 5+7j}는 올바른 비교가 아닙니다.

@menu
* 리스트를 스택으로 사용하기:: 
* 리스트를 큐로 사용하기:: 
* 리스트 컴프리헨션:: 
* 중첩된 리스트 컴프리헨션:: 

@end menu

@node 리스트를 스택으로 사용하기,리스트를 큐로 사용하기,,리스트 더 보기
@anchor{tutorial/datastructures tut-lists-as-stacks}@anchor{2021}@anchor{tutorial/datastructures using-lists-as-stacks}@anchor{2022}
@subsubsection 리스트를 스택으로 사용하기


The list methods make it very easy to use a list as a stack, where the last
element added is the first element retrieved (“last-in, first-out”).  To add an
item to the top of the stack, use @ref{8db,,append()}.  To retrieve an item from the
top of the stack, use @ref{2023,,pop()} without an explicit index.  For example:

@example
>>> stack = [3, 4, 5]
>>> stack.append(6)
>>> stack.append(7)
>>> stack
[3, 4, 5, 6, 7]
>>> stack.pop()
7
>>> stack
[3, 4, 5, 6]
>>> stack.pop()
6
>>> stack.pop()
5
>>> stack
[3, 4]
@end example

@node 리스트를 큐로 사용하기,리스트 컴프리헨션,리스트를 스택으로 사용하기,리스트 더 보기
@anchor{tutorial/datastructures tut-lists-as-queues}@anchor{2024}@anchor{tutorial/datastructures using-lists-as-queues}@anchor{2025}
@subsubsection 리스트를 큐로 사용하기


리스트를 큐로 사용하는 것도 가능한데, 처음으로 넣은 요소가 처음으로 꺼내지는 요소입니다 (“first-in, first-out”); 하지만, 리스트는 이 목적에는 효율적이지 않습니다. 리스트의 끝에 덧붙이거나, 끝에서 꺼내는 것은 빠르지만, 리스트의 머리에 덧붙이거나 머리에서 꺼내는 것은 느립니다 (다른 요소들을 모두 한 칸씩 이동시켜야 하기 때문입니다).

큐를 구현하려면, 양 끝에서의 덧붙이기와 꺼내기가 모두 빠르도록 설계된 @ref{7f3,,collections.deque} 를 사용하세요. 예를 들어:

@example
>>> from collections import deque
>>> queue = deque(["Eric", "John", "Michael"])
>>> queue.append("Terry")           # Terry 도착
>>> queue.append("Graham")          # Graham 도착
>>> queue.popleft()                 # 처음 도착한 사람이 이제 떠납니다
'Eric'
>>> queue.popleft()                 # 두번째 도착한 사람이 이제 떠납니다
'John'
>>> queue                           # 도착한 순서대로 남아있는 큐
deque(['Michael', 'Terry', 'Graham'])
@end example

@node 리스트 컴프리헨션,중첩된 리스트 컴프리헨션,리스트를 큐로 사용하기,리스트 더 보기
@anchor{tutorial/datastructures list-comprehensions}@anchor{2026}@anchor{tutorial/datastructures tut-listcomps}@anchor{2027}
@subsubsection 리스트 컴프리헨션


리스트 컴프리헨션은 리스트를 만드는 간결한 방법을 제공합니다. 흔한 용도는, 각 요소가 다른 시퀀스나 이터러블의 멤버들에 어떤 연산을 적용한 결과인 리스트를 만들거나, 어떤 조건을 만족하는 요소들로 구성된 서브 시퀀스를 만드는 것입니다.

예를 들어, 제곱수의 리스트를 만들고 싶다고 가정하자, 이런 식입니다:

@example
>>> squares = []
>>> for x in range(10):
...     squares.append(x**2)
...
>>> squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
@end example

이것은 @code{x} 라는 이름의 변수를 만들고 (또는 덮어쓰고) 루프가 종료된 후에도 남아있게 만든다는 것에 유의하세요. 어떤 부작용도 없이, 제곱수의 리스트를 이런 식으로 계산할 수 있습니다:

@example
squares = list(map(lambda x: x**2, range(10)))
@end example

또는, 이렇게 할 수도 있습니다:

@example
squares = [x**2 for x in range(10)]
@end example

이것이 더 간결하고 읽기 쉽습니다.

리스트 컴프리헨션은 표현식과 그 뒤를 따르는 @code{for} 절과 없거나 여러 개의 @code{for} 나 @code{if} 절들을 감싸는 대괄호로 구성됩니다. 그 결과는 새 리스트인데, @code{for} 와 @code{if} 절의 문맥에서 표현식의 값을 구해서 만들어집니다. 예를 들어, 이 리스트 컴프리헨션은 두 리스트의 요소들을 서로 같지 않은 것끼리 결합합니다:

@example
>>> [(x, y) for x in [1,2,3] for y in [3,1,4] if x != y]
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
@end example

그리고, 이것은 다음과 동등합니다:

@example
>>> combs = []
>>> for x in [1,2,3]:
...     for y in [3,1,4]:
...         if x != y:
...             combs.append((x, y))
...
>>> combs
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
@end example

두 코드 조각에서 @ref{34a,,for} 와 @ref{181,,if} 문의 순서가 같음에 유의하세요.

표현식이 튜플이면 (즉 앞의 예에서 @code{(x, y)}), 반드시 괄호로 둘러싸야 합니다.

@example
>>> vec = [-4, -2, 0, 2, 4]
>>> # 값을 두배로 하여 새 리스트를 만듭니다
>>> [x*2 for x in vec]
[-8, -4, 0, 4, 8]
>>> # 음수를 제외하도록 리스트를 필터링합니다
>>> [x for x in vec if x >= 0]
[0, 2, 4]
>>> # 모든 요소에 함수를 적용합니다
>>> [abs(x) for x in vec]
[4, 2, 0, 2, 4]
>>> # 각 요소에 메서드를 호출합니다
>>> freshfruit = ['  banana', '  loganberry ', 'passion fruit  ']
>>> [weapon.strip() for weapon in freshfruit]
['banana', 'loganberry', 'passion fruit']
>>> # (숫자, 제곱) 과 같은 2-튜플의 리스트를 만듭니다
>>> [(x, x**2) for x in range(6)]
[(0, 0), (1, 1), (2, 4), (3, 9), (4, 16), (5, 25)]
>>> # 튜플은 괄호로 묶어야합니다, 그렇지 않으면 에러가 발생합니다
>>> [x, x**2 for x in range(6)]
  File "<stdin>", line 1
    [x, x**2 for x in range(6)]
     ^^^^^^^
SyntaxError: did you forget parentheses around the comprehension target?
>>> # 두 개의 'for' 를 갖는 리스트 컴프리헨션으로 리스트를 평평하게 만듭니다
>>> vec = [[1,2,3], [4,5,6], [7,8,9]]
>>> [num for elem in vec for num in elem]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
@end example

리스트 컴프리헨션은 복잡한 표현식과 중첩된 함수들을 포함할 수 있습니다:

@example
>>> from math import pi
>>> [str(round(pi, i)) for i in range(1, 6)]
['3.1', '3.14', '3.142', '3.1416', '3.14159']
@end example

@node 중첩된 리스트 컴프리헨션,,리스트 컴프리헨션,리스트 더 보기
@anchor{tutorial/datastructures nested-list-comprehensions}@anchor{2028}
@subsubsection 중첩된 리스트 컴프리헨션


리스트 컴프리헨션의 첫 표현식으로 임의의 표현식이 올 수 있는데, 다른 리스트 컴프리헨션도 가능합니다.

다음과 같은 길이가 4인 리스트 3개의 리스트로 구현된 3x4 행렬의 예를 봅시다:

@example
>>> matrix = [
...     [1, 2, 3, 4],
...     [5, 6, 7, 8],
...     [9, 10, 11, 12],
... ]
@end example

다음 리스트 컴프리헨션은 행과 열을 전치 시킵니다:

@example
>>> [[row[i] for row in matrix] for i in range(4)]
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
@end example

앞절에서 보았듯이, 내부 리스트 컴프리헨션은 뒤따르는 @ref{34a,,for} 의 문맥에서 값이 구해집니다. 그래서 이 예는 다음과 동등합니다:

@example
>>> transposed = []
>>> for i in range(4):
...     transposed.append([row[i] for row in matrix])
...
>>> transposed
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
@end example

이것은 다시 다음과 같습니다:

@example
>>> transposed = []
>>> for i in range(4):
...     # 다음 3줄은 중첩된 리스트 컴프리헨션을 구현합니다
...     transposed_row = []
...     for row in matrix:
...         transposed_row.append(row[i])
...     transposed.append(transposed_row)
...
>>> transposed
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
@end example

실제 세상에서는, 복잡한 흐름문보다 내장 함수들을 선호해야 합니다. 이 경우에는 @ref{1a0,,zip()} 함수가 제 역할을 할 수 있습니다:

@example
>>> list(zip(*matrix))
[(1, 5, 9), (2, 6, 10), (3, 7, 11), (4, 8, 12)]
@end example

이 줄에 나오는 애스터리스크에 대한 자세한 내용은 @ref{200f,,인자 목록 언 패킹} 을 보세요.

@node del 문,튜플과 시퀀스,리스트 더 보기,자료 구조
@anchor{tutorial/datastructures the-del-statement}@anchor{2029}@anchor{tutorial/datastructures tut-del}@anchor{202a}
@subsection @code{del} 문


There is a way to remove an item from a list given its index instead of its
value: the @ref{1b1d,,del} statement.  This differs from the @ref{2023,,pop()} method
which returns a value.  The @code{del} statement can also be used to remove
slices from a list or clear the entire list (which we did earlier by assignment
of an empty list to the slice).  For example:

@example
>>> a = [-1, 1, 66.25, 333, 333, 1234.5]
>>> del a[0]
>>> a
[1, 66.25, 333, 333, 1234.5]
>>> del a[2:4]
>>> a
[1, 66.25, 1234.5]
>>> del a[:]
>>> a
[]
@end example

@ref{1b1d,,del} 는 변 자체를 삭제하는데에도 사용될 수 있습니다:

@example
>>> del a
@end example

이후에 이름 @code{a} 를 참조하는 것은 에러입니다 (적어도 다른 값이 새로 대입되기 전까지). 뒤에서 @ref{1b1d,,del} 의 다른 용도를 보게 됩니다.

@node 튜플과 시퀀스,집합,del 문,자료 구조
@anchor{tutorial/datastructures tuples-and-sequences}@anchor{202b}@anchor{tutorial/datastructures tut-tuples}@anchor{2006}
@subsection 튜플과 시퀀스


리스트와 문자열이 인덱싱과 슬라이싱 연산과 같은 많은 성질을 공유함을 보았습니다. 이것들은 `시퀀스' 자료 형의 두 가지 예입니다 (@ref{202c,,시퀀스 형 — list@comma{} tuple@comma{} range} 를 보세요). 파이썬은 진화하는 언어이기 때문에, 다른 시퀀스 자료형이 추가될 수도 있습니다. 다른 표준 시퀀스 자료 형이 있습니다: `튜플' 입니다.

튜플은 쉼표로 구분되는 여러 값으로 구성됩니다. 예를 들어:

@example
>>> t = 12345, 54321, 'hello!'
>>> t[0]
12345
>>> t
(12345, 54321, 'hello!')
>>> # 튜플은 중첩될 수 있습니다:
>>> u = t, (1, 2, 3, 4, 5)
>>> u
((12345, 54321, 'hello!'), (1, 2, 3, 4, 5))
>>> # 튜플은 불변입니다:
>>> t[0] = 88888
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
>>> # 하지만 가변 객체를 포함할 수 있습니다:
>>> v = ([1, 2, 3], [3, 2, 1])
>>> v
([1, 2, 3], [3, 2, 1])
@end example

여러분이 보듯이, 출력되는 튜플은 항상 괄호로 둘러싸입니다, 그래서 중첩된 튜플이 올바르게 해석됩니다; 종종 괄호가 필요하기는 하지만 (튜플이 더 큰 표현식의 일부일 때), 둘러싼 괄호와 함께 또는 없이 입력될 수 있습니다. 튜플의 개별 항목에 대입하는 것은 가능하지 않지만, 리스트 같은 가변 객체를 포함하는 튜플을 만들 수는 있습니다.

튜플이 리스트처럼 보인다 하더라도, 이것들은 다른 상황에서 다른 목적으로 사용됩니다. 튜플은 @ref{1fdc,,불변} 이고, 보통 이질적인 요소들의 시퀀스를 포함합니다. 요소들은 언 패킹 (이 섹션의 뒤에 나온다) 이나 인덱싱 (또는 @ref{4e0,,네임드 튜플} 의 경우는 어트리뷰트로도) 으로 액세스합니다. 리스트는 @ref{1fe1,,가변} 이고, 요소들은 보통 등질 적이고 리스트에 대한 이터레이션으로 액세스 됩니다.

특별한 문제는 비었거나 하나의 항목을 갖는 튜플을 만드는 것입니다: 이 경우를 수용하기 위해 문법은 추가적인 예외 사항을 갖고 있습니다. 빈 튜플은 빈 괄호 쌍으로 만들어집니다; 하나의 항목으로 구성된 튜플은 값 뒤에 쉼표를 붙여서 만듭니다 (값 하나를 괄호로 둘러싸기만 하는 것으로는 충분하지 않습니다). 추합니다, 하지만 효과적입니다. 예를 들어:

@example
>>> empty = ()
>>> singleton = 'hello',    # <-- 마지막 쉼표에 주의하세요
>>> len(empty)
0
>>> len(singleton)
1
>>> singleton
('hello',)
@end example

문장 @code{t = 12345, 54321, 'hello!'} 는 `튜플 패킹' 의 예입니다: 값 @code{12345}, @code{54321}, @code{'hello!'} 는 함께 튜플로 패킹 됩니다. 반대 연산 또한 가능합니다:

@example
>>> x, y, z = t
@end example

이것은, 충분히 적절하게도, `시퀀스 언 패킹' 이라고 불리고 오른쪽에 어떤 시퀀스가 와도 됩니다. 시퀀스 언 패킹은 등호의 좌변에 시퀀스에 있는 요소들과 같은 개수의 변수들이 올 것을 요구합니다. 다중 대입은 사실 튜플 패킹과 시퀀스 언 패킹의 조합일뿐이라는 것에 유의하세요.

@node 집합,딕셔너리,튜플과 시퀀스,자료 구조
@anchor{tutorial/datastructures sets}@anchor{202d}@anchor{tutorial/datastructures tut-sets}@anchor{202e}
@subsection 집합


Python also includes a data type for @ref{202f,,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.

집합을 만들 때는 중괄호나 @ref{184,,set()} 함수를 사용할 수 있습니다. 주의사항: 빈 집합을 만들려면 @code{set()} 을 사용해야 합니다. @code{@{@}} 가 아닙니다; 후자는 빈 딕셔너리를 만드는데, 다음 섹션에서 다룹니다.

Because sets are unordered, iterating over them or printing them can
produce the elements in a different order than you expect.

여기 간략한 실연이 있습니다:

@example
>>> basket = @{'apple', 'orange', 'apple', 'pear', 'orange', 'banana'@}
>>> print(basket)                      # 중복이 제거되었음을 보여줍니다
@{'orange', 'banana', 'pear', 'apple'@}
>>> 'orange' in basket                 # 빠른 멤버십 검사
True
>>> 'crabgrass' in basket
False

>>> # 두 단어의 고유한 글자들로 집합 연산 시연
>>>
>>> a = set('abracadabra')
>>> b = set('alacazam')
>>> a                                  # a 의 고유한 글자들
@{'a', 'r', 'b', 'c', 'd'@}
>>> a - b                              # a 에 있으나 b 에 없는 글자들
@{'r', 'd', 'b'@}
>>> a | b                              # a 나 b, 혹은 양쪽 모두에 있는 글자들
@{'a', 'c', 'r', 'd', 'b', 'm', 'z', 'l'@}
>>> a & b                              # a 와 b 모두에 있는 글자들
@{'a', 'c'@}
>>> a ^ b                              # a 나 b 에 있지만 양쪽 모두에 있지는 않은 글자들
@{'r', 'd', 'b', 'm', 'z', 'l'@}
@end example

@ref{2027,,리스트 컴프리헨션} 과 유사하게, 집합 컴프리헨션도 지원됩니다:

@example
>>> a = @{x for x in 'abracadabra' if x not in 'abc'@}
>>> a
@{'r', 'd'@}
@end example

@node 딕셔너리,루프 테크닉,집합,자료 구조
@anchor{tutorial/datastructures dictionaries}@anchor{2030}@anchor{tutorial/datastructures tut-dictionaries}@anchor{2031}
@subsection 딕셔너리


Another useful data type built into Python is the `dictionary' (see
@ref{cbc,,매핑 형 — dict}). Dictionaries are sometimes found in other languages as
“associative memories” or “associative arrays”.  Unlike sequences, which are
indexed by a range of numbers, dictionaries are indexed by `keys', which can be
any immutable type; strings and numbers can always be keys.  Tuples can be used
as keys if they contain only strings, numbers, or tuples; if a tuple contains
any mutable object either directly or indirectly, it cannot be used as a key.
You can’t use lists as keys, since lists can be modified in place using index
assignments, slice assignments, or methods like @ref{8db,,append()} and
@ref{600,,extend()}.

딕셔너리를 (한 딕셔너리 안에서) 키가 중복되지 않는다는 제약 조건을 가진 `키: 값' 쌍의 집합으로 생각하는 것이 최선입니다. 중괄호 쌍은 빈 딕셔너리를 만듭니다: @code{@{@}}. 중괄호 안에 쉼표로 분리된 키:값 쌍들의 목록을 넣으면, 딕셔너리에 초기 키:값 쌍들을 제공합니다; 이것이 딕셔너리가 출력되는 방식이기도 합니다.

The main operations on a dictionary are storing a value with some key and
extracting the value given the key.  It is also possible to delete a key:value
pair with @code{del}. If you store using a key that is already in use, the old
value associated with that key is forgotten.

Extracting a value for a non-existent key by subscripting (@code{d[key]}) raises a
@ref{5e5,,KeyError}. To avoid getting this error when trying to access a possibly
non-existent key, use the @ref{2032,,get()} method instead, which returns
@code{None} (or a specified default value) if the key is not in the dictionary.

딕셔러리에 @code{list(d)} 를 수행하면 딕셔너리에서 사용되고 있는 모든 키의 리스트를 삽입 순서대로 돌려줍니다 (정렬을 원하면 대신 @code{sorted(d)} 를 사용하면 됩니다). 하나의 키가 딕셔너리에 있는지 검사하려면, @ref{34b,,in} 키워드들 사용하세요.

여기에 딕셔너리를 사용하는 조그마한 예가 있습니다:

@example
>>> tel = @{'jack': 4098, 'sape': 4139@}
>>> tel['guido'] = 4127
>>> tel
@{'jack': 4098, 'sape': 4139, 'guido': 4127@}
>>> tel['jack']
4098
>>> tel['irv']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'irv'
>>> print(tel.get('irv'))
None
>>> del tel['sape']
>>> tel['irv'] = 4127
>>> tel
@{'jack': 4098, 'guido': 4127, 'irv': 4127@}
>>> list(tel)
['jack', 'guido', 'irv']
>>> sorted(tel)
['guido', 'irv', 'jack']
>>> 'guido' in tel
True
>>> 'jack' not in tel
False
@end example

@ref{183,,dict()} 생성자는 키-값 쌍들의 시퀀스로 부터 직접 딕셔너리를 구성합니다.

@example
>>> dict([('sape', 4139), ('guido', 4127), ('jack', 4098)])
@{'sape': 4139, 'guido': 4127, 'jack': 4098@}
@end example

이에 더해, 딕셔너리 컴프리헨션은 임의의 키와 값 표현식들로 부터 딕셔너리를 만드는데 사용될 수 있습니다:

@example
>>> @{x: x**2 for x in (2, 4, 6)@}
@{2: 4, 4: 16, 6: 36@}
@end example

키가 간단한 문자열일 때, 때로 키워드 인자들을 사용해서 쌍을 지정하기가 쉽습니다:

@example
>>> dict(sape=4139, guido=4127, jack=4098)
@{'sape': 4139, 'guido': 4127, 'jack': 4098@}
@end example

@node 루프 테크닉,조건 더 보기,딕셔너리,자료 구조
@anchor{tutorial/datastructures looping-techniques}@anchor{2033}@anchor{tutorial/datastructures tut-loopidioms}@anchor{1ff0}
@subsection 루프 테크닉


딕셔너리로 루핑할 때, @ref{9d2,,items()} 메서드를 사용하면 키와 거기에 대응하는 값을 동시에 얻을 수 있습니다.

@example
>>> knights = @{'gallahad': 'the pure', 'robin': 'the brave'@}
>>> for k, v in knights.items():
...     print(k, v)
...
gallahad the pure
robin the brave
@end example

시퀀스를 루핑할 때, @ref{1686,,enumerate()} 함수를 사용하면 위치 인덱스와 대응하는 값을 동시에 얻을 수 있습니다.

@example
>>> for i, v in enumerate(['tic', 'tac', 'toe']):
...     print(i, v)
...
0 tic
1 tac
2 toe
@end example

둘이나 그 이상의 시퀀스를 동시에 루핑하려면, @ref{1a0,,zip()} 함수로 엔트리들의 쌍을 만들 수 있습니다.

@example
>>> questions = ['name', 'quest', 'favorite color']
>>> answers = ['lancelot', 'the holy grail', 'blue']
>>> for q, a in zip(questions, answers):
...     print('What is your @{0@}?  It is @{1@}.'.format(q, a))
...
What is your name?  It is lancelot.
What is your quest?  It is the holy grail.
What is your favorite color?  It is blue.
@end example

시퀀스를 거꾸로 루핑하려면, 먼저 정방향으로 시퀀스를 지정한 다음에 @ref{a65,,reversed()} 함수를 호출하세요.

@example
>>> for i in reversed(range(1, 10, 2)):
...     print(i)
...
9
7
5
3
1
@end example

정렬된 순서로 시퀀스를 루핑하려면, @ref{dc6,,sorted()} 함수를 사용해서 소스를 변경하지 않고도 정렬된 새 리스트를 받을 수 있습니다.

@example
>>> basket = ['apple', 'orange', 'apple', 'pear', 'orange', 'banana']
>>> for i in sorted(basket):
...     print(i)
...
apple
apple
banana
orange
orange
pear
@end example

시퀀스에 대해 @ref{184,,set()}을 사용하면 중복 요소를 제거합니다. 시퀀스에 대해 @code{set()}과 @ref{dc6,,sorted()}를 함께 사용하는 것은 시퀀스의 고유 한 요소를 정렬된 순서로 루핑하는 관용적 방법입니다.

@example
>>> basket = ['apple', 'orange', 'apple', 'pear', 'orange', 'banana']
>>> for f in sorted(set(basket)):
...     print(f)
...
apple
banana
orange
pear
@end example

때로 루프를 돌고 있는 리스트를 변경하고픈 유혹을 느낍니다; 하지만, 종종, 대신 새 리스트를 만드는 것이 더 간단하고 더 안전합니다.

@example
>>> import math
>>> raw_data = [56.2, float('NaN'), 51.7, 55.3, 52.5, float('NaN'), 47.8]
>>> filtered_data = []
>>> for value in raw_data:
...     if not math.isnan(value):
...         filtered_data.append(value)
...
>>> filtered_data
[56.2, 51.7, 55.3, 52.5, 47.8]
@end example

@node 조건 더 보기,시퀀스와 다른 형들을 비교하기,루프 테크닉,자료 구조
@anchor{tutorial/datastructures more-on-conditions}@anchor{2034}@anchor{tutorial/datastructures tut-conditions}@anchor{2035}
@subsection 조건 더 보기


@code{while} 과 @code{if} 문에서 사용되는 조건에는 비교뿐만 아니라 모든 연산자를 사용할 수 있습니다.

비교 연산자 @code{in} 과 @code{not in} 은 값이 컨테이너에 있는지 (없는지) 확인하는 멤버십 검사입니다. 연산자 @code{is} 와 @code{is not} 은 두 객체가 진짜로 같은 객체인지 비교합니다. 모든 비교 연산자들은 같은 우선순위를 갖는데, 모든 산술 연산자들보다 낮습니다.

비교는 연쇄할 수 있습니다. 예를 들어, @code{a < b == c} 는, @code{a} 가 @code{b} 보다 작고, 동시에 @code{b} 가 @code{c} 와 같은지 검사합니다.

비교는 논리 연산자 @code{and} 와 @code{or} 를 사용해서 결합할 수 있고, 비교의 결과는 (또는 그 밖의 모든 논리 표현식은) @code{not} 으로 부정될 수 있습니다. 이것들은 비교 연산자보다 낮은 우선순위를 갖습니다. 이것 간에는 @code{not} 이 가장 높은 우선순위를 갖고, @code{or} 가 가장 낮습니다. 그래서 @code{A and not B or C} 는 @code{(A and (not B)) or C} 와 동등합니다. 여느 때처럼, 원하는 조합을 표현하기 위해 괄호를 사용할 수 있습니다.

논리 연산자 @code{and} 와 @code{or} 는 소위 `단락-회로(short-circuit)' 연산자입니다: 인자들은 왼쪽에서 오른쪽으로 값이 구해지고, 결과가 결정되자마자 값 구하기는 중단됩니다. 예를 들어, @code{A} 와 @code{C} 가 참이고 @code{B} 가 거짓이면, @code{A and B and C} 는 표현식 @code{C} 의 값을 구하지 않습니다. 논리값이 아닌 일반 값으로 사용될 때, 단락-회로 연산자의 반환 값은 마지막으로 값이 구해진 인자입니다.

비교의 결과나 다른 논리 표현식의 결과를 변수에 대입할 수 있습니다. 예를 들어,

@example
>>> string1, string2, string3 = '@w{'}, 'Trondheim', 'Hammer Dance'
>>> non_null = string1 or string2 or string3
>>> non_null
'Trondheim'
@end example

파이썬에서, C와는 달리, 표현식 안에서의 대입은 @ref{2036,,바다코끼리 연산자} @code{:=}를 사용하여 명시적으로 수행해야 합니다. C 프로그램에서 흔히 마주치는 부류의 문제들을 회피하도록 합니다: @code{==} 를 사용할 표현식에 @code{=} 를 입력하는 실수.

@node 시퀀스와 다른 형들을 비교하기,,조건 더 보기,자료 구조
@anchor{tutorial/datastructures comparing-sequences-and-other-types}@anchor{2037}@anchor{tutorial/datastructures tut-comparing}@anchor{2038}
@subsection 시퀀스와 다른 형들을 비교하기


시퀀스 객체들은 보통 같은 시퀀스 형의 다른 객체들과 비교될 수 있습니다. 비교는 `사전식' 순서를 사용합니다: 먼저 첫 두 항목을 비교해서 다르면 이것이 비교의 결과를 결정합니다; 같으면, 다음 두 항목을 비교하고, 이런 식으로 어느 한 시퀀스가 소진될 때까지 계속합니다. 만약 비교되는 두 항목 자체가 같은 형의 시퀀스면, 사전식 비교가 재귀적으로 수행됩니다. 두 시퀀스의 모든 항목이 같다고 비교되면, 시퀀스들은 같은 것으로 취급됩니다. 한 시퀀스가 다른 하나의 머리 부분 서브 시퀀스면, 짧은 시퀀스가 작은 것입니다. 문자열의 사전식 배열은 개별 문자들의 순서를 정하는데 유니코드 코드 포인트 숫자를 사용합니다. 같은 형의 시퀀스들 간의 비교의 몇 가지 예는 이렇습니다:

@example
(1, 2, 3)              < (1, 2, 4)
[1, 2, 3]              < [1, 2, 4]
'ABC' < 'C' < 'Pascal' < 'Python'
(1, 2, 3, 4)           < (1, 2, 4)
(1, 2)                 < (1, 2, -1)
(1, 2, 3)             == (1.0, 2.0, 3.0)
(1, 2, ('aa', 'ab'))   < (1, 2, ('abc', 'a'), 4)
@end example

서로 다른 형의 객체들을 @code{<} 나 @code{>} 로 비교하는 것은, 그 객체들이 적절한 비교 메서드들을 갖고 있을 때만 허락된다는 것에 유의하세요. 예를 들어, 서로 다른 숫자 형들은 그들의 숫자 값에 따라 비교됩니다. 그래서 0은 0.0과 같고, 등등. 그렇지 않으면, 임의의 순서를 제공하는 대신, 인터프리터는 @ref{198,,TypeError} 를 일으킵니다.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 모듈,입력과 출력,자료 구조,파이썬 자습서
@anchor{tutorial/modules doc}@anchor{2039}@anchor{tutorial/modules modules}@anchor{203a}@anchor{tutorial/modules translation-repo}@anchor{203b}@anchor{tutorial/modules tut-modules}@anchor{203c}
@section 모듈


파이썬 인터프리터를 종료한 후에 다시 들어가면, 여러분이 만들었던 정의들이 사라집니다 (함수나 변수들). 그래서, 좀 긴 프로그램을 쓰고자 한다면, 대신 인터프리터 입력을 편집기를 사용해서 준비한 후에 그 파일을 입력으로 사용해서 실행하는 것이 좋습니다. 이렇게 하는 것을 `스크립트' 를 만든다고 합니다. 프로그램이 길어짐에 따라, 유지를 쉽게 하려고 여러 개의 파일로 나누고 싶을 수 있습니다. 여러 프로그램에서 썼던 편리한 함수를 각 프로그램에 정의를 복사하지 않고도 사용하고 싶을 수도 있습니다.

이런 것을 지원하기 위해, 파이썬은 정의들을 파일에 넣고 스크립트나 인터프리터의 대화형 모드에서 사용할 수 있는 방법을 제공합니다. 그런 파일을 `모듈' 이라고 부릅니다; 모듈로부터 정의들이 다른 모듈이나 `메인' 모듈로 `임포트' 될 수 있습니다 (메인 모듈은 최상위 수준에서 실행되는 스크립트나 계산기 모드에서 액세스하는 변수들의 컬렉션입니다).

모듈은 파이썬 정의와 문장들을 담고 있는 파일입니다. 파일의 이름은 모듈 이름에 확장자 @code{.py} 를 붙입니다. 모듈 내에서, 모듈의 이름은 전역 변수 @code{__name__} 으로 제공됩니다. 예를 들어, 여러분이 좋아하는 편집기로 @code{fibo.py} 라는 이름의 파일을 현재 디렉터리에 만들고 다음과 같은 내용으로 채웁니다:

@example
# Fibonacci numbers module

def fib(n):
    """Write Fibonacci series up to n."""
    a, b = 0, 1
    while a < n:
        print(a, end=' ')
        a, b = b, a+b
    print()

def fib2(n):
    """Return Fibonacci series up to n."""
    result = []
    a, b = 0, 1
    while a < n:
        result.append(a)
        a, b = b, a+b
    return result
@end example

이제 파이썬 인터프리터에 들어가서 이 모듈을 다음과 같은 명령으로 임포트 합니다:

@example
>>> import fibo
@end example

이렇게 한다고 @code{fibo} 에 정의된 함수들의 이름을 현재 @ref{203d,,이름 공간}에 직접 추가하지는 않습니다 (자세한 내용은 @ref{203e,,파이썬 스코프와 이름 공간}를 참조하세요); 오직 모듈 이름 @code{fibo} 만 추가할 뿐입니다. 이 모듈 이름을 사용해서 함수들을 액세스할 수 있습니다:

@example
>>> fibo.fib(1000)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
>>> fibo.fib2(100)
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
>>> fibo.__name__
'fibo'
@end example

함수를 자주 사용할 거라면 지역 이름으로 대입할 수 있습니다:

@example
>>> fib = fibo.fib
>>> fib(500)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377
@end example

@menu
* 모듈 더 보기:: 
* 표준 모듈들:: 
* dir() 함수: dir 함수. 
* 패키지:: 

@end menu

@node 모듈 더 보기,표준 모듈들,,모듈
@anchor{tutorial/modules more-on-modules}@anchor{203f}@anchor{tutorial/modules tut-moremodules}@anchor{2040}
@subsection 모듈 더 보기


모듈은 함수 정의뿐만 아니라 실행 가능한 문장들도 포함할 수 있습니다. 이 문장들은 모듈을 초기화하는 데 사용됩니다. 이것들은 임포트 문에서 모듈 이름이 `처음' 등장할 때만 실행됩니다. @footnote{
사실 함수 정의도 ‘실행’ 되는 ‘문장’ 입니다; 모듈 수준의 함수 정의를 실행하면 함수의 이름을 전역 이름 공간에 추가합니다.
} (이것들은 파일이 스크립트로 실행될 때도 실행됩니다.)

각 모듈은 자신만의 이름 공간을 갖고 있는데, 그 모듈에서 정의된 함수들의 전역 이름 공간으로 사용됩니다. 그래서, 모듈의 저자는 사용자의 전역 변수와 우연히 충돌할 것을 걱정하지 않고 전역 변수를 사용할 수 있습니다. 반면에, 여러분이 무얼 하는지 안다면, 모듈의 함수를 참조하는데 사용된 것과 같은 표기법으로 모듈의 전역 변수들을 건드릴 수 있습니다, @code{modname.itemname}.

모듈은 다른 모듈들을 임포트할 수 있습니다. 모든 @ref{7f7,,import} 문들을 모듈의 처음에 놓는 것이 관례지만 반드시 그래야 하는 것은 아닙니다 (그 점에 관한 한 스크립트도 마찬가집니다). 임포트되는 모듈 이름은, 모듈의 최상위 수준(함수나 클래스의 바깥)에 배치되면, 임포트하는 모듈의 전역 이름 공간에 추가됩니다.

모듈에 들어있는 이름들을 직접 임포트하는 모듈의 이름 공간으로 임포트하는 @ref{7f7,,import} 문의 변종이 있습니다. 예를 들어:

@example
>>> from fibo import fib, fib2
>>> fib(500)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377
@end example

이것은 지역 이름 공간에 임포트되는 모듈의 이름을 만들지 않습니다 (그래서 이 예에서는, @code{fibo} 가 정의되지 않습니다).

모듈이 정의하는 모든 이름을 임포트하는 변종도 있습니다:

@example
>>> from fibo import *
>>> fib(500)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377
@end example

이것은 밑줄 (@code{_}) 로 시작하는 것들을 제외한 모든 이름을 임포트 합니다. 대부분 파이썬 프로그래머들은 이 기능을 사용하지 않는데, 인터프리터로 알려지지 않은 이름들의 집합을 도입하게 되어, 여러분이 이미 정의한 것들을 가리게 될 수 있기 때문입니다.

일반적으로 모듈이나 패키지에서 @code{*} 를 임포트하는 것은 눈살을 찌푸리게 한다는 것에 유의하세요, 종종 읽기에 편하지 않은 코드를 만들기 때문입니다. 하지만, 대화형 세션에서 입력을 줄이고자 사용하는 것은 상관없습니다.

모듈 이름 다음에 @code{as} 가 올 경우, @code{as} 다음의 이름을 임포트한 모듈에 직접 연결합니다.

@example
>>> import fibo as fib
>>> fib.fib(500)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377
@end example

이것은 @code{import fibo} 가하는 것과 같은 방식으로 모듈을 임포트 하는데, 유일한 차이점은 그 모듈을 @code{fib} 라는 이름으로 사용할 수 있다는 것입니다.

@ref{14b0,,from}을 써서 비슷한 효과를 낼 때도 사용할 수 있습니다:

@example
>>> from fibo import fib as fibonacci
>>> fibonacci(500)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377
@end example

@cartouche
@quotation 참고 
효율성의 이유로, 각 모듈은 인터프리터 세션마다 한 번만 임포트됩니다. 그래서, 여러분이 모듈을 수정하면, 인터프리터를 다시 시작시켜야 합니다 — 또는, 대화형으로 시험하는 모듈이 하나뿐이라면, @ref{73c,,importlib.reload()} 를 사용하세요. 예를 들어, @code{import importlib; importlib.reload(modulename)}.
@end quotation
@end cartouche

@menu
* 모듈을 스크립트로 실행하기:: 
* 모듈 검색 경로:: 
* “컴파일된” 파이썬 파일:: 

@end menu

@node 모듈을 스크립트로 실행하기,모듈 검색 경로,,모듈 더 보기
@anchor{tutorial/modules executing-modules-as-scripts}@anchor{2041}@anchor{tutorial/modules tut-modulesasscripts}@anchor{2042}
@subsubsection 모듈을 스크립트로 실행하기


여러분이 파이썬 모듈을 이렇게 실행하면

@example
python fibo.py <arguments>
@end example

모듈에 있는 코드는, 그것을 임포트할 때처럼 실행됩니다. 하지만 @code{__name__} 은 @code{"__main__"} 로 설정됩니다. 이것은, 이 코드를 모듈의 끝에 붙여서:

@example
if __name__ == "__main__":
    import sys
    fib(int(sys.argv[1]))
@end example

파일을 임포트할 수 있는 모듈뿐만 아니라 스크립트로도 사용할 수 있도록 만들 수 있음을 의미하는데, 오직 모듈이 “메인” 파일로 실행될 때만 명령행을 파싱하는 코드가 실행되기 때문입니다:

@example
$ python fibo.py 50
0 1 1 2 3 5 8 13 21 34
@end example

모듈이 임포트될 때, 코드는 실행되지 않습니다:

@example
>>> import fibo
>>>
@end example

이것은 종종 모듈에 대한 편리한 사용자 인터페이스를 제공하거나 테스트 목적으로 사용됩니다 (모듈을 스크립트로 실행하면 테스트 스위트를 실행하기).

@node 모듈 검색 경로,“컴파일된” 파이썬 파일,모듈을 스크립트로 실행하기,모듈 더 보기
@anchor{tutorial/modules the-module-search-path}@anchor{2043}@anchor{tutorial/modules tut-searchpath}@anchor{2044}
@subsubsection 모듈 검색 경로


@geindex 모듈;검색;경로

@code{spam} 이라는 이름의 모듈이 임포트될 때, 인터프리터는 먼저 그 이름의 내장 모듈을 찾습니다. 이 모듈 이름들은 @ref{2045,,sys.builtin_module_names}에 나열됩니다. 발견되지 않으면, 변수 @ref{3e4,,sys.path} 로 주어지는 디렉터리들에서 @code{spam.py} 라는 이름의 파일을 찾습니다. @code{sys.path} 는 이 위치들로 초기화됩니다:


@itemize *

@item 
입력 스크립트를 포함하는 디렉터리 (또는 파일이 지정되지 않았을 때는 현재 디렉터리).

@item 
@geindex PYTHONPATH
@geindex 환경 변수; PYTHONPATH
@ref{121c,,PYTHONPATH} (디렉터리 이름들의 목록, 셸 변수 
@geindex PATH
@geindex 환경 변수; PATH
@code{PATH} 와 같은 문법).

@item 
설치 의존적인 기본값 (관례에 따라 @code{site-packages} 디렉터리를 포함합니다, @ref{cc,,site} 모듈이 처리합니다).
@end itemize

자세한 내용은 @ref{18dd,,The initialization of the sys.path module search path}에서 확인할 수 있습니다.

@cartouche
@quotation 참고 
심볼릭 링크를 지원하는 파일 시스템에서, 입력 스크립트를 포함하는 디렉터리는 심볼릭 링크를 변환한 후에 계산됩니다. 다른 말로, 심볼릭 링크를 포함하는 디렉터리는 모듈 검색 경로에 포함되지 `않습니다'.
@end quotation
@end cartouche

초기화 후에, 파이썬 프로그램은 @ref{3e4,,sys.path} 를 수정할 수 있습니다. 스크립트를 포함하는 디렉터리는 검색 경로의 처음에, 표준 라이브러리 경로의 앞에 놓입니다. 이것은 같은 이름일 경우 라이브러리 디렉터리에 있는 것 대신 스크립트를 포함하는 디렉터리의 것이 로드된다는 뜻입니다. 이 치환이 의도된 것이 아니라면 에러입니다. 더 자세한 정보는 @ref{2046,,표준 모듈들} 을 보세요.

@c %
@c Do we need stuff on zip files etc. ? DUBOIS

@node “컴파일된” 파이썬 파일,,모듈 검색 경로,모듈 더 보기
@anchor{tutorial/modules compiled-python-files}@anchor{2047}@anchor{tutorial/modules tut-pycache}@anchor{8ea}
@subsubsection “컴파일된” 파이썬 파일


모듈 로딩을 빠르게 하려고, 파이썬은 @code{__pycache__} 디렉터리에 각 모듈의 컴파일된 버전을 @code{module.`version'.pyc} 라는 이름으로 캐싱합니다. version 은 컴파일된 파일의 형식을 지정합니다; 일반적으로 파이썬의 버전 번호를 포함합니다. 예를 들어, CPython 배포 3.3 에서 spam.py 의 컴파일된 버전은 @code{__pycache__/spam.cpython-33.pyc} 로 캐싱 됩니다. 이 명명법은 서로 다른 파이썬 배포와 버전의 컴파일된 모듈들이 공존할 수 있도록 합니다.

파이썬은 소스의 수정 시간을 컴파일된 버전과 비교해서 시효가 지나 다시 컴파일해야 하는지 검사합니다. 이것은 완전히 자동화된 과정입니다. 또한, 컴파일된 모듈은 플랫폼 독립적이기 때문에, 같은 라이브러리를 서로 다른 아키텍처를 갖는 시스템들에서 공유할 수 있습니다.

파이썬은 두 가지 상황에서 캐시를 검사하지 않습니다. 첫째로, 명령행에서 직접 로드되는 모듈들은 항상 재컴파일하고 그 결과를 저장하지 않습니다. 둘째로, 소스 모듈이 없으면 캐시를 검사하지 않습니다. 소스 없는 (컴파일된 파일만 있는) 배포를 지원하려면, 컴파일된 모듈이 소스 디렉터리에 있어야 하고, 소스 모듈이 없어야 합니다.

전문가를 위한 몇 가지 팁


@itemize *

@item 
컴파일된 모듈의 크기를 줄이려면 파이썬 명령에 @ref{18c,,-O} 나 @ref{fb4,,-OO} 스위치를 사용할 수 있습니다. @code{-O} 스위치는 assert 문을 제거하고, @code{-OO} 스위치는 assert 문과 __doc__ 문자열을 모두 제거합니다. 어떤 프로그램들은 이것들에 의존하기 때문에, 무엇을 하고 있는지 아는 경우만 이 옵션을 사용해야 합니다. “최적화된” 모듈은 @code{opt-} 태그를 갖고, 보통 더 작습니다. 미래의 배포에서는 최적화의 효과가 변경될 수 있습니다.

@item 
@code{.py} 파일에서 읽을 때보다 @code{.pyc} 파일에서 읽을 때 프로그램이 더 빨리 실행되지는 않습니다; @code{.pyc} 파일에서 더 빨라지는 것은 로드되는 속도뿐입니다.

@item 
모듈 @ref{21,,compileall} 은 디렉터리에 있는 모든 모듈의 .pyc 파일들을 만들 수 있습니다.

@item 
이 절차에 대한 더 자세한 정보, 결정들의 순서도를 포함합니다, 는 
@geindex Python 향상 제안; PEP 3147
PEP 3147@footnote{https://peps.python.org/pep-3147/} 에 나옵니다.
@end itemize

@node 표준 모듈들,dir 함수,모듈 더 보기,모듈
@anchor{tutorial/modules standard-modules}@anchor{2048}@anchor{tutorial/modules tut-standardmodules}@anchor{2046}
@subsection 표준 모듈들


@geindex 모듈;sys

파이썬은 표준 모듈들의 라이브러리가 함께 오는데, 별도의 문서 파이썬 라이브러리 레퍼런스 (이후로는 “라이브러리 레퍼런스”) 에서 설명합니다. 어떤 모듈들은 인터프리터에 내장됩니다; 이것들은 언어의 핵심적인 부분은 아니지만 그런데도 내장된 연산들에 대한 액세스를 제공하는데, 효율이나 시스템 호출과 같은 운영 체제 기본 요소들에 대한 액세스를 제공하기 위함입니다. 그런 모듈들의 집합은 설정 옵션인데 기반 플랫폼 의존적입니다. 예를 들어, @ref{11c,,winreg} 모듈은 윈도우 시스템에서만 제공됩니다. 특별한 모듈 하나는 주목을 받을 필요가 있습니다: @ref{df,,sys}. 모든 파이썬 인터프리터에 내장됩니다. 변수 @code{sys.ps1} 와 @code{sys.ps2} 는 기본과 보조 프롬프트로 사용되는 문자열을 정의합니다:

@example
>>> import sys
>>> sys.ps1
'>>> '
>>> sys.ps2
'... '
>>> sys.ps1 = 'C> '
C> print('Yuck!')
Yuck!
C>
@end example

이 두 개의 변수들은 인터프리터가 대화형 모드일 때만 정의됩니다.

변수 @code{sys.path} 는 인터프리터의 모듈 검색 경로를 결정하는 문자열들의 리스트입니다. 환경 변수 
@geindex PYTHONPATH
@geindex 환경 변수; PYTHONPATH
@ref{121c,,PYTHONPATH} 에서 취한 기본 경로나, 
@geindex PYTHONPATH
@geindex 환경 변수; PYTHONPATH
@code{PYTHONPATH} 가 설정되지 않는 경우 내장 기본값으로 초기화됩니다. 표준 리스트 연산을 사용해서 수정할 수 있습니다:

@example
>>> import sys
>>> sys.path.append('/ufs/guido/lib/python')
@end example

@node dir 함수,패키지,표준 모듈들,모듈
@anchor{tutorial/modules the-dir-function}@anchor{2049}@anchor{tutorial/modules tut-dir}@anchor{204a}
@subsection @code{dir()} 함수


내장 함수 @ref{843,,dir()} 은 모듈이 정의하는 이름들을 찾는 데 사용됩니다. 문자열들의 정렬된 리스트를 돌려줍니다:

@example
>>> import fibo, sys
>>> dir(fibo)
['__name__', 'fib', 'fib2']
>>> dir(sys)
['__breakpointhook__', '__displayhook__', '__doc__', '__excepthook__',
 '__interactivehook__', '__loader__', '__name__', '__package__', '__spec__',
 '__stderr__', '__stdin__', '__stdout__', '__unraisablehook__',
 '_clear_type_cache', '_current_frames', '_debugmallocstats', '_framework',
 '_getframe', '_git', '_home', '_xoptions', 'abiflags', 'addaudithook',
 'api_version', 'argv', 'audit', 'base_exec_prefix', 'base_prefix',
 'breakpointhook', 'builtin_module_names', 'byteorder', 'call_tracing',
 'callstats', 'copyright', 'displayhook', 'dont_write_bytecode', 'exc_info',
 'excepthook', 'exec_prefix', 'executable', 'exit', 'flags', 'float_info',
 'float_repr_style', 'get_asyncgen_hooks', 'get_coroutine_origin_tracking_depth',
 'getallocatedblocks', 'getdefaultencoding', 'getdlopenflags',
 'getfilesystemencodeerrors', 'getfilesystemencoding', 'getprofile',
 'getrecursionlimit', 'getrefcount', 'getsizeof', 'getswitchinterval',
 'gettrace', 'hash_info', 'hexversion', 'implementation', 'int_info',
 'intern', 'is_finalizing', 'last_traceback', 'last_type', 'last_value',
 'maxsize', 'maxunicode', 'meta_path', 'modules', 'path', 'path_hooks',
 'path_importer_cache', 'platform', 'prefix', 'ps1', 'ps2', 'pycache_prefix',
 'set_asyncgen_hooks', 'set_coroutine_origin_tracking_depth', 'setdlopenflags',
 'setprofile', 'setrecursionlimit', 'setswitchinterval', 'settrace', 'stderr',
 'stdin', 'stdout', 'thread_info', 'unraisablehook', 'version', 'version_info',
 'warnoptions']
@end example

인자가 없으면, @ref{843,,dir()} 는 현재 정의한 이름들을 나열합니다:

@example
>>> a = [1, 2, 3, 4, 5]
>>> import fibo
>>> fib = fibo.fib
>>> dir()
['__builtins__', '__name__', 'a', 'fib', 'fibo', 'sys']
@end example

모든 형의 이름을 나열한다는 것에 유의해야 합니다: 변수, 모듈, 함수, 등등.

@geindex 모듈;builtins

@ref{843,,dir()} 은 내장 함수와 변수들의 이름을 나열하지 않습니다. 그것들의 목록을 원한다면, 표준 모듈 @ref{13,,builtins} 에 정의되어 있습니다:

@example
>>> import builtins
>>> dir(builtins)
['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException',
 'BlockingIOError', 'BrokenPipeError', 'BufferError', 'BytesWarning',
 'ChildProcessError', 'ConnectionAbortedError', 'ConnectionError',
 'ConnectionRefusedError', 'ConnectionResetError', 'DeprecationWarning',
 'EOFError', 'Ellipsis', 'EnvironmentError', 'Exception', 'False',
 'FileExistsError', 'FileNotFoundError', 'FloatingPointError',
 'FutureWarning', 'GeneratorExit', 'IOError', 'ImportError',
 'ImportWarning', 'IndentationError', 'IndexError', 'InterruptedError',
 'IsADirectoryError', 'KeyError', 'KeyboardInterrupt', 'LookupError',
 'MemoryError', 'NameError', 'None', 'NotADirectoryError', 'NotImplemented',
 'NotImplementedError', 'OSError', 'OverflowError',
 'PendingDeprecationWarning', 'PermissionError', 'ProcessLookupError',
 'ReferenceError', 'ResourceWarning', 'RuntimeError', 'RuntimeWarning',
 'StopIteration', 'SyntaxError', 'SyntaxWarning', 'SystemError',
 'SystemExit', 'TabError', 'TimeoutError', 'True', 'TypeError',
 'UnboundLocalError', 'UnicodeDecodeError', 'UnicodeEncodeError',
 'UnicodeError', 'UnicodeTranslateError', 'UnicodeWarning', 'UserWarning',
 'ValueError', 'Warning', 'ZeroDivisionError', '_', '__build_class__',
 '__debug__', '__doc__', '__import__', '__name__', '__package__', 'abs',
 'all', 'any', 'ascii', 'bin', 'bool', 'bytearray', 'bytes', 'callable',
 'chr', 'classmethod', 'compile', 'complex', 'copyright', 'credits',
 'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval', 'exec', 'exit',
 'filter', 'float', 'format', 'frozenset', 'getattr', 'globals', 'hasattr',
 'hash', 'help', 'hex', 'id', 'input', 'int', 'isinstance', 'issubclass',
 'iter', 'len', 'license', 'list', 'locals', 'map', 'max', 'memoryview',
 'min', 'next', 'object', 'oct', 'open', 'ord', 'pow', 'print', 'property',
 'quit', 'range', 'repr', 'reversed', 'round', 'set', 'setattr', 'slice',
 'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type', 'vars',
 'zip']
@end example

@node 패키지,,dir 함수,모듈
@anchor{tutorial/modules packages}@anchor{204b}@anchor{tutorial/modules tut-packages}@anchor{204c}
@subsection 패키지


패키지는 “점으로 구분된 모듈 이름” 를 써서 파이썬의 모듈 이름 공간을 구조화하는 방법입니다. 예를 들어, 모듈 이름 @code{A.B} 는 @code{A} 라는 이름의 패키지에 있는 @code{B} 라는 이름의 서브 모듈을 가리킵니다. 모듈의 사용이 다른 모듈의 저자들이 서로의 전역 변수 이름들을 걱정할 필요 없게 만드는 것과 마찬가지로, 점으로 구분된 모듈의 이름들은 NumPy 나 Pillow 과 같은 다중 모듈 패키지들의 저자들이 서로의 모듈 이름들을 걱정할 필요 없게 만듭니다.

음향 파일과 과 음향 데이터의 일관된 처리를 위한 모듈들의 컬렉션 (“패키지”) 을 설계하길 원한다고 합시다. 여러 종류의 음향 파일 형식이 있으므로 (보통 확장자로 구분됩니다, 예를 들어: @code{.wav}, @code{.aiff}, @code{.au}), 다양한 파일 형식 간의 변환을 위해 계속 늘어나는 모듈들의 컬렉션을 만들고 유지할 필요가 있습니다. 또한, 음향 데이터에 적용하고자 하는 많은 종류의 연산들도 있으므로 (믹싱, 에코 넣기, 이퀄라이저 기능 적용, 인공적인 스테레오 효과 만들기와 같은), 이 연산들을 수행하기 위한 모듈들을 끊임없이 작성하게 될 것입니다. 패키지를 이렇게 구성해 볼 수 있습니다 (계층적 파일 시스템으로 표현했습니다):

@example
sound/                          최상위 패키지
      __init__.py               sound 패키지 초기화
      formats/                  파일 형식 변환을 위한 서브 패키지
              __init__.py
              wavread.py
              wavwrite.py
              aiffread.py
              aiffwrite.py
              auread.py
              auwrite.py
              ...
      effects/                  음향 효과를 위한 서브 패키지
              __init__.py
              echo.py
              surround.py
              reverse.py
              ...
      filters/                  필터를 위한 서브 패키지
              __init__.py
              equalizer.py
              vocoder.py
              karaoke.py
              ...
@end example

패키지를 임포트할 때, 파이썬은 @code{sys.path} 에 있는 디렉터리들을 검색하면서 패키지 서브 디렉터리를 찾습니다.

파이썬이 디렉터리를 패키지로 취급하게 만들기 위해서 @code{__init__.py} 파일이 필요합니다 (비교적 고급 기능인 @ref{2b2,,이름 공간 패키지}를 사용하지 않는다면). 이렇게 하면 @code{string} 처럼 흔히 쓰는 이름의 디렉터리가, 의도하지 않게 모듈 검색 경로의 뒤에 등장하는 올바른 모듈들을 가리는 일을 방지합니다. 가장 간단한 경우, @code{__init__.py} 는 그냥 빈 파일일 수 있지만, 패키지의 초기화 코드를 실행하거나 뒤에서 설명하는 @code{__all__} 변수를 설정할 수 있습니다.

패키지 사용자는 패키지로부터 개별 모듈을 임포트할 수 있습니다, 예를 들어:

@example
import sound.effects.echo
@end example

이것은 서브 모듈 @code{sound.effects.echo} 를 로드합니다. 전체 이름으로 참조되어야 합니다.

@example
sound.effects.echo.echofilter(input, output, delay=0.7, atten=4)
@end example

서브 모듈을 임포트하는 다른 방법은 이렇습니다:

@example
from sound.effects import echo
@end example

이것도 서브 모듈 @code{echo} 를 로드하고, 패키지 접두어 없이 사용할 수 있게 합니다. 그래서 이런 식으로 사용할 수 있습니다:

@example
echo.echofilter(input, output, delay=0.7, atten=4)
@end example

또 다른 방법은 원하는 함수나 변수를 직접 임포트하는 것입니다:

@example
from sound.effects.echo import echofilter
@end example

또다시, 이것은 서브 모듈 @code{echo} 를 로드하지만, 함수 @code{echofilter()} 를 직접 사용할 수 있게 만듭니다:

@example
echofilter(input, output, delay=0.7, atten=4)
@end example

@code{from package import item} 를 사용할 때, item은 패키지의 서브 모듈 (또는 서브 패키지)일 수도 있고 함수, 클래스, 변수 등 패키지에 정의된 다른 이름들일 수도 있음에 유의하세요. @code{import} 문은 먼저 item이 패키지에 정의되어 있는지 검사하고, 그렇지 않으면 모듈이라고 가정하고 로드를 시도합니다. 찾지 못한다면, @ref{659,,ImportError} 예외를 일으킵니다.

이에 반하여, @code{import item.subitem.subsubitem} 와 같은 문법을 사용할 때, 마지막 것을 제외한 각 항목은 반드시 패키지여야 합니다; 마지막 항목은 모듈이나 패키지가 될 수 있지만, 앞의 항목에서 정의된 클래스, 함수, 변수 등이 될 수는 없습니다.

@menu
* 패키지에서 * 임포트 하기:: 
* 패키지 내부 간의 참조:: 
* 여러 디렉터리에 있는 패키지:: 

@end menu

@node 패키지에서 * 임포트 하기,패키지 내부 간의 참조,,패키지
@anchor{tutorial/modules importing-from-a-package}@anchor{204d}@anchor{tutorial/modules tut-pkg-import-star}@anchor{204e}
@subsubsection 패키지에서 * 임포트 하기


@geindex __all__

이제 @code{from sound.effects import *} 라고 쓰면 어떻게 될까? 이상적으로는, 어떻게든 파일 시스템에서 패키지에 어떤 모듈들이 들어있는지 찾은 다음, 그것들 모두를 임포트 하기를 원할 것입니다. 이렇게 하는 데는 시간이 오래 걸리고 서브 모듈을 임포트 함에 따라 어떤 서브 모듈을 명시적으로 임포트할 경우만 일어나야만 하는 원하지 않는 부수적 효과가 발생할 수 있습니다.

유일한 해결책은 패키지 저자가 패키지의 색인을 명시적으로 제공하는 것입니다. @ref{7f7,,import} 문은 다음과 같은 관례가 있습니다: 패키지의 @code{__init__.py} 코드가 @code{__all__} 이라는 이름의 목록을 제공하면, 이것을 @code{from package import *} 를 만날 때 임포트 해야만 하는 모듈 이름들의 목록으로 받아들입니다. 새 버전의 패키지를 출시할 때 이 목록을 최신 상태로 유지하는 것은 패키지 저자의 책임입니다. 패키지 저자가 패키지에서 * 를 임포트하는 용도가 없다고 판단한다면, 이것을 지원하지 않기로 할 수도 있습니다. 예를 들어, 파일 @code{sound/effects/__init__.py} 는 다음과 같은 코드를 포함할 수 있습니다:

@example
__all__ = ["echo", "surround", "reverse"]
@end example

이것은 @code{from sound.effects import *} 가 @code{sound.effects} 패키지의 이름을 지정한 세 서브 모듈들을 임포트하게 됨을 의미합니다.

서브 모듈이 지역적으로 정의된 이름에 의해 가려질 수 있음에 유의하세요. 예를 들어, @code{reverse} 함수를 @code{sound/effects/__init__.py} 파일에 추가하면, @code{from sound.effects import *}는 @code{echo}와 @code{surround} 두 서브 모듈만 임포트할 뿐, @code{reverse} 서브 모듈은 임포트하지 `않습니다'. 지역적으로 정의된 @code{reverse} 함수에 의해 가려지기 때문입니다:

@example
__all__ = [
    "echo",      # 'echo.py' 파일을 가리킵니다
    "surround",  # 'surround.py' 파일을 가리킵니다
    "reverse",   # !!! 이제 'reverse' 함수를 가리킵니다 !!!
]

def reverse(msg: str):  # <-- 'from sound.effects import *' 의 경우에,
    return msg[::-1]    #     이 이름이 'reverse.py' 서비 모듈을 가립니다
@end example

@code{__all__} 이 정의되지 않으면, 문장 @code{from sound.effects import *} 은 패키지 @code{sound.effects} 의 모든 서브 모듈들을 현재 이름 공간으로 임포트 하지 `않습니다'; 이것은 오직 패키지 @code{sound.effects} 가 임포트 되도록 만들고 (@code{__init__.py} 에 있는 초기화 코드들이 수행될 수 있습니다), 그 패키지가 정의하는 이름들을 임포트 합니다. 이 이름들은 @code{__init__.py} 가 정의하는 모든 이름 (그리고 명시적으로 로드된 서브 모듈들)을 포함합니다. 이 이름들에는 사전에 @ref{7f7,,import} 문으로 명시적으로 로드된 패키지의 서브 모듈들 역시 포함됩니다. 이 코드를 생각해봅시다:

@example
import sound.effects.echo
import sound.effects.surround
from sound.effects import *
@end example

이 예에서, @code{echo} 와 @code{surround} 모듈이 현재 이름 공간으로 임포트 되는데, @code{from...import} 문이 실행될 때 @code{sound.effects} 패키지에 정의되기 때문입니다. (@code{__all__} 이 정의될 때도 마찬가집니다.)

설사 어떤 모듈이 @code{import *} 를 사용할 때 특정 패턴을 따르는 이름들만 익스포트 하도록 설계되었다 하더라도, 프로덕션 코드에서는 여전히 좋지 않은 사례로 여겨집니다.

@code{from package import specific_submodule} 을 사용하는데 잘못된 것은 없다는 것을 기억하세요! 사실, 임포트하는 모듈이 다른 패키지에서 같은 이름의 서브 모듈을 사용할 필요가 없는 한 권장되는 표기법입니다.

@node 패키지 내부 간의 참조,여러 디렉터리에 있는 패키지,패키지에서 * 임포트 하기,패키지
@anchor{tutorial/modules id2}@anchor{204f}@anchor{tutorial/modules intra-package-references}@anchor{2050}
@subsubsection 패키지 내부 간의 참조


패키지가 서브 패키지들로 구조화될 때 (예에서 나온 @code{sound} 패키지처럼), 이웃 패키지의 서브 모듈을 가리키는데 절대 임포트를 사용할 수 있습니다. 예를 들어, 모듈 @code{sound.filters.vocoder} 이 @code{sound.effects} 패키지의 @code{echo} 모듈이 필요하면, @code{from sound.effects import echo} 를 사용할 수 있습니다.

상대 임포트를 쓸 수도 있는데, @code{from module import name} 형태의 임포트 문을 사용합니다. 이 임포트는 상대 임포트에 수반되는 현재와 부모 패키지를 가리키기 위해 앞에 붙는 점을 사용합니다. 예를 들어, @code{surround} 모듈에서, 이렇게 사용할 수 있습니다:

@example
from . import echo
from .. import formats
from ..filters import equalizer
@end example

Note that relative imports are based on the name of the current module’s package.
Since the main module does not have a package, modules intended for use
as the main module of a Python application must always use absolute imports.

@node 여러 디렉터리에 있는 패키지,,패키지 내부 간의 참조,패키지
@anchor{tutorial/modules packages-in-multiple-directories}@anchor{2051}
@subsubsection 여러 디렉터리에 있는 패키지


패키지는 특별한 어트리뷰트 하나를 더 지원합니다, @ref{2052,,__path__}. 이것은 패키지의 @code{__init__.py} 파일을 실행하기 전에, 이 파일이 들어있는 디렉터리의 이름을 포함하는 문자열의 @ref{715,,시퀀스}로 초기화됩니다. 이 변수는 수정할 수 있습니다; 그렇게 하면 그 이후로 패키지에 포함된 모듈과 서브 패키지를 검색하는 데 영향을 주게 됩니다.

이 기능이 자주 필요하지는 않지만, 패키지에서 발견되는 모듈의 집합을 확장하는 데 사용됩니다.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 입력과 출력,에러와 예외,모듈,파이썬 자습서
@anchor{tutorial/inputoutput doc}@anchor{2053}@anchor{tutorial/inputoutput input-and-output}@anchor{2054}@anchor{tutorial/inputoutput translation-repo}@anchor{2055}@anchor{tutorial/inputoutput tut-io}@anchor{2056}
@section 입력과 출력


프로그램의 출력을 표현하는 여러 가지 방법이 있습니다; 사람이 일기에 적합한 형태로 데이터를 인쇄할 수도 있고, 나중에 사용하기 위해 파일에 쓸 수도 있습니다. 이 장에서는 몇 가지 가능성을 논합니다.

@menu
* 장식적인 출력 포매팅:: 
* 파일을 읽고 쓰기:: 

@end menu

@node 장식적인 출력 포매팅,파일을 읽고 쓰기,,입력과 출력
@anchor{tutorial/inputoutput fancier-output-formatting}@anchor{2057}@anchor{tutorial/inputoutput tut-formatting}@anchor{2058}
@subsection 장식적인 출력 포매팅


지금까지 우리는 값을 쓰는 두 가지 방법을 만났습니다: `표현식 문장' 과 @ref{1174,,print()} 함수입니다. (세 번째 방법은 파일 객체의 @ref{2059,,write()} 메서드를 사용하는 것입니다; 표준 출력 파일은 @code{sys.stdout} 로 참조할 수 있습니다. 이것에 대한 자세한 정보는 라이브러리 레퍼런스를 보세요.)

종종 단순히 스페이스로 구분된 값을 인쇄하는 것보다 출력 형식을 더 많이 제어해야 하는 경우가 있습니다. 출력을 포맷하는 데는 여러 가지 방법이 있습니다.


@itemize *

@item 
@ref{205a,,포맷 문자열 리터럴}을 사용하려면, 시작 인용 부호 또는 삼중 인용 부호 앞에 @code{f} 또는 @code{F} 를 붙여 문자열을 시작하십시오. 이 문자열 안에서, @code{@{} 및 @code{@}} 문자 사이에, 변수 또는 리터럴 값을 참조할 수 있는 파이썬 표현식을 작성할 수 있습니다.

@example
>>> year = 2016
>>> event = 'Referendum'
>>> f'Results of the @{year@} @{event@}'
'Results of the 2016 Referendum'
@end example

@item 
문자열의 @ref{832,,str.format()} 메서드는 더 많은 수작업을 요구합니다. 변수가 대체 될 위치를 표시하기 위해 @code{@{} 및 @code{@}}를 여전히 사용하고, 자세한 포매팅 디렉티브를 제공할 수 있지만, 포맷할 정보도 제공해야 합니다. 다음 코드 블록에는 변수를 포맷하는 방법에 대한 두 가지 예가 있습니다:

@example
>>> yes_votes = 42_572_654
>>> total_votes = 85_705_149
>>> percentage = yes_votes / total_votes
>>> '@{:-9@} YES votes  @{:2.2%@}'.format(yes_votes, percentage)
' 42572654 YES votes  49.67%'
@end example

Notice how the @code{yes_votes} are padded with spaces and a negative sign only for negative numbers.
The example also prints @code{percentage} multiplied by 100, with 2 decimal
places and followed by a percent sign (see @ref{4f9,,Format specification mini-language} for details).

@item 
마지막으로, 문자열 슬라이싱 및 이어붙이기 연산을 사용하여 상상할 수 있는 모든 배치를 만듦으로써, 모든 문자열 처리를 스스로 수행할 수 있습니다. 문자열형에는 주어진 열 너비로 문자열을 채우는 데 유용한 연산을 수행하는 몇 가지 메서드가 있습니다.
@end itemize

장식적인 출력이 필요하지 않고 단지 디버깅을 위해 일부 변수를 빠르게 표시하려면, @ref{1c1,,repr()} 또는 @ref{169,,str()} 함수를 사용하여 모든 값을 문자열로 변환할 수 있습니다.

@ref{169,,str()} 함수는 어느 정도 사람이 읽기에 적합한 형태로 값의 표현을 돌려주게 되어있습니다. 반면에 @ref{1c1,,repr()} 은 인터프리터에 의해 읽힐 수 있는 형태를 만들게 되어있습니다 (또는 그렇게 표현할 수 있는 문법이 없으면 @ref{18e,,SyntaxError} 를 일으키도록 구성됩니다). 사람이 소비하기 위한 특별한 표현이 없는 객체의 경우, @code{str()} 는 @code{repr()} 과 같은 값을 돌려줍니다. 많은 값, 숫자들이나 리스트와 딕셔너리와 같은 구조들, 은 두 함수를 쓸 때 같은 표현을 합니다. 특별히, 문자열은 두 가지 표현을 합니다.

몇 가지 예를 듭니다:

@example
>>> s = 'Hello, world.'
>>> str(s)
'Hello, world.'
>>> repr(s)
"'Hello, world.'"
>>> str(1/7)
'0.14285714285714285'
>>> x = 10 * 3.25
>>> y = 200 * 200
>>> s = 'The value of x is ' + repr(x) + ', and y is ' + repr(y) + '...'
>>> print(s)
The value of x is 32.5, and y is 40000...
>>> # 문자열의 repr() 은 문자열 따옴표와 역슬래시를 추가합니다:
>>> hello = 'hello, world\n'
>>> hellos = repr(hello)
>>> print(hellos)
'hello, world\n'
>>> # repr() 의 인자로는 모든 파이썬 객체가 올 수 있습니다:
>>> repr((x, y, ('spam', 'eggs')))
"(32.5, 40000, ('spam', 'eggs'))"
@end example

The @ref{d8,,string} module contains support for a simple templating approach
based upon regular expressions, via @ref{896,,string.Template}.
This offers yet another way to substitute values into strings,
using placeholders like @code{$x} and replacing them with values from a dictionary.
This syntax is easy to use, although it offers much less control for formatting.

@geindex 포맷 문자열 리터럴
@geindex 보간된 문자열 리터럴
@geindex 문자열;포맷 리터럴
@geindex 문자열;보간된 리터럴
@geindex f-문자열
@geindex f문자열

@menu
* 포맷 문자열 리터럴:: 
* 문자열 format() 메서드: 문자열 format 메서드. 
* 수동 문자열 포매팅:: 
* 예전의 문자열 포매팅:: 

@end menu

@node 포맷 문자열 리터럴,문자열 format 메서드,,장식적인 출력 포매팅
@anchor{tutorial/inputoutput formatted-string-literals}@anchor{205b}@anchor{tutorial/inputoutput tut-f-strings}@anchor{205a}
@subsubsection 포맷 문자열 리터럴


@ref{19a,,포맷 문자열 리터럴}(간단히 f-문자열이라고도 합니다)은 문자열에 @code{f} 또는 @code{F} 접두어를 붙이고 표현식을 @code{@{expression@}}로 작성하여 문자열에 파이썬 표현식의 값을 삽입할 수 있게 합니다.

선택적인 포맷 지정자가 표현식 뒤에 올 수 있습니다. 이것으로 값이 포맷되는 방식을 더 정교하게 제어할 수 있습니다. 다음 예는 원주율을 소수점 이하 세 자리로 반올림합니다.

@example
>>> import math
>>> print(f'The value of pi is approximately @{math.pi:.3f@}.')
The value of pi is approximately 3.142.
@end example

@code{':'} 뒤에 정수를 전달하면 해당 필드의 최소 문자 폭이 됩니다. 열을 줄 맞춤할 때 편리합니다.

@example
>>> table = @{'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 7678@}
>>> for name, phone in table.items():
...     print(f'@{name:10@} ==> @{phone:10d@}')
...
Sjoerd     ==>       4127
Jack       ==>       4098
Dcab       ==>       7678
@end example

다른 수정자를 사용하면 포맷되기 전에 값을 변환할 수 있습니다. @code{'!a'}는 @ref{15eb,,ascii()}를, @code{'!s'}는 @ref{169,,str()}을, @code{'!r'}는 @ref{1c1,,repr()}을 적용합니다.:

@example
>>> animals = 'eels'
>>> print(f'My hovercraft is full of @{animals@}.')
My hovercraft is full of eels.
>>> print(f'My hovercraft is full of @{animals!r@}.')
My hovercraft is full of 'eels'.
@end example

The @code{=} specifier can be used to expand an expression to the text of the
expression, an equal sign, then the representation of the evaluated expression:

@example
>>> bugs = 'roaches'
>>> count = 13
>>> area = 'living room'
>>> print(f'Debugging @{bugs=@} @{count=@} @{area=@}')
Debugging bugs='roaches' count=13 area='living room'
@end example

@code{=} 지정자에 대한 자세한 내용은 @ref{b9e,,스스로 설명하는 표현식}을 참조하세요. 이러한 포맷 사양에 대한 레퍼런스는 @ref{4f9,,Format specification mini-language}에 대한 레퍼런스 지침서를 참조하십시오.

@node 문자열 format 메서드,수동 문자열 포매팅,포맷 문자열 리터럴,장식적인 출력 포매팅
@anchor{tutorial/inputoutput the-string-format-method}@anchor{205c}@anchor{tutorial/inputoutput tut-string-format}@anchor{205d}
@subsubsection 문자열 format() 메서드


@ref{832,,str.format()} 메서드의 기본적인 사용법은 이런 식입니다:

@example
>>> print('We are the @{@} who say "@{@}!"'.format('knights', 'Ni'))
We are the knights who say "Ni!"
@end example

중괄호와 그 안에 있는 문자들 (포맷 필드라고 부른다) 은 @ref{832,,str.format()} 메서드로 전달된 객체들로 치환됩니다. 중괄호 안의 숫자는 @code{str.format()} 메서드로 전달된 객체들의 위치를 가리키는데 사용될 수 있습니다.

@example
>>> print('@{0@} and @{1@}'.format('spam', 'eggs'))
spam and eggs
>>> print('@{1@} and @{0@}'.format('spam', 'eggs'))
eggs and spam
@end example

@ref{832,,str.format()} 메서드에 키워드 인자가 사용되면, 그 값들은 인자의 이름을 사용해서 지정할 수 있습니다.

@example
>>> print('This @{food@} is @{adjective@}.'.format(
...       food='spam', adjective='absolutely horrible'))
This spam is absolutely horrible.
@end example

위치와 키워드 인자를 자유롭게 조합할 수 있습니다:

@example
>>> print('The story of @{0@}, @{1@}, and @{other@}.'.format('Bill', 'Manfred',
...                                                    other='Georg'))
The story of Bill, Manfred, and Georg.
@end example

나누고 싶지 않은 정말 긴 포맷 문자열이 있을 때, 포맷할 변수들을 위치 대신에 이름으로 지정할 수 있다면 좋을 것입니다. 간단히 딕셔너리를 넘기고 키를 액세스하는데 대괄호 @code{'[]'} 를 사용하면 됩니다.

@example
>>> table = @{'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 8637678@}
>>> print('Jack: @{0[Jack]:d@}; Sjoerd: @{0[Sjoerd]:d@}; '
...       'Dcab: @{0[Dcab]:d@}'.format(table))
Jack: 4098; Sjoerd: 4127; Dcab: 8637678
@end example

@code{**} 표기법을 사용해서 @code{table} 딕셔너리를 키워드 인자로 전달해도 같은 결과를 얻을 수 있습니다.

@example
>>> table = @{'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 8637678@}
>>> print('Jack: @{Jack:d@}; Sjoerd: @{Sjoerd:d@}; Dcab: @{Dcab:d@}'.format(**table))
Jack: 4098; Sjoerd: 4127; Dcab: 8637678
@end example

이 방법은 모든 지역 변수들을 담은 딕셔너리를 돌려주는 내장 함수 @ref{1e1f,,vars()} 와 함께 사용할 때 특히 쓸모가 있습니다:

@example
>>> table = @{k: str(v) for k, v in vars().items()@}
>>> message = " ".join([f'@{k@}: ' + '@{' + k +'@};' for k in table.keys()])
>>> print(message.format(**table))
__name__: __main__; __doc__: None; __package__: None; __loader__: ...
@end example

예를 들어, 다음 줄은 정수와 그 제곱과 세제곱을 제공하는 빽빽하게 정렬된 열 집합을 생성합니다:

@example
>>> for x in range(1, 11):
...     print('@{0:2d@} @{1:3d@} @{2:4d@}'.format(x, x*x, x*x*x))
...
 1   1    1
 2   4    8
 3   9   27
 4  16   64
 5  25  125
 6  36  216
 7  49  343
 8  64  512
 9  81  729
10 100 1000
@end example

@ref{832,,str.format()} 를 사용한 문자열 포매팅의 완전한 개요는 @ref{15a0,,Format string syntax} 을 보세요.

@node 수동 문자열 포매팅,예전의 문자열 포매팅,문자열 format 메서드,장식적인 출력 포매팅
@anchor{tutorial/inputoutput manual-string-formatting}@anchor{205e}
@subsubsection 수동 문자열 포매팅


여기 같은 제곱수와 세제곱수 표를 수동으로 포매팅했습니다:

@example
>>> for x in range(1, 11):
...     print(repr(x).rjust(2), repr(x*x).rjust(3), end=' ')
...     # 앞 줄의 'end' 사용에 주목하세요
...     print(repr(x*x*x).rjust(4))
...
 1   1    1
 2   4    8
 3   9   27
 4  16   64
 5  25  125
 6  36  216
 7  49  343
 8  64  512
 9  81  729
10 100 1000
@end example

(@ref{1174,,print()} 의 동작 방식으로 인해 각 칼럼 사이에 스페이스 하나가 추가되었음에 유의하세요: 항상 인자들 사이에 스페이스를 추가합니다.)

문자열 객체의 @ref{205f,,str.rjust()} 메서드는 왼쪽에 스페이스를 채워서 주어진 폭으로 문자열을 우측 줄 맞춤합니다. 비슷한 메서드 @ref{2060,,str.ljust()} 와 @ref{2061,,str.center()} 도 있습니다. 이 메서드들은 어떤 것도 출력하지 않습니다, 단지 새 문자열을 돌려줍니다. 입력 문자열이 너무 길면, 자르지 않고, 변경 없이 그냥 돌려줍니다; 이것이 열 배치를 엉망으로 만들겠지만, 보통 값에 대해 거짓말을 하게 될 대안보다는 낫습니다. (정말로 잘라내기를 원한다면, 항상 슬라이스 연산을 추가할 수 있습니다, @code{x.ljust(n)[:n]} 처럼.)

다른 메서드도 있습니다, @ref{16b7,,str.zfill()}. 숫자 문자열의 왼쪽에 0을 채웁니다. 플러스와 마이너스 부호도 이해합니다:

@example
>>> '12'.zfill(5)
'00012'
>>> '-3.14'.zfill(7)
'-003.14'
>>> '3.14159265359'.zfill(5)
'3.14159265359'
@end example

@node 예전의 문자열 포매팅,,수동 문자열 포매팅,장식적인 출력 포매팅
@anchor{tutorial/inputoutput old-string-formatting}@anchor{2062}
@subsubsection 예전의 문자열 포매팅


% 연산자(모듈로)는 문자열 포매팅에도 사용할 수 있습니다. @code{format % values}가 주어지면 (`format'은 문자열입니다), `format'에 있는 @code{%} 변환 명세는 0개 이상의 `values' 요소로 대체됩니다. 이 연산을 흔히 문자열 보간(interpolation)이라고 합니다. 예를 들면:

@example
>>> import math
>>> print('The value of pi is approximately %5.3f.' % math.pi)
The value of pi is approximately 3.142.
@end example

더 자세한 내용은 @ref{8da,,printf 스타일 문자열 포매팅} 섹션에 나옵니다.

@node 파일을 읽고 쓰기,,장식적인 출력 포매팅,입력과 출력
@anchor{tutorial/inputoutput reading-and-writing-files}@anchor{2063}@anchor{tutorial/inputoutput tut-files}@anchor{2064}
@subsection 파일을 읽고 쓰기


@geindex 내장 함수;open
@geindex 객체;파일

@ref{316,,open()} 은 @ref{13c8,,파일 객체} 를 돌려주고, 두 개의 위치 인자와 하나의 키워드 인자를 주는 방식이 가장 많이 사용됩니다: @code{open(filename, mode, encoding=None)}

@example
>>> f = open('workfile', 'w', encoding="utf-8")
@end example

@c XXX str(f) is <io.TextIOWrapper object at 0x82e8dc4>
@c 
@c >>> print(f)
@c <open file 'workfile', mode 'w' at 80a0960>

첫 번째 인자는 파일 이름을 담은 문자열입니다. 두 번째 인자는 파일이 사용될 방식을 설명하는 몇 개의 문자들을 담은 또 하나의 문자열입니다. `mode' 는 파일을 읽기만 하면 @code{'r'}, 쓰기만 하면 @code{'w'} (같은 이름의 이미 존재하는 파일은 삭제됩니다) 가 되고, @code{'a'} 는 파일을 덧붙이기 위해 엽니다; 파일에 기록되는 모든 데이터는 자동으로 끝에 붙습니다. @code{'r+'} 는 파일을 읽고 쓰기 위해 엽니다. `mode' 인자는 선택적인데, 생략하면 @code{'r'} 이 가정됩니다.

보통, 파일은 `텍스트 모드 (text mode)' 로 열리는데, 이 뜻은, 파일에 문자열을 읽고 쓰고, 파일에는 특정한 `encoding'으로 인코딩된다는 것입니다. `encoding'이 지정되지 않으면 기본값은 플랫폼 의존적입니다 (@ref{316,,open()} 을 보세요). UTF-8 이 사실상의 최신 표준이므로, 다른 인코딩을 사용해야 하는 경우가 아니라면 @code{encoding="utf-8"}를 권합니다. mode 에 @code{'b'}를 덧붙이면 파일을 `바이너리 모드 (binary mode)' 로 엽니다. 이제 데이터는 바이트열 객체의 형태로 읽고 쓰입니다. 텍스트를 포함하지 않는 모든 파일에는 이 모드를 사용해야 합니다. 바이너리 모드 데이터는 @ref{192,,bytes} 객체로 읽고 씁니다. 바이너리 모드로 파일을 열 때는 `encoding'을 지정할 수 없습니다.

텍스트 모드에서, 읽을 때의 기본 동작은 플랫폼 의존적인 줄 종료 (유닉스에서 @code{\n}, 윈도우에서 @code{\r\n}) 를 단지 @code{\n} 로 변경하는 것입니다. 텍스트 모드로 쓸 때, 기본 동작은 @code{\n} 를 다시 플랫폼 의존적인 줄 종료로 변환하는 것입니다. 이 파일 데이터에 대한 무대 뒤의 수정은 텍스트 파일의 경우는 문제가 안 되지만, @code{JPEG} 이나 @code{EXE} 파일과 같은 바이너리 데이터를 망치게 됩니다. 그런 파일을 읽고 쓸 때 바이너리 모드를 사용하도록 주의하세요.

파일 객체를 다룰 때 @ref{186,,with} 키워드를 사용하는 것은 좋은 습관입니다. 혜택은 도중 예외가 발생하더라도 스위트가 종료될 때 파일이 올바르게 닫힌다는 것입니다. @code{with} 를 사용하는 것은 동등한 @ref{8f7,,try}-@ref{1b0,,finally} 블록을 쓰는 것에 비교해 훨씬 짧기도 합니다:

@example
>>> with open('workfile', encoding="utf-8") as f:
...     read_data = f.read()

>>> # 파일이 자동으로 닫혔는지 확인할 수 있습니다.
>>> f.closed
True
@end example

@ref{186,,with} 키워드를 사용하지 않으면, @code{f.close()} 를 호출해서 파일을 닫고 사용된 시스템 자원을 즉시 반납해야 합니다.

@cartouche
@quotation 경고 
@code{with} 키워드를 사용하거나 @code{f.close()}를 호출하지 않고 @code{f.write()}를 호출하면 프로그램이 성공적으로 종료되더라도 @code{f.write()}의 인자가 디스크에 완전히 기록되지 않을 `수' 있습니다.
@end quotation
@end cartouche

@c See also https://bugs.python.org/issue17852

파일 객체가 닫힌 후에는, @ref{186,,with} 문이나 @code{f.close()} 를 호출하는 경우 모두, 파일 객체를 사용하려는 시도는 자동으로 실패합니다.

@example
>>> f.close()
>>> f.read()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: I/O operation on closed file.
@end example

@menu
* 파일 객체의 매소드:: 
* json 으로 구조적인 데이터를 저장하기:: 

@end menu

@node 파일 객체의 매소드,json 으로 구조적인 데이터를 저장하기,,파일을 읽고 쓰기
@anchor{tutorial/inputoutput methods-of-file-objects}@anchor{2065}@anchor{tutorial/inputoutput tut-filemethods}@anchor{2066}
@subsubsection 파일 객체의 매소드


이 섹션의 나머지 예들은 @code{f} 라는 파일 객체가 이미 만들어졌다고 가정합니다.

파일의 내용을 읽으려면, @code{f.read(size)} 를 호출하는데, 일정량의 데이터를 읽고 문자열 (텍스트 모드 에서) 이나 바이트열 (바이너리 모드에서) 로 돌려줍니다. `size' 는 선택적인 숫자 인자입니다. `size' 가 생략되거나 음수면 파일의 내용 전체를 읽어서 돌려줍니다; 파일의 크기가 기계의 메모리보다 두 배 크다면 여러분이 감당할 문제입니다. 그렇지 않으면 최대 `size' 문자(텍스트 모드에서)나 `size' 바이트(바이너리 모드에서)를 읽고 돌려줍니다. 파일의 끝에 도달하면, @code{f.read()} 는 빈 문자열 (@code{'@w{'}}) 을 돌려줍니다.

@example
>>> f.read()
'This is the entire file.\n'
>>> f.read()
'@w{'}
@end example

@code{f.readline()} 은 파일에서 한 줄을 읽습니다; 개행 문자 (@code{\n}) 는 문자열의 끝에 보존되고, 파일이 개행문자로 끝나지 않는 때에만 파일의 마지막 줄에서만 생략됩니다. 이렇게 반환 값을 모호하지 않게 만듭니다; @code{f.readline()} 가 빈 문자열을 돌려주면, 파일의 끝에 도달한 것이지만, 빈 줄은 @code{'\n'}, 즉 하나의 개행문자만을 포함하는 문자열로 표현됩니다.

@example
>>> f.readline()
'This is the first line of the file.\n'
>>> f.readline()
'Second line of the file\n'
>>> f.readline()
'@w{'}
@end example

파일에서 줄들을 읽으려면, 파일 객체에 대해 루핑할 수 있습니다. 이것은 메모리 효율적이고, 빠르며 간단한 코드로 이어집니다:

@example
>>> for line in f:
...     print(line, end='@w{'})
...
This is the first line of the file.
Second line of the file
@end example

파일의 모든 줄을 리스트로 읽어 들이려면 @code{list(f)} 나 @code{f.readlines()} 를 쓸 수 있습니다.

@code{f.write(string)} 은 `string' 의 내용을 파일에 쓰고, 출력된 문자들의 개수를 돌려줍니다.

@example
>>> f.write('This is a test\n')
15
@end example

다른 형의 객체들은 쓰기 전에 변환될 필요가 있습니다 – 문자열 (텍스트 모드에서) 이나 바이트열 객체 (바이너리 모드에서) 로 –:

@example
>>> value = ('the answer', 42)
>>> s = str(value)  # 튜플을 문자열로 변환합니다
>>> f.write(s)
18
@end example

@code{f.tell()} 은 파일의 현재 위치를 가리키는 정수를 돌려주는데, 바이너리 모드의 경우 파일의 처음부터의 바이트 수로 표현되고 텍스트 모드의 경우는 불투명한 숫자입니다.

파일 객체의 위치를 바꾸려면, @code{f.seek(offset, whence)} 를 사용합니다. 위치는 기준점에 `offset' 을 더해서 계산됩니다; 기준점은 `whence' 인자로 선택합니다. `whence' 값이 0이면 파일의 처음부터 측정하고, 1이면 현재 파일 위치를 사용하고, 2 는 파일의 끝을 기준점으로 사용합니다. `whence' 는 생략될 수 있고, 기본값은 0이라서 파일의 처음을 기준점으로 사용합니다.

@example
>>> f = open('workfile', 'rb+')
>>> f.write(b'0123456789abcdef')
16
>>> f.seek(5)      # 파일의 6번째 바이트로 이동합니다
5
>>> f.read(1)
b'5'
>>> f.seek(-3, 2)  # 끝에서 3번째 바이트로 이동합니다
13
>>> f.read(1)
b'd'
@end example

텍스트 파일에서는 (모드 문자열에 @code{b} 가 없이 열린 것들), 파일의 시작에 상대적인 위치 변경만 허락되고 (예외는 @code{seek(0, 2)} 를 사용해서 파일의 끝으로 위치를 변경하는 경우입니다), 올바른 `offset' 값은 @code{f.tell()} 이 돌려준 값과 0뿐입니다. 그 밖의 다른 `offset' 값은 정의되지 않은 결과를 낳습니다.

파일 객체는 @ref{2067,,isatty()} 나 @ref{1515,,truncate()} 같은 몇 가지 메서드를 더 갖고 있는데, 덜 자주 사용됩니다; 파일 객체에 대한 완전한 안내는 라이브러리 레퍼런스를 참조하세요.

@node json 으로 구조적인 데이터를 저장하기,,파일 객체의 매소드,파일을 읽고 쓰기
@anchor{tutorial/inputoutput saving-structured-data-with-json}@anchor{2068}@anchor{tutorial/inputoutput tut-json}@anchor{2069}
@subsubsection @code{json} 으로 구조적인 데이터를 저장하기


@geindex 모듈;json

문자열은 파일에 쉽게 읽고 쓸 수 있습니다. 숫자는 약간의 수고를 해야 하는데, @ref{206a,,read()} 메서드가 문자열만을 돌려주기 때문입니다. 이 문자열을 @ref{19b,,int()} 같은 함수로 전달해야만 하는데, @code{'123'} 같은 문자열을 받고 숫자 값 123을 돌려줍니다. 중첩된 리스트나 딕셔너리 같은 더 복잡한 데이터를 저장하려고 할 때, 수작업으로 파싱하고 직렬화하는 것이 까다로울 수 있습니다.

사용자가 반복적으로 복잡한 데이터형을 파일에 저장하는 코드를 작성하고 디버깅하도록 하는 대신, 파이썬은 JSON (JavaScript Object Notation)@footnote{https://json.org} 이라는 널리 쓰이는 데이터 교환 형식을 사용할 수 있게 합니다. @ref{86,,json} 이라는 표준 모듈은 파이썬 데이터 계층을 받아서 문자열 표현으로 바꿔줍니다; 이 절차를 `직렬화 (serializing)' 라고 부릅니다. 문자열 표현으로부터 데이터를 재구성하는 것은 `역 직렬화 (deserializing)' 라고 부릅니다. 직렬화와 역 직렬화 사이에서, 객체를 표현하는 문자열은 파일이나 데이터에 저장되거나 네트워크 연결을 통해 원격 기계로 전송될 수 있습니다.

@cartouche
@quotation 참고 
JSON 형식은 데이터 교환을 위해 현대 응용 프로그램들이 자주 사용합니다. 많은 프로그래머가 이미 이것에 익숙하므로, 연동성을 위한 좋은 선택이 됩니다.
@end quotation
@end cartouche

객체 @code{x} 가 있을 때, 간단한 한 줄의 코드로 그것의 JSON 문자열 표현을 볼 수 있습니다:

@example
>>> import json
>>> x = [1, 'simple', 'list']
>>> json.dumps(x)
'[1, "simple", "list"]'
@end example

@ref{f3f,,dump()}라는 @ref{f40,,dumps()} 함수의 변종은 객체를 @ref{206b,,텍스트 파일} 로 직렬화합니다. 그래서 @code{f} 가 쓰기를 위해 열린 텍스트 파일 이면, 이렇게 할 수 있습니다:

@example
json.dump(x, f)
@end example

객체를 다시 디코드하려면, @code{f} 가 읽기를 위해 열린 @ref{206c,,바이너리 파일}이나 @ref{206b,,텍스트 파일} 객체일 때:

@example
x = json.load(f)
@end example

@cartouche
@quotation 참고 
JSON files must be encoded in UTF-8. Use @code{encoding="utf-8"} when opening
JSON file as a @ref{206b,,text file} for both of reading and writing.
@end quotation
@end cartouche

이 간단한 직렬화 테크닉이 리스트와 딕셔너리를 다룰 수 있지만, 임의의 클래스 인스턴스를 JSON 으로 직렬화하기 위해서는 약간의 수고가 더 필요합니다. @ref{86,,json} 모듈의 레퍼런스는 이 방법에 대한 설명을 담고 있습니다.


@subsubheading 더 보기


@ref{ab,,pickle} - 피클 모듈

@ref{2069,,JSON} 에 반해, `pickle' 은 임의의 복잡한 파이썬 객체들을 직렬화할 수 있는 프로토콜입니다. 파이썬에 국한되고 다른 언어로 작성된 응용 프로그램들과 통신하는데 사용될 수 없습니다. 기본적으로 안전하지 않기도 합니다: 믿을 수 없는 소스에서 온 데이터를 역 직렬화할 때, 숙련된 공격자에 의해 데이터가 조작되었다면 임의의 코드가 실행될 수 있습니다.


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 에러와 예외,클래스,입력과 출력,파이썬 자습서
@anchor{tutorial/errors doc}@anchor{206d}@anchor{tutorial/errors errors-and-exceptions}@anchor{206e}@anchor{tutorial/errors translation-repo}@anchor{206f}@anchor{tutorial/errors tut-errors}@anchor{2070}
@section 에러와 예외


지금까지 에러 메시지가 언급되지는 않았지만, 예제들을 직접 해보았다면 아마도 몇몇 개를 보았을 것입니다. (적어도) 두 가지 구별되는 에러들이 있습니다; `문법 에러' 와 `예외'.

@menu
* 문법 에러:: 
* 예외:: 
* 예외 처리하기:: 
* 예외 일으키기:: 
* 예외 연쇄:: 
* 사용자 정의 예외:: 
* 뒷정리 동작 정의하기:: 
* 미리 정의된 뒷정리 동작들:: 
* Raising and Handling Multiple Unrelated Exceptions:: 
* Enriching Exceptions with Notes:: 

@end menu

@node 문법 에러,예외,,에러와 예외
@anchor{tutorial/errors syntax-errors}@anchor{2071}@anchor{tutorial/errors tut-syntaxerrors}@anchor{2072}
@subsection 문법 에러


문법 에러는, 파싱 에러라고도 알려져 있습니다, 아마도 여러분이 파이썬을 배우고 있는 동안에는 가장 자주 만나는 종류의 불평일 것입니다:

@example
>>> while True print('Hello world')
  File "<stdin>", line 1
    while True print('Hello world')
               ^^^^^
SyntaxError: invalid syntax
@end example

파서는 문제가 되는 줄을 다시 보여주고 줄에서 에러가 감지된 위치를 가리키는 작은 화살표를 표시합니다. 이 위치가 항상 수정해야 할 위치는 아님에 유의하십시오. 이 예에서, 에러는 함수 @ref{1174,,print()} 에서 감지되었는데, 바로 앞에 콜론 (@code{':'}) 이 빠져있기 때문입니다.

파일 이름(우리 예에서는 @code{<stdin>})과 줄 번호가 인쇄되어서, 입력이 파일로부터 올 때 찾을 수 있도록 합니다.

@node 예외,예외 처리하기,문법 에러,에러와 예외
@anchor{tutorial/errors exceptions}@anchor{2073}@anchor{tutorial/errors tut-exceptions}@anchor{2074}
@subsection 예외


문장이나 표현식이 문법적으로 올바르다 할지라도, 실행하려고 하면 에러를 일으킬 수 있습니다. 실행 중에 감지되는 에러들을 `예외' 라고 부르고 무조건 치명적이지는 않습니다: 파이썬 프로그램에서 이것들을 어떻게 다루는지 곧 배우게 됩니다. 하지만 대부분의 예외는 프로그램이 처리하지 않아서, 여기에서 볼 수 있듯이 에러 메시지를 만듭니다:

@example
>>> 10 * (1/0)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
    10 * (1/0)
          ~^~
ZeroDivisionError: division by zero
>>> 4 + spam*3
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
    4 + spam*3
        ^^^^
NameError: name 'spam' is not defined
>>> '2' + 2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
    '2' + 2
    ~~~~^~~
TypeError: can only concatenate str (not "int") to str
@end example

에러 메시지의 마지막 줄은 어떤 일이 일어났는지 알려줍니다. 예외는 여러 형으로 나타나고, 형이 메시지 일부로 인쇄됩니다: 이 예에서의 형은 @ref{b3f,,ZeroDivisionError}, @ref{452,,NameError}, @ref{198,,TypeError} 입니다. 예외 형으로 인쇄된 문자열은 발생한 내장 예외의 이름입니다. 이것은 모든 내장 예외들의 경우는 항상 참이지만, 사용자 정의 예외의 경우는 (편리한 관례임에도 불구하고) 꼭 그럴 필요는 없습니다. 표준 예외 이름은 내장 식별자입니다 (예약 키워드가 아닙니다).

줄의 나머지 부분은 예외의 형과 원인에 기반을 둔 상세 명세를 제공합니다.

에러 메시지의 앞부분은 스택 트레이스의 형태로 예외가 일어난 위치의 문맥을 보여줍니다. 일반적으로 소스의 줄들을 나열하는 스택 트레이스를 포함하고 있습니다; 하지만, 표준 입력에서 읽어 들인 줄들은 표시하지 않습니다.

@ref{1c25,,내장 예외} 는 내장 예외들과 그 들의 의미를 나열하고 있습니다.

@node 예외 처리하기,예외 일으키기,예외,에러와 예외
@anchor{tutorial/errors handling-exceptions}@anchor{2075}@anchor{tutorial/errors tut-handling}@anchor{1ff7}
@subsection 예외 처리하기


선택한 예외를 처리하는 프로그램을 만드는 것이 가능합니다. 다음 예를 보면, 올바를 정수가 입력될 때까지 사용자에게 입력을 요청하지만, 사용자가 프로그램을 인터럽트 하는 것을 허용합니다 (@code{Control}-@code{C} 나 그 외에 운영 체제가 지원하는 것을 사용해서); 사용자가 만든 인터럽트는 @ref{bc4,,KeyboardInterrupt} 예외를 일으키는 형태로 나타남에 유의하세요.

@example
>>> while True:
...     try:
...         x = int(input("Please enter a number: "))
...         break
...     except ValueError:
...         print("Oops!  That was no valid number.  Try again...")
...
@end example

@ref{8f7,,try} 문은 다음과 같이 동작합니다.


@itemize *

@item 
먼저, `try 절' (@ref{8f7,,try} 와 @ref{1ab,,except} 사이의 문장들) 이 실행됩니다.

@item 
예외가 발생하지 않으면, `except 절' 을 건너뛰고 @ref{8f7,,try} 문의 실행은 종료됩니다.

@item 
@ref{8f7,,try} 절을 실행하는 동안 예외가 발생하면, 절의 남은 부분들을 건너뜁니다. 그런 다음, 형이 @ref{1ab,,except} 키워드 뒤에 오는 예외 이름과 매치되면, 그 `except 절'이 실행되고, 그런 다음 실행은 try/except 블록 뒤로 이어집니다.

@item 
`except 절'에 있는 예외 이름들과 매치되지 않는 예외가 발생하면, 외부에 있는 @ref{8f7,,try} 문으로 전달됩니다; 처리기가 발견되지 않으면, `처리되지 않은 예외' 이고 에러 메시지를 출력하면서 실행이 멈춥니다.
@end itemize

A @ref{8f7,,try} statement may have more than one `except clause', to specify
handlers for different exceptions.  At most one handler will be executed.
Handlers only handle exceptions that occur in the corresponding `try clause',
not in other handlers of the same @code{try} statement.  An `except clause'
may name multiple exceptions, for example:

@example
... except RuntimeError, TypeError, NameError:
...     pass
@end example

@ref{1ab,,except} 절에 있는 클래스는 해당 클래스 자체나 자식 클래스의 인스턴스인 예외와 매치됩니다 (하지만 다른 방식으로는 매치되지 않습니다 — 자식 클래스를 나열한 `except 절'은 베이스 클래스의 인스턴스와 매치되지 않습니다). 예를 들어, 다음과 같은 코드는 B, C, D를 그 순서대로 인쇄합니다:

@example
class B(Exception):
    pass

class C(B):
    pass

class D(C):
    pass

for cls in [B, C, D]:
    try:
        raise cls()
    except D:
        print("D")
    except C:
        print("C")
    except B:
        print("B")
@end example

`except 절'이 뒤집히면 (@code{except B} 가 처음에 오도록), B, B, B를 인쇄하게 됨에 주의하세요 — 처음으로 매치되는 `except 절'이 실행됩니다.

예외가 발생할 때, 연관된 값을 가질 수 있는데, 예외의 `인자' 라고도 알려져 있습니다. 인자의 존재와 형은 예외 형에 의존적입니다.

The `except clause' may specify a variable after the exception name.  The
variable is bound to the exception instance which typically has an @code{args}
attribute that stores the arguments. For convenience, builtin exception
types define @ref{82f,,__str__()} to print all the arguments without explicitly
accessing @code{.args}.

@example
>>> try:
...     raise Exception('spam', 'eggs')
... except Exception as inst:
...     print(type(inst))    # 예외 형
...     print(inst.args)     # .args 에 저장된 인자들
...     print(inst)          # __str__ 는 args 가 직접 인쇄될 수 있게합니다,
...                          # 하지만 예외 서브 클래스가 재정의할 수 있습니다
...     x, y = inst.args     # args 를 언팩합니다
...     print('x =', x)
...     print('y =', y)
...
<class 'Exception'>
('spam', 'eggs')
('spam', 'eggs')
x = spam
y = eggs
@end example

예외의 @ref{82f,,__str__()} 출력이 처리되지 않은 예외 메시지의 마지막 부분(‘상세 명세’)에 인쇄됩니다.

@ref{7d6,,BaseException} is the common base class of all exceptions. One of its
subclasses, @ref{bcc,,Exception}, is the base class of all the non-fatal exceptions.
Exceptions which are not subclasses of @code{Exception} are not typically
handled, because they are used to indicate that the program should terminate.
They include @ref{f3b,,SystemExit} which is raised by @ref{277,,sys.exit()} and
@ref{bc4,,KeyboardInterrupt} which is raised when a user wishes to interrupt
the program.

@ref{bcc,,Exception} can be used as a wildcard that catches (almost) everything.
However, it is good practice to be as specific as possible with the types
of exceptions that we intend to handle, and to allow any unexpected
exceptions to propagate on.

The most common pattern for handling @ref{bcc,,Exception} is to print or log
the exception and then re-raise it (allowing a caller to handle the
exception as well):

@example
import sys

try:
    f = open('myfile.txt')
    s = f.readline()
    i = int(s.strip())
except OSError as err:
    print("OS error:", err)
except ValueError:
    print("Could not convert data to an integer.")
except Exception as err:
    print(f"Unexpected @{err=@}, @{type(err)=@}")
    raise
@end example

@ref{8f7,,try} … @ref{1ab,,except} 문은 선택적인 `else 절' 을 갖는데, 있다면 모든 `except 절' 뒤에와야 합니다. `try 절'이 예외를 일으키지 않을 때 실행되어야만 하는 코드에 유용합니다. 예를 들어:

@example
for arg in sys.argv[1:]:
    try:
        f = open(arg, 'r')
    except OSError:
        print('cannot open', arg)
    else:
        print(arg, 'has', len(f.readlines()), 'lines')
        f.close()
@end example

@code{else} 절의 사용이 @ref{8f7,,try} 절에 코드를 추가하는 것보다 좋은데, @code{try} … @code{except} 문에 의해 보호되고 있는 코드가 일으키지 않은 예외를 우연히 잡게 되는 것을 방지하기 때문입니다.

예외 처리기는 `try 절'에 직접 등장하는 예외뿐만 아니라, `try 절'에서 (간접적으로라도) 호출되는 내부 함수들에서 발생하는 예외들도 처리합니다. 예를 들어:

@example
>>> def this_fails():
...     x = 1/0
...
>>> try:
...     this_fails()
... except ZeroDivisionError as err:
...     print('Handling run-time error:', err)
...
Handling run-time error: division by zero
@end example

@node 예외 일으키기,예외 연쇄,예외 처리하기,에러와 예외
@anchor{tutorial/errors raising-exceptions}@anchor{2076}@anchor{tutorial/errors tut-raising}@anchor{2077}
@subsection 예외 일으키기


@ref{802,,raise} 문은 프로그래머가 지정한 예외가 발생하도록 강제할 수 있게 합니다. 예를 들어:

@example
>>> raise NameError('HiThere')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
    raise NameError('HiThere')
NameError: HiThere
@end example

@ref{802,,raise} 에 제공하는 단일 인자는 발생시킬 예외를 가리킵니다. 예외 인스턴스이거나 예외 클래스 (@ref{7d6,,BaseException} 을 계승하는 클래스, 가령 @ref{bcc,,Exception}이나 그 서브 클래스) 이어야 합니다. 예외 클래스가 전달되면, 묵시적으로 인자 없이 생성자를 호출해서 인스턴스를 만듭니다:

@example
raise ValueError  # 'raise ValueError()' 의 줄임 표현
@end example

만약 예외가 발생했는지는 알아야 하지만 처리하고 싶지는 않다면, 더 간단한 형태의 @ref{802,,raise} 문이 그 예외를 다시 일으킬 수 있게 합니다:

@example
>>> try:
...     raise NameError('HiThere')
... except NameError:
...     print('An exception flew by!')
...     raise
...
An exception flew by!
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
    raise NameError('HiThere')
NameError: HiThere
@end example

@node 예외 연쇄,사용자 정의 예외,예외 일으키기,에러와 예외
@anchor{tutorial/errors exception-chaining}@anchor{2078}@anchor{tutorial/errors tut-exception-chaining}@anchor{2079}
@subsection 예외 연쇄


If an unhandled exception occurs inside an @ref{1ab,,except} section, it will
have the exception being handled attached to it and included in the error
message:

@example
>>> try:
...     open("database.sqlite")
... except OSError:
...     raise RuntimeError("unable to handle error")
...
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
    open("database.sqlite")
    ~~~~^^^^^^^^^^^^^^^^^^^
FileNotFoundError: [Errno 2] No such file or directory: 'database.sqlite'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<stdin>", line 4, in <module>
    raise RuntimeError("unable to handle error")
RuntimeError: unable to handle error
@end example

To indicate that an exception is a direct consequence of another, the
@ref{802,,raise} statement allows an optional @code{from} clause:

@example
# exc must be exception instance or None.
raise RuntimeError from exc
@end example

이것은 예외를 변환할 때 유용할 수 있습니다. 예를 들면:

@example
>>> def func():
...     raise ConnectionError
...
>>> try:
...     func()
... except ConnectionError as exc:
...     raise RuntimeError('Failed to open database') from exc
...
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
    func()
    ~~~~^^
  File "<stdin>", line 2, in func
ConnectionError

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "<stdin>", line 4, in <module>
    raise RuntimeError('Failed to open database') from exc
RuntimeError: Failed to open database
@end example

It also allows disabling automatic exception chaining using the @code{from None}
idiom:

@example
>>> try:
...     open('database.sqlite')
... except OSError:
...     raise RuntimeError from None
...
Traceback (most recent call last):
  File "<stdin>", line 4, in <module>
    raise RuntimeError from None
RuntimeError
@end example

연쇄 메커니즘에 대한 자세한 내용은, @ref{1c25,,내장 예외}를 참조하십시오.

@node 사용자 정의 예외,뒷정리 동작 정의하기,예외 연쇄,에러와 예외
@anchor{tutorial/errors tut-userexceptions}@anchor{207a}@anchor{tutorial/errors user-defined-exceptions}@anchor{207b}
@subsection 사용자 정의 예외


새 예외 클래스를 만듦으로써 프로그램은 자신의 예외에 이름을 붙일 수 있습니다 (파이썬 클래스에 대한 자세한 내용은 @ref{1fff,,클래스} 를 보세요). 예외는 보통 직접적으로나 간접적으로 @ref{bcc,,Exception} 클래스를 계승합니다.

예외 클래스는 다른 클래스들이 할 수 있는 어떤 것도 가능하도록 정의될 수 있지만, 보통은 간단하게 유지합니다. 종종 예외 처리기가 에러에 관한 정보를 추출할 수 있도록 하기 위한 몇 가지 어트리뷰트들을 제공하기만 합니다.

대부분의 예외는 표준 예외들의 이름들과 유사하게, “Error” 로 끝나는 이름으로 정의됩니다.

많은 표준 모듈들은 그들이 정의하는 함수들에서 발생할 수 있는 그 자신만의 예외들을 정의합니다.

@node 뒷정리 동작 정의하기,미리 정의된 뒷정리 동작들,사용자 정의 예외,에러와 예외
@anchor{tutorial/errors defining-clean-up-actions}@anchor{207c}@anchor{tutorial/errors tut-cleanup}@anchor{207d}
@subsection 뒷정리 동작 정의하기


@ref{8f7,,try} 문은 또 다른 선택적 절을 가질 수 있는데 모든 상황에 실행되어야만 하는 뒷정리 동작을 정의하는 데 사용됩니다. 예를 들어:

@example
>>> try:
...     raise KeyboardInterrupt
... finally:
...     print('Goodbye, world!')
...
Goodbye, world!
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
    raise KeyboardInterrupt
KeyboardInterrupt
@end example

@ref{1b0,,finally} 절이 있으면, @ref{8f7,,try} 문이 완료되기 전에 @code{finally} 절이 마지막 작업으로 실행됩니다. @code{finally} 절은 @code{try} 문이 예외를 생성하는지와 관계없이 실행됩니다. 다음은 예외가 발생할 때 더 복잡한 경우를 설명합니다:


@itemize *

@item 
@code{try} 절을 실행하는 동안 예외가 발생하면, @ref{1ab,,except} 절에서 예외를 처리할 수 있습니다. 예외가 @code{except} 절에서 처리되지 않으면, @code{finally} 절이 실행된 후 예외가 다시 발생합니다.

@item 
@code{except}나 @code{else} 절 실행 중에 예외가 발생할 수 있습니다. 다시, @code{finally} 절이 실행된 후 예외가 다시 발생합니다.

@item 
If the @code{finally} clause executes a @ref{17f,,break},
@ref{180,,continue} or @ref{1af,,return} statement, exceptions are not
re-raised. This can be confusing and is therefore discouraged. From
version 3.14 the compiler emits a @ref{1ae,,SyntaxWarning} for it
(see 
@geindex Python 향상 제안; PEP 765
PEP 765@footnote{https://peps.python.org/pep-0765/}).

@item 
@code{try} 문이 @ref{17f,,break}, @ref{180,,continue} 또는 @ref{1af,,return} 문에 도달하면, @code{finally} 절은 @code{break}, @code{continue} 또는 @code{return} 문 실행 직전에 실행됩니다.

@item 
If a @code{finally} clause includes a @code{return}
statement, the returned value will be the one from the
@code{finally} clause’s @code{return} statement, not the
value from the @code{try} clause’s @code{return}
statement. This can be confusing and is therefore discouraged. From
version 3.14 the compiler emits a @ref{1ae,,SyntaxWarning} for it
(see 
@geindex Python 향상 제안; PEP 765
PEP 765@footnote{https://peps.python.org/pep-0765/}).
@end itemize

예를 들면:

@example
>>> def bool_return():
...     try:
...         return True
...     finally:
...         return False
...
>>> bool_return()
False
@end example

더 복잡한 예:

@example
>>> def divide(x, y):
...     try:
...         result = x / y
...     except ZeroDivisionError:
...         print("division by zero!")
...     else:
...         print("result is", result)
...     finally:
...         print("executing finally clause")
...
>>> divide(2, 1)
result is 2.0
executing finally clause
>>> divide(2, 0)
division by zero!
executing finally clause
>>> divide("2", "1")
executing finally clause
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
    divide("2", "1")
    ~~~~~~^^^^^^^^^^
  File "<stdin>", line 3, in divide
    result = x / y
             ~~^~~
TypeError: unsupported operand type(s) for /: 'str' and 'str'
@end example

보인 바와 같이, @ref{1b0,,finally} 절은 모든 경우에 실행됩니다. 두 문자열을 나눠서 발생한 @ref{198,,TypeError} 는 @ref{1ab,,except} 절에 의해 처리되지 않고 @code{finally} 절이 실행된 후에 다시 일어납니다.

실제 세상의 응용 프로그램에서, @ref{1b0,,finally} 절은 외부 자원을 사용할 때, 성공적인지 아닌지와 관계없이, 그 자원을 반납하는 데 유용합니다 (파일이나 네트워크 연결 같은 것들).

@node 미리 정의된 뒷정리 동작들,Raising and Handling Multiple Unrelated Exceptions,뒷정리 동작 정의하기,에러와 예외
@anchor{tutorial/errors predefined-clean-up-actions}@anchor{207e}@anchor{tutorial/errors tut-cleanup-with}@anchor{207f}
@subsection 미리 정의된 뒷정리 동작들


어떤 객체들은 객체가 더 필요 없을 때 개입하는 표준 뒷정리 동작을 정의합니다. 그 객체를 사용하는 연산의 성공 여부와 관계없습니다. 파일을 열고 그 내용을 화면에 인쇄하려고 하는 다음 예를 보세요.

@example
for line in open("myfile.txt"):
    print(line, end="")
@end example

이 코드의 문제점은 이 부분이 실행을 끝낸 뒤에도 예측할 수 없는 기간 동안 파일을 열린 채로 둔다는 것입니다. 간단한 스크립트에서는 문제가 되지 않지만, 큰 응용 프로그램에서는 문제가 될 수 있습니다. @ref{186,,with} 문은 파일과 같은 객체들이 즉시 올바르게 뒷정리 되도록 보장하는 방법을 제공합니다.

@example
with open("myfile.txt") as f:
    for line in f:
        print(line, end="")
@end example

문장이 실행된 후에, 줄을 처리하는 데 문제가 발생하더라도, 파일 `f' 는 항상 닫힙니다. 파일과 같이, 미리 정의된 뒷정리 동작들을 제공하는 객체들은 그들의 설명서에서 이 사실을 설명합니다.

@node Raising and Handling Multiple Unrelated Exceptions,Enriching Exceptions with Notes,미리 정의된 뒷정리 동작들,에러와 예외
@anchor{tutorial/errors raising-and-handling-multiple-unrelated-exceptions}@anchor{2080}@anchor{tutorial/errors tut-exception-groups}@anchor{2081}
@subsection Raising and Handling Multiple Unrelated Exceptions


There are situations where it is necessary to report several exceptions that
have occurred. This is often the case in concurrency frameworks, when several
tasks may have failed in parallel, but there are also other use cases where
it is desirable to continue execution and collect multiple errors rather than
raise the first exception.

The builtin @ref{4d3,,ExceptionGroup} wraps a list of exception instances so
that they can be raised together. It is an exception itself, so it can be
caught like any other exception.

@example
>>> def f():
...     excs = [OSError('error 1'), SystemError('error 2')]
...     raise ExceptionGroup('there were problems', excs)
...
>>> f()
  + Exception Group Traceback (most recent call last):
  |   File "<stdin>", line 1, in <module>
  |     f()
  |     ~^^
  |   File "<stdin>", line 3, in f
  |     raise ExceptionGroup('there were problems', excs)
  | ExceptionGroup: there were problems (2 sub-exceptions)
  +-+---------------- 1 ----------------
    | OSError: error 1
    +---------------- 2 ----------------
    | SystemError: error 2
    +------------------------------------
>>> try:
...     f()
... except Exception as e:
...     print(f'caught @{type(e)@}: @{e@}')
...
caught <class 'ExceptionGroup'>: there were problems (2 sub-exceptions)
>>>
@end example

By using @code{except*} instead of @code{except}, we can selectively
handle only the exceptions in the group that match a certain
type. In the following example, which shows a nested exception
group, each @code{except*} clause extracts from the group exceptions
of a certain type while letting all other exceptions propagate to
other clauses and eventually to be reraised.

@example
>>> def f():
...     raise ExceptionGroup(
...         "group1",
...         [
...             OSError(1),
...             SystemError(2),
...             ExceptionGroup(
...                 "group2",
...                 [
...                     OSError(3),
...                     RecursionError(4)
...                 ]
...             )
...         ]
...     )
...
>>> try:
...     f()
... except* OSError as e:
...     print("There were OSErrors")
... except* SystemError as e:
...     print("There were SystemErrors")
...
There were OSErrors
There were SystemErrors
  + Exception Group Traceback (most recent call last):
  |   File "<stdin>", line 2, in <module>
  |     f()
  |     ~^^
  |   File "<stdin>", line 2, in f
  |     raise ExceptionGroup(
  |     ...<12 lines>...
  |     )
  | ExceptionGroup: group1 (1 sub-exception)
  +-+---------------- 1 ----------------
    | ExceptionGroup: group2 (1 sub-exception)
    +-+---------------- 1 ----------------
      | RecursionError: 4
      +------------------------------------
>>>
@end example

Note that the exceptions nested in an exception group must be instances,
not types. This is because in practice the exceptions would typically
be ones that have already been raised and caught by the program, along
the following pattern:

@example
>>> excs = []
... for test in tests:
...     try:
...         test.run()
...     except Exception as e:
...         excs.append(e)
...
>>> if excs:
...    raise ExceptionGroup("Test Failures", excs)
...
@end example

@node Enriching Exceptions with Notes,,Raising and Handling Multiple Unrelated Exceptions,에러와 예외
@anchor{tutorial/errors enriching-exceptions-with-notes}@anchor{2082}@anchor{tutorial/errors tut-exception-notes}@anchor{2083}
@subsection Enriching Exceptions with Notes


When an exception is created in order to be raised, it is usually initialized
with information that describes the error that has occurred. There are cases
where it is useful to add information after the exception was caught. For this
purpose, exceptions have a method @code{add_note(note)} that accepts a string and
adds it to the exception’s notes list. The standard traceback rendering
includes all notes, in the order they were added, after the exception.

@example
>>> try:
...     raise TypeError('bad type')
... except Exception as e:
...     e.add_note('Add some information')
...     e.add_note('Add some more information')
...     raise
...
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
    raise TypeError('bad type')
TypeError: bad type
Add some information
Add some more information
>>>
@end example

For example, when collecting exceptions into an exception group, we may want
to add context information for the individual errors. In the following each
exception in the group has a note indicating when this error has occurred.

@example
>>> def f():
...     raise OSError('operation failed')
...
>>> excs = []
>>> for i in range(3):
...     try:
...         f()
...     except Exception as e:
...         e.add_note(f'Happened in Iteration @{i+1@}')
...         excs.append(e)
...
>>> raise ExceptionGroup('We have some problems', excs)
  + Exception Group Traceback (most recent call last):
  |   File "<stdin>", line 1, in <module>
  |     raise ExceptionGroup('We have some problems', excs)
  | ExceptionGroup: We have some problems (3 sub-exceptions)
  +-+---------------- 1 ----------------
    | Traceback (most recent call last):
    |   File "<stdin>", line 3, in <module>
    |     f()
    |     ~^^
    |   File "<stdin>", line 2, in f
    |     raise OSError('operation failed')
    | OSError: operation failed
    | Happened in Iteration 1
    +---------------- 2 ----------------
    | Traceback (most recent call last):
    |   File "<stdin>", line 3, in <module>
    |     f()
    |     ~^^
    |   File "<stdin>", line 2, in f
    |     raise OSError('operation failed')
    | OSError: operation failed
    | Happened in Iteration 2
    +---------------- 3 ----------------
    | Traceback (most recent call last):
    |   File "<stdin>", line 3, in <module>
    |     f()
    |     ~^^
    |   File "<stdin>", line 2, in f
    |     raise OSError('operation failed')
    | OSError: operation failed
    | Happened in Iteration 3
    +------------------------------------
>>>
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 클래스,Brief tour of the standard library,에러와 예외,파이썬 자습서
@anchor{tutorial/classes doc}@anchor{2084}@anchor{tutorial/classes classes}@anchor{2085}@anchor{tutorial/classes translation-repo}@anchor{2086}@anchor{tutorial/classes tut-classes}@anchor{1fff}
@section 클래스


클래스는 데이터와 기능을 함께 묶는 방법을 제공합니다. 새 클래스를 만드는 것은 객체의 새 `형' 을 만들어서, 그 형의 새 `인스턴스' 를 만들 수 있도록 합니다. 각 클래스 인스턴스는 상태를 유지하기 위해 그 자신에게 첨부된 어트리뷰트를 가질 수 있습니다. 클래스 인스턴스는 상태를 바꾸기 위한 (클래스에 의해 정의된) 메서드도 가질 수 있습니다.

다른 프로그래밍 언어들과 비교할 때, 파이썬의 클래스 메커니즘은 최소한의 새로운 문법과 개념을 써서 클래스를 추가합니다. C++ 과 모듈라-3 에서 발견되는 클래스 메커니즘을 혼합합니다. 파이썬 클래스는 객체 지향형 프로그래밍의 모든 표준 기능들을 제공합니다: 클래스 상속 메커니즘은 다중 베이스 클래스를 허락하고, 자식 클래스는 베이스 클래스나 클래스들의 어떤 메서드도 재정의할 수 있으며, 메서드는 같은 이름의 베이스 클래스의 메서드를 호출할 수 있습니다. 객체들은 임의의 종류의 데이터를 양적 제한 없이 가질 수 있습니다. 모듈과 마찬가지로, 클래스는 파이썬의 동적인 본성을 함께 나눕니다: 실행 시간에 만들어지고, 만들어진 후에도 더 수정될 수 있습니다.

C++ 용어로, 보통 클래스 멤버들은 (데이터 멤버를 포함해서) `public' (예외는 아래 @ref{2087,,비공개 변수} 를 보세요) 하고, 모든 맴버 함수들은 `virtual' 입니다. 모듈라-3처럼, 객체의 매소드에서 그 객체의 멤버를 참조하는 줄임 표현은 없습니다: 메서드 함수는 그 객체를 표현하는 명시적인 첫 번째 인자를 선언하는데, 함수 호출 때 묵시적으로 제공됩니다. 스몰토크처럼, 클래스 자신도 객체입니다. 이것이 임포팅과 이름 변경을 위한 개념을 제공합니다. C++ 나 모듈라-3 와는 달리, 내장형도 사용자가 확장하기 위해 베이스 클래스로 사용할 수 있습니다. 또한, C++ 처럼, 특별한 문법을 갖는 대부분의 내장 연산자들은 (산술 연산자, 서브스크립팅, 등등) 클래스 인스턴스에 대해 새로 정의될 수 있습니다.

(클래스에 대해 보편적으로 받아들여지는 용어들이 없는 상태에서, 이따금 스몰토크나 C++ 용어들을 사용할 것입니다. C++ 보다 객체 지향적 개념들이 파이썬의 것과 더 가까우므로 모듈라-3 용어를 사용할 수도 있지만, 들어본 독자들이 별로 없을 것으로 예상합니다.)

@menu
* 이름과 객체에 관한 한마디:: 
* 파이썬 스코프와 이름 공간:: 
* 클래스와의 첫 만남:: 
* 기타 주의사항들:: 
* 상속:: 
* 비공개 변수:: 
* 잡동사니:: 
* 이터레이터:: 
* 제너레이터:: 
* 제너레이터 표현식:: 

@end menu

@node 이름과 객체에 관한 한마디,파이썬 스코프와 이름 공간,,클래스
@anchor{tutorial/classes a-word-about-names-and-objects}@anchor{2088}@anchor{tutorial/classes tut-object}@anchor{2089}
@subsection 이름과 객체에 관한 한마디


객체는 개체성(individuality)을 갖고, 여러 개의 이름이 (여러 개의 스코프에서) 같은 객체에 연결될 수 있습니다. 이것은 다른 언어들에서는 에일리어싱(aliasing) 이라고 알려져 있습니다. 보통 파이썬을 처음 볼 때 이 점을 높이 평가하지는 않고, 불변 기본형들 (숫자, 문자열, 튜플)을 다루는 동안은 안전하게 무시할 수 있습니다. 하지만, 에일리어싱는 리스트, 딕셔너리나 그 밖의 다른 가변 객체들을 수반하는 파이썬 코드의 의미에 극적인 효과를 줄 수 있습니다. 이것은 보통 프로그램에 혜택이 되는데, 에일리어스는 어떤 면에서 포인터처럼 동작하기 때문입니다. 예를 들어, 구현이 포인터만 전달하기 때문에, 객체를 전달하는 비용이 적게 듭니다; 그리고 함수가 인자로 전달된 객체를 수정하면, 호출자는 그 변경을 보게 됩니다 — 이것은 파스칼에서 사용되는 두 가지 서로 다른 인자 전달 메커니즘의 필요를 제거합니다.

@node 파이썬 스코프와 이름 공간,클래스와의 첫 만남,이름과 객체에 관한 한마디,클래스
@anchor{tutorial/classes python-scopes-and-namespaces}@anchor{208a}@anchor{tutorial/classes tut-scopes}@anchor{203e}
@subsection 파이썬 스코프와 이름 공간


클래스를 소개하기 전에, 파이썬의 스코프 규칙에 대해 몇 가지 말할 것이 있습니다. 클래스 정의는 이름 공간으로 깔끔한 요령을 부리고, 여러분은 무엇이 일어나는지 완전히 이해하기 위해 스코프와 이름 공간이 어떻게 동작하는지 알 필요가 있습니다. 덧붙여 말하자면, 이 주제에 대한 지식은 모든 고급 파이썬 프로그래머에게 쓸모가 있습니다.

몇 가지 정의로 시작합시다.

`이름 공간' 은 이름에서 객체로 가는 매핑입니다. 대부분의 이름 공간은 현재 파이썬 딕셔너리로 구현되어 있지만, 보통 다른 식으로는 알아차릴 수 없고 (성능은 예외입니다), 앞으로는 바뀔 수 있습니다. 이름 공간의 예는: 내장 이름들의 집합 (@ref{208b,,abs()} 와 같은 함수들과 내장 예외 이름들을 포함합니다); 모듈의 전역 이름들; 함수 호출에서의 지역 이름들. 어떤 의미에서 객체의 어트리뷰트 집합도 이름 공간을 형성합니다. 이름 공간에 대해 알아야 할 중요한 것은 서로 다른 이름 공간들의 이름 간에는 아무런 관계가 없다는 것입니다; 예를 들어, 두 개의 서로 다른 모듈들은 모두 혼동 없이 함수 @code{maximize} 를 정의할 수 있습니다 — 모듈의 사용자들은 모듈 이름을 앞에 붙여야 합니다.

그런데, 저는 `어트리뷰트' 라는 단어를 점 뒤에 오는 모든 이름에 사용합니다 — 예를 들어, 표현식 @code{z.real} 에서, @code{real} 는 객체 @code{z} 의 어트리뷰트입니다. 엄밀하게 말해서, 모듈에 있는 이름들에 대한 참조는 어트리뷰트 참조입니다: 표현식 @code{modname.funcname} 에서, @code{modname} 은 모듈 객체고 @code{funcname} 는 그것의 어트리뷰트입니다. 이 경우에는 우연히도 모듈의 어트리뷰트와 모듈에서 정의된 전역 이름 간에 직접적인 매핑이 생깁니다: 같은 이름 공간을 공유합니다! @footnote{
한 가지만 제외하고. 모듈 객체는 @ref{77c,,__dict__} 라고 불리는 비밀스러운 읽기 전용 어트리뷰트를 갖는데, 모듈의 이름 공간을 구현하는데 사용하는 딕셔너리를 돌려줍니다; 이름 @code{__dict__} 는 어트리뷰트 이지만 전역 이름은 아닙니다. 명백하게, 이것을 사용하는 것은 이름 공간 구현의 추상화를 파괴하는 것이고, 사후 디버거와 같은 것들로만 제한되어야 합니다.
}

어트리뷰트는 읽기 전용 이거나 쓰기 가능할 수 있습니다. 후자의 경우, 어트리뷰트에 대한 대입이 가능합니다. 모듈 어트리뷰트는 쓰기 가능합니다: @code{modname.the_answer = 42} 라고 쓸 수 있습니다. 쓰기 가능한 어트리뷰트는 @ref{1b1d,,del} 문으로 삭제할 수도 있습니다. 예를 들어, @code{del modname.the_answer} 는 @code{modname} 라는 이름의 객체에서 어트리뷰트 @code{the_answer} 를 제거합니다.

이름 공간들은 서로 다른 순간에 만들어지고 서로 다른 수명을 갖습니다. 내장 이름들을 담는 이름 공간은 파이썬 인터프리터가 시작할 때 만들어지고 영원히 지워지지 않습니다. 모듈의 전역 이름 공간은 모듈 정의를 읽는 동안 만들어집니다; 보통, 모듈 이름 공간은 인터프리터가 끝날 때까지 남습니다. 인터프리터의 최상위 호출 때문에 실행되는, 스크립트 파일이나 대화형으로 읽히는, 문장들은 @ref{1,,__main__} 이라고 불리는 모듈 일부로 여겨져서 그 들 자신의 이름 공간을 갖습니다. (내장 이름들 또한 모듈에 속하는데; 이것을 @ref{13,,builtins} 라 부릅니다.)

함수의 지역 이름 공간은 함수가 호출될 때 만들어지고, 함수가 복귀하거나 함수 내에서 처리되지 않는 예외를 일으킬 때 삭제됩니다. (사실, 잊어버린다는 것이 실제로 일어나는 일에 대한 더 좋은 설명입니다.) 물론, 재귀적 호출은 각각 자기 자신만의 지역 이름 공간을 갖습니다.

`스코프' 는 이름 공간을 직접 액세스할 수 있는 파이썬 프로그램의 텍스트 적인 영역입니다. 여기에서 “직접 액세스 가능한” 이란 이름에 대한 정규화되지 않은 참조가 그 이름 공간에서 이름을 찾으려고 시도한다는 의미입니다.

스코프가 정적으로 결정됨에도 불구하고, 동적으로 사용됩니다. 실행 중 어느 시점에서건, 이름 공간을 직접 액세스 가능한, 세 개나 네 개의 중첩된 스코프가 있습니다:


@itemize *

@item 
가장 먼저 검색되는, 가장 내부의 스코프는 지역 이름들을 포함합니다

@item 
둘러싸고 있는 함수들의 스코프는, 가장 가까이서 둘러싸는 스코프로부터 검색이 시작됩니다, 비 지역(non-local) 이지만 비 전역(non-global) 이름들을 포함합니다

@item 
마지막 직전의 스코프는 현재 모듈의 전역 이름들을 포함합니다

@item 
(가장 나중에 검색되는) 가장 외부의 스코프는 내장 이름들을 포함하고 있는 이름 공간입니다.
@end itemize

이름을 global로 선언하면, 모든 참조와 대입은 모듈의 전역 이름들을 포함하는 마지막 바로 전 스코프로 바로 갑니다. 가장 내부의 스코프 바깥에서 발견되는 변수들을 재연결하려면, @ref{14ac,,nonlocal} 키워드를 사용할 수 있습니다; nonlocal 로 선언되지 않으면, 그 변수들은 읽기 전용입니다 (그런 변수에 쓰려고 하면 단순히 가장 내부의 스코프에 `새' 지역 변수를 만들게 되어, 같은 이름의 바깥 변수를 바꾸지 않고 남겨둡니다).

보통, 지역 스코프는 현재 함수의 지역 이름들을 (텍스트 적으로) 참조합니다. 함수 바깥에서, 지역 스코프는 전역 스코프와 같은 이름 공간을 참조합니다: 모듈의 이름 공간. 클래스 정의들은 지역 스코프에 또 하나의 이름 공간을 배치합니다.

스코프가 텍스트 적으로 결정된다는 것을 깨닫는 것은 중요합니다: 모듈에서 정의된 함수의 전역 스코프는, 어디에서 어떤 에일리어스를 통해 그 함수가 호출되는지에 관계없이, 그 모듈의 이름 공간입니다. 반면에, 이름을 실제로 검색하는 것은 실행시간에 동적으로 수행됩니다 — 하지만, 언어 정의는 컴파일 시점의 정적인 이름 결정을 향해 진화하고 있어서, 동적인 이름 결정에 의존하지 말아야 합니다! (사실, 지역 변수들은 이미 정적으로 결정됩니다.)

파이썬의 특별한 특징은 – @ref{4ad,,global}이나 @ref{14ac,,nonlocal} 문이 없을 때 – 이름에 대입하면 항상 가장 내부의 스코프로 간다는 것입니다. 대입은 데이터를 복사하지 않습니다 – 이름을 단지 객체에 연결할 뿐입니다. 삭제도 마찬가지입니다: 문장 @code{del x} 는 지역 스코프가 참조하는 이름 공간에서 @code{x} 의 연결을 제거합니다. 사실, 새 이름을 소개하는 모든 연산은 지역 스코프를 사용합니다: 특히, @ref{7f7,,import} 문과 함수 정의는 모듈이나 함수 이름을 지역 스코프에 연결합니다.

@ref{4ad,,global} 문은 특정 변수가 전역 스코프에 있으며 그곳에 재연결되어야 함을 가리킬 때 사용될 수 있습니다; @ref{14ac,,nonlocal} 문은 특정 변수가 둘러싸는 스코프에 있으며 그곳에 재연결되어야 함을 가리킵니다.

@menu
* 스코프와 이름 공간 예:: 

@end menu

@node 스코프와 이름 공간 예,,,파이썬 스코프와 이름 공간
@anchor{tutorial/classes scopes-and-namespaces-example}@anchor{208c}@anchor{tutorial/classes tut-scopeexample}@anchor{208d}
@subsubsection 스코프와 이름 공간 예


이것은 어떻게 서로 다른 스코프와 이름 공간을 참조하고, @ref{4ad,,global} 과 @ref{14ac,,nonlocal} 이 변수 연결에 어떤 영향을 주는지를 보여주는 예입니다:

@example
def scope_test():
    def do_local():
        spam = "local spam"

    def do_nonlocal():
        nonlocal spam
        spam = "nonlocal spam"

    def do_global():
        global spam
        spam = "global spam"

    spam = "test spam"
    do_local()
    print("After local assignment:", spam)
    do_nonlocal()
    print("After nonlocal assignment:", spam)
    do_global()
    print("After global assignment:", spam)

scope_test()
print("In global scope:", spam)
@end example

예제 코드의 출력은 이렇게 됩니다:

@example
After local assignment: test spam
After nonlocal assignment: nonlocal spam
After global assignment: nonlocal spam
In global scope: global spam
@end example

어떻게 `지역' 대입이 (이것이 기본입니다) `scope_test' 의 `spam' 연결을 바꾸지 않는지에 유의하세요. @ref{14ac,,nonlocal} 대입은 `scope_test' 의 `spam' 연결을 바꾸고 @ref{4ad,,global} 대입은 모듈 수준의 연결을 바꿉니다.

@ref{4ad,,global} 대입 전에는 `spam' 의 연결이 없다는 것도 볼 수 있습니다.

@node 클래스와의 첫 만남,기타 주의사항들,파이썬 스코프와 이름 공간,클래스
@anchor{tutorial/classes a-first-look-at-classes}@anchor{208e}@anchor{tutorial/classes tut-firstclasses}@anchor{201a}
@subsection 클래스와의 첫 만남


클래스는 약간의 새 문법과 세 개의 객체형과 몇 가지 새 개념들을 도입합니다.

@menu
* 클래스 정의 문법:: 
* 클래스 객체:: 
* 인스턴스 객체:: 
* 메서드 객체:: 
* 클래스와 인스턴스 변수:: 

@end menu

@node 클래스 정의 문법,클래스 객체,,클래스와의 첫 만남
@anchor{tutorial/classes class-definition-syntax}@anchor{208f}@anchor{tutorial/classes tut-classdefinition}@anchor{2090}
@subsubsection 클래스 정의 문법


클래스 정의의 가장 간단한 형태는 이렇게 생겼습니다:

@example
class ClassName:
    <statement-1>
    .
    .
    .
    <statement-N>
@end example

함수 정의(@ref{165f,,def} 문)처럼, 클래스 정의는 어떤 효과가 생기기 위해서는 먼저 실행되어야 합니다. (상상컨대 클래스 정의를 @ref{181,,if} 문의 분기나 함수 내부에 놓을 수 있습니다)

실재적으로, 클래스 정의 내부의 문장들은 보통 함수 정의들이지만, 다른 문장들도 허락되고 때로 쓸모가 있습니다 — 나중에 이 주제로 돌아올 것입니다. 클래스 내부의 함수 정의는 보통, 메서드 호출 규약의 영향을 받은, 특별한 형태의 인자 목록을 갖습니다. — 다시, 이것은 뒤에서 설명됩니다.

클래스 정의에 진입할 때, 새 이름 공간이 만들어지고 지역 스코프로 사용됩니다 — 그래서, 모든 지역 변수들로의 대입은 이 새 이름 공간으로 갑니다. 특히, 함수 정의는 새 함수의 이름을 이곳에 연결합니다.

클래스 정의가 (끝을 통해) 정상적으로 끝날 때, `클래스 객체' 가 만들어집니다. 이것은 기본적으로 클래스 정의 때문에 만들어진 이름 공간의 내용물들을 감싸는 싸개입니다; 다음 섹션에서 클래스 객체에 대해 더 배우게 됩니다. 원래의 지역 스코프가 (클래스 정의에 들어가기 직전에 유효하던 것) 다시 사용되고, 클래스 객체는 클래스 정의 헤더에서 주어진 클래스 이름 (예에서 @code{ClassName}) 으로 여기에 연결됩니다.

@node 클래스 객체,인스턴스 객체,클래스 정의 문법,클래스와의 첫 만남
@anchor{tutorial/classes class-objects}@anchor{2091}@anchor{tutorial/classes tut-classobjects}@anchor{2092}
@subsubsection 클래스 객체


클래스 객체는 두 종류의 연산을 지원합니다: 어트리뷰트 참조와 인스턴스 만들기.

`어트리뷰트 참조' 는 파이썬의 모든 어트리뷰트 참조에 사용되는 표준 문법을 사용합니다: @code{obj.name}. 올바른 어트리뷰트 이름은 클래스 객체가 만들어질 때 클래스의 이름 공간에 있던 모든 이름입니다. 그래서, 클래스 정의가 이렇게 될 때:

@example
class MyClass:
    """A simple example class"""
    i = 12345

    def f(self):
        return 'hello world'
@end example

@code{MyClass.i} 와 @code{MyClass.f} 는 올바른 어트리뷰트 참조고, 각기 정수와 함수 객체를 돌려줍니다. 클래스 어트리뷰트는 대입할 수도 있어서, 대입을 통해 @code{MyClass.i} 의 값을 변경할 수 있습니다. @ref{2093,,__doc__} 도 역시 올바른 어트리뷰트고, 클래스에 속하는 독스트링을 돌려줍니다: @code{"A simple example class"}.

클래스 `인스턴스 만들기' 는 함수 표기법을 사용합니다. 클래스 객체가 클래스의 새 인스턴스를 돌려주는 매개변수 없는 함수인 체합니다. 예를 들어 (위의 클래스를 가정하면):

@example
x = MyClass()
@end example

는 클래스의 새 `인스턴스' 를 만들고 이 객체를 지역 변수 @code{x} 에 대입합니다.

인스턴스 만들기 연산 (클래스 객체 “호출하기”) 은 빈 객체를 만듭니다. 많은 클래스는 특정한 초기 상태로 커스터마이즈된 인스턴스로 객체를 만드는 것을 좋아합니다. 그래서 클래스는 이런 식으로 @ref{8be,,__init__()} 라는 이름의 특수 메서드 정의할 수 있습니다:

@example
def __init__(self):
    self.data = []
@end example

클래스가 @ref{8be,,__init__()} 메서드를 정의할 때, 클래스 인스턴스 만들기는 새로 만들어진 클래스 인스턴스에 대해 자동으로 @code{__init__()} 를 호출합니다. 그래서 이 예에서, 새 초기화된 인스턴스를 이렇게 얻을 수 있습니다:

@example
x = MyClass()
@end example

물론, @ref{8be,,__init__()} 메서드는 더 높은 유연성을 위해 인자들을 가질 수 있습니다. 그 경우, 클래스 인스턴스 만들기 연산자로 주어진 인자들은 @code{__init__()} 로 전달됩니다. 예를 들어,

@example
>>> class Complex:
...     def __init__(self, realpart, imagpart):
...         self.r = realpart
...         self.i = imagpart
...
>>> x = Complex(3.0, -4.5)
>>> x.r, x.i
(3.0, -4.5)
@end example

@node 인스턴스 객체,메서드 객체,클래스 객체,클래스와의 첫 만남
@anchor{tutorial/classes instance-objects}@anchor{2094}@anchor{tutorial/classes tut-instanceobjects}@anchor{2095}
@subsubsection 인스턴스 객체


이제 인스턴스 객체로 무엇을 할 수 있을까? 인스턴스 객체가 이해하는 오직 한가지 연산은 어트리뷰트 참조입니다. 두 가지 종류의 올바른 어트리뷰트 이름이 있습니다: 데이터 어트리뷰트와 메서드.

`Data attributes' correspond to “instance variables” in Smalltalk, and to “data
members” in C++.  Data attributes need not be declared; like local variables,
they spring into existence when they are first assigned to.  For example, if
@code{x} is the instance of @code{MyClass} created above, the following piece of
code will print the value @code{16}, without leaving a trace:

@example
x.counter = 1
while x.counter < 10:
    x.counter = x.counter * 2
print(x.counter)
del x.counter
@end example

다른 인스턴스 어트리뷰트 참조는 `메서드' 입니다. 메서드는 객체에 “속하는” 함수입니다.

@geindex 객체;메서드

인스턴스 객체의 올바른 메서드 이름은 그것의 클래스에 달려있습니다. 정의상, 함수 객체인 클래스의 모든 어트리뷰트들은 상응하는 인스턴스의 메서드들을 정의합니다. 그래서 우리의 예제에서, @code{x.f} 는 올바른 메서드 참조인데, @code{MyClass.f} 가 함수이기 때문입니다. 하지만 @code{x.i} 는 그렇지 않은데, @code{MyClass.i} 가 함수가 아니기 때문입니다. 그러나, @code{x.f} 는 @code{MyClass.f} 와 같은 것이 아닙니다 — 이것은 함수 객체가 아니라 `메서드 객체' 입니다.

@node 메서드 객체,클래스와 인스턴스 변수,인스턴스 객체,클래스와의 첫 만남
@anchor{tutorial/classes method-objects}@anchor{2096}@anchor{tutorial/classes tut-methodobjects}@anchor{2097}
@subsubsection 메서드 객체


보통, 메서드는 연결되자마자 호출됩니다:

@example
x.f()
@end example

If @code{x = MyClass()}, as above, this will return the string @code{'hello world'}.
However, it is not necessary to call a method right away: @code{x.f} is a method
object, and can be stored away and called at a later time.  For example:

@example
xf = x.f
while True:
    print(xf())
@end example

는 영원히 계속 @code{hello world} 를 인쇄합니다.

메서드가 호출될 때 정확히 어떤 일이 일어날까? @code{f()} 의 함수 정의가 인자를 지정했음에도 불구하고, 위에서 @code{x.f()} 는 인자 없이 호출된 것을 알아챘을 것입니다. 인자는 어떻게 된 걸까? 확실히 파이썬은 인자를 필요로 하는 함수를 인자 없이 호출하면 예외를 일으킵니다 – 인자가 실제로는 사용되지 않는다 해도…

실제로, 여러분은 답을 짐작할 수 있습니다: 메서드의 특별함은 인스턴스 객체가 함수의 첫 번째 인자로 전달된다는 것입니다. 우리 예에서, 호출 @code{x.f()}는 정확히 @code{MyClass.f(x)} 와 동등합니다. 일반적으로, `n' 개의 인자들의 목록으로 메서드를 호출하는 것은, 첫 번째 인자 앞에 메서드의 인스턴스 객체를 삽입해서 만든 인자 목록으로 상응하는 함수를 호출하는 것과 동등합니다.

일반적으로, 메서드는 다음과 같이 작동합니다. 데이터 어트리뷰트가 아닌 인스턴스 어트리뷰트를 참조하면, 그것의 클래스가 검색됩니다. 만약 그 이름이 함수 객체인 올바른 클래스 어트리뷰트면, 인스턴스 객체와 함수 객체에 대한 참조가 함께 메서드 객체로 포장됩니다. 메서드 객체가 인자 목록으로 호출되면, 인스턴스 객체와 인자 목록으로부터 새 인자 목록이 구성된 후, 함수 객체를 이 새 인자 목록으로 호출합니다.

@node 클래스와 인스턴스 변수,,메서드 객체,클래스와의 첫 만남
@anchor{tutorial/classes class-and-instance-variables}@anchor{2098}@anchor{tutorial/classes tut-class-and-instance-variables}@anchor{2099}
@subsubsection 클래스와 인스턴스 변수


일반적으로 말해서, 인스턴스 변수는 인스턴스별 데이터를 위한 것이고 클래스 변수는 그 클래스의 모든 인스턴스에서 공유되는 어트리뷰트와 메서드를 위한 것입니다:

@example
class Dog:

    kind = 'canine'         # 모든 인스턴스가 공유하는 클래스 변수

    def __init__(self, name):
        self.name = name    # 각 인스턴스에 고유한 인스턴스 변수

>>> d = Dog('Fido')
>>> e = Dog('Buddy')
>>> d.kind                  # 모든 인스턴스가 공유하는 변수
'canine'
>>> e.kind                  # 모든 인스턴스가 공유하는 변수
'canine'
>>> d.name                  # d 만의 변수
'Fido'
>>> e.name                  # e 만의 변수
'Buddy'
@end example

As discussed in @ref{2089,,이름과 객체에 관한 한마디}, shared data can have possibly surprising
effects involving @ref{1fe1,,mutable} objects such as lists and dictionaries.
For example, the `tricks' list in the following code should not be used as a
class variable because just a single list would be shared by all `Dog'
instances:

@example
class Dog:

    tricks = []             # 클래스 변수의 잘못된 사용

    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                # 예기치 않게 모든 인스턴스가 공유합니다
['roll over', 'play dead']
@end example

대신, 클래스의 올바른 설계는 인스턴스 변수를 사용해야 합니다:

@example
class Dog:

    def __init__(self, name):
        self.name = name
        self.tricks = []    # 각 인스턴스마다 새 빈 리스트를 만듭니다

    def add_trick(self, trick):
        self.tricks.append(trick)

>>> d = Dog('Fido')
>>> e = Dog('Buddy')
>>> d.add_trick('roll over')
>>> e.add_trick('play dead')
>>> d.tricks
['roll over']
>>> e.tricks
['play dead']
@end example

@node 기타 주의사항들,상속,클래스와의 첫 만남,클래스
@anchor{tutorial/classes random-remarks}@anchor{209a}@anchor{tutorial/classes tut-remarks}@anchor{209b}
@subsection 기타 주의사항들


@c These should perhaps be placed more carefully...

인스턴스와 클래스 모두에서 같은 어트리뷰트 이름이 등장하면, 어트리뷰트 조회는 인스턴스를 우선합니다:

@example
>>> class Warehouse:
...    purpose = 'storage'
...    region = 'west'
...
>>> w1 = Warehouse()
>>> print(w1.purpose, w1.region)
storage west
>>> w2 = Warehouse()
>>> w2.region = 'east'
>>> print(w2.purpose, w2.region)
storage east
@end example

데이터 어트리뷰트는 메서드 뿐만 아니라 객체의 일반적인 사용자 (“클라이언트”)에 의해서 참조될 수도 있습니다. 달리 표현하면, 클래스는 순수하게 추상적인 데이터형을 구현하는데 사용될 수 없습니다. 사실, 파이썬에서는 데이터 은닉을 강제할 방법이 없습니다 — 모두 관례에 의존합니다. (반면에, C로 작성된 파이썬 구현은 필요하다면 구현 상세를 완전히 숨기고 객체에 대한 액세스를 제어할 수 있습니다; 이것은 C로 작성된 파이썬 확장에서 사용될 수 있습니다.)

클라이언트는 데이터 어트리뷰트를 조심스럽게 사용해야 합니다 — 클라이언트는 데이터 어트리뷰트를 건드려서 메서드들에 의해 유지되는 불변성 들을 망가뜨릴 수 있습니다. 클라이언트는 이름 충돌을 피하는 한 메서드들의 유효성을 손상하지 않고도 그들 자신의 데이터 어트리뷰트를 인스턴스 객체에 추가할 수도 있음에 유의하세요 — 다시 한번, 명명 규칙은 여러 골칫거리를 피할 수 있게 합니다.

메서드 안에서 데이터 어트리뷰트들(또는 다른 메서드들!)을 참조하는 줄임 표현은 없습니다. 저는 이것이 실제로 메서드의 가독성을 높인다는 것을 알게 되었습니다: 메서드를 훑어볼 때 지역 변수와 인스턴스 변수를 혼동할 우려가 없습니다.

종종, 메서드의 첫 번째 인자는 @code{self} 라고 불립니다. 이것은 관례일 뿐입니다: 이름 @code{self} 는 파이썬에서 아무런 특별한 의미를 갖지 않습니다. 하지만, 이 규칙을 따르지 않을 때 여러분의 코드가 다른 파이썬 프로그래머들이 읽기에 불편하고, `클래스 브라우저' 프로그램도 이런 규칙에 의존하도록 작성되었다고 상상할 수 있음에 유의하세요.

클래스 어트리뷰트인 모든 함수는 그 클래스의 인스턴스들을 위한 메서드를 정의합니다. 함수 정의가 클래스 정의에 텍스트 적으로 둘러싸일 필요는 없습니다: 함수 객체를 클래스의 지역 변수로 대입하는 것 역시 가능합니다. 예를 들어:

@example
# 클래스 외부에서 정의된 함수
def f1(self, x, y):
    return min(x, x+y)

class C:
    f = f1

    def g(self):
        return 'hello world'

    h = g
@end example

이제 @code{f}, @code{g}, @code{h} 는 모두 함수 객체를 가리키는 클래스 @code{C} 의 어트리뷰트고, 결과적으로 이것들은 모두 @code{C} 의 인스턴스들의 메서드입니다 — @code{h} 는 정확히 @code{g} 와 동등합니다. 이런 방식은 프로그램의 독자들에게 혼란을 주기만 한다는 점에 주의하세요.

메서드는 @code{self} 인자의 메서드 어트리뷰트를 사용해서 다른 메서드를 호출할 수 있습니다:

@example
class Bag:
    def __init__(self):
        self.data = []

    def add(self, x):
        self.data.append(x)

    def addtwice(self, x):
        self.add(x)
        self.add(x)
@end example

메서드는 일반 함수들과 마찬가지로 전역 이름을 참조할 수 있습니다. 메서드에 결합한 전역 스코프는 그것의 정의를 포함하는 모듈입니다. (클래스는 결코 전역 스코프로 사용되지 않습니다.) 메서드에서 전역 데이터를 사용할 좋은 이유를 거의 만나지 못하지만, 전역 스코프를 정당하게 사용하는 여러 가지 경우가 있습니다: 한가지는, 전역 스코프에 정의된 함수와 메서드 뿐만 아니라, 그곳에 임포트된 함수와 모듈도 메서드가 사용할 수 있다는 것입니다. 보통, 메서드를 포함하는 클래스 자신은 이 전역 스코프에 정의되고, 다음 섹션에서 메서드가 자신의 클래스를 참조하길 원하는 몇 가지 좋은 이유를 보게 될 것입니다.

각 값은 객체고, 그러므로 `클래스' (`형' 이라고도 불린다) 를 갖습니다. 이것은 @code{object.__class__} 에 저장되어 있습니다.

@node 상속,비공개 변수,기타 주의사항들,클래스
@anchor{tutorial/classes inheritance}@anchor{209c}@anchor{tutorial/classes tut-inheritance}@anchor{209d}
@subsection 상속


물론, 상속을 지원하지 않는다면 언어 기능은 “클래스”라는 이름을 붙일만한 가치가 없을 것입니다. 파생 클래스 정의의 문법은 이렇게 생겼습니다:

@example
class DerivedClassName(BaseClassName):
    <statement-1>
    .
    .
    .
    <statement-N>
@end example

이름 @code{BaseClassName} 은 파생 클래스 정의를 포함하는 스코프에서 접근할 수 있는 이름 공간에 정의되어 있어야 합니다. 베이스 클래스 이름의 자리에 다른 임의의 표현식도 허락됩니다. 예를 들어, 베이스 클래스가 다른 모듈에 정의되어 있을 때 유용합니다:

@example
class DerivedClassName(modname.BaseClassName):
@end example

파생 클래스 정의의 실행은 베이스 클래스와 같은 방식으로 진행됩니다. 클래스 객체가 만들어질 때, 베이스 클래스가 기억됩니다. 이것은 어트리뷰트 참조를 결정할 때 사용됩니다: 요청된 어트리뷰트가 클래스에서 발견되지 않으면 베이스 클래스로 검색을 확장합니다. 베이스 클래스 또한 다른 클래스로부터 파생되었다면 이 규칙은 재귀적으로 적용됩니다.

파생 클래스의 인스턴스 만들기에 특별한 것은 없습니다: @code{DerivedClassName()} 는 그 클래스의 새 인스턴스를 만듭니다. 메서드 참조는 다음과 같이 결정됩니다: 대응하는 클래스 어트리뷰트가 검색되는데, 필요하면 베이스 클래스의 연쇄를 타고 내려갑니다. 이것이 함수 객체를 준다면 메서드 참조는 올바릅니다.

파생 클래스는 베이스 클래스의 메서드들을 재정의할 수 있습니다. 메서드가 같은 객체의 다른 메서드를 호출할 때 특별한 권한 같은 것은 없으므로, 베이스 클래스에 정의된 다른 메서드를 호출하는 베이스 클래스의 메서드는 재정의된 파생 클래스의 메서드를 호출하게 됩니다. (C++ 프로그래머를 위한 표현으로: 파이썬의 모든 메서드는 실질적으로 @code{virtual} 입니다.)

파생 클래스에서 재정의된 메서드가, 같은 이름의 베이스 클래스 메서드를 단순히 갈아치우기보다 사실은 확장하고 싶을 수 있습니다. 베이스 클래스의 메서드를 직접 호출하는 간단한 방법이 있습니다: 단지 @code{BaseClassName.methodname(self, arguments)} 를 호출하면 됩니다. 이것은 때로 클라이언트에게도 쓸모가 있습니다. (이것은 베이스 클래스가 전역 스코프에서 @code{BaseClassName} 으로 액세스 될 수 있을 때만 동작함에 주의하세요.)

파이썬에는 상속과 함께 사용할 수 있는 두 개의 내장 함수가 있습니다:


@itemize *

@item 
인스턴스의 형을 검사하려면 @ref{2ad,,isinstance()} 를 사용합니다: @code{isinstance(obj, int)} 는 @code{obj.__class__} 가 @ref{19b,,int} 거나 @code{int} 에서 파생된 클래스인 경우만 @code{True} 가 됩니다.

@item 
클래스 상속을 검사하려면 @ref{9c4,,issubclass()} 를 사용합니다: @code{issubclass(bool, int)} 는 @code{True} 인데, @ref{3c3,,bool} 이 @ref{19b,,int} 의 서브 클래스이기 때문입니다. 하지만, @code{issubclass(float, int)} 는 @code{False} 인데, @ref{196,,float} 는 @code{int} 의 서브 클래스가 아니기 때문입니다.
@end itemize

@menu
* 다중 상속:: 

@end menu

@node 다중 상속,,,상속
@anchor{tutorial/classes multiple-inheritance}@anchor{209e}@anchor{tutorial/classes tut-multiple}@anchor{209f}
@subsubsection 다중 상속


파이썬은 다중 상속의 형태도 지원합니다. 여러 개의 베이스 클래스를 갖는 클래스 정의는 이런 식입니다:

@example
class DerivedClassName(Base1, Base2, Base3):
    <statement-1>
    .
    .
    .
    <statement-N>
@end example

대부분의 목적상, 가장 간단한 경우에, 부모 클래스로부터 상속된 어트리뷰트들의 검색을 깊이 우선으로, 왼쪽에서 오른쪽으로, 계층 구조에서 겹치는 같은 클래스를 두 번 검색하지 않는 것으로 생각할 수 있습니다. 그래서, 어트리뷰트가 @code{DerivedClassName} 에서 발견되지 않으면, @code{Base1} 에서 찾고, 그다음 (재귀적으로) @code{Base1} 의 베이스 클래스들을 검색합니다. 거기에서도 발견되지 않으면, @code{Base2} 에서 찾고, 이런 식으로 계속합니다.

사실, 이것보다는 약간 더 복잡합니다; 메서드 결정 순서는 @ref{1a6,,super()} 로의 협력적인 호출을 지원하기 위해 동적으로 변경됩니다. 이 접근법은 몇몇 다른 다중 상속 언어들에서 call-next-method 라고 알려져 있고, 단일 상속 언어들에서 발견되는 super 호출보다 더 강력합니다.

동적인 순서가 필요한 이유는, 모든 다중 상속의 경우는 하나나 그 이상의 다이아몬드 관계 (적어도 부모 클래스 중 하나가 가장 바닥 클래스들로부터 여러 경로를 통해 액세스 되는 경우) 를 만들기 때문입니다. 예를 들어, 모든 클래스는 @ref{c7d,,object} 를 계승하기 때문에, 모든 다중 상속은 @code{object} 에 이르는 여러 경로를 제공합니다. 베이스 클래스들이 여러 번 액세스 되지 않게 하려고, 동적인 알고리즘이 검색 순서를 선형화하는데, 각 클래스에서 지정된 왼쪽에서 오른쪽으로 가는 순서를 보존하고, 각 부모를 오직 한 번만 호출하고, 단조적 (부모들의 우선순위에 영향을 주지 않으면서 서브 클래스를 만들 수 있다는 의미입니다) 이도록 만듭니다. 모두 함께 사용될 때, 이 성질들은 다중 상속으로 신뢰성 있고 확장성 있는 클래스들을 설계할 수 있도록 만듭니다. 더 자세한 내용은, @ref{16af,,The Python 2.3 Method Resolution Order}를 보세요.

@node 비공개 변수,잡동사니,상속,클래스
@anchor{tutorial/classes private-variables}@anchor{20a0}@anchor{tutorial/classes tut-private}@anchor{2087}
@subsection 비공개 변수


객체 내부에서만 액세스할 수 있는 “비공개” 인스턴스 변수는 파이썬에 존재하지 않습니다. 하지만, 대부분의 파이썬 코드에서 따르고 있는 규약이 있습니다: 밑줄로 시작하는 이름은 (예를 들어, @code{_spam}) API의 공개적이지 않은 부분으로 취급되어야 합니다 (그것이 함수, 메서드, 데이터 멤버중 무엇이건 간에). 구현 상세이고 통보 없이 변경되는 대상으로 취급되어야 합니다.

@geindex 이름;뒤섞기

클래스-비공개 멤버들의 올바른 사례가 있으므로 (즉 서브 클래스에서 정의된 이름들과의 충돌을 피하고자), `이름 뒤섞기 (name mangling)' 라고 불리는 메커니즘에 대한 제한된 지원이 있습니다. @code{__spam} 형태의 (최소 두 개의 밑줄로 시작하고, 최대 한 개의 밑줄로 끝납니다) 모든 식별자는 @code{_classname__spam} 로 텍스트 적으로 치환되는데, @code{classname} 은 현재 클래스 이름에서 앞에 오는 밑줄을 제거한 것입니다. 이 뒤섞기는 클래스 정의에 등장하는 이상, 식별자의 문법적 위치와 무관하게 수행됩니다.


@subsubheading 더 보기


자세한 내용과 특수한 사례는 @ref{20a1,,비공개 이름 뒤섞기 명세}를 참조하세요.


이름 뒤섞기는 클래스 내부의 메서드 호출을 방해하지 않고 서브 클래스들이 메서드를 재정의할 수 있도록 하는 데 도움을 줍니다. 예를 들어:

@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   # 기존 update() 메서드의 비공개 사본

class MappingSubclass(Mapping):

    def update(self, keys, values):
        # update() 에 새로운 서명을 제공하지만
        # __init__() 를 망가뜨리진 않습니다
        for item in zip(keys, values):
            self.items_list.append(item)
@end example

위의 예는 @code{MappingSubclass}가 @code{__update} 식별자를 도입하더라도 작동합니다. @code{Mapping} 클래스에서는 @code{_Mapping__update}로 @code{MappingSubclass} 클래스에서는 @code{_MappingSubclass__update}로 각각 대체 되기 때문입니다.

뒤섞기 규칙은 대체로 사고를 피하고자 설계되었다는 것에 주의하세요; 여전히 비공개로 취급되는 변수들을 액세스하거나 수정할 수 있습니다. 이것은 디버거와 같은 특별한 상황에서 쓸모 있기조차 합니다.

@code{exec()} 나 @code{eval()} 로 전달된 코드는 호출하는 클래스의 클래스 이름을 현재 클래스로 여기지 않는다는 것에 주의하세요; 이것은 @code{global} 문의 효과와 유사한데, 효과가 함께 바이트-컴파일된 코드로 제한됩니다. 같은 제약이 @code{__dict__} 를 직접 참조할 때뿐만 아니라, @code{getattr()}, @code{setattr()}, @code{delattr()} 에도 적용됩니다.

@node 잡동사니,이터레이터,비공개 변수,클래스
@anchor{tutorial/classes odds-and-ends}@anchor{20a2}@anchor{tutorial/classes tut-odds}@anchor{20a3}
@subsection 잡동사니


때로 몇몇 이름 붙은 데이터 항목들을 함께 묶어주는 파스칼의 “record” 나 C의 “struct” 와 유사한 데이터형을 갖는 것이 쓸모 있습니다. 이 경우 @ref{33,,dataclasses}를 사용하는 것이 일반적인 방법입니다:

@example
from dataclasses import dataclass

@@dataclass
class Employee:
    name: str
    dept: str
    salary: int
@end example

@example
>>> john = Employee('john', 'computer lab', 1000)
>>> john.dept
'computer lab'
>>> john.salary
1000
@end example

특정한 추상적인 데이터형을 기대하는 파이썬 코드 조각은, 종종 그 데이터형의 메서드를 흉내 내는 클래스를 대신 전달받을 수 있습니다. 예를 들어, 파일 객체로부터 데이터를 포맷하는 함수가 있을 때, 대신 문자열 버퍼에서 데이터를 읽는 메서드 @ref{206a,,read()} 와 @ref{20a4,,readline()} 을 제공하는 클래스를 정의한 후 인자로 전달할 수 있습니다.

@c (Unfortunately, this technique has its limitations: a class can't define
@c operations that are accessed by special syntax such as sequence subscripting
@c or arithmetic operators, and assigning such a "pseudo-file" to sys.stdin will
@c not cause the interpreter to read further input from it.)

@ref{20a5,,인스턴스 메서드 객체}도 어트리뷰트를 갖습니다: @ref{15cd,,m.__self__} 는 메서드 @code{m()} 과 결합한 인스턴스 객체이고, @ref{1501,,m.__func__} 는 메서드에 상응하는 @ref{59b,,함수 객체}입니다.

@node 이터레이터,제너레이터,잡동사니,클래스
@anchor{tutorial/classes iterators}@anchor{20a6}@anchor{tutorial/classes tut-iterators}@anchor{20a7}
@subsection 이터레이터


지금쯤 아마도 여러분은 대부분의 컨테이너 객체들을 @ref{34a,,for} 문으로 루핑할 수 있음을 눈치챘을 것입니다:

@example
for element in [1, 2, 3]:
    print(element)
for element in (1, 2, 3):
    print(element)
for key in @{'one':1, 'two':2@}:
    print(key)
for char in "123":
    print(char)
for line in open("myfile.txt"):
    print(line, end='@w{'})
@end example

이런 스타일의 액세스는 명료하고, 간결하고, 편리합니다. 이터레이터를 사용하면 파이썬이 보편화하고 통합됩니다. 무대 뒤에서, @ref{34a,,for} 문은 컨테이너 객체에 대해 @ref{9d7,,iter()} 를 호출합니다. 이 함수는 메서드 @ref{14d2,,__next__()} 를 정의하는 이터레이터 객체를 돌려주는데, 이 메서드는 컨테이너의 요소들을 한 번에 하나씩 액세스합니다. 남은 요소가 없으면, @code{__next__()} 는 @ref{df4,,StopIteration} 예외를 일으켜서 @code{for} 루프에 종료를 알립니다. @ref{9d8,,next()} 내장 함수를 사용해서 @code{__next__()} 메서드를 호출할 수 있습니다; 이 예는 이 모든 것들이 어떻게 동작하는지 보여줍니다:

@example
>>> s = 'abc'
>>> it = iter(s)
>>> it
<str_iterator object at 0x10c90e650>
>>> next(it)
'a'
>>> next(it)
'b'
>>> next(it)
'c'
>>> next(it)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
    next(it)
StopIteration
@end example

이터레이터 프로토콜의 뒤에 있는 메커니즘을 살펴보면, 여러분의 클래스에 이터레이터 동작을 쉽게 추가할 수 있습니다. @ref{14d2,,__next__()} 메서드를 가진 객체를 돌려주는 @ref{20a8,,__iter__()} 메서드를 정의합니다. 클래스가 @code{__next__()} 를 정의하면, @code{__iter__()} 는 그냥 @code{self} 를 돌려줄 수 있습니다.

@example
class Reverse:
    """시퀀스를 역순으로 이터레이트하는 이터레이터."""
    def __init__(self, data):
        self.data = data
        self.index = len(data)

    def __iter__(self):
        return self

    def __next__(self):
        if self.index == 0:
            raise StopIteration
        self.index = self.index - 1
        return self.data[self.index]
@end example

@example
>>> rev = Reverse('spam')
>>> iter(rev)
<__main__.Reverse object at 0x00A1DB50>
>>> for char in rev:
...     print(char)
...
m
a
p
s
@end example

@node 제너레이터,제너레이터 표현식,이터레이터,클래스
@anchor{tutorial/classes generators}@anchor{20a9}@anchor{tutorial/classes tut-generators}@anchor{20aa}
@subsection 제너레이터


@ref{1260,,제너레이터} 는 이터레이터를 만드는 간단하고 강력한 도구입니다. 일반적인 함수처럼 작성되지만 값을 돌려주고 싶을 때마다 @ref{bc1,,yield} 문을 사용합니다. 제너레이터에 @ref{9d8,,next()} 가 호출될 때마다, 제너레이터는 떠난 곳에서 실행을 재개합니다 (모든 데이터 값들과 어떤 문장이 마지막으로 실행되었는지 기억합니다). 예는 제너레이터를 사소할 정도로 쉽게 만들 수 있음을 보여줍니다:

@example
def reverse(data):
    for index in range(len(data)-1, -1, -1):
        yield data[index]
@end example

@example
>>> for char in reverse('golf'):
...     print(char)
...
f
l
o
g
@end example

제너레이터로 할 수 있는 모든 것은 앞 절에서 설명했듯이 클래스 기반 이터레이터로도 할 수 있습니다. 제너레이터가 간단한 이유는 @ref{20ab,,__iter__()} 와 @ref{20ac,,__next__()} 메서드가 저절로 만들어지기 때문입니다.

또 하나의 주요 기능은 지역 변수들과 실행 상태가 호출 간에 자동으로 보관된다는 것입니다. 이것은 @code{self.index} 나 @code{self.data} 와 같은 인스턴스 변수를 사용하는 접근법에 비교해 함수를 쓰기 쉽고 명료하게 만듭니다.

자동 메서드 생성과 프로그램 상태의 저장에 더해, 제너레이터가 종료할 때 자동으로 @ref{df4,,StopIteration} 을 일으킵니다. 조합하면, 이 기능들이 일반 함수를 작성하는 것만큼 이터레이터를 만들기 쉽게 만듭니다.

@node 제너레이터 표현식,,제너레이터,클래스
@anchor{tutorial/classes generator-expressions}@anchor{20ad}@anchor{tutorial/classes tut-genexps}@anchor{20ae}
@subsection 제너레이터 표현식


간단한 제너레이터는 리스트 컴프리헨션과 비슷하지만, 대괄호 대신 괄호를 사용하는 문법을 사용한 표현식으로 간결하게 코딩할 수 있습니다. 이 표현식들은 둘러싸는 함수가 제너레이터를 즉시 사용하는 상황을 위해 설계되었습니다. 제너레이터 표현식은 완전한 제너레이터 정의보다 간결하지만, 융통성은 떨어지고, 비슷한 리스트 컴프리헨션보다 메모리를 덜 쓰는 경향이 있습니다.

예:

@example
>>> sum(i*i for i in range(10))                 # 제곱의 합
285

>>> xvec = [10, 20, 30]
>>> yvec = [7, 5, 3]
>>> sum(x*y for x,y in zip(xvec, yvec))         # 내적
260

>>> unique_words = set(word for line in page  for word in line.split())

>>> valedictorian = max((student.gpa, student.name) for student in graduates)

>>> data = 'golf'
>>> list(data[i] for i in range(len(data)-1, -1, -1))
['f', 'l', 'o', 'g']
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Brief tour of the standard library,표준 라이브러리 둘러보기 — 2부,클래스,파이썬 자습서
@anchor{tutorial/stdlib doc}@anchor{20af}@anchor{tutorial/stdlib brief-tour-of-the-standard-library}@anchor{20b0}@anchor{tutorial/stdlib translation-repo}@anchor{20b1}@anchor{tutorial/stdlib tut-brieftour}@anchor{20b2}
@section Brief tour of the standard library


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

@end menu

@node Operating system interface,File wildcards,,Brief tour of the standard library
@anchor{tutorial/stdlib operating-system-interface}@anchor{20b3}@anchor{tutorial/stdlib tut-os-interface}@anchor{20b4}
@subsection Operating system interface


@ref{a5,,os} 모듈은 운영 체제와 상호 작용하기 위한 수십 가지 함수들을 제공합니다:

@example
>>> import os
>>> os.getcwd()      # Return the current working directory
'C:\\Python314'
>>> os.chdir('/server/accesslogs')   # Change current working directory
>>> os.system('mkdir today')   # Run the command mkdir in the system shell
0
@end example

@code{from os import *} 대신에 @code{import os} 스타일을 사용해야 합니다. 그래야 @ref{f91,,os.open()} 이 내장 @ref{316,,open()} 을 가리는 것을 피할 수 있는데, 두 함수는 아주 다르게 동작합니다.

@geindex 내장 함수;도움말

@ref{a5,,os} 와 같은 큰 모듈과 작업할 때, 내장 @ref{843,,dir()} 과 @ref{ad4,,help()} 함수는 대화형 도우미로 쓸모가 있습니다.

@example
>>> import os
>>> dir(os)
<returns a list of all module functions>
>>> help(os)
<returns an extensive manual page created from the module's docstrings>
@end example

일상적인 파일과 디렉터리 관리 작업을 위해, @ref{ca,,shutil} 모듈은 사용하기 쉬운 더 고수준의 인터페이스를 제공합니다:

@example
>>> import shutil
>>> shutil.copyfile('data.db', 'archive.db')
'archive.db'
>>> shutil.move('/build/executables', 'installdir')
'installdir'
@end example

@node File wildcards,Command-line arguments,Operating system interface,Brief tour of the standard library
@anchor{tutorial/stdlib file-wildcards}@anchor{20b5}@anchor{tutorial/stdlib tut-file-wildcards}@anchor{20b6}
@subsection File wildcards


@ref{68,,glob} 모듈은 디렉터리 와일드카드 검색으로 파일 목록을 만드는 함수를 제공합니다:

@example
>>> import glob
>>> glob.glob('*.py')
['primes.py', 'random.py', 'quote.py']
@end example

@node Command-line arguments,Error output redirection and program termination,File wildcards,Brief tour of the standard library
@anchor{tutorial/stdlib command-line-arguments}@anchor{20b7}@anchor{tutorial/stdlib tut-command-line-arguments}@anchor{20b8}
@subsection Command-line arguments


일반적인 유틸리티 스크립트는 종종 명령행 인자를 처리해야 할 필요가 있습니다. 이 인자들은 @ref{df,,sys} 모듈의 `argv' 어트리뷰트에 리스트로 저장됩니다. 예를 들어, 다음과 같은 @code{demo.py} 파일을 보겠습니다:

@example
# 파일 demo.py
import sys
print(sys.argv)
@end example

다음은 명령행에서 @code{python demo.py one two three} 를 실행한 출력입니다:

@example
['demo.py', 'one', 'two', 'three']
@end example

@ref{7,,argparse} 모듈은 명령 줄 인자를 처리하는 더 정교한 메커니즘을 제공합니다. 다음 스크립트는 하나 이상의 파일명과 선택적으로 표시할 줄 수를 추출합니다:

@example
import argparse

parser = argparse.ArgumentParser(
    prog='top',
    description='Show top lines from each file')
parser.add_argument('filenames', nargs='+')
parser.add_argument('-l', '--lines', type=int, default=10)
args = parser.parse_args()
print(args)
@end example

@code{python top.py --lines=5 alpha.txt beta.txt}를 사용하여 명령 줄에서 실행할 때, 스크립트는 @code{args.lines}를 @code{5}로, @code{args.filenames}를 @code{['alpha.txt', 'beta.txt']}로 설정합니다.

@node Error output redirection and program termination,String pattern matching,Command-line arguments,Brief tour of the standard library
@anchor{tutorial/stdlib error-output-redirection-and-program-termination}@anchor{20b9}@anchor{tutorial/stdlib tut-stderr}@anchor{20ba}
@subsection Error output redirection and program termination


@ref{df,,sys} 모듈은 `stdin', `stdout', `stderr' 어트리뷰트도 갖고 있습니다. 가장 마지막 것은 `stdout' 이 리디렉트 되었을 때도 볼 수 있는 경고와 에러 메시지들을 출력하는데 쓸모가 있습니다:

@example
>>> sys.stderr.write('Warning, log file not found starting a new one\n')
Warning, log file not found starting a new one
@end example

스크립트를 종료하는 가장 직접적인 방법은 @code{sys.exit()} 를 쓰는 것입니다.

@node String pattern matching,수학,Error output redirection and program termination,Brief tour of the standard library
@anchor{tutorial/stdlib string-pattern-matching}@anchor{20bb}@anchor{tutorial/stdlib tut-string-pattern-matching}@anchor{20bc}
@subsection String pattern matching


@ref{be,,re} 모듈은 고급 문자열 처리를 위한 정규식 도구들을 제공합니다. 복잡한 매칭과 조작을 위해, 정규식은 간결하고 최적화된 솔루션을 제공합니다:

@example
>>> import re
>>> re.findall(r'\bf[a-z]*', 'which foot or hand fell fastest')
['foot', 'fell', 'fastest']
>>> re.sub(r'(\b[a-z]+) \1', r'\1', 'cat in the the hat')
'cat in the hat'
@end example

단지 간단한 기능만 필요한 경우에는, 문자열 메서드들이 선호되는데 읽기 쉽고 디버깅이 쉽기 때문입니다:

@example
>>> 'tea for too'.replace('too', 'two')
'tea for two'
@end example

@node 수학,Internet access,String pattern matching,Brief tour of the standard library
@anchor{tutorial/stdlib mathematics}@anchor{20bd}@anchor{tutorial/stdlib tut-mathematics}@anchor{20be}
@subsection 수학


@ref{92,,math} 모듈은 부동 소수점 연산을 위한 하부 C 라이브러리 함수들에 대한 액세스를 제공합니다.

@example
>>> import math
>>> math.cos(math.pi / 4)
0.70710678118654757
>>> math.log(1024, 2)
10.0
@end example

@ref{bd,,random} 모듈은 무작위 선택을 할 수 있는 도구들을 제공합니다:

@example
>>> import random
>>> random.choice(['apple', 'pear', 'banana'])
'apple'
>>> random.sample(range(100), 10)   # 대체 없는 표본 추출
[30, 83, 16, 4, 8, 81, 41, 50, 18, 33]
>>> random.random()    # 범위 [0.0, 1.0) 내에서의 임의의 float
0.17970987693706186
>>> random.randrange(6)    # range(6) 에서 선택된 임의의 정수
4
@end example

@ref{d7,,statistics} 모듈은 수치 데이터의 기본적인 통계적 특성들을 (평균, 중간값, 분산, 등등) 계산합니다.

@example
>>> import statistics
>>> data = [2.75, 1.75, 1.25, 0.25, 0.5, 1.25, 3.5]
>>> statistics.mean(data)
1.6071428571428572
>>> statistics.median(data)
1.25
>>> statistics.variance(data)
1.3720238095238095
@end example

SciPy 프로젝트 <@indicateurl{https://scipy.org}> 는 다른 수치 계산용 모듈들을 많이 갖고 있습니다.

@node Internet access,Dates and times,수학,Brief tour of the standard library
@anchor{tutorial/stdlib internet-access}@anchor{20bf}@anchor{tutorial/stdlib tut-internet-access}@anchor{20c0}
@subsection Internet access


인터넷을 액세스하고 인터넷 프로토콜들을 처리하는 많은 모듈이 있습니다. 가장 간단한 두 개는 URL에서 데이터를 읽어오는 @ref{111,,urllib.request} 와 메일을 보내는 @ref{cf,,smtplib} 입니다:

@example
>>> from urllib.request import urlopen
>>> with urlopen('https://docs.python.org/3/') as response:
...     for line in response:
...         line = line.decode()             # Convert bytes to a str
...         if 'updated' in line:
...             print(line.rstrip())         # Remove trailing newline
...
      Last updated on Nov 11, 2025 (20:11 UTC).

>>> import smtplib
>>> server = smtplib.SMTP('localhost')
>>> server.sendmail('soothsayer@@example.org', 'jcaesar@@example.org',
... """To: jcaesar@@example.org
... From: soothsayer@@example.org
...
... Beware the Ides of March.
... """)
>>> server.quit()
@end example

(두 번째 예는 localhost 에서 메일 서버가 실행되고 있어야 한다는 것에 주의하세요.)

@node Dates and times,Data compression,Internet access,Brief tour of the standard library
@anchor{tutorial/stdlib dates-and-times}@anchor{20c1}@anchor{tutorial/stdlib tut-dates-and-times}@anchor{20c2}
@subsection Dates and times


@ref{34,,datetime} 모듈은 날짜와 시간을 조작하는 클래스들을 제공하는데, 간단한 방법과 복잡한 방법 모두 제공합니다. 날짜와 시간 산술이 지원되지만, 구현의 초점은 출력 포매팅과 조작을 위해 효율적으로 멤버를 추출하는 데에 맞춰져 있습니다. 모듈은 시간대를 고려하는 객체들도 지원합니다.

@example
>>> # dates are easily constructed and formatted
>>> import datetime as dt
>>> now = dt.date.today()
>>> now
datetime.date(2003, 12, 2)
>>> now.strftime("%m-%d-%y. %d %b %Y is a %A on the %d day of %B.")
'12-02-03. 02 Dec 2003 is a Tuesday on the 02 day of December.'

>>> # dates support calendar arithmetic
>>> birthday = dt.date(1964, 7, 31)
>>> age = now - birthday
>>> age.days
14368
@end example

@node Data compression,Performance measurement,Dates and times,Brief tour of the standard library
@anchor{tutorial/stdlib data-compression}@anchor{20c3}@anchor{tutorial/stdlib tut-data-compression}@anchor{20c4}
@subsection Data compression


일반적인 데이터 보관 및 압축 형식들을 다음과 같은 모듈들이 직접 지원합니다: @ref{139,,zlib}, @ref{6b,,gzip}, @ref{14,,bz2}, @ref{8e,,lzma}, @ref{137,,zipfile}, @ref{e4,,tarfile}.

@example
>>> import zlib
>>> s = b'witch which has which witches wrist watch'
>>> len(s)
41
>>> t = zlib.compress(s)
>>> len(t)
37
>>> zlib.decompress(t)
b'witch which has which witches wrist watch'
>>> zlib.crc32(s)
226805979
@end example

@node Performance measurement,Quality control,Data compression,Brief tour of the standard library
@anchor{tutorial/stdlib performance-measurement}@anchor{20c5}@anchor{tutorial/stdlib tut-performance-measurement}@anchor{20c6}
@subsection Performance measurement


일부 파이썬 사용자들은 같은 문제에 대한 다른 접근법들의 상대적인 성능을 파악하는데 깊은 관심을 두고 있습니다. 파이썬은 이런 질문들에 즉시 답을 주는 측정 도구를 제공합니다.

예를 들어, 인자들을 맞교환하는 전통적인 방식 대신에, 튜플 패킹과 언 패킹을 사용하고자 하는 유혹을 느낄 수 있습니다. @ref{f5,,timeit} 모듈은 적당한 성능 이점을 신속하게 보여줍니다:

@example
>>> from timeit import Timer
>>> Timer('t=a; a=b; b=t', 'a=1; b=2').timeit()
0.57535828626024577
>>> Timer('a,b = b,a', 'a=1; b=2').timeit()
0.54962537085770791
@end example

@ref{f5,,timeit} 의 정밀도와는 대조적으로, @ref{b4,,profile} 과 @ref{b5,,pstats} 모듈은 큰 블록의 코드에서 시간 임계 섹션을 식별하기 위한 도구들을 제공합니다.

@node Quality control,Batteries included,Performance measurement,Brief tour of the standard library
@anchor{tutorial/stdlib quality-control}@anchor{20c7}@anchor{tutorial/stdlib tut-quality-control}@anchor{20c8}
@subsection Quality control


고품질의 소프트웨어를 개발하는 한 가지 접근법은 개발되는 각 함수에 대한 테스트를 작성하고, 그것들을 개발 프로세스 중에 자주 실행하는 것입니다.

@ref{3e,,doctest} 모듈은 모듈을 훑어보고 프로그램의 독스트링들에 내장된 테스트들을 검사하는 도구를 제공합니다. 테스트 만들기는 평범한 호출을 그 결과와 함께 독스트링으로 복사해서 붙여넣기를 하는 수준으로 간단해집니다. 사용자에게 예제를 함께 제공해서 설명서를 개선하고, doctest 모듈이 설명서에서 코드가 여전히 사실인지 확인하도록 합니다.

@example
def average(values):
    """숫자 목록의 산술 평균을 계산합니다.

    >>> print(average([20, 30, 70]))
    40.0
    """
    return sum(values) / len(values)

import doctest
doctest.testmod()   # 내장된 테스트를 자동 검증합니다
@end example

@ref{10c,,unittest} 모듈은 @ref{3e,,doctest} 모듈만큼 쉬운 것은 아니지만, 더욱 포괄적인 테스트 집합을 별도의 파일로 관리할 수 있게 합니다:

@example
import unittest

class TestStatisticalFunctions(unittest.TestCase):

    def test_average(self):
        self.assertEqual(average([20, 30, 70]), 40.0)
        self.assertEqual(round(average([1, 5, 7]), 1), 4.3)
        with self.assertRaises(ZeroDivisionError):
            average([])
        with self.assertRaises(TypeError):
            average(20, 30, 70)

unittest.main()  # 명령행에서 호출하면 모든 테스트를 수행합니다
@end example

@node Batteries included,,Quality control,Brief tour of the standard library
@anchor{tutorial/stdlib batteries-included}@anchor{20c9}@anchor{tutorial/stdlib tut-batteries-included}@anchor{20ca}
@subsection Batteries included


파이썬은 “배터리가 포함됩니다” 철학을 갖고 있습니다. 이는 더 큰 패키지의 정교하고 강력한 기능을 통해 가장 잘 나타납니다. 예를 들어:


@itemize *

@item 
@ref{134,,xmlrpc.client} 와 @ref{135,,xmlrpc.server} 모듈은 원격 프로시저 호출을 구현하는 일을 거의 사소한 일로 만듭니다. 모듈의 이름에도 불구하고, XML에 대한 직접적인 지식이나 처리가 필요하지 않습니다.

@item 
The @ref{3f,,email} package is a library for managing email messages, including
MIME and other 
@geindex RFC; RFC 5322
RFC 5322@footnote{https://datatracker.ietf.org/doc/html/rfc5322.html}-based message documents. Unlike @ref{cf,,smtplib} and
@ref{b1,,poplib} which actually send and receive messages, the email package has
a complete toolset for building or decoding complex message structures
(including attachments) and for implementing internet encoding and header
protocols.

@item 
@ref{86,,json} 패키지는 널리 사용되는 데이터 교환 형식을 파싱하기위한 강력한 지원을 제공합니다. @ref{2d,,csv} 모듈은 데이터베이스와 스프레드시트에서 일반적으로 지원되는 쉼표로 구분된 값 형식으로 파일을 직접 읽고 쓸 수 있도록 지원합니다. XML 처리는 @ref{12b,,xml.etree.ElementTree}, @ref{127,,xml.dom} 및 @ref{12f,,xml.sax} 패키지에 의해 지원됩니다. 이러한 모듈과 패키지를 함께 사용하면 파이썬 응용 프로그램과 다른 도구 간의 데이터 교환이 크게 단순해집니다.

@item 
@ref{d4,,sqlite3} 모듈은 SQLite 데이터베이스 라이브러리의 래퍼인데, 약간 비표준 SQL 구문을 사용하여 업데이트되고 액세스 될 수 있는 퍼시스턴트 데이터베이스를 제공합니다.

@item 
국제화는 @ref{67,,gettext}, @ref{8a,,locale}, 그리고 @ref{1c,,codecs} 패키지를 포함한 많은 모듈에 의해 지원됩니다.
@end itemize

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 표준 라이브러리 둘러보기 — 2부,가상 환경 및 패키지,Brief tour of the standard library,파이썬 자습서
@anchor{tutorial/stdlib2 doc}@anchor{20cb}@anchor{tutorial/stdlib2 brief-tour-of-the-standard-library-part-ii}@anchor{20cc}@anchor{tutorial/stdlib2 translation-repo}@anchor{20cd}@anchor{tutorial/stdlib2 tut-brieftourtwo}@anchor{20ce}
@section 표준 라이브러리 둘러보기 — 2부


이 두 번째 둘러보기는 전문 프로그래밍 요구 사항을 지원하는 고급 모듈을 다루고 있습니다. 이러한 모듈은 작은 스크립트에서는 거의 사용되지 않습니다.

@menu
* 출력 포매팅:: 
* 템플릿:: 
* 바이너리 데이터 레코드 배치 작업:: 
* 다중 스레딩:: 
* 로깅:: 
* 약한 참조:: 
* 리스트 작업 도구:: 
* 10진 부동 소수점 산술:: 

@end menu

@node 출력 포매팅,템플릿,,표준 라이브러리 둘러보기 — 2부
@anchor{tutorial/stdlib2 output-formatting}@anchor{20cf}@anchor{tutorial/stdlib2 tut-output-formatting}@anchor{20d0}
@subsection 출력 포매팅


@ref{c0,,reprlib} 모듈은 크거나 깊게 중첩된 컨테이너의 축약 된 디스플레이를 위해 커스터마이즈된 @ref{1c1,,repr()} 의 버전을 제공합니다:

@example
>>> import reprlib
>>> reprlib.repr(set('supercalifragilisticexpialidocious'))
"@{'a', 'c', 'd', 'e', 'f', 'g', ...@}"
@end example

@ref{b3,,pprint} 모듈은 인터프리터가 읽을 수 있는 방식으로 내장 객체나 사용자 정의 객체를 인쇄하는 것을 보다 정교하게 제어할 수 있게 합니다. 결과가 한 줄보다 길면 “예쁜 프린터”가 줄 바꿈과 들여쓰기를 추가하여 데이터 구조를 보다 명확하게 나타냅니다:

@example
>>> import pprint
>>> t = [[[['black', 'cyan'], 'white', ['green', 'red']], [['magenta',
...     'yellow'], 'blue']]]
...
>>> pprint.pprint(t, width=30)
[[[['black', 'cyan'],
   'white',
   ['green', 'red']],
  [['magenta', 'yellow'],
   'blue']]]
@end example

@ref{f2,,textwrap} 모듈은 텍스트의 문단을 주어진 화면 너비에 맞게 포맷합니다:

@example
>>> import textwrap
>>> doc = """The wrap() method is just like fill() except that it returns
... a list of strings instead of one big string with newlines to separate
... the wrapped lines."""
...
>>> print(textwrap.fill(doc, width=40))
The wrap() method is just like fill()
except that it returns a list of strings
instead of one big string with newlines
to separate the wrapped lines.
@end example

@ref{8a,,locale} 모듈은 문화권 특정 데이터 포맷의 데이터베이스에 액세스합니다. locale의 format 함수의 grouping 어트리뷰트는 그룹 구분 기호로 숫자를 포매팅하는 직접적인 방법을 제공합니다:

@example
>>> import locale
>>> locale.setlocale(locale.LC_ALL, 'English_United States.1252')
'English_United States.1252'
>>> conv = locale.localeconv()          # 관례의 매핑을 얻습니다
>>> x = 1234567.8
>>> locale.format_string("%d", x, grouping=True)
'1,234,567'
>>> locale.format_string("%s%.*f", (conv['currency_symbol'],
...                      conv['frac_digits'], x), grouping=True)
'$1,234,567.80'
@end example

@node 템플릿,바이너리 데이터 레코드 배치 작업,출력 포매팅,표준 라이브러리 둘러보기 — 2부
@anchor{tutorial/stdlib2 templating}@anchor{20d1}@anchor{tutorial/stdlib2 tut-templating}@anchor{20d2}
@subsection 템플릿


@ref{d8,,string} 모듈은 다재다능한 @ref{896,,Template} 클래스를 포함하고 있는데, 최종 사용자가 편집하기에 적절한 단순한 문법을 갖고 있습니다. 따라서 사용자는 응용 프로그램을 변경하지 않고도 응용 프로그램을 커스터마이즈할 수 있습니다.

형식은 @code{$} 와 유효한 파이썬 식별자 (영숫자와 밑줄)로 만들어진 자리표시자 이름을 사용합니다. 중괄호를 사용하여 자리표시자를 둘러싸면 공백없이 영숫자가 뒤따르도록 할 수 있습니다. @code{$$} 을 쓰면 하나의 이스케이프 된 @code{$} 를 만듭니다:

@example
>>> from string import Template
>>> t = Template('$@{village@}folk send $$10 to $cause.')
>>> t.substitute(village='Nottingham', cause='the ditch fund')
'Nottinghamfolk send $10 to the ditch fund.'
@end example

@ref{20d3,,substitute()} 메서드는 자리표시자가 딕셔너리나 키워드 인자로 제공되지 않을 때 @ref{5e5,,KeyError} 를 일으킵니다. 메일 병합 스타일 응용 프로그램의 경우 사용자가 제공한 데이터가 불완전할 수 있으며 @ref{20d4,,safe_substitute()} 메서드가 더 적절할 수 있습니다. 데이터가 누락 된 경우 자리표시자를 변경하지 않습니다:

@example
>>> t = Template('Return the $item to $owner.')
>>> d = dict(item='unladen swallow')
>>> t.substitute(d)
Traceback (most recent call last):
  ...
KeyError: 'owner'
>>> t.safe_substitute(d)
'Return the unladen swallow to $owner.'
@end example

Template 서브 클래스는 사용자 정의 구분자를 지정할 수 있습니다. 예를 들어 사진 브라우저를 위한 일괄 이름 바꾸기 유틸리티는 현재 날짜, 이미지 시퀀스 번호 또는 파일 형식과 같은 자리표시자에 백분율 기호를 사용하도록 선택할 수 있습니다:

@example
>>> import time, os.path
>>> photofiles = ['img_1074.jpg', 'img_1076.jpg', 'img_1077.jpg']
>>> class BatchRename(Template):
...     delimiter = '%'
...
>>> fmt = input('Enter rename style (%d-date %n-seqnum %f-format):  ')
Enter rename style (%d-date %n-seqnum %f-format):  Ashley_%n%f

>>> t = BatchRename(fmt)
>>> date = time.strftime('%d%b%y')
>>> for i, filename in enumerate(photofiles):
...     base, ext = os.path.splitext(filename)
...     newname = t.substitute(d=date, n=i, f=ext)
...     print('@{0@} --> @{1@}'.format(filename, newname))

img_1074.jpg --> Ashley_0.jpg
img_1076.jpg --> Ashley_1.jpg
img_1077.jpg --> Ashley_2.jpg
@end example

템플릿의 또 다른 응용은 다중 출력 형식의 세부 사항에서 프로그램 논리를 분리하는 것입니다. 이렇게 하면 XML 파일, 일반 텍스트 보고서 및 HTML 웹 보고서에 대한 커스텀 템플릿을 치환할 수 있습니다.

@node 바이너리 데이터 레코드 배치 작업,다중 스레딩,템플릿,표준 라이브러리 둘러보기 — 2부
@anchor{tutorial/stdlib2 tut-binary-formats}@anchor{20d5}@anchor{tutorial/stdlib2 working-with-binary-data-record-layouts}@anchor{20d6}
@subsection 바이너리 데이터 레코드 배치 작업


@ref{db,,struct} 모듈은 가변 길이 바이너리 레코드 형식으로 작업하기 위한 @ref{147b,,pack()} 과 @ref{185d,,unpack()} 함수를 제공합니다. 다음 예제는 @ref{137,,zipfile} 모듈을 사용하지 않고 ZIP 파일의 헤더 정보를 루핑하는 법을 보여줍니다. 팩 코드 @code{"H"} 와 @code{"I"} 는 각각 2바이트와 4바이트의 부호 없는 숫자를 나타냅니다. @code{"<"} 는 표준 크기이면서 리틀 엔디안 바이트 순서를 가짐을 나타냅니다:

@example
import struct

with open('myfile.zip', 'rb') as f:
    data = f.read()

start = 0
for i in range(3):                      # 처음 3개의 파일 헤더를 보여줍니다
    start += 14
    fields = struct.unpack('<IIIHH', data[start:start+16])
    crc32, comp_size, uncomp_size, filenamesize, extra_size = fields

    start += 16
    filename = data[start:start+filenamesize]
    start += filenamesize
    extra = data[start:start+extra_size]
    print(filename, hex(crc32), comp_size, uncomp_size)

    start += extra_size + comp_size     # 다음 헤더로 건너뜁니다
@end example

@node 다중 스레딩,로깅,바이너리 데이터 레코드 배치 작업,표준 라이브러리 둘러보기 — 2부
@anchor{tutorial/stdlib2 multi-threading}@anchor{20d7}@anchor{tutorial/stdlib2 tut-multi-threading}@anchor{20d8}
@subsection 다중 스레딩


스레딩은 차례로 종속되지 않는 작업을 분리하는 기술입니다. 스레드는 다른 작업이 백그라운드에서 실행되는 동안 사용자 입력을 받는 응용 프로그램의 응답을 향상하는 데 사용할 수 있습니다. 관련된 사용 사례는 다른 스레드의 계산과 병렬로 I/O를 실행하는 경우입니다.

다음 코드는 메인 프로그램이 계속 실행되는 동안 고수준 @ref{f3,,threading} 모듈이 백그라운드에서 작업을 어떻게 수행할 수 있는지 보여줍니다:

@example
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()    # 백그라운드 작업이 끝날 때까지 기다립니다
print('Main program waited until background was done.')
@end example

다중 스레드 응용 프로그램의 가장 큰 문제점은 데이터 또는 다른 자원을 공유하는 스레드를 조정하는 것입니다. 이를 위해 threading 모듈은 록, 이벤트, 조건 변수 및 세마포어를 비롯한 많은 수의 동기화 기본 요소를 제공합니다.

이러한 도구는 강력하지만, 사소한 설계 오류로 인해 재현하기 어려운 문제가 발생할 수 있습니다. 따라서, 작업 조정에 대한 선호되는 접근 방식은 자원에 대한 모든 액세스를 단일 스레드에 집중시킨 다음 @ref{bb,,queue} 모듈을 사용하여 해당 스레드에 다른 스레드의 요청을 제공하는 것입니다. 스레드 간 통신 및 조정을 위한 @ref{1599,,Queue} 객체를 사용하는 응용 프로그램은 설계하기 쉽고, 읽기 쉽고, 신뢰성이 높습니다.

@node 로깅,약한 참조,다중 스레딩,표준 라이브러리 둘러보기 — 2부
@anchor{tutorial/stdlib2 logging}@anchor{20d9}@anchor{tutorial/stdlib2 tut-logging}@anchor{20da}
@subsection 로깅


@ref{8b,,logging} 모듈은 완전한 기능을 갖춘 유연한 로깅 시스템을 제공합니다. 가장 단순한 경우, 로그 메시지는 파일이나 @code{sys.stderr} 로 보내집니다:

@example
import logging
logging.debug('Debugging information')
logging.info('Informational message')
logging.warning('Warning:config file %s not found', 'server.conf')
logging.error('Error occurred')
logging.critical('Critical error -- shutting down')
@end example

그러면 다음과 같은 결과가 출력됩니다:

@example
WARNING:root:Warning:config file server.conf not found
ERROR:root:Error occurred
CRITICAL:root:Critical error -- shutting down
@end example

기본적으로 정보 및 디버깅 메시지는 표시되지 않고 출력은 표준 에러로 보내집니다. 다른 출력 옵션에는 전자 메일, 데이터 그램, 소켓 또는 HTTP 서버를 통한 메시지 라우팅이 포함됩니다. 새로운 필터는 메시지 우선순위에 따라 다른 라우팅을 선택할 수 있습니다: @ref{20db,,DEBUG}, @ref{20dc,,INFO}, @ref{20dd,,WARNING}, @ref{20de,,ERROR} , 그리고 @ref{20df,,CRITICAL}.

로깅 시스템은 파이썬에서 직접 구성하거나, 응용 프로그램을 변경하지 않고 사용자 정의 로깅을 위해 사용자가 편집할 수 있는 설정 파일에서 로드 할 수 있습니다.

@node 약한 참조,리스트 작업 도구,로깅,표준 라이브러리 둘러보기 — 2부
@anchor{tutorial/stdlib2 tut-weak-references}@anchor{20e0}@anchor{tutorial/stdlib2 weak-references}@anchor{20e1}
@subsection 약한 참조


파이썬은 자동 메모리 관리 (대부분 객체에 대한 참조 횟수 추적 및 순환을 제거하기 위한 @ref{17dd,,가비지 수거})를 수행합니다. 메모리는 마지막 참조가 제거된 직후에 해제됩니다.

이 접근법은 대부분의 응용 프로그램에서 잘 작동하지만, 때로는 다른 것들에 의해 사용되는 동안에만 객체를 추적해야 할 필요가 있습니다. 불행하게도, 단지 그것들을 추적하는 것만으로도 그들을 영구적으로 만드는 참조를 만듭니다. @ref{11a,,weakref} 모듈은 참조를 만들지 않고 객체를 추적할 수 있는 도구를 제공합니다. 객체가 더 필요하지 않으면 weakref 테이블에서 객체가 자동으로 제거되고 weakref 객체에 대한 콜백이 트리거됩니다. 일반적인 응용에는 만드는 데 비용이 많이 드는 개체 캐싱이 포함됩니다:

@example
>>> import weakref, gc
>>> class A:
...     def __init__(self, value):
...         self.value = value
...     def __repr__(self):
...         return str(self.value)
...
>>> a = A(10)                   # create a reference
>>> d = weakref.WeakValueDictionary()
>>> d['primary'] = a            # does not create a reference
>>> d['primary']                # fetch the object if it is still alive
10
>>> del a                       # remove the one reference
>>> gc.collect()                # run garbage collection right away
0
>>> d['primary']                # entry was automatically removed
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
    d['primary']                # entry was automatically removed
  File "C:/python314/lib/weakref.py", line 46, in __getitem__
    o = self.data[key]()
KeyError: 'primary'
@end example

@node 리스트 작업 도구,10진 부동 소수점 산술,약한 참조,표준 라이브러리 둘러보기 — 2부
@anchor{tutorial/stdlib2 tools-for-working-with-lists}@anchor{20e2}@anchor{tutorial/stdlib2 tut-list-tools}@anchor{20e3}
@subsection 리스트 작업 도구


내장 리스트 형으로 많은 데이터 구조 요구를 충족시킬 수 있습니다. 그러나 때로는 다른 성능 상충 관계가 있는 대안적 구현이 필요할 수도 있습니다.

@ref{8,,array} 모듈은 @ref{4c0,,array} 객체를 제공합니다. 이 객체는 등질적인 데이터만을 저장하고 보다 조밀하게 저장하는 리스트와 같습니다. 다음 예제는 파이썬 int 객체의 일반 리스트의 경우처럼 항목당 16바이트를 사용하는 대신에, 2바이트의 부호 없는 이진 숫자 (형 코드 @code{"H"})로 저장된 숫자 배열을 보여줍니다:

@example
>>> from array import array
>>> a = array('H', [4000, 10, 700, 22222])
>>> sum(a)
26932
>>> a[1:3]
array('H', [10, 700])
@end example

@ref{1e,,collections} 모듈은 @ref{7f3,,deque} 객체를 제공합니다. 이 객체는 왼쪽에서 더 빠르게 추가/팝하지만 중간에서의 조회는 더 느려진 리스트와 같습니다. 이 객체는 대기열 및 넓이 우선 트리 검색을 구현하는 데 적합합니다:

@example
>>> from collections import deque
>>> d = deque(["task1", "task2", "task3"])
>>> d.append("task4")
>>> print("Handling", d.popleft())
Handling task1
@end example

@example
unsearched = deque([starting_node])
def breadth_first_search(unsearched):
    node = unsearched.popleft()
    for m in gen_moves(node):
        if is_goal(m):
            return m
        unsearched.append(m)
@end example

대안적 리스트 구현 외에도 라이브러리는 정렬된 리스트를 조작하는 함수들이 있는 @ref{12,,bisect} 모듈과 같은 다른 도구를 제공합니다:

@example
>>> import bisect
>>> scores = [(100, 'perl'), (200, 'tcl'), (400, 'lua'), (500, 'python')]
>>> bisect.insort(scores, (300, 'ruby'))
>>> scores
[(100, 'perl'), (200, 'tcl'), (300, 'ruby'), (400, 'lua'), (500, 'python')]
@end example

@ref{6d,,heapq} 모듈은 일반 리스트를 기반으로 힙을 구현하는 함수를 제공합니다. 가장 값이 작은 항목은 항상 위치 0에 유지됩니다. 이것은 가장 작은 요소에 반복적으로 액세스하지만, 전체 목록 정렬을 실행하지 않으려는 응용에 유용합니다:

@example
>>> from heapq import heapify, heappop, heappush
>>> data = [1, 3, 5, 7, 9, 2, 4, 6, 8, 0]
>>> heapify(data)                      # 리스트를 힙 순서로 재배치합니다
>>> heappush(data, -5)                 # 새 항목을 추가합니다
>>> [heappop(data) for i in range(3)]  # 가장 작은 세 개의 항목을 가져옵니다
[-5, 0, 1]
@end example

@node 10진 부동 소수점 산술,,리스트 작업 도구,표준 라이브러리 둘러보기 — 2부
@anchor{tutorial/stdlib2 decimal-floating-point-arithmetic}@anchor{20e4}@anchor{tutorial/stdlib2 tut-decimal-fp}@anchor{20e5}
@subsection 10진 부동 소수점 산술


@ref{3a,,decimal} 모듈은 10진 부동 소수점 산술을 위한 @ref{1fe,,Decimal} 데이터형을 제공합니다. 내장 @ref{196,,float} 이진 부동 소수점 구현과 비교할 때, 클래스는 특히 다음과 같은 것들에 유용합니다


@itemize *

@item 
정확한 10진수 표현이 필요한 금융 응용 및 기타 용도,

@item 
정밀도 제어,

@item 
법적 또는 규제 요구 사항을 충족하는 반올림 제어,

@item 
유효숫자 추적, 또는

@item 
사용자가 결과가 손으로 계산한 것과 일치 할 것으로 기대하는 응용.
@end itemize

예를 들어, 70센트 전화 요금에 대해 5% 세금을 계산하면, 십진 부동 소수점 및 이진 부동 소수점에 다른 결과가 나타납니다. 결과를 가장 가까운 센트로 반올림하면 차이가 드러납니다:

@example
>>> from decimal import *
>>> round(Decimal('0.70') * Decimal('1.05'), 2)
Decimal('0.74')
>>> round(.70 * 1.05, 2)
0.73
@end example

@ref{1fe,,Decimal} 결과는 끝에 붙는 0을 유지하며, 두 개의 유효숫자를 가진 피승수로부터 네 자리의 유효숫자를 자동으로 추론합니다. Decimal은 손으로 한 수학을 재현하고 이진 부동 소수점이 십진수를 정확하게 표현할 수 없을 때 발생할 수 있는 문제를 피합니다.

정확한 표현은 @ref{1fe,,Decimal} 클래스가 이진 부동 소수점에 적합하지 않은 모듈로 계산과 동등성 검사를 수행할 수 있도록 합니다:

@example
>>> Decimal('1.00') % Decimal('.10')
Decimal('0.00')
>>> 1.00 % 0.10
0.09999999999999995

>>> sum([Decimal('0.1')]*10) == Decimal('1.0')
True
>>> 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 == 1.0
False
@end example

@ref{3a,,decimal} 모듈은 필요한 만큼의 정밀도로 산술을 제공합니다:

@example
>>> getcontext().prec = 36
>>> Decimal(1) / Decimal(7)
Decimal('0.142857142857142857142857142857142857')
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 가상 환경 및 패키지,이제 뭘 하지?,표준 라이브러리 둘러보기 — 2부,파이썬 자습서
@anchor{tutorial/venv doc}@anchor{20e6}@anchor{tutorial/venv translation-repo}@anchor{20e7}@anchor{tutorial/venv tut-venv}@anchor{20e8}@anchor{tutorial/venv virtual-environments-and-packages}@anchor{20e9}
@section 가상 환경 및 패키지


@menu
* 소개:: 
* 가상 환경 만들기:: 
* pip로 패키지 관리하기:: 

@end menu

@node 소개,가상 환경 만들기,,가상 환경 및 패키지
@anchor{tutorial/venv introduction}@anchor{20ea}
@subsection 소개


파이썬 응용 프로그램은 종종 표준 라이브러리의 일부로 제공되지 않는 패키지와 모듈을 사용합니다. 응용 프로그램에 특정 버전의 라이브러리가 필요할 수 있는데, 응용 프로그램에 특정 버그가 수정된 버전이 필요하거나, 라이브러리 인터페이스의 구식 버전을 사용하여 응용 프로그램을 작성할 수도 있기 때문입니다.

즉, 하나의 파이썬 설치가 모든 응용 프로그램의 요구 사항을 충족시키는 것이 불가능할 수도 있습니다. 응용 프로그램 A에 특정 모듈의 버전 1.0이 필요하지만, 응용 프로그램 B에 버전 2.0이 필요한 경우, 요구 사항이 충돌하고, 버전 1.0 또는 2.0을 설치하면 어느 한 응용 프로그램은 실행할 수 없게 됩니다.

이 문제에 대한 해결책은 @ref{20eb,,가상 환경} 을 만드는 것입니다. 이 가상 환경은 특정 버전 파이썬 설치와 여러 추가 패키지를 포함하는 완비된 디렉터리 트리입니다.

서로 다른 응용 프로그램은 서로 다른 가상 환경을 사용할 수 있습니다. 앞서 본 상충하는 요구 사항의 예를 해결하기 위해, 응용 프로그램 A에는 버전 1.0이 설치된 자체 가상 환경이 있고, 응용 프로그램 B에는 버전 2.0이 있는 다른 가상 환경이 있을 수 있습니다. 응용 프로그램 B에서 라이브러리를 버전 3.0으로 업그레이드해야 하는 경우, 응용 프로그램 A의 환경에 영향을 미치지 않습니다.

@node 가상 환경 만들기,pip로 패키지 관리하기,소개,가상 환경 및 패키지
@anchor{tutorial/venv creating-virtual-environments}@anchor{20ec}
@subsection 가상 환경 만들기


가상 환경을 만들고 관리하는 데 사용되는 모듈은 @ref{117,,venv} 라고 합니다. @code{venv} 는 명령이 실행된 (@ref{f16,,--version} 옵션으로 확인할 수 있는) 파이썬 버전을 설치합니다. 예를 들어, @code{python3.12}로 명령을 실행하면 버전 3.12가 설치됩니다.

가상 환경을 만들려면, 원하는 디렉터리를 결정하고, @ref{117,,venv} 모듈을 스크립트로 실행하는데 디렉터리 경로를 명령행 인자로 전달합니다:

@example
python -m venv tutorial-env
@end example

존재하지 않는다면 @code{tutorial-env} 디렉터리를 만들고, 그 안에 파이썬 인터프리터의 사본과 다양한 지원 파일이 들어있는 디렉터리들을 만듭니다.

가상 환경의 일반적인 디렉터리 위치는 @code{.venv}입니다. 이 이름은 디렉터리가 보통 셸에서 숨겨져 있도록 하므로, 디렉터리가 존재하는 이유를 설명하는 이름을 제공하면서도 방해받지 않습니다. 또한 일부 툴링(tooling)이 지원하는 @code{.env} 환경 변수 정의 파일과의 충돌을 방지합니다.

가상 환경을 만들었으면, 가상 환경을 활성화할 수 있습니다.

윈도우에서 이렇게 실행합니다:

@example
tutorial-env\Scripts\activate
@end example

Unix 또는 MacOS에서 이렇게 실행합니다:

@example
source tutorial-env/bin/activate
@end example

(이 스크립트는 bash 셸을 위해 작성된 것으로, @code{csh} 또는 @code{fish} 셸을 사용하는 경우에는, 대신 @code{activate.csh} 와 @code{activate.fish} 스크립트를 사용해야 합니다.)

가상 환경을 활성화하면, 셸의 프롬프트가 변경되어 사용 중인 가상 환경을 보여주고, 환경을 수정하여 @code{python} 을 실행하면 특정 버전의 파이썬이 실행되도록 합니다. 예를 들어:

@example
$ source ~/envs/tutorial-env/bin/activate
(tutorial-env) $ python
Python 3.5.1 (default, May  6 2016, 10:59:36)
  ...
>>> import sys
>>> sys.path
['@w{'}, '/usr/local/lib/python35.zip', ...,
'~/envs/tutorial-env/lib/python3.5/site-packages']
>>>
@end example

가상 환경을 비활성화하려면, 다음과 같이 터미널에 입력합니다:

@example
deactivate
@end example

.

@node pip로 패키지 관리하기,,가상 환경 만들기,가상 환경 및 패키지
@anchor{tutorial/venv managing-packages-with-pip}@anchor{20ed}
@subsection pip로 패키지 관리하기


@code{pip} 라는 프로그램을 사용하여 패키지를 설치, 업그레이드 및 제거할 수 있습니다. 기본적으로 @code{pip} 는 파이썬 패키지 색인@footnote{https://pypi.org}에서 패키지를 설치합니다. 웹 브라우저에서 파이썬 패키지 색인을 살펴볼 수 있습니다.

@code{pip} 는 “install”, “uninstall”, “freeze” 등 많은 부속 명령을 갖고 있습니다. (@code{pip} 에 대한 완전한 문서는 @ref{10f7,,파이썬 모듈 설치하기} 지침을 보면 됩니다.)

패키지 이름을 지정하여 최신 버전의 패키지를 설치할 수 있습니다:

@example
(tutorial-env) $ python -m pip install novas
Collecting novas
  Downloading novas-3.1.1.3.tar.gz (136kB)
Installing collected packages: novas
  Running setup.py install for novas
Successfully installed novas-3.1.1.3
@end example

패키지 이름 뒤에 @code{==} 과 버전 번호를 붙여 특정 버전의 패키지를 설치할 수도 있습니다:

@example
(tutorial-env) $ python -m pip install requests==2.6.0
Collecting requests==2.6.0
  Using cached requests-2.6.0-py2.py3-none-any.whl
Installing collected packages: requests
Successfully installed requests-2.6.0
@end example

이 명령을 다시 실행하면, @code{pip} 는 요청한 버전이 이미 설치되어 있음을 알리고, 아무것도 하지 않습니다. 다른 버전 번호를 지정해서 그 버전을 얻거나 @code{python -m pip install --upgrade} 를 실행하여 패키지를 최신 버전으로 업그레이드할 수 있습니다:

@example
(tutorial-env) $ python -m pip install --upgrade requests
Collecting requests
Installing collected packages: requests
  Found existing installation: requests 2.6.0
    Uninstalling requests-2.6.0:
      Successfully uninstalled requests-2.6.0
Successfully installed requests-2.7.0
@end example

@code{python -m pip uninstall} 다음에 하나 이상의 패키지 이름이 오면 가상 환경에서 패키지가 제거됩니다.

@code{python -m pip show} 는 특정 패키지에 대한 정보를 표시합니다:

@example
(tutorial-env) $ python -m pip show requests
---
Metadata-Version: 2.0
Name: requests
Version: 2.7.0
Summary: Python HTTP for Humans.
Home-page: http://python-requests.org
Author: Kenneth Reitz
Author-email: me@@kennethreitz.com
License: Apache 2.0
Location: /Users/akuchling/envs/tutorial-env/lib/python3.4/site-packages
Requires:
@end example

@code{python -m pip list} 는 가상 환경에 설치된 모든 패키지를 표시합니다:

@example
(tutorial-env) $ python -m pip list
novas (3.1.1.3)
numpy (1.9.2)
pip (7.0.3)
requests (2.7.0)
setuptools (16.0)
@end example

@code{python -m pip freeze} 는 설치된 패키지의 비슷한 목록을 만들지만, @code{python -m pip install} 이 기대하는 형식을 사용합니다. 일반적인 규칙은 이 목록을 @code{requirements.txt} 파일에 넣는 것입니다:

@example
(tutorial-env) $ python -m pip freeze > requirements.txt
(tutorial-env) $ cat requirements.txt
novas==3.1.1.3
numpy==1.9.2
requests==2.7.0
@end example

@code{requirements.txt} 는 버전 제어에 커밋되어 응용 프로그램 일부로 제공될 수 있습니다. 사용자는 @code{install -r} 로 모든 필요한 패키지를 설치할 수 있습니다:

@example
(tutorial-env) $ python -m pip install -r requirements.txt
Collecting novas==3.1.1.3 (from -r requirements.txt (line 1))
  ...
Collecting numpy==1.9.2 (from -r requirements.txt (line 2))
  ...
Collecting requests==2.7.0 (from -r requirements.txt (line 3))
  ...
Installing collected packages: novas, numpy, requests
  Running setup.py install for novas
Successfully installed novas-3.1.1.3 numpy-1.9.2 requests-2.7.0
@end example

@code{pip} 에는 더 많은 옵션이 있습니다. @code{pip} 에 대한 완전한 문서는 @ref{10f7,,파이썬 모듈 설치하기} 지침을 참고하세요. 패키지를 작성했을 때 파이썬 패키지 색인에서 사용할 수 있게 하려면, Python packaging user guide@footnote{https://packaging.python.org/en/latest/tutorials/packaging-projects/}를 참고하세요.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 이제 뭘 하지?,대화형 입력 편집 및 히스토리 치환,가상 환경 및 패키지,파이썬 자습서
@anchor{tutorial/whatnow doc}@anchor{20ee}@anchor{tutorial/whatnow translation-repo}@anchor{20ef}@anchor{tutorial/whatnow tut-whatnow}@anchor{20f0}@anchor{tutorial/whatnow what-now}@anchor{20f1}
@section 이제 뭘 하지?


이 자습서를 읽어서 아마도 파이썬 사용에 관한 관심이 높아졌을 것입니다 — 실제 문제를 해결하기 위해 파이썬을 적용하려고 열망해야 합니다. 더 배우려면 어디로 가야 할까?

이 자습서는 파이썬의 문서 세트의 일부입니다. 세트의 다른 문서는 다음과 같습니다:


@itemize *

@item 
@ref{149,,파이썬 표준 라이브러리}:

표준 라이브러리의 형, 함수 및 모듈에 대한 완전한 (비록 딱딱하지만) 레퍼런스 자료를 제공하는 이 설명서를 탐색해야 합니다. 표준 파이썬 배포판에는 추가 코드가 `많이' 포함되어 있습니다. 유닉스 우편함을 읽고, HTTP를 통해 문서를 검색하고, 난수를 만들고, 명령행 옵션을 파싱하고, 데이터를 압축하고, 기타 많은 작업을 수행하는 모듈이 있습니다. 라이브러리 레퍼런스를 훑어보면 어떤 것이 있는지 알 수 있습니다.

@item 
@ref{10f7,,파이썬 모듈 설치하기} 는 다른 파이썬 사용자가 작성한 추가 모듈을 설치하는 방법을 설명합니다.

@item 
@ref{14a,,파이썬 언어 레퍼런스}: 파이썬의 문법과 의미에 대한 자세한 설명. 읽기에 부담스럽지만, 언어 자체에 대한 완전한 안내서로서 유용합니다.
@end itemize

기타 파이썬 자료:


@itemize *

@item 
@indicateurl{https://www.python.org}:  The major Python website.  It contains code,
documentation, and pointers to Python-related pages around the web.

@item 
@indicateurl{https://docs.python.org}: 파이썬의 설명서에 빠르게 액세스할 수 있습니다.

@item 
@indicateurl{https://pypi.org}: 이전에 치즈 가게(Cheese Shop)로도 불렸던 @footnote{
“Cheese Shop” is a Monty Python sketch: a customer enters a cheese shop,
but whatever cheese he asks for, the clerk says it’s missing.
} 파이썬 패키지 인덱스는 내려받을 수 있는 사용자 제작 파이썬 모듈의 색인입니다. 코드를 배포하기 시작하면 다른 사람들이 찾을 수 있도록 여기에 코드를 등록할 수 있습니다.

@item 
@indicateurl{https://code.activestate.com/recipes/langs/python/}: 파이썬 요리책(Python Cookbook)은 많은 코드 예제, 더 큰 모듈 및 유용한 스크립트 모음입니다. 특히 주목할만한 공헌들을 Python Cookbook (O’Reilly & Associates, ISBN 0-596-00797-3)이라는 제목의 책에 모았습니다.

@item 
@indicateurl{https://pyvideo.org} 는 콘퍼런스 및 사용자 그룹 회의에서 파이썬 관련 비디오에 대한 링크들을 수집합니다.

@item 
@indicateurl{https://scipy.org}: Scientific Python 프로젝트에는 빠른 배열 계산 및 조작을 위한 모듈들과 선형 대수, 푸리에 변환, 비선형 솔버, 난수 분포, 통계 분석 등과 같은 여러 가지 패키지들이 포함되어 있습니다.
@end itemize

파이썬 관련 질문 및 문제 보고의 경우, 뉴스 그룹 @code{comp.lang.python} 에 게시하거나 @email{python-list@@python.org} 의 메일링 리스트로 보낼 수 있습니다. 뉴스 그룹과 메일링 리스트는 게이트웨이로 연결되어 있으므로 하나에 게시된 메시지는 자동으로 다른 그룹으로 전달됩니다. 하루에 수백 건의 게시물이 올라옵니다. 질문하고, 질문에 답변하고, 새로운 기능을 제안하고, 새로운 모듈을 발표합니다. 메일링 리스트 저장소는 @indicateurl{https://mail.python.org/pipermail/} 에 있습니다.

게시하기 전에 @ref{20f2,,자주 나오는 질문들} (FAQ라고도 한다) 목록을 확인해야 합니다. FAQ는 반복적으로 나타나는 많은 질문에 대한 답을 제공하며, 이미 여러분의 문제에 대한 해결 방법을 담고 있을 수 있습니다.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 대화형 입력 편집 및 히스토리 치환,부동 소수점 산술 문제점 및 한계,이제 뭘 하지?,파이썬 자습서
@anchor{tutorial/interactive doc}@anchor{20f3}@anchor{tutorial/interactive interactive-input-editing-and-history-substitution}@anchor{20f4}@anchor{tutorial/interactive translation-repo}@anchor{20f5}@anchor{tutorial/interactive tut-interacting}@anchor{1fc7}
@section 대화형 입력 편집 및 히스토리 치환


일부 파이썬 인터프리터 버전은 Korn 셸 및 GNU Bash 셸에 있는 기능과 유사하게 현재 입력 줄 편집 및 히스토리 치환을 지원합니다. 이는 다양한 스타일의 편집을 지원하는 GNU Readline@footnote{https://tiswww.case.edu/php/chet/readline/rltop.html} 라이브러리를 사용하여 구현됩니다. 이 라이브러리에는 자체 설명서가 있고, 여기에서 반복하지는 않습니다.

@menu
* 탭 완성 및 히스토리 편집:: 
* 대화형 인터프리터 대안:: 

@end menu

@node 탭 완성 및 히스토리 편집,대화형 인터프리터 대안,,대화형 입력 편집 및 히스토리 치환
@anchor{tutorial/interactive tab-completion-and-history-editing}@anchor{20f6}@anchor{tutorial/interactive tut-keybindings}@anchor{20f7}
@subsection 탭 완성 및 히스토리 편집


변수와 모듈 이름의 완성은 인터프리터 시작 시 @ref{11c8,,자동으로 활성화} 되어서 @code{Tab} 키가 완료 기능을 호출합니다; 파이썬 명령문 이름, 현재 지역 변수 및 사용 가능한 모듈 이름을 찾습니다. @code{string.a} 와 같은 점으로 구분된 표현식의 경우, 표현식을 마지막 @code{'.'} 까지 값을 구한 다음, 결과 객체의 어트리뷰트로 완성을 제안합니다. @ref{6f9,,__getattr__()} 메서드를 가진 객체가 표현식의 일부면 응용 프로그램이 정의한 코드를 실행할 수 있음에 주의해야 합니다. 기본 설정은 사용자 디렉터리에 @code{.python_history} 라는 파일로 히스토리를 저장합니다. 다음 대화형 인터프리터 세션에서 히스토리를 다시 사용할 수 있습니다.

@node 대화형 인터프리터 대안,,탭 완성 및 히스토리 편집,대화형 입력 편집 및 히스토리 치환
@anchor{tutorial/interactive alternatives-to-the-interactive-interpreter}@anchor{20f8}@anchor{tutorial/interactive tut-commentary}@anchor{20f9}
@subsection 대화형 인터프리터 대안


이 기능은 이전 버전의 인터프리터에 비교했을 때 엄청난 발전입니다; 그러나, 몇 가지 아쉬움이 남습니다: 이어지는 줄에 적절한 들여쓰기가 제안된다면 좋을 것입니다 (구문 분석기는 다음에 들여쓰기(@ref{20fa,,INDENT}) 토큰이 필요한지 알 수 있습니다). 완성 메커니즘은 인터프리터의 심볼 테이블을 사용할 수 있습니다. 일치하는 괄호, 따옴표 등을 검사하는 (또는 제안하는) 명령도 유용할 것입니다.

꽤 오랫동안 사용됐던 개선된 대화형 인터프리터는 IPython@footnote{https://ipython.org/} 인데, 탭 완성, 객체 탐색 및 고급 히스토리 관리 기능을 갖추고 있습니다. 또한, 철저하게 커스터마이즈해서 다른 응용 프로그램에 내장할 수 있습니다. 비슷한 또 다른 개선된 대화형 환경은 bpython@footnote{https://bpython-interpreter.org/} 입니다.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c import math
@c from fractions import Fraction

@node 부동 소수점 산술 문제점 및 한계,부록,대화형 입력 편집 및 히스토리 치환,파이썬 자습서
@anchor{tutorial/floatingpoint doc}@anchor{20fb}@anchor{tutorial/floatingpoint floating-point-arithmetic-issues-and-limitations}@anchor{20fc}@anchor{tutorial/floatingpoint translation-repo}@anchor{20fd}@anchor{tutorial/floatingpoint tut-fp-issues}@anchor{20fe}
@section 부동 소수점 산술: 문제점 및 한계


부동 소수점 숫자는 컴퓨터 하드웨어에서 밑(base)이 2인(이진) 소수로 표현됩니다. 예를 들어, `십진' 소수 @code{0.625}는 값 6/10 + 2/100 + 5/1000 를 가지며, 같은 방식으로 `이진' 소수 @code{0.101} 는 값 1/2 + 0/4 + 1/8 을 가집니다. 이 두 소수는 같은 값을 가지며, 유일한 차이점은 첫 번째가 밑이 10인 분수 표기법으로 작성되었고 두 번째는 밑이 2라는 것입니다.

불행히도, 대부분의 십진 소수는 정확하게 이진 소수로 표현될 수 없습니다. 결과적으로, 일반적으로 입력하는 십진 부동 소수점 숫자가 실제로 기계에 저장될 때는 이진 부동 소수점 수로 근사 될 뿐입니다.

이 문제는 먼저 밑 10에서 따져보는 것이 이해하기 쉽습니다. 분수 1/3을 생각해봅시다. 이 값을 십진 소수로 근사할 수 있습니다:

@example
0.3
@end example

또는, 더 정확하게,

@example
0.33
@end example

또는, 더 정확하게,

@example
0.333
@end example

등등. 아무리 많은 자릿수를 적어도 결과가 정확하게 1/3이 될 수 없지만, 점점 더 1/3에 가까운 근사치가 됩니다.

같은 방식으로, 아무리 많은 자릿수의 숫자를 사용해도, 십진수 0.1은 이진 소수로 정확하게 표현될 수 없습니다. 이진법에서, 1/10은 무한히 반복되는 소수입니다

@example
0.0001100110011001100110011001100110011001100110011...
@end example

유한 한 비트 수에서 멈추면, 근삿값을 얻게 됩니다. 오늘날 대부분 기계에서, float는 이진 분수로 근사 되는 데, 최상위 비트로부터 시작하는 53비트를 분자로 사용하고, 2의 거듭제곱 수를 분모로 사용합니다. 1/10의 경우, 이진 분수는 @code{3602879701896397 / 2 ** 55} 인데, 실제 값 1/10과 거의 같지만 정확히 같지는 않습니다.

많은 사용자는 값이 표시되는 방식 때문에 근사를 인식하지 못합니다. 파이썬은 기계에 저장된 이진 근삿값의 진짜 십진 값에 대한 십진 근삿값을 인쇄할 뿐입니다. 대부분 기계에서, 만약 파이썬이 0.1로 저장된 이진 근삿값의 진짜 십진 값을 출력한다면 다음과 같이 표시해야 합니다:

@example
>>> 0.1
0.1000000000000000055511151231257827021181583404541015625
@end example

이것은 대부분 사람이 유용하다고 생각하는 것보다 많은 숫자이므로, 파이썬은 반올림된 값을 대신 표시하여 숫자를 다룰만하게 만듭니다:

@example
>>> 1 / 10
0.1
@end example

인쇄된 결과가 정확히 1/10인 것처럼 보여도, 실제 저장된 값은 가장 가까운 표현 가능한 이진 소수임을 기억하세요.

흥미롭게도, 가장 가까운 근사 이진 소수를 공유하는 여러 다른 십진수가 있습니다. 예를 들어, @code{0.1} 과 @code{0.10000000000000001} 및 @code{0.1000000000000000055511151231257827021181583404541015625} 는 모두 @code{3602879701896397 / 2 ** 55} 로 근사 됩니다. 이 십진 값들이 모두 같은 근삿값을 공유하기 때문에 @code{eval(repr(x)) == x} 불변을 그대로 유지하면서 그중 하나를 표시할 수 있습니다.

역사적으로, 파이썬 프롬프트와 내장 @ref{1c1,,repr()} 함수는 유효 숫자 17개의 숫자인 @code{0.10000000000000001} 을 선택합니다. 파이썬 3.1부터, 이제 파이썬(대부분 시스템에서)이 가장 짧은 것을 선택할 수 있으며, 단순히 @code{0.1} 만 표시합니다.

이것이 이진 부동 소수점의 본질임에 주목하세요: 파이썬의 버그는 아니며, 여러분의 코드에 있는 버그도 아닙니다. 하드웨어의 부동 소수점 산술을 지원하는 모든 언어에서 같은 종류의 것을 볼 수 있습니다 (일부 언어는 기본적으로 혹은 모든 출력 모드에서 차이를 `표시하지' 않을 수 있지만).

좀 더 만족스러운 결과를 얻으려면, 문자열 포매팅을 사용하여 제한된 수의 유효 숫자를 생성할 수 있습니다:

@example
>>> format(math.pi, '.12g')  # 12자리 유효숫자
'3.14159265359'

>>> format(math.pi, '.2f')   # 소수점 뒤로 2자리
'3.14'

>>> repr(math.pi)
'3.141592653589793'
@end example

이것이, 진정한 의미에서, 환영임을 깨닫는 것이 중요합니다: 여러분은 단순히 진짜 기곗값의 `표시' 를 반올림하고 있습니다.

하나의 환상은 다른 환상을 낳을 수 있습니다. 예를 들어, 0.1은 정확히 1/10이 아니므로, 0.1의 세 개를 합한 것 역시 정확히 0.3이 아닙니다:

@example
>>> 0.1 + 0.1 + 0.1 == 0.3
False
@end example

또한, 0.1은 1/10의 정확한 값에 더 가까워질 수 없고, 0.3도 3/10의 정확한 값에 더 가까워질 수 없으므로, @ref{14df,,round()} 함수로 미리 반올림하는 것은 도움이 되지 않습니다:

@example
>>> round(0.1, 1) + round(0.1, 1) + round(0.1, 1) == round(0.3, 1)
False
@end example

숫자를 의도한 정확한 값에 더 가깝게 만들 수는 없지만, @ref{faf,,math.isclose()} 함수는 부정확한 값을 비교할 때 유용할 수 있습니다:

@example
>>> math.isclose(0.1 + 0.1 + 0.1, 0.3)
True
@end example

또는, @ref{14df,,round()} 함수를 사용하여 대략적인 근사치를 비교할 수 있습니다:

@example
>>> round(math.pi, ndigits=2) == round(22 / 7, ndigits=2)
True
@end example

이진 부동 소수점 산술은 이처럼 많은 놀라움을 안겨줍니다. “0.1”의 문제는 아래의 “표현 오류” 섹션에서 자세하게 설명합니다. 이진 부동 소수점의 작동 방식과 실무에서 흔히 발생하는 문제 유형에 대한 재미있는 요약은 부동 소수점 문제의 예@footnote{https://jvns.ca/blog/2023/01/13/examples-of-floating-point-problems/}를 참조하세요. 또한 다른 일반적인 놀라움에 대한 더 완전한 설명은 부동 소수점의 위험@footnote{http://www.indowsway.com/floatingpoint.htm}을 참조하세요.

끝이 가까이 오면 말하듯이, “쉬운 답은 없습니다.” 아직, 부동 소수점수를 지나치게 경계할 필요는 없습니다! 파이썬 float 연산의 에러는 부동 소수점 하드웨어에서 상속된 것이고, 대부분 기계에서는 연산당 2**53분의 1을 넘지 않는 규모입니다. 이것은 대부분 작업에서 필요한 수준 이상입니다. 하지만, 십진 산술이 아니며 모든 float 연산에 새로운 반올림 에러가 발생할 수 있다는 점을 명심해야 합니다.

병리학적 경우가 존재하지만, 무심히 부동 소수점 산술을 사용하는 대부분은, 단순히 최종 결과를 기대하는 자릿수로 반올림해서 표시하면 기대하는 결과를 보게 될 것입니다. 보통 @ref{169,,str()} 만으로도 충분하며, 더 세밀하게 제어하려면 @ref{15a0,,Format string syntax} 에서 @ref{832,,str.format()} 메서드의 포맷 지정자를 보세요.

정확한 십진 표현이 필요한 사용 사례의 경우, 회계 응용 프로그램 및 고정밀 응용 프로그램에 적합한 십진 산술을 구현하는 @ref{3a,,decimal} 모듈을 사용해보세요.

정확한 산술의 또 다른 형태는 유리수를 기반으로 산술을 구현하는 @ref{61,,fractions} 모듈에 의해 지원됩니다 (따라서 1/3과 같은 숫자는 정확하게 나타낼 수 있습니다).

부동 소수점 연산을 많이 하는 사용자면 NumPy 패키지와 SciPy 프로젝트에서 제공하는 수학 및 통계 연산을 위한 다른 많은 패키지를 살펴봐야 합니다. <@indicateurl{https://scipy.org}> 를 보세요.

파이썬은 여러분이 float의 정확한 값을 진짜로 `알아야 하는' 드문 경우를 지원할 수 있는 도구들을 제공합니다. @ref{20ff,,float.as_integer_ratio()} 메서드는 float의 값을 분수로 표현합니다:

@example
>>> x = 3.14159
>>> x.as_integer_ratio()
(3537115888337719, 1125899906842624)
@end example

비율은 정확한 값이기 때문에, 원래 값을 손실 없이 다시 만드는 데 사용할 수 있습니다:

@example
>>> x == 3537115888337719 / 1125899906842624
True
@end example

@ref{2100,,float.hex()} 메서드는 float를 16진수(밑이 16이다)로 표현하는데, 컴퓨터에 저장된 정확한 값을 줍니다:

@example
>>> x.hex()
'0x1.921f9f01b866ep+1'
@end example

이 정확한 16진수 표현은 float 값을 정확하게 재구성하는 데 사용할 수 있습니다:

@example
>>> x == float.fromhex('0x1.921f9f01b866ep+1')
True
@end example

표현이 정확하므로, 파이썬의 다른 버전 에 걸쳐 값을 신뢰성 있게 이식하고 (플랫폼 독립성), 같은 형식을 지원하는 다른 언어(자바나 C99 같은)와 데이터를 교환하는 데 유용합니다.

또 다른 유용한 도구는 @ref{694,,sum()} 함수입니다. 이 함수는 합산하는 동안 정밀도 상실을 완화합니다. 값이 누계에 더해질 때 중간 반올림 단계에서 확장 정밀도를 사용합니다. 최종 합계에 영향을 주는 지점까지 에러가 누적되지 않아서 전체적인 정확도에 차이를 만들 수 있습니다:

@example
>>> 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 == 1.0
False
>>> sum([0.1] * 10) == 1.0
True
@end example

@ref{15d9,,math.fsum()}은 더 나아가, 누계에 값이 더해질 때 모든 “잃어버린 숫자들”을 추적하여, 결과가 한 번만 반올림되도록 합니다. 이는 @ref{694,,sum()}보다 느리지만, 큰 값의 입력이 대부분 서로 상쇄되어, 최종 합이 0에 가까와지는 드문 경우에 더 정확합니다:

@example
>>> arr = [-0.10430216751806065, -266310978.67179024, 143401161448607.16,
...        -143401161400469.7, 266262841.31058735, -0.003244936839808227]
>>> float(sum(map(Fraction, arr)))   # 정확한 함계에 단일 반올림
8.042173697819788e-13
>>> math.fsum(arr)                   # 단일 반올림
8.042173697819788e-13
>>> sum(arr)                         # 확장 정밀도로 다중 반올림
8.042178034628478e-13
>>> total = 0.0
>>> for x in arr:
...     total += x                   # 표준 정밀도로 다중 반올림
...
>>> total                            # 단순 합산은 올바른 결과를 주지 않습니다!
-0.0051575902860057365
@end example

@menu
* 표현 오류:: 

@end menu

@node 표현 오류,,,부동 소수점 산술 문제점 및 한계
@anchor{tutorial/floatingpoint representation-error}@anchor{2101}@anchor{tutorial/floatingpoint tut-fp-error}@anchor{2102}
@subsection 표현 오류


이 섹션에서는 “0.1” 예제를 자세히 설명하고, 이러한 사례에 대한 정확한 분석을 여러분이 직접 수행하는 방법을 보여줍니다. 이진 부동 소수점 표현에 대한 기본 지식이 있다고 가정합니다.

`표현 오류 (Representation error)' 는 일부 (실제로는, 대부분의) 십진 소수가 이진(밑 2) 소수로 정확하게 표현될 수 없다는 사실을 나타냅니다. 이것이 파이썬(또는 펄, C, C++, 자바, 포트란 및 기타 여러 언어)이 종종 여러분이 기대하는 정확한 십진수를 표시하지 않는 주된 이유입니다.

왜 그럴까? 1/10은 이진 소수로 정확히 표현할 수 없습니다. 적어도 2000년 이후, 거의 모든 기계는 IEEE 754 이진 부동 소수점 산술을 사용하고, 거의 모든 플랫폼은 파이썬 float를 IEEE 754 binary64 “배정밀도”에 매핑합니다. IEEE 754 binary64 값은 53비트의 정밀도가 포함되어 있어서, 입력 시 컴퓨터는 0.1을 `J'/2**`N' 형태의 가장 가까운 분수로 변환하려고 노력합니다. 여기서 `J' 는 정확히 53비트를 포함하는 정수입니다.:

@example
1 / 10 ~= J / (2**N)
@end example

를

@example
J ~= 2**N / 10
@end example

로 다시 쓰고, `J' 가 정확히 53 비트(@code{>= 2**52} 이지만 @code{< 2**53} 입니다)임을 고려하면, `N' 의 최적값은 56입니다:

@example
>>> 2**52 <=  2**56 // 10  < 2**53
True
@end example

즉, 56은 `J' 가 정확히 53비트가 되도록 만드는 `N' 의 유일한 값입니다. `J' 의 가능한 값 중 가장 좋은 것은 반올림한 몫입니다:

@example
>>> q, r = divmod(2**56, 10)
>>> r
6
@end example

나머지가 10의 절반보다 크므로, 가장 가까운 근삿값은 올림 해서 얻어집니다:

@example
>>> q+1
7205759403792794
@end example

따라서 IEEE 754 배정밀도로 1/10 에 가장 가까운 근삿값은 다음과 같습니다:

@example
7205759403792794 / 2 ** 56
@end example

분자와 분모를 둘로 나누면 다음과 같이 약분됩니다:

@example
3602879701896397 / 2 ** 55
@end example

올림을 했기 때문에, 이것은 실제로 1/10 보다 약간 크다는 것에 유의하세요; 내림을 했다면, 몫이 1/10 보다 약간 작아졌을 것입니다. 그러나 어떤 경우에도 `정확하게' 1/10일 수는 없습니다!

따라서 컴퓨터는 결코 1/10을 “보지” 못합니다: 볼 수 있는 것은 위에서 주어진 정확한 분수, 얻을 수 있는 최선의 IEEE 754 배정밀도 근삿값입니다:

@example
>>> 0.1 * 2 ** 55
3602879701896397.0
@end example

그 분수에 10**55를 곱하면, 55개의 십진 숫자를 볼 수 있습니다:

@example
>>> 3602879701896397 * 10 ** 55 // 2 ** 55
1000000000000000055511151231257827021181583404541015625
@end example

이는 컴퓨터에 저장된 정확한 숫자가 십진수 0.1000000000000000055511151231257827021181583404541015625와 같음을 의미합니다. 전체 십진법 값을 표시하는 대신, 많은 언어(이전 버전의 파이썬 포함)는 결과를 17개의 유효숫자로 반올림합니다:

@example
>>> format(0.1, '.17f')
'0.10000000000000001'
@end example

@ref{61,,fractions} 와 @ref{3a,,decimal} 모듈은 이 계산을 쉽게 만듭니다:

@example
>>> from decimal import Decimal
>>> from fractions import Fraction

>>> Fraction.from_float(0.1)
Fraction(3602879701896397, 36028797018963968)

>>> (0.1).as_integer_ratio()
(3602879701896397, 36028797018963968)

>>> Decimal.from_float(0.1)
Decimal('0.1000000000000000055511151231257827021181583404541015625')

>>> format(Decimal.from_float(0.1), '.17')
'0.10000000000000001'
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 부록,,부동 소수점 산술 문제점 및 한계,파이썬 자습서
@anchor{tutorial/appendix doc}@anchor{2103}@anchor{tutorial/appendix appendix}@anchor{2104}@anchor{tutorial/appendix translation-repo}@anchor{2105}@anchor{tutorial/appendix tut-appendix}@anchor{2106}
@section 부록


@menu
* 대화형 모드: 대화형 모드<2>. 

@end menu

@node 대화형 모드<2>,,,부록
@anchor{tutorial/appendix interactive-mode}@anchor{2107}@anchor{tutorial/appendix tut-interac}@anchor{495}
@subsection 대화형 모드


There are two variants of the interactive @ref{492,,REPL}.  The classic
basic interpreter is supported on all platforms with minimal line
control capabilities.

Since Python 3.13, a new interactive shell is used by default.
This one supports color, multiline editing, history browsing, and
paste mode.  To disable color, see @ref{1b7,,Controlling color} for
details.  Function keys provide some additional functionality.
@code{F1} enters the interactive help browser @ref{ba,,pydoc}.
@code{F2} allows for browsing command-line history with neither output nor the
@ref{493,,>>>} and @ref{494,,…} prompts. @code{F3} enters “paste mode”, which
makes pasting larger blocks of code easier. Press @code{F3} to return to
the regular prompt.

When using the new interactive shell, exit the shell by typing @code{exit}
or @code{quit}. Adding call parentheses after those commands is not
required.

If the new interactive shell is not desired, it can be disabled via
the 
@geindex PYTHON_BASIC_REPL
@geindex 환경 변수; PYTHON_BASIC_REPL
@ref{1b6,,PYTHON_BASIC_REPL} environment variable.

@menu
* 에러 처리:: 
* 실행 가능한 파이썬 스크립트:: 
* 대화형 시작 파일:: 
* 커스터마이제이션 모듈:: 

@end menu

@node 에러 처리,실행 가능한 파이썬 스크립트,,대화형 모드<2>
@anchor{tutorial/appendix error-handling}@anchor{2108}@anchor{tutorial/appendix tut-error}@anchor{2109}
@subsubsection 에러 처리


에러가 발생하면 인터프리터는 에러 메시지와 스택 트레이스를 인쇄합니다. 대화형 모드에서는 기본 프롬프트로 돌아갑니다; 파일로부터 입력이 왔을 때는, 스택 트레이스를 인쇄한 후 0이 아닌 종료 상태로 종료합니다. (@ref{8f7,,try} 문에서 @ref{1ab,,except} 절에 의해 처리되는 예외는 이 문맥에서 에러가 아닙니다.) 일부 에러는 무조건 치명적이며 0이 아닌 종료 상태의 종료를 유발합니다; 이것은 내부 불일치와 메모리 부족으로 인한 경우에 적용됩니다. 모든 에러 메시지는 표준 에러 스트림에 기록됩니다. 실행된 명령의 정상 출력은 표준 출력에 기록됩니다.

기본 또는 보조 프롬프트에 인터럽트 문자 (일반적으로 @code{Control}-@code{C} 또는 @code{Delete})를 입력하면 입력을 취소하고 기본 프롬프트로 돌아갑니다. @footnote{
GNU Readline 패키지에 있는 문제가 이것을 방해할 수 있습니다.
} 명령어가 실행되는 동안 인터럽트를 입력하면 @ref{8f7,,try} 문에 의해 처리될 수 있는 @ref{bc4,,KeyboardInterrupt} 예외가 발생합니다.

@node 실행 가능한 파이썬 스크립트,대화형 시작 파일,에러 처리,대화형 모드<2>
@anchor{tutorial/appendix executable-python-scripts}@anchor{210a}@anchor{tutorial/appendix tut-scripts}@anchor{1fcf}
@subsubsection 실행 가능한 파이썬 스크립트


BSD 스타일의 유닉스 시스템에서 파이썬 스크립트는 셸 스크립트처럼 직접 실행할 수 있게 만들 수 있습니다. 다음과 같은 줄

@example
#!/usr/bin/env python3
@end example

(인터프리터가 사용자의 
@geindex PATH
@geindex 환경 변수; PATH
@code{PATH} 에 있다고 가정할 때)을 스크립트의 시작 부분에 넣고 파일에 실행 가능 모드를 줍니다. @code{#!} 는 반드시 파일의 처음 두 문자여야 합니다. 일부 플랫폼에서는 이 첫 번째 줄이 유닉스 스타일의 줄 종료 (@code{'\n'})로 끝나야 하며, 윈도우 줄 종료(@code{'\r\n'})는 허락되지 않습니다. 파이썬에서 해시, 또는 파운드, 문자 @code{'#'} 는 주석을 시작하는 데 사용됩니다.

스크립트는 @code{chmod} 명령을 사용하여 실행 가능한 모드, 또는 권한, 을 부여받을 수 있습니다.

@example
$ chmod +x myscript.py
@end example

윈도우 시스템에서는 “실행 가능 모드”라는 개념이 없습니다. 파이썬 설치 프로그램은 @code{.py} 파일을 @code{python.exe}와 자동으로 연결하여, 파이썬 파일을 이중 클릭하면 스크립트로 실행합니다. 확장자는 @code{.pyw} 일 수도 있습니다. 이 경우, 일반적으로 나타나는 콘솔 창은 표시되지 않습니다.

@node 대화형 시작 파일,커스터마이제이션 모듈,실행 가능한 파이썬 스크립트,대화형 모드<2>
@anchor{tutorial/appendix the-interactive-startup-file}@anchor{210b}@anchor{tutorial/appendix tut-startup}@anchor{210c}
@subsubsection 대화형 시작 파일


파이썬을 대화형으로 사용할 때, 종종 인터프리터가 시작될 때마다 실행되는 표준 명령들이 있으면 편리합니다. 
@geindex PYTHONSTARTUP
@geindex 환경 변수; PYTHONSTARTUP
@ref{1b8,,PYTHONSTARTUP} 환경 변수를 시작 명령이 들어있는 파일 이름으로 설정하면 됩니다. 이것은 유닉스 셸의 @code{.profile} 기능과 유사합니다.

이 파일은 대화형 세션에서만 읽히며, 파이썬이 스크립트에서 명령을 읽을 때나, @code{/dev/tty} 가 명령의 명시적 소스인 경우(대화형 세션처럼 동작한다)에는 읽지 않습니다. 대화형 명령이 실행되는 같은 이름 공간에서 실행되므로, 이 파일에서 정의하거나 임포트하는 객체들을 대화형 세션에서 정규화하지 않은 이름으로 사용할 수 있습니다. 이 파일에서 @code{sys.ps1} 및 @code{sys.ps2} 프롬프트를 변경할 수도 있습니다.

현재 디렉터리에서 추가 시작 파일을 읽으려면, 전역 시작 파일에서 @code{if os.path.isfile('.pythonrc.py'): exec(open('.pythonrc.py').read())} 와 같은 코드를 사용해서 프로그램할 수 있습니다. 스크립트에서 시작 파일을 사용하려면 스크립트에서 명시적으로 수행해야 합니다:

@example
import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    with open(filename) as fobj:
        startup_file = fobj.read()
    exec(startup_file)
@end example

@node 커스터마이제이션 모듈,,대화형 시작 파일,대화형 모드<2>
@anchor{tutorial/appendix the-customization-modules}@anchor{210d}@anchor{tutorial/appendix tut-customize}@anchor{210e}
@subsubsection 커스터마이제이션 모듈


파이썬은 커스터마이즈할 수 있는 두 가지 훅을 제공합니다: 
@geindex sitecustomize
sitecustomize 와 
@geindex usercustomize
usercustomize. 어떻게 작동하는지 보려면, 먼저 여러분의 사용자 site-packages 디렉터리의 위치를 찾아야 합니다. 파이썬을 시작하고 다음 코드를 실행합니다:

@example
>>> import site
>>> site.getusersitepackages()
'/home/user/.local/lib/python3.x/site-packages'
@end example

이제 그 디렉터리에 @code{usercustomize.py} 라는 이름의 파일을 만들고 원하는 것들을 넣을 수 있습니다. 자동 임포트를 비활성화하는 @ref{1593,,-s} 옵션으로 시작하지 않는 한, 이 파일은 모든 파이썬 실행에 영향을 줍니다.

@geindex sitecustomize
sitecustomize 는 같은 방식으로 작동하지만, 일반적으로 전역 site-packages 디렉터리에 컴퓨터 관리자가 만들고, 
@geindex usercustomize
usercustomize 전에 임포트됩니다. 자세한 내용은 @ref{cc,,site} 모듈의 설명서를 보세요.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 파이썬 설정 및 사용법,파이썬 언어 레퍼런스,파이썬 자습서,Top
@anchor{using/index doc}@anchor{210f}@anchor{using/index python-setup-and-usage}@anchor{2110}@anchor{using/index translation-repo}@anchor{2111}@anchor{using/index using-index}@anchor{2112}
@chapter 파이썬 설정 및 사용법


설명서의 이 부분은 여러 플랫폼에서 파이썬 환경을 설정하고, 인터프리터를 호출하며, 파이썬으로 작업하기 더 쉽게 만드는 것들에 관한 일반적인 정보를 다루는데 할당되었습니다.

@c ATTENTION: You probably should update Misc/python.man, too, if you modify
@c this file.

@menu
* 명령 줄과 환경:: 
* 유닉스 플랫폼에서 파이썬 사용하기:: 
* Configure Python:: 
* 윈도우에서 파이썬 사용하기:: 
* macOS 에서 파이썬 사용하기:: 
* Using Python on Android:: 
* Using Python on iOS:: 
* 편집기와 IDE:: 

@end menu

@node 명령 줄과 환경,유닉스 플랫폼에서 파이썬 사용하기,,파이썬 설정 및 사용법
@anchor{using/cmdline doc}@anchor{2113}@anchor{using/cmdline command-line-and-environment}@anchor{2114}@anchor{using/cmdline using-on-general}@anchor{1da4}
@section 명령 줄과 환경


CPython 인터프리터는 명령 줄과 환경에서 다양한 설정을 찾습니다.

다른 구현의 명령 줄 체계는 다를 수 있습니다. 자세한 내용은 @ref{2115,,대안 구현들} 참조하십시오.

@menu
* 명령 줄:: 
* 환경 변수:: 

@end menu

@node 명령 줄,환경 변수,,명령 줄과 환경
@anchor{using/cmdline command-line}@anchor{2116}@anchor{using/cmdline using-on-cmdline}@anchor{1206}
@subsection 명령 줄


파이썬을 호출할 때 다음 옵션들을 지정할 수 있습니다:

@example
python [-bBdEhiIOPqRsSuvVWx?] [-c command | -m module-name | script | - ] [args]
@end example

물론, 가장 일반적인 사용 사례는 간단한 스크립트 호출입니다:

@example
python myscript.py
@end example

@menu
* 인터페이스 옵션:: 
* 일반 옵션:: 
* 기타 옵션:: 
* Controlling color:: 

@end menu

@node 인터페이스 옵션,일반 옵션,,명령 줄
@anchor{using/cmdline interface-options}@anchor{2117}@anchor{using/cmdline using-on-interface-options}@anchor{2118}
@subsubsection 인터페이스 옵션


인터프리터 인터페이스는 유닉스 셸의 인터페이스와 비슷하지만, 몇 가지 추가 호출 방법을 제공합니다:


@itemize *

@item 
tty 장치에 연결된 표준 입력으로 호출하면, 명령을 입력하라는 프롬프트를 준 후 EOF(파일 끝 문자, 유닉스에서는 @code{Ctrl}-@code{D}, 윈도우에서는 @code{Ctrl}-@code{Z,} @code{Enter}로 만들 수 있습니다)가 읽힐 때까지 실행합니다. 대화형 모드에 대한 자세한 내용은 @ref{495,,대화형 모드}를 참조하세요.

@item 
파일 이름 인자나 파일을 표준 입력으로 사용해서 호출하면, 해당 파일에서 스크립트를 읽고 실행합니다.

@item 
디렉터리 이름 인자로 호출되면, 해당 디렉터리에서 적절히 이름 붙은 스크립트를 읽고 실행합니다.

@item 
@code{-c command} 로 호출되면, `command'로 주어지는 파이썬 문장을 실행합니다. 여기서 `command'는 개행 문자로 구분된 여러 개의 문장을 포함할 수 있습니다. 선행 공백은 파이썬 문장에서 중요합니다!

@item 
@code{-m module-name} 으로 호출되면, 주어진 모듈을 파이썬 모듈 경로에서 찾은 후에 스크립트로 실행합니다.
@end itemize

비대화형 모드에서는, 실행하기 전에 전체 입력을 구문 분석합니다.

인터페이스 옵션은 인터프리터에 의해 소비되는 옵션의 목록을 종료합니다, 뒤따르는 모든 인자는 @ref{1469,,sys.argv} 로 들어갑니다 – 첫 번째 요소, 서브 스크립트 0(@code{sys.argv[0]})은 프로그램 소스를 반영하는 문자열임에 유의하세요.

@geindex 명령줄 옵션; -c
@anchor{using/cmdline cmdoption-c}@anchor{1a8}
@deffn {Option} @w{-}c <command>

`command' 의 파이썬 코드를 실행합니다. `command' 는 개행 문자로 구분된 하나 이상의 문장일 수 있는데, 일반 모듈 코드에서와같이 선행 공백은 의미가 있습니다.

이 옵션을 주면, @ref{1469,,sys.argv} 의 첫 번째 요소는 @code{"-c"} 가 되고, 현재 디렉터리를 @ref{3e4,,sys.path} 의 시작 부분에 추가합니다 (그 디렉터리에 있는 모듈을 최상위 모듈로 임포트 할 수 있게 합니다).

@code{command}를 인자로 @ref{1c6c,,감사 이벤트(auditing event)} @code{cpython.run_command}를 발생시킵니다.


버전 3.14에서 변경: `command' is automatically dedented before execution.

@end deffn

@geindex 명령줄 옵션; -m
@anchor{using/cmdline cmdoption-m}@anchor{23c}
@deffn {Option} @w{-}m <module@w{-}name>

제공된 이름의 모듈을 @ref{3e4,,sys.path} 에서 검색하고 그 내용을 @ref{1,,__main__} 모듈로서 실행합니다.

인자가 `모듈' 이름이기 때문에, 파일 확장자(@code{.py})를 주지 않아야 합니다. 모듈 이름은 유효한 절대 파이썬 모듈 이름이어야 하지만, 구현이 항상 이를 강제하는 것은 아닙니다 (예를 들어, 하이픈을 포함하는 이름을 허락할 수도 있습니다).

패키지 이름(이름 공간 패키지 포함)도 허용됩니다. 일반 모듈 대신 패키지 이름이 제공되면, 인터프리터는 @code{<pkg>.__main__} 을 메인 모듈로 실행합니다. 이 동작은 인터프리터에 스크립트 인자로 전달되는 디렉터리 및 zip 파일의 처리와 의도적으로 유사합니다.

@cartouche
@quotation 참고 
이 옵션은 내장 모듈이나 확장 모듈에는 사용될 수 없는데, 이것들은 파이썬 모듈 파일을 갖고 있지 않기 때문입니다. 그러나, 원래 소스 파일이 없는 사전 컴파일된 모듈에는 여전히 사용할 수 있습니다.
@end quotation
@end cartouche

이 옵션을 주면, @ref{1469,,sys.argv} 의 첫 번째 요소는 모듈 파일의 전체 경로가 됩니다 (모듈 파일을 찾는 동안에는 첫 번째 요소를 @code{"-m"} 으로 설정합니다). @ref{1a8,,-c} 옵션과 마찬가지로, 현재 디렉터리가 @ref{3e4,,sys.path} 의 시작 부분에 추가됩니다.

@ref{b56,,-I} 옵션을 사용하면 @ref{3e4,,sys.path}가 현재 디렉터리나 사용자의 site-packages 디렉터리를 포함하지 않는 격리 모드에서 스크립트를 실행할 수 있습니다. 모든 @code{PYTHON*} 환경 변수도 무시됩니다.

많은 표준 라이브러리 모듈에는 스크립트로 실행할 때 호출되는 코드가 들어 있습니다. 한 예는 @ref{f5,,timeit} 모듈입니다:

@example
python -m timeit -s "setup here" "benchmarked code here"
python -m timeit -h # for details
@end example

@code{module-name}을 인자로 @ref{1c6c,,감사 이벤트(auditing event)} @code{cpython.run_module}을 발생시킵니다.


@subsubheading 더 보기



@table @asis

@item @ref{1b95,,runpy.run_module()}

파이썬 코드에서 직접 사용할 수 있는 동등한 기능
@end table

@geindex Python 향상 제안; PEP 338
PEP 338@footnote{https://peps.python.org/pep-0338/} – 모듈을 스크립트로 실행하기



버전 3.1에서 변경: @code{__main__} 서브 모듈을 실행할 패키지 이름을 제공할 수 있습니다.



버전 3.4에서 변경: 이름 공간 패키지도 지원됩니다.

@end deffn

@anchor{using/cmdline cmdarg-dash}@anchor{2119}
@deffn {Describe} @w{-}

표준 입력(@ref{75e,,sys.stdin})에서 명령을 읽습니다. 표준 입력이 터미널이면, @ref{16e0,,-i} 가 묵시적으로 적용됩니다.

이 옵션을 주면, @ref{1469,,sys.argv} 의 첫 번째 요소는 @code{"-"} 이 되고, 현재 디렉터리가 @ref{3e4,,sys.path} 의 처음에 추가됩니다.

인자 없이 @ref{1c6c,,감사 이벤트(auditing event)} @code{cpython.run_stdin}을 발생시킵니다.
@end deffn

@anchor{using/cmdline cmdarg-script}@anchor{211a}
@deffn {Describe} <script>

`script' 에 담긴 파이썬 코드를 실행합니다. `script' 는 파이썬 파일이나 @code{__main__.py} 파일이 들어있는 디렉터리나 @code{__main__.py} 파일을 포함하는 zip 파일을 가리키는 파일 시스템 경로(절대나 상대)여야 합니다.

이 옵션을 주면, @ref{1469,,sys.argv} 의 첫 번째 요소는 명령 줄에서 주어진 스크립트 이름이 됩니다.

스크립트 이름이 파이썬 파일을 직접 가리키면, 해당 파일을 포함하는 디렉터리가 @ref{3e4,,sys.path} 의 시작 부분에 추가되고, 파일은 @ref{1,,__main__} 모듈로 실행됩니다.

스크립트 이름이 디렉터리 나 zip 파일을 가리키면, 스크립트 이름이 @ref{3e4,,sys.path} 의 시작 부분에 추가되고, 해당 위치의 @code{__main__.py} 파일을 @ref{1,,__main__} 모듈로 실행합니다.

@ref{b56,,-I} 옵션을 사용하면 @ref{3e4,,sys.path}가 스크립트 디렉터리나 사용자의 site-packages 디렉터리를 포함하지 않는 격리 모드에서 스크립트를 실행할 수 있습니다. 모든 @code{PYTHON*} 환경 변수도 무시됩니다.

@code{filename}을 인자로 @ref{1c6c,,감사 이벤트(auditing event)} @code{cpython.run_file}을 발생시킵니다.


@subsubheading 더 보기



@table @asis

@item @ref{4a5,,runpy.run_path()}

파이썬 코드에서 직접 사용할 수 있는 동등한 기능
@end table

@end deffn

인터페이스 옵션을 주지 않으면, @ref{16e0,,-i} 가 묵시적으로 적용되고, @code{sys.argv[0]} 는 빈 문자열(@code{""})이 되고, 현재 디렉터리가 @ref{3e4,,sys.path} 의 처음에 추가됩니다. 또한, 플랫폼에서 사용 가능한 경우 (@ref{11c8,,Readline 구성} 를 참조하세요), 탭 완성 및 히스토리 편집이 자동으로 활성화됩니다.


@subsubheading 더 보기


@ref{1fc4,,인터프리터 실행하기}



버전 3.4에서 변경: 탭 완성과 히스토리 편집의 자동 활성화.


@node 일반 옵션,기타 옵션,인터페이스 옵션,명령 줄
@anchor{using/cmdline generic-options}@anchor{211b}@anchor{using/cmdline using-on-generic-options}@anchor{211c}
@subsubsection 일반 옵션


@geindex 명령줄 옵션; -?
@geindex 명령줄 옵션; -h
@geindex 명령줄 옵션; --help
@anchor{using/cmdline cmdoption-0}@anchor{162d}
@deffn {Option} @w{-}?
@anchor{using/cmdline cmdoption-h}@anchor{211d}
@deffnx {Option} @w{-}h
@anchor{using/cmdline cmdoption-help}@anchor{805}
@deffnx {Option} @w{-}@w{-}help

모든 명령 줄 옵션과 해당 환경 변수에 대한 간단한 설명을 인쇄한 후 종료합니다.
@end deffn

@geindex 명령줄 옵션; --help-env
@anchor{using/cmdline cmdoption-help-env}@anchor{807}
@deffn {Option} @w{-}@w{-}help@w{-}env

파이썬 특정 환경 변수에 대한 간단한 설명을 인쇄한 후 종료합니다.


Added in version 3.11.

@end deffn

@geindex 명령줄 옵션; --help-xoptions
@anchor{using/cmdline cmdoption-help-xoptions}@anchor{808}
@deffn {Option} @w{-}@w{-}help@w{-}xoptions

Print a description of implementation-specific @ref{16f,,-X} options
and exit.


Added in version 3.11.

@end deffn

@geindex 명령줄 옵션; --help-all
@anchor{using/cmdline cmdoption-help-all}@anchor{809}
@deffn {Option} @w{-}@w{-}help@w{-}all

Print complete usage information and exit.


Added in version 3.11.

@end deffn

@geindex 명령줄 옵션; -V
@geindex 명령줄 옵션; --version
@anchor{using/cmdline cmdoption-V}@anchor{49c}
@deffn {Option} @w{-}V
@anchor{using/cmdline cmdoption-version}@anchor{f16}
@deffnx {Option} @w{-}@w{-}version

파이썬 버전 번호를 출력하고 종료합니다. 출력 예는 다음과 같습니다:

@example
Python 3.8.0b2+
@end example

두 번 지정하면, 다음과 같이 빌드에 관한 추가 정보를 인쇄합니다:

@example
Python 3.8.0b2+ (3.8:0c076caaa8, Apr 20 2019, 21:55:00)
[GCC 6.2.0 20161005]
@end example


Added in version 3.6: @code{-VV} 옵션.

@end deffn

@node 기타 옵션,Controlling color,일반 옵션,명령 줄
@anchor{using/cmdline miscellaneous-options}@anchor{211e}@anchor{using/cmdline using-on-misc-options}@anchor{1207}
@subsubsection 기타 옵션


@geindex 명령줄 옵션; -b
@anchor{using/cmdline cmdoption-b}@anchor{7f8}
@deffn {Option} @w{-}b

@ref{192,,bytes}나 @ref{344,,bytearray}를 인코딩을 지정하지 않고 @ref{169,,str}로 변환하거나, @code{bytes} 나 @code{bytearray} 를 @code{str}과, @code{bytes}를 @ref{19b,,int}와 비교할 때 경고를 합니다. 옵션이 두 번 주어지면 (@code{-bb}) 에러를 줍니다.


버전 3.5에서 변경: @ref{192,,bytes} 와 @ref{19b,,int} 비교에도 적용됩니다.

@end deffn

@geindex 명령줄 옵션; -B
@anchor{using/cmdline cmdoption-B}@anchor{15d2}
@deffn {Option} @w{-}B

주어지면, 파이썬은 소스 모듈을 임포트 할 때 @code{.pyc} 파일을 쓰려고 하지 않습니다. 
@geindex PYTHONDONTWRITEBYTECODE
@geindex 환경 변수; PYTHONDONTWRITEBYTECODE
@ref{15d3,,PYTHONDONTWRITEBYTECODE} 도 참조하십시오.
@end deffn

@geindex 명령줄 옵션; --check-hash-based-pycs
@anchor{using/cmdline cmdoption-check-hash-based-pycs}@anchor{211f}
@deffn {Option} @w{-}@w{-}check@w{-}hash@w{-}based@w{-}pycs default|always|never

해시 기반 @code{.pyc} 파일의 검증 동작을 제어합니다. @ref{801,,캐시된 바이트 코드 무효화}를 참조하세요. @code{default} 로 설정하면, 검사형과 비검사형 해시 기반 바이트 코드 캐시 파일은 기본 의미에 따라 유효성이 검사됩니다. @code{always} 로 설정하면, 모든 해시 기반 @code{.pyc} 파일들은, 검사형과 비검사형을 가리지 않고, 해당 소스 파일에 대해 유효성이 검사됩니다. @code{never} 로 설정되면, 해시 기반 @code{.pyc} 파일은 해당 소스 파일에 대해 유효성이 검사되지 않습니다.

타임스탬프 기반 @code{.pyc} 파일의 의미는 이 옵션의 영향을 받지 않습니다.
@end deffn

@geindex 명령줄 옵션; -d
@anchor{using/cmdline cmdoption-d}@anchor{2120}
@deffn {Option} @w{-}d

파서 디버깅 출력을 켭니다 (전문가만을 위한 기능입니다). 
@geindex PYTHONDEBUG
@geindex 환경 변수; PYTHONDEBUG
@ref{2121,,PYTHONDEBUG} 환경 변수도 참조하십시오.

This option requires a @ref{508,,debug build of Python}, otherwise
it’s ignored.
@end deffn

@geindex 명령줄 옵션; -E
@anchor{using/cmdline cmdoption-E}@anchor{b55}
@deffn {Option} @w{-}E

설정되었을 수 있는 모든 @code{PYTHON*} 환경 변수를 무시합니다, 예를 들어 
@geindex PYTHONPATH
@geindex 환경 변수; PYTHONPATH
@ref{121c,,PYTHONPATH} 와 
@geindex PYTHONHOME
@geindex 환경 변수; PYTHONHOME
@ref{3f0,,PYTHONHOME}.

@ref{7c0,,-P} 와 @ref{b56,,-I} (격리) 옵션도 참조하십시오.
@end deffn

@geindex 명령줄 옵션; -i
@anchor{using/cmdline cmdoption-i}@anchor{16e0}
@deffn {Option} @w{-}i

Enter interactive mode after execution.

Using the @ref{16e0,,-i} option will enter interactive mode in any of the following circumstances:


@itemize *

@item 
스크립트가 첫 번째 인자로 전달될 때

@item 
@ref{1a8,,-c} 옵션이 사용될 때

@item 
@ref{23c,,-m} 옵션이 사용될 때
@end itemize

대화형 모드는 @ref{75e,,sys.stdin} 가 터미널로 보이지 않을 때도 시작합니다. 
@geindex PYTHONSTARTUP
@geindex 환경 변수; PYTHONSTARTUP
@ref{1b8,,PYTHONSTARTUP} 파일은 읽지 않습니다.

이것은 스크립트가 예외를 발생시킬 때 전역 변수나 스택 트레이스를 검사하는 데 유용할 수 있습니다. 
@geindex PYTHONINSPECT
@geindex 환경 변수; PYTHONINSPECT
@ref{16df,,PYTHONINSPECT} 도 참조하십시오.
@end deffn

@geindex 명령줄 옵션; -I
@anchor{using/cmdline cmdoption-I}@anchor{b56}
@deffn {Option} @w{-}I

격리된 모드로 파이썬을 실행합니다. 이것은 또한 @ref{b55,,-E}, @ref{7c0,,-P} 및 @ref{1593,,-s} 옵션을 묵시적으로 적용합니다.

격리 모드에서 @ref{3e4,,sys.path} 는 스크립트 디렉터리나 사용자의 site-packages 디렉터리를 포함하지 않습니다. 모든 @code{PYTHON*} 환경 변수도 무시됩니다. 사용자가 악성 코드를 주입하는 것을 방지하기 위해 추가 제한이 부과될 수 있습니다.


Added in version 3.4.

@end deffn

@geindex 명령줄 옵션; -O
@anchor{using/cmdline cmdoption-O}@anchor{18c}
@deffn {Option} @w{-}O

assert 문과 @ref{9da,,__debug__} 의 값에 대한 조건부 코드를 제거합니다. @code{.pyc} 확장자 앞에 @code{.opt-1} 을 추가하여 컴파일된 (@ref{4ab,,바이트 코드}) 파일의 이름을 구분합니다 (
@geindex Python 향상 제안; PEP 488
PEP 488@footnote{https://peps.python.org/pep-0488/}을 참조하세요). 
@geindex PYTHONOPTIMIZE
@geindex 환경 변수; PYTHONOPTIMIZE
@ref{2122,,PYTHONOPTIMIZE} 도 참조하십시오.


버전 3.5에서 변경: 
@geindex Python 향상 제안; PEP 488
PEP 488@footnote{https://peps.python.org/pep-0488/} 에 따라 @code{.pyc} 파일명을 수정합니다.

@end deffn

@geindex 명령줄 옵션; -OO
@anchor{using/cmdline cmdoption-OO}@anchor{fb4}
@deffn {Option} @w{-}OO

@ref{18c,,-O}를 적용하고 독스트링도 버립니다. @code{.pyc} 확장자 앞에 @code{.opt-2} 를 추가하여 컴파일 된(@ref{4ab,,바이트 코드}) 파일의 이름을 구분합니다 (참조 
@geindex Python 향상 제안; PEP 488
PEP 488@footnote{https://peps.python.org/pep-0488/}을 참조하세요).


버전 3.5에서 변경: 
@geindex Python 향상 제안; PEP 488
PEP 488@footnote{https://peps.python.org/pep-0488/} 에 따라 @code{.pyc} 파일명을 수정합니다.

@end deffn

@geindex 명령줄 옵션; -P
@anchor{using/cmdline cmdoption-P}@anchor{7c0}
@deffn {Option} @w{-}P

Don’t prepend a potentially unsafe path to @ref{3e4,,sys.path}:


@itemize *

@item 
@code{python -m module} command line: Don’t prepend the current working
directory.

@item 
@code{python script.py} command line: Don’t prepend the script’s directory.
If it’s a symbolic link, resolve symbolic links.

@item 
@code{python -c code} and @code{python} (REPL) command lines: Don’t prepend an
empty string, which means the current working directory.
@end itemize

See also the 
@geindex PYTHONSAFEPATH
@geindex 환경 변수; PYTHONSAFEPATH
@ref{7c1,,PYTHONSAFEPATH} environment variable, and @ref{b55,,-E}
and @ref{b56,,-I} (isolated) options.


Added in version 3.11.

@end deffn

@geindex 명령줄 옵션; -q
@anchor{using/cmdline cmdoption-q}@anchor{1785}
@deffn {Option} @w{-}q

대화형 모드에서도 저작권과 버전 메시지를 표시하지 않습니다.


Added in version 3.2.

@end deffn

@geindex 명령줄 옵션; -R
@anchor{using/cmdline cmdoption-R}@anchor{1e74}
@deffn {Option} @w{-}R

Turn on hash randomization. This option only has an effect if the
@geindex PYTHONHASHSEED
@geindex 환경 변수; PYTHONHASHSEED
@ref{127c,,PYTHONHASHSEED} environment variable is set to anything other
than @code{random}, since hash randomization is enabled by default.

이전 버전의 파이썬에서는, 이 옵션이 해시 무작위화를 켜서, str과 bytes 객체의 @ref{cf2,,__hash__()} 값이 예측할 수 없는 난수로 “솔트(salt)” 됩니다. 개별 파이썬 프로세스 내에서 상수로 유지되지만, 반복되는 파이썬 실행 간에는 예측할 수 없습니다.

Hash randomization is intended to provide protection against a
denial-of-service caused by carefully chosen inputs that exploit the worst
case performance of a dict construction, `O'(`n'@w{^2}) complexity.  See
@indicateurl{https://ocert.org/advisories/ocert-2011-003.html} for details.

@geindex PYTHONHASHSEED
@geindex 환경 변수; PYTHONHASHSEED
@ref{127c,,PYTHONHASHSEED} 는 해시 시드 시크릿에 고정값을 설정할 수 있게 합니다.


Added in version 3.2.3.



버전 3.7에서 변경: 이 옵션은 더는 무시되지 않습니다.

@end deffn

@geindex 명령줄 옵션; -s
@anchor{using/cmdline cmdoption-s}@anchor{1593}
@deffn {Option} @w{-}s

@ref{2123,,사용자 site-packages 디렉터리} 를 @ref{3e4,,sys.path} 에 추가하지 않습니다.

@geindex PYTHONNOUSERSITE
@geindex 환경 변수; PYTHONNOUSERSITE
@ref{1594,,PYTHONNOUSERSITE} 도 참조하세요.


@subsubheading 더 보기


@geindex Python 향상 제안; PEP 370
PEP 370@footnote{https://peps.python.org/pep-0370/} – 사용자별 site-packages 디렉터리

@end deffn

@geindex 명령줄 옵션; -S
@anchor{using/cmdline cmdoption-S}@anchor{13ad}
@deffn {Option} @w{-}S

@ref{cc,,site} 모듈의 임포트와 이 모듈이 수반하는 @ref{3e4,,sys.path} 의 사이트 의존적 조작을 비활성화합니다. 또한 @code{site} 가 나중에 명시적으로 임포트될 때도 이 조작을 비활성화합니다 (조작하기를 원하면 @ref{2124,,site.main()} 을 호출하십시오).
@end deffn

@geindex 명령줄 옵션; -u
@anchor{using/cmdline cmdoption-u}@anchor{1d8b}
@deffn {Option} @w{-}u

stdout 과 stderr 스트림을 버퍼링하지 않도록 만듭니다. 이 옵션은 stdin 스트림에는 영향을 미치지 않습니다.

@geindex PYTHONUNBUFFERED
@geindex 환경 변수; PYTHONUNBUFFERED
@ref{1d8c,,PYTHONUNBUFFERED} 도 참조하세요.


버전 3.7에서 변경: stdout 과 stderr 스트림의 텍스트 계층은 이제 버퍼링 되지 않습니다.

@end deffn

@geindex 명령줄 옵션; -v
@anchor{using/cmdline cmdoption-v}@anchor{162a}
@deffn {Option} @w{-}v

모듈이 초기화될 때마다 메시지를 인쇄하여, 로드된 위치(파일명이나 내장 모듈)를 표시합니다. 두 번 주어지면 (@code{-vv}), 모듈을 검색할 때 검사되는 각 파일에 대한 메시지를 인쇄합니다. 종료 시 모듈 정리에 대한 정보도 제공합니다.


버전 3.10에서 변경: The @ref{cc,,site} module reports the site-specific paths
and @code{.pth} files being processed.


@geindex PYTHONVERBOSE
@geindex 환경 변수; PYTHONVERBOSE
@ref{2125,,PYTHONVERBOSE} 도 참조하세요.
@end deffn

@geindex 명령줄 옵션; -W
@anchor{using/cmdline using-on-warnings}@anchor{2126}@anchor{using/cmdline cmdoption-W}@anchor{ac5}
@deffn {Option} @w{-}W arg

경고 제어. 파이썬의 경고 장치는 기본적으로 @ref{b33,,sys.stderr} 로 경고 메시지를 인쇄합니다.

가장 단순한 설정은 프로세스가 만드는 모든 경고에 무조건 특정 액션을 적용합니다 (그렇지 않으면 기본적으로 무시되는 경고조차도):

@example
-Wdefault  # 호출 위치마다 한 번 경고합니다
-Werror    # 예외로 변환합니다
-Walways   # 매번 경고합니다
-Wall      # -Walways 와 같습니다
-Wmodule   # 호출하는 모듈마다 한 번 경고합니다
-Wonce     # 파이썬 프로세스마다 한 번 경고합니다
-Wignore   # 경고하지 않습니다
@end example

액션 이름은 원하면 줄일 수 있고, 인터프리터는 이를 적절한 액션 이름으로 해석합니다. 예를 들어, @code{-Wi}는 @code{-Wignore}와 같습니다.

The full form of argument is:

@example
action:message:category:module:lineno
@end example

Empty fields match all values; trailing empty fields may be omitted. For
example @code{-W ignore::DeprecationWarning} ignores all DeprecationWarning
warnings.

The `action' field is as explained above but only applies to warnings that
match the remaining fields.

The `message' field must match the whole warning message; this match is
case-insensitive.

The `category' field matches the warning category
(ex: @code{DeprecationWarning}). This must be a class name; the match test
whether the actual warning category of the message is a subclass of the
specified warning category.

The `module' field matches the (fully qualified) module name; this match is
case-sensitive.

The `lineno' field matches the line number, where zero matches all line
numbers and is thus equivalent to an omitted line number.

다중 @ref{ac5,,-W} 옵션이 주어질 수 있습니다; 경고가 두 개 이상의 옵션과 일치하면 마지막으로 일치하는 옵션의 액션이 수행됩니다. 유효하지 않은 @code{-W} 옵션은 무시됩니다 (하지만, 최초의 경고가 발생할 때 유효하지 않은 옵션에 관한 경고 메시지가 출력됩니다).

경고는 
@geindex PYTHONWARNINGS
@geindex 환경 변수; PYTHONWARNINGS
@ref{da2,,PYTHONWARNINGS} 환경 변수와 파이썬 프로그램 내에서 @ref{118,,warnings} 모듈을 사용해서 제어할 수도 있습니다. 예를 들어, @ref{16ae,,warnings.filterwarnings()} 함수는 경고 메시지에 정규식을 적용하는 데 사용할 수 있습니다.

자세한 내용은 @ref{1b1,,경고 필터}와 @ref{2127,,경고 필터 설명}를 참조하십시오.
@end deffn

@geindex 명령줄 옵션; -x
@anchor{using/cmdline cmdoption-x}@anchor{2128}
@deffn {Option} @w{-}x

소스의 첫 번째 줄을 건너 뛰어서, 유닉스 이외의 형식의 @code{#!cmd} 을 사용할 수 있게 합니다. 이것은 DOS 전용 핵(hack)을 위한 것입니다.
@end deffn

@geindex 명령줄 옵션; -X
@anchor{using/cmdline cmdoption-X}@anchor{16f}
@deffn {Option} @w{-}X

다양한 구현 특정 옵션을 위해 예약되어 있습니다. CPython은 현재 다음과 같은 가능한 값을 정의합니다:


@itemize *

@item 
@code{-X faulthandler} 는 @ref{5c,,faulthandler} 를 활성화합니다. 
@geindex PYTHONFAULTHANDLER
@geindex 환경 변수; PYTHONFAULTHANDLER
@ref{1284,,PYTHONFAULTHANDLER}도 참조하세요.


Added in version 3.3.


@item 
@code{-X showrefcount} 는 프로그램이 끝나거나 대화형 인터프리터에서 각각의 문장 뒤에서, 총 참조 횟수와 사용된 메모리 블록의 수를 출력합니다. 이것은 @ref{508,,디버그 빌드}에서만 작동합니다.


Added in version 3.4.


@item 
@code{-X tracemalloc} 은 @ref{105,,tracemalloc} 모듈을 사용하여 파이썬 메모리 할당 추적을 시작합니다. 기본적으로, 가장 최근 프레임만 추적의 트레이스백에 저장됩니다. `NFRAME' 프레임의 트레이스백 한도로 추적을 시작하려면 @code{-X tracemalloc=NFRAME} 을 사용하십시오. 자세한 정보는 @ref{2129,,tracemalloc.start()}와 
@geindex PYTHONTRACEMALLOC
@geindex 환경 변수; PYTHONTRACEMALLOC
@ref{212a,,PYTHONTRACEMALLOC}을 참조하십시오.


Added in version 3.4.


@item 
@code{-X int_max_str_digits} configures the @ref{80a,,integer string conversion length limitation}.  See also
@geindex PYTHONINTMAXSTRDIGITS
@geindex 환경 변수; PYTHONINTMAXSTRDIGITS
@ref{1b38,,PYTHONINTMAXSTRDIGITS}.


Added in version 3.11.


@item 
@code{-X importtime} to show how long each import takes. It shows module
name, cumulative time (including nested imports) and self time (excluding
nested imports).  Note that its output may be broken in multi-threaded
application.  Typical usage is @code{python -X importtime -c 'import asyncio'}.

@code{-X importtime=2} enables additional output that indicates when an
imported module has already been loaded.  In such cases, the string
@code{cached} will be printed in both time columns.

See also 
@geindex PYTHONPROFILEIMPORTTIME
@geindex 환경 변수; PYTHONPROFILEIMPORTTIME
@ref{cec,,PYTHONPROFILEIMPORTTIME}.


Added in version 3.7.



버전 3.14에서 변경: Added @code{-X importtime=2} to also trace imports of loaded modules,
and reserved values other than @code{1} and @code{2} for future use.


@item 
@code{-X dev}: @ref{507,,파이썬 개발 모드}를 활성화해서, 기본적으로 활성화하기에는 너무 비싼 추가적인 실행시간 검사를 도입합니다. 
@geindex PYTHONDEVMODE
@geindex 환경 변수; PYTHONDEVMODE
@ref{ce6,,PYTHONDEVMODE}도 참조하세요.


Added in version 3.7.


@item 
@code{-X utf8} 은 @ref{865,,파이썬 UTF-8 모드}를 활성화합니다. @code{-X utf8=0} 은 명시적으로 @ref{865,,파이썬 UTF-8 모드}를 비활성화합니다 (그렇지 않으면 자동으로 활성화될 때조차). 
@geindex PYTHONUTF8
@geindex 환경 변수; PYTHONUTF8
@ref{cce,,PYTHONUTF8}도 참조하십시오.


Added in version 3.7.


@item 
@code{-X pycache_prefix=PATH}는 @code{.pyc} 파일을 코드 트리 대신에 지정된 디렉터리를 루트로 하는 병렬 트리에 쓰도록 합니다. 
@geindex PYTHONPYCACHEPREFIX
@geindex 환경 변수; PYTHONPYCACHEPREFIX
@ref{b9a,,PYTHONPYCACHEPREFIX}도 참조하십시오.


Added in version 3.8.


@item 
@code{-X warn_default_encoding} issues a @ref{212b,,EncodingWarning} when the
locale-specific default encoding is used for opening files.
See also 
@geindex PYTHONWARNDEFAULTENCODING
@geindex 환경 변수; PYTHONWARNDEFAULTENCODING
@ref{9bf,,PYTHONWARNDEFAULTENCODING}.


Added in version 3.10.


@item 
@code{-X no_debug_ranges} disables the inclusion of the tables mapping extra
location information (end line, start column offset and end column offset)
to every instruction in code objects. This is useful when smaller code
objects and pyc files are desired as well as suppressing the extra visual
location indicators when the interpreter displays tracebacks. See also
@geindex PYTHONNODEBUGRANGES
@geindex 환경 변수; PYTHONNODEBUGRANGES
@ref{7d2,,PYTHONNODEBUGRANGES}.


Added in version 3.11.


@item 
@code{-X frozen_modules} determines whether or not frozen modules are
ignored by the import machinery.  A value of @code{on} means they get
imported and @code{off} means they are ignored.  The default is @code{on}
if this is an installed Python (the normal case).  If it’s under
development (running from the source tree) then the default is @code{off}.
Note that the @code{importlib_bootstrap} and
@code{importlib_bootstrap_external} frozen modules are always used, even
if this flag is set to @code{off}. See also 
@geindex PYTHON_FROZEN_MODULES
@geindex 환경 변수; PYTHON_FROZEN_MODULES
@ref{4ae,,PYTHON_FROZEN_MODULES}.


Added in version 3.11.


@item 
@code{-X perf} enables support for the Linux @code{perf} profiler.
When this option is provided, the @code{perf} profiler will be able to
report Python calls. This option is only available on some platforms and
will do nothing if is not supported on the current system. The default value
is “off”. See also 
@geindex PYTHONPERFSUPPORT
@geindex 환경 변수; PYTHONPERFSUPPORT
@ref{698,,PYTHONPERFSUPPORT} and @ref{4b0,,Python support for the Linux perf profiler}.


Added in version 3.12.


@item 
@code{-X perf_jit} enables support for the Linux @code{perf} profiler with DWARF
support. When this option is provided, the @code{perf} profiler will be able
to report Python calls using DWARF information. This option is only available on
some platforms and will do nothing if is not supported on the current
system. The default value is “off”. See also 
@geindex PYTHON_PERF_JIT_SUPPORT
@geindex 환경 변수; PYTHON_PERF_JIT_SUPPORT
@ref{4af,,PYTHON_PERF_JIT_SUPPORT}
and @ref{4b0,,Python support for the Linux perf profiler}.


Added in version 3.13.


@item 
@code{-X disable_remote_debug} disables the remote debugging support as described
in 
@geindex Python 향상 제안; PEP 768
PEP 768@footnote{https://peps.python.org/pep-0768/}.  This includes both the functionality to schedule code for
execution in another process and the functionality to receive code for
execution in the current process.

This option is only available on some platforms and will do nothing
if is not supported on the current system. See also
@geindex PYTHON_DISABLE_REMOTE_DEBUG
@geindex 환경 변수; PYTHON_DISABLE_REMOTE_DEBUG
@ref{16e,,PYTHON_DISABLE_REMOTE_DEBUG} and 
@geindex Python 향상 제안; PEP 768
PEP 768@footnote{https://peps.python.org/pep-0768/}.


Added in version 3.14.


@item 
@code{-X cpu_count=@var{n}} overrides @ref{4db,,os.cpu_count()},
@ref{51d,,os.process_cpu_count()}, and @ref{116e,,multiprocessing.cpu_count()}.
`n' must be greater than or equal to 1.
This option may be useful for users who need to limit CPU resources of a
container system. See also 
@geindex PYTHON_CPU_COUNT
@geindex 환경 변수; PYTHON_CPU_COUNT
@ref{51e,,PYTHON_CPU_COUNT}.
If `n' is @code{default}, nothing is overridden.


Added in version 3.13.


@item 
@code{-X presite=@var{package.module}} specifies a module that should be
imported before the @ref{cc,,site} module is executed and before the
@ref{1,,__main__} module exists.  Therefore, the imported module isn’t
@code{__main__}. This can be used to execute code early during Python
initialization. Python needs to be @ref{508,,built in debug mode}
for this option to exist.  See also 
@geindex PYTHON_PRESITE
@geindex 환경 변수; PYTHON_PRESITE
@ref{212c,,PYTHON_PRESITE}.


Added in version 3.13.


@item 
@code{-X gil=@var{0,1}} forces the GIL to be disabled or enabled,
respectively. Setting to @code{0} is only available in builds configured with
@ref{49a,,--disable-gil}. See also 
@geindex PYTHON_GIL
@geindex 환경 변수; PYTHON_GIL
@ref{49b,,PYTHON_GIL} and
@ref{46d,,제한 없는 스레드를 사용하는 파이썬(CPython)}.


Added in version 3.13.


@item 
@code{-X thread_inherit_context=@var{0,1}} causes @ref{176,,Thread}
to, by default, use a copy of context of the caller of
@code{Thread.start()} when starting.  Otherwise, threads will start
with an empty context.  If unset, the value of this option defaults
to @code{1} on free-threaded builds and to @code{0} otherwise.  See also
@geindex PYTHON_THREAD_INHERIT_CONTEXT
@geindex 환경 변수; PYTHON_THREAD_INHERIT_CONTEXT
@ref{186b,,PYTHON_THREAD_INHERIT_CONTEXT}.


Added in version 3.14.


@item 
@code{-X context_aware_warnings=@var{0,1}} causes the
@ref{179,,warnings.catch_warnings} context manager to use a
@ref{1878,,ContextVar} to store warnings filter state.  If
unset, the value of this option defaults to @code{1} on free-threaded builds
and to @code{0} otherwise.  See also 
@geindex PYTHON_CONTEXT_AWARE_WARNINGS
@geindex 환경 변수; PYTHON_CONTEXT_AWARE_WARNINGS
@ref{185e,,PYTHON_CONTEXT_AWARE_WARNINGS}.


Added in version 3.14.


@item 
@code{-X tlbc=@var{0,1}} enables (1, the default) or disables (0) thread-local
bytecode in builds configured with @ref{49a,,--disable-gil}.  When disabled,
this also disables the specializing interpreter.  See also
@geindex PYTHON_TLBC
@geindex 환경 변수; PYTHON_TLBC
@ref{212d,,PYTHON_TLBC}.


Added in version 3.14.

@end itemize

또한 @ref{212e,,sys._xoptions} 딕셔너리를 통해 임의의 값을 전달하고 조회할 수 있도록 합니다.


Added in version 3.2.



버전 3.9에서 변경: @code{-X showalloccount} 옵션을 제거했습니다.



버전 3.10에서 변경: @code{-X oldparser} 옵션을 제거했습니다.

@end deffn


Removed in version 3.14: @code{-J} is no longer reserved for use by Jython@footnote{https://www.jython.org/},
and now has no special meaning.


@node Controlling color,,기타 옵션,명령 줄
@anchor{using/cmdline controlling-color}@anchor{212f}@anchor{using/cmdline using-on-controlling-color}@anchor{1b7}
@subsubsection Controlling color


The Python interpreter is configured by default to use colors to highlight
output in certain situations such as when displaying tracebacks. This
behavior can be controlled by setting different environment variables.

Setting the environment variable @code{TERM} to @code{dumb} will disable color.

If the FORCE_COLOR@footnote{https://force-color.org/} environment variable is set, then color will be
enabled regardless of the value of TERM. This is useful on CI systems which
aren’t terminals but can still display ANSI escape sequences.

If the NO_COLOR@footnote{https://no-color.org/} environment variable is set, Python will disable all color
in the output. This takes precedence over @code{FORCE_COLOR}.

All these environment variables are used also by other tools to control color
output. To control the color output only in the Python interpreter, the
@geindex PYTHON_COLORS
@geindex 환경 변수; PYTHON_COLORS
@ref{476,,PYTHON_COLORS} environment variable can be used. This variable takes
precedence over @code{NO_COLOR}, which in turn takes precedence over
@code{FORCE_COLOR}.

@node 환경 변수,,명령 줄,명령 줄과 환경
@anchor{using/cmdline environment-variables}@anchor{2130}@anchor{using/cmdline using-on-envvars}@anchor{806}
@subsection 환경 변수


이 환경 변수들은 파이썬의 동작에 영향을 주며, -E와 -I 이외의 명령 줄 스위치보다 먼저 처리됩니다. 충돌하면 명령 줄 스위치가 환경 변수에 우선하는 것이 관례입니다.

@geindex 환경 변수; PYTHONHOME
@anchor{using/cmdline envvar-PYTHONHOME}@anchor{3f0}
@deffn {환경 변수} PYTHONHOME

표준 파이썬 라이브러리의 위치를 변경합니다. 기본적으로, 라이브러리는 @code{`prefix'/lib/python`version'}과 @code{`exec_prefix'/lib/python`version'}에서 검색되는데, @code{`prefix'} 와 @code{`exec_prefix'} 는 설치 의존적인 디렉터리이고, 둘 다 기본값은 @code{/usr/local} 입니다.

@geindex PYTHONHOME
@geindex 환경 변수; PYTHONHOME
@ref{3f0,,PYTHONHOME} 이 하나의 디렉터리로 설정되면, 그 값은 @code{`prefix'} 와 @code{`exec_prefix'} 를 모두 대체합니다. 이들에 대해 다른 값을 지정하려면, 
@geindex PYTHONHOME
@geindex 환경 변수; PYTHONHOME
@code{PYTHONHOME} 을 @code{`prefix':`exec_prefix'} 로 설정하십시오.
@end deffn

@geindex 환경 변수; PYTHONPATH
@anchor{using/cmdline envvar-PYTHONPATH}@anchor{121c}
@deffn {환경 변수} PYTHONPATH

모듈 파일의 기본 검색 경로를 보강합니다. 형식은 셸의 
@geindex PATH
@geindex 환경 변수; PATH
@code{PATH} 와 같습니다: 하나 이상의 디렉터리 경로명이 @ref{2131,,os.pathsep} (예를 들어, 유닉스에서는 콜론, 윈도우에서는 세미콜론) 로 구분됩니다. 존재하지 않는 디렉터리는 조용히 무시됩니다.

일반 디렉터리 외에도, 개별 
@geindex PYTHONPATH
@geindex 환경 변수; PYTHONPATH
@ref{121c,,PYTHONPATH} 엔트리는 순수 파이썬 모듈(소스 또는 컴파일된 형식)을 포함하는 zip 파일을 가리킬 수 있습니다. 확장 모듈은 zip 파일에서 임포트될 수 없습니다.

기본 검색 경로는 설치 의존적이지만, 일반적으로 @code{`prefix'/lib/python`version'}으로 시작합니다 (위의 
@geindex PYTHONHOME
@geindex 환경 변수; PYTHONHOME
@ref{3f0,,PYTHONHOME} 을 참조하세요). `항상' 
@geindex PYTHONPATH
@geindex 환경 변수; PYTHONPATH
@ref{121c,,PYTHONPATH} 에 추가됩니다.

위에서 설명한 대로 @ref{2118,,인터페이스 옵션} 하에서는 
@geindex PYTHONPATH
@geindex 환경 변수; PYTHONPATH
@ref{121c,,PYTHONPATH} 앞에 검색 경로에 추가 디렉터리가 삽입됩니다. 검색 경로는 파이썬 프로그램 내에서 @ref{3e4,,sys.path} 변수로 조작할 수 있습니다.
@end deffn

@geindex 환경 변수; PYTHONSAFEPATH
@anchor{using/cmdline envvar-PYTHONSAFEPATH}@anchor{7c1}
@deffn {환경 변수} PYTHONSAFEPATH

비어 있지 않은 문자열로 설정하면, 잠재적으로 안전하지 않은 경로를 @ref{3e4,,sys.path} 앞에 추가하지 않습니다: 자세한 내용은 @ref{7c0,,-P} 옵션을 참조하십시오.


Added in version 3.11.

@end deffn

@geindex 환경 변수; PYTHONPLATLIBDIR
@anchor{using/cmdline envvar-PYTHONPLATLIBDIR}@anchor{1d20}
@deffn {환경 변수} PYTHONPLATLIBDIR

이것을 비어 있지 않은 문자열로 설정하면, @ref{b32,,sys.platlibdir} 값을 재정의합니다.


Added in version 3.9.

@end deffn

@geindex 환경 변수; PYTHONSTARTUP
@anchor{using/cmdline envvar-PYTHONSTARTUP}@anchor{1b8}
@deffn {환경 변수} PYTHONSTARTUP

이것이 읽을 수 있는 파일의 이름이면, 첫 번째 프롬프트가 대화형 모드에 표시되기 전에, 해당 파일의 파이썬 명령이 실행됩니다. 이 파일은 대화형 명령이 실행되는 것과 같은 이름 공간에서 실행되므로, 여기에서 정의되거나 임포트 한 객체를 대화형 세션에서 그대로 사용할 수 있습니다. 이 파일에서 프롬프트 @ref{2132,,sys.ps1} 과 @ref{2133,,sys.ps2} 와 훅 @ref{11c7,,sys.__interactivehook__} 도 바꿀 수 있습니다.

시작 시 호출될 때 filename을 인자로 @ref{1c6c,,감사 이벤트(auditing event)} @code{cpython.run_startup}을 발생시킵니다.
@end deffn

@geindex 환경 변수; PYTHONOPTIMIZE
@anchor{using/cmdline envvar-PYTHONOPTIMIZE}@anchor{2122}
@deffn {환경 변수} PYTHONOPTIMIZE

비어 있지 않은 문자열로 설정하면 @ref{18c,,-O} 옵션을 지정하는 것과 같습니다. 정수로 설정하면, @code{-O}를 여러 번 지정하는 것과 같습니다.
@end deffn

@geindex 환경 변수; PYTHONBREAKPOINT
@anchor{using/cmdline envvar-PYTHONBREAKPOINT}@anchor{cd1}
@deffn {환경 변수} PYTHONBREAKPOINT

설정되면, 점으로 구분된 경로 표기법을 사용하여 콜러블의 이름을 지정합니다. 콜러블을 포함하는 모듈이 임포트 된 후에 콜러블은, 내장 @ref{271,,breakpoint()} 에 의해 호출되는 @ref{cd0,,sys.breakpointhook()} 의 기본 구현이 실행합니다. 설정되지 않았거나 빈 문자열로 설정하면, 값 “pdb.set_trace”와 동등합니다. 문자열 “0”으로 설정하면, @code{sys.breakpointhook()} 의 기본 구현은 아무것도 하지 않고 즉시 반환합니다.


Added in version 3.7.

@end deffn

@geindex 환경 변수; PYTHONDEBUG
@anchor{using/cmdline envvar-PYTHONDEBUG}@anchor{2121}
@deffn {환경 변수} PYTHONDEBUG

비어 있지 않은 문자열로 설정하면, @ref{2120,,-d} 옵션을 지정하는 것과 같습니다. 정수로 설정하면, @code{-d}를 여러 번 지정하는 것과 같습니다.

This environment variable requires a @ref{508,,debug build of Python}, otherwise it’s ignored.
@end deffn

@geindex 환경 변수; PYTHONINSPECT
@anchor{using/cmdline envvar-PYTHONINSPECT}@anchor{16df}
@deffn {환경 변수} PYTHONINSPECT

비어 있지 않은 문자열로 설정하면, @ref{16e0,,-i} 옵션을 지정하는 것과 같습니다.

이 변수는 프로그램 종료 시 검사 모드를 강제하기 위해, @ref{259,,os.environ} 을 사용해서 파이썬 코드에 의해 수정될 수도 있습니다.

인자 없이 @ref{1c6c,,감사 이벤트(auditing event)} @code{cpython.run_stdin}을 발생시킵니다.


버전 3.12.5에서 변경: (also 3.11.10, 3.10.15, 3.9.20, and 3.8.20)
Emits audit events.



버전 3.13에서 변경: Uses PyREPL if possible, in which case 
@geindex PYTHONSTARTUP
@geindex 환경 변수; PYTHONSTARTUP
@ref{1b8,,PYTHONSTARTUP} is
also executed. Emits audit events.

@end deffn

@geindex 환경 변수; PYTHONUNBUFFERED
@anchor{using/cmdline envvar-PYTHONUNBUFFERED}@anchor{1d8c}
@deffn {환경 변수} PYTHONUNBUFFERED

비어 있지 않은 문자열로 설정하면, @ref{1d8b,,-u} 옵션을 지정하는 것과 같습니다.
@end deffn

@geindex 환경 변수; PYTHONVERBOSE
@anchor{using/cmdline envvar-PYTHONVERBOSE}@anchor{2125}
@deffn {환경 변수} PYTHONVERBOSE

비어 있지 않은 문자열로 설정하면, @ref{162a,,-v} 옵션을 지정하는 것과 같습니다. 정수로 설정하면 @code{-v}를 여러 번 지정하는 것과 같습니다.
@end deffn

@geindex 환경 변수; PYTHONCASEOK
@anchor{using/cmdline envvar-PYTHONCASEOK}@anchor{b57}
@deffn {환경 변수} PYTHONCASEOK

설정되면, 파이썬은 @ref{7f7,,import} 문에서 대소 문자를 무시합니다. 이것은 윈도우와 macOS에서만 작동합니다.
@end deffn

@geindex 환경 변수; PYTHONDONTWRITEBYTECODE
@anchor{using/cmdline envvar-PYTHONDONTWRITEBYTECODE}@anchor{15d3}
@deffn {환경 변수} PYTHONDONTWRITEBYTECODE

비어 있지 않은 문자열로 설정되면, 파이썬은 소스 모듈을 임포트 할 때 @code{.pyc} 파일을 쓰지 않습니다. 이는 @ref{15d2,,-B} 옵션을 지정하는 것과 같습니다.
@end deffn

@geindex 환경 변수; PYTHONPYCACHEPREFIX
@anchor{using/cmdline envvar-PYTHONPYCACHEPREFIX}@anchor{b9a}
@deffn {환경 변수} PYTHONPYCACHEPREFIX

설정되면, 파이썬은 소스 트리 내의 @code{__pycache__} 디렉터리 대신에 이 경로에 있는 미러 디렉터리 트리에 @code{.pyc} 파일을 씁니다. 이것은 @ref{16f,,-X} @code{pycache_prefix=PATH} 옵션을 지정하는 것과 동등합니다.


Added in version 3.8.

@end deffn

@geindex 환경 변수; PYTHONHASHSEED
@anchor{using/cmdline envvar-PYTHONHASHSEED}@anchor{127c}
@deffn {환경 변수} PYTHONHASHSEED

이 변수가 설정되어 있지 않거나 @code{random} 으로 설정되면, str과 bytes 객체의 해시 시드에 난수가 사용됩니다.

@geindex PYTHONHASHSEED
@geindex 환경 변수; PYTHONHASHSEED
@ref{127c,,PYTHONHASHSEED} 가 정숫값으로 설정되면, 해시 무작위화가 적용되는 형의 hash()를 생성하기 위한 고정 시드로 사용됩니다.

목적은 인터프리터 자체에 대한 셀프 테스트와 같은 이유로 반복 가능한 해싱을 허용하거나, 파이썬 프로세스 클러스터가 해시값을 공유하도록 허용하는 것입니다.

정수는 [0,4294967295] 범위의 십진수여야 합니다. 값 0을 지정하면 해시 무작위화가 비활성화됩니다.


Added in version 3.2.3.

@end deffn

@geindex 환경 변수; PYTHONINTMAXSTRDIGITS
@anchor{using/cmdline envvar-PYTHONINTMAXSTRDIGITS}@anchor{1b38}
@deffn {환경 변수} PYTHONINTMAXSTRDIGITS

If this variable is set to an integer, it is used to configure the
interpreter’s global @ref{80a,,integer string conversion length limitation}.


Added in version 3.11.

@end deffn

@geindex 환경 변수; PYTHONIOENCODING
@anchor{using/cmdline envvar-PYTHONIOENCODING}@anchor{1209}
@deffn {환경 변수} PYTHONIOENCODING

인터프리터를 실행하기 전에 이것이 설정되면, stdin/stdout/stderr에 사용되는 인코딩을 대체합니다. 문법은 @code{encodingname:errorhandler} 형식입니다. @code{encodingname} 과 @code{:errorhandler} 부분은 모두 선택 사항이며 @ref{ad2,,str.encode()} 에서와 같은 의미입니다.

stderr의 경우, @code{:errorhandler} 부분은 무시됩니다; 처리기는 항상 @code{'backslashreplace'} 입니다.


버전 3.4에서 변경: @code{encodingname} 부분은 이제 선택적입니다.



버전 3.6에서 변경: Windows에서, 
@geindex PYTHONLEGACYWINDOWSSTDIO
@geindex 환경 변수; PYTHONLEGACYWINDOWSSTDIO
@ref{e54,,PYTHONLEGACYWINDOWSSTDIO} 도 지정하지 않는 한, 대화형 콘솔 버퍼에서 이 변수로 지정된 인코딩이 무시됩니다. 표준 스트림을 통해 리디렉션 된 파일과 파이프는 영향을 받지 않습니다.

@end deffn

@geindex 환경 변수; PYTHONNOUSERSITE
@anchor{using/cmdline envvar-PYTHONNOUSERSITE}@anchor{1594}
@deffn {환경 변수} PYTHONNOUSERSITE

설정되면, 파이썬은 @ref{2123,,사용자 site-packages 디렉터리} 를 @ref{3e4,,sys.path} 에 추가하지 않습니다.


@subsubheading 더 보기


@geindex Python 향상 제안; PEP 370
PEP 370@footnote{https://peps.python.org/pep-0370/} – 사용자별 site-packages 디렉터리

@end deffn

@geindex 환경 변수; PYTHONUSERBASE
@anchor{using/cmdline envvar-PYTHONUSERBASE}@anchor{1592}
@deffn {환경 변수} PYTHONUSERBASE

@ref{1521,,사용자 베이스 디렉터리} 를 정의합니다. 이 디렉터리는 @code{python -m pip install --user} 에서 @ref{2123,,사용자 site-packages 디렉터리} 의 경로와 @ref{2134,,설치 경로} 를 계산하는 데 사용됩니다.


@subsubheading 더 보기


@geindex Python 향상 제안; PEP 370
PEP 370@footnote{https://peps.python.org/pep-0370/} – 사용자별 site-packages 디렉터리

@end deffn

@geindex 환경 변수; PYTHONEXECUTABLE
@anchor{using/cmdline envvar-PYTHONEXECUTABLE}@anchor{2135}
@deffn {환경 변수} PYTHONEXECUTABLE

이 환경 변수가 설정되면, @code{sys.argv[0]} 는 C 런타임을 통해 얻은 값 대신에 이 값으로 설정됩니다. macOS에서만 작동합니다.
@end deffn

@geindex 환경 변수; PYTHONWARNINGS
@anchor{using/cmdline envvar-PYTHONWARNINGS}@anchor{da2}
@deffn {환경 변수} PYTHONWARNINGS

@ref{ac5,,-W} 옵션과 동등합니다. 쉼표로 구분된 문자열로 설정하면, @code{-W}를 여러 번 지정하는 것과 같습니다. 목록의 뒷부분에 있는 필터는 목록의 이전 필터보다 우선합니다.

가장 단순한 설정은 프로세스가 만드는 모든 경고에 무조건 특정 액션을 적용합니다 (그렇지 않으면 기본적으로 무시되는 경고조차도):

@example
PYTHONWARNINGS=default  # 호출 위치마다 한 번 경고합니다
PYTHONWARNINGS=error    # 예외로 변환합니다
PYTHONWARNINGS=always   # 매번 경고합니다
PYTHONWARNINGS=all      # PYTHONWARNINGS=always 와 같습니다
PYTHONWARNINGS=module   # 호출하는 모듈마다 한 번 경고합니다
PYTHONWARNINGS=once     # 파이썬 프로세스마다 한 번 경고합니다
PYTHONWARNINGS=ignore   # 경고하지 않습니다
@end example

자세한 내용은 @ref{1b1,,경고 필터}와 @ref{2127,,경고 필터 설명}를 참조하십시오.
@end deffn

@geindex 환경 변수; PYTHONFAULTHANDLER
@anchor{using/cmdline envvar-PYTHONFAULTHANDLER}@anchor{1284}
@deffn {환경 변수} PYTHONFAULTHANDLER

이 환경 변수가 비어 있지 않은 문자열로 설정되면, @ref{20f,,faulthandler.enable()} 이 시작 시에 호출됩니다: 파이썬 트레이스백을 덤프하는 @ref{127f,,SIGSEGV}, @ref{1280,,SIGFPE}, @ref{1281,,SIGABRT}, @ref{1282,,SIGBUS} 그리고 @ref{1283,,SIGILL} 시그널 처리기를 설치합니다. 이는 @ref{16f,,-X} @code{faulthandler} 옵션과 동등합니다.


Added in version 3.3.

@end deffn

@geindex 환경 변수; PYTHONTRACEMALLOC
@anchor{using/cmdline envvar-PYTHONTRACEMALLOC}@anchor{212a}
@deffn {환경 변수} PYTHONTRACEMALLOC

이 환경 변수가 비어 있지 않은 문자열로 설정되면, @ref{105,,tracemalloc} 모듈을 사용하여 파이썬 메모리 할당 추적을 시작합니다. 변수의 값은 추적의 트레이스백에 저장되는 최대 프레임 수입니다. 예를 들어, @code{PYTHONTRACEMALLOC=1} 은 가장 최근의 프레임만을 저장합니다. 자세한 정보는 @ref{2129,,tracemalloc.start()} 함수를 참조하십시오. 이는 @ref{16f,,-X} @code{tracemalloc} 옵션을 설정하는 것과 동등합니다.


Added in version 3.4.

@end deffn

@geindex 환경 변수; PYTHONPROFILEIMPORTTIME
@anchor{using/cmdline envvar-PYTHONPROFILEIMPORTTIME}@anchor{cec}
@deffn {환경 변수} PYTHONPROFILEIMPORTTIME

If this environment variable is set to @code{1}, Python will show
how long each import takes. If set to @code{2}, Python will include output for
imported modules that have already been loaded.
This is equivalent to setting the @ref{16f,,-X} @code{importtime} option.


Added in version 3.7.



버전 3.14에서 변경: Added @code{PYTHONPROFILEIMPORTTIME=2} to also trace imports of loaded modules.

@end deffn

@geindex 환경 변수; PYTHONASYNCIODEBUG
@anchor{using/cmdline envvar-PYTHONASYNCIODEBUG}@anchor{2136}
@deffn {환경 변수} PYTHONASYNCIODEBUG

이 환경 변수가 비어 있지 않은 문자열로 설정되면, @ref{b,,asyncio} 모듈의 @ref{2137,,디버그 모드} 를 활성화합니다.


Added in version 3.4.

@end deffn

@geindex 환경 변수; PYTHONMALLOC
@anchor{using/cmdline envvar-PYTHONMALLOC}@anchor{e5d}
@deffn {환경 변수} PYTHONMALLOC

파이썬 메모리 할당자를 설정하거나 디버그 훅을 설치합니다.

파이썬이 사용하는 메모리 할당자를 설정합니다:


@itemize *

@item 
@code{default}: @ref{2138,,기본 메모리 할당자} 를 사용합니다.

@item 
@code{malloc}: 모든 영역(@ref{2139,,PYMEM_DOMAIN_RAW}, @ref{e62,,PYMEM_DOMAIN_MEM}, @ref{e60,,PYMEM_DOMAIN_OBJ})에서 C 라이브러리의 @code{malloc()} 함수를 사용합니다.

@item 
@code{pymalloc}: @ref{e62,,PYMEM_DOMAIN_MEM}과 @ref{e60,,PYMEM_DOMAIN_OBJ} 영역에서 @ref{f0a,,pymalloc 할당자} 를 사용하고, @ref{2139,,PYMEM_DOMAIN_RAW} 영역에서 @code{malloc()} 함수를 사용합니다.

@item 
@code{mimalloc}: @ref{e62,,PYMEM_DOMAIN_MEM}과 @ref{e60,,PYMEM_DOMAIN_OBJ} 영역에서 @ref{213a,,mimalloc 할당자} 를 사용하고, @ref{2139,,PYMEM_DOMAIN_RAW} 영역에서 @code{malloc()} 함수를 사용합니다.
@end itemize

Install @ref{213b,,debug hooks}:


@itemize *

@item 
@code{debug}: @ref{2138,,기본 메모리 할당자} 위에 디버그 훅을 설치합니다.

@item 
@code{malloc_debug}: @code{malloc} 과 같지만, 디버그 훅도 설치합니다.

@item 
@code{pymalloc_debug}: @code{pymalloc} 과 같지만, 디버그 훅도 설치합니다.

@item 
@code{mimalloc_debug}: @code{mimalloc} 과 같지만, 디버그 훅도 설치합니다.
@end itemize

@cartouche
@quotation 참고 
In the @ref{1f4,,free-threaded} build, the @code{malloc},
@code{malloc_debug}, @code{pymalloc}, and @code{pymalloc_debug} values are not
supported.  Only @code{default}, @code{debug}, @code{mimalloc}, and
@code{mimalloc_debug} are accepted.
@end quotation
@end cartouche


Added in version 3.6.



버전 3.7에서 변경: @code{"default"} 할당자를 추가했습니다.

@end deffn

@geindex 환경 변수; PYTHONMALLOCSTATS
@anchor{using/cmdline envvar-PYTHONMALLOCSTATS}@anchor{1f33}
@deffn {환경 변수} PYTHONMALLOCSTATS

If set to a non-empty string, Python will print statistics of the
@ref{f0a,,pymalloc memory allocator} or the
@ref{213a,,mimalloc memory allocator} (whichever is in use)
every time a new object arena is created, and on shutdown.

This variable is ignored if the 
@geindex PYTHONMALLOC
@geindex 환경 변수; PYTHONMALLOC
@ref{e5d,,PYTHONMALLOC} environment variable
is used to force the @code{malloc()} allocator of the C library, or if
Python is configured without both @code{pymalloc} and @code{mimalloc} support.


버전 3.6에서 변경: 이 변수는 이제 배포 모드로 컴파일된 파이썬에서도 사용할 수 있습니다. 이제 빈 문자열로 설정하면 효과가 없습니다.

@end deffn

@geindex 환경 변수; PYTHONLEGACYWINDOWSFSENCODING
@anchor{using/cmdline envvar-PYTHONLEGACYWINDOWSFSENCODING}@anchor{33f}
@deffn {환경 변수} PYTHONLEGACYWINDOWSFSENCODING

비어 있지 않은 문자열로 설정하면, 기본 @ref{75c,,파일 시스템 인코딩과 에러 처리기} 모드를 3.6 이전의 값인 ‘mbcs’와 ‘replace’로 각각 되돌립니다. 그렇지 않으면, 새 기본값 ‘utf-8’과 ‘surrogatepass’가 사용됩니다.

이것은 또한 실행 시간에 @ref{33e,,sys._enablelegacywindowsfsencoding()} 으로 활성화 될 수 있습니다.

@ref{213c,,가용성}: Windows.


Added in version 3.6: 자세한 내용은 
@geindex Python 향상 제안; PEP 529
PEP 529@footnote{https://peps.python.org/pep-0529/}를 참조하십시오.

@end deffn

@geindex 환경 변수; PYTHONLEGACYWINDOWSSTDIO
@anchor{using/cmdline envvar-PYTHONLEGACYWINDOWSSTDIO}@anchor{e54}
@deffn {환경 변수} PYTHONLEGACYWINDOWSSTDIO

비어 있지 않은 문자열로 설정하면, 새 콘솔 입력기와 출력기를 사용하지 않습니다. 이것은 유니코드 문자가 utf-8을 사용하는 대신 활성 콘솔 코드 페이지에 따라 인코딩됨을 의미합니다.

이 변수는 표준 스트림이 콘솔 버퍼를 참조하는 대신 리디렉트 된 (파일 또는 파이프로) 경우 무시됩니다.

@ref{213c,,가용성}: Windows.


Added in version 3.6.

@end deffn

@geindex 환경 변수; PYTHONCOERCECLOCALE
@anchor{using/cmdline envvar-PYTHONCOERCECLOCALE}@anchor{ccb}
@deffn {환경 변수} PYTHONCOERCECLOCALE

값 @code{0} 으로 설정하면, 주 파이썬 명령 줄 응용 프로그램이 레거시 ASCII 기반 C와 POSIX 로케일을 보다 유능한 UTF-8 기반 대안으로 강제 변환하지 않습니다.

이 변수가 설정되지 `않고' (또는 @code{0} 이외의 값으로 설정되고), 환경 변수에 우선하는 @code{LC_ALL} 로케일도 설정되지 않고, @code{LC_CTYPE} 범주에 대해 보고되는 현재 로케일이 기본 @code{C} 로케일이거나 명시적인 ASCII 기반의 @code{POSIX} 로케일이면, 파이썬 CLI는 인터프리터 런타임을 로드하기 전에 @code{LC_CTYPE} 범주에 대해 다음 로케일을 나열된 순서대로 구성하려고 시도합니다:


@itemize *

@item 
@code{C.UTF-8}

@item 
@code{C.utf8}

@item 
@code{UTF-8}
@end itemize

이러한 로케일 범주 중 하나를 설정하는 데 성공하면, 파이썬 런타임이 초기화되기 전에 @code{LC_CTYPE} 환경 변수도 현재 프로세스 환경에서 적절히 설정됩니다. 이렇게 하면 인터프리터 자신과 같은 프로세스에서 실행되는 다른 로케일 인식 구성 요소(가령 GNU @code{readline} 라이브러리)가 볼 수 있는 것에 더해, 갱신된 설정을 현재 C 로케일이 아닌 환경을 조회하는 연산(가령 파이썬 자체의 @ref{326,,locale.getdefaultlocale()})뿐만 아니라, 자식 프로세스에서도 (이 프로세스가 파이썬 인터프리터를 실행하는지에 관계없이) 볼 수 있습니다.

이러한 로케일 중 하나를 구성하면 (명시적으로나 위의 묵시적 로케일 강제 변경을 통해) @ref{75e,,sys.stdin} 과 @ref{ccc,,sys.stdout} 에 대해 @code{surrogateescape} @ref{1b6d,,에러 처리기} 를 자동으로 활성화합니다 (@ref{b33,,sys.stderr} 는 다른 로케일에서처럼 @code{backslashreplace} 를 계속 사용합니다). 이 스트림 처리 동작은 평소처럼 
@geindex PYTHONIOENCODING
@geindex 환경 변수; PYTHONIOENCODING
@ref{1209,,PYTHONIOENCODING}을 사용하여 대체할 수 있습니다.

디버깅을 위해, @code{PYTHONCOERCECLOCALE=warn} 을 설정하면, 로케일 강제 변경이 일어나거나, 그렇지 않고 강제 변경을 `유발할' 로케일이 파이썬 런타임이 초기화될 때 여전히 활성 상태면 파이썬은 @code{stderr} 로 경고 메시지를 보냅니다.

또한, 로케일 강제 변환이 비활성화되거나 적절한 대상 로케일을 찾지 못할 때도, 레거시 ASCII 기반 로케일에서 
@geindex PYTHONUTF8
@geindex 환경 변수; PYTHONUTF8
@ref{cce,,PYTHONUTF8} 은 기본적으로 활성화됨에 유의하십시오. 인터프리터가 시스템 인터페이스에 대해 @code{UTF-8} 대신에 @code{ASCII} 를 사용하게 하려면, 두 가지 기능을 모두 비활성화시켜야 합니다.

@ref{213c,,가용성}: Unix.


Added in version 3.7: 자세한 내용은 
@geindex Python 향상 제안; PEP 538
PEP 538@footnote{https://peps.python.org/pep-0538/}을 참조하십시오.

@end deffn

@geindex 환경 변수; PYTHONDEVMODE
@anchor{using/cmdline envvar-PYTHONDEVMODE}@anchor{ce6}
@deffn {환경 변수} PYTHONDEVMODE

이 환경 변수가 비어 있지 않은 문자열로 설정되면, @ref{507,,파이썬 개발 모드}를 활성화하여, 기본적으로 활성화하기에는 너무 비싼 추가 실행 시간 검사를 도입합니다. 이는 @ref{16f,,-X} @code{dev} 옵션을 설정하는 것과 동등합니다.


Added in version 3.7.

@end deffn

@geindex 환경 변수; PYTHONUTF8
@anchor{using/cmdline envvar-PYTHONUTF8}@anchor{cce}
@deffn {환경 변수} PYTHONUTF8

If set to @code{1}, enable the @ref{865,,Python UTF-8 Mode}.

If set to @code{0}, disable the @ref{865,,Python UTF-8 Mode}.

다른 모든 비어 있지 않은 문자열로 설정하면, 인터프리터를 초기화하는 동안 에러가 발생합니다.


Added in version 3.7.

@end deffn

@geindex 환경 변수; PYTHONWARNDEFAULTENCODING
@anchor{using/cmdline envvar-PYTHONWARNDEFAULTENCODING}@anchor{9bf}
@deffn {환경 변수} PYTHONWARNDEFAULTENCODING

If this environment variable is set to a non-empty string, issue a
@ref{212b,,EncodingWarning} when the locale-specific default encoding is used.

See @ref{213d,,Opt-in EncodingWarning} for details.


Added in version 3.10.

@end deffn

@geindex 환경 변수; PYTHONNODEBUGRANGES
@anchor{using/cmdline envvar-PYTHONNODEBUGRANGES}@anchor{7d2}
@deffn {환경 변수} PYTHONNODEBUGRANGES

If this variable is set, it disables the inclusion of the tables mapping
extra location information (end line, start column offset and end column
offset) to every instruction in code objects. This is useful when smaller
code objects and pyc files are desired as well as suppressing the extra visual
location indicators when the interpreter displays tracebacks.


Added in version 3.11.

@end deffn

@geindex 환경 변수; PYTHONPERFSUPPORT
@anchor{using/cmdline envvar-PYTHONPERFSUPPORT}@anchor{698}
@deffn {환경 변수} PYTHONPERFSUPPORT

If this variable is set to a nonzero value, it enables support for
the Linux @code{perf} profiler so Python calls can be detected by it.

If set to @code{0}, disable Linux @code{perf} profiler support.

@ref{16f,,-X perf} 명령줄 옵션과 @ref{4b0,,Python support for the Linux perf profiler}도 참조하십시오.


Added in version 3.12.

@end deffn

@geindex 환경 변수; PYTHON_PERF_JIT_SUPPORT
@anchor{using/cmdline envvar-PYTHON_PERF_JIT_SUPPORT}@anchor{4af}
@deffn {환경 변수} PYTHON_PERF_JIT_SUPPORT

If this variable is set to a nonzero value, it enables support for
the Linux @code{perf} profiler so Python calls can be detected by it
using DWARF information.

If set to @code{0}, disable Linux @code{perf} profiler support.

@ref{16f,,-X perf_jit} 명령줄 옵션과 @ref{4b0,,Python support for the Linux perf profiler}도 참조하십시오.


Added in version 3.13.

@end deffn

@geindex 환경 변수; PYTHON_DISABLE_REMOTE_DEBUG
@anchor{using/cmdline envvar-PYTHON_DISABLE_REMOTE_DEBUG}@anchor{16e}
@deffn {환경 변수} PYTHON_DISABLE_REMOTE_DEBUG

If this variable is set to a non-empty string, it disables the remote
debugging feature described in 
@geindex Python 향상 제안; PEP 768
PEP 768@footnote{https://peps.python.org/pep-0768/}. This includes both the functionality
to schedule code for execution in another process and the functionality to
receive code for execution in the current process.

See also the @ref{16f,,-X disable_remote_debug} command-line option.


Added in version 3.14.

@end deffn

@geindex 환경 변수; PYTHON_CPU_COUNT
@anchor{using/cmdline envvar-PYTHON_CPU_COUNT}@anchor{51e}
@deffn {환경 변수} PYTHON_CPU_COUNT

If this variable is set to a positive integer, it overrides the return
values of @ref{4db,,os.cpu_count()} and @ref{51d,,os.process_cpu_count()}.

@ref{16f,,-X cpu_count} 명령줄 옵션도 참조하십시오.


Added in version 3.13.

@end deffn

@geindex 환경 변수; PYTHON_FROZEN_MODULES
@anchor{using/cmdline envvar-PYTHON_FROZEN_MODULES}@anchor{4ae}
@deffn {환경 변수} PYTHON_FROZEN_MODULES

If this variable is set to @code{on} or @code{off}, it determines whether or not
frozen modules are ignored by the import machinery.  A value of @code{on} means
they get imported and @code{off} means they are ignored.  The default is @code{on}
for non-debug builds (the normal case) and @code{off} for debug builds.
Note that the @code{importlib_bootstrap} and
@code{importlib_bootstrap_external} frozen modules are always used, even
if this flag is set to @code{off}.

@ref{16f,,-X frozen_modules} 명령줄 옵션도 참조하십시오.


Added in version 3.13.

@end deffn

@geindex 환경 변수; PYTHON_COLORS
@anchor{using/cmdline envvar-PYTHON_COLORS}@anchor{476}
@deffn {환경 변수} PYTHON_COLORS

If this variable is set to @code{1}, the interpreter will colorize various kinds
of output. Setting it to @code{0} deactivates this behavior.
See also @ref{1b7,,Controlling color}.


Added in version 3.13.

@end deffn

@geindex 환경 변수; PYTHON_BASIC_REPL
@anchor{using/cmdline envvar-PYTHON_BASIC_REPL}@anchor{1b6}
@deffn {환경 변수} PYTHON_BASIC_REPL

If this variable is set to any value, the interpreter will not attempt to
load the Python-based @ref{492,,REPL} that requires @ref{bf,,readline}, and will
instead use the traditional parser-based REPL.


Added in version 3.13.

@end deffn

@geindex 환경 변수; PYTHON_HISTORY
@anchor{using/cmdline envvar-PYTHON_HISTORY}@anchor{4b1}
@deffn {환경 변수} PYTHON_HISTORY

This environment variable can be used to set the location of a
@code{.python_history} file (by default, it is @code{.python_history} in the
user’s home directory).


Added in version 3.13.

@end deffn

@geindex 환경 변수; PYTHON_GIL
@anchor{using/cmdline envvar-PYTHON_GIL}@anchor{49b}
@deffn {환경 변수} PYTHON_GIL

If this variable is set to @code{1}, the global interpreter lock (GIL) will be
forced on. Setting it to @code{0} forces the GIL off (needs Python configured with
the @ref{49a,,--disable-gil} build option).

See also the @ref{16f,,-X gil} command-line option, which takes
precedence over this variable, and @ref{46d,,제한 없는 스레드를 사용하는 파이썬(CPython)}.


Added in version 3.13.

@end deffn

@geindex 환경 변수; PYTHON_THREAD_INHERIT_CONTEXT
@anchor{using/cmdline envvar-PYTHON_THREAD_INHERIT_CONTEXT}@anchor{186b}
@deffn {환경 변수} PYTHON_THREAD_INHERIT_CONTEXT

If this variable is set to @code{1} then @ref{176,,Thread} will,
by default, use a copy of context of the caller of @code{Thread.start()}
when starting.  Otherwise, new threads will start with an empty context.
If unset, this variable defaults to @code{1} on free-threaded builds and to
@code{0} otherwise.  See also @ref{16f,,-X thread_inherit_context}.


Added in version 3.14.

@end deffn

@geindex 환경 변수; PYTHON_CONTEXT_AWARE_WARNINGS
@anchor{using/cmdline envvar-PYTHON_CONTEXT_AWARE_WARNINGS}@anchor{185e}
@deffn {환경 변수} PYTHON_CONTEXT_AWARE_WARNINGS

If set to @code{1} then the @ref{179,,warnings.catch_warnings} context
manager will use a @ref{1878,,ContextVar} to store warnings
filter state.  If unset, this variable defaults to @code{1} on
free-threaded builds and to @code{0} otherwise.  See @ref{16f,,-X context_aware_warnings}.


Added in version 3.14.

@end deffn

@geindex 환경 변수; PYTHON_JIT
@anchor{using/cmdline envvar-PYTHON_JIT}@anchor{44d}
@deffn {환경 변수} PYTHON_JIT

On builds where experimental just-in-time compilation is available, this
variable can force the JIT to be disabled (@code{0}) or enabled (@code{1}) at
interpreter startup.


Added in version 3.13.

@end deffn

@geindex 환경 변수; PYTHON_TLBC
@anchor{using/cmdline envvar-PYTHON_TLBC}@anchor{212d}
@deffn {환경 변수} PYTHON_TLBC

If set to @code{1} enables thread-local bytecode. If set to @code{0} thread-local
bytecode and the specializing interpreter are disabled.  Only applies to
builds configured with @ref{49a,,--disable-gil}.

See also the @ref{16f,,-X tlbc} command-line option.


Added in version 3.14.

@end deffn

@menu
* 디버그 모드 변수:: 

@end menu

@node 디버그 모드 변수,,,환경 변수
@anchor{using/cmdline debug-mode-variables}@anchor{213e}
@subsubsection 디버그 모드 변수


@geindex 환경 변수; PYTHONDUMPREFS
@anchor{using/cmdline envvar-PYTHONDUMPREFS}@anchor{b9d}
@deffn {환경 변수} PYTHONDUMPREFS

설정되면, 파이썬은 인터프리터를 종료한 후에도 살아있는 객체와 참조 횟수를 덤프합니다.

파이썬이 @ref{634,,--with-trace-refs} 빌드 옵션으로 구성되었어야 합니다.
@end deffn

@geindex 환경 변수; PYTHONDUMPREFSFILE
@anchor{using/cmdline envvar-PYTHONDUMPREFSFILE}@anchor{1c3d}
@deffn {환경 변수} PYTHONDUMPREFSFILE

설정되면, 파이썬은 인터프리터를 종료한 후에도 살아있는 객체와 참조 횟수를 이 환경 변수의 값으로 주어진 경로에 파일로 덤프합니다.

파이썬이 @ref{634,,--with-trace-refs} 빌드 옵션으로 구성되었어야 합니다.


Added in version 3.11.

@end deffn

@geindex 환경 변수; PYTHON_PRESITE
@anchor{using/cmdline envvar-PYTHON_PRESITE}@anchor{212c}
@deffn {환경 변수} PYTHON_PRESITE

If this variable is set to a module, that module will be imported
early in the interpreter lifecycle, before the @ref{cc,,site} module is
executed, and before the @ref{1,,__main__} module is created.
Therefore, the imported module is not treated as @code{__main__}.

This can be used to execute code early during Python initialization.

To import a submodule, use @code{package.module} as the value, like in
an import statement.

See also the @ref{16f,,-X presite} command-line option,
which takes precedence over this variable.

파이썬이 @ref{664,,--with-pydebug} 빌드 옵션으로 구성되었어야 합니다.


Added in version 3.13.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 유닉스 플랫폼에서 파이썬 사용하기,Configure Python,명령 줄과 환경,파이썬 설정 및 사용법
@anchor{using/unix doc}@anchor{213f}@anchor{using/unix translation-repo}@anchor{2140}@anchor{using/unix using-on-unix}@anchor{2141}@anchor{using/unix using-python-on-unix-platforms}@anchor{2142}
@section 유닉스 플랫폼에서 파이썬 사용하기


@menu
* 최신 버전의 파이썬 내려받기와 설치:: 
* 파이썬 빌드하기:: 
* 파이썬 관련 경로와 파일:: 
* 잡동사니: 잡동사니<2>. 
* Custom OpenSSL:: 

@end menu

@node 최신 버전의 파이썬 내려받기와 설치,파이썬 빌드하기,,유닉스 플랫폼에서 파이썬 사용하기
@anchor{using/unix getting-and-installing-the-latest-version-of-python}@anchor{2143}
@subsection 최신 버전의 파이썬 내려받기와 설치


@menu
* 리눅스:: 
* FreeBSD와 OpenBSD:: 

@end menu

@node 리눅스,FreeBSD와 OpenBSD,,최신 버전의 파이썬 내려받기와 설치
@anchor{using/unix on-linux}@anchor{2144}
@subsubsection 리눅스


파이썬은 대부분 리눅스 배포판에 사전 설치되어 있으며, 다른 모든 곳에서 패키지로 사용할 수 있습니다. 그러나 배포판 패키지에 없는 어떤 기능을 사용하고 싶을 수 있습니다. 소스에서 최신 버전의 파이썬을 컴파일할 수 있습니다.

최신 버전의 파이썬이 미리 설치되어 있지 않고 저장소에도 없으면, 여러분 자신의 배포를 위한 패키지를 만들 수 있습니다. 다음 링크를 살펴보십시오:


@subsubheading 더 보기



@table @asis

@item @indicateurl{https://www.debian.org/doc/manuals/maint-guide/first.en.html}

데비안 사용자용

@item @indicateurl{https://en.opensuse.org/Portal:Packaging}

OpenSuse 사용자용

@item @indicateurl{https://docs.fedoraproject.org/en-US/package-maintainers/Packaging_Tutorial_GNU_Hello/}

Fedora 사용자용

@item @indicateurl{https://slackbook.org/html/package-management-making-packages.html}

Slackware 사용자용
@end table


@menu
* Installing IDLE:: 

@end menu

@node Installing IDLE,,,리눅스
@anchor{using/unix installing-idle}@anchor{2145}@anchor{using/unix installing-idle-on-linux}@anchor{2146}
@subsubsection Installing IDLE


In some cases, IDLE might not be included in your Python installation.


@itemize *

@item 
데비안과 우분투 사용자용:

@example
sudo apt update
sudo apt install idle
@end example

@item 
Fedora, RHEL 및 CentOS 사용자용:

@example
sudo dnf install python3-idle
@end example

@item 
SUSE 와 OpenSuse 사용자용:

@example
sudo zypper install python3-idle
@end example

@item 
알파인 리눅스 사용자용:

@example
sudo apk add python3-idle
@end example
@end itemize

@node FreeBSD와 OpenBSD,,리눅스,최신 버전의 파이썬 내려받기와 설치
@anchor{using/unix on-freebsd-and-openbsd}@anchor{2147}
@subsubsection FreeBSD와 OpenBSD



@itemize *

@item 
FreeBSD 사용자, 패키지를 추가하려면 이렇게 하십시오:

@example
pkg install python3
@end example

@item 
OpenBSD 사용자, 패키지를 추가하려면 이렇게 하십시오:

@example
pkg_add -r python

pkg_add ftp://ftp.openbsd.org/pub/OpenBSD/4.2/packages/<insert your architecture here>/python-<version>.tgz
@end example

예를 들어 i386 사용자는 이렇게 파이썬 2.5.1 버전을 얻습니다:

@example
pkg_add ftp://ftp.openbsd.org/pub/OpenBSD/4.2/packages/i386/python-2.5.1p2.tgz
@end example
@end itemize

@node 파이썬 빌드하기,파이썬 관련 경로와 파일,최신 버전의 파이썬 내려받기와 설치,유닉스 플랫폼에서 파이썬 사용하기
@anchor{using/unix building-python}@anchor{2148}@anchor{using/unix building-python-on-unix}@anchor{10f5}
@subsection 파이썬 빌드하기



@subsubheading 더 보기


If you want to contribute to CPython, refer to the
devguide@footnote{https://devguide.python.org/getting-started/setup-building/},
which includes build instructions and other tips on setting up environment.


If you want to compile CPython yourself, first thing you should do is get the
source@footnote{https://www.python.org/downloads/source/}. You can download either the
latest release’s source or grab a fresh clone@footnote{https://devguide.python.org/setup/#get-the-source-code}.
You will also need to install the @ref{2149,,build requirements}.

빌드 프로세스는 일반적으로 다음과 같은 명령으로 구성됩니다

@example
./configure
make
make install
@end example

특정 유닉스 플랫폼에 대한 @ref{214a,,구성 옵션}과 주의 사항은 파이썬 소스 트리의 루트에 있는 README.rst@footnote{https://github.com/python/cpython/tree/3.14/README.rst} 파일에 광범위하게 설명되어있습니다.

@cartouche
@quotation 경고 
@code{make install}은 @code{python3} 바이너리를 덮어쓰거나 가장 할 수 있습니다. 따라서 @code{make altinstall}을 @code{make install} 대신 권장하는데, @code{`exec_prefix'/bin/python`version'} 만 설치하기 때문입니다.
@end quotation
@end cartouche

@node 파이썬 관련 경로와 파일,잡동사니<2>,파이썬 빌드하기,유닉스 플랫폼에서 파이썬 사용하기
@anchor{using/unix python-related-paths-and-files}@anchor{214b}
@subsection 파이썬 관련 경로와 파일


이는 지역 설치 규칙에 따라 달라질 수 있습니다; @ref{214c,,prefix} 와 @ref{214d,,exec_prefix}는 설치에 따라 다르며 GNU 소프트웨어처럼 해석되어야 합니다; 이것들은 같을 수도 있습니다.

예를 들어, 대부분 리눅스 시스템에서, 기본값은 모두 @code{/usr}입니다.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

파일/디렉터리

@tab

의미

@item

@code{`exec_prefix'/bin/python3}

@tab

인터프리터의 권장 위치.

@item

@code{`prefix'/lib/python`version'},
@code{`exec_prefix'/lib/python`version'}

@tab

표준 모듈을 포함하는 디렉터리의 권장 위치.

@item

@code{`prefix'/include/python`version'},
@code{`exec_prefix'/include/python`version'}

@tab

파이썬 확장을 개발하고 인터프리터를 내장하는 데 필요한 인클루드 파일을 포함하는 디렉터리의 권장 위치.

@end multitable


@node 잡동사니<2>,Custom OpenSSL,파이썬 관련 경로와 파일,유닉스 플랫폼에서 파이썬 사용하기
@anchor{using/unix miscellaneous}@anchor{214e}
@subsection 잡동사니


유닉스에서 파이썬 스크립트를 쉽게 사용하려면, 실행 파일로 만들어야 합니다. 예를 들어, 이렇게

@example
$ chmod +x script
@end example

그리고, 스크립트의 상단에 적절한 셔뱅(Shebang) 줄을 넣습니다. 좋은 선택은 대개 이렇습니다

@example
#!/usr/bin/env python3
@end example

이것은 
@geindex PATH
@geindex 환경 변수; PATH
@code{PATH} 전체에서 파이썬 인터프리터를 검색합니다. 그러나, 일부 유닉스에는 @code{env} 명령이 없을 수 있으므로, 인터프리터 경로로 @code{/usr/bin/python3}를 하드 코딩해야 할 수 있습니다.

파이썬 스크립트에서 셸 명령을 사용하려면, @ref{dc,,subprocess} 모듈을 보십시오.

@node Custom OpenSSL,,잡동사니<2>,유닉스 플랫폼에서 파이썬 사용하기
@anchor{using/unix custom-openssl}@anchor{214f}@anchor{using/unix unix-custom-openssl}@anchor{2150}
@subsection Custom OpenSSL



@enumerate 

@item 
To use your vendor’s OpenSSL configuration and system trust store, locate
the directory with @code{openssl.cnf} file or symlink in @code{/etc}. On most
distribution the file is either in @code{/etc/ssl} or @code{/etc/pki/tls}. The
directory should also contain a @code{cert.pem} file and/or a @code{certs}
directory.

@example
$ find /etc/ -name openssl.cnf -printf "%h\n"
/etc/ssl
@end example

@item 
Download, build, and install OpenSSL. Make sure you use @code{install_sw} and
not @code{install}. The @code{install_sw} target does not override
@code{openssl.cnf}.

@example
$ curl -O https://www.openssl.org/source/openssl-VERSION.tar.gz
$ tar xzf openssl-VERSION
$ pushd openssl-VERSION
$ ./config \
    --prefix=/usr/local/custom-openssl \
    --libdir=lib \
    --openssldir=/etc/ssl
$ make -j1 depend
$ make -j8
$ make install_sw
$ popd
@end example

@item 
Build Python with custom OpenSSL
(see the configure @code{--with-openssl} and @code{--with-openssl-rpath} options)

@example
$ pushd python-3.x.x
$ ./configure -C \
    --with-openssl=/usr/local/custom-openssl \
    --with-openssl-rpath=auto \
    --prefix=/usr/local/python-3.x.x
$ make -j8
$ make altinstall
@end example
@end enumerate

@cartouche
@quotation 참고 
Patch releases of OpenSSL have a backwards compatible ABI. You don’t need
to recompile Python to update OpenSSL. It’s sufficient to replace the
custom OpenSSL installation with a newer version.
@end quotation
@end cartouche

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Configure Python,윈도우에서 파이썬 사용하기,유닉스 플랫폼에서 파이썬 사용하기,파이썬 설정 및 사용법
@anchor{using/configure doc}@anchor{2151}@anchor{using/configure configure-python}@anchor{2152}@anchor{using/configure translation-repo}@anchor{2153}
@section Configure Python


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

@end menu

@node Build Requirements,Generated files,,Configure Python
@anchor{using/configure build-requirements}@anchor{2149}@anchor{using/configure id1}@anchor{2154}
@subsection Build Requirements


To build CPython, you will need:


@itemize *

@item 
A C11@footnote{https://en.cppreference.com/w/c/11} compiler. Optional C11 features@footnote{https://en.wikipedia.org/wiki/C11_(C_standard_revision)#Optional_features}
are not required.

@item 
On Windows, Microsoft Visual Studio 2017 or later is required.

@item 
Support for IEEE 754@footnote{https://en.wikipedia.org/wiki/IEEE_754}
floating-point numbers and floating-point Not-a-Number (NaN)@footnote{https://en.wikipedia.org/wiki/NaN#Floating_point}.

@item 
Support for threads.
@end itemize


버전 3.5에서 변경: On Windows, Visual Studio 2015 or later is now required.



버전 3.6에서 변경: Selected C99 features, like @code{<stdint.h>} and @code{static inline} functions,
are now required.



버전 3.7에서 변경: Thread support is now required.



버전 3.11에서 변경: C11 compiler, IEEE 754 and NaN support are now required.
On Windows, Visual Studio 2017 or later is required.


See also 
@geindex Python 향상 제안; PEP 7
PEP 7@footnote{https://peps.python.org/pep-0007/} “Style Guide for C Code” and 
@geindex Python 향상 제안; PEP 11
PEP 11@footnote{https://peps.python.org/pep-0011/} “CPython platform
support”.

@menu
* Requirements for optional modules:: 

@end menu

@node Requirements for optional modules,,,Build Requirements
@anchor{using/configure optional-module-requirements}@anchor{2155}@anchor{using/configure requirements-for-optional-modules}@anchor{2156}
@subsubsection Requirements for optional modules


Some @ref{2157,,optional modules} of the standard library
require third-party libraries installed for development
(for example, header files must be available).

Missing requirements are reported in the @code{configure} output.
Modules that are missing due to missing dependencies are listed near the end
of the @code{make} output,
sometimes using an internal name, for example, @code{_ctypes} for @ref{2e,,ctypes}
module.

If you distribute a CPython interpreter without optional modules,
it’s best practice to advise users, who generally expect that
standard library modules are available.

Dependencies to build optional modules are:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Dependency

@tab

Minimum version

@tab

Python module

@item

libbz2@footnote{https://sourceware.org/bzip2/}

@tab

@tab

@ref{14,,bz2}

@item

libffi@footnote{https://sourceware.org/libffi/}

@tab

3.3.0 recommended

@tab

@ref{2e,,ctypes}

@item

liblzma@footnote{https://tukaani.org/xz/}

@tab

@tab

@ref{8e,,lzma}

@item

libmpdec@footnote{https://www.bytereef.org/mpdecimal/doc/libmpdec/}

@tab

2.5.0

@tab

@ref{3a,,decimal} @footnote{
If `libmpdec' is not available, the @ref{3a,,decimal} module will use
a pure-Python implementation.
See @ref{655,,--with-system-libmpdec} for details.
}

@item

libreadline@footnote{https://tiswww.case.edu/php/chet/readline/rltop.html} or
libedit@footnote{https://www.thrysoee.dk/editline/} @footnote{
See @ref{2158,,--with-readline} for choosing the backend for the
@ref{bf,,readline} module.
}

@tab

@tab

@ref{bf,,readline}

@item

libuuid@footnote{https://linux.die.net/man/3/libuuid}

@tab

@tab

@code{_uuid} @footnote{
The @ref{116,,uuid} module uses @code{_uuid} to generate “safe” UUIDs.
See the module documentation for details.
}

@item

ncurses@footnote{https://gnu.org/software/ncurses/ncurses.html} @footnote{
The @ref{2f,,curses} module requires the @code{libncurses} or @code{libncursesw}
library.
The @ref{31,,curses.panel} module additionally requires the @code{libpanel} or
@code{libpanelw} library.
}

@tab

@tab

@ref{2f,,curses}

@item

OpenSSL@footnote{https://openssl-library.org/}

@tab


@display
3.0.18 recommended@w{ }
(1.1.1 minimum)@w{ }
@end display



@tab

@ref{d5,,ssl}, @ref{6c,,hashlib} @footnote{
If OpenSSL is not available, the @ref{6c,,hashlib} module will use
bundled implementations of several hash functions.
See @ref{2159,,--with-builtin-hashlib-hashes} for `forcing' usage of OpenSSL.
}

@item

SQLite@footnote{https://sqlite.org/}

@tab

3.15.2

@tab

@ref{d4,,sqlite3}

@item

Tcl/Tk@footnote{https://www.tcl-lang.org/}

@tab

8.5.12

@tab

@ref{f6,,tkinter}, @ref{1214,,IDLE}, @ref{107,,turtle}

@item

zlib@footnote{https://www.zlib.net}

@tab

1.2.2.1

@tab

@ref{139,,zlib}, @ref{6b,,gzip}, @ref{59,,ensurepip}

@item

zstd@footnote{https://facebook.github.io/zstd/}

@tab

1.4.5

@tab

@ref{23,,compression.zstd}

@end multitable


Note that the table does not include all optional modules; in particular,
platform-specific modules like @ref{11c,,winreg} are not listed here.


@subsubheading 더 보기



@itemize *

@item 
The devguide@footnote{https://devguide.python.org/getting-started/setup-building/#install-dependencies}
includes a full list of dependencies required to build all modules and
instructions on how to install them on common platforms.

@item 
@ref{1b2b,,--with-system-expat} allows building with an external
libexpat@footnote{https://libexpat.github.io/} library.

@item 
@ref{215a,,Options for third-party dependencies}
@end itemize



버전 3.1에서 변경: Tcl/Tk version 8.3.1 is now required for @ref{f6,,tkinter}.



버전 3.5에서 변경: Tcl/Tk version 8.4 is now required for @ref{f6,,tkinter}.



버전 3.7에서 변경: OpenSSL 1.0.2 is now required for @ref{6c,,hashlib} and @ref{d5,,ssl}.



버전 3.10에서 변경: OpenSSL 1.1.1 is now required for @ref{6c,,hashlib} and @ref{d5,,ssl}.
SQLite 3.7.15 is now required for @ref{d4,,sqlite3}.



버전 3.11에서 변경: Tcl/Tk version 8.5.12 is now required for @ref{f6,,tkinter}.



버전 3.13에서 변경: SQLite 3.15.2 is now required for @ref{d4,,sqlite3}.


@node Generated files,Configure Options,Build Requirements,Configure Python
@anchor{using/configure generated-files}@anchor{215b}
@subsection Generated files


To reduce build dependencies, Python source code contains multiple generated
files. Commands to regenerate all generated files:

@example
make regen-all
make regen-stdlib-module-names
make regen-limited-abi
make regen-configure
@end example

The @code{Makefile.pre.in} file documents generated files, their inputs, and tools used
to regenerate them. Search for @code{regen-*} make targets.

@menu
* configure script:: 

@end menu

@node configure script,,,Generated files
@anchor{using/configure configure-script}@anchor{215c}
@subsubsection configure script


The @code{make regen-configure} command regenerates the @code{aclocal.m4} file and
the @code{configure} script using the @code{Tools/build/regen-configure.sh} shell
script which uses an Ubuntu container to get the same tools versions and have a
reproducible output.

The container is optional, the following command can be run locally:

@example
autoreconf -ivf -Werror
@end example

The generated files can change depending on the exact versions of the
tools used.
The container that CPython uses has
Autoconf@footnote{https://gnu.org/software/autoconf} 2.72,
@code{aclocal} from Automake@footnote{https://www.gnu.org/software/automake} 1.16.5,
and pkg-config@footnote{https://www.freedesktop.org/wiki/Software/pkg-config/} 1.8.1.


버전 3.13에서 변경: Autoconf 2.71 and aclocal 1.16.5 and are now used to regenerate
@code{configure}.



버전 3.14에서 변경: Autoconf 2.72 is now used to regenerate @code{configure}.


@node Configure Options,Python Build System,Generated files,Configure Python
@anchor{using/configure configure-options}@anchor{214a}@anchor{using/configure id12}@anchor{215d}
@subsection Configure Options


List all @code{configure} script options using:

@example
./configure --help
@end example

See also the @code{Misc/SpecialBuilds.txt} in the Python source distribution.

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

@end menu

@node General Options,C compiler options,,Configure Options
@anchor{using/configure general-options}@anchor{215e}
@subsubsection General Options


@geindex 명령줄 옵션; --enable-loadable-sqlite-extensions
@anchor{using/configure cmdoption-enable-loadable-sqlite-extensions}@anchor{215f}
@deffn {Option} @w{-}@w{-}enable@w{-}loadable@w{-}sqlite@w{-}extensions

Support loadable extensions in the @code{_sqlite} extension module (default
is no) of the @ref{d4,,sqlite3} module.

See the @ref{a3f,,sqlite3.Connection.enable_load_extension()} method of the
@ref{d4,,sqlite3} module.


Added in version 3.6.

@end deffn

@geindex 명령줄 옵션; --disable-ipv6
@anchor{using/configure cmdoption-disable-ipv6}@anchor{2160}
@deffn {Option} @w{-}@w{-}disable@w{-}ipv6

Disable IPv6 support (enabled by default if supported), see the
@ref{d1,,socket} module.
@end deffn

@geindex 명령줄 옵션; --enable-big-digits
@anchor{using/configure cmdoption-enable-big-digits}@anchor{952}
@deffn {Option} @w{-}@w{-}enable@w{-}big@w{-}digits=[15|30]

Define the size in bits of Python @ref{19b,,int} digits: 15 or 30 bits.

By default, the digit size is 30.

Define the @code{PYLONG_BITS_IN_DIGIT} to @code{15} or @code{30}.

See @ref{1498,,sys.int_info.bits_per_digit}.
@end deffn

@geindex 명령줄 옵션; --with-suffix
@anchor{using/configure cmdoption-with-suffix}@anchor{2161}
@deffn {Option} @w{-}@w{-}with@w{-}suffix=SUFFIX

Set the Python executable suffix to `SUFFIX'.

The default suffix is @code{.exe} on Windows and macOS (@code{python.exe}
executable), @code{.js} on Emscripten node, @code{.html} on Emscripten browser,
@code{.wasm} on WASI, and an empty string on other platforms (@code{python}
executable).


버전 3.11에서 변경: The default suffix on WASM platform is one of @code{.js}, @code{.html}
or @code{.wasm}.

@end deffn

@geindex 명령줄 옵션; --with-tzpath
@anchor{using/configure cmdoption-with-tzpath}@anchor{2162}
@deffn {Option} @w{-}@w{-}with@w{-}tzpath=<list of absolute paths separated by pathsep>

Select the default time zone search path for @ref{2163,,zoneinfo.TZPATH}.
See the @ref{2164,,Compile-time configuration} of the @ref{13a,,zoneinfo} module.

Default: @code{/usr/share/zoneinfo:/usr/lib/zoneinfo:/usr/share/lib/zoneinfo:/etc/zoneinfo}.

See @ref{2131,,os.pathsep} path separator.


Added in version 3.9.

@end deffn

@geindex 명령줄 옵션; --without-decimal-contextvar
@anchor{using/configure cmdoption-without-decimal-contextvar}@anchor{2165}
@deffn {Option} @w{-}@w{-}without@w{-}decimal@w{-}contextvar

Build the @code{_decimal} extension module using a thread-local context rather
than a coroutine-local context (default), see the @ref{3a,,decimal} module.

See @ref{2166,,decimal.HAVE_CONTEXTVAR} and the @ref{28,,contextvars} module.


Added in version 3.9.

@end deffn

@geindex 명령줄 옵션; --with-dbmliborder
@anchor{using/configure cmdoption-with-dbmliborder}@anchor{2167}
@deffn {Option} @w{-}@w{-}with@w{-}dbmliborder=<list of backend names>

Override order to check db backends for the @ref{35,,dbm} module

A valid value is a colon (@code{:}) separated string with the backend names:


@itemize *

@item 
@code{ndbm};

@item 
@code{gdbm};

@item 
@code{bdb}.
@end itemize
@end deffn

@geindex 명령줄 옵션; --without-c-locale-coercion
@anchor{using/configure cmdoption-without-c-locale-coercion}@anchor{2168}
@deffn {Option} @w{-}@w{-}without@w{-}c@w{-}locale@w{-}coercion

Disable C locale coercion to a UTF-8 based locale (enabled by default).

Don’t define the @code{PY_COERCE_C_LOCALE} macro.

See 
@geindex PYTHONCOERCECLOCALE
@geindex 환경 변수; PYTHONCOERCECLOCALE
@ref{ccb,,PYTHONCOERCECLOCALE} and the 
@geindex Python 향상 제안; PEP 538
PEP 538@footnote{https://peps.python.org/pep-0538/}.
@end deffn

@geindex 명령줄 옵션; --with-platlibdir
@anchor{using/configure cmdoption-with-platlibdir}@anchor{2169}
@deffn {Option} @w{-}@w{-}with@w{-}platlibdir=DIRNAME

Python library directory name (default is @code{lib}).

Fedora and SuSE use @code{lib64} on 64-bit platforms.

See @ref{b32,,sys.platlibdir}.


Added in version 3.9.

@end deffn

@geindex 명령줄 옵션; --with-wheel-pkg-dir
@anchor{using/configure cmdoption-with-wheel-pkg-dir}@anchor{a8d}
@deffn {Option} @w{-}@w{-}with@w{-}wheel@w{-}pkg@w{-}dir=PATH

Directory of wheel packages used by the @ref{59,,ensurepip} module
(none by default).

Some Linux distribution packaging policies recommend against bundling
dependencies. For example, Fedora installs wheel packages in the
@code{/usr/share/python-wheels/} directory and don’t install the
@code{ensurepip._bundled} package.


Added in version 3.10.

@end deffn

@geindex 명령줄 옵션; --with-pkg-config
@anchor{using/configure cmdoption-with-pkg-config}@anchor{216a}
@deffn {Option} @w{-}@w{-}with@w{-}pkg@w{-}config=[check|yes|no]

Whether configure should use @code{pkg-config} to detect build
dependencies.


@itemize *

@item 
@code{check} (default): @code{pkg-config} is optional

@item 
@code{yes}: @code{pkg-config} is mandatory

@item 
@code{no}: configure does not use @code{pkg-config} even when present
@end itemize


Added in version 3.11.

@end deffn

@geindex 명령줄 옵션; --enable-pystats
@anchor{using/configure cmdoption-enable-pystats}@anchor{1b36}
@deffn {Option} @w{-}@w{-}enable@w{-}pystats

Turn on internal Python performance statistics gathering.

By default, statistics gathering is off. Use @code{python3 -X pystats} command
or set @code{PYTHONSTATS=1} environment variable to turn on statistics
gathering at Python startup.

At Python exit, dump statistics if statistics gathering was on and not
cleared.

Effects:


@itemize *

@item 
Add @ref{16f,,-X pystats} command line option.

@item 
Add @code{PYTHONSTATS} environment variable.

@item 
Define the @code{Py_STATS} macro.

@item 
Add functions to the @ref{df,,sys} module:


@itemize *

@item 
@code{sys._stats_on()}: Turns on statistics gathering.

@item 
@code{sys._stats_off()}: Turns off statistics gathering.

@item 
@code{sys._stats_clear()}: Clears the statistics.

@item 
@code{sys._stats_dump()}: Dump statistics to file, and clears the statistics.
@end itemize
@end itemize

The statistics will be dumped to a arbitrary (probably unique) file in
@code{/tmp/py_stats/} (Unix) or @code{C:\temp\py_stats\} (Windows). If that
directory does not exist, results will be printed on stderr.

Use @code{Tools/scripts/summarize_stats.py} to read the stats.

Statistics:


@itemize *

@item 
Opcode:


@itemize *

@item 
Specialization: success, failure, hit, deferred, miss, deopt, failures;

@item 
Execution count;

@item 
Pair count.
@end itemize

@item 
Call:


@itemize *

@item 
Inlined Python calls;

@item 
PyEval calls;

@item 
Frames pushed;

@item 
Frame object created;

@item 
Eval calls: vector, generator, legacy, function VECTORCALL, build class,
slot, function “ex”, API, method.
@end itemize

@item 
Object:


@itemize *

@item 
incref and decref;

@item 
interpreter incref and decref;

@item 
allocations: all, 512 bytes, 4 kiB, big;

@item 
free;

@item 
to/from free lists;

@item 
dictionary materialized/dematerialized;

@item 
type cache;

@item 
optimization attempts;

@item 
optimization traces created/executed;

@item 
uops executed.
@end itemize

@item 
Garbage collector:


@itemize *

@item 
Garbage collections;

@item 
Objects visited;

@item 
Objects collected.
@end itemize
@end itemize


Added in version 3.11.

@end deffn

@geindex 명령줄 옵션; --disable-gil
@anchor{using/configure free-threading-build}@anchor{216b}@anchor{using/configure cmdoption-disable-gil}@anchor{49a}
@deffn {Option} @w{-}@w{-}disable@w{-}gil

Enables support for running Python without the @ref{474,,global interpreter lock} (GIL): @ref{1767,,free-threaded build}.

Defines the @code{Py_GIL_DISABLED} macro and adds @code{"t"} to
@ref{c58,,sys.abiflags}.

See @ref{46d,,제한 없는 스레드를 사용하는 파이썬(CPython)} for more detail.


Added in version 3.13.

@end deffn

@geindex 명령줄 옵션; --enable-experimental-jit
@anchor{using/configure cmdoption-enable-experimental-jit}@anchor{44e}
@deffn {Option} @w{-}@w{-}enable@w{-}experimental@w{-}jit=[no|yes|yes@w{-}off|interpreter]

Indicate how to integrate the @ref{159,,experimental just-in-time compiler}.


@itemize *

@item 
@code{no}: Don’t build the JIT.

@item 
@code{yes}: Enable the JIT. To disable it at runtime, set the environment
variable 
@geindex PYTHON_JIT
@geindex 환경 변수; PYTHON_JIT
@ref{44d,,PYTHON_JIT=0}.

@item 
@code{yes-off}: Build the JIT, but disable it by default. To enable it at
runtime, set the environment variable 
@geindex PYTHON_JIT
@geindex 환경 변수; PYTHON_JIT
@ref{44d,,PYTHON_JIT=1}.

@item 
@code{interpreter}: Enable the “JIT interpreter” (only useful for those
debugging the JIT itself). To disable it at runtime, set the environment
variable 
@geindex PYTHON_JIT
@geindex 환경 변수; PYTHON_JIT
@ref{44d,,PYTHON_JIT=0}.
@end itemize

@code{--enable-experimental-jit=no} is the default behavior if the option is not
provided, and @code{--enable-experimental-jit} is shorthand for
@code{--enable-experimental-jit=yes}.  See @code{Tools/jit/README.md} for more
information, including how to install the necessary build-time dependencies.

@cartouche
@quotation 참고 
When building CPython with JIT enabled, ensure that your system has Python 3.11 or later installed.
@end quotation
@end cartouche


Added in version 3.13.

@end deffn

@geindex 명령줄 옵션; PKG_CONFIG
@anchor{using/configure cmdoption-arg-PKG_CONFIG}@anchor{216c}
@deffn {Option} PKG_CONFIG

Path to @code{pkg-config} utility.
@end deffn

@geindex 명령줄 옵션; PKG_CONFIG_LIBDIR
@anchor{using/configure cmdoption-arg-PKG_CONFIG_LIBDIR}@anchor{216d}
@deffn {Option} PKG_CONFIG_LIBDIR
@end deffn

@geindex 명령줄 옵션; PKG_CONFIG_PATH
@anchor{using/configure cmdoption-arg-PKG_CONFIG_PATH}@anchor{216e}
@deffn {Option} PKG_CONFIG_PATH

@code{pkg-config} options.
@end deffn

@node C compiler options,Linker options,General Options,Configure Options
@anchor{using/configure c-compiler-options}@anchor{216f}
@subsubsection C compiler options


@geindex 명령줄 옵션; CC
@anchor{using/configure cmdoption-arg-CC}@anchor{2170}
@deffn {Option} CC

C compiler command.
@end deffn

@geindex 명령줄 옵션; CFLAGS
@anchor{using/configure cmdoption-arg-CFLAGS}@anchor{2171}
@deffn {Option} CFLAGS

C compiler flags.
@end deffn

@geindex 명령줄 옵션; CPP
@anchor{using/configure cmdoption-arg-CPP}@anchor{2172}
@deffn {Option} CPP

C preprocessor command.
@end deffn

@geindex 명령줄 옵션; CPPFLAGS
@anchor{using/configure cmdoption-arg-CPPFLAGS}@anchor{2173}
@deffn {Option} CPPFLAGS

C preprocessor flags, e.g. @code{-I@var{include_dir}}.
@end deffn

@node Linker options,Options for third-party dependencies,C compiler options,Configure Options
@anchor{using/configure linker-options}@anchor{2174}
@subsubsection Linker options


@geindex 명령줄 옵션; LDFLAGS
@anchor{using/configure cmdoption-arg-LDFLAGS}@anchor{2175}
@deffn {Option} LDFLAGS

Linker flags, e.g. @code{-L@var{library_directory}}.
@end deffn

@geindex 명령줄 옵션; LIBS
@anchor{using/configure cmdoption-arg-LIBS}@anchor{2176}
@deffn {Option} LIBS

Libraries to pass to the linker, e.g. @code{-l@var{library}}.
@end deffn

@geindex 명령줄 옵션; MACHDEP
@anchor{using/configure cmdoption-arg-MACHDEP}@anchor{2177}
@deffn {Option} MACHDEP

Name for machine-dependent library files.
@end deffn

@node Options for third-party dependencies,WebAssembly Options,Linker options,Configure Options
@anchor{using/configure configure-options-for-dependencies}@anchor{215a}@anchor{using/configure options-for-third-party-dependencies}@anchor{2178}
@subsubsection Options for third-party dependencies



Added in version 3.11.


@geindex 명령줄 옵션; BZIP2_CFLAGS
@anchor{using/configure cmdoption-arg-BZIP2_CFLAGS}@anchor{2179}
@deffn {Option} BZIP2_CFLAGS
@end deffn

@geindex 명령줄 옵션; BZIP2_LIBS
@anchor{using/configure cmdoption-arg-BZIP2_LIBS}@anchor{217a}
@deffn {Option} BZIP2_LIBS

C compiler and linker flags to link Python to @code{libbz2}, used by @ref{14,,bz2}
module, overriding @code{pkg-config}.
@end deffn

@geindex 명령줄 옵션; CURSES_CFLAGS
@anchor{using/configure cmdoption-arg-CURSES_CFLAGS}@anchor{217b}
@deffn {Option} CURSES_CFLAGS
@end deffn

@geindex 명령줄 옵션; CURSES_LIBS
@anchor{using/configure cmdoption-arg-CURSES_LIBS}@anchor{217c}
@deffn {Option} CURSES_LIBS

C compiler and linker flags for @code{libncurses} or @code{libncursesw}, used by
@ref{2f,,curses} module, overriding @code{pkg-config}.
@end deffn

@geindex 명령줄 옵션; GDBM_CFLAGS
@anchor{using/configure cmdoption-arg-GDBM_CFLAGS}@anchor{217d}
@deffn {Option} GDBM_CFLAGS
@end deffn

@geindex 명령줄 옵션; GDBM_LIBS
@anchor{using/configure cmdoption-arg-GDBM_LIBS}@anchor{217e}
@deffn {Option} GDBM_LIBS

C compiler and linker flags for @code{gdbm}.
@end deffn

@geindex 명령줄 옵션; LIBEDIT_CFLAGS
@anchor{using/configure cmdoption-arg-LIBEDIT_CFLAGS}@anchor{217f}
@deffn {Option} LIBEDIT_CFLAGS
@end deffn

@geindex 명령줄 옵션; LIBEDIT_LIBS
@anchor{using/configure cmdoption-arg-LIBEDIT_LIBS}@anchor{2180}
@deffn {Option} LIBEDIT_LIBS

C compiler and linker flags for @code{libedit}, used by @ref{bf,,readline} module,
overriding @code{pkg-config}.
@end deffn

@geindex 명령줄 옵션; LIBFFI_CFLAGS
@anchor{using/configure cmdoption-arg-LIBFFI_CFLAGS}@anchor{2181}
@deffn {Option} LIBFFI_CFLAGS
@end deffn

@geindex 명령줄 옵션; LIBFFI_LIBS
@anchor{using/configure cmdoption-arg-LIBFFI_LIBS}@anchor{2182}
@deffn {Option} LIBFFI_LIBS

C compiler and linker flags for @code{libffi}, used by @ref{2e,,ctypes} module,
overriding @code{pkg-config}.
@end deffn

@geindex 명령줄 옵션; LIBMPDEC_CFLAGS
@anchor{using/configure cmdoption-arg-LIBMPDEC_CFLAGS}@anchor{2183}
@deffn {Option} LIBMPDEC_CFLAGS
@end deffn

@geindex 명령줄 옵션; LIBMPDEC_LIBS
@anchor{using/configure cmdoption-arg-LIBMPDEC_LIBS}@anchor{2184}
@deffn {Option} LIBMPDEC_LIBS

C compiler and linker flags for @code{libmpdec}, used by @ref{3a,,decimal} module,
overriding @code{pkg-config}.

@cartouche
@quotation 참고 
These environment variables have no effect unless
@ref{655,,--with-system-libmpdec} is specified.
@end quotation
@end cartouche
@end deffn

@geindex 명령줄 옵션; LIBLZMA_CFLAGS
@anchor{using/configure cmdoption-arg-LIBLZMA_CFLAGS}@anchor{2185}
@deffn {Option} LIBLZMA_CFLAGS
@end deffn

@geindex 명령줄 옵션; LIBLZMA_LIBS
@anchor{using/configure cmdoption-arg-LIBLZMA_LIBS}@anchor{2186}
@deffn {Option} LIBLZMA_LIBS

C compiler and linker flags for @code{liblzma}, used by @ref{8e,,lzma} module,
overriding @code{pkg-config}.
@end deffn

@geindex 명령줄 옵션; LIBREADLINE_CFLAGS
@anchor{using/configure cmdoption-arg-LIBREADLINE_CFLAGS}@anchor{2187}
@deffn {Option} LIBREADLINE_CFLAGS
@end deffn

@geindex 명령줄 옵션; LIBREADLINE_LIBS
@anchor{using/configure cmdoption-arg-LIBREADLINE_LIBS}@anchor{2188}
@deffn {Option} LIBREADLINE_LIBS

C compiler and linker flags for @code{libreadline}, used by @ref{bf,,readline}
module, overriding @code{pkg-config}.
@end deffn

@geindex 명령줄 옵션; LIBSQLITE3_CFLAGS
@anchor{using/configure cmdoption-arg-LIBSQLITE3_CFLAGS}@anchor{2189}
@deffn {Option} LIBSQLITE3_CFLAGS
@end deffn

@geindex 명령줄 옵션; LIBSQLITE3_LIBS
@anchor{using/configure cmdoption-arg-LIBSQLITE3_LIBS}@anchor{218a}
@deffn {Option} LIBSQLITE3_LIBS

C compiler and linker flags for @code{libsqlite3}, used by @ref{d4,,sqlite3}
module, overriding @code{pkg-config}.
@end deffn

@geindex 명령줄 옵션; LIBUUID_CFLAGS
@anchor{using/configure cmdoption-arg-LIBUUID_CFLAGS}@anchor{218b}
@deffn {Option} LIBUUID_CFLAGS
@end deffn

@geindex 명령줄 옵션; LIBUUID_LIBS
@anchor{using/configure cmdoption-arg-LIBUUID_LIBS}@anchor{218c}
@deffn {Option} LIBUUID_LIBS

C compiler and linker flags for @code{libuuid}, used by @ref{116,,uuid} module,
overriding @code{pkg-config}.
@end deffn

@geindex 명령줄 옵션; LIBZSTD_CFLAGS
@anchor{using/configure cmdoption-arg-LIBZSTD_CFLAGS}@anchor{218d}
@deffn {Option} LIBZSTD_CFLAGS
@end deffn

@geindex 명령줄 옵션; LIBZSTD_LIBS
@anchor{using/configure cmdoption-arg-LIBZSTD_LIBS}@anchor{218e}
@deffn {Option} LIBZSTD_LIBS

C compiler and linker flags for @code{libzstd}, used by @ref{23,,compression.zstd} module,
overriding @code{pkg-config}.


Added in version 3.14.

@end deffn

@geindex 명령줄 옵션; PANEL_CFLAGS
@anchor{using/configure cmdoption-arg-PANEL_CFLAGS}@anchor{218f}
@deffn {Option} PANEL_CFLAGS
@end deffn

@geindex 명령줄 옵션; PANEL_LIBS
@anchor{using/configure cmdoption-arg-PANEL_LIBS}@anchor{2190}
@deffn {Option} PANEL_LIBS

C compiler and linker flags for PANEL, overriding @code{pkg-config}.

C compiler and linker flags for @code{libpanel} or @code{libpanelw}, used by
@ref{31,,curses.panel} module, overriding @code{pkg-config}.
@end deffn

@geindex 명령줄 옵션; TCLTK_CFLAGS
@anchor{using/configure cmdoption-arg-TCLTK_CFLAGS}@anchor{2191}
@deffn {Option} TCLTK_CFLAGS
@end deffn

@geindex 명령줄 옵션; TCLTK_LIBS
@anchor{using/configure cmdoption-arg-TCLTK_LIBS}@anchor{2192}
@deffn {Option} TCLTK_LIBS

C compiler and linker flags for TCLTK, overriding @code{pkg-config}.
@end deffn

@geindex 명령줄 옵션; ZLIB_CFLAGS
@anchor{using/configure cmdoption-arg-ZLIB_CFLAGS}@anchor{2193}
@deffn {Option} ZLIB_CFLAGS
@end deffn

@geindex 명령줄 옵션; ZLIB_LIBS
@anchor{using/configure cmdoption-arg-ZLIB_LIBS}@anchor{2194}
@deffn {Option} ZLIB_LIBS

C compiler and linker flags for @code{libzlib}, used by @ref{6b,,gzip} module,
overriding @code{pkg-config}.
@end deffn

@node WebAssembly Options,Install Options,Options for third-party dependencies,Configure Options
@anchor{using/configure webassembly-options}@anchor{2195}
@subsubsection WebAssembly Options


@geindex 명령줄 옵션; --enable-wasm-dynamic-linking
@anchor{using/configure cmdoption-enable-wasm-dynamic-linking}@anchor{1bbc}
@deffn {Option} @w{-}@w{-}enable@w{-}wasm@w{-}dynamic@w{-}linking

Turn on dynamic linking support for WASM.

Dynamic linking enables @code{dlopen}. File size of the executable
increases due to limited dead code elimination and additional features.


Added in version 3.11.

@end deffn

@geindex 명령줄 옵션; --enable-wasm-pthreads
@anchor{using/configure cmdoption-enable-wasm-pthreads}@anchor{1b8b}
@deffn {Option} @w{-}@w{-}enable@w{-}wasm@w{-}pthreads

Turn on pthreads support for WASM.


Added in version 3.11.

@end deffn

@node Install Options,Performance options,WebAssembly Options,Configure Options
@anchor{using/configure install-options}@anchor{2196}
@subsubsection Install Options


@geindex 명령줄 옵션; --prefix
@anchor{using/configure cmdoption-prefix}@anchor{214c}
@deffn {Option} @w{-}@w{-}prefix=PREFIX

Install architecture-independent files in PREFIX. On Unix, it
defaults to @code{/usr/local}.

This value can be retrieved at runtime using @ref{3e7,,sys.prefix}.

As an example, one can use @code{--prefix="$HOME/.local/"} to install
a Python in its home directory.
@end deffn

@geindex 명령줄 옵션; --exec-prefix
@anchor{using/configure cmdoption-exec-prefix}@anchor{214d}
@deffn {Option} @w{-}@w{-}exec@w{-}prefix=EPREFIX

Install architecture-dependent files in EPREFIX, defaults to @ref{214c,,--prefix}.

This value can be retrieved at runtime using @ref{3eb,,sys.exec_prefix}.
@end deffn

@geindex 명령줄 옵션; --disable-test-modules
@anchor{using/configure cmdoption-disable-test-modules}@anchor{a8c}
@deffn {Option} @w{-}@w{-}disable@w{-}test@w{-}modules

Don’t build nor install test modules, like the @ref{e8,,test} package or the
@code{_testcapi} extension module (built and installed by default).


Added in version 3.10.

@end deffn

@geindex 명령줄 옵션; --with-ensurepip
@anchor{using/configure cmdoption-with-ensurepip}@anchor{2197}
@deffn {Option} @w{-}@w{-}with@w{-}ensurepip=[upgrade|install|no]

Select the @ref{59,,ensurepip} command run on Python installation:


@itemize *

@item 
@code{upgrade} (default): run @code{python -m ensurepip --altinstall --upgrade}
command.

@item 
@code{install}: run @code{python -m ensurepip --altinstall} command;

@item 
@code{no}: don’t run ensurepip;
@end itemize


Added in version 3.6.

@end deffn

@node Performance options,Python Debug Build,Install Options,Configure Options
@anchor{using/configure performance-options}@anchor{2198}
@subsubsection Performance options


Configuring Python using @code{--enable-optimizations --with-lto} (PGO + LTO) is
recommended for best performance. The experimental @code{--enable-bolt} flag can
also be used to improve performance.

@geindex 명령줄 옵션; --enable-optimizations
@anchor{using/configure cmdoption-enable-optimizations}@anchor{a62}
@deffn {Option} @w{-}@w{-}enable@w{-}optimizations

Enable Profile Guided Optimization (PGO) using 
@geindex PROFILE_TASK
@geindex 환경 변수; PROFILE_TASK
@ref{1a7e,,PROFILE_TASK}
(disabled by default).

The C compiler Clang requires @code{llvm-profdata} program for PGO. On
macOS, GCC also requires it: GCC is just an alias to Clang on macOS.

Disable also semantic interposition in libpython if @code{--enable-shared} and
GCC is used: add @code{-fno-semantic-interposition} to the compiler and linker
flags.

@cartouche
@quotation 참고 
During the build, you may encounter compiler warnings about
profile data not being available for some source files.
These warnings are harmless, as only a subset of the code is exercised
during profile data acquisition.
To disable these warnings on Clang, manually suppress them by adding
@code{-Wno-profile-instr-unprofiled} to 
@geindex CFLAGS
@geindex 환경 변수; CFLAGS
@ref{16bc,,CFLAGS}.
@end quotation
@end cartouche


Added in version 3.6.



버전 3.10에서 변경: Use @code{-fno-semantic-interposition} on GCC.

@end deffn

@geindex 환경 변수; PROFILE_TASK
@anchor{using/configure envvar-PROFILE_TASK}@anchor{1a7e}
@deffn {환경 변수} PROFILE_TASK

Environment variable used in the Makefile: Python command line arguments for
the PGO generation task.

Default: @code{-m test --pgo --timeout=$(TESTTIMEOUT)}.


Added in version 3.8.



버전 3.13에서 변경: Task failure is no longer ignored silently.

@end deffn

@geindex 명령줄 옵션; --with-lto
@anchor{using/configure cmdoption-with-lto}@anchor{951}
@deffn {Option} @w{-}@w{-}with@w{-}lto=[full|thin|no|yes]

Enable Link Time Optimization (LTO) in any build (disabled by default).

The C compiler Clang requires @code{llvm-ar} for LTO (@code{ar} on macOS), as well
as an LTO-aware linker (@code{ld.gold} or @code{lld}).


Added in version 3.6.



Added in version 3.11: To use ThinLTO feature, use @code{--with-lto=thin} on Clang.



버전 3.12에서 변경: Use ThinLTO as the default optimization policy on Clang if the compiler accepts the flag.

@end deffn

@geindex 명령줄 옵션; --enable-bolt
@anchor{using/configure cmdoption-enable-bolt}@anchor{2199}
@deffn {Option} @w{-}@w{-}enable@w{-}bolt

Enable usage of the BOLT post-link binary optimizer@footnote{https://github.com/llvm/llvm-project/tree/main/bolt} (disabled by
default).

BOLT is part of the LLVM project but is not always included in their binary
distributions. This flag requires that @code{llvm-bolt} and @code{merge-fdata}
are available.

BOLT is still a fairly new project so this flag should be considered
experimental for now. Because this tool operates on machine code its success
is dependent on a combination of the build environment + the other
optimization configure args + the CPU architecture, and not all combinations
are supported.
BOLT versions before LLVM 16 are known to crash BOLT under some scenarios.
Use of LLVM 16 or newer for BOLT optimization is strongly encouraged.

The @code{BOLT_INSTRUMENT_FLAGS} and @code{BOLT_APPLY_FLAGS}
@code{configure} variables can be defined to override the default set of
arguments for @code{llvm-bolt} to instrument and apply BOLT data to
binaries, respectively.


Added in version 3.12.

@end deffn

@geindex 명령줄 옵션; BOLT_APPLY_FLAGS
@anchor{using/configure cmdoption-arg-BOLT_APPLY_FLAGS}@anchor{219a}
@deffn {Option} BOLT_APPLY_FLAGS

Arguments to @code{llvm-bolt} when creating a BOLT optimized binary@footnote{https://github.com/facebookarchive/BOLT}.


Added in version 3.12.

@end deffn

@geindex 명령줄 옵션; BOLT_INSTRUMENT_FLAGS
@anchor{using/configure cmdoption-arg-BOLT_INSTRUMENT_FLAGS}@anchor{219b}
@deffn {Option} BOLT_INSTRUMENT_FLAGS

Arguments to @code{llvm-bolt} when instrumenting binaries.


Added in version 3.12.

@end deffn

@geindex 명령줄 옵션; --with-computed-gotos
@anchor{using/configure cmdoption-with-computed-gotos}@anchor{219c}
@deffn {Option} @w{-}@w{-}with@w{-}computed@w{-}gotos

Enable computed gotos in evaluation loop (enabled by default on supported
compilers).
@end deffn

@geindex 명령줄 옵션; --with-tail-call-interp
@anchor{using/configure cmdoption-with-tail-call-interp}@anchor{172}
@deffn {Option} @w{-}@w{-}with@w{-}tail@w{-}call@w{-}interp

Enable interpreters using tail calls in CPython. If enabled, enabling PGO
(@ref{a62,,--enable-optimizations}) is highly recommended. This option specifically
requires a C compiler with proper tail call support, and the
preserve_none@footnote{https://clang.llvm.org/docs/AttributeReference.html#preserve-none}
calling convention. For example, Clang 19 and newer supports this feature.


Added in version 3.14.

@end deffn

@geindex 명령줄 옵션; --without-mimalloc
@anchor{using/configure cmdoption-without-mimalloc}@anchor{219d}
@deffn {Option} @w{-}@w{-}without@w{-}mimalloc

Disable the fast @ref{213a,,mimalloc} allocator
(enabled by default).

This option cannot be used together with @ref{49a,,--disable-gil}
because the @ref{1f4,,free-threaded} build requires mimalloc.

See also 
@geindex PYTHONMALLOC
@geindex 환경 변수; PYTHONMALLOC
@ref{e5d,,PYTHONMALLOC} environment variable.
@end deffn

@geindex 명령줄 옵션; --without-pymalloc
@anchor{using/configure cmdoption-without-pymalloc}@anchor{219e}
@deffn {Option} @w{-}@w{-}without@w{-}pymalloc

Disable the specialized Python memory allocator @ref{f0a,,pymalloc}
(enabled by default).

See also 
@geindex PYTHONMALLOC
@geindex 환경 변수; PYTHONMALLOC
@ref{e5d,,PYTHONMALLOC} environment variable.
@end deffn

@geindex 명령줄 옵션; --without-doc-strings
@anchor{using/configure cmdoption-without-doc-strings}@anchor{219f}
@deffn {Option} @w{-}@w{-}without@w{-}doc@w{-}strings

Disable static documentation strings to reduce the memory footprint (enabled
by default). Documentation strings defined in Python are not affected.

Don’t define the @code{WITH_DOC_STRINGS} macro.

See the @code{PyDoc_STRVAR()} macro.
@end deffn

@geindex 명령줄 옵션; --enable-profiling
@anchor{using/configure cmdoption-enable-profiling}@anchor{21a0}
@deffn {Option} @w{-}@w{-}enable@w{-}profiling

Enable C-level code profiling with @code{gprof} (disabled by default).
@end deffn

@geindex 명령줄 옵션; --with-strict-overflow
@anchor{using/configure cmdoption-with-strict-overflow}@anchor{1ad1}
@deffn {Option} @w{-}@w{-}with@w{-}strict@w{-}overflow

Add @code{-fstrict-overflow} to the C compiler flags (by default we add
@code{-fno-strict-overflow} instead).
@end deffn

@geindex 명령줄 옵션; --without-remote-debug
@anchor{using/configure cmdoption-without-remote-debug}@anchor{170}
@deffn {Option} @w{-}@w{-}without@w{-}remote@w{-}debug

Deactivate remote debugging support described in 
@geindex Python 향상 제안; PEP 768
PEP 768@footnote{https://peps.python.org/pep-0768/} (enabled by default).
When this flag is provided the code that allows the interpreter to schedule the
execution of a Python file in a separate process as described in 
@geindex Python 향상 제안; PEP 768
PEP 768@footnote{https://peps.python.org/pep-0768/} is
not compiled. This includes both the functionality to schedule code to be executed
and the functionality to receive code to be executed.

@geindex Py_REMOTE_DEBUG (C macro)
@anchor{using/configure c Py_REMOTE_DEBUG}@anchor{21a1}
@deffn {C 매크로} Py_REMOTE_DEBUG

This macro is defined by default, unless Python is configured with
@ref{170,,--without-remote-debug}.

Note that even if the macro is defined, remote debugging may not be
available (for example, on an incompatible platform).
@end deffn


Added in version 3.14.

@end deffn

@node Python Debug Build,Debug options,Performance options,Configure Options
@anchor{using/configure debug-build}@anchor{508}@anchor{using/configure python-debug-build}@anchor{21a2}
@subsubsection Python Debug Build


A debug build is Python built with the @ref{664,,--with-pydebug} configure
option.

Effects of a debug build:


@itemize *

@item 
Display all warnings by default: the list of default warning filters is empty
in the @ref{118,,warnings} module.

@item 
Add @code{d} to @ref{c58,,sys.abiflags}.

@item 
Add @code{sys.gettotalrefcount()} function.

@item 
Add @ref{16f,,-X showrefcount} command line option.

@item 
Add @ref{2120,,-d} command line option and 
@geindex PYTHONDEBUG
@geindex 환경 변수; PYTHONDEBUG
@ref{2121,,PYTHONDEBUG} environment
variable to debug the parser.

@item 
Add support for the @code{__lltrace__} variable: enable low-level tracing in the
bytecode evaluation loop if the variable is defined.

@item 
Install @ref{2138,,debug hooks on memory allocators}
to detect buffer overflow and other memory errors.

@item 
Define @code{Py_DEBUG} and @code{Py_REF_DEBUG} macros.

@item 
Add runtime checks: code surrounded by @code{#ifdef Py_DEBUG} and @code{#endif}.
Enable @code{assert(...)} and @code{_PyObject_ASSERT(...)} assertions: don’t set
the @code{NDEBUG} macro (see also the @ref{62b,,--with-assertions} configure
option). Main runtime checks:


@itemize *

@item 
Add sanity checks on the function arguments.

@item 
Unicode and int objects are created with their memory filled with a pattern
to detect usage of uninitialized objects.

@item 
Ensure that functions which can clear or replace the current exception are
not called with an exception raised.

@item 
Check that deallocator functions don’t change the current exception.

@item 
The garbage collector (@ref{1b3,,gc.collect()} function) runs some basic checks
on objects consistency.

@item 
The @code{Py_SAFE_DOWNCAST()} macro checks for integer underflow and
overflow when downcasting from wide types to narrow types.
@end itemize
@end itemize

See also the @ref{507,,Python Development Mode} and the
@ref{634,,--with-trace-refs} configure option.


버전 3.8에서 변경: Release builds and debug builds are now ABI compatible: defining the
@code{Py_DEBUG} macro no longer implies the @code{Py_TRACE_REFS} macro (see the
@ref{634,,--with-trace-refs} option).


@node Debug options,Linker options<2>,Python Debug Build,Configure Options
@anchor{using/configure debug-options}@anchor{21a3}
@subsubsection Debug options


@geindex 명령줄 옵션; --with-pydebug
@anchor{using/configure cmdoption-with-pydebug}@anchor{664}
@deffn {Option} @w{-}@w{-}with@w{-}pydebug

@ref{508,,Build Python in debug mode}: define the @code{Py_DEBUG}
macro (disabled by default).
@end deffn

@geindex 명령줄 옵션; --with-trace-refs
@anchor{using/configure cmdoption-with-trace-refs}@anchor{634}
@deffn {Option} @w{-}@w{-}with@w{-}trace@w{-}refs

Enable tracing references for debugging purpose (disabled by default).

Effects:


@itemize *

@item 
Define the @code{Py_TRACE_REFS} macro.

@item 
Add @ref{28e,,sys.getobjects()} function.

@item 
Add 
@geindex PYTHONDUMPREFS
@geindex 환경 변수; PYTHONDUMPREFS
@ref{b9d,,PYTHONDUMPREFS} environment variable.
@end itemize

The 
@geindex PYTHONDUMPREFS
@geindex 환경 변수; PYTHONDUMPREFS
@ref{b9d,,PYTHONDUMPREFS} environment variable can be used to dump
objects and reference counts still alive at Python exit.

@ref{982,,Statically allocated objects} are not traced.


Added in version 3.8.



버전 3.13에서 변경: This build is now ABI compatible with release build and @ref{508,,debug build}.

@end deffn

@geindex 명령줄 옵션; --with-assertions
@anchor{using/configure cmdoption-with-assertions}@anchor{62b}
@deffn {Option} @w{-}@w{-}with@w{-}assertions

Build with C assertions enabled (default is no): @code{assert(...);} and
@code{_PyObject_ASSERT(...);}.

If set, the @code{NDEBUG} macro is not defined in the 
@geindex OPT
@geindex 환경 변수; OPT
@ref{21a4,,OPT} compiler
variable.

See also the @ref{664,,--with-pydebug} option (@ref{508,,debug build}) which also enables assertions.


Added in version 3.6.

@end deffn

@geindex 명령줄 옵션; --with-valgrind
@anchor{using/configure cmdoption-with-valgrind}@anchor{21a5}
@deffn {Option} @w{-}@w{-}with@w{-}valgrind

Enable Valgrind support (default is no).
@end deffn

@geindex 명령줄 옵션; --with-dtrace
@anchor{using/configure cmdoption-with-dtrace}@anchor{21a6}
@deffn {Option} @w{-}@w{-}with@w{-}dtrace

Enable DTrace support (default is no).

See @ref{e65,,Instrumenting CPython with DTrace and SystemTap}.


Added in version 3.6.

@end deffn

@geindex 명령줄 옵션; --with-address-sanitizer
@anchor{using/configure cmdoption-with-address-sanitizer}@anchor{21a7}
@deffn {Option} @w{-}@w{-}with@w{-}address@w{-}sanitizer

Enable AddressSanitizer memory error detector, @code{asan} (default is no).
To improve ASan detection capabilities you may also want to combine this
with @ref{219e,,--without-pymalloc} to disable the specialized small-object
allocator whose allocations are not tracked by ASan.


Added in version 3.6.

@end deffn

@geindex 명령줄 옵션; --with-memory-sanitizer
@anchor{using/configure cmdoption-with-memory-sanitizer}@anchor{21a8}
@deffn {Option} @w{-}@w{-}with@w{-}memory@w{-}sanitizer

Enable MemorySanitizer allocation error detector, @code{msan} (default is no).


Added in version 3.6.

@end deffn

@geindex 명령줄 옵션; --with-undefined-behavior-sanitizer
@anchor{using/configure cmdoption-with-undefined-behavior-sanitizer}@anchor{21a9}
@deffn {Option} @w{-}@w{-}with@w{-}undefined@w{-}behavior@w{-}sanitizer

Enable UndefinedBehaviorSanitizer undefined behaviour detector, @code{ubsan}
(default is no).


Added in version 3.6.

@end deffn

@geindex 명령줄 옵션; --with-thread-sanitizer
@anchor{using/configure cmdoption-with-thread-sanitizer}@anchor{21aa}
@deffn {Option} @w{-}@w{-}with@w{-}thread@w{-}sanitizer

Enable ThreadSanitizer data race detector, @code{tsan}
(default is no).


Added in version 3.13.

@end deffn

@node Linker options<2>,Libraries options,Debug options,Configure Options
@anchor{using/configure id13}@anchor{21ab}
@subsubsection Linker options


@geindex 명령줄 옵션; --enable-shared
@anchor{using/configure cmdoption-enable-shared}@anchor{a63}
@deffn {Option} @w{-}@w{-}enable@w{-}shared

Enable building a shared Python library: @code{libpython} (default is no).
@end deffn

@geindex 명령줄 옵션; --without-static-libpython
@anchor{using/configure cmdoption-without-static-libpython}@anchor{a8e}
@deffn {Option} @w{-}@w{-}without@w{-}static@w{-}libpython

Do not build @code{libpythonMAJOR.MINOR.a} and do not install @code{python.o}
(built and enabled by default).


Added in version 3.10.

@end deffn

@node Libraries options,Security Options,Linker options<2>,Configure Options
@anchor{using/configure libraries-options}@anchor{21ac}
@subsubsection Libraries options


@geindex 명령줄 옵션; --with-libs
@anchor{using/configure cmdoption-with-libs}@anchor{21ad}
@deffn {Option} @w{-}@w{-}with@w{-}libs='lib1 ...'

Link against additional libraries (default is no).
@end deffn

@geindex 명령줄 옵션; --with-system-expat
@anchor{using/configure cmdoption-with-system-expat}@anchor{1b2b}
@deffn {Option} @w{-}@w{-}with@w{-}system@w{-}expat

Build the @code{pyexpat} module using an installed @code{expat} library
(default is no).
@end deffn

@geindex 명령줄 옵션; --with-system-libmpdec
@anchor{using/configure cmdoption-with-system-libmpdec}@anchor{655}
@deffn {Option} @w{-}@w{-}with@w{-}system@w{-}libmpdec

Build the @code{_decimal} extension module using an installed @code{mpdecimal}
library, see the @ref{3a,,decimal} module (default is yes).


Added in version 3.3.



버전 3.13에서 변경: Default to using the installed @code{mpdecimal} library.



버전 3.15에서 변경: A bundled copy of the library will no longer be selected
implicitly if an installed @code{mpdecimal} library is not found.
In Python 3.15 only, it can still be selected explicitly using
@code{--with-system-libmpdec=no} or @code{--without-system-libmpdec}.



Deprecated since version 3.13, will be removed in version 3.16: A copy of the @code{mpdecimal} library sources will no longer be distributed
with Python 3.16.



@subsubheading 더 보기


@ref{2183,,LIBMPDEC_CFLAGS} and @ref{2184,,LIBMPDEC_LIBS}.

@end deffn

@geindex 명령줄 옵션; --with-readline
@anchor{using/configure cmdoption-with-readline}@anchor{2158}
@deffn {Option} @w{-}@w{-}with@w{-}readline=readline|editline

Designate a backend library for the @ref{bf,,readline} module.


@itemize *

@item 
readline: Use readline as the backend.

@item 
editline: Use editline as the backend.
@end itemize


Added in version 3.10.

@end deffn

@geindex 명령줄 옵션; --without-readline
@anchor{using/configure cmdoption-without-readline}@anchor{21ae}
@deffn {Option} @w{-}@w{-}without@w{-}readline

Don’t build the @ref{bf,,readline} module (built by default).

Don’t define the @code{HAVE_LIBREADLINE} macro.


Added in version 3.10.

@end deffn

@geindex 명령줄 옵션; --with-libm
@anchor{using/configure cmdoption-with-libm}@anchor{21af}
@deffn {Option} @w{-}@w{-}with@w{-}libm=STRING

Override @code{libm} math library to `STRING' (default is system-dependent).
@end deffn

@geindex 명령줄 옵션; --with-libc
@anchor{using/configure cmdoption-with-libc}@anchor{21b0}
@deffn {Option} @w{-}@w{-}with@w{-}libc=STRING

Override @code{libc} C library to `STRING' (default is system-dependent).
@end deffn

@geindex 명령줄 옵션; --with-openssl
@anchor{using/configure cmdoption-with-openssl}@anchor{21b1}
@deffn {Option} @w{-}@w{-}with@w{-}openssl=DIR

Root of the OpenSSL directory.


Added in version 3.7.

@end deffn

@geindex 명령줄 옵션; --with-openssl-rpath
@anchor{using/configure cmdoption-with-openssl-rpath}@anchor{a8f}
@deffn {Option} @w{-}@w{-}with@w{-}openssl@w{-}rpath=[no|auto|DIR]

Set runtime library directory (rpath) for OpenSSL libraries:


@itemize *

@item 
@code{no} (default): don’t set rpath;

@item 
@code{auto}: auto-detect rpath from @ref{21b1,,--with-openssl} and
@code{pkg-config};

@item 
`DIR': set an explicit rpath.
@end itemize


Added in version 3.10.

@end deffn

@node Security Options,macOS Options,Libraries options,Configure Options
@anchor{using/configure security-options}@anchor{21b2}
@subsubsection Security Options


@geindex 명령줄 옵션; --with-hash-algorithm
@anchor{using/configure cmdoption-with-hash-algorithm}@anchor{21b3}
@deffn {Option} @w{-}@w{-}with@w{-}hash@w{-}algorithm=[fnv|siphash13|siphash24]

Select hash algorithm for use in @code{Python/pyhash.c}:


@itemize *

@item 
@code{siphash13} (default);

@item 
@code{siphash24};

@item 
@code{fnv}.
@end itemize


Added in version 3.4.



Added in version 3.11: @code{siphash13} is added and it is the new default.

@end deffn

@geindex 명령줄 옵션; --with-builtin-hashlib-hashes
@anchor{using/configure cmdoption-with-builtin-hashlib-hashes}@anchor{2159}
@deffn {Option} @w{-}@w{-}with@w{-}builtin@w{-}hashlib@w{-}hashes=md5,sha1,sha256,sha512,sha3,blake2

Built-in hash modules:


@itemize *

@item 
@code{md5};

@item 
@code{sha1};

@item 
@code{sha256};

@item 
@code{sha512};

@item 
@code{sha3} (with shake);

@item 
@code{blake2}.
@end itemize


Added in version 3.9.

@end deffn

@geindex 명령줄 옵션; --with-ssl-default-suites
@anchor{using/configure cmdoption-with-ssl-default-suites}@anchor{21b4}
@deffn {Option} @w{-}@w{-}with@w{-}ssl@w{-}default@w{-}suites=[python|openssl|STRING]

Override the OpenSSL default cipher suites string:


@itemize *

@item 
@code{python} (default): use Python’s preferred selection;

@item 
@code{openssl}: leave OpenSSL’s defaults untouched;

@item 
`STRING': use a custom string
@end itemize

See the @ref{d5,,ssl} module.


Added in version 3.7.



버전 3.10에서 변경: The settings @code{python} and `STRING' also set TLS 1.2 as minimum
protocol version.

@end deffn

@geindex 명령줄 옵션; --disable-safety
@anchor{using/configure cmdoption-disable-safety}@anchor{445}
@deffn {Option} @w{-}@w{-}disable@w{-}safety

Disable compiler options that are recommended by OpenSSF@footnote{https://github.com/ossf/wg-best-practices-os-developers/blob/main/docs/Compiler-Hardening-Guides/Compiler-Options-Hardening-Guide-for-C-and-C++.md} for security reasons with no performance overhead.
If this option is not enabled, CPython will be built based on safety compiler options with no slow down.
When this option is enabled, CPython will not be built with the compiler options listed below.

The following compiler options are disabled with @code{--disable-safety}:


@itemize *

@item 
-fstack-protector-strong@footnote{https://github.com/ossf/wg-best-practices-os-developers/blob/main/docs/Compiler-Hardening-Guides/Compiler-Options-Hardening-Guide-for-C-and-C++.md#enable-run-time-checks-for-stack-based-buffer-overflows}: Enable run-time checks for stack-based buffer overflows.

@item 
-Wtrampolines@footnote{https://github.com/ossf/wg-best-practices-os-developers/blob/main/docs/Compiler-Hardening-Guides/Compiler-Options-Hardening-Guide-for-C-and-C++.md#enable-warning-about-trampolines-that-require-executable-stacks}: Enable warnings about trampolines that require executable stacks.
@end itemize


Added in version 3.14.

@end deffn

@geindex 명령줄 옵션; --enable-slower-safety
@anchor{using/configure cmdoption-enable-slower-safety}@anchor{446}
@deffn {Option} @w{-}@w{-}enable@w{-}slower@w{-}safety

Enable compiler options that are recommended by OpenSSF@footnote{https://github.com/ossf/wg-best-practices-os-developers/blob/main/docs/Compiler-Hardening-Guides/Compiler-Options-Hardening-Guide-for-C-and-C++.md} for security reasons which require overhead.
If this option is not enabled, CPython will not be built based on safety compiler options which performance impact.
When this option is enabled, CPython will be built with the compiler options listed below.

The following compiler options are enabled with @code{--enable-slower-safety}:


@itemize *

@item 
-D_FORTIFY_SOURCE=3@footnote{https://github.com/ossf/wg-best-practices-os-developers/blob/main/docs/Compiler-Hardening-Guides/Compiler-Options-Hardening-Guide-for-C-and-C++.md#fortify-sources-for-unsafe-libc-usage-and-buffer-overflows}: Fortify sources with compile- and run-time checks for unsafe libc usage and buffer overflows.
@end itemize


Added in version 3.14.

@end deffn

@node macOS Options,iOS Options,Security Options,Configure Options
@anchor{using/configure macos-options}@anchor{21b5}
@subsubsection macOS Options


See Mac/README.rst@footnote{https://github.com/python/cpython/tree/3.14/Mac/README.rst}.

@geindex 명령줄 옵션; --enable-universalsdk
@anchor{using/configure cmdoption-enable-universalsdk}@anchor{b63}
@deffn {Option} @w{-}@w{-}enable@w{-}universalsdk
@end deffn

@geindex 명령줄 옵션; --enable-universalsdk
@anchor{using/configure cmdoption-0}@anchor{21b6}
@deffn {Option} @w{-}@w{-}enable@w{-}universalsdk=SDKDIR

Create a universal binary build. `SDKDIR' specifies which macOS SDK should
be used to perform the build (default is no).
@end deffn

@geindex 명령줄 옵션; --enable-framework
@anchor{using/configure cmdoption-enable-framework}@anchor{21b7}
@deffn {Option} @w{-}@w{-}enable@w{-}framework
@end deffn

@geindex 명령줄 옵션; --enable-framework
@anchor{using/configure cmdoption-1}@anchor{21b8}
@deffn {Option} @w{-}@w{-}enable@w{-}framework=INSTALLDIR

Create a Python.framework rather than a traditional Unix install. Optional
`INSTALLDIR' specifies the installation path (default is no).
@end deffn

@geindex 명령줄 옵션; --with-universal-archs
@anchor{using/configure cmdoption-with-universal-archs}@anchor{21b9}
@deffn {Option} @w{-}@w{-}with@w{-}universal@w{-}archs=ARCH

Specify the kind of universal binary that should be created. This option is
only valid when @ref{b63,,--enable-universalsdk} is set.

Options:


@itemize *

@item 
@code{universal2} (x86-64 and arm64);

@item 
@code{32-bit} (PPC and i386);

@item 
@code{64-bit}  (PPC64 and x86-64);

@item 
@code{3-way} (i386, PPC and x86-64);

@item 
@code{intel} (i386 and x86-64);

@item 
@code{intel-32} (i386);

@item 
@code{intel-64} (x86-64);

@item 
@code{all}  (PPC, i386, PPC64 and x86-64).
@end itemize

Note that values for this configuration item are `not' the same as the
identifiers used for universal binary wheels on macOS. See the Python
Packaging User Guide for details on the packaging platform compatibility tags used on macOS@footnote{https://packaging.python.org/en/latest/specifications/platform-compatibility-tags/#macos}
@end deffn

@geindex 명령줄 옵션; --with-framework-name
@anchor{using/configure cmdoption-with-framework-name}@anchor{21ba}
@deffn {Option} @w{-}@w{-}with@w{-}framework@w{-}name=FRAMEWORK

Specify the name for the python framework on macOS only valid when
@ref{21b7,,--enable-framework} is set (default: @code{Python}).
@end deffn

@geindex 명령줄 옵션; --with-app-store-compliance
@anchor{using/configure cmdoption-with-app-store-compliance}@anchor{1998}
@deffn {Option} @w{-}@w{-}with@w{-}app@w{-}store@w{-}compliance
@end deffn

@geindex 명령줄 옵션; --with-app-store-compliance
@anchor{using/configure cmdoption-2}@anchor{21bb}
@deffn {Option} @w{-}@w{-}with@w{-}app@w{-}store@w{-}compliance=PATCH@w{-}FILE

The Python standard library contains strings that are known to trigger
automated inspection tool errors when submitted for distribution by
the macOS and iOS App Stores. If enabled, this option will apply the list of
patches that are known to correct app store compliance. A custom patch
file can also be specified. This option is disabled by default.


Added in version 3.13.

@end deffn

@node iOS Options,Cross Compiling Options,macOS Options,Configure Options
@anchor{using/configure ios-options}@anchor{21bc}
@subsubsection iOS Options


See iOS/README.rst@footnote{https://github.com/python/cpython/tree/3.14/iOS/README.rst}.

@geindex 명령줄 옵션; --enable-framework
@anchor{using/configure cmdoption-3}@anchor{21bd}
@deffn {Option} @w{-}@w{-}enable@w{-}framework=INSTALLDIR

Create a Python.framework. Unlike macOS, the `INSTALLDIR' argument
specifying the installation path is mandatory.
@end deffn

@geindex 명령줄 옵션; --with-framework-name
@anchor{using/configure cmdoption-4}@anchor{21be}
@deffn {Option} @w{-}@w{-}with@w{-}framework@w{-}name=FRAMEWORK

Specify the name for the framework (default: @code{Python}).
@end deffn

@node Cross Compiling Options,,iOS Options,Configure Options
@anchor{using/configure cross-compiling-options}@anchor{21bf}
@subsubsection Cross Compiling Options


Cross compiling, also known as cross building, can be used to build Python
for another CPU architecture or platform. Cross compiling requires a Python
interpreter for the build platform. The version of the build Python must match
the version of the cross compiled host Python.

@geindex 명령줄 옵션; --build
@anchor{using/configure cmdoption-build}@anchor{21c0}
@deffn {Option} @w{-}@w{-}build=BUILD

configure for building on BUILD, usually guessed by @code{config.guess}.
@end deffn

@geindex 명령줄 옵션; --host
@anchor{using/configure cmdoption-host}@anchor{21c1}
@deffn {Option} @w{-}@w{-}host=HOST

cross-compile to build programs to run on HOST (target platform)
@end deffn

@geindex 명령줄 옵션; --with-build-python
@anchor{using/configure cmdoption-with-build-python}@anchor{21c2}
@deffn {Option} @w{-}@w{-}with@w{-}build@w{-}python=path/to/python

path to build @code{python} binary for cross compiling


Added in version 3.11.

@end deffn

@geindex 명령줄 옵션; CONFIG_SITE
@anchor{using/configure cmdoption-arg-CONFIG_SITE}@anchor{21c3}
@deffn {Option} CONFIG_SITE=file

An environment variable that points to a file with configure overrides.

Example `config.site' file:

@example
# config.site-aarch64
ac_cv_buggy_getaddrinfo=no
ac_cv_file__dev_ptmx=yes
ac_cv_file__dev_ptc=no
@end example
@end deffn

@geindex 명령줄 옵션; HOSTRUNNER
@anchor{using/configure cmdoption-arg-HOSTRUNNER}@anchor{21c4}
@deffn {Option} HOSTRUNNER

Program to run CPython for the host platform for cross-compilation.


Added in version 3.11.

@end deffn

Cross compiling example:

@example
CONFIG_SITE=config.site-aarch64 ../configure \
    --build=x86_64-pc-linux-gnu \
    --host=aarch64-unknown-linux-gnu \
    --with-build-python=../x86_64/python
@end example

@node Python Build System,Compiler and linker flags,Configure Options,Configure Python
@anchor{using/configure python-build-system}@anchor{21c5}
@subsection Python Build System


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

@end menu

@node Main files of the build system,Main build steps,,Python Build System
@anchor{using/configure main-files-of-the-build-system}@anchor{21c6}
@subsubsection Main files of the build system



@itemize *

@item 
@code{configure.ac} => @code{configure};

@item 
@code{Makefile.pre.in} => @code{Makefile} (created by @code{configure});

@item 
@code{pyconfig.h} (created by @code{configure});

@item 
@code{Modules/Setup}: C extensions built by the Makefile using
@code{Module/makesetup} shell script;
@end itemize

@node Main build steps,Main Makefile targets,Main files of the build system,Python Build System
@anchor{using/configure main-build-steps}@anchor{21c7}
@subsubsection Main build steps



@itemize *

@item 
C files (@code{.c}) are built as object files (@code{.o}).

@item 
A static @code{libpython} library (@code{.a}) is created from objects files.

@item 
@code{python.o} and the static @code{libpython} library are linked into the
final @code{python} program.

@item 
C extensions are built by the Makefile (see @code{Modules/Setup}).
@end itemize

@node Main Makefile targets,C extensions,Main build steps,Python Build System
@anchor{using/configure main-makefile-targets}@anchor{21c8}
@subsubsection Main Makefile targets


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

@end menu

@node make,make platform,,Main Makefile targets
@anchor{using/configure make}@anchor{21c9}
@subsubsection make


For the most part, when rebuilding after editing some code or
refreshing your checkout from upstream, all you need to do is execute
@code{make}, which (per Make’s semantics) builds the default target, the
first one defined in the Makefile.  By tradition (including in the
CPython project) this is usually the @code{all} target. The
@code{configure} script expands an @code{autoconf} variable,
@code{@@DEF_MAKE_ALL_RULE@@} to describe precisely which targets @code{make
all} will build. The three choices are:


@itemize *

@item 
@code{profile-opt} (configured with @code{--enable-optimizations})

@item 
@code{build_wasm} (chosen if the host platform matches @code{wasm32-wasi*} or
@code{wasm32-emscripten})

@item 
@code{build_all} (configured without explicitly using either of the others)
@end itemize

Depending on the most recent source file changes, Make will rebuild
any targets (object files and executables) deemed out-of-date,
including running @code{configure} again if necessary. Source/target
dependencies are many and maintained manually however, so Make
sometimes doesn’t have all the information necessary to correctly
detect all targets which need to be rebuilt.  Depending on which
targets aren’t rebuilt, you might experience a number of problems. If
you have build or test problems which you can’t otherwise explain,
@code{make clean && make} should work around most dependency problems, at
the expense of longer build times.

@node make platform,make profile-opt,make,Main Makefile targets
@anchor{using/configure make-platform}@anchor{21ca}
@subsubsection make platform


Build the @code{python} program, but don’t build the standard library
extension modules. This generates a file named @code{platform} which
contains a single line describing the details of the build platform,
e.g., @code{macosx-14.3-arm64-3.12} or @code{linux-x86_64-3.13}.

@node make profile-opt,make clean,make platform,Main Makefile targets
@anchor{using/configure make-profile-opt}@anchor{21cb}
@subsubsection make profile-opt


Build Python using profile-guided optimization (PGO).  You can use the
configure @ref{a62,,--enable-optimizations} option to make this the
default target of the @code{make} command (@code{make all} or just
@code{make}).

@node make clean,make distclean,make profile-opt,Main Makefile targets
@anchor{using/configure make-clean}@anchor{21cc}
@subsubsection make clean


Remove built files.

@node make distclean,make install,make clean,Main Makefile targets
@anchor{using/configure make-distclean}@anchor{21cd}
@subsubsection make distclean


In addition to the work done by @code{make clean}, remove files
created by the configure script.  @code{configure} will have to be run
before building again. @footnote{
@code{git clean -fdx} is an even more extreme way to “clean” your
checkout. It removes all files not known to Git.
When bug hunting using @code{git bisect}, this is
@uref{https://github.com/python/cpython/issues/114505#issuecomment-1907021718,recommended between probes}
to guarantee a completely clean build. `Use with care', as it
will delete all files not checked into Git, including your
new, uncommitted work.
}

@node make install,make test,make distclean,Main Makefile targets
@anchor{using/configure make-install}@anchor{21ce}
@subsubsection make install


Build the @code{all} target and install Python.

@node make test,make ci,make install,Main Makefile targets
@anchor{using/configure make-test}@anchor{21cf}
@subsubsection make test


Build the @code{all} target and run the Python test suite with the
@code{--fast-ci} option without GUI tests. Variables:


@itemize *

@item 
@code{TESTOPTS}: additional regrtest command-line options.

@item 
@code{TESTPYTHONOPTS}: additional Python command-line options.

@item 
@code{TESTTIMEOUT}: timeout in seconds (default: 10 minutes).
@end itemize

@node make ci,make buildbottest,make test,Main Makefile targets
@anchor{using/configure make-ci}@anchor{21d0}
@subsubsection make ci


This is similar to @code{make test}, but uses the @code{-ugui} to also run GUI tests.


Added in version 3.14.


@node make buildbottest,make regen-all,make ci,Main Makefile targets
@anchor{using/configure make-buildbottest}@anchor{21d1}
@subsubsection make buildbottest


This is similar to @code{make test}, but uses the @code{--slow-ci}
option and default timeout of 20 minutes, instead of @code{--fast-ci} option.

@node make regen-all,,make buildbottest,Main Makefile targets
@anchor{using/configure make-regen-all}@anchor{21d2}
@subsubsection make regen-all


Regenerate (almost) all generated files. These include (but are not
limited to) bytecode cases, and parser generator file.
@code{make regen-stdlib-module-names} and @code{autoconf} must be run
separately for the remaining @ref{215b,,generated files}.

@node C extensions,,Main Makefile targets,Python Build System
@anchor{using/configure c-extensions}@anchor{21d3}
@subsubsection C extensions


Some C extensions are built as built-in modules, like the @code{sys} module.
They are built with the @code{Py_BUILD_CORE_BUILTIN} macro defined.
Built-in modules have no @code{__file__} attribute:

@example
>>> import sys
>>> sys
<module 'sys' (built-in)>
>>> sys.__file__
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: module 'sys' has no attribute '__file__'
@end example

Other C extensions are built as dynamic libraries, like the @code{_asyncio} module.
They are built with the @code{Py_BUILD_CORE_MODULE} macro defined.
Example on Linux x86-64:

@example
>>> import _asyncio
>>> _asyncio
<module '_asyncio' from '/usr/lib64/python3.9/lib-dynload/_asyncio.cpython-39-x86_64-linux-gnu.so'>
>>> _asyncio.__file__
'/usr/lib64/python3.9/lib-dynload/_asyncio.cpython-39-x86_64-linux-gnu.so'
@end example

@code{Modules/Setup} is used to generate Makefile targets to build C extensions.
At the beginning of the files, C extensions are built as built-in modules.
Extensions defined after the @code{*shared*} marker are built as dynamic libraries.

The @code{PyAPI_FUNC()}, @code{PyAPI_DATA()} and
@ref{16d8,,PyMODINIT_FUNC} macros of @code{Include/exports.h} are defined
differently depending if the @code{Py_BUILD_CORE_MODULE} macro is defined:


@itemize *

@item 
Use @code{Py_EXPORTED_SYMBOL} if the @code{Py_BUILD_CORE_MODULE} is defined

@item 
Use @code{Py_IMPORTED_SYMBOL} otherwise.
@end itemize

If the @code{Py_BUILD_CORE_BUILTIN} macro is used by mistake on a C extension
built as a shared library, its @code{PyInit_@var{xxx}()} function is not exported,
causing an @ref{659,,ImportError} on import.

@node Compiler and linker flags,,Python Build System,Configure Python
@anchor{using/configure compiler-and-linker-flags}@anchor{21d4}
@subsection Compiler and linker flags


Options set by the @code{./configure} script and environment variables and used by
@code{Makefile}.

@menu
* Preprocessor flags:: 
* Compiler flags:: 
* Linker flags:: 

@end menu

@node Preprocessor flags,Compiler flags,,Compiler and linker flags
@anchor{using/configure preprocessor-flags}@anchor{21d5}
@subsubsection Preprocessor flags


@geindex 환경 변수; CONFIGURE_CPPFLAGS
@anchor{using/configure envvar-CONFIGURE_CPPFLAGS}@anchor{21d6}
@deffn {환경 변수} CONFIGURE_CPPFLAGS

Value of 
@geindex CPPFLAGS
@geindex 환경 변수; CPPFLAGS
@ref{16be,,CPPFLAGS} variable passed to the @code{./configure} script.


Added in version 3.6.

@end deffn

@geindex 환경 변수; CPPFLAGS
@anchor{using/configure envvar-CPPFLAGS}@anchor{16be}
@deffn {환경 변수} CPPFLAGS

(Objective) C/C++ preprocessor flags, e.g. @code{-I@var{include_dir}} if you have
headers in a nonstandard directory `include_dir'.

Both 
@geindex CPPFLAGS
@geindex 환경 변수; CPPFLAGS
@ref{16be,,CPPFLAGS} and 
@geindex LDFLAGS
@geindex 환경 변수; LDFLAGS
@ref{16bd,,LDFLAGS} need to contain the shell’s
value to be able to build extension modules using the
directories specified in the environment variables.
@end deffn

@geindex 환경 변수; BASECPPFLAGS
@anchor{using/configure envvar-BASECPPFLAGS}@anchor{21d7}
@deffn {환경 변수} BASECPPFLAGS


Added in version 3.4.

@end deffn

@geindex 환경 변수; PY_CPPFLAGS
@anchor{using/configure envvar-PY_CPPFLAGS}@anchor{21d8}
@deffn {환경 변수} PY_CPPFLAGS

Extra preprocessor flags added for building the interpreter object files.

Default: @code{$(BASECPPFLAGS) -I. -I$(srcdir)/Include $(CONFIGURE_CPPFLAGS) $(CPPFLAGS)}.


Added in version 3.2.

@end deffn

@node Compiler flags,Linker flags,Preprocessor flags,Compiler and linker flags
@anchor{using/configure compiler-flags}@anchor{21d9}
@subsubsection Compiler flags


@geindex 환경 변수; CC
@anchor{using/configure envvar-CC}@anchor{16bb}
@deffn {환경 변수} CC

C compiler command.

Example: @code{gcc -pthread}.
@end deffn

@geindex 환경 변수; CXX
@anchor{using/configure envvar-CXX}@anchor{21da}
@deffn {환경 변수} CXX

C++ compiler command.

Example: @code{g++ -pthread}.
@end deffn

@geindex 환경 변수; CFLAGS
@anchor{using/configure envvar-CFLAGS}@anchor{16bc}
@deffn {환경 변수} CFLAGS

C compiler flags.
@end deffn

@geindex 환경 변수; CFLAGS_NODIST
@anchor{using/configure envvar-CFLAGS_NODIST}@anchor{21db}
@deffn {환경 변수} CFLAGS_NODIST

@geindex CFLAGS_NODIST
@geindex 환경 변수; CFLAGS_NODIST
@ref{21db,,CFLAGS_NODIST} is used for building the interpreter and stdlib C
extensions.  Use it when a compiler flag should `not' be part of
@geindex CFLAGS
@geindex 환경 변수; CFLAGS
@ref{16bc,,CFLAGS} once Python is installed (gh-65320@footnote{https://github.com/python/cpython/issues/65320}).

In particular, 
@geindex CFLAGS
@geindex 환경 변수; CFLAGS
@ref{16bc,,CFLAGS} should not contain:


@itemize *

@item 
the compiler flag @code{-I} (for setting the search path for include files).
The @code{-I} flags are processed from left to right, and any flags in
@geindex CFLAGS
@geindex 환경 변수; CFLAGS
@ref{16bc,,CFLAGS} would take precedence over user- and package-supplied @code{-I}
flags.

@item 
hardening flags such as @code{-Werror} because distributions cannot control
whether packages installed by users conform to such heightened
standards.
@end itemize


Added in version 3.5.

@end deffn

@geindex 환경 변수; COMPILEALL_OPTS
@anchor{using/configure envvar-COMPILEALL_OPTS}@anchor{21dc}
@deffn {환경 변수} COMPILEALL_OPTS

Options passed to the @ref{21,,compileall} command line when building PYC files
in @code{make install}. Default: @code{-j0}.


Added in version 3.12.

@end deffn

@geindex 환경 변수; EXTRA_CFLAGS
@anchor{using/configure envvar-EXTRA_CFLAGS}@anchor{21dd}
@deffn {환경 변수} EXTRA_CFLAGS

Extra C compiler flags.
@end deffn

@geindex 환경 변수; CONFIGURE_CFLAGS
@anchor{using/configure envvar-CONFIGURE_CFLAGS}@anchor{21de}
@deffn {환경 변수} CONFIGURE_CFLAGS

Value of 
@geindex CFLAGS
@geindex 환경 변수; CFLAGS
@ref{16bc,,CFLAGS} variable passed to the @code{./configure}
script.


Added in version 3.2.

@end deffn

@geindex 환경 변수; CONFIGURE_CFLAGS_NODIST
@anchor{using/configure envvar-CONFIGURE_CFLAGS_NODIST}@anchor{21df}
@deffn {환경 변수} CONFIGURE_CFLAGS_NODIST

Value of 
@geindex CFLAGS_NODIST
@geindex 환경 변수; CFLAGS_NODIST
@ref{21db,,CFLAGS_NODIST} variable passed to the @code{./configure}
script.


Added in version 3.5.

@end deffn

@geindex 환경 변수; BASECFLAGS
@anchor{using/configure envvar-BASECFLAGS}@anchor{21e0}
@deffn {환경 변수} BASECFLAGS

Base compiler flags.
@end deffn

@geindex 환경 변수; OPT
@anchor{using/configure envvar-OPT}@anchor{21a4}
@deffn {환경 변수} OPT

Optimization flags.
@end deffn

@geindex 환경 변수; CFLAGS_ALIASING
@anchor{using/configure envvar-CFLAGS_ALIASING}@anchor{21e1}
@deffn {환경 변수} CFLAGS_ALIASING

Strict or non-strict aliasing flags used to compile @code{Python/dtoa.c}.


Added in version 3.7.

@end deffn

@geindex 환경 변수; CCSHARED
@anchor{using/configure envvar-CCSHARED}@anchor{21e2}
@deffn {환경 변수} CCSHARED

Compiler flags used to build a shared library.

For example, @code{-fPIC} is used on Linux and on BSD.
@end deffn

@geindex 환경 변수; CFLAGSFORSHARED
@anchor{using/configure envvar-CFLAGSFORSHARED}@anchor{21e3}
@deffn {환경 변수} CFLAGSFORSHARED

Extra C flags added for building the interpreter object files.

Default: @code{$(CCSHARED)} when @ref{a63,,--enable-shared} is used, or an empty
string otherwise.
@end deffn

@geindex 환경 변수; PY_CFLAGS
@anchor{using/configure envvar-PY_CFLAGS}@anchor{21e4}
@deffn {환경 변수} PY_CFLAGS

Default: @code{$(BASECFLAGS) $(OPT) $(CONFIGURE_CFLAGS) $(CFLAGS) $(EXTRA_CFLAGS)}.
@end deffn

@geindex 환경 변수; PY_CFLAGS_NODIST
@anchor{using/configure envvar-PY_CFLAGS_NODIST}@anchor{21e5}
@deffn {환경 변수} PY_CFLAGS_NODIST

Default: @code{$(CONFIGURE_CFLAGS_NODIST) $(CFLAGS_NODIST) -I$(srcdir)/Include/internal}.


Added in version 3.5.

@end deffn

@geindex 환경 변수; PY_STDMODULE_CFLAGS
@anchor{using/configure envvar-PY_STDMODULE_CFLAGS}@anchor{21e6}
@deffn {환경 변수} PY_STDMODULE_CFLAGS

C flags used for building the interpreter object files.

Default: @code{$(PY_CFLAGS) $(PY_CFLAGS_NODIST) $(PY_CPPFLAGS) $(CFLAGSFORSHARED)}.


Added in version 3.7.

@end deffn

@geindex 환경 변수; PY_CORE_CFLAGS
@anchor{using/configure envvar-PY_CORE_CFLAGS}@anchor{21e7}
@deffn {환경 변수} PY_CORE_CFLAGS

Default: @code{$(PY_STDMODULE_CFLAGS) -DPy_BUILD_CORE}.


Added in version 3.2.

@end deffn

@geindex 환경 변수; PY_BUILTIN_MODULE_CFLAGS
@anchor{using/configure envvar-PY_BUILTIN_MODULE_CFLAGS}@anchor{21e8}
@deffn {환경 변수} PY_BUILTIN_MODULE_CFLAGS

Compiler flags to build a standard library extension module as a built-in
module, like the @ref{b2,,posix} module.

Default: @code{$(PY_STDMODULE_CFLAGS) -DPy_BUILD_CORE_BUILTIN}.


Added in version 3.8.

@end deffn

@geindex 환경 변수; PURIFY
@anchor{using/configure envvar-PURIFY}@anchor{21e9}
@deffn {환경 변수} PURIFY

Purify command. Purify is a memory debugger program.

Default: empty string (not used).
@end deffn

@node Linker flags,,Compiler flags,Compiler and linker flags
@anchor{using/configure linker-flags}@anchor{21ea}
@subsubsection Linker flags


@geindex 환경 변수; LINKCC
@anchor{using/configure envvar-LINKCC}@anchor{21eb}
@deffn {환경 변수} LINKCC

Linker command used to build programs like @code{python} and @code{_testembed}.

Default: @code{$(PURIFY) $(CC)}.
@end deffn

@geindex 환경 변수; CONFIGURE_LDFLAGS
@anchor{using/configure envvar-CONFIGURE_LDFLAGS}@anchor{21ec}
@deffn {환경 변수} CONFIGURE_LDFLAGS

Value of 
@geindex LDFLAGS
@geindex 환경 변수; LDFLAGS
@ref{16bd,,LDFLAGS} variable passed to the @code{./configure} script.

Avoid assigning 
@geindex CFLAGS
@geindex 환경 변수; CFLAGS
@ref{16bc,,CFLAGS}, 
@geindex LDFLAGS
@geindex 환경 변수; LDFLAGS
@ref{16bd,,LDFLAGS}, etc. so users can use
them on the command line to append to these values without stomping the
pre-set values.


Added in version 3.2.

@end deffn

@geindex 환경 변수; LDFLAGS_NODIST
@anchor{using/configure envvar-LDFLAGS_NODIST}@anchor{21ed}
@deffn {환경 변수} LDFLAGS_NODIST

@geindex LDFLAGS_NODIST
@geindex 환경 변수; LDFLAGS_NODIST
@ref{21ed,,LDFLAGS_NODIST} is used in the same manner as
@geindex CFLAGS_NODIST
@geindex 환경 변수; CFLAGS_NODIST
@ref{21db,,CFLAGS_NODIST}.  Use it when a linker flag should `not' be part of
@geindex LDFLAGS
@geindex 환경 변수; LDFLAGS
@ref{16bd,,LDFLAGS} once Python is installed (gh-65320@footnote{https://github.com/python/cpython/issues/65320}).

In particular, 
@geindex LDFLAGS
@geindex 환경 변수; LDFLAGS
@ref{16bd,,LDFLAGS} should not contain:


@itemize *

@item 
the compiler flag @code{-L} (for setting the search path for libraries).
The @code{-L} flags are processed from left to right, and any flags in
@geindex LDFLAGS
@geindex 환경 변수; LDFLAGS
@ref{16bd,,LDFLAGS} would take precedence over user- and package-supplied @code{-L}
flags.
@end itemize
@end deffn

@geindex 환경 변수; CONFIGURE_LDFLAGS_NODIST
@anchor{using/configure envvar-CONFIGURE_LDFLAGS_NODIST}@anchor{21ee}
@deffn {환경 변수} CONFIGURE_LDFLAGS_NODIST

Value of 
@geindex LDFLAGS_NODIST
@geindex 환경 변수; LDFLAGS_NODIST
@ref{21ed,,LDFLAGS_NODIST} variable passed to the @code{./configure}
script.


Added in version 3.8.

@end deffn

@geindex 환경 변수; LDFLAGS
@anchor{using/configure envvar-LDFLAGS}@anchor{16bd}
@deffn {환경 변수} LDFLAGS

Linker flags, e.g. @code{-L@var{lib_dir}} if you have libraries in a nonstandard
directory `lib_dir'.

Both 
@geindex CPPFLAGS
@geindex 환경 변수; CPPFLAGS
@ref{16be,,CPPFLAGS} and 
@geindex LDFLAGS
@geindex 환경 변수; LDFLAGS
@ref{16bd,,LDFLAGS} need to contain the shell’s
value to be able to build extension modules using the
directories specified in the environment variables.
@end deffn

@geindex 환경 변수; LIBS
@anchor{using/configure envvar-LIBS}@anchor{21ef}
@deffn {환경 변수} LIBS

Linker flags to pass libraries to the linker when linking the Python
executable.

Example: @code{-lrt}.
@end deffn

@geindex 환경 변수; LDSHARED
@anchor{using/configure envvar-LDSHARED}@anchor{21f0}
@deffn {환경 변수} LDSHARED

Command to build a shared library.

Default: @code{@@LDSHARED@@ $(PY_LDFLAGS)}.
@end deffn

@geindex 환경 변수; BLDSHARED
@anchor{using/configure envvar-BLDSHARED}@anchor{21f1}
@deffn {환경 변수} BLDSHARED

Command to build @code{libpython} shared library.

Default: @code{@@BLDSHARED@@ $(PY_CORE_LDFLAGS)}.
@end deffn

@geindex 환경 변수; PY_LDFLAGS
@anchor{using/configure envvar-PY_LDFLAGS}@anchor{21f2}
@deffn {환경 변수} PY_LDFLAGS

Default: @code{$(CONFIGURE_LDFLAGS) $(LDFLAGS)}.
@end deffn

@geindex 환경 변수; PY_LDFLAGS_NODIST
@anchor{using/configure envvar-PY_LDFLAGS_NODIST}@anchor{21f3}
@deffn {환경 변수} PY_LDFLAGS_NODIST

Default: @code{$(CONFIGURE_LDFLAGS_NODIST) $(LDFLAGS_NODIST)}.


Added in version 3.8.

@end deffn

@geindex 환경 변수; PY_CORE_LDFLAGS
@anchor{using/configure envvar-PY_CORE_LDFLAGS}@anchor{21f4}
@deffn {환경 변수} PY_CORE_LDFLAGS

Linker flags used for building the interpreter object files.


Added in version 3.8.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 윈도우에서 파이썬 사용하기,macOS 에서 파이썬 사용하기,Configure Python,파이썬 설정 및 사용법
@anchor{using/windows doc}@anchor{21f5}@anchor{using/windows translation-repo}@anchor{21f6}@anchor{using/windows using-on-windows}@anchor{c9d}@anchor{using/windows using-python-on-windows}@anchor{21f7}
@section 윈도우에서 파이썬 사용하기


이 문서는 Microsoft 윈도우에서 파이썬을 사용할 때 알아야 할 윈도우 특정 동작에 대한 개요를 제공하는 것을 목표로 합니다.

Unlike most Unix systems and services, Windows does not include a system
supported installation of Python. Instead, Python can be obtained from a number
of distributors, including directly from the CPython team. Each Python
distribution will have its own benefits and drawbacks, however, consistency with
other tools you are using is generally a worthwhile benefit. Before committing
to the process described here, we recommend investigating your existing tools to
see if they can provide Python directly.

To obtain Python from the CPython team, use the Python Install Manager. This
is a standalone tool that makes Python available as global commands on your
Windows machine, integrates with the system, and supports updates over time. You
can download the Python Install Manager from python.org/downloads@footnote{https://www.python.org/downloads/} or through
the Microsoft Store app@footnote{https://apps.microsoft.com/detail/9NQ7512CXL7T}.

Once you have installed the Python Install Manager, the global @code{python}
command can be used from any terminal to launch your current latest version of
Python. This version may change over time as you add or remove different
versions, and the @code{py list} command will show which is current.

In general, we recommend that you create a @ref{20e8,,virtual environment}
for each project and run @code{<env>\Scripts\Activate} in your terminal to use it.
This provides isolation between projects, consistency over time, and ensures
that additional commands added by packages are also available in your session.
Create a virtual environment using @code{python -m venv <env path>}.

If the @code{python} or @code{py} commands do not seem to be working, please see the
@ref{21f8,,Troubleshooting} section below. There are
sometimes additional manual steps required to configure your PC.

Apart from using the Python install manager, Python can also be obtained as
NuGet packages. See @ref{21f9,,nuget.org 패키지} below for more information on these
packages.

The embeddable distros are minimal packages of Python suitable for embedding
into larger applications. They can be installed using the Python install
manager. See @ref{21fa,,내장 가능한 패키지} below for more information on these
packages.
@anchor{using/windows pymanager}@anchor{21fb}@anchor{using/windows windows-store}@anchor{1fc5}@anchor{using/windows setting-envvars}@anchor{1fc6}@anchor{using/windows windows-path-mod}@anchor{1250}
@menu
* Python install manager:: 
* 내장 가능한 패키지:: 
* nuget.org 패키지: nuget org 패키지. 
* 대체 번들:: 
* Supported Windows versions:: 
* Removing the MAX_PATH limitation:: 
* UTF-8 모드:: 
* 모듈 찾기:: 
* 추가 모듈:: 
* 윈도우에서 파이썬 컴파일하기:: 
* The full installer (deprecated): The full installer deprecated. 
* Python launcher for Windows (deprecated): Python launcher for Windows deprecated. 

@end menu

@node Python install manager,내장 가능한 패키지,,윈도우에서 파이썬 사용하기
@anchor{using/windows launcher}@anchor{7d9}@anchor{using/windows python-install-manager}@anchor{21fc}
@subsection Python install manager


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

@end menu

@node Installation,Basic use,,Python install manager
@anchor{using/windows installation}@anchor{21fd}
@subsubsection Installation


The Python install manager can be installed from the Microsoft Store app@footnote{https://apps.microsoft.com/detail/9NQ7512CXL7T}
or downloaded and installed from python.org/downloads@footnote{https://www.python.org/downloads/}. The two versions are
identical.

To install through the Store, simply click “Install”. After it has completed,
open a terminal and type @code{python} to get started.

To install the file downloaded from python.org, either double-click and select
“Install”, or run @code{Add-AppxPackage <path to MSIX>} in Windows Powershell.

After installation, the @code{python}, @code{py}, and @code{pymanager} commands should be
available. If you have existing installations of Python, or you have modified
your 
@geindex PATH
@geindex 환경 변수; PATH
@code{PATH} variable, you may need to remove them or undo the
modifications. See @ref{21f8,,Troubleshooting} for more help with fixing
non-working commands.

When you first install a runtime, you will likely be prompted to add a directory
to your 
@geindex PATH
@geindex 환경 변수; PATH
@code{PATH}. This is optional, if you prefer to use the @code{py}
command, but is offered for those who prefer the full range of aliases (such
as @code{python3.14.exe}) to be available. The directory will be
@code{%LocalAppData%\Python\bin} by default, but may be customized by an
administrator. Click Start and search for “Edit environment variables for your
account” for the system settings page to add the path.

Each Python runtime you install will have its own directory for scripts. These
also need to be added to 
@geindex PATH
@geindex 환경 변수; PATH
@code{PATH} if you want to use them.

The Python install manager will be automatically updated to new releases. This
does not affect any installs of Python runtimes. Uninstalling the Python install
manager does not uninstall any Python runtimes.

If you are not able to install an MSIX in your context, for example, you are
using automated deployment software that does not support it, or are targeting
Windows Server 2019, please see @ref{21fe,,Advanced installation} below for more
information.

@node Basic use,Command help,Installation,Python install manager
@anchor{using/windows basic-use}@anchor{21ff}
@subsubsection Basic use


The recommended command for launching Python is @code{python}, which will either
launch the version requested by the script being launched, an active virtual
environment, or the default installed version, which will be the latest stable
release unless configured otherwise. If no version is specifically requested and
no runtimes are installed at all, the current latest release will be installed
automatically.

For all scenarios involving multiple runtime versions, the recommended command
is @code{py}. This may be used anywhere in place of @code{python} or the older
@code{py.exe} launcher. By default, @code{py} matches the behaviour of @code{python}, but
also allows command line options to select a specific version as well as
subcommands to manage installations. These are detailed below.

Because the @code{py} command may already be taken by the previous version, there
is also an unambiguous @code{pymanager} command. Scripted installs that are
intending to use Python install manager should consider using @code{pymanager}, due
to the lower chance of encountering a conflict with existing installs. The only
difference between the two commands is when running without any arguments:
@code{py} will launch your default interpreter, while @code{pymanager} will display
help (@code{pymanager exec ...} provides equivalent behaviour to @code{py ...}).

Each of these commands also has a windowed version that avoids creating a
console window. These are @code{pyw}, @code{pythonw} and @code{pymanagerw}. A @code{python3}
command is also included that mimics the @code{python} command. It is intended to
catch accidental uses of the typical POSIX command on Windows, but is not meant
to be widely used or recommended.

To launch your default runtime, run @code{python} or @code{py} with the arguments you
want to be passed to the runtime (such as script files or the module to launch):

@example
$> py
...
$> python my-script.py
...
$> py -m this
...
@end example

The default runtime can be overridden with the 
@geindex PYTHON_MANAGER_DEFAULT
@geindex 환경 변수; PYTHON_MANAGER_DEFAULT
@ref{2200,,PYTHON_MANAGER_DEFAULT}
environment variable, or a configuration file. See @ref{2201,,Configuration} for
information about configuration settings.

To launch a specific runtime, the @code{py} command accepts a @code{-V:<TAG>} option.
This option must be specified before any others. The tag is part or all of the
identifier for the runtime; for those from the CPython team, it looks like the
version, potentially with the platform. For compatibility, the @code{V:} may be
omitted in cases where the tag refers to an official release and starts with
@code{3}.

@example
$> py -V:3.14 ...
$> py -V:3-arm64 ...
@end example

Runtimes from other distributors may require the `company' to be included as
well. This should be separated from the tag by a slash, and may be a prefix.
Specifying the company is optional when it is @code{PythonCore}, and specifying the
tag is optional (but not the slash) when you want the latest release from a
specific company.

@example
$> py -V:Distributor\1.0 ...
$> py -V:distrib/ ...
@end example

If no version is specified, but a script file is passed, the script will be
inspected for a `shebang line'. This is a special format for the first line in
a file that allows overriding the command. See @ref{2202,,Shebang lines} for more
information. When there is no shebang line, or it cannot be resolved, the script
will be launched with the default runtime.

If you are running in an active virtual environment, have not requested a
particular version, and there is no shebang line, the default runtime will be
that virtual environment. In this scenario, the @code{python} command was likely
already overridden and none of these checks occurred. However, this behaviour
ensures that the @code{py} command can be used interchangeably.

When no runtimes are installed, any launch command will try to install the
requested version and launch it. However, after any version is installed, only
the @code{py exec ...} and @code{pymanager exec ...} commands will install if the
requested version is absent. Other forms of commands will display an error and
direct you to use @code{py install} first.

@node Command help,Listing runtimes,Basic use,Python install manager
@anchor{using/windows command-help}@anchor{2203}
@subsubsection Command help


The @code{py help} command will display the full list of supported commands, along
with their options. Any command may be passed the @code{-?} option to display its
help, or its name passed to @code{py help}.

@example
$> py help
$> py help install
$> py install /?
@end example

All commands support some common options, which will be shown by @code{py help}.
These options must be specified after any subcommand. Specifying @code{-v} or
@code{--verbose} will increase the amount of output shown, and @code{-vv} will
increase it further for debugging purposes. Passing @code{-q} or @code{--quiet} will
reduce output, and @code{-qq} will reduce it further.

The @code{--config=<PATH>} option allows specifying a configuration file to
override multiple settings at once. See @ref{2201,,Configuration} below for more
information about these files.

@node Listing runtimes,Installing runtimes,Command help,Python install manager
@anchor{using/windows listing-runtimes}@anchor{2204}
@subsubsection Listing runtimes


@example
$> py list [-f=|--format=<FMT>] [-1|--one] [--online|-s=|--source=<URL>] [<TAG>...]
@end example

The list of installed runtimes can be seen using @code{py list}. A filter may be
added in the form of one or more tags (with or without company specifier), and
each may include a @code{<}, @code{<=}, @code{>=} or @code{>} prefix to restrict to a range.

A range of formats are supported, and can be passed as the @code{--format=<FMT>} or
@code{-f <FMT>} option. Formats include @code{table} (a user friendly table view),
@code{csv} (comma-separated table), @code{json} (a single JSON blob), @code{jsonl} (one
JSON blob per result), @code{exe} (just the executable path), @code{prefix} (just the
prefix path).

The @code{--one} or @code{-1} option only displays a single result. If the default
runtime is included, it will be the one. Otherwise, the “best” result is shown
(“best” is deliberately vaguely defined, but will usually be the most recent
version). The result shown by @code{py list --one <TAG>} will match the runtime
that would be launched by @code{py -V:<TAG>}.

The @code{--only-managed} option excludes results that were not installed by the
Python install manager. This is useful when determining which runtimes may be
updated or uninstalled through the @code{py} command.

The @code{--online} option is short for passing @code{--source=<URL>} with the default
source. Passing either of these options will search the online index for
runtimes that can be installed. The result shown by @code{py list --online --one
<TAG>} will match the runtime that would be installed by @code{py install <TAG>}.

@example
$> py list --online 3.14
@end example

For compatibility with the old launcher, the @code{--list}, @code{--list-paths},
@code{-0} and @code{-0p} commands (e.g. @code{py -0p}) are retained. They do not allow
additional options, and will produce legacy formatted output.

@node Installing runtimes,Offline installs,Listing runtimes,Python install manager
@anchor{using/windows installing-runtimes}@anchor{2205}
@subsubsection Installing runtimes


@example
$> py install [-s=|--source=<URL>] [-f|--force] [-u|--update] [--dry-run] [<TAG>...]
@end example

New runtime versions may be added using @code{py install}. One or more tags may be
specified, and the special tag @code{default} may be used to select the default.
Ranges are not supported for installation.

The @code{--source=<URL>} option allows overriding the online index that is used to
obtain runtimes. This may be used with an offline index, as shown in
@ref{2206,,Offline installs}.

Passing @code{--force} will ignore any cached files and remove any existing install
to replace it with the specified one.

Passing @code{--update} will replace existing installs if the new version is newer.
Otherwise, they will be left. If no tags are provided with @code{--update}, all
installs managed by the Python install manager will be updated if newer versions
are available. Updates will remove any modifications made to the install,
including globally installed packages, but virtual environments will continue to
work.

Passing @code{--dry-run} will generate output and logs, but will not modify any
installs.

Passing @code{--refresh} will update all registrations for installed runtimes. This
will recreate Start menu shortcuts, registry keys, and global aliases (such as
@code{python3.14.exe} or for any installed scripts). These are automatically
refreshed on installation of any runtime, but may need to be manually refreshed
after installing packages.

In addition to the above options, the @code{--target} option will extract the
runtime to the specified directory instead of doing a normal install.
This is useful for embedding runtimes into larger applications.
Unlike a normal install, @code{py} will not be aware of the extracted runtime,
and no Start menu or other shortcuts will be created.
To launch the runtime, directly execute the main executable (typically
@code{python.exe}) in the target directory.

@example
$> py install ... [-t=|--target=<PATH>] <TAG>
@end example

The @code{py exec} command will install the requested runtime if it is not already
present. This is controlled by the @code{automatic_install} configuration
(
@geindex PYTHON_MANAGER_AUTOMATIC_INSTALL
@geindex 환경 변수; PYTHON_MANAGER_AUTOMATIC_INSTALL
@ref{2207,,PYTHON_MANAGER_AUTOMATIC_INSTALL}), and is enabled by default.
If no runtimes are available at all, all launch commands will do an automatic
install if the configuration setting allows. This is to ensure a good experience
for new users, but should not generally be relied on rather than using the
@code{py exec} command or explicit install commands.

@node Offline installs,Uninstalling runtimes,Installing runtimes,Python install manager
@anchor{using/windows offline-installs}@anchor{2208}@anchor{using/windows pymanager-offline}@anchor{2206}
@subsubsection Offline installs


To perform offline installs of Python, you will need to first create an offline
index on a machine that has network access.

@example
$> py install --download=<PATH> ... <TAG>...
@end example

The @code{--download=<PATH>} option will download the packages for the listed tags
and create a directory containing them and an @code{index.json} file suitable for
later installation. This entire directory can be moved to the offline machine
and used to install one or more of the bundled runtimes:

@example
$> py install --source="<PATH>\index.json" <TAG>...
@end example

The Python install manager can be installed by downloading its installer and
moving it to another machine before installing.

Alternatively, the ZIP files in an offline index directory can simply be
transferred to another machine and extracted. This will not register the install
in any way, and so it must be launched by directly referencing the executables
in the extracted directory, but it is sometimes a preferable approach in cases
where installing the Python install manager is not possible or convenient.

In this way, Python runtimes can be installed and managed on a machine without
access to the internet.

@node Uninstalling runtimes,Configuration,Offline installs,Python install manager
@anchor{using/windows uninstalling-runtimes}@anchor{2209}
@subsubsection Uninstalling runtimes


@example
$> py uninstall [-y|--yes] <TAG>...
@end example

Runtimes may be removed using the @code{py uninstall} command. One or more tags
must be specified. Ranges are not supported here.

The @code{--yes} option bypasses the confirmation prompt before uninstalling.

Instead of passing tags individually, the @code{--purge} option may be specified.
This will remove all runtimes managed by the Python install manager, including
cleaning up the Start menu, registry, and any download caches. Runtimes that
were not installed by the Python install manager will not be impacted, and
neither will manually created configuration files.

@example
$> py uninstall [-y|--yes] --purge
@end example

The Python install manager can be uninstalled through the Windows “Installed
apps” settings page. This does not remove any runtimes, and they will still be
usable, though the global @code{python} and @code{py} commands will be removed.
Reinstalling the Python install manager will allow you to manage these runtimes
again. To completely clean up all Python runtimes, run with @code{--purge} before
uninstalling the Python install manager.

@node Configuration,Shebang lines,Uninstalling runtimes,Python install manager
@anchor{using/windows configuration}@anchor{220a}@anchor{using/windows pymanager-config}@anchor{2201}
@subsubsection Configuration


Python install manager is configured with a hierarchy of configuration files,
environment variables, command-line options, and registry settings. In general,
configuration files have the ability to configure everything, including the
location of other configuration files, while registry settings are
administrator-only and will override configuration files. Command-line options
override all other settings, but not every option is available.

This section will describe the defaults, but be aware that modified or
overridden installs may resolve settings differently.

A global configuration file may be configured by an administrator, and would be
read first. The user configuration file is stored at
@code{%AppData%\Python\pymanager.json}
(note that this location is under @code{Roaming}, not @code{Local}) and is read next,
overwriting any settings from earlier files. An additional configuration file
may be specified as the @code{PYTHON_MANAGER_CONFIG} environment variable or the
@code{--config} command line option (but not both).
These locations may be modified by administrative customization options listed
later.

The following settings are those that are considered likely to be modified in
normal use. Later sections list those that are intended for administrative
customization.

@c Sphinx bug with text writer; remove widths & caption temporarily

@c :widths: 2, 2, 4

@subsubheading Standard configuration options



@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Config Key

@tab

Environment Variable

@tab

설명

@item

@code{default_tag}

@tab

@geindex 환경 변수; PYTHON_MANAGER_DEFAULT
@anchor{using/windows envvar-PYTHON_MANAGER_DEFAULT}@anchor{2200}
@deffn {환경 변수} PYTHON_MANAGER_DEFAULT
@end deffn

@tab

The preferred default version to launch or install.
By default, this is interpreted as the most recent non-prerelease version
from the CPython team.

@item

@code{default_platform}

@tab

@code{PYTHON_MANAGER_DEFAULT_PLATFORM}

@tab

The preferred default platform to launch or install.
This is treated as a suffix to the specified tag, such that @code{py -V:3.14}
would prefer an install for @code{3.14-64} if it exists
(and @code{default_platform} is @code{-64}),
but will use @code{3.14} if no tagged install exists.

@item

@code{logs_dir}

@tab

@code{PYTHON_MANAGER_LOGS}

@tab

The location where log files are written.
By default, @code{%TEMP%}.

@item

@code{automatic_install}

@tab

@geindex 환경 변수; PYTHON_MANAGER_AUTOMATIC_INSTALL
@anchor{using/windows envvar-PYTHON_MANAGER_AUTOMATIC_INSTALL}@anchor{2207}
@deffn {환경 변수} PYTHON_MANAGER_AUTOMATIC_INSTALL
@end deffn

@tab

True to allow automatic installs when using @code{py exec} to launch (or
@code{py} when no runtimes are installed yet).
Other commands will not automatically install, regardless of this
setting.
By default, true.

@item

@code{include_unmanaged}

@tab

@code{PYTHON_MANAGER_INCLUDE_UNMANAGED}

@tab

True to allow listing and launching runtimes that were not installed
by the Python install manager, or false to exclude them.
By default, true.

@item

@code{shebang_can_run_anything}

@tab

@code{PYTHON_MANAGER_SHEBANG_CAN_RUN_ANYTHING}

@tab

True to allow shebangs in @code{.py} files to launch applications other than
Python runtimes, or false to prevent it.
By default, true.

@item

@code{log_level}

@tab

@code{PYMANAGER_VERBOSE}, @code{PYMANAGER_DEBUG}

@tab

Set the default level of output (0-50).
By default, 20.
Lower values produce more output.
The environment variables are boolean, and may produce additional
output during startup that is later suppressed by other configuration.

@item

@code{confirm}

@tab

@code{PYTHON_MANAGER_CONFIRM}

@tab

True to confirm certain actions before taking them (such as uninstall),
or false to skip the confirmation.
By default, true.

@item

@code{install.source}

@tab

@code{PYTHON_MANAGER_SOURCE_URL}

@tab

Override the index feed to obtain new installs from.

@item

@code{install.enable_entrypoints}

@tab

(none)

@tab

True to generate global commands for installed packages (such as
@code{pip.exe}). These are defined by the packages themselves.
If set to false, only the Python interpreter has global commands created.
By default, true. You should run @code{py install --refresh} after changing
this setting.

@item

@code{list.format}

@tab

@code{PYTHON_MANAGER_LIST_FORMAT}

@tab

Specify the default format used by the @code{py list} command.
By default, @code{table}.

@item

@code{install_dir}

@tab

(none)

@tab

Specify the root directory that runtimes will be installed into.
If you change this setting, previously installed runtimes will not be
usable unless you move them to the new location.

@item

@code{global_dir}

@tab

(none)

@tab

Specify the directory where global commands (such as @code{python3.14.exe}
and @code{pip.exe}) are stored.
This directory should be added to your 
@geindex PATH
@geindex 환경 변수; PATH
@code{PATH} to make the
commands available from your terminal.

@item

@code{download_dir}

@tab

(none)

@tab

Specify the directory where downloaded files are stored.
This directory is a temporary cache, and can be cleaned up from time to
time.

@end multitable


Dotted names should be nested inside JSON objects, for example, @code{list.format}
would be specified as @code{@{"list": @{"format": "table"@}@}}.

@node Shebang lines,Advanced installation,Configuration,Python install manager
@anchor{using/windows pymanager-shebang}@anchor{2202}@anchor{using/windows shebang-lines}@anchor{220b}
@subsubsection Shebang lines


If the first line of a script file starts with @code{#!}, it is known as a
“shebang” line.  Linux and other Unix like operating systems have native
support for such lines and they are commonly used on such systems to indicate
how a script should be executed. The @code{python} and @code{py} commands allow the
same facilities to be used with Python scripts on Windows.

To allow shebang lines in Python scripts to be portable between Unix and
Windows, a number of ‘virtual’ commands are supported to specify which
interpreter to use.  The supported virtual commands are:


@itemize *

@item 
@code{/usr/bin/env <ALIAS>}

@item 
@code{/usr/bin/env -S <ALIAS>}

@item 
@code{/usr/bin/<ALIAS>}

@item 
@code{/usr/local/bin/<ALIAS>}

@item 
@code{<ALIAS>}
@end itemize

예를 들어, 스크립트의 첫 번째 줄이 다음과 같이 시작하면

@example
#! /usr/bin/python
@end example

기본 파이썬이나 활성 가상 환경을 찾아서 사용합니다. 유닉스에서 작동하도록 작성된 많은 파이썬 스크립트에는 이미 이 줄이 있어서, 수정하지 않고도 이러한 스크립트를 런처에서 사용할 수 있습니다. 윈도우에서 유닉스에서 유용할 새 스크립트를 작성하면, @code{/usr}로 시작하는 셔뱅 줄 중 하나를 사용해야 합니다.

Any of the above virtual commands can have @code{<ALIAS>} replaced by an alias from
an installed runtime. That is, any command generated in the global aliases
directory (which you may have added to your 
@geindex PATH
@geindex 환경 변수; PATH
@code{PATH} environment variable)
can be used in a shebang, even if it is not on your 
@geindex PATH
@geindex 환경 변수; PATH
@code{PATH}. This allows
the use of shebangs like @code{/usr/bin/python3.12} to select a particular runtime.

If no runtimes are installed, or if automatic installation is enabled, the
requested runtime will be installed if necessary. See @ref{2201,,Configuration}
for information about configuration settings.

The @code{/usr/bin/env} form of shebang line will also search the 
@geindex PATH
@geindex 환경 변수; PATH
@code{PATH}
environment variable for unrecognized commands. This corresponds to the
behaviour of the Unix @code{env} program, which performs the same search, but
prefers launching known Python commands. A warning may be displayed when
searching for arbitrary executables, and this search may be disabled by the
@code{shebang_can_run_anything} configuration option.

Shebang lines that do not match any of patterns are treated as `Windows'
executable paths that are absolute or relative to the directory containing the
script file. This is a convenience for Windows-only scripts, such as those
generated by an installer, since the behavior is not compatible with Unix-style
shells. These paths may be quoted, and may include multiple arguments, after
which the path to the script and any additional arguments will be appended.
This functionality may be disabled by the @code{shebang_can_run_anything}
configuration option.

@cartouche
@quotation 참고 
The behaviour of shebangs in the Python install manager is subtly different
from the previous @code{py.exe} launcher, and the old configuration options no
longer apply. If you are specifically reliant on the old behaviour or
configuration, we recommend installing the legacy launcher@footnote{https://www.python.org/ftp/python/3.14.0/win32/launcher.msi}. The legacy
launcher’s @code{py} command will override PyManager’s one by default, and you
will need to use @code{pymanager} commands for installing and uninstalling.
@end quotation
@end cartouche

@node Advanced installation,Administrative configuration,Shebang lines,Python install manager
@anchor{using/windows advanced-installation}@anchor{220c}@anchor{using/windows pymanager-advancedinstall}@anchor{21fe}
@subsubsection Advanced installation


For situations where an MSIX cannot be installed, such as some older
administrative distribution platforms, there is an MSI available from the
python.org downloads page. This MSI has no user interface, and can only perform
per-machine installs to its default location in Program Files. It will attempt
to modify the system 
@geindex PATH
@geindex 환경 변수; PATH
@code{PATH} environment variable to include this install
location, but be sure to validate this on your configuration.

@cartouche
@quotation 참고 
Windows Server 2019 is the only version of Windows that CPython supports that
does not support MSIX. For Windows Server 2019, you should use the MSI.
@end quotation
@end cartouche

Be aware that the MSI package does not bundle any runtimes, and so is not
suitable for installs into offline environments without also creating an offline
install index. See @ref{2206,,Offline installs} and @ref{220d,,Administrative configuration}
for information on handling these scenarios.

Runtimes installed by the MSI are shared with those installed by the MSIX, and
are all per-user only. The Python install manager does not support installing
runtimes per-machine. To emulate a per-machine install, you can use @code{py install
--target=<shared location>} as administrator and add your own system-wide
modifications to 
@geindex PATH
@geindex 환경 변수; PATH
@code{PATH}, the registry, or the Start menu.

When the MSIX is installed, but commands are not available in the 
@geindex PATH
@geindex 환경 변수; PATH
@code{PATH}
environment variable, they can be found under
@code{%LocalAppData%\Microsoft\WindowsApps\PythonSoftwareFoundation.PythonManager_3847v3x7pw1km}
or
@code{%LocalAppData%\Microsoft\WindowsApps\PythonSoftwareFoundation.PythonManager_qbz5n2kfra8p0},
depending on whether it was installed from python.org or through the Windows
Store. Attempting to run the executable directly from Program Files is not
recommended.

To programmatically install the Python install manager, it is easiest to use
WinGet, which is included with all supported versions of Windows:

@example
$> winget install 9NQ7512CXL7T -e --accept-package-agreements --disable-interactivity

# Optionally run the configuration checker and accept all changes
$> py install --configure -y
@end example

To download the Python install manager and install on another machine, the
following WinGet command will download the required files from the Store to your
Downloads directory (add @code{-d <location>} to customize the output location).
This also generates a YAML file that appears to be unnecessary, as the
downloaded MSIX can be installed by launching or using the commands below.

@example
$> winget download 9NQ7512CXL7T -e --skip-license --accept-package-agreements --accept-source-agreements
@end example

To programmatically install or uninstall an MSIX using only PowerShell, the
Add-AppxPackage@footnote{https://learn.microsoft.com/powershell/module/appx/add-appxpackage} and Remove-AppxPackage@footnote{https://learn.microsoft.com/powershell/module/appx/remove-appxpackage} PowerShell cmdlets are recommended:

@example
$> Add-AppxPackage C:\Downloads\python-manager-25.0.msix
...
$> Get-AppxPackage PythonSoftwareFoundation.PythonManager | Remove-AppxPackage
@end example

The latest release can be downloaded and installed by Windows by passing the
AppInstaller file to the Add-AppxPackage command. This installs using the MSIX
on python.org, and is only recommended for cases where installing via the Store
(interactively or using WinGet) is not possible.

@example
$> Add-AppxPackage -AppInstallerFile https://www.python.org/ftp/python/pymanager/pymanager.appinstaller
@end example

Other tools and APIs may also be used to provision an MSIX package for all users
on a machine, but Python does not consider this a supported scenario. We suggest
looking into the PowerShell Add-AppxProvisionedPackage@footnote{https://learn.microsoft.com/powershell/module/dism/add-appxprovisionedpackage} cmdlet, the native
Windows PackageManager@footnote{https://learn.microsoft.com/uwp/api/windows.management.deployment.packagemanager} class, or the documentation and support for your
deployment tool.

Regardless of the install method, users will still need to install their own
copies of Python itself, as there is no way to trigger those installs without
being a logged in user. When using the MSIX, the latest version of Python will
be available for all users to install without network access.

Note that the MSIX downloadable from the Store and from the Python website are
subtly different and cannot be installed at the same time. Wherever possible,
we suggest using the above WinGet commands to download the package from the
Store to reduce the risk of setting up conflicting installs. There are no
licensing restrictions on the Python install manager that would prevent using
the Store package in this way.

@node Administrative configuration,Installing free-threaded binaries,Advanced installation,Python install manager
@anchor{using/windows administrative-configuration}@anchor{220e}@anchor{using/windows pymanager-admin-config}@anchor{220d}
@subsubsection Administrative configuration


There are a number of options that may be useful for administrators to override
configuration of the Python install manager. These can be used to provide local
caching, disable certain shortcut types, override bundled content. All of the
above configuration options may be set, as well as those below.

Configuration options may be overridden in the registry by setting values under
@code{HKEY_LOCAL_MACHINE\Software\Policies\Python\PyManager}, where the
value name matches the configuration key and the value type is @code{REG_SZ}. Note
that this key can itself be customized, but only by modifying the core config
file distributed with the Python install manager. We recommend, however, that
registry values are used only to set @code{base_config} to a JSON file containing
the full set of overrides. Registry key overrides will replace any other
configured setting, while @code{base_config} allows users to further modify
settings they may need.

Note that most settings with environment variables support those variables
because their default setting specifies the variable. If you override them, the
environment variable will no longer work, unless you override it with another
one. For example, the default value of @code{confirm} is literally
@code{%PYTHON_MANAGER_CONFIRM%}, which will resolve the variable at load time. If
you override the value to @code{yes}, then the environment variable will no longer
be used. If you override the value to @code{%CONFIRM%}, then that environment
variable will be used instead.

Configuration settings that are paths are interpreted as relative to the
directory containing the configuration file that specified them.

@c Sphinx bug with text writer; remove widths & caption temporarily

@c :widths: 1, 4

@subsubheading Administrative configuration options



@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Config Key

@tab

설명

@item

@code{base_config}

@tab

The highest priority configuration file to read.
Note that only the built-in configuration file and the registry can
modify this setting.

@item

@code{user_config}

@tab

The second configuration file to read.

@item

@code{additional_config}

@tab

The third configuration file to read.

@item

@code{registry_override_key}

@tab

Registry location to check for overrides.
Note that only the built-in configuration file can modify this setting.

@item

@code{bundled_dir}

@tab

Read-only directory containing locally cached files.

@item

@code{install.fallback_source}

@tab

Path or URL to an index to consult when the main index cannot be accessed.

@item

@code{install.enable_shortcut_kinds}

@tab

Comma-separated list of shortcut kinds to allow (e.g. @code{"pep514,start"}).
Enabled shortcuts may still be disabled by @code{disable_shortcut_kinds}.

@item

@code{install.disable_shortcut_kinds}

@tab

Comma-separated list of shortcut kinds to exclude
(e.g. @code{"pep514,start"}).
Disabled shortcuts are not reactivated by @code{enable_shortcut_kinds}.

@item

@code{install.hard_link_entrypoints}

@tab

True to use hard links for global shortcuts to save disk space. If false,
each shortcut executable is copied instead. After changing this setting,
you must run @code{py install --refresh --force} to update existing
commands.
By default, true. Disabling this may be necessary for troubleshooting or
systems that have issues with file links.

@item

@code{pep514_root}

@tab

Registry location to read and write PEP 514 entries into.
By default, @code{HKEY_CURRENT_USER\Software\Python}.

@item

@code{start_folder}

@tab

Start menu folder to write shortcuts into.
By default, @code{Python}.
This path is relative to the user’s Programs folder.

@item

@code{virtual_env}

@tab

Path to the active virtual environment.
By default, this is @code{%VIRTUAL_ENV%}, but may be set empty
to disable venv detection.

@item

@code{shebang_can_run_anything_silently}

@tab

True to suppress visible warnings when a shebang launches an application
other than a Python runtime.

@end multitable


@node Installing free-threaded binaries,Troubleshooting,Administrative configuration,Python install manager
@anchor{using/windows install-freethreaded-windows}@anchor{498}@anchor{using/windows installing-free-threaded-binaries}@anchor{220f}
@subsubsection Installing free-threaded binaries



Added in version 3.13.


Pre-built distributions of the free-threaded build are available
by installing tags with the @code{t} suffix.

@example
$> py install 3.14t
$> py install 3.14t-arm64
$> py install 3.14t-32
@end example

This will install and register as normal. If you have no other runtimes
installed, then @code{python} will launch this one. Otherwise, you will need to use
@code{py -V:3.14t ...} or, if you have added the global aliases directory to your
@geindex PATH
@geindex 환경 변수; PATH
@code{PATH} environment variable, the @code{python3.14t.exe} commands.

@node Troubleshooting,,Installing free-threaded binaries,Python install manager
@anchor{using/windows pymanager-troubleshoot}@anchor{21f8}@anchor{using/windows troubleshooting}@anchor{2210}
@subsubsection Troubleshooting


If your Python install manager does not seem to be working correctly, please
work through these tests and fixes to see if it helps. If not, please report an
issue at our bug tracker@footnote{https://github.com/python/pymanager/issues},
including any relevant log files (written to your @code{%TEMP%} directory by
default).

@c Sphinx bug with text writer; remove widths & caption temporarily

@c :widths: 1, 1

@subsubheading Troubleshooting



@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Symptom

@tab

Things to try

@item

@code{python} gives me a “command not found” error or opens the Store app
when I type it in my terminal.

@tab

Did you @ref{21fb,,install the Python install manager}?

@item

@tab

Click Start, open “Manage app execution aliases”, and check that the
aliases for “Python (default)” are enabled.
If they already are, try disabling and re-enabling to refresh the command.
The “Python (default windowed)” and “Python install manager” commands
may also need refreshing.

@item

@tab

Check that the @code{py} and @code{pymanager} commands work.

@item

@tab

Ensure your 
@geindex PATH
@geindex 환경 변수; PATH
@code{PATH} variable contains the entry for
@code{%UserProfile%\AppData\Local\Microsoft\WindowsApps}.
The operating system includes this entry once by default, after other
user paths. If removed, shortcuts will not be found.

@item

@code{py} gives me a “command not found” error when I type it in my terminal.

@tab

Did you @ref{21fb,,install the Python install manager}?

@item

@tab

Click Start, open “Manage app execution aliases”, and check that the
aliases for “Python (default)” are enabled.
If they already are, try disabling and re-enabling to refresh the command.
The “Python (default windowed)” and “Python install manager” commands
may also need refreshing.

@item

@tab

Ensure your 
@geindex PATH
@geindex 환경 변수; PATH
@code{PATH} variable contains the entry for
@code{%UserProfile%\AppData\Local\Microsoft\WindowsApps}.
The operating system includes this entry once by default, after other
user paths. If removed, shortcuts will not be found.

@item

@code{py} gives me a “can’t open file” error when I type commands in my
terminal.

@tab

This usually means you have the legacy launcher installed and
it has priority over the Python install manager.
To remove, click Start, open “Installed apps”,
search for “Python launcher” and uninstall it.

@item

@code{python} doesn’t launch the same runtime as @code{py}

@tab

Click Start, open “Installed apps”, look for any existing Python runtimes,
and either remove them or Modify and disable the 
@geindex PATH
@geindex 환경 변수; PATH
@code{PATH} options.

@item

@tab

Click Start, open “Manage app execution aliases”, and check that your
@code{python.exe} alias is set to “Python (default)”

@item

@code{python} and @code{py} don’t launch the runtime I expect

@tab

Check your 
@geindex PYTHON_MANAGER_DEFAULT
@geindex 환경 변수; PYTHON_MANAGER_DEFAULT
@ref{2200,,PYTHON_MANAGER_DEFAULT} environment variable
or @code{default_tag} configuration.
The @code{py list} command will show your default based on these settings.

@item

@tab

Installs that are managed by the Python install manager will be chosen
ahead of unmanaged installs.
Use @code{py install} to install the runtime you expect,
or configure your default tag.

@item

@tab

Prerelease and experimental installs that are not managed by the Python
install manager may be chosen ahead of stable releases.
Configure your default tag or uninstall the prerelease runtime
and reinstall it using @code{py install}.

@item

@code{pythonw} or @code{pyw} don’t launch the same runtime as @code{python} or @code{py}

@tab

Click Start, open “Manage app execution aliases”, and check that your
@code{pythonw.exe} and @code{pyw.exe} aliases are consistent with your others.

@item

@code{pip} gives me a “command not found” error when I type it in my terminal.

@tab

Have you activated a virtual environment?
Run the @code{.venv\Scripts\activate} script in your terminal to activate.

@item

@tab

The package may be available but missing the generated executable.
We recommend using the @code{python -m pip} command instead.
Running @code{py install --refresh} and ensuring that the global shortcuts
directory is on 
@geindex PATH
@geindex 환경 변수; PATH
@code{PATH} (it will be shown in the command output if
it is not) should make commands such as @code{pip} (and other installed
packages) available.

@item

I installed a package with @code{pip} but its command is not found.

@tab

Have you activated a virtual environment?
Run the @code{.venv\Scripts\activate} script in your terminal to activate.

@item

@tab

New packages do not automatically have global shortcuts created by the
Python install manager. Similarly, uninstalled packages do not have their
shortcuts removed.
Run @code{py install --refresh} to update the global shortcuts for newly
installed packages.

@item

Typing @code{script-name.py} in the terminal opens in a new window.

@tab

This is a known limitation of the operating system. Either specify @code{py}
before the script name, create a batch file containing @code{@@py "%~dpn0.py" %*}
with the same name as the script, or install the legacy launcher@footnote{https://www.python.org/ftp/python/3.14.0/win32/launcher.msi}
and select it as the association for scripts.

@item

Drag-dropping files onto a script doesn’t work

@tab

This is a known limitation of the operating system. It is supported with
the legacy launcher@footnote{https://www.python.org/ftp/python/3.14.0/win32/launcher.msi}, or with the Python install manager when installed
from the MSI.

@item

I have installed the Python install manager multiple times.

@tab

It is possible to install from the Store or WinGet, from the MSIX on
the Python website, and from the MSI, all at once.
They are all compatible and will share configuration and runtimes.

@item

@tab

See the earlier @ref{21fe,,Advanced installation} section for ways to
uninstall the install manager other than the typical Installed Apps
(Add and Remove Programs) settings page.

@item

My old @code{py.ini} settings no longer work.

@tab

The new Python install manager no longer supports this configuration file
or its settings, and so it will be ignored.
See @ref{2201,,Configuration} for information about configuration settings.

@end multitable


@node 내장 가능한 패키지,nuget org 패키지,Python install manager,윈도우에서 파이썬 사용하기
@anchor{using/windows the-embeddable-package}@anchor{2211}@anchor{using/windows windows-embeddable}@anchor{21fa}
@subsection 내장 가능한 패키지



Added in version 3.5.


내장된 배포는 최소 파이썬 환경을 포함하는 ZIP 파일입니다. 최종 사용자가 직접 액세스하기보다는, 다른 응용 프로그램의 일부로 작동하기 위한 것입니다.

To install an embedded distribution, we recommend using @code{py install} with the
@code{--target} option:

@example
$> py install 3.14-embed --target=<directory>
@end example

When extracted, the embedded distribution is (almost) fully isolated from the
user’s system, including environment variables, system registry settings, and
installed packages. The standard library is included as pre-compiled and
optimized @code{.pyc} files in a ZIP, and @code{python3.dll}, @code{python313.dll},
@code{python.exe} and @code{pythonw.exe} are all provided. Tcl/tk (including all
dependents, such as Idle), pip and the Python documentation are not included.

A default @code{._pth} file is included, which further restricts the default search
paths (as described below in @ref{e19,,모듈 찾기}). This file is
intended for embedders to modify as necessary.

제삼자 패키지는 내장된 배포와 함께 응용 프로그램 설치 프로그램이 설치해야 합니다. 일반 파이썬 설치처럼 종속성을 관리하기 위해 pip를 사용하는 것은 이 배포에서 지원되지 않지만, 주의를 기울이면 자동 업데이트를 위해 pip를 포함하고 사용할 수 있습니다. 일반적으로, 제삼자 패키지는 개발자가 사용자에게 업데이트를 제공하기 전에 최신 버전과의 호환성을 보장할 수 있도록 응용 프로그램의 일부로 처리되어야 합니다 (“벤더링(vendoring)”).

이 배포에 권장되는 두 가지 사용 사례가 아래에 설명되어 있습니다.

@menu
* Python application:: 
* 파이썬 내장하기:: 

@end menu

@node Python application,파이썬 내장하기,,내장 가능한 패키지
@anchor{using/windows python-application}@anchor{2212}
@subsubsection Python application


파이썬으로 작성된 응용 프로그램이 반드시 사용자가 그 사실을 인식하도록 할 필요는 없습니다. 이 경우 내장된 배포를 사용하여 설치 패키지에 파이썬의 내부 버전을 포함할 수 있습니다. 얼마나 투명해야 하는지(또는 반대로, 얼마나 전문적으로 보여야 하는지)에 따라, 두 가지 옵션이 있습니다.

특수 실행 파일을 런처로 사용하려면 약간의 코딩이 필요하지만, 사용자에게 가장 투명한 경험을 제공합니다. 사용자 정의된 런처를 사용하면, 프로그램이 파이썬에서 실행되고 있다는 명백한 표시가 없습니다: 아이콘을 사용자 정의하고, 회사와 버전 정보를 지정할 수 있으며 파일 연결이 제대로 작동합니다. 대부분의 경우, 사용자 정의 런처는 하드 코딩된 명령 줄을 사용하여 @code{Py_Main}을 호출할 수 있어야 합니다.

더 간단한 방법은 필요한 명령 줄 인자를 사용하여 @code{python.exe}나 @code{pythonw.exe}를 직접 호출하는 배치 파일이나 생성된 바로 가기를 제공하는 것입니다. 이 경우, 응용 프로그램은 실제 이름이 아닌 파이썬으로 표시되며, 사용자는 실행 중인 다른 파이썬 프로세스나 파일 연결과 구별하는 데 어려움을 겪을 수 있습니다.

후자의 접근 방식에서는, 패키지를 파이썬 실행 파일과 함께 디렉터리로 설치하여 경로에서 사용할 수 있도록 해야 합니다. 특수 런처를 사용하면, 응용 프로그램을 시작하기 전에 검색 경로를 지정할 수 있어서 패키지를 다른 위치에 배치할 수 있습니다.

@node 파이썬 내장하기,,Python application,내장 가능한 패키지
@anchor{using/windows embedding-python}@anchor{2213}
@subsubsection 파이썬 내장하기


네이티브 코드로 작성된 응용 프로그램에는 종종 어떤 형태의 스크립팅 언어가 필요하며, 내장된 파이썬 배포를 이러한 목적으로 사용할 수 있습니다. 일반적으로, 대부분의 응용 프로그램은 네이티브 코드로 되어 있으며, 일부가 @code{python.exe}를 호출하거나 @code{python3.dll}을 직접 사용합니다. 두 경우 모두, 내장된 배포를 응용 프로그램 설치의 하위 디렉터리로 추출하면 로드할 수 있는 파이썬 인터프리터를 제공하기에 충분합니다.

응용 프로그램 사용과 마찬가지로, 인터프리터를 초기화하기 전에 검색 경로를 지정할 기회가 있어서 패키지를 임의의 위치에 설치할 수 있습니다. 그 외에는, 내장된 배포와 일반 설치를 사용하는 것 간에 근본적인 차이점은 없습니다.

@node nuget org 패키지,대체 번들,내장 가능한 패키지,윈도우에서 파이썬 사용하기
@anchor{using/windows the-nuget-org-packages}@anchor{2214}@anchor{using/windows windows-nuget}@anchor{21f9}
@subsection nuget.org 패키지



Added in version 3.5.2.


nuget.org 패키지는 시스템 전체에 파이썬이 설치되지 않은 지속적인 통합과 빌드 시스템에 사용하기 위한 축소된 크기의 파이썬 환경입니다. 너겟은 “.NET 용 패키지 관리자”이지만, 빌드 타임 도구가 포함된 패키지에서도 완벽하게 작동합니다.

너겟 사용에 대한 최신 정보를 보려면 nuget.org@footnote{https://www.nuget.org/}를 방문하십시오. 다음은 파이썬 개발자에게 충분한 요약입니다.

@code{nuget.exe} 명령 줄 도구는, 예를 들어 curl이나 PowerShell을 사용하여 @code{https://aka.ms/nugetclidl}에서 직접 다운로드할 수 있습니다. 이 도구를 사용하면 다음과 같이 64비트나 32비트 컴퓨터용 파이썬의 최신 버전이 설치됩니다:

@example
nuget.exe install python -ExcludeVersion -OutputDirectory .
nuget.exe install pythonx86 -ExcludeVersion -OutputDirectory .
@end example

특정 버전을 선택하려면, @code{-Version 3.x.y}를 추가하십시오. 출력 디렉터리는 @code{.}에서 변경될 수 있으며, 패키지는 하위 디렉터리에 설치됩니다. 기본적으로, 하위 디렉터리의 이름은 패키지와 같으며, @code{-ExcludeVersion} 옵션이 없으면 이 이름에 설치된 특정 버전이 포함됩니다. 하위 디렉터리에는 파이썬 설치가 포함된 @code{tools} 디렉터리가 있습니다:

@example
# -ExcludeVersion 없이
> .\python.3.5.2\tools\python.exe -V
Python 3.5.2

# -ExcludeVersion 포함
> .\python\tools\python.exe -V
Python 3.5.2
@end example

일반적으로, 너겟 패키지는 업그레이드할 수 없으며, 최신 버전을 나란히 설치하고 전체 경로를 사용하여 참조해야 합니다. 또는, 패키지 디렉터리를 수동으로 삭제하고 다시 설치하십시오. 많은 CI 시스템은 빌드 간에 파일을 보존하지 않으면 이 작업을 자동으로 수행합니다.

@code{tools} 디렉터리와 함께 @code{build\native} 디렉터리가 있습니다. 여기에는 파이썬 설치를 참조하기 위해 C++ 프로젝트에서 사용할 수 있는 MSBuild 속성 파일 @code{python.props}가 포함되어 있습니다. 설정을 포함하면 빌드에서 자동으로 헤더와 임포트 라이브러리를 사용합니다.

nuget.org의 패키지 정보 페이지는 64비트 버전의 경우 www.nuget.org/packages/python@footnote{https://www.nuget.org/packages/python}, 32비트 버전의 경우 www.nuget.org/packages/pythonx86@footnote{https://www.nuget.org/packages/pythonx86} 그리고 ARM64 버전의 경우 www.nuget.org/packages/pythonarm64@footnote{https://www.nuget.org/packages/pythonarm64}입니다.

@menu
* 자유 스레드 패키지:: 

@end menu

@node 자유 스레드 패키지,,,nuget org 패키지
@anchor{using/windows free-threaded-packages}@anchor{2215}
@subsubsection 자유 스레드 패키지



Added in version 3.13.


Packages containing free-threaded binaries are named
python-freethreaded@footnote{https://www.nuget.org/packages/python-freethreaded}
for the 64-bit version, pythonx86-freethreaded@footnote{https://www.nuget.org/packages/pythonx86-freethreaded} for the 32-bit
version, and pythonarm64-freethreaded@footnote{https://www.nuget.org/packages/pythonarm64-freethreaded} for the ARM64
version. These packages contain both the @code{python3.13t.exe} and
@code{python.exe} entry points, both of which run free threaded.

@node 대체 번들,Supported Windows versions,nuget org 패키지,윈도우에서 파이썬 사용하기
@anchor{using/windows alternative-bundles}@anchor{2216}
@subsection 대체 번들


표준 CPython 배포 외에도, 추가 기능을 포함하는 수정된 패키지가 있습니다. 다음은 많이 사용되는 버전과 주요 기능 목록입니다:


@table @asis

@item ActivePython@footnote{https://www.activestate.com/products/python/}

다중 플랫폼 호환성, 설명서, PyWin32가 있는 설치 프로그램

@item Anaconda@footnote{https://www.anaconda.com/download/}

인기 있는 과학 모듈(가령 numpy, scipy 및 pandas)과 @code{conda} 패키지 관리자.

@item Enthought Deployment Manager@footnote{https://assets.enthought.com/downloads/edm/}

“The Next Generation Python Environment and Package Manager”.

Previously Enthought provided Canopy, but it reached end of life in 2016@footnote{https://support.enthought.com/hc/en-us/articles/360038600051-Canopy-GUI-end-of-life-transition-to-the-Enthought-Deployment-Manager-EDM-and-Visual-Studio-Code}.

@item WinPython@footnote{https://winpython.github.io/}

사전 빌드된 과학 패키지와 패키지 빌드를 위한 도구가 포함된 윈도우 전용 배포.
@end table

이러한 패키지들은 최신 버전의 파이썬이나 기타 라이브러리를 포함하지 않을 수 있으며, 핵심 파이썬 팀에서 유지 관리하거나 지원하지 않음에 유의하십시오.

@node Supported Windows versions,Removing the MAX_PATH limitation,대체 번들,윈도우에서 파이썬 사용하기
@anchor{using/windows supported-windows-versions}@anchor{2217}
@subsection Supported Windows versions


As specified in 
@geindex Python 향상 제안; PEP 11
PEP 11@footnote{https://peps.python.org/pep-0011/}, a Python release only supports a Windows platform
while Microsoft considers the platform under extended support. This means that
Python 3.14 supports Windows 10 and newer. If you require Windows 7
support, please install Python 3.8. If you require Windows 8.1 support,
please install Python 3.12.

@node Removing the MAX_PATH limitation,UTF-8 모드,Supported Windows versions,윈도우에서 파이썬 사용하기
@anchor{using/windows max-path}@anchor{e3a}@anchor{using/windows removing-the-max-path-limitation}@anchor{2218}
@subsection Removing the MAX_PATH limitation


윈도우는 역사적으로 경로 길이를 260자로 제한했습니다. 이는 이보다 긴 경로는 결정(resolve)되지 않고 에러가 발생함을 의미합니다.

In the latest versions of Windows, this limitation can be expanded to over
32,000 characters. Your administrator will need to activate the “Enable Win32
long paths” group policy, or set @code{LongPathsEnabled} to @code{1} in the registry
key @code{HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem}.

이는 @ref{316,,open()} 함수, @ref{a5,,os} 모듈 및 대부분의 다른 경로 기능이 260자보다 긴 경로를 받아들이고 반환할 수 있도록 합니다.

After changing the above option and rebooting, no further configuration is
required.

@node UTF-8 모드,모듈 찾기,Removing the MAX_PATH limitation,윈도우에서 파이썬 사용하기
@anchor{using/windows utf-8-mode}@anchor{2219}@anchor{using/windows win-utf8-mode}@anchor{221a}
@subsection UTF-8 모드



Added in version 3.7.


윈도우는 여전히 시스템 인코딩에 레거시 인코딩을 사용합니다 (ANSI 코드 페이지). 파이썬은 이를 텍스트 파일의 기본 인코딩에 이를 사용합니다 (예를 들어 @ref{329,,locale.getencoding()}).

UTF-8은 인터넷과 WSL(Windows Subsystem for Linux)을 포함한 대부분의 유닉스 시스템에서 널리 사용되기 때문에 문제가 발생할 수 있습니다.

@ref{865,,파이썬 UTF-8 모드}를 사용하여 기본 텍스트 인코딩을 UTF-8로 변경할 수 있습니다. @code{-X utf8} 명령 줄 옵션이나 @code{PYTHONUTF8=1} 환경 변수를 통해 @ref{865,,파이썬 UTF-8 모드}를 활성화할 수 있습니다. UTF-8 모드를 활성화하려면 
@geindex PYTHONUTF8
@geindex 환경 변수; PYTHONUTF8
@ref{cce,,PYTHONUTF8}을, 환경 변수를 수정하는 방법은 @ref{1fc6,,Python install manager}를 참조하십시오.

When the @ref{865,,Python UTF-8 Mode} is enabled, you can still use the
system encoding (the ANSI Code Page) via the “mbcs” codec.

기본 환경 변수에 @code{PYTHONUTF8=1}을 추가하면 시스템의 모든 파이썬 3.7+ 응용 프로그램에 영향을 줍니다. 레거시 시스템 인코딩에 의존하는 파이썬 3.7+ 응용 프로그램이 있으면 환경 변수를 임시로 설정하거나 @code{-X utf8} 명령 줄 옵션을 사용하는 것이 좋습니다.

@cartouche
@quotation 참고 
UTF-8 모드가 비활성화된 경우에도, 파이썬은 윈도우에서 기본적으로 다음을 위해 UTF-8을 사용합니다:


@itemize *

@item 
표준 I/O를 포함한 콘솔 I/O (자세한 내용은 
@geindex Python 향상 제안; PEP 528
PEP 528@footnote{https://peps.python.org/pep-0528/}을 참조하십시오).

@item 
@ref{75c,,파일 시스템 인코딩} (자세한 내용은 
@geindex Python 향상 제안; PEP 529
PEP 529@footnote{https://peps.python.org/pep-0529/}를 참조하십시오).
@end itemize
@end quotation
@end cartouche

@node 모듈 찾기,추가 모듈,UTF-8 모드,윈도우에서 파이썬 사용하기
@anchor{using/windows finding-modules}@anchor{221b}@anchor{using/windows windows-finding-modules}@anchor{e19}
@subsection 모듈 찾기


These notes supplement the description at @ref{18dd,,The initialization of the sys.path module search path} with
detailed Windows notes.

@code{._pth} 파일이 없을 때, 윈도우에서 @ref{3e4,,sys.path}를 채우는 방법은 다음과 같습니다:


@itemize *

@item 
시작에 현재 디렉터리에 해당하는 빈 항목이 추가됩니다.

@item 
@ref{806,,환경 변수}에 설명된 대로, 환경 변수 
@geindex PYTHONPATH
@geindex 환경 변수; PYTHONPATH
@ref{121c,,PYTHONPATH}가 존재하면, 해당 항목이 다음에 추가됩니다. 윈도우에서, 이 변수의 경로는 드라이브 식별자(@code{C:\} 등)에 사용되는 콜론과 구별하기 위해 세미콜론으로 구분되어야 합니다.

@item 
추가 “응용 프로그램 경로”는 @code{HKEY_CURRENT_USER}와 @code{HKEY_LOCAL_MACHINE} 하이브 모두의 아래에 @code{\SOFTWARE\Python\PythonCore@{version@}\PythonPath}의 하위 키로 레지스트리에 추가될 수 있습니다. 세미콜론으로 구분된 경로 문자열을 기본값으로 사용하는 하위 키는 각 경로가 @ref{3e4,,sys.path}에 추가되도록 합니다. (알려진 모든 설치 프로그램은 HKLM 만 사용하므로, HKCU는 일반적으로 비어 있음에 유의하십시오.)

@item 
환경 변수 
@geindex PYTHONHOME
@geindex 환경 변수; PYTHONHOME
@ref{3f0,,PYTHONHOME}이 설정되면, “파이썬 홈”으로 간주합니다. 그렇지 않으면, 메인 파이썬 실행 파일의 경로를 사용하여 “랜드마크 파일”(@code{Lib\os.py}나 @code{pythonXY.zip})을 찾아 “파이썬 홈”을 추론합니다. 파이썬 홈이 발견되면, @ref{3e4,,sys.path}에 추가되는 관련 하위 디렉터리(@code{Lib}, @code{plat-win} 등)는 해당 폴더를 기반으로 합니다. 그렇지 않으면, 핵심 파이썬 경로가 레지스트리에 저장된 PythonPath에서 구성됩니다.

@item 
파이썬 홈을 찾을 수 없고, 환경에 
@geindex PYTHONPATH
@geindex 환경 변수; PYTHONPATH
@ref{121c,,PYTHONPATH}가 지정되어 있지 않고, 레지스트리 항목을 찾을 수 없으면, 상대 항목의 기본 경로(예를 들어 @code{.\Lib;.\plat-win} 등)가 사용됩니다.
@end itemize

@code{pyvenv.cfg} 파일이 메인 실행 파일과 함께 또는 실행 파일보다 한 수준 위의 디렉터리에서 발견되면, 다음 변형이 적용됩니다:


@itemize *

@item 
@code{home}이 절대 경로이고 
@geindex PYTHONHOME
@geindex 환경 변수; PYTHONHOME
@ref{3f0,,PYTHONHOME}이 설정되지 않으면, 홈 위치를 추론할 때 메인 실행 파일에 대한 경로 대신 이 경로가 사용됩니다.
@end itemize

이 모든 것의 최종 결과는 다음과 같습니다:


@itemize *

@item 
@code{python.exe} 또는 기본 파이썬 디렉터리 (설치된 버전 또는 PCbuild 디렉터리에서 직접)에서 다른 .exe를 실행할 때 핵심 경로가 추론되고 레지스트리의 핵심 경로가 무시됩니다. 레지스트리의 다른 “응용 프로그램 경로”는 항상 읽습니다.

@item 
파이썬이 다른 .exe(다른 디렉터리, COM을 통한 내장, 등)에서 호스팅 될 때, “파이썬 홈”이 추론되지 않아서, 레지스트리의 핵심 경로가 사용됩니다. 레지스트리의 다른 “응용 프로그램 경로”는 항상 읽힙니다.

@item 
파이썬이 홈을 찾을 수 없고 레지스트리 값이 없으면 (고정된(frozen) .exe, 아주 이상한 설치 설정), 일부 기본 (하지만 상대) 경로를 얻게 됩니다.
@end itemize

파이썬을 응용 프로그램이나 배포에 번들로 포함하려는 사용자를 위해, 다음 조언은 다른 설치와의 충돌을 방지합니다:


@itemize *

@item 
포함할 디렉터리가 포함된 실행 파일과 함께 @code{._pth} 파일을 포함합니다. 이것은 레지스트리와 환경 변수에 나열된 경로를 무시하고, @code{import site}가 나열되지 않는 한 @ref{cc,,site}도 무시합니다.

@item 
여러분 자신의 실행 파일에서 @code{python3.dll}이나 @code{python37.dll}을 로드하면, @ref{3f6,,Py_InitializeFromConfig()} 전에 @ref{641,,PyConfig.module_search_paths} 를 명시적으로 설정하십시오.

@item 
응용 프로그램에서 @code{python.exe}를 시작하기 전에 
@geindex PYTHONPATH
@geindex 환경 변수; PYTHONPATH
@ref{121c,,PYTHONPATH}를 지우거나 덮어쓰고 
@geindex PYTHONHOME
@geindex 환경 변수; PYTHONHOME
@ref{3f0,,PYTHONHOME}를 설정하십시오.

@item 
이전 제안을 사용할 수 없으면 (예를 들어, 사용자가 @code{python.exe}를 직접 실행할 수 있는 배포판이면), 랜드마크 파일(@code{Lib\os.py})이 설치 디렉터리에 있도록 하십시오. (ZIP 파일 내에서는 감지되지 않지만, 대신 올바른 이름의 ZIP 파일은 감지됨에 유의하십시오.)
@end itemize

이렇게 하면 시스템 전체 설치의 파일이 응용 프로그램과 함께 번들로 제공되는 표준 라이브러리의 복사본보다 우선하지 않습니다. 그렇지 않으면, 사용자가 여러분의 응용 프로그램을 사용하는 데 문제가 발생할 수 있습니다. 다른 제안은 레지스트리의 비표준 경로와 사용자 site-packages에 여전히 취약할 수 있어서, 첫 번째 제안이 가장 좋음에 유의하십시오.


버전 3.6에서 변경: @code{._pth} 파일 지원을 추가하고 @code{pyvenv.cfg}에서 @code{applocal} 옵션을 제거합니다.



버전 3.6에서 변경: 실행 파일에 직접 인접할 때 잠재적인 랜드마크로 @code{python`XX'.zip}을 추가합니다.



버전 3.6부터 폐지됨: @code{Modules}(@code{PythonPath}가 아닙니다) 아래의 레지스트리에 지정된 모듈은 @ref{f25,,importlib.machinery.WindowsRegistryFinder} 로 임포트 할 수 있습니다. 이 파인더는 윈도우 3.6.0과 이전 버전에서 활성화되지만, 향후에는 @ref{f26,,sys.meta_path}에 명시적으로 추가해야 할 수도 있습니다.


@node 추가 모듈,윈도우에서 파이썬 컴파일하기,모듈 찾기,윈도우에서 파이썬 사용하기
@anchor{using/windows additional-modules}@anchor{221c}
@subsection 추가 모듈


파이썬이 모든 플랫폼 간에 이식성 있는 것을 목표로 하지만, 윈도우에만 고유한 기능이 있습니다. 이러한 기능을 사용하기 위한 표준 라이브러리와 외부에 있는 두 개의 모듈과 스니펫(snippets)이 존재합니다.

윈도우 특정 표준 모듈은 @ref{221d,,MS 윈도우 특정 서비스}에 설명되어 있습니다.

@menu
* PyWin32:: 
* cx_Freeze:: 

@end menu

@node PyWin32,cx_Freeze,,추가 모듈
@anchor{using/windows pywin32}@anchor{221e}
@subsubsection PyWin32


Mark Hammond의 PyWin32@footnote{https://pypi.org/project/PyWin32/} 모듈은 고급 윈도우 특정 지원을 위한 모듈 모음입니다. 여기에는 다음을 위한 유틸리티가 포함됩니다:


@itemize *

@item 
Component Object Model@footnote{https://learn.microsoft.com/windows/win32/com/component-object-model--com--portal}
(COM)

@item 
Win32 API 호출

@item 
레지스트리

@item 
이벤트 로그

@item 
Microsoft Foundation Classes@footnote{https://learn.microsoft.com/cpp/mfc/mfc-desktop-applications} (MFC) 사용자 인터페이스
@end itemize

PythonWin@footnote{https://web.archive.org/web/20060524042422/https://www.python.org/windows/pythonwin/}은 PyWin32와 함께 제공되는 샘플 MFC 응용 프로그램입니다. 디버거가 내장된 내장할 수 있는 IDE입니다.


@subsubheading 더 보기



@table @asis

@item Win32 How Do I...?@footnote{https://timgolden.me.uk/python/win32_how_do_i.html}

저자: Tim Golden

@item Python and COM@footnote{https://www.boddie.org.uk/python/COM.html}

저자: David와 Paul Boddie
@end table


@node cx_Freeze,,PyWin32,추가 모듈
@anchor{using/windows cx-freeze}@anchor{221f}
@subsubsection cx_Freeze


cx_Freeze@footnote{https://cx-freeze.readthedocs.io/en/latest/}는 파이썬 스크립트를 실행 가능한 윈도우 프로그램(@code{`*'.exe} 파일)으로 래핑합니다. 이렇게 하면, 사용자가 파이썬을 설치할 필요 없는 응용 프로그램을 배포할 수 있습니다.

@node 윈도우에서 파이썬 컴파일하기,The full installer deprecated,추가 모듈,윈도우에서 파이썬 사용하기
@anchor{using/windows compiling-python-on-windows}@anchor{2220}
@subsection 윈도우에서 파이썬 컴파일하기


CPython을 직접 컴파일하려면, 먼저 소스@footnote{https://www.python.org/downloads/source/}를 가져와야 합니다. 최신 릴리스의 소스를 다운로드하거나 최신 버전을 체크아웃@footnote{https://devguide.python.org/setup/#get-the-source-code}할 수 있습니다.

소스 트리에는 공식 파이썬 릴리스를 빌드하는 데 사용되는 컴파일러인 Microsoft Visual Studio 용 빌드 솔루션과 프로젝트 파일이 포함되어 있습니다. 이 파일들은 @code{PCbuild} 디렉터리에 있습니다.

빌드 프로세스에 대한 일반 정보는 @code{PCbuild/readme.txt}를 확인하십시오.

확장 모듈에 대해서는, @ref{2221,,윈도우에서 C와 C++ 확장 빌드하기}를 참조하십시오.

@node The full installer deprecated,Python launcher for Windows deprecated,윈도우에서 파이썬 컴파일하기,윈도우에서 파이썬 사용하기
@anchor{using/windows the-full-installer-deprecated}@anchor{2222}@anchor{using/windows windows-full}@anchor{2223}
@subsection The full installer (deprecated)



버전 3.14부터 폐지됨: This installer is deprecated since 3.14 and will not be produced for Python
3.16 or later. See @ref{21fb,,Python install manager} for the modern installer.


@menu
* 설치 단계:: 
* Removing the MAX_PATH limitation: Removing the MAX_PATH limitation<2>. 
* Installing without UI:: 
* Installing without downloading:: 
* 설치 수정하기:: 
* Installing free-threaded binaries: Installing free-threaded binaries<2>. 

@end menu

@node 설치 단계,Removing the MAX_PATH limitation<2>,,The full installer deprecated
@anchor{using/windows installation-steps}@anchor{2224}
@subsubsection 설치 단계


네 개의 파이썬 3.14 설치 프로그램을 다운로드할 수 있습니다 - 각각 32비트와 64비트 버전의 인터프리터를 지원하는 두 가지. `웹 설치 프로그램(web installer)'은 작은 초기 다운로드이며, 필요한 구성 요소를 자동으로 다운로드합니다. `오프라인 설치 프로그램(offline installer)'에는 기본 설치에 필요한 구성 요소가 포함되어 있으며 선택적 기능을 위해서만 인터넷 연결이 필요합니다. 설치 중 다운로드를 피하는 다른 방법은 @ref{2225,,Installing without downloading}를 참조하십시오.

설치 프로그램을 시작한 후, 두 가지 옵션 중 하나를 선택할 수 있습니다:

@image{python-figures/win_installer,,,,png}

“Install Now”를 선택하면:


@itemize *

@item 
관리자(administrator)일 필요는 `없습니다' (C 런타임 라이브러리에 대한 시스템 업데이트가 필요하거나 모든 사용자를 위해 @ref{7d9,,Python install manager}를 설치하지 않는 한)

@item 
파이썬이 사용자 디렉터리에 설치됩니다

@item 
@ref{7d9,,Python install manager}는 첫 페이지 하단의 옵션에 따라 설치됩니다

@item 
표준 라이브러리, 테스트 스위트, 런처 및 pip가 설치됩니다

@item 
선택하면, 설치 디렉터리가 
@geindex PATH
@geindex 환경 변수; PATH
@code{PATH}에 추가됩니다

@item 
바로 가기는 현재 사용자에게만 표시됩니다
@end itemize

“Customize installation”을 선택하면 설치할 기능, 설치 위치 및 다른 옵션이나 설치 후 작업을 선택할 수 있습니다. 디버깅 심볼이나 바이너리를 설치하려면, 이 옵션을 사용해야 합니다.

모든 사용자 설치를 수행하려면, “Customize installation”을 선택해야 합니다. 이 경우:


@itemize *

@item 
관리자 자격 증명이나 승인을 제공해야 할 수 있습니다.

@item 
파이썬은 Program Files 디렉터리에 설치됩니다

@item 
@ref{7d9,,Python install manager}는 Windows 디렉터리에 설치됩니다

@item 
설치 중에 선택적 기능을 선택할 수 있습니다

@item 
표준 라이브러리는 바이트 코드로 사전 컴파일될 수 있습니다

@item 
선택하면, 설치 디렉터리가 시스템 
@geindex PATH
@geindex 환경 변수; PATH
@code{PATH}에 추가됩니다

@item 
모든 사용자가 바로 가기를 사용할 수 있습니다
@end itemize

@node Removing the MAX_PATH limitation<2>,Installing without UI,설치 단계,The full installer deprecated
@anchor{using/windows id2}@anchor{2226}
@subsubsection Removing the MAX_PATH limitation


윈도우는 역사적으로 경로 길이를 260자로 제한했습니다. 이는 이보다 긴 경로는 결정(resolve)되지 않고 에러가 발생함을 의미합니다.

최신 버전의 윈도우에서는, 이 제한을 약 32,000자로 확장할 수 있습니다. 관리자는 “Enable Win32 long paths” 그룹 정책을 활성화하거나, 레지스트리 키 @code{HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem}에서 @code{LongPathsEnabled}를 @code{1}로 설정해야 합니다.

이는 @ref{316,,open()} 함수, @ref{a5,,os} 모듈 및 대부분의 다른 경로 기능이 260자보다 긴 경로를 받아들이고 반환할 수 있도록 합니다.

위 옵션을 변경한 후에는, 추가 구성이 필요하지 않습니다.


버전 3.6에서 변경: 긴 경로에 대한 지원이 파이썬에서 활성화되었습니다.


@node Installing without UI,Installing without downloading,Removing the MAX_PATH limitation<2>,The full installer deprecated
@anchor{using/windows install-quiet-option}@anchor{803}@anchor{using/windows installing-without-ui}@anchor{2227}
@subsubsection Installing without UI


설치 프로그램 UI에서 사용할 수 있는 모든 옵션은 명령 줄에서도 지정할 수 있어서, 스크립팅 된 설치 프로그램이 사용자 상호 작용 없이 여러 컴퓨터에서 설치를 복제할 수 있도록 합니다. 이러한 옵션은 일부 기본값을 변경하기 위해 UI를 억제하지 않고 설정할 수도 있습니다.

The following options (found by executing the installer with @code{/?}) can be
passed into the installer:


@multitable {xxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

이름

@tab

설명

@item

/passive

@tab

to display progress without requiring user interaction

@item

/quiet

@tab

UI를 표시하지 않고 설치/제거하기

@item

/simple

@tab

사용자 정의를 방지하기

@item

/uninstall

@tab

to remove Python (without confirmation)

@item

/layout [디렉터리]

@tab

to pre-download all components

@item

/log [파일명]

@tab

to specify log files location

@end multitable


다른 모든 옵션은 @code{name=value}로 전달됩니다. 여기서 value는 일반적으로 기능을 비활성화하려면 @code{0}, 기능을 활성화하려면 @code{1} 또는 경로입니다. 사용 가능한 옵션의 전체 목록은 다음과 같습니다.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

이름

@tab

설명

@tab

기본값

@item

InstallAllUsers

@tab

시스템 전체 설치를 수행합니다.

@tab

0

@item

TargetDir

@tab

설치 디렉터리

@tab

InstallAllUsers 에 따라 선택됩니다

@item

DefaultAllUsersTargetDir

@tab

모든 사용자 설치를 위한 기본 설치 디렉터리

@tab

@code{%ProgramFiles%\Python X.Y} 또는 @code{%ProgramFiles(x86)%\Python X.Y}

@item

DefaultJustForMeTargetDir

@tab

현재 사용자 전용 설치를 위한 기본 설치 디렉터리

@tab

@code{%LocalAppData%\Programs\Python\PythonXY} 또는 @code{%LocalAppData%\Programs\Python\PythonXY-32} 또는 @code{%LocalAppData%\Programs\Python\PythonXY-64}

@item

DefaultCustomTargetDir

@tab

UI에 표시되는 기본 사용자 지정 설치 디렉터리

@tab

(비어있음)

@item

AssociateFiles

@tab

런처도 설치되었으면 파일 연결을 만듭니다.

@tab

1

@item

CompileAll

@tab

모든 @code{.py} 파일을 @code{.pyc}로 컴파일합니다.

@tab

0

@item

PrependPath

@tab

설치 및 Scripts 디렉터리를 
@geindex PATH
@geindex 환경 변수; PATH
@code{PATH}의 앞에 추가하고 @code{.PY}를 
@geindex PATHEXT
@geindex 환경 변수; PATHEXT
@code{PATHEXT}에 추가합니다.

@tab

0

@item

AppendPath

@tab

설치 및 Scripts 디렉터리를 
@geindex PATH
@geindex 환경 변수; PATH
@code{PATH}의 뒤에 추가하고 @code{.PY}를 
@geindex PATHEXT
@geindex 환경 변수; PATHEXT
@code{PATHEXT}에 추가합니다.

@tab

0

@item

Shortcuts

@tab

설치되면, 인터프리터, 설명서 및 IDLE에 대한 바로 가기를 만듭니다.

@tab

1

@item

Include_doc

@tab

파이썬 매뉴얼을 설치합니다

@tab

1

@item

Include_debug

@tab

디버그 바이너리를 설치합니다

@tab

0

@item

Include_dev

@tab

Install developer headers and
libraries. Omitting this may lead to
an unusable installation.

@tab

1

@item

Include_exe

@tab

@code{python.exe}와 관련 파일들을 설치합니다. 이를 생략하면 쓸 수 없는 설치가 될 수 있습니다.

@tab

1

@item

Include_launcher

@tab

@ref{7d9,,Python install manager}를 설치합니다.

@tab

1

@item

InstallLauncherAllUsers

@tab

Installs the launcher for all
users. Also requires
@code{Include_launcher} to be set to 1

@tab

1

@item

Include_lib

@tab

표준 라이브러리와 확장 모듈을 설치합니다. 이를 생략하면 쓸 수 없는 설치가 될 수 있습니다.

@tab

1

@item

Include_pip

@tab

번들로 제공되는 pip와 setuptools를 설치합니다

@tab

1

@item

Include_symbols

@tab

디버깅 심볼(@code{*.pdb})을 설치합니다

@tab

0

@item

Include_tcltk

@tab

Tcl/Tk 지원과 IDLE을 설치합니다

@tab

1

@item

Include_test

@tab

표준 라이브러리 테스트 스위트를 설치합니다

@tab

1

@item

Include_tools

@tab

유틸리티 스크립트를 설치합니다

@tab

1

@item

LauncherOnly

@tab

런처만 설치합니다. 이것은 대부분의 다른 옵션보다 우선합니다.

@tab

0

@item

SimpleInstall

@tab

대부분의 설치 UI를 비활성화합니다

@tab

0

@item

SimpleInstallDescription

@tab

단순화된 설치 UI를 사용할 때 표시할 사용자 정의 메시지.

@tab

(비어있음)

@end multitable


예를 들어 기본, 시스템 전체 파이썬 설치를 조용히 설치하려면, (관리자 권한 명령 프롬프트에서) 다음 명령을 사용할 수 있습니다:

@example
python-3.9.0.exe /quiet InstallAllUsers=1 PrependPath=1 Include_test=0
@end example

사용자가 테스트 스위트 없이 파이썬의 개인용 사본을 쉽게 설치할 수 있도록, 다음 명령으로 바로 가기를 제공할 수 있습니다. 이렇게 하면 단순화된 초기 페이지가 표시되고 사용자 정의가 허용되지 않습니다:

@example
python-3.9.0.exe InstallAllUsers=0 Include_launcher=0 Include_test=0
    SimpleInstall=1 SimpleInstallDescription="Just for me, no test suite."
@end example

(런처를 생략하면 파일 연결도 생략되며, 런처가 포함된 시스템 전체 설치가 있을 때, 사용자별 설치에만 권장됨에 유의하십시오.)

위에 나열된 옵션은 실행 파일과 함께 @code{unattend.xml}이라는 파일로 제공될 수도 있습니다. 이 파일은 옵션과 값 목록을 지정합니다. 값이 어트리뷰트로 제공되면, 가능한 경우 숫자로 변환됩니다. 엘리먼트 텍스트로 제공된 값은 항상 문자열로 남아 있습니다. 이 예제 파일은 이전 예제와 같은 옵션을 설정합니다:

@example
<Options>
    <Option Name="InstallAllUsers" Value="no" />
    <Option Name="Include_launcher" Value="0" />
    <Option Name="Include_test" Value="no" />
    <Option Name="SimpleInstall" Value="yes" />
    <Option Name="SimpleInstallDescription">Just for me, no test suite</Option>
</Options>
@end example

@node Installing without downloading,설치 수정하기,Installing without UI,The full installer deprecated
@anchor{using/windows install-layout-option}@anchor{2225}@anchor{using/windows installing-without-downloading}@anchor{2228}
@subsubsection Installing without downloading


파이썬의 일부 기능은 초기 설치 프로그램 다운로드에 포함되어 있지 않아서, 이러한 기능을 선택하면 인터넷 연결이 필요할 수 있습니다. 이러한 요구를 피하고자, 필요에 따라 모든 가능한 구성 요소를 내려받아 선택한 기능과 관계없이 더는 인터넷 연결이 필요하지 않은 완전한 `레이아웃'을 만들 수 있습니다. 이 다운로드는 필요한 것보다 클 수 있지만, 많은 수의 설치를 수행할 경우 로컬로 캐시 된 사본을 보유하는 것이 매우 유용합니다.

가능한 모든 파일을 다운로드하려면 명령 프롬프트에서 다음 명령을 실행하십시오. @code{python-3.9.0.exe}를 설치 프로그램의 실제 이름으로 대체하고, 같은 이름을 가진 파일 간의 충돌을 방지하기 위해 자체 디렉터리에 레이아웃을 만들어야 합니다.

@example
python-3.9.0.exe /layout [선택적 대상 디렉터리]
@end example

@code{/quiet} 옵션을 지정하여 진행률 표시를 숨길 수도 있습니다.

@node 설치 수정하기,Installing free-threaded binaries<2>,Installing without downloading,The full installer deprecated
@anchor{using/windows modifying-an-install}@anchor{2229}
@subsubsection 설치 수정하기


일단 파이썬이 설치되면, 윈도우의 일부인 Programs and Features 도구를 통해 기능을 추가하거나 제거할 수 있습니다. Python 항목을 선택하고 “Uninstall/Change”를 선택하여 유지 관리 모드로 설치 프로그램을 엽니다.

“Modify”는 체크 박스를 수정하여 기능을 추가하거나 제거하도록 합니다 - 변경되지 않은 체크 박스는 아무것도 설치하거나 제거하지 않습니다. 이 모드에서는 설치 디렉터리와 같은 일부 옵션을 변경할 수 없습니다; 이를 수정하려면 파이썬을 완전히 제거한 다음 다시 설치해야 합니다.

“Repair”는 현재 설정을 사용하여 설치되어야 하는 모든 파일을 확인하고 제거되거나 수정된 파일을 대체합니다.

“Uninstall”은 파이썬을 완전히 제거하는데, Programs and Features에 자체 항목이 있는 @ref{7d9,,Python install manager}는 제외합니다.

@node Installing free-threaded binaries<2>,,설치 수정하기,The full installer deprecated
@anchor{using/windows id3}@anchor{222a}
@subsubsection Installing free-threaded binaries



Added in version 3.13.


To install pre-built binaries with free-threading enabled (see 
@geindex Python 향상 제안; PEP 703
PEP 703@footnote{https://peps.python.org/pep-0703/}), you
should select “Customize installation”. The second page of options includes the
“Download free-threaded binaries” checkbox.

@image{python-figures/win_install_freethreaded,,,,png}

Selecting this option will download and install additional binaries to the same
location as the main Python install. The main executable is called
@code{python3.13t.exe}, and other binaries either receive a @code{t} suffix or a full
ABI suffix. Python source files and bundled third-party dependencies are shared
with the main install.

The free-threaded version is registered as a regular Python install with the
tag @code{3.13t} (with a @code{-32} or @code{-arm64} suffix as normal for those
platforms). This allows tools to discover it, and for the @ref{7d9,,Python install manager} to
support @code{py.exe -3.13t}. Note that the launcher will interpret @code{py.exe -3}
(or a @code{python3} shebang) as “the latest 3.x install”, which will prefer the
free-threaded binaries over the regular ones, while @code{py.exe -3.13} will not.
If you use the short style of option, you may prefer to not install the
free-threaded binaries at this time.

To specify the install option at the command line, use
@code{Include_freethreaded=1}. See @ref{2225,,Installing without downloading} for instructions on
pre-emptively downloading the additional binaries for offline install. The
options to include debug symbols and binaries also apply to the free-threaded
builds.

Free-threaded binaries are also available @ref{21f9,,on nuget.org}.

@node Python launcher for Windows deprecated,,The full installer deprecated,윈도우에서 파이썬 사용하기
@anchor{using/windows python-launcher-for-windows-deprecated}@anchor{222b}
@subsection Python launcher for Windows (deprecated)



버전 3.14부터 폐지됨: The launcher and this documentation have been superseded by the Python
Install Manager described above. This is preserved temporarily for historical
interest.



Added in version 3.3.


윈도우 용 파이썬 런처는 다양한 파이썬 버전을 찾고 실행하는 데 도움이 되는 유틸리티입니다. 스크립트(또는 명령 줄)가 특정 파이썬 버전에 대한 선호를 나타내도록 허용하고, 해당 버전을 찾아 실행합니다.

@geindex PATH
@geindex 환경 변수; PATH
@code{PATH} 변수와 달리, 런처는 가장 적합한 파이썬 버전을 올바르게 선택합니다. 시스템 전체 설치보다 사용자별 설치를 선호하며, 가장 최근에 설치된 버전을 사용하기보다 언어 버전별로 순서를 매깁니다.

런처는 원래 
@geindex Python 향상 제안; PEP 397
PEP 397@footnote{https://peps.python.org/pep-0397/}에서 지정되었습니다.

@menu
* 시작하기:: 
* Shebang lines: Shebang lines<2>. 
* 셔뱅 줄의 인자:: 
* 사용자 정의:: 
* 진단:: 
* Dry run:: 
* 필요 시 설치:: 
* Return codes:: 

@end menu

@node 시작하기,Shebang lines<2>,,Python launcher for Windows deprecated
@anchor{using/windows getting-started}@anchor{222c}
@subsubsection 시작하기


@menu
* 명령 줄에서:: 
* 가상 환경:: 
* 스크립트에서:: 
* 파일 연결에서:: 

@end menu

@node 명령 줄에서,가상 환경,,시작하기
@anchor{using/windows from-the-command-line}@anchor{222d}
@subsubsection 명령 줄에서



버전 3.6에서 변경.


시스템 전체에 파이썬 3.3 이상을 설치하면 
@geindex PATH
@geindex 환경 변수; PATH
@code{PATH}에 런처를 넣습니다. 런처는 사용 가능한 모든 파이썬 버전과 호환되므로, 어떤 버전이 설치되어 있는지는 중요하지 않습니다. 런처를 사용할 수 있는지 확인하려면, 명령 프롬프트에서 다음 명령을 실행하십시오:

@example
py
@end example

설치한 최신 버전의 파이썬이 시작되어야 합니다 - 정상적으로 종료할 수 있으며, 지정된 추가 명령 줄 인자가 파이썬으로 직접 전송됩니다.

여러 버전의 파이썬이 설치되어있으면 (예를 들어, 3.7과 3.14) 파이썬 3.14 시작되는 것을 알 수 있을 겁니다 - 파이썬 3.7을 시작하려면, 다음 명령을 시도하십시오:

@example
py -3.7
@end example

설치한 파이썬 2의 최신 버전을 원하면, 다음 명령을 시도하십시오:

@example
py -2
@end example

다음 에러가 표시되면, 런처가 설치되지 않은 것입니다:

@example
'py' is not recognized as an internal or external command,
operable program or batch file.
@end example

명령:

@example
py --list
@end example

displays the currently installed version(s) of Python.

The @code{-x.y} argument is the short form of the @code{-V:Company/Tag} argument,
which allows selecting a specific Python runtime, including those that may have
come from somewhere other than python.org. Any runtime registered by following
@geindex Python 향상 제안; PEP 514
PEP 514@footnote{https://peps.python.org/pep-0514/} will be discoverable. The @code{--list} command lists all available
runtimes using the @code{-V:} format.

When using the @code{-V:} argument, specifying the Company will limit selection to
runtimes from that provider, while specifying only the Tag will select from all
providers. Note that omitting the slash implies a tag:

@example
# '3.*' 태그가 지정된 런타임을 선택합니다
py -V:3

# 'PythonCore' 에서 출시된 런타임을 선택합니다
py -V:PythonCore/

# PythonCore 의 최신 파이썬 3 런타임을 선택합니다
py -V:PythonCore/3
@end example

The short form of the argument (@code{-3}) only ever selects from core Python
releases, and not other distributions. However, the longer form (@code{-V:3}) will
select from any.

The Company is matched on the full string, case-insensitive. The Tag is matched
on either the full string, or a prefix, provided the next character is a dot or a
hyphen. This allows @code{-V:3.1} to match @code{3.1-32}, but not @code{3.10}. Tags are
sorted using numerical ordering (@code{3.10} is newer than @code{3.1}), but are
compared using text (@code{-V:3.01} does not match @code{3.1}).

@node 가상 환경,스크립트에서,명령 줄에서,시작하기
@anchor{using/windows virtual-environments}@anchor{222e}
@subsubsection 가상 환경



Added in version 3.5.


런처가 명시적인 파이썬 버전 지정 없이 실행되고, 가상 환경(표준 라이브러리 @ref{117,,venv} 모듈이나 외부 @code{virtualenv} 도구로 생성된)이 활성화되었으면, 런처는 전역 인터프리터가 아닌 가상 환경의 인터프리터를 실행합니다. 전역 인터프리터를 실행하려면 가상 환경을 비활성화하거나, 전역 파이썬 버전을 명시적으로 지정하십시오.

@node 스크립트에서,파일 연결에서,가상 환경,시작하기
@anchor{using/windows from-a-script}@anchor{222f}
@subsubsection 스크립트에서


테스트 파이썬 스크립트를 만들어 봅시다 - 다음 내용으로 @code{hello.py}라는 파일을 만듭니다.

@example
#! python
import sys
sys.stdout.write("hello from Python %s\n" % (sys.version,))
@end example

hello.py가 있는 디렉터리에서, 다음 명령을 실행합니다:

@example
py hello.py
@end example

최신 파이썬 2.x 설치의 버전 번호가 인쇄됨을 알 수 있습니다. 이제 첫 번째 줄을 다음과 같이 변경합니다:

@example
#! python3
@end example

명령을 다시 실행하면 이제 최신 파이썬 3.x 정보가 인쇄됩니다. 위의 명령 줄 예제와 마찬가지로, 더 명시적인 버전 한정자를 지정할 수 있습니다. 파이썬 3.7이 설치되어 있다고 가정하고, 첫 번째 줄을 @code{#! python3.7}으로 변경하면 3.7 버전 정보가 인쇄됩니다.

대화 형 사용과 달리, 장식 없는 “python”은 설치된 파이썬 2.x의 최신 버전을 사용합니다. 이는 이전 버전과의 호환성과 유닉스와의 호환성을 위한 것입니다, 여기서 @code{python} 명령은 일반적으로 파이썬 2를 참조합니다.

@node 파일 연결에서,,스크립트에서,시작하기
@anchor{using/windows from-file-associations}@anchor{2230}
@subsubsection 파일 연결에서


런처는 설치 시 파이썬 파일(즉 @code{.py}, @code{.pyw}, @code{.pyc} 파일)과 연결되어 있어야 합니다. 즉, 윈도우 탐색기에서 이러한 파일 중 하나를 더블 클릭하면 런처가 사용되므로, 위에서 설명한 것과 같은 기능을 사용하여 스크립트에서 사용해야 하는 버전을 지정할 수 있습니다.

이것의 주요 이점은 첫 번째 줄의 내용에 따라 단일 런처가 동시에 여러 파이썬 버전을 지원할 수 있다는 것입니다.

@node Shebang lines<2>,셔뱅 줄의 인자,시작하기,Python launcher for Windows deprecated
@anchor{using/windows id4}@anchor{2231}
@subsubsection Shebang lines


스크립트 파일의 첫 번째 줄이 @code{#!}로 시작하면 “셔뱅(shebang)”줄이라고 합니다. 리눅스와 기타 유닉스 류 운영 체제는 이러한 줄을 기본적으로 지원하며 스크립트 실행 방법을 나타내기 위해 이러한 시스템에서 일반적으로 사용됩니다. 이 런처를 사용하면 윈도우에서 파이썬 스크립트로 같은 기능을 사용할 수 있으며 위의 예제는 그 사용법을 보여줍니다.

파이썬 스크립트의 셔뱅 줄을 유닉스와 윈도우 간에 이식성 있도록 하기 위해, 이 런처는 사용할 인터프리터를 지정하는 여러 ‘가상’ 명령을 지원합니다. 지원되는 가상 명령은 다음과 같습니다:


@itemize *

@item 
@code{/usr/bin/env}

@item 
@code{/usr/bin/python}

@item 
@code{/usr/local/bin/python}

@item 
@code{python}
@end itemize

예를 들어, 스크립트의 첫 번째 줄이 다음과 같이 시작하면

@example
#! /usr/bin/python
@end example

기본 파이썬이나 활성 가상 환경을 찾아서 사용합니다. 유닉스에서 작동하도록 작성된 많은 파이썬 스크립트에는 이미 이 줄이 있어서, 수정하지 않고도 이러한 스크립트를 런처에서 사용할 수 있습니다. 윈도우에서 유닉스에서 유용할 새 스크립트를 작성하면, @code{/usr}로 시작하는 셔뱅 줄 중 하나를 사용해야 합니다.

위의 모든 가상 명령은 명시적 버전(주 버전 만 또는 주 버전과 부 버전)으로 접미사를 붙일 수 있습니다. 또한 부 버전 뒤에 “-32”를 추가하여 32비트 버전을 요청할 수 있습니다. 즉 @code{/usr/bin/python3.7-32}는 32비트 파이썬 3.7의 사용을 요청합니다. 가상 환경이 활성화되어 있다면, 버전은 무시되고 환경이 사용됩니다.


Added in version 3.7: 파이썬 런처 3.7부터는 “-64” 접미사로 64비트 버전을 요청할 수 있습니다. 또한 부 버전 없이 주 버전과 아키텍처를 지정할 수 있습니다 (즉 @code{/usr/bin/python3-64}).



버전 3.11에서 변경: The “-64” suffix is deprecated, and now implies “any architecture that is
not provably i386/32-bit”. To request a specific environment, use the new
@code{-V:@var{TAG}} argument with the complete tag.



버전 3.13에서 변경: Virtual commands referencing @code{python} now prefer an active virtual
environment rather than searching 
@geindex PATH
@geindex 환경 변수; PATH
@code{PATH}. This handles cases where
the shebang specifies @code{/usr/bin/env python3} but @code{python3.exe} is
not present in the active environment.


The @code{/usr/bin/env} form of shebang line has one further special property.
Before looking for installed Python interpreters, this form will search the
executable 
@geindex PATH
@geindex 환경 변수; PATH
@code{PATH} for a Python executable matching the name provided
as the first argument. This corresponds to the behaviour of the Unix @code{env}
program, which performs a 
@geindex PATH
@geindex 환경 변수; PATH
@code{PATH} search.
If an executable matching the first argument after the @code{env} command cannot
be found, but the argument starts with @code{python}, it will be handled as
described for the other virtual commands.
The environment variable @code{PYLAUNCHER_NO_SEARCH_PATH} may be set
(to any value) to skip this search of 
@geindex PATH
@geindex 환경 변수; PATH
@code{PATH}.

Shebang lines that do not match any of these patterns are looked up in the
@code{[commands]} section of the launcher’s @ref{2232,,.INI file}.
This may be used to handle certain commands in a way that makes sense for your
system. The name of the command must be a single argument (no spaces in the
shebang executable), and the value substituted is the full path to the
executable (additional arguments specified in the .INI will be quoted as part
of the filename).

@example
[commands]
/bin/xpython=C:\Program Files\XPython\python.exe
@end example

Any commands not found in the .INI file are treated as `Windows' executable
paths that are absolute or relative to the directory containing the script file.
This is a convenience for Windows-only scripts, such as those generated by an
installer, since the behavior is not compatible with Unix-style shells.
These paths may be quoted, and may include multiple arguments, after which the
path to the script and any additional arguments will be appended.

@node 셔뱅 줄의 인자,사용자 정의,Shebang lines<2>,Python launcher for Windows deprecated
@anchor{using/windows arguments-in-shebang-lines}@anchor{2233}
@subsubsection 셔뱅 줄의 인자


셔뱅 줄은 또한 파이썬 인터프리터에 전달할 추가 옵션을 지정할 수 있습니다. 예를 들어, 다음과 같은 셔뱅 줄이 있으면:

@example
#! /usr/bin/python -v
@end example

파이썬은 @code{-v} 옵션으로 시작됩니다

@node 사용자 정의,진단,셔뱅 줄의 인자,Python launcher for Windows deprecated
@anchor{using/windows customization}@anchor{2234}
@subsubsection 사용자 정의


@menu
* INI 파일을 통한 사용자 정의:: 
* 기본 파이썬 버전 사용자 정의:: 

@end menu

@node INI 파일을 통한 사용자 정의,기본 파이썬 버전 사용자 정의,,사용자 정의
@anchor{using/windows customization-via-ini-files}@anchor{2235}@anchor{using/windows launcher-ini}@anchor{2232}
@subsubsection INI 파일을 통한 사용자 정의


런처는 두 개의 .ini 파일을 검색합니다 - 현재 사용자의 응용프로그램 데이터 디렉터리(@code{%LOCALAPPDATA%}나 @code{$env:LocalAppData})에 있는 @code{py.ini}와 런처와 같은 디렉터리에 있는 @code{py.ini}. 런처의 ‘콘솔’ 버전(즉 py.exe)과 ‘윈도우’ 버전(즉 pyw.exe) 모두에 같은 .ini 파일이 사용됩니다.

“응용 프로그램 디렉터리”에 지정된 사용자 정의가 실행 파일 옆에 있는 사용자 지정보다 우선하므로, 런처 옆에 있는 .ini 파일에 대한 쓰기 권한이 없는 사용자는 전역 .ini 파일에서 명령을 재정의할 수 있습니다.

@node 기본 파이썬 버전 사용자 정의,,INI 파일을 통한 사용자 정의,사용자 정의
@anchor{using/windows customizing-default-python-versions}@anchor{2236}
@subsubsection 기본 파이썬 버전 사용자 정의


때에 따라, 버전 한정자를 명령에 포함하여 명령에서 사용할 파이썬 버전을 지정할 수 있습니다. 버전 한정자는 주 버전 번호로 시작하며 선택적으로 마침표(‘.’)와 부 버전 지정자가 올 수 있습니다. 또한 “-32”나 “-64”를 추가하여 32비트나 64비트 구현을 요청할지를 지정할 수 있습니다.

예를 들어, @code{#!python}의 셔뱅 줄에는 버전 한정자가 없는 반면, @code{#!python3}에는 주 버전 만 지정하는 버전 한정자가 있습니다.

If no version qualifiers are found in a command, the environment
variable @code{PY_PYTHON} can be set to specify the default version
qualifier. If it is not set, the default is “3”. The variable can
specify any value that may be passed on the command line, such as “3”,
“3.7”, “3.7-32” or “3.7-64”. (Note that the “-64” option is only
available with the launcher included with Python 3.7 or newer.)

부 버전 한정자가 없으면, 환경 변수 @code{PY_PYTHON@{major@}}(여기서 @code{@{major@}}는 위에서 결정된 현재 주 버전 한정자입니다)를 설정하여 전체 버전을 지정할 수 있습니다. 그러한 옵션이 없으면, 런처는 설치된 파이썬 버전을 열거하고 주 버전에 대해 발견된 최신 부 릴리스를 사용합니다. 이것은 보장되지는 않지만, 해당 제품군에서 가장 최근에 설치된 버전일 가능성이 높습니다.

같은 (major.minor) 파이썬 버전의 32비트와 64비트 구현이 모두 설치된 64비트 윈도우에서는 항상 64비트 버전이 선호됩니다. 이는 32비트와 64비트 런처 구현 모두에 해당합니다 - 32비트 런처는 가능하면 지정된 버전의 64비트 파이썬 설치를 실행하는 것을 선호합니다. 따라서 런처의 동작은 PC에 설치된 버전만 알고 설치 순서와 관계없이 (즉, 32비트나 64비트 버전의 파이썬과 해당 런처가 마지막에 설치되었는지 알지 못하고) 예측할 수 있습니다). 위에서 언급했듯이, 선택적 “-32”나 “-64” 접미사를 버전 지정자에 사용하여 이 동작을 변경할 수 있습니다.

예:


@itemize *

@item 
관련 옵션이 설정되지 않으면, @code{python}과 @code{python2} 명령은 설치된 최신 파이썬 2.x 버전을 사용하고 @code{python3} 명령은 설치된 최신 파이썬 3.x를 사용합니다.

@item 
@code{python3.7} 명령은 버전이 완전히 지정되어 있어서 옵션을 전혀 참조하지 않습니다.

@item 
@code{PY_PYTHON=3}이면, @code{python}과 @code{python3} 명령은 모두 최신 설치된 파이썬 3 버전을 사용합니다.

@item 
@code{PY_PYTHON=3.7-32}이면, @code{python} 명령은 3.7의 32비트 구현을 사용하는 반면 @code{python3} 명령은 가장 최근에 설치된 파이썬을 사용합니다 (주 버전이 지정되었기 때문에 PY_PYTHON은 전혀 고려되지 않았습니다).

@item 
@code{PY_PYTHON=3}이고 @code{PY_PYTHON3=3.7}이면, @code{python}과 @code{python3} 명령은 모두 구체적으로 3.7을 사용합니다.
@end itemize

환경 변수 외에도, 런처에서 사용하는 .INI 파일에서 같은 설정을 구성할 수 있습니다. INI 파일의 섹션은 @code{[defaults]}라고 하며 키 이름은 선행 @code{PY_} 접두어가 없는 환경 변수와 같습니다 (그리고 INI 파일의 키 이름은 대소 문자를 구분하지 않음에 유의하십시오.) 환경 변수의 내용은 INI 파일에 지정된 것을 재정의합니다.

예를 들면:


@itemize *

@item 
@code{PY_PYTHON=3.7}을 설정하는 것은 다음을 포함하는 INI 파일과 동등합니다:
@end itemize

@example
[defaults]
python=3.7
@end example


@itemize *

@item 
@code{PY_PYTHON=3}과 @code{PY_PYTHON3=3.7}을 설정하는 것은 다음을 포함하는 INI 파일과 동등합니다:
@end itemize

@example
[defaults]
python=3
python3=3.7
@end example

@node 진단,Dry run,사용자 정의,Python launcher for Windows deprecated
@anchor{using/windows diagnostics}@anchor{2237}
@subsubsection 진단


If an environment variable @code{PYLAUNCHER_DEBUG} is set (to any value), the
launcher will print diagnostic information to stderr (i.e. to the console).
While this information manages to be simultaneously verbose `and' terse, it
should allow you to see what versions of Python were located, why a
particular version was chosen and the exact command-line used to execute the
target Python. It is primarily intended for testing and debugging.

@node Dry run,필요 시 설치,진단,Python launcher for Windows deprecated
@anchor{using/windows dry-run}@anchor{2238}
@subsubsection Dry run


If an environment variable @code{PYLAUNCHER_DRYRUN} is set (to any value),
the launcher will output the command it would have run, but will not actually
launch Python. This may be useful for tools that want to use the launcher to
detect and then launch Python directly. Note that the command written to
standard output is always encoded using UTF-8, and may not render correctly in
the console.

@node 필요 시 설치,Return codes,Dry run,Python launcher for Windows deprecated
@anchor{using/windows install-on-demand}@anchor{2239}
@subsubsection 필요 시 설치


If an environment variable @code{PYLAUNCHER_ALLOW_INSTALL} is set (to any
value), and the requested Python version is not installed but is available on
the Microsoft Store, the launcher will attempt to install it. This may require
user interaction to complete, and you may need to run the command again.

An additional @code{PYLAUNCHER_ALWAYS_INSTALL} variable causes the launcher
to always try to install Python, even if it is detected. This is mainly intended
for testing (and should be used with @code{PYLAUNCHER_DRYRUN}).

@node Return codes,,필요 시 설치,Python launcher for Windows deprecated
@anchor{using/windows return-codes}@anchor{223a}
@subsubsection Return codes


The following exit codes may be returned by the Python launcher. Unfortunately,
there is no way to distinguish these from the exit code of Python itself.

The names of codes are as used in the sources, and are only for reference. There
is no way to access or resolve them apart from reading this page. Entries are
listed in alphabetical order of names.


@multitable {xxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

이름

@tab

Value

@tab

설명

@item

RC_BAD_VENV_CFG

@tab

107

@tab

A @code{pyvenv.cfg} was found but is corrupt.

@item

RC_CREATE_PROCESS

@tab

101

@tab

Failed to launch Python.

@item

RC_INSTALLING

@tab

111

@tab

An install was started, but the command will
need to be re-run after it completes.

@item

RC_INTERNAL_ERROR

@tab

109

@tab

Unexpected error. Please report a bug.

@item

RC_NO_COMMANDLINE

@tab

108

@tab

Unable to obtain command line from the
operating system.

@item

RC_NO_PYTHON

@tab

103

@tab

Unable to locate the requested version.

@item

RC_NO_VENV_CFG

@tab

106

@tab

A @code{pyvenv.cfg} was required but not
found.

@end multitable


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node macOS 에서 파이썬 사용하기,Using Python on Android,윈도우에서 파이썬 사용하기,파이썬 설정 및 사용법
@anchor{using/mac doc}@anchor{223b}@anchor{using/mac translation-repo}@anchor{223c}@anchor{using/mac using-on-mac}@anchor{223d}@anchor{using/mac using-python-on-macos}@anchor{223e}
@section macOS 에서 파이썬 사용하기


This document aims to give an overview of macOS-specific behavior you should
know about to get started with Python on Mac computers.
Python on a Mac running macOS is very similar to Python on other Unix-derived platforms,
but there are some differences in installation and some features.

There are various ways to obtain and install Python for macOS.
Pre-built versions of the most recent versions of Python are available
from a number of distributors. Much of this document describes use of
the Pythons provided by the CPython release team for download from
the python.org website@footnote{https://www.python.org/downloads/}. See
@ref{223f,,Alternative Distributions} for some other options.
@anchor{using/mac getting-osx}@anchor{2240}
@menu
* python.org에서 제공하는 macOS용 파이썬 사용하기: python org에서 제공하는 macOS용 파이썬 사용하기. 
* Alternative Distributions:: 
* 추가 파이썬 패키지 설치하기:: 
* GUI 프로그래밍:: 
* Advanced Topics:: 
* 기타 자원:: 

@end menu

@node python org에서 제공하는 macOS용 파이썬 사용하기,Alternative Distributions,,macOS 에서 파이썬 사용하기
@anchor{using/mac getting-and-installing-macpython}@anchor{2241}@anchor{using/mac using-python-for-macos-from-python-org}@anchor{2242}
@subsection @code{python.org}에서 제공하는 macOS용 파이썬 사용하기


@menu
* Installation steps:: 
* 파이썬 스크립트를 실행하는 방법:: 

@end menu

@node Installation steps,파이썬 스크립트를 실행하는 방법,,python org에서 제공하는 macOS용 파이썬 사용하기
@anchor{using/mac installation-steps}@anchor{2243}
@subsubsection Installation steps


For current Python versions@footnote{https://www.python.org/downloads/}
(other than those in @code{security} status), the release team produces a
`Python for macOS' installer package for each new release.
A list of available installers
is available here@footnote{https://www.python.org/downloads/macos/}.
We recommend using the most recent supported Python version where possible.
Current installers provide a
universal2 binary@footnote{https://en.wikipedia.org/wiki/Universal_binary} build
of Python which runs natively on all Macs (Apple Silicon and Intel) that are
supported by a wide range of macOS versions,
currently typically from at least `macOS 10.15 Catalina' on.

The downloaded file is a standard macOS installer package file (@code{.pkg}).
File integrity information (checksum, size, sigstore signature, etc) for each file is included
on the release download page. Installer packages and their contents are signed and notarized
with @code{Python Software Foundation} Apple Developer ID certificates
to meet macOS Gatekeeper requirements@footnote{https://support.apple.com/en-us/102445}.

For a default installation, double-click on the downloaded installer package file.
This should launch the standard macOS Installer app and display the first of several
installer windows steps.

@image{python-figures/mac_installer_01_introduction,,,,png}

Clicking on the `Continue' button brings up the `Read Me' for this installer.
Besides other important information, the `Read Me' documents which Python version is
going to be installed and on what versions of macOS it is supported. You may need
to scroll through to read the whole file. By default, this `Read Me' will also be
installed in @code{/Applications/Python 3.14/} and available to read anytime.

@image{python-figures/mac_installer_02_readme,,,,png}

Clicking on `Continue' proceeds to display the license for Python and for
other included software. You will then need to `Agree' to the license terms
before proceeding to the next step. This license file will also be installed
and available to be read later.

@image{python-figures/mac_installer_03_license,,,,png}

After the license terms are accepted, the next step is the `Installation Type'
display. For most uses, the standard set of installation operations is appropriate.

@image{python-figures/mac_installer_04_installation_type,,,,png}

By pressing the `Customize' button, you can choose to omit or select certain package
components of the installer. Click on each package name to see a description of
what it installs.
To also install support for the optional free-threaded feature,
see @ref{499,,Installing Free-threaded Binaries}.

@image{python-figures/mac_installer_05_custom_install,,,,png}

In either case, clicking `Install' will begin the install process by asking
permission to install new software. A macOS user name with @code{Administrator} privilege
is needed as the installed Python will be available to all users of the Mac.

When the installation is complete, the `Summary' window will appear.

@image{python-figures/mac_installer_06_summary,,,,png}

Double-click on the @code{Install Certificates.command}
icon or file in the @code{/Applications/Python 3.14/} window to complete the
installation.

@image{python-figures/mac_installer_07_applications,,,,png}

This will open a temporary @code{Terminal} shell window that
will use the new Python to download and install SSL root certificates
for its use.

@image{python-figures/mac_installer_08_install_certificates,,,,png}

If @code{Successfully installed certifi} and @code{update complete} appears
in the terminal window, the installation is complete.
Close this terminal window and the installer window.

A default install will include:


@itemize *

@item 
A @code{Python 3.14} folder in your @code{Applications} folder. In here
you find @code{IDLE}, the development environment that is a standard part of official
Python distributions; and @code{Python Launcher}, which handles double-clicking Python
scripts from the macOS Finder@footnote{https://support.apple.com/en-us/HT201732}.

@item 
파이썬 실행 파일과 라이브러리를 포함하는 프레임워크 @code{/Library/Frameworks/Python.framework}. 설치기는 이 위치를 셸 경로에 추가합니다. 파이썬을 제거하려면, 이 세 가지를 지우면 됩니다. 파이썬 실행 파일에 대한 심볼릭 링크는 @code{/usr/local/bin/}에 있습니다.
@end itemize

@cartouche
@quotation 참고 
Recent versions of macOS include a @code{python3} command in @code{/usr/bin/python3}
that links to a usually older and incomplete version of Python provided by and for use by
the Apple development tools, @code{Xcode} or the @code{Command Line Tools for Xcode}.
You should never modify or attempt to delete this installation, as it is
Apple-controlled and is used by Apple-provided or third-party software.  If
you choose to install a newer Python version from @code{python.org}, you will have
two different but functional Python installations on your computer that
can co-exist. The default installer options should ensure that its @code{python3}
will be used instead of the system @code{python3}.
@end quotation
@end cartouche

@node 파이썬 스크립트를 실행하는 방법,,Installation steps,python org에서 제공하는 macOS용 파이썬 사용하기
@anchor{using/mac how-to-run-a-python-script}@anchor{2244}
@subsubsection 파이썬 스크립트를 실행하는 방법


There are two ways to invoke the Python interpreter.
If you are familiar with using a Unix shell in a terminal
window, you can invoke @code{python3.14} or @code{python3} optionally
followed by one or more command line options (described in @ref{1da4,,명령 줄과 환경}).
The Python tutorial also has a useful section on
@ref{495,,using Python interactively from a shell}.

You can also invoke the interpreter through an integrated
development environment.
@ref{1214,,IDLE — 파이썬 편집기와 셸} is a basic editor and interpreter environment
which is included with the standard distribution of Python.
@code{IDLE} includes a Help menu that allows you to access Python documentation. If you
are completely new to Python, you can read the tutorial introduction
in that document.

There are many other editors and IDEs available, see @ref{2245,,편집기와 IDE}
for more information.

To run a Python script file from the terminal window, you can
invoke the interpreter with the name of the script file:

@quotation

@code{python3.14} @code{myscript.py}
@end quotation

Finder에서 스크립트를 실행하려면, 두 가지 방법이 있습니다:


@itemize *

@item 
스크립트를 @code{Python Launcher}로 드래그하십시오.

@item 
Finder 정보 창을 통해 여러분의 스크립트(또는 모든 @code{.py} 스크립트)를 여는 기본 응용 프로그램으로 @code{Python Launcher}를 선택하고 스크립트를 더블 클릭하십시오. @code{Python Launcher}에는 스크립트를 시작하는 방법을 제어하는 다양한 설정이 있습니다. Option-드래그하면 하나의 호출에 대해 이를 변경할 수 있으며, @code{Preferences} 메뉴를 사용하여 전역적으로 변경할 수 있습니다.
@end itemize

Be aware that running the script directly from the macOS Finder might
produce different results than when running from a terminal window as
the script will not be run in the usual shell environment including
any setting of environment variables in shell profiles.
And, as with any other script or program,
be certain of what you are about to run.

@node Alternative Distributions,추가 파이썬 패키지 설치하기,python org에서 제공하는 macOS용 파이썬 사용하기,macOS 에서 파이썬 사용하기
@anchor{using/mac alternative-bundles}@anchor{223f}@anchor{using/mac alternative-distributions}@anchor{2246}
@subsection Alternative Distributions


Besides the standard @code{python.org} for macOS installer, there are third-party
distributions for macOS that may include additional functionality.
Some popular distributions and their key features:


@table @asis

@item ActivePython@footnote{https://www.activestate.com/products/python/}

Installer with multi-platform compatibility, documentation

@item Anaconda@footnote{https://www.anaconda.com/download/}

Popular scientific modules (such as numpy, scipy, and pandas) and the
@code{conda} package manager.

@item Homebrew@footnote{https://brew.sh}

Package manager for macOS including multiple versions of Python and many
third-party Python-based packages (including numpy, scipy, and pandas).

@item MacPorts@footnote{https://www.macports.org}

Another package manager for macOS including multiple versions of Python and many
third-party Python-based packages. May include pre-built versions of Python and
many packages for older versions of macOS.
@end table

Note that distributions might not include the latest versions of Python or
other libraries, and are not maintained or supported by the core Python team.

@node 추가 파이썬 패키지 설치하기,GUI 프로그래밍,Alternative Distributions,macOS 에서 파이썬 사용하기
@anchor{using/mac installing-additional-python-packages}@anchor{2247}@anchor{using/mac mac-package-manager}@anchor{2248}
@subsection 추가 파이썬 패키지 설치하기


Refer to the Python Packaging User Guide@footnote{https://packaging.python.org/en/latest/tutorials/installing-packages/} for more information.
@anchor{using/mac osx-gui-scripts}@anchor{2249}
@node GUI 프로그래밍,Advanced Topics,추가 파이썬 패키지 설치하기,macOS 에서 파이썬 사용하기
@anchor{using/mac gui-programming}@anchor{224a}@anchor{using/mac gui-programming-on-the-mac}@anchor{224b}
@subsection GUI 프로그래밍


Mac에서 파이썬으로 GUI 응용 프로그램을 작성하기 위한 몇 가지 옵션이 있습니다.

표준 파이썬 GUI 툴킷은 크로스 플랫폼 Tk 툴킷(@indicateurl{https://www.tcl.tk})을 기반으로 하는 @ref{f6,,tkinter}입니다. 설치 프로그램에는 macOS용 네이티브 버전의 Tk가 포함되어 있습니다.

`PyObjC'는 애플의 Objective-C/Cocoa 프레임워크에 대한 파이썬 바인딩입니다. PyObjC에 대한 정보는 pyobjc@footnote{https://pypi.org/project/pyobjc/} 에서 얻을 수 있습니다.

A number of alternative macOS GUI toolkits are available including:


@itemize *

@item 
PySide@footnote{https://www.qt.io/qt-for-python}: Official Python bindings to the
Qt GUI toolkit@footnote{https://wiki.qt.io/Qt_for_Python}.

@item 
PyQt@footnote{https://riverbankcomputing.com/software/pyqt/}: Alternative
Python bindings to Qt.

@item 
Kivy@footnote{https://kivy.org}: A cross-platform GUI toolkit that supports
desktop and mobile platforms.

@item 
Toga@footnote{https://toga.readthedocs.io}: Part of the BeeWare Project@footnote{https://beeware.org}; supports desktop, mobile, web and console apps.

@item 
wxPython@footnote{https://wxpython.org}: A cross-platform toolkit that
supports desktop operating systems.
@end itemize

@node Advanced Topics,기타 자원,GUI 프로그래밍,macOS 에서 파이썬 사용하기
@anchor{using/mac advanced-topics}@anchor{224c}
@subsection Advanced Topics


@menu
* Installing Free-threaded Binaries:: 
* Installing using the command line:: 
* 파이썬 응용 프로그램 배포하기:: 
* App Store Compliance:: 

@end menu

@node Installing Free-threaded Binaries,Installing using the command line,,Advanced Topics
@anchor{using/mac install-freethreaded-macos}@anchor{499}@anchor{using/mac installing-free-threaded-binaries}@anchor{224d}
@subsubsection Installing Free-threaded Binaries



Added in version 3.13.


The @code{python.org} @ref{2241,,Python for macOS}
installer package can optionally install an additional build of
Python 3.14 that supports 
@geindex Python 향상 제안; PEP 703
PEP 703@footnote{https://peps.python.org/pep-0703/}, the free-threading feature
(running with the @ref{474,,global interpreter lock} disabled).
Check the release page on @code{python.org} for possible updated information.

The free-threaded mode is working and continues to be improved, but
there is some additional overhead in single-threaded workloads compared
to the regular build. Additionally, third-party packages, in particular ones
with an @ref{224e,,extension module}, may not be ready for use in a
free-threaded build, and will re-enable the @ref{164,,GIL}.
Therefore, the support for free-threading
is not installed by default. It is packaged as a separate install option,
available by clicking the `Customize' button on the `Installation Type'
step of the installer as described above.

@image{python-figures/mac_installer_09_custom_install_free_threaded,,,,png}

If the box next to the `Free-threaded Python' package name is checked,
a separate @code{PythonT.framework} will also be installed
alongside the normal @code{Python.framework} in @code{/Library/Frameworks}.
This configuration allows a free-threaded Python 3.14 build to co-exist
on your system with a traditional (GIL only) Python 3.14 build with
minimal risk while installing or testing. This installation layout may
change in future releases.

Known cautions and limitations:


@itemize -

@item 
The `UNIX command-line tools' package, which is selected by default,
will install links in @code{/usr/local/bin} for @code{python3.14t},
the free-threaded interpreter, and @code{python3.14t-config},
a configuration utility which may be useful for package builders.
Since @code{/usr/local/bin} is typically included in your shell @code{PATH},
in most cases no changes to your @code{PATH} environment variables should
be needed to use @code{python3.14t}.

@item 
For this release, the `Shell profile updater' package and the
@code{Update Shell Profile.command} in @code{/Applications/Python 3.14/}
do not support the free-threaded package.

@item 
The free-threaded build and the traditional build have separate search
paths and separate @code{site-packages} directories so, by default,
if you need a package available in both builds, it may need to be installed in both.
The free-threaded package will install a separate instance of @code{pip} for use
with @code{python3.14t}.


@itemize -

@item 
To install a package using @code{pip} without a @code{venv}:

@example
python3.14t -m pip install <package_name>
@end example
@end itemize

@item 
When working with multiple Python environments, it is usually safest and easiest
to @ref{20e8,,create and use virtual environments}.
This can avoid possible command name conflicts and confusion about which Python is in use:

@example
python3.14t -m venv <venv_name>
@end example

then @code{activate}.

@item 
To run a free-threaded version of IDLE:

@example
python3.14t -m idlelib
@end example

@item 
The interpreters in both builds respond to the same
@ref{806,,PYTHON environment variables}
which may have unexpected results, for example, if you have @code{PYTHONPATH}
set in a shell profile. If necessary, there are
@ref{2118,,command line options} like @code{-E}
to ignore these environment variables.

@item 
The free-threaded build links to the third-party shared libraries,
such as @code{OpenSSL} and @code{Tk}, installed in the traditional framework.
This means that both builds also share one set of trust certificates
as installed by the @code{Install Certificates.command} script,
thus it only needs to be run once.

@item 
If you cannot depend on the link in @code{/usr/local/bin} pointing to the
@code{python.org} free-threaded @code{python3.14t} (for example, if you want
to install your own version there or some other distribution does),
you can explicitly set your shell @code{PATH} environment variable to
include the @code{PythonT} framework @code{bin} directory:

@example
export PATH="/Library/Frameworks/PythonT.framework/Versions/3.14/bin":"$PATH"
@end example

The traditional framework installation by default does something similar,
except for @code{Python.framework}. Be aware that having both framework @code{bin}
directories in @code{PATH} can lead to confusion if there are duplicate names
like @code{python3.14} in both; which one is actually used depends on the order
they appear in @code{PATH}. The @code{which python3.x} or @code{which python3.xt}
commands can show which path is being used. Using virtual environments
can help avoid such ambiguities. Another option might be to create
a shell @code{alias} to the desired interpreter, like:

@example
alias py3.14="/Library/Frameworks/Python.framework/Versions/3.14/bin/python3.14"
alias py3.14t="/Library/Frameworks/PythonT.framework/Versions/3.14/bin/python3.14t"
@end example
@end itemize

@node Installing using the command line,파이썬 응용 프로그램 배포하기,Installing Free-threaded Binaries,Advanced Topics
@anchor{using/mac installing-using-the-command-line}@anchor{224f}
@subsubsection Installing using the command line


If you want to use automation to install the @code{python.org} installer package
(rather than by using the familiar macOS @code{Installer} GUI app),
the macOS command line @code{installer} utility lets you select non-default
options, too. If you are not familiar with @code{installer}, it can be
somewhat cryptic (see @code{man installer} for more information).
As an example, the following shell snippet shows one way to do it,
using the @code{3.14.0b2} release and selecting the free-threaded interpreter
option:

@example
RELEASE="python-3.140b2-macos11.pkg"

# download installer pkg
curl -O https://www.python.org/ftp/python/3.14.0/$@{RELEASE@}

# create installer choicechanges to customize the install:
#    enable the PythonTFramework-3.14 package
#    while accepting the other defaults (install all other packages)
cat > ./choicechanges.plist <<EOF
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<array>
        <dict>
                <key>attributeSetting</key>
                <integer>1</integer>
                <key>choiceAttribute</key>
                <string>selected</string>
                <key>choiceIdentifier</key>
                <string>org.python.Python.PythonTFramework-3.14</string>
        </dict>
</array>
</plist>
EOF

sudo installer -pkg ./$@{RELEASE@} -applyChoiceChangesXML ./choicechanges.plist -target /
@end example

You can then test that both installer builds are now available with something like:

@example
$ # test that the free-threaded interpreter was installed if the Unix Command Tools package was enabled
$ /usr/local/bin/python3.14t -VV
Python 3.14.0b2 free-threading build (v3.14.0b2:3a83b172af, Jun  5 2024, 12:57:31) [Clang 15.0.0 (clang-1500.3.9.4)]
$ #    and the traditional interpreter
$ /usr/local/bin/python3.14 -VV
Python 3.14.0b2 (v3.14.0b2:3a83b172af, Jun  5 2024, 12:50:24) [Clang 15.0.0 (clang-1500.3.9.4)]
$ # test that they are also available without the prefix if /usr/local/bin is on $PATH
$ python3.14t -VV
Python 3.14.0b2 free-threading build (v3.14.0b2:3a83b172af, Jun  5 2024, 12:57:31) [Clang 15.0.0 (clang-1500.3.9.4)]
$ python3.14 -VV
Python 3.14.0b2 (v3.14.0b2:3a83b172af, Jun  5 2024, 12:50:24) [Clang 15.0.0 (clang-1500.3.9.4)]
@end example

@cartouche
@quotation 참고 
Current @code{python.org} installers only install to fixed locations like
@code{/Library/Frameworks/}, @code{/Applications}, and @code{/usr/local/bin}.
You cannot use the @code{installer} @code{-domain} option to install to
other locations.
@end quotation
@end cartouche

@node 파이썬 응용 프로그램 배포하기,App Store Compliance,Installing using the command line,Advanced Topics
@anchor{using/mac distributing-python-applications}@anchor{2250}@anchor{using/mac distributing-python-applications-on-the-mac}@anchor{2251}
@subsubsection 파이썬 응용 프로그램 배포하기


A range of tools exist for converting your Python code into a standalone
distributable application:


@itemize *

@item 
py2app@footnote{https://pypi.org/project/py2app/}: Supports creating macOS @code{.app}
bundles from a Python project.

@item 
Briefcase@footnote{https://briefcase.readthedocs.io}: Part of the BeeWare Project@footnote{https://beeware.org}; a cross-platform packaging tool that supports
creation of @code{.app} bundles on macOS, as well as managing signing and
notarization.

@item 
PyInstaller@footnote{https://pyinstaller.org/}: A cross-platform packaging tool that creates
a single file or folder as a distributable artifact.
@end itemize

@node App Store Compliance,,파이썬 응용 프로그램 배포하기,Advanced Topics
@anchor{using/mac app-store-compliance}@anchor{2252}
@subsubsection App Store Compliance


Apps submitted for distribution through the macOS App Store must pass Apple’s
app review process. This process includes a set of automated validation rules
that inspect the submitted application bundle for problematic code.

The Python standard library contains some code that is known to violate these
automated rules. While these violations appear to be false positives, Apple’s
review rules cannot be challenged. Therefore, it is necessary to modify the
Python standard library for an app to pass App Store review.

The Python source tree contains
a patch file@footnote{https://github.com/python/cpython/tree/3.14/Mac/Resources/app-store-compliance.patch} that will remove
all code that is known to cause issues with the App Store review process. This
patch is applied automatically when CPython is configured with the
@ref{1998,,--with-app-store-compliance} option.

This patch is not normally required to use CPython on a Mac; nor is it required
if you are distributing an app `outside' the macOS App Store. It is `only'
required if you are using the macOS App Store as a distribution channel.

@node 기타 자원,,Advanced Topics,macOS 에서 파이썬 사용하기
@anchor{using/mac other-resources}@anchor{2253}
@subsection 기타 자원


The python.org Help page@footnote{https://www.python.org/about/help/} has links to many useful resources.
The Pythonmac-SIG mailing list@footnote{https://www.python.org/community/sigs/current/pythonmac-sig/}
is another support resource specifically for Python users and developers on the Mac.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Using Python on Android,Using Python on iOS,macOS 에서 파이썬 사용하기,파이썬 설정 및 사용법
@anchor{using/android doc}@anchor{2254}@anchor{using/android translation-repo}@anchor{2255}@anchor{using/android using-android}@anchor{2256}@anchor{using/android using-python-on-android}@anchor{2257}
@section Using Python on Android


Python on Android is unlike Python on desktop platforms. On a desktop platform,
Python is generally installed as a system resource that can be used by any user
of that computer. Users then interact with Python by running a @code{python}
executable and entering commands at an interactive prompt, or by running a
Python script.

On Android, there is no concept of installing as a system resource. The only unit
of software distribution is an “app”. There is also no console where you could
run a @code{python} executable, or interact with a Python REPL.

As a result, the only way you can use Python on Android is in embedded mode – that
is, by writing a native Android application, embedding a Python interpreter
using @code{libpython}, and invoking Python code using the @ref{2258,,Python embedding API}. The full Python interpreter, the standard library, and all
your Python code is then packaged into your app for its own private use.

The Python standard library has some notable omissions and restrictions on
Android. See the @ref{2259,,API availability guide} for
details.

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

@end menu

@node Adding Python to an Android app,Building a Python package for Android,,Using Python on Android
@anchor{using/android adding-python-to-an-android-app}@anchor{225a}
@subsection Adding Python to an Android app


Most app developers should use one of the following tools, which will provide a
much easier experience:


@itemize *

@item 
Briefcase@footnote{https://briefcase.readthedocs.io}, from the BeeWare project

@item 
Buildozer@footnote{https://buildozer.readthedocs.io}, from the Kivy project

@item 
Chaquopy@footnote{https://chaquo.com/chaquopy}

@item 
pyqtdeploy@footnote{https://www.riverbankcomputing.com/static/Docs/pyqtdeploy/}

@item 
Termux@footnote{https://termux.dev/en/}
@end itemize

If you’re sure you want to do all of this manually, read on. You can use the
testbed app@footnote{https://github.com/python/cpython/tree/3.14/Android/testbed} as a guide; each step below contains a
link to the relevant file.


@itemize *

@item 
First, acquire a build of Python for Android:


@itemize *

@item 
The easiest way is to download an Android release from python.org@footnote{https://www.python.org/downloads/android/}. The @code{prefix} directory
mentioned below is at the top level of the package.

@item 
Or if you want to build it yourself, follow the instructions in
Android/README.md@footnote{https://github.com/python/cpython/tree/3.14/Android/README.md}. The @code{prefix} directory will be created under
@code{cross-build/@var{HOST}}.
@end itemize

@item 
Add code to your build.gradle@footnote{https://github.com/python/cpython/tree/3.14/Android/testbed/app/build.gradle.kts}
file to copy the following items into your project. All except your own Python
code can be copied from @code{prefix/lib}:


@itemize *

@item 
In your JNI libraries:


@itemize *

@item 
@code{libpython*.*.so}

@item 
@code{lib*_python.so} (external libraries such as OpenSSL)
@end itemize

@item 
In your assets:


@itemize *

@item 
@code{python*.*} (the Python standard library)

@item 
@code{python*.*/site-packages} (your own Python code)
@end itemize
@end itemize

@item 
Add code to your app to extract the assets to the filesystem@footnote{https://github.com/python/cpython/tree/3.14/Android/testbed/app/src/main/java/org/python/testbed/MainActivity.kt}.

@item 
Add code to your app to start Python in embedded mode@footnote{https://github.com/python/cpython/tree/3.14/Android/testbed/app/src/main/c/main_activity.c}. This will need to be C code
called via JNI.
@end itemize

@node Building a Python package for Android,,Adding Python to an Android app,Using Python on Android
@anchor{using/android building-a-python-package-for-android}@anchor{225b}
@subsection Building a Python package for Android


Python packages can be built for Android as wheels and released on PyPI. The
recommended tool for doing this is cibuildwheel@footnote{https://cibuildwheel.pypa.io/en/stable/platforms/#android}, which automates
all the details of setting up a cross-compilation environment, building the
wheel, and testing it on an emulator.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Using Python on iOS,편집기와 IDE,Using Python on Android,파이썬 설정 및 사용법
@anchor{using/ios doc}@anchor{225c}@anchor{using/ios translation-repo}@anchor{225d}@anchor{using/ios using-ios}@anchor{225e}@anchor{using/ios using-python-on-ios}@anchor{225f}
@section Using Python on iOS


@*Authors: 
Russell Keith-Magee (2024-03)


Python on iOS is unlike Python on desktop platforms. On a desktop platform,
Python is generally installed as a system resource that can be used by any user
of that computer. Users then interact with Python by running a @code{python}
executable and entering commands at an interactive prompt, or by running a
Python script.

On iOS, there is no concept of installing as a system resource. The only unit
of software distribution is an “app”. There is also no console where you could
run a @code{python} executable, or interact with a Python REPL.

As a result, the only way you can use Python on iOS is in embedded mode - that
is, by writing a native iOS application, and embedding a Python interpreter
using @code{libPython}, and invoking Python code using the @ref{2258,,Python embedding API}. The full Python interpreter, the standard library, and all
your Python code is then packaged as a standalone bundle that can be
distributed via the iOS App Store.

If you’re looking to experiment for the first time with writing an iOS app in
Python, projects such as BeeWare@footnote{https://beeware.org} and Kivy@footnote{https://kivy.org} will provide a much more approachable user experience.
These projects manage the complexities associated with getting an iOS project
running, so you only need to deal with the Python code itself.

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

@end menu

@node Python at runtime on iOS,Installing Python on iOS,,Using Python on iOS
@anchor{using/ios python-at-runtime-on-ios}@anchor{2260}
@subsection Python at runtime on iOS


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

@end menu

@node iOS version compatibility,Platform identification,,Python at runtime on iOS
@anchor{using/ios ios-version-compatibility}@anchor{2261}
@subsubsection iOS version compatibility


The minimum supported iOS version is specified at compile time, using the
@ref{21c1,,--host} option to @code{configure}. By default, when compiled for iOS,
Python will be compiled with a minimum supported iOS version of 13.0. To use a
different minimum iOS version, provide the version number as part of the
@code{--host} argument - for example,
@code{--host=arm64-apple-ios15.4-simulator} would compile an ARM64 simulator build
with a deployment target of 15.4.

@node Platform identification,Standard library availability,iOS version compatibility,Python at runtime on iOS
@anchor{using/ios platform-identification}@anchor{2262}
@subsubsection Platform identification


When executing on iOS, @code{sys.platform} will report as @code{ios}. This value will
be returned on an iPhone or iPad, regardless of whether the app is running on
the simulator or a physical device.

Information about the specific runtime environment, including the iOS version,
device model, and whether the device is a simulator, can be obtained using
@ref{2263,,platform.ios_ver()}. @ref{2264,,platform.system()} will report @code{iOS} or
@code{iPadOS}, depending on the device.

@ref{131b,,os.uname()} reports kernel-level details; it will report a name of
@code{Darwin}.

@node Standard library availability,Binary extension modules,Platform identification,Python at runtime on iOS
@anchor{using/ios standard-library-availability}@anchor{2265}
@subsubsection Standard library availability


The Python standard library has some notable omissions and restrictions on
iOS. See the @ref{2259,,API availability guide for iOS} for
details.

@node Binary extension modules,Compiler stub binaries,Standard library availability,Python at runtime on iOS
@anchor{using/ios binary-extension-modules}@anchor{2266}
@subsubsection Binary extension modules


One notable difference about iOS as a platform is that App Store distribution
imposes hard requirements on the packaging of an application. One of these
requirements governs how binary extension modules are distributed.

The iOS App Store requires that `all' binary modules in an iOS app must be
dynamic libraries, contained in a framework with appropriate metadata, stored
in the @code{Frameworks} folder of the packaged app. There can be only a single
binary per framework, and there can be no executable binary material outside
the @code{Frameworks} folder.

This conflicts with the usual Python approach for distributing binaries, which
allows a binary extension module to be loaded from any location on
@code{sys.path}. To ensure compliance with App Store policies, an iOS project must
post-process any Python packages, converting @code{.so} binary modules into
individual standalone frameworks with appropriate metadata and signing. For
details on how to perform this post-processing, see the guide for @ref{2267,,adding Python to your project}.

To help Python discover binaries in their new location, the original @code{.so}
file on @code{sys.path} is replaced with a @code{.fwork} file. This file is a text
file containing the location of the framework binary, relative to the app
bundle. To allow the framework to resolve back to the original location, the
framework must contain a @code{.origin} file that contains the location of the
@code{.fwork} file, relative to the app bundle.

For example, consider the case of an import @code{from foo.bar import _whiz},
where @code{_whiz} is implemented with the binary module
@code{sources/foo/bar/_whiz.abi3.so}, with @code{sources} being the location
registered on @code{sys.path}, relative to the application bundle. This module
`must' be distributed as @code{Frameworks/foo.bar._whiz.framework/foo.bar._whiz}
(creating the framework name from the full import path of the module), with an
@code{Info.plist} file in the @code{.framework} directory identifying the binary as a
framework. The @code{foo.bar._whiz} module would be represented in the original
location with a @code{sources/foo/bar/_whiz.abi3.fwork} marker file, containing
the path @code{Frameworks/foo.bar._whiz/foo.bar._whiz}. The framework would also
contain @code{Frameworks/foo.bar._whiz.framework/foo.bar._whiz.origin}, containing
the path to the @code{.fwork} file.

When running on iOS, the Python interpreter will install an
@ref{2268,,AppleFrameworkLoader} that is able to read and
import @code{.fwork} files. Once imported, the @code{__file__} attribute of the
binary module will report as the location of the @code{.fwork} file. However, the
@ref{2269,,ModuleSpec} for the loaded module will report the
@code{origin} as the location of the binary in the framework folder.

@node Compiler stub binaries,,Binary extension modules,Python at runtime on iOS
@anchor{using/ios compiler-stub-binaries}@anchor{226a}
@subsubsection Compiler stub binaries


Xcode doesn’t expose explicit compilers for iOS; instead, it uses an @code{xcrun}
script that resolves to a full compiler path (e.g., @code{xcrun --sdk iphoneos
clang} to get the @code{clang} for an iPhone device). However, using this script
poses two problems:


@itemize *

@item 
The output of @code{xcrun} includes paths that are machine specific, resulting
in a sysconfig module that cannot be shared between users; and

@item 
It results in @code{CC}/@code{CPP}/@code{LD}/@code{AR} definitions that include spaces.
There is a lot of C ecosystem tooling that assumes that you can split a
command line at the first space to get the path to the compiler executable;
this isn’t the case when using @code{xcrun}.
@end itemize

To avoid these problems, Python provided stubs for these tools. These stubs are
shell script wrappers around the underingly @code{xcrun} tools, distributed in a
@code{bin} folder distributed alongside the compiled iOS framework. These scripts
are relocatable, and will always resolve to the appropriate local system paths.
By including these scripts in the bin folder that accompanies a framework, the
contents of the @code{sysconfig} module becomes useful for end-users to compile
their own modules. When compiling third-party Python modules for iOS, you
should ensure these stub binaries are on your path.

@node Installing Python on iOS,App Store Compliance<2>,Python at runtime on iOS,Using Python on iOS
@anchor{using/ios installing-python-on-ios}@anchor{226b}
@subsection Installing Python on iOS


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

@end menu

@node Tools for building iOS apps,Adding Python to an iOS project,,Installing Python on iOS
@anchor{using/ios tools-for-building-ios-apps}@anchor{226c}
@subsubsection Tools for building iOS apps


Building for iOS requires the use of Apple’s Xcode tooling. It is strongly
recommended that you use the most recent stable release of Xcode. This will
require the use of the most (or second-most) recently released macOS version,
as Apple does not maintain Xcode for older macOS versions. The Xcode Command
Line Tools are not sufficient for iOS development; you need a `full' Xcode
install.

If you want to run your code on the iOS simulator, you’ll also need to install
an iOS Simulator Platform. You should be prompted to select an iOS Simulator
Platform when you first run Xcode. Alternatively, you can add an iOS Simulator
Platform by selecting from the Platforms tab of the Xcode Settings panel.

@node Adding Python to an iOS project,Testing a Python package,Tools for building iOS apps,Installing Python on iOS
@anchor{using/ios adding-ios}@anchor{2267}@anchor{using/ios adding-python-to-an-ios-project}@anchor{226d}
@subsubsection Adding Python to an iOS project


Python can be added to any iOS project, using either Swift or Objective C. The
following examples will use Objective C; if you are using Swift, you may find a
library like PythonKit@footnote{https://github.com/pvieito/PythonKit} to be
helpful.

To add Python to an iOS Xcode project:


@enumerate 

@item 
Build or obtain a Python @code{XCFramework}. See the instructions in
Apple/iOS/README.md@footnote{https://github.com/python/cpython/tree/3.14/Apple/iOS/README.md} (in the CPython source distribution) for details on
how to build a Python @code{XCFramework}. At a minimum, you will need a build
that supports @code{arm64-apple-ios}, plus one of either
@code{arm64-apple-ios-simulator} or @code{x86_64-apple-ios-simulator}.

@item 
Drag the @code{XCframework} into your iOS project. In the following
instructions, we’ll assume you’ve dropped the @code{XCframework} into the root
of your project; however, you can use any other location that you want by
adjusting paths as needed.

@item 
Add your application code as a folder in your Xcode project. In the
following instructions, we’ll assume that your user code is in a folder
named @code{app} in the root of your project; you can use any other location by
adjusting paths as needed. Ensure that this folder is associated with your
app target.

@item 
Select the app target by selecting the root node of your Xcode project, then
the target name in the sidebar that appears.

@item 
In the “General” settings, under “Frameworks, Libraries and Embedded
Content”, add @code{Python.xcframework}, with “Embed & Sign” selected.

@item 
In the “Build Settings” tab, modify the following:


@itemize -

@item 
Build Options


@itemize *

@item 
User Script Sandboxing: No

@item 
Enable Testability: Yes
@end itemize

@item 
Search Paths


@itemize *

@item 
Framework Search Paths: @code{$(PROJECT_DIR)}

@item 
Header Search Paths: @code{"$(BUILT_PRODUCTS_DIR)/Python.framework/Headers"}
@end itemize

@item 
Apple Clang - Warnings - All languages


@itemize *

@item 
Quoted Include In Framework Header: No
@end itemize
@end itemize

@item 
Add a build step that processes the Python standard library, and your own
Python binary dependencies. In the “Build Phases” tab, add a new “Run
Script” build step `before' the “Embed Frameworks” step, but `after' the
“Copy Bundle Resources” step. Name the step “Process Python libraries”,
disable the “Based on dependency analysis” checkbox, and set the script
content to:

@example
set -e
source $PROJECT_DIR/Python.xcframework/build/build_utils.sh
install_python Python.xcframework app
@end example

If you have placed your XCframework somewhere other than the root of your
project, modify the path to the first argument.

@item 
Add Objective C code to initialize and use a Python interpreter in embedded
mode. You should ensure that:


@itemize *

@item 
UTF-8 mode (@ref{41d,,PyPreConfig.utf8_mode}) is `enabled';

@item 
Buffered stdio (@ref{411,,PyConfig.buffered_stdio}) is `disabled';

@item 
Writing bytecode (@ref{40d,,PyConfig.write_bytecode}) is `disabled';

@item 
Signal handlers (@ref{abb,,PyConfig.install_signal_handlers}) are `enabled';

@item 
System logging (@ref{226e,,PyConfig.use_system_logger}) is `enabled'
(optional, but strongly recommended; this is enabled by default);

@item 
@geindex PYTHONHOME
@geindex 환경 변수; PYTHONHOME
@ref{3f0,,PYTHONHOME} for the interpreter is configured to point at the
@code{python} subfolder of your app’s bundle; and

@item 
The 
@geindex PYTHONPATH
@geindex 환경 변수; PYTHONPATH
@ref{121c,,PYTHONPATH} for the interpreter includes:


@itemize -

@item 
the @code{python/lib/python3.X} subfolder of your app’s bundle,

@item 
the @code{python/lib/python3.X/lib-dynload} subfolder of your app’s bundle, and

@item 
the @code{app} subfolder of your app’s bundle
@end itemize
@end itemize

Your app’s bundle location can be determined using @code{[[NSBundle mainBundle]
resourcePath]}.
@end enumerate

Steps 7 and 8 of these instructions assume that you have a single folder of
pure Python application code, named @code{app}. If you have third-party binary
modules in your app, some additional steps will be required:


@itemize *

@item 
You need to ensure that any folders containing third-party binaries are
either associated with the app target, or are explicitly copied as part of
step 7. Step 7 should also purge any binaries that are not appropriate for
the platform a specific build is targeting (i.e., delete any device binaries
if you’re building an app targeting the simulator).

@item 
If you’re using a separate folder for third-party packages, ensure that
folder is added to the end of the call to @code{install_python} in step 7, and
as part of the 
@geindex PYTHONPATH
@geindex 환경 변수; PYTHONPATH
@ref{121c,,PYTHONPATH} configuration in step 8.

@item 
If any of the folders that contain third-party packages will contain @code{.pth}
files, you should add that folder as a `site directory' (using
@ref{226f,,site.addsitedir()}), rather than adding to 
@geindex PYTHONPATH
@geindex 환경 변수; PYTHONPATH
@ref{121c,,PYTHONPATH} or
@ref{3e4,,sys.path} directly.
@end itemize

@node Testing a Python package,,Adding Python to an iOS project,Installing Python on iOS
@anchor{using/ios testing-a-python-package}@anchor{2270}
@subsubsection Testing a Python package


The CPython source tree contains a testbed project@footnote{https://github.com/python/cpython/tree/3.14/Apple/iOS/testbed} that
is used to run the CPython test suite on the iOS simulator. This testbed can also
be used as a testbed project for running your Python library’s test suite on iOS.

After building or obtaining an iOS XCFramework (see Apple/iOS/README.md@footnote{https://github.com/python/cpython/tree/3.14/Apple/iOS/README.md}
for details), create a clone of the Python iOS testbed project. If you used the
@code{Apple} build script to build the XCframework, you can run:

@example
$ python cross-build/iOS/testbed clone --app <path/to/module1> --app <path/to/module2> app-testbed
@end example

Or, if you’ve sourced your own XCframework, by running:

@example
$ python Apple/testbed clone --platform iOS --framework <path/to/Python.xcframework> --app <path/to/module1> --app <path/to/module2> app-testbed
@end example

Any folders specified with the @code{--app} flag will be copied into the cloned
testbed project. The resulting testbed will be created in the @code{app-testbed}
folder. In this example, the @code{module1} and @code{module2} would be importable
modules at runtime. If your project has additional dependencies, they can be
installed into the @code{app-testbed/Testbed/app_packages} folder (using @code{pip
install --target app-testbed/Testbed/app_packages} or similar).

You can then use the @code{app-testbed} folder to run the test suite for your app,
For example, if @code{module1.tests} was the entry point to your test suite, you
could run:

@example
$ python app-testbed run -- module1.tests
@end example

This is the equivalent of running @code{python -m module1.tests} on a desktop
Python build. Any arguments after the @code{--} will be passed to the testbed as
if they were arguments to @code{python -m} on a desktop machine.

You can also open the testbed project in Xcode by running:

@example
$ open app-testbed/iOSTestbed.xcodeproj
@end example

This will allow you to use the full Xcode suite of tools for debugging.

The arguments used to run the test suite are defined as part of the test plan.
To modify the test plan, select the test plan node of the project tree (it
should be the first child of the root node), and select the “Configurations”
tab. Modify the “Arguments Passed On Launch” value to change the testing
arguments.

The test plan also disables parallel testing, and specifies the use of the
@code{Testbed.lldbinit} file for providing configuration of the debugger. The
default debugger configuration disables automatic breakpoints on the
@code{SIGINT}, @code{SIGUSR1}, @code{SIGUSR2}, and @code{SIGXFSZ} signals.

@node App Store Compliance<2>,,Installing Python on iOS,Using Python on iOS
@anchor{using/ios app-store-compliance}@anchor{2271}
@subsection App Store Compliance


The only mechanism for distributing apps to third-party iOS devices is to
submit the app to the iOS App Store; apps submitted for distribution must pass
Apple’s app review process. This process includes a set of automated validation
rules that inspect the submitted application bundle for problematic code. There
are some steps that must be taken to ensure that your app will be able to pass
these validation steps.

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

@end menu

@node Incompatible code in the standard library,Privacy manifests,,App Store Compliance<2>
@anchor{using/ios incompatible-code-in-the-standard-library}@anchor{2272}
@subsubsection Incompatible code in the standard library


The Python standard library contains some code that is known to violate these
automated rules. While these violations appear to be false positives, Apple’s
review rules cannot be challenged; so, it is necessary to modify the Python
standard library for an app to pass App Store review.

The Python source tree contains
a patch file@footnote{https://github.com/python/cpython/tree/3.14/Mac/Resources/app-store-compliance.patch} that will remove
all code that is known to cause issues with the App Store review process. This
patch is applied automatically when building for iOS.

@node Privacy manifests,,Incompatible code in the standard library,App Store Compliance<2>
@anchor{using/ios privacy-manifests}@anchor{2273}
@subsubsection Privacy manifests


In April 2025, Apple introduced a requirement for certain third-party libraries to provide a Privacy Manifest@footnote{https://developer.apple.com/support/third-party-SDK-requirements}.
As a result, if you have a binary module that uses one of the affected
libraries, you must provide an @code{.xcprivacy} file for that library.
OpenSSL is one library affected by this requirement, but there are others.

If you produce a binary module named @code{mymodule.so}, and use you the Xcode
build script described in step 7 above, you can place a @code{mymodule.xcprivacy}
file next to @code{mymodule.so}, and the privacy manifest will be installed into
the required location when the binary module is converted into a framework.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 편집기와 IDE,,Using Python on iOS,파이썬 설정 및 사용법
@anchor{using/editors doc}@anchor{2274}@anchor{using/editors editors}@anchor{2245}@anchor{using/editors editors-and-ides}@anchor{2275}@anchor{using/editors translation-repo}@anchor{2276}
@section 편집기와 IDE


파이썬 프로그래밍 언어를 지원하는 여러 IDE가 있습니다. 많은 편집기와 IDE는 구문 강조, 디버깅 도구 및 
@geindex Python 향상 제안; PEP 8
PEP 8@footnote{https://peps.python.org/pep-0008/} 검사를 제공합니다.

@menu
* IDLE — Python editor and shell:: 
* 다른 편집기와 IDE:: 

@end menu

@node IDLE — Python editor and shell,다른 편집기와 IDE,,편집기와 IDE
@anchor{using/editors idle-python-editor-and-shell}@anchor{2277}
@subsection IDLE — Python editor and shell


IDLE is Python’s Integrated Development and Learning Environment and is generally bundled with Python installs.
If you are on Linux and do not have IDLE installed see @ref{2146,,Installing IDLE on Linux}.
For more information see the @ref{1214,,IDLE docs}.

@node 다른 편집기와 IDE,,IDLE — Python editor and shell,편집기와 IDE
@anchor{using/editors other-editors-and-ides}@anchor{2278}
@subsection 다른 편집기와 IDE


파이썬의 커뮤니티 위키에는 편집기와 IDE에 대해 커뮤니티가 제공한 정보가 있습니다. 포괄적인 목록을 보려면 Python Editors@footnote{https://wiki.python.org/moin/PythonEditors}와 Integrated Development Environments@footnote{https://wiki.python.org/moin/IntegratedDevelopmentEnvironments}로 이동하십시오.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 파이썬 언어 레퍼런스,파이썬 표준 라이브러리,파이썬 설정 및 사용법,Top
@anchor{reference/index doc}@anchor{2279}@anchor{reference/index reference-index}@anchor{14a}@anchor{reference/index the-python-language-reference}@anchor{227a}@anchor{reference/index translation-repo}@anchor{227b}
@chapter 파이썬 언어 레퍼런스


이 참조 설명서는 언어의 문법과 “중심 개념들(core semantics)”을 설명합니다. 딱딱하더라도 정확하고 완전해지려고 합니다. 중심에서 벗어난 내장형, 내장 함수, 모듈들의 개념들은 @ref{149,,파이썬 표준 라이브러리} 에 기술되어 있습니다. 언어에 대한 비형식적인 소개는 @ref{1fb8,,파이썬 자습서} 에서 제공됩니다. C와 C++ 프로그래머를 위해서는 두 개의 설명서가 따로 제공됩니다: @ref{1fb9,,파이썬 인터프리터 확장 및 내장} 는 파이썬 확장 모듈을 작성하는 방법에 대한 큰 그림을 설명하고, @ref{1fba,,Python/C API reference manual} 은 C/C++ 프로그래머에게 제공되는 인터페이스들을 상세하게 기술합니다.

@menu
* 개요:: 
* 어휘 분석:: 
* 데이터 모델:: 
* 실행 모델:: 
* 임포트 시스템:: 
* 표현식:: 
* 단순문(Simple statements): 단순문 Simple statements. 
* 복합문(Compound statements): 복합문 Compound statements. 
* 최상위 요소들:: 
* 전체 문법 규격:: 

@end menu

@node 개요,어휘 분석,,파이썬 언어 레퍼런스
@anchor{reference/introduction doc}@anchor{227c}@anchor{reference/introduction id1}@anchor{227d}@anchor{reference/introduction introduction}@anchor{227e}
@section 개요


이 레퍼런스 설명서는 파이썬 프로그래밍 언어를 설명합니다. 자습서를 목표로 하고 있지 않습니다.

가능한 한 정확하려고 노력하고 있지만, 문법과 어휘 분석 이외의 모든 것에는 형식 규격보다는 자연어를 사용합니다. 이 선택이 평균적인 독자들이 문서를 좀 더 잘 이해하도록 만들지만, 동시에 모호해질 가능성 역시 만듭니다. 결과적으로, 만약 여러분이 화성에서 왔고 이 문서만으로 파이썬을 다시 구현하려고 하면, 아마도 여러 가지를 짐작해야 할 것이고 결국 많이 다른 언어를 만드는 것으로 끝날 것입니다. 반면에, 여러분이 파이썬을 사용하고 있고 언어의 특정 영역에 대한 정확한 규칙에 대해 궁금해하고 있다면 거의 확실히 이곳에서 답을 찾을 수 있습니다. 좀 더 형식화된 정의를 보고 싶다면, 아마도 여러분의 시간을 기부하는 편이 좋습니다 — 그렇지 않으면 클로닝 기계를 발명하거나 :-).

참조 문서에 너무 많은 구현 세부 사항을 넣는 것은 위험합니다. 구현은 변경될 것이고 같은 언어의 다른 구현도 좀 다른 방식으로 동작할 수 있습니다. 반면에 (대안 구현이 점차 지지도를 높여가고 있기는 하지만) CPython 은 가장 널리 사용되는 파이썬 구현이고, 그것의 특별한 경우 들은 때로 언급할 가치가 있습니다. 구현이 추가의 제약을 내포하고 있는 경우는 특히 그렇습니다. 그래서, 텍스트 중간중간 짧은 “구현 노트” 가 튀어나오는 것을 보게 될 것입니다.

모든 파이썬 구현에는 많은 내장 표준 모듈들이 따라옵니다. 이것들은 @ref{149,,파이썬 표준 라이브러리} 에 기술되어 있습니다. 언어 정의에 주목할 만한 방식으로 관계될 경우 몇몇 내장 모듈들은 따로 언급됩니다.

@menu
* 대안 구현들:: 
* 표기법:: 

@end menu

@node 대안 구현들,표기법,,개요
@anchor{reference/introduction alternate-implementations}@anchor{227f}@anchor{reference/introduction implementations}@anchor{2115}
@subsection 대안 구현들


눈에 띄게 널리 사용되는 파이썬 구현이 존재하기는 하지만, 특정한 관심사를 가진 대상들에게 호소력을 가진 여러 대안 구현들이 존재합니다.

알려진 구현들은:


@table @asis

@item CPython

원조이기도 하고 가장 잘 관리되고 있는 C로 작성된 파이썬 구현입니다. 언어의 새로운 기능은 보통 여기에서 처음 등장합니다.

@item Jython

파이썬 자바구현. 이 구현은 자바 응용 프로그램을 위한 스크립트 언어로 사용되거나, 자바 클래스 라이브러리를 활용하는 응용 프로그램을 만드는데 사용될 수 있습니다. 종종 자바 라이브러리의 테스트를 만드는 데 사용되기도 합니다. 더 자세한 정보는 Jython 웹사이트@footnote{https://www.jython.org/} 에서 찾을 수 있습니다.

@item Python for .NET

이 구현은 실제로는 CPython 구현을 사용하지만, 매니지드(managed) .NET 응용 프로그램이고 .NET 라이브러리를 제공합니다. Bryan Lloyd가 만들었습니다다. 더 자세한 정보는 Python for .NET 홈페이지@footnote{https://pythonnet.github.io/} 에서 제공됩니다.

@item IronPython

.NET을 위한 대안 파이썬. Python.NET 과는 달리 이것은 IL을 생성하고, 파이썬 코드를 .NET 어셈블리로 직접 컴파일하는 완전한 파이썬 구현입니다. Jim Hugunin 이 만들었는데, Jython 의 원저자이기도 합니다. 자세한 정보는 IronPython 웹사이트@footnote{https://ironpython.net/} 에서 얻을 수 있습니다.

@item PyPy

완전히 파이썬으로 작성된 파이썬 구현. 스택 리스(stackless) 지원이나 JIT 컴파일러와 같이 다른 구현에서는 찾을 수 없는 고급 기능을 제공합니다. 이 프로젝트의 목표 중 하나는 (파이썬으로 쓰였기 때문에) 인터프리터 수정을 쉽게 만들어서 언어 자체에 대한 실험을 북돋는 것입니다. 자세한 정보는 PyPy 프로젝트의 홈페이지@footnote{https://pypy.org/} 에서 찾을 수 있습니다.
@end table

각 구현은 이 설명서에서 설명되는 언어와 조금씩 각기 다른 방법으로 벗어나거나, 표준 파이썬 문서에서 다루는 범위 밖의 특별한 정보들을 소개합니다. 여러분이 사용 중인 구현에 대해 어떤 것을 더 알아야 하는지 판단하기 위해서는 구현 별로 제공되는 문서를 참조할 필요가 있습니다.

@node 표기법,,대안 구현들,개요
@anchor{reference/introduction id2}@anchor{2280}@anchor{reference/introduction notation}@anchor{2281}
@subsection 표기법


@geindex BNF
@geindex 문법 (grammar)
@geindex 문법 (syntax)
@geindex 표기법

The descriptions of lexical analysis and syntax use a grammar notation that
is a mixture of
EBNF@footnote{https://en.wikipedia.org/wiki/Extended_Backus%E2%80%93Naur_form}
and PEG@footnote{https://en.wikipedia.org/wiki/Parsing_expression_grammar}.
For example:

@example
@anchor{reference/introduction grammar-token-notation-name}@anchor{2282}name:   @ref{2283,,letter} (@ref{2283,,letter} | @ref{2284,,digit} | "_")*
@anchor{reference/introduction grammar-token-notation-letter}@anchor{2283}letter: "a"..."z" | "A"..."Z"
@anchor{reference/introduction grammar-token-notation-digit}@anchor{2284}digit:  "0"..."9"
@end example

In this example, the first line says that a @code{name} is a @code{letter} followed
by a sequence of zero or more @code{letter}s, @code{digit}s, and underscores.
A @code{letter} in turn is any of the single characters @code{'a'} through
@code{'z'} and @code{A} through @code{Z}; a @code{digit} is a single character from @code{0}
to @code{9}.

Each rule begins with a name (which identifies the rule that’s being defined)
followed by a colon, @code{:}.
The definition to the right of the colon uses the following syntax elements:


@itemize *

@item 
@code{name}: A name refers to another rule.
Where possible, it is a link to the rule’s definition.


@itemize *

@item 
@code{TOKEN}: An uppercase name refers to a @ref{2285,,token}.
For the purposes of grammar definitions, tokens are the same as rules.
@end itemize

@item 
@code{"text"}, @code{'text'}: Text in single or double quotes must match literally
(without the quotes). The type of quote is chosen according to the meaning
of @code{text}:


@itemize *

@item 
@code{'if'}: A name in single quotes denotes a @ref{2286,,keyword}.

@item 
@code{"case"}: A name in double quotes denotes a
@ref{a0d,,soft-keyword}.

@item 
@code{'@@'}: A non-letter symbol in single quotes denotes an
@ref{2287,,OP} token, that is, a @ref{2288,,delimiter} or
@ref{2289,,operator}.
@end itemize

@item 
@code{e1 e2}: Items separated only by whitespace denote a sequence.
Here, @code{e1} must be followed by @code{e2}.

@item 
@code{e1 | e2}: A vertical bar is used to separate alternatives.
It denotes PEG’s “ordered choice”: if @code{e1} matches, @code{e2} is
not considered.
In traditional PEG grammars, this is written as a slash, @code{/}, rather than
a vertical bar.
See 
@geindex Python 향상 제안; PEP 617
PEP 617@footnote{https://peps.python.org/pep-0617/} for more background and details.

@item 
@code{e*}: A star means zero or more repetitions of the preceding item.

@item 
@code{e+}: Likewise, a plus means one or more repetitions.

@item 
@code{[e]}: A phrase enclosed in square brackets means zero or
one occurrences. In other words, the enclosed phrase is optional.

@item 
@code{e?}: A question mark has exactly the same meaning as square brackets:
the preceding item is optional.

@item 
@code{(e)}: Parentheses are used for grouping.
@end itemize

The following notation is only used in
@ref{228a,,lexical definitions}.


@itemize *

@item 
@code{"a"..."z"}: Two literal characters separated by three dots mean a choice
of any single character in the given (inclusive) range of ASCII characters.

@item 
@code{<...>}: A phrase between angular brackets gives an informal description
of the matched symbol (for example, @code{<any ASCII character except "\">}),
or an abbreviation that is defined in nearby text (for example, @code{<Lu>}).
@end itemize
@anchor{reference/introduction lexical-lookaheads}@anchor{228b}
Some definitions also use `lookaheads', which indicate that an element
must (or must not) match at a given position, but without consuming any input:


@itemize *

@item 
@code{&e}: a positive lookahead (that is, @code{e} is required to match)

@item 
@code{!e}: a negative lookahead (that is, @code{e} is required `not' to match)
@end itemize

The unary operators (@code{*}, @code{+}, @code{?}) bind as tightly as possible;
the vertical bar (@code{|}) binds most loosely.

White space is only meaningful to separate tokens.

Rules are normally contained on a single line, but rules that are too long
may be wrapped:

@example
@anchor{reference/introduction grammar-token-notation-literal}@anchor{228c}literal: stringliteral | bytesliteral
         | integer | floatnumber | imagnumber
@end example

Alternatively, rules may be formatted with the first line ending at the colon,
and each alternative beginning with a vertical bar on a new line.
For example:

@example
@anchor{reference/introduction grammar-token-notation-alt-literal}@anchor{228d}literal:
   | stringliteral
   | bytesliteral
   | integer
   | floatnumber
   | imagnumber
@end example

This does `not' mean that there is an empty first alternative.

@geindex 어휘 정의

@menu
* Lexical and Syntactic definitions:: 

@end menu

@node Lexical and Syntactic definitions,,,표기법
@anchor{reference/introduction lexical-and-syntactic-definitions}@anchor{228e}@anchor{reference/introduction notation-lexical-vs-syntactic}@anchor{228a}
@subsubsection Lexical and Syntactic definitions


There is some difference between `lexical' and `syntactic' analysis:
the @ref{228f,,lexical analyzer} operates on the individual characters of the
input source, while the `parser' (syntactic analyzer) operates on the stream
of @ref{2285,,tokens} generated by the lexical analysis.
However, in some cases the exact boundary between the two phases is a
CPython implementation detail.

The practical difference between the two is that in `lexical' definitions,
all whitespace is significant.
The lexical analyzer @ref{2290,,discards} all whitespace that is not
converted to tokens like @ref{20fa,,token.INDENT} or @ref{2291,,NEWLINE}.
`Syntactic' definitions then use these tokens, rather than source characters.

This documentation uses the same BNF grammar for both styles of definitions.
All uses of BNF in the next chapter (@ref{2292,,어휘 분석}) are lexical definitions;
uses in subsequent chapters are syntactic definitions.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 어휘 분석,데이터 모델,개요,파이썬 언어 레퍼런스
@anchor{reference/lexical_analysis doc}@anchor{2293}@anchor{reference/lexical_analysis lexical}@anchor{2292}@anchor{reference/lexical_analysis lexical-analysis}@anchor{2294}@anchor{reference/lexical_analysis translation-repo}@anchor{2295}
@section 어휘 분석


@geindex 어휘 분석
@geindex 구문 분석기
@geindex 토큰

A Python program is read by a `parser'.  Input to the parser is a stream of
@ref{2285,,tokens}, generated by the `lexical analyzer' (also known as
the `tokenizer').
This chapter describes how the lexical analyzer produces these tokens.

The lexical analyzer determines the program text’s @ref{2296,,encoding}
(UTF-8 by default), and decodes the text into
@ref{2297,,source characters}.
If the text cannot be decoded, a @ref{18e,,SyntaxError} is raised.

Next, the lexical analyzer uses the source characters to generate a stream of tokens.
The type of a generated token generally depends on the next source character to
be processed. Similarly, other special behavior of the analyzer depends on
the first source character that hasn’t yet been processed.
The following table gives a quick summary of these source characters,
with links to sections that contain more information.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Character

@tab

Next token (or other relevant documentation)

@item


@itemize *

@item 
스페이스

@item 
탭

@item 
formfeed
@end itemize

@tab


@itemize *

@item 
@ref{2290,,Whitespace}
@end itemize

@item


@itemize *

@item 
CR, LF
@end itemize

@tab


@itemize *

@item 
@ref{2298,,New line}

@item 
@ref{2299,,Indentation}
@end itemize

@item


@itemize *

@item 
backslash (@code{\})
@end itemize

@tab


@itemize *

@item 
@ref{229a,,Explicit line joining}

@item 
(Also significant in @ref{686,,string escape sequences})
@end itemize

@item


@itemize *

@item 
hash (@code{#})
@end itemize

@tab


@itemize *

@item 
@ref{229b,,Comment}
@end itemize

@item


@itemize *

@item 
quote (@code{'}, @code{"})
@end itemize

@tab


@itemize *

@item 
@ref{229c,,String literal}
@end itemize

@item


@itemize *

@item 
ASCII letter (@code{a}-@code{z}, @code{A}-@code{Z})

@item 
non-ASCII character
@end itemize

@tab


@itemize *

@item 
@ref{229d,,Name}

@item 
Prefixed @ref{229c,,string or bytes literal}
@end itemize

@item


@itemize *

@item 
underscore (@code{_})
@end itemize

@tab


@itemize *

@item 
@ref{229d,,Name}

@item 
(Can also be part of @ref{229e,,numeric literals})
@end itemize

@item


@itemize *

@item 
number (@code{0}-@code{9})
@end itemize

@tab


@itemize *

@item 
@ref{229e,,Numeric literal}
@end itemize

@item


@itemize *

@item 
dot (@code{.})
@end itemize

@tab


@itemize *

@item 
@ref{229e,,Numeric literal}

@item 
@ref{2289,,Operator}
@end itemize

@item


@itemize *

@item 
question mark (@code{?})

@item 
dollar (@code{$})

@item 
@c (the following uses zero-width space characters to render

@c a literal backquote)

backquote (@code{​`​})

@item 
control character
@end itemize

@tab


@itemize *

@item 
Error (outside string literals and comments)
@end itemize

@item


@itemize *

@item 
other printing character
@end itemize

@tab


@itemize *

@item 
@ref{2289,,Operator or delimiter}
@end itemize

@item


@itemize *

@item 
end of file
@end itemize

@tab


@itemize *

@item 
@ref{229f,,End marker}
@end itemize

@end multitable


@menu
* 줄 구조(Line structure): 줄 구조 Line structure. 
* 다른 토큰들:: 
* Names (identifiers and keywords): Names identifiers and keywords. 
* 리터럴:: 
* 문자열과 바이트열 리터럴:: 
* 숫자 리터럴:: 
* Operators and delimiters:: 

@end menu

@node 줄 구조 Line structure,다른 토큰들,,어휘 분석
@anchor{reference/lexical_analysis id1}@anchor{22a0}@anchor{reference/lexical_analysis line-structure}@anchor{2298}
@subsection 줄 구조(Line structure)


@geindex 줄 구조(line structure)

파이썬 프로그램은 여러 개의 `논리적인 줄(logical lines)' 들로 나뉩니다.

@menu
* 논리적인 줄:: 
* 물리적인 줄:: 
* 주석:: 
* 인코딩 선언:: 
* 명시적인 줄 결합:: 
* 묵시적인 줄 결합:: 
* 빈 줄:: 
* 들여쓰기:: 
* 토큰 사이의 공백:: 
* End marker:: 

@end menu

@node 논리적인 줄,물리적인 줄,,줄 구조 Line structure
@anchor{reference/lexical_analysis id2}@anchor{22a1}@anchor{reference/lexical_analysis logical-lines}@anchor{22a2}
@subsubsection 논리적인 줄


@geindex 논리적인 줄
@geindex 물리적인 줄
@geindex 줄 결합
@geindex NEWLINE 토큰

The end of a logical line is represented by the token @ref{2291,,NEWLINE}.
Statements cannot cross logical line boundaries except where @code{NEWLINE}
is allowed by the syntax (e.g., between statements in compound statements).
A logical line is constructed from one or more `physical lines' by following
the @ref{229a,,explicit} or @ref{22a3,,implicit}
`line joining' rules.

@node 물리적인 줄,주석,논리적인 줄,줄 구조 Line structure
@anchor{reference/lexical_analysis id3}@anchor{22a4}@anchor{reference/lexical_analysis physical-lines}@anchor{22a5}
@subsubsection 물리적인 줄


A physical line is a sequence of characters terminated by one the following
end-of-line sequences:


@itemize *

@item 
the Unix form using ASCII LF (linefeed),

@item 
the Windows form using the ASCII sequence CR LF (return followed by linefeed),

@item 
the ‘Classic Mac OS@footnote{https://en.wikipedia.org/wiki/Classic_Mac_OS}’ form using the ASCII CR (return) character.
@end itemize

Regardless of platform, each of these sequences is replaced by a single
ASCII LF (linefeed) character.
(This is done even inside @ref{229c,,string literals}.)
Each line can use any of the sequences; they do not need to be consistent
within a file.

The end of input also serves as an implicit terminator for the final
physical line.

Formally:

@example
@anchor{reference/lexical_analysis grammar-token-python-grammar-newline}@anchor{22a6}newline: <ASCII LF> | <ASCII CR> <ASCII LF> | <ASCII CR>
@end example

@node 주석,인코딩 선언,물리적인 줄,줄 구조 Line structure
@anchor{reference/lexical_analysis comments}@anchor{229b}@anchor{reference/lexical_analysis id5}@anchor{22a7}
@subsubsection 주석


@geindex 주석
@geindex 해시 문자
@geindex # (해시);주석

주석은 문자열 리터럴에 포함되지 않는 해시 문자(@code{#})로 시작하고 물리적인 줄의 끝에서 끝납니다. 묵시적인 줄 결합 규칙이 유효하지 않은 이상, 주석은 논리적인 줄을 종료시킵니다. 주석은 문법이 무시합니다.

@node 인코딩 선언,명시적인 줄 결합,주석,줄 구조 Line structure
@anchor{reference/lexical_analysis encoding-declarations}@anchor{22a8}@anchor{reference/lexical_analysis encodings}@anchor{2296}
@subsubsection 인코딩 선언


@geindex 소스 문자 집합
@geindex 인코딩 선언 (소스 파일)
@geindex # (해시);소스 인코딩 선언

파이썬 스크립트의 첫 번 째나 두 번째 줄에 있는 주석이 정규식 @code{coding[=:]\s*([-\w.]+)} 과 매치되면, 이 주석은 인코딩 선언으로 처리됩니다. 이 정규식의 첫 번째 그룹은 소스 코드 파일의 인코딩 이름을 지정합니다. 인코딩 선언은 줄 전체에 홀로 나와야 합니다. 만약 두 번째 줄이라면, 첫 번째 줄 역시 주석만 있어야 합니다. 인코딩 선언의 권장 형태는 두 개입니다. 하나는

@example
# -*- coding: <encoding-name> -*-
@end example

인데 GNU Emacs에서도 인식됩니다. 다른 하나는

@example
# vim:fileencoding=<encoding-name>
@end example

인데 Bram Moolenaar 의 VIM에서 인식됩니다.

If no encoding declaration is found, the default encoding is UTF-8.  If the
implicit or explicit encoding of a file is UTF-8, an initial UTF-8 byte-order
mark (@code{b'\xef\xbb\xbf'}) is ignored rather than being a syntax error.

인코딩이 선언되면, 인코딩 이름은 파이썬이 인식할 수 있어야 합니다 (@ref{fb7,,표준 인코딩}를 참조하세요). 인코딩은 문자열 리터럴, 주석, 식별자를 포함한 모든 어휘 분석에서 모두 사용됩니다.
@anchor{reference/lexical_analysis lexical-source-character}@anchor{2297}
All lexical analysis, including string literals, comments
and identifiers, works on Unicode text decoded using the source encoding.
Any Unicode code point, except the NUL control character, can appear in
Python source.

@example
@anchor{reference/lexical_analysis grammar-token-python-grammar-source_character}@anchor{22a9}source_character:  <any Unicode code point, except NUL>
@end example

@node 명시적인 줄 결합,묵시적인 줄 결합,인코딩 선언,줄 구조 Line structure
@anchor{reference/lexical_analysis explicit-joining}@anchor{229a}@anchor{reference/lexical_analysis explicit-line-joining}@anchor{22aa}
@subsubsection 명시적인 줄 결합


@geindex 물리적인 줄
@geindex 줄 결합
@geindex 줄 결합
@geindex 역 슬래시 문자

둘 이상의 물리적인 줄은 역 슬래시 문자(@code{\})를 사용해서 논리적인 줄로 결합할 수 있습니다: 물리적인 줄이 문자열 리터럴이나 주석의 일부가 아닌 역 슬래시 문자로 끝나면, 역 슬래시와 뒤따르는 개행 문자가 제거된 채로, 현재 만들어지고 있는 논리적인 줄에 합쳐집니다. 예를 들어:

@example
if 1900 < year < 2100 and 1 <= month <= 12 \
   and 1 <= day <= 31 and 0 <= hour < 24 \
   and 0 <= minute < 60 and 0 <= second < 60:   # 유효한 날짜처럼 보입니다
        return 1
@end example

역 슬래시로 끝나는 줄은 주석이 포함될 수 없습니다. 역 슬래시는 주석을 결합하지 못합니다. 역 슬래시는 문자열 리터럴을 제외한 어떤 토큰도 결합하지 못합니다 (즉, 문자열 리터럴 이외의 어떤 토큰도 역 슬래시를 사용해서 두 줄에 나누어 기록할 수 없습니다.). 문자열 리터럴 밖에 있는 역 슬래시가 앞에서 언급한 장소 이외의 곳에 등장하는 것은 문법에 어긋납니다.

@node 묵시적인 줄 결합,빈 줄,명시적인 줄 결합,줄 구조 Line structure
@anchor{reference/lexical_analysis implicit-joining}@anchor{22a3}@anchor{reference/lexical_analysis implicit-line-joining}@anchor{22ab}
@subsubsection 묵시적인 줄 결합


괄호(@code{()}), 대괄호(@code{[]}), 중괄호(@code{@{@}})가 사용되는 표현은 역 슬래시 없이도 여러 개의 물리적인 줄로 나눌 수 있습니다. 예를 들어:

@example
month_names = ['Januari', 'Februari', 'Maart',      # 이것들은
               'April',   'Mei',      'Juni',       # 일년을 이루는
               'Juli',    'Augustus', 'September',  # 달들의
               'Oktober', 'November', 'December']   # 네덜란드 이름입니다
@end example

묵시적으로 이어지는 줄들은 주석을 포함할 수 있습니다. 이어지는 줄들의 들여쓰기는 중요하지 않습니다. 중간에 빈 줄이 들어가도 됩니다. 묵시적으로 줄 결합하는 줄 들 간에는 NEWLINE 토큰이 만들어지지 않습니다. 묵시적으로 이어지는 줄들은 삼중 따옴표 된 문자열들에서도 등장할 수 있는데 (아래를 보라), 이 경우는 주석이 포함될 수 없습니다.

@node 빈 줄,들여쓰기,묵시적인 줄 결합,줄 구조 Line structure
@anchor{reference/lexical_analysis blank-lines}@anchor{22ac}@anchor{reference/lexical_analysis id6}@anchor{22ad}
@subsubsection 빈 줄


@geindex 빈 줄

A logical line that contains only spaces, tabs, formfeeds and possibly a
comment, is ignored (i.e., no @ref{2291,,NEWLINE} token is generated).
During interactive input of statements, handling of a blank line may differ
depending on the implementation of the read-eval-print loop.
In the standard interactive interpreter, an entirely blank logical line (that
is, one containing not even whitespace or a comment) terminates a multi-line
statement.

@node 들여쓰기,토큰 사이의 공백,빈 줄,줄 구조 Line structure
@anchor{reference/lexical_analysis id7}@anchor{22ae}@anchor{reference/lexical_analysis indentation}@anchor{2299}
@subsubsection 들여쓰기


@geindex 들여쓰기
@geindex 선행 공백
@geindex 스페이스
@geindex 탭
@geindex 묶음
@geindex 문장 묶음

논리적인 줄의 제일 앞에 오는 공백(스페이스와 탭)은 줄의 들여쓰기 수준을 계산하는 데 사용되고, 이는 다시 문장들의 묶음을 결정하는 데 사용되게 됩니다.

탭은 (왼쪽에서 오른쪽으로) 1~8개의 스페이스로 변환되는데, 치환된 후의 총 스페이스 문자 수가 8의 배수가 되도록 맞춥니다. (유닉스에서 사용되는 규칙에 맞추려는 것입니다.) 첫 번째 비 공백 문자 앞에 나오는 공백의 총수가 줄의 들여쓰기를 결정합니다. 들여쓰기는 역 슬래시를 사용해서 여러 개의 물리적인 줄로 나눠질 수 없습니다; 첫 번째 역 슬래시 이전의 공백이 들여쓰기를 결정합니다.

소스 파일이 탭과 스페이스를 섞어 쓰는 경우, 탭이 몇 개의 스페이스에 해당하는지에 따라 다르게 해석될 수 있으면 @ref{764,,TabError} 를 일으킵니다.

`크로스-플랫폼 호환성 유의 사항:' UNIX 이외의 플랫폼에서 편집기들이 동작하는 방식 때문에, 하나의 파일 내에서 들여쓰기를 위해 탭과 스페이스를 섞어 쓰는 것은 현명한 선택이 아닙니다. 다른 플랫폼들에서는 최대 들여쓰기 수준에 제한이 있을 수도 있다는 점도 주의해야 합니다.

폼 피드 문자는 줄의 처음에 나올 수 있습니다; 앞서 설명한 들여쓰기 수준 계산에서는 무시됩니다. 선행 공백의 다른 곳에 등장하는 폼 피드 문자는 정의되지 않은 효과를 줍니다 (가령, 스페이스 수가 0으로 초기화될 수 있습니다).

@geindex INDENT 토큰
@geindex DEDENT 토큰

The indentation levels of consecutive lines are used to generate
@ref{20fa,,INDENT} and @ref{22af,,DEDENT} tokens, using a stack,
as follows.

Before the first line of the file is read, a single zero is pushed on the stack;
this will never be popped off again.  The numbers pushed on the stack will
always be strictly increasing from bottom to top.  At the beginning of each
logical line, the line’s indentation level is compared to the top of the stack.
If it is equal, nothing happens. If it is larger, it is pushed on the stack, and
one @code{INDENT} token is generated.  If it is smaller, it `must' be one of the
numbers occurring on the stack; all numbers on the stack that are larger are
popped off, and for each number popped off a @code{DEDENT} token is generated.
At the end of the file, a @code{DEDENT} token is generated for each number
remaining on the stack that is larger than zero.

여기에 (혼란스럽다 할지라도) 올바르게 들여쓰기 된 파이썬 코드 조각이 있습니다:

@example
def perm(l):
        # l 의 모든 순열의 리스트를 계산합니다
    if len(l) <= 1:
                  return [l]
    r = []
    for i in range(len(l)):
             s = l[:i] + l[i+1:]
             p = perm(s)
             for x in p:
              r.append(l[i:i+1] + x)
    return r
@end example

다음 예는 여러 가지 들여쓰기 에러를 보여줍니다:

@example
def perm(l):                       # 에러: 첫 줄을 들여쓰기 했습니다
for i in range(len(l)):             # 에러: 들여쓰지 않았습니다
    s = l[:i] + l[i+1:]
        p = perm(l[:i] + l[i+1:])   # 에러: 예기치 않은 들여쓰기
        for x in p:
                r.append(l[i:i+1] + x)
            return r                # 에러: 일관성 없는 내어쓰기
@end example

(사실, 처음 세 개의 에러는 파서가 감지합니다. 단지 마지막 에러만 어휘 분석기가 감지합니다. — @code{return r} 의 들여쓰기가 스택에 있는 값과 일치하지 않습니다.)

@node 토큰 사이의 공백,End marker,들여쓰기,줄 구조 Line structure
@anchor{reference/lexical_analysis whitespace}@anchor{2290}@anchor{reference/lexical_analysis whitespace-between-tokens}@anchor{22b0}
@subsubsection 토큰 사이의 공백


Except at the beginning of a logical line or in string literals, the whitespace
characters space, tab and formfeed can be used interchangeably to separate
tokens:

@example
@anchor{reference/lexical_analysis grammar-token-python-grammar-whitespace}@anchor{22b1}whitespace:  ' ' | tab | formfeed
@end example

Whitespace is needed between two tokens only if their concatenation
could otherwise be interpreted as a different token. For example, @code{ab} is one
token, but @code{a b} is two tokens. However, @code{+a} and @code{+ a} both produce
two tokens, @code{+} and @code{a}, as @code{+a} is not a valid token.

@node End marker,,토큰 사이의 공백,줄 구조 Line structure
@anchor{reference/lexical_analysis end-marker}@anchor{22b2}@anchor{reference/lexical_analysis endmarker-token}@anchor{229f}
@subsubsection End marker


At the end of non-interactive input, the lexical analyzer generates an
@ref{22b3,,ENDMARKER} token.

@node 다른 토큰들,Names identifiers and keywords,줄 구조 Line structure,어휘 분석
@anchor{reference/lexical_analysis id8}@anchor{22b4}@anchor{reference/lexical_analysis other-tokens}@anchor{22b5}
@subsection 다른 토큰들


Besides @ref{2291,,NEWLINE}, @ref{20fa,,INDENT} and @ref{22af,,DEDENT},
the following categories of tokens exist:
`identifiers' and `keywords' (@ref{22b6,,NAME}), `literals' (such as
@ref{22b7,,NUMBER} and @ref{22b8,,STRING}), and other symbols
(`operators' and `delimiters', @ref{2287,,OP}).
Whitespace characters (other than logical line terminators, discussed earlier)
are not tokens, but serve to delimit tokens.
Where ambiguity exists, a token comprises the longest possible string that
forms a legal token, when read from left to right.

@node Names identifiers and keywords,리터럴,다른 토큰들,어휘 분석
@anchor{reference/lexical_analysis identifiers}@anchor{229d}@anchor{reference/lexical_analysis names-identifiers-and-keywords}@anchor{22b9}
@subsection Names (identifiers and keywords)


@geindex 식별자
@geindex 이름

@ref{22b6,,NAME} tokens represent `identifiers', `keywords', and
`soft keywords'.

Names are composed of the following characters:


@itemize *

@item 
uppercase and lowercase letters (@code{A-Z} and @code{a-z}),

@item 
the underscore (@code{_}),

@item 
digits (@code{0} through @code{9}), which cannot appear as the first character, and

@item 
non-ASCII characters. Valid names may only contain “letter-like” and
“digit-like” characters; see @ref{22ba,,Non-ASCII characters in names} for details.
@end itemize

Names must contain at least one character, but have no upper length limit.
Case is significant.

Formally, names are described by the following lexical definitions:

@example
@anchor{reference/lexical_analysis grammar-token-python-grammar-NAME}@anchor{22bb}NAME:          @ref{22bc,,name_start} @ref{22bd,,name_continue}*
@anchor{reference/lexical_analysis grammar-token-python-grammar-name_start}@anchor{22bc}name_start:    "a"..."z" | "A"..."Z" | "_" | <non-ASCII character>
@anchor{reference/lexical_analysis grammar-token-python-grammar-name_continue}@anchor{22bd}name_continue: name_start | "0"..."9"
@anchor{reference/lexical_analysis grammar-token-python-grammar-identifier}@anchor{22be}identifier:    <@ref{22bb,,NAME}, except keywords>
@end example

Note that not all names matched by this grammar are valid; see
@ref{22ba,,Non-ASCII characters in names} for details.

@menu
* 키워드:: 
* 소프트 키워드:: 
* 식별자의 예약 영역:: 
* Non-ASCII characters in names:: 

@end menu

@node 키워드,소프트 키워드,,Names identifiers and keywords
@anchor{reference/lexical_analysis id9}@anchor{22bf}@anchor{reference/lexical_analysis keywords}@anchor{2286}
@subsubsection 키워드


@geindex 키워드
@geindex 예약어

The following names are used as reserved words, or `keywords' of the
language, and cannot be used as ordinary identifiers.  They must be spelled
exactly as written here:

@example
False      await      else       import     pass
None       break      except     in         raise
True       class      finally    is         return
and        continue   for        lambda     try
as         def        from       nonlocal   while
assert     del        global     not        with
async      elif       if         or         yield
@end example

@node 소프트 키워드,식별자의 예약 영역,키워드,Names identifiers and keywords
@anchor{reference/lexical_analysis id10}@anchor{22c0}@anchor{reference/lexical_analysis soft-keywords}@anchor{a0d}
@subsubsection 소프트 키워드


@geindex 소프트 키워드
@geindex 키워드


Added in version 3.10.


Some names are only reserved under specific contexts. These are known as
`soft keywords':


@itemize -

@item 
@code{match}, @code{case}, and @code{_}, when used in the @ref{a0e,,match} statement.

@item 
@code{type}, when used in the @ref{66b,,type} statement.
@end itemize

These syntactically act as keywords in their specific contexts,
but this distinction is done at the parser level, not when tokenizing.

As soft keywords, their use in the grammar is possible while still
preserving compatibility with existing code that uses these names as
identifier names.


버전 3.12에서 변경: @code{type} is now a soft keyword.


@geindex _@comma{} 식별자
@geindex __@comma{} 식별자

@node 식별자의 예약 영역,Non-ASCII characters in names,소프트 키워드,Names identifiers and keywords
@anchor{reference/lexical_analysis id-classes}@anchor{22c1}@anchor{reference/lexical_analysis reserved-classes-of-identifiers}@anchor{22c2}
@subsubsection 식별자의 예약 영역


(키워드와는 별개로) 어떤 부류의 식별자들은 특별한 의미가 있습니다. 이 부류의 식별자들은 시작과 끝의 밑줄 문자 패턴으로 구분됩니다:


@table @asis

@item @code{_*}

@code{from module import *} 에 의해 임포트되지 않습니다.

@item @code{_}

In a @code{case} pattern within a @ref{a0e,,match} statement, @code{_} is a
@ref{a0d,,soft keyword} that denotes a
@ref{a0f,,wildcard}.

한편, 대화형 인터프리터는 마지막 평가 결과물을 변수 @code{_}에 저장합니다. (@code{print} 와 같은 내장 함수와 함께, @ref{13,,builtins} 모듈에 저장됩니다.)

Elsewhere, @code{_} is a regular identifier. It is often used to name
“special” items, but it is not special to Python itself.

@cartouche
@quotation 참고 
이름 @code{_} 은 종종 국제화(internationalization)와 관련되어 사용됩니다. 이 관례에 관해서는 @ref{67,,gettext} 모듈의 문서를 참조하십시오.

It is also commonly used for unused variables.
@end quotation
@end cartouche

@item @code{__*__}

시스템 정의 이름, 비공식적으로 “던더(dunder)” 이름이라고 알려졌습니다. 이 이름들은 인터프리터와 그 구현(표준 라이브러리를 포함합니다)이 정의합니다. 현재 정의된 시스템 이름은 @ref{e67,,특수 메서드 이름들} 섹션과 그 외의 곳에서 논의됩니다. 파이썬의 미래 버전에서는 더 많은 것들이 정의될 가능성이 큽니다. 어떤 문맥에서건, 명시적으로 문서로 만들어진 사용법을 벗어나는 @code{__*__} 이름의 `모든' 사용은, 경고 없이 손상될 수 있습니다.

@item @code{__*}

클래스-비공개 이름. 이 부류의 이름들을 클래스 정의 문맥에서 사용하면 뒤섞인 형태로 변형됩니다. 부모 클래스와 자식 클래스의 “비공개(private)” 어트리뷰트 간의 이름 충돌을 피하기 위함입니다. @ref{22c3,,식별자 (이름)} 섹션을 보세요.
@end table

@node Non-ASCII characters in names,,식별자의 예약 영역,Names identifiers and keywords
@anchor{reference/lexical_analysis lexical-names-nonascii}@anchor{22ba}@anchor{reference/lexical_analysis non-ascii-characters-in-names}@anchor{22c4}
@subsubsection Non-ASCII characters in names


Names that contain non-ASCII characters need additional normalization
and validation beyond the rules and grammar explained
@ref{229d,,above}.
For example, @code{ř_1}, @code{蛇}, or @code{साँप}  are valid names, but @code{r〰2},
@code{€}, or @code{🐍} are not.

This section explains the exact rules.

All names are converted into the normalization form@footnote{https://www.unicode.org/reports/tr15/#Norm_Forms} NFKC while parsing.
This means that, for example, some typographic variants of characters are
converted to their “basic” form. For example, @code{ﬁⁿₐˡᵢᶻₐᵗᵢᵒₙ} normalizes to
@code{finalization}, so Python treats them as the same name:

@example
>>> ﬁⁿₐˡᵢᶻₐᵗᵢᵒₙ = 3
>>> finalization
3
@end example

@cartouche
@quotation 참고 
Normalization is done at the lexical level only.
Run-time functions that take names as `strings' generally do not normalize
their arguments.
For example, the variable defined above is accessible at run time in the
@ref{1c08,,globals()} dictionary as @code{globals()["finalization"]} but not
@code{globals()["ﬁⁿₐˡᵢᶻₐᵗᵢᵒₙ"]}.
@end quotation
@end cartouche

Similarly to how ASCII-only names must contain only letters, digits and
the underscore, and cannot start with a digit, a valid name must
start with a character in the “letter-like” set @code{xid_start},
and the remaining characters must be in the “letter- and digit-like” set
@code{xid_continue}.

These sets based on the `XID_Start' and `XID_Continue' sets as defined by the
Unicode standard annex UAX-31@footnote{https://www.unicode.org/reports/tr31/}.
Python’s @code{xid_start} additionally includes the underscore (@code{_}).
Note that Python does not necessarily conform to UAX-31@footnote{https://www.unicode.org/reports/tr31/}.

A non-normative listing of characters in the `XID_Start' and `XID_Continue'
sets as defined by Unicode is available in the DerivedCoreProperties.txt@footnote{https://www.unicode.org/Public/16.0.0/ucd/DerivedCoreProperties.txt}
file in the Unicode Character Database.
For reference, the construction rules for the @code{xid_*} sets are given below.

The set @code{id_start} is defined as the union of:


@itemize *

@item 
Unicode category @code{<Lu>} - uppercase letters (includes @code{A} to @code{Z})

@item 
Unicode category @code{<Ll>} - lowercase letters (includes @code{a} to @code{z})

@item 
Unicode category @code{<Lt>} - titlecase letters

@item 
Unicode category @code{<Lm>} - modifier letters

@item 
Unicode category @code{<Lo>} - other letters

@item 
Unicode category @code{<Nl>} - letter numbers

@item 
@{@code{"_"}@} - the underscore

@item 
@code{<Other_ID_Start>} - an explicit set of characters in PropList.txt@footnote{https://www.unicode.org/Public/16.0.0/ucd/PropList.txt}
to support backwards compatibility
@end itemize

The set @code{xid_start} then closes this set under NFKC normalization, by
removing all characters whose normalization is not of the form
@code{id_start id_continue*}.

The set @code{id_continue} is defined as the union of:


@itemize *

@item 
@code{id_start} (see above)

@item 
Unicode category @code{<Nd>} - decimal numbers (includes @code{0} to @code{9})

@item 
Unicode category @code{<Pc>} - connector punctuations

@item 
Unicode category @code{<Mn>} - nonspacing marks

@item 
Unicode category @code{<Mc>} - spacing combining marks

@item 
@code{<Other_ID_Continue>} - another explicit set of characters in
PropList.txt@footnote{https://www.unicode.org/Public/16.0.0/ucd/PropList.txt} to support backwards compatibility
@end itemize

Again, @code{xid_continue} closes this set under NFKC normalization.

Unicode categories use the version of the Unicode Character Database as
included in the @ref{10b,,unicodedata} module.


@subsubheading 더 보기



@itemize *

@item 
@geindex Python 향상 제안; PEP 3131
PEP 3131@footnote{https://peps.python.org/pep-3131/} – Supporting Non-ASCII Identifiers

@item 
@geindex Python 향상 제안; PEP 672
PEP 672@footnote{https://peps.python.org/pep-0672/} – Unicode-related Security Considerations for Python
@end itemize


@node 리터럴,문자열과 바이트열 리터럴,Names identifiers and keywords,어휘 분석
@anchor{reference/lexical_analysis id11}@anchor{22c5}@anchor{reference/lexical_analysis literals}@anchor{22c6}
@subsection 리터럴


@geindex 리터럴
@geindex 상수

리터럴(literal)은 몇몇 내장형들의 상숫값을 위한 표기법입니다.

In terms of lexical analysis, Python has @ref{229c,,string@comma{} bytes}
and @ref{229e,,numeric} literals.

Other “literals” are lexically denoted using @ref{2286,,keywords}
(@code{None}, @code{True}, @code{False}) and the special
@ref{22c7,,ellipsis token} (@code{...}).

@geindex 문자열 리터럴
@geindex 바이트열 리터럴
@geindex ASCII
@geindex ' (작은따옴표);문자열 리터럴
@geindex " (큰따옴표);문자열 리터럴

@node 문자열과 바이트열 리터럴,숫자 리터럴,리터럴,어휘 분석
@anchor{reference/lexical_analysis string-and-bytes-literals}@anchor{22c8}@anchor{reference/lexical_analysis strings}@anchor{229c}
@subsection 문자열과 바이트열 리터럴


String literals are text enclosed in single quotes (@code{'}) or double
quotes (@code{"}). For example:

@example
"spam"
'eggs'
@end example

The quote used to start the literal also terminates it, so a string literal
can only contain the other quote (except with escape sequences, see below).
For example:

@example
'Say "Hello", please.'
"Don't do that!"
@end example

Except for this limitation, the choice of quote character (@code{'} or @code{"})
does not affect how the literal is parsed.

Inside a string literal, the backslash (@code{\}) character introduces an
`escape sequence', which has special meaning depending on the character
after the backslash.
For example, @code{\"} denotes the double quote character, and does `not' end
the string:

@example
>>> print("Say \"Hello\" to everyone!")
Say "Hello" to everyone!
@end example

See @ref{686,,escape sequences} below for a full list of such
sequences, and more details.

@geindex 삼중 따옴표 문자열
@geindex """;문자열 리터럴
@geindex '@w{'}';문자열 리터럴

@menu
* Triple-quoted strings:: 
* String prefixes:: 
* Formal grammar:: 
* 이스케이프 시퀀스:: 
* Bytes literals:: 
* Raw string literals:: 
* 포맷 문자열 리터럴: 포맷 문자열 리터럴<2>. 
* t-strings:: 
* Formal grammar for f-strings:: 

@end menu

@node Triple-quoted strings,String prefixes,,문자열과 바이트열 리터럴
@anchor{reference/lexical_analysis triple-quoted-strings}@anchor{22c9}
@subsubsection Triple-quoted strings


Strings can also be enclosed in matching groups of three single or double
quotes.
These are generally referred to as `triple-quoted strings':

@example
"""This is a triple-quoted string."""
@end example

In triple-quoted literals, unescaped quotes are allowed (and are
retained), except that three unescaped quotes in a row terminate the literal,
if they are of the same kind (@code{'} or @code{"}) used at the start:

@example
"""This string has "quotes" inside."""
@end example

Unescaped newlines are also allowed and retained:

@example
'@w{'}'This triple-quoted string
continues on the next line.'@w{'}'
@end example

@geindex u';문자열 리터럴
@geindex u";문자열 리터럴

@node String prefixes,Formal grammar,Triple-quoted strings,문자열과 바이트열 리터럴
@anchor{reference/lexical_analysis string-prefixes}@anchor{22ca}
@subsubsection String prefixes


String literals can have an optional `prefix' that influences how the
content of the literal is parsed, for example:

@example
b"data"
f'@{result=@}'
@end example

The allowed prefixes are:


@itemize *

@item 
@code{b}: @ref{22cb,,Bytes literal}

@item 
@code{r}: @ref{22cc,,Raw string}

@item 
@code{f}: @ref{19a,,Formatted string literal} (“f-string”)

@item 
@code{t}: @ref{17fd,,Template string literal} (“t-string”)

@item 
@code{u}: No effect (allowed for backwards compatibility)
@end itemize

See the linked sections for details on each type.

Prefixes are case-insensitive (for example, ‘@code{B}’ works the same as ‘@code{b}’).
The ‘@code{r}’ prefix can be combined with ‘@code{f}’, ‘@code{t}’ or ‘@code{b}’, so ‘@code{fr}’,
‘@code{rf}’, ‘@code{tr}’, ‘@code{rt}’, ‘@code{br}’, and ‘@code{rb}’ are also valid prefixes.


Added in version 3.3: 날 바이트열 리터럴의 @code{'br'} 와 같은 의미가 있는 @code{'rb'} 접두어가 추가되었습니다.

파이썬 2.x 와 3.x 에서 동시에 지원하는 코드들의 유지보수를 단순화하기 위해 예전에 사용되던 유니코드 리터럴 (@code{u'value'})이 다시 도입되었습니다. 자세한 정보는 
@geindex Python 향상 제안; PEP 414
PEP 414@footnote{https://peps.python.org/pep-0414/} 에 나옵니다.


@node Formal grammar,이스케이프 시퀀스,String prefixes,문자열과 바이트열 리터럴
@anchor{reference/lexical_analysis formal-grammar}@anchor{22cd}
@subsubsection Formal grammar


String literals, except @ref{19a,,“f-strings”} and
@ref{17fd,,“t-strings”}, are described by the
following lexical definitions.

These definitions use @ref{228b,,negative lookaheads} (@code{!})
to indicate that an ending quote ends the literal.

@example
@anchor{reference/lexical_analysis grammar-token-python-grammar-STRING}@anchor{22ce}STRING:          [@ref{22cf,,stringprefix}] (@ref{22d0,,stringcontent})
@anchor{reference/lexical_analysis grammar-token-python-grammar-stringprefix}@anchor{22cf}stringprefix:    <("r" | "u" | "b" | "br" | "rb"), case-insensitive>
@anchor{reference/lexical_analysis grammar-token-python-grammar-stringcontent}@anchor{22d0}stringcontent:
   | "'@w{'}'" ( !"'@w{'}'" @ref{22d1,,longstringitem})* "'@w{'}'"
   | '"""' ( !'"""' @ref{22d1,,longstringitem})* '"""'
   | "'" ( !"'" @ref{22d2,,stringitem})* "'"
   | '"' ( !'"' @ref{22d2,,stringitem})* '"'
@anchor{reference/lexical_analysis grammar-token-python-grammar-stringitem}@anchor{22d2}stringitem:      @ref{22d3,,stringchar} | @ref{22d4,,stringescapeseq}
@anchor{reference/lexical_analysis grammar-token-python-grammar-stringchar}@anchor{22d3}stringchar:      <any @ref{22a9,,source_character}, except backslash and newline>
@anchor{reference/lexical_analysis grammar-token-python-grammar-longstringitem}@anchor{22d1}longstringitem:  @ref{22d2,,stringitem} | newline
@anchor{reference/lexical_analysis grammar-token-python-grammar-stringescapeseq}@anchor{22d4}stringescapeseq: "\" <any @ref{22a9,,source_character}>
@end example

Note that as in all lexical definitions, whitespace is significant.
In particular, the prefix (if any) must be immediately followed by the starting
quote.

@geindex 물리적인 줄
@geindex 이스케이프 시퀀스
@geindex 표준 C
@geindex C
@geindex \ (역 슬래시);이스케이프 시퀀스
@geindex \\;이스케이프 시퀀스
@geindex \a;이스케이프 시퀀스
@geindex \b;이스케이프 시퀀스
@geindex \f;이스케이프 시퀀스
@geindex \n;이스케이프 시퀀스
@geindex \r;이스케이프 시퀀스
@geindex \t;이스케이프 시퀀스
@geindex \v;이스케이프 시퀀스
@geindex \x;이스케이프 시퀀스
@geindex \N;이스케이프 시퀀스
@geindex \u;이스케이프 시퀀스
@geindex \U;이스케이프 시퀀스

@node 이스케이프 시퀀스,Bytes literals,Formal grammar,문자열과 바이트열 리터럴
@anchor{reference/lexical_analysis escape-sequences}@anchor{686}@anchor{reference/lexical_analysis id12}@anchor{22d5}
@subsubsection 이스케이프 시퀀스


Unless an ‘@code{r}’ or ‘@code{R}’ prefix is present, escape sequences in string and
bytes literals are interpreted according to rules similar to those used by
Standard C.  The recognized escape sequences are:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

이스케이프 시퀀스

@tab

의미

@item

@code{\}<newline>

@tab

@ref{22d6,,Ignored end of line}

@item

@code{\\}

@tab

@ref{22d7,,Backslash}

@item

@code{\'}

@tab

@ref{22d7,,Single quote}

@item

@code{\"}

@tab

@ref{22d7,,Double quote}

@item

@code{\a}

@tab

ASCII 벨 (BEL)

@item

@code{\b}

@tab

ASCII 백스페이스 (BS)

@item

@code{\f}

@tab

ASCII 폼 피드 (FF)

@item

@code{\n}

@tab

ASCII 라인 피드 (LF)

@item

@code{\r}

@tab

ASCII 캐리지 리턴 (CR)

@item

@code{\t}

@tab

ASCII 가로 탭 (TAB)

@item

@code{\v}

@tab

ASCII 세로 탭 (VT)

@item

@code{\@var{ooo}}

@tab

@ref{22d8,,Octal character}

@item

@code{\x@var{hh}}

@tab

@ref{22d9,,Hexadecimal character}

@item

@code{\N@{@var{name}@}}

@tab

@ref{22da,,Named Unicode character}

@item

@code{\u@var{xxxx}}

@tab

@ref{22db,,Hexadecimal Unicode character}

@item

@code{\U@var{xxxxxxxx}}

@tab

@ref{22db,,Hexadecimal Unicode character}

@end multitable


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

@end menu

@node Ignored end of line,Escaped characters,,이스케이프 시퀀스
@anchor{reference/lexical_analysis ignored-end-of-line}@anchor{22dc}@anchor{reference/lexical_analysis string-escape-ignore}@anchor{22d6}
@subsubsection Ignored end of line


A backslash can be added at the end of a line to ignore the newline:

@example
>>> 'This string will not include \
... backslashes or newline characters.'
'This string will not include backslashes or newline characters.'
@end example

The same result can be achieved using @ref{229c,,triple-quoted strings},
or parentheses and @ref{22dd,,string literal concatenation}.

@node Escaped characters,Octal character,Ignored end of line,이스케이프 시퀀스
@anchor{reference/lexical_analysis escaped-characters}@anchor{22de}@anchor{reference/lexical_analysis string-escape-escaped-char}@anchor{22d7}
@subsubsection Escaped characters


To include a backslash in a non-@ref{22cc,,raw} Python string
literal, it must be doubled. The @code{\\} escape sequence denotes a single
backslash character:

@example
>>> print('C:\\Program Files')
C:\Program Files
@end example

Similarly, the @code{\'} and @code{\"} sequences denote the single and double
quote character, respectively:

@example
>>> print('\' and \"')
' and "
@end example

@node Octal character,Hexadecimal character,Escaped characters,이스케이프 시퀀스
@anchor{reference/lexical_analysis octal-character}@anchor{22df}@anchor{reference/lexical_analysis string-escape-oct}@anchor{22d8}
@subsubsection Octal character


The sequence @code{\@var{ooo}} denotes a `character' with the octal (base 8)
value `ooo':

@example
>>> '\120'
'P'
@end example

Up to three octal digits (0 through 7) are accepted.

In a bytes literal, `character' means a `byte' with the given value.
In a string literal, it means a Unicode character with the given value.


버전 3.11에서 변경: Octal escapes with value larger than @code{0o377} (255) produce a
@ref{1a3,,DeprecationWarning}.



버전 3.12에서 변경: Octal escapes with value larger than @code{0o377} (255) produce a
@ref{1ae,,SyntaxWarning}.
In a future Python version they will raise a @ref{18e,,SyntaxError}.


@node Hexadecimal character,Named Unicode character,Octal character,이스케이프 시퀀스
@anchor{reference/lexical_analysis hexadecimal-character}@anchor{22e0}@anchor{reference/lexical_analysis string-escape-hex}@anchor{22d9}
@subsubsection Hexadecimal character


The sequence @code{\x@var{hh}} denotes a `character' with the hex (base 16)
value `hh':

@example
>>> '\x50'
'P'
@end example

표준 C와는 달리, 정확히 두 개의 16진수가 제공되어야 합니다.

In a bytes literal, `character' means a `byte' with the given value.
In a string literal, it means a Unicode character with the given value.

@node Named Unicode character,Hexadecimal Unicode characters,Hexadecimal character,이스케이프 시퀀스
@anchor{reference/lexical_analysis named-unicode-character}@anchor{22e1}@anchor{reference/lexical_analysis string-escape-named}@anchor{22da}
@subsubsection Named Unicode character


The sequence @code{\N@{@var{name}@}} denotes a Unicode character
with the given `name':

@example
>>> '\N@{LATIN CAPITAL LETTER P@}'
'P'
>>> '\N@{SNAKE@}'
'🐍'
@end example

This sequence cannot appear in @ref{22cb,,bytes literals}.


버전 3.3에서 변경: Support for name aliases@footnote{https://www.unicode.org/Public/16.0.0/ucd/NameAliases.txt}
has been added.


@node Hexadecimal Unicode characters,Unrecognized escape sequences,Named Unicode character,이스케이프 시퀀스
@anchor{reference/lexical_analysis hexadecimal-unicode-characters}@anchor{22e2}@anchor{reference/lexical_analysis string-escape-long-hex}@anchor{22db}
@subsubsection Hexadecimal Unicode characters


These sequences @code{\u@var{xxxx}} and @code{\U@var{xxxxxxxx}} denote the
Unicode character with the given hex (base 16) value.
Exactly four digits are required for @code{\u}; exactly eight digits are
required for @code{\U}.
The latter can encode any Unicode character.

@example
>>> '\u1234'
'ሴ'
>>> '\U0001f40d'
'🐍'
@end example

These sequences cannot appear in @ref{22cb,,bytes literals}.

@geindex 인식되지 않는 이스케이프 시퀀스

@node Unrecognized escape sequences,,Hexadecimal Unicode characters,이스케이프 시퀀스
@anchor{reference/lexical_analysis unrecognized-escape-sequences}@anchor{22e3}
@subsubsection Unrecognized escape sequences


Unlike in Standard C, all unrecognized escape sequences are left in the string
unchanged, that is, `the backslash is left in the result':

@example
>>> print('\q')
\q
>>> list('\q')
['\\', 'q']
@end example

Note that for bytes literals, the escape sequences only recognized in string
literals (@code{\N...}, @code{\u...}, @code{\U...}) fall into the category of
unrecognized escapes.


버전 3.6에서 변경: Unrecognized escape sequences produce a @ref{1a3,,DeprecationWarning}.



버전 3.12에서 변경: Unrecognized escape sequences produce a @ref{1ae,,SyntaxWarning}.
In a future Python version they will raise a @ref{18e,,SyntaxError}.


@geindex b';바이트열 리터럴
@geindex b";바이트열 리터럴

@node Bytes literals,Raw string literals,이스케이프 시퀀스,문자열과 바이트열 리터럴
@anchor{reference/lexical_analysis bytes-literal}@anchor{22cb}@anchor{reference/lexical_analysis bytes-literals}@anchor{22e4}
@subsubsection Bytes literals


`Bytes literals' are always prefixed with ‘@code{b}’ or ‘@code{B}’; they produce an
instance of the @ref{192,,bytes} type instead of the @ref{169,,str} type.
They may only contain ASCII characters; bytes with a numeric value of 128
or greater must be expressed with escape sequences (typically
@ref{22d9,,Hexadecimal character} or @ref{22d8,,Octal character}):

@example
>>> b'\x89PNG\r\n\x1a\n'
b'\x89PNG\r\n\x1a\n'
>>> list(b'\x89PNG\r\n\x1a\n')
[137, 80, 78, 71, 13, 10, 26, 10]
@end example

Similarly, a zero byte must be expressed using an escape sequence (typically
@code{\0} or @code{\x00}).

@geindex r';날 문자열 리터럴
@geindex r";날 문자열 리터럴

@node Raw string literals,포맷 문자열 리터럴<2>,Bytes literals,문자열과 바이트열 리터럴
@anchor{reference/lexical_analysis raw-string-literals}@anchor{22e5}@anchor{reference/lexical_analysis raw-strings}@anchor{22cc}
@subsubsection Raw string literals


Both string and bytes literals may optionally be prefixed with a letter ‘@code{r}’
or ‘@code{R}’; such constructs are called `raw string literals'
and `raw bytes literals' respectively and treat backslashes as
literal characters.
As a result, in raw string literals, @ref{686,,escape sequences}
are not treated specially:

@example
>>> r'\d@{4@}-\d@{2@}-\d@{2@}'
'\\d@{4@}-\\d@{2@}-\\d@{2@}'
@end example

날 리터럴에서 조차, 따옴표는 역 슬래시로 이스케이프 됩니다. 하지만 역 슬래시가 결과에 남게 됩니다; 예를 들어, @code{r"\""} 는 올바른 문자열 리터럴인데, 두 개의 문자가 들어있습니다: 역 슬래시와 큰따옴표; @code{r"\"} 는 올바른 문자열 리터럴이 아닙니다 (날 문자열조차 홀수개의 역 슬래시로 끝날 수 없습니다.). 좀 더 명확하게 말하자면, 날 리터럴은 하나의 역 슬래시로 끝날 수 없습니다(역 슬래시가 뒤에 오는 따옴표를 이스케이프 시키기 때문입니다). 역 슬래시와 바로 뒤에 오는 개행문자는 줄 결합이 `아니라' 리터럴에 포함되는 두 개의 문자로 인식됨에 주의해야 합니다.

@geindex 포맷 문자열 리터럴
@geindex 보간된 문자열 리터럴
@geindex 문자열;포맷 리터럴
@geindex 문자열;보간된 리터럴
@geindex 포맷 문자열 리터럴
@geindex 포맷 문자열 리터럴
@geindex f';포맷 문자열 리터럴
@geindex f";포맷 문자열 리터럴
@geindex @{@} (중괄호);포맷 문자열 리터럴에서
@geindex ! (느낌표);포맷 문자열 리터럴에서
@geindex ; (콜론);포맷 문자열 리터럴에서
@geindex = (등호);문자열 리터럴을 사용한 디버깅을 도울 목적으로
@anchor{reference/lexical_analysis f-strings}@anchor{19a}
@node 포맷 문자열 리터럴<2>,t-strings,Raw string literals,문자열과 바이트열 리터럴
@anchor{reference/lexical_analysis formatted-string-literals}@anchor{22e6}@anchor{reference/lexical_analysis id13}@anchor{22e7}
@subsubsection 포맷 문자열 리터럴



Added in version 3.6.



버전 3.7에서 변경: The @ref{18d,,await} and @ref{c9f,,async for} can be used in expressions
within f-strings.



버전 3.8에서 변경: Added the debug specifier (@code{=})



버전 3.12에서 변경: Many restrictions on expressions within f-strings have been removed.
Notably, nested strings, comments, and backslashes are now permitted.


A `formatted string literal' or `f-string' is a string literal
that is prefixed with ‘@code{f}’ or ‘@code{F}’.
Unlike other string literals, f-strings do not have a constant value.
They may contain `replacement fields' delimited by curly braces @code{@{@}}.
Replacement fields contain expressions which are evaluated at run time.
For example:

@example
>>> who = 'nobody'
>>> nationality = 'Spanish'
>>> f'@{who.title()@} expects the @{nationality@} Inquisition!'
'Nobody expects the Spanish Inquisition!'
@end example

Any doubled curly braces (@code{@{@{} or @code{@}@}}) outside replacement fields
are replaced with the corresponding single curly brace:

@example
>>> print(f'@{@{...@}@}')
@{...@}
@end example

Other characters outside replacement fields are treated like in ordinary
string literals.
This means that escape sequences are decoded (except when a literal is
also marked as a raw string), and newlines are possible in triple-quoted
f-strings:

@example
>>> name = 'Galahad'
>>> favorite_color = 'blue'
>>> print(f'@{name@}:\t@{favorite_color@}')
Galahad:       blue
>>> print(rf"C:\Users\@{name@}")
C:\Users\Galahad
>>> print(f'@w{'}'Three shall be the number of the counting
... and the number of the counting shall be three.'@w{'}')
Three shall be the number of the counting
and the number of the counting shall be three.
@end example

Expressions in formatted string literals are treated like regular
Python expressions.
Each expression is evaluated in the context where the formatted string literal
appears, in order from left to right.
An empty expression is not allowed, and both @ref{14a2,,lambda} and
assignment expressions @code{:=} must be surrounded by explicit parentheses:

@example
>>> f'@{(half := 1/2)@}, @{half * 42@}'
'0.5, 21.0'
@end example

Reusing the outer f-string quoting type inside a replacement field is
permitted:

@example
>>> a = dict(x=2)
>>> f"abc @{a["x"]@} def"
'abc 2 def'
@end example

Backslashes are also allowed in replacement fields and are evaluated the same
way as in any other context:

@example
>>> a = ["a", "b", "c"]
>>> print(f"List a contains:\n@{"\n".join(a)@}")
List a contains:
a
b
c
@end example

It is possible to nest f-strings:

@example
>>> name = 'world'
>>> f'Repeated:@{f' hello @{name@}' * 3@}'
'Repeated: hello world hello world hello world'
@end example

Portable Python programs should not use more than 5 levels of nesting.

`CPython 구현 상세:' CPython does not limit nesting of f-strings.

Replacement expressions can contain newlines in both single-quoted and
triple-quoted f-strings and they can contain comments.
Everything that comes after a @code{#} inside a replacement field
is a comment (even closing braces and quotes).
This means that replacement fields with comments must be closed in a
different line:

@example
>>> a = 2
>>> f"abc@{a  # This comment  @}"  continues until the end of the line
...       + 3@}"
'abc5'
@end example

After the expression, replacement fields may optionally contain:


@itemize *

@item 
a `debug specifier' – an equal sign (@code{=}), optionally surrounded by
whitespace on one or both sides;

@item 
a `conversion specifier' – @code{!s}, @code{!r} or @code{!a}; and/or

@item 
a `format specifier' prefixed with a colon (@code{:}).
@end itemize

See the @ref{22e8,,Standard Library section on f-strings}
for details on how these fields are evaluated.

As that section explains, `format specifiers' are passed as the second argument
to the @ref{199,,format()} function to format a replacement field value.
For example, they can be used to specify a field width and padding characters
using the @ref{4f9,,Format Specification Mini-Language}:

@example
>>> number = 14.3
>>> f'@{number:20.7f@}'
'          14.3000000'
@end example

Top-level format specifiers may include nested replacement fields:

@example
>>> field_size = 20
>>> precision = 7
>>> f'@{number:@{field_size@}.@{precision@}f@}'
'          14.3000000'
@end example

These nested fields may include their own conversion fields and
@ref{4f9,,format specifiers}:

@example
>>> number = 3
>>> f'@{number:@{field_size@}@}'
'                   3'
>>> f'@{number:@{field_size:05@}@}'
'00000000000000000003'
@end example

However, these nested fields may not include more deeply nested replacement
fields.

Formatted string literals cannot be used as @ref{22e9,,docstrings},
even if they do not include expressions:

@example
>>> def foo():
...     f"Not a docstring"
...
>>> print(foo.__doc__)
None
@end example


@subsubheading 더 보기



@itemize *

@item 
@geindex Python 향상 제안; PEP 498
PEP 498@footnote{https://peps.python.org/pep-0498/} – Literal String Interpolation

@item 
@geindex Python 향상 제안; PEP 701
PEP 701@footnote{https://peps.python.org/pep-0701/} – Syntactic formalization of f-strings

@item 
@ref{832,,str.format()}, which uses a related format string mechanism.
@end itemize

@anchor{reference/lexical_analysis t-strings}@anchor{17fd}
@node t-strings,Formal grammar for f-strings,포맷 문자열 리터럴<2>,문자열과 바이트열 리터럴
@anchor{reference/lexical_analysis id14}@anchor{22ea}@anchor{reference/lexical_analysis template-string-literals}@anchor{22eb}
@subsubsection t-strings



Added in version 3.14.


A `template string literal' or `t-string' is a string literal
that is prefixed with ‘@code{t}’ or ‘@code{T}’.
These strings follow the same syntax rules as
@ref{19a,,formatted string literals}.
For differences in evaluation rules, see the
@ref{22ec,,Standard Library section on t-strings}

@node Formal grammar for f-strings,,t-strings,문자열과 바이트열 리터럴
@anchor{reference/lexical_analysis formal-grammar-for-f-strings}@anchor{22ed}
@subsubsection Formal grammar for f-strings


F-strings are handled partly by the @ref{228f,,lexical analyzer}, which produces the
tokens @ref{22ee,,FSTRING_START}, @ref{22ef,,FSTRING_MIDDLE}
and @ref{22f0,,FSTRING_END}, and partly by the parser, which handles
expressions in the replacement field.
The exact way the work is split is a CPython implementation detail.

Correspondingly, the f-string grammar is a mix of
@ref{228a,,lexical and syntactic definitions}.

Whitespace is significant in these situations:


@itemize *

@item 
There may be no whitespace in @ref{22ee,,FSTRING_START} (between
the prefix and quote).

@item 
Whitespace in @ref{22ef,,FSTRING_MIDDLE} is part of the literal
string contents.

@item 
In @code{fstring_replacement_field}, if @code{f_debug_specifier} is present,
all whitespace after the opening brace until the @code{f_debug_specifier},
as well as whitespace immediately following @code{f_debug_specifier},
is retained as part of the expression.

`CPython 구현 상세:' The expression is not handled in the tokenization phase; it is
retrieved from the source code using locations of the @code{@{} token
and the token after @code{=}.
@end itemize

The @code{FSTRING_MIDDLE} definition uses
@ref{228b,,negative lookaheads} (@code{!})
to indicate special characters (backslash, newline, @code{@{}, @code{@}}) and
sequences (@code{f_quote}).

@example
@anchor{reference/lexical_analysis grammar-token-python-grammar-fstring}@anchor{22f1}fstring:    @ref{22f2,,FSTRING_START} @ref{22f3,,fstring_middle}* @ref{22f4,,FSTRING_END}

@anchor{reference/lexical_analysis grammar-token-python-grammar-FSTRING_START}@anchor{22f2}FSTRING_START:      @ref{22f5,,fstringprefix} ("'" | '"' | "'@w{'}'" | '"""')
@anchor{reference/lexical_analysis grammar-token-python-grammar-FSTRING_END}@anchor{22f4}FSTRING_END:        @ref{22f6,,f_quote}
@anchor{reference/lexical_analysis grammar-token-python-grammar-fstringprefix}@anchor{22f5}fstringprefix:      <("f" | "fr" | "rf"), case-insensitive>
@anchor{reference/lexical_analysis grammar-token-python-grammar-f_debug_specifier}@anchor{22f7}f_debug_specifier:  '='
@anchor{reference/lexical_analysis grammar-token-python-grammar-f_quote}@anchor{22f6}f_quote:            <the quote character(s) used in FSTRING_START>

@anchor{reference/lexical_analysis grammar-token-python-grammar-fstring_middle}@anchor{22f3}fstring_middle:
   | @ref{22f8,,fstring_replacement_field}
   | @ref{22f9,,FSTRING_MIDDLE}
@anchor{reference/lexical_analysis grammar-token-python-grammar-FSTRING_MIDDLE}@anchor{22f9}FSTRING_MIDDLE:
   | (!"\" !@ref{22a6,,newline} !'@{' !'@}' !@ref{22f6,,f_quote}) @ref{22a9,,source_character}
   | @ref{22d4,,stringescapeseq}
   | "@{@{"
   | "@}@}"
   | <newline, in triple-quoted f-strings only>
@anchor{reference/lexical_analysis grammar-token-python-grammar-fstring_replacement_field}@anchor{22f8}fstring_replacement_field:
   | '@{' @ref{22fa,,f_expression} [@ref{22f7,,f_debug_specifier}] [@ref{22fb,,fstring_conversion}]
         [@ref{22fc,,fstring_full_format_spec}] '@}'
@anchor{reference/lexical_analysis grammar-token-python-grammar-fstring_conversion}@anchor{22fb}fstring_conversion:
   | "!" ("s" | "r" | "a")
@anchor{reference/lexical_analysis grammar-token-python-grammar-fstring_full_format_spec}@anchor{22fc}fstring_full_format_spec:
   | ':' @ref{22fd,,fstring_format_spec}*
@anchor{reference/lexical_analysis grammar-token-python-grammar-fstring_format_spec}@anchor{22fd}fstring_format_spec:
   | @ref{22f9,,FSTRING_MIDDLE}
   | @ref{22f8,,fstring_replacement_field}
@anchor{reference/lexical_analysis grammar-token-python-grammar-f_expression}@anchor{22fa}f_expression:
   | ','.(@ref{22fe,,conditional_expression} | "*" @ref{22ff,,or_expr})+ [","]
   | @ref{2300,,yield_expression}
@end example

@cartouche
@quotation 참고 
In the above grammar snippet, the @code{f_quote} and @code{FSTRING_MIDDLE} rules
are context-sensitive – they depend on the contents of @code{FSTRING_START}
of the nearest enclosing @code{fstring}.

Constructing a more traditional formal grammar from this template is left
as an exercise for the reader.
@end quotation
@end cartouche

The grammar for t-strings is identical to the one for f-strings, with `t'
instead of `f' at the beginning of rule and token names and in the prefix.

@example
@anchor{reference/lexical_analysis grammar-token-python-grammar-tstring}@anchor{2301}tstring:    TSTRING_START tstring_middle* TSTRING_END

<rest of the t-string grammar is omitted; see above>
@end example

@node 숫자 리터럴,Operators and delimiters,문자열과 바이트열 리터럴,어휘 분석
@anchor{reference/lexical_analysis numbers}@anchor{229e}@anchor{reference/lexical_analysis numeric-literals}@anchor{2302}
@subsection 숫자 리터럴


@geindex 숫자
@geindex 숫자 리터럴
@geindex 정수 리터럴
@geindex 실수 리터럴
@geindex 16진수 리터럴
@geindex 8진수 리터럴
@geindex 이진수 리터럴
@geindex 십진수 리터럴
@geindex 허수 리터럴
@geindex 복소수 리터럴

@ref{22b7,,NUMBER} tokens represent numeric literals, of which there are
three types: integers, floating-point numbers, and imaginary numbers.

@example
@anchor{reference/lexical_analysis grammar-token-python-grammar-NUMBER}@anchor{2303}NUMBER: @ref{2304,,integer} | @ref{2305,,floatnumber} | @ref{2306,,imagnumber}
@end example

The numeric value of a numeric literal is the same as if it were passed as a
string to the @ref{19b,,int}, @ref{196,,float} or @ref{197,,complex} class
constructor, respectively.
Note that not all valid inputs for those constructors are also valid literals.

Numeric literals do not include a sign; a phrase like @code{-1} is
actually an expression composed of the unary operator ‘@code{-}’ and the literal
@code{1}.

@geindex 0b;정수 리터럴
@geindex 0o;정수 리터럴
@geindex 0x;정수 리터럴
@geindex _ (밑줄);숫자 리터럴에서

@menu
* 정수 리터럴:: 
* 실수 리터럴:: 
* 허수 리터럴:: 

@end menu

@node 정수 리터럴,실수 리터럴,,숫자 리터럴
@anchor{reference/lexical_analysis integer-literals}@anchor{2307}@anchor{reference/lexical_analysis integers}@anchor{2308}
@subsubsection 정수 리터럴


Integer literals denote whole numbers. For example:

@example
7
3
2147483647
@end example

There is no limit for the length of integer literals apart from what can be
stored in available memory:

@example
7922816251426433759354395033679228162514264337593543950336
@end example

Underscores can be used to group digits for enhanced readability,
and are ignored for determining the numeric value of the literal.
For example, the following literals are equivalent:

@example
100_000_000_000
100000000000
1_00_00_00_00_000
@end example

Underscores can only occur between digits.
For example, @code{_123}, @code{321_}, and @code{123__321} are `not' valid literals.

Integers can be specified in binary (base 2), octal (base 8), or hexadecimal
(base 16) using the prefixes @code{0b}, @code{0o} and @code{0x}, respectively.
Hexadecimal digits 10 through 15 are represented by letters @code{A}-@code{F},
case-insensitive.  For example:

@example
0b100110111
0b_1110_0101
0o177
0o377
0xdeadbeef
0xDead_Beef
@end example

An underscore can follow the base specifier.
For example, @code{0x_1f} is a valid literal, but @code{0_x1f} and @code{0x__1f} are
not.

Leading zeros in a non-zero decimal number are not allowed.
For example, @code{0123} is not a valid literal.
This is for disambiguation with C-style octal literals, which Python used
before version 3.0.

Formally, integer literals are described by the following lexical definitions:

@example
@anchor{reference/lexical_analysis grammar-token-python-grammar-integer}@anchor{2304}integer:      @ref{2309,,decinteger} | @ref{230a,,bininteger} | @ref{230b,,octinteger} | @ref{230c,,hexinteger} | @ref{230d,,zerointeger}
@anchor{reference/lexical_analysis grammar-token-python-grammar-decinteger}@anchor{2309}decinteger:   @ref{230e,,nonzerodigit} (["_"] @ref{230f,,digit})*
@anchor{reference/lexical_analysis grammar-token-python-grammar-bininteger}@anchor{230a}bininteger:   "0" ("b" | "B") (["_"] @ref{2310,,bindigit})+
@anchor{reference/lexical_analysis grammar-token-python-grammar-octinteger}@anchor{230b}octinteger:   "0" ("o" | "O") (["_"] @ref{2311,,octdigit})+
@anchor{reference/lexical_analysis grammar-token-python-grammar-hexinteger}@anchor{230c}hexinteger:   "0" ("x" | "X") (["_"] @ref{2312,,hexdigit})+
@anchor{reference/lexical_analysis grammar-token-python-grammar-zerointeger}@anchor{230d}zerointeger:  "0"+ (["_"] "0")*
@anchor{reference/lexical_analysis grammar-token-python-grammar-nonzerodigit}@anchor{230e}nonzerodigit: "1"..."9"
@anchor{reference/lexical_analysis grammar-token-python-grammar-digit}@anchor{230f}digit:        "0"..."9"
@anchor{reference/lexical_analysis grammar-token-python-grammar-bindigit}@anchor{2310}bindigit:     "0" | "1"
@anchor{reference/lexical_analysis grammar-token-python-grammar-octdigit}@anchor{2311}octdigit:     "0"..."7"
@anchor{reference/lexical_analysis grammar-token-python-grammar-hexdigit}@anchor{2312}hexdigit:     @ref{230f,,digit} | "a"..."f" | "A"..."F"
@end example


버전 3.6에서 변경: 리터럴에서 숫자들의 그룹을 표현할 목적으로 밑줄을 허락합니다.


@geindex . (마침표);숫자 리터럴에서
@geindex e;숫자 리터럴에서
@geindex _ (밑줄);숫자 리터럴에서

@node 실수 리터럴,허수 리터럴,정수 리터럴,숫자 리터럴
@anchor{reference/lexical_analysis floating}@anchor{2313}@anchor{reference/lexical_analysis floating-point-literals}@anchor{2314}
@subsubsection 실수 리터럴


Floating-point (float) literals, such as @code{3.14} or @code{1.5}, denote
@ref{2315,,approximations of real numbers}.

They consist of `integer' and `fraction' parts, each composed of decimal digits.
The parts are separated by a decimal point, @code{.}:

@example
2.71828
4.0
@end example

Unlike in integer literals, leading zeros are allowed.
For example, @code{077.010} is legal, and denotes the same number as @code{77.01}.

As in integer literals, single underscores may occur between digits to help
readability:

@example
96_485.332_123
3.14_15_93
@end example

Either of these parts, but not both, can be empty. For example:

@example
10.  # (equivalent to 10.0)
.001  # (equivalent to 0.001)
@end example

Optionally, the integer and fraction may be followed by an `exponent':
the letter @code{e} or @code{E}, followed by an optional sign, @code{+} or @code{-},
and a number in the same format as the integer and fraction parts.
The @code{e} or @code{E} represents “times ten raised to the power of”:

@example
1.0e3  # (represents 1.0×10³, or 1000.0)
1.166e-5  # (represents 1.166×10⁻⁵, or 0.00001166)
6.02214076e+23  # (represents 6.02214076×10²³, or 602214076000000000000000.)
@end example

In floats with only integer and exponent parts, the decimal point may be
omitted:

@example
1e3  # (equivalent to 1.e3 and 1.0e3)
0e0  # (equivalent to 0.)
@end example

Formally, floating-point literals are described by the following
lexical definitions:

@example
@anchor{reference/lexical_analysis grammar-token-python-grammar-floatnumber}@anchor{2305}floatnumber:
   | @ref{2316,,digitpart} "." [@ref{2316,,digitpart}] [@ref{2317,,exponent}]
   | "." @ref{2316,,digitpart} [@ref{2317,,exponent}]
   | @ref{2316,,digitpart} @ref{2317,,exponent}
@anchor{reference/lexical_analysis grammar-token-python-grammar-digitpart}@anchor{2316}digitpart: @ref{230f,,digit} (["_"] @ref{230f,,digit})*
@anchor{reference/lexical_analysis grammar-token-python-grammar-exponent}@anchor{2317}exponent:  ("e" | "E") ["+" | "-"] @ref{2316,,digitpart}
@end example


버전 3.6에서 변경: 리터럴에서 숫자들의 그룹을 표현할 목적으로 밑줄을 허락합니다.


@geindex j;숫자 리터럴에서

@node 허수 리터럴,,실수 리터럴,숫자 리터럴
@anchor{reference/lexical_analysis imaginary}@anchor{2318}@anchor{reference/lexical_analysis imaginary-literals}@anchor{2319}
@subsubsection 허수 리터럴


Python has @ref{1fd8,,complex number} objects, but no complex
literals.
Instead, `imaginary literals' denote complex numbers with a zero
real part.

For example, in math, the complex number 3+4.2`i' is written
as the real number 3 added to the imaginary number 4.2`i'.
Python uses a similar syntax, except the imaginary unit is written as @code{j}
rather than `i':

@example
3+4.2j
@end example

This is an expression composed
of the @ref{2308,,integer literal} @code{3},
the @ref{2289,,operator} ‘@code{+}’,
and the @ref{2318,,imaginary literal} @code{4.2j}.
Since these are three separate tokens, whitespace is allowed between them:

@example
3 + 4.2j
@end example

No whitespace is allowed `within' each token.
In particular, the @code{j} suffix, may not be separated from the number
before it.

The number before the @code{j} has the same syntax as a floating-point literal.
Thus, the following are valid imaginary literals:

@example
4.2j
3.14j
10.j
.001j
1e100j
3.14e-10j
3.14_15_93j
@end example

Unlike in a floating-point literal the decimal point can be omitted if the
imaginary number only has an integer part.
The number is still evaluated as a floating-point number, not an integer:

@example
10j
0j
1000000000000000000000000j   # equivalent to 1e+24j
@end example

The @code{j} suffix is case-insensitive.
That means you can use @code{J} instead:

@example
3.14J   # equivalent to 3.14j
@end example

Formally, imaginary literals are described by the following lexical definition:

@example
@anchor{reference/lexical_analysis grammar-token-python-grammar-imagnumber}@anchor{2306}imagnumber: (@ref{2305,,floatnumber} | @ref{2316,,digitpart}) ("j" | "J")
@end example
@anchor{reference/lexical_analysis delimiters}@anchor{2288}@anchor{reference/lexical_analysis operators}@anchor{2289}
@node Operators and delimiters,,숫자 리터럴,어휘 분석
@anchor{reference/lexical_analysis lexical-ellipsis}@anchor{22c7}@anchor{reference/lexical_analysis operators-and-delimiters}@anchor{231a}
@subsection Operators and delimiters


@geindex 연산자
@geindex 구분자

The following grammar defines `operator' and `delimiter' tokens,
that is, the generic @ref{2287,,OP} token type.
A @ref{231b,,list of these tokens and their names}
is also available in the @code{token} module documentation.

@example
@anchor{reference/lexical_analysis grammar-token-python-grammar-OP}@anchor{231c}OP:
   | assignment_operator
   | bitwise_operator
   | comparison_operator
   | enclosing_delimiter
   | other_delimiter
   | arithmetic_operator
   | "..."
   | other_op

@anchor{reference/lexical_analysis grammar-token-python-grammar-assignment_operator}@anchor{231d}assignment_operator:   "+=" | "-=" | "*=" | "**=" | "/="  | "//=" | "%=" |
                       "&=" | "|=" | "^=" | "<<=" | ">>=" | "@@="  | ":="
@anchor{reference/lexical_analysis grammar-token-python-grammar-bitwise_operator}@anchor{231e}bitwise_operator:      "&"  | "|"  | "^"  | "~"   | "<<"  | ">>"
@anchor{reference/lexical_analysis grammar-token-python-grammar-comparison_operator}@anchor{231f}comparison_operator:   "<=" | ">=" | "<"  | ">"   | "=="  | "!="
@anchor{reference/lexical_analysis grammar-token-python-grammar-enclosing_delimiter}@anchor{2320}enclosing_delimiter:   "("  | ")"  | "["  | "]"   | "@{"   | "@}"
@anchor{reference/lexical_analysis grammar-token-python-grammar-other_delimiter}@anchor{2321}other_delimiter:       ","  | ":"  | "!"  | ";"   | "="   | "->"
@anchor{reference/lexical_analysis grammar-token-python-grammar-arithmetic_operator}@anchor{2322}arithmetic_operator:   "+"  | "-"  | "**" | "*"   | "//"  | "/"   | "%"
@anchor{reference/lexical_analysis grammar-token-python-grammar-other_op}@anchor{2323}other_op:              "."  | "@@"
@end example

@cartouche
@quotation 참고 
Generally, `operators' are used to combine @ref{2324,,expressions},
while `delimiters' serve other purposes.
However, there is no clear, formal distinction between the two categories.

Some tokens can serve as either operators or delimiters, depending on usage.
For example, @code{*} is both the multiplication operator and a delimiter used
for sequence unpacking, and @code{@@} is both the matrix multiplication and
a delimiter that introduces decorators.

For some tokens, the distinction is unclear.
For example, some people consider @code{.}, @code{(}, and @code{)} to be delimiters, while others
see the @ref{dc9,,getattr()} operator and the function call operator(s).

Some of Python’s operators, like @code{and}, @code{or}, and @code{not in}, use
@ref{2286,,keyword} tokens rather than “symbols” (operator tokens).
@end quotation
@end cartouche

A sequence of three consecutive periods (@code{...}) has a special
meaning as an @ref{2325,,Ellipsis} literal.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 데이터 모델,실행 모델,어휘 분석,파이썬 언어 레퍼런스
@anchor{reference/datamodel doc}@anchor{2326}@anchor{reference/datamodel data-model}@anchor{2327}@anchor{reference/datamodel datamodel}@anchor{1d57}@anchor{reference/datamodel translation-repo}@anchor{2328}
@section 데이터 모델


@menu
* 객체@comma{} 값@comma{} 형: 객체 값 형. 
* 표준형 계층:: 
* 특수 메서드 이름들:: 
* 코루틴(Coroutines): 코루틴 Coroutines. 

@end menu

@node 객체 값 형,표준형 계층,,데이터 모델
@anchor{reference/datamodel objects}@anchor{2329}@anchor{reference/datamodel objects-values-and-types}@anchor{232a}
@subsection 객체, 값, 형


@geindex object
@geindex data

`Objects' are Python’s abstraction for data.  All data in a Python program
is represented by objects or by relations between objects. Even code is
represented by objects.

@geindex built-in function;id
@geindex built-in function;type
@geindex identity of an object
@geindex value of an object
@geindex type of an object
@geindex mutable object
@geindex immutable object

Every object has an identity, a type and a value.  An object’s `identity' never
changes once it has been created; you may think of it as the object’s address in
memory.  The @ref{34c,,is} operator compares the identity of two objects; the
@ref{1628,,id()} function returns an integer representing its identity.

CPython 의 경우, @code{id(x)} 는 @code{x} 가 저장된 메모리의 주소입니다.

객체의 형은 객체가 지원하는 연산들을 정의하고 (예를 들어, “길이를 갖고 있나?”) 그 형의 객체들이 가질 수 있는 가능한 값들을 정의합니다. @ref{f43,,type()} 함수는 객체의 형(이것 역시 객체다)을 돌려줍니다. 아이덴티티와 마찬가지로, 객체의 `형 (type)' 역시 변경되지 않습니다. @footnote{
어떤 제한된 조건으로, 어떤 경우에 객체의 형을 변경하는 것이 `가능합니다'. 하지만 잘못 다뤄지면 아주 괴상한 결과로 이어질 수 있으므로 일반적으로 좋은 생각이 아닙니다.
}

어떤 객체들의 `값' 은 변경할 수 있습니다. 값을 변경할 수 있는 객체들을 `가변(mutable)' 이라고 합니다. 일단 만들어진 후에 값을 변경할 수 없는 객체들을 `불변(immutable)' 이라고 합니다. (가변 객체에 대한 참조를 저장하고 있는 불변 컨테이너의 값은 가변 객체의 값이 변할 때 변경된다고 볼 수도 있습니다; 하지만 저장하고 있는 객체들의 집합이 바뀔 수 없으므로 컨테이너는 여전히 불변이라고 여겨집니다. 따라서 불변성은 엄밀하게는 변경 불가능한 값을 갖는 것과는 다릅니다. 좀 더 미묘합니다.) 객체의 가변성(mutability)은 그것의 형에 의해 결정됩니다; 예를 들어 숫자, 문자열, 튜플(tuple)은 불변이지만, 딕셔너리(dictionary) 와 리스트(list)는 가변입니다.

@geindex garbage collection
@geindex reference counting
@geindex unreachable object

객체는 결코 명시적으로 파괴되지 않습니다; 더 참조되지 않을 때(unreachable) 가비지 수거(garbage collect)됩니다. 구현이 가비지 수거를 지연시키거나 아예 생략하는 것이 허락됩니다 — 아직 참조되는 객체들을 수거하지 않는 이상 가비지 수거가 어떤 식으로 구현되는지는 구현의 품질 문제입니다.

CPython 은 현재 참조 횟수 계산(reference-counting) 방식을 사용하는데, (선택 사항으로) 순환적으로 연결된 가비지의 지연된 감지가 추가됩니다. 이 방법으로 대부분 객체를 참조가 제거되자마자 수거할 수 있습니다. 하지만 순환 참조가 있는 가비지들을 수거한다는 보장은 없습니다. 순환적 가비지 수거의 제어에 관한 정보는 @ref{64,,gc} 모듈 문서를 참조하면 됩니다. 다른 구현들은 다른 식으로 동작하고, CPython 도 변경될 수 있습니다. 참조가 제거될 때 즉각적으로 파이널리제이션(finalization)되는 것에 의존하지 말아야 합니다 (그래서 항상 파일을 명시적으로 닫아주어야 합니다).

Note that the use of the implementation’s tracing or debugging facilities may
keep objects alive that would normally be collectable. Also note that catching
an exception with a @ref{8f7,,try}…@ref{1ab,,except} statement may keep
objects alive.

Some objects contain references to “external” resources such as open files or
windows.  It is understood that these resources are freed when the object is
garbage-collected, but since garbage collection is not guaranteed to happen,
such objects also provide an explicit way to release the external resource,
usually a @code{close()} method. Programs are strongly recommended to explicitly
close such objects.  The @ref{8f7,,try}…@ref{1b0,,finally} statement
and the @ref{186,,with} statement provide convenient ways to do this.

@geindex container

어떤 객체들은 다른 객체에 대한 참조를 포함하고 있습니다. 이런 것들을 `컨테이너(container)' 라고 부릅니다. 튜플, 리스트, 딕셔너리등이 컨테이너의 예입니다. 이 참조들은 컨테이너의 값의 일부입니다. 대부분은, 우리가 컨테이너의 값을 논할 때는, 들어있는 객체들의 아이덴티티 보다는 값을 따집니다. 하지만, 컨테이너의 가변성에 대해 논할 때는 직접 가진 객체들의 아이덴티티만을 따집니다. 그래서, (튜플 같은) 불변 컨테이너가 가변 객체로의 참조를 하고 있다면, 그 가변 객체가 변경되면 컨테이너의 값도 변경됩니다.

Types affect almost all aspects of object behavior.  Even the importance of
object identity is affected in some sense: for immutable types, operations that
compute new values may actually return a reference to any existing object with
the same type and value, while for mutable objects this is not allowed.
For example, after @code{a = 1; b = 1}, `a' and `b' may or may not refer to
the same object with the value one, depending on the implementation.
This is because @ref{19b,,int} is an immutable type, so the reference to @code{1}
can be reused. This behaviour depends on the implementation used, so should
not be relied upon, but is something to be aware of when making use of object
identity tests.
However, after @code{c = []; d = []}, `c' and `d' are guaranteed to refer to two
different, unique, newly created empty lists. (Note that @code{e = f = []} assigns
the `same' object to both `e' and `f'.)

@node 표준형 계층,특수 메서드 이름들,객체 값 형,데이터 모델
@anchor{reference/datamodel the-standard-type-hierarchy}@anchor{232b}@anchor{reference/datamodel types}@anchor{232c}
@subsection 표준형 계층


@geindex type
@geindex data;type
@geindex type;hierarchy
@geindex extension;module
@geindex C;language

아래에 파이썬에 내장된 형들의 목록이 있습니다. (구현에 따라 C 나 자바나 다른 언어로 작성된) 확장 모듈들은 추가의 형을 정의할 수 있습니다. 파이썬의 미래 버전 역시 형 계층에 형을 더할 수 있는데 (예를 들어, 유리수, 효율적으로 저장된 정수 배열 등등), 표준 라이브러리를 통해 추가될 가능성이 더 크기는 합니다.

@geindex attribute
@geindex special;attribute
@geindex generic;special;attribute

아래에 나오는 몇몇 형에 대한 설명은 ‘특수 어트리뷰트(special attribute)’ 를 나열하는 문단을 포함합니다. 이것들은 구현에 접근할 방법을 제공하는데, 일반적인 사용을 위한 것이 아닙니다. 정의는 앞으로 변경될 수 있습니다.

@menu
* None:: 
* NotImplemented:: 
* Ellipsis:: 
* numbers.Number: numbers Number. 
* 시퀀스들:: 
* 집합 형들(Set types): 집합 형들 Set types. 
* 매핑(Mappings): 매핑 Mappings. 
* 콜러블(Callable types): 콜러블 Callable types. 
* 모듈(Modules): 모듈 Modules. 
* 사용자 정의 클래스(Custom classes): 사용자 정의 클래스 Custom classes. 
* 클래스 인스턴스(Class instances): 클래스 인스턴스 Class instances. 
* I/O 객체 (파일 객체라고도 알려져 있습니다): I/O 객체 파일 객체라고도 알려져 있습니다. 
* 내부 형(Internal types): 내부 형 Internal types. 

@end menu

@node None,NotImplemented,,표준형 계층
@anchor{reference/datamodel none}@anchor{232d}
@subsubsection None


@geindex object;None

이 형은 하나의 값만을 갖습니다. 이 값을 갖는 하나의 객체가 존재합니다. 이 객체에는 내장된 이름 @code{None} 을 통해 접근합니다. 여러 가지 상황에서 값의 부재를 알리는 데 사용됩니다. 예를 들어, 명시적으로 뭔가를 돌려주지 않는 함수의 반환 값입니다. 논리값은 거짓입니다.

@node NotImplemented,Ellipsis,None,표준형 계층
@anchor{reference/datamodel notimplemented}@anchor{232e}
@subsubsection NotImplemented


@geindex object;NotImplemented

This type has a single value.  There is a single object with this value. This
object is accessed through the built-in name @ref{1a2,,NotImplemented}. Numeric methods
and rich comparison methods should return this value if they do not implement the
operation for the operands provided.  (The interpreter will then try the
reflected operation, or some other fallback, depending on the operator.)  It
should not be evaluated in a boolean context.

더 자세한 내용은 @ref{232f,,산술 연산 구현} 을 참고하십시오.


버전 3.9에서 변경: Evaluating @ref{1a2,,NotImplemented} in a boolean context was deprecated.



버전 3.14에서 변경: Evaluating @ref{1a2,,NotImplemented} in a boolean context now raises a @ref{198,,TypeError}.
It previously evaluated to @ref{e06,,True} and emitted a @ref{1a3,,DeprecationWarning}
since Python 3.9.


@node Ellipsis,numbers Number,NotImplemented,표준형 계층
@anchor{reference/datamodel ellipsis}@anchor{2330}
@subsubsection Ellipsis


@geindex object;Ellipsis
@geindex ...;ellipsis literal

이 형은 하나의 값만을 갖습니다. 이 값을 갖는 하나의 객체가 존재합니다. 이 객체에는 리터럴 @code{...} 이나 내장된 이름 @code{Ellipsis} 을 통해 접근합니다. 논리값은 참입니다.

@node numbers Number,시퀀스들,Ellipsis,표준형 계층
@anchor{reference/datamodel numbers-number}@anchor{2331}
@subsubsection @code{numbers.Number}


@geindex object;numeric

이것들은 숫자 리터럴에 의해 만들어지고, 산술 연산과 내장 산술 함수들이 결과로 돌려줍니다. 숫자 객체는 불변입니다; 한 번 값이 만들어지면 절대 변하지 않습니다. 파이썬의 숫자는 당연히 수학적인 숫자들과 밀접하게 관련되어 있습니다, 하지만 컴퓨터의 숫자 표현상의 제약을 받고 있습니다.

The string representations of the numeric classes, computed by
@ref{82e,,__repr__()} and @ref{82f,,__str__()}, have the following
properties:


@itemize *

@item 
클래스 생성자에 전달될 때 원래 숫자 값을 가진 객체를 생성하는 유효한 숫자 리터럴 입니다.

@item 
가능하면, 표현은 10진법입니다.

@item 
소수점 앞의 단일 0을 제외하고, 선행 0은 표시되지 않습니다.

@item 
소수점 뒤의 단일 0을 제외하고, 후행 0은 표시되지 않습니다.

@item 
부호는 숫자가 음수일 때만 표시됩니다.
@end itemize

Python distinguishes between integers, floating-point numbers, and complex
numbers:

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

@end menu

@node numbers Integral,numbers Real float,,numbers Number
@anchor{reference/datamodel numbers-integral}@anchor{2332}
@subsubsection @code{numbers.Integral}


@geindex object;integer

이것들은 수학적인 정수 집합(양과 음)에 속하는 요소들을 나타냅니다.

@cartouche
@quotation 참고 
@geindex integer;representation

정수 표현 규칙은 음수가 포함된 시프트와 마스크 연산에 가장 의미 있는 해석을 제공하기 위한 것입니다.
@end quotation
@end cartouche

두 가지 종류의 정수가 있습니다:


@table @asis

@item 정수 (@ref{19b,,int})

이것은 (가상) 메모리가 허락하는 한, 제약 없는 범위의 숫자를 표현합니다. 시프트(shift)와 마스크(mask) 연산이 목적일 때는 이진 표현이 가정되고, 음수는 일종의 2의 보수(2’s complement)로 표현되는데, 부호 비트가 왼쪽으로 무한히 확장된 것과 같은 효과를 줍니다.

@item 불린 (@ref{3c3,,bool})

@geindex object;Boolean
@geindex False
@geindex True

이것은 논리값 거짓과 참을 나타냅니다. @code{False} 와 @code{True} 두 객체만 불린 형 객체입니다. 불린 형은 int 형의 자식형(subtype)이고, 대부분 상황에서 각기 0과1처럼 동작합니다. 예외는 문자열로 변환되는 경우인데, 각기 문자열 @code{"False"} 와 @code{"True"} 가 반환됩니다.
@end table

@node numbers Real float,numbers Complex complex,numbers Integral,numbers Number
@anchor{reference/datamodel datamodel-float}@anchor{2315}@anchor{reference/datamodel numbers-real-float}@anchor{2333}
@subsubsection @code{numbers.Real} (@code{float})


@geindex object;floating-point
@geindex floating-point;number
@geindex C;language
@geindex Java;language

These represent machine-level double precision floating-point numbers. You are
at the mercy of the underlying machine architecture (and C or Java
implementation) for the accepted range and handling of overflow. Python does not
support single-precision floating-point numbers; the savings in processor and
memory usage that are usually the reason for using these are dwarfed by the
overhead of using objects in Python, so there is no reason to complicate the
language with two kinds of floating-point numbers.

@node numbers Complex complex,,numbers Real float,numbers Number
@anchor{reference/datamodel numbers-complex-complex}@anchor{2334}
@subsubsection @code{numbers.Complex} (@code{complex})


@geindex object;complex
@geindex complex;number

These represent complex numbers as a pair of machine-level double precision
floating-point numbers.  The same caveats apply as for floating-point numbers.
The real and imaginary parts of a complex number @code{z} can be retrieved through
the read-only attributes @code{z.real} and @code{z.imag}.

@node 시퀀스들,집합 형들 Set types,numbers Number,표준형 계층
@anchor{reference/datamodel datamodel-sequences}@anchor{2335}@anchor{reference/datamodel sequences}@anchor{2336}
@subsubsection 시퀀스들


@geindex built-in function;len
@geindex object;sequence
@geindex index operation
@geindex item selection
@geindex subscription

These represent finite ordered sets indexed by non-negative numbers. The
built-in function @ref{83f,,len()} returns the number of items of a sequence. When
the length of a sequence is `n', the index set contains the numbers 0, 1,
…, `n'-1.  Item `i' of sequence `a' is selected by @code{a[i]}. Some sequences,
including built-in sequences, interpret negative subscripts by adding the
sequence length. For example, @code{a[-2]} equals @code{a[n-2]}, the second to last
item of sequence a with length @code{n}.

The resulting value must be a nonnegative integer less than the number of items
in the sequence. If it is not, an @ref{173a,,IndexError} is raised.

@geindex slicing
@geindex start (slice object attribute)
@geindex stop (slice object attribute)
@geindex step (slice object attribute)

Sequences also support slicing: @code{a[start:stop]} selects all items with index `k' such
that `start' @code{<=} `k' @code{<} `stop'.  When used as an expression, a slice is a
sequence of the same type. The comment above about negative subscripts also applies
to negative slice positions.
Note that no error is raised if a slice position is less than zero or larger
than the length of the sequence.

If `start' is missing or @ref{884,,None}, slicing behaves as if `start' was zero.
If `stop' is missing or @code{None}, slicing behaves as if `stop' was equal to
the length of the sequence.

어떤 시퀀스는 세 번째 “스텝(step)” 매개변수를 사용하는 “확장 슬라이싱(extended slicing)”도 지원합니다: @code{a[i:j:k]} 는 @code{x = i + n*k}, `n' @code{>=} @code{0}, `i' @code{<=} `x' @code{<} `j' 를 만족하는 모든 항목 `x' 를 선택합니다.

시퀀스는 불변성에 따라 구분됩니다

@menu
* 불변 시퀀스:: 
* 가변 시퀀스:: 

@end menu

@node 불변 시퀀스,가변 시퀀스,,시퀀스들
@anchor{reference/datamodel immutable-sequences}@anchor{2337}
@subsubsection 불변 시퀀스


@geindex object;immutable sequence
@geindex object;immutable

불변 시퀀스 형의 객체는 일단 만들어진 후에는 변경될 수 없습니다. (만약 다른 객체로의 참조를 포함하면, 그 객체는 가변일 수 있고, 변경될 수 있습니다; 하지만, 불변 객체로부터 참조되는 객체의 집합 자체는 변경될 수 없습니다.)

다음과 같은 형들은 불변 시퀀스입니다:

@geindex string;immutable sequences


@table @asis

@item 문자열(Strings)

@geindex built-in function;chr
@geindex built-in function;ord
@geindex character
@geindex string;item
@geindex Unicode

A string (@ref{169,,str}) is a sequence of values that represent
`characters', or more formally, `Unicode code points'.
All the code points in the range @code{0} to @code{0x10FFFF} can be
represented in a string.

Python doesn’t have a dedicated `character' type.
Instead, every code point in the string is represented as a string
object with length @code{1}.

The built-in function @ref{2338,,ord()}
converts a code point from its string form to an integer in the
range @code{0} to @code{0x10FFFF}; @ref{19ef,,chr()} converts an integer in the range
@code{0} to @code{0x10FFFF} to the corresponding length @code{1} string object.
@ref{ad2,,str.encode()} can be used to convert a @ref{169,,str} to
@ref{192,,bytes} using the given text encoding, and
@ref{ad3,,bytes.decode()} can be used to achieve the opposite.

@item 튜플(Tuples)

@geindex object;tuple
@geindex singleton;tuple
@geindex empty;tuple

The items of a @ref{610,,tuple} are arbitrary Python objects. Tuples of two or
more items are formed by comma-separated lists of expressions.  A tuple
of one item (a ‘singleton’) can be formed by affixing a comma to an
expression (an expression by itself does not create a tuple, since
parentheses must be usable for grouping of expressions).  An empty
tuple can be formed by an empty pair of parentheses.

@item 바이트열(Bytes)

@geindex bytes
@geindex byte

A @ref{192,,bytes} object is an immutable array.  The items are 8-bit bytes,
represented by integers in the range 0 <= x < 256.  Bytes literals
(like @code{b'abc'}) and the built-in @ref{192,,bytes()} constructor
can be used to create bytes objects.  Also, bytes objects can be
decoded to strings via the @ref{ad3,,decode()} method.
@end table

@node 가변 시퀀스,,불변 시퀀스,시퀀스들
@anchor{reference/datamodel mutable-sequences}@anchor{2339}
@subsubsection 가변 시퀀스


@geindex object;mutable sequence
@geindex object;mutable
@geindex assignment;statement
@geindex subscription
@geindex slicing

가변 시퀀스는 만들어진 후에 변경될 수 있습니다. 서브스크립션(subscription)과 슬라이싱은 대입문과 @ref{1b1d,,del} (삭제) 문의 대상으로 사용될 수 있습니다.

@cartouche
@quotation 참고 
@geindex module;array

@geindex module;collections

The @ref{1e,,collections} and @ref{8,,array} module provide
additional examples of mutable sequence types.
@end quotation
@end cartouche

현재 두 개의 내장 가변 시퀀스형이 있습니다:


@table @asis

@item 리스트(Lists)

@geindex object;list

리스트의 항목은 임의의 파이썬 객체입니다. 리스트는 콤마로 분리된 표현식을 대괄호 안에 넣어서 만들 수 있습니다. (길이 0이나 1의 리스트를 만드는데 별도의 규칙이 필요 없습니다.)

@item 바이트 배열(Byte Arrays)

@geindex bytearray

바이트 배열(bytearray) 객체는 가변 배열입니다. 내장 @ref{344,,bytearray()} 생성자로 만들어집니다. 가변이라는 것(그래서 해싱 불가능하다는 것)을 제외하고, 바이트 배열은 불변 바이트열( @ref{192,,bytes}) 객체와 같은 인터페이스와 기능을 제공합니다.
@end table

@node 집합 형들 Set types,매핑 Mappings,시퀀스들,표준형 계층
@anchor{reference/datamodel set-types}@anchor{233a}
@subsubsection 집합 형들(Set types)


@geindex built-in function;len
@geindex object;set type

이것들은 중복 없는 불변 객체들의 순서 없고 유한한 집합을 나타냅니다. 인덱싱할 수 없습니다. 하지만 이터레이트할 수 있고, 내장 함수 @ref{83f,,len()} 은 집합 안에 있는 항목들의 개수를 돌려줍니다. 집합의 일반적인 용도는 빠른 멤버십 검사(fast membership testing), 시퀀스에서 중복된 항목 제거, 교집합(intersection), 합집합(union), 차집합(difference), 대칭차집합(symmetric difference)과 같은 집합 연산을 계산하는 것입니다.

집합의 원소들에는 딕셔너리 키와 같은 불변성 규칙이 적용됩니다. 숫자 형의 경우는 숫자 비교에 관한 일반 원칙이 적용된다는 점에 주의해야 합니다: 만약 두 숫자가 같다고 비교되면(예를 들어, @code{1} 과 @code{1.0}), 그중 하나만 집합에 들어갈 수 있습니다.

현재 두 개의 내장 집합 형이 있습니다:


@table @asis

@item 집합(Sets)

@geindex object;set

These represent a mutable set. They are created by the built-in @ref{184,,set()}
constructor and can be modified afterwards by several methods, such as
@ref{233b,,add()}.

@item 불변 집합(Frozen sets)

@geindex object;frozenset

이것들은 불변 집합을 나타냅니다. 내장 @ref{7f1,,frozenset()} 생성자로 만들 수 있습니다. 불변 집합(frozenset)은 불변이고 @ref{823,,해시 가능} 하므로, 다른 집합의 원소나, 딕셔너리의 키로 사용될 수 있습니다.
@end table

@node 매핑 Mappings,콜러블 Callable types,집합 형들 Set types,표준형 계층
@anchor{reference/datamodel datamodel-mappings}@anchor{233c}@anchor{reference/datamodel mappings}@anchor{233d}
@subsubsection 매핑(Mappings)


@geindex built-in function;len
@geindex subscription
@geindex object;mapping

이것들은 임의의 인덱스 집합으로 인덱싱되는 객체들의 유한한 집합을 나타냅니다. 인덱스 표기법(subscript notation) @code{a[k]} 는 매핑 @code{a} 에서 @code{k} 로 인덱스 되는 항목을 선택합니다; 이것은 표현식에 사용될 수도 있고, 대입이나 @ref{1b1d,,del} 문장의 대상이 될 수도 있습니다. 내장 함수 @ref{83f,,len()} 은 매핑에 포함된 항목들의 개수를 돌려줍니다.

현재 한 개의 내장 매핑 형이 있습니다:

@menu
* 딕셔너리(Dictionaries): 딕셔너리 Dictionaries. 

@end menu

@node 딕셔너리 Dictionaries,,,매핑 Mappings
@anchor{reference/datamodel dictionaries}@anchor{233e}
@subsubsection 딕셔너리(Dictionaries)


@geindex object;dictionary

이것들은 거의 임의의 인덱스 집합으로 인덱싱되는 객체들의 유한한 집합을 나타냅니다. 키로 사용할 수 없는 것들은 리스트, 딕셔너리나 그 외의 가변형 중에서 아이덴티티가 아니라 값으로 비교되는 것들뿐입니다. 딕셔너리의 효율적인 구현이, 키의 해시값이 도중에 변경되지 않고 계속 같은 값으로 유지되도록 요구하고 있기 때문입니다. 키로 사용되는 숫자 형의 경우는 숫자 비교에 관한 일반 원칙이 적용됩니다: 만약 두 숫자가 같다고 비교되면(예를 들어, @code{1} 과 @code{1.0}), 둘 다 같은 딕셔너리 항목을 인덱싱하는데 사용될 수 있습니다.

딕셔너리는 삽입 순서를 유지합니다, 키가 딕셔너리에 순차적으로 추가된 순서와 같은 순서로 생성됨을 뜻합니다. 기존 키를 교체해도 순서는 변경되지 않지만, 키를 제거했다가 다시 삽입하면 이전 위치를 유지하는 대신 끝에 추가됩니다.

Dictionaries are mutable; they can be created by the @code{@{@}} notation (see
section @ref{f7e,,딕셔너리 디스플레이}).

@geindex module;dbm.ndbm
@geindex module;dbm.gnu

확장 모듈 @ref{38,,dbm.ndbm} 과 @ref{37,,dbm.gnu} 는 추가의 매핑 형을 제공하는데, @ref{1e,,collections} 모듈 역시 마찬가지입니다.


버전 3.7에서 변경: 딕셔너리는 3.6 이전의 파이썬 버전에서 삽입 순서를 유지하지 않았습니다. CPython 3.6에서, 삽입 순서가 유지되었지만, 그 시점에는 언어 보증이 아니라 구현 세부 사항으로 간주하였습니다.


@node 콜러블 Callable types,모듈 Modules,매핑 Mappings,표준형 계층
@anchor{reference/datamodel callable-types}@anchor{233f}
@subsubsection 콜러블(Callable types)


@geindex object;callable
@geindex function;call
@geindex invocation
@geindex function;argument

이것들은 함수 호출 연산(@ref{f7c,,호출} 섹션 참고)이 적용될 수 있는 형들입니다:

@menu
* 사용자 정의 함수:: 
* 인스턴스 메서드(Instance methods): 인스턴스 메서드 Instance methods. 
* 제너레이터 함수(Generator functions): 제너레이터 함수 Generator functions. 
* 코루틴 함수(Coroutine functions): 코루틴 함수 Coroutine functions. 
* 비동기 제너레이터 함수(Asynchronous generator functions): 비동기 제너레이터 함수 Asynchronous generator functions. 
* 내장 함수(Built-in functions): 내장 함수 Built-in functions. 
* 내장 메서드(Built-in methods): 내장 메서드 Built-in methods. 
* 클래스(Classes): 클래스 Classes. 
* 클래스 인스턴스(Class Instances): 클래스 인스턴스 Class Instances. 

@end menu

@node 사용자 정의 함수,인스턴스 메서드 Instance methods,,콜러블 Callable types
@anchor{reference/datamodel user-defined-funcs}@anchor{59b}@anchor{reference/datamodel user-defined-functions}@anchor{2340}
@subsubsection 사용자 정의 함수


@geindex user-defined;function
@geindex object;function
@geindex object;user-defined function

사용자 정의 함수 객체는 함수 정의를 통해 만들어집니다 (@ref{2016,,함수 정의} 섹션 참고). 함수의 형식 매개변수(formal parameter) 목록과 같은 개수의 항목을 포함하는 인자(argument) 목록으로 호출되어야 합니다.

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

@end menu

@node Special read-only attributes,Special writable attributes,,사용자 정의 함수
@anchor{reference/datamodel special-read-only-attributes}@anchor{2341}
@subsubsection Special read-only attributes


@geindex __builtins__ (function attribute)
@geindex __closure__ (function attribute)
@geindex __globals__ (function attribute)
@geindex global;namespace


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

어트리뷰트

@tab

의미

@item

@geindex __builtins__ (function의 속성)
@anchor{reference/datamodel function __builtins__}@anchor{2342}
@deffn {속성} function.__builtins__
@end deffn

@tab

A reference to the @ref{183,,dictionary} that holds the function’s
builtins namespace.


Added in version 3.10.


@item

@geindex __globals__ (function의 속성)
@anchor{reference/datamodel function __globals__}@anchor{14d8}
@deffn {속성} function.__globals__
@end deffn

@tab

A reference to the @ref{183,,dictionary} that holds the function’s
@ref{2343,,global variables} – the global namespace of the module
in which the function was defined.

@item

@geindex __closure__ (function의 속성)
@anchor{reference/datamodel function __closure__}@anchor{14d5}
@deffn {속성} function.__closure__
@end deffn

@tab

@code{None} or a @ref{610,,tuple} of cells that contain bindings for the names specified
in the @ref{2344,,co_freevars} attribute of the function’s
@ref{59c,,code object}.

셀 객체는 @code{cell_contents} 어트리뷰트를 가지고 있습니다. 셀의 값을 읽을 뿐만 아니라 값을 설정하는 데도 사용할 수 있습니다.

@end multitable


@node Special writable attributes,,Special read-only attributes,사용자 정의 함수
@anchor{reference/datamodel special-writable-attributes}@anchor{2345}
@subsubsection Special writable attributes


@geindex __doc__ (function attribute)
@geindex __name__ (function attribute)
@geindex __module__ (function attribute)
@geindex __dict__ (function attribute)
@geindex __defaults__ (function attribute)
@geindex __code__ (function attribute)
@geindex __annotations__ (function attribute)
@geindex __annotate__ (function attribute)
@geindex __kwdefaults__ (function attribute)
@geindex __type_params__ (function attribute)

Most of these attributes check the type of the assigned value:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

어트리뷰트

@tab

의미

@item

@geindex __doc__ (function의 속성)
@anchor{reference/datamodel function __doc__}@anchor{13de}
@deffn {속성} function.__doc__
@end deffn

@tab

The function’s documentation string, or @code{None} if unavailable.

@item

@geindex __name__ (function의 속성)
@anchor{reference/datamodel function __name__}@anchor{14d9}
@deffn {속성} function.__name__
@end deffn

@tab

The function’s name.
See also: @ref{1265,,__name__ attributes}.

@item

@geindex __qualname__ (function의 속성)
@anchor{reference/datamodel function __qualname__}@anchor{2346}
@deffn {속성} function.__qualname__
@end deffn

@tab

The function’s @ref{1d21,,qualified name}.
See also: @ref{1264,,__qualname__ attributes}.


Added in version 3.3.


@item

@geindex __module__ (function의 속성)
@anchor{reference/datamodel function __module__}@anchor{2347}
@deffn {속성} function.__module__
@end deffn

@tab

함수가 정의된 모듈의 이름 또는 (없는 경우) @code{None}

@item

@geindex __defaults__ (function의 속성)
@anchor{reference/datamodel function __defaults__}@anchor{14d6}
@deffn {속성} function.__defaults__
@end deffn

@tab

A @ref{610,,tuple} containing default @ref{2348,,parameter} values
for those parameters that have defaults,
or @code{None} if no parameters have a default value.

@item

@geindex __code__ (function의 속성)
@anchor{reference/datamodel function __code__}@anchor{59c}
@deffn {속성} function.__code__
@end deffn

@tab

The @ref{4e6,,code object} representing
the compiled function body.

@item

@geindex __dict__ (function의 속성)
@anchor{reference/datamodel function __dict__}@anchor{14d7}
@deffn {속성} function.__dict__
@end deffn

@tab

The namespace supporting arbitrary function attributes.
See also: @ref{77c,,__dict__ attributes}.

@item

@geindex __annotations__ (function의 속성)
@anchor{reference/datamodel function __annotations__}@anchor{13dd}
@deffn {속성} function.__annotations__
@end deffn

@tab

A @ref{183,,dictionary} containing annotations of
@ref{2348,,parameters}.
The keys of the dictionary are the parameter names,
and @code{'return'} for the return annotation, if provided.
See also: @ref{458,,object.__annotations__}.


버전 3.14에서 변경: Annotations are now @ref{684,,lazily evaluated}.
See 
@geindex Python 향상 제안; PEP 649
PEP 649@footnote{https://peps.python.org/pep-0649/}.


@item

@geindex __annotate__ (function의 속성)
@anchor{reference/datamodel function __annotate__}@anchor{2349}
@deffn {속성} function.__annotate__
@end deffn

@tab

The @ref{15d,,annotate function} for this function, or @code{None}
if the function has no annotations. See @ref{1984,,object.__annotate__}.


Added in version 3.14.


@item

@geindex __kwdefaults__ (function의 속성)
@anchor{reference/datamodel function __kwdefaults__}@anchor{1227}
@deffn {속성} function.__kwdefaults__
@end deffn

@tab

A @ref{183,,dictionary} containing defaults for keyword-only
@ref{2348,,parameters}.

@item

@geindex __type_params__ (function의 속성)
@anchor{reference/datamodel function __type_params__}@anchor{234a}
@deffn {속성} function.__type_params__
@end deffn

@tab

A @ref{610,,tuple} containing the @ref{5ac,,type parameters} of
a @ref{681,,generic function}.


Added in version 3.12.


@end multitable


Function objects also support getting and setting arbitrary attributes, which
can be used, for example, to attach metadata to functions.  Regular attribute
dot-notation is used to get and set such attributes.

`CPython 구현 상세:' CPython’s current implementation only supports function attributes
on user-defined functions. Function attributes on
@ref{234b,,built-in functions} may be supported in the
future.

Additional information about a function’s definition can be retrieved from its
@ref{4e6,,code object}
(accessible via the @ref{59c,,__code__} attribute).

@node 인스턴스 메서드 Instance methods,제너레이터 함수 Generator functions,사용자 정의 함수,콜러블 Callable types
@anchor{reference/datamodel id2}@anchor{234c}@anchor{reference/datamodel instance-methods}@anchor{20a5}
@subsubsection 인스턴스 메서드(Instance methods)


@geindex object;method
@geindex object;user-defined method
@geindex user-defined;method

인스턴스 메서드는 클래스, 클래스 인스턴스와 모든 콜러블 객체 (보통 사용자 정의 함수)을 결합합니다.

@geindex __func__ (method attribute)
@geindex __self__ (method attribute)
@geindex __doc__ (method attribute)
@geindex __name__ (method attribute)
@geindex __module__ (method attribute)

Special read-only attributes:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

@geindex __self__ (method의 속성)
@anchor{reference/datamodel method __self__}@anchor{15cd}
@deffn {속성} method.__self__
@end deffn

@tab

Refers to the class instance object to which the method is
@ref{234d,,bound}

@item

@geindex __func__ (method의 속성)
@anchor{reference/datamodel method __func__}@anchor{1501}
@deffn {속성} method.__func__
@end deffn

@tab

Refers to the original @ref{59b,,function object}

@item

@geindex __doc__ (method의 속성)
@anchor{reference/datamodel method __doc__}@anchor{234e}
@deffn {속성} method.__doc__
@end deffn

@tab

The method’s documentation
(same as @ref{13de,,method.__func__.__doc__}).
A @ref{169,,string} if the original function had a docstring, else
@code{None}.

@item

@geindex __name__ (method의 속성)
@anchor{reference/datamodel method __name__}@anchor{234f}
@deffn {속성} method.__name__
@end deffn

@tab

The name of the method
(same as @ref{14d9,,method.__func__.__name__})

@item

@geindex __module__ (method의 속성)
@anchor{reference/datamodel method __module__}@anchor{2350}
@deffn {속성} method.__module__
@end deffn

@tab

The name of the module the method was defined in, or @code{None} if
unavailable.

@end multitable


Methods also support accessing (but not setting) the arbitrary function
attributes on the underlying @ref{59b,,function object}.

User-defined method objects may be created when getting an attribute of a
class (perhaps via an instance of that class), if that attribute is a
user-defined @ref{59b,,function object} or a
@ref{48f,,classmethod} object.
@anchor{reference/datamodel method-binding}@anchor{234d}
When an instance method object is created by retrieving a user-defined
@ref{59b,,function object} from a class via one of its
instances, its @ref{15cd,,__self__} attribute is the instance, and the
method object is said to be `bound'.  The new method’s @ref{1501,,__func__}
attribute is the original function object.

When an instance method object is created by retrieving a @ref{48f,,classmethod}
object from a class or instance, its @ref{15cd,,__self__} attribute is the
class itself, and its @ref{1501,,__func__} attribute is the function object
underlying the class method.

When an instance method object is called, the underlying function
(@ref{1501,,__func__}) is called, inserting the class instance
(@ref{15cd,,__self__}) in front of the argument list.  For instance, when
@code{C} is a class which contains a definition for a function
@code{f()}, and @code{x} is an instance of @code{C}, calling @code{x.f(1)} is
equivalent to calling @code{C.f(x, 1)}.

When an instance method object is derived from a @ref{48f,,classmethod} object, the
“class instance” stored in @ref{15cd,,__self__} will actually be the class
itself, so that calling either @code{x.f(1)} or @code{C.f(1)} is equivalent to
calling @code{f(C,1)} where @code{f} is the underlying function.

It is important to note that user-defined functions
which are attributes of a class instance are not converted to bound
methods; this `only' happens when the function is an attribute of the
class.

@node 제너레이터 함수 Generator functions,코루틴 함수 Coroutine functions,인스턴스 메서드 Instance methods,콜러블 Callable types
@anchor{reference/datamodel generator-functions}@anchor{2351}
@subsubsection 제너레이터 함수(Generator functions)


@geindex generator;function
@geindex generator;iterator

A function or method which uses the @ref{bc1,,yield} statement (see section
@ref{bc1,,yield 문}) is called a `generator function'.  Such a function, when
called, always returns an @ref{4ca,,iterator} object which can be used to
execute the body of the function:  calling the iterator’s
@ref{14d2,,iterator.__next__()} method will cause the function to execute until
it provides a value using the @code{yield} statement.  When the
function executes a @ref{1af,,return} statement or falls off the end, a
@ref{df4,,StopIteration} exception is raised and the iterator will have
reached the end of the set of values to be returned.

@node 코루틴 함수 Coroutine functions,비동기 제너레이터 함수 Asynchronous generator functions,제너레이터 함수 Generator functions,콜러블 Callable types
@anchor{reference/datamodel coroutine-functions}@anchor{2352}
@subsubsection 코루틴 함수(Coroutine functions)


@geindex coroutine;function

@ref{7ec,,async def} 를 사용해서 정의되는 함수나 메서드를 `코루틴 함수 (coroutine function)' 라고 부릅니다. 이런 함수를 호출하면 @ref{6b8,,코루틴} 객체를 돌려줍니다. @ref{18d,,await} 표현식을 비롯해, @ref{185,,async with} 와 @ref{c9f,,async for} 문을 사용할 수 있습니다. @ref{2353,,코루틴 객체(Coroutine Objects)} 섹션을 참조하십시오.

@node 비동기 제너레이터 함수 Asynchronous generator functions,내장 함수 Built-in functions,코루틴 함수 Coroutine functions,콜러블 Callable types
@anchor{reference/datamodel asynchronous-generator-functions}@anchor{2354}
@subsubsection 비동기 제너레이터 함수(Asynchronous generator functions)


@geindex asynchronous generator;function
@geindex asynchronous generator;asynchronous iterator

A function or method which is defined using @ref{7ec,,async def} and
which uses the @ref{bc1,,yield} statement is called a
`asynchronous generator function'.  Such a function, when called,
returns an @ref{4c8,,asynchronous iterator} object which can be used in an
@ref{c9f,,async for} statement to execute the body of the function.

Calling the asynchronous iterator’s
@ref{1885,,aiterator.__anext__} method
will return an @ref{4c9,,awaitable} which when awaited
will execute until it provides a value using the @ref{bc1,,yield}
expression.  When the function executes an empty @ref{1af,,return}
statement or falls off the end, a @ref{1e0c,,StopAsyncIteration} exception
is raised and the asynchronous iterator will have reached the end of
the set of values to be yielded.

@node 내장 함수 Built-in functions,내장 메서드 Built-in methods,비동기 제너레이터 함수 Asynchronous generator functions,콜러블 Callable types
@anchor{reference/datamodel built-in-functions}@anchor{2355}@anchor{reference/datamodel builtin-functions}@anchor{234b}
@subsubsection 내장 함수(Built-in functions)


@geindex object;built-in function
@geindex object;function
@geindex C;language

A built-in function object is a wrapper around a C function.  Examples of
built-in functions are @ref{83f,,len()} and @ref{16c3,,math.sin()} (@ref{92,,math} is a
standard built-in module). The number and type of the arguments are
determined by the C function. Special read-only attributes:


@itemize *

@item 
@code{__doc__} is the function’s documentation string, or @code{None} if
unavailable. See @ref{13de,,function.__doc__}.

@item 
@code{__name__} is the function’s name. See @ref{14d9,,function.__name__}.

@item 
@code{__self__} is set to @code{None} (but see the next item).

@item 
@code{__module__} is the name of
the module the function was defined in or @code{None} if unavailable.
See @ref{2347,,function.__module__}.
@end itemize

@node 내장 메서드 Built-in methods,클래스 Classes,내장 함수 Built-in functions,콜러블 Callable types
@anchor{reference/datamodel built-in-methods}@anchor{2356}@anchor{reference/datamodel builtin-methods}@anchor{2357}
@subsubsection 내장 메서드(Built-in methods)


@geindex object;built-in method
@geindex object;method
@geindex built-in;method

This is really a different disguise of a built-in function, this time containing
an object passed to the C function as an implicit extra argument.  An example of
a built-in method is @code{alist.append()}, assuming `alist' is a list object. In
this case, the special read-only attribute @code{__self__} is set to the object
denoted by `alist'. (The attribute has the same semantics as it does with
@ref{15cd,,other instance methods}.)

@node 클래스 Classes,클래스 인스턴스 Class Instances,내장 메서드 Built-in methods,콜러블 Callable types
@anchor{reference/datamodel classes}@anchor{2358}@anchor{reference/datamodel id3}@anchor{2359}
@subsubsection 클래스(Classes)


Classes are callable.  These objects normally act as factories for new
instances of themselves, but variations are possible for class types that
override @ref{79f,,__new__()}.  The arguments of the call are passed to
@code{__new__()} and, in the typical case, to @ref{8be,,__init__()} to
initialize the new instance.

@node 클래스 인스턴스 Class Instances,,클래스 Classes,콜러블 Callable types
@anchor{reference/datamodel class-instances}@anchor{235a}
@subsubsection 클래스 인스턴스(Class Instances)


Instances of arbitrary classes can be made callable by defining a
@ref{779,,__call__()} method in their class.

@node 모듈 Modules,사용자 정의 클래스 Custom classes,콜러블 Callable types,표준형 계층
@anchor{reference/datamodel module-objects}@anchor{235b}@anchor{reference/datamodel modules}@anchor{235c}
@subsubsection 모듈(Modules)


@geindex statement;import
@geindex object;module

Modules are a basic organizational unit of Python code, and are created by
the @ref{235d,,import system} as invoked either by the
@ref{7f7,,import} statement, or by calling
functions such as @ref{73b,,importlib.import_module()} and built-in
@ref{ad1,,__import__()}.  A module object has a namespace implemented by a
@ref{183,,dictionary} object (this is the dictionary referenced by the
@ref{14d8,,__globals__}
attribute of functions defined in the module).  Attribute references are
translated to lookups in this dictionary, e.g., @code{m.x} is equivalent to
@code{m.__dict__["x"]}. A module object does not contain the code object used
to initialize the module (since it isn’t needed once the initialization is
done).

어트리뷰트 대입은 모듈의 이름 공간 딕셔너리를 갱신합니다. 예를 들어, @code{m.x = 1} 은 @code{m.__dict__["x"] = 1} 과 같습니다.

@geindex __name__ (module attribute)
@geindex __spec__ (module attribute)
@geindex __package__ (module attribute)
@geindex __loader__ (module attribute)
@geindex __path__ (module attribute)
@geindex __file__ (module attribute)
@geindex __cached__ (module attribute)
@geindex __doc__ (module attribute)
@geindex __annotations__ (module attribute)
@geindex __annotate__ (module attribute)
@geindex module;namespace

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

@end menu

@node Import-related attributes on module objects,Other writable attributes on module objects,,모듈 Modules
@anchor{reference/datamodel import-mod-attrs}@anchor{235e}@anchor{reference/datamodel import-related-attributes-on-module-objects}@anchor{235f}
@subsubsection Import-related attributes on module objects


Module objects have the following attributes that relate to the
@ref{235d,,import system}. When a module is created using the machinery associated
with the import system, these attributes are filled in based on the module’s
@ref{2360,,spec}, before the @ref{1a28,,loader} executes and loads the
module.

To create a module dynamically rather than using the import system,
it’s recommended to use @ref{1012,,importlib.util.module_from_spec()},
which will set the various import-controlled attributes to appropriate values.
It’s also possible to use the @ref{1013,,types.ModuleType} constructor to create
modules directly, but this technique is more error-prone, as most attributes
must be manually set on the module object after it has been created when using
this approach.

@cartouche
@quotation 조심 
With the exception of @ref{1590,,__name__}, it is `strongly'
recommended that you rely on @ref{2361,,__spec__} and its attributes
instead of any of the other individual attributes listed in this subsection.
Note that updating an attribute on @code{__spec__} will not update the
corresponding attribute on the module itself:

@example
>>> import typing
>>> typing.__name__, typing.__spec__.name
('typing', 'typing')
>>> typing.__spec__.name = 'spelling'
>>> typing.__name__, typing.__spec__.name
('typing', 'spelling')
>>> typing.__name__ = 'keyboard_smashing'
>>> typing.__name__, typing.__spec__.name
('keyboard_smashing', 'spelling')
@end example
@end quotation
@end cartouche

@geindex __name__ (module의 속성)
@anchor{reference/datamodel module __name__}@anchor{1590}
@deffn {속성} module.__name__

The name used to uniquely identify the module in the import system.
For a directly executed module, this will be set to @code{"__main__"}.

This attribute must be set to the fully qualified name of the module.
It is expected to match the value of
@ref{2362,,module.__spec__.name}.
@end deffn

@geindex __spec__ (module의 속성)
@anchor{reference/datamodel module __spec__}@anchor{2361}
@deffn {속성} module.__spec__

A record of the module’s import-system-related state.

Set to the @ref{2269,,module spec} that was
used when importing the module. See @ref{2363,,모듈 스펙} for more details.


Added in version 3.4.

@end deffn

@geindex __package__ (module의 속성)
@anchor{reference/datamodel module __package__}@anchor{323}
@deffn {속성} module.__package__

The @ref{233,,package} a module belongs to.

If the module is top-level (that is, not a part of any specific package)
then the attribute should be set to @code{'@w{'}} (the empty string). Otherwise,
it should be set to the name of the module’s package (which can be equal to
@ref{1590,,module.__name__} if the module itself is a package). See 
@geindex Python 향상 제안; PEP 366
PEP 366@footnote{https://peps.python.org/pep-0366/}
for further details.

This attribute is used instead of @ref{1590,,__name__} to calculate
explicit relative imports for main modules. It defaults to @code{None} for
modules created dynamically using the @ref{1013,,types.ModuleType} constructor;
use @ref{1012,,importlib.util.module_from_spec()} instead to ensure the attribute
is set to a @ref{169,,str}.

It is `strongly' recommended that you use
@ref{324,,module.__spec__.parent}
instead of @code{module.__package__}. @ref{323,,__package__} is now only used
as a fallback if @code{__spec__.parent} is not set, and this fallback
path is deprecated.


버전 3.4에서 변경: This attribute now defaults to @code{None} for modules created dynamically
using the @ref{1013,,types.ModuleType} constructor.
Previously the attribute was optional.



버전 3.6에서 변경: The value of @code{__package__} is expected to be the same as
@ref{324,,__spec__.parent}.
@ref{323,,__package__} is now only used as a fallback during import
resolution if @code{__spec__.parent} is not defined.



버전 3.10에서 변경: @ref{71d,,ImportWarning} is raised if an import resolution falls back to
@code{__package__} instead of
@ref{324,,__spec__.parent}.



버전 3.12에서 변경: Raise @ref{1a3,,DeprecationWarning} instead of @ref{71d,,ImportWarning} when
falling back to @code{__package__} during import resolution.



Deprecated since version 3.13, will be removed in version 3.15: @code{__package__} will cease to be set or taken into consideration
by the import system or standard library.

@end deffn

@geindex __loader__ (module의 속성)
@anchor{reference/datamodel module __loader__}@anchor{33b}
@deffn {속성} module.__loader__

The @ref{1a28,,loader} object that the import machinery used to load the module.

This attribute is mostly useful for introspection, but can be used for
additional loader-specific functionality, for example getting data
associated with a loader.

@code{__loader__} defaults to @code{None} for modules created dynamically
using the @ref{1013,,types.ModuleType} constructor;
use @ref{1012,,importlib.util.module_from_spec()} instead to ensure the attribute
is set to a @ref{1a28,,loader} object.

It is `strongly' recommended that you use
@ref{33c,,module.__spec__.loader}
instead of @code{module.__loader__}.


버전 3.4에서 변경: This attribute now defaults to @code{None} for modules created dynamically
using the @ref{1013,,types.ModuleType} constructor.
Previously the attribute was optional.



Deprecated since version 3.12, will be removed in version 3.16: Setting @code{__loader__} on a module while failing to set
@code{__spec__.loader} is deprecated. In Python 3.16,
@code{__loader__} will cease to be set or taken into consideration by
the import system or the standard library.

@end deffn

@geindex __path__ (module의 속성)
@anchor{reference/datamodel module __path__}@anchor{2052}
@deffn {속성} module.__path__

A (possibly empty) @ref{715,,sequence} of strings enumerating the locations
where the package’s submodules will be found. Non-package modules should
not have a @code{__path__} attribute. See @ref{2364,,모듈의 __path__ 어트리뷰트} for
more details.

It is `strongly' recommended that you use
@ref{2365,,module.__spec__.submodule_search_locations}
instead of @code{module.__path__}.
@end deffn

@geindex __file__ (module의 속성)
@anchor{reference/datamodel module __file__}@anchor{2366}
@deffn {속성} module.__file__
@end deffn

@geindex __cached__ (module의 속성)
@anchor{reference/datamodel module __cached__}@anchor{321}
@deffn {속성} module.__cached__

@code{__file__} and @code{__cached__} are both optional attributes that
may or may not be set. Both attributes should be a @ref{169,,str} when they
are available.

@code{__file__} indicates the pathname of the file from which the module
was loaded (if loaded from a file), or the pathname of the shared library
file for extension modules loaded dynamically from a shared library.
It might be missing for certain types of modules, such as C modules that are
statically linked into the interpreter, and the
@ref{235d,,import system} may opt to leave it unset if it
has no semantic meaning (for example, a module loaded from a database).

If @code{__file__} is set then the @code{__cached__} attribute might
also be set,  which is the path to any compiled version of
the code (for example, a byte-compiled file). The file does not need to exist
to set this attribute; the path can simply point to where the
compiled file `would' exist (see 
@geindex Python 향상 제안; PEP 3147
PEP 3147@footnote{https://peps.python.org/pep-3147/}).

Note that @code{__cached__} may be set even if @code{__file__} is not
set.  However, that scenario is quite atypical.  Ultimately, the
@ref{1a28,,loader} is what makes use of the module spec provided by the
@ref{2367,,finder} (from which @code{__file__} and @code{__cached__} are
derived).  So if a loader can load from a cached module but otherwise does
not load from a file, that atypical scenario may be appropriate.

It is `strongly' recommended that you use
@ref{322,,module.__spec__.cached}
instead of @code{module.__cached__}.


Deprecated since version 3.13, will be removed in version 3.15: Setting @code{__cached__} on a module while failing to set
@code{__spec__.cached} is deprecated. In Python 3.15,
@code{__cached__} will cease to be set or taken into consideration by
the import system or standard library.

@end deffn

@node Other writable attributes on module objects,Module dictionaries,Import-related attributes on module objects,모듈 Modules
@anchor{reference/datamodel other-writable-attributes-on-module-objects}@anchor{2368}
@subsubsection Other writable attributes on module objects


As well as the import-related attributes listed above, module objects also have
the following writable attributes:

@geindex __doc__ (module의 속성)
@anchor{reference/datamodel module __doc__}@anchor{1bed}
@deffn {속성} module.__doc__

The module’s documentation string, or @code{None} if unavailable.
See also: @ref{b21,,__doc__ attributes}.
@end deffn

@geindex __annotations__ (module의 속성)
@anchor{reference/datamodel module __annotations__}@anchor{2369}
@deffn {속성} module.__annotations__

A dictionary containing @ref{f4f,,variable annotations}
collected during module body execution.  For best practices on working with
@code{__annotations__}, see @ref{6,,annotationlib}.


버전 3.14에서 변경: Annotations are now @ref{684,,lazily evaluated}.
See 
@geindex Python 향상 제안; PEP 649
PEP 649@footnote{https://peps.python.org/pep-0649/}.

@end deffn

@geindex __annotate__ (module의 속성)
@anchor{reference/datamodel module __annotate__}@anchor{236a}
@deffn {속성} module.__annotate__

The @ref{15d,,annotate function} for this module, or @code{None} if the module has
no annotations. See also: @ref{1984,,__annotate__} attributes.


Added in version 3.14.

@end deffn

@node Module dictionaries,,Other writable attributes on module objects,모듈 Modules
@anchor{reference/datamodel module-dictionaries}@anchor{236b}
@subsubsection Module dictionaries


Module objects also have the following special read-only attribute:

@geindex __dict__ (module attribute)

@geindex __dict__ (module의 속성)
@anchor{reference/datamodel module __dict__}@anchor{236c}
@deffn {속성} module.__dict__

The module’s namespace as a dictionary object. Uniquely among the attributes
listed here, @code{__dict__} cannot be accessed as a global variable from
within a module; it can only be accessed as an attribute on module objects.

CPython 이 모듈 딕셔너리를 비우는 방법 때문에, 딕셔너리에 대한 참조가 남아있더라도, 모듈이 스코프를 벗어나면 모듈 딕셔너리는 비워집니다. 이것을 피하려면, 딕셔너리를 복사하거나 딕셔너리를 직접 이용하는 동안은 모듈을 잡아두어야 합니다.
@end deffn

@node 사용자 정의 클래스 Custom classes,클래스 인스턴스 Class instances,모듈 Modules,표준형 계층
@anchor{reference/datamodel class-attrs-and-methods}@anchor{236d}@anchor{reference/datamodel custom-classes}@anchor{236e}
@subsubsection 사용자 정의 클래스(Custom classes)


Custom class types are typically created by class definitions (see section
@ref{14dc,,클래스 정의}).  A class has a namespace implemented by a dictionary object.
Class attribute references are translated to lookups in this dictionary, e.g.,
@code{C.x} is translated to @code{C.__dict__["x"]} (although there are a number of
hooks which allow for other means of locating attributes). When the attribute
name is not found there, the attribute search continues in the base classes.
This search of the base classes uses the C3 method resolution order which
behaves correctly even in the presence of ‘diamond’ inheritance structures
where there are multiple inheritance paths leading back to a common ancestor.
Additional details on the C3 MRO used by Python can be found at
@ref{16af,,The Python 2.3 Method Resolution Order}.

@geindex object;class
@geindex object;class instance
@geindex object;instance
@geindex class object;call
@geindex container
@geindex object;dictionary
@geindex class;attribute

When a class attribute reference (for class @code{C}, say) would yield a
class method object, it is transformed into an instance method object whose
@ref{15cd,,__self__} attribute is @code{C}.
When it would yield a @ref{453,,staticmethod} object,
it is transformed into the object wrapped by the static method
object. See section @ref{e48,,디스크립터 구현하기} for another way in which attributes
retrieved from a class may differ from those actually contained in its
@ref{77c,,__dict__}.

@geindex class;attribute;assignment

클래스 어트리뷰트 대입은 클래스의 딕셔너리를 갱신할 뿐, 어떤 경우도 부모 클래스의 딕셔너리를 건드리지는 않습니다.

@geindex class object;call

클래스 객체는 클래스 인스턴스를 돌려주도록(아래를 보십시오) 호출될 수 있습니다(위를 보십시오).

@menu
* Special attributes:: 
* Special methods:: 

@end menu

@node Special attributes,Special methods,,사용자 정의 클래스 Custom classes
@anchor{reference/datamodel special-attributes}@anchor{236f}
@subsubsection Special attributes


@geindex __name__ (class attribute)
@geindex __module__ (class attribute)
@geindex __dict__ (class attribute)
@geindex __bases__ (class attribute)
@geindex __base__ (class attribute)
@geindex __doc__ (class attribute)
@geindex __annotations__ (class attribute)
@geindex __annotate__ (class attribute)
@geindex __type_params__ (class attribute)
@geindex __static_attributes__ (class attribute)
@geindex __firstlineno__ (class attribute)


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

어트리뷰트

@tab

의미

@item

@geindex __name__ (type의 속성)
@anchor{reference/datamodel type __name__}@anchor{16b0}
@deffn {속성} type.__name__
@end deffn

@tab

The class’s name.
See also: @ref{1265,,__name__ attributes}.

@item

@geindex __qualname__ (type의 속성)
@anchor{reference/datamodel type __qualname__}@anchor{2370}
@deffn {속성} type.__qualname__
@end deffn

@tab

The class’s @ref{1d21,,qualified name}.
See also: @ref{1264,,__qualname__ attributes}.

@item

@geindex __module__ (type의 속성)
@anchor{reference/datamodel type __module__}@anchor{615}
@deffn {속성} type.__module__
@end deffn

@tab

The name of the module in which the class was defined.

@item

@geindex __dict__ (type의 속성)
@anchor{reference/datamodel type __dict__}@anchor{e56}
@deffn {속성} type.__dict__
@end deffn

@tab

A @ref{697,,mapping proxy}
providing a read-only view of the class’s namespace.
See also: @ref{77c,,__dict__ attributes}.

@item

@geindex __bases__ (type의 속성)
@anchor{reference/datamodel type __bases__}@anchor{16b1}
@deffn {속성} type.__bases__
@end deffn

@tab

A @ref{610,,tuple} containing the class’s bases.
In most cases, for a class defined as @code{class X(A, B, C)},
@code{X.__bases__} will be exactly equal to @code{(A, B, C)}.

@item

@geindex __base__ (type의 속성)
@anchor{reference/datamodel type __base__}@anchor{2371}
@deffn {속성} type.__base__
@end deffn

@tab

`CPython 구현 상세:' The single base class in the inheritance chain that is responsible
for the memory layout of instances. This attribute corresponds to
@ref{2372,,tp_base} at the C level.

@item

@geindex __doc__ (type의 속성)
@anchor{reference/datamodel type __doc__}@anchor{2093}
@deffn {속성} type.__doc__
@end deffn

@tab

The class’s documentation string, or @code{None} if undefined.
Not inherited by subclasses.

@item

@geindex __annotations__ (type의 속성)
@anchor{reference/datamodel type __annotations__}@anchor{1845}
@deffn {속성} type.__annotations__
@end deffn

@tab

A dictionary containing
@ref{f4f,,variable annotations}
collected during class body execution. See also:
@ref{458,,__annotations__ attributes}.

For best practices on working with @ref{458,,__annotations__},
please see @ref{6,,annotationlib}. Use
@ref{459,,annotationlib.get_annotations()} instead of accessing this
attribute directly.

@cartouche
@quotation 경고 
Accessing the @code{__annotations__} attribute directly
on a class object may return annotations for the wrong class, specifically
in certain cases where the class, its base class, or a metaclass
is defined under @code{from __future__ import annotations}.
See 
@geindex Python 향상 제안; PEP 749#pep749-metaclasses
749@footnote{https://peps.python.org/pep-0749/#pep749-metaclasses} for details.

This attribute does not exist on certain builtin classes. On
user-defined classes without @code{__annotations__}, it is an
empty dictionary.
@end quotation
@end cartouche


버전 3.14에서 변경: Annotations are now @ref{684,,lazily evaluated}.
See 
@geindex Python 향상 제안; PEP 649
PEP 649@footnote{https://peps.python.org/pep-0649/}.


@item

@geindex __annotate__() (type 메서드)
@anchor{reference/datamodel type __annotate__}@anchor{186a}
@deffn {메서드} type.__annotate__ ()
@end deffn

@tab

The @ref{15d,,annotate function} for this class, or @code{None}
if the class has no annotations.
See also: @ref{1984,,__annotate__ attributes}.


Added in version 3.14.


@item

@geindex __type_params__ (type의 속성)
@anchor{reference/datamodel type __type_params__}@anchor{2373}
@deffn {속성} type.__type_params__
@end deffn

@tab

A @ref{610,,tuple} containing the @ref{5ac,,type parameters} of
a @ref{680,,generic class}.


Added in version 3.12.


@item

@geindex __static_attributes__ (type의 속성)
@anchor{reference/datamodel type __static_attributes__}@anchor{477}
@deffn {속성} type.__static_attributes__
@end deffn

@tab

A @ref{610,,tuple} containing names of attributes of this class which are
assigned through @code{self.X} from any function in its body.


Added in version 3.13.


@item

@geindex __firstlineno__ (type의 속성)
@anchor{reference/datamodel type __firstlineno__}@anchor{478}
@deffn {속성} type.__firstlineno__
@end deffn

@tab

The line number of the first line of the class definition,
including decorators.
Setting the @ref{615,,__module__} attribute removes the
@code{__firstlineno__} item from the type’s dictionary.


Added in version 3.13.


@item

@geindex __mro__ (type의 속성)
@anchor{reference/datamodel type __mro__}@anchor{2374}
@deffn {속성} type.__mro__
@end deffn

@tab

The @ref{610,,tuple} of classes that are considered when looking for
base classes during method resolution.

@end multitable


@node Special methods,,Special attributes,사용자 정의 클래스 Custom classes
@anchor{reference/datamodel special-methods}@anchor{2375}
@subsubsection Special methods


In addition to the special attributes described above, all Python classes also
have the following two methods available:

@geindex mro() (type 메서드)
@anchor{reference/datamodel type mro}@anchor{2376}
@deffn {메서드} type.mro ()

This method can be overridden by a metaclass to customize the method
resolution order for its instances.  It is called at class instantiation,
and its result is stored in @ref{2374,,__mro__}.
@end deffn

@geindex __subclasses__() (type 메서드)
@anchor{reference/datamodel type __subclasses__}@anchor{792}
@deffn {메서드} type.__subclasses__ ()

Each class keeps a list of weak references to its immediate subclasses. This
method returns a list of all those references still alive. The list is in
definition order. Example:

@example
>>> class A: pass
>>> class B(A): pass
>>> A.__subclasses__()
[<class 'B'>]
@end example
@end deffn

@node 클래스 인스턴스 Class instances,I/O 객체 파일 객체라고도 알려져 있습니다,사용자 정의 클래스 Custom classes,표준형 계층
@anchor{reference/datamodel id4}@anchor{2377}
@subsubsection 클래스 인스턴스(Class instances)


@geindex object;class instance
@geindex object;instance
@geindex class;instance
@geindex class instance;attribute

A class instance is created by calling a class object (see above).  A class
instance has a namespace implemented as a dictionary which is the first place
in which attribute references are searched.  When an attribute is not found
there, and the instance’s class has an attribute by that name, the search
continues with the class attributes.  If a class attribute is found that is a
user-defined function object, it is transformed into an instance method
object whose @ref{15cd,,__self__} attribute is the instance.  Static method and
class method objects are also transformed; see above under “Classes”.  See
section @ref{e48,,디스크립터 구현하기} for another way in which attributes of a class
retrieved via its instances may differ from the objects actually stored in
the class’s @ref{77c,,__dict__}.  If no class attribute is found, and the
object’s class has a @ref{6f9,,__getattr__()} method, that is called to satisfy
the lookup.

@geindex class instance;attribute;assignment

Attribute assignments and deletions update the instance’s dictionary, never a
class’s dictionary.  If the class has a @ref{2378,,__setattr__()} or
@ref{2379,,__delattr__()} method, this is called instead of updating the instance
dictionary directly.

@geindex object;numeric
@geindex object;sequence
@geindex object;mapping

어떤 특별한 이름들의 메서드들을 가지면, 클래스 인스턴스는 숫자, 시퀀스, 매핑인 척할 수 있습니다. @ref{e67,,특수 메서드 이름들} 섹션을 보십시오.

@menu
* Special attributes: Special attributes<2>. 

@end menu

@node Special attributes<2>,,,클래스 인스턴스 Class instances
@anchor{reference/datamodel id5}@anchor{237a}
@subsubsection Special attributes


@geindex __dict__ (instance attribute)
@geindex __class__ (instance attribute)

@geindex __class__ (object의 속성)
@anchor{reference/datamodel object __class__}@anchor{16b2}
@deffn {속성} object.__class__

The class to which a class instance belongs.
@end deffn

@geindex __dict__ (object의 속성)
@anchor{reference/datamodel object __dict__}@anchor{77c}
@deffn {속성} object.__dict__

A dictionary or other mapping object used to store an object’s (writable)
attributes. Not all instances have a @code{__dict__} attribute; see the
section on @ref{237b,,__slots__} for more details.
@end deffn

@node I/O 객체 파일 객체라고도 알려져 있습니다,내부 형 Internal types,클래스 인스턴스 Class instances,표준형 계층
@anchor{reference/datamodel i-o-objects-also-known-as-file-objects}@anchor{237c}
@subsubsection I/O 객체 (파일 객체라고도 알려져 있습니다)


@geindex built-in function;open
@geindex module;io
@geindex popen() (in module os)
@geindex makefile() (socket method)
@geindex sys.stdin
@geindex sys.stdout
@geindex sys.stderr
@geindex stdio
@geindex stdin (in module sys)
@geindex stdout (in module sys)
@geindex stderr (in module sys)

@ref{13c8,,파일 객체} 는 열린 파일을 나타냅니다. 파일 객체를 만드는 여러 가지 단축법이 있습니다: @ref{316,,open()} 내장 함수, @ref{31a,,os.popen()}, @ref{237d,,os.fdopen()} 과 소켓 객체의 @ref{13a4,,makefile()} 메서드 (그리고, 아마도 확장 모듈들이 제공하는 다른 함수들이나 메서드들).

File objects implement common methods, listed below, to simplify usage in
generic code. They are expected to be @ref{237e,,with 문 컨텍스트 관리자}.

@code{sys.stdin}, @code{sys.stdout}, @code{sys.stderr} 는 인터프리터의 표준 입력, 출력, 에러 스트림으로 초기화된 파일 객체들입니다; 모두 텍스트 모드로 열려서 @ref{8a3,,io.TextIOBase} 추상 클래스에 의해 정의된 인터페이스를 따릅니다.

@geindex read() (file 메서드)
@anchor{reference/datamodel file read}@anchor{237f}
@deffn {메서드} file.read (size=-1, /)

Retrieve up to `size' data from the file. As a convenience if `size' is
unspecified or -1 retrieve all data available.
@end deffn

@geindex write() (file 메서드)
@anchor{reference/datamodel file write}@anchor{2380}
@deffn {메서드} file.write (data, /)

Store `data' to the file.
@end deffn

@geindex close() (file 메서드)
@anchor{reference/datamodel file close}@anchor{2381}
@deffn {메서드} file.close ()

Flush any buffers and close the underlying file.
@end deffn

@node 내부 형 Internal types,,I/O 객체 파일 객체라고도 알려져 있습니다,표준형 계층
@anchor{reference/datamodel internal-types}@anchor{2382}
@subsubsection 내부 형(Internal types)


@geindex internal type
@geindex types@comma{} internal

인터프리터가 내부적으로 사용하는 몇몇 형들은 사용자에게 노출됩니다. 인터프리터의 미래 버전에서 이들의 정의는 변경될 수 있지만, 완전함을 위해 여기서 언급합니다.

@menu
* 코드 객체(Code objects): 코드 객체 Code objects. 
* 프레임 객체(Frame objects): 프레임 객체 Frame objects. 
* 트레이스백 객체(Traceback objects): 트레이스백 객체 Traceback objects. 
* 슬라이스 객체(Slice objects): 슬라이스 객체 Slice objects. 
* 스태틱 메서드 객체(Static method objects): 스태틱 메서드 객체 Static method objects. 
* 클래스 메서드 객체(Class method objects): 클래스 메서드 객체 Class method objects. 

@end menu

@node 코드 객체 Code objects,프레임 객체 Frame objects,,내부 형 Internal types
@anchor{reference/datamodel code-objects}@anchor{4e6}@anchor{reference/datamodel id6}@anchor{2383}
@subsubsection 코드 객체(Code objects)


@geindex bytecode
@geindex object;code
@geindex code object

코드 객체는 `바이트로 컴파일된(byte-compiled)' 실행 가능한 파이썬 코드를 나타내는데, 그냥 @ref{4ab,,바이트 코드} 라고도 부릅니다. 코드 객체와 함수 객체 간에는 차이가 있습니다; 함수 객체는 함수의 전역 공간(globals) (함수가 정의된 모듈)을 명시적으로 참조하고 있지만, 코드 객체는 어떤 문맥(context)도 갖고 있지 않습니다; 또한 기본 인자값들이 함수 객체에 저장되어 있지만 코드 객체에는 들어있지 않습니다 (실행 시간에 계산되는 값들을 나타내기 때문입니다). 함수 객체와는 달리, 코드 객체는 불변이고 가변 객체들에 대한 어떤 참조도 (직접 혹은 간접적으로도) 갖고 있지 않습니다.

@geindex co_argcount (code object attribute)
@geindex co_posonlyargcount (code object attribute)
@geindex co_kwonlyargcount (code object attribute)
@geindex co_code (code object attribute)
@geindex co_consts (code object attribute)
@geindex co_filename (code object attribute)
@geindex co_firstlineno (code object attribute)
@geindex co_flags (code object attribute)
@geindex co_lnotab (code object attribute)
@geindex co_name (code object attribute)
@geindex co_names (code object attribute)
@geindex co_nlocals (code object attribute)
@geindex co_stacksize (code object attribute)
@geindex co_varnames (code object attribute)
@geindex co_cellvars (code object attribute)
@geindex co_freevars (code object attribute)
@geindex co_qualname (code object attribute)

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

@end menu

@node Special read-only attributes<2>,Methods on code objects,,코드 객체 Code objects
@anchor{reference/datamodel id7}@anchor{2384}
@subsubsection Special read-only attributes



@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

@geindex co_name (codeobject의 속성)
@anchor{reference/datamodel codeobject co_name}@anchor{2385}
@deffn {속성} codeobject.co_name
@end deffn

@tab

The function name

@item

@geindex co_qualname (codeobject의 속성)
@anchor{reference/datamodel codeobject co_qualname}@anchor{2386}
@deffn {속성} codeobject.co_qualname
@end deffn

@tab

The fully qualified function name


Added in version 3.11.


@item

@geindex co_argcount (codeobject의 속성)
@anchor{reference/datamodel codeobject co_argcount}@anchor{2387}
@deffn {속성} codeobject.co_argcount
@end deffn

@tab

The total number of positional @ref{2348,,parameters}
(including positional-only parameters and parameters with default values)
that the function has

@item

@geindex co_posonlyargcount (codeobject의 속성)
@anchor{reference/datamodel codeobject co_posonlyargcount}@anchor{2388}
@deffn {속성} codeobject.co_posonlyargcount
@end deffn

@tab

The number of positional-only @ref{2348,,parameters}
(including arguments with default values) that the function has

@item

@geindex co_kwonlyargcount (codeobject의 속성)
@anchor{reference/datamodel codeobject co_kwonlyargcount}@anchor{2389}
@deffn {속성} codeobject.co_kwonlyargcount
@end deffn

@tab

The number of keyword-only @ref{2348,,parameters}
(including arguments with default values) that the function has

@item

@geindex co_nlocals (codeobject의 속성)
@anchor{reference/datamodel codeobject co_nlocals}@anchor{238a}
@deffn {속성} codeobject.co_nlocals
@end deffn

@tab

The number of @ref{2343,,local variables} used by the function
(including parameters)

@item

@geindex co_varnames (codeobject의 속성)
@anchor{reference/datamodel codeobject co_varnames}@anchor{238b}
@deffn {속성} codeobject.co_varnames
@end deffn

@tab

A @ref{610,,tuple} containing the names of the local variables in the
function (starting with the parameter names)

@item

@geindex co_cellvars (codeobject의 속성)
@anchor{reference/datamodel codeobject co_cellvars}@anchor{238c}
@deffn {속성} codeobject.co_cellvars
@end deffn

@tab

A @ref{610,,tuple} containing the names of @ref{2343,,local variables}
that are referenced from at least one @ref{238d,,nested scope} inside the function

@item

@geindex co_freevars (codeobject의 속성)
@anchor{reference/datamodel codeobject co_freevars}@anchor{2344}
@deffn {속성} codeobject.co_freevars
@end deffn

@tab

A @ref{610,,tuple} containing the names of
@ref{1895,,free (closure) variables} that a @ref{238d,,nested scope}
references in an outer scope. See also @ref{14d5,,function.__closure__}.

Note: references to global and builtin names are `not' included.

@item

@geindex co_code (codeobject의 속성)
@anchor{reference/datamodel codeobject co_code}@anchor{238e}
@deffn {속성} codeobject.co_code
@end deffn

@tab

A string representing the sequence of @ref{4ab,,bytecode} instructions in
the function

@item

@geindex co_consts (codeobject의 속성)
@anchor{reference/datamodel codeobject co_consts}@anchor{189d}
@deffn {속성} codeobject.co_consts
@end deffn

@tab

A @ref{610,,tuple} containing the literals used by the @ref{4ab,,bytecode} in
the function

@item

@geindex co_names (codeobject의 속성)
@anchor{reference/datamodel codeobject co_names}@anchor{238f}
@deffn {속성} codeobject.co_names
@end deffn

@tab

A @ref{610,,tuple} containing the names used by the @ref{4ab,,bytecode} in
the function

@item

@geindex co_filename (codeobject의 속성)
@anchor{reference/datamodel codeobject co_filename}@anchor{1572}
@deffn {속성} codeobject.co_filename
@end deffn

@tab

The name of the file from which the code was compiled

@item

@geindex co_firstlineno (codeobject의 속성)
@anchor{reference/datamodel codeobject co_firstlineno}@anchor{2390}
@deffn {속성} codeobject.co_firstlineno
@end deffn

@tab

The line number of the first line of the function

@item

@geindex co_lnotab (codeobject의 속성)
@anchor{reference/datamodel codeobject co_lnotab}@anchor{330}
@deffn {속성} codeobject.co_lnotab
@end deffn

@tab

A string encoding the mapping from @ref{4ab,,bytecode} offsets to line
numbers. For details, see the source code of the interpreter.


버전 3.12부터 폐지됨: This attribute of code objects is deprecated, and may be removed in
Python 3.15.


@item

@geindex co_stacksize (codeobject의 속성)
@anchor{reference/datamodel codeobject co_stacksize}@anchor{2391}
@deffn {속성} codeobject.co_stacksize
@end deffn

@tab

The required stack size of the code object

@item

@geindex co_flags (codeobject의 속성)
@anchor{reference/datamodel codeobject co_flags}@anchor{18dc}
@deffn {속성} codeobject.co_flags
@end deffn

@tab

An @ref{19b,,integer} encoding a number of flags for the
interpreter.

@end multitable


@geindex object;generator

The following flag bits are defined for @ref{18dc,,co_flags}:
bit @code{0x04} is set if
the function uses the @code{*arguments} syntax to accept an arbitrary number of
positional arguments; bit @code{0x08} is set if the function uses the
@code{**keywords} syntax to accept arbitrary keyword arguments; bit @code{0x20} is set
if the function is a generator. See @ref{2392,,코드 객체 비트 플래그} for details
on the semantics of each flags that might be present.

Future feature declarations (for example, @code{from __future__ import division}) also use bits
in @ref{18dc,,co_flags} to indicate whether a code object was compiled with a
particular feature enabled. See @ref{2393,,compiler_flag}.

Other bits in @ref{18dc,,co_flags} are reserved for internal use.

@geindex documentation string

If a code object represents a function and has a docstring,
the @ref{2394,,CO_HAS_DOCSTRING} bit is set in @ref{18dc,,co_flags}
and the first item in @ref{189d,,co_consts} is
the docstring of the function.

@node Methods on code objects,,Special read-only attributes<2>,코드 객체 Code objects
@anchor{reference/datamodel methods-on-code-objects}@anchor{2395}
@subsubsection Methods on code objects


@geindex co_positions() (codeobject 메서드)
@anchor{reference/datamodel codeobject co_positions}@anchor{7cf}
@deffn {메서드} codeobject.co_positions ()

Returns an iterable over the source code positions of each @ref{4ab,,bytecode}
instruction in the code object.

The iterator returns @ref{610,,tuple}s containing the @code{(start_line, end_line,
start_column, end_column)}. The `i-th' tuple corresponds to the
position of the source code that compiled to the `i-th' code unit.
Column information is 0-indexed utf-8 byte offsets on the given source
line.

This positional information can be missing. A non-exhaustive lists of
cases where this may happen:


@itemize -

@item 
Running the interpreter with @ref{16f,,-X} @code{no_debug_ranges}.

@item 
Loading a pyc file compiled while using @ref{16f,,-X} @code{no_debug_ranges}.

@item 
Position tuples corresponding to artificial instructions.

@item 
Line and column numbers that can’t be represented due to
implementation specific limitations.
@end itemize

When this occurs, some or all of the tuple elements can be
@ref{884,,None}.


Added in version 3.11.


@cartouche
@quotation 참고 
This feature requires storing column positions in code objects which may
result in a small increase of disk usage of compiled Python files or
interpreter memory usage. To avoid storing the extra information and/or
deactivate printing the extra traceback information, the
@ref{16f,,-X} @code{no_debug_ranges} command line flag or the 
@geindex PYTHONNODEBUGRANGES
@geindex 환경 변수; PYTHONNODEBUGRANGES
@ref{7d2,,PYTHONNODEBUGRANGES}
environment variable can be used.
@end quotation
@end cartouche
@end deffn

@geindex co_lines() (codeobject 메서드)
@anchor{reference/datamodel codeobject co_lines}@anchor{350}
@deffn {메서드} codeobject.co_lines ()

Returns an iterator that yields information about successive ranges of
@ref{4ab,,bytecode}s. Each item yielded is a @code{(start, end, lineno)}
@ref{610,,tuple}:


@itemize *

@item 
@code{start} (an @ref{19b,,int}) represents the offset (inclusive) of the start
of the @ref{4ab,,bytecode} range

@item 
@code{end} (an @ref{19b,,int}) represents the offset (exclusive) of the end of
the @ref{4ab,,bytecode} range

@item 
@code{lineno} is an @ref{19b,,int} representing the line number of the
@ref{4ab,,bytecode} range, or @code{None} if the bytecodes in the given range
have no line number
@end itemize

The items yielded will have the following properties:


@itemize *

@item 
The first range yielded will have a @code{start} of 0.

@item 
The @code{(start, end)} ranges will be non-decreasing and consecutive. That
is, for any pair of @ref{610,,tuple}s, the @code{start} of the second will be
equal to the @code{end} of the first.

@item 
No range will be backwards: @code{end >= start} for all triples.

@item 
The last @ref{610,,tuple} yielded will have @code{end} equal to the size of the
@ref{4ab,,bytecode}.
@end itemize

Zero-width ranges, where @code{start == end}, are allowed. Zero-width ranges
are used for lines that are present in the source code, but have been
eliminated by the @ref{4ab,,bytecode} compiler.


Added in version 3.10.



@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 626

@item PEP 626@footnote{https://peps.python.org/pep-0626/} - Precise line numbers for debugging and other tools.

The PEP that introduced the @code{co_lines()} method.
@end table

@end deffn

@geindex replace() (codeobject 메서드)
@anchor{reference/datamodel codeobject replace}@anchor{2396}
@deffn {메서드} codeobject.replace (**kwargs)

Return a copy of the code object with new values for the specified fields.

Code objects are also supported by the generic function @ref{1c0,,copy.replace()}.


Added in version 3.8.

@end deffn

@node 프레임 객체 Frame objects,트레이스백 객체 Traceback objects,코드 객체 Code objects,내부 형 Internal types
@anchor{reference/datamodel frame-objects}@anchor{8ee}@anchor{reference/datamodel id8}@anchor{2397}
@subsubsection 프레임 객체(Frame objects)


@geindex object;frame

Frame objects represent execution frames.  They may occur in
@ref{cea,,traceback objects},
and are also passed to registered trace functions.

@geindex f_back (frame attribute)
@geindex f_code (frame attribute)
@geindex f_globals (frame attribute)
@geindex f_locals (frame attribute)
@geindex f_lasti (frame attribute)
@geindex f_builtins (frame attribute)
@geindex f_generator (frame attribute)

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

@end menu

@node Special read-only attributes<3>,Special writable attributes<2>,,프레임 객체 Frame objects
@anchor{reference/datamodel id9}@anchor{2398}
@subsubsection Special read-only attributes



@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

@geindex f_back (frame의 속성)
@anchor{reference/datamodel frame f_back}@anchor{98e}
@deffn {속성} frame.f_back
@end deffn

@tab

Points to the previous stack frame (towards the caller),
or @code{None} if this is the bottom stack frame

@item

@geindex f_code (frame의 속성)
@anchor{reference/datamodel frame f_code}@anchor{2399}
@deffn {속성} frame.f_code
@end deffn

@tab

The @ref{4e6,,code object} being executed in this frame.
Accessing this attribute raises an @ref{1c6c,,auditing event}
@code{object.__getattr__} with arguments @code{obj} and @code{"f_code"}.

@item

@geindex f_locals (frame의 속성)
@anchor{reference/datamodel frame f_locals}@anchor{4a6}
@deffn {속성} frame.f_locals
@end deffn

@tab

The mapping used by the frame to look up
@ref{2343,,local variables}.
If the frame refers to an @ref{4a2,,optimized scope},
this may return a write-through proxy object.


버전 3.13에서 변경: Return a proxy for optimized scopes.


@item

@geindex f_globals (frame의 속성)
@anchor{reference/datamodel frame f_globals}@anchor{239a}
@deffn {속성} frame.f_globals
@end deffn

@tab

The dictionary used by the frame to look up
@ref{2343,,global variables}

@item

@geindex f_builtins (frame의 속성)
@anchor{reference/datamodel frame f_builtins}@anchor{239b}
@deffn {속성} frame.f_builtins
@end deffn

@tab

The dictionary used by the frame to look up
@ref{2343,,built-in (intrinsic) names}

@item

@geindex f_lasti (frame의 속성)
@anchor{reference/datamodel frame f_lasti}@anchor{a88}
@deffn {속성} frame.f_lasti
@end deffn

@tab

The “precise instruction” of the frame object
(this is an index into the @ref{4ab,,bytecode} string of the
@ref{4e6,,code object})

@item

@geindex f_generator (frame의 속성)
@anchor{reference/datamodel frame f_generator}@anchor{239c}
@deffn {속성} frame.f_generator
@end deffn

@tab

The @ref{1260,,generator} or @ref{6b8,,coroutine} object that owns this frame,
or @code{None} if the frame is a normal function.


Added in version 3.14.


@end multitable


@geindex f_trace (frame attribute)
@geindex f_trace_lines (frame attribute)
@geindex f_trace_opcodes (frame attribute)
@geindex f_lineno (frame attribute)

@node Special writable attributes<2>,Frame object methods,Special read-only attributes<3>,프레임 객체 Frame objects
@anchor{reference/datamodel id10}@anchor{239d}
@subsubsection Special writable attributes



@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

@geindex f_trace (frame의 속성)
@anchor{reference/datamodel frame f_trace}@anchor{239e}
@deffn {속성} frame.f_trace
@end deffn

@tab

If not @code{None}, this is a function called for various events during
code execution (this is used by debuggers). Normally an event is
triggered for each new source line (see @ref{dd5,,f_trace_lines}).

@item

@geindex f_trace_lines (frame의 속성)
@anchor{reference/datamodel frame f_trace_lines}@anchor{dd5}
@deffn {속성} frame.f_trace_lines
@end deffn

@tab

Set this attribute to @ref{d2a,,False} to disable triggering a tracing
event for each source line.

@item

@geindex f_trace_opcodes (frame의 속성)
@anchor{reference/datamodel frame f_trace_opcodes}@anchor{dd6}
@deffn {속성} frame.f_trace_opcodes
@end deffn

@tab

Set this attribute to @ref{e06,,True} to allow per-opcode events to be
requested. Note that this may lead to
undefined interpreter behaviour if exceptions raised by the trace
function escape to the function being traced.

@item

@geindex f_lineno (frame의 속성)
@anchor{reference/datamodel frame f_lineno}@anchor{9af}
@deffn {속성} frame.f_lineno
@end deffn

@tab

The current line number of the frame – writing to this
from within a trace function jumps to the given line (only for the bottom-most
frame).  A debugger can implement a Jump command (aka Set Next Statement)
by writing to this attribute.

@end multitable


@node Frame object methods,,Special writable attributes<2>,프레임 객체 Frame objects
@anchor{reference/datamodel frame-object-methods}@anchor{239f}
@subsubsection Frame object methods


프레임 객체는 한가지 메서드를 지원합니다:

@geindex clear() (frame 메서드)
@anchor{reference/datamodel frame clear}@anchor{584}
@deffn {메서드} frame.clear ()

This method clears all references to @ref{2343,,local variables} held by the
frame.  Also, if the frame belonged to a @ref{1260,,generator}, the generator
is finalized.  This helps break reference cycles involving frame
objects (for example when catching an @ref{1c25,,exception}
and storing its @ref{cea,,traceback} for later use).

@ref{244,,RuntimeError} is raised if the frame is currently executing
or suspended.


Added in version 3.4.



버전 3.13에서 변경: Attempting to clear a suspended frame raises @ref{244,,RuntimeError}
(as has always been the case for executing frames).

@end deffn

@node 트레이스백 객체 Traceback objects,슬라이스 객체 Slice objects,프레임 객체 Frame objects,내부 형 Internal types
@anchor{reference/datamodel id11}@anchor{23a0}@anchor{reference/datamodel traceback-objects}@anchor{cea}
@subsubsection 트레이스백 객체(Traceback objects)


@geindex object;traceback
@geindex stack;trace
@geindex exception;handler
@geindex execution;stack
@geindex exc_info (in module sys)
@geindex last_traceback (in module sys)
@geindex sys.exc_info
@geindex sys.exception
@geindex sys.last_traceback

Traceback objects represent the stack trace of an @ref{2070,,exception}.
A traceback object
is implicitly created when an exception occurs, and may also be explicitly
created by calling @ref{ce9,,types.TracebackType}.


버전 3.7에서 변경: Traceback objects can now be explicitly instantiated from Python code.


For implicitly created tracebacks, when the search for an exception handler
unwinds the execution stack, at each unwound level a traceback object is
inserted in front of the current traceback.  When an exception handler is
entered, the stack trace is made available to the program. (See section
@ref{8f7,,try 문}.) It is accessible as the third item of the
tuple returned by @ref{899,,sys.exc_info()}, and as the
@ref{14cb,,__traceback__} attribute
of the caught exception.

When the program contains no suitable
handler, the stack trace is written (nicely formatted) to the standard error
stream; if the interpreter is interactive, it is also made available to the user
as @ref{6e7,,sys.last_traceback}.

For explicitly created tracebacks, it is up to the creator of the traceback
to determine how the @ref{ceb,,tb_next} attributes should be linked to
form a full stack trace.

@geindex tb_frame (traceback attribute)
@geindex tb_lineno (traceback attribute)
@geindex tb_lasti (traceback attribute)
@geindex statement;try

Special read-only attributes:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

@geindex tb_frame (traceback의 속성)
@anchor{reference/datamodel traceback tb_frame}@anchor{23a1}
@deffn {속성} traceback.tb_frame
@end deffn

@tab

Points to the execution @ref{8ee,,frame} of the current
level.

Accessing this attribute raises an
@ref{1c6c,,auditing event} @code{object.__getattr__} with arguments
@code{obj} and @code{"tb_frame"}.

@item

@geindex tb_lineno (traceback의 속성)
@anchor{reference/datamodel traceback tb_lineno}@anchor{23a2}
@deffn {속성} traceback.tb_lineno
@end deffn

@tab

Gives the line number where the exception occurred

@item

@geindex tb_lasti (traceback의 속성)
@anchor{reference/datamodel traceback tb_lasti}@anchor{23a3}
@deffn {속성} traceback.tb_lasti
@end deffn

@tab

Indicates the “precise instruction”.

@end multitable


The line number and last instruction in the traceback may differ from the
line number of its @ref{8ee,,frame object} if the exception
occurred in a
@ref{8f7,,try} statement with no matching except clause or with a
@ref{1b0,,finally} clause.

@geindex tb_next (traceback attribute)

@geindex tb_next (traceback의 속성)
@anchor{reference/datamodel traceback tb_next}@anchor{ceb}
@deffn {속성} traceback.tb_next

The special writable attribute @code{tb_next} is the next level in the
stack trace (towards the frame where the exception occurred), or @code{None} if
there is no next level.


버전 3.7에서 변경: This attribute is now writable

@end deffn

@node 슬라이스 객체 Slice objects,스태틱 메서드 객체 Static method objects,트레이스백 객체 Traceback objects,내부 형 Internal types
@anchor{reference/datamodel slice-objects}@anchor{23a4}
@subsubsection 슬라이스 객체(Slice objects)


@geindex built-in function;slice

Slice objects are used to represent slices for
@ref{588,,__getitem__()}
methods.  They are also created by the built-in @ref{693,,slice()} function.

@geindex start (slice object attribute)
@geindex stop (slice object attribute)
@geindex step (slice object attribute)

특수 읽기 전용 어트리뷰트들: @ref{23a5,,start} 는 하한(lower bound) 입니다; @ref{23a6,,stop} 은 상한(upper bound) 입니다; @ref{23a7,,step} 은 스텝 값입니다; 각 값은 생략될 경우 @code{None} 입니다. 이 어트리뷰트들은 임의의 형이 될 수 있습니다.

슬라이스 객체는 하나의 메서드를 지원합니다.

@geindex indices() (slice 메서드)
@anchor{reference/datamodel slice indices}@anchor{1226}
@deffn {메서드} slice.indices (self, length)

이 메서드는 하나의 정수 인자 `length' 를 받아서 슬라이스 객체가 길이 `length' 인 시퀀스에 적용되었을 때 그 슬라이스에 대한 정보를 계산합니다. 세 개의 정수로 구성된 튜플을 돌려줍니다: 이것들은 각각 `start' 와 `stop' 인덱스와, `step' 또는 슬라이스의 스트라이드(stride) 길이입니다. 생략되었거나 범위를 벗어난 인덱스들은 일반적인 슬라이스와 같은 방법으로 다뤄집니다.
@end deffn

@node 스태틱 메서드 객체 Static method objects,클래스 메서드 객체 Class method objects,슬라이스 객체 Slice objects,내부 형 Internal types
@anchor{reference/datamodel static-method-objects}@anchor{23a8}
@subsubsection 스태틱 메서드 객체(Static method objects)


Static method objects provide a way of defeating the transformation of function
objects to method objects described above. A static method object is a wrapper
around any other object, usually a user-defined method object. When a static
method object is retrieved from a class or a class instance, the object actually
returned is the wrapped object, which is not subject to any further
transformation. Static method objects are also callable. Static method
objects are created by the built-in @ref{453,,staticmethod()} constructor.

@node 클래스 메서드 객체 Class method objects,,스태틱 메서드 객체 Static method objects,내부 형 Internal types
@anchor{reference/datamodel class-method-objects}@anchor{23a9}
@subsubsection 클래스 메서드 객체(Class method objects)


A class method object, like a static method object, is a wrapper around another
object that alters the way in which that object is retrieved from classes and
class instances. The behaviour of class method objects upon such retrieval is
described above, under @ref{20a5,,“instance methods”}. Class method objects are created
by the built-in @ref{48f,,classmethod()} constructor.

@node 특수 메서드 이름들,코루틴 Coroutines,표준형 계층,데이터 모델
@anchor{reference/datamodel special-method-names}@anchor{23aa}@anchor{reference/datamodel specialnames}@anchor{e67}
@subsection 특수 메서드 이름들


@geindex operator;overloading
@geindex __getitem__() (mapping object method)

A class can implement certain operations that are invoked by special syntax
(such as arithmetic operations or subscripting and slicing) by defining methods
with special names. This is Python’s approach to `operator overloading',
allowing classes to define their own behavior with respect to language
operators.  For instance, if a class defines a method named
@ref{588,,__getitem__()},
and @code{x} is an instance of this class, then @code{x[i]} is roughly equivalent
to @code{type(x).__getitem__(x, i)}.  Except where mentioned, attempts to execute an
operation raise an exception when no appropriate method is defined (typically
@ref{5ee,,AttributeError} or @ref{198,,TypeError}).

Setting a special method to @code{None} indicates that the corresponding
operation is not available.  For example, if a class sets
@ref{e68,,__iter__()} to @code{None}, the class is not iterable, so calling
@ref{9d7,,iter()} on its instances will raise a @ref{198,,TypeError} (without
falling back to @ref{588,,__getitem__()}). @footnote{
The @ref{cf2,,__hash__()}, @ref{e68,,__iter__()},
@ref{e85,,__reversed__()}, @ref{15be,,__contains__()},
@ref{942,,__class_getitem__()} and @ref{e4b,,__fspath__()}
methods have special handling for this. Others
will still raise a @ref{198,,TypeError}, but may do so by relying on
the behavior that @code{None} is not callable.
}

When implementing a class that emulates any built-in type, it is important that
the emulation only be implemented to the degree that it makes sense for the
object being modelled.  For example, some sequences may work well with retrieval
of individual elements, but extracting a slice may not make sense.
(One example of this is the @ref{23ab,,NodeList} interface
in the W3C’s Document Object Model.)

@menu
* 기본적인 커스터마이제이션:: 
* 어트리뷰트 액세스 커스터마이제이션:: 
* 클래스 생성 커스터마이제이션:: 
* 인스턴스 및 서브 클래스 검사 커스터마이제이션:: 
* 제네릭 형 흉내 내기:: 
* 콜러블 객체 흉내 내기:: 
* 컨테이너형 흉내 내기:: 
* 숫자 형 흉내 내기:: 
* with 문 컨텍스트 관리자:: 
* Customizing positional arguments in class pattern matching:: 
* Emulating buffer types:: 
* Annotations:: 
* 특수 메서드 조회:: 

@end menu

@node 기본적인 커스터마이제이션,어트리뷰트 액세스 커스터마이제이션,,특수 메서드 이름들
@anchor{reference/datamodel basic-customization}@anchor{23ac}@anchor{reference/datamodel customization}@anchor{23ad}
@subsubsection 기본적인 커스터마이제이션


@geindex __new__() (object 메서드)
@anchor{reference/datamodel object __new__}@anchor{79f}
@deffn {메서드} object.__new__ (cls[, ...])

@geindex subclassing;immutable types

클래스 `cls' 의 새 인스턴스를 만들기 위해 호출됩니다. @ref{79f,,__new__()} 는 스태틱 메서드입니다 (그렇게 선언하지 않아도 되는 특별한 경우입니다)인데, 첫 번째 인자로 만들려고 하는 인스턴스의 클래스가 전달됩니다. 나머지 인자들은 객체 생성자 표현(클래스 호출)에 전달된 것들입니다. @code{__new__()} 의 반환 값은 새 객체 인스턴스이어야 합니다 (보통 `cls' 의 인스턴스).

Typical implementations create a new instance of the class by invoking the
superclass’s @ref{79f,,__new__()} method using @code{super().__new__(cls[, ...])}
with appropriate arguments and then modifying the newly created instance
as necessary before returning it.

If @ref{79f,,__new__()} is invoked during object construction and it returns an
instance of `cls', then the new instance’s @ref{8be,,__init__()} method
will be invoked like @code{__init__(self[, ...])}, where `self' is the new instance
and the remaining arguments are the same as were passed to the object constructor.

만약 @ref{79f,,__new__()} 가 `cls' 의 인스턴스를 돌려주지 않으면, 새 인스턴스의 @ref{8be,,__init__()} 는 호출되지 않습니다.

@ref{79f,,__new__()} 는 주로 불변형(int, str, tuple과 같은)의 서브 클래스가 인스턴스 생성을 커스터마이즈할 수 있도록 하는 데 사용됩니다. 또한, 사용자 정의 메타 클래스에서 클래스 생성을 커스터마이즈하기 위해 자주 사용됩니다.
@end deffn

@geindex __init__() (object 메서드)
@anchor{reference/datamodel object __init__}@anchor{8be}
@deffn {메서드} object.__init__ (self[, ...])

@geindex class;constructor

(@ref{79f,,__new__()} 에 의해) 인스턴스가 만들어진 후에, 하지만 호출자에게 돌려주기 전에 호출됩니다. 인자들은 클래스 생성자 표현으로 전달된 것들입니다. 만약 베이스 클래스가 @ref{8be,,__init__()} 메서드를 갖고 있다면, 서브 클래스의 @code{__init__()} 메서드는, 있다면, 인스턴스에서 베이스 클래스가 차지하는 부분이 올바르게 초기화됨을 확실히 하기 위해 명시적으로 호출해주어야 합니다; 예를 들어: @code{super().__init__([args...])}.

객체를 만드는데 @ref{79f,,__new__()} 와 @ref{8be,,__init__()} 가 협력하고 있으므로 (@code{__new__()} 는 만들고, @code{__init__()} 는 그것을 커스터마이즈합니다), @code{__init__()} 가 @code{None} 이외의 값을 돌려주면 실행시간에 @ref{198,,TypeError} 를 일으킵니다.
@end deffn

@geindex __del__() (object 메서드)
@anchor{reference/datamodel object __del__}@anchor{11fc}
@deffn {메서드} object.__del__ (self)

@geindex destructor
@geindex finalizer
@geindex statement;del

인스턴스가 파괴되기 직전에 호출됩니다. 파이널라이저 또는 (부적절하게) 파괴자라고 불립니다. 만약 베이스 클래스가 @ref{11fc,,__del__()} 메서드를 갖고 있다면, 자식 클래스의 @code{__del__()} 메서드는, 정의되어 있다면, 인스턴스에서 베이스 클래스가 차지하는 부분을 적절하게 삭제하기 위해, 명시적으로 베이스 클래스의 메서드를 호출해야 합니다.

(권장하지는 않지만!) @ref{11fc,,__del__()} 메서드는 인스턴스에 대한 새로운 참조를 만듦으로써 인스턴스의 파괴를 지연시킬 수 있습니다. 이것을 객체 `부활' 이라고 부릅니다. 부활한 객체가 파괴될 때 @code{__del__()} 이 두 번째로 호출될지는 구현에 따라 다릅니다; 현재 @ref{904,,CPython} 구현은 오직 한 번만 호출합니다.

It is not guaranteed that @code{__del__()} methods are called for objects
that still exist when the interpreter exits.
@ref{c6e,,weakref.finalize} provides a straightforward way to register
a cleanup function to be called when an object is garbage collected.

@cartouche
@quotation 참고 
@code{del x} 는 직접 @code{x.__del__()} 를 호출하지 않습니다 — 앞에 있는 것은 @code{x} 의 참조 횟수(reference count)를 하나 감소시키고, 뒤에 있는 것은 @code{x} 의 참조 횟수가 0 이 될 때 호출됩니다.
@end quotation
@end cartouche

`CPython 구현 상세:' It is possible for a reference cycle to prevent the reference count
of an object from going to zero.  In this case, the cycle will be
later detected and deleted by the @ref{17dd,,cyclic garbage collector}.  A common cause of reference cycles is when
an exception has been caught in a local variable.  The frame’s
locals then reference the exception, which references its own
traceback, which references the locals of all frames caught in the
traceback.


@subsubheading 더 보기


@ref{64,,gc} 모듈에 대한 문서.


@cartouche
@quotation 경고 
@ref{11fc,,__del__()} 이 호출되는 불안정한 상황 때문에, 이것이 실행 중에 발생시키는 예외는 무시되고, 대신에 @code{sys.stderr} 로 경고가 출력됩니다. 특히:


@itemize *

@item 
@ref{11fc,,__del__()} 은 (임의의 스레드에서) 임의의 코드가 실행되는 동안 호출될 수 있습니다. @code{__del__()} 이 록을 얻어야 하거나 다른 블로킹 자원을 호출하면, @code{__del__()} 을 실행하기 위해 중단된 코드가 자원을 이미 차지했을 수 있으므로 교착 상태에 빠질 수 있습니다.

@item 
@ref{11fc,,__del__()} 은 인터프리터를 종료할 때 실행될 수 있습니다. 결과적으로, 액세스해야 하는 전역 변수(다른 모듈 포함)가 이미 삭제되었거나 @code{None} 으로 설정되었을 수 있습니다. 파이썬은 이름이 하나의 밑줄로 시작하는 전역 객체가 다른 전역 객체들보다 먼저 삭제됨을 보장합니다; 이것은, 만약 그 전역 객체들에 대한 다른 참조가 존재하지 않는다면, @code{__del__()} 메서드가 호출되는 시점에, 임포트된 모듈들이 남아있도록 확실히 하는 데 도움이 될 수 있습니다.
@end itemize
@end quotation
@end cartouche

@geindex repr() (built-in function);__repr__() (object method)
@end deffn

@geindex __repr__() (object 메서드)
@anchor{reference/datamodel object __repr__}@anchor{82e}
@deffn {메서드} object.__repr__ (self)

@ref{1c1,,repr()} 내장 함수에 의해 호출되어 객체의 “형식적인(official)” 문자열 표현을 계산합니다. 만약 가능하다면, 이것은 같은 (적절한 환경이 주어질 때) 값을 갖는 객체를 새로 만들 수 있는 올바른 파이썬 표현식처럼 보여야 합니다. 가능하지 않다면, @code{<...쓸모있는 설명...>} 형태의 문자열을 돌려줘야 합니다. 반환 값은 반드시 문자열이어야 합니다. 만약 클래스가 @ref{82f,,__str__()} 없이 @ref{82e,,__repr__()} 만 정의한다면, @code{__repr__()} 은 그 클래스 인스턴스의 “비형식적인(informal)” 문자열 표현이 요구될 때 사용될 수 있습니다.

This is typically used for debugging, so it is important that the representation
is information-rich and unambiguous. A default implementation is provided by the
@ref{c7d,,object} class itself.

@geindex string;__str__() (object method)
@geindex format() (built-in function);__str__() (object method)
@geindex print() (built-in function);__str__() (object method)
@end deffn

@geindex __str__() (object 메서드)
@anchor{reference/datamodel object __str__}@anchor{82f}
@deffn {메서드} object.__str__ (self)

Called by @ref{169,,str(object)}, the default @ref{830,,__format__()} implementation,
and the built-in function @ref{1174,,print()}, to compute the “informal” or nicely
printable string representation of an object.  The return value must be a
@ref{1fdd,,str} object.

이 메서드는 @ref{82f,,__str__()} 이 올바른 파이썬 표현식을 돌려줄 것이라고 기대되지 않는다는 점에서 @ref{82e,,object.__repr__()} 과 다릅니다: 더 편리하고 간결한 표현이 사용될 수 있습니다.

내장형 @ref{c7d,,object} 에 정의된 기본 구현은 @ref{82e,,object.__repr__()} 을 호출합니다.

@c XXX what about subclasses of string?
@end deffn

@geindex __bytes__() (object 메서드)
@anchor{reference/datamodel object __bytes__}@anchor{7fd}
@deffn {메서드} object.__bytes__ (self)

@geindex built-in function;bytes

Called by @ref{1e96,,bytes} to compute a byte-string representation
of an object. This should return a @ref{192,,bytes} object. The @ref{c7d,,object}
class itself does not provide this method.

@geindex string;__format__() (object method)
@geindex string;conversion
@geindex built-in function;print
@end deffn

@geindex __format__() (object 메서드)
@anchor{reference/datamodel object __format__}@anchor{830}
@deffn {메서드} object.__format__ (self, format_spec)

@ref{199,,format()} 내장 함수, 확대하면, @ref{19a,,포맷 문자열 리터럴(formatted string literals)} 의 계산과 @ref{832,,str.format()} 메서드에 의해 호출되어, 객체의 “포맷된” 문자열 표현을 만들어냅니다. `format_spec' 인자는 요구되는 포맷 옵션들을 포함하는 문자열입니다. `format_spec' 인자의 해석은 @ref{830,,__format__()} 을 구현하는 형에 달려있으나, 대부분 클래스는 포매팅을 내향형들의 하나로 위임하거나, 비슷한 포맷 옵션 문법을 사용합니다.

표준 포매팅 문법에 대해서는 @ref{4f9,,Format specification mini-language} 를 참고하면 됩니다.

반환 값은 반드시 문자열이어야 합니다.

The default implementation by the @ref{c7d,,object} class should be given
an empty `format_spec' string. It delegates to @ref{82f,,__str__()}.


버전 3.4에서 변경: @code{object} 의 __format__ 메서드 자신은, 빈 문자열이 아닌 인자가 전달되면 @ref{198,,TypeError} 를 발생시킵니다.



버전 3.7에서 변경: 이제 @code{object.__format__(x, '@w{'})} 는 @code{format(str(x), '@w{'})} 가 아니라 @code{str(x)} 와 동등합니다.

@end deffn

@geindex __lt__() (object 메서드)
@geindex __le__() (object 메서드)
@geindex __eq__() (object 메서드)
@geindex __ne__() (object 메서드)
@geindex __gt__() (object 메서드)
@geindex __ge__() (object 메서드)
@anchor{reference/datamodel richcmpfuncs}@anchor{23ae}@anchor{reference/datamodel object __lt__}@anchor{14a5}
@deffn {메서드} object.__lt__ (self, other)
@anchor{reference/datamodel object __le__}@anchor{150f}
@deffnx {메서드} object.__le__ (self, other)
@anchor{reference/datamodel object __eq__}@anchor{cf1}
@deffnx {메서드} object.__eq__ (self, other)
@anchor{reference/datamodel object __ne__}@anchor{171c}
@deffnx {메서드} object.__ne__ (self, other)
@anchor{reference/datamodel object __gt__}@anchor{1510}
@deffnx {메서드} object.__gt__ (self, other)
@anchor{reference/datamodel object __ge__}@anchor{1511}
@deffnx {메서드} object.__ge__ (self, other)

@geindex comparisons

이것들은 소위 “풍부한 비교(rich comparison)” 메서드입니다. 연산자 기호와 메서드 이름 간의 관계는 다음과 같습니다: @code{x<y} 는 @code{x.__lt__(y)} 를 호출합니다, @code{x<=y} 는 @code{x.__le__(y)} 를 호출합니다, @code{x==y} 는 @code{x.__eq__(y)} 를 호출합니다, @code{x!=y} 는 @code{x.__ne__(y)} 를 호출합니다, @code{x>y} 는 @code{x.__gt__(y)} 를 호출합니다, @code{x>=y} 는 @code{x.__ge__(y)} 를 호출합니다.

A rich comparison method may return the singleton @ref{1a2,,NotImplemented} if it does
not implement the operation for a given pair of arguments. By convention,
@code{False} and @code{True} are returned for a successful comparison. However, these
methods can return any value, so if the comparison operator is used in a Boolean
context (e.g., in the condition of an @code{if} statement), Python will call
@ref{3c3,,bool()} on the value to determine if the result is true or false.

By default, @code{object} implements @code{__eq__()} by using @code{is}, returning
@ref{1a2,,NotImplemented} in the case of a false comparison:
@code{True if x is y else NotImplemented}. For @code{__ne__()}, by default it
delegates to @code{__eq__()} and inverts the result unless it is
@code{NotImplemented}.  There are no other implied relationships among the
comparison operators or default implementations; for example, the truth of
@code{(x<y or x==y)} does not imply @code{x<=y}. To automatically generate ordering
operations from a single root operation, see @ref{1141,,functools.total_ordering()}.

By default, the @ref{c7d,,object} class provides implementations consistent
with @ref{1c1e,,값 비교}: equality compares according to
object identity, and order comparisons raise @ref{198,,TypeError}. Each default
method may generate these results directly, but may also return
@ref{1a2,,NotImplemented}.

사용자 정의 비교 연산자를 지원하고 딕셔너리 키로 사용될 수 있는 @ref{823,,해시 가능} 객체를 만드는 것에 관한 몇 가지 중요한 내용이 @ref{cf2,,__hash__()} 에 관한 문단에 나옵니다.

There are no swapped-argument versions of these methods (to be used when the
left argument does not support the operation but the right argument does);
rather, @code{__lt__()} and @code{__gt__()} are each other’s reflection,
@code{__le__()} and @code{__ge__()} are each other’s reflection, and
@code{__eq__()} and @code{__ne__()} are their own reflection.
If the operands are of different types, and the right operand’s type is
a direct or indirect subclass of the left operand’s type,
the reflected method of the right operand has priority, otherwise
the left operand’s method has priority.  Virtual subclassing is
not considered.

When no appropriate method returns any value other than @ref{1a2,,NotImplemented}, the
@code{==} and @code{!=} operators will fall back to @code{is} and @code{is not}, respectively.
@end deffn

@geindex __hash__() (object 메서드)
@anchor{reference/datamodel object __hash__}@anchor{cf2}
@deffn {메서드} object.__hash__ (self)

@geindex object;dictionary
@geindex built-in function;hash

Called by built-in function @ref{800,,hash()} and for operations on members of
hashed collections including @ref{184,,set}, @ref{7f1,,frozenset}, and
@ref{183,,dict}.  The @code{__hash__()} method should return an integer. The only required
property is that objects which compare equal have the same hash value; it is
advised to mix together the hash values of the components of the object that
also play a part in comparison of objects by packing them into a tuple and
hashing the tuple. Example:

@example
def __hash__(self):
    return hash((self.name, self.nick, self.color))
@end example

@cartouche
@quotation 참고 
@ref{800,,hash()} 는 객체가 정의한 @ref{cf2,,__hash__()} 메서드가 돌려주는 값을 @ref{c54,,Py_ssize_t} 의 크기로 자릅니다(truncate). 이것은 보통 64-bit 빌드에서는 8바이트고, 32-bit 빌드에서는 4바이트입니다. 만약 객체의 @code{__hash__()} 가 서로 다른 비트 크기를 갖는 빌드들 사이에서 함께 사용되어야 한다면, 모든 지원할 빌드들에서의 폭을 검사해야 합니다. 이렇게 하는 쉬운 방법은 @code{python -c "import sys; print(sys.hash_info.width)"} 입니다.
@end quotation
@end cartouche

If a class does not define an @ref{cf1,,__eq__()} method it should not define a
@code{__hash__()} operation either; if it defines @code{__eq__()} but not
@code{__hash__()}, its instances will not be usable as items in hashable
collections.  If a class defines mutable objects and implements an
@code{__eq__()} method, it should not implement @code{__hash__()}, since the
implementation of @ref{823,,hashable} collections requires that a key’s hash value is
immutable (if the object’s hash value changes, it will be in the wrong hash
bucket).

User-defined classes have @ref{cf1,,__eq__()} and @code{__hash__()} methods
by default (inherited from the @ref{c7d,,object} class); with them, all objects compare
unequal (except with themselves) and @code{x.__hash__()} returns an appropriate
value such that @code{x == y} implies both that @code{x is y} and @code{hash(x) == hash(y)}.

@ref{cf1,,__eq__()} 를 재정의하고 @ref{cf2,,__hash__()} 를 정의하지 않는 클래스는 @code{__hash__()} 가 @code{None} 으로 설정됩니다. 클래스의 @code{__hash__()} 메서드가 @code{None} 이면, 클래스의 인스턴스는 프로그램이 해시값을 얻으려 시도할 때 @ref{198,,TypeError} 를 일으키고, @code{isinstance(obj, collections.abc.Hashable)} 로 검사할 때 해시 가능하지 않다고 올바로 감지됩니다.

만약 @ref{cf1,,__eq__()} 를 재정의하는 클래스가 부모 클래스로부터 @ref{cf2,,__hash__()} 의 구현을 물려받고 싶으면 인터프리터에게 명시적으로 이렇게 지정해주어야 합니다: @code{__hash__ = <ParentClass>.__hash__}.

만약 @ref{cf1,,__eq__()} 를 재정의하지 않는 클래스가 해시 지원을 멈추고 싶으면, 클래스 정의에 @code{__hash__ = None} 을 포함해야 합니다. 자신의 @ref{cf2,,__hash__()} 을 정의한 후에 직접 @ref{198,,TypeError} 를 일으키는 경우는 @code{isinstance(obj, collections.abc.Hashable)} 호출이 해시 가능하다고 잘못 인식합니다.

@cartouche
@quotation 참고 
기본적으로, str과 bytes 객체들의 @ref{cf2,,__hash__()} 값은 예측할 수 없는 난수값으로 “솔트되어(salted)” 있습니다. 개별 파이썬 프로세스 내에서는 변하지 않는 값으로 유지되지만, 파이썬을 반복적으로 실행할 때는 예측할 수 없게 됩니다.

This is intended to provide protection against a denial-of-service caused
by carefully chosen inputs that exploit the worst case performance of a
dict insertion, `O'(`n'@w{^2}) complexity.  See
@indicateurl{https://ocert.org/advisories/ocert-2011-003.html} for details.

해시값의 변경은 집합의 이터레이션 순서에 영향을 줍니다, 파이썬은 이 순서에 대해 어떤 보장도 하지 않습니다 (그리고 보통 32-bit 와 64-bit 빌드 사이에서도 다릅니다).

@geindex PYTHONHASHSEED
@geindex 환경 변수; PYTHONHASHSEED
@ref{127c,,PYTHONHASHSEED} 를 참고하십시오.
@end quotation
@end cartouche


버전 3.3에서 변경: 해시 난수 화는 기본적으로 활성화됩니다.

@end deffn

@geindex __bool__() (object 메서드)
@anchor{reference/datamodel object __bool__}@anchor{14da}
@deffn {메서드} object.__bool__ (self)

@geindex __len__() (mapping object method)

Called to implement truth value testing and the built-in operation
@code{bool()}; should return @code{False} or @code{True}.  When this method is not
defined, @ref{1797,,__len__()} is called, if it is defined, and the object is
considered true if its result is nonzero.  If a class defines neither
@code{__len__()} nor @code{__bool__()} (which is true of the @ref{c7d,,object}
class itself), all its instances are considered true.
@end deffn

@node 어트리뷰트 액세스 커스터마이제이션,클래스 생성 커스터마이제이션,기본적인 커스터마이제이션,특수 메서드 이름들
@anchor{reference/datamodel attribute-access}@anchor{23af}@anchor{reference/datamodel customizing-attribute-access}@anchor{23b0}
@subsubsection 어트리뷰트 액세스 커스터마이제이션


클래스 인스턴스의 어트리뷰트 참조(읽기, 대입하기, @code{x.name} 을 삭제하기)의 의미를 변경하기 위해 다음과 같은 메서드들이 정의될 수 있습니다.

@c XXX explain how descriptors interfere here!

@geindex __getattr__() (object 메서드)
@anchor{reference/datamodel object __getattr__}@anchor{6f9}
@deffn {메서드} object.__getattr__ (self, name)

Called when the default attribute access fails with an @ref{5ee,,AttributeError}
(either @ref{dca,,__getattribute__()} raises an @code{AttributeError} because
`name' is not an instance attribute or an attribute in the class tree
for @code{self}; or @ref{16ed,,__get__()} of a `name' property raises
@code{AttributeError}).  This method should either return the (computed)
attribute value or raise an @code{AttributeError} exception.
The @ref{c7d,,object} class itself does not provide this method.

Note that if the attribute is found through the normal mechanism,
@code{__getattr__()} is not called.  (This is an intentional asymmetry between
@code{__getattr__()} and @ref{2378,,__setattr__()}.) This is done both for efficiency
reasons and because otherwise @code{__getattr__()} would have no way to access
other attributes of the instance.  Note that at least for instance variables,
you can take total control by not inserting any values in the instance attribute
dictionary (but instead inserting them in another object).  See the
@ref{dca,,__getattribute__()} method below for a way to actually get total control
over attribute access.
@end deffn

@geindex __getattribute__() (object 메서드)
@anchor{reference/datamodel object __getattribute__}@anchor{dca}
@deffn {메서드} object.__getattribute__ (self, name)

클래스 인스턴스의 어트리뷰트 액세스를 구현하기 위해 조건 없이 호출됩니다. 만약 클래스가 @ref{6f9,,__getattr__()} 도 함께 구현하면, @ref{dca,,__getattribute__()} 가 명시적으로 호출하거나 @ref{5ee,,AttributeError} 를 일으키지 않는 이상 @cite{__getattr__} 는 호출되지 않습니다. 이 메서드는 어트리뷰트의 (계산된) 값을 돌려주거나 @code{AttributeError} 예외를 일으켜야 합니다. 이 메서드에서 무한 재귀(infinite recursion)가 발생하는 것을 막기 위해, 구현은 언제나 필요한 어트리뷰트에 접근하기 위해 같은 이름의 베이스 클래스의 메서드를 호출해야 합니다. 예를 들어, @code{object.__getattribute__(self, name)}.

@cartouche
@quotation 참고 
This method may still be bypassed when looking up special methods as the
result of implicit invocation via language syntax or
@ref{234b,,built-in functions}.
See @ref{23b1,,특수 메서드 조회}.
@end quotation
@end cartouche

특정 민감한 어트리뷰트 액세스의 경우, 인자 @code{obj}와 @code{name}으로 @ref{1c6c,,감사 이벤트} @code{object.__getattr__}을 발생시킵니다.
@end deffn

@geindex __setattr__() (object 메서드)
@anchor{reference/datamodel object __setattr__}@anchor{2378}
@deffn {메서드} object.__setattr__ (self, name, value)

어트리뷰트 대입이 시도될 때 호출됩니다. 일반적인 메커니즘(즉 인스턴스 딕셔너리에 값을 저장하는 것) 대신에 이것이 호출됩니다. `name' 은 어트리뷰트 이름이고, `value' 는 그것에 대입하려는 값입니다.

@ref{2378,,__setattr__()} 에서 인스턴스 어트리뷰트에 대입하려고 할 때는, 같은 이름의 베이스 클래스의 메서드를 호출해야 합니다. 예를 들어 @code{object.__setattr__(self, name, value)}

특정 민감한 어트리뷰트 대입의 경우, 인자 @code{obj}, @code{name}, @code{value}로 @ref{1c6c,,감사 이벤트} @code{object.__setattr__}을 발생시킵니다.
@end deffn

@geindex __delattr__() (object 메서드)
@anchor{reference/datamodel object __delattr__}@anchor{2379}
@deffn {메서드} object.__delattr__ (self, name)

@ref{2378,,__setattr__()} 과 비슷하지만 어트리뷰트를 대입하는 대신에 삭제합니다. 이것은 @code{del obj.name} 이 객체에 의미가 있는 경우에만 구현되어야 합니다.

특정 민감한 어트리뷰트 삭제의 경우, 인자 @code{obj}와 @code{name}으로 @ref{1c6c,,감사 이벤트} @code{object.__delattr__}을 발생시킵니다.
@end deffn

@geindex __dir__() (object 메서드)
@anchor{reference/datamodel object __dir__}@anchor{176c}
@deffn {메서드} object.__dir__ (self)

Called when @ref{843,,dir()} is called on the object. An iterable must be
returned. @code{dir()} converts the returned iterable to a list and sorts it.
@end deffn

@menu
* 모듈 어트리뷰트 액세스 커스터마이제이션:: 
* 디스크립터 구현하기:: 
* 디스크립터 호출하기:: 
* __slots__: __slots__<2>. 

@end menu

@node 모듈 어트리뷰트 액세스 커스터마이제이션,디스크립터 구현하기,,어트리뷰트 액세스 커스터마이제이션
@anchor{reference/datamodel customizing-module-attribute-access}@anchor{23b2}
@subsubsection 모듈 어트리뷰트 액세스 커스터마이제이션


@geindex __getattr__ (module attribute)
@geindex __dir__ (module attribute)
@geindex __class__ (module attribute)

@geindex __getattr__() (module 메서드)
@geindex __dir__() (module 메서드)
@anchor{reference/datamodel module __getattr__}@anchor{cd7}
@deffn {메서드} module.__getattr__ ()
@anchor{reference/datamodel module __dir__}@anchor{cd8}
@deffnx {메서드} module.__dir__ ()
@end deffn

특수한 이름 @code{__getattr__} 과 @code{__dir__} 는 모듈 어트리뷰트에 대한 접근을 사용자 정의하는 데 사용될 수도 있습니다. 모듈 수준의 @code{__getattr__} 함수는 하나의 인자로 어트리뷰트의 이름을 받아서 계산된 값을 돌려주거나 @ref{5ee,,AttributeError} 를 발생시켜야 합니다. 일반적인 조회(즉 @ref{dca,,object.__getattribute__()})를 통해 어트리뷰트가 모듈 객체에서 발견되지 않으면, @code{AttributeError} 를 일으키기 전에 모듈 @code{__dict__} 에서 @code{__getattr__} 을 검색합니다. 발견되면, 어트리뷰트 이름으로 그 함수를 호출하고 결과를 돌려줍니다.

The @code{__dir__} function should accept no arguments, and return an iterable of
strings that represents the names accessible on module. If present, this
function overrides the standard @ref{843,,dir()} search on a module.

@geindex __class__ (module의 속성)
@anchor{reference/datamodel module __class__}@anchor{23b3}
@deffn {속성} module.__class__
@end deffn

모듈 동작(어트리뷰트 설정, 프로퍼티 등)을 보다 세밀하게 사용자 정의하려면, 모듈 객체의 @code{__class__} 어트리뷰트를 @ref{1013,,types.ModuleType} 의 서브 클래스로 설정할 수 있습니다. 예를 들면:

@example
import sys
from types import ModuleType

class VerboseModule(ModuleType):
    def __repr__(self):
        return f'Verbose @{self.__name__@}'

    def __setattr__(self, attr, value):
        print(f'Setting @{attr@}...')
        super().__setattr__(attr, value)

sys.modules[__name__].__class__ = VerboseModule
@end example

@cartouche
@quotation 참고 
모듈 @code{__getattr__} 정의와 모듈 @code{__class__} 설정은 어트리뷰트 액세스 구문을 사용하는 조회에만 영향을 미칩니다 – 모듈 전역에 대한 직접적인 액세스(모듈 내의 코드에 의한 액세스이거나 모듈의 전역 딕셔너리에 대한 참조를 거치거나)는 영향받지 않습니다.
@end quotation
@end cartouche


버전 3.5에서 변경: 이제 @code{__class__} 모듈 어트리뷰트가 쓰기 가능합니다.



Added in version 3.7: @code{__getattr__} 과 @code{__dir__} 모듈 어트리뷰트.



@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 562

@item PEP 562@footnote{https://peps.python.org/pep-0562/} - 모듈 __getattr__ 과 __dir__

모듈에 대한 @code{__getattr__} 과 @code{__dir__} 함수를 설명합니다.
@end table


@node 디스크립터 구현하기,디스크립터 호출하기,모듈 어트리뷰트 액세스 커스터마이제이션,어트리뷰트 액세스 커스터마이제이션
@anchor{reference/datamodel descriptors}@anchor{e48}@anchor{reference/datamodel implementing-descriptors}@anchor{23b4}
@subsubsection 디스크립터 구현하기


The following methods only apply when an instance of the class containing the
method (a so-called `descriptor' class) appears in an `owner' class (the
descriptor must be in either the owner’s class dictionary or in the class
dictionary for one of its parents).  In the examples below, “the attribute”
refers to the attribute whose name is the key of the property in the owner
class’ @ref{77c,,__dict__}.  The @ref{c7d,,object} class itself does not
implement any of these protocols.

@geindex __get__() (object 메서드)
@anchor{reference/datamodel object __get__}@anchor{16ed}
@deffn {메서드} object.__get__ (self, instance, owner=None)

소유자 클래스(클래스 어트리뷰트 액세스) 나 그 클래스의 인스턴스(인스턴스 어트리뷰트 액세스)의 어트리뷰트를 취하려고 할 때 호출됩니다. 선택적 `owner' 인자는 소유자 클래스입니다. 반면에 `instance' 는 어트리뷰트 참조가 일어나고 있는 인스턴스이거나, 어트리뷰트가 `owner' 를 통해 액세스 되는 경우 @cite{None} 입니다.

이 메서드는 계산된 어트리뷰트 값을 돌려주거나 @ref{5ee,,AttributeError} 예외를 일으켜야 합니다.

@geindex Python 향상 제안; PEP 252
PEP 252@footnote{https://peps.python.org/pep-0252/}는 @ref{16ed,,__get__()}이 하나나 두 개의 인자를 갖는 콜러블이라고 지정합니다. 파이썬 자신의 내장 디스크립터는 이 명세를 지원합니다; 그러나, 일부 제삼자 도구에는 두 인수를 모두 요구하는 디스크립터가 있을 수 있습니다. 파이썬 자신의 @ref{dca,,__getattribute__()} 구현은 필요한지와 관계없이 항상 두 인자를 모두 전달합니다.
@end deffn

@geindex __set__() (object 메서드)
@anchor{reference/datamodel object __set__}@anchor{23b5}
@deffn {메서드} object.__set__ (self, instance, value)

소유자 클래스의 인스턴스 `instance' 의 어트리뷰트를 새 값 `value' 로 설정할 때 호출됩니다.

@ref{23b5,,__set__()}이나 @ref{1950,,__delete__()}를 추가하면 디스크립터 유형이 “데이터 디스크립터(data descriptor)”로 변경됨에 유의하십시오. 자세한 내용은 @ref{23b6,,디스크립터 호출하기}를 참조하십시오.
@end deffn

@geindex __delete__() (object 메서드)
@anchor{reference/datamodel object __delete__}@anchor{1950}
@deffn {메서드} object.__delete__ (self, instance)

소유자 클래스의 인스턴스 `instance' 의 어트리뷰트를 삭제할 때 호출됩니다.
@end deffn

Instances of descriptors may also have the @code{__objclass__} attribute
present:

@geindex __objclass__ (object의 속성)
@anchor{reference/datamodel object __objclass__}@anchor{23b7}
@deffn {속성} object.__objclass__

The attribute @code{__objclass__} is interpreted by the @ref{82,,inspect} module
as specifying the class where this object was defined (setting this
appropriately can assist in runtime introspection of dynamic class attributes).
For callables, it may indicate that an instance of the given type (or a
subclass) is expected or required as the first positional argument (for example,
CPython sets this attribute for unbound methods that are implemented in C).
@end deffn

@node 디스크립터 호출하기,__slots__<2>,디스크립터 구현하기,어트리뷰트 액세스 커스터마이제이션
@anchor{reference/datamodel descriptor-invocation}@anchor{23b6}@anchor{reference/datamodel invoking-descriptors}@anchor{23b8}
@subsubsection 디스크립터 호출하기


In general, a descriptor is an object attribute with “binding behavior”, one
whose attribute access has been overridden by methods in the descriptor
protocol:  @ref{16ed,,__get__()}, @ref{23b5,,__set__()}, and
@ref{1950,,__delete__()}. If any of
those methods are defined for an object, it is said to be a descriptor.

어트리뷰트 액세스의 기본 동작은 객체의 딕셔너리에서 어트리뷰트를 읽고, 쓰고, 삭제하는 것입니다. 예를 들어 @code{a.x} 는 @code{a.__dict__['x']} 에서 시작해서 @code{type(a).__dict__['x']} 를 거쳐 @code{type(a)} 의 메타 클래스를 제외한 베이스 클래스들을 거쳐 가는 일련의 조회로 구성됩니다.

그러나, 만약 조회한 값이 디스크립터 메서드를 구현한 객체면, 파이썬은 기본 동작 대신에 디스크립터 메서드를 호출할 수 있습니다. 우선순위 목록의 어느 위치에서 이런 일이 일어나는지는 어떤 디스크립터 메서드가 정의되어 있고 어떤 식으로 호출되는지에 따라 다릅니다.

디스크립터 호출의 시작점은 결합(binding)입니다, @code{a.x}. 어떻게 인자들이 조합되는지는 @code{a} 에 따라 다릅니다:


@table @asis

@item 직접 호출

가장 간단하면서도 가장 덜 사용되는 호출은 사용자의 코드가 디스크립터 메서드를 직접 호출할 때입니다: @code{x.__get__(a)}

@item 인스턴스 결합

객체 인스턴스에 결합하면, @code{a.x} 는 이런 호출로 변환됩니다: @code{type(a).__dict__['x'].__get__(a, type(a))}.

@item 클래스 결합

클래스에 결합하면, @code{A.x} 는 이런 호출로 변환됩니다: @code{A.__dict__['x'].__get__(None, A)}.

@item Super 결합

A dotted lookup such as @code{super(A, a).x} searches
@code{a.__class__.__mro__} for a base class @code{B} following @code{A} and then
returns @code{B.__dict__['x'].__get__(a, A)}.  If not a descriptor, @code{x} is
returned unchanged.
@end table

@c class Desc:
@c     def __get__(*args):
@c         return args
@c 
@c class B:
@c 
@c     x = Desc()
@c 
@c class A(B):
@c 
@c     x = 999
@c 
@c     def m(self):
@c         'Demonstrate these two descriptor invocations are equivalent'
@c         result1 = super(A, self).x
@c         result2 = B.__dict__['x'].__get__(self, A)
@c         return result1 == result2

@c >>> a = A()
@c >>> a.__class__.__mro__.index(B) > a.__class__.__mro__.index(A)
@c True
@c >>> super(A, a).x == B.__dict__['x'].__get__(a, A)
@c True
@c >>> a.m()
@c True

For instance bindings, the precedence of descriptor invocation depends on
which descriptor methods are defined.  A descriptor can define any combination
of @ref{16ed,,__get__()}, @ref{23b5,,__set__()} and
@ref{1950,,__delete__()}.  If it does not
define @code{__get__()}, then accessing the attribute will return the descriptor
object itself unless there is a value in the object’s instance dictionary.  If
the descriptor defines @code{__set__()} and/or @code{__delete__()}, it is a data
descriptor; if it defines neither, it is a non-data descriptor.  Normally, data
descriptors define both @code{__get__()} and @code{__set__()}, while non-data
descriptors have just the @code{__get__()} method.  Data descriptors with
@code{__get__()} and @code{__set__()} (and/or @code{__delete__()}) defined
always override a redefinition in an
instance dictionary.  In contrast, non-data descriptors can be overridden by
instances.

Python methods (including those decorated with
@ref{453,,@@staticmethod} and @ref{48f,,@@classmethod}) are
implemented as non-data descriptors.  Accordingly, instances can redefine and
override methods.  This allows individual instances to acquire behaviors that
differ from other instances of the same class.

@ref{4b3,,property()} 함수는 데이터 디스크립터로 구현됩니다. 이 때문에, 인스턴스는 프로퍼티(property)의 동작을 변경할 수 없습니다.

@node __slots__<2>,,디스크립터 호출하기,어트리뷰트 액세스 커스터마이제이션
@anchor{reference/datamodel id13}@anchor{23b9}@anchor{reference/datamodel slots}@anchor{237b}
@subsubsection __slots__


`__slots__' allow us to explicitly declare data members (like
properties) and deny the creation of @ref{77c,,__dict__} and `__weakref__'
(unless explicitly declared in `__slots__' or available in a parent.)

The space saved over using @ref{77c,,__dict__} can be significant.
Attribute lookup speed can be significantly improved as well.

@geindex object.__slots__ (내장 변수)
@anchor{reference/datamodel object __slots__}@anchor{16f0}
@deffn {데이터} object.__slots__

This class variable can be assigned a string, iterable, or sequence of
strings with variable names used by instances.  `__slots__' reserves space
for the declared variables and prevents the automatic creation of
@ref{77c,,__dict__}
and `__weakref__' for each instance.
@end deffn
@anchor{reference/datamodel datamodel-note-slots}@anchor{23ba}
Notes on using `__slots__':


@itemize *

@item 
When inheriting from a class without `__slots__', the
@ref{77c,,__dict__} and
`__weakref__' attribute of the instances will always be accessible.

@item 
Without a @ref{77c,,__dict__} variable, instances cannot be assigned new
variables not
listed in the `__slots__' definition.  Attempts to assign to an unlisted
variable name raises @ref{5ee,,AttributeError}. If dynamic assignment of new
variables is desired, then add @code{'__dict__'} to the sequence of strings in
the `__slots__' declaration.

@item 
Without a `__weakref__' variable for each instance, classes defining
`__slots__' do not support @ref{11a,,weak references} to its instances.
If weak reference
support is needed, then add @code{'__weakref__'} to the sequence of strings in the
`__slots__' declaration.

@item 
`__slots__' are implemented at the class level by creating @ref{e48,,descriptors}
for each variable name.  As a result, class attributes
cannot be used to set default values for instance variables defined by
`__slots__'; otherwise, the class attribute would overwrite the descriptor
assignment.

@item 
The action of a `__slots__' declaration is not limited to the class
where it is defined.  `__slots__' declared in parents are available in
child classes. However, instances of a child subclass will get a
@ref{77c,,__dict__} and `__weakref__' unless the subclass also defines
`__slots__' (which should only contain names of any `additional' slots).

@item 
클래스가 베이스 클래스의 `__slots__' 에 정의된 이름과 같은 이름의 변수를 `__slots__' 에 선언한다면, 베이스 클래스가 정의한 변수는 액세스할 수 없는 상태가 됩니다(베이스 클래스로부터 디스크립터를 직접 조회하는 경우는 예외다). 이것은 프로그램을 정의되지 않은 상태로 보내게 됩니다. 미래에는, 이를 방지하기 위한 검사가 추가될 것입니다.

@item 
@ref{198,,TypeError} will be raised if nonempty `__slots__' are defined for a
class derived from a
@ref{23bb,,"variable-length" built-in type} such as
@ref{19b,,int}, @ref{192,,bytes}, and @ref{610,,tuple}.

@item 
Any non-string @ref{142c,,iterable} may be assigned to `__slots__'.

@item 
If a @ref{183,,dictionary} is used to assign `__slots__', the dictionary
keys will be used as the slot names. The values of the dictionary can be used
to provide per-attribute docstrings that will be recognised by
@ref{bec,,inspect.getdoc()} and displayed in the output of @ref{ad4,,help()}.

@item 
@ref{16b2,,__class__} assignment works only if both classes have the
same `__slots__'.

@item 
@ref{209f,,Multiple inheritance} with multiple slotted parent
classes can be used,
but only one parent is allowed to have attributes created by slots
(the other bases must have empty slot layouts) - violations raise
@ref{198,,TypeError}.

@item 
If an @ref{4ca,,iterator} is used for `__slots__' then a @ref{1884,,descriptor} is
created for each
of the iterator’s values. However, the `__slots__' attribute will be an empty
iterator.
@end itemize

@node 클래스 생성 커스터마이제이션,인스턴스 및 서브 클래스 검사 커스터마이제이션,어트리뷰트 액세스 커스터마이제이션,특수 메서드 이름들
@anchor{reference/datamodel class-customization}@anchor{e44}@anchor{reference/datamodel customizing-class-creation}@anchor{23bc}
@subsubsection 클래스 생성 커스터마이제이션


Whenever a class inherits from another class, @ref{842,,__init_subclass__()} is
called on the parent class. This way, it is possible to write classes which
change the behavior of subclasses. This is closely related to class
decorators, but where class decorators only affect the specific class they’re
applied to, @code{__init_subclass__} solely applies to future subclasses of the
class defining the method.

@geindex __init_subclass__() (object의 클래스 메서드)
@anchor{reference/datamodel object __init_subclass__}@anchor{842}
@deffn {메서드} classmethod object.__init_subclass__ (cls)

이 메서드는 포함하는 클래스의 서브 클래스가 만들어질 때마다 호출됩니다. `cls' 는 새 서브 클래스입니다. 만약 일반적인 인스턴스 메서드로 정의되면, 이 메서드는 묵시적으로 클래스 메서드로 변경됩니다.

Keyword arguments which are given to a new class are passed to
the parent class’s @code{__init_subclass__}. For compatibility with
other classes using @code{__init_subclass__}, one should take out the
needed keyword arguments and pass the others over to the base
class, as in:

@example
class Philosopher:
    def __init_subclass__(cls, /, default_name, **kwargs):
        super().__init_subclass__(**kwargs)
        cls.default_name = default_name

class AustralianPhilosopher(Philosopher, default_name="Bruce"):
    pass
@end example

기본 구현 @code{object.__init_subclass__} 는 아무 일도 하지 않지만, 인자가 포함되어 호출되면 예외를 발생시킵니다.

@cartouche
@quotation 참고 
메타 클래스 힌트 @code{metaclass} 는 나머지 형 절차에 의해 소비되고, @code{__init_subclass__} 로 전달되지 않습니다. 실제 메타 클래스 (명시적인 힌트 대신에) 는 @code{type(cls)} 로 액세스할 수 있습니다.
@end quotation
@end cartouche


Added in version 3.6.

@end deffn

When a class is created, @code{type.__new__()} scans the class variables
and makes callbacks to those with a @ref{e47,,__set_name__()} hook.

@geindex __set_name__() (object 메서드)
@anchor{reference/datamodel object __set_name__}@anchor{e47}
@deffn {메서드} object.__set_name__ (self, owner, name)

Automatically called at the time the owning class `owner' is
created. The object has been assigned to `name' in that class:

@example
class A:
    x = C()  # Automatically calls: x.__set_name__(A, 'x')
@end example

If the class variable is assigned after the class is created,
@code{__set_name__()} will not be called automatically.
If needed, @code{__set_name__()} can be called directly:

@example
class A:
   pass

c = C()
A.x = c                  # The hook is not called
c.__set_name__(A, 'x')   # Manually invoke the hook
@end example

더 자세한 내용은 @ref{e43,,클래스 객체 만들기} 을 참고하십시오.


Added in version 3.6.

@end deffn

@menu
* 메타 클래스:: 
* MRO 항목 결정하기:: 
* 적절한 메타 클래스 선택하기:: 
* 클래스 이름 공간 준비하기:: 
* 클래스 바디 실행하기:: 
* 클래스 객체 만들기:: 
* 메타 클래스의 용도:: 

@end menu

@node 메타 클래스,MRO 항목 결정하기,,클래스 생성 커스터마이제이션
@anchor{reference/datamodel id14}@anchor{23bd}@anchor{reference/datamodel metaclasses}@anchor{23be}
@subsubsection 메타 클래스


@geindex metaclass
@geindex built-in function;type
@geindex = (equals);class definition

기본적으로, 클래스는 @ref{f43,,type()} 을 사용해서 만들어집니다. 클래스의 바디는 새 이름 공간에서 실행되고, 클래스 이름은 @code{type(name, bases, namespace)} 의 결과에 지역적으로 연결됩니다.

클래스를 만드는 과정은 클래스 정의 줄에 @code{metaclass} 키워드 인자를 전달하거나, 그런 인자를 포함한 이미 존재하는 클래스를 계승함으로써 커스터마이즈될 수 있습니다. 다음 예에서, @code{MyClass} 와 @code{MySubclass} 는 모두 @code{Meta} 의 인스턴스입니다.

@example
class Meta(type):
    pass

class MyClass(metaclass=Meta):
    pass

class MySubclass(MyClass):
    pass
@end example

클래스 정의에서 지정된 다른 키워드 인자들은 아래에서 설명되는 모든 메타 클래스 연산들로 전달됩니다.

클래스 정의가 실행될 때, 다음과 같은 단계가 수행됩니다.:


@itemize *

@item 
MRO 항목이 결정됩니다;

@item 
적절한 메타 클래스가 결정됩니다;

@item 
클래스 이름 공간이 준비됩니다;

@item 
클래스 바디가 실행됩니다;

@item 
클래스 객체가 만들어집니다.
@end itemize

@node MRO 항목 결정하기,적절한 메타 클래스 선택하기,메타 클래스,클래스 생성 커스터마이제이션
@anchor{reference/datamodel resolving-mro-entries}@anchor{23bf}
@subsubsection MRO 항목 결정하기


@geindex __mro_entries__() (object 메서드)
@anchor{reference/datamodel object __mro_entries__}@anchor{ce2}
@deffn {메서드} object.__mro_entries__ (self, bases)

If a base that appears in a class definition is not an instance of
@ref{f43,,type}, then an @code{__mro_entries__()} method is searched on the base.
If an @code{__mro_entries__()} method is found, the base is substituted with the
result of a call to @code{__mro_entries__()} when creating the class.
The method is called with the original bases tuple
passed to the `bases' parameter, and must return a tuple
of classes that will be used instead of the base. The returned tuple may be
empty: in these cases, the original base is ignored.
@end deffn


@subsubheading 더 보기



@table @asis

@item @ref{d94,,types.resolve_bases()}

Dynamically resolve bases that are not instances of @ref{f43,,type}.

@item @ref{6f4,,types.get_original_bases()}

Retrieve a class’s “original bases” prior to modifications by
@ref{ce2,,__mro_entries__()}.

@geindex Python 향상 제안; PEP 560

@item PEP 560@footnote{https://peps.python.org/pep-0560/}

Core support for typing module and generic types.
@end table


@node 적절한 메타 클래스 선택하기,클래스 이름 공간 준비하기,MRO 항목 결정하기,클래스 생성 커스터마이제이션
@anchor{reference/datamodel determining-the-appropriate-metaclass}@anchor{23c0}
@subsubsection 적절한 메타 클래스 선택하기


@geindex metaclass hint

클래스 정의의 적절한 메타 클래스는 다음과 같이 결정됩니다:


@itemize *

@item 
베이스와 명시적인 메타 클래스를 주지 않는 경우 @ref{f43,,type()} 이 사용됩니다;

@item 
명시적인 메타 클래스가 지정되고, 그것이 @ref{f43,,type()} 의 인스턴스가 `아니면', 그것을 메타 클래스로 사용합니다;

@item 
@ref{f43,,type()} 의 인스턴스가 명시적인 메타 클래스로 주어지거나, 베이스가 정의되었으면, 가장 많이 파생된 메타 클래스가 사용됩니다.
@end itemize

가장 많이 파생된 메타 클래스는 명시적으로 지정된 메타 클래스(있다면)와 지정된 모든 베이스 클래스들의 메타 클래스들(즉, @code{type(cls)}) 중에서 선택됩니다. 가장 많이 파생된 메타 클래스는 이들 `모두' 의 서브 타입(subtype)입니다. 만약 어느 것도 이 조건을 만족하지 못한다면, 클래스 정의는 @code{TypeError} 를 발생시키며 실패합니다.

@node 클래스 이름 공간 준비하기,클래스 바디 실행하기,적절한 메타 클래스 선택하기,클래스 생성 커스터마이제이션
@anchor{reference/datamodel prepare}@anchor{e57}@anchor{reference/datamodel preparing-the-class-namespace}@anchor{23c1}
@subsubsection 클래스 이름 공간 준비하기


@geindex __prepare__ (metaclass method)

Once the appropriate metaclass has been identified, then the class namespace
is prepared. If the metaclass has a @code{__prepare__} attribute, it is called
as @code{namespace = metaclass.__prepare__(name, bases, **kwds)} (where the
additional keyword arguments, if any, come from the class definition). The
@code{__prepare__} method should be implemented as a
@ref{48f,,classmethod}. The
namespace returned by @code{__prepare__} is passed in to @code{__new__}, but when
the final class object is created the namespace is copied into a new @code{dict}.

만약 메타 클래스에 @code{__prepare__} 어트리뷰트가 없다면, 클래스 이름 공간은 빈 순서 있는 매핑으로 초기화됩니다.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 3115

@item PEP 3115@footnote{https://peps.python.org/pep-3115/} - 파이썬 3000 에서의 메타 클래스

@code{__prepare__} 이름 공간 훅을 도입했습니다
@end table


@node 클래스 바디 실행하기,클래스 객체 만들기,클래스 이름 공간 준비하기,클래스 생성 커스터마이제이션
@anchor{reference/datamodel executing-the-class-body}@anchor{23c2}
@subsubsection 클래스 바디 실행하기


@geindex class;body

클래스 바디는 (대략) @code{exec(body, globals(), namespace)} 과같이 실행됩니다. 일반적인 @ref{4a3,,exec()} 호출과 주된 차이점은 클래스 정의가 함수 내부에서 이루어질 때 어휘 스코핑(lexical scoping) 이 클래스 바디(모든 메서드들을 포함해서)로 하여금 현재와 외부 스코프에 있는 이름들을 참조하도록 허락한다는 것입니다.

하지만, 클래스 정의가 함수 내부에서 이루어질 때조차도, 클래스 내부에서 정의된 메서드들은 클래스 스코프에서 정의된 이름들을 볼 수 없습니다. 클래스 변수는 인스턴스나 클래스 메서드의 첫 번째 매개변수를 통해 액세스하거나 다음 섹션에서 설명하는 묵시적으로 어휘 스코핑된 @code{__class__} 참조를 통해야 합니다.

@node 클래스 객체 만들기,메타 클래스의 용도,클래스 바디 실행하기,클래스 생성 커스터마이제이션
@anchor{reference/datamodel class-object-creation}@anchor{e43}@anchor{reference/datamodel creating-the-class-object}@anchor{23c3}
@subsubsection 클래스 객체 만들기


@geindex __class__ (method cell)
@geindex __classcell__ (class namespace entry)

일단 클래스 이름 공간이 클래스 바디를 실행함으로써 채워지면, 클래스 객체가 @code{metaclass(name, bases, namespace, **kwds)} 을 통해 만들어집니다(여기에서 전달되는 추가적인 키워드 인자들은 @code{__prepare__} 에 전달된 것들과 같습니다).

이 클래스 객체는 @ref{1a6,,super()} 에 인자를 주지 않는 경우 참조되는 것입니다. @code{__class__} 는 클래스 바디의 메서드들 중 어느 하나라도 @code{__class__} 나 @code{super} 를 참조할 경우 컴파일러에 의해 만들어지는 묵시적인 클로저(closure) 참조입니다. 이것은 인자 없는 형태의 @code{super()} 가 어휘 스코핑 기반으로 현재 정의되고 있는 클래스를 올바르게 찾을 수 있도록 합니다. 반면에 현재의 호출에 사용된 클래스나 인스턴스는 메서드로 전달된 첫 번째 인자에 기초해서 식별됩니다.

CPython 3.6 이상에서, @code{__class__} 셀(cell)은 클래스 이름 공간의 @code{__classcell__} 엔트리로 메타 클래스에 전달됩니다. 만약 존재한다면, 이것은 클래스가 올바르게 초기화되기 위해 @code{type.__new__} 호출까지 거슬러서 전파되어야 합니다. 이렇게 하지 못하면 파이썬 3.8 에서는 @ref{244,,RuntimeError}로 이어질 것입니다.

When using the default metaclass @ref{f43,,type}, or any metaclass that ultimately
calls @code{type.__new__}, the following additional customization steps are
invoked after creating the class object:


@enumerate 

@item 
The @code{type.__new__} method collects all of the attributes in the class
namespace that define a @ref{e47,,__set_name__()} method;

@item 
Those @code{__set_name__} methods are called with the class
being defined and the assigned name of that particular attribute;

@item 
The @ref{842,,__init_subclass__()} hook is called on the
immediate parent of the new class in its method resolution order.
@end enumerate

클래스 객체가 만들어진 후에, 클래스 정의에 포함된 클래스 데코레이터들에게 (있다면) 클래스를 전달하고, 그 결과를 클래스가 정의되는 지역 이름 공간에 연결합니다.

When a new class is created by @code{type.__new__}, the object provided as the
namespace parameter is copied to a new ordered mapping and the original
object is discarded. The new copy is wrapped in a read-only proxy, which
becomes the @ref{e56,,__dict__} attribute of the class object.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 3135

@item PEP 3135@footnote{https://peps.python.org/pep-3135/} - 새 super

묵시적인 __class__ 클로저 참조를 설명합니다
@end table


@node 메타 클래스의 용도,,클래스 객체 만들기,클래스 생성 커스터마이제이션
@anchor{reference/datamodel uses-for-metaclasses}@anchor{23c4}
@subsubsection 메타 클래스의 용도


메타 클래스의 잠재적인 용도에는 한계가 없습니다. 탐색 된 몇 가지 아이디어들에는 enum, 로깅, 인터페이스 검사, 자동화된 위임(automatic delegation), 자동화된 프로퍼티(properety) 생성, 프락시(proxy), 프레임웍(framework), 자동화된 자원 로킹/동기화(automatic resource locking/synchronization) 등이 있습니다.

@node 인스턴스 및 서브 클래스 검사 커스터마이제이션,제네릭 형 흉내 내기,클래스 생성 커스터마이제이션,특수 메서드 이름들
@anchor{reference/datamodel customizing-instance-and-subclass-checks}@anchor{23c5}
@subsubsection 인스턴스 및 서브 클래스 검사 커스터마이제이션


다음 메서드들은 @ref{2ad,,isinstance()} 와 @ref{9c4,,issubclass()} 내장 함수들의 기본 동작을 재정의하는 데 사용됩니다.

특히, 메타 클래스 @ref{111a,,abc.ABCMeta} 는 추상 베이스 클래스(Abstract Base Class, ABC)를 다른 ABC를 포함한 임의의 클래스나 형(내장형을 포함합니다)에 “가상 베이스 클래스(virtual base class)”로 추가할 수 있게 하려고 이 메서드들을 구현합니다.

@geindex __instancecheck__() (type 메서드)
@anchor{reference/datamodel type __instancecheck__}@anchor{23c6}
@deffn {메서드} type.__instancecheck__ (self, instance)

`instance' 가 (직접적이거나 간접적으로) `class' 의 인스턴스로 취급될 수 있으면 참을 돌려줍니다. 만약 정의되면, @code{isinstance(instance, class)} 를 구현하기 위해 호출됩니다.
@end deffn

@geindex __subclasscheck__() (type 메서드)
@anchor{reference/datamodel type __subclasscheck__}@anchor{23c7}
@deffn {메서드} type.__subclasscheck__ (self, subclass)

`subclass' 가 (직접적이거나 간접적으로) `class' 의 서브 클래스로 취급될 수 있으면 참을 돌려줍니다. 만약 정의되면, @code{issubclass(subclass, class)} 를 구현하기 위해 호출됩니다.
@end deffn

이 메서드들은 클래스의 형(메타 클래스)에서 조회된다는 것에 주의해야 합니다. 실제 클래스에서 클래스 메서드로 정의될 수 없습니다. 이것은 인스턴스에 대해 호출되는 특수 메서드들의 조회와 일관성 있습니다. 이 경우 인스턴스는 클래스 자체다.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 3119

@item PEP 3119@footnote{https://peps.python.org/pep-3119/} - 추상 베이스 클래스의 도입

Includes the specification for customizing @ref{2ad,,isinstance()} and
@ref{9c4,,issubclass()} behavior through @ref{23c6,,__instancecheck__()} and
@ref{23c7,,__subclasscheck__()}, with motivation for this functionality
in the context of adding Abstract Base Classes (see the @ref{4,,abc}
module) to the language.
@end table


@node 제네릭 형 흉내 내기,콜러블 객체 흉내 내기,인스턴스 및 서브 클래스 검사 커스터마이제이션,특수 메서드 이름들
@anchor{reference/datamodel emulating-generic-types}@anchor{23c8}
@subsubsection 제네릭 형 흉내 내기


When using @ref{15c,,type annotations}, it is often useful to
`parameterize' a @ref{1a1,,generic type} using Python’s square-brackets notation.
For example, the annotation @code{list[int]} might be used to signify a
@ref{24d,,list} in which all the elements are of type @ref{19b,,int}.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 484

@item PEP 484@footnote{https://peps.python.org/pep-0484/} - Type Hints

Introducing Python’s framework for type annotations

@item @ref{8c0,,Generic Alias Types}

Documentation for objects representing parameterized generic classes

@item @ref{23c9,,제네릭}, @ref{6f5,,user-defined generics} and @ref{17bc,,typing.Generic}

Documentation on how to implement generic classes that can be
parameterized at runtime and understood by static type-checkers.
@end table


A class can `generally' only be parameterized if it defines the special
class method @code{__class_getitem__()}.

@geindex __class_getitem__() (object의 클래스 메서드)
@anchor{reference/datamodel object __class_getitem__}@anchor{942}
@deffn {메서드} classmethod object.__class_getitem__ (cls, key)

`key' 에 있는 형 인자에 의한 제네릭 클래스의 특수화를 나타내는 객체를 돌려줍니다.

When defined on a class, @code{__class_getitem__()} is automatically a class
method. As such, there is no need for it to be decorated with
@ref{48f,,@@classmethod} when it is defined.
@end deffn

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

@end menu

@node The purpose of __class_getitem__,__class_getitem__ versus __getitem__,,제네릭 형 흉내 내기
@anchor{reference/datamodel the-purpose-of-class-getitem}@anchor{23ca}
@subsubsection The purpose of `__class_getitem__'


The purpose of @ref{942,,__class_getitem__()} is to allow runtime
parameterization of standard-library generic classes in order to more easily
apply @ref{23cb,,type hints} to these classes.

To implement custom generic classes that can be parameterized at runtime and
understood by static type-checkers, users should either inherit from a standard
library class that already implements @ref{942,,__class_getitem__()}, or
inherit from @ref{17bc,,typing.Generic}, which has its own implementation of
@code{__class_getitem__()}.

Custom implementations of @ref{942,,__class_getitem__()} on classes defined
outside of the standard library may not be understood by third-party
type-checkers such as mypy. Using @code{__class_getitem__()} on any class for
purposes other than type hinting is discouraged.

@node __class_getitem__ versus __getitem__,,The purpose of __class_getitem__,제네릭 형 흉내 내기
@anchor{reference/datamodel class-getitem-versus-getitem}@anchor{23cc}@anchor{reference/datamodel classgetitem-versus-getitem}@anchor{23cd}
@subsubsection `__class_getitem__' versus `__getitem__'


Usually, the @ref{23ce,,subscription} of an object using square
brackets will call the @ref{588,,__getitem__()} instance method defined on
the object’s class. However, if the object being subscribed is itself a class,
the class method @ref{942,,__class_getitem__()} may be called instead.
@code{__class_getitem__()} should return a @ref{8c0,,GenericAlias}
object if it is properly defined.

Presented with the @ref{23cf,,expression} @code{obj[x]}, the Python interpreter
follows something like the following process to decide whether
@ref{588,,__getitem__()} or @ref{942,,__class_getitem__()} should be
called:

@example
from inspect import isclass

def subscribe(obj, x):
    """Return the result of the expression 'obj[x]'"""

    class_of_obj = type(obj)

    # If the class of obj defines __getitem__,
    # call class_of_obj.__getitem__(obj, x)
    if hasattr(class_of_obj, '__getitem__'):
        return class_of_obj.__getitem__(obj, x)

    # Else, if obj is a class and defines __class_getitem__,
    # call obj.__class_getitem__(x)
    elif isclass(obj) and hasattr(obj, '__class_getitem__'):
        return obj.__class_getitem__(x)

    # Else, raise an exception
    else:
        raise TypeError(
            f"'@{class_of_obj.__name__@}' object is not subscriptable"
        )
@end example

In Python, all classes are themselves instances of other classes. The class of
a class is known as that class’s @ref{23d0,,metaclass}, and most classes have the
@ref{f43,,type} class as their metaclass. @code{type} does not define
@ref{588,,__getitem__()}, meaning that expressions such as @code{list[int]},
@code{dict[str, float]} and @code{tuple[str, bytes]} all result in
@ref{942,,__class_getitem__()} being called:

@example
>>> # list has class "type" as its metaclass, like most classes:
>>> type(list)
<class 'type'>
>>> type(dict) == type(list) == type(tuple) == type(str) == type(bytes)
True
>>> # "list[int]" calls "list.__class_getitem__(int)"
>>> list[int]
list[int]
>>> # list.__class_getitem__ returns a GenericAlias object:
>>> type(list[int])
<class 'types.GenericAlias'>
@end example

However, if a class has a custom metaclass that defines
@ref{588,,__getitem__()}, subscribing the class may result in different
behaviour. An example of this can be found in the @ref{5a,,enum} module:

@example
>>> from enum import Enum
>>> class Menu(Enum):
...     """A breakfast menu"""
...     SPAM = 'spam'
...     BACON = 'bacon'
...
>>> # Enum classes have a custom metaclass:
>>> type(Menu)
<class 'enum.EnumMeta'>
>>> # EnumMeta defines __getitem__,
>>> # so __class_getitem__ is not called,
>>> # and the result is not a GenericAlias object:
>>> Menu['SPAM']
<Menu.SPAM: 'spam'>
>>> type(Menu['SPAM'])
<enum 'Menu'>
@end example


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 560

@item PEP 560@footnote{https://peps.python.org/pep-0560/} - Core Support for typing module and generic types

Introducing @ref{942,,__class_getitem__()}, and outlining when a
@ref{23ce,,subscription} results in @code{__class_getitem__()}
being called instead of @ref{588,,__getitem__()}
@end table


@node 콜러블 객체 흉내 내기,컨테이너형 흉내 내기,제네릭 형 흉내 내기,특수 메서드 이름들
@anchor{reference/datamodel emulating-callable-objects}@anchor{23d1}@anchor{reference/datamodel id15}@anchor{23d2}
@subsubsection 콜러블 객체 흉내 내기


@geindex __call__() (object 메서드)
@anchor{reference/datamodel object __call__}@anchor{779}
@deffn {메서드} object.__call__ (self[, args...])

@geindex call;instance

Called when the instance is “called” as a function; if this method is defined,
@code{x(arg1, arg2, ...)} roughly translates to @code{type(x).__call__(x, arg1, ...)}.
The @ref{c7d,,object} class itself does not provide this method.
@end deffn

@node 컨테이너형 흉내 내기,숫자 형 흉내 내기,콜러블 객체 흉내 내기,특수 메서드 이름들
@anchor{reference/datamodel emulating-container-types}@anchor{23d3}@anchor{reference/datamodel sequence-types}@anchor{23d4}
@subsubsection 컨테이너형 흉내 내기


The following methods can be defined to implement container objects. None of them
are provided by the @ref{c7d,,object} class itself. Containers usually are
@ref{715,,sequences} (such as @ref{24d,,lists} or
@ref{610,,tuples}) or @ref{13c0,,mappings} (like
@ref{23d5,,dictionaries}),
but can represent other containers as well.  The first set of methods is used
either to emulate a sequence or to emulate a mapping; the difference is that for
a sequence, the allowable keys should be the integers `k' for which @code{0 <= k <
N} where `N' is the length of the sequence, or @ref{693,,slice} objects, which define a
range of items.  It is also recommended that mappings provide the methods
@code{keys()}, @code{values()}, @code{items()}, @code{get()}, @code{clear()},
@code{setdefault()}, @code{pop()}, @code{popitem()}, @code{copy()}, and
@code{update()} behaving similar to those for Python’s standard @ref{183,,dictionary}
objects.  The @ref{1f,,collections.abc} module provides a
@ref{12b1,,MutableMapping}
@ref{13bb,,abstract base class} to help create those methods from a base set of
@ref{588,,__getitem__()}, @ref{14d0,,__setitem__()},
@ref{14d1,,__delitem__()}, and @code{keys()}.

Mutable sequences should provide methods
@ref{23d6,,append()}, @ref{23d7,,clear()}, @ref{23d8,,count()},
@ref{23d9,,extend()}, @ref{197a,,index()}, @ref{23da,,insert()},
@ref{23db,,pop()}, @ref{197b,,remove()}, and @ref{23dc,,reverse()},
like Python standard @ref{24d,,list} objects.
Finally, sequence types should implement addition (meaning concatenation) and
multiplication (meaning repetition) by defining the methods
@ref{23dd,,__add__()}, @ref{23de,,__radd__()}, @ref{23df,,__iadd__()},
@ref{23e0,,__mul__()}, @ref{23e1,,__rmul__()} and @ref{23e2,,__imul__()}
described below; they should not define other numerical
operators.

It is recommended that both mappings and sequences implement the
@ref{15be,,__contains__()} method to allow efficient use of the @code{in}
operator; for
mappings, @code{in} should search the mapping’s keys; for sequences, it should
search through the values.  It is further recommended that both mappings and
sequences implement the @ref{e68,,__iter__()} method to allow efficient iteration
through the container; for mappings, @code{__iter__()} should iterate
through the object’s keys; for sequences, it should iterate through the values.

@geindex __len__() (object 메서드)
@anchor{reference/datamodel object __len__}@anchor{1797}
@deffn {메서드} object.__len__ (self)

@geindex built-in function;len
@geindex __bool__() (object method)

Called to implement the built-in function @ref{83f,,len()}.  Should return the length
of the object, an integer @code{>=} 0.  Also, an object that doesn’t define a
@ref{14da,,__bool__()} method and whose @code{__len__()} method returns zero is
considered to be false in a Boolean context.

`CPython 구현 상세:' In CPython, the length is required to be at most @ref{13ca,,sys.maxsize}.
If the length is larger than @code{sys.maxsize} some features (such as
@ref{83f,,len()}) may raise @ref{a81,,OverflowError}.  To prevent raising
@code{OverflowError} by truth value testing, an object must define a
@ref{14da,,__bool__()} method.
@end deffn

@geindex __length_hint__() (object 메서드)
@anchor{reference/datamodel object __length_hint__}@anchor{110d}
@deffn {메서드} object.__length_hint__ (self)

Called to implement @ref{116c,,operator.length_hint()}. Should return an estimated
length for the object (which may be greater or less than the actual length).
The length must be an integer @code{>=} 0. The return value may also be
@ref{1a2,,NotImplemented}, which is treated the same as if the
@code{__length_hint__} method didn’t exist at all. This method is purely an
optimization and is never required for correctness.


Added in version 3.4.

@end deffn

@geindex __getitem__() (object 메서드)
@anchor{reference/datamodel object __getitem__}@anchor{588}
@deffn {메서드} object.__getitem__ (self, subscript)

Called to implement `subscription', that is, @code{self[subscript]}.
See @ref{23ce,,Subscriptions and slicings} for details on the syntax.

There are two types of built-in objects that support subscription
via @code{__getitem__()}:


@itemize -

@item 
`sequences', where `subscript' (also called
@ref{23e3,,index}) should be an integer or a @ref{693,,slice} object.
See the @ref{2335,,sequence documentation} for the expected
behavior, including handling @code{slice} objects and negative indices.

@item 
`mappings', where `subscript' is also called the @ref{23e4,,key}.
See @ref{233c,,mapping documentation} for the expected
behavior.
@end itemize

If `subscript' is of an inappropriate type, @code{__getitem__()}
should raise @ref{198,,TypeError}.
If `subscript' has an inappropriate value, @code{__getitem__()}
should raise an @ref{23e5,,LookupError} or one of its subclasses
(@ref{173a,,IndexError} for sequences; @ref{5e5,,KeyError} for mappings).

@geindex object;slice

@cartouche
@quotation 참고 
Slicing is handled by @code{__getitem__()}, @ref{14d0,,__setitem__()},
and @ref{14d1,,__delitem__()}.
A call like

@example
a[1:2] = b
@end example

과 같은 호출은

@example
a[slice(1, 2, None)] = b
@end example

and so forth. Missing slice items are always filled in with @code{None}.
@end quotation
@end cartouche

@cartouche
@quotation 참고 
The sequence iteration protocol (used, for example, in @ref{34a,,for}
loops), expects that an @ref{173a,,IndexError} will be raised for illegal
indexes to allow proper detection of the end of a sequence.
@end quotation
@end cartouche

@cartouche
@quotation 참고 
When @ref{23ce,,subscripting} a `class', the special
class method @ref{942,,__class_getitem__()} may be called instead of
@code{__getitem__()}. See @ref{23cd,,__class_getitem__ versus __getitem__} for more
details.
@end quotation
@end cartouche
@end deffn

@geindex __setitem__() (object 메서드)
@anchor{reference/datamodel object __setitem__}@anchor{14d0}
@deffn {메서드} object.__setitem__ (self, key, value)

@code{self[key]} 로의 대입을 구현하기 위해 호출됩니다. @ref{588,,__getitem__()} 과 같은 주의가 필요합니다. 매핑의 경우에는, 객체가 키에 대해 값의 변경이나 새 키의 추가를 허락할 경우, 시퀀스의 경우는 항목이 교체될 수 있을 때만 구현되어야 합니다. 잘못된 `key' 값의 경우는 @code{__getitem__()} 에서와 같은 예외를 일으켜야 합니다.
@end deffn

@geindex __delitem__() (object 메서드)
@anchor{reference/datamodel object __delitem__}@anchor{14d1}
@deffn {메서드} object.__delitem__ (self, key)

@code{self[key]} 의 삭제를 구현하기 위해 호출됩니다. @ref{588,,__getitem__()} 과 같은 주의가 필요합니다. 매핑의 경우에는, 객체가 키의 삭제를 허락할 경우, 시퀀스의 경우는 항목이 시퀀스로부터 제거될 수 있을 때만 구현되어야 합니다. 잘못된 `key' 값의 경우는 @code{__getitem__()} 에서와 같은 예외를 일으켜야 합니다.
@end deffn

@geindex __missing__() (object 메서드)
@anchor{reference/datamodel object __missing__}@anchor{13c2}
@deffn {메서드} object.__missing__ (self, key)

@ref{183,,dict}.@ref{588,,__getitem__()} 이 dict 서브 클래스에서 키가 딕셔너리에 없으면 @code{self[key]} 를 구현하기 위해 호출합니다.
@end deffn

@geindex __iter__() (object 메서드)
@anchor{reference/datamodel object __iter__}@anchor{e68}
@deffn {메서드} object.__iter__ (self)

This method is called when an @ref{4ca,,iterator} is required for a container.
This method should return a new iterator object that can iterate over all the
objects in the container.  For mappings, it should iterate over the keys of
the container.
@end deffn

@geindex __reversed__() (object 메서드)
@anchor{reference/datamodel object __reversed__}@anchor{e85}
@deffn {메서드} object.__reversed__ (self)

@ref{a65,,reversed()} 내장 함수가 역 이터레이션(reverse iteration)을 구현하기 위해 (있다면) 호출합니다. 컨테이너에 있는 객체들을 역 순으로 탐색하는 새 이터레이터 객체를 돌려줘야 합니다.

@ref{e85,,__reversed__()} 메서드가 제공되지 않으면, @ref{a65,,reversed()} 내장함수는 시퀀스 프로토콜(@ref{1797,,__len__()} 과 @ref{588,,__getitem__()})을 대안으로 사용합니다. 시퀀스 프로토콜을 지원하는 객체들은 @code{reversed()} 가 제공하는 것보다 더 효율적인 구현을 제공할 수 있을 때만 @code{__reversed__()} 를 제공해야 합니다.
@end deffn

멤버십 검사 연산자들(@ref{34b,,in} 과 @ref{840,,not in}) 은 보통 컨테이너에 대한 이터레이션으로 구현됩니다. 하지만, 컨테이너 객체는 더 효율적인 구현을 다음과 같은 특수 메서드를 통해 제공할 수 있습니다. 이 경우 객체는 이터러블일 필요도 없습니다.

@geindex __contains__() (object 메서드)
@anchor{reference/datamodel object __contains__}@anchor{15be}
@deffn {메서드} object.__contains__ (self, item)

멤버십 검사 연산자를 구현하기 위해 호출됩니다. `item' 이 `self' 에 있으면 참을, 그렇지 않으면 거짓을 돌려줘야 합니다. 매핑 객체의 경우, 키-값 쌍이 아니라 매핑의 키가 고려되어야 합니다.

@ref{15be,,__contains__()} 를 정의하지 않는 객체의 경우, 멤버십 검사는 먼저 @ref{e68,,__iter__()} 를 통한 이터레이션을 시도한 후, @ref{588,,__getitem__()} 을 통한 낡은 시퀀스 이터레이션 프로토콜을 시도합니다. @ref{23e6,,언어 레퍼런스의 이 절}을 참고하십시오.
@end deffn

@node 숫자 형 흉내 내기,with 문 컨텍스트 관리자,컨테이너형 흉내 내기,특수 메서드 이름들
@anchor{reference/datamodel emulating-numeric-types}@anchor{23e7}@anchor{reference/datamodel numeric-types}@anchor{23e8}
@subsubsection 숫자 형 흉내 내기


숫자 형을 흉내 내기 위해 다음과 같은 메서드들을 정의할 수 있습니다. 구현되는 특별한 종류의 숫자에 의해 지원되지 않는 연산들(예를 들어, 정수가 아닌 숫자들에 대한 비트 연산들)에 대응하는 메서드들을 정의되지 않은 채로 남겨두어야 합니다.

@geindex __add__() (object 메서드)
@geindex __sub__() (object 메서드)
@geindex __mul__() (object 메서드)
@geindex __matmul__() (object 메서드)
@geindex __truediv__() (object 메서드)
@geindex __floordiv__() (object 메서드)
@geindex __mod__() (object 메서드)
@geindex __divmod__() (object 메서드)
@geindex __pow__() (object 메서드)
@geindex __lshift__() (object 메서드)
@geindex __rshift__() (object 메서드)
@geindex __and__() (object 메서드)
@geindex __xor__() (object 메서드)
@geindex __or__() (object 메서드)
@anchor{reference/datamodel object __add__}@anchor{23dd}
@deffn {메서드} object.__add__ (self, other)
@anchor{reference/datamodel object __sub__}@anchor{23e9}
@deffnx {메서드} object.__sub__ (self, other)
@anchor{reference/datamodel object __mul__}@anchor{23e0}
@deffnx {메서드} object.__mul__ (self, other)
@anchor{reference/datamodel object __matmul__}@anchor{f78}
@deffnx {메서드} object.__matmul__ (self, other)
@anchor{reference/datamodel object __truediv__}@anchor{108f}
@deffnx {메서드} object.__truediv__ (self, other)
@anchor{reference/datamodel object __floordiv__}@anchor{16f9}
@deffnx {메서드} object.__floordiv__ (self, other)
@anchor{reference/datamodel object __mod__}@anchor{23ea}
@deffnx {메서드} object.__mod__ (self, other)
@anchor{reference/datamodel object __divmod__}@anchor{1090}
@deffnx {메서드} object.__divmod__ (self, other)
@anchor{reference/datamodel object __pow__}@anchor{9d4}
@deffnx {메서드} object.__pow__ (self, other[, modulo])
@anchor{reference/datamodel object __lshift__}@anchor{23eb}
@deffnx {메서드} object.__lshift__ (self, other)
@anchor{reference/datamodel object __rshift__}@anchor{23ec}
@deffnx {메서드} object.__rshift__ (self, other)
@anchor{reference/datamodel object __and__}@anchor{23ed}
@deffnx {메서드} object.__and__ (self, other)
@anchor{reference/datamodel object __xor__}@anchor{23ee}
@deffnx {메서드} object.__xor__ (self, other)
@anchor{reference/datamodel object __or__}@anchor{23ef}
@deffnx {메서드} object.__or__ (self, other)

@geindex built-in function;divmod
@geindex built-in function;pow
@geindex built-in function;pow

These methods are called to implement the binary arithmetic operations
(@code{+}, @code{-}, @code{*}, @code{@@}, @code{/}, @code{//}, @code{%}, @ref{b98,,divmod()},
@ref{1a4,,pow()}, @code{**}, @code{<<}, @code{>>}, @code{&}, @code{^}, @code{|}).  For instance, to
evaluate the expression @code{x + y}, where `x' is an instance of a class that
has an @code{__add__()} method, @code{type(x).__add__(x, y)} is called.  The
@code{__divmod__()} method should be the equivalent to using
@code{__floordiv__()} and @code{__mod__()}; it should not be related to
@code{__truediv__()}.  Note that @code{__pow__()} should be defined to accept
an optional third argument if the three-argument version of the built-in @code{pow()}
function is to be supported.

If one of those methods does not support the operation with the supplied
arguments, it should return @ref{1a2,,NotImplemented}.
@end deffn

@geindex __radd__() (object 메서드)
@geindex __rsub__() (object 메서드)
@geindex __rmul__() (object 메서드)
@geindex __rmatmul__() (object 메서드)
@geindex __rtruediv__() (object 메서드)
@geindex __rfloordiv__() (object 메서드)
@geindex __rmod__() (object 메서드)
@geindex __rdivmod__() (object 메서드)
@geindex __rpow__() (object 메서드)
@geindex __rlshift__() (object 메서드)
@geindex __rrshift__() (object 메서드)
@geindex __rand__() (object 메서드)
@geindex __rxor__() (object 메서드)
@geindex __ror__() (object 메서드)
@anchor{reference/datamodel object __radd__}@anchor{23de}
@deffn {메서드} object.__radd__ (self, other)
@anchor{reference/datamodel object __rsub__}@anchor{23f0}
@deffnx {메서드} object.__rsub__ (self, other)
@anchor{reference/datamodel object __rmul__}@anchor{23e1}
@deffnx {메서드} object.__rmul__ (self, other)
@anchor{reference/datamodel object __rmatmul__}@anchor{f79}
@deffnx {메서드} object.__rmatmul__ (self, other)
@anchor{reference/datamodel object __rtruediv__}@anchor{23f1}
@deffnx {메서드} object.__rtruediv__ (self, other)
@anchor{reference/datamodel object __rfloordiv__}@anchor{23f2}
@deffnx {메서드} object.__rfloordiv__ (self, other)
@anchor{reference/datamodel object __rmod__}@anchor{fd4}
@deffnx {메서드} object.__rmod__ (self, other)
@anchor{reference/datamodel object __rdivmod__}@anchor{23f3}
@deffnx {메서드} object.__rdivmod__ (self, other)
@anchor{reference/datamodel object __rpow__}@anchor{1a5}
@deffnx {메서드} object.__rpow__ (self, other[, modulo])
@anchor{reference/datamodel object __rlshift__}@anchor{23f4}
@deffnx {메서드} object.__rlshift__ (self, other)
@anchor{reference/datamodel object __rrshift__}@anchor{23f5}
@deffnx {메서드} object.__rrshift__ (self, other)
@anchor{reference/datamodel object __rand__}@anchor{23f6}
@deffnx {메서드} object.__rand__ (self, other)
@anchor{reference/datamodel object __rxor__}@anchor{23f7}
@deffnx {메서드} object.__rxor__ (self, other)
@anchor{reference/datamodel object __ror__}@anchor{23f8}
@deffnx {메서드} object.__ror__ (self, other)

@geindex built-in function;divmod
@geindex built-in function;pow

These methods are called to implement the binary arithmetic operations
(@code{+}, @code{-}, @code{*}, @code{@@}, @code{/}, @code{//}, @code{%}, @ref{b98,,divmod()},
@ref{1a4,,pow()}, @code{**}, @code{<<}, @code{>>}, @code{&}, @code{^}, @code{|}) with reflected
(swapped) operands.  These functions are only called if the operands
are of different types, when the left operand does not support the corresponding
operation @footnote{
“Does not support” here means that the class has no such method, or
the method returns @ref{1a2,,NotImplemented}.  Do not set the method to
@code{None} if you want to force fallback to the right operand’s reflected
method—that will instead have the opposite effect of explicitly
`blocking' such fallback.
}, or the right operand’s class is derived from the left operand’s
class. @footnote{
For operands of the same type, it is assumed that if the non-reflected method
(such as @ref{23dd,,__add__()}) fails then the operation is not supported, which is why the
reflected method is not called.
} For instance, to evaluate the expression @code{x - y}, where `y' is
an instance of a class that has an @code{__rsub__()} method, @code{type(y).__rsub__(y, x)}
is called if @code{type(x).__sub__(x, y)} returns @ref{1a2,,NotImplemented} or @code{type(y)}
is a subclass of @code{type(x)}. @footnote{
If the right operand’s type is a subclass of the left operand’s type, the
reflected method having precedence allows subclasses to override their ancestors’
operations.
}

Note that @code{__rpow__()} should be defined to accept an optional third
argument if the three-argument version of the built-in @ref{1a4,,pow()} function
is to be supported.


버전 3.14에서 변경: Three-argument @ref{1a4,,pow()} now try calling @code{__rpow__()} if necessary.
Previously it was only called in two-argument @code{pow()} and the binary
power operator.


@cartouche
@quotation 참고 
만약 오른쪽 피연산자의 형이 왼쪽 피연산자의 형의 서브 클래스이고, 그 서브 클래스가 연산의 뒤집힌 메서드의 다른 구현을 제공하면, 이 메서드가 왼쪽 연산자의 뒤집히지 않은 메서드보다 먼저 호출됩니다. 이 동작은 서브 클래스가 조상들의 연산을 재정의할 수 있도록 합니다.
@end quotation
@end cartouche
@end deffn

@geindex __iadd__() (object 메서드)
@geindex __isub__() (object 메서드)
@geindex __imul__() (object 메서드)
@geindex __imatmul__() (object 메서드)
@geindex __itruediv__() (object 메서드)
@geindex __ifloordiv__() (object 메서드)
@geindex __imod__() (object 메서드)
@geindex __ipow__() (object 메서드)
@geindex __ilshift__() (object 메서드)
@geindex __irshift__() (object 메서드)
@geindex __iand__() (object 메서드)
@geindex __ixor__() (object 메서드)
@geindex __ior__() (object 메서드)
@anchor{reference/datamodel object __iadd__}@anchor{23df}
@deffn {메서드} object.__iadd__ (self, other)
@anchor{reference/datamodel object __isub__}@anchor{23f9}
@deffnx {메서드} object.__isub__ (self, other)
@anchor{reference/datamodel object __imul__}@anchor{23e2}
@deffnx {메서드} object.__imul__ (self, other)
@anchor{reference/datamodel object __imatmul__}@anchor{f7a}
@deffnx {메서드} object.__imatmul__ (self, other)
@anchor{reference/datamodel object __itruediv__}@anchor{23fa}
@deffnx {메서드} object.__itruediv__ (self, other)
@anchor{reference/datamodel object __ifloordiv__}@anchor{23fb}
@deffnx {메서드} object.__ifloordiv__ (self, other)
@anchor{reference/datamodel object __imod__}@anchor{23fc}
@deffnx {메서드} object.__imod__ (self, other)
@anchor{reference/datamodel object __ipow__}@anchor{9d3}
@deffnx {메서드} object.__ipow__ (self, other[, modulo])
@anchor{reference/datamodel object __ilshift__}@anchor{23fd}
@deffnx {메서드} object.__ilshift__ (self, other)
@anchor{reference/datamodel object __irshift__}@anchor{23fe}
@deffnx {메서드} object.__irshift__ (self, other)
@anchor{reference/datamodel object __iand__}@anchor{23ff}
@deffnx {메서드} object.__iand__ (self, other)
@anchor{reference/datamodel object __ixor__}@anchor{2400}
@deffnx {메서드} object.__ixor__ (self, other)
@anchor{reference/datamodel object __ior__}@anchor{2401}
@deffnx {메서드} object.__ior__ (self, other)

These methods are called to implement the augmented arithmetic assignments
(@code{+=}, @code{-=}, @code{*=}, @code{@@=}, @code{/=}, @code{//=}, @code{%=}, @code{**=}, @code{<<=},
@code{>>=}, @code{&=}, @code{^=}, @code{|=}).  These methods should attempt to do the
operation in-place (modifying `self') and return the result (which could be,
but does not have to be, `self').  If a specific method is not defined, or if
that method returns @ref{1a2,,NotImplemented}, the
augmented assignment falls back to the normal methods.  For instance, if `x'
is an instance of a class with an @code{__iadd__()} method, @code{x += y} is
equivalent to @code{x = x.__iadd__(y)} . If @code{__iadd__()} does not exist, or if @code{x.__iadd__(y)}
returns @code{NotImplemented}, @code{x.__add__(y)} and
@code{y.__radd__(x)} are considered, as with the evaluation of @code{x + y}. In
certain situations, augmented assignment can result in unexpected errors (see
@ref{2402,,덧셈은 작동하는데@comma{} 왜 a_tuple[i] += [‘item’]이 예외를 일으킵니까?}), but this behavior is in fact
part of the data model.
@end deffn

@geindex __neg__() (object 메서드)
@geindex __pos__() (object 메서드)
@geindex __abs__() (object 메서드)
@geindex __invert__() (object 메서드)
@anchor{reference/datamodel object __neg__}@anchor{2403}
@deffn {메서드} object.__neg__ (self)
@anchor{reference/datamodel object __pos__}@anchor{2404}
@deffnx {메서드} object.__pos__ (self)
@anchor{reference/datamodel object __abs__}@anchor{2405}
@deffnx {메서드} object.__abs__ (self)
@anchor{reference/datamodel object __invert__}@anchor{2406}
@deffnx {메서드} object.__invert__ (self)

@geindex built-in function;abs

일 항 산술 연산(@code{-}, @code{+}, @ref{208b,,abs()}, @code{~})을 구현하기 위해 호출됩니다.
@end deffn

@geindex __complex__() (object 메서드)
@geindex __int__() (object 메서드)
@geindex __float__() (object 메서드)
@anchor{reference/datamodel object __complex__}@anchor{7fc}
@deffn {메서드} object.__complex__ (self)
@anchor{reference/datamodel object __int__}@anchor{19d}
@deffnx {메서드} object.__int__ (self)
@anchor{reference/datamodel object __float__}@anchor{bc0}
@deffnx {메서드} object.__float__ (self)

@geindex built-in function;complex
@geindex built-in function;int
@geindex built-in function;float

내장 함수 @ref{197,,complex()}, @ref{19b,,int()}, @ref{196,,float()}를 구현하기 위해 호출됩니다. 적절한 형의 값을 돌려줘야 합니다.
@end deffn

@geindex __index__() (object 메서드)
@anchor{reference/datamodel object __index__}@anchor{19e}
@deffn {메서드} object.__index__ (self)

@ref{1ccf,,operator.index()} 를 구현하기 위해 호출되고, 파이썬이 숫자 객체를 정수 객체로 손실 없이 변환해야 할 때(슬라이싱이나 내장 @ref{14ad,,bin()}, @ref{14d4,,hex()}, @ref{14d3,,oct()} 함수들에서와같이)마다 호출됩니다. 이 메서드의 존재는 숫자 객체가 정수 형임을 가리킵니다. 반드시 정수를 돌려줘야 합니다.

@ref{19d,,__int__()}, @ref{bc0,,__float__()} 및 @ref{7fc,,__complex__()}가 정의되어 있지 않으면, 해당 내장 함수 @ref{19b,,int()}, @ref{196,,float()} 및 @ref{197,,complex()}는 @ref{19e,,__index__()}를 사용합니다.
@end deffn

@geindex __round__() (object 메서드)
@geindex __trunc__() (object 메서드)
@geindex __floor__() (object 메서드)
@geindex __ceil__() (object 메서드)
@anchor{reference/datamodel object __round__}@anchor{2407}
@deffn {메서드} object.__round__ (self[, ndigits])
@anchor{reference/datamodel object __trunc__}@anchor{19c}
@deffnx {메서드} object.__trunc__ (self)
@anchor{reference/datamodel object __floor__}@anchor{2408}
@deffnx {메서드} object.__floor__ (self)
@anchor{reference/datamodel object __ceil__}@anchor{2409}
@deffnx {메서드} object.__ceil__ (self)

@geindex built-in function;round

내장 함수 @ref{14df,,round()}와 @ref{92,,math} 함수 @ref{15c4,,trunc()}, @ref{15c2,,floor()}, @ref{15c3,,ceil()} 을 구현하기 위해 호출됩니다. `ndigits' 가 @code{__round__()} 로 전달되지 않는 한, 이 메서드들은 모두 @ref{240a,,Integral} (보통 @ref{19b,,int}) 로 잘린 객체의 값을 돌려줘야 합니다.


버전 3.14에서 변경: @ref{19b,,int()} no longer delegates to the @code{__trunc__()} method.

@end deffn

@node with 문 컨텍스트 관리자,Customizing positional arguments in class pattern matching,숫자 형 흉내 내기,특수 메서드 이름들
@anchor{reference/datamodel context-managers}@anchor{237e}@anchor{reference/datamodel with-statement-context-managers}@anchor{240b}
@subsubsection with 문 컨텍스트 관리자


`컨텍스트 관리자 (context manager)' 는 @ref{186,,with} 문을 실행할 때 자리 잡는 실행 컨텍스트(context)를 정의하는 객체입니다. 코드 블록의 실행을 위해, 컨텍스트 관리자는 원하는 실행시간 컨텍스트로의 진입과 탈출을 처리합니다. 컨텍스트 관리자는 보통 @code{with} 문(@ref{186,,with 문} 섹션에서 설명합니다)으로 시작되지만, 그들의 메서드를 호출해서 직접 사용할 수도 있습니다.

@geindex statement;with
@geindex context manager

컨텍스트 관리자의 전형적인 용도에는 다양한 종류의 전역 상태(global state)를 보관하고 복구하는 것, 자원을 로킹(locking)하고 언로킹(unlocking)하는 것, 열린 파일을 닫는 것 등이 있습니다.

For more information on context managers, see @ref{240c,,컨텍스트 관리자 형}.
The @ref{c7d,,object} class itself does not provide the context manager methods.

@geindex __enter__() (object 메서드)
@anchor{reference/datamodel object __enter__}@anchor{7e3}
@deffn {메서드} object.__enter__ (self)

이 객체와 연관된 실행시간 컨텍스트에 진입합니다. @ref{186,,with} 문은 @code{as} 절로 지정된 대상이 있다면, 이 메서드의 반환 값을 연결합니다.
@end deffn

@geindex __exit__() (object 메서드)
@anchor{reference/datamodel object __exit__}@anchor{1505}
@deffn {메서드} object.__exit__ (self, exc_type, exc_value, traceback)

이 객체와 연관된 실행시간 컨텍스트를 종료합니다. 매개변수들은 컨텍스트에서 벗어나게 만든 예외를 기술합니다. 만약 컨텍스트가 예외 없이 종료한다면, 세 인자 모두 @ref{884,,None} 이 됩니다.

만약 예외가 제공되고, 메서드가 예외를 중지시키고 싶으면 (즉 확산하는 것을 막으려면) 참(true)을 돌려줘야 합니다. 그렇지 않으면 예외는 이 메서드가 종료한 후에 계속 진행됩니다.

Note that @code{__exit__()} methods should not reraise the passed-in exception;
this is the caller’s responsibility.
@end deffn


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 343

@item PEP 343@footnote{https://peps.python.org/pep-0343/} - “with” 문

파이썬 @ref{186,,with} 문에 대한 규격, 배경, 예.
@end table


@node Customizing positional arguments in class pattern matching,Emulating buffer types,with 문 컨텍스트 관리자,특수 메서드 이름들
@anchor{reference/datamodel class-pattern-matching}@anchor{240d}@anchor{reference/datamodel customizing-positional-arguments-in-class-pattern-matching}@anchor{240e}
@subsubsection Customizing positional arguments in class pattern matching


When using a class name in a pattern, positional arguments in the pattern are not
allowed by default, i.e. @code{case MyClass(x, y)} is typically invalid without special
support in @code{MyClass}. To be able to use that kind of pattern, the class needs to
define a `__match_args__' attribute.

@geindex object.__match_args__ (내장 변수)
@anchor{reference/datamodel object __match_args__}@anchor{1c73}
@deffn {데이터} object.__match_args__

This class variable can be assigned a tuple of strings. When this class is
used in a class pattern with positional arguments, each positional argument will
be converted into a keyword argument, using the corresponding value in
`__match_args__' as the keyword. The absence of this attribute is equivalent to
setting it to @code{()}.
@end deffn

For example, if @code{MyClass.__match_args__} is @code{("left", "center", "right")} that means
that @code{case MyClass(x, y)} is equivalent to @code{case MyClass(left=x, center=y)}. Note
that the number of arguments in the pattern must be smaller than or equal to the number
of elements in `__match_args__'; if it is larger, the pattern match attempt will raise
a @ref{198,,TypeError}.


Added in version 3.10.



@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 634

@item PEP 634@footnote{https://peps.python.org/pep-0634/} - Structural Pattern Matching

The specification for the Python @code{match} statement.
@end table


@node Emulating buffer types,Annotations,Customizing positional arguments in class pattern matching,특수 메서드 이름들
@anchor{reference/datamodel emulating-buffer-types}@anchor{240f}@anchor{reference/datamodel python-buffer-protocol}@anchor{2410}
@subsubsection Emulating buffer types


The @ref{260,,buffer protocol} provides a way for Python
objects to expose efficient access to a low-level memory array. This protocol
is implemented by builtin types such as @ref{192,,bytes} and @ref{165,,memoryview},
and third-party libraries may define additional buffer types.

While buffer types are usually implemented in C, it is also possible to
implement the protocol in Python.

@geindex __buffer__() (object 메서드)
@anchor{reference/datamodel object __buffer__}@anchor{68b}
@deffn {메서드} object.__buffer__ (self, flags)

Called when a buffer is requested from `self' (for example, by the
@ref{165,,memoryview} constructor). The `flags' argument is an integer
representing the kind of buffer requested, affecting for example whether
the returned buffer is read-only or writable. @ref{68c,,inspect.BufferFlags}
provides a convenient way to interpret the flags. The method must return
a @code{memoryview} object.

`Thread safety:' In @ref{1f4,,free-threaded} Python,
implementations must manage any internal export counter using atomic
operations. The method must be safe to call concurrently from multiple
threads, and the returned buffer’s underlying data must remain valid
until the corresponding @ref{1a65,,__release_buffer__()} call
completes. See @ref{2411,,Thread safety for memoryview objects} for details.
@end deffn

@geindex __release_buffer__() (object 메서드)
@anchor{reference/datamodel object __release_buffer__}@anchor{1a65}
@deffn {메서드} object.__release_buffer__ (self, buffer)

Called when a buffer is no longer needed. The `buffer' argument is a
@ref{165,,memoryview} object that was previously returned by
@ref{68b,,__buffer__()}. The method must release any resources associated
with the buffer. This method should return @code{None}.

`Thread safety:' In @ref{1f4,,free-threaded} Python,
any export counter decrement must use atomic operations. Resource
cleanup must be thread-safe, as the final release may race with
concurrent releases from other threads.

Buffer objects that do not need to perform any cleanup are not required
to implement this method.
@end deffn


Added in version 3.12.



@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 688

@item PEP 688@footnote{https://peps.python.org/pep-0688/} - Making the buffer protocol accessible in Python

Introduces the Python @code{__buffer__} and @code{__release_buffer__} methods.

@item @ref{343,,collections.abc.Buffer}

ABC for buffer types.
@end table


@node Annotations,특수 메서드 조회,Emulating buffer types,특수 메서드 이름들
@anchor{reference/datamodel annotations}@anchor{2412}
@subsubsection Annotations


Functions, classes, and modules may contain @ref{15c,,annotations},
which are a way to associate information (usually @ref{23cb,,type hints})
with a symbol.

@geindex __annotations__ (object의 속성)
@anchor{reference/datamodel object __annotations__}@anchor{458}
@deffn {속성} object.__annotations__

This attribute contains the annotations for an object. It is
@ref{684,,lazily evaluated}, so accessing the attribute may
execute arbitrary code and raise exceptions. If evaluation is successful, the
attribute is set to a dictionary mapping from variable names to annotations.


버전 3.14에서 변경: Annotations are now lazily evaluated.

@end deffn

@geindex __annotate__() (object 메서드)
@anchor{reference/datamodel object __annotate__}@anchor{1984}
@deffn {메서드} object.__annotate__ (format)

An @ref{15d,,annotate function}.
Returns a new dictionary object mapping attribute/parameter names to their annotation values.

Takes a format parameter specifying the format in which annotations values should be provided.
It must be a member of the @ref{230,,annotationlib.Format} enum, or an integer with
a value corresponding to a member of the enum.

If an annotate function doesn’t support the requested format, it must raise
@ref{36b,,NotImplementedError}. Annotate functions must always support
@ref{15e,,VALUE} format; they must not raise
@ref{36b,,NotImplementedError()} when called with this format.

When called with  @ref{15e,,VALUE} format, an annotate function may raise
@ref{452,,NameError}; it must not raise @code{NameError} when called requesting any other format.

If an object does not have any annotations, @ref{1984,,__annotate__} should preferably be set
to @code{None} (it can’t be deleted), rather than set to a function that returns an empty dict.


Added in version 3.14.

@end deffn


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 649

@item PEP 649@footnote{https://peps.python.org/pep-0649/} — Deferred evaluation of annotation using descriptors

Introduces lazy evaluation of annotations and the @code{__annotate__} function.
@end table


@node 특수 메서드 조회,,Annotations,특수 메서드 이름들
@anchor{reference/datamodel special-lookup}@anchor{23b1}@anchor{reference/datamodel special-method-lookup}@anchor{2413}
@subsubsection 특수 메서드 조회


사용자 정의 클래스의 경우, 묵시적인 특수 메서드의 호출은 객체의 인스턴스 딕셔너리가 아닌 객체의 형에 정의되어 있을 때만 올바르게 동작함이 보장됩니다. 이런 동작은 다음과 같은 코드가 예외를 일으키는 원인입니다:

@example
>>> class C:
...     pass
...
>>> c = C()
>>> c.__len__ = lambda: 5
>>> len(c)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: object of type 'C' has no len()
@end example

The rationale behind this behaviour lies with a number of special methods such
as @ref{cf2,,__hash__()} and @ref{82e,,__repr__()} that are implemented
by all objects,
including type objects. If the implicit lookup of these methods used the
conventional lookup process, they would fail when invoked on the type object
itself:

@example
>>> 1 .__hash__() == hash(1)
True
>>> int.__hash__() == hash(int)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: descriptor '__hash__' of 'int' object needs an argument
@end example

클래스의 연결되지 않은 메서드를 호출하려는 이런 식의 잘못된 시도는 종종 ‘메타 클래스 혼란(metaclass confusion)’ 이라고 불리고, 특수 메서드를 조회할 때 인스턴스를 우회하는 방법으로 피할 수 있습니다.

@example
>>> type(1).__hash__(1) == hash(1)
True
>>> type(int).__hash__(int) == hash(int)
True
@end example

In addition to bypassing any instance attributes in the interest of
correctness, implicit special method lookup generally also bypasses the
@ref{dca,,__getattribute__()} method even of the object’s metaclass:

@example
>>> class Meta(type):
...     def __getattribute__(*args):
...         print("Metaclass getattribute invoked")
...         return type.__getattribute__(*args)
...
>>> class C(object, metaclass=Meta):
...     def __len__(self):
...         return 10
...     def __getattribute__(*args):
...         print("Class getattribute invoked")
...         return object.__getattribute__(*args)
...
>>> c = C()
>>> c.__len__()                 # Explicit lookup via instance
Class getattribute invoked
10
>>> type(c).__len__(c)          # Explicit lookup via type
Metaclass getattribute invoked
10
>>> len(c)                      # Implicit lookup
10
@end example

Bypassing the @ref{dca,,__getattribute__()} machinery in this fashion
provides significant scope for speed optimisations within the
interpreter, at the cost of some flexibility in the handling of
special methods (the special method `must' be set on the class
object itself in order to be consistently invoked by the interpreter).

@geindex coroutine

@node 코루틴 Coroutines,,특수 메서드 이름들,데이터 모델
@anchor{reference/datamodel coroutines}@anchor{2414}
@subsection 코루틴(Coroutines)


@menu
* 어웨이터블 객체(Awaitable Objects): 어웨이터블 객체 Awaitable Objects. 
* 코루틴 객체(Coroutine Objects): 코루틴 객체 Coroutine Objects. 
* 비동기 이터레이터(Asynchronous Iterators): 비동기 이터레이터 Asynchronous Iterators. 
* 비동기 컨텍스트 관리자:: 

@end menu

@node 어웨이터블 객체 Awaitable Objects,코루틴 객체 Coroutine Objects,,코루틴 Coroutines
@anchor{reference/datamodel awaitable-objects}@anchor{2415}
@subsubsection 어웨이터블 객체(Awaitable Objects)


An @ref{4c9,,awaitable} object generally implements an @ref{f74,,__await__()} method.
@ref{6b8,,Coroutine objects} returned from @ref{7ec,,async def} functions
are awaitable.

@cartouche
@quotation 참고 
The @ref{dd8,,generator iterator} objects returned from generators
decorated with @ref{1087,,types.coroutine()}
are also awaitable, but they do not implement @ref{f74,,__await__()}.
@end quotation
@end cartouche

@geindex __await__() (object 메서드)
@anchor{reference/datamodel object __await__}@anchor{f74}
@deffn {메서드} object.__await__ (self)

Must return an @ref{4ca,,iterator}.  Should be used to implement
@ref{4c9,,awaitable} objects.  For instance, @ref{dc5,,asyncio.Future} implements
this method to be compatible with the @ref{18d,,await} expression.
The @ref{c7d,,object} class itself is not awaitable and does not provide
this method.

@cartouche
@quotation 참고 
The language doesn’t place any restriction on the type or value of the
objects yielded by the iterator returned by @code{__await__}, as this is
specific to the implementation of the asynchronous execution framework
(e.g. @ref{b,,asyncio}) that will be managing the @ref{4c9,,awaitable} object.
@end quotation
@end cartouche
@end deffn


Added in version 3.5.



@subsubheading 더 보기


@geindex Python 향상 제안; PEP 492
PEP 492@footnote{https://peps.python.org/pep-0492/} 가 어웨이터블 객체에 대한 더 자세한 정보를 포함하고 있습니다.


@node 코루틴 객체 Coroutine Objects,비동기 이터레이터 Asynchronous Iterators,어웨이터블 객체 Awaitable Objects,코루틴 Coroutines
@anchor{reference/datamodel coroutine-objects}@anchor{2353}@anchor{reference/datamodel id19}@anchor{2416}
@subsubsection 코루틴 객체(Coroutine Objects)


@ref{6b8,,Coroutine objects} are @ref{4c9,,awaitable} objects.
A coroutine’s execution can be controlled by calling @ref{f74,,__await__()} and
iterating over the result.  When the coroutine has finished executing and
returns, the iterator raises @ref{df4,,StopIteration}, and the exception’s
@ref{2417,,value} attribute holds the return value.  If the
coroutine raises an exception, it is propagated by the iterator.  Coroutines
should not directly raise unhandled @code{StopIteration} exceptions.

코루틴은 다음에 나열하는 메서드들 또한 갖고 있는데, 제너레이터(@ref{2418,,제너레이터-이터레이터 메서드} 를 보십시오)의 것들과 닮았습니다. 하지만, 제너레이터와는 달리, 코루틴은 이터레이션을 직접 지원하지는 않습니다.


버전 3.5.2에서 변경: 코루틴을 두 번 await 하면 @ref{244,,RuntimeError} 를 일으킵니다.


@geindex send() (coroutine 메서드)
@anchor{reference/datamodel coroutine send}@anchor{2419}
@deffn {메서드} coroutine.send (value)

Starts or resumes execution of the coroutine.  If `value' is @code{None},
this is equivalent to advancing the iterator returned by
@ref{f74,,__await__()}.  If `value' is not @code{None}, this method delegates
to the @ref{241a,,send()} method of the iterator that caused
the coroutine to suspend.  The result (return value,
@ref{df4,,StopIteration}, or other exception) is the same as when
iterating over the @code{__await__()} return value, described above.
@end deffn

@geindex throw() (coroutine 메서드)
@anchor{reference/datamodel coroutine throw}@anchor{71a}
@deffn {메서드} coroutine.throw (value)

@deffnx {메서드} coroutine.throw (type[, value[, traceback]])

Raises the specified exception in the coroutine.  This method delegates
to the @ref{71b,,throw()} method of the iterator that caused
the coroutine to suspend, if it has such a method.  Otherwise,
the exception is raised at the suspension point.  The result
(return value, @ref{df4,,StopIteration}, or other exception) is the same as
when iterating over the @ref{f74,,__await__()} return value, described
above.  If the exception is not caught in the coroutine, it propagates
back to the caller.


버전 3.12에서 변경: The second signature (type[, value[, traceback]]) is deprecated and
may be removed in a future version of Python.

@end deffn

@geindex close() (coroutine 메서드)
@anchor{reference/datamodel coroutine close}@anchor{241b}
@deffn {메서드} coroutine.close ()

코루틴이 자신을 정리하고 종료하도록 만듭니다. 만약 코루틴이 일시 중지 중이면, 이 메서드는 먼저 코루틴이 일시 중지되도록 한 이터레이터의 @ref{179b,,close()} 메서드로 위임합니다(그런 메서드를 가지는 경우). 그런 다음 일시 중지지점에서 @ref{15cc,,GeneratorExit} 를 발생시키는데, 코루틴이 즉시 자신을 정리하도록 만듭니다. 마지막으로 코루틴에 실행을 종료했다고 표시하는데, 아직 시작하지조차 않았을 때도 그렇다.

코루틴 객체가 파괴될 때는 위의 프로세스에 따라 자동으로 닫힙니다(closed).
@end deffn

@node 비동기 이터레이터 Asynchronous Iterators,비동기 컨텍스트 관리자,코루틴 객체 Coroutine Objects,코루틴 Coroutines
@anchor{reference/datamodel async-iterators}@anchor{f76}@anchor{reference/datamodel asynchronous-iterators}@anchor{241c}
@subsubsection 비동기 이터레이터(Asynchronous Iterators)


`비동기 이터레이터' 는 자신의 @code{__anext__} 메서드에서 비동기 코드를 호출할 수 있습니다.

비동기 이터레이터는 @ref{c9f,,async for} 문에서 사용될 수 있습니다.

The @ref{c7d,,object} class itself does not provide these methods.

@geindex __aiter__() (object 메서드)
@anchor{reference/datamodel object __aiter__}@anchor{df5}
@deffn {메서드} object.__aiter__ (self)

`비동기 이터레이터' 객체를 돌려줘야 합니다.
@end deffn

@geindex __anext__() (object 메서드)
@anchor{reference/datamodel object __anext__}@anchor{1885}
@deffn {메서드} object.__anext__ (self)

이터레이터의 다음 값을 주는 `어웨이터블' 을 돌려줘야 합니다. 이터레이션이 끝나면 @ref{1e0c,,StopAsyncIteration} 에러를 일으켜야 합니다.
@end deffn

비동기 이터러블 객체의 예:

@example
class Reader:
    async def readline(self):
        ...

    def __aiter__(self):
        return self

    async def __anext__(self):
        val = await self.readline()
        if val == b'@w{'}:
            raise StopAsyncIteration
        return val
@end example


Added in version 3.5.



버전 3.7에서 변경: Prior to Python 3.7, @ref{df5,,__aiter__()} could return an `awaitable'
that would resolve to an
@ref{4c8,,asynchronous iterator}.

Starting with Python 3.7, @ref{df5,,__aiter__()} must return an
asynchronous iterator object.  Returning anything else
will result in a @ref{198,,TypeError} error.


@node 비동기 컨텍스트 관리자,,비동기 이터레이터 Asynchronous Iterators,코루틴 Coroutines
@anchor{reference/datamodel async-context-managers}@anchor{811}@anchor{reference/datamodel asynchronous-context-managers}@anchor{241d}
@subsubsection 비동기 컨텍스트 관리자


`비동기 컨텍스트 관리자(asynchronous context manager)' 는 @code{__aenter__} 와 @code{__aexit__} 메서드에서 실행을 일시 중지할 수 있는 `컨텍스트 관리자' 입니다.

비동기 컨텍스트 관리자는 @ref{185,,async with} 문에서 사용될 수 있습니다.

The @ref{c7d,,object} class itself does not provide these methods.

@geindex __aenter__() (object 메서드)
@anchor{reference/datamodel object __aenter__}@anchor{241e}
@deffn {메서드} object.__aenter__ (self)

Semantically similar to @ref{7e3,,__enter__()}, the only
difference being that it must return an `awaitable'.
@end deffn

@geindex __aexit__() (object 메서드)
@anchor{reference/datamodel object __aexit__}@anchor{19a2}
@deffn {메서드} object.__aexit__ (self, exc_type, exc_value, traceback)

Semantically similar to @ref{1505,,__exit__()}, the only
difference being that it must return an `awaitable'.
@end deffn

비동기 컨텍스트 관리자 클래스의 예:

@example
class AsyncContextManager:
    async def __aenter__(self):
        await log('entering context')

    async def __aexit__(self, exc_type, exc, tb):
        await log('exiting context')
@end example


Added in version 3.5.


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 실행 모델,임포트 시스템,데이터 모델,파이썬 언어 레퍼런스
@anchor{reference/executionmodel doc}@anchor{241f}@anchor{reference/executionmodel execmodel}@anchor{2420}@anchor{reference/executionmodel execution-model}@anchor{2421}@anchor{reference/executionmodel translation-repo}@anchor{2422}
@section 실행 모델


@geindex 실행 모델
@geindex 코드;블록

@menu
* 프로그램의 구조:: 
* 이름과 연결(binding): 이름과 연결 binding. 
* 예외: 예외<2>. 
* Runtime Components:: 

@end menu

@node 프로그램의 구조,이름과 연결 binding,,실행 모델
@anchor{reference/executionmodel prog-structure}@anchor{2423}@anchor{reference/executionmodel structure-of-a-program}@anchor{2424}
@subsection 프로그램의 구조


@geindex 블록

파이썬 프로그램은 코드 블록으로 만들어집니다. `블록 (block)' 은 한 단위로 실행되는 한 조각의 파이썬 프로그램 텍스트입니다. 다음과 같은 것들이 블록입니다: 모듈, 함수 바디, 클래스 정의. 대화형으로 입력되는 각 명령은 블록입니다. 스크립트 파일(표준 입력을 통해 인터프리터로 제공되는 파일이나 인터프리터에 명령행 인자로 지정된 파일)은 코드 블록입니다. 스크립트 명령(@ref{1a8,,-c} 옵션으로 인터프리터 명령행에 지정된 명령)은 코드 블록입니다. @ref{23c,,-m} 인자를 사용하여 명령 줄에서 최상위 수준 스크립트로 (모듈 @code{__main__}으로) 실행되는 모듈도 코드 블록입니다. 내장함수 @ref{4a4,,eval()} 과 @ref{4a3,,exec()} 로 전달되는 문자열 인자도 코드 블록입니다.

@geindex 실행;프레임

코드 블록은 `실행 프레임 (execution frame)' 에서 실행됩니다. 프레임은 몇몇 관리를 위한 정보(디버깅에 사용됩니다)를 포함하고, 코드 블록의 실행이 끝난 후에 어디서 어떻게 실행을 계속할 것인지를 결정합니다.

@node 이름과 연결 binding,예외<2>,프로그램의 구조,실행 모델
@anchor{reference/executionmodel naming}@anchor{2343}@anchor{reference/executionmodel naming-and-binding}@anchor{2425}
@subsection 이름과 연결(binding)


@geindex 이름 공간
@geindex 스코프

@menu
* 이름의 연결:: 
* 이름의 검색(resolution): 이름의 검색 resolution. 
* Annotation scopes:: 
* Lazy evaluation:: 
* builtins 와 제한된 실행:: 
* 동적 기능과의 상호작용:: 

@end menu

@node 이름의 연결,이름의 검색 resolution,,이름과 연결 binding
@anchor{reference/executionmodel bind-names}@anchor{2426}@anchor{reference/executionmodel binding-of-names}@anchor{2427}
@subsubsection 이름의 연결


@geindex 이름
@geindex 연결;이름

`이름 (Names)' 은 객체를 가리킵니다. 이름은 이름 연결 연산 때문에 만들어집니다.

@geindex from;임포트 문

The following constructs bind names:


@itemize *

@item 
formal parameters to functions,

@item 
class definitions,

@item 
function definitions,

@item 
assignment expressions,

@item 
@ref{2428,,targets} that are identifiers if occurring in
an assignment:


@itemize +

@item 
@ref{34a,,for} loop header,

@item 
after @code{as} in a @ref{186,,with} statement, @ref{1ab,,except}
clause, @ref{1ac,,except*} clause, or in the as-pattern in structural pattern matching,

@item 
in a capture pattern in structural pattern matching
@end itemize

@item 
@ref{7f7,,import} statements.

@item 
@ref{66b,,type} statements.

@item 
@ref{5ac,,type parameter lists}.
@end itemize

The @code{import} statement of the form @code{from ... import *} binds all
names defined in the imported module, except those beginning with an underscore.
This form may only be used at the module level.

@ref{1b1d,,del} 문에 나오는 대상 역시 이 목적에서 연결된 것으로 간주합니다(실제 의미가 이름을 연결 해제하는 것이기는 해도).

각 대입이나 임포트 문은 클래스나 함수 정의 때문에 정의되는 블록 내에 등장할 수 있고, 모듈 수준(최상위 코드 블록)에서 등장할 수도 있습니다.

@geindex 자유;변수

만약 이름이 블록 내에서 연결되면, @ref{14ac,,nonlocal} 이나 @ref{4ad,,global} 로 선언되지 않는 이상, 그 블록의 지역 변수입니다. 만약 이름이 모듈 수준에서 연결되면, 전역 변수입니다. (모듈 코드 블록의 변수들 지역이면서 전역입니다.) 만약 변수가 코드 블록에서 사용되지만, 거기에서 정의되지 않았으면 @ref{2429,,자유 변수} 입니다.

프로그램 텍스트에 등장하는 각각의 이름들은 다음에 나오는 이름 검색(name resolution) 규칙에 따라 확정되는 이름의 `연결 (binding)' 을 가리킵니다.

@node 이름의 검색 resolution,Annotation scopes,이름의 연결,이름과 연결 binding
@anchor{reference/executionmodel resolution-of-names}@anchor{242a}@anchor{reference/executionmodel resolve-names}@anchor{242b}
@subsubsection 이름의 검색(resolution)


@geindex 스코프

`스코프 (scope)' 는 블록 내에서 이름의 가시성(visibility)을 정의합니다. 지역 변수가 블록에서 정의되면, 그것의 스코프는 그 블록을 포함합니다. 만약 정의가 함수 블록에서 이루어지면, 포함된 블록이 그 이름에 대해 다른 결합을 만들지 않는 이상, 스코프는 정의하고 있는 것 안에 포함된 모든 블록으로 확대됩니다.

@geindex 환경

이름이 코드 블록 내에서 사용될 때, 가장 가깝게 둘러싸고 있는 스코프에 있는 것으로 검색됩니다. 코드 블록이 볼 수 있는 모든 스코프의 집합을 블록의 `환경 (environment)' 이라고 부릅니다.

@geindex NameError (내장 예외)
@geindex UnboundLocalError

이름이 어디에서도 발견되지 않으면 @ref{452,,NameError} 예외가 발생합니다. 만약 현재 스코프가 함수 스코프이고, 그 이름이 사용되는 시점에 아직 연결되지 않은 지역 변수면 @ref{173b,,UnboundLocalError} 예외가 발생합니다. @code{UnboundLocalError} 는 @code{NameError} 의 서브 클래스입니다.

만약 이름 연결 연산이 코드 블록 내의 어디에서 건 일어난다면, 그 블록 내에서 그 이름의 모든 사용은 현재 블록을 가리키는 것으로 취급됩니다. 이것은 연결되기 전에 블록에서 사용될 때 에러로 이어질 수 있습니다. 이 규칙은 미묘합니다. 파이썬에는 선언(declaration)이 없고, 이름 연결 연산이 코드 블록 내의 어디에서나 일어날 수 있도록 허락합니다. 코드 블록의 지역 변수는 블록의 텍스트 전체에서 이름 연결 연산을 찾아야 결정될 수 있습니다. 예제는 @ref{242c,,UnboundLocalError 에 관한 FAQ 항목}을 참조하세요.

만약 @ref{4ad,,global} 문이 블록 내에서 나오면, 문장에서 지정한 이름의 모든 사용은 최상위 이름 공간(top-level namespace)에 연결된 것을 가리키게 됩니다. 최상위 이름 공간에서 이름을 검색한다는 것은, 전역 이름 공간, 즉 코드 블록을 포함하는 모듈의 이름 공간, 과 내장 이름 공간, 모듈 @ref{13,,builtins} 의 이름 공간, 을 검색한다는 뜻입니다. 전역 이름 공간이 먼저 검색됩니다. 거기에서 이름이 발견되지 않으면, 내장 이름 공간을 다음에 검색합니다. 내장 이름 공간에서도 이름이 발견되지 않으면, 전역 이름 공간에 새 변수가 만들어집니다. global 문은 나열된 이름을 사용하기 전에 나와야 합니다.

@ref{4ad,,global} 문은 같은 블록의 이름 연결 연산과 같은 스코프를 갖습니다. 자유 변수의 경우 가장 가까이서 둘러싸는 스코프가 global 문을 포함한다면, 그 자유 변수는 전역으로 취급됩니다.

@c XXX say more about "nonlocal" semantics here

@ref{14ac,,nonlocal} 문은 대응하는 이름이 가장 가까이서 둘러싸는 함수 스코프에서 이미 연결된 이름을 가리키도록 만듭니다. 만약 주어진 이름이 둘러싸는 함수 스코프 어디에도 없다면 컴파일 시점에 @ref{18e,,SyntaxError} 를 일으킵니다. @ref{5ac,,형 매개 변수}는 @code{nonlocal} 문으로 재연결할 수 없습니다.

@geindex 모듈;__main__

모듈의 이름 공간은 모듈이 처음 임포트될 때 자동으로 만들어집니다. 스크립트의 메인 모듈은 항상 @ref{1,,__main__} 이라고 불립니다.

클래스 정의 블록과 @ref{4a3,,exec()} 와 @ref{4a4,,eval()} 로 전달되는 인자는 특별한 이름 검색 문맥을 갖습니다. 클래스 정의는 이름을 사용하고 정의할 수 있는 실행 가능한 문장입니다. 이 참조들은 연결되지 않은 지역 변수를 전역 이름 공간에서 찾는다는 점을 제외하고는 이름 검색의 일반적인 규칙을 따릅니다. 클래스 정의의 이름 공간은 클래스의 어트리뷰트 딕셔너리가 됩니다. 클래스 블록에서 정의된 이름들의 스코프는 클래스 블록으로 제한됩니다; 메서드들의 코드 블록으로 확대되지 않습니다. 이것은 컴프리헨션과 제너레이터 표현을 포함하지만, 둘러싸는 클래스 스코프에 액세스하는 @ref{4ac,,어노테이션 스코프}는 포함하지 않습니다. 이것은 다음과 같은 것이 실패한다는 뜻입니다:

@example
class A:
    a = 42
    b = list(a + i for i in range(10))
@end example

However, the following will succeed:

@example
class A:
    type Alias = Nested
    class Nested: pass

print(A.Alias.__value__)  # <type 'A.Nested'>
@end example

@node Annotation scopes,Lazy evaluation,이름의 검색 resolution,이름과 연결 binding
@anchor{reference/executionmodel annotation-scopes}@anchor{4ac}@anchor{reference/executionmodel id1}@anchor{242d}
@subsubsection Annotation scopes


@ref{15c,,Annotations}, @ref{5ac,,type parameter lists}
and @ref{66b,,type} statements
introduce `annotation scopes', which behave mostly like function scopes,
but with some exceptions discussed below.

Annotation scopes are used in the following contexts:


@itemize *

@item 
@ref{2017,,Function annotations}.

@item 
@ref{f4f,,Variable annotations}.

@item 
Type parameter lists for @ref{683,,generic type aliases}.

@item 
Type parameter lists for @ref{681,,generic functions}.
A generic function’s annotations are
executed within the annotation scope, but its defaults and decorators are not.

@item 
Type parameter lists for @ref{680,,generic classes}.
A generic class’s base classes and
keyword arguments are executed within the annotation scope, but its decorators are not.

@item 
The bounds, constraints, and default values for type parameters
(@ref{684,,lazily evaluated}).

@item 
The value of type aliases (@ref{684,,lazily evaluated}).
@end itemize

Annotation scopes differ from function scopes in the following ways:


@itemize *

@item 
Annotation scopes have access to their enclosing class namespace.
If an annotation scope is immediately within a class scope, or within another
annotation scope that is immediately within a class scope, the code in the
annotation scope can use names defined in the class scope as if it were
executed directly within the class body. This contrasts with regular
functions defined within classes, which cannot access names defined in the class scope.

@item 
Expressions in annotation scopes cannot contain @ref{bc1,,yield}, @code{yield from},
@ref{18d,,await}, or @ref{242e,,;=}
expressions. (These expressions are allowed in other scopes contained within the
annotation scope.)

@item 
Names defined in annotation scopes cannot be rebound with @ref{14ac,,nonlocal}
statements in inner scopes. This includes only type parameters, as no other
syntactic elements that can appear within annotation scopes can introduce new names.

@item 
While annotation scopes have an internal name, that name is not reflected in the
@ref{1d21,,qualified name} of objects defined within the scope.
Instead, the @ref{1264,,__qualname__}
of such objects is as if the object were defined in the enclosing scope.
@end itemize


Added in version 3.12: Annotation scopes were introduced in Python 3.12 as part of 
@geindex Python 향상 제안; PEP 695
PEP 695@footnote{https://peps.python.org/pep-0695/}.



버전 3.13에서 변경: Annotation scopes are also used for type parameter defaults, as
introduced by 
@geindex Python 향상 제안; PEP 696
PEP 696@footnote{https://peps.python.org/pep-0696/}.



버전 3.14에서 변경: Annotation scopes are now also used for annotations, as specified in
@geindex Python 향상 제안; PEP 649
PEP 649@footnote{https://peps.python.org/pep-0649/} and 
@geindex Python 향상 제안; PEP 749
PEP 749@footnote{https://peps.python.org/pep-0749/}.


@node Lazy evaluation,builtins 와 제한된 실행,Annotation scopes,이름과 연결 binding
@anchor{reference/executionmodel id2}@anchor{242f}@anchor{reference/executionmodel lazy-evaluation}@anchor{684}
@subsubsection Lazy evaluation


Most annotation scopes are `lazily evaluated'. This includes annotations,
the values of type aliases created through the @ref{66b,,type} statement, and
the bounds, constraints, and default values of type
variables created through the @ref{5ac,,type parameter syntax}.
This means that they are not evaluated when the type alias or type variable is
created, or when the object carrying annotations is created. Instead, they
are only evaluated when necessary, for example when the @code{__value__}
attribute on a type alias is accessed.

Example:

@example
>>> type Alias = 1/0
>>> Alias.__value__
Traceback (most recent call last):
  ...
ZeroDivisionError: division by zero
>>> def func[T: 1/0](): pass
>>> T = func.__type_params__[0]
>>> T.__bound__
Traceback (most recent call last):
  ...
ZeroDivisionError: division by zero
@end example

Here the exception is raised only when the @code{__value__} attribute
of the type alias or the @code{__bound__} attribute of the type variable
is accessed.

This behavior is primarily useful for references to types that have not
yet been defined when the type alias or type variable is created. For example,
lazy evaluation enables creation of mutually recursive type aliases:

@example
from typing import Literal

type SimpleExpr = int | Parenthesized
type Parenthesized = tuple[Literal["("], Expr, Literal[")"]]
type Expr = SimpleExpr | tuple[SimpleExpr, Literal["+", "-"], Expr]
@end example

Lazily evaluated values are evaluated in @ref{4ac,,annotation scope},
which means that names that appear inside the lazily evaluated value are looked up
as if they were used in the immediately enclosing scope.


Added in version 3.12.


@node builtins 와 제한된 실행,동적 기능과의 상호작용,Lazy evaluation,이름과 연결 binding
@anchor{reference/executionmodel builtins-and-restricted-execution}@anchor{2430}@anchor{reference/executionmodel restrict-exec}@anchor{2431}
@subsubsection builtins 와 제한된 실행


@geindex 제한된;실행

사용자는 @code{__builtins__} 를 건드리지 말아야 합니다; 이것은 구현 세부사항입니다. 내장 이름 공간의 값을 변경하고 싶은 사용자는 @ref{13,,builtins} 모듈을 @ref{7f7,,import} 하고 그것의 어트리뷰트를 적절하게 수정해야 합니다.

코드 블록의 실행과 연관된 내장 이름 공간은, 사실 전역 이름 공간의 이름 @code{__builtins__} 를 조회함으로써 발견됩니다. 이것은 딕셔너리나 모듈이어야 합니다(후자의 경우 모듈의 딕셔너리가 사용됩니다). 기본적으로, @ref{1,,__main__} 모듈에 있을 때는 @code{__builtins__} 가 내장 모듈 @ref{13,,builtins} 이고, 다른 모듈에 있을 때는 @code{__builtins__} 는 @code{builtins} 모듈의 딕셔너리에 대한 별칭입니다.

@node 동적 기능과의 상호작용,,builtins 와 제한된 실행,이름과 연결 binding
@anchor{reference/executionmodel dynamic-features}@anchor{2432}@anchor{reference/executionmodel interaction-with-dynamic-features}@anchor{2433}
@subsubsection 동적 기능과의 상호작용


자유 변수에 대해 이름 검색은 컴파일 시점이 아니라 실행 시점에 이루어집니다. 이것은 다음과 같은 코드가 42를 출력한다는 것을 뜻합니다:

@example
i = 10
def f():
    print(i)
i = 42
f()
@end example

@c XXX from * also invalid with relative imports (at least currently)

@ref{4a4,,eval()} 과 @ref{4a3,,exec()} 함수는 이름 검색을 위한 완전한 환경에 대한 접근권이 없습니다. 이름은 호출자의 지역과 전역 이름 공간에서 검색될 수 있습니다. 자유 변수는 가장 가까이 둘러싼 이름 공간이 아니라 전역 이름 공간에서 검색됩니다. @footnote{
이 한계는 이 연산들 때문에 실행되는 코드가 모듈이 컴파일되는 시점에는 존재하지 않았기 때문입니다.
} @code{exec()} 과 @code{eval()} 함수에는 전역과 지역 이름 공간을 재정의할 수 있는 생략 가능한 인자가 있습니다. 만약 단지 한 이름 공간만 주어지면, 그것이 두 가지 모두로 사용됩니다.

@c XXX(ncoghlan) above is only accurate for string execution. When executing code objects,
@c closure cells may now be passed explicitly to resolve co_freevars references.
@c Docs issue: https://github.com/python/cpython/issues/122826

@node 예외<2>,Runtime Components,이름과 연결 binding,실행 모델
@anchor{reference/executionmodel exceptions}@anchor{2434}@anchor{reference/executionmodel id4}@anchor{2435}
@subsection 예외


@geindex 예외

@geindex 예외를 발생시키다
@geindex 예외를 처리하다
@geindex 예외 처리기
@geindex 에러
@geindex 에러 처리

예외는 에러나 예외적인 조건을 처리하기 위해 코드 블록의 일반적인 제어 흐름을 깨는 수단입니다. 에러가 감지된 지점에서 예외를 `일으킵니다(raised)'; 둘러싼 코드 블록이나 직접적 혹은 간접적으로 에러가 발생한 코드 블록을 호출한 어떤 코드 블록에서건 예외는 처리될 수 있습니다.

파이썬 인터프리터는 실행 시간 에러(0으로 나누는 것 같은)를 감지할 때 예외를 일으킵니다. 파이썬 프로그램은 @ref{802,,raise} 문을 사용해서 명시적으로 예외를 일으킬 수 있습니다. 예외 처리기는 @ref{8f7,,try} … @ref{1ab,,except} 문으로 지정됩니다. 그런 문장에서 @ref{1b0,,finally} 구는 정리(cleanup) 코드를 지정하는 데 사용되는데, 예외를 처리하는 것이 아니라 앞선 코드에서 예외가 발생하건 그렇지 않건 실행됩니다.

@geindex 종료 모델

파이썬은 에러 처리에 “종결 (termination)” 모델을 사용합니다; 예외 처리기가 뭐가 발생했는지 발견할 수 있고, 바깥 단계에서 실행을 계속할 수는 있지만, 에러의 원인을 제거한 후에 실패한 연산을 재시도할 수는 없습니다(문제의 코드 조각을 처음부터 다시 시작시키는 것은 예외입니다).

@geindex SystemExit (내장 예외)

예외가 어디서도 처리되지 않을 때, 인터프리터는 프로그램의 실행을 종료하거나, 대화형 메인 루프로 돌아갑니다. 두 경우 모두, 예외가 @ref{f3b,,SystemExit} 인 경우를 제외하고, 스택 트레이스백을 인쇄합니다.

예외는 클래스 인스턴스로 구분됩니다. @ref{1ab,,except} 절은 인스턴스의 클래스에 따라 선택됩니다: 인스턴스의 클래스나 그것의 @ref{13bb,,비가상(non-virtual) 베이스 클래스}를 가리켜야 합니다. 인스턴스는 핸들러가 수신할 수 있고 예외적인 조건에 대한 추가적인 정보를 포함할 수 있습니다.

@cartouche
@quotation 참고 
예외 메시지는 파이썬 API 일부가 아닙니다. 그 내용은 파이썬의 버전이 바뀔 때 경고 없이 변경될 수 있고, 코드는 여러 버전의 인터프리터에서 실행될 수 있는 코드는 이것에 의존하지 말아야 합니다.
@end quotation
@end cartouche

섹션 @ref{8f7,,try 문} 에서 @ref{8f7,,try} 문, @ref{802,,raise 문} 에서 @ref{802,,raise} 문에 대한 설명이 제공됩니다.

@node Runtime Components,,예외<2>,실행 모델
@anchor{reference/executionmodel execcomponents}@anchor{2436}@anchor{reference/executionmodel runtime-components}@anchor{2437}
@subsection Runtime Components


@menu
* General Computing Model:: 
* Python Runtime Model:: 

@end menu

@node General Computing Model,Python Runtime Model,,Runtime Components
@anchor{reference/executionmodel general-computing-model}@anchor{2438}
@subsubsection General Computing Model


Python’s execution model does not operate in a vacuum.  It runs on
a host machine and through that host’s runtime environment, including
its operating system (OS), if there is one.  When a program runs,
the conceptual layers of how it runs on the host look something
like this:

@quotation


@display
`host machine'@w{ }
@display
`process' (global resources)@w{ }
@display
`thread' (runs machine code)@w{ }
@end display
@end display
@end display


@end quotation

Each process represents a program running on the host.  Think of each
process itself as the data part of its program.  Think of the process’
threads as the execution part of the program.  This distinction will
be important to understand the conceptual Python runtime.

The process, as the data part, is the execution context in which the
program runs.  It mostly consists of the set of resources assigned to
the program by the host, including memory, signals, file handles,
sockets, and environment variables.

Processes are isolated and independent from one another.  (The same
is true for hosts.)  The host manages the process’ access to its
assigned resources, in addition to coordinating between processes.

Each thread represents the actual execution of the program’s machine
code, running relative to the resources assigned to the program’s
process.  It’s strictly up to the host how and when that execution
takes place.

From the point of view of Python, a program always starts with exactly
one thread.  However, the program may grow to run in multiple
simultaneous threads.  Not all hosts support multiple threads per
process, but most do.  Unlike processes, threads in a process are not
isolated and independent from one another.  Specifically, all threads
in a process share all of the process’ resources.

The fundamental point of threads is that each one does `run'
independently, at the same time as the others.  That may be only
conceptually at the same time (“concurrently”) or physically
(“in parallel”).  Either way, the threads effectively run
at a non-synchronized rate.

@cartouche
@quotation 참고 
That non-synchronized rate means none of the process’ memory is
guaranteed to stay consistent for the code running in any given
thread.  Thus multi-threaded programs must take care to coordinate
access to intentionally shared resources.  Likewise, they must take
care to be absolutely diligent about not accessing any `other'
resources in multiple threads; otherwise two threads running at the
same time might accidentally interfere with each other’s use of some
shared data.  All this is true for both Python programs and the
Python runtime.

The cost of this broad, unstructured requirement is the tradeoff for
the kind of raw concurrency that threads provide.  The alternative
to the required discipline generally means dealing with
non-deterministic bugs and data corruption.
@end quotation
@end cartouche

@node Python Runtime Model,,General Computing Model,Runtime Components
@anchor{reference/executionmodel python-runtime-model}@anchor{2439}
@subsubsection Python Runtime Model


The same conceptual layers apply to each Python program, with some
extra data layers specific to Python:

@quotation


@display
`host machine'@w{ }
@display
`process' (global resources)@w{ }
@display
Python global runtime (`state')@w{ }
@display
Python interpreter (`state')@w{ }
@display
`thread' (runs Python bytecode and “C-API”)@w{ }
@display
Python thread `state'@w{ }
@end display
@end display
@end display
@end display
@end display
@end display


@end quotation

At the conceptual level: when a Python program starts, it looks exactly
like that diagram, with one of each.  The runtime may grow to include
multiple interpreters, and each interpreter may grow to include
multiple thread states.

@cartouche
@quotation 참고 
A Python implementation won’t necessarily implement the runtime
layers distinctly or even concretely.  The only exception is places
where distinct layers are directly specified or exposed to users,
like through the @ref{f3,,threading} module.
@end quotation
@end cartouche

@cartouche
@quotation 참고 
The initial interpreter is typically called the “main” interpreter.
Some Python implementations, like CPython, assign special roles
to the main interpreter.

Likewise, the host thread where the runtime was initialized is known
as the “main” thread.  It may be different from the process’ initial
thread, though they are often the same.  In some cases “main thread”
may be even more specific and refer to the initial thread state.
A Python runtime might assign specific responsibilities
to the main thread, such as handling signals.
@end quotation
@end cartouche

As a whole, the Python runtime consists of the global runtime state,
interpreters, and thread states.  The runtime ensures all that state
stays consistent over its lifetime, particularly when used with
multiple host threads.

The global runtime, at the conceptual level, is just a set of
interpreters.  While those interpreters are otherwise isolated and
independent from one another, they may share some data or other
resources.  The runtime is responsible for managing these global
resources safely.  The actual nature and management of these resources
is implementation-specific.  Ultimately, the external utility of the
global runtime is limited to managing interpreters.

In contrast, an “interpreter” is conceptually what we would normally
think of as the (full-featured) “Python runtime”.  When machine code
executing in a host thread interacts with the Python runtime, it calls
into Python in the context of a specific interpreter.

@cartouche
@quotation 참고 
The term “interpreter” here is not the same as the “bytecode
interpreter”, which is what regularly runs in threads, executing
compiled Python code.

In an ideal world, “Python runtime” would refer to what we currently
call “interpreter”.  However, it’s been called “interpreter” at least
since introduced in 1997 (CPython:a027efa5b@footnote{https://github.com/python/cpython/commit/a027efa5b}).
@end quotation
@end cartouche

Each interpreter completely encapsulates all of the non-process-global,
non-thread-specific state needed for the Python runtime to work.
Notably, the interpreter’s state persists between uses.  It includes
fundamental data like @ref{17ea,,sys.modules}.  The runtime ensures
multiple threads using the same interpreter will safely
share it between them.

A Python implementation may support using multiple interpreters at the
same time in the same process.  They are independent and isolated from
one another.  For example, each interpreter has its own
@ref{17ea,,sys.modules}.

For thread-specific runtime state, each interpreter has a set of thread
states, which it manages, in the same way the global runtime contains
a set of interpreters.  It can have thread states for as many host
threads as it needs.  It may even have multiple thread states for
the same host thread, though that isn’t as common.

Each thread state, conceptually, has all the thread-specific runtime
data an interpreter needs to operate in one host thread.  The thread
state includes the current raised exception and the thread’s Python
call stack.  It may include other thread-specific resources.

@cartouche
@quotation 참고 
The term “Python thread” can sometimes refer to a thread state, but
normally it means a thread created using the @ref{f3,,threading} module.
@end quotation
@end cartouche

Each thread state, over its lifetime, is always tied to exactly one
interpreter and exactly one host thread.  It will only ever be used in
that thread and with that interpreter.

Multiple thread states may be tied to the same host thread, whether for
different interpreters or even the same interpreter.  However, for any
given host thread, only one of the thread states tied to it can be used
by the thread at a time.

Thread states are isolated and independent from one another and don’t
share any data, except for possibly sharing an interpreter and objects
or other resources belonging to that interpreter.

Once a program is running, new Python threads can be created using the
@ref{f3,,threading} module (on platforms and Python implementations that
support threads).  Additional processes can be created using the
@ref{a5,,os}, @ref{dc,,subprocess}, and @ref{98,,multiprocessing} modules.
Interpreters can be created and used with the
@ref{25,,interpreters} module.  Coroutines (async) can
be run using @ref{b,,asyncio} in each interpreter, typically only
in a single thread (often the main thread).

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 임포트 시스템,표현식,실행 모델,파이썬 언어 레퍼런스
@anchor{reference/import doc}@anchor{243a}@anchor{reference/import importsystem}@anchor{235d}@anchor{reference/import the-import-system}@anchor{243b}@anchor{reference/import translation-repo}@anchor{243c}
@section 임포트 시스템


@geindex 임포트 절차

한 @ref{19de,,모듈} 에 있는 파이썬 코드는 @ref{243d,,임포팅} 이라는 프로세스를 통해 다른 모듈에 있는 코드들에 대한 접근권을 얻습니다. @ref{7f7,,import} 문은 임포트 절차를 일으키는 가장 흔한 방법이지만, 유일한 방법은 아닙니다. @ref{73b,,importlib.import_module()} 같은 함수나 내장 @ref{ad1,,__import__()} 도 임포트 절차를 일으키는데 사용될 수 있습니다.

@ref{7f7,,import} 문은 두 가지 연산을 합친 것입니다; 먼저 이름이 가리키는 모듈을 찾은 후에, 그 검색의 결과를 지역 스코프의 이름에 연결합니다. @code{import} 문의 검색 연산은 적절한 인자들로 @ref{ad1,,__import__()} 함수를 호출하는 것으로 정의됩니다. @code{__import__()} 의 반환 값은 @code{import} 문의 이름 연결 연산을 수행하는 데 사용됩니다. 이 이름 연결 연산의 정확한 세부사항에 대해서는 @code{import} 문을 보세요.

@ref{ad1,,__import__()} 의 직접 호출은 모듈을 찾고, 발견된다면, 모듈을 만드는 연산만을 수행합니다. 부모 패키지를 임포트하거나 여러 캐시(@ref{17ea,,sys.modules} 를 포함합니다)를 갱신하는 것과 같은 부수적인 효과들이 일어날 수 있기는 하지만, 오직 @ref{7f7,,import} 문만이 이름 연결 연산을 수행합니다.

@ref{7f7,,import} 문이 실행될 때, 표준 내장 @ref{ad1,,__import__()} 가 호출됩니다. 임포트 시스템을 호출하는 다른 메커니즘 (@ref{73b,,importlib.import_module()} 같은)은 @code{__import__()} 를 사용하지 않고 임포트 개념을 구현하기 위한 자신의 방법을 사용할 수 있습니다.

모듈이 처음 임포트 될 때, 파이썬은 모듈을 검색하고, 발견된다면, 모듈 객체를 만들고 @footnote{
@ref{1013,,types.ModuleType} 을 보세요.
}, 초기화합니다. 만약 그 이름의 모듈을 발견할 수 없다면, @ref{d3c,,ModuleNotFoundError} 를 일으킵니다. 파이썬은 임포트 절차가 호출될 때 이름 붙여진 모듈을 찾는 다양한 전략을 구현합니다. 이 전략들은 다음 섹션에서 설명하는 여러 가지 훅을 통해 수정되고 확장될 수 있습니다.


버전 3.3에서 변경: 임포트 시스템은 
@geindex Python 향상 제안; PEP 302
PEP 302@footnote{https://peps.python.org/pep-0302/} 의 두 번째 단계를 완전히 구현하도록 개정되었습니다. 이제 묵시적인 임포트 절차는 없습니다 - 전체 임포트 시스템이 @ref{f26,,sys.meta_path} 을 통해 노출됩니다. 여기에 더해, 네이티브(native) 이름 공간 패키지의 지원이 구현되었습니다 (
@geindex Python 향상 제안; PEP 420
PEP 420@footnote{https://peps.python.org/pep-0420/} 을 보세요).


@menu
* importlib: importlib<10>. 
* 패키지(package): 패키지 package. 
* 검색:: 
* 로딩(loading): 로딩 loading. 
* 경로 기반 파인더:: 
* 표준 임포트 시스템 교체하기:: 
* 패키지 상대 임포트:: 
* __main__ 에 대한 특별한 고려:: 
* 참고문헌:: 

@end menu

@node importlib<10>,패키지 package,,임포트 시스템
@anchor{reference/import importlib}@anchor{243e}
@subsection @code{importlib}


@ref{7b,,importlib} 모듈은 임포트 시스템과 상호 작용하기 위한 풍부한 API를 제공합니다. 예를 들어, @ref{73b,,importlib.import_module()} 는 임포트 절차를 구동하는 데 있어 내장 @ref{ad1,,__import__()} 에 비해 권장되고, 더 간단한 API를 제공합니다. 더 상세한 내용은 @code{importlib} 라이브러리 설명서를 참조하십시오.

@node 패키지 package,검색,importlib<10>,임포트 시스템
@anchor{reference/import packages}@anchor{243f}
@subsection 패키지(package)


@geindex 패키지(package)

파이썬은 한 가지 종류의 모듈 객체만 갖고 있고, 모든 모듈은 모듈이 파이썬이나 C나 그 밖의 다른 어떤 방법으로 구현되었는지와 상관없이 이 형입니다. 모듈을 조직화하고 이름 계층구조를 제공하기 위해, 파이썬은 @ref{233,,패키지} 라는 개념을 갖고 있습니다.

패키지를 파일 시스템에 있는 디렉터리라고 생각할 수 있지만, 패키지와 모듈이 파일시스템으로부터 올 필요는 없으므로 이 비유를 너무 문자 그대로 해석하지 말아야 합니다. 이 문서의 목적상, 디렉터리와 파일이라는 비유를 사용할 것입니다. 파일 시스템 디렉터리처럼, 패키지는 계층적으로 조직화하고, 패키지는 보통 모듈뿐만 아니라 서브 패키지도 포함할 수 있습니다.

모든 패키지가 모듈이라는 것을 기억하는 것이 중요합니다. 하지만 모든 모듈이 패키지인 것은 아닙니다. 다른 식으로 표현하면, 패키지는 특별한 종류의 모듈입니다. 구체적으로, @code{__path__} 어트리뷰트를 포함하는 모든 모듈은 패키지로 취급됩니다.

모든 모듈은 이름이 있습니다. 서브 패키지 이름은 파이썬의 표준 어트리뷰트 액세스 문법을 따라, 부모 패키지 이름과 점(dot)으로 구분됩니다. 그래서 @ref{3f,,email} 이라고 불리는 패키지가 있을 수 있습니다. email 은 다시 서브 패키지 @ref{49,,email.mime} 을 갖고, 이 서브 패키지 내에 모듈 @ref{51,,email.mime.text} 가 있을 수 있습니다.

@menu
* 정규 패키지:: 
* 이름 공간 패키지:: 

@end menu

@node 정규 패키지,이름 공간 패키지,,패키지 package
@anchor{reference/import regular-packages}@anchor{2440}
@subsubsection 정규 패키지


@geindex 패키지(package);일반

파이썬은 두 가지 종류의 패키지를 정의합니다, @ref{2441,,정규 패키지} 와 @ref{2b2,,이름 공간 패키지}. 정규 패키지는 파이썬 3.2와 그 이전에 존재하던 전통적인 패키지입니다. 정규 패키지는 보통 @code{__init__.py} 파일을 가진 디렉터리로 구현됩니다. 정규 패키지가 임포트될 때, 이 @code{__init__.py} 파일이 묵시적으로 실행되고, 그것이 정의하는 객체들이 패키지의 이름 공간의 이름들도 연결됩니다. @code{__init__.py} 파일은 다른 모듈들이 가질 수 있는 것과 같은 파이썬 코드를 포함할 수 있고, 파이썬은 임포트될 때 모듈에 몇 가지 어트리뷰트를 추가합니다.

예를 들어, 다음과 같은 파일시스템 배치는 최상위 @code{parent} 패키지와 세 개의 서브 패키지를 정의합니다:

@example
parent/
    __init__.py
    one/
        __init__.py
    two/
        __init__.py
    three/
        __init__.py
@end example

@code{parent.one} 을 임포트하면 @code{parent/__init__.py} 과 @code{parent/one/__init__.py} 을 묵시적으로 실행합니다. 뒤이은 @code{parent.two} 와 @code{parent.three} 의 임포트는 각각 @code{parent/two/__init__.py} 와 @code{parent/three/__init__.py} 를 실행합니다.

@node 이름 공간 패키지,,정규 패키지,패키지 package
@anchor{reference/import namespace-packages}@anchor{2442}@anchor{reference/import reference-namespace-package}@anchor{2443}
@subsubsection 이름 공간 패키지


@geindex 패키지(package);이름 공간
@geindex 패키지(package);포션

이름 공간 패키지는 여러 가지 @ref{2444,,포션} 들의 복합체인데, 각 포션들은 부모 패키지의 서브 패키지로 이바지합니다. 포션들은 파일시스템의 다른 위치에 놓일 수 있습니다. 포션들은 zip 파일이나 네트워크나 파이썬이 임포트 할 때 검색하는 어떤 다른 장소에서 발견될 수 있습니다. 이름 공간 패키지는 파일시스템의 객체와 직접적인 상관관계가 있을 수도 있고 그렇지 않을 수도 있습니다; 구체적인 형태가 없는 가상 모듈일 수도 있습니다.

이름 공간 패키지는 @code{__path__} 어트리뷰트로 일반적인 리스트를 사용하지 않습니다. 대신에 특별한 이터러블 형을 사용하는데, 그 패키지 내의 다음 임포트 시도에서 그것의 부모 패키지(또는 최상위 패키지의 경우 @ref{3e4,,sys.path}) 의 경로가 변했으면 패키지 포션에 대한 새 검색을 자동으로 수행하게 됩니다.

이름 공간 패키지의 경우, @code{parent/__init__.py} 파일이 없습니다. 사실, 임포트 검색 동안 여러 개의 @code{parent} 디렉터리가 발견될 수 있고, 각각의 것은 다른 포션들에 의해 제공됩니다. 그래서 @code{parent/one} 은 물리적으로 @code{parent/two} 옆에 위치하지 않을 수 있습니다. 이 경우, 파이썬은 자신 또는 서브 패키지 중 어느 하나가 임포트 될 때마다 최상위 @code{parent} 패키지를 위한 이름 공간 패키지를 만듭니다.

이름 공간 패키지의 규격은 
@geindex Python 향상 제안; PEP 420
PEP 420@footnote{https://peps.python.org/pep-0420/} 을 참조하세요.

@node 검색,로딩 loading,패키지 package,임포트 시스템
@anchor{reference/import searching}@anchor{2445}
@subsection 검색


검색을 시작하기 위해, 파이썬은 임포트될 모듈(또는 패키지, 하지만 이 논의에서 차이점은 중요하지 않다)의 완전히 @ref{1d21,,정규화된 이름} 을 필요로 합니다. 이 이름은 @ref{7f7,,import} 문으로 제공된 여러 인자나, @ref{73b,,importlib.import_module()} 나 @ref{ad1,,__import__()} 함수로 전달된 매개변수들로부터 옵니다.

이 이름은 임포트 검색의 여러 단계에서 사용되는데, 서브 모듈로 가는 점으로 구분된 경로일 수 있습니다, 예를 들어 @code{foo.bar.baz}. 이 경우에, 파이썬은 먼저 @code{foo} 를, 그다음에 @code{foo.bar} 를, 마지막으로 @code{foo.bar.baz} 를 임포트하려고 시도합니다. 만약 중간 임포트가 어느 하나라도 실패한다면 @ref{d3c,,ModuleNotFoundError} 가 발생합니다.

@menu
* 모듈 캐시:: 
* 파인더(finder)와 로더(loader): 파인더 finder 와 로더 loader. 
* 임포트 훅(import hooks): 임포트 훅 import hooks. 
* 메타 경로(meta path): 메타 경로 meta path. 

@end menu

@node 모듈 캐시,파인더 finder 와 로더 loader,,검색
@anchor{reference/import the-module-cache}@anchor{2446}
@subsubsection 모듈 캐시


@geindex sys.modules

임포트 검색 도중 처음으로 검사되는 장소는 @ref{17ea,,sys.modules} 입니다. 이 매핑은 중간 경로들을 포함해서 전에 임포트 된 모든 모듈의 캐시로 기능합니다. 그래서 만약 @code{foo.bar.baz} 가 앞서 임포트 되었다면, @code{sys.modules} 는 @code{foo}, @code{foo.bar}, @code{foo.bar.baz} 항목들을 포함합니다. 각 키에 대응하는 값들은 모듈 객체입니다.

임포트하는 동안, 모듈 이름을 @ref{17ea,,sys.modules} 에서 찾고, 만약 있다면 해당 값이 임포트를 만족하는 모듈이고, 프로세스는 완료됩니다. 하지만 값이 @code{None} 이면, @ref{d3c,,ModuleNotFoundError}  를 일으킵니다. 만약 모듈 이름이 없다면, 파이썬은 모듈 검색을 계속 진행합니다.

@ref{17ea,,sys.modules} 은 쓰기가 허락됩니다. 키를 삭제해도 해당 모듈을 파괴하지는 않지만(다른 모듈들이 아직 그 모듈에 대한 참조를 유지하고 있을 수 있으므로), 해당 이름의 모듈에 대한 캐시를 무효화해서, 다음 임포트때 파이썬으로 하여금 그 모듈을 다시 찾도록 만듭니다. 키에는 @code{None} 을 대입할 수도 있는데, 다음 임포트 때 @ref{d3c,,ModuleNotFoundError} 가 일어나도록 만듭니다.

모듈 객체에 대한 참조를 유지한다면, @ref{17ea,,sys.modules} 의 캐시 항목을 무효로 한 후 다시 임포트하면 두 모듈 객체는 같은 것이 아니게 됨에 주의해야 합니다. 반면에 @ref{73c,,importlib.reload()} 는 같은 모듈 객체를 재사용하고, 간단하게 모듈의 코드를 다시 실행해서 모듈의 내용을 다시 초기화합니다.

@node 파인더 finder 와 로더 loader,임포트 훅 import hooks,모듈 캐시,검색
@anchor{reference/import finders-and-loaders}@anchor{2447}@anchor{reference/import id2}@anchor{2448}
@subsubsection 파인더(finder)와 로더(loader)


@geindex 파인더
@geindex 로더
@geindex 모듈 스펙

모듈이 @ref{17ea,,sys.modules} 에서 발견되지 않으면, 모듈을 찾아서 로드하기 위해 파이썬의 임포트 프로토콜이 구동됩니다. 이 프로토콜은 두 개의 개념적 객체들로 구성되어 있습니다, @ref{2367,,파인더} 와 @ref{1a28,,로더}. 파인더의 일은 자신이 알고 있는 전략을 사용해, 주어진 이름의 모듈을 찾을 수 있는지 결정하는 것입니다. 두 인터페이스 모두를 구현한 객체들을 @ref{2449,,임포터}라고 부릅니다 - 요청한 모듈을 로딩할 수 있다고 판단할 때 자신을 돌려줍니다.

파이썬은 여러 가지 기본 파인더들과 임포터들을 포함하고 있습니다. 첫 번째 것은 내장 모듈들의 위치를 찾을 수 있고, 두 번째 것은 프로즌 모듈(frozen module)의 위치를 찾을 수 있고, 세 번째 것은 모듈을 @ref{244a,,임포트 경로} 에서 검색합니다. 임포트 경로 는 파일 시스템의 경로나 zip 파일을 가리키는 위치들의 목록입니다. 그것은 URL로 식별될 수 있는 것들처럼, 위치가 지정될 수 있는 자원들을 검색하도록 확장될 수 있습니다.

임포트 절차는 확장 가능해서, 모듈 검색의 범위를 확대하기 위해 새 파인더를 추가할 수 있습니다.

파인더는 실제로 모듈을 로드하지는 않습니다. 주어진 이름의 모듈을 찾으면 임포트와 관련된 정보들을 요약한 `모듈 스펙 (module spec)' 을 돌려주는데, 임포트 절차는 모듈을 로딩할 때 이것을 사용하게 됩니다.

다음 섹션은 파인더와 로더의 프로토콜에 대해 좀 더 자세히 설명하는데, 임포트 절차를 확장하기 위해 어떻게 새로운 것들을 만들고 등록하는지를 포함합니다.


버전 3.4에서 변경: 이전 버전의 파이썬에서, 파인더가 @ref{1a28,,로더} 를 직접 돌려주었지만, 이제는 로더를 `포함하고' 있는 모듈 스펙을 돌려줍니다. 임포트 도중 로더가 아직 사용되기는 하지만 그 역할은 축소되었습니다.


@node 임포트 훅 import hooks,메타 경로 meta path,파인더 finder 와 로더 loader,검색
@anchor{reference/import import-hooks}@anchor{244b}
@subsubsection 임포트 훅(import hooks)


@geindex 임포트 훅(import hooks)
@geindex 메타 훅(meta hooks)
@geindex 경로 훅(path hooks)
@geindex 훅;임포트
@geindex 훅;메타
@geindex 훅;경로

임포트 절차는 확장할 수 있도록 설계되었습니다; 일차적인 메커니즘은 `임포트 훅(import hook)' 입니다. 두 가지 종류의 임포트 훅이 있습니다: `메타 훅(meta hook)' 과 `임포트 경로 훅(import path hook)'.

메타 훅은 임포트 처리의 처음에, @ref{17ea,,sys.modules} 캐시 조회를 제외한 다른 임포트 처리들이 시작되기 전에 호출됩니다. 이것은 메타 훅이 @ref{3e4,,sys.path} 처리, 프로즌 모듈, 내장 모듈들을 재정의할 수 있게 합니다. 다음에 설명하듯이, 메타 훅은 @ref{f26,,sys.meta_path} 에 새 파인더 객체를 추가하는 방법으로 등록할 수 있습니다.

임포트 경로 훅은 @ref{3e4,,sys.path} (혹은 @code{package.__path__}) 처리 일부로, 관련된 경로 항목을 만나는 시점에 호출됩니다. 다음에 설명하듯이, 임포트 경로 훅은 @ref{1223,,sys.path_hooks} 에 새 콜러블을 추가하는 방법으로 등록할 수 있습니다.

@node 메타 경로 meta path,,임포트 훅 import hooks,검색
@anchor{reference/import the-meta-path}@anchor{244c}
@subsubsection 메타 경로(meta path)


@geindex sys.meta_path
@geindex 파인더;find_spec

주어진 이름의 모듈을 @ref{17ea,,sys.modules} 에서 찾을 수 없을 때, 파이썬은 @ref{f26,,sys.meta_path} 를 검색하는데, 메타 경로 파인더 객체들의 목록을 포함하고 있습니다. 이 파인더들이 주어진 이름의 모듈을 처리하는 방법을 알고 있는지 확인하도록 요청합니다. 메타 경로 파인더들은 @ref{a68,,find_spec()} 라는 이름의 메서드를 구현해야만 하는데, 세 개의 인자를 받아들입니다: 이름, 임포트 경로, (생략 가능한) 타깃(target) 모듈. 메타 경로 파인더는 주어진 이름의 모듈을 처리할 수 있는지를 결정하기 위해 어떤 전략이건 사용할 수 있습니다.

만약 메타 경로 파인더가 주어진 이름의 모듈을 처리하는 법을 안다면, 스펙 객체를 돌려줍니다. 그럴 수 없다면 @code{None} 을 돌려줍니다. 만약 @ref{f26,,sys.meta_path} 처리가 스펙을 돌려주지 못하고 목록의 끝에 도달하면, @ref{d3c,,ModuleNotFoundError} 를 일으킵니다. 발생하는 다른 예외들은 그냥 확산시키고, 임포트 프로세스를 중단합니다.

메타 경로 파인더의 @ref{a68,,find_spec()} 메서드는 두 개나 세 개의 인자로 호출됩니다. 첫 번째 인자는 모듈의 완전히 정규화된 이름(fully qualified name)입니다, 예를 들어 @code{foo.bar.baz}. 두 번째 인자는 모듈 검색에 사용할 경로 엔트리입니다. 최상위 모듈이 경우 두 번째 인자는 @code{None} 이지만, 서브 모듈이나 서브 패키지의 경우 두 번째 인자는 부모 패키지의 @code{__path__} 어트리뷰트 값입니다. 만약 적절한 @code{__path__} 어트리뷰트를 참조할 수 없으면 @ref{d3c,,ModuleNotFoundError} 를 일으킵니다. 세 번째 인자는 이미 존재하는 모듈 객체인데, 뒤에서 로딩할 대상이 됩니다. 임포트 시스템은 다시 로드(reload)할 때만 타깃을 전달합니다.

메타 경로는 한 번의 임포트 요청에 대해 여러 번 탐색 될 수 있습니다. 예를 들어, 대상 모듈들이 아무것도 캐싱 되지 않았다고 할 때, @code{foo.bar.baz} 를 임포트 하려면, 먼저 각 메타 경로 파인더 (@code{mpf})들에 대해 @code{mpf.find_spec("foo", None, None)} 를 호출해서 최상위 임포트를 수행합니다. @code{foo} 가 임포트 된 후에, 메타 경로를 두 번째 탐색해서 @code{foo.bar} 를 임포트 하는데, @code{mpf.find_spec("foo.bar", foo.__path__, None)} 를 호출합니다. 일단 @code{foo.bar} 가 임포트 되면, 마지막 탐색은 @code{mpf.find_spec("foo.bar.baz", foo.bar.__path__, None)} 를 호출합니다.

어떤 메타 경로 파인더들은 오직 최상위 임포트만 지원합니다. 이런 임포터들은 두 번째 인자로 @code{None} 이 아닌 것이 오면 항상 @code{None} 을 돌려줍니다.

파이썬의 기본 @ref{f26,,sys.meta_path} 는 세 개의 메타 경로 파인더를 갖고 있습니다. 하나는 내장 모듈을 임포트하는 법을 알고, 하나는 프로즌 모듈을 임포트하는 법을 알고, 하나는 @ref{244a,,임포트 경로} 에서 모듈을 임포트하는 법을 압니다(즉 @ref{244d,,경로 기반 파인더}).


버전 3.4에서 변경: 메타 경로 파인더의 @ref{a68,,find_spec()} 메서드가 이제 폐지된 @code{find_module()} 을 대체합니다. 변경 없이도 동작하기는 하지만, 임포트 절차는 파인더가 @code{find_spec()} 을 구현하지 않았을 때만 사용합니다.



버전 3.10에서 변경: 임포트 시스템에서 @code{find_module()}을 사용하면 이제 @ref{71d,,ImportWarning}을 발생시킵니다.



버전 3.12에서 변경: @code{find_module()}은 제거했습니다. 대신 @ref{a68,,find_spec()}을 사용하십시오.


@node 로딩 loading,경로 기반 파인더,검색,임포트 시스템
@anchor{reference/import loading}@anchor{244e}
@subsection 로딩(loading)


모듈 스펙이 발견되면, 임포트 절차는 모듈을 로딩할 때 그것(그것이 가진 로더도)을 사용합니다. 여기에 임포트의 로딩 과정 동안 일어나는 일에 대한 대략적인 그림이 있습니다:

@example
module = None
if spec.loader is not None and hasattr(spec.loader, 'create_module'):
    # 'exec_module'도 loader에 정의되어 있다고 가정합니다.
    module = spec.loader.create_module(spec)
if module is None:
    module = ModuleType(spec.name)
# 임포트 관련 모듈 어트리뷰트들은 여기에서 설정됩니다:
_init_module_attrs(spec, module)

if spec.loader is None:
    # 지원되지 않습니다
    raise ImportError
if spec.origin is None and spec.submodule_search_locations is not None:
    # 이름 공간 패키지
    sys.modules[spec.name] = module
elif not hasattr(spec.loader, 'exec_module'):
    module = spec.loader.load_module(spec.name)
else:
    sys.modules[spec.name] = module
    try:
        spec.loader.exec_module(module)
    except BaseException:
        try:
            del sys.modules[spec.name]
        except KeyError:
            pass
        raise
return sys.modules[spec.name]
@end example

다음과 같은 세부 사항에 주의해야 합니다:


@itemize *

@item 
만약 주어진 이름의 모듈이 @ref{17ea,,sys.modules} 에 있다면, 임포트는 이미 그걸 돌려줄 겁니다.

@item 
로더가 모듈을 실행하기 전에 모듈은 @ref{17ea,,sys.modules} 에 자리를 잡습니다. 이것은 필수적인데 모듈이 (직접적 혹은 간접적으로) 자신을 임포트 할 수 있기 때문입니다; 먼저 @code{sys.modules} 에 추가함으로써 최악의 상황에 제한 없는 재귀(recursion)를 방지하고, 최선의 상황에 여러 번 로딩되는 것을 막습니다.

@item 
로딩이 실패하면, 실패한 모듈(오직 실패한 모듈만)은 @ref{17ea,,sys.modules} 에서 삭제됩니다. @code{sys.modules} 캐시에 이미 있는 모듈과 부수적 효과로 성공적으로 로딩된 모듈들은 캐시에 남아있어야만 합니다. 이는 실패한 모듈조차 @code{sys.modules} 에 남아있게 되는 리로딩과 대비됩니다.

@item 
모듈이 만들어졌지만, 아직 실행되기 전에, @ref{235e,,뒤의 섹션} 에서 요약되듯이, 임포트 절차는 임포트 관련 모듈 어트리뷰트들을 설정합니다(위의 의사 코드 예에서 “_init_module_attrs”).

@item 
모듈 실행은 로딩에서 모듈의 이름 공간이 채워지는 결정적 순간입니다. 실행은 전적으로 로더에 위임되는데, 로더가 어떤 것이 어떻게 채워져야 하는지 결정합니다.

@item 
로딩 동안 만들어지고 exec_module() 로 전달되는 모듈은 임포트의 끝에 반환되는 것이 아닐 수 있습니다 @footnote{
importlib 구현은 반환 값을 직접 사용하지 않습니다. 대신에, @ref{17ea,,sys.modules} 에서 모듈 이름을 조회해서 모듈을 얻습니다. 이것의 간접적인 효과는 임포트되는 모듈이 @code{sys.modules} 에 있는 자신을 바꿀 수 있다는 것입니다. 이것은 구현 상세 동작이고 다른 파이썬 구현에서 동작한다고 보장되지 않습니다.
}.
@end itemize


버전 3.4에서 변경: 임포트 시스템이 기초 공사에 대한 로더의 책임을 들고 갔습니다. 이것들은 전에는 @ref{a69,,importlib.abc.Loader.load_module()} 메서드에서 수행되었습니다.


@menu
* 로더:: 
* 서브 모듈:: 
* 모듈 스펙:: 
* 모듈의 __path__ 어트리뷰트:: 
* 모듈 repr:: 
* 캐시된 바이트 코드 무효화:: 

@end menu

@node 로더,서브 모듈,,로딩 loading
@anchor{reference/import loaders}@anchor{244f}
@subsubsection 로더


모듈 로더는 로딩의 결정적인 기능을 제공합니다: 모듈 실행. 임포트 절차는 하나의 인자로 @ref{a6a,,importlib.abc.Loader.exec_module()} 메서드를 호출하는데, 실행할 모듈 객체가 전달됩니다. @code{exec_module()} 이 돌려주는 값은 무시됩니다.

로더는 다음과 같은 요구 조건들을 만족해야 합니다:


@itemize *

@item 
만약 모듈이 파이썬 모듈(내장 모듈이나 동적으로 로딩되는 확장이 아니라)이면, 로더는 모듈의 코드를 모듈의 전역 이름 공간(@code{module.__dict__})에서 실행해야 합니다.

@item 
만약 로더가 모듈을 실행하지 못하면, @ref{659,,ImportError} 를 일으켜야 합니다. 하지만 @ref{a6a,,exec_module()} 동안 발생하는 다른 예외도 전파됩니다.
@end itemize

많은 경우에, 파인더와 로더는 같은 객체입니다; 그런 경우 @ref{a68,,find_spec()} 메서드는 로더가 @code{self} 로 설정된 스펙을 돌려줍니다.

모듈 로더는 @ref{eab,,create_module()} 메서드를 구현함으로써 로딩하는 동안 모듈 객체를 만드는 일에 개입할 수 있습니다. 하나의 인자, 모듈 스펙, 을 받아들이고 로딩 중 사용할 모듈 객체를 돌려줍니다. @code{create_module()} 은 모듈 객체의 어트리뷰트를 설정할 필요는 없습니다. 만약 메서드가 @code{None} 을 돌려주면, 임포트 절차는 새 모듈을 스스로 만듭니다.


Added in version 3.4: 로더의 @ref{eab,,create_module()} 메서드.



버전 3.4에서 변경: @ref{a69,,load_module()} 메서드는 @ref{a6a,,exec_module()} 로 대체되었고, 임포트 절차가 로딩의 공통 코드(boilerplate)에 대한 책임을 집니다.

이미 존재하는 로더들과의 호환을 위해, 임포트 절차는 @code{load_module()} 메서드가 존재하고, @code{exec_module()} 을 구현하지 않았으면 @code{load_module()} 을 사용합니다. 하지만 @code{load_module()} 은 폐지되었습니다. 로더는 대신 @code{exec_module()} 를 구현해야 합니다.

@code{load_module()} 메서드는 모듈을 실행하는 것 외에 위에서 언급한 모든 공통(boilerplate) 로딩 기능을 구현해야만 합니다. 같은 제약들이 모두 적용되는데, 추가적인 설명을 붙여보면:


@itemize *

@item 
만약 @ref{17ea,,sys.modules} 에 주어진 이름의 모듈 객체가 이미 존재하면, 로더는 반드시 그 객체를 사용해야 합니다. (그렇지 않으면, @ref{73c,,importlib.reload()} 이 올바로 동작하지 않게 됩니다.) 만약 @code{sys.modules} 에 주어진 이름의 모듈이 없으면, 로더는 새 모듈객체를 만들고 @code{sys.modules} 에 추가해야 합니다.

@item 
제한 없는 재귀와 여러 번 로딩되는 것을 방지하기 위해, 로더가 모듈 코드를 실행하기 전에 모듈이 @ref{17ea,,sys.modules} 에 존재해야 합니다.

@item 
만약 로딩이 실패하면, 로더는 @ref{17ea,,sys.modules} 에 삽입한 모듈들을 제거해야 하는데, 실패한 모듈만을 제거해야 하고, 로더가 그 모듈을 직접 명시적으로 로드한 경우에만 그래야 합니다.
@end itemize



버전 3.5에서 변경: @code{exec_module()} 이 정의되었지만 @code{create_module()} 이 정의되지 않으면 @ref{1a3,,DeprecationWarning} 이 발생합니다.



버전 3.6에서 변경: @code{exec_module()} 이 정의되었지만 @code{create_module()} 이 정의되지 않으면 @ref{659,,ImportError} 를 일으킵니다.



버전 3.10에서 변경: @code{load_module()}의 사용은 @ref{71d,,ImportWarning}을 발생시킵니다.


@node 서브 모듈,모듈 스펙,로더,로딩 loading
@anchor{reference/import submodules}@anchor{2450}
@subsubsection 서브 모듈


어떤 메커니즘으로든 (예를 들어, @code{importlib} API들, @code{import} 나 @code{import-from} 문, 내장 @code{__import__()}) 서브 모듈이 로드될 때, 서브 모듈 객체로의 연결은 부모 모듈의 이름 공간에 이루어집니다. 예를 들어, 패키지 @code{spam} 이 서브 모듈 @code{foo} 를 가지면, @code{spam.foo} 를 임포트 한 후에는 @code{spam} 이 서브 모듈에 연결된 어트리뷰트 @code{foo} 를 갖게 됩니다. 다음과 같은 디렉터리 구조로 되어 있다고 합시다:

@example
spam/
    __init__.py
    foo.py
@end example

그리고 @code{spam/__init__.py} 가 다음과 같은 줄을 포함한다고 합시다:

@example
from .foo import Foo
@end example

그러면 다음과 같이 실행하면 @code{spam} 모듈에 @code{foo} 와 @code{Foo} 에 대한 이름 연결이 일어납니다.

@example
>>> import spam
>>> spam.foo
<module 'spam.foo' from '/tmp/imports/spam/foo.py'>
>>> spam.Foo
<class 'spam.foo.Foo'>
@end example

파이썬의 익숙한 이름 연결 규칙에서 볼 때 의외의 결과로 보일 수 있습니다. 하지만 실제로는 임포트 시스템의 근본적인 기능입니다. 불변의 규칙은 이렇습니다: 만약 @code{sys.modules['spam']} 과 @code{sys.modules['spam.foo']} 가 있다면 (위의 임포트 이후의 상태가 그러합니다), 뒤에 있는 것은 반드시 앞에 있는 것의 @code{foo} 어트리뷰트가 되어야 합니다.

@node 모듈 스펙,모듈의 __path__ 어트리뷰트,서브 모듈,로딩 loading
@anchor{reference/import id4}@anchor{2451}@anchor{reference/import module-specs}@anchor{2363}
@subsubsection 모듈 스펙


임포트 절차는 임포트 동안 각 모듈에 대한 다양한 정보들을 사용합니다, 특히 로딩 전에. 대부분 정보는 모든 모듈의 공통이다. 모듈 스펙의 목적은 이 임포트 관련 정보를 모듈별로 요약하는 것입니다.

임포트 동안 스펙을 사용하면 상태가 임포트 시스템의 구성 요소들로 전달될 수 있습니다, 예를 들어 모듈 스펙을 만드는 파인더와 그것을 실행하는 로더 간에. 가장 중요한 것은, 임포트 절차가 로딩의 공통 연산(boilerplate operation)을 수행할 수 있도록 하는 것입니다. 모듈 스펙이 없다면 로더가 모든 책임을 지게 됩니다.

모듈의 스펙은 @ref{2361,,module.__spec__}으로 노출됩니다. @code{__spec__} 을 적절히 설정하는 것은 @ref{2452,,인터프리터가 구동되는 동안 초기화되는 모듈들} 에도 마찬가지로 적용됩니다. 한가지 예외는 @code{__main__} 인데, @code{__spec__} 이 @ref{2453,,어떤 경우에 None 으로 설정됩니다}.

모듈 스펙의 내용에 대한 세부 사항은 @ref{2269,,ModuleSpec} 을 보세요.


Added in version 3.4.


@node 모듈의 __path__ 어트리뷰트,모듈 repr,모듈 스펙,로딩 loading
@anchor{reference/import package-path-rules}@anchor{2364}@anchor{reference/import path-attributes-on-modules}@anchor{2454}
@subsubsection 모듈의 __path__ 어트리뷰트


@ref{2052,,__path__} 어트리뷰트는 패키지의 서브 모듈을 찾을 위치를 열거하는 문자열의 (비어 있을 수 있는) @ref{715,,시퀀스}여야 합니다. 정의에 따르면, 모듈에 @code{__path__} 어트리뷰트가 있으면, 그 모듈은 @ref{233,,패키지}입니다.

패키지의 @ref{2052,,__path__} 어트리뷰트는 서브 패키지를 로딩할 때 사용합니다. 임포트 절차 내에서, 임포트하는 동안 모듈을 검색할 위치들의 목록을 제공한다는 점에서 @ref{3e4,,sys.path} 와 같은 기능을 갖습니다. 하지만 @code{__path__} 는 보통 @code{sys.path} 보다 제약 조건이 많습니다.

@ref{3e4,,sys.path} 과 같은 규칙이 패키지의 @code{__path__} 에도 적용됩니다. 패키지의 @code{__path__} 를 탐색하는 동안 @ref{1223,,sys.path_hooks} (아래에서 설명한다)에게 의견을 묻습니다.

패키지의 @code{__init__.py} 파일은 패키지의 @ref{2052,,__path__} 어트리뷰트를 설정하거나 변경할 수 있고, 이것이 
@geindex Python 향상 제안; PEP 420
PEP 420@footnote{https://peps.python.org/pep-0420/} 이전에 이름 공간 패키지를 구현하는 방법으로 사용됐습니다. 
@geindex Python 향상 제안; PEP 420
PEP 420@footnote{https://peps.python.org/pep-0420/} 의 도입으로 인해, 이름 공간 패키지가 @code{__path__} 조작 코드만을 포함하는 @code{__init__.py} 파일을 제공할 필요가 없어졌습니다; 임포트 절차가 자동으로 이름 공간 패키지를 위한 @code{__path__} 를 설정합니다.

@node 모듈 repr,캐시된 바이트 코드 무효화,모듈의 __path__ 어트리뷰트,로딩 loading
@anchor{reference/import module-reprs}@anchor{2455}
@subsubsection 모듈 repr


기본적으로, 모든 모듈은 사용할만한 repr 을 갖고 있습니다. 하지만 위의 어트리뷰트들과 모듈 스펙에 있는 것들에 따라, 모듈 객체의 repr 을 좀 더 명시적으로 제어할 수 있습니다.

모듈이 스펙(@code{__spec__})을 가지면, 임포트 절차는 그것으로부터 repr 을 만들려고 시도합니다. 그것이 실패하거나 스펙이 없으면, 임포트 시스템은 모듈에서 제공되는 것들로 기본 repr 을 구성합니다. @code{module.__name__}, @code{module.__file__}, @code{module.__loader__} 을 repr 의 입력으로 사용하려고 시도하는데, 빠진 정보는 기본값으로 채웁니다.

사용되고 있는 정확한 규칙은 이렇습니다:


@itemize *

@item 
모듈이 @code{__spec__} 어트리뷰트를 가지면, 스펙에 있는 정보로 repr 을 생성합니다. “name”, “loader”, “origin”, “has_location” 어트리뷰트들이 사용됩니다.

@item 
모듈이 @code{__file__} 어트리뷰트를 가지면, 모듈의 repr 의 일부로 사용됩니다.

@item 
모듈이 @code{__file__} 어트리뷰트를 갖지 않지만 @code{None} 이 아닌 @code{__loader__} 를 가지면, 로더의 repr 이 모듈의 repr 의 일부로 사용됩니다.

@item 
그렇지 않으면, repr 에 모듈의 @code{__name__} 을 사용합니다.
@end itemize


버전 3.12에서 변경: 파이썬 3.4부터 폐지된 @code{module_repr()}의 사용은 파이썬 3.12에서 제거되었으며, 모듈의 repr을 확인하는 동안 더는 호출되지 않습니다.


@node 캐시된 바이트 코드 무효화,,모듈 repr,로딩 loading
@anchor{reference/import cached-bytecode-invalidation}@anchor{2456}@anchor{reference/import pyc-invalidation}@anchor{801}
@subsubsection 캐시된 바이트 코드 무효화


파이썬이 @code{.pyc} 파일로부터 캐시 된 바이트 코드를 로드하기 전에, 캐시가 최신 버전인지 소스 @code{.py} 파일과 비교합니다. 기본적으로, 파이썬은 소스의 최종 수정 타임스탬프와 크기를 캐시 파일을 만들 때 함께 저장해서 이 작업을 수행합니다. 실행시간에, 임포트 시스템은 캐시 파일에 저장된 메타 데이터를 소스의 메타 데이터와 대조하여 캐시 파일의 유효성을 검사합니다.

파이썬은 또한 “해시 기반” 캐시 파일을 지원하는데, 캐시 파일은 메타 데이터 대신에 소스 파일의 내용 해시를 저장합니다. 해시 기반 @code{.pyc} 파일에는 두 가지 변종이 있습니다: 검사형(checked)과 비검사형(unchecked). 검사형 해시 기반 @code{.pyc} 파일의 경우, 파이썬은 소스 파일을 해시하고 결과 해시를 캐시 파일의 해시와 비교하여 캐시 파일의 유효성을 검사합니다. 검사형 해시 기반 캐시 파일이 유효하지 않은 것으로 판명되면, 파이썬은 캐시 파일을 다시 생성하고 새로운 검사형 해시 기반 캐시 파일을 만듭니다. 비검사형 해시 기반 @code{.pyc} 파일의 경우, 파이썬은 단순히 캐시 파일이 존재할 경우 유효하다고 가정합니다. 해시 기반 @code{.pyc} 파일 유효성 검사 동작은 @ref{211f,,--check-hash-based-pycs} 플래그로 재정의될 수 있습니다.


버전 3.7에서 변경: 해시 기반 @code{.pyc} 파일을 추가했습니다. 이전에는, 파이썬은 바이트 코드 캐시의 타임스탬프 기반 무효화만 지원했습니다.


@node 경로 기반 파인더,표준 임포트 시스템 교체하기,로딩 loading,임포트 시스템
@anchor{reference/import the-path-based-finder}@anchor{2457}
@subsection 경로 기반 파인더


@geindex 경로 기반 파인더

앞에서 언급했듯이, 파이썬은 여러 기본 메타 경로 파인더들을 갖고 있습니다. 이 중 하나는, @ref{244d,,경로 기반 파인더} (@ref{1222,,PathFinder}) 로 불리는데, @ref{2458,,경로 엔트리} 들의 목록을 담고 있는 @ref{244a,,임포트 경로} 를 검색합니다. 각 경로 엔트리는 모듈을 찾을 곳을 가리킵니다.

경로 기반 파인더 자신은 뭔가를 임포트하는 법에 대해서는 아는 것이 없습니다. 대신에, 각 경로 엔트리를 탐색하면서, 각각을 구체적인 경로 엔트리를 다루는 법을 아는 경로 엔트리 파인더와 관련시킵니다.

경로 엔트리 파인더의 기본 집합은 파일 시스템에서 모듈을 찾는데 필요한 모든 개념을 구현하는데, 파이썬 소스 코드(@code{.py} 파일들), 파이썬 바이트 코드(@code{.pyc} 파일들), 공유 라이브러리(예를 들어 @code{.so} 파일들)와 같은 특수 파일형들을 처리합니다. 표준라이브러리의 @ref{138,,zipimport} 모듈의 지원을 받으면, 기본 경로 엔트리 파인더는 이 모든 파일(공유 라이브러리를 제외한 것들)을 zip 파일들로부터 로딩합니다.

경로 엔트리가 파일 시스템의 위치로 제한될 필요는 없습니다. URL이나 데이터베이스 조회나 문자열로 지정될 수 있는 어떤 위치도 가능합니다.

경로 기반 파인더는 검색 가능한 경로 엔트리의 유형을 확장하고 커스터마이즈할 수 있도록 하는 추가의 훅과 프로토콜을 제공합니다. 예를 들어, 네트워크 URL을 경로 엔트리로 지원하고 싶다면, 웹에서 모듈을 찾는 HTTP 개념을 구현하는 훅을 작성할 수 있습니다. 이 훅 (콜러블)은 아래에서 설명하는 프로토콜을 지원하는 @ref{1270,,경로 엔트리 파인더} 를 돌려주는데, 웹에 있는 모듈을 위한 로더를 얻는 데 사용됩니다.

경고의 글: 이 섹션과 앞에 나온 것들은 모두 파인더라는 용어를 사용하는데, @ref{126f,,메타 경로 파인더} 와 @ref{1270,,경로 엔트리 파인더} 라는 용어를 사용해서 구분합니다. 이 두 종류의 파인더는 매우 유사해서 비슷한 프로토콜을 지원하고 임포트 절차에서 비슷한 방식으로 기능합니다. 하지만 이것들이 미묘하게 다르다는 것을 기억하는 것이 중요합니다. 특히, 메타 경로 파인더는 임포트 절차의 처음에 개입하는데, @ref{f26,,sys.meta_path} 탐색을 통해 들어옵니다.

반면에, 경로 엔트리 파인더는 경로 기반 파인더의 구현 상세인데, 사실 경로 기반 파인더가 @ref{f26,,sys.meta_path} 로 부터 제거되면, 경로 엔트리 파인더의 개념은 일절 호출되지 않습니다.

@menu
* 경로 엔트리 파인더:: 
* 경로 엔트리 파인더 프로토콜:: 

@end menu

@node 경로 엔트리 파인더,경로 엔트리 파인더 프로토콜,,경로 기반 파인더
@anchor{reference/import path-entry-finders}@anchor{2459}
@subsubsection 경로 엔트리 파인더


@geindex sys.path
@geindex sys.path_hooks
@geindex sys.path_importer_cache
@geindex PYTHONPATH

@ref{244d,,경로 기반 파인더} 는 위치가 문자열 @ref{2458,,경로 엔트리} 로 지정된 파이썬 모듈과 패키지를 찾고 로드하는 책임을 집니다. 대부분의 경로 엔트리는 파일 시스템의 위치를 가리키지만, 이것으로 한정될 필요는 없습니다.

메타 경로 파인더로서, @ref{244d,,경로 기반 파인더} 는 앞에서 설명한 @ref{a68,,find_spec()} 프로토콜을 구현합니다. 하지만 모듈이 @ref{244a,,임포트 경로} 에서 어떻게 발견되고 로드되는지는 커스터마이즈하는데 사용될 수 있는 추가의 훅을 제공합니다.

@ref{244d,,경로 기반 파인더} 는 세 개의 변수를 사용합니다, @ref{3e4,,sys.path}, @ref{1223,,sys.path_hooks}, @ref{7f9,,sys.path_importer_cache}. 패키지 객체의 @code{__path__} 어트리뷰트 또한 사용된다. 이것들은 임포트 절차를 커스터마이즈할 수 있는 추가의 방법을 제공합니다.

@ref{3e4,,sys.path} 는 모듈과 패키지의 검색 위치를 제공하는 문자열의 목록을 포함합니다. 
@geindex PYTHONPATH
@geindex 환경 변수; PYTHONPATH
@ref{121c,,PYTHONPATH} 환경 변수와 여러 가지 설치와 구현 특정 기본값들로부터 초기화됩니다. @code{sys.path} 에 있는 엔트리들은 파일 시스템의 디렉터리와 zip 파일을 가리키고, 그밖에 잠재적으로 모듈 검색에 사용될 수 있는 “장소들”(@ref{cc,,site} 모듈을 보라)을 가리킬 수 있는데, URL이나 데이터베이스 조회 같은 것들입니다. @code{sys.path} 에는 문자열만 있어야 합니다; 다른 모든 형은 무시됩니다.

@ref{244d,,경로 기반 파인더} 는 @ref{126f,,메타 경로 파인더} 이기 때문에, 앞에서 설명했듯이 임포트 절차는 경로 기반 파인더의 @ref{1210,,find_spec()} 메서드를 호출하는 것으로 @ref{244a,,임포트 경로} 검색을 시작합니다. @code{find_spec()} 에 제공되는 @code{path} 인자는 탐색할 문자열 경로들의 리스트입니다 - 보통 패키지 내에서 임포트 하면 패키지의 @code{__path__} 어트리뷰트. @code{path} 인자가 @code{None} 이면, 최상위 임포트를 뜻하고 @ref{3e4,,sys.path} 가 사용됩니다.

경로 기반 파인더는 검색 경로의 모든 엔트리를 탐색하고, 개별 엔트리마다 적절한 @ref{1270,,경로 엔트리 파인더} (@ref{a6f,,PathEntryFinder})를 찾습니다. 이것은 비용이 많이 드는 연산일 수 있으므로(예를 들어, 이 검색을 위해 @cite{stat()} 호출로 인한 부하가 있을 수 있습니다), 경로 기반 파인더는 경로 엔트리를 경로 엔트리 파인더로 매핑하는 캐시를 관리합니다. 이 캐시는 @ref{7f9,,sys.path_importer_cache} 에 유지됩니다 (이름에도 불구하고, 이 캐시는 @ref{2449,,임포터} 객체로 제한되지 않고 실제로는 파인더 객체를 저장합니다). 이런 방법으로, 특정 @ref{2458,,경로 엔트리} 위치의 경로 엔트리 파인더 의 비싼 검색은 오직 한 번만 수행됩니다. 사용자 코드가 @code{sys.path_importer_cache} 의 캐시 엔트리를 삭제해서 경로 기반 파인더가 그 경로 엔트리를 다시 검색하도록 하는 것이 허락됩니다.

경로 엔트리가 캐시에 없으면, 경로 기반 파인더는 @ref{1223,,sys.path_hooks} 에 있는 모든 콜러블들을 탐색합니다. 이 목록의 각 @ref{245a,,경로 엔트리 훅} 은 검색할 경로 엔트리 인자 한 개를 사용해서 호출됩니다. 이 콜러블은 경로 엔트리를 다룰 수 있는 @ref{1270,,경로 엔트리 파인더} 를 돌려주거나, @ref{659,,ImportError} 를 발생시킬 수 있습니다. @code{ImportError} 는 경로 기반 파인더가 어떤 훅이 주어진 @ref{2458,,경로 엔트리} 를 위한 경로 엔트리 파인더 를 발견할 수 없음을 알리는 데 사용합니다. 이 예외는 무시되고 @ref{244a,,임포트 경로} 탐색은 계속됩니다. 훅은 문자열이나 바이트열을 기대해야 합니다; 바이트열의 인코딩은 훅이 결정하고(예를 들어, 파일 시스템 인코딩이나 UTF-8 이나 그 밖의 다른 것일 수 있습니다), 만약 훅이 인자를 디코딩할 수 없으면 @code{ImportError} 를 일으켜야 합니다.

만약 @ref{1223,,sys.path_hooks} 탐색이 아무런 @ref{1270,,경로 엔트리 파인더} 를 돌려주지 못하면, 경로 기반 파인더의 @ref{1210,,find_spec()} 메서드는 @ref{7f9,,sys.path_importer_cache} 에 @code{None} 을 저장하고(이 경로 엔트리를 위한 파인더가 없음을 가리키기 위해), @code{None} 을 돌려줘서 이 @ref{126f,,메타 경로 파인더} 가 모듈을 찾을 수 없음을 알립니다.

만약 @ref{1223,,sys.path_hooks} 에 있는 어느 하나의 @ref{245a,,경로 엔트리 훅} 콜러블이 @ref{1270,,경로 엔트리 파인더} 를 `돌려주면', 파인더에 모듈 스펙을 요청하기 위해 다음에 나오는 프로토콜이 사용됩니다. 모듈 스펙은 모듈을 로딩할 때 사용됩니다.

The current working directory – denoted by an empty string – is handled
slightly differently from other entries on @ref{3e4,,sys.path}. First, if the
current working directory cannot be determined or is found not to exist, no
value is stored in @ref{7f9,,sys.path_importer_cache}. Second, the value for the
current working directory is looked up fresh for each module lookup. Third,
the path used for @code{sys.path_importer_cache} and returned by
@ref{1210,,importlib.machinery.PathFinder.find_spec()} will be the actual current
working directory and not the empty string.

@node 경로 엔트리 파인더 프로토콜,,경로 엔트리 파인더,경로 기반 파인더
@anchor{reference/import path-entry-finder-protocol}@anchor{245b}
@subsubsection 경로 엔트리 파인더 프로토콜


모듈과 초기화된 패키지의 임포트를 지원하고 이름 공간 패키지에 포션으로 이바지하기 위해, 경로 엔트리 파인더는 @ref{a6c,,find_spec()} 메서드를 구현해야 합니다.

@ref{a6c,,find_spec()} 은 두 개의 인자를 받아들입니다: 임포트 할 모듈의 완전히 정규화된 이름과 (생략 가능한) 타깃 모듈. @code{find_spec()} 은 값이 완전히 채워진 모듈의 스펙을 돌려줍니다. 이 스펙은 항상 “loader” 가 설정됩니다(한가지 예외가 있습니다).

스펙이 이름 공간의 @ref{2444,,포션} 을 표현한다는 것을 임포트 절차에 알리기 위해, 경로 엔트리 파인더는 @code{submodule_search_locations} 를 포션을 포함하는 목록으로 설정합니다.


버전 3.4에서 변경: @ref{a6c,,find_spec()} 이 @code{find_loader()} 와 @code{find_module()} 를 대체하는데, 둘 다 이제 폐지되었습니다, @code{find_spec()} 이 정의되지 않으면 이것들을 사용합니다.

예전의 경로 엔트리 파인더는 @code{find_spec()} 대신에 이 두 개의 폐지된 메서드들을 구현할 수 있습니다. 이 메서드들은 과거 호환성 때문에 아직도 사용됩니다. 하지만, @code{find_spec()} 이 경로 엔트리 파인더에 구현되면, 예전 메서드들은 무시됩니다.

@code{find_loader()} 는 하나의 인자를 받아들입니다, 임포트되는 모듈의 완전히 정규화된 이름. @code{find_loader()} 는 2-튜플을 돌려주는데, 첫 번째 항목은 로더이고 두 번째 항목은 이름 공간 @ref{2444,,포션} 입니다.

임포트 프로토콜의 다른 구현들과의 과거 호환성을 위해, 많은 경로 엔트리 파인더들은 메타 경로 파인더가 지원하는 것과 같고 전통적인 @code{find_module()} 메서드 또한 지원합니다. 하지만 경로 엔트리 파인더 @code{find_module()} 메서드는 결코 @code{path} 인자로 호출되지 않습니다 (그것들은 경로 훅의 최초 호출 때 적절한 경로 정보를 기록해둘 것으로 기대됩니다).

경로 엔트리 파인더의 @code{find_module()} 메서드는 경로 엔트리 파인더가 이름 공간 패키지에 포션으로 이바지하는 것을 허락하지 않기 때문에 폐지되었습니다. 만약 경로 엔트리 파인더에 @code{find_loader()} 와 @code{find_module()} 이 모두 존재하면, 임포트 시스템은 항상 @code{find_module()} 대신 @code{find_loader()} 를 호출합니다.



버전 3.10에서 변경: 임포트 시스템에서 @code{find_module()}과 @code{find_loader()}를 호출하면 @ref{71d,,ImportWarning}을 발생시킵니다.



버전 3.12에서 변경: @code{find_module()}과 @code{find_loader()}를 제거했습니다.


@node 표준 임포트 시스템 교체하기,패키지 상대 임포트,경로 기반 파인더,임포트 시스템
@anchor{reference/import replacing-the-standard-import-system}@anchor{245c}
@subsection 표준 임포트 시스템 교체하기


임포트 시스템 전체를 교체하기 위한 가장 신뢰성 있는 메커니즘은 @ref{f26,,sys.meta_path} 의 기본값들을 모두 삭제하고, 새로 만든 메타 경로 훅들로 채우는 것입니다.

If it is acceptable to only alter the behaviour of import statements
without affecting other APIs that access the import system, then replacing
the builtin @ref{ad1,,__import__()} function may be sufficient.

메타 경로의 앞쪽에 있는 훅에서 어떤 모듈의 임포트를 선택적으로 막으려면(표준 임포트 시스템을 완전히 비활성화하는 대신), @ref{a68,,find_spec()} 에서 @code{None} 을 돌려주는 대신, @ref{d3c,,ModuleNotFoundError} 를 일으키는 것으로 충분합니다. 전자는 메타 경로 검색을 계속해야 한다는 것을 지시하는 반면, 예외를 일으키면 즉시 종료시킵니다.

@node 패키지 상대 임포트,__main__ 에 대한 특별한 고려,표준 임포트 시스템 교체하기,임포트 시스템
@anchor{reference/import package-relative-imports}@anchor{245d}@anchor{reference/import relativeimports}@anchor{245e}
@subsection 패키지 상대 임포트


상대 임포트는 선행 점을 사용합니다. 단일 선행 점은 현재 패키지에서 시작하는 상대 임포트를 나타냅니다. 두 개 이상의 선행 점은 현재 패키지의 부모(들)에 대한 상대 임포트를 나타내며, 첫 번째 점 다음의 점 하나당 하나의 수준을 나타냅니다. 예를 들어, 다음과 같은 패키지 배치가 제공될 때:

@example
package/
    __init__.py
    subpackage1/
        __init__.py
        moduleX.py
        moduleY.py
    subpackage2/
        __init__.py
        moduleZ.py
    moduleA.py
@end example

@code{subpackage1/moduleX.py}나 @code{subpackage1/__init__.py} 모두에서, 다음은 유효한 상대 임포트입니다:

@example
from .moduleY import spam
from .moduleY import spam as ham
from . import moduleY
from ..subpackage1 import moduleY
from ..subpackage2.moduleZ import eggs
from ..moduleA import foo
@end example

절대 임포트는 @code{import <>} 또는 @code{from <> import <>} 문법을 사용할 수 있지만, 상대 임포트는 두 번째 형식만 사용할 수 있습니다; 그 이유는:

@example
import XXX.YYY.ZZZ
@end example

가 @code{XXX.YYY.ZZZ}를 사용할 수 있는 표현식으로 노출하지만, .moduleY는 유효한 표현식이 아니기 때문입니다.

@node __main__ 에 대한 특별한 고려,참고문헌,패키지 상대 임포트,임포트 시스템
@anchor{reference/import import-dunder-main}@anchor{245f}@anchor{reference/import special-considerations-for-main}@anchor{2460}
@subsection __main__ 에 대한 특별한 고려


@ref{1,,__main__} 모듈은 파이썬의 임포트 시스템에서 특별한 경우입니다. @ref{2452,,다른 곳에서} 언급했듯이, @code{__main__} 모듈은 @ref{df,,sys} 와 @ref{13,,builtins} 처럼 인터프리터 시작 때 직접 초기화됩니다. 하지만, 이 두 개와는 다르게, 이것은 엄밀하게 내장 모듈로 취급되지 않습니다. 이것은 @code{__main__} 이 초기화되는 방식이 인터프리터를 실행할 때 주는 플래그와 다른 옵션들에 영향을 받기 때문입니다.

@menu
* __main__.__spec__: __main__ __spec__. 

@end menu

@node __main__ __spec__,,,__main__ 에 대한 특별한 고려
@anchor{reference/import id5}@anchor{2461}@anchor{reference/import main-spec}@anchor{2453}
@subsubsection __main__.__spec__


@ref{1,,__main__} 이 어떻게 초기화되는지에 따라, @code{__main__.__spec__} 은 적절히 설정되기도 하고 @code{None} 으로 설정되기도 합니다.

파이썬이 @ref{23c,,-m} 옵션으로 시작하면, @code{__spec__} 은 해당하는 모듈이나 패키지의 모듈 스팩으로 설정됩니다. 또한 @code{__spec__} 은 @code{__main__} 모듈이 디렉터리나 zip 파일이나 다른 @ref{3e4,,sys.path} 엔트리를 실행하는 일부로 로드될 때 그 내용이 채워집니다.

@ref{2118,,나머지 경우} 에는 @code{__main__.__spec__} 은 @code{None} 으로 설정되는데, @ref{1,,__main__} 을 채우는데 사용된 코드가 임포트 가능한 모듈에 직접 대응하지 않기 때문입니다:


@itemize -

@item 
대화형 프롬프트

@item 
@ref{1a8,,-c} 옵션

@item 
표준 입력으로 실행

@item 
소스 파일이나 바이트 코드 파일로부터 직접 실행
@end itemize

마지막 경우에 @code{__main__.__spec__} 이 항상 @code{None} 임에 주의해야 합니다. 설사 그 파일이 기술적으로 모듈로 임포트 될 수 있어도 그렇습니다. @ref{1,,__main__} 에 올바른 모듈 메타데이터가 필요하다면 @ref{23c,,-m} 스위치를 사용해야 합니다.

또한 @code{__main__} 이 임포트 가능한 모듈에 대응되고, @code{__main__.__spec__} 이 적절히 설정되었다 하더라도, 이 둘은 여전히 `다른' 모듈로 취급됨에 주의해야 합니다. 이것은 @code{if __name__ == "__main__":} 검사로 둘러싸인 블록이 모듈이 @code{__main__} 이름 공간을 채울 때만 실행되고, 일반적인 임포트 때는 실행되지 않는다는 사실 때문입니다.

@node 참고문헌,,__main__ 에 대한 특별한 고려,임포트 시스템
@anchor{reference/import references}@anchor{2462}
@subsection 참고문헌


임포트 절차는 파이썬의 초창기부터 상당히 변해왔습니다. 문서를 작성한 이후에 약간의 세부사항이 변경되었기는 하지만, 최초의 패키지 규격@footnote{https://www.python.org/doc/essays/packages/} 은 아직 읽을 수 있도록 남아있습니다.

@ref{f26,,sys.meta_path} 의 최초 규격은 
@geindex Python 향상 제안; PEP 302
PEP 302@footnote{https://peps.python.org/pep-0302/} 이고, 뒤이은 확장은 
@geindex Python 향상 제안; PEP 420
PEP 420@footnote{https://peps.python.org/pep-0420/} 입니다.

@geindex Python 향상 제안; PEP 420
PEP 420@footnote{https://peps.python.org/pep-0420/} 은 파이썬 3.3 에 @ref{2b2,,이름 공간 패키지} 를 도입했습니다. PEP 420은 @code{find_module()} 의 대안으로 @code{find_loader()} 프로토콜 역시 도입했습니다.

@geindex Python 향상 제안; PEP 366
PEP 366@footnote{https://peps.python.org/pep-0366/} 은 메인 모듈에서의 명시적인 상태 임포트를 위한 @code{__package__} 어트리뷰트의 추가에 관해 설명하고 있습니다.

@geindex Python 향상 제안; PEP 328
PEP 328@footnote{https://peps.python.org/pep-0328/} 은 절대와 명시적인 상대 임포트들 도입하고 
@geindex Python 향상 제안; PEP 366
PEP 366@footnote{https://peps.python.org/pep-0366/} 이 결국 @code{__package__} 를 지정하게 되는 개념을 초기에 @code{__name__} 으로 제안했습니다.

@geindex Python 향상 제안; PEP 338
PEP 338@footnote{https://peps.python.org/pep-0338/} 은 모듈을 스크립트로 실행하는 것을 정의합니다.

@geindex Python 향상 제안; PEP 451
PEP 451@footnote{https://peps.python.org/pep-0451/} 은 스팩 객체에 모듈별 임포트 상태를 요약하는 것을 추가합니다. 로더들에 주어졌던 대부분의 공통 코드 책임들을 임포트 절차로 옮기기도 했습니다. 이 변경은 임포트 시스템의 여러 API 들을 폐지하도록 만들었고, 파인더와 로더에 새 메서드들을 추가하기도 했습니다.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 표현식,단순문 Simple statements,임포트 시스템,파이썬 언어 레퍼런스
@anchor{reference/expressions doc}@anchor{2463}@anchor{reference/expressions expressions}@anchor{2324}@anchor{reference/expressions id1}@anchor{2464}@anchor{reference/expressions translation-repo}@anchor{2465}
@section 표현식


@geindex expression
@geindex BNF

이 장은 파이썬에서 사용되는 표현식 요소들의 의미를 설명합니다.

`Syntax Notes:' In this and the following chapters,
@ref{2281,,grammar notation} will be used to describe syntax,
not lexical analysis.

When (one alternative of) a syntax rule has the form:

@example
@anchor{reference/expressions grammar-token-python-grammar-name}@anchor{2466}name: othername
@end example

뜻(semantics)을 주지 않으면, 이 형태의 @code{name} 의 뜻은 @code{othername} 과 같습니다.

@menu
* 산술 변환:: 
* 아톰 (Atoms): 아톰 Atoms. 
* 프라이머리:: 
* 어웨이트 표현식:: 
* 거듭제곱 연산자:: 
* 일 항 산술과 비트 연산:: 
* 이항 산술 연산:: 
* 시프트 연산:: 
* 이항 비트 연산:: 
* 비교:: 
* 논리 연산(Boolean operations): 논리 연산 Boolean operations. 
* 대입 표현식: 대입 표현식<2>. 
* 조건 표현식(Conditional expressions): 조건 표현식 Conditional expressions. 
* 람다(Lambdas): 람다 Lambdas. 
* 표현식 목록(Expression lists): 표현식 목록 Expression lists. 
* 값을 구하는 순서:: 
* 연산자 우선순위:: 

@end menu

@node 산술 변환,아톰 Atoms,,표현식
@anchor{reference/expressions arithmetic-conversions}@anchor{2467}@anchor{reference/expressions conversions}@anchor{2468}
@subsection 산술 변환


@geindex arithmetic;conversion

When a description of an arithmetic operator below uses the phrase “the numeric
arguments are converted to a common real type”, this means that the operator
implementation for built-in numeric types works as described in the
@ref{2469,,Numeric Types} section of the standard
library documentation.

Some additional rules apply for certain operators and non-numeric operands
(for example, a string as a left argument to the @code{%} operator).
Extensions must define their own conversion behavior.

@node 아톰 Atoms,프라이머리,산술 변환,표현식
@anchor{reference/expressions atoms}@anchor{246a}@anchor{reference/expressions id2}@anchor{246b}
@subsection 아톰 (Atoms)


@geindex atom

Atoms are the most basic elements of expressions.
The simplest atoms are @ref{229d,,names} or literals.
Forms enclosed in parentheses, brackets or braces are also categorized
syntactically as atoms.

Formally, the syntax for atoms is:

@example
@anchor{reference/expressions grammar-token-python-grammar-atom}@anchor{246c}atom:
   | 'True'
   | 'False'
   | 'None'
   | '...'
   | @ref{22be,,identifier}
   | @ref{246d,,literal}
   | @ref{246e,,enclosure}
@anchor{reference/expressions grammar-token-python-grammar-enclosure}@anchor{246e}enclosure:
   | @ref{246f,,parenth_form}
   | @ref{2470,,list_display}
   | @ref{2471,,dict_display}
   | @ref{2472,,set_display}
   | @ref{2473,,generator_expression}
   | @ref{2474,,yield_atom}
@end example

@menu
* Built-in constants:: 
* 식별자 (이름): 식별자 이름. 
* 리터럴 (Literals): 리터럴 Literals. 
* 괄호 안에 넣은 형:: 
* 리스트@comma{} 집합@comma{} 딕셔너리의 디스플레이(display): 리스트 집합 딕셔너리의 디스플레이 display. 
* 리스트 디스플레이:: 
* 집합 디스플레이:: 
* 딕셔너리 디스플레이:: 
* 제너레이터 표현식 (Generator expressions): 제너레이터 표현식 Generator expressions. 
* 일드 표현식(Yield expressions): 일드 표현식 Yield expressions. 

@end menu

@node Built-in constants,식별자 이름,,아톰 Atoms
@anchor{reference/expressions atom-singletons}@anchor{2475}@anchor{reference/expressions built-in-constants}@anchor{2476}
@subsubsection Built-in constants


The keywords @code{True}, @code{False}, and @code{None} name
@ref{2477,,built-in constants}.
The token @code{...} names the @ref{2325,,Ellipsis} constant.

Evaluation of these atoms yields the corresponding value.

@cartouche
@quotation 참고 
Several more built-in constants are available as global variables,
but only the ones mentioned here are @ref{2286,,keywords}.
In particular, these names cannot be reassigned or used as attributes:

@example
>>> False = 123
  File "<input>", line 1
   False = 123
   ^^^^^
SyntaxError: cannot assign to False
@end example
@end quotation
@end cartouche

@node 식별자 이름,리터럴 Literals,Built-in constants,아톰 Atoms
@anchor{reference/expressions atom-identifiers}@anchor{22c3}@anchor{reference/expressions identifiers-names}@anchor{2478}
@subsubsection 식별자 (이름)


@geindex name
@geindex identifier

아톰으로 등장하는 식별자는 이름입니다. 어휘 정의에 대해서는 @ref{229d,,Names (identifiers and keywords)} 섹션을, 이름과 연결에 대한 문서는 @ref{2343,,이름과 연결(binding)} 섹션을 보세요.

@geindex exception;NameError

이름이 객체에 연결될 때, 아톰의 값을 구하면 객체가 나옵니다. 이름이 연결되지 않았을 때, 값을 구하려고 하면 @ref{452,,NameError} 예외가 일어납니다.

@geindex name;mangling
@geindex private;names
@anchor{reference/expressions private-name-mangling}@anchor{20a1}
@menu
* Private name mangling:: 

@end menu

@node Private name mangling,,,식별자 이름
@anchor{reference/expressions id3}@anchor{2479}
@subsubsection Private name mangling


When an identifier that textually occurs in a class definition begins with two
or more underscore characters and does not end in two or more underscores, it
is considered a `private name' of that class.


@subsubheading 더 보기


The @ref{14dc,,class specifications}.


More precisely, private names are transformed to a longer form before code is
generated for them.  If the transformed name is longer than 255 characters,
implementation-defined truncation may happen.

The transformation is independent of the syntactical context in which the
identifier is used but only the following private identifiers are mangled:


@itemize -

@item 
Any name used as the name of a variable that is assigned or read or any
name of an attribute being accessed.

The @ref{1265,,__name__} attribute of nested functions, classes, and
type aliases is however not mangled.

@item 
The name of imported modules, e.g., @code{__spam} in @code{import __spam}.
If the module is part of a package (i.e., its name contains a dot),
the name is `not' mangled, e.g., the @code{__foo} in @code{import __foo.bar}
is not mangled.

@item 
The name of an imported member, e.g., @code{__f} in @code{from spam import __f}.
@end itemize

The transformation rule is defined as follows:


@itemize -

@item 
The class name, with leading underscores removed and a single leading
underscore inserted, is inserted in front of the identifier, e.g., the
identifier @code{__spam} occurring in a class named @code{Foo}, @code{_Foo} or
@code{__Foo} is transformed to @code{_Foo__spam}.

@item 
If the class name consists only of underscores, the transformation is the
identity, e.g., the identifier @code{__spam} occurring in a class named @code{_}
or @code{__} is left as is.
@end itemize

@node 리터럴 Literals,괄호 안에 넣은 형,식별자 이름,아톰 Atoms
@anchor{reference/expressions atom-literals}@anchor{247a}@anchor{reference/expressions literals}@anchor{247b}
@subsubsection 리터럴 (Literals)


@geindex literal

A `literal' is a textual representation of a value.
Python supports numeric, string and bytes literals.
@ref{19a,,Format strings} and @ref{17fd,,template strings}
are treated as string literals.

Numeric literals consist of a single @ref{2303,,NUMBER}
token, which names an integer, floating-point number, or an imaginary number.
See the @ref{229e,,숫자 리터럴} section in Lexical analysis documentation for details.

String and bytes literals may consist of several tokens.
See section @ref{22dd,,String literal concatenation} for details.

Note that negative and complex numbers, like @code{-3} or @code{3+4.2j},
are syntactically not literals, but @ref{247c,,unary} or
@ref{247d,,binary} arithmetic operations involving the @code{-} or @code{+}
operator.

Evaluation of a literal yields an object of the given type
(@ref{19b,,int}, @ref{196,,float}, @ref{197,,complex}, @ref{169,,str},
@ref{192,,bytes}, or @ref{16a,,Template}) with the given value.
The value may be approximated in the case of floating-point
and imaginary literals.

The formal grammar for literals is:

@example
@anchor{reference/expressions grammar-token-python-grammar-literal}@anchor{246d}literal: @ref{247e,,strings} | @ref{2303,,NUMBER}
@end example

@geindex immutable;data;type
@geindex immutable;object

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

@end menu

@node Literals and object identity,String literal concatenation,,리터럴 Literals
@anchor{reference/expressions literals-and-object-identity}@anchor{247f}
@subsubsection Literals and object identity


모든 리터럴은 불변 데이터형에 대응하기 때문에, 객체의 아이덴티티는 값 보다 덜 중요합니다. 같은 값의 리터럴에 대해 반복적으로 값을 구하면 (프로그램 텍스트의 같은 장소에 있거나 다른 장소에 있을 때) 같은 객체를 얻을 수도 있고, 같은 값의 다른 객체를 얻을 수도 있습니다.

@cartouche
@quotation CPython implementation detail 
For example, in CPython, `small' integers with the same value evaluate
to the same object:

@example
>>> x = 7
>>> y = 7
>>> x is y
True
@end example

However, large integers evaluate to different objects:

@example
>>> x = 123456789
>>> y = 123456789
>>> x is y
False
@end example

This behavior may change in future versions of CPython.
In particular, the boundary between “small” and “large” integers has
already changed in the past.

CPython will emit a @ref{1ae,,SyntaxWarning} when you compare literals
using @code{is}:

@example
>>> x = 7
>>> x is 7
<input>:1: SyntaxWarning: "is" with 'int' literal. Did you mean "=="?
True
@end example

See @ref{2480,,is 연산자를 사용한 아이덴티티 검사는 언제 신뢰할 수 있습니까?} for more information.
@end quotation
@end cartouche

@ref{17fd,,Template strings} are immutable but may reference mutable
objects as @ref{16b,,Interpolation} values.
For the purposes of this section, two t-strings have the “same value” if
both their structure and the `identity' of the values match.

`CPython 구현 상세:' Currently, each evaluation of a template string results in
a different object.

@node String literal concatenation,,Literals and object identity,리터럴 Literals
@anchor{reference/expressions string-concatenation}@anchor{22dd}@anchor{reference/expressions string-literal-concatenation}@anchor{2481}
@subsubsection String literal concatenation


Multiple adjacent string or bytes literals, possibly
using different quoting conventions, are allowed, and their meaning is the same
as their concatenation:

@example
>>> "hello" 'world'
"helloworld"
@end example

This feature is defined at the syntactical level, so it only works with literals.
To concatenate string expressions at run time, the ‘+’ operator may be used:

@example
>>> greeting = "Hello"
>>> space = " "
>>> name = "Blaise"
>>> print(greeting + space + name)   # not: print(greeting space name)
Hello Blaise
@end example

Literal concatenation can freely mix raw strings, triple-quoted strings,
and formatted string literals.
For example:

@example
>>> "Hello" r', ' f"@{name@}!"
"Hello, Blaise!"
@end example

This feature can be used to reduce the number of backslashes
needed, to split long strings conveniently across long lines, or even to add
comments to parts of strings. For example:

@example
re.compile("[A-Za-z_]"       # letter or underscore
           "[A-Za-z0-9_]*"   # letter, digit or underscore
          )
@end example

However, bytes literals may only be combined with other byte literals;
not with string literals of any kind.
Also, template string literals may only be combined with other template
string literals:

@example
>>> t"Hello" t"@{name@}!"
Template(strings=('Hello', '!'), interpolations=(...))
@end example

Formally:

@example
@anchor{reference/expressions grammar-token-python-grammar-strings}@anchor{247e}strings: (@ref{22ce,,STRING} | @ref{22f1,,fstring})+ | @ref{2301,,tstring}+
@end example

@node 괄호 안에 넣은 형,리스트 집합 딕셔너리의 디스플레이 display,리터럴 Literals,아톰 Atoms
@anchor{reference/expressions parenthesized}@anchor{2482}@anchor{reference/expressions parenthesized-forms}@anchor{2483}
@subsubsection 괄호 안에 넣은 형


@geindex parenthesized form
@geindex () (parentheses);tuple display

괄호 안에 넣은 형은, 괄호로 둘러싸인 생략 가능한 표현식 목록입니다:

@example
@anchor{reference/expressions grammar-token-python-grammar-parenth_form}@anchor{246f}parenth_form: "(" [@ref{2484,,starred_expression}] ")"
@end example

괄호 안에 넣은 표현식 목록은, 무엇이건 그 표현식 목록이 산출하는 것이 됩니다: 목록이 적어도 하나의 쉼표를 포함하면, 튜플이 됩니다; 그렇지 않으면 표현식 목록을 구성한 단일 표현식이 됩니다.

@geindex empty;tuple

빈 괄호 쌍은 빈 튜플 객체를 만듭니다. 튜플은 불변이기 때문에 리터럴에서와 같은 규칙이 적용됩니다 (즉, 두 개의 빈 튜플은 같은 객체일 수도 있고 그렇지 않을 수도 있습니다).

@geindex comma
@geindex @comma{} (comma)

Note that tuples are not formed by the parentheses, but rather by use of the
comma.  The exception is the empty tuple, for which parentheses `are'
required — allowing unparenthesized “nothing” in expressions would cause
ambiguities and allow common typos to pass uncaught.

@node 리스트 집합 딕셔너리의 디스플레이 display,리스트 디스플레이,괄호 안에 넣은 형,아톰 Atoms
@anchor{reference/expressions comprehensions}@anchor{7eb}@anchor{reference/expressions displays-for-lists-sets-and-dictionaries}@anchor{2485}
@subsubsection 리스트, 집합, 딕셔너리의 디스플레이(display)


@geindex comprehensions

리스트, 집합, 딕셔너리를 구성하기 위해, 파이썬은 “디스플레이(displays)”라고 부르는 특별한 문법을 각기 두 가지 스타일로 제공합니다:


@itemize *

@item 
컨테이너의 내용을 명시적으로 나열하거나,

@item 
일련의 루프와 필터링 지시들을 통해 계산되는데, `컴프리헨션 (comprehension)' 이라고 불립니다.
@end itemize

@geindex for;in comprehensions
@geindex if;in comprehensions
@geindex async for;in comprehensions

컴프리헨션의 공통 문법 요소들은 이렇습니다:

@example
@anchor{reference/expressions grammar-token-python-grammar-comprehension}@anchor{2486}comprehension: @ref{242e,,assignment_expression} @ref{2487,,comp_for}
@anchor{reference/expressions grammar-token-python-grammar-comp_for}@anchor{2487}comp_for:      ["async"] "for" @ref{2488,,target_list} "in" @ref{2489,,or_test} [@ref{248a,,comp_iter}]
@anchor{reference/expressions grammar-token-python-grammar-comp_iter}@anchor{248a}comp_iter:     @ref{2487,,comp_for} | @ref{248b,,comp_if}
@anchor{reference/expressions grammar-token-python-grammar-comp_if}@anchor{248b}comp_if:       "if" @ref{2489,,or_test} [@ref{248a,,comp_iter}]
@end example

컴프리헨션은 하나의 표현식과 그 뒤를 따르는 최소한 하나의 @code{for} 절과 없거나 여러 개의 @code{for} 또는 @code{if} 절로 구성됩니다. 이 경우, 새 컨테이너의 요소들은 각 @code{for} 또는 @code{if} 절이 왼쪽에서 오른쪽으로 중첩된 블록을 이루고, 가장 안쪽에 있는 블록에서 표현식의 값을 구해서 만들어낸 것들입니다.

하지만, 가장 왼쪽의 @code{for} 절에 있는 이터러블 표현식을 제외하고는, 컴프리헨션은 묵시적으로 중첩된 스코프에서 실행됩니다. 이렇게 해서 @code{target_list} 에서 대입되는 이름이 둘러싸는 스코프로 “누수” 되지 않도록 합니다.

가장 왼쪽의 @code{for} 절의 이터러블 표현식은, 둘러싸는 스코프에서 직접 평가된 다음, 묵시적으로 중첩된 스코프로 인자로 전달됩니다. 뒤따르는 @code{for} 절과 가장 왼쪽 @code{for} 절의 모든 필터 조건은, 가장 왼쪽 이터러블에서 얻은 값에 따라 달라질 수 있으므로 둘러싸는 스코프에서 평가할 수 없습니다. 예를 들면, @code{[x*y for x in range(10) for y in range(x, x+10)]}.

컴프리헨션이 항상 적절한 형의 컨테이너가 되게 하려고, 묵시적으로 중첩된 스코프에서 @code{yield} 와 @code{yield from} 표현식은 금지됩니다.

@geindex await;in comprehensions

Since Python 3.6, in an @ref{7ec,,async def} function, an @code{async for}
clause may be used to iterate over a @ref{4c8,,asynchronous iterator}.
A comprehension in an @code{async def} function may consist of either a
@code{for} or @code{async for} clause following the leading
expression, may contain additional @code{for} or @code{async for}
clauses, and may also use @ref{18d,,await} expressions.

If a comprehension contains @code{async for} clauses, or if it contains
@code{await} expressions or other asynchronous comprehensions anywhere except
the iterable expression in the leftmost @code{for} clause, it is called an
`asynchronous comprehension'. An asynchronous comprehension may suspend the
execution of the coroutine function in which it appears.
See also 
@geindex Python 향상 제안; PEP 530
PEP 530@footnote{https://peps.python.org/pep-0530/}.


Added in version 3.6: 비동기 컴프리헨션이 도입되었습니다.



버전 3.8에서 변경: @code{yield} 와 @code{yield from} 은 묵시적으로 중첩된 스코프에서 금지됩니다.



버전 3.11에서 변경: Asynchronous comprehensions are now allowed inside comprehensions in
asynchronous functions. Outer comprehensions implicitly become
asynchronous.


@node 리스트 디스플레이,집합 디스플레이,리스트 집합 딕셔너리의 디스플레이 display,아톰 Atoms
@anchor{reference/expressions list-displays}@anchor{248c}@anchor{reference/expressions lists}@anchor{248d}
@subsubsection 리스트 디스플레이


@geindex list;display
@geindex list;comprehensions
@geindex empty;list
@geindex object;list
@geindex [] (square brackets);list expression
@geindex @comma{} (comma);expression list

리스트 디스플레이는 대괄호(square brackets)로 둘러싸인 표현식의 나열인데 비어있을 수 있습니다:

@example
@anchor{reference/expressions grammar-token-python-grammar-list_display}@anchor{2470}list_display: "[" [@ref{248e,,flexible_expression_list} | @ref{2486,,comprehension}] "]"
@end example

리스트 디스플레이는 리스트 객체를 만드는데, 그 내용은 표현식의 목록이나 컴프리헨션으로 지정할 수 있습니다. 쉼표로 분리된 표현식의 목록이 제공될 때, 그 요소들은 왼쪽에서 오른쪽으로 값이 구해지고, 그 순서대로 리스트 객체에 삽입됩니다. 컴프리헨션이 제공될 때, 리스트는 컴프리헨션으로 만들어지는 요소들로 구성됩니다.

@node 집합 디스플레이,딕셔너리 디스플레이,리스트 디스플레이,아톰 Atoms
@anchor{reference/expressions set}@anchor{248f}@anchor{reference/expressions set-displays}@anchor{2490}
@subsubsection 집합 디스플레이


@geindex set;display
@geindex set;comprehensions
@geindex object;set
@geindex @{@} (curly brackets);set expression
@geindex @comma{} (comma);expression list

집합 디스플레이는 중괄호(curly braces)로 표시되고, 키와 값을 분리하는 콜론(colon)이 없는 것으로 딕셔너리 디스플레이와 구분될 수 있습니다.

@example
@anchor{reference/expressions grammar-token-python-grammar-set_display}@anchor{2472}set_display: "@{" (@ref{248e,,flexible_expression_list} | @ref{2486,,comprehension}) "@}"
@end example

집합 디스플레이는 새 가변 집합 객체를 만드는데, 그 내용은 표현식의 시퀀스나 컴프리헨션으로 지정됩니다. 쉼표로 분리된 표현식의 목록이 제공될 때, 그 요소들은 왼쪽에서 오른쪽으로 값이 구해지고, 집합 객체에 더해집니다. 컴프리헨션이 제공될 때, 집합은 컴프리헨션으로 만들어지는 요소들로 구성됩니다.

빈 집합은 @code{@{@}} 으로 만들어질 수 없습니다; 이 리터럴은 빈 딕셔너리를 만듭니다.

@node 딕셔너리 디스플레이,제너레이터 표현식 Generator expressions,집합 디스플레이,아톰 Atoms
@anchor{reference/expressions dict}@anchor{f7e}@anchor{reference/expressions dictionary-displays}@anchor{2491}
@subsubsection 딕셔너리 디스플레이


@geindex dictionary;display
@geindex dictionary;comprehensions
@geindex key
@geindex value
@geindex key/value pair
@geindex object;dictionary
@geindex @{@} (curly brackets);dictionary expression
@geindex ; (colon);in dictionary expressions
@geindex @comma{} (comma);in dictionary displays

A dictionary display is a possibly empty series of dict items (key/value pairs)
enclosed in curly braces:

@example
@anchor{reference/expressions grammar-token-python-grammar-dict_display}@anchor{2471}dict_display:       "@{" [@ref{2492,,dict_item_list} | @ref{2493,,dict_comprehension}] "@}"
@anchor{reference/expressions grammar-token-python-grammar-dict_item_list}@anchor{2492}dict_item_list:     @ref{2494,,dict_item} ("," @ref{2494,,dict_item})* [","]
@anchor{reference/expressions grammar-token-python-grammar-dict_item}@anchor{2494}dict_item:          @ref{182,,expression} ":" @ref{182,,expression} | "**" @ref{22ff,,or_expr}
@anchor{reference/expressions grammar-token-python-grammar-dict_comprehension}@anchor{2493}dict_comprehension: @ref{182,,expression} ":" @ref{182,,expression} @ref{2487,,comp_for}
@end example

딕셔너리 디스플레이는 새 딕셔너리 객체를 만듭니다.

If a comma-separated sequence of dict items is given, they are evaluated
from left to right to define the entries of the dictionary: each key object is
used as a key into the dictionary to store the corresponding value.  This means
that you can specify the same key multiple times in the dict item list, and the
final dictionary’s value for that key will be the last one given.

@geindex unpacking;dictionary
@geindex **;in dictionary displays

A double asterisk @code{**} denotes `dictionary unpacking'.
Its operand must be a @ref{13c0,,mapping}.  Each mapping item is added
to the new dictionary.  Later values replace values already set by
earlier dict items and earlier dictionary unpackings.


Added in version 3.5: 
@geindex Python 향상 제안; PEP 448
PEP 448@footnote{https://peps.python.org/pep-0448/} 에서 처음 제안된 딕셔너리 디스플레이로의 언 패킹.


딕셔너리 컴프리헨션은, 리스트와 집합 컴프리헨션에 대비해서, 일반적인 “for” 와 “if” 절 앞에 콜론으로 분리된 두 개의 표현식을 필요로 합니다. 컴프리헨션이 실행될 때, 만들어지는 키와 값 요소들이 만들어지는 순서대로 딕셔너리에 삽입됩니다.

@geindex immutable;object
@geindex hashable

Restrictions on the types of the key values are listed earlier in section
@ref{232c,,표준형 계층}.  (To summarize, the key type should be @ref{823,,hashable}, which excludes
all mutable objects.)  Clashes between duplicate keys are not detected; the last
value (textually rightmost in the display) stored for a given key value
prevails.


버전 3.8에서 변경: 파이썬 3.8 이전에는, 딕셔너리 컴프리헨션에서, 키와 값의 평가 순서가 잘 정의되어 있지 않았습니다. CPython에서, 값이 키보다 먼저 평가되었습니다. 3.8부터는, 
@geindex Python 향상 제안; PEP 572
PEP 572@footnote{https://peps.python.org/pep-0572/}의 제안에 따라 키가 값보다 먼저 평가됩니다.


@node 제너레이터 표현식 Generator expressions,일드 표현식 Yield expressions,딕셔너리 디스플레이,아톰 Atoms
@anchor{reference/expressions generator-expressions}@anchor{2495}@anchor{reference/expressions genexpr}@anchor{2496}
@subsubsection 제너레이터 표현식 (Generator expressions)


@geindex generator;expression
@geindex object;generator
@geindex () (parentheses);generator expression

제너레이터 표현식은 괄호로 둘러싸인 간결한 제너레이터 표기법입니다.

@example
@anchor{reference/expressions grammar-token-python-grammar-generator_expression}@anchor{2473}generator_expression: "(" @ref{182,,expression} @ref{2487,,comp_for} ")"
@end example

제너레이터 표현식은 새 제너레이터 객체를 만듭니다. 문법은 대괄호나 중괄호 대신 괄호로 둘러싸인다는 점만 제외하면 컴프리헨션과 같습니다.

Variables used in the generator expression are evaluated lazily when the
@ref{20ac,,__next__()} method is called for the generator object (in the same
fashion as normal generators).  However, the iterable expression in the
leftmost @code{for} clause is immediately evaluated, and the
@ref{4ca,,iterator} is immediately created for that iterable, so that an error
produced while creating the iterator will be emitted at the point where the generator expression
is defined, rather than at the point where the first value is retrieved.
Subsequent @code{for} clauses and any filter condition in the leftmost
@code{for} clause cannot be evaluated in the enclosing scope as they may
depend on the values obtained from the leftmost iterable. For example:
@code{(x*y for x in range(10) for y in range(x, x+10))}.

단지 하나의 인자만 갖는 호출에서는 괄호를 생략할 수 있습니다. 자세한 내용은 @ref{f7c,,호출} 섹션을 보세요.

제너레이터 표현식 자체의 기대되는 연산을 방해하지 않기 위해, 묵시적으로 정의된 제너레이터에서 @code{yield} 와 @code{yield from} 표현식은 금지됩니다.

제너레이터 표현식이 @code{async for} 절이나 @ref{18d,,await} 표현식을 포함하면 `비동기 제너레이터 표현식 (asynchronous generator expression)' 이라고 불립니다. 비동기 제너레이터 표현식은 새 비동기 제너레이터 객체를 돌려주는데 이것은 비동기 이터레이터입니다 (@ref{f76,,비동기 이터레이터(Asynchronous Iterators)} 를 참조하세요).


Added in version 3.6: 비동기식 제너레이터 표현식이 도입되었습니다.



버전 3.7에서 변경: 파이썬 3.7 이전에는, 비동기 제너레이터 표현식이 @ref{7ec,,async def} 코루틴에만 나타날 수 있었습니다. 3.7부터는, 모든 함수가 비동기식 제너레이터 표현식을 사용할 수 있습니다.



버전 3.8에서 변경: @code{yield} 와 @code{yield from} 은 묵시적으로 중첩된 스코프에서 금지됩니다.


@node 일드 표현식 Yield expressions,,제너레이터 표현식 Generator expressions,아톰 Atoms
@anchor{reference/expressions yield-expressions}@anchor{2497}@anchor{reference/expressions yieldexpr}@anchor{2498}
@subsubsection 일드 표현식(Yield expressions)


@geindex keyword;yield
@geindex keyword;from
@geindex yield;expression
@geindex generator;function

@example
@anchor{reference/expressions grammar-token-python-grammar-yield_atom}@anchor{2474}yield_atom:       "(" @ref{2300,,yield_expression} ")"
@anchor{reference/expressions grammar-token-python-grammar-yield_from}@anchor{2499}yield_from:       "yield" "from" @ref{182,,expression}
@anchor{reference/expressions grammar-token-python-grammar-yield_expression}@anchor{2300}yield_expression: "yield" @ref{249a,,yield_list} | @ref{2499,,yield_from}
@end example

The yield expression is used when defining a @ref{1260,,generator} function
or an @ref{249b,,asynchronous generator} function and
thus can only be used in the body of a function definition.  Using a yield
expression in a function’s body causes that function to be a generator function,
and using it in an @ref{7ec,,async def} function’s body causes that
coroutine function to be an asynchronous generator function. For example:

@example
def gen():  # defines a generator function
    yield 123

async def agen(): # defines an asynchronous generator function
    yield 123
@end example

둘러싸는 스코프에 대한 부작용으로 인해, @code{yield} 표현식은 컴프리헨션과 제너레이터 표현식을 구현하는 데 사용되는 묵시적으로 정의된 스코프에 사용될 수 없습니다.


버전 3.8에서 변경: 일드 표현식은 컴프리헨션과 제너레이터 표현식을 구현하는 데 사용되는 묵시적으로 정의된 스코프에서 금지됩니다.


제너레이터 함수는 다음에서 설명합니다. 반면에 비동기 제너레이터 함수는 @ref{249c,,비동기 제너레이터 함수} 섹션에서 별도로 설명합니다.

When a generator function is called, it returns an iterator known as a
generator.  That generator then controls the execution of the generator
function.  The execution starts when one of the generator’s methods is called.
At that time, the execution proceeds to the first yield expression, where it is
suspended again, returning the value of @ref{249a,,yield_list}
to the generator’s caller,
or @code{None} if @code{yield_list} is omitted.
By suspended, we mean that all local state is
retained, including the current bindings of local variables, the instruction
pointer, the internal evaluation stack, and the state of any exception handling.
When the execution is resumed by calling one of the generator’s methods, the
function can proceed exactly as if the yield expression were just another
external call.  The value of the yield expression after resuming depends on the
method which resumed the execution.  If @ref{20ac,,__next__()} is used
(typically via either a @ref{34a,,for} or the @ref{9d8,,next()} builtin) then the
result is @ref{884,,None}.  Otherwise, if @ref{241a,,send()} is used, then
the result will be the value passed in to that method.

@geindex coroutine

이 모든 것들은 제너레이터 함수를 코루틴과 아주 비슷하게 만듭니다; 여러 번 결과를 만들고, 하나 이상의 진입 지점을 갖고 있으며, 실행이 일시 중지될 수 있습니다. 유일한 차이점은 제너레이터 함수는 yield 한 후에 실행이 어디에서 계속되어야 하는지를 제어할 수 없다는 점입니다; 제어는 항상 제너레이터의 호출자로 전달됩니다.

일드 표현식은 @ref{8f7,,try} 구조물의 어디에서건 허락됩니다. 제너레이터가 (참조 횟수가 0이 되거나 가비지 수거됨으로써) 파이널라이즈(finalize)되기 전에 재개되지 않으면, 제너레이터-이터레이터의 @ref{179b,,close()} 메서드가 호출되어, 대기 중인 @ref{1b0,,finally} 절이 실행되도록 허락합니다.

@geindex from;yield from expression

@code{yield from <expr>} 이 사용될 때, 제공된 표현식은 어터러블이어야 합니다. 그 이터러블을 이터레이트 해서 생성되는 값들은 현재 제너레이터 메서드의 호출자에게 바로 전달됩니다. @ref{241a,,send()} 로 전달된 모든 값과 @ref{71b,,throw()} 로 전달된 모든 예외는 밑에 있는(underlying) 이터레이터가 해당 메서드를 갖고 있다면 그곳으로 전달됩니다. 그렇지 않다면, @code{send()} 는 @ref{5ee,,AttributeError} 나 @ref{198,,TypeError} 를 일으키지만, @code{throw()} 는 전달된 예외를 즉시 일으킨다.

밑에 있는 이러레이터가 완료될 때, 발생하는 @ref{df4,,StopIteration} 인스턴스의 @ref{2417,,value} 어트리뷰트는 일드 표현식의 값이 됩니다. @code{StopIteration} 를 일으킬 때 명시적으로 설정되거나, 서브 이터레이터가 제너레이터일 경우는 자동으로 이루어집니다 (서브 제너레이터가 값을 돌려(return)줌으로써).


버전 3.3에서 변경: 서브 이터레이터로 제어 흐름을 위임하는 @code{yield from <expr>} 를 추가했습니다.


일드 표현식이 대입문의 우변에 홀로 나온다면 괄호를 생략할 수 있습니다.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 255

@item PEP 255@footnote{https://peps.python.org/pep-0255/} - 간단한 제너레이터

파이썬에 제너레이터와 @ref{bc1,,yield} 문을 추가하는 제안.

@geindex Python 향상 제안; PEP 342

@item PEP 342@footnote{https://peps.python.org/pep-0342/} - 개선된 제너레이터를 통한 코루틴

제너레이터의 API와 문법을 개선해서, 간단한 코루틴으로 사용할 수 있도록 만드는 제안.

@geindex Python 향상 제안; PEP 380

@item PEP 380@footnote{https://peps.python.org/pep-0380/} - 서브 제너레이터로 위임하는 문법

The proposal to introduce the @ref{2499,,yield_from} syntax,
making delegation to subgenerators easy.

@geindex Python 향상 제안; PEP 525

@item PEP 525@footnote{https://peps.python.org/pep-0525/} - 비동기 제너레이터

코루틴 함수에 제너레이터 기능을 추가하여 
@geindex Python 향상 제안; PEP 492
PEP 492@footnote{https://peps.python.org/pep-0492/}을 확장한 제안.
@end table


@geindex object;generator

@menu
* 제너레이터-이터레이터 메서드:: 
* 사용 예:: 
* 비동기 제너레이터 함수:: 
* 비동기 제너레이터-이터레이터 메서드:: 

@end menu

@node 제너레이터-이터레이터 메서드,사용 예,,일드 표현식 Yield expressions
@anchor{reference/expressions generator-iterator-methods}@anchor{249d}@anchor{reference/expressions generator-methods}@anchor{2418}
@subsubsection 제너레이터-이터레이터 메서드


이 서브섹션은 제너레이터 이터레이터의 메서드들을 설명합니다. 제너레이터 함수의 실행을 제어하는데 사용될 수 있습니다.

제너레이터가 이미 실행 중일 때 아래에 나오는 메서드들을 호출하면 @ref{2ec,,ValueError} 예외를 일으키는 것에 주의해야 합니다.

@geindex exception;StopIteration

@geindex __next__() (generator 메서드)
@anchor{reference/expressions generator __next__}@anchor{20ac}
@deffn {메서드} generator.__next__ ()

Starts the execution of a generator function or resumes it at the last
executed yield expression.  When a generator function is resumed with a
@ref{20ac,,__next__()} method, the current yield expression always
evaluates to @ref{884,,None}.  The execution then continues to the next yield
expression, where the generator is suspended again, and the value of the
@ref{249a,,yield_list} is returned to @ref{20ac,,__next__()}’s
caller.  If the generator exits without yielding another value, a
@ref{df4,,StopIteration} exception is raised.

이 메서드는 보통 묵시적으로 호출됩니다, 예를 들어, @ref{34a,,for} 루프나 내장 @ref{9d8,,next()} 함수에 의해.
@end deffn

@geindex send() (generator 메서드)
@anchor{reference/expressions generator send}@anchor{241a}
@deffn {메서드} generator.send (value)

실행을 재개하고 제너레이터 함수로 값을 “보냅니다(send)”. `value' 인자는 현재 일드 표현식의 값이 됩니다. @ref{241a,,send()} 메서드는 제너레이터가 yield 하는 다음 값을 돌려주거나, 제너레이터가 다른 값을 yield 하지 않고 종료하면 @ref{df4,,StopIteration} 을 일으킵니다. @code{send()} 가 제너레이터를 시작시키도록 호출될 때, 값을 받을 일드 표현식이 없으므로, 인자로는 반드시 @ref{884,,None} 을 전달해야 합니다.
@end deffn

@geindex throw() (generator 메서드)
@anchor{reference/expressions generator throw}@anchor{71b}
@deffn {메서드} generator.throw (value)

@deffnx {메서드} generator.throw (type[, value[, traceback]])

Raises an exception at the point where the generator was paused,
and returns the next value yielded by the generator function.  If the generator
exits without yielding another value, a @ref{df4,,StopIteration} exception is
raised.  If the generator function does not catch the passed-in exception, or
raises a different exception, then that exception propagates to the caller.

In typical use, this is called with a single exception instance similar to the
way the @ref{802,,raise} keyword is used.

For backwards compatibility, however, the second signature is
supported, following a convention from older versions of Python.
The `type' argument should be an exception class, and `value'
should be an exception instance. If the `value' is not provided, the
`type' constructor is called to get an instance. If `traceback'
is provided, it is set on the exception, otherwise any existing
@ref{14cb,,__traceback__} attribute stored in `value' may
be cleared.


버전 3.12에서 변경: The second signature (type[, value[, traceback]]) is deprecated and
may be removed in a future version of Python.

@end deffn

@geindex exception;GeneratorExit

@geindex close() (generator 메서드)
@anchor{reference/expressions generator close}@anchor{179b}
@deffn {메서드} generator.close ()

Raises a @ref{15cc,,GeneratorExit} exception at the point where the generator
function was paused (equivalent to calling @code{throw(GeneratorExit)}).
The exception is raised by the yield expression where the generator was paused.
If the generator function catches the exception and returns a
value, this value is returned from @code{close()}.  If the generator function
is already closed, or raises @code{GeneratorExit} (by not catching the
exception), @code{close()} returns @ref{884,,None}.  If the generator yields a
value, a @ref{244,,RuntimeError} is raised.  If the generator raises any other
exception, it is propagated to the caller.  If the generator has already
exited due to an exception or normal exit, @code{close()} returns
@code{None} and has no other effect.


버전 3.13에서 변경: If a generator returns a value upon being closed, the value is returned
by @code{close()}.

@end deffn

@geindex yield;examples

@node 사용 예,비동기 제너레이터 함수,제너레이터-이터레이터 메서드,일드 표현식 Yield expressions
@anchor{reference/expressions examples}@anchor{249e}
@subsubsection 사용 예


여기에 제너레이터와 제너레이터 함수의 동작을 시연하는 간단한 예가 있습니다:

@example
>>> def echo(value=None):
...     print("Execution starts when 'next()' is called for the first time.")
...     try:
...         while True:
...             try:
...                 value = (yield value)
...             except Exception as e:
...                 value = e
...     finally:
...         print("Don't forget to clean up when 'close()' is called.")
...
>>> generator = echo(1)
>>> print(next(generator))
Execution starts when 'next()' is called for the first time.
1
>>> print(next(generator))
None
>>> print(generator.send(2))
2
>>> generator.throw(TypeError, "spam")
TypeError('spam',)
>>> generator.close()
Don't forget to clean up when 'close()' is called.
@end example

@code{yield from} 을 사용하는 예는, “What’s New in Python.” 에 있는 @ref{1239,,PEP 380; Syntax for Delegating to a Subgenerator} 을 보세요.

@node 비동기 제너레이터 함수,비동기 제너레이터-이터레이터 메서드,사용 예,일드 표현식 Yield expressions
@anchor{reference/expressions asynchronous-generator-functions}@anchor{249c}@anchor{reference/expressions id4}@anchor{249f}
@subsubsection 비동기 제너레이터 함수


@ref{7ec,,async def} 를 사용한 함수나 메서드에서 일드 표현식의 존재는 그 함수를 @ref{249b,,비동기 제너레이터} 함수로 정의합니다.

비동기 제너레이터 함수가 호출되면, 비동기 제너레이터 객체로 알려진 비동기 이터레이터를 돌려줍니다. 그런 다음 그 객체는 제너레이터 함수의 실행을 제어합니다. 비동기 제너레이터 객체는 보통 코루틴 함수의 @ref{c9f,,async for} 문에서 사용되는데, 제너레이터 객체가 @ref{34a,,for} 문에서 사용되는 방식과 유사합니다.

Calling one of the asynchronous generator’s methods returns an @ref{4c9,,awaitable}
object, and the execution starts when this object is awaited on. At that time,
the execution proceeds to the first yield expression, where it is suspended
again, returning the value of @ref{249a,,yield_list} to the
awaiting coroutine. As with a generator, suspension means that all local state
is retained, including the current bindings of local variables, the instruction
pointer, the internal evaluation stack, and the state of any exception handling.
When the execution is resumed by awaiting on the next object returned by the
asynchronous generator’s methods, the function can proceed exactly as if the
yield expression were just another external call. The value of the yield
expression after resuming depends on the method which resumed the execution.  If
@ref{24a0,,__anext__()} is used then the result is @ref{884,,None}. Otherwise, if
@ref{ad6,,asend()} is used, then the result will be the value passed in to that
method.

If an asynchronous generator happens to exit early by @ref{17f,,break}, the caller
task being cancelled, or other exceptions, the generator’s async cleanup code
will run and possibly raise exceptions or access context variables in an
unexpected context–perhaps after the lifetime of tasks it depends, or
during the event loop shutdown when the async-generator garbage collection hook
is called.
To prevent this, the caller must explicitly close the async generator by calling
@ref{ad5,,aclose()} method to finalize the generator and ultimately detach it
from the event loop.

비동기 제너레이터 함수에서, 일드 표현식은 @ref{8f7,,try} 구조물의 어디에서건 허락됩니다. 하지만, 비동기 제너레이터가 (참조 횟수가 0이 되거나 가비지 수거됨으로써) 파이널라이즈(finalize)되기 전에 재개되지 않으면, @code{try} 구조물 내의 일드 표현식은 대기 중인 @ref{1b0,,finally} 절을 실행하는 데 실패할 수 있습니다. 이 경우에, 비동기 제너레이터-이터레이터의 @ref{ad5,,aclose()} 를 호출하고, 그 결과로 오는 코루틴 객체를 실행해서, 대기 중인 @code{finally} 절이 실행되도록 하는 책임은, 비동기 제너레이터를 실행하는 이벤트 루프(event loop)나 스케줄러(scheduler)에게 있습니다.

To take care of finalization upon event loop termination, an event loop should
define a `finalizer' function which takes an asynchronous generator-iterator and
presumably calls @ref{ad5,,aclose()} and executes the coroutine.
This  `finalizer' may be registered by calling @ref{199e,,sys.set_asyncgen_hooks()}.
When first iterated over, an asynchronous generator-iterator will store the
registered `finalizer' to be called upon finalization. For a reference example
of a `finalizer' method see the implementation of
@code{asyncio.Loop.shutdown_asyncgens} in Lib/asyncio/base_events.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/asyncio/base_events.py}.

표현식 @code{yield from <expr>} 를 비동기 제너레이터 함수에서 사용하는 것은 문법 에러다.

@geindex object;asynchronous-generator

@node 비동기 제너레이터-이터레이터 메서드,,비동기 제너레이터 함수,일드 표현식 Yield expressions
@anchor{reference/expressions asynchronous-generator-iterator-methods}@anchor{24a1}@anchor{reference/expressions asynchronous-generator-methods}@anchor{24a2}
@subsubsection 비동기 제너레이터-이터레이터 메서드


이 서브섹션은 비동기 제너레이터 이터레이터의 메서드를 설명하는데, 제너레이터 함수의 실행을 제어하는 데 사용됩니다.

@geindex exception;StopAsyncIteration

@geindex __anext__() (agen 메서드)
@anchor{reference/expressions agen __anext__}@anchor{24a0}
@deffn {메서드} async agen.__anext__ ()

Returns an awaitable which when run starts to execute the asynchronous
generator or resumes it at the last executed yield expression.  When an
asynchronous generator function is resumed with an @ref{24a0,,__anext__()}
method, the current yield expression always evaluates to @ref{884,,None} in the
returned awaitable, which when run will continue to the next yield
expression. The value of the @ref{249a,,yield_list} of the
yield expression is the value of the @ref{df4,,StopIteration} exception raised by
the completing coroutine.  If the asynchronous generator exits without
yielding another value, the awaitable instead raises a
@ref{1e0c,,StopAsyncIteration} exception, signalling that the asynchronous
iteration has completed.

이 메서드는 보통 @ref{c9f,,async for} 루프에 의해 묵시적으로 호출됩니다.
@end deffn

@geindex asend() (agen 메서드)
@anchor{reference/expressions agen asend}@anchor{ad6}
@deffn {메서드} async agen.asend (value)

Returns an awaitable which when run resumes the execution of the
asynchronous generator. As with the @ref{241a,,send()} method for a
generator, this “sends” a value into the asynchronous generator function,
and the `value' argument becomes the result of the current yield expression.
The awaitable returned by the @code{asend()} method will return the next
value yielded by the generator as the value of the raised
@ref{df4,,StopIteration}, or raises @ref{1e0c,,StopAsyncIteration} if the
asynchronous generator exits without yielding another value.  When
@code{asend()} is called to start the asynchronous
generator, it must be called with @ref{884,,None} as the argument,
because there is no yield expression that could receive the value.
@end deffn

@geindex athrow() (agen 메서드)
@anchor{reference/expressions agen athrow}@anchor{71c}
@deffn {메서드} async agen.athrow (value)

@deffnx {메서드} async agen.athrow (type[, value[, traceback]])

어웨이터블을 돌려주는데, 비동기 제너레이터가 일시 중지한 지점에 @code{type} 형의 예외를 일으키고, 제너레이터 함수가 yield 한 다음 값을 발생하는 @ref{df4,,StopIteration} 예외의 값으로 돌려줍니다. 비동기 제너레이터가 다른 값을 yield 하지 않고 종료하면, 어웨이터블에 의해 @ref{1e0c,,StopAsyncIteration} 예외가 일어납니다. 제너레이터 함수가 전달된 예외를 잡지 않거나, 다른 예외를 일으키면, 어웨이터블을 실행할 때 그 예외가 어웨이터블의 호출자에게 퍼집니다.


버전 3.12에서 변경: The second signature (type[, value[, traceback]]) is deprecated and
may be removed in a future version of Python.

@end deffn

@geindex exception;GeneratorExit

@geindex aclose() (agen 메서드)
@anchor{reference/expressions agen aclose}@anchor{ad5}
@deffn {메서드} async agen.aclose ()

어웨이터블을 돌려주는데, 실행하면, 비동기 제너레이터 함수가 일시 정지한 지점으로 @ref{15cc,,GeneratorExit} 를 던집니다. 만약 그 이후에 비동기 제너레이터 함수가 우아하게 (gracefully) 종료하거나, 이미 닫혔거나, (그 예외를 잡지 않음으로써) @code{GeneratorExit} 를 일으키면, 돌려준 어웨이터블은 @ref{df4,,StopIteration} 예외를 일으킵니다. 이어지는 비동기 제너레이터 호출이 돌려주는 추가의 어웨이터블들은 @ref{1e0c,,StopAsyncIteration} 예외를 일으킵니다. 만약 비동기 제너레이터가 값을 yield 하면 어웨이터블에 의해 @ref{244,,RuntimeError} 가 발생합니다. 만약 비동기 제너레이터가 그 밖의 다른 예외를 일으키면, 어웨이터블의 호출자로 퍼집니다. 만약 비동기 제너레이터가 예외나 정상 종료로 이미 종료했으면, 더 이어지는 @ref{ad5,,aclose()} 호출은 아무것도 하지 않는 어웨이터블을 돌려줍니다.
@end deffn

@node 프라이머리,어웨이트 표현식,아톰 Atoms,표현식
@anchor{reference/expressions id5}@anchor{24a3}@anchor{reference/expressions primaries}@anchor{24a4}
@subsection 프라이머리


@geindex primary

프라이머리는 언어에서 가장 강하게 결합하는 연산들을 나타냅니다. 문법은 이렇습니다:

@example
@anchor{reference/expressions grammar-token-python-grammar-primary}@anchor{24a5}primary: @ref{246c,,atom} | @ref{24a6,,attributeref} | @ref{24a7,,subscription} | @ref{24a8,,call}
@end example

@menu
* 어트리뷰트 참조:: 
* Subscriptions and slicings:: 
* 호출:: 

@end menu

@node 어트리뷰트 참조,Subscriptions and slicings,,프라이머리
@anchor{reference/expressions attribute-references}@anchor{24a9}@anchor{reference/expressions id6}@anchor{24aa}
@subsubsection 어트리뷰트 참조


@geindex attribute;reference
@geindex . (dot);attribute reference

어트리뷰트 참조는 마침표(period)와 이름이 뒤에 붙은 프라이머리다:

@example
@anchor{reference/expressions grammar-token-python-grammar-attributeref}@anchor{24a6}attributeref: @ref{24a5,,primary} "." @ref{22be,,identifier}
@end example

@geindex exception;AttributeError
@geindex object;module
@geindex object;list

The primary must evaluate to an object of a type that supports attribute
references, which most objects do.  This object is then asked to produce the
attribute whose name is the identifier. The type and value produced is
determined by the object.  Multiple evaluations of the same attribute
reference may yield different objects.

This production can be customized by overriding the
@ref{dca,,__getattribute__()} method or the @ref{6f9,,__getattr__()}
method.  The @code{__getattribute__()} method is called first and either
returns a value or raises @ref{5ee,,AttributeError} if the attribute is not
available.

If an @ref{5ee,,AttributeError} is raised and the object has a @code{__getattr__()}
method, that method is called as a fallback.

@node Subscriptions and slicings,호출,어트리뷰트 참조,프라이머리
@anchor{reference/expressions subscriptions}@anchor{23ce}@anchor{reference/expressions subscriptions-and-slicings}@anchor{24ab}
@subsubsection Subscriptions and slicings


@geindex subscription
@geindex [] (square brackets);subscription

@geindex object;sequence
@geindex object;mapping
@geindex object;string
@geindex object;tuple
@geindex object;list
@geindex object;dictionary
@geindex sequence;item

The `subscription' syntax is usually used for selecting an element from a
@ref{23d4,,container} – for example, to get a value from
a @ref{183,,dict}:

@example
>>> digits_by_name = @{'one': 1, 'two': 2@}
>>> digits_by_name['two']  # Subscripting a dictionary using the key 'two'
2
@end example

In the subscription syntax, the object being subscribed – a
@ref{24a4,,primary} – is followed by a `subscript' in
square brackets.
In the simplest case, the subscript is a single expression.

Depending on the type of the object being subscribed, the subscript is
sometimes called a @ref{23e4,,key} (for mappings), @ref{23e3,,index} (for sequences),
or `type argument' (for @ref{1a1,,generic types}).
Syntactically, these are all equivalent:

@example
>>> colors = ['red', 'blue', 'green', 'black']
>>> colors[3]  # Subscripting a list using the index 3
'black'

>>> list[str]  # Parameterizing the list type using the type argument str
list[str]
@end example

At runtime, the interpreter will evaluate the primary and
the subscript, and call the primary’s @ref{588,,__getitem__()} or
@ref{942,,__class_getitem__()} @ref{1c5e,,special method} with the subscript
as argument.
For more details on which of these methods is called, see
@ref{23cd,,__class_getitem__ versus __getitem__}.

To show how subscription works, we can define a custom object that
implements @ref{588,,__getitem__()} and prints out the value of
the subscript:

@example
>>> class SubscriptionDemo:
...     def __getitem__(self, key):
...         print(f'subscripted with: @{key!r@}')
...
>>> demo = SubscriptionDemo()
>>> demo[1]
subscripted with: 1
>>> demo['a' * 3]
subscripted with: 'aaa'
@end example

See @ref{588,,__getitem__()} documentation for how built-in types handle
subscription.

Subscriptions may also be used as targets in @ref{2428,,assignment} or
@ref{1b1d,,deletion} statements.
In these cases, the interpreter will call the subscripted object’s
@ref{14d0,,__setitem__()} or @ref{14d1,,__delitem__()}
@ref{1c5e,,special method}, respectively, instead of @ref{588,,__getitem__()}.

@example
>>> colors = ['red', 'blue', 'green', 'black']
>>> colors[3] = 'white'  # Setting item at index
>>> colors
['red', 'blue', 'green', 'white']
>>> del colors[3]  # Deleting item at index 3
>>> colors
['red', 'blue', 'green']
@end example

All advanced forms of `subscript' documented in the following sections
are also usable for assignment and deletion.

@geindex slicing
@geindex slice
@geindex ; (colon);slicing
@geindex @comma{} (comma);slicing

@geindex object;sequence
@geindex object;string
@geindex object;tuple
@geindex object;list

@menu
* 슬라이싱(Slicings): 슬라이싱 Slicings. 
* Comma-separated subscripts:: 
* “Starred” subscriptions:: 
* Formal subscription grammar:: 

@end menu

@node 슬라이싱 Slicings,Comma-separated subscripts,,Subscriptions and slicings
@anchor{reference/expressions id7}@anchor{24ac}@anchor{reference/expressions slicings}@anchor{24ad}
@subsubsection 슬라이싱(Slicings)


A more advanced form of subscription, `slicing', is commonly used
to extract a portion of a @ref{2335,,sequence}.
In this form, the subscript is a @ref{24ae,,slice}: up to three
expressions separated by colons.
Any of the expressions may be omitted, but a slice must contain at least one
colon:

@example
>>> number_names = ['zero', 'one', 'two', 'three', 'four', 'five']
>>> number_names[1:3]
['one', 'two']
>>> number_names[1:]
['one', 'two', 'three', 'four', 'five']
>>> number_names[:3]
['zero', 'one', 'two']
>>> number_names[:]
['zero', 'one', 'two', 'three', 'four', 'five']
>>> number_names[::2]
['zero', 'two', 'four']
>>> number_names[:-3]
['zero', 'one', 'two']
>>> del number_names[4:]
>>> number_names
['zero', 'one', 'two', 'three']
@end example

When a slice is evaluated, the interpreter constructs a @ref{693,,slice} object
whose @ref{23a5,,start}, @ref{23a6,,stop} and
@ref{23a7,,step} attributes, respectively, are the results of the
expressions between the colons.
Any missing expression evaluates to @ref{884,,None}.
This @code{slice} object is then passed to the @ref{588,,__getitem__()}
or @ref{942,,__class_getitem__()} @ref{1c5e,,special method}, as above.

@example
# continuing with the SubscriptionDemo instance defined above:
>>> demo[2:3]
subscripted with: slice(2, 3, None)
>>> demo[::'spam']
subscripted with: slice(None, None, 'spam')
@end example

@node Comma-separated subscripts,“Starred” subscriptions,슬라이싱 Slicings,Subscriptions and slicings
@anchor{reference/expressions comma-separated-subscripts}@anchor{24af}
@subsubsection Comma-separated subscripts


The subscript can also be given as two or more comma-separated expressions
or slices:

@example
# continuing with the SubscriptionDemo instance defined above:
>>> demo[1, 2, 3]
subscripted with: (1, 2, 3)
>>> demo[1:2, 3]
subscripted with: (slice(1, 2, None), 3)
@end example

This form is commonly used with numerical libraries for slicing
multi-dimensional data.
In this case, the interpreter constructs a @ref{610,,tuple} of the results of the
expressions or slices, and passes this tuple to the @ref{588,,__getitem__()}
or @ref{942,,__class_getitem__()} @ref{1c5e,,special method}, as above.

The subscript may also be given as a single expression or slice followed
by a comma, to specify a one-element tuple:

@example
>>> demo['spam',]
subscripted with: ('spam',)
@end example

@node “Starred” subscriptions,Formal subscription grammar,Comma-separated subscripts,Subscriptions and slicings
@anchor{reference/expressions starred-subscriptions}@anchor{24b0}
@subsubsection “Starred” subscriptions



Added in version 3.11: Expressions in `tuple_slices' may be starred. See 
@geindex Python 향상 제안; PEP 646
PEP 646@footnote{https://peps.python.org/pep-0646/}.


The subscript can also contain a starred expression.
In this case, the interpreter unpacks the result into a tuple, and passes
this tuple to @ref{588,,__getitem__()} or @ref{942,,__class_getitem__()}:

@example
# continuing with the SubscriptionDemo instance defined above:
>>> demo[*range(10)]
subscripted with: (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
@end example

Starred expressions may be combined with comma-separated expressions
and slices:

@example
>>> demo['a', 'b', *range(3), 'c']
subscripted with: ('a', 'b', 0, 1, 2, 'c')
@end example

@node Formal subscription grammar,,“Starred” subscriptions,Subscriptions and slicings
@anchor{reference/expressions formal-subscription-grammar}@anchor{24b1}
@subsubsection Formal subscription grammar


@example
@anchor{reference/expressions grammar-token-python-grammar-subscription}@anchor{24a7}subscription:     @ref{24a5,,primary} '[' @ref{24b2,,subscript} ']'
@anchor{reference/expressions grammar-token-python-grammar-subscript}@anchor{24b2}subscript:        @ref{24b3,,single_subscript} | @ref{24b4,,tuple_subscript}
@anchor{reference/expressions grammar-token-python-grammar-single_subscript}@anchor{24b3}single_subscript: @ref{24b5,,proper_slice} | @ref{242e,,assignment_expression}
@anchor{reference/expressions grammar-token-python-grammar-proper_slice}@anchor{24b5}proper_slice:     [@ref{182,,expression}] ":" [@ref{182,,expression}] [ ":" [@ref{182,,expression}] ]
@anchor{reference/expressions grammar-token-python-grammar-tuple_subscript}@anchor{24b4}tuple_subscript:  ','.(@ref{24b3,,single_subscript} | @ref{2484,,starred_expression})+ [',']
@end example

Recall that the @code{|} operator @ref{2281,,denotes ordered choice}.
Specifically, in @code{subscript}, if both alternatives would match, the
first (@code{single_subscript}) has priority.

@geindex object;callable
@geindex call
@geindex argument;call semantics
@geindex () (parentheses);call
@geindex @comma{} (comma);argument list
@geindex = (equals);in function calls

@node 호출,,Subscriptions and slicings,프라이머리
@anchor{reference/expressions calls}@anchor{f7c}@anchor{reference/expressions id8}@anchor{24b6}
@subsubsection 호출


호출은 콜러블 객체 (예를 들어, @ref{24b7,,함수}) 를 빌 수도 있는 @ref{679,,인자} 들의 목록으로 호출합니다.

@example
@anchor{reference/expressions grammar-token-python-grammar-call}@anchor{24a8}call:                 @ref{24a5,,primary} "(" [@ref{24b8,,argument_list} [","] | @ref{2486,,comprehension}] ")"
@anchor{reference/expressions grammar-token-python-grammar-argument_list}@anchor{24b8}argument_list:        @ref{24b9,,positional_arguments} ["," @ref{24ba,,starred_and_keywords}]
                        ["," @ref{24bb,,keywords_arguments}]
                      | @ref{24ba,,starred_and_keywords} ["," @ref{24bb,,keywords_arguments}]
                      | @ref{24bb,,keywords_arguments}
@anchor{reference/expressions grammar-token-python-grammar-positional_arguments}@anchor{24b9}positional_arguments: @ref{24bc,,positional_item} ("," @ref{24bc,,positional_item})*
@anchor{reference/expressions grammar-token-python-grammar-positional_item}@anchor{24bc}positional_item:      @ref{242e,,assignment_expression} | "*" @ref{182,,expression}
@anchor{reference/expressions grammar-token-python-grammar-starred_and_keywords}@anchor{24ba}starred_and_keywords: ("*" @ref{182,,expression} | @ref{24bd,,keyword_item})
                      ("," "*" @ref{182,,expression} | "," @ref{24bd,,keyword_item})*
@anchor{reference/expressions grammar-token-python-grammar-keywords_arguments}@anchor{24bb}keywords_arguments:   (@ref{24bd,,keyword_item} | "**" @ref{182,,expression})
                      ("," @ref{24bd,,keyword_item} | "," "**" @ref{182,,expression})*
@anchor{reference/expressions grammar-token-python-grammar-keyword_item}@anchor{24bd}keyword_item:         @ref{22be,,identifier} "=" @ref{182,,expression}
@end example

생략할 수 있는 마지막 쉼표가 위치나 키워드 인자 뒤에 나타날 수 있지만, 의미를 바꾸지 않습니다.

@geindex parameter;call semantics

The primary must evaluate to a callable object (user-defined functions, built-in
functions, methods of built-in objects, class objects, methods of class
instances, and all objects having a @ref{779,,__call__()} method are callable).  All
argument expressions are evaluated before the call is attempted.  Please refer
to section @ref{2016,,함수 정의} for the syntax of formal @ref{2348,,parameter} lists.

@c XXX update with kwonly args PEP

If keyword arguments are present, they are first converted to positional
arguments, as follows.  First, a list of unfilled slots is created for the
formal parameters.  If there are N positional arguments, they are placed in the
first N slots.  Next, for each keyword argument, the identifier is used to
determine the corresponding slot (if the identifier is the same as the first
formal parameter name, the first slot is used, and so on).  If the slot is
already filled, a @ref{198,,TypeError} exception is raised. Otherwise, the
argument is placed in the slot, filling it (even if the expression is
@code{None}, it fills the slot).  When all arguments have been processed, the slots
that are still unfilled are filled with the corresponding default value from the
function definition.  (Default values are calculated, once, when the function is
defined; thus, a mutable object such as a list or dictionary used as default
value will be shared by all calls that don’t specify an argument value for the
corresponding slot; this should usually be avoided.)  If there are any unfilled
slots for which no default value is specified, a @code{TypeError} exception is
raised.  Otherwise, the list of filled slots is used as the argument list for
the call.

구현은 위치 매개변수가 이름을 갖지 않아서, 설사 문서화의 목적으로 이름이 붙여졌다 하더라도, 키워드로 공급될 수 없는 내장 함수들을 제공할 수 있습니다. CPython 에서, 인자들을 파싱하기 위해 @ref{3c1,,PyArg_ParseTuple()} 를 사용하는 C로 구현된 함수들이 이 경우입니다.

형식 매개변수 슬롯들보다 많은 위치 인자들이 있으면, @code{*identifier} 문법을 사용하는 형식 매개변수가 있지 않은 한, @ref{198,,TypeError} 예외를 일으킵니다; 이 경우, 그 형식 매개변수는 남는 위치 인자들을 포함하는 튜플을 전달받습니다 (또는 남는 위치 인자들이 없으면 빈 튜플).

키워드 인자가 형식 매개변수 이름에 대응하지 않으면, @code{**identifier} 문법을 사용하는 형식 매개변수가 있지 않은 한, @ref{198,,TypeError} 예외를 일으킵니다; 이 경우, 그 형식 매개변수는 남는 키워드 인자들을 포함하는 딕셔너리나, 남는 위치기반 인자들이 없으면 빈 (새) 딕셔너리를 전달받습니다.

@geindex * (asterisk);in function calls
@geindex unpacking;in function calls

문법 @code{*expression} 이 함수 호출에 등장하면, @code{expression} 의 값은 @ref{142c,,이터러블} 이 되어야 합니다. 이 이터러블의 요소들은, 그것들이 추가의 위치 인자들인 것처럼 취급됩니다. 호출 @code{f(x1, x2, *y, x3, x4)} 의 경우, `y' 의 값을 구할 때 시퀀스 `y1', …, `yM' 이 나온다면, 이것은 M+4개의 위치 인자들 `x1', `x2', `y1', …, `yM', `x3', `x4' 로 호출하는 것과 동등합니다.

이로 인한 결과는 설사 @code{*expression} 문법이 명시적인 키워드 인자 `뒤에' 나올 수는 있어도, 키워드 인자 (그리고 모든 @code{**expression} 인자들 – 아래를 보라) `전에' 처리된다는 것입니다. 그래서:

@example
>>> def f(a, b):
...     print(a, b)
...
>>> f(b=1, *(2,))
2 1
>>> f(a=1, *(2,))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: f() got multiple values for keyword argument 'a'
>>> f(1, *(2,))
1 2
@end example

It is unusual for both keyword arguments and the @code{*expression} syntax to be
used in the same call, so in practice this confusion does not often arise.

@geindex **;in function calls

If the syntax @code{**expression} appears in the function call, @code{expression} must
evaluate to a @ref{13c0,,mapping}, the contents of which are treated as
additional keyword arguments. If a parameter matching a key has already been
given a value (by an explicit keyword argument, or from another unpacking),
a @ref{198,,TypeError} exception is raised.

When @code{**expression} is used, each key in this mapping must be
a string.
Each value from the mapping is assigned to the first formal parameter
eligible for keyword assignment whose name is equal to the key.
A key need not be a Python identifier (e.g. @code{"max-temp °F"} is acceptable,
although it will not match any formal parameter that could be declared).
If there is no match to a formal parameter
the key-value pair is collected by the @code{**} parameter, if there is one,
or if there is not, a @ref{198,,TypeError} exception is raised.

문법 @code{*identifier} 이나 @code{**identifier} 를 사용하는 형식 매개변수들은 위치 인자 슬롯이나 키워드 인자 아름들로 사용될 수 없습니다.


버전 3.5에서 변경: 함수 호출은 임의의 개수의 @code{*} and @code{**} 언 패킹을 받아들이고, 위치 인자들이 이터러블 언 패킹 (@code{*}) 뒤에 올 수 있고, 키워드 인자가 딕셔너리 언 패킹 (@code{**}) 뒤에 올 수 있습니다. 최초로 
@geindex Python 향상 제안; PEP 448
PEP 448@footnote{https://peps.python.org/pep-0448/} 에서 제안되었습니다.


호출은 예외를 일으키지 않는 한, 항상 어떤 값을 돌려줍니다, @code{None} 일 수 있습니다. 이 값이 어떻게 계산되는지는 콜러블 객체의 형에 달려있습니다.

만약 그것이—


@table @asis

@item 사용자 정의 함수면:

@geindex function;call
@geindex user-defined;function;call
@geindex object;user-defined function
@geindex object;function

The code block for the function is executed, passing it the argument list.  The
first thing the code block will do is bind the formal parameters to the
arguments; this is described in section @ref{2016,,함수 정의}.  When the code block
executes a @ref{1af,,return} statement, this specifies the return value of the
function call.  If execution reaches the end of the code block without
executing a @code{return} statement, the return value is @code{None}.

@item 내장 함수나 메서드면:

@geindex function;call
@geindex built-in function;call
@geindex method;call
@geindex built-in method;call
@geindex object;built-in method
@geindex object;built-in function
@geindex object;method
@geindex object;function

결과는 인터프리터에 달려있습니다; 내장 함수와 메서드들에 대한 설명은 @ref{1461,,내장 함수} 를 보세요.

@item 클래스 객체면:

@geindex object;class
@geindex class object;call

그 클래스의 새 인스턴스가 반환됩니다.

@item 클래스 인스턴스 메서드면:

@geindex object;class instance
@geindex object;instance
@geindex class instance;call

대응하는 사용자 정의 함수가 호출되는데, 그 인스턴스가 첫 번째 인자가 되는 하나만큼 더 긴 인자 목록이 전달됩니다.

@item 클래스 인스턴스면:

@geindex instance;call
@geindex __call__() (object method)

The class must define a @ref{779,,__call__()} method; the effect is then the same as
if that method was called.
@end table

@geindex keyword;await

@node 어웨이트 표현식,거듭제곱 연산자,프라이머리,표현식
@anchor{reference/expressions await}@anchor{18d}@anchor{reference/expressions await-expression}@anchor{24be}
@subsection 어웨이트 표현식


@ref{4c9,,어웨이터블} 에서 @ref{6b8,,코루틴} 의 실행을 일시 중지합니다. 오직 @ref{f72,,코루틴 함수} 에서만 사용할 수 있습니다.

@example
@anchor{reference/expressions grammar-token-python-grammar-await_expr}@anchor{24bf}await_expr: "await" @ref{24a5,,primary}
@end example


Added in version 3.5.


@node 거듭제곱 연산자,일 항 산술과 비트 연산,어웨이트 표현식,표현식
@anchor{reference/expressions power}@anchor{24c0}@anchor{reference/expressions the-power-operator}@anchor{24c1}
@subsection 거듭제곱 연산자


@geindex power;operation
@geindex operator;**

거듭제곱 연산자는 그것의 왼쪽에 붙는 일 항 연산자보다 더 강하게 결합합니다; 그것의 오른쪽에 붙는 일 항 연산자보다는 약하게 결합합니다. 문법은 이렇습니다:

@example
@anchor{reference/expressions grammar-token-python-grammar-power}@anchor{24c2}power: (@ref{24bf,,await_expr} | @ref{24a5,,primary}) ["**" @ref{24c3,,u_expr}]
@end example

그래서, 괄호가 없는 거듭제곱과 일 항 연산자의 시퀀스에서, 연산자는 오른쪽에서 왼쪽으로 값이 구해집니다 (이것이 피연산자의 값을 구하는 순서를 제약하는 것은 아닙니다): @code{-1**2} 은 @code{-1} 이 됩니다.

The power operator has the same semantics as the built-in @ref{1a4,,pow()} function,
when called with two arguments: it yields its left argument raised to the power
of its right argument.
Numeric arguments are first @ref{2469,,converted to a common type},
and the result is of that type.

int 피연산자의 경우, 두 번째 인자가 음수가 아닌 이상 결과는 피연산자들과 같은 형을 갖습니다; 두 번째 인자가 음수면, 모든 인자는 float로 변환되고, float 결과가 전달됩니다. 예를 들어, @code{10**2} 는 @code{100} 를 돌려주지만, @code{10**-2} 는 @code{0.01} 를 돌려줍니다.

@code{0.0} 를 음수로 거듭제곱하면 @ref{b3f,,ZeroDivisionError} 를 일으킵니다. 음수를 분수로 거듭제곱하면 복소수(@ref{197,,complex})가 나옵니다. (예전 버전에서는 @ref{2ec,,ValueError} 를 일으켰습니다.)

This operation can be customized using the special @ref{9d4,,__pow__()} and
@ref{1a5,,__rpow__()} methods.

@node 일 항 산술과 비트 연산,이항 산술 연산,거듭제곱 연산자,표현식
@anchor{reference/expressions unary}@anchor{247c}@anchor{reference/expressions unary-arithmetic-and-bitwise-operations}@anchor{24c4}
@subsection 일 항 산술과 비트 연산


@geindex unary;arithmetic;operation
@geindex unary;bitwise;operation

모든 일 항 산술과 비트 연산자는 같은 우선순위를 갖습니다.

@example
@anchor{reference/expressions grammar-token-python-grammar-u_expr}@anchor{24c3}u_expr: @ref{24c2,,power} | "-" @ref{24c3,,u_expr} | "+" @ref{24c3,,u_expr} | "~" @ref{24c3,,u_expr}
@end example

@geindex negation
@geindex minus
@geindex operator;- (minus)
@geindex - (minus);unary operator

The unary @code{-} (minus) operator yields the negation of its numeric argument; the
operation can be overridden with the @ref{2403,,__neg__()} special method.

@geindex plus
@geindex operator;+ (plus)
@geindex + (plus);unary operator

The unary @code{+} (plus) operator yields its numeric argument unchanged; the
operation can be overridden with the @ref{2404,,__pos__()} special method.

@geindex inversion
@geindex operator;~ (tilde)

The unary @code{~} (invert) operator yields the bitwise inversion of its integer
argument.  The bitwise inversion of @code{x} is defined as @code{-(x+1)}.  It only
applies to integral numbers or to custom objects that override the
@ref{2406,,__invert__()} special method.

@geindex exception;TypeError

세 가지 경우 모두, 인자가 올바른 형을 갖지 않는다면, @ref{198,,TypeError} 예외가 발생합니다.

@node 이항 산술 연산,시프트 연산,일 항 산술과 비트 연산,표현식
@anchor{reference/expressions binary}@anchor{247d}@anchor{reference/expressions binary-arithmetic-operations}@anchor{24c5}
@subsection 이항 산술 연산


@geindex binary;arithmetic;operation

이항 산술 연산자는 관습적인 우선순위를 갖습니다. 이 연산자 중 일부는 일부 비 숫자 형에도 적용됨에 주의해야 합니다. 거듭제곱 연산자와는 별개로, 오직 두 가지 수준만 있는데, 하나는 곱셈형 연산자들이고, 하나는 덧셈형 연산자들입니다.

@example
@anchor{reference/expressions grammar-token-python-grammar-m_expr}@anchor{24c6}m_expr: @ref{24c3,,u_expr} | @ref{24c6,,m_expr} "*" @ref{24c3,,u_expr} | @ref{24c6,,m_expr} "@@" @ref{24c6,,m_expr} |
        @ref{24c6,,m_expr} "//" @ref{24c3,,u_expr} | @ref{24c6,,m_expr} "/" @ref{24c3,,u_expr} |
        @ref{24c6,,m_expr} "%" @ref{24c3,,u_expr}
@anchor{reference/expressions grammar-token-python-grammar-a_expr}@anchor{24c7}a_expr: @ref{24c6,,m_expr} | @ref{24c7,,a_expr} "+" @ref{24c6,,m_expr} | @ref{24c7,,a_expr} "-" @ref{24c6,,m_expr}
@end example

@geindex multiplication
@geindex operator;* (asterisk)

The @code{*} (multiplication) operator yields the product of its arguments.  The
arguments must either both be numbers, or one argument must be an integer and
the other must be a sequence. In the former case, the numbers are
@ref{2469,,converted to a common real type} and then
multiplied together.  In the latter case, sequence repetition is performed;
a negative repetition factor yields an empty sequence.

This operation can be customized using the special @ref{23e0,,__mul__()} and
@ref{23e1,,__rmul__()} methods.


버전 3.14에서 변경: If only one operand is a complex number, the other operand is converted
to a floating-point number.


@geindex matrix multiplication
@geindex operator;@@ (at)

@code{@@} (at) 연산자는 행렬 곱셈에 사용하려는 것입니다. 파이썬의 내장형들 어느 것도 이 연산자를 구현하지 않습니다.

This operation can be customized using the special @ref{f78,,__matmul__()} and
@ref{f79,,__rmatmul__()} methods.


Added in version 3.5.


@geindex exception;ZeroDivisionError
@geindex division
@geindex operator;/ (slash)
@geindex operator;//

The @code{/} (division) and @code{//} (floor division) operators yield the quotient of
their arguments.  The numeric arguments are first
@ref{2469,,converted to a common type}.
Division of integers yields a float, while floor division of integers results in an
integer; the result is that of mathematical division with the ‘floor’ function
applied to the result.  Division by zero raises the @ref{b3f,,ZeroDivisionError}
exception.

The division operation can be customized using the special @ref{108f,,__truediv__()}
and @ref{23f1,,__rtruediv__()} methods.
The floor division operation can be customized using the special
@ref{16f9,,__floordiv__()} and @ref{23f2,,__rfloordiv__()} methods.

@geindex modulo
@geindex operator;% (percent)

The @code{%} (modulo) operator yields the remainder from the division of the first
argument by the second.  The numeric arguments are first
@ref{2469,,converted to a common type}.
A zero right argument raises the @ref{b3f,,ZeroDivisionError} exception.  The
arguments may be floating-point numbers, e.g., @code{3.14%0.7} equals @code{0.34}
(since @code{3.14} equals @code{4*0.7 + 0.34}.)  The modulo operator always yields a
result with the same sign as its second operand (or zero); the absolute value of
the result is strictly smaller than the absolute value of the second operand
@footnote{
@code{abs(x%y) < abs(y)} 이 수학적으로는 참이지만, float의 경우에는 소수점 자름(roundoff) 때문에 수치적으로 참이 아닐 수 있습니다. 예를 들어, 파이썬 float가 IEEE 754 배정도 숫자인 플랫폼을 가정할 때, @code{-1e-100 % 1e100} 가 @code{1e100} 와 같은 부호를 가지기 위해, 계산된 결과는 @code{-1e-100 + 1e100} 인데, 수치적으로는 @code{1e100} 과 정확히 같은 값입니다. 함수 @ref{24c8,,math.fmod()} 는 부호가 첫 번째 인자의 부호에 맞춰진 결과를 주기 때문에, 이 경우 @code{-1e-100} 을 돌려줍니다. 어떤 접근법이 더 적절한지는 응용 프로그램에 달려있습니다.
}.

정수 나눗셈과 모듈로 연산자는 다음과 같은 항등식으로 연결되어 있습니다: @code{x == (x//y)*y + (x%y)}. 정수 나눗셈과 모듈로는 내장 함수 @ref{b98,,divmod()} 와도 연결되어 있습니다: @code{divmod(x, y) == (x//y, x%y)}. @footnote{
x가 y의 정확한 정수배와 아주 가까우면, 라운딩(rounding) 때문에 @code{x//y} 는 @code{(x-x%y)//y} 보다 1 클 수 있습니다. 그런 경우, @code{divmod(x,y)[0] * y + x % y} 가 @code{x} 와 아주 가깝도록 유지하기 위해, 파이썬은 뒤의 결과를 돌려줍니다.
}.

숫자들에 대해 모듈로 연산을 수행하는 것에 더해, @code{%} 연산자는 예전 스타일의 문자열 포매팅 (인터폴레이션이라고도 알려져 있습니다)을 수행하기 위해 문자열 객체에 의해 다시 정의됩니다. 문자열 포매팅의 문법은 파이썬 라이브러리 레퍼런스의 섹션 @ref{8da,,printf 스타일 문자열 포매팅} 에서 설명합니다.

The `modulo' operation can be customized using the special @ref{23ea,,__mod__()}
and @ref{fd4,,__rmod__()} methods.

The floor division operator, the modulo operator, and the @ref{b98,,divmod()}
function are not defined for complex numbers.  Instead, convert to a
floating-point number using the @ref{208b,,abs()} function if appropriate.

@geindex addition
@geindex operator;+ (plus)
@geindex + (plus);binary operator

The @code{+} (addition) operator yields the sum of its arguments.  The arguments
must either both be numbers or both be sequences of the same type.  In the
former case, the numbers are
@ref{2469,,converted to a common real type} and then
added together.
In the latter case, the sequences are concatenated.

This operation can be customized using the special @ref{23dd,,__add__()} and
@ref{23de,,__radd__()} methods.


버전 3.14에서 변경: If only one operand is a complex number, the other operand is converted
to a floating-point number.


@geindex subtraction
@geindex operator;- (minus)
@geindex - (minus);binary operator

The @code{-} (subtraction) operator yields the difference of its arguments.
The numeric arguments are first
@ref{2469,,converted to a common real type}.

This operation can be customized using the special @ref{23e9,,__sub__()} and
@ref{23f0,,__rsub__()} methods.


버전 3.14에서 변경: If only one operand is a complex number, the other operand is converted
to a floating-point number.


@node 시프트 연산,이항 비트 연산,이항 산술 연산,표현식
@anchor{reference/expressions shifting}@anchor{24c9}@anchor{reference/expressions shifting-operations}@anchor{24ca}
@subsection 시프트 연산


@geindex shifting;operation
@geindex operator;<<
@geindex operator;>>

시프트 연산은 산술 연산보다 낮은 우선순위를 갖습니다.

@example
@anchor{reference/expressions grammar-token-python-grammar-shift_expr}@anchor{24cb}shift_expr: @ref{24c7,,a_expr} | @ref{24cb,,shift_expr} ("<<" | ">>") @ref{24c7,,a_expr}
@end example

이 연산들은 정수들을 인자로 받아들입니다. 첫 번째 인자를 두 번째 인자로 주어진 비트 수만큼 왼쪽이나 오른쪽으로 밉니다(shift).

The left shift operation can be customized using the special @ref{23eb,,__lshift__()}
and @ref{23f4,,__rlshift__()} methods.
The right shift operation can be customized using the special @ref{23ec,,__rshift__()}
and @ref{23f5,,__rrshift__()} methods.

@geindex exception;ValueError

오른쪽으로 `n' 비트 시프트 하는 것은 @code{pow(2,n)} 로 정수 나눗셈하는 것으로 정의됩니다. 왼쪽으로 `n' 비트 시프트 하는 것은 @code{pow(2,n)} 를 곱하는 것으로 정의됩니다.

@node 이항 비트 연산,비교,시프트 연산,표현식
@anchor{reference/expressions binary-bitwise-operations}@anchor{24cc}@anchor{reference/expressions bitwise}@anchor{24cd}
@subsection 이항 비트 연산


@geindex binary;bitwise;operation

세 개의 비트 연산은 각기 다른 우선순위를 갖습니다:

@example
@anchor{reference/expressions grammar-token-python-grammar-and_expr}@anchor{24ce}and_expr: @ref{24cb,,shift_expr} | @ref{24ce,,and_expr} "&" @ref{24cb,,shift_expr}
@anchor{reference/expressions grammar-token-python-grammar-xor_expr}@anchor{24cf}xor_expr: @ref{24ce,,and_expr} | @ref{24cf,,xor_expr} "^" @ref{24ce,,and_expr}
@anchor{reference/expressions grammar-token-python-grammar-or_expr}@anchor{22ff}or_expr:  @ref{24cf,,xor_expr} | @ref{22ff,,or_expr} "|" @ref{24cf,,xor_expr}
@end example

@geindex bitwise;and
@geindex operator;& (ampersand)

The @code{&} operator yields the bitwise AND of its arguments, which must be
integers or one of them must be a custom object overriding @ref{23ed,,__and__()} or
@ref{23f6,,__rand__()} special methods.

@geindex bitwise;xor
@geindex exclusive;or
@geindex operator;^ (caret)

The @code{^} operator yields the bitwise XOR (exclusive OR) of its arguments, which
must be integers or one of them must be a custom object overriding @ref{23ee,,__xor__()} or
@ref{23f7,,__rxor__()} special methods.

@geindex bitwise;or
@geindex inclusive;or
@geindex operator;| (vertical bar)

The @code{|} operator yields the bitwise (inclusive) OR of its arguments, which
must be integers or one of them must be a custom object overriding @ref{23ef,,__or__()} or
@ref{23f8,,__ror__()} special methods.

@node 비교,논리 연산 Boolean operations,이항 비트 연산,표현식
@anchor{reference/expressions comparisons}@anchor{24d0}@anchor{reference/expressions id11}@anchor{24d1}
@subsection 비교


@geindex comparison
@geindex C;language
@geindex operator;< (less)
@geindex operator;> (greater)
@geindex operator;<=
@geindex operator;>=
@geindex operator;==
@geindex operator;!=

C와는 달리, 파이썬에서 모든 비교 연산은 같은 우선순위를 갖는데, 산술, 시프팅, 비트 연산들보다 낮습니다. 또한, C와는 달리, @code{a < b < c} 와 같은 표현식이 수학에서와 같은 방식으로 해석됩니다.

@example
@anchor{reference/expressions grammar-token-python-grammar-comparison}@anchor{24d2}comparison:    @ref{22ff,,or_expr} (@ref{24d3,,comp_operator} @ref{22ff,,or_expr})*
@anchor{reference/expressions grammar-token-python-grammar-comp_operator}@anchor{24d3}comp_operator: "<" | ">" | "==" | ">=" | "<=" | "!="
               | "is" ["not"] | ["not"] "in"
@end example

Comparisons yield boolean values: @code{True} or @code{False}. Custom
`rich comparison methods' may return non-boolean values. In this case
Python will call @ref{3c3,,bool()} on such value in boolean contexts.

@geindex chaining;comparisons

비교는 자유롭게 연결될 수 있습니다, 예를 들어, @code{x < y <= z} 는 @code{x < y and y <= z} 와 동등한데, 차이점은 @code{y} 의 값을 오직 한 번만 구한다는 것입니다 (하지만 두 경우 모두 @code{x < y} 가 거짓이면 @code{z} 의 값은 구하지 않습니다).

형식적으로, `a', `b', `c', …, `y', `z' 가 표현식이고, `op1', `op2', …, `opN' 가 비교 연산자면, @code{a op1 b op2 c ... y opN z} 는 각 표현식의 값을 최대 한 번만 구한다는 점을 제외하고는 @code{a op1 b and b op2 c and ... y opN z} 와 동등합니다.

@code{a op1 b op2 c} 가 `a' 와 `c' 간의 어떤 종류의 비교도 암시하지 않기 때문에, 예를 들어, @code{x < y > z} 이 완벽하게 (아마 이쁘지는 않더라도) 올바르다는 것에 주의해야 합니다.

@menu
* 값 비교:: 
* 멤버십 검사 연산:: 
* 아이덴티티 비교:: 

@end menu

@node 값 비교,멤버십 검사 연산,,비교
@anchor{reference/expressions expressions-value-comparisons}@anchor{1c1e}@anchor{reference/expressions value-comparisons}@anchor{24d4}
@subsubsection 값 비교


연산자 @code{<}, @code{>}, @code{==}, @code{>=}, @code{<=}, @code{!=} 는 두 객체의 값을 비교합니다. 객체들이 같은 형일 필요는 없습니다.

@ref{2329,,객체@comma{} 값@comma{} 형} 장은 객체들이 (형과 아이덴티티에 더해) 값을 갖는다고 말하고 있습니다. 파이썬에서 객체의 값은 좀 추상적인 개념입니다: 예를 들어, 객체의 값에 대한 규범적인(canonical) 액세스 방법은 없습니다. 또한, 객체의 값이 특별한 방식(예를 들어, 모든 데이터 어트리뷰트로 구성되는 것)으로 구성되어야 한다는 요구 사항도 없습니다. 비교 연산자는 객체의 값이 무엇인지에 대한 특정한 종류의 개념을 구현합니다. 객체의 값을 비교를 통해 간접적으로 정의한다고 생각해도 좋습니다.

Because all types are (direct or indirect) subtypes of @ref{c7d,,object}, they
inherit the default comparison behavior from @code{object}.  Types can
customize their comparison behavior by implementing
`rich comparison methods' like @ref{14a5,,__lt__()}, described in
@ref{23ad,,기본적인 커스터마이제이션}.

동등 비교 (@code{==} 와 @code{!=}) 의 기본 동작은 객체의 아이덴티티에 기반을 둡니다. 그래서, 같은 아이덴티티를 갖는 인스턴스 간의 동등 비교는 같음을 주고, 다른 아이덴티티를 갖는 인스턴스 간의 동등 비교는 다름을 줍니다. 이 기본 동작의 동기는 모든 객체가 반사적(reflexive) (즉, @code{x is y} 는 @code{x == y} 를 암시합니다) 이도록 만들고자 하는 욕구입니다.

기본 대소 비교(order comparison) (@code{<}, @code{>}, @code{<=}, @code{>=}) 는 제공되지 않습니다; 시도하면 @ref{198,,TypeError} 를 일으킵니다. 이 기본 동작의 동기는 동등함과 유사한 항등 관계가 없다는 것입니다.

다른 아이덴티티를 갖는 인스턴스들이 항상 서로 다르다는, 기본 동등 비교의 동작은, 객체의 값과 값 기반의 동등함에 대한 나름의 정의를 가진 형들이 필요로 하는 것과는 크게 다를 수 있습니다. 그런 형들은 자신의 비교 동작을 커스터마이즈 할 필요가 있고, 사실 많은 내장형이 그렇게 하고 있습니다.

다음 목록은 가장 중요한 내장형들의 비교 동작을 기술합니다.


@itemize *

@item 
내장 숫자 형 ((@ref{1fd8,,숫자 형 — int@comma{} float@comma{} complex})) 과 표준 라이브러리 형 @ref{213,,fractions.Fraction} 과 @ref{1fe,,decimal.Decimal} 에 속하는 숫자들은, 복소수가 대소 비교를 지원하지 않는다는 제약 사항만 빼고는, 같거나 다른 형들 간의 비교가 가능합니다. 관련된 형들의 한계 안에서, 정밀도의 손실 없이 수학적으로 (알고리즘 적으로) 올바르게 비교합니다.

NaN(not-a-number) 값들 @code{float('NaN')} 과 @code{decimal.Decimal('NaN')}은 특별합니다. 모든 숫자와 NaN 간의 비교는 거짓입니다. 반 직관적으로 내포하고 있는 것은, NaN 이 자신과 같지 않다는 것입니다. 예를 들어, @code{x = float('NaN')}, @code{3 < x}, @code{x < 3} 및 @code{x == x}는 모두 거짓이지만, @code{x != x}는 참입니다. 이 동작은 IEEE 754를 준수합니다.

@item 
@code{None} and @ref{1a2,,NotImplemented} are singletons.  
@geindex Python 향상 제안; PEP 8
PEP 8@footnote{https://peps.python.org/pep-0008/} advises that
comparisons for singletons should always be done with @code{is} or @code{is not},
never the equality operators.

@item 
바이너리 시퀀스들 (@ref{192,,bytes} 나 @ref{344,,bytearray} 의 인스턴스들)은 형을 건너 상호 비교될 수 있습니다. 이것들은 요소들의 숫자 값을 사용해서 사전식으로(lexicographically) 비교합니다.

@item 
문자열들 (@ref{169,,str} 의 인스턴스들) 은 문자들의 유니코드 코드 포인트(Unicode code points) (내장 함수 @ref{2338,,ord()} 의 결과)를 사용해서 사전식으로 비교합니다. @footnote{
유니코드 표준은 코드 포인트(`code points') (예를 들어, U+0041) 와 추상 문자(`abstract characters') (예를 들어, “LATIN CAPITAL LETTER A”) 를 구분합니다. 유니코드에 있는 대부분의 추상 문자들이 오직 하나의 코드 포인트만으로 표현되지만, 추가로 하나 이상의 코드 포인트의 시퀀스로 표현될 수 있는 추상 문자들이 많이 있습니다. 예를 들어, 추상 문자 “LATIN CAPITAL LETTER C WITH CEDILLA” 는 코드 위치 U+00C7 에 있는 한 개의 복합 문자(`precomposed character') 나 코드 위치 U+0043 (LATIN CAPITAL LETTER C) 에 있는 기본 문자(`base character') 와 뒤따르는 코드 위치 U+0327 (COMBINING CEDILLA) 에 있는 결합 문자(`combining character') 의 시퀀스로 표현될 수 있습니다.

문자열의 비교 연산자는 유니코드 코드 포인트 수준에서 비교합니다. 이것은 사람에게 반 직관적일 수 있습니다. 예를 들어, @code{"\u00C7" == "\u0043\u0327"} 는 거짓입니다, 설사 두 문자열이 같은 추상 문자 “LATIN CAPITAL LETTER C WITH CEDILLA”를 표현할지라도 그렇습니다.

문자열을 추상 문자 수준에서 비교하려면 (즉, 사람에게 직관적인 방법으로), @ref{8e3,,unicodedata.normalize()} 를 사용하십시오.
}

문자열과 바이너리 시퀀스는 직접 비교할 수 없습니다.

@item 
시퀀스들 (@ref{610,,tuple}, @ref{24d,,list}, @ref{b3d,,range} 의 인스턴스들)은 같은 형끼리 비교될 수 있는데, range는 대소 비교를 지원하지 않습니다. 서로 다른 형들 간의 동등 비교는 다름을 주고, 서로 다른 형들 간의 대소 비교는 @ref{198,,TypeError} 를 일으킵니다.

시퀀스는 대응하는 요소 간의 비교를 사용해서 사전적으로 비교합니다. 내장 컨테이너는 일반적으로 동일한(identical) 객체가 자신과 같다고(equal) 가정합니다. 이를 통해 동일한 객체에 대한 동등성(equality) 검사를 우회하여 성능을 개선하고 내부 불변성을 유지합니다.

내장 컬렉션들의 사전적인 비교는 다음과 같이 이루어집니다:


@itemize -

@item 
두 컬렉션이 같다고 비교되기 위해서는, 같은 형이고, 길이가 같고, 대응하는 요소들의 각 쌍이 같다고 비교되어야 합니다 (예를 들어, @code{[1,2] == (1,2)} 는 거짓인데, 형이 다르기 때문입니다).

@item 
대소 비교를 지원하는 컬렉션들은 첫 번째로 다른 요소들과 같은 순서를 줍니다 (예를 들어, @code{[1,2,x] <= [1,2,y]} 는 @code{x <= y} 와 같은 값입니다). 대응하는 요소가 없는 경우 더 짧은 컬렉션이 작다고 비교됩니다 (예를 들어, @code{[1,2] < [1,2,3]} 은 참입니다).
@end itemize

@item 
Mappings (instances of @ref{183,,dict}) compare equal if and only if they have
equal @code{(key, value)} pairs. Equality comparison of the keys and values
enforces reflexivity.

대소 비교 (@code{<}, @code{>}, @code{<=}, @code{>=}) 는 @ref{198,,TypeError} 를 일으킵니다.

@item 
집합들 (@ref{184,,set} 이나 @ref{7f1,,frozenset} 의 인스턴스들)은 같은 형들과 서로 다른 형들 간에 비교될 수 있습니다.

이것들은 부분집합(subset)과 상위집합(superset)을 뜻하는 대소비교 연산자들을 정의합니다. 이 관계는 전 순서(total ordering)를 정의하지 않습니다 (예를 들어, 두 집합 @code{@{1,2@}} 와 @code{@{2,3@}} 는 다르면서도, 하나가 다른 하나의 부분집합이지도, 하나가 다른 하나의 상위집합이지도 않습니다). 따라서, 전 순서에 의존하는 함수의 인자로는 적합하지 않습니다 (예를 들어, @ref{110a,,min()}, @ref{110b,,max()}, @ref{dc6,,sorted()} 에 입력으로 집합의 리스트를 제공하면 정의되지 않은 결과를 줍니다).

집합의 비교는 그 요소들의 반사성을 강제합니다.

@item 
대부분의 다른 내장형들은 비교 메서드들을 구현하지 않기 때문에, 기본 비교 동작을 계승합니다.
@end itemize

비교 동작을 커스터마이즈하는 사용자 정의 클래스들은 가능하다면 몇 가지 일관성 규칙을 준수해야 합니다:


@itemize *

@item 
동등 비교는 반사적(reflexive)이어야 합니다. 다른 말로 표현하면, 아이덴티티가 같은 객체는 같다고 비교되어야 합니다:

@quotation

@code{x is y} 면 @code{x == y} 다.
@end quotation

@item 
비교는 대칭적(symmetric)이어야 합니다. 다른 말로 표현하면, 다음과 같은 표현식은 같은 결과를 주어야 합니다:

@quotation

@code{x == y} 와 @code{y == x}

@code{x != y} 와 @code{y != x}

@code{x < y} 와 @code{y > x}

@code{x <= y} 와 @code{y >= x}
@end quotation

@item 
비교는 추이적(transitive)이어야 합니다. 다음 (철저하지 않은) 예들이 이것을 예증합니다:

@quotation

@code{x > y and y > z} 면 @code{x > z} 다

@code{x < y and y <= z} 면 @code{x < z} 다
@end quotation

@item 
역 비교는 논리적 부정이 되어야 합니다. 다른 말로 표현하면, 다음 표현식들이 같은 값을 주어야 합니다:

@quotation

@code{x == y} 와 @code{not x != y}

@code{x < y} 와 @code{not x >= y} (전 순서의 경우)

@code{x > y} 와 @code{not x <= y} (전 순서의 경우)
@end quotation

마지막 두 표현식은 전 순서 컬렉션에 적용됩니다 (예를 들어, 시퀀스에는 적용되지만, 집합과 매핑은 그렇지 않습니다). @ref{1141,,total_ordering()} 데코레이터도 보십시오.

@item 
@ref{800,,hash()} 결과는 동등성과 일관성을 유지해야 합니다. 같은 객체들은 같은 해시값을 같거나 해시 불가능으로 지정되어야 합니다.
@end itemize

파이썬은 이 일관성 규칙들을 강제하지 않습니다. 사실 NaN 값들은 이 규칙을 따르지 않는 예입니다.
@anchor{reference/expressions in}@anchor{34b}@anchor{reference/expressions not-in}@anchor{840}
@node 멤버십 검사 연산,아이덴티티 비교,값 비교,비교
@anchor{reference/expressions membership-test-details}@anchor{23e6}@anchor{reference/expressions membership-test-operations}@anchor{24d5}
@subsubsection 멤버십 검사 연산


연산자 @ref{34b,,in} 과 @ref{840,,not in} 은 멤버십을 검사합니다. @code{x in s} 는 `x' 가 `s' 의 멤버일 때 @code{True} 를, 그렇지 않을 때 @code{False} 를 줍니다. @code{x not in s} 은 @code{x in s} 의 부정을 줍니다. 딕셔너리 뿐만 아니라 모든 내장 시퀀스들과 집합 형들이 이것을 지원하는데, 딕셔너리의 경우는 @code{in} 이 딕셔너리에 주어진 키가 있는지 검사합니다. list, tuple, set, frozenset, dict, collections.deque 와 같은 컨테이너형들의 경우, 표현식 @code{x in y} 는 @code{any(x is e or x == e for e in y)} 와 동등합니다.

문자열과 바이트열 형의 경우, @code{x in y} 는 `x' 가 `y' 의 부분 문자열(substring)인 경우, 그리고 오직 그 경우만 @code{True} 입니다. 동등한 검사는 @code{y.find(x) != -1} 입니다. 빈 문자열은 항상 다른 문자열들의 부분 문자열로 취급되기 때문에, @code{"" in "abc"} 은 @code{True} 를 돌려줍니다.

For user-defined classes which define the @ref{15be,,__contains__()} method, @code{x in
y} returns @code{True} if @code{y.__contains__(x)} returns a true value, and
@code{False} otherwise.

For user-defined classes which do not define @ref{15be,,__contains__()} but do define
@ref{e68,,__iter__()}, @code{x in y} is @code{True} if some value @code{z}, for which the
expression @code{x is z or x == z} is true, is produced while iterating over @code{y}.
If an exception is raised during the iteration, it is as if @ref{34b,,in} raised
that exception.

Lastly, the old-style iteration protocol is tried: if a class defines
@ref{588,,__getitem__()}, @code{x in y} is @code{True} if and only if there is a non-negative
integer index `i' such that @code{x is y[i] or x == y[i]}, and no lower integer index
raises the @ref{173a,,IndexError} exception.  (If any other exception is raised, it is as
if @ref{34b,,in} raised that exception).

@geindex operator;in
@geindex operator;not in
@geindex membership;test
@geindex object;sequence

연산자 @ref{840,,not in} 은 @ref{34b,,in} 의 논리적 부정으로 정의됩니다.

@geindex operator;is
@geindex operator;is not
@geindex identity;test
@anchor{reference/expressions is}@anchor{34c}
@node 아이덴티티 비교,,멤버십 검사 연산,비교
@anchor{reference/expressions identity-comparisons}@anchor{24d6}@anchor{reference/expressions is-not}@anchor{24d7}
@subsubsection 아이덴티티 비교


연산자 @ref{34c,,is} 와 @ref{24d7,,is not} 은 객체의 아이덴티티를 검사합니다: @code{x is y} 는 `x' 와 `y' 가 아이덴티티가 같은 객체일 때, 그리고 오직 그 경우만 참입니다. 객체의 아이덴티티는 @ref{1628,,id()} 함수를 사용해서 결정됩니다. @code{x is not y} 은 논리적 부정 값을 줍니다. @footnote{
자동 가비지-수거(automatic garbage-collection)와 자유 목록(free lists)과 디스크립터(descriptor)의 동적인 성격 때문에, @ref{34c,,is} 연산자를 인스턴스 메서드들이나 상수들을 비교하는 것과 같은 특정한 방식으로 사용할 때, 겉으로 보기에 이상한 동작을 감지할 수 있습니다. 더 자세한 정보는 그들의 문서를 확인하십시오.
}
@anchor{reference/expressions booleans}@anchor{24d8}@anchor{reference/expressions and}@anchor{349}@anchor{reference/expressions or}@anchor{34d}
@node 논리 연산 Boolean operations,대입 표현식<2>,비교,표현식
@anchor{reference/expressions boolean-operations}@anchor{24d9}@anchor{reference/expressions not}@anchor{24da}
@subsection 논리 연산(Boolean operations)


@geindex Conditional;expression
@geindex Boolean;operation

@example
@anchor{reference/expressions grammar-token-python-grammar-or_test}@anchor{2489}or_test:  @ref{24db,,and_test} | @ref{2489,,or_test} "or" @ref{24db,,and_test}
@anchor{reference/expressions grammar-token-python-grammar-and_test}@anchor{24db}and_test: @ref{24dc,,not_test} | @ref{24db,,and_test} "and" @ref{24dc,,not_test}
@anchor{reference/expressions grammar-token-python-grammar-not_test}@anchor{24dc}not_test: @ref{24d2,,comparison} | "not" @ref{24dc,,not_test}
@end example

In the context of Boolean operations, and also when expressions are used by
control flow statements, the following values are interpreted as false:
@code{False}, @code{None}, numeric zero of all types, and empty strings and containers
(including strings, tuples, lists, dictionaries, sets and frozensets).  All
other values are interpreted as true.  User-defined objects can customize their
truth value by providing a @ref{14da,,__bool__()} method.

@geindex operator;not

연산자 @ref{24da,,not} 은 그 인자가 거짓이면 @code{True} 를, 그렇지 않으면 @code{False} 를 줍니다.

@geindex operator;and

표현식 @code{x and y} 는 먼저 `x' 의 값을 구합니다; `x' 가 거짓이면 그 값을 돌려줍니다; 그렇지 않으면 `y' 의 값을 구한 후에 그 결과를 돌려줍니다.

@geindex operator;or

표현식 @code{x or y} 는 먼저 `x' 의 값을 구합니다; `x' 가 참이면 그 값을 돌려줍니다. 그렇지 않으면 `y' 의 값을 구한 후에 그 결과를 돌려줍니다.

@ref{349,,and} 와 @ref{34d,,or} 어느 것도 반환 값이나 그 형을 @code{False} 와 @code{True} 로 제한하지 않고, 대신 마지막에 값이 구해진 인자를 돌려줌에 주의해야 합니다. 이것은 때로 쓸모가 있습니다, 예를 들어 @code{s} 가 문자열이고 비어 있으면 기본값으로 대체되어야 한다면, 표현식 @code{s or 'foo'} 는 원하는 값을 제공합니다. @ref{24da,,not} 은 새 값을 만들어야 하므로, 그 인자의 형과 관계없이 논리값(boolean value)을 돌려줍니다 (예를 들어, @code{not 'foo'} 는 @code{'@w{'}} 가 아니라 @code{False} 를 만듭니다.)

@geindex ;= (colon equals)
@geindex assignment expression
@geindex walrus operator
@geindex named expression
@geindex assignment;expression

@node 대입 표현식<2>,조건 표현식 Conditional expressions,논리 연산 Boolean operations,표현식
@anchor{reference/expressions assignment-expressions}@anchor{24dd}@anchor{reference/expressions id14}@anchor{24de}
@subsection 대입 표현식


@example
@anchor{reference/expressions grammar-token-python-grammar-assignment_expression}@anchor{242e}assignment_expression: [@ref{22be,,identifier} ":="] @ref{182,,expression}
@end example

An assignment expression (sometimes also called a “named expression” or
“walrus”) assigns an @ref{182,,expression} to an
@ref{22be,,identifier}, while also returning the value of the
@code{expression}.

일반적인 사용 사례 중 하나는 일치하는 정규식을 처리할 때입니다:

@example
if matching := pattern.search(data):
    do_something(matching)
@end example

또는, 청크로 파일 스트림을 처리할 때:

@example
while chunk := file.read(9000):
    process(chunk)
@end example

Assignment expressions must be surrounded by parentheses when
used as expression statements and when used as sub-expressions in
slicing, conditional, lambda,
keyword-argument, and comprehension-if expressions and
in @code{assert}, @code{with}, and @code{assignment} statements.
In all other places where they can be used, parentheses are not required,
including in @code{if} and @code{while} statements.


Added in version 3.8: 대입 표현식에 대한 더 자세한 내용은 
@geindex Python 향상 제안; PEP 572
PEP 572@footnote{https://peps.python.org/pep-0572/}를 참조하세요.


@node 조건 표현식 Conditional expressions,람다 Lambdas,대입 표현식<2>,표현식
@anchor{reference/expressions conditional-expressions}@anchor{24df}@anchor{reference/expressions if-expr}@anchor{17d}
@subsection 조건 표현식(Conditional expressions)


@geindex conditional;expression
@geindex ternary;operator
@geindex if;conditional expression
@geindex else;conditional expression

@example
@anchor{reference/expressions grammar-token-python-grammar-conditional_expression}@anchor{22fe}conditional_expression: @ref{2489,,or_test} ["if" @ref{2489,,or_test} "else" @ref{182,,expression}]
@anchor{reference/expressions grammar-token-python-grammar-expression}@anchor{182}expression:             @ref{22fe,,conditional_expression} | @ref{24e0,,lambda_expr}
@end example

A conditional expression (sometimes called a “ternary operator”) is an
alternative to the if-else statement. As it is an expression, it returns a value
and can appear as a sub-expression.

표현식 @code{x if C else y} 은 먼저 `x' 대신에 조건 `C' 의 값을 구합니다. `C' 가 참이면, `x' 의 값이 구해지고 그 값을 돌려줍니다; 그렇지 않으면, `y' 의 값을 구한 후에 그 결과를 돌려줍니다.

조건 표현식에 대한 더 자세한 내용은 
@geindex Python 향상 제안; PEP 308
PEP 308@footnote{https://peps.python.org/pep-0308/} 를 참조하세요.
@anchor{reference/expressions lambdas}@anchor{24e1}
@node 람다 Lambdas,표현식 목록 Expression lists,조건 표현식 Conditional expressions,표현식
@anchor{reference/expressions id15}@anchor{24e2}@anchor{reference/expressions lambda}@anchor{14a2}
@subsection 람다(Lambdas)


@geindex lambda;expression
@geindex lambda;form
@geindex anonymous;function
@geindex ; (colon);lambda expression

@example
@anchor{reference/expressions grammar-token-python-grammar-lambda_expr}@anchor{24e0}lambda_expr: "lambda" [@ref{24e3,,parameter_list}] ":" @ref{182,,expression}
@end example

람다 표현식은 (때로 람다 형식(lambda forms)이라고 불립니다) 이름 없는 함수를 만드는 데 사용됩니다. 표현식 @code{lambda parameters: expression} 는 함수 객체를 줍니다. 이 이름 없는 객체는 이렇게 정의된 함수 객체처럼 동작합니다:

@example
def <lambda>(parameters):
    return expression
@end example

매개변수 목록의 문법은 @ref{2016,,함수 정의} 섹션을 보세요. 람다 표현식으로 만들어진 함수는 문장(statements)이나 어노테이션(annotations)을 포함할 수 없음에 주의해야 합니다.

@node 표현식 목록 Expression lists,값을 구하는 순서,람다 Lambdas,표현식
@anchor{reference/expressions expression-lists}@anchor{24e4}@anchor{reference/expressions exprlists}@anchor{f7d}
@subsection 표현식 목록(Expression lists)


@geindex expression;list
@geindex @comma{} (comma);expression list

@example
@anchor{reference/expressions grammar-token-python-grammar-starred_expression}@anchor{2484}starred_expression:       "*" @ref{22ff,,or_expr} | @ref{182,,expression}
@anchor{reference/expressions grammar-token-python-grammar-flexible_expression}@anchor{24e5}flexible_expression:      @ref{242e,,assignment_expression} | @ref{2484,,starred_expression}
@anchor{reference/expressions grammar-token-python-grammar-flexible_expression_list}@anchor{248e}flexible_expression_list: @ref{24e5,,flexible_expression} ("," @ref{24e5,,flexible_expression})* [","]
@anchor{reference/expressions grammar-token-python-grammar-starred_expression_list}@anchor{24e6}starred_expression_list:  @ref{2484,,starred_expression} ("," @ref{2484,,starred_expression})* [","]
@anchor{reference/expressions grammar-token-python-grammar-expression_list}@anchor{24e7}expression_list:          @ref{182,,expression} ("," @ref{182,,expression})* [","]
@anchor{reference/expressions grammar-token-python-grammar-yield_list}@anchor{249a}yield_list:               @ref{24e7,,expression_list} | @ref{2484,,starred_expression} "," [@ref{24e6,,starred_expression_list}]
@end example

@geindex object;tuple

리스트나 집합 디스플레이의 일부일 때를 제외하고, 최소한 하나의 쉼표를 포함하는 표현식 목록은 튜플을 줍니다. 튜플의 길이는 목록에 있는 표현식의 개수입니다. 표현식들은 왼쪽에서 오른쪽으로 값이 구해집니다.

@geindex iterable;unpacking
@geindex * (asterisk);in expression lists

애스터리스크(asterisk) @code{*} 는 이터러블 언 패킹(`iterable unpacking')을 나타냅니다. 피연산자는 반드시 @ref{142c,,이터러블} 이어야 합니다. 그 이터러블이 항목들의 시퀀스로 확장되어서, 언 패킹 지점에서 새 튜플, 리스트, 집합에 포함됩니다.


Added in version 3.5: 표현식 목록에서의 이터러블 언 패킹, 
@geindex Python 향상 제안; PEP 448
PEP 448@footnote{https://peps.python.org/pep-0448/} 에서 최초로 제안되었습니다.



Added in version 3.11: Any item in an expression list may be starred. See 
@geindex Python 향상 제안; PEP 646
PEP 646@footnote{https://peps.python.org/pep-0646/}.


@geindex trailing;comma

A trailing comma is required only to create a one-item tuple,
such as @code{1,}; it is optional in all other cases.
A single expression without a
trailing comma doesn’t create a tuple, but rather yields the value of that
expression. (To create an empty tuple, use an empty pair of parentheses:
@code{()}.)

@node 값을 구하는 순서,연산자 우선순위,표현식 목록 Expression lists,표현식
@anchor{reference/expressions evalorder}@anchor{24e8}@anchor{reference/expressions evaluation-order}@anchor{24e9}
@subsection 값을 구하는 순서


@geindex evaluation;order

파이썬은 왼쪽에서 오른쪽으로 표현식의 값을 구합니다. 대입의 값을 구하는 동안, 우변의 값이 좌변보다 먼저 구해짐에 주목하십시오.

다음 줄들에서, 표현식은 그들의 끝에 붙은 숫자들의 순서대로 값이 구해집니다:

@example
expr1, expr2, expr3, expr4
(expr1, expr2, expr3, expr4)
@{expr1: expr2, expr3: expr4@}
expr1 + expr2 * (expr3 - expr4)
expr1(expr2, expr3, *expr4, **expr5)
expr3, expr4 = expr1, expr2
@end example

@node 연산자 우선순위,,값을 구하는 순서,표현식
@anchor{reference/expressions operator-precedence}@anchor{24ea}@anchor{reference/expressions operator-summary}@anchor{24eb}
@subsection 연산자 우선순위


@geindex operator;precedence

The following table summarizes the operator precedence in Python, from highest
precedence (most binding) to lowest precedence (least binding).  Operators in
the same box have the same precedence.  Unless the syntax is explicitly given,
operators are binary.  Operators in the same box group left to right (except for
exponentiation and conditional expressions, which group from right to left).

비교, 멤버십 검사, 아이덴티티 검사들은 모두 같은 우선순위를 갖고 @ref{24d0,,비교} 섹션에서 설명한 것처럼 왼쪽에서 오른쪽으로 이어붙이기(chaining) 하는 기능을 갖습니다.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

연산자

@tab

설명

@item

@code{(expressions...)},

@code{[expressions...]},
@code{@{key: value...@}},
@code{@{expressions...@}}

@tab

결합(binding) 또는 괄호 친 표현식, 리스트 디스플레이, 딕셔너리 디스플레이, 집합 디스플레이

@item

@code{x[index]}, @code{x[index:index]}
@code{x(arguments...)}, @code{x.attribute}

@tab

Subscription (including slicing),
call, attribute reference

@item

@ref{18d,,await x}

@tab

어웨이트 표현식

@item

@code{**}

@tab

거듭제곱 @footnote{
거듭제곱 연산자 @code{**} 는 오른쪽에 오는 산술이나 비트 일 항 연산자보다 약하게 결합합니다, 즉, @code{2**-1} 는 @code{0.5} 입니다.
}

@item

@code{+x}, @code{-x}, @code{~x}

@tab

양, 음, 비트 NOT

@item

@code{*}, @code{@@}, @code{/}, @code{//}, @code{%}

@tab

곱셈, 행렬 곱셈, 나눗셈, 정수 나눗셈, 나머지 @footnote{
@code{%} 연산자는 문자열 포매팅에도 사용됩니다; 같은 우선순위가 적용됩니다.
}

@item

@code{+}, @code{-}

@tab

덧셈과 뺄셈

@item

@code{<<}, @code{>>}

@tab

시프트

@item

@code{&}

@tab

비트 AND

@item

@code{^}

@tab

비트 XOR

@item

@code{|}

@tab

비트 OR

@item

@ref{34b,,in}, @ref{840,,not in},
@ref{34c,,is}, @ref{24d7,,is not}, @code{<},
@code{<=}, @code{>}, @code{>=}, @code{!=}, @code{==}

@tab

비교, 멤버십 검사와 아이덴티티 검사를 포함합니다

@item

@ref{24da,,not x}

@tab

논리 NOT

@item

@ref{349,,and}

@tab

논리 AND

@item

@ref{34d,,or}

@tab

논리 OR

@item

@ref{17d,,if} – @code{else}

@tab

조건 표현식

@item

@ref{14a2,,lambda}

@tab

람다 표현식

@item

@code{:=}

@tab

대입 표현식

@end multitable


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 단순문 Simple statements,복합문 Compound statements,표현식,파이썬 언어 레퍼런스
@anchor{reference/simple_stmts doc}@anchor{24ec}@anchor{reference/simple_stmts simple}@anchor{24ed}@anchor{reference/simple_stmts simple-statements}@anchor{24ee}@anchor{reference/simple_stmts translation-repo}@anchor{24ef}
@section 단순문(Simple statements)


@geindex 단순;문장

단순문은 하나의 논리적인 줄 안에 구성됩니다. 여러 개의 단순문이 세미콜론으로 분리되어 하나의 줄에 나올 수 있습니다. 단순문의 문법은 이렇습니다:

@example
@anchor{reference/simple_stmts grammar-token-python-grammar-simple_stmt}@anchor{24f0}simple_stmt: @ref{24f1,,expression_stmt}
             | @ref{24f2,,assert_stmt}
             | @ref{24f3,,assignment_stmt}
             | @ref{24f4,,augmented_assignment_stmt}
             | @ref{24f5,,annotated_assignment_stmt}
             | @ref{24f6,,pass_stmt}
             | @ref{24f7,,del_stmt}
             | @ref{24f8,,return_stmt}
             | @ref{24f9,,yield_stmt}
             | @ref{24fa,,raise_stmt}
             | @ref{24fb,,break_stmt}
             | @ref{24fc,,continue_stmt}
             | @ref{24fd,,import_stmt}
             | @ref{24fe,,future_stmt}
             | @ref{24ff,,global_stmt}
             | @ref{2500,,nonlocal_stmt}
             | @ref{2501,,type_stmt}
@end example

@menu
* 표현식 문:: 
* 대입문:: 
* assert 문:: 
* pass 문: pass 문<2>. 
* del 문: del 문<2>. 
* return 문:: 
* yield 문:: 
* raise 문:: 
* break 문:: 
* continue 문:: 
* 임포트(import) 문: 임포트 import 문. 
* global 문:: 
* nonlocal 문:: 
* type 문:: 

@end menu

@node 표현식 문,대입문,,단순문 Simple statements
@anchor{reference/simple_stmts expression-statements}@anchor{2502}@anchor{reference/simple_stmts exprstmts}@anchor{2503}
@subsection 표현식 문


@geindex 표현식;문장
@geindex 표현식;리스트

@geindex 표현식;리스트

표현식 문은 값을 계산하고 출력하거나, (보통) 프로시저(procedure) (의미 없는 결과를 돌려주는 함수; 파이썬에서 프로시저는 @code{None} 값을 돌려줍니다)를 호출하기 위해 (대부분 대화형으로) 사용됩니다. 표현식 문의 다른 사용도 허락되고 때때로 쓸모가 있습니다.

@example
@anchor{reference/simple_stmts grammar-token-python-grammar-expression_stmt}@anchor{24f1}expression_stmt: @ref{2484,,starred_expression}
@end example

표현식 문은 (하나의 표현식일 수 있는) 표현식 목록의 값을 구합니다.

@geindex 내장 함수;repr
@geindex 객체;None
@geindex 문자열;변환
@geindex 출력
@geindex 표준;출력
@geindex 쓰기;값
@geindex 프로시저;호출

대화형 모드에서, 값이 @code{None} 이 아니면, 내장 @ref{1c1,,repr()} 함수를 사용해 문자열로 변환되고, 그렇게 나온 문자열을 별도의 줄에 표준 출력으로 보냅니다 (결과가 @code{None} 일 때는 그렇지 않아서, 프로시저 호출은 어떤 출력도 만들지 않습니다.),

@node 대입문,assert 문,표현식 문,단순문 Simple statements
@anchor{reference/simple_stmts assignment}@anchor{2428}@anchor{reference/simple_stmts assignment-statements}@anchor{2504}
@subsection 대입문


@geindex = (등호);대입문
@geindex 대입;문장
@geindex 연결;이름
@geindex 재연결;이름
@geindex 객체;가변
@geindex 어트리뷰트;대입

대입문은 이름을 값에 (재)연결하고 가변 객체의 어트리뷰트나 항목들을 수정합니다.

@example
@anchor{reference/simple_stmts grammar-token-python-grammar-assignment_stmt}@anchor{24f3}assignment_stmt: (@ref{2488,,target_list} "=")+ (@ref{2484,,starred_expression} | @ref{2300,,yield_expression})
@anchor{reference/simple_stmts grammar-token-python-grammar-target_list}@anchor{2488}target_list:     @ref{2505,,target} ("," @ref{2505,,target})* [","]
@anchor{reference/simple_stmts grammar-token-python-grammar-target}@anchor{2505}target:          @ref{22be,,identifier}
                 | "(" [@ref{2488,,target_list}] ")"
                 | "[" [@ref{2488,,target_list}] "]"
                 | @ref{24a6,,attributeref}
                 | @ref{24a7,,subscription}
                 | "*" @ref{2505,,target}
@end example

(See section @ref{24a4,,프라이머리} for the syntax definitions for `attributeref'
and `subscription'.)

대입문은 표현식 목록 (이것이 하나의 표현식일 수도, 쉼표로 분리된 목록일 수도 있는데, 후자의 경우는 튜플이 만들어진다는 것을 기억하십시오) 의 값을 구하고, 왼쪽에서 오른쪽으로, 하나의 결과 객체를 타깃 목록의 각각에 대입합니다.

@geindex 타깃
@geindex 타깃;리스트

Assignment is defined recursively depending on the form of the target (list).
When a target is part of a mutable object (an attribute reference or
subscription), the mutable object must ultimately perform the assignment and
decide about its validity, and may raise an exception if the assignment is
unacceptable.  The rules observed by various types and the exceptions raised are
given with the definition of the object types (see section @ref{232c,,표준형 계층}).

@geindex 타깃;리스트;대입
@geindex @comma{} (쉼표);타깃 목록에서
@geindex * (애스터리스크);대입 타깃 목록에서
@geindex [] (대괄호);대입 타깃 목록에서
@geindex () (괄호);대입 타깃 목록에서

객체를 타깃 목록, 괄호나 대괄호로 둘러싸일 수 있는데 생략할 수 있습니다, 에 대입하는 것은 다음과 같이 재귀적으로 정의됩니다.


@itemize *

@item 
타깃 목록이 (선택적으로 괄호에 들어있는) 뒤따르는 쉼표가 없는 하나의 타깃이면 객체는 타깃에 대입됩니다.

@item 
그렇지 않으면:


@itemize *

@item 
타깃 목록이 애스터리스크(asterisk)를 앞에 붙인 타깃, “스타드(starred)” 타깃이라고 불립니다, 하나를 포함하면: 객체는 적어도 타깃 목록에 나오는 타깃의 수보다 하나 작은 개수의 항목을 제공하는 이터러블이어야 합니다. 이터러블의 처음 항목들은, 왼쪽에서 오른쪽으로, 스타드 타깃 앞에 나오는 타깃들에 대입됩니다. 이터러블의 마지막 항목들은 스타드 타깃 뒤에 나오는 타깃들에 대입됩니다. 이터러블의 나머지 항목들로 구성된 리스트가 스타드 타깃에 대입됩니다 (이 리스트는 비어있을 수 있습니다).

@item 
그렇지 않으면: 객체는 타깃 목록에 나오는 타깃의 수와 같은 수의 항목들을 제공하는 이터러블이어야 하고, 항목들은, 왼쪽에서 오른쪽으로, 대응하는 타깃들에 대입됩니다.
@end itemize
@end itemize

하나의 타깃에 대한 객체의 대입은 다음과 같이 재귀적으로 정의됩니다.


@itemize *

@item 
타깃이 식별자 (이름) 면:


@itemize *

@item 
그 이름이 현재 코드 블록에 있는 @ref{4ad,,global} 나 @ref{14ac,,nonlocal} 문에 등장하지 않으면: 그 이름은 현재 지역 이름 공간에서 객체에 연결됩니다.

@item 
그렇지 않으면: 그 이름은 각각 전역 이름 공간이나 @ref{14ac,,nonlocal} 에 의해 결정되는 외부 이름 공간에서 객체에 연결됩니다.
@end itemize

@geindex 파괴자

그 이름이 이미 연결되어 있으면 재연결됩니다. 이것은 기존에 연결되어 있던 객체의 참조 횟수가 0이 되도록 만들어서, 객체가 점유하던 메모리가 반납되고 파괴자(destructor) (갖고 있다면) 가 호출되도록 만들 수 있습니다.

@geindex 어트리뷰트;대입

@item 
타깃이 어트리뷰트 참조면: 참조의 프라이머리 표현식의 값을 구합니다. 이것은 대입 가능한 어트리뷰트를 가진 객체를 주어야 하는데, 그렇지 않으면 @ref{198,,TypeError} 가 일어납니다. 그에 그 객체에 주어진 어트리뷰트로 객체를 대입하도록 요청합니다; 대입을 수행할 수 없다면 예외 (보통 @ref{5ee,,AttributeError} 이지만, 꼭 그럴 필요는 없다) 를 일으킵니다.
@anchor{reference/simple_stmts attr-target-note}@anchor{2506}
주의 사항: 객체가 클래스 인스턴스이고 어트리뷰트 참조가 대입 연산자의 양쪽에서 모두 등장하면, 우변(right-hand side) 표현식, @code{a.x} 는 인스턴스 어트리뷰트나 (인스턴스 어트리뷰트가 없다면) 클래스 어트리뷰트를 액세스할 수 있습니다. 좌변(left-hand side) 타깃 @code{a.x} 는 항상 필요하면 만들어서라도 항상 인스턴스 어트리뷰트를 설정합니다. 그래서, 두 @code{a.x} 가 같은 어트리뷰트를 가리키는 것은 필요조건이 아닙니다: 우변 표현식이 클래스 어트리뷰트를 가리킨다면, 좌변은 대입의 타깃으로 새 인스턴스 어트리뷰트를 만듭니다:

@example
class Cls:
    x = 3             # 클래스 변수
inst = Cls()
inst.x = inst.x + 1   # inst.x 에 4 를 쓰고 Cls.x 는 3 으로 남겨둡니다
@end example

이 설명이 @ref{4b3,,property()} 로 만들어진 프로퍼티(property)와 같은 디스크립터 어트리뷰트에 적용될 필요는 없습니다.

@geindex 서브스크립션;대입
@geindex 객체;가변

@item 
If the target is a subscription: The primary expression in the reference is
evaluated.
Next, the subscript expression is evaluated.
Then, the primary’s @ref{14d0,,__setitem__()} method is called with
two arguments: the subscript and the assigned object.

Typically, @ref{14d0,,__setitem__()} is defined on mutable sequence objects
(such as lists) and mapping objects (such as dictionaries), and behaves as
follows.

@geindex 객체;시퀀스
@geindex 객체;리스트

프라이머리가 (리스트 같은) 가변 시퀀스 객체면, 서브 스크립트는 정수가 나와야 합니다. 음수면, 시퀀스의 길이가 더해집니다. 결괏값은 시퀀스의 길이보다 작은 음이 아닌 정수여야 하고, 시퀀스에 그 인덱스를 가진 항목에 객체를 대입하라고 요청합니다. 인덱스가 범위를 벗어나면, @ref{173a,,IndexError} 를 일으킵니다 (서브 스크립트 된 시퀀스에 대한 대입은 리스트에 새 항목을 추가할 수 없습니다).

@geindex 객체;매핑
@geindex 객체;딕셔너리

프라이머리가 (딕셔너리 같은) 매핑 객체면, 서브 스크립트는 매핑의 키 형과 호환되는 형이어야 하고, 매핑에 그 서브 스크립트를 객체에 매핑하는 키/값 쌍을 만들도록 요청합니다. 이때 같은 킷값을 갖는 기존의 키/값 쌍을 대체할 수도 있고, (같은 값의 키가 존재하지 않는 경우) 새 키/값 쌍을 삽입할 수도 있습니다.

@geindex 슬라이싱;대입

If the target is a slicing: The primary expression should evaluate to
a mutable sequence object (such as a list).
The assigned object should be @ref{142c,,iterable}.
The slicing’s lower and upper bounds should be integers; if they are @code{None}
(or not present), the defaults are zero and the sequence’s length.
If either bound is negative, the sequence’s length is added to it.  The
resulting bounds are clipped to lie between zero and the sequence’s length,
inclusive.  Finally, the sequence object is asked to replace the slice with
the items of the assigned sequence.  The length of the slice may be different
from the length of the assigned sequence, thus changing the length of the
target sequence, if the target sequence allows it.
@end itemize

설사 대입의 정의가 좌변과 우변 간의 중첩이 ‘동시적(simultaneous)’임을 (예를 들어, @code{a, b = b, a} 는 두 변수를 교환합니다) 암시해도, 대입되는 변수들의 컬렉션 `안' 에서의 중첩은 왼쪽에서 오른쪽으로 일어나서, 때로 혼동할 수 있는 결과를 낳습니다. 예를 들어, 다음과 같은 프로그램은 @code{[0, 2]} 를 인쇄합니다:

@example
x = [0, 1]
i = 0
i, x[i] = 1, 2         # i 가 갱신된 다음에, x[i] 가 갱신됩니다
print(x)
@end example


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 3132

@item PEP 3132@footnote{https://peps.python.org/pep-3132/} - 확장 이터러블 언 패킹

@code{*target} 기능에 대한 규격
@end table


@menu
* 증분 대입문(Augmented assignment statements): 증분 대입문 Augmented assignment statements. 
* 어노테이트된 대입문(Annotated assignment statements): 어노테이트된 대입문 Annotated assignment statements. 

@end menu

@node 증분 대입문 Augmented assignment statements,어노테이트된 대입문 Annotated assignment statements,,대입문
@anchor{reference/simple_stmts augassign}@anchor{2507}@anchor{reference/simple_stmts augmented-assignment-statements}@anchor{2508}
@subsubsection 증분 대입문(Augmented assignment statements)


@geindex 증분;대입
@geindex 문장;대입@comma{} 증분
@geindex +=;증분 대입
@geindex -=;증분 대입
@geindex *=;증분 대입
@geindex /=;증분 대입
@geindex %=;증분 대입
@geindex &=;증분 대입
@geindex ^=;증분 대입
@geindex |=;증분 대입
@geindex **=;증분 대입
@geindex //=;증분 대입
@geindex >>=;증분 대입
@geindex <<=;증분 대입

증분 대입문은 한 문장에서 이항 연산과 대입문을 합치는 것입니다:

@example
@anchor{reference/simple_stmts grammar-token-python-grammar-augmented_assignment_stmt}@anchor{24f4}augmented_assignment_stmt: @ref{2509,,augtarget} @ref{250a,,augop} (@ref{24e7,,expression_list} | @ref{2300,,yield_expression})
@anchor{reference/simple_stmts grammar-token-python-grammar-augtarget}@anchor{2509}augtarget:                 @ref{22be,,identifier} | @ref{24a6,,attributeref} | @ref{24a7,,subscription}
@anchor{reference/simple_stmts grammar-token-python-grammar-augop}@anchor{250a}augop:                     "+=" | "-=" | "*=" | "@@=" | "/=" | "//=" | "%=" | "**="
                           | ">>=" | "<<=" | "&=" | "^=" | "|="
@end example

(마지막 세 기호의 문법 정의는 @ref{24a4,,프라이머리} 섹션을 보십시오.)

증분 대입은 타깃 (일반 대입문과는 달리 언 패킹이 될 수 없습니다) 과 표현식 목록의 값을 구하고, 둘을 피연산자로 삼아 대입의 형에 맞는 이항 연산을 수행한 후, 원래의 타깃에 그 결과를 대입합니다. 타깃은 오직 한 번만 값이 구해집니다.

@code{x += 1} 과 같은 증분 대입문은 @code{x = x + 1} 처럼 다시 쓸 수 있는데, 정확히 같은 효과는 아니지만 비슷한 결과를 줍니다. 증분 버전에서는, @code{x} 의 값을 오직 한 번만 구합니다. 또한, 가능할 때, 실제 연산은 `제자리(in-place)' 에서 수행되는데, 새 객체를 만들고 그것을 타깃에 대입하기보다는, 예전 객체를 수정한다는 의미입니다.

일반 대입과는 달리, 증분 대입은 우변의 값을 구하기 `이전에' 좌변의 값을 구합니다. 예를 들어, @code{a[i] += f(x)} 는 처음에 @code{a[i]} 를 조회한 다음, @code{f(x)} 의 값을 구하고, 덧셈을 수행하고, 마지막으로 그 결과를 @code{a[i]} 에 다시 씁니다.

하나의 문장에서 튜플과 다중 타깃으로 대입하는 것을 예외로 하면, 증분 대입문에 의한 대입은 일반 대입과 같은 방법으로 처리됩니다. 마찬가지로, `제자리' 동작의 가능성을 예외로 하면, 증분 대입 때문에 수행되는 이진 연산은 일반 이진 연산과 같습니다.

어트리뷰트 참조인 타깃의 경우, 일반 대입처럼 @ref{2506,,클래스와 인스턴스 어트리뷰트에 관한 경고} 가 적용됩니다.

@node 어노테이트된 대입문 Annotated assignment statements,,증분 대입문 Augmented assignment statements,대입문
@anchor{reference/simple_stmts annassign}@anchor{250b}@anchor{reference/simple_stmts annotated-assignment-statements}@anchor{250c}
@subsubsection 어노테이트된 대입문(Annotated assignment statements)


@geindex 어노테이트된;대입
@geindex 문장;대입@comma{} 어노테이트된
@geindex ; (콜론);어노테이트된 변수

@ref{f4f,,어노테이션} 대입은, 한 문장에서, 변수나 어트리뷰트 어노테이션과 생략할 수 있는 대입문을 합치는 것입니다.

@example
@anchor{reference/simple_stmts grammar-token-python-grammar-annotated_assignment_stmt}@anchor{24f5}annotated_assignment_stmt: @ref{2509,,augtarget} ":" @ref{182,,expression}
                           ["=" (@ref{2484,,starred_expression} | @ref{2300,,yield_expression})]
@end example

일반 @ref{2428,,대입문} 과의 차이점은 오직 하나의 타깃만 허락된다는 것입니다.

The assignment target is considered “simple” if it consists of a single
name that is not enclosed in parentheses.
For simple assignment targets, if in class or module scope,
the annotations are gathered in a lazily evaluated
@ref{4ac,,annotation scope}. The annotations can be
evaluated using the @ref{458,,__annotations__} attribute of a
class or module, or using the facilities in the @ref{6,,annotationlib}
module.

If the assignment target is not simple (an attribute, subscript node, or
parenthesized name), the annotation is never evaluated.

이름이 함수 스코프에서 어노테이트되면, 이 이름은 그 스코프에 지역적(local)입니다. 함수 스코프에서 어노테이션은 값이 구해지거나 저장되지 않습니다.

If the right hand side is present, an annotated
assignment performs the actual assignment as if there was no annotation
present. If the right hand side is not present for an expression
target, then the interpreter evaluates the target except for the last
@ref{14d0,,__setitem__()} or @ref{2378,,__setattr__()} call.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 526

@item PEP 526@footnote{https://peps.python.org/pep-0526/} - 변수 어노테이션 문법

주석을 통해 표현하는 대신, 변수(클래스 변수와 인스턴스 변수 포함)의 형을 어노테이트 하는 문법을 추가하는 제안.

@geindex Python 향상 제안; PEP 484

@item PEP 484@footnote{https://peps.python.org/pep-0484/} - 형 힌트

정적 분석 도구와 IDE에서 사용할 수 있는 형 어노테이션에 대한 표준 문법을 제공하기 위해 @ref{10a,,typing} 모듈을 추가하는 제안.
@end table



버전 3.8에서 변경: 이제 어노테이트된 대입문은 일반 대입과 마찬가지로 우변에 같은 표현식을 허용합니다. 이전에는, (괄호 없는 튜플 표현식과 같은) 일부 표현식에서 문법 에러가 발생했습니다.



버전 3.14에서 변경: Annotations are now lazily evaluated in a separate @ref{4ac,,annotation scope}.
If the assignment target is not simple, annotations are never evaluated.


@node assert 문,pass 문<2>,대입문,단순문 Simple statements
@anchor{reference/simple_stmts assert}@anchor{b60}@anchor{reference/simple_stmts the-assert-statement}@anchor{250d}
@subsection @code{assert} 문


@geindex 문장;assert
@geindex 디버깅;어서션
@geindex @comma{} (쉼표);표현식 목록

assert 문은 프로그램에 디버깅 어서션(debugging assertion)을 삽입하는 편리한 방법입니다:

@example
@anchor{reference/simple_stmts grammar-token-python-grammar-assert_stmt}@anchor{24f2}assert_stmt: "assert" @ref{182,,expression} ["," @ref{182,,expression}]
@end example

간단한 형태, @code{assert expression} 은 다음과 동등합니다

@example
if __debug__:
    if not expression: raise AssertionError
@end example

확장된 형태, @code{assert expression1, expression2} 는 다음과 동등합니다

@example
if __debug__:
    if not expression1: raise AssertionError(expression2)
@end example

@geindex __debug__
@geindex 예외;AssertionError

이 동등성 들은 @ref{9da,,__debug__} 과 @ref{8b7,,AssertionError} 가 같은 이름의 내장 변수들을 가리킨다고 가정합니다. 현재 구현에서, 내장 변수 @code{__debug__} 은 일반적인 상황에서 @code{True} 이고, 최적화가 요청되었을 때 (명령행 옵션 @ref{18c,,-O}) @code{False} 입니다. 현재의 코드 생성기는 컴파일 시점에 최적화가 요청되면 @ref{b60,,assert} 문을 위한 코드를 만들지 않습니다. 에러 메시지에 실패한 표현식의 소스 코드를 포함할 필요가 없음에 주의하십시오; 그것은 스택 트레이스의 일부로 출력됩니다.

@ref{9da,,__debug__} 에 대한 대입은 허락되지 않습니다. 이 내장 변수의 값은 인터프리터가 시작할 때 결정됩니다.

@node pass 문<2>,del 문<2>,assert 문,단순문 Simple statements
@anchor{reference/simple_stmts pass}@anchor{17e}@anchor{reference/simple_stmts the-pass-statement}@anchor{250e}
@subsection @code{pass} 문


@geindex 문장;pass
@geindex 널;연산
@geindex 널;연산

@example
@anchor{reference/simple_stmts grammar-token-python-grammar-pass_stmt}@anchor{24f6}pass_stmt: "pass"
@end example

@ref{17e,,pass} 는 널(null) 연산입니다 — 실행될 때, 아무런 일도 일어나지 않습니다. 문법적으로 문장이 필요하기는 하지만 할 일은 없을 때, 자리를 채우는 용도로 쓸모가 있습니다, 예를 들어:

@example
def f(arg): pass    # (아직은) 아무것도 하지 않는 함수

class C: pass       # (아직은) 메서드가 없는 클래스
@end example

@node del 문<2>,return 문,pass 문<2>,단순문 Simple statements
@anchor{reference/simple_stmts del}@anchor{1b1d}@anchor{reference/simple_stmts the-del-statement}@anchor{250f}
@subsection @code{del} 문


@geindex 문장;del
@geindex 삭제;타깃
@geindex 삭제;타깃;리스트

@example
@anchor{reference/simple_stmts grammar-token-python-grammar-del_stmt}@anchor{24f7}del_stmt: "del" @ref{2488,,target_list}
@end example

삭제는 대입이 정의된 방식과 아주 비슷하게 재귀적으로 정의됩니다. 전체 세부 사항들을 나열하는 대신, 여기 몇 가지 힌트가 있습니다.

타깃 목록의 삭제는 각 타깃을 왼쪽에서 오른쪽으로 재귀적으로 삭제합니다.

@geindex 문장;전역
@geindex 연결 해제;이름

Deletion of a name removes the binding of that name from the local or global
namespace, depending on whether the name occurs in a @ref{4ad,,global} statement
in the same code block.  Trying to delete an unbound name raises a
@ref{452,,NameError} exception.

@geindex 어트리뷰트;삭제

Deletion of attribute references and subscriptions is passed to the
primary object involved; deletion of a slicing is in general equivalent to
assignment of an empty slice of the right type (but even this is determined by
the sliced object).


버전 3.2에서 변경: 예전에는 이름이 중첩된 블록에서 자유 변수로 등장하는 경우 지역 이름 공간에서 삭제하는 것이 허락되지 않았습니다.


@node return 문,yield 문,del 문<2>,단순문 Simple statements
@anchor{reference/simple_stmts return}@anchor{1af}@anchor{reference/simple_stmts the-return-statement}@anchor{2510}
@subsection @code{return} 문


@geindex 문장;return
@geindex 함수;정의
@geindex 클래스;정의

@example
@anchor{reference/simple_stmts grammar-token-python-grammar-return_stmt}@anchor{24f8}return_stmt: "return" [@ref{24e7,,expression_list}]
@end example

@ref{1af,,return} 은 문법적으로 클래스 정의에 중첩된 경우가 아니라, 함수 정의에만 중첩되어 나타날 수 있습니다.

표현식 목록이 있으면 값을 구하고, 그렇지 않으면 @code{None} 으로 치환됩니다.

@ref{1af,,return} 은 표현식 목록 (또는 @code{None})을 반환 값으로 해서, 현재의 함수 호출을 떠납니다.

@geindex 키워드;finally

@ref{1af,,return} 이 @ref{1b0,,finally} 절을 가진 @ref{8f7,,try} 문에서 제어가 벗어나도록 만드는 경우, 함수로부터 진짜로 벗어나기 전에 그 @code{finally} 절이 실행됩니다.

제너레이터 함수에서, @ref{1af,,return} 문은 제너레이터가 끝났음을 가리키고, @ref{df4,,StopIteration} 예외를 일으킵니다. return 문에 제공되는 값은 (있다면) @code{StopIteration} 의 생성자에 인자로 전달되어 @ref{2417,,StopIteration.value} 어트리뷰트가 됩니다.

비동기 제너레이터 함수에서, 빈 @ref{1af,,return} 문은 비동기 제너레이터가 끝났음을 알리고, @ref{1e0c,,StopAsyncIteration} 예외를 일으킵니다. 비동기 제너레이터 함수에서, 비어있지 않은 @code{return} 은 문법 에러입니다.

@node yield 문,raise 문,return 문,단순문 Simple statements
@anchor{reference/simple_stmts the-yield-statement}@anchor{2511}@anchor{reference/simple_stmts yield}@anchor{bc1}
@subsection @code{yield} 문


@geindex 문장;yield
@geindex 제너레이터;함수
@geindex 제너레이터;이터레이터
@geindex 함수;제너레이터
@geindex 예외;StopIteration

@example
@anchor{reference/simple_stmts grammar-token-python-grammar-yield_stmt}@anchor{24f9}yield_stmt: @ref{2300,,yield_expression}
@end example

@ref{bc1,,yield} 문은 @ref{2498,,yield 표현식} 과 같은 의미가 있습니다. 동등한 yield 표현식에서 필요로 하는 괄호를 생략하기 위해 @code{yield} 문을 사용합니다. 예를 들어, yield 문

@example
yield <expr>
yield from <expr>
@end example

은 다음과 같은 yield 표현식 문장들과 동등합니다

@example
(yield <expr>)
(yield from <expr>)
@end example

yield 표현식과 문장은 @ref{1260,,제너레이터} 함수를 정의할 때만 사용되고, 제너레이터 함수의 바디에서만 사용됩니다. 함수 정의가 일반 함수 대신 제너레이터 함수를 만들도록 하는 데는 @ref{bc1,,yield}를 사용하는 것만으로 충분합니다.

@ref{bc1,,yield} 의 뜻에 대한 전체 세부 사항들은 @ref{2498,,일드 표현식(Yield expressions)} 섹션을 참고하면 됩니다.

@node raise 문,break 문,yield 문,단순문 Simple statements
@anchor{reference/simple_stmts raise}@anchor{802}@anchor{reference/simple_stmts the-raise-statement}@anchor{2512}
@subsection @code{raise} 문


@geindex 문장;raise
@geindex 예외
@geindex 예외 일으키기;예외
@geindex __traceback__ (예외 어트리뷰트)

@example
@anchor{reference/simple_stmts grammar-token-python-grammar-raise_stmt}@anchor{24fa}raise_stmt: "raise" [@ref{182,,expression} ["from" @ref{182,,expression}]]
@end example

표현식이 주어지지 않으면, @ref{802,,raise} 는, `활성 예외'라고도 부르는, 현재 처리 중인 예외를 다시 일으킵니다. 현재 활성 예외가 없다면, 이것이 에러라는 것을 알리기 위해 @ref{244,,RuntimeError} 예외를 일으킵니다.

그렇지 않으면, @ref{802,,raise} 는 예외 객체로, 첫 번째 표현식의 값을 구합니다. @ref{7d6,,BaseException} 의 서브 클래스나 인스턴스여야 합니다. 클래스면, 예외 인스턴스는 필요할 때 인자 없이 클래스의 인스턴스를 만들어서 사용됩니다.

예외의 형(`type')은 예외 인스턴스의 클래스고, 값(`value')은 인스턴스 자신입니다.

@geindex 객체;traceback

트레이스백 객체는 보통 예외가 일어날 때 자동으로 만들어지고 @ref{14cb,,__traceback__} 어트리뷰트로 첨부됩니다. 다음과 같이, @ref{2513,,with_traceback()} 예외 메서드를 사용하면, 예외를 만들고 트레이스백을 직접 설정하는 것을 한 번에 할 수 있습니다 (같은 예외 인스턴스를 돌려주는데, 그 인자값으로 트레이스백을 설정해줍니다):

@example
raise Exception("foo occurred").with_traceback(tracebackobj)
@end example

@geindex 예외;연쇄
@geindex __cause__ (예외 어트리뷰트)
@geindex __context__ (예외 어트리뷰트)

@code{from} 절은 예외 연쇄(exception chaining)에 사용됩니다. 주어진다면, 두 번째 `표현식(expression)' 은 또 하나의 예외 클래스나 인스턴스여야 합니다. 두 번째 표현식이 예외 인스턴스면, 발생한 예외에 (쓰기 가능한) @ref{14cd,,__cause__} 어트리뷰트로 첨부됩니다. 표현식이 예외 클래스면, 클래스가 인스턴스화되어 만들어진 예외 인스턴스가 발생한 예외에 @code{__cause__} 어트리뷰트로 첨부됩니다. 발생한 예외가 처리되지 않으면, 두 예외가 모두 인쇄됩니다:

@example
>>> try:
...     print(1 / 0)
... except Exception as exc:
...     raise RuntimeError("Something bad happened") from exc
...
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
    print(1 / 0)
          ~~^~~
ZeroDivisionError: division by zero

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "<stdin>", line 4, in <module>
    raise RuntimeError("Something bad happened") from exc
RuntimeError: Something bad happened
@end example

예외가 이미 처리되고 있을 때 새 예외가 발생하면 비슷한 메커니즘이 묵시적으로 적용됩니다. @ref{1ab,,except} 나 @ref{1b0,,finally} 절 또는 @ref{186,,with} 문이 사용될 때 예외가 처리될 수 있습니다. 앞선 예외가 새 예외의 @ref{14cc,,__context__} 어트리뷰트로 첨부됩니다:

@example
>>> try:
...     print(1 / 0)
... except:
...     raise RuntimeError("Something bad happened")
...
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
    print(1 / 0)
          ~~^~~
ZeroDivisionError: division by zero

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<stdin>", line 4, in <module>
    raise RuntimeError("Something bad happened")
RuntimeError: Something bad happened
@end example

예외 연쇄는 @code{from} 절에 @ref{884,,None} 을 지정해서 명시적으로 중지시킬 수 있습니다:

@example
>>> try:
...     print(1 / 0)
... except:
...     raise RuntimeError("Something bad happened") from None
...
Traceback (most recent call last):
  File "<stdin>", line 4, in <module>
RuntimeError: Something bad happened
@end example

예외에 대한 더 많은 정보를 @ref{2434,,예외} 섹션에서 발견할 수 있고, 예외를 처리하는 것에 대한 정보는 @ref{8f7,,try 문} 섹션에 있습니다.


버전 3.3에서 변경: 이제 @code{raise X from Y} 에서 @code{Y} 로 @ref{884,,None} 이 허락됩니다.

예외 문맥(exception context)의 자동 출력을 제한할 수 있는 @ref{2514,,__suppress_context__} 어트리뷰트를 추가했습니다.



버전 3.11에서 변경: If the traceback of the active exception is modified in an @ref{1ab,,except}
clause, a subsequent @code{raise} statement re-raises the exception with the
modified traceback. Previously, the exception was re-raised with the
traceback it had when it was caught.


@node break 문,continue 문,raise 문,단순문 Simple statements
@anchor{reference/simple_stmts break}@anchor{17f}@anchor{reference/simple_stmts the-break-statement}@anchor{2515}
@subsection @code{break} 문


@geindex 문장;break
@geindex 문장;for
@geindex 문장;while
@geindex 루프;문장

@example
@anchor{reference/simple_stmts grammar-token-python-grammar-break_stmt}@anchor{24fb}break_stmt: "break"
@end example

@ref{17f,,break} 는 문법적으로 @ref{34a,,for} 나 @ref{1974,,while} 루프에 중첩되어서만 나타날 수 있습니다. 하지만 그 루프 안의 함수나 클래스 정의에 중첩되지는 않습니다.

@geindex 키워드;else
@geindex 루프 제어;타깃

가장 가까이서 둘러싸고 있는 루프를 종료하고, 그 루프가 @code{else} 절을 갖고 있다면 건너뜁니다(skip).

@ref{34a,,for} 루프가 @ref{17f,,break} 로 종료되면, 루프 제어 타깃은 현재값을 유지합니다.

@geindex 키워드;finally

@ref{17f,,break} 가 @ref{1b0,,finally} 절을 가 @ref{8f7,,try} 문에서 제어가 벗어나도록 만드는 경우, 루프로부터 진짜로 벗어나기 전에 그 @code{finally} 절이 실행됩니다.

@node continue 문,임포트 import 문,break 문,단순문 Simple statements
@anchor{reference/simple_stmts continue}@anchor{180}@anchor{reference/simple_stmts the-continue-statement}@anchor{2516}
@subsection @code{continue} 문


@geindex 문장;continue
@geindex 문장;for
@geindex 문장;while
@geindex 루프;문장
@geindex 키워드;finally

@example
@anchor{reference/simple_stmts grammar-token-python-grammar-continue_stmt}@anchor{24fc}continue_stmt: "continue"
@end example

@ref{180,,continue} 는 문법적으로 @ref{34a,,for} 나 @ref{1974,,while} 루프에 중첩되어서만 나타날 수 있습니다. 하지만 그 루프 안의 함수나 클래스 정의에 중첩되지는 않습니다. 가장 가까이서 둘러싸고 있는 루프가 다음 사이클로 넘어가도록 만듭니다.

@ref{180,,continue} 가 @ref{1b0,,finally} 절을 가진 @ref{8f7,,try} 문에서 제어가 벗어나도록 만드는 경우, 다음 루트 사이클을 시작하기 전에 그 @code{finally} 절이 실행됩니다.
@anchor{reference/simple_stmts import}@anchor{7f7}
@node 임포트 import 문,global 문,continue 문,단순문 Simple statements
@anchor{reference/simple_stmts from}@anchor{14b0}@anchor{reference/simple_stmts the-import-statement}@anchor{2517}
@subsection 임포트(@code{import}) 문


@geindex 문장;import
@geindex 모듈;임포트하기
@geindex 이름;연결
@geindex 키워드;from
@geindex 키워드;as
@geindex 예외;ImportError
@geindex @comma{} (쉼표);임포트 문

@example
@anchor{reference/simple_stmts grammar-token-python-grammar-import_stmt}@anchor{24fd}import_stmt:     "import" @ref{2518,,module} ["as" @ref{22be,,identifier}] ("," @ref{2518,,module} ["as" @ref{22be,,identifier}])*
                 | "from" @ref{2519,,relative_module} "import" @ref{22be,,identifier} ["as" @ref{22be,,identifier}]
                 ("," @ref{22be,,identifier} ["as" @ref{22be,,identifier}])*
                 | "from" @ref{2519,,relative_module} "import" "(" @ref{22be,,identifier} ["as" @ref{22be,,identifier}]
                 ("," @ref{22be,,identifier} ["as" @ref{22be,,identifier}])* [","] ")"
                 | "from" @ref{2519,,relative_module} "import" "*"
@anchor{reference/simple_stmts grammar-token-python-grammar-module}@anchor{2518}module:          (@ref{22be,,identifier} ".")* @ref{22be,,identifier}
@anchor{reference/simple_stmts grammar-token-python-grammar-relative_module}@anchor{2519}relative_module: "."* @ref{2518,,module} | "."+
@end example

(@ref{14b0,,from} 절이 없는) 기본 임포트 문은 두 단계로 실행됩니다:


@enumerate 

@item 
모듈을 찾고, 로드하고, 필요하면 초기화합니다

@item 
임포트(@ref{7f7,,import}) 문이 등장한 스코프의 지역 이름 공간에 이름이나 이름들을 정의합니다.
@end enumerate

문장이 (쉼표로 분리된) 여러 개의 절을 포함하면, 마치 각 절이 별도의 임포트 문에 의해 분리된 것처럼, 두 단계는 절마다 별도로 수행됩니다.

첫 번째 단계, 모듈을 찾고 로드하는 것의 세부 사항은 @ref{235d,,임포트 시스템} 에 있는 섹션에서 아주 상세하게 설명하는데, 임포트될 수 있는 여러 종류의 패키지와 모듈들과 임포트 시스템을 커스터마이즈하는데 사용될 수 있는 모든 훅에 관해서도 설명하고 있습니다.

요청된 모듈이 성공적으로 읽어 들여지면, 세 가지 중 한 방법으로 지역 이름 공간에 소개됩니다:

@geindex as;임포트 문


@itemize *

@item 
모듈 이름 뒤에 @code{as} 가 오면, @code{as} 뒤에 오는 이름이 임포트된 모듈에 직접 연결됩니다.

@item 
다른 이름이 지정되지 않고, 임포트되는 모듈이 최상위 모듈이면, 모듈의 이름이 임포트되는 모듈에 대한 참조로 지역 이름 공간에 연결됩니다.

@item 
임포트되는 모듈이 최상이 모듈이 `아니' 라면, 그 모듈을 포함하는 최상위 패키지의 이름이 최상위 패키지에 대한 참조로 지역 이름 공간에 연결됩니다. 임포트된 모듈은 직접적이기보다는 완전히 정규화된 이름(full qualified name)을 통해 액세스 되어야 합니다.
@end itemize

@geindex 이름;연결
@geindex from;임포트 문

@ref{14b0,,from} 형은 약간 더 복잡한 절차를 사용합니다:


@enumerate 

@item 
@ref{14b0,,from} 절에 지정된 모듈을 찾고, 로드하고, 필요하면 초기화합니다

@item 
@ref{7f7,,import} 절에 지정된 식별자들 각각에 대해:


@enumerate 

@item 
임포트된 모듈이 그 이름의 어트리뷰트를 가졌는지 검사합니다

@item 
없으면, 그 이름의 서브 모듈을 임포트하는 것을 시도한 다음 임포트된 모듈에서 그 어트리뷰트를 다시 검사합니다

@item 
어트리뷰트가 발견되지 않으면 @ref{659,,ImportError} 를 일으킵니다.

@item 
그렇지 않으면, 그 값에 대한 참조가 지역 이름 공간에 저장되는데, @code{as} 절이 존재하면 거기에서 지정된 이름을 사용하고, 그렇지 않으면 어트리뷰트 이름을 사용합니다
@end enumerate
@end enumerate

사용 예:

@example
import foo                 # foo 가 임포트되고 지역적으로 연결됩니다
import foo.bar.baz         # foo, foo.bar, foo.bar.baz 가 임포트되고, foo 가 지역적으로 연결됩니다
import foo.bar.baz as fbb  # foo, foo.bar, foo.bar.baz 가 임포트되고, foo.bar.baz 가 fbb 로 연결됩니다
from foo.bar import baz    # foo, foo.bar, foo.bar.baz 가 임포트되고, foo.bar.baz 가 baz 로 연결됩니다
from foo import attr       # foo 가 임포트되고 foo.attr 이 attr 로 연결됩니다
@end example

@geindex * (애스터리스크);임포트 문

식별자들의 목록을 스타 (@code{'*'}) 로 바꾸면, 모듈에 정의된 모든 공개 이름들이 @ref{7f7,,import} 문이 등장한 스코프의 지역 이름 공간에 연결됩니다.

@geindex __all__ (선택적 모듈 어트리뷰트)

@geindex __all__ (module의 속성)
@anchor{reference/simple_stmts module __all__}@anchor{f3a}
The `public names' defined by a module are determined by checking the module’s
namespace for a variable named @code{__all__}; if defined, it must be a sequence
of strings which are names defined or imported by that module.
Names containing non-ASCII characters must be in the normalization form@footnote{https://www.unicode.org/reports/tr15/#Norm_Forms}
NFKC; see @ref{22ba,,Non-ASCII characters in names} for details.  The names
given in @code{__all__} are all considered public and are required to exist.  If
@code{__all__} is not defined, the set of public names includes all names found
in the module’s namespace which do not begin with an underscore character
(@code{'_'}).  @code{__all__} should contain the entire public API. It is intended
to avoid accidentally exporting items that are not part of the API (such as
library modules which were imported and used within the module).

임포트의 와일드카드 형태 — @code{from module import *} — 는 모듈 수준에서만 허락됩니다. 클래스나 함수 정의에서 사용하려는 시도는 @ref{18e,,SyntaxError} 를 일으킵니다.

@geindex 상대적;import

임포트할 모듈을 지정할 때 모듈의 절대 이름(absolute name)을 지정할 필요는 없습니다. 모듈이나 패키지가 다른 패키지 안에 포함될 때, 같은 상위 패키지 내에서는 그 패키지 이름을 언급할 필요 없이 상대 임포트(relative import)를 할 수 있습니다. @ref{14b0,,from} 뒤에 지정되는 패키지나 모듈 앞에 붙이는 점으로, 정확한 이름을 지정하지 않고도 현재 패키지 계층을 얼마나 거슬러 올라가야 하는지 지정할 수 있습니다. 하나의 점은 이 임포트를 하는 모듈이 존재하는 현재 패키지를 뜻합니다. 두 개의 점은 한 패키지 수준을 거슬러 올라가는 것을 뜻합니다. 세 개의 점은 두 개의 수준을, 등등입니다. 그래서 @code{pkg} 패키지에 있는 모듈에서 @code{from . import mod} 를 실행하면, @code{pkg.mod} 를 임포트하게 됩니다. @code{pkg.subpkg1} 안에서 @code{from ..subpkg2 import mod} 를 실행하면 @code{pkg.subpkg2.mod} 를 임포트하게 됩니다. 상대 임포트에 대한 규격은 @ref{245e,,패키지 상대 임포트} 절에 들어있습니다.

로드할 모듈들을 동적으로 결정하는 응용 프로그램들을 지원하기 위해 @ref{73b,,importlib.import_module()} 이 제공됩니다.

인자 @code{module}, @code{filename}, @code{sys.path}, @code{sys.meta_path}, @code{sys.path_hooks}로 @ref{1c6c,,감사 이벤트} @code{import}를 발생시킵니다.

@menu
* 퓨처 문:: 

@end menu

@node 퓨처 문,,,임포트 import 문
@anchor{reference/simple_stmts future}@anchor{45d}@anchor{reference/simple_stmts future-statements}@anchor{251a}
@subsubsection 퓨처 문


@geindex 퓨처;문장
@geindex __future__;퓨처 문

퓨처 문(`future statement')은 컴파일러가 특정한 모듈을 특별한 문법이나 개념을 사용해서 컴파일하도록 만드는 지시어(directive)인데, 그 기능은 미래에 출시되는 파이썬에서 표준이 되는 것입니다.

퓨처 문의 목적은 언어에 호환되지 않는 변경이 도입된 미래 버전의 파이썬으로 옮겨가는 것을 쉽게 만드는 것입니다. 그 기능이 표준이 되는 배포 이전에 모듈 단위로 새 기능을 사용할 수 있도록 만듭니다.

@example
@anchor{reference/simple_stmts grammar-token-python-grammar-future_stmt}@anchor{24fe}future_stmt: "from" "__future__" "import" @ref{251b,,feature} ["as" @ref{22be,,identifier}]
             ("," @ref{251b,,feature} ["as" @ref{22be,,identifier}])*
             | "from" "__future__" "import" "(" @ref{251b,,feature} ["as" @ref{22be,,identifier}]
             ("," @ref{251b,,feature} ["as" @ref{22be,,identifier}])* [","] ")"
@anchor{reference/simple_stmts grammar-token-python-grammar-feature}@anchor{251b}feature:     @ref{22be,,identifier}
@end example

퓨처 문은 모듈의 거의 처음에 나와야 합니다. 퓨처 문 앞에 나올 수 있는 줄들은:


@itemize *

@item 
모듈 독스트링(docstring) (있다면),

@item 
주석

@item 
빈 줄, 그리고

@item 
다른 퓨처 문들
@end itemize

퓨처 문을 사용해야 하는 유일한 기능은 @code{annotations} 입니다 (
@geindex Python 향상 제안; PEP 563
PEP 563@footnote{https://peps.python.org/pep-0563/}을 참조하십시오).

과거에 퓨처 문을 통해 활성화되던 기능들은 여전히 파이썬 3에 의해 인식됩니다. 이 목록에는 @code{absolute_import}, @code{division}, @code{generators}, @code{generator_stop}, @code{unicode_literals}, @code{print_function}, @code{nested_scopes} 및 @code{with_statement} 가 포함됩니다. 이것들은 잉여물인데 항상 활성화되고, 오직 과거 호환성을 위해 유지되고 있기 때문입니다.

퓨처 문은 구체적으로는 컴파일 시점에 인식되고 다뤄집니다: 핵심 구성물들의 의미에 대한 변경은 종종 다른 코드 생성을 통해 구현됩니다. 새 기능이 호환되지 않는 (새로운 예약어처럼) 새로운 문법을 도입하는 경우조차 가능한데, 이 경우는 컴파일러가 모듈을 다르게 파싱할 수 있습니다. 그런 결정들은 실행 시점으로 미뤄질 수 없습니다..

배포마다, 컴파일러는 어떤 기능 이름들이 정의되어 있는지 알고, 만약 퓨처 문이 알지 못하는 기능을 포함하고 있으면 컴파일 시점 에러를 일으킵니다.

직접적인 실행 시점의 개념은 다른 임포트 문들과 같습니다: 표준 모듈 @ref{0,,__future__}, 후에 설명합니다, 다 있고, 퓨처 문이 실행되는 시점에 일반적인 방법으로 임포트됩니다.

흥미로운 실행 시점의 개념들은 퓨처 문에 의해 활성화되는 구체적인 기능들에 달려있습니다.

이런 문장에는 아무것도 특별한 것이 없음에 주의해야 합니다:

@example
import __future__ [as name]
@end example

이것은 퓨처 문이 아닙니다; 아무런 특별한 개념이나 문법적인 제약이 없는 평범한 임포트 문일 뿐입니다.

퓨처 문을 포함하는 모듈 @code{M} 에 등장하는 내장 함수 @ref{4a3,,exec()} 와 @ref{4b2,,compile()} 를 호출해서 컴파일되는 코드는, 기본적으로는, 퓨처 문이 지정하는 새 문법과 개념을 사용합니다. 이것은 @code{compile()} 에 주는 생략 가능한 인자로 제어될 수 있습니다 — 자세한 내용은 그 함수의 문서를 보십시오.

대화형 인터프리터 프롬프트에서 입력된 퓨처 문은 인터프리터 세션의 남은 기간 효과를 발생시킵니다. 인터프리터가 @ref{16e0,,-i}, 실행할 스크립트 이름이 전달됩니다, 옵션으로 시작하고, 그 스크립트가 퓨처 문을 포함하면, 스크립트가 실행된 이후에 시작되는 대화형 세션에서도 효과를 유지합니다.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 236

@item PEP 236@footnote{https://peps.python.org/pep-0236/} - 백 투 더 __future__

__future__ 메커니즘에 대한 최초의 제안.
@end table


@node global 문,nonlocal 문,임포트 import 문,단순문 Simple statements
@anchor{reference/simple_stmts global}@anchor{4ad}@anchor{reference/simple_stmts the-global-statement}@anchor{251c}
@subsection @code{global} 문


@geindex 문장;전역
@geindex 전역;이름;연결
@geindex @comma{} (쉼표);식별자 목록

@example
@anchor{reference/simple_stmts grammar-token-python-grammar-global_stmt}@anchor{24ff}global_stmt: "global" @ref{22be,,identifier} ("," @ref{22be,,identifier})*
@end example

@ref{4ad,,global} 문은 나열된 식별자들이 전역으로 해석되도록 만듭니다. global 선언 없이 자유 변수들이 전역을 가리킬 수 있기는 하지만, @code{global} 없이 전역 변수에 값을 대입하는 것은 불가능합니다.

The @code{global} statement applies to the entire current scope
(module, function body or class definition).
A @ref{18e,,SyntaxError} is raised if a variable is used or
assigned to prior to its global declaration in the scope.

At the module level, all variables are global, so a @code{global}
statement has no effect.
However, variables must still not be used or
assigned to prior to their @code{global} declaration.
This requirement is relaxed in the interactive prompt (@ref{492,,REPL}).

@geindex 내장 함수;exec
@geindex 내장 함수;eval
@geindex 내장 함수;컴파일

`프로그래머의 주의 사향:' @ref{4ad,,global} 은 파서에 주는 지시자(directive)입니다. @code{global} 문과 같은 시점에 파싱되는 코드에만 적용됩니다. 특히, 내장 @ref{4a3,,exec()} 함수로 공급되는 문자열이나 코드 객체에 포함된 @code{global} 문은 그 함수 호출을 `포함하는' 코드 블록에는 영향을 주지 않고, 그런 문자열에 포함된 코드 역시 함수 호출을 포함하는 코드에 있는 @code{global} 문에 영향을 받지 않습니다. @ref{4a4,,eval()} 과 @ref{4b2,,compile()} 함수들도 마찬가지입니다.

@node nonlocal 문,type 문,global 문,단순문 Simple statements
@anchor{reference/simple_stmts nonlocal}@anchor{14ac}@anchor{reference/simple_stmts the-nonlocal-statement}@anchor{251d}
@subsection @code{nonlocal} 문


@geindex 문장;nonlocal
@geindex @comma{} (쉼표);식별자 목록

@example
@anchor{reference/simple_stmts grammar-token-python-grammar-nonlocal_stmt}@anchor{2500}nonlocal_stmt: "nonlocal" @ref{22be,,identifier} ("," @ref{22be,,identifier})*
@end example

When the definition of a function or class is nested (enclosed) within
the definitions of other functions, its nonlocal scopes are the local
scopes of the enclosing functions. The @ref{14ac,,nonlocal} statement
causes the listed identifiers to refer to names previously bound in
nonlocal scopes. It allows encapsulated code to rebind such nonlocal
identifiers.  If a name is bound in more than one nonlocal scope, the
nearest binding is used. If a name is not bound in any nonlocal scope,
or if there is no nonlocal scope, a @ref{18e,,SyntaxError} is raised.

The @ref{14ac,,nonlocal} statement applies to the entire scope of a function or
class body. A @ref{18e,,SyntaxError} is raised if a variable is used or
assigned to prior to its nonlocal declaration in the scope.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 3104

@item PEP 3104@footnote{https://peps.python.org/pep-3104/} - 바깥 스코프에 있는 이름들에 대한 액세스

@ref{14ac,,nonlocal} 문의 규격.
@end table


`Programmer’s note:' @ref{14ac,,nonlocal} is a directive to the parser
and applies only to code parsed along with it.  See the note for the
@ref{4ad,,global} statement.

@node type 문,,nonlocal 문,단순문 Simple statements
@anchor{reference/simple_stmts the-type-statement}@anchor{251e}@anchor{reference/simple_stmts type}@anchor{66b}
@subsection @code{type} 문


@geindex 문장;형

@example
@anchor{reference/simple_stmts grammar-token-python-grammar-type_stmt}@anchor{2501}type_stmt: 'type' @ref{22be,,identifier} [@ref{251f,,type_params}] "=" @ref{182,,expression}
@end example

The @code{type} statement declares a type alias, which is an instance
of @ref{2ae,,typing.TypeAliasType}.

For example, the following statement creates a type alias:

@example
type Point = tuple[float, float]
@end example

This code is roughly equivalent to:

@example
annotation-def VALUE_OF_Point():
    return tuple[float, float]
Point = typing.TypeAliasType("Point", VALUE_OF_Point())
@end example

@code{annotation-def} indicates an @ref{4ac,,annotation scope}, which behaves
mostly like a function, but with several small differences.

The value of the
type alias is evaluated in the annotation scope. It is not evaluated when the
type alias is created, but only when the value is accessed through the type alias’s
@code{__value__} attribute (see @ref{684,,Lazy evaluation}).
This allows the type alias to refer to names that are not yet defined.

Type aliases may be made generic by adding a @ref{5ac,,type parameter list}
after the name. See @ref{683,,Generic type aliases} for more.

@code{type} is a @ref{a0d,,soft keyword}.


Added in version 3.12.



@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 695

@item PEP 695@footnote{https://peps.python.org/pep-0695/} - Type Parameter Syntax

Introduced the @code{type} statement and syntax for
generic classes and functions.
@end table


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 복합문 Compound statements,최상위 요소들,단순문 Simple statements,파이썬 언어 레퍼런스
@anchor{reference/compound_stmts doc}@anchor{2520}@anchor{reference/compound_stmts compound}@anchor{2521}@anchor{reference/compound_stmts compound-statements}@anchor{2522}@anchor{reference/compound_stmts translation-repo}@anchor{2523}
@section 복합문(Compound statements)


@geindex compound;statement

복합문은 다른 문장들(의 그룹들)을 포함합니다; 어떤 방법으로 그 다른 문장들의 실행에 영향을 주거나 제어합니다. 간단하게 표현할 때, 전체 복합문을 한 줄로 쓸 수 있기는 하지만, 일반적으로 복합문은 여러 줄에 걸칩니다.

@ref{181,,if}, @ref{1974,,while}, @ref{34a,,for} 문장은 전통적인 제어 흐름 구조를 구현합니다. 문장들의 그룹에 대해 @ref{8f7,,try} 는 예외 처리기나 정리(cleanup) 코드 또는 그 둘 모두를 지정하는 반면, @ref{186,,with} 문은 코드 블록 주변으로 초기화와 파이널리제이션 코드를 실행할 수 있도록 합니다. 함수와 클래스 정의 또한 문법적으로 복합문입니다.

@geindex clause
@geindex suite
@geindex ; (semicolon)

복합문은 하나나 그 이상의 ‘절’로 구성됩니다. 절은 헤더와 ‘스위트(suite)’로 구성됩니다. 특정 복합문의 절 헤더들은 모두 같은 들여쓰기 수준을 갖습니다. 각 절 헤더는 특별하게 식별되는 키워드로 시작하고 콜론으로 끝납니다. 스위트는 절에 의해 제어되는 문장들의 그룹입니다. 스위트는 헤더의 콜론 뒤에서 같은 줄에 세미콜론으로 분리된 하나나 그 이상의 단순문일 수 있습니다. 또는 그다음 줄에 들여쓰기 된 하나나 그 이상의 문장들일 수도 있습니다. 오직 후자의 형태만 중첩된 복합문을 포함할 수 있습니다; 다음과 같은 것은 올바르지 않은데, 대체로 뒤따르는 @ref{17c,,else} 절이 있다면 어떤 @ref{181,,if} 절에 속하는지 명확하지 않기 때문입니다.

@example
if test1: if test2: print(x)
@end example

또한, 이 문맥에서 세미콜론이 콜론보다 더 강하게 결합해서, 다음과 같은 예에서, @ref{1174,,print()} 호출들은 모두 실행되거나 어느 하나도 실행되지 않습니다는 것에 주의해야 합니다:

@example
if x < y < z: print(x); print(y); print(z)
@end example

요약하면:

@example
@anchor{reference/compound_stmts grammar-token-python-grammar-compound_stmt}@anchor{2524}compound_stmt: @ref{2525,,if_stmt}
               | @ref{2526,,while_stmt}
               | @ref{2527,,for_stmt}
               | @ref{2528,,try_stmt}
               | @ref{2529,,with_stmt}
               | @ref{252a,,match_stmt}
               | @ref{252b,,funcdef}
               | @ref{252c,,classdef}
               | @ref{252d,,async_with_stmt}
               | @ref{252e,,async_for_stmt}
               | @ref{252f,,async_funcdef}
@anchor{reference/compound_stmts grammar-token-python-grammar-suite}@anchor{2530}suite:         @ref{2531,,stmt_list} NEWLINE | NEWLINE INDENT @ref{2532,,statement}+ DEDENT
@anchor{reference/compound_stmts grammar-token-python-grammar-statement}@anchor{2532}statement:     @ref{2531,,stmt_list} NEWLINE | @ref{2524,,compound_stmt}
@anchor{reference/compound_stmts grammar-token-python-grammar-stmt_list}@anchor{2531}stmt_list:     @ref{24f0,,simple_stmt} (";" @ref{24f0,,simple_stmt})* [";"]
@end example

@geindex NEWLINE token
@geindex DEDENT token
@geindex dangling;else

문장들이 항상 @code{NEWLINE} 으로 끝나고 @code{DEDENT} 가 그 뒤를 따를 수 있음에 주목해야 합니다. 또한, 생략 가능한 연결 절들이 항상 문장을 시작시킬 수 없는 키워드로 시작하기 때문에, 모호함이 없다는 것도 주목하세요 (파이썬에서는 중첩된 @ref{181,,if} 문이 들여쓰기 되는 것을 요구함으로써 ‘매달린(dangling) @ref{17c,,else}’ 문제를 해결합니다).

명확함을 위해 다음에 오는 절들에서 나오는 문법 규칙들은 각 절을 별도의 줄에 놓도록 포매팅합니다.
@anchor{reference/compound_stmts if}@anchor{181}@anchor{reference/compound_stmts elif}@anchor{17b}
@menu
* if 문: if 문<2>. 
* while 문:: 
* for 문: for 문<2>. 
* try 문:: 
* with 문:: 
* The match statement:: 
* 함수 정의:: 
* 클래스 정의:: 
* 코루틴:: 
* Type parameter lists:: 
* Annotations: Annotations<2>. 

@end menu

@node if 문<2>,while 문,,복합문 Compound statements
@anchor{reference/compound_stmts else}@anchor{17c}@anchor{reference/compound_stmts the-if-statement}@anchor{2533}
@subsection @code{if} 문


@geindex statement;if
@geindex keyword;elif
@geindex keyword;else
@geindex ; (colon);compound statement

@ref{181,,if} 문은 조건부 실행에 사용됩니다:

@example
@anchor{reference/compound_stmts grammar-token-python-grammar-if_stmt}@anchor{2525}if_stmt: "if" @ref{242e,,assignment_expression} ":" @ref{2530,,suite}
         ("elif" @ref{242e,,assignment_expression} ":" @ref{2530,,suite})*
         ["else" ":" @ref{2530,,suite}]
@end example

참이 되는 것을 발견할 때까지 표현식들의 값을 하나씩 차례대로 구해서 정확히 하나의 스위트를 선택합니다 (참과 거짓의 정의는 @ref{24d8,,논리 연산(Boolean operations)} 섹션을 보세요); 그런 다음 그 스위트를 실행합니다 (그리고는 @ref{181,,if} 문의 다른 어떤 부분도 실행되거나 값이 구해지지 않습니다). 모든 표현식들이 거짓이면 @ref{17c,,else} 절의 스위트가 (있다면) 실행됩니다.

@node while 문,for 문<2>,if 문<2>,복합문 Compound statements
@anchor{reference/compound_stmts the-while-statement}@anchor{2534}@anchor{reference/compound_stmts while}@anchor{1974}
@subsection @code{while} 문


@geindex statement;while
@geindex keyword;else
@geindex loop;statement
@geindex ; (colon);compound statement

@ref{1974,,while} 문은 표현식이 참인 동안 실행을 반복하는 데 사용됩니다:

@example
@anchor{reference/compound_stmts grammar-token-python-grammar-while_stmt}@anchor{2526}while_stmt: "while" @ref{242e,,assignment_expression} ":" @ref{2530,,suite}
            ["else" ":" @ref{2530,,suite}]
@end example

이것은 표현식을 반복적으로 검사하고, 참이면, 첫 번째 스위트를 실행합니다; 표현식이 거짓이면 (처음부터 거짓일 수도 있습니다) @code{else} 절의 스위트가 (있다면) 실행되고 루프를 종료합니다.

@geindex statement;break
@geindex statement;continue

첫 번째 스위트에서 실행되는 @ref{17f,,break} 문은 @code{else} 절을 실행하지 않고 루프를 종료합니다. 첫 번째 스위트에서 실행되는 @ref{180,,continue} 문은 스위트의 나머지 부분을 건너뛰고 표현식의 검사로 돌아갑니다.

@node for 문<2>,try 문,while 문,복합문 Compound statements
@anchor{reference/compound_stmts for}@anchor{34a}@anchor{reference/compound_stmts the-for-statement}@anchor{2535}
@subsection @code{for} 문


@geindex statement;for
@geindex keyword;in
@geindex keyword;else
@geindex target;list
@geindex loop;statement
@geindex object;sequence
@geindex ; (colon);compound statement

@ref{34a,,for} 문은 (문자열, 튜플, 리스트 같은) 시퀀스 나 다른 이터러블 객체의 요소들을 이터레이트하는데 사용됩니다:

@example
@anchor{reference/compound_stmts grammar-token-python-grammar-for_stmt}@anchor{2527}for_stmt: "for" @ref{2488,,target_list} "in" @ref{24e6,,starred_expression_list} ":" @ref{2530,,suite}
          ["else" ":" @ref{2530,,suite}]
@end example

The @ref{24e6,,starred_expression_list} expression is evaluated
once; it should yield an @ref{142c,,iterable} object. An @ref{4ca,,iterator} is
created for that iterable. The first item provided by the iterator is then
assigned to the target list using the standard rules for assignments
(see @ref{2428,,대입문}), and the suite is executed. This repeats for each
item provided by the iterator. When the iterator is exhausted,
the suite in the @code{else} clause,
if present, is executed, and the loop terminates.

@geindex statement;break
@geindex statement;continue

첫 번째 스위트에서 실행되는 @ref{17f,,break} 문은 @code{else} 절을 실행하지 않고 루프를 종료합니다. 첫 번째 스위트에서 실행되는 @ref{180,,continue} 문은 스위트의 나머지 부분을 건너뛰고 다음 항목으로 넘어가거나, 다음 항목이 없으면 @code{else} 절로 갑니다.

for-루프는 타깃 목록의 변수들에 대입합니다. for-루프의 스위트에서 이루어진 것들도 포함해서, 그 변수에 앞서 대입된 값들을 모두 덮어씁니다:

@example
for i in range(10):
    print(i)
    i = 5             # this will not affect the for-loop
                      # because i will be overwritten with the next
                      # index in the range
@end example

@geindex built-in function;range

Names in the target list are not deleted when the loop is finished, but if the
sequence is empty, they will not have been assigned to at all by the loop.  Hint:
the built-in type @ref{b3d,,range()} represents immutable arithmetic sequences of integers.
For instance, iterating @code{range(3)} successively yields 0, 1, and then 2.


버전 3.11에서 변경: Starred elements are now allowed in the expression list.


@node try 문,with 문,for 문<2>,복합문 Compound statements
@anchor{reference/compound_stmts the-try-statement}@anchor{2536}@anchor{reference/compound_stmts try}@anchor{8f7}
@subsection @code{try} 문


@geindex statement;try
@geindex keyword;except
@geindex keyword;finally
@geindex keyword;else
@geindex keyword;as
@geindex ; (colon);compound statement

The @code{try} statement specifies exception handlers and/or cleanup code
for a group of statements:

@example
@anchor{reference/compound_stmts grammar-token-python-grammar-try_stmt}@anchor{2528}try_stmt:  @ref{2537,,try1_stmt} | @ref{2538,,try2_stmt} | @ref{2539,,try3_stmt}
@anchor{reference/compound_stmts grammar-token-python-grammar-try1_stmt}@anchor{2537}try1_stmt: "try" ":" @ref{2530,,suite}
           ("except" [@ref{182,,expression} ["as" @ref{22be,,identifier}]] ":" @ref{2530,,suite})+
           ["else" ":" @ref{2530,,suite}]
           ["finally" ":" @ref{2530,,suite}]
@anchor{reference/compound_stmts grammar-token-python-grammar-try2_stmt}@anchor{2538}try2_stmt: "try" ":" @ref{2530,,suite}
           ("except" "*" @ref{182,,expression} ["as" @ref{22be,,identifier}] ":" @ref{2530,,suite})+
           ["else" ":" @ref{2530,,suite}]
           ["finally" ":" @ref{2530,,suite}]
@anchor{reference/compound_stmts grammar-token-python-grammar-try3_stmt}@anchor{2539}try3_stmt: "try" ":" @ref{2530,,suite}
           "finally" ":" @ref{2530,,suite}
@end example

예외에 관한 추가의 정보는 @ref{2434,,예외} 섹션에서 찾을 수 있고, 예외를 일으키기 위해 @ref{802,,raise} 문을 사용하는 것에 관한 정보는 @ref{802,,raise 문} 섹션에서 찾을 수 있습니다.


버전 3.14에서 변경: Support for optionally dropping grouping parentheses when using multiple exception types. See 
@geindex Python 향상 제안; PEP 758
PEP 758@footnote{https://peps.python.org/pep-0758/}.


@menu
* except clause:: 
* except* clause:: 
* else clause:: 
* finally clause:: 

@end menu

@node except clause,except* clause,,try 문
@anchor{reference/compound_stmts except}@anchor{1ab}@anchor{reference/compound_stmts except-clause}@anchor{253a}
@subsubsection @code{except} clause


The @code{except} clause(s) specify one or more exception handlers. When no
exception occurs in the @ref{8f7,,try} clause, no exception handler is executed.
When an exception occurs in the @code{try} suite, a search for an exception
handler is started. This search inspects the @code{except} clauses in turn
until one is found that matches the exception.
An expression-less @code{except} clause, if present, must be last;
it matches any exception.

For an @code{except} clause with an expression, the
expression must evaluate to an exception type or a tuple of exception types. Parentheses
can be dropped if multiple exception types are provided and the @code{as} clause is not used.
The raised exception matches an @code{except} clause whose expression evaluates
to the class or a @ref{13bb,,non-virtual base class} of the exception object,
or to a tuple that contains such a class.

If no @code{except} clause matches the exception,
the search for an exception handler
continues in the surrounding code and on the invocation stack.  @footnote{
다른 예외를 일으키는 @ref{1b0,,finally} 절이 있지 않은 한 예외는 호출 스택으로 퍼집니다. 그 새 예외는 예전의 것을 잃어버리게 만듭니다.
}

If the evaluation of an expression
in the header of an @code{except} clause raises an exception,
the original search for a handler is canceled and a search starts for
the new exception in the surrounding code and on the call stack (it is treated
as if the entire @ref{8f7,,try} statement raised the exception).

@geindex as;except clause

When a matching @code{except} clause is found,
the exception is assigned to the target
specified after the @code{as} keyword in that @code{except} clause,
if present, and the @code{except} clause’s suite is executed.
All @code{except} clauses must have an executable block.
When the end of this block is reached, execution continues
normally after the entire @ref{8f7,,try} statement.
(This means that if two nested handlers exist for the same exception,
and the exception occurs in the @code{try} clause of the inner handler,
the outer handler will not handle the exception.)

When an exception has been assigned using @code{as target}, it is cleared at the
end of the @code{except} clause.  This is as if

@example
except E as N:
    foo
@end example

가 이렇게 변환되는 것과 같습니다

@example
except E as N:
    try:
        foo
    finally:
        del N
@end example

This means the exception must be assigned to a different name to be able to
refer to it after the @code{except} clause.
Exceptions are cleared because with the
traceback attached to them, they form a reference cycle with the stack frame,
keeping all locals in that frame alive until the next garbage collection occurs.

@geindex module;sys
@geindex object;traceback

Before an @code{except} clause’s suite is executed,
the exception is stored in the @ref{df,,sys} module, where it can be accessed
from within the body of the @code{except} clause by calling
@ref{89a,,sys.exception()}. When leaving an exception handler, the exception
stored in the @code{sys} module is reset to its previous value:

@example
>>> print(sys.exception())
None
>>> try:
...     raise TypeError
... except:
...     print(repr(sys.exception()))
...     try:
...          raise ValueError
...     except:
...         print(repr(sys.exception()))
...     print(repr(sys.exception()))
...
TypeError()
ValueError()
TypeError()
>>> print(sys.exception())
None
@end example

@geindex keyword;except_star

@node except* clause,else clause,except clause,try 문
@anchor{reference/compound_stmts except-star}@anchor{1ac}@anchor{reference/compound_stmts id2}@anchor{253b}
@subsubsection @code{except*} clause


The @code{except*} clause(s) specify one or more handlers for groups of
exceptions (@ref{564,,BaseExceptionGroup} instances). A @ref{8f7,,try} statement
can have either @ref{1ab,,except} or @code{except*} clauses, but not both.
The exception type for matching is mandatory in the case of @code{except*},
so @code{except*:} is a syntax error. The type is interpreted as in the case of
@code{except}, but matching is performed on the exceptions contained in the
group that is being handled. An @ref{198,,TypeError} is raised if a matching
type is a subclass of @code{BaseExceptionGroup}, because that would have
ambiguous semantics.

When an exception group is raised in the try block, each @code{except*}
clause splits (see @ref{18d9,,split()}) it into the subgroups
of matching and non-matching exceptions. If the matching subgroup is not empty,
it becomes the handled exception (the value returned from @ref{89a,,sys.exception()})
and assigned to the target of the @code{except*} clause (if there is one).
Then, the body of the @code{except*} clause executes. If the non-matching
subgroup is not empty, it is processed by the next @code{except*} in the
same manner. This continues until all exceptions in the group have been matched,
or the last @code{except*} clause has run.

After all @code{except*} clauses execute, the group of unhandled exceptions
is merged with any exceptions that were raised or re-raised from within
@code{except*} clauses. This merged exception group propagates on.:

@example
>>> try:
...     raise ExceptionGroup("eg",
...         [ValueError(1), TypeError(2), OSError(3), OSError(4)])
... except* TypeError as e:
...     print(f'caught @{type(e)@} with nested @{e.exceptions@}')
... except* OSError as e:
...     print(f'caught @{type(e)@} with nested @{e.exceptions@}')
...
caught <class 'ExceptionGroup'> with nested (TypeError(2),)
caught <class 'ExceptionGroup'> with nested (OSError(3), OSError(4))
  + Exception Group Traceback (most recent call last):
  |   File "<doctest default[0]>", line 2, in <module>
  |     raise ExceptionGroup("eg",
  |         [ValueError(1), TypeError(2), OSError(3), OSError(4)])
  | ExceptionGroup: eg (1 sub-exception)
  +-+---------------- 1 ----------------
    | ValueError: 1
    +------------------------------------
@end example

If the exception raised from the @ref{8f7,,try} block is not an exception group
and its type matches one of the @code{except*} clauses, it is caught and
wrapped by an exception group with an empty message string. This ensures that the
type of the target @code{e} is consistently @ref{564,,BaseExceptionGroup}:

@example
>>> try:
...     raise BlockingIOError
... except* BlockingIOError as e:
...     print(repr(e))
...
ExceptionGroup('@w{'}, (BlockingIOError(),))
@end example

@ref{17f,,break}, @ref{180,,continue} and @ref{1af,,return}
cannot appear in an @code{except*} clause.

@geindex keyword;else
@geindex statement;return
@geindex statement;break
@geindex statement;continue

@node else clause,finally clause,except* clause,try 문
@anchor{reference/compound_stmts else-clause}@anchor{253c}@anchor{reference/compound_stmts except-else}@anchor{253d}
@subsubsection @code{else} clause


생략 가능한 @code{else} 절은 제어 흐름이 @ref{8f7,,try} 스위트를 빠져나가고, 예외가 발생하지 않았고, @ref{1af,,return}, @ref{180,,continue} 또는 @ref{17f,,break} 문이 실행되지 않으면 실행됩니다. @code{else} 절에서 발생하는 예외는 앞에 나오는 @ref{1ab,,except} 절에서 처리되지 않습니다.

@geindex keyword;finally

@node finally clause,,else clause,try 문
@anchor{reference/compound_stmts finally}@anchor{1b0}@anchor{reference/compound_stmts finally-clause}@anchor{253e}
@subsubsection @code{finally} clause


If @code{finally} is present, it specifies a ‘cleanup’ handler.  The
@ref{8f7,,try} clause is executed, including any @ref{1ab,,except}
and @ref{253d,,else} clauses.
If an exception occurs in any of the clauses and is not handled,
the exception is temporarily saved.
The @code{finally} clause is executed.  If there is a saved exception
it is re-raised at the end of the @code{finally} clause.
If the @code{finally} clause raises another exception, the saved exception
is set as the context of the new exception.
If the @code{finally} clause executes a @ref{1af,,return}, @ref{17f,,break}
or @ref{180,,continue} statement, the saved exception is discarded. For example,
this function returns 42.

@example
def f():
    try:
        1/0
    finally:
        return 42
@end example

The exception information is not available to the program during execution of
the @code{finally} clause.

@geindex statement;return
@geindex statement;break
@geindex statement;continue

When a @ref{1af,,return}, @ref{17f,,break} or @ref{180,,continue} statement is
executed in the @ref{8f7,,try} suite of a @code{try}…@code{finally}
statement, the @code{finally} clause is also executed ‘on the way out.’

The return value of a function is determined by the last @ref{1af,,return}
statement executed.  Since the @code{finally} clause always executes, a
@code{return} statement executed in the @code{finally} clause will
always be the last one executed. The following function returns ‘finally’.

@example
def foo():
    try:
        return 'try'
    finally:
        return 'finally'
@end example


버전 3.8에서 변경: Prior to Python 3.8, a @ref{180,,continue} statement was illegal in the
@code{finally} clause due to a problem with the implementation.



버전 3.14에서 변경: The compiler emits a @ref{1ae,,SyntaxWarning} when a @ref{1af,,return},
@ref{17f,,break} or @ref{180,,continue} appears in a @code{finally}
block (see 
@geindex Python 향상 제안; PEP 765
PEP 765@footnote{https://peps.python.org/pep-0765/}).

@anchor{reference/compound_stmts with}@anchor{186}
@node with 문,The match statement,try 문,복합문 Compound statements
@anchor{reference/compound_stmts as}@anchor{253f}@anchor{reference/compound_stmts the-with-statement}@anchor{2540}
@subsection @code{with} 문


@geindex statement;with
@geindex keyword;as
@geindex as;with statement
@geindex @comma{} (comma);with statement
@geindex ; (colon);compound statement

@ref{186,,with} 문은 블록의 실행을 컨텍스트 관리자 (@ref{237e,,with 문 컨텍스트 관리자} 섹션을 보세요) 가 정의한 메서드들로 감싸는 데 사용됩니다. 이것은 흔한 @ref{8f7,,try}…@ref{1ab,,except}…@ref{1b0,,finally} 사용 패턴을 편리하게 재사용할 수 있도록 캡슐화할 수 있도록 합니다.

@example
@anchor{reference/compound_stmts grammar-token-python-grammar-with_stmt}@anchor{2529}with_stmt:          "with" ( "(" @ref{2541,,with_stmt_contents} ","? ")" | @ref{2541,,with_stmt_contents} ) ":" @ref{2530,,suite}
@anchor{reference/compound_stmts grammar-token-python-grammar-with_stmt_contents}@anchor{2541}with_stmt_contents: @ref{2542,,with_item} ("," @ref{2542,,with_item})*
@anchor{reference/compound_stmts grammar-token-python-grammar-with_item}@anchor{2542}with_item:          @ref{182,,expression} ["as" @ref{2505,,target}]
@end example

하나의 “item” 을 사용하는 @ref{186,,with} 문의 실행은 다음과 같이 진행됩니다:


@enumerate 

@item 
The context expression (the expression given in the
@ref{2542,,with_item}) is evaluated to obtain a context manager.

@item 
The context manager’s @ref{7e3,,__enter__()} is loaded for later use.

@item 
The context manager’s @ref{1505,,__exit__()} is loaded for later use.

@item 
The context manager’s @ref{7e3,,__enter__()} method is invoked.

@item 
If a target was included in the @ref{186,,with} statement, the return value
from @ref{7e3,,__enter__()} is assigned to it.

@cartouche
@quotation 참고 
The @ref{186,,with} statement guarantees that if the @ref{7e3,,__enter__()}
method returns without an error, then @ref{1505,,__exit__()} will always be
called. Thus, if an error occurs during the assignment to the target list,
it will be treated the same as an error occurring within the suite would
be. See step 7 below.
@end quotation
@end cartouche

@item 
스위트가 실행됩니다.

@item 
The context manager’s @ref{1505,,__exit__()} method is invoked.  If an exception
caused the suite to be exited, its type, value, and traceback are passed as
arguments to @code{__exit__()}. Otherwise, three @ref{884,,None} arguments are
supplied.

If the suite was exited due to an exception, and the return value from the
@ref{1505,,__exit__()} method was false, the exception is reraised.  If the return
value was true, the exception is suppressed, and execution continues with the
statement following the @ref{186,,with} statement.

If the suite was exited for any reason other than an exception, the return
value from @ref{1505,,__exit__()} is ignored, and execution proceeds at the normal
location for the kind of exit that was taken.
@end enumerate

다음과 같은 코드는:

@example
with EXPRESSION as TARGET:
    SUITE
@end example

의미상으로 다음과 동등합니다:

@example
manager = (EXPRESSION)
enter = manager.__enter__
exit = manager.__exit__
value = enter()
hit_except = False

try:
    TARGET = value
    SUITE
except:
    hit_except = True
    if not exit(*sys.exc_info()):
        raise
finally:
    if not hit_except:
        exit(None, None, None)
@end example

except that implicit @ref{23b1,,special method lookup} is used
for @ref{7e3,,__enter__()} and @ref{1505,,__exit__()}.

하나 보다 많은 항목을 주면, 컨텍스트 관리자는 @ref{186,,with} 문이 중첩된 것처럼 진행합니다:

@example
with A() as a, B() as b:
    SUITE
@end example

의미상으로 다음과 동등합니다:

@example
with A() as a:
    with B() as b:
        SUITE
@end example

You can also write multi-item context managers in multiple lines if
the items are surrounded by parentheses. For example:

@example
with (
    A() as a,
    B() as b,
):
    SUITE
@end example


버전 3.1에서 변경: 다중 컨텍스트 표현식의 지원



버전 3.10에서 변경: Support for using grouping parentheses to break the statement in multiple lines.



@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 343

@item PEP 343@footnote{https://peps.python.org/pep-0343/} - “with” 문

파이썬 @ref{186,,with} 문의 규격, 배경, 예.
@end table

@anchor{reference/compound_stmts match}@anchor{a0e}
@node The match statement,함수 정의,with 문,복합문 Compound statements
@anchor{reference/compound_stmts case}@anchor{2543}@anchor{reference/compound_stmts the-match-statement}@anchor{2544}
@subsection The @code{match} statement


@geindex statement;match
@geindex keyword;case
@geindex pattern matching
@geindex keyword;if
@geindex keyword;as
@geindex match;case
@geindex as;match statement
@geindex ; (colon);compound statement


Added in version 3.10.


The match statement is used for pattern matching.  Syntax:

@example
@anchor{reference/compound_stmts grammar-token-python-grammar-match_stmt}@anchor{252a}match_stmt:   'match' @ref{2545,,subject_expr} ":" NEWLINE INDENT @ref{2546,,case_block}+ DEDENT
@anchor{reference/compound_stmts grammar-token-python-grammar-subject_expr}@anchor{2545}subject_expr: `!star_named_expression` "," `!star_named_expressions`?
              | `!named_expression`
@anchor{reference/compound_stmts grammar-token-python-grammar-case_block}@anchor{2546}case_block:   'case' @ref{2547,,patterns} [@ref{2548,,guard}] ":" `!block`
@end example

@cartouche
@quotation 참고 
This section uses single quotes to denote
@ref{a0d,,soft keywords}.
@end quotation
@end cartouche

Pattern matching takes a pattern as input (following @code{case}) and a subject
value (following @code{match}).  The pattern (which may contain subpatterns) is
matched against the subject value.  The outcomes are:


@itemize *

@item 
A match success or failure (also termed a pattern success or failure).

@item 
Possible binding of matched values to a name.  The prerequisites for this are
further discussed below.
@end itemize

The @code{match} and @code{case} keywords are @ref{a0d,,soft keywords}.


@subsubheading 더 보기



@itemize *

@item 
@geindex Python 향상 제안; PEP 634
PEP 634@footnote{https://peps.python.org/pep-0634/} – Structural Pattern Matching: Specification

@item 
@geindex Python 향상 제안; PEP 636
PEP 636@footnote{https://peps.python.org/pep-0636/} – Structural Pattern Matching: Tutorial
@end itemize


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

@end menu

@node Overview,Guards,,The match statement
@anchor{reference/compound_stmts overview}@anchor{2549}
@subsubsection Overview


Here’s an overview of the logical flow of a match statement:


@enumerate 

@item 
The subject expression @code{subject_expr} is evaluated and a resulting subject
value obtained. If the subject expression contains a comma, a tuple is
constructed using @ref{254a,,the standard rules}.

@item 
Each pattern in a @code{case_block} is attempted to match with the subject value. The
specific rules for success or failure are described below. The match attempt can also
bind some or all of the standalone names within the pattern. The precise
pattern binding rules vary per pattern type and are
specified below.  `Name bindings made during a successful pattern match
outlive the executed block and can be used after the match statement'.

@cartouche
@quotation 참고 
During failed pattern matches, some subpatterns may succeed.  Do not
rely on bindings being made for a failed match.  Conversely, do not
rely on variables remaining unchanged after a failed match.  The exact
behavior is dependent on implementation and may vary.  This is an
intentional decision made to allow different implementations to add
optimizations.
@end quotation
@end cartouche

@item 
If the pattern succeeds, the corresponding guard (if present) is evaluated. In
this case all name bindings are guaranteed to have happened.


@itemize *

@item 
If the guard evaluates as true or is missing, the @code{block} inside
@code{case_block} is executed.

@item 
Otherwise, the next @code{case_block} is attempted as described above.

@item 
If there are no further case blocks, the match statement is completed.
@end itemize
@end enumerate

@cartouche
@quotation 참고 
Users should generally never rely on a pattern being evaluated.  Depending on
implementation, the interpreter may cache values or use other optimizations
which skip repeated evaluations.
@end quotation
@end cartouche

A sample match statement:

@example
>>> flag = False
>>> match (100, 200):
...    case (100, 300):  # Mismatch: 200 != 300
...        print('Case 1')
...    case (100, 200) if flag:  # Successful match, but guard fails
...        print('Case 2')
...    case (100, y):  # Matches and binds y to 200
...        print(f'Case 3, y: @{y@}')
...    case _:  # Pattern not attempted
...        print('Case 4, I match anything!')
...
Case 3, y: 200
@end example

In this case, @code{if flag} is a guard.  Read more about that in the next section.

@node Guards,Irrefutable Case Blocks,Overview,The match statement
@anchor{reference/compound_stmts guards}@anchor{254b}
@subsubsection Guards


@geindex guard

@example
@anchor{reference/compound_stmts grammar-token-python-grammar-guard}@anchor{2548}guard: "if" `!named_expression`
@end example

A @code{guard} (which is part of the @code{case}) must succeed for code inside
the @code{case} block to execute.  It takes the form: @ref{181,,if} followed by an
expression.

The logical flow of a @code{case} block with a @code{guard} follows:


@enumerate 

@item 
Check that the pattern in the @code{case} block succeeded.  If the pattern
failed, the @code{guard} is not evaluated and the next @code{case} block is
checked.

@item 
If the pattern succeeded, evaluate the @code{guard}.


@itemize *

@item 
If the @code{guard} condition evaluates as true, the case block is
selected.

@item 
If the @code{guard} condition evaluates as false, the case block is not
selected.

@item 
If the @code{guard} raises an exception during evaluation, the exception
bubbles up.
@end itemize
@end enumerate

Guards are allowed to have side effects as they are expressions.  Guard
evaluation must proceed from the first to the last case block, one at a time,
skipping case blocks whose pattern(s) don’t all succeed. (I.e.,
guard evaluation must happen in order.) Guard evaluation must stop once a case
block is selected.

@node Irrefutable Case Blocks,Patterns,Guards,The match statement
@anchor{reference/compound_stmts irrefutable-case}@anchor{254c}@anchor{reference/compound_stmts irrefutable-case-blocks}@anchor{254d}
@subsubsection Irrefutable Case Blocks


@geindex irrefutable case block
@geindex case block

An irrefutable case block is a match-all case block.  A match statement may have
at most one irrefutable case block, and it must be last.

A case block is considered irrefutable if it has no guard and its pattern is
irrefutable.  A pattern is considered irrefutable if we can prove from its
syntax alone that it will always succeed.  Only the following patterns are
irrefutable:


@itemize *

@item 
@ref{254e,,AS Patterns} whose left-hand side is irrefutable

@item 
@ref{254f,,OR Patterns} containing at least one irrefutable pattern

@item 
@ref{2550,,Capture Patterns}

@item 
@ref{a0f,,Wildcard Patterns}

@item 
parenthesized irrefutable patterns
@end itemize

@node Patterns,,Irrefutable Case Blocks,The match statement
@anchor{reference/compound_stmts patterns}@anchor{2551}
@subsubsection Patterns


@geindex ! patterns
@geindex AS pattern@comma{} OR pattern@comma{} capture pattern@comma{} wildcard pattern

@cartouche
@quotation 참고 
This section uses grammar notations beyond standard EBNF:


@itemize *

@item 
the notation @code{SEP.RULE+} is shorthand for @code{RULE (SEP RULE)*}

@item 
the notation @code{!RULE} is shorthand for a negative lookahead assertion
@end itemize
@end quotation
@end cartouche

The top-level syntax for @code{patterns} is:

@example
@anchor{reference/compound_stmts grammar-token-python-grammar-patterns}@anchor{2547}patterns:       @ref{2552,,open_sequence_pattern} | @ref{2553,,pattern}
@anchor{reference/compound_stmts grammar-token-python-grammar-pattern}@anchor{2553}pattern:        @ref{2554,,as_pattern} | @ref{2555,,or_pattern}
@anchor{reference/compound_stmts grammar-token-python-grammar-closed_pattern}@anchor{2556}closed_pattern: | @ref{2557,,literal_pattern}
                | @ref{2558,,capture_pattern}
                | @ref{2559,,wildcard_pattern}
                | @ref{255a,,value_pattern}
                | @ref{255b,,group_pattern}
                | @ref{255c,,sequence_pattern}
                | @ref{255d,,mapping_pattern}
                | @ref{255e,,class_pattern}
@end example

The descriptions below will include a description “in simple terms” of what a pattern
does for illustration purposes (credits to Raymond Hettinger for a document that
inspired most of the descriptions). Note that these descriptions are purely for
illustration purposes and `may not' reflect
the underlying implementation.  Furthermore, they do not cover all valid forms.

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

@end menu

@node OR Patterns,AS Patterns,,Patterns
@anchor{reference/compound_stmts id3}@anchor{255f}@anchor{reference/compound_stmts or-patterns}@anchor{254f}
@subsubsection OR Patterns


An OR pattern is two or more patterns separated by vertical
bars @code{|}.  Syntax:

@example
@anchor{reference/compound_stmts grammar-token-python-grammar-or_pattern}@anchor{2555}or_pattern: "|".@ref{2556,,closed_pattern}+
@end example

Only the final subpattern may be @ref{254c,,irrefutable}, and each
subpattern must bind the same set of names to avoid ambiguity.

An OR pattern matches each of its subpatterns in turn to the subject value,
until one succeeds.  The OR pattern is then considered successful.  Otherwise,
if none of the subpatterns succeed, the OR pattern fails.

In simple terms, @code{P1 | P2 | ...} will try to match @code{P1}, if it fails it will try to
match @code{P2}, succeeding immediately if any succeeds, failing otherwise.

@node AS Patterns,Literal Patterns,OR Patterns,Patterns
@anchor{reference/compound_stmts as-patterns}@anchor{254e}@anchor{reference/compound_stmts id4}@anchor{2560}
@subsubsection AS Patterns


An AS pattern matches an OR pattern on the left of the @ref{253f,,as}
keyword against a subject.  Syntax:

@example
@anchor{reference/compound_stmts grammar-token-python-grammar-as_pattern}@anchor{2554}as_pattern: @ref{2555,,or_pattern} "as" @ref{2558,,capture_pattern}
@end example

If the OR pattern fails, the AS pattern fails.  Otherwise, the AS pattern binds
the subject to the name on the right of the as keyword and succeeds.
@code{capture_pattern} cannot be a @code{_}.

In simple terms @code{P as NAME} will match with @code{P}, and on success it will
set @code{NAME = <subject>}.

@node Literal Patterns,Capture Patterns,AS Patterns,Patterns
@anchor{reference/compound_stmts id5}@anchor{2561}@anchor{reference/compound_stmts literal-patterns}@anchor{2562}
@subsubsection Literal Patterns


A literal pattern corresponds to most
@ref{22c6,,literals} in Python.  Syntax:

@example
@anchor{reference/compound_stmts grammar-token-python-grammar-literal_pattern}@anchor{2557}literal_pattern: @ref{2563,,signed_number}
                 | @ref{2563,,signed_number} "+" NUMBER
                 | @ref{2563,,signed_number} "-" NUMBER
                 | @ref{247e,,strings}
                 | "None"
                 | "True"
                 | "False"
@anchor{reference/compound_stmts grammar-token-python-grammar-signed_number}@anchor{2563}signed_number:   ["-"] NUMBER
@end example

The rule @code{strings} and the token @code{NUMBER} are defined in the
@ref{2564,,standard Python grammar}.  Triple-quoted strings are
supported.  Raw strings and byte strings are supported.  @ref{19a,,포맷 문자열 리터럴}
and @ref{17fd,,t-strings} are not supported.

The forms @code{signed_number '+' NUMBER} and @code{signed_number '-' NUMBER} are
for expressing @ref{2318,,complex numbers}; they require a real number
on the left and an imaginary number on the right. E.g. @code{3 + 4j}.

In simple terms, @code{LITERAL} will succeed only if @code{<subject> == LITERAL}. For
the singletons @code{None}, @code{True} and @code{False}, the @ref{34c,,is} operator is used.

@node Capture Patterns,Wildcard Patterns,Literal Patterns,Patterns
@anchor{reference/compound_stmts capture-patterns}@anchor{2550}@anchor{reference/compound_stmts id6}@anchor{2565}
@subsubsection Capture Patterns


A capture pattern binds the subject value to a name.
Syntax:

@example
@anchor{reference/compound_stmts grammar-token-python-grammar-capture_pattern}@anchor{2558}capture_pattern: !'_' NAME
@end example

A single underscore @code{_} is not a capture pattern (this is what @code{!'_'}
expresses). It is instead treated as a
@ref{2559,,wildcard_pattern}.

In a given pattern, a given name can only be bound once.  E.g.
@code{case x, x: ...} is invalid while @code{case [x] | x: ...} is allowed.

Capture patterns always succeed.  The binding follows scoping rules
established by the assignment expression operator in 
@geindex Python 향상 제안; PEP 572
PEP 572@footnote{https://peps.python.org/pep-0572/}; the
name becomes a local variable in the closest containing function scope unless
there’s an applicable @ref{4ad,,global} or @ref{14ac,,nonlocal} statement.

In simple terms @code{NAME} will always succeed and it will set @code{NAME = <subject>}.

@node Wildcard Patterns,Value Patterns,Capture Patterns,Patterns
@anchor{reference/compound_stmts id7}@anchor{2566}@anchor{reference/compound_stmts wildcard-patterns}@anchor{a0f}
@subsubsection Wildcard Patterns


A wildcard pattern always succeeds (matches anything)
and binds no name.  Syntax:

@example
@anchor{reference/compound_stmts grammar-token-python-grammar-wildcard_pattern}@anchor{2559}wildcard_pattern: '_'
@end example

@code{_} is a @ref{a0d,,soft keyword} within any pattern,
but only within patterns.  It is an identifier, as usual, even within
@code{match} subject expressions, @code{guard}s, and @code{case} blocks.

In simple terms, @code{_} will always succeed.

@node Value Patterns,Group Patterns,Wildcard Patterns,Patterns
@anchor{reference/compound_stmts id8}@anchor{2567}@anchor{reference/compound_stmts value-patterns}@anchor{2568}
@subsubsection Value Patterns


A value pattern represents a named value in Python.
Syntax:

@example
@anchor{reference/compound_stmts grammar-token-python-grammar-value_pattern}@anchor{255a}value_pattern: @ref{2569,,attr}
@anchor{reference/compound_stmts grammar-token-python-grammar-attr}@anchor{2569}attr:          @ref{256a,,name_or_attr} "." NAME
@anchor{reference/compound_stmts grammar-token-python-grammar-name_or_attr}@anchor{256a}name_or_attr:  @ref{2569,,attr} | NAME
@end example

The dotted name in the pattern is looked up using standard Python
@ref{242b,,name resolution rules}.  The pattern succeeds if the
value found compares equal to the subject value (using the @code{==} equality
operator).

In simple terms @code{NAME1.NAME2} will succeed only if @code{<subject> == NAME1.NAME2}

@cartouche
@quotation 참고 
If the same value occurs multiple times in the same match statement, the
interpreter may cache the first value found and reuse it rather than repeat
the same lookup.  This cache is strictly tied to a given execution of a
given match statement.
@end quotation
@end cartouche

@node Group Patterns,Sequence Patterns,Value Patterns,Patterns
@anchor{reference/compound_stmts group-patterns}@anchor{256b}@anchor{reference/compound_stmts id9}@anchor{256c}
@subsubsection Group Patterns


A group pattern allows users to add parentheses around patterns to
emphasize the intended grouping.  Otherwise, it has no additional syntax.
Syntax:

@example
@anchor{reference/compound_stmts grammar-token-python-grammar-group_pattern}@anchor{255b}group_pattern: "(" @ref{2553,,pattern} ")"
@end example

In simple terms @code{(P)} has the same effect as @code{P}.

@node Sequence Patterns,Mapping Patterns,Group Patterns,Patterns
@anchor{reference/compound_stmts id10}@anchor{256d}@anchor{reference/compound_stmts sequence-patterns}@anchor{256e}
@subsubsection Sequence Patterns


A sequence pattern contains several subpatterns to be matched against sequence elements.
The syntax is similar to the unpacking of a list or tuple.

@example
@anchor{reference/compound_stmts grammar-token-python-grammar-sequence_pattern}@anchor{255c}sequence_pattern:       "[" [@ref{256f,,maybe_sequence_pattern}] "]"
                        | "(" [@ref{2552,,open_sequence_pattern}] ")"
@anchor{reference/compound_stmts grammar-token-python-grammar-open_sequence_pattern}@anchor{2552}open_sequence_pattern:  @ref{2570,,maybe_star_pattern} "," [@ref{256f,,maybe_sequence_pattern}]
@anchor{reference/compound_stmts grammar-token-python-grammar-maybe_sequence_pattern}@anchor{256f}maybe_sequence_pattern: ",".@ref{2570,,maybe_star_pattern}+ ","?
@anchor{reference/compound_stmts grammar-token-python-grammar-maybe_star_pattern}@anchor{2570}maybe_star_pattern:     @ref{2571,,star_pattern} | @ref{2553,,pattern}
@anchor{reference/compound_stmts grammar-token-python-grammar-star_pattern}@anchor{2571}star_pattern:           "*" (@ref{2558,,capture_pattern} | @ref{2559,,wildcard_pattern})
@end example

There is no difference if parentheses  or square brackets
are used for sequence patterns (i.e. @code{(...)} vs @code{[...]} ).

@cartouche
@quotation 참고 
A single pattern enclosed in parentheses without a trailing comma
(e.g. @code{(3 | 4)}) is a @ref{256b,,group pattern}.
While a single pattern enclosed in square brackets (e.g. @code{[3 | 4]}) is
still a sequence pattern.
@end quotation
@end cartouche

At most one star subpattern may be in a sequence pattern.  The star subpattern
may occur in any position. If no star subpattern is present, the sequence
pattern is a fixed-length sequence pattern; otherwise it is a variable-length
sequence pattern.

The following is the logical flow for matching a sequence pattern against a
subject value:


@enumerate 

@item 
If the subject value is not a sequence @footnote{
In pattern matching, a sequence is defined as one of the following:


@itemize *

@item 
a class that inherits from @ref{13c9,,collections.abc.Sequence}

@item 
a Python class that has been registered as @ref{13c9,,collections.abc.Sequence}

@item 
a builtin class that has its (CPython) @ref{1c57,,Py_TPFLAGS_SEQUENCE} bit set

@item 
a class that inherits from any of the above
@end itemize

The following standard library classes are sequences:


@itemize *

@item 
@ref{4c0,,array.array}

@item 
@ref{7f3,,collections.deque}

@item 
@ref{24d,,list}

@item 
@ref{165,,memoryview}

@item 
@ref{b3d,,range}

@item 
@ref{610,,tuple}
@end itemize

@cartouche
@quotation 참고 
Subject values of type @code{str}, @code{bytes}, and @code{bytearray}
do not match sequence patterns.
@end quotation
@end cartouche
}, the sequence pattern
fails.

@item 
If the subject value is an instance of @code{str}, @code{bytes} or @code{bytearray}
the sequence pattern fails.

@item 
The subsequent steps depend on whether the sequence pattern is fixed or
variable-length.

If the sequence pattern is fixed-length:


@enumerate 

@item 
If the length of the subject sequence is not equal to the number of
subpatterns, the sequence pattern fails

@item 
Subpatterns in the sequence pattern are matched to their corresponding
items in the subject sequence from left to right.  Matching stops as soon
as a subpattern fails.  If all subpatterns succeed in matching their
corresponding item, the sequence pattern succeeds.
@end enumerate

Otherwise, if the sequence pattern is variable-length:


@enumerate 

@item 
If the length of the subject sequence is less than the number of non-star
subpatterns, the sequence pattern fails.

@item 
The leading non-star subpatterns are matched to their corresponding items
as for fixed-length sequences.

@item 
If the previous step succeeds, the star subpattern matches a list formed
of the remaining subject items, excluding the remaining items
corresponding to non-star subpatterns following the star subpattern.

@item 
Remaining non-star subpatterns are matched to their corresponding subject
items, as for a fixed-length sequence.
@end enumerate

@cartouche
@quotation 참고 
The length of the subject sequence is obtained via
@ref{83f,,len()} (i.e. via the @ref{1797,,__len__()} protocol).
This length may be cached by the interpreter in a similar manner as
@ref{2568,,value patterns}.
@end quotation
@end cartouche
@end enumerate

In simple terms @code{[P1, P2, P3,} … @code{, P<N>]} matches only if all the following
happens:


@itemize *

@item 
check @code{<subject>} is a sequence

@item 
@code{len(subject) == <N>}

@item 
@code{P1} matches @code{<subject>[0]} (note that this match can also bind names)

@item 
@code{P2} matches @code{<subject>[1]} (note that this match can also bind names)

@item 
… and so on for the corresponding pattern/element.
@end itemize

@node Mapping Patterns,Class Patterns,Sequence Patterns,Patterns
@anchor{reference/compound_stmts id12}@anchor{2572}@anchor{reference/compound_stmts mapping-patterns}@anchor{2573}
@subsubsection Mapping Patterns


A mapping pattern contains one or more key-value patterns.  The syntax is
similar to the construction of a dictionary.
Syntax:

@example
@anchor{reference/compound_stmts grammar-token-python-grammar-mapping_pattern}@anchor{255d}mapping_pattern:     "@{" [@ref{2574,,items_pattern}] "@}"
@anchor{reference/compound_stmts grammar-token-python-grammar-items_pattern}@anchor{2574}items_pattern:       ",".@ref{2575,,key_value_pattern}+ ","?
@anchor{reference/compound_stmts grammar-token-python-grammar-key_value_pattern}@anchor{2575}key_value_pattern:   (@ref{2557,,literal_pattern} | @ref{255a,,value_pattern}) ":" @ref{2553,,pattern}
                     | @ref{2576,,double_star_pattern}
@anchor{reference/compound_stmts grammar-token-python-grammar-double_star_pattern}@anchor{2576}double_star_pattern: "**" @ref{2558,,capture_pattern}
@end example

At most one double star pattern may be in a mapping pattern.  The double star
pattern must be the last subpattern in the mapping pattern.

Duplicate keys in mapping patterns are disallowed. Duplicate literal keys will
raise a @ref{18e,,SyntaxError}. Two keys that otherwise have the same value will
raise a @ref{2ec,,ValueError} at runtime.

The following is the logical flow for matching a mapping pattern against a
subject value:


@enumerate 

@item 
If the subject value is not a mapping @footnote{
In pattern matching, a mapping is defined as one of the following:


@itemize *

@item 
a class that inherits from @ref{ac7,,collections.abc.Mapping}

@item 
a Python class that has been registered as @ref{ac7,,collections.abc.Mapping}

@item 
a builtin class that has its (CPython) @ref{1c56,,Py_TPFLAGS_MAPPING} bit set

@item 
a class that inherits from any of the above
@end itemize

The standard library classes @ref{183,,dict} and @ref{697,,types.MappingProxyType}
are mappings.
},the mapping pattern fails.

@item 
If every key given in the mapping pattern is present in the subject mapping,
and the pattern for each key matches the corresponding item of the subject
mapping, the mapping pattern succeeds.

@item 
If duplicate keys are detected in the mapping pattern, the pattern is
considered invalid. A @ref{18e,,SyntaxError} is raised for duplicate literal
values; or a @ref{2ec,,ValueError} for named keys of the same value.
@end enumerate

@cartouche
@quotation 참고 
Key-value pairs are matched using the two-argument form of the mapping
subject’s @code{get()} method.  Matched key-value pairs must already be present
in the mapping, and not created on-the-fly via @ref{13c2,,__missing__()}
or @ref{588,,__getitem__()}.
@end quotation
@end cartouche

In simple terms @code{@{KEY1: P1, KEY2: P2, ... @}} matches only if all the following
happens:


@itemize *

@item 
check @code{<subject>} is a mapping

@item 
@code{KEY1 in <subject>}

@item 
@code{P1} matches @code{<subject>[KEY1]}

@item 
… and so on for the corresponding KEY/pattern pair.
@end itemize

@node Class Patterns,,Mapping Patterns,Patterns
@anchor{reference/compound_stmts class-patterns}@anchor{2577}@anchor{reference/compound_stmts id14}@anchor{2578}
@subsubsection Class Patterns


A class pattern represents a class and its positional and keyword arguments
(if any).  Syntax:

@example
@anchor{reference/compound_stmts grammar-token-python-grammar-class_pattern}@anchor{255e}class_pattern:       @ref{256a,,name_or_attr} "(" [@ref{2579,,pattern_arguments} ","?] ")"
@anchor{reference/compound_stmts grammar-token-python-grammar-pattern_arguments}@anchor{2579}pattern_arguments:   @ref{257a,,positional_patterns} ["," @ref{257b,,keyword_patterns}]
                     | @ref{257b,,keyword_patterns}
@anchor{reference/compound_stmts grammar-token-python-grammar-positional_patterns}@anchor{257a}positional_patterns: ",".@ref{2553,,pattern}+
@anchor{reference/compound_stmts grammar-token-python-grammar-keyword_patterns}@anchor{257b}keyword_patterns:    ",".@ref{257c,,keyword_pattern}+
@anchor{reference/compound_stmts grammar-token-python-grammar-keyword_pattern}@anchor{257c}keyword_pattern:     NAME "=" @ref{2553,,pattern}
@end example

The same keyword should not be repeated in class patterns.

The following is the logical flow for matching a class pattern against a
subject value:


@enumerate 

@item 
If @code{name_or_attr} is not an instance of the builtin @ref{f43,,type} , raise
@ref{198,,TypeError}.

@item 
If the subject value is not an instance of @code{name_or_attr} (tested via
@ref{2ad,,isinstance()}), the class pattern fails.

@item 
If no pattern arguments are present, the pattern succeeds.  Otherwise,
the subsequent steps depend on whether keyword or positional argument patterns
are present.

For a number of built-in types (specified below), a single positional
subpattern is accepted which will match the entire subject; for these types
keyword patterns also work as for other types.

If only keyword patterns are present, they are processed as follows,
one by one:


@enumerate 

@item 
The keyword is looked up as an attribute on the subject.


@itemize *

@item 
If this raises an exception other than @ref{5ee,,AttributeError}, the
exception bubbles up.

@item 
If this raises @ref{5ee,,AttributeError}, the class pattern has failed.

@item 
Else, the subpattern associated with the keyword pattern is matched
against the subject’s attribute value.  If this fails, the class
pattern fails; if this succeeds, the match proceeds to the next keyword.
@end itemize

@item 
If all keyword patterns succeed, the class pattern succeeds.
@end enumerate

If any positional patterns are present, they are converted to keyword
patterns using the @ref{1c73,,__match_args__} attribute on the class
@code{name_or_attr} before matching:


@enumerate 

@item 
The equivalent of @code{getattr(cls, "__match_args__", ())} is called.


@itemize *

@item 
If this raises an exception, the exception bubbles up.

@item 
If the returned value is not a tuple, the conversion fails and
@ref{198,,TypeError} is raised.

@item 
If there are more positional patterns than @code{len(cls.__match_args__)},
@ref{198,,TypeError} is raised.

@item 
Otherwise, positional pattern @code{i} is converted to a keyword pattern
using @code{__match_args__[i]} as the keyword.  @code{__match_args__[i]} must
be a string; if not @ref{198,,TypeError} is raised.

@item 
If there are duplicate keywords, @ref{198,,TypeError} is raised.
@end itemize


@subsubheading 더 보기


@ref{240d,,Customizing positional arguments in class pattern matching}


@item 
Once all positional patterns have been converted to keyword patterns,
the match proceeds as if there were only keyword patterns.
@end enumerate

For the following built-in types the handling of positional subpatterns is
different:


@itemize *

@item 
@ref{3c3,,bool}

@item 
@ref{344,,bytearray}

@item 
@ref{192,,bytes}

@item 
@ref{183,,dict}

@item 
@ref{196,,float}

@item 
@ref{7f1,,frozenset}

@item 
@ref{19b,,int}

@item 
@ref{24d,,list}

@item 
@ref{184,,set}

@item 
@ref{169,,str}

@item 
@ref{610,,tuple}
@end itemize

These classes accept a single positional argument, and the pattern there is matched
against the whole object rather than an attribute. For example @code{int(0|1)} matches
the value @code{0}, but not the value @code{0.0}.
@end enumerate

In simple terms @code{CLS(P1, attr=P2)} matches only if the following happens:


@itemize *

@item 
@code{isinstance(<subject>, CLS)}

@item 
convert @code{P1} to a keyword pattern using @code{CLS.__match_args__}

@item 
For each keyword argument @code{attr=P2}:


@itemize *

@item 
@code{hasattr(<subject>, "attr")}

@item 
@code{P2} matches @code{<subject>.attr}
@end itemize

@item 
… and so on for the corresponding keyword argument/pattern pair.
@end itemize


@subsubheading 더 보기



@itemize *

@item 
@geindex Python 향상 제안; PEP 634
PEP 634@footnote{https://peps.python.org/pep-0634/} – Structural Pattern Matching: Specification

@item 
@geindex Python 향상 제안; PEP 636
PEP 636@footnote{https://peps.python.org/pep-0636/} – Structural Pattern Matching: Tutorial
@end itemize


@geindex parameter;function definition
@anchor{reference/compound_stmts function}@anchor{2016}
@node 함수 정의,클래스 정의,The match statement,복합문 Compound statements
@anchor{reference/compound_stmts def}@anchor{165f}@anchor{reference/compound_stmts function-definitions}@anchor{257d}
@subsection 함수 정의


@geindex statement;def
@geindex function;definition
@geindex function;name
@geindex name;binding
@geindex object;user-defined function
@geindex object;function
@geindex function;name
@geindex name;binding
@geindex () (parentheses);function definition
@geindex @comma{} (comma);parameter list
@geindex ; (colon);compound statement

함수 정의는 사용자 정의 함수 객체 (@ref{232c,,표준형 계층} 섹션을 보세요) 를 정의합니다:

@example
@anchor{reference/compound_stmts grammar-token-python-grammar-funcdef}@anchor{252b}funcdef:                   [@ref{257e,,decorators}] "def" @ref{257f,,funcname} [@ref{251f,,type_params}] "(" [@ref{24e3,,parameter_list}] ")"
                           ["->" @ref{182,,expression}] ":" @ref{2530,,suite}
@anchor{reference/compound_stmts grammar-token-python-grammar-decorators}@anchor{257e}decorators:                @ref{2580,,decorator}+
@anchor{reference/compound_stmts grammar-token-python-grammar-decorator}@anchor{2580}decorator:                 "@@" @ref{242e,,assignment_expression} NEWLINE
@anchor{reference/compound_stmts grammar-token-python-grammar-parameter_list}@anchor{24e3}parameter_list:            @ref{2581,,defparameter} ("," @ref{2581,,defparameter})* "," "/" ["," [@ref{2582,,parameter_list_no_posonly}]]
                             | @ref{2582,,parameter_list_no_posonly}
@anchor{reference/compound_stmts grammar-token-python-grammar-parameter_list_no_posonly}@anchor{2582}parameter_list_no_posonly: @ref{2581,,defparameter} ("," @ref{2581,,defparameter})* ["," [@ref{2583,,parameter_list_starargs}]]
                           | @ref{2583,,parameter_list_starargs}
@anchor{reference/compound_stmts grammar-token-python-grammar-parameter_list_starargs}@anchor{2583}parameter_list_starargs:   "*" [@ref{2584,,star_parameter}] ("," @ref{2581,,defparameter})* ["," [@ref{2585,,parameter_star_kwargs}]]
                           | "*" ("," @ref{2581,,defparameter})+ ["," [@ref{2585,,parameter_star_kwargs}]]
                           | @ref{2585,,parameter_star_kwargs}
@anchor{reference/compound_stmts grammar-token-python-grammar-parameter_star_kwargs}@anchor{2585}parameter_star_kwargs:     "**" @ref{2586,,parameter} [","]
@anchor{reference/compound_stmts grammar-token-python-grammar-parameter}@anchor{2586}parameter:                 @ref{22be,,identifier} [":" @ref{182,,expression}]
@anchor{reference/compound_stmts grammar-token-python-grammar-star_parameter}@anchor{2584}star_parameter:            @ref{22be,,identifier} [":" ["*"] @ref{182,,expression}]
@anchor{reference/compound_stmts grammar-token-python-grammar-defparameter}@anchor{2581}defparameter:              @ref{2586,,parameter} ["=" @ref{182,,expression}]
@anchor{reference/compound_stmts grammar-token-python-grammar-funcname}@anchor{257f}funcname:                  @ref{22be,,identifier}
@end example

함수 정의는 실행할 수 있는 문장입니다. 실행하면 현재 지역 이름 공간의 함수 이름을 함수 객체 (함수의 실행 가능한 코드를 둘러싼 래퍼(wrapper)). 이 함수 객체는 현재의 이름 공간에 대한 참조를 포함하는데, 함수가 호출될 때 전역 이름 공간으로 사용됩니다.

함수 정의는 함수의 바디를 실행하지 않습니다. 함수가 호출될 때 실행됩니다. @footnote{
A string literal appearing as the first statement in the function body is
transformed into the function’s @ref{13de,,__doc__} attribute and
therefore the function’s @ref{22e9,,docstring}.
}

@geindex @@ (at);function definition

함수 정의는 하나나 그 이상의 @ref{939,,데코레이터} 표현식으로 감싸질 수 있습니다. 데코레이터 표현식은 함수가 정의될 때, 함수 정의를 포함하는 스코프에서 값을 구합니다. 그 결과는 콜러블이어야 하는데, 함수 객체만을 인자로 사용해서 호출됩니다. 반환 값이 함수 객체 대신 함수의 이름에 연결됩니다. 여러 개의 데코레이터는 중첩되는 방식으로 적용됩니다. 예를 들어, 다음과 같은 코드

@example
@@f1(arg)
@@f2
def func(): pass
@end example

는 대략 다음과 동등합니다

@example
def func(): pass
func = f1(arg)(f2(func))
@end example

원래의 함수가 임시로 이름 @code{func} 에 연결되지 않는다는 점만 다릅니다.


버전 3.9에서 변경: Functions may be decorated with any valid
@ref{242e,,assignment_expression}. Previously, the grammar was
much more restrictive; see 
@geindex Python 향상 제안; PEP 614
PEP 614@footnote{https://peps.python.org/pep-0614/} for details.


A list of @ref{5ac,,type parameters} may be given in square brackets
between the function’s name and the opening parenthesis for its parameter list.
This indicates to static type checkers that the function is generic. At runtime,
the type parameters can be retrieved from the function’s
@ref{234a,,__type_params__}
attribute. See @ref{681,,Generic functions} for more.


버전 3.12에서 변경: Type parameter lists are new in Python 3.12.


@geindex default;parameter;value
@geindex argument;function definition
@geindex = (equals);function definition

하나나 그 이상의 @ref{2348,,매개변수} 들이 `parameter' @code{=} `expression' 형태를 가질 때, 함수가 “기본 매개변수 값”을 갖는다고 말합니다. 기본값이 있는 매개변수의 경우, 호출할 때 대응하는 @ref{679,,인자} 를 생략할 수 있고, 그럴 때 매개변수의 기본값이 적용됩니다. 만약 매개변수가 기본값을 가지면, “@code{*}” 까지 그 뒤를 따르는 모든 매개변수도 기본값을 가져야 합니다 — 이것은 문법 규칙에서 표현되지 않는 문법적 제약입니다.

`Default parameter values are evaluated from left to right when the function
definition is executed.' This means that the expression is evaluated once, when
the function is defined, and that the same “pre-computed” value is used for each
call.  This is especially important to understand when a default parameter value is a
mutable object, such as a list or a dictionary: if the function modifies the
object (e.g. by appending an item to a list), the default parameter value is in effect
modified.  This is generally not what was intended.  A way around this is to use
@code{None} as the default, and explicitly test for it in the body of the function,
e.g.:

@example
def whats_on_the_telly(penguin=None):
    if penguin is None:
        penguin = []
    penguin.append("property of the zoo")
    return penguin
@end example

@geindex / (slash);function definition
@geindex * (asterisk);function definition
@geindex **;function definition

Function call semantics are described in more detail in section @ref{f7c,,호출}. A
function call always assigns values to all parameters mentioned in the parameter
list, either from positional arguments, from keyword arguments, or from default
values.  If the form “@code{*identifier}” is present, it is initialized to a tuple
receiving any excess positional parameters, defaulting to the empty tuple.
If the form “@code{**identifier}” is present, it is initialized to a new
ordered mapping receiving any excess keyword arguments, defaulting to a
new empty mapping of the same type.  Parameters after “@code{*}” or
“@code{*identifier}” are keyword-only parameters and may only be passed
by keyword arguments.  Parameters before “@code{/}” are positional-only parameters
and may only be passed by positional arguments.


버전 3.8에서 변경: The @code{/} function parameter syntax may be used to indicate positional-only
parameters. See 
@geindex Python 향상 제안; PEP 570
PEP 570@footnote{https://peps.python.org/pep-0570/} for details.


@geindex function;annotations
@geindex ->;function annotations
@geindex ; (colon);function annotations

Parameters may have an @ref{2017,,annotation} of the form “@code{: expression}”
following the parameter name.  Any parameter may have an annotation, even those of the form
@code{*identifier} or @code{**identifier}. (As a special case, parameters of the form
@code{*identifier} may have an annotation “@code{: *expression}”.) Functions may have “return” annotation of
the form “@code{-> expression}” after the parameter list.  These annotations can be
any valid Python expression.  The presence of annotations does not change the
semantics of a function. See @ref{2587,,Annotations} for more information on annotations.


버전 3.11에서 변경: Parameters of the form “@code{*identifier}” may have an annotation
“@code{: *expression}”. See 
@geindex Python 향상 제안; PEP 646
PEP 646@footnote{https://peps.python.org/pep-0646/}.


@geindex lambda;expression

표현식에서 즉시 사용하기 위해, 이름 없는 함수(이름에 연결되지 않은 함수)를 만드는 것도 가능합니다. 이것은 람다 표현식을 사용하는데, @ref{14a2,,람다(Lambdas)} 섹션에서 설명합니다. 람다 표현식은 단순화된 함수 정의를 위한 줄임 표현에 지나지 않는다는 것에 주의하세요; “@ref{165f,,def}” 문장에서 정의된 함수는 람다 표현식으로 정의된 함수처럼 전달되거나 다른 이름에 대입될 수 있습니다. 여러 개의 문장을 실행하는 것과 어노테이션을 허락하기 때문에, “@code{def}” 형태가 사실 더 강력합니다.

`프로그래머 유의 사항:' 함수는 퍼스트 클래스(first-class) 객체다. 함수 정의 안에서 실행되는 “@code{def}” 문은 돌려주거나 전달할 수 있는 지역 함수를 정의합니다. 중첩된 함수에서 사용되는 자유 변수들은 그 def 를 포함하는 함수의 지역 변수들을 액세스할 수 있습니다. 더 자세한 내용은 @ref{2343,,이름과 연결(binding)} 섹션을 보세요.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 3107

@item PEP 3107@footnote{https://peps.python.org/pep-3107/} - 함수 어노테이션

함수 어노테이션의 최초 규격.

@geindex Python 향상 제안; PEP 484

@item PEP 484@footnote{https://peps.python.org/pep-0484/} - 형 힌트

어노테이션에 대한 표준 의미 정의: 형 힌트.

@geindex Python 향상 제안; PEP 526

@item PEP 526@footnote{https://peps.python.org/pep-0526/} - 변수 어노테이션 문법

Ability to type hint variable declarations, including class
variables and instance variables.

@geindex Python 향상 제안; PEP 563

@item PEP 563@footnote{https://peps.python.org/pep-0563/} - 어노테이션의 지연된 평가

즉시 평가하는 대신 실행시간에 어노테이션을 문자열 형식으로 보존하여 어노테이션 내에서의 전방 참조를 지원합니다.

@geindex Python 향상 제안; PEP 318

@item PEP 318@footnote{https://peps.python.org/pep-0318/} - Decorators for Functions and Methods

Function and method decorators were introduced.
Class decorators were introduced in 
@geindex Python 향상 제안; PEP 3129
PEP 3129@footnote{https://peps.python.org/pep-3129/}.
@end table


@node 클래스 정의,코루틴,함수 정의,복합문 Compound statements
@anchor{reference/compound_stmts class}@anchor{14dc}@anchor{reference/compound_stmts class-definitions}@anchor{2588}
@subsection 클래스 정의


@geindex object;class
@geindex statement;class
@geindex class;definition
@geindex class;name
@geindex name;binding
@geindex execution;frame
@geindex inheritance
@geindex docstring
@geindex () (parentheses);class definition
@geindex @comma{} (comma);expression list
@geindex ; (colon);compound statement

클래스 정의는 클래스 객체(@ref{232c,,표준형 계층} 섹션을 보세요)를 정의합니다:

@example
@anchor{reference/compound_stmts grammar-token-python-grammar-classdef}@anchor{252c}classdef:    [@ref{257e,,decorators}] "class" @ref{2589,,classname} [@ref{251f,,type_params}] [@ref{258a,,inheritance}] ":" @ref{2530,,suite}
@anchor{reference/compound_stmts grammar-token-python-grammar-inheritance}@anchor{258a}inheritance: "(" [@ref{24b8,,argument_list}] ")"
@anchor{reference/compound_stmts grammar-token-python-grammar-classname}@anchor{2589}classname:   @ref{22be,,identifier}
@end example

클래스 정의는 실행 가능한 문장입니다. 계승(inheritance) 목록은 보통 베이스 클래스들의 목록을 제공하는데 (더 고급 사용에 대해서는 @ref{23be,,메타 클래스} 를 보세요), 목록의 각 항목은 값을 구할 때 서브 클래싱을 허락하는 클래스 객체가 되어야 합니다. 계승 목록이 없는 클래스는, 기본적으로, 베이스 클래스 @ref{c7d,,object} 를 계승합니다; 그래서

@example
class Foo:
    pass
@end example

는 다음과 동등합니다

@example
class Foo(object):
    pass
@end example

클래스의 스위트는 새로 만들어진 지역 이름 공간과 원래의 전역 이름 공간을 사용하는 새 실행 프레임 (@ref{2343,,이름과 연결(binding)} 을 보세요)에서 실행됩니다. (보통, 스위트는 대부분 함수 정의들을 포함합니다.) 클래스의 스위트가 실행을 마치면, 실행 프레임은 파기하지만, 그것의 지역 이름 공간은 보존합니다. @footnote{
A string literal appearing as the first statement in the class body is
transformed into the namespace’s @ref{2093,,__doc__} item and therefore
the class’s @ref{22e9,,docstring}.
} 그런 다음, 계승 목록을 베이스 클래스들로, 보존된 지역 이름 공간을 어트리뷰트 딕셔너리로 사용해서 새 클래스 객체를 만듭니다. 클래스의 이름은 원래의 지역 이름 공간에서 이 클래스 객체와 연결됩니다.

The order in which attributes are defined in the class body is preserved
in the new class’s @ref{e56,,__dict__}.  Note that this is reliable only right
after the class is created and only for classes that were defined using
the definition syntax.

클래스 생성은 @ref{23be,,메타 클래스} 를 사용해서 심하게 커스터마이즈할 수 있습니다.

@geindex @@ (at);class definition

클래스 역시 함수를 데코레이팅할 때처럼 테코레이트할 수 있습니다,

@example
@@f1(arg)
@@f2
class Foo: pass
@end example

는 대략 다음과 동등합니다

@example
class Foo: pass
Foo = f1(arg)(f2(Foo))
@end example

데코레이터 표현식의 값을 구하는 규칙은 함수 데코레이터와 같습니다. 그런 다음 그 결과가 클래스 이름에 연결됩니다.


버전 3.9에서 변경: Classes may be decorated with any valid
@ref{242e,,assignment_expression}. Previously, the grammar was
much more restrictive; see 
@geindex Python 향상 제안; PEP 614
PEP 614@footnote{https://peps.python.org/pep-0614/} for details.


A list of @ref{5ac,,type parameters} may be given in square brackets
immediately after the class’s name.
This indicates to static type checkers that the class is generic. At runtime,
the type parameters can be retrieved from the class’s
@ref{2373,,__type_params__} attribute. See @ref{680,,Generic classes} for more.


버전 3.12에서 변경: Type parameter lists are new in Python 3.12.


`프로그래머 유의 사항:' 클래스 정의에서 정의되는 변수들은 클래스 어트리뷰트입니다; 이것들은 인스턴스 간에 공유됩니다. 인스턴스 어트리뷰트는 메서드에서 @code{self.name = value} 로 설정될 수 있습니다. 클래스와 인스턴스 어트리뷰트 모두 “@code{self.name}” 표기법으로 액세스할 수 있고, 이런 식으로 액세스할 때 인스턴스 어트리뷰트는 같은 이름의 클래스 어트리뷰트를 가립니다. 클래스 어트리뷰트는 인스턴스 어트리뷰트의 기본값으로 사용될 수 있지만, 가변 값을 사용하는 것은 예상하지 않은 결과를 줄 수 있습니다. @ref{e48,,디스크립터} 를 다른 구현 상세를 갖는 인스턴스 변수를 만드는데 사용할 수 있습니다.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 3115

@item PEP 3115@footnote{https://peps.python.org/pep-3115/} - 파이썬 3000의 메타 클래스

메타 클래스 선언을 현재 문법으로 변경하고, 메타 클래스가 있는 클래스를 구성하는 방법의 의미를 변경하는 제안.

@geindex Python 향상 제안; PEP 3129

@item PEP 3129@footnote{https://peps.python.org/pep-3129/} - 클래스 데코레이터

클래스 데코레이터를 추가하는 제안. 함수와 메서드 데코레이터는 
@geindex Python 향상 제안; PEP 318
PEP 318@footnote{https://peps.python.org/pep-0318/}에서 도입되었습니다.
@end table


@node 코루틴,Type parameter lists,클래스 정의,복합문 Compound statements
@anchor{reference/compound_stmts async}@anchor{93a}@anchor{reference/compound_stmts coroutines}@anchor{258b}
@subsection 코루틴



Added in version 3.5.


@geindex statement;async def

@menu
* 코루틴 함수 정의:: 
* async for 문:: 
* async with 문:: 

@end menu

@node 코루틴 함수 정의,async for 문,,코루틴
@anchor{reference/compound_stmts async-def}@anchor{7ec}@anchor{reference/compound_stmts coroutine-function-definition}@anchor{258c}
@subsubsection 코루틴 함수 정의


@example
@anchor{reference/compound_stmts grammar-token-python-grammar-async_funcdef}@anchor{252f}async_funcdef: [@ref{257e,,decorators}] "async" "def" @ref{257f,,funcname} "(" [@ref{24e3,,parameter_list}] ")"
               ["->" @ref{182,,expression}] ":" @ref{2530,,suite}
@end example

@geindex keyword;async
@geindex keyword;await

Execution of Python coroutines can be suspended and resumed at many points
(see @ref{6b8,,coroutine}). @ref{18d,,await} expressions, @ref{c9f,,async for} and
@ref{185,,async with} can only be used in the body of a coroutine function.

@code{async def} 문법으로 정의된 함수는 항상 코루틴 함수인데, @code{await} 나 @code{async} 키워드를 포함하지 않는 경우도 그렇습니다.

코루틴 함수의 바디 안에서 @code{yield from} 표현식을 사용하는 것은 @ref{18e,,SyntaxError} 입니다.

코루틴 함수의 예:

@example
async def func(param1, param2):
    do_stuff()
    await some_coroutine()
@end example


버전 3.7에서 변경: @code{await} and @code{async} are now keywords; previously they were only
treated as such inside the body of a coroutine function.


@geindex statement;async for

@node async for 문,async with 문,코루틴 함수 정의,코루틴
@anchor{reference/compound_stmts async-for}@anchor{c9f}@anchor{reference/compound_stmts the-async-for-statement}@anchor{258d}
@subsubsection @code{async for} 문


@example
@anchor{reference/compound_stmts grammar-token-python-grammar-async_for_stmt}@anchor{252e}async_for_stmt: "async" @ref{2527,,for_stmt}
@end example

@ref{f73,,비동기 이터러블} 은 @ref{4c8,,비동기 이터레이터} 를 직접 반환하는 @code{__aiter__} 메서드를 제공하고, 비동기 이터레이터는 자신의 @code{__anext__} 메서드에서 비동기 코드를 호출할 수 있습니다.

@code{async for} 문은 비동기 이터러블에 대한 편리한 이터레이션을 허락합니다.

다음과 같은 코드는:

@example
async for TARGET in ITER:
    SUITE
else:
    SUITE2
@end example

의미상으로 다음과 동등합니다:

@example
iter = (ITER).__aiter__()
running = True

while running:
    try:
        TARGET = await iter.__anext__()
    except StopAsyncIteration:
        running = False
    else:
        SUITE
else:
    SUITE2
@end example

except that implicit @ref{23b1,,special method lookup} is used
for @ref{df5,,__aiter__()} and @ref{1885,,__anext__()}.

코루틴 함수의 바디 밖에서 @code{async for} 문을 사용하는 것은 @ref{18e,,SyntaxError} 입니다.

@geindex statement;async with

@node async with 문,,async for 문,코루틴
@anchor{reference/compound_stmts async-with}@anchor{185}@anchor{reference/compound_stmts the-async-with-statement}@anchor{258e}
@subsubsection @code{async with} 문


@example
@anchor{reference/compound_stmts grammar-token-python-grammar-async_with_stmt}@anchor{252d}async_with_stmt: "async" @ref{2529,,with_stmt}
@end example

@ref{7ef,,비동기 컨텍스트 관리자} 는 `enter' 와 `exit' 메서드에서 실행을 일시 중지할 수 있는 @ref{1e1,,컨텍스트 관리자} 입니다.

다음과 같은 코드는:

@example
async with EXPRESSION as TARGET:
    SUITE
@end example

의미상으로 다음과 동등합니다:

@example
manager = (EXPRESSION)
aenter = manager.__aenter__
aexit = manager.__aexit__
value = await aenter()
hit_except = False

try:
    TARGET = value
    SUITE
except:
    hit_except = True
    if not await aexit(*sys.exc_info()):
        raise
finally:
    if not hit_except:
        await aexit(None, None, None)
@end example

except that implicit @ref{23b1,,special method lookup} is used
for @ref{241e,,__aenter__()} and @ref{19a2,,__aexit__()}.

코루틴 함수의 바디 밖에서 @code{async with} 문을 사용하는 것은 @ref{18e,,SyntaxError} 입니다.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 492

@item PEP 492@footnote{https://peps.python.org/pep-0492/} - async 와 await 문법을 사용하는 코루틴

코루틴을 파이썬에서 적절한 독립적인 개념으로 만들고, 문법 지원을 추가한 제안.
@end table


@node Type parameter lists,Annotations<2>,코루틴,복합문 Compound statements
@anchor{reference/compound_stmts type-parameter-lists}@anchor{258f}@anchor{reference/compound_stmts type-params}@anchor{5ac}
@subsection Type parameter lists



Added in version 3.12.



버전 3.13에서 변경: Support for default values was added (see 
@geindex Python 향상 제안; PEP 696
PEP 696@footnote{https://peps.python.org/pep-0696/}).


@geindex type parameters

@example
@anchor{reference/compound_stmts grammar-token-python-grammar-type_params}@anchor{251f}type_params:  "[" @ref{2590,,type_param} ("," @ref{2590,,type_param})* "]"
@anchor{reference/compound_stmts grammar-token-python-grammar-type_param}@anchor{2590}type_param:   @ref{2591,,typevar} | @ref{2592,,typevartuple} | @ref{2593,,paramspec}
@anchor{reference/compound_stmts grammar-token-python-grammar-typevar}@anchor{2591}typevar:      @ref{22be,,identifier} (":" @ref{182,,expression})? ("=" @ref{182,,expression})?
@anchor{reference/compound_stmts grammar-token-python-grammar-typevartuple}@anchor{2592}typevartuple: "*" @ref{22be,,identifier} ("=" @ref{182,,expression})?
@anchor{reference/compound_stmts grammar-token-python-grammar-paramspec}@anchor{2593}paramspec:    "**" @ref{22be,,identifier} ("=" @ref{182,,expression})?
@end example

@ref{165f,,Functions} (including @ref{7ec,,coroutines}),
@ref{14dc,,classes} and @ref{66b,,type aliases} may
contain a type parameter list:

@example
def max[T](args: list[T]) -> T:
    ...

async def amax[T](args: list[T]) -> T:
    ...

class Bag[T]:
    def __iter__(self) -> Iterator[T]:
        ...

    def add(self, arg: T) -> None:
        ...

type ListOrSet[T] = list[T] | set[T]
@end example

Semantically, this indicates that the function, class, or type alias is
generic over a type variable. This information is primarily used by static
type checkers, and at runtime, generic objects behave much like their
non-generic counterparts.

Type parameters are declared in square brackets (@code{[]}) immediately
after the name of the function, class, or type alias. The type parameters
are accessible within the scope of the generic object, but not elsewhere.
Thus, after a declaration @code{def func[T](): pass}, the name @code{T} is not available in
the module scope. Below, the semantics of generic objects are described
with more precision. The scope of type parameters is modeled with a special
function (technically, an @ref{4ac,,annotation scope}) that
wraps the creation of the generic object.

Generic functions, classes, and type aliases have a
@ref{2594,,__type_params__} attribute listing their type parameters.

Type parameters come in three kinds:


@itemize *

@item 
@ref{487,,typing.TypeVar}, introduced by a plain name (e.g., @code{T}). Semantically, this
represents a single type to a type checker.

@item 
@ref{489,,typing.TypeVarTuple}, introduced by a name prefixed with a single
asterisk (e.g., @code{*Ts}). Semantically, this stands for a tuple of any
number of types.

@item 
@ref{488,,typing.ParamSpec}, introduced by a name prefixed with two asterisks
(e.g., @code{**P}). Semantically, this stands for the parameters of a callable.
@end itemize

@ref{487,,typing.TypeVar} declarations can define `bounds' and `constraints' with
a colon (@code{:}) followed by an expression. A single expression after the colon
indicates a bound (e.g. @code{T: int}). Semantically, this means
that the @code{typing.TypeVar} can only represent types that are a subtype of
this bound. A parenthesized tuple of expressions after the colon indicates a
set of constraints (e.g. @code{T: (str, bytes)}). Each member of the tuple should be a
type (again, this is not enforced at runtime). Constrained type variables can only
take on one of the types in the list of constraints.

For @code{typing.TypeVar}s declared using the type parameter list syntax,
the bound and constraints are not evaluated when the generic object is created,
but only when the value is explicitly accessed through the attributes @code{__bound__}
and @code{__constraints__}. To accomplish this, the bounds or constraints are
evaluated in a separate @ref{4ac,,annotation scope}.

@ref{489,,typing.TypeVarTuple}s and @ref{488,,typing.ParamSpec}s cannot have bounds
or constraints.

All three flavors of type parameters can also have a `default value', which is used
when the type parameter is not explicitly provided. This is added by appending
a single equals sign (@code{=}) followed by an expression. Like the bounds and
constraints of type variables, the default value is not evaluated when the
object is created, but only when the type parameter’s @code{__default__} attribute
is accessed. To this end, the default value is evaluated in a separate
@ref{4ac,,annotation scope}. If no default value is specified
for a type parameter, the @code{__default__} attribute is set to the special
sentinel object @ref{568,,typing.NoDefault}.

The following example indicates the full set of allowed type parameter declarations:

@example
def overly_generic[
   SimpleTypeVar,
   TypeVarWithDefault = int,
   TypeVarWithBound: int,
   TypeVarWithConstraints: (str, bytes),
   *SimpleTypeVarTuple = (int, float),
   **SimpleParamSpec = (str, bytearray),
](
   a: SimpleTypeVar,
   b: TypeVarWithDefault,
   c: TypeVarWithBound,
   d: Callable[SimpleParamSpec, TypeVarWithConstraints],
   *e: SimpleTypeVarTuple,
): ...
@end example

@menu
* Generic functions:: 
* Generic classes:: 
* Generic type aliases:: 

@end menu

@node Generic functions,Generic classes,,Type parameter lists
@anchor{reference/compound_stmts generic-functions}@anchor{681}@anchor{reference/compound_stmts id17}@anchor{2595}
@subsubsection Generic functions


Generic functions are declared as follows:

@example
def func[T](arg: T): ...
@end example

This syntax is equivalent to:

@example
annotation-def TYPE_PARAMS_OF_func():
    T = typing.TypeVar("T")
    def func(arg: T): ...
    func.__type_params__ = (T,)
    return func
func = TYPE_PARAMS_OF_func()
@end example

Here @code{annotation-def} indicates an @ref{4ac,,annotation scope},
which is not actually bound to any name at runtime. (One
other liberty is taken in the translation: the syntax does not go through
attribute access on the @ref{10a,,typing} module, but creates an instance of
@ref{487,,typing.TypeVar} directly.)

The annotations of generic functions are evaluated within the annotation scope
used for declaring the type parameters, but the function’s defaults and
decorators are not.

The following example illustrates the scoping rules for these cases,
as well as for additional flavors of type parameters:

@example
@@decorator
def func[T: int, *Ts, **P](*args: *Ts, arg: Callable[P, T] = some_default):
    ...
@end example

Except for the @ref{684,,lazy evaluation} of the
@ref{487,,TypeVar} bound, this is equivalent to:

@example
DEFAULT_OF_arg = some_default

annotation-def TYPE_PARAMS_OF_func():

    annotation-def BOUND_OF_T():
        return int
    # In reality, BOUND_OF_T() is evaluated only on demand.
    T = typing.TypeVar("T", bound=BOUND_OF_T())

    Ts = typing.TypeVarTuple("Ts")
    P = typing.ParamSpec("P")

    def func(*args: *Ts, arg: Callable[P, T] = DEFAULT_OF_arg):
        ...

    func.__type_params__ = (T, Ts, P)
    return func
func = decorator(TYPE_PARAMS_OF_func())
@end example

The capitalized names like @code{DEFAULT_OF_arg} are not actually
bound at runtime.

@node Generic classes,Generic type aliases,Generic functions,Type parameter lists
@anchor{reference/compound_stmts generic-classes}@anchor{680}@anchor{reference/compound_stmts id18}@anchor{2596}
@subsubsection Generic classes


Generic classes are declared as follows:

@example
class Bag[T]: ...
@end example

This syntax is equivalent to:

@example
annotation-def TYPE_PARAMS_OF_Bag():
    T = typing.TypeVar("T")
    class Bag(typing.Generic[T]):
        __type_params__ = (T,)
        ...
    return Bag
Bag = TYPE_PARAMS_OF_Bag()
@end example

Here again @code{annotation-def} (not a real keyword) indicates an
@ref{4ac,,annotation scope}, and the name
@code{TYPE_PARAMS_OF_Bag} is not actually bound at runtime.

Generic classes implicitly inherit from @ref{17bc,,typing.Generic}.
The base classes and keyword arguments of generic classes are
evaluated within the type scope for the type parameters,
and decorators are evaluated outside that scope. This is illustrated
by this example:

@example
@@decorator
class Bag(Base[T], arg=T): ...
@end example

This is equivalent to:

@example
annotation-def TYPE_PARAMS_OF_Bag():
    T = typing.TypeVar("T")
    class Bag(Base[T], typing.Generic[T], arg=T):
        __type_params__ = (T,)
        ...
    return Bag
Bag = decorator(TYPE_PARAMS_OF_Bag())
@end example

@node Generic type aliases,,Generic classes,Type parameter lists
@anchor{reference/compound_stmts generic-type-aliases}@anchor{683}@anchor{reference/compound_stmts id19}@anchor{2597}
@subsubsection Generic type aliases


The @ref{66b,,type} statement can also be used to create a generic type alias:

@example
type ListOrSet[T] = list[T] | set[T]
@end example

Except for the @ref{684,,lazy evaluation} of the value,
this is equivalent to:

@example
annotation-def TYPE_PARAMS_OF_ListOrSet():
    T = typing.TypeVar("T")

    annotation-def VALUE_OF_ListOrSet():
        return list[T] | set[T]
    # In reality, the value is lazily evaluated
    return typing.TypeAliasType("ListOrSet", VALUE_OF_ListOrSet(), type_params=(T,))
ListOrSet = TYPE_PARAMS_OF_ListOrSet()
@end example

Here, @code{annotation-def} (not a real keyword) indicates an
@ref{4ac,,annotation scope}. The capitalized names
like @code{TYPE_PARAMS_OF_ListOrSet} are not actually bound at runtime.

@node Annotations<2>,,Type parameter lists,복합문 Compound statements
@anchor{reference/compound_stmts annotations}@anchor{2587}@anchor{reference/compound_stmts id20}@anchor{2598}
@subsection Annotations



버전 3.14에서 변경: Annotations are now lazily evaluated by default.


Variables and function parameters may carry @ref{15c,,annotations},
created by adding a colon after the name, followed by an expression:

@example
x: annotation = 1
def f(param: annotation): ...
@end example

Functions may also carry a return annotation following an arrow:

@example
def f() -> annotation: ...
@end example

Annotations are conventionally used for @ref{23cb,,type hints}, but this
is not enforced by the language, and in general annotations may contain arbitrary
expressions. The presence of annotations does not change the runtime semantics of
the code, except if some mechanism is used that introspects and uses the annotations
(such as @ref{33,,dataclasses} or @ref{84a,,functools.singledispatch()}).

By default, annotations are lazily evaluated in an @ref{4ac,,annotation scope}.
This means that they are not evaluated when the code containing the annotation is evaluated.
Instead, the interpreter saves information that can be used to evaluate the annotation later
if requested. The @ref{6,,annotationlib} module provides tools for evaluating annotations.

If the @ref{45d,,future statement} @code{from __future__ import annotations} is present,
all annotations are instead stored as strings:

@example
>>> from __future__ import annotations
>>> def f(param: annotation): ...
>>> f.__annotations__
@{'param': 'annotation'@}
@end example

This future statement will be deprecated and removed in a future version of Python,
but not before Python 3.13 reaches its end of life (see 
@geindex Python 향상 제안; PEP 749
PEP 749@footnote{https://peps.python.org/pep-0749/}).
When it is used, introspection tools like
@ref{459,,annotationlib.get_annotations()} and @ref{8bf,,typing.get_type_hints()} are
less likely to be able to resolve annotations at runtime.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 최상위 요소들,전체 문법 규격,복합문 Compound statements,파이썬 언어 레퍼런스
@anchor{reference/toplevel_components doc}@anchor{2599}@anchor{reference/toplevel_components top-level}@anchor{259a}@anchor{reference/toplevel_components top-level-components}@anchor{259b}@anchor{reference/toplevel_components translation-repo}@anchor{259c}
@section 최상위 요소들


@geindex 인터프리터

파이썬 인터프리터는 여러 가지 출처로부터 입력을 얻을 수 있습니다: 표준 입력이나 프로그램 인자로 전달된 스크립트, 대화형으로 입력된 것, 모듈 소스 파일 등등. 이 장은 이 경우들에 사용되는 문법을 제공합니다.

@menu
* 완전한 파이썬 프로그램:: 
* 파일 입력:: 
* 대화형 입력:: 
* 표현식 입력:: 

@end menu

@node 완전한 파이썬 프로그램,파일 입력,,최상위 요소들
@anchor{reference/toplevel_components complete-python-programs}@anchor{259d}@anchor{reference/toplevel_components programs}@anchor{2452}
@subsection 완전한 파이썬 프로그램


@geindex 프로그램

@geindex 모듈;sys
@geindex 모듈;__main__
@geindex 모듈;builtins

언어 규격이 어떤 식으로 언어 인터프리터가 실행되는지를 미리 규정할 필요는 없지만, 완전한 파이썬 프로그램이라는 개념을 갖는 것은 쓸모가 있습니다. 완전한 파이썬 프로그램은 최소한으로 초기화된 환경에서 실행됩니다: 모든 내장과 표준 모듈이 제공되지만, @ref{df,,sys} (각종 시스템 서비스들)와 @ref{13,,builtins} (내장 함수들, 예외들, @code{None})과 @ref{1,,__main__} 이외의 어느 것도 초기화되지 않았습니다. 마지막 것은 완전한 프로그램의 실행을 위한 지역과 전역 이름 공간을 제공하는 데 사용됩니다.

완전한 파이썬 프로그램의 문법은 다음 섹션에서 설명되는 파일 입력의 경우입니다.

@geindex 대화형 모드
@geindex 모듈;__main__

인터프리터는 대화형으로 실행될 수도 있습니다; 이 경우, 완전한 프로그램을 읽어서 실행하지 않고, 한 번에 한 문장 (복합문도 가능하다) 씩 읽어서 실행합니다. 초기 환경은 완전한 프로그램과 같습니다; 각 문장은 @ref{1,,__main__} 의 이름 공간에서 실행됩니다.

@geindex UNIX
@geindex Windows
@geindex 명령줄
@geindex 표준 입력

완전한 프로그램은 세 가지 형태로 인터프리터에게 전달될 수 있습니다: @ref{1a8,,-c} `string' 명령행 옵션으로, 첫 번째 명령행 인자로 전달된 파일로, 표준 입력으로. 파일이나 표준입력이 tty 장치면, 인터프리터는 대화형 모드로 돌입합니다; 그렇지 않으면 그 파일을 완전한 프로그램으로 실행합니다.

@node 파일 입력,대화형 입력,완전한 파이썬 프로그램,최상위 요소들
@anchor{reference/toplevel_components file-input}@anchor{259e}@anchor{reference/toplevel_components id1}@anchor{259f}
@subsection 파일 입력


비대화형 파일로부터 읽힌 모든 입력은 같은 형태를 취합니다:

@example
@anchor{reference/toplevel_components grammar-token-python-grammar-file_input}@anchor{25a0}file_input: (NEWLINE | @ref{2532,,statement})* ENDMARKER
@end example

이 문법은 다음과 같은 상황에서 사용됩니다:


@itemize *

@item 
(파일이나 문자열로부터 온) 완전한 파이썬 프로그램을 파싱할 때;

@item 
모듈을 파싱할 때;

@item 
@ref{4a3,,exec()} 함수로 전달된 문자열을 파싱할 때;
@end itemize

@node 대화형 입력,표현식 입력,파일 입력,최상위 요소들
@anchor{reference/toplevel_components interactive}@anchor{25a1}@anchor{reference/toplevel_components interactive-input}@anchor{25a2}
@subsection 대화형 입력


대화형 모드에서의 입력은 다음과 같은 문법 규칙을 사용합니다:

@example
@anchor{reference/toplevel_components grammar-token-python-grammar-interactive_input}@anchor{25a3}interactive_input: [@ref{2531,,stmt_list}] NEWLINE | @ref{2524,,compound_stmt} NEWLINE | ENDMARKER
@end example

(최상위) 복합문은 대화형 모드에서 빈 줄을 붙여줘야 함에 유념해야 합니다; 파서가 입력의 끝을 감지하는 데 필요합니다.

@node 표현식 입력,,대화형 입력,최상위 요소들
@anchor{reference/toplevel_components expression-input}@anchor{25a4}@anchor{reference/toplevel_components id2}@anchor{25a5}
@subsection 표현식 입력


@geindex 입력

@geindex 내장 함수;eval

표현식 입력을 위해 @ref{4a4,,eval()} 이 사용됩니다. 앞에 오는 공백을 무시합니다. @code{eval()} 의 문자열 인자는 다음과 같은 형식을 취해야 합니다:

@example
@anchor{reference/toplevel_components grammar-token-python-grammar-eval_input}@anchor{25a6}eval_input: @ref{24e7,,expression_list} NEWLINE* ENDMARKER
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 전체 문법 규격,,최상위 요소들,파이썬 언어 레퍼런스
@anchor{reference/grammar doc}@anchor{2564}@anchor{reference/grammar full-grammar-specification}@anchor{25a7}@anchor{reference/grammar id1}@anchor{25a8}@anchor{reference/grammar translation-repo}@anchor{25a9}
@section 전체 문법 규격


이것은 CPython 구문 분석기를 생성하는 데 사용되는 문법에서 직접 파생된, 전체 파이썬 문법 규칙입니다 (Grammar/python.gram@footnote{https://github.com/python/cpython/tree/3.14/Grammar/python.gram}을 참조하십시오). 이 버전은 코드 생성과 에러 복구와 관련된 세부 정보를 생략합니다.

The notation used here is the same as in the preceding docs,
and is described in the @ref{2281,,notation} section,
except for an extra complication:


@itemize *

@item 
@code{~} (“cut”): commit to the current alternative; fail the rule
if the alternative fails to parse

Python mainly uses cuts for optimizations or improved error
messages. They often appear to be useless in the listing below.

@c see gh-143054, and CutValidator in the source, if you want to change this:

Cuts currently don’t appear inside parentheses, brackets, lookaheads
and similar.
Their behavior in these contexts is deliberately left unspecified.
@end itemize

@example
# PEG grammar for Python

@@trailer '@w{'}'
void *
_PyPegen_parse(Parser *p)
@{
    // Initialize keywords
    p->keywords = reserved_keywords;
    p->n_keyword_lists = n_keyword_lists;
    p->soft_keywords = soft_keywords;

    // Run parser
    void *result = NULL;
    if (p->start_rule == Py_file_input) @{
        result = file_rule(p);
    @} else if (p->start_rule == Py_single_input) @{
        result = interactive_rule(p);
    @} else if (p->start_rule == Py_eval_input) @{
        result = eval_rule(p);
    @} else if (p->start_rule == Py_func_type_input) @{
        result = func_type_rule(p);
    @}

    return result;
@}
'@w{'}'

# ========================= START OF THE GRAMMAR =========================

# General grammatical elements and rules:
#
# * Strings with double quotes (") denote SOFT KEYWORDS
# * Strings with single quotes (') denote KEYWORDS
# * Upper case names (NAME) denote tokens in the Grammar/Tokens file
# * Rule names starting with "invalid_" are used for specialized syntax errors
#     - These rules are NOT used in the first pass of the parser.
#     - Only if the first pass fails to parse, a second pass including the invalid
#       rules will be executed.
#     - If the parser fails in the second phase with a generic syntax error, the
#       location of the generic failure of the first pass will be used (this avoids
#       reporting incorrect locations due to the invalid rules).
#     - The order of the alternatives involving invalid rules matter
#       (like any rule in PEG).
#
# Grammar Syntax (see PEP 617 for more information):
#
# rule_name: expression
#   Optionally, a type can be included right after the rule name, which
#   specifies the return type of the C or Python function corresponding to the
#   rule:
# rule_name[return_type]: expression
#   If the return type is omitted, then a void * is returned in C and an Any in
#   Python.
# e1 e2
#   Match e1, then match e2.
# e1 | e2
#   Match e1 or e2.
#   The first alternative can also appear on the line after the rule name for
#   formatting purposes. In that case, a | must be used before the first
#   alternative, like so:
#       rule_name[return_type]:
#            | first_alt
#            | second_alt
# ( e )
#   Match e (allows also to use other operators in the group like '(e)*')
# [ e ] or e?
#   Optionally match e.
# e*
#   Match zero or more occurrences of e.
# e+
#   Match one or more occurrences of e.
# s.e+
#   Match one or more occurrences of e, separated by s. The generated parse tree
#   does not include the separator. This is otherwise identical to (e (s e)*).
# &e
#   Succeed if e can be parsed, without consuming any input.
# !e
#   Fail if e can be parsed, without consuming any input.
# ~
#   Commit to the current alternative, even if it fails to parse.
# &&e
#   Eager parse e. The parser will not backtrack and will immediately
#   fail with SyntaxError if e cannot be parsed.
#

# STARTING RULES
# ==============

file[mod_ty]: a=[statements] ENDMARKER @{ _PyPegen_make_module(p, a) @}
interactive[mod_ty]: a=statement_newline @{ _PyAST_Interactive(a, p->arena) @}
eval[mod_ty]: a=expressions NEWLINE* ENDMARKER @{ _PyAST_Expression(a, p->arena) @}
func_type[mod_ty]: '(' a=[type_expressions] ')' '->' b=expression NEWLINE* ENDMARKER @{ _PyAST_FunctionType(a, b, p->arena) @}

# GENERAL STATEMENTS
# ==================

statements[asdl_stmt_seq*]: a=statement+ @{ (asdl_stmt_seq*)_PyPegen_seq_flatten(p, a) @}

statement[asdl_stmt_seq*]:
    | a=compound_stmt @{ _PyPegen_register_stmts(p ,
                           (asdl_stmt_seq*)_PyPegen_singleton_seq(p, a)
                        ) @}
    | a[asdl_stmt_seq*]=simple_stmts @{ a @}

single_compound_stmt[asdl_stmt_seq*]:
    | a=compound_stmt @{
        _PyPegen_register_stmts(p, (asdl_stmt_seq*)_PyPegen_singleton_seq(p, a)) @}

statement_newline[asdl_stmt_seq*]:
    | a=single_compound_stmt NEWLINE @{ a @}
    | simple_stmts
    | NEWLINE @{ (asdl_stmt_seq*)_PyPegen_singleton_seq(p, CHECK(stmt_ty, _PyAST_Pass(EXTRA))) @}
    | ENDMARKER @{ _PyPegen_interactive_exit(p) @}

simple_stmts[asdl_stmt_seq*]:
    | a=simple_stmt !';' NEWLINE @{ (asdl_stmt_seq*)_PyPegen_singleton_seq(p, a) @} # Not needed, there for speedup
    | a[asdl_stmt_seq*]=';'.simple_stmt+ [';'] NEWLINE @{ a @}

# NOTE: assignment MUST precede expression, else parsing a simple assignment
# will throw a SyntaxError.
simple_stmt[stmt_ty] (memo):
    | assignment
    | &"type" type_alias
    | e=star_expressions @{ _PyAST_Expr(e, EXTRA) @}
    | &'return' return_stmt
    | &('import' | 'from') import_stmt
    | &'raise' raise_stmt
    | &'pass' pass_stmt
    | &'del' del_stmt
    | &'yield' yield_stmt
    | &'assert' assert_stmt
    | &'break' break_stmt
    | &'continue' continue_stmt
    | &'global' global_stmt
    | &'nonlocal' nonlocal_stmt

compound_stmt[stmt_ty]:
    | &('def' | '@@' | 'async') function_def
    | &'if' if_stmt
    | &('class' | '@@') class_def
    | &('with' | 'async') with_stmt
    | &('for' | 'async') for_stmt
    | &'try' try_stmt
    | &'while' while_stmt
    | match_stmt

# SIMPLE STATEMENTS
# =================

# NOTE: annotated_rhs may start with 'yield'; yield_expr must start with 'yield'
assignment[stmt_ty]:
    | a=NAME ':' b=expression c=['=' d=annotated_rhs @{ d @}] @{
        CHECK_VERSION(
            stmt_ty,
            6,
            "Variable annotation syntax is",
            _PyAST_AnnAssign(CHECK(expr_ty, _PyPegen_set_expr_context(p, a, Store)), b, c, 1, EXTRA)
        ) @}
    | a=('(' b=single_target ')' @{ b @}
         | single_subscript_attribute_target) ':' b=expression c=['=' d=annotated_rhs @{ d @}] @{
        CHECK_VERSION(stmt_ty, 6, "Variable annotations syntax is", _PyAST_AnnAssign(a, b, c, 0, EXTRA)) @}
    | a[asdl_expr_seq*]=(z=star_targets '=' @{ z @})+ b=annotated_rhs !'=' tc=[TYPE_COMMENT] @{
         _PyAST_Assign(a, b, NEW_TYPE_COMMENT(p, tc), EXTRA) @}
    | a=single_target b=augassign ~ c=annotated_rhs @{
         _PyAST_AugAssign(a, b->kind, c, EXTRA) @}
    | invalid_assignment

annotated_rhs[expr_ty]: yield_expr | star_expressions

augassign[AugOperator*]:
    | '+=' @{ _PyPegen_augoperator(p, Add) @}
    | '-=' @{ _PyPegen_augoperator(p, Sub) @}
    | '*=' @{ _PyPegen_augoperator(p, Mult) @}
    | '@@=' @{ CHECK_VERSION(AugOperator*, 5, "The '@@' operator is", _PyPegen_augoperator(p, MatMult)) @}
    | '/=' @{ _PyPegen_augoperator(p, Div) @}
    | '%=' @{ _PyPegen_augoperator(p, Mod) @}
    | '&=' @{ _PyPegen_augoperator(p, BitAnd) @}
    | '|=' @{ _PyPegen_augoperator(p, BitOr) @}
    | '^=' @{ _PyPegen_augoperator(p, BitXor) @}
    | '<<=' @{ _PyPegen_augoperator(p, LShift) @}
    | '>>=' @{ _PyPegen_augoperator(p, RShift) @}
    | '**=' @{ _PyPegen_augoperator(p, Pow) @}
    | '//=' @{ _PyPegen_augoperator(p, FloorDiv) @}

return_stmt[stmt_ty]:
    | 'return' a=[star_expressions] @{ _PyAST_Return(a, EXTRA) @}

raise_stmt[stmt_ty]:
    | 'raise' a=expression b=['from' z=expression @{ z @}] @{ _PyAST_Raise(a, b, EXTRA) @}
    | 'raise' @{ _PyAST_Raise(NULL, NULL, EXTRA) @}

pass_stmt[stmt_ty]:
    | 'pass' @{ _PyAST_Pass(EXTRA) @}

break_stmt[stmt_ty]:
    | 'break' @{ _PyAST_Break(EXTRA) @}

continue_stmt[stmt_ty]:
    | 'continue' @{ _PyAST_Continue(EXTRA) @}

global_stmt[stmt_ty]: 'global' a[asdl_expr_seq*]=','.NAME+ @{
    _PyAST_Global(CHECK(asdl_identifier_seq*, _PyPegen_map_names_to_ids(p, a)), EXTRA) @}

nonlocal_stmt[stmt_ty]: 'nonlocal' a[asdl_expr_seq*]=','.NAME+ @{
    _PyAST_Nonlocal(CHECK(asdl_identifier_seq*, _PyPegen_map_names_to_ids(p, a)), EXTRA) @}

del_stmt[stmt_ty]:
    | 'del' a=del_targets &(';' | NEWLINE) @{ _PyAST_Delete(a, EXTRA) @}
    | invalid_del_stmt

yield_stmt[stmt_ty]: y=yield_expr @{ _PyAST_Expr(y, EXTRA) @}

assert_stmt[stmt_ty]: 'assert' a=expression b=[',' z=expression @{ z @}] @{ _PyAST_Assert(a, b, EXTRA) @}

import_stmt[stmt_ty]:
    | invalid_import
    | import_name
    | import_from

# Import statements
# -----------------

import_name[stmt_ty]: 'import' a=dotted_as_names @{ _PyAST_Import(a, EXTRA) @}
# note below: the ('.' | '...') is necessary because '...' is tokenized as ELLIPSIS
import_from[stmt_ty]:
    | 'from' a=('.' | '...')* b=dotted_name 'import' c=import_from_targets @{
        _PyPegen_checked_future_import(p, b->v.Name.id, c, _PyPegen_seq_count_dots(a), EXTRA) @}
    | 'from' a=('.' | '...')+ 'import' b=import_from_targets @{
        _PyAST_ImportFrom(NULL, b, _PyPegen_seq_count_dots(a), EXTRA) @}
import_from_targets[asdl_alias_seq*]:
    | '(' a=import_from_as_names [','] ')' @{ a @}
    | import_from_as_names !','
    | '*' @{ (asdl_alias_seq*)_PyPegen_singleton_seq(p, CHECK(alias_ty, _PyPegen_alias_for_star(p, EXTRA))) @}
    | invalid_import_from_targets
import_from_as_names[asdl_alias_seq*]:
    | a[asdl_alias_seq*]=','.import_from_as_name+ @{ a @}
import_from_as_name[alias_ty]:
    | invalid_import_from_as_name
    | a=NAME b=['as' z=NAME @{ z @}] @{ _PyAST_alias(
        a->v.Name.id, (b) ? ((expr_ty) b)->v.Name.id : NULL, EXTRA) @}

dotted_as_names[asdl_alias_seq*]:
    | a[asdl_alias_seq*]=','.dotted_as_name+ @{ a @}
dotted_as_name[alias_ty]:
    | invalid_dotted_as_name
    | a=dotted_name b=['as' z=NAME @{ z @}] @{ _PyAST_alias(
        a->v.Name.id, (b) ? ((expr_ty) b)->v.Name.id : NULL, EXTRA) @}

dotted_name[expr_ty]:
    | a=dotted_name '.' b=NAME @{ _PyPegen_join_names_with_dot(p, a, b) @}
    | NAME

# COMPOUND STATEMENTS
# ===================

# Common elements
# ---------------

block[asdl_stmt_seq*] (memo):
    | NEWLINE INDENT a=statements DEDENT @{ a @}
    | simple_stmts
    | invalid_block

decorators[asdl_expr_seq*]: a[asdl_expr_seq*]=('@@' f=named_expression NEWLINE @{ f @})+ @{ a @}

# Class definitions
# -----------------

class_def[stmt_ty]:
    | a=decorators b=class_def_raw @{ _PyPegen_class_def_decorators(p, a, b) @}
    | class_def_raw

class_def_raw[stmt_ty]:
    | invalid_class_def_raw
    | 'class' a=NAME t=[type_params] b=['(' z=[arguments] ')' @{ z @}] ':' c=block @{
        _PyAST_ClassDef(a->v.Name.id,
                     (b) ? ((expr_ty) b)->v.Call.args : NULL,
                     (b) ? ((expr_ty) b)->v.Call.keywords : NULL,
                     c, NULL, t, EXTRA) @}

# Function definitions
# --------------------

function_def[stmt_ty]:
    | d=decorators f=function_def_raw @{ _PyPegen_function_def_decorators(p, d, f) @}
    | function_def_raw

function_def_raw[stmt_ty]:
    | invalid_def_raw
    | 'def' n=NAME t=[type_params] '(' params=[params] ')' a=['->' z=expression @{ z @}] ':' tc=[func_type_comment] b=block @{
        _PyAST_FunctionDef(n->v.Name.id,
                        (params) ? params : CHECK(arguments_ty, _PyPegen_empty_arguments(p)),
                        b, NULL, a, NEW_TYPE_COMMENT(p, tc), t, EXTRA) @}
    | 'async' 'def' n=NAME t=[type_params] '(' params=[params] ')' a=['->' z=expression @{ z @}] ':' tc=[func_type_comment] b=block @{
        CHECK_VERSION(
            stmt_ty,
            5,
            "Async functions are",
            _PyAST_AsyncFunctionDef(n->v.Name.id,
                            (params) ? params : CHECK(arguments_ty, _PyPegen_empty_arguments(p)),
                            b, NULL, a, NEW_TYPE_COMMENT(p, tc), t, EXTRA)
        ) @}

# Function parameters
# -------------------

params[arguments_ty]:
    | invalid_parameters
    | parameters

parameters[arguments_ty]:
    | a=slash_no_default b[asdl_arg_seq*]=param_no_default* c=param_with_default* d=[star_etc] @{
        CHECK_VERSION(arguments_ty, 8, "Positional-only parameters are", _PyPegen_make_arguments(p, a, NULL, b, c, d)) @}
    | a=slash_with_default b=param_with_default* c=[star_etc] @{
        CHECK_VERSION(arguments_ty, 8, "Positional-only parameters are", _PyPegen_make_arguments(p, NULL, a, NULL, b, c)) @}
    | a[asdl_arg_seq*]=param_no_default+ b=param_with_default* c=[star_etc] @{
        _PyPegen_make_arguments(p, NULL, NULL, a, b, c) @}
    | a=param_with_default+ b=[star_etc] @{ _PyPegen_make_arguments(p, NULL, NULL, NULL, a, b)@}
    | a=star_etc @{ _PyPegen_make_arguments(p, NULL, NULL, NULL, NULL, a) @}

# Some duplication here because we can't write (',' | &')'),
# which is because we don't support empty alternatives (yet).

slash_no_default[asdl_arg_seq*]:
    | a[asdl_arg_seq*]=param_no_default+ '/' ',' @{ a @}
    | a[asdl_arg_seq*]=param_no_default+ '/' &')' @{ a @}
slash_with_default[SlashWithDefault*]:
    | a=param_no_default* b=param_with_default+ '/' ',' @{ _PyPegen_slash_with_default(p, (asdl_arg_seq *)a, b) @}
    | a=param_no_default* b=param_with_default+ '/' &')' @{ _PyPegen_slash_with_default(p, (asdl_arg_seq *)a, b) @}

star_etc[StarEtc*]:
    | invalid_star_etc
    | '*' a=param_no_default b=param_maybe_default* c=[kwds] @{
        _PyPegen_star_etc(p, a, b, c) @}
    | '*' a=param_no_default_star_annotation b=param_maybe_default* c=[kwds] @{
        _PyPegen_star_etc(p, a, b, c) @}
    | '*' ',' b=param_maybe_default+ c=[kwds] @{
        _PyPegen_star_etc(p, NULL, b, c) @}
    | a=kwds @{ _PyPegen_star_etc(p, NULL, NULL, a) @}

kwds[arg_ty]:
    | invalid_kwds
    | '**' a=param_no_default @{ a @}

# One parameter.  This *includes* a following comma and type comment.
#
# There are three styles:
# - No default
# - With default
# - Maybe with default
#
# There are two alternative forms of each, to deal with type comments:
# - Ends in a comma followed by an optional type comment
# - No comma, optional type comment, must be followed by close paren
# The latter form is for a final parameter without trailing comma.
#

param_no_default[arg_ty]:
    | a=param ',' tc=TYPE_COMMENT? @{ _PyPegen_add_type_comment_to_arg(p, a, tc) @}
    | a=param tc=TYPE_COMMENT? &')' @{ _PyPegen_add_type_comment_to_arg(p, a, tc) @}
param_no_default_star_annotation[arg_ty]:
    | a=param_star_annotation ',' tc=TYPE_COMMENT? @{ _PyPegen_add_type_comment_to_arg(p, a, tc) @}
    | a=param_star_annotation tc=TYPE_COMMENT? &')' @{ _PyPegen_add_type_comment_to_arg(p, a, tc) @}
param_with_default[NameDefaultPair*]:
    | a=param c=default ',' tc=TYPE_COMMENT? @{ _PyPegen_name_default_pair(p, a, c, tc) @}
    | a=param c=default tc=TYPE_COMMENT? &')' @{ _PyPegen_name_default_pair(p, a, c, tc) @}
param_maybe_default[NameDefaultPair*]:
    | a=param c=default? ',' tc=TYPE_COMMENT? @{ _PyPegen_name_default_pair(p, a, c, tc) @}
    | a=param c=default? tc=TYPE_COMMENT? &')' @{ _PyPegen_name_default_pair(p, a, c, tc) @}
param[arg_ty]: a=NAME b=annotation? @{ _PyAST_arg(a->v.Name.id, b, NULL, EXTRA) @}
param_star_annotation[arg_ty]: a=NAME b=star_annotation @{ _PyAST_arg(a->v.Name.id, b, NULL, EXTRA) @}
annotation[expr_ty]: ':' a=expression @{ a @}
star_annotation[expr_ty]: ':' a=star_expression @{ a @}
default[expr_ty]: '=' a=expression @{ a @} | invalid_default

# If statement
# ------------

if_stmt[stmt_ty]:
    | invalid_if_stmt
    | 'if' a=named_expression ':' b=block c=elif_stmt @{
        _PyAST_If(a, b, CHECK(asdl_stmt_seq*, _PyPegen_singleton_seq(p, c)), EXTRA) @}
    | 'if' a=named_expression ':' b=block c=[else_block] @{ _PyAST_If(a, b, c, EXTRA) @}
elif_stmt[stmt_ty]:
    | invalid_elif_stmt
    | 'elif' a=named_expression ':' b=block c=elif_stmt @{
        _PyAST_If(a, b, CHECK(asdl_stmt_seq*, _PyPegen_singleton_seq(p, c)), EXTRA) @}
    | 'elif' a=named_expression ':' b=block c=[else_block] @{ _PyAST_If(a, b, c, EXTRA) @}
else_block[asdl_stmt_seq*]:
    | invalid_else_stmt
    | 'else' &&':' b=block @{ b @}

# While statement
# ---------------

while_stmt[stmt_ty]:
    | invalid_while_stmt
    | 'while' a=named_expression ':' b=block c=[else_block] @{ _PyAST_While(a, b, c, EXTRA) @}

# For statement
# -------------

for_stmt[stmt_ty]:
    | invalid_for_stmt
    | 'for' t=star_targets 'in' ~ ex=star_expressions ':' tc=[TYPE_COMMENT] b=block el=[else_block] @{
        _PyAST_For(t, ex, b, el, NEW_TYPE_COMMENT(p, tc), EXTRA) @}
    | 'async' 'for' t=star_targets 'in' ~ ex=star_expressions ':' tc=[TYPE_COMMENT] b=block el=[else_block] @{
        CHECK_VERSION(stmt_ty, 5, "Async for loops are", _PyAST_AsyncFor(t, ex, b, el, NEW_TYPE_COMMENT(p, tc), EXTRA)) @}
    | invalid_for_target

# With statement
# --------------

with_stmt[stmt_ty]:
    | invalid_with_stmt_indent
    | 'with' '(' a[asdl_withitem_seq*]=','.with_item+ ','? ')' ':' tc=[TYPE_COMMENT] b=block @{
       _PyAST_With(a, b, NEW_TYPE_COMMENT(p, tc), EXTRA) @}
    | 'with' a[asdl_withitem_seq*]=','.with_item+ ':' tc=[TYPE_COMMENT] b=block @{
        _PyAST_With(a, b, NEW_TYPE_COMMENT(p, tc), EXTRA) @}
    | 'async' 'with' '(' a[asdl_withitem_seq*]=','.with_item+ ','? ')' ':' b=block @{
       CHECK_VERSION(stmt_ty, 5, "Async with statements are", _PyAST_AsyncWith(a, b, NULL, EXTRA)) @}
    | 'async' 'with' a[asdl_withitem_seq*]=','.with_item+ ':' tc=[TYPE_COMMENT] b=block @{
       CHECK_VERSION(stmt_ty, 5, "Async with statements are", _PyAST_AsyncWith(a, b, NEW_TYPE_COMMENT(p, tc), EXTRA)) @}
    | invalid_with_stmt

with_item[withitem_ty]:
    | e=expression 'as' t=star_target &(',' | ')' | ':') @{ _PyAST_withitem(e, t, p->arena) @}
    | invalid_with_item
    | e=expression @{ _PyAST_withitem(e, NULL, p->arena) @}

# Try statement
# -------------

try_stmt[stmt_ty]:
    | invalid_try_stmt
    | 'try' &&':' b=block f=finally_block @{ _PyAST_Try(b, NULL, NULL, f, EXTRA) @}
    | 'try' &&':' b=block ex[asdl_excepthandler_seq*]=except_block+ el=[else_block] f=[finally_block] @{ _PyAST_Try(b, ex, el, f, EXTRA) @}
    | 'try' &&':' b=block ex[asdl_excepthandler_seq*]=except_star_block+ el=[else_block] f=[finally_block] @{
        CHECK_VERSION(stmt_ty, 11, "Exception groups are",
                      _PyAST_TryStar(b, ex, el, f, EXTRA)) @}


# Except statement
# ----------------

except_block[excepthandler_ty]:
    | invalid_except_stmt_indent
    | 'except' e=expression ':' b=block @{
        _PyAST_ExceptHandler(e, NULL, b, EXTRA) @}
    | 'except' e=expression 'as' t=NAME ':' b=block @{
        _PyAST_ExceptHandler(e, ((expr_ty) t)->v.Name.id, b, EXTRA) @}
    | 'except' e=expressions ':' b=block @{
        CHECK_VERSION(
            excepthandler_ty,
            14,
            "except expressions without parentheses are",
            _PyAST_ExceptHandler(e, NULL, b, EXTRA)) @}
    | 'except' ':' b=block @{ _PyAST_ExceptHandler(NULL, NULL, b, EXTRA) @}
    | invalid_except_stmt
except_star_block[excepthandler_ty]:
    | invalid_except_star_stmt_indent
    | 'except' '*' e=expression ':' b=block @{
        _PyAST_ExceptHandler(e, NULL, b, EXTRA) @}
    | 'except' '*' e=expression 'as' t=NAME ':' b=block @{
        _PyAST_ExceptHandler(e, ((expr_ty) t)->v.Name.id, b, EXTRA) @}
    | 'except' '*' e=expressions ':' b=block @{
        CHECK_VERSION(
            excepthandler_ty,
            14,
            "except expressions without parentheses are",
            _PyAST_ExceptHandler(e,  NULL, b, EXTRA)) @}
    | invalid_except_star_stmt
finally_block[asdl_stmt_seq*]:
    | invalid_finally_stmt
    | 'finally' &&':' a=block @{ a @}

# Match statement
# ---------------

match_stmt[stmt_ty]:
    | "match" subject=subject_expr ':' NEWLINE INDENT cases[asdl_match_case_seq*]=case_block+ DEDENT @{
        CHECK_VERSION(stmt_ty, 10, "Pattern matching is", _PyAST_Match(subject, cases, EXTRA)) @}
    | invalid_match_stmt

subject_expr[expr_ty]:
    | value=star_named_expression ',' values=star_named_expressions? @{
        _PyAST_Tuple(CHECK(asdl_expr_seq*, _PyPegen_seq_insert_in_front(p, value, values)), Load, EXTRA) @}
    | named_expression

case_block[match_case_ty]:
    | invalid_case_block
    | "case" pattern=patterns guard=guard? ':' body=block @{
        _PyAST_match_case(pattern, guard, body, p->arena) @}

guard[expr_ty]: 'if' guard=named_expression @{ guard @}

patterns[pattern_ty]:
    | patterns[asdl_pattern_seq*]=open_sequence_pattern @{
        _PyAST_MatchSequence(patterns, EXTRA) @}
    | pattern

pattern[pattern_ty]:
    | as_pattern
    | or_pattern

as_pattern[pattern_ty]:
    | pattern=or_pattern 'as' target=pattern_capture_target @{
        _PyAST_MatchAs(pattern, target->v.Name.id, EXTRA) @}
    | invalid_as_pattern

or_pattern[pattern_ty]:
    | patterns[asdl_pattern_seq*]='|'.closed_pattern+ @{
        asdl_seq_LEN(patterns) == 1 ? asdl_seq_GET(patterns, 0) : _PyAST_MatchOr(patterns, EXTRA) @}

closed_pattern[pattern_ty] (memo):
    | literal_pattern
    | capture_pattern
    | wildcard_pattern
    | value_pattern
    | group_pattern
    | sequence_pattern
    | mapping_pattern
    | class_pattern

# Literal patterns are used for equality and identity constraints
literal_pattern[pattern_ty]:
    | value=signed_number !('+' | '-') @{ _PyAST_MatchValue(value, EXTRA) @}
    | value=complex_number @{ _PyAST_MatchValue(value, EXTRA) @}
    | value=strings @{ _PyAST_MatchValue(value, EXTRA) @}
    | 'None' @{ _PyAST_MatchSingleton(Py_None, EXTRA) @}
    | 'True' @{ _PyAST_MatchSingleton(Py_True, EXTRA) @}
    | 'False' @{ _PyAST_MatchSingleton(Py_False, EXTRA) @}

# Literal expressions are used to restrict permitted mapping pattern keys
literal_expr[expr_ty]:
    | signed_number !('+' | '-')
    | complex_number
    | &(STRING|FSTRING_START|TSTRING_START) strings
    | 'None' @{ _PyAST_Constant(Py_None, NULL, EXTRA) @}
    | 'True' @{ _PyAST_Constant(Py_True, NULL, EXTRA) @}
    | 'False' @{ _PyAST_Constant(Py_False, NULL, EXTRA) @}

complex_number[expr_ty]:
    | real=signed_real_number '+' imag=imaginary_number @{
        _PyAST_BinOp(real, Add, imag, EXTRA) @}
    | real=signed_real_number '-' imag=imaginary_number  @{
        _PyAST_BinOp(real, Sub, imag, EXTRA) @}

signed_number[expr_ty]:
    | NUMBER
    | '-' number=NUMBER @{ _PyAST_UnaryOp(USub, number, EXTRA) @}

signed_real_number[expr_ty]:
    | real_number
    | '-' real=real_number @{ _PyAST_UnaryOp(USub, real, EXTRA) @}

real_number[expr_ty]:
    | real=NUMBER @{ _PyPegen_ensure_real(p, real) @}

imaginary_number[expr_ty]:
    | imag=NUMBER @{ _PyPegen_ensure_imaginary(p, imag) @}

capture_pattern[pattern_ty]:
    | target=pattern_capture_target @{ _PyAST_MatchAs(NULL, target->v.Name.id, EXTRA) @}

pattern_capture_target[expr_ty]:
    | !"_" name=NAME !('.' | '(' | '=') @{
        _PyPegen_set_expr_context(p, name, Store) @}

wildcard_pattern[pattern_ty]:
    | "_" @{ _PyAST_MatchAs(NULL, NULL, EXTRA) @}

value_pattern[pattern_ty]:
    | attr=attr !('.' | '(' | '=') @{ _PyAST_MatchValue(attr, EXTRA) @}

attr[expr_ty]:
    | value=name_or_attr '.' attr=NAME @{
        _PyAST_Attribute(value, attr->v.Name.id, Load, EXTRA) @}

name_or_attr[expr_ty]:
    | attr
    | NAME

group_pattern[pattern_ty]:
    | '(' pattern=pattern ')' @{ pattern @}

sequence_pattern[pattern_ty]:
    | '[' patterns=maybe_sequence_pattern? ']' @{ _PyAST_MatchSequence(patterns, EXTRA) @}
    | '(' patterns=open_sequence_pattern? ')' @{ _PyAST_MatchSequence(patterns, EXTRA) @}

open_sequence_pattern[asdl_seq*]:
    | pattern=maybe_star_pattern ',' patterns=maybe_sequence_pattern? @{
        _PyPegen_seq_insert_in_front(p, pattern, patterns) @}

maybe_sequence_pattern[asdl_seq*]:
    | patterns=','.maybe_star_pattern+ ','? @{ patterns @}

maybe_star_pattern[pattern_ty]:
    | star_pattern
    | pattern

star_pattern[pattern_ty] (memo):
    | '*' target=pattern_capture_target @{
        _PyAST_MatchStar(target->v.Name.id, EXTRA) @}
    | '*' wildcard_pattern @{
        _PyAST_MatchStar(NULL, EXTRA) @}

mapping_pattern[pattern_ty]:
    | '@{' '@}' @{
        _PyAST_MatchMapping(NULL, NULL, NULL, EXTRA) @}
    | '@{' rest=double_star_pattern ','? '@}' @{
        _PyAST_MatchMapping(NULL, NULL, rest->v.Name.id, EXTRA) @}
    | '@{' items=items_pattern ',' rest=double_star_pattern ','? '@}' @{
        _PyAST_MatchMapping(
            CHECK(asdl_expr_seq*, _PyPegen_get_pattern_keys(p, items)),
            CHECK(asdl_pattern_seq*, _PyPegen_get_patterns(p, items)),
            rest->v.Name.id,
            EXTRA) @}
    | '@{' items=items_pattern ','? '@}' @{
        _PyAST_MatchMapping(
            CHECK(asdl_expr_seq*, _PyPegen_get_pattern_keys(p, items)),
            CHECK(asdl_pattern_seq*, _PyPegen_get_patterns(p, items)),
            NULL,
            EXTRA) @}

items_pattern[asdl_seq*]:
    | ','.key_value_pattern+

key_value_pattern[KeyPatternPair*]:
    | key=(literal_expr | attr) ':' pattern=pattern @{
        _PyPegen_key_pattern_pair(p, key, pattern) @}

double_star_pattern[expr_ty]:
    | '**' target=pattern_capture_target @{ target @}

class_pattern[pattern_ty]:
    | cls=name_or_attr '(' ')' @{
        _PyAST_MatchClass(cls, NULL, NULL, NULL, EXTRA) @}
    | cls=name_or_attr '(' patterns=positional_patterns ','? ')' @{
        _PyAST_MatchClass(cls, patterns, NULL, NULL, EXTRA) @}
    | cls=name_or_attr '(' keywords=keyword_patterns ','? ')' @{
        _PyAST_MatchClass(
            cls, NULL,
            CHECK(asdl_identifier_seq*, _PyPegen_map_names_to_ids(p,
                CHECK(asdl_expr_seq*, _PyPegen_get_pattern_keys(p, keywords)))),
            CHECK(asdl_pattern_seq*, _PyPegen_get_patterns(p, keywords)),
            EXTRA) @}
    | cls=name_or_attr '(' patterns=positional_patterns ',' keywords=keyword_patterns ','? ')' @{
        _PyAST_MatchClass(
            cls,
            patterns,
            CHECK(asdl_identifier_seq*, _PyPegen_map_names_to_ids(p,
                CHECK(asdl_expr_seq*, _PyPegen_get_pattern_keys(p, keywords)))),
            CHECK(asdl_pattern_seq*, _PyPegen_get_patterns(p, keywords)),
            EXTRA) @}
    | invalid_class_pattern

positional_patterns[asdl_pattern_seq*]:
    | args[asdl_pattern_seq*]=','.pattern+ @{ args @}

keyword_patterns[asdl_seq*]:
    | ','.keyword_pattern+

keyword_pattern[KeyPatternPair*]:
    | arg=NAME '=' value=pattern @{ _PyPegen_key_pattern_pair(p, arg, value) @}

# Type statement
# ---------------

type_alias[stmt_ty]:
    | "type" n=NAME t=[type_params] '=' b=expression @{
        CHECK_VERSION(stmt_ty, 12, "Type statement is",
        _PyAST_TypeAlias(CHECK(expr_ty, _PyPegen_set_expr_context(p, n, Store)), t, b, EXTRA)) @}

# Type parameter declaration
# --------------------------

type_params[asdl_type_param_seq*]:
    | invalid_type_params
    | '[' t=type_param_seq ']' @{
        CHECK_VERSION(asdl_type_param_seq *, 12, "Type parameter lists are", t) @}

type_param_seq[asdl_type_param_seq*]: a[asdl_type_param_seq*]=','.type_param+ [','] @{ a @}

type_param[type_param_ty] (memo):
    | a=NAME b=[type_param_bound] c=[type_param_default] @{ _PyAST_TypeVar(a->v.Name.id, b, c, EXTRA) @}
    | invalid_type_param
    | '*' a=NAME b=[type_param_starred_default] @{ _PyAST_TypeVarTuple(a->v.Name.id, b, EXTRA) @}
    | '**' a=NAME b=[type_param_default] @{ _PyAST_ParamSpec(a->v.Name.id, b, EXTRA) @}

type_param_bound[expr_ty]: ':' e=expression @{ e @}
type_param_default[expr_ty]: '=' e=expression @{
    CHECK_VERSION(expr_ty, 13, "Type parameter defaults are", e) @}
type_param_starred_default[expr_ty]: '=' e=star_expression @{
    CHECK_VERSION(expr_ty, 13, "Type parameter defaults are", e) @}

# EXPRESSIONS
# -----------

expressions[expr_ty]:
    | a=expression b=(',' c=expression @{ c @})+ [','] @{
        _PyAST_Tuple(CHECK(asdl_expr_seq*, _PyPegen_seq_insert_in_front(p, a, b)), Load, EXTRA) @}
    | a=expression ',' @{ _PyAST_Tuple(CHECK(asdl_expr_seq*, _PyPegen_singleton_seq(p, a)), Load, EXTRA) @}
    | expression

expression[expr_ty] (memo):
    | invalid_expression
    | invalid_legacy_expression
    | a=disjunction 'if' b=disjunction 'else' c=expression @{ _PyAST_IfExp(b, a, c, EXTRA) @}
    | disjunction
    | lambdef

yield_expr[expr_ty]:
    | 'yield' 'from' a=expression @{ _PyAST_YieldFrom(a, EXTRA) @}
    | 'yield' a=[star_expressions] @{ _PyAST_Yield(a, EXTRA) @}

star_expressions[expr_ty]:
    | a=star_expression b=(',' c=star_expression @{ c @})+ [','] @{
        _PyAST_Tuple(CHECK(asdl_expr_seq*, _PyPegen_seq_insert_in_front(p, a, b)), Load, EXTRA) @}
    | a=star_expression ',' @{ _PyAST_Tuple(CHECK(asdl_expr_seq*, _PyPegen_singleton_seq(p, a)), Load, EXTRA) @}
    | star_expression

star_expression[expr_ty] (memo):
    | '*' a=bitwise_or @{ _PyAST_Starred(a, Load, EXTRA) @}
    | expression

star_named_expressions[asdl_expr_seq*]: a[asdl_expr_seq*]=','.star_named_expression+ [','] @{ a @}

star_named_expression[expr_ty]:
    | '*' a=bitwise_or @{ _PyAST_Starred(a, Load, EXTRA) @}
    | named_expression

assignment_expression[expr_ty]:
    | a=NAME ':=' ~ b=expression @{
        CHECK_VERSION(expr_ty, 8, "Assignment expressions are",
        _PyAST_NamedExpr(CHECK(expr_ty, _PyPegen_set_expr_context(p, a, Store)), b, EXTRA)) @}

named_expression[expr_ty]:
    | assignment_expression
    | invalid_named_expression
    | expression !':='

disjunction[expr_ty] (memo):
    | a=conjunction b=('or' c=conjunction @{ c @})+ @{ _PyAST_BoolOp(
        Or,
        CHECK(asdl_expr_seq*, _PyPegen_seq_insert_in_front(p, a, b)),
        EXTRA) @}
    | conjunction

conjunction[expr_ty] (memo):
    | a=inversion b=('and' c=inversion @{ c @})+ @{ _PyAST_BoolOp(
        And,
        CHECK(asdl_expr_seq*, _PyPegen_seq_insert_in_front(p, a, b)),
        EXTRA) @}
    | inversion

inversion[expr_ty] (memo):
    | 'not' a=inversion @{ _PyAST_UnaryOp(Not, a, EXTRA) @}
    | comparison

# Comparison operators
# --------------------

comparison[expr_ty]:
    | a=bitwise_or b=compare_op_bitwise_or_pair+ @{
        _PyAST_Compare(
            a,
            CHECK(asdl_int_seq*, _PyPegen_get_cmpops(p, b)),
            CHECK(asdl_expr_seq*, _PyPegen_get_exprs(p, b)),
            EXTRA) @}
    | bitwise_or

compare_op_bitwise_or_pair[CmpopExprPair*]:
    | eq_bitwise_or
    | noteq_bitwise_or
    | lte_bitwise_or
    | lt_bitwise_or
    | gte_bitwise_or
    | gt_bitwise_or
    | notin_bitwise_or
    | in_bitwise_or
    | isnot_bitwise_or
    | is_bitwise_or

eq_bitwise_or[CmpopExprPair*]: '==' a=bitwise_or @{ _PyPegen_cmpop_expr_pair(p, Eq, a) @}
noteq_bitwise_or[CmpopExprPair*]:
    | (tok='!=' @{ _PyPegen_check_barry_as_flufl(p, tok) ? NULL : tok@}) a=bitwise_or @{_PyPegen_cmpop_expr_pair(p, NotEq, a) @}
lte_bitwise_or[CmpopExprPair*]: '<=' a=bitwise_or @{ _PyPegen_cmpop_expr_pair(p, LtE, a) @}
lt_bitwise_or[CmpopExprPair*]: '<' a=bitwise_or @{ _PyPegen_cmpop_expr_pair(p, Lt, a) @}
gte_bitwise_or[CmpopExprPair*]: '>=' a=bitwise_or @{ _PyPegen_cmpop_expr_pair(p, GtE, a) @}
gt_bitwise_or[CmpopExprPair*]: '>' a=bitwise_or @{ _PyPegen_cmpop_expr_pair(p, Gt, a) @}
notin_bitwise_or[CmpopExprPair*]: 'not' 'in' a=bitwise_or @{ _PyPegen_cmpop_expr_pair(p, NotIn, a) @}
in_bitwise_or[CmpopExprPair*]: 'in' a=bitwise_or @{ _PyPegen_cmpop_expr_pair(p, In, a) @}
isnot_bitwise_or[CmpopExprPair*]: 'is' 'not' a=bitwise_or @{ _PyPegen_cmpop_expr_pair(p, IsNot, a) @}
is_bitwise_or[CmpopExprPair*]: 'is' a=bitwise_or @{ _PyPegen_cmpop_expr_pair(p, Is, a) @}

# Bitwise operators
# -----------------

bitwise_or[expr_ty]:
    | a=bitwise_or '|' b=bitwise_xor @{ _PyAST_BinOp(a, BitOr, b, EXTRA) @}
    | bitwise_xor

bitwise_xor[expr_ty]:
    | a=bitwise_xor '^' b=bitwise_and @{ _PyAST_BinOp(a, BitXor, b, EXTRA) @}
    | bitwise_and

bitwise_and[expr_ty]:
    | a=bitwise_and '&' b=shift_expr @{ _PyAST_BinOp(a, BitAnd, b, EXTRA) @}
    | shift_expr

shift_expr[expr_ty]:
    | a=shift_expr '<<' b=sum @{ _PyAST_BinOp(a, LShift, b, EXTRA) @}
    | a=shift_expr '>>' b=sum @{ _PyAST_BinOp(a, RShift, b, EXTRA) @}
    | invalid_arithmetic
    | sum

# Arithmetic operators
# --------------------

sum[expr_ty]:
    | a=sum '+' b=term @{ _PyAST_BinOp(a, Add, b, EXTRA) @}
    | a=sum '-' b=term @{ _PyAST_BinOp(a, Sub, b, EXTRA) @}
    | term

term[expr_ty]:
    | a=term '*' b=factor @{ _PyAST_BinOp(a, Mult, b, EXTRA) @}
    | a=term '/' b=factor @{ _PyAST_BinOp(a, Div, b, EXTRA) @}
    | a=term '//' b=factor @{ _PyAST_BinOp(a, FloorDiv, b, EXTRA) @}
    | a=term '%' b=factor @{ _PyAST_BinOp(a, Mod, b, EXTRA) @}
    | a=term '@@' b=factor @{ CHECK_VERSION(expr_ty, 5, "The '@@' operator is", _PyAST_BinOp(a, MatMult, b, EXTRA)) @}
    | invalid_factor
    | factor

factor[expr_ty] (memo):
    | '+' a=factor @{ _PyAST_UnaryOp(UAdd, a, EXTRA) @}
    | '-' a=factor @{ _PyAST_UnaryOp(USub, a, EXTRA) @}
    | '~' a=factor @{ _PyAST_UnaryOp(Invert, a, EXTRA) @}
    | power

power[expr_ty]:
    | a=await_primary '**' b=factor @{ _PyAST_BinOp(a, Pow, b, EXTRA) @}
    | await_primary

# Primary elements
# ----------------

# Primary elements are things like "obj.something.something", "obj[something]", "obj(something)", "obj" ...

await_primary[expr_ty] (memo):
    | 'await' a=primary @{ CHECK_VERSION(expr_ty, 5, "Await expressions are", _PyAST_Await(a, EXTRA)) @}
    | primary

primary[expr_ty]:
    | a=primary '.' b=NAME @{ _PyAST_Attribute(a, b->v.Name.id, Load, EXTRA) @}
    | a=primary b=genexp @{ _PyAST_Call(a, CHECK(asdl_expr_seq*, (asdl_expr_seq*)_PyPegen_singleton_seq(p, b)), NULL, EXTRA) @}
    | a=primary '(' b=[arguments] ')' @{
        _PyAST_Call(a,
                 (b) ? ((expr_ty) b)->v.Call.args : NULL,
                 (b) ? ((expr_ty) b)->v.Call.keywords : NULL,
                 EXTRA) @}
    | a=primary '[' b=slices ']' @{ _PyAST_Subscript(a, b, Load, EXTRA) @}
    | atom

slices[expr_ty]:
    | a=slice !',' @{ a @}
    | a[asdl_expr_seq*]=','.(slice | starred_expression)+ [','] @{ _PyAST_Tuple(a, Load, EXTRA) @}

slice[expr_ty]:
    | a=[expression] ':' b=[expression] c=[':' d=[expression] @{ d @}] @{ _PyAST_Slice(a, b, c, EXTRA) @}
    | a=named_expression @{ a @}

atom[expr_ty]:
    | NAME
    | 'True' @{ _PyAST_Constant(Py_True, NULL, EXTRA) @}
    | 'False' @{ _PyAST_Constant(Py_False, NULL, EXTRA) @}
    | 'None' @{ _PyAST_Constant(Py_None, NULL, EXTRA) @}
    | &(STRING|FSTRING_START|TSTRING_START) strings
    | NUMBER
    | &'(' (tuple | group | genexp)
    | &'[' (list | listcomp)
    | &'@{' (dict | set | dictcomp | setcomp)
    | '...' @{ _PyAST_Constant(Py_Ellipsis, NULL, EXTRA) @}

group[expr_ty]:
    | '(' a=(yield_expr | named_expression) ')' @{ a @}
    | invalid_group

# Lambda functions
# ----------------

lambdef[expr_ty]:
    | 'lambda' a=[lambda_params] ':' b=expression @{
        _PyAST_Lambda((a) ? a : CHECK(arguments_ty, _PyPegen_empty_arguments(p)), b, EXTRA) @}

lambda_params[arguments_ty]:
    | invalid_lambda_parameters
    | lambda_parameters

# lambda_parameters etc. duplicates parameters but without annotations
# or type comments, and if there's no comma after a parameter, we expect
# a colon, not a close parenthesis.  (For more, see parameters above.)
#
lambda_parameters[arguments_ty]:
    | a=lambda_slash_no_default b[asdl_arg_seq*]=lambda_param_no_default* c=lambda_param_with_default* d=[lambda_star_etc] @{
        CHECK_VERSION(arguments_ty, 8, "Positional-only parameters are", _PyPegen_make_arguments(p, a, NULL, b, c, d)) @}
    | a=lambda_slash_with_default b=lambda_param_with_default* c=[lambda_star_etc] @{
        CHECK_VERSION(arguments_ty, 8, "Positional-only parameters are", _PyPegen_make_arguments(p, NULL, a, NULL, b, c)) @}
    | a[asdl_arg_seq*]=lambda_param_no_default+ b=lambda_param_with_default* c=[lambda_star_etc] @{
        _PyPegen_make_arguments(p, NULL, NULL, a, b, c) @}
    | a=lambda_param_with_default+ b=[lambda_star_etc] @{ _PyPegen_make_arguments(p, NULL, NULL, NULL, a, b)@}
    | a=lambda_star_etc @{ _PyPegen_make_arguments(p, NULL, NULL, NULL, NULL, a) @}

lambda_slash_no_default[asdl_arg_seq*]:
    | a[asdl_arg_seq*]=lambda_param_no_default+ '/' ',' @{ a @}
    | a[asdl_arg_seq*]=lambda_param_no_default+ '/' &':' @{ a @}

lambda_slash_with_default[SlashWithDefault*]:
    | a=lambda_param_no_default* b=lambda_param_with_default+ '/' ',' @{ _PyPegen_slash_with_default(p, (asdl_arg_seq *)a, b) @}
    | a=lambda_param_no_default* b=lambda_param_with_default+ '/' &':' @{ _PyPegen_slash_with_default(p, (asdl_arg_seq *)a, b) @}

lambda_star_etc[StarEtc*]:
    | invalid_lambda_star_etc
    | '*' a=lambda_param_no_default b=lambda_param_maybe_default* c=[lambda_kwds] @{
        _PyPegen_star_etc(p, a, b, c) @}
    | '*' ',' b=lambda_param_maybe_default+ c=[lambda_kwds] @{
        _PyPegen_star_etc(p, NULL, b, c) @}
    | a=lambda_kwds @{ _PyPegen_star_etc(p, NULL, NULL, a) @}

lambda_kwds[arg_ty]:
    | invalid_lambda_kwds
    | '**' a=lambda_param_no_default @{ a @}

lambda_param_no_default[arg_ty]:
    | a=lambda_param ',' @{ a @}
    | a=lambda_param &':' @{ a @}
lambda_param_with_default[NameDefaultPair*]:
    | a=lambda_param c=default ',' @{ _PyPegen_name_default_pair(p, a, c, NULL) @}
    | a=lambda_param c=default &':' @{ _PyPegen_name_default_pair(p, a, c, NULL) @}
lambda_param_maybe_default[NameDefaultPair*]:
    | a=lambda_param c=default? ',' @{ _PyPegen_name_default_pair(p, a, c, NULL) @}
    | a=lambda_param c=default? &':' @{ _PyPegen_name_default_pair(p, a, c, NULL) @}
lambda_param[arg_ty]: a=NAME @{ _PyAST_arg(a->v.Name.id, NULL, NULL, EXTRA) @}

# LITERALS
# ========

fstring_middle[expr_ty]:
    | fstring_replacement_field
    | t=FSTRING_MIDDLE @{ _PyPegen_constant_from_token(p, t) @}
fstring_replacement_field[expr_ty]:
    | '@{' a=annotated_rhs debug_expr='='? conversion=[fstring_conversion] format=[fstring_full_format_spec] rbrace='@}' @{
        _PyPegen_formatted_value(p, a, debug_expr, conversion, format, rbrace, EXTRA) @}
    | invalid_fstring_replacement_field
fstring_conversion[ResultTokenWithMetadata*]:
    | conv_token="!" conv=NAME @{ _PyPegen_check_fstring_conversion(p, conv_token, conv) @}
fstring_full_format_spec[ResultTokenWithMetadata*]:
    | colon=':' spec=fstring_format_spec* @{ _PyPegen_setup_full_format_spec(p, colon, (asdl_expr_seq *) spec, EXTRA) @}
fstring_format_spec[expr_ty]:
    | t=FSTRING_MIDDLE @{ _PyPegen_decoded_constant_from_token(p, t) @}
    | fstring_replacement_field
fstring[expr_ty]:
    | a=FSTRING_START b=fstring_middle* c=FSTRING_END @{ _PyPegen_joined_str(p, a, (asdl_expr_seq*)b, c) @}

tstring_format_spec_replacement_field[expr_ty]:
    | '@{' a=annotated_rhs debug_expr='='? conversion=[fstring_conversion] format=[tstring_full_format_spec] rbrace='@}' @{
        _PyPegen_formatted_value(p, a, debug_expr, conversion, format, rbrace, EXTRA) @}
    | invalid_tstring_replacement_field
tstring_format_spec[expr_ty]:
    | t=TSTRING_MIDDLE @{ _PyPegen_decoded_constant_from_token(p, t) @}
    | tstring_format_spec_replacement_field
tstring_full_format_spec[ResultTokenWithMetadata*]:
    | colon=':' spec=tstring_format_spec* @{ _PyPegen_setup_full_format_spec(p, colon, (asdl_expr_seq *) spec, EXTRA) @}
tstring_replacement_field[expr_ty]:
    | '@{' a=annotated_rhs debug_expr='='? conversion=[fstring_conversion] format=[tstring_full_format_spec] rbrace='@}' @{
        _PyPegen_interpolation(p, a, debug_expr, conversion, format, rbrace, EXTRA) @}
    | invalid_tstring_replacement_field
tstring_middle[expr_ty]:
    | tstring_replacement_field
    | t=TSTRING_MIDDLE @{ _PyPegen_constant_from_token(p, t) @}
tstring[expr_ty] (memo):
    | a=TSTRING_START b=tstring_middle* c=TSTRING_END @{
        CHECK_VERSION(
            expr_ty,
            14,
            "t-strings are",
            _PyPegen_template_str(p, a, (asdl_expr_seq*)b, c)) @}

string[expr_ty]: s[Token*]=STRING @{ _PyPegen_constant_from_string(p, s) @}
strings[expr_ty] (memo):
    | invalid_string_tstring_concat
    | a[asdl_expr_seq*]=(fstring|string)+ @{ _PyPegen_concatenate_strings(p, a, EXTRA) @}
    | a[asdl_expr_seq*]=tstring+ @{ _PyPegen_concatenate_tstrings(p, a, EXTRA) @}

list[expr_ty]:
    | '[' a=[star_named_expressions] ']' @{ _PyAST_List(a, Load, EXTRA) @}

tuple[expr_ty]:
    | '(' a=[y=star_named_expression ',' z=[star_named_expressions] @{ _PyPegen_seq_insert_in_front(p, y, z) @} ] ')' @{
        _PyAST_Tuple(a, Load, EXTRA) @}

set[expr_ty]: '@{' a=star_named_expressions '@}' @{ _PyAST_Set(a, EXTRA) @}

# Dicts
# -----

dict[expr_ty]:
    | '@{' a=[double_starred_kvpairs] '@}' @{
        _PyAST_Dict(
            CHECK(asdl_expr_seq*, _PyPegen_get_keys(p, a)),
            CHECK(asdl_expr_seq*, _PyPegen_get_values(p, a)),
            EXTRA) @}
    | '@{' invalid_double_starred_kvpairs '@}'

double_starred_kvpairs[asdl_seq*]: a=','.double_starred_kvpair+ [','] @{ a @}

double_starred_kvpair[KeyValuePair*]:
    | '**' a=bitwise_or @{ _PyPegen_key_value_pair(p, NULL, a) @}
    | kvpair

kvpair[KeyValuePair*]: a=expression ':' b=expression @{ _PyPegen_key_value_pair(p, a, b) @}

# Comprehensions & Generators
# ---------------------------

for_if_clauses[asdl_comprehension_seq*]:
    | a[asdl_comprehension_seq*]=for_if_clause+ @{ a @}

for_if_clause[comprehension_ty]:
    | 'async' 'for' a=star_targets 'in' ~ b=disjunction c[asdl_expr_seq*]=('if' z=disjunction @{ z @})* @{
        CHECK_VERSION(comprehension_ty, 6, "Async comprehensions are", _PyAST_comprehension(a, b, c, 1, p->arena)) @}
    | 'for' a=star_targets 'in' ~ b=disjunction c[asdl_expr_seq*]=('if' z=disjunction @{ z @})* @{
        _PyAST_comprehension(a, b, c, 0, p->arena) @}
    | invalid_for_if_clause
    | invalid_for_target

listcomp[expr_ty]:
    | '[' a=named_expression b=for_if_clauses ']' @{ _PyAST_ListComp(a, b, EXTRA) @}
    | invalid_comprehension

setcomp[expr_ty]:
    | '@{' a=named_expression b=for_if_clauses '@}' @{ _PyAST_SetComp(a, b, EXTRA) @}
    | invalid_comprehension

genexp[expr_ty]:
    | '(' a=( assignment_expression | expression !':=') b=for_if_clauses ')' @{ _PyAST_GeneratorExp(a, b, EXTRA) @}
    | invalid_comprehension

dictcomp[expr_ty]:
    | '@{' a=kvpair b=for_if_clauses '@}' @{ _PyAST_DictComp(a->key, a->value, b, EXTRA) @}
    | invalid_dict_comprehension

# FUNCTION CALL ARGUMENTS
# =======================

arguments[expr_ty] (memo):
    | a=args [','] &')' @{ a @}
    | invalid_arguments

args[expr_ty]:
    | a[asdl_expr_seq*]=','.(starred_expression | ( assignment_expression | expression !':=') !'=')+ b=[',' k=kwargs @{k@}] @{
        _PyPegen_collect_call_seqs(p, a, b, EXTRA) @}
    | a=kwargs @{ _PyAST_Call(_PyPegen_dummy_name(p),
                          CHECK_NULL_ALLOWED(asdl_expr_seq*, _PyPegen_seq_extract_starred_exprs(p, a)),
                          CHECK_NULL_ALLOWED(asdl_keyword_seq*, _PyPegen_seq_delete_starred_exprs(p, a)),
                          EXTRA) @}

kwargs[asdl_seq*]:
    | a=','.kwarg_or_starred+ ',' b=','.kwarg_or_double_starred+ @{ _PyPegen_join_sequences(p, a, b) @}
    | ','.kwarg_or_starred+
    | ','.kwarg_or_double_starred+

starred_expression[expr_ty]:
    | invalid_starred_expression_unpacking
    | '*' a=expression @{ _PyAST_Starred(a, Load, EXTRA) @}
    | invalid_starred_expression

kwarg_or_starred[KeywordOrStarred*]:
    | invalid_kwarg
    | a=NAME '=' b=expression @{
        _PyPegen_keyword_or_starred(p, CHECK(keyword_ty, _PyAST_keyword(a->v.Name.id, b, EXTRA)), 1) @}
    | a=starred_expression @{ _PyPegen_keyword_or_starred(p, a, 0) @}

kwarg_or_double_starred[KeywordOrStarred*]:
    | invalid_kwarg
    | a=NAME '=' b=expression @{
        _PyPegen_keyword_or_starred(p, CHECK(keyword_ty, _PyAST_keyword(a->v.Name.id, b, EXTRA)), 1) @}
    | '**' a=expression @{ _PyPegen_keyword_or_starred(p, CHECK(keyword_ty, _PyAST_keyword(NULL, a, EXTRA)), 1) @}

# ASSIGNMENT TARGETS
# ==================

# Generic targets
# ---------------

# NOTE: star_targets may contain *bitwise_or, targets may not.
star_targets[expr_ty]:
    | a=star_target !',' @{ a @}
    | a=star_target b=(',' c=star_target @{ c @})* [','] @{
        _PyAST_Tuple(CHECK(asdl_expr_seq*, _PyPegen_seq_insert_in_front(p, a, b)), Store, EXTRA) @}

star_targets_list_seq[asdl_expr_seq*]: a[asdl_expr_seq*]=','.star_target+ [','] @{ a @}

star_targets_tuple_seq[asdl_expr_seq*]:
    | a=star_target b=(',' c=star_target @{ c @})+ [','] @{ (asdl_expr_seq*) _PyPegen_seq_insert_in_front(p, a, b) @}
    | a=star_target ',' @{ (asdl_expr_seq*) _PyPegen_singleton_seq(p, a) @}

star_target[expr_ty] (memo):
    | '*' a=(!'*' star_target) @{
        _PyAST_Starred(CHECK(expr_ty, _PyPegen_set_expr_context(p, a, Store)), Store, EXTRA) @}
    | target_with_star_atom

target_with_star_atom[expr_ty] (memo):
    | a=t_primary '.' b=NAME !t_lookahead @{ _PyAST_Attribute(a, b->v.Name.id, Store, EXTRA) @}
    | a=t_primary '[' b=slices ']' !t_lookahead @{ _PyAST_Subscript(a, b, Store, EXTRA) @}
    | star_atom

star_atom[expr_ty]:
    | a=NAME @{ _PyPegen_set_expr_context(p, a, Store) @}
    | '(' a=target_with_star_atom ')' @{ _PyPegen_set_expr_context(p, a, Store) @}
    | '(' a=[star_targets_tuple_seq] ')' @{ _PyAST_Tuple(a, Store, EXTRA) @}
    | '[' a=[star_targets_list_seq] ']' @{ _PyAST_List(a, Store, EXTRA) @}

single_target[expr_ty]:
    | single_subscript_attribute_target
    | a=NAME @{ _PyPegen_set_expr_context(p, a, Store) @}
    | '(' a=single_target ')' @{ a @}

single_subscript_attribute_target[expr_ty]:
    | a=t_primary '.' b=NAME !t_lookahead @{ _PyAST_Attribute(a, b->v.Name.id, Store, EXTRA) @}
    | a=t_primary '[' b=slices ']' !t_lookahead @{ _PyAST_Subscript(a, b, Store, EXTRA) @}

t_primary[expr_ty]:
    | a=t_primary '.' b=NAME &t_lookahead @{ _PyAST_Attribute(a, b->v.Name.id, Load, EXTRA) @}
    | a=t_primary '[' b=slices ']' &t_lookahead @{ _PyAST_Subscript(a, b, Load, EXTRA) @}
    | a=t_primary b=genexp &t_lookahead @{
        _PyAST_Call(a, CHECK(asdl_expr_seq*, (asdl_expr_seq*)_PyPegen_singleton_seq(p, b)), NULL, EXTRA) @}
    | a=t_primary '(' b=[arguments] ')' &t_lookahead @{
        _PyAST_Call(a,
                 (b) ? ((expr_ty) b)->v.Call.args : NULL,
                 (b) ? ((expr_ty) b)->v.Call.keywords : NULL,
                 EXTRA) @}
    | a=atom &t_lookahead @{ a @}

t_lookahead: '(' | '[' | '.'

# Targets for del statements
# --------------------------

del_targets[asdl_expr_seq*]: a[asdl_expr_seq*]=','.del_target+ [','] @{ a @}

del_target[expr_ty] (memo):
    | a=t_primary '.' b=NAME !t_lookahead @{ _PyAST_Attribute(a, b->v.Name.id, Del, EXTRA) @}
    | a=t_primary '[' b=slices ']' !t_lookahead @{ _PyAST_Subscript(a, b, Del, EXTRA) @}
    | del_t_atom

del_t_atom[expr_ty]:
    | a=NAME @{ _PyPegen_set_expr_context(p, a, Del) @}
    | '(' a=del_target ')' @{ _PyPegen_set_expr_context(p, a, Del) @}
    | '(' a=[del_targets] ')' @{ _PyAST_Tuple(a, Del, EXTRA) @}
    | '[' a=[del_targets] ']' @{ _PyAST_List(a, Del, EXTRA) @}

# TYPING ELEMENTS
# ---------------

# type_expressions allow */** but ignore them
type_expressions[asdl_expr_seq*]:
    | a=','.expression+ ',' '*' b=expression ',' '**' c=expression @{
        (asdl_expr_seq*)_PyPegen_seq_append_to_end(
            p,
            CHECK(asdl_seq*, _PyPegen_seq_append_to_end(p, a, b)),
            c) @}
    | a=','.expression+ ',' '*' b=expression @{ (asdl_expr_seq*)_PyPegen_seq_append_to_end(p, a, b) @}
    | a=','.expression+ ',' '**' b=expression @{ (asdl_expr_seq*)_PyPegen_seq_append_to_end(p, a, b) @}
    | '*' a=expression ',' '**' b=expression @{
        (asdl_expr_seq*)_PyPegen_seq_append_to_end(
            p,
            CHECK(asdl_seq*, _PyPegen_singleton_seq(p, a)),
            b) @}
    | '*' a=expression @{ (asdl_expr_seq*)_PyPegen_singleton_seq(p, a) @}
    | '**' a=expression @{ (asdl_expr_seq*)_PyPegen_singleton_seq(p, a) @}
    | a[asdl_expr_seq*]=','.expression+ @{a@}

func_type_comment[Token*]:
    | NEWLINE t=TYPE_COMMENT &(NEWLINE INDENT) @{ t @}  # Must be followed by indented block
    | invalid_double_type_comments
    | TYPE_COMMENT

# ========================= END OF THE GRAMMAR ===========================



# ========================= START OF INVALID RULES =======================

# From here on, there are rules for invalid syntax with specialised error messages
invalid_arguments:
    | ((','.(starred_expression | ( assignment_expression | expression !':=') !'=')+ ',' kwargs) | kwargs) a=',' ','.(starred_expression !'=')+ @{
        RAISE_SYNTAX_ERROR_STARTING_FROM(a, "iterable argument unpacking follows keyword argument unpacking") @}
    | a=expression b=for_if_clauses ',' [args | expression for_if_clauses] @{
        RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, _PyPegen_get_last_comprehension_item(PyPegen_last_item(b, comprehension_ty)), "Generator expression must be parenthesized") @}
    | a=NAME b='=' expression for_if_clauses @{
        RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, "invalid syntax. Maybe you meant '==' or ':=' instead of '='?")@}
    | (args ',')? a=NAME b='=' &(',' | ')') @{
        RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, "expected argument value expression")@}
    | a=args b=for_if_clauses @{ _PyPegen_nonparen_genexp_in_call(p, a, b) @}
    | args ',' a=expression b=for_if_clauses @{
        RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, _PyPegen_get_last_comprehension_item(PyPegen_last_item(b, comprehension_ty)), "Generator expression must be parenthesized") @}
    | a=args ',' args @{ _PyPegen_arguments_parsing_error(p, a) @}
invalid_kwarg:
    | a[Token*]=('True'|'False'|'None') b='=' @{
        RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, "cannot assign to %s", PyBytes_AS_STRING(a->bytes)) @}
    | a=NAME b='=' expression for_if_clauses @{
        RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, "invalid syntax. Maybe you meant '==' or ':=' instead of '='?")@}
    | !(NAME '=') a=expression b='=' @{
        RAISE_SYNTAX_ERROR_KNOWN_RANGE(
            a, b, "expression cannot contain assignment, perhaps you meant \"==\"?") @}
    | a='**' expression '=' b=expression @{
        RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, "cannot assign to keyword argument unpacking") @}

# IMPORTANT: Note that the "_without_invalid" suffix causes the rule to not call invalid rules under it
expression_without_invalid[expr_ty]:
    | a=disjunction 'if' b=disjunction 'else' c=expression @{ _PyAST_IfExp(b, a, c, EXTRA) @}
    | disjunction
    | lambdef
invalid_legacy_expression:
    | a=NAME !'(' b=star_expressions @{
        _PyPegen_check_legacy_stmt(p, a) ? RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b,
            "Missing parentheses in call to '%U'. Did you mean %U(...)?", a->v.Name.id, a->v.Name.id) : NULL@}

invalid_type_param:
    | '*' a=NAME colon=':' e=expression @{
            RAISE_SYNTAX_ERROR_STARTING_FROM(colon, e->kind == Tuple_kind
                ? "cannot use constraints with TypeVarTuple"
                : "cannot use bound with TypeVarTuple")
        @}
    | '**' a=NAME colon=':' e=expression @{
            RAISE_SYNTAX_ERROR_STARTING_FROM(colon, e->kind == Tuple_kind
                ? "cannot use constraints with ParamSpec"
                : "cannot use bound with ParamSpec")
        @}

invalid_expression:
   |  STRING a=(!STRING expression_without_invalid)+ STRING @{
        RAISE_SYNTAX_ERROR_KNOWN_RANGE( PyPegen_first_item(a, expr_ty), PyPegen_last_item(a, expr_ty),
        "invalid syntax. Is this intended to be part of the string?") @}
    # !(NAME STRING) is not matched so we don't show this error with some invalid string prefixes like: kf"dsfsdf"
    # Soft keywords need to also be ignored because they can be parsed as NAME NAME
   | !(NAME STRING | SOFT_KEYWORD) a=disjunction b=expression_without_invalid @{
        _PyPegen_check_legacy_stmt(p, a) ? NULL : p->tokens[p->mark-1]->level == 0 ? NULL :
        RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, "invalid syntax. Perhaps you forgot a comma?") @}
   | a=disjunction 'if' b=disjunction !('else'|':') @{ RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, "expected 'else' after 'if' expression") @}
   | a=disjunction 'if' b=disjunction 'else' !expression @{
        RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN("expected expression after 'else', but statement is given") @}
   | a[stmt_ty]=(pass_stmt|break_stmt|continue_stmt) 'if' b=disjunction 'else' c=simple_stmt @{
        RAISE_SYNTAX_ERROR_KNOWN_LOCATION (a, "expected expression before 'if', but statement is given") @}
   | a='lambda' [lambda_params] b=':' &FSTRING_MIDDLE  @{
        RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, "f-string: lambda expressions are not allowed without parentheses") @}
   | a='lambda' [lambda_params] b=':' &TSTRING_MIDDLE  @{
        RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, "t-string: lambda expressions are not allowed without parentheses") @}

invalid_named_expression(memo):
    | a=expression ':=' expression @{
        RAISE_SYNTAX_ERROR_KNOWN_LOCATION(
            a, "cannot use assignment expressions with %s", _PyPegen_get_expr_name(a)) @}
    | a=NAME '=' b=bitwise_or !('='|':=') @{
        RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, "invalid syntax. Maybe you meant '==' or ':=' instead of '='?") @}
    | !(list|tuple|genexp|'True'|'None'|'False') a=bitwise_or b='=' bitwise_or !('='|':=') @{
        RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "cannot assign to %s here. Maybe you meant '==' instead of '='?",
                                          _PyPegen_get_expr_name(a)) @}

invalid_assignment:
    | a=invalid_ann_assign_target ':' expression @{
        RAISE_SYNTAX_ERROR_KNOWN_LOCATION(
            a,
            "only single target (not %s) can be annotated",
            _PyPegen_get_expr_name(a)
        )@}
    | a=star_named_expression ',' star_named_expressions* ':' expression @{
        RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "only single target (not tuple) can be annotated") @}
    | a=expression ':' expression @{
        RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "illegal target for annotation") @}
    | (star_targets '=')* a=star_expressions '=' @{
        RAISE_SYNTAX_ERROR_INVALID_TARGET(STAR_TARGETS, a) @}
    | (star_targets '=')* a=yield_expr '=' @{ RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "assignment to yield expression not possible") @}
    | a=star_expressions augassign annotated_rhs @{
        RAISE_SYNTAX_ERROR_KNOWN_LOCATION(
            a,
            "'%s' is an illegal expression for augmented assignment",
            _PyPegen_get_expr_name(a)
        )@}
invalid_ann_assign_target[expr_ty]:
    | list
    | tuple
    | '(' a=invalid_ann_assign_target ')' @{ a @}
invalid_del_stmt:
    | 'del' a=star_expressions @{
        RAISE_SYNTAX_ERROR_INVALID_TARGET(DEL_TARGETS, a) @}
invalid_block:
    | NEWLINE !INDENT @{ RAISE_INDENTATION_ERROR("expected an indented block") @}
invalid_comprehension:
    | ('[' | '(' | '@{') a=starred_expression for_if_clauses @{
        RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "iterable unpacking cannot be used in comprehension") @}
    | ('[' | '@{') a=star_named_expression ',' b=star_named_expressions for_if_clauses @{
        RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, PyPegen_last_item(b, expr_ty),
        "did you forget parentheses around the comprehension target?") @}
    | ('[' | '@{') a=star_named_expression b=',' for_if_clauses @{
        RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, "did you forget parentheses around the comprehension target?") @}
invalid_dict_comprehension:
    | '@{' a='**' bitwise_or for_if_clauses '@}' @{
        RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "dict unpacking cannot be used in dict comprehension") @}
invalid_parameters:
    | a="/" ',' @{
        RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "at least one argument must precede /") @}
    | (slash_no_default | slash_with_default) param_maybe_default* a='/' @{
        RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "/ may appear only once") @}
    | slash_no_default? param_no_default* invalid_parameters_helper a=param_no_default @{
        RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "parameter without a default follows parameter with a default") @}
    | param_no_default* a='(' param_no_default+ ','? b=')' @{
        RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, "Function parameters cannot be parenthesized") @}
    | (slash_no_default | slash_with_default)? param_maybe_default* '*' (',' | param_no_default) param_maybe_default* a='/' @{
        RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "/ must be ahead of *") @}
    | param_maybe_default+ '/' a='*' @{
        RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "expected comma between / and *") @}
invalid_default:
    | a='=' &(')'|',') @{ RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "expected default value expression") @}
invalid_star_etc:
    | a='*' (')' | ',' (')' | '**')) @{ RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "named arguments must follow bare *") @}
    | '*' ',' TYPE_COMMENT @{ RAISE_SYNTAX_ERROR("bare * has associated type comment") @}
    | '*' param a='=' @{ RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "var-positional argument cannot have default value") @}
    | '*' (param_no_default | ',') param_maybe_default* a='*' (param_no_default | ',') @{
        RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "* argument may appear only once") @}
invalid_kwds:
    | '**' param a='=' @{ RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "var-keyword argument cannot have default value") @}
    | '**' param ',' a=param @{ RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "arguments cannot follow var-keyword argument") @}
    | '**' param ',' a[Token*]=('*'|'**'|'/') @{ RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "arguments cannot follow var-keyword argument") @}
invalid_parameters_helper: # This is only there to avoid type errors
    | a=slash_with_default @{ _PyPegen_singleton_seq(p, a) @}
    | param_with_default+
invalid_lambda_parameters:
    | a="/" ',' @{
        RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "at least one argument must precede /") @}
    | (lambda_slash_no_default | lambda_slash_with_default) lambda_param_maybe_default* a='/' @{
        RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "/ may appear only once") @}
    | lambda_slash_no_default? lambda_param_no_default* invalid_lambda_parameters_helper a=lambda_param_no_default @{
        RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "parameter without a default follows parameter with a default") @}
    | lambda_param_no_default* a='(' ','.lambda_param+ ','? b=')' @{
        RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, "Lambda expression parameters cannot be parenthesized") @}
    | (lambda_slash_no_default | lambda_slash_with_default)? lambda_param_maybe_default* '*' (',' | lambda_param_no_default) lambda_param_maybe_default* a='/' @{
        RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "/ must be ahead of *") @}
    | lambda_param_maybe_default+ '/' a='*' @{
        RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "expected comma between / and *") @}
invalid_lambda_parameters_helper:
    | a=lambda_slash_with_default @{ _PyPegen_singleton_seq(p, a) @}
    | lambda_param_with_default+
invalid_lambda_star_etc:
    | '*' (':' | ',' (':' | '**')) @{ RAISE_SYNTAX_ERROR("named arguments must follow bare *") @}
    | '*' lambda_param a='=' @{ RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "var-positional argument cannot have default value") @}
    | '*' (lambda_param_no_default | ',') lambda_param_maybe_default* a='*' (lambda_param_no_default | ',') @{
        RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "* argument may appear only once") @}
invalid_lambda_kwds:
    | '**' lambda_param a='=' @{ RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "var-keyword argument cannot have default value") @}
    | '**' lambda_param ',' a=lambda_param @{ RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "arguments cannot follow var-keyword argument") @}
    | '**' lambda_param ',' a[Token*]=('*'|'**'|'/') @{ RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "arguments cannot follow var-keyword argument") @}
invalid_double_type_comments:
    | TYPE_COMMENT NEWLINE TYPE_COMMENT NEWLINE INDENT @{
        RAISE_SYNTAX_ERROR("Cannot have two type comments on def") @}
invalid_with_item:
    | expression 'as' a=expression &(',' | ')' | ':') @{
        RAISE_SYNTAX_ERROR_INVALID_TARGET(STAR_TARGETS, a) @}

invalid_for_if_clause:
    | 'async'? 'for' (bitwise_or (',' bitwise_or)* [',']) !'in' @{
        RAISE_SYNTAX_ERROR("'in' expected after for-loop variables") @}

invalid_for_target:
    | 'async'? 'for' a=star_expressions @{
        RAISE_SYNTAX_ERROR_INVALID_TARGET(FOR_TARGETS, a) @}

invalid_group:
    | '(' a=starred_expression ')' @{
        RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "cannot use starred expression here") @}
    | '(' a='**' expression ')' @{
        RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "cannot use double starred expression here") @}
invalid_import:
    | a='import' ','.dotted_name+ 'from' dotted_name @{
        RAISE_SYNTAX_ERROR_STARTING_FROM(a, "Did you mean to use 'from ... import ...' instead?") @}
    | 'import' token=NEWLINE @{
        RAISE_SYNTAX_ERROR_STARTING_FROM(token, "Expected one or more names after 'import'") @}
invalid_dotted_as_name:
    | dotted_name 'as' !(NAME (',' | ')' | ';' | NEWLINE)) a=expression @{
        RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a,
            "cannot use %s as import target", _PyPegen_get_expr_name(a)) @}
invalid_import_from_as_name:
    | NAME 'as' !(NAME (',' | ')' | ';' | NEWLINE)) a=expression @{
        RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a,
            "cannot use %s as import target", _PyPegen_get_expr_name(a)) @}

invalid_import_from_targets:
    | import_from_as_names ',' NEWLINE @{
        RAISE_SYNTAX_ERROR("trailing comma not allowed without surrounding parentheses") @}
    | token=NEWLINE @{
        RAISE_SYNTAX_ERROR_STARTING_FROM(token, "Expected one or more names after 'import'") @}

invalid_with_stmt:
    | ['async'] 'with' ','.(expression ['as' star_target])+ NEWLINE @{ RAISE_SYNTAX_ERROR("expected ':'") @}
    | ['async'] 'with' '(' ','.(expressions ['as' star_target])+ ','? ')' NEWLINE @{ RAISE_SYNTAX_ERROR("expected ':'") @}
invalid_with_stmt_indent:
    | ['async'] a='with' ','.(expression ['as' star_target])+ ':' NEWLINE !INDENT @{
        RAISE_INDENTATION_ERROR("expected an indented block after 'with' statement on line %d", a->lineno) @}
    | ['async'] a='with' '(' ','.(expressions ['as' star_target])+ ','? ')' ':' NEWLINE !INDENT @{
        RAISE_INDENTATION_ERROR("expected an indented block after 'with' statement on line %d", a->lineno) @}

invalid_try_stmt:
    | a='try' ':' NEWLINE !INDENT @{
        RAISE_INDENTATION_ERROR("expected an indented block after 'try' statement on line %d", a->lineno) @}
    | 'try' ':' block !('except' | 'finally') @{ RAISE_SYNTAX_ERROR("expected 'except' or 'finally' block") @}
    | 'try' ':' block* except_block+ a='except' b='*' expression ['as' NAME] ':' @{
        RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, "cannot have both 'except' and 'except*' on the same 'try'") @}
    | 'try' ':' block* except_star_block+ a='except' [expression ['as' NAME]] ':' @{
        RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "cannot have both 'except' and 'except*' on the same 'try'") @}
invalid_except_stmt:
    | 'except' a=expression ',' expressions 'as' NAME  ':' @{
        RAISE_SYNTAX_ERROR_STARTING_FROM(a, "multiple exception types must be parenthesized when using 'as'") @}
    | a='except' expression ['as' NAME ] NEWLINE @{ RAISE_SYNTAX_ERROR("expected ':'") @}
    | a='except' NEWLINE @{ RAISE_SYNTAX_ERROR("expected ':'") @}
    | 'except' expression 'as' a=expression ':' block @{
        RAISE_SYNTAX_ERROR_KNOWN_LOCATION(
            a, "cannot use except statement with %s", _PyPegen_get_expr_name(a)) @}
invalid_except_star_stmt:
    | 'except' '*' a=expression ',' expressions 'as' NAME  ':' @{
        RAISE_SYNTAX_ERROR_STARTING_FROM(a, "multiple exception types must be parenthesized when using 'as'") @}
    | a='except' '*' expression ['as' NAME ] NEWLINE @{ RAISE_SYNTAX_ERROR("expected ':'") @}
    | a='except' '*' (NEWLINE | ':') @{ RAISE_SYNTAX_ERROR("expected one or more exception types") @}
    | 'except' '*' expression 'as' a=expression ':' block @{
        RAISE_SYNTAX_ERROR_KNOWN_LOCATION(
            a, "cannot use except* statement with %s", _PyPegen_get_expr_name(a)) @}
invalid_finally_stmt:
    | a='finally' ':' NEWLINE !INDENT @{
        RAISE_INDENTATION_ERROR("expected an indented block after 'finally' statement on line %d", a->lineno) @}
invalid_except_stmt_indent:
    | a='except' expression ['as' NAME ] ':' NEWLINE !INDENT @{
        RAISE_INDENTATION_ERROR("expected an indented block after 'except' statement on line %d", a->lineno) @}
    | a='except' ':' NEWLINE !INDENT @{ RAISE_INDENTATION_ERROR("expected an indented block after 'except' statement on line %d", a->lineno) @}
invalid_except_star_stmt_indent:
    | a='except' '*' expression ['as' NAME ] ':' NEWLINE !INDENT @{
        RAISE_INDENTATION_ERROR("expected an indented block after 'except*' statement on line %d", a->lineno) @}
invalid_match_stmt:
    | "match" subject_expr NEWLINE @{ CHECK_VERSION(void*, 10, "Pattern matching is", RAISE_SYNTAX_ERROR("expected ':'") ) @}
    | a="match" subject=subject_expr ':' NEWLINE !INDENT @{
        RAISE_INDENTATION_ERROR("expected an indented block after 'match' statement on line %d", a->lineno) @}
invalid_case_block:
    | "case" patterns guard? NEWLINE @{ RAISE_SYNTAX_ERROR("expected ':'") @}
    | a="case" patterns guard? ':' NEWLINE !INDENT @{
        RAISE_INDENTATION_ERROR("expected an indented block after 'case' statement on line %d", a->lineno) @}
invalid_as_pattern:
    | or_pattern 'as' a="_" @{ RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "cannot use '_' as a target") @}
    | or_pattern 'as' a=expression @{
        RAISE_SYNTAX_ERROR_KNOWN_LOCATION(
            a, "cannot use %s as pattern target", _PyPegen_get_expr_name(a)) @}
invalid_class_pattern:
    | name_or_attr '(' a=invalid_class_argument_pattern  @{ RAISE_SYNTAX_ERROR_KNOWN_RANGE(
        PyPegen_first_item(a, pattern_ty),
        PyPegen_last_item(a, pattern_ty),
        "positional patterns follow keyword patterns") @}
invalid_class_argument_pattern[asdl_pattern_seq*]:
    | [positional_patterns ','] keyword_patterns ',' a=positional_patterns @{ a @}
invalid_if_stmt:
    | 'if' named_expression NEWLINE @{ RAISE_SYNTAX_ERROR("expected ':'") @}
    | a='if' a=named_expression ':' NEWLINE !INDENT @{
        RAISE_INDENTATION_ERROR("expected an indented block after 'if' statement on line %d", a->lineno) @}
invalid_elif_stmt:
    | 'elif' named_expression NEWLINE @{ RAISE_SYNTAX_ERROR("expected ':'") @}
    | a='elif' named_expression ':' NEWLINE !INDENT @{
        RAISE_INDENTATION_ERROR("expected an indented block after 'elif' statement on line %d", a->lineno) @}
invalid_else_stmt:
    | a='else' ':' NEWLINE !INDENT @{
        RAISE_INDENTATION_ERROR("expected an indented block after 'else' statement on line %d", a->lineno) @}
    | 'else' ':' block 'elif' @{ RAISE_SYNTAX_ERROR("'elif' block follows an 'else' block")@}
invalid_while_stmt:
    | 'while' named_expression NEWLINE @{ RAISE_SYNTAX_ERROR("expected ':'") @}
    | a='while' named_expression ':' NEWLINE !INDENT @{
        RAISE_INDENTATION_ERROR("expected an indented block after 'while' statement on line %d", a->lineno) @}
invalid_for_stmt:
    | ['async'] 'for' star_targets 'in' star_expressions NEWLINE @{ RAISE_SYNTAX_ERROR("expected ':'") @}
    | ['async'] a='for' star_targets 'in' star_expressions ':' NEWLINE !INDENT @{
        RAISE_INDENTATION_ERROR("expected an indented block after 'for' statement on line %d", a->lineno) @}
invalid_def_raw:
    | ['async'] a='def' NAME [type_params] '(' [params] ')' ['->' expression] ':' NEWLINE !INDENT @{
        RAISE_INDENTATION_ERROR("expected an indented block after function definition on line %d", a->lineno) @}
    | ['async'] 'def' NAME [type_params] &&'(' [params] ')' ['->' expression] &&':' [func_type_comment] block
invalid_class_def_raw:
    | 'class' NAME [type_params] ['(' [arguments] ')'] NEWLINE @{ RAISE_SYNTAX_ERROR("expected ':'") @}
    | a='class' NAME [type_params] ['(' [arguments] ')'] ':' NEWLINE !INDENT @{
        RAISE_INDENTATION_ERROR("expected an indented block after class definition on line %d", a->lineno) @}

invalid_double_starred_kvpairs:
    | ','.double_starred_kvpair+ ',' invalid_kvpair
    | expression ':' a='*' bitwise_or @{ RAISE_SYNTAX_ERROR_STARTING_FROM(a, "cannot use a starred expression in a dictionary value") @}
    | expression a=':' &('@}'|',') @{ RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "expression expected after dictionary key and ':'") @}
invalid_kvpair:
    | a=expression !(':') @{
        RAISE_ERROR_KNOWN_LOCATION(p, PyExc_SyntaxError, a->lineno, a->end_col_offset - 1, a->end_lineno, -1, "':' expected after dictionary key") @}
    | expression ':' a='*' bitwise_or @{ RAISE_SYNTAX_ERROR_STARTING_FROM(a, "cannot use a starred expression in a dictionary value") @}
    | expression a=':' &('@}'|',') @{RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "expression expected after dictionary key and ':'") @}
invalid_starred_expression_unpacking:
    | a='*' expression '=' b=expression @{ RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, "cannot assign to iterable argument unpacking") @}
invalid_starred_expression:
    | '*' @{ RAISE_SYNTAX_ERROR("Invalid star expression") @}

invalid_fstring_replacement_field:
    | '@{' a='=' @{ RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "f-string: valid expression required before '='") @}
    | '@{' a='!' @{ RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "f-string: valid expression required before '!'") @}
    | '@{' a=':' @{ RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "f-string: valid expression required before ':'") @}
    | '@{' a='@}' @{ RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "f-string: valid expression required before '@}'") @}
    | '@{' !annotated_rhs @{ RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN("f-string: expecting a valid expression after '@{'") @}
    | '@{' annotated_rhs !('=' | '!' | ':' | '@}') @{
        PyErr_Occurred() ? NULL : RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN("f-string: expecting '=', or '!', or ':', or '@}'") @}
    | '@{' annotated_rhs '=' !('!' | ':' | '@}') @{
        PyErr_Occurred() ? NULL : RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN("f-string: expecting '!', or ':', or '@}'") @}
    | '@{' annotated_rhs '='? invalid_fstring_conversion_character
    | '@{' annotated_rhs '='? ['!' NAME] !(':' | '@}') @{
        PyErr_Occurred() ? NULL : RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN("f-string: expecting ':' or '@}'") @}
    | '@{' annotated_rhs '='? ['!' NAME] ':' fstring_format_spec* !'@}' @{
        PyErr_Occurred() ? NULL : RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN("f-string: expecting '@}', or format specs") @}
    | '@{' annotated_rhs '='? ['!' NAME] !'@}' @{
        PyErr_Occurred() ? NULL : RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN("f-string: expecting '@}'") @}

invalid_fstring_conversion_character:
    | '!' &(':' | '@}') @{ RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN("f-string: missing conversion character") @}
    | '!' !NAME @{ RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN("f-string: invalid conversion character") @}

invalid_tstring_replacement_field:
    | '@{' a='=' @{ RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "t-string: valid expression required before '='") @}
    | '@{' a='!' @{ RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "t-string: valid expression required before '!'") @}
    | '@{' a=':' @{ RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "t-string: valid expression required before ':'") @}
    | '@{' a='@}' @{ RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "t-string: valid expression required before '@}'") @}
    | '@{' !annotated_rhs @{ RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN("t-string: expecting a valid expression after '@{'") @}
    | '@{' annotated_rhs !('=' | '!' | ':' | '@}') @{
        PyErr_Occurred() ? NULL : RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN("t-string: expecting '=', or '!', or ':', or '@}'") @}
    | '@{' annotated_rhs '=' !('!' | ':' | '@}') @{
        PyErr_Occurred() ? NULL : RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN("t-string: expecting '!', or ':', or '@}'") @}
    | '@{' annotated_rhs '='? invalid_tstring_conversion_character
    | '@{' annotated_rhs '='? ['!' NAME] !(':' | '@}') @{
        PyErr_Occurred() ? NULL : RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN("t-string: expecting ':' or '@}'") @}
    | '@{' annotated_rhs '='? ['!' NAME] ':' fstring_format_spec* !'@}' @{
        PyErr_Occurred() ? NULL : RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN("t-string: expecting '@}', or format specs") @}
    | '@{' annotated_rhs '='? ['!' NAME] !'@}' @{
        PyErr_Occurred() ? NULL : RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN("t-string: expecting '@}'") @}

invalid_tstring_conversion_character:
    | '!' &(':' | '@}') @{ RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN("t-string: missing conversion character") @}
    | '!' !NAME @{ RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN("t-string: invalid conversion character") @}

invalid_string_tstring_concat:
    | a=(fstring|string)+ b[expr_ty]=tstring @{
        RAISE_SYNTAX_ERROR_KNOWN_RANGE(PyPegen_last_item(a, expr_ty), b, "cannot mix t-string literals with string or bytes literals") @}
    | a=tstring+ b[expr_ty]=(fstring|string) @{
        RAISE_SYNTAX_ERROR_KNOWN_RANGE(PyPegen_last_item(a, expr_ty), b, "cannot mix t-string literals with string or bytes literals") @}

invalid_arithmetic:
    | sum ('+'|'-'|'*'|'/'|'%'|'//'|'@@') a='not' b=inversion @{ RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, "'not' after an operator must be parenthesized") @}
invalid_factor:
    | ('+' | '-' | '~') a='not' b=factor @{ RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, "'not' after an operator must be parenthesized") @}

invalid_type_params:
    | '[' token=']' @{
        RAISE_SYNTAX_ERROR_STARTING_FROM(
            token,
            "Type parameter list cannot be empty")@}
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 파이썬 표준 라이브러리,파이썬 인터프리터 확장 및 내장,파이썬 언어 레퍼런스,Top
@anchor{library/index doc}@anchor{25aa}@anchor{library/index library-index}@anchor{149}@anchor{library/index the-python-standard-library}@anchor{25ab}@anchor{library/index translation-repo}@anchor{25ac}
@chapter 파이썬 표준 라이브러리


@ref{14a,,파이썬 언어 레퍼런스} 는 파이썬 언어의 정확한 문법과 의미를 설명하고 있지만, 이 라이브러리 레퍼런스 설명서는 파이썬과 함께 배포되는 표준 라이브러리를 설명합니다. 또한, 파이썬 배포판에 일반적으로 포함되어있는 선택적 구성 요소 중 일부를 설명합니다.

파이썬의 표준 라이브러리는 매우 광범위하며, 아래 나열된 긴 목차에 표시된 대로 다양한 기능을 제공합니다. 라이브러리에는 일상적인 프로그래밍에서 발생하는 많은 문제에 대한 표준적인 해결책을 제공하는 파이썬으로 작성된 모듈뿐만 아니라, 파일 I/O와 같은 시스템 기능에 액세스하는 (C로 작성된) 내장 모듈들이 포함됩니다 (이 모듈들이 없다면 파이썬 프로그래머가 액세스할 방법은 없습니다). 이 모듈 중 일부는 플랫폼 관련 사항을 플랫폼 중립적인 API들로 추상화시킴으로써, 파이썬 프로그램의 이식성을 권장하고 개선하도록 명시적으로 설계되었습니다.

윈도우 플랫폼용 파이썬 설치 프로그램은 일반적으로 전체 표준 라이브러리를 포함하며 종종 많은 추가 구성 요소도 포함합니다. 유닉스와 같은 운영체제의 경우, 파이썬은 일반적으로 패키지 모음으로 제공되기 때문에, 운영 체제와 함께 제공되는 패키지 도구를 사용하여 선택적 구성 요소의 일부 또는 전부를 구해야 할 수 있습니다.

표준 라이브러리 외에도, 수십만 가지 컴포넌트(개별 프로그램과 모듈부터 패키지 및 전체 응용 프로그램 개발 프레임워크까지)로 구성된 활발한 모음이 있는데, 파이썬 패키지 색인@footnote{https://pypi.org} 에서 얻을 수 있습니다.

@c We don't use :numbered: option for the TOC below as it enforces
@c numbered sections for the entire stdlib docs.  If desired,
@c :numbered: can be enabled on a per-module basis.

@menu
* 소개: 소개<2>. 
* 내장 함수:: 
* 내장 상수:: 
* 내장형:: 
* 내장 예외:: 
* Thread Safety Guarantees:: 
* 텍스트 처리 서비스:: 
* 바이너리 데이터 서비스:: 
* 데이터형:: 
* 숫자와 수학 모듈:: 
* 함수형 프로그래밍 모듈:: 
* 파일과 디렉터리 액세스:: 
* 데이터 지속성:: 
* 데이터 압축 및 보관:: 
* 파일 형식:: 
* 암호화 서비스:: 
* 일반 운영 체제 서비스:: 
* Command-line interface libraries:: 
* 동시 실행:: 
* 네트워킹과 프로세스 간 통신:: 
* 인터넷 데이터 처리:: 
* 구조화된 마크업 처리 도구:: 
* 인터넷 프로토콜과 지원:: 
* 멀티미디어 서비스:: 
* 국제화:: 
* Graphical user interfaces with Tk:: 
* 개발 도구:: 
* 디버깅과 프로파일링:: 
* 소프트웨어 패키징 및 배포:: 
* 파이썬 실행시간 서비스:: 
* 사용자 정의 파이썬 인터프리터:: 
* 모듈 임포트 하기:: 
* 파이썬 언어 서비스:: 
* MS 윈도우 특정 서비스:: 
* Unix-specific services:: 
* Modules command-line interface (CLI): Modules command-line interface CLI. 
* 대체된 모듈:: 
* Removed Modules:: 
* Security Considerations: Security Considerations<2>. 

@end menu

@node 소개<2>,내장 함수,,파이썬 표준 라이브러리
@anchor{library/intro doc}@anchor{25ad}@anchor{library/intro introduction}@anchor{25ae}@anchor{library/intro library-intro}@anchor{25af}
@section 소개


“파이썬 라이브러리”에는 여러 가지 구성 요소가 포함되어 있습니다.

여기에는 일반적으로 숫자 및 리스트와 같이 언어의 “핵심” 부분으로 간주하는 데이터형이 포함됩니다. 이러한 형의 경우, 파이썬 언어 핵심은 리터럴의 형식을 정의하고 그 의미에 몇 가지 제약을 가하지만, 의미를 완전히 정의하지는 않습니다. (반면에, 언어 핵심은 연산자의 철자법과 우선순위와 같은 문법적 속성을 정의합니다.)

라이브러리는 또한 내장 함수와 예외를 포함합니다 — @ref{7f7,,import} 문을 쓰지 않고도 모든 파이썬 코드에서 사용할 수 있는 객체들입니다. 이들 중 일부는 언어 핵심에 의해 정의되지만, 핵심 의미에 필수적인 것은 아니며 여기에서 설명합니다.

그러나 라이브러리 대부분은 모듈 컬렉션으로 구성됩니다. 이 컬렉션을 나누는 데는 여러 가지 방법이 있습니다. 일부 모듈은 C로 작성되고 파이썬 인터프리터에 내장되어 있습니다; 다른 것은 파이썬으로 작성되고 소스 형식으로 임포트 됩니다. 일부 모듈은 스택 추적 인쇄와 같이 파이썬에 매우 특정한 인터페이스를 제공합니다; 일부는 특정 하드웨어에 대한 액세스와 같이 운영 체제에 특정한 인터페이스를 제공합니다; 다른 것은 월드 와이드 웹과 같은 응용 프로그램 영역에 특정한 인터페이스를 제공합니다. 일부 모듈은 파이썬의 모든 버전과 이식에서 사용할 수 있습니다; 다른 것은 하위 시스템이 지원하거나 요구할 때만 사용할 수 있습니다; 그러나 다른 것들은 파이썬이 컴파일되고 설치될 때 특정 설정 옵션이 선택되었을 때만 사용할 수 있습니다.

이 설명서는 “안쪽에서부터 밖으로” 구성되어 있습니다. 먼저 내장 함수, 데이터형 및 예외, 마지막으로 관련 모듈의 장으로 그룹화된 모듈들을 설명합니다.

즉, 처음부터 이 설명서를 읽고, 지루할 때 다음 장으로 건너뛰면, 파이썬 라이브러리가 지원하는 사용 가능한 모듈과 응용 프로그램 영역에 대한 적당한 개요를 얻게 됩니다. 물론 소설처럼 읽을 필요는 없습니다. (설명서 앞에 있는) 목차를 검색하거나, (뒤에 있는) 색인에서 특정 함수, 모듈 또는 용어를 찾을 수도 있습니다. 그리고 마지막으로, 무작위 주제에 대해 배우는 것을 즐긴다면, 임의의 페이지 번호 (모듈 @ref{bd,,random} 참조)를 선택하고 한두 섹션을 읽으면 됩니다. 이 설명서의 섹션을 읽는 순서와 관계없이, @ref{1461,,내장 함수} 장에서 시작하는 것이 도움이 되는데, 설명서의 나머지 부분은 이 내용에 익숙하다고 가정하기 때문입니다.

쇼를 시작합시다!

@menu
* 가용성에 대한 참고 사항:: 

@end menu

@node 가용성에 대한 참고 사항,,,소개<2>
@anchor{library/intro availability}@anchor{213c}@anchor{library/intro notes-on-availability}@anchor{25b0}
@subsection 가용성에 대한 참고 사항



@itemize *

@item 
“가용성: 유닉스” 참고 사항은 이 기능이 유닉스 시스템에서 일반적으로 발견된다는 것을 뜻합니다. 특정 운영 체제에 이 기능이 존재하는지에 관한 어떠한 주장도 하지 않습니다.

@item 
별도로 언급되지 않은 경우, “가용성: 유닉스”를 주장하는 모든 기능은 유닉스 코어를 기반으로 하는 맥 OS, iOS 및 안드로이드에서 지원됩니다.

@item 
If an availability note contains both a minimum Kernel version and a minimum
libc version, then both conditions must hold. For example a feature with note
`Availability: Linux >= 3.17 with glibc >= 2.27' requires both Linux 3.17 or
newer and glibc 2.27 or newer.
@end itemize

@menu
* 웹어셈블리 플랫폼:: 
* 모바일 플랫폼:: 

@end menu

@node 웹어셈블리 플랫폼,모바일 플랫폼,,가용성에 대한 참고 사항
@anchor{library/intro wasm-availability}@anchor{1b68}@anchor{library/intro webassembly-platforms}@anchor{25b1}
@subsubsection 웹어셈블리 플랫폼


The WebAssembly@footnote{https://webassembly.org/} platforms @code{wasm32-emscripten} (Emscripten@footnote{https://emscripten.org/}) and
@code{wasm32-wasi} (WASI@footnote{https://wasi.dev/}) provide a subset of POSIX APIs. WebAssembly runtimes
and browsers are sandboxed and have limited access to the host and external
resources. Any Python standard library module that uses processes, threading,
networking, signals, or other forms of inter-process communication (IPC), is
either not available or may not work as on other Unix-like systems. File I/O,
file system, and Unix permission-related functions are restricted, too.
Emscripten does not permit blocking I/O. Other blocking operations like
@ref{8ab,,sleep()} block the browser event loop.

The properties and behavior of Python on WebAssembly platforms depend on the
Emscripten@footnote{https://emscripten.org/}-SDK or WASI@footnote{https://wasi.dev/}-SDK version, WASM runtimes (browser, NodeJS,
wasmtime@footnote{https://wasmtime.dev/}), and Python build time flags. WebAssembly, Emscripten, and WASI
are evolving standards; some features like networking may be
supported in the future.

For Python in the browser, users should consider Pyodide@footnote{https://pyodide.org/} or PyScript@footnote{https://pyscript.net/}.
PyScript is built on top of Pyodide, which itself is built on top of
CPython and Emscripten. Pyodide provides access to browsers’ JavaScript and
DOM APIs as well as limited networking capabilities with JavaScript’s
@code{XMLHttpRequest} and @code{Fetch} APIs.


@itemize *

@item 
Process-related APIs are not available or always fail with an error. That
includes APIs that spawn new processes (@ref{4b6,,fork()},
@ref{12fe,,execve()}), wait for processes (@ref{f99,,waitpid()}), send signals
(@ref{156c,,kill()}), or otherwise interact with processes. The
@ref{dc,,subprocess} is importable but does not work.

@item 
The @ref{d1,,socket} module is available, but is limited and behaves
differently from other platforms. On Emscripten, sockets are always
non-blocking and require additional JavaScript code and helpers on the
server to proxy TCP through WebSockets; see Emscripten Networking@footnote{https://emscripten.org/docs/porting/networking.html}
for more information. WASI snapshot preview 1 only permits sockets from an
existing file descriptor.

@item 
Some functions are stubs that either don’t do anything and always return
hardcoded values.

@item 
Functions related to file descriptors, file permissions, file ownership, and
links are limited and don’t support some operations. For example, WASI does
not permit symlinks with absolute file names.
@end itemize
@anchor{library/intro mobile-availability}@anchor{2259}
@node 모바일 플랫폼,,웹어셈블리 플랫폼,가용성에 대한 참고 사항
@anchor{library/intro ios-availability}@anchor{25b2}@anchor{library/intro mobile-platforms}@anchor{25b3}
@subsubsection 모바일 플랫폼


Android and iOS are, in most respects, POSIX operating systems. File I/O, socket handling,
and threading all behave as they would on any POSIX operating system. However,
there are several major differences:


@itemize *

@item 
Mobile platforms can only use Python in “embedded” mode. There is no Python
REPL, and no ability to use separate executables such as @code{python} or
@code{pip}. To add Python code to your mobile app, you must use
the @ref{2258,,Python embedding API}. For more details, see
@ref{2256,,Using Python on Android} and @ref{225e,,Using Python on iOS}.

@item 
Subprocesses:


@itemize *

@item 
On Android, creating subprocesses is possible but officially unsupported@footnote{https://issuetracker.google.com/issues/128554619#comment4}.
In particular, Android does not support any part of the System V IPC API,
so @ref{98,,multiprocessing} is not available.

@item 
An iOS app cannot use any form of subprocessing, multiprocessing, or
inter-process communication. If an iOS app attempts to create a subprocess,
the process creating the subprocess will either lock up, or crash. An iOS app
has no visibility of other applications that are running, nor any ability to
communicate with other running applications, outside of the iOS-specific APIs
that exist for this purpose.
@end itemize

@item 
Mobile apps have limited access to modify system resources (such as the system
clock). These resources will often be `readable', but attempts to modify
those resources will usually fail.

@item 
Console input and output:


@itemize *

@item 
On Android, the native @code{stdout} and @code{stderr} are not connected to
anything, so Python installs its own streams which redirect messages to the
system log. These can be seen under the tags @code{python.stdout} and
@code{python.stderr} respectively.

@item 
iOS apps have a limited concept of console output. @code{stdout} and
@code{stderr} `exist', and content written to @code{stdout} and @code{stderr} will be
visible in logs when running in Xcode, but this content `won’t' be recorded
in the system log. If a user who has installed your app provides their app
logs as a diagnostic aid, they will not include any detail written to
@code{stdout} or @code{stderr}.

@item 
Mobile apps have no usable @code{stdin} at all. While apps can display an on-screen
keyboard, this is a software feature, not something that is attached to
@code{stdin}.

As a result, Python modules that involve console manipulation (such as
@ref{2f,,curses} and @ref{bf,,readline}) are not available on mobile platforms.
@end itemize
@end itemize

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c XXX document all delegations to __special__ methods

@node 내장 함수,내장 상수,소개<2>,파이썬 표준 라이브러리
@anchor{library/functions doc}@anchor{25b4}@anchor{library/functions built-in-funcs}@anchor{1461}@anchor{library/functions built-in-functions}@anchor{25b5}@anchor{library/functions translation-repo}@anchor{25b6}
@section 내장 함수


파이썬 인터프리터에는 항상 사용할 수 있는 많은 함수와 형이 내장되어 있습니다. 여기에서 알파벳 순으로 나열합니다.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

내장 함수

@tab

@tab

@tab

@item


@display
`A'@w{ }
@ref{208b,,abs()}@w{ }
@ref{9d5,,aiter()}@w{ }
@ref{1627,,all()}@w{ }
@ref{9d6,,anext()}@w{ }
@ref{1626,,any()}@w{ }
@ref{15eb,,ascii()}@w{ }
@w{ }
`B'@w{ }
@ref{14ad,,bin()}@w{ }
@ref{3c3,,bool()}@w{ }
@ref{271,,breakpoint()}@w{ }
@ref{1e97,,bytearray()}@w{ }
@ref{1e96,,bytes()}@w{ }
@w{ }
`C'@w{ }
@ref{13cb,,callable()}@w{ }
@ref{19ef,,chr()}@w{ }
@ref{48f,,classmethod()}@w{ }
@ref{4b2,,compile()}@w{ }
@ref{197,,complex()}@w{ }
@w{ }
`D'@w{ }
@ref{25b7,,delattr()}@w{ }
@ref{25b8,,dict()}@w{ }
@ref{843,,dir()}@w{ }
@ref{b98,,divmod()}@w{ }
@w{ }
@end display



@tab


@display
`E'@w{ }
@ref{1686,,enumerate()}@w{ }
@ref{4a4,,eval()}@w{ }
@ref{4a3,,exec()}@w{ }
@w{ }
`F'@w{ }
@ref{a64,,filter()}@w{ }
@ref{196,,float()}@w{ }
@ref{199,,format()}@w{ }
@ref{25b9,,frozenset()}@w{ }
@w{ }
`G'@w{ }
@ref{dc9,,getattr()}@w{ }
@ref{1c08,,globals()}@w{ }
@w{ }
`H'@w{ }
@ref{6f8,,hasattr()}@w{ }
@ref{800,,hash()}@w{ }
@ref{ad4,,help()}@w{ }
@ref{14d4,,hex()}@w{ }
@w{ }
`I'@w{ }
@ref{1628,,id()}@w{ }
@ref{14dd,,input()}@w{ }
@ref{19b,,int()}@w{ }
@ref{2ad,,isinstance()}@w{ }
@ref{9c4,,issubclass()}@w{ }
@ref{9d7,,iter()}@w{ }
@end display



@tab


@display
`L'@w{ }
@ref{83f,,len()}@w{ }
@ref{25ba,,list()}@w{ }
@ref{46f,,locals()}@w{ }
@w{ }
`M'@w{ }
@ref{19f,,map()}@w{ }
@ref{110b,,max()}@w{ }
@ref{25bb,,memoryview()}@w{ }
@ref{110a,,min()}@w{ }
@w{ }
`N'@w{ }
@ref{9d8,,next()}@w{ }
@w{ }
`O'@w{ }
@ref{c7d,,object()}@w{ }
@ref{14d3,,oct()}@w{ }
@ref{316,,open()}@w{ }
@ref{2338,,ord()}@w{ }
@w{ }
`P'@w{ }
@ref{1a4,,pow()}@w{ }
@ref{1174,,print()}@w{ }
@ref{4b3,,property()}@w{ }
@w{ }
@w{ }
@w{ }
@w{ }
@end display



@tab


@display
`R'@w{ }
@ref{25bc,,range()}@w{ }
@ref{1c1,,repr()}@w{ }
@ref{a65,,reversed()}@w{ }
@ref{14df,,round()}@w{ }
@w{ }
`S'@w{ }
@ref{25bd,,set()}@w{ }
@ref{25be,,setattr()}@w{ }
@ref{693,,slice()}@w{ }
@ref{dc6,,sorted()}@w{ }
@ref{453,,staticmethod()}@w{ }
@ref{25bf,,str()}@w{ }
@ref{694,,sum()}@w{ }
@ref{1a6,,super()}@w{ }
@w{ }
`T'@w{ }
@ref{25c0,,tuple()}@w{ }
@ref{f43,,type()}@w{ }
@w{ }
`V'@w{ }
@ref{1e1f,,vars()}@w{ }
@w{ }
`Z'@w{ }
@ref{1a0,,zip()}@w{ }
@w{ }
`_'@w{ }
@ref{ad1,,__import__()}@w{ }
@end display



@end multitable


@c using :func:`dict` would create a link to another page, so local targets are
@c used, with replacement texts to make the output in the table consistent

@geindex built-in function; abs()
@anchor{library/functions abs}@anchor{208b}
@deffn {함수} abs (number, /)

Return the absolute value of a number.  The argument may be an
integer, a floating-point number, or an object implementing
@ref{2405,,__abs__()}.
If the argument is a complex number, its magnitude is returned.
@end deffn

@geindex built-in function; aiter()
@anchor{library/functions aiter}@anchor{9d5}
@deffn {함수} aiter (async_iterable, /)

Return an @ref{4c8,,asynchronous iterator} for an @ref{f73,,asynchronous iterable}.
Equivalent to calling @code{x.__aiter__()}.

Note: Unlike @ref{9d7,,iter()}, @code{aiter()} has no 2-argument variant.


Added in version 3.10.

@end deffn

@geindex built-in function; all()
@anchor{library/functions all}@anchor{1627}
@deffn {함수} all (iterable, /)

`iterable' 의 모든 요소가 참이면 (또는 iterable 이 비어있으면) @code{True} 를 돌려줍니다. 다음과 동등합니다:

@example
def all(iterable):
    for element in iterable:
        if not element:
            return False
    return True
@end example
@end deffn

@geindex built-in function; anext()
@anchor{library/functions anext}@anchor{9d6}
@deffn {함수} awaitable anext (async_iterator, /)

@deffnx {함수} awaitable anext (async_iterator, default, /)

When awaited, return the next item from the given @ref{4c8,,asynchronous iterator}, or `default' if given and the iterator is exhausted.

This is the async variant of the @ref{9d8,,next()} builtin, and behaves
similarly.

This calls the @ref{1885,,__anext__()} method of `async_iterator',
returning an @ref{4c9,,awaitable}. Awaiting this returns the next value of the
iterator. If `default' is given, it is returned if the iterator is exhausted,
otherwise @ref{1e0c,,StopAsyncIteration} is raised.


Added in version 3.10.

@end deffn

@geindex built-in function; any()
@anchor{library/functions any}@anchor{1626}
@deffn {함수} any (iterable, /)

`iterable' 의 요소 중 어느 하나라도 참이면 @code{True} 를 돌려줍니다. iterable이 비어 있으면 @code{False} 를 돌려줍니다. 다음과 동등합니다:

@example
def any(iterable):
    for element in iterable:
        if element:
            return True
    return False
@end example
@end deffn

@geindex built-in function; ascii()
@anchor{library/functions ascii}@anchor{15eb}
@deffn {함수} ascii (object, /)

As @ref{1c1,,repr()}, return a string containing a printable representation of an
object, but escape the non-ASCII characters in the string returned by
@code{repr()} using @code{\x}, @code{\u}, or @code{\U} escapes.  This generates a string
similar to that returned by @code{repr()} in Python 2.
@end deffn

@geindex built-in function; bin()
@anchor{library/functions bin}@anchor{14ad}
@deffn {함수} bin (integer, /)

Convert an integer number to a binary string prefixed with “0b”. The result
is a valid Python expression. If `integer' is not a Python @ref{19b,,int} object, it
has to define an @ref{19e,,__index__()} method that returns an integer. Some
examples:

@example
>>> bin(3)
'0b11'
>>> bin(-10)
'-0b1010'
@end example

If the prefix “0b” is desired or not, you can use either of the following ways.

@example
>>> format(14, '#b'), format(14, 'b')
('0b1110', '1110')
>>> f'@{14:#b@}', f'@{14:b@}'
('0b1110', '1110')
@end example

See also @ref{1795,,enum.bin()} to represent negative values as twos-complement.

자세한 내용은 @ref{199,,format()}을 보세요.
@end deffn

@geindex bool (내장 클래스)
@anchor{library/functions bool}@anchor{3c3}
@deffn {클래스} bool (object=False, /)

Return a Boolean value, i.e. one of @code{True} or @code{False}.  The argument
is converted using the standard @ref{185b,,truth testing procedure}.
If the argument is false
or omitted, this returns @code{False}; otherwise, it returns @code{True}.  The
@code{bool} class is a subclass of @ref{19b,,int} (see @ref{1fd8,,숫자 형 — int@comma{} float@comma{} complex}).
It cannot be subclassed further.  Its only instances are @code{False} and
@code{True} (see @ref{25c1,,Boolean Type - bool}).

@geindex Boolean;type


버전 3.7에서 변경: The parameter is now positional-only.

@end deffn

@geindex built-in function; breakpoint()
@anchor{library/functions breakpoint}@anchor{271}
@deffn {함수} breakpoint (*args, **kws)

This function drops you into the debugger at the call site.  Specifically,
it calls @ref{cd0,,sys.breakpointhook()}, passing @code{args} and @code{kws} straight
through.  By default, @code{sys.breakpointhook()} calls
@ref{272,,pdb.set_trace()} expecting no arguments.  In this case, it is
purely a convenience function so you don’t have to explicitly import
@ref{aa,,pdb} or type as much code to enter the debugger.  However,
@code{sys.breakpointhook()} can be set to some other function and
@code{breakpoint()} will automatically call that, allowing you to drop into
the debugger of choice.
If @code{sys.breakpointhook()} is not accessible, this function will
raise @ref{244,,RuntimeError}.

By default, the behavior of @code{breakpoint()} can be changed with
the 
@geindex PYTHONBREAKPOINT
@geindex 환경 변수; PYTHONBREAKPOINT
@ref{cd1,,PYTHONBREAKPOINT} environment variable.
See @ref{cd0,,sys.breakpointhook()} for usage details.

Note that this is not guaranteed if @ref{cd0,,sys.breakpointhook()}
has been replaced.

@code{breakpointhook}을 인자로 @ref{1c6c,,감사 이벤트(auditing event)} @code{builtins.breakpoint}를 발생시킵니다.


Added in version 3.7.

@end deffn

@anchor{library/functions func-bytearray}@anchor{1e97}
@deffn {클래스} bytearray (source=b'@w{'})

@deffnx {클래스} bytearray (source, encoding, errors='strict')

새로운 바이트 배열을 돌려줍니다. @ref{344,,bytearray} 클래스는 0 <= x < 256 범위에 있는 정수의 가변 시퀀스입니다. @ref{192,,bytes} 형이 가진 대부분의 메서드뿐만 아니라 (@ref{25c2,,바이트열 과 바이트 배열 연산} 를 보세요), @ref{25c3,,가변 시퀀스 형} 에 기술된 가변 시퀀스의 일반적인 메서드 대부분을 갖고 있습니다.

선택적 `source' 매개변수는 몇 가지 다른 방법으로 배열을 초기화하는 데 사용할 수 있습니다:


@itemize *

@item 
`문자열' 이면, 반드시 `encoding' 매개변수도 제공해야 합니다 (그리고 선택적으로 `errors' 도); 그러면 @ref{344,,bytearray()} 는 @ref{ad2,,str.encode()} 를 사용하여 문자열을 바이트로 변환합니다.

@item 
`정수' 면, 배열은 그 크기를 갖고, 널 바이트로 초기화됩니다.

@item 
@ref{260,,버퍼 인터페이스}를 제공하는 객체면, 객체의 읽기 전용 버퍼가 바이트 배열을 초기화하는 데 사용됩니다.

@item 
`이터러블' 이면, 범위 @code{0 <= x < 256} 의 정수를 제공하는 이터러블이어야 하고, 그 값들이 배열의 초기 내용물로 사용됩니다.
@end itemize

인자가 없으면 크기 0의 배열이 만들어집니다.

@ref{25c4,,바이너리 시퀀스 형 — bytes@comma{} bytearray@comma{} memoryview}와 @ref{25c5,,바이트 배열 객체} 도 보세요.
@end deffn

@anchor{library/functions func-bytes}@anchor{1e96}
@deffn {클래스} bytes (source=b'@w{'})

@deffnx {클래스} bytes (source, encoding, errors='strict')

Return a new “bytes” object which is an immutable sequence of integers in
the range @code{0 <= x < 256}.  @ref{192,,bytes} is an immutable version of
@ref{344,,bytearray} – it has the same non-mutating methods and the same
indexing and slicing behavior.

따라서 생성자 인자는 @ref{344,,bytearray()} 와 같이 해석됩니다.

바이트열 객체는 리터럴을 사용하여 만들 수도 있습니다 (@ref{229c,,문자열과 바이트열 리터럴} 를 보세요).

@ref{25c4,,바이너리 시퀀스 형 — bytes@comma{} bytearray@comma{} memoryview}, @ref{25c6,,바이트열 객체} 및 @ref{25c2,,바이트열 과 바이트 배열 연산} 도 보세요.
@end deffn

@geindex built-in function; callable()
@anchor{library/functions callable}@anchor{13cb}
@deffn {함수} callable (object, /)

Return @ref{e06,,True} if the `object' argument appears callable,
@ref{d2a,,False} if not.  If this returns @code{True}, it is still possible that a
call fails, but if it is @code{False}, calling `object' will never succeed.
Note that classes are callable (calling a class returns a new instance);
instances are callable if their class has a @ref{779,,__call__()} method.


Added in version 3.2: 이 함수는 파이썬 3.0에서 먼저 제거된 다음 파이썬 3.2에서 다시 도입했습니다.

@end deffn

@geindex built-in function; chr()
@anchor{library/functions chr}@anchor{19ef}
@deffn {함수} chr (codepoint, /)

Return the string representing a character with the specified Unicode code point.
For example, @code{chr(97)} returns the string @code{'a'}, while
@code{chr(8364)} returns the string @code{'€'}. This is the inverse of @ref{2338,,ord()}.

The valid range for the argument is from 0 through 1,114,111 (0x10FFFF in
base 16).  @ref{2ec,,ValueError} will be raised if it is outside that range.
@end deffn

@geindex built-in function; classmethod()
@anchor{library/functions classmethod}@anchor{48f}
@deffn {함수} @@classmethod

메서드를 클래스 메서드로 변환합니다.

A class method receives the class as an implicit first argument, just like an
instance method receives the instance. To declare a class method, use this
idiom:

@example
class C:
    @@classmethod
    def f(cls, arg1, arg2): ...
@end example

@code{@@classmethod} 형식은 함수 @ref{939,,데코레이터} 입니다 – 자세한 내용은 @ref{2016,,함수 정의}를 보세요.

클래스 메서드는 클래스 (@code{C.f()} 처럼) 또는 인스턴스 (@code{C().f()} 처럼) 를 통해 호출할 수 있습니다. 인스턴스는 클래스만 참조하고 무시됩니다. 파생 클래스에 대해 클래스 메서드가 호출되면, 파생 클래스 객체가 묵시적인 첫 번째 인자로 전달됩니다.

클래스 메서드는 C++ 또는 자바의 정적 메서드와 다릅니다. 그것들을 원하면, 이 섹션의 @ref{453,,staticmethod()}를 보세요. 클래스 메서드에 대한 더 자세한 정보는, @ref{232c,,표준형 계층}을 참고하세요.


버전 3.9에서 변경: 클래스 메서드는 이제 @ref{4b3,,property()}와 같은 다른 @ref{1884,,디스크립터}를 래핑 할 수 있습니다.



버전 3.10에서 변경: Class methods now inherit the method attributes
(@ref{2347,,__module__}, @ref{14d9,,__name__},
@ref{2346,,__qualname__}, @ref{13de,,__doc__} and
@ref{13dd,,__annotations__}) and have a new @code{__wrapped__}
attribute.



Deprecated since version 3.11, removed in version 3.13: Class methods can no longer wrap other @ref{1884,,descriptors} such as
@ref{4b3,,property()}.

@end deffn

@geindex built-in function; compile()
@anchor{library/functions compile}@anchor{4b2}
@deffn {함수} compile (source, filename, mode, flags=0, dont_inherit=False, optimize=-1)

`source' 를 코드 또는 AST 객체로 컴파일합니다. 코드 객체는 @ref{4a3,,exec()} 또는 @ref{4a4,,eval()} 로 실행할 수 있습니다. `source' 는 일반 문자열, 바이트열 또는 AST 객체 일 수 있습니다. AST 객체로 작업하는 방법에 대한 정보는 @ref{9,,ast} 모듈 문서를 참조하세요.

`filename' 인자는 코드를 읽은 파일을 제공해야 합니다; 파일에서 읽지 않으면 인식 가능한 값을 전달합니다 (@code{'<string>'} 이 일반적으로 사용됩니다).

`mode' 인자는 컴파일해야 하는 코드 종류를 지정합니다; `source' 가 문장의 시퀀스로 구성되어 있다면 @code{exec}, 단일 표현식으로 구성되어 있다면 @code{'eval'}, 단일 대화형 문장으로 구성되면 @code{'single'} 이 될 수 있습니다 (마지막의 경우 @code{None} 이외의 값으로 구해지는 표현식 문은 인쇄됩니다).

선택적 인자 `flags' 와 `dont_inherit' 는 어떤 @ref{25c7,,컴파일러 옵션}이 활성화되어야 하고 어떤 @ref{45d,,퓨처 기능}이 허락되어야 하는지 제어합니다. 둘 다 제공되지 않는 경우 (또는 둘 다 0의 경우), 코드는 @ref{4b2,,compile()} 을 호출하는 코드에 적용되고 있는 것과 같은 플래그로 컴파일됩니다. `flags' 인자가 주어지고, `dont_inherit' 가 없으면 (또는 0) 원래 사용될 것에 더해 `flags' 인자로 지정된 컴파일러 옵션과 퓨처 문이 사용됩니다. `dont_inherit' 가 0이 아닌 정수면 `flags' 인자가 사용됩니다 – 둘러싼 코드의 플래그(퓨처 기능과 컴파일러 옵션)는 무시됩니다.

컴파일러 옵션과 퓨처 문은 여러 개의 옵션을 지정하기 위해 비트 OR 될 수 있는 비트에 의해 지정됩니다. 주어진 퓨처 기능을 지정하는 데 필요한 비트 필드는 @ref{0,,__future__} 모듈의 @ref{25c8,,_Feature} 인스턴스에서 @ref{2393,,compiler_flag} 어트리뷰트로 찾을 수 있습니다. @ref{25c7,,컴파일러 플래그}는 @code{PyCF_} 접두사로 @ref{9,,ast} 모듈에서 찾을 수 있습니다.

인자 `optimize' 는 컴파일러의 최적화 수준을 지정합니다; 기본값 @code{-1} 은 @ref{18c,,-O} 옵션에 의해 주어진 인터프리터의 최적화 수준을 선택합니다. 명시적 수준은 @code{0} (최적화 없음, @code{__debug__} 이 참입니다), @code{1} (assert가 제거됩니다, @code{__debug__} 이 거짓입니다) 또는 @code{2} 다 (독스트링도 제거됩니다).

This function raises @ref{18e,,SyntaxError} or @ref{2ec,,ValueError} if the compiled
source is invalid.

파이썬 코드를 AST 표현으로 파싱하려면, @ref{1c2,,ast.parse()} 를 보세요.

@code{source}와 @code{filename}을 인자로 @ref{1c6c,,감사 이벤트(auditing event)} @code{compile}을 발생시킵니다. 이 이벤트는 묵시적 컴파일로 인해 발생할 수도 있습니다.

@cartouche
@quotation 참고 
@code{'single'} 또는 @code{'eval'} mode로 여러 줄 코드를 가진 문자열을 컴파일할 때, 적어도 하나의 개행 문자로 입력을 끝내야 합니다. 이것은 @ref{1b,,code} 모듈에서 문장이 불완전한지 완전한지를 쉽게 탐지하게 하기 위함입니다.
@end quotation
@end cartouche

@cartouche
@quotation 경고 
파이썬의 AST 컴파일러에서 스택 깊이 제한으로 인해, AST 객체로 컴파일할 때 충분히 크고 복잡한 문자열로 파이썬 인터프리터가 크래시를 일으키도록 만들 수 있습니다.
@end quotation
@end cartouche


버전 3.2에서 변경: Allowed use of Windows and Mac newlines.  Also, input in @code{'exec'} mode
does not have to end in a newline anymore.  Added the `optimize' parameter.



버전 3.5에서 변경: 이전에는, `source' 에서 널 바이트가 발견될 때 @ref{198,,TypeError} 가 발생했습니다.



Added in version 3.8: 이제 @code{ast.PyCF_ALLOW_TOP_LEVEL_AWAIT}를 flags로 전달하여 최상위 수준 @code{await}, @code{async for} 및 @code{async with}를 지원할 수 있습니다.

@end deffn

@geindex complex (내장 클래스)
@anchor{library/functions complex}@anchor{197}
@deffn {클래스} complex (number=0, /)

@deffnx {클래스} complex (string, /)

@deffnx {클래스} complex (real=0, imag=0)

Convert a single string or number to a complex number, or create a
complex number from real and imaginary parts.

Examples:

@example
>>> complex('+1.23')
(1.23+0j)
>>> complex('-4.5j')
-4.5j
>>> complex('-1.23+4.5j')
(-1.23+4.5j)
>>> complex('\t( -1.23+4.5J )\n')
(-1.23+4.5j)
>>> complex('-Infinity+NaNj')
(-inf+nanj)
>>> complex(1.23)
(1.23+0j)
>>> complex(imag=-4.5)
-4.5j
>>> complex(-1.23, 4.5)
(-1.23+4.5j)
@end example

If the argument is a string, it must contain either a real part (in the
same format as for @ref{196,,float()}) or an imaginary part (in the same
format but with a @code{'j'} or @code{'J'} suffix), or both real and imaginary
parts (the sign of the imaginary part is mandatory in this case).
The string can optionally be surrounded by whitespaces and the round
parentheses @code{'('} and @code{')'}, which are ignored.
The string must not contain whitespace between @code{'+'}, @code{'-'}, the
@code{'j'} or @code{'J'} suffix, and the decimal number.
For example, @code{complex('1+2j')} is fine, but @code{complex('1 + 2j')} raises
@ref{2ec,,ValueError}.
More precisely, the input must conform to the @ref{25c9,,complexvalue}
production rule in the following grammar, after parentheses and leading and
trailing whitespace characters are removed:

@example
@anchor{library/functions grammar-token-float-complexvalue}@anchor{25c9}complexvalue: @ref{25ca,,floatvalue} |
              @ref{25ca,,floatvalue} ("j" | "J") |
              @ref{25ca,,floatvalue} @ref{25cb,,sign} @ref{25cc,,absfloatvalue} ("j" | "J")
@end example

If the argument is a number, the constructor serves as a numeric
conversion like @ref{19b,,int} and @ref{196,,float}.
For a general Python object @code{x}, @code{complex(x)} delegates to
@code{x.__complex__()}.
If @ref{7fc,,__complex__()} is not defined then it falls back
to @ref{bc0,,__float__()}.
If @code{__float__()} is not defined then it falls back
to @ref{19e,,__index__()}.

If two arguments are provided or keyword arguments are used, each argument
may be any numeric type (including complex).
If both arguments are real numbers, return a complex number with the real
component `real' and the imaginary component `imag'.
If both arguments are complex numbers, return a complex number with the real
component @code{real.real-imag.imag} and the imaginary component
@code{real.imag+imag.real}.
If one of arguments is a real number, only its real component is used in
the above expressions.

See also @ref{195,,complex.from_number()} which only accepts a single numeric argument.

If all arguments are omitted, returns @code{0j}.

복소수 형은 @ref{1fd8,,숫자 형 — int@comma{} float@comma{} complex} 에서 설명합니다.


버전 3.6에서 변경: 코드 리터럴 처럼 숫자를 밑줄로 그룹화할 수 있습니다.



버전 3.8에서 변경: Falls back to @ref{19e,,__index__()} if @ref{7fc,,__complex__()} and
@ref{bc0,,__float__()} are not defined.



버전 3.14부터 폐지됨: Passing a complex number as the `real' or `imag' argument is now
deprecated; it should only be passed as a single positional argument.

@end deffn

@geindex built-in function; delattr()
@anchor{library/functions delattr}@anchor{25b7}
@deffn {함수} delattr (object, name, /)

This is a relative of @ref{25be,,setattr()}.  The arguments are an object and a
string.  The string must be the name of one of the object’s attributes.  The
function deletes the named attribute, provided the object allows it.  For
example, @code{delattr(x, 'foobar')} is equivalent to @code{del x.foobar}.
`name' need not be a Python identifier (see @code{setattr()}).
@end deffn

@anchor{library/functions func-dict}@anchor{25b8}
@deffn {클래스} dict (**kwargs)

@deffnx {클래스} dict (mapping, /, **kwargs)

@deffnx {클래스} dict (iterable, /, **kwargs)

새 딕셔너리를 만듭니다. @ref{183,,dict} 객체는 딕셔너리 클래스입니다. 이 클래스에 대한 설명서는 @code{dict} 및 @ref{cbc,,매핑 형 — dict} 을 보세요.

다른 컨테이너의 경우 @ref{24d,,list}, @ref{184,,set} 및 @ref{610,,tuple} 클래스와 @ref{1e,,collections} 모듈을 보세요.
@end deffn

@geindex built-in function; dir()
@anchor{library/functions dir}@anchor{843}
@deffn {함수} dir ()

@deffnx {함수} dir (object, /)

인자가 없으면, 현재 지역 스코프에 있는 이름들의 리스트를 돌려줍니다. 인자가 있으면, 해당 객체에 유효한 어트리뷰트들의 리스트를 돌려주려고 시도합니다.

If the object has a method named @ref{176c,,__dir__()},
this method will be called and
must return the list of attributes. This allows objects that implement a custom
@ref{6f9,,__getattr__()} or @ref{dca,,__getattribute__()} function
to customize the way
@ref{843,,dir()} reports their attributes.

If the object does not provide @ref{176c,,__dir__()},
the function tries its best to gather information from the object’s
@ref{77c,,__dict__} attribute, if defined, and
from its type object.  The resulting list is not necessarily complete and may
be inaccurate when the object has a custom @ref{6f9,,__getattr__()}.

기본 @ref{843,,dir()} 메커니즘은 다른 형의 객체에 대해서 다르게 동작하는데, 완전한 정보보다는 가장 적절한 정보를 만들려고 시도하기 때문입니다:


@itemize *

@item 
객체가 모듈 객체면, 리스트에는 모듈 어트리뷰트의 이름이 포함됩니다.

@item 
객체가 형 또는 클래스 객체면, 리스트에는 그것의 어트리뷰트 이름과 베이스의 어트리뷰트 이름들이 재귀적으로 포함됩니다.

@item 
그 밖의 경우, 리스트에는 객체의 어트리뷰트 이름, 해당 클래스의 어트리뷰트 이름 및 해당 클래스의 베이스 클래스들의 어트리뷰트 이름을 재귀적으로 포함합니다.
@end itemize

결과 리스트는 알파벳 순으로 정렬됩니다. 예를 들어:

@example
>>> import struct
>>> dir()   # show the names in the module namespace
['__builtins__', '__name__', 'struct']
>>> dir(struct)   # show the names in the struct module
['Struct', '__all__', '__builtins__', '__cached__', '__doc__', '__file__',
 '__initializing__', '__loader__', '__name__', '__package__',
 '_clearcache', 'calcsize', 'error', 'pack', 'pack_into',
 'unpack', 'unpack_from']
>>> class Shape:
...     def __dir__(self):
...         return ['area', 'perimeter', 'location']
...
>>> s = Shape()
>>> dir(s)
['area', 'location', 'perimeter']
@end example

@cartouche
@quotation 참고 
@ref{843,,dir()} 은 주로 대화형 프롬프트에서의 사용 편의를 위해 제공되기 때문에, 엄격하거나 일관되게 정의된 이름 집합을 제공하기보다 흥미로운 이름 집합을 제공하려고 시도하며, 상세한 동작은 배포마다 변경될 수 있습니다. 예를 들어, 인자가 클래스면 메타 클래스 어트리뷰트는 결과 리스트에 없습니다.
@end quotation
@end cartouche
@end deffn

@geindex built-in function; divmod()
@anchor{library/functions divmod}@anchor{b98}
@deffn {함수} divmod (a, b, /)

Take two (non-complex) numbers as arguments and return a pair of numbers
consisting of their quotient and remainder when using integer division.  With
mixed operand types, the rules for binary arithmetic operators apply.  For
integers, the result is the same as @code{(a // b, a % b)}. For floating-point
numbers the result is @code{(q, a % b)}, where `q' is usually @code{math.floor(a /
b)} but may be 1 less than that.  In any case @code{q * b + a % b} is very
close to `a', if @code{a % b} is non-zero it has the same sign as `b', and @code{0
<= abs(a % b) < abs(b)}.
@end deffn

@geindex built-in function; enumerate()
@anchor{library/functions enumerate}@anchor{1686}
@deffn {함수} enumerate (iterable, start=0)

열거 객체를 돌려줍니다. `iterable' 은 시퀀스, @ref{4ca,,이터레이터} 또는 이터레이션을 지원하는 다른 객체여야 합니다. @ref{1686,,enumerate()} 에 의해 반환된 이터레이터의 @ref{14d2,,__next__()} 메서드는 카운트 (기본값 0을 갖는 `start' 부터)와 `iterable' 을 이터레이션 해서 얻어지는 값을 포함하는 튜플을 돌려줍니다.

@example
>>> seasons = ['Spring', 'Summer', 'Fall', 'Winter']
>>> list(enumerate(seasons))
[(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]
>>> list(enumerate(seasons, start=1))
[(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')]
@end example

다음과 동등합니다:

@example
def enumerate(iterable, start=0):
    n = start
    for elem in iterable:
        yield n, elem
        n += 1
@end example
@end deffn

@geindex built-in function; eval()
@anchor{library/functions func-eval}@anchor{25cd}@anchor{library/functions eval}@anchor{4a4}
@deffn {함수} eval (source, /, globals=None, locals=None)

@*매개변수: 

@itemize *

@item 
@code{source} (@ref{169,,str} | @ref{4e6,,code object}) – A Python expression.

@item 
@code{globals} (@ref{183,,dict} | @code{None}) – The global namespace (default: @code{None}).

@item 
@code{locals} (@ref{13c0,,mapping} | @code{None}) – The local namespace (default: @code{None}).
@end itemize


@*반환: 
The result of the evaluated expression.


@*Raises: 
Syntax errors are reported as exceptions.


@cartouche
@quotation 경고 
This function executes arbitrary code. Calling it with
untrusted user-supplied input will lead to security vulnerabilities.
@end quotation
@end cartouche

The `source' argument is parsed and evaluated as a Python expression
(technically speaking, a condition list) using the `globals' and `locals'
mappings as global and local namespace.  If the `globals' dictionary is
present and does not contain a value for the key @code{__builtins__}, a
reference to the dictionary of the built-in module @ref{13,,builtins} is
inserted under that key before `source' is parsed.
Overriding @code{__builtins__} can be used to restrict or change the available
names, but this is `not' a security mechanism: the executed code can
still access all builtins.
If the `locals' mapping is omitted it defaults to the
`globals' dictionary.  If both mappings are omitted, the source is
executed with the `globals' and `locals' in the environment where
@code{eval()} is called.  Note, `eval()' will only have access to the
@ref{238d,,nested scopes} (non-locals) in the enclosing
environment if they are already referenced in the scope that is calling
@code{eval()} (e.g. via a @ref{14ac,,nonlocal} statement).

Example:

@example
>>> x = 1
>>> eval('x+1')
2
@end example

This function can also be used to execute arbitrary code objects (such as
those created by @ref{4b2,,compile()}).  In this case, pass a code object instead
of a string.  If the code object has been compiled with @code{'exec'} as the
`mode' argument, @code{eval()}'s return value will be @code{None}.

Hints: dynamic execution of statements is supported by the @ref{4a3,,exec()}
function.  The @ref{1c08,,globals()} and @ref{46f,,locals()} functions
return the current global and local dictionary, respectively, which may be
useful to pass around for use by @code{eval()} or @code{exec()}.

If the given source is a string, then leading and trailing spaces and tabs
are stripped.

리터럴 만 포함 된 표현식의 값을 안전하게 구할 수 있는 함수 @ref{e11,,ast.literal_eval()} 를 보세요.

코드 객체를 인자로 @ref{1c6c,,감사 이벤트(auditing event)} @code{exec}를 발생시킵니다. 코드 컴파일 이벤트도 발생할 수 있습니다.


버전 3.13에서 변경: The `globals' and `locals' arguments can now be passed as keywords.



버전 3.13에서 변경: The semantics of the default `locals' namespace have been adjusted as
described for the @ref{46f,,locals()} builtin.

@end deffn

@geindex built-in function;exec

@geindex built-in function; exec()
@anchor{library/functions exec}@anchor{4a3}
@deffn {함수} exec (source, /, globals=None, locals=None, *, closure=None)

@cartouche
@quotation 경고 
This function executes arbitrary code. Calling it with
untrusted user-supplied input will lead to security vulnerabilities.
@end quotation
@end cartouche

This function supports dynamic execution of Python code. `source' must be
either a string or a code object.  If it is a string, the string is parsed as
a suite of Python statements which is then executed (unless a syntax error
occurs). @footnote{
파서는 유닉스 스타일의 줄 종료 규칙만 받아들이는 것에 주의하세요. 파일에서 코드를 읽는 경우, 줄 넘김 변환 모드를 사용해서 윈도우나 맥 스타일 줄 넘김을 변환해야 합니다.
} If it is a code object, it is simply executed.  In all cases,
the code that’s executed is expected to be valid as file input (see the
section @ref{259e,,파일 입력} in the Reference Manual). Be aware that the
@ref{14ac,,nonlocal}, @ref{bc1,,yield},  and @ref{1af,,return}
statements may not be used outside of
function definitions even within the context of code passed to the
@code{exec()} function. The return value is @code{None}.

In all cases, if the optional parts are omitted, the code is executed in the
current scope.  If only `globals' is provided, it must be a dictionary
(and not a subclass of dictionary), which
will be used for both the global and the local variables.  If `globals' and
`locals' are given, they are used for the global and local variables,
respectively.  If provided, `locals' can be any mapping object.  Remember
that at the module level, globals and locals are the same dictionary.

@cartouche
@quotation 참고 
When @code{exec} gets two separate objects as `globals' and `locals', the
code will be executed as if it were embedded in a class definition. This
means functions and classes defined in the executed code will not be able
to access variables assigned at the top level (as the “top level”
variables are treated as class variables in a class definition).
@end quotation
@end cartouche

If the `globals' dictionary does not contain a value for the key
@code{__builtins__}, a reference to the dictionary of the built-in module
@ref{13,,builtins} is inserted under that key.
Overriding @code{__builtins__} can be used to restrict or change the available
names, but this is `not' a security mechanism: the executed code can
still access all builtins.

The `closure' argument specifies a closure–a tuple of cellvars.
It’s only valid when the `object' is a code object containing
@ref{1895,,free (closure) variables}.
The length of the tuple must exactly match the length of the code object’s
@ref{2344,,co_freevars} attribute.

코드 객체를 인자로 @ref{1c6c,,감사 이벤트(auditing event)} @code{exec}를 발생시킵니다. 코드 컴파일 이벤트도 발생할 수 있습니다.

@cartouche
@quotation 참고 
The built-in functions @ref{1c08,,globals()} and @ref{46f,,locals()} return the current
global and local namespace, respectively, which may be useful to pass around
for use as the second and third argument to @code{exec()}.
@end quotation
@end cartouche

@cartouche
@quotation 참고 
The default `locals' act as described for function @ref{46f,,locals()} below.
Pass an explicit `locals' dictionary if you need to see effects of the
code on `locals' after function @code{exec()} returns.
@end quotation
@end cartouche


버전 3.11에서 변경: Added the `closure' parameter.



버전 3.13에서 변경: The `globals' and `locals' arguments can now be passed as keywords.



버전 3.13에서 변경: The semantics of the default `locals' namespace have been adjusted as
described for the @ref{46f,,locals()} builtin.

@end deffn

@geindex built-in function; filter()
@anchor{library/functions filter}@anchor{a64}
@deffn {함수} filter (function, iterable, /)

Construct an iterator from those elements of `iterable' for which `function'
is true.  `iterable' may be either a sequence, a container which
supports iteration, or an iterator.  If `function' is @code{None}, the identity
function is assumed, that is, all elements of `iterable' that are false are
removed.

@code{filter(function, iterable)} 는 function이 @code{None} 이 아닐 때 제너레이터 표현식 @code{(item for item in iterable if function(item))} 과, @code{None} 일 때 @code{(item for item in iterable if item)} 와 동등함에 유의하세요.

See @ref{25ce,,itertools.filterfalse()} for the complementary function that returns
elements of `iterable' for which `function' is false.
@end deffn

@geindex float (내장 클래스)
@anchor{library/functions float}@anchor{196}
@deffn {클래스} float (number=0.0, /)

@deffnx {클래스} float (string, /)

@geindex NaN
@geindex Infinity

Return a floating-point number constructed from a number or a string.

Examples:

@example
>>> float('+1.23')
1.23
>>> float('   -12345\n')
-12345.0
>>> float('1e-003')
0.001
>>> float('+1E6')
1000000.0
>>> float('-Infinity')
-inf
@end example

If the argument is a string, it should contain a decimal number, optionally
preceded by a sign, and optionally embedded in whitespace.  The optional
sign may be @code{'+'} or @code{'-'}; a @code{'+'} sign has no effect on the value
produced.  The argument may also be a string representing a NaN
(not-a-number), or positive or negative infinity.
More precisely, the input must conform to the @ref{25ca,,floatvalue}
production rule in the following grammar, after leading and trailing
whitespace characters are removed:

@example
@anchor{library/functions grammar-token-float-sign}@anchor{25cb}sign:          "+" | "-"
@anchor{library/functions grammar-token-float-infinity}@anchor{25cf}infinity:      "Infinity" | "inf"
@anchor{library/functions grammar-token-float-nan}@anchor{25d0}nan:           "nan"
@anchor{library/functions grammar-token-float-digit}@anchor{25d1}digit:         <a Unicode decimal digit, i.e. characters in Unicode general category Nd>
@anchor{library/functions grammar-token-float-digitpart}@anchor{25d2}digitpart:     @ref{25d1,,digit} (["_"] @ref{25d1,,digit})*
@anchor{library/functions grammar-token-float-number}@anchor{25d3}number:        [@ref{25d2,,digitpart}] "." @ref{25d2,,digitpart} | @ref{25d2,,digitpart} ["."]
@anchor{library/functions grammar-token-float-exponent}@anchor{25d4}exponent:      ("e" | "E") [@ref{25cb,,sign}] @ref{25d2,,digitpart}
@anchor{library/functions grammar-token-float-floatnumber}@anchor{25d5}floatnumber:   @ref{25d3,,number} [@ref{25d4,,exponent}]
@anchor{library/functions grammar-token-float-absfloatvalue}@anchor{25cc}absfloatvalue: @ref{25d5,,floatnumber} | @ref{25cf,,infinity} | @ref{25d0,,nan}
@anchor{library/functions grammar-token-float-floatvalue}@anchor{25ca}floatvalue:    [@ref{25cb,,sign}] @ref{25cc,,absfloatvalue}
@end example

Case is not significant, so, for example, “inf”, “Inf”, “INFINITY”, and
“iNfINity” are all acceptable spellings for positive infinity.

Otherwise, if the argument is an integer or a floating-point number, a
floating-point number with the same value (within Python’s floating-point
precision) is returned.  If the argument is outside the range of a Python
float, an @ref{a81,,OverflowError} will be raised.

For a general Python object @code{x}, @code{float(x)} delegates to
@code{x.__float__()}.  If @ref{bc0,,__float__()} is not defined then it falls back
to @ref{19e,,__index__()}.

See also @ref{194,,float.from_number()} which only accepts a numeric argument.

인자가 주어지지 않으면, @code{0.0} 을 돌려줍니다.

float 형은 @ref{1fd8,,숫자 형 — int@comma{} float@comma{} complex} 에 설명되어 있습니다.


버전 3.6에서 변경: 코드 리터럴 처럼 숫자를 밑줄로 그룹화할 수 있습니다.



버전 3.7에서 변경: The parameter is now positional-only.



버전 3.8에서 변경: Falls back to @ref{19e,,__index__()} if @ref{bc0,,__float__()} is not defined.

@end deffn

@geindex __format__
@geindex string;format() (built-in function)

@geindex built-in function; format()
@anchor{library/functions format}@anchor{199}
@deffn {함수} format (value, format_spec='@w{'}, /)

Convert a `value' to a “formatted” representation, as controlled by
`format_spec'.  The interpretation of `format_spec' will depend on the type
of the `value' argument; however, there is a standard formatting syntax that
is used by most built-in types: @ref{4f9,,Format specification mini-language}.

기본 `format_spec' 은 빈 문자열이며 일반적으로 @ref{169,,str(value)} 를 호출하는 것과 같은 효과를 줍니다.

A call to @code{format(value, format_spec)} is translated to
@code{type(value).__format__(value, format_spec)} which bypasses the instance
dictionary when searching for the value’s @ref{830,,__format__()} method.
A @ref{198,,TypeError} exception is raised if the method search reaches
@ref{c7d,,object} and the `format_spec' is non-empty, or if either the
`format_spec' or the return value are not strings.


버전 3.4에서 변경: @code{object().__format__(format_spec)} 은 `format_spec' 이 빈 문자열이 아닌 경우 @ref{198,,TypeError} 를 일으킵니다.

@end deffn

@anchor{library/functions func-frozenset}@anchor{25b9}
@deffn {클래스} frozenset (iterable=(), /)

새 @ref{7f1,,frozenset} 객체를 돌려주는데, 선택적으로 `iterable' 에서 가져온 요소를 포함합니다. @code{frozenset} 은 내장 클래스입니다. 이 클래스에 대한 설명서는 @code{frozenset} 과 @ref{202f,,집합 형 — set@comma{} frozenset}을 보세요.

다른 컨테이너의 경우 @ref{184,,set}, @ref{24d,,list}, @ref{610,,tuple} 및 @ref{183,,dict} 클래스와 @ref{1e,,collections} 모듈을 보세요.
@end deffn

@geindex built-in function; getattr()
@anchor{library/functions getattr}@anchor{dc9}
@deffn {함수} getattr (object, name, /)

@deffnx {함수} getattr (object, name, default, /)

Return the value of the named attribute of `object'.  `name' must be a string.
If the string is the name of one of the object’s attributes, the result is the
value of that attribute.  For example, @code{getattr(x, 'foobar')} is equivalent to
@code{x.foobar}.  If the named attribute does not exist, `default' is returned if
provided, otherwise @ref{5ee,,AttributeError} is raised.
`name' need not be a Python identifier (see @ref{25be,,setattr()}).

@cartouche
@quotation 참고 
Since @ref{20a1,,private name mangling} happens at
compilation time, one must manually mangle a private attribute’s
(attributes with two leading underscores) name in order to retrieve it with
@code{getattr()}.
@end quotation
@end cartouche
@end deffn

@geindex built-in function; globals()
@anchor{library/functions globals}@anchor{1c08}
@deffn {함수} globals ()

Return the dictionary implementing the current module namespace. For code within
functions, this is set when the function is defined and remains the same
regardless of where the function is called.
@end deffn

@geindex built-in function; hasattr()
@anchor{library/functions hasattr}@anchor{6f8}
@deffn {함수} hasattr (object, name, /)

인자는 객체와 문자열입니다. 문자열이 객체의 속성 중 하나의 이름이면 결과는 @code{True} 이고, 그렇지 않으면 @code{False} 가 됩니다. (이것은 @code{getattr(object, name)} 을 호출하고 @ref{5ee,,AttributeError} 를 발생시키는지를 보는 식으로 구현됩니다.)
@end deffn

@geindex built-in function; hash()
@anchor{library/functions hash}@anchor{800}
@deffn {함수} hash (object, /)

객체의 해시값을 돌려줍니다 (해시가 있는 경우). 해시값은 정수다. 딕셔너리 조회 중에 딕셔너리 키를 빨리 비교하는 데 사용됩니다. 같다고 비교되는 숫자 값은 같은 해시값을 갖습니다 (1과 1.0의 경우와 같이 형이 다른 경우조차도 그렇습니다).

@cartouche
@quotation 참고 
For objects with custom @ref{cf2,,__hash__()} methods,
note that @code{hash()}
truncates the return value based on the bit width of the host machine.
@end quotation
@end cartouche
@end deffn

@geindex built-in function; help()
@anchor{library/functions help}@anchor{ad4}
@deffn {함수} help ()

@deffnx {함수} help (request)

내장 도움말 시스템을 호출합니다. (이 함수는 대화형 사용을 위한 것입니다.) 인자가 제공되지 않으면, 인터프리터 콘솔에서 대화형 도움말 시스템이 시작됩니다. 인자가 문자열이면 문자열은 모듈, 함수, 클래스, 메서드, 키워드 또는 설명서 주제의 이름으로 조회되고, 도움말 페이지가 콘솔에 인쇄됩니다. 인자가 다른 종류의 객체면, 객체에 대한 도움말 페이지가 만들어집니다.

Note that if a slash(/) appears in the parameter list of a function when
invoking @ref{ad4,,help()}, it means that the parameters prior to the slash are
positional-only. For more info, see
@ref{25d6,,the FAQ entry on positional-only parameters}.

이 함수는 @ref{cc,,site} 모듈에 의해 내장 이름 공간에 추가됩니다.


버전 3.4에서 변경: @ref{ba,,pydoc} 과 @ref{82,,inspect} 의 변경 사항은 콜러블의 시그니처가 이제 더 포괄적이고 일관성이 있음을 의미합니다.

@end deffn

@geindex built-in function; hex()
@anchor{library/functions hex}@anchor{14d4}
@deffn {함수} hex (integer, /)

Convert an integer number to a lowercase hexadecimal string prefixed with
“0x”. If `integer' is not a Python @ref{19b,,int} object, it has to define an
@ref{19e,,__index__()} method that returns an integer. Some examples:

@example
>>> hex(255)
'0xff'
>>> hex(-42)
'-0x2a'
@end example

정수를 대문자 또는 소문자 16진수로, 접두사가 있거나 없는 형태로 변환하려면 다음 방법의 하나를 사용할 수 있습니다:

@example
>>> '%#x' % 255, '%x' % 255, '%X' % 255
('0xff', 'ff', 'FF')
>>> format(255, '#x'), format(255, 'x'), format(255, 'X')
('0xff', 'ff', 'FF')
>>> f'@{255:#x@}', f'@{255:x@}', f'@{255:X@}'
('0xff', 'ff', 'FF')
@end example

자세한 내용은 @ref{199,,format()}을 보세요.

16진수 문자열을 진수 16을 사용해서 정수로 변환하려면 @ref{19b,,int()} 도 보세요.

@cartouche
@quotation 참고 
float에 대한 16진수 문자열 표현을 얻으려면, @ref{2100,,float.hex()} 메서드를 사용하세요.
@end quotation
@end cartouche
@end deffn

@geindex built-in function; id()
@anchor{library/functions id}@anchor{1628}
@deffn {함수} id (object, /)

객체의 “아이덴티티”를 돌려준다. 이것은 객체의 수명 동안 유일하고 바뀌지 않음이 보장되는 정수입니다. 수명이 겹치지 않는 두 개의 객체는 같은 @ref{1628,,id()} 값을 가질 수 있습니다.

`CPython 구현 상세:' This is the address of the object in memory.

@code{id} 인자로 @ref{1c6c,,감사 이벤트(auditing event)} @code{builtins.id}를 발생시킵니다.
@end deffn

@geindex built-in function; input()
@anchor{library/functions input}@anchor{14dd}
@deffn {함수} input ()

@deffnx {함수} input (prompt, /)

`prompt' 인자가 있으면, 끝에 개행 문자를 붙이지 않고 표준 출력에 씁니다. 그런 다음 함수는 입력에서 한 줄을 읽고, 문자열로 변환해서 (줄 끝의 줄 바꿈 문자를 제거한다) 돌려줍니다. EOF를 읽으면 @ref{14de,,EOFError} 를 일으킵니다. 예:

@example
>>> s = input('--> ')
--> Monty Python's Flying Circus
>>> s
"Monty Python's Flying Circus"
@end example

@ref{bf,,readline} 모듈이 로드되었다면, @ref{14dd,,input()} 은 그것을 사용하여 정교한 줄 편집과 히스토리 기능을 제공합니다.

입력을 읽기 전에 @code{prompt} 인자로 @ref{1c6c,,감사 이벤트(auditing event)} @code{builtins.input}을 발생시킵니다.


Raises an @ref{1c6c,,auditing event} @code{builtins.input/result}
with the result after successfully reading input.

@end deffn

@geindex int (내장 클래스)
@anchor{library/functions int}@anchor{19b}
@deffn {클래스} int (number=0, /)

@deffnx {클래스} int (string, /, base=10)

Return an integer object constructed from a number or a string, or return
@code{0} if no arguments are given.

Examples:

@example
>>> int(123.45)
123
>>> int('123')
123
>>> int('   -12_345\n')
-12345
>>> int('FACE', 16)
64206
>>> int('0xface', 0)
64206
>>> int('01110011', base=2)
115
@end example

If the argument defines @ref{19d,,__int__()},
@code{int(x)} returns @code{x.__int__()}.  If the argument defines
@ref{19e,,__index__()}, it returns @code{x.__index__()}.
For floating-point numbers, this truncates towards zero.

If the argument is not a number or if `base' is given, then it must be a string,
@ref{192,,bytes}, or @ref{344,,bytearray} instance representing an integer
in radix `base'.  Optionally, the string can be preceded by @code{+} or @code{-}
(with no space in between), have leading zeros, be surrounded by whitespace,
and have single underscores interspersed between digits.

A base-n integer string contains digits, each representing a value from 0 to
n-1. The values 0–9 can be represented by any Unicode decimal digit. The
values 10–35 can be represented by @code{a} to @code{z} (or @code{A} to @code{Z}). The
default `base' is 10. The allowed bases are 0 and 2–36. Base-2, -8, and -16
strings can be optionally prefixed with @code{0b}/@code{0B}, @code{0o}/@code{0O}, or
@code{0x}/@code{0X}, as with integer literals in code.  For base 0, the string is
interpreted in a similar way to an @ref{2308,,integer literal in code},
in that the actual base is 2, 8, 10, or 16 as determined by the prefix. Base
0 also disallows leading zeros: @code{int('010', 0)} is not legal, while
@code{int('010')} and @code{int('010', 8)} are.

정수 형은 @ref{1fd8,,숫자 형 — int@comma{} float@comma{} complex} 에 설명되어 있습니다.


버전 3.4에서 변경: `base' 가 @ref{19b,,int} 의 인스턴스가 아니고 `base' 객체가 @ref{19e,,base.__index__} 메서드를 가지면, 그 진수로 쓸 정수를 얻기 위해 그 메서드를 호출합니다. 예전 버전에서는 @code{base.__index__} 대신에 @ref{19d,,base.__int__} 가 사용되었습니다.



버전 3.6에서 변경: 코드 리터럴 처럼 숫자를 밑줄로 그룹화할 수 있습니다.



버전 3.7에서 변경: The first parameter is now positional-only.



버전 3.8에서 변경: Falls back to @ref{19e,,__index__()} if @ref{19d,,__int__()} is not defined.



버전 3.11에서 변경: @code{int} string inputs and string representations can be limited to
help avoid denial of service attacks. A @ref{2ec,,ValueError} is raised when
the limit is exceeded while converting a string to an @code{int} or
when converting an @code{int} into a string would exceed the limit.
See the @ref{80a,,integer string conversion length limitation} documentation.



버전 3.14에서 변경: @ref{19b,,int()} no longer delegates to the @ref{19c,,__trunc__()} method.

@end deffn

@geindex built-in function; isinstance()
@anchor{library/functions isinstance}@anchor{2ad}
@deffn {함수} isinstance (object, classinfo, /)

Return @code{True} if the `object' argument is an instance of the `classinfo'
argument, or of a (direct, indirect, or @ref{13bb,,virtual}) subclass thereof.  If `object' is not
an object of the given type, the function always returns @code{False}.
If `classinfo' is a tuple of type objects (or recursively, other such
tuples) or a @ref{9c5,,Union Type} of multiple types, return @code{True} if
`object' is an instance of any of the types.
If `classinfo' is not a type or tuple of types and such tuples,
a @ref{198,,TypeError} exception is raised. @code{TypeError} may not be
raised for an invalid type if an earlier check succeeds.


버전 3.10에서 변경: `classinfo' can be a @ref{9c5,,Union Type}.

@end deffn

@geindex built-in function; issubclass()
@anchor{library/functions issubclass}@anchor{9c4}
@deffn {함수} issubclass (class, classinfo, /)

Return @code{True} if `class' is a subclass (direct, indirect, or @ref{13bb,,virtual}) of `classinfo'.  A
class is considered a subclass of itself. `classinfo' may be a tuple of class
objects (or recursively, other such tuples)
or a @ref{9c5,,Union Type}, in which case return @code{True} if `class' is a
subclass of any entry in `classinfo'.  In any other case, a @ref{198,,TypeError}
exception is raised.


버전 3.10에서 변경: `classinfo' can be a @ref{9c5,,Union Type}.

@end deffn

@geindex built-in function; iter()
@anchor{library/functions iter}@anchor{9d7}
@deffn {함수} iter (iterable, /)

@deffnx {함수} iter (callable, sentinel, /)

Return an @ref{4ca,,iterator} object.  The first argument is interpreted very
differently depending on the presence of the second argument. Without a
second argument, the single argument must be a collection object which supports the
@ref{142c,,iterable} protocol (the @ref{e68,,__iter__()} method),
or it must support
the sequence protocol (the @ref{588,,__getitem__()} method with integer arguments
starting at @code{0}).  If it does not support either of those protocols,
@ref{198,,TypeError} is raised. If the second argument, `sentinel', is given,
then the first argument must be a callable object.  The iterator created in this case
will call `callable' with no arguments for each call to its
@ref{14d2,,__next__()} method; if the value returned is equal to
`sentinel', @ref{df4,,StopIteration} will be raised, otherwise the value will
be returned.

@ref{25d7,,이터레이터 형} 도 보세요.

두 번째 형태의 @ref{9d7,,iter()} 의 한가지 유용한 응용은 블록 리더를 만드는 것입니다. 예를 들어, 바이너리 데이터베이스 파일에서 파일의 끝까지 고정 폭 블록 읽기입니다:

@example
from functools import partial
with open('mydata.db', 'rb') as f:
    for block in iter(partial(f.read, 64), b'@w{'}):
        process_block(block)
@end example
@end deffn

@geindex built-in function; len()
@anchor{library/functions len}@anchor{83f}
@deffn {함수} len (object, /)

객체의 길이 (항목 수)를 돌려줍니다. 인자는 시퀀스 (문자열, 바이트열, 튜플, 리스트 또는 range 같은) 또는 컬렉션 (딕셔너리, 집합 또는 불변 집합 같은) 일 수 있습니다.

@code{len}은 @ref{b3d,,range(2 ** 100)}와 같이 @ref{13ca,,sys.maxsize}보다 긴 길이에서 @ref{a81,,OverflowError}를 발생시킵니다.
@end deffn

@anchor{library/functions func-list}@anchor{25ba}
@deffn {클래스} list (iterable=(), /)

함수이기보다, @ref{2020,,리스트} 와 @ref{202c,,시퀀스 형 — list@comma{} tuple@comma{} range} 에 문서화 된 것처럼, @ref{24d,,list} 는 실제로는 가변 시퀀스 형입니다.
@end deffn

@geindex built-in function; locals()
@anchor{library/functions locals}@anchor{46f}
@deffn {함수} locals ()

Return a mapping object representing the current local symbol table, with
variable names as the keys, and their currently bound references as the
values.

At module scope, as well as when using @ref{4a3,,exec()} or @ref{4a4,,eval()} with
a single namespace, this function returns the same namespace as
@ref{1c08,,globals()}.

At class scope, it returns the namespace that will be passed to the
metaclass constructor.

When using @code{exec()} or @code{eval()} with separate local and global
arguments, it returns the local namespace passed in to the function call.

In all of the above cases, each call to @code{locals()} in a given frame of
execution will return the `same' mapping object. Changes made through
the mapping object returned from @code{locals()} will be visible as assigned,
reassigned, or deleted local variables, and assigning, reassigning, or
deleting local variables will immediately affect the contents of the
returned mapping object.

In an @ref{4a2,,optimized scope} (including functions, generators, and
coroutines), each call to @code{locals()} instead returns a fresh dictionary
containing the current bindings of the function’s local variables and any
nonlocal cell references. In this case, name binding changes made via the
returned dict are `not' written back to the corresponding local variables
or nonlocal cell references, and assigning, reassigning, or deleting local
variables and nonlocal cell references does `not' affect the contents
of previously returned dictionaries.

Calling @code{locals()} as part of a comprehension in a function, generator, or
coroutine is equivalent to calling it in the containing scope, except that
the comprehension’s initialised iteration variables will be included. In
other scopes, it behaves as if the comprehension were running as a nested
function.

Calling @code{locals()} as part of a generator expression is equivalent to
calling it in a nested generator function.


버전 3.12에서 변경: The behaviour of @code{locals()} in a comprehension has been updated as
described in 
@geindex Python 향상 제안; PEP 709
PEP 709@footnote{https://peps.python.org/pep-0709/}.



버전 3.13에서 변경: As part of 
@geindex Python 향상 제안; PEP 667
PEP 667@footnote{https://peps.python.org/pep-0667/}, the semantics of mutating the mapping objects
returned from this function are now defined. The behavior in
@ref{4a2,,optimized scopes} is now as described above.
Aside from being defined, the behaviour in other scopes remains
unchanged from previous versions.

@end deffn

@geindex built-in function; map()
@anchor{library/functions map}@anchor{19f}
@deffn {함수} map (function, iterable, /, *iterables, strict=False)

Return an iterator that applies `function' to every item of `iterable',
yielding the results.  If additional `iterables' arguments are passed,
`function' must take that many arguments and is applied to the items from all
iterables in parallel.  With multiple iterables, the iterator stops when the
shortest iterable is exhausted.  If `strict' is @code{True} and one of the
iterables is exhausted before the others, a @ref{2ec,,ValueError} is raised. For
cases where the function inputs are already arranged into argument tuples,
see @ref{12e9,,itertools.starmap()}.


버전 3.14에서 변경: Added the `strict' parameter.

@end deffn

@geindex built-in function; max()
@anchor{library/functions max}@anchor{110b}
@deffn {함수} max (iterable, /, *, key=None)

@deffnx {함수} max (iterable, /, *, default, key=None)

@deffnx {함수} max (arg1, arg2, /, *args, key=None)

iterable 에서 가장 큰 항목이나 두 개 이상의 인자 중 가장 큰 것을 돌려줍니다.

하나의 위치 인자가 제공되면, 그것은 @ref{142c,,이터러블} 이어야 합니다. iterable에서 가장 큰 항목을 돌려줍니다. 두 개 이상의 위치 인자가 제공되면, 위치 인자 중 가장 큰 것을 돌려줍니다.

선택적 키워드-전용 인자가 두 개 있습니다. `key' 인자는 @ref{dc7,,list.sort()} 에 사용되는 것처럼 단일 인자 순서 함수를 지정합니다. `default' 인자는 제공된 iterable이 비어있는 경우 돌려줄 객체를 지정합니다. iterable이 비어 있고 `default' 가 제공되지 않으면 @ref{2ec,,ValueError} 가 발생합니다.

여러 항목이 최댓값이면, 함수는 처음 만난 항목을 돌려줍니다. 이것은 @code{sorted(iterable, key=keyfunc, reverse=True)[0]} 와 @code{heapq.nlargest(1, iterable, key=keyfunc)} 같은 다른 정렬 안정성 보존 도구와 일관성을 유지합니다.


버전 3.4에서 변경: Added the `default' keyword-only parameter.



버전 3.8에서 변경: `key'는 @code{None} 일 수 있습니다.

@end deffn

@anchor{library/functions func-memoryview}@anchor{25bb}
@deffn {클래스} memoryview (object)

지정된 인자로부터 만들어진 “메모리 뷰” 객체를 돌려줍니다. 자세한 정보는 @ref{25d8,,메모리 뷰} 를 보세요.
@end deffn

@geindex built-in function; min()
@anchor{library/functions min}@anchor{110a}
@deffn {함수} min (iterable, /, *, key=None)

@deffnx {함수} min (iterable, /, *, default, key=None)

@deffnx {함수} min (arg1, arg2, /, *args, key=None)

iterable 에서 가장 작은 항목이나 두 개 이상의 인자 중 가장 작은 것을 돌려줍니다.

하나의 위치 인자가 제공되면, 그것은 @ref{142c,,이터러블} 이어야 합니다. iterable에서 가장 작은 항목을 돌려줍니다. 두 개 이상의 위치 인자가 제공되면, 위치 인자 중 가장 작은 것을 돌려줍니다.

선택적 키워드-전용 인자가 두 개 있습니다. `key' 인자는 @ref{dc7,,list.sort()} 에 사용되는 것처럼 단일 인자 순서 함수를 지정합니다. `default' 인자는 제공된 iterable이 비어있는 경우 돌려줄 객체를 지정합니다. iterable이 비어 있고 `default' 가 제공되지 않으면 @ref{2ec,,ValueError} 가 발생합니다.

여러 항목이 최솟값이면, 함수는 처음 만난 항목을 돌려줍니다. 이것은 @code{sorted(iterable, key=keyfunc)[0]} 와 @code{heapq.nsmallest(1, iterable, key=keyfunc)} 같은 다른 정렬 안정성 보존 도구와 일관성을 유지합니다.


버전 3.4에서 변경: Added the `default' keyword-only parameter.



버전 3.8에서 변경: `key'는 @code{None} 일 수 있습니다.

@end deffn

@geindex built-in function; next()
@anchor{library/functions next}@anchor{9d8}
@deffn {함수} next (iterator, /)

@deffnx {함수} next (iterator, default, /)

Retrieve the next item from the @ref{4ca,,iterator} by calling its
@ref{14d2,,__next__()} method.  If `default' is given, it is returned
if the iterator is exhausted, otherwise @ref{df4,,StopIteration} is raised.
@end deffn

@geindex object (내장 클래스)
@anchor{library/functions object}@anchor{c7d}
@deffn {클래스} object

This is the ultimate base class of all other classes. It has methods
that are common to all instances of Python classes. When the constructor
is called, it returns a new featureless object. The constructor does not
accept any arguments.

@cartouche
@quotation 참고 
@code{object} instances do `not' have @ref{77c,,__dict__}
attributes, so you can’t assign arbitrary attributes to an instance of
@code{object}.
@end quotation
@end cartouche
@end deffn

@geindex built-in function; oct()
@anchor{library/functions oct}@anchor{14d3}
@deffn {함수} oct (integer, /)

Convert an integer number to an octal string prefixed with “0o”.  The result
is a valid Python expression. If `integer' is not a Python @ref{19b,,int} object, it
has to define an @ref{19e,,__index__()} method that returns an integer. For
example:

@example
>>> oct(8)
'0o10'
>>> oct(-56)
'-0o70'
@end example

If you want to convert an integer number to an octal string either with the prefix
“0o” or not, you can use either of the following ways.

@example
>>> '%#o' % 10, '%o' % 10
('0o12', '12')
>>> format(10, '#o'), format(10, 'o')
('0o12', '12')
>>> f'@{10:#o@}', f'@{10:o@}'
('0o12', '12')
@end example

자세한 내용은 @ref{199,,format()}을 보세요.
@end deffn

@geindex file object;open() built-in function

@geindex built-in function; open()
@anchor{library/functions open}@anchor{316}
@deffn {함수} open (file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

`file' 을 열고 해당 @ref{13c8,,파일 객체} 를 돌려줍니다. 파일을 열 수 없으면, @ref{2c0,,OSError} 가 발생합니다. 이 함수를 사용하는 방법에 대한 더 많은 예제는 @ref{2064,,파일을 읽고 쓰기}를 참조하십시오.

`file' is a @ref{5a0,,path-like object} giving the pathname (absolute or
relative to the current working directory) of the file to be opened or an
integer file descriptor of the file to be wrapped.  (If a file descriptor is
given, it is closed when the returned I/O object is closed unless `closefd'
is set to @code{False}.)

`mode' is an optional string that specifies the mode in which the file is
opened.  It defaults to @code{'r'} which means open for reading in text mode.
Other common values are @code{'w'} for writing (truncating the file if it
already exists), @code{'x'} for exclusive creation, and @code{'a'} for appending
(which on `some' Unix systems, means that `all' writes append to the end of
the file regardless of the current seek position).  In text mode, if
`encoding' is not specified the encoding used is platform-dependent:
@ref{329,,locale.getencoding()} is called to get the current locale encoding.
(For reading and writing raw bytes use binary mode and leave
`encoding' unspecified.)  The available modes are:

@geindex file;modes
@anchor{library/functions filemodes}@anchor{25d9}

@multitable {xxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

문자

@tab

의미

@item

@code{'r'}

@tab

읽기용으로 엽니다 (기본값)

@item

@code{'w'}

@tab

쓰기용으로 엽니다, 파일을 먼저 자릅니다.

@item

@code{'x'}

@tab

독점적인 파일 만들기용으로 엽니다, 이미 존재하는 경우에는 실패합니다.

@item

@code{'a'}

@tab

open for writing, appending to the end of file if it exists

@item

@code{'b'}

@tab

바이너리 모드

@item

@code{'t'}

@tab

텍스트 모드 (기본값)

@item

@code{'+'}

@tab

갱신(읽기 및 쓰기)용으로 엽니다

@end multitable


The default mode is @code{'r'} (open for reading text, a synonym of @code{'rt'}).
Modes @code{'w+'} and @code{'w+b'} open and truncate the file.  Modes @code{'r+'}
and @code{'r+b'} open the file with no truncation.

@ref{25da,,개요} 에서 언급했듯이, 파이썬은 바이너리와 텍스트 I/O를 구별합니다. 바이너리 모드 (`mode' 인자에 @code{'b'} 를 포함합니다)로 열린 파일은 내용을 디코딩 없이 @ref{192,,bytes} 객체로 돌려줍니다. 텍스트 모드 (기본값, 또는 `mode' 인자에 @code{'t'} 가 포함될 때)에서는, 파일의 내용이 @ref{169,,str}로 반환되는데, 바이트열이 플랫폼 의존적인 인코딩이나 주어진 `encoding' 을 사용해서 먼저 디코드 됩니다.

@cartouche
@quotation 참고 
파이썬은 하위 운영 체제의 텍스트 파일 개념에 의존하지 않습니다. 모든 처리는 파이썬 자체에 의해 수행되므로 플랫폼에 독립적입니다.
@end quotation
@end cartouche

`buffering' is an optional integer used to set the buffering policy.  Pass 0
to switch buffering off (only allowed in binary mode), 1 to select line
buffering (only usable when writing in text mode), and an integer > 1 to indicate the size
in bytes of a fixed-size chunk buffer. Note that specifying a buffer size this
way applies for binary buffered I/O, but @code{TextIOWrapper} (i.e., files opened
with @code{mode='r+'}) would have another buffering. To disable buffering in
@code{TextIOWrapper}, consider using the @code{write_through} flag for
@ref{d3f,,io.TextIOWrapper.reconfigure()}. When no `buffering' argument is
given, the default buffering policy works as follows:


@itemize *

@item 
Binary files are buffered in fixed-size chunks; the size of the buffer
is @code{max(min(blocksize, 8 MiB), DEFAULT_BUFFER_SIZE)}
when the device block size is available.
On most systems, the buffer will typically be 128 kilobytes long.

@item 
“대화형” 텍스트 파일 (@ref{2067,,isatty()} 가 @code{True} 를 돌려주는 파일)은 줄 버퍼링을 사용합니다. 다른 텍스트 파일은 바이너리 파일에 대해 위에서 설명한 정책을 사용합니다.
@end itemize

`encoding' is the name of the encoding used to decode or encode the file.
This should only be used in text mode.  The default encoding is platform
dependent (whatever @ref{329,,locale.getencoding()} returns), but any
@ref{25db,,text encoding} supported by Python can be used.
See the @ref{1c,,codecs} module for the list of supported encodings.

`errors' 는 인코딩 및 디코딩 에러를 처리하는 방법을 지정하는 선택적 문자열입니다. 바이너리 모드에서는 사용할 수 없습니다. 다양한 표준 에러 처리기가 제공됩니다 (@ref{1b6d,,에러 처리기} 에 나열됩니다). 하지만, @ref{16a0,,codecs.register_error()}로 등록된 에러 처리기 이름 역시 사용할 수 있습니다. 표준 이름은 다음과 같습니다:


@itemize *

@item 
@code{'strict'} 는 인코딩 에러가 있는 경우 @ref{2ec,,ValueError} 예외를 발생시킵니다. 기본값 @code{None} 은 같은 효과를 냅니다.

@item 
@code{'ignore'} 는 에러를 무시합니다. 인코딩 에러를 무시하면 데이터가 손실될 수 있음에 주의하세요.

@item 
@code{'replace'} 는 잘못된 데이터가 있는 자리에 대체 마커(@code{'?'} 와 같은)를 삽입합니다.

@item 
@code{'surrogateescape'} will represent any incorrect bytes as low
surrogate code units ranging from U+DC80 to U+DCFF.
These surrogate code units will then be turned back into
the same bytes when the @code{surrogateescape} error handler is used
when writing data.  This is useful for processing files in an
unknown encoding.

@item 
@code{'xmlcharrefreplace'} is only supported when writing to a file.
Characters not supported by the encoding are replaced with the
appropriate XML character reference @code{&#@var{nnn};}.

@item 
@code{'backslashreplace'} 는 잘못된 데이터를 파이썬의 역 슬래시 이스케이프 시퀀스로 대체합니다.

@item 
@code{'namereplace'} (역시 파일에 쓸 때만 지원됩니다)는 지원되지 않는 문자를 @code{\N@{...@}} 이스케이프 시퀀스로 대체합니다.
@end itemize

@geindex universal newlines;open() built-in function
@anchor{library/functions open-newline-parameter}@anchor{947}
`newline' determines how to parse newline characters from the stream.
It can be @code{None}, @code{'@w{'}}, @code{'\n'}, @code{'\r'}, and
@code{'\r\n'}.  It works as follows:


@itemize *

@item 
스트림에서 입력을 읽을 때, `newline' 이 @code{None} 이면, 유니버설 줄 넘김 모드가 활성화됩니다. 입력에 있는 줄은 @code{'\n'}, @code{'\r'} 또는 @code{'\r\n'} 로 끝날 수 있으며, 호출자에게 돌려주기 전에 모두 @code{'\n'} 로 변환됩니다. 그것이 @code{'@w{'}} 이면, 유니버설 줄 넘김 모드가 활성화되지만, 줄 끝은 변환되지 않은 채로 호출자에게 반환됩니다. 다른 유효한 값이면, 입력 줄은 주어진 문자열로만 끝나며, 줄 끝은 변환되지 않은 채로 호출자에게 돌려줍니다.

@item 
스트림에 출력을 쓸 때, `newline' 이 @code{None} 이면, 모든 @code{'\n'} 문자는 시스템 기본 줄 구분자인 @ref{25dc,,os.linesep} 로 변환됩니다. `newline' 이 @code{'@w{'}} 또는 @code{'\n'} 이면, 변환이 이루어지지 않습니다. `newline' 이 다른 유효한 값이면, 쓰이는 모든 @code{'\n'} 문자는 주어진 문자열로 변환됩니다.
@end itemize

If `closefd' is @code{False} and a file descriptor rather than a filename was
given, the underlying file descriptor will be kept open when the file is
closed.  If a filename is given `closefd' must be @code{True} (the default);
otherwise, an error will be raised.

콜러블을 `opener' 로 전달하여 커스텀 오프너를 사용할 수 있습니다. 파일 객체를 위한 하위 파일 디스크립터는 `opener' 를 (`file', `flags') 로 호출해서 얻습니다. `opener' 는 열린 파일 디스크립터를 반환해야 합니다 (`opener' 에 @ref{f91,,os.open} 을 전달하는 것은 @code{None} 을 전달하는 것과 비슷한 기능을 수행하게 됩니다).

새로 만들어진 파일은 @ref{10fb,,상속 불가능} 합니다.

다음 예는 주어진 디렉터리에 상대적인 파일을 열기 위해 @ref{f91,,os.open()} 함수의 @ref{12ef,,dir_fd} 매개변수를 사용합니다:

@example
>>> import os
>>> dir_fd = os.open('somedir', os.O_RDONLY)
>>> def opener(path, flags):
...     return os.open(path, flags, dir_fd=dir_fd)
...
>>> with open('spamspam.txt', 'w', opener=opener) as f:
...     print('This will be written to somedir/spamspam.txt', file=f)
...
>>> os.close(dir_fd)  # don't leak a file descriptor
@end example

@ref{316,,open()} 함수에 의해 반환된 @ref{13c8,,파일 객체} 의 형은 모드에 의존합니다. @code{open()} 이 텍스트 모드(@code{'w'}, @code{'r'}, @code{'wt'}, @code{'rt'}, 등)로 파일을 여는 데 사용되면, @ref{8a3,,io.TextIOBase} 의 서브 클래스를 돌려줍니다 (구체적으로 @ref{9be,,io.TextIOWrapper}). 버퍼링과 함께 바이너리 모드로 파일을 여는 데 사용되는 경우, 반환되는 클래스는 @ref{8a2,,io.BufferedIOBase} 의 서브 클래스입니다. 정확한 클래스는 다양합니다: 읽기 바이너리 모드에서는, @ref{1413,,io.BufferedReader} 를 돌려줍니다; 쓰기 바이너리와 덧붙이기 바이너리 모드에서는, @ref{15b6,,io.BufferedWriter} 를 돌려주고, 읽기/쓰기 모드에서는, @ref{15b7,,io.BufferedRandom} 을 돌려줍니다. 버퍼링을 끄면, 날 스트림, @ref{12d5,,io.RawIOBase} 의 서브 클래스, @ref{1514,,io.FileIO}, 을 돌려줍니다.

@geindex line-buffered I/O
@geindex unbuffered I/O
@geindex buffer size@comma{} I/O
@geindex I/O control;buffering
@geindex 바이너리 모드
@geindex text mode
@geindex module;sys

See also the file handling modules, such as @ref{5f,,fileinput}, @ref{83,,io}
(where @code{open()} is declared), @ref{a5,,os}, @ref{a6,,os.path}, @ref{e6,,tempfile},
and @ref{ca,,shutil}.

Raises an @ref{1c6c,,auditing event} @code{open} with arguments @code{path}, @code{mode}, @code{flags}.

@code{mode}와 @code{flags} 인자는 원래 호출에서 수정되거나 추론되었을 수 있습니다.


버전 3.3에서 변경: 


@itemize *

@item 
`opener' 매개변수가 추가되었습니다.

@item 
@code{'x'} 모드가 추가되었습니다.

@item 
@ref{1252,,IOError} 를 일으켜왔습니다. 이제는 @ref{2c0,,OSError} 의 별칭입니다.

@item 
독점적 파일 만들기 모드(@code{'x'})로 여는 파일이 이미 존재하면, 이제 @ref{121f,,FileExistsError} 를 일으킵니다.
@end itemize



버전 3.4에서 변경: 


@itemize *

@item 
파일은 이제 상속 불가능합니다.
@end itemize



버전 3.5에서 변경: 


@itemize *

@item 
시스템 호출이 인터럽트 되고 시그널 처리기가 예외를 발생시키지 않으면, 이 함수는 이제 @ref{f87,,InterruptedError} 예외를 일으키는 대신 시스템 호출을 재시도합니다 (이유는 
@geindex Python 향상 제안; PEP 475
PEP 475@footnote{https://peps.python.org/pep-0475/} 를 보세요).

@item 
@code{'namereplace'} 오류 처리기가 추가되었습니다.
@end itemize



버전 3.6에서 변경: 


@itemize *

@item 
@ref{e4a,,os.PathLike} 를 구현하는 객체를 받아들이도록 지원이 추가되었습니다.

@item 
윈도우에서, 콘솔 버퍼를 열면 @ref{1514,,io.FileIO} 가 아닌 @ref{12d5,,io.RawIOBase} 의 서브 클래스가 반환될 수 있습니다.
@end itemize



버전 3.11에서 변경: The @code{'U'} mode has been removed.

@end deffn

@geindex built-in function; ord()
@anchor{library/functions ord}@anchor{2338}
@deffn {함수} ord (character, /)

Return the ordinal value of a character.

If the argument is a one-character string, return the Unicode code point
of that character.  For example,
@code{ord('a')} returns the integer @code{97} and @code{ord('€')} (Euro sign)
returns @code{8364}.  This is the inverse of @ref{19ef,,chr()}.

If the argument is a @ref{192,,bytes} or @ref{344,,bytearray} object of
length 1, return its single byte value.
For example, @code{ord(b'a')} returns the integer @code{97}.
@end deffn

@geindex built-in function; pow()
@anchor{library/functions pow}@anchor{1a4}
@deffn {함수} pow (base, exp, mod=None)

`base' 의 `exp' 거듭제곱을 돌려줍니다; `mod' 가 있는 경우, `base' 의 `exp' 거듭제곱의 모듈로 `mod' 를 돌려줍니다 (@code{pow(base, exp) % mod} 보다 더 빠르게 계산됩니다). 두 개의 인자 형식인 @code{pow(base, exp)} 는 거듭제곱 연산자를 사용하는 것과 동등합니다: @code{base**exp}.

When arguments are builtin numeric types with mixed operand types, the
coercion rules for binary arithmetic operators apply.  For @ref{19b,,int}
operands, the result has the same type as the operands (after coercion)
unless the second argument is negative; in that case, all arguments are
converted to float and a float result is delivered.  For example, @code{pow(10, 2)}
returns @code{100}, but @code{pow(10, -2)} returns @code{0.01}.  For a negative base of
type @code{int} or @ref{196,,float} and a non-integral exponent, a complex
result is delivered.  For example, @code{pow(-9, 0.5)} returns a value close
to @code{3j}. Whereas, for a negative base of type @code{int} or @code{float}
with an integral exponent, a float result is delivered. For example,
@code{pow(-9, 2.0)} returns @code{81.0}.

@ref{19b,,int} 피연산자 `base' 및 `exp'의 경우, `mod'가 있으면, `mod'도 정수 형이어야 하고 `mod'는 0이 아니어야 합니다. `mod'가 있고 `exp'가 음수면, `base'는 `mod'와 서로 소(relatively prime)여야 합니다. 이 경우, @code{pow(inv_base, -exp, mod)}가 반환되며, 여기서 `inv_base'는 `base' 모듈로 `mod'의 역입니다.

다음은 @code{38} 모듈로 @code{97}의 역을 계산하는 예입니다:

@example
>>> pow(38, -1, mod=97)
23
>>> 23 * 38 % 97 == 1
True
@end example


버전 3.8에서 변경: @ref{19b,,int} 피연산자의 경우, @code{pow}의 3 인자 형식은 이제 두 번째 인자가 음수가 되는 것을 허용하여, 모듈러 역수를 계산할 수 있게 합니다.



버전 3.8에서 변경: 키워드 인자를 허용합니다. 이전에는, 위치 인자만 지원되었습니다.

@end deffn

@geindex built-in function; print()
@anchor{library/functions print}@anchor{1174}
@deffn {함수} print (*objects, sep=' ', end='\n', file=None, flush=False)

Print `objects' to the text stream `file', separated by `sep' and followed
by `end'.  `sep', `end', `file', and `flush', if present, must be given as keyword
arguments.

모든 비 키워드 인자는 @ref{169,,str()} 이 하듯이 문자열로 변환된 후 스트림에 쓰이는데, `sep' 로 구분되고 `end' 를 뒤에 붙입니다. `sep' 과 `end' 는 모두 문자열이어야 합니다; @code{None} 일 수도 있는데, 기본값을 사용한다는 뜻입니다. `objects' 가 주어지지 않으면 @ref{1174,,print()} 는 `end' 만 씁니다.

`file' 인자는 @code{write(string)} 메서드를 가진 객체여야 합니다; 존재하지 않거나 @code{None} 이면, @ref{ccc,,sys.stdout} 이 사용됩니다. 인쇄된 인자는 텍스트 문자열로 변환되기 때문에, @ref{1174,,print()} 는 바이너리 모드 파일 객체와 함께 사용할 수 없습니다. 이를 위해서는. 대신 @code{file.write(...)} 를 사용합니다.

Output buffering is usually determined by `file'.
However, if `flush' is true, the stream is forcibly flushed.


버전 3.3에서 변경: `flush' 키워드 인자가 추가되었습니다.

@end deffn

@geindex property (내장 클래스)
@anchor{library/functions property}@anchor{4b3}
@deffn {클래스} property (fget=None, fset=None, fdel=None, doc=None)

프로퍼티 어트리뷰트를 돌려줍니다.

`fget' 은 어트리뷰트 값을 얻는 함수입니다. `fset' 은 어트리뷰트 값을 설정하는 함수입니다. `fdel' 은 어트리뷰트 값을 삭제하는 함수입니다. 그리고 `doc' 은 어트리뷰트의 독스트링을 만듭니다.

전형적인 사용은 관리되는 어트리뷰트 @code{x} 를 정의하는 것입니다:

@example
class C:
    def __init__(self):
        self._x = None

    def getx(self):
        return self._x

    def setx(self, value):
        self._x = value

    def delx(self):
        del self._x

    x = property(getx, setx, delx, "I'm the 'x' property.")
@end example

If `c' is an instance of `C', @code{c.x} will invoke the getter,
@code{c.x = value} will invoke the setter, and @code{del c.x} the deleter.

주어진 경우, `doc' 은 프로퍼티 어트리뷰트의 독스트링이 됩니다. 그렇지 않으면, `fget' 의 독스트링(있는 경우)이 복사됩니다. 이렇게 하면 @ref{4b3,,property()} 를 @ref{939,,데코레이터} 로 사용하여 읽기 전용 프로퍼티를 쉽게 만들 수 있습니다:

@example
class Parrot:
    def __init__(self):
        self._voltage = 100000

    @@property
    def voltage(self):
        """Get the current voltage."""
        return self._voltage
@end example

The @code{@@property} decorator turns the @code{voltage()} method into a “getter”
for a read-only attribute with the same name, and it sets the docstring for
`voltage' to “Get the current voltage.”

@geindex built-in function; property.getter()
@anchor{library/functions property getter}@anchor{19d9}
@deffn {함수} @@getter
@end deffn

@geindex built-in function; property.setter()
@anchor{library/functions property setter}@anchor{19da}
@deffn {함수} @@setter
@end deffn

@geindex built-in function; property.deleter()
@anchor{library/functions property deleter}@anchor{19db}
@deffn {함수} @@deleter

A property object has @code{getter}, @code{setter},
and @code{deleter} methods usable as decorators that create a
copy of the property with the corresponding accessor function set to the
decorated function.  This is best explained with an example:

@example
class C:
    def __init__(self):
        self._x = None

    @@property
    def x(self):
        """I'm the 'x' property."""
        return self._x

    @@x.setter
    def x(self, value):
        self._x = value

    @@x.deleter
    def x(self):
        del self._x
@end example

이 코드는 첫 번째 예제와 정확히 동등합니다. 추가적인 함수들에 원래 프로퍼티(이 경우 @code{x})와 같은 이름을 사용해야 합니다.

반환된 프로퍼티 객체는 생성자 인자에 해당하는 @code{fget}, @code{fset} 및 @code{fdel} 어트리뷰트를 가집니다.
@end deffn


버전 3.5에서 변경: 이제 프로퍼티 개체의 독스트링이 쓰기 가능합니다.


@geindex __name__ (property의 속성)
@anchor{library/functions property __name__}@anchor{4b4}
@deffn {속성} __name__

Attribute holding the name of the property. The name of the property
can be changed at runtime.


Added in version 3.13.

@end deffn
@end deffn

@anchor{library/functions func-range}@anchor{25bc}
@deffn {클래스} range (stop, /)

@deffnx {클래스} range (start, stop, step=1, /)

함수라기보다, @ref{b3d,,range} 는 실제로는 @ref{25dd,,범위} 와 @ref{202c,,시퀀스 형 — list@comma{} tuple@comma{} range} 에 설명된 대로 불변 시퀀스 형입니다.
@end deffn

@geindex built-in function; repr()
@anchor{library/functions repr}@anchor{1c1}
@deffn {함수} repr (object, /)

Return a string containing a printable representation of an object.  For many
types, this function makes an attempt to return a string that would yield an
object with the same value when passed to @ref{4a4,,eval()}; otherwise, the
representation is a string enclosed in angle brackets that contains the name
of the type of the object together with additional information often
including the name and address of the object.  A class can control what this
function returns for its instances
by defining a @ref{82e,,__repr__()} method.
If @ref{1724,,sys.displayhook()} is not accessible, this function will raise
@ref{244,,RuntimeError}.

This class has a custom representation that can be evaluated:

@example
class Person:
   def __init__(self, name, age):
      self.name = name
      self.age = age

   def __repr__(self):
      return f"Person('@{self.name@}', @{self.age@})"
@end example
@end deffn

@geindex built-in function; reversed()
@anchor{library/functions reversed}@anchor{a65}
@deffn {함수} reversed (object, /)

Return a reverse @ref{4ca,,iterator}.  The argument must be an object which has
a @ref{e85,,__reversed__()} method or supports the sequence protocol (the
@ref{1797,,__len__()} method and the @ref{588,,__getitem__()} method
with integer arguments starting at @code{0}).
@end deffn

@geindex built-in function; round()
@anchor{library/functions round}@anchor{14df}
@deffn {함수} round (number, ndigits=None)

`number' 를 소수점 다음에 `ndigits' 정밀도로 반올림한 값을 돌려줍니다. `ndigits' 가 생략되거나 @code{None} 이면, 입력에 가장 가까운 정수를 돌려줍니다.

For the built-in types supporting @ref{14df,,round()}, values are rounded to the
closest multiple of 10 to the power minus `ndigits'; if two multiples are
equally close, rounding is done toward the even choice (so, for example,
both @code{round(0.5)} and @code{round(-0.5)} are @code{0}, and @code{round(1.5)} is
@code{2}).  Any integer value is valid for `ndigits' (positive, zero, or
negative).  The return value is an integer if `ndigits' is omitted or
@code{None}.
Otherwise, the return value has the same type as `number'.

일반적인 파이썬 객체 @code{number} 의 경우, @code{round} 는 @code{number.__round__} 에 위임합니다.

@cartouche
@quotation 참고 
float에 대한 @ref{14df,,round()} 의 동작은 예상과 다를 수 있습니다: 예를 들어, @code{round(2.675, 2)} 는 @code{2.68} 대신에 @code{2.67} 을 제공합니다. 이것은 버그가 아닙니다: 대부분의 십진 소수가 float로 정확히 표현될 수 없다는 사실로부터 오는 결과입니다. 자세한 정보는 @ref{20fe,,부동 소수점 산술; 문제점 및 한계} 를 보세요.
@end quotation
@end cartouche
@end deffn

@anchor{library/functions func-set}@anchor{25bd}
@deffn {클래스} set (iterable=(), /)

새 @ref{184,,set} 객체를 돌려줍니다. 선택적으로 `iterable' 에서 가져온 요소를 갖습니다. @code{set} 은 내장 클래스입니다. 이 클래스에 대한 설명서는 @code{set} 및 @ref{202f,,집합 형 — set@comma{} frozenset} 을 보세요.

다른 컨테이너의 경우 내장 @ref{7f1,,frozenset}, @ref{24d,,list}, @ref{610,,tuple} 및 @ref{183,,dict} 클래스와 @ref{1e,,collections} 모듈을 보세요.
@end deffn

@geindex built-in function; setattr()
@anchor{library/functions setattr}@anchor{25be}
@deffn {함수} setattr (object, name, value, /)

This is the counterpart of @ref{dc9,,getattr()}.  The arguments are an object, a
string, and an arbitrary value.  The string may name an existing attribute or a
new attribute.  The function assigns the value to the attribute, provided the
object allows it.  For example, @code{setattr(x, 'foobar', 123)} is equivalent to
@code{x.foobar = 123}.

`name' need not be a Python identifier as defined in @ref{229d,,Names (identifiers and keywords)}
unless the object chooses to enforce that, for example in a custom
@ref{dca,,__getattribute__()} or via @ref{16f0,,__slots__}.
An attribute whose name is not an identifier will not be accessible using
the dot notation, but is accessible through @ref{dc9,,getattr()} etc..

@cartouche
@quotation 참고 
Since @ref{20a1,,private name mangling} happens at
compilation time, one must manually mangle a private attribute’s
(attributes with two leading underscores) name in order to set it with
@code{setattr()}.
@end quotation
@end cartouche
@end deffn

@geindex slice (내장 클래스)
@anchor{library/functions slice}@anchor{693}
@deffn {클래스} slice (stop, /)

@deffnx {클래스} slice (start, stop, step=None, /)

Return a @ref{24ae,,slice} object representing the set of indices specified by
@code{range(start, stop, step)}.  The `start' and `step' arguments default to
@code{None}.

Slice objects are also generated when @ref{24ad,,slicing syntax}
is used.  For example: @code{a[start:stop:step]} or @code{a[start:stop, i]}.

See @ref{d42,,itertools.islice()} for an alternate version that returns an
@ref{4ca,,iterator}.

@geindex start (slice의 속성)
@geindex stop (slice의 속성)
@geindex step (slice의 속성)
@anchor{library/functions slice start}@anchor{23a5}
@deffn {속성} start
@anchor{library/functions slice stop}@anchor{23a6}
@deffnx {속성} stop
@anchor{library/functions slice step}@anchor{23a7}
@deffnx {속성} step

These read-only attributes are set to the argument values
(or their default).  They have no other explicit functionality;
however, they are used by NumPy and other third-party packages.
@end deffn


버전 3.12에서 변경: Slice objects are now @ref{823,,hashable} (provided @ref{23a5,,start},
@ref{23a6,,stop}, and @ref{23a7,,step} are hashable).

@end deffn

@geindex built-in function; sorted()
@anchor{library/functions sorted}@anchor{dc6}
@deffn {함수} sorted (iterable, /, *, key=None, reverse=False)

`iterable' 의 항목들로 새 정렬된 리스트를 돌려줍니다.

키워드 인자로만 지정해야 하는 두 개의 선택적 인자가 있습니다.

`key' 는 하나의 인자를 받는 함수를 지정하는데, `iterable'의 각 요소들로부터 비교 키를 추출하는 데 사용됩니다 (예를 들어, @code{key = str.lower}). 기본값은 @code{None} 입니다 (요소를 직접 비교합니다).

`reverse' 는 논리값입니다. @code{True} 로 설정되면, 각 비교가 뒤집힌 것처럼 리스트 요소들이 정렬됩니다.

예전 스타일의 `cmp' 함수를 `key' 함수로 변환하려면 @ref{13df,,functools.cmp_to_key()} 를 사용하세요.

내장 @ref{dc6,,sorted()} 함수는 안정적(stable)임이 보장됩니다. 정렬은 같다고 비교되는 요소의 상대적 순서를 변경하지 않으면 안정적입니다 — 이는 여러 번 정렬할 때 유용합니다 (예를 들어, 부서별로 정렬한 후에 급여 등급별로 정렬하기).

The sort algorithm uses only @code{<} comparisons between items.  While
defining an @ref{14a5,,__lt__()} method will suffice for sorting,
@geindex Python 향상 제안; PEP 8
PEP 8@footnote{https://peps.python.org/pep-0008/} recommends that all six @ref{24d0,,rich comparisons} be implemented.  This will help avoid bugs when using
the same data with other ordering tools such as @ref{110b,,max()} that rely
on a different underlying method.  Implementing all six comparisons
also helps avoid confusion for mixed type comparisons which can call
the reflected @ref{1510,,__gt__()} method.

정렬 예제와 간단한 정렬 자습서는 @ref{25de,,정렬 기법} 를 보세요.
@end deffn

@geindex built-in function; staticmethod()
@anchor{library/functions staticmethod}@anchor{453}
@deffn {함수} @@staticmethod

메서드를 정적 메서드로 변환합니다.

정적 메서드는 묵시적인 첫 번째 인자를 받지 않습니다. 정적 메서드를 선언하려면, 이 관용구를 사용하세요:

@example
class C:
    @@staticmethod
    def f(arg1, arg2, argN): ...
@end example

@code{@@staticmethod} 형식은 함수 @ref{939,,데코레이터} 입니다 – 자세한 내용은 @ref{2016,,함수 정의}를 보세요.

A static method can be called either on the class (such as @code{C.f()}) or on
an instance (such as @code{C().f()}).
Moreover, the static method @ref{1884,,descriptor} is also callable, so it can
be used in the class definition (such as @code{f()}).

Static methods in Python are similar to those found in Java or C++. Also, see
@ref{48f,,classmethod()} for a variant that is useful for creating alternate class
constructors.

모든 데코레이터와 마찬가지로, @code{staticmethod} 를 정규 함수로 호출하여 그 결과로 어떤 일을 할 수도 있습니다. 이것은 클래스 바디에서 함수에 대한 참조가 필요하고 인스턴스 메서드로 자동 변환되는 것을 피하고자 할 때 필요합니다. 이 경우 다음 관용구를 사용하세요:

@example
def regular_function():
    ...

class C:
    method = staticmethod(regular_function)
@end example

정적 메서드에 대한 더 자세한 정보는, @ref{232c,,표준형 계층}을 참조하세요.


버전 3.10에서 변경: Static methods now inherit the method attributes
(@ref{2347,,__module__}, @ref{14d9,,__name__},
@ref{2346,,__qualname__}, @ref{13de,,__doc__} and
@ref{13dd,,__annotations__}), have a new @code{__wrapped__} attribute,
and are now callable as regular functions.

@end deffn

@geindex string;str() (built-in function)

@anchor{library/functions func-str}@anchor{25bf}
@deffn {클래스} str (*, encoding='utf-8', errors='strict')

@deffnx {클래스} str (object)

@deffnx {클래스} str (object, encoding, errors='strict')

@deffnx {클래스} str (object, *, errors)

`object' 의 @ref{169,,str} 버전을 돌려줍니다. 자세한 내용은 @ref{169,,str()} 을 보세요.

@code{str} 은 내장 문자열 @ref{1cfa,,클래스} 입니다. 문자열에 대한 일반적인 정보는 @ref{1fdd,,텍스트 시퀀스 형 — str} 를 보세요.
@end deffn

@geindex built-in function; sum()
@anchor{library/functions sum}@anchor{694}
@deffn {함수} sum (iterable, /, start=0)

`start' 및 `iterable' 의 항목들을 왼쪽에서 오른쪽으로 합하고 합계를 돌려줍니다. `iterable' 의 항목은 일반적으로 숫자며 시작 값은 문자열이 될 수 없습니다.

For some use cases, there are good alternatives to @code{sum()}.
The preferred, fast way to concatenate a sequence of strings is by calling
@code{'@w{'}.join(sequence)}.  To add floating-point values with extended precision,
see @ref{15d9,,math.fsum()}.  To concatenate a series of iterables, consider using
@ref{25df,,itertools.chain()}.


버전 3.8에서 변경: `start' 매개 변수는 키워드 인자로만 지정될 수 있습니다.



버전 3.12에서 변경: Summation of floats switched to an algorithm
that gives higher accuracy and better commutativity on most builds.



버전 3.14에서 변경: Added specialization for summation of complexes,
using same algorithm as for summation of floats.

@end deffn

@geindex super (내장 클래스)
@anchor{library/functions super}@anchor{1a6}
@deffn {클래스} super

@deffnx {클래스} super (type, object_or_type=None, /)

메서드 호출을 `type' 의 부모나 형제 클래스에 위임하는 프락시 객체를 돌려줍니다. 이는 클래스에서 재정의된 상속 된 메서드를 액세스할 때 유용합니다.

The `object_or_type' determines the @ref{25e0,,method resolution order}
to be searched.  The search starts from the class right after the
`type'.

For example, if @ref{2374,,__mro__} of `object_or_type' is
@code{D -> B -> C -> A -> object} and the value of `type' is @code{B},
then @ref{1a6,,super()} searches @code{C -> A -> object}.

The @ref{2374,,__mro__} attribute of the class corresponding to
`object_or_type' lists the method resolution search order used by both
@ref{dc9,,getattr()} and @ref{1a6,,super()}.  The attribute is dynamic and can change
whenever the inheritance hierarchy is updated.

두 번째 인자가 생략되면, 반환되는 슈퍼 객체는 연결되지 않았습니다(unbound). 두 번째 인자가 객체면, @code{isinstance(obj, type)} 는 참이어야 합니다. 두 번째 인자가 형이면, @code{issubclass(type2, type)} 는 참이어야 합니다 (이것은 클래스 메서드에 유용합니다).

When called directly within an ordinary method of a class, both arguments may
be omitted (“zero-argument @code{super()}”). In this case, `type' will be the
enclosing class, and `obj' will be the first argument of the immediately
enclosing function (typically @code{self}). (This means that zero-argument
@code{super()} will not work as expected within nested functions, including
generator expressions, which implicitly create nested functions.)

`super' 에는 두 가지 일반적인 사용 사례가 있습니다. 단일 상속 클래스 계층 구조에서는, `super' 를 사용하여 명시적으로 이름을 지정하지 않고 부모 클래스를 참조할 수 있으므로, 코드를 더 유지 관리하기 쉽게 만들 수 있습니다. 이 사용은 다른 프로그래밍 언어에서 `super' 를 쓰는 것과 매우 유사합니다.

The second use case is to support cooperative multiple inheritance in a
dynamic execution environment.  This use case is unique to Python and is
not found in statically compiled languages or languages that only support
single inheritance.  This makes it possible to implement “diamond diagrams”
where multiple base classes implement the same method.  Good design dictates
that such implementations have the same calling signature in every case (because the
order of calls is determined at runtime, because that order adapts
to changes in the class hierarchy, and because that order can include
sibling classes that are unknown prior to runtime).

두 경우 모두, 일반적인 슈퍼 클래스 호출은 이런 식입니다:

@example
class C(B):
    def method(self, arg):
        super().method(arg)    # This does the same thing as:
                               # super(C, self).method(arg)
@end example

메서드 조회 외에, @ref{1a6,,super()}는 어트리뷰트 조회에도 작동합니다. 한가지 가능한 사용 사례는 부모나 형제 클래스에 있는 @ref{1884,,디스크립터}를 호출하는 것입니다.

Note that @ref{1a6,,super()} is implemented as part of the binding process for
explicit dotted attribute lookups such as @code{super().__getitem__(name)}.
It does so by implementing its own @ref{dca,,__getattribute__()} method
for searching
classes in a predictable order that supports cooperative multiple inheritance.
Accordingly, @code{super()} is undefined for implicit lookups using statements or
operators such as @code{super()[name]}.

또한, 인자가 없는 형식을 제외하고는, @ref{1a6,,super()} 는 메서드 내부에서만 사용하도록 제한되지 않는다는 점에 유의하세요. 두 개의 인자 형식은 인자를 정확하게 지정하고 적절한 참조를 만듭니다. 인자가 없는 형식은 클래스 정의 내에서만 작동하는데, 컴파일러가 정의되고 있는 클래스를 올바르게 가져오고 일반 메서드에서 현재 인스턴스에 액세스하는 데 필요한 세부 정보를 채우기 때문입니다.

@ref{1a6,,super()}를 사용하여 협력적 클래스를 설계하는 방법에 대한 실용적인 제안은 super() 사용 안내@footnote{https://rhettinger.wordpress.com/2011/05/26/super-considered-super/} 를 보세요.


버전 3.14에서 변경: @code{super} objects are now @ref{ab,,pickleable} and
 @ref{29,,copyable}.

@end deffn

@anchor{library/functions func-tuple}@anchor{25c0}
@deffn {클래스} tuple (iterable=(), /)

함수이기보다, @ref{610,,tuple} 은 실제로 @ref{254a,,튜플} 과 @ref{202c,,시퀀스 형 — list@comma{} tuple@comma{} range} 에 문서화 된 것처럼 불변 시퀀스 형입니다.
@end deffn

@geindex type (내장 클래스)
@anchor{library/functions type}@anchor{f43}
@deffn {클래스} type (object, /)

@deffnx {클래스} type (name, bases, dict, /, **kwargs)

@geindex object;type

With one argument, return the type of an `object'.  The return value is a
type object and generally the same object as returned by
@ref{16b2,,object.__class__}.

객체의 형을 검사하는 데는 @ref{2ad,,isinstance()} 내장 함수가 권장되는데, 서브 클래스를 고려하기 때문입니다.

With three arguments, return a new type object.  This is essentially a
dynamic form of the @ref{14dc,,class} statement. The `name' string is
the class name and becomes the @ref{16b0,,__name__} attribute.
The `bases' tuple contains the base classes and becomes the
@ref{16b1,,__bases__} attribute; if empty, @ref{c7d,,object}, the
ultimate base of all classes, is added.  The `dict' dictionary contains
attribute and method definitions for the class body; it may be copied
or wrapped before becoming the @ref{e56,,__dict__} attribute.
The following two statements create identical @code{type} objects:

@example
>>> class X:
...     a = 1
...
>>> X = type('X', (), dict(a=1))
@end example

See also:


@itemize *

@item 
@ref{236d,,Documentation on attributes and methods on classes}.

@item 
@ref{25e1,,형 객체}
@end itemize

세 인자 형식에 제공된 키워드 인자는 클래스 정의의  (`metaclass' 를 제외한) 키워드와 같은 방식으로 적절한 메타 클래스 장치(일반적으로 @ref{842,,__init_subclass__()})에 전달됩니다.

@ref{e44,,클래스 생성 커스터마이제이션} 도 보세요.


버전 3.6에서 변경: Subclasses of @code{type} which don’t override @code{type.__new__} may no
longer use the one-argument form to get the type of an object.

@end deffn

@geindex built-in function; vars()
@anchor{library/functions vars}@anchor{1e1f}
@deffn {함수} vars ()

@deffnx {함수} vars (object, /)

Return the @ref{77c,,__dict__} attribute for a module, class, instance,
or any other object with a @code{__dict__} attribute.

Objects such as modules and instances have an updateable @ref{77c,,__dict__}
attribute; however, other objects may have write restrictions on their
@code{__dict__} attributes (for example, classes use a
@ref{697,,types.MappingProxyType} to prevent direct dictionary updates).

Without an argument, @code{vars()} acts like @ref{46f,,locals()}.

객체가 지정되었지만 @ref{77c,,__dict__} 어트리뷰트가 없으면 @ref{198,,TypeError} 예외가 발생합니다 (예를 들어, 해당 클래스가 @ref{16f0,,__slots__} 어트리뷰트를 정의하면).


버전 3.13에서 변경: The result of calling this function without an argument has been
updated as described for the @ref{46f,,locals()} builtin.

@end deffn

@geindex built-in function; zip()
@anchor{library/functions zip}@anchor{1a0}
@deffn {함수} zip (*iterables, strict=False)

Iterate over several iterables in parallel, producing tuples with an item
from each one.

Example:

@example
>>> for item in zip([1, 2, 3], ['sugar', 'spice', 'everything nice']):
...     print(item)
...
(1, 'sugar')
(2, 'spice')
(3, 'everything nice')
@end example

More formally: @code{zip()} returns an iterator of tuples, where the `i'-th
tuple contains the `i'-th element from each of the argument iterables.

Another way to think of @code{zip()} is that it turns rows into columns, and
columns into rows.  This is similar to transposing a matrix@footnote{https://en.wikipedia.org/wiki/Transpose}.

@code{zip()} is lazy: The elements won’t be processed until the iterable is
iterated on, e.g. by a @code{for} loop or by wrapping in a
@ref{24d,,list}.

One thing to consider is that the iterables passed to @code{zip()} could have
different lengths; sometimes by design, and sometimes because of a bug in
the code that prepared these iterables.  Python offers three different
approaches to dealing with this issue:


@itemize *

@item 
By default, @code{zip()} stops when the shortest iterable is exhausted.
It will ignore the remaining items in the longer iterables, cutting off
the result to the length of the shortest iterable:

@example
>>> list(zip(range(3), ['fee', 'fi', 'fo', 'fum']))
[(0, 'fee'), (1, 'fi'), (2, 'fo')]
@end example

@item 
@code{zip()} is often used in cases where the iterables are assumed to be
of equal length.  In such cases, it’s recommended to use the @code{strict=True}
option. Its output is the same as regular @code{zip()}:

@example
>>> list(zip(('a', 'b', 'c'), (1, 2, 3), strict=True))
[('a', 1), ('b', 2), ('c', 3)]
@end example

Unlike the default behavior, it raises a @ref{2ec,,ValueError} if one iterable
is exhausted before the others:

@example
>>> for item in zip(range(3), ['fee', 'fi', 'fo', 'fum'], strict=True):
...     print(item)
...
(0, 'fee')
(1, 'fi')
(2, 'fo')
Traceback (most recent call last):
  ...
ValueError: zip() argument 2 is longer than argument 1
@end example

@c This doctest is disabled because doctest does not support capturing
@c output and exceptions in the same code unit.
@c https://github.com/python/cpython/issues/65382

Without the @code{strict=True} argument, any bug that results in iterables of
different lengths will be silenced, possibly manifesting as a hard-to-find
bug in another part of the program.

@item 
Shorter iterables can be padded with a constant value to make all the
iterables have the same length.  This is done by
@ref{14a3,,itertools.zip_longest()}.
@end itemize

Edge cases: With a single iterable argument, @code{zip()} returns an
iterator of 1-tuples.  With no arguments, it returns an empty iterator.

Tips and tricks:


@itemize *

@item 
The left-to-right evaluation order of the iterables is guaranteed. This
makes possible an idiom for clustering a data series into n-length groups
using @code{zip(*[iter(s)]*n, strict=True)}.  This repeats the `same' iterator
@code{n} times so that each output tuple has the result of @code{n} calls to the
iterator. This has the effect of dividing the input into n-length chunks.

@item 
@ref{1a0,,zip()}을 @code{*} 연산자와 함께 쓰면 리스트를 unzip 할 수 있습니다:

@example
>>> x = [1, 2, 3]
>>> y = [4, 5, 6]
>>> list(zip(x, y))
[(1, 4), (2, 5), (3, 6)]
>>> x2, y2 = zip(*zip(x, y))
>>> x == list(x2) and y == list(y2)
True
@end example
@end itemize


버전 3.10에서 변경: Added the @code{strict} argument.

@end deffn

@geindex built-in function; __import__()
@anchor{library/functions import__}@anchor{ad1}
@deffn {함수} __import__ (name, globals=None, locals=None, fromlist=(), level=0)

@geindex statement;import
@geindex module;builtins

@cartouche
@quotation 참고 
이것은 @ref{73b,,importlib.import_module()} 과 달리 일상적인 파이썬 프로그래밍에서는 필요하지 않은 고급 함수입니다.
@end quotation
@end cartouche

이 함수는 @ref{7f7,,import} 문에 의해 호출됩니다. @code{import} 문의 의미를 변경하기 위해 대체할 수 있습니다 (@ref{13,,builtins} 모듈을 임포트하고 @code{builtins .__ import__} 에 대입합니다). 그러나 그렇게 하지 말 것을 `강하게' 권고하는데, 보통 같은 목적을 달성하는데 임포트 훅(
@geindex Python 향상 제안; PEP 302
PEP 302@footnote{https://peps.python.org/pep-0302/} 를 보세요)을 사용하는 것이 더 간단하고 기본 임포트 구현이 사용될 것이라고 가정하는 코드들과 문제를 일으키지 않기 때문입니다. @ref{ad1,,__import__()} 의 직접 사용 역시 피하고 @ref{73b,,importlib.import_module()} 을 사용할 것을 권합니다.

The function imports the module `name', potentially using the given `globals'
and `locals' to determine how to interpret the name in a package context.
The `fromlist' gives the names of objects or submodules that should be
imported from the module given by `name'.  The standard implementation does
not use its `locals' argument at all and uses its `globals' only to
determine the package context of the @ref{7f7,,import} statement.

`level' 은 절대 또는 상대 임포트를 사용할지를 지정합니다. @code{0} (기본값)은 오직 절대 임포트를 수행한다는 것을 의미합니다. 양수 값 `level' 은 @ref{ad1,,__import__()} 를 호출하는 모듈 디렉터리에 상대적으로 검색할 상위 디렉터리들의 개수를 가리킵니다 (자세한 내용은 
@geindex Python 향상 제안; PEP 328
PEP 328@footnote{https://peps.python.org/pep-0328/}을 보세요).

`name' 변수가 @code{package.module} 형식일 때, 일반적으로 `name' 에 의해 명명된 모듈이 `아니라', 최상위 패키지(첫 번째 점까지의 이름)가 반환됩니다. 그러나 비어 있지 않은 `fromlist' 인자가 주어지면 `name' 에 의해 명명된 모듈이 반환됩니다.

예를 들어, 문장 @code{import spam} 은 다음 코드를 닮은 바이트 코드를 생성합니다:

@example
spam = __import__('spam', globals(), locals(), [], 0)
@end example

문장 @code{import spam.ham} 은 이런 호출로 이어집니다:

@example
spam = __import__('spam.ham', globals(), locals(), [], 0)
@end example

여기에서 @ref{ad1,,__import__()} 가 최상위 모듈을 돌려주는 것에 주목하세요. 이것이 @ref{7f7,,import} 문에 의해 이름에 연결되는 객체이기 때문입니다.

반면에, 문장 @code{from spam.ham import eggs, sausage as saus} 는 이런 결과를 줍니다:

@example
_temp = __import__('spam.ham', globals(), locals(), ['eggs', 'sausage'], 0)
eggs = _temp.eggs
saus = _temp.sausage
@end example

여기서 @code{spam.ham} 모듈이 @ref{ad1,,__import__()} 에서 반환됩니다. 이 객체로부터, 임포트할 이름들을 가져온 후 해당 이름들로 대입됩니다.

단순히 이름으로 모듈을 임포트 하기 원한다면 (잠재적으로 패키지 내에서), @ref{73b,,importlib.import_module()} 을 사용하세요.


버전 3.3에서 변경: 음수 `level' 은 더 지원되지 않습니다 (기본값도 0으로 변경합니다).



버전 3.9에서 변경: 명령 줄 옵션 @ref{b55,,-E}나 @ref{b56,,-I}를 사용 중일 때, 환경 변수 
@geindex PYTHONCASEOK
@geindex 환경 변수; PYTHONCASEOK
@ref{b57,,PYTHONCASEOK}는 이제 무시됩니다.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 내장 상수,내장형,내장 함수,파이썬 표준 라이브러리
@anchor{library/constants doc}@anchor{25e2}@anchor{library/constants built-in-constants}@anchor{25e3}@anchor{library/constants built-in-consts}@anchor{2477}@anchor{library/constants translation-repo}@anchor{25e4}
@section 내장 상수


작은 개수의 상수가 내장 이름 공간에 있습니다. 그것들은:

@geindex False (내장 변수)
@anchor{library/constants False}@anchor{d2a}
@deffn {데이터} False

@ref{3c3,,bool} 형의 거짓 값. @code{False} 에 대입할 수 없고 @ref{18e,,SyntaxError} 를 일으킵니다.
@end deffn

@geindex True (내장 변수)
@anchor{library/constants True}@anchor{e06}
@deffn {데이터} True

@ref{3c3,,bool} 형의 참값. @code{True} 에 대입할 수 없고 @ref{18e,,SyntaxError} 를 일으킵니다.
@end deffn

@geindex None (내장 변수)
@anchor{library/constants None}@anchor{884}
@deffn {데이터} None

기본 인자가 함수에 전달되지 않을 때처럼, 값의 부재를 나타내는 데 자주 사용되는 객체. @code{None} 으로의 대입은 허락되지 않고 @ref{18e,,SyntaxError} 를 일으킵니다. @code{None}은 @ref{a52,,NoneType} 형의 유일한 인스턴스입니다.
@end deffn

@geindex NotImplemented (내장 변수)
@anchor{library/constants NotImplemented}@anchor{1a2}
@deffn {데이터} NotImplemented

연산이 다른 형에 대해 구현되지 않았음을 나타내기 위해, 이 항 특수 메서드(예를 들어, @ref{cf1,,__eq__()}, @ref{14a5,,__lt__()}, @ref{23dd,,__add__()}, @ref{23f0,,__rsub__()} 등)가 돌려줘야 하는 특별한 값; 같은 목적으로 증분 이 항 특수 메서드(예를 들어, @ref{23e2,,__imul__()}, @ref{23ff,,__iand__()} 등)가 반환할 수 있습니다. 불리언 문맥에서 평가해서는 안됩니다. @code{NotImplemented}는 @ref{a53,,types.NotImplementedType} 형의 유일한 인스턴스입니다.

@cartouche
@quotation 참고 
이 항 (또는 증분) 메서드가 @code{NotImplemented} 를 반환하면 인터프리터는 다른 형(또는 연산자에 따라 다른 폴백)에서 뒤집힌 연산을 시도합니다. 모든 시도가 @code{NotImplemented} 를 반환하면, 인터프리터는 적절한 예외를 발생시킵니다. 부정확하게 @code{NotImplemented} 를 반환하면 오해의 소지가 있는 에러 메시지가 나오거나 파이썬 코드에 @code{NotImplemented} 값이 반환됩니다.

예는 @ref{232f,,산술 연산 구현}을 보세요.
@end quotation
@end cartouche

@cartouche
@quotation 조심 
@code{NotImplementedError} 와 @code{NotImplemented} 는 바꿔쓸 수 없습니다. 이 상수는 위에서 설명한 대로만 사용해야 합니다; 이 예외의 올바른 사용법에 대한 자세한 내용은 @ref{36b,,NotImplementedError}를 참조하세요.
@end quotation
@end cartouche


버전 3.9에서 변경: Evaluating @code{NotImplemented} in a boolean context was deprecated.



버전 3.14에서 변경: Evaluating @code{NotImplemented} in a boolean context now raises a @ref{198,,TypeError}.
It previously evaluated to @ref{e06,,True} and emitted a @ref{1a3,,DeprecationWarning}
since Python 3.9.

@end deffn

@geindex ...;줄임표 리터럴

@geindex Ellipsis (내장 변수)
@anchor{library/constants Ellipsis}@anchor{2325}
@deffn {데이터} Ellipsis

The same as the ellipsis literal “@code{...}”, an object frequently used to
indicate that something is omitted. Assignment to @code{Ellipsis} is possible, but
assignment to  @code{...} raises a @ref{18e,,SyntaxError}.
@code{Ellipsis} is the sole instance of the @ref{a51,,types.EllipsisType} type.
@end deffn

@geindex __debug__ (내장 변수)
@anchor{library/constants debug__}@anchor{9da}
@deffn {데이터} __debug__

이 상수는 파이썬이 @ref{18c,,-O} 옵션으로 시작되지 않았다면 참이 됩니다. @ref{b60,,assert} 문도 볼 필요가 있습니다.
@end deffn

@cartouche
@quotation 참고 
@ref{884,,None}, @ref{d2a,,False}, @ref{e06,,True} 그리고 @ref{9da,,__debug__} 은 다시 대입할 수 없습니다 (이것들을 대입하면, 설사 어트리뷰트 이름으로 사용해도, @ref{18e,,SyntaxError} 를 일으킵니다). 그래서 이것들은 “진짜” 상수로 간주 될 수 있습니다.
@end quotation
@end cartouche

@menu
* site 모듈에 의해 추가된 상수들:: 

@end menu

@node site 모듈에 의해 추가된 상수들,,,내장 상수
@anchor{library/constants constants-added-by-the-site-module}@anchor{25e5}@anchor{library/constants site-consts}@anchor{25e6}
@subsection @code{site} 모듈에 의해 추가된 상수들


@ref{cc,,site} 모듈(@ref{13ad,,-S} 명령행 옵션이 주어진 경우를 제외하고는, 시작할 때 자동으로 임포트 됩니다)은 내장 이름 공간에 여러 상수를 추가합니다. 대화형 인터프리터 셸에 유용하고 프로그램에서 사용해서는 안 됩니다.

@geindex quit (내장 변수)
@geindex exit (내장 변수)
@anchor{library/constants quit}@anchor{25e7}
@deffn {데이터} quit (code=None)
@anchor{library/constants exit}@anchor{25e8}
@deffnx {데이터} exit (code=None)

Objects that when printed, print a message like “Use quit() or Ctrl-D
(i.e. EOF) to exit”, and when accessed directly in the interactive
interpreter or called as functions, raise @ref{f3b,,SystemExit} with the
specified exit code.
@end deffn


@deffn {데이터} help

Object that when printed, prints the message “Type help() for interactive
help, or help(object) for help about object.”, and when accessed directly
in the interactive interpreter, invokes the built-in help system
(see @ref{ad4,,help()}).
@end deffn

@geindex copyright (내장 변수)
@geindex credits (내장 변수)
@anchor{library/constants copyright}@anchor{1790}
@deffn {데이터} copyright
@anchor{library/constants credits}@anchor{1791}
@deffnx {데이터} credits

인쇄하거나 호출할 때, 각각 저작권 또는 크레딧 텍스트를 인쇄하는 객체입니다.
@end deffn

@geindex license (내장 변수)
@anchor{library/constants license}@anchor{178f}
@deffn {데이터} license

인쇄될 때 “Type license() to see the full license text”와 같은 메시지를 인쇄하고, 호출될 때 전체 라이센스 텍스트를 페이지 생성기와 같은 방식(한 번에 한 화면씩)으로 표시하는 객체입니다.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c XXX: reference/datamodel and this have quite a few overlaps!

@node 내장형,내장 예외,내장 상수,파이썬 표준 라이브러리
@anchor{library/stdtypes doc}@anchor{25e9}@anchor{library/stdtypes bltin-types}@anchor{25ea}@anchor{library/stdtypes built-in-types}@anchor{25eb}@anchor{library/stdtypes translation-repo}@anchor{25ec}
@section 내장형


다음 섹션에서는 인터프리터에 내장된 표준형에 관해 설명합니다.

@geindex built-in;types

기본 내장 유형은 숫자, 시퀀스, 매핑, 클래스, 인스턴스 및 예외입니다.

일부 컬렉션 클래스는 가변입니다. 제자리에서 멤버를 추가, 삭제 또는 재배치하고 특정 항목을 반환하지 않는 메서드는 컬렉션 인스턴스 자체를 반환하지 않고 @code{None} 을 반환합니다.

일부 연산들은 여러 객체 형에서 지원됩니다; 특히 사실상 모든 객체를 동등 비교하고, 논리값을 검사하고, (@ref{1c1,,repr()} 함수 또는 약간 다른 @ref{169,,str()} 함수를 사용해서) 문자열로 변환할 수 있습니다. 두 번째 함수는 @ref{1174,,print()} 함수로 객체를 쓸 때 묵시적으로 사용됩니다.

@menu
* 논리값 검사:: 
* 논리 연산 — and@comma{} or@comma{} not: 논리 연산 — and or not. 
* 비교: 비교<2>. 
* 숫자 형 — int@comma{} float@comma{} complex: 숫자 형 — int float complex. 
* Boolean Type - bool:: 
* 이터레이터 형:: 
* 시퀀스 형 — list@comma{} tuple@comma{} range: 시퀀스 형 — list tuple range. 
* Text and Binary Sequence Type Methods Summary:: 
* 텍스트 시퀀스 형 — str:: 
* 바이너리 시퀀스 형 — bytes@comma{} bytearray@comma{} memoryview: 바이너리 시퀀스 형 — bytes bytearray memoryview. 
* 집합 형 — set@comma{} frozenset: 집합 형 — set frozenset. 
* 매핑 형 — dict:: 
* 컨텍스트 관리자 형:: 
* Type Annotation Types — Generic Alias@comma{} Union: Type Annotation Types — Generic Alias Union. 
* 기타 내장형:: 
* 특수 어트리뷰트:: 
* Integer string conversion length limitation:: 

@end menu

@node 논리값 검사,논리 연산 — and or not,,내장형
@anchor{library/stdtypes truth}@anchor{185b}@anchor{library/stdtypes truth-value-testing}@anchor{25ed}
@subsection 논리값 검사


@geindex statement;if
@geindex statement;while
@geindex truth;value
@geindex Boolean;operations
@geindex false

모든 객체는 논리값을 검사할 수 있는데, @ref{181,,if} 또는 @ref{1974,,while} 조건 또는 다음에 나오는 논리 연산의 피연산자로 사용될 수 있도록 합니다.

@geindex true

By default, an object is considered true unless its class defines either a
@ref{14da,,__bool__()} method that returns @code{False} or a
@ref{1797,,__len__()} method that
returns zero, when called with the object. @footnote{
이 특수 메서드에 대한 추가 정보는 파이썬 레퍼런스 설명서(@ref{23ad,,기본적인 커스터마이제이션})에서 찾을 수 있습니다.
} If one of the methods raises an
exception when called, the exception is propagated and the object does
not have a truth value (for example, @ref{1a2,,NotImplemented}).
Here are most of the built-in objects considered false:

@geindex None (Built-in object)
@geindex False (Built-in object)


@itemize *

@item 
constants defined to be false: @code{None} and @code{False}

@item 
모든 숫자 형들의 영: @code{0}, @code{0.0}, @code{0j}, @code{Decimal(0)}, @code{Fraction(0, 1)}

@item 
빈 시퀀스와 컬렉션: @code{'@w{'}}, @code{()}, @code{[]}, @code{@{@}}, @code{set()}, @code{range(0)}
@end itemize

@geindex operator;or
@geindex operator;and
@geindex False
@geindex True

논리값을 돌려주는 연산과 내장 함수는 달리 명시하지 않는 한 항상 거짓의 경우 @code{0} 이나 @code{False} 를, 참이면 @code{1} 이나 @code{True} 를 돌려줍니다. (중요한 예외: 논리 연산 @code{or} 와 @code{and} 는 항상 피연산자 중 하나를 돌려줍니다.)

@node 논리 연산 — and or not,비교<2>,논리값 검사,내장형
@anchor{library/stdtypes boolean}@anchor{25ee}@anchor{library/stdtypes boolean-operations-and-or-not}@anchor{25ef}
@subsection 논리 연산 — @code{and}, @code{or}, @code{not}


@geindex Boolean;operations

이것들은 우선순위에 따라 오름차순으로 정렬된 논리 연산들입니다:


@multitable {xxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxx} 
@headitem

연산

@tab

결과

@tab

노트

@item

@code{x or y}

@tab

if `x' is true, then `x', else
`y'

@tab

(1)

@item

@code{x and y}

@tab

`x*가 거짓이면 *x', 그렇지 않으면 `y'

@tab

(2)

@item

@code{not x}

@tab

`x' 가 거짓이면 @code{True}, 그렇지 않으면 @code{False}

@tab

(3)

@end multitable


@geindex operator;and
@geindex operator;or
@geindex operator;not

노트:


@enumerate 

@item 
이것은 단락-회로 연산자이므로 첫 번째 인자가 거짓일 때만 두 번째의 값을 구합니다.

@item 
이것은 단락-회로 연산자이므로 첫 번째 인자가 참일 때만 두 번째의 값을 구합니다.

@item 
@code{not} 은 비논리 연산자들보다 낮은 우선순위를 갖습니다. 그래서, @code{not a == b} 는 @code{not (a == b)} 로 해석되고, @code{a == not b} 는 문법 오류입니다.
@end enumerate

@node 비교<2>,숫자 형 — int float complex,논리 연산 — and or not,내장형
@anchor{library/stdtypes comparisons}@anchor{25f0}@anchor{library/stdtypes stdcomparisons}@anchor{25f1}
@subsection 비교


@geindex chaining;comparisons
@geindex operator;comparison
@geindex operator;==
@geindex operator;< (less)
@geindex operator;<=
@geindex operator;> (greater)
@geindex operator;>=
@geindex operator;!=
@geindex operator;is
@geindex operator;is not

파이썬에는 8가지 비교 연산이 있습니다. 이들 모두는 같은 우선순위를 가집니다 (논리 연산보다는 높습니다). 비교는 임의로 연결될 수 있습니다; 예를 들어 @code{x < y <= z} 는 `y' 의 값을 한 번만 구한다는 점을 제외하고는 @code{x < y and y <= z} 와 동등합니다 (하지만 두 경우 모두 @code{x < y} 가 거짓으로 밝혀지면 `z' 의 값을 구하지 않습니다).

이 표는 비교 연산을 요약합니다:


@multitable {xxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

연산

@tab

뜻

@item

@code{<}

@tab

엄격히 작다

@item

@code{<=}

@tab

작거나 같다

@item

@code{>}

@tab

엄격히 크다

@item

@code{>=}

@tab

크거나 같다

@item

@code{==}

@tab

같다

@item

@code{!=}

@tab

같지 않다

@item

@code{is}

@tab

객체 아이덴티티

@item

@code{is not}

@tab

부정된 객체 아이덴티티

@end multitable


@geindex object;numeric
@geindex objects;comparing

Unless stated otherwise, objects of different types never compare equal.
The @code{==} operator is always defined but for some object types (for example,
class objects) is equivalent to @ref{34c,,is}. The @code{<}, @code{<=}, @code{>} and @code{>=}
operators are only defined where they make sense; for example, they raise a
@ref{198,,TypeError} exception when one of the arguments is a complex number.

@geindex __eq__() (instance method)
@geindex __ne__() (instance method)
@geindex __lt__() (instance method)
@geindex __le__() (instance method)
@geindex __gt__() (instance method)
@geindex __ge__() (instance method)

Non-identical instances of a class normally compare as non-equal unless the
class defines the @ref{cf1,,__eq__()} method.

Instances of a class cannot be ordered with respect to other instances of the
same class, or other types of object, unless the class defines enough of the
methods @ref{14a5,,__lt__()}, @ref{150f,,__le__()}, @ref{1510,,__gt__()}, and
@ref{1511,,__ge__()} (in general, @code{__lt__()} and
@ref{cf1,,__eq__()} are sufficient, if you want the conventional meanings of the
comparison operators).

@ref{34c,,is} 와 @ref{24d7,,is not} 연산자의 동작은 사용자 정의할 수 없습니다; 또한 임의의 두 객체에 적용할 수 있으며 예외를 발생시키지 않습니다.

@geindex operator;in
@geindex operator;not in

Two more operations with the same syntactic priority, @ref{34b,,in} and
@ref{840,,not in}, are supported by types that are @ref{142c,,iterable} or
implement the @ref{15be,,__contains__()} method.

@node 숫자 형 — int float complex,Boolean Type - bool,비교<2>,내장형
@anchor{library/stdtypes numeric-types-int-float-complex}@anchor{25f2}@anchor{library/stdtypes typesnumeric}@anchor{1fd8}
@subsection 숫자 형 — @code{int}, @code{float}, @code{complex}


@geindex object;numeric
@geindex object;Boolean
@geindex object;integer
@geindex object;floating-point
@geindex object;complex number
@geindex C;language

There are three distinct numeric types: `integers', `floating-point
numbers', and `complex numbers'.  In addition, Booleans are a
subtype of integers.  Integers have unlimited precision.  Floating-point
numbers are usually implemented using double in C; information
about the precision and internal representation of floating-point
numbers for the machine on which your program is running is available
in @ref{1dcc,,sys.float_info}.  Complex numbers have a real and imaginary
part, which are each a floating-point number.  To extract these parts
from a complex number `z', use @code{z.real} and @code{z.imag}. (The standard
library includes the additional numeric types @ref{213,,fractions.Fraction}, for
rationals, and @ref{1fe,,decimal.Decimal}, for floating-point numbers with
user-definable precision.)

@geindex numeric;literals
@geindex integer;literals
@geindex floating-point;literals
@geindex complex number;literals
@geindex hexadecimal;literals
@geindex octal;literals
@geindex binary;literals

Numbers are created by numeric literals or as the result of built-in functions
and operators.  Unadorned integer literals (including hex, octal and binary
numbers) yield integers.  Numeric literals containing a decimal point or an
exponent sign yield floating-point numbers.  Appending @code{'j'} or @code{'J'} to a
numeric literal yields an imaginary number (a complex number with a zero real
part) which you can add to an integer or float to get a complex number with real
and imaginary parts.

생성자 @ref{19b,,int()}, @ref{196,,float()}, @ref{197,,complex()}를 특정 형의 숫자를 만드는데 사용할 수 있습니다.

@geindex arithmetic
@geindex built-in function;int
@geindex built-in function;float
@geindex built-in function;complex
@geindex operator;+ (plus)
@geindex + (plus);unary operator
@geindex + (plus);binary operator
@geindex operator;- (minus)
@geindex - (minus);unary operator
@geindex - (minus);binary operator
@geindex operator;* (asterisk)
@geindex operator;/ (slash)
@geindex operator;//
@geindex operator;% (percent)
@geindex operator;**
@anchor{library/stdtypes stdtypes-mixed-arithmetic}@anchor{2469}
Python fully supports mixed arithmetic: when a binary arithmetic operator has
operands of different built-in numeric types, the operand with the “narrower”
type is widened to that of the other:


@itemize *

@item 
If both arguments are complex numbers, no conversion is performed;

@item 
if either argument is a complex or a floating-point number, the other is
converted to a floating-point number;

@item 
otherwise, both must be integers and no conversion is necessary.
@end itemize

Arithmetic with complex and real operands is defined by the usual mathematical
formula, for example:

@example
x + complex(u, v) = complex(x + u, v)
x * complex(u, v) = complex(x * u, x * v)
@end example

A comparison between numbers of different types behaves as though the exact
values of those numbers were being compared. @footnote{
결과적으로, 리스트 @code{[1, 2]} 는 @code{[1.0, 2.0]} 과 같다고 취급되고, 튜플도 마찬가지입니다.
}

(복소수를 제외한) 모든 숫자 형은 다음과 같은 연산들을 지원합니다 (연산의 우선순위는 @ref{24eb,,연산자 우선순위}를 참조하십시오):


@multitable {xxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxx} 
@headitem

연산

@tab

결과

@tab

노트

@tab

전체 문서

@item

@code{x + y}

@tab

`x' 와 `y' 의 합

@tab

@tab

@item

@code{x - y}

@tab

`x' 와 `y' 의 차

@tab

@tab

@item

@code{x * y}

@tab

`x' 와 `y' 의 곱

@tab

@tab

@item

@code{x / y}

@tab

`x' 와 `y' 의 몫

@tab

@tab

@item

@code{x // y}

@tab

`x' 와 `y' 의 정수로 내림한 몫

@tab

(1)(2)

@tab

@item

@code{x % y}

@tab

@code{x / y} 의 나머지

@tab

(2)

@tab

@item

@code{-x}

@tab

음의 `x'

@tab

@tab

@item

@code{+x}

@tab

`x' 그대로

@tab

@tab

@item

@code{abs(x)}

@tab

`x' 의 절댓값 또는 크기

@tab

@tab

@ref{208b,,abs()}

@item

@code{int(x)}

@tab

정수로 변환된 `x'

@tab

(3)(6)

@tab

@ref{19b,,int()}

@item

@code{float(x)}

@tab

실수로 변환된 `x'

@tab

(4)(6)

@tab

@ref{196,,float()}

@item

@code{complex(re, im)}

@tab

실수부 `re' 와 허수부 `im' 으로 구성된 복소수. `im' 의 기본값은 0입니다.

@tab

(6)

@tab

@ref{197,,complex()}

@item

@code{c.conjugate()}

@tab

복소수 `c' 의 켤레

@tab

@tab

@item

@code{divmod(x, y)}

@tab

쌍 @code{(x // y, x % y)}

@tab

(2)

@tab

@ref{b98,,divmod()}

@item

@code{pow(x, y)}

@tab

`x' 의 `y' 거듭제곱

@tab

(5)

@tab

@ref{1a4,,pow()}

@item

@code{x ** y}

@tab

`x' 의 `y' 거듭제곱

@tab

(5)

@tab

@end multitable


@geindex operations on;numeric;types
@geindex conjugate() (complex number method)

노트:


@enumerate 

@item 
Also referred to as integer division.  For operands of type @ref{19b,,int},
the result has type @code{int}.  For operands of type @ref{196,,float},
the result has type @code{float}.  In general, the result is a whole
integer, though the result’s type is not necessarily @code{int}.  The result is
always rounded towards minus infinity: @code{1//2} is @code{0}, @code{(-1)//2} is
@code{-1}, @code{1//(-2)} is @code{-1}, and @code{(-1)//(-2)} is @code{0}.

@item 
복소수에는 사용할 수 없습니다. 적절한 경우 @ref{208b,,abs()}를 사용하여 실수로 변환하십시오.

@item 
@geindex module;math
@geindex floor() (in module math)
@geindex ceil() (in module math)
@geindex trunc() (in module math)
@geindex numeric;conversions

Conversion from @ref{196,,float} to @ref{19b,,int} truncates, discarding the
fractional part. See functions @ref{15c2,,math.floor()} and @ref{15c3,,math.ceil()} for
alternative conversions.

@item 
float는 또한 숫자가 아님(NaN)과 양 또는 음의 무한대를 나타내는 문자열 “nan”과 접두사 “+” 나 “-” 가 선택적으로 붙을 수 있는 “inf”를 받아들입니다.

@item 
파이썬은 프로그래밍 언어들에서 흔히 그렇듯이, 있는 것처럼 @code{pow(0, 0)} 와 @code{0 ** 0} 이 @code{1} 이 되도록 정의합니다.

@item 
받아들여지는 숫자 리터럴은 @code{0} 에서 @code{9} 까지 또는 모든 동등한 유니코드들을 (@code{Nd} 속성을 가진 코드 포인트들) 포함합니다.

See the Unicode Standard@footnote{https://unicode.org/Public/UNIDATA/extracted/DerivedNumericType.txt}
for a complete list of code points with the @code{Nd} property.
@end enumerate

모든 @ref{25f3,,numbers.Real} 형 (@ref{19b,,int} 와 @ref{196,,float}) 은 또한 다음과 같은 연산들을 포함합니다:


@multitable {xxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

연산

@tab

결과

@item

@ref{15c4,,math.trunc(x)}

@tab

`x' 는 @ref{240a,,Integral} 로 잘립니다

@item

@ref{14df,,round(x[@comma{} n])}

@tab

`x' 를 `n' 자리로 반올림하는데, 절반 값은 짝수로 반올림합니다. `n' 을 생략하면 기본값은 0입니다.

@item

@ref{15c2,,math.floor(x)}

@tab

가장 큰 @ref{240a,,Integral} <= `x'

@item

@ref{15c3,,math.ceil(x)}

@tab

가장 작은 @ref{240a,,Integral} >= `x'

@end multitable


추가적인 숫자 연산은 @ref{92,,math}와 @ref{19,,cmath} 모듈을 보십시오.

@c XXXJH exceptions: overflow (when? what operations?) zerodivision

@menu
* 정수 형에 대한 비트 연산:: 
* 정수 형에 대한 추가 메서드:: 
* 실수에 대한 추가 메서드:: 
* Additional Methods on Complex:: 
* 숫자 형의 해싱:: 

@end menu

@node 정수 형에 대한 비트 연산,정수 형에 대한 추가 메서드,,숫자 형 — int float complex
@anchor{library/stdtypes bitstring-ops}@anchor{25f4}@anchor{library/stdtypes bitwise-operations-on-integer-types}@anchor{25f5}
@subsubsection 정수 형에 대한 비트 연산


@geindex operations on;integer;types
@geindex bitwise;operations
@geindex shifting;operations
@geindex masking;operations
@geindex operator;| (vertical bar)
@geindex operator;^ (caret)
@geindex operator;& (ampersand)
@geindex operator;<<
@geindex operator;>>
@geindex operator;~ (tilde)

비트 연산은 정수에 대해서만 의미가 있습니다. 비트 연산의 결과는 무한한 부호 비트를 갖는 2의 보수로 수행되는 것처럼 계산됩니다.

이진 비트 연산의 우선순위는 모두 숫자 연산보다 낮고 비교보다 높습니다; 일항 연산 @code{~} 은 다른 일항 연산들 (@code{+} 와 @code{-}) 과 같은 우선순위를 가집니다.

이 표는 비트 연산을 나열하는데, 우선순위에 따라 오름차순으로 정렬되어 있습니다:


@multitable {xxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxx} 
@headitem

연산

@tab

결과

@tab

노트

@item

@code{x | y}

@tab

`x' 와 `y' 의 비트별 `or'

@tab

(4)

@item

@code{x ^ y}

@tab

`x' 와 `y' 의 비트별 `배타적 or (exclusive or)'

@tab

(4)

@item

@code{x & y}

@tab

`x' 와 `y' 의 비트별 `and'

@tab

(4)

@item

@code{x << n}

@tab

`x' 를 `n' 비트만큼 왼쪽으로 시프트

@tab

(1)(2)

@item

@code{x >> n}

@tab

`x' 를 `n' 비트만큼 오른쪽으로 시프트

@tab

(1)(3)

@item

@code{~x}

@tab

`x' 의 비트 반전

@tab

@end multitable


노트:


@enumerate 

@item 
음의 시프트 수는 허락되지 않고 @ref{2ec,,ValueError} 를 일으킵니다.

@item 
`n' 비트만큼의 왼쪽 시프트는 @code{pow(2, n)} 를 곱하는 것과 동등합니다.

@item 
`n' 비트만큼 오른쪽으로 시프트 하는 것은 @code{pow(2, n)} 로 정수 나눗셈(floor division)하는 것과 동등합니다.

@item 
무한한 부호 비트가 있는 것과 같은 결과를 얻으려면, 유한한 2의 보수 표현으로 적어도 하나의 추가적인 부호 확장 비트를 사용하여 (@code{1 + max(x.bit_length(), y.bit_length())} 이상의 작업 비트 폭) 이러한 계산을 수행하는 것으로 충분합니다.
@end enumerate

@node 정수 형에 대한 추가 메서드,실수에 대한 추가 메서드,정수 형에 대한 비트 연산,숫자 형 — int float complex
@anchor{library/stdtypes additional-methods-on-integer-types}@anchor{25f6}
@subsubsection 정수 형에 대한 추가 메서드


int 형은 @ref{240a,,numbers.Integral} @ref{13bb,,추상 베이스 클래스} 를 구현합니다. 또한, 몇 가지 메서드를 더 제공합니다:

@geindex bit_length() (int 메서드)
@anchor{library/stdtypes int bit_length}@anchor{25f7}
@deffn {메서드} int.bit_length ()

부호와 선행 0을 제외하고, 이진수로 정수를 나타내는 데 필요한 비트 수를 돌려줍니다:

@example
>>> n = -37
>>> bin(n)
'-0b100101'
>>> n.bit_length()
6
@end example

좀 더 정확하게 말하자면, @code{x} 가 0이 아니면, @code{x.bit_length()} 는 @code{2**(k-1) <= abs(x) < 2**k} 를 만족하는 유일한 양의 정수 @code{k} 입니다. 동등하게, @code{abs(x)} 가 정확하게 반올림된 로그값을 가질 만큼 아주 작으면, @code{k = 1 + int(log(abs(x), 2))} 가 됩니다. @code{x} 가 0이면, @code{x.bit_length()} 는 @code{0} 을 돌려줍니다.

다음 코드와 동등합니다:

@example
def bit_length(self):
    s = bin(self)       # binary representation:  bin(-37) --> '-0b100101'
    s = s.lstrip('-0b') # remove leading zeros and minus sign
    return len(s)       # len('100101') --> 6
@end example


Added in version 3.1.

@end deffn

@geindex bit_count() (int 메서드)
@anchor{library/stdtypes int bit_count}@anchor{9cf}
@deffn {메서드} int.bit_count ()

Return the number of ones in the binary representation of the absolute
value of the integer. This is also known as the population count.
Example:

@example
>>> n = 19
>>> bin(n)
'0b10011'
>>> n.bit_count()
3
>>> (-n).bit_count()
3
@end example

다음 코드와 동등합니다:

@example
def bit_count(self):
    return bin(self).count("1")
@end example


Added in version 3.10.

@end deffn

@geindex to_bytes() (int 메서드)
@anchor{library/stdtypes int to_bytes}@anchor{1c30}
@deffn {메서드} int.to_bytes (length=1, byteorder='big', *, signed=False)

정수를 나타내는 바이트의 배열을 돌려줍니다.

@example
>>> (1024).to_bytes(2, byteorder='big')
b'\x04\x00'
>>> (1024).to_bytes(10, byteorder='big')
b'\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00'
>>> (-1024).to_bytes(10, byteorder='big', signed=True)
b'\xff\xff\xff\xff\xff\xff\xff\xff\xfc\x00'
>>> x = 1000
>>> x.to_bytes((x.bit_length() + 7) // 8, byteorder='little')
b'\xe8\x03'
@end example

The integer is represented using `length' bytes, and defaults to 1.  An
@ref{a81,,OverflowError} is raised if the integer is not representable with
the given number of bytes.

The `byteorder' argument determines the byte order used to represent the
integer, and defaults to @code{"big"}.  If `byteorder' is
@code{"big"}, the most significant byte is at the beginning of the byte
array.  If `byteorder' is @code{"little"}, the most significant byte is at
the end of the byte array.

`signed' 인자는 정수를 표현하는데 2의 보수가 사용되는지를 결정합니다. `signed' 가 @code{False} 이고 음의 정수가 주어지면, @ref{a81,,OverflowError} 가 일어납니다. `signed' 의 기본값은 @code{False} 입니다.

The default values can be used to conveniently turn an integer into a
single byte object:

@example
>>> (65).to_bytes()
b'A'
@end example

However, when using the default arguments, don’t try
to convert a value greater than 255 or you’ll get an @ref{a81,,OverflowError}.

다음 코드와 동등합니다:

@example
def to_bytes(n, length=1, byteorder='big', signed=False):
    if byteorder == 'little':
        order = range(length)
    elif byteorder == 'big':
        order = reversed(range(length))
    else:
        raise ValueError("byteorder must be either 'little' or 'big'")

    return bytes((n >> i*8) & 0xff for i in order)
@end example


Added in version 3.2.



버전 3.11에서 변경: Added default argument values for @code{length} and @code{byteorder}.

@end deffn

@geindex from_bytes() (int의 클래스 메서드)
@anchor{library/stdtypes int from_bytes}@anchor{1be7}
@deffn {메서드} classmethod int.from_bytes (bytes, byteorder='big', *, signed=False)

주어진 바이트 배열로 표현되는 정수를 돌려줍니다.

@example
>>> int.from_bytes(b'\x00\x10', byteorder='big')
16
>>> int.from_bytes(b'\x00\x10', byteorder='little')
4096
>>> int.from_bytes(b'\xfc\x00', byteorder='big', signed=True)
-1024
>>> int.from_bytes(b'\xfc\x00', byteorder='big', signed=False)
64512
>>> int.from_bytes([255, 0, 0], byteorder='big')
16711680
@end example

인자 `bytes' 는 @ref{193,,바이트열류 객체} 이거나 바이트를 생성하는 이터러블이어야 합니다.

The `byteorder' argument determines the byte order used to represent the
integer, and defaults to @code{"big"}.  If `byteorder' is
@code{"big"}, the most significant byte is at the beginning of the byte
array.  If `byteorder' is @code{"little"}, the most significant byte is at
the end of the byte array.  To request the native byte order of the host
system, use @ref{25f8,,sys.byteorder} as the byte order value.

`signed' 인자는 정수를 표현하는데 2의 보수가 사용되는지를 나타냅니다.

다음 코드와 동등합니다:

@example
def from_bytes(bytes, byteorder='big', signed=False):
    if byteorder == 'little':
        little_ordered = list(bytes)
    elif byteorder == 'big':
        little_ordered = list(reversed(bytes))
    else:
        raise ValueError("byteorder must be either 'little' or 'big'")

    n = sum(b << i*8 for i, b in enumerate(little_ordered))
    if signed and little_ordered and (little_ordered[-1] & 0x80):
        n -= 1 << 8*len(little_ordered)

    return n
@end example


Added in version 3.2.



버전 3.11에서 변경: Added default argument value for @code{byteorder}.

@end deffn

@geindex as_integer_ratio() (int 메서드)
@anchor{library/stdtypes int as_integer_ratio}@anchor{bbf}
@deffn {메서드} int.as_integer_ratio ()

Return a pair of integers whose ratio is equal to the original
integer and has a positive denominator.  The integer ratio of integers
(whole numbers) is always the integer as the numerator and @code{1} as the
denominator.


Added in version 3.8.

@end deffn

@geindex is_integer() (int 메서드)
@anchor{library/stdtypes int is_integer}@anchor{1ae9}
@deffn {메서드} int.is_integer ()

Returns @code{True}. Exists for duck type compatibility with @ref{25f9,,float.is_integer()}.


Added in version 3.12.

@end deffn

@node 실수에 대한 추가 메서드,Additional Methods on Complex,정수 형에 대한 추가 메서드,숫자 형 — int float complex
@anchor{library/stdtypes additional-methods-on-float}@anchor{25fa}
@subsubsection 실수에 대한 추가 메서드


float 형은 @ref{25f3,,numbers.Real} @ref{13bb,,추상 베이스 클래스} 를 구현합니다. 또한, float는 다음과 같은 추가 메서드를 갖습니다.

@geindex from_number() (float의 클래스 메서드)
@anchor{library/stdtypes float from_number}@anchor{194}
@deffn {메서드} classmethod float.from_number (x)

Class method to return a floating-point number constructed from a number `x'.

If the argument is an integer or a floating-point number, a
floating-point number with the same value (within Python’s floating-point
precision) is returned.  If the argument is outside the range of a Python
float, an @ref{a81,,OverflowError} will be raised.

For a general Python object @code{x}, @code{float.from_number(x)} delegates to
@code{x.__float__()}.
If @ref{bc0,,__float__()} is not defined then it falls back
to @ref{19e,,__index__()}.


Added in version 3.14.

@end deffn

@geindex as_integer_ratio() (float 메서드)
@anchor{library/stdtypes float as_integer_ratio}@anchor{20ff}
@deffn {메서드} float.as_integer_ratio ()

Return a pair of integers whose ratio is exactly equal to the
original float. The ratio is in lowest terms and has a positive denominator.  Raises
@ref{a81,,OverflowError} on infinities and a @ref{2ec,,ValueError} on
NaNs.
@end deffn

@geindex is_integer() (float 메서드)
@anchor{library/stdtypes float is_integer}@anchor{25f9}
@deffn {메서드} float.is_integer ()

float 인스턴스가 정숫값을 가진 유한이면 @code{True} 를, 그렇지 않으면 @code{False} 를 돌려줍니다:

@example
>>> (-2.0).is_integer()
True
>>> (3.2).is_integer()
False
@end example
@end deffn

두 가지 메서드가 16진수 문자열과의 변환을 지원합니다. 파이썬의 float는 내부적으로 이진수로 저장되기 때문에 float를 `십진수' 문자열로 또는 그 반대로 변환하는 것은 보통 반올림 오류를 수반합니다. 이에 반해, 16진수 문자열은 부동 소수점 숫자의 정확한 표현과 지정을 가능하게 합니다. 이것은 디버깅 및 수치 작업에 유용할 수 있습니다.

@geindex hex() (float 메서드)
@anchor{library/stdtypes float hex}@anchor{2100}
@deffn {메서드} float.hex ()

부동 소수점의 16진수 문자열 표현을 돌려줍니다. 유한 부동 소수점의 경우, 이 표현은 항상 선행하는 @code{0x} 와 후행하는 @code{p} 와 지수를 포함합니다.
@end deffn

@geindex fromhex() (float의 클래스 메서드)
@anchor{library/stdtypes float fromhex}@anchor{25fb}
@deffn {메서드} classmethod float.fromhex (s)

16진수 문자열 `s' 로 표현되는 float를 돌려주는 클래스 메서드. 문자열 `s' 는 앞뒤 공백을 가질 수 있습니다.
@end deffn

@ref{2100,,float.hex()} 는 인스턴스 메서드인 반면, @ref{25fb,,float.fromhex()} 는 클래스 메서드임에 주의하세요.

16진수 문자열은 다음과 같은 형식을 취합니다:

@example
[sign] ['0x'] integer ['.' fraction] ['p' exponent]
@end example

선택적인 @code{sign} 은 @code{+} 나 @code{-} 가 될 수 있고, @code{integer} 와 @code{fraction} 은 16진수 문자열이고, @code{exponent} 는 선택적인 선행 부호가 붙을 수 있는 십진수입니다. 대소 문자는 중요하지 않으며 integer 나 fraction 중 어느 하나에 적어도 하나의 16진수가 있어야 합니다. 이 문법은 C99 표준의 6.4.4.2 절에 지정된 문법과 비슷하며, 자바 1.5 이상에서 사용되는 문법과도 비슷합니다. 특히, @ref{2100,,float.hex()} 의 출력은 C 또는 자바 코드에서 16진수의 부동 소수점 리터럴로 사용할 수 있으며, C의 @code{%a} 포맷 문자나 자바의 @code{Double.toHexString} 가 만들어내는 16진수 문자열은 @ref{25fb,,float.fromhex()} 가 받아들입니다.

지수는 16진수가 아닌 십진수로 쓰이고, 숫자에 곱해지는 2의 거듭제곱을 제공한다는 점에 유의하십시오. 예를 들어, 16진수 문자열 @code{0x3.a7p10} 는 부동 소수점 숫자 @code{(3 + 10./16 + 7./16**2) * 2.0**10} 또는 @code{3740.0} 를 나타냅니다:

@example
>>> float.fromhex('0x3.a7p10')
3740.0
@end example

@code{3740.0} 에 역변환을 적용하면 같은 숫자를 나타내는 다른 16진수 문자열을 얻을 수 있습니다:

@example
>>> float.hex(3740.0)
'0x1.d380000000000p+11'
@end example

@node Additional Methods on Complex,숫자 형의 해싱,실수에 대한 추가 메서드,숫자 형 — int float complex
@anchor{library/stdtypes additional-methods-on-complex}@anchor{25fc}
@subsubsection Additional Methods on Complex


The @code{complex} type implements the @ref{25fd,,numbers.Complex}
@ref{13bb,,abstract base class}.
@code{complex} also has the following additional methods.

@geindex from_number() (complex의 클래스 메서드)
@anchor{library/stdtypes complex from_number}@anchor{195}
@deffn {메서드} classmethod complex.from_number (x)

Class method to convert a number to a complex number.

For a general Python object @code{x}, @code{complex.from_number(x)} delegates to
@code{x.__complex__()}.  If @ref{7fc,,__complex__()} is not defined then it falls back
to @ref{bc0,,__float__()}.  If @code{__float__()} is not defined then it falls back
to @ref{19e,,__index__()}.


Added in version 3.14.

@end deffn

@node 숫자 형의 해싱,,Additional Methods on Complex,숫자 형 — int float complex
@anchor{library/stdtypes hashing-of-numeric-types}@anchor{25fe}@anchor{library/stdtypes numeric-hash}@anchor{25ff}
@subsubsection 숫자 형의 해싱


For numbers @code{x} and @code{y}, possibly of different types, it’s a requirement
that @code{hash(x) == hash(y)} whenever @code{x == y} (see the @ref{cf2,,__hash__()}
method documentation for more details).  For ease of implementation and
efficiency across a variety of numeric types (including @ref{19b,,int},
@ref{196,,float}, @ref{1fe,,decimal.Decimal} and @ref{213,,fractions.Fraction})
Python’s hash for numeric types is based on a single mathematical function
that’s defined for any rational number, and hence applies to all instances of
@code{int} and @code{fractions.Fraction}, and all finite instances of
@code{float} and @code{decimal.Decimal}.  Essentially, this function is
given by reduction modulo @code{P} for a fixed prime @code{P}.  The value of @code{P} is
made available to Python as the @ref{2600,,modulus} attribute of
@ref{11fe,,sys.hash_info}.

현재, 사용되는 소수는 32-비트 C long을 가진 기계에서는 @code{P = 2**31 - 1} 이고, 64-비트 C long을 가진 기계에서는 @code{P = 2**61 - 1} 입니다.

다음은 규칙에 대한 세부 사항입니다:


@itemize -

@item 
@code{x = m / n} 이 음이 아닌 유리수이고 @code{n} 이 @code{P} 로 나뉘지 않는다면, @code{hash(x)} 를 @code{m * invmod(n, P) % P} 로 정의합니다. 여기서 @code{invmod(n, P)} 는 @code{n} 의 모듈로 @code{P} 역수를 줍니다.

@item 
@code{x = m / n} 이 음이 아닌 유리수이고 @code{n} 이 @code{P} 나뉘면 (하지만 @code{m} 은 나뉘지 않으면) @code{n} 은 모듈로 @code{P} 역수를 가지지 않고 위의 규칙은 적용되지 않습니다; 이 경우 @code{hash(x)} 를 상숫값 @code{sys.hash_info.inf} 로 정의합니다.

@item 
@code{x = m / n} 이 음의 유리수이면 @code{hash(x)} 를 @code{-hash(-x)} 로 정의합니다. 얻어진 해시가 @code{-1} 이면 @code{-2} 로 바꿉니다.

@item 
The particular values @code{sys.hash_info.inf} and @code{-sys.hash_info.inf}
are used as hash values for positive
infinity or negative infinity (respectively).

@item 
복소수(@ref{197,,complex}) @code{z} 의 경우, @code{hash(z.real) + sys.hash_info.imag * hash(z.imag)} 를 계산하여 실수부와 허수부의 해시값을 결합하는데, @code{2**sys.hash_info.width} 의 모듈로로 환원해서 @code{range(-2**(sys.hash_info.width - 1), 2**(sys.hash_info.width - 1))} 범위에 들어가도록 만듭니다. 다시 한번, 결과가 @code{-1} 이라면 @code{-2} 로 바꿉니다.
@end itemize

위의 규칙을 명확히 하기 위해, 여기에 유리수, @ref{196,,float}, @ref{197,,complex} 의 해시를 계산하는, 내장 해시와 동등한, 파이썬 코드를 예시합니다:

@example
import sys, math

def hash_fraction(m, n):
    """Compute the hash of a rational number m / n.

    Assumes m and n are integers, with n positive.
    Equivalent to hash(fractions.Fraction(m, n)).

    """
    P = sys.hash_info.modulus
    # Remove common factors of P.  (Unnecessary if m and n already coprime.)
    while m % P == n % P == 0:
        m, n = m // P, n // P

    if n % P == 0:
        hash_value = sys.hash_info.inf
    else:
        # Fermat's Little Theorem: pow(n, P-1, P) is 1, so
        # pow(n, P-2, P) gives the inverse of n modulo P.
        hash_value = (abs(m) % P) * pow(n, P - 2, P) % P
    if m < 0:
        hash_value = -hash_value
    if hash_value == -1:
        hash_value = -2
    return hash_value

def hash_float(x):
    """Compute the hash of a float x."""

    if math.isnan(x):
        return object.__hash__(x)
    elif math.isinf(x):
        return sys.hash_info.inf if x > 0 else -sys.hash_info.inf
    else:
        return hash_fraction(*x.as_integer_ratio())

def hash_complex(z):
    """Compute the hash of a complex number z."""

    hash_value = hash_float(z.real) + sys.hash_info.imag * hash_float(z.imag)
    # do a signed reduction modulo 2**sys.hash_info.width
    M = 2**(sys.hash_info.width - 1)
    hash_value = (hash_value & (M - 1)) - (hash_value & M)
    if hash_value == -1:
        hash_value = -2
    return hash_value
@end example
@anchor{library/stdtypes bltin-boolean-values}@anchor{2601}
@node Boolean Type - bool,이터레이터 형,숫자 형 — int float complex,내장형
@anchor{library/stdtypes boolean-type-bool}@anchor{2602}@anchor{library/stdtypes typebool}@anchor{25c1}
@subsection Boolean Type - @code{bool}


Booleans represent truth values. The @ref{3c3,,bool} type has exactly two
constant instances: @code{True} and @code{False}.

@geindex False
@geindex True
@geindex Boolean;values

The built-in function @ref{3c3,,bool()}  converts any value to a boolean, if the
value can be interpreted as a truth value (see section @ref{185b,,논리값 검사} above).

For logical operations, use the @ref{25ee,,boolean operators} @code{and},
@code{or} and @code{not}.
When applying the bitwise operators @code{&}, @code{|}, @code{^} to two booleans, they
return a bool equivalent to the logical operations “and”, “or”, “xor”. However,
the logical operators @code{and}, @code{or} and @code{!=} should be preferred
over @code{&}, @code{|} and @code{^}.


버전 3.12부터 폐지됨: The use of the bitwise inversion operator @code{~} is deprecated and will
raise an error in Python 3.16.


@ref{3c3,,bool} is a subclass of @ref{19b,,int} (see @ref{1fd8,,숫자 형 — int@comma{} float@comma{} complex}). In
many numeric contexts, @code{False} and @code{True} behave like the integers 0 and 1, respectively.
However, relying on this is discouraged; explicitly convert using @ref{19b,,int()}
instead.

@node 이터레이터 형,시퀀스 형 — list tuple range,Boolean Type - bool,내장형
@anchor{library/stdtypes iterator-types}@anchor{2603}@anchor{library/stdtypes typeiter}@anchor{25d7}
@subsection 이터레이터 형


@geindex iterator protocol
@geindex protocol;iterator
@geindex sequence;iteration
@geindex container;iteration over

파이썬은 컨테이너에 대한 이터레이션 개념을 지원합니다. 이것은 두 개의 메서드를 사용해서 구현됩니다; 이것들은 사용자 정의 클래스가 이터레이션을 지원할 수 있도록 하는 데 사용됩니다. 아래에서 더 자세히 설명할 시퀀스는 항상 이터레이션 메서드를 지원합니다.

One method needs to be defined for container objects to provide @ref{142c,,iterable}
support:

@c XXX duplicated in reference/datamodel!

@geindex __iter__() (container 메서드)
@anchor{library/stdtypes container __iter__}@anchor{20a8}
@deffn {메서드} container.__iter__ ()

Return an @ref{4ca,,iterator} object.  The object is required to support the
iterator protocol described below.  If a container supports different types
of iteration, additional methods can be provided to specifically request
iterators for those iteration types.  (An example of an object supporting
multiple forms of iteration would be a tree structure which supports both
breadth-first and depth-first traversal.)  This method corresponds to the
@ref{16f4,,tp_iter} slot of the type structure for Python
objects in the Python/C API.
@end deffn

이터레이터 객체 자체는 다음과 같은 두 가지 메서드를 지원해야 하는데, 둘이 함께 `이터레이터 프로토콜 (iterator protocol)' 를 이룹니다.:

@geindex __iter__() (iterator 메서드)
@anchor{library/stdtypes iterator __iter__}@anchor{20ab}
@deffn {메서드} iterator.__iter__ ()

Return the @ref{4ca,,iterator} object itself.  This is required to allow both
containers and iterators to be used with the @ref{34a,,for} and
@ref{34b,,in} statements.  This method corresponds to the
@ref{16f4,,tp_iter} slot of the type structure for Python
objects in the Python/C API.
@end deffn

@geindex __next__() (iterator 메서드)
@anchor{library/stdtypes iterator __next__}@anchor{14d2}
@deffn {메서드} iterator.__next__ ()

Return the next item from the @ref{4ca,,iterator}.  If there are no further
items, raise the @ref{df4,,StopIteration} exception.  This method corresponds to
the @ref{16f5,,tp_iternext} slot of the type structure for
Python objects in the Python/C API.
@end deffn

파이썬은 일반적이거나 특정한 시퀀스 형, 딕셔너리, 기타 더 특화된 형태에 대한 이터레이션을 지원하기 위해 여러 이터레이터 객체를 정의합니다. 이터레이터 프로토콜의 구현을 넘어서 개별적인 형이 중요하지는 않습니다.

일단 이터레이터의 @ref{14d2,,__next__()} 메서드가 @ref{df4,,StopIteration} 를 일으키면, 그 이후의 호출에 대해서도 같이 동작해야 합니다. 이 속성을 따르지 않는 구현은 망가진 것으로 간주합니다.

@menu
* 제너레이터 형:: 

@end menu

@node 제너레이터 형,,,이터레이터 형
@anchor{library/stdtypes generator-types}@anchor{2604}@anchor{library/stdtypes id3}@anchor{2605}
@subsubsection 제너레이터 형


Python’s @ref{1260,,generator}s provide a convenient way to implement the iterator
protocol.  If a container object’s @ref{e68,,__iter__()} method is implemented as a
generator, it will automatically return an iterator object (technically, a
generator object) supplying the @ref{20ab,,__iter__()} and @ref{20ac,,__next__()}
methods.
More information about generators can be found in @ref{2498,,the documentation for the yield expression}.

@node 시퀀스 형 — list tuple range,Text and Binary Sequence Type Methods Summary,이터레이터 형,내장형
@anchor{library/stdtypes sequence-types-list-tuple-range}@anchor{2606}@anchor{library/stdtypes typesseq}@anchor{202c}
@subsection 시퀀스 형 — @code{list}, @code{tuple}, @code{range}


세 가지 기본 시퀀스 형이 있습니다: 리스트, 튜플, 범위 객체. @ref{25c4,,바이너리 데이터} 와 @ref{1fdd,,텍스트 문자열} 의 처리를 위해 추가된 시퀀스 형들은 별도의 섹션에서 설명합니다.

@menu
* 공통 시퀀스 연산:: 
* 불변 시퀀스 형:: 
* 가변 시퀀스 형:: 
* 리스트: 리스트<2>. 
* 튜플:: 
* 범위:: 

@end menu

@node 공통 시퀀스 연산,불변 시퀀스 형,,시퀀스 형 — list tuple range
@anchor{library/stdtypes common-sequence-operations}@anchor{2607}@anchor{library/stdtypes typesseq-common}@anchor{2608}
@subsubsection 공통 시퀀스 연산


@geindex object;sequence

다음 표의 연산들은 대부분의 가변과 불변 시퀀스에서 지원됩니다. 사용자 정의 시퀀스에서 이 연산들을 올바르게 구현하기 쉽게 하려고 @ref{13c9,,collections.abc.Sequence} ABC가 제공됩니다.

이 표는 우선순위에 따라 오름차순으로 시퀀스 연산들을 나열합니다. 표에서, `s' 와 `t' 는 같은 형의 시퀀스고, `n', `i', `j', `k' 는 정수이고, `x' 는 `s' 가 요구하는 형과 값 제한을 만족하는 임의의 객체입니다.

@code{in} 과 @code{not in} 연산은 비교 연산과 우선순위가 같습니다. @code{+} (이어 붙이기)와 @code{*} (반복) 연산은 대응하는 숫자 연산과 같은 우선순위를 갖습니다. @footnote{
파서가 피연산자 유형을 알 수 없으므로 그럴 수밖에 없습니다.
}

@geindex operations on;sequence;types
@geindex built-in function;len
@geindex built-in function;min
@geindex built-in function;max
@geindex concatenation;operation
@geindex repetition;operation
@geindex subscript;operation
@geindex slice;operation
@geindex operator;in
@geindex operator;not in


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxx} 
@headitem

연산

@tab

결과

@tab

노트

@item

@code{x in s}

@tab

`s' 의 항목 중 하나가 `x' 와 같으면 @code{True}, 그렇지 않으면 @code{False}

@tab

(1)

@item

@code{x not in s}

@tab

`s' 의 항목 중 하나가 `x' 와 같으면 @code{False}, 그렇지 않으면 @code{True}

@tab

(1)

@item

@code{s + t}

@tab

`s' 와 `t' 의 이어 붙이기

@tab

(6)(7)

@item

@code{s * n} 또는 @code{n * s}

@tab

`s' 를 그 자신에 `n' 번 더하는 것과 같습니다

@tab

(2)(7)

@item

@code{s[i]}

@tab

`s' 의 `i' 번째 항목, 0에서 시작합니다

@tab

(3)(8)

@item

@code{s[i:j]}

@tab

`s' 의 `i' 에서 `j' 까지의 슬라이스

@tab

(3)(4)

@item

@code{s[i:j:k]}

@tab

`s' 의 `i' 에서 `j' 까지 스텝 `k' 의 슬라이스

@tab

(3)(5)

@item

@code{len(s)}

@tab

`s' 의 길이

@tab

@item

@code{min(s)}

@tab

`s' 의 가장 작은 항목

@tab

@item

@code{max(s)}

@tab

`s' 의 가장 큰 항목

@tab

@end multitable


같은 형의 시퀀스는 비교를 지원합니다. 특히, 튜플과 리스트는 대응하는 항목들을 사전적으로 비교합니다. 이것은 같다고 비교되기 위해서는, 모든 항목이 같다고 비교되고, 두 시퀀스의 형과 길이가 같아야 함을 의미합니다. (자세한 내용은 언어 레퍼런스의 @ref{24d0,,비교}를 참조하십시오.)

@geindex loop;over mutable sequence
@geindex mutable sequence;loop over

Forward and reversed iterators over mutable sequences access values using an
index.  That index will continue to march forward (or backward) even if the
underlying sequence is mutated.  The iterator terminates only when an
@ref{173a,,IndexError} or a @ref{df4,,StopIteration} is encountered (or when the index
drops below zero).

노트:


@enumerate 

@item 
@code{in} 과 @code{not in} 연산은 일반적으로 단순한 포함 검사를 위해서만 사용되지만, 몇몇 특수한 시퀀스 (@ref{169,,str}, @ref{192,,bytes}, @ref{344,,bytearray} 같은) 들은 서브 시퀀스 검사에 사용하기도 합니다:

@example
>>> "gg" in "eggs"
True
@end example

@item 
`n' 의 값이 @code{0} 보다 작으면 @code{0} 으로 처리됩니다 (`s' 와 같은 형의 빈 시퀀스가 됩니다). 시퀀스 `s' 의 항목들이 복사되지 않음에 주의해야 합니다; 그들은 여러 번 참조됩니다. 이것은 종종 새 파이썬 프로그래머들을 괴롭힙니다; 이 코드를 살펴보세요:

@example
>>> lists = [[]] * 3
>>> lists
[[], [], []]
>>> lists[0].append(3)
>>> lists
[[3], [3], [3]]
@end example

무슨 일이 일어났는가 하면, @code{[[]]} 는 빈 리스트를 포함하는 길이 1인 리스트인데, @code{[[]] * 3} 의 세 항목은 모두 같은 빈 리스트를 참조합니다. @code{lists} 의 어느 항목을 수정하더라도 이 하나의 리스트를 수정하게 됩니다. 서로 다른 리스트들을 포함하는 리스트는 이런 식으로 만들 수 있습니다:

@example
>>> lists = [[] for i in range(3)]
>>> lists[0].append(3)
>>> lists[1].append(5)
>>> lists[2].append(7)
>>> lists
[[3], [5], [7]]
@end example

더 자세한 설명은 FAQ 항목 @ref{2609,,다차원 리스트를 어떻게 만듭니까?}에서 얻을 수 있습니다.

@item 
`i' 또는 `j' 가 음수인 경우, 인덱스는 시퀀스 `s' 의 끝에 상대적입니다: @code{len(s) + i} 이나 @code{len(s) + j} 로 치환됩니다. 하지만 @code{-0} 은 여전히 @code{0} 입니다.

@item 
The slice of `s' from `i' to `j' is defined as the sequence of items with
index `k' such that @code{i <= k < j}.


@itemize *

@item 
If `i' is omitted or @code{None}, use @code{0}.

@item 
If `j' is omitted or @code{None}, use @code{len(s)}.

@item 
If `i' or `j' is less than @code{-len(s)}, use @code{0}.

@item 
If `i' or `j' is greater than @code{len(s)}, use @code{len(s)}.

@item 
If `i' is greater than or equal to `j', the slice is empty.
@end itemize

@item 
스텝 `k' 가 있는 `i' 에서 `j' 까지의 슬라이스는 @code{0 <= n < (j-i)/k} 를 만족하는 인덱스 @code{x = i + n*k} 의 항목들로 구성된 시퀀스로 정의됩니다. 다시 말하면, 인덱스는 @code{i}, @code{i+k}, @code{i+2*k}, @code{i+3*k} 등이며 `j' 에 도달할 때 멈춥니다 (하지만 절대 `j' 를 포함하지는 않습니다). `k' 가 양수면 `i' 와 `j' 는 더 큰 경우 @code{len(s)} 로 줄어듭니다. `k' 가 음수면, `i' 와 `j' 는 더 큰 경우 @code{len(s) - 1} 로 줄어듭니다. `i' 또는 `j' 가 생략되거나 @code{None} 이면, 그것들은 “끝” 값이 됩니다 (끝은 `k' 의 부호에 따라 달라집니다). `k' 는 0일 수 없음에 주의하세요. `k' 가 @code{None} 이면 @code{1} 로 취급됩니다.

@item 
불변 시퀀스를 이어 붙이면 항상 새로운 객체가 생성됩니다. 이것은 반복적으로 이어붙이기를 해서 시퀀스를 만들 때 실행 시간이 시퀀스의 총 길이의 제곱에 비례한다는 뜻입니다. 선형 실행 시간 비용을 얻으려면 아래 대안 중 하나로 전환해야 합니다:


@itemize *

@item 
@ref{169,,str} 객체를 이어붙이기를 한다면, 리스트를 만들고 마지막에 @ref{260a,,str.join()} 을 사용하거나 @ref{1128,,io.StringIO} 인스턴스에 쓰고 완료될 때 값을 꺼낼 수 있습니다

@item 
@ref{192,,bytes} 객체를 연결하는 경우 비슷하게 @ref{260b,,bytes.join()} 또는 @ref{10a3,,io.BytesIO} 를 사용하거나, @ref{344,,bytearray} 객체를 사용하여 제자리에서 이어붙이기를 할 수 있습니다. @code{bytearray} 객체는 가변이고 효율적인 과할당(overallocation) 메커니즘을 가지고 있습니다.

@item 
@ref{610,,tuple} 객체를 이어붙이기를 한다면, 대신 @ref{24d,,list}를 extend 하십시오.

@item 
다른 형의 경우 관련 클래스 문서를 조사하십시오.
@end itemize

@item 
일부 시퀀스 형 (예를 들어 @ref{b3d,,range})은 특정 패턴을 따르는 항목 시퀀스 만 지원하기 때문에 시퀀스 이어붙이기나 반복을 지원하지 않습니다.

@item 
An @ref{173a,,IndexError} is raised if `i' is outside the sequence range.
@end enumerate

@subsubheading Sequence Methods


Sequence types also support the following methods:


@geindex count() (sequence 메서드)
@anchor{library/stdtypes list count}@anchor{15ca}@anchor{library/stdtypes sequence count}@anchor{23d8}
@deffn {메서드} sequence.count (value, /)

Return the total number of occurrences of `value' in `sequence'.
@end deffn


@geindex index() (sequence 메서드)
@anchor{library/stdtypes list index}@anchor{15c9}@anchor{library/stdtypes sequence index}@anchor{197a}
@deffn {메서드} sequence.index (value[, start[, stop]])

Return the index of the first occurrence of `value' in `sequence'.

Raises @ref{2ec,,ValueError} if `value' is not found in `sequence'.

The `start' or `stop' arguments allow for efficient searching
of subsections of the sequence, beginning at `start' and ending at `stop'.
This is roughly equivalent to @code{start + sequence[start:stop].index(value)},
only without copying any data.

@cartouche
@quotation 조심 
Not all sequence types support passing the `start' and `stop' arguments.
@end quotation
@end cartouche
@end deffn

@node 불변 시퀀스 형,가변 시퀀스 형,공통 시퀀스 연산,시퀀스 형 — list tuple range
@anchor{library/stdtypes immutable-sequence-types}@anchor{260c}@anchor{library/stdtypes typesseq-immutable}@anchor{260d}
@subsubsection 불변 시퀀스 형


@geindex immutable;sequence;types
@geindex object;tuple
@geindex built-in function;hash

불변 시퀀스 형이 일반적으로 구현하지만, 가변 시퀀스 형에서는 구현되지 않는 연산은 내장 @ref{800,,hash()} 에 대한 지원입니다.

이 지원은 @ref{610,,tuple} 인스턴스와 같은 불변 시퀀스를 @ref{183,,dict} 키로 사용하고 @ref{184,,set} 및 @ref{7f1,,frozenset} 인스턴스에 저장할 수 있도록 합니다.

해시 불가능 값을 포함하는 불변 시퀀스를 해시 하려고 하면 @ref{198,,TypeError} 를 일으킵니다.

@node 가변 시퀀스 형,리스트<2>,불변 시퀀스 형,시퀀스 형 — list tuple range
@anchor{library/stdtypes mutable-sequence-types}@anchor{260e}@anchor{library/stdtypes typesseq-mutable}@anchor{25c3}
@subsubsection 가변 시퀀스 형


@geindex mutable;sequence;types
@geindex object;list
@geindex object;bytearray

다음 표의 연산들은 가변 시퀀스 형에 정의되어 있습니다. 사용자 정의 시퀀스에서 이 연산들을 올바르게 구현하기 쉽게 하려고 @ref{4c1,,collections.abc.MutableSequence} ABC가 제공됩니다.

표에서 `s' 는 가변 시퀀스 형의 인스턴스이고, `t' 는 임의의 이터러블 객체이며, `x' 는 `s' 가 요구하는 형 및 값 제한을 충족시키는 임의의 객체입니다 (예를 들어, @ref{344,,bytearray} 는 값 제한 @code{0 <= x <= 255} 를 만족하는 정수만 받아들입니다.

@geindex operations on;sequence;types
@geindex operations on;list;type
@geindex subscript;assignment
@geindex slice;assignment
@geindex statement;del


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

연산

@tab

결과

@tab

노트

@item

@code{s[i] = x}

@tab

`s' 의 항목 `i' 를 `x' 로 대체합니다

@tab

@item

@code{del s[i]}

@tab

removes item `i' of `s'

@tab

@item

@code{s[i:j] = t}

@tab

`i' 에서 `j' 까지의 `s' 슬라이스가 이터러블 `t' 의 내용으로 대체됩니다

@tab

@item

@code{del s[i:j]}

@tab

removes the elements of
@code{s[i:j]} from the list
(same as @code{s[i:j] = []})

@tab

@item

@code{s[i:j:k] = t}

@tab

@code{s[i:j:k]} 의 항목들이 `t' 의 항목들로 대체됩니다

@tab

(1)

@item

@code{del s[i:j:k]}

@tab

리스트에서 @code{s[i:j:k]} 의 항목들을 제거합니다

@tab

@item

@code{s += t}

@tab

`t' 의 내용으로 `s' 를 확장합니다 (대부분 @code{s[len(s):len(s)] = t} 와 같습니다)

@tab

@item

@code{s *= n}

@tab

내용이 `n' 번 반복되도록 `s' 를 갱신합니다

@tab

(2)

@end multitable


노트:


@enumerate 

@item 
If `k' is not equal to @code{1}, `t' must have the same length as the slice it is replacing.

@item 
`n' 값은 정수이거나, @ref{19e,,__index__()} 를 구현하는 객체입니다. `n' 이 0 이거나 음수면 시퀀스를 지웁니다. 시퀀스의 항목들은 복사되지 않습니다; @ref{2608,,공통 시퀀스 연산}에서 @code{s * n} 를 위해 설명한 것처럼 여러 번 참조됩니다.
@end enumerate

@subsubheading Mutable Sequence Methods


Mutable sequence types also support the following methods:


@geindex append() (sequence 메서드)
@anchor{library/stdtypes bytearray append}@anchor{15aa}@anchor{library/stdtypes sequence append}@anchor{23d6}
@deffn {메서드} sequence.append (value, /)

Append `value' to the end of the sequence.
This is equivalent to writing @code{seq[len(seq):len(seq)] = [value]}.
@end deffn


@geindex clear() (sequence 메서드)
@anchor{library/stdtypes bytearray clear}@anchor{260f}@anchor{library/stdtypes sequence clear}@anchor{23d7}
@deffn {메서드} sequence.clear ()


Added in version 3.3.


Remove all items from `sequence'.
This is equivalent to writing @code{del sequence[:]}.
@end deffn


@geindex copy() (sequence 메서드)
@anchor{library/stdtypes bytearray copy}@anchor{2610}@anchor{library/stdtypes sequence copy}@anchor{2611}
@deffn {메서드} sequence.copy ()


Added in version 3.3.


Create a shallow copy of `sequence'.
This is equivalent to writing @code{sequence[:]}.

@cartouche
@quotation 힌트 
The @code{copy()} method is not part of the
@ref{4c1,,MutableSequence} @ref{1119,,ABC},
but most concrete mutable sequence types provide it.
@end quotation
@end cartouche
@end deffn


@geindex extend() (sequence 메서드)
@anchor{library/stdtypes bytearray extend}@anchor{1799}@anchor{library/stdtypes sequence extend}@anchor{23d9}
@deffn {메서드} sequence.extend (iterable, /)

Extend `sequence' with the contents of `iterable'.
For the most part, this is the same as writing
@code{seq[len(seq):len(seq)] = iterable}.
@end deffn


@geindex insert() (sequence 메서드)
@anchor{library/stdtypes bytearray insert}@anchor{2612}@anchor{library/stdtypes sequence insert}@anchor{23da}
@deffn {메서드} sequence.insert (index, value, /)

Insert `value' into `sequence' at the given `index'.
This is equivalent to writing @code{sequence[index:index] = [value]}.
@end deffn


@geindex pop() (sequence 메서드)
@anchor{library/stdtypes bytearray pop}@anchor{15ab}@anchor{library/stdtypes sequence pop}@anchor{23db}
@deffn {메서드} sequence.pop (index=-1, /)

Retrieve the item at `index' and also removes it from `sequence'.
By default, the last item in `sequence' is removed and returned.
@end deffn


@geindex remove() (sequence 메서드)
@anchor{library/stdtypes bytearray remove}@anchor{2613}@anchor{library/stdtypes sequence remove}@anchor{197b}
@deffn {메서드} sequence.remove (value, /)

Remove the first item from `sequence' where @code{sequence[i] == value}.

Raises @ref{2ec,,ValueError} if `value' is not found in `sequence'.
@end deffn


@geindex reverse() (sequence 메서드)
@anchor{library/stdtypes bytearray reverse}@anchor{15ac}@anchor{library/stdtypes sequence reverse}@anchor{23dc}
@deffn {메서드} sequence.reverse ()

Reverse the items of `sequence' in place.
This method maintains economy of space when reversing a large sequence.
To remind users that it operates by side-effect, it returns @code{None}.
@end deffn

@node 리스트<2>,튜플,가변 시퀀스 형,시퀀스 형 — list tuple range
@anchor{library/stdtypes lists}@anchor{2614}@anchor{library/stdtypes typesseq-list}@anchor{2020}
@subsubsection 리스트


@geindex object;list

리스트는 가변 시퀀스로, 일반적으로 등질 항목들의 모음을 저장하는 데 사용됩니다 (정확한 유사도는 응용 프로그램마다 다를 수 있습니다).

@geindex list (내장 클래스)
@anchor{library/stdtypes list}@anchor{24d}
@deffn {클래스} list (iterable=(), /)

리스트는 여러 가지 방법으로 만들 수 있습니다:


@itemize *

@item 
대괄호를 사용하여 빈 리스트를 표시하기: @code{[]}

@item 
대괄호를 사용하여 쉼표로 항목 구분하기: @code{[a]}, @code{[a, b, c]}

@item 
리스트 컴프리헨션 사용하기: @code{[x for x in iterable]}

@item 
형 생성자를 사용하기: @code{list()} 또는 @code{list(iterable)}
@end itemize

생성자는 항목들과 그 순서가 `iterable' 과 같은 리스트를 만듭니다. `iterable' 은 시퀀스, 이터레이션을 지원하는 컨테이너, 이터레이터 객체가 될 수 있습니다. `iterable' 이 이미 리스트라면, @code{iterable[:]} 과 비슷하게 복사본을 만들어서 반환합니다. 예를 들어, @code{list('abc')} 는 @code{['a', 'b', 'c']} 를 반환하고 @code{list( (1, 2, 3) )} 는 @code{[1, 2, 3]} 를 반환합니다. 인자가 주어지지 않으면, 생성자는 새로운 빈 리스트인 @code{[]} 을 만듭니다.

다른 많은 연산도 리스트를 만드는데, 내장 @ref{dc6,,sorted()} 도 그런 것 중 하나다.

리스트는 @ref{2608,,공통} 과 @ref{25c3,,가변} 시퀀스 연산들을 모두 구현합니다. 또한, 리스트는 다음과 같은 추가 메서드를 제공합니다:

@geindex sort() (list 메서드)
@anchor{library/stdtypes list sort}@anchor{dc7}
@deffn {메서드} sort (*, key=None, reverse=False)

이 메서드는 항목 간의 @code{<} 비교만 사용하여 리스트를 제자리에서 정렬합니다. 예외는 억제되지 않습니다 - 비교 연산이 실패하면 전체 정렬 연산이 실패합니다 (리스트는 부분적으로 수정된 상태로 남아있게 됩니다).

@ref{dc7,,sort()} 는 키워드로만 전달할 수 있는 두 개의 인자를 받아들입니다 (@ref{5a4,,키워드-전용 인자}):

`key' 는 인자 하나를 받아들이는 함수를 지정하는데, 각 리스트 요소에서 비교 키를 추출하는 데 사용됩니다 (예를 들어, @code{key=str.lower}). 리스트의 각 항목에 해당하는 키는 한 번만 계산된 후 전체 정렬 프로세스에 사용됩니다. 기본값 @code{None} 은 리스트 항목들이 별도의 키값을 계산하지 않고 직접 정렬된다는 것을 의미합니다.

@ref{13df,,functools.cmp_to_key()} 유틸리티는 2.x 스타일 `cmp' 함수를 `key' 함수로 변환하는 데 사용할 수 있습니다.

`reverse' 는 논리값입니다. @code{True} 로 설정되면, 각 비교가 역전된 것처럼 리스트 요소들이 정렬됩니다.

이 메서드는 큰 시퀀스를 정렬할 때 공간 절약을 위해 시퀀스를 제자리에서 수정합니다. 부작용으로 작동한다는 것을 사용자에게 상기시키기 위해 정렬된 시퀀스를 돌려주지 않습니다 (새 정렬 된 리스트 인스턴스를 명시적으로 요청하려면 @ref{dc6,,sorted()}를 사용하십시오).

@ref{dc7,,sort()} 메서드는 안정적임이 보장됩니다. 정렬은 같다고 비교되는 요소들의 상대적 순서를 변경하지 않으면 안정적입니다 — 이는 여러 번 정렬하는 데 유용합니다 (예를 들어, 부서별로 정렬한 후에 급여 등급으로 정렬).

정렬 예제와 간단한 정렬 자습서는 @ref{25de,,정렬 기법}를 참조하십시오.

리스트가 정렬되는 동안, 리스트를 변경하려고 할 때의, 또는 관찰하려고 할 때조차, 효과는 정의되지 않습니다. 파이썬의 C 구현은 그동안 리스트를 비어있는 것으로 보이게 하고, 정렬 중에 리스트가 변경되었음을 감지할 수 있다면 @ref{2ec,,ValueError} 를 일으킵니다.
@end deffn
@end deffn


@subsubheading 더 보기


For detailed information on thread-safety guarantees for @ref{24d,,list}
objects, see @ref{2615,,Thread safety for list objects}.


@node 튜플,범위,리스트<2>,시퀀스 형 — list tuple range
@anchor{library/stdtypes tuples}@anchor{2616}@anchor{library/stdtypes typesseq-tuple}@anchor{254a}
@subsubsection 튜플


@geindex object;tuple

튜플은 불변 시퀀스인데, 보통 이질적인 데이터의 모음을 저장하는 데 사용됩니다 (예를 들어, 내장 @ref{1686,,enumerate()} 가 만드는 2-튜플). 튜플은 등질적인 데이터의 불변 시퀀스가 필요한 경우에도 사용됩니다 (예를 들어, @ref{184,,set} 이나 @ref{183,,dict} 인스턴스에 저장하고자 하는 경우).

@geindex tuple (내장 클래스)
@anchor{library/stdtypes tuple}@anchor{610}
@deffn {클래스} tuple (iterable=(), /)

튜플은 여러 가지 방법으로 만들 수 있습니다:


@itemize *

@item 
괄호를 사용하여 빈 튜플을 나타내기: @code{()}

@item 
단일 항목 튜플을 위해 끝에 쉼표를 붙이기: @code{a,} 또는 @code{(a,)}

@item 
항목을 쉼표로 구분하기: @code{a, b, c} 또는 @code{(a, b, c)}

@item 
내장 @ref{610,,tuple()} 사용하기: @code{tuple()} 또는 @code{tuple(iterable)}
@end itemize

생성자는 항목들과 그 순서가 `iterable' 과 같은 튜플을 만듭니다. `iterable' 은 시퀀스, 이터레이션을 지원하는 컨테이너, 이터레이터 객체가 될 수 있습니다. `iterable' 이 이미 튜플이라면 변경되지 않은 상태로 반환됩니다. 예를 들어 @code{tuple('abc')} 는 @code{('a', 'b', 'c')} 를 반환하고, @code{tuple( [1, 2, 3] )} 는 @code{(1, 2, 3)} 을 반환합니다. 인자가 주어지지 않으면, 생성자는 새로운 빈 튜플인 @code{()} 을 만듭니다.

튜플을 만드는 것은 실제로는 괄호가 아닌 쉼표임에 유의하십시오. 괄호는 빈 튜플의 경우를 제외하고는 선택적이거나 문법상의 모호함을 피하고자 필요합니다. 예를 들어, @code{f(a, b, c)} 는 3개의 인자를 가진 함수 호출이지만, @code{f((a, b, c))} 는 하나의 인자로 3-튜플을 갖는 함수 호출입니다.

튜플은 @ref{2608,,공통} 시퀀스 연산을 모두 구현합니다.
@end deffn

이름에 의한 액세스가 인덱스에 의한 액세스보다 더 명확한 이질적 데이터 컬렉션의 경우, @ref{4e0,,collections.namedtuple()} 이 단순한 튜플 객체보다 더 적절한 선택일 수 있습니다.

@node 범위,,튜플,시퀀스 형 — list tuple range
@anchor{library/stdtypes ranges}@anchor{2617}@anchor{library/stdtypes typesseq-range}@anchor{25dd}
@subsubsection 범위


@geindex object;range

@ref{b3d,,range} 형은 숫자의 불변 시퀀스를 나타내며 @ref{34a,,for} 루프에서 특정 횟수만큼 반복하는 데 흔히 사용됩니다.

@geindex range (내장 클래스)
@anchor{library/stdtypes range}@anchor{b3d}
@deffn {클래스} range (stop, /)

@deffnx {클래스} range (start, stop, step=1, /)

The arguments to the range constructor must be integers (either built-in
@ref{19b,,int} or any object that implements the @ref{19e,,__index__()} special
method).  If the `step' argument is omitted, it defaults to @code{1}.
If the `start' argument is omitted, it defaults to @code{0}.
If `step' is zero, @ref{2ec,,ValueError} is raised.

양수 `step' 의 경우, 범위 @code{r} 의 내용은 식 @code{r[i] = start + step*i} 에 의해 결정됩니다. 이때 @code{i >= 0} 이고 @code{r[i] < stop} 입니다.

음수 `step' 의 경우, 범위의 내용은 여전히 식 @code{r[i] = start + step*i} 에 의해 결정되지만, 제약 조건은 @code{i >= 0} 과 @code{r[i] > stop} 이 됩니다.

@code{r[0]} 제약 조건을 만족시키지 않으면 범위 객체는 비게 됩니다. 범위는 음의 인덱스를 지원하지만, 이는 시퀀스의 끝에서부터 양의 인덱스만큼 떨어진 인덱스로 해석됩니다.

@ref{13ca,,sys.maxsize} 보다 큰 절댓값을 포함하는 범위는 허용되지만, (@ref{83f,,len()} 과 같은) 일부 기능은 @ref{a81,,OverflowError} 를 발생시킬 수 있습니다.

범위 예제:

@example
>>> list(range(10))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> list(range(1, 11))
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> list(range(0, 30, 5))
[0, 5, 10, 15, 20, 25]
>>> list(range(0, 10, 3))
[0, 3, 6, 9]
>>> list(range(0, -10, -1))
[0, -1, -2, -3, -4, -5, -6, -7, -8, -9]
>>> list(range(0))
[]
>>> list(range(1, 0))
[]
@end example

범위는 이어 붙이기와 반복을 제외한 @ref{2608,,공통} 시퀀스 연산을 모두 구현합니다 (범위 객체는 엄격한 패턴을 따르는 시퀀스 만 나타낼 수 있는데 반복과 이어 붙이기는 보통 그 패턴을 위반한다는 사실에 기인합니다).

@geindex start (range의 속성)
@anchor{library/stdtypes range start}@anchor{2618}
@deffn {속성} start

`start' 매개변수의 값 (또는 매개변수가 제공되지 않으면 @code{0})
@end deffn

@geindex stop (range의 속성)
@anchor{library/stdtypes range stop}@anchor{2619}
@deffn {속성} stop

`stop' 매개변수의 값
@end deffn

@geindex step (range의 속성)
@anchor{library/stdtypes range step}@anchor{261a}
@deffn {속성} step

`step' 매개변수의 값 (또는 매개변수가 제공되지 않으면 @code{1})
@end deffn
@end deffn

정규 @ref{24d,,list} 나 @ref{610,,tuple} 에 비해 @ref{b3d,,range} 형의 장점은 @code{range} 객체는 표현하는 범위의 크기에 무관하게 항상 같은 (작은) 양의 메모리를 사용한다는 것입니다 (@code{start}, @code{stop}, @code{step} 값만을 저장하고, 필요에 따라 개별 항목과 하위 범위를 계산하기 때문입니다).

범위 객체는 @ref{13c9,,collections.abc.Sequence} ABC를 구현하고, 포함 검사, 요소 인덱스 검색, 슬라이싱, 음수 인덱스 지원과 같은 기능을 제공합니다 (@ref{202c,,시퀀스 형 — list@comma{} tuple@comma{} range} 를 보세요):

@example
>>> r = range(0, 20, 2)
>>> r
range(0, 20, 2)
>>> 11 in r
False
>>> 10 in r
True
>>> r.index(10)
5
>>> r[5]
10
>>> r[:5]
range(0, 10, 2)
>>> r[-1]
18
@end example

@code{==} 나 @code{!=} 로 범위 객체가 같은지 검사하면 시퀀스처럼 비교합니다. 즉, 두 범위 객체가 같은 시퀀스의 값을 나타낼 때 같다고 취급됩니다. (같다고 비교되는 두 개의 범위 객체가 서로 다른 @ref{2618,,start}, @ref{2619,,stop}, @ref{261a,,step} 어트리뷰트를 가질 수 있음에 주의하세요. 예를 들어, @code{range(0) == range(2, 1, 3)} 또는 @code{range(0, 3, 2) == range(0, 4, 2)}.)


버전 3.2에서 변경: 시퀀스 ABC를 구현합니다. @ref{19b,,int} 객체의 포함 검사는 모든 항목을 이터레이트하는 대신 상수 시간으로 수행됩니다.



버전 3.3에서 변경: (객체 아이덴티티에 기반을 두는 대신) 범위 객체가 정의하는 값들의 시퀀스에 기반을 둔 비교를 위해 ‘==’ 와 ‘!=’ 를 정의합니다.

Added the @ref{2618,,start}, @ref{2619,,stop} and @ref{261a,,step}
attributes.



@subsubheading 더 보기



@itemize *

@item 
The linspace recipe@footnote{https://code.activestate.com/recipes/579000-equally-spaced-numbers-linspace/}
shows how to implement a lazy version of range suitable for floating-point
applications.
@end itemize


@geindex string;text sequence type
@geindex str (built-in class);(see also string)
@geindex object;string

@node Text and Binary Sequence Type Methods Summary,텍스트 시퀀스 형 — str,시퀀스 형 — list tuple range,내장형
@anchor{library/stdtypes text-and-binary-sequence-type-methods-summary}@anchor{261b}@anchor{library/stdtypes text-methods-summary}@anchor{261c}
@subsection Text and Binary Sequence Type Methods Summary


The following table summarizes the text and binary sequence types methods by
category.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxx} {xx} {xx} {xxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxx} {xx} {xx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Category

@tab

@ref{169,,str} methods

@tab

@tab

@tab

@tab

@ref{192,,bytes} and @ref{344,,bytearray} methods

@tab

@tab

@tab

@item

Formatting

@tab

@ref{832,,str.format()}

@tab

@tab

@tab

@tab

@tab

@tab

@tab

@item

@ref{fd6,,str.format_map()}

@tab

@tab

@tab

@tab

@tab

@tab

@tab

@item

@ref{19a,,포맷 문자열 리터럴}

@tab

@tab

@tab

@tab

@tab

@tab

@tab

@item

@ref{8da,,printf 스타일 문자열 포매팅}

@tab

@tab

@tab

@tab

@ref{f80,,printf 스타일 바이너리 포매팅}

@tab

@tab

@tab

@item

Searching and Replacing

@tab

@ref{10a7,,str.find()}

@tab

@ref{10a8,,str.rfind()}

@tab

@tab

@tab

@ref{1bd2,,bytes.find()}

@tab

@ref{1bd3,,bytes.rfind()}

@tab

@tab

@item

@ref{19bc,,str.index()}

@tab

@ref{145c,,str.rindex()}

@tab

@tab

@tab

@ref{261d,,bytes.index()}

@tab

@ref{261e,,bytes.rindex()}

@tab

@tab

@item

@ref{10ca,,str.startswith()}

@tab

@tab

@tab

@tab

@ref{261f,,bytes.startswith()}

@tab

@tab

@tab

@item

@ref{10cb,,str.endswith()}

@tab

@tab

@tab

@tab

@ref{2620,,bytes.endswith()}

@tab

@tab

@tab

@item

@ref{1982,,str.count()}

@tab

@tab

@tab

@tab

@ref{1983,,bytes.count()}

@tab

@tab

@tab

@item

@ref{4b9,,str.replace()}

@tab

@tab

@tab

@tab

@ref{2621,,bytes.replace()}

@tab

@tab

@tab

@item

Splitting and Joining

@tab

@ref{10a9,,str.split()}

@tab

@tab

@ref{145a,,str.rsplit()}

@tab

@tab

@ref{2622,,bytes.split()}

@tab

@tab

@ref{2623,,bytes.rsplit()}

@tab

@item

@ref{145b,,str.splitlines()}

@tab

@tab

@tab

@tab

@ref{2624,,bytes.splitlines()}

@tab

@tab

@tab

@item

@ref{10aa,,str.partition()}

@tab

@tab

@tab

@tab

@ref{2625,,bytes.partition()}

@tab

@tab

@tab

@item

@ref{145d,,str.rpartition()}

@tab

@tab

@tab

@tab

@ref{2626,,bytes.rpartition()}

@tab

@tab

@tab

@item

@ref{260a,,str.join()}

@tab

@tab

@tab

@tab

@ref{260b,,bytes.join()}

@tab

@tab

@tab

@item

String Classification

@tab

@ref{2627,,str.isalpha()}

@tab

@tab

@tab

@tab

@ref{2628,,bytes.isalpha()}

@tab

@tab

@tab

@item

@ref{2629,,str.isdecimal()}

@tab

@tab

@tab

@tab

@tab

@tab

@tab

@item

@ref{262a,,str.isdigit()}

@tab

@tab

@tab

@tab

@ref{262b,,bytes.isdigit()}

@tab

@tab

@tab

@item

@ref{262c,,str.isnumeric()}

@tab

@tab

@tab

@tab

@tab

@tab

@tab

@item

@ref{262d,,str.isalnum()}

@tab

@tab

@tab

@tab

@ref{262e,,bytes.isalnum()}

@tab

@tab

@tab

@item

@ref{1d43,,str.isidentifier()}

@tab

@tab

@tab

@tab

@tab

@tab

@tab

@item

@ref{262f,,str.islower()}

@tab

@tab

@tab

@tab

@ref{2630,,bytes.islower()}

@tab

@tab

@tab

@item

@ref{2631,,str.isupper()}

@tab

@tab

@tab

@tab

@ref{2632,,bytes.isupper()}

@tab

@tab

@tab

@item

@ref{2633,,str.istitle()}

@tab

@tab

@tab

@tab

@ref{2634,,bytes.istitle()}

@tab

@tab

@tab

@item

@ref{2635,,str.isspace()}

@tab

@tab

@tab

@tab

@ref{2636,,bytes.isspace()}

@tab

@tab

@tab

@item

@ref{fd7,,str.isprintable()}

@tab

@tab

@tab

@tab

@tab

@tab

@tab

@item

Case Manipulation

@tab

@ref{1b74,,str.lower()}

@tab

@tab

@tab

@tab

@ref{2637,,bytes.lower()}

@tab

@tab

@tab

@item

@ref{2638,,str.upper()}

@tab

@tab

@tab

@tab

@ref{2639,,bytes.upper()}

@tab

@tab

@tab

@item

@ref{fd5,,str.casefold()}

@tab

@tab

@tab

@tab

@tab

@tab

@tab

@item

@ref{263a,,str.capitalize()}

@tab

@tab

@tab

@tab

@ref{263b,,bytes.capitalize()}

@tab

@tab

@tab

@item

@ref{263c,,str.title()}

@tab

@tab

@tab

@tab

@ref{263d,,bytes.title()}

@tab

@tab

@tab

@item

@ref{263e,,str.swapcase()}

@tab

@tab

@tab

@tab

@ref{263f,,bytes.swapcase()}

@tab

@tab

@tab

@item

Padding and Stripping

@tab

@ref{2060,,str.ljust()}

@tab

@tab

@ref{205f,,str.rjust()}

@tab

@tab

@ref{2640,,bytes.ljust()}

@tab

@tab

@ref{2641,,bytes.rjust()}

@tab

@item

@ref{2061,,str.center()}

@tab

@tab

@tab

@tab

@ref{2642,,bytes.center()}

@tab

@tab

@tab

@item

@ref{2643,,str.expandtabs()}

@tab

@tab

@tab

@tab

@ref{2644,,bytes.expandtabs()}

@tab

@tab

@tab

@item

@ref{16b4,,str.strip()}

@tab

@tab

@tab

@tab

@ref{2645,,bytes.strip()}

@tab

@tab

@tab

@item

@ref{16b5,,str.lstrip()}

@tab

@tab

@tab

@ref{16b6,,str.rstrip()}

@tab

@ref{2646,,bytes.lstrip()}

@tab

@tab

@tab

@ref{2647,,bytes.rstrip()}

@item

Translation and Encoding

@tab

@ref{2648,,str.translate()}

@tab

@tab

@tab

@tab

@ref{2649,,bytes.translate()}

@tab

@tab

@tab

@item

@ref{fd8,,str.maketrans()}

@tab

@tab

@tab

@tab

@ref{1479,,bytes.maketrans()}

@tab

@tab

@tab

@item

@ref{ad2,,str.encode()}

@tab

@tab

@tab

@tab

@tab

@tab

@tab

@item

@tab

@tab

@tab

@tab

@ref{ad3,,bytes.decode()}

@tab

@tab

@tab

@end multitable


@node 텍스트 시퀀스 형 — str,바이너리 시퀀스 형 — bytes bytearray memoryview,Text and Binary Sequence Type Methods Summary,내장형
@anchor{library/stdtypes text-sequence-type-str}@anchor{264a}@anchor{library/stdtypes textseq}@anchor{1fdd}
@subsection 텍스트 시퀀스 형 — @code{str}


파이썬의 텍스트 데이터는 @ref{169,,str}, 또는 `문자열 (strings)', 객체를 사용하여 처리됩니다. 문자열은 유니코드 코드 포인트의 불변 @ref{202c,,시퀀스} 입니다. 문자열 리터럴은 다양한 방법으로 작성됩니다:


@itemize *

@item 
작은따옴표: @code{'"큰" 따옴표를 담을 수 있습니다'}

@item 
Double quotes: @code{"allows embedded 'single' quotes"}

@item 
삼중 따옴표: @code{'@w{'}'세 개의 작은따옴표'@w{'}'}, @code{"""세 개의 큰따옴표"""}
@end itemize

삼중 따옴표로 묶인 문자열은 여러 줄에 걸쳐있을 수 있습니다 - 연관된 모든 공백이 문자열 리터럴에 포함됩니다.

단일 표현식의 일부이고 그 들 사이에 공백만 있는 문자열 리터럴은 묵시적으로 단일 문자열 리터럴로 변환됩니다. 즉, @code{("spam " "eggs") == "spam eggs"}.

See @ref{229c,,문자열과 바이트열 리터럴} for more about the various forms of string literal,
including supported @ref{686,,escape sequences}, and the @code{r} (“raw”) prefix that
disables most escape sequence processing.

문자열은 @ref{169,,str} 생성자를 사용하여 다른 객체로부터 만들어질 수도 있습니다.

별도의 “문자” 형이 없으므로 문자열을 인덱싱하면 길이가 1인 문자열이 생성됩니다. 즉, 비어 있지 않은 문자열 `s' 의 경우, @code{s[0] == s[0:1]} 입니다.

@geindex object;io.StringIO

또한, 가변 문자열형은 없지만, 여러 단편으로부터 문자열을 효율적으로 구성하는데 @ref{260a,,str.join()} 또는 @ref{1128,,io.StringIO} 를 사용할 수 있습니다.


버전 3.3에서 변경: 파이썬 2시리즈와의 하위 호환성을 위해서, @code{u} 접두어가 문자열 리터럴에 다시 한번 허용됩니다. 문자열 리터럴의 의미에 영향을 미치지 않으며 @code{r} 접두사와 결합 될 수 없습니다.


@geindex string;str (built-in class)

@geindex str (내장 클래스)
@anchor{library/stdtypes str}@anchor{169}
@deffn {클래스} str (*, encoding='utf-8', errors='strict')

@deffnx {클래스} str (object)

@deffnx {클래스} str (object, encoding, errors='strict')

@deffnx {클래스} str (object, *, errors)

`object' 의 @ref{1fdd,,문자열} 버전을 돌려줍니다. `object' 가 제공되지 않으면, 빈 문자열을 돌려줍니다. 그렇지 않으면, @code{str()} 의 동작은 `encoding' 또는 `errors' 가 주어졌는지에 따라 달라지는데, 다음과 같습니다.

If neither `encoding' nor `errors' is given, @code{str(object)} returns
@ref{82f,,type(object).__str__(object)},
which is the “informal” or nicely
printable string representation of `object'.  For string objects, this is
the string itself.  If `object' does not have a @code{__str__()}
method, then @ref{169,,str()} falls back to returning
@ref{1c1,,repr(object)}.

@geindex buffer protocol;str (built-in class)
@geindex bytes;str (built-in class)

`encoding' 또는 `errors' 중 적어도 하나가 주어지면, `object' 는 @ref{193,,bytes-like object} (예, @ref{192,,bytes} 또는 @ref{344,,bytearray}) 이어야 합니다. 이 경우, `object' 가 @code{bytes} (또는 @code{bytearray}) 객체이면, @code{str(bytes, encoding, errors)} 는 @ref{ad3,,bytes.decode(encoding@comma{} errors)} 와 동등합니다. 그 이외의 경우, @code{bytes.decode()} 호출 전에 버퍼 객체의 하부 바이트열 객체를 얻습니다. 버퍼 객체에 대한 정보는 @ref{25c4,,바이너리 시퀀스 형 — bytes@comma{} bytearray@comma{} memoryview}와 @ref{260,,버퍼 프로토콜} 를 보십시오.

`encoding' 또는 `errors' 인자 없이 @ref{192,,bytes} 객체를 @ref{169,,str()} 에 전달하는 것은 비형식적 문자열 표현을 반환하는 첫 번째 상황에 해당합니다 (파이썬 명령행 옵션 @ref{7f8,,-b} 도 보십시오). 예를 들면:

@example
>>> str(b'Zoot!')
"b'Zoot!'"
@end example

@code{str} 클래스와 그 메서드에 대한 더 자세한 정보는 @ref{1fdd,,텍스트 시퀀스 형 — str}와 아래의 @ref{1fde,,문자열 메서드} 섹션을 보십시오. 포맷된 문자열을 출력하려면 @ref{19a,,포맷 문자열 리터럴} 및 @ref{15a0,,Format string syntax} 섹션을 참조하십시오. 또한, @ref{264b,,텍스트 처리 서비스} 섹션을 보십시오.
@end deffn

@geindex string;methods

@menu
* 문자열 메서드:: 
* Formatted String Literals (f-strings): Formatted String Literals f-strings. 
* Template String Literals (t-strings): Template String Literals t-strings. 
* printf 스타일 문자열 포매팅:: 

@end menu

@node 문자열 메서드,Formatted String Literals f-strings,,텍스트 시퀀스 형 — str
@anchor{library/stdtypes id5}@anchor{264c}@anchor{library/stdtypes string-methods}@anchor{1fde}
@subsubsection 문자열 메서드


@geindex module;re

문자열은 @ref{2608,,공통} 시퀀스 연산들을 모두 구현하고, 아래에 기술된 추가적인 메서드도 구현합니다.

문자열은 또한 두 가지 스타일의 문자열 포매팅을 지원합니다. 하나는 큰 폭의 유연성과 사용자 지정을 제공하고 (참조 @ref{832,,str.format()}, @ref{15a0,,Format string syntax}, @ref{264d,,Custom string formatting}을 참조하세요) 다른 하나는 C @code{printf} 스타일에 기반을 두는데, 더 좁은 범위의 형을 처리하고 올바르게 사용하기는 다소 어렵지만, 처리할 수 있는 경우에는 종종 더 빠릅니다 (@ref{8da,,printf 스타일 문자열 포매팅}).

표준 라이브러리의 @ref{264e,,텍스트 처리 서비스} 섹션은 다양한 텍스트 관련 유틸리티를 (@ref{be,,re} 모듈의 정규식 지원을 포함합니다) 제공하는 많은 다른 모듈들을 다룹니다.

@geindex capitalize() (str 메서드)
@anchor{library/stdtypes str capitalize}@anchor{263a}
@deffn {메서드} str.capitalize ()

첫 문자가 대문자이고 나머지가 소문자인 문자열의 복사본을 돌려줍니다.


버전 3.8에서 변경: 이제 첫 번째 문자는 대문자가 아닌 제목 케이스로 바뀝니다. 이는 이중 문자(digraph)와 같은 문자는 전체 문자 대신 첫 문자만 대문자로 표시된다는 뜻입니다.

@end deffn

@geindex casefold() (str 메서드)
@anchor{library/stdtypes str casefold}@anchor{fd5}
@deffn {메서드} str.casefold ()

케이스 폴딩 된 문자열을 반환합니다. 케이스 폴딩 된 문자열은 대소문자를 무시한 매칭에 사용될 수 있습니다.

Casefolding is similar to lowercasing but more aggressive because it is
intended to remove all case distinctions in a string. For example, the German
lowercase letter @code{'ß'} is equivalent to @code{"ss"}. Since it is already
lowercase, @ref{1b74,,lower()} would do nothing to @code{'ß'}; @code{casefold()}
converts it to @code{"ss"}.
For example:

@example
>>> 'straße'.lower()
'straße'
>>> 'straße'.casefold()
'strasse'
@end example

The casefolding algorithm is
described in section 3.13 'Default Case Folding' of the Unicode Standard@footnote{https://www.unicode.org/versions/Unicode16.0.0/core-spec/chapter-3/#G33992}.


Added in version 3.3.

@end deffn

@geindex center() (str 메서드)
@anchor{library/stdtypes str center}@anchor{2061}
@deffn {메서드} str.center (width, fillchar=' ', /)

Return centered in a string of length `width'. Padding is done using the
specified `fillchar' (default is an ASCII space). The original string is
returned if `width' is less than or equal to @code{len(s)}.  For example:

@example
>>> 'Python'.center(10)
'  Python  '
>>> 'Python'.center(10, '-')
'--Python--'
>>> 'Python'.center(4)
'Python'
@end example
@end deffn

@geindex count() (str 메서드)
@anchor{library/stdtypes str count}@anchor{1982}
@deffn {메서드} str.count (sub[, start[, end]])

범위 [`start', `end'] 에서 부분 문자열 `sub' 가 중첩되지 않고 등장하는 횟수를 돌려줍니다. 선택적 인자 `start' 와 `end' 는 슬라이스 표기법으로 해석됩니다.

If `sub' is empty, returns the number of empty strings between characters
which is the length of the string plus one. For example:

@example
>>> 'spam, spam, spam'.count('spam')
3
>>> 'spam, spam, spam'.count('spam', 5)
2
>>> 'spam, spam, spam'.count('spam', 5, 10)
1
>>> 'spam, spam, spam'.count('eggs')
0
>>> 'spam, spam, spam'.count('@w{'})
17
@end example
@end deffn

@geindex encode() (str 메서드)
@anchor{library/stdtypes str encode}@anchor{ad2}
@deffn {메서드} str.encode (encoding='utf-8', errors='strict')

Return the string encoded to @ref{192,,bytes}.

`encoding' defaults to @code{'utf-8'};
see @ref{fb7,,표준 인코딩} for possible values.

`errors' controls how encoding errors are handled.
If @code{'strict'} (the default), a @ref{462,,UnicodeError} exception is raised.
Other possible values are @code{'ignore'},
@code{'replace'}, @code{'xmlcharrefreplace'}, @code{'backslashreplace'} and any
other name registered via @ref{16a0,,codecs.register_error()}.
See @ref{1b6d,,에러 처리기} for details.

For performance reasons, the value of `errors' is not checked for validity
unless an encoding error actually occurs,
@ref{507,,파이썬 개발 모드} is enabled
or a @ref{508,,debug build} is used.
For example:

@example
>>> encoded_str_to_bytes = 'Python'.encode()
>>> type(encoded_str_to_bytes)
<class 'bytes'>
>>> encoded_str_to_bytes
b'Python'
@end example


버전 3.1에서 변경: 키워드 인자 지원이 추가되었습니다.



버전 3.9에서 변경: The value of the `errors' argument is now checked in @ref{507,,파이썬 개발 모드} and
in @ref{508,,debug mode}.

@end deffn

@geindex endswith() (str 메서드)
@anchor{library/stdtypes str endswith}@anchor{10cb}
@deffn {메서드} str.endswith (suffix[, start[, end]])

Return @code{True} if the string ends with the specified `suffix', otherwise return
@code{False}.  `suffix' can also be a tuple of suffixes to look for.  With optional
`start', test beginning at that position.  With optional `end', stop comparing
at that position. Using `start' and `end' is equivalent to
@code{str[start:end].endswith(suffix)}. For example:

@example
>>> 'Python'.endswith('on')
True
>>> 'a tuple of suffixes'.endswith(('at', 'in'))
False
>>> 'a tuple of suffixes'.endswith(('at', 'es'))
True
>>> 'Python is amazing'.endswith('is', 0, 9)
True
@end example

See also @ref{10ca,,startswith()} and @ref{acd,,removesuffix()}.
@end deffn

@geindex expandtabs() (str 메서드)
@anchor{library/stdtypes str expandtabs}@anchor{2643}
@deffn {메서드} str.expandtabs (tabsize=8)

Return a copy of the string where all tab characters are replaced by one or
more spaces, depending on the current column and the given tab size.  Tab
positions occur every `tabsize' characters (default is 8, giving tab
positions at columns 0, 8, 16 and so on).  To expand the string, the current
column is set to zero and the string is examined character by character.  If
the character is a tab (@code{\t}), one or more space characters are inserted
in the result until the current column is equal to the next tab position.
(The tab character itself is not copied.)  If the character is a newline
(@code{\n}) or return (@code{\r}), it is copied and the current column is reset to
zero.  Any other character is copied unchanged and the current column is
incremented by one regardless of how the character is represented when
printed. For example:

@example
>>> '01\t012\t0123\t01234'.expandtabs()
'01      012     0123    01234'
>>> '01\t012\t0123\t01234'.expandtabs(4)
'01  012 0123    01234'
>>> print('01\t012\n0123\t01234'.expandtabs(4))
01  012
0123    01234
@end example
@end deffn

@geindex find() (str 메서드)
@anchor{library/stdtypes str find}@anchor{10a7}
@deffn {메서드} str.find (sub[, start[, end]])

Return the lowest index in the string where substring `sub' is found within
the slice @code{s[start:end]}.  Optional arguments `start' and `end' are
interpreted as in slice notation.  Return @code{-1} if `sub' is not found.
For example:

@example
>>> 'spam, spam, spam'.find('sp')
0
>>> 'spam, spam, spam'.find('sp', 5)
6
@end example

See also @ref{10a8,,rfind()} and @ref{19bc,,index()}.

@cartouche
@quotation 참고 
@ref{10a7,,find()} 메서드는 `sub' 의 위치를 알아야 할 경우에만 사용해야 합니다. `sub' 가 부분 문자열인지 확인하려면 @ref{34b,,in} 연산자를 사용하십시오:

@example
>>> 'Py' in 'Python'
True
@end example
@end quotation
@end cartouche
@end deffn

@geindex format() (str 메서드)
@anchor{library/stdtypes str format}@anchor{832}
@deffn {메서드} str.format (*args, **kwargs)

Perform a string formatting operation.  The string on which this method is
called can contain literal text or replacement fields delimited by braces
@code{@{@}}.  Each replacement field contains either the numeric index of a
positional argument, or the name of a keyword argument.  Returns a copy of
the string where each replacement field is replaced with the string value of
the corresponding argument. For example:

@example
>>> "The sum of 1 + 2 is @{0@}".format(1+2)
'The sum of 1 + 2 is 3'
>>> "The sum of @{a@} + @{b@} is @{answer@}".format(answer=1+2, a=1, b=2)
'The sum of 1 + 2 is 3'
>>> "@{1@} expects the @{0@} Inquisition!".format("Spanish", "Nobody")
'Nobody expects the Spanish Inquisition!'
@end example

포맷 문자열에 지정할 수 있는 다양한 포맷 옵션에 대한 설명은 @ref{15a0,,Format string syntax} 을 참조하십시오.

@cartouche
@quotation 참고 
숫자(@ref{19b,,int}, @ref{196,,float}, @ref{197,,complex}, @ref{1fe,,decimal.Decimal}와 서브 클래스)를 @code{n} 형식으로 포매팅할 때 (예: @code{'@{:n@}'.format(1234)}), 이 함수는 일시적으로 @code{LC_CTYPE} 로케일을 @code{LC_NUMERIC} 로케일로 설정하여 @code{localeconv()} 의 @code{decimal_point} 와 @code{thousands_sep} 필드를 디코드하는데, 이 필드들이 ASCII가 아니거나 1바이트보다 길고, @code{LC_NUMERIC} 로케일이 @code{LC_CTYPE} 로케일과 다를 때만 그렇게 합니다. 이 임시 변경은 다른 스레드에 영향을 줍니다.
@end quotation
@end cartouche


버전 3.7에서 변경: 숫자를 @code{n} 형식으로 포매팅할 때, 이 함수는 어떤 경우에 일시적으로 @code{LC_CTYPE} 로케일을 @code{LC_NUMERIC} 로케일로 설정합니다.

@end deffn

@geindex format_map() (str 메서드)
@anchor{library/stdtypes str format_map}@anchor{fd6}
@deffn {메서드} str.format_map (mapping, /)

@code{str.format(**mapping)} 과 비슷하지만, @ref{183,,dict}로 복사되지 않고 @code{mapping} 을 직접 사용합니다. 예를 들어 @code{mapping} 이 dict 서브 클래스면 유용합니다:

@example
>>> class Default(dict):
...     def __missing__(self, key):
...         return key
...
>>> '@{name@} was born in @{country@}'.format_map(Default(name='Guido'))
'Guido was born in country'
@end example


Added in version 3.2.

@end deffn

@geindex index() (str 메서드)
@anchor{library/stdtypes str index}@anchor{19bc}
@deffn {메서드} str.index (sub[, start[, end]])

Like @ref{10a7,,find()}, but raise @ref{2ec,,ValueError} when the substring is
not found. For example:

@example
>>> 'spam, spam, spam'.index('spam')
0
>>> 'spam, spam, spam'.index('eggs')
Traceback (most recent call last):
  File "<python-input-0>", line 1, in <module>
    'spam, spam, spam'.index('eggs')
    ~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^
ValueError: substring not found
@end example

See also @ref{145c,,rindex()}.
@end deffn

@geindex isalnum() (str 메서드)
@anchor{library/stdtypes str isalnum}@anchor{262d}
@deffn {메서드} str.isalnum ()

Return @code{True} if all characters in the string are alphanumeric and there is at
least one character, @code{False} otherwise.  A character @code{c} is alphanumeric if one
of the following returns @code{True}: @code{c.isalpha()}, @code{c.isdecimal()},
@code{c.isdigit()}, or @code{c.isnumeric()}. For example:

@example
>>> 'abc123'.isalnum()
True
>>> 'abc123!@@#'.isalnum()
False
>>> '@w{'}.isalnum()
False
>>> ' '.isalnum()
False
@end example
@end deffn

@geindex isalpha() (str 메서드)
@anchor{library/stdtypes str isalpha}@anchor{2627}
@deffn {메서드} str.isalpha ()

Return @code{True} if all characters in the string are alphabetic and there is at least
one character, @code{False} otherwise.  Alphabetic characters are those characters defined
in the Unicode character database as “Letter”, i.e., those with general category
property being one of “Lm”, “Lt”, “Lu”, “Ll”, or “Lo”.  Note that this is different
from the Alphabetic property defined in the section 4.10 'Letters@comma{} Alphabetic@comma{} and Ideographic' of the Unicode Standard@footnote{https://www.unicode.org/versions/Unicode16.0.0/core-spec/chapter-4/#G91002}.
For example:

@example
>>> 'Letters and spaces'.isalpha()
False
>>> 'LettersOnly'.isalpha()
True
>>> 'µ'.isalpha()  # non-ASCII characters can be considered alphabetical too
True
@end example

See @ref{264f,,유니코드 속성}.
@end deffn

@geindex isascii() (str 메서드)
@anchor{library/stdtypes str isascii}@anchor{ce8}
@deffn {메서드} str.isascii ()

Return @code{True} if the string is empty or all characters in the string are ASCII,
@code{False} otherwise.
ASCII characters have code points in the range U+0000-U+007F. For example:

@example
>>> 'ASCII characters'.isascii()
True
>>> 'µ'.isascii()
False
@end example


Added in version 3.7.

@end deffn

@geindex isdecimal() (str 메서드)
@anchor{library/stdtypes str isdecimal}@anchor{2629}
@deffn {메서드} str.isdecimal ()

Return @code{True} if all characters in the string are decimal
characters and there is at least one character, @code{False}
otherwise. Decimal characters are those that can be used to form
numbers in base 10, such as U+0660, ARABIC-INDIC DIGIT
ZERO.  Formally a decimal character is a character in the Unicode
General Category “Nd”. For example:

@example
>>> '0123456789'.isdecimal()
True
>>> '٠١٢٣٤٥٦٧٨٩'.isdecimal()  # Arabic-Indic digits zero to nine
True
>>> 'alphabetic'.isdecimal()
False
@end example
@end deffn

@geindex isdigit() (str 메서드)
@anchor{library/stdtypes str isdigit}@anchor{262a}
@deffn {메서드} str.isdigit ()

문자열 내의 모든 문자가 디짓이고, 적어도 하나의 문자가 존재하는 경우 @code{True}를 돌려주고, 그렇지 않으면 @code{False}를 돌려줍니다. 디짓에는 십진수 문자와 호환성 위 첨자 숫자와 같은 특수 처리가 필요한 숫자가 포함됩니다. 여기에는 카로슈티 숫자처럼 십진법으로 숫자를 구성할 때 사용될 수 없는 것들이 포함됩니다. 형식적으로, 디짓은 속성값이 Numeric_Type=Digit 또는 Numeric_Type=Decimal인 문자입니다.
@end deffn

@geindex isidentifier() (str 메서드)
@anchor{library/stdtypes str isidentifier}@anchor{1d43}
@deffn {메서드} str.isidentifier ()

문자열이 섹션 section @ref{229d,,Names (identifiers and keywords)} 의 언어 정의에 따른 유효한 식별자면 @code{True}를 돌려줍니다.

@ref{2650,,keyword.iskeyword()} can be used to test whether string @code{s} is a reserved
identifier, such as @ref{165f,,def} and @ref{14dc,,class}.

예제:

@example
>>> from keyword import iskeyword

>>> 'hello'.isidentifier(), iskeyword('hello')
(True, False)
>>> 'def'.isidentifier(), iskeyword('def')
(True, True)
@end example
@end deffn

@geindex islower() (str 메서드)
@anchor{library/stdtypes str islower}@anchor{262f}
@deffn {메서드} str.islower ()

문자열 내의 모든 케이스 문자가 @footnote{
케이스 문자는 일반 범주 속성이 “Lu” (Letter, 대문자), “Ll” (Letter, 소문자), “Lt” (Letter, 제목 문자) 중 한 가지인 경우입니다.
} 소문자이고, 적어도 하나의 케이스 문자가 존재하는 경우 @code{True}를 돌려주고, 그렇지 않으면 @code{False}를 돌려줍니다.
@end deffn

@geindex isnumeric() (str 메서드)
@anchor{library/stdtypes str isnumeric}@anchor{262c}
@deffn {메서드} str.isnumeric ()

Return @code{True} if all characters in the string are numeric
characters, and there is at least one character, @code{False}
otherwise. Numeric characters include digit characters, and all characters
that have the Unicode numeric value property, e.g. U+2155,
VULGAR FRACTION ONE FIFTH.  Formally, numeric characters are those with the property
value Numeric_Type=Digit, Numeric_Type=Decimal or Numeric_Type=Numeric.
For example:

@example
>>> '0123456789'.isnumeric()
True
>>> '٠١٢٣٤٥٦٧٨٩'.isnumeric()  # Arabic-indic digit zero to nine
True
>>> '⅕'.isnumeric()  # Vulgar fraction one fifth
True
>>> '²'.isdecimal(), '²'.isdigit(),  '²'.isnumeric()
(False, True, True)
@end example

See also @ref{2629,,isdecimal()} and @ref{262a,,isdigit()}. Numeric characters are
a superset of decimal numbers.
@end deffn

@geindex isprintable() (str 메서드)
@anchor{library/stdtypes str isprintable}@anchor{fd7}
@deffn {메서드} str.isprintable ()

Return @code{True} if all characters in the string are printable, @code{False} if it
contains at least one non-printable character.

Here “printable” means the character is suitable for @ref{1c1,,repr()} to use in
its output; “non-printable” means that @code{repr()} on built-in types will
hex-escape the character.  It has no bearing on the handling of strings
written to @ref{ccc,,sys.stdout} or @ref{b33,,sys.stderr}.

The printable characters are those which in the Unicode character database
(see @ref{10b,,unicodedata}) have a general category in group Letter, Mark,
Number, Punctuation, or Symbol (L, M, N, P, or S); plus the ASCII space 0x20.
Nonprintable characters are those in group Separator or Other (Z or C),
except the ASCII space.

For example:

@example
>>> '@w{'}.isprintable(), ' '.isprintable()
(True, True)
>>> '\t'.isprintable(), '\n'.isprintable()
(False, False)
@end example

See also @ref{2635,,isspace()}.
@end deffn

@geindex isspace() (str 메서드)
@anchor{library/stdtypes str isspace}@anchor{2635}
@deffn {메서드} str.isspace ()

문자열 내에 공백 문자만 있고, 적어도 하나의 문자가 존재하는 경우 @code{True}를 돌려주고, 그렇지 않으면 @code{False}를 돌려줍니다.

For example:

@example
>>> '@w{'}.isspace()
False
>>> ' '.isspace()
True
>>> '\t\n'.isspace() # TAB and BREAK LINE
True
>>> '\u3000'.isspace() # IDEOGRAPHIC SPACE
True
@end example

유니코드 문자 데이터베이스(@ref{10b,,unicodedata}를 참조하십시오)에서, 일반 범주(general category)가 @code{Zs}(“Separator, space”)이거나 양방향 클래스(bidirectional class)가 @code{WS}, @code{B} 또는 @code{S} 중 하나이면 문자는 `공백(whitespace)'입니다.

See also @ref{fd7,,isprintable()}.
@end deffn

@geindex istitle() (str 메서드)
@anchor{library/stdtypes str istitle}@anchor{2633}
@deffn {메서드} str.istitle ()

문자열이 제목 케이스 문자열이고 하나 이상의 문자가 있는 경우 @code{True}를 돌려줍니다. 예를 들어 대문자 앞에는 케이스 없는 문자만 올 수 있고 소문자는 케이스 문자 뒤에만 올 수 있습니다. 그렇지 않은 경우는 @code{False}를 돌려줍니다.

For example:

@example
>>> 'Spam, Spam, Spam'.istitle()
True
>>> 'spam, spam, spam'.istitle()
False
>>> 'SPAM, SPAM, SPAM'.istitle()
False
@end example

See also @ref{263c,,title()}.
@end deffn

@geindex isupper() (str 메서드)
@anchor{library/stdtypes str isupper}@anchor{2631}
@deffn {메서드} str.isupper ()

문자열 내의 모든 케이스 문자가 @footnote{
케이스 문자는 일반 범주 속성이 “Lu” (Letter, 대문자), “Ll” (Letter, 소문자), “Lt” (Letter, 제목 문자) 중 한 가지인 경우입니다.
} 대문자이고, 적어도 하나의 케이스 문자가 존재하는 경우 @code{True}를 돌려주고, 그렇지 않으면 @code{False}를 돌려줍니다.

@example
>>> 'BANANA'.isupper()
True
>>> 'banana'.isupper()
False
>>> 'baNana'.isupper()
False
>>> ' '.isupper()
False
@end example
@end deffn

@geindex join() (str 메서드)
@anchor{library/stdtypes meth-str-join}@anchor{2651}@anchor{library/stdtypes str join}@anchor{260a}
@deffn {메서드} str.join (iterable, /)

Return a string which is the concatenation of the strings in `iterable'.
A @ref{198,,TypeError} will be raised if there are any non-string values in
`iterable', including @ref{192,,bytes} objects.  The separator between
elements is the string providing this method. For example:

@example
>>> ', '.join(['spam', 'spam', 'spam'])
'spam, spam, spam'
>>> '-'.join('Python')
'P-y-t-h-o-n'
@end example

See also @ref{10a9,,split()}.
@end deffn

@geindex ljust() (str 메서드)
@anchor{library/stdtypes str ljust}@anchor{2060}
@deffn {메서드} str.ljust (width, fillchar=' ', /)

왼쪽으로 정렬된 문자열을 길이 `width' 인 문자열로 돌려줍니다. 지정된 `fillchar' (기본값은 ASCII 스페이스)을 사용하여 채웁니다. `width' 가 @code{len(s)} 보다 작거나 같은 경우 원래 문자열이 반환됩니다.

For example:

@example
>>> 'Python'.ljust(10)
'Python    '
>>> 'Python'.ljust(10, '.')
'Python....'
>>> 'Monty Python'.ljust(10, '.')
'Monty Python'
@end example

See also @ref{205f,,rjust()}.
@end deffn

@geindex lower() (str 메서드)
@anchor{library/stdtypes str lower}@anchor{1b74}
@deffn {메서드} str.lower ()

Return a copy of the string with all the cased characters @footnote{
케이스 문자는 일반 범주 속성이 “Lu” (Letter, 대문자), “Ll” (Letter, 소문자), “Lt” (Letter, 제목 문자) 중 한 가지인 경우입니다.
} converted to
lowercase. For example:

@example
>>> 'Lower Method Example'.lower()
'lower method example'
@end example

The lowercasing algorithm used is
described in section 3.13 'Default Case Folding' of the Unicode Standard@footnote{https://www.unicode.org/versions/Unicode16.0.0/core-spec/chapter-3/#G33992}.
@end deffn

@geindex lstrip() (str 메서드)
@anchor{library/stdtypes str lstrip}@anchor{16b5}
@deffn {메서드} str.lstrip (chars=None, /)

선행 문자가 제거된 문자열의 복사본을 돌려줍니다. `chars' 인자는 제거할 문자 집합을 지정하는 문자열입니다. 생략되거나 @code{None} 이라면, `chars' 인자의 기본값은 공백을 제거하도록 합니다. `chars' 인자는 접두사가 아닙니다; 모든 값 조합이 제거됩니다:

@example
>>> '   spacious   '.lstrip()
'spacious   '
>>> 'www.example.com'.lstrip('cmowz.')
'example.com'
@end example

문자 집합의 모든 것이 아닌 단일 접두사 문자열을 제거하는 메서드는 @ref{acc,,str.removeprefix()}를 참조하십시오. 예를 들면:

@example
>>> 'Arthur: three!'.lstrip('Arthur: ')
'ee!'
>>> 'Arthur: three!'.removeprefix('Arthur: ')
'three!'
@end example
@end deffn

@geindex maketrans() (str의 정적 메서드)
@anchor{library/stdtypes str maketrans}@anchor{fd8}
@deffn {메서드} static str.maketrans (dict, /)

@deffnx {메서드} static str.maketrans (from, to, remove='@w{'}, /)

이 정적 메서드는 @ref{2648,,str.translate()} 에 사용할 수 있는 변환표를 돌려줍니다.

인자가 하나만 있으면 유니코드 포인트 (정수) 또는 문자 (길이가 1인 문자열)를 유니코드 포인트, 문자열 (임의 길이) 또는 @code{None} 으로 매핑하는 딕셔너리여야 합니다. 문자 키는 유니코드 포인트로 변환됩니다.

If there are two arguments, they must be strings of equal length, and in the
resulting dictionary, each character in `from' will be mapped to the character at
the same position in `to'.  If there is a third argument, it must be a string,
whose characters will be mapped to @code{None} in the result.
@end deffn

@geindex partition() (str 메서드)
@anchor{library/stdtypes str partition}@anchor{10aa}
@deffn {메서드} str.partition (sep, /)

`sep' 가 처음 나타나는 위치에서 문자열을 나누고, 구분자 앞에 있는 부분, 구분자 자체, 구분자 뒤에 오는 부분으로 구성된 3-튜플을 돌려줍니다. 구분자가 발견되지 않으면, 문자열 자신과 그 뒤를 따르는 두 개의 빈 문자열로 구성된 3-튜플을 돌려줍니다.

For example:

@example
>>> 'Monty Python'.partition(' ')
('Monty', ' ', 'Python')
>>> "Monty Python's Flying Circus".partition(' ')
('Monty', ' ', "Python's Flying Circus")
>>> 'Monty Python'.partition('-')
('Monty Python', '@w{'}, '@w{'})
@end example

See also @ref{145d,,rpartition()}.
@end deffn

@geindex removeprefix() (str 메서드)
@anchor{library/stdtypes str removeprefix}@anchor{acc}
@deffn {메서드} str.removeprefix (prefix, /)

If the string starts with the `prefix' string, return
@code{string[len(prefix):]}. Otherwise, return a copy of the original
string:

@example
>>> 'TestHook'.removeprefix('Test')
'Hook'
>>> 'BaseTestCase'.removeprefix('Test')
'BaseTestCase'
@end example


Added in version 3.9.


See also @ref{acd,,removesuffix()} and @ref{10ca,,startswith()}.
@end deffn

@geindex removesuffix() (str 메서드)
@anchor{library/stdtypes str removesuffix}@anchor{acd}
@deffn {메서드} str.removesuffix (suffix, /)

If the string ends with the `suffix' string and that `suffix' is not empty,
return @code{string[:-len(suffix)]}. Otherwise, return a copy of the
original string:

@example
>>> 'MiscTests'.removesuffix('Tests')
'Misc'
>>> 'TmpDirMixin'.removesuffix('Tests')
'TmpDirMixin'
@end example


Added in version 3.9.


See also @ref{acc,,removeprefix()} and @ref{10cb,,endswith()}.
@end deffn

@geindex replace() (str 메서드)
@anchor{library/stdtypes str replace}@anchor{4b9}
@deffn {메서드} str.replace (old, new, /, count=-1)

Return a copy of the string with all occurrences of substring `old' replaced by
`new'.  If `count' is given, only the first `count' occurrences are replaced.
If `count' is not specified or @code{-1}, then all occurrences are replaced.
For example:

@example
>>> 'spam, spam, spam'.replace('spam', 'eggs')
'eggs, eggs, eggs'
>>> 'spam, spam, spam'.replace('spam', 'eggs', 1)
'eggs, spam, spam'
@end example


버전 3.13에서 변경: `count' is now supported as a keyword argument.

@end deffn

@geindex rfind() (str 메서드)
@anchor{library/stdtypes str rfind}@anchor{10a8}
@deffn {메서드} str.rfind (sub[, start[, end]])

Return the highest index in the string where substring `sub' is found, such
that `sub' is contained within @code{s[start:end]}.  Optional arguments `start'
and `end' are interpreted as in slice notation.  Return @code{-1} on failure.
For example:

@example
>>> 'spam, spam, spam'.rfind('sp')
12
>>> 'spam, spam, spam'.rfind('sp', 0, 10)
6
@end example

See also @ref{10a7,,find()} and @ref{145c,,rindex()}.
@end deffn

@geindex rindex() (str 메서드)
@anchor{library/stdtypes str rindex}@anchor{145c}
@deffn {메서드} str.rindex (sub[, start[, end]])

Like @ref{10a8,,rfind()} but raises @ref{2ec,,ValueError} when the substring `sub' is not
found.
For example:

@example
>>> 'spam, spam, spam'.rindex('spam')
12
>>> 'spam, spam, spam'.rindex('eggs')
Traceback (most recent call last):
  File "<stdin-0>", line 1, in <module>
    'spam, spam, spam'.rindex('eggs')
    ~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^
ValueError: substring not found
@end example

See also @ref{19bc,,index()} and @ref{10a7,,find()}.
@end deffn

@geindex rjust() (str 메서드)
@anchor{library/stdtypes str rjust}@anchor{205f}
@deffn {메서드} str.rjust (width, fillchar=' ', /)

오른쪽으로 정렬된 문자열을 길이 `width' 인 문자열로 돌려줍니다. 지정된 `fillchar' (기본값은 ASCII 스페이스)을 사용하여 채웁니다. `width' 가 @code{len(s)} 보다 작거나 같은 경우 원래 문자열이 반환됩니다.

For example:

@example
>>> 'Python'.rjust(10)
'    Python'
>>> 'Python'.rjust(10, '.')
'....Python'
>>> 'Monty Python'.rjust(10, '.')
'Monty Python'
@end example

See also @ref{2060,,ljust()} and @ref{16b7,,zfill()}.
@end deffn

@geindex rpartition() (str 메서드)
@anchor{library/stdtypes str rpartition}@anchor{145d}
@deffn {메서드} str.rpartition (sep, /)

`sep' 가 마지막으로 나타나는 위치에서 문자열을 나누고, 구분자 앞에 있는 부분, 구분자 자체, 구분자 뒤에 오는 부분으로 구성된 3-튜플을 돌려줍니다. 구분자가 발견되지 않으면, 두 개의 빈 문자열과 그 뒤를 따르는 문자열 자신으로 구성된 3-튜플을 돌려줍니다.

For example:

@example
>>> 'Monty Python'.rpartition(' ')
('Monty', ' ', 'Python')
>>> "Monty Python's Flying Circus".rpartition(' ')
("Monty Python's Flying", ' ', 'Circus')
>>> 'Monty Python'.rpartition('-')
('@w{'}, '@w{'}, 'Monty Python')
@end example

See also @ref{10aa,,partition()}.
@end deffn

@geindex rsplit() (str 메서드)
@anchor{library/stdtypes str rsplit}@anchor{145a}
@deffn {메서드} str.rsplit (sep=None, maxsplit=-1)

`sep' 를 구분자 문자열로 사용하여 문자열에 있는 단어들의 리스트를 돌려줍니다. `maxsplit' 이 주어지면 가장 오른쪽에서 최대 `maxsplit' 번의 분할이 수행됩니다. `sep' 이 지정되지 않거나 @code{None} 이면, 구분자로 모든 공백 문자가 사용됩니다. 오른쪽에서 분리하는 것을 제외하면, @ref{145a,,rsplit()}는 아래에서 자세히 설명될 @ref{10a9,,split()}처럼 동작합니다.
@end deffn

@geindex rstrip() (str 메서드)
@anchor{library/stdtypes str rstrip}@anchor{16b6}
@deffn {메서드} str.rstrip (chars=None, /)

Return a copy of the string with trailing characters removed.  The `chars'
argument is a string specifying the set of characters to be removed.  If omitted
or @code{None}, the `chars' argument defaults to removing whitespace.  The `chars'
argument is not a suffix; rather, all combinations of its values are stripped.
For example:

@example
>>> '   spacious   '.rstrip()
'   spacious'
>>> 'mississippi'.rstrip('ipz')
'mississ'
@end example

See @ref{acd,,removesuffix()} for a method that will remove a single suffix
string rather than all of a set of characters.  For example:

@example
>>> 'Monty Python'.rstrip(' Python')
'M'
>>> 'Monty Python'.removesuffix(' Python')
'Monty'
@end example

See also @ref{16b4,,strip()}.
@end deffn

@geindex split() (str 메서드)
@anchor{library/stdtypes str split}@anchor{10a9}
@deffn {메서드} str.split (sep=None, maxsplit=-1)

`sep' 를 구분자 문자열로 사용하여 문자열에 있는 단어들의 리스트를 돌려줍니다. `maxsplit' 이 주어지면 최대 `maxsplit' 번의 분할이 수행됩니다 (따라서, 리스트는 최대 @code{maxsplit+1} 개의 요소를 가지게 됩니다). `maxsplit' 이 지정되지 않았거나 @code{-1} 이라면 분할 수에 제한이 없습니다 (가능한 모든 분할이 만들어집니다).

If `sep' is given, consecutive delimiters are not grouped together and are
deemed to delimit empty strings (for example, @code{'1,,2'.split(',')} returns
@code{['1', '@w{'}, '2']}).  The `sep' argument may consist of multiple characters
as a single delimiter (to split with multiple delimiters, use
@ref{5a1,,re.split()}). Splitting an empty string with a specified separator
returns @code{['@w{'}]}.

예를 들면:

@example
>>> '1,2,3'.split(',')
['1', '2', '3']
>>> '1,2,3'.split(',', maxsplit=1)
['1', '2,3']
>>> '1,2,,3,'.split(',')
['1', '2', '@w{'}, '3', '@w{'}]
>>> '1<>2<>3<4'.split('<>')
['1', '2', '3<4']
@end example

`sep' 이 지정되지 않거나 @code{None} 이면, 다른 분할 알고리즘이 적용됩니다: 연속된 공백 문자는 단일한 구분자로 간주하고, 문자열이 선행이나 후행 공백을 포함해도 결과는 시작과 끝에 빈 문자열을 포함하지 않습니다. 결과적으로, 빈 문자열이나 공백만으로 구성된 문자열을 @code{None} 구분자로 나누면 @code{[]} 를 돌려줍니다.

예를 들면:

@example
>>> '1 2 3'.split()
['1', '2', '3']
>>> '1 2 3'.split(maxsplit=1)
['1', '2 3']
>>> '   1   2   3   '.split()
['1', '2', '3']
@end example

If `sep' is not specified or is @code{None} and  `maxsplit' is @code{0}, only
leading runs of consecutive whitespace are considered.

예를 들면:

@example
>>> "".split(None, 0)
[]
>>> "   ".split(None, 0)
[]
>>> "   foo   ".split(maxsplit=0)
['foo   ']
@end example

See also @ref{260a,,join()}.
@end deffn

@geindex universal newlines;str.splitlines method

@geindex splitlines() (str 메서드)
@anchor{library/stdtypes str splitlines}@anchor{145b}
@deffn {메서드} str.splitlines (keepends=False)

줄 경계에서 나눈 문자열의 줄 리스트를 돌려줍니다. `keepends' 가 참으로 주어지지 않는 한 결과 리스트에 줄 바꿈은 포함되지 않습니다.

이 메서드는 다음 줄 경계에서 나눕니다. 특히, 경계는 @ref{f34,,유니버설 줄 넘김} 을 포함합니다.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

표현

@tab

설명

@item

@code{\n}

@tab

줄 넘김

@item

@code{\r}

@tab

캐리지 리턴

@item

@code{\r\n}

@tab

캐리지 리턴 + 줄 넘김

@item

@code{\v} 또는 @code{\x0b}

@tab

수직 탭

@item

@code{\f} 또는 @code{\x0c}

@tab

폼 피드

@item

@code{\x1c}

@tab

파일 구분자

@item

@code{\x1d}

@tab

그룹 구분자

@item

@code{\x1e}

@tab

레코드 구분자

@item

@code{\x85}

@tab

다음 줄 (C1 제어 코드)

@item

@code{\u2028}

@tab

줄 구분자

@item

@code{\u2029}

@tab

문단 구분자

@end multitable



버전 3.2에서 변경: @code{\v} 와 @code{\f} 를 줄 경계 목록에 추가했습니다.


예를 들면:

@example
>>> 'ab c\n\nde fg\rkl\r\n'.splitlines()
['ab c', '@w{'}, 'de fg', 'kl']
>>> 'ab c\n\nde fg\rkl\r\n'.splitlines(keepends=True)
['ab c\n', '\n', 'de fg\r', 'kl\r\n']
@end example

구분자 문자열 `sep' 이 주어졌을 때 @ref{10a9,,split()} 와 달리, 이 메서드는 빈 문자열에 대해서 빈 리스트를 돌려주고, 마지막 줄 바꿈은 새 줄을 만들지 않습니다:

@example
>>> "".splitlines()
[]
>>> "One line\n".splitlines()
['One line']
@end example

비교해 보면, @code{split('\n')} 는 이렇게 됩니다:

@example
>>> '@w{'}.split('\n')
['@w{'}]
>>> 'Two lines\n'.split('\n')
['Two lines', '@w{'}]
@end example
@end deffn

@geindex startswith() (str 메서드)
@anchor{library/stdtypes str startswith}@anchor{10ca}
@deffn {메서드} str.startswith (prefix[, start[, end]])

문자열이 지정된 `prefix' 로 시작하면 @code{True} 를 돌려주고, 그렇지 않으면 @code{False} 를 돌려줍니다. `prefix' 는 찾고자 하는 접두사들의 튜플이 될 수도 있습니다. 선택적 `start' 가 제공되면 그 위치에서 검사를 시작합니다. 선택적 `end' 를 사용하면 해당 위치에서 비교를 중단합니다.

For example:

@example
>>> 'Python'.startswith('Py')
True
>>> 'a tuple of prefixes'.startswith(('at', 'a'))
True
>>> 'Python is amazing'.startswith('is', 7)
True
@end example

See also @ref{10cb,,endswith()} and @ref{acc,,removeprefix()}.
@end deffn

@geindex strip() (str 메서드)
@anchor{library/stdtypes str strip}@anchor{16b4}
@deffn {메서드} str.strip (chars=None, /)

Return a copy of the string with the leading and trailing characters removed.
The `chars' argument is a string specifying the set of characters to be removed.
If omitted or @code{None}, the `chars' argument defaults to removing whitespace.
The `chars' argument is not a prefix or suffix; rather, all combinations of its
values are stripped.

For example:

@example
>>> '   spacious   '.strip()
'spacious'
>>> 'www.example.com'.strip('cmowz.')
'example'
@end example

The outermost leading and trailing `chars' argument values are stripped
from the string. Characters are removed from the leading end until
reaching a string character that is not contained in the set of
characters in `chars'. A similar action takes place on the trailing end.

For example:

@example
>>> comment_string = '#....... Section 3.2.1 Issue #32 .......'
>>> comment_string.strip('.#! ')
'Section 3.2.1 Issue #32'
@end example

See also @ref{16b6,,rstrip()}.
@end deffn

@geindex swapcase() (str 메서드)
@anchor{library/stdtypes str swapcase}@anchor{263e}
@deffn {메서드} str.swapcase ()

대문자를 소문자로, 그 반대로 마찬가지로 변환 한 문자열의 복사본을 돌려줍니다. @code{s.swapcase().swapcase() == s} 가 반드시 성립하지 않음에 주의하십시오.
@end deffn

@geindex title() (str 메서드)
@anchor{library/stdtypes str title}@anchor{263c}
@deffn {메서드} str.title ()

단어가 대문자로 시작하고 나머지 문자는 소문자가 되도록 문자열의 제목 케이스 버전을 돌려줍니다.

예를 들면:

@example
>>> 'Hello world'.title()
'Hello World'
@end example

이 알고리즘은 단어를 글자들의 연속으로 보는 간단한 언어 독립적 정의를 사용합니다. 이 정의는 여러 상황에서 작동하지만, 축약과 소유의 아포스트로피가 단어 경계를 형성한다는 것을 의미하고, 이는 원하는 결과가 아닐 수도 있습니다:

@example
>>> "they're bill's friends from the UK".title()
"They'Re Bill'S Friends From The Uk"
@end example

The @ref{2652,,string.capwords()} function does not have this problem, as it
splits words on spaces only.

Alternatively, a workaround for apostrophes can be constructed using regular
expressions:

@example
>>> import re
>>> def titlecase(s):
...     return re.sub(r"[A-Za-z]+('[A-Za-z]+)?",
...                   lambda mo: mo.group(0).capitalize(),
...                   s)
...
>>> titlecase("they're bill's friends.")
"They're Bill's Friends."
@end example

See also @ref{2633,,istitle()}.
@end deffn

@geindex translate() (str 메서드)
@anchor{library/stdtypes str translate}@anchor{2648}
@deffn {메서드} str.translate (table, /)

Return a copy of the string in which each character has been mapped through
the given translation table.  The table must be an object that implements
indexing via @ref{588,,__getitem__()}, typically a @ref{13c0,,mapping} or
@ref{715,,sequence}.  When indexed by a Unicode ordinal (an integer), the
table object can do any of the following: return a Unicode ordinal or a
string, to map the character to one or more other characters; return
@code{None}, to delete the character from the return string; or raise a
@ref{23e5,,LookupError} exception, to map the character to itself.

@ref{fd8,,str.maketrans()} 를 사용하여 다른 형식의 문자 대 문자 매핑으로 부터 변환 맵을 만들 수 있습니다.

커스텀 문자 매핑에 대한 보다 유연한 접근법은 @ref{1c,,codecs} 모듈을 참고하십시오.
@end deffn

@geindex upper() (str 메서드)
@anchor{library/stdtypes str upper}@anchor{2638}
@deffn {메서드} str.upper ()

모든 케이스 문자 @footnote{
케이스 문자는 일반 범주 속성이 “Lu” (Letter, 대문자), “Ll” (Letter, 소문자), “Lt” (Letter, 제목 문자) 중 한 가지인 경우입니다.
} 가 대문자로 변환된 문자열의 복사본을 돌려줍니다. @code{s} 가 케이스 없는 문자를 포함하거나 결과 문자의 유니코드 범주가 “Lu” (Letter, 대문자) 가 아닌 경우, 예를 들어 “Lt” (Letter, 제목 케이스), @code{s.upper().isupper()} 가 @code{False} 일 수 있음에 주의하십시오.

The uppercasing algorithm used is
described in section 3.13 'Default Case Folding' of the Unicode Standard@footnote{https://www.unicode.org/versions/Unicode16.0.0/core-spec/chapter-3/#G33992}.
@end deffn

@geindex zfill() (str 메서드)
@anchor{library/stdtypes str zfill}@anchor{16b7}
@deffn {메서드} str.zfill (width, /)

길이가 `width' 인 문자열을 만들기 위해 ASCII @code{'0'} 문자를 왼쪽에 채운 문자열의 복사본을 돌려줍니다. 선행 부호 접두어(@code{'+'}/@code{'-'})는 부호 문자의 앞이 아니라 `뒤' 에 채워 넣는 것으로 처리됩니다. `width' 가 @code{len(s)} 보다 작거나 같은 경우 원래 문자열을 돌려줍니다.

For example:

@example
>>> "42".zfill(5)
'00042'
>>> "-42".zfill(5)
'-0042'
@end example

See also @ref{205f,,rjust()}.
@end deffn

@geindex ! formatted string literal
@geindex formatted string literals
@geindex ! f-string
@geindex f-strings
@geindex fstring
@geindex interpolated string literal
@geindex string;formatted literal
@geindex string;interpolated literal
@geindex @{@} (curly brackets);in formatted string literal
@geindex ! (exclamation mark);in formatted string literal
@geindex ; (colon);in formatted string literal
@geindex = (equals);for help in debugging using string literals

@node Formatted String Literals f-strings,Template String Literals t-strings,문자열 메서드,텍스트 시퀀스 형 — str
@anchor{library/stdtypes formatted-string-literals-f-strings}@anchor{2653}@anchor{library/stdtypes stdtypes-fstrings}@anchor{22e8}
@subsubsection Formatted String Literals (f-strings)



Added in version 3.6.



버전 3.7에서 변경: The @ref{18d,,await} and @ref{c9f,,async for} can be used in expressions
within f-strings.



버전 3.8에서 변경: Added the debug specifier (@code{=})



버전 3.12에서 변경: Many restrictions on expressions within f-strings have been removed.
Notably, nested strings, comments, and backslashes are now permitted.


An `f-string' (formally a `formatted string literal') is
a string literal that is prefixed with @code{f} or @code{F}.
This type of string literal allows embedding the results of arbitrary Python
expressions within `replacement fields', which are delimited by curly
brackets (@code{@{@}}).
Each replacement field must contain an expression, optionally followed by:


@itemize *

@item 
a `debug specifier' – an equal sign (@code{=});

@item 
a `conversion specifier' – @code{!s}, @code{!r} or @code{!a}; and/or

@item 
a `format specifier' prefixed with a colon (@code{:}).
@end itemize

See the @ref{19a,,Lexical Analysis section on f-strings} for details
on the syntax of these fields.

@menu
* Debug specifier:: 
* Conversion specifier:: 
* Format specifier:: 

@end menu

@node Debug specifier,Conversion specifier,,Formatted String Literals f-strings
@anchor{library/stdtypes debug-specifier}@anchor{2654}
@subsubsection Debug specifier



Added in version 3.8.


If a debug specifier – an equal sign (@code{=}) – appears after the replacement
field expression, the resulting f-string will contain the expression’s source,
the equal sign, and the value of the expression.
This is often useful for debugging:

@example
>>> number = 14.3
>>> f'@{number=@}'
'number=14.3'
@end example

Whitespace before, inside and after the expression, as well as whitespace
after the equal sign, is significant — it is retained in the result:

@example
>>> f'@{ number  -  4  = @}'
' number  -  4  = 10.3'
@end example

@node Conversion specifier,Format specifier,Debug specifier,Formatted String Literals f-strings
@anchor{library/stdtypes conversion-specifier}@anchor{2655}
@subsubsection Conversion specifier


By default, the value of a replacement field expression is converted to
a string using @ref{169,,str()}:

@example
>>> from fractions import Fraction
>>> one_third = Fraction(1, 3)
>>> f'@{one_third@}'
'1/3'
@end example

When a debug specifier but no format specifier is used, the default conversion
instead uses @ref{1c1,,repr()}:

@example
>>> f'@{one_third = @}'
'one_third = Fraction(1, 3)'
@end example

The conversion can be specified explicitly using one of these specifiers:


@itemize *

@item 
@code{!s} for @ref{169,,str()}

@item 
@code{!r} for @ref{1c1,,repr()}

@item 
@code{!a} for @ref{15eb,,ascii()}
@end itemize

예를 들면:

@example
>>> str(one_third)
'1/3'
>>> repr(one_third)
'Fraction(1, 3)'

>>> f'@{one_third!s@} is @{one_third!r@}'
'1/3 is Fraction(1, 3)'

>>> string = "¡kočka 😸!"
>>> ascii(string)
"'\\xa1ko\\u010dka \\U0001f638!'"

>>> f'@{string = !a@}'
"string = '\\xa1ko\\u010dka \\U0001f638!'"
@end example

@node Format specifier,,Conversion specifier,Formatted String Literals f-strings
@anchor{library/stdtypes format-specifier}@anchor{2656}
@subsubsection Format specifier


After the expression has been evaluated, and possibly converted using an
explicit conversion specifier, it is formatted using the @ref{199,,format()} function.
If the replacement field includes a `format specifier' introduced by a colon
(@code{:}), the specifier is passed to @code{format()} as the second argument.
The result of @code{format()} is then used as the final value for the
replacement field. For example:

@example
>>> from fractions import Fraction
>>> one_third = Fraction(1, 3)
>>> f'@{one_third:.6f@}'
'0.333333'
>>> f'@{one_third:_^+10@}'
'___+1/3___'
>>> >>> f'@{one_third!r:_^20@}'
'___Fraction(1, 3)___'
>>> f'@{one_third = :~>10@}~'
'one_third = ~~~~~~~1/3~'
@end example

@node Template String Literals t-strings,printf 스타일 문자열 포매팅,Formatted String Literals f-strings,텍스트 시퀀스 형 — str
@anchor{library/stdtypes stdtypes-tstrings}@anchor{22ec}@anchor{library/stdtypes template-string-literals-t-strings}@anchor{2657}
@subsubsection Template String Literals (t-strings)


An `t-string' (formally a `template string literal') is
a string literal that is prefixed with @code{t} or @code{T}.

These strings follow the same syntax and evaluation rules as
@ref{22e8,,formatted string literals},
with for the following differences:


@itemize *

@item 
Rather than evaluating to a @code{str} object, template string literals evaluate
to a @ref{16a,,string.templatelib.Template} object.

@item 
The @ref{199,,format()} protocol is not used.
Instead, the format specifier and conversions (if any) are passed to
a new @ref{16b,,Interpolation} object that is created
for each evaluated expression.
It is up to code that processes the resulting @ref{16a,,Template}
object to decide how to handle format specifiers and conversions.

@item 
Format specifiers containing nested replacement fields are evaluated eagerly,
prior to being passed to the @ref{16b,,Interpolation} object.
For instance, an interpolation of the form @code{@{amount:.@{precision@}f@}} will
evaluate the inner expression @code{@{precision@}} to determine the value of the
@code{format_spec} attribute.
If @code{precision} were to be @code{2}, the resulting format specifier
would be @code{'.2f'}.

@item 
When the equals sign @code{'='} is provided in an interpolation expression,
the text of the expression is appended to the literal string that precedes
the relevant interpolation.
This includes the equals sign and any surrounding whitespace.
The @code{Interpolation} instance for the expression will be created as
normal, except that @ref{2658,,conversion} will
be set to ‘@code{r}’ (@ref{1c1,,repr()}) by default.
If an explicit conversion or format specifier are provided,
this will override the default behaviour.
@end itemize

@node printf 스타일 문자열 포매팅,,Template String Literals t-strings,텍스트 시퀀스 형 — str
@anchor{library/stdtypes old-string-formatting}@anchor{8da}@anchor{library/stdtypes printf-style-string-formatting}@anchor{2659}
@subsubsection @code{printf} 스타일 문자열 포매팅


@geindex formatting@comma{} string (%)
@geindex interpolation@comma{} string (%)
@geindex string;formatting@comma{} printf
@geindex string;interpolation@comma{} printf
@geindex printf-style formatting
@geindex sprintf-style formatting
@geindex % (percent);printf-style formatting

@cartouche
@quotation 참고 
The formatting operations described here exhibit a variety of quirks that
lead to a number of common errors (such as failing to display tuples and
dictionaries correctly).

Using @ref{19a,,formatted string literals}, the @ref{832,,str.format()}
interface, or @ref{896,,string.Template} may help avoid these errors.
Each of these alternatives provides their own trade-offs and benefits of
simplicity, flexibility, and/or extensibility.
@end quotation
@end cartouche

String objects have one unique built-in operation: the @code{%} operator (modulo).
This is also known as the string `formatting' or `interpolation' operator.
Given @code{format % values} (where `format' is a string), @code{%} conversion
specifications in `format' are replaced with zero or more elements of `values'.
The effect is similar to using the @code{sprintf()} function in the C language.
For example:

@example
>>> print('%s has %d quote types.' % ('Python', 2))
Python has 2 quote types.
@end example

`format' 이 하나의 인자를 요구하면, `values' 는 하나의 비 튜플 객체 일 수 있습니다. @footnote{
그래서, 튜플만을 포매팅하려면 포맷할 튜플 하나만을 포함하는 1-튜플을 제공해야 합니다.
} 그렇지 않으면, `values' 는 format 문자열이 지정하는 항목의 수와 같은 튜플이거나 단일 매핑 객체 (예를 들어, 딕셔너리) 이어야 합니다.

@geindex () (parentheses);in printf-style formatting
@geindex * (asterisk);in printf-style formatting
@geindex . (dot);in printf-style formatting

변환 명세는 두 개 이상의 문자를 포함하며 다음과 같은 구성 요소들을 포함하는데, 반드시 이 순서대로 나와야 합니다:


@enumerate 

@item 
@code{'%'} 문자: 명세의 시작을 나타냅니다.

@item 
매핑 키 (선택 사항): 괄호로 둘러싸인 문자들의 시퀀스로 구성됩니다 (예를 들어, @code{(somename)}).

@item 
변환 플래그 (선택 사항): 일부 변환 유형의 결과에 영향을 줍니다.

@item 
최소 필드 폭 (선택 사항): @code{'*'} (애스터리스크) 로 지정하면, 실제 폭은 `values' 튜플의 다음 요소에서 읽히고, 변환할 객체는 최소 필드 폭과 선택적 정밀도 뒤에 옵니다.

@item 
정밀도 (선택 사항): @code{'.'} (점) 다음에 정밀도가 옵니다. @code{'*'} (애스터리스크) 로 지정하면, 실제 정밀도는 `values' 튜플의 다음 요소에서 읽히고, 변환할 값은 정밀도 뒤에 옵니다.

@item 
길이 수정자 (선택 사항).

@item 
변환 유형.
@end enumerate

오른쪽 인자가 딕셔너리 (또는 다른 매핑 형) 인 경우, 문자열에 있는 변환 명세는 `반드시' @code{'%'} 문자 바로 뒤에 그 딕셔너리의 매핑 키를 괄호로 둘러싼 형태로 포함해야 합니다. 매핑 키는 포맷할 값을 매핑으로 부터 선택합니다. 예를 들어:

@example
>>> print('%(language)s has %(number)03d quote types.' %
...       @{'language': "Python", "number": 2@})
Python has 002 quote types.
@end example

이 경우 @code{*} 지정자를 사용할 수 없습니다 (순차적인 매개변수 목록이 필요하기 때문입니다).

변환 플래그 문자는 다음과 같습니다:

@geindex # (hash);in printf-style formatting
@geindex - (minus);in printf-style formatting
@geindex + (plus);in printf-style formatting
@geindex space;in printf-style formatting


@multitable {xxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

플래그

@tab

뜻

@item

@code{'#'}

@tab

값 변환에 “대체 형식” (아래에 정의되어있습니다) 을 사용합니다.

@item

@code{'0'}

@tab

변환은 숫자 값의 경우 0으로 채웁니다.

@item

@code{'-'}

@tab

변환된 값은 왼쪽으로 정렬됩니다 (둘 다 주어지면 @code{'0'} 변환보다 우선 합니다).

@item

@code{' '}

@tab

(스페이스) 부호 있는 변환 때문에 만들어진 양수 앞에 빈칸을 남겨둡니다 (음수면 빈 문자열입니다).

@item

@code{'+'}

@tab

부호 문자 (@code{'+'} or @code{'-'}) 가 변환 앞에 놓입니다 (@code{' '} 플래그에 우선합니다).

@end multitable


길이 수정자 (@code{h}, @code{l}, @code{L}) 를 제공할 수는 있지만, 파이썬에서 필요하지 않기 때문에 무시됩니다 – 예를 들어 @code{%ld} 는 @code{%d} 와 같습니다.

변환 유형은 다음과 같습니다:


@multitable {xxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxx} 
@headitem

변환

@tab

뜻

@tab

노트

@item

@code{'d'}

@tab

부호 있는 정수 십진 표기.

@tab

@item

@code{'i'}

@tab

부호 있는 정수 십진 표기.

@tab

@item

@code{'o'}

@tab

부호 있는 8진수 값.

@tab

(1)

@item

@code{'u'}

@tab

쓸데없는 유형 – @code{'d'} 와 같습니다.

@tab

(6)

@item

@code{'x'}

@tab

부호 있는 16진수 (소문자).

@tab

(2)

@item

@code{'X'}

@tab

부호 있는 16진수 (대문자).

@tab

(2)

@item

@code{'e'}

@tab

Floating-point exponential format (lowercase).

@tab

(3)

@item

@code{'E'}

@tab

Floating-point exponential format (uppercase).

@tab

(3)

@item

@code{'f'}

@tab

Floating-point decimal format.

@tab

(3)

@item

@code{'F'}

@tab

Floating-point decimal format.

@tab

(3)

@item

@code{'g'}

@tab

Floating-point format. Uses lowercase exponential
format if exponent is less than -4 or not less than
precision, decimal format otherwise.

@tab

(4)

@item

@code{'G'}

@tab

Floating-point format. Uses uppercase exponential
format if exponent is less than -4 or not less than
precision, decimal format otherwise.

@tab

(4)

@item

@code{'c'}

@tab

단일 문자 (정수 또는 길이 1인 문자열을 허용합니다).

@tab

@item

@code{'r'}

@tab

문자열 (@ref{1c1,,repr()}을 사용하여 파이썬 객체를 변환합니다).

@tab

(5)

@item

@code{'s'}

@tab

문자열 (@ref{169,,str()} 을 사용하여 파이썬 객체를 변환합니다).

@tab

(5)

@item

@code{'a'}

@tab

문자열 (@ref{15eb,,ascii()} 를 사용하여 파이썬 객체를 변환합니다).

@tab

(5)

@item

@code{'%'}

@tab

인자는 변환되지 않고, 결과에 @code{'%'} 문자가 표시됩니다.

@tab

@end multitable


For floating-point formats, the result should be correctly rounded to a given
precision @code{p} of digits after the decimal point.  The rounding mode matches
that of the @ref{14df,,round()} builtin.

노트:


@enumerate 

@item 
대체 형식은 첫 번째 숫자 앞에 선행 8진수 지정자 (@code{'0o'})를 삽입합니다.

@item 
대체 형식은 첫 번째 숫자 앞에 선행 @code{'0x'} 또는 @code{'0X'} (@code{'x'} 나 @code{'X'} 유형 중 어느 것을 사용하느냐에 따라 달라집니다) 를 삽입합니다.

@item 
대체 형식은 그 뒤에 숫자가 나오지 않더라도 항상 소수점을 포함합니다.

정밀도는 소수점 이하 자릿수를 결정하며 기본값은 6입니다.

@item 
대체 형식은 결과에 항상 소수점을 포함하고 뒤에 오는 0은 제거되지 않습니다.

정밀도는 소수점 앞뒤의 유효 자릿수를 결정하며 기본값은 6입니다.

@item 
정밀도가 @code{N} 이라면, 출력은 @code{N} 문자로 잘립니다.

@item 
@geindex Python 향상 제안; PEP 237
PEP 237@footnote{https://peps.python.org/pep-0237/}을 참조하세요.
@end enumerate

파이썬 문자열은 명시적인 길이를 가지고 있으므로, @code{%s} 변환은 문자열의 끝이 @code{'\0'} 이라고 가정하지 않습니다.

@c XXX Examples?


버전 3.1에서 변경: 절댓값이 1e50 을 넘는 숫자에 대한 @code{%f} 변환은 더는 @code{%g} 변환으로 대체되지 않습니다.


@geindex buffer protocol;binary sequence types

@node 바이너리 시퀀스 형 — bytes bytearray memoryview,집합 형 — set frozenset,텍스트 시퀀스 형 — str,내장형
@anchor{library/stdtypes binary-sequence-types-bytes-bytearray-memoryview}@anchor{265a}@anchor{library/stdtypes binaryseq}@anchor{25c4}
@subsection 바이너리 시퀀스 형 — @code{bytes}, @code{bytearray}, @code{memoryview}


@geindex object;bytes
@geindex object;bytearray
@geindex object;memoryview
@geindex module;array

바이너리 데이터를 조작하기 위한 핵심 내장형은 @ref{192,,bytes} 와 @ref{344,,bytearray} 입니다. 이것들은 @ref{165,,memoryview} 에 의해 지원되는데, 다른 바이너리 객체들의 메모리에 복사 없이 접근하기 위해 @ref{260,,버퍼 프로토콜} 을 사용합니다.

@ref{8,,array} 모듈은 32-비트 정수와 IEEE754 배정도 부동 소수점 같은 기본 데이터형의 효율적인 저장을 지원합니다.

@menu
* 바이트열 객체:: 
* 바이트 배열 객체:: 
* 바이트열 과 바이트 배열 연산:: 
* printf 스타일 바이너리 포매팅:: 
* 메모리 뷰:: 

@end menu

@node 바이트열 객체,바이트 배열 객체,,바이너리 시퀀스 형 — bytes bytearray memoryview
@anchor{library/stdtypes bytes-objects}@anchor{265b}@anchor{library/stdtypes typebytes}@anchor{25c6}
@subsubsection 바이트열 객체


@geindex object;bytes

바이트열 객체는 단일 바이트들의 불변 시퀀스입니다. 많은 주요 바이너리 프로토콜이 ASCII 텍스트 인코딩을 기반으로 하므로, 바이트열 객체는 ASCII 호환 데이터로 작업 할 때만 유효한 여러 가지 메서드를 제공하며 다양한 다른 방법으로 문자열 객체와 밀접한 관련이 있습니다.

@geindex bytes (내장 클래스)
@anchor{library/stdtypes bytes}@anchor{192}
@deffn {클래스} bytes (source=b'@w{'})

@deffnx {클래스} bytes (source, encoding, errors='strict')

첫째로, 바이트열 리터럴의 문법은 문자열 리터럴과 거의 같지만 @code{b} 접두사가 추가된다는 점이 다릅니다.:


@itemize *

@item 
작은따옴표: @code{b'still allows embedded "double" quotes'}

@item 
Double quotes: @code{b"still allows embedded 'single' quotes"}

@item 
삼중 따옴표: @code{b'@w{'}'3 single quotes'@w{'}'}, @code{b"""3 double quotes"""}
@end itemize

바이트열 리터럴에는 ASCII 문자만 허용됩니다 (선언된 소스 코드 인코딩과 관계없습니다). 127 보다 큰 바이너리 값은 적절한 이스케이프 시퀀스를 사용하여 바이트열 리터럴에 입력해야 합니다.

문자열 리터럴의 경우와 마찬가지로 바이트열 리터럴은 이스케이프 시퀀스 처리를 비활성화하기 위해 @code{r} 접두사를 사용할 수도 있습니다. 지원되는 이스케이프 시퀀스를 포함하여 바이트열 리터럴의 다양한 형식에 대한 자세한 내용은 @ref{229c,,문자열과 바이트열 리터럴} 을 참조하십시오.

바이트열 리터럴과 그 표현은 ASCII 텍스트를 기반으로 하지만, 바이트열 객체는 실제로는 정수의 불변 시퀀스처럼 동작하고, 시퀀스의 각 값은 @code{0 <= x < 256} 이 되도록 제한됩니다 (이 제한을 위반하려고 시도하면 @ref{2ec,,ValueError} 를 일으킵니다). 이것은 많은 바이너리 형식이 ASCII 기반 요소를 포함하고 일부 텍스트 지향 알고리즘으로 유용하게 조작될 수 있지만, 임의의 바이너리 데이터에 일반적으로 적용될 수는 없음을 강조하기 위한 것입니다 (텍스트 처리 알고리즘을 맹목적으로 ASCII 호환이 아닌 바이너리 데이터 형식에 적용하면 대개 데이터 손상으로 이어집니다).

리터럴 형식 외에도, 바이트열 객체는 여러 가지 다른 방법으로 만들 수 있습니다.:


@itemize *

@item 
지정된 길이의 0으로 채워진 바이트열 객체: @code{bytes(10)}

@item 
정수의 이터러블로부터: @code{bytes(range(20))}

@item 
버퍼 프로토콜을 통해 기존 바이너리 데이터 복사: @code{bytes(obj)}
@end itemize

내장 @ref{1e96,,bytes} 도 참조하세요.

2개의 16진수는 정확히 하나의 바이트에 대응하기 때문에 16진수는 바이너리 데이터를 설명하는 데 일반적으로 사용되는 형식입니다. 따라서, 바이트열 형은 그 형식의 데이터를 읽는 추가의 클래스 메서드를 갖습니다:

@geindex fromhex() (bytes의 클래스 메서드)
@anchor{library/stdtypes bytes fromhex}@anchor{190}
@deffn {메서드} classmethod fromhex (string, /)

이 @ref{192,,bytes} 클래스 메서드는 주어진 문자열 객체를 디코딩해서 바이트열 객체를 돌려줍니다. 문자열은 바이트 당 두 개의 16진수가 포함되어야 하며 ASCII 공백은 무시됩니다.

@example
>>> bytes.fromhex('2Ef0 F1f2  ')
b'.\xf0\xf1\xf2'
@end example


버전 3.7에서 변경: 이제 @ref{190,,bytes.fromhex()} 는 스페이스뿐만 아니라 문자열에 있는 모든 ASCII 공백을 건너뜁니다.



버전 3.14에서 변경: @code{bytes.fromhex()} now accepts ASCII @ref{192,,bytes} and
@ref{193,,bytes-like objects} as input.

@end deffn

바이트열 객체를 16진수 표현으로 변환하기 위한 역변환 함수가 있습니다.

@geindex hex() (bytes 메서드)
@anchor{library/stdtypes bytes hex}@anchor{f64}
@deffn {메서드} hex (*, bytes_per_sep=1)

@deffnx {메서드} hex (sep, bytes_per_sep=1)

인스턴스의 바이트마다 2 자릿수의 16진수로 표현한 문자열 객체를 돌려줍니다.

@example
>>> b'\xf0\xf1\xf2'.hex()
'f0f1f2'
@end example

If you want to make the hex string easier to read, you can specify a
single character separator `sep' parameter to include in the output.
By default, this separator will be included between each byte.
A second optional `bytes_per_sep' parameter controls the spacing.
Positive values calculate the separator position from the right,
negative values from the left.

@example
>>> value = b'\xf0\xf1\xf2'
>>> value.hex('-')
'f0-f1-f2'
>>> value.hex('_', 2)
'f0_f1f2'
>>> b'UUDDLRLRAB'.hex(' ', -4)
'55554444 4c524c52 4142'
@end example


Added in version 3.5.



버전 3.8에서 변경: 이제 @ref{f64,,bytes.hex()}는 16진수 출력의 바이트 사이에 구분 기호를 삽입하기 위해 선택적 `sep'과 `bytes_per_sep' 매개 변수를 지원합니다.

@end deffn
@end deffn

바이트열 객체는 정수의 시퀀스(튜플과 유사)이기 때문에, 바이트열 객체 `b' 에 대해서, @code{b[0]} 는 정수가 됩니다. 반면, @code{b[0:1]} 는 길이 1인 바이트열 객체가 됩니다. (이것은 인덱싱과 슬라이싱 모두 길이 1인 문자열을 생성하는 텍스트 문자열과 대조됩니다)

바이트열 객체의 표현은 리터럴 형식 (@code{b'...'}) 을 사용하는데, 종종 @code{bytes([46, 46, 46])} 보다 유용하기 때문입니다. @code{list(b)} 를 사용하면 바이트열 객체를 항상 정수 리스트로 변환할 수 있습니다.

@node 바이트 배열 객체,바이트열 과 바이트 배열 연산,바이트열 객체,바이너리 시퀀스 형 — bytes bytearray memoryview
@anchor{library/stdtypes bytearray-objects}@anchor{265c}@anchor{library/stdtypes typebytearray}@anchor{25c5}
@subsubsection 바이트 배열 객체


@geindex object;bytearray

@ref{344,,bytearray} 객체는 @ref{192,,bytes} 객체의 가변형입니다.

@geindex bytearray (내장 클래스)
@anchor{library/stdtypes bytearray}@anchor{344}
@deffn {클래스} bytearray (source=b'@w{'})

@deffnx {클래스} bytearray (source, encoding, errors='strict')

바이트 배열 객체에 대한 전용 리터럴 문법은 없으며 항상 생성자를 호출하여 만듭니다:


@itemize *

@item 
빈 인스턴스 만들기: @code{bytearray()}

@item 
주어진 길이의 0으로 채워진 인스턴스 만들기: @code{bytearray(10)}

@item 
정수의 이터러블로부터: @code{bytearray(range(20))}

@item 
버퍼 프로토콜을 통해 기존 바이너리 데이터 복사: @code{bytearray(b'Hi!')}
@end itemize

바이트 배열 객체는 가변이기 때문에, @ref{25c2,,바이트열 과 바이트 배열 연산} 에 설명되어있는 공통 바이트열과 바이트 배열 연산에 더해, @ref{25c3,,가변} 시퀀스 연산도 지원합니다.

내장 @ref{1e97,,bytearray} 도 참조하세요.

2개의 16진수는 정확히 하나의 바이트에 대응하기 때문에 16진수는 바이너리 데이터를 설명하는 데 일반적으로 사용되는 형식입니다. 따라서, 바이트 배열형은 그 형식의 데이터를 읽는 추가의 클래스 메서드를 갖습니다:

@geindex fromhex() (bytearray의 클래스 메서드)
@anchor{library/stdtypes bytearray fromhex}@anchor{191}
@deffn {메서드} classmethod fromhex (string, /)

이 @ref{344,,bytearray} 클래스 메서드는 주어진 문자열 객체를 디코딩해서 바이트 배열 객체를 돌려줍니다. 문자열은 바이트 당 두 개의 16진수가 포함되어야 하며 ASCII 공백은 무시됩니다.

@example
>>> bytearray.fromhex('2Ef0 F1f2  ')
bytearray(b'.\xf0\xf1\xf2')
@end example


버전 3.7에서 변경: 이제 @ref{191,,bytearray.fromhex()} 는 스페이스뿐만 아니라 문자열에 있는 모든 ASCII 공백을 건너뜁니다.



버전 3.14에서 변경: @code{bytearray.fromhex()} now accepts ASCII @ref{192,,bytes} and
@ref{193,,bytes-like objects} as input.

@end deffn

바이트 배열 객체를 16진수 표현으로 변환하기 위한 역변환 함수가 있습니다.

@geindex hex() (bytearray 메서드)
@anchor{library/stdtypes bytearray hex}@anchor{f65}
@deffn {메서드} hex (*, bytes_per_sep=1)

@deffnx {메서드} hex (sep, bytes_per_sep=1)

인스턴스의 바이트마다 2 자릿수의 16진수로 표현한 문자열 객체를 돌려줍니다.

@example
>>> bytearray(b'\xf0\xf1\xf2').hex()
'f0f1f2'
@end example


Added in version 3.5.



버전 3.8에서 변경: @ref{f64,,bytes.hex()}와 비슷하게, 이제 @ref{f65,,bytearray.hex()}는 16진수 출력의 바이트 사이에 구분 기호를 삽입하기 위해 선택적 `sep'과 `bytes_per_sep' 매개 변수를 지원합니다.

@end deffn

@geindex resize() (bytearray 메서드)
@anchor{library/stdtypes bytearray resize}@anchor{1771}
@deffn {메서드} resize (size, /)

Resize the @code{bytearray} to contain `size' bytes. `size' must be
greater than or equal to 0.

If the @code{bytearray} needs to shrink, bytes beyond `size' are truncated.

If the @code{bytearray} needs to grow, all new bytes, those beyond `size',
will be set to null bytes.

This is equivalent to:

@example
>>> def resize(ba, size):
...     if len(ba) > size:
...         del ba[size:]
...     else:
...         ba += b'\0' * (size - len(ba))
@end example

Examples:

@example
>>> shrink = bytearray(b'abc')
>>> shrink.resize(1)
>>> (shrink, len(shrink))
(bytearray(b'a'), 1)
>>> grow = bytearray(b'abc')
>>> grow.resize(5)
>>> (grow, len(grow))
(bytearray(b'abc\x00\x00'), 5)
@end example


Added in version 3.14.

@end deffn
@end deffn

바이트 배열 객체는 정수의 시퀀스(리스트와 유사)이기 때문에, 바이트 배열 객체 `b' 에 대해서, @code{b[0]} 는 정수가 됩니다. 반면, @code{b[0:1]} 는 길이 1인 바이트 배열 객체가 됩니다. (이것은 인덱싱과 슬라이싱 모두 길이 1인 문자열을 생성하는 텍스트 문자열과 대조됩니다)

바이트 배열 객체의 표현은 바이트열 리터럴 형식 (@code{bytearray(b'...')}) 을 사용하는데, 종종 @code{bytearray([46, 46, 46])} 보다 유용하기 때문입니다. @code{list(b)} 를 사용하면 바이트 배열 객체를 항상 정수 리스트로 변환할 수 있습니다.


@subsubheading 더 보기


For detailed information on thread-safety guarantees for @ref{344,,bytearray}
objects, see @ref{265d,,Thread safety for bytearray objects}.


@node 바이트열 과 바이트 배열 연산,printf 스타일 바이너리 포매팅,바이트 배열 객체,바이너리 시퀀스 형 — bytes bytearray memoryview
@anchor{library/stdtypes bytes-and-bytearray-operations}@anchor{265e}@anchor{library/stdtypes bytes-methods}@anchor{25c2}
@subsubsection 바이트열 과 바이트 배열 연산


@geindex bytes;methods
@geindex bytearray;methods

바이트열와 바이트 배열 객체는 @ref{2608,,공통} 시퀀스 연산을 지원합니다. 이것들은 같은 형의 피연산자뿐만 아니라 모든 @ref{193,,bytes-like object}와 상호 운용됩니다. 이러한 유연성으로 인해, 오류 없이 작업을 자유롭게 혼합할 수 있습니다. 그러나, 결과의 반환형은 피연산자의 순서에 따라 달라질 수 있습니다.

@cartouche
@quotation 참고 
바이트열 및 바이트 배열 객체의 메서드는 인자로 문자열을 받아들이지 않습니다, 문자열의 메서드가 바이트열을 인자로 허용하지 않는 것과 마찬가지입니다. 예를 들어, 다음과 같이 작성해야 합니다:

@example
a = "abc"
b = a.replace("a", "f")
@end example

그리고:

@example
a = b"abc"
b = a.replace(b"a", b"f")
@end example
@end quotation
@end cartouche

일부 바이트열 및 바이트 배열 연산은 ASCII 호환 바이너리 형식을 가정하므로, 임의의 바이너리 데이터로 작업 할 때는 피해야 합니다. 이러한 제한 사항은 아래에서 다룹니다.

@cartouche
@quotation 참고 
이러한 ASCII 기반 연산을 사용하여 ASCII 기반 형식으로 저장되지 않은 바이너리 데이터를 조작하면 데이터가 손상될 수 있습니다.
@end quotation
@end cartouche

바이트열 및 바이트 배열 객체에 대한 다음 메서드는 임의의 바이너리 데이터와 함께 사용할 수 있습니다.

@geindex count() (bytes 메서드)
@geindex count() (bytearray 메서드)
@anchor{library/stdtypes bytes count}@anchor{1983}
@deffn {메서드} bytes.count (sub[, start[, end]])
@anchor{library/stdtypes bytearray count}@anchor{179c}
@deffnx {메서드} bytearray.count (sub[, start[, end]])

범위 [`start', `end'] 에서 서브 시퀀스 `sub' 가 중첩되지 않고 등장하는 횟수를 돌려줍니다. 선택적 인자 `start' 와 `end' 는 슬라이스 표기법으로 해석됩니다.

검색할 서브 시퀀스는 임의의 @ref{193,,bytes-like object} 또는 0에서 255 사이의 정수일 수 있습니다.

If `sub' is empty, returns the number of empty slices between characters
which is the length of the bytes object plus one.


버전 3.3에서 변경: 서브 시퀀스로 0에서 255 사이의 정수도 허용합니다.

@end deffn

@geindex removeprefix() (bytes 메서드)
@geindex removeprefix() (bytearray 메서드)
@anchor{library/stdtypes bytes removeprefix}@anchor{265f}
@deffn {메서드} bytes.removeprefix (prefix, /)
@anchor{library/stdtypes bytearray removeprefix}@anchor{2660}
@deffnx {메서드} bytearray.removeprefix (prefix, /)

바이너리 데이터가 `prefix' 문자열로 시작하면, @code{bytes[len(prefix):]}를 반환합니다. 그렇지 않으면, 원래 바이너리 데이터의 사본을 반환합니다:

@example
>>> b'TestHook'.removeprefix(b'Test')
b'Hook'
>>> b'BaseTestCase'.removeprefix(b'Test')
b'BaseTestCase'
@end example

`prefix'는 임의의 @ref{193,,바이트열류 객체} 일 수 있습니다.

@cartouche
@quotation 참고 
이 메서드의 바이트 배열 버전은 제자리에서 동작하지 `않습니다' - 변경되지 않는 경우조차 항상 새 객체를 만듭니다.
@end quotation
@end cartouche


Added in version 3.9.

@end deffn

@geindex removesuffix() (bytes 메서드)
@geindex removesuffix() (bytearray 메서드)
@anchor{library/stdtypes bytes removesuffix}@anchor{2661}
@deffn {메서드} bytes.removesuffix (suffix, /)
@anchor{library/stdtypes bytearray removesuffix}@anchor{2662}
@deffnx {메서드} bytearray.removesuffix (suffix, /)

바이너리 데이터가 `suffix' 문자열로 끝나고 해당 `suffix'가 비어 있지 않으면 @code{bytes[:-len(suffix)]}를 반환합니다. 그렇지 않으면, 원래 바이너리 데이터의 사본을 반환합니다:

@example
>>> b'MiscTests'.removesuffix(b'Tests')
b'Misc'
>>> b'TmpDirMixin'.removesuffix(b'Tests')
b'TmpDirMixin'
@end example

`suffix'는 임의의 @ref{193,,바이트열류 객체} 일 수 있습니다.

@cartouche
@quotation 참고 
이 메서드의 바이트 배열 버전은 제자리에서 동작하지 `않습니다' - 변경되지 않는 경우조차 항상 새 객체를 만듭니다.
@end quotation
@end cartouche


Added in version 3.9.

@end deffn

@geindex decode() (bytes 메서드)
@geindex decode() (bytearray 메서드)
@anchor{library/stdtypes bytes decode}@anchor{ad3}
@deffn {메서드} bytes.decode (encoding='utf-8', errors='strict')
@anchor{library/stdtypes bytearray decode}@anchor{2663}
@deffnx {메서드} bytearray.decode (encoding='utf-8', errors='strict')

Return the bytes decoded to a @ref{169,,str}.

`encoding' defaults to @code{'utf-8'};
see @ref{fb7,,표준 인코딩} for possible values.

`errors' controls how decoding errors are handled.
If @code{'strict'} (the default), a @ref{462,,UnicodeError} exception is raised.
Other possible values are @code{'ignore'}, @code{'replace'},
and any other name registered via @ref{16a0,,codecs.register_error()}.
See @ref{1b6d,,에러 처리기} for details.

For performance reasons, the value of `errors' is not checked for validity
unless a decoding error actually occurs,
@ref{507,,파이썬 개발 모드} is enabled or a @ref{508,,debug build} is used.

@cartouche
@quotation 참고 
Passing the `encoding' argument to @ref{169,,str} allows decoding any
@ref{193,,bytes-like object} directly, without needing to make a temporary
@code{bytes} or @code{bytearray} object.
@end quotation
@end cartouche


버전 3.1에서 변경: 키워드 인자 지원이 추가되었습니다.



버전 3.9에서 변경: The value of the `errors' argument is now checked in @ref{507,,파이썬 개발 모드} and
in @ref{508,,debug mode}.

@end deffn

@geindex endswith() (bytes 메서드)
@geindex endswith() (bytearray 메서드)
@anchor{library/stdtypes bytes endswith}@anchor{2620}
@deffn {메서드} bytes.endswith (suffix[, start[, end]])
@anchor{library/stdtypes bytearray endswith}@anchor{15a7}
@deffnx {메서드} bytearray.endswith (suffix[, start[, end]])

바이너리 데이터가 지정된 `suffix' 로 끝나면 @code{True} 를 돌려주고, 그렇지 않으면 @code{False} 를 돌려줍니다. `suffix' 는 찾고자 하는 접미사들의 튜플이 될 수도 있습니다. 선택적 `start' 가 제공되면 그 위치에서 검사를 시작합니다. 선택적 `end' 를 사용하면 해당 위치에서 비교를 중단합니다.

검색할 접미사(들)는 임의의 @ref{193,,bytes-like object} 일 수 있습니다.
@end deffn

@geindex find() (bytes 메서드)
@geindex find() (bytearray 메서드)
@anchor{library/stdtypes bytes find}@anchor{1bd2}
@deffn {메서드} bytes.find (sub[, start[, end]])
@anchor{library/stdtypes bytearray find}@anchor{15a8}
@deffnx {메서드} bytearray.find (sub[, start[, end]])

서브 시퀀스 `sub' 가 슬라이스 @code{s[start:end]} 내에 등장하는 가장 작은 데이터의 인덱스를 돌려줍니다. 선택적 인자 `start' 와 `end' 는 슬라이스 표기법으로 해석됩니다. `sub' 가 없으면 @code{-1} 을 돌려줍니다.

검색할 서브 시퀀스는 임의의 @ref{193,,bytes-like object} 또는 0에서 255 사이의 정수일 수 있습니다.

@cartouche
@quotation 참고 
@ref{1bd2,,find()} 메서드는 `sub' 의 위치를 알아야 할 경우에만 사용해야 합니다. `sub' 가 부분 문자열인지 여부를 확인하려면 @ref{34b,,in} 연산자를 사용하십시오:

@example
>>> b'Py' in b'Python'
True
@end example
@end quotation
@end cartouche


버전 3.3에서 변경: 서브 시퀀스로 0에서 255 사이의 정수도 허용합니다.

@end deffn

@geindex index() (bytes 메서드)
@geindex index() (bytearray 메서드)
@anchor{library/stdtypes bytes index}@anchor{261d}
@deffn {메서드} bytes.index (sub[, start[, end]])
@anchor{library/stdtypes bytearray index}@anchor{179d}
@deffnx {메서드} bytearray.index (sub[, start[, end]])

@ref{1bd2,,find()} 과 비슷하지만, 서브 시퀀스를 찾을 수 없는 경우 @ref{2ec,,ValueError} 를 일으킵니다.

검색할 서브 시퀀스는 임의의 @ref{193,,bytes-like object} 또는 0에서 255 사이의 정수일 수 있습니다.


버전 3.3에서 변경: 서브 시퀀스로 0에서 255 사이의 정수도 허용합니다.

@end deffn

@geindex join() (bytes 메서드)
@geindex join() (bytearray 메서드)
@anchor{library/stdtypes bytes join}@anchor{260b}
@deffn {메서드} bytes.join (iterable, /)
@anchor{library/stdtypes bytearray join}@anchor{2664}
@deffnx {메서드} bytearray.join (iterable, /)

`iterable' 의 바이너리 데이터 시퀀스들을 이어 붙이기 한 바이트열 또는 바이트 배열 객체를 돌려줍니다. `iterable' 에 @ref{169,,str} 객체나 기타 @ref{193,,bytes-like object} 가 아닌 값이 있으면 @ref{198,,TypeError} 를 일으킵니다. 요소들 사이의 구분자는 이 메서드를 제공하는 바이트열 이나 바이트 배열 객체입니다.
@end deffn

@geindex maketrans() (bytes의 정적 메서드)
@geindex maketrans() (bytearray의 정적 메서드)
@anchor{library/stdtypes bytes maketrans}@anchor{1479}
@deffn {메서드} static bytes.maketrans (from, to, /)
@anchor{library/stdtypes bytearray maketrans}@anchor{147a}
@deffnx {메서드} static bytearray.maketrans (from, to, /)

이 정적 메서드는 @ref{2649,,bytes.translate()} 에 사용할 수 있는 변환표를 돌려주는데, `from' 에 있는 문자를 `to' 의 같은 위치에 있는 문자로 매핑합니다; `from' 과 `to' 는 모두 @ref{193,,bytes-like object} 여야 하고 길이가 같아야 합니다.


Added in version 3.1.

@end deffn

@geindex partition() (bytes 메서드)
@geindex partition() (bytearray 메서드)
@anchor{library/stdtypes bytes partition}@anchor{2625}
@deffn {메서드} bytes.partition (sep, /)
@anchor{library/stdtypes bytearray partition}@anchor{2665}
@deffnx {메서드} bytearray.partition (sep, /)

`sep' 가 처음 나타나는 위치에서 시퀀스를 나누고, 구분자 앞에 있는 부분, 구분자 자체, 구분자 뒤에 오는 부분으로 구성된 3-튜플을 돌려줍니다. 구분자가 발견되지 않으면, 원래 시퀀스의 복사본과 그 뒤를 따르는 두 개의 빈 바이트열 또는 바이트 배열 객체로 구성된 3-튜플을 돌려줍니다.

검색할 구분자는 임의의 @ref{193,,bytes-like object} 일 수 있습니다.
@end deffn

@geindex replace() (bytes 메서드)
@geindex replace() (bytearray 메서드)
@anchor{library/stdtypes bytes replace}@anchor{2621}
@deffn {메서드} bytes.replace (old, new, count=-1, /)
@anchor{library/stdtypes bytearray replace}@anchor{2666}
@deffnx {메서드} bytearray.replace (old, new, count=-1, /)

모든 서브 시퀀스 `old' 가 `new' 로 치환된 시퀀스의 복사본을 돌려줍니다. 선택적 인자 `count' 가 주어지면, 앞의 `count' 개만 치환됩니다.

검색할 서브 시퀀스와 그 대체물은 임의의 @ref{193,,bytes-like object} 일 수 있습니다.

@cartouche
@quotation 참고 
이 메서드의 바이트 배열 버전은 제자리에서 동작하지 `않습니다' - 변경되지 않는 경우조차 항상 새 객체를 만듭니다.
@end quotation
@end cartouche
@end deffn

@geindex rfind() (bytes 메서드)
@geindex rfind() (bytearray 메서드)
@anchor{library/stdtypes bytes rfind}@anchor{1bd3}
@deffn {메서드} bytes.rfind (sub[, start[, end]])
@anchor{library/stdtypes bytearray rfind}@anchor{15a9}
@deffnx {메서드} bytearray.rfind (sub[, start[, end]])

서브 시퀀스 `sub' 가 @code{s[start:end]} 내에 등장하는 가장 큰 시퀀스의 인덱스를 돌려줍니다. 선택적 인자 `start' 와 `end' 는 슬라이스 표기법으로 해석됩니다. 실패하면 @code{-1} 을 돌려줍니다.

검색할 서브 시퀀스는 임의의 @ref{193,,bytes-like object} 또는 0에서 255 사이의 정수일 수 있습니다.


버전 3.3에서 변경: 서브 시퀀스로 0에서 255 사이의 정수도 허용합니다.

@end deffn

@geindex rindex() (bytes 메서드)
@geindex rindex() (bytearray 메서드)
@anchor{library/stdtypes bytes rindex}@anchor{261e}
@deffn {메서드} bytes.rindex (sub[, start[, end]])
@anchor{library/stdtypes bytearray rindex}@anchor{179e}
@deffnx {메서드} bytearray.rindex (sub[, start[, end]])

@ref{1bd3,,rfind()} 와 비슷하지만, 서브 시퀀스 `sub' 를 찾을 수 없는 경우 @ref{2ec,,ValueError} 를 일으킵니다.

검색할 서브 시퀀스는 임의의 @ref{193,,bytes-like object} 또는 0에서 255 사이의 정수일 수 있습니다.


버전 3.3에서 변경: 서브 시퀀스로 0에서 255 사이의 정수도 허용합니다.

@end deffn

@geindex rpartition() (bytes 메서드)
@geindex rpartition() (bytearray 메서드)
@anchor{library/stdtypes bytes rpartition}@anchor{2626}
@deffn {메서드} bytes.rpartition (sep, /)
@anchor{library/stdtypes bytearray rpartition}@anchor{2667}
@deffnx {메서드} bytearray.rpartition (sep, /)

`sep' 가 마지막으로 나타나는 위치에서 시퀀스를 나누고, 구분자 앞에 있는 부분, 구분자 자체, 구분자 뒤에 오는 부분으로 구성된 3-튜플을 돌려줍니다. 구분자가 발견되지 않으면, 두 개의 빈 바이트열 또는 바이트 배열 객체와 그 뒤를 따르는 원래 시퀀스의 복사본으로 구성된 3-튜플을 돌려줍니다.

검색할 구분자는 임의의 @ref{193,,bytes-like object} 일 수 있습니다.
@end deffn

@geindex startswith() (bytes 메서드)
@geindex startswith() (bytearray 메서드)
@anchor{library/stdtypes bytes startswith}@anchor{261f}
@deffn {메서드} bytes.startswith (prefix[, start[, end]])
@anchor{library/stdtypes bytearray startswith}@anchor{15a6}
@deffnx {메서드} bytearray.startswith (prefix[, start[, end]])

바이너리 데이터가 지정된 `prefix' 로 시작하면 @code{True} 를 돌려주고, 그렇지 않으면 @code{False} 를 돌려줍니다. `prefix' 는 찾고자 하는 접두사들의 튜플이 될 수도 있습니다. 선택적 `start' 가 제공되면 그 위치에서 검사를 시작합니다. 선택적 `end' 를 사용하면 해당 위치에서 비교를 중단합니다.

검색할 접두사(들)는 임의의 @ref{193,,bytes-like object} 일 수 있습니다.
@end deffn

@geindex translate() (bytes 메서드)
@geindex translate() (bytearray 메서드)
@anchor{library/stdtypes bytes translate}@anchor{2649}
@deffn {메서드} bytes.translate (table, /, delete=b'@w{'})
@anchor{library/stdtypes bytearray translate}@anchor{1500}
@deffnx {메서드} bytearray.translate (table, /, delete=b'@w{'})

생략 가능한 인자 `delete' 의 모든 바이트를 제거하고, 나머지 바이트들을 주어진 변환표로 매핑한 바이트열이나 바이트 배열 객체의 복사본을 돌려줍니다. table은 길이 256인 바이트열 객체이어야 합니다.

@ref{1479,,bytes.maketrans()} 메서드를 사용하여 변환표를 만들 수 있습니다.

문자를 지우기만 하는 변환에는 `table' 인자를 @code{None} 으로 설정하십시오:

@example
>>> b'read this short text'.translate(None, b'aeiou')
b'rd ths shrt txt'
@end example


버전 3.6에서 변경: 이제 `delete' 는 키워드 인자로 지원됩니다.

@end deffn

바이트열 및 바이트 배열 객체에 대한 다음 메서드는 ASCII 호환 바이너리 형식의 사용을 가정하는 기본 동작을 갖지만, 적절한 인자를 전달하여 임의의 바이너리 데이터와 함께 사용할 수 있습니다. 이 섹션의 바이트 배열 메서드는 모두 제자리에서 작동하지 않고 대신 새로운 객체를 생성함에 주의하십시오.

@geindex center() (bytes 메서드)
@geindex center() (bytearray 메서드)
@anchor{library/stdtypes bytes center}@anchor{2642}
@deffn {메서드} bytes.center (width, fillbyte=b' ', /)
@anchor{library/stdtypes bytearray center}@anchor{2668}
@deffnx {메서드} bytearray.center (width, fillbyte=b' ', /)

길이 `width' 인 시퀀스의 가운데에 정렬한 객체의 복사본을 돌려줍니다. 지정된 `fillbyte' (기본값은 ASCII 스페이스)를 사용하여 채웁니다. @ref{192,,bytes} 객체의 경우, `width' 가 @code{len(s)} 보다 작거나 같은 경우 원래 시퀀스가 반환됩니다.

@cartouche
@quotation 참고 
이 메서드의 바이트 배열 버전은 제자리에서 동작하지 `않습니다' - 변경되지 않는 경우조차 항상 새 객체를 만듭니다.
@end quotation
@end cartouche
@end deffn

@geindex ljust() (bytes 메서드)
@geindex ljust() (bytearray 메서드)
@anchor{library/stdtypes bytes ljust}@anchor{2640}
@deffn {메서드} bytes.ljust (width, fillbyte=b' ', /)
@anchor{library/stdtypes bytearray ljust}@anchor{2669}
@deffnx {메서드} bytearray.ljust (width, fillbyte=b' ', /)

왼쪽으로 정렬된 객체의 복사본을 길이 `width' 인 시퀀스로 돌려줍니다. 지정된 `fillbyte' (기본값은 ASCII 스페이스)을 사용하여 채웁니다. @ref{192,,bytes} 객체의 경우, `width' 가 @code{len(s)} 보다 작거나 같은 경우 원래 시퀀스가 반환됩니다.

@cartouche
@quotation 참고 
이 메서드의 바이트 배열 버전은 제자리에서 동작하지 `않습니다' - 변경되지 않는 경우조차 항상 새 객체를 만듭니다.
@end quotation
@end cartouche
@end deffn

@geindex lstrip() (bytes 메서드)
@geindex lstrip() (bytearray 메서드)
@anchor{library/stdtypes bytes lstrip}@anchor{2646}
@deffn {메서드} bytes.lstrip (bytes=None, /)
@anchor{library/stdtypes bytearray lstrip}@anchor{266a}
@deffnx {메서드} bytearray.lstrip (bytes=None, /)

Return a copy of the sequence with specified leading bytes removed.  The
`bytes' argument is a binary sequence specifying the set of byte values to
be removed.  If omitted or @code{None}, the `bytes' argument defaults
to removing ASCII whitespace.  The `bytes' argument is not a prefix;
rather, all combinations of its values are stripped:

@example
>>> b'   spacious   '.lstrip()
b'spacious   '
>>> b'www.example.com'.lstrip(b'cmowz.')
b'example.com'
@end example

제거할 바이트 값의 바이너리 시퀀스는 임의의 @ref{193,,바이트열류 객체}일 수 있습니다. 문자 집합의 모든 것이 아닌 단일 접두사 문자열을 제거하는 메서드는 @ref{265f,,removeprefix()}를 참조하십시오. 예를 들면:

@example
>>> b'Arthur: three!'.lstrip(b'Arthur: ')
b'ee!'
>>> b'Arthur: three!'.removeprefix(b'Arthur: ')
b'three!'
@end example

@cartouche
@quotation 참고 
이 메서드의 바이트 배열 버전은 제자리에서 동작하지 `않습니다' - 변경되지 않는 경우조차 항상 새 객체를 만듭니다.
@end quotation
@end cartouche
@end deffn

@geindex rjust() (bytes 메서드)
@geindex rjust() (bytearray 메서드)
@anchor{library/stdtypes bytes rjust}@anchor{2641}
@deffn {메서드} bytes.rjust (width, fillbyte=b' ', /)
@anchor{library/stdtypes bytearray rjust}@anchor{266b}
@deffnx {메서드} bytearray.rjust (width, fillbyte=b' ', /)

오른쪽으로 정렬된 객체의 복사본을 길이 `width' 인 시퀀스로 돌려줍니다. 지정된 `fillbyte' (기본값은 ASCII 스페이스)를 사용하여 채웁니다. @ref{192,,bytes} 객체의 경우, `width' 가 @code{len(s)} 보다 작거나 같은 경우 원래 시퀀스가 반환됩니다.

@cartouche
@quotation 참고 
이 메서드의 바이트 배열 버전은 제자리에서 동작하지 `않습니다' - 변경되지 않는 경우조차 항상 새 객체를 만듭니다.
@end quotation
@end cartouche
@end deffn

@geindex rsplit() (bytes 메서드)
@geindex rsplit() (bytearray 메서드)
@anchor{library/stdtypes bytes rsplit}@anchor{2623}
@deffn {메서드} bytes.rsplit (sep=None, maxsplit=-1)
@anchor{library/stdtypes bytearray rsplit}@anchor{17a1}
@deffnx {메서드} bytearray.rsplit (sep=None, maxsplit=-1)

`sep' 을 구분자 시퀀스로 사용하여 바이너리 시퀀스를 같은 형의 서브 시퀀스로 나눕니다. `maxsplit' 이 주어지면 가장 오른쪽에서 최대 `maxsplit' 번의 분할이 수행됩니다. `sep' 이 지정되지 않거나 @code{None} 이면, ASCII 공백 문자만으로 이루어진 모든 서브 시퀀스는 구분자입니다. 오른쪽에서 분리하는 것을 제외하면, @ref{17a1,,rsplit()}는 아래에서 자세히 설명될 @ref{17a0,,split()}처럼 동작합니다.
@end deffn

@geindex rstrip() (bytes 메서드)
@geindex rstrip() (bytearray 메서드)
@anchor{library/stdtypes bytes rstrip}@anchor{2647}
@deffn {메서드} bytes.rstrip (bytes=None, /)
@anchor{library/stdtypes bytearray rstrip}@anchor{266c}
@deffnx {메서드} bytearray.rstrip (bytes=None, /)

Return a copy of the sequence with specified trailing bytes removed.  The
`bytes' argument is a binary sequence specifying the set of byte values to
be removed.  If omitted or @code{None}, the `bytes' argument defaults to
removing ASCII whitespace.  The `bytes' argument is not a suffix; rather,
all combinations of its values are stripped:

@example
>>> b'   spacious   '.rstrip()
b'   spacious'
>>> b'mississippi'.rstrip(b'ipz')
b'mississ'
@end example

제거할 바이트 값의 바이너리 시퀀스는 임의의 @ref{193,,바이트열류 객체}일 수 있습니다. 문자 집합의 모든 것이 아닌 단일 접미사 문자열을 제거하는 메서드는 @ref{2661,,removesuffix()}를 참조하십시오. 예를 들면:

@example
>>> b'Monty Python'.rstrip(b' Python')
b'M'
>>> b'Monty Python'.removesuffix(b' Python')
b'Monty'
@end example

@cartouche
@quotation 참고 
이 메서드의 바이트 배열 버전은 제자리에서 동작하지 `않습니다' - 변경되지 않는 경우조차 항상 새 객체를 만듭니다.
@end quotation
@end cartouche
@end deffn

@geindex split() (bytes 메서드)
@geindex split() (bytearray 메서드)
@anchor{library/stdtypes bytes split}@anchor{2622}
@deffn {메서드} bytes.split (sep=None, maxsplit=-1)
@anchor{library/stdtypes bytearray split}@anchor{17a0}
@deffnx {메서드} bytearray.split (sep=None, maxsplit=-1)

`sep' 를 구분자 시퀀스로 사용하여 바이너리 시퀀스를 같은 형의 서브 시퀀스로 나눕니다. `maxsplit' 이 지정되고 음수가 아닌 경우, 최대 `maxsplit' 분할이 수행됩니다 (따라서, 리스트는 최대 @code{maxsplit+1} 개의 요소를 가지게 됩니다). `maxsplit' 이 지정되지 않았거나 @code{-1} 이라면 분할 수에 제한이 없습니다 (가능한 모든 분할이 만들어집니다).

If `sep' is given, consecutive delimiters are not grouped together and are
deemed to delimit empty subsequences (for example, @code{b'1,,2'.split(b',')}
returns @code{[b'1', b'@w{'}, b'2']}).  The `sep' argument may consist of a
multibyte sequence as a single delimiter. Splitting an empty sequence with
a specified separator returns @code{[b'@w{'}]} or @code{[bytearray(b'@w{'})]} depending
on the type of object being split.  The `sep' argument may be any
@ref{193,,bytes-like object}.

예를 들면:

@example
>>> b'1,2,3'.split(b',')
[b'1', b'2', b'3']
>>> b'1,2,3'.split(b',', maxsplit=1)
[b'1', b'2,3']
>>> b'1,2,,3,'.split(b',')
[b'1', b'2', b'@w{'}, b'3', b'@w{'}]
>>> b'1<>2<>3<4'.split(b'<>')
[b'1', b'2', b'3<4']
@end example

`sep' 이 지정되지 않거나 @code{None} 이면, 다른 분할 알고리즘이 적용됩니다: 연속된 ASCII 공백 문자는 단일한 구분자로 간주하고, 시퀀스가 선행이나 후행 공백을 포함해도 결과는 시작과 끝에 빈 시퀀스를 포함하지 않습니다. 결과적으로, 빈 시퀀스나 ASCII 공백만으로 구성된 시퀀스를 @code{None} 구분자로 나누면 @code{[]} 를 돌려줍니다.

예를 들면:

@example
>>> b'1 2 3'.split()
[b'1', b'2', b'3']
>>> b'1 2 3'.split(maxsplit=1)
[b'1', b'2 3']
>>> b'   1   2   3   '.split()
[b'1', b'2', b'3']
@end example
@end deffn

@geindex strip() (bytes 메서드)
@geindex strip() (bytearray 메서드)
@anchor{library/stdtypes bytes strip}@anchor{2645}
@deffn {메서드} bytes.strip (bytes=None, /)
@anchor{library/stdtypes bytearray strip}@anchor{266d}
@deffnx {메서드} bytearray.strip (bytes=None, /)

Return a copy of the sequence with specified leading and trailing bytes
removed. The `bytes' argument is a binary sequence specifying the set of
byte values to be removed.  If omitted or @code{None}, the `bytes'
argument defaults to removing ASCII whitespace. The `bytes' argument is
not a prefix or suffix; rather, all combinations of its values are
stripped:

@example
>>> b'   spacious   '.strip()
b'spacious'
>>> b'www.example.com'.strip(b'cmowz.')
b'example'
@end example

제거할 바이트 값의 바이너리 시퀀스는 임의의 @ref{193,,bytes-like object} 일 수 있습니다.

@cartouche
@quotation 참고 
이 메서드의 바이트 배열 버전은 제자리에서 동작하지 `않습니다' - 변경되지 않는 경우조차 항상 새 객체를 만듭니다.
@end quotation
@end cartouche
@end deffn

바이트열 및 바이트 배열 객체에 대한 다음 메서드는 ASCII 호환 바이너리 형식의 사용을 가정하며 임의의 바이너리 데이터에 적용하면 안 됩니다. 이 섹션의 바이트 배열 메서드는 모두 제자리에서 작동하지 `않고' 대신 새로운 객체를 생성합니다.

@geindex capitalize() (bytes 메서드)
@geindex capitalize() (bytearray 메서드)
@anchor{library/stdtypes bytes capitalize}@anchor{263b}
@deffn {메서드} bytes.capitalize ()
@anchor{library/stdtypes bytearray capitalize}@anchor{266e}
@deffnx {메서드} bytearray.capitalize ()

각 바이트가 ASCII 문자로 해석되고 첫 번째 바이트는 대문자로, 나머지는 소문자로 만든 시퀀스의 복사본을 돌려줍니다. ASCII 바이트가 아닌 값들은 변경되지 않고 전달됩니다.

@cartouche
@quotation 참고 
이 메서드의 바이트 배열 버전은 제자리에서 동작하지 `않습니다' - 변경되지 않는 경우조차 항상 새 객체를 만듭니다.
@end quotation
@end cartouche
@end deffn

@geindex expandtabs() (bytes 메서드)
@geindex expandtabs() (bytearray 메서드)
@anchor{library/stdtypes bytes expandtabs}@anchor{2644}
@deffn {메서드} bytes.expandtabs (tabsize=8)
@anchor{library/stdtypes bytearray expandtabs}@anchor{266f}
@deffnx {메서드} bytearray.expandtabs (tabsize=8)

모든 ASCII 탭 문자들을 현재의 열과 주어진 탭 크기에 따라 하나나 그 이상의 ASCII 스페이스로 치환한 시퀀스의 복사본을 돌려줍니다. 탭 위치는 `tabsize' 바이트마다 발생합니다 (기본값은 8이고, 열 0, 8, 16 등에 탭 위치를 지정합니다). 시퀀스를 확장하기 위해 현재 열이 0으로 설정되고 시퀀스를 바이트 단위로 검사합니다. 바이트가 ASCII 탭 문자 (@code{b'\t'}) 이면, 현재 열이 다음 탭 위치와 같아질 때까지 하나 이상의 스페이스 문자가 삽입됩니다. (탭 문자 자체는 복사되지 않습니다.) 현재 바이트가 ASCII 개행 문자 (@code{b'\n'}) 또는 캐리지 리턴 (@code{b'\r'}) 이면 복사되고 현재 열은 0으로 재설정됩니다. 다른 바이트는 변경되지 않고 복사되고 현재 열은 인쇄할 때 바이트가 어떻게 표시되는지에 관계없이 1씩 증가합니다.

@example
>>> b'01\t012\t0123\t01234'.expandtabs()
b'01      012     0123    01234'
>>> b'01\t012\t0123\t01234'.expandtabs(4)
b'01  012 0123    01234'
@end example

@cartouche
@quotation 참고 
이 메서드의 바이트 배열 버전은 제자리에서 동작하지 `않습니다' - 변경되지 않는 경우조차 항상 새 객체를 만듭니다.
@end quotation
@end cartouche
@end deffn

@geindex isalnum() (bytes 메서드)
@geindex isalnum() (bytearray 메서드)
@anchor{library/stdtypes bytes isalnum}@anchor{262e}
@deffn {메서드} bytes.isalnum ()
@anchor{library/stdtypes bytearray isalnum}@anchor{2670}
@deffnx {메서드} bytearray.isalnum ()

시퀀스의 모든 바이트가 알파벳 ASCII 문자 또는 ASCII 십진수이고 시퀀스가 비어 있지 않으면 @code{True}를 돌려주고 그렇지 않으면 @code{False}를 돌려줍니다. 알파벳 ASCII 문자는, 시퀀스 @code{b'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'} 에 있는 바이트 값입니다. ASCII 십진수는 시퀀스 @code{b'0123456789'} 에 있는 바이트 값입니다.

예를 들면:

@example
>>> b'ABCabc1'.isalnum()
True
>>> b'ABC abc1'.isalnum()
False
@end example
@end deffn

@geindex isalpha() (bytes 메서드)
@geindex isalpha() (bytearray 메서드)
@anchor{library/stdtypes bytes isalpha}@anchor{2628}
@deffn {메서드} bytes.isalpha ()
@anchor{library/stdtypes bytearray isalpha}@anchor{2671}
@deffnx {메서드} bytearray.isalpha ()

시퀀스의 모든 바이트가 알파벳 ASCII 문자이고 시퀀스가 비어 있지 않으면 @code{True}를 돌려주고 그렇지 않으면 @code{False}를 돌려줍니다. 알파벳 ASCII 문자는, 시퀀스 @code{b'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'} 에 있는 바이트 값입니다.

예를 들면:

@example
>>> b'ABCabc'.isalpha()
True
>>> b'ABCabc1'.isalpha()
False
@end example
@end deffn

@geindex isascii() (bytes 메서드)
@geindex isascii() (bytearray 메서드)
@anchor{library/stdtypes bytes isascii}@anchor{2672}
@deffn {메서드} bytes.isascii ()
@anchor{library/stdtypes bytearray isascii}@anchor{2673}
@deffnx {메서드} bytearray.isascii ()

시퀀스가 비어 있거나 시퀀스의 모든 바이트가 ASCII면 @code{True}를 돌려주고, 그렇지 않으면 @code{False}를 돌려줍니다. ASCII 바이트의 범위는 0-0x7F 입니다.


Added in version 3.7.

@end deffn

@geindex isdigit() (bytes 메서드)
@geindex isdigit() (bytearray 메서드)
@anchor{library/stdtypes bytes isdigit}@anchor{262b}
@deffn {메서드} bytes.isdigit ()
@anchor{library/stdtypes bytearray isdigit}@anchor{2674}
@deffnx {메서드} bytearray.isdigit ()

시퀀스의 모든 바이트가 ASCII 십진수이며 시퀀스가 비어 있지 않으면 @code{True}를 돌려주고 그렇지 않으면 @code{False}를 돌려줍니다. ASCII 십진수는 시퀀스 @code{b'0123456789'} 에 있는 바이트 값입니다.

예를 들면:

@example
>>> b'1234'.isdigit()
True
>>> b'1.23'.isdigit()
False
@end example
@end deffn

@geindex islower() (bytes 메서드)
@geindex islower() (bytearray 메서드)
@anchor{library/stdtypes bytes islower}@anchor{2630}
@deffn {메서드} bytes.islower ()
@anchor{library/stdtypes bytearray islower}@anchor{2675}
@deffnx {메서드} bytearray.islower ()

시퀀스에 적어도 하나의 ASCII 소문자가 있고, ASCII 대문자가 없으면 @code{True}를, 그렇지 않으면 @code{False}를 돌려줍니다.

예를 들면:

@example
>>> b'hello world'.islower()
True
>>> b'Hello world'.islower()
False
@end example

ASCII 소문자는 시퀀스 @code{b'abcdefghijklmnopqrstuvwxyz'} 에 있는 바이트 값입니다. ASCII 대문자는, 시퀀스 @code{b'ABCDEFGHIJKLMNOPQRSTUVWXYZ'} 에 있는 바이트 값입니다.
@end deffn

@geindex isspace() (bytes 메서드)
@geindex isspace() (bytearray 메서드)
@anchor{library/stdtypes bytes isspace}@anchor{2636}
@deffn {메서드} bytes.isspace ()
@anchor{library/stdtypes bytearray isspace}@anchor{2676}
@deffnx {메서드} bytearray.isspace ()

시퀀스의 모든 바이트가 ASCII 공백이고, 시퀀스가 비어 있지 않으면 @code{True}를 돌려주고 그렇지 않으면 @code{False}를 돌려줍니다. ASCII 공백 문자는 시퀀스 @code{b' \t\n\r\x0b\f'}(스페이스, 탭, 줄 바꿈, 캐리지 리턴, 수직 탭, 폼 피드)에 있는 바이트 값입니다.
@end deffn

@geindex istitle() (bytes 메서드)
@geindex istitle() (bytearray 메서드)
@anchor{library/stdtypes bytes istitle}@anchor{2634}
@deffn {메서드} bytes.istitle ()
@anchor{library/stdtypes bytearray istitle}@anchor{2677}
@deffnx {메서드} bytearray.istitle ()

시퀀스가 ASCII 제목 케이스고 시퀀스가 비어있지 않으면 @code{True}를 돌려주고 그렇지 않으면 @code{False}를 돌려줍니다. “제목 케이스” 의 정의에 대한 자세한 내용은 @ref{263d,,bytes.title()} 을 참조하십시오.

예를 들면:

@example
>>> b'Hello World'.istitle()
True
>>> b'Hello world'.istitle()
False
@end example
@end deffn

@geindex isupper() (bytes 메서드)
@geindex isupper() (bytearray 메서드)
@anchor{library/stdtypes bytes isupper}@anchor{2632}
@deffn {메서드} bytes.isupper ()
@anchor{library/stdtypes bytearray isupper}@anchor{2678}
@deffnx {메서드} bytearray.isupper ()

시퀀스에 적어도 하나의 ASCII 대문자가 있고, ASCII 소문자가 없으면 @code{True}를, 그렇지 않으면 @code{False}를 돌려줍니다.

예를 들면:

@example
>>> b'HELLO WORLD'.isupper()
True
>>> b'Hello world'.isupper()
False
@end example

ASCII 소문자는 시퀀스 @code{b'abcdefghijklmnopqrstuvwxyz'} 에 있는 바이트 값입니다. ASCII 대문자는, 시퀀스 @code{b'ABCDEFGHIJKLMNOPQRSTUVWXYZ'} 에 있는 바이트 값입니다.
@end deffn

@geindex lower() (bytes 메서드)
@geindex lower() (bytearray 메서드)
@anchor{library/stdtypes bytes lower}@anchor{2637}
@deffn {메서드} bytes.lower ()
@anchor{library/stdtypes bytearray lower}@anchor{2679}
@deffnx {메서드} bytearray.lower ()

모든 ASCII 대문자를 해당 소문자로 변환한 시퀀스의 복사본을 돌려줍니다.

예를 들면:

@example
>>> b'Hello World'.lower()
b'hello world'
@end example

ASCII 소문자는 시퀀스 @code{b'abcdefghijklmnopqrstuvwxyz'} 에 있는 바이트 값입니다. ASCII 대문자는, 시퀀스 @code{b'ABCDEFGHIJKLMNOPQRSTUVWXYZ'} 에 있는 바이트 값입니다.

@cartouche
@quotation 참고 
이 메서드의 바이트 배열 버전은 제자리에서 동작하지 `않습니다' - 변경되지 않는 경우조차 항상 새 객체를 만듭니다.
@end quotation
@end cartouche
@end deffn

@geindex universal newlines;bytes.splitlines method
@geindex universal newlines;bytearray.splitlines method

@geindex splitlines() (bytes 메서드)
@geindex splitlines() (bytearray 메서드)
@anchor{library/stdtypes bytes splitlines}@anchor{2624}
@deffn {메서드} bytes.splitlines (keepends=False)
@anchor{library/stdtypes bytearray splitlines}@anchor{267a}
@deffnx {메서드} bytearray.splitlines (keepends=False)

ASCII 줄 경계에서 나눈 바이너리 시퀀스의 줄 리스트를 돌려줍니다. 이 메서드는 줄을 나누는데 @ref{f34,,universal newlines} 접근법을 사용합니다. `keepends' 가 참으로 주어지지 않는 한 결과 리스트에 줄 바꿈은 포함되지 않습니다.

예를 들면:

@example
>>> b'ab c\n\nde fg\rkl\r\n'.splitlines()
[b'ab c', b'@w{'}, b'de fg', b'kl']
>>> b'ab c\n\nde fg\rkl\r\n'.splitlines(keepends=True)
[b'ab c\n', b'\n', b'de fg\r', b'kl\r\n']
@end example

구분자 시퀀스 `sep' 이 주어졌을 때 @ref{2622,,split()} 와 달리, 이 메서드는 빈 시퀀스에 대해서 빈 리스트를 돌려주고, 마지막 줄 바꿈은 새 줄을 만들지 않습니다:

@example
>>> b"".split(b'\n'), b"Two lines\n".split(b'\n')
([b'@w{'}], [b'Two lines', b'@w{'}])
>>> b"".splitlines(), b"One line\n".splitlines()
([], [b'One line'])
@end example
@end deffn

@geindex swapcase() (bytes 메서드)
@geindex swapcase() (bytearray 메서드)
@anchor{library/stdtypes bytes swapcase}@anchor{263f}
@deffn {메서드} bytes.swapcase ()
@anchor{library/stdtypes bytearray swapcase}@anchor{267b}
@deffnx {메서드} bytearray.swapcase ()

모든 ASCII 소문자를 해당 대문자로, 그 반대도 마찬가지로 변환한 시퀀스의 복사본을 돌려줍니다.

예를 들면:

@example
>>> b'Hello World'.swapcase()
b'hELLO wORLD'
@end example

ASCII 소문자는 시퀀스 @code{b'abcdefghijklmnopqrstuvwxyz'} 에 있는 바이트 값입니다. ASCII 대문자는, 시퀀스 @code{b'ABCDEFGHIJKLMNOPQRSTUVWXYZ'} 에 있는 바이트 값입니다.

Unlike @ref{263e,,str.swapcase()}, it is always the case that
@code{bin.swapcase().swapcase() == bin} for the binary versions. Case
conversions are symmetrical in ASCII, even though that is not generally
true for arbitrary Unicode code points.

@cartouche
@quotation 참고 
이 메서드의 바이트 배열 버전은 제자리에서 동작하지 `않습니다' - 변경되지 않는 경우조차 항상 새 객체를 만듭니다.
@end quotation
@end cartouche
@end deffn

@geindex title() (bytes 메서드)
@geindex title() (bytearray 메서드)
@anchor{library/stdtypes bytes title}@anchor{263d}
@deffn {메서드} bytes.title ()
@anchor{library/stdtypes bytearray title}@anchor{267c}
@deffnx {메서드} bytearray.title ()

단어가 ASCII 대문자로 시작하고 나머지 문자들은 소문자인 제목 케이스 버전의 바이너리 시퀀스를 돌려줍니다. 케이스 없는 바이트 값은 수정되지 않은 상태로 남습니다.

예를 들면:

@example
>>> b'Hello world'.title()
b'Hello World'
@end example

ASCII 소문자는 시퀀스 @code{b'abcdefghijklmnopqrstuvwxyz'} 에 있는 바이트 값입니다. ASCII 대문자는 시퀀스 @code{b'ABCDEFGHIJKLMNOPQRSTUVWXYZ'} 에 있는 바이트 값입니다. 다른 모든 바이트 값은 케이스가 없습니다.

이 알고리즘은 단어를 글자들의 연속으로 보는 간단한 언어 독립적 정의를 사용합니다. 이 정의는 여러 상황에서 작동하지만, 축약과 소유의 아포스트로피가 단어 경계를 형성한다는 것을 의미하고, 이는 원하는 결과가 아닐 수도 있습니다:

@example
>>> b"they're bill's friends from the UK".title()
b"They'Re Bill'S Friends From The Uk"
@end example

정규식을 사용하여 아포스트로피에 대한 해결 방법을 구성할 수 있습니다:

@example
>>> import re
>>> def titlecase(s):
...     return re.sub(rb"[A-Za-z]+('[A-Za-z]+)?",
...                   lambda mo: mo.group(0)[0:1].upper() +
...                              mo.group(0)[1:].lower(),
...                   s)
...
>>> titlecase(b"they're bill's friends.")
b"They're Bill's Friends."
@end example

@cartouche
@quotation 참고 
이 메서드의 바이트 배열 버전은 제자리에서 동작하지 `않습니다' - 변경되지 않는 경우조차 항상 새 객체를 만듭니다.
@end quotation
@end cartouche
@end deffn

@geindex upper() (bytes 메서드)
@geindex upper() (bytearray 메서드)
@anchor{library/stdtypes bytes upper}@anchor{2639}
@deffn {메서드} bytes.upper ()
@anchor{library/stdtypes bytearray upper}@anchor{267d}
@deffnx {메서드} bytearray.upper ()

모든 ASCII 소문자를 해당 대문자로 변환한 시퀀스의 복사본을 돌려줍니다.

예를 들면:

@example
>>> b'Hello World'.upper()
b'HELLO WORLD'
@end example

ASCII 소문자는 시퀀스 @code{b'abcdefghijklmnopqrstuvwxyz'} 에 있는 바이트 값입니다. ASCII 대문자는, 시퀀스 @code{b'ABCDEFGHIJKLMNOPQRSTUVWXYZ'} 에 있는 바이트 값입니다.

@cartouche
@quotation 참고 
이 메서드의 바이트 배열 버전은 제자리에서 동작하지 `않습니다' - 변경되지 않는 경우조차 항상 새 객체를 만듭니다.
@end quotation
@end cartouche
@end deffn

@geindex zfill() (bytes 메서드)
@geindex zfill() (bytearray 메서드)
@anchor{library/stdtypes bytes zfill}@anchor{267e}
@deffn {메서드} bytes.zfill (width, /)
@anchor{library/stdtypes bytearray zfill}@anchor{267f}
@deffnx {메서드} bytearray.zfill (width, /)

길이가 `width' 인 시퀀스를 만들기 위해 ASCII @code{b'0'} 문자를 왼쪽에 채운 시퀀스의 복사본을 돌려줍니다. 선행 부호 접두어(@code{b'+'}/@code{b'-'})는 부호 문자의 앞이 아니라 `뒤' 에 채우는 것으로 처리됩니다. @ref{192,,bytes} 객체의 경우, `width' 가 @code{len(s)} 보다 작거나 같은 경우 원래 시퀀스를 돌려줍니다.

예를 들면:

@example
>>> b"42".zfill(5)
b'00042'
>>> b"-42".zfill(5)
b'-0042'
@end example

@cartouche
@quotation 참고 
이 메서드의 바이트 배열 버전은 제자리에서 동작하지 `않습니다' - 변경되지 않는 경우조차 항상 새 객체를 만듭니다.
@end quotation
@end cartouche
@end deffn

@node printf 스타일 바이너리 포매팅,메모리 뷰,바이트열 과 바이트 배열 연산,바이너리 시퀀스 형 — bytes bytearray memoryview
@anchor{library/stdtypes bytes-formatting}@anchor{f80}@anchor{library/stdtypes printf-style-bytes-formatting}@anchor{2680}
@subsubsection @code{printf} 스타일 바이너리 포매팅


@geindex formatting;bytes (%)
@geindex formatting;bytearray (%)
@geindex interpolation;bytes (%)
@geindex interpolation;bytearray (%)
@geindex bytes;formatting
@geindex bytearray;formatting
@geindex bytes;interpolation
@geindex bytearray;interpolation
@geindex printf-style formatting
@geindex sprintf-style formatting
@geindex % (percent);printf-style formatting

@cartouche
@quotation 참고 
여기에 설명된 포맷 연산은 여러 가지 일반적인 오류를 (예를 들어 튜플과 딕셔너리를 올바르게 표시하지 못하는 것) 유발하는 다양한 문제점들이 있습니다. 인쇄될 값이 튜플 또는 딕셔너리일 경우 튜플로 감싸야 합니다.
@end quotation
@end cartouche

바이너리 시퀀스 객체는 한가지 고유한 내장 연산을 갖고 있습니다: @code{%} 연산자 (모듈로). 이것은 바이너리 `포매팅' 또는 `치환' 연산자라고도 합니다. @code{format % values} 가 주어질 때 (`format' 은 바이너리 시퀀스입니다), `format' 내부의 @code{%} 변환 명세는 0개 이상의 `values' 의 요소로 대체됩니다. 이 효과는 C 언어에서 @code{sprintf()}를 사용하는 것과 비슷합니다.

`format' 이 하나의 인자를 요구하면, `values' 는 하나의 비 튜플 객체 일 수 있습니다. @footnote{
그래서, 튜플만을 포매팅하려면 포맷할 튜플 하나만을 포함하는 1-튜플을 제공해야 합니다.
} 그렇지 않으면, `values' 는 format 바이너리 시퀀스 객체가 지정하는 항목의 수와 같은 튜플이거나 단일 매핑 객체 (예를 들어, 딕셔너리) 여야 합니다.

@geindex () (parentheses);in printf-style formatting
@geindex * (asterisk);in printf-style formatting
@geindex . (dot);in printf-style formatting

변환 명세는 두 개 이상의 문자를 포함하며 다음과 같은 구성 요소들을 포함하는데, 반드시 이 순서대로 나와야 합니다:


@enumerate 

@item 
@code{'%'} 문자: 명세의 시작을 나타냅니다.

@item 
매핑 키 (선택 사항): 괄호로 둘러싸인 문자들의 시퀀스로 구성됩니다 (예를 들어, @code{(somename)}).

@item 
변환 플래그 (선택 사항): 일부 변환 유형의 결과에 영향을 줍니다.

@item 
최소 필드 폭 (선택 사항): @code{'*'} (애스터리스크) 로 지정하면, 실제 폭은 `values' 튜플의 다음 요소에서 읽히고, 변환할 객체는 최소 필드 폭과 선택적 정밀도 뒤에 옵니다.

@item 
정밀도 (선택 사항): @code{'.'} (점) 다음에 정밀도가 옵니다. @code{'*'} (애스터리스크) 로 지정하면, 실제 정밀도는 `values' 튜플의 다음 요소에서 읽히고, 변환할 값은 정밀도 뒤에 옵니다.

@item 
길이 수정자 (선택 사항).

@item 
변환 유형.
@end enumerate

오른쪽 인자가 딕셔너리 (또는 다른 매핑 형) 인 경우, 바이너리 시퀀스 객체에 있는 변환 명세는 `반드시' @code{'%'} 문자 바로 뒤에 그 딕셔너리의 매핑 키를 괄호로 둘러싼 형태로 포함해야 합니다. 매핑 키는 포맷할 값을 매핑으로 부터 선택합니다. 예를 들어:

@example
>>> print(b'%(language)s has %(number)03d quote types.' %
...       @{b'language': b"Python", b"number": 2@})
b'Python has 002 quote types.'
@end example

이 경우 @code{*} 지정자를 사용할 수 없습니다 (순차적인 매개변수 목록이 필요하기 때문입니다).

변환 플래그 문자는 다음과 같습니다:

@geindex # (hash);in printf-style formatting
@geindex - (minus);in printf-style formatting
@geindex + (plus);in printf-style formatting
@geindex space;in printf-style formatting


@multitable {xxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

플래그

@tab

뜻

@item

@code{'#'}

@tab

값 변환에 “대체 형식” (아래에 정의되어있습니다) 을 사용합니다.

@item

@code{'0'}

@tab

변환은 숫자 값의 경우 0으로 채웁니다.

@item

@code{'-'}

@tab

변환된 값은 왼쪽으로 정렬됩니다 (둘 다 주어지면 @code{'0'} 변환보다 우선 합니다).

@item

@code{' '}

@tab

(스페이스) 부호 있는 변환 때문에 만들어진 양수 앞에 빈칸을 남겨둡니다 (음수면 빈 문자열입니다).

@item

@code{'+'}

@tab

부호 문자 (@code{'+'} or @code{'-'}) 가 변환 앞에 놓입니다 (@code{' '} 플래그에 우선합니다).

@end multitable


길이 수정자 (@code{h}, @code{l}, @code{L}) 를 제공할 수는 있지만, 파이썬에서 필요하지 않기 때문에 무시됩니다 – 예를 들어 @code{%ld} 는 @code{%d} 와 같습니다.

변환 유형은 다음과 같습니다:


@multitable {xxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxx} 
@headitem

변환

@tab

뜻

@tab

노트

@item

@code{'d'}

@tab

부호 있는 정수 십진 표기.

@tab

@item

@code{'i'}

@tab

부호 있는 정수 십진 표기.

@tab

@item

@code{'o'}

@tab

부호 있는 8진수 값.

@tab

(1)

@item

@code{'u'}

@tab

쓸데없는 유형 – @code{'d'} 와 같습니다.

@tab

(8)

@item

@code{'x'}

@tab

부호 있는 16진수 (소문자).

@tab

(2)

@item

@code{'X'}

@tab

부호 있는 16진수 (대문자).

@tab

(2)

@item

@code{'e'}

@tab

Floating-point exponential format (lowercase).

@tab

(3)

@item

@code{'E'}

@tab

Floating-point exponential format (uppercase).

@tab

(3)

@item

@code{'f'}

@tab

Floating-point decimal format.

@tab

(3)

@item

@code{'F'}

@tab

Floating-point decimal format.

@tab

(3)

@item

@code{'g'}

@tab

Floating-point format. Uses lowercase exponential
format if exponent is less than -4 or not less than
precision, decimal format otherwise.

@tab

(4)

@item

@code{'G'}

@tab

Floating-point format. Uses uppercase exponential
format if exponent is less than -4 or not less than
precision, decimal format otherwise.

@tab

(4)

@item

@code{'c'}

@tab

단일 바이트 (정수 또는 길이 1인 바이너리 시퀀스를 허용합니다).

@tab

@item

@code{'b'}

@tab

Bytes (any object that follows the
@ref{260,,buffer protocol} or has
@ref{7fd,,__bytes__()}).

@tab

(5)

@item

@code{'s'}

@tab

@code{'s'} 는 @code{'b'} 의 별칭이고 파이썬 2/3에서만 사용되어야 합니다.

@tab

(6)

@item

@code{'a'}

@tab

Bytes (converts any Python object using
@code{repr(obj).encode('ascii', 'backslashreplace')}).

@tab

(5)

@item

@code{'r'}

@tab

@code{'r'} 는 @code{'a'} 의 별칭이고 파이썬 2/3에서만 사용되어야 합니다.

@tab

(7)

@item

@code{'%'}

@tab

인자는 변환되지 않고, 결과에 @code{'%'} 문자가 표시됩니다.

@tab

@end multitable


노트:


@enumerate 

@item 
대체 형식은 첫 번째 숫자 앞에 선행 8진수 지정자 (@code{'0o'})를 삽입합니다.

@item 
대체 형식은 첫 번째 숫자 앞에 선행 @code{'0x'} 또는 @code{'0X'} (@code{'x'} 나 @code{'X'} 유형 중 어느 것을 사용하느냐에 따라 달라집니다) 를 삽입합니다.

@item 
대체 형식은 그 뒤에 숫자가 나오지 않더라도 항상 소수점을 포함합니다.

정밀도는 소수점 이하 자릿수를 결정하며 기본값은 6입니다.

@item 
대체 형식은 결과에 항상 소수점을 포함하고 뒤에 오는 0은 제거되지 않습니다.

정밀도는 소수점 앞뒤의 유효 자릿수를 결정하며 기본값은 6입니다.

@item 
정밀도가 @code{N} 이라면, 출력은 @code{N} 문자로 잘립니다.

@item 
@code{b'%s'} 는 폐지되었습니다. 하지만 3.x 시리즈에서는 제거되지 않습니다.

@item 
@code{b'%r'} 는 폐지되었습니다. 하지만 3.x 시리즈에서는 제거되지 않습니다.

@item 
@geindex Python 향상 제안; PEP 237
PEP 237@footnote{https://peps.python.org/pep-0237/}을 참조하세요.
@end enumerate

@cartouche
@quotation 참고 
이 메서드의 바이트 배열 버전은 제자리에서 동작하지 `않습니다' - 변경되지 않는 경우조차 항상 새 객체를 만듭니다.
@end quotation
@end cartouche


@subsubheading 더 보기


@geindex Python 향상 제안; PEP 461
PEP 461@footnote{https://peps.python.org/pep-0461/} - bytes와 bytearray에 % 포매팅 추가



Added in version 3.5.


@node 메모리 뷰,,printf 스타일 바이너리 포매팅,바이너리 시퀀스 형 — bytes bytearray memoryview
@anchor{library/stdtypes memory-views}@anchor{2681}@anchor{library/stdtypes typememoryview}@anchor{25d8}
@subsubsection 메모리 뷰


@ref{165,,memoryview} 객체는 파이썬 코드가 @ref{260,,버퍼 프로토콜} 을 지원하는 객체의 내부 데이터에 복사 없이 접근할 수 있게 합니다.

@geindex memoryview (내장 클래스)
@anchor{library/stdtypes memoryview}@anchor{165}
@deffn {클래스} memoryview (object)

@quotation

Create a @code{memoryview} that references `object'.  `object' must
support the buffer protocol.  Built-in objects that support the buffer
protocol include @ref{192,,bytes} and @ref{344,,bytearray}.

A @code{memoryview} has the notion of an `element', which is the
atomic memory unit handled by the originating `object'.  For many simple
types such as @ref{192,,bytes} and @ref{344,,bytearray}, an element is a single
byte, but other types such as @ref{4c0,,array.array} may have bigger elements.

@code{len(view)} is equal to the length of @ref{2682,,tolist}, which
is the nested list representation of the view. If @code{view.ndim = 1},
this is equal to the number of elements in the view.


버전 3.12에서 변경: If @code{view.ndim == 0}, @code{len(view)} now raises @ref{198,,TypeError} instead of returning 1.


The @ref{2683,,itemsize} attribute will give you the number of
bytes in a single element.

@ref{165,,memoryview} 는 슬라이싱과 인덱싱을 지원하여 데이터를 노출합니다. 일차원 슬라이스는 서브 뷰를 만듭니다:

@example
>>> v = memoryview(b'abcefg')
>>> v[1]
98
>>> v[-1]
103
>>> v[1:4]
<memory at 0x7f3ddc9f4350>
>>> bytes(v[1:4])
b'bce'
@end example

@ref{2684,,format} 이 @ref{db,,struct} 모듈의 네이티브 형식 지정자 중 하나인 경우, 정수 또는 정수의 튜플을 사용하는 인덱싱도 지원되며 올바른 형으로 하나의 요소를 돌려줍니다. 일차원 메모리 뷰는 정수 또는 하나의 정수를 갖는 튜플로 인덱싱 할 수 있습니다. 다차원 메모리 뷰는 정확히 `ndim' 개의 정수를 갖는 튜플로 인덱싱할 수 있습니다. 여기서 `ndim' 은 차원 수입니다. 영차원 메모리 뷰는 빈 튜플로 인덱싱할 수 있습니다.

다음은 바이트가 아닌 형식의 예입니다:

@example
>>> import array
>>> a = array.array('l', [-11111111, 22222222, -33333333, 44444444])
>>> m = memoryview(a)
>>> m[0]
-11111111
>>> m[-1]
44444444
>>> m[::2].tolist()
[-11111111, -33333333]
@end example

하부 객체가 쓰기 가능하면, 메모리 뷰는 일차원 슬라이스 대입을 지원합니다. 크기 변경은 허용되지 않습니다:

@example
>>> data = bytearray(b'abcefg')
>>> v = memoryview(data)
>>> v.readonly
False
>>> v[0] = ord(b'z')
>>> data
bytearray(b'zbcefg')
>>> v[1:4] = b'123'
>>> data
bytearray(b'z123fg')
>>> v[2:3] = b'spam'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: memoryview assignment: lvalue and rvalue have different structures
>>> v[2:6] = b'spam'
>>> data
bytearray(b'z1spam')
@end example

One-dimensional memoryviews of @ref{823,,hashable} (read-only) types with formats
‘B’, ‘b’ or ‘c’ are also hashable. The hash is defined as
@code{hash(m) == hash(m.tobytes())}:

@example
>>> v = memoryview(b'abcefg')
>>> hash(v) == hash(b'abcefg')
True
>>> hash(v[2:4]) == hash(b'ce')
True
>>> hash(v[::-2]) == hash(b'abcefg'[::-2])
True
@end example


버전 3.3에서 변경: One-dimensional memoryviews can now be sliced.
One-dimensional memoryviews with formats ‘B’, ‘b’ or ‘c’ are now @ref{823,,hashable}.



버전 3.4에서 변경: 이제 메모리 뷰는 자동으로 @ref{13c9,,collections.abc.Sequence} 로 등록됩니다



버전 3.5에서 변경: 이제 메모리 뷰는 정수의 튜플로 인덱싱될 수 있습니다.



버전 3.14에서 변경: memoryview is now a @ref{1a1,,generic type}.


@ref{165,,memoryview} 는 몇 가지 메서드를 가지고 있습니다:

@geindex __eq__() (memoryview 메서드)
@anchor{library/stdtypes memoryview __eq__}@anchor{2685}
@deffn {메서드} __eq__ (exporter)

메모리 뷰와 
@geindex Python 향상 제안; PEP 3118
PEP 3118@footnote{https://peps.python.org/pep-3118/} 제공자(exporter)는 다음과 같은 조건을 만족할 때 같다고 비교됩니다: 모양이 동등하고 피연산자의 각 형식 코드가 @ref{db,,struct} 문법을 사용하여 해석될 때 모든 해당 값이 같다.

현재 @ref{2682,,tolist()} 가 지원하는 @ref{db,,struct} 형식 문자열의 부분 집합의 경우, @code{v.tolist() == w.tolist()} 면 @code{v} 와 @code{w} 는 같습니다:

@example
>>> import array
>>> a = array.array('I', [1, 2, 3, 4, 5])
>>> b = array.array('d', [1.0, 2.0, 3.0, 4.0, 5.0])
>>> c = array.array('b', [5, 3, 1])
>>> x = memoryview(a)
>>> y = memoryview(b)
>>> x == a == y == b
True
>>> x.tolist() == a.tolist() == y.tolist() == b.tolist()
True
>>> z = y[::-2]
>>> z == c
True
>>> z.tolist() == c.tolist()
True
@end example

형식 문자열이 @ref{db,,struct} 모듈에서 지원되지 않으면 객체는 항상 같지 않다고 비교됩니다 (형식 문자열과 버퍼 내용이 같더라도 그렇습니다):

@example
>>> from ctypes import BigEndianStructure, c_long
>>> class BEPoint(BigEndianStructure):
...     _fields_ = [("x", c_long), ("y", c_long)]
...
>>> point = BEPoint(100, 200)
>>> a = memoryview(point)
>>> b = memoryview(point)
>>> a == point
False
>>> a == b
False
@end example

Note that, as with floating-point numbers, @code{v is w} does `not' imply
@code{v == w} for memoryview objects.


버전 3.3에서 변경: 이전 버전에서는 항목 형식과 논리 배열 구조를 무시하고 원시 메모리를 비교했습니다.

@end deffn

@geindex tobytes() (memoryview 메서드)
@anchor{library/stdtypes memoryview tobytes}@anchor{2686}
@deffn {메서드} tobytes (order='C')

버퍼의 데이터를 바이트열로 돌려줍니다. 이는 메모리 뷰에 @ref{192,,bytes} 생성자를 호출하는 것과 동등합니다.

@example
>>> m = memoryview(b"abc")
>>> m.tobytes()
b'abc'
>>> bytes(m)
b'abc'
@end example

불연속 배열의 경우 결과는 모든 요소를 바이트로 변환하여 평평한 리스트로 만든 것과 같습니다. @ref{2686,,tobytes()} 는 @ref{db,,struct} 모듈 문법에 없는 것을 포함하여 모든 형식 문자열을 지원합니다.


Added in version 3.8: `order'는 @{‘C’, ‘F’, ‘A’@} 일 수 있습니다. `order'가 ‘C’ 나 ‘F’ 이면, 원래 배열의 데이터가 C 나 포트란 순서로 변환됩니다. 연속 뷰의 경우, ‘A’ 는 물리적 메모리의 정확한 사본을 반환합니다. 특히, 메모리 내 포트란 순서가 보존됩니다. 연속적이지 않은 뷰의 경우, 데이터는 먼저 C로 변환됩니다. `order=None'은 `order=’C’'와 같습니다.

@end deffn

@geindex hex() (memoryview 메서드)
@anchor{library/stdtypes memoryview hex}@anchor{f66}
@deffn {메서드} hex (*, bytes_per_sep=1)

@deffnx {메서드} hex (sep, bytes_per_sep=1)

버퍼 내의 각 바이트를 두 개의 16진수로 표현한 문자열 객체를 돌려줍니다.

@example
>>> m = memoryview(b"abc")
>>> m.hex()
'616263'
@end example


Added in version 3.5.



버전 3.8에서 변경: @ref{f64,,bytes.hex()}와 비슷하게, 이제 @ref{f66,,memoryview.hex()}는 16진수 출력의 바이트 사이에 구분 기호를 삽입하기 위해 선택적 `sep'과 `bytes_per_sep' 매개 변수를 지원합니다.

@end deffn

@geindex tolist() (memoryview 메서드)
@anchor{library/stdtypes memoryview tolist}@anchor{2682}
@deffn {메서드} tolist ()

버퍼 내의 데이터를 요소들의 리스트로 돌려줍니다.

@example
>>> memoryview(b'abc').tolist()
[97, 98, 99]
>>> import array
>>> a = array.array('d', [1.1, 2.2, 3.3])
>>> m = memoryview(a)
>>> m.tolist()
[1.1, 2.2, 3.3]
@end example


버전 3.3에서 변경: @ref{2682,,tolist()} 는 이제 @ref{db,,struct} 모듈 문법의 모든 단일 문자 네이티브 형식과 다차원 표현을 지원합니다.

@end deffn

@geindex toreadonly() (memoryview 메서드)
@anchor{library/stdtypes memoryview toreadonly}@anchor{2687}
@deffn {메서드} toreadonly ()

메모리 뷰 객체의 읽기 전용 버전을 반환합니다. 원래 메모리 뷰 객체는 변경되지 않습니다.

@example
>>> m = memoryview(bytearray(b'abc'))
>>> mm = m.toreadonly()
>>> mm.tolist()
[97, 98, 99]
>>> mm[0] = 42
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: cannot modify read-only memory
>>> m[0] = 43
>>> mm.tolist()
[43, 98, 99]
@end example


Added in version 3.8.

@end deffn

@geindex release() (memoryview 메서드)
@anchor{library/stdtypes memoryview release}@anchor{13c3}
@deffn {메서드} release ()

메모리 뷰 객체에 의해 노출된 하부 버퍼를 해제합니다. 많은 객체는 뷰가 그 객체에 연결될 때 특별한 조처를 합니다 (예를 들어, @ref{344,,bytearray} 는 일시적으로 크기 조절을 금지합니다); 따라서, release()를 호출하면 가능한 한 빨리 이 제한 사항을 제거하고 붙잡힌 자원을 해제할 수 있습니다.

After this method has been called, any further operation on the view
raises a @ref{2ec,,ValueError} (except @code{release()} itself which can
be called multiple times):

@example
>>> m = memoryview(b'abc')
>>> m.release()
>>> m[0]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: operation forbidden on released memoryview object
@end example

@code{with} 문을 사용한 컨텍스트 관리 프로토콜은 비슷한 효과를 낼 수 있습니다:

@example
>>> with memoryview(b'abc') as m:
...     m[0]
...
97
>>> m[0]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: operation forbidden on released memoryview object
@end example


Added in version 3.2.

@end deffn

@geindex cast() (memoryview 메서드)
@anchor{library/stdtypes memoryview cast}@anchor{2688}
@deffn {메서드} cast (format, /)

@deffnx {메서드} cast (format, shape, /)

메모리 뷰를 새로운 형식이나 모양으로 캐스팅합니다. `shape' 의 기본값은 @code{[byte_length//new_itemsize]} 인데, 결과 뷰가 일차원이 된다는 의미입니다. 반환 값은 새로운 메모리 뷰이지만 버퍼 자체는 복사되지 않습니다. 지원되는 캐스팅은 1D -> C-@ref{2689,,연속} 과 C-연속 -> 1D입니다.

The destination format is restricted to a single element native format in
@ref{db,,struct} syntax. One of the formats must be a byte format
(‘B’, ‘b’ or ‘c’). The byte length of the result must be the same
as the original length.
Note that all byte lengths may depend on the operating system.

1D/long 을 1D/unsigned bytes 로 캐스트:

@example
>>> import array
>>> a = array.array('l', [1,2,3])
>>> x = memoryview(a)
>>> x.format
'l'
>>> x.itemsize
8
>>> len(x)
3
>>> x.nbytes
24
>>> y = x.cast('B')
>>> y.format
'B'
>>> y.itemsize
1
>>> len(y)
24
>>> y.nbytes
24
@end example

1D/unsigned bytes 를 1D/char 로 캐스트:

@example
>>> b = bytearray(b'zyz')
>>> x = memoryview(b)
>>> x[0] = b'a'
Traceback (most recent call last):
  ...
TypeError: memoryview: invalid type for format 'B'
>>> y = x.cast('c')
>>> y[0] = b'a'
>>> b
bytearray(b'ayz')
@end example

1D/bytes 를 3D/ints 로 캐스트 한 후 다시 1D/signed char 로 캐스트:

@example
>>> import struct
>>> buf = struct.pack("i"*12, *list(range(12)))
>>> x = memoryview(buf)
>>> y = x.cast('i', shape=[2,2,3])
>>> y.tolist()
[[[0, 1, 2], [3, 4, 5]], [[6, 7, 8], [9, 10, 11]]]
>>> y.format
'i'
>>> y.itemsize
4
>>> len(y)
2
>>> y.nbytes
48
>>> z = y.cast('b')
>>> z.format
'b'
>>> z.itemsize
1
>>> len(z)
48
>>> z.nbytes
48
@end example

1D/unsigned long 을 2D/unsigned long 으로 캐스트:

@example
>>> buf = struct.pack("L"*6, *list(range(6)))
>>> x = memoryview(buf)
>>> y = x.cast('L', shape=[2,3])
>>> len(y)
2
>>> y.nbytes
48
>>> y.tolist()
[[0, 1, 2], [3, 4, 5]]
@end example


Added in version 3.3.



버전 3.5에서 변경: 바이트 형식으로 변환할 때 소스 형식이 더는 제한되지 않습니다.

@end deffn

@geindex count() (memoryview 메서드)
@anchor{library/stdtypes memoryview count}@anchor{18f9}
@deffn {메서드} count (value, /)

Count the number of occurrences of `value'.


Added in version 3.14.

@end deffn
@end quotation

@geindex index() (memoryview 메서드)
@anchor{library/stdtypes memoryview index}@anchor{18f8}
@deffn {메서드} index (value, start=0, stop=sys.maxsize, /)

@quotation

Return the index of the first occurrence of `value' (at or after
index `start' and before index `stop').

Raises a @ref{2ec,,ValueError} if `value' cannot be found.


Added in version 3.14.

@end quotation

몇 가지 읽기 전용 어트리뷰트도 사용할 수 있습니다:

@geindex obj (memoryview의 속성)
@anchor{library/stdtypes memoryview obj}@anchor{268a}
@deffn {속성} obj

메모리 뷰의 하부 객체:

@example
>>> b  = bytearray(b'xyz')
>>> m = memoryview(b)
>>> m.obj is b
True
@end example


Added in version 3.3.

@end deffn

@geindex nbytes (memoryview의 속성)
@anchor{library/stdtypes memoryview nbytes}@anchor{268b}
@deffn {속성} nbytes

@code{nbytes == product(shape) * itemsize == len(m.tobytes())}. 배열이 연속적일 때 차지하게 될 바이트 수입니다. 꼭 @code{len(m)}과 같을 필요는 없습니다:

@example
>>> import array
>>> a = array.array('i', [1,2,3,4,5])
>>> m = memoryview(a)
>>> len(m)
5
>>> m.nbytes
20
>>> y = m[::2]
>>> len(y)
3
>>> y.nbytes
12
>>> len(y.tobytes())
12
@end example

다차원 배열:

@example
>>> import struct
>>> buf = struct.pack("d"*12, *[1.5*x for x in range(12)])
>>> x = memoryview(buf)
>>> y = x.cast('d', shape=[3,4])
>>> y.tolist()
[[0.0, 1.5, 3.0, 4.5], [6.0, 7.5, 9.0, 10.5], [12.0, 13.5, 15.0, 16.5]]
>>> len(y)
3
>>> y.nbytes
96
@end example


Added in version 3.3.

@end deffn

@geindex readonly (memoryview의 속성)
@anchor{library/stdtypes memoryview readonly}@anchor{268c}
@deffn {속성} readonly

메모리가 읽기 전용인지 여부를 나타내는 논리값.
@end deffn

@geindex format (memoryview의 속성)
@anchor{library/stdtypes memoryview format}@anchor{2684}
@deffn {속성} format

뷰의 각 요소에 대한 형식(@ref{db,,struct} 모듈 스타일)을 포함하는 문자열입니다. 메모리 뷰는 제공자로부터 임의의 형식 문자열로 만들어질 수 있지만, 일부 메서드(예, @ref{2682,,tolist()})는 원시 네이티브 단일 요소 형식으로 제한됩니다.


버전 3.3에서 변경: @code{'B'} 형식은 이제 struct 모듈 문법에 따라 처리됩니다. 이것은 @code{memoryview(b'abc')[0] == b'abc'[0] == 97} 이 됨을 의미합니다.

@end deffn

@geindex itemsize (memoryview의 속성)
@anchor{library/stdtypes memoryview itemsize}@anchor{2683}
@deffn {속성} itemsize

메모리 뷰 각 요소의 크기 (바이트):

@example
>>> import array, struct
>>> m = memoryview(array.array('H', [32000, 32001, 32002]))
>>> m.itemsize
2
>>> m[0]
32000
>>> struct.calcsize('H') == m.itemsize
True
@end example
@end deffn

@geindex ndim (memoryview의 속성)
@anchor{library/stdtypes memoryview ndim}@anchor{268d}
@deffn {속성} ndim

메모리가 나타내는 다차원 배열의 차원 수를 나타내는 정수.
@end deffn

@geindex shape (memoryview의 속성)
@anchor{library/stdtypes memoryview shape}@anchor{268e}
@deffn {속성} shape

N-차원 배열로서의 메모리의 모양을 가리키는, 길이 @ref{268d,,ndim} 인 정수의 튜플입니다.


버전 3.3에서 변경: ndim = 0 일 때 @code{None} 대신 빈 튜플을 제공합니다.

@end deffn

@geindex strides (memoryview의 속성)
@anchor{library/stdtypes memoryview strides}@anchor{268f}
@deffn {속성} strides

배열의 각 차원에 대해 각 요소를 참조하는데 필요한 바이트 수를 제공하는, 길이 @ref{268d,,ndim} 인 정수의 튜플입니다.


버전 3.3에서 변경: ndim = 0 일 때 @code{None} 대신 빈 튜플을 제공합니다.

@end deffn

@geindex suboffsets (memoryview의 속성)
@anchor{library/stdtypes memoryview suboffsets}@anchor{2690}
@deffn {속성} suboffsets

PIL 스타일 배열에 내부적으로 사용됩니다. 값은 정보 제공용입니다.
@end deffn

@geindex c_contiguous (memoryview의 속성)
@anchor{library/stdtypes memoryview c_contiguous}@anchor{2691}
@deffn {속성} c_contiguous

메모리가 C-@ref{2689,,연속} 인지를 나타내는 논리값.


Added in version 3.3.

@end deffn

@geindex f_contiguous (memoryview의 속성)
@anchor{library/stdtypes memoryview f_contiguous}@anchor{2692}
@deffn {속성} f_contiguous

메모리가 포트란 @ref{2689,,연속} 인지를 나타내는 논리값.


Added in version 3.3.

@end deffn

@geindex contiguous (memoryview의 속성)
@anchor{library/stdtypes memoryview contiguous}@anchor{2693}
@deffn {속성} contiguous

메모리가 @ref{2689,,연속} 인지를 나타내는 논리값.


Added in version 3.3.

@end deffn
@end deffn
@end deffn

For information on the thread safety of @ref{165,,memoryview} objects in
the @ref{1767,,free-threaded build}, see @ref{2411,,Thread safety for memoryview objects}.

@node 집합 형 — set frozenset,매핑 형 — dict,바이너리 시퀀스 형 — bytes bytearray memoryview,내장형
@anchor{library/stdtypes set-types-set-frozenset}@anchor{2694}@anchor{library/stdtypes types-set}@anchor{202f}
@subsection 집합 형 — @code{set}, @code{frozenset}


@geindex object;set

`집합 (set)' 객체는 서로 다른 @ref{823,,해시 가능} 객체의 순서 없는 컬렉션입니다. 일반적인 용도는 멤버십 검사, 시퀀스에서 중복 제거와 교집합, 합집합, 차집합, 대칭 차집합과 같은 수학 연산을 계산하는 것입니다. (다른 컨테이너들은 내장 @ref{183,,dict}, @ref{24d,,list}, @ref{610,,tuple} 클래스 및 @ref{1e,,collections} 모듈을 참조하십시오.)

다른 컬렉션과 마찬가지로, 집합은 @code{x in set}, @code{len(set)}, @code{for x in set} 을 지원합니다. 순서가 없는 컬렉션이므로, 집합은 원소의 위치나 삽입 순서를 기록하지 않습니다. 따라서 집합은 인덱싱, 슬라이싱 또는 기타 시퀀스와 유사한 동작을 지원하지 않습니다.

There are currently two built-in set types, @ref{184,,set} and @ref{7f1,,frozenset}.
The @code{set} type is mutable — the contents can be changed using methods
like @ref{233b,,add()} and @ref{2695,,remove()}.
Since it is mutable, it has no hash value and cannot be used as
either a dictionary key or as an element of another set.
The @code{frozenset} type is immutable and @ref{823,,hashable} —
its contents cannot be altered after it is created;
it can therefore be used as a dictionary key or as an element of another set.

비어 있지 않은 set은 (frozenset 은 아닙니다) @ref{184,,set} 생성자뿐만 아니라 중괄호 안에 쉼표로 구분된 원소 목록을 넣어서 만들 수 있습니다, 예를 들어: @code{@{'jack', 'sjoerd'@}}.

두 클래스의 생성자는 같게 작동합니다:

@geindex set (내장 클래스)
@geindex frozenset (내장 클래스)
@anchor{library/stdtypes set}@anchor{184}
@deffn {클래스} set (iterable=(), /)
@anchor{library/stdtypes frozenset}@anchor{7f1}
@deffnx {클래스} frozenset (iterable=(), /)

`iterable' 에서 요소를 취하는 새 set 또는 frozenset 객체를 돌려줍니다. 집합의 원소는 반드시 @ref{823,,해시 가능} 해야 합니다. 집합의 집합을 표현하려면, 포함되는 집합은 반드시 @ref{7f1,,frozenset} 객체여야 합니다. `iterable' 을 지정하지 않으면 새 빈 집합을 돌려줍니다.
@end deffn

집합은 여러 가지 방법으로 만들 수 있습니다:


@itemize *

@item 
중괄호 안에 쉼표로 구분된 요소 나열하기: @code{@{'jack', 'sjoerd'@}}

@item 
집합 컴프리헨션 사용하기: @code{@{c for c in 'abracadabra' if c not in 'abc'@}}

@item 
형 생성자 사용하기: @code{set()}, @code{set('foobar')}, @code{set(['a', 'b', 'foo'])}
@end itemize

@ref{184,,set}과 @ref{7f1,,frozenset} 의 인스턴스는 다음과 같은 연산을 제공합니다:


@deffn {Describe} len(s)

집합 `s' 의 원소 수(`s' 의 크기)를 돌려줍니다.
@end deffn


@deffn {Describe} x in s

`s' 에 대해 `x' 의 멤버십을 검사합니다.
@end deffn


@deffn {Describe} x not in s

`s' 에 대해 `x' 의 비 멤버십을 검사합니다.
@end deffn

@geindex isdisjoint() (frozenset 메서드)
@geindex isdisjoint() (set 메서드)
@anchor{library/stdtypes frozenset isdisjoint}@anchor{2696}
@deffn {메서드} frozenset.isdisjoint (other, /)
@anchor{library/stdtypes set isdisjoint}@anchor{2697}
@deffnx {메서드} set.isdisjoint (other, /)

집합이 `other' 와 공통 원소를 갖지 않는 경우 @code{True} 을 돌려줍니다. 집합은 교집합이 공집합일 때, 그리고 그때만 서로소(disjoint)라고 합니다.
@end deffn

@geindex issubset() (frozenset 메서드)
@geindex issubset() (set 메서드)
@anchor{library/stdtypes frozenset issubset}@anchor{2698}
@deffn {메서드} frozenset.issubset (other, /)
@anchor{library/stdtypes set issubset}@anchor{2699}
@deffnx {메서드} set.issubset (other, /)
@end deffn


@deffn {Describe} set <= other

집합의 모든 원소가 `other' 에 포함되는지 검사합니다.
@end deffn


@deffn {Describe} set < other

집합이 `other' 의 진부분집합인지 검사합니다, 즉, @code{set <= other and set != other}.
@end deffn

@geindex issuperset() (frozenset 메서드)
@geindex issuperset() (set 메서드)
@anchor{library/stdtypes frozenset issuperset}@anchor{269a}
@deffn {메서드} frozenset.issuperset (other, /)
@anchor{library/stdtypes set issuperset}@anchor{1b83}
@deffnx {메서드} set.issuperset (other, /)
@end deffn


@deffn {Describe} set >= other

`other' 의 모든 원소가 집합에 포함되는지 검사합니다.
@end deffn


@deffn {Describe} set > other

집합이 `other' 의 진상위집합인지 검사합니다, 즉, @code{set >= other and set != other}.
@end deffn

@geindex union() (frozenset 메서드)
@geindex union() (set 메서드)
@anchor{library/stdtypes frozenset union}@anchor{1688}
@deffn {메서드} frozenset.union (*others)
@anchor{library/stdtypes set union}@anchor{269b}
@deffnx {메서드} set.union (*others)
@end deffn


@deffn {Describe} set | other | ...

집합과 모든 others에 있는 원소들로 구성된 새 집합을 돌려줍니다.
@end deffn

@geindex intersection() (frozenset 메서드)
@geindex intersection() (set 메서드)
@anchor{library/stdtypes frozenset intersection}@anchor{1689}
@deffn {메서드} frozenset.intersection (*others)
@anchor{library/stdtypes set intersection}@anchor{1b82}
@deffnx {메서드} set.intersection (*others)
@end deffn


@deffn {Describe} set & other & ...

집합과 모든 others의 공통 원소들로 구성된 새 집합을 돌려줍니다.
@end deffn

@geindex difference() (frozenset 메서드)
@geindex difference() (set 메서드)
@anchor{library/stdtypes frozenset difference}@anchor{269c}
@deffn {메서드} frozenset.difference (*others)
@anchor{library/stdtypes set difference}@anchor{269d}
@deffnx {메서드} set.difference (*others)
@end deffn


@deffn {Describe} set @w{-} other @w{-} ...

집합에는 포함되었으나 others에는 포함되지 않은 원소들로 구성된 새 집합을 돌려줍니다.
@end deffn

@geindex symmetric_difference() (frozenset 메서드)
@geindex symmetric_difference() (set 메서드)
@anchor{library/stdtypes frozenset symmetric_difference}@anchor{269e}
@deffn {메서드} frozenset.symmetric_difference (other, /)
@anchor{library/stdtypes set symmetric_difference}@anchor{269f}
@deffnx {메서드} set.symmetric_difference (other, /)
@end deffn


@deffn {Describe} set ^ other

집합이나 other에 포함되어 있으나 둘 모두에 포함되지는 않은 원소들로 구성된 새 집합을 돌려줍니다.
@end deffn

@geindex copy() (frozenset 메서드)
@geindex copy() (set 메서드)
@anchor{library/stdtypes frozenset copy}@anchor{26a0}
@deffn {메서드} frozenset.copy ()
@anchor{library/stdtypes set copy}@anchor{26a1}
@deffnx {메서드} set.copy ()

집합의 얕은 복사본을 돌려줍니다.
@end deffn

Note, the non-operator versions of @ref{1688,,union()},
@ref{1689,,intersection()}, @ref{269c,,difference()}, @ref{269e,,symmetric_difference()}, @ref{2698,,issubset()}, and
@ref{269a,,issuperset()} methods will accept any iterable as an argument.  In
contrast, their operator based counterparts require their arguments to be
sets.  This precludes error-prone constructions like @code{set('abc') & 'cbs'}
in favor of the more readable @code{set('abc').intersection('cbs')}.

@ref{184,,set}과 @ref{7f1,,frozenset} 모두 집합 간의 비교를 지원합니다. 두 집합은 각 집합의 모든 원소가 다른 집합에 포함되어있는 경우에만 같습니다 (서로 다른 집합의 부분집합입니다). 집합이 다른 집합의 진부분집합(부분집합이지만 같지는 않은 경우)일 때만 첫 번째 집합이 두 번째 집합보다 작습니다. 집합이 다른 집합의 진상위집합(상위집합이지만 같지는 않은 경우)일 때만 첫 번째 집합이 두 번째 집합보다 큽니다.

@ref{184,,set} 의 인스턴스는 그 원소를 기반으로 @ref{7f1,,frozenset} 의 인스턴스와 비교됩니다. 예를 들어, @code{set('abc') == frozenset('abc')} 는 @code{True} 를 돌려주고 @code{set('abc') in set([frozenset('abc')])} 도 마찬가지입니다.

부분 집합 및 동등 비교는 전 순서(total ordering) 함수로 일반화되지 않습니다. 예를 들어, 비어 있지 않은 두 개의 서로소인 집합은 같지 않고 서로의 부분 집합이 아닙니다, 그래서 다음은 `모두' @code{False} 를 돌려줍니다: @code{a<b}, @code{a==b}, @code{a>b}.

집합은 부분 순서(부분 집합 관계)만 정의하기 때문에, 집합의 리스트에 대한 @ref{dc7,,list.sort()} 메서드의 결과는 정의되지 않습니다.

딕셔너리 키처럼, 집합의 원소는 반드시 @ref{823,,해시 가능} 해야 합니다.

@ref{184,,set} 인스턴스와 @ref{7f1,,frozenset} 을 혼합 한 이항 연산은 첫 번째 피연산자의 형을 돌려줍니다. 예를 들어: @code{frozenset('ab') | set('bc')} 는 @code{frozenset} 의 인스턴스를 돌려줍니다.

다음 표는 @ref{7f1,,frozenset} 의 불변 인스턴스에는 적용되지 않고 @ref{184,,set} 에서만 사용할 수 있는 연산들을 나열합니다:

@geindex update() (set 메서드)
@anchor{library/stdtypes set update}@anchor{26a2}
@deffn {메서드} set.update (*others)
@end deffn


@deffn {Describe} set |= other | ...

집합을 갱신해서, 모든 others의 원소들을 더합니다.
@end deffn

@geindex intersection_update() (set 메서드)
@anchor{library/stdtypes set intersection_update}@anchor{168a}
@deffn {메서드} set.intersection_update (*others)
@end deffn


@deffn {Describe} set &= other & ...

집합을 갱신해서, 그 집합과 others에 공통으로 포함된 원소들만 남깁니다.
@end deffn

@geindex difference_update() (set 메서드)
@anchor{library/stdtypes set difference_update}@anchor{26a3}
@deffn {메서드} set.difference_update (*others)
@end deffn


@deffn {Describe} set @w{-}= other | ...

집합을 갱신해서, others에 있는 원소들을 제거합니다.
@end deffn

@geindex symmetric_difference_update() (set 메서드)
@anchor{library/stdtypes set symmetric_difference_update}@anchor{168b}
@deffn {메서드} set.symmetric_difference_update (other, /)
@end deffn


@deffn {Describe} set ^= other

집합을 갱신해서, 두 집합의 어느 한 곳에만 포함된 원소들만 남깁니다.
@end deffn

@geindex add() (set 메서드)
@anchor{library/stdtypes set add}@anchor{233b}
@deffn {메서드} set.add (elem, /)

원소 `elem' 을 집합에 추가합니다.
@end deffn

@geindex remove() (set 메서드)
@anchor{library/stdtypes set remove}@anchor{2695}
@deffn {메서드} set.remove (elem, /)

원소 `elem' 을 집합에서 제거합니다. `elem' 가 집합에 포함되어 있지 않으면 @ref{5e5,,KeyError} 를 일으킵니다.
@end deffn

@geindex discard() (set 메서드)
@anchor{library/stdtypes set discard}@anchor{26a4}
@deffn {메서드} set.discard (elem, /)

원소 `elem' 이 집합에 포함되어 있으면 제거합니다.
@end deffn

@geindex pop() (set 메서드)
@anchor{library/stdtypes set pop}@anchor{26a5}
@deffn {메서드} set.pop ()

집합으로부터 임의의 원소를 제거해 돌려줍니다. 집합이 비어있는 경우 @ref{5e5,,KeyError} 를 일으킵니다.
@end deffn

@geindex clear() (set 메서드)
@anchor{library/stdtypes set clear}@anchor{26a6}
@deffn {메서드} set.clear ()

집합의 모든 원소를 제거합니다.
@end deffn

Note, the non-operator versions of the @ref{26a2,,update()},
@ref{168a,,intersection_update()}, @ref{26a3,,difference_update()}, and
@ref{168b,,symmetric_difference_update()} methods will accept any iterable as an
argument.

Note, the `elem' argument to the @ref{15be,,__contains__()},
@ref{2695,,remove()}, and
@ref{26a4,,discard()} methods may be a set.  To support searching for an equivalent
frozenset, a temporary one is created from `elem'.


@subsubheading 더 보기


For detailed information on thread-safety guarantees for @ref{184,,set}
objects, see @ref{26a7,,Thread safety for set objects}.


@node 매핑 형 — dict,컨텍스트 관리자 형,집합 형 — set frozenset,내장형
@anchor{library/stdtypes mapping-types-dict}@anchor{26a8}@anchor{library/stdtypes typesmapping}@anchor{cbc}
@subsection 매핑 형 — @code{dict}


@geindex object;mapping
@geindex object;dictionary
@geindex operations on;mapping;types
@geindex operations on;dictionary;type
@geindex statement;del
@geindex built-in function;len

@ref{13c0,,매핑} 객체는 @ref{823,,해시 가능} 값을 임의의 객체에 대응합니다. 매핑은 가변 객체입니다. 현재 오직 하나의 표준 매핑 형이 있습니다, `딕셔너리 (dictionary)'. (다른 컨테이너들은 내장 @ref{24d,,list}, @ref{184,,set}, @ref{610,,tuple} 클래스 및 @ref{1e,,collections} 모듈을 참조하십시오.)

A dictionary’s keys are `almost' arbitrary values.  Values that are not
@ref{823,,hashable}, that is, values containing lists, dictionaries or other
mutable types (that are compared by value rather than by object identity) may
not be used as keys.
Values that compare equal (such as @code{1}, @code{1.0}, and @code{True})
can be used interchangeably to index the same dictionary entry.

@geindex dict (내장 클래스)
@anchor{library/stdtypes dict}@anchor{183}
@deffn {클래스} dict (**kwargs)

@deffnx {클래스} dict (mapping, /, **kwargs)

@deffnx {클래스} dict (iterable, /, **kwargs)

선택적 위치 인자와 (비어있을 수 있는) 키워드 인자들의 집합으로부터 초기화된 새 딕셔너리를 돌려줍니다.

딕셔너리는 여러 가지 방법으로 만들 수 있습니다:


@itemize *

@item 
중괄호 안에 쉼표로 구분된 @code{key: value} 쌍을 나열하기: @code{@{'jack': 4098, 'sjoerd': 4127@}} 또는 @code{@{4098: 'jack', 4127: 'sjoerd'@}}

@item 
딕셔너리 컴프리헨션 사용하기: @code{@{@}}, @code{@{x: x ** 2 for x in range(10)@}}

@item 
형 생성자 사용하기: @code{dict()}, @code{dict([('foo', 100), ('bar', 200)])}, @code{dict(foo=100, bar=200)}
@end itemize

If no positional argument is given, an empty dictionary is created.
If a positional argument is given and it defines a @code{keys()} method, a
dictionary is created by calling @ref{588,,__getitem__()} on the argument with
each returned key from the method.  Otherwise, the positional argument must be an
@ref{142c,,iterable} object.  Each item in the iterable must itself be an iterable
with exactly two elements.  The first element of each item becomes a key in the
new dictionary, and the second element the corresponding value.  If a key occurs
more than once, the last value for that key becomes the corresponding value in
the new dictionary.

키워드 인자가 제공되면, 키워드 인자와 해당 값이 위치 인자로부터 만들어진 딕셔너리에 추가됩니다. 추가되는 키가 이미 존재하면, 키워드 인자에서 온 값이 위치 인자에게서 온 값을 대체합니다.

Dictionaries compare equal if and only if they have the same @code{(key,
value)} pairs (regardless of ordering). Order comparisons (‘<’, ‘<=’, ‘>=’, ‘>’) raise
@ref{198,,TypeError}.  To illustrate dictionary creation and equality,
the following examples all return a dictionary equal to
@code{@{"one": 1, "two": 2, "three": 3@}}:

@example
>>> a = dict(one=1, two=2, three=3)
>>> b = @{'one': 1, 'two': 2, 'three': 3@}
>>> c = dict(zip(['one', 'two', 'three'], [1, 2, 3]))
>>> d = dict([('two', 2), ('one', 1), ('three', 3)])
>>> e = dict(@{'three': 3, 'one': 1, 'two': 2@})
>>> f = dict(@{'one': 1, 'three': 3@}, two=2)
>>> a == b == c == d == e == f
True
@end example

첫 번째 예제에서와같이 키워드 인자는 유효한 파이썬 식별자인 키에 대해서만 작동합니다. 그 외의 경우는 모든 유효한 키를 사용할 수 있습니다.

딕셔너리는 삽입 순서를 유지합니다. 키를 갱신해도 순서에는 영향을 미치지 않습니다. 삭제 후에 추가된 키는 끝에 삽입됩니다.:

@example
>>> d = @{"one": 1, "two": 2, "three": 3, "four": 4@}
>>> d
@{'one': 1, 'two': 2, 'three': 3, 'four': 4@}
>>> list(d)
['one', 'two', 'three', 'four']
>>> list(d.values())
[1, 2, 3, 4]
>>> d["one"] = 42
>>> d
@{'one': 42, 'two': 2, 'three': 3, 'four': 4@}
>>> del d["two"]
>>> d["two"] = None
>>> d
@{'one': 42, 'three': 3, 'four': 4, 'two': None@}
@end example


버전 3.7에서 변경: 딕셔너리 순서는 삽입 순서임이 보장됩니다. 이 동작은 3.6부터 CPython의 구현 세부 사항입니다.


이것들은 딕셔너리가 지원하는 연산들입니다 (그러므로, 사용자 정의 매핑 형도 지원해야 합니다):


@deffn {Describe} list(d)

딕셔너리 `d' 에 사용된 모든 키의 리스트를 돌려줍니다.
@end deffn


@deffn {Describe} len(d)

딕셔너리 `d' 에 있는 항목의 수를 돌려줍니다.
@end deffn


@deffn {Describe} d[key]

키 `key' 인 `d' 의 항목을 돌려줍니다. `key' 가 매핑에 없는 경우 @ref{5e5,,KeyError} 를 일으킵니다.

@geindex __missing__()

If a subclass of dict defines a method @ref{13c2,,__missing__()} and `key'
is not present, the @code{d[key]} operation calls that method with the key `key'
as argument.  The @code{d[key]} operation then returns or raises whatever is
returned or raised by the @code{__missing__(key)} call.
No other operations or methods invoke @code{__missing__()}. If
@code{__missing__()} is not defined, @ref{5e5,,KeyError} is raised.
@code{__missing__()} must be a method; it cannot be an instance variable:

@example
>>> class Counter(dict):
...     def __missing__(self, key):
...         return 0
...
>>> c = Counter()
>>> c['red']
0
>>> c['red'] += 1
>>> c['red']
1
@end example

The example above shows part of the implementation of
@ref{1296,,collections.Counter}.
A different @code{__missing__()} method is used
by @ref{13c1,,collections.defaultdict}.
@end deffn


@deffn {Describe} d[key] = value

@code{d[key]} 를 `value' 로 설정합니다.
@end deffn


@deffn {Describe} del d[key]

`d' 에서 @code{d[key]} 를 제거합니다. `key' 가 매핑에 없는 경우 @ref{5e5,,KeyError} 를 일으킵니다.
@end deffn


@deffn {Describe} key in d

`d' 에 키 `key' 가 있으면 @code{True} 를, 그렇지 않으면 @code{False} 를 돌려줍니다.
@end deffn


@deffn {Describe} key not in d

@code{not key in d} 와 동등합니다.
@end deffn


@deffn {Describe} iter(d)

딕셔너리의 키에 대한 이터레이터를 돌려줍니다. 이것은 @code{iter(d.keys())} 의 단축입니다.
@end deffn

@geindex clear() (dict 메서드)
@anchor{library/stdtypes dict clear}@anchor{1772}
@deffn {메서드} clear ()

딕셔너리에서 모든 항목을 제거합니다.
@end deffn

@geindex copy() (dict 메서드)
@anchor{library/stdtypes dict copy}@anchor{dc8}
@deffn {메서드} copy ()

딕셔너리의 얕은 복사본을 돌려줍니다.
@end deffn

@geindex fromkeys() (dict의 클래스 메서드)
@anchor{library/stdtypes dict fromkeys}@anchor{24e}
@deffn {메서드} classmethod fromkeys (iterable, value=None, /)

`iterable' 이 제공하는 값들을 키로 사용하고 모든 값을 `value' 로 설정한 새 딕셔러리를 돌려줍니다.

@ref{24e,,fromkeys()} 는 새로운 딕셔너리를 돌려주는 클래스 메서드입니다. `value' 의 기본값은 @code{None} 입니다. 모든 값이 단일 인스턴스를 참조하므로, `value'가 빈 목록과 같은 가변 객체가 되는 것은 일반적으로 의미가 없습니다. 별개의 값을 얻으려면, 대신 @ref{f7e,,딕셔너리 컴프리헨션}을 사용하십시오.
@end deffn

@geindex get() (dict 메서드)
@anchor{library/stdtypes dict get}@anchor{2032}
@deffn {메서드} get (key, default=None, /)

`key' 가 딕셔너리에 있는 경우 `key' 에 대응하는 값을 돌려주고, 그렇지 않으면 `default' 를 돌려줍니다. `default' 가 주어지지 않으면 기본값 @code{None} 이 사용됩니다. 그래서 이 메서드는 절대로 @ref{5e5,,KeyError} 를 일으키지 않습니다.
@end deffn

@geindex items() (dict 메서드)
@anchor{library/stdtypes dict items}@anchor{9d2}
@deffn {메서드} items ()

딕셔너리 항목들(@code{(key, value)} 쌍들)의 새 뷰를 돌려줍니다. @ref{26a9,,뷰 객체의 설명서} 을 참조하세요.
@end deffn

@geindex keys() (dict 메서드)
@anchor{library/stdtypes dict keys}@anchor{9d0}
@deffn {메서드} keys ()

딕셔너리 키들의 새 뷰를 돌려줍니다. @ref{26a9,,뷰 객체의 설명서} 을 참조하세요.
@end deffn

@geindex pop() (dict 메서드)
@anchor{library/stdtypes dict pop}@anchor{5e4}
@deffn {메서드} pop (key, /)

@deffnx {메서드} pop (key, default, /)

`key' 가 딕셔너리에 있으면 제거하고 그 값을 돌려줍니다. 그렇지 않으면 `default' 를 돌려줍니다. `default' 가 주어지지 않고 `key' 가 딕셔너리에 없으면 @ref{5e5,,KeyError} 를 일으킵니다.
@end deffn

@geindex popitem() (dict 메서드)
@anchor{library/stdtypes dict popitem}@anchor{172b}
@deffn {메서드} popitem ()

딕셔너리에서 @code{(key, value)} 쌍을 제거하고 돌려줍니다. 쌍은 @abbr{LIFO,last-in@comma{} first-out} 순서로 반환됩니다.

@ref{172b,,popitem()} 은 집합 알고리즘에서 종종 사용되듯이 딕셔너리를 파괴적으로 이터레이션 하는 데 유용합니다. 딕셔너리가 비어 있으면 @code{popitem()} 호출은 @ref{5e5,,KeyError} 를 일으킵니다.


버전 3.7에서 변경: 이제 LIFO 순서가 보장됩니다. 이전 버전에서는, @ref{172b,,popitem()}가 임의의 키/값 쌍을 반환합니다.

@end deffn


@deffn {Describe} reversed(d)

딕셔너리의 키에 대한 역순 이터레이터를 돌려줍니다. 이것은 @code{reversed(d.keys())} 의 단축입니다.


Added in version 3.8.

@end deffn

@geindex setdefault() (dict 메서드)
@anchor{library/stdtypes dict setdefault}@anchor{1278}
@deffn {메서드} setdefault (key, default=None, /)

`key' 가 딕셔너리에 있으면 해당 값을 돌려줍니다. 그렇지 않으면, `default' 값을 갖는 `key' 를 삽입한 후 `default' 를 돌려줍니다. `default' 의 기본값은 @code{None} 입니다.
@end deffn

@geindex update() (dict 메서드)
@anchor{library/stdtypes dict update}@anchor{166a}
@deffn {메서드} update (**kwargs)

@deffnx {메서드} update (mapping, /, **kwargs)

@deffnx {메서드} update (iterable, /, **kwargs)

Update the dictionary with the key/value pairs from `mapping' or `iterable' and `kwargs', overwriting
existing keys.  Return @code{None}.

@code{update()} accepts either another object with a @code{keys()} method (in
which case @ref{588,,__getitem__()} is called with every key returned from
the method) or an iterable of key/value pairs (as tuples or other iterables
of length two). If keyword arguments are specified, the dictionary is then
updated with those key/value pairs: @code{d.update(red=1, blue=2)}.
@end deffn

@geindex values() (dict 메서드)
@anchor{library/stdtypes dict values}@anchor{9d1}
@deffn {메서드} values ()

딕셔너리 값들의 새 뷰를 돌려줍니다. @ref{26a9,,뷰 객체의 설명서} 을 참조하세요.

한 @code{dict.values()} 뷰와 다른 @code{dict.values()} 뷰 간의 동등 비교는 항상 @code{False}를 반환합니다. 이것은 @code{dict.values()}를 자신과 비교할 때도 적용됩니다:

@example
>>> d = @{'a': 1@}
>>> d.values() == d.values()
False
@end example
@end deffn


@deffn {Describe} d | other

`d'와 `other'의 병합된 키와 값으로 새 딕셔너리를 만듭니다. 둘 다 딕셔너리이어야 합니다. `d'와 `other'가 키를 공유하면 `other'의 값이 우선합니다.


Added in version 3.9.

@end deffn


@deffn {Describe} d |= other

`other'의 키와 값으로 딕셔너리 `d'를 갱신합니다. `other'는 @ref{13c0,,매핑}이나 키/값 쌍의 @ref{142c,,이터러블}일 수 있습니다. `d'와 `other'가 키를 공유하면 `other'의 값이 우선합니다.


Added in version 3.9.

@end deffn

딕셔너리와 딕셔너리 뷰는 뒤집을 수 있습니다.

@example
>>> d = @{"one": 1, "two": 2, "three": 3, "four": 4@}
>>> d
@{'one': 1, 'two': 2, 'three': 3, 'four': 4@}
>>> list(reversed(d))
['four', 'three', 'two', 'one']
>>> list(reversed(d.values()))
[4, 3, 2, 1]
>>> list(reversed(d.items()))
[('four', 4), ('three', 3), ('two', 2), ('one', 1)]
@end example


버전 3.8에서 변경: 딕셔너리는 이제 뒤집을 수 있습니다.

@end deffn


@subsubheading 더 보기


@ref{697,,types.MappingProxyType} 를 @ref{183,,dict} 의 읽기 전용 뷰를 만드는 데 사용할 수 있습니다.



@subsubheading 더 보기


For detailed information on thread-safety guarantees for @ref{183,,dict}
objects, see @ref{26aa,,Thread safety for dict objects}.


@menu
* 딕셔너리 뷰 객체:: 

@end menu

@node 딕셔너리 뷰 객체,,,매핑 형 — dict
@anchor{library/stdtypes dict-views}@anchor{26a9}@anchor{library/stdtypes dictionary-view-objects}@anchor{26ab}
@subsubsection 딕셔너리 뷰 객체


@ref{9d0,,dict.keys()}, @ref{9d1,,dict.values()}, @ref{9d2,,dict.items()} 가 돌려주는 객체는 `뷰 객체' 입니다. 딕셔너리의 항목들에 대한 동적 뷰를 제공합니다. 즉, 딕셔너리가 변경되면 뷰는 이러한 변경 사항을 반영합니다.

딕셔너리 뷰는 이터레이션을 통해 각각의 데이터를 산출할 수 있고, 멤버십 검사를 지원합니다:


@deffn {Describe} len(dictview)

딕셔너리에 있는 항목 수를 돌려줍니다.
@end deffn


@deffn {Describe} iter(dictview)

딕셔너리에서 키, 값, 항목(@code{(key, value)} 튜플로 표현됩니다)에 대한 이터레이터를 돌려줍니다.

키와 값은 삽입 순서로 이터레이션 됩니다. 이 때문에 @ref{1a0,,zip()}을 사용해서 @code{(value, key)} 쌍을 만들 수 있습니다: @code{pairs = zip(d.values(), d.keys())}. 같은 리스트를 만드는 다른 방법은 @code{pairs = [(v, k) for (k, v) in d.items()]} 입니다.

딕셔너리에 항목을 추가하거나 삭제하는 동안 뷰를 이터레이션 하면 @ref{244,,RuntimeError} 를 일으키거나 모든 항목을 이터레이션 하지 못할 수 있습니다.


버전 3.7에서 변경: 딕셔너리의 순서가 삽입 순서임이 보장됩니다.

@end deffn


@deffn {Describe} x in dictview

`x' 가 하부 딕셔너리의 키, 갑, 항목에 있는 경우 @code{True} 를 돌려줍니다 (마지막의 경우 `x' 는 @code{(key, value)} 튜플이어야 합니다).
@end deffn


@deffn {Describe} reversed(dictview)

딕셔너리의 키, 값 또는 항목에 대한 역방향 이터레이터를 반환합니다. 뷰는 삽입의 역순으로 이터레이트됩니다.


버전 3.8에서 변경: 딕셔너리 뷰는 이제 역 탐색할 수 있습니다.

@end deffn


@deffn {Describe} dictview.mapping

Return a @ref{697,,types.MappingProxyType} that wraps the original
dictionary to which the view refers.


Added in version 3.10.

@end deffn

Keys views are set-like since their entries are unique and @ref{823,,hashable}.
Items views also have set-like operations since the (key, value) pairs
are unique and the keys are hashable.
If all values in an items view are hashable as well,
then the items view can interoperate with other sets.
(Values views are not treated as set-like
since the entries are generally not unique.)  For set-like views, all of the
operations defined for the abstract base class @ref{26ac,,collections.abc.Set} are
available (for example, @code{==}, @code{<}, or @code{^}).  While using set operators,
set-like views accept any iterable as the other operand,
unlike sets which only accept sets as the input.

딕셔너리 뷰 사용의 예:

@example
>>> dishes = @{'eggs': 2, 'sausage': 1, 'bacon': 1, 'spam': 500@}
>>> keys = dishes.keys()
>>> values = dishes.values()

>>> # iteration
>>> n = 0
>>> for val in values:
...     n += val
...
>>> print(n)
504

>>> # keys and values are iterated over in the same order (insertion order)
>>> list(keys)
['eggs', 'sausage', 'bacon', 'spam']
>>> list(values)
[2, 1, 1, 500]

>>> # view objects are dynamic and reflect dict changes
>>> del dishes['eggs']
>>> del dishes['sausage']
>>> list(keys)
['bacon', 'spam']

>>> # set operations
>>> keys & @{'eggs', 'bacon', 'salad'@}
@{'bacon'@}
>>> keys ^ @{'sausage', 'juice'@} == @{'juice', 'sausage', 'bacon', 'spam'@}
True
>>> keys | ['juice', 'juice', 'juice'] == @{'bacon', 'spam', 'juice'@}
True

>>> # get back a read-only proxy for the original dictionary
>>> values.mapping
mappingproxy(@{'bacon': 1, 'spam': 500@})
>>> values.mapping['spam']
500
@end example

@node 컨텍스트 관리자 형,Type Annotation Types — Generic Alias Union,매핑 형 — dict,내장형
@anchor{library/stdtypes context-manager-types}@anchor{26ad}@anchor{library/stdtypes typecontextmanager}@anchor{240c}
@subsection 컨텍스트 관리자 형


@geindex context manager
@geindex context management protocol
@geindex protocol;context management

파이썬의 @ref{186,,with} 문은 컨텍스트 관리자가 정의한 실행 시간 컨텍스트 개념을 지원합니다. 이는 한 쌍의 메서드를 사용해서 구현되는데, 사용자 정의 클래스가 문장 바디가 실행되기 전에 진입하고, 문장이 끝날 때 탈출하는 실행 시간 컨텍스트를 정의할 수 있게 합니다:

@geindex __enter__() (contextmanager 메서드)
@anchor{library/stdtypes contextmanager __enter__}@anchor{26ae}
@deffn {메서드} contextmanager.__enter__ ()

실행시간 컨텍스트에 진입하고 이 객체 자신이나 실행 시간 컨텍스트와 관련된 다른 객체를 돌려줍니다. 이 메서드가 돌려주는 값은, 이 컨텍스트 관리자를 사용하는 @ref{186,,with} 문의 @code{as} 절의 식별자에 연결됩니다.

자신을 돌려주는 컨텍스트 관리자의 예는 @ref{13c8,,파일 객체} 입니다. 파일 객체는 __enter__() 에서 자기 자신을 돌려주는데 @ref{186,,with} 문의 컨텍스트 표현식으로 @ref{316,,open()} 을 사용할 수 있도록 하기 위함입니다.

관련 객체를 돌려주는 컨텍스트 관리자의 예는 @ref{158b,,decimal.localcontext()} 가 돌려주는 것입니다. 이 관리자들은 활성 십진 소수 컨텍스트를 원래 십진 소수 컨텍스트의 복사본으로 설정한 다음 복사본을 돌려줍니다. 이것은 @code{with} 문 바깥의 코드에 영향을 주지 않으면서 @ref{186,,with} 문 바디에 있는 현재 십진 소수 컨텍스트를 변경할 수 있게 합니다.
@end deffn

@geindex __exit__() (contextmanager 메서드)
@anchor{library/stdtypes contextmanager __exit__}@anchor{26af}
@deffn {메서드} contextmanager.__exit__ (exc_type, exc_val, exc_tb)

실행 시간 컨텍스트를 탈출하고 발생한 예외를 막아야 하는지를 가리키는 논리 플래그를 돌려줍니다. @ref{186,,with} 문의 바디를 실행하는 동안 예외가 발생하면, 인자에 예외 형, 값 및 추적 정보가 포함됩니다. 그렇지 않으면, 세 가지 인자 모두 @code{None} 입니다.

Returning a true value from this method will cause the @ref{186,,with} statement
to suppress the exception and continue execution with the statement immediately
following the @code{with} statement. Otherwise the exception continues
propagating after this method has finished executing.

If this method raises an exception while handling an earlier exception from the
@ref{186,,with} block, the new exception is raised, and the original exception
is stored in its @ref{14cc,,__context__} attribute.

The exception passed in should never be reraised explicitly - instead, this
method should return a false value to indicate that the method completed
successfully and does not want to suppress the raised exception. This allows
context management code to easily detect whether or not an @ref{1505,,__exit__()}
method has actually failed.
@end deffn

파이썬은 쉬운 스레드 동기화, 파일이나 다른 객체의 신속한 닫기, 그리고 활성 십진 소수 산술 컨텍스트의 보다 간단한 조작을 지원하기 위해 몇 가지 컨텍스트 관리자를 정의합니다. 컨텍스트 관리 프로토콜의 구현을 넘어 구체적인 형은 특별히 취급되지 않습니다. 몇 가지 예제는 @ref{27,,contextlib} 모듈을 보십시오.

Python’s @ref{1260,,generator}s and the @ref{1407,,contextlib.contextmanager} decorator
provide a convenient way to implement these protocols.  If a generator function is
decorated with the @code{contextlib.contextmanager} decorator, it will return a
context manager implementing the necessary @ref{26ae,,__enter__()} and
@ref{26af,,__exit__()} methods, rather than the iterator produced by an
undecorated generator function.

파이썬/C API의 파이썬 객체에 대한 형 구조체에는 이러한 메서드들을 위해 준비된 슬롯이 없다는 점에 유의하십시오. 이러한 메서드를 정의하고자 하는 확장형은 일반적인 파이썬 액세스가 가능한 메서드로 제공해야 합니다. 실행 시간 컨텍스트를 설정하는 오버헤드와 비교할 때 한 번의 클래스 딕셔너리 조회의 오버헤드는 무시할 수 있습니다.

@node Type Annotation Types — Generic Alias Union,기타 내장형,컨텍스트 관리자 형,내장형
@anchor{library/stdtypes type-annotation-types-generic-alias-union}@anchor{26b0}
@subsection Type Annotation Types — Generic Alias, Union


@geindex annotation;type annotation; type hint

The core built-in types for @ref{15c,,type annotations} are
@ref{8c0,,Generic Alias} and @ref{9c5,,Union}.

@menu
* 제네릭 에일리어스 형:: 
* Union Type:: 

@end menu

@node 제네릭 에일리어스 형,Union Type,,Type Annotation Types — Generic Alias Union
@anchor{library/stdtypes generic-alias-type}@anchor{26b1}@anchor{library/stdtypes types-genericalias}@anchor{8c0}
@subsubsection 제네릭 에일리어스 형


@geindex object;GenericAlias
@geindex Generic;Alias

@code{GenericAlias} objects are generally created by
@ref{23ce,,subscripting} a class. They are most often used with
@ref{23d4,,container classes}, such as @ref{24d,,list} or
@ref{183,,dict}. For example, @code{list[int]} is a @code{GenericAlias} object created
by subscripting the @code{list} class with the argument @ref{19b,,int}.
@code{GenericAlias} objects are intended primarily for use with
@ref{15c,,type annotations}.

@cartouche
@quotation 참고 
It is generally only possible to subscript a class if the class implements
the special method @ref{942,,__class_getitem__()}.
@end quotation
@end cartouche

A @code{GenericAlias} object acts as a proxy for a @ref{1a1,,generic type},
implementing `parameterized generics'.

For a container class, the
argument(s) supplied to a @ref{23ce,,subscription} of the class may
indicate the type(s) of the elements an object contains. For example,
@code{set[bytes]} can be used in type annotations to signify a @ref{184,,set} in
which all the elements are of type @ref{192,,bytes}.

For a class which defines @ref{942,,__class_getitem__()} but is not a
container, the argument(s) supplied to a subscription of the class will often
indicate the return type(s) of one or more methods defined on an object. For
example, @ref{be,,regular expressions} can be used on both the @ref{169,,str} data
type and the @ref{192,,bytes} data type:


@itemize *

@item 
If @code{x = re.search('foo', 'foo')}, @code{x} will be a
@ref{1187,,re.Match} object where the return values of
@code{x.group(0)} and @code{x[0]} will both be of type @ref{169,,str}. We can
represent this kind of object in type annotations with the @code{GenericAlias}
@code{re.Match[str]}.

@item 
If @code{y = re.search(b'bar', b'bar')}, (note the @code{b} for @ref{192,,bytes}),
@code{y} will also be an instance of @code{re.Match}, but the return
values of @code{y.group(0)} and @code{y[0]} will both be of type
@code{bytes}. In type annotations, we would represent this
variety of @ref{1187,,re.Match} objects with @code{re.Match[bytes]}.
@end itemize

@code{GenericAlias} objects are instances of the class
@ref{9ec,,types.GenericAlias}, which can also be used to create @code{GenericAlias}
objects directly.


@deffn {Describe} T[X, Y, ...]

Creates a @code{GenericAlias} representing a type @code{T} parameterized by types
`X', `Y', and more depending on the @code{T} used.
For example, a function expecting a @ref{24d,,list} containing
@ref{196,,float} elements:

@example
def average(values: list[float]) -> float:
    return sum(values) / len(values)
@end example

키 형과 값 형을 나타내는 두 개의 형 매개 변수를 기대하는 제네릭 형인 @ref{183,,dict}를 사용하는 @ref{13c0,,매핑} 객체의 또 다른 예. 이 예에서, 함수는 @ref{169,,str} 형의 키와 @ref{19b,,int} 형의 값을 갖는 @code{dict}를 기대합니다:

@example
def send_post_request(url: str, body: dict[str, int]) -> None:
    ...
@end example
@end deffn

내장 함수 @ref{2ad,,isinstance()}와 @ref{9c4,,issubclass()}는 두 번째 인자로 @code{GenericAlias} 형을 받아들이지 않습니다:

@example
>>> isinstance([1, 2], list[str])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: isinstance() argument 2 cannot be a parameterized generic
@end example

The Python runtime does not enforce @ref{15c,,type annotations}.
This extends to generic types and their type parameters. When creating
a container object from a @code{GenericAlias}, the elements in the container are not checked
against their type. For example, the following code is discouraged, but will
run without errors:

@example
>>> t = list[str]
>>> t([1, 2, 3])
[1, 2, 3]
@end example

또한, 매개 변수화된 제네릭은 객체 생성 중에 형 매개 변수를 지웁니다:

@example
>>> t = list[str]
>>> type(t)
<class 'types.GenericAlias'>

>>> l = t()
>>> type(l)
<class 'list'>
@end example

제네릭에서 @ref{1c1,,repr()}이나 @ref{169,,str()}을 호출하면 매개 변수화된 형이 표시됩니다:

@example
>>> repr(list[int])
'list[int]'

>>> str(list[int])
'list[int]'
@end example

The @ref{588,,__getitem__()} method of generic containers will raise an
exception to disallow mistakes like @code{dict[str][str]}:

@example
>>> dict[str][str]
Traceback (most recent call last):
  ...
TypeError: dict[str] is not a generic class
@end example

However, such expressions are valid when @ref{23c9,,type variables} are
used.  The index must have as many elements as there are type variable items
in the @code{GenericAlias} object’s @ref{26b2,,__args__}.

@example
>>> from typing import TypeVar
>>> Y = TypeVar('Y')
>>> dict[str, Y][int]
dict[str, int]
@end example

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

@end menu

@node Standard Generic Classes,Special Attributes of GenericAlias objects,,제네릭 에일리어스 형
@anchor{library/stdtypes standard-generic-classes}@anchor{26b3}
@subsubsection Standard Generic Classes


The following standard library classes support parameterized generics. This
list is non-exhaustive.


@itemize *

@item 
@ref{610,,tuple}

@item 
@ref{24d,,list}

@item 
@ref{183,,dict}

@item 
@ref{184,,set}

@item 
@ref{7f1,,frozenset}

@item 
@ref{f43,,type}

@item 
@ref{dc5,,asyncio.Future}

@item 
@ref{1c7,,asyncio.Task}

@item 
@ref{7f3,,collections.deque}

@item 
@ref{13c1,,collections.defaultdict}

@item 
@ref{7f2,,collections.OrderedDict}

@item 
@ref{1296,,collections.Counter}

@item 
@ref{e15,,collections.ChainMap}

@item 
@ref{fdb,,collections.abc.Awaitable}

@item 
@ref{fdc,,collections.abc.Coroutine}

@item 
@ref{fde,,collections.abc.AsyncIterable}

@item 
@ref{fdd,,collections.abc.AsyncIterator}

@item 
@ref{e86,,collections.abc.AsyncGenerator}

@item 
@ref{26b4,,collections.abc.Iterable}

@item 
@ref{26b5,,collections.abc.Iterator}

@item 
@ref{fda,,collections.abc.Generator}

@item 
@ref{e84,,collections.abc.Reversible}

@item 
@ref{26b6,,collections.abc.Container}

@item 
@ref{e83,,collections.abc.Collection}

@item 
@ref{9eb,,collections.abc.Callable}

@item 
@ref{26ac,,collections.abc.Set}

@item 
@ref{26b7,,collections.abc.MutableSet}

@item 
@ref{ac7,,collections.abc.Mapping}

@item 
@ref{12b1,,collections.abc.MutableMapping}

@item 
@ref{13c9,,collections.abc.Sequence}

@item 
@ref{4c1,,collections.abc.MutableSequence}

@item 
@ref{342,,collections.abc.ByteString}

@item 
@ref{26b8,,collections.abc.MappingView}

@item 
@ref{26b9,,collections.abc.KeysView}

@item 
@ref{26ba,,collections.abc.ItemsView}

@item 
@ref{26bb,,collections.abc.ValuesView}

@item 
@ref{e89,,contextlib.AbstractContextManager}

@item 
@ref{d1f,,contextlib.AbstractAsyncContextManager}

@item 
@ref{195c,,dataclasses.Field}

@item 
@ref{762,,functools.cached_property}

@item 
@ref{218,,functools.partialmethod}

@item 
@ref{e4a,,os.PathLike}

@item 
@ref{26bc,,queue.LifoQueue}

@item 
@ref{1599,,queue.Queue}

@item 
@ref{26bd,,queue.PriorityQueue}

@item 
@ref{d60,,queue.SimpleQueue}

@item 
@ref{1186,,re.Pattern}

@item 
@ref{1187,,re.Match}

@item 
@ref{26be,,shelve.BsdDbShelf}

@item 
@ref{26bf,,shelve.DbfilenameShelf}

@item 
@ref{119a,,shelve.Shelf}

@item 
@ref{697,,types.MappingProxyType}

@item 
@ref{192a,,weakref.WeakKeyDictionary}

@item 
@ref{11ee,,weakref.WeakMethod}

@item 
@ref{7f4,,weakref.WeakSet}

@item 
@ref{192b,,weakref.WeakValueDictionary}
@end itemize

@node Special Attributes of GenericAlias objects,,Standard Generic Classes,제네릭 에일리어스 형
@anchor{library/stdtypes special-attributes-of-genericalias-objects}@anchor{26c0}
@subsubsection Special Attributes of @code{GenericAlias} objects


모든 매개 변수화된 제네릭은 특수 읽기 전용 어트리뷰트를 구현합니다.

@geindex __origin__ (genericalias의 속성)
@anchor{library/stdtypes genericalias __origin__}@anchor{26c1}
@deffn {속성} genericalias.__origin__

이 어트리뷰트는 매개 변수화되지 않은 제네릭 클래스를 가리킵니다:

@example
>>> list[int].__origin__
<class 'list'>
@end example
@end deffn

@geindex __args__ (genericalias의 속성)
@anchor{library/stdtypes genericalias __args__}@anchor{26b2}
@deffn {속성} genericalias.__args__

This attribute is a @ref{610,,tuple} (possibly of length 1) of generic
types passed to the original @ref{942,,__class_getitem__()} of the
generic class:

@example
>>> dict[str, list[int]].__args__
(<class 'str'>, list[int])
@end example
@end deffn

@geindex __parameters__ (genericalias의 속성)
@anchor{library/stdtypes genericalias __parameters__}@anchor{26c2}
@deffn {속성} genericalias.__parameters__

이 어트리뷰트는 @code{__args__}에서 발견된 고유한 형 변수의 게으르게(lazily) 계산된 튜플(비어있을 수 있습니다)입니다:

@example
>>> from typing import TypeVar

>>> T = TypeVar('T')
>>> list[T].__parameters__
(~T,)
@end example

@cartouche
@quotation 참고 
A @code{GenericAlias} object with @ref{488,,typing.ParamSpec} parameters may not
have correct @code{__parameters__} after substitution because
@code{typing.ParamSpec} is intended primarily for static type checking.
@end quotation
@end cartouche
@end deffn

@geindex __unpacked__ (genericalias의 속성)
@anchor{library/stdtypes genericalias __unpacked__}@anchor{26c3}
@deffn {속성} genericalias.__unpacked__

A boolean that is true if the alias has been unpacked using the
@code{*} operator (see @ref{489,,TypeVarTuple}).


Added in version 3.11.

@end deffn


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 484

@item PEP 484@footnote{https://peps.python.org/pep-0484/} - Type Hints

Introducing Python’s framework for type annotations.

@geindex Python 향상 제안; PEP 585

@item PEP 585@footnote{https://peps.python.org/pep-0585/} - Type Hinting Generics In Standard Collections

Introducing the ability to natively parameterize standard-library
classes, provided they implement the special class method
@ref{942,,__class_getitem__()}.

@item @ref{23c9,,제네릭}, @ref{6f5,,user-defined generics} and @ref{17bc,,typing.Generic}

Documentation on how to implement generic classes that can be
parameterized at runtime and understood by static type-checkers.
@end table



Added in version 3.9.


@node Union Type,,제네릭 에일리어스 형,Type Annotation Types — Generic Alias Union
@anchor{library/stdtypes types-union}@anchor{9c5}@anchor{library/stdtypes union-type}@anchor{26c4}
@subsubsection Union Type


@geindex object;Union
@geindex union;type

A union object holds the value of the @code{|} (bitwise or) operation on
multiple @ref{25e1,,type objects}.  These types are intended
primarily for @ref{15c,,type annotations}. The union type expression
enables cleaner type hinting syntax compared to subscripting @ref{2a8,,typing.Union}.


@deffn {Describe} X | Y | ...

Defines a union object which holds types `X', `Y', and so forth. @code{X | Y}
means either X or Y.  It is equivalent to @code{typing.Union[X, Y]}.
For example, the following function expects an argument of type
@ref{19b,,int} or @ref{196,,float}:

@example
def square(number: int | float) -> int | float:
    return number ** 2
@end example

@cartouche
@quotation 참고 
The @code{|} operand cannot be used at runtime to define unions where one or
more members is a forward reference. For example, @code{int | "Foo"}, where
@code{"Foo"} is a reference to a class not yet defined, will fail at
runtime. For unions which include forward references, present the
whole expression as a string, e.g. @code{"int | Foo"}.
@end quotation
@end cartouche
@end deffn


@deffn {Describe} union_object == other

Union objects can be tested for equality with other union objects.  Details:


@itemize *

@item 
Unions of unions are flattened:

@example
(int | str) | float == int | str | float
@end example

@item 
Redundant types are removed:

@example
int | str | int == int | str
@end example

@item 
When comparing unions, the order is ignored:

@example
int | str == str | int
@end example

@item 
It creates instances of @ref{2a8,,typing.Union}:

@example
int | str == typing.Union[int, str]
type(int | str) is typing.Union
@end example

@item 
Optional types can be spelled as a union with @code{None}:

@example
str | None == typing.Optional[str]
@end example
@end itemize
@end deffn


@deffn {Describe} isinstance(obj, union_object)
@end deffn


@deffn {Describe} issubclass(obj, union_object)

Calls to @ref{2ad,,isinstance()} and @ref{9c4,,issubclass()} are also supported with a
union object:

@example
>>> isinstance("", int | str)
True
@end example

However, @ref{8c0,,parameterized generics} in
union objects cannot be checked:

@example
>>> isinstance(1, int | list[int])  # short-circuit evaluation
True
>>> isinstance([1], int | list[int])
Traceback (most recent call last):
  ...
TypeError: isinstance() argument 2 cannot be a parameterized generic
@end example
@end deffn

The user-exposed type for the union object can be accessed from
@ref{2a8,,typing.Union} and used for @ref{2ad,,isinstance()} checks:

@example
>>> import typing
>>> isinstance(int | str, typing.Union)
True
>>> typing.Union()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: cannot create 'typing.Union' instances
@end example

@cartouche
@quotation 참고 
The @code{__or__()} method for type objects was added to support the syntax
@code{X | Y}.  If a metaclass implements @code{__or__()}, the Union may
override it:

@example
>>> class M(type):
...     def __or__(self, other):
...         return "Hello"
...
>>> class C(metaclass=M):
...     pass
...
>>> C | int
'Hello'
>>> int | C
int | C
@end example
@end quotation
@end cartouche


@subsubheading 더 보기


@geindex Python 향상 제안; PEP 604
PEP 604@footnote{https://peps.python.org/pep-0604/} – PEP proposing the @code{X | Y} syntax and the Union type.



Added in version 3.10.



버전 3.14에서 변경: Union objects are now instances of @ref{2a8,,typing.Union}. Previously, they were instances
of @ref{2a7,,types.UnionType}, which remains an alias for @code{typing.Union}.


@node 기타 내장형,특수 어트리뷰트,Type Annotation Types — Generic Alias Union,내장형
@anchor{library/stdtypes other-built-in-types}@anchor{26c5}@anchor{library/stdtypes typesother}@anchor{26c6}
@subsection 기타 내장형


인터프리터는 여러 가지 다른 객체를 지원합니다. 이것들 대부분은 한두 가지 연산만 지원합니다.

@menu
* 모듈: 모듈<2>. 
* 클래스와 클래스 인스턴스:: 
* 함수:: 
* 메서드:: 
* 코드 객체:: 
* 형 객체:: 
* 널 객체:: 
* Ellipsis 객체:: 
* NotImplemented 객체:: 
* 내부 객체:: 

@end menu

@node 모듈<2>,클래스와 클래스 인스턴스,,기타 내장형
@anchor{library/stdtypes modules}@anchor{26c7}@anchor{library/stdtypes typesmodules}@anchor{26c8}
@subsubsection 모듈


모듈에 대한 유일한 특별한 연산은 어트리뷰트 액세스입니다: @code{m.name}. 여기서 `m' 은 모듈이고 `name' 은 `m' 의 심볼 테이블에 정의된 이름에 액세스합니다. 모듈 어트리뷰트는 대입할 수 있습니다. (@ref{7f7,,import} 문은 엄밀히 말하면 모듈 객체에 대한 연산이 아닙니다; @code{import foo} 는 `foo' 라는 이름의 모듈 객체가 존재할 것을 요구하지 않고, 어딘가에 있는 `foo' 라는 이름의 (외부) `정의' 를 요구합니다.

모든 모듈의 특수 어트리뷰트는 @ref{77c,,__dict__} 입니다. 이것은 모듈의 심볼 테이블을 저장하는 딕셔너리입니다. 이 딕셔너리를 수정하면 모듈의 심볼 테이블이 실제로 변경되지만, @code{__dict__} 어트리뷰트에 대한 직접 대입은 불가능합니다 (@code{m.__dict__['a'] = 1} 라고 쓸 수 있고, @code{m.a} 가 @code{1} 이 되지만, @code{m.__dict__ = @{@}} 라고 쓸 수는 없습니다). @code{__dict__} 의 직접적인 수정은 추천하지 않습니다.

인터프리터에 내장된 모듈은 다음과 같이 쓰입니다: @code{<module 'sys' (built-in)>}. 파일에서 로드되면, @code{<module 'os' from '/usr/local/lib/pythonX.Y/os.pyc'>} 처럼 쓰입니다.

@node 클래스와 클래스 인스턴스,함수,모듈<2>,기타 내장형
@anchor{library/stdtypes classes-and-class-instances}@anchor{26c9}@anchor{library/stdtypes typesobjects}@anchor{26ca}
@subsubsection 클래스와 클래스 인스턴스


여기에 대해서는 @ref{2329,,객체@comma{} 값@comma{} 형}와 @ref{14dc,,클래스 정의}를 참조하세요.

@node 함수,메서드,클래스와 클래스 인스턴스,기타 내장형
@anchor{library/stdtypes functions}@anchor{26cb}@anchor{library/stdtypes typesfunctions}@anchor{26cc}
@subsubsection 함수


함수 객체는 함수 정의로 만들어집니다. 함수 객체에 대한 유일한 연산은 호출하는 것입니다: @code{func(argument-list)}.

함수 객체에는 내장 함수와 사용자 정의 함수라는 두 가지 종류가 있습니다. 두 함수 모두 같은 연산(함수 호출)을 지원하지만, 구현이 다르므로 서로 다른 객체 형입니다.

자세한 정보는 @ref{2016,,함수 정의}을 보십시오.

@node 메서드,코드 객체,함수,기타 내장형
@anchor{library/stdtypes methods}@anchor{26cd}@anchor{library/stdtypes typesmethods}@anchor{26ce}
@subsubsection 메서드


@geindex object;method

Methods are functions that are called using the attribute notation.
There are two flavors: @ref{2357,,built-in methods}
(such as @ref{8db,,append()} on lists)
and @ref{20a5,,class instance method}.
Built-in methods are described with the types that support them.

If you access a method (a function defined in a class namespace) through an
instance, you get a special object: a `bound method' (also called
@ref{20a5,,instance method}) object. When called, it will add
the @code{self} argument
to the argument list.  Bound methods have two special read-only attributes:
@ref{15cd,,m.__self__} is the object on which the method
operates, and @ref{1501,,m.__func__} is
the function implementing the method.  Calling @code{m(arg-1, arg-2, ..., arg-n)}
is completely equivalent to calling @code{m.__func__(m.__self__, arg-1, arg-2, ...,
arg-n)}.

Like @ref{59b,,function objects}, bound method objects support
getting arbitrary
attributes.  However, since method attributes are actually stored on the
underlying function object (@ref{1501,,method.__func__}), setting method attributes on
bound methods is disallowed.  Attempting to set an attribute on a method
results in an @ref{5ee,,AttributeError} being raised.  In order to set a method
attribute, you need to explicitly set it on the underlying function object:

@example
>>> class C:
...     def method(self):
...         pass
...
>>> c = C()
>>> c.method.whoami = 'my name is method'  # can't set on the method
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'method' object has no attribute 'whoami'
>>> c.method.__func__.whoami = 'my name is method'
>>> c.method.whoami
'my name is method'
@end example

See @ref{20a5,,인스턴스 메서드(Instance methods)} for more information.

@geindex object;code
@geindex code object

@node 코드 객체,형 객체,메서드,기타 내장형
@anchor{library/stdtypes bltin-code-objects}@anchor{26cf}@anchor{library/stdtypes code-objects}@anchor{26d0}
@subsubsection 코드 객체


@geindex built-in function;compile
@geindex __code__ (function object attribute)

Code objects are used by the implementation to represent “pseudo-compiled”
executable Python code such as a function body. They differ from function
objects because they don’t contain a reference to their global execution
environment.  Code objects are returned by the built-in @ref{4b2,,compile()} function
and can be extracted from function objects through their
@ref{59c,,__code__} attribute. See also the @ref{1b,,code} module.

Accessing @ref{59c,,__code__} raises an @ref{1c6c,,auditing event}
@code{object.__getattr__} with arguments @code{obj} and @code{"__code__"}.

@geindex built-in function;exec
@geindex built-in function;eval

코드 객체는 @ref{4a3,,exec()} 또는 @ref{4a4,,eval()} 내장 함수에 (소스 문자열 대신) 전달하여 실행하거나 값을 구할 수 있습니다.

자세한 정보는 @ref{232c,,표준형 계층}를 보십시오.

@node 형 객체,널 객체,코드 객체,기타 내장형
@anchor{library/stdtypes bltin-type-objects}@anchor{25e1}@anchor{library/stdtypes type-objects}@anchor{26d1}
@subsubsection 형 객체


@geindex built-in function;type
@geindex module;types

형 객체는 다양한 객체 형을 나타냅니다. 객체의 형은 내장 함수 @ref{f43,,type()}으로 액세스할 수 있습니다. 형에는 특별한 연산이 없습니다. 표준 모듈 @ref{109,,types} 는 모든 표준 내장형의 이름을 정의합니다.

형은 다음과 같이 쓰입니다: @code{<class 'int'>}.

@node 널 객체,Ellipsis 객체,형 객체,기타 내장형
@anchor{library/stdtypes bltin-null-object}@anchor{26d2}@anchor{library/stdtypes the-null-object}@anchor{26d3}
@subsubsection 널 객체


이 객체는 명시적으로 값을 돌려주지 않는 함수에 의해 반환됩니다. 특별한 연산을 지원하지 않습니다. 정확하게 하나의 널 객체가 있으며, 이름은 @code{None}(내장 이름)입니다. @code{type(None)()} 은 같은 싱글톤을 만듭니다.

@code{None} 이라고 쓰입니다.

@geindex ...;ellipsis literal

@node Ellipsis 객체,NotImplemented 객체,널 객체,기타 내장형
@anchor{library/stdtypes bltin-ellipsis-object}@anchor{1ffa}@anchor{library/stdtypes the-ellipsis-object}@anchor{26d4}
@subsubsection Ellipsis 객체


This object is commonly used to indicate that something is omitted.
It supports no special operations.  There is exactly one ellipsis object, named
@ref{2325,,Ellipsis} (a built-in name).  @code{type(Ellipsis)()} produces the
@code{Ellipsis} singleton.

@code{Ellipsis} 나 @code{...} 로 쓰입니다.

In typical use, @code{...} as the @code{Ellipsis} object appears in a few different
places, for instance:


@itemize -

@item 
In type annotations, such as @ref{26d5,,callable arguments}
or @ref{26d6,,tuple elements}.

@item 
As the body of a function instead of a @ref{1ff9,,pass statement}.

@item 
In third-party libraries, such as Numpy's slicing and striding@footnote{https://numpy.org/doc/stable/user/basics.indexing.html#slicing-and-striding}.
@end itemize

Python also uses three dots in ways that are not @code{Ellipsis} objects, for instance:


@itemize -

@item 
Doctest’s @ref{1673,,ELLIPSIS}, as a pattern for missing content.

@item 
The default Python prompt of the @ref{1b5,,interactive} shell when partial input is incomplete.
@end itemize

Lastly, the Python documentation often uses three dots in conventional English
usage to mean omitted content, even in code examples that also use them as the
@code{Ellipsis}.

@node NotImplemented 객체,내부 객체,Ellipsis 객체,기타 내장형
@anchor{library/stdtypes bltin-notimplemented-object}@anchor{26d7}@anchor{library/stdtypes the-notimplemented-object}@anchor{26d8}
@subsubsection NotImplemented 객체


This object is returned from comparisons and binary operations when they are
asked to operate on types they don’t support. See @ref{24d0,,비교} for more
information.  There is exactly one @ref{1a2,,NotImplemented} object.
@code{type(NotImplemented)()} produces the singleton instance.

It is written as @code{NotImplemented}.

@node 내부 객체,,NotImplemented 객체,기타 내장형
@anchor{library/stdtypes internal-objects}@anchor{26d9}@anchor{library/stdtypes typesinternal}@anchor{26da}
@subsubsection 내부 객체


See @ref{232c,,표준형 계층} for this information.  It describes
@ref{8ee,,stack frame objects},
@ref{cea,,traceback objects}, and slice objects.

@node 특수 어트리뷰트,Integer string conversion length limitation,기타 내장형,내장형
@anchor{library/stdtypes special-attributes}@anchor{26db}@anchor{library/stdtypes specialattrs}@anchor{26dc}
@subsection 특수 어트리뷰트


관련성이 있을 때, 구현은 몇 가지 객체 유형에 몇 가지 특수 읽기 전용 어트리뷰트를 추가합니다. 이 중 일부는 @ref{843,,dir()} 내장 함수에 의해 보고되지 않습니다.

@geindex __name__ (definition의 속성)
@anchor{library/stdtypes definition __name__}@anchor{1265}
@deffn {속성} definition.__name__

클래스, 함수, 메서드, 디스크립터 또는 제너레이터 인스턴스의 이름.
@end deffn

@geindex __qualname__ (definition의 속성)
@anchor{library/stdtypes definition __qualname__}@anchor{1264}
@deffn {속성} definition.__qualname__

클래스, 함수, 메서드, 디스크립터 또는 제너레이터 인스턴스의 @ref{1d21,,정규화된 이름}.


Added in version 3.3.

@end deffn

@geindex __module__ (definition의 속성)
@anchor{library/stdtypes definition __module__}@anchor{26dd}
@deffn {속성} definition.__module__

The name of the module in which a class or function was defined.
@end deffn

@geindex __doc__ (definition의 속성)
@anchor{library/stdtypes definition __doc__}@anchor{b21}
@deffn {속성} definition.__doc__

The documentation string of a class or function, or @code{None} if undefined.
@end deffn

@geindex __type_params__ (definition의 속성)
@anchor{library/stdtypes definition __type_params__}@anchor{2594}
@deffn {속성} definition.__type_params__

The @ref{5ac,,type parameters} of generic classes, functions,
and @ref{682,,type aliases}. For classes and functions that
are not generic, this will be an empty tuple.


Added in version 3.12.

@end deffn

@node Integer string conversion length limitation,,특수 어트리뷰트,내장형
@anchor{library/stdtypes int-max-str-digits}@anchor{80a}@anchor{library/stdtypes integer-string-conversion-length-limitation}@anchor{26de}
@subsection Integer string conversion length limitation


CPython has a global limit for converting between @ref{19b,,int} and @ref{169,,str}
to mitigate denial of service attacks. This limit `only' applies to decimal or
other non-power-of-two number bases. Hexadecimal, octal, and binary conversions
are unlimited. The limit can be configured.

The @ref{19b,,int} type in CPython is an arbitrary length number stored in binary
form (commonly known as a “bignum”). There exists no algorithm that can convert
a string to a binary integer or a binary integer to a string in linear time,
`unless' the base is a power of 2. Even the best known algorithms for base 10
have sub-quadratic complexity. Converting a large value such as @code{int('1' *
500_000)} can take over a second on a fast CPU.

Limiting conversion size offers a practical way to avoid 
@geindex Common Vulnerabilities and Exposures; CVE 2020-10735
CVE 2020-10735@footnote{https://www.cve.org/CVERecord?id=CVE-2020-10735}.

The limit is applied to the number of digit characters in the input or output
string when a non-linear conversion algorithm would be involved.  Underscores
and the sign are not counted towards the limit.

When an operation would exceed the limit, a @ref{2ec,,ValueError} is raised:

@example
>>> import sys
>>> sys.set_int_max_str_digits(4300)  # Illustrative, this is the default.
>>> _ = int('2' * 5432)
Traceback (most recent call last):
...
ValueError: Exceeds the limit (4300 digits) for integer string conversion: value has 5432 digits; use sys.set_int_max_str_digits() to increase the limit
>>> i = int('2' * 4300)
>>> len(str(i))
4300
>>> i_squared = i*i
>>> len(str(i_squared))
Traceback (most recent call last):
...
ValueError: Exceeds the limit (4300 digits) for integer string conversion; use sys.set_int_max_str_digits() to increase the limit
>>> len(hex(i_squared))
7144
>>> assert int(hex(i_squared), base=16) == i*i  # Hexadecimal is unlimited.
@end example

The default limit is 4300 digits as provided in
@ref{1498,,sys.int_info.default_max_str_digits}.
The lowest limit that can be configured is 640 digits as provided in
@code{sys.int_info.str_digits_check_threshold}.

Verification:

@example
>>> import sys
>>> assert sys.int_info.default_max_str_digits == 4300, sys.int_info
>>> assert sys.int_info.str_digits_check_threshold == 640, sys.int_info
>>> msg = int('578966293710682886880994035146873798396722250538762761564'
...           '9252925514383915483333812743580549779436104706260696366600'
...           '571186405732').to_bytes(53, 'big')
...
@end example


Added in version 3.11.


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

@end menu

@node Affected APIs,Configuring the limit,,Integer string conversion length limitation
@anchor{library/stdtypes affected-apis}@anchor{26df}
@subsubsection Affected APIs


The limitation only applies to potentially slow conversions between @ref{19b,,int}
and @ref{169,,str} or @ref{192,,bytes}:


@itemize *

@item 
@code{int(string)} with default base 10.

@item 
@code{int(string, base)} for all bases that are not a power of 2.

@item 
@code{str(integer)}.

@item 
@code{repr(integer)}.

@item 
any other string conversion to base 10, for example @code{f"@{integer@}"},
@code{"@{@}".format(integer)}, or @code{b"%d" % integer}.
@end itemize

The limitations do not apply to functions with a linear algorithm:


@itemize *

@item 
@code{int(string, base)} with base 2, 4, 8, 16, or 32.

@item 
@ref{1be7,,int.from_bytes()} and @ref{1c30,,int.to_bytes()}.

@item 
@ref{14d4,,hex()}, @ref{14d3,,oct()}, @ref{14ad,,bin()}.

@item 
@ref{4f9,,Format specification mini-language} for hex, octal, and binary numbers.

@item 
@ref{169,,str} to @ref{196,,float}.

@item 
@ref{169,,str} to @ref{1fe,,decimal.Decimal}.
@end itemize

@node Configuring the limit,Recommended configuration,Affected APIs,Integer string conversion length limitation
@anchor{library/stdtypes configuring-the-limit}@anchor{26e0}
@subsubsection Configuring the limit


Before Python starts up you can use an environment variable or an interpreter
command line flag to configure the limit:


@itemize *

@item 
@geindex PYTHONINTMAXSTRDIGITS
@geindex 환경 변수; PYTHONINTMAXSTRDIGITS
@ref{1b38,,PYTHONINTMAXSTRDIGITS}, e.g.
@code{PYTHONINTMAXSTRDIGITS=640 python3} to set the limit to 640 or
@code{PYTHONINTMAXSTRDIGITS=0 python3} to disable the limitation.

@item 
@ref{16f,,-X int_max_str_digits}, e.g.
@code{python3 -X int_max_str_digits=640}

@item 
@ref{26e1,,sys.flags.int_max_str_digits} contains the value of
@geindex PYTHONINTMAXSTRDIGITS
@geindex 환경 변수; PYTHONINTMAXSTRDIGITS
@ref{1b38,,PYTHONINTMAXSTRDIGITS} or @ref{16f,,-X int_max_str_digits}.
If both the env var and the @code{-X} option are set, the @code{-X} option takes
precedence. A value of `-1' indicates that both were unset, thus a value of
@ref{26e2,,sys.int_info.default_max_str_digits} was used during initialization.
@end itemize

From code, you can inspect the current limit and set a new one using these
@ref{df,,sys} APIs:


@itemize *

@item 
@ref{181b,,sys.get_int_max_str_digits()} and @ref{18f2,,sys.set_int_max_str_digits()} are
a getter and setter for the interpreter-wide limit. Subinterpreters have
their own limit.
@end itemize

Information about the default and minimum can be found in @ref{1498,,sys.int_info}:


@itemize *

@item 
@ref{1498,,sys.int_info.default_max_str_digits} is the compiled-in
default limit.

@item 
@ref{1498,,sys.int_info.str_digits_check_threshold} is the lowest
accepted value for the limit (other than 0 which disables it).
@end itemize


Added in version 3.11.


@cartouche
@quotation 조심 
Setting a low limit `can' lead to problems. While rare, code exists that
contains integer constants in decimal in their source that exceed the
minimum threshold. A consequence of setting the limit is that Python source
code containing decimal integer literals longer than the limit will
encounter an error during parsing, usually at startup time or import time or
even at installation time - anytime an up to date @code{.pyc} does not already
exist for the code. A workaround for source that contains such large
constants is to convert them to @code{0x} hexadecimal form as it has no limit.

Test your application thoroughly if you use a low limit. Ensure your tests
run with the limit set early via the environment or flag so that it applies
during startup and even during any installation step that may invoke Python
to precompile @code{.py} sources to @code{.pyc} files.
@end quotation
@end cartouche

@node Recommended configuration,,Configuring the limit,Integer string conversion length limitation
@anchor{library/stdtypes recommended-configuration}@anchor{26e3}
@subsubsection Recommended configuration


The default @ref{26e2,,sys.int_info.default_max_str_digits} is expected to be
reasonable for most applications. If your application requires a different
limit, set it from your main entry point using Python version agnostic code as
these APIs were added in security patch releases in versions before 3.12.

Example:

@example
>>> import sys
>>> if hasattr(sys, "set_int_max_str_digits"):
...     upper_bound = 68000
...     lower_bound = 4004
...     current_limit = sys.get_int_max_str_digits()
...     if current_limit == 0 or current_limit > upper_bound:
...         sys.set_int_max_str_digits(upper_bound)
...     elif current_limit < lower_bound:
...         sys.set_int_max_str_digits(lower_bound)
@end example

If you need to disable it entirely, set it to @code{0}.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 내장 예외,Thread Safety Guarantees,내장형,파이썬 표준 라이브러리
@anchor{library/exceptions doc}@anchor{26e4}@anchor{library/exceptions bltin-exceptions}@anchor{1c25}@anchor{library/exceptions built-in-exceptions}@anchor{26e5}@anchor{library/exceptions translation-repo}@anchor{26e6}
@section 내장 예외


@geindex 문장;try
@geindex 문장;except

파이썬에서, 모든 예외는 @ref{7d6,,BaseException} 에서 파생된 클래스의 인스턴스여야 합니다. 특정 클래스를 언급하는 @ref{1ab,,except} 절을 갖는 @ref{8f7,,try} 문에서, 그 절은 그 클래스에서 파생된 모든 예외 클래스를 처리합니다 (하지만 `그것' 이 계승하는 예외 클래스는 처리하지 않습니다). 서브 클래싱을 통해 관련되지 않은 두 개의 예외 클래스는 같은 이름을 갖는다 할지라도 결코 등등하게 취급되지 않습니다.

@geindex 문장;raise

이 장에서 나열된 내장 예외는 인터프리터나 내장 함수에 의해 생성될 수 있습니다. 따로 언급된 경우를 제외하고는, 에러의 자세한 원인을 나타내는 “연관된 값”을 갖습니다. 이것은 여러 항목의 정보 (예, 에러 코드와 그 코드를 설명하는 문자열)를 담은 문자열이나 튜플 일 수 있습니다. 연관된 값은 보통 예외 클래스의 생성자에 인자로 전달됩니다.

사용자 코드는 내장 예외를 일으킬 수 있습니다. 이것은 예외 처리기를 검사하거나 인터프리터가 같은 예외를 발생시키는 상황과 “같은” 에러 조건을 보고하는 데 사용할 수 있습니다. 그러나 사용자 코드가 부적절한 에러를 발생시키는 것을 막을 방법이 없음을 유의하십시오.

내장 예외 클래스는 새 예외를 정의하기 위해 서브 클래싱 될 수 있습니다. @ref{7d6,,BaseException} 이 아니라 @ref{bcc,,Exception} 클래스 나 그 서브 클래스 중 하나에서 새로운 예외를 파생시킬 것을 권장합니다. 예외 정의에 대한 더 많은 정보는 파이썬 자습서의 @ref{207a,,사용자 정의 예외} 에 있습니다.

@menu
* 예외 컨텍스트:: 
* 내장 예외를 상속받기:: 
* 베이스 클래스:: 
* 구체적인 예외:: 
* 경고:: 
* 예외 그룹:: 
* 예외 계층 구조:: 

@end menu

@node 예외 컨텍스트,내장 예외를 상속받기,,내장 예외
@anchor{library/exceptions exception-context}@anchor{26e7}
@subsection 예외 컨텍스트


@geindex 예외;연쇄
@geindex __cause__ (예외 어트리뷰트)
@geindex __context__ (예외 어트리뷰트)
@geindex __suppress_context__ (예외 어트리뷰트)

Three attributes on exception objects provide information about the context in
which the exception was raised:

@geindex __context__ (BaseException의 속성)
@geindex __cause__ (BaseException의 속성)
@geindex __suppress_context__ (BaseException의 속성)
@anchor{library/exceptions BaseException __context__}@anchor{14cc}
@deffn {속성} BaseException.__context__
@anchor{library/exceptions BaseException __cause__}@anchor{14cd}
@deffnx {속성} BaseException.__cause__
@anchor{library/exceptions BaseException __suppress_context__}@anchor{2514}
@deffnx {속성} BaseException.__suppress_context__

When raising a new exception while another exception
is already being handled, the new exception’s
@code{__context__} attribute is automatically set to the handled
exception.  An exception may be handled when an @ref{1ab,,except} or
@ref{1b0,,finally} clause, or a @ref{186,,with} statement, is used.

이 묵시적인 예외 컨텍스트는 암시적인 예외 상황은 명시적 원인으로 보충될 수 있는데, @ref{802,,raise}와 @code{from}을 사용합니다:

@example
raise new_exc from original_exc
@end example

@ref{802,,from} 다음의 표현식은 예외이거나 @code{None} 이어야 합니다. 이 표현식을 새로 일으키는 예외의 @code{__cause__} 로 설정합니다. @code{__cause__} 를 설정하면, 묵시적으로 @code{__suppress_context__} 를 @code{True} 로 설정합니다. 그래서, @code{raise new_exc from None} 을 사용하면 표시의 목적상 이전 예외를 새로운 것으로 대체 하는 효과를 주면서 (예를 들어 @ref{5e5,,KeyError} 를 @ref{5ee,,AttributeError} 로), 디버깅할 때 검사할 수 있도록 이전의 예외를 @code{__context__} 에 남겨둡니다.

기본 트레이스백 표시 코드는 예외 자체의 트레이스백 뿐만 아니라 이러한 연결된 예외를 보여줍니다. @code{__cause__} 에 명시적으로 연결된 예외는 있으면 항상 표시됩니다. @code{__context__} 에 묵시적으로 연결된 예외는 @code{__cause__} 가 @ref{884,,None} 이고 @code{__suppress_context__} 가 거짓인 경우에만 표시됩니다.

두 경우 모두, 예외 자신은 항상 연결된 예외 뒤에 표시되어서, 트레이스백의 마지막 줄은 항상 마지막에 발생한 예외를 보여줍니다.
@end deffn

@node 내장 예외를 상속받기,베이스 클래스,예외 컨텍스트,내장 예외
@anchor{library/exceptions inheriting-from-built-in-exceptions}@anchor{26e8}
@subsection 내장 예외를 상속받기


User code can create subclasses that inherit from an exception type.
It’s recommended to only subclass one exception type at a time to avoid
any possible conflicts between how the bases handle the @code{args}
attribute, as well as due to possible memory layout incompatibilities.

`CPython 구현 상세:' Most built-in exceptions are implemented in C for efficiency, see:
Objects/exceptions.c@footnote{https://github.com/python/cpython/tree/3.14/Objects/exceptions.c}.  Some have custom memory layouts
which makes it impossible to create a subclass that inherits from
multiple exception types. The memory layout of a type is an implementation
detail and might change between Python versions, leading to new
conflicts in the future.  Therefore, it’s recommended to avoid
subclassing multiple exception types altogether.

@node 베이스 클래스,구체적인 예외,내장 예외를 상속받기,내장 예외
@anchor{library/exceptions base-classes}@anchor{26e9}
@subsection 베이스 클래스


다음 예외는 주로 다른 예외의 베이스 클래스로 사용됩니다.

@geindex BaseException
@anchor{library/exceptions BaseException}@anchor{7d6}
@deffn {예외} BaseException

모든 내장 예외의 베이스 클래스입니다. 사용자 정의 클래스에 의해 직접 상속되는 것이 아닙니다 (그런 목적으로는 @ref{bcc,,Exception}을 사용하세요). 이 클래스의 인스턴스에 대해 @ref{169,,str()} 이 호출되면, 인스턴스로 전달된 인자(들)의 표현을 돌려줍니다. 인자가 없는 경우는 빈 문자열을 돌려줍니다.

@geindex args (BaseException의 속성)
@anchor{library/exceptions BaseException args}@anchor{78c}
@deffn {속성} args

예외 생성자에 주어진 인자들의 튜플. 일부 내장 예외(예, @ref{2c0,,OSError})는 특정 수의 인자를 기대하고 이 튜플의 요소에 특별한 의미를 할당하는 반면, 다른 것들은 보통 오류 메시지를 제공하는 단일 문자열로만 호출됩니다.
@end deffn

@geindex with_traceback() (BaseException 메서드)
@anchor{library/exceptions BaseException with_traceback}@anchor{2513}
@deffn {메서드} with_traceback (tb)

This method sets `tb' as the new traceback for the exception and returns
the exception object.  It was more commonly used before the exception
chaining features of 
@geindex Python 향상 제안; PEP 3134
PEP 3134@footnote{https://peps.python.org/pep-3134/} became available.  The following example
shows how we can convert an instance of @code{SomeException} into an
instance of @code{OtherException} while preserving the traceback.  Once
raised, the current frame is pushed onto the traceback of the
@code{OtherException}, as would have happened to the traceback of the
original @code{SomeException} had we allowed it to propagate to the caller.

@example
try:
    ...
except SomeException:
    tb = sys.exception().__traceback__
    raise OtherException(...).with_traceback(tb)
@end example
@end deffn

@geindex __traceback__ (BaseException의 속성)
@anchor{library/exceptions BaseException __traceback__}@anchor{14cb}
@deffn {속성} __traceback__

A writable field that holds the
@ref{cea,,traceback object} associated with this
exception. See also: @ref{802,,raise 문}.
@end deffn

@geindex add_note() (BaseException 메서드)
@anchor{library/exceptions BaseException add_note}@anchor{7d5}
@deffn {메서드} add_note (note)

Add the string @code{note} to the exception’s notes which appear in the standard
traceback after the exception string. A @ref{198,,TypeError} is raised if @code{note}
is not a string.


Added in version 3.11.

@end deffn

@geindex __notes__ (BaseException의 속성)
@anchor{library/exceptions BaseException __notes__}@anchor{26ea}
@deffn {속성} __notes__

A list of the notes of this exception, which were added with @ref{7d5,,add_note()}.
This attribute is created when @code{add_note()} is called.


Added in version 3.11.

@end deffn
@end deffn

@geindex Exception
@anchor{library/exceptions Exception}@anchor{bcc}
@deffn {예외} Exception

모든 시스템 종료 외의 내장 예외는 이 클래스 파생됩니다. 모든 사용자 정의 예외도 이 클래스에서 파생되어야 합니다.
@end deffn

@geindex ArithmeticError
@anchor{library/exceptions ArithmeticError}@anchor{26eb}
@deffn {예외} ArithmeticError

다양한 산술 에러가 일으키는 내장 예외들의 베이스 클래스: @ref{a81,,OverflowError}, @ref{b3f,,ZeroDivisionError}, @ref{26ec,,FloatingPointError}.
@end deffn

@geindex BufferError
@anchor{library/exceptions BufferError}@anchor{179f}
@deffn {예외} BufferError

@ref{260,,버퍼} 관련 연산을 수행할 수 없을 때 발생합니다.
@end deffn

@geindex LookupError
@anchor{library/exceptions LookupError}@anchor{23e5}
@deffn {예외} LookupError

매핑 또는 시퀀스에 사용된 키 나 인덱스가 잘못되었을 때 발생하는 예외의 베이스 클래스: @ref{173a,,IndexError}, @ref{5e5,,KeyError}. @ref{b5c,,codecs.lookup()} 은 이 예외를 직접 일으킬 수 있습니다.
@end deffn

@node 구체적인 예외,경고,베이스 클래스,내장 예외
@anchor{library/exceptions concrete-exceptions}@anchor{26ed}
@subsection 구체적인 예외


다음 예외는 일반적으로 직접 일으키는데 사용하는 예외입니다.

@geindex AssertionError
@anchor{library/exceptions AssertionError}@anchor{8b7}
@deffn {예외} AssertionError

@geindex 문장;assert

@ref{b60,,assert} 문이 실패할 때 발생합니다.
@end deffn

@geindex AttributeError
@anchor{library/exceptions AttributeError}@anchor{5ee}
@deffn {예외} AttributeError

어트리뷰트 참조(@ref{24a9,,어트리뷰트 참조}를 보세요)나 대입이 실패할 때 발생합니다. (객체가 어트리뷰트 참조나 어트리뷰트 대입을 아예 지원하지 않으면 @ref{198,,TypeError} 가 발생합니다.)

The optional `name' and `obj' keyword-only arguments
set the corresponding attributes:

@geindex name (AttributeError의 속성)
@anchor{library/exceptions AttributeError name}@anchor{26ee}
@deffn {속성} name

The name of the attribute that was attempted to be accessed.
@end deffn

@geindex obj (AttributeError의 속성)
@anchor{library/exceptions AttributeError obj}@anchor{26ef}
@deffn {속성} obj

The object that was accessed for the named attribute.
@end deffn


버전 3.10에서 변경: @ref{26ee,,name}과 @ref{26ef,,obj} 어트리뷰트를 추가했습니다.

@end deffn

@geindex EOFError
@anchor{library/exceptions EOFError}@anchor{14de}
@deffn {예외} EOFError

Raised when the @ref{14dd,,input()} function hits an end-of-file condition (EOF)
without reading any data. (Note: the @ref{206a,,io.TextIOBase.read()} and
@ref{152e,,io.IOBase.readline()} methods return an empty string when they hit EOF.)
@end deffn

@geindex FloatingPointError
@anchor{library/exceptions FloatingPointError}@anchor{26ec}
@deffn {예외} FloatingPointError

현재 사용되지 않습니다.
@end deffn

@geindex GeneratorExit
@anchor{library/exceptions GeneratorExit}@anchor{15cc}
@deffn {예외} GeneratorExit

@ref{1260,,제너레이터} 또는 @ref{6b8,,코루틴} 이 닫힐 때 발생합니다; @ref{179b,,generator.close()} 와 @ref{241b,,coroutine.close()} 를 보십시오. 기술적으로 에러가 아니므로 @ref{bcc,,Exception} 대신에 @ref{7d6,,BaseException} 을 직접 계승합니다.
@end deffn

@geindex ImportError
@anchor{library/exceptions ImportError}@anchor{659}
@deffn {예외} ImportError

@ref{7f7,,import} 문이 모듈을 로드하는 데 문제가 있을 때 발생합니다. 또한 @code{from ... import} 에서 임포트 하려는 이름을 찾을 수 없을 때도 발생합니다.

The optional `name' and `path' keyword-only arguments
set the corresponding attributes:

@geindex name (ImportError의 속성)
@anchor{library/exceptions ImportError name}@anchor{26f0}
@deffn {속성} name

임포트가 시도된 모듈의 이름.
@end deffn

@geindex path (ImportError의 속성)
@anchor{library/exceptions ImportError path}@anchor{26f1}
@deffn {속성} path

The path to any file which triggered the exception.
@end deffn


버전 3.3에서 변경: @ref{26f0,,name}과 @ref{26f1,,path} 어트리뷰트를 추가했습니다.

@end deffn

@geindex ModuleNotFoundError
@anchor{library/exceptions ModuleNotFoundError}@anchor{d3c}
@deffn {예외} ModuleNotFoundError

@ref{659,,ImportError} 의 서브 클래스인데, 모듈을 찾을 수 없을 때 @ref{7f7,,import} 가 일으킵니다. @ref{17ea,,sys.modules} 에서 @code{None} 이 발견될 때도 발생합니다.


Added in version 3.6.

@end deffn

@geindex IndexError
@anchor{library/exceptions IndexError}@anchor{173a}
@deffn {예외} IndexError

시퀀스 인덱스가 범위를 벗어날 때 발생합니다. (슬라이스 인덱스는 허용된 범위 내에 들어가도록 자동으로 잘립니다; 인덱스가 정수가 아니면 @ref{198,,TypeError} 가 발생합니다.)

@c XXX xref to sequences
@end deffn

@geindex KeyError
@anchor{library/exceptions KeyError}@anchor{5e5}
@deffn {예외} KeyError

매핑 (딕셔너리) 키가 기존 키 집합에서 발견되지 않을 때 발생합니다.

@c XXX xref to mapping objects?
@end deffn

@geindex KeyboardInterrupt
@anchor{library/exceptions KeyboardInterrupt}@anchor{bc4}
@deffn {예외} KeyboardInterrupt

사용자가 인터럽트 키(일반적으로 @code{Control}-@code{C} 또는 @code{Delete})를 누를 때 발생합니다. 실행 중에 인터럽트 검사가 정기적으로 수행됩니다. @ref{bcc,,Exception}을 잡는 코드에 의해 우연히 잡혀서, 인터프리터가 종료하는 것을 막지 못하도록 @ref{7d6,,BaseException} 를 계승합니다.

@cartouche
@quotation 참고 
Catching a @code{KeyboardInterrupt} requires special consideration.
Because it can be raised at unpredictable points, it may, in some
circumstances, leave the running program in an inconsistent state. It is
generally best to allow @code{KeyboardInterrupt} to end the program as
quickly as possible or avoid raising it entirely. (See
@ref{26f2,,신호 처리기와 예외에 대한 참고 사항}.)
@end quotation
@end cartouche
@end deffn

@geindex MemoryError
@anchor{library/exceptions MemoryError}@anchor{175f}
@deffn {예외} MemoryError

작업에 메모리가 부족하지만, 상황이 여전히 (일부 객체를 삭제해서) 복구될 수 있는 경우 발생합니다. 연관된 값은 어떤 종류의 (내부) 연산이 메모리를 다 써 버렸는지를 나타내는 문자열입니다. 하부 메모리 관리 아키텍처(C의 @code{malloc()} 함수)때문에, 인터프리터가 항상 이 상황을 완벽하게 복구할 수 있는 것은 아닙니다; 그런데도 통제를 벗어난 프로그램이 원인인 경우를 위해, 스택 트레이스백을 인쇄할 수 있도록 예외를 일으킵니다.
@end deffn

@geindex NameError
@anchor{library/exceptions NameError}@anchor{452}
@deffn {예외} NameError

지역 또는 전역 이름을 찾을 수 없을 때 발생합니다. 이는 정규화되지 않은 이름에만 적용됩니다. 연관된 값은 찾을 수 없는 이름을 포함하는 에러 메시지입니다.

The optional `name' keyword-only argument sets the attribute:

@geindex name (NameError의 속성)
@anchor{library/exceptions NameError name}@anchor{26f3}
@deffn {속성} name

The name of the variable that was attempted to be accessed.
@end deffn


버전 3.10에서 변경: @ref{26f3,,name} 어트리뷰트를 추가했습니다.

@end deffn

@geindex NotImplementedError
@anchor{library/exceptions NotImplementedError}@anchor{36b}
@deffn {예외} NotImplementedError

이 예외는 @ref{244,,RuntimeError} 에서 파생됩니다. 사용자 정의 베이스 클래스에서, 파생 클래스가 재정의하도록 요구하는 추상 메서드나, 클래스가 개발되는 도중에 실제 구현이 추가될 필요가 있음을 나타낼 때 이 예외를 발생시켜야 합니다.

@cartouche
@quotation 참고 
연산자 나 메서드가 아예 지원되지 않는다는 것을 나타내는 데 사용해서는 안 됩니다 – 그 경우는 연산자 / 메서드를 정의하지 않거나, 서브 클래스면 @ref{884,,None} 으로 설정하십시오.
@end quotation
@end cartouche

@cartouche
@quotation 조심 
@code{NotImplementedError} 와 @code{NotImplemented} 는 바꿔쓸 수 없습니다. 이 예외는 위에서 설명한 대로만 사용되어야 합니다; 내장 상수의 올바른 사용에 대한 자세한 내용은 @ref{1a2,,NotImplemented} 를 참조하세요.
@end quotation
@end cartouche
@end deffn

@geindex OSError
@anchor{library/exceptions OSError}@anchor{2c0}
@deffn {예외} OSError ([arg])

@deffnx {예외} OSError (errno, strerror[, filename[, winerror[, filename2]]])

@geindex 모듈;errno

이 예외는 시스템 함수가 시스템 관련 에러를 돌려줄 때 발생하는데, “파일을 찾을 수 없습니다(file not found)” 나 “디스크가 꽉 찼습니다(disk full)” 와 같은 (잘못된 인자형이나 다른 부수적인 에러가 아닌) 입출력 실패를 포함합니다.

생성자의 두 번째 형식은 아래에 설명된 해당 어트리뷰트를 설정합니다. 어트리뷰트를 지정하지 않으면 기본적으로 @ref{884,,None} 이 됩니다. 이전 버전과의 호환성을 위해, 세 개의 인자가 전달되면, @ref{78c,,args} 어트리뷰트는 처음 두 생성자 인자의 2-튜플만 포함합니다.

아래의 @ref{26f4,,OS 예외} 에서 설명하는 것처럼, 생성자는 종종 @ref{2c0,,OSError} 의 서브 클래스를 돌려줍니다. 구체적인 서브 클래스는 최종 @ref{17ba,,errno} 값에 따라 다릅니다. 이 동작은 @code{OSError} 를 직접 혹은 별칭을 통해 생성할 때만 일어나고, 서브 클래싱할 때는 상속되지 않습니다.

@geindex errno (OSError의 속성)
@anchor{library/exceptions OSError errno}@anchor{17ba}
@deffn {속성} errno

C 변수 @code{errno} 로부터 온 숫자 에러 코드.
@end deffn

@geindex winerror (OSError의 속성)
@anchor{library/exceptions OSError winerror}@anchor{26f5}
@deffn {속성} winerror

윈도우에서, 네이티브 윈도우 에러 코드를 제공합니다. @ref{17ba,,errno} 어트리뷰트는 이 네이티브 에러 코드를 POSIX 코드로 대략 변환한 것입니다.

윈도우에서, `winerror' 생성자 인자가 정수인 경우, @ref{17ba,,errno} 어트리뷰트는 윈도우 에러 코드에서 결정되며 `errno' 인자는 무시됩니다. 다른 플랫폼에서는 `winerror' 인자가 무시되고 @ref{26f5,,winerror} 어트리뷰트가 없습니다.
@end deffn

@geindex strerror (OSError의 속성)
@anchor{library/exceptions OSError strerror}@anchor{26f6}
@deffn {속성} strerror

The corresponding error message, as provided by
the operating system.  It is formatted by the C
functions @code{perror()} under POSIX, and @code{FormatMessage()}
under Windows.
@end deffn

@geindex filename (OSError의 속성)
@geindex filename2 (OSError의 속성)
@anchor{library/exceptions OSError filename}@anchor{26f7}
@deffn {속성} filename
@anchor{library/exceptions OSError filename2}@anchor{26f8}
@deffnx {속성} filename2

(@ref{316,,open()} 또는 @ref{12fa,,os.unlink()} 와 같은) 파일 시스템 경로와 관련된 예외의 경우, @ref{26f7,,filename} 은 함수에 전달 된 파일 이름입니다. (@ref{12f6,,os.rename()}처럼) 두 개의 파일 시스템 경로를 수반하는 함수의 경우, @ref{26f8,,filename2} 는 두 번째 파일 이름에 해당합니다.
@end deffn


버전 3.3에서 변경: @ref{1253,,EnvironmentError}, @ref{1252,,IOError}, @ref{1254,,WindowsError},
@ref{1255,,socket.error}, @ref{1256,,select.error} and
@code{mmap.error} have been merged into @ref{2c0,,OSError}, and the
constructor may return a subclass.



버전 3.4에서 변경: @ref{26f7,,filename} 속성은 이제 @ref{75c,,파일 시스템 인코딩과 에러 처리기}로 인코딩되거나 디코딩된 이름 대신 함수에 전달 된 원래 파일 이름입니다. 또한 `filename2' 생성자 인자 및 어트리뷰트가 추가되었습니다.

@end deffn

@geindex OverflowError
@anchor{library/exceptions OverflowError}@anchor{a81}
@deffn {예외} OverflowError

산술 연산의 결과가 너무 커서 표현할 수 없을 때 발생합니다. 정수에서는 발생하지 않습니다 (포기하기보다는 @ref{175f,,MemoryError} 를 일으키게 될 겁니다). 그러나, 역사적인 이유로, 때로 OverflowError는 요구되는 범위를 벗어난 정수의 경우도 발생합니다. C에서 부동 소수점 예외 처리의 표준화가 부족하므로, 대부분의 부동 소수점 연산은 검사되지 않습니다.
@end deffn

@geindex PythonFinalizationError
@anchor{library/exceptions PythonFinalizationError}@anchor{479}
@deffn {예외} PythonFinalizationError

This exception is derived from @ref{244,,RuntimeError}.  It is raised when
an operation is blocked during interpreter shutdown also known as
@ref{47a,,Python finalization}.

Examples of operations which can be blocked with a
@code{PythonFinalizationError} during the Python finalization:


@itemize *

@item 
Creating a new Python thread.

@item 
@ref{13e9,,Joining} a running daemon thread.

@item 
@ref{4b6,,os.fork()}.
@end itemize

See also the @ref{c7f,,sys.is_finalizing()} function.


Added in version 3.13: 이전에는 평범한 @ref{244,,RuntimeError} 가 발생했습니다.



버전 3.14에서 변경: @ref{13e9,,threading.Thread.join()} can now raise this exception.

@end deffn

@geindex RecursionError
@anchor{library/exceptions RecursionError}@anchor{f67}
@deffn {예외} RecursionError

이 예외는 @ref{244,,RuntimeError} 에서 파생됩니다. 인터프리터가 최대 재귀 깊이(@ref{6ea,,sys.getrecursionlimit()} 참조)가 초과하였음을 감지할 때 발생합니다.


Added in version 3.5: 이전에는 평범한 @ref{244,,RuntimeError} 가 발생했습니다.

@end deffn

@geindex ReferenceError
@anchor{library/exceptions ReferenceError}@anchor{1712}
@deffn {예외} ReferenceError

이 예외는 @ref{c45,,weakref.proxy()} 함수가 만든 약한 참조 프락시가 이미 가비지 수집된 참조 대상의 어트리뷰트를 액세스하는 데 사용될 때 발생합니다. 약한 참조에 대한 더 자세한 정보는 @ref{11a,,weakref} 모듈을 보십시오.
@end deffn

@geindex RuntimeError
@anchor{library/exceptions RuntimeError}@anchor{244}
@deffn {예외} RuntimeError

다른 범주에 속하지 않는 에러가 감지될 때 발생합니다. 연관된 값은 정확히 무엇이 잘못되었는지를 나타내는 문자열입니다.
@end deffn

@geindex StopIteration
@anchor{library/exceptions StopIteration}@anchor{df4}
@deffn {예외} StopIteration

이터레이터에 의해 생성된 항목이 더 없다는 것을 알려주기 위해, 내장 함수 @ref{9d8,,next()}와 @ref{4ca,,이터레이터}의 @ref{14d2,,__next__()} 메서드가 일으킵니다.

@geindex value (StopIteration의 속성)
@anchor{library/exceptions StopIteration value}@anchor{2417}
@deffn {속성} value

예외 객체는 @code{value}라는 하나의 어트리뷰트를 가지고 있습니다. 이 어트리뷰트는 예외를 생성할 때 인자로 주어지며, 기본값은 @ref{884,,None} 입니다.
@end deffn

@ref{1260,,제너레이터} 나 @ref{6b8,,코루틴} 함수가 복귀할 때, 새 @ref{df4,,StopIteration} 인스턴스를 발생시키고, 함수가 돌려주는 값을 예외 생성자의 @ref{2417,,value} 매개변수로 사용합니다.

제너레이터 코드가 직간접적으로 @ref{df4,,StopIteration} 를 일으키면, @ref{244,,RuntimeError} 로 변환됩니다 (@code{StopIteration} 은 새 예외의 원인(@code{__cause__})으로 남겨둡니다).


버전 3.3에서 변경: @code{value} 어트리뷰트와 제너레이터 함수가 이 값을 돌려주는 기능을 추가했습니다.



버전 3.5에서 변경: @code{from __future__ import generator_stop} 를 통한 RuntimeError 변환을 도입했습니다. 
@geindex Python 향상 제안; PEP 479
PEP 479@footnote{https://peps.python.org/pep-0479/}를 참조하세요.



버전 3.7에서 변경: 기본적으로 모든 코드에서 
@geindex Python 향상 제안; PEP 479
PEP 479@footnote{https://peps.python.org/pep-0479/}를 활성화합니다: 제너레이터에서 발생한 @ref{df4,,StopIteration} 에러는 @ref{244,,RuntimeError} 로 변환됩니다.

@end deffn

@geindex StopAsyncIteration
@anchor{library/exceptions StopAsyncIteration}@anchor{1e0c}
@deffn {예외} StopAsyncIteration

반드시 @ref{4c8,,비동기 이터레이터} 객체의 @ref{1885,,__anext__()} 메서드가 이터레이션을 멈추고자 할 때 발생시켜야 합니다.


Added in version 3.5.

@end deffn

@geindex SyntaxError
@anchor{library/exceptions SyntaxError}@anchor{18e}
@deffn {예외} SyntaxError (message, details)

파서가 문법 오류를 만날 때 발생합니다. @ref{7f7,,import} 문에서, 내장 함수 @ref{4b2,,compile()}, @ref{4a3,,exec()} 또는 @ref{4a4,,eval()} 호출에서, 초기 스크립트나 (대화형으로) 표준 입력을 읽을 때 발생할 수 있습니다.

예외 인스턴스의 @ref{169,,str()}은 에러 메시지만 돌려줍니다. details는 각 멤버가 별도의 어트리뷰트로도 제공되는 튜플입니다.

@geindex filename (SyntaxError의 속성)
@anchor{library/exceptions SyntaxError filename}@anchor{26f9}
@deffn {속성} filename

문법 오류가 발생한 파일의 이름.
@end deffn

@geindex lineno (SyntaxError의 속성)
@anchor{library/exceptions SyntaxError lineno}@anchor{26fa}
@deffn {속성} lineno

오류가 발생한 파일의 줄 번호. 1-인덱싱됩니다: 파일의 첫 번째 줄은 @code{lineno}가 1입니다.
@end deffn

@geindex offset (SyntaxError의 속성)
@anchor{library/exceptions SyntaxError offset}@anchor{26fb}
@deffn {속성} offset

오류가 발생한 줄의 열. 1-인덱싱됩니다: 줄의 첫 번째 문자는 @code{offset}이 1입니다.
@end deffn

@geindex text (SyntaxError의 속성)
@anchor{library/exceptions SyntaxError text}@anchor{26fc}
@deffn {속성} text

오류를 수반한 소스 코드 텍스트.
@end deffn

@geindex end_lineno (SyntaxError의 속성)
@anchor{library/exceptions SyntaxError end_lineno}@anchor{26fd}
@deffn {속성} end_lineno

오류가 발생한 파일의 끝나는 줄 번호. 1-인덱싱됩니다: 파일의 첫 번째 줄은 @code{lineno}가 1입니다.
@end deffn

@geindex end_offset (SyntaxError의 속성)
@anchor{library/exceptions SyntaxError end_offset}@anchor{26fe}
@deffn {속성} end_offset

발생한 오류가 끝나는 줄의 열. 1-인덱싱됩니다: 줄의 첫 번째 문자는 @code{offset}이 1입니다.
@end deffn

For errors in f-string fields, the message is prefixed by “f-string: ”
and the offsets are offsets in a text constructed from the replacement
expression.  For example, compiling f’Bad @{a b@} field’ results in this
args attribute: (‘f-string: …’, (‘’, 1, 2, ‘(a b)n’, 1, 5)).


버전 3.10에서 변경: @ref{26fd,,end_lineno}과 @ref{26fe,,end_offset} 어트리뷰트를 추가했습니다.

@end deffn

@geindex IndentationError
@anchor{library/exceptions IndentationError}@anchor{9ab}
@deffn {예외} IndentationError

잘못된 들여쓰기와 관련된 문법 오류의 베이스 클래스입니다. @ref{18e,,SyntaxError} 의 서브 클래스입니다.
@end deffn

@geindex TabError
@anchor{library/exceptions TabError}@anchor{764}
@deffn {예외} TabError

들여쓰기가 일관성없는 탭과 스페이스 사용을 포함하는 경우 발생합니다. @ref{9ab,,IndentationError} 의 서브 클래스입니다.
@end deffn

@geindex SystemError
@anchor{library/exceptions SystemError}@anchor{794}
@deffn {예외} SystemError

인터프리터가 내부 에러를 발견했지만, 모든 희망을 포기할 만큼 상황이 심각해 보이지는 않을 때 발생합니다. 연관된 값은 무엇이 잘못되었는지 (저수준의 용어로) 나타내는 문자열입니다. @ref{904,,CPython}에서, 이는 가령 예외를 설정하지 않고 @code{NULL}을 반환하는 것과 같이, 파이썬의 C API를 잘못 사용함으로써 발생할 수 있습니다.

이 예외가 여러분이나 사용 중인 패키지의 책임이 아니라고 확싱한다면, 파이썬 인터프리터의 저자나 관리자에게 알려야 합니다. 파이썬 인터프리터의 버전 (@code{sys.version}; 대화식 파이썬 세션의 시작 부분에도 출력됩니다), 정확한 에러 메시지 (예외의 연관된 값) 그리고 가능하다면 에러를 일으킨 프로그램의 소스를 제공해 주십시오.
@end deffn

@geindex SystemExit
@anchor{library/exceptions SystemExit}@anchor{f3b}
@deffn {예외} SystemExit

This exception is raised by the @ref{277,,sys.exit()} function.  It inherits from
@ref{7d6,,BaseException} instead of @ref{bcc,,Exception} so that it is not accidentally
caught by code that catches @code{Exception}.  This allows the exception to
properly propagate up and cause the interpreter to exit.  When it is not
handled, the Python interpreter exits; no stack traceback is printed.  The
constructor accepts the same optional argument passed to @code{sys.exit()}.
If the value is an integer, it specifies the system exit status (passed to
C’s @code{exit()} function); if it is @code{None}, the exit status is zero; if
it has another type (such as a string), the object’s value is printed and
the exit status is one.

@ref{277,,sys.exit()} 에 대한 호출은 예외로 변환되어 뒷정리 처리기 (@ref{8f7,,try} 문의 @ref{1b0,,finally} 절) 가 실행될 수 있도록 합니다. 그래서 디버거는 제어권을 잃을 위험 없이 스크립트를 실행할 수 있습니다. 즉시 종료가 절대적으로 필요한 경우에는 @ref{26ff,,os._exit()} 함수를 사용할 수 있습니다 (예를 들어, @ref{4b6,,os.fork()} 호출 후의 자식 프로세스에서).

@geindex code (SystemExit의 속성)
@anchor{library/exceptions SystemExit code}@anchor{2700}
@deffn {속성} code

생성자에 전달되는 종료 상태 또는 에러 메시지입니다. (기본값은 @code{None} 입니다.)
@end deffn
@end deffn

@geindex TypeError
@anchor{library/exceptions TypeError}@anchor{198}
@deffn {예외} TypeError

연산이나 함수가 부적절한 형의 객체에 적용될 때 발생합니다. 연관된 값은 형 불일치에 대한 세부 정보를 제공하는 문자열입니다.

이 예외는 객체에 시도된 연산이 지원되지 않으며 그럴 의도도 없음을 나타내기 위해 사용자 코드가 발생시킬 수 있습니다. 만약 객체가 주어진 연산을 지원할 의사는 있지만, 아직 구현을 제공하지 않는 경우라면, @ref{36b,,NotImplementedError} 를 발생시키는 것이 적합합니다.

잘못된 형의 인자를 전달하면 (가령 @ref{19b,,int} 를 기대하는데 @ref{24d,,list}를 전달하기), @ref{198,,TypeError} 를 일으켜야 합니다. 하지만 잘못된 값을 갖는 인자를 전달하면 (가령 범위를 넘어서는 숫자) @ref{2ec,,ValueError} 를 일으켜야 합니다.
@end deffn

@geindex UnboundLocalError
@anchor{library/exceptions UnboundLocalError}@anchor{173b}
@deffn {예외} UnboundLocalError

함수 나 메서드에서 지역 변수를 참조하지만, 해당 변수에 값이 연결되지 않으면 발생합니다. 이것은 @ref{452,,NameError} 의 서브 클래스입니다.
@end deffn

@geindex UnicodeError
@anchor{library/exceptions UnicodeError}@anchor{462}
@deffn {예외} UnicodeError

유니코드 관련 인코딩 또는 디코딩 에러가 일어날 때 발생합니다. @ref{2ec,,ValueError} 의 서브 클래스입니다.

@ref{462,,UnicodeError} 는 인코딩이나 디코딩 에러를 설명하는 어트리뷰트를 가지고 있습니다. 예를 들어, @code{err.object[err.start:err.end]} 는 코덱이 실패한 잘못된 입력을 제공합니다.

@geindex encoding (UnicodeError의 속성)
@anchor{library/exceptions UnicodeError encoding}@anchor{2701}
@deffn {속성} encoding

에러를 발생시킨 인코딩의 이름입니다.
@end deffn

@geindex reason (UnicodeError의 속성)
@anchor{library/exceptions UnicodeError reason}@anchor{2702}
@deffn {속성} reason

구체적인 코덱 오류를 설명하는 문자열입니다.
@end deffn

@geindex object (UnicodeError의 속성)
@anchor{library/exceptions UnicodeError object}@anchor{18fd}
@deffn {속성} object

코덱이 인코딩 또는 디코딩하려고 시도한 객체입니다.
@end deffn

@geindex start (UnicodeError의 속성)
@anchor{library/exceptions UnicodeError start}@anchor{18c1}
@deffn {속성} start

@ref{c7d,,object} 에 있는 잘못된 데이터의 최초 인덱스입니다.

This value should not be negative as it is interpreted as an
absolute offset but this constraint is not enforced at runtime.
@end deffn

@geindex end (UnicodeError의 속성)
@anchor{library/exceptions UnicodeError end}@anchor{18c2}
@deffn {속성} end

@ref{c7d,,object} 에 있는 마지막으로 잘못된 데이터의 바로 다음 인덱스입니다.

This value should not be negative as it is interpreted as an
absolute offset but this constraint is not enforced at runtime.
@end deffn
@end deffn

@geindex UnicodeEncodeError
@anchor{library/exceptions UnicodeEncodeError}@anchor{886}
@deffn {예외} UnicodeEncodeError

인코딩 중에 유니코드 관련 에러가 일어나면 발생합니다. @ref{462,,UnicodeError} 의 서브 클래스입니다.
@end deffn

@geindex UnicodeDecodeError
@anchor{library/exceptions UnicodeDecodeError}@anchor{c07}
@deffn {예외} UnicodeDecodeError

디코딩 중에 유니코드 관련 에러가 일어나면 발생합니다. @ref{462,,UnicodeError} 의 서브 클래스입니다.
@end deffn

@geindex UnicodeTranslateError
@anchor{library/exceptions UnicodeTranslateError}@anchor{18fe}
@deffn {예외} UnicodeTranslateError

번역 중에 유니코드 관련 에러가 일어나면 발생합니다. @ref{462,,UnicodeError} 의 서브 클래스입니다.
@end deffn

@geindex ValueError
@anchor{library/exceptions ValueError}@anchor{2ec}
@deffn {예외} ValueError

연산이나 함수가 올바른 형이지만 부적절한 값을 가진 인자를 받았고, 상황이 @ref{173a,,IndexError} 처럼 더 구체적인 예외로 설명되지 않는 경우 발생합니다.
@end deffn

@geindex ZeroDivisionError
@anchor{library/exceptions ZeroDivisionError}@anchor{b3f}
@deffn {예외} ZeroDivisionError

나누기 또는 모듈로 연산의 두 번째 인자가 0일 때 발생합니다. 연관된 값은 피연산자의 형과 연산을 나타내는 문자열입니다.
@end deffn

다음 예외는 이전 버전과의 호환성을 위해 유지됩니다; 파이썬 3.3부터는 @ref{2c0,,OSError} 의 별칭입니다.

@geindex EnvironmentError
@anchor{library/exceptions EnvironmentError}@anchor{1253}
@deffn {예외} EnvironmentError
@end deffn

@geindex IOError
@anchor{library/exceptions IOError}@anchor{1252}
@deffn {예외} IOError
@end deffn

@geindex WindowsError
@anchor{library/exceptions WindowsError}@anchor{1254}
@deffn {예외} WindowsError

윈도우에서만 사용할 수 있습니다.
@end deffn

@menu
* OS 예외:: 

@end menu

@node OS 예외,,,구체적인 예외
@anchor{library/exceptions os-exceptions}@anchor{26f4}
@subsubsection OS 예외


다음의 예외는 @ref{2c0,,OSError} 의 서브 클래스이며, 시스템 에러 코드에 따라 발생합니다.

@geindex BlockingIOError
@anchor{library/exceptions BlockingIOError}@anchor{235}
@deffn {예외} BlockingIOError

비 블록 동작으로 설정된 객체(가령 소켓)에 블록이 필요한 연산이 수행되면 발생합니다. @code{errno} @ref{2703,,EAGAIN}, @ref{2704,,EALREADY}, @ref{2705,,EWOULDBLOCK}, @ref{2706,,EINPROGRESS} 에 해당합니다.

@ref{2c0,,OSError} 의 것 외에도, @ref{235,,BlockingIOError} 는 어트리뷰트를 하나 더 가질 수 있습니다:

@geindex characters_written (BlockingIOError의 속성)
@anchor{library/exceptions BlockingIOError characters_written}@anchor{2707}
@deffn {속성} characters_written

An integer containing the number of `bytes' written to the stream
before it blocked. This attribute is available when using the
buffered I/O classes from the @ref{83,,io} module.
@end deffn
@end deffn

@geindex ChildProcessError
@anchor{library/exceptions ChildProcessError}@anchor{1257}
@deffn {예외} ChildProcessError

자식 프로세스에 대한 작업이 실패할 때 발생합니다. @code{errno} @ref{2708,,ECHILD} 에 해당합니다.
@end deffn

@geindex ConnectionError
@anchor{library/exceptions ConnectionError}@anchor{100a}
@deffn {예외} ConnectionError

연결 관련 문제에 대한 베이스 클래스입니다.

서브 클래스는 @ref{125b,,BrokenPipeError}, @ref{125c,,ConnectionAbortedError}, @ref{125d,,ConnectionRefusedError} 및 @ref{125e,,ConnectionResetError} 입니다.
@end deffn

@geindex BrokenPipeError
@anchor{library/exceptions BrokenPipeError}@anchor{125b}
@deffn {예외} BrokenPipeError

@ref{100a,,ConnectionError} 의 서브 클래스로서, 다른 쪽 끝이 닫힌 파이프에 쓰려고 하거나, 쓰기가 종료된 소켓에 쓰려고 할 때 발생합니다. @code{errno} @ref{2709,,EPIPE} 와 @ref{270a,,ESHUTDOWN} 에 해당합니다.
@end deffn

@geindex ConnectionAbortedError
@anchor{library/exceptions ConnectionAbortedError}@anchor{125c}
@deffn {예외} ConnectionAbortedError

@ref{100a,,ConnectionError} 의 서브 클래스로서, 연결 시도가 상대방에 의해 중단(abort)될 때 발생합니다. @code{errno} @ref{270b,,ECONNABORTED} 에 해당합니다.
@end deffn

@geindex ConnectionRefusedError
@anchor{library/exceptions ConnectionRefusedError}@anchor{125d}
@deffn {예외} ConnectionRefusedError

@ref{100a,,ConnectionError} 의 서브 클래스로서, 연결 시도가 상대방에 의해 거부(refuse)될 때 발생합니다. @code{errno} @ref{270c,,ECONNREFUSED} 에 해당합니다.
@end deffn

@geindex ConnectionResetError
@anchor{library/exceptions ConnectionResetError}@anchor{125e}
@deffn {예외} ConnectionResetError

@ref{100a,,ConnectionError} 의 서브 클래스로서, 연결이 상대방에 의해 강제 종료(reset)될 때 발생합니다. @code{errno} @ref{270d,,ECONNRESET} 에 해당합니다.
@end deffn

@geindex FileExistsError
@anchor{library/exceptions FileExistsError}@anchor{121f}
@deffn {예외} FileExistsError

이미 존재하는 파일이나 디렉터리를 만들려고 할 때 발생합니다. @code{errno} @ref{270e,,EEXIST} 에 해당합니다.
@end deffn

@geindex FileNotFoundError
@anchor{library/exceptions FileNotFoundError}@anchor{264}
@deffn {예외} FileNotFoundError

파일이나 디렉터리가 요청되었지만 존재하지 않을 때 발생합니다. @code{errno} @ref{270f,,ENOENT} 에 해당합니다.
@end deffn

@geindex InterruptedError
@anchor{library/exceptions InterruptedError}@anchor{f87}
@deffn {예외} InterruptedError

시스템 호출이 들어오는 시그널에 의해 중단될 때 발생합니다. @code{errno} @ref{f86,,EINTR} 에 해당합니다.


버전 3.5에서 변경: 이제 파이썬은 시스템 호출이 시그널에 의해 중단될 때, 시그널 처리기가 예외를 일으키는 경우를 제외하고 (이유는 
@geindex Python 향상 제안; PEP 475
PEP 475@footnote{https://peps.python.org/pep-0475/} 를 참조하세요), @ref{f87,,InterruptedError} 를 일으키는 대신 시스템 호출을 재시도합니다.

@end deffn

@geindex IsADirectoryError
@anchor{library/exceptions IsADirectoryError}@anchor{1258}
@deffn {예외} IsADirectoryError

디렉터리에 파일 연산(가령 @ref{12f5,,os.remove()})이 요청되었을 때 발생합니다. @code{errno} @ref{2710,,EISDIR} 에 해당합니다.
@end deffn

@geindex NotADirectoryError
@anchor{library/exceptions NotADirectoryError}@anchor{1259}
@deffn {예외} NotADirectoryError

디렉터리가 아닌 것에 디렉터리 연산(가령 @ref{12ff,,os.listdir()})이 요청되었을 때 발생합니다. 대부분의 POSIX 플랫폼에서, 연산이 디렉터리가 아닌 파일을 디렉터리인 것처럼 열거나 탐색하려고 할 때도 발생합니다. @code{errno} @ref{2711,,ENOTDIR} 에 해당합니다.
@end deffn

@geindex PermissionError
@anchor{library/exceptions PermissionError}@anchor{f3d}
@deffn {예외} PermissionError

적절한 접근권 (가령 파일 시스템 권한) 없이 연산을 실행하려고 할 때 발생합니다. @code{errno} @ref{2712,,EACCES}, @ref{1b54,,EPERM} 및 @ref{1b3d,,ENOTCAPABLE} 에 해당합니다.


버전 3.11.1에서 변경: WASI’s @ref{1b3d,,ENOTCAPABLE} is now mapped to
@code{PermissionError}.

@end deffn

@geindex ProcessLookupError
@anchor{library/exceptions ProcessLookupError}@anchor{125a}
@deffn {예외} ProcessLookupError

주어진 프로세스가 존재하지 않을 때 발생합니다. @code{errno} @ref{2713,,ESRCH} 에 해당합니다.
@end deffn

@geindex TimeoutError
@anchor{library/exceptions TimeoutError}@anchor{a36}
@deffn {예외} TimeoutError

시스템 함수가 시스템 수준에서 시간 초과 될 때 발생합니다. @code{errno} @ref{2714,,ETIMEDOUT} 에 해당합니다.
@end deffn


Added in version 3.3: 위의 모든 @ref{2c0,,OSError} 서브 클래스가 추가되었습니다.



@subsubheading 더 보기


@geindex Python 향상 제안; PEP 3151
PEP 3151@footnote{https://peps.python.org/pep-3151/} - OS 및 IO 예외 계층 구조 재작업


@node 경고,예외 그룹,구체적인 예외,내장 예외
@anchor{library/exceptions warning-categories-as-exceptions}@anchor{2715}@anchor{library/exceptions warnings}@anchor{2716}
@subsection 경고


다음 예외는 경고 범주로 사용됩니다; 자세한 정보는 @ref{2717,,경고 범주} 설명서를 보십시오.

@geindex Warning
@anchor{library/exceptions Warning}@anchor{2718}
@deffn {예외} Warning

경고 범주의 베이스 클래스입니다.
@end deffn

@geindex UserWarning
@anchor{library/exceptions UserWarning}@anchor{2719}
@deffn {예외} UserWarning

사용자 코드에 의해 만들어지는 경고의 베이스 클래스입니다.
@end deffn

@geindex DeprecationWarning
@anchor{library/exceptions DeprecationWarning}@anchor{1a3}
@deffn {예외} DeprecationWarning

폐지된 기능에 대한 경고의 베이스 클래스인데, 그 경고가 다른 파이썬 개발자를 대상으로 하는 경우입니다.

@code{__main__} 모듈을 제외하고, 기본 경고 필터에 의해 무시됩니다 (
@geindex Python 향상 제안; PEP 565
PEP 565@footnote{https://peps.python.org/pep-0565/}). @ref{507,,파이썬 개발 모드}를 활성화하면 이 경고가 표시됩니다.

The deprecation policy is described in 
@geindex Python 향상 제안; PEP 387
PEP 387@footnote{https://peps.python.org/pep-0387/}.
@end deffn

@geindex PendingDeprecationWarning
@anchor{library/exceptions PendingDeprecationWarning}@anchor{ac6}
@deffn {예외} PendingDeprecationWarning

더는 사용되지 않고 장래에 폐지될 예정이지만, 지금 당장 폐지되지는 않은 기능에 관한 경고의 베이스 클래스입니다.

앞으로 있을 수도 있는 폐지에 관한 경고는 일반적이지 않기 때문에, 이 클래스는 거의 사용되지 않습니다. 이미 활성화된 폐지에는 @ref{1a3,,DeprecationWarning}을 선호합니다.

기본 경고 필터에 의해 무시됩니다. @ref{507,,파이썬 개발 모드}를 활성화하면 이 경고가 표시됩니다.

The deprecation policy is described in 
@geindex Python 향상 제안; PEP 387
PEP 387@footnote{https://peps.python.org/pep-0387/}.
@end deffn

@geindex SyntaxWarning
@anchor{library/exceptions SyntaxWarning}@anchor{1ae}
@deffn {예외} SyntaxWarning

모호한 문법에 대한 경고의 베이스 클래스입니다.

This warning is typically emitted when compiling Python source code, and usually won’t be reported
when running already compiled code.
@end deffn

@geindex RuntimeWarning
@anchor{library/exceptions RuntimeWarning}@anchor{4d8}
@deffn {예외} RuntimeWarning

모호한 실행 시간 동작에 대한 경고의 베이스 클래스입니다.
@end deffn

@geindex FutureWarning
@anchor{library/exceptions FutureWarning}@anchor{657}
@deffn {예외} FutureWarning

폐지된 기능에 대한 경고의 베이스 클래스인데, 그 경고가 파이썬으로 작성된 응용 프로그램의 최종 사용자를 대상으로 하는 경우입니다.
@end deffn

@geindex ImportWarning
@anchor{library/exceptions ImportWarning}@anchor{71d}
@deffn {예외} ImportWarning

모듈 임포트에 있을 수 있는 실수에 대한 경고의 베이스 클래스입니다.

기본 경고 필터에 의해 무시됩니다. @ref{507,,파이썬 개발 모드}를 활성화하면 이 경고가 표시됩니다.
@end deffn

@geindex UnicodeWarning
@anchor{library/exceptions UnicodeWarning}@anchor{1629}
@deffn {예외} UnicodeWarning

유니코드와 관련된 경고의 베이스 클래스입니다.
@end deffn

@geindex EncodingWarning
@anchor{library/exceptions EncodingWarning}@anchor{212b}
@deffn {예외} EncodingWarning

인코딩과 관련된 경고의 베이스 클래스입니다.

See @ref{213d,,Opt-in EncodingWarning} for details.


Added in version 3.10.

@end deffn

@geindex BytesWarning
@anchor{library/exceptions BytesWarning}@anchor{e1b}
@deffn {예외} BytesWarning

@ref{192,,bytes} 및 @ref{344,,bytearray} 와 관련된 경고의 베이스 클래스입니다.
@end deffn

@geindex ResourceWarning
@anchor{library/exceptions ResourceWarning}@anchor{54e}
@deffn {예외} ResourceWarning

자원 사용과 관련된 경고의 베이스 클래스입니다.

기본 경고 필터에 의해 무시됩니다. @ref{507,,파이썬 개발 모드}를 활성화하면 이 경고가 표시됩니다.


Added in version 3.2.

@end deffn

@node 예외 그룹,예외 계층 구조,경고,내장 예외
@anchor{library/exceptions exception-groups}@anchor{271a}@anchor{library/exceptions lib-exception-groups}@anchor{271b}
@subsection 예외 그룹


The following are used when it is necessary to raise multiple unrelated
exceptions. They are part of the exception hierarchy so they can be
handled with @ref{1ab,,except} like all other exceptions. In addition,
they are recognised by @ref{1ac,,except*}, which matches
their subgroups based on the types of the contained exceptions.

@geindex ExceptionGroup
@anchor{library/exceptions ExceptionGroup}@anchor{4d3}
@deffn {예외} ExceptionGroup (msg, excs)
@end deffn

@geindex BaseExceptionGroup
@anchor{library/exceptions BaseExceptionGroup}@anchor{564}
@deffn {예외} BaseExceptionGroup (msg, excs)

Both of these exception types wrap the exceptions in the sequence @code{excs}.
The @code{msg} parameter must be a string. The difference between the two
classes is that @code{BaseExceptionGroup} extends @ref{7d6,,BaseException} and
it can wrap any exception, while @ref{4d3,,ExceptionGroup} extends @ref{bcc,,Exception}
and it can only wrap subclasses of @code{Exception}. This design is so that
@code{except Exception} catches an @code{ExceptionGroup} but not
@code{BaseExceptionGroup}.

The @code{BaseExceptionGroup} constructor returns an @ref{4d3,,ExceptionGroup}
rather than a @code{BaseExceptionGroup} if all contained exceptions are
@ref{bcc,,Exception} instances, so it can be used to make the selection
automatic. The @code{ExceptionGroup} constructor, on the other hand,
raises a @ref{198,,TypeError} if any contained exception is not an
@code{Exception} subclass.

`CPython 구현 상세:' The @code{excs} parameter may be any sequence, but lists and tuples are
specifically processed more efficiently here. For optimal performance,
pass a tuple as @code{excs}.

@geindex message (BaseExceptionGroup의 속성)
@anchor{library/exceptions BaseExceptionGroup message}@anchor{271c}
@deffn {속성} message

The @code{msg} argument to the constructor. This is a read-only attribute.
@end deffn

@geindex exceptions (BaseExceptionGroup의 속성)
@anchor{library/exceptions BaseExceptionGroup exceptions}@anchor{271d}
@deffn {속성} exceptions

A tuple of the exceptions in the @code{excs} sequence given to the
constructor. This is a read-only attribute.
@end deffn

@geindex subgroup() (BaseExceptionGroup 메서드)
@anchor{library/exceptions BaseExceptionGroup subgroup}@anchor{1a38}
@deffn {메서드} subgroup (condition)

Returns an exception group that contains only the exceptions from the
current group that match `condition', or @code{None} if the result is empty.

The condition can be an exception type or tuple of exception types, in which
case each exception is checked for a match using the same check that is used
in an @code{except} clause.  The condition can also be a callable (other than
a type object) that accepts an exception as its single argument and returns
true for the exceptions that should be in the subgroup.

The nesting structure of the current exception is preserved in the result,
as are the values of its @ref{271c,,message},
@ref{14cb,,__traceback__}, @ref{14cd,,__cause__},
@ref{14cc,,__context__} and
@ref{26ea,,__notes__} fields.
Empty nested groups are omitted from the result.

The condition is checked for all exceptions in the nested exception group,
including the top-level and any nested exception groups. If the condition is
true for such an exception group, it is included in the result in full.


Added in version 3.13: @code{condition} can be any callable which is not a type object.

@end deffn

@geindex split() (BaseExceptionGroup 메서드)
@anchor{library/exceptions BaseExceptionGroup split}@anchor{18d9}
@deffn {메서드} split (condition)

Like @ref{1a38,,subgroup()}, but returns the pair @code{(match, rest)} where @code{match}
is @code{subgroup(condition)} and @code{rest} is the remaining non-matching
part.
@end deffn

@geindex derive() (BaseExceptionGroup 메서드)
@anchor{library/exceptions BaseExceptionGroup derive}@anchor{1a37}
@deffn {메서드} derive (excs)

Returns an exception group with the same @ref{271c,,message}, but which
wraps the exceptions in @code{excs}.

This method is used by @ref{1a38,,subgroup()} and @ref{18d9,,split()}, which
are used in various contexts to break up an exception group. A
subclass needs to override it in order to make @code{subgroup()}
and @code{split()} return instances of the subclass rather
than @ref{4d3,,ExceptionGroup}.

@ref{1a38,,subgroup()} and @ref{18d9,,split()} copy the
@ref{14cb,,__traceback__},
@ref{14cd,,__cause__}, @ref{14cc,,__context__} and
@ref{26ea,,__notes__} fields from
the original exception group to the one returned by @code{derive()}, so
these fields do not need to be updated by @code{derive()}.

@example
>>> class MyGroup(ExceptionGroup):
...     def derive(self, excs):
...         return MyGroup(self.message, excs)
...
>>> e = MyGroup("eg", [ValueError(1), TypeError(2)])
>>> e.add_note("a note")
>>> e.__context__ = Exception("context")
>>> e.__cause__ = Exception("cause")
>>> try:
...    raise e
... except Exception as e:
...    exc = e
...
>>> match, rest = exc.split(ValueError)
>>> exc, exc.__context__, exc.__cause__, exc.__notes__
(MyGroup('eg', [ValueError(1), TypeError(2)]), Exception('context'), Exception('cause'), ['a note'])
>>> match, match.__context__, match.__cause__, match.__notes__
(MyGroup('eg', [ValueError(1)]), Exception('context'), Exception('cause'), ['a note'])
>>> rest, rest.__context__, rest.__cause__, rest.__notes__
(MyGroup('eg', [TypeError(2)]), Exception('context'), Exception('cause'), ['a note'])
>>> exc.__traceback__ is match.__traceback__ is rest.__traceback__
True
@end example
@end deffn

Note that @code{BaseExceptionGroup} defines @ref{79f,,__new__()}, so
subclasses that need a different constructor signature need to
override that rather than @ref{8be,,__init__()}. For example, the following
defines an exception group subclass which accepts an exit_code and
constructs the group’s message from it.

@example
class Errors(ExceptionGroup):
   def __new__(cls, errors, exit_code):
      self = super().__new__(Errors, f"exit code: @{exit_code@}", errors)
      self.exit_code = exit_code
      return self

   def derive(self, excs):
      return Errors(excs, self.exit_code)
@end example

Like @ref{4d3,,ExceptionGroup}, any subclass of @code{BaseExceptionGroup} which
is also a subclass of @ref{bcc,,Exception} can only wrap instances of
@code{Exception}.


Added in version 3.11.

@end deffn

@node 예외 계층 구조,,예외 그룹,내장 예외
@anchor{library/exceptions exception-hierarchy}@anchor{271e}
@subsection 예외 계층 구조


내장 예외의 클래스 계층 구조는 다음과 같습니다:

@example
BaseException
 ├── BaseExceptionGroup
 ├── GeneratorExit
 ├── KeyboardInterrupt
 ├── SystemExit
 └── Exception
      ├── ArithmeticError
      │    ├── FloatingPointError
      │    ├── OverflowError
      │    └── ZeroDivisionError
      ├── AssertionError
      ├── AttributeError
      ├── BufferError
      ├── EOFError
      ├── ExceptionGroup [BaseExceptionGroup]
      ├── ImportError
      │    └── ModuleNotFoundError
      ├── LookupError
      │    ├── IndexError
      │    └── KeyError
      ├── MemoryError
      ├── NameError
      │    └── UnboundLocalError
      ├── OSError
      │    ├── BlockingIOError
      │    ├── ChildProcessError
      │    ├── ConnectionError
      │    │    ├── BrokenPipeError
      │    │    ├── ConnectionAbortedError
      │    │    ├── ConnectionRefusedError
      │    │    └── ConnectionResetError
      │    ├── FileExistsError
      │    ├── FileNotFoundError
      │    ├── InterruptedError
      │    ├── IsADirectoryError
      │    ├── NotADirectoryError
      │    ├── PermissionError
      │    ├── ProcessLookupError
      │    └── TimeoutError
      ├── ReferenceError
      ├── RuntimeError
      │    ├── NotImplementedError
      │    ├── PythonFinalizationError
      │    └── RecursionError
      ├── StopAsyncIteration
      ├── StopIteration
      ├── SyntaxError
      │    └── IndentationError
      │         └── TabError
      ├── SystemError
      ├── TypeError
      ├── ValueError
      │    └── UnicodeError
      │         ├── UnicodeDecodeError
      │         ├── UnicodeEncodeError
      │         └── UnicodeTranslateError
      └── Warning
           ├── BytesWarning
           ├── DeprecationWarning
           ├── EncodingWarning
           ├── FutureWarning
           ├── ImportWarning
           ├── PendingDeprecationWarning
           ├── ResourceWarning
           ├── RuntimeWarning
           ├── SyntaxWarning
           ├── UnicodeWarning
           └── UserWarning
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Thread Safety Guarantees,텍스트 처리 서비스,내장 예외,파이썬 표준 라이브러리
@anchor{library/threadsafety doc}@anchor{271f}@anchor{library/threadsafety thread-safety-guarantees}@anchor{2720}@anchor{library/threadsafety threadsafety}@anchor{2721}@anchor{library/threadsafety translation-repo}@anchor{2722}
@section Thread Safety Guarantees


This page documents thread-safety guarantees for built-in types in Python’s
free-threaded build. The guarantees described here apply when using Python with
the @ref{164,,GIL} disabled (free-threaded mode). When the GIL is enabled, most
operations are implicitly serialized.

For general guidance on writing thread-safe code in free-threaded Python, see
@ref{2723,,Python support for free threading}.

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

@end menu

@node Thread safety levels,Thread safety for list objects,,Thread Safety Guarantees
@anchor{library/threadsafety thread-safety-levels}@anchor{2724}@anchor{library/threadsafety threadsafety-levels}@anchor{2725}
@subsection Thread safety levels


The C API documentation uses the following levels to describe the thread
safety guarantees of each function. The levels are listed from least to
most safe.

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

@end menu

@node Incompatible,Compatible,,Thread safety levels
@anchor{library/threadsafety incompatible}@anchor{2726}@anchor{library/threadsafety threadsafety-level-incompatible}@anchor{2727}
@subsubsection Incompatible


A function or operation that cannot be made safe for concurrent use even
with external synchronization. Incompatible code typically accesses
global state in an unsynchronized way and must only be called from a single
thread throughout the program’s lifetime.

Example: a function that modifies process-wide state such as signal handlers
or environment variables, where concurrent calls from any threads, even with
external locking, can conflict with the runtime or other libraries.

@node Compatible,Safe on distinct objects,Incompatible,Thread safety levels
@anchor{library/threadsafety compatible}@anchor{2728}@anchor{library/threadsafety threadsafety-level-compatible}@anchor{2729}
@subsubsection Compatible


A function or operation that is safe to call from multiple threads
`provided' the caller supplies appropriate external synchronization, for
example by holding a @ref{272a,,lock} for the duration of each call. Without
such synchronization, concurrent calls may produce @ref{272b,,race conditions} or @ref{272c,,data races}.

Example: a function that reads from or writes to an object whose internal
state is not protected by a lock. Callers must ensure that no two threads
access the same object at the same time.

@node Safe on distinct objects,Safe on shared objects,Compatible,Thread safety levels
@anchor{library/threadsafety safe-on-distinct-objects}@anchor{272d}@anchor{library/threadsafety threadsafety-level-distinct}@anchor{272e}
@subsubsection Safe on distinct objects


A function or operation that is safe to call from multiple threads without
external synchronization, as long as each thread operates on a `different'
object. Two threads may call the function at the same time, but they must
not pass the same object (or objects that share underlying state) as
arguments.

Example: a function that modifies fields of a struct using non-atomic
writes. Two threads can each call the function on their own struct
instance safely, but concurrent calls on the `same' instance require
external synchronization.

@node Safe on shared objects,Atomic,Safe on distinct objects,Thread safety levels
@anchor{library/threadsafety safe-on-shared-objects}@anchor{272f}@anchor{library/threadsafety threadsafety-level-shared}@anchor{2730}
@subsubsection Safe on shared objects


A function or operation that is safe for concurrent use on the `same'
object. The implementation uses internal synchronization (such as
@ref{2731,,per-object locks} or
@ref{2732,,critical sections}) to protect shared
mutable state, so callers do not need to supply their own locking.

Example: @ref{5fd,,PyList_GetItemRef()} can be called from multiple threads on the
same @ref{2733,,PyListObject} - it uses internal synchronization to serialize
access.

@node Atomic,,Safe on shared objects,Thread safety levels
@anchor{library/threadsafety atomic}@anchor{2734}@anchor{library/threadsafety threadsafety-level-atomic}@anchor{2735}
@subsubsection Atomic


A function or operation that appears @ref{2736,,atomic} with
respect to other threads - it executes instantaneously from the perspective
of other threads. This is the strongest form of thread safety.

Example: @ref{463,,PyMutex_IsLocked()} performs an atomic read of the mutex
state and can be called from any thread at any time.

@node Thread safety for list objects,Thread safety for dict objects,Thread safety levels,Thread Safety Guarantees
@anchor{library/threadsafety thread-safety-for-list-objects}@anchor{2737}@anchor{library/threadsafety thread-safety-list}@anchor{2615}
@subsection Thread safety for list objects


Reading a single element from a @ref{24d,,list} is
@ref{2736,,atomic}:

@example
lst[i]   # list.__getitem__
@end example

The following methods traverse the list and use @ref{2736,,atomic}
reads of each item to perform their function. That means that they may
return results affected by concurrent modifications:

@example
item in lst
lst.index(item)
lst.count(item)
@end example

All of the above operations avoid acquiring @ref{2731,,per-object locks}. They do not block concurrent modifications. Other
operations that hold a lock will not block these from observing intermediate
states.

All other operations from here on block using the @ref{2731,,per-object lock}.

Writing a single item via @code{lst[i] = x} is safe to call from multiple
threads and will not corrupt the list.

The following operations return new objects and appear
@ref{2736,,atomic} to other threads:

@example
lst1 + lst2    # concatenates two lists into a new list
x * lst        # repeats lst x times into a new list
lst.copy()     # returns a shallow copy of the list
@end example

The following methods that only operate on a single element with no shifting
required are @ref{2736,,atomic}:

@example
lst.append(x)  # append to the end of the list, no shifting required
lst.pop()      # pop element from the end of the list, no shifting required
@end example

The @ref{601,,clear()} method is also @ref{2736,,atomic}.
Other threads cannot observe elements being removed.

The @ref{dc7,,sort()} method is not @ref{2736,,atomic}.
Other threads cannot observe intermediate states during sorting, but the
list appears empty for the duration of the sort.

The following operations may allow @ref{2738,,lock-free} operations to observe
intermediate states since they modify multiple elements in place:

@example
lst.insert(idx, item)  # shifts elements
lst.pop(idx)           # idx not at the end of the list, shifts elements
lst *= x               # copies elements in place
@end example

The @ref{1a5b,,remove()} method may allow concurrent modifications since
element comparison may execute arbitrary Python code (via
@ref{cf1,,__eq__()}).

@ref{600,,extend()} is safe to call from multiple threads.  However, its
guarantees depend on the iterable passed to it. If it is a @ref{24d,,list}, a
@ref{610,,tuple}, a @ref{184,,set}, a @ref{7f1,,frozenset}, a @ref{183,,dict} or a
@ref{26a9,,dictionary view object} (but not their subclasses), the
@code{extend} operation is safe from concurrent modifications to the iterable.
Otherwise, an iterator is created which can be concurrently modified by
another thread.  The same applies to inplace concatenation of a list with
other iterables when using @code{lst += iterable}.

Similarly, assigning to a list slice with @code{lst[i:j] = iterable} is safe
to call from multiple threads, but @code{iterable} is only locked when it is
also a @ref{24d,,list} (but not its subclasses).

Operations that involve multiple accesses, as well as iteration, are never
atomic. For example:

@example
# NOT atomic: read-modify-write
lst[i] = lst[i] + 1

# NOT atomic: check-then-act
if lst:
    item = lst.pop()

# NOT thread-safe: iteration while modifying
for item in lst:
    process(item)  # another thread may modify lst
@end example

Consider external synchronization when sharing @ref{24d,,list} instances
across threads.

@node Thread safety for dict objects,Thread safety for set objects,Thread safety for list objects,Thread Safety Guarantees
@anchor{library/threadsafety thread-safety-dict}@anchor{26aa}@anchor{library/threadsafety thread-safety-for-dict-objects}@anchor{2739}
@subsection Thread safety for dict objects


Creating a dictionary with the @ref{183,,dict} constructor is atomic when the
argument to it is a @code{dict} or a @ref{610,,tuple}. When using the
@ref{24e,,dict.fromkeys()} method, dictionary creation is atomic when the
argument is a @code{dict}, @code{tuple}, @ref{184,,set} or
@ref{7f1,,frozenset}.

The following operations and functions are @ref{2738,,lock-free} and
@ref{2736,,atomic}.

@example
d[key]       # dict.__getitem__
d.get(key)   # dict.get
key in d     # dict.__contains__
len(d)       # dict.__len__
@end example

All other operations from here on hold the @ref{2731,,per-object lock}.

Writing or removing a single item is safe to call from multiple threads
and will not corrupt the dictionary:

@example
d[key] = value        # write
del d[key]            # delete
d.pop(key)            # remove and return
d.popitem()           # remove and return last item
d.setdefault(key, v)  # insert if missing
@end example

These operations may compare keys using @ref{cf1,,__eq__()}, which can
execute arbitrary Python code. During such comparisons, the dictionary may
be modified by another thread. For built-in types like @ref{169,,str},
@ref{19b,,int}, and @ref{196,,float}, that implement @code{__eq__()} in C,
the underlying lock is not released during comparisons and this is not a
concern.

The following operations return new objects and hold the @ref{2731,,per-object lock}
for the duration of the operation:

@example
d.copy()      # returns a shallow copy of the dictionary
d | other     # merges two dicts into a new dict
d.keys()      # returns a new dict_keys view object
d.values()    # returns a new dict_values view object
d.items()     # returns a new dict_items view object
@end example

The @ref{1772,,clear()} method holds the lock for its duration. Other
threads cannot observe elements being removed.

The following operations lock both dictionaries. For @ref{166a,,update()}
and @code{|=}, this applies only when the other operand is a @ref{183,,dict}
that uses the standard dict iterator (but not subclasses that override
iteration). For equality comparison, this applies to @code{dict} and
its subclasses:

@example
d.update(other_dict)  # both locked when other_dict is a dict
d |= other_dict       # both locked when other_dict is a dict
d == other_dict       # both locked for dict and subclasses
@end example

All comparison operations also compare values using @ref{cf1,,__eq__()},
so for non-built-in types the lock may be released during comparison.

@ref{24e,,fromkeys()} locks both the new dictionary and the iterable
when the iterable is exactly a @ref{183,,dict}, @ref{184,,set}, or
@ref{7f1,,frozenset} (not subclasses):

@example
dict.fromkeys(a_dict)      # locks both
dict.fromkeys(a_set)       # locks both
dict.fromkeys(a_frozenset) # locks both
@end example

When updating from a non-dict iterable, only the target dictionary is
locked. The iterable may be concurrently modified by another thread:

@example
d.update(iterable)        # iterable is not a dict: only d locked
d |= iterable             # iterable is not a dict: only d locked
dict.fromkeys(iterable)   # iterable is not a dict/set/frozenset: only result locked
@end example

Operations that involve multiple accesses, as well as iteration, are never
atomic:

@example
# NOT atomic: read-modify-write
d[key] = d[key] + 1

# NOT atomic: check-then-act (TOCTOU)
if key in d:
    del d[key]

# NOT thread-safe: iteration while modifying
for key, value in d.items():
    process(key)  # another thread may modify d
@end example

To avoid time-of-check to time-of-use (TOCTOU) issues, use atomic
operations or handle exceptions:

@example
# Use pop() with default instead of check-then-delete
d.pop(key, None)

# Or handle the exception
try:
    del d[key]
except KeyError:
    pass
@end example

To safely iterate over a dictionary that may be modified by another
thread, iterate over a copy:

@example
# Make a copy to iterate safely
for key, value in d.copy().items():
    process(key)
@end example

Consider external synchronization when sharing @ref{183,,dict} instances
across threads.

@node Thread safety for set objects,Thread safety for bytearray objects,Thread safety for dict objects,Thread Safety Guarantees
@anchor{library/threadsafety thread-safety-for-set-objects}@anchor{273a}@anchor{library/threadsafety thread-safety-set}@anchor{26a7}
@subsection Thread safety for set objects


The @ref{83f,,len()} function is lock-free and @ref{2736,,atomic}.

The following read operation is lock-free. It does not block concurrent
modifications and may observe intermediate states from operations that
hold the per-object lock:

@example
elem in s    # set.__contains__
@end example

This operation may compare elements using @ref{cf1,,__eq__()}, which can
execute arbitrary Python code. During such comparisons, the set may be
modified by another thread. For built-in types like @ref{169,,str},
@ref{19b,,int}, and @ref{196,,float}, @code{__eq__()} does not release the
underlying lock during comparisons and this is not a concern.

All other operations from here on hold the per-object lock.

Adding or removing a single element is safe to call from multiple threads
and will not corrupt the set:

@example
s.add(elem)      # add element
s.remove(elem)   # remove element, raise if missing
s.discard(elem)  # remove element if present
s.pop()          # remove and return arbitrary element
@end example

These operations also compare elements, so the same @ref{cf1,,__eq__()}
considerations as above apply.

The @ref{26a1,,copy()} method returns a new object and holds the per-object lock
for the duration so that it is always atomic.

The @ref{26a6,,clear()} method holds the lock for its duration. Other
threads cannot observe elements being removed.

The following operations only accept @ref{184,,set} or @ref{7f1,,frozenset}
as operands and always lock both objects:

@example
s |= other                   # other must be set/frozenset
s &= other                   # other must be set/frozenset
s -= other                   # other must be set/frozenset
s ^= other                   # other must be set/frozenset
s & other                    # other must be set/frozenset
s | other                    # other must be set/frozenset
s - other                    # other must be set/frozenset
s ^ other                    # other must be set/frozenset
@end example

@ref{26a2,,set.update()}, @ref{269b,,set.union()}, @ref{1b82,,set.intersection()} and
@ref{269d,,set.difference()} can take multiple iterables as arguments. They all
iterate through all the passed iterables and do the following:

@quotation


@itemize *

@item 

@table @asis

@item @ref{26a2,,set.update()} and @ref{269b,,set.union()} lock both objects only when

the other operand is a @ref{184,,set}, @ref{7f1,,frozenset}, or @ref{183,,dict}.
@end table

@item 

@table @asis

@item @ref{1b82,,set.intersection()} and @ref{269d,,set.difference()} always try to lock

all objects.
@end table
@end itemize
@end quotation

@ref{269f,,set.symmetric_difference()} tries to lock both objects.

The update variants of the above methods also have some differences between
them:

@quotation


@itemize *

@item 

@table @asis

@item @ref{26a3,,set.difference_update()} and @ref{168a,,set.intersection_update()} try

to lock all objects one-by-one.
@end table

@item 

@table @asis

@item @ref{168b,,set.symmetric_difference_update()} only locks the arguments if it is

of type @ref{184,,set}, @ref{7f1,,frozenset}, or @ref{183,,dict}.
@end table
@end itemize
@end quotation

The following methods always try to lock both objects:

@example
s.isdisjoint(other)          # both locked
s.issubset(other)            # both locked
s.issuperset(other)          # both locked
@end example

Operations that involve multiple accesses, as well as iteration, are never
atomic:

@example
# NOT atomic: check-then-act
if elem in s:
      s.remove(elem)

# NOT thread-safe: iteration while modifying
for elem in s:
      process(elem)  # another thread may modify s
@end example

Consider external synchronization when sharing @ref{184,,set} instances
across threads.  See @ref{2723,,Python support for free threading} for more information.

@node Thread safety for bytearray objects,Thread safety for memoryview objects,Thread safety for set objects,Thread Safety Guarantees
@anchor{library/threadsafety thread-safety-bytearray}@anchor{265d}@anchor{library/threadsafety thread-safety-for-bytearray-objects}@anchor{273b}
@subsection Thread safety for bytearray objects


@quotation

The @ref{83f,,len()} function is lock-free and @ref{2736,,atomic}.

Concatenation and comparisons use the buffer protocol, which prevents
resizing but does not hold the per-object lock. These operations may
observe intermediate states from concurrent modifications:

@example
ba + other    # may observe concurrent writes
ba == other   # may observe concurrent writes
ba < other    # may observe concurrent writes
@end example

All other operations from here on hold the per-object lock.

Reading a single element or slice is safe to call from multiple threads:

@example
ba[i]        # bytearray.__getitem__
ba[i:j]      # slice
@end example

The following operations are safe to call from multiple threads and will
not corrupt the bytearray:

@example
ba[i] = x         # write single byte
ba[i:j] = values  # write slice
ba.append(x)      # append single byte
ba.extend(other)  # extend with iterable
ba.insert(i, x)   # insert single byte
ba.pop()          # remove and return last byte
ba.pop(i)         # remove and return byte at index
ba.remove(x)      # remove first occurrence
ba.reverse()      # reverse in place
ba.clear()        # remove all bytes
@end example

Slice assignment locks both objects when `values' is a @ref{344,,bytearray}:

@example
ba[i:j] = other_bytearray  # both locked
@end example

The following operations return new objects and hold the per-object lock
for the duration:

@example
ba.copy()     # returns a shallow copy
ba * n        # repeat into new bytearray
@end example

The membership test holds the lock for its duration:

@example
x in ba       # bytearray.__contains__
@end example

All other bytearray methods (such as @ref{15a8,,find()},
@ref{2666,,replace()}, @ref{17a0,,split()},
@ref{2663,,decode()}, etc.) hold the per-object lock for their
duration.

Operations that involve multiple accesses, as well as iteration, are never
atomic:

@example
# NOT atomic: check-then-act
if x in ba:
    ba.remove(x)

# NOT thread-safe: iteration while modifying
for byte in ba:
    process(byte)  # another thread may modify ba
@end example

To safely iterate over a bytearray that may be modified by another
thread, iterate over a copy:

@example
# Make a copy to iterate safely
for byte in ba.copy():
    process(byte)
@end example

Consider external synchronization when sharing @ref{344,,bytearray} instances
across threads.  See @ref{2723,,Python support for free threading} for more information.
@end quotation

@node Thread safety for memoryview objects,,Thread safety for bytearray objects,Thread Safety Guarantees
@anchor{library/threadsafety thread-safety-for-memoryview-objects}@anchor{273c}@anchor{library/threadsafety thread-safety-memoryview}@anchor{2411}
@subsection Thread safety for memoryview objects


@ref{165,,memoryview} objects provide access to the internal data of an
underlying object without copying. Thread safety depends on both the
memoryview itself and the underlying buffer exporter.

The memoryview implementation uses atomic operations to track its own
exports in the @ref{1767,,free-threaded build}. Creating and
releasing a memoryview are thread-safe. Attribute access (e.g.,
@ref{268e,,shape}, @ref{2684,,format}) reads fields that
are immutable for the lifetime of the memoryview, so concurrent reads
are safe as long as the memoryview has not been released.

However, the actual data accessed through the memoryview is owned by the
underlying object. Concurrent access to this data is only safe if the
underlying object supports it:


@itemize *

@item 
For immutable objects like @ref{192,,bytes}, concurrent reads through
multiple memoryviews are safe.

@item 
For mutable objects like @ref{344,,bytearray}, reading and writing the
same memory region from multiple threads without external
synchronization is not safe and may result in data corruption.
Note that even read-only memoryviews of mutable objects do not
prevent data races if the underlying object is modified from
another thread.
@end itemize

@example
# NOT safe: concurrent writes to the same buffer
data = bytearray(1000)
view = memoryview(data)
# Thread 1: view[0:500] = b'x' * 500
# Thread 2: view[0:500] = b'y' * 500
@end example

@example
# Safe: use a lock for concurrent access
import threading
lock = threading.Lock()
data = bytearray(1000)
view = memoryview(data)

with lock:
    view[0:500] = b'x' * 500
@end example

Resizing or reallocating the underlying object (such as calling
@ref{1771,,bytearray.resize()}) while a memoryview is exported raises
@ref{179f,,BufferError}. This is enforced regardless of threading.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)
@anchor{library/text stringservices}@anchor{264b}
@node 텍스트 처리 서비스,바이너리 데이터 서비스,Thread Safety Guarantees,파이썬 표준 라이브러리
@anchor{library/text doc}@anchor{273d}@anchor{library/text text-processing-services}@anchor{273e}@anchor{library/text textservices}@anchor{264e}@anchor{library/text translation-repo}@anchor{273f}
@section 텍스트 처리 서비스


이 장에서 설명하는 모듈은 광범위한 문자열 조작 연산과 기타 텍스트 처리 서비스를 제공합니다.

@ref{2740,,바이너리 데이터 서비스} 에 기술되어 있는 @ref{1c,,codecs} 모듈 또한 텍스트 처리와 밀접한 관련이 있습니다. 또한, @ref{1fdd,,텍스트 시퀀스 형 — str} 에 있는 파이썬의 내장 문자열형에 대한 설명서를 참조하십시오.

@menu
* string — 일반적인 문자열 연산:: 
* string.templatelib — Support for template string literals: string templatelib — Support for template string literals. 
* re — Regular expression operations:: 
* difflib — 델타 계산을 위한 도우미:: 
* textwrap — 텍스트 래핑과 채우기:: 
* unicodedata — 유니코드 데이터베이스:: 
* stringprep — 인터넷 문자열 준비:: 
* readline — GNU readline 인터페이스:: 
* rlcompleter — GNU readline을 위한 완성 함수:: 

@end menu

@node string — 일반적인 문자열 연산,string templatelib — Support for template string literals,,텍스트 처리 서비스
@anchor{library/string doc}@anchor{2741}@anchor{library/string module-string}@anchor{d8}@anchor{library/string string-common-string-operations}@anchor{2742}
@subsection @code{string} — 일반적인 문자열 연산


@geindex module; string

`Source code:' Lib/string/__init__.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/string/__init__.py}


__________________________________________________________________



@subsubheading 더 보기


@ref{1fdd,,텍스트 시퀀스 형 — str}

@ref{1fde,,문자열 메서드}


@menu
* 문자열 상수:: 
* Custom string formatting:: 
* Format string syntax:: 
* Template strings ($-strings): Template strings $-strings. 
* 도움 함수:: 

@end menu

@node 문자열 상수,Custom string formatting,,string — 일반적인 문자열 연산
@anchor{library/string string-constants}@anchor{2743}
@subsubsection 문자열 상수


이 모듈에 정의된 상수는 다음과 같습니다:

@geindex ascii_letters (string 모듈)
@anchor{library/string string ascii_letters}@anchor{14c8}
@deffn {데이터} string.ascii_letters

아래에 나오는 @ref{2744,,ascii_lowercase}와 @ref{2745,,ascii_uppercase} 상수를 이어붙인 것입니다. 이 값은 로케일에 의존적이지 않습니다.
@end deffn

@geindex ascii_lowercase (string 모듈)
@anchor{library/string string ascii_lowercase}@anchor{2744}
@deffn {데이터} string.ascii_lowercase

소문자 @code{'abcdefghijklmnopqrstuvwxyz'}. 이 값은 로케일에 의존적이지 않고 변경되지 않습니다.
@end deffn

@geindex ascii_uppercase (string 모듈)
@anchor{library/string string ascii_uppercase}@anchor{2745}
@deffn {데이터} string.ascii_uppercase

대문자 @code{'ABCDEFGHIJKLMNOPQRSTUVWXYZ'}. 이 값은 로케일에 의존적이지 않고 변경되지 않습니다.
@end deffn

@geindex digits (string 모듈)
@anchor{library/string string digits}@anchor{2746}
@deffn {데이터} string.digits

문자열 @code{'0123456789'}.
@end deffn

@geindex hexdigits (string 모듈)
@anchor{library/string string hexdigits}@anchor{2747}
@deffn {데이터} string.hexdigits

문자열 @code{'0123456789abcdefABCDEF'}.
@end deffn

@geindex octdigits (string 모듈)
@anchor{library/string string octdigits}@anchor{2748}
@deffn {데이터} string.octdigits

문자열 @code{'01234567'}.
@end deffn

@geindex punctuation (string 모듈)
@anchor{library/string string punctuation}@anchor{2749}
@deffn {데이터} string.punctuation

@code{C} 로케일에서 구두점 문자로 간주하는 ASCII 문자의 문자열: @code{!"#$%&'()*+,-./:;<=>?@@[\]^_`@{|@}~}.
@end deffn

@geindex printable (string 모듈)
@anchor{library/string string printable}@anchor{18b8}
@deffn {데이터} string.printable

파이썬이 인쇄할 수 있는 것으로 간주하는 ASCII 문자의 문자열. @ref{2746,,digits}, @ref{14c8,,ascii_letters}, @ref{2749,,punctuation}, @ref{274a,,whitespace} 의 조합입니다.

@cartouche
@quotation 참고 
By design, @ref{fd7,,string.printable.isprintable()}
returns @ref{d2a,,False}. In particular, @code{string.printable} is not
printable in the POSIX sense (see @code{LC_CTYPE@footnote{https://manpages.debian.org/locale(5)}}).
@end quotation
@end cartouche
@end deffn

@geindex whitespace (string 모듈)
@anchor{library/string string whitespace}@anchor{274a}
@deffn {데이터} string.whitespace

공백으로 간주하는 모든 ASCII 문자를 포함하는 문자열. 여기에는 스페이스, 탭, 줄 바꿈, 캐리지 리턴, 세로 탭 및 폼 피드 문자가 포함됩니다.
@end deffn

@node Custom string formatting,Format string syntax,문자열 상수,string — 일반적인 문자열 연산
@anchor{library/string custom-string-formatting}@anchor{274b}@anchor{library/string string-formatting}@anchor{264d}
@subsubsection Custom string formatting


The built-in string class provides the ability to do complex variable
substitutions and value formatting via the @ref{832,,format()} method described in
@geindex Python 향상 제안; PEP 3101
PEP 3101@footnote{https://peps.python.org/pep-3101/}.  The @ref{10bc,,Formatter} class in the @code{string} module allows
you to create and customize your own string formatting behaviors using the same
implementation as the built-in @code{format()} method.

@geindex Formatter (string 클래스)
@anchor{library/string string Formatter}@anchor{10bc}
@deffn {클래스} string.Formatter

@ref{10bc,,Formatter} 클래스에는 다음과 같은 공개 메서드가 있습니다:

@geindex format() (string.Formatter 메서드)
@anchor{library/string string Formatter format}@anchor{df9}
@deffn {메서드} format (format_string, /, *args, **kwargs)

기본 API 메서드입니다. 포맷 문자열과 임의의 위치 및 키워드 인자의 집합을 받아들입니다. 이것은 @ref{274c,,vformat()} 을 호출하는 래퍼일 뿐입니다.


버전 3.7에서 변경: 포맷 문자열 인자는 이제 @ref{c77,,위치 전용}입니다.

@end deffn

@geindex vformat() (string.Formatter 메서드)
@anchor{library/string string Formatter vformat}@anchor{274c}
@deffn {메서드} vformat (format_string, args, kwargs)

이 함수는 실제 포맷 작업을 수행합니다. @code{*args} 와 @code{**kwargs} 문법을 사용하여 딕셔너리를 개별적인 인자로 언 패킹한 후 다시 패킹하는 대신 미리 정의된 인자 딕셔너리를 전달하고자 하는 경우를 위해 별도의 함수로 노출합니다. @ref{274c,,vformat()} 은 포맷 문자열을 문자 데이터와 치환 필드로 분리하는 작업을 수행합니다. 아래에 설명된 다양한 메서드를 호출합니다.
@end deffn

이에 더해, @ref{10bc,,Formatter} 는 서브 클래스에 의해 대체될 목적으로 많은 메서드를 정의합니다:

@geindex parse() (string.Formatter 메서드)
@anchor{library/string string Formatter parse}@anchor{274d}
@deffn {메서드} parse (format_string)

format_string을 루핑하면서 튜플 (`literal_text', `field_name', `format_spec', `conversion') 의 이터러블을 반환합니다. 이것은 @ref{274c,,vformat()} 이 문자열을 리터럴 텍스트와 치환 필드로 나누는 데 사용합니다.

The values in the tuple conceptually represent a span of literal text
followed by a single replacement field.  If there is no literal text
(which can happen if two replacement fields occur consecutively), then
`literal_text' will be a zero-length string.  If there is no replacement
field, then the values of `field_name', `format_spec' and `conversion'
will be @code{None}. The value of `field_name' is unmodified and
auto-numbering of non-numbered positional fields is done by @ref{274c,,vformat()}.
@end deffn

@geindex get_field() (string.Formatter 메서드)
@anchor{library/string string Formatter get_field}@anchor{274e}
@deffn {메서드} get_field (field_name, args, kwargs)

Given `field_name', convert it to an object to be formatted.
Auto-numbering of `field_name' returned from @ref{274d,,parse()} is done by
@ref{274c,,vformat()} before calling this method.  Returns a tuple (obj, used_key).
The default version takes strings of the form defined in 
@geindex Python 향상 제안; PEP 3101
PEP 3101@footnote{https://peps.python.org/pep-3101/},
such as “0[name]” or “label.title”. `args' and `kwargs' are as passed in to
@code{vformat()}. The return value `used_key' has the same meaning
as the `key' parameter to @ref{274f,,get_value()}.
@end deffn

@geindex get_value() (string.Formatter 메서드)
@anchor{library/string string Formatter get_value}@anchor{274f}
@deffn {메서드} get_value (key, args, kwargs)

지정된 필드의 값을 가져옵니다. `key' 인자는 정수 또는 문자열입니다. 정수의 경우, `args' 에 있는 위치 인자의 인덱스를 나타냅니다; 문자열인 경우, `kwargs' 에 있는 이름있는 인자를 나타냅니다.

`args' 매개 변수는 @ref{274c,,vformat()} 의 위치 인자 목록으로 설정되고, `kwargs' 매개 변수는 키워드 인자 딕셔너리로 설정됩니다.

복합 필드 이름의 경우, 이러한 함수는 필드 이름의 첫 번째 구성 요소에 대해서만 호출됩니다; 후속 구성 요소는 일반 어트리뷰트 및 인덱싱 연산을 통해 처리됩니다.

그래서 예를 들어, 필드 표현식 ‘0.name’ 은 @ref{274f,,get_value()} 가 `key' 인자 0으로 호출되도록 합니다. @code{name} 어트리뷰트는 @code{get_value()} 가 반환한 후에 내장 @ref{dc9,,getattr()} 함수를 호출하여 조회합니다.

인덱스 또는 키워드가 존재하지 않는 항목을 참조하면, @ref{173a,,IndexError} 나 @ref{5e5,,KeyError} 가 발생합니다.
@end deffn

@geindex check_unused_args() (string.Formatter 메서드)
@anchor{library/string string Formatter check_unused_args}@anchor{2750}
@deffn {메서드} check_unused_args (used_args, args, kwargs)

원하는 경우 사용하지 않는 인자를 검사하도록 구현합니다. 이 함수에 대한 인자는 포맷 문자열에서 참조되는 모든 인자 키의 집합과 (위치 인자의 경우 정수, 이름있는 인자의 경우 문자열), vformat 으로 전달된 `args' 와 `kwargs' 에 대한 참조입니다. 사용되지 않은 인자의 집합은 이 매개 변수들로 계산할 수 있습니다. @ref{2750,,check_unused_args()} 는 검사가 실패할 경우 예외를 발생시킬 것으로 가정합니다.
@end deffn

@geindex format_field() (string.Formatter 메서드)
@anchor{library/string string Formatter format_field}@anchor{2751}
@deffn {메서드} format_field (value, format_spec)

@ref{2751,,format_field()} 는 단순히 전역 @ref{199,,format()} 내장 함수를 호출합니다. 서브 클래스가 재정의할 수 있도록 메서드가 제공됩니다.
@end deffn

@geindex convert_field() (string.Formatter 메서드)
@anchor{library/string string Formatter convert_field}@anchor{2752}
@deffn {메서드} convert_field (value, conversion)

(@ref{274e,,get_field()} 가 반환한) 값(value)을 (@ref{274d,,parse()} 메서드가 반환하는 튜플에 있는 것과 같은) 주어진 변환 유형(conversion)으로 변환합니다. 기본 버전은 ‘s’ (str), ‘r’ (repr) 및 ‘a’ (ascii) 변환 유형을 인식합니다.
@end deffn
@end deffn

@node Format string syntax,Template strings $-strings,Custom string formatting,string — 일반적인 문자열 연산
@anchor{library/string format-string-syntax}@anchor{2753}@anchor{library/string formatstrings}@anchor{15a0}
@subsubsection Format string syntax


The @ref{832,,str.format()} method and the @ref{10bc,,Formatter} class share the same
syntax for format strings (although in the case of @code{Formatter},
subclasses can define their own format string syntax).  The syntax is
related to that of @ref{19a,,formatted string literals} and
@ref{17fd,,template string literals}, but it is less sophisticated
and, in particular, does not support arbitrary expressions in interpolations.

@geindex @{@} (중괄호);문자열 포매팅에서
@geindex . (마침표);문자열 포매팅에서
@geindex [] (대괄호);문자열 포매팅에서
@geindex ! (느낌표);문자열 포매팅에서
@geindex ; (콜론);문자열 포매팅에서

포맷 문자열에는 중괄호 @code{@{@}} 로 둘러싸인 “치환 필드” 가 들어 있습니다. 중괄호 안에 포함되지 않은 것은 리터럴 텍스트로 간주하며 변경되지 않고 그대로 출력으로 복사됩니다. 리터럴 텍스트에 중괄호를 포함해야 하는 경우, 중복으로 이스케이프 할 수 있습니다: @code{@{@{} 와 @code{@}@}}.

치환 필드의 문법은 다음과 같습니다:

@example
@anchor{library/string grammar-token-format-string-replacement_field}@anchor{2754}replacement_field: "@{" [@ref{2755,,field_name}] ["!" @ref{2756,,conversion}] [":" @ref{2757,,format_spec}] "@}"
@anchor{library/string grammar-token-format-string-field_name}@anchor{2755}field_name:        @ref{2758,,arg_name} ("." @ref{2759,,attribute_name} | "[" @ref{275a,,element_index} "]")*
@anchor{library/string grammar-token-format-string-arg_name}@anchor{2758}arg_name:          [@ref{22be,,identifier} | @ref{230f,,digit}+]
@anchor{library/string grammar-token-format-string-attribute_name}@anchor{2759}attribute_name:    @ref{22be,,identifier}
@anchor{library/string grammar-token-format-string-element_index}@anchor{275a}element_index:     @ref{230f,,digit}+ | @ref{275b,,index_string}
@anchor{library/string grammar-token-format-string-index_string}@anchor{275b}index_string:      <any source character except "]"> +
@anchor{library/string grammar-token-format-string-conversion}@anchor{2756}conversion:        "r" | "s" | "a"
@anchor{library/string grammar-token-format-string-format_spec}@anchor{2757}format_spec:       @ref{275c,,format-spec;format_spec}
@end example

덜 형식적인 용어로, 치환 필드는 `field_name' 으로 시작할 수 있는데, 값이 포맷되어 출력에 치환 필드 대신 삽입될 객체를 지정합니다. `field_name' 다음에는 선택적으로 느낌표 @code{'!'} 가 앞에 오는 `conversion' 필드와 콜론 @code{':'} 이 앞에 오는 `format_spec' 이 옵니다. 이 값은 치환 값에 대해 기본값이 아닌 포맷을 지정합니다.

@ref{4f9,,Format specification mini-language} 섹션을 참고하십시오.

`field_name' 자체는 숫자나 키워드인 `arg_name' 으로 시작합니다. 숫자면 위치 인자를 나타내고, 키워드면 이름이 있는 키워드 인자를 나타냅니다. `arg_name'은 문자열에 @ref{2629,,str.isdecimal()}을 호출했을 때 참을 반환한다면 숫자로 취급됩니다. 포맷 문자열의 숫자 arg_name이 0, 1, 2, … 순으로 나열되는 경우, (일부가 아니라) 전부 생략 할 수 있으며 숫자 0, 1, 2, …이 순서대로 자동 삽입됩니다. `arg_name' 이 따옴표로 분리되어 있지 않기 때문에, 포맷 문자열 내에서 임의의 딕셔너리 키(예를 들어, @code{'10'} 이나 @code{':-]'})를 지정할 수 없습니다. `arg_name' 다음에는 제한 없는 개수의 인덱스나 어트리뷰트 표현식이 올 수 있습니다. @code{'.name'} 형태의 표현식은 @ref{dc9,,getattr()}을 사용하여 이름있는 어트리뷰트를 선택하는 반면, @code{'[index]'} 형태의 표현식은 @ref{588,,__getitem__()} 을 사용해서 인덱스 조회를 합니다.


버전 3.1에서 변경: 위치 인자 지정자는 @ref{832,,str.format()} 에서 생략 할 수 있습니다. 그래서, @code{'@{@} @{@}'.format(a, b)} 는 @code{'@{0@} @{1@}'.format(a, b)} 과 동등합니다.



버전 3.4에서 변경: 위치 인자 지정자는 @ref{10bc,,Formatter}에서 생략 할 수 있습니다.


몇 가지 간단한 포맷 문자열 예제:

@example
"First, thou shalt count to @{0@}"  # 첫번째 위치 인자를 참조합니다
"Bring me a @{@}"                   # 묵시적으로 첫번째 위치 인자를 참조합니다
"From @{@} to @{@}"                   # "From @{0@} to @{1@}" 과 같습니다
"My quest is @{name@}"              # 키워드 인자 'name' 을 참조합니다
"Weight in tons @{0.weight@}"       # 첫번째 위치 인자의 'weight' 어트리뷰트
"Units destroyed: @{players[0]@}"   # 키워드 인자 'players' 의 첫번째 요소.
@end example
@anchor{library/string formatstrings-conversion}@anchor{275d}
`conversion' 필드는 포매팅 전에 형 코어션을 일으킵니다. 보통은, 값을 포매팅하는 작업은 값 자체의 @ref{830,,__format__()} 메서드에 의해 수행됩니다. 그러나 어떤 경우에는 형 자신의 포매팅 정의를 무시하고 문자열로 포맷되도록 강제할 필요가 있습니다. @code{__format__()} 을 호출하기 전에 값을 문자열로 변환하면, 일반적인 포매팅 논리가 무시됩니다.

현재 세 가지 변환 플래그가 지원됩니다: @code{'!s'} 는 값에 @ref{169,,str()} 을 호출하고, @code{'!r'} 은 값에 @ref{1c1,,repr()} 을 호출하고, @code{'!a'} 는 값에 @ref{15eb,,ascii()} 를 호출합니다.

몇 가지 예:

@example
"Harold's a clever @{0!s@}"        # 먼저 인자에 str() 을 호출합니다
"Bring out the holy @{name!r@}"    # 먼저 인자에 repr() 을 호출합니다
"More @{!a@}"                      # 먼저 인자에 ascii() 를 호출합니다
@end example

`format_spec' 필드에는 값을 표시하는 방법에 대한 명세가 포함되어 있는데, 필드 너비, 정렬, 채움, 십진 정밀도 등이 포함됩니다. 각 값 형은 자체 “포매팅 미니 언어” 또는 `format_spec' 의 해석을 정의 할 수 있습니다.

대부분의 내장형은 다음 절에서 설명하는 공통 포매팅 미니 언어를 지원합니다.

A `format_spec' 필드는 그 안에 중첩된 치환 필드를 포함할 수도 있습니다. 이러한 중첩 된 치환 필드에는 필드 이름, 변환 플래그 및 포맷 명세가 포함될 수 있지만, 더 깊은 중첩은 허용되지 않습니다. format_spec 내의 치환 필드는 `format_spec' 문자열이 해석되기 전에 치환됩니다. 이렇게 해서 값의 포매팅을 동적으로 지정할 수 있게 합니다.

몇 가지 예제는 @ref{275e,,포맷 예제} 섹션을 보십시오.

@menu
* Format specification mini-language:: 
* 포맷 예제:: 

@end menu

@node Format specification mini-language,포맷 예제,,Format string syntax
@anchor{library/string format-specification-mini-language}@anchor{275f}@anchor{library/string formatspec}@anchor{4f9}
@subsubsection Format specification mini-language


“Format specifications” are used within replacement fields contained within a
format string to define how individual values are presented (see
@ref{15a0,,Format string syntax}, @ref{19a,,포맷 문자열 리터럴}, and @ref{17fd,,t-strings}).
They can also be passed directly to the built-in
@ref{199,,format()} function.  Each formattable type may define how the format
specification is to be interpreted.

대부분의 내장형은 포맷 명세에 대해 다음 옵션을 구현하지만, 일부 포맷 옵션은 숫자 형에서만 지원됩니다.

일반적인 관례는 빈 포맷 명세가 값에 @ref{169,,str()} 을 호출한 것과 같은 결과를 만드는 것입니다. 비어 있지 않은 포맷 명세는 보통 결과를 수정합니다.

`표준 포맷 지정자' 의 일반적인 형식은 다음과 같습니다:

@example
@anchor{library/string grammar-token-format-spec-format_spec}@anchor{275c}format_spec:             [@ref{2760,,options}][@ref{2761,,width_and_precision}][@ref{2762,,type}]
@anchor{library/string grammar-token-format-spec-options}@anchor{2760}options:                 [[@ref{2763,,fill}]@ref{2764,,align}][@ref{2765,,sign}]["z"]["#"]["0"]
@anchor{library/string grammar-token-format-spec-fill}@anchor{2763}fill:                    <any character>
@anchor{library/string grammar-token-format-spec-align}@anchor{2764}align:                   "<" | ">" | "=" | "^"
@anchor{library/string grammar-token-format-spec-sign}@anchor{2765}sign:                    "+" | "-" | " "
@anchor{library/string grammar-token-format-spec-width_and_precision}@anchor{2761}width_and_precision:     [@ref{2766,,width_with_grouping}][@ref{2767,,precision_with_grouping}]
@anchor{library/string grammar-token-format-spec-width_with_grouping}@anchor{2766}width_with_grouping:     [@ref{2768,,width}][@ref{2769,,grouping}]
@anchor{library/string grammar-token-format-spec-precision_with_grouping}@anchor{2767}precision_with_grouping: "." [@ref{276a,,precision}][@ref{2769,,grouping}] | "." @ref{2769,,grouping}
@anchor{library/string grammar-token-format-spec-width}@anchor{2768}width:                   @ref{230f,,digit}+
@anchor{library/string grammar-token-format-spec-precision}@anchor{276a}precision:               @ref{230f,,digit}+
@anchor{library/string grammar-token-format-spec-grouping}@anchor{2769}grouping:                "," | "_"
@anchor{library/string grammar-token-format-spec-type}@anchor{2762}type:                    "b" | "c" | "d" | "e" | "E" | "f" | "F" | "g"
                         | "G" | "n" | "o" | "s" | "x" | "X" | "%"
@end example

유효한 `align' 값이 지정되면, `fill' 문자가 앞에 나올 수 있는데 임의의 문자가 될 수 있고, 생략된 경우에는 스페이스가 기본값으로 사용됩니다. @ref{19a,,포맷 문자열 리터럴} 에서나 @ref{832,,str.format()} 메서드를 사용할 때는, 리터럴 중괄호(”@code{@{}” 또는 “@code{@}}”)를 `fill' 문자로 사용할 수 없습니다. 그러나, 중첩된 치환 필드로 중괄호를 삽입 할 수 있습니다. 이 제한은 @ref{199,,format()} 함수에는 영향을 미치지 않습니다.

다양한 정렬 옵션의 의미는 다음과 같습니다:

@geindex < (작다);문자열 포매팅에서
@geindex > (크다);문자열 포매팅에서
@geindex = (등호);문자열 포매팅에서
@geindex ^ (캐럿);문자열 포매팅에서


@multitable {xxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

옵션

@tab

의미

@item

@code{'<'}

@tab

사용 가능한 공간 내에서 필드가 왼쪽 정렬되도록 합니다 (대부분 객체에서 이것이 기본값입니다).

@item

@code{'>'}

@tab

사용 가능한 공간 내에서 필드가 오른쪽 정렬되도록 합니다 (숫자에서 이것이 기본값입니다).

@item

@code{'='}

@tab

채움이 부호 (있다면) 뒤에, 숫자 앞에 오도록 강제합니다. 이것은 ‘+000000120’ 형식으로 필드를 인쇄하는 데 사용됩니다. 이 정렬 옵션은 @ref{197,,complex}를 제외한 숫자 형에게만 유효합니다. 이것은 필드 너비 바로 앞에 ‘0’ 이 있으면 숫자에 대한 기본값이 됩니다.

@item

@code{'^'}

@tab

사용 가능한 공간 내에서 필드를 가운데에 배치합니다.

@end multitable


최소 필드 너비가 정의되지 않으면, 필드 너비는 항상 필드를 채울 데이터와 같은 크기이므로, 정렬 옵션은 이 경우 의미가 없습니다.

`sign' 옵션은 숫자 형에게만 유효하며, 다음 중 하나일 수 있습니다:

@geindex + (플러스);문자열 포매팅에서
@geindex - (마이너스);문자열 포매팅에서
@geindex 스페이스;문자열 포매팅에서


@multitable {xxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

옵션

@tab

의미

@item

@code{'+'}

@tab

음수뿐만 아니라 양수에도 부호를 사용해야 함을 나타냅니다.

@item

@code{'-'}

@tab

음수에 대해서만 부호를 사용해야 함을 나타냅니다 (이것이 기본 동작입니다).

@item

스페이스

@tab

양수에는 선행 스페이스를 사용하고, 음수에는 마이너스 부호를 사용해야 함을 나타냅니다.

@end multitable


@geindex z;문자열 포매팅에서

The @code{'z'} option coerces negative zero floating-point values to positive
zero after rounding to the format precision.  This option is only valid for
floating-point presentation types.


버전 3.11에서 변경: @code{'z'} 옵션을 추가했습니다 (
@geindex Python 향상 제안; PEP 682
PEP 682@footnote{https://peps.python.org/pep-0682/} 도 보세요).


@geindex # (해시);문자열 포매팅에서

@code{'#'} 옵션은 변환에 “대안 형식” 이 사용되도록 만듭니다. 대안 형식은 형별로 다르게 정의됩니다. 이 옵션은 정수, 실수와 복소수 형에게만 유효합니다. 정수의 경우, 이진수, 8진수 또는 16진수 출력이 사용될 때, 이 옵션은 출력값에 각각 접두사 @code{'0b'}, @code{'0o'}, @code{'0x'} 또는 @code{'0X'} 를 추가합니다. 실수와 복소수의 경우, 대안 형식은 변환 결과의 소수점 아래 숫자가 없어도 항상 소수점 문자가 포함되게 합니다. 보통은, 소수점 문자는 그 뒤에 숫자가 있는 경우에만 변환 결과에 나타납니다. 이에 더해, @code{'g'} 및 @code{'G'} 변환의 경우 끝에 붙는 0이 결과에서 제거되지 않습니다.

`width' 는 최소 총 필드 너비를 정의하는 십진 정수인데, 접두사, 구분자 및 다른 포매팅 문자들을 포함합니다. 지정하지 않으면, 필드 너비는 내용에 의해 결정됩니다.

명시적 정렬이 주어지지 않을 때, `width' 필드 앞에 @code{'0'} 문자를 붙이면 @ref{197,,complex}를 제외한 숫자 형에 대해 부호를 고려하는 0 채움을 사용할 수 있습니다. 이것은 @code{'0'} 의 `fill' 문자와 @code{'='} 의 `alignment' 유형을 갖는 것과 동등합니다.


버전 3.10에서 변경: Preceding the `width' field by @code{'0'} no longer affects the default
alignment for strings.


`precision' 은 표시 유형 @code{'f'}와 @code{'F'}의 경우 소수점 뒤에 표시될 자릿수를, @code{'g'}와 @code{'G'}의 경우 소수점 앞, 뒤로 표시할 자릿수를 나타내는 십진 정수입니다. 문자열 표시 유형의 경우 필드는 최대 필드 크기를 나타냅니다 - 즉, 필드 내용에서 몇 개의 문자가 사용되는지 나타냅니다. 정수 표시 유형에는 `precision' 이 허용되지 않습니다.

The `grouping' option after `width' and `precision' fields specifies
a digit group separator for the integral and fractional parts
of a number respectively. It can be one of the following:

@geindex @comma{} (쉼표);문자열 포매팅에서
@geindex _ (밑줄);문자열 포매팅에서


@multitable {xxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

옵션

@tab

의미

@item

@code{','}

@tab

정수 표시 유형 @code{'d'}와, @code{'n'}을 제외한 부동 소수점 표시 유형에 대해 3자리마다 쉼표를 삽입합니다. 다른 표시 유형에는 이 옵션이 지원되지 않습니다.

@item

@code{'_'}

@tab

정수 표시 유형 @code{'d'}와, @code{'n'}을 제외한 부동 소수점 표시 유형에 대해 3자리마다 밑줄을 삽입합니다. 정수 표시 유형 @code{'b'}, @code{'o'}, @code{'x'} 및 @code{'X'} 의 경우 밑줄이 4자리마다 삽입됩니다. 다른 표시 유형에는 이 옵션이 지원되지 않습니다.

@end multitable


로케일을 고려하는 구분자의 경우, 대신 @code{'n'} 표시 유형을 사용하십시오.


버전 3.1에서 변경: @code{','} 옵션을 추가했습니다 (
@geindex Python 향상 제안; PEP 378
PEP 378@footnote{https://peps.python.org/pep-0378/} 도 보세요).



버전 3.6에서 변경: @code{'_'} 옵션을 추가했습니다 (
@geindex Python 향상 제안; PEP 515
PEP 515@footnote{https://peps.python.org/pep-0515/} 도 보세요).



버전 3.14에서 변경: Support the `grouping' option for the fractional part.


마지막으로 `type' 은 데이터를 표시하는 방법을 결정합니다.

사용 가능한 문자열 표시 유형은 다음과 같습니다:

@quotation


@multitable {xxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

유형

@tab

의미

@item

@code{'s'}

@tab

문자열 포맷. 이것은 문자열의 기본 유형이고 생략될 수 있습니다.

@item

없음

@tab

@code{'s'} 와 같습니다.

@end multitable

@end quotation

사용 가능한 정수 표시 유형은 다음과 같습니다:

@quotation


@multitable {xxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

유형

@tab

의미

@item

@code{'b'}

@tab

이진 형식. 이진법으로 숫자를 출력합니다.

@item

@code{'c'}

@tab

문자. 인쇄하기 전에 정수를 해당 유니코드 문자로 변환합니다.

@item

@code{'d'}

@tab

십진 정수. 십진법으로 숫자를 출력합니다.

@item

@code{'o'}

@tab

8진 형식. 8진법으로 숫자를 출력합니다.

@item

@code{'x'}

@tab

16진 형식. 9보다 큰 숫자의 경우 소문자를 사용하여 16진법으로 숫자를 출력합니다.

@item

@code{'X'}

@tab

16진 형식. 9보다 큰 숫자의 경우 대문자를 사용하여 16진법으로 숫자를 출력합니다. @code{'#'}가 지정되면, 접두사 @code{'0x'}도 대문자로 변환되어 @code{'0X'}로 표시됩니다.

@item

@code{'n'}

@tab

숫자. 이는 현재 로케일 설정을 사용하여 적절한 숫자 그룹 구분자를 삽입한다는 점을 제외하고는 @code{'d'} 와 같습니다.

@item

없음

@tab

@code{'d'} 와 같습니다.

@end multitable

@end quotation

위의 표시 유형에 더해, 정수는 아래에 나열된 부동 소수점 표시 유형으로 포맷될 수 있습니다 (@code{'n'} 및 @code{없음} 제외). 그렇게 할 때, 포매팅 전에 정수를 부동 소수점 숫자로 변환하기 위해 @ref{196,,float()} 가 사용됩니다.

@ref{196,,float} 및 @ref{1fe,,Decimal} 값에 사용할 수 있는 표시 유형은 다음과 같습니다:

@quotation


@multitable {xxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

유형

@tab

의미

@item

@code{'e'}

@tab

과학적 표기법. 주어진 정밀도 @code{p}에 대해, 지수에서 계수를 구분하는 문자 ‘e’를 사용하여 과학적 표기법으로 숫자를 포맷합니다. 계수는 소수점 앞의 한 자리와 소수점 뒤에 @code{p} 자리를 가져서, 총 @code{p + 1} 유효 자릿수를 갖습니다. 정밀도가 지정되지 않으면, @ref{196,,float}의 경우는 소수점 뒤에 @code{6} 숫자의 정밀도를 사용하고, @ref{1fe,,Decimal}의 경우는 모든 계수 숫자를 표시합니다. @code{p=0}이면, @code{#} 옵션을 사용하지 않는 한 소수점은 생략됩니다.

For @ref{196,,float}, the exponent always contains at
least two digits, and is zero if the value is zero.

@item

@code{'E'}

@tab

과학적 표기법. 구분 문자로 대문자 ‘E’를 사용한다는 것을 제외하고 @code{'e'} 와 같습니다.

@item

@code{'f'}

@tab

고정 소수점 표기법. 주어진 정밀도 @code{p}에 대해, 소수점 뒤에 정확히 @code{p} 자리가 있는 십진수로 숫자를 포맷합니다. 정밀도가 지정되지 않으면, @ref{196,,float}의 경우는 소수점 뒤에 @code{6} 숫자의 정밀도를 사용하고, @ref{1fe,,Decimal}의 경우는 모든 계수 숫자를 표시할 만큼 충분히 큰 정밀도를 사용합니다. @code{p=0}이면 , @code{#} 옵션을 사용하지 않는 한 소수점은 생략됩니다.

@item

@code{'F'}

@tab

고정 소수점 표기법. @code{'f'} 와 같지만, @code{nan} 을 @code{NAN} 으로, @code{inf} 를 @code{INF} 로 변환합니다.

@item

@code{'g'}

@tab

범용 형식. 주어진 정밀도 @code{p >= 1} 에 대해, 숫자를 유효 숫자 @code{p} 로 자리 올림 한 다음, 결과를 크기에 따라 고정 소수점 형식이나 과학 표기법으로 포맷합니다. 정밀도 @code{0}은 정밀도 @code{1}과 동등하게 처리됩니다.

정확한 규칙은 다음과 같습니다: 표시 유형 @code{'e'} 와 정밀도 @code{p-1} 로 포맷된 결과의 지수가 @code{exp} 라고 가정하십시오. 이때 @code{-m <= exp < p} 이면 (여기서 @code{m}은 float에서 -4이고 @ref{1fe,,Decimal} 이면 -6입니다), 숫자는 표시 형식 @code{'f'} 와 정밀도 @code{p-1-exp} 로 포맷됩니다. 그렇지 않으면, 숫자는 표시 유형 @code{'e'} 와 정밀도 @code{p-1} 로 포맷됩니다. 두 경우 유효하지 않은 후행 0은 모두 유효숫자부에서 제거되고, 뒤에 남아있는 숫자가 없다면 @code{'#'} 옵션이 사용되지 않는 한 소수점도 제거됩니다.

정밀도가 지정되지 않으면, @ref{196,,float}의 경우 @code{6} 유효 자릿수의 정밀도를 사용합니다. @ref{1fe,,Decimal}의 경우, 결과 계수는 값의 계수 숫자로 구성됩니다; 과학적 표기법은 절댓값이 @code{1e-6} 보다 작은 값과 최하위 숫자의 자릿값이 1보다 큰 값에 사용되며, 그렇지 않으면 고정 소수점 표기법이 사용됩니다.

양과 음의 무한대, 양과 음의 0, nans는 정밀도와 무관하게 각각 @code{inf}, @code{-inf}, @code{0}, @code{-0}, @code{nan} 으로 포맷됩니다.

@item

@code{'G'}

@tab

범용 형식. 숫자가 너무 커지면 @code{'E'} 로 전환하는 것을 제외하고 @code{'g'} 와 같습니다. 무한과 NaN 의 표현도 대문자로 바뀝니다.

@item

@code{'n'}

@tab

숫자. 현재 로케일 설정을 사용하여 숫자의 정수부에 적절한 숫자 그룹 구분자를 삽입한다는 점을 제외하면 @code{'g'} 와 같습니다.

@item

@code{'%'}

@tab

백분율. 숫자에 100을 곱해서 고정 (@code{'f'}) 형식으로 표시한 다음 백분율 기호를 붙입니다.

@item

없음

@tab

@ref{196,,float}의 경우, @code{'g'} 유형과 유사하지만, 고정 소수점 표기법이 결과를 포맷하는데 사용될 때, 소수점 이하로 적어도 하나의 숫자를 항상 포함하고, @code{exp >= p - 1}일 때 과학적 표기법으로 전환합니다. 정밀도가 지정되지 않으면, 후자는 주어진 값을 충실히 표현하는 데 필요한 만큼 크게 설정됩니다.

@ref{1fe,,Decimal}의 경우, 현재 십진 컨텍스트의 @code{context.capitals} 값에 따라 @code{'g'}나 @code{'G'}와 같습니다.

전체적인 효과는 @ref{169,,str()} 의 출력을 다른 포맷 수정자에 의해 변경된 것처럼 만드는 것입니다.

@end multitable

@end quotation

The result should be correctly rounded to a given precision @code{p} of digits
after the decimal point.  The rounding mode for @ref{196,,float} matches that
of the @ref{14df,,round()} builtin.  For @ref{1fe,,Decimal}, the rounding
mode of the current @ref{276b,,context} will be used.

The available presentation types for @ref{197,,complex} are the same as those for
@ref{196,,float} (@code{'%'} is not allowed).  Both the real and imaginary components
of a complex number are formatted as floating-point numbers, according to the
specified presentation type.  They are separated by the mandatory sign of the
imaginary part, the latter being terminated by a @code{j} suffix.  If the presentation
type is missing, the result will match the output of @ref{169,,str()} (complex numbers with
a non-zero real part are also surrounded by parentheses), possibly altered by
other format modifiers.

@node 포맷 예제,,Format specification mini-language,Format string syntax
@anchor{library/string format-examples}@anchor{276c}@anchor{library/string formatexamples}@anchor{275e}
@subsubsection 포맷 예제


이 절은 @ref{832,,str.format()} 문법의 예와 예전 @code{%}-포매팅과의 비교를 포함합니다.

대부분은 문법이 예전의 @code{%}-포매팅과 유사하며, @code{@{@}} 가 추가되고 @code{%} 대신 및 @code{:} 이 사용됩니다. 예를 들어, @code{'%03.2f'} 는 @code{'@{:03.2f@}'} 로 번역될 수 있습니다.

새 포맷 문법은 다음 예제에 보이는 것과 같이 새롭고 다양한 옵션도 지원합니다.

위치로 인자 액세스:

@example
>>> '@{0@}, @{1@}, @{2@}'.format('a', 'b', 'c')
'a, b, c'
>>> '@{@}, @{@}, @{@}'.format('a', 'b', 'c')  # 3.1+ 에서만
'a, b, c'
>>> '@{2@}, @{1@}, @{0@}'.format('a', 'b', 'c')
'c, b, a'
>>> '@{2@}, @{1@}, @{0@}'.format(*'abc')      # 인자 시퀀스를 언패킹
'c, b, a'
>>> '@{0@}@{1@}@{0@}'.format('abra', 'cad')   # 인자의 인덱스는 반복할 수 있습니다
'abracadabra'
@end example

이름으로 인자 액세스:

@example
>>> 'Coordinates: @{latitude@}, @{longitude@}'.format(latitude='37.24N', longitude='-115.81W')
'Coordinates: 37.24N, -115.81W'
>>> coord = @{'latitude': '37.24N', 'longitude': '-115.81W'@}
>>> 'Coordinates: @{latitude@}, @{longitude@}'.format(**coord)
'Coordinates: 37.24N, -115.81W'
@end example

인자의 어트리뷰트 액세스:

@example
>>> c = 3-5j
>>> ('The complex number @{0@} is formed from the real part @{0.real@} '
...  'and the imaginary part @{0.imag@}.').format(c)
'The complex number (3-5j) is formed from the real part 3.0 and the imaginary part -5.0.'
>>> class Point:
...     def __init__(self, x, y):
...         self.x, self.y = x, y
...     def __str__(self):
...         return 'Point(@{self.x@}, @{self.y@})'.format(self=self)
...
>>> str(Point(4, 2))
'Point(4, 2)'
@end example

인자의 항목 액세스:

@example
>>> coord = (3, 5)
>>> 'X: @{0[0]@};  Y: @{0[1]@}'.format(coord)
'X: 3;  Y: 5'
@end example

@code{%s} 과 @code{%r} 대체:

@example
>>> "repr() 은 따옴표를 표시하지만: @{!r@}; str() 은 그렇지 않습니다: @{!s@}".format('test1', 'test2')
"repr() 은 따옴표를 표시하지만: 'test1'; str() 은 그렇지 않습니다: test2"
@end example

텍스트 정렬과 너비 지정:

@example
>>> '@{:<30@}'.format('left aligned')
'left aligned                  '
>>> '@{:>30@}'.format('right aligned')
'                 right aligned'
>>> '@{:^30@}'.format('centered')
'           centered           '
>>> '@{:*^30@}'.format('centered')  # 채움 문자로 '*' 를 사용합니다
'***********centered***********'
@end example

@code{%+f}, @code{%-f}, @code{% f} 대체와 부호 지정:

@example
>>> '@{:+f@}; @{:+f@}'.format(3.14, -3.14)  # 항상 표시합니다
'+3.140000; -3.140000'
>>> '@{: f@}; @{: f@}'.format(3.14, -3.14)  # 양수는 스페이스를 표시합니다
' 3.140000; -3.140000'
>>> '@{:-f@}; @{:-f@}'.format(3.14, -3.14)  # 음수만 표시합니다 -- '@{:f@}; @{:f@}' 와 같습니다
'3.140000; -3.140000'
@end example

@code{%x}, @code{%o} 대체와 다른 진법으로 값 변환:

@example
>>> # format 은 이진수도 지원합니다
>>> "int: @{0:d@};  hex: @{0:x@};  oct: @{0:o@};  bin: @{0:b@}".format(42)
'int: 42;  hex: 2a;  oct: 52;  bin: 101010'
>>> # with 0x, 0o, or 0b as prefix:
>>> "int: @{0:d@};  hex: @{0:#x@};  oct: @{0:#o@};  bin: @{0:#b@}".format(42)
'int: 42;  hex: 0x2a;  oct: 0o52;  bin: 0b101010'
@end example

쉼표나 밑줄을 숫자 그룹 구분자로 사용:

@example
>>> '@{:,@}'.format(1234567890)
'1,234,567,890'
>>> '@{:_@}'.format(1234567890)
'1_234_567_890'
>>> '@{:_b@}'.format(1234567890)
'100_1001_1001_0110_0000_0010_1101_0010'
>>> '@{:_x@}'.format(1234567890)
'4996_02d2'
>>> '@{:_@}'.format(123456789.123456789)
'123_456_789.12345679'
>>> '@{:.,@}'.format(123456789.123456789)
'123456789.123,456,79'
>>> '@{:,._@}'.format(123456789.123456789)
'123,456,789.123_456_79'
@end example

백분율 표현:

@example
>>> points = 19
>>> total = 22
>>> 'Correct answers: @{:.2%@}'.format(points/total)
'Correct answers: 86.36%'
@end example

형별 포매팅 사용:

@example
>>> import datetime as dt
>>> d = dt.datetime(2010, 7, 4, 12, 15, 58)
>>> '@{:%Y-%m-%d %H:%M:%S@}'.format(d)
'2010-07-04 12:15:58'
@end example

인자 중첩과 보다 복잡한 예제:

@example
>>> for align, text in zip('<^>', ['left', 'center', 'right']):
...     '@{0:@{fill@}@{align@}16@}'.format(text, fill=align, align=align)
...
'left<<<<<<<<<<<<'
'^^^^^center^^^^^'
'>>>>>>>>>>>right'
>>>
>>> octets = [192, 168, 0, 1]
>>> '@{:02X@}@{:02X@}@{:02X@}@{:02X@}'.format(*octets)
'C0A80001'
>>> int(_, 16)
3232235521
>>>
>>> width = 5
>>> for num in range(5,12):
...     for base in 'dXob':
...         print('@{0:@{width@}@{base@}@}'.format(num, base=base, width=width), end=' ')
...     print()
...
    5     5     5   101
    6     6     6   110
    7     7     7   111
    8     8    10  1000
    9     9    11  1001
   10     A    12  1010
   11     B    13  1011
@end example

@node Template strings $-strings,도움 함수,Format string syntax,string — 일반적인 문자열 연산
@anchor{library/string template-strings-pep292}@anchor{276d}@anchor{library/string template-strings-strings}@anchor{276e}
@subsubsection Template strings ($-strings)


@cartouche
@quotation 참고 
The feature described here was introduced in Python 2.4;
a simple templating method based upon regular expressions.
It predates @ref{832,,str.format()}, @ref{19a,,formatted string literals},
and @ref{276f,,template string literals}.

It is unrelated to template string literals (t-strings),
which were introduced in Python 3.14.
These evaluate to  @ref{16a,,string.templatelib.Template} objects,
found in the @ref{d9,,string.templatelib} module.
@end quotation
@end cartouche

템플릿 문자열은 
@geindex Python 향상 제안; PEP 292
PEP 292@footnote{https://peps.python.org/pep-0292/} 에 설명된 대로 더 간단한 문자열 치환을 제공합니다. 템플릿 문자열의 주요 사례는 국제화(i18n)입니다. 이 문맥에서, 더 간단한 문법과 기능은 파이썬의 다른 내장 문자열 포매팅 기능보다 번역하기 쉽게 만들기 때문입니다. i18n을 위해 템플릿 문자열을 기반으로 구축된 라이브러리의 예는 flufl.i18n@footnote{https://flufli18n.readthedocs.io/en/latest/} 패키지를 보십시오.

@geindex $ (달러);템플릿 문자열에서

템플릿 문자열은 다음 규칙을 사용하여 @code{$}-기반 치환을 지원합니다:


@itemize *

@item 
@code{$$} 는 이스케이프입니다. 이것은 하나의 @code{$} 로 치환됩니다.

@item 
@code{$identifier} 는 매핑 키 @code{"identifier"} 와 일치하는 치환 자리 표시자를 지정합니다. 기본적으로, @code{"identifier"} 는 밑줄이나 ASCII 알파벳으로 시작하는 대소문자 구분 없는 ASCII 영숫자(밑줄 포함) 문자열로 제한됩니다. @code{$} 문자 뒤의 첫 번째 비 식별자 문자는 이 자리 표시자 명세를 종료합니다.

@item 
@code{$@{identifier@}} 는 @code{$identifier} 와 동등합니다. 유효한 식별자 문자가 자리 표시자 뒤에 오지만, 자리 표시자의 일부가 아니면 필요합니다, 가령 @code{"$@{noun@}ification"}.
@end itemize

문자열에 다른 방식으로 @code{$} 이 등장하면 @ref{2ec,,ValueError} 가 발생합니다.

The @code{string} module provides a @ref{896,,Template} class that implements
these rules.  The methods of @code{Template} are:

@geindex Template (string 클래스)
@anchor{library/string string Template}@anchor{896}
@deffn {클래스} string.Template (template)

생성자는 템플릿 문자열 하나를 받아들입니다.

@geindex substitute() (string.Template 메서드)
@anchor{library/string string Template substitute}@anchor{20d3}
@deffn {메서드} substitute (mapping=@{@}, /, **kwds)

템플릿 치환을 수행하고, 새 문자열을 반환합니다. `mapping' 은 템플릿의 자리 표시자와 일치하는 키를 가진 임의의 딕셔너리류 객체입니다. 또는, 키워드가 자리 표시자인 키워드 인자를 제공 할 수 있습니다. `mapping' 및 `kwds' 가 모두 제공되고 중복이 있는 경우, `kwds' 의 자리 표시자가 우선합니다.
@end deffn

@geindex safe_substitute() (string.Template 메서드)
@anchor{library/string string Template safe_substitute}@anchor{20d4}
@deffn {메서드} safe_substitute (mapping=@{@}, /, **kwds)

@ref{20d3,,substitute()}와 비슷하지만, `mapping' 과 `kwds' 에 자리 표시자가 없는 경우, @ref{5e5,,KeyError} 예외를 발생시키지 않고 원래 자리 표시자가 결과 문자열에 그대로 나타납니다. 또한 @code{substitute()} 와는 달리, @code{$} 가 잘못 사용되는 경우 @ref{2ec,,ValueError} 를 일으키는 대신 단순히 @code{$} 를 반환합니다.

다른 예외가 여전히 발생할 수 있지만, 이 메서드가 항상 예외를 발생시키는 대신 사용 가능한 문자열을 반환하려고 시도하기 때문에 “안전(safe)” 하다고 합니다. 다른 의미에서, @ref{20d4,,safe_substitute()} 는 안전하다고 할 수 없습니다. 길 잃은(dangling) 구분 기호, 쌍을 이루지 않는 중괄호, 유효한 파이썬 식별자가 아닌 자리 표시자를 포함하는 잘못된 템플릿을 조용히 무시하기 때문입니다.
@end deffn

@geindex is_valid() (string.Template 메서드)
@anchor{library/string string Template is_valid}@anchor{895}
@deffn {메서드} is_valid ()

Returns @code{False} if the template has invalid placeholders that will cause
@ref{20d3,,substitute()} to raise @ref{2ec,,ValueError}.


Added in version 3.11.

@end deffn

@geindex get_identifiers() (string.Template 메서드)
@anchor{library/string string Template get_identifiers}@anchor{894}
@deffn {메서드} get_identifiers ()

Returns a list of the valid identifiers in the template, in the order
they first appear, ignoring any invalid identifiers.


Added in version 3.11.

@end deffn

@ref{896,,Template} 인스턴스는 공개 데이터 어트리뷰트도 하나 제공합니다:

@geindex template (string.Template의 속성)
@anchor{library/string string Template template}@anchor{2770}
@deffn {속성} template

이것은 생성자의 `template' 인자로 전달된 객체입니다. 일반적으로, 변경해서는 안 되지만, 읽기 전용 액세스가 강제되지는 않습니다.
@end deffn
@end deffn

다음은 Template 사용 방법의 예입니다:

@example
>>> from string import Template
>>> s = Template('$who likes $what')
>>> s.substitute(who='tim', what='kung pao')
'tim likes kung pao'
>>> d = dict(who='tim')
>>> Template('Give $who $100').substitute(d)
Traceback (most recent call last):
...
ValueError: Invalid placeholder in string: line 1, col 11
>>> Template('$who likes $what').substitute(d)
Traceback (most recent call last):
...
KeyError: 'what'
>>> Template('$who likes $what').safe_substitute(d)
'tim likes $what'
@end example

고급 사용법: @ref{896,,Template} 의 서브 클래스를 파생하여, 자리 표시자 문법, 구분 기호 문자 또는 템플릿 문자열을 파싱하는데 사용되는 전체 정규식을 사용자 정의 할 수 있습니다. 이렇게 하려면, 다음 클래스 어트리뷰트를 재정의할 수 있습니다:


@itemize *

@item 
`delimiter' – 자리 표시자를 도입하는 구분자를 나타내는 리터럴 문자열입니다. 기본값은 @code{$} 입니다. 구현체는 필요할 때 이 문자열에 @ref{e02,,re.escape()} 를 호출하므로, 이 문자열은 정규식이 `아니어야' 합니다. 또한, 클래스 생성 후에 구분자를 변경할 수 없습니다 (즉, 다른 구분자는 반드시 서브 클래스의 클래스 이름 공간에 설정해야 합니다).

@item 
`idpattern' – 중괄호로 둘러싸지 않은 자리 표시자의 패턴을 설명하는 정규식입니다. 기본값은 정규식 @code{(?a:[_a-z][_a-z0-9]*)} 입니다. `braceidpattern' 이 @code{None} 인 경우, 이 패턴은 중괄호가 있는 자리 표시자에게도 적용됩니다.

@cartouche
@quotation 참고 
기본 `flags' 가 @code{re.IGNORECASE} 이기 때문에, 패턴 @code{[a-z]} 는 비 ASCII 문자와 일치 할 수 있습니다. 이 때문에 정규식에 @code{a} 플래그를 사용했습니다.
@end quotation
@end cartouche


버전 3.7에서 변경: `braceidpattern' 은 중괄호로 싸여있을 때와 그렇지 않을 때 사용되는 별도의 패턴을 정의하는데 사용할 수 있습니다.


@item 
`braceidpattern' – `idpattern' 과 유사하지만, 중괄호로 싸인 자리 표시자에 대한 패턴을 설명합니다. 기본값은 @code{None} 인데, `idpattern' 을 사용하는 것을 의미합니다 (즉, 같은 패턴이 중괄호가 있을 때와 없을 때 모두 사용됩니다). 이 값을 주면, 중괄호가 있을 때와 없을 때의 자리 표시자에 서로 다른 패턴을 정의 할 수 있습니다.


Added in version 3.7.


@item 
`flags' – 치환 인식에 사용되는 정규식을 컴파일할 때 적용될 정규식 플래그입니다. 기본값은 @code{re.IGNORECASE} 입니다. @code{re.VERBOSE} 가 항상 플래그에 추가되므로, 사용자 정의 `idpattern' 은 상세한 정규식의 규칙을 따라야 합니다.


Added in version 3.2.

@end itemize

또는, 클래스 어트리뷰트 `pattern' 을 재정의하여 전체 정규식 패턴을 제공 할 수 있습니다. 이렇게 하는 경우, 값은 네 개의 이름있는 캡처 그룹이 있는 정규식 객체여야 합니다. 캡처 그룹은 위에 제공된 규칙과 함께 유효하지 않은 자리 표시자 규칙에 해당합니다:


@itemize *

@item 
`escaped' – 이 그룹은 이스케이프 시퀀스를 일치시킵니다, 예를 들어 기본 패턴에서 @code{$$}.

@item 
`named' – 이 그룹은 중괄호가 없는 자리 표시자 이름을 일치합니다; 캡처 그룹에 구분자를 포함해서는 안 됩니다.

@item 
`braced' – 이 그룹은 중괄호로 묶인 자리 표시자 이름을 일치시킵니다; 캡처 그룹에 구분자나 중괄호를 포함해서는 안 됩니다.

@item 
`invalid' – 이 그룹은 그 외의 구분자 패턴(일반적으로 단일 구분자)을 일치시키고, 정규식의 마지막에 나타나야 합니다.
@end itemize

The methods on this class will raise @ref{2ec,,ValueError} if the pattern matches
the template without one of these named groups matching.

@node 도움 함수,,Template strings $-strings,string — 일반적인 문자열 연산
@anchor{library/string helper-functions}@anchor{2771}
@subsubsection 도움 함수


@geindex capwords() (string 모듈)
@anchor{library/string string capwords}@anchor{2652}
@deffn {함수} string.capwords (s, sep=None)

인자를 @ref{10a9,,str.split()} 을 사용하여 단어로 나누고, @ref{263a,,str.capitalize()} 를 사용하여 각 단어의 첫 글자를 대문자로 만들고, 이렇게 만들어진 단어들을 @ref{260a,,str.join()} 을 사용하여 결합합니다. 선택적 두 번째 인자 `sep' 가 없거나 @code{None} 이면, 연속된 공백 문자는 단일 스페이스로 바뀌고 앞뒤 공백이 제거됩니다. 그렇지 않으면 `sep' 가 단어를 나누고 합치는 데 사용됩니다.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node string templatelib — Support for template string literals,re — Regular expression operations,string — 일반적인 문자열 연산,텍스트 처리 서비스
@anchor{library/string templatelib doc}@anchor{2772}@anchor{library/string templatelib module-string templatelib}@anchor{d9}@anchor{library/string templatelib string-templatelib-support-for-template-string-literals}@anchor{2773}@anchor{library/string templatelib translation-repo}@anchor{2774}
@subsection @code{string.templatelib} — Support for template string literals


@geindex module; string.templatelib

`Source code:' Lib/string/templatelib.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/string/templatelib.py}


__________________________________________________________________



@subsubheading 더 보기



@itemize *

@item 
@ref{19a,,Format strings}

@item 
@ref{17fd,,Template string literal (t-string) syntax}

@item 
@geindex Python 향상 제안; PEP 750
PEP 750@footnote{https://peps.python.org/pep-0750/}
@end itemize


@menu
* Template strings:: 
* Types:: 
* Helper functions:: 

@end menu

@node Template strings,Types,,string templatelib — Support for template string literals
@anchor{library/string templatelib id1}@anchor{2775}@anchor{library/string templatelib template-strings}@anchor{276f}
@subsubsection Template strings



Added in version 3.14.


Template strings are a mechanism for custom string processing.
They have the full flexibility of Python’s @ref{19a,,포맷 문자열 리터럴},
but return a @ref{16a,,Template} instance that gives access
to the static and interpolated (in curly brackets) parts of a string
`before' they are combined.

To write a t-string, use a @code{'t'} prefix instead of an @code{'f'}, like so:

@example
>>> pi = 3.14
>>> t't-strings are new in Python @{pi!s@}!'
Template(
   strings=('t-strings are new in Python ', '!'),
   interpolations=(Interpolation(3.14, 'pi', 's', '@w{'}),)
)
@end example

@node Types,Helper functions,Template strings,string templatelib — Support for template string literals
@anchor{library/string templatelib types}@anchor{2776}
@subsubsection Types


@geindex Template (string.templatelib 클래스)
@anchor{library/string templatelib string templatelib Template}@anchor{16a}
@deffn {클래스} string.templatelib.Template

The @code{Template} class describes the contents of a template string.
It is immutable, meaning that attributes of a template cannot be reassigned.

The most common way to create a @code{Template} instance is to use the
@ref{17fd,,template string literal syntax}.
This syntax is identical to that of @ref{19a,,f-strings},
except that it uses a @code{t} prefix in place of an @code{f}:

@example
>>> cheese = 'Red Leicester'
>>> template = t"We're fresh out of @{cheese@}, sir."
>>> type(template)
<class 'string.templatelib.Template'>
@end example

Templates are stored as sequences of literal @ref{2777,,strings}
and dynamic @ref{2778,,interpolations}.
A @ref{2779,,values} attribute holds the values of the interpolations:

@example
>>> cheese = 'Camembert'
>>> template = t'Ah! We do have @{cheese@}.'
>>> template.strings
('Ah! We do have ', '.')
>>> template.interpolations
(Interpolation('Camembert', ...),)
>>> template.values
('Camembert',)
@end example

The @code{strings} tuple has one more element than @code{interpolations}
and @code{values}; the interpolations “belong” between the strings.
This may be easier to understand when tuples are aligned

@example
template.strings:  ('Ah! We do have ',              '.')
template.values:   (                   'Camembert',    )
@end example

@subsubheading Attributes


@geindex strings (string.templatelib.Template의 속성)
@anchor{library/string templatelib string templatelib Template strings}@anchor{2777}
@deffn {속성} strings: @ref{610,,tuple}[@ref{169,,str}, ...]

A @ref{610,,tuple} of the static strings in the template.

@example
>>> cheese = 'Camembert'
>>> template = t'Ah! We do have @{cheese@}.'
>>> template.strings
('Ah! We do have ', '.')
@end example

Empty strings `are' included in the tuple:

@example
>>> response = 'We do have '
>>> cheese = 'Camembert'
>>> template = t'Ah! @{response@}@{cheese@}.'
>>> template.strings
('Ah! ', '@w{'}, '.')
@end example

The @code{strings} tuple is never empty, and always contains one more
string than the @code{interpolations} and @code{values} tuples:

@example
>>> t'@w{'}.strings
('@w{'},)
>>> t'@w{'}.values
()
>>> t'@{'cheese'@}'.strings
('@w{'}, '@w{'})
>>> t'@{'cheese'@}'.values
('cheese',)
@end example
@end deffn

@geindex interpolations (string.templatelib.Template의 속성)
@anchor{library/string templatelib string templatelib Template interpolations}@anchor{2778}
@deffn {속성} interpolations: @ref{610,,tuple}[@ref{16b,,Interpolation}, ...]

A @ref{610,,tuple} of the interpolations in the template.

@example
>>> cheese = 'Camembert'
>>> template = t'Ah! We do have @{cheese@}.'
>>> template.interpolations
(Interpolation('Camembert', 'cheese', None, '@w{'}),)
@end example

The @code{interpolations} tuple may be empty and always contains one fewer
values than the @code{strings} tuple:

@example
>>> t'Red Leicester'.interpolations
()
@end example
@end deffn

@geindex values (string.templatelib.Template의 속성)
@anchor{library/string templatelib string templatelib Template values}@anchor{2779}
@deffn {속성} values: @ref{610,,tuple}[@ref{c7d,,object}, ...]

A tuple of all interpolated values in the template.

@example
>>> cheese = 'Camembert'
>>> template = t'Ah! We do have @{cheese@}.'
>>> template.values
('Camembert',)
@end example

The @code{values} tuple always has the same length as the
@code{interpolations} tuple. It is always equivalent to
@code{tuple(i.value for i in template.interpolations)}.
@end deffn

@subsubheading Methods


@geindex __new__() (string.templatelib.Template 메서드)
@anchor{library/string templatelib string templatelib Template __new__}@anchor{277a}
@deffn {메서드} __new__ (*args: str | Interpolation)

While literal syntax is the most common way to create a @code{Template},
it is also possible to create them directly using the constructor:

@example
>>> from string.templatelib import Interpolation, Template
>>> cheese = 'Camembert'
>>> template = Template(
...     'Ah! We do have ', Interpolation(cheese, 'cheese'), '.'
... )
>>> list(template)
['Ah! We do have ', Interpolation('Camembert', 'cheese', None, '@w{'}), '.']
@end example

If multiple strings are passed consecutively, they will be concatenated
into a single value in the @ref{2777,,strings} attribute. For example,
the following code creates a @code{Template} with a single final string:

@example
>>> from string.templatelib import Template
>>> template = Template('Ah! We do have ', 'Camembert', '.')
>>> template.strings
('Ah! We do have Camembert.',)
@end example

If multiple interpolations are passed consecutively, they will be treated
as separate interpolations and an empty string will be inserted between them.
For example, the following code creates a template with empty placeholders
in the @ref{2777,,strings} attribute:

@example
>>> from string.templatelib import Interpolation, Template
>>> template = Template(
...     Interpolation('Camembert', 'cheese'),
...     Interpolation('.', 'punctuation'),
... )
>>> template.strings
('@w{'}, '@w{'}, '@w{'})
@end example
@end deffn


@deffn {Describe} iter(template)

Iterate over the template, yielding each non-empty string and
@ref{16b,,Interpolation} in the correct order:

@example
>>> cheese = 'Camembert'
>>> list(t'Ah! We do have @{cheese@}.')
['Ah! We do have ', Interpolation('Camembert', 'cheese', None, '@w{'}), '.']
@end example

@cartouche
@quotation 조심 
Empty strings are `not' included in the iteration:

@example
>>> response = 'We do have '
>>> cheese = 'Camembert'
>>> list(t'Ah! @{response@}@{cheese@}.')
['Ah! ',
 Interpolation('We do have ', 'response', None, '@w{'}),
 Interpolation('Camembert', 'cheese', None, '@w{'}),
 '.']
@end example
@end quotation
@end cartouche
@end deffn


@deffn {Describe} template + other

@deffnx {Describe} template += other

Concatenate this template with another, returning a new
@code{Template} instance:

@example
>>> cheese = 'Camembert'
>>> list(t'Ah! ' + t'We do have @{cheese@}.')
['Ah! We do have ', Interpolation('Camembert', 'cheese', None, '@w{'}), '.']
@end example

Concatenating a @code{Template} and a @code{str} is `not' supported.
This is because it is unclear whether the string should be treated as
a static string or an interpolation.
If you want to concatenate a @code{Template} with a string,
you should either wrap the string directly in a @code{Template}
(to treat it as a static string)
or use an @code{Interpolation} (to treat it as dynamic):

@example
>>> from string.templatelib import Interpolation, Template
>>> template = t'Ah! '
>>> # Treat 'We do have ' as a static string
>>> template += Template('We do have ')
>>> # Treat cheese as an interpolation
>>> cheese = 'Camembert'
>>> template += Template(Interpolation(cheese, 'cheese'))
>>> list(template)
['Ah! We do have ', Interpolation('Camembert', 'cheese', None, '@w{'})]
@end example
@end deffn
@end deffn

@geindex Interpolation (string.templatelib 클래스)
@anchor{library/string templatelib string templatelib Interpolation}@anchor{16b}
@deffn {클래스} string.templatelib.Interpolation

The @code{Interpolation} type represents an expression inside a template string.
It is immutable, meaning that attributes of an interpolation cannot be reassigned.

Interpolations support pattern matching, allowing you to match against
their attributes with the @ref{a0e,,match statement}:

@example
>>> from string.templatelib import Interpolation
>>> interpolation = t'@{1. + 2.:.2f@}'.interpolations[0]
>>> interpolation
Interpolation(3.0, '1. + 2.', None, '.2f')
>>> match interpolation:
...     case Interpolation(value, expression, conversion, format_spec):
...         print(value, expression, conversion, format_spec, sep=' | ')
...
3.0 | 1. + 2. | None | .2f
@end example

@subsubheading Attributes


@geindex value (string.templatelib.Interpolation의 속성)
@anchor{library/string templatelib string templatelib Interpolation value}@anchor{277b}
@deffn {속성} value: @ref{c7d,,object}

The evaluated value of the interpolation.

@example
>>> t'@{1 + 2@}'.interpolations[0].value
3
@end example
@end deffn

@geindex expression (string.templatelib.Interpolation의 속성)
@anchor{library/string templatelib string templatelib Interpolation expression}@anchor{277c}
@deffn {속성} expression: @ref{169,,str}

For interpolations created by t-string literals, @code{expression}
is the expression text found inside the curly brackets (@code{@{} & @code{@}}),
including any whitespace, excluding the curly brackets themselves,
and ending before the first @code{!}, @code{:}, or @code{=} if any is present.
For manually created interpolations, @code{expression} is the arbitrary
string provided when constructing the interpolation instance.

We recommend using valid Python expressions or the empty string for the
@code{expression} field of manually created @code{Interpolation}
instances, although this is not enforced at runtime.

@example
>>> t'@{1 + 2@}'.interpolations[0].expression
'1 + 2'
@end example
@end deffn

@geindex conversion (string.templatelib.Interpolation의 속성)
@anchor{library/string templatelib string templatelib Interpolation conversion}@anchor{2658}
@deffn {속성} conversion: @ref{a55,,Literal}['a', 'r', 's'] | @ref{884,,None}

The conversion to apply to the value, or @code{None}.

The @code{conversion} is the optional conversion to apply
to the value:

@example
>>> t'@{1 + 2!a@}'.interpolations[0].conversion
'a'
@end example

@cartouche
@quotation 참고 
Unlike f-strings, where conversions are applied automatically,
the expected behavior with t-strings is that code that `processes' the
@code{Template} will decide how to interpret and whether to apply
the @code{conversion}.
For convenience, the @ref{277d,,convert()} function can be used to mimic
f-string conversion semantics.
@end quotation
@end cartouche
@end deffn

@geindex format_spec (string.templatelib.Interpolation의 속성)
@anchor{library/string templatelib string templatelib Interpolation format_spec}@anchor{277e}
@deffn {속성} format_spec: @ref{169,,str}

The format specification to apply to the value.

The @code{format_spec} is an optional, arbitrary string
used as the format specification to present the value:

@example
>>> t'@{1 + 2:.2f@}'.interpolations[0].format_spec
'.2f'
@end example

@cartouche
@quotation 참고 
Unlike f-strings, where format specifications are applied automatically
via the @ref{199,,format()} protocol, the expected behavior with
t-strings is that code that `processes' the interpolation will
decide how to interpret and whether to apply the format specification.
As a result, @code{format_spec} values in interpolations
can be arbitrary strings,
including those that do not conform to the @code{format()} protocol.
@end quotation
@end cartouche
@end deffn

@subsubheading Methods


@geindex __new__() (string.templatelib.Interpolation 메서드)
@anchor{library/string templatelib string templatelib Interpolation __new__}@anchor{277f}
@deffn {메서드} __new__ (value: object, expression: str, conversion: Literal['a', 'r', 's'] | None = None, format_spec: str = '@w{'})

Create a new @code{Interpolation} object from component parts.

@*매개변수: 

@itemize *

@item 
@code{value} – The evaluated, in-scope result of the interpolation.

@item 
@code{expression} – The text of a valid Python expression,
or an empty string.

@item 
@code{conversion} – The @ref{15a0,,conversion} to be used,
one of @code{None}, @code{'a'}, @code{'r'}, or @code{'s'}.

@item 
@code{format_spec} – An optional, arbitrary string used as the
@ref{4f9,,format specification} to present the value.
@end itemize

@end deffn
@end deffn

@node Helper functions,,Types,string templatelib — Support for template string literals
@anchor{library/string templatelib helper-functions}@anchor{2780}
@subsubsection Helper functions


@geindex convert() (string.templatelib 모듈)
@anchor{library/string templatelib string templatelib convert}@anchor{277d}
@deffn {함수} string.templatelib.convert (obj, /, conversion)

Applies formatted string literal @ref{275d,,conversion}
semantics to the given object `obj'.
This is frequently useful for custom template string processing logic.

Three conversion flags are currently supported:


@itemize *

@item 
@code{'s'} which calls @ref{169,,str()} on the value (like @code{!s}),

@item 
@code{'r'} which calls @ref{1c1,,repr()} (like @code{!r}), and

@item 
@code{'a'} which calls @ref{15eb,,ascii()} (like @code{!a}).
@end itemize

If the conversion flag is @code{None}, `obj' is returned unchanged.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node re — Regular expression operations,difflib — 델타 계산을 위한 도우미,string templatelib — Support for template string literals,텍스트 처리 서비스
@anchor{library/re doc}@anchor{2781}@anchor{library/re module-re}@anchor{be}@anchor{library/re re-regular-expression-operations}@anchor{2782}@anchor{library/re translation-repo}@anchor{2783}
@subsection @code{re} — Regular expression operations


@geindex module; re

`Source code:' Lib/re/@footnote{https://github.com/python/cpython/tree/3.14/Lib/re/}


__________________________________________________________________


이 모듈은 Perl에 있는 것과 유사한 정규식 일치 연산을 제공합니다.

Both patterns and strings to be searched can be Unicode strings (@ref{169,,str})
as well as 8-bit strings (@ref{192,,bytes}).
However, Unicode strings and 8-bit strings cannot be mixed:
that is, you cannot match a Unicode string with a bytes pattern or
vice-versa; similarly, when asking for a substitution, the replacement
string must be of the same type as both the pattern and the search string.

Regular expressions use the backslash character (@code{'\'}) to indicate
special forms or to allow special characters to be used without invoking
their special meaning.  This collides with Python’s usage of the same
character for the same purpose in string literals; for example, to match
a literal backslash, one might have to write @code{'\\\\'} as the pattern
string, because the regular expression must be @code{\\}, and each
backslash must be expressed as @code{\\} inside a regular Python string
literal. Also, please note that any invalid escape sequences in Python’s
usage of the backslash in string literals now generate a @ref{1ae,,SyntaxWarning}
and in the future this will become a @ref{18e,,SyntaxError}. This behaviour
will happen even if it is a valid escape sequence for a regular expression.

해결책은 정규식 패턴에 파이썬의 날 문자열(raw string) 표기법을 사용하는 것입니다; 역 슬래시는 @code{'r'} 접두어가 붙은 문자열 리터럴에서 특별한 방법으로 처리되지 않습니다. 따라서 @code{r"\n"}은 @code{'\'}와 @code{'n'}을 포함하는 두 글자 문자열이고, @code{"\n"}은 개행을 포함하는 한 글자 문자열입니다. 일반적으로 패턴은, 이 날 문자열 표기법을 사용하여 파이썬 코드로 표현됩니다.

대부분 정규식 연산은 모듈 수준 함수와 @ref{1186,,컴파일된 정규식}의 메서드로 사용할 수 있다는 점에 유의해야 합니다. 함수는 정규식 객체를 먼저 컴파일할 필요가 없도록 하는 바로 가기이지만, 일부 미세 조정 매개 변수가 빠져있습니다.


@subsubheading 더 보기


The third-party regex@footnote{https://pypi.org/project/regex/} module,
which has an API compatible with the standard library @code{re} module,
but offers additional functionality and a more thorough Unicode support.


@menu
* 정규식 문법:: 
* 모듈 내용:: 
* 정규식 객체:: 
* 일치 객체:: 
* 정규식 예제:: 

@end menu

@node 정규식 문법,모듈 내용,,re — Regular expression operations
@anchor{library/re re-syntax}@anchor{92d}@anchor{library/re regular-expression-syntax}@anchor{2784}
@subsubsection 정규식 문법


정규식(또는 RE)은 일치하는 문자열 집합을 지정합니다; 이 모듈의 함수는 특정 문자열이 주어진 정규식과 일치하는지 확인할 수 있도록 합니다 (또는 주어진 정규식이 특정 문자열과 일치하는지, 결국 같은 결과를 줍니다).

정규식을 이어붙여서 새로운 정규식을 만들 수 있습니다; `A'와 `B'가 모두 정규식이면 `AB'도 정규식입니다. 일반적으로 문자열 `p'가 `A'와 일치하고 다른 문자열 `q'가 `B'와 일치하면 문자열 `pq'가 AB와 일치합니다. 이것은 `A'나 `B'가 우선순위가 낮은 연산, `A'와 `B' 사이의 경계 조건 또는 숫자 그룹 참조를 포함하지 않는 한 성립합니다. 따라서, 복잡한 정규식은 여기에 설명된 것과 같은 더 단순한 기본 정규식으로 쉽게 구성할 수 있습니다. 정규식의 이론과 구현에 관한 자세한 내용은 Friedl 책 @ref{2785,,[Frie09]}, 또는 컴파일러 작성에 관한 거의 모든 교과서를 참조하십시오.

정규식의 형식에 대한 간단한 설명이 이어집니다. 더 자세한 정보와 더 친절한 소개는 @ref{2786,,정규식 HOWTO}를 참조하십시오.

정규식은 특수 문자와 일반 문자를 모두 포함 할 수 있습니다. @code{'A'}, @code{'a'} 또는 @code{'0'}과 같은 대부분의 일반 문자는 가장 단순한 정규식입니다; 그들은 단순히 자신과 일치합니다. 일반 문자를 이어 붙일 수 있어서, @code{last}는 @code{'last'} 문자열과 일치합니다. (이 절의 나머지 부분에서는, RE를 (보통 따옴표 없이) @code{이런 특별한 스타일}로, 일치할 문자열은 @code{'작은따옴표 안에'} 씁니다.)

@code{'|'}나 @code{'('}와 같은 일부 문자는 특수합니다. 특수 문자는 일반 문자의 클래스를 나타내거나, 그 주변의 정규식이 해석되는 방식에 영향을 줍니다.

Repetition operators or quantifiers (@code{*}, @code{+}, @code{?}, @code{@{m,n@}}, etc) cannot be
directly nested. This avoids ambiguity with the non-greedy modifier suffix
@code{?}, and with other modifiers in other implementations. To apply a second
repetition to an inner repetition, parentheses may be used. For example,
the expression @code{(?:a@{6@})*} matches any multiple of six @code{'a'} characters.

특수 문자는 다음과 같습니다:

@geindex . (dot);in regular expressions


@table @asis

@item @code{.}

(Dot.)  In the default mode, this matches any character except a newline.  If
the @ref{2787,,DOTALL} flag has been specified, this matches any character
including a newline.  @code{(?s:.)} matches any character regardless of flags.
@end table

@geindex ^ (caret);in regular expressions


@table @asis

@item @code{^}

(캐럿.) 문자열의 시작과 일치하고, @ref{2788,,MULTILINE} 모드에서는 각 개행 직후에도 일치합니다.
@end table

@geindex $ (dollar);in regular expressions


@table @asis

@item @code{$}

문자열의 끝이나 문자열 끝의 개행 문자 바로 직전과 일치하고, @ref{2788,,MULTILINE} 모드에서는 개행 문자 앞에서도 일치합니다. @code{foo}는 ‘foo’와 ‘foobar’를 모두 일치시키는 반면, 정규식 @code{foo$}는 ‘foo’ 만 일치합니다. 흥미롭게도, @code{'foo1\nfoo2\n'}에서 @code{foo.$}를 검색하면 ‘foo2’ 는 정상적으로 일치되지만, ‘foo1’은 @code{MULTILINE} 모드에서 검색됩니다; @code{'foo\n'}에서 단일 @code{$}를 검색하면 두 개의 (빈) 일치가 발견됩니다: 하나는 개행 직전에, 다른 하나는 문자열 끝에.
@end table

@geindex * (asterisk);in regular expressions


@table @asis

@item @code{*}

결과 RE가 선행 RE의 가능한 한 많은 0회 이상의 반복과 일치하도록 합니다. @code{ab*}는 ‘a’, ‘ab’ 또는 ‘a’ 다음에 임의의 수의 ‘b’가 오는 것과 일치합니다.
@end table

@geindex + (plus);in regular expressions


@table @asis

@item @code{+}

결과 RE가 선행 RE의 1회 이상의 반복과 일치하도록 합니다. @code{ab+}는 ‘a’ 다음에 하나 이상의 ‘b’가 오는 것과 일치합니다; 단지 ‘a’와는 일치하지 않습니다.
@end table

@geindex ? (question mark);in regular expressions


@table @asis

@item @code{?}

결과 RE가 선행 RE의 0 또는 1 반복과 일치하도록 합니다. @code{ab?}는 ‘a’나 ‘ab’와 일치합니다.
@end table

@geindex *?;in regular expressions
@geindex +?;in regular expressions
@geindex ??;in regular expressions


@table @asis

@item @code{*?}, @code{+?}, @code{??}

The @code{'*'}, @code{'+'}, and @code{'?'} quantifiers are all `greedy'; they match
as much text as possible.  Sometimes this behaviour isn’t desired; if the RE
@code{<.*>} is matched against @code{'<a> b <c>'}, it will match the entire
string, and not just @code{'<a>'}.  Adding @code{?} after the quantifier makes it
perform the match in `non-greedy' or `minimal' fashion; as `few'
characters as possible will be matched.  Using the RE @code{<.*?>} will match
only @code{'<a>'}.
@end table

@geindex *+;in regular expressions
@geindex ++;in regular expressions
@geindex ?+;in regular expressions


@table @asis

@item @code{*+}, @code{++}, @code{?+}

Like the @code{'*'}, @code{'+'}, and @code{'?'} quantifiers, those where @code{'+'} is
appended also match as many times as possible.
However, unlike the true greedy quantifiers, these do not allow
back-tracking when the expression following it fails to match.
These are known as `possessive' quantifiers.
For example, @code{a*a} will match @code{'aaaa'} because the @code{a*} will match
all 4 @code{'a'}s, but, when the final @code{'a'} is encountered, the
expression is backtracked so that in the end the @code{a*} ends up matching
3 @code{'a'}s total, and the fourth @code{'a'} is matched by the final @code{'a'}.
However, when @code{a*+a} is used to match @code{'aaaa'}, the @code{a*+} will
match all 4 @code{'a'}, but when the final @code{'a'} fails to find any more
characters to match, the expression cannot be backtracked and will thus
fail to match.
@code{x*+}, @code{x++} and @code{x?+} are equivalent to @code{(?>x*)}, @code{(?>x+)}
and @code{(?>x?)} correspondingly.


Added in version 3.11.

@end table

@geindex @{@} (curly brackets);in regular expressions


@table @asis

@item @code{@{m@}}

선행 RE의 정확히 `m' 복사가 일치하도록 지정합니다; 적은 횟수의 일치는 전체 RE가 일치하지 않게 됩니다. 예를 들어, @code{a@{6@}}는 정확히 6개의 @code{'a'} 문자와 일치하지만, 5개의 문자와는 일치하지 않습니다.

@item @code{@{m,n@}}

결과 RE를 선행 RE의 `m'에서 `n' 사이의 최대한 많은 반복과 일치하도록 합니다. 예를 들어, @code{a@{3,5@}}는 3에서 5개의 @code{'a'} 문자와 일치합니다. `m'을 생략하면 하한값 0이 지정되고, `n'을 생략하면 무한한 상한이 지정됩니다. 예를 들어, @code{a@{4,@}b}는 @code{'aaaab'} 나 1000개의 @code{'a'} 문자와 @code{'b'}가 일치하지만, @code{'aaab'}는 일치하지 않습니다. 콤마는 생략할 수 없습니다, 그렇지 않으면 한정자가 앞에서 설명한 형식과 혼동될 수 있습니다.

@item @code{@{m,n@}?}

Causes the resulting RE to match from `m' to `n' repetitions of the preceding
RE, attempting to match as `few' repetitions as possible.  This is the
non-greedy version of the previous quantifier.  For example, on the
6-character string @code{'aaaaaa'}, @code{a@{3,5@}} will match 5 @code{'a'} characters,
while @code{a@{3,5@}?} will only match 3 characters.

@item @code{@{m,n@}+}

Causes the resulting RE to match from `m' to `n' repetitions of the
preceding RE, attempting to match as many repetitions as possible
`without' establishing any backtracking points.
This is the possessive version of the quantifier above.
For example, on the 6-character string @code{'aaaaaa'}, @code{a@{3,5@}+aa}
attempt to match 5 @code{'a'} characters, then, requiring 2 more @code{'a'}s,
will need more characters than available and thus fail, while
@code{a@{3,5@}aa} will match with @code{a@{3,5@}} capturing 5, then 4 @code{'a'}s
by backtracking and then the final 2 @code{'a'}s are matched by the final
@code{aa} in the pattern.
@code{x@{m,n@}+} is equivalent to @code{(?>x@{m,n@})}.


Added in version 3.11.

@end table

@geindex \ (backslash);in regular expressions


@table @asis

@item @code{\}

특수 문자를 이스케이프 하거나 (@code{'*'}, @code{'?'} 등의 문자를 일치시킬 수 있도록 합니다), 특수 시퀀스를 알립니다; 특수 시퀀스는 아래에서 설명합니다.

날 문자열을 사용하여 패턴을 표현하지 않는다면, 파이썬이 문자열 리터럴에서 이스케이프 시퀀스로 역 슬래시를 사용한다는 것을 기억하십시오; 이스케이프 시퀀스가 파이썬의 구문 분석기에 의해 인식되지 않으면, 역 슬래시와 후속 문자가 결과 문자열에 포함됩니다. 그러나 파이썬이 결과 시퀀스를 인식한다면 역 슬래시는 두 번 반복되어야 합니다. 이것은 복잡하고 이해하기 어렵기 때문에, 가장 단순한 표현 이외에는 날 문자열을 사용하는 것이 좋습니다.
@end table

@geindex [] (square brackets);in regular expressions


@table @asis

@item @code{[]}

문자 집합을 나타내는 데 사용됩니다. 집합 안에서:


@itemize *

@item 
문자는 개별적으로 나열 할 수 있습니다, 예를 들어 @code{[amk]}는 @code{'a'}, @code{'m'} 또는 @code{'k'}와 일치합니다.
@end itemize

@geindex - (minus);in regular expressions


@itemize *

@item 
문자의 범위는 @code{'-'}로 구분된 두 문자를 주고는 것으로 나타낼 수 있습니다, 예를 들어 @code{[a-z]}는 모든 소문자 ASCII 문자와 일치하고, @code{[0-5][0-9]}는 @code{00}에서 @code{59}까지의 모든 두 자리 숫자와 일치하며, @code{[0-9A-Fa-f]}는 모든 16진수와 일치합니다. @code{-}가 이스케이프 처리되거나 (예를 들어 @code{[a\-z]}) 첫 번째나 마지막 문자로 배치되면 (예를 들어 @code{[-a]}나 @code{[a-]}) 리터럴 @code{'-'}와 일치합니다.

@item 
Special characters except backslash lose their special meaning inside sets.
For example,
@code{[(+*)]} will match any of the literal characters @code{'('}, @code{'+'},
@code{'*'}, or @code{')'}.
@end itemize

@geindex \ (backslash);in regular expressions


@itemize *

@item 
Backslash either escapes characters which have special meaning in a set
such as @code{'-'}, @code{']'}, @code{'^'} and @code{'\\'} itself or signals
a special sequence which represents a single character such as
@code{\xa0} or @code{\n} or a character class such as @code{\w} or @code{\S}
(defined below).
Note that @code{\b} represents a single “backspace” character,
not a word boundary as outside a set, and numeric escapes
such as @code{\1} are always octal escapes, not group references.
Special sequences which do not match a single character such as @code{\A}
and @code{\z} are not allowed.
@end itemize

@geindex ^ (caret);in regular expressions


@itemize *

@item 
범위 내에 있지 않은 문자는 `여집합(complementing)'을 만들어 일치할 수 있습니다. 집합의 첫 번째 문자가 @code{'^'}이면, 집합에 속하지 `않은' 모든 문자가 일치합니다. 예를 들어, @code{[^5]}는 @code{'5'}를 제외한 모든 문자와 일치하며, @code{[^^]}는 @code{'^'}를 제외한 모든 문자와 일치합니다. @code{^}는 집합의 첫 번째 문자가 아닐 때 특별한 의미가 없습니다.

@item 
To match a literal @code{']'} inside a set, precede it with a backslash, or
place it at the beginning of the set.  For example, both @code{[()[\]@{@}]} and
@code{[]()[@{@}]} will match a right bracket, as well as left bracket, braces,
and parentheses.
@end itemize

@c .. index:: single: --; in regular expressions

@c .. index:: single: &&; in regular expressions

@c .. index:: single: ~~; in regular expressions

@c .. index:: single: ||; in regular expressions


@itemize *

@item 
유니코드 기술 표준 #18@footnote{https://unicode.org/reports/tr18/} 에서 정의하는 중첩 집합과 집합 연산의 지원이 다음에 추가될 수 있습니다. 이것은 문법을 변경하므로, 이 변경을 용이하게 하기 위해 당분간 @ref{657,,FutureWarning}이 모호한 경우에 발생합니다. 여기에는 리터럴 @code{'['}로 시작하거나 리터럴 문자 시퀀스 @code{'--'}, @code{'&&'}, @code{'~~'} 및 @code{'||'}가 포함된 집합이 포함됩니다. 경고를 피하려면 역 슬래시로 이스케이프 처리하십시오.
@end itemize


버전 3.7에서 변경: 문자 집합이 미래에 의미가 변할 구조를 포함하고 있다면 @ref{657,,FutureWarning}이 발생합니다.

@end table

@geindex | (vertical bar);in regular expressions


@table @asis

@item @code{|}

@code{A|B}(여기서 `A'와 `B'는 임의의 RE일 수 있습니다)는 `A'나 `B'와 일치하는 정규식을 만듭니다. 이러한 방식으로 임의의 수의 RE를 @code{'|'}로 분리 할 수 있습니다. 이것은 그룹(아래를 참조하세요)에서도 사용할 수 있습니다. 대상 문자열이 스캔 될 때 @code{'|'}로 구분된 RE는 왼쪽에서 오른쪽으로 시도됩니다. 한 패턴이 완전히 일치하면, 해당 분기가 받아들여집니다. 이는 일단 `A'가 일치하면, `B'는 전체적으로 더 긴 일치를 생성하더라도 더 검사되지 않는다는 것을 뜻합니다. 즉, @code{'|'} 연산자는 절대로 탐욕적이지 않습니다. 리터럴 @code{'|'}와 일치시키려면, @code{\|}를 사용하거나, @code{[|]}처럼 문자 클래스 안에 넣으십시오.
@end table

@geindex () (parentheses);in regular expressions


@table @asis

@item @code{(...)}

괄호 안에 있는 정규식과 일치하며, 그룹의 시작과 끝을 나타냅니다; 그룹의 내용은 일치가 수행된 후 조회할 수 있으며, 나중에 문자열에서 @code{\number} 특수 시퀀스로 일치시킬 수 있습니다 (아래에서 설명됩니다). 리터럴 @code{'('}나 @code{')'}를 일치시키려면, @code{\(}나 @code{\)}를 사용하거나, 문자 클래스 안에 넣으십시오: @code{[(]}, @code{[)]}.
@end table

@geindex (?;in regular expressions


@table @asis

@item @code{(?...)}

이것은 확장 표기법입니다 (그렇지 않으면 @code{'('} 다음에 오는 @code{'?'`@w{`}는 의미가 없습니다). `@w{`}'?'} 다음의 첫 번째 문자는 확장의 의미와 이후의 문법을 결정합니다. 확장은 대개 새 그룹을 만들지 않습니다; 이 규칙에 대한 유일한 예외는 @code{(?P<name>...)}입니다. 다음은 현재 지원되는 확장입니다.

@item @code{(?aiLmsux)}

(One or more letters from the set
@code{'a'}, @code{'i'}, @code{'L'}, @code{'m'}, @code{'s'}, @code{'u'}, @code{'x'}.)
The group matches the empty string;
the letters set the corresponding flags for the entire regular expression:


@itemize *

@item 
@ref{2789,,re.A} (ASCII-only matching)

@item 
@ref{278a,,re.I} (ignore case)

@item 
@ref{278b,,re.L} (locale dependent)

@item 
@ref{278c,,re.M} (multi-line)

@item 
@ref{278d,,re.S} (dot matches all)

@item 
@ref{278e,,re.U} (Unicode matching)

@item 
@ref{278f,,re.X} (verbose)
@end itemize

(The flags are described in @ref{2790,,모듈 내용}.)
This is useful if you wish to include the flags as part of the
regular expression, instead of passing a `flag' argument to the
@ref{dcd,,re.compile()} function.
Flags should be used first in the expression string.


버전 3.11에서 변경: This construction can only be used at the start of the expression.

@end table

@geindex (?;;in regular expressions


@table @asis

@item @code{(?:...)}

일반 괄호의 비 포착 버전. 괄호 안의 정규식과 일치하지만, 그룹과 일치하는 부분 문자열은 일치를 수행한 후 조회하거나 나중에 패턴에서 참조할 수 `없습니다'.

@item @code{(?aiLmsux-imsx:...)}

(Zero or more letters from the set
@code{'a'}, @code{'i'}, @code{'L'}, @code{'m'}, @code{'s'}, @code{'u'}, @code{'x'},
optionally followed by @code{'-'} followed by
one or more letters from the @code{'i'}, @code{'m'}, @code{'s'}, @code{'x'}.)
The letters set or remove the corresponding flags for the part of the expression:


@itemize *

@item 
@ref{2789,,re.A} (ASCII-only matching)

@item 
@ref{278a,,re.I} (ignore case)

@item 
@ref{278b,,re.L} (locale dependent)

@item 
@ref{278c,,re.M} (multi-line)

@item 
@ref{278d,,re.S} (dot matches all)

@item 
@ref{278e,,re.U} (Unicode matching)

@item 
@ref{278f,,re.X} (verbose)
@end itemize

(The flags are described in @ref{2790,,모듈 내용}.)

The letters @code{'a'}, @code{'L'} and @code{'u'} are mutually exclusive when used
as inline flags, so they can’t be combined or follow @code{'-'}.  Instead,
when one of them appears in an inline group, it overrides the matching mode
in the enclosing group.  In Unicode patterns @code{(?a:...)} switches to
ASCII-only matching, and @code{(?u:...)} switches to Unicode matching
(default).  In bytes patterns @code{(?L:...)} switches to locale dependent
matching, and @code{(?a:...)} switches to ASCII-only matching (default).
This override is only in effect for the narrow inline group, and the
original matching mode is restored outside of the group.


Added in version 3.6.



버전 3.7에서 변경: 문자 @code{'a'}, @code{'L'} 및 @code{'u'}도 그룹에서 사용할 수 있습니다.


@item @code{(?>...)}

Attempts to match @code{...} as if it was a separate regular expression, and
if successful, continues to match the rest of the pattern following it.
If the subsequent pattern fails to match, the stack can only be unwound
to a point `before' the @code{(?>...)} because once exited, the expression,
known as an `atomic group', has thrown away all stack points within
itself.
Thus, @code{(?>.*).} would never match anything because first the @code{.*}
would match all characters possible, then, having nothing left to match,
the final @code{.} would fail to match.
Since there are no stack points saved in the Atomic Group, and there is
no stack point before it, the entire expression would thus fail to match.


Added in version 3.11.

@end table

@geindex (?P<;in regular expressions


@table @asis

@item @code{(?P<name>...)}

Similar to regular parentheses, but the substring matched by the group is
accessible via the symbolic group name `name'.  Group names must be valid
Python identifiers, and in @ref{192,,bytes} patterns they can only contain
bytes in the ASCII range.  Each group name must be defined only once within
a regular expression.  A symbolic group is also a numbered group, just as if
the group were not named.

이름 있는 그룹은 세 가지 문맥에서 참조될 수 있습니다. 패턴이 @code{(?P<quote>['"]).*?(?P=quote)}면 (즉, 작은따옴표나 큰따옴표로 인용된 문자열과 일치):


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

그룹 “quote”에 대한 참조 문맥

@tab

참조하는 방법

@item

같은 패턴 자체에서

@tab


@itemize *

@item 
@code{(?P=quote)} (보이는 대로)

@item 
@code{\1}
@end itemize

@item

일치 객체 `m'을 처리할 때

@tab


@itemize *

@item 
@code{m.group('quote')}

@item 
@code{m.end('quote')} (등)
@end itemize

@item

@code{re.sub()}의 `repl' 인자로 전달되는 문자열에서

@tab


@itemize *

@item 
@code{\g<quote>}

@item 
@code{\g<1>}

@item 
@code{\1}
@end itemize

@end multitable



버전 3.12에서 변경: In @ref{192,,bytes} patterns, group `name' can only contain bytes
in the ASCII range (@code{b'\x00'}-@code{b'\x7f'}).

@end table

@geindex (?P=;in regular expressions


@table @asis

@item @code{(?P=name)}

이름있는 그룹에 대한 역참조; `name'이라는 이름의 앞선 그룹과 일치하는 텍스트와 일치합니다.
@end table

@geindex (?#;in regular expressions


@table @asis

@item @code{(?#...)}

주석; 괄호의 내용은 단순히 무시됩니다.
@end table

@geindex (?=;in regular expressions


@table @asis

@item @code{(?=...)}

@code{...}가 다음과 일치하면 일치하지만, 문자열을 소비하지는 않습니다. 이를 `미리 보기 어서션 (lookahead assertion)'이라고 합니다. 예를 들어, @code{Isaac (?=Asimov)}는 @code{'Asimov'}가 뒤따를 때만 @code{'Isaac '}과 일치합니다.
@end table

@geindex (?!;in regular expressions


@table @asis

@item @code{(?!...)}

@code{...}가 다음과 일치하지 않으면 일치합니다. 이것은 `부정적인 미리 보기 어서션 (negative lookahead assertion)'입니다. 예를 들어, @code{Isaac (?!Asimov)}는 @code{'Asimov'}가 뒤따르지 `않을' 때 만 @code{'Isaac '}과 일치합니다.
@end table

@geindex (?<=;in regular expressions


@table @asis

@item @code{(?<=...)}

문자열의 현재 위치 앞에 현재 위치에서 끝나는 @code{...}와의 일치가 있으면 일치합니다. 이를 `긍정적인 되돌아보기 어서션 (positive lookbehind assertion)'이라고 합니다. 되돌아보기가 3문자를 백업하고 포함된 패턴이 일치하는지 확인하기 때문에 @code{(?<=abc)def}는 @code{'abcdef'}에서 일치를 찾습니다. 포함된 패턴은 고정 길이의 문자열과 일치해야 합니다, 즉, @code{abc}나 @code{a|b}는 허용되지만, @code{a*}와 @code{a@{3,4@}}는 허용되지 않습니다. 긍정적인 되돌아보기 어서션으로 시작하는 패턴은 검색되는 문자열의 시작 부분에서 일치하지 않음에 유의하십시오; @ref{1432,,match()} 함수보다는 @ref{1431,,search()} 함수를 사용하기를 원할 것입니다:

@example
>>> import re
>>> m = re.search('(?<=abc)def', 'abcdef')
>>> m.group(0)
'def'
@end example

이 예에서는 하이픈 다음의 단어를 찾습니다:

@example
>>> m = re.search(r'(?<=-)\w+', 'spam-egg')
>>> m.group(0)
'egg'
@end example


버전 3.5에서 변경: 고정 길이의 그룹 참조에 대한 지원이 추가되었습니다.

@end table

@geindex (?<!;in regular expressions


@table @asis

@item @code{(?<!...)}

문자열의 현재 위치 앞에 @code{...}와의 일치가 없으면 일치합니다. 이를 `부정적인 뒤돌아보기 어서션 (negative lookbehind assertion)'이라고 합니다. 긍정적인 뒤돌아보기 어서션과 마찬가지로, 포함된 패턴은 고정 길이의 문자열과 일치해야 합니다. 부정적인 뒤돌아보기 어서션으로 시작하는 패턴은 검색되는 문자열의 시작 부분에서 일치 할 수 있습니다.
@end table

@geindex (?(;in regular expressions
@anchor{library/re re-conditional-expression}@anchor{1b26}

@table @asis

@item @code{(?(id/name)yes-pattern|no-pattern)}

주어진 `id'나 `name'의 그룹이 있으면 @code{yes-pattern}과, 그렇지 않으면 @code{no-pattern}과 일치하려고 시도합니다. @code{no-pattern}은 선택적이며 생략될 수 있습니다. 예를 들어, @code{(<)?(\w+@@\w+(?:\.\w+)+)(?(1)>|$)}는 정교하지 않은 전자 메일 일치 패턴인데, @code{'<user@@host.com>'} 및 @code{'user@@host.com'}과 일치하지만, @code{'<user@@host.com'}이나 @code{'user@@host.com>'}과는 일치하지 않습니다.


버전 3.12에서 변경: Group `id' can only contain ASCII digits.
In @ref{192,,bytes} patterns, group `name' can only contain bytes
in the ASCII range (@code{b'\x00'}-@code{b'\x7f'}).

@end table
@anchor{library/re re-special-sequences}@anchor{2791}
특수 시퀀스는 @code{'\'}와 아래 목록의 문자로 구성됩니다. 일반 문자가 ASCII 숫자나 ASCII 글자가 아니면, 결과 RE는 두 번째 문자와 일치합니다. 예를 들어, @code{\$}는 문자 @code{'$'}와 일치합니다.

@geindex \ (backslash);in regular expressions


@table @asis

@item @code{\number}

같은 번호의 그룹 내용과 일치합니다. 그룹은 1부터 번호가 매겨집니다. 예를 들어, @code{(.+) \1}은 @code{'the the'}나 @code{'55 55'}와 일치하지만, @code{'thethe'}와는 일치하지 않습니다 (그룹 뒤의 공백에 유의하십시오). 이 특수 시퀀스는 첫 99개 그룹 중 하나와 일치하는 데에만 사용될 수 있습니다. `number'의 첫 자릿수가 0이거나, `number'가 3 자릿수면, 그룹 일치로 해석되지 않고, 8진수 값 `number'를 갖는 문자로 해석됩니다. 문자 클래스의 @code{'['}와 @code{']'} 안에서는, 모든 숫자 이스케이프가 문자로 처리됩니다.
@end table

@geindex \A;in regular expressions


@table @asis

@item @code{\A}

문자열의 시작 부분에서만 일치합니다.
@end table

@geindex \b;in regular expressions


@table @asis

@item @code{\b}

Matches the empty string, but only at the beginning or end of a word.
A word is defined as a sequence of word characters.
Note that formally, @code{\b} is defined as the boundary
between a @code{\w} and a @code{\W} character (or vice versa),
or between @code{\w} and the beginning or end of the string.
This means that @code{r'\bat\b'} matches @code{'at'}, @code{'at.'}, @code{'(at)'},
and @code{'as at ay'} but not @code{'attempt'} or @code{'atlas'}.

The default word characters in Unicode (str) patterns
are Unicode alphanumerics and the underscore,
but this can be changed by using the @ref{83d,,ASCII} flag.
Word boundaries are determined by the current locale
if the @ref{d62,,LOCALE} flag is used.

@cartouche
@quotation 참고 
Inside a character range, @code{\b} represents the backspace character,
for compatibility with Python’s string literals.
@end quotation
@end cartouche
@end table

@geindex \B;in regular expressions


@table @asis

@item @code{\B}

Matches the empty string,
but only when it is `not' at the beginning or end of a word.
This means that @code{r'at\B'} matches @code{'athens'}, @code{'atom'},
@code{'attorney'}, but not @code{'at'}, @code{'at.'}, or @code{'at!'}.
@code{\B} is the opposite of @code{\b},
so word characters in Unicode (str) patterns
are Unicode alphanumerics or the underscore,
although this can be changed by using the @ref{83d,,ASCII} flag.
Word boundaries are determined by the current locale
if the @ref{d62,,LOCALE} flag is used.


버전 3.14에서 변경: @code{\B} now matches empty input string.

@end table

@geindex \d;in regular expressions


@table @asis

@item @code{\d}


@table @asis

@item 유니코드 (str) 패턴일 때:

Matches any Unicode decimal digit
(that is, any character in Unicode character category [Nd]@footnote{https://www.unicode.org/versions/Unicode15.0.0/ch04.pdf#G134153}).
This includes @code{[0-9]}, and also many other digit characters.

Matches @code{[0-9]} if the @ref{83d,,ASCII} flag is used.

@item 8비트 (bytes) 패턴일 때:

Matches any decimal digit in the ASCII character set;
this is equivalent to @code{[0-9]}.
@end table
@end table

@geindex \D;in regular expressions


@table @asis

@item @code{\D}

Matches any character which is not a decimal digit.
This is the opposite of @code{\d}.

Matches @code{[^0-9]} if the @ref{83d,,ASCII} flag is used.
@end table

@geindex \s;in regular expressions


@table @asis

@item @code{\s}


@table @asis

@item 유니코드 (str) 패턴일 때:

Matches Unicode whitespace characters (as defined by @ref{2635,,str.isspace()}).
This includes @code{[ \t\n\r\f\v]}, and also many other characters, for example the
non-breaking spaces mandated by typography rules in many languages.

Matches @code{[ \t\n\r\f\v]} if the @ref{83d,,ASCII} flag is used.

@item 8비트 (bytes) 패턴일 때:

ASCII 문자 집합에서 공백으로 간주하는 문자와 일치합니다; 이것은 @code{[ \t\n\r\f\v]}와 동등합니다.
@end table
@end table

@geindex \S;in regular expressions


@table @asis

@item @code{\S}

Matches any character which is not a whitespace character. This is
the opposite of @code{\s}.

Matches @code{[^ \t\n\r\f\v]} if the @ref{83d,,ASCII} flag is used.
@end table

@geindex \w;in regular expressions


@table @asis

@item @code{\w}


@table @asis

@item 유니코드 (str) 패턴일 때:

Matches Unicode word characters;
this includes all Unicode alphanumeric characters
(as defined by @ref{262d,,str.isalnum()}),
as well as the underscore (@code{_}).

Matches @code{[a-zA-Z0-9_]} if the @ref{83d,,ASCII} flag is used.

@item 8비트 (bytes) 패턴일 때:

Matches characters considered alphanumeric in the ASCII character set;
this is equivalent to @code{[a-zA-Z0-9_]}.
If the @ref{d62,,LOCALE} flag is used,
matches characters considered alphanumeric in the current locale and the underscore.
@end table
@end table

@geindex \W;in regular expressions


@table @asis

@item @code{\W}

Matches any character which is not a word character.
This is the opposite of @code{\w}.
By default, matches non-underscore (@code{_}) characters
for which @ref{262d,,str.isalnum()} returns @code{False}.

Matches @code{[^a-zA-Z0-9_]} if the @ref{83d,,ASCII} flag is used.

If the @ref{d62,,LOCALE} flag is used,
matches characters which are neither alphanumeric in the current locale
nor the underscore.
@end table

@geindex \z;in regular expressions
@geindex \Z;in regular expressions


@table @asis

@item @code{\z}

문자열 끝에만 일치합니다.


Added in version 3.14.


@item @code{\Z}

The same as @code{\z}.  For compatibility with old Python versions.
@end table

@geindex \a;in regular expressions
@geindex \b;in regular expressions
@geindex \f;in regular expressions
@geindex \n;in regular expressions
@geindex \N;in regular expressions
@geindex \r;in regular expressions
@geindex \t;in regular expressions
@geindex \u;in regular expressions
@geindex \U;in regular expressions
@geindex \v;in regular expressions
@geindex \x;in regular expressions
@geindex \\;in regular expressions

Most of the @ref{686,,escape sequences} supported by Python
string literals are also accepted by the regular expression parser:

@example
\a      \b      \f      \n
\N      \r      \t      \u
\U      \v      \x      \\
@end example

(@code{\b}는 단어 경계를 나타내는 데 사용되며, 문자 클래스 내에서만 “백스페이스”를 의미함에 유의하십시오.)

@code{'\u'}, @code{'\U'}, and @code{'\N'} escape sequences are
only recognized in Unicode (str) patterns.
In bytes patterns they are errors.
Unknown escapes of ASCII letters are reserved
for future use and treated as errors.

8진수 이스케이프는 제한된 형식으로 포함됩니다. 첫 번째 숫자가 0이거나, 3개의 8진수가 있으면, 8진수 이스케이프로 간주합니다. 그렇지 않으면, 그룹 참조입니다. 문자열 리터럴과 마찬가지로, 8진수 이스케이프 길이는 항상 최대 3자리입니다.


버전 3.3에서 변경: @code{'\u'}와 @code{'\U'} 이스케이프 시퀀스가 추가되었습니다.



버전 3.6에서 변경: @code{'\'}와 ASCII 글자로 구성된 알 수 없는 이스케이프는 이제 에러입니다.



버전 3.8에서 변경: The @code{'\N@{@var{name}@}'} escape sequence has been added. As in string literals,
it expands to the named Unicode character (e.g. @code{'\N@{EM DASH@}'}).


@node 모듈 내용,정규식 객체,정규식 문법,re — Regular expression operations
@anchor{library/re contents-of-module-re}@anchor{2790}@anchor{library/re module-contents}@anchor{2792}
@subsubsection 모듈 내용


모듈은 몇 가지 함수, 상수 및 예외를 정의합니다. 함수 중 일부는 컴파일된 정규식의 모든 기능을 갖춘 메서드의 단순화된 버전입니다. 대부분의 사소하지 않은 응용 프로그램은 항상 컴파일된 형식을 사용합니다.

@menu
* Flags:: 
* Functions:: 
* Exceptions:: 

@end menu

@node Flags,Functions,,모듈 내용
@anchor{library/re flags}@anchor{2793}
@subsubsection Flags



버전 3.6에서 변경: 플래그 상수는 이제 @ref{e99,,enum.IntFlag}의 서브 클래스인 @ref{83e,,RegexFlag}의 인스턴스입니다.


@geindex RegexFlag (re 클래스)
@anchor{library/re re RegexFlag}@anchor{83e}
@deffn {클래스} re.RegexFlag

An @ref{e99,,enum.IntFlag} class containing the regex options listed below.


Added in version 3.11: - added to @code{__all__}

@end deffn

@geindex A (re 모듈)
@geindex ASCII (re 모듈)
@anchor{library/re re A}@anchor{2789}
@deffn {데이터} re.A
@anchor{library/re re ASCII}@anchor{83d}
@deffnx {데이터} re.ASCII

Make @code{\w}, @code{\W}, @code{\b}, @code{\B}, @code{\d}, @code{\D}, @code{\s} and @code{\S}
perform ASCII-only matching instead of full Unicode matching.  This is only
meaningful for Unicode (str) patterns, and is ignored for bytes patterns.

Corresponds to the inline flag @code{(?a)}.

@cartouche
@quotation 참고 
The @ref{278e,,U} flag still exists for backward compatibility,
but is redundant in Python 3 since
matches are Unicode by default for @code{str} patterns,
and Unicode matching isn’t allowed for bytes patterns.
@ref{d63,,UNICODE} and the inline flag @code{(?u)} are similarly redundant.
@end quotation
@end cartouche
@end deffn

@geindex DEBUG (re 모듈)
@anchor{library/re re DEBUG}@anchor{2794}
@deffn {데이터} re.DEBUG

Display debug information about compiled expression.

No corresponding inline flag.
@end deffn

@geindex I (re 모듈)
@geindex IGNORECASE (re 모듈)
@anchor{library/re re I}@anchor{278a}
@deffn {데이터} re.I
@anchor{library/re re IGNORECASE}@anchor{1a96}
@deffnx {데이터} re.IGNORECASE

Perform case-insensitive matching;
expressions like @code{[A-Z]} will also  match lowercase letters.
Full Unicode matching (such as @code{Ü} matching @code{ü})
also works unless the @ref{83d,,ASCII} flag
is used to disable non-ASCII matches.
The current locale does not change the effect of this flag
unless the @ref{d62,,LOCALE} flag is also used.

Corresponds to the inline flag @code{(?i)}.

Note that when the Unicode patterns @code{[a-z]} or @code{[A-Z]} are used in
combination with the @ref{1a96,,IGNORECASE} flag, they will match the 52 ASCII
letters and 4 additional non-ASCII letters: ‘İ’ (U+0130, Latin capital
letter I with dot above), ‘ı’ (U+0131, Latin small letter dotless i),
‘ſ’ (U+017F, Latin small letter long s) and ‘K’ (U+212A, Kelvin sign).
If the @ref{83d,,ASCII} flag is used, only letters ‘a’ to ‘z’
and ‘A’ to ‘Z’ are matched.
@end deffn

@geindex L (re 모듈)
@geindex LOCALE (re 모듈)
@anchor{library/re re L}@anchor{278b}
@deffn {데이터} re.L
@anchor{library/re re LOCALE}@anchor{d62}
@deffnx {데이터} re.LOCALE

Make @code{\w}, @code{\W}, @code{\b}, @code{\B} and case-insensitive matching
dependent on the current locale.
This flag can be used only with bytes patterns.

Corresponds to the inline flag @code{(?L)}.

@cartouche
@quotation 경고 
This flag is discouraged; consider Unicode matching instead.
The locale mechanism is very unreliable
as it only handles one “culture” at a time
and only works with 8-bit locales.
Unicode matching is enabled by default for Unicode (str) patterns
and it is able to handle different locales and languages.
@end quotation
@end cartouche


버전 3.6에서 변경: @ref{d62,,LOCALE} can be used only with bytes patterns
and is not compatible with @ref{83d,,ASCII}.



버전 3.7에서 변경: Compiled regular expression objects with the @ref{d62,,LOCALE} flag
no longer depend on the locale at compile time.
Only the locale at matching time affects the result of matching.

@end deffn

@geindex M (re 모듈)
@geindex MULTILINE (re 모듈)
@anchor{library/re re M}@anchor{278c}
@deffn {데이터} re.M
@anchor{library/re re MULTILINE}@anchor{2788}
@deffnx {데이터} re.MULTILINE

When specified, the pattern character @code{'^'} matches at the beginning of the
string and at the beginning of each line (immediately following each newline);
and the pattern character @code{'$'} matches at the end of the string and at the
end of each line (immediately preceding each newline).  By default, @code{'^'}
matches only at the beginning of the string, and @code{'$'} only at the end of the
string and immediately before the newline (if any) at the end of the string.

Corresponds to the inline flag @code{(?m)}.
@end deffn

@geindex NOFLAG (re 모듈)
@anchor{library/re re NOFLAG}@anchor{2795}
@deffn {데이터} re.NOFLAG

Indicates no flag being applied, the value is @code{0}.  This flag may be used
as a default value for a function keyword argument or as a base value that
will be conditionally ORed with other flags.  Example of use as a default
value:

@example
def myfunc(text, flag=re.NOFLAG):
    return re.match(text, flag)
@end example


Added in version 3.11.

@end deffn

@geindex S (re 모듈)
@geindex DOTALL (re 모듈)
@anchor{library/re re S}@anchor{278d}
@deffn {데이터} re.S
@anchor{library/re re DOTALL}@anchor{2787}
@deffnx {데이터} re.DOTALL

Make the @code{'.'} special character match any character at all, including a
newline; without this flag, @code{'.'} will match anything `except' a newline.

Corresponds to the inline flag @code{(?s)}.
@end deffn

@geindex U (re 모듈)
@geindex UNICODE (re 모듈)
@anchor{library/re re U}@anchor{278e}
@deffn {데이터} re.U
@anchor{library/re re UNICODE}@anchor{d63}
@deffnx {데이터} re.UNICODE

In Python 3, Unicode characters are matched by default
for @code{str} patterns.
This flag is therefore redundant with `no effect'
and is only kept for backward compatibility.

See @ref{83d,,ASCII} to restrict matching to ASCII characters instead.
@end deffn

@geindex X (re 모듈)
@geindex VERBOSE (re 모듈)
@anchor{library/re re X}@anchor{278f}
@deffn {데이터} re.X
@anchor{library/re re VERBOSE}@anchor{2796}
@deffnx {데이터} re.VERBOSE

@geindex # (hash);in regular expressions

This flag allows you to write regular expressions that look nicer and are
more readable by allowing you to visually separate logical sections of the
pattern and add comments. Whitespace within the pattern is ignored, except
when in a character class, or when preceded by an unescaped backslash,
or within tokens like @code{*?}, @code{(?:} or @code{(?P<...>}. For example, @code{(? :}
and @code{* ?} are not allowed.
When a line contains a @code{#} that is not in a character class and is not
preceded by an unescaped backslash, all characters from the leftmost such
@code{#} through the end of the line are ignored.

이것은 십진수와 일치하는 다음 두 정규식 객체는 기능적으로 같음을 뜻합니다:

@example
a = re.compile(r"""\d +  # the integral part
                   \.    # the decimal point
                   \d *  # some fractional digits""", re.X)
b = re.compile(r"\d+\.\d*")
@end example

인라인 플래그 @code{(?x)} 에 해당합니다.
@end deffn

@node Functions,Exceptions,Flags,모듈 내용
@anchor{library/re functions}@anchor{2797}
@subsubsection Functions


@geindex compile() (re 모듈)
@anchor{library/re re compile}@anchor{dcd}
@deffn {함수} re.compile (pattern, flags=0)

정규식 패턴을 @ref{1186,,정규식 객체}로 컴파일합니다. 정규식 객체는 아래에 설명되는 @ref{2798,,match()}, @ref{2799,,search()} 및 기타 메서드를 일치시키는 데 사용할 수 있습니다.

The expression’s behaviour can be modified by specifying a `flags' value.
Values can be any of the @ref{2793,,flags} variables, combined using bitwise OR
(the @code{|} operator).

시퀀스

@example
prog = re.compile(pattern)
result = prog.match(string)
@end example

는 다음과 동등합니다

@example
result = re.match(pattern, string)
@end example

하지만 정규식이 단일 프로그램에서 여러 번 사용될 때, @ref{dcd,,re.compile()}을 사용하고 결과 정규식 객체를 저장하여 재사용하는 것이 더 효율적입니다.

@cartouche
@quotation 참고 
@ref{dcd,,re.compile()}과 모듈 수준 일치 함수에 전달된 가장 최근 패턴의 컴파일된 버전이 캐시 되므로, 한 번에 몇 가지 정규식만 사용하는 프로그램은 정규식 컴파일에 대해 신경 쓸 필요가 없습니다.
@end quotation
@end cartouche
@end deffn

@geindex search() (re 모듈)
@anchor{library/re re search}@anchor{1431}
@deffn {함수} re.search (pattern, string, flags=0)

Scan through `string' looking for the first location where the regular expression
`pattern' produces a match, and return a corresponding @ref{ec2,,Match}. Return
@code{None} if no position in the string matches the pattern; note that this is
different from finding a zero-length match at some point in the string.

The expression’s behaviour can be modified by specifying a `flags' value.
Values can be any of the @ref{2793,,flags} variables, combined using bitwise OR
(the @code{|} operator).
@end deffn

@geindex match() (re 모듈)
@anchor{library/re re match}@anchor{1432}
@deffn {함수} re.match (pattern, string, flags=0)

If zero or more characters at the beginning of `string' match the regular
expression `pattern', return a corresponding @ref{ec2,,Match}.  Return
@code{None} if the string does not match the pattern; note that this is
different from a zero-length match.

@ref{2788,,MULTILINE} 모드에서도, @ref{1432,,re.match()}는 각 줄의 시작 부분이 아니라 문자열의 시작 부분에서만 일치함에 유의하십시오.

`string'의 모든 위치에서 일치를 찾으려면, 대신 @ref{1431,,search()}를 사용하십시오 (@ref{279a,,search() 대 match()}도 참조하십시오).

The expression’s behaviour can be modified by specifying a `flags' value.
Values can be any of the @ref{2793,,flags} variables, combined using bitwise OR
(the @code{|} operator).
@end deffn

@geindex fullmatch() (re 모듈)
@anchor{library/re re fullmatch}@anchor{1184}
@deffn {함수} re.fullmatch (pattern, string, flags=0)

If the whole `string' matches the regular expression `pattern', return a
corresponding @ref{ec2,,Match}.  Return @code{None} if the string does not match
the pattern; note that this is different from a zero-length match.

The expression’s behaviour can be modified by specifying a `flags' value.
Values can be any of the @ref{2793,,flags} variables, combined using bitwise OR
(the @code{|} operator).


Added in version 3.4.

@end deffn

@geindex split() (re 모듈)
@anchor{library/re re split}@anchor{5a1}
@deffn {함수} re.split (pattern, string, maxsplit=0, flags=0)

`string'을 `pattern'으로 나눕니다. `pattern'에서 포착하는 괄호가 사용되면 패턴의 모든 그룹 텍스트도 결과 리스트의 일부로 반환됩니다. `maxsplit'이 0이 아니면, 최대 `maxsplit' 분할이 발생하고, 나머지 문자열이 리스트의 마지막 요소로 반환됩니다.

@example
>>> re.split(r'\W+', 'Words, words, words.')
['Words', 'words', 'words', '@w{'}]
>>> re.split(r'(\W+)', 'Words, words, words.')
['Words', ', ', 'words', ', ', 'words', '.', '@w{'}]
>>> re.split(r'\W+', 'Words, words, words.', maxsplit=1)
['Words', 'words, words.']
>>> re.split('[a-f]+', '0a3B9', flags=re.IGNORECASE)
['0', '3', '9']
@end example

구분자에 포착하는 그룹이 있고 문자열 시작 부분에서 일치하면, 결과는 빈 문자열로 시작됩니다. 문자열의 끝에 대해서도 마찬가지입니다:

@example
>>> re.split(r'(\W+)', '...words, words...')
['@w{'}, '...', 'words', ', ', 'words', '...', '@w{'}]
@end example

그런 식으로, 구분자 구성 요소는 항상 결과 리스트 내의 같은 상대 인덱스에서 발견됩니다.

Adjacent empty matches are not possible, but an empty match can occur
immediately after a non-empty match.

@example
>>> re.split(r'\b', 'Words, words, words.')
['@w{'}, 'Words', ', ', 'words', ', ', 'words', '.']
>>> re.split(r'\W*', '...words...')
['@w{'}, '@w{'}, 'w', 'o', 'r', 'd', 's', '@w{'}, '@w{'}]
>>> re.split(r'(\W*)', '...words...')
['@w{'}, '...', '@w{'}, '@w{'}, 'w', '@w{'}, 'o', '@w{'}, 'r', '@w{'}, 'd', '@w{'}, 's', '...', '@w{'}, '@w{'}, '@w{'}]
@end example

The expression’s behaviour can be modified by specifying a `flags' value.
Values can be any of the @ref{2793,,flags} variables, combined using bitwise OR
(the @code{|} operator).


버전 3.1에서 변경: 선택적 flags 인자를 추가했습니다.



버전 3.7에서 변경: 빈 문자열과 일치 할 수 있는 패턴으로 분할하는 지원을 추가했습니다.



버전 3.13부터 폐지됨: Passing `maxsplit' and `flags' as positional arguments is deprecated.
In future Python versions they will be
@ref{5a4,,keyword-only parameters}.

@end deffn

@geindex findall() (re 모듈)
@anchor{library/re re findall}@anchor{1229}
@deffn {함수} re.findall (pattern, string, flags=0)

Return all non-overlapping matches of `pattern' in `string', as a list of
strings or tuples.  The `string' is scanned left-to-right, and matches
are returned in the order found.  Empty matches are included in the result.

The result depends on the number of capturing groups in the pattern.
If there are no groups, return a list of strings matching the whole
pattern.  If there is exactly one group, return a list of strings
matching that group.  If multiple groups are present, return a list
of tuples of strings matching the groups.  Non-capturing groups do not
affect the form of the result.

@example
>>> re.findall(r'\bf[a-z]*', 'which foot or hand fell fastest')
['foot', 'fell', 'fastest']
>>> re.findall(r'(\w+)=(\d+)', 'set width=20 and height=10')
[('width', '20'), ('height', '10')]
@end example

The expression’s behaviour can be modified by specifying a `flags' value.
Values can be any of the @ref{2793,,flags} variables, combined using bitwise OR
(the @code{|} operator).


버전 3.7에서 변경: 비어 있지 않은 일치는 이제 이전의 비어 있는 일치 직후에 시작할 수 있습니다.

@end deffn

@geindex finditer() (re 모듈)
@anchor{library/re re finditer}@anchor{16ff}
@deffn {함수} re.finditer (pattern, string, flags=0)

Return an @ref{4ca,,iterator} yielding @ref{ec2,,Match} objects over
all non-overlapping matches for the RE `pattern' in `string'.  The `string'
is scanned left-to-right, and matches are returned in the order found.  Empty
matches are included in the result.

The expression’s behaviour can be modified by specifying a `flags' value.
Values can be any of the @ref{2793,,flags} variables, combined using bitwise OR
(the @code{|} operator).


버전 3.7에서 변경: 비어 있지 않은 일치는 이제 이전의 비어 있는 일치 직후에 시작할 수 있습니다.

@end deffn

@geindex sub() (re 모듈)
@anchor{library/re re sub}@anchor{5a2}
@deffn {함수} re.sub (pattern, repl, string, count=0, flags=0)

`string'에서 겹치지 않는 `pattern'의 가장 왼쪽 일치를 `repl'로 치환하여 얻은 문자열을 반환합니다. 패턴을 찾지 못하면, `string'이 변경되지 않고 반환됩니다. `repl'은 문자열이나 함수가 될 수 있습니다; 문자열이면 모든 역 슬래시 이스케이프가 처리됩니다. 즉, @code{\n}은 단일 개행 문자로 변환되고, @code{\r}는 캐리지 리턴으로 변환되고, 등등. 알 수 없는 ASCII 글자 이스케이프는 나중에 사용하기 위해 예약되어 있으며 에러로 처리됩니다. @code{\&}와 같은 다른 알려지지 않은 이스케이프는 그대로 있습니다. @code{\6}과 같은 역참조는 패턴에서 그룹 6과 일치하는 부분 문자열로 치환됩니다. 예를 들면:

@example
>>> re.sub(r'def\s+([a-zA-Z_][a-zA-Z_0-9]*)\s*\(\s*\):',
...        r'static PyObject*\npy_\1(void)\n@{',
...        'def myfunc():')
'static PyObject*\npy_myfunc(void)\n@{'
@end example

If `repl' is a function, it is called for every non-overlapping occurrence of
`pattern'.  The function takes a single @ref{ec2,,Match} argument, and returns
the replacement string.  For example:

@example
>>> def dashrepl(matchobj):
...     if matchobj.group(0) == '-': return ' '
...     else: return '-'
...
>>> re.sub('-@{1,2@}', dashrepl, 'pro----gram-files')
'pro--gram files'
>>> re.sub(r'\sAND\s', ' & ', 'Baked Beans And Spam', flags=re.IGNORECASE)
'Baked Beans & Spam'
@end example

The pattern may be a string or a @ref{1b65,,Pattern}.

The optional argument `count' is the maximum number of pattern occurrences to be
replaced; `count' must be a non-negative integer.  If omitted or zero, all
occurrences will be replaced.

Adjacent empty matches are not possible, but an empty match can occur
immediately after a non-empty match.
As a result, @code{sub('x*', '-', 'abxd')} returns @code{'-a-b--d-'}
instead of @code{'-a-b-d-'}.

@geindex \g;in regular expressions

문자열형 `repl' 인자에서, 위에 설명된 문자 이스케이프와 역참조 외에, @code{\g<name>}는 @code{(?P<name>...)} 문법으로 정의한 @code{name}이라는 그룹에 일치하는 부분 문자열을 사용합니다. @code{\g<number>}는 해당 그룹 번호를 사용합니다; 따라서 @code{\g<2>}는 @code{\2}와 동등하지만, @code{\g<2>0}와 같은 치환에서 모호하지 않습니다. @code{\20}은 그룹 2에 대한 참조에 리터럴 문자 @code{'0'}이 뒤에 오는 것이 아니라, 그룹 20에 대한 참조로 해석됩니다. 역참조 @code{\g<0>}은 RE와 일치하는 전체 부분 문자열을 치환합니다.

The expression’s behaviour can be modified by specifying a `flags' value.
Values can be any of the @ref{2793,,flags} variables, combined using bitwise OR
(the @code{|} operator).


버전 3.1에서 변경: 선택적 flags 인자를 추가했습니다.



버전 3.5에서 변경: 일치하지 않는 그룹은 빈 문자열로 치환됩니다.



버전 3.6에서 변경: `pattern'의 @code{'\'}와 ASCII 글자(letter)로 구성된 알 수 없는 이스케이프는 이제 에러입니다.



버전 3.7에서 변경: Unknown escapes in `repl' consisting of @code{'\'} and an ASCII letter
now are errors.
An empty match can occur immediately after a non-empty match.



버전 3.12에서 변경: Group `id' can only contain ASCII digits.
In @ref{192,,bytes} replacement strings, group `name' can only contain bytes
in the ASCII range (@code{b'\x00'}-@code{b'\x7f'}).



버전 3.13부터 폐지됨: Passing `count' and `flags' as positional arguments is deprecated.
In future Python versions they will be
@ref{5a4,,keyword-only parameters}.

@end deffn

@geindex subn() (re 모듈)
@anchor{library/re re subn}@anchor{5a3}
@deffn {함수} re.subn (pattern, repl, string, count=0, flags=0)

@ref{5a2,,sub()}와 같은 연산을 수행하지만, 튜플 @code{(new_string, number_of_subs_made)}를 반환합니다.

The expression’s behaviour can be modified by specifying a `flags' value.
Values can be any of the @ref{2793,,flags} variables, combined using bitwise OR
(the @code{|} operator).
@end deffn

@geindex escape() (re 모듈)
@anchor{library/re re escape}@anchor{e02}
@deffn {함수} re.escape (pattern)

`pattern'에서 특수 문자를 이스케이프 처리합니다. 이것은 정규식 메타 문자가 포함되어있을 수 있는 임의의 리터럴 문자열을 일치시키려는 경우에 유용합니다. 예를 들면:

@example
>>> print(re.escape('https://www.python.org'))
https://www\.python\.org

>>> legal_chars = string.ascii_lowercase + string.digits + "!#$%&'*+-.^_`|~:"
>>> print('[%s]+' % re.escape(legal_chars))
[abcdefghijklmnopqrstuvwxyz0123456789!\#\$%\&'\*\+\-\.\^_`\|\~:]+

>>> operators = ['+', '-', '*', '/', '**']
>>> print('|'.join(map(re.escape, sorted(operators, reverse=True))))
/|\-|\+|\*\*|\*
@end example

이 함수는 @ref{5a2,,sub()}와 @ref{5a3,,subn()}의 치환 문자열에 사용하면 안 되며, 역 슬래시만 이스케이프 해야 합니다. 예를 들면:

@example
>>> digits_re = r'\d+'
>>> sample = '/usr/sbin/sendmail - 0 errors, 12 warnings'
>>> print(re.sub(digits_re, digits_re.replace('\\', r'\\'), sample))
/usr/sbin/sendmail - \d+ errors, \d+ warnings
@end example


버전 3.3에서 변경: @code{'_'} 문자는 더는 이스케이프 되지 않습니다.



버전 3.7에서 변경: 정규식에서 특별한 의미를 가질 수 있는 문자만 이스케이프 됩니다. 결과적으로, @code{'!'}, @code{'"'}, @code{'%'}, @code{"'"}, @code{','}, @code{'/'}, @code{':'}, @code{';'}, @code{'<'}, @code{'='}, @code{'>'}, @code{'@@'} 및 ‘@cite{”}'는 더는 이스케이프 되지 않습니다.

@end deffn

@geindex purge() (re 모듈)
@anchor{library/re re purge}@anchor{279b}
@deffn {함수} re.purge ()

정규식 캐시를 지웁니다.
@end deffn

@node Exceptions,,Functions,모듈 내용
@anchor{library/re exceptions}@anchor{279c}
@subsubsection Exceptions


@geindex PatternError
@anchor{library/re re PatternError}@anchor{546}
@deffn {예외} re.PatternError (msg, pattern=None, pos=None)

Exception raised when a string passed to one of the functions here is not a
valid regular expression (for example, it might contain unmatched parentheses)
or when some other error occurs during compilation or matching.  It is never an
error if a string contains no match for a pattern.  The @code{PatternError} instance has
the following additional attributes:

@geindex msg (re.PatternError의 속성)
@anchor{library/re re PatternError msg}@anchor{104a}
@deffn {속성} msg

포맷되지 않은 에러 메시지.
@end deffn

@geindex pattern (re.PatternError의 속성)
@anchor{library/re re PatternError pattern}@anchor{104b}
@deffn {속성} pattern

정규식 패턴.
@end deffn

@geindex pos (re.PatternError의 속성)
@anchor{library/re re PatternError pos}@anchor{104c}
@deffn {속성} pos

컴파일이 실패한 위치를 가리키는 `pattern'의 인덱스 (@code{None}일 수 있습니다).
@end deffn

@geindex lineno (re.PatternError의 속성)
@anchor{library/re re PatternError lineno}@anchor{104d}
@deffn {속성} lineno

`pos'에 해당하는 줄 (@code{None}일 수 있습니다).
@end deffn

@geindex colno (re.PatternError의 속성)
@anchor{library/re re PatternError colno}@anchor{104e}
@deffn {속성} colno

`pos'에 해당하는 열 (@code{None}일 수 있습니다).
@end deffn


버전 3.5에서 변경: 추가 어트리뷰트가 추가되었습니다.



버전 3.13에서 변경: @code{PatternError} was originally named @code{error}; the latter is kept as an alias for
backward compatibility.

@end deffn

@node 정규식 객체,일치 객체,모듈 내용,re — Regular expression operations
@anchor{library/re re-objects}@anchor{1186}@anchor{library/re regular-expression-objects}@anchor{279d}
@subsubsection 정규식 객체


@geindex Pattern (re 클래스)
@anchor{library/re re Pattern}@anchor{1b65}
@deffn {클래스} re.Pattern

Compiled regular expression object returned by @ref{dcd,,re.compile()}.


버전 3.9에서 변경: @ref{1b65,,re.Pattern} supports @code{[]} to indicate a Unicode (str) or bytes pattern.
See @ref{8c0,,제네릭 에일리어스 형}.

@end deffn

@geindex search() (re.Pattern 메서드)
@anchor{library/re re Pattern search}@anchor{2799}
@deffn {메서드} Pattern.search (string[, pos[, endpos]])

Scan through `string' looking for the first location where this regular
expression produces a match, and return a corresponding @ref{ec2,,Match}.
Return @code{None} if no position in the string matches the pattern; note that
this is different from finding a zero-length match at some point in the string.

선택적 두 번째 매개 변수 `pos'는 검색을 시작할 문자열의 인덱스를 제공합니다; 기본값은 @code{0}입니다. 이것은 문자열을 슬라이싱하는 것과 완전히 동등하지는 않습니다; @code{'^'} 패턴 문자는 문자열의 실제 시작 부분과 개행 직후의 위치에서 일치하지만, 검색을 시작할 색인에서 반드시 일치하지는 않습니다.

선택적 매개 변수 `endpos'는 문자열을 어디까지 검색할지를 제한합니다; 문자열이 `endpos' 문자 길이인 것처럼 취급되어, 일치를 찾기 위해 `pos'에서 @code{endpos - 1}까지의 문자만 검색됩니다. `endpos'가 `pos'보다 작으면 일치는 없습니다; 그렇지 않으면, `rx'가 컴파일된 정규식 객체일 때, @code{rx.search(string, 0, 50)}는 @code{rx.search(string[:50], 0)}와 동등합니다.

@example
>>> pattern = re.compile("d")
>>> pattern.search("dog")     # Match at index 0
<re.Match object; span=(0, 1), match='d'>
>>> pattern.search("dog", 1)  # No match; search doesn't include the "d"
@end example
@end deffn

@geindex match() (re.Pattern 메서드)
@anchor{library/re re Pattern match}@anchor{2798}
@deffn {메서드} Pattern.match (string[, pos[, endpos]])

If zero or more characters at the `beginning' of `string' match this regular
expression, return a corresponding @ref{ec2,,Match}. Return @code{None} if the
string does not match the pattern; note that this is different from a
zero-length match.

선택적 `pos'와 `endpos' 매개 변수는 @ref{2799,,search()} 메서드에서와 같은 의미입니다.

@example
>>> pattern = re.compile("o")
>>> pattern.match("dog")      # No match as "o" is not at the start of "dog".
>>> pattern.match("dog", 1)   # Match as "o" is the 2nd character of "dog".
<re.Match object; span=(1, 2), match='o'>
@end example

`string'의 임의 위치에서 일치를 찾으려면, 대신 @ref{2799,,search()}를 사용하십시오 (@ref{279a,,search() 대 match()}도 참조하십시오).
@end deffn

@geindex fullmatch() (re.Pattern 메서드)
@anchor{library/re re Pattern fullmatch}@anchor{1185}
@deffn {메서드} Pattern.fullmatch (string[, pos[, endpos]])

If the whole `string' matches this regular expression, return a corresponding
@ref{ec2,,Match}.  Return @code{None} if the string does not match the pattern;
note that this is different from a zero-length match.

선택적 `pos'와 `endpos' 매개 변수는 @ref{2799,,search()} 메서드에서와 같은 의미입니다.

@example
>>> pattern = re.compile("o[gh]")
>>> pattern.fullmatch("dog")      # No match as "o" is not at the start of "dog".
>>> pattern.fullmatch("ogre")     # No match as not the full string matches.
>>> pattern.fullmatch("doggie", 1, 3)   # Matches within given limits.
<re.Match object; span=(1, 3), match='og'>
@end example


Added in version 3.4.

@end deffn

@geindex split() (re.Pattern 메서드)
@anchor{library/re re Pattern split}@anchor{279e}
@deffn {메서드} Pattern.split (string, maxsplit=0)

@ref{5a1,,split()} 함수와 같은데, 컴파일된 패턴을 사용합니다.
@end deffn

@geindex findall() (re.Pattern 메서드)
@anchor{library/re re Pattern findall}@anchor{279f}
@deffn {메서드} Pattern.findall (string[, pos[, endpos]])

@ref{1229,,findall()} 함수와 유사한데, 컴파일된 패턴을 사용합니다. 하지만, @ref{1431,,search()}처럼 검색 영역을 제한하는 선택적 `pos'와 `endpos' 매개 변수도 받아들입니다.
@end deffn

@geindex finditer() (re.Pattern 메서드)
@anchor{library/re re Pattern finditer}@anchor{27a0}
@deffn {메서드} Pattern.finditer (string[, pos[, endpos]])

@ref{16ff,,finditer()} 함수와 유사한데, 컴파일된 패턴을 사용합니다. 하지만, @ref{1431,,search()}처럼 검색 영역을 제한하는 선택적 `pos'와 `endpos' 매개 변수도 받아들입니다.
@end deffn

@geindex sub() (re.Pattern 메서드)
@anchor{library/re re Pattern sub}@anchor{27a1}
@deffn {메서드} Pattern.sub (repl, string, count=0)

@ref{5a2,,sub()} 함수와 같은데, 컴파일된 패턴을 사용합니다.
@end deffn

@geindex subn() (re.Pattern 메서드)
@anchor{library/re re Pattern subn}@anchor{27a2}
@deffn {메서드} Pattern.subn (repl, string, count=0)

@ref{5a3,,subn()} 함수와 같은데, 컴파일된 패턴을 사용합니다.
@end deffn

@geindex flags (re.Pattern의 속성)
@anchor{library/re re Pattern flags}@anchor{27a3}
@deffn {속성} Pattern.flags

The regex matching flags.  This is a combination of the flags given to
@ref{dcd,,compile()}, any @code{(?...)} inline flags in the pattern, and implicit
flags such as @ref{d63,,UNICODE} if the pattern is a Unicode string.
@end deffn

@geindex groups (re.Pattern의 속성)
@anchor{library/re re Pattern groups}@anchor{27a4}
@deffn {속성} Pattern.groups

패턴에 있는 포착 그룹 수.
@end deffn

@geindex groupindex (re.Pattern의 속성)
@anchor{library/re re Pattern groupindex}@anchor{27a5}
@deffn {속성} Pattern.groupindex

@code{(?P<id>)}로 정의된 기호 그룹 이름을 그룹 번호에 매핑하는 딕셔너리. 패턴에 기호 그룹이 사용되지 않으면 딕셔너리는 비어 있습니다.
@end deffn

@geindex pattern (re.Pattern의 속성)
@anchor{library/re re Pattern pattern}@anchor{27a6}
@deffn {속성} Pattern.pattern

패턴 객체가 컴파일된 패턴 문자열.
@end deffn


버전 3.7에서 변경: @ref{756,,copy.copy()}와 @ref{d64,,copy.deepcopy()} 지원이 추가되었습니다. 컴파일된 정규식 객체는 원자적이라고 간주합니다.


@node 일치 객체,정규식 예제,정규식 객체,re — Regular expression operations
@anchor{library/re id3}@anchor{27a7}@anchor{library/re match-objects}@anchor{1187}
@subsubsection 일치 객체


일치 객체는 항상 불리언 값 @code{True}를 가집니다. @ref{2798,,match()}와 @ref{2799,,search()}는 일치가 없을 때 @code{None}을 반환하기 때문에, 간단한 @code{if} 문으로 일치가 있는지 검사할 수 있습니다:

@example
match = re.search(pattern, string)
if match:
    process(match)
@end example

@geindex Match (re 클래스)
@anchor{library/re re Match}@anchor{ec2}
@deffn {클래스} re.Match

Match object returned by successful @code{match}es and @code{search}es.


버전 3.9에서 변경: @ref{ec2,,re.Match} supports @code{[]} to indicate a Unicode (str) or bytes match.
See @ref{8c0,,제네릭 에일리어스 형}.

@end deffn

@geindex expand() (re.Match 메서드)
@anchor{library/re re Match expand}@anchor{27a8}
@deffn {메서드} Match.expand (template)

Return the string obtained by doing backslash substitution on the template
string `template', as done by the @ref{27a1,,sub()} method.
Escapes such as @code{\n} are converted to the appropriate characters,
and numeric backreferences (@code{\1}, @code{\2}) and named backreferences
(@code{\g<1>}, @code{\g<name>}) are replaced by the contents of the
corresponding group. The backreference @code{\g<0>} will be
replaced by the entire match.


버전 3.5에서 변경: 일치하지 않는 그룹은 빈 문자열로 치환됩니다.

@end deffn

@geindex group() (re.Match 메서드)
@anchor{library/re re Match group}@anchor{122a}
@deffn {메서드} Match.group ([group1, ...])

Returns one or more subgroups of the match.  If there is a single argument, the
result is a single string; if there are multiple arguments, the result is a
tuple with one item per argument. Without arguments, `group1' defaults to zero
(the whole match is returned). If a `groupN' argument is zero, the corresponding
return value is the entire matching string; if it is a positive integer, it is
the string matching the corresponding parenthesized group.  If a group number is
negative or larger than the number of groups defined in the pattern, an
@ref{173a,,IndexError} exception is raised. If a group is contained in a
part of the pattern that did not match, the corresponding result is @code{None}.
If a group is contained in a part of the pattern that matched multiple times,
the last match is returned.

@example
>>> m = re.match(r"(\w+) (\w+)", "Isaac Newton, physicist")
>>> m.group(0)       # The entire match
'Isaac Newton'
>>> m.group(1)       # The first parenthesized subgroup.
'Isaac'
>>> m.group(2)       # The second parenthesized subgroup.
'Newton'
>>> m.group(1, 2)    # Multiple arguments give us a tuple.
('Isaac', 'Newton')
@end example

정규식이 @code{(?P<name>...)} 문법을 사용하면, `groupN' 인자는 그룹 이름으로 그룹을 식별하는 문자열일 수도 있습니다. 문자열 인자가 패턴의 그룹 이름으로 사용되지 않으면, @ref{173a,,IndexError} 예외가 발생합니다.

적당히 복잡한 예:

@example
>>> m = re.match(r"(?P<first_name>\w+) (?P<last_name>\w+)", "Malcolm Reynolds")
>>> m.group('first_name')
'Malcolm'
>>> m.group('last_name')
'Reynolds'
@end example

이름있는 그룹은 인덱스로 참조할 수도 있습니다:

@example
>>> m.group(1)
'Malcolm'
>>> m.group(2)
'Reynolds'
@end example

그룹이 여러 번 일치하면, 마지막 일치만 액세스 할 수 있습니다:

@example
>>> m = re.match(r"(..)+", "a1b2c3")  # Matches 3 times.
>>> m.group(1)                        # Returns only the last match.
'c3'
@end example
@end deffn

@geindex __getitem__() (re.Match 메서드)
@anchor{library/re re Match __getitem__}@anchor{27a9}
@deffn {메서드} Match.__getitem__ (g)

이것은 @code{m.group(g)}와 같습니다. 일치에서 개별 그룹에 더 쉽게 액세스 할 수 있게 합니다:

@example
>>> m = re.match(r"(\w+) (\w+)", "Isaac Newton, physicist")
>>> m[0]       # The entire match
'Isaac Newton'
>>> m[1]       # The first parenthesized subgroup.
'Isaac'
>>> m[2]       # The second parenthesized subgroup.
'Newton'
@end example

Named groups are supported as well:

@example
>>> m = re.match(r"(?P<first_name>\w+) (?P<last_name>\w+)", "Isaac Newton")
>>> m['first_name']
'Isaac'
>>> m['last_name']
'Newton'
@end example


Added in version 3.6.

@end deffn

@geindex groups() (re.Match 메서드)
@anchor{library/re re Match groups}@anchor{122b}
@deffn {메서드} Match.groups (default=None)

1에서 패턴에 있는 그룹의 수까지, 일치의 모든 서브 그룹을 포함하는 튜플을 반환합니다. `default' 인자는 일치에 참여하지 않은 그룹에 사용됩니다; 기본값은 @code{None}입니다.

예를 들면:

@example
>>> m = re.match(r"(\d+)\.(\d+)", "24.1632")
>>> m.groups()
('24', '1632')
@end example

우리가 소수점과 그 이후의 모든 것을 선택적으로 만들면, 모든 그룹이 일치에 참여하지 않을 수 있습니다. 이 그룹은 `default' 인자가 주어지지 않는 한 기본값 @code{None}이 됩니다:

@example
>>> m = re.match(r"(\d+)\.?(\d+)?", "24")
>>> m.groups()      # Second group defaults to None.
('24', None)
>>> m.groups('0')   # Now, the second group defaults to '0'.
('24', '0')
@end example
@end deffn

@geindex groupdict() (re.Match 메서드)
@anchor{library/re re Match groupdict}@anchor{27aa}
@deffn {메서드} Match.groupdict (default=None)

일치의 모든 `이름 있는' 서브 그룹을 포함하고, 서브 그룹의 이름을 키로 사용하는 딕셔너리를 반환합니다. `default' 인자는 일치에 참여하지 않은 그룹에 사용됩니다; 기본값은 @code{None}입니다. 예를 들면:

@example
>>> m = re.match(r"(?P<first_name>\w+) (?P<last_name>\w+)", "Malcolm Reynolds")
>>> m.groupdict()
@{'first_name': 'Malcolm', 'last_name': 'Reynolds'@}
@end example
@end deffn

@geindex start() (re.Match 메서드)
@geindex end() (re.Match 메서드)
@anchor{library/re re Match start}@anchor{27ab}
@deffn {메서드} Match.start ([group])
@anchor{library/re re Match end}@anchor{27ac}
@deffnx {메서드} Match.end ([group])

`group'과 일치하는 부분 문자열의 시작과 끝 인덱스를 반환합니다; `group'의 기본값은 0입니다 (전체 일치 문자열을 뜻합니다). `group'이 있지만, 일치에 기여하지 않으면, @code{-1}을 반환합니다. 일치 객체 `m'과 일치에 기여한 그룹 `g'에서, 그룹 `g'와 일치하는 부분 문자열(@code{m.group(g)}와 동등합니다)은 다음과 같습니다

@example
m.string[m.start(g):m.end(g)]
@end example

`group'이 널 문자열과 일치하면 @code{m.start(group)}은 @code{m.end(group)}와 같음에 유의하십시오. 예를 들어, @code{m = re.search('b(c?)', 'cba')} 이후에, @code{m.start(0)}은 1이고, @code{m.end(0)}은 2이며, @code{m.start(1)}과 @code{m.end(1)}은 모두 2이고, @code{m.start(2)}는 @ref{173a,,IndexError} 예외를 발생시킵니다.

전자 메일 주소에서 `remove_this'를 제거하는 예:

@example
>>> email = "tony@@tiremove_thisger.net"
>>> m = re.search("remove_this", email)
>>> email[:m.start()] + email[m.end():]
'tony@@tiger.net'
@end example
@end deffn

@geindex span() (re.Match 메서드)
@anchor{library/re re Match span}@anchor{27ad}
@deffn {메서드} Match.span ([group])

일치가 `m'일 때, 2-튜플 @code{(m.start(group), m.end(group))}를 반환합니다. `group'이 일치에 기여하지 않으면, 이것은 @code{(-1, -1)}임에 유의하십시오. `group'의 기본값은 0으로, 전체 일치입니다.
@end deffn

@geindex pos (re.Match의 속성)
@anchor{library/re re Match pos}@anchor{27ae}
@deffn {속성} Match.pos

@ref{1186,,정규식 객체}의 @ref{2799,,search()}나 @ref{2798,,match()} 메서드에 전달된 `pos' 값. 이것은 RE 엔진이 일치를 찾기 시작한 string에 대한 인덱스입니다.
@end deffn

@geindex endpos (re.Match의 속성)
@anchor{library/re re Match endpos}@anchor{27af}
@deffn {속성} Match.endpos

@ref{1186,,정규식 객체}의 @ref{2799,,search()}나 @ref{2798,,match()} 메서드에 전달된 `endpos' 값. 이것은 RE 엔진이 넘어가지 않을 string에 대한 인덱스입니다.
@end deffn

@geindex lastindex (re.Match의 속성)
@anchor{library/re re Match lastindex}@anchor{27b0}
@deffn {속성} Match.lastindex

마지막으로 일치하는 포착 그룹의 정수 인덱스, 또는 그룹이 전혀 일치하지 않으면 @code{None}. 예를 들어, 정규식 @code{(a)b}, @code{((a)(b))} 및 @code{((ab))}는 문자열 @code{'ab'}에 적용될 경우 @code{lastindex == 1}이 되지만, @code{(a)(b)} 정규식은 같은 문자열에 적용될 때 @code{lastindex == 2}가 됩니다.
@end deffn

@geindex lastgroup (re.Match의 속성)
@anchor{library/re re Match lastgroup}@anchor{27b1}
@deffn {속성} Match.lastgroup

마지막으로 일치하는 포착 그룹의 이름, 또는 그룹에 이름이 없거나, 그룹이 전혀 일치하지 않으면 @code{None}.
@end deffn

@geindex re (re.Match의 속성)
@anchor{library/re re Match re}@anchor{27b2}
@deffn {속성} Match.re

@ref{2798,,match()}나 @ref{2799,,search()} 메서드가 이 일치 인스턴스를 생성한 @ref{1186,,정규식 객체}.
@end deffn

@geindex string (re.Match의 속성)
@anchor{library/re re Match string}@anchor{27b3}
@deffn {속성} Match.string

@ref{2798,,match()}나 @ref{2799,,search()}에 전달된 문자열.
@end deffn


버전 3.7에서 변경: @ref{756,,copy.copy()}와 @ref{d64,,copy.deepcopy()} 지원이 추가되었습니다. 일치 객체는 원자적이라고 간주합니다.


@node 정규식 예제,,일치 객체,re — Regular expression operations
@anchor{library/re re-examples}@anchor{1462}@anchor{library/re regular-expression-examples}@anchor{27b4}
@subsubsection 정규식 예제


@menu
* 쌍 검사하기:: 
* scanf() 시뮬레이션: scanf 시뮬레이션. 
* search() 대 match(): search 대 match. 
* 전화번호부 만들기:: 
* 텍스트 뒤섞기:: 
* 모든 부사 찾기:: 
* 모든 부사와 그 위치 찾기:: 
* 날 문자열 표기법:: 
* 토크나이저 작성하기:: 

@end menu

@node 쌍 검사하기,scanf 시뮬레이션,,정규식 예제
@anchor{library/re checking-for-a-pair}@anchor{27b5}
@subsubsection 쌍 검사하기


이 예제에서는, 다음과 같은 도우미 함수를 사용하여 좀 더 세련되게 일치 객체를 표시합니다:

@example
def displaymatch(match):
    if match is None:
        return None
    return '<Match: %r, groups=%r>' % (match.group(), match.groups())
@end example

플레이어의 패를 5문자 문자열로 나타내는 포커 프로그램을 작성하고 있다고 가정해봅시다. “a”는 에이스, “k”는 킹, “q”는 퀸, “j”는 잭, “t”는 10, “2”에서 “9”는 그 값의 카드를 나타냅니다.

주어진 문자열이 유효한 패인지 보려면, 다음과 같이 할 수 있습니다:

@example
>>> valid = re.compile(r"^[a2-9tjqk]@{5@}$")
>>> displaymatch(valid.match("akt5q"))  # Valid.
"<Match: 'akt5q', groups=()>"
>>> displaymatch(valid.match("akt5e"))  # Invalid.
>>> displaymatch(valid.match("akt"))    # Invalid.
>>> displaymatch(valid.match("727ak"))  # Valid.
"<Match: '727ak', groups=()>"
@end example

마지막 패 @code{"727ak"}는 페어, 즉 같은 값의 카드 두 장을 포함합니다. 이것을 정규식과 일치시키려면, 역참조를 다음과 같이 사용할 수 있습니다:

@example
>>> pair = re.compile(r".*(.).*\1")
>>> displaymatch(pair.match("717ak"))     # Pair of 7s.
"<Match: '717', groups=('7',)>"
>>> displaymatch(pair.match("718ak"))     # No pairs.
>>> displaymatch(pair.match("354aa"))     # Pair of aces.
"<Match: '354aa', groups=('a',)>"
@end example

페어가 어떤 카드로 구성되어 있는지 알아내려면, 다음과 같이 일치 객체의 @ref{122a,,group()} 메서드를 사용할 수 있습니다:

@example
>>> pair = re.compile(r".*(.).*\1")
>>> pair.match("717ak").group(1)
'7'

# Error because re.match() returns None, which doesn't have a group() method:
>>> pair.match("718ak").group(1)
Traceback (most recent call last):
  File "<pyshell#23>", line 1, in <module>
    re.match(r".*(.).*\1", "718ak").group(1)
AttributeError: 'NoneType' object has no attribute 'group'

>>> pair.match("354aa").group(1)
'a'
@end example

@node scanf 시뮬레이션,search 대 match,쌍 검사하기,정규식 예제
@anchor{library/re simulating-scanf}@anchor{27b6}
@subsubsection scanf() 시뮬레이션


@geindex scanf (C function)

Python does not currently have an equivalent to @code{scanf()}.  Regular
expressions are generally more powerful, though also more verbose, than
@code{scanf()} format strings.  The table below offers some more-or-less
equivalent mappings between @code{scanf()} format tokens and regular
expressions.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

@code{scanf()} Token

@tab

정규식

@item

@code{%c}

@tab

@code{.}

@item

@code{%5c}

@tab

@code{.@{5@}}

@item

@code{%d}

@tab

@code{[-+]?\d+}

@item

@code{%e}, @code{%E}, @code{%f}, @code{%g}

@tab

@code{[-+]?(\d+(\.\d*)?|\.\d+)([eE][-+]?\d+)?}

@item

@code{%i}

@tab

@code{[-+]?(0[xX][\dA-Fa-f]+|0[0-7]*|\d+)}

@item

@code{%o}

@tab

@code{[-+]?[0-7]+}

@item

@code{%s}

@tab

@code{\S+}

@item

@code{%u}

@tab

@code{\d+}

@item

@code{%x}, @code{%X}

@tab

@code{[-+]?(0[xX])?[\dA-Fa-f]+}

@end multitable


다음과 같은 문자열에서 파일명과 숫자를 추출하려면

@example
/usr/sbin/sendmail - 0 errors, 4 warnings
@end example

you would use a @code{scanf()} format like

@example
%s - %d errors, %d warnings
@end example

동등한 정규식은 다음과 같습니다

@example
(\S+) - (\d+) errors, (\d+) warnings
@end example

@node search 대 match,전화번호부 만들기,scanf 시뮬레이션,정규식 예제
@anchor{library/re id4}@anchor{27b7}@anchor{library/re search-vs-match}@anchor{279a}
@subsubsection search() 대 match()


Python offers different primitive operations based on regular expressions:


@itemize +

@item 
@ref{1432,,re.match()} checks for a match only at the beginning of the string

@item 
@ref{1431,,re.search()} checks for a match anywhere in the string
(this is what Perl does by default)

@item 
@ref{1184,,re.fullmatch()} checks for entire string to be a match
@end itemize

예를 들면:

@example
>>> re.match("c", "abcdef")    # No match
>>> re.search("c", "abcdef")   # Match
<re.Match object; span=(2, 3), match='c'>
>>> re.fullmatch("p.*n", "python") # Match
<re.Match object; span=(0, 6), match='python'>
>>> re.fullmatch("r.*n", "python") # No match
@end example

@code{'^'}로 시작하는 정규식은 @ref{1431,,search()}와 함께 사용하여 문자열 시작 부분의 일치로 제한 할 수 있습니다:

@example
>>> re.match("c", "abcdef")    # No match
>>> re.search("^c", "abcdef")  # No match
>>> re.search("^a", "abcdef")  # Match
<re.Match object; span=(0, 1), match='a'>
@end example

그러나 @ref{2788,,MULTILINE} 모드에서 @ref{1432,,match()}는 문자열 시작 부분에서만 일치하지만, @code{'^'}로 시작하는 정규식을 @ref{1431,,search()}에 사용하면 각 줄의 시작 부분에서 일치합니다.

@example
>>> re.match("X", "A\nB\nX", re.MULTILINE)  # No match
>>> re.search("^X", "A\nB\nX", re.MULTILINE)  # Match
<re.Match object; span=(4, 5), match='X'>
@end example

@node 전화번호부 만들기,텍스트 뒤섞기,search 대 match,정규식 예제
@anchor{library/re making-a-phonebook}@anchor{27b8}
@subsubsection 전화번호부 만들기


@ref{5a1,,split()}는 문자열을, 전달된 패턴으로 구분된 리스트로 분할합니다. 이 메서드는 전화번호부를 만드는 다음 예제에서 보이듯이 텍스트 데이터를 파이썬에서 쉽게 읽고 수정할 수 있는 데이터 구조로 변환하는 데 매우 중요합니다.

먼저, 여기 입력이 있습니다. 보통 파일에서 올 수 있습니다만, 여기서는 삼중 따옴표로 묶인 문자열 문법을 사용합니다.

@example
>>> text = """Ross McFluff: 834.345.1254 155 Elm Street
...
... Ronald Heathmore: 892.345.3428 436 Finley Avenue
... Frank Burger: 925.541.7625 662 South Dogwood Way
...
...
... Heather Albrecht: 548.326.4584 919 Park Place"""
@end example

항목은 하나 이상의 개행으로 구분됩니다. 이제 비어있지 않은 각 줄이 항목이 되도록 문자열을 리스트로 변환합니다:

@example
>>> entries = re.split("\n+", text)
>>> entries
['Ross McFluff: 834.345.1254 155 Elm Street',
'Ronald Heathmore: 892.345.3428 436 Finley Avenue',
'Frank Burger: 925.541.7625 662 South Dogwood Way',
'Heather Albrecht: 548.326.4584 919 Park Place']
@end example

마지막으로, 각 항목을 이름, 성, 전화번호 및 주소로 구성된 리스트로 분할합니다. 주소에 우리의 분할 패턴인 스페이스가 들어있기 때문에, @ref{5a1,,split()}의 @code{maxsplit} 매개 변수를 사용합니다:

@example
>>> [re.split(":? ", entry, maxsplit=3) for entry in entries]
[['Ross', 'McFluff', '834.345.1254', '155 Elm Street'],
['Ronald', 'Heathmore', '892.345.3428', '436 Finley Avenue'],
['Frank', 'Burger', '925.541.7625', '662 South Dogwood Way'],
['Heather', 'Albrecht', '548.326.4584', '919 Park Place']]
@end example

@code{:?} 패턴은 결과 리스트에 나타나지 않도록, 성 뒤의 콜론과 일치합니다. @code{maxsplit}로 @code{4}를 사용하면, 번지수를 거리 이름과 분리 할 수 있습니다:

@example
>>> [re.split(":? ", entry, maxsplit=4) for entry in entries]
[['Ross', 'McFluff', '834.345.1254', '155', 'Elm Street'],
['Ronald', 'Heathmore', '892.345.3428', '436', 'Finley Avenue'],
['Frank', 'Burger', '925.541.7625', '662', 'South Dogwood Way'],
['Heather', 'Albrecht', '548.326.4584', '919', 'Park Place']]
@end example

@node 텍스트 뒤섞기,모든 부사 찾기,전화번호부 만들기,정규식 예제
@anchor{library/re text-munging}@anchor{27b9}
@subsubsection 텍스트 뒤섞기


@ref{5a2,,sub()}는 패턴의 모든 일치를 문자열이나 함수의 결과로 치환합니다. 이 예제는 @code{sub()}에 텍스트를 “뒤섞는”, 즉 문장의 각 단어에서 첫 번째 문자와 마지막 문자를 제외한 모든 문자의 순서를 무작위로 바꾸는 함수를 사용하는 방법을 보여줍니다:

@example
>>> def repl(m):
...     inner_word = list(m.group(2))
...     random.shuffle(inner_word)
...     return m.group(1) + "".join(inner_word) + m.group(3)
...
>>> text = "Professor Abdolmalek, please report your absences promptly."
>>> re.sub(r"(\w)(\w+)(\w)", repl, text)
'Poefsrosr Aealmlobdk, pslaee reorpt your abnseces plmrptoy.'
>>> re.sub(r"(\w)(\w+)(\w)", repl, text)
'Pofsroser Aodlambelk, plasee reoprt yuor asnebces potlmrpy.'
@end example

@node 모든 부사 찾기,모든 부사와 그 위치 찾기,텍스트 뒤섞기,정규식 예제
@anchor{library/re finding-all-adverbs}@anchor{27ba}
@subsubsection 모든 부사 찾기


@ref{1229,,findall()}은 @ref{1431,,search()}처럼 첫 번째 등장뿐만 아니라, 패턴의 `모든' 등장과 일치합니다. 예를 들어, 작가가 어떤 텍스트에서 부사를 모두 찾고 싶으면, 다음과 같은 방식으로 @code{findall()}을 사용할 수 있습니다:

@example
>>> text = "He was carefully disguised but captured quickly by police."
>>> re.findall(r"\w+ly\b", text)
['carefully', 'quickly']
@end example

@node 모든 부사와 그 위치 찾기,날 문자열 표기법,모든 부사 찾기,정규식 예제
@anchor{library/re finding-all-adverbs-and-their-positions}@anchor{27bb}
@subsubsection 모든 부사와 그 위치 찾기


If one wants more information about all matches of a pattern than the matched
text, @ref{16ff,,finditer()} is useful as it provides @ref{ec2,,Match} objects
instead of strings.  Continuing with the previous example, if a writer wanted
to find all of the adverbs `and their positions' in some text, they would use
@code{finditer()} in the following manner:

@example
>>> text = "He was carefully disguised but captured quickly by police."
>>> for m in re.finditer(r"\w+ly\b", text):
...     print('%02d-%02d: %s' % (m.start(), m.end(), m.group(0)))
07-16: carefully
40-47: quickly
@end example

@node 날 문자열 표기법,토크나이저 작성하기,모든 부사와 그 위치 찾기,정규식 예제
@anchor{library/re raw-string-notation}@anchor{27bc}
@subsubsection 날 문자열 표기법


날 문자열 표기법(@code{r"text"})은 정규식을 합리적인 상태로 유지합니다. 이것 없이는, 정규식의 모든 역 슬래시(@code{'\'})를 이스케이프 하기 위해 그 앞에 또 하나의 역 슬래시를 붙여야 합니다. 예를 들어, 다음 두 코드 줄은 기능상으로 같습니다:

@example
>>> re.match(r"\W(.)\1\W", " ff ")
<re.Match object; span=(0, 4), match=' ff '>
>>> re.match("\\W(.)\\1\\W", " ff ")
<re.Match object; span=(0, 4), match=' ff '>
@end example

리터럴 역 슬래시와 일치시키려면, 정규식에서 이스케이프 되어야 합니다. 날 문자열 표기법을 사용하면, @code{r"\\"}이 됩니다. 날 문자열 표기법을 사용하지 않으면, @code{"\\\\"}를 사용해야 하는데, 다음 코드 줄들은 기능적으로 같습니다:

@example
>>> re.match(r"\\", r"\\")
<re.Match object; span=(0, 1), match='\\'>
>>> re.match("\\\\", r"\\")
<re.Match object; span=(0, 1), match='\\'>
@end example

@node 토크나이저 작성하기,,날 문자열 표기법,정규식 예제
@anchor{library/re writing-a-tokenizer}@anchor{27bd}
@subsubsection 토크나이저 작성하기


토크나이저나 스캐너@footnote{https://en.wikipedia.org/wiki/Lexical_analysis}는 문자열을 분석하여 문자 그룹을 분류합니다. 이것은 컴파일러나 인터프리터를 작성하는 데 유용한 첫 번째 단계입니다.

텍스트 범주는 정규식으로 지정됩니다. 이 기법은 이들을 하나의 마스터 정규식으로 결합하고 연속적인 일치를 반복하는 것입니다:

@example
from typing import NamedTuple
import re

class Token(NamedTuple):
    type: str
    value: str
    line: int
    column: int

def tokenize(code):
    keywords = @{'IF', 'THEN', 'ENDIF', 'FOR', 'NEXT', 'GOSUB', 'RETURN'@}
    token_specification = [
        ('NUMBER',   r'\d+(\.\d*)?'),  # Integer or decimal number
        ('ASSIGN',   r':='),           # Assignment operator
        ('END',      r';'),            # Statement terminator
        ('ID',       r'[A-Za-z]+'),    # Identifiers
        ('OP',       r'[+\-*/]'),      # Arithmetic operators
        ('NEWLINE',  r'\n'),           # Line endings
        ('SKIP',     r'[ \t]+'),       # Skip over spaces and tabs
        ('MISMATCH', r'.'),            # Any other character
    ]
    tok_regex = '|'.join('(?P<%s>%s)' % pair for pair in token_specification)
    line_num = 1
    line_start = 0
    for mo in re.finditer(tok_regex, code):
        kind = mo.lastgroup
        value = mo.group()
        column = mo.start() - line_start
        if kind == 'NUMBER':
            value = float(value) if '.' in value else int(value)
        elif kind == 'ID' and value in keywords:
            kind = value
        elif kind == 'NEWLINE':
            line_start = mo.end()
            line_num += 1
            continue
        elif kind == 'SKIP':
            continue
        elif kind == 'MISMATCH':
            raise RuntimeError(f'@{value!r@} unexpected on line @{line_num@}')
        yield Token(kind, value, line_num, column)

statements = '@w{'}'
    IF quantity THEN
        total := total + price * quantity;
        tax := price * 0.05;
    ENDIF;
'@w{'}'

for token in tokenize(statements):
    print(token)
@end example

토크나이저는 다음과 같은 출력을 생성합니다:

@example
Token(type='IF', value='IF', line=2, column=4)
Token(type='ID', value='quantity', line=2, column=7)
Token(type='THEN', value='THEN', line=2, column=16)
Token(type='ID', value='total', line=3, column=8)
Token(type='ASSIGN', value=':=', line=3, column=14)
Token(type='ID', value='total', line=3, column=17)
Token(type='OP', value='+', line=3, column=23)
Token(type='ID', value='price', line=3, column=25)
Token(type='OP', value='*', line=3, column=31)
Token(type='ID', value='quantity', line=3, column=33)
Token(type='END', value=';', line=3, column=41)
Token(type='ID', value='tax', line=4, column=8)
Token(type='ASSIGN', value=':=', line=4, column=12)
Token(type='ID', value='price', line=4, column=15)
Token(type='OP', value='*', line=4, column=21)
Token(type='NUMBER', value=0.05, line=4, column=23)
Token(type='END', value=';', line=4, column=27)
Token(type='ENDIF', value='ENDIF', line=5, column=4)
Token(type='END', value=';', line=5, column=9)
@end example

@anchor{library/re frie09}@anchor{2785}@w{(Frie09)} 
Friedl, Jeffrey. Mastering Regular Expressions. 3rd ed., O’Reilly Media, 2009. 이 책의 세 번째 판은 더는 파이썬을 다루지 않지만, 초판은 훌륭한 정규식 패턴 작성을 아주 자세하게 다루었습니다.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node difflib — 델타 계산을 위한 도우미,textwrap — 텍스트 래핑과 채우기,re — Regular expression operations,텍스트 처리 서비스
@anchor{library/difflib doc}@anchor{27be}@anchor{library/difflib difflib-helpers-for-computing-deltas}@anchor{27bf}@anchor{library/difflib module-difflib}@anchor{3b}@anchor{library/difflib translation-repo}@anchor{27c0}
@subsection @code{difflib} — 델타 계산을 위한 도우미


@geindex module; difflib

@c Markup by Fred L. Drake, Jr. <fdrake@acm.org>

`소스 코드:' Lib/difflib.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/difflib.py}

@c import sys
@c from difflib import *


__________________________________________________________________


이 모듈은 시퀀스 비교를 위한 클래스와 함수를 제공합니다. 예를 들어 파일을 비교하는 데 사용할 수 있으며, HTML 및 문맥(context)과 통합(unified) diff를 비롯한 다양한 형식의 파일 차이에 관한 정보를 생성할 수 있습니다. 디렉터리와 파일을 비교하려면, @ref{5e,,filecmp} 모듈을 참조하십시오.


@deffn {클래스} difflib.SequenceMatcher

이것은 시퀀스 요소가 @ref{823,,해시 가능}이기만 하다면, 모든 형의 시퀀스 쌍을 비교할 수 있는 유연한 클래스입니다. 기본 알고리즘은 1980년대 후반에 Ratcliff와 Obershelp가 ‘게슈탈트 패턴 매칭(gestalt pattern matching)’이라는 과장된 이름으로 발표한 알고리즘까지 거슬러 올라가는데, 그보다는 약간 더 공을 들였습니다. 아이디어는 “정크” 요소가 없는 가장 긴 연속적으로 일치하는 서브 시퀀스를 찾는 것입니다; 이러한 “정크” 요소는 빈 줄이나 공백과 같은 어떤 의미에서는 흥미롭지 않은 요소들입니다. (정크 처리는 Ratcliff와 Obershelp 알고리즘의 확장입니다.) 그런 다음 같은 아이디어를 일치하는 서브 시퀀스의 왼쪽과 오른쪽에 있는 시퀀스 조각에 재귀적으로 적용합니다. 이것이 최소 편집 시퀀스를 산출하지는 않지만, 사람들에게 “그럴듯해 보이는” 일치를 산출하는 경향이 있습니다.

`타이밍:' 기본 Ratcliff-Obershelp 알고리즘은 최악의 상황(worst case)에 세제곱 시간이고, 평균적으로(expected case) 제곱 시간입니다. @ref{1218,,SequenceMatcher}는 최악의 상황에 제곱 시간이며, 평균적인 동작은 시퀀스에 공통으로 포함된 요소의 수에 따라 복잡한 방식으로 달라집니다; 최상의 경우(best cast)는 선형 시간입니다.

`자동 정크 휴리스틱:' @ref{1218,,SequenceMatcher}는 특정 시퀀스 항목을 자동으로 정크로 처리하는 경험적 방법을 지원합니다. 경험적 방법은 개별 항목이 시퀀스에 나타나는 횟수를 계산합니다. (첫 번째 항목 이후의) 중복된 항목이 시퀀스의 1% 이상을 차지하고 시퀀스의 길이가 최소 200항목 이상이면, 이 항목은 “흔한” 것으로 표시되고 시퀀스 일치를 위해 정크로 처리됩니다. 이 경험적 방법은 @code{SequenceMatcher}를 만들 때 @code{autojunk} 인자를 @code{False}로 설정하여 끌 수 있습니다.


버전 3.2에서 변경: `autojunk' 매개 변수를 추가했습니다.

@end deffn

@geindex Differ (difflib 클래스)
@anchor{library/difflib difflib Differ}@anchor{27c1}
@deffn {클래스} difflib.Differ

이것은 텍스트 줄의 시퀀스를 비교하고, 사람이 읽을 수 있는 차이 또는 델타를 생성하는 클래스입니다. Differ는 줄의 시퀀스를 비교하고, 유사한 (거의 일치하는) 줄 내의 문자 시퀀스를 비교하는데 @ref{1218,,SequenceMatcher}를 사용합니다.

@ref{27c1,,Differ} 델타의 각 줄은 2자 코드로 시작합니다:


@multitable {xxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

코드

@tab

뜻

@item

@code{'- '}

@tab

시퀀스 1에만 있는 줄

@item

@code{'+ '}

@tab

시퀀스 2에만 있는 줄

@item

@code{'  '}

@tab

두 시퀀스에 공통인 줄

@item

@code{'? '}

@tab

두 입력 시퀀스에 없는 줄

@end multitable


‘@code{?}'로 시작하는 줄은, 시선을 줄 내의 차이로 유도하려고 시도하며, 두 입력 시퀀스 어디에도 나타나지 않습니다. 이 줄은 시퀀스에 스페이스, 탭 또는 줄 넘김과 같은 공백 문자가 포함되면 혼동을 줄 수 있습니다.
@end deffn

@geindex HtmlDiff (difflib 클래스)
@anchor{library/difflib difflib HtmlDiff}@anchor{201}
@deffn {클래스} difflib.HtmlDiff

이 클래스는 HTML 표를 (또는 표를 포함하는 완전한 HTML 파일을) 만드는 데 사용할 수 있습니다. 이 HTML은 줄 간과 줄 내의 변경을 강조하면서, 텍스트를 나란히 줄 단위로 비교하여 보여줍니다. 표는 전체 또는 문맥 차이 모드로 생성될 수 있습니다.

이 클래스의 생성자는 다음과 같습니다:

@geindex __init__() (difflib.HtmlDiff 메서드)
@anchor{library/difflib difflib HtmlDiff __init__}@anchor{27c2}
@deffn {메서드} __init__ (tabsize=8, wrapcolumn=None, linejunk=None, charjunk=IS_CHARACTER_JUNK)

@ref{201,,HtmlDiff}의 인스턴스를 초기화합니다.

`tabsize'는 탭 간격을 지정하는 선택적 키워드 인자이며 기본값은 @code{8}입니다.

`wrapcolumn'는 줄이 자동 줄 넘김 되는 열 번호를 지정하는 선택적 키워드로, 줄을 자동 줄 넘김 하지 않는 @code{None}이 기본값입니다.

`linejunk' 와 `charjunk'는 @ref{27c3,,ndiff()}(@ref{201,,HtmlDiff}가 나란히 배치된 HTML 차이를 만드는 데 사용됩니다)로 전달되는 선택적 키워드 인자입니다. 인자 기본값과 설명은 @code{ndiff()} 설명서를 참조하십시오.
@end deffn

다음과 같은 메서드가 공개됩니다:

@geindex make_file() (difflib.HtmlDiff 메서드)
@anchor{library/difflib difflib HtmlDiff make_file}@anchor{fef}
@deffn {메서드} make_file (fromlines, tolines, fromdesc='@w{'}, todesc='@w{'}, context=False, numlines=5, *, charset='utf-8')

`fromlines' 와 `tolines'(문자열의 리스트)를 비교하고, 줄 간 및 줄 내부의 변경을 강조하면서, 줄 단위로 차이를 보여주는 표를 포함하는 완전한 HTML 파일을 문자열로 반환합니다.

`fromdesc' 와 `todesc'는 from/to 파일 열 헤더 문자열을 지정하는 선택적 키워드 인자입니다 (기본값은 모두 빈 문자열입니다).

`context' 와 `numlines'는 모두 선택적 키워드 인자입니다. 문맥 차이를 표시하려면 `context'를 @code{True}로 설정하십시오, 그렇지 않으면 기본값은 전체 파일을 표시하는 @code{False}입니다. `numlines'의 기본값은 @code{5}입니다. `context'가 @code{True} 일 때, `numlines'는 차이 하이라이트를 둘러싸는 문맥 줄의 수를 제어합니다. `context'가 @code{False}면 `numlines'는 “next” 하이퍼 링크를 사용할 때 차이 하이라이트 앞에 표시되는 줄 수를 제어합니다 (0으로 설정하면 “next” 하이퍼 링크가 다음 차이 하이라이트를 아무런 선행 문맥 줄 없이 브라우저의 맨 위에 놓도록 합니다).

@cartouche
@quotation 참고 
`fromdesc'와 `todesc'는 이스케이프 되지 않은 HTML로 해석되며 신뢰할 수 없는 소스로부터 입력을 받는 동안 적절히 이스케이프 되어야 합니다.
@end quotation
@end cartouche


버전 3.5에서 변경: `charset' 키워드 전용 인자가 추가되었습니다. HTML 문서의 기본 문자 집합이 @code{'ISO-8859-1'}에서 @code{'utf-8'}로 변경되었습니다.

@end deffn

@geindex make_table() (difflib.HtmlDiff 메서드)
@anchor{library/difflib difflib HtmlDiff make_table}@anchor{27c4}
@deffn {메서드} make_table (fromlines, tolines, fromdesc='@w{'}, todesc='@w{'}, context=False, numlines=5)

`fromlines' 와 `tolines'(문자열의 리스트)를 비교하고, 줄 간 및 줄 내부의 변경을 강조하면서, 줄 단위로 차이를 보여주는 완전한 HTML 표를 문자열로 반환합니다.

이 메서드의 인자는 @ref{fef,,make_file()} 메서드의 인자와 같습니다.
@end deffn
@end deffn

@geindex context_diff() (difflib 모듈)
@anchor{library/difflib difflib context_diff}@anchor{1987}
@deffn {함수} difflib.context_diff (a, b, fromfile='@w{'}, tofile='@w{'}, fromfiledate='@w{'}, tofiledate='@w{'}, n=3, lineterm='\n')

`a'와 `b'(문자열의 리스트)를 비교합니다; 델타(델타 줄을 생성하는 @ref{1260,,제너레이터})를 문맥 diff 형식으로 반환합니다.

문맥 diff는 단지 변경된 줄과 몇 줄의 문맥만을 더해서 표시하는 간결한 방법입니다. 변경 사항은 이전/이후 스타일로 표시됩니다. 문맥 줄의 수는 `n'에 의해 설정되며 기본값은 3입니다.

기본적으로, diff 제어 줄(@code{***}나 @code{---}가 포함된 것)은 끝에 줄 넘김을 붙여 만들어집니다. 이것은 @ref{27c5,,io.IOBase.readlines()}로 만들어진 입력이 @ref{1781,,io.IOBase.writelines()}와 함께 사용하기에 적합한 diff를 생성하도록 하는 데 유용합니다. 왜냐하면, 입력과 출력 모두 끝에 줄 넘김이 있기 때문입니다.

끝에 줄 넘김이 없는 입력이면, `lineterm' 인자를 @code{""}로 설정해서 출력에 일관되게 줄 넘김이 포함되지 않게 하십시오.

문맥 diff 형식에는 일반적으로 파일명과 수정 시간에 대한 헤더가 있습니다. 이들 중 일부 또는 전부는 `fromfile', `tofile', `fromfiledate' 및 `tofiledate'에 문자열을 사용하여 지정될 수 있습니다. 수정 시간은 일반적으로 ISO 8601 형식으로 표현됩니다. 지정하지 않으면, 문자열들의 기본값은 빈 문자열입니다.

@example
>>> import sys
>>> from difflib import *
>>> s1 = ['bacon\n', 'eggs\n', 'ham\n', 'guido\n']
>>> s2 = ['python\n', 'eggy\n', 'hamster\n', 'guido\n']
>>> sys.stdout.writelines(context_diff(s1, s2, fromfile='before.py',
...                        tofile='after.py'))
*** before.py
--- after.py
***************
*** 1,4 ****
! bacon
! eggs
! ham
  guido
--- 1,4 ----
! python
! eggy
! hamster
  guido
@end example

더욱 자세한 예제는 @ref{27c6,,difflib의 명령 줄 인터페이스}를 참조하십시오.
@end deffn

@geindex get_close_matches() (difflib 모듈)
@anchor{library/difflib difflib get_close_matches}@anchor{27c7}
@deffn {함수} difflib.get_close_matches (word, possibilities, n=3, cutoff=0.6)

최상의 “충분히 좋은” 일치의 리스트를 반환합니다. `word'는 근접 일치가 목표로 하는 시퀀스(일반적으로 문자열)며, `possibilities'는 `word'와 일치시킬 시퀀스의 리스트입니다 (일반적으로 문자열의 리스트).

선택적 인자 `n'(기본값 @code{3})은 반환할 근접 일치의 최대 개수입니다; `n'는 @code{0}보다 커야 합니다.

선택적 인자 `cutoff'(기본값 @code{0.6})는 [0, 1] 범위의 float입니다. `word'와의 유사성 점수가 이 값보다 적은 possibilities는 무시됩니다.

possibilities 중에서 가장 좋은 (최대 `n' 개의) 일치가 리스트로 반환되는데, 유사성 점수로 정렬되어 있고 가장 유사한 것이 먼저 나옵니다.

@example
>>> get_close_matches('appel', ['ape', 'apple', 'peach', 'puppy'])
['apple', 'ape']
>>> import keyword
>>> get_close_matches('wheel', keyword.kwlist)
['while']
>>> get_close_matches('pineapple', keyword.kwlist)
[]
>>> get_close_matches('accept', keyword.kwlist)
['except']
@end example
@end deffn

@geindex ndiff() (difflib 모듈)
@anchor{library/difflib difflib ndiff}@anchor{27c3}
@deffn {함수} difflib.ndiff (a, b, linejunk=None, charjunk=IS_CHARACTER_JUNK)

`a'와 `b'(문자열의 리스트)를 비교합니다; @ref{27c1,,Differ}-스타일 델타(델타 줄을 생성하는 @ref{1260,,제너레이터})를 반환합니다.

선택적 키워드 매개 변수 `linejunk' 와 `charjunk'는 필터링 함수(또는 @code{None})입니다:

`linejunk': A function that accepts a single string argument, and returns
true if the string is junk, or false if not. The default is @code{None}. There
is also a module-level function @ref{2d7,,IS_LINE_JUNK()}, which filters out lines
without visible characters, except for at most one hash character (@code{'#'})
– however the underlying @ref{1218,,SequenceMatcher} class does a dynamic
analysis of which lines are so frequent as to constitute noise, and this
usually works better than using this function.

`charjunk': 문자(길이 1의 문자열)를 받아들이고, 문자가 정크면 참을 반환하고, 그렇지 않으면 거짓을 반환하는 함수입니다. 기본값은 모듈 수준의 함수 @ref{27c8,,IS_CHARACTER_JUNK()}인데, 공백 문자(스페이스나 탭; 줄 넘김 문자를 포함하는 것은 좋은 생각이 아닙니다)를 걸러냅니다.

@example
>>> diff = ndiff('one\ntwo\nthree\n'.splitlines(keepends=True),
...              'ore\ntree\nemu\n'.splitlines(keepends=True))
>>> print('@w{'}.join(diff), end="")
- one
?  ^
+ ore
?  ^
- two
- three
?  -
+ tree
+ emu
@end example
@end deffn

@geindex restore() (difflib 모듈)
@anchor{library/difflib difflib restore}@anchor{27c9}
@deffn {함수} difflib.restore (sequence, which)

델타를 만든 두 시퀀스 중 하나를 반환합니다.

@ref{27ca,,Differ.compare()} 나 @ref{27c3,,ndiff()}로 만들어진 `sequence'가 주어지면, 파일 1이나 2(매개 변수 `which')에서 원래 제공되었던 줄을 추출하고, 줄 접두어를 제거합니다.

예:

@example
>>> diff = ndiff('one\ntwo\nthree\n'.splitlines(keepends=True),
...              'ore\ntree\nemu\n'.splitlines(keepends=True))
>>> diff = list(diff) # materialize the generated delta into a list
>>> print('@w{'}.join(restore(diff, 1)), end="")
one
two
three
>>> print('@w{'}.join(restore(diff, 2)), end="")
ore
tree
emu
@end example
@end deffn

@geindex unified_diff() (difflib 모듈)
@anchor{library/difflib difflib unified_diff}@anchor{1986}
@deffn {함수} difflib.unified_diff (a, b, fromfile='@w{'}, tofile='@w{'}, fromfiledate='@w{'}, tofiledate='@w{'}, n=3, lineterm='\n')

`a'와 `b'(문자열의 리스트)를 비교합니다; 델타(델타 줄을 생성하는 @ref{1260,,제너레이터})를 통합 diff 형식으로 반환합니다.

통합(unified) diff는 단지 변경된 줄과 몇 줄의 문맥만을 더해서 표시하는 간결한 방법입니다. 변경 사항은 (별도의 이전/이후 블록 대신) 인라인 스타일로 표시됩니다. 문맥 줄의 수는 `n'에 의해 설정되며 기본값은 3입니다.

기본적으로, diff 제어 줄(@code{---}, @code{+++} 또는 @code{@@@@}가 포함된 것)은 끝에 줄 넘김을 붙여 만들어집니다. 이것은 @ref{27c5,,io.IOBase.readlines()}로 만들어진 입력이 @ref{1781,,io.IOBase.writelines()}와 함께 사용하기에 적합한 diff를 생성하도록 하는 데 유용합니다. 왜냐하면, 입력과 출력 모두 끝에 줄 넘김이 있기 때문입니다.

끝에 줄 넘김이 없는 입력이면, `lineterm' 인자를 @code{""}로 설정해서 출력에 일관되게 줄 넘김이 포함되지 않게 하십시오.

통합(unified) diff 형식에는 일반적으로 파일명과 수정 시간에 대한 헤더가 있습니다. 이들 중 일부 또는 전부는 `fromfile', `tofile', `fromfiledate' 및 `tofiledate'에 문자열을 사용하여 지정될 수 있습니다. 수정 시간은 일반적으로 ISO 8601 형식으로 표현됩니다. 지정하지 않으면, 문자열들의 기본값은 빈 문자열입니다.

@example
>>> s1 = ['bacon\n', 'eggs\n', 'ham\n', 'guido\n']
>>> s2 = ['python\n', 'eggy\n', 'hamster\n', 'guido\n']
>>> sys.stdout.writelines(unified_diff(s1, s2, fromfile='before.py', tofile='after.py'))
--- before.py
+++ after.py
@@@@ -1,4 +1,4 @@@@
-bacon
-eggs
-ham
+python
+eggy
+hamster
 guido
@end example

더욱 자세한 예제는 @ref{27c6,,difflib의 명령 줄 인터페이스}를 참조하십시오.
@end deffn

@geindex diff_bytes() (difflib 모듈)
@anchor{library/difflib difflib diff_bytes}@anchor{ff0}
@deffn {함수} difflib.diff_bytes (dfunc, a, b, fromfile=b'@w{'}, tofile=b'@w{'}, fromfiledate=b'@w{'}, tofiledate=b'@w{'}, n=3, lineterm=b'\n')

`a'와 `b'(바이트열 객체의 리스트)를 `dfunc'를 사용하여 비교합니다; `dfunc'가 반환하는 형식으로 델타 줄(역시 바이트열)의 시퀀스를 산출합니다. `dfunc'는 콜러블이어야하며, 보통 @ref{1986,,unified_diff()} 나 @ref{1987,,context_diff()}입니다.

알 수 없거나 일관성 없는 인코딩의 데이터를 비교할 수 있게 합니다. `n'를 제외한 모든 입력은 바이트열 객체여야 합니다, str이 아닙니다. 모든 입력(`n' 제외)을 str로 무손실 변환하고, @code{dfunc(a, b, fromfile, tofile, fromfiledate, tofiledate, n, lineterm)}를 호출하는 방식으로 작동합니다. `dfunc'의 출력은 다시 바이트로 변환되므로, 여러분이 얻는 델타 줄은 `a'와 `b' 처럼 알 수 없고/일관성 없는 인코딩을 갖습니다.


Added in version 3.5.

@end deffn

@geindex IS_LINE_JUNK() (difflib 모듈)
@anchor{library/difflib difflib IS_LINE_JUNK}@anchor{2d7}
@deffn {함수} difflib.IS_LINE_JUNK (line)

무시할 수 있는 줄이면 @code{True}를 반환합니다. `line'이 빈 줄이거나 하나의 @code{'#'}를 포함하면, 줄 `line'은 무시할 수 있습니다, 그렇지 않으면 무시할 수 없습니다. 이전 버전의 @ref{27c3,,ndiff()}에서 매개 변수 `linejunk'의 기본값으로 사용되었습니다.
@end deffn

@geindex IS_CHARACTER_JUNK() (difflib 모듈)
@anchor{library/difflib difflib IS_CHARACTER_JUNK}@anchor{27c8}
@deffn {함수} difflib.IS_CHARACTER_JUNK (ch)

무시할 수 있는 문자면 @code{True}를 반환합니다. `ch'가 스페이스나 탭이면 문자 `ch'는 무시할 수 있습니다, 그렇지 않으면 무시할 수 없습니다. @ref{27c3,,ndiff()}에서 매개 변수 `charjunk'의 기본값으로 사용됩니다.
@end deffn


@subsubheading 더 보기



@table @asis

@item Pattern Matching: The Gestalt Approach@footnote{https://jacobfilipp.com/DrDobbs/articles/DDJ/1988/8807/8807c/8807c.htm}

Discussion of a similar algorithm by John W. Ratcliff and D. E. Metzener. This
was published in Dr. Dobb’s Journal in July, 1988.
@end table


@menu
* SequenceMatcher objects:: 
* SequenceMatcher examples:: 
* Differ objects:: 
* Differ example:: 
* difflib의 명령 줄 인터페이스:: 
* ndiff 예제:: 

@end menu

@node SequenceMatcher objects,SequenceMatcher examples,,difflib — 델타 계산을 위한 도우미
@anchor{library/difflib sequence-matcher}@anchor{27cb}@anchor{library/difflib sequencematcher-objects}@anchor{27cc}
@subsubsection SequenceMatcher objects


@ref{1218,,SequenceMatcher} 클래스는 다음과 같은 생성자를 갖습니다:

@geindex SequenceMatcher (difflib 클래스)
@anchor{library/difflib difflib SequenceMatcher}@anchor{1218}
@deffn {클래스} difflib.SequenceMatcher (isjunk=None, a='@w{'}, b='@w{'}, autojunk=True)

선택 인자 `isjunk'는 @code{None}(기본값)이거나, 시퀀스 요소를 받아서 요소가 “정크” 이고, 무시되어야 하는 경우에만 참을 반환하는 하나의 인자 함수여야 합니다. `isjunk'에 @code{None}을 전달하는 것은, @code{lambda x: False}를 전달하는 것과 같습니다; 즉, 아무 요소도 무시하지 않습니다. 예를 들어,:

@example
lambda x: x in " \t"
@end example

줄을 문자의 시퀀스로 비교하고, 스페이스와 탭을 무시하고 싶으면, 위와 같은 것을 전달하면 됩니다.

선택적 인자 `a' 와 `b'는 비교할 시퀀스입니다; 둘 다 빈 문자열이 기본값입니다. 두 시퀀스의 요소는 모두 @ref{823,,해시 가능}해야 합니다.

선택적 인자 `autojunk'는 자동 정크 휴리스틱을 비활성화하는 데 사용할 수 있습니다.


버전 3.2에서 변경: `autojunk' 매개 변수를 추가했습니다.


SequenceMatcher 객체는 세 개의 데이터 어트리뷰트를 갖습니다: `bjunk'는 `isjunk'가 @code{True} 인 `b' 요소의 집합입니다; `bpopular'는 휴리스틱(비활성화하지 않았다면)에서 흔하다고 판단되는 정크가 아닌 요소의 집합입니다; `b2j'는 `b'의 나머지 요소를 그들이 나타난 위치의 리스트로 매핑하는 dict입니다. `b'가 @ref{27cd,,set_seqs()} 나 @ref{27ce,,set_seq2()}로 재설정 될 때마다 세 개 모두 재설정됩니다.


Added in version 3.2: `bjunk' 및 `bpopular' 어트리뷰트


@ref{1218,,SequenceMatcher} 객체에는 다음과 같은 메서드가 있습니다:

@geindex set_seqs() (difflib.SequenceMatcher 메서드)
@anchor{library/difflib difflib SequenceMatcher set_seqs}@anchor{27cd}
@deffn {메서드} set_seqs (a, b)

비교할 두 시퀀스를 설정합니다.
@end deffn

@ref{1218,,SequenceMatcher}는 두 번째 시퀀스에 대한 자세한 정보를 계산하고 캐시 하므로, 많은 시퀀스에 대해 하나의 시퀀스를 비교하려면, @ref{27ce,,set_seq2()}를 사용하여 자주 사용되는 시퀀스를 한 번 설정하고, @ref{27cf,,set_seq1()}를 다른 시퀀스 각각에 대해 한 번 반복적으로 호출하십시오.

@geindex set_seq1() (difflib.SequenceMatcher 메서드)
@anchor{library/difflib difflib SequenceMatcher set_seq1}@anchor{27cf}
@deffn {메서드} set_seq1 (a)

비교할 첫 번째 시퀀스를 설정합니다. 비교할 두 번째 시퀀스는 변경되지 않습니다.
@end deffn

@geindex set_seq2() (difflib.SequenceMatcher 메서드)
@anchor{library/difflib difflib SequenceMatcher set_seq2}@anchor{27ce}
@deffn {메서드} set_seq2 (b)

비교할 두 번째 시퀀스를 설정합니다. 비교할 첫 번째 시퀀스는 변경되지 않습니다.
@end deffn

@geindex find_longest_match() (difflib.SequenceMatcher 메서드)
@anchor{library/difflib difflib SequenceMatcher find_longest_match}@anchor{1d48}
@deffn {메서드} find_longest_match (alo=0, ahi=None, blo=0, bhi=None)

@code{a[alo:ahi]} 와 @code{b[blo:bhi]}에서 가장 긴 일치 블록을 찾습니다.

`isjunk'가 생략되거나 @code{None} 이면, @ref{1d48,,find_longest_match()}는 @code{a[i:i+k]}가 @code{b[j:j+k]}와 같은 @code{(i, j, k)}를 반환하는데, 여기서 @code{alo <= i <= i+k <= ahi} 이고 @code{blo <= j <= j+k <= bhi} 입니다. 이 조건을 만족시키는 모든 @code{(i', j', k')}에 대해, 추가 조건 @code{k >= k'}, @code{i <= i'} 와 @code{i == i'} 면 @code{j <= j'} 도 만족합니다. 즉, 모든 최대 일치 블록 중에서 `a'에서 가장 먼저 시작하는 블록을 반환하고, `a'에서 가장 먼저 시작하는 모든 최대 일치 블록 중에서 `b'에서 가장 먼저 시작하는 블록을 반환합니다.

@example
>>> s = SequenceMatcher(None, " abcd", "abcd abcd")
>>> s.find_longest_match(0, 5, 0, 9)
Match(a=0, b=4, size=5)
@end example

`isjunk'가 제공되면, 먼저 가장 긴 일치 블록이 상기와 같이 결정되지만, 정크 요소가 블록에 나타나지 않아야 한다는 추가 제약이 있습니다. 그런 다음 그 블록의 좌우에서 정크 요소만 일치시켜 가능한 한 최대로 확장합니다. 그래서 결과 블록은 흥미로운 일치와 인접하게 같은 정크가 등장할 때를 제외하고는, 정크와 일치하지 않습니다.

여기에 이전과 같은 예가 있지만, 스페이스를 정크로 간주합니다. 이렇게 하면 @code{' abcd'}가 두 번째 시퀀스의 끝에 있는 @code{' abcd'}와 직접 일치하지 않게 됩니다. 대신 @code{'abcd'} 만 일치 할 수 있으며, 두 번째 시퀀스에서 가장 왼쪽의 @code{'abcd'}와 일치합니다:

@example
>>> s = SequenceMatcher(lambda x: x==" ", " abcd", "abcd abcd")
>>> s.find_longest_match(0, 5, 0, 9)
Match(a=1, b=0, size=4)
@end example

일치하는 블록이 없으면 @code{(alo, blo, 0)}를 반환합니다.

이 메서드는 @ref{85d,,네임드 튜플} @code{Match(a, b, size)}를 반환합니다.


버전 3.9에서 변경: 인자 기본값이 추가되었습니다.

@end deffn

@geindex get_matching_blocks() (difflib.SequenceMatcher 메서드)
@anchor{library/difflib difflib SequenceMatcher get_matching_blocks}@anchor{27d0}
@deffn {메서드} get_matching_blocks ()

중첩하지 않는 일치하는 서브 시퀀스를 기술하는 3-튜플의 리스트를 반환합니다. 각 3-튜플은 @code{(i, j, n)} 형식이며, @code{a[i:i+n] == b[j:j+n]}를 뜻합니다. 3-튜플은 `i'와 `j'에 대해 단조 증가합니다.

마지막 3-튜플은 더미이며, @code{(len(a), len(b), 0)} 값을 가집니다. @code{n == 0} 인 유일한 3-튜플입니다. @code{(i, j, n)}와 @code{(i', j', n')}가 리스트에서 인접한 3-튜플이고, 두 번째가 리스트의 마지막 3-튜플이 아니면 @code{i+n < i'} 또는 @code{j+n < j'}입니다; 즉, 인접 3-튜플은 항상 인접하지 않은 같은 블록을 나타냅니다.

@c XXX Explain why a dummy is used!

@example
>>> s = SequenceMatcher(None, "abxcd", "abcd")
>>> s.get_matching_blocks()
[Match(a=0, b=0, size=2), Match(a=3, b=2, size=2), Match(a=5, b=4, size=0)]
@end example
@end deffn

@geindex get_opcodes() (difflib.SequenceMatcher 메서드)
@anchor{library/difflib difflib SequenceMatcher get_opcodes}@anchor{27d1}
@deffn {메서드} get_opcodes ()

`a'를 `b'로 변환하는 방법을 설명하는 5-튜플의 리스트를 반환합니다. 각 튜플은 @code{(tag, i1, i2, j1, j2)} 형식입니다. 첫 번째 튜플은 @code{i1 == j1 == 0} 이고, 나머지 튜플에서는 `i1'이 이전 튜플의 `i2'와 같고, 마찬가지로 `j1'은 이전 `j2'와 같습니다.

`tag' 값은 문자열이고, 이런 의미입니다:


@multitable {xxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

값

@tab

뜻

@item

@code{'replace'}

@tab

@code{a[i1:i2]}를 @code{b[j1:j2]}로 치환해야 합니다.

@item

@code{'delete'}

@tab

@code{a[i1:i2]}를 삭제해야 합니다. 이때 @code{j1 == j2} 임을 유의하십시오.

@item

@code{'insert'}

@tab

@code{b[j1:j2]}을 @code{a[i1:i1]}에 삽입해야 합니다. 이때 @code{i1 == i2} 임을 유의하십시오.

@item

@code{'equal'}

@tab

@code{a[i1:i2] == b[j1:j2]} (서브 시퀀스가 같습니다).

@end multitable


예를 들면:

@example
>>> a = "qabxcd"
>>> b = "abycdf"
>>> s = SequenceMatcher(None, a, b)
>>> for tag, i1, i2, j1, j2 in s.get_opcodes():
...     print('@{:7@}   a[@{@}:@{@}] --> b[@{@}:@{@}] @{!r:>8@} --> @{!r@}'.format(
...         tag, i1, i2, j1, j2, a[i1:i2], b[j1:j2]))
delete    a[0:1] --> b[0:0]      'q' --> '@w{'}
equal     a[1:3] --> b[0:2]     'ab' --> 'ab'
replace   a[3:4] --> b[2:3]      'x' --> 'y'
equal     a[4:6] --> b[3:5]     'cd' --> 'cd'
insert    a[6:6] --> b[5:6]       '@w{'} --> 'f'
@end example
@end deffn

@geindex get_grouped_opcodes() (difflib.SequenceMatcher 메서드)
@anchor{library/difflib difflib SequenceMatcher get_grouped_opcodes}@anchor{27d2}
@deffn {메서드} get_grouped_opcodes (n=3)

최대 `n' 줄의 문맥을 갖는 그룹의 @ref{1260,,제너레이터}를 반환합니다.

@ref{27d1,,get_opcodes()}에서 반환된 그룹으로 출발해서, 이 메서드는 더 작은 변경 클러스터로 나누고, 변경 사항이 없는 중간 범위를 제거합니다.

그룹은 @ref{27d1,,get_opcodes()}와 같은 형식으로 반환됩니다.
@end deffn

@geindex ratio() (difflib.SequenceMatcher 메서드)
@anchor{library/difflib difflib SequenceMatcher ratio}@anchor{27d3}
@deffn {메서드} ratio ()

[0, 1]의 범위의 float로 시퀀스 유사성 척도를 돌려줍니다.

T가 두 시퀀스의 요소의 총 개수이고, M은 일치 개수일 때, 척도는 2.0*M / T입니다. 시퀀스가 같으면 @code{1.0}이고, 공통 요소가 없으면 @code{0.0}입니다.

@ref{27d0,,get_matching_blocks()} 나 @ref{27d1,,get_opcodes()}가 아직 호출되지 않았으면, 계산하는 데 비용이 많이 듭니다. 이럴 때, @ref{27d4,,quick_ratio()} 나 @ref{27d5,,real_quick_ratio()}를 먼저 시도하여 상한값을 얻을 수 있습니다.

@cartouche
@quotation 참고 
주의: @ref{27d3,,ratio()} 호출의 결과는 인자의 순서에 따라 달라질 수 있습니다. 예를 들어:

@example
>>> SequenceMatcher(None, 'tide', 'diet').ratio()
0.25
>>> SequenceMatcher(None, 'diet', 'tide').ratio()
0.5
@end example
@end quotation
@end cartouche
@end deffn

@geindex quick_ratio() (difflib.SequenceMatcher 메서드)
@anchor{library/difflib difflib SequenceMatcher quick_ratio}@anchor{27d4}
@deffn {메서드} quick_ratio ()

비교적 빨리 @ref{27d3,,ratio()}의 상한을 반환합니다.
@end deffn

@geindex real_quick_ratio() (difflib.SequenceMatcher 메서드)
@anchor{library/difflib difflib SequenceMatcher real_quick_ratio}@anchor{27d5}
@deffn {메서드} real_quick_ratio ()

아주 빨리 @ref{27d3,,ratio()}의 상한을 반환합니다.
@end deffn
@end deffn

총 문자 수에 대한 일치 비율을 반환하는 세 가지 메서드는 서로 다른 수준의 근삿값 때문에 다른 결과를 줄 수 있습니다. 하지만 @ref{27d4,,quick_ratio()} 와 @ref{27d5,,real_quick_ratio()}는 항상 최소한 @ref{27d3,,ratio()}만큼 큰 값을 줍니다:

@example
>>> s = SequenceMatcher(None, "abcd", "bcde")
>>> s.ratio()
0.75
>>> s.quick_ratio()
0.75
>>> s.real_quick_ratio()
1.0
@end example

@node SequenceMatcher examples,Differ objects,SequenceMatcher objects,difflib — 델타 계산을 위한 도우미
@anchor{library/difflib id1}@anchor{27d6}@anchor{library/difflib sequencematcher-examples}@anchor{27d7}
@subsubsection SequenceMatcher examples


이 예제에서는 공백을 “정크”로 간주하여, 두 문자열을 비교합니다:

@example
>>> s = SequenceMatcher(lambda x: x == " ",
...                     "private Thread currentThread;",
...                     "private volatile Thread currentThread;")
@end example

@ref{27d3,,ratio()}는 [0, 1] 범위의 float를 반환하여, 시퀀스의 유사성을 측정합니다. 경험적으로, @code{ratio()} 값이 0.6 이상이면 시퀀스가 근접하게 일치함을 뜻합니다:

@example
>>> print(round(s.ratio(), 3))
0.866
@end example

시퀀스가 일치하는 부분에만 관심이 있다면, @ref{27d0,,get_matching_blocks()}가 유용합니다:

@example
>>> for block in s.get_matching_blocks():
...     print("a[%d] and b[%d] match for %d elements" % block)
a[0] and b[0] match for 8 elements
a[8] and b[17] match for 21 elements
a[29] and b[38] match for 0 elements
@end example

@ref{27d0,,get_matching_blocks()}에 의해 반환된 마지막 튜플은 항상 더미인 @code{(len(a), len(b), 0)}이며, 이는 마지막 튜플 요소(일치하는 요소의 수)가 @code{0} 인 유일한 경우입니다.

첫 번째 시퀀스를 두 번째 시퀀스로 변경하는 방법을 알고 싶다면, @ref{27d1,,get_opcodes()}를 사용하십시오:

@example
>>> for opcode in s.get_opcodes():
...     print("%6s a[%d:%d] b[%d:%d]" % opcode)
 equal a[0:8] b[0:8]
insert a[8:8] b[8:17]
 equal a[8:29] b[17:38]
@end example


@subsubheading 더 보기



@itemize *

@item 
이 모듈의 @ref{27c7,,get_close_matches()} 함수는 @ref{1218,,SequenceMatcher}를 사용한 간단한 코드 작성을 통해 유용한 작업을 수행하는 방법을 보여줍니다.

@item 
@ref{1218,,SequenceMatcher}로 만들어진 작은 응용 프로그램을 위한 간단한 버전 관리 조리법@footnote{https://code.activestate.com/recipes/576729-simple-version-control/}.
@end itemize


@node Differ objects,Differ example,SequenceMatcher examples,difflib — 델타 계산을 위한 도우미
@anchor{library/difflib differ-objects}@anchor{27d8}@anchor{library/difflib id2}@anchor{27d9}
@subsubsection Differ objects


@ref{27c1,,Differ}가 만든 델타는 `최소' diff라고 주장하지 않음에 유의하십시오. 반대로, 최소 diff는 종종 반 직관적인데, 가능한 모든 곳에서 일치를 취하기 때문입니다. 때로 우발적으로 100페이지가 떨어진 곳에서 일치시키기도 합니다. 동기화 지점을 인접한 일치로 제한하면 가끔 더 긴 diff를 만드는 대신 일종의 지역성을 보존합니다.

@ref{27c1,,Differ} 클래스에는 다음과 같은 생성자가 있습니다:


@deffn {클래스} difflib.Differ (linejunk=None, charjunk=None)

선택적 키워드 매개 변수 `linejunk' 와 `charjunk'는 필터 함수(또는 @code{None})를 위한 것입니다:

`linejunk': 단일 문자열 인자를 받아들이고 문자열이 정크면 참을 반환하는 함수입니다. 기본값은 @code{None}이며, 이는 어떤 줄도 정크로 간주하지 않음을 의미합니다.

`charjunk': 문자(길이 1의 문자열)를 받아들이고, 문자가 정크면 참을 반환하는 함수입니다. 기본값은 @code{None}이며, 이는 어떤 문자도 정크로 간주하지 않음을 의미합니다.

이러한 정크 필터링 함수는 차이점을 찾기 위한 일치 속도를 높이고 차이가 나는 줄이나 문자를 무시하지 않습니다. 설명이 필요하면 @ref{1d48,,find_longest_match()} 메서드의 `isjunk' 매개 변수에 대한 설명을 읽으십시오.

@ref{27c1,,Differ} 객체는 단일 메서드를 통해 사용됩니다 (델타가 만들어집니다):

@geindex compare() (difflib.Differ 메서드)
@anchor{library/difflib difflib Differ compare}@anchor{27ca}
@deffn {메서드} compare (a, b)

줄의 시퀀스 두 개를 비교하고, 델타(줄의 시퀀스)를 만듭니다.

각 시퀀스는 줄 넘김으로 끝나는 개별 단일 줄 문자열을 포함해야 합니다. 이러한 시퀀스는 파일류 객체의 @ref{27c5,,readlines()} 메서드로 얻을 수 있습니다. 생성된 델타 역시 파일류 객체의 @ref{1781,,writelines()} 메서드를 통해 그대로 인쇄될 수 있도록 줄 넘김으로 끝나는 문자열로 구성됩니다.
@end deffn
@end deffn

@node Differ example,difflib의 명령 줄 인터페이스,Differ objects,difflib — 델타 계산을 위한 도우미
@anchor{library/difflib differ-example}@anchor{27da}@anchor{library/difflib differ-examples}@anchor{27db}
@subsubsection Differ example


이 예제는 두 개의 텍스트를 비교합니다. 먼저 텍스트를 설정하는데, 줄 넘김 문자로 끝나는 개별 단일 줄 문자열의 시퀀스입니다 (이러한 시퀀스는 파일류 객체의 @ref{27c5,,readlines()} 메서드로도 얻을 수 있습니다):

@example
>>> text1 = '@w{'}'  1. Beautiful is better than ugly.
...   2. Explicit is better than implicit.
...   3. Simple is better than complex.
...   4. Complex is better than complicated.
... '@w{'}'.splitlines(keepends=True)
>>> len(text1)
4
>>> text1[0][-1]
'\n'
>>> text2 = '@w{'}'  1. Beautiful is better than ugly.
...   3.   Simple is better than complex.
...   4. Complicated is better than complex.
...   5. Flat is better than nested.
... '@w{'}'.splitlines(keepends=True)
@end example

다음으로 Differ 객체의 인스턴스를 만듭니다:

@example
>>> d = Differ()
@end example

@ref{27c1,,Differ} 객체의 인스턴스를 만들 때, 줄과 문자 “정크”를 필터링하는 함수를 전달할 수 있음에 유의하십시오. 자세한 내용은 @ref{27c1,,Differ()} 생성자를 참조하십시오.

마지막으로, 두 개를 비교합니다:

@example
>>> result = list(d.compare(text1, text2))
@end example

@code{result}는 문자열의 리스트이므로, 예쁜 인쇄를 해봅시다:

@example
>>> from pprint import pprint
>>> pprint(result)
['    1. Beautiful is better than ugly.\n',
 '-   2. Explicit is better than implicit.\n',
 '-   3. Simple is better than complex.\n',
 '+   3.   Simple is better than complex.\n',
 '?     ++\n',
 '-   4. Complex is better than complicated.\n',
 '?            ^                     ---- ^\n',
 '+   4. Complicated is better than complex.\n',
 '?           ++++ ^                      ^\n',
 '+   5. Flat is better than nested.\n']
@end example

여러 줄이 포함된 하나의 문자열로 만들면 이렇게 보입니다:

@example
>>> import sys
>>> sys.stdout.writelines(result)
    1. Beautiful is better than ugly.
-   2. Explicit is better than implicit.
-   3. Simple is better than complex.
+   3.   Simple is better than complex.
?     ++
-   4. Complex is better than complicated.
?            ^                     ---- ^
+   4. Complicated is better than complex.
?           ++++ ^                      ^
+   5. Flat is better than nested.
@end example

@node difflib의 명령 줄 인터페이스,ndiff 예제,Differ example,difflib — 델타 계산을 위한 도우미
@anchor{library/difflib a-command-line-interface-to-difflib}@anchor{27dc}@anchor{library/difflib difflib-interface}@anchor{27c6}
@subsubsection difflib의 명령 줄 인터페이스


이 예제는 difflib를 사용하여 @code{diff}와 유사한 유틸리티를 만드는 방법을 보여줍니다.

@example
""" Command-line interface to difflib.py providing diffs in four formats:

* ndiff:    lists every line and highlights interline changes.
* context:  highlights clusters of changes in a before/after format.
* unified:  highlights clusters of changes in an inline format.
* html:     generates side by side comparison with change highlights.

"""

import sys, os, difflib, argparse
import datetime as dt

def file_mtime(path):
    t = dt.datetime.fromtimestamp(os.stat(path).st_mtime,
                                  dt.timezone.utc)
    return t.astimezone().isoformat()

def main():

    parser = argparse.ArgumentParser()
    parser.add_argument('-c', action='store_true', default=False,
                        help='Produce a context format diff (default)')
    parser.add_argument('-u', action='store_true', default=False,
                        help='Produce a unified format diff')
    parser.add_argument('-m', action='store_true', default=False,
                        help='Produce HTML side by side diff '
                             '(can use -c and -l in conjunction)')
    parser.add_argument('-n', action='store_true', default=False,
                        help='Produce a ndiff format diff')
    parser.add_argument('-l', '--lines', type=int, default=3,
                        help='Set number of context lines (default 3)')
    parser.add_argument('fromfile')
    parser.add_argument('tofile')
    options = parser.parse_args()

    n = options.lines
    fromfile = options.fromfile
    tofile = options.tofile

    fromdate = file_mtime(fromfile)
    todate = file_mtime(tofile)
    with open(fromfile) as ff:
        fromlines = ff.readlines()
    with open(tofile) as tf:
        tolines = tf.readlines()

    if options.u:
        diff = difflib.unified_diff(fromlines, tolines, fromfile, tofile, fromdate, todate, n=n)
    elif options.n:
        diff = difflib.ndiff(fromlines, tolines)
    elif options.m:
        diff = difflib.HtmlDiff().make_file(fromlines,tolines,fromfile,tofile,context=options.c,numlines=n)
    else:
        diff = difflib.context_diff(fromlines, tolines, fromfile, tofile, fromdate, todate, n=n)

    sys.stdout.writelines(diff)

if __name__ == '__main__':
    main()
@end example

@node ndiff 예제,,difflib의 명령 줄 인터페이스,difflib — 델타 계산을 위한 도우미
@anchor{library/difflib ndiff-example}@anchor{27dd}
@subsubsection ndiff 예제


d이 예제는 @ref{27c3,,difflib.ndiff()}를 사용하는 방법을 보여줍니다.

@example
"""ndiff [-q] file1 file2
    or
ndiff (-r1 | -r2) < ndiff_output > file1_or_file2

사람이 읽기 쉬운 파일 차이 보고서를 표준 출력에 인쇄합니다.  줄 간 및 줄 내 차이점이 모두 표시됩니다.
두 번째 형식에서는, 표준 입력의 ndiff 보고서로부터
 표준 출력으로 file1 (-r1) 이나 file2 (-r2) 를 다시 생성합니다.

첫 번째 형식에서는, -q ("quiet") 가 지정되지 않으면, 출력의 처음
두 줄은 다음과 같습니다

-: file1
+: file2

나머지 각 줄은 두 글자 코드로 시작합니다:

    "- "    file1 에 고유한 줄
    "+ "    file2 에 고유한 줄
    "  "    두 파일에 공통된 줄
    "? "    두 입력 파일 어디에도 없는 줄

"? " 로 시작하는 줄은 줄 내 차이로 눈을 안내하려고 시도하고,
두 입력 파일 어디에도 존재하지 않습니다.  이 줄들은 소스 파일에
탭 문자가 있을 경우 혼란스러울 수 있습니다.

첫 번째 파일은 "  " 나 "- " 로 시작하는 줄만 유지하고, 두 문자 접두사를
삭제해서 복구할 수 있습니다; ndiff 를 -r1 과 함께 사용하세요.

두 번째 파일도 비슷하게 복구할 수 있지만, "  " 과
"+ " 줄만 유지합니다; ndiff 를 -r2 와 함께 사용하세요; 또는, 유닉스에서, 두 번째 파일은
다음과 같이 출력을 파이핑하여 복구할 수 있습니다

    sed -n '/^[+ ] /s/^..//p'
"""

__version__ = 1, 7, 0

import difflib, sys

def fail(msg):
    out = sys.stderr.write
    out(msg + "\n\n")
    out(__doc__)
    return 0

# 파일을 열고 파일 객체를 반환합니다; 열 수 없으면
# 메시지를 출력하고 0을 반환합니다
def fopen(fname):
    try:
        return open(fname)
    except IOError as detail:
        return fail("couldn't open " + fname + ": " + str(detail))

# 두 파일을 열고 표준 출력으로 diff 를 뿌립니다; 문제가 있으면 거짓을 반환합니다
def fcompare(f1name, f2name):
    f1 = fopen(f1name)
    f2 = fopen(f2name)
    if not f1 or not f2:
        return 0

    a = f1.readlines(); f1.close()
    b = f2.readlines(); f2.close()
    for line in difflib.ndiff(a, b):
        print(line, end=' ')

    return 1

# args (보통 sys.argv[1:]) 를 쪼개고 비교합니다;
# 문제가 있으면 & 문제가 있을 때만 거짓을 반환합니다

def main(args):
    import getopt
    try:
        opts, args = getopt.getopt(args, "qr:")
    except getopt.error as detail:
        return fail(str(detail))
    noisy = 1
    qseen = rseen = 0
    for opt, val in opts:
        if opt == "-q":
            qseen = 1
            noisy = 0
        elif opt == "-r":
            rseen = 1
            whichfile = val
    if qseen and rseen:
        return fail("can't specify both -q and -r")
    if rseen:
        if args:
            return fail("no args allowed with -r option")
        if whichfile in ("1", "2"):
            restore(whichfile)
            return 1
        return fail("-r value must be 1 or 2")
    if len(args) != 2:
        return fail("need 2 filename args")
    f1name, f2name = args
    if noisy:
        print('-:', f1name)
        print('+:', f2name)
    return fcompare(f1name, f2name)

# 표준 입력에서 ndiff 출력을 읽고, file1 (which=='1') 이나
# file2 (which=='2') 를 표준 출력에 인쇄합니다

def restore(which):
    restored = difflib.restore(sys.stdin.readlines(), which)
    sys.stdout.writelines(restored)

if __name__ == '__main__':
    main(sys.argv[1:])
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node textwrap — 텍스트 래핑과 채우기,unicodedata — 유니코드 데이터베이스,difflib — 델타 계산을 위한 도우미,텍스트 처리 서비스
@anchor{library/textwrap doc}@anchor{27de}@anchor{library/textwrap module-textwrap}@anchor{f2}@anchor{library/textwrap textwrap-text-wrapping-and-filling}@anchor{27df}@anchor{library/textwrap translation-repo}@anchor{27e0}
@subsection @code{textwrap} — 텍스트 래핑과 채우기


@geindex module; textwrap

`소스 코드:' Lib/textwrap.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/textwrap.py}


__________________________________________________________________


The @code{textwrap} module provides some convenience functions,
as well as @ref{11cc,,TextWrapper}, the class that does all the work.
If you’re just wrapping or filling one or two text strings, the convenience
functions should be good enough; otherwise, you should use an instance of
@code{TextWrapper} for efficiency.

@geindex wrap() (textwrap 모듈)
@anchor{library/textwrap textwrap wrap}@anchor{16cc}
@deffn {함수} textwrap.wrap (text, width=70, *, initial_indent='@w{'}, subsequent_indent='@w{'}, expand_tabs=True, replace_whitespace=True, fix_sentence_endings=False, break_long_words=True, drop_whitespace=True, break_on_hyphens=True, tabsize=8, max_lines=None, placeholder=' [...]')

`text'(문자열)에 있는 단일 문단을 래핑해서 모든 줄의 길이가 최대 `width' 자가 되도록 합니다. 최종 줄 바꿈이 없는 출력 줄의 리스트를 반환합니다.

선택적 키워드 인자는 아래에 설명된 @ref{11cc,,TextWrapper}의 인스턴스 어트리뷰트에 해당합니다.

@ref{16cc,,wrap()} 작동 방식에 대한 자세한 내용은 @ref{27e1,,TextWrapper.wrap()} 메서드를 참조하십시오.
@end deffn

@geindex fill() (textwrap 모듈)
@anchor{library/textwrap textwrap fill}@anchor{16cb}
@deffn {함수} textwrap.fill (text, width=70, *, initial_indent='@w{'}, subsequent_indent='@w{'}, expand_tabs=True, replace_whitespace=True, fix_sentence_endings=False, break_long_words=True, drop_whitespace=True, break_on_hyphens=True, tabsize=8, max_lines=None, placeholder=' [...]')

`text'에 있는 단일 문단을 래핑하고, 래핑 된 문단을 포함하는 단일 문자열을 반환합니다. @ref{16cb,,fill()}은 다음의 줄임 표현입니다

@example
"\n".join(wrap(text, ...))
@end example

특히, @ref{16cb,,fill()}은 @ref{16cc,,wrap()}과 같은 키워드 인자를 받아들입니다.
@end deffn

@geindex shorten() (textwrap 모듈)
@anchor{library/textwrap textwrap shorten}@anchor{11cf}
@deffn {함수} textwrap.shorten (text, width, *, fix_sentence_endings=False, break_long_words=True, break_on_hyphens=True, placeholder=' [...]')

주어진 `width'에 맞게 주어진 `text'를 축약하거나 자릅니다.

먼저 `text'에 있는 공백이 축약됩니다 (모든 공백이 단일 스페이스로 치환됩니다). 결과가 `width'에 맞으면 반환됩니다. 그렇지 않으면, 나머지 단어와 `placeholder'가 `width' 내에 맞도록 충분한 단어가 끝에서 삭제됩니다:

@example
>>> textwrap.shorten("Hello  world!", width=12)
'Hello world!'
>>> textwrap.shorten("Hello  world!", width=11)
'Hello [...]'
>>> textwrap.shorten("Hello world", width=10, placeholder="...")
'Hello...'
@end example

선택적 키워드 인자는 아래에 설명된 @ref{11cc,,TextWrapper}의 인스턴스 어트리뷰트에 해당합니다. 텍스트가 @code{TextWrapper} @ref{16cb,,fill()} 함수에 전달되기 전에 공백이 축약되므로, @ref{27e2,,tabsize}, @ref{27e3,,expand_tabs}, @ref{27e4,,drop_whitespace} 및 @ref{27e5,,replace_whitespace} 값을 변경하는 것은 아무 효과가 없음에 유의하십시오.


Added in version 3.4.

@end deffn

@geindex dedent() (textwrap 모듈)
@anchor{library/textwrap textwrap dedent}@anchor{1a9}
@deffn {함수} textwrap.dedent (text)

`text'의 모든 줄에서 같은 선행 공백을 제거합니다.

이것은 삼중 따옴표로 묶은 문자열을 소스 코드에서 여전히 들여쓰기 된 형태로 제시하면서, 디스플레이의 왼쪽 가장자리에 맞추는 데 사용할 수 있습니다.

탭과 공백은 모두 공백으로 처리되지만, 이들이 같지 않음에 유의하십시오: @code{"  hello"}와 @code{"\thello"} 줄에는 공통 선행 공백이 없는 것으로 간주합니다.

공백만 포함하는 줄은 입력에서 무시되고 출력에서 단일 개행 문자로 정규화됩니다.

예를 들면:

@example
def test():
    # 빈 줄을 피하려고 첫 줄을 \ 로 끝냅니다!
    s = '@w{'}'\
    hello
      world
    '@w{'}'
    print(repr(s))          # '    hello\n      world\n    ' 를 인쇄합니다
    print(repr(dedent(s)))  # 'hello\n  world\n' 를 인쇄합니다
@end example


버전 3.14에서 변경: The @code{dedent()} function now correctly normalizes blank lines containing
only whitespace characters. Previously, the implementation only normalized
blank lines containing tabs and spaces.

@end deffn

@geindex indent() (textwrap 모듈)
@anchor{library/textwrap textwrap indent}@anchor{57c}
@deffn {함수} textwrap.indent (text, prefix, predicate=None)

`text'에서 선택된 줄의 시작 부분에 `prefix'를 추가합니다.

@code{text.splitlines(True)}를 호출하여 줄을 분할합니다.

기본적으로, `prefix'는 공백으로만 구성되지 않는 모든 줄(마지막 줄 포함)에 추가됩니다.

예를 들면:

@example
>>> s = 'hello\n\n \nworld'
>>> indent(s, '  ')
'  hello\n\n \n  world'
@end example

선택적 `predicate' 인자는 어떤 줄을 들여쓰기할지 제어하는 데 사용될 수 있습니다. 예를 들어, 빈 줄과 공백만 있는 줄에도 `prefix'를 추가하기는 쉽습니다:

@example
>>> print(indent(s, '+ ', lambda line: True))
+ hello
+
+
+ world
@end example


Added in version 3.3.

@end deffn

@ref{16cc,,wrap()}, @ref{16cb,,fill()} 및 @ref{11cf,,shorten()}은 @ref{11cc,,TextWrapper} 인스턴스를 만들고 그것의 단일 메서드를 호출하여 작동합니다. 이 인스턴스는 재사용되지 않기 때문에, @code{wrap()} 및/또는 @code{fill()}을 사용하여 많은 텍스트 문자열을 처리하는 응용 프로그램의 경우, 여러분 자신의 @code{TextWrapper} 객체를 만드는 것이 더 효율적일 수 있습니다.

텍스트는 공백과 하이픈이 있는 단어의 하이픈 바로 뒤에서 래핑하는 것을 선호합니다; @ref{27e6,,TextWrapper.break_long_words}가 거짓으로 설정되어 있지 않으면 그 후에만 긴 단어를 분할합니다.

@geindex TextWrapper (textwrap 클래스)
@anchor{library/textwrap textwrap TextWrapper}@anchor{11cc}
@deffn {클래스} textwrap.TextWrapper (**kwargs)

@ref{11cc,,TextWrapper} 생성자는 여러 개의 선택적 키워드 인자를 받아들입니다. 각 키워드 인자는 인스턴스 어트리뷰트에 해당합니다, 그래서 예를 들면

@example
wrapper = TextWrapper(initial_indent="* ")
@end example

는 다음과 같습니다

@example
wrapper = TextWrapper()
wrapper.initial_indent = "* "
@end example

같은 @ref{11cc,,TextWrapper} 객체를 여러 번 재사용 할 수 있으며, 사용 도중 인스턴스 어트리뷰트에 직접 대입하여 옵션을 변경할 수 있습니다.

@ref{11cc,,TextWrapper} 인스턴스 어트리뷰트(와 생성자에 대한 키워드 인자)는 다음과 같습니다:

@geindex width (textwrap.TextWrapper의 속성)
@anchor{library/textwrap textwrap TextWrapper width}@anchor{27e7}
@deffn {속성} width

(기본값: @code{70}) 래핑 된 줄의 최대 길이. 입력 텍스트에 @ref{27e7,,width}보다 긴 개별 단어가 없는 한, @ref{11cc,,TextWrapper}는 @code{width} 문자보다 긴 출력 줄이 없음을 보장합니다.
@end deffn

@geindex expand_tabs (textwrap.TextWrapper의 속성)
@anchor{library/textwrap textwrap TextWrapper expand_tabs}@anchor{27e3}
@deffn {속성} expand_tabs

(기본값: @code{True}) 참이면, `text'의 모든 탭 문자가 `text'의 @ref{2643,,expandtabs()} 메서드를 사용하여 스페이스로 확장됩니다.
@end deffn

@geindex tabsize (textwrap.TextWrapper의 속성)
@anchor{library/textwrap textwrap TextWrapper tabsize}@anchor{27e2}
@deffn {속성} tabsize

(기본값: @code{8}) @ref{27e3,,expand_tabs}가 참이면, `text'의 모든 탭 문자는 현재 열과 주어진 탭 크기에 따라 0개 이상의 스페이스로 확장됩니다.


Added in version 3.3.

@end deffn

@geindex replace_whitespace (textwrap.TextWrapper의 속성)
@anchor{library/textwrap textwrap TextWrapper replace_whitespace}@anchor{27e5}
@deffn {속성} replace_whitespace

(기본값: @code{True}) 참이면, 탭 확장 후 래핑 전에, @ref{16cc,,wrap()} 메서드는 각 공백 문자를 단일 스페이스로 치환합니다. 치환되는 공백 문자는 다음과 같습니다: 탭, 줄 바꿈, 세로 탭, 폼 피드 및 캐리지 리턴 (@code{'\t\n\v\f\r'}).

@cartouche
@quotation 참고 
@ref{27e3,,expand_tabs}가 거짓이고 @ref{27e5,,replace_whitespace}가 참이면, 각 탭 문자는 단일 스페이스로 치환되는데, 탭 확장과는 `다릅니다'.
@end quotation
@end cartouche

@cartouche
@quotation 참고 
@ref{27e5,,replace_whitespace}가 거짓이면, 줄 중간에 줄 바꿈이 나타나서 이상한 결과가 발생할 수 있습니다. 이러한 이유로, 텍스트는 (@ref{145b,,str.splitlines()}나 유사한 것을 사용해서) 문단으로 분할한 후에 별도로 래핑해야 합니다.
@end quotation
@end cartouche
@end deffn

@geindex drop_whitespace (textwrap.TextWrapper의 속성)
@anchor{library/textwrap textwrap TextWrapper drop_whitespace}@anchor{27e4}
@deffn {속성} drop_whitespace

(기본값: @code{True}) 참이면, 모든 줄의 처음과 끝의 공백(래핑 이후 들여쓰기 전)이 삭제됩니다. 문단 시작 부분의 공백은 공백이 아닌 것이 뒤에 오면 삭제되지 않습니다. 삭제되는 공백이 줄 전체를 차지하면, 줄 전체가 삭제됩니다.
@end deffn

@geindex initial_indent (textwrap.TextWrapper의 속성)
@anchor{library/textwrap textwrap TextWrapper initial_indent}@anchor{27e8}
@deffn {속성} initial_indent

(기본값: @code{'@w{'}}) 래핑 된 출력의 첫 번째 줄 앞에 추가될 문자열입니다. 첫 번째 줄의 길이 계산에 포함됩니다. 빈 문자열은 들여 쓰지 않습니다.
@end deffn

@geindex subsequent_indent (textwrap.TextWrapper의 속성)
@anchor{library/textwrap textwrap TextWrapper subsequent_indent}@anchor{27e9}
@deffn {속성} subsequent_indent

(기본값: @code{'@w{'}}) 첫 줄을 제외한 래핑 된 출력의 모든 줄 앞에 추가될 문자열입니다. 첫 번째 줄을 제외한 각 줄의 길이 계산에 포함됩니다.
@end deffn

@geindex fix_sentence_endings (textwrap.TextWrapper의 속성)
@anchor{library/textwrap textwrap TextWrapper fix_sentence_endings}@anchor{27ea}
@deffn {속성} fix_sentence_endings

(기본값: @code{False}) 참이면, @ref{11cc,,TextWrapper}는 문장의 끝을 감지하고 문장이 항상 정확히 두 개의 스페이스로 분리되도록 만들려고 합니다. 이것은 일반적으로 고정 폭 글꼴의 텍스트에 적합합니다. 그러나, 문장 감지 알고리즘은 불완전합니다: 문장 끝은 @code{'.'}, @code{'!'} 또는 @code{'?'} 중 하나가 뒤에 오고, @code{'"'}나 @code{"'"} 중 하나가 뒤따르는 것도 가능, 그 뒤에 스페이스가 오는 소문자로 구성된다고 가정합니다. 이 알고리즘의 한가지 문제는 다음에 나오는 “Dr.” 와

@example
[...] Dr. Frankenstein's monster [...]
@end example

다음에 나오는 “Spot.” 사이의 차이점을 탐지할 수 없다는 것입니다

@example
[...] See Spot. See Spot run [...]
@end example

@ref{27ea,,fix_sentence_endings}는 기본적으로 거짓입니다.

문장 감지 알고리즘은 “소문자” 의 정의에 @code{string.lowercase}에 의존하고, 같은 줄에서 문장을 분리하기 위해 마침표 뒤에 두 개의 스페이스를 사용하는 규칙을 따르므로, 영어 텍스트에만 적용됩니다.
@end deffn

@geindex break_long_words (textwrap.TextWrapper의 속성)
@anchor{library/textwrap textwrap TextWrapper break_long_words}@anchor{27e6}
@deffn {속성} break_long_words

(기본값: @code{True}) 참이면, @ref{27e7,,width}보다 긴 줄이 없도록 하기 위해, @code{width}보다 긴 단어를 분할합니다. 거짓이면, 긴 단어가 깨지지 않으며, 일부 줄이 @code{width}보다 길 수 있습니다. (@code{width}를 초과하는 양을 최소화하기 위해 긴 단어는 독립된 줄에 넣습니다.)
@end deffn

@geindex break_on_hyphens (textwrap.TextWrapper의 속성)
@anchor{library/textwrap textwrap TextWrapper break_on_hyphens}@anchor{27eb}
@deffn {속성} break_on_hyphens

(기본값: @code{True}) 참이면, 래핑이, 영어에서의 관례대로, 공백과 복합 단어의 하이픈 바로 뒤에서 발생합니다. 거짓이면, 공백만을 줄 바꿈을 위한 좋은 장소로 간주하지만, 진정한 분할되지 않는 단어를 원한다면 @ref{27e6,,break_long_words}를 거짓으로 설정해야 합니다. 이전 버전의 기본 동작은 항상 하이픈으로 연결된 단어를 분리 할 수 있게 하는 것이었습니다.
@end deffn

@geindex max_lines (textwrap.TextWrapper의 속성)
@anchor{library/textwrap textwrap TextWrapper max_lines}@anchor{11cd}
@deffn {속성} max_lines

(기본값: @code{None}) @code{None}이 아니면, 출력은 최대 `max_lines' 줄을 포함하고, `placeholder'가 출력 끝에 나타납니다.


Added in version 3.4.

@end deffn

@geindex ...;자리 표시자

@geindex placeholder (textwrap.TextWrapper의 속성)
@anchor{library/textwrap textwrap TextWrapper placeholder}@anchor{11ce}
@deffn {속성} placeholder

(기본값: @code{' [...]'}) 잘렸을 때 출력 텍스트의 끝에 표시할 문자열.


Added in version 3.4.

@end deffn

@ref{11cc,,TextWrapper}는 모듈 수준 편리 함수와 유사한 몇 가지 공용 메서드도 제공합니다:

@geindex wrap() (textwrap.TextWrapper 메서드)
@anchor{library/textwrap textwrap TextWrapper wrap}@anchor{27e1}
@deffn {메서드} wrap (text)

`text'(문자열)에 있는 한 문단을 모든 줄의 길이가 최대 @ref{27e7,,width} 자가 되도록 래핑합니다. 모든 래핑 옵션은 @ref{11cc,,TextWrapper} 인스턴스의 인스턴스 어트리뷰트에서 가져옵니다. 최종 줄 바꿈이 없는 출력 줄의 리스트를 반환합니다. 래핑 된 출력에 내용이 없으면 반환된 리스트는 비어 있습니다.
@end deffn

@geindex fill() (textwrap.TextWrapper 메서드)
@anchor{library/textwrap textwrap TextWrapper fill}@anchor{27ec}
@deffn {메서드} fill (text)

`text'에 있는 단일 문단을 래핑하고, 래핑 된 문단을 포함하는 단일 문자열을 반환합니다.
@end deffn
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node unicodedata — 유니코드 데이터베이스,stringprep — 인터넷 문자열 준비,textwrap — 텍스트 래핑과 채우기,텍스트 처리 서비스
@anchor{library/unicodedata doc}@anchor{27ed}@anchor{library/unicodedata module-unicodedata}@anchor{10b}@anchor{library/unicodedata translation-repo}@anchor{27ee}@anchor{library/unicodedata unicodedata-unicode-database}@anchor{27ef}
@subsection @code{unicodedata} — 유니코드 데이터베이스


@geindex module; unicodedata

@geindex 유니코드
@geindex 문자
@geindex 유니코드;데이터베이스


__________________________________________________________________


This module provides access to the Unicode Character Database (UCD) which
defines character properties for all Unicode characters. The data contained in
this database is compiled from the UCD version 16.0.0@footnote{https://www.unicode.org/Public/16.0.0/ucd}.

모듈은 유니코드 표준 부속서 #44, "유니코드 문자 데이터베이스"@footnote{https://www.unicode.org/reports/tr44/}에 정의된 것과 같은 이름과 기호를 사용합니다. 다음과 같은 함수를 정의합니다:


@subsubheading 더 보기


The @ref{14a9,,유니코드 HOWTO} for more information about Unicode and how to use
this module.


@geindex lookup() (unicodedata 모듈)
@anchor{library/unicodedata unicodedata lookup}@anchor{1277}
@deffn {함수} unicodedata.lookup (name)

Look up character by name.  If a character with the given name is found, return
the corresponding character.  If not found, @ref{5e5,,KeyError} is raised.
For example:

@example
>>> unicodedata.lookup('LEFT CURLY BRACKET')
'@{'
@end example

The characters returned by this function are the same as those produced by
@code{\N} escape sequence in string literals. For example:

@example
>>> unicodedata.lookup('MIDDLE DOT') == '\N@{MIDDLE DOT@}'
True
@end example


버전 3.3에서 변경: 이름 별칭 @footnote{
@indicateurl{https://www.unicode.org/Public/16.0.0/ucd/NameAliases.txt}
} 과 명명된 시퀀스 @footnote{
@indicateurl{https://www.unicode.org/Public/16.0.0/ucd/NamedSequences.txt}
} 가 추가되었습니다.

@end deffn

@geindex name() (unicodedata 모듈)
@anchor{library/unicodedata unicodedata name}@anchor{27f0}
@deffn {함수} unicodedata.name (chr, default=None, /)

Returns the name assigned to the character `chr' as a string. If no
name is defined, `default' is returned, or, if not given, @ref{2ec,,ValueError} is
raised. For example:

@example
>>> unicodedata.name('½')
'VULGAR FRACTION ONE HALF'
>>> unicodedata.name('\uFFFF', 'fallback')
'fallback'
@end example
@end deffn

@geindex decimal() (unicodedata 모듈)
@anchor{library/unicodedata unicodedata decimal}@anchor{27f1}
@deffn {함수} unicodedata.decimal (chr, default=None, /)

Returns the decimal value assigned to the character `chr' as integer.
If no such value is defined, `default' is returned, or, if not given,
@ref{2ec,,ValueError} is raised. For example:

@example
>>> unicodedata.decimal('\N@{ARABIC-INDIC DIGIT NINE@}')
9
>>> unicodedata.decimal('\N@{SUPERSCRIPT NINE@}', -1)
-1
@end example
@end deffn

@geindex digit() (unicodedata 모듈)
@anchor{library/unicodedata unicodedata digit}@anchor{27f2}
@deffn {함수} unicodedata.digit (chr, default=None, /)

Returns the digit value assigned to the character `chr' as integer.
If no such value is defined, `default' is returned, or, if not given,
@ref{2ec,,ValueError} is raised:

@example
>>> unicodedata.digit('\N@{SUPERSCRIPT NINE@}')
9
@end example
@end deffn

@geindex numeric() (unicodedata 모듈)
@anchor{library/unicodedata unicodedata numeric}@anchor{1467}
@deffn {함수} unicodedata.numeric (chr, default=None, /)

Returns the numeric value assigned to the character `chr' as float.
If no such value is defined, `default' is returned, or, if not given,
@ref{2ec,,ValueError} is raised:

@example
>>> unicodedata.numeric('½')
0.5
@end example
@end deffn

@geindex category() (unicodedata 모듈)
@anchor{library/unicodedata unicodedata category}@anchor{27f3}
@deffn {함수} unicodedata.category (chr)

Returns the general category assigned to the character `chr' as
string. General category names consist of two letters.
See the General Category Values section of the Unicode Character Database documentation@footnote{https://www.unicode.org/reports/tr44/tr44-34.html#General_Category_Values}
for a list of category codes. For example:

@example
>>> unicodedata.category('A')  # 'L'etter, 'u'ppercase
'Lu'
@end example
@end deffn

@geindex bidirectional() (unicodedata 모듈)
@anchor{library/unicodedata unicodedata bidirectional}@anchor{27f4}
@deffn {함수} unicodedata.bidirectional (chr)

Returns the bidirectional class assigned to the character `chr' as
string. If no such value is defined, an empty string is returned.
See the Bidirectional Class Values section of the Unicode Character Database@footnote{https://www.unicode.org/reports/tr44/tr44-34.html#Bidi_Class_Values}
documentation for a list of bidirectional codes. For example:

@example
>>> unicodedata.bidirectional('\N@{ARABIC-INDIC DIGIT SEVEN@}') # 'A'rabic, 'N'umber
'AN'
@end example
@end deffn

@geindex combining() (unicodedata 모듈)
@anchor{library/unicodedata unicodedata combining}@anchor{27f5}
@deffn {함수} unicodedata.combining (chr)

Returns the canonical combining class assigned to the character `chr'
as integer. Returns @code{0} if no combining class is defined.
See the Canonical Combining Class Values section of the Unicode Character Database@footnote{https://www.unicode.org/reports/tr44/tr44-34.html#Canonical_Combining_Class_Values}
for more information.
@end deffn

@geindex east_asian_width() (unicodedata 모듈)
@anchor{library/unicodedata unicodedata east_asian_width}@anchor{27f6}
@deffn {함수} unicodedata.east_asian_width (chr)

Returns the east asian width assigned to the character `chr' as
string. For a list of widths and or more information, see the
Unicode Standard Annex #11@footnote{https://www.unicode.org/reports/tr11/tr11-43.html}.
@end deffn

@geindex mirrored() (unicodedata 모듈)
@anchor{library/unicodedata unicodedata mirrored}@anchor{27f7}
@deffn {함수} unicodedata.mirrored (chr)

Returns the mirrored property assigned to the character `chr' as
integer. Returns @code{1} if the character has been identified as a “mirrored”
character in bidirectional text, @code{0} otherwise. For example:

@example
>>> unicodedata.mirrored('>')
1
@end example
@end deffn

@geindex decomposition() (unicodedata 모듈)
@anchor{library/unicodedata unicodedata decomposition}@anchor{1765}
@deffn {함수} unicodedata.decomposition (chr)

Returns the character decomposition mapping assigned to the character
`chr' as string. An empty string is returned in case no such mapping is
defined. For example:

@example
>>> unicodedata.decomposition('Ã')
'0041 0303'
@end example
@end deffn

@geindex normalize() (unicodedata 모듈)
@anchor{library/unicodedata unicodedata normalize}@anchor{8e3}
@deffn {함수} unicodedata.normalize (form, unistr)

유니코드 문자열 `unistr'에 대한 정규화 형식(normal form) `form'을 반환합니다. `form'의 유효한 값은 ‘NFC’, ‘NFKC’, ‘NFD’ 및 ‘NFKD’ 입니다.

유니코드 표준은 정준 동등성(canonical equivalence) 및 호환 동등성(compatibility equivalence)의 정의를 기반으로, 유니코드 문자열의 다양한 정규화 형식을 정의합니다. 유니코드에서, 여러 문자를 다양한 방법으로 표현할 수 있습니다. 예를 들어, U+00C7 (LATIN CAPITAL LETTER C WITH CEDILLA) 은 시퀀스 U+0043 (LATIN CAPITAL LETTER C) U+0327 (COMBINING CEDILLA) 로도 표현할 수 있습니다.

각 문자에는, 두 개의 정규화 형식이 있습니다: 정규화 형식 C와 정규화 형식 D. 정규화 형식 D(NFD)는 정준 분해라고도 하며, 각 문자를 분해된 형식으로 변환합니다. 정규화 형식 C(NFC)는 먼저 정준 분해를 적용한 다음, 미리 결합한 문자로 다시 조합합니다.

In addition to these two forms, there are two additional normal forms based on
compatibility equivalence. In Unicode, certain characters are supported which
normally would be unified with other characters. For example, U+2160 (ROMAN
NUMERAL ONE) is really the same thing as U+0049 (LATIN CAPITAL LETTER I).
However, it is supported in Unicode for compatibility with existing character
sets (for example, gb2312).

The normal form KD (NFKD) will apply the compatibility decomposition, that is,
replace all compatibility characters with their equivalents. The normal form KC
(NFKC) first applies the compatibility decomposition, followed by the canonical
composition.

두 개의 유니코드 문자열이 정규화되고, 사람이 보기에 같아 보여도, 하나가 결합한 문자를 갖고 다른 것은 그렇지 않으면, 같다고 비교되지 않을 수 있습니다.
@end deffn

@geindex is_normalized() (unicodedata 모듈)
@anchor{library/unicodedata unicodedata is_normalized}@anchor{c3b}
@deffn {함수} unicodedata.is_normalized (form, unistr)

유니코드 문자열 `unistr'이 정규화 형식 `form'인지를 반환합니다. `form'의 유효한 값은 ‘NFC’, ‘NFKC’, ‘NFD’ 및 ‘NFKD’ 입니다.


Added in version 3.8.

@end deffn

또한, 이 모듈은 다음 상수를 노출합니다:

@geindex unidata_version (unicodedata 모듈)
@anchor{library/unicodedata unicodedata unidata_version}@anchor{27f8}
@deffn {데이터} unicodedata.unidata_version

이 모듈에 사용된 유니코드 데이터베이스의 버전.
@end deffn

@geindex ucd_3_2_0 (unicodedata 모듈)
@anchor{library/unicodedata unicodedata ucd_3_2_0}@anchor{1639}
@deffn {데이터} unicodedata.ucd_3_2_0

이것은 전체 모듈과 같은 메서드를 가지고 있는 객체이지만, 유니코드 데이터베이스 버전 3.2를 대신 사용합니다. 이 특정 버전의 유니코드 데이터베이스가 필요한 응용 프로그램(가령 IDNA)을 위한 것입니다.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node stringprep — 인터넷 문자열 준비,readline — GNU readline 인터페이스,unicodedata — 유니코드 데이터베이스,텍스트 처리 서비스
@anchor{library/stringprep doc}@anchor{27f9}@anchor{library/stringprep module-stringprep}@anchor{da}@anchor{library/stringprep stringprep-internet-string-preparation}@anchor{27fa}@anchor{library/stringprep translation-repo}@anchor{27fb}
@subsection @code{stringprep} — 인터넷 문자열 준비


@geindex module; stringprep

`소스 코드:' Lib/stringprep.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/stringprep.py}


__________________________________________________________________


인터넷에서 무언가(가령 호스트 이름)를 식별할 때, 종종 그러한 식별에 대해 “동등” 비교할 필요가 있습니다. 이 비교가 실행되는 정확한 방법은 응용 프로그램 도메인에 따라 달라질 수 있습니다, 예를 들어 대/소문자를 구분하는지 그렇지 않은지. 또한 “인쇄 가능” 문자로만 구성된 식별만 허용하기 위해, 가능한 식별을 제한해야 할 수도 있습니다.

@geindex RFC; RFC 3454
RFC 3454@footnote{https://datatracker.ietf.org/doc/html/rfc3454.html}는 인터넷 프로토콜에서 유니코드 문자열을 “준비” 하는 절차를 정의합니다. 문자열을 전선에 전달하기 전에, 준비 절차를 통해 문자열을 처리해서 어떤 정규화된 형식을 갖도록 만듭니다. RFC는 프로파일로 결합할 수 있는 테이블 집합을 정의합니다. 각 프로파일은 사용하는 테이블과 @code{stringprep} 절차의 어떤 선택적 부분이 프로파일 일부인지 정의해야 합니다. @code{stringprep} 프로파일의 한 가지 예는 국제화된 도메인 이름에 사용되는 @code{nameprep}입니다.

The module @code{stringprep} only exposes the tables from 
@geindex RFC; RFC 3454
RFC 3454@footnote{https://datatracker.ietf.org/doc/html/rfc3454.html}. As these
tables would be very large to represent as dictionaries or lists, the
module uses the Unicode character database internally. The module source code
itself was generated using the @code{mkstringprep.py} utility.

As a result, these tables are exposed as functions, not as data structures.
There are two kinds of tables in the RFC: sets and mappings. For a set,
@code{stringprep} provides the “characteristic function”, i.e. a function that
returns @code{True} if the parameter is part of the set. For mappings, it provides the
mapping function: given the key, it returns the associated value. Below is a
list of all functions available in the module.

@geindex in_table_a1() (stringprep 모듈)
@anchor{library/stringprep stringprep in_table_a1}@anchor{27fc}
@deffn {함수} stringprep.in_table_a1 (code)

`code'가 tableA.1(유니코드 3.2에서 지정되지 않은 코드 포인트)에 있는지 판별합니다.
@end deffn

@geindex in_table_b1() (stringprep 모듈)
@anchor{library/stringprep stringprep in_table_b1}@anchor{27fd}
@deffn {함수} stringprep.in_table_b1 (code)

`code'가 tableB.1(일반적으로 아무것도 매핑되지 않습니다)에 있는지 판별합니다.
@end deffn

@geindex map_table_b2() (stringprep 모듈)
@anchor{library/stringprep stringprep map_table_b2}@anchor{27fe}
@deffn {함수} stringprep.map_table_b2 (code)

tableB.2(NFKC와 함께 사용되는 케이스 폴딩용 매핑)에 따라 `code'의 매핑 된 값을 반환합니다.
@end deffn

@geindex map_table_b3() (stringprep 모듈)
@anchor{library/stringprep stringprep map_table_b3}@anchor{27ff}
@deffn {함수} stringprep.map_table_b3 (code)

tableB.3(정규화가 없는 케이스 폴딩용 매핑)에 따라 `code'의 매핑 된 값을 반환합니다.
@end deffn

@geindex in_table_c11() (stringprep 모듈)
@anchor{library/stringprep stringprep in_table_c11}@anchor{2800}
@deffn {함수} stringprep.in_table_c11 (code)

`code'가 tableC.1.1(ASCII 스페이스 문자)에 있는지 판별합니다.
@end deffn

@geindex in_table_c12() (stringprep 모듈)
@anchor{library/stringprep stringprep in_table_c12}@anchor{2801}
@deffn {함수} stringprep.in_table_c12 (code)

`code'가 tableC.1.2(비 ASCII 스페이스 문자)에 있는지 판별합니다.
@end deffn

@geindex in_table_c11_c12() (stringprep 모듈)
@anchor{library/stringprep stringprep in_table_c11_c12}@anchor{2802}
@deffn {함수} stringprep.in_table_c11_c12 (code)

`code'가 tableC.1(스페이스 문자, C.1.1과 C.1.2의 합집합)에 있는지 판별합니다.
@end deffn

@geindex in_table_c21() (stringprep 모듈)
@anchor{library/stringprep stringprep in_table_c21}@anchor{2803}
@deffn {함수} stringprep.in_table_c21 (code)

`code'가 tableC.2.1(ASCII 제어 문자)에 있는지 판별합니다.
@end deffn

@geindex in_table_c22() (stringprep 모듈)
@anchor{library/stringprep stringprep in_table_c22}@anchor{2804}
@deffn {함수} stringprep.in_table_c22 (code)

`code'가 tableC.2.2(비 ASCII 제어 문자)에 있는지 판별합니다.
@end deffn

@geindex in_table_c21_c22() (stringprep 모듈)
@anchor{library/stringprep stringprep in_table_c21_c22}@anchor{2805}
@deffn {함수} stringprep.in_table_c21_c22 (code)

`code'가 tableC.2(제어 문자, C.2.1과 C.2.2의 합집합)에 있는지 판별합니다.
@end deffn

@geindex in_table_c3() (stringprep 모듈)
@anchor{library/stringprep stringprep in_table_c3}@anchor{2806}
@deffn {함수} stringprep.in_table_c3 (code)

`code'가 tableC.3(개인 사용)에 있는지 판별합니다.
@end deffn

@geindex in_table_c4() (stringprep 모듈)
@anchor{library/stringprep stringprep in_table_c4}@anchor{2807}
@deffn {함수} stringprep.in_table_c4 (code)

`code'가 tableC.4(비문자 코드 포인트)에 있는지 판별합니다.
@end deffn

@geindex in_table_c5() (stringprep 모듈)
@anchor{library/stringprep stringprep in_table_c5}@anchor{2808}
@deffn {함수} stringprep.in_table_c5 (code)

`code'가 tableC.5(대리 코드)에 있는지 판별합니다.
@end deffn

@geindex in_table_c6() (stringprep 모듈)
@anchor{library/stringprep stringprep in_table_c6}@anchor{2809}
@deffn {함수} stringprep.in_table_c6 (code)

`code'가 tableC.6(일반 텍스트에는 부적절)에 있는지 판별합니다.
@end deffn

@geindex in_table_c7() (stringprep 모듈)
@anchor{library/stringprep stringprep in_table_c7}@anchor{280a}
@deffn {함수} stringprep.in_table_c7 (code)

`code'가 tableC.7(규범적 표현에는 부적절)에 있는지 판별합니다.
@end deffn

@geindex in_table_c8() (stringprep 모듈)
@anchor{library/stringprep stringprep in_table_c8}@anchor{280b}
@deffn {함수} stringprep.in_table_c8 (code)

`code'가 tableC.8(표시 특성 변경 또는 폐지)에 있는지 판별합니다.
@end deffn

@geindex in_table_c9() (stringprep 모듈)
@anchor{library/stringprep stringprep in_table_c9}@anchor{280c}
@deffn {함수} stringprep.in_table_c9 (code)

`code'가 tableC.9(문자 태깅)에 있는지 판별합니다.
@end deffn

@geindex in_table_d1() (stringprep 모듈)
@anchor{library/stringprep stringprep in_table_d1}@anchor{280d}
@deffn {함수} stringprep.in_table_d1 (code)

`code'가 tableD.1(양방향 특성이 “R”이나 “AL”인 문자)에 있는지 판별합니다.
@end deffn

@geindex in_table_d2() (stringprep 모듈)
@anchor{library/stringprep stringprep in_table_d2}@anchor{280e}
@deffn {함수} stringprep.in_table_d2 (code)

`code'가 tableD.2(양방향 특성이 “L”인 문자)에 있는지 판별합니다.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node readline — GNU readline 인터페이스,rlcompleter — GNU readline을 위한 완성 함수,stringprep — 인터넷 문자열 준비,텍스트 처리 서비스
@anchor{library/readline doc}@anchor{280f}@anchor{library/readline module-readline}@anchor{bf}@anchor{library/readline readline-gnu-readline-interface}@anchor{2810}@anchor{library/readline translation-repo}@anchor{2811}
@subsection @code{readline} — GNU readline 인터페이스


@geindex module; readline


__________________________________________________________________


The @code{readline} module defines a number of functions to facilitate
completion and reading/writing of history files from the Python interpreter.
This module can be used directly, or via the @ref{c2,,rlcompleter} module, which
supports completion of Python identifiers at the interactive prompt.  Settings
made using  this module affect the behaviour of both the interpreter’s
interactive prompt  and the prompts offered by the built-in @ref{14dd,,input()}
function.

Readline 키 바인딩은 초기화 파일을 통해 구성할 수 있습니다, 일반적으로 홈 디렉터리의 @code{.inputrc}. 이 파일의 형식과 허용되는 구성 및 Readline 라이브러리의 기능에 대한 일반적인 정보는 GNU Readline 매뉴얼의 Readline Init File@footnote{https://tiswww.cwru.edu/php/chet/readline/rluserman.html#Readline-Init-File}을 참조하십시오.

@c include for modules that don't work on WASM or mobile platforms

@ref{213c,,가용성}: not Android, not iOS, not WASI.

이 모듈은 @ref{2259,,모바일 플랫폼}이나 @ref{1b68,,웹어셈블리 플랫폼}에서 지원되지 않습니다.

This is an @ref{2157,,optional module}.
If it is missing from your copy of CPython,
look for documentation from your distributor (that is,
whoever provided Python to you).
If you are the distributor, see @ref{2155,,Requirements for optional modules}.

@c Similar notes appear in the docs of the modules:
@c - zipfile
@c - tarfile

@ref{213c,,가용성}: Unix.

@cartouche
@quotation 참고 
The underlying Readline library API may be implemented by
the @code{editline} (@code{libedit}) library instead of GNU readline.
On macOS the @code{readline} module detects which library is being used
at run time.

@code{editline}의 구성 파일은 GNU readline의 구성 파일과 다릅니다. 프로그래밍 방식으로 구성 문자열을 로드하는 경우 어떤 라이브러리가 사용되고 있는지 @ref{1a27,,backend}를 사용하여 확인할 수 있습니다.

macOS에서 @code{editline}/@code{libedit} readline 에뮬레이션을 사용하는 경우, 홈 디렉터리에 있는 초기화 파일의 이름은 @code{.editrc}입니다. 예를 들어, @code{~/.editrc}의 다음 내용은 `vi' 키 바인딩과 TAB 완성을 켭니다:

@example
python:bind -v
python:bind ^I rl_complete
@end example

Also note that different libraries may use different history file formats.
When switching the underlying library, existing history files may become
unusable.
@end quotation
@end cartouche

@geindex backend (readline 모듈)
@anchor{library/readline readline backend}@anchor{1a27}
@deffn {데이터} readline.backend

The name of the underlying Readline library being used, either
@code{"readline"} or @code{"editline"}.


Added in version 3.13.

@end deffn

@menu
* 초기화 파일:: 
* 줄 버퍼:: 
* 히스토리 파일:: 
* 히스토리 목록:: 
* 시동 훅:: 
* 완성:: 
* 예제:: 

@end menu

@node 초기화 파일,줄 버퍼,,readline — GNU readline 인터페이스
@anchor{library/readline init-file}@anchor{2812}
@subsubsection 초기화 파일


다음 함수는 초기화 파일 및 사용자 구성과 관련이 있습니다:

@geindex parse_and_bind() (readline 모듈)
@anchor{library/readline readline parse_and_bind}@anchor{2813}
@deffn {함수} readline.parse_and_bind (string)

`string' 인자에 제공된 초기화 줄을 실행합니다. 하부 라이브러리에서 @code{rl_parse_and_bind()}를 호출합니다.
@end deffn

@geindex read_init_file() (readline 모듈)
@anchor{library/readline readline read_init_file}@anchor{17df}
@deffn {함수} readline.read_init_file ([filename])

Execute a readline initialization file. The default filename is the last filename
used. This calls @code{rl_read_init_file()} in the underlying library.
It raises an @ref{1c6c,,auditing event} @code{open} with the file name
if given, and @code{"<readline_init_file>"} otherwise, regardless of
which file the library resolves.


버전 3.14에서 변경: The auditing event was added.

@end deffn

@node 줄 버퍼,히스토리 파일,초기화 파일,readline — GNU readline 인터페이스
@anchor{library/readline line-buffer}@anchor{2814}
@subsubsection 줄 버퍼


다음 함수는 라인 버퍼에 대해 작용합니다:

@geindex get_line_buffer() (readline 모듈)
@anchor{library/readline readline get_line_buffer}@anchor{2815}
@deffn {함수} readline.get_line_buffer ()

줄 버퍼의 현재 내용(하부 라이브러리의 @code{rl_line_buffer})을 반환합니다.
@end deffn

@geindex insert_text() (readline 모듈)
@anchor{library/readline readline insert_text}@anchor{2816}
@deffn {함수} readline.insert_text (string)

줄 버퍼의 커서 위치에 텍스트를 삽입합니다. 하부 라이브러리에서 @code{rl_insert_text()}를 호출하지만, 반환 값은 무시합니다.
@end deffn

@geindex redisplay() (readline 모듈)
@anchor{library/readline readline redisplay}@anchor{16ca}
@deffn {함수} readline.redisplay ()

줄 버퍼의 현재 내용을 반영하도록 화면에 표시되는 내용을 변경합니다. 하부 라이브러리에서 @code{rl_redisplay()}를 호출합니다.
@end deffn

@node 히스토리 파일,히스토리 목록,줄 버퍼,readline — GNU readline 인터페이스
@anchor{library/readline history-file}@anchor{2817}
@subsubsection 히스토리 파일


다음 함수는 히스토리 파일에 대해 작용합니다:

@geindex read_history_file() (readline 모듈)
@anchor{library/readline readline read_history_file}@anchor{17e0}
@deffn {함수} readline.read_history_file ([filename])

Load a readline history file, and append it to the history list.
The default filename is @code{~/.history}.  This calls
@code{read_history()} in the underlying library
and raises an @ref{1c6c,,auditing event} @code{open} with the file
name if given and @code{"~/.history"} otherwise.


버전 3.14에서 변경: The auditing event was added.

@end deffn

@geindex write_history_file() (readline 모듈)
@anchor{library/readline readline write_history_file}@anchor{17e1}
@deffn {함수} readline.write_history_file ([filename])

Save the history list to a readline history file, overwriting any
existing file.  The default filename is @code{~/.history}.  This calls
@code{write_history()} in the underlying library and raises an
@ref{1c6c,,auditing event} @code{open} with the file name if given and
@code{"~/.history"} otherwise.


버전 3.14에서 변경: The auditing event was added.

@end deffn

@geindex append_history_file() (readline 모듈)
@anchor{library/readline readline append_history_file}@anchor{1050}
@deffn {함수} readline.append_history_file (nelements[, filename])

Append the last `nelements' items of history to a file.  The default filename is
@code{~/.history}.  The file must already exist.  This calls
@code{append_history()} in the underlying library.  This function
only exists if Python was compiled for a version of the library
that supports it. It raises an @ref{1c6c,,auditing event} @code{open}
with the file name if given and @code{"~/.history"} otherwise.


Added in version 3.5.



버전 3.14에서 변경: The auditing event was added.

@end deffn

@geindex get_history_length() (readline 모듈)
@geindex set_history_length() (readline 모듈)
@anchor{library/readline readline get_history_length}@anchor{2818}
@deffn {함수} readline.get_history_length ()
@anchor{library/readline readline set_history_length}@anchor{1927}
@deffnx {함수} readline.set_history_length (length)

히스토리 파일에 저장하기 원하는 줄 수를 설정하거나 반환합니다. @ref{17e1,,write_history_file()} 함수는 이 값을 사용하여, 하부 라이브러리에서 @code{history_truncate_file()}을 호출하여 히스토리 파일을 자릅니다. 음수 값은 제한 없는 히스토리 파일 크기를 의미합니다.
@end deffn

@node 히스토리 목록,시동 훅,히스토리 파일,readline — GNU readline 인터페이스
@anchor{library/readline history-list}@anchor{2819}
@subsubsection 히스토리 목록


다음 함수는 전역 히스토리 목록에 대해 작용합니다:

@geindex clear_history() (readline 모듈)
@anchor{library/readline readline clear_history}@anchor{281a}
@deffn {함수} readline.clear_history ()

현재 히스토리를 지웁니다. 하부 라이브러리에서 @code{clear_history()}를 호출합니다. 파이썬 함수는 파이썬이 이를 지원하는 라이브러리 버전으로 컴파일된 경우에만 존재합니다.
@end deffn

@geindex get_current_history_length() (readline 모듈)
@anchor{library/readline readline get_current_history_length}@anchor{16c9}
@deffn {함수} readline.get_current_history_length ()

현재 히스토리에 있는 항목 수를 반환합니다. (이것은 히스토리 파일에 기록될 최대 줄 수를 반환하는 @ref{2818,,get_history_length()}와 다릅니다.)
@end deffn

@geindex get_history_item() (readline 모듈)
@anchor{library/readline readline get_history_item}@anchor{16c8}
@deffn {함수} readline.get_history_item (index)

`index'에 있는 히스토리 항목의 현재 내용을 반환합니다. 항목 인덱스는 1부터 시작합니다. 하부 라이브러리에서 @code{history_get()}을 호출합니다.
@end deffn

@geindex remove_history_item() (readline 모듈)
@anchor{library/readline readline remove_history_item}@anchor{281b}
@deffn {함수} readline.remove_history_item (pos)

히스토리에서 위치(pos)로 지정된 히스토리 항목을 제거합니다. 위치는 0부터 시작합니다. 하부 라이브러리에서 @code{remove_history()}를 호출합니다.
@end deffn

@geindex replace_history_item() (readline 모듈)
@anchor{library/readline readline replace_history_item}@anchor{281c}
@deffn {함수} readline.replace_history_item (pos, line)

위치(pos)로 지정된 히스토리 항목을 `line'으로 교체합니다. 위치는 0부터 시작합니다. 하부 라이브러리에서 @code{replace_history_entry()}를 호출합니다.
@end deffn

@geindex add_history() (readline 모듈)
@anchor{library/readline readline add_history}@anchor{281d}
@deffn {함수} readline.add_history (line)

마지막 줄이 입력된 것처럼 히스토리 버퍼에 `line'을 추가합니다. 하부 라이브러리에서 @code{add_history()}를 호출합니다.
@end deffn

@geindex set_auto_history() (readline 모듈)
@anchor{library/readline readline set_auto_history}@anchor{ec4}
@deffn {함수} readline.set_auto_history (enabled)

readline을 통해 입력을 읽을 때 @code{add_history()}에 대한 자동 호출을 활성화 또는 비활성화합니다. `enabled' 인자는 참일 때 자동 히스토리를 활성화하고, 거짓일 때 자동 기록을 비활성화하는 불리언 값이어야 합니다.


Added in version 3.6.


`CPython 구현 상세:' Auto history is enabled by default, and changes to this do not persist
across multiple sessions.
@end deffn

@node 시동 훅,완성,히스토리 목록,readline — GNU readline 인터페이스
@anchor{library/readline startup-hooks}@anchor{281e}
@subsubsection 시동 훅


@geindex set_startup_hook() (readline 모듈)
@anchor{library/readline readline set_startup_hook}@anchor{281f}
@deffn {함수} readline.set_startup_hook ([function])

하부 라이브러리의 @code{rl_startup_hook} 콜백에 의해 호출되는 함수를 설정하거나 제거합니다. `function'이 지정되면 새 훅(hook) 함수로 사용됩니다; 생략되거나 @code{None}이면, 이미 설치된 함수가 제거됩니다. 이 훅은 readline이 첫 번째 프롬프트를 인쇄하기 직전에 인자 없이 호출됩니다.
@end deffn

@geindex set_pre_input_hook() (readline 모듈)
@anchor{library/readline readline set_pre_input_hook}@anchor{2820}
@deffn {함수} readline.set_pre_input_hook ([function])

하부 라이브러리의 @code{rl_pre_input_hook} 콜백에 의해 호출되는 함수를 설정하거나 제거합니다. `function'이 지정되면, 새 훅 함수로 사용됩니다; 생략되거나 @code{None}이면, 이미 설치된 함수가 제거됩니다. 이 훅은 첫 번째 프롬프트가 인쇄된 후 readline이 입력 문자를 읽기 시작하기 직전에 인자 없이 호출됩니다. 이 함수는 파이썬이 이를 지원하는 라이브러리 버전으로 컴파일된 경우에만 존재합니다.
@end deffn

@node 완성,예제,시동 훅,readline — GNU readline 인터페이스
@anchor{library/readline completion}@anchor{2821}@anchor{library/readline readline-completion}@anchor{2822}
@subsubsection 완성


The following functions relate to implementing a custom word completion
function.  This is typically operated by the Tab key, and can suggest and
automatically complete a word being typed.  By default, Readline is set up
to be used by @ref{c2,,rlcompleter} to complete Python identifiers for
the interactive interpreter.  If the @code{readline} module is to be used
with a custom completer, a different set of word delimiters should be set.

@geindex set_completer() (readline 모듈)
@anchor{library/readline readline set_completer}@anchor{2823}
@deffn {함수} readline.set_completer ([function])

완성 함수를 설정하거나 제거합니다. `function'이 지정되면 새 완성 함수로 사용됩니다; 생략하거나 @code{None}이면, 이미 설치된 완성 함수가 제거됩니다. 완성 함수는 문자열이 아닌 값을 반환할 때까지 @code{0}, @code{1}, @code{2} 등의 `state'에 대해 @code{function(text, state)}로 호출됩니다. `text'로 시작하는 다음으로 가능한 완성을 반환해야 합니다.

설치된 완성 함수는 하부 라이브러리의 @code{rl_completion_matches()}로 전달된 `entry_func' 콜백에 의해 호출됩니다. `text' 문자열은 하부 라이브러리의 @code{rl_attempted_completion_function} 콜백의 첫 번째 매개 변수로부터 옵니다.
@end deffn

@geindex get_completer() (readline 모듈)
@anchor{library/readline readline get_completer}@anchor{2824}
@deffn {함수} readline.get_completer ()

완성 함수나, 완성 함수가 설정되지 않았으면 @code{None}을 얻습니다.
@end deffn

@geindex get_completion_type() (readline 모듈)
@anchor{library/readline readline get_completion_type}@anchor{2825}
@deffn {함수} readline.get_completion_type ()

시도 중인 완성 유형을 가져옵니다. 하부 라이브러리의 @code{rl_completion_type} 변수를 정수로 반환합니다.
@end deffn

@geindex get_begidx() (readline 모듈)
@geindex get_endidx() (readline 모듈)
@anchor{library/readline readline get_begidx}@anchor{1ca1}
@deffn {함수} readline.get_begidx ()
@anchor{library/readline readline get_endidx}@anchor{1ca2}
@deffnx {함수} readline.get_endidx ()

완성 범위(completion scope)의 시작이나 끝 인덱스를 가져옵니다. 이 인덱스는 하부 라이브러리의 @code{rl_attempted_completion_function} 콜백에 전달된 `start'와 `end' 인자입니다. 같은 입력 편집 시나리오에서 하부 C readline 구현에 따라 값이 다를 수 있습니다. 예: libedit는 libreadline과 다르게 동작하는 것으로 알려져 있습니다.
@end deffn

@geindex set_completer_delims() (readline 모듈)
@geindex get_completer_delims() (readline 모듈)
@anchor{library/readline readline set_completer_delims}@anchor{1a2a}
@deffn {함수} readline.set_completer_delims (string)
@anchor{library/readline readline get_completer_delims}@anchor{2826}
@deffnx {함수} readline.get_completer_delims ()

완성을 위한 단어 구분자를 설정하거나 가져옵니다. 이것들은 완성을 위해 고려할 단어의 시작(완성 범위)을 결정합니다. 이 함수는 하부 라이브러리의 @code{rl_completer_word_break_characters} 변수를 액세스합니다.
@end deffn

@geindex set_completion_display_matches_hook() (readline 모듈)
@anchor{library/readline readline set_completion_display_matches_hook}@anchor{2827}
@deffn {함수} readline.set_completion_display_matches_hook ([function])

완성 표시 함수를 설정하거나 제거합니다. `function'이 지정되면, 새로운 완성 표시 함수로 사용됩니다; 생략하거나 @code{None}이면, 이미 설치된 완성 표시 함수가 제거됩니다. 하부 라이브러리에서 @code{rl_completion_display_matches_hook} 콜백을 설정하거나 지웁니다. 완성 표시 함수는 일치를 표시해야 할 때마다 한 번 @code{function(substitution, [matches], longest_match_length)}로 호출됩니다.
@end deffn

@node 예제,,완성,readline — GNU readline 인터페이스
@anchor{library/readline example}@anchor{2828}@anchor{library/readline readline-example}@anchor{2829}
@subsubsection 예제


The following example demonstrates how to use the @code{readline} module’s
history reading and writing functions to automatically load and save a history
file named @code{.python_history} from the user’s home directory.  The code
below would normally be executed automatically during interactive sessions
from the user’s 
@geindex PYTHONSTARTUP
@geindex 환경 변수; PYTHONSTARTUP
@ref{1b8,,PYTHONSTARTUP} file.

@example
import atexit
import os
import readline

histfile = os.path.join(os.path.expanduser("~"), ".python_history")
try:
    readline.read_history_file(histfile)
    # 기본 히스토리 길이는 -1(무한)이며, 제약 없이 커질 수 있습니다
    readline.set_history_length(1000)
except FileNotFoundError:
    pass

atexit.register(readline.write_history_file, histfile)
@end example

이 코드는 실제로 파이썬이 @ref{443,,대화형 모드}로 실행될 때 자동으로 실행됩니다 (@ref{11c8,,Readline 구성}을 참조하십시오).

다음 예는 같은 목표를 달성하지만 새 히스토리를 덧붙이기만 해서 동시적인(concurrent) 대화형 세션을 지원합니다.

@example
import atexit
import os
import readline
histfile = os.path.join(os.path.expanduser("~"), ".python_history")

try:
    readline.read_history_file(histfile)
    h_len = readline.get_current_history_length()
except FileNotFoundError:
    open(histfile, 'wb').close()
    h_len = 0

def save(prev_h_len, histfile):
    new_h_len = readline.get_current_history_length()
    readline.set_history_length(1000)
    readline.append_history_file(new_h_len - prev_h_len, histfile)
atexit.register(save, h_len, histfile)
@end example

다음 예는 히스토리 저장/복원을 지원하도록 @ref{282a,,code.InteractiveConsole} 클래스를 확장합니다.

@example
import atexit
import code
import os
import readline

class HistoryConsole(code.InteractiveConsole):
    def __init__(self, locals=None, filename="<console>",
                 histfile=os.path.expanduser("~/.console-history")):
        code.InteractiveConsole.__init__(self, locals, filename)
        self.init_history(histfile)

    def init_history(self, histfile):
        readline.parse_and_bind("tab: complete")
        if hasattr(readline, "read_history_file"):
            try:
                readline.read_history_file(histfile)
            except FileNotFoundError:
                pass
            atexit.register(self.save_history, histfile)

    def save_history(self, histfile):
        readline.set_history_length(1000)
        readline.write_history_file(histfile)
@end example

@cartouche
@quotation 참고 
The new @ref{492,,REPL} introduced in version 3.13 doesn’t support readline.
However, readline can still be used by setting the 
@geindex PYTHON_BASIC_REPL
@geindex 환경 변수; PYTHON_BASIC_REPL
@ref{1b6,,PYTHON_BASIC_REPL}
environment variable.
@end quotation
@end cartouche

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node rlcompleter — GNU readline을 위한 완성 함수,,readline — GNU readline 인터페이스,텍스트 처리 서비스
@anchor{library/rlcompleter doc}@anchor{282b}@anchor{library/rlcompleter module-rlcompleter}@anchor{c2}@anchor{library/rlcompleter rlcompleter-completion-function-for-gnu-readline}@anchor{282c}@anchor{library/rlcompleter translation-repo}@anchor{282d}
@subsection @code{rlcompleter} — GNU readline을 위한 완성 함수


@geindex module; rlcompleter

`소스 코드:' Lib/rlcompleter.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/rlcompleter.py}


__________________________________________________________________


@code{rlcompleter} 모듈은 @ref{bf,,readline} 모듈의 @ref{2823,,set_completer()}로 전달하기에 적합한 완성 함수를 정의합니다.

@ref{bf,,readline} 모듈을 사용할 수 있는 유닉스 플랫폼에서 이 모듈이 임포트될 때, @ref{1d28,,Completer} 클래스의 인스턴스가 자동으로 만들어지고, @ref{282e,,complete()} 메서드가 @ref{2822,,readline 완성기}로 설정됩니다. 이 메서드는 유효한 파이썬 @ref{229d,,식별자외 키워드}의 완성을 제공합니다.

예제:

@example
>>> import rlcompleter
>>> import readline
>>> readline.parse_and_bind("tab: complete")
>>> readline. <TAB PRESSED>
readline.__doc__          readline.get_line_buffer(  readline.read_init_file(
readline.__file__         readline.insert_text(      readline.set_completer(
readline.__name__         readline.parse_and_bind(
>>> readline.
@end example

@code{rlcompleter} 모듈은 파이썬의 @ref{443,,대화형 모드}와 함께 사용하도록 설계되었습니다. 파이썬이 @ref{13ad,,-S} 옵션으로 실행되지 않는 한, 모듈은 자동으로 임포트되고 구성됩니다 (@ref{11c8,,Readline 구성}를 보세요).

@ref{bf,,readline}이 없는 플랫폼에서, 이 모듈이 정의하는 @ref{1d28,,Completer} 클래스는 여전히 사용자 정의 목적에 사용될 수 있습니다.

@geindex Completer (rlcompleter 클래스)
@anchor{library/rlcompleter completer-objects}@anchor{282f}@anchor{library/rlcompleter rlcompleter Completer}@anchor{1d28}
@deffn {클래스} rlcompleter.Completer

Completer 객체는 다음과 같은 메서드를 가집니다:

@geindex complete() (rlcompleter.Completer 메서드)
@anchor{library/rlcompleter rlcompleter Completer complete}@anchor{282e}
@deffn {메서드} complete (text, state)

`text'에 대한 가능한 다음 완성을 반환합니다.

When called by the @ref{bf,,readline} module, this method is called
successively with @code{state == 0, 1, 2, ...} until the method returns
@code{None}.

마침표(@code{'.'})가 포함되지 않은 `text'로 호출되면, @ref{1,,__main__}, @ref{13,,builtins} 및 키워드(@ref{88,,keyword} 모듈에서 정의한 대로)에 현재 정의된 이름으로 완성됩니다.

점으로 구분된 이름으로 호출하면, 명백한 부작용(함수는 평가되지 않지만 @ref{6f9,,__getattr__()}에 대한 호출을 만들 수 있습니다)없이 마지막 부분까지 평가하려고 시도하고, 나머지는 @ref{843,,dir()} 함수를 통해 일치하는 것을 찾습니다. 표현식을 평가하는 동안 발생하는 모든 예외는 잡히고, 억제하며 @ref{884,,None}을 반환합니다.
@end deffn
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 바이너리 데이터 서비스,데이터형,텍스트 처리 서비스,파이썬 표준 라이브러리
@anchor{library/binary doc}@anchor{2830}@anchor{library/binary binary-data-services}@anchor{2831}@anchor{library/binary binaryservices}@anchor{2740}@anchor{library/binary translation-repo}@anchor{2832}
@section 바이너리 데이터 서비스


이 장에서 설명하는 모듈은 바이너리 데이터를 다루기 위한 기본 서비스 연산을 제공합니다. 파일 포맷, 네트워크 프로토콜과 관련 있는 바이너리 데이터에 대한 연산은 관련 절에서 설명합니다.

@ref{264e,,텍스트 처리 서비스}에서 설명한 일부 라이브러리는 ASCII 호환 바이너리 형식 (예를 들면, @ref{be,,re}) 또는 모든 바이너리 데이터 (예를 들면, @ref{3b,,difflib})에 사용할 수 있습니다.

또한, 파이썬 내장 바이너리 데이터형에 대한 설명은 @ref{25c4,,바이너리 시퀀스 형 — bytes@comma{} bytearray@comma{} memoryview} 문서를 참고하세요.

@menu
* struct — 패킹 된 바이너리 데이터로 바이트열을 해석:: 
* codecs — 코덱 레지스트리와 베이스 클래스:: 

@end menu

@node struct — 패킹 된 바이너리 데이터로 바이트열을 해석,codecs — 코덱 레지스트리와 베이스 클래스,,바이너리 데이터 서비스
@anchor{library/struct doc}@anchor{2833}@anchor{library/struct struct-interpret-bytes-as-packed-binary-data}@anchor{2834}
@subsection @code{struct} — 패킹 된 바이너리 데이터로 바이트열을 해석


@c from struct import *

@geindex module; struct
@anchor{library/struct module-struct}@anchor{db}
`소스 코드:' Lib/struct.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/struct.py}

@geindex C;구조체
@geindex 패킹;바이너리;데이터


__________________________________________________________________


This module converts between Python values and C structs represented
as Python @ref{192,,bytes} objects.  Compact @ref{2835,,format strings}
describe the intended conversions to/from Python values.
The module’s functions and objects can be used for two largely
distinct applications, data exchange with external sources (files or
network connections), or data transfer between the Python application
and the C layer.

@cartouche
@quotation 참고 
When no prefix character is given, native mode is the default. It
packs or unpacks data based on the platform and compiler on which
the Python interpreter was built.
The result of packing a given C struct includes pad bytes which
maintain proper alignment for the C types involved; similarly,
alignment is taken into account when unpacking.  In contrast, when
communicating data between external sources, the programmer is
responsible for defining byte ordering and padding between elements.
See @ref{2836,,바이트 순서@comma{} 크기 및 정렬} for details.
@end quotation
@end cartouche

Several @code{struct} functions (and methods of @ref{1761,,Struct}) take a `buffer'
argument.  This refers to objects that implement the @ref{260,,버퍼 프로토콜} and
provide either a readable or read-writable buffer.  The most common types used
for that purpose are @ref{192,,bytes} and @ref{344,,bytearray}, but many other types
that can be viewed as an array of bytes implement the buffer protocol, so that
they can be read/filled without additional copying from a @code{bytes} object.

@menu
* 함수와 예외:: 
* 포맷 문자열:: 
* 응용:: 
* 클래스: 클래스<2>. 

@end menu

@node 함수와 예외,포맷 문자열,,struct — 패킹 된 바이너리 데이터로 바이트열을 해석
@anchor{library/struct functions-and-exceptions}@anchor{2837}
@subsubsection 함수와 예외


이 모듈은 다음과 같은 예외와 함수를 정의합니다:

@geindex error
@anchor{library/struct struct error}@anchor{1528}
@deffn {예외} struct.error

여러 상황에서 발생하는 예외; 인자는 무엇이 잘못되었는지 설명하는 문자열입니다.
@end deffn

@geindex pack() (struct 모듈)
@anchor{library/struct struct pack}@anchor{147b}
@deffn {함수} struct.pack (format, v1, v2, ...)

`v1', `v2', … 값을 포함하고 포맷 문자열 `format'에 따라 패킹 된 바이트열 객체를 반환합니다. 인자는 포맷이 요구하는 값과 정확히 일치해야 합니다.
@end deffn

@geindex pack_into() (struct 모듈)
@anchor{library/struct struct pack_into}@anchor{2838}
@deffn {함수} struct.pack_into (format, buffer, offset, v1, v2, ...)

포맷 문자열 `format'에 따라 값 `v1', `v2', … 를 패킹하고 패킹 된 바이트열을 쓰기 가능한 버퍼 `buffer'에 `offset' 위치에서부터 씁니다. `offset'은 필수 인자임에 유의하십시오.
@end deffn

@geindex unpack() (struct 모듈)
@anchor{library/struct struct unpack}@anchor{185d}
@deffn {함수} struct.unpack (format, buffer)

포맷 문자열 `format'에 따라 버퍼 `buffer'(아마도 @code{pack(format, ...)}으로 패킹 된)에서 언 패킹 합니다. 정확히 하나의 항목을 포함하더라도 결과는 튜플입니다. 바이트 단위의 버퍼 크기는 (@ref{1da6,,calcsize()}에 의해 반영되는) 포맷이 요구하는 크기와 일치해야 합니다.
@end deffn

@geindex unpack_from() (struct 모듈)
@anchor{library/struct struct unpack_from}@anchor{2839}
@deffn {함수} struct.unpack_from (format, /, buffer, offset=0)

포맷 문자열 `format'에 따라, `offset' 위치에서 시작하여 `buffer'에서 언 패킹 합니다. 정확히 하나의 항목을 포함하더라도 결과는 튜플입니다. `offset' 위치에서 시작하여 바이트 단위로 측정한 버퍼 크기는 (@ref{1da6,,calcsize()}에 의해 반영되는) 포맷이 요구하는 크기 이상이어야 합니다.
@end deffn

@geindex iter_unpack() (struct 모듈)
@anchor{library/struct struct iter_unpack}@anchor{11be}
@deffn {함수} struct.iter_unpack (format, buffer)

포맷 문자열 `format'에 따라 버퍼 `buffer'에서 이터레이션을 통해 언 패킹 합니다. 이 함수는 모든 내용이 소비될 때까지 버퍼에서 같은 크기의 청크를 읽는 이터레이터를 반환합니다. 바이트 단위의 버퍼 크기는 (@ref{1da6,,calcsize()}에 의해 반영되는) 포맷이 요구하는 크기의 배수여야 합니다.

각 이터레이션은 포맷 문자열에 지정된 대로 튜플을 산출합니다.


Added in version 3.4.

@end deffn

@geindex calcsize() (struct 모듈)
@anchor{library/struct struct calcsize}@anchor{1da6}
@deffn {함수} struct.calcsize (format)

포맷 문자열 `format'에 해당하는 구조체(@code{pack(format, ...)}에 의해 생성되는 바이트열 객체)의 크기를 반환합니다.
@end deffn

@node 포맷 문자열,응용,함수와 예외,struct — 패킹 된 바이너리 데이터로 바이트열을 해석
@anchor{library/struct format-strings}@anchor{283a}@anchor{library/struct struct-format-strings}@anchor{2835}
@subsubsection 포맷 문자열


포맷 문자열은 데이터를 패킹과 언 패킹할 때 데이터 배치를 설명합니다. 이들은 패킹/언 패킹 될 데이터형을 지정하는 @ref{283b,,포맷 문자}로 구축됩니다. 또한, 특수 문자가 @ref{2836,,바이트 순서@comma{} 크기 및 정렬}을 제어합니다. 각 포맷 문자열은 데이터의 전체 속성을 설명하는 선택적 접두사 문자와 실제 데이터 값과 패딩을 설명하는 하나 이상의 포맷 문자로 구성됩니다.

@menu
* 바이트 순서@comma{} 크기 및 정렬: 바이트 순서 크기 및 정렬. 
* 포맷 문자:: 
* 예:: 

@end menu

@node 바이트 순서 크기 및 정렬,포맷 문자,,포맷 문자열
@anchor{library/struct byte-order-size-and-alignment}@anchor{283c}@anchor{library/struct struct-alignment}@anchor{2836}
@subsubsection 바이트 순서, 크기 및 정렬


기본적으로, C형은 기계의 네이티브 형식과 바이트 순서로 표현되며, 필요하면 (C 컴파일러에서 사용하는 규칙에 따라) 패드 바이트로 건너뛰어 적절하게 정렬됩니다. 이 동작은 패킹된 구조체의 바이트가 해당 C 구조체의 메모리 배치와 정확히 일치하도록 선택되었습니다. 네이티브 바이트 순서와 패딩을 사용할지 아니면 표준 포맷을 사용할지는 응용 프로그램에 달려 있습니다.

@geindex @@ (at);struct 포맷 문자열
@geindex = (등호);struct 포맷 문자열
@geindex < (작다);struct 포맷 문자열
@geindex > (크다);struct 포맷 문자열
@geindex ! (느낌표);struct 포맷 문자열

또는, 다음 표에 따라, 포맷 문자열의 첫 번째 문자를 사용하여 패킹 된 데이터의 바이트 순서, 크기 및 정렬을 표시할 수 있습니다:


@multitable {xxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxx} {xxxxxxxxxxxxx} 
@headitem

문자

@tab

바이트 순서

@tab

크기

@tab

정렬

@item

@code{@@}

@tab

네이티브

@tab

네이티브

@tab

네이티브

@item

@code{=}

@tab

네이티브

@tab

표준

@tab

none

@item

@code{<}

@tab

리틀 엔디안

@tab

표준

@tab

none

@item

@code{>}

@tab

빅 엔디안

@tab

표준

@tab

none

@item

@code{!}

@tab

네트워크 (= 빅 엔디안)

@tab

표준

@tab

none

@end multitable


첫 번째 문자가 이들 중 하나가 아니면, @code{'@@'}로 가정합니다.

@cartouche
@quotation 참고 
The number 1023 (@code{0x3ff} in hexadecimal) has the following byte representations:


@itemize *

@item 
@code{03 ff} in big-endian (@code{>})

@item 
@code{ff 03} in little-endian (@code{<})
@end itemize

파이썬 예제:

@example
>>> import struct
>>> struct.pack('>h', 1023)
b'\x03\xff'
>>> struct.pack('<h', 1023)
b'\xff\x03'
@end example
@end quotation
@end cartouche

네이티브 바이트 순서는 호스트 시스템에 따라 빅 엔디안이나 리틀 엔디안입니다. 예를 들어, 인텔 x86, AMD64 (x86-64) 및 애플 M1은 리틀 엔디안입니다; IBM z 와 많은 레거시 아키텍처는 빅 엔디안입니다. 시스템의 엔디안을 확인하려면 @ref{25f8,,sys.byteorder}를 사용하십시오.

네이티브 크기와 정렬은 C 컴파일러의 @code{sizeof} 표현식을 사용하여 결정됩니다. 이것은 항상 네이티브 바이트 순서와 결합합니다.

표준 크기는 포맷 문자에만 의존합니다; @ref{283b,,포맷 문자} 섹션의 표를 참조하십시오.

@code{'@@'}과 @code{'='}의 차이점에 유의하십시오; 둘 다 네이티브 바이트 순서를 사용하지만, 후자는 크기와 정렬이 표준화됩니다.

@code{'!'} 형식은 IETF RFC 1700@footnote{https://datatracker.ietf.org/doc/html/rfc1700}에 정의된 대로 항상 빅 엔디안인 네트워크 바이트 순서를 나타냅니다.

네이티브가 아닌 바이트 순서(강제 바이트 스와핑)를 표시하는 방법은 없습니다; @code{'<'}나 @code{'>'}를 적절히 선택하십시오.

노트:


@enumerate 

@item 
패딩은 연속되는 구조체 멤버 간에만 자동으로 추가됩니다. 인코딩된 구조체의 시작이나 끝에는 패딩이 추가되지 않습니다.

@item 
네이티브가 아닌 크기와 정렬을 사용할 때는 패딩이 추가되지 않습니다, 예를 들어 ‘<’, ‘>’, ‘=’ 및 ‘!’ 에서.

@item 
구조체의 끝을 특정 형의 정렬 요구 사항에 맞추려면, 반복 횟수가 0인 해당 형의 코드로 포맷을 끝내십시오. @ref{283d,,예}를 참조하십시오.
@end enumerate

@node 포맷 문자,예,바이트 순서 크기 및 정렬,포맷 문자열
@anchor{library/struct format-characters}@anchor{283b}@anchor{library/struct id1}@anchor{283e}
@subsubsection 포맷 문자


포맷 문자는 다음과 같은 의미가 있습니다; C와 파이썬 값 사이의 변환은 형을 주면 분명해야 합니다. ‘표준 크기’ 열은 표준 크기를 사용할 때 패킹 된 값의 크기를 바이트 단위로 나타냅니다; 즉, 포맷 문자열이 @code{'<'}, @code{'>'}, @code{'!'} 또는 @code{'='} 중 하나로 시작하는 경우입니다. 네이티브 크기를 사용할 때, 패킹 된 값의 크기는 플랫폼에 따라 다릅니다.


@multitable {xxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxx} 
@headitem

포맷

@tab

C형

@tab

파이썬 형

@tab

표준 크기

@tab

노트

@item

@code{x}

@tab

패드 바이트

@tab

값이 없습니다

@tab

@tab

(7)

@item

@code{c}

@tab

char

@tab

길이가 1인 bytes

@tab

1

@tab

@item

@code{b}

@tab

signed char

@tab

정수

@tab

1

@tab

(1), (2)

@item

@code{B}

@tab

unsigned char

@tab

정수

@tab

1

@tab

(2)

@item

@code{?}

@tab

_Bool

@tab

bool

@tab

1

@tab

(1)

@item

@code{h}

@tab

short

@tab

정수

@tab

2

@tab

(2)

@item

@code{H}

@tab

unsigned short

@tab

정수

@tab

2

@tab

(2)

@item

@code{i}

@tab

int

@tab

정수

@tab

4

@tab

(2)

@item

@code{I}

@tab

unsigned int

@tab

정수

@tab

4

@tab

(2)

@item

@code{l}

@tab

long

@tab

정수

@tab

4

@tab

(2)

@item

@code{L}

@tab

unsigned long

@tab

정수

@tab

4

@tab

(2)

@item

@code{q}

@tab

long long

@tab

정수

@tab

8

@tab

(2)

@item

@code{Q}

@tab

unsigned long long

@tab

정수

@tab

8

@tab

(2)

@item

@code{n}

@tab

@code{ssize_t}

@tab

정수

@tab

@tab

(3)

@item

@code{N}

@tab

@code{size_t}

@tab

정수

@tab

@tab

(3)

@item

@code{e}

@tab

_Float16

@tab

float

@tab

2

@tab

(4), (6)

@item

@code{f}

@tab

float

@tab

float

@tab

4

@tab

(4)

@item

@code{d}

@tab

double

@tab

float

@tab

8

@tab

(4)

@item

@code{F}

@tab

float complex

@tab

complex

@tab

8

@tab

(10)

@item

@code{D}

@tab

double complex

@tab

complex

@tab

16

@tab

(10)

@item

@code{s}

@tab

char[]

@tab

bytes

@tab

@tab

(9)

@item

@code{p}

@tab

char[]

@tab

bytes

@tab

@tab

(8)

@item

@code{P}

@tab

void*

@tab

정수

@tab

@tab

(5)

@end multitable



버전 3.3에서 변경: @code{'n'}과 @code{'N'} 포맷에 대한 지원이 추가되었습니다.



버전 3.6에서 변경: @code{'e'} 포맷에 대한 지원이 추가되었습니다.



버전 3.14에서 변경: Added support for the @code{'F'} and @code{'D'} formats.



@subsubheading 더 보기


The @ref{8,,array} and @ref{283f,,ctypes} modules,
as well as third-party modules like numpy@footnote{https://numpy.org/doc/stable/reference/arrays.interface.html#object.__array_interface__},
use similar – but slightly different – type codes.


노트:


@enumerate 

@item 
@geindex ? (물음표);struct 포맷 문자열

@code{'?'} 변환 코드는 C99 이후의 C 표준이 정의한 _Bool 형에 해당합니다. 표준 모드에서는, 1바이트로 표현됩니다.

@item 
정수 변환 코드 중 하나를 사용하여 정수가 아닌 값을 패킹하려고 할 때, 정수가 아닌 값에 @ref{19e,,__index__()} 메서드가 있으면 패킹 전에 해당 메서드가 호출되어 인자를 정수로 변환합니다.


버전 3.2에서 변경: 정수가 아닌 값에서 @ref{19e,,__index__()} 메서드를 사용하는 것을 추가했습니다.


@item 
@code{'n'}과 @code{'N'} 변환 코드는 (기본값이나 @code{'@@'} 바이트 순서 문자로 선택된) 네이티브 크기에만 사용할 수 있습니다. 표준 크기의 경우, 응용 프로그램에 맞는 다른 정수 포맷을 사용할 수 있습니다.

@item 
@code{'f'}, @code{'d'} 및 @code{'e'} 변환 코드의 경우, 패킹 된 표현은 플랫폼에서 사용하는 부동 소수점 형식과 관계없이 IEEE 754 binary32, binary64 또는 binary16 형식을 사용합니다 (각각 @code{'f'}, @code{'d'} 또는 @code{'e'}).

@item 
@code{'P'} 포맷 문자는 (기본값이나 @code{'@@'} 바이트 순서 문자로 선택된) 네이티브 바이트 순서에만 사용할 수 있습니다. 바이트 순서 문자 @code{'='}는 호스트 시스템에 따라 리틀이나 빅 엔디안 순서를 사용하도록 선택합니다. struct 모듈은 이를 네이티브 순서로 해석하지 않아서, @code{'P'} 형식을 사용할 수 없습니다.

@item 
The IEEE 754 binary16 “half precision” type was introduced in the 2008
revision of the IEEE 754 standard@footnote{https://en.wikipedia.org/wiki/IEEE_754-2008_revision}. It has a sign
bit, a 5-bit exponent and 11-bit precision (with 10 bits explicitly stored),
and can represent numbers between approximately @code{6.1e-05} and @code{6.5e+04}
at full precision. This type is not widely supported by C compilers:
it’s available as _Float16 type, if the compiler supports the Annex H
of the C23 standard.  On a
typical machine, an unsigned short can be used for storage, but not for math
operations. See the Wikipedia page on the half-precision floating-point format@footnote{https://en.wikipedia.org/wiki/Half-precision_floating-point_format} for more information.

@item 
When packing, @code{'x'} inserts one NUL byte.

@item 
@code{'p'} 포맷 문자는 “파스칼 문자열”을 인코딩하는데, 이는 카운트에 의해 주어진 `고정된 바이트 수'에 저장된 짧은 가변 길이 문자열을 의미합니다. 저장된 첫 번째 바이트는 문자열의 길이나 255중 작은 값입니다. 문자열의 바이트가 그 뒤에 옵니다. @ref{147b,,pack()}에 전달된 문자열이 너무 길면 (횟수 빼기 1보다 길면), 문자열의 선행 @code{count-1} 바이트만 저장됩니다. 문자열이 @code{count-1}보다 짧으면, 전부 정확한 바이트 수가 되도록 널 바이트로 채워집니다. @ref{185d,,unpack()}의 경우, @code{'p'} 포맷 문자는 @code{count} 바이트를 소비하지만, 반환된 문자열은 255바이트를 초과할 수 없음에 유의하십시오.

@item 
@code{'s'} 포맷 문자의 경우, 횟수는 다른 포맷 문자와 같은 반복 횟수가 아닌 바이트열의 길이로 해석됩니다; 예를 들어, @code{'10s'}는 단일 파이썬 바이트 문자열과 양 방향 매핑되는 단일 10바이트 문자열을 의미하는 반면에, @code{'10c'}는 10개의 서로 다른 파이썬 바이트 객체와 양 방향 매핑되는 10개의 개별 바이트 문자 요소를 의미합니다 (예를 들어, @code{cccccccccc}). (차이점에 대한 구체적인 시연은 @ref{283d,,예}를 참조하세요.) 횟수를 지정하지 않으면, 기본값은 1입니다. 패킹의 경우, 맞도록 문자열이 잘리거나 널 바이트로 채워집니다. 언 패킹의 경우, 결과 바이트열 객체는 항상 지정된 바이트 수를 갖습니다. 특별한 경우로, @code{'0s'}는 하나의 빈 문자열을 의미합니다(반면에 @code{'0c'}는 0문자를 의미합니다).

@item 
For the @code{'F'} and @code{'D'} format characters, the packed representation uses
the IEEE 754 binary32 and binary64 format for components of the complex
number, regardless of the floating-point format used by the platform.
Note that complex types (@code{F} and @code{D}) are available unconditionally,
despite complex types being an optional feature in C.
As specified in the C11 standard, each complex type is represented by a
two-element C array containing, respectively, the real and imaginary parts.
@end enumerate

포맷 문자 앞에는 정수 반복 횟수가 올 수 있습니다. 예를 들어, 포맷 문자열 @code{'4h'}는 @code{'hhhh'}와 정확히 같습니다.

포맷 사이의 공백 문자는 무시됩니다; 횟수와 형식 사이에는 공백이 없어야 합니다.

정수 형식 (@code{'b'}, @code{'B'}, @code{'h'}, @code{'H'}, @code{'i'}, @code{'I'}, @code{'l'}, @code{'L'}, @code{'q'}, @code{'Q'}) 중 하나를 사용하여 값 @code{x}를 패킹할 때, @code{x}가 해당 포맷의 유효한 범위를 벗어나면 @ref{1528,,struct.error}가 발생합니다.


버전 3.1에서 변경: 이전에는, 일부 정수 포맷은 범위를 벗어난 값을 래핑하고 @ref{1528,,struct.error} 대신 @ref{1a3,,DeprecationWarning}을 발생시켰습니다.


@geindex ? (물음표);struct 포맷 문자열

@code{'?'} 포맷 문자의 경우, 반환 값은 @ref{e06,,True}나 @ref{d2a,,False}입니다. 패킹할 때, 인자 객체의 논리값이 사용됩니다. 네이티브나 표준 bool 표현에서 0이나 1이 패킹 되고, 언 패킹할 때 모든 0이 아닌 값은 @code{True}가 됩니다.

@node 예,,포맷 문자,포맷 문자열
@anchor{library/struct examples}@anchor{2840}@anchor{library/struct struct-examples}@anchor{283d}
@subsubsection 예


@cartouche
@quotation 참고 
Native byte order examples (designated by the @code{'@@'} format prefix or
lack of any prefix character) may not match what the reader’s
machine produces as
that depends on the platform and compiler.
@end quotation
@end cartouche

Pack and unpack integers of three different sizes, using big endian
ordering:

@example
>>> from struct import *
>>> pack(">bhl", 1, 2, 3)
b'\x01\x00\x02\x00\x00\x00\x03'
>>> unpack('>bhl', b'\x01\x00\x02\x00\x00\x00\x03')
(1, 2, 3)
>>> calcsize('>bhl')
7
@end example

Attempt to pack an integer which is too large for the defined field:

@example
>>> pack(">h", 99999)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
struct.error: 'h' format requires -32768 <= number <= 32767
@end example

Demonstrate the difference between @code{'s'} and @code{'c'} format
characters:

@example
>>> pack("@@ccc", b'1', b'2', b'3')
b'123'
>>> pack("@@3s", b'123')
b'123'
@end example

언 패킹 된 필드는 변수에 대입하거나 결과를 네임드 튜플로 감싸서 이름을 붙일 수 있습니다:

@example
>>> record = b'raymond   \x32\x12\x08\x01\x08'
>>> name, serialnum, school, gradelevel = unpack('<10sHHb', record)

>>> from collections import namedtuple
>>> Student = namedtuple('Student', 'name serialnum school gradelevel')
>>> Student._make(unpack('<10sHHb', record))
Student(name=b'raymond   ', serialnum=4658, school=264, gradelevel=8)
@end example

The ordering of format characters may have an impact on size in native
mode since padding is implicit. In standard mode, the user is
responsible for inserting any desired padding.
Note in
the first @code{pack} call below that three NUL bytes were added after the
packed @code{'#'} to align the following integer on a four-byte boundary.
In this example, the output was produced on a little endian machine:

@example
>>> pack('@@ci', b'#', 0x12131415)
b'#\x00\x00\x00\x15\x14\x13\x12'
>>> pack('@@ic', 0x12131415, b'#')
b'\x15\x14\x13\x12#'
>>> calcsize('@@ci')
8
>>> calcsize('@@ic')
5
@end example

다음 포맷 @code{'llh0l'}는 플랫폼의 long이 4바이트 경계에 정렬된다고 가정할 때 끝에 2개의 패드 바이트를 추가합니다:

@example
>>> pack('@@llh0l', 1, 2, 3)
b'\x00\x00\x00\x01\x00\x00\x00\x02\x00\x03\x00\x00'
@end example


@subsubheading 더 보기



@table @asis

@item 모듈 @ref{8,,array}

동종 데이터의 패킹 된 바이너리 저장소.

@item 모듈 @ref{86,,json}

JSON 인코더와 디코더.

@item 모듈 @ref{ab,,pickle}

파이썬 객체 직렬화.
@end table


@node 응용,클래스<2>,포맷 문자열,struct — 패킹 된 바이너리 데이터로 바이트열을 해석
@anchor{library/struct applications}@anchor{2841}@anchor{library/struct id2}@anchor{2842}
@subsubsection 응용


Two main applications for the @code{struct} module exist, data
interchange between Python and C code within an application or another
application compiled using the same compiler (@ref{2843,,native formats}), and
data interchange between applications using agreed upon data layout
(@ref{2844,,standard formats}).  Generally speaking, the format strings
constructed for these two domains are distinct.

@menu
* 네이티브 포맷:: 
* 표준 포맷:: 

@end menu

@node 네이티브 포맷,표준 포맷,,응용
@anchor{library/struct native-formats}@anchor{2845}@anchor{library/struct struct-native-formats}@anchor{2843}
@subsubsection 네이티브 포맷


When constructing format strings which mimic native layouts, the
compiler and machine architecture determine byte ordering and padding.
In such cases, the @code{@@} format character should be used to specify
native byte ordering and data sizes.  Internal pad bytes are normally inserted
automatically.  It is possible that a zero-repeat format code will be
needed at the end of a format string to round up to the correct
byte boundary for proper alignment of consecutive chunks of data.

Consider these two simple examples (on a 64-bit, little-endian
machine):

@example
>>> calcsize('@@lhl')
24
>>> calcsize('@@llh')
18
@end example

Data is not padded to an 8-byte boundary at the end of the second
format string without the use of extra padding.  A zero-repeat format
code solves that problem:

@example
>>> calcsize('@@llh0l')
24
@end example

The @code{'x'} format code can be used to specify the repeat, but for
native formats it is better to use a zero-repeat format like @code{'0l'}.

By default, native byte ordering and alignment is used, but it is
better to be explicit and use the @code{'@@'} prefix character.

@node 표준 포맷,,네이티브 포맷,응용
@anchor{library/struct standard-formats}@anchor{2846}@anchor{library/struct struct-standard-formats}@anchor{2844}
@subsubsection 표준 포맷


When exchanging data beyond your process such as networking or storage,
be precise.  Specify the exact byte order, size, and alignment.  Do
not assume they match the native order of a particular machine.
For example, network byte order is big-endian, while many popular CPUs
are little-endian.  By defining this explicitly, the user need not
care about the specifics of the platform their code is running on.
The first character should typically be @code{<} or @code{>}
(or @code{!}).  Padding is the responsibility of the programmer.  The
zero-repeat format character won’t work.  Instead, the user must
explicitly add @code{'x'} pad bytes where needed.  Revisiting the
examples from the previous section, we have:

@example
>>> calcsize('<qh6xq')
24
>>> pack('<qh6xq', 1, 2, 3) == pack('@@lhl', 1, 2, 3)
True
>>> calcsize('@@llh')
18
>>> pack('@@llh', 1, 2, 3) == pack('<qqh', 1, 2, 3)
True
>>> calcsize('<qqh6x')
24
>>> calcsize('@@llh0l')
24
>>> pack('@@llh0l', 1, 2, 3) == pack('<qqh6x', 1, 2, 3)
True
@end example

The above results (executed on a 64-bit machine) aren’t guaranteed to
match when executed on different machines.  For example, the examples
below were executed on a 32-bit machine:

@example
>>> calcsize('<qqh6x')
24
>>> calcsize('@@llh0l')
12
>>> pack('@@llh0l', 1, 2, 3) == pack('<qqh6x', 1, 2, 3)
False
@end example

@node 클래스<2>,,응용,struct — 패킹 된 바이너리 데이터로 바이트열을 해석
@anchor{library/struct classes}@anchor{2847}@anchor{library/struct struct-objects}@anchor{2848}
@subsubsection 클래스


The @code{struct} module also defines the following type:

@geindex Struct (struct 클래스)
@anchor{library/struct struct Struct}@anchor{1761}
@deffn {클래스} struct.Struct (format)

포맷 문자열 `format'에 따라 바이너리 데이터를 쓰고 읽는 새 Struct 객체를 반환합니다. @code{Struct} 객체를 한 번 만들고 메서드를 호출하는 것은 포맷 문자열이 한 번만 컴파일 되기 때문에 같은 포맷으로 모듈 수준 함수를 호출하는 것보다 효율적입니다.

@cartouche
@quotation 참고 
모듈 수준 함수에 전달된 최신 포맷 문자열의 컴파일된 버전이 캐시 되므로, 몇 가지 포맷 문자열만 사용하는 프로그램은 단일 @ref{1761,,Struct} 인스턴스 재사용에 대해 신경 쓸 필요가 없습니다.
@end quotation
@end cartouche

컴파일된 Struct 객체는 다음 메서드와 어트리뷰트를 지원합니다:

@geindex pack() (struct.Struct 메서드)
@anchor{library/struct struct Struct pack}@anchor{2849}
@deffn {메서드} pack (v1, v2, ...)

@ref{147b,,pack()} 함수와 동일하고, 컴파일된 포맷을 사용합니다. (@code{len(result)}는 @ref{284a,,size}와 같게 됩니다.)
@end deffn

@geindex pack_into() (struct.Struct 메서드)
@anchor{library/struct struct Struct pack_into}@anchor{284b}
@deffn {메서드} pack_into (buffer, offset, v1, v2, ...)

@ref{2838,,pack_into()} 함수와 동일하고, 컴파일된 포맷을 사용합니다.
@end deffn

@geindex unpack() (struct.Struct 메서드)
@anchor{library/struct struct Struct unpack}@anchor{284c}
@deffn {메서드} unpack (buffer)

@ref{185d,,unpack()} 함수와 동일하고, 컴파일된 포맷을 사용합니다. 바이트 단위의 버퍼 크기는 @ref{284a,,size}와 같아야 합니다.
@end deffn

@geindex unpack_from() (struct.Struct 메서드)
@anchor{library/struct struct Struct unpack_from}@anchor{284d}
@deffn {메서드} unpack_from (buffer, offset=0)

@ref{2839,,unpack_from()} 함수와 동일하고, 컴파일된 포맷을 사용합니다. `offset' 위치에서 시작하는 바이트 단위의 버퍼 크기는 @ref{284a,,size} 이상이어야 합니다.
@end deffn

@geindex iter_unpack() (struct.Struct 메서드)
@anchor{library/struct struct Struct iter_unpack}@anchor{11bf}
@deffn {메서드} iter_unpack (buffer)

@ref{11be,,iter_unpack()} 함수와 동일하고, 컴파일된 포맷을 사용합니다. 바이트 단위의 버퍼 크기는 @ref{284a,,size}의 배수이어야 합니다.


Added in version 3.4.

@end deffn

@geindex format (struct.Struct의 속성)
@anchor{library/struct struct Struct format}@anchor{dff}
@deffn {속성} format

이 Struct 객체를 구성하는 데 사용된 포맷 문자열.


버전 3.7에서 변경: 포맷 문자열형은 이제 @ref{192,,bytes} 대신 @ref{169,,str}입니다.

@end deffn

@geindex size (struct.Struct의 속성)
@anchor{library/struct struct Struct size}@anchor{284a}
@deffn {속성} size

@ref{199,,format}에 해당하는 구조체(@ref{147b,,pack()} 메서드에 의해 생성된 바이트열 객체)의 계산된 크기.
@end deffn


버전 3.13에서 변경: The `repr()' of structs has changed.  It
is now:

@example
>>> Struct('i')
Struct('i')
@end example

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node codecs — 코덱 레지스트리와 베이스 클래스,,struct — 패킹 된 바이너리 데이터로 바이트열을 해석,바이너리 데이터 서비스
@anchor{library/codecs doc}@anchor{284e}@anchor{library/codecs codecs-codec-registry-and-base-classes}@anchor{284f}@anchor{library/codecs module-codecs}@anchor{1c}@anchor{library/codecs translation-repo}@anchor{2850}
@subsection @code{codecs} — 코덱 레지스트리와 베이스 클래스


@geindex module; codecs

`소스 코드:' Lib/codecs.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/codecs.py}

@geindex 유니코드
@geindex 코덱
@geindex 코덱;encode
@geindex 코덱;decode
@geindex 스트림
@geindex stackable;스트림


__________________________________________________________________


이 모듈은 표준 파이썬 코덱(인코더와 디코더)의 베이스 클래스를 정의하고, 코덱과 에러 처리 조회 프로세스를 관리하는 내부 파이썬 코덱 레지스트리에 대한 액세스를 제공합니다. 대부분의 표준 코덱은 텍스트를 바이트열로 인코딩하는 (그리고 바이트열을 텍스트로 디코딩하는) @ref{25db,,텍스트 인코딩}이지만, 텍스트를 텍스트로 인코딩하고 바이트열을 바이트열로 인코딩하는 코덱도 제공됩니다. 사용자 정의 코덱은 임의 형 간에 인코딩과 디코딩 할 수 있지만, 일부 모듈 기능은 텍스트 인코딩이나 @ref{192,,bytes}로 인코딩하는 코덱과 함께 사용하도록 특별히 제한됩니다.

이 모듈은 임의의 코덱으로 인코딩과 디코딩하는 다음 함수를 정의합니다:

@geindex encode() (codecs 모듈)
@anchor{library/codecs codecs encode}@anchor{1103}
@deffn {함수} codecs.encode (obj, encoding='utf-8', errors='strict')

`encoding'을 위해 등록된 코덱을 사용하여 `obj'를 인코딩합니다.

원하는 에러 처리 방식을 설정하기 위해 `errors'가 주어질 수 있습니다. 기본 에러 처리기는 @code{'strict'}이며 인코딩 에러가 @ref{2ec,,ValueError}(또는 @ref{886,,UnicodeEncodeError} 와 같은 더 많은 코덱 관련 서브 클래스)를 발생시킨다는 뜻입니다. 코덱 에러 처리에 대한 자세한 내용은 @ref{2851,,코덱 베이스 클래스}를 참조하십시오.
@end deffn

@geindex decode() (codecs 모듈)
@anchor{library/codecs codecs decode}@anchor{1104}
@deffn {함수} codecs.decode (obj, encoding='utf-8', errors='strict')

`encoding'을 위해 등록된 코덱을 사용하여 `obj'를 디코딩합니다.

원하는 에러 처리 방식을 설정하기 위해 `errors'가 주어질 수 있습니다. 기본 에러 처리기는 @code{'strict'}이며 디코딩 에러가 @ref{2ec,,ValueError} (또는 @ref{c07,,UnicodeDecodeError} 와 같은 더 많은 코덱 관련 서브 클래스)를 발생시킨다는 뜻입니다. 코덱 에러 처리에 대한 자세한 내용은 @ref{2851,,코덱 베이스 클래스}를 참조하십시오.
@end deffn

@geindex charmap_build() (codecs 모듈)
@anchor{library/codecs codecs charmap_build}@anchor{2852}
@deffn {함수} codecs.charmap_build (string)

Return a mapping suitable for encoding with a custom single-byte encoding.
Given a @ref{169,,str} `string' of up to 256 characters representing a
decoding table, returns either a compact internal mapping object
@code{EncodingMap} or a @ref{183,,dictionary} mapping character ordinals
to byte values. Raises a @ref{198,,TypeError} on invalid input.
@end deffn

각 코덱에 대한 자세한 내용도 직접 확인할 수 있습니다:

@geindex lookup() (codecs 모듈)
@anchor{library/codecs codecs lookup}@anchor{b5c}
@deffn {함수} codecs.lookup (encoding, /)

파이썬 코덱 레지스트리에서 코덱 정보를 조회하고 아래 정의된 @ref{1a6c,,CodecInfo} 객체를 반환합니다.

인코딩은 먼저 레지스트리 캐시에서 조회됩니다. 찾을 수 없으면, 등록된 검색 함수 리스트를 탐색합니다. @ref{1a6c,,CodecInfo} 객체가 없으면, @ref{23e5,,LookupError}가 발생합니다. 그렇지 않으면, @code{CodecInfo} 객체가 캐시에 저장되고 호출자에게 반환됩니다.
@end deffn

@geindex CodecInfo (codecs 클래스)
@anchor{library/codecs codecs CodecInfo}@anchor{1a6c}
@deffn {클래스} codecs.CodecInfo (encode, decode, streamreader=None, streamwriter=None, incrementalencoder=None, incrementaldecoder=None, name=None)

코덱 레지스트리를 조회할 때의 코덱 세부 정보. 생성자 인자는 같은 이름의 어트리뷰트에 저장됩니다:

@geindex name (codecs.CodecInfo의 속성)
@anchor{library/codecs codecs CodecInfo name}@anchor{2853}
@deffn {속성} name

인코딩의 이름.
@end deffn

@geindex encode (codecs.CodecInfo의 속성)
@geindex decode (codecs.CodecInfo의 속성)
@anchor{library/codecs codecs CodecInfo encode}@anchor{2854}
@deffn {속성} encode
@anchor{library/codecs codecs CodecInfo decode}@anchor{2855}
@deffnx {속성} decode

상태 없는 인코딩과 디코딩 함수. 이들은 코덱 인스턴스의 @ref{2856,,encode()}와 @ref{2857,,decode()} 메서드와 같은 인터페이스를 갖는 함수나 메서드여야 합니다 (@ref{2858,,코덱 인터페이스}를 참조하십시오). 함수나 메서드는 상태 없는 모드로 작동할 것으로 기대됩니다.
@end deffn

@geindex incrementalencoder (codecs.CodecInfo의 속성)
@geindex incrementaldecoder (codecs.CodecInfo의 속성)
@anchor{library/codecs codecs CodecInfo incrementalencoder}@anchor{2859}
@deffn {속성} incrementalencoder
@anchor{library/codecs codecs CodecInfo incrementaldecoder}@anchor{285a}
@deffnx {속성} incrementaldecoder

증분형 인코더와 디코더 클래스 또는 팩토리 함수. 이들은 각각 베이스 클래스 @ref{285b,,IncrementalEncoder}와 @ref{285c,,IncrementalDecoder}가 정의하는 인터페이스를 제공해야 합니다. 증분 코덱은 상태를 유지할 수 있습니다.
@end deffn

@geindex streamwriter (codecs.CodecInfo의 속성)
@geindex streamreader (codecs.CodecInfo의 속성)
@anchor{library/codecs codecs CodecInfo streamwriter}@anchor{285d}
@deffn {속성} streamwriter
@anchor{library/codecs codecs CodecInfo streamreader}@anchor{285e}
@deffnx {속성} streamreader

스트림 기록기와 판독기 클래스 또는 팩토리 함수. 이들은 각각 베이스 클래스 @ref{285f,,StreamWriter}와 @ref{2860,,StreamReader}가 정의하는 인터페이스를 제공해야 합니다. 스트림 코덱은 상태를 유지할 수 있습니다.
@end deffn
@end deffn

다양한 코덱 구성 요소에 대한 액세스를 단순화하기 위해, 이 모듈은 코덱 조회에 @ref{b5c,,lookup()}을 사용하는 다음과 같은 추가 함수를 제공합니다:

@geindex getencoder() (codecs 모듈)
@anchor{library/codecs codecs getencoder}@anchor{2861}
@deffn {함수} codecs.getencoder (encoding)

주어진 인코딩에 대한 코덱을 찾아서 해당 인코더 함수를 반환합니다.

인코딩을 찾을 수 없는 경우 @ref{23e5,,LookupError}를 발생시킵니다.
@end deffn

@geindex getdecoder() (codecs 모듈)
@anchor{library/codecs codecs getdecoder}@anchor{2862}
@deffn {함수} codecs.getdecoder (encoding)

주어진 인코딩에 대한 코덱을 찾아서 해당 디코더 함수를 반환합니다.

인코딩을 찾을 수 없는 경우 @ref{23e5,,LookupError}를 발생시킵니다.
@end deffn

@geindex getincrementalencoder() (codecs 모듈)
@anchor{library/codecs codecs getincrementalencoder}@anchor{2863}
@deffn {함수} codecs.getincrementalencoder (encoding)

주어진 인코딩에 대한 코덱을 찾아서 증분 인코더 클래스나 팩토리 함수를 반환합니다.

인코딩을 찾을 수 없거나 코덱이 증분 인코더를 지원하지 않는 경우 @ref{23e5,,LookupError}를 발생시킵니다.
@end deffn

@geindex getincrementaldecoder() (codecs 모듈)
@anchor{library/codecs codecs getincrementaldecoder}@anchor{2864}
@deffn {함수} codecs.getincrementaldecoder (encoding)

주어진 인코딩에 대한 코덱을 찾아서 증분 디코더 클래스나 팩토리 함수를 반환합니다.

인코딩을 찾을 수 없거나 코덱이 증분 디코더를 지원하지 않는 경우 @ref{23e5,,LookupError}를 발생시킵니다.
@end deffn

@geindex getreader() (codecs 모듈)
@anchor{library/codecs codecs getreader}@anchor{2865}
@deffn {함수} codecs.getreader (encoding)

주어진 인코딩의 코덱을 찾아서 @ref{2860,,StreamReader} 클래스나 팩토리 함수를 반환합니다.

인코딩을 찾을 수 없는 경우 @ref{23e5,,LookupError}를 발생시킵니다.
@end deffn

@geindex getwriter() (codecs 모듈)
@anchor{library/codecs codecs getwriter}@anchor{2866}
@deffn {함수} codecs.getwriter (encoding)

주어진 인코딩의 코덱을 찾아서 @ref{285f,,StreamWriter} 클래스나 팩토리 함수를 반환합니다.

인코딩을 찾을 수 없는 경우 @ref{23e5,,LookupError}를 발생시킵니다.
@end deffn

적합한 코덱 검색 함수를 등록하여 사용자 정의 코덱을 사용할 수 있도록 합니다:

@geindex register() (codecs 모듈)
@anchor{library/codecs codecs register}@anchor{2867}
@deffn {함수} codecs.register (search_function, /)

코덱 검색 함수를 등록합니다. 검색 함수는 모두 소문자로 이루어지고 하이픈과 스페이스를 언더스코어로 변환한 인코딩 이름인 하나의 인자를 취하고, @ref{1a6c,,CodecInfo} 객체를 반환해야 합니다. 검색 함수가 주어진 인코딩을 찾지 못하면, @code{None}을 반환해야 합니다.


버전 3.9에서 변경: Hyphens and spaces are converted to underscore.

@end deffn

@geindex unregister() (codecs 모듈)
@anchor{library/codecs codecs unregister}@anchor{9e9}
@deffn {함수} codecs.unregister (search_function, /)

Unregister a codec search function and clear the registry’s cache.
If the search function is not registered, do nothing.


Added in version 3.10.

@end deffn

내장 @ref{316,,open()}과 관련 @ref{83,,io} 모듈은 인코딩된 텍스트 파일 작업에 권장되는 접근 방법이지만, 이 모듈은 바이너리 파일로 작업할 때 더 넓은 범위의 코덱을 사용할 수 있도록 하는 추가 유틸리티 함수와 클래스를 제공합니다:

@geindex open() (codecs 모듈)
@anchor{library/codecs codecs open}@anchor{315}
@deffn {함수} codecs.open (filename, mode='r', encoding=None, errors='strict', buffering=-1)

주어진 `mode'를 사용하여 인코딩된 파일을 열고 투명한 인코딩/디코딩을 제공하는 @ref{2868,,StreamReaderWriter} 의 인스턴스를 반환합니다. 기본 파일 모드는 @code{'r'}이고, 파일을 읽기 모드로 연다는 뜻입니다.

@cartouche
@quotation 참고 
`encoding'이 @code{None}이 아니면, 하부 인코딩된 파일은 항상 바이너리 모드로 열립니다. 읽기와 쓰기 시 @code{'\n'}의 자동 변환이 수행되지 않습니다. `mode' 인자는 내장 @ref{316,,open()} 함수에 허용되는 모든 바이너리 모드일 수 있습니다; @code{'b'}가 자동으로 추가됩니다.
@end quotation
@end cartouche

`encoding'은 파일에 사용될 인코딩을 지정합니다. 바이트열에서 인코딩하고 바이트열로 디코딩하는 모든 인코딩이 허용되며, 파일 메서드가 지원하는 데이터형은 사용된 코덱에 따라 다릅니다.

에러 처리를 정의하기 위해 `errors'가 제공될 수 있습니다. 기본값은 @code{'strict'}이고 인코딩 에러가 발생하면 @ref{2ec,,ValueError}가 발생합니다.

`buffering'은 내장 @ref{316,,open()} 함수에서와 같은 의미입니다. 기본값은 -1이며 기본 버퍼 크기가 사용됨을 의미합니다.


버전 3.11에서 변경: The @code{'U'} mode has been removed.



버전 3.14부터 폐지됨: @ref{315,,codecs.open()} has been superseded by @code{open()}.

@end deffn

@geindex EncodedFile() (codecs 모듈)
@anchor{library/codecs codecs EncodedFile}@anchor{2869}
@deffn {함수} codecs.EncodedFile (file, data_encoding, file_encoding=None, errors='strict')

투명한 트랜스코딩을 제공하는 `file'의 래핑 된 버전인 @ref{1dd1,,StreamRecoder} 인스턴스를 반환합니다. 래핑 된 버전이 닫힐 때 원본 파일이 닫힙니다.

래핑 된 파일에 기록된 데이터는 주어진 `data_encoding'에 따라 디코딩된 다음 `file_encoding'을 사용하여 바이트열로 원본 파일에 기록됩니다. 원본 파일에서 읽은 바이트열은 `file_encoding'에 따라 디코딩되며, 결과는 `data_encoding'을 사용하여 인코딩됩니다.

`file_encoding'이 제공되지 않으면, 기본값은 `data_encoding'입니다.

에러 처리를 정의하기 위해 `errors'가 제공될 수 있습니다. 기본값은 @code{'strict'}이며, 인코딩 에러가 발생하면 @ref{2ec,,ValueError}가 발생합니다.
@end deffn

@geindex iterencode() (codecs 모듈)
@anchor{library/codecs codecs iterencode}@anchor{286a}
@deffn {함수} codecs.iterencode (iterator, encoding, errors='strict', **kwargs)

Uses an incremental encoder to iteratively encode the input provided by
`iterator'. `iterator' must yield @ref{169,,str} objects.
This function is a @ref{1260,,generator}. The `errors' argument (as well as any
other keyword argument) is passed through to the incremental encoder.

이 함수를 사용하려면 코덱에서 인코딩할 텍스트 @ref{169,,str} 객체를 허용해야 합니다. 따라서 @code{base64_codec}과 같은 바이트열-바이트열 인코더는 지원하지 않습니다.
@end deffn

@geindex iterdecode() (codecs 모듈)
@anchor{library/codecs codecs iterdecode}@anchor{286b}
@deffn {함수} codecs.iterdecode (iterator, encoding, errors='strict', **kwargs)

Uses an incremental decoder to iteratively decode the input provided by
`iterator'. `iterator' must yield @ref{192,,bytes} objects.
This function is a @ref{1260,,generator}. The `errors' argument (as well as any
other keyword argument) is passed through to the incremental decoder.

이 함수를 사용하려면 코덱에서 디코딩할 @ref{192,,bytes} 객체를 허용해야 합니다. 따라서 @code{rot_13}이 @ref{286a,,iterencode()}로 동등하게 사용될 수 있지만, @code{rot_13}과 같은 텍스트-텍스트 인코더는 지원하지 않습니다.
@end deffn

@geindex readbuffer_encode() (codecs 모듈)
@anchor{library/codecs codecs readbuffer_encode}@anchor{286c}
@deffn {함수} codecs.readbuffer_encode (buffer, errors=None, /)

Return a @ref{610,,tuple} containing the raw bytes of `buffer', a
@ref{260,,buffer-compatible object} or @ref{169,,str}
(encoded to UTF-8 before processing), and their length in bytes.

The `errors' argument is ignored.

@example
>>> codecs.readbuffer_encode(b"Zito")
(b'Zito', 4)
@end example
@end deffn

이 모듈은 또한 플랫폼 종속 파일을 읽고 쓰는 데 유용한 다음 상수를 제공합니다:

@geindex BOM (codecs 모듈)
@geindex BOM_BE (codecs 모듈)
@geindex BOM_LE (codecs 모듈)
@geindex BOM_UTF8 (codecs 모듈)
@geindex BOM_UTF16 (codecs 모듈)
@geindex BOM_UTF16_BE (codecs 모듈)
@geindex BOM_UTF16_LE (codecs 모듈)
@geindex BOM_UTF32 (codecs 모듈)
@geindex BOM_UTF32_BE (codecs 모듈)
@geindex BOM_UTF32_LE (codecs 모듈)
@anchor{library/codecs codecs BOM}@anchor{286d}
@deffn {데이터} codecs.BOM
@anchor{library/codecs codecs BOM_BE}@anchor{286e}
@deffnx {데이터} codecs.BOM_BE
@anchor{library/codecs codecs BOM_LE}@anchor{286f}
@deffnx {데이터} codecs.BOM_LE
@anchor{library/codecs codecs BOM_UTF8}@anchor{2870}
@deffnx {데이터} codecs.BOM_UTF8
@anchor{library/codecs codecs BOM_UTF16}@anchor{2871}
@deffnx {데이터} codecs.BOM_UTF16
@anchor{library/codecs codecs BOM_UTF16_BE}@anchor{2872}
@deffnx {데이터} codecs.BOM_UTF16_BE
@anchor{library/codecs codecs BOM_UTF16_LE}@anchor{2873}
@deffnx {데이터} codecs.BOM_UTF16_LE
@anchor{library/codecs codecs BOM_UTF32}@anchor{2874}
@deffnx {데이터} codecs.BOM_UTF32
@anchor{library/codecs codecs BOM_UTF32_BE}@anchor{2875}
@deffnx {데이터} codecs.BOM_UTF32_BE
@anchor{library/codecs codecs BOM_UTF32_LE}@anchor{2876}
@deffnx {데이터} codecs.BOM_UTF32_LE

이 상수는 여러 인코딩에서 유니코드 바이트 순서 표시(BOM)인 다양한 바이트 시퀀스를 정의합니다. UTF-16과 UTF-32 데이터 스트림에서 사용된 바이트 순서를 나타내는 데 사용되며, UTF-8에서 유니코드 서명으로 사용됩니다. @ref{2871,,BOM_UTF16}은 플랫폼의 네이티브 바이트 순서에 따라 @ref{2872,,BOM_UTF16_BE}나 @ref{2873,,BOM_UTF16_LE}이며, @ref{286d,,BOM}은 @code{BOM_UTF16}의 별칭, @ref{286f,,BOM_LE}는 @code{BOM_UTF16_LE}의 별칭, @ref{286e,,BOM_BE}는 @code{BOM_UTF16_BE}의 별칭입니다. 다른 것은 UTF-8과 UTF-32 인코딩에서 BOM을 나타냅니다.
@end deffn

@menu
* 코덱 베이스 클래스:: 
* 인코딩과 유니코드:: 
* 표준 인코딩:: 
* 파이썬 특정 인코딩:: 
* encodings — Encodings package:: 
* encodings.idna — Internationalized Domain Names in Applications: encodings idna — Internationalized Domain Names in Applications. 
* encodings.mbcs — Windows ANSI codepage: encodings mbcs — Windows ANSI codepage. 
* encodings.utf_8_sig — UTF-8 codec with BOM signature: encodings utf_8_sig — UTF-8 codec with BOM signature. 

@end menu

@node 코덱 베이스 클래스,인코딩과 유니코드,,codecs — 코덱 레지스트리와 베이스 클래스
@anchor{library/codecs codec-base-classes}@anchor{2851}@anchor{library/codecs id1}@anchor{2877}
@subsubsection 코덱 베이스 클래스


The @code{codecs} module defines a set of base classes which define the
interfaces for working with codec objects, and can also be used as the basis
for custom codec implementations.

각 코덱은 파이썬에서 코덱으로 사용할 수 있도록 네 가지 인터페이스를 정의해야 합니다: 상태 없는 인코더, 상태 없는 디코더, 스트림 판독기 및 스트림 기록기. 스트림 판독기와 기록기는 일반적으로 상태 없는 인코더/디코더를 재사용하여 파일 프로토콜을 구현합니다. 코덱 작성자는 코덱에서 인코딩과 디코딩 에러를 처리하는 방법도 정의해야 합니다.
@anchor{library/codecs surrogateescape}@anchor{2878}
@menu
* 에러 처리기:: 
* 상태 없는 인코딩과 디코딩:: 
* 증분 인코딩과 디코딩:: 
* 스트림 인코딩과 디코딩:: 

@end menu

@node 에러 처리기,상태 없는 인코딩과 디코딩,,코덱 베이스 클래스
@anchor{library/codecs error-handlers}@anchor{1b6d}@anchor{library/codecs id2}@anchor{2879}
@subsubsection 에러 처리기


에러 처리를 단순화하고 표준화하기 위해, 코덱은 `errors' 문자열 인자를 받아들여 다른 에러 처리 체계를 구현할 수 있습니다:

@example
>>> 'German ß, ♬'.encode(encoding='ascii', errors='backslashreplace')
b'German \\xdf, \\u266c'
>>> 'German ß, ♬'.encode(encoding='ascii', errors='xmlcharrefreplace')
b'German &#223;, &#9836;'
@end example

@geindex strict;에러 처리기의 이름
@geindex ignore;에러 처리기의 이름
@geindex replace;에러 처리기의 이름
@geindex backslashreplace;에러 처리기의 이름
@geindex surrogateescape;에러 처리기의 이름
@geindex ? (물음표);치환 문자
@geindex \ (역 슬래시);이스케이프 시퀀스
@geindex \x;이스케이프 시퀀스
@geindex \u;이스케이프 시퀀스
@geindex \U;이스케이프 시퀀스

다음 에러 처리기는 모든 파이썬 @ref{fb7,,표준 인코딩}과 함께 사용할 수 있습니다:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

값

@tab

의미

@item

@code{'strict'}

@tab

@ref{462,,UnicodeError}(또는 서브 클래스)를 발생시킵니다, 이것이 기본값입니다. @ref{287a,,strict_errors()}에서 구현되었습니다.

@item

@code{'ignore'}

@tab

잘못된 데이터를 무시하고 추가 통지 없이 계속 진행합니다. @ref{287b,,ignore_errors()}에서 구현되었습니다.

@item

@code{'replace'}

@tab

교체 마커로 교체합니다. 인코딩 시, @code{?} (ASCII 문자) 를 사용합니다. 디코딩 시, @code{�} (U+FFFD, 공식 REPLACEMENT CHARACTER) 를 사용합니다. @ref{18c3,,replace_errors()}에서 구현되었습니다.

@item

@code{'backslashreplace'}

@tab

Replace with backslashed escape sequences.
On encoding, use hexadecimal form of Unicode
code point with formats @code{\x@var{hh}}
@code{\u@var{xxxx}} @code{\U@var{xxxxxxxx}}.
On decoding, use hexadecimal form of byte
value with format @code{\x@var{hh}}.
Implemented in
@ref{18c4,,backslashreplace_errors()}.

@item

@code{'surrogateescape'}

@tab

디코딩 시, 바이트를 @code{U+DC80}에서 @code{U+DCFF} 범위의 개별 서로게이트 코드(surrogate code)로 바꿉니다. 이 코드는 데이터를 인코딩할 때 @code{'surrogateescape'} 에러 처리기가 사용되면 같은 바이트로 다시 변환됩니다. (자세한 내용은 
@geindex Python 향상 제안; PEP 383
PEP 383@footnote{https://peps.python.org/pep-0383/}을 참조하십시오.)

@end multitable


@geindex xmlcharrefreplace;에러 처리기의 이름
@geindex namereplace;에러 처리기의 이름
@geindex \N;이스케이프 시퀀스

다음 에러 처리기는 인코딩에만  적용됩니다 (@ref{25db,,텍스트 인코딩} 내):


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

값

@tab

의미

@item

@code{'xmlcharrefreplace'}

@tab

@code{&#@var{num};} 포맷의 유니코드 코드 포인트의 십진수 형식인 XML/HTML 숫자 문자 참조로 교체합니다. @ref{18c5,,xmlcharrefreplace_errors()}에서 구현되었습니다.

@item

@code{'namereplace'}

@tab

@code{\N@{...@}} 이스케이프 시퀀스로 교체합니다, 중괄호 안에 나타나는 것은 유니코드 문자 데이터베이스의 이름(Name) 속성입니다. @ref{287c,,namereplace_errors()}에서 구현되었습니다.

@end multitable


@geindex surrogatepass;에러 처리기의 이름

또한, 다음 에러 처리기는 지정된 코덱에만 적용됩니다:


@multitable {xxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

값

@tab

코덱

@tab

의미

@item

@code{'surrogatepass'}

@tab

utf-8, utf-16, utf-32,
utf-16-be, utf-16-le,
utf-32-be, utf-32-le

@tab

서로게이트 코드 포인트 (@code{U+D800} - @code{U+DFFF}) 를 일반 코드 포인트로 인코딩 및 디코딩하도록 허용합니다. 그렇지 않으면 이 코덱들은 @ref{169,,str}에 있는 서로게이트 코드 포인트의 존재를 에러로 취급합니다.

@end multitable



Added in version 3.1: @code{'surrogateescape'}와 @code{'surrogatepass'} 에러 처리기.



버전 3.4에서 변경: @code{'surrogatepass'} 에러 처리기는 이제 utf-16* 와 utf-32* 코덱에서 작동합니다.



Added in version 3.5: @code{'namereplace'} 에러 처리기.



버전 3.5에서 변경: @code{'backslashreplace'} 에러 처리기는 이제 디코딩과 변환(translating)에서 작동합니다.


새 이름으로 에러 처리기를 등록하여 허용되는 값 집합을 확장할 수 있습니다:

@geindex register_error() (codecs 모듈)
@anchor{library/codecs codecs register_error}@anchor{16a0}
@deffn {함수} codecs.register_error (name, error_handler, /)

에러 처리 함수 `error_handler'를 `name'이라는 이름으로 등록합니다. `error_handler' 인자는 `name'이 errors 매개 변수로 지정될 때, 인코딩과 디코딩 중에 에러가 있으면 호출됩니다.

인코딩의 경우, 에러 위치에 대한 정보가 포함된 @ref{886,,UnicodeEncodeError} 인스턴스와 함께 `error_handler'가 호출됩니다. 에러 처리기는 이 예외나 다른 예외를 발생시키거나, 입력의 인코딩할 수 없는 부분의 대체 값과 인코딩을 계속할 위치를 담은 튜플을 반환해야 합니다. 대체 값은 @ref{169,,str}이나 @ref{192,,bytes}일 수 있습니다. 대체 값이 바이트열이면, 인코더는 이를 단순히 출력 버퍼에 복사합니다. 대체 값이 문자열이면, 인코더는 대체 값을 인코딩합니다. 지정된 위치에서 원래 입력으로 인코딩이 계속됩니다. 음수 위칫값은 입력 문자열의 끝을 기준으로 처리됩니다. 결과 위치가 범위를 벗어나면 @ref{173a,,IndexError}가 발생합니다.

@ref{c07,,UnicodeDecodeError} 나 @ref{18fe,,UnicodeTranslateError} 가 처리기로 전달되고 에러 처리기의 대체 값을 출력에 직접 넣는다는 점을 제외하면, 디코딩과 변환(translating)은 비슷하게 작동합니다.
@end deffn

이전에 등록된 에러 처리기(표준 에러 처리기를 포함하여)는 이름으로 조회할 수 있습니다:

@geindex lookup_error() (codecs 모듈)
@anchor{library/codecs codecs lookup_error}@anchor{16a1}
@deffn {함수} codecs.lookup_error (name, /)

`name'이라는 이름으로 이전에 등록된 에러 처리기를 반환합니다.

처리기를 찾을 수 없으면 @ref{23e5,,LookupError}를 발생시킵니다.
@end deffn

다음과 같은 표준 에러 처리기가 모듈 수준 함수로 제공됩니다:

@geindex strict_errors() (codecs 모듈)
@anchor{library/codecs codecs strict_errors}@anchor{287a}
@deffn {함수} codecs.strict_errors (exception)

@code{'strict'} 에러 처리를 구현합니다.

각 인코딩이나 디코딩 에러는 @ref{462,,UnicodeError}를 발생시킵니다.
@end deffn

@geindex ignore_errors() (codecs 모듈)
@anchor{library/codecs codecs ignore_errors}@anchor{287b}
@deffn {함수} codecs.ignore_errors (exception)

@code{'ignore'} 에러 처리를 구현합니다.

잘못된 형식의 데이터는 무시됩니다; 추가 통지 없이 인코딩이나 디코딩이 계속됩니다.
@end deffn

@geindex replace_errors() (codecs 모듈)
@anchor{library/codecs codecs replace_errors}@anchor{18c3}
@deffn {함수} codecs.replace_errors (exception)

@code{'replace'} 에러 처리를 구현합니다.

Substitutes @code{?} (ASCII character) for encoding errors or @code{�} (U+FFFD,
the official REPLACEMENT CHARACTER) for decoding errors.
@end deffn

@geindex backslashreplace_errors() (codecs 모듈)
@anchor{library/codecs codecs backslashreplace_errors}@anchor{18c4}
@deffn {함수} codecs.backslashreplace_errors (exception)

@code{'backslashreplace'} 에러 처리를 구현합니다.

Malformed data is replaced by a backslashed escape sequence.
On encoding, use the hexadecimal form of Unicode code point with formats
@code{\x@var{hh}} @code{\u@var{xxxx}} @code{\U@var{xxxxxxxx}}.
On decoding, use the hexadecimal form of
byte value with format @code{\x@var{hh}}.


버전 3.5에서 변경: 디코딩과 변환(translating)에서 작동합니다.

@end deffn

@geindex xmlcharrefreplace_errors() (codecs 모듈)
@anchor{library/codecs codecs xmlcharrefreplace_errors}@anchor{18c5}
@deffn {함수} codecs.xmlcharrefreplace_errors (exception)

@code{'xmlcharrefreplace'} 에러 처리를 구현합니다 (@ref{25db,,텍스트 인코딩}으로 인코딩하는 경우에만 해당).

인코드할 수 없는 문자는 @code{&#@var{num};} 포맷의 유니코드 코드 포인트의 십진수 형식인 적절한 XML/HTML 숫자 문자 참조로 대체됩니다.
@end deffn

@geindex namereplace_errors() (codecs 모듈)
@anchor{library/codecs codecs namereplace_errors}@anchor{287c}
@deffn {함수} codecs.namereplace_errors (exception)

@code{'namereplace'} 에러 처리를 구현합니다 (@ref{25db,,텍스트 인코딩}으로 인코딩하는 경우에만 해당).

인코드할 수 없는 문자는 @code{\N@{...@}} 이스케이프 시퀀스로 대체됩니다. 중괄호 안에 나타나는 문자 집합은 유니코드 문자 데이터베이스의 이름(Name) 속성입니다. 예를 들어, 독일어 소문자 @code{'ß'}는 바이트 시퀀스 @code{\N@{LATIN SMALL LETTER SHARP S@}}로 변환됩니다.


Added in version 3.5.

@end deffn

@node 상태 없는 인코딩과 디코딩,증분 인코딩과 디코딩,에러 처리기,코덱 베이스 클래스
@anchor{library/codecs codec-objects}@anchor{2858}@anchor{library/codecs stateless-encoding-and-decoding}@anchor{287d}
@subsubsection 상태 없는 인코딩과 디코딩


기본 @ref{287e,,Codec} 클래스는 다음과 같은 메서드를 정의하는데, 상태 없는 인코더와 디코더의 함수 인터페이스를 정의하기도 합니다:

@geindex Codec (codecs 클래스)
@anchor{library/codecs codecs Codec}@anchor{287e}
@deffn {클래스} codecs.Codec

@geindex encode() (codecs.Codec 메서드)
@anchor{library/codecs codecs Codec encode}@anchor{2856}
@deffn {메서드} encode (input, errors='strict')

객체 `input'을 인코딩하고 튜플(출력 객체, 소비한 길이)을 반환합니다. 예를 들어, @ref{25db,,텍스트 인코딩}은 특정 문자 집합 인코딩 (예를 들어, @code{cp1252}나 @code{iso-8859-1})을 사용하여 문자열 객체를 바이트열 객체로 변환합니다.

`errors' 인자는 적용할 에러 처리를 정의합니다. 기본값은 @code{'strict'} 처리입니다.

이 메서드는 @ref{287e,,Codec} 인스턴스에 상태를 저장하지 않을 수 있습니다. 인코딩 효율을 높이기 위해 상태를 유지해야 하는 코덱에서는 @ref{285f,,StreamWriter}를 사용하십시오.

인코더는 길이가 0인 입력을 처리하고 이 상황에서는 출력 객체 형의 빈 객체를 반환할 수 있어야 합니다.
@end deffn

@geindex decode() (codecs.Codec 메서드)
@anchor{library/codecs codecs Codec decode}@anchor{2857}
@deffn {메서드} decode (input, errors='strict')

객체 `input'을 디코딩하고 튜플 (출력 객체, 소비한 길이)를 반환합니다. 예를 들어, @ref{25db,,텍스트 인코딩}의 경우, 디코딩은 특정 문자 집합 인코딩을 사용하여 인코딩된 바이트열 객체를 문자열 객체로 변환합니다.

텍스트 인코딩과 바이트열-바이트열 코덱의 경우, `input'은 바이트열 객체이거나 읽기 전용 버퍼 인터페이스를 제공하는 객체여야 합니다 – 예를 들어, 버퍼 객체와 및 메모리 맵핑 파일.

`errors' 인자는 적용할 에러 처리를 정의합니다. 기본값은 @code{'strict'} 처리입니다.

이 메서드는 @ref{287e,,Codec} 인스턴스에 상태를 저장하지 않을 수 있습니다. 디코딩 효율을 높이기 위해 상태를 유지해야 하는 코덱에서는 @ref{2860,,StreamReader}를 사용하십시오.

디코더는 길이가 0인 입력을 처리하고 이 상황에서 출력 객체 형의 빈 객체를 반환할 수 있어야 합니다.
@end deffn
@end deffn

@node 증분 인코딩과 디코딩,스트림 인코딩과 디코딩,상태 없는 인코딩과 디코딩,코덱 베이스 클래스
@anchor{library/codecs incremental-encoding-and-decoding}@anchor{287f}
@subsubsection 증분 인코딩과 디코딩


@ref{285b,,IncrementalEncoder}와 @ref{285c,,IncrementalDecoder} 클래스는 증분 인코딩과 디코딩을 위한 기본 인터페이스를 제공합니다. 입력을 인코딩/디코딩하는 것이 상태 없는 인코더/디코더 함수를 한 번 호출하는 것이 아니라, 증분 인코더/디코더의 @ref{2880,,encode()}/@ref{2881,,decode()} 메서드를 여러 번 호출하여 수행됩니다. 증분 인코더/디코더는 메서드 호출 중에 인코딩/디코딩 프로세스를 추적합니다.

@ref{2880,,encode()}/@ref{2881,,decode()} 메서드에 대한 호출의 연결된 출력은 모든 단일 입력을 하나로 결합하여 상태 없는 인코더/디코더로 인코딩/디코딩되는 것과 같습니다.

@menu
* IncrementalEncoder 객체:: 
* IncrementalDecoder 객체:: 

@end menu

@node IncrementalEncoder 객체,IncrementalDecoder 객체,,증분 인코딩과 디코딩
@anchor{library/codecs incremental-encoder-objects}@anchor{2882}@anchor{library/codecs incrementalencoder-objects}@anchor{2883}
@subsubsection IncrementalEncoder 객체


@ref{285b,,IncrementalEncoder} 클래스는 여러 단계로 입력을 인코딩하는 데 사용됩니다. 파이썬 코덱 레지스트리와 호환되도록 모든 증분 인코더가 정의해야 하는 다음 메서드를 정의합니다.

@geindex IncrementalEncoder (codecs 클래스)
@anchor{library/codecs codecs IncrementalEncoder}@anchor{285b}
@deffn {클래스} codecs.IncrementalEncoder (errors='strict')

@ref{285b,,IncrementalEncoder} 인스턴스의 생성자.

모든 증분 인코더는 이 생성자 인터페이스를 제공해야 합니다. 추가 키워드 인자를 자유롭게 추가할 수 있지만, 여기에 정의된 키워드 인자만 파이썬 코덱 레지스트리에서 사용됩니다.

@ref{285b,,IncrementalEncoder}는 `errors' 키워드 인자를 제공하여 다른 에러 처리 체계를 구현할 수 있습니다. 가능한 값은 @ref{1b6d,,에러 처리기}를 참조하십시오.

`errors' 인자는 같은 이름의 어트리뷰트에 대입됩니다. 이 어트리뷰트에 대입하면 @ref{285b,,IncrementalEncoder} 객체의 수명 동안 다른 에러 처리 전략 간에 전환할 수 있습니다.

@geindex encode() (codecs.IncrementalEncoder 메서드)
@anchor{library/codecs codecs IncrementalEncoder encode}@anchor{2880}
@deffn {메서드} encode (object, final=False)

`object'를 (인코더의 현재 상태를 고려하여) 인코딩하고 결과 인코딩된 객체를 반환합니다. 이것이 @ref{1103,,encode()}에 대한 마지막 호출이면 `final'은 참이어야 합니다 (기본값은 거짓).
@end deffn

@geindex reset() (codecs.IncrementalEncoder 메서드)
@anchor{library/codecs codecs IncrementalEncoder reset}@anchor{2884}
@deffn {메서드} reset ()

인코더를 초기 상태로 재설정합니다. 출력은 버려집니다: 인코더를 재설정하고 출력을 얻으려면, 필요하면 빈 바이트열이나 텍스트 문자열을 전달하여, @code{.encode(object, final=True)}를 호출하십시오.
@end deffn

@geindex getstate() (codecs.IncrementalEncoder 메서드)
@anchor{library/codecs codecs IncrementalEncoder getstate}@anchor{2885}
@deffn {메서드} getstate ()

인코더의 현재 상태를 반환하는데, 정수여야 합니다. 구현은 @code{0}이 가장 흔한 상태가 되도록 해야 합니다. (정수보다 복잡한 상태는 상태를 마샬링/피클링하고 결과 문자열의 바이트열을 정수로 인코딩하여 정수로 변환할 수 있습니다.)
@end deffn

@geindex setstate() (codecs.IncrementalEncoder 메서드)
@anchor{library/codecs codecs IncrementalEncoder setstate}@anchor{2886}
@deffn {메서드} setstate (state)

인코더 상태를 `state'로 설정합니다. `state'는 @ref{2885,,getstate()}가 반환한 인코더 상태여야 합니다.
@end deffn
@end deffn

@node IncrementalDecoder 객체,,IncrementalEncoder 객체,증분 인코딩과 디코딩
@anchor{library/codecs incremental-decoder-objects}@anchor{2887}@anchor{library/codecs incrementaldecoder-objects}@anchor{2888}
@subsubsection IncrementalDecoder 객체


@ref{285c,,IncrementalDecoder} 클래스는 여러 단계로 입력을 디코딩하는 데 사용됩니다. 파이썬 코덱 레지스트리와 호환되도록 모든 증분 디코더에서 정의해야 하는 다음 메서드를 정의합니다.

@geindex IncrementalDecoder (codecs 클래스)
@anchor{library/codecs codecs IncrementalDecoder}@anchor{285c}
@deffn {클래스} codecs.IncrementalDecoder (errors='strict')

@ref{285c,,IncrementalDecoder} 인스턴스의 생성자.

모든 증분 디코더는 이 생성자 인터페이스를 제공해야 합니다. 추가 키워드 인자를 자유롭게 추가할 수 있지만, 여기에 정의된 키워드 인자만 파이썬 코덱 레지스트리에서 사용됩니다.

@ref{285c,,IncrementalDecoder}는 `errors' 키워드 인자를 제공하여 다른 에러 처리 체계를 구현할 수 있습니다. 가능한 값은 @ref{1b6d,,에러 처리기}를 참조하십시오.

`errors' 인자는 같은 이름의 어트리뷰트에 대입됩니다. 이 어트리뷰트에 대입하면 @ref{285c,,IncrementalDecoder} 객체의 수명 동안 다른 에러 처리 전략 간에 전환할 수 있습니다.

@geindex decode() (codecs.IncrementalDecoder 메서드)
@anchor{library/codecs codecs IncrementalDecoder decode}@anchor{2881}
@deffn {메서드} decode (object, final=False)

`object'를 디코딩하고 (디코더의 현재 상태를 고려하여) 결과 디코딩된 객체를 반환합니다. 이것이 @ref{1104,,decode()}에 대한 마지막 호출이면 `final'은 참이어야 합니다 (기본값은 거짓). `final'이 참이면 디코더는 입력을 완전히 디코딩해야 하며 모든 버퍼를 플러시 해야 합니다. 이것이 가능하지 않으면 (예를 들어 입력 끝의 불완전한 바이트 시퀀스로 인해), 상태 없는 경우와 같이 에러 처리를 시작해야 합니다 (예외가 발생시킬 수 있습니다).
@end deffn

@geindex reset() (codecs.IncrementalDecoder 메서드)
@anchor{library/codecs codecs IncrementalDecoder reset}@anchor{2889}
@deffn {메서드} reset ()

디코더를 초기 상태로 재설정합니다.
@end deffn

@geindex getstate() (codecs.IncrementalDecoder 메서드)
@anchor{library/codecs codecs IncrementalDecoder getstate}@anchor{288a}
@deffn {메서드} getstate ()

디코더의 현재 상태를 반환합니다. 두 항목이 있는 튜플이어야 하며, 첫 번째는 여전히 디코딩되지 않은 입력을 포함하는 버퍼여야 합니다. 두 번째는 정수여야 하며 추가 상태 정보일 수 있습니다. (구현은 @code{0}이 가장 흔한 추가 상태 정보가 되도록 해야 합니다.) 이 추가 상태 정보가 @code{0}이면, 입력 버퍼가 없고 추가 상태 정보가 @code{0}인 상태로 디코더를 설정할 수 있어서, 이전에 버퍼링 된 입력을 디코더에 공급하면 출력을 생성하지 않고 이전 상태로 되돌아갈 수 있어야 합니다. (정수보다 복잡한 추가 상태 정보는 정보를 마샬링/피클링하고 결과 문자열의 바이트를 정수로 인코딩하여 정수로 변환할 수 있습니다.)
@end deffn

@geindex setstate() (codecs.IncrementalDecoder 메서드)
@anchor{library/codecs codecs IncrementalDecoder setstate}@anchor{288b}
@deffn {메서드} setstate (state)

디코더의 상태를 `state'로 설정합니다. `state'는 @ref{288a,,getstate()}가 반환한 디코더 상태여야 합니다.
@end deffn
@end deffn

@node 스트림 인코딩과 디코딩,,증분 인코딩과 디코딩,코덱 베이스 클래스
@anchor{library/codecs stream-encoding-and-decoding}@anchor{288c}
@subsubsection 스트림 인코딩과 디코딩


@ref{285f,,StreamWriter}와 @ref{2860,,StreamReader} 클래스는 새로운 인코딩 서브 모듈을 매우 쉽게 구현하는 데 사용할 수 있는 범용 작업 인터페이스를 제공합니다. 이를 수행하는 방법에 대한 예는 @code{encodings.utf_8}을 참조하십시오.

@menu
* StreamWriter 객체:: 
* StreamReader 객체:: 
* StreamReaderWriter 객체:: 
* StreamRecoder 객체:: 

@end menu

@node StreamWriter 객체,StreamReader 객체,,스트림 인코딩과 디코딩
@anchor{library/codecs stream-writer-objects}@anchor{288d}@anchor{library/codecs streamwriter-objects}@anchor{288e}
@subsubsection StreamWriter 객체


@ref{285f,,StreamWriter} 클래스는 @ref{287e,,Codec}의 서브 클래스이며 파이썬 코덱 레지스트리와 호환되도록 모든 스트림 기록기가 정의해야 하는 다음 메서드를 정의합니다.

@geindex StreamWriter (codecs 클래스)
@anchor{library/codecs codecs StreamWriter}@anchor{285f}
@deffn {클래스} codecs.StreamWriter (stream, errors='strict')

@ref{285f,,StreamWriter} 인스턴스의 생성자.

모든 스트림 기록기는 이 생성자 인터페이스를 제공해야 합니다. 추가 키워드 인자를 자유롭게 추가할 수 있지만, 여기에 정의된 키워드 인자만 파이썬 코덱 레지스트리에서 사용됩니다.

`stream' 인자는 특정 코덱에 적합하도록 텍스트나 바이너리 데이터를 쓰기 위해 열린 파일류 객체여야 합니다.

@ref{285f,,StreamWriter}는 `errors' 키워드 인자를 제공하여 다른 에러 처리 체계를 구현할 수 있습니다. 하부 스트림 코덱이 지원할 수 있는 표준 에러 처리기에 대해서는 @ref{1b6d,,에러 처리기}를 참조하십시오.

`errors' 인자는 같은 이름의 어트리뷰트에 대입됩니다. 이 어트리뷰트에 대입하면 @ref{285f,,StreamWriter} 객체의 수명 동안 다른 에러 처리 전략 간에 전환할 수 있습니다.

@geindex write() (codecs.StreamWriter 메서드)
@anchor{library/codecs codecs StreamWriter write}@anchor{288f}
@deffn {메서드} write (object)

스트림에 인코딩된 객체의 내용을 씁니다.
@end deffn

@geindex writelines() (codecs.StreamWriter 메서드)
@anchor{library/codecs codecs StreamWriter writelines}@anchor{2890}
@deffn {메서드} writelines (list)

이어붙인 문자열의 이터러블을 스트림에 씁니다 (@ref{288f,,write()} 메서드를 재사용할 수 있습니다). 무한하거나 아주 큰 이터러블은 지원되지 않습니다. 표준 바이트열-바이트열 코덱은 이 메서드를 지원하지 않습니다.
@end deffn

@geindex reset() (codecs.StreamWriter 메서드)
@anchor{library/codecs codecs StreamWriter reset}@anchor{2891}
@deffn {메서드} reset ()

내부 상태를 유지하는 데 사용되는 코덱 버퍼를 재설정합니다.

이 메서드를 호출하면 출력의 데이터가 깨끗한 상태가 되어 상태를 복구하기 위해 전체 스트림을 다시 스캔하지 않고도 새로운 최신 데이터를 추가할 수 있도록 합니다.
@end deffn
@end deffn

위의 메서드 외에도, @ref{285f,,StreamWriter}는 하부 스트림에서 온 다른 모든 메서드와 어트리뷰트를 상속해야 합니다.

@node StreamReader 객체,StreamReaderWriter 객체,StreamWriter 객체,스트림 인코딩과 디코딩
@anchor{library/codecs stream-reader-objects}@anchor{2892}@anchor{library/codecs streamreader-objects}@anchor{2893}
@subsubsection StreamReader 객체


@ref{2860,,StreamReader} 클래스는 @ref{287e,,Codec}의 서브 클래스이며 파이썬 코덱 레지스트리와 호환되도록 모든 스트림 판독기가 정의해야 하는 다음 메서드를 정의합니다.

@geindex StreamReader (codecs 클래스)
@anchor{library/codecs codecs StreamReader}@anchor{2860}
@deffn {클래스} codecs.StreamReader (stream, errors='strict')

@ref{2860,,StreamReader} 인스턴스의 생성자.

모든 스트림 판독기는 이 생성자 인터페이스를 제공해야 합니다. 추가 키워드 인자를 자유롭게 추가할 수 있지만, 여기에 정의된 키워드 인자만 파이썬 코덱 레지스트리에서 사용됩니다.

`stream' 인자는 특정 코덱에 적합하게 텍스트나 바이너리 데이터를 읽기 위해 열린 파일류 객체여야 합니다.

@ref{2860,,StreamReader}는 `errors' 키워드 인자를 제공하여 다른 에러 처리 체계를 구현할 수 있습니다. 하부 스트림 코덱이 지원할 수 있는 표준 에러 처리기에 대해서는 @ref{1b6d,,에러 처리기}를 참조하십시오.

`errors' 인자는 같은 이름의 어트리뷰트에 대입됩니다. 이 어트리뷰트에 대입하면 @ref{2860,,StreamReader} 객체의 수명 동안 다른 에러 처리 전략 간에 전환할 수 있습니다.

`errors' 인자에 허용되는 값 집합은 @ref{16a0,,register_error()}로 확장될 수 있습니다.

@geindex read() (codecs.StreamReader 메서드)
@anchor{library/codecs codecs StreamReader read}@anchor{2894}
@deffn {메서드} read (size=-1, chars=-1, firstline=False)

스트림에서 데이터를 디코딩하고 결과 객체를 반환합니다.

`chars' 인자는 반환할 디코딩 된 코드 포인트나 바이트의 수를 나타냅니다. @ref{2894,,read()} 메서드는 요청된 것보다 더 많은 데이터를 반환하지 않지만, 사용 가능한 것이 충분하지 않으면 더 적게 반환할 수 있습니다.

`size' 인자는 디코딩을 위해 읽을 인코딩 된 바이트나 코드 포인트의 대략적인 최대 수를 나타냅니다. 디코더는 이 설정을 적절하게 수정할 수 있습니다. 기본값 -1은 가능한 한 많이 읽고 디코딩함을 나타냅니다. 이 매개 변수는 커다란 파일을 한 번에 디코딩하지 않도록 하기 위한 것입니다.

`firstline' 플래그는 이후 줄에 디코딩 에러가 있으면 첫 번째 줄만 반환해도 충분함을 나타냅니다.

이 메서드는 탐욕스러운(greedy) 읽기 전략을 사용해야 합니다. 즉, 인코딩 정의와 주어진 size 내에서 허용되는 만큼 많은 데이터를 읽어야 합니다. 예를 들어 스트림에 선택적 인코딩 종료나 상태 마커가 있으면, 이것도 읽어야 합니다.
@end deffn

@geindex readline() (codecs.StreamReader 메서드)
@anchor{library/codecs codecs StreamReader readline}@anchor{2895}
@deffn {메서드} readline (size=None, keepends=True)

입력 스트림에서 한 줄을 읽고 디코딩된 데이터를 반환합니다.

주어지면, `size'는 스트림의 @ref{2894,,read()} 메서드에 size 인자로 전달됩니다.

`keepends'가 거짓이면 줄 종료가 반환된 줄에서 제거됩니다.
@end deffn

@geindex readlines() (codecs.StreamReader 메서드)
@anchor{library/codecs codecs StreamReader readlines}@anchor{2896}
@deffn {메서드} readlines (sizehint=None, keepends=True)

입력 스트림에서 사용 가능한 모든 줄을 읽고 줄의 리스트로 반환합니다.

줄 종료는 코덱의 @ref{1104,,decode()} 메서드를 사용하여 구현되며 `keepends'가 참이면 리스트 항목에 포함됩니다.

주어지면, `sizehint'는 스트림의 @ref{2894,,read()} 메서드에 `size' 인자로 전달됩니다.
@end deffn

@geindex reset() (codecs.StreamReader 메서드)
@anchor{library/codecs codecs StreamReader reset}@anchor{2897}
@deffn {메서드} reset ()

내부 상태를 유지하는 데 사용되는 코덱 버퍼를 재설정합니다.

스트림 위치 변경이 발생하지 않아야 함에 유의하십시오. 이 메서드는 주로 디코딩 에러에서 복구할 수 있도록 하기 위한 것입니다.
@end deffn
@end deffn

위의 메서드 외에도 @ref{2860,,StreamReader}는 하부 스트림에서 다른 모든 메서드와 어트리뷰트를 상속해야 합니다.

@node StreamReaderWriter 객체,StreamRecoder 객체,StreamReader 객체,스트림 인코딩과 디코딩
@anchor{library/codecs stream-reader-writer}@anchor{2898}@anchor{library/codecs streamreaderwriter-objects}@anchor{2899}
@subsubsection StreamReaderWriter 객체


@ref{2868,,StreamReaderWriter} 는 읽기와 쓰기 모드 모두에서 작동하는 스트림을 래핑하도록 하는 편의 클래스입니다.

@ref{b5c,,lookup()} 함수가 반환한 팩토리 함수를 사용하여 인스턴스를 구성할 수 있도록 설계되었습니다.

@geindex StreamReaderWriter (codecs 클래스)
@anchor{library/codecs codecs StreamReaderWriter}@anchor{2868}
@deffn {클래스} codecs.StreamReaderWriter (stream, Reader, Writer, errors='strict')

@ref{2868,,StreamReaderWriter} 인스턴스를 만듭니다. `stream'은 파일류 객체여야 합니다. `Reader'와 `Writer'는 각각 @ref{2860,,StreamReader}와 @ref{285f,,StreamWriter} 인터페이스를 제공하는 팩토리 함수나 클래스여야 합니다. 에러 처리는 스트림 판독기와 기록기에 정의된 것과 같은 방식으로 수행됩니다.
@end deffn

@ref{2868,,StreamReaderWriter} 인스턴스는 @ref{2860,,StreamReader}와 @ref{285f,,StreamWriter} 클래스가 결합한 인터페이스를 정의합니다. 하부 스트림에서 다른 모든 메서드와 어트리뷰트를 상속합니다.

@node StreamRecoder 객체,,StreamReaderWriter 객체,스트림 인코딩과 디코딩
@anchor{library/codecs stream-recoder-objects}@anchor{289a}@anchor{library/codecs streamrecoder-objects}@anchor{289b}
@subsubsection StreamRecoder 객체


@ref{1dd1,,StreamRecoder}는 한 인코딩에서 다른 인코딩으로 데이터를 변환하는데, 이는 때때로 다른 인코딩 환경을 다룰 때 유용합니다.

@ref{b5c,,lookup()} 함수가 반환한 팩토리 함수를 사용하여 인스턴스를 구성할 수 있도록 설계되었습니다.

@geindex StreamRecoder (codecs 클래스)
@anchor{library/codecs codecs StreamRecoder}@anchor{1dd1}
@deffn {클래스} codecs.StreamRecoder (stream, encode, decode, Reader, Writer, errors='strict')

양방향 변환을 구현하는 @ref{1dd1,,StreamRecoder} 인스턴스를 만듭니다: `encode'와 `decode'는 프런트 엔드에 작동합니다 - @ref{2894,,read()}와 @ref{288f,,write()}를 호출하는 코드가 보는 데이터, 반면에 `Reader'와 `Writer'는 백 엔드에 작동합니다 - `stream'의 데이터.

이러한 객체를 사용하여 투명한 트랜스코딩을 수행 할 수 있습니다, 예를 들어, Latin-1 에서 UTF-8로 또는 그 반대로.

`stream' 인자는 파일류 객체여야 합니다.

`encode'와 `decode' 인자는 @ref{287e,,Codec} 인터페이스를 준수해야 합니다. `Reader'와 `Writer'는 각각 @ref{2860,,StreamReader}와 @ref{285f,,StreamWriter} 인터페이스의 객체를 제공하는 팩토리 함수나 클래스여야 합니다.

에러 처리는 스트림 판독기와 기록기에 정의된 것과 같은 방식으로 수행됩니다.
@end deffn

@ref{1dd1,,StreamRecoder} 인스턴스는 @ref{2860,,StreamReader}와 @ref{285f,,StreamWriter} 클래스가 결합한 인터페이스를 정의합니다. 하부 스트림에서 다른 모든 메서드와 어트리뷰트를 상속합니다.

@node 인코딩과 유니코드,표준 인코딩,코덱 베이스 클래스,codecs — 코덱 레지스트리와 베이스 클래스
@anchor{library/codecs encodings-and-unicode}@anchor{289c}@anchor{library/codecs encodings-overview}@anchor{289d}
@subsubsection 인코딩과 유니코드


문자열은 @code{U+0000}–@code{U+10FFFF} 범위의 코드 포인트 시퀀스로 내부적으로 저장됩니다. (구현에 대한 자세한 내용은 
@geindex Python 향상 제안; PEP 393
PEP 393@footnote{https://peps.python.org/pep-0393/}을 참조하십시오.) 일단 문자열 객체가 CPU와 메모리 외부에서 사용되면, 엔디안(endianness)과 이러한 배열이 바이트열로 저장되는 방식이 문제가 됩니다. 다른 코덱과 마찬가지로, 문자열을 바이트 시퀀스로 직렬화하는 것을 `인코딩'이라고 하며, 바이트 시퀀스에서 문자열을 다시 만드는 것을 `디코딩'이라고 합니다. 다양한 텍스트 직렬화 코덱이 있으며, 이를 집합적으로 @ref{25db,,텍스트 인코딩}이라고 합니다.

가장 간단한 텍스트 인코딩(@code{'latin-1'} 또는 @code{'iso-8859-1'}이라고 합니다)은 코드 포인트 0–255를 바이트 @code{0x0}–@code{0xff}로 매핑합니다. 이것은 @code{U+00FF} 위의 코드 포인트를 포함하는 문자열 객체는 이 코덱으로 인코딩할 수 없음을 뜻합니다. 그렇게 하면 다음과 유사한 @ref{886,,UnicodeEncodeError} 가 발생합니다 (에러 메시지의 세부 사항은 다를 수 있습니다): @code{UnicodeEncodeError: 'latin-1' codec can't encode character '\u1234' in position 3: ordinal not in range(256)}.

모든 유니코드 코드 포인트의 다른 부분 집합과 이러한 코드 포인트가 바이트 @code{0x0}–@code{0xff}에 매핑되는 방식을 선택하는 또 다른 인코딩 그룹(소위 charmap 인코딩)이 있습니다. 이 작업을 수행하는 방법을 보려면 간단히 예를 들어 @code{encodings/cp1252.py}(윈도우에서 주로 사용되는 인코딩)를 열어보십시오. 어떤 문자가 어떤 바이트 값에 매핑되는지를 나타내는 256개의 문자로 구성된 문자열 상수가 있습니다.

All of these encodings can only encode 256 of the 1114112 code points
defined in Unicode. A simple and straightforward way that can store each Unicode
code point, is to store each code point as four consecutive bytes. There are two
possibilities: store the bytes in big endian or in little endian order. These
two encodings are called @code{UTF-32-BE} and @code{UTF-32-LE} respectively. Their
disadvantage is that if, for example, you use @code{UTF-32-BE} on a little endian
machine you will always have to swap bytes on encoding and decoding.
Python’s @code{UTF-16} and @code{UTF-32} codecs avoid this problem by using the
platform’s native byte order when no BOM is present.
Python follows prevailing platform
practice, so native-endian data round-trips without redundant byte swapping,
even though the Unicode Standard defaults to big-endian when the byte order is
unspecified. When these bytes are read by a CPU with a different endianness,
the bytes have to be swapped. To be able to detect the endianness of a
@code{UTF-16} or @code{UTF-32} byte sequence, a BOM (“Byte Order Mark”) is used.
This is the Unicode character @code{U+FEFF}. This character can be prepended to every
@code{UTF-16} or @code{UTF-32} byte sequence. The byte swapped version of this character
(@code{0xFFFE}) is an illegal character that may not appear in a Unicode text.
When the first character of a @code{UTF-16} or @code{UTF-32} byte sequence is
@code{U+FFFE}, the bytes have to be swapped on decoding.

Unfortunately the character @code{U+FEFF} had a second purpose as
a @code{ZERO WIDTH NO-BREAK SPACE}: a character that has no width and doesn’t allow
a word to be split. It can e.g. be used to give hints to a ligature algorithm.
With Unicode 4.0 using @code{U+FEFF} as a @code{ZERO WIDTH NO-BREAK SPACE} has been
deprecated (with @code{U+2060} (@code{WORD JOINER}) assuming this role). Nevertheless
Unicode software still must be able to handle @code{U+FEFF} in both roles: as a BOM
it’s a device to determine the storage layout of the encoded bytes, and vanishes
once the byte sequence has been decoded into a string; as a @code{ZERO WIDTH
NO-BREAK SPACE} it’s a normal character that will be decoded like any other.

유니코드 문자의 전체 범위를 인코딩 할 수 있는 또 다른 인코딩이 있습니다: UTF-8. UTF-8은 8비트 인코딩입니다. UTF-8에서는 바이트 순서에 관한 문제가 없음을 의미합니다. UTF-8 바이트 시퀀스의 각 바이트는 두 부분으로 구성됩니다: 마커 비트(최상위 비트)와 페이로드 비트. 마커 비트는 0에서 4개의 @code{1} 비트와 그 뒤에 @code{0}비트가 오는 시퀀스입니다. 유니코드 문자는 다음과 같이 인코딩됩니다 (x는 페이로드 비트이며, 이어 붙이면 유니코드 문자가 됩니다):


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

범위

@tab

인코딩

@item

@code{U-00000000} … @code{U-0000007F}

@tab

0xxxxxxx

@item

@code{U-00000080} … @code{U-000007FF}

@tab

110xxxxx 10xxxxxx

@item

@code{U-00000800} … @code{U-0000FFFF}

@tab

1110xxxx 10xxxxxx 10xxxxxx

@item

@code{U-00010000} … @code{U-0010FFFF}

@tab

11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

@end multitable


유니코드 문자의 최하위 비트는 가장 오른쪽에 있는 x 비트입니다.

UTF-8은 8비트 인코딩이라서 BOM이 필요하지 않으며 디코딩된 문자열의 모든 @code{U+FEFF} 문자(첫 번째 문자라 할지라도)는 @code{ZERO WIDTH NO-BREAK SPACE}로 처리됩니다.

외부 정보 없이 문자열 인코딩에 사용된 인코딩을 신뢰성 있게 결정하는 것은 불가능합니다. 각 charmap 인코딩은 모든 임의의 바이트 시퀀스를 디코딩 할 수 있습니다. 그러나 UTF-8에서는 그렇지 않습니다, UTF-8 바이트 시퀀스는 임의의 바이트 시퀀스를 허용하지 않는 구조를 갖기 때문입니다. UTF-8 인코딩 감지의 신뢰성을 높이기 위해, Microsoft는 메모장(Notepad) 프로그램을 위해 UTF-8의 변형을 발명했습니다 (파이썬에서 @code{"utf-8-sig"}라고 부릅니다): 유니코드 문자를 파일에 쓰기 전에, UTF-8 인코딩된 BOM(다음과 같은 바이트 시퀀스로 표시됩니다: @code{0xef}, @code{0xbb}, @code{0xbf})이 기록됩니다. 모든 charmap 인코딩된 파일이 이러한 바이트 값으로 시작한다는 것은 다소 불가능하기 때문에 (예를 들어 iso-8859-1 에서 다음과 같은 것으로 매핑됩니다

@quotation


@display
LATIN SMALL LETTER I WITH DIAERESIS@w{ }
RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK@w{ }
INVERTED QUESTION MARK@w{ }
@end display


@end quotation

), 바이트 시퀀스에서 @code{utf-8-sig} 인코딩을 정확하게 추측할 수 있는 가능성을 높입니다. 따라서 여기서 BOM은 바이트 시퀀스를 생성하는 데 사용되는 바이트 순서를 결정할 수 있도록 하는데 사용되지는 않지만, 인코딩을 추측하는 데 도움이 되는 서명으로 사용됩니다. 인코딩할 때 utf-8-sig 코덱은 @code{0xef}, @code{0xbb}, @code{0xbf}를 파일의 처음 3바이트로 기록합니다. 디코딩할 때 @code{utf-8-sig}는 파일에서 처음 3바이트에 등장하면 이 3바이트를 건너뜁니다. UTF-8에서는, BOM 사용을 권장하지 않으며 일반적으로 피해야 합니다.

@node 표준 인코딩,파이썬 특정 인코딩,인코딩과 유니코드,codecs — 코덱 레지스트리와 베이스 클래스
@anchor{library/codecs id3}@anchor{289e}@anchor{library/codecs standard-encodings}@anchor{fb7}
@subsubsection 표준 인코딩


Python comes with a number of codecs built-in, either implemented as C functions
or with dictionaries as mapping tables. The following table lists the codecs by
name, together with a few common aliases, and the languages for which the
encoding is likely used. Neither the list of aliases nor the list of languages
is meant to be exhaustive. Notice that spelling alternatives that only differ in
case or use a hyphen instead of an underscore are also valid aliases
because they are equivalent when normalized by
@ref{9fd,,normalize_encoding()}. For example, @code{'utf-8'} is a valid
alias for the @code{'utf_8'} codec.

@cartouche
@quotation 참고 
The below table lists the most common aliases, for a complete list
refer to the source aliases.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/encodings/aliases.py} file.
@end quotation
@end cartouche

On Windows, @code{cpXXX} codecs are available for all code pages.
But only codecs listed in the following table are guarantead to exist on
other platforms.

일부 공통 인코딩은 코덱 조회 메커니즘을 우회하여 성능을 향상할 수 있습니다. 이러한 최적화 기회는 CPython에서만 제한된 (대소 문자를 구분하는) 별칭 집합에 대해서 인식됩니다:  utf-8, utf8, latin-1, latin1, iso-8859-1, iso8859-1, mbcs (윈도우 전용), ascii, us-ascii, utf-16, utf16, utf-32, utf32 및 대시 대신 밑줄을 사용한 것들. 이러한 인코딩에 대체 대안 별칭을 사용하면 실행 속도가 느려질 수 있습니다.


버전 3.6에서 변경: us-ascii에서 최적화 기회가 인식됩니다.


많은 문자 집합이 같은 언어를 지원합니다. 개별 문자(예를 들어 EURO SIGN 지원 여부)와 코드 위치에 문자를 대입하는 것에서 다릅니다. 특히 유럽 언어의 경우, 일반적으로 다음과 같은 변형이 있습니다:


@itemize *

@item 
ISO 8859 코드 집합

@item 
Microsoft 윈도우 코드 페이지, 일반적으로 8859 코드 집합에서 파생되지만, 제어 문자를 추가 그래픽 문자로 대체합니다

@item 
IBM EBCDIC 코드 페이지

@item 
IBM PC 코드 페이지, ASCII와 호환됩니다
@end itemize


@multitable {xxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

코덱

@tab

별칭

@tab

언어

@item

ascii

@tab

646, us-ascii

@tab

영어

@item

big5

@tab

big5-tw, csbig5

@tab

중국어 번체

@item

big5hkscs

@tab

big5-hkscs, hkscs

@tab

중국어 번체

@item

cp037

@tab

IBM037, IBM039

@tab

영어

@item

cp273

@tab

273, IBM273, csIBM273

@tab

독일어


Added in version 3.4.


@item

cp424

@tab

EBCDIC-CP-HE, IBM424

@tab

히브리어

@item

cp437

@tab

437, IBM437

@tab

영어

@item

cp500

@tab

EBCDIC-CP-BE, EBCDIC-CP-CH,
IBM500

@tab

서유럽어

@item

cp720

@tab

@tab

아랍어

@item

cp737

@tab

@tab

그리스어

@item

cp775

@tab

IBM775

@tab

발트어

@item

cp850

@tab

850, IBM850

@tab

서유럽어

@item

cp852

@tab

852, IBM852

@tab

중부와 동유럽어

@item

cp855

@tab

855, IBM855

@tab

벨라루스어, 불가리아어, 마케도니아어, 러시아어, 세르비아어

@item

cp856

@tab

@tab

히브리어

@item

cp857

@tab

857, IBM857

@tab

터키어

@item

cp858

@tab

858, IBM858

@tab

서유럽어

@item

cp860

@tab

860, IBM860

@tab

포르투갈어

@item

cp861

@tab

861, CP-IS, IBM861

@tab

아이슬란드어

@item

cp862

@tab

862, IBM862

@tab

히브리어

@item

cp863

@tab

863, IBM863

@tab

캐나다어

@item

cp864

@tab

IBM864

@tab

아랍어

@item

cp865

@tab

865, IBM865

@tab

덴마크어, 노르웨이어

@item

cp866

@tab

866, IBM866

@tab

러시아어

@item

cp869

@tab

869, CP-GR, IBM869

@tab

그리스어

@item

cp874

@tab

@tab

태국어

@item

cp875

@tab

@tab

그리스어

@item

cp932

@tab

932, ms932, mskanji, ms-kanji,
windows-31j

@tab

일본어

@item

cp949

@tab

949, ms949, uhc

@tab

한국어

@item

cp950

@tab

950, ms950

@tab

중국어 번체

@item

cp1006

@tab

@tab

우르두어

@item

cp1026

@tab

ibm1026

@tab

터키어

@item

cp1125

@tab

1125, ibm1125, cp866u, ruscii

@tab

우크라이나어


Added in version 3.4.


@item

cp1140

@tab

ibm1140

@tab

서유럽어

@item

cp1250

@tab

windows-1250

@tab

중부와 동유럽어

@item

cp1251

@tab

windows-1251

@tab

벨라루스어, 불가리아어, 마케도니아어, 러시아어, 세르비아어

@item

cp1252

@tab

windows-1252

@tab

서유럽어

@item

cp1253

@tab

windows-1253

@tab

그리스어

@item

cp1254

@tab

windows-1254

@tab

터키어

@item

cp1255

@tab

windows-1255

@tab

히브리어

@item

cp1256

@tab

windows-1256

@tab

아랍어

@item

cp1257

@tab

windows-1257

@tab

발트어

@item

cp1258

@tab

windows-1258

@tab

베트남어

@item

euc_jp

@tab

eucjp, ujis, u-jis

@tab

일본어

@item

euc_jis_2004

@tab

jisx0213, eucjis2004

@tab

일본어

@item

euc_jisx0213

@tab

eucjisx0213

@tab

일본어

@item

euc_kr

@tab

euckr, korean, ksc5601,
ks_c-5601, ks_c-5601-1987,
ksx1001, ks_x-1001

@tab

한국어

@item

gb2312

@tab

chinese, csiso58gb231280,
euc-cn, euccn, eucgb2312-cn,
gb2312-1980, gb2312-80,
iso-ir-58

@tab

중국어 간체

@item

gbk

@tab

936, cp936, ms936

@tab

통합 중국어

@item

gb18030

@tab

gb18030-2000

@tab

통합 중국어

@item

hz

@tab

hzgb, hz-gb, hz-gb-2312

@tab

중국어 간체

@item

iso2022_jp

@tab

csiso2022jp, iso2022jp,
iso-2022-jp

@tab

일본어

@item

iso2022_jp_1

@tab

iso2022jp-1, iso-2022-jp-1

@tab

일본어

@item

iso2022_jp_2

@tab

iso2022jp-2, iso-2022-jp-2

@tab

일본어, 한국어, 중국어 간체, 서유럽어, 그리스어

@item

iso2022_jp_2004

@tab

iso2022jp-2004,
iso-2022-jp-2004

@tab

일본어

@item

iso2022_jp_3

@tab

iso2022jp-3, iso-2022-jp-3

@tab

일본어

@item

iso2022_jp_ext

@tab

iso2022jp-ext, iso-2022-jp-ext

@tab

일본어

@item

iso2022_kr

@tab

csiso2022kr, iso2022kr,
iso-2022-kr

@tab

한국어

@item

latin_1

@tab

iso-8859-1, iso8859-1, 8859,
cp819, latin, latin1, L1

@tab

서유럽어

@item

iso8859_2

@tab

iso-8859-2, latin2, L2

@tab

중부와 동유럽어

@item

iso8859_3

@tab

iso-8859-3, latin3, L3

@tab

에스페란토어, 몰타어

@item

iso8859_4

@tab

iso-8859-4, latin4, L4

@tab

Northern Europe

@item

iso8859_5

@tab

iso-8859-5, cyrillic

@tab

벨라루스어, 불가리아어, 마케도니아어, 러시아어, 세르비아어

@item

iso8859_6

@tab

iso-8859-6, arabic

@tab

아랍어

@item

iso8859_7

@tab

iso-8859-7, greek, greek8

@tab

그리스어

@item

iso8859_8

@tab

iso-8859-8, hebrew

@tab

히브리어

@item

iso8859_9

@tab

iso-8859-9, latin5, L5

@tab

터키어

@item

iso8859_10

@tab

iso-8859-10, latin6, L6

@tab

북유럽어

@item

iso8859_11

@tab

iso-8859-11, thai

@tab

태국어

@item

iso8859_13

@tab

iso-8859-13, latin7, L7

@tab

발트어

@item

iso8859_14

@tab

iso-8859-14, latin8, L8

@tab

켈틱어

@item

iso8859_15

@tab

iso-8859-15, latin9, L9

@tab

서유럽어

@item

iso8859_16

@tab

iso-8859-16, latin10, L10

@tab

남유럽어

@item

johab

@tab

cp1361, ms1361

@tab

한국어

@item

koi8_r

@tab

@tab

러시아어

@item

koi8_t

@tab

@tab

타지크어


Added in version 3.5.


@item

koi8_u

@tab

@tab

우크라이나어

@item

kz1048

@tab

kz_1048, strk1048_2002, rk1048

@tab

카자흐어


Added in version 3.5.


@item

mac_cyrillic

@tab

maccyrillic

@tab

벨라루스어, 불가리아어, 마케도니아어, 러시아어, 세르비아어

@item

mac_greek

@tab

macgreek

@tab

그리스어

@item

mac_iceland

@tab

maciceland

@tab

아이슬란드어

@item

mac_latin2

@tab

maclatin2, maccentraleurope,
mac_centeuro

@tab

중부와 동유럽어

@item

mac_roman

@tab

macroman, macintosh

@tab

서유럽어

@item

mac_turkish

@tab

macturkish

@tab

터키어

@item

ptcp154

@tab

csptcp154, pt154, cp154,
cyrillic-asian

@tab

카자흐어

@item

shift_jis

@tab

csshiftjis, shiftjis, sjis,
s_jis

@tab

일본어

@item

shift_jis_2004

@tab

shiftjis2004, sjis_2004,
sjis2004

@tab

일본어

@item

shift_jisx0213

@tab

shiftjisx0213, sjisx0213,
s_jisx0213

@tab

일본어

@item

utf_32

@tab

U32, utf32

@tab

모든 언어

@item

utf_32_be

@tab

UTF-32BE

@tab

모든 언어

@item

utf_32_le

@tab

UTF-32LE

@tab

모든 언어

@item

utf_16

@tab

U16, utf16

@tab

모든 언어

@item

utf_16_be

@tab

UTF-16BE

@tab

모든 언어

@item

utf_16_le

@tab

UTF-16LE

@tab

모든 언어

@item

utf_7

@tab

U7, unicode-1-1-utf-7

@tab

모든 언어

@item

utf_8

@tab

U8, UTF, utf8, cp65001

@tab

모든 언어

@item

utf_8_sig

@tab

@tab

모든 언어

@end multitable



버전 3.4에서 변경: utf-16* 과 utf-32* 인코더는 더는 서로게이트 코드 포인트(@code{U+D800}–@code{U+DFFF})를 인코딩할 수 없습니다. utf-32* 디코더는 더는 서로게이트 코드 포인트에 해당하는 바이트 시퀀스를 디코딩하지 않습니다.



버전 3.8에서 변경: @code{cp65001}은 이제 @code{utf_8}의 별칭입니다.



버전 3.14에서 변경: On Windows, @code{cpXXX} codecs are now available for all code pages.


@node 파이썬 특정 인코딩,encodings — Encodings package,표준 인코딩,codecs — 코덱 레지스트리와 베이스 클래스
@anchor{library/codecs python-specific-encodings}@anchor{289f}
@subsubsection 파이썬 특정 인코딩


사전 정의된 많은 코덱이 파이썬에만 해당하여, 코덱 이름은 파이썬 외부에서 의미가 없습니다. 예상되는 입력과 출력형에 따라 아래 표에 나열되어 있습니다 (텍스트 인코딩은 코덱의 가장 일반적인 사용 사례이지만, 하부 코덱 인프라는 단지 텍스트 인코딩이 아닌 임의의 데이터 변환을 지원합니다). 비대칭 코덱의 경우, 언급된 의미는 인코딩 방향을 설명합니다.

@menu
* 텍스트 인코딩:: 
* 바이너리 변환:: 
* Standalone Codec Functions:: 
* 텍스트 변환:: 

@end menu

@node 텍스트 인코딩,바이너리 변환,,파이썬 특정 인코딩
@anchor{library/codecs text-encodings}@anchor{28a0}
@subsubsection 텍스트 인코딩


다음 코덱은 유니코드 텍스트 인코딩과 유사하게, @ref{169,,str}에서 @ref{192,,bytes}로의 인코딩과 @ref{193,,바이트열류 객체}에서 @code{str}로의 디코딩을 제공합니다.


@multitable {xxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

코덱

@tab

별칭

@tab

의미

@item

idna

@tab

@tab

@geindex RFC; RFC 3490
RFC 3490@footnote{https://datatracker.ietf.org/doc/html/rfc3490.html}을 구현합니다. @ref{56,,encodings.idna}도 참조하십시오. @code{errors='strict'}만 지원됩니다.

@item

mbcs

@tab

ansi,
dbcs

@tab

윈도우 전용: ANSI 코드 페이지(CP_ACP)에 따라 피연산자를 인코딩합니다.

@item

oem

@tab

@tab

윈도우 전용: OEM 코드 페이지(CP_OEMCP)에 따라 피연산자를 인코딩합니다.


Added in version 3.6.


@item

palmos

@tab

@tab

PalmOS 3.5의 인코딩.

@item

punycode

@tab

@tab

@geindex RFC; RFC 3492
RFC 3492@footnote{https://datatracker.ietf.org/doc/html/rfc3492.html}를 구현합니다. 상태 있는 코덱은 지원되지 않습니다.

@item

raw_unicode_escape

@tab

@tab

다른 코드 포인트를 위해 @code{\u@var{XXXX}}와 @code{\U@var{XXXXXXXX}}를 사용하는 Latin-1 인코딩. 기존 역 슬래시는 어떤 방식으로도 이스케이프 되지 않습니다. 파이썬 피클 프로토콜에서 사용됩니다.

@item

undefined

@tab

@tab

This Codec should only
be used for testing
purposes.

모든 변환에 대해 예외를 발생시킵니다, 빈 문자열조차. 에러 처리기는 무시됩니다.

@item

unicode_escape

@tab

@tab

따옴표가 이스케이프 되지 않는 것을 제외하고, ASCII로 인코딩된 파이썬 소스 코드에서 유니코드 리터럴 내용으로 적합한 인코딩. Latin-1 소스 코드에서 디코딩합니다. 파이썬 소스 코드는 실제로는 기본적으로 UTF-8을 사용합니다.

@end multitable



버전 3.8에서 변경: “unicode_internal” 코덱이 제거되었습니다.


@node 바이너리 변환,Standalone Codec Functions,텍스트 인코딩,파이썬 특정 인코딩
@anchor{library/codecs binary-transforms}@anchor{1105}@anchor{library/codecs id4}@anchor{28a1}
@subsubsection 바이너리 변환


다음 코덱은 바이너리 변환을 제공합니다: @ref{193,,바이트열류 객체}에서 @ref{192,,bytes}로의 매핑.  (@ref{169,,str} 출력만 생성하는) @ref{ad3,,bytes.decode()}에서는 지원되지 않습니다.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

코덱

@tab

별칭

@tab

의미

@tab

인코더 / 디코더

@item

base64_codec @footnote{
@code{'base64_codec'}는 @ref{193,,바이트열류 객체} 외에도 디코딩을 위해 ASCII만 있는 @ref{169,,str} 인스턴스도 허용합니다.
}

@tab

base64, base_64

@tab

피연산자를 여러 줄 MIME base64로 변환합니다 (결과에는 항상 후행 @code{'\n'}이 포함됩니다).


버전 3.4에서 변경: 인코딩과 디코딩을 위해 모든 @ref{193,,바이트열류 객체}를 입력으로 받아들입니다.


@tab

@ref{b4c,,base64.encodebytes()} /
@ref{b4d,,base64.decodebytes()}

@item

bz2_codec

@tab

bz2

@tab

bz2를 사용하여 피연산자를 압축합니다.

@tab

@ref{28a2,,bz2.compress()} /
@ref{1293,,bz2.decompress()}

@item

hex_codec

@tab

hex

@tab

바이트 당 두 자리 숫자를 사용하여, 피연산자를 16진 표현으로 변환합니다.

@tab

@ref{28a3,,binascii.b2a_hex()} /
@ref{28a4,,binascii.a2b_hex()}

@item

quopri_codec

@tab

quopri,
quotedprintable,
quoted_printable

@tab

피연산자를 MIME quoted printable로 변환합니다.

@tab

@code{quotetabs=True}를 사용한 @ref{28a5,,quopri.encode()} / @ref{28a6,,quopri.decode()}

@item

uu_codec

@tab

uu

@tab

uuencode를 사용하여 피연산자를 변환합니다.

@tab

@item

zlib_codec

@tab

zip, zlib

@tab

gzip을 사용하여 피연산자를 압축합니다.

@tab

@ref{84e,,zlib.compress()} /
@ref{f08,,zlib.decompress()}

@end multitable



Added in version 3.2: 바이너리 변환의 복원.



버전 3.4에서 변경: 바이너리 변환에 대한 별칭의 복원.


@node Standalone Codec Functions,텍스트 변환,바이너리 변환,파이썬 특정 인코딩
@anchor{library/codecs id6}@anchor{28a7}@anchor{library/codecs standalone-codec-functions}@anchor{28a8}
@subsubsection Standalone Codec Functions


The following functions provide encoding and decoding functionality similar to codecs,
but are not available as named codecs through @ref{1103,,codecs.encode()} or @ref{1104,,codecs.decode()}.
They are used internally (for example, by @ref{ab,,pickle}) and behave similarly to the
@code{string_escape} codec that was removed in Python 3.

@geindex codecs.escape_encode() (codecs 모듈)
@anchor{library/codecs codecs codecs escape_encode}@anchor{28a9}
@deffn {함수} codecs.escape_encode (input, errors=None)

Encode `input' using escape sequences. Similar to how @ref{1c1,,repr()} on bytes
produces escaped byte values.

`input' must be a @ref{192,,bytes} object.

Returns a tuple @code{(output, length)} where `output' is a @ref{192,,bytes}
object and `length' is the number of bytes consumed.
@end deffn

@geindex codecs.escape_decode() (codecs 모듈)
@anchor{library/codecs codecs codecs escape_decode}@anchor{28aa}
@deffn {함수} codecs.escape_decode (input, errors=None)

Decode `input' from escape sequences back to the original bytes.

`input' must be a @ref{193,,bytes-like object}.

Returns a tuple @code{(output, length)} where `output' is a @ref{192,,bytes}
object and `length' is the number of bytes consumed.
@end deffn

@node 텍스트 변환,,Standalone Codec Functions,파이썬 특정 인코딩
@anchor{library/codecs id7}@anchor{28ab}@anchor{library/codecs text-transforms}@anchor{1106}
@subsubsection 텍스트 변환


다음 코덱은 텍스트 변환을 제공합니다: @ref{169,,str}에서 @code{str}로의 매핑. (@ref{192,,bytes} 출력만 생성하는) @ref{ad2,,str.encode()}에서는 지원되지 않습니다.


@multitable {xxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

코덱

@tab

별칭

@tab

의미

@item

rot_13

@tab

rot13

@tab

피연산자의 시저 암호(Caesar-cypher) 암호화를 반환합니다.

@end multitable



Added in version 3.2: @code{rot_13} 텍스트 변환 복원.



버전 3.4에서 변경: @code{rot13} 별칭 복원.


@node encodings — Encodings package,encodings idna — Internationalized Domain Names in Applications,파이썬 특정 인코딩,codecs — 코덱 레지스트리와 베이스 클래스
@anchor{library/codecs encodings-encodings-package}@anchor{28ac}@anchor{library/codecs module-encodings}@anchor{55}
@subsubsection @code{encodings} — Encodings package


@geindex module; encodings

This module implements the following functions:

@geindex normalize_encoding() (encodings 모듈)
@anchor{library/codecs encodings normalize_encoding}@anchor{9fd}
@deffn {함수} encodings.normalize_encoding (encoding)

Normalize encoding name `encoding'.

Normalization works as follows: all non-alphanumeric characters except the
dot used for Python package names are collapsed and replaced with a single
underscore, leading and trailing underscores are removed.
For example, @code{'  -;#'} becomes @code{'_'}.

Note that `encoding' should be ASCII only.
@end deffn

@cartouche
@quotation 참고 
The following functions should not be used directly, except for testing
purposes; @ref{b5c,,codecs.lookup()} should be used instead.
@end quotation
@end cartouche

@geindex search_function() (encodings 모듈)
@anchor{library/codecs encodings search_function}@anchor{1760}
@deffn {함수} encodings.search_function (encoding)

Search for the codec module corresponding to the given encoding name
`encoding'.

This function first normalizes the `encoding' using
@ref{9fd,,normalize_encoding()}, then looks for a corresponding alias.
It attempts to import a codec module from the encodings package using either
the alias or the normalized name. If the module is found and defines a valid
@code{getregentry()} function that returns a @ref{1a6c,,codecs.CodecInfo} object,
the codec is cached and returned.

If the codec module defines a @code{getaliases()} function any returned aliases
are registered for future use.
@end deffn

@geindex win32_code_page_search_function() (encodings 모듈)
@anchor{library/codecs encodings win32_code_page_search_function}@anchor{28ad}
@deffn {함수} encodings.win32_code_page_search_function (encoding)

Search for a Windows code page encoding `encoding' of the form @code{cpXXXX}.

If the code page is valid and supported, return a @ref{1a6c,,codecs.CodecInfo}
object for it.

@ref{213c,,가용성}: Windows.


Added in version 3.14.

@end deffn

This module implements the following exception:

@geindex CodecRegistryError
@anchor{library/codecs encodings CodecRegistryError}@anchor{28ae}
@deffn {예외} encodings.CodecRegistryError

Raised when a codec is invalid or incompatible.
@end deffn

@node encodings idna — Internationalized Domain Names in Applications,encodings mbcs — Windows ANSI codepage,encodings — Encodings package,codecs — 코덱 레지스트리와 베이스 클래스
@anchor{library/codecs encodings-idna-internationalized-domain-names-in-applications}@anchor{28af}@anchor{library/codecs module-encodings idna}@anchor{56}
@subsubsection @code{encodings.idna} — Internationalized Domain Names in Applications


@geindex module; encodings.idna

이 모듈은 
@geindex RFC; RFC 3490
RFC 3490@footnote{https://datatracker.ietf.org/doc/html/rfc3490.html}(Internationalized Domain Names in Applications)과 
@geindex RFC; RFC 3492
RFC 3492@footnote{https://datatracker.ietf.org/doc/html/rfc3492.html}(Nameprep: A Stringprep Profile for Internationalized Domain Names (IDN))를 구현합니다. @code{punycode} 인코딩과 @ref{da,,stringprep}을 기반으로 합니다.

If you need the IDNA 2008 standard from 
@geindex RFC; RFC 5891
RFC 5891@footnote{https://datatracker.ietf.org/doc/html/rfc5891.html} and 
@geindex RFC; RFC 5895
RFC 5895@footnote{https://datatracker.ietf.org/doc/html/rfc5895.html}, use the
third-party idna@footnote{https://pypi.org/project/idna/} module.

이 RFC는 함께 도메인 이름에서 비 ASCII 문자를 지원하는 프로토콜을 정의합니다. 비 ASCII 문자(가령 @code{www.Alliancefrançaise.nu})를 포함하는 도메인 이름은 ASCII 호환 인코딩(ACE, 가령 @code{www.xn--alliancefranaise-npb.nu})으로 변환됩니다. 그런 다음 도메인 이름의 ACE 형식은 DNS 조회, HTTP @code{Host} 필드 등과 같이 프로토콜에 의해 임의의 문자가 허용되지 않는 모든 위치에서 사용됩니다. 이 변환은 응용 프로그램에서 수행됩니다; 가능하다면 사용자에게 보이지 않습니다: 응용 프로그램은 전송 시에 유니코드 도메인 레이블을 투명하게 IDNA로 변환하고, 사용자에게 표시하기 전에 ACE 레이블을 다시 유니코드로 변환해야 합니다.

파이썬은 여러 가지 방식으로 이 변환을 지원합니다: @code{idna} 코덱은 유니코드와 ACE 간의 변환을 수행하여, 
@geindex RFC; RFC 3490 Section 3.1
RFC 3490의 섹션 3.1@footnote{https://datatracker.ietf.org/doc/html/rfc3490.html#section-3.1}에 정의된 구분 문자를 기반으로 입력 문자열을 레이블로 분리하고 필요에 따라 각 레이블을 ACE로 변환하고, 반대로 입력 바이트 문자열을 @code{.} 구분 기호를 기반으로 레이블로 분리하고 모든 ACE 레이블을 유니코드로 변환합니다. 또한, @ref{d1,,socket} 모듈은 유니코드 호스트 이름을 투명하게 ACE로 변환하므로, 응용 프로그램이 호스트 이름을 소켓 모듈로 전달할 때 호스트 이름 자체를 변환할 필요가 없습니다. 이에 더해, @ref{73,,http.client}와 @ref{62,,ftplib}와 같은, 함수 매개 변수로 호스트 이름이 있는 모듈은 유니코드 호스트 이름을 받아들입니다 (@code{http.client}는 해당 필드를 전송한다면 @code{Host} 필드에 IDNA 호스트 이름을 투명하게 전송합니다).

회선에서 호스트 이름을 수신할 때 (가령 역 이름 조회(reverse name lookup)에서), 유니코드로 자동 변환되지 않습니다: 이러한 호스트 이름을 사용자에게 제시하려는 응용 프로그램은 유니코드로 디코딩해야 합니다.

The module @code{encodings.idna} also implements the nameprep procedure, which
performs certain normalizations on host names, to achieve case-insensitivity of
international domain names, and to unify similar characters. The nameprep
functions can be used directly if desired.

@geindex nameprep() (encodings.idna 모듈)
@anchor{library/codecs encodings idna nameprep}@anchor{28b0}
@deffn {함수} encodings.idna.nameprep (label)

`label'의 nameprep 된 버전을 반환합니다. 구현은 현재 쿼리 문자열을 가정하므로, @code{AllowUnassigned}는 참입니다.
@end deffn

@geindex ToASCII() (encodings.idna 모듈)
@anchor{library/codecs encodings idna ToASCII}@anchor{28b1}
@deffn {함수} encodings.idna.ToASCII (label)

@geindex RFC; RFC 3490
RFC 3490@footnote{https://datatracker.ietf.org/doc/html/rfc3490.html}에 지정된 대로 레이블을 ASCII로 변환합니다. @code{UseSTD3ASCIIRules}는 거짓으로 가정합니다.
@end deffn

@geindex ToUnicode() (encodings.idna 모듈)
@anchor{library/codecs encodings idna ToUnicode}@anchor{28b2}
@deffn {함수} encodings.idna.ToUnicode (label)

@geindex RFC; RFC 3490
RFC 3490@footnote{https://datatracker.ietf.org/doc/html/rfc3490.html}에 지정된 대로 레이블을 유니코드로 변환합니다.
@end deffn

@node encodings mbcs — Windows ANSI codepage,encodings utf_8_sig — UTF-8 codec with BOM signature,encodings idna — Internationalized Domain Names in Applications,codecs — 코덱 레지스트리와 베이스 클래스
@anchor{library/codecs encodings-mbcs-windows-ansi-codepage}@anchor{28b3}@anchor{library/codecs module-encodings mbcs}@anchor{57}
@subsubsection @code{encodings.mbcs} — Windows ANSI codepage


@geindex module; encodings.mbcs

이 모듈은 ANSI 코드 페이지(CP_ACP)를 구현합니다.

@ref{213c,,가용성}: Windows.


버전 3.2에서 변경: 3.2 이전에는, `errors' 인자가 무시되었습니다; 인코딩에는 항상 @code{'replace'}가 사용되고, 디코딩에는 항상 @code{'ignore'}가 사용되었습니다.



버전 3.3에서 변경: 모든 에러 처리기를 지원합니다.


@node encodings utf_8_sig — UTF-8 codec with BOM signature,,encodings mbcs — Windows ANSI codepage,codecs — 코덱 레지스트리와 베이스 클래스
@anchor{library/codecs encodings-utf-8-sig-utf-8-codec-with-bom-signature}@anchor{28b4}@anchor{library/codecs module-encodings utf_8_sig}@anchor{58}
@subsubsection @code{encodings.utf_8_sig} — UTF-8 codec with BOM signature


@geindex module; encodings.utf_8_sig

이 모듈은 UTF-8 코덱의 변형을 구현합니다. 인코딩 시, UTF-8로 인코딩된 BOM을 UTF-8로 인코딩된 바이트열 앞에 붙입니다. 상태 있는 인코더의 경우 이 작업은 한 번만 수행됩니다 (바이트 스트림에 대한 첫 번째 쓰기 시). 디코딩 시, 데이터 시작에 있는 선택적 UTF-8 인코딩된 BOM을 건너뜁니다.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 데이터형,숫자와 수학 모듈,바이너리 데이터 서비스,파이썬 표준 라이브러리
@anchor{library/datatypes doc}@anchor{28b5}@anchor{library/datatypes data-types}@anchor{28b6}@anchor{library/datatypes datatypes}@anchor{28b7}@anchor{library/datatypes translation-repo}@anchor{28b8}
@section 데이터형


이 장에서 설명하는 모듈은 날짜와 시간, 고정형 배열, 힙 큐, 데크, 열거형과 같은 다양한 특수 데이터형을 제공합니다.

파이썬은 또한 일부 내장 데이터형, 특히 @ref{183,,dict}, @ref{24d,,list}, @ref{184,,set}과 @ref{7f1,,frozenset}, @ref{610,,tuple}을 제공합니다. @ref{169,,str} 클래스는 유니코드 문자열을 저장하는 데 사용되고, @ref{192,,bytes}와 @ref{344,,bytearray} 클래스는 바이너리 데이터를 저장하는 데 사용됩니다.

이 장에서는 다음 모듈에 관해 설명합니다:

@menu
* datetime — Basic date and time types:: 
* zoneinfo — IANA 시간대 지원:: 
* calendar — 일반 달력 관련 함수:: 
* collections — 컨테이너 데이터형:: 
* collections.abc — 컨테이너의 추상 베이스 클래스: collections abc — 컨테이너의 추상 베이스 클래스. 
* heapq — 힙 큐 알고리즘:: 
* bisect — 배열 이진 분할 알고리즘:: 
* array — 효율적인 숫자 배열:: 
* weakref — Weak references:: 
* types — 동적 형 생성과 내장형 이름:: 
* copy — 얕은 복사와 깊은 복사 연산:: 
* pprint — 예쁜 데이터 인쇄기:: 
* reprlib — 대안 repr() 구현: reprlib — 대안 repr 구현. 
* enum — 열거형 지원:: 
* graphlib — 그래프와 유사한 구조에 작동하는 기능:: 

@end menu

@node datetime — Basic date and time types,zoneinfo — IANA 시간대 지원,,데이터형
@anchor{library/datetime doc}@anchor{28b9}@anchor{library/datetime datetime-basic-date-and-time-types}@anchor{28ba}@anchor{library/datetime module-datetime}@anchor{34}
@subsection @code{datetime} — Basic date and time types


@geindex module; datetime

`소스 코드:' Lib/datetime.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/datetime.py}


__________________________________________________________________


The @code{datetime} module supplies classes for manipulating dates and times.

날짜와 시간 산술이 지원되지만, 구현의 초점은 출력 포매팅과 조작을 위한 효율적인 어트리뷰트 추출입니다.

@cartouche
@quotation 팁 
Skip to @ref{28bb,,the format codes}.
@end quotation
@end cartouche


@subsubheading 더 보기



@table @asis

@item 모듈 @ref{15,,calendar}

일반 달력 관련 함수들.

@item 모듈 @ref{f4,,time}

시간 액세스와 변환.

@item Module @ref{13a,,zoneinfo}

Concrete time zones representing the IANA time zone database.

@item 패키지 dateutil@footnote{https://dateutil.readthedocs.io/en/stable/}

시간대와 구문 분석 지원이 확장된 제삼자 라이브러리.

@item Package DateType@footnote{https://pypi.org/project/DateType/}

Third-party library that introduces distinct static types to for example,
allow @ref{573,,static type checkers}
to differentiate between naive and aware datetimes.
@end table


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

@end menu

@node Aware and naive objects,상수,,datetime — Basic date and time types
@anchor{library/datetime aware-and-naive-objects}@anchor{28bc}@anchor{library/datetime datetime-naive-aware}@anchor{28bd}
@subsubsection Aware and naive objects


Date and time objects may be categorized as “aware” or “naive” depending on
whether or not they include time zone information.

시간대와 일광 절약 시간 정보와 같은 적용 가능한 알고리즘과 정치적 시간 조정에 대한 충분한 지식을 통해, `어웨어' 객체는 다른 어웨어 객체와의 상대적인 위치를 파악할 수 있습니다. 어웨어 객체는 자의적으로 해석할 여지 없는 특정 시간을 나타냅니다. @footnote{
If, that is, we ignore the effects of relativity.
}

A `naive' object does not contain enough information to unambiguously locate
itself relative to other date/time objects. Whether a naive object represents
Coordinated Universal Time (UTC), local time, or time in some other time zone is
purely up to the program, just like it is up to the program whether a
particular number represents metres, miles, or mass. Naive objects are easy to
understand and to work with, at the cost of ignoring some aspects of reality.

For applications requiring aware objects, @ref{4e2,,datetime} and @ref{1fb,,time}
objects have an optional time zone information attribute, @code{tzinfo}, that
can be set to an instance of a subclass of the abstract @code{tzinfo} class.
These @ref{7f5,,tzinfo} objects capture information about the offset from UTC
time, the time zone name, and whether daylight saving time is in effect.

Only one concrete @ref{7f5,,tzinfo} class, the @ref{12c4,,timezone} class, is
supplied by the @code{datetime} module. The @code{timezone} class can
represent simple time zones with fixed offsets from UTC, such as UTC itself or
North American EST and EDT time zones. Supporting time zones at deeper levels of
detail is up to the application. The rules for time adjustment across the
world are more political than rational, change frequently, and there is no
standard suitable for every application aside from UTC.

@node 상수,Available types,Aware and naive objects,datetime — Basic date and time types
@anchor{library/datetime constants}@anchor{28be}
@subsubsection 상수


The @code{datetime} module exports the following constants:

@geindex MINYEAR (datetime 모듈)
@anchor{library/datetime datetime MINYEAR}@anchor{28bf}
@deffn {데이터} datetime.MINYEAR

The smallest year number allowed in a @ref{1fa,,date} or @ref{4e2,,datetime} object.
@ref{28bf,,MINYEAR} is 1.
@end deffn

@geindex MAXYEAR (datetime 모듈)
@anchor{library/datetime datetime MAXYEAR}@anchor{28c0}
@deffn {데이터} datetime.MAXYEAR

The largest year number allowed in a @ref{1fa,,date} or @ref{4e2,,datetime} object.
@ref{28c0,,MAXYEAR} is 9999.
@end deffn

@geindex UTC (datetime 모듈)
@anchor{library/datetime datetime UTC}@anchor{712}
@deffn {데이터} datetime.UTC

Alias for the UTC time zone singleton @ref{826,,datetime.timezone.utc}.


Added in version 3.11.

@end deffn

@node Available types,timedelta objects,상수,datetime — Basic date and time types
@anchor{library/datetime available-types}@anchor{28c1}
@subsubsection Available types



@deffn {클래스} datetime.date

현재의 그레고리력이 언제나 적용되어왔고, 앞으로도 그럴 것이라는 가정하에 이상적인 나이브 날짜. 어트리뷰트: @ref{28c2,,year}, @ref{28c3,,month} 및 @ref{28c4,,day}.
@end deffn


@deffn {클래스} datetime.time

특정 날짜와 관계없이, 하루가 정확히 24*60*60초를 갖는다는 가정하에 이상적인 시간. (여기에는 “윤초”라는 개념이 없습니다.) 어트리뷰트: @ref{28c5,,hour}, @ref{28c6,,minute}, @ref{28c7,,second}, @ref{28c8,,microsecond} 및 @ref{28c9,,tzinfo}.
@end deffn


@deffn {클래스} datetime.datetime

날짜와 시간의 조합. 어트리뷰트: @ref{28ca,,year}, @ref{28cb,,month}, @ref{28cc,,day}, @ref{28cd,,hour}, @ref{28ce,,minute}, @ref{28cf,,second}, @ref{28d0,,microsecond} 및 @ref{28d1,,tzinfo}.
@end deffn


@deffn {클래스} datetime.timedelta

A duration expressing the difference between two @ref{4e2,,datetime}
or @ref{1fa,,date} instances to microsecond resolution.
@end deffn


@deffn {클래스} datetime.tzinfo

시간대 정보 객체의 추상 베이스 클래스. 이것들은 @ref{4e2,,datetime}과 @ref{1fb,,time} 클래스에서 사용자 정의할 수 있는 시간 조정 개념(예를 들어, 시간대와/나 일광 절약 시간을 다루는 것)을 제공하기 위해 사용됩니다.
@end deffn


@deffn {클래스} datetime.timezone

@ref{7f5,,tzinfo} 추상 베이스 클래스를 구현하는 클래스로, UTC로부터의 고정 오프셋을 나타냅니다.


Added in version 3.2.

@end deffn

이러한 형의 객체는 불변입니다.

Subclass relationships:


@float Figure

@image{python-figures/datetime-inheritance,,,timedelta@comma{} tzinfo@comma{} time@comma{} and date inherit from object; timezone inherits from tzinfo; and datetime inherits from date.,svg}

@end float


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

@end menu

@node Common properties,Determining if an object is aware or naive,,Available types
@anchor{library/datetime common-properties}@anchor{28d2}
@subsubsection Common properties


@ref{1fa,,date}, @ref{4e2,,datetime}, @ref{1fb,,time} 및 @ref{12c4,,timezone} 형은 다음과 같은 공통 기능을 공유합니다:


@itemize -

@item 
이러한 형의 객체는 불변입니다.

@item 
Objects of these types are @ref{823,,hashable}, meaning that they can be used as
dictionary keys.

@item 
이러한 형의 객체는 @ref{ab,,pickle} 모듈을 통한 효율적인 피클링을 지원합니다.
@end itemize

@node Determining if an object is aware or naive,,Common properties,Available types
@anchor{library/datetime determining-if-an-object-is-aware-or-naive}@anchor{28d3}
@subsubsection Determining if an object is aware or naive


@ref{1fa,,date} 형의 객체는 항상 나이브합니다.

@ref{1fb,,time}이나 @ref{4e2,,datetime} 형의 객체는 어웨어할 수도 나이브할 수도 있습니다.

A @ref{4e2,,datetime} object @code{d} is aware if both of the following hold:


@enumerate 

@item 
@code{d.tzinfo}가 @code{None}이 아닙니다

@item 
@code{d.tzinfo.utcoffset(d)}가 @code{None}을 반환하지 않습니다
@end enumerate

Otherwise, @code{d} is naive.

A @ref{1fb,,time} object @code{t} is aware if both of the following hold:


@enumerate 

@item 
@code{t.tzinfo}가 @code{None}이 아닙니다

@item 
@code{t.tzinfo.utcoffset(None)}이 @code{None}을 반환하지 않습니다
@end enumerate

Otherwise, @code{t} is naive.

어웨어와 나이브 간의 차이점은 @ref{bc2,,timedelta} 객체에는 적용되지 않습니다.

@node timedelta objects,date objects,Available types,datetime — Basic date and time types
@anchor{library/datetime datetime-timedelta}@anchor{28d4}@anchor{library/datetime timedelta-objects}@anchor{28d5}
@subsubsection @code{timedelta} objects


A @ref{bc2,,timedelta} object represents a duration, the difference between two
@ref{4e2,,datetime} or @ref{1fa,,date} instances.

@geindex timedelta (datetime 클래스)
@anchor{library/datetime datetime timedelta}@anchor{bc2}
@deffn {클래스} datetime.timedelta (days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)

All arguments are optional and default to 0. Arguments may be integers
or floats, and may be positive or negative.

`days', `seconds' 및 `microseconds'만 내부적으로 저장됩니다. 인자는 이 단위로 변환됩니다:


@itemize *

@item 
밀리 초는 1000마이크로초로 변환됩니다.

@item 
분은 60초로 변환됩니다.

@item 
시간은 3600초로 변환됩니다.

@item 
주는 7일로 변환됩니다.
@end itemize

그런 다음 days, seconds 및 microseconds를 다음처럼 정규화하여 표현이 고유하도록 만듭니다


@itemize *

@item 
@code{0 <= microseconds < 1000000}

@item 
@code{0 <= seconds < 3600*24} (하루 내의 초 수)

@item 
@code{-999999999 <= days <= 999999999}
@end itemize

다음 예는 `days', `seconds' 및 `microseconds' 이외의 인자가 어떻게 “병합” 되어 세 개의 결과 어트리뷰트로 정규화되는지를 보여줍니다:

@example
>>> import datetime as dt
>>> delta = dt.timedelta(
...     days=50,
...     seconds=27,
...     microseconds=10,
...     milliseconds=29000,
...     minutes=5,
...     hours=8,
...     weeks=2
... )
>>> # Only days, seconds, and microseconds remain
>>> delta
datetime.timedelta(days=64, seconds=29156, microseconds=10)
@end example

@cartouche
@quotation 팁 
@code{import datetime as dt} instead of @code{import datetime} or
@code{from datetime import datetime} to avoid confusion between the module
and the class. See How I Import Python’s datetime Module@footnote{https://adamj.eu/tech/2019/09/12/how-i-import-pythons-datetime-module/}.
@end quotation
@end cartouche

인자가 float이고 부분 마이크로초가 있으면, 모든 인자의 남은 부분 마이크로초가 합쳐지고, 그 합은 동률일 때 짝수로 반올림하는 방식으로 가장 가까운 마이크로초로 반올림됩니다. float 인자가 없으면, 변환과 정규화 프로세스는 정확합니다 (정보가 손실되지 않습니다).

정규화된 days 값이 표시된 범위를 벗어나면, @ref{a81,,OverflowError}가 발생합니다.

음수 값의 정규화는 처음 보면 놀라울 수 있습니다. 예를 들어:

@example
>>> import datetime as dt
>>> d = dt.timedelta(microseconds=-1)
>>> (d.days, d.seconds, d.microseconds)
(-1, 86399, 999999)
@end example

Since the string representation of @code{timedelta} objects can be confusing,
use the following recipe to produce a more readable format:

@example
>>> def pretty_timedelta(td):
...     if td.days >= 0:
...         return str(td)
...     return f'-(@{-td!s@})'
...
>>> d = timedelta(hours=-1)
>>> str(d)  # not human-friendly
'-1 day, 23:00:00'
>>> pretty_timedelta(d)
'-(1:00:00)'
@end example
@end deffn

클래스 어트리뷰트:

@geindex min (datetime.timedelta의 속성)
@anchor{library/datetime datetime timedelta min}@anchor{28d6}
@deffn {속성} timedelta.min

가장 음수인 @ref{bc2,,timedelta} 객체, @code{timedelta(-999999999)}.
@end deffn

@geindex max (datetime.timedelta의 속성)
@anchor{library/datetime datetime timedelta max}@anchor{28d7}
@deffn {속성} timedelta.max

가장 양수인 @ref{bc2,,timedelta} 객체, @code{timedelta(days=999999999, hours=23, minutes=59, seconds=59, microseconds=999999)}.
@end deffn

@geindex resolution (datetime.timedelta의 속성)
@anchor{library/datetime datetime timedelta resolution}@anchor{28d8}
@deffn {속성} timedelta.resolution

같지 않은 @ref{bc2,,timedelta} 객체 간의 가능한 가장 작은 차이, @code{timedelta(microseconds=1)}.
@end deffn

Note that, because of normalization, @code{timedelta.max} is greater than @code{-timedelta.min}.
@code{-timedelta.max} is not representable as a @ref{bc2,,timedelta} object.

인스턴스 어트리뷰트 (읽기 전용):

@geindex days (datetime.timedelta의 속성)
@anchor{library/datetime datetime timedelta days}@anchor{28d9}
@deffn {속성} timedelta.days

Between -999,999,999 and 999,999,999 inclusive.
@end deffn

@geindex seconds (datetime.timedelta의 속성)
@anchor{library/datetime datetime timedelta seconds}@anchor{28da}
@deffn {속성} timedelta.seconds

Between 0 and 86,399 inclusive.

@cartouche
@quotation 조심 
It is a somewhat common bug for code to unintentionally use this attribute
when it is actually intended to get a @ref{150a,,total_seconds()}
value instead:

@example
>>> import datetime as dt
>>> duration = dt.timedelta(seconds=11235813)
>>> duration.days, duration.seconds
(130, 3813)
>>> duration.total_seconds()
11235813.0
@end example
@end quotation
@end cartouche
@end deffn

@geindex microseconds (datetime.timedelta의 속성)
@anchor{library/datetime datetime timedelta microseconds}@anchor{28db}
@deffn {속성} timedelta.microseconds

Between 0 and 999,999 inclusive.
@end deffn

지원되는 연산:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

연산

@tab

결과

@item

@code{t1 = t2 + t3}

@tab

Sum of @code{t2} and @code{t3}.
Afterwards @code{t1 - t2 == t3} and
@code{t1 - t3 == t2} are true. (1)

@item

@code{t1 = t2 - t3}

@tab

Difference of @code{t2}  and @code{t3}. Afterwards
@code{t1 == t2 - t3} and @code{t2 == t1 + t3} are
true. (1)(6)

@item

@code{t1 = t2 * i 또는 t1 = i * t2}

@tab

Delta multiplied by an integer.
Afterwards @code{t1 // i == t2} is true,
provided @code{i != 0}.

@item

@tab

In general, @code{t1  * i == t1 * (i-1) + t1}
is true. (1)

@item

@code{t1 = t2 * f 또는 t1 = f * t2}

@tab

델타에 float를 곱합니다. 결과는 동률일 때 짝수로 반올림하는 방식으로 timedelta.resolution의 가장 가까운 배수로 자리 올림 됩니다.

@item

@code{f = t2 / t3}

@tab

Division (3) of overall duration @code{t2} by
interval unit @code{t3}. Returns a @ref{196,,float}
object.

@item

@code{t1 = t2 / f 또는 t1 = t2 / i}

@tab

델타를 float나 int로 나눈 값. 결과는 동률일 때 짝수로 반올림하는 방식으로 timedelta.resolution의 가장 가까운 배수로 자리 올림 됩니다.

@item

@code{t1 = t2 // i} 또는 @code{t1 = t2 // t3}

@tab

floor가 계산되고 나머지(있다면)를 버립니다. 두 번째 경우에는, 정수가 반환됩니다. (3)

@item

@code{t1 = t2 % t3}

@tab

나머지가 @ref{bc2,,timedelta} 객체로 계산됩니다. (3)

@item

@code{q, r = divmod(t1, t2)}

@tab

Computes the quotient and the remainder:
@code{q = t1 // t2} (3) and @code{r = t1 % t2}.
@code{q} is an integer and @code{r} is a
@ref{bc2,,timedelta} object.

@item

@code{+t1}

@tab

같은 값을 갖는 @ref{bc2,,timedelta} 객체를 반환합니다. (2)

@item

@code{-t1}

@tab

Equivalent to @code{timedelta(-t1.days,
-t1.seconds, -t1.microseconds)},
and to @code{t1 * -1}. (1)(4)

@item

@code{abs(t)}

@tab

Equivalent to @code{+t} when @code{t.days >= 0},
and to @code{-t} when @code{t.days < 0}. (2)

@item

@code{str(t)}

@tab

@code{[D day[s], ][H]H:MM:SS[.UUUUUU]} 형식의 문자열을 반환합니다. 여기서 D는 음의 @code{t}일 때 음수입니다. (5)

@item

@code{repr(t)}

@tab

규범적 어트리뷰트 값을 가진 생성자 호출로 표현한 @ref{bc2,,timedelta} 객체의 문자열 표현을 반환합니다.

@end multitable


노트:


@enumerate 

@item 
이것은 정확하지만, 오버플로 할 수 있습니다.

@item 
이것은 정확하고, 오버플로 할 수 없습니다.

@item 
Division by zero raises @ref{b3f,,ZeroDivisionError}.

@item 
@code{-timedelta.max} is not representable as a @ref{bc2,,timedelta} object.

@item 
@ref{bc2,,timedelta} 객체의 문자열 표현은 내부 표현과 유사하게 정규화됩니다. 이것은 음의 timedelta가 다소 이상하게 표현되는 결과로 이어집니다. 예를 들어:

@example
>>> timedelta(hours=-5)
datetime.timedelta(days=-1, seconds=68400)
>>> print(_)
-1 day, 19:00:00
@end example

@item 
@code{t2 - t3} 표현식은 항상 @code{t2 + (-t3)} 표현식과 같아지는데, t3이 @code{timedelta.max}일 때만 예외입니다; 이때는 앞에 있는 것은 결과를 만들지만, 뒤에 있는 것은 오버플로를 일으킵니다.
@end enumerate

위에 나열된 연산 외에도, @ref{bc2,,timedelta} 객체는 @ref{1fa,,date}와 @ref{4e2,,datetime} 객체와의 어떤 합과 차를 지원합니다 (아래를 참조하세요).


버전 3.2에서 변경: Floor division and true division of a @ref{bc2,,timedelta} object by another
@code{timedelta} object are now supported, as are remainder operations and
the @ref{b98,,divmod()} function. True division and multiplication of a
@code{timedelta} object by a @ref{196,,float} object are now supported.


@ref{bc2,,timedelta} objects support equality and order comparisons.

불리언 문맥에서 @ref{bc2,,timedelta} 객체는 @code{timedelta(0)}와 같지 않을 때만 참으로 간주합니다.

인스턴스 메서드:

@geindex total_seconds() (datetime.timedelta 메서드)
@anchor{library/datetime datetime timedelta total_seconds}@anchor{150a}
@deffn {메서드} timedelta.total_seconds ()

Return the total number of seconds contained in the duration. Equivalent to
@code{td / timedelta(seconds=1)}. For interval units other than seconds, use the
division form directly (for example, @code{td / timedelta(microseconds=1)}).

매우 큰 시간 구간에서는 (대부분 플랫폼에서 270년 이상), 이 메서드는 마이크로초의 정확도를 잃게 됩니다.


Added in version 3.2.

@end deffn

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

@end menu

@node Examples of usage timedelta,,,timedelta objects
@anchor{library/datetime examples-of-usage-timedelta}@anchor{28dc}
@subsubsection Examples of usage: @code{timedelta}


정규화의 추가 예:

@example
>>> # Components of another_year add up to exactly 365 days
>>> import datetime as dt
>>> year = dt.timedelta(days=365)
>>> another_year = dt.timedelta(weeks=40, days=84, hours=23,
...                             minutes=50, seconds=600)
>>> year == another_year
True
>>> year.total_seconds()
31536000.0
@end example

@ref{bc2,,timedelta} 산술의 예:

@example
>>> import datetime as dt
>>> year = dt.timedelta(days=365)
>>> ten_years = 10 * year
>>> ten_years
datetime.timedelta(days=3650)
>>> ten_years.days // 365
10
>>> nine_years = ten_years - year
>>> nine_years
datetime.timedelta(days=3285)
>>> three_years = nine_years // 3
>>> three_years, three_years.days // 365
(datetime.timedelta(days=1095), 3)
@end example

@node date objects,datetime objects,timedelta objects,datetime — Basic date and time types
@anchor{library/datetime date-objects}@anchor{28dd}@anchor{library/datetime datetime-date}@anchor{28de}
@subsubsection @code{date} objects


@ref{1fa,,date} 객체는 현재의 그레고리력을 무한히 양방향으로 확장한, 이상적인 달력에서의 날짜(년, 월, 일)를 나타냅니다.

1년 1월 1일을 날 번호 1, 1년 1월 2일을 날 번호 2라고 부르고, 이런 식으로 계속됩니다. @footnote{
이것은 Dershowitz와 Reingold의 책 `Calendrical Calculations'에 나오는 “역산 그레고리(proleptic Gregorian)” 달력의 정의와 일치합니다. 이 달력은 모든 계산의 기본 달력입니다. 역산 그레고리력 서수(ordinal)와 다른 많은 달력 시스템 사이의 변환을 위한 알고리즘에 관해서는 이 책을 참조하십시오.
}

@geindex date (datetime 클래스)
@anchor{library/datetime datetime date}@anchor{1fa}
@deffn {클래스} datetime.date (year, month, day)

모든 인자가 필수입니다. 인자는 다음 범위에 있는 정수이어야 합니다:


@itemize *

@item 
@code{MINYEAR <= year <= MAXYEAR}

@item 
@code{1 <= month <= 12}

@item 
@code{1 <= day <= 주어진 month와 year에서의 날 수}
@end itemize

이 범위를 벗어나는 인자가 주어지면, @ref{2ec,,ValueError}가 발생합니다.
@end deffn

다른 생성자, 모든 클래스 메서드:

@geindex today() (datetime.date의 클래스 메서드)
@anchor{library/datetime datetime date today}@anchor{16cf}
@deffn {메서드} classmethod date.today ()

현재 지역 날짜를 반환합니다.

이것은 @code{date.fromtimestamp(time.time())}과 동등합니다.
@end deffn

@geindex fromtimestamp() (datetime.date의 클래스 메서드)
@anchor{library/datetime datetime date fromtimestamp}@anchor{dcc}
@deffn {메서드} classmethod date.fromtimestamp (timestamp)

Return the local date corresponding to the POSIX `timestamp', such as is
returned by @ref{55c,,time.time()}.

타임스탬프가 플랫폼 C @code{localtime()} 함수에서 지원하는 값 범위를 벗어나면 @ref{a81,,OverflowError}가 발생하고, @code{localtime()} 실패 시 @ref{2c0,,OSError}가 발생합니다. 이것이 1970년에서 2038년으로 제한되는 것이 일반적입니다. 타임스탬프라는 개념에 윤초를 포함하는 POSIX가 아닌 시스템에서는, 윤초가 @ref{dcc,,fromtimestamp()}에서 무시됨에 유의하십시오.


버전 3.3에서 변경: timestamp가 플랫폼 C @code{localtime()} 함수에서 지원하는 값 범위를 벗어나면 @ref{2ec,,ValueError} 대신 @ref{a81,,OverflowError}를 발생시킵니다. @code{localtime()} 실패 시 @code{ValueError} 대신 @ref{2c0,,OSError}를 발생시킵니다.

@end deffn

@geindex fromordinal() (datetime.date의 클래스 메서드)
@anchor{library/datetime datetime date fromordinal}@anchor{dcb}
@deffn {메서드} classmethod date.fromordinal (ordinal)

Return the date corresponding to the proleptic Gregorian `ordinal', where
January 1 of year 1 has ordinal 1.

@ref{2ec,,ValueError} is raised unless @code{1 <= ordinal <=
date.max.toordinal()}. For any date @code{d},
@code{date.fromordinal(d.toordinal()) == d}.
@end deffn

@geindex fromisoformat() (datetime.date의 클래스 메서드)
@anchor{library/datetime datetime date fromisoformat}@anchor{827}
@deffn {메서드} classmethod date.fromisoformat (date_string)

Return a @ref{1fa,,date} corresponding to a `date_string' given in any valid
ISO 8601 format, with the following exceptions:


@enumerate 

@item 
Reduced precision dates are not currently supported (@code{YYYY-MM},
@code{YYYY}).

@item 
Extended date representations are not currently supported
(@code{±YYYYYY-MM-DD}).

@item 
Ordinal dates are not currently supported (@code{YYYY-OOO}).
@end enumerate

예제:

@example
>>> import datetime as dt
>>> dt.date.fromisoformat('2019-12-04')
datetime.date(2019, 12, 4)
>>> dt.date.fromisoformat('20191204')
datetime.date(2019, 12, 4)
>>> dt.date.fromisoformat('2021-W01-1')
datetime.date(2021, 1, 4)
@end example


Added in version 3.7.



버전 3.11에서 변경: Previously, this method only supported the format @code{YYYY-MM-DD}.

@end deffn

@geindex fromisocalendar() (datetime.date의 클래스 메서드)
@anchor{library/datetime datetime date fromisocalendar}@anchor{bde}
@deffn {메서드} classmethod date.fromisocalendar (year, week, day)

Return a @ref{1fa,,date} corresponding to the ISO calendar date specified by
`year', `week' and `day'. This is the inverse of the function @ref{af1,,date.isocalendar()}.


Added in version 3.8.

@end deffn

@geindex strptime() (datetime.date의 클래스 메서드)
@anchor{library/datetime datetime date strptime}@anchor{1f9}
@deffn {메서드} classmethod date.strptime (date_string, format)

Return a @ref{1fa,,date} corresponding to `date_string', parsed according to
`format'. This is equivalent to:

@example
date(*(time.strptime(date_string, format)[0:3]))
@end example

@ref{2ec,,ValueError} is raised if the date_string and format
can’t be parsed by @ref{1632,,time.strptime()} or if it returns a value which isn’t a
time tuple.  See also @ref{1b52,,strftime() and strptime() behavior} and
@ref{827,,date.fromisoformat()}.

@cartouche
@quotation 참고 
If `format' specifies a day of month without a year a
@ref{1a3,,DeprecationWarning} is emitted.  This is to avoid a quadrennial
leap year bug in code seeking to parse only a month and day as the
default year used in absence of one in the format is not a leap year.
Such `format' values may raise an error as of Python 3.15.  The
workaround is to always include a year in your `format'.  If parsing
`date_string' values that do not have a year, explicitly add a year that
is a leap year before parsing:

@example
>>> import datetime as dt
>>> date_string = "02/29"
>>> when = dt.date.strptime(f"@{date_string@};1984", "%m/%d;%Y")  # Avoids leap year bug.
>>> when.strftime("%B %d")
'February 29'
@end example
@end quotation
@end cartouche


Added in version 3.14.

@end deffn

클래스 어트리뷰트:

@geindex min (datetime.date의 속성)
@anchor{library/datetime datetime date min}@anchor{28df}
@deffn {속성} date.min

표현 가능한 가장 이른 date, @code{date(MINYEAR, 1, 1)}.
@end deffn

@geindex max (datetime.date의 속성)
@anchor{library/datetime datetime date max}@anchor{28e0}
@deffn {속성} date.max

표현 가능한 가장 늦은 date, @code{date(MAXYEAR, 12, 31)}.
@end deffn

@geindex resolution (datetime.date의 속성)
@anchor{library/datetime datetime date resolution}@anchor{28e1}
@deffn {속성} date.resolution

같지 않은 date 객체 간의 가능한 가장 작은 차이, @code{timedelta(days=1)}.
@end deffn

인스턴스 어트리뷰트 (읽기 전용):

@geindex year (datetime.date의 속성)
@anchor{library/datetime datetime date year}@anchor{28c2}
@deffn {속성} date.year

@ref{28bf,,MINYEAR}와 @ref{28c0,,MAXYEAR} 사이, 경계 포함.
@end deffn

@geindex month (datetime.date의 속성)
@anchor{library/datetime datetime date month}@anchor{28c3}
@deffn {속성} date.month

1과 12 사이, 경계 포함.
@end deffn

@geindex day (datetime.date의 속성)
@anchor{library/datetime datetime date day}@anchor{28c4}
@deffn {속성} date.day

1과 주어진 year의 주어진 month의 날 수 사이.
@end deffn

지원되는 연산:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

연산

@tab

결과

@item

@code{date2 = date1 + timedelta}

@tab

@code{date2} will be @code{timedelta.days} days
after @code{date1}. (1)

@item

@code{date2 = date1 - timedelta}

@tab

Computes @code{date2} such that @code{date2 +
timedelta == date1}. (2)

@item

@code{timedelta = date1 - date2}

@tab

(3)

@item


@display
@code{date1 == date2}@w{ }
@code{date1 != date2}@w{ }
@end display



@tab

Equality comparison. (4)

@item


@display
@code{date1 < date2}@w{ }
@code{date1 > date2}@w{ }
@code{date1 <= date2}@w{ }
@code{date1 >= date2}@w{ }
@end display



@tab

Order comparison. (5)

@end multitable


노트:


@enumerate 

@item 
`date2'는 @code{timedelta.days > 0}이면 미래로, @code{timedelta.days < 0}이면 과거로 이동합니다. 결국 @code{date2 - date1 == timedelta.days}이 됩니다. @code{timedelta.seconds}와 @code{timedelta.microseconds}는 무시됩니다. @code{date2.year}가 @ref{28bf,,MINYEAR}보다 작거나 @ref{28c0,,MAXYEAR}보다 크게 되려고 하면 @ref{a81,,OverflowError}가 발생합니다.

@item 
@code{timedelta.seconds}와 @code{timedelta.microseconds}는 무시됩니다.

@item 
This is exact, and cannot overflow. @code{timedelta.seconds} and
@code{timedelta.microseconds} are 0, and @code{date2 + timedelta == date1} after.

@item 
@ref{1fa,,date} objects are equal if they represent the same date.

@code{date} objects that are not also @ref{4e2,,datetime} instances
are never equal to @code{datetime} objects, even if they represent
the same date.

@item 
`date1' is considered less than `date2' when `date1' precedes `date2' in time.
In other words, @code{date1 < date2} if and only if @code{date1.toordinal() <
date2.toordinal()}.

Order comparison between a @ref{1fa,,date} object that is not also a
@ref{4e2,,datetime} instance and a @code{datetime} object raises
@ref{198,,TypeError}.
@end enumerate


버전 3.13에서 변경: Comparison between @ref{4e2,,datetime} object and an instance of
the @ref{1fa,,date} subclass that is not a @code{datetime} subclass
no longer converts the latter to @code{date}, ignoring the time part
and the time zone.
The default behavior can be changed by overriding the special comparison
methods in subclasses.


불리언 문맥에서, 모든 @ref{1fa,,date} 객체는 참으로 간주합니다.

인스턴스 메서드:

@geindex replace() (datetime.date 메서드)
@anchor{library/datetime datetime date replace}@anchor{19f9}
@deffn {메서드} date.replace (year=self.year, month=self.month, day=self.day)

Return a new @ref{1fa,,date} object with the same values, but with specified
parameters updated.

예제:

@example
>>> import datetime as dt
>>> d = dt.date(2002, 12, 31)
>>> d.replace(day=26)
datetime.date(2002, 12, 26)
@end example

The generic function @ref{1c0,,copy.replace()} also supports @ref{1fa,,date}
objects.
@end deffn

@geindex timetuple() (datetime.date 메서드)
@anchor{library/datetime datetime date timetuple}@anchor{28e2}
@deffn {메서드} date.timetuple ()

@ref{16fe,,time.localtime()}이 반환하는 것과 같은 @ref{ee5,,time.struct_time}을 반환합니다.

시, 분 및 초는 0이고, DST 플래그는 -1입니다.

@code{d.timetuple()}은 다음과 동등합니다:

@example
time.struct_time((d.year, d.month, d.day, 0, 0, 0, d.weekday(), yday, -1))
@end example

where @code{yday = d.toordinal() - date(d.year, 1, 1).toordinal() + 1}
is the day number within the current year starting with 1 for January 1st.
@end deffn

@geindex toordinal() (datetime.date 메서드)
@anchor{library/datetime datetime date toordinal}@anchor{28e3}
@deffn {메서드} date.toordinal ()

Return the proleptic Gregorian ordinal of the date, where January 1 of year 1
has ordinal 1. For any @ref{1fa,,date} object @code{d},
@code{date.fromordinal(d.toordinal()) == d}.
@end deffn

@geindex weekday() (datetime.date 메서드)
@anchor{library/datetime datetime date weekday}@anchor{28e4}
@deffn {메서드} date.weekday ()

정수로 요일을 반환합니다. 월요일은 0이고 일요일은 6입니다. 예를 들어, @code{date(2002, 12, 4).weekday() == 2}, 수요일. @ref{28e5,,isoweekday()}도 참조하십시오.
@end deffn

@geindex isoweekday() (datetime.date 메서드)
@anchor{library/datetime datetime date isoweekday}@anchor{28e5}
@deffn {메서드} date.isoweekday ()

정수로 요일을 반환합니다. 월요일은 1이고 일요일은 7입니다. 예를 들어, @code{date(2002, 12, 4).isoweekday() == 3}, 수요일. @ref{28e4,,weekday()}, @ref{af1,,isocalendar()}도 참조하십시오.
@end deffn

@geindex isocalendar() (datetime.date 메서드)
@anchor{library/datetime datetime date isocalendar}@anchor{af1}
@deffn {메서드} date.isocalendar ()

세 개의 구성 요소가 있는 @ref{85d,,네임드 튜플} 객체를 반환합니다: @code{year}, @code{week} 및 @code{weekday}.

ISO 달력은 널리 사용되는 그레고리력의 변형입니다. @footnote{
See R. H. van Gent’s @uref{https://web.archive.org/web/20220531051136/https://webspace.science.uu.nl/~gent0113/calendar/isocalendar.htm,guide to the mathematics of the ISO 8601 calendar}
for a good explanation.
}

ISO 연도는 52나 53개의 완전한 주로 구성되고, 주는 월요일에 시작하여 일요일에 끝납니다. ISO 연도의 첫 번째 주는 그 해의 (그레고리) 달력에서 목요일이 들어있는 첫 번째 주입니다. 이것을 주 번호 1이라고 하며, 그 목요일의 ISO 연도는 그레고리 연도와 같습니다.

예를 들어, 2004년은 목요일에 시작되므로, ISO 연도 2004의 첫 주는 월요일, 2003년 12월 29일에 시작하고, 일요일, 2004년 1월 4일에 끝납니다:

@example
>>> import datetime as dt
>>> dt.date(2003, 12, 29).isocalendar()
datetime.IsoCalendarDate(year=2004, week=1, weekday=1)
>>> dt.date(2004, 1, 4).isocalendar()
datetime.IsoCalendarDate(year=2004, week=1, weekday=7)
@end example


버전 3.9에서 변경: 결과가 튜플에서 @ref{85d,,네임드 튜플}로 변경되었습니다.

@end deffn

@geindex isoformat() (datetime.date 메서드)
@anchor{library/datetime datetime date isoformat}@anchor{28e6}
@deffn {메서드} date.isoformat ()

ISO 8601 형식으로 날짜를 나타내는 문자열을 반환합니다, @code{YYYY-MM-DD}:

@example
>>> import datetime as dt
>>> dt.date(2002, 12, 4).isoformat()
'2002-12-04'
@end example
@end deffn

@geindex __str__() (datetime.date 메서드)
@anchor{library/datetime datetime date __str__}@anchor{28e7}
@deffn {메서드} date.__str__ ()

For a date @code{d}, @code{str(d)} is equivalent to @code{d.isoformat()}.
@end deffn

@geindex ctime() (datetime.date 메서드)
@anchor{library/datetime datetime date ctime}@anchor{28e8}
@deffn {메서드} date.ctime ()

날짜를 나타내는 문자열을 반환합니다:

@example
>>> import datetime as dt
>>> dt.date(2002, 12, 4).ctime()
'Wed Dec  4 00:00:00 2002'
@end example

@code{d.ctime()}은 다음과:

@example
time.ctime(time.mktime(d.timetuple()))
@end example

네이티브 C @code{ctime()} 함수(@ref{28e9,,time.ctime()}은 호출하지만 @ref{28e8,,date.ctime()}은 호출하지 않습니다)가 C 표준을 준수하는 플랫폼에서 동등합니다.
@end deffn

@geindex strftime() (datetime.date 메서드)
@anchor{library/datetime datetime date strftime}@anchor{e8e}
@deffn {메서드} date.strftime (format)

Return a string representing the date, controlled by an explicit format string.
Format codes referring to hours, minutes or seconds will see 0 values.
See also @ref{1b52,,strftime() and strptime() behavior} and @ref{28e6,,date.isoformat()}.
@end deffn

@geindex __format__() (datetime.date 메서드)
@anchor{library/datetime datetime date __format__}@anchor{28ea}
@deffn {메서드} date.__format__ (format)

Same as @ref{e8e,,date.strftime()}. This makes it possible to specify a format
string for a @ref{1fa,,date} object in @ref{19a,,formatted string literals} and when using @ref{832,,str.format()}.
See also @ref{1b52,,strftime() and strptime() behavior} and @ref{28e6,,date.isoformat()}.
@end deffn

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

@end menu

@node Examples of usage date,,,date objects
@anchor{library/datetime examples-of-usage-date}@anchor{28eb}
@subsubsection Examples of usage: @code{date}


이벤트까지 남은 날 수 계산 예:

@example
>>> import time
>>> import datetime as dt
>>> today = dt.date.today()
>>> today
datetime.date(2007, 12, 5)
>>> today == dt.date.fromtimestamp(time.time())
True
>>> my_birthday = dt.date(today.year, 6, 24)
>>> if my_birthday < today:
...     my_birthday = my_birthday.replace(year=today.year + 1)
...
>>> my_birthday
datetime.date(2008, 6, 24)
>>> time_to_birthday = abs(my_birthday - today)
>>> time_to_birthday.days
202
@end example

@ref{1fa,,date}로 작업하는 추가 예:

@example
>>> import datetime as dt
>>> d = dt.date.fromordinal(730920) # 730920th day after 1. 1. 0001
>>> d
datetime.date(2002, 3, 11)

>>> # Methods related to formatting string output
>>> d.isoformat()
'2002-03-11'
>>> d.strftime("%d/%m/%y")
'11/03/02'
>>> d.strftime("%A %d. %B %Y")
'Monday 11. March 2002'
>>> d.ctime()
'Mon Mar 11 00:00:00 2002'
>>> 'The @{1@} is @{0:%d@}, the @{2@} is @{0:%B@}.'.format(d, "day", "month")
'The day is 11, the month is March.'

>>> # Methods for extracting 'components' under different calendars
>>> t = d.timetuple()
>>> for i in t:
...     print(i)
2002                # year
3                   # month
11                  # day
0
0
0
0                   # weekday (0 = Monday)
70                  # 70th day in the year
-1
>>> ic = d.isocalendar()
>>> for i in ic:
...     print(i)
2002                # ISO year
11                  # ISO week number
1                   # ISO day number ( 1 = Monday )

>>> # A date object is immutable; all operations produce a new object
>>> d.replace(year=2005)
datetime.date(2005, 3, 11)
@end example

@node datetime objects,time objects,date objects,datetime — Basic date and time types
@anchor{library/datetime datetime-datetime}@anchor{28ec}@anchor{library/datetime datetime-objects}@anchor{28ed}
@subsubsection @code{datetime} objects


@ref{4e2,,datetime} 객체는 @ref{1fa,,date} 객체와 @ref{1fb,,time} 객체의 모든 정보를 포함하는 단일 객체입니다.

Like a @ref{1fa,,date} object, @ref{4e2,,datetime} assumes the current Gregorian
calendar extended in both directions; like a @ref{1fb,,time} object,
@code{datetime} assumes there are exactly 3600*24 seconds in every day.

생성자:

@geindex datetime (datetime 클래스)
@anchor{library/datetime datetime datetime}@anchor{4e2}
@deffn {클래스} datetime.datetime (year, month, day, hour=0, minute=0, second=0, microsecond=0, tzinfo=None, *, fold=0)

`year', `month', `day' 인자는 필수입니다. `tzinfo'는 @code{None}이거나 @ref{7f5,,tzinfo} 서브 클래스의 인스턴스일 수 있습니다. 나머지 인자는 다음 범위의 정수이어야 합니다:


@itemize *

@item 
@code{MINYEAR <= year <= MAXYEAR},

@item 
@code{1 <= month <= 12},

@item 
@code{1 <= day <= 주어진 month와 year에서의 날 수},

@item 
@code{0 <= hour < 24},

@item 
@code{0 <= minute < 60},

@item 
@code{0 <= second < 60},

@item 
@code{0 <= microsecond < 1000000},

@item 
@code{fold in [0, 1]}.
@end itemize

이 범위를 벗어나는 인자가 주어지면, @ref{2ec,,ValueError}가 발생합니다.


버전 3.6에서 변경: Added the `fold' parameter.

@end deffn

다른 생성자, 모든 클래스 메서드:

@geindex today() (datetime.datetime의 클래스 메서드)
@anchor{library/datetime datetime datetime today}@anchor{28ee}
@deffn {메서드} classmethod datetime.today ()

Return the current local date and time, with @ref{28d1,,tzinfo} @code{None}.

다음과 동등합니다:

@example
datetime.fromtimestamp(time.time())
@end example

@ref{710,,now()}, @ref{711,,fromtimestamp()}를 참조하십시오.

이 메서드는 기능적으로 @ref{710,,now()}와 동등하지만, @code{tz} 매개 변수는 없습니다.
@end deffn

@geindex now() (datetime.datetime의 클래스 메서드)
@anchor{library/datetime datetime datetime now}@anchor{710}
@deffn {메서드} classmethod datetime.now (tz=None)

현재의 지역 날짜와 시간을 반환합니다.

선택적 인자 `tz'가 @code{None}이거나 지정되지 않으면, @ref{28ee,,today()}와 유사합니다. 하지만, 가능하면 @ref{55c,,time.time()} 타임스탬프를 통해 얻을 수 있는 것보다 더 높은 정밀도를 제공합니다 (예를 들어, C @code{gettimeofday()} 함수를 제공하는 플랫폼에서 가능합니다).

`tz'가 @code{None}이 아니면, @ref{7f5,,tzinfo} 서브 클래스의 인스턴스여야 하며, 현재 날짜와 시간이 `tz'의 시간대로 변환됩니다.

이 함수는 @ref{28ee,,today()}와 @ref{351,,utcnow()}보다 선호됩니다.

@cartouche
@quotation 참고 
Subsequent calls to @code{datetime.now()} may return the same
instant depending on the precision of the underlying clock.
@end quotation
@end cartouche
@end deffn

@geindex utcnow() (datetime.datetime의 클래스 메서드)
@anchor{library/datetime datetime datetime utcnow}@anchor{351}
@deffn {메서드} classmethod datetime.utcnow ()

@ref{28d1,,tzinfo}가 @code{None}인 현재 UTC 날짜와 시간을 반환합니다.

이것은 @ref{710,,now()}와 비슷하지만, 현재의 UTC 날짜와 시간을 나이브 @ref{4e2,,datetime} 객체로 반환합니다. 현재 어웨어 UTC datetime은 @code{datetime.now(timezone.utc)}를 호출하여 얻을 수 있습니다. @code{now()}도 참조하십시오.

@cartouche
@quotation 경고 
나이브 @code{datetime} 객체는 많은 @code{datetime} 메서드에 의해 지역 시간으로 취급되므로, UTC로 시간을 나타내는 어웨어 datetime을 사용하는 것이 좋습니다. 따라서 UTC로 현재 시간을 나타내는 객체를 만드는 권장 방법은 @code{datetime.now(timezone.utc)}를 호출하는 것입니다.
@end quotation
@end cartouche


버전 3.12부터 폐지됨: Use @ref{710,,datetime.now()} with @ref{712,,UTC} instead.

@end deffn

@geindex fromtimestamp() (datetime.datetime의 클래스 메서드)
@anchor{library/datetime datetime datetime fromtimestamp}@anchor{711}
@deffn {메서드} classmethod datetime.fromtimestamp (timestamp, tz=None)

@ref{55c,,time.time()}가 반환하는 것과 같은, POSIX timestamp에 해당하는 지역 날짜와 시간을 반환합니다. 선택적 인자 `tz'가 @code{None}이거나 지정되지 않으면 timestamp는 플랫폼의 지역 날짜와 시간으로 변환되며, 반환된 @ref{4e2,,datetime} 객체는 나이브합니다.

`tz'가 @code{None}이 아니면, @ref{7f5,,tzinfo} 서브 클래스의 인스턴스여야 하며, timestamp는 `tz'의 시간대로 변환됩니다.

timestamp가 플랫폼 C @code{localtime()} 이나 @code{gmtime()} 함수에서 지원하는 값 범위를 벗어나면 @ref{711,,fromtimestamp()}가 @ref{a81,,OverflowError}를 발생시킬 수 있고, @code{localtime()} 이나 @code{gmtime()}이 실패하면 @ref{2c0,,OSError}를 발생시킬 수 있습니다. 1970년에서 2038년까지로 제한되는 것이 일반적입니다. 타임스탬프에 윤초 개념을 포함하는 비 POSIX 시스템에서, @code{fromtimestamp()}는 윤초를 무시하므로, 1초 차이가 나는 두 개의 타임스탬프가 같은 @ref{4e2,,datetime} 객체를 산출할 수 있습니다. 이 방법은 @ref{352,,utcfromtimestamp()}보다 선호됩니다.


버전 3.3에서 변경: timestamp가 플랫폼 C @code{localtime()} 이나 @code{gmtime()} 함수에서 지원하는 값 범위를 벗어나면 @ref{2ec,,ValueError} 대신 @ref{a81,,OverflowError}를 발생시킵니다. @code{localtime()} 이나 @code{gmtime()}이 실패하면 @code{ValueError} 대신 @ref{2c0,,OSError}를 발생시킵니다.



버전 3.6에서 변경: @ref{711,,fromtimestamp()}는 @ref{e50,,fold}가 1로 설정된 인스턴스를 반환할 수 있습니다.

@end deffn

@geindex utcfromtimestamp() (datetime.datetime의 클래스 메서드)
@anchor{library/datetime datetime datetime utcfromtimestamp}@anchor{352}
@deffn {메서드} classmethod datetime.utcfromtimestamp (timestamp)

@ref{28d1,,tzinfo}가 @code{None}인 POSIX timestamp에 해당하는 UTC @ref{4e2,,datetime}을 반환합니다. (결과 객체는 나이브합니다.)

timestamp가 플랫폼 C @code{gmtime()} 함수에서 지원하는 값 범위를 벗어나면 @ref{a81,,OverflowError}가 발생하고, @code{gmtime()}이 실패하면 @ref{2c0,,OSError}가 발생합니다. 1970년에서 2038년까지로 제한되는 것이 일반적입니다.

어웨어 @ref{4e2,,datetime} 객체를 얻으려며, @ref{711,,fromtimestamp()}를 호출하십시오:

@example
datetime.fromtimestamp(timestamp, timezone.utc)
@end example

POSIX 호환 플랫폼에서, 다음 표현식과 동등합니다:

@example
datetime(1970, 1, 1, tzinfo=timezone.utc) + timedelta(seconds=timestamp)
@end example

단, 후자의 식은 항상 전체 연도 범위를 지원합니다: @ref{28bf,,MINYEAR}와 @ref{28c0,,MAXYEAR} 사이, 경계 포함.

@cartouche
@quotation 경고 
나이브 @code{datetime} 객체는 많은 @code{datetime} 메서드에 의해 지역 시간으로 취급되므로. UTC로 시간을 나타내는 어웨어 datetime을 사용하는 것이 좋습니다. 따라서 UTC로 특정 timestamp를 나타내는 객체를 만드는 권장 방법은 @code{datetime.fromtimestamp(timestamp, tz=timezone.utc)}를 호출하는 것입니다.
@end quotation
@end cartouche


버전 3.3에서 변경: timestamp가 플랫폼 C @code{gmtime()} 함수에서 지원하는 값 범위를 벗어나면 @ref{2ec,,ValueError} 대신 @ref{a81,,OverflowError}를 발생시킵니다. @code{gmtime()}이 실패하면 @code{ValueError} 대신 @ref{2c0,,OSError}를 발생시킵니다.



버전 3.15에서 변경: Accepts any real number as `timestamp', not only integer or float.



버전 3.12부터 폐지됨: Use @ref{711,,datetime.fromtimestamp()} with @ref{712,,UTC} instead.

@end deffn

@geindex fromordinal() (datetime.datetime의 클래스 메서드)
@anchor{library/datetime datetime datetime fromordinal}@anchor{28ef}
@deffn {메서드} classmethod datetime.fromordinal (ordinal)

역산 그레고리력 서수(ordinal)에 해당하는 @ref{4e2,,datetime}을 반환합니다. 1년 1월 1일이 서수 1입니다. @code{1 <= ordinal <= datetime.max.toordinal()}이 아니면 @ref{2ec,,ValueError}가 발생합니다. 결과의 hour, minute, second 및 microsecond는 모두 0이고, @ref{28d1,,tzinfo}는 @code{None}입니다.
@end deffn

@geindex combine() (datetime.datetime의 클래스 메서드)
@anchor{library/datetime datetime datetime combine}@anchor{e8f}
@deffn {메서드} classmethod datetime.combine (date, time, tzinfo=time.tzinfo)

Return a new @ref{4e2,,datetime} object whose date components are equal to the
given @ref{1fa,,date} object’s, and whose time components
are equal to the given @ref{1fb,,time} object’s. If the `tzinfo'
argument is provided, its value is used to set the @ref{28d1,,tzinfo} attribute
of the result, otherwise the @ref{28c9,,tzinfo} attribute of the `time' argument
is used.  If the `date' argument is a @code{datetime} object, its time components
and @code{tzinfo} attributes are ignored.

For any @ref{4e2,,datetime} object @code{d},
@code{d == datetime.combine(d.date(), d.time(), d.tzinfo)}.


버전 3.6에서 변경: `tzinfo' 인자가 추가되었습니다.

@end deffn

@geindex fromisoformat() (datetime.datetime의 클래스 메서드)
@anchor{library/datetime datetime datetime fromisoformat}@anchor{829}
@deffn {메서드} classmethod datetime.fromisoformat (date_string)

Return a @ref{4e2,,datetime} corresponding to a `date_string' in any valid
ISO 8601 format, with the following exceptions:


@enumerate 

@item 
Time zone offsets may have fractional seconds.

@item 
The @code{T} separator may be replaced by any single unicode character.

@item 
Fractional hours and minutes are not supported.

@item 
Reduced precision dates are not currently supported (@code{YYYY-MM},
@code{YYYY}).

@item 
Extended date representations are not currently supported
(@code{±YYYYYY-MM-DD}).

@item 
Ordinal dates are not currently supported (@code{YYYY-OOO}).
@end enumerate

예제:

@example
>>> import datetime as dt
>>> dt.datetime.fromisoformat('2011-11-04')
datetime.datetime(2011, 11, 4, 0, 0)
>>> dt.datetime.fromisoformat('20111104')
datetime.datetime(2011, 11, 4, 0, 0)
>>> dt.datetime.fromisoformat('2011-11-04T00:05:23')
datetime.datetime(2011, 11, 4, 0, 5, 23)
>>> dt.datetime.fromisoformat('2011-11-04T00:05:23Z')
datetime.datetime(2011, 11, 4, 0, 5, 23, tzinfo=datetime.timezone.utc)
>>> dt.datetime.fromisoformat('20111104T000523')
datetime.datetime(2011, 11, 4, 0, 5, 23)
>>> dt.datetime.fromisoformat('2011-W01-2T00:05:23.283')
datetime.datetime(2011, 1, 4, 0, 5, 23, 283000)
>>> dt.datetime.fromisoformat('2011-11-04 00:05:23.283')
datetime.datetime(2011, 11, 4, 0, 5, 23, 283000)
>>> dt.datetime.fromisoformat('2011-11-04 00:05:23.283+00:00')
datetime.datetime(2011, 11, 4, 0, 5, 23, 283000, tzinfo=datetime.timezone.utc)
>>> dt.datetime.fromisoformat('2011-11-04T00:05:23+04:00')
datetime.datetime(2011, 11, 4, 0, 5, 23,
    tzinfo=datetime.timezone(datetime.timedelta(seconds=14400)))
@end example


Added in version 3.7.



버전 3.11에서 변경: Previously, this method only supported formats that could be emitted by
@ref{28e6,,date.isoformat()} or @ref{d24,,datetime.isoformat()}.

@end deffn

@geindex fromisocalendar() (datetime.datetime의 클래스 메서드)
@anchor{library/datetime datetime datetime fromisocalendar}@anchor{bdf}
@deffn {메서드} classmethod datetime.fromisocalendar (year, week, day)

Return a @ref{4e2,,datetime} corresponding to the ISO calendar date specified
by `year', `week' and `day'. The non-date components of the datetime are populated
with their normal default values. This is the inverse of the function
@ref{af2,,datetime.isocalendar()}.


Added in version 3.8.

@end deffn

@geindex strptime() (datetime.datetime의 클래스 메서드)
@anchor{library/datetime datetime datetime strptime}@anchor{1951}
@deffn {메서드} classmethod datetime.strptime (date_string, format)

`format'에 따라 구문 분석된, `date_string'에 해당하는 @ref{4e2,,datetime}를 반환합니다.

If `format' does not contain microseconds or time zone information, this is equivalent to:

@example
datetime(*(time.strptime(date_string, format)[0:6]))
@end example

@ref{2ec,,ValueError} is raised if the date_string and format
can’t be parsed by @ref{1632,,time.strptime()} or if it returns a value which isn’t a
time tuple.  See also @ref{1b52,,strftime() and strptime() behavior} and
@ref{829,,datetime.fromisoformat()}.


버전 3.13에서 변경: If `format' specifies a day of month without a year a
@ref{1a3,,DeprecationWarning} is now emitted.  This is to avoid a quadrennial
leap year bug in code seeking to parse only a month and day as the
default year used in absence of one in the format is not a leap year.
Such `format' values may raise an error as of Python 3.15.  The
workaround is to always include a year in your `format'.  If parsing
`date_string' values that do not have a year, explicitly add a year that
is a leap year before parsing:

@example
>>> import datetime as dt
>>> date_string = "02/29"
>>> when = dt.datetime.strptime(f"@{date_string@};1984", "%m/%d;%Y")  # Avoids leap year bug.
>>> when.strftime("%B %d")
'February 29'
@end example

@end deffn

클래스 어트리뷰트:

@geindex min (datetime.datetime의 속성)
@anchor{library/datetime datetime datetime min}@anchor{1b63}
@deffn {속성} datetime.min

표현 가능한 가장 이른 @ref{4e2,,datetime}, @code{datetime(MINYEAR, 1, 1, tzinfo=None)}.
@end deffn

@geindex max (datetime.datetime의 속성)
@anchor{library/datetime datetime datetime max}@anchor{28f0}
@deffn {속성} datetime.max

표현 가능한 가장 늦은 @ref{4e2,,datetime}, @code{datetime(MAXYEAR, 12, 31, 23, 59, 59, 999999, tzinfo=None)}.
@end deffn

@geindex resolution (datetime.datetime의 속성)
@anchor{library/datetime datetime datetime resolution}@anchor{28f1}
@deffn {속성} datetime.resolution

같지 않은 @ref{4e2,,datetime} 객체 간의 가능한 가장 작은 차이, @code{timedelta(microseconds=1)}.
@end deffn

인스턴스 어트리뷰트 (읽기 전용):

@geindex year (datetime.datetime의 속성)
@anchor{library/datetime datetime datetime year}@anchor{28ca}
@deffn {속성} datetime.year

@ref{28bf,,MINYEAR}와 @ref{28c0,,MAXYEAR} 사이, 경계 포함.
@end deffn

@geindex month (datetime.datetime의 속성)
@anchor{library/datetime datetime datetime month}@anchor{28cb}
@deffn {속성} datetime.month

1과 12 사이, 경계 포함.
@end deffn

@geindex day (datetime.datetime의 속성)
@anchor{library/datetime datetime datetime day}@anchor{28cc}
@deffn {속성} datetime.day

1과 주어진 year의 주어진 month의 날 수 사이.
@end deffn

@geindex hour (datetime.datetime의 속성)
@anchor{library/datetime datetime datetime hour}@anchor{28cd}
@deffn {속성} datetime.hour

범위 @code{range(24)}.
@end deffn

@geindex minute (datetime.datetime의 속성)
@anchor{library/datetime datetime datetime minute}@anchor{28ce}
@deffn {속성} datetime.minute

범위 @code{range(60)}.
@end deffn

@geindex second (datetime.datetime의 속성)
@anchor{library/datetime datetime datetime second}@anchor{28cf}
@deffn {속성} datetime.second

범위 @code{range(60)}.
@end deffn

@geindex microsecond (datetime.datetime의 속성)
@anchor{library/datetime datetime datetime microsecond}@anchor{28d0}
@deffn {속성} datetime.microsecond

범위 @code{range(1000000)}.
@end deffn

@geindex tzinfo (datetime.datetime의 속성)
@anchor{library/datetime datetime datetime tzinfo}@anchor{28d1}
@deffn {속성} datetime.tzinfo

@ref{4e2,,datetime} 생성자에 `tzinfo' 인자로 전달된 객체이거나, 전달되지 않았으면 @code{None}입니다.
@end deffn

@geindex fold (datetime.datetime의 속성)
@anchor{library/datetime datetime datetime fold}@anchor{e50}
@deffn {속성} datetime.fold

In @code{[0, 1]}. Used to disambiguate wall times during a repeated interval. (A
repeated interval occurs when clocks are rolled back at the end of daylight saving
time or when the UTC offset for the current zone is decreased for political reasons.)
The values 0 and 1 represent, respectively, the earlier and later of the two
moments with the same wall time representation.


Added in version 3.6.

@end deffn

지원되는 연산:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

연산

@tab

결과

@item

@code{datetime2 = datetime1 + timedelta}

@tab

(1)

@item

@code{datetime2 = datetime1 - timedelta}

@tab

(2)

@item

@code{timedelta = datetime1 - datetime2}

@tab

(3)

@item


@display
@code{datetime1 == datetime2}@w{ }
@code{datetime1 != datetime2}@w{ }
@end display



@tab

Equality comparison. (4)

@item


@display
@code{datetime1 < datetime2}@w{ }
@code{datetime1 > datetime2}@w{ }
@code{datetime1 <= datetime2}@w{ }
@code{datetime1 >= datetime2}@w{ }
@end display



@tab

Order comparison. (5)

@end multitable



@enumerate 

@item 
@code{datetime2} is a duration of @code{timedelta} removed from @code{datetime1}, moving forward in
time if @code{timedelta.days > 0}, or backward if @code{timedelta.days < 0}. The
result has the same @ref{28d1,,tzinfo} attribute as the input datetime, and
@code{datetime2 - datetime1 == timedelta} after. @ref{a81,,OverflowError} is raised if
@code{datetime2.year} would be smaller than @ref{28bf,,MINYEAR} or larger than
@ref{28c0,,MAXYEAR}. Note that no time zone adjustments are done even if the
input is an aware object.

@item 
Computes the @code{datetime2} such that @code{datetime2 + timedelta == datetime1}. As for
addition, the result has the same @ref{28d1,,tzinfo} attribute as the input
datetime, and no time zone adjustments are done even if the input is aware.

@item 
Subtraction of a @ref{4e2,,datetime} from a @code{datetime} is defined only if
both operands are naive, or if both are aware. If one is aware and the other is
naive, @ref{198,,TypeError} is raised.

If both are naive, or both are aware and have the same @ref{28d1,,tzinfo} attribute,
the @code{tzinfo} attributes are ignored, and the result is a @ref{bc2,,timedelta}
object @code{t} such that @code{datetime2 + t == datetime1}. No time zone adjustments
are done in this case.

If both are aware and have different @ref{28d1,,tzinfo} attributes, @code{a-b} acts
as if @code{a} and @code{b} were first converted to naive UTC datetimes. The
result is @code{(a.replace(tzinfo=None) - a.utcoffset()) - (b.replace(tzinfo=None)
- b.utcoffset())} except that the implementation never overflows.

@item 
@ref{4e2,,datetime} objects are equal if they represent the same date
and time, taking into account the time zone.

Naive and aware @ref{4e2,,datetime} objects are never equal.

If both comparands are aware, and have the same @code{tzinfo} attribute,
the @code{tzinfo} and @ref{e50,,fold} attributes are ignored and
the base datetimes are compared.
If both comparands are aware and have different @ref{28d1,,tzinfo}
attributes, the comparison acts as comparands were first converted to UTC
datetimes except that the implementation never overflows.
@ref{4e2,,datetime} instances in a repeated interval are never equal to
@code{datetime} instances in other time zone.

@item 
`datetime1' is considered less than `datetime2' when `datetime1' precedes
`datetime2' in time, taking into account the time zone.

Order comparison between naive and aware @ref{4e2,,datetime} objects
raises @ref{198,,TypeError}.

If both comparands are aware, and have the same @code{tzinfo} attribute,
the @code{tzinfo} and @ref{e50,,fold} attributes are ignored and
the base datetimes are compared.
If both comparands are aware and have different @ref{28d1,,tzinfo}
attributes, the comparison acts as comparands were first converted to UTC
datetimes except that the implementation never overflows.
@end enumerate


버전 3.3에서 변경: 어웨어와 나이브 @ref{4e2,,datetime} 인스턴스 간의 동등 비교는 @ref{198,,TypeError}를 발생시키지 않습니다.



버전 3.13에서 변경: Comparison between @ref{4e2,,datetime} object and an instance of
the @ref{1fa,,date} subclass that is not a @code{datetime} subclass
no longer converts the latter to @code{date}, ignoring the time part
and the time zone.
The default behavior can be changed by overriding the special comparison
methods in subclasses.


인스턴스 메서드:

@geindex date() (datetime.datetime 메서드)
@anchor{library/datetime datetime datetime date}@anchor{28f2}
@deffn {메서드} datetime.date ()

같은 year, month, day의 @ref{1fa,,date} 객체를 반환합니다.
@end deffn

@geindex time() (datetime.datetime 메서드)
@anchor{library/datetime datetime datetime time}@anchor{28f3}
@deffn {메서드} datetime.time ()

같은 hour, minute, second, microsecond 및 fold의 @ref{1fb,,time} 객체를 반환합니다. @ref{28d1,,tzinfo}는 @code{None}입니다. 메서드 @ref{28f4,,timetz()}도 참조하십시오.


버전 3.6에서 변경: fold 값은 반환된 @ref{1fb,,time} 객체에 복사됩니다.

@end deffn

@geindex timetz() (datetime.datetime 메서드)
@anchor{library/datetime datetime datetime timetz}@anchor{28f4}
@deffn {메서드} datetime.timetz ()

같은 hour, minute, second, microsecond, fold 및 tzinfo 어트리뷰트의 @ref{1fb,,time} 객체를 반환합니다. 메서드 @ref{f4,,time()}도 참조하십시오.


버전 3.6에서 변경: fold 값은 반환된 @ref{1fb,,time} 객체에 복사됩니다.

@end deffn

@geindex replace() (datetime.datetime 메서드)
@anchor{library/datetime datetime datetime replace}@anchor{16d0}
@deffn {메서드} datetime.replace (year=self.year, month=self.month, day=self.day, hour=self.hour, minute=self.minute, second=self.second, microsecond=self.microsecond, tzinfo=self.tzinfo, *, fold=0)

Return a new @ref{34,,datetime} object with the same attributes, but with
specified parameters updated. Note that @code{tzinfo=None} can be specified to
create a naive datetime from an aware datetime with no conversion of date
and time data.

@ref{4e2,,datetime} objects are also supported by generic function
@ref{1c0,,copy.replace()}.


버전 3.6에서 변경: Added the `fold' parameter.

@end deffn

@geindex astimezone() (datetime.datetime 메서드)
@anchor{library/datetime datetime datetime astimezone}@anchor{bc3}
@deffn {메서드} datetime.astimezone (tz=None)

새로운 @ref{28d1,,tzinfo} 어트리뷰트 `tz'를 갖는 @ref{4e2,,datetime} 객체를 반환하는데, 결과가 `self'와 같은 UTC 시간이지만 `tz'의 지역 시간이 되도록 날짜와 시간 데이터를 조정합니다.

If provided, `tz' must be an instance of a @ref{7f5,,tzinfo} subclass, and its
@ref{28f5,,utcoffset()} and @ref{28f6,,dst()} methods must not return @code{None}. If `self'
is naive, it is presumed to represent time in the system time zone.

If called without arguments (or with @code{tz=None}) the system local
time zone is assumed for the target time zone. The @code{.tzinfo} attribute of the converted
datetime instance will be set to an instance of @ref{12c4,,timezone}
with the zone name and offset obtained from the OS.

If @code{self.tzinfo} is `tz', @code{self.astimezone(tz)} is equal to `self':  no
adjustment of date or time data is performed. Else the result is local
time in the time zone `tz', representing the same UTC time as `self':  after
@code{astz = dt.astimezone(tz)}, @code{astz - astz.utcoffset()} will have
the same date and time data as @code{dt - dt.utcoffset()}.

If you merely want to attach a @ref{12c4,,timezone} object `tz' to a datetime `dt' without
adjustment of date and time data, use @code{dt.replace(tzinfo=tz)}. If you
merely want to remove the @code{timezone} object from an aware datetime `dt' without
conversion of date and time data, use @code{dt.replace(tzinfo=None)}.

기본 @ref{28f7,,tzinfo.fromutc()} 메서드는 @ref{bc3,,astimezone()}에 의해 반환된 결과에 영향을 주도록 @ref{7f5,,tzinfo} 서브 클래스에서 재정의할 수 있습니다. 에러가 발생하는 경우를 무시하고, @code{astimezone()}는 다음과 같이 작동합니다:

@example
def astimezone(self, tz):
    if self.tzinfo is tz:
        return self
    # Convert self to UTC, and attach the new timezone object.
    utc = (self - self.utcoffset()).replace(tzinfo=tz)
    # Convert from UTC to tz's local time.
    return tz.fromutc(utc)
@end example


버전 3.3에서 변경: 이제 `tz'를 생략할 수 있습니다.



버전 3.6에서 변경: 이제 @ref{bc3,,astimezone()} 메서드는 이제 나이브 인스턴스에서 호출될 수 있는데, 시스템 지역 시간을 나타내는 것으로 간주합니다.

@end deffn

@geindex utcoffset() (datetime.datetime 메서드)
@anchor{library/datetime datetime datetime utcoffset}@anchor{28f5}
@deffn {메서드} datetime.utcoffset ()

@ref{28d1,,tzinfo}가 @code{None}이면, @code{None}을 반환하고, 그렇지 않으면 @code{self.tzinfo.utcoffset(self)}를 반환하고, 후자가 @code{None}이나 하루 미만의 크기를 가진 @ref{bc2,,timedelta} 객체를 반환하지 않으면 예외를 발생시킵니다.


버전 3.7에서 변경: UTC 오프셋은 분 단위로 제한되지 않습니다.

@end deffn

@geindex dst() (datetime.datetime 메서드)
@anchor{library/datetime datetime datetime dst}@anchor{28f6}
@deffn {메서드} datetime.dst ()

@ref{28d1,,tzinfo}가 @code{None}이면, @code{None}을 반환하고, 그렇지 않으면 @code{self.tzinfo.dst(self)}를 반환하고, 후자가 @code{None}이나 하루 미만의 크기를 가진 @ref{bc2,,timedelta} 객체를 반환하지 않으면 예외를 발생시킵니다.


버전 3.7에서 변경: DST 오프셋은 분 단위로 제한되지 않습니다.

@end deffn

@geindex tzname() (datetime.datetime 메서드)
@anchor{library/datetime datetime datetime tzname}@anchor{28f8}
@deffn {메서드} datetime.tzname ()

@ref{28d1,,tzinfo}가 @code{None}이면, @code{None}을 반환하고, 그렇지 않으면 @code{self.tzinfo.tzname(self)}를 반환하고, 후자가 @code{None}이나 문자열 객체를 반환하지 않으면 예외를 발생시킵니다.
@end deffn

@geindex timetuple() (datetime.datetime 메서드)
@anchor{library/datetime datetime datetime timetuple}@anchor{28f9}
@deffn {메서드} datetime.timetuple ()

@ref{16fe,,time.localtime()}이 반환하는 것과 같은 @ref{ee5,,time.struct_time}을 반환합니다.

@code{d.timetuple()}은 다음과 동등합니다:

@example
time.struct_time((d.year, d.month, d.day,
                  d.hour, d.minute, d.second,
                  d.weekday(), yday, dst))
@end example

where @code{yday = d.toordinal() - date(d.year, 1, 1).toordinal() + 1}
is the day number within the current year starting with 1 for January
1st. The @ref{28fa,,tm_isdst} flag of the result is set according to the
@ref{28f6,,dst()} method: @ref{28d1,,tzinfo} is @code{None} or @code{dst()} returns
@code{None}, @code{tm_isdst} is set to @code{-1}; else if @code{dst()} returns a
non-zero value, @code{tm_isdst} is set to 1; else @code{tm_isdst} is
set to 0.
@end deffn

@geindex utctimetuple() (datetime.datetime 메서드)
@anchor{library/datetime datetime datetime utctimetuple}@anchor{28fb}
@deffn {메서드} datetime.utctimetuple ()

If @ref{4e2,,datetime} instance @code{d} is naive, this is the same as
@code{d.timetuple()} except that @ref{28fa,,tm_isdst} is forced to 0 regardless of what
@code{d.dst()} returns. DST is never in effect for a UTC time.

If @code{d} is aware, @code{d} is normalized to UTC time, by subtracting
@code{d.utcoffset()}, and a @ref{ee5,,time.struct_time} for the
normalized time is returned. @code{tm_isdst} is forced to 0. Note
that an @ref{a81,,OverflowError} may be raised if @code{d.year} was
@code{MINYEAR} or @code{MAXYEAR} and UTC adjustment spills over a year
boundary.

@cartouche
@quotation 경고 
Because naive @code{datetime} objects are treated by many @code{datetime} methods
as local times, it is preferred to use aware datetimes to represent times
in UTC; as a result, using @code{datetime.utctimetuple()} may give misleading
results. If you have a naive @code{datetime} representing UTC, use
@code{datetime.replace(tzinfo=timezone.utc)} to make it aware, at which point
you can use @ref{28f9,,datetime.timetuple()}.
@end quotation
@end cartouche
@end deffn

@geindex toordinal() (datetime.datetime 메서드)
@anchor{library/datetime datetime datetime toordinal}@anchor{28fc}
@deffn {메서드} datetime.toordinal ()

날짜의 역산 그레고리력 서수를 반환합니다. @code{self.date().toordinal()}과 같습니다.
@end deffn

@geindex timestamp() (datetime.datetime 메서드)
@anchor{library/datetime datetime datetime timestamp}@anchor{129f}
@deffn {메서드} datetime.timestamp ()

@ref{4e2,,datetime} 인스턴스에 해당하는 POSIX 타임스탬프를 반환합니다. 반환 값은 @ref{55c,,time.time()}이 반환하는 것과 비슷한 @ref{196,,float}입니다.

Naive @ref{4e2,,datetime} instances are assumed to represent local
time and this method relies on the platform C @code{mktime()}
function to perform the conversion. Since @code{datetime}
supports wider range of values than @code{mktime()} on many
platforms, this method may raise @ref{a81,,OverflowError} or @ref{2c0,,OSError}
for times far in the past or far in the future.

어웨어 @ref{4e2,,datetime} 인스턴스의 경우, 반환 값은 다음과 같이 계산됩니다:

@example
(dt - datetime(1970, 1, 1, tzinfo=timezone.utc)).total_seconds()
@end example

@cartouche
@quotation 참고 
There is no method to obtain the POSIX timestamp directly from a
naive @ref{4e2,,datetime} instance representing UTC time. If your
application uses this convention and your system time zone is not
set to UTC, you can obtain the POSIX timestamp by supplying
@code{tzinfo=timezone.utc}:

@example
timestamp = dt.replace(tzinfo=timezone.utc).timestamp()
@end example

또는 직접 타임스탬프를 계산할 수 있습니다:

@example
timestamp = (dt - datetime(1970, 1, 1)) / timedelta(seconds=1)
@end example
@end quotation
@end cartouche


Added in version 3.3.



버전 3.6에서 변경: @ref{129f,,timestamp()} 메서드는 @ref{e50,,fold} 어트리뷰트를 사용하여 반복되는 구간의 시간을 구분합니다.

@end deffn

@geindex weekday() (datetime.datetime 메서드)
@anchor{library/datetime datetime datetime weekday}@anchor{28fd}
@deffn {메서드} datetime.weekday ()

정수로 요일을 반환합니다. 월요일은 0이고 일요일은 6입니다. @code{self.date().weekday()}와 같습니다. @ref{28fe,,isoweekday()}도 참조하십시오.
@end deffn

@geindex isoweekday() (datetime.datetime 메서드)
@anchor{library/datetime datetime datetime isoweekday}@anchor{28fe}
@deffn {메서드} datetime.isoweekday ()

정수로 요일을 반환합니다. 월요일은 1이고 일요일은 7입니다. @code{self.date().isoweekday()} 와 같습니다. @ref{28fd,,weekday()}, @ref{af2,,isocalendar()}도 참조하십시오.
@end deffn

@geindex isocalendar() (datetime.datetime 메서드)
@anchor{library/datetime datetime datetime isocalendar}@anchor{af2}
@deffn {메서드} datetime.isocalendar ()

세 개의 컴포넌트를 가진 @ref{85d,,네임드 튜플}을 반환합니다: @code{year}, @code{week} 및 @code{weekday}. @code{self.date().isocalendar()}와 같습니다.
@end deffn

@geindex isoformat() (datetime.datetime 메서드)
@anchor{library/datetime datetime datetime isoformat}@anchor{d24}
@deffn {메서드} datetime.isoformat (sep='T', timespec='auto')

ISO 8601 형식으로 날짜와 시간을 나타내는 문자열을 반환합니다:


@itemize -

@item 
@code{YYYY-MM-DDTHH:MM:SS.ffffff}, @ref{28d0,,microsecond}가 0이 아니면

@item 
@code{YYYY-MM-DDTHH:MM:SS}, @ref{28d0,,microsecond}가 0이면
@end itemize

@ref{28f5,,utcoffset()}이 @code{None}을 반환하지 않으면, UTC 오프셋을 제공하는 문자열을 덧붙입니다:


@itemize -

@item 
@code{YYYY-MM-DDTHH:MM:SS.ffffff+HH:MM[:SS[.ffffff]]}, @ref{28d0,,microsecond}가 0이 아니면

@item 
@code{YYYY-MM-DDTHH:MM:SS+HH:MM[:SS[.ffffff]]}, @ref{28d0,,microsecond}가 0이면
@end itemize

예제:

@example
>>> import datetime as dt
>>> dt.datetime(2019, 5, 18, 15, 17, 8, 132263).isoformat()
'2019-05-18T15:17:08.132263'
>>> dt.datetime(2019, 5, 18, 15, 17, tzinfo=dt.timezone.utc).isoformat()
'2019-05-18T15:17:00+00:00'
@end example

선택적 인자 `sep'(기본값 @code{'T'})은 한 문자 구분자로, 결과의 날짜와 시간 부분 사이에 배치됩니다. 예를 들어:

@example
>>> import datetime as dt
>>> class TZ(dt.tzinfo):
...     """A time zone with an arbitrary, constant -06:39 offset."""
...     def utcoffset(self, when):
...         return dt.timedelta(hours=-6, minutes=-39)
...
>>> dt.datetime(2002, 12, 25, tzinfo=TZ()).isoformat(' ')
'2002-12-25 00:00:00-06:39'
>>> dt.datetime(2009, 11, 27, microsecond=100, tzinfo=TZ()).isoformat()
'2009-11-27T00:00:00.000100-06:39'
@end example

선택적 인자 `timespec'은 포함할 시간의 추가 구성 요소 수를 지정합니다 (기본값은 @code{'auto'}입니다). 다음 중 하나일 수 있습니다:


@itemize -

@item 
@code{'auto'}: @ref{28d0,,microsecond}가 0이면 @code{'seconds'}와 같고, 그렇지 않으면 @code{'microseconds'}와 같습니다.

@item 
@code{'hours'}: @ref{28cd,,hour}를 두 자리 숫자 @code{HH} 형식으로 포함합니다.

@item 
@code{'minutes'}: @ref{28cd,,hour}와 @ref{28ce,,minute}를 @code{HH:MM} 형식으로 포함합니다.

@item 
@code{'seconds'}: @ref{28cd,,hour}, @ref{28ce,,minute} 및 @ref{28cf,,second}를 @code{HH:MM:SS} 형식으로 포함합니다.

@item 
@code{'milliseconds'}: 전체 시간을 포함하지만, 초 미만은 밀리초 단위로 자릅니다. @code{HH:MM:SS.sss} 형식입니다.

@item 
@code{'microseconds'}: 전체 시간을 @code{HH:MM:SS.ffffff} 형식으로 포함합니다.
@end itemize

@cartouche
@quotation 참고 
제외된 시간 구성 요소는 반올림되지 않고 잘립니다.
@end quotation
@end cartouche

잘못된 `timespec' 인자는 @ref{2ec,,ValueError}를 발생시킵니다:

@example
>>> import datetime as dt
>>> dt.datetime.now().isoformat(timespec='minutes')
'2002-12-25T00:00'
>>> my_datetime = dt.datetime(2015, 1, 1, 12, 30, 59, 0)
>>> my_datetime.isoformat(timespec='microseconds')
'2015-01-01T12:30:59.000000'
@end example


버전 3.6에서 변경: Added the `timespec' parameter.

@end deffn

@geindex __str__() (datetime.datetime 메서드)
@anchor{library/datetime datetime datetime __str__}@anchor{28ff}
@deffn {메서드} datetime.__str__ ()

For a @ref{4e2,,datetime} instance @code{d}, @code{str(d)} is equivalent to
@code{d.isoformat(' ')}.
@end deffn

@geindex ctime() (datetime.datetime 메서드)
@anchor{library/datetime datetime datetime ctime}@anchor{2900}
@deffn {메서드} datetime.ctime ()

날짜와 시간을 나타내는 문자열을 반환합니다:

@example
>>> import datetime as dt
>>> dt.datetime(2002, 12, 4, 20, 30, 40).ctime()
'Wed Dec  4 20:30:40 2002'
@end example

출력 문자열은 입력이 어웨어인지 나이브인지와 관계없이 시간대 정보를 포함하지 `않습니다'.

@code{d.ctime()}은 다음과:

@example
time.ctime(time.mktime(d.timetuple()))
@end example

네이티브 C @code{ctime()} 함수(@ref{28e9,,time.ctime()}이 호출하지만, @ref{2900,,datetime.ctime()}은 호출하지 않습니다)가 C 표준을 준수하는 플랫폼에서 동등합니다.
@end deffn

@geindex strftime() (datetime.datetime 메서드)
@anchor{library/datetime datetime datetime strftime}@anchor{e8d}
@deffn {메서드} datetime.strftime (format)

Return a string representing the date and time,
controlled by an explicit format string.
See also @ref{1b52,,strftime() and strptime() behavior} and @ref{d24,,datetime.isoformat()}.
@end deffn

@geindex __format__() (datetime.datetime 메서드)
@anchor{library/datetime datetime datetime __format__}@anchor{2901}
@deffn {메서드} datetime.__format__ (format)

Same as @ref{e8d,,datetime.strftime()}. This makes it possible to specify a format
string for a @ref{4e2,,datetime} object in @ref{19a,,formatted string literals} and when using @ref{832,,str.format()}.
See also @ref{1b52,,strftime() and strptime() behavior} and @ref{d24,,datetime.isoformat()}.
@end deffn

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

@end menu

@node Examples of usage datetime,,,datetime objects
@anchor{library/datetime examples-of-usage-datetime}@anchor{2902}
@subsubsection Examples of usage: @code{datetime}


Examples of working with @ref{4e2,,datetime} objects:

@example
>>> import datetime as dt

>>> # Using datetime.combine()
>>> d = dt.date(2005, 7, 14)
>>> t = dt.time(12, 30)
>>> dt.datetime.combine(d, t)
datetime.datetime(2005, 7, 14, 12, 30)

>>> # Using datetime.now()
>>> dt.datetime.now()
datetime.datetime(2007, 12, 6, 16, 29, 43, 79043)   # GMT +1
>>> dt.datetime.now(dt.timezone.utc)
datetime.datetime(2007, 12, 6, 15, 29, 43, 79060, tzinfo=datetime.timezone.utc)

>>> # Using datetime.strptime()
>>> my_datetime = dt.datetime.strptime("21/11/06 16:30", "%d/%m/%y %H:%M")
>>> my_datetime
datetime.datetime(2006, 11, 21, 16, 30)

>>> # Using datetime.timetuple() to get tuple of all attributes
>>> tt = my_datetime.timetuple()
>>> for it in tt:
...     print(it)
...
2006    # year
11      # month
21      # day
16      # hour
30      # minute
0       # second
1       # weekday (0 = Monday)
325     # number of days since 1st January
-1      # dst - method tzinfo.dst() returned None

>>> # Date in ISO format
>>> ic = my_datetime.isocalendar()
>>> for it in ic:
...     print(it)
...
2006    # ISO year
47      # ISO week
2       # ISO weekday

>>> # Formatting a datetime
>>> my_datetime.strftime("%A, %d. %B %Y %I:%M%p")
'Tuesday, 21. November 2006 04:30PM'
>>> 'The @{1@} is @{0:%d@}, the @{2@} is @{0:%B@}, the @{3@} is @{0:%I:%M%p@}.'.format(my_datetime, "day", "month", "time")
'The day is 21, the month is November, the time is 04:30PM.'
@end example

아래 예제는 1945년까지 +4 UTC를 사용한 후 +4:30 UTC로 변경한 아프가니스탄 카불의 시간대 정보를 캡처하는 @ref{7f5,,tzinfo} 서브 클래스를 정의합니다:

@example
import datetime as dt

class KabulTz(dt.tzinfo):
    # Kabul used +4 until 1945, when they moved to +4:30
    UTC_MOVE_DATE = dt.datetime(1944, 12, 31, 20, tzinfo=dt.timezone.utc)

    def utcoffset(self, when):
        if when.year < 1945:
            return dt.timedelta(hours=4)
        elif (1945, 1, 1, 0, 0) <= when.timetuple()[:5] < (1945, 1, 1, 0, 30):
            # An ambiguous ("imaginary") half-hour range representing
            # a 'fold' in time due to the shift from +4 to +4:30.
            # If when falls in the imaginary range, use fold to decide how
            # to resolve. See PEP 495.
            return dt.timedelta(hours=4, minutes=(30 if when.fold else 0))
        else:
            return dt.timedelta(hours=4, minutes=30)

    def fromutc(self, when):
        # Follow same validations as in datetime.tzinfo
        if not isinstance(when, dt.datetime):
            raise TypeError("fromutc() requires a datetime argument")
        if when.tzinfo is not self:
            raise ValueError("when.tzinfo is not self")

        # A custom implementation is required for fromutc as
        # the input to this function is a datetime with utc values
        # but with a tzinfo set to self.
        # See datetime.astimezone or fromtimestamp.
        if when.replace(tzinfo=dt.timezone.utc) >= self.UTC_MOVE_DATE:
            return when + dt.timedelta(hours=4, minutes=30)
        else:
            return when + dt.timedelta(hours=4)

    def dst(self, when):
        # Kabul does not observe daylight saving time.
        return dt.timedelta(0)

    def tzname(self, when):
        if when >= self.UTC_MOVE_DATE:
            return "+04:30"
        return "+04"
@end example

위의 @code{KabulTz} 사용법:

@example
>>> tz1 = KabulTz()

>>> # Datetime before the change
>>> dt1 = dt.datetime(1900, 11, 21, 16, 30, tzinfo=tz1)
>>> print(dt1.utcoffset())
4:00:00

>>> # Datetime after the change
>>> dt2 = dt.datetime(2006, 6, 14, 13, 0, tzinfo=tz1)
>>> print(dt2.utcoffset())
4:30:00

>>> # Convert datetime to another time zone
>>> dt3 = dt2.astimezone(dt.timezone.utc)
>>> dt3
datetime.datetime(2006, 6, 14, 8, 30, tzinfo=datetime.timezone.utc)
>>> dt2
datetime.datetime(2006, 6, 14, 13, 0, tzinfo=KabulTz())
>>> dt2 == dt3
True
@end example

@node time objects,tzinfo objects,datetime objects,datetime — Basic date and time types
@anchor{library/datetime datetime-time}@anchor{2903}@anchor{library/datetime time-objects}@anchor{2904}
@subsubsection @code{time} objects


A @ref{1fb,,time} object represents a (local) time of day, independent of any particular
day, and subject to adjustment via a @ref{7f5,,tzinfo} object.

@geindex time (datetime 클래스)
@anchor{library/datetime datetime time}@anchor{1fb}
@deffn {클래스} datetime.time (hour=0, minute=0, second=0, microsecond=0, tzinfo=None, *, fold=0)

모든 인자는 선택적입니다. `tzinfo'는 @code{None}, 또는 @ref{7f5,,tzinfo} 서브 클래스의 인스턴스일 수 있습니다. 나머지 인자는 다음 범위의 정수이어야 합니다:


@itemize *

@item 
@code{0 <= hour < 24},

@item 
@code{0 <= minute < 60},

@item 
@code{0 <= second < 60},

@item 
@code{0 <= microsecond < 1000000},

@item 
@code{fold in [0, 1]}.
@end itemize

If an argument outside those ranges is given, @ref{2ec,,ValueError} is raised. All
default to 0 except `tzinfo', which defaults to @code{None}.
@end deffn

클래스 어트리뷰트:

@geindex min (datetime.time의 속성)
@anchor{library/datetime datetime time min}@anchor{2905}
@deffn {속성} time.min

표현 가능한 가장 이른 @ref{1fb,,time}, @code{time(0, 0, 0, 0)}.
@end deffn

@geindex max (datetime.time의 속성)
@anchor{library/datetime datetime time max}@anchor{2906}
@deffn {속성} time.max

표현 가능한 가장 늦은 @ref{1fb,,time}, @code{time(23, 59, 59, 999999)}.
@end deffn

@geindex resolution (datetime.time의 속성)
@anchor{library/datetime datetime time resolution}@anchor{2907}
@deffn {속성} time.resolution

같지 않은 @ref{1fb,,time} 객체 간의 가능한 가장 작은 차이, @code{timedelta(microseconds=1)}, 하지만 @code{time} 객체에 대한 산술은 지원되지 않습니다.
@end deffn

인스턴스 어트리뷰트 (읽기 전용):

@geindex hour (datetime.time의 속성)
@anchor{library/datetime datetime time hour}@anchor{28c5}
@deffn {속성} time.hour

범위 @code{range(24)}.
@end deffn

@geindex minute (datetime.time의 속성)
@anchor{library/datetime datetime time minute}@anchor{28c6}
@deffn {속성} time.minute

범위 @code{range(60)}.
@end deffn

@geindex second (datetime.time의 속성)
@anchor{library/datetime datetime time second}@anchor{28c7}
@deffn {속성} time.second

범위 @code{range(60)}.
@end deffn

@geindex microsecond (datetime.time의 속성)
@anchor{library/datetime datetime time microsecond}@anchor{28c8}
@deffn {속성} time.microsecond

범위 @code{range(1000000)}.
@end deffn

@geindex tzinfo (datetime.time의 속성)
@anchor{library/datetime datetime time tzinfo}@anchor{28c9}
@deffn {속성} time.tzinfo

@ref{1fb,,time} 생성자에 `tzinfo' 인자로 전달된 객체이거나, 전달되지 않았으면 @code{None}입니다.
@end deffn

@geindex fold (datetime.time의 속성)
@anchor{library/datetime datetime time fold}@anchor{e8c}
@deffn {속성} time.fold

In @code{[0, 1]}. Used to disambiguate wall times during a repeated interval. (A
repeated interval occurs when clocks are rolled back at the end of daylight saving
time or when the UTC offset for the current zone is decreased for political reasons.)
The values 0 and 1 represent, respectively, the earlier and later of the two
moments with the same wall time representation.


Added in version 3.6.

@end deffn

@ref{1fb,,time} objects support equality and order comparisons,
where @code{a} is considered less than @code{b} when @code{a} precedes @code{b} in time.

Naive and aware @code{time} objects are never equal.
Order comparison between naive and aware @code{time} objects raises
@ref{198,,TypeError}.

If both comparands are aware, and have the same @ref{28c9,,tzinfo}
attribute, the @code{tzinfo} and @code{fold} attributes are
ignored and the base times are compared. If both comparands are aware and
have different @code{tzinfo} attributes, the comparands are first adjusted by
subtracting their UTC offsets (obtained from @code{self.utcoffset()}).


버전 3.3에서 변경: Equality comparisons between aware and naive @ref{1fb,,time} instances
don’t raise @ref{198,,TypeError}.


불리언 문맥에서, @ref{1fb,,time} 객체는 항상 참으로 간주합니다.


버전 3.5에서 변경: Before Python 3.5, a @ref{1fb,,time} object was considered to be false if it
represented midnight in UTC. This behavior was considered obscure and
error-prone and has been removed in Python 3.5. See bpo-13936@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=13936} for more
information.


Other constructors:

@geindex fromisoformat() (datetime.time의 클래스 메서드)
@anchor{library/datetime datetime time fromisoformat}@anchor{828}
@deffn {메서드} classmethod time.fromisoformat (time_string)

Return a @ref{1fb,,time} corresponding to a `time_string' in any valid
ISO 8601 format, with the following exceptions:


@enumerate 

@item 
Time zone offsets may have fractional seconds.

@item 
The leading @code{T}, normally required in cases where there may be ambiguity between
a date and a time, is not required.

@item 
Fractional seconds may have any number of digits (anything beyond 6 will
be truncated).

@item 
Fractional hours and minutes are not supported.
@end enumerate

Examples:

@example
>>> import datetime as dt
>>> dt.time.fromisoformat('04:23:01')
datetime.time(4, 23, 1)
>>> dt.time.fromisoformat('T04:23:01')
datetime.time(4, 23, 1)
>>> dt.time.fromisoformat('T042301')
datetime.time(4, 23, 1)
>>> dt.time.fromisoformat('04:23:01.000384')
datetime.time(4, 23, 1, 384)
>>> dt.time.fromisoformat('04:23:01,000384')
datetime.time(4, 23, 1, 384)
>>> dt.time.fromisoformat('04:23:01+04:00')
datetime.time(4, 23, 1, tzinfo=datetime.timezone(datetime.timedelta(seconds=14400)))
>>> dt.time.fromisoformat('04:23:01Z')
datetime.time(4, 23, 1, tzinfo=datetime.timezone.utc)
>>> dt.time.fromisoformat('04:23:01+00:00')
datetime.time(4, 23, 1, tzinfo=datetime.timezone.utc)
@end example


Added in version 3.7.



버전 3.11에서 변경: Previously, this method only supported formats that could be emitted by
@ref{2908,,time.isoformat()}.

@end deffn

@geindex strptime() (datetime.time의 클래스 메서드)
@anchor{library/datetime datetime time strptime}@anchor{194d}
@deffn {메서드} classmethod time.strptime (date_string, format)

Return a @ref{1fb,,time} corresponding to `date_string', parsed according to
`format'.

If `format' does not contain microseconds or timezone information, this is equivalent to:

@example
time(*(time.strptime(date_string, format)[3:6]))
@end example

@ref{2ec,,ValueError} is raised if the `date_string' and `format'
cannot be parsed by @ref{1632,,time.strptime()} or if it returns a value which is not a
time tuple.  See also @ref{1b52,,strftime() and strptime() behavior} and
@ref{828,,time.fromisoformat()}.


Added in version 3.14.

@end deffn

인스턴스 메서드:

@geindex replace() (datetime.time 메서드)
@anchor{library/datetime datetime time replace}@anchor{19fa}
@deffn {메서드} time.replace (hour=self.hour, minute=self.minute, second=self.second, microsecond=self.microsecond, tzinfo=self.tzinfo, *, fold=0)

Return a new @ref{1fb,,time} with the same values, but with specified
parameters updated. Note that @code{tzinfo=None} can be specified to create a
naive @code{time} from an aware @code{time}, without conversion of the
time data.

@ref{1fb,,time} objects are also supported by generic function
@ref{1c0,,copy.replace()}.


버전 3.6에서 변경: Added the `fold' parameter.

@end deffn

@geindex isoformat() (datetime.time 메서드)
@anchor{library/datetime datetime time isoformat}@anchor{2908}
@deffn {메서드} time.isoformat (timespec='auto')

ISO 8601 형식으로 시간을 나타내는 문자열을 반환합니다, 다음 중 한가지입니다:


@itemize -

@item 
@code{HH:MM:SS.ffffff}, @ref{28c8,,microsecond}가 0이 아니면

@item 
@code{HH:MM:SS}, @ref{28c8,,microsecond}가 0이면

@item 
@code{HH:MM:SS.ffffff+HH:MM[:SS[.ffffff]]}, @ref{2909,,utcoffset()}이 @code{None}을 반환하지 않으면

@item 
@code{HH:MM:SS+HH:MM[:SS[.ffffff]]}, @ref{28c8,,microsecond}가 0이고 @ref{2909,,utcoffset()}이 @code{None}을 반환하지 않으면
@end itemize

선택적 인자 `timespec'은 포함할 시간의 추가 구성 요소 수를 지정합니다 (기본값은 @code{'auto'}입니다). 다음 중 하나일 수 있습니다:


@itemize -

@item 
@code{'auto'}: @ref{28c8,,microsecond}가 0이면 @code{'seconds'}와 같고, 그렇지 않으면 @code{'microseconds'}와 같습니다.

@item 
@code{'hours'}: @ref{28c5,,hour}를 두 자리 숫자 @code{HH} 형식으로 포함합니다.

@item 
@code{'minutes'}: @ref{28c5,,hour}와 @ref{28c6,,minute}를 @code{HH:MM} 형식으로 포함합니다.

@item 
@code{'seconds'}: @ref{28c5,,hour}, @ref{28c6,,minute} 및 @ref{28c7,,second}를 @code{HH:MM:SS} 형식으로 포함합니다.

@item 
@code{'milliseconds'}: 전체 시간을 포함하지만, 초 미만은 밀리초 단위로 자릅니다. @code{HH:MM:SS.sss} 형식입니다.

@item 
@code{'microseconds'}: 전체 시간을 @code{HH:MM:SS.ffffff} 형식으로 포함합니다.
@end itemize

@cartouche
@quotation 참고 
제외된 시간 구성 요소는 반올림되지 않고 잘립니다.
@end quotation
@end cartouche

잘못된 `timespec' 인자는 @ref{2ec,,ValueError}를 발생시킵니다.

예제:

@example
>>> import datetime as dt
>>> dt.time(hour=12, minute=34, second=56, microsecond=123456).isoformat(timespec='minutes')
'12:34'
>>> my_time = dt.time(hour=12, minute=34, second=56, microsecond=0)
>>> my_time.isoformat(timespec='microseconds')
'12:34:56.000000'
>>> my_time.isoformat(timespec='auto')
'12:34:56'
@end example


버전 3.6에서 변경: Added the `timespec' parameter.

@end deffn

@geindex __str__() (datetime.time 메서드)
@anchor{library/datetime datetime time __str__}@anchor{290a}
@deffn {메서드} time.__str__ ()

For a time @code{t}, @code{str(t)} is equivalent to @code{t.isoformat()}.
@end deffn

@geindex strftime() (datetime.time 메서드)
@anchor{library/datetime datetime time strftime}@anchor{1af6}
@deffn {메서드} time.strftime (format)

Return a string representing the time, controlled by an explicit format
string.  See also @ref{1b52,,strftime() and strptime() behavior} and @ref{2908,,time.isoformat()}.
@end deffn

@geindex __format__() (datetime.time 메서드)
@anchor{library/datetime datetime time __format__}@anchor{290b}
@deffn {메서드} time.__format__ (format)

Same as @ref{1af6,,time.strftime()}. This makes it possible to specify
a format string for a @ref{1fb,,time} object in @ref{19a,,formatted string literals} and when using @ref{832,,str.format()}.
See also @ref{1b52,,strftime() and strptime() behavior} and @ref{2908,,time.isoformat()}.
@end deffn

@geindex utcoffset() (datetime.time 메서드)
@anchor{library/datetime datetime time utcoffset}@anchor{2909}
@deffn {메서드} time.utcoffset ()

@ref{28c9,,tzinfo}가 @code{None}이면, @code{None}을 반환하고, 그렇지 않으면 @code{self.tzinfo.utcoffset(None)}를 반환하고, 후자가 @code{None}이나 하루 미만의 크기를 가진 @ref{bc2,,timedelta} 객체를 반환하지 않으면 예외를 발생시킵니다.


버전 3.7에서 변경: UTC 오프셋은 분 단위로 제한되지 않습니다.

@end deffn

@geindex dst() (datetime.time 메서드)
@anchor{library/datetime datetime time dst}@anchor{290c}
@deffn {메서드} time.dst ()

@ref{28c9,,tzinfo}가 @code{None}이면, @code{None}을 반환하고, 그렇지 않으면 @code{self.tzinfo.dst(None)}를 반환하고, 후자가 @code{None}이나 하루 미만의 크기를 가진 @ref{bc2,,timedelta} 객체를 반환하지 않으면 예외를 발생시킵니다.


버전 3.7에서 변경: DST 오프셋은 분 단위로 제한되지 않습니다.

@end deffn

@geindex tzname() (datetime.time 메서드)
@anchor{library/datetime datetime time tzname}@anchor{290d}
@deffn {메서드} time.tzname ()

@ref{28c9,,tzinfo}가 @code{None}이면, @code{None}을 반환하고, 그렇지 않으면 @code{self.tzinfo.tzname(None)}를 반환하고, 후자가 @code{None}이나 문자열 객체를 반환하지 않으면 예외를 발생시킵니다.
@end deffn

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

@end menu

@node Examples of usage time,,,time objects
@anchor{library/datetime examples-of-usage-time}@anchor{290e}
@subsubsection Examples of usage: @code{time}


@ref{1fb,,time} 객체로 작업하는 예제:

@example
>>> import datetime as dt
>>> class TZ1(dt.tzinfo):
...     def utcoffset(self, when):
...         return dt.timedelta(hours=1)
...     def dst(self, when):
...         return dt.timedelta(0)
...     def tzname(self, when):
...         return "+01:00"
...     def  __repr__(self):
...         return f"@{self.__class__.__name__@}()"
...
>>> t = dt.time(12, 10, 30, tzinfo=TZ1())
>>> t
datetime.time(12, 10, 30, tzinfo=TZ1())
>>> t.isoformat()
'12:10:30+01:00'
>>> t.dst()
datetime.timedelta(0)
>>> t.tzname()
'+01:00'
>>> t.strftime("%H:%M:%S %Z")
'12:10:30 +01:00'
>>> 'The @{@} is @{:%H:%M@}.'.format("time", t)
'The time is 12:10.'
@end example

@node tzinfo objects,timezone objects,time objects,datetime — Basic date and time types
@anchor{library/datetime datetime-tzinfo}@anchor{290f}@anchor{library/datetime tzinfo-objects}@anchor{2910}
@subsubsection @code{tzinfo} objects


@geindex tzinfo (datetime 클래스)
@anchor{library/datetime datetime tzinfo}@anchor{7f5}
@deffn {클래스} datetime.tzinfo

This is an @ref{13bb,,abstract base class}, meaning that this class should not be
instantiated directly.  Define a subclass of @code{tzinfo} to capture
information about a particular time zone.

An instance of (a concrete subclass of) @code{tzinfo} can be passed to the
constructors for @ref{4e2,,datetime} and @ref{1fb,,time} objects. The latter objects
view their attributes as being in local time, and the @code{tzinfo} object
supports methods revealing offset of local time from UTC, the name of the time
zone, and DST offset, all relative to a date or time object passed to them.

You need to derive a concrete subclass, and (at least)
supply implementations of the standard @code{tzinfo} methods needed by the
@ref{4e2,,datetime} methods you use. The @code{datetime} module provides
@ref{12c4,,timezone}, a simple concrete subclass of @code{tzinfo} which can
represent time zones with fixed offset from UTC such as UTC itself or North
American EST and EDT.

Special requirement for pickling:  A @code{tzinfo} subclass must have an
@ref{8be,,__init__()} method that can be called with no arguments,
otherwise it can be
pickled but possibly not unpickled again. This is a technical requirement that
may be relaxed in the future.

A concrete subclass of @code{tzinfo} may need to implement the following
methods. Exactly which methods are needed depends on the uses made of aware
@code{datetime} objects. If in doubt, simply implement all of them.
@end deffn

@geindex utcoffset() (datetime.tzinfo 메서드)
@anchor{library/datetime datetime tzinfo utcoffset}@anchor{2911}
@deffn {메서드} tzinfo.utcoffset (dt)

지역 시간의 UTC로부터의 오프셋을 UTC의 동쪽에 있을 때 양의 값을 갖는 @ref{bc2,,timedelta} 객체로 반환합니다. 지역 시간이 UTC의 서쪽이면 이 값은 음수여야 합니다.

이것은 UTC로부터의 총 오프셋을 나타냅니다; 예를 들어, @ref{7f5,,tzinfo} 객체가 시간대와 DST 조정을 모두 나타내면, @ref{2911,,utcoffset()}은 그들의 합계를 반환해야 합니다. UTC 오프셋을 알 수 없으면, @code{None}을 반환합니다. 그렇지 않으면 반환되는 값은 반드시 @code{-timedelta(hours=24)}와 @code{timedelta(hours=24)} 사이의 @ref{bc2,,timedelta} 객체여야 합니다 (오프셋의 크기는 하루 미만이어야 합니다). @code{utcoffset()}의 대부분 구현은 아마도 이 두 가지 중 하나일 것입니다:

@example
return CONSTANT                 # fixed-offset class
return CONSTANT + self.dst(dt)  # daylight-aware class
@end example

@ref{2911,,utcoffset()}이 @code{None}을 반환하지 않으면, @ref{2912,,dst()}도 @code{None}을 반환하지 않아야 합니다.

@ref{2911,,utcoffset()}의 기본 구현은 @ref{36b,,NotImplementedError}를 발생시킵니다.


버전 3.7에서 변경: UTC 오프셋은 분 단위로 제한되지 않습니다.

@end deffn

@geindex dst() (datetime.tzinfo 메서드)
@anchor{library/datetime datetime tzinfo dst}@anchor{2912}
@deffn {메서드} tzinfo.dst (dt)

일광 절약 시간 (DST) 조정을 @ref{bc2,,timedelta} 객체로, 또는 DST 정보를 모르면 @code{None}을 반환합니다.

Return @code{timedelta(0)} if DST is not in effect.
If DST is in effect, return the offset as a @ref{bc2,,timedelta} object
(see @ref{2911,,utcoffset()} for details). Note that DST offset, if applicable, has
already been added to the UTC offset returned by @code{utcoffset()}, so there’s
no need to consult @code{dst()} unless you’re interested in obtaining DST info
separately. For example, @ref{28f9,,datetime.timetuple()} calls its @ref{28d1,,tzinfo}
attribute’s @code{dst()} method to determine how the @ref{28fa,,tm_isdst} flag
should be set, and @ref{28f7,,tzinfo.fromutc()} calls @code{dst()} to account for
DST changes when crossing time zones.

표준과 일광 절약 시간을 모두 모형화하는 @ref{7f5,,tzinfo} 서브 클래스의 인스턴스 `tz'는 다음과 같은 의미에서 일관되어야 합니다:

@code{tz.utcoffset(dt) - tz.dst(dt)}

must return the same result for every @ref{4e2,,datetime} `dt' with @code{dt.tzinfo ==
tz}. For sane @code{tzinfo} subclasses, this expression yields the time
zone’s “standard offset”, which should not depend on the date or the time, but
only on geographic location. The implementation of @ref{bc3,,datetime.astimezone()}
relies on this, but cannot detect violations; it’s the programmer’s
responsibility to ensure it. If a @code{tzinfo} subclass cannot guarantee
this, it may be able to override the default implementation of
@ref{28f7,,tzinfo.fromutc()} to work correctly with @code{astimezone()} regardless.

@ref{2912,,dst()}의 대부분 구현은 아마도 이 두 가지 중 하나일 것입니다:

@example
import datetime as dt

def dst(self, when):
    # a fixed-offset class:  doesn't account for DST
    return dt.timedelta(0)
@end example

또는:

@example
import datetime as dt

def dst(self, when):
    # Code to set dston and dstoff to the time zone's DST
    # transition times based on the input when.year, and expressed
    # in standard local time.

    if dston <= when.replace(tzinfo=None) < dstoff:
        return dt.timedelta(hours=1)
    else:
        return dt.timedelta(0)
@end example

@ref{2912,,dst()}의 기본 구현은 @ref{36b,,NotImplementedError}를 발생시킵니다.


버전 3.7에서 변경: DST 오프셋은 분 단위로 제한되지 않습니다.

@end deffn

@geindex tzname() (datetime.tzinfo 메서드)
@anchor{library/datetime datetime tzinfo tzname}@anchor{2913}
@deffn {메서드} tzinfo.tzname (dt)

Return the time zone name corresponding to the @ref{4e2,,datetime} object `dt', as
a string. Nothing about string names is defined by the @code{datetime} module,
and there’s no requirement that it mean anything in particular. For example,
@code{"GMT"}, @code{"UTC"}, @code{"-500"}, @code{"-5:00"}, @code{"EDT"}, @code{"US/Eastern"}, @code{"America/New York"} are all
valid replies. Return @code{None} if a string name isn’t known. Note that this is
a method rather than a fixed string primarily because some @ref{7f5,,tzinfo}
subclasses will wish to return different names depending on the specific value
of `dt' passed, especially if the @code{tzinfo} class is accounting for
daylight time.

@ref{2913,,tzname()}의 기본 구현은 @ref{36b,,NotImplementedError}를 발생시킵니다.
@end deffn

These methods are called by a @ref{4e2,,datetime} or @ref{1fb,,time} object, in
response to their methods of the same names. A @code{datetime} object passes
itself as the argument, and a @code{time} object passes @code{None} as the
argument. A @ref{7f5,,tzinfo} subclass’s methods should therefore be prepared to
accept a `dt' argument of @code{None}, or of class @code{datetime}.

@code{None}이 전달되면, 최선의 응답을 결정하는 것은 클래스 설계자에게 달려있습니다. 예를 들어, 클래스가 @ref{7f5,,tzinfo} 프로토콜에 time 객체가 참여하지 않는다고 말하고 싶다면 @code{None}을 반환하는 것이 적절합니다. 표준 오프셋을 발견하는 다른 규칙이 없으므로, @code{utcoffset(None)}이 표준 UTC 오프셋을 반환하는 것이 더 유용할 수 있습니다.

When a @ref{4e2,,datetime} object is passed in response to a @code{datetime}
method, @code{dt.tzinfo} is the same object as `self'. @ref{7f5,,tzinfo} methods can
rely on this, unless user code calls @code{tzinfo} methods directly. The
intent is that the @code{tzinfo} methods interpret `dt' as being in local
time, and not need worry about objects in other time zones.

서브 클래스가 재정의할 수 있는 @ref{7f5,,tzinfo} 메서드가 하나 더 있습니다:

@geindex fromutc() (datetime.tzinfo 메서드)
@anchor{library/datetime datetime tzinfo fromutc}@anchor{28f7}
@deffn {메서드} tzinfo.fromutc (dt)

This is called from the default @ref{bc3,,datetime.astimezone()}
implementation. When called from that, @code{dt.tzinfo} is `self', and `dt'’s
date and time data are to be viewed as expressing a UTC time. The purpose
of @code{fromutc()} is to adjust the date and time data, returning an
equivalent datetime in `self'’s local time.

Most @ref{7f5,,tzinfo} subclasses should be able to inherit the default
@code{fromutc()} implementation without problems. It’s strong enough to handle
fixed-offset time zones, and time zones accounting for both standard and
daylight time, and the latter even if the DST transition times differ in
different years. An example of a time zone the default @code{fromutc()}
implementation may not handle correctly in all cases is one where the standard
offset (from UTC) depends on the specific date and time passed, which can happen
for political reasons. The default implementations of @ref{bc3,,astimezone()} and
@code{fromutc()} may not produce the result you want if the result is one of the
hours straddling the moment the standard offset changes.

에러가 발생하는 경우를 위한 코드를 생략하면, 기본 @ref{28f7,,fromutc()} 구현은 다음과 같이 동작합니다:

@example
import datetime as dt

def fromutc(self, when):
    # raise ValueError error if when.tzinfo is not self
    dtoff = when.utcoffset()
    dtdst = when.dst()
    # raise ValueError if dtoff is None or dtdst is None
    delta = dtoff - dtdst  # this is self's standard offset
    if delta:
        when += delta   # convert to standard local time
        dtdst = when.dst()
        # raise ValueError if dtdst is None
    if dtdst:
        return when + dtdst
    else:
        return when
@end example
@end deffn

다음 @code{tzinfo_examples.py} 파일에는 @ref{7f5,,tzinfo} 클래스의 몇 가지 예가 나와 있습니다:

@example
import datetime as dt

# A class capturing the platform's idea of local time.
# (May result in wrong values on historical times in
#  timezones where UTC offset and/or the DST rules had
#  changed in the past.)
import time

ZERO = dt.timedelta(0)
HOUR = dt.timedelta(hours=1)
SECOND = dt.timedelta(seconds=1)

STDOFFSET = dt.timedelta(seconds=-time.timezone)
if time.daylight:
    DSTOFFSET = dt.timedelta(seconds=-time.altzone)
else:
    DSTOFFSET = STDOFFSET

DSTDIFF = DSTOFFSET - STDOFFSET


class LocalTimezone(dt.tzinfo):

    def fromutc(self, when):
        assert when.tzinfo is self
        stamp = (when - dt.datetime(1970, 1, 1, tzinfo=self)) // SECOND
        args = time.localtime(stamp)[:6]
        dst_diff = DSTDIFF // SECOND
        # Detect fold
        fold = (args == time.localtime(stamp - dst_diff))
        return dt.datetime(*args, microsecond=when.microsecond,
                           tzinfo=self, fold=fold)

    def utcoffset(self, when):
        if self._isdst(when):
            return DSTOFFSET
        else:
            return STDOFFSET

    def dst(self, when):
        if self._isdst(when):
            return DSTDIFF
        else:
            return ZERO

    def tzname(self, when):
        return time.tzname[self._isdst(when)]

    def _isdst(self, when):
        tt = (when.year, when.month, when.day,
              when.hour, when.minute, when.second,
              when.weekday(), 0, 0)
        stamp = time.mktime(tt)
        tt = time.localtime(stamp)
        return tt.tm_isdst > 0


Local = LocalTimezone()


# A complete implementation of current DST rules for major US time zones.

def first_sunday_on_or_after(when):
    days_to_go = 6 - when.weekday()
    if days_to_go:
        when += dt.timedelta(days_to_go)
    return when


# US DST Rules
#
# This is a simplified (i.e., wrong for a few cases) set of rules for US
# DST start and end times. For a complete and up-to-date set of DST rules
# and timezone definitions, visit the Olson Database (or try pytz):
# http://www.twinsun.com/tz/tz-link.htm
# https://sourceforge.net/projects/pytz/ (might not be up-to-date)
#
# In the US, since 2007, DST starts at 2am (standard time) on the second
# Sunday in March, which is the first Sunday on or after Mar 8.
DSTSTART_2007 = dt.datetime(1, 3, 8, 2)
# and ends at 2am (DST time) on the first Sunday of Nov.
DSTEND_2007 = dt.datetime(1, 11, 1, 2)
# From 1987 to 2006, DST used to start at 2am (standard time) on the first
# Sunday in April and to end at 2am (DST time) on the last
# Sunday of October, which is the first Sunday on or after Oct 25.
DSTSTART_1987_2006 = dt.datetime(1, 4, 1, 2)
DSTEND_1987_2006 = dt.datetime(1, 10, 25, 2)
# From 1967 to 1986, DST used to start at 2am (standard time) on the last
# Sunday in April (the one on or after April 24) and to end at 2am (DST time)
# on the last Sunday of October, which is the first Sunday
# on or after Oct 25.
DSTSTART_1967_1986 = dt.datetime(1, 4, 24, 2)
DSTEND_1967_1986 = DSTEND_1987_2006


def us_dst_range(year):
    # Find start and end times for US DST. For years before 1967, return
    # start = end for no DST.
    if 2006 < year:
        dststart, dstend = DSTSTART_2007, DSTEND_2007
    elif 1986 < year < 2007:
        dststart, dstend = DSTSTART_1987_2006, DSTEND_1987_2006
    elif 1966 < year < 1987:
        dststart, dstend = DSTSTART_1967_1986, DSTEND_1967_1986
    else:
        return (dt.datetime(year, 1, 1), ) * 2

    start = first_sunday_on_or_after(dststart.replace(year=year))
    end = first_sunday_on_or_after(dstend.replace(year=year))
    return start, end


class USTimeZone(dt.tzinfo):

    def __init__(self, hours, reprname, stdname, dstname):
        self.stdoffset = dt.timedelta(hours=hours)
        self.reprname = reprname
        self.stdname = stdname
        self.dstname = dstname

    def __repr__(self):
        return self.reprname

    def tzname(self, when):
        if self.dst(when):
            return self.dstname
        else:
            return self.stdname

    def utcoffset(self, when):
        return self.stdoffset + self.dst(when)

    def dst(self, when):
        if when is None or when.tzinfo is None:
            # An exception may be sensible here, in one or both cases.
            # It depends on how you want to treat them.  The default
            # fromutc() implementation (called by the default astimezone()
            # implementation) passes a datetime with when.tzinfo is self.
            return ZERO
        assert when.tzinfo is self
        start, end = us_dst_range(when.year)
        # Can't compare naive to aware objects, so strip the timezone from
        # when first.
        when = when.replace(tzinfo=None)
        if start + HOUR <= when < end - HOUR:
            # DST is in effect.
            return HOUR
        if end - HOUR <= when < end:
            # Fold (an ambiguous hour): use when.fold to disambiguate.
            return ZERO if when.fold else HOUR
        if start <= when < start + HOUR:
            # Gap (a non-existent hour): reverse the fold rule.
            return HOUR if when.fold else ZERO
        # DST is off.
        return ZERO

    def fromutc(self, when):
        assert when.tzinfo is self
        start, end = us_dst_range(when.year)
        start = start.replace(tzinfo=self)
        end = end.replace(tzinfo=self)
        std_time = when + self.stdoffset
        dst_time = std_time + HOUR
        if end <= dst_time < end + HOUR:
            # Repeated hour
            return std_time.replace(fold=1)
        if std_time < start or dst_time >= end:
            # Standard time
            return std_time
        if start <= std_time < end - HOUR:
            # Daylight saving time
            return dst_time


Eastern  = USTimeZone(-5, "Eastern",  "EST", "EDT")
Central  = USTimeZone(-6, "Central",  "CST", "CDT")
Mountain = USTimeZone(-7, "Mountain", "MST", "MDT")
Pacific  = USTimeZone(-8, "Pacific",  "PST", "PDT")
@end example

DST 전환점에서 표준 시간과 일광 절약 시간을 모두 고려하는 @ref{7f5,,tzinfo} 서브 클래스에는 일 년에 두 번 불가피한 미묘함이 있음에 유의하십시오. 구체적으로, 3월 두 번째 일요일의 1:59 (EST) 다음 분에 시작하고, 11월 첫 번째 일요일 1:59 (EDT) 다음 분에 끝나는 미국 Eastern(UTC -0500)을 고려하십시오:

@example
  UTC   3:MM  4:MM  5:MM  6:MM  7:MM  8:MM
  EST  22:MM 23:MM  0:MM  1:MM  2:MM  3:MM
  EDT  23:MM  0:MM  1:MM  2:MM  3:MM  4:MM

start  22:MM 23:MM  0:MM  1:MM  3:MM  4:MM

  end  23:MM  0:MM  1:MM  1:MM  2:MM  3:MM
@end example

DST가 시작할 때 (“start” 줄), 지역 벽시계는 1:59에서 3:00로 도약합니다. 그날에는 2:MM 형식의 벽 시간은 실질적인 의미가 없으므로, @code{astimezone(Eastern)}은 DST가 시작하는 날에 @code{hour == 2}인 결과를 전달하지 않습니다. 예를 들어, 2016년 봄의 전진 전환(forward transition)에서, 다음과 같은 결과를 얻습니다:

@example
>>> import datetime as dt
>>> from tzinfo_examples import HOUR, Eastern
>>> u0 = dt.datetime(2016, 3, 13, 5, tzinfo=dt.timezone.utc)
>>> for i in range(4):
...     u = u0 + i*HOUR
...     t = u.astimezone(Eastern)
...     print(u.time(), 'UTC =', t.time(), t.tzname())
...
05:00:00 UTC = 00:00:00 EST
06:00:00 UTC = 01:00:00 EST
07:00:00 UTC = 03:00:00 EDT
08:00:00 UTC = 04:00:00 EDT
@end example

When DST ends (the “end” line), there’s a potentially worse problem: there’s an
hour that can’t be spelled unambiguously in local wall time: the last hour of
daylight time. In Eastern, that’s times of the form 5:MM UTC on the day
daylight time ends. The local wall clock leaps from 1:59 (daylight time) back
to 1:00 (standard time) again. Local times of the form 1:MM are ambiguous.
@ref{bc3,,astimezone()} mimics the local clock’s behavior by mapping two adjacent UTC
hours into the same local hour then. In the Eastern example, UTC times of the
form 5:MM and 6:MM both map to 1:MM when converted to Eastern, but earlier times
have the @ref{e50,,fold} attribute set to 0 and the later times have it set to 1.
For example, at the Fall back transition of 2016, we get:

@example
>>> import datetime as dt
>>> from tzinfo_examples import HOUR, Eastern
>>> u0 = dt.datetime(2016, 11, 6, 4, tzinfo=dt.timezone.utc)
>>> for i in range(4):
...     u = u0 + i*HOUR
...     t = u.astimezone(Eastern)
...     print(u.time(), 'UTC =', t.time(), t.tzname(), t.fold)
...
04:00:00 UTC = 00:00:00 EDT 0
05:00:00 UTC = 01:00:00 EDT 0
06:00:00 UTC = 01:00:00 EST 1
07:00:00 UTC = 02:00:00 EST 0
@end example

Note that the @ref{4e2,,datetime} instances that differ only by the value of the
@ref{e50,,fold} attribute are considered equal in comparisons.

Applications that can’t bear wall-time ambiguities should explicitly check the
value of the @ref{e50,,fold} attribute or avoid using hybrid
@ref{7f5,,tzinfo} subclasses; there are no ambiguities when using @ref{12c4,,timezone},
or any other fixed-offset @code{tzinfo} subclass (such as a class representing
only EST (fixed offset -5 hours), or only EDT (fixed offset -4 hours)).


@subsubheading 더 보기


@quotation


@table @asis

@item @ref{13a,,zoneinfo}

The @code{datetime} module has a basic @ref{12c4,,timezone} class (for
handling arbitrary fixed offsets from UTC) and its @ref{826,,timezone.utc}
attribute (a UTC @code{timezone} instance).

@code{zoneinfo} brings the `IANA time zone database' (also known as the Olson
database) to Python, and its usage is recommended.
@end table
@end quotation


@table @asis

@item IANA time zone database@footnote{https://www.iana.org/time-zones}

시간대 데이터베이스 (종종 tz, tzdata 또는 zoneinfo라고 합니다)에는 전 세계 여러 지역에서 지역 시간의 히스토리를 표현하는 코드와 데이터가 포함되어 있습니다. 정치 단체가 변경 한 시간대 경계, UTC 오프셋 및 일광 절약 시간 규칙을 반영하기 위해 주기적으로 갱신됩니다.
@end table


@node timezone objects,strftime and strptime behavior,tzinfo objects,datetime — Basic date and time types
@anchor{library/datetime datetime-timezone}@anchor{2914}@anchor{library/datetime timezone-objects}@anchor{2915}
@subsubsection @code{timezone} objects


The @ref{12c4,,timezone} class is a subclass of @ref{7f5,,tzinfo}, each
instance of which represents a time zone defined by a fixed offset from
UTC.

Objects of this class cannot be used to represent time zone information in the
locations where different offsets are used in different days of the year or
where historical changes have been made to civil time.

@geindex timezone (datetime 클래스)
@anchor{library/datetime datetime timezone}@anchor{12c4}
@deffn {클래스} datetime.timezone (offset, name=None)

`offset' 인자는 지역 시간과 UTC 간의 차이를 나타내는 @ref{bc2,,timedelta} 객체로 지정해야 합니다. 엄격히(경계를 포함하지 않는) @code{-timedelta(hours=24)}와 @code{timedelta(hours=24)} 사이여야 합니다. 그렇지 않으면 @ref{2ec,,ValueError}가 발생합니다.

`name' 인자는 선택적입니다. 지정되면 @ref{28f8,,datetime.tzname()} 메서드가 반환하는 값으로 사용될 문자열이어야 합니다.


Added in version 3.2.



버전 3.7에서 변경: UTC 오프셋은 분 단위로 제한되지 않습니다.

@end deffn

@geindex utcoffset() (datetime.timezone 메서드)
@anchor{library/datetime datetime timezone utcoffset}@anchor{2916}
@deffn {메서드} timezone.utcoffset (dt)

@ref{12c4,,timezone} 인스턴스가 구축될 때 지정된 고정값을 반환합니다.

`dt' 인자는 무시됩니다. 반환 값은 지역 시간과 UTC 간의 차이와 같은 @ref{bc2,,timedelta} 인스턴스입니다.


버전 3.7에서 변경: UTC 오프셋은 분 단위로 제한되지 않습니다.

@end deffn

@geindex tzname() (datetime.timezone 메서드)
@anchor{library/datetime datetime timezone tzname}@anchor{2917}
@deffn {메서드} timezone.tzname (dt)

@ref{12c4,,timezone} 인스턴스가 구축될 때 지정된 고정값을 반환합니다.

`name'을 생성자에 제공하지 않았으면, @code{tzname(dt)}에 의해 반환되는 이름은 다음과 같이 @code{offset} 값으로부터 생성됩니다. `offset'이 @code{timedelta(0)}이면, 이름은 “UTC”이고, 그렇지 않으면 문자열 @code{UTC±HH:MM}입니다. 여기서 ±는 @code{offset}의 부호이고, HH와 MM은 각각 @code{offset.hours}와 @code{offset.minutes}의 두 자리 숫자입니다.


버전 3.6에서 변경: Name generated from @code{offset=timedelta(0)} is now plain @code{'UTC'}, not
@code{'UTC+00:00'}.

@end deffn

@geindex dst() (datetime.timezone 메서드)
@anchor{library/datetime datetime timezone dst}@anchor{2918}
@deffn {메서드} timezone.dst (dt)

항상 @code{None}을 반환합니다.
@end deffn

@geindex fromutc() (datetime.timezone 메서드)
@anchor{library/datetime datetime timezone fromutc}@anchor{2919}
@deffn {메서드} timezone.fromutc (dt)

@code{dt + offset}을 반환합니다. `dt' 인자는 @code{tzinfo}가 @code{self}로 설정된 어웨어 @ref{4e2,,datetime} 인스턴스여야 합니다.
@end deffn

클래스 어트리뷰트:

@geindex utc (datetime.timezone의 속성)
@anchor{library/datetime datetime timezone utc}@anchor{826}
@deffn {속성} timezone.utc

The UTC time zone, @code{timezone(timedelta(0))}.
@end deffn

@geindex % (percent);datetime format

@node strftime and strptime behavior,,timezone objects,datetime — Basic date and time types
@anchor{library/datetime strftime-and-strptime-behavior}@anchor{291a}@anchor{library/datetime strftime-strptime-behavior}@anchor{1b52}
@subsubsection @code{strftime()} and @code{strptime()} behavior


@ref{1fa,,date}, @ref{4e2,,datetime} 및 @ref{1fb,,time} 객체는 모두 @code{strftime(format)} 메서드를 지원하여, 명시적 포맷 문자열로 제어된 시간을 나타내는 문자열을 만듭니다.

Conversely, the @ref{1f9,,date.strptime()}, @ref{1951,,datetime.strptime()} and
@ref{1632,,time.strptime()} class methods create an object from a string
representing the time and a corresponding format string.

The table below provides a high-level comparison of @ref{e8d,,strftime()}
versus @ref{1951,,strptime()}:


@multitable {xxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

@tab

@code{strftime}

@tab

@code{strptime}

@item

용도

@tab

주어진 포맷에 따라 객체를 문자열로 변환합니다

@tab

Parse a string into an object given a corresponding format

@item

메서드의 형

@tab

인스턴스 메서드

@tab

클래스 메서드

@item

서명

@tab

@code{strftime(format)}

@tab

@code{strptime(date_string, format)}

@end multitable


@quotation
@anchor{library/datetime format-codes}@anchor{28bb}
@end quotation

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

@end menu

@node strftime and strptime format codes,Technical detail,,strftime and strptime behavior
@anchor{library/datetime strftime-and-strptime-format-codes}@anchor{291b}
@subsubsection @code{strftime()} and @code{strptime()} format codes


These methods accept format codes that can be used to parse and format dates:

@example
>>> import datetime as dt
>>> dt.datetime.strptime('31/01/22 23:59:59.999999',
...                      '%d/%m/%y %H:%M:%S.%f')
datetime.datetime(2022, 1, 31, 23, 59, 59, 999999)
>>> _.strftime('%a %d %b %Y, %I:%M%p')
'Mon 31 Jan 2022, 11:59PM'
@end example

다음은 1989 C 표준이 요구하는 모든 포맷 코드 목록이며, 표준 C 구현이 있는 모든 플랫폼에서 작동합니다.


@multitable {xxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxx} 
@headitem

지시자

@tab

의미

@tab

예

@tab

노트

@item

@code{%a}

@tab

요일을 로케일의 축약된 이름으로.

@tab


@display
Sun, Mon, …, Sat (en_US);@w{ }
So, Mo, …, Sa (de_DE)@w{ }
@end display



@tab

(1)

@item

@code{%A}

@tab

요일을 로케일의 전체 이름으로.

@tab


@display
Sunday, Monday, …, Saturday (en_US);@w{ }
Sonntag, Montag, …, Samstag (de_DE)@w{ }
@end display



@tab

(1)

@item

@code{%w}

@tab

요일을 10진수로, 0은 일요일이고 6은 토요일입니다.

@tab

0, 1, …, 6

@tab

@item

@code{%d}

@tab

월중 일(day of the month)을 0으로 채워진 10진수로.

@tab

01, 02, …, 31

@tab

(9)

@item

@code{%b}

@tab

월을 로케일의 축약된 이름으로.

@tab


@display
Jan, Feb, …, Dec (en_US);@w{ }
Jan, Feb, …, Dez (de_DE)@w{ }
@end display



@tab

(1)

@item

@code{%B}

@tab

월을 로케일의 전체 이름으로.

@tab


@display
January, February, …, December (en_US);@w{ }
Januar, Februar, …, Dezember (de_DE)@w{ }
@end display



@tab

(1)

@item

@code{%m}

@tab

월을 0으로 채워진 10진수로.

@tab

01, 02, …, 12

@tab

(9)

@item

@code{%y}

@tab

세기가 없는 해(year)를 0으로 채워진 10진수로.

@tab

00, 01, …, 99

@tab

(9)

@item

@code{%Y}

@tab

세기가 있는 해(year)를 10진수로.

@tab

0001, 0002, …, 2013,
2014, …, 9998, 9999

@tab

(2)

@item

@code{%H}

@tab

시(24시간제)를 0으로 채워진 십진수로.

@tab

00, 01, …, 23

@tab

(9)

@item

@code{%I}

@tab

시(12시간제)를 0으로 채워진 십진수로.

@tab

01, 02, …, 12

@tab

(9)

@item

@code{%p}

@tab

로케일의 오전이나 오후에 해당하는 것.

@tab


@display
AM, PM (en_US);@w{ }
am, pm (de_DE)@w{ }
@end display



@tab

(1),
(3)

@item

@code{%M}

@tab

분을 0으로 채워진 십진수로.

@tab

00, 01, …, 59

@tab

(9)

@item

@code{%S}

@tab

초를 0으로 채워진 10진수로.

@tab

00, 01, …, 59

@tab

(4),
(9)

@item

@code{%f}

@tab

Microsecond as a decimal
number, zero-padded to 6
digits.

@tab

000000, 000001, …,
999999

@tab

(5)

@item

@code{%z}

@tab

@code{±HHMM[SS[.ffffff]]} 형태의 UTC 오프셋 (객체가 나이브하면 빈 문자열).

@tab

(비어 있음), +0000, -0400, +1030, +063415, -030712.345216

@tab

(6)

@item

@code{%Z}

@tab

시간대 이름 (객체가 나이브하면 빈 문자열).

@tab

(비어 있음), UTC, GMT

@tab

(6)

@item

@code{%j}

@tab

연중 일(day of the year)을 0으로 채워진 십진수로.

@tab

001, 002, …, 366

@tab

(9)

@item

@code{%U}

@tab

Week number of the year
(Sunday as the first day of
the week) as a zero-padded
decimal number. All days in a
new year preceding the first
Sunday are considered to be in
week 0.

@tab

00, 01, …, 53

@tab

(7),
(9)

@item

@code{%W}

@tab

Week number of the year
(Monday as the first day of
the week) as a zero-padded
decimal number. All days in a
new year preceding the first
Monday are considered to be in
week 0.

@tab

00, 01, …, 53

@tab

(7),
(9)

@item

@code{%c}

@tab

로케일의 적절한 날짜와 시간 표현.

@tab


@display
Tue Aug 16 21:30:00 1988 (en_US);@w{ }
Di 16 Aug 21:30:00 1988 (de_DE)@w{ }
@end display



@tab

(1)

@item

@code{%x}

@tab

로케일의 적절한 날짜 표현.

@tab


@display
08/16/88 (None);@w{ }
08/16/1988 (en_US);@w{ }
16.08.1988 (de_DE)@w{ }
@end display



@tab

(1)

@item

@code{%X}

@tab

로케일의 적절한 시간 표현.

@tab


@display
21:30:00 (en_US);@w{ }
21:30:00 (de_DE)@w{ }
@end display



@tab

(1)

@item

@code{%%}

@tab

리터럴 @code{'%'} 문자.

@tab

%

@tab

@end multitable


C89 표준에서 요구하지 않는 몇 가지 추가 지시자가 편의상 포함되어 있습니다. 이 파라미터들은 모두 ISO 8601 날짜 값에 해당합니다.


@multitable {xxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxx} 
@headitem

지시자

@tab

의미

@tab

예

@tab

노트

@item

@code{%G}

@tab

ISO 주(@code{%V})의 더 큰 부분을 포함하는 연도를 나타내는 세기가 있는 ISO 8601 연도.

@tab

0001, 0002, …, 2013,
2014, …, 9998, 9999

@tab

(8)

@item

@code{%u}

@tab

ISO 8601 요일을 10진수로, 1은 월요일입니다.

@tab

1, 2, …, 7

@tab

@item

@code{%V}

@tab

ISO 8601 주를 월요일을 주의 시작으로 하는 십진수로. 주 01은 1월 4일을 포함하는 주입니다.

@tab

01, 02, …, 53

@tab

(8),
(9)

@item

@code{%:z}

@tab

UTC offset in the form
@code{±HH:MM[:SS[.ffffff]]}
(empty string if the object is
naive).

@tab

(empty), +00:00,
-04:00, +10:30,
+06:34:15,
-03:07:12.345216

@tab

(6)

@end multitable


These may not be available on all platforms when used with the @ref{e8d,,strftime()}
method. The ISO 8601 year and ISO 8601 week directives are not interchangeable
with the year and week number directives above. Calling @ref{1951,,strptime()} with
incomplete or ambiguous ISO 8601 directives will raise a @ref{2ec,,ValueError}.

The full set of format codes supported varies across platforms, because Python
calls the platform C library’s @code{strftime()} function, and platform
variations are common. To see the full set of format codes supported on your
platform, consult the @code{strftime(3)@footnote{https://manpages.debian.org/strftime(3)}} documentation. There are also
differences between platforms in handling of unsupported format specifiers.


Added in version 3.6: @code{%G}, @code{%u} 및 @code{%V}가 추가되었습니다.



Added in version 3.12: @code{%:z} was added.


@node Technical detail,,strftime and strptime format codes,strftime and strptime behavior
@anchor{library/datetime technical-detail}@anchor{291c}
@subsubsection Technical detail


Broadly speaking, @code{d.strftime(fmt)} acts like the @ref{f4,,time} module’s
@code{time.strftime(fmt, d.timetuple())} although not all objects support a
@ref{28e2,,timetuple()} method.

For the @ref{1951,,datetime.strptime()} and @ref{1f9,,date.strptime()} class methods,
the default value is @code{1900-01-01T00:00:00.000}: any components not specified
in the format string will be pulled from the default value.

@cartouche
@quotation 참고 
Format strings without separators can be ambiguous for parsing. For
example, with @code{%Y%m%d}, the string @code{2026111} may be parsed either as
@code{2026-11-01} or as @code{2026-01-11}.
Use separators to ensure the input is parsed as intended.
@end quotation
@end cartouche

@cartouche
@quotation 참고 
When used to parse partial dates lacking a year, @ref{1951,,datetime.strptime()}
and @ref{1f9,,date.strptime()} will raise when encountering February 29 because
the default year of 1900 is `not' a leap year.  Always add a default leap
year to partial date strings before parsing.
@end quotation
@end cartouche

@c # doctest seems to turn the warning into an error which makes it
@c # show up and require matching and prevents the actual interesting
@c # exception from being raised.
@c # Manually apply the catch_warnings context manager
@c import warnings
@c catch_warnings = warnings.catch_warnings()
@c catch_warnings.__enter__()
@c warnings.simplefilter("ignore")

@c catch_warnings.__exit__()

@example
>>> import datetime as dt
>>> value = "2/29"
>>> dt.datetime.strptime(value, "%m/%d")
Traceback (most recent call last):
...
ValueError: day 29 must be in range 1..28 for month 2 in year 1900
>>> dt.datetime.strptime(f"1904 @{value@}", "%Y %m/%d")
datetime.datetime(1904, 2, 29, 0, 0)
@end example

@code{datetime.strptime(date_string, format)}은 다음과 동등합니다:

@example
datetime(*(time.strptime(date_string, format)[0:6]))
@end example

except when the format includes sub-second components or time zone offset
information, which are supported in @code{datetime.strptime} but are discarded by
@code{time.strptime}.

For @ref{1fb,,time} objects, the format codes for year, month, and day should not
be used, as @code{time} objects have no such values. If they’re used anyway,
1900 is substituted for the year, and 1 for the month and day.

For @ref{1fa,,date} objects, the format codes for hours, minutes, seconds, and
microseconds should not be used, as @code{date} objects have no such
values. If they’re used anyway, 0 is substituted for them.

같은 이유로, 현재 로케일의 문자 집합으로는 표현할 수 없는 유니코드 코드 포인트를 포함하는 포맷 문자열의 처리도 플랫폼에 따라 다릅니다. 일부 플랫폼에서는 이러한 코드 포인트가 그대로 출력에 보존되지만, 다른 곳에서는 @code{strftime}이 @ref{462,,UnicodeError}를 발생시키거나 대신 빈 문자열을 반환할 수 있습니다.

노트:


@enumerate 

@item 
Because the format depends on the current locale, care should be taken when
making assumptions about the output value. Field orderings will vary (for
example, “month/day/year” versus “day/month/year”), and the output may
contain non-ASCII characters.

@item 
The @ref{1951,,strptime()} method can parse years in the full [1, 9999] range, but
years < 1000 must be zero-filled to 4-digit width.


버전 3.2에서 변경: In previous versions, @ref{e8d,,strftime()} method was restricted to
years >= 1900.



버전 3.3에서 변경: In version 3.2, @ref{e8d,,strftime()} method was restricted to
years >= 1000.


@item 
When used with the @ref{1951,,strptime()} method, the @code{%p} directive only affects
the output hour field if the @code{%I} directive is used to parse the hour.

@item 
Unlike the @ref{f4,,time} module, the @code{datetime} module does not support
leap seconds.

@item 
When used with the @ref{1951,,strptime()} method, the @code{%f} directive
accepts from one to six digits and zero pads on the right. @code{%f} is
an extension to the set of format characters in the C standard (but
implemented separately in datetime objects, and therefore always
available).

@item 
For a naive object, the @code{%z}, @code{%:z} and @code{%Z} format codes are replaced
by empty strings.

어웨어 객체의 경우:


@table @asis

@item @code{%z}

@ref{28f5,,utcoffset()} is transformed into a string of the form
@code{±HHMM[SS[.ffffff]]}, where @code{HH} is a 2-digit string giving the number
of UTC offset hours, @code{MM} is a 2-digit string giving the number of UTC
offset minutes, @code{SS} is a 2-digit string giving the number of UTC offset
seconds and @code{ffffff} is a 6-digit string giving the number of UTC
offset microseconds. The @code{ffffff} part is omitted when the offset is a
whole number of seconds and both the @code{ffffff} and the @code{SS} part is
omitted when the offset is a whole number of minutes. For example, if
@code{utcoffset()} returns @code{timedelta(hours=-3, minutes=-30)}, @code{%z} is
replaced with the string @code{'-0330'}.
@end table


버전 3.7에서 변경: UTC 오프셋은 분 단위로 제한되지 않습니다.



버전 3.7에서 변경: When the @code{%z} directive is provided to the  @ref{1951,,strptime()} method,
the UTC offsets can have a colon as a separator between hours, minutes
and seconds.
For example, @code{'+01:00:00'} will be parsed as an offset of one hour.
In addition, providing @code{'Z'} is identical to @code{'+00:00'}.



@table @asis

@item @code{%:z}

Behaves exactly as @code{%z}, but has a colon separator added between
hours, minutes and seconds.

@item @code{%Z}

In @ref{e8d,,strftime()}, @code{%Z} is replaced by an empty string if
@ref{28f8,,tzname()} returns @code{None}; otherwise @code{%Z} is replaced by the
returned value, which must be a string.

@ref{1951,,strptime()} only accepts certain values for @code{%Z}:


@enumerate 

@item 
컴퓨터의 로케일에 대한 @code{time.tzname}의 모든 값

@item 
하드 코딩된 값 @code{UTC}와 @code{GMT}
@end enumerate

따라서 일본에 거주하는 사람은 @code{JST}, @code{UTC} 및 @code{GMT}를 유효한 값으로 가질 수 있지만, 아마도 @code{EST}는 아닙니다. 유효하지 않은 값에 대해서는 @code{ValueError}가 발생합니다.
@end table


버전 3.2에서 변경: When the @code{%z} directive is provided to the @ref{1951,,strptime()} method, an
aware @ref{4e2,,datetime} object will be produced. The @code{tzinfo} of the
result will be set to a @ref{12c4,,timezone} instance.


@item 
When used with the @ref{1951,,strptime()} method, @code{%U} and @code{%W} are only used
in calculations when the day of the week and the calendar year (@code{%Y})
are specified.

@item 
Similar to @code{%U} and @code{%W}, @code{%V} is only used in calculations when the
day of the week and the ISO year (@code{%G}) are specified in a
@ref{1951,,strptime()} format string. Also note that @code{%G} and @code{%Y} are not
interchangeable.

@item 
When used with the @ref{1951,,strptime()} method, the leading zero is optional
for  formats @code{%d}, @code{%m}, @code{%H}, @code{%I}, @code{%M}, @code{%S}, @code{%j}, @code{%U},
@code{%W}, and @code{%V}. Format @code{%y} does require a leading zero.

@item 
When parsing a month and day using @ref{1951,,strptime()}, always
include a year in the format.  If the value you need to parse lacks a year,
append an explicit dummy leap year.  Otherwise your code will raise an
exception when it encounters leap day because the default year used by the
parser (1900) is not a leap year.  Users run into that bug every leap year.

@example
>>> month_day = "02/29"
>>> dt.datetime.strptime(f"@{month_day@};1984", "%m/%d;%Y")  # No leap year bug.
datetime.datetime(1984, 2, 29, 0, 0)
@end example


Deprecated since version 3.13, will be removed in version 3.15: @ref{1951,,strptime()} calls using a format string containing
a day of month without a year now emit a
@ref{1a3,,DeprecationWarning}. In 3.15 or later we may change this into
an error or change the default year to a leap year. See gh-70647@footnote{https://github.com/python/cpython/issues/70647}.

@end enumerate

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node zoneinfo — IANA 시간대 지원,calendar — 일반 달력 관련 함수,datetime — Basic date and time types,데이터형
@anchor{library/zoneinfo doc}@anchor{291d}@anchor{library/zoneinfo module-zoneinfo}@anchor{13a}@anchor{library/zoneinfo translation-repo}@anchor{291e}@anchor{library/zoneinfo zoneinfo-iana-time-zone-support}@anchor{291f}
@subsection @code{zoneinfo} — IANA 시간대 지원


@geindex module; zoneinfo


Added in version 3.9.


`소스 코드:' Lib/zoneinfo@footnote{https://github.com/python/cpython/tree/3.14/Lib/zoneinfo}


__________________________________________________________________


The @code{zoneinfo} module provides a concrete time zone implementation to
support the IANA time zone database as originally specified in 
@geindex Python 향상 제안; PEP 615
PEP 615@footnote{https://peps.python.org/pep-0615/}. By
default, @code{zoneinfo} uses the system’s time zone data if available; if no
system time zone data is available, the library will fall back to using the
first-party tzdata@footnote{https://pypi.org/project/tzdata/} package available on PyPI.


@subsubheading 더 보기



@table @asis

@item 모듈: @ref{34,,datetime}

@ref{adc,,ZoneInfo} 클래스가 사용되도록 설계된 @ref{1fb,,time}과 @ref{4e2,,datetime} 형을 제공합니다.

@item 패키지 tzdata@footnote{https://pypi.org/project/tzdata/}

PyPI를 통해 시간대 데이터를 제공하기 위해 CPython 핵심 개발자가 유지 보수하는 자사(first-party) 패키지.
@end table


@c include for modules that don't work on WASM

@ref{213c,,가용성}: not WASI.

이 모듈은 웹어셈블리에서 작동하지 않거나 제공되지 않습니다. 자세한 내용은 @ref{1b68,,웹어셈블리 플랫폼}을 참조하세요.

@menu
* ZoneInfo 사용하기:: 
* 데이터 소스:: 
* ZoneInfo 클래스:: 
* 함수: 함수<2>. 
* 전역:: 
* 예외와 경고:: 

@end menu

@node ZoneInfo 사용하기,데이터 소스,,zoneinfo — IANA 시간대 지원
@anchor{library/zoneinfo using-zoneinfo}@anchor{2920}
@subsubsection @code{ZoneInfo} 사용하기


@ref{adc,,ZoneInfo}는 @ref{7f5,,datetime.tzinfo} 추상 베이스 클래스의 구상 구현이며, 생성자, @ref{16d0,,datetime.replace} 메서드 또는 @ref{bc3,,datetime.astimezone}을 통해 @code{tzinfo}에 연결하려는 것입니다:

@example
>>> from zoneinfo import ZoneInfo
>>> import datetime as dt

>>> when = dt.datetime(2020, 10, 31, 12, tzinfo=ZoneInfo("America/Los_Angeles"))
>>> print(when)
2020-10-31 12:00:00-07:00

>>> when.tzname()
'PDT'
@end example

이 방식으로 구성된 datetime들은 datetime 산술과 호환되며 추가 개입 없이 일광 절약 시간제 전환을 처리합니다:

@example
>>> when_add = when + dt.timedelta(days=1)

>>> print(when_add)
2020-11-01 12:00:00-08:00

>>> when_add.tzname()
'PST'
@end example

이 시간대는 
@geindex Python 향상 제안; PEP 495
PEP 495@footnote{https://peps.python.org/pep-0495/}에 도입된 @ref{e50,,fold} 어트리뷰트도 지원합니다. 모호한 시간을 유발하는 오프셋 전환(가령 일광 절약 시간에서 표준 시간으로의 전환) 중, 전환 `전'의 오프셋이 @code{fold=0}일 때 사용되며, 전환 `후'의 오프셋은 @code{fold=1}일 때 사용됩니다, 예를 들어:

@example
>>> when = dt.datetime(2020, 11, 1, 1, tzinfo=ZoneInfo("America/Los_Angeles"))
>>> print(when)
2020-11-01 01:00:00-07:00

>>> print(when.replace(fold=1))
2020-11-01 01:00:00-08:00
@end example

다른 시간대에서 변환할 때, fold는 올바른 값으로 설정됩니다:

@example
>>> LOS_ANGELES = ZoneInfo("America/Los_Angeles")
>>> when_utc = dt.datetime(2020, 11, 1, 8, tzinfo=dt.timezone.utc)

>>> # Before the PDT -> PST transition
>>> print(when_utc.astimezone(LOS_ANGELES))
2020-11-01 01:00:00-07:00

>>> # After the PDT -> PST transition
>>> print((when_utc + dt.timedelta(hours=1)).astimezone(LOS_ANGELES))
2020-11-01 01:00:00-08:00
@end example

@node 데이터 소스,ZoneInfo 클래스,ZoneInfo 사용하기,zoneinfo — IANA 시간대 지원
@anchor{library/zoneinfo data-sources}@anchor{2921}
@subsubsection 데이터 소스


@code{zoneinfo} 모듈은 시간대 데이터를 직접 제공하지 않고, 시스템 시간대 데이터베이스나 자사(first-party) PyPI 패키지 tzdata@footnote{https://pypi.org/project/tzdata/}(있다면)에서 시간대 정보를 가져옵니다. 특히 윈도우 시스템을 포함한 일부 시스템에는 사용 가능한 IANA 데이터베이스가 없어서, 시간대 데이터가 필요한 플랫폼 간 호환성을 목표로 하는 프로젝트는 tzdata에 대한 종속성을 선언하는 것이 좋습니다. 시스템 데이터나 tzdata를 모두 사용할 수 없으면, @ref{adc,,ZoneInfo}에 대한 모든 호출은 @ref{1819,,ZoneInfoNotFoundError}를 발생시킵니다.

@menu
* 데이터 소스 구성:: 

@end menu

@node 데이터 소스 구성,,,데이터 소스
@anchor{library/zoneinfo configuring-the-data-sources}@anchor{2922}@anchor{library/zoneinfo zoneinfo-data-configuration}@anchor{2923}
@subsubsection 데이터 소스 구성


@code{ZoneInfo(key)}가 호출될 때, 생성자는 먼저 @ref{2163,,TZPATH}에 지정된 디렉터리에서 @code{key}와 일치하는 파일을 검색하고, 실패하면 tzdata 패키지에서 일치하는 것을 찾습니다. 이 동작은 세 가지 방법으로 구성할 수 있습니다:


@enumerate 

@item 
달리 지정되지 않을 때의 기본 @ref{2163,,TZPATH}는 @ref{2164,,컴파일 시간}에 구성할 수 있습니다.

@item 
@ref{2163,,TZPATH}는 @ref{2924,,환경 변수}를 사용하여 구성할 수 있습니다.

@item 
@ref{2925,,실행 시간}에는, @ref{17c6,,reset_tzpath()} 함수를 사용하여 검색 경로를 조작할 수 있습니다.
@end enumerate

@menu
* 컴파일 시간 구성:: 
* 환경 구성:: 
* 실행 시간 구성:: 

@end menu

@node 컴파일 시간 구성,환경 구성,,데이터 소스 구성
@anchor{library/zoneinfo compile-time-configuration}@anchor{2926}@anchor{library/zoneinfo zoneinfo-data-compile-time-config}@anchor{2164}
@subsubsection 컴파일 시간 구성


기본 @ref{2163,,TZPATH}에는 시간대 데이터베이스에 대한 몇 가지 일반적인 배포 위치가 포함되어 있습니다 (윈도우는 예외인데, 시간대 데이터에 대한 “잘 알려진” 위치가 없습니다). POSIX 시스템에서, 시스템 시간대 데이터가 배치된 위치를 알고 있는 다운 스트림 배포자와 소스에서 파이썬을 빌드하는 사람은 컴파일 시간 옵션 @code{TZPATH}(또는, 더 가능성 있는, @ref{2162,,configure flag --with-tzpath})를 지정하여 기본 시간대 경로를 변경할 수 있습니다. @ref{2131,,os.pathsep}으로 구분된 문자열이어야 합니다.

모든 플랫폼에서, 구성된 값은 @ref{174,,sysconfig.get_config_var()}에서 @code{TZPATH} 키로 사용 가능합니다.

@node 환경 구성,실행 시간 구성,컴파일 시간 구성,데이터 소스 구성
@anchor{library/zoneinfo environment-configuration}@anchor{2927}@anchor{library/zoneinfo zoneinfo-data-environment-var}@anchor{2924}
@subsubsection 환경 구성


@ref{2163,,TZPATH}를 초기화할 때 (임포트 시점이나 인자 없이 @ref{17c6,,reset_tzpath()}가 호출될 때마다) @code{zoneinfo} 모듈은 환경 변수 @code{PYTHONTZPATH}(있다면)를 사용하여 검색 경로를 설정합니다.

@geindex 환경 변수; PYTHONTZPATH
@anchor{library/zoneinfo envvar-PYTHONTZPATH}@anchor{2928}
@deffn {환경 변수} PYTHONTZPATH

사용할 시간대 검색 경로를 포함하는 @ref{2131,,os.pathsep}으로 구분된 문자열입니다. 상대 경로가 아닌 절대 경로로만 구성되어야 합니다. @code{PYTHONTZPATH}에 지정된 상대 컴포넌트는 사용되지 않지만, 그 밖의 상대 경로가 지정된 경우의 동작은 구현이 정의합니다; CPython은 @ref{2929,,InvalidTZPathWarning}을 발생시키지만, 다른 구현에서는 잘못된 구성 요소를 조용히 무시하거나 예외를 발생시킬 수 있습니다.
@end deffn

시스템이 시스템 데이터를 무시하고 tzdata 패키지를 대신 사용하도록 설정하려면, @code{PYTHONTZPATH=""}를 설정하십시오.

@node 실행 시간 구성,,환경 구성,데이터 소스 구성
@anchor{library/zoneinfo runtime-configuration}@anchor{292a}@anchor{library/zoneinfo zoneinfo-data-runtime-config}@anchor{2925}
@subsubsection 실행 시간 구성


@ref{17c6,,reset_tzpath()} 함수를 사용하여 실행 시간에 TZ 검색 경로를 구성할 수도 있습니다. 일반적으로 권장되는 작업은 아닙니다만, 특정 시간대 경로를 사용해야 하는 (또는 시스템 시간대에 대한 액세스를 비활성화해야 하는) 테스트 함수에 사용하는 것은 합리적입니다.

@node ZoneInfo 클래스,함수<2>,데이터 소스,zoneinfo — IANA 시간대 지원
@anchor{library/zoneinfo the-zoneinfo-class}@anchor{292b}
@subsubsection @code{ZoneInfo} 클래스


@geindex ZoneInfo (zoneinfo 클래스)
@anchor{library/zoneinfo zoneinfo ZoneInfo}@anchor{adc}
@deffn {클래스} zoneinfo.ZoneInfo (key)

문자열 @code{key}로 지정된 IANA 시간대를 나타내는 구상 @ref{7f5,,datetime.tzinfo} 서브 클래스. 기본 생성자에 대한 호출은 항상 동일하다고 비교되는 객체를 반환합니다; 다르게 말하면, @ref{176a,,ZoneInfo.clear_cache()}를 통한 캐시 무효화를 방지한다면, 다음 어서션이 항상 참입니다:

@example
a = ZoneInfo(key)
b = ZoneInfo(key)
assert a is b
@end example

@code{key}는 상위 수준 참조가 없는 상대적인 정규화된 POSIX 경로의 형식이어야 합니다. 적합하지 않은 key가 전달되면 생성자가 @ref{2ec,,ValueError}를 발생시킵니다.

@code{key}와 일치하는 파일이 없으면, 생성자는 @ref{1819,,ZoneInfoNotFoundError}를 발생시킵니다.
@end deffn

@code{ZoneInfo} 클래스에는 두 개의 대체 생성자가 있습니다:

@geindex from_file() (zoneinfo.ZoneInfo의 클래스 메서드)
@anchor{library/zoneinfo zoneinfo ZoneInfo from_file}@anchor{1783}
@deffn {메서드} classmethod ZoneInfo.from_file (file_obj, /, key=None)

바이트열을 반환하는 파일류 객체(예를 들어 바이너리 모드로 열린 파일이나 @ref{10a3,,io.BytesIO} 객체)에서 @code{ZoneInfo} 객체를 생성합니다. 기본 생성자와 달리, 항상 새로운 객체를 생성합니다.

@code{key} 매개 변수는 @ref{82f,,__str__()}과 @ref{82e,,__repr__()}를 위해 시간대 이름을 설정합니다.

이 생성자를 통해 만들어진 객체는 피클 할 수 없습니다 (@ref{292c,,피클 직렬화}를 참조하십시오).

@ref{2ec,,ValueError} is raised if the data read from `file_obj' is not a valid
TZif file.
@end deffn

@geindex no_cache() (zoneinfo.ZoneInfo의 클래스 메서드)
@anchor{library/zoneinfo zoneinfo ZoneInfo no_cache}@anchor{292d}
@deffn {메서드} classmethod ZoneInfo.no_cache (key)

생성자의 캐시를 우회하는 대체 생성자. 기본 생성자와 동일하지만, 호출마다 새 객체를 반환합니다. 이것은 테스트나 데모 목적으로 유용 할 수 있지만, 다른 캐시 무효화 전략을 갖는 시스템을 만드는 데 사용될 수도 있습니다.

이 생성자를 통해 만들어진 객체는 역 피클 될 때 역 직렬화 프로세스의 캐시도 우회합니다.

@c TODO: Add "See `cache_behavior`_" reference when that section is ready.

@cartouche
@quotation 조심 
이 생성자를 사용하면 예기치 못한 방식으로 날짜 시간의 의미가 변경될 수 있기 때문에, 필요한 경우에만 사용하십시오.
@end quotation
@end cartouche
@end deffn

다음과 같은 클래스 메서드도 사용할 수 있습니다:

@geindex clear_cache() (zoneinfo.ZoneInfo의 클래스 메서드)
@anchor{library/zoneinfo zoneinfo ZoneInfo clear_cache}@anchor{176a}
@deffn {메서드} classmethod ZoneInfo.clear_cache (*, only_keys=None)

@code{ZoneInfo} 클래스에서 캐시를 무효로 하는 메서드. 인자가 전달되지 않으면, 모든 캐시가 무효가 되고 각 키의 기본 생성자에 대한 다음 호출은 새 인스턴스를 반환합니다.

키 이름의 이터러블이 @code{only_keys} 매개 변수에 전달되면, 지정된 키만 캐시에서 제거됩니다. @code{only_keys}에 전달되었지만, 캐시에서 찾을 수 없는 키는 무시됩니다.

@c TODO: Add "See `cache_behavior`_" reference when that section is ready.

@cartouche
@quotation 경고 
이 함수를 호출하면 예기치 못한 방식으로 @code{ZoneInfo}를 사용하는 날짜 시간의 의미를 변경할 수 있습니다; 이는 모듈 상태를 수정하므로 광범위한 영향을 미칠 수 있습니다. 필요한 경우에만 사용하십시오.
@end quotation
@end cartouche
@end deffn

이 클래스에는 하나의 어트리뷰트가 있습니다:

@geindex key (zoneinfo.ZoneInfo의 속성)
@anchor{library/zoneinfo zoneinfo ZoneInfo key}@anchor{292e}
@deffn {속성} ZoneInfo.key

이것은 읽기 전용 @ref{292f,,어트리뷰트}이며 생성자에 전달된 @code{key}의 값을 반환하는데, IANA 시간대 데이터베이스의 조회 키이어야 합니다 (예를 들어 @code{America/New_York}, @code{Europe/Paris} 또는 @code{Asia/Tokyo}).

@code{key} 매개 변수를 지정하지 않고 파일에서 생성된 시간대의 경우, @code{None}으로 설정됩니다.

@cartouche
@quotation 참고 
이들을 최종 사용자에게 노출하는 것이 다소 일반적인 관행이지만, 이 값들은 관련 시간대를 나타내는 기본 키로 설계되었을 뿐, 사용자 대면 요소일 필요는 없습니다. CLDR (the Unicode Common Locale Data Repository)과 같은 프로젝트를 사용하면 이러한 키에서 더 사용자 친화적인 문자열을 얻을 수 있습니다.
@end quotation
@end cartouche
@end deffn

@menu
* 문자열 표현:: 
* 피클 직렬화:: 

@end menu

@node 문자열 표현,피클 직렬화,,ZoneInfo 클래스
@anchor{library/zoneinfo string-representations}@anchor{2930}
@subsubsection 문자열 표현


@ref{adc,,ZoneInfo} 객체에 대해 @ref{169,,str}을 호출할 때 반환되는 문자열 표현은 기본적으로 @ref{292e,,ZoneInfo.key} 어트리뷰트를 사용합니다 (어트리뷰트 설명서의 사용법에 관한 참고를 보십시오):

@example
>>> zone = ZoneInfo("Pacific/Kwajalein")
>>> str(zone)
'Pacific/Kwajalein'

>>> when = dt.datetime(2020, 4, 1, 3, 15, tzinfo=zone)
>>> f"@{when.isoformat()@} [@{when.tzinfo@}]"
'2020-04-01T03:15:00+12:00 [Pacific/Kwajalein]'
@end example

@code{key} 매개 변수를 지정하지 않고 파일에서 생성된 객체의 경우, @code{str}은 @ref{1c1,,repr()} 호출로 대체됩니다. @code{ZoneInfo}의 @code{repr}은 구현 정의이며 버전 간에 반드시 안정적일 필요는 없지만, 유효한 @code{ZoneInfo} 키가 될 수는 없음이 보장됩니다.

@node 피클 직렬화,,문자열 표현,ZoneInfo 클래스
@anchor{library/zoneinfo pickle-serialization}@anchor{2931}@anchor{library/zoneinfo pickling}@anchor{292c}
@subsubsection 피클 직렬화


모든 전환 데이터를 직렬화하는 대신, @code{ZoneInfo} 객체는 키로 직렬화되며 파일에서 생성된 @code{ZoneInfo} 객체는 (지정된 @code{key} 값을 가진 객체조차) 피클 할 수 없습니다.

@code{ZoneInfo} 파일의 동작은 파일 생성 방식에 따라 다릅니다:


@enumerate 

@item 
@code{ZoneInfo(key)}: When constructed with the primary constructor, a
@code{ZoneInfo} object is serialized by key, and when deserialized, the
deserializing process uses the primary and thus it is expected that these
are the same object as other references to the same time
zone.  For example, if @code{europe_berlin_pkl} is a string containing a pickle
constructed from @code{ZoneInfo("Europe/Berlin")}, one would expect the
following behavior:

@example
>>> a = ZoneInfo("Europe/Berlin")
>>> b = pickle.loads(europe_berlin_pkl)
>>> a is b
True
@end example

@item 
@code{ZoneInfo.no_cache(key)}: 캐시 우회 생성자에서 생성될 때, 이 @code{ZoneInfo} 객체도 키로 직렬화되지만, 역 직렬화할 때, 역 직렬화 프로세스는 캐시 우회 생성자를 사용합니다. @code{europe_berlin_pkl_nc}가 @code{ZoneInfo.no_cache("Europe/Berlin")}에서 생성된 피클을 포함하는 문자열이면, 다음과 같은 동작이 예상됩니다:

@example
>>> a = ZoneInfo("Europe/Berlin")
>>> b = pickle.loads(europe_berlin_pkl_nc)
>>> a is b
False
@end example

@item 
@code{ZoneInfo.from_file(file_obj, /, key=None)}: When constructed from a file, the
@code{ZoneInfo} object raises an exception on pickling. If an end user wants to
pickle a @code{ZoneInfo} constructed from a file, it is recommended that they
use a wrapper type or a custom serialization function: either serializing by
key or storing the contents of the file object and serializing that.
@end enumerate

이 직렬화 방법에서는 직렬화와 역 직렬화 환경 모두에서 클래스와 함수에 대한 참조가 존재해야 하는 방식과 유사하게, 직렬화와 역 직렬화 측 모두에서 필요한 키의 시간대 데이터를 사용할 수 있어야 합니다. 또한 다른 버전의 시간대 데이터가 있는 환경에서 피클링 된 @code{ZoneInfo}를 역 피클링 할 때 결과의 일관성에 대해 보장되지 않습니다.

@node 함수<2>,전역,ZoneInfo 클래스,zoneinfo — IANA 시간대 지원
@anchor{library/zoneinfo functions}@anchor{2932}
@subsubsection 함수


@geindex available_timezones() (zoneinfo 모듈)
@anchor{library/zoneinfo zoneinfo available_timezones}@anchor{1d45}
@deffn {함수} zoneinfo.available_timezones ()

시간대 경로의 어느 곳에서건 사용 가능한 IANA 시간대에 유효한 모든 키가 포함된 집합을 가져옵니다. 이것은 함수를 호출할 때마다 다시 계산됩니다.

이 함수는 규범적(canonical) 시간대 이름 만 포함하고 @code{posix/}와 @code{right/} 디렉터리에 있는 것이나 @code{posixrules} 시간대와 같은 “특수” 시간대는 포함하지 않습니다.

@cartouche
@quotation 조심 
시간대 경로에 있는 파일이 유효한 시간대인지 확인하는 가장 좋은 방법은 시작 부분에 나오는 “매직 문자열”을 읽는 것이라서, 이 함수는 많은 파일을 열 수 있습니다.
@end quotation
@end cartouche

@cartouche
@quotation 참고 
이 값은 최종 사용자에게 노출되도록 설계되지 않았습니다; 사용자 대면 요소의 경우, 응용 프로그램은 CLDR (the Unicode Common Locale Data Repository)과 같은 것을 사용하여 더 사용자 친화적인 문자열을 가져와야 합니다. @ref{292e,,ZoneInfo.key}에 있는 주의 사항도 참조하십시오.
@end quotation
@end cartouche
@end deffn

@geindex reset_tzpath() (zoneinfo 모듈)
@anchor{library/zoneinfo zoneinfo reset_tzpath}@anchor{17c6}
@deffn {함수} zoneinfo.reset_tzpath (to=None)

모듈의 시간대 검색 경로(@ref{2163,,TZPATH})를 설정하거나 재설정합니다. 인자 없이 호출하면, @code{TZPATH}가 기본값으로 설정됩니다.

@code{reset_tzpath}를 호출해도 @ref{adc,,ZoneInfo} 캐시가 무효가 되지 않아서, 기본 @code{ZoneInfo} 생성자에 대한 호출은 캐시 누락의 경우에만 새 @code{TZPATH}를 사용합니다.

@code{to} 매개 변수는 문자열이나 @ref{e4a,,os.PathLike}의 @ref{715,,시퀀스}이어야 하며 문자열이 아닙니다. 모두 절대 경로여야 합니다. 절대 경로 이외의 것이 전달되면 @ref{2ec,,ValueError}가 발생합니다.
@end deffn

@node 전역,예외와 경고,함수<2>,zoneinfo — IANA 시간대 지원
@anchor{library/zoneinfo globals}@anchor{2933}
@subsubsection 전역


@geindex TZPATH (zoneinfo 모듈)
@anchor{library/zoneinfo zoneinfo TZPATH}@anchor{2163}
@deffn {데이터} zoneinfo.TZPATH

시간대 검색 경로를 나타내는 읽기 전용 시퀀스 – 키에서 @code{ZoneInfo}를 생성할 때, 키는 @code{TZPATH}의 각 항목에 결합하며, 발견된 첫 번째 파일이 사용됩니다.

@code{TZPATH}는 구성 방법과 관계없이 절대 경로만 포함할 수 있고, 상대 경로는 절대 포함하지 않습니다.

@code{zoneinfo.TZPATH}가 가리키는 객체는 @ref{17c6,,reset_tzpath()}에 대한 호출에 따라 변경될 수 있어서, @code{zoneinfo}에서 @code{TZPATH}를 임포트 하거나 수명이 긴 변수에 @code{zoneinfo.TZPATH}를 대입하는 대신 @code{zoneinfo.TZPATH}를 사용하는 것이 좋습니다.

시간대 검색 경로 구성에 대한 자세한 정보는 @ref{2923,,데이터 소스 구성}을 참조하십시오.
@end deffn

@node 예외와 경고,,전역,zoneinfo — IANA 시간대 지원
@anchor{library/zoneinfo exceptions-and-warnings}@anchor{2934}
@subsubsection 예외와 경고


@geindex ZoneInfoNotFoundError
@anchor{library/zoneinfo zoneinfo ZoneInfoNotFoundError}@anchor{1819}
@deffn {예외} zoneinfo.ZoneInfoNotFoundError

지정된 키를 시스템에서 찾을 수 없어서 @ref{adc,,ZoneInfo} 객체 생성에 실패할 때 발생합니다. 이것은 @ref{5e5,,KeyError}의 서브 클래스입니다.
@end deffn

@geindex InvalidTZPathWarning
@anchor{library/zoneinfo zoneinfo InvalidTZPathWarning}@anchor{2929}
@deffn {예외} zoneinfo.InvalidTZPathWarning

@geindex PYTHONTZPATH
@geindex 환경 변수; PYTHONTZPATH
@ref{2928,,PYTHONTZPATH}에 상대 경로와 같이 필터링 될 유효하지 않은 구성 요소가 포함되어있을 때 발생합니다.
@end deffn

@c Links and references:

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node calendar — 일반 달력 관련 함수,collections — 컨테이너 데이터형,zoneinfo — IANA 시간대 지원,데이터형
@anchor{library/calendar doc}@anchor{2935}@anchor{library/calendar calendar-general-calendar-related-functions}@anchor{2936}@anchor{library/calendar module-calendar}@anchor{15}@anchor{library/calendar translation-repo}@anchor{2937}
@subsection @code{calendar} — 일반 달력 관련 함수


@geindex module; calendar

`소스 코드:' Lib/calendar.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/calendar.py}


__________________________________________________________________


이 모듈을 사용하면 유닉스 @code{cal} 프로그램과 같은 달력을 출력할 수 있으며, 달력과 관련된 유용한 추가 함수를 제공합니다. 기본적으로, 이 달력은 월요일을 주의 첫째 날로 하고, 일요일을 마지막 날로 합니다 (유럽 관례). 주의 첫째 날을 일요일(6)이나 다른 요일로 설정하려면 @ref{2938,,setfirstweekday()}를 사용하십시오. 날짜를 지정하는 매개 변수는 정수로 제공됩니다. 관련 기능에 대해서는, @ref{34,,datetime}과 @ref{f4,,time} 모듈도 참조하십시오.

이 모듈에 정의된 함수와 클래스는 이상적인 달력을 사용합니다, 양방향으로 무한정 확장된 현재 그레고리력. 이것은 Dershowitz와 Reingold의 저서 “Calendrical Calculations”에 나오는 “역산 그레고리(proleptic Gregorian)” 달력의 정의와 일치하며, 모든 계산의 기본 달력입니다. 0과 음의 연도는 ISO 8601 표준에 규정된 대로 해석됩니다. 0년은 BC 1년, -1년은 BC 2년 등입니다.

@geindex Calendar (calendar 클래스)
@anchor{library/calendar calendar Calendar}@anchor{2939}
@deffn {클래스} calendar.Calendar (firstweekday=0)

@ref{2939,,Calendar} 객체를 만듭니다. `firstweekday'는 주의 첫 번째 날을 지정하는 정수입니다. @ref{293a,,MONDAY}는 @code{0}(기본값)이고, @ref{293b,,SUNDAY}는 @code{6}입니다.

@ref{2939,,Calendar} 객체는 포매팅을 위해 달력 데이터를 준비하는 데 사용할 수 있는 몇 가지 메서드를 제공합니다. 이 클래스는 스스로 포매팅을 수행하지 않습니다. 이는 서브 클래스의 역할입니다.

@ref{2939,,Calendar} 인스턴스에는 다음과 같은 메서드와 어트리뷰트가 있습니다:

@geindex firstweekday (calendar.Calendar의 속성)
@anchor{library/calendar calendar Calendar firstweekday}@anchor{293c}
@deffn {속성} firstweekday

The first weekday as an integer (0–6).

This property can also be set and read using
@ref{293d,,setfirstweekday()} and
@ref{293e,,getfirstweekday()} respectively.
@end deffn

@geindex getfirstweekday() (calendar.Calendar 메서드)
@anchor{library/calendar calendar Calendar getfirstweekday}@anchor{293e}
@deffn {메서드} getfirstweekday ()

Return an @ref{19b,,int} for the current first weekday (0–6).

Identical to reading the @ref{293c,,firstweekday} property.
@end deffn

@geindex setfirstweekday() (calendar.Calendar 메서드)
@anchor{library/calendar calendar Calendar setfirstweekday}@anchor{293d}
@deffn {메서드} setfirstweekday (firstweekday)

Set the first weekday to `firstweekday', passed as an @ref{19b,,int} (0–6)

Identical to setting the @ref{293c,,firstweekday} property.
@end deffn

@geindex iterweekdays() (calendar.Calendar 메서드)
@anchor{library/calendar calendar Calendar iterweekdays}@anchor{293f}
@deffn {메서드} iterweekdays ()

한 주 동안 사용될 요일 번호의 이터레이터를 반환합니다. 이터레이터의 첫 번째 값은 @ref{293c,,firstweekday} 프로퍼티 값과 같습니다.
@end deffn

@geindex itermonthdates() (calendar.Calendar 메서드)
@anchor{library/calendar calendar Calendar itermonthdates}@anchor{e12}
@deffn {메서드} itermonthdates (year, month)

`year' 연도의 `month' 월 (1–12) 동안의 이터레이터를 반환합니다. 이 이터레이터는 해당 월의 모든 날(@ref{1fa,,datetime.date} 객체로)과 완전한 주를 얻기 위해 필요한 해당 월의 시작일 전이나 해당 월의 종료일 이후의 모든 날을 반환합니다.
@end deffn

@geindex itermonthdays() (calendar.Calendar 메서드)
@anchor{library/calendar calendar Calendar itermonthdays}@anchor{2940}
@deffn {메서드} itermonthdays (year, month)

@ref{e12,,itermonthdates()}와 유사하게 `year' 연도의 `month' 월 동안의 이터레이터를 반환하지만, @ref{1fa,,datetime.date} 범위로 제한되지 않습니다. 반환된 날은 단순히 월 중 날 번호입니다. 지정된 월 바깥에 있는 날의 경우, 날 번호는 @code{0}입니다.
@end deffn

@geindex itermonthdays2() (calendar.Calendar 메서드)
@anchor{library/calendar calendar Calendar itermonthdays2}@anchor{2941}
@deffn {메서드} itermonthdays2 (year, month)

@ref{e12,,itermonthdates()}와 유사하게 `year' 연도의 `month' 월 동안의 이터레이터를 반환하지만, @ref{1fa,,datetime.date} 범위로 제한되지 않습니다. 반환된 날은 월 중 날 번호와 요일 번호로 구성된 튜플입니다.
@end deffn

@geindex itermonthdays3() (calendar.Calendar 메서드)
@anchor{library/calendar calendar Calendar itermonthdays3}@anchor{e13}
@deffn {메서드} itermonthdays3 (year, month)

@ref{e12,,itermonthdates()}와 유사하게 `year' 연도의 `month' 월 동안의 이터레이터를 반환하지만, @ref{1fa,,datetime.date} 범위로 제한되지 않습니다. 반환된 날은 연도, 월 및 월 중 날 번호로 구성된 튜플입니다.


Added in version 3.7.

@end deffn

@geindex itermonthdays4() (calendar.Calendar 메서드)
@anchor{library/calendar calendar Calendar itermonthdays4}@anchor{e14}
@deffn {메서드} itermonthdays4 (year, month)

@ref{e12,,itermonthdates()}와 유사하게 `year' 연도의 `month' 월 동안의 이터레이터를 반환하지만, @ref{1fa,,datetime.date} 범위로 제한되지 않습니다. 반환된 날은 연도, 월, 월 중 날 및 요일 번호로 구성된 튜플입니다.


Added in version 3.7.

@end deffn

@geindex monthdatescalendar() (calendar.Calendar 메서드)
@anchor{library/calendar calendar Calendar monthdatescalendar}@anchor{2942}
@deffn {메서드} monthdatescalendar (year, month)

`year'의 `month' 월에 있는 주의 리스트를 전체 주로 반환합니다. 주는 7개의 @ref{1fa,,datetime.date} 객체 리스트입니다.
@end deffn

@geindex monthdays2calendar() (calendar.Calendar 메서드)
@anchor{library/calendar calendar Calendar monthdays2calendar}@anchor{2943}
@deffn {메서드} monthdays2calendar (year, month)

`year'의 `month' 월에 있는 주의 리스트를 전체 주로 반환합니다. 주는 날 번호와 요일 번호 튜플 7개의 리스트입니다.
@end deffn

@geindex monthdayscalendar() (calendar.Calendar 메서드)
@anchor{library/calendar calendar Calendar monthdayscalendar}@anchor{2944}
@deffn {메서드} monthdayscalendar (year, month)

`year'의 `month' 월에 있는 주의 리스트를 전체 주로 반환합니다. 주는 날 번호 7개의 리스트입니다.
@end deffn

@geindex yeardatescalendar() (calendar.Calendar 메서드)
@anchor{library/calendar calendar Calendar yeardatescalendar}@anchor{2945}
@deffn {메서드} yeardatescalendar (year, width=3)

포매팅 준비된 지정된 연도의 데이터를 반환합니다. 반환 값은 월 행의 리스트입니다. 각 월 행에는 최대 `width' 월(기본값은 3)이 포함됩니다. 각 월은 4–6주를 포함하고, 각 주는 1–7일을 포함합니다. 날은 @ref{1fa,,datetime.date} 객체입니다.
@end deffn

@geindex yeardays2calendar() (calendar.Calendar 메서드)
@anchor{library/calendar calendar Calendar yeardays2calendar}@anchor{2946}
@deffn {메서드} yeardays2calendar (year, width=3)

포매팅 준비된 지정된 연도의 데이터를 반환합니다 (@ref{2945,,yeardatescalendar()}와 유사합니다). 주 리스트의 항목은 날 번호와 요일 번호의 튜플입니다. 이달 밖의 날 번호는 0입니다.
@end deffn

@geindex yeardayscalendar() (calendar.Calendar 메서드)
@anchor{library/calendar calendar Calendar yeardayscalendar}@anchor{2947}
@deffn {메서드} yeardayscalendar (year, width=3)

포매팅 준비된 지정된 연도의 데이터를 반환합니다 (@ref{2945,,yeardatescalendar()}와 유사합니다). 주 리스트의 항목은 날 번호입니다. 이달 밖의 날 번호는 0입니다.
@end deffn
@end deffn

@geindex TextCalendar (calendar 클래스)
@anchor{library/calendar calendar TextCalendar}@anchor{18ac}
@deffn {클래스} calendar.TextCalendar (firstweekday=0)

이 클래스는 평문 텍스트 달력을 생성하는 데 사용할 수 있습니다.

@ref{18ac,,TextCalendar} 인스턴스에는 다음과 같은 메서드가 있습니다:

@geindex formatday() (calendar.TextCalendar 메서드)
@anchor{library/calendar calendar TextCalendar formatday}@anchor{2948}
@deffn {메서드} formatday (theday, weekday, width)

Return a string representing a single day formatted with the given `width'.
If `theday' is @code{0}, return a string of spaces of
the specified width, representing an empty day. The `weekday' parameter
is unused.
@end deffn

@geindex formatweek() (calendar.TextCalendar 메서드)
@anchor{library/calendar calendar TextCalendar formatweek}@anchor{2949}
@deffn {메서드} formatweek (theweek, w=0)

한 주를 줄 넘김이 없는 문자열로 반환합니다. `w'가 제공되면, 가운데 정렬되는 날짜 열의 너비를 지정합니다. 생성자에 지정되거나 @ref{2938,,setfirstweekday()} 메서드로 설정된 첫 번째 요일에 따라 다릅니다.
@end deffn

@geindex formatweekday() (calendar.TextCalendar 메서드)
@anchor{library/calendar calendar TextCalendar formatweekday}@anchor{294a}
@deffn {메서드} formatweekday (weekday, width)

Return a string representing the name of a single weekday formatted to
the specified `width'. The `weekday' parameter is an integer representing
the day of the week, where @code{0} is Monday and @code{6} is Sunday.
@end deffn

@geindex formatweekheader() (calendar.TextCalendar 메서드)
@anchor{library/calendar calendar TextCalendar formatweekheader}@anchor{294b}
@deffn {메서드} formatweekheader (width)

Return a string containing the header row of weekday names, formatted
with the given `width' for each column. The names depend on the locale
settings and are padded to the specified width.
@end deffn

@geindex formatmonth() (calendar.TextCalendar 메서드)
@anchor{library/calendar calendar TextCalendar formatmonth}@anchor{294c}
@deffn {메서드} formatmonth (theyear, themonth, w=0, l=0)

월의 달력을 여러 줄 문자열로 반환합니다. `w'가 제공되면, 가운데 정렬되는 날짜 열의 너비를 지정합니다. `l'이 제공되면, 각 주가 사용할 줄 수를 지정합니다. 생성자에 지정되거나 @ref{2938,,setfirstweekday()} 메서드로 설정된 첫 번째 요일에 따라 다릅니다.
@end deffn

@geindex formatmonthname() (calendar.TextCalendar 메서드)
@anchor{library/calendar calendar TextCalendar formatmonthname}@anchor{294d}
@deffn {메서드} formatmonthname (theyear, themonth, width=0, withyear=True)

Return a string representing the month’s name centered within the
specified `width'. If `withyear' is @code{True}, include the year in the
output. The `theyear' and `themonth' parameters specify the year
and month for the name to be formatted respectively.
@end deffn

@geindex prmonth() (calendar.TextCalendar 메서드)
@anchor{library/calendar calendar TextCalendar prmonth}@anchor{294e}
@deffn {메서드} prmonth (theyear, themonth, w=0, l=0)

@ref{294c,,formatmonth()}에서 반환한 월의 달력을 인쇄합니다.
@end deffn

@geindex formatyear() (calendar.TextCalendar 메서드)
@anchor{library/calendar calendar TextCalendar formatyear}@anchor{294f}
@deffn {메서드} formatyear (theyear, w=2, l=1, c=6, m=3)

전체 연도의 `m'-열 달력을 여러 줄 문자열로 반환합니다. 선택적 매개 변수 `w', `l' 및 `c'는 각각 날짜 열 너비, 주당 줄 수 및 월 열 사이의 스페이스 수입니다. 생성자에 지정되거나 @ref{2938,,setfirstweekday()} 메서드로 설정된 첫 번째 요일에 따라 다릅니다. 달력을 생성할 수 있는 가장 빠른 연도는 플랫폼에 따라 다릅니다.
@end deffn

@geindex pryear() (calendar.TextCalendar 메서드)
@anchor{library/calendar calendar TextCalendar pryear}@anchor{2950}
@deffn {메서드} pryear (theyear, w=2, l=1, c=6, m=3)

@ref{294f,,formatyear()}에서 반환 연도의 달력을 인쇄합니다.
@end deffn
@end deffn

@geindex HTMLCalendar (calendar 클래스)
@anchor{library/calendar calendar HTMLCalendar}@anchor{d17}
@deffn {클래스} calendar.HTMLCalendar (firstweekday=0)

이 클래스는 HTML 달력을 생성하는 데 사용할 수 있습니다.

@code{HTMLCalendar} 인스턴스에는 다음과 같은 메서드가 있습니다:

@geindex formatmonth() (calendar.HTMLCalendar 메서드)
@anchor{library/calendar calendar HTMLCalendar formatmonth}@anchor{2951}
@deffn {메서드} formatmonth (theyear, themonth, withyear=True)

월의 달력을 HTML 테이블로 반환합니다. `withyear'가 참이면 연도가 헤더에 포함되고, 그렇지 않으면 월 이름 만 사용됩니다.
@end deffn

@geindex formatyear() (calendar.HTMLCalendar 메서드)
@anchor{library/calendar calendar HTMLCalendar formatyear}@anchor{2952}
@deffn {메서드} formatyear (theyear, width=3)

연도의 달력을 HTML 테이블로 반환합니다. `width'(기본값은 3)는 행 당 개월 수를 지정합니다.
@end deffn

@geindex formatyearpage() (calendar.HTMLCalendar 메서드)
@anchor{library/calendar calendar HTMLCalendar formatyearpage}@anchor{2953}
@deffn {메서드} formatyearpage (theyear, width=3, css='calendar.css', encoding=None)

연도의 달력을 완전한 HTML 페이지로 반환합니다. `width'(기본값은 3)는 행 당 개월 수를 지정합니다. `css'는 사용할 캐스케이딩 스타일 시트의 이름입니다. 스타일 시트를 사용하지 않으면 @ref{884,,None}을 전달할 수 있습니다. `encoding'은 출력에 사용될 인코딩을 지정합니다 (기본값은 시스템 기본 인코딩입니다).
@end deffn

@geindex formatmonthname() (calendar.HTMLCalendar 메서드)
@anchor{library/calendar calendar HTMLCalendar formatmonthname}@anchor{2954}
@deffn {메서드} formatmonthname (theyear, themonth, withyear=True)

월 이름을 HTML 테이블 행으로 반환합니다. `withyear'가 참이면 연도가 행에 포함되고, 그렇지 않으면 월 이름 만 사용됩니다.
@end deffn

@code{HTMLCalendar}에는 달력에서 사용하는 CSS 클래스를 사용자 정의하기 위해 재정의할 수 있는 다음과 같은 어트리뷰트가 있습니다:

@geindex cssclasses (calendar.HTMLCalendar의 속성)
@anchor{library/calendar calendar HTMLCalendar cssclasses}@anchor{2955}
@deffn {속성} cssclasses

각 요일에 사용되는 CSS 클래스 리스트. 기본 클래스 리스트는 다음과 같습니다:

@example
cssclasses = ["mon", "tue", "wed", "thu", "fri", "sat", "sun"]
@end example

각 날에 더 많은 스타일을 추가할 수 있습니다:

@example
cssclasses = ["mon text-bold", "tue", "wed", "thu", "fri", "sat", "sun red"]
@end example

이 리스트의 길이는 7개의 항목임에 유의하십시오.
@end deffn

@geindex cssclass_noday (calendar.HTMLCalendar의 속성)
@anchor{library/calendar calendar HTMLCalendar cssclass_noday}@anchor{2956}
@deffn {속성} cssclass_noday

지난달이나 다음 달에 등장하는 요일의 CSS 클래스.


Added in version 3.7.

@end deffn

@geindex cssclasses_weekday_head (calendar.HTMLCalendar의 속성)
@anchor{library/calendar calendar HTMLCalendar cssclasses_weekday_head}@anchor{2957}
@deffn {속성} cssclasses_weekday_head

헤더 행에 있는 요일 이름에 사용되는 CSS 클래스 리스트. 기본값은 @ref{2955,,cssclasses}와 같습니다.


Added in version 3.7.

@end deffn

@geindex cssclass_month_head (calendar.HTMLCalendar의 속성)
@anchor{library/calendar calendar HTMLCalendar cssclass_month_head}@anchor{2958}
@deffn {속성} cssclass_month_head

월 헤드 CSS 클래스 (@ref{2954,,formatmonthname()} 에서 사용됩니다). 기본값은 @code{"month"}입니다.


Added in version 3.7.

@end deffn

@geindex cssclass_month (calendar.HTMLCalendar의 속성)
@anchor{library/calendar calendar HTMLCalendar cssclass_month}@anchor{2959}
@deffn {속성} cssclass_month

월 전체 테이블의 CSS 클래스 (@ref{2951,,formatmonth()}에서 사용됩니다). 기본값은 @code{"month"}입니다.


Added in version 3.7.

@end deffn

@geindex cssclass_year (calendar.HTMLCalendar의 속성)
@anchor{library/calendar calendar HTMLCalendar cssclass_year}@anchor{295a}
@deffn {속성} cssclass_year

연도 전체 표의 CSS 클래스 (@ref{2952,,formatyear()}에서 사용됩니다). 기본값은 @code{"year"}입니다.


Added in version 3.7.

@end deffn

@geindex cssclass_year_head (calendar.HTMLCalendar의 속성)
@anchor{library/calendar calendar HTMLCalendar cssclass_year_head}@anchor{295b}
@deffn {속성} cssclass_year_head

연도 전체의 테이블 헤드의 CSS 클래스 (@ref{2952,,formatyear()}에서 사용됩니다). 기본값은 @code{"year"}입니다.


Added in version 3.7.

@end deffn

위에서 설명한 클래스 어트리뷰트의 이름은 단수이지만 (예를 들어 @code{cssclass_month} @code{cssclass_noday}), 단일 CSS 클래스를 스페이스로 구분된 CSS 클래스 목록으로 바꿀 수 있습니다. 예를 들면 다음과 같습니다:

@example
"text-bold text-red"
@end example

다음은 @code{HTMLCalendar}를 사용자 정의하는 방법에 대한 예입니다:

@example
class CustomHTMLCal(calendar.HTMLCalendar):
    cssclasses = [style + " text-nowrap" for style in
                  calendar.HTMLCalendar.cssclasses]
    cssclass_month_head = "text-center month-head"
    cssclass_month = "text-center month"
    cssclass_year = "text-italic lead"
@end example
@end deffn

@geindex LocaleTextCalendar (calendar 클래스)
@anchor{library/calendar calendar LocaleTextCalendar}@anchor{94a}
@deffn {클래스} calendar.LocaleTextCalendar (firstweekday=0, locale=None)

@ref{18ac,,TextCalendar}의 이 서브 클래스는 생성자에 로케일 이름을 전달할 수 있으며 지정된 로케일에서 월과 요일 이름을 반환합니다.
@end deffn

@geindex LocaleHTMLCalendar (calendar 클래스)
@anchor{library/calendar calendar LocaleHTMLCalendar}@anchor{94b}
@deffn {클래스} calendar.LocaleHTMLCalendar (firstweekday=0, locale=None)

@ref{d17,,HTMLCalendar}의 이 서브 클래스는 생성자에 로케일 이름을 전달할 수 있으며 지정된 로케일에서 월과 요일 이름을 반환합니다.
@end deffn

@cartouche
@quotation 참고 
이 두 클래스의 생성자, @code{formatweekday()}와 @code{formatmonthname()} 메서드는 @code{LC_TIME} 로케일을 주어진 `locale'로 임시 변경합니다. 현재 로케일은 프로세스 전체 설정이므로, 스레드 안전하지 않습니다.
@end quotation
@end cartouche

간단한 텍스트 달력을 위해 이 모듈은 다음 함수를 제공합니다.

@geindex setfirstweekday() (calendar 모듈)
@anchor{library/calendar calendar setfirstweekday}@anchor{2938}
@deffn {함수} calendar.setfirstweekday (weekday)

매주 시작일을 weekday(@code{0}은 월요일, @code{6}은 일요일)로 설정합니다. 편의를 위해 @ref{293a,,MONDAY}, @ref{295c,,TUESDAY}, @ref{295d,,WEDNESDAY}, @ref{295e,,THURSDAY}, @ref{295f,,FRIDAY}, @ref{2960,,SATURDAY} 및 @ref{293b,,SUNDAY} 값이 제공됩니다. 예를 들어, 주의 첫 번째 날을 일요일로 설정하려면:

@example
import calendar
calendar.setfirstweekday(calendar.SUNDAY)
@end example
@end deffn

@geindex firstweekday() (calendar 모듈)
@anchor{library/calendar calendar firstweekday}@anchor{2961}
@deffn {함수} calendar.firstweekday ()

각 주를 시작하는 요일의 현재 설정을 반환합니다.
@end deffn

@geindex isleap() (calendar 모듈)
@anchor{library/calendar calendar isleap}@anchor{2962}
@deffn {함수} calendar.isleap (year)

`year'가 윤년이면 @ref{e06,,True}를, 그렇지 않으면 @ref{d2a,,False}를 반환합니다.
@end deffn

@geindex leapdays() (calendar 모듈)
@anchor{library/calendar calendar leapdays}@anchor{2963}
@deffn {함수} calendar.leapdays (y1, y2)

`y1'에서 `y2'(우측 경계 제외) 범위에서 윤년의 수를 반환합니다, 여기서 `y1'과 `y2'는 연도입니다.

이 함수는 세기(century)의 변경을 포함하는 범위에서 작동합니다.
@end deffn

@geindex weekday() (calendar 모듈)
@anchor{library/calendar calendar weekday}@anchor{2964}
@deffn {함수} calendar.weekday (year, month, day)

`year' (@code{1970}–…), `month' (@code{1}–@code{12}), `day' (@code{1}–@code{31})의 요일(@code{0}은 월요일)을 반환합니다.
@end deffn

@geindex weekheader() (calendar 모듈)
@anchor{library/calendar calendar weekheader}@anchor{2965}
@deffn {함수} calendar.weekheader (n)

약식 요일 이름이 포함된 헤더를 반환합니다. `n'은 한 주의 너비를 문자 수로 지정합니다.
@end deffn

@geindex monthrange() (calendar 모듈)
@anchor{library/calendar calendar monthrange}@anchor{2966}
@deffn {함수} calendar.monthrange (year, month)

지정된 `year'와 `month'에 대해 월의 첫 번째 날의 요일과 월의 날 수를 반환합니다.
@end deffn

@geindex monthcalendar() (calendar 모듈)
@anchor{library/calendar calendar monthcalendar}@anchor{2967}
@deffn {함수} calendar.monthcalendar (year, month)

한 달의 달력을 나타내는 행렬을 반환합니다. 각 행은 한 주를 나타냅니다; 월 바깥의 날은 0으로 표시됩니다. @ref{2938,,setfirstweekday()}로 설정하지 않는 한 각 주는 월요일에 시작합니다.
@end deffn

@geindex prmonth() (calendar 모듈)
@anchor{library/calendar calendar prmonth}@anchor{2968}
@deffn {함수} calendar.prmonth (theyear, themonth, w=0, l=0)

@ref{190c,,month()}가 반환하는 월의 달력을 인쇄합니다.
@end deffn

@geindex month() (calendar 모듈)
@anchor{library/calendar calendar month}@anchor{190c}
@deffn {함수} calendar.month (theyear, themonth, w=0, l=0)

@ref{18ac,,TextCalendar} 클래스의 @ref{294c,,formatmonth()}를 사용하여, 한 달의 달력을 여러 줄 문자열로 반환합니다.
@end deffn

@geindex prcal() (calendar 모듈)
@anchor{library/calendar calendar prcal}@anchor{2969}
@deffn {함수} calendar.prcal (year, w=0, l=0, c=6, m=3)

@ref{15,,calendar()}에서 반환 한 연도 전체 달력을 인쇄합니다.
@end deffn

@geindex calendar() (calendar 모듈)
@anchor{library/calendar calendar calendar}@anchor{296a}
@deffn {함수} calendar.calendar (year, w=2, l=1, c=6, m=3)

@ref{18ac,,TextCalendar} 클래스의 @ref{294f,,formatyear()}를 사용하여 전체 연도의 3-열 달력을 여러 줄 문자열로 반환합니다.
@end deffn

@geindex timegm() (calendar 모듈)
@anchor{library/calendar calendar timegm}@anchor{296b}
@deffn {함수} calendar.timegm (tuple)

@ref{f4,,time} 모듈의 @ref{13c5,,gmtime()} 함수가 반환하는 것과 같은 시간 튜플을 취하고, 1970년의 시작과 POSIX 인코딩을 가정하는 해당 유닉스 타임스탬프 값을 반환하는 관련이 없지만 편리한 함수. 실제로, @code{time.gmtime()}과 @ref{296b,,timegm()}은 서로의 역 함수입니다.
@end deffn

The @code{calendar} module exports the following data attributes:

@geindex day_name (calendar 모듈)
@anchor{library/calendar calendar day_name}@anchor{296c}
@deffn {데이터} calendar.day_name

현재 로케일의 요일을 나타내는 시퀀스, 여기서 Monday 는 요일 번호 0입니다.

@example
>>> import calendar
>>> list(calendar.day_name)
['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']
@end example
@end deffn

@geindex day_abbr (calendar 모듈)
@anchor{library/calendar calendar day_abbr}@anchor{296d}
@deffn {데이터} calendar.day_abbr

현재 로케일의 약식 요일을 나타내는 시퀀스, 여기서 Mon 은 요일 번호 0입니다.

@example
>>> import calendar
>>> list(calendar.day_abbr)
['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
@end example
@end deffn

@geindex MONDAY (calendar 모듈)
@geindex TUESDAY (calendar 모듈)
@geindex WEDNESDAY (calendar 모듈)
@geindex THURSDAY (calendar 모듈)
@geindex FRIDAY (calendar 모듈)
@geindex SATURDAY (calendar 모듈)
@geindex SUNDAY (calendar 모듈)
@anchor{library/calendar calendar MONDAY}@anchor{293a}
@deffn {데이터} calendar.MONDAY
@anchor{library/calendar calendar TUESDAY}@anchor{295c}
@deffnx {데이터} calendar.TUESDAY
@anchor{library/calendar calendar WEDNESDAY}@anchor{295d}
@deffnx {데이터} calendar.WEDNESDAY
@anchor{library/calendar calendar THURSDAY}@anchor{295e}
@deffnx {데이터} calendar.THURSDAY
@anchor{library/calendar calendar FRIDAY}@anchor{295f}
@deffnx {데이터} calendar.FRIDAY
@anchor{library/calendar calendar SATURDAY}@anchor{2960}
@deffnx {데이터} calendar.SATURDAY
@anchor{library/calendar calendar SUNDAY}@anchor{293b}
@deffnx {데이터} calendar.SUNDAY

Aliases for the days of the week,
where @code{MONDAY} is @code{0} and @code{SUNDAY} is @code{6}.


Added in version 3.12.

@end deffn

@geindex Day (calendar 클래스)
@anchor{library/calendar calendar Day}@anchor{6a9}
@deffn {클래스} calendar.Day

Enumeration defining days of the week as integer constants.
The members of this enumeration are exported to the module scope as
@ref{293a,,MONDAY} through @ref{293b,,SUNDAY}.


Added in version 3.12.

@end deffn

@geindex month_name (calendar 모듈)
@anchor{library/calendar calendar month_name}@anchor{296e}
@deffn {데이터} calendar.month_name

현재 로케일에서 연중 월을 나타내는 시퀀스. 이는 1월이 월 번호 1인 일반적인 규칙을 따르므로, 길이는 13이고 @code{month_name[0]}은 빈 문자열입니다.

@example
>>> import calendar
>>> list(calendar.month_name)
['@w{'}, 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']
@end example
@end deffn

@geindex month_abbr (calendar 모듈)
@anchor{library/calendar calendar month_abbr}@anchor{296f}
@deffn {데이터} calendar.month_abbr

현재 로케일에서 연중 약식 월을 나타내는 시퀀스. 이는 1월이 월 번호 1인 일반적인 규칙을 따르므로, 길이는 13이고 @code{month_abbr[0]}은 빈 문자열입니다.

@example
>>> import calendar
>>> list(calendar.month_abbr)
['@w{'}, 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
@end example
@end deffn

@geindex JANUARY (calendar 모듈)
@geindex FEBRUARY (calendar 모듈)
@geindex MARCH (calendar 모듈)
@geindex APRIL (calendar 모듈)
@geindex MAY (calendar 모듈)
@geindex JUNE (calendar 모듈)
@geindex JULY (calendar 모듈)
@geindex AUGUST (calendar 모듈)
@geindex SEPTEMBER (calendar 모듈)
@geindex OCTOBER (calendar 모듈)
@geindex NOVEMBER (calendar 모듈)
@geindex DECEMBER (calendar 모듈)
@anchor{library/calendar calendar JANUARY}@anchor{34e}
@deffn {데이터} calendar.JANUARY
@anchor{library/calendar calendar FEBRUARY}@anchor{34f}
@deffnx {데이터} calendar.FEBRUARY
@anchor{library/calendar calendar MARCH}@anchor{2970}
@deffnx {데이터} calendar.MARCH
@anchor{library/calendar calendar APRIL}@anchor{2971}
@deffnx {데이터} calendar.APRIL
@anchor{library/calendar calendar MAY}@anchor{2972}
@deffnx {데이터} calendar.MAY
@anchor{library/calendar calendar JUNE}@anchor{2973}
@deffnx {데이터} calendar.JUNE
@anchor{library/calendar calendar JULY}@anchor{2974}
@deffnx {데이터} calendar.JULY
@anchor{library/calendar calendar AUGUST}@anchor{2975}
@deffnx {데이터} calendar.AUGUST
@anchor{library/calendar calendar SEPTEMBER}@anchor{2976}
@deffnx {데이터} calendar.SEPTEMBER
@anchor{library/calendar calendar OCTOBER}@anchor{2977}
@deffnx {데이터} calendar.OCTOBER
@anchor{library/calendar calendar NOVEMBER}@anchor{2978}
@deffnx {데이터} calendar.NOVEMBER
@anchor{library/calendar calendar DECEMBER}@anchor{2979}
@deffnx {데이터} calendar.DECEMBER

Aliases for the months of the year,
where @code{JANUARY} is @code{1} and @code{DECEMBER} is @code{12}.


Added in version 3.12.

@end deffn

@geindex Month (calendar 클래스)
@anchor{library/calendar calendar Month}@anchor{6a8}
@deffn {클래스} calendar.Month

Enumeration defining months of the year as integer constants.
The members of this enumeration are exported to the module scope as
@ref{34e,,JANUARY} through @ref{2979,,DECEMBER}.


Added in version 3.12.

@end deffn

The @code{calendar} module defines the following exceptions:

@geindex IllegalMonthError
@anchor{library/calendar calendar IllegalMonthError}@anchor{190b}
@deffn {예외} calendar.IllegalMonthError (month)

A subclass of @ref{2ec,,ValueError},
raised when the given month number is outside of the range 1-12 (inclusive).

@geindex month (calendar.IllegalMonthError의 속성)
@anchor{library/calendar calendar IllegalMonthError month}@anchor{297a}
@deffn {속성} month

The invalid month number.
@end deffn
@end deffn

@geindex IllegalWeekdayError
@anchor{library/calendar calendar IllegalWeekdayError}@anchor{297b}
@deffn {예외} calendar.IllegalWeekdayError (weekday)

A subclass of @ref{2ec,,ValueError},
raised when the given weekday number is outside of the range 0-6 (inclusive).

@geindex weekday (calendar.IllegalWeekdayError의 속성)
@anchor{library/calendar calendar IllegalWeekdayError weekday}@anchor{297c}
@deffn {속성} weekday

The invalid weekday number.
@end deffn
@end deffn


@subsubheading 더 보기



@table @asis

@item 모듈 @ref{34,,datetime}

@ref{f4,,time} 모듈과 유사한 기능을 가진 날짜와 시간에 대한 객체 지향 인터페이스.

@item 모듈 @ref{f4,,time}

저수준 시간 관련 함수.
@end table


@menu
* Command-line usage:: 

@end menu

@node Command-line usage,,,calendar — 일반 달력 관련 함수
@anchor{library/calendar calendar-cli}@anchor{1d0}@anchor{library/calendar command-line-usage}@anchor{297d}
@subsubsection Command-line usage



Added in version 2.5.


The @code{calendar} module can be executed as a script from the command line
to interactively print a calendar.

@example
python -m calendar [-h] [-L LOCALE] [-e ENCODING] [-t @{text,html@}]
                   [-w WIDTH] [-l LINES] [-s SPACING] [-m MONTHS] [-c CSS]
                   [-f FIRST_WEEKDAY] [year] [month]
@end example

For example, to print a calendar for the year 2000:

@example
$ python -m calendar 2000
                                  2000

      January                   February                   March
Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su
                1  2          1  2  3  4  5  6             1  2  3  4  5
 3  4  5  6  7  8  9       7  8  9 10 11 12 13       6  7  8  9 10 11 12
10 11 12 13 14 15 16      14 15 16 17 18 19 20      13 14 15 16 17 18 19
17 18 19 20 21 22 23      21 22 23 24 25 26 27      20 21 22 23 24 25 26
24 25 26 27 28 29 30      28 29                     27 28 29 30 31
31

       April                      May                       June
Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su
                1  2       1  2  3  4  5  6  7                1  2  3  4
 3  4  5  6  7  8  9       8  9 10 11 12 13 14       5  6  7  8  9 10 11
10 11 12 13 14 15 16      15 16 17 18 19 20 21      12 13 14 15 16 17 18
17 18 19 20 21 22 23      22 23 24 25 26 27 28      19 20 21 22 23 24 25
24 25 26 27 28 29 30      29 30 31                  26 27 28 29 30

        July                     August                  September
Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su
                1  2          1  2  3  4  5  6                   1  2  3
 3  4  5  6  7  8  9       7  8  9 10 11 12 13       4  5  6  7  8  9 10
10 11 12 13 14 15 16      14 15 16 17 18 19 20      11 12 13 14 15 16 17
17 18 19 20 21 22 23      21 22 23 24 25 26 27      18 19 20 21 22 23 24
24 25 26 27 28 29 30      28 29 30 31               25 26 27 28 29 30
31

      October                   November                  December
Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su
                   1             1  2  3  4  5                   1  2  3
 2  3  4  5  6  7  8       6  7  8  9 10 11 12       4  5  6  7  8  9 10
 9 10 11 12 13 14 15      13 14 15 16 17 18 19      11 12 13 14 15 16 17
16 17 18 19 20 21 22      20 21 22 23 24 25 26      18 19 20 21 22 23 24
23 24 25 26 27 28 29      27 28 29 30               25 26 27 28 29 30 31
30 31
@end example

The following options are accepted:

@geindex calendar 명령줄 옵션; --help
@geindex calendar 명령줄 옵션; -h
@anchor{library/calendar cmdoption-calendar-help}@anchor{297e}@anchor{library/calendar cmdoption-calendar-h}@anchor{297f}
@deffn {Option} @w{-}@w{-}help, @w{-}h

Show the help message and exit.
@end deffn

@geindex calendar 명령줄 옵션; --locale
@geindex calendar 명령줄 옵션; -L
@anchor{library/calendar cmdoption-calendar-locale}@anchor{2980}@anchor{library/calendar cmdoption-calendar-L}@anchor{2981}
@deffn {Option} @w{-}@w{-}locale LOCALE, @w{-}L LOCALE

The locale to use for month and weekday names.
Defaults to English.
@end deffn

@geindex calendar 명령줄 옵션; --encoding
@geindex calendar 명령줄 옵션; -e
@anchor{library/calendar cmdoption-calendar-encoding}@anchor{2982}@anchor{library/calendar cmdoption-calendar-e}@anchor{2983}
@deffn {Option} @w{-}@w{-}encoding ENCODING, @w{-}e ENCODING

The encoding to use for output.
@ref{2982,,--encoding} is required if @ref{2980,,--locale} is set.
@end deffn

@geindex calendar 명령줄 옵션; --type
@geindex calendar 명령줄 옵션; -t
@anchor{library/calendar cmdoption-calendar-type}@anchor{2984}@anchor{library/calendar cmdoption-calendar-t}@anchor{2985}
@deffn {Option} @w{-}@w{-}type @{text,html@}, @w{-}t @{text,html@}

Print the calendar to the terminal as text,
or as an HTML document.
@end deffn

@geindex calendar 명령줄 옵션; --first-weekday
@geindex calendar 명령줄 옵션; -f
@anchor{library/calendar cmdoption-calendar-first-weekday}@anchor{2986}@anchor{library/calendar cmdoption-calendar-f}@anchor{2987}
@deffn {Option} @w{-}@w{-}first@w{-}weekday FIRST_WEEKDAY, @w{-}f FIRST_WEEKDAY

The weekday to start each week.
Must be a number between 0 (Monday) and 6 (Sunday).
Defaults to 0.


Added in version 3.13.

@end deffn

@geindex calendar 명령줄 옵션; year
@anchor{library/calendar cmdoption-calendar-arg-year}@anchor{2988}
@deffn {Option} year

The year to print the calendar for.
Defaults to the current year.
@end deffn

@geindex calendar 명령줄 옵션; month
@anchor{library/calendar cmdoption-calendar-arg-month}@anchor{2989}
@deffn {Option} month

The month of the specified @ref{2988,,year} to print the calendar for.
Must be a number between 1 and 12,
and may only be used in text mode.
Defaults to printing a calendar for the full year.
@end deffn

`Text-mode options:'

@geindex calendar 명령줄 옵션; --width
@geindex calendar 명령줄 옵션; -w
@anchor{library/calendar cmdoption-calendar-width}@anchor{298a}@anchor{library/calendar cmdoption-calendar-w}@anchor{298b}
@deffn {Option} @w{-}@w{-}width WIDTH, @w{-}w WIDTH

The width of the date column in terminal columns.
The date is printed centred in the column.
Any value lower than 2 is ignored.
Defaults to 2.
@end deffn

@geindex calendar 명령줄 옵션; --lines
@geindex calendar 명령줄 옵션; -l
@anchor{library/calendar cmdoption-calendar-lines}@anchor{298c}@anchor{library/calendar cmdoption-calendar-l}@anchor{298d}
@deffn {Option} @w{-}@w{-}lines LINES, @w{-}l LINES

The number of lines for each week in terminal rows.
The date is printed top-aligned.
Any value lower than 1 is ignored.
Defaults to 1.
@end deffn

@geindex calendar 명령줄 옵션; --spacing
@geindex calendar 명령줄 옵션; -s
@anchor{library/calendar cmdoption-calendar-spacing}@anchor{298e}@anchor{library/calendar cmdoption-calendar-s}@anchor{298f}
@deffn {Option} @w{-}@w{-}spacing SPACING, @w{-}s SPACING

The space between months in columns.
Any value lower than 2 is ignored.
Defaults to 6.
@end deffn

@geindex calendar 명령줄 옵션; --months
@geindex calendar 명령줄 옵션; -m
@anchor{library/calendar cmdoption-calendar-months}@anchor{2990}@anchor{library/calendar cmdoption-calendar-m}@anchor{2991}
@deffn {Option} @w{-}@w{-}months MONTHS, @w{-}m MONTHS

The number of months printed per row.
Defaults to 3.
@end deffn


버전 3.14에서 변경: By default, today’s date is highlighted in color and can be
@ref{1b7,,controlled using environment variables}.


`HTML-mode options:'

@geindex calendar 명령줄 옵션; --css
@geindex calendar 명령줄 옵션; -c
@anchor{library/calendar cmdoption-calendar-css}@anchor{2992}@anchor{library/calendar cmdoption-calendar-c}@anchor{2993}
@deffn {Option} @w{-}@w{-}css CSS, @w{-}c CSS

The path of a CSS stylesheet to use for the calendar.
This must either be relative to the generated HTML,
or an absolute HTTP or @code{file:///} URL.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node collections — 컨테이너 데이터형,collections abc — 컨테이너의 추상 베이스 클래스,calendar — 일반 달력 관련 함수,데이터형
@anchor{library/collections doc}@anchor{2994}@anchor{library/collections collections-container-datatypes}@anchor{2995}@anchor{library/collections module-collections}@anchor{1e}@anchor{library/collections translation-repo}@anchor{2996}
@subsection @code{collections} — 컨테이너 데이터형


@geindex module; collections

`소스 코드:' Lib/collections/__init__.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/collections/__init__.py}

@c from collections import *
@c import itertools
@c __name__ = '<doctest>'


__________________________________________________________________


이 모듈은 파이썬의 범용 내장 컨테이너 @ref{183,,dict}, @ref{24d,,list}, @ref{184,,set} 및 @ref{610,,tuple}에 대한 대안을 제공하는 특수 컨테이너 데이터형을 구현합니다.


@multitable {xxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

@ref{4e0,,namedtuple()}

@tab

이름 붙은 필드를 갖는 튜플 서브 클래스를 만들기 위한 팩토리 함수

@item

@ref{7f3,,deque}

@tab

양쪽 끝에서 빠르게 추가와 삭제를 할 수 있는 리스트류 컨테이너

@item

@ref{e15,,ChainMap}

@tab

여러 매핑의 단일 뷰를 만드는 딕셔너리류 클래스

@item

@ref{1296,,Counter}

@tab

@ref{823,,해시 가능} 객체를 세는 데 사용하는 딕셔너리 서브 클래스

@item

@ref{7f2,,OrderedDict}

@tab

항목이 추가된 순서를 기억하는 딕셔너리 서브 클래스

@item

@ref{13c1,,defaultdict}

@tab

누락된 값을 제공하기 위해 팩토리 함수를 호출하는 딕셔너리 서브 클래스

@item

@ref{1d7b,,UserDict}

@tab

더 쉬운 딕셔너리 서브 클래싱을 위해 딕셔너리 객체를 감싸는 래퍼

@item

@ref{16e9,,UserList}

@tab

더 쉬운 리스트 서브 클래싱을 위해 리스트 객체를 감싸는 래퍼

@item

@ref{fd2,,UserString}

@tab

더 쉬운 문자열 서브 클래싱을 위해 문자열 객체를 감싸는 래퍼

@end multitable


@menu
* ChainMap 객체:: 
* Counter 객체:: 
* deque 객체:: 
* defaultdict 객체:: 
* 이름있는 필드를 가진 튜플을 위한 namedtuple() 팩토리 함수: 이름있는 필드를 가진 튜플을 위한 namedtuple 팩토리 함수. 
* OrderedDict 객체:: 
* UserDict 객체:: 
* UserList 객체:: 
* UserString 객체:: 

@end menu

@node ChainMap 객체,Counter 객체,,collections — 컨테이너 데이터형
@anchor{library/collections chainmap-objects}@anchor{2997}
@subsubsection @code{ChainMap} 객체



Added in version 3.3.


@ref{e15,,ChainMap} 클래스는 여러 매핑을 빠르게 연결하여 단일 단위로 취급 할 수 있도록 합니다. 종종 새로운 딕셔너리를 만들고 여러 @ref{166a,,update()} 호출을 실행하는 것보다 훨씬 빠릅니다.

이 클래스는 중첩된 스코프를 시뮬레이션하는 데 사용할 수 있으며 템플릿에 유용합니다.

@geindex ChainMap (collections 클래스)
@anchor{library/collections collections ChainMap}@anchor{e15}
@deffn {클래스} collections.ChainMap (*maps)

@ref{e15,,ChainMap}은 여러 딕셔너리나 다른 매핑을 함께 묶어 갱신 가능한 단일 뷰를 만듭니다. `maps'가 지정되지 않으면, 새 체인에 항상 하나 이상의 매핑이 있도록, 빈 딕셔너리 하나가 제공됩니다.

하부 매핑은 리스트에 저장됩니다. 이 리스트는 공개이며 `maps' 어트리뷰트를 사용하여 액세스하거나 갱신할 수 있습니다. 다른 상태는 없습니다.

조회는 키를 찾을 때까지 하부 매핑을 검색합니다. 반면에, 쓰기, 갱신 및 삭제는 첫 번째 매핑에만 작동합니다.

@ref{e15,,ChainMap}은 하부 매핑을 참조로 통합합니다. 따라서 하부 매핑 중 하나가 갱신되면 해당 변경 사항이 @code{ChainMap}에 반영됩니다.

일반적인 딕셔너리 메서드가 모두 지원됩니다. 또한, `maps' 어트리뷰트, 새 서브 컨텍스트를 만드는 메서드 및 첫 번째 매핑을 제외한 모든 것에 액세스하는 프로퍼티가 있습니다:

@geindex maps (collections.ChainMap의 속성)
@anchor{library/collections collections ChainMap maps}@anchor{2998}
@deffn {속성} maps

사용자 갱신 가능한 매핑 리스트. 리스트는 먼저 검색되는 것에서 나중에 검색되는 순서를 따릅니다. 저장된 유일한 상태이며 검색할 매핑을 변경하도록 수정할 수 있습니다. 리스트는 항상 하나 이상의 매핑이 포함되어야 합니다.
@end deffn

@geindex new_child() (collections.ChainMap 메서드)
@anchor{library/collections collections ChainMap new_child}@anchor{1124}
@deffn {메서드} new_child (m=None, **kwargs)

새 맵과 그 뒤로 현재 인스턴스의 모든 맵을 포함하는 새 @ref{e15,,ChainMap}을 반환합니다. @code{m}이 지정되면, 매핑 리스트의 맨 앞에 놓이는 새 맵이 됩니다. 지정하지 않으면, 빈 딕셔너리가 사용되므로 @code{d.new_child()} 호출은 @code{ChainMap(@{@}, *d.maps)}과 동등합니다. 키워드 인자가 지정되면, 전달된 맵이나 새로운 빈 딕셔너리를 갱신합니다. 이 메서드는 어떤 부모 매핑에 있는 값도 변경하지 않으면서 갱신할 수 있는 서브 컨텍스트를 만드는 데 사용됩니다.


버전 3.4에서 변경: 선택적 @code{m} 매개 변수가 추가되었습니다.



버전 3.10에서 변경: Keyword arguments support was added.

@end deffn

@geindex parents (collections.ChainMap의 속성)
@anchor{library/collections collections ChainMap parents}@anchor{2999}
@deffn {속성} parents

첫 번째 맵을 제외하고 현재 인스턴스의 모든 맵을 포함하는 새 @ref{e15,,ChainMap}을 반환하는 프로퍼티. 검색에서 첫 번째 맵을 건너뛰려고 할 때 유용합니다. 사용 사례는 @ref{238d,,중첩된 스코프}에서 사용되는 @ref{14ac,,nonlocal} 키워드와 유사합니다. 사용 사례는 내장 @ref{1a6,,super()} 함수와도 유사합니다. @code{d.parents}에 대한 참조는 @code{ChainMap(*d.maps[1:])}과 동등합니다.
@end deffn

@ref{e15,,ChainMap}의 이터레이션 순서는 매핑을 마지막에서 첫 번째 방향으로 스캔하여 결정됩니다:

@example
>>> baseline = @{'music': 'bach', 'art': 'rembrandt'@}
>>> adjustments = @{'art': 'van gogh', 'opera': 'carmen'@}
>>> list(ChainMap(adjustments, baseline))
['music', 'art', 'opera']
@end example

이것은 마지막 매핑에서 시작하는 일련의 @ref{166a,,dict.update()} 호출과 같은 순서를 제공합니다:

@example
>>> combined = baseline.copy()
>>> combined.update(adjustments)
>>> list(combined)
['music', 'art', 'opera']
@end example


버전 3.9에서 변경: 
@geindex Python 향상 제안; PEP 584
PEP 584@footnote{https://peps.python.org/pep-0584/}에 지정된, @code{|}와 @code{|=} 연산자에 대한 지원이 추가되었습니다.

@end deffn


@subsubheading 더 보기



@itemize *

@item 
Enthought CodeTools 패키지@footnote{https://github.com/enthought/codetools}의 MultiContext 클래스@footnote{https://github.com/enthought/codetools/blob/4.0.0/codetools/contexts/multi_context.py}에는 체인의 모든 매핑으로의 쓰기를 지원하는 옵션이 있습니다.

@item 
템플릿을 위한 Django의 Context 클래스@footnote{https://github.com/django/django/blob/main/django/template/context.py}는 읽기 전용 매핑 체인입니다. 또한 @ref{1124,,new_child()} 메서드와 @ref{2999,,parents} 프로퍼티와 유사하게 컨텍스트를 푸시(push)하고 팝(pop) 하는 기능이 있습니다.

@item 
중첩된 컨텍스트 조리법@footnote{https://code.activestate.com/recipes/577434-nested-contexts-a-chain-of-mapping-objects/}에는 쓰기와 기타 변경이 첫 번째 매핑에만 적용되는지 아니면 체인의 모든 매핑에 적용되는지를 제어하는 옵션이 있습니다.

@item 
매우 단순화된 체인 맵의 읽기 전용 버전@footnote{https://code.activestate.com/recipes/305268/}
@end itemize


@menu
* ChainMap 예제와 조리법:: 

@end menu

@node ChainMap 예제와 조리법,,,ChainMap 객체
@anchor{library/collections chainmap-examples-and-recipes}@anchor{299a}
@subsubsection @code{ChainMap} 예제와 조리법


이 절에서는 체인 맵으로 작업하는 다양한 접근 방식을 보여줍니다.

파이썬의 내부 조회 체인을 시뮬레이션하는 예:

@example
import builtins
pylookup = ChainMap(locals(), globals(), vars(builtins))
@end example

사용자 지정 명령 줄 인자가 환경 변수보다 우선하고, 환경 변수는 기본값보다 우선하도록 하는 예:

@example
import os, argparse

defaults = @{'color': 'red', 'user': 'guest'@}

parser = argparse.ArgumentParser()
parser.add_argument('-u', '--user')
parser.add_argument('-c', '--color')
namespace = parser.parse_args()
command_line_args = @{k: v for k, v in vars(namespace).items() if v is not None@}

combined = ChainMap(command_line_args, os.environ, defaults)
print(combined['color'])
print(combined['user'])
@end example

중첩된 컨텍스트를 시뮬레이션하기 위해 @ref{e15,,ChainMap} 클래스를 사용하는 예제 패턴:

@example
c = ChainMap()        # 루트 컨텍스트를 만듭니다
d = c.new_child()     # 중첩된 자식 컨텍스트를 만듭니다
e = c.new_child()     # c의 자식, d와 독립적입니다
e.maps[0]             # 현재 컨텍스트 딕셔너리 -- 파이썬의 locals()와 유사합니다
e.maps[-1]            # 루트 컨텍스트 -- 파이썬의 globals()와 유사합니다
e.parents             # 둘러싼 컨텍스트 체인 -- 파이썬의 nonlocal과 유사합니다

d['x'] = 1            # 현재 컨텍스트에 값을 설정합니다
d['x']                # 컨텍스트 체인에서 첫 번째 키를 가져옵니다
del d['x']            # 현재 컨텍스트에서 지웁니다
list(d)               # 모든 중첩된 값
k in d                # 모든 중첩된 값을 검사합니다
len(d)                # 중첩된 값의 개수
d.items()             # 모든 중첩된 항목
dict(d)               # 일반 딕셔너리로 펼칩니다
@end example

@ref{e15,,ChainMap} 클래스는 체인의 첫 번째 매핑만 갱신(쓰기와 삭제)하지만, 조회는 전체 체인을 검색합니다. 그러나, 깊은 쓰기와 삭제가 필요하면, 체인의 더 깊은 곳에서 발견된 키를 갱신하는 서브 클래스를 쉽게 만들 수 있습니다:

@example
class DeepChainMap(ChainMap):
    '내부 스코프를 직접 갱신할 수 있는 ChainMap의 변형'

    def __setitem__(self, key, value):
        for mapping in self.maps:
            if key in mapping:
                mapping[key] = value
                return
        self.maps[0][key] = value

    def __delitem__(self, key):
        for mapping in self.maps:
            if key in mapping:
                del mapping[key]
                return
        raise KeyError(key)

>>> d = DeepChainMap(@{'zebra': 'black'@}, @{'elephant': 'blue'@}, @{'lion': 'yellow'@})
>>> d['lion'] = 'orange'         # 두 수준 아래에 있는 기존 키를 갱신합니다
>>> d['snake'] = 'red'           # 새 키를 최상단 딕셔너리에 추가합니다
>>> del d['elephant']            # 한 수준 아래에 있는 기존 키를 삭제합니다
>>> d                            # 결과를 표시합니다
DeepChainMap(@{'zebra': 'black', 'snake': 'red'@}, @{@}, @{'lion': 'orange'@})
@end example

@node Counter 객체,deque 객체,ChainMap 객체,collections — 컨테이너 데이터형
@anchor{library/collections counter-objects}@anchor{299b}
@subsubsection @code{Counter} 객체


편리하고 빠르게 개수를 세도록 지원하는 계수기 도구가 제공됩니다. 예를 들면:

@example
>>> # 목록에 있는 단어의 빈도를 집계합니다
>>> cnt = Counter()
>>> for word in ['red', 'blue', 'red', 'green', 'blue', 'blue']:
...     cnt[word] += 1
...
>>> cnt
Counter(@{'blue': 3, 'red': 2, 'green': 1@})

>>> # 햄릿에서 가장 흔한 단어를 찾습니다
>>> import re
>>> words = re.findall(r'\w+', open('hamlet.txt').read().lower())
>>> Counter(words).most_common(10)
[('the', 1143), ('and', 966), ('to', 762), ('of', 669), ('i', 631),
 ('you', 554),  ('a', 546), ('my', 514), ('hamlet', 471), ('in', 451)]
@end example

@geindex Counter (collections 클래스)
@anchor{library/collections collections Counter}@anchor{1296}
@deffn {클래스} collections.Counter (**kwargs)

@deffnx {클래스} collections.Counter (iterable, /, **kwargs)

@deffnx {클래스} collections.Counter (mapping, /, **kwargs)

@ref{1296,,Counter}는 @ref{823,,해시 가능} 객체를 세기 위한 @ref{183,,dict} 서브 클래스입니다. 요소가 딕셔너리 키로 저장되고 개수가 딕셔너리값으로 저장되는 컬렉션입니다. 개수는 0이나 음수를 포함하는 임의의 정숫값이 될 수 있습니다. @code{Counter} 클래스는 다른 언어의 백(bag)이나 멀티 셋(multiset)과 유사합니다.

요소는 `이터러블'로부터 계산되거나 다른 `매핑'(또는 계수기)에서 초기화됩니다:

@example
>>> c = Counter()                           # a new, empty counter
>>> c = Counter('gallahad')                 # a new counter from an iterable
>>> c = Counter(@{'red': 4, 'blue': 2@})      # a new counter from a mapping
>>> c = Counter(cats=4, dogs=8)             # a new counter from keyword args
@end example

계수기 객체는 누락된 항목에 대해 @ref{5e5,,KeyError}를 발생시키는 대신 0을 반환한다는 점을 제외하고 딕셔너리 인터페이스를 갖습니다:

@example
>>> c = Counter(['eggs', 'ham'])
>>> c['bacon']                              # count of a missing element is zero
0
@end example

개수를 0으로 설정해도 계수기에서 요소가 제거되지 않습니다. 완전히 제거하려면 @code{del}을 사용하십시오:

@example
>>> c['sausage'] = 0                        # counter entry with a zero count
>>> del c['sausage']                        # del actually removes the entry
@end example


Added in version 3.1.



버전 3.7에서 변경: @ref{183,,dict} 서브 클래스로서, @ref{1296,,Counter}는 삽입 순서를 기억하는 기능을 상속했습니다. `Counter' 객체에 대한 수학 연산도 순서를 유지합니다. 결과는 요소가 왼쪽 피연산자에서 처음 발견된 순서로 먼저 나열된 후 오른쪽 피연산자에서 새로 발견되는 순서로 나열되는 순서를 따릅니다.


계수기 객체는 모든 딕셔너리에서 사용할 수 있는 메서드 이외의 추가 메서드를 지원합니다:

@geindex elements() (collections.Counter 메서드)
@anchor{library/collections collections Counter elements}@anchor{1508}
@deffn {메서드} elements ()

개수만큼 반복되는 요소에 대한 이터레이터를 반환합니다. 요소는 처음 발견되는 순서대로 반환됩니다. 요소의 개수가 1보다 작으면 @ref{1508,,elements()}는 이를 무시합니다.

@example
>>> c = Counter(a=4, b=2, c=0, d=-2)
>>> sorted(c.elements())
['a', 'a', 'a', 'a', 'b', 'b']
@end example
@end deffn

@geindex most_common() (collections.Counter 메서드)
@anchor{library/collections collections Counter most_common}@anchor{1507}
@deffn {메서드} most_common (n=None)

`n' 개의 가장 흔한 요소와 그 개수를 가장 흔한 것부터 가장 적은 것 순으로 나열한 리스트를 반환합니다. `n'이 생략되거나 @code{None}이면, @ref{1507,,most_common()}은 계수기의 `모든' 요소를 반환합니다. 개수가 같은 요소는 처음 발견된 순서를 유지합니다:

@example
>>> Counter('abracadabra').most_common(3)
[('a', 5), ('b', 2), ('r', 2)]
@end example
@end deffn

@geindex subtract() (collections.Counter 메서드)
@anchor{library/collections collections Counter subtract}@anchor{13e3}
@deffn {메서드} subtract (**kwargs)

@deffnx {메서드} subtract (iterable, /, **kwargs)

@deffnx {메서드} subtract (mapping, /, **kwargs)

`이터러블'이나 다른 `매핑' (또는 계수기)으로부터 온 요소들을 뺍니다. @ref{166a,,dict.update()}와 비슷하지만 교체하는 대신 개수를 뺍니다. 입력과 출력 모두 0이나 음수일 수 있습니다.

@example
>>> c = Counter(a=4, b=2, c=0, d=-2)
>>> d = Counter(a=1, b=2, c=3, d=4)
>>> c.subtract(d)
>>> c
Counter(@{'a': 3, 'b': 0, 'c': -3, 'd': -6@})
@end example


Added in version 3.2.

@end deffn

@geindex total() (collections.Counter 메서드)
@anchor{library/collections collections Counter total}@anchor{299c}
@deffn {메서드} total ()

Compute the sum of the counts.

@example
>>> c = Counter(a=10, b=5, c=0)
>>> c.total()
15
@end example


Added in version 3.10.

@end deffn

일반적인 딕셔너리 메서드를 @ref{1296,,Counter} 객체에 사용할 수 있습니다만, 두 메서드는 계수기에서 다르게 동작합니다.

@geindex fromkeys() (collections.Counter 메서드)
@anchor{library/collections collections Counter fromkeys}@anchor{299d}
@deffn {메서드} fromkeys (iterable)

이 클래스 메서드는 @ref{1296,,Counter} 객체에 구현되지 않았습니다.
@end deffn

@geindex update() (collections.Counter 메서드)
@anchor{library/collections collections Counter update}@anchor{1784}
@deffn {메서드} update (**kwargs)

@deffnx {메서드} update (iterable, /, **kwargs)

@deffnx {메서드} update (mapping, /, **kwargs)

요소는 `이터러블'에서 세거나 다른 `매핑'(또는 계수기)에서 더해집니다. @ref{166a,,dict.update()}와 비슷하지만, 교체하는 대신 더합니다. 또한, `이터러블'은 @code{(key, value)} 쌍의 시퀀스가 아닌, 요소의 시퀀스일 것으로 기대합니다.
@end deffn
@end deffn

Counters support rich comparison operators for equality, subset, and
superset relationships: @code{==}, @code{!=}, @code{<}, @code{<=}, @code{>}, @code{>=}.
All of those tests treat missing elements as having zero counts so that
@code{Counter(a=1) == Counter(a=1, b=0)} returns true.


버전 3.10에서 변경: Rich comparison operations were added.



버전 3.10에서 변경: In equality tests, missing elements are treated as having zero counts.
Formerly, @code{Counter(a=3)} and @code{Counter(a=3, b=0)} were considered
distinct.


@ref{1296,,Counter} 객체로 작업하는 일반적인 패턴:

@example
c.total()                       # 모든 개수의 총합
c.clear()                       # 모든 개수를 재설정합니다
list(c)                         # 고유한 요소들의 리스트
set(c)                          # 집합으로 변환합니다
dict(c)                         # 일반 딕셔너리로 변환합니다
c.items()                       # (elem, cnt) 쌍을 액세스합니다
Counter(dict(list_of_pairs))    # (elem, cnt) 쌍의 리스트를 변환합니다
c.most_common()[:-n-1:-1]       # 가장 드문 n 개의 요소
+c                              # 0과 음의 개수를 제거합니다
@end example

@ref{1296,,Counter} 객체를 결합하여 멀티 셋(multiset, 개수가 0보다 큰 계수기)을 생성하는 여러 수학 연산이 제공됩니다. 더하기와 빼기는 해당 요소의 개수를 더 하거나 빼서 계수기를 결합합니다. 교집합(intersection)과 합집합(union)은 해당 개수의 최솟값과 최댓값을 반환합니다. 동등성과 포함은 해당 개수를 비교합니다. 각 연산은 부호 있는 개수를 입력으로 받을 수 있지만, 출력은 개수가 0 이하면 결과에서 제외합니다.

@example
>>> c = Counter(a=3, b=1)
>>> d = Counter(a=1, b=2)
>>> c + d                       # 두 계수기를 합합니다:  c[x] + d[x]
Counter(@{'a': 4, 'b': 3@})
>>> c - d                       # 뺍니다 (양의 개수만 유지합니다)
Counter(@{'a': 2@})
>>> c & d                       # 교집합:  min(c[x], d[x])
Counter(@{'a': 1, 'b': 1@})
>>> c | d                       # 합집합:  max(c[x], d[x])
Counter(@{'a': 3, 'b': 2@})
>>> c == d                      # 동등성:  c[x] == d[x]
False
>>> c <= d                      # 포함:  c[x] <= d[x]
False
@end example

단항 덧셈과 뺄셈은 빈 계수기를 더하거나 빈 계수기를 빼는 것의 줄임 표현입니다.

@example
>>> c = Counter(a=2, b=-4)
>>> +c
Counter(@{'a': 2@})
>>> -c
Counter(@{'b': 4@})
@end example


Added in version 3.3: 단항 플러스, 단항 마이너스 및 제자리 멀티 셋 연산에 대한 지원이 추가되었습니다.


@cartouche
@quotation 참고 
계수기는 주로 양의 정수로 작동하여 횟수를 나타내도록 설계되었습니다; 그러나, 다른 형이나 음수 값이 필요한 사용 사례를 불필요하게 배제하지 않도록 주의를 기울였습니다. 이러한 사용 사례에 도움이 되도록, 이 절은 최소 범위와 형 제약 사항을 설명합니다.


@itemize *

@item 
@ref{1296,,Counter} 클래스 자체는 키와 값에 제한이 없는 딕셔너리 서브 클래스입니다. 값은 개수를 나타내는 숫자로 의도되었지만, 값 필드에 어떤 것이든 저장할 `수' 있습니다.

@item 
@ref{1507,,most_common()} 메서드는 값에 대해 순서만을 요구합니다.

@item 
@code{c[key] += 1}과 같은 제자리 연산의 경우, 값 형은 덧셈과 뺄셈만 지원하면 됩니다. 따라서 분수(fractions), 부동 소수점(floats) 및 십진수(decimals)가 작동하고 음수 값이 지원됩니다. @ref{1784,,update()}와 @ref{13e3,,subtract()}에 대해서도 마찬가지인데, 입력과 출력 모두 음수와 0을 허용합니다.

@item 
멀티 셋(multiset) 메서드는 양의 값에 대한 사용 사례를 위해서만 설계되었습니다. 입력은 음수이거나 0일 수 있지만, 양수 값을 갖는 출력만 만들어집니다. 형 제한은 없지만, 값 형은 더하기, 빼기 및 비교를 지원해야 합니다.

@item 
@ref{1508,,elements()} 메서드는 정수 개수를 요구합니다. 0과 음수 개수는 무시합니다.
@end itemize
@end quotation
@end cartouche


@subsubheading 더 보기



@itemize *

@item 
스몰토크(Smalltalk)의 Bag 클래스@footnote{https://www.gnu.org/software/smalltalk/manual-base/html_node/Bag.html}.

@item 
Multisets@footnote{https://en.wikipedia.org/wiki/Multiset}에 대한 위키피디아 항목.

@item 
예제가 포함된 C++ multisets@footnote{http://www.java2s.com/Tutorial/Cpp/0380__set-multiset/Catalog0380__set-multiset.htm} 자습서.

@item 
멀티 셋에 대한 수학 연산과 그 사용 사례에 대해서는, `Knuth, Donald. The Art of Computer Programming Volume II, Section 4.6.3, Exercise 19'를 참조하십시오.

@item 
주어진 요소 집합에 대해 주어진 크기의 모든 서로 다른 멀티 셋을 열거하려면, @ref{1486,,itertools.combinations_with_replacement()}를 참조하십시오:

@example
map(Counter, combinations_with_replacement('ABC', 2)) # --> AA AB AC BB BC CC
@end example
@end itemize


@node deque 객체,defaultdict 객체,Counter 객체,collections — 컨테이너 데이터형
@anchor{library/collections deque-objects}@anchor{299e}
@subsubsection @code{deque} 객체


@geindex deque (collections 클래스)
@anchor{library/collections collections deque}@anchor{7f3}
@deffn {클래스} collections.deque ([iterable[, maxlen]])

`iterable'의 데이터로 왼쪽에서 오른쪽으로 (@ref{299f,,append()}를 사용해서) 초기화된 새 데크(deque) 객체를 반환합니다. `iterable'을 지정하지 않으면, 새 데크는 비어 있습니다.

데크는 스택과 큐를 일반화 한 것입니다 (이름은 “deck”이라고 발음하며 “double-ended queue”의 약자입니다). 데크는 스레드 안전하고 메모리 효율적인 데크의 양쪽 끝에서의 추가(append)와 팝(pop)을 양쪽에서 거의 같은 `O'(1) 성능으로 지원합니다.

@ref{24d,,list} 객체는 유사한 연산을 지원하지만, 빠른 고정 길이 연산에 최적화되어 있으며, 하부 데이터 표현의 크기와 위치를 모두 변경하는 @code{pop(0)}과 @code{insert(0, v)} 연산에 대해 `O'(`n') 메모리 이동 비용이 발생합니다.

`maxlen'이 지정되지 않거나 @code{None}이면, 데크는 임의의 길이로 커질 수 있습니다. 그렇지 않으면, 데크는 지정된 최대 길이로 제한됩니다. 일단 제한된 길이의 데크가 가득 차면, 새 항목이 추가될 때, 해당하는 수의 항목이 반대쪽 끝에서 삭제됩니다. 제한된 길이의 데크는 유닉스의 @code{tail} 필터와 유사한 기능을 제공합니다. 또한 가장 최근 활동만 관심이 있는 트랜잭션과 기타 데이터 풀을 추적하는 데 유용합니다.

deque 객체는 다음 메서드를 지원합니다:

@geindex append() (collections.deque 메서드)
@anchor{library/collections collections deque append}@anchor{299f}
@deffn {메서드} append (item, /)

Add `item' to the right side of the deque.
@end deffn

@geindex appendleft() (collections.deque 메서드)
@anchor{library/collections collections deque appendleft}@anchor{29a0}
@deffn {메서드} appendleft (item, /)

Add `item' to the left side of the deque.
@end deffn

@geindex clear() (collections.deque 메서드)
@anchor{library/collections collections deque clear}@anchor{29a1}
@deffn {메서드} clear ()

데크에서 모든 요소를 제거하고 길이가 0인 상태로 만듭니다.
@end deffn

@geindex copy() (collections.deque 메서드)
@anchor{library/collections collections deque copy}@anchor{fd1}
@deffn {메서드} copy ()

데크의 얕은 복사본을 만듭니다.


Added in version 3.5.

@end deffn

@geindex count() (collections.deque 메서드)
@anchor{library/collections collections deque count}@anchor{13e5}
@deffn {메서드} count (value, /)

Count the number of deque elements equal to `value'.


Added in version 3.2.

@end deffn

@geindex extend() (collections.deque 메서드)
@anchor{library/collections collections deque extend}@anchor{29a2}
@deffn {메서드} extend (iterable, /)

iterable 인자에서 온 요소를 추가하여 데크의 오른쪽을 확장합니다.
@end deffn

@geindex extendleft() (collections.deque 메서드)
@anchor{library/collections collections deque extendleft}@anchor{29a3}
@deffn {메서드} extendleft (iterable, /)

`iterable'에서 온 요소를 추가하여 데크의 왼쪽을 확장합니다. 일련의 왼쪽 추가는 iterable 인자에 있는 요소의 순서를 뒤집는 결과를 줍니다.
@end deffn

@geindex index() (collections.deque 메서드)
@anchor{library/collections collections deque index}@anchor{fcf}
@deffn {메서드} index (value[, start[, stop]])

Return the position of `value' in the deque (at or after index `start'
and before index `stop').  Returns the first match or raises
@ref{2ec,,ValueError} if not found.


Added in version 3.5.

@end deffn

@geindex insert() (collections.deque 메서드)
@anchor{library/collections collections deque insert}@anchor{fd0}
@deffn {메서드} insert (index, value, /)

Insert `value' into the deque at position `index'.

삽입으로 인해 제한된 길이의 데크가 `maxlen' 이상으로 커지면, @ref{173a,,IndexError}가 발생합니다.


Added in version 3.5.

@end deffn

@geindex pop() (collections.deque 메서드)
@anchor{library/collections collections deque pop}@anchor{29a4}
@deffn {메서드} pop ()

데크의 오른쪽에서 요소를 제거하고 반환합니다. 요소가 없으면, @ref{173a,,IndexError}를 발생시킵니다.
@end deffn

@geindex popleft() (collections.deque 메서드)
@anchor{library/collections collections deque popleft}@anchor{29a5}
@deffn {메서드} popleft ()

데크의 왼쪽에서 요소를 제거하고 반환합니다. 요소가 없으면, @ref{173a,,IndexError}를 발생시킵니다.
@end deffn

@geindex remove() (collections.deque 메서드)
@anchor{library/collections collections deque remove}@anchor{1ccc}
@deffn {메서드} remove (value, /)

`value'의 첫 번째 항목을 제거합니다. 찾을 수 없으면, @ref{2ec,,ValueError}를 발생시킵니다.
@end deffn

@geindex reverse() (collections.deque 메서드)
@anchor{library/collections collections deque reverse}@anchor{13e6}
@deffn {메서드} reverse ()

데크의 요소들을 제자리에서 순서를 뒤집고 @code{None}을 반환합니다.


Added in version 3.2.

@end deffn

@geindex rotate() (collections.deque 메서드)
@anchor{library/collections collections deque rotate}@anchor{1c8d}
@deffn {메서드} rotate (n=1, /)

데크를 `n' 단계 오른쪽으로 회전합니다. `n'이 음수이면, 왼쪽으로 회전합니다.

데크가 비어 있지 않으면, 오른쪽으로 한 단계 회전하는 것은 @code{d.appendleft(d.pop())}과 동등하고, 왼쪽으로 한 단계 회전하는 것은 @code{d.append(d.popleft())}와 동등합니다.
@end deffn

데크 객체는 하나의 읽기 전용 어트리뷰트도 제공합니다:

@geindex maxlen (collections.deque의 속성)
@anchor{library/collections collections deque maxlen}@anchor{1509}
@deffn {속성} maxlen

데크의 최대 크기 또는 제한이 없으면 @code{None}.


Added in version 3.1.

@end deffn
@end deffn

상기한 것들 외에도, 데크는 이터레이션, 피클링, @code{len(d)}, @code{reversed(d)}, @code{copy.copy(d)}, @code{copy.deepcopy(d)}, @ref{34b,,in} 연산자를 사용한 멤버십 검사 및 첫 번째 요소를 액세스하는 @code{d[0]}과 같은 서브 스크립트 참조를 지원합니다. 인덱스를 사용하는 액세스는 양쪽 끝에서는 `O'(1) 이지만 중간에서는 `O'(`n') 으로 느려집니다. 빠른 무작위 액세스를 위해서는 대신 리스트를 사용하십시오.

버전 3.5부터, 데크는 @code{__add__()}, @code{__mul__()} 및 @code{__imul__()}을 지원합니다.

예:

@example
>>> from collections import deque
>>> d = deque('ghi')                 # 세 항목의 새 데크를 만듭니다
>>> for elem in d:                   # 데크의 요소들을 이터레이트 합니다
...     print(elem.upper())
G
H
I

>>> d.append('j')                    # 오른쪽에 새 항목을 추가합니다
>>> d.appendleft('f')                # 왼쪽에 새 항목을 추가합니다
>>> d                                # 데크의 표현을 보여줍니다
deque(['f', 'g', 'h', 'i', 'j'])

>>> d.pop()                          # 가장 오른쪽의 항목을 제거하고 반환합니다
'j'
>>> d.popleft()                      # 가장 왼쪽의 항목을 제거하고 반환합니다
'f'
>>> list(d)                          # 데크의 내용을 나열합니다
['g', 'h', 'i']
>>> d[0]                             # 가장 왼쪽의 항목을 들여다봅니다
'g'
>>> d[-1]                            # 가장 오른쪽의 항목을 들여다봅니다
'i'

>>> list(reversed(d))                # 데크의 내용을 역순으로 나열합니다
['i', 'h', 'g']
>>> 'h' in d                         # 데크를 검색합니다
True
>>> d.extend('jkl')                  # 여러 요소를 한 번에 추가합니다
>>> d
deque(['g', 'h', 'i', 'j', 'k', 'l'])
>>> d.rotate(1)                      # 오른쪽으로 회전합니다
>>> d
deque(['l', 'g', 'h', 'i', 'j', 'k'])
>>> d.rotate(-1)                     # 왼쪽으로 회전합니다
>>> d
deque(['g', 'h', 'i', 'j', 'k', 'l'])

>>> deque(reversed(d))               # 역순으로 새 데크를 만듭니다
deque(['l', 'k', 'j', 'i', 'h', 'g'])
>>> d.clear()                        # 데크를 비웁니다
>>> d.pop()                          # 빈 데크에서는 pop 할 수 없습니다
Traceback (most recent call last):
    File "<pyshell#6>", line 1, in -toplevel-
        d.pop()
IndexError: pop from an empty deque

>>> d.extendleft('abc')              # extendleft() 는 입력의 순서를 뒤집습니다
>>> d
deque(['c', 'b', 'a'])
@end example

@menu
* deque 조리법:: 

@end menu

@node deque 조리법,,,deque 객체
@anchor{library/collections deque-recipes}@anchor{29a6}
@subsubsection @code{deque} 조리법


이 절은 데크로 작업하는 다양한 접근 방식을 보여줍니다.

제한된 길이의 데크는 유닉스의 @code{tail} 필터와 유사한 기능을 제공합니다:

@example
def tail(filename, n=10):
    '파일의 마지막 n 줄을 반환합니다'
    with open(filename) as f:
        return deque(f, n)
@end example

데크를 사용하는 또 다른 접근법은 오른쪽에 추가하고 왼쪽에서 팝 하여 최근에 추가된 요소의 시퀀스를 유지하는 것입니다:

@example
def moving_average(iterable, n=3):
    # moving_average([40, 30, 50, 46, 39, 44]) --> 40.0 42.0 45.0 43.0
    # https://en.wikipedia.org/wiki/Moving_average
    it = iter(iterable)
    d = deque(itertools.islice(it, n-1))
    d.appendleft(0)
    s = sum(d)
    for elem in it:
        s += elem - d.popleft()
        d.append(elem)
        yield s / n
@end example

라운드 로빈 스케줄러(round-robin scheduler)@footnote{https://en.wikipedia.org/wiki/Round-robin_scheduling}는 @ref{7f3,,deque}에 저장된 입력 이터레이터로 구현할 수 있습니다. 위치 0에 있는 활성 이터레이터에서 값이 산출됩니다. 그 이터레이터가 소진되면, @ref{29a5,,popleft()}로 제거할 수 있습니다; 그렇지 않으면, @ref{1c8d,,rotate()} 메서드로 끝으로 보내 순환할 수 있습니다:

@example
def roundrobin(*iterables):
    "roundrobin('ABC', 'D', 'EF') --> A D E B F C"
    iterators = deque(map(iter, iterables))
    while iterators:
        try:
            while True:
                yield next(iterators[0])
                iterators.rotate(-1)
        except StopIteration:
            # 소진된 이터레이터를 제거합니다.
            iterators.popleft()
@end example

@ref{1c8d,,rotate()} 메서드는 @ref{7f3,,deque} 슬라이싱과 삭제를 구현하는 방법을 제공합니다. 예를 들어, @code{del d[n]}의 순수 파이썬 구현은 팝 될 요소의 위치를 잡기 위해 @code{rotate()} 메서드에 의존합니다:

@example
def delete_nth(d, n):
    d.rotate(-n)
    d.popleft()
    d.rotate(n)
@end example

@ref{7f3,,deque} 슬라이싱을 구현하려면, 대상 요소를 데크의 왼쪽으로 가져오기 위해 @ref{1c8d,,rotate()}를 적용하는 유사한 접근법을 사용하십시오. @ref{29a5,,popleft()}로 이전 항목을 제거하고, @ref{29a2,,extend()}로 새 항목을 추가한 다음, 회전을 되돌립니다. 이 접근 방식에 약간의 변형을 가하면, @code{dup}, @code{drop}, @code{swap}, @code{over}, @code{pick}, @code{rot} 및 @code{roll}과 같은 Forth 스타일 스택 조작을 쉽게 구현할 수 있습니다.

@node defaultdict 객체,이름있는 필드를 가진 튜플을 위한 namedtuple 팩토리 함수,deque 객체,collections — 컨테이너 데이터형
@anchor{library/collections defaultdict-objects}@anchor{29a7}
@subsubsection @code{defaultdict} 객체


@geindex defaultdict (collections 클래스)
@anchor{library/collections collections defaultdict}@anchor{13c1}
@deffn {클래스} collections.defaultdict (default_factory=None, /, **kwargs)

@deffnx {클래스} collections.defaultdict (default_factory, mapping, /, **kwargs)

@deffnx {클래스} collections.defaultdict (default_factory, iterable, /, **kwargs)

새 딕셔너리류 객체를 반환합니다. @ref{13c1,,defaultdict}는 내장 @ref{183,,dict} 클래스의 서브 클래스입니다. 하나의 메서드를 재정의하고 하나의 쓰기 가능한 인스턴스 변수를 추가합니다. 나머지 기능은 @code{dict} 클래스와 같고 여기에 설명하지 않습니다.

첫 번째 인자는 @ref{29a8,,default_factory} 어트리뷰트의 초깃값을 제공합니다; 기본값은 @code{None}입니다. 나머지 모든 인자는 키워드 인자를 포함하여 @ref{183,,dict} 생성자에 전달될 때와 마찬가지로 취급됩니다.

@ref{13c1,,defaultdict} 객체는 표준 @ref{183,,dict} 연산 외에도 다음 메서드를 지원합니다:

@geindex __missing__() (collections.defaultdict 메서드)
@anchor{library/collections collections defaultdict __missing__}@anchor{29a9}
@deffn {메서드} __missing__ (key, /)

@ref{29a8,,default_factory} 어트리뷰트가 @code{None}이면, `key'를 인자로 사용하는 @ref{5e5,,KeyError} 예외가 발생합니다.

@ref{29a8,,default_factory}가 @code{None}이 아니면, 주어진 `key'에 대한 기본값을 제공하기 위해 인자 없이 호출되며, 반환 값은 `key'로 딕셔너리에 삽입되고 반환됩니다.

@ref{29a8,,default_factory}를 호출할 때 예외가 발생하면 이 예외는 변경되지 않고 전파됩니다.

이 메서드는 요청된 키를 찾을 수 없을 때 @ref{183,,dict} 클래스의 @ref{588,,__getitem__()} 메서드에 의해 호출됩니다; 이것이 반환하거나 발생시키는 모든 것은, @code{__getitem__()}이 반환하거나 발생시킵니다.

@ref{29a9,,__missing__()}은 @ref{588,,__getitem__()} 이외의 어떤 연산에서도 호출되지 `않음'에 유의하십시오. 이것은 @ref{2032,,get()}이 일반 딕셔너리와 마찬가지로 @ref{29a8,,default_factory}를 사용하지 않고 @code{None}을 기본값으로 반환한다는 것을 의미합니다.
@end deffn

@ref{13c1,,defaultdict} 객체는 다음 인스턴스 변수를 지원합니다:

@geindex default_factory (collections.defaultdict의 속성)
@anchor{library/collections collections defaultdict default_factory}@anchor{29a8}
@deffn {속성} default_factory

This attribute is used by the @ref{29a9,,__missing__()} method;
it is initialized from the first argument to the constructor, if present,
or to @code{None}, if absent.
@end deffn


버전 3.9에서 변경: 
@geindex Python 향상 제안; PEP 584
PEP 584@footnote{https://peps.python.org/pep-0584/}에 지정된, 병합(@code{|})과 업데이트(@code{|=}) 연산자가 추가되었습니다.

@end deffn

@menu
* defaultdict 예:: 

@end menu

@node defaultdict 예,,,defaultdict 객체
@anchor{library/collections defaultdict-examples}@anchor{29aa}
@subsubsection @code{defaultdict} 예


@ref{24d,,list}를 @ref{29a8,,default_factory}로 사용하면, 키-값 쌍의 시퀀스를 리스트의 딕셔너리로 쉽게 그룹화 할 수 있습니다:

@example
>>> s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
>>> d = defaultdict(list)
>>> for k, v in s:
...     d[k].append(v)
...
>>> sorted(d.items())
[('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]
@end example

When each key is encountered for the first time, it is not already in the
mapping; so an entry is automatically created using the @ref{29a8,,default_factory}
function which returns an empty @ref{24d,,list}.  The @ref{8db,,list.append()}
operation then attaches the value to the new list.  When keys are encountered
again, the look-up proceeds normally (returning the list for that key) and the
@code{list.append()} operation adds another value to the list. This technique is
simpler and faster than an equivalent technique using @ref{1278,,dict.setdefault()}:

@example
>>> d = @{@}
>>> for k, v in s:
...     d.setdefault(k, []).append(v)
...
>>> sorted(d.items())
[('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]
@end example

@ref{29a8,,default_factory}를 @ref{19b,,int}로 설정하면 @ref{13c1,,defaultdict}를 세는(counting) 데 유용하게 사용할 수 있습니다 (다른 언어의 백(bag)이나 멀티 셋(multiset)처럼):

@example
>>> s = 'mississippi'
>>> d = defaultdict(int)
>>> for k in s:
...     d[k] += 1
...
>>> sorted(d.items())
[('i', 4), ('m', 1), ('p', 2), ('s', 4)]
@end example

글자가 처음 발견될 때, 매핑에서 누락되었으므로, @ref{29a8,,default_factory} 함수는 @ref{19b,,int()}를 호출하여 기본 계수 0을 제공합니다. 증분 연산은 각 문자의 개수를 쌓아나갑니다.

항상 0을 반환하는 함수 @ref{19b,,int()}는 상수 함수의 특별한 경우일 뿐입니다. 상수 함수를 만드는 더 빠르고 유연한 방법은 (단지 0이 아니라) 임의의 상숫값을 제공 할 수 있는 람다 함수를 사용하는 것입니다:

@example
>>> def constant_factory(value):
...     return lambda: value
...
>>> d = defaultdict(constant_factory('<missing>'))
>>> d.update(name='John', action='ran')
>>> '%(name)s %(action)s to %(object)s' % d
'John ran to <missing>'
@end example

@ref{29a8,,default_factory}를 @ref{184,,set}으로 설정하면, @ref{13c1,,defaultdict}를 집합의 딕셔너리를 만드는 데 유용하게 만듭니다:

@example
>>> s = [('red', 1), ('blue', 2), ('red', 3), ('blue', 4), ('red', 1), ('blue', 4)]
>>> d = defaultdict(set)
>>> for k, v in s:
...     d[k].add(v)
...
>>> sorted(d.items())
[('blue', @{2, 4@}), ('red', @{1, 3@})]
@end example

@node 이름있는 필드를 가진 튜플을 위한 namedtuple 팩토리 함수,OrderedDict 객체,defaultdict 객체,collections — 컨테이너 데이터형
@anchor{library/collections namedtuple-factory-function-for-tuples-with-named-fields}@anchor{29ab}
@subsubsection 이름있는 필드를 가진 튜플을 위한 @code{namedtuple()} 팩토리 함수


네임드 튜플은 튜플의 각 위치에 의미를 부여하고 더 읽기 쉽고 스스로 설명하는 코드를 만들도록 합니다. 일반 튜플이 사용되는 곳이라면 어디에서나 사용할 수 있으며, 위치 인덱스 대신 이름으로 필드에 액세스하는 기능을 추가합니다.

@geindex namedtuple() (collections 모듈)
@anchor{library/collections collections namedtuple}@anchor{4e0}
@deffn {함수} collections.namedtuple (typename, field_names, *, rename=False, defaults=None, module=None)

`typename'이라는 이름의 새 튜플 서브 클래스를 반환합니다. 새로운 서브 클래스는 인덱싱되고 이터러블일 뿐만 아니라 어트리뷰트 조회로 액세스 할 수 있는 필드를 갖는 튜플류 객체를 만드는 데 사용됩니다. 서브 클래스의 인스턴스에는 유용한 독스트링(`typename'과 `field_names'를 포함합니다)과 튜플 내용을 @code{name=value} 형식으로 나열하는 유용한 @ref{82e,,__repr__()} 메서드가 있습니다.

`field_names'는 @code{['x', 'y']}와 같은 문자열의 시퀀스입니다. 또는, `field_names'는 각 필드명이 공백 및/또는 쉼표로 구분된 단일 문자열일 수 있습니다, 예를 들어 @code{'x y'}나 @code{'x, y'}.

밑줄로 시작하는 이름을 제외한 모든 유효한 파이썬 식별자를 필드명에 사용할 수 있습니다. 유효한 식별자는 글자, 숫자 및 밑줄로 구성되지만, 숫자나 밑줄로 시작하지 않으며 `class', `for', `return', `global', `pass' 또는 `raise'와 같은 @ref{88,,keyword}일 수 없습니다.

`rename'이 참이면, 유효하지 않은 필드명은 위치 이름으로 자동 대체됩니다. 예를 들어, @code{['abc', 'def', 'ghi', 'abc']}는 @code{['abc', '_1', 'ghi', '_3']}으로 변환되어 키워드 @code{def}와 중복된 필드명 @code{abc}를 제거합니다.

`defaults'는 @code{None}이나 기본값의 @ref{142c,,이터러블} 일 수 있습니다. 기본값이 있는 필드는 기본값이 없는 필드 뒤에 와야 하므로, `defaults'는 가장 오른쪽의 매개 변수에 적용됩니다. 예를 들어, field_names가 @code{['x', 'y', 'z']}이고 defaults가 @code{(1, 2)}이면 @code{x}는 필수 인자이고, @code{y}의 기본값은 @code{1}, @code{z}의 기본값은 @code{2}입니다.

`module'이 정의되면, 네임드 튜플의 @ref{615,,__module__} 어트리뷰트가 해당 값으로 설정됩니다.

네임드 튜플 인스턴스에는 인스턴스 별 딕셔너리가 없어서, 가볍고 일반 튜플보다 더 많은 메모리가 필요하지 않습니다.

피클링을 지원하려면, 네임드 튜플 클래스를 `typename'과 일치하는 변수에 대입해야 합니다.


버전 3.1에서 변경: `rename'에 대한 지원이 추가되었습니다.



버전 3.6에서 변경: `verbose'와 `rename' 매개 변수는 @ref{5a4,,키워드 전용 인자}가 되었습니다.



버전 3.6에서 변경: `module' 매개 변수를 추가했습니다.



버전 3.7에서 변경: `verbose' 매개 변수와 @code{_source} 어트리뷰트를 제거했습니다.



버전 3.7에서 변경: `defaults' 매개 변수와 @ref{29ac,,_field_defaults} 어트리뷰트가 추가되었습니다.

@end deffn

@example
>>> # Basic example
>>> Point = namedtuple('Point', ['x', 'y'])
>>> p = Point(11, y=22)     # 위치와 키워드 인자로 인스턴스를 만듭니다
>>> p[0] + p[1]             # 일반 튜플 (11, 22) 처럼 인덱싱할 수 있습니다
33
>>> x, y = p                # 일반 튜플처럼 언팩합니다
>>> x, y
(11, 22)
>>> p.x + p.y               # 필드는 이름으로도 액세스할 수 있습니다
33
>>> p                       # name=value 스타일의 가독성 있는 __repr__
Point(x=11, y=22)
@end example

네임드 튜플은 @ref{2d,,csv} 나 @ref{d4,,sqlite3} 모듈이 반환한 결과 튜플에 필드 이름을 할당하는 데 특히 유용합니다:

@example
EmployeeRecord = namedtuple('EmployeeRecord', 'name, age, title, department, paygrade')

import csv
for emp in map(EmployeeRecord._make, csv.reader(open("employees.csv", "rb"))):
    print(emp.name, emp.title)

import sqlite3
conn = sqlite3.connect('/companydata')
cursor = conn.cursor()
cursor.execute('SELECT name, age, title, department, paygrade FROM employees')
for emp in map(EmployeeRecord._make, cursor.fetchall()):
    print(emp.name, emp.title)
@end example

튜플에서 상속된 메서드 외에도 네임드 튜플은 세 가지 추가 메서드와 두 가지 어트리뷰트를 지원합니다. 필드 이름과의 충돌을 방지하기 위해, 메서드와 어트리뷰트 이름은 밑줄로 시작합니다.

@geindex _make() (collections.somenamedtuple의 클래스 메서드)
@anchor{library/collections collections somenamedtuple _make}@anchor{29ad}
@deffn {메서드} classmethod somenamedtuple._make (iterable, /)

기존 시퀀스나 이터러블로 새 인스턴스를 만드는 클래스 메서드.

@example
>>> t = [11, 22]
>>> Point._make(t)
Point(x=11, y=22)
@end example
@end deffn

@geindex _asdict() (collections.somenamedtuple 메서드)
@anchor{library/collections collections somenamedtuple _asdict}@anchor{bd3}
@deffn {메서드} somenamedtuple._asdict ()

필드 이름을 해당 값으로 매핑하는 새 @ref{183,,dict}를 반환합니다:

@example
>>> p = Point(x=11, y=22)
>>> p._asdict()
@{'x': 11, 'y': 22@}
@end example


버전 3.1에서 변경: 일반 @ref{183,,dict} 대신 @ref{7f2,,OrderedDict}를 반환합니다.



버전 3.8에서 변경: @ref{7f2,,OrderedDict} 대신 일반 @ref{183,,dict}를 반환합니다. 파이썬 3.7부터, 일반 딕셔너리의 순서가 유지되도록 보장합니다. @code{OrderedDict}의 추가 기능이 필요할 때, 제안하는 처방은 결과를 원하는 형으로 캐스트 하는 것입니다: @code{OrderedDict(nt._asdict())}.

@end deffn

@geindex _replace() (collections.somenamedtuple 메서드)
@anchor{library/collections collections somenamedtuple _replace}@anchor{29ae}
@deffn {메서드} somenamedtuple._replace (**kwargs)

지정된 필드들을 새로운 값으로 치환하는 네임드 튜플의 새 인스턴스를 반환합니다:

@example
>>> p = Point(x=11, y=22)
>>> p._replace(x=33)
Point(x=33, y=22)

>>> for partnum, record in inventory.items():
...     inventory[partnum] = record._replace(price=newprices[partnum], timestamp=time.now())
@end example

Named tuples are also supported by generic function @ref{1c0,,copy.replace()}.


버전 3.13에서 변경: Raise @ref{198,,TypeError} instead of @ref{2ec,,ValueError} for invalid
keyword arguments.

@end deffn

@geindex _fields (collections.somenamedtuple의 속성)
@anchor{library/collections collections somenamedtuple _fields}@anchor{29af}
@deffn {속성} somenamedtuple._fields

필드 이름을 나열하는 문자열의 튜플. 인트로스펙션과 기존 네임드 튜플에서 새로운 네임드 튜플 형을 만드는 데 유용합니다.

@example
>>> p._fields            # 필드 이름을 봅니다
('x', 'y')

>>> Color = namedtuple('Color', 'red green blue')
>>> Pixel = namedtuple('Pixel', Point._fields + Color._fields)
>>> Pixel(11, 22, 128, 255, 0)
Pixel(x=11, y=22, red=128, green=255, blue=0)
@end example
@end deffn

@geindex _field_defaults (collections.somenamedtuple의 속성)
@anchor{library/collections collections somenamedtuple _field_defaults}@anchor{29ac}
@deffn {속성} somenamedtuple._field_defaults

필드 이름을 기본값으로 매핑하는 딕셔너리.

@example
>>> Account = namedtuple('Account', ['type', 'balance'], defaults=[0])
>>> Account._field_defaults
@{'balance': 0@}
>>> Account('premium')
Account(type='premium', balance=0)
@end example
@end deffn

이름이 문자열에 저장된 필드를 조회하려면 @ref{dc9,,getattr()} 함수를 사용하십시오.:

@example
>>> getattr(p, 'x')
11
@end example

딕셔너리를 네임드 튜플로 변환하려면 이중 애스터리스크 연산자를 사용하십시오 (@ref{200f,,인자 목록 언 패킹}에서 설명합니다).:

@example
>>> d = @{'x': 11, 'y': 22@}
>>> Point(**d)
Point(x=11, y=22)
@end example

네임드 튜플은 일반적인 파이썬 클래스이므로, 서브 클래스를 사용하여 기능을 쉽게 추가하거나 변경할 수 있습니다. 계산된 필드와 고정 너비 인쇄 포맷을 추가하는 방법은 다음과 같습니다:

@example
>>> class Point(namedtuple('Point', ['x', 'y'])):
...     __slots__ = ()
...     @@property
...     def hypot(self):
...         return (self.x ** 2 + self.y ** 2) ** 0.5
...     def __str__(self):
...         return 'Point: x=%6.3f  y=%6.3f  hypot=%6.3f' % (self.x, self.y, self.hypot)

>>> for p in Point(3, 4), Point(14, 5/7):
...     print(p)
Point: x= 3.000  y= 4.000  hypot= 5.000
Point: x=14.000  y= 0.714  hypot=14.018
@end example

위에 표시된 서브 클래스는 @code{__slots__}를 빈 튜플로 설정합니다. 이렇게 하면 인스턴스 딕셔너리 생성을 방지하여 메모리 요구 사항을 낮게 유지할 수 있습니다.

서브 클래싱은 저장된 새 필드를 추가하는 데는 유용하지 않습니다. 대신, @ref{29af,,_fields} 어트리뷰트로 새로운 네임드 튜플 형을 만드십시오:

@example
>>> Point3D = namedtuple('Point3D', Point._fields + ('z',))
@end example

@code{__doc__} 필드에 직접 대입하여 독스트링을 사용자 정의할 수 있습니다:

@example
>>> Book = namedtuple('Book', ['id', 'title', 'authors'])
>>> Book.__doc__ += ': Hardcover book in active collection'
>>> Book.id.__doc__ = '13-digit ISBN'
>>> Book.title.__doc__ = 'Title of first printing'
>>> Book.authors.__doc__ = 'List of authors sorted by last name'
@end example


버전 3.5에서 변경: 프로퍼티 독스트링이 쓰기 가능하게 되었습니다.



@subsubheading 더 보기



@itemize *

@item 
네임드 튜플에 형 힌트를 추가하는 방법은 @ref{331,,typing.NamedTuple}을 참조하십시오. 이것은 @ref{14dc,,class} 키워드를 사용하는 우아한 표기법도 제공합니다:

@example
class Component(NamedTuple):
    part_number: int
    weight: float
    description: Optional[str] = None
@end example

@item 
튜플 대신 하부 딕셔너리를 기반으로 하는 가변 이름 공간에 대해서는 @ref{4e5,,types.SimpleNamespace()}를 참조하십시오.

@item 
@ref{33,,dataclasses} 모듈은 사용자 정의 클래스에 생성된 특수 메서드를 자동으로 추가하는 데코레이터와 함수를 제공합니다.
@end itemize


@node OrderedDict 객체,UserDict 객체,이름있는 필드를 가진 튜플을 위한 namedtuple 팩토리 함수,collections — 컨테이너 데이터형
@anchor{library/collections ordereddict-objects}@anchor{29b0}
@subsubsection @code{OrderedDict} 객체


순서 있는 딕셔너리는 일반 딕셔너리와 비슷하지만, 순서를 다루는 연산과 관련된 몇 가지 추가 기능이 있습니다. 내장 @ref{183,,dict} 클래스가 삽입 순서를 기억하는 기능을 얻었으므로 (이 새로운 동작은 파이썬 3.7에서 보장되었습니다), 이제 덜 중요해졌습니다.

몇 가지 @ref{183,,dict}와의 차이점은 여전히 남아 있습니다:


@itemize *

@item 
일반 @ref{183,,dict}는 매핑 연산에 매우 적합하도록 설계되었습니다. 삽입 순서 추적은 부차적입니다.

@item 
@ref{7f2,,OrderedDict}는 순서를 바꾸는 연산에 적합하도록 설계되었습니다. 공간 효율성, 이터레이션 속도 및 갱신 연산의 성능은 부차적입니다.

@item 
@ref{7f2,,OrderedDict} 알고리즘은 @ref{183,,dict}보다 빈번한 순서 변경 연산을 더 잘 처리할 수 있습니다. 아래의 조리법에서 볼 수 있듯이, 이는 다양한 종류의 LRU 캐시를 구현하는 데 적합합니다.

@item 
@ref{7f2,,OrderedDict}의 동등 비교 연산은 순서의 일치를 확인합니다.

A regular @ref{183,,dict} can emulate the order sensitive equality test with
@code{p == q and all(k1 == k2 for k1, k2 in zip(p, q))}.

@item 
@ref{7f2,,OrderedDict}의 @ref{14f2,,popitem()} 메서드는 서명이 다릅니다. 어떤 항목을 팝 할지는 지정하는 선택적 인자를 받아들입니다.

A regular @ref{183,,dict} can emulate OrderedDict’s @code{od.popitem(last=True)}
with @code{d.popitem()} which is guaranteed to pop the rightmost (last) item.

A regular @ref{183,,dict} can emulate OrderedDict’s @code{od.popitem(last=False)}
with @code{(k := next(iter(d)), d.pop(k))} which will return and remove the
leftmost (first) item if it exists.

@item 
@ref{7f2,,OrderedDict}에는 요소를 효율적으로 끝으로 재배치하는 @ref{13e4,,move_to_end()} 메서드가 있습니다.

A regular @ref{183,,dict} can emulate OrderedDict’s @code{od.move_to_end(k,
last=True)} with @code{d[k] = d.pop(k)} which will move the key and its
associated value to the rightmost (last) position.

A regular @ref{183,,dict} does not have an efficient equivalent for
OrderedDict’s @code{od.move_to_end(k, last=False)} which moves the key
and its associated value to the leftmost (first) position.

@item 
파이썬 3.8 이전에는, @ref{183,,dict}에 @ref{e85,,__reversed__()} 메서드가 없었습니다.
@end itemize

@geindex OrderedDict (collections 클래스)
@anchor{library/collections collections OrderedDict}@anchor{7f2}
@deffn {클래스} collections.OrderedDict (**kwargs)

@deffnx {클래스} collections.OrderedDict (mapping, /, **kwargs)

@deffnx {클래스} collections.OrderedDict (iterable, /, **kwargs)

딕셔너리 순서 재배치에 특화된 메서드가 있는 @ref{183,,dict} 서브 클래스의 인스턴스를 반환합니다.


Added in version 3.1.


@geindex popitem() (collections.OrderedDict 메서드)
@anchor{library/collections collections OrderedDict popitem}@anchor{14f2}
@deffn {메서드} popitem (last=True)

순서 있는 딕셔너리의 @ref{14f2,,popitem()} 메서드는 (키, 값) 쌍을 반환하고 제거합니다. `last'가 참이면 쌍이 @abbr{LIFO} 순서로 반환되고, 거짓이면 @abbr{FIFO,first-in@comma{} first-out - 선입선출} 순서로 반환됩니다.
@end deffn

@geindex move_to_end() (collections.OrderedDict 메서드)
@anchor{library/collections collections OrderedDict move_to_end}@anchor{13e4}
@deffn {메서드} move_to_end (key, last=True)

기존 `key'를 순서 있는 딕셔너리의 한쪽 끝으로 옮깁니다. `last'가 참(기본값)이면 항목은 오른쪽 끝으로 이동하고, `last'가 거짓이면 처음으로 이동합니다. `key'가 존재하지 않으면 @ref{5e5,,KeyError}가 발생합니다:

@example
>>> d = OrderedDict.fromkeys('abcde')
>>> d.move_to_end('b')
>>> '@w{'}.join(d)
'acdeb'
>>> d.move_to_end('b', last=False)
>>> '@w{'}.join(d)
'bacde'
@end example


Added in version 3.2.

@end deffn
@end deffn

일반적인 매핑 메서드 외에도 순서 있는 딕셔너리는 @ref{a65,,reversed()}를 사용하는 역 이터레이션을 지원합니다.
@anchor{library/collections collections-ordereddict-eq}@anchor{194a}
@ref{7f2,,OrderedDict} 객체 간의 동등성(equality) 테스트는 순서를 고려하며 대략 @code{list(od1.items())==list(od2.items())}와 동등합니다.

@ref{7f2,,OrderedDict} 객체와 다른 @ref{ac7,,Mapping} 객체 간의 동등성 테스트는 일반 딕셔너리처럼 순서를 고려하지 않습니다. 이 때문에 @code{OrderedDict} 객체를 일반 딕셔너리가 사용되는 모든 곳에 대체 할 수 있습니다.


버전 3.5에서 변경: @ref{7f2,,OrderedDict}의 items, keys 및 values @ref{29b1,,뷰}는 이제 @ref{a65,,reversed()}를 사용하는 역 이터레이션을 지원합니다.



버전 3.6에서 변경: 
@geindex Python 향상 제안; PEP 468
PEP 468@footnote{https://peps.python.org/pep-0468/}을 수락함에 따라, @ref{7f2,,OrderedDict} 생성자와 @ref{166a,,update()} 메서드로 전달된 키워드 인자의 순서가 보존됩니다.



버전 3.9에서 변경: 
@geindex Python 향상 제안; PEP 584
PEP 584@footnote{https://peps.python.org/pep-0584/}에 지정된, 병합(@code{|})과 업데이트(@code{|=}) 연산자가 추가되었습니다.


@menu
* OrderedDict 예제와 조리법:: 

@end menu

@node OrderedDict 예제와 조리법,,,OrderedDict 객체
@anchor{library/collections ordereddict-examples-and-recipes}@anchor{29b2}
@subsubsection @code{OrderedDict} 예제와 조리법


키가 `마지막에' 삽입된 순서를 기억하는 순서 있는 딕셔너리 변형을 만드는 것은 간단합니다. 새 항목이 기존 항목을 덮어쓰면, 원래 삽입 위치가 변경되고 끝으로 이동합니다:

@example
class LastUpdatedOrderedDict(OrderedDict):
    '키가 마지막에 삽입된 순서로 항목을 저장합니다'

    def __setitem__(self, key, value):
        super().__setitem__(key, value)
        self.move_to_end(key)
@end example

@ref{7f2,,OrderedDict}는 @ref{be1,,functools.lru_cache()}의 변형을 구현하는 데에도 유용합니다:

@example
from collections import OrderedDict
from time import time

class TimeBoundedLRU:
    "오래된 항목을 무효화하고 새로 고치는 LRU 캐시."

    def __init__(self, func, maxsize=128, maxage=30):
        self.cache = OrderedDict()      # @{ args : (timestamp, result)@}
        self.func = func
        self.maxsize = maxsize
        self.maxage = maxage

    def __call__(self, *args):
        if args in self.cache:
            self.cache.move_to_end(args)
            timestamp, result = self.cache[args]
            if time() - timestamp <= self.maxage:
                return result
        result = self.func(*args)
        self.cache[args] = time(), result
        if len(self.cache) > self.maxsize:
            self.cache.popitem(last=False)
        return result
@end example

@example
class MultiHitLRUCache:
    """ 여러 번 요청될 때까지 결과 캐싱을
         지연시키는 LRU 캐시.

        일회성 요청으로 인해 LRU 캐시를 비우는 것을 방지하기 위해,
        요청이 두 번 이상 이루어질 때까지 개시하지 않습니다.

    """

    def __init__(self, func, maxsize=128, maxrequests=4096, cache_after=1):
        self.requests = OrderedDict()   # @{ uncached_key : request_count @}
        self.cache = OrderedDict()      # @{ cached_key : function_result @}
        self.func = func
        self.maxrequests = maxrequests  # 캐시되지 않은 요청의 최대 수
        self.maxsize = maxsize          # 저장된 반환값의 최대 수
        self.cache_after = cache_after

    def __call__(self, *args):
        if args in self.cache:
            self.cache.move_to_end(args)
            return self.cache[args]
        result = self.func(*args)
        self.requests[args] = self.requests.get(args, 0) + 1
        if self.requests[args] <= self.cache_after:
            self.requests.move_to_end(args)
            if len(self.requests) > self.maxrequests:
                self.requests.popitem(last=False)
        else:
            self.requests.pop(args, None)
            self.cache[args] = result
            if len(self.cache) > self.maxsize:
                self.cache.popitem(last=False)
        return result
@end example

@c >>> def square(x):
@c ...     return x * x
@c ...
@c >>> f = MultiHitLRUCache(square, maxsize=4, maxrequests=6)
@c >>> list(map(f, range(10)))  # First requests, don't cache
@c [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
@c >>> f(4)  # Cache the second request
@c 16
@c >>> f(6)  # Cache the second request
@c 36
@c >>> f(2)  # The first request aged out, so don't cache
@c 4
@c >>> f(6)  # Cache hit
@c 36
@c >>> f(4)  # Cache hit and move to front
@c 16
@c >>> list(f.cache.values())
@c [36, 16]
@c >>> set(f.requests).isdisjoint(f.cache)
@c True
@c >>> list(map(f, [9, 8, 7]))   # Cache these second requests
@c [81, 64, 49]
@c >>> list(map(f, [7, 9]))  # Cache hits
@c [49, 81]
@c >>> list(f.cache.values())
@c [16, 64, 49, 81]
@c >>> set(f.requests).isdisjoint(f.cache)
@c True

@node UserDict 객체,UserList 객체,OrderedDict 객체,collections — 컨테이너 데이터형
@anchor{library/collections userdict-objects}@anchor{29b3}
@subsubsection @code{UserDict} 객체


@ref{1d7b,,UserDict} 클래스는 딕셔너리 객체를 감싸는 래퍼 역할을 합니다. 이 클래스의 필요성은 @ref{183,,dict}에서 직접 서브 클래싱 할 수 있는 능력에 의해 부분적으로 대체되었습니다; 그러나 하부 딕셔너리를 어트리뷰트로 액세스 할 수 있어서, 이 클래스를 사용하면 작업하기가 더 쉬울 수 있습니다.

@geindex UserDict (collections 클래스)
@anchor{library/collections collections UserDict}@anchor{1d7b}
@deffn {클래스} collections.UserDict (**kwargs)

@deffnx {클래스} collections.UserDict (mapping, /, **kwargs)

@deffnx {클래스} collections.UserDict (iterable, /, **kwargs)

Class that simulates a dictionary.  The instance’s contents are kept in a
regular dictionary, which is accessible via the @ref{29b4,,data} attribute of
@code{UserDict} instances.  If arguments are provided, they are used to
initialize @code{data}, like a regular dictionary.

In addition to supporting the methods and operations of mappings,
@code{UserDict} instances provide the following attribute:

@geindex data (collections.UserDict의 속성)
@anchor{library/collections collections UserDict data}@anchor{29b4}
@deffn {속성} data

@ref{1d7b,,UserDict} 클래스의 내용을 저장하는 데 사용되는 실제 딕셔너리.
@end deffn
@end deffn

@node UserList 객체,UserString 객체,UserDict 객체,collections — 컨테이너 데이터형
@anchor{library/collections userlist-objects}@anchor{29b5}
@subsubsection @code{UserList} 객체


이 클래스는 리스트 객체를 둘러싸는 래퍼 역할을 합니다. 여러분 자신의 리스트류 클래스가 상속하고 기존 메서드를 재정의하거나 새로운 메서드를 추가할 수 있는 유용한 베이스 클래스입니다. 이런 식으로 리스트에 새로운 동작을 추가 할 수 있습니다.

이 클래스의 필요성은 @ref{24d,,list}에서 직접 서브 클래싱할 수 있는 능력에 의해 부분적으로 대체되었습니다; 그러나 하부 리스트에 어트리뷰트로 액세스할 수 있어서, 이 클래스를 사용하면 작업하기가 더 쉬울 수 있습니다.

@geindex UserList (collections 클래스)
@anchor{library/collections collections UserList}@anchor{16e9}
@deffn {클래스} collections.UserList ([list])

리스트를 시뮬레이트 하는 클래스. 인스턴스의 내용은 일반 리스트로 유지되며 @ref{16e9,,UserList} 인스턴스의 @ref{29b6,,data} 어트리뷰트를 통해 액세스 할 수 있습니다. 인스턴스의 내용은 초기에 `list'의 사본으로 설정되며, 기본값은 빈 목록 @code{[]}입니다. `list'는 모든 이터러블일 수 있습니다, 예를 들어 실제 파이썬 리스트나 @code{UserList} 객체.

@ref{16e9,,UserList} 인스턴스는 가변 시퀀스의 메서드와 연산을 지원할 뿐만 아니라 다음 어트리뷰트를 제공합니다:

@geindex data (collections.UserList의 속성)
@anchor{library/collections collections UserList data}@anchor{29b6}
@deffn {속성} data

@ref{16e9,,UserList} 클래스의 내용을 저장하는 데 사용되는 실제 @ref{24d,,list} 객체.
@end deffn
@end deffn

`서브 클래싱 요구 사항:' @ref{16e9,,UserList}의 서브 클래스는 인자가 없거나 하나의 인자로 호출 할 수 있는 생성자를 제공해야 합니다. 새 시퀀스를 반환하는 리스트 연산은 실제 구현 클래스의 인스턴스를 만들려고 시도합니다. 이를 위해, 데이터 소스로 사용되는 시퀀스 객체인 단일 매개 변수로 생성자를 호출할 수 있다고 가정합니다.

파생 클래스가 이 요구 사항을 준수하고 싶지 않다면, 이 클래스에서 지원하는 모든 특수 메서드를 재정의해야 합니다; 이때 제공해야 하는 메서드에 대한 정보는 소스를 참조하십시오.

@node UserString 객체,,UserList 객체,collections — 컨테이너 데이터형
@anchor{library/collections userstring-objects}@anchor{29b7}
@subsubsection @code{UserString} 객체


@ref{fd2,,UserString} 클래스는 문자열 객체를 둘러싸는 래퍼 역할을 합니다. 이 클래스의 필요성은 @ref{169,,str}에서 직접 서브 클래싱할 수 있는 능력에 의해 부분적으로 대체되었습니다; 그러나 하부 문자열을 어트리뷰트로 액세스할 수 있어서, 이 클래스를 사용하면 작업하기가 더 쉬울 수 있습니다.

@geindex UserString (collections 클래스)
@anchor{library/collections collections UserString}@anchor{fd2}
@deffn {클래스} collections.UserString (seq)

문자열 객체를 시뮬레이트 하는 클래스. 인스턴스의 내용은 일반 문자열 객체로 유지되며, @ref{fd2,,UserString} 인스턴스의 @ref{29b8,,data} 어트리뷰트를 통해 액세스 할 수 있습니다. 인스턴스의 내용은 처음에 `seq'의 사본으로 설정됩니다. `seq' 인자는 내장 @ref{169,,str()} 함수를 사용하여 문자열로 변환 할 수 있는 모든 객체가 될 수 있습니다.

@ref{fd2,,UserString} 인스턴스는 문자열의 메서드와 연산을 지원할 뿐만 아니라 다음과 같은 어트리뷰트를 제공합니다:

@geindex data (collections.UserString의 속성)
@anchor{library/collections collections UserString data}@anchor{29b8}
@deffn {속성} data

@ref{fd2,,UserString} 클래스의 내용을 저장하는 데 사용되는 실제 @ref{169,,str} 객체.
@end deffn


버전 3.5에서 변경: 새로운 메서드 @code{__getnewargs__}, @code{__rmod__}, @code{casefold}, @code{format_map}, @code{isprintable} 및 @code{maketrans}.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node collections abc — 컨테이너의 추상 베이스 클래스,heapq — 힙 큐 알고리즘,collections — 컨테이너 데이터형,데이터형
@anchor{library/collections abc doc}@anchor{29b9}@anchor{library/collections abc collections-abc-abstract-base-classes-for-containers}@anchor{29ba}@anchor{library/collections abc module-collections abc}@anchor{1f}@anchor{library/collections abc translation-repo}@anchor{29bb}
@subsection @code{collections.abc} — 컨테이너의 추상 베이스 클래스


@geindex module; collections.abc


Added in version 3.3: 이전에는, 이 모듈이 @ref{1e,,collections} 모듈의 일부였습니다.


`소스 코드:' Lib/_collections_abc.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/_collections_abc.py}

@c from collections.abc import *
@c import itertools
@c __name__ = '<doctest>'


__________________________________________________________________


이 모듈은 클래스가 특정 인터페이스를 제공하는지를 검사하는 데 사용할 수 있는 @ref{13bb,,추상 베이스 클래스}를 제공합니다; 예를 들어, @ref{823,,해시 가능}인지 또는 @ref{13c0,,매핑}인지입니다.

An @ref{9c4,,issubclass()} or @ref{2ad,,isinstance()} test for an interface works in one
of three ways.


@enumerate 

@item 
A newly written class can inherit directly from one of the
abstract base classes.  The class must supply the required abstract
methods.  The remaining mixin methods come from inheritance and can be
overridden if desired.  Other methods may be added as needed:

@example
class C(Sequence):                      # 직접 상속
    def __init__(self): ...             # ABC 가 요구하지 않는 추가 메서드
    def __getitem__(self, index):  ...  # 필수 추상 메서드
    def __len__(self):  ...             # 필수 추상 메서드
    def count(self, value): ...         # 선택적으로 믹스인 메서드를 재정의합니다
@end example

@example
>>> issubclass(C, Sequence)
True
>>> isinstance(C(), Sequence)
True
@end example

@item 
Existing classes and built-in classes can be registered as “virtual
subclasses” of the ABCs.  Those classes should define the full API
including all of the abstract methods and all of the mixin methods.
This lets users rely on @ref{9c4,,issubclass()} or @ref{2ad,,isinstance()} tests
to determine whether the full interface is supported.  The exception to
this rule is for methods that are automatically inferred from the rest
of the API:

@example
class D:                                 # 상속 없음
    def __init__(self): ...              # ABC 가 요구하지 않는 추가 메서드
    def __getitem__(self, index):  ...   # 추상 메서드
    def __len__(self):  ...              # 추상 메서드
    def count(self, value): ...          # 믹스인 메서드
    def index(self, value): ...          # 믹스인 메서드

Sequence.register(D)                     # 상속하는 대신 등록합니다
@end example

@example
>>> issubclass(D, Sequence)
True
>>> isinstance(D(), Sequence)
True
@end example

In this example, class @code{D} does not need to define
@code{__contains__}, @code{__iter__}, and @code{__reversed__} because the
@ref{24d0,,in-operator}, the @ref{142c,,iteration}
logic, and the @ref{a65,,reversed()} function automatically fall back to
using @code{__getitem__} and @code{__len__}.

@item 
Some simple interfaces are directly recognizable by the presence of
the required methods (unless those methods have been set to @ref{884,,None}):

@example
class E:
    def __iter__(self): ...
    def __next__(self): ...
@end example

@example
>>> issubclass(E, Iterable)
True
>>> isinstance(E(), Iterable)
True
@end example

Complex interfaces do not support this last technique because an
interface is more than just the presence of method names.  Interfaces
specify semantics and relationships between methods that cannot be
inferred solely from the presence of specific method names.  For
example, knowing that a class supplies @code{__getitem__}, @code{__len__}, and
@code{__iter__} is insufficient for distinguishing a @ref{13c9,,Sequence} from
a @ref{ac7,,Mapping}.
@end enumerate


Added in version 3.9: These abstract classes now support @code{[]}. See @ref{8c0,,제네릭 에일리어스 형}
and 
@geindex Python 향상 제안; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/}.


@menu
* Collections 추상 베이스 클래스:: 
* Collections 추상 베이스 클래스 – 상세한 설명:: 
* 예제와 조리법:: 

@end menu

@node Collections 추상 베이스 클래스,Collections 추상 베이스 클래스 – 상세한 설명,,collections abc — 컨테이너의 추상 베이스 클래스
@anchor{library/collections abc collections-abstract-base-classes}@anchor{a78}@anchor{library/collections abc id1}@anchor{29bc}
@subsubsection Collections 추상 베이스 클래스


collections 모듈은 다음과 같은 @ref{13bb,,ABC}를 제공합니다:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

ABC

@tab

상속

@tab

추상 메서드

@tab

믹스인 메서드

@item

@ref{26b6,,Container} @footnote{
These ABCs override @ref{29bd,,__subclasshook__()} to support
testing an interface by verifying the required methods are present
and have not been set to @ref{884,,None}.  This only works for simple
interfaces.  More complex interfaces require registration or direct
subclassing.
}

@tab

@tab

@code{__contains__}

@tab

@item

@ref{718,,Hashable} @footnote{
These ABCs override @ref{29bd,,__subclasshook__()} to support
testing an interface by verifying the required methods are present
and have not been set to @ref{884,,None}.  This only works for simple
interfaces.  More complex interfaces require registration or direct
subclassing.
}

@tab

@tab

@code{__hash__}

@tab

@item

@ref{26b4,,Iterable} @footnote{
These ABCs override @ref{29bd,,__subclasshook__()} to support
testing an interface by verifying the required methods are present
and have not been set to @ref{884,,None}.  This only works for simple
interfaces.  More complex interfaces require registration or direct
subclassing.
} @footnote{
@code{isinstance(obj, Iterable)}를 검사하면 @ref{26b4,,Iterable}로 등록되었거나 @ref{20a8,,__iter__()} 메서드가 있는 클래스를 감지하지만, @ref{588,,__getitem__()} 메서드로 이터레이트 하는 클래스는 감지하지 않습니다. 객체가 @ref{142c,,이터러블}인지를 확인하는 유일하게 신뢰성 있는 방법은 @code{iter(obj)}를 호출하는 것입니다.
}

@tab

@tab

@code{__iter__}

@tab

@item

@ref{26b5,,Iterator} @footnote{
These ABCs override @ref{29bd,,__subclasshook__()} to support
testing an interface by verifying the required methods are present
and have not been set to @ref{884,,None}.  This only works for simple
interfaces.  More complex interfaces require registration or direct
subclassing.
}

@tab

@ref{26b4,,Iterable}

@tab

@code{__next__}

@tab

@code{__iter__}

@item

@ref{e84,,Reversible} @footnote{
These ABCs override @ref{29bd,,__subclasshook__()} to support
testing an interface by verifying the required methods are present
and have not been set to @ref{884,,None}.  This only works for simple
interfaces.  More complex interfaces require registration or direct
subclassing.
}

@tab

@ref{26b4,,Iterable}

@tab

@code{__reversed__}

@tab

@item

@ref{fda,,Generator}  @footnote{
These ABCs override @ref{29bd,,__subclasshook__()} to support
testing an interface by verifying the required methods are present
and have not been set to @ref{884,,None}.  This only works for simple
interfaces.  More complex interfaces require registration or direct
subclassing.
}

@tab

@ref{26b5,,Iterator}

@tab

@code{send}, @code{throw}

@tab

@code{close}, @code{__iter__}, @code{__next__}

@item

@ref{719,,Sized}  @footnote{
These ABCs override @ref{29bd,,__subclasshook__()} to support
testing an interface by verifying the required methods are present
and have not been set to @ref{884,,None}.  This only works for simple
interfaces.  More complex interfaces require registration or direct
subclassing.
}

@tab

@tab

@code{__len__}

@tab

@item

@ref{9eb,,Callable}  @footnote{
These ABCs override @ref{29bd,,__subclasshook__()} to support
testing an interface by verifying the required methods are present
and have not been set to @ref{884,,None}.  This only works for simple
interfaces.  More complex interfaces require registration or direct
subclassing.
}

@tab

@tab

@code{__call__}

@tab

@item

@ref{e83,,Collection}  @footnote{
These ABCs override @ref{29bd,,__subclasshook__()} to support
testing an interface by verifying the required methods are present
and have not been set to @ref{884,,None}.  This only works for simple
interfaces.  More complex interfaces require registration or direct
subclassing.
}

@tab

@ref{719,,Sized},
@ref{26b4,,Iterable},
@ref{26b6,,Container}

@tab

@code{__contains__},
@code{__iter__},
@code{__len__}

@tab

@item

@ref{13c9,,Sequence}

@tab

@ref{e84,,Reversible},
@ref{e83,,Collection}

@tab

@code{__getitem__},
@code{__len__}

@tab

@code{__contains__}, @code{__iter__}, @code{__reversed__}, @code{index} 및 @code{count}

@item

@ref{4c1,,MutableSequence}

@tab

@ref{13c9,,Sequence}

@tab

@code{__getitem__},
@code{__setitem__},
@code{__delitem__},
@code{__len__},
@code{insert}

@tab

상속된 @ref{13c9,,Sequence} 메서드와 @code{append}, @code{clear}, @code{reverse}, @code{extend}, @code{pop}, @code{remove} 및 @code{__iadd__}

@item

@ref{342,,ByteString}

@tab

@ref{13c9,,Sequence}

@tab

@code{__getitem__},
@code{__len__}

@tab

상속된 @ref{13c9,,Sequence} 메서드

@item

@ref{26ac,,Set}

@tab

@ref{e83,,Collection}

@tab

@code{__contains__},
@code{__iter__},
@code{__len__}

@tab

@code{__le__}, @code{__lt__}, @code{__eq__}, @code{__ne__}, @code{__gt__}, @code{__ge__}, @code{__and__}, @code{__or__}, @code{__sub__}, @code{__rsub__}, @code{__xor__}, @code{__rxor__} 및 @code{isdisjoint}

@item

@ref{26b7,,MutableSet}

@tab

@ref{26ac,,Set}

@tab

@code{__contains__},
@code{__iter__},
@code{__len__},
@code{add},
@code{discard}

@tab

상속된 @ref{26ac,,Set} 메서드와 @code{clear}, @code{pop}, @code{remove}, @code{__ior__}, @code{__iand__}, @code{__ixor__} 및 @code{__isub__}

@item

@ref{ac7,,Mapping}

@tab

@ref{e83,,Collection}

@tab

@code{__getitem__},
@code{__iter__},
@code{__len__}

@tab

@code{__contains__}, @code{keys}, @code{items}, @code{values}, @code{get}, @code{__eq__} 및 @code{__ne__}

@item

@ref{12b1,,MutableMapping}

@tab

@ref{ac7,,Mapping}

@tab

@code{__getitem__},
@code{__setitem__},
@code{__delitem__},
@code{__iter__},
@code{__len__}

@tab

상속된 @ref{ac7,,Mapping} 메서드와 @code{pop}, @code{popitem}, @code{clear}, @code{update} 및 @code{setdefault}

@item

@ref{26b8,,MappingView}

@tab

@ref{719,,Sized}

@tab

@tab

@code{__init__}, @code{__len__} 및 @code{__repr__}

@item

@ref{26ba,,ItemsView}

@tab

@ref{26b8,,MappingView},
@ref{26ac,,Set}

@tab

@tab

@code{__contains__},
@code{__iter__}

@item

@ref{26b9,,KeysView}

@tab

@ref{26b8,,MappingView},
@ref{26ac,,Set}

@tab

@tab

@code{__contains__},
@code{__iter__}

@item

@ref{26bb,,ValuesView}

@tab

@ref{26b8,,MappingView},
@ref{e83,,Collection}

@tab

@tab

@code{__contains__}, @code{__iter__}

@item

@ref{fdb,,Awaitable} @footnote{
These ABCs override @ref{29bd,,__subclasshook__()} to support
testing an interface by verifying the required methods are present
and have not been set to @ref{884,,None}.  This only works for simple
interfaces.  More complex interfaces require registration or direct
subclassing.
}

@tab

@tab

@code{__await__}

@tab

@item

@ref{fdc,,Coroutine} @footnote{
These ABCs override @ref{29bd,,__subclasshook__()} to support
testing an interface by verifying the required methods are present
and have not been set to @ref{884,,None}.  This only works for simple
interfaces.  More complex interfaces require registration or direct
subclassing.
}

@tab

@ref{fdb,,Awaitable}

@tab

@code{send}, @code{throw}

@tab

@code{close}

@item

@ref{fde,,AsyncIterable} @footnote{
These ABCs override @ref{29bd,,__subclasshook__()} to support
testing an interface by verifying the required methods are present
and have not been set to @ref{884,,None}.  This only works for simple
interfaces.  More complex interfaces require registration or direct
subclassing.
}

@tab

@tab

@code{__aiter__}

@tab

@item

@ref{fdd,,AsyncIterator} @footnote{
These ABCs override @ref{29bd,,__subclasshook__()} to support
testing an interface by verifying the required methods are present
and have not been set to @ref{884,,None}.  This only works for simple
interfaces.  More complex interfaces require registration or direct
subclassing.
}

@tab

@ref{fde,,AsyncIterable}

@tab

@code{__anext__}

@tab

@code{__aiter__}

@item

@ref{e86,,AsyncGenerator} @footnote{
These ABCs override @ref{29bd,,__subclasshook__()} to support
testing an interface by verifying the required methods are present
and have not been set to @ref{884,,None}.  This only works for simple
interfaces.  More complex interfaces require registration or direct
subclassing.
}

@tab

@ref{fdd,,AsyncIterator}

@tab

@code{asend}, @code{athrow}

@tab

@code{aclose}, @code{__aiter__}, @code{__anext__}

@item

@ref{343,,Buffer} @footnote{
These ABCs override @ref{29bd,,__subclasshook__()} to support
testing an interface by verifying the required methods are present
and have not been set to @ref{884,,None}.  This only works for simple
interfaces.  More complex interfaces require registration or direct
subclassing.
}

@tab

@tab

@code{__buffer__}

@tab

@end multitable


@node Collections 추상 베이스 클래스 – 상세한 설명,예제와 조리법,Collections 추상 베이스 클래스,collections abc — 컨테이너의 추상 베이스 클래스
@anchor{library/collections abc collections-abstract-base-classes-detailed-descriptions}@anchor{29be}
@subsubsection Collections 추상 베이스 클래스 – 상세한 설명


@geindex Container (collections.abc 클래스)
@anchor{library/collections abc collections abc Container}@anchor{26b6}
@deffn {클래스} collections.abc.Container

@ref{15be,,__contains__()} 메서드를 제공하는 클래스의 ABC.
@end deffn

@geindex Hashable (collections.abc 클래스)
@anchor{library/collections abc collections abc Hashable}@anchor{718}
@deffn {클래스} collections.abc.Hashable

@ref{cf2,,__hash__()} 메서드를 제공하는 클래스의 ABC.
@end deffn

@geindex Sized (collections.abc 클래스)
@anchor{library/collections abc collections abc Sized}@anchor{719}
@deffn {클래스} collections.abc.Sized

@ref{1797,,__len__()} 메서드를 제공하는 클래스의 ABC.
@end deffn

@geindex Callable (collections.abc 클래스)
@anchor{library/collections abc collections abc Callable}@anchor{9eb}
@deffn {클래스} collections.abc.Callable

@ref{779,,__call__()} 메서드를 제공하는 클래스의 ABC.

See @ref{26d5,,Annotating callable objects} for details on how to use
@code{Callable} in type annotations.
@end deffn

@geindex Iterable (collections.abc 클래스)
@anchor{library/collections abc collections abc Iterable}@anchor{26b4}
@deffn {클래스} collections.abc.Iterable

@ref{20a8,,__iter__()} 메서드를 제공하는 클래스의 ABC.

@code{isinstance(obj, Iterable)}를 검사하면 @ref{26b4,,Iterable}로 등록되었거나 @ref{20a8,,__iter__()} 메서드가 있는 클래스를 감지하지만, @ref{588,,__getitem__()} 메서드로 이터레이트 하는 클래스는 감지하지 않습니다. 객체가 @ref{142c,,이터러블}인지를 확인하는 유일하게 신뢰성 있는 방법은 @code{iter(obj)}를 호출하는 것입니다.
@end deffn

@geindex Collection (collections.abc 클래스)
@anchor{library/collections abc collections abc Collection}@anchor{e83}
@deffn {클래스} collections.abc.Collection

길이가 있는 이터러블 컨테이너 클래스의 ABC.


Added in version 3.6.

@end deffn

@geindex Iterator (collections.abc 클래스)
@anchor{library/collections abc collections abc Iterator}@anchor{26b5}
@deffn {클래스} collections.abc.Iterator

@ref{20ab,,__iter__()} 와 @ref{14d2,,__next__()} 메서드를 제공하는 클래스의 ABC. @ref{4ca,,이터레이터}의 정의도 참조하십시오.
@end deffn

@geindex Reversible (collections.abc 클래스)
@anchor{library/collections abc collections abc Reversible}@anchor{e84}
@deffn {클래스} collections.abc.Reversible

@ref{e85,,__reversed__()} 메서드도 제공하는 이터러블 클래스의 ABC.


Added in version 3.6.

@end deffn

@geindex Generator (collections.abc 클래스)
@anchor{library/collections abc collections abc Generator}@anchor{fda}
@deffn {클래스} collections.abc.Generator

@ref{241a,,send()}, @ref{71b,,throw()} 및 @ref{179b,,close()} 메서드로 @ref{4ca,,이터레이터}를 확장하는 
@geindex Python 향상 제안; PEP 342
PEP 342@footnote{https://peps.python.org/pep-0342/}에 정의된 프로토콜을 구현하는 @ref{1260,,제너레이터} 클래스의 ABC.

See @ref{29bf,,Annotating generators and coroutines}
for details on using @code{Generator} in type annotations.


Added in version 3.5.

@end deffn

@geindex Sequence (collections.abc 클래스)
@geindex MutableSequence (collections.abc 클래스)
@geindex ByteString (collections.abc 클래스)
@anchor{library/collections abc collections abc Sequence}@anchor{13c9}
@deffn {클래스} collections.abc.Sequence
@anchor{library/collections abc collections abc MutableSequence}@anchor{4c1}
@deffnx {클래스} collections.abc.MutableSequence
@anchor{library/collections abc collections abc ByteString}@anchor{342}
@deffnx {클래스} collections.abc.ByteString

읽기 전용과 가변 @ref{715,,시퀀스}의 ABC.

Implementation note: Some of the mixin methods, such as
@ref{20a8,,__iter__()}, @ref{e85,,__reversed__()},
and @ref{197a,,index()} make repeated calls to the underlying
@ref{588,,__getitem__()} method.
Consequently, if @code{__getitem__()} is implemented with constant
access speed, the mixin methods will have linear performance;
however, if the underlying method is linear (as it would be with a
linked list), the mixins will have quadratic performance and will
likely need to be overridden.

@geindex index() (collections.abc.ByteString 메서드)
@anchor{library/collections abc collections abc ByteString index}@anchor{29c0}
@deffn {메서드} index (value, start=0, stop=None)

Return first index of `value'.

Raises @ref{2ec,,ValueError} if the value is not present.

Supporting the `start' and `stop' arguments is optional, but recommended.


버전 3.5에서 변경: The @ref{197a,,index()} method gained support for
the `stop' and `start' arguments.

@end deffn


Deprecated since version 3.12, will be removed in version 3.17: The @code{ByteString} ABC has been deprecated.

Use @code{isinstance(obj, collections.abc.Buffer)} to test if @code{obj}
implements the @ref{260,,buffer protocol} at runtime. For use
in type annotations, either use @ref{343,,Buffer} or a union that
explicitly specifies the types your code supports (e.g.,
@code{bytes | bytearray | memoryview}).

@code{ByteString} was originally intended to be an abstract class that
would serve as a supertype of both @ref{192,,bytes} and @ref{344,,bytearray}.
However, since the ABC never had any methods, knowing that an object was
an instance of @code{ByteString} never actually told you anything
useful about the object. Other common buffer types such as
@ref{165,,memoryview} were also never understood as subtypes of
@code{ByteString} (either at runtime or by static type checkers).

See 
@geindex Python 향상 제안; PEP 688#current-options
PEP 688@footnote{https://peps.python.org/pep-0688/#current-options} for more details.

@end deffn

@geindex Set (collections.abc 클래스)
@geindex MutableSet (collections.abc 클래스)
@anchor{library/collections abc collections abc Set}@anchor{26ac}
@deffn {클래스} collections.abc.Set
@anchor{library/collections abc collections abc MutableSet}@anchor{26b7}
@deffnx {클래스} collections.abc.MutableSet

읽기 전용과 가변 @ref{202f,,집합}의 ABC.
@end deffn

@geindex Mapping (collections.abc 클래스)
@geindex MutableMapping (collections.abc 클래스)
@anchor{library/collections abc collections abc Mapping}@anchor{ac7}
@deffn {클래스} collections.abc.Mapping
@anchor{library/collections abc collections abc MutableMapping}@anchor{12b1}
@deffnx {클래스} collections.abc.MutableMapping

읽기 전용과 가변 @ref{13c0,,매핑}의 ABC.
@end deffn

@geindex MappingView (collections.abc 클래스)
@geindex ItemsView (collections.abc 클래스)
@geindex KeysView (collections.abc 클래스)
@geindex ValuesView (collections.abc 클래스)
@anchor{library/collections abc collections abc MappingView}@anchor{26b8}
@deffn {클래스} collections.abc.MappingView
@anchor{library/collections abc collections abc ItemsView}@anchor{26ba}
@deffnx {클래스} collections.abc.ItemsView
@anchor{library/collections abc collections abc KeysView}@anchor{26b9}
@deffnx {클래스} collections.abc.KeysView
@anchor{library/collections abc collections abc ValuesView}@anchor{26bb}
@deffnx {클래스} collections.abc.ValuesView

매핑, 항목, 키 및 값 @ref{29b1,,뷰}의 ABC.
@end deffn

@geindex Awaitable (collections.abc 클래스)
@anchor{library/collections abc collections abc Awaitable}@anchor{fdb}
@deffn {클래스} collections.abc.Awaitable

@ref{18d,,await} 표현식에서 사용할 수 있는 @ref{4c9,,어웨이터블} 객체의 ABC. 사용자 정의 구현은 @ref{f74,,__await__()} 메서드를 제공해야 합니다.

@ref{6b8,,코루틴} 객체와 @ref{fdc,,Coroutine} ABC의 인스턴스는 모두 이 ABC의 인스턴스입니다.

@cartouche
@quotation 참고 
In CPython, generator-based coroutines (@ref{1260,,generators}
decorated with @ref{1087,,@@types.coroutine}) are
`awaitables', even though they do not have an @ref{f74,,__await__()} method.
Using @code{isinstance(gencoro, Awaitable)} for them will return @code{False}.
Use @ref{1017,,inspect.isawaitable()} to detect them.
@end quotation
@end cartouche


Added in version 3.5.

@end deffn

@geindex Coroutine (collections.abc 클래스)
@anchor{library/collections abc collections abc Coroutine}@anchor{fdc}
@deffn {클래스} collections.abc.Coroutine

@ref{6b8,,코루틴} 호환 클래스의 ABC. @ref{2353,,코루틴 객체(Coroutine Objects)}에 정의된 다음 메서드를 구현합니다: @ref{2419,,send()}, @ref{71a,,throw()} 및 @ref{241b,,close()}. 사용자 정의 구현은 @ref{f74,,__await__()}도 구현해야 합니다. 모든 @ref{fdc,,Coroutine} 인스턴스는 @ref{fdb,,Awaitable}의 인스턴스이기도 합니다.

@cartouche
@quotation 참고 
In CPython, generator-based coroutines (@ref{1260,,generators}
decorated with @ref{1087,,@@types.coroutine}) are
`awaitables', even though they do not have an @ref{f74,,__await__()} method.
Using @code{isinstance(gencoro, Coroutine)} for them will return @code{False}.
Use @ref{1017,,inspect.isawaitable()} to detect them.
@end quotation
@end cartouche

See @ref{29bf,,Annotating generators and coroutines}
for details on using @code{Coroutine} in type annotations.
The variance and order of type parameters correspond to those of
@ref{fda,,Generator}.


Added in version 3.5.

@end deffn

@geindex AsyncIterable (collections.abc 클래스)
@anchor{library/collections abc collections abc AsyncIterable}@anchor{fde}
@deffn {클래스} collections.abc.AsyncIterable

@code{__aiter__} 메서드를 제공하는 클래스의 ABC. @ref{f73,,비동기 이터러블}의 정의도 참조하십시오.


Added in version 3.5.

@end deffn

@geindex AsyncIterator (collections.abc 클래스)
@anchor{library/collections abc collections abc AsyncIterator}@anchor{fdd}
@deffn {클래스} collections.abc.AsyncIterator

@code{__aiter__} 와 @code{__anext__} 메서드를 제공하는 클래스의 ABC. @ref{4c8,,비동기 이터레이터}의 정의도 참조하십시오.


Added in version 3.5.

@end deffn

@geindex AsyncGenerator (collections.abc 클래스)
@anchor{library/collections abc collections abc AsyncGenerator}@anchor{e86}
@deffn {클래스} collections.abc.AsyncGenerator

@geindex Python 향상 제안; PEP 525
PEP 525@footnote{https://peps.python.org/pep-0525/}와 
@geindex Python 향상 제안; PEP 492
PEP 492@footnote{https://peps.python.org/pep-0492/}에 정의된 프로토콜을 구현하는 @ref{249b,,비동기 제너레이터} 클래스의 ABC.

See @ref{29bf,,Annotating generators and coroutines}
for details on using @code{AsyncGenerator} in type annotations.


Added in version 3.6.

@end deffn

@geindex Buffer (collections.abc 클래스)
@anchor{library/collections abc collections abc Buffer}@anchor{343}
@deffn {클래스} collections.abc.Buffer

ABC for classes that provide the @ref{68b,,__buffer__()} method,
implementing the @ref{260,,buffer protocol}. See 
@geindex Python 향상 제안; PEP 688
PEP 688@footnote{https://peps.python.org/pep-0688/}.


Added in version 3.12.

@end deffn

@node 예제와 조리법,,Collections 추상 베이스 클래스 – 상세한 설명,collections abc — 컨테이너의 추상 베이스 클래스
@anchor{library/collections abc examples-and-recipes}@anchor{29c1}
@subsubsection 예제와 조리법


ABC들은 클래스나 인스턴스가 특정 기능을 제공하는지 묻는 것을 허용합니다, 예를 들어:

@example
size = None
if isinstance(myvar, collections.abc.Sized):
    size = len(myvar)
@end example

ABC 중 일부는 믹스인으로도 유용하여 컨테이너 API를 지원하는 클래스를 쉽게 개발할 수 있게 합니다. 예를 들어, 전체 @ref{26ac,,Set} API를 지원하는 클래스를 작성하려면, @ref{15be,,__contains__()}, @ref{20a8,,__iter__()} 및 @ref{1797,,__len__()}의 세 가지 하부 추상 메서드 만 제공하면 됩니다. ABC는 @code{__and__()}와 @ref{2696,,isdisjoint()}와 같은 나머지 메서드를 제공합니다:

@example
class ListBasedSet(collections.abc.Set):
    '@w{'}' 속도보다 공간을 선호하고 집합 원소가
        해시 가능할 필요가 없는 대안 집합 구현. '@w{'}'
    def __init__(self, iterable):
        self.elements = lst = []
        for value in iterable:
            if value not in lst:
                lst.append(value)

    def __iter__(self):
        return iter(self.elements)

    def __contains__(self, value):
        return value in self.elements

    def __len__(self):
        return len(self.elements)

s1 = ListBasedSet('abcdef')
s2 = ListBasedSet('defghi')
overlap = s1 & s2            # __and__() 메서드는 자동으로 지원됩니다
@end example

@ref{26ac,,Set}과 @ref{26b7,,MutableSet}을 믹스인으로 사용할 때의 주의 사항:


@enumerate 

@item 
일부 집합 연산은 새로운 집합을 만들기 때문에, 기본 믹스인 메서드는 @ref{142c,,이터러블}로부터 새 인스턴스를 만드는 방법이 필요합니다. 클래스 생성자가 @code{ClassName(iterable)} 형식의 서명을 가진 것으로 가정합니다. 이 가정은 새로운 집합을 생성하기 위해 @code{cls(iterable)}를 호출하는 @code{_from_iterable()}이라는 내부 @ref{48f,,classmethod}로 분리되었습니다. @ref{26ac,,Set} 믹스인이 다른 생성자 서명을 갖는 클래스에서 사용되고 있으면, 이터러블 인자로부터 새 인스턴스를 생성할 수 있는 클래스 메서드나 일반 메서드로 @code{_from_iterable()}을 재정의해야 합니다.

@item 
비교를 재정의하려면 (의미는 고정되었으므로, 아마도 속도 때문에), @ref{150f,,__le__()}와 @ref{1511,,__ge__()}를 재정의하십시오, 그러면 다른 연산은 자동으로 맞춰집니다.

@item 
@ref{26ac,,Set} 믹스인은 집합의 해시값을 계산하는 @code{_hash()} 메서드를 제공합니다; 그러나 모든 집합이 @ref{823,,해시 가능}하거나 불변이지는 않기 때문에 @ref{cf2,,__hash__()}는 정의되지 않습니다. 믹스인을 사용하여 집합 해시 가능성을 추가하려면, @ref{26ac,,Set()}와 @ref{718,,Hashable()}을 모두 상속한 다음, @code{__hash__ = Set._hash}를 정의하십시오.
@end enumerate


@subsubheading 더 보기



@itemize *

@item 
@ref{26b7,,MutableSet}으로 구축한 예제 OrderedSet 조리법@footnote{https://code.activestate.com/recipes/576694/}.

@item 
ABC에 대한 자세한 내용은, @ref{4,,abc} 모듈과 
@geindex Python 향상 제안; PEP 3119
PEP 3119@footnote{https://peps.python.org/pep-3119/}를 참조하십시오.
@end itemize


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node heapq — 힙 큐 알고리즘,bisect — 배열 이진 분할 알고리즘,collections abc — 컨테이너의 추상 베이스 클래스,데이터형
@anchor{library/heapq doc}@anchor{29c2}@anchor{library/heapq heapq-heap-queue-algorithm}@anchor{29c3}@anchor{library/heapq module-heapq}@anchor{6d}@anchor{library/heapq translation-repo}@anchor{29c4}
@subsection @code{heapq} — 힙 큐 알고리즘


@geindex module; heapq

`소스 코드:' Lib/heapq.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/heapq.py}


__________________________________________________________________


이 모듈은 우선순위 큐 알고리즘이라고도 하는 힙(heap) 큐 알고리즘의 구현을 제공합니다.

Min-heaps are binary trees for which every parent node has a value less than
or equal to any of its children.
We refer to this condition as the heap invariant.

For min-heaps, this implementation uses lists for which
@code{heap[k] <= heap[2*k+1]} and @code{heap[k] <= heap[2*k+2]} for all `k' for which
the compared elements exist.  Elements are counted from zero.  The interesting
property of a min-heap is that its smallest element is always the root,
@code{heap[0]}.

Max-heaps satisfy the reverse invariant: every parent node has a value
`greater' than any of its children.  These are implemented as lists for which
@code{maxheap[2*k+1] <= maxheap[k]} and @code{maxheap[2*k+2] <= maxheap[k]} for all
`k' for which the compared elements exist.
The root, @code{maxheap[0]}, contains the `largest' element;
@code{heap.sort(reverse=True)} maintains the max-heap invariant.

The @code{heapq} API differs from textbook heap algorithms in two aspects: (a)
We use zero-based indexing.  This makes the relationship between the index for
a node and the indexes for its children slightly less obvious, but is more
suitable since Python uses zero-based indexing. (b) Textbooks often focus on
max-heaps, due to their suitability for in-place sorting. Our implementation
favors min-heaps as they better correspond to Python @ref{24d,,lists}.

These two aspects make it possible to view the heap as a regular Python list
without surprises: @code{heap[0]} is the smallest item, and @code{heap.sort()}
maintains the heap invariant!

Like @ref{dc7,,list.sort()}, this implementation uses only the @code{<} operator
for comparisons, for both min-heaps and max-heaps.

In the API below, and in this documentation, the unqualified term `heap'
generally refers to a min-heap.
The API for max-heaps is named using a @code{_max}  suffix.

To create a heap, use a list initialized as @code{[]}, or transform an existing list
into a min-heap or max-heap using the @ref{29c5,,heapify()} or @ref{221,,heapify_max()}
functions, respectively.

The following functions are provided for min-heaps:

@geindex heapify() (heapq 모듈)
@anchor{library/heapq heapq heapify}@anchor{29c5}
@deffn {함수} heapq.heapify (x)

Transform list `x' into a min-heap, in-place, in linear time.
@end deffn

@geindex heappush() (heapq 모듈)
@anchor{library/heapq heapq heappush}@anchor{16c1}
@deffn {함수} heapq.heappush (heap, item)

Push the value `item' onto the `heap', maintaining the min-heap invariant.
@end deffn

@geindex heappop() (heapq 모듈)
@anchor{library/heapq heapq heappop}@anchor{16c2}
@deffn {함수} heapq.heappop (heap)

Pop and return the smallest item from the `heap', maintaining the min-heap
invariant.  If the heap is empty, @ref{173a,,IndexError} is raised.  To access the
smallest item without popping it, use @code{heap[0]}.
@end deffn

@geindex heappushpop() (heapq 모듈)
@anchor{library/heapq heapq heappushpop}@anchor{29c6}
@deffn {함수} heapq.heappushpop (heap, item)

힙에 `item'을 푸시한 다음, `heap'에서 가장 작은 항목을 팝하고 반환합니다. 결합한 액션은 @ref{16c1,,heappush()}한 다음 @ref{16c2,,heappop()}을 별도로 호출하는 것보다 더 효율적으로 실행합니다.
@end deffn

@geindex heapreplace() (heapq 모듈)
@anchor{library/heapq heapq heapreplace}@anchor{29c7}
@deffn {함수} heapq.heapreplace (heap, item)

`heap'에서 가장 작은 항목을 팝하고 반환하며, 새로운 `item'도 푸시합니다. 힙 크기는 변경되지 않습니다. 힙이 비어 있으면, @ref{173a,,IndexError}가 발생합니다.

이 한 단계 연산은 @ref{16c2,,heappop()}한 다음 @ref{16c1,,heappush()}하는 것보다 더 효율적이며 고정 크기 힙을 사용할 때 더 적합 할 수 있습니다. 팝/푸시 조합은 항상 힙에서 요소를 반환하고 그것을 `item'으로 대체합니다.

반환된 값은 추가된 `item'보다 클 수 있습니다. 그것이 바람직하지 않다면, 대신 @ref{29c6,,heappushpop()} 사용을 고려하십시오. 푸시/팝 조합은 두 값 중 작은 값을 반환하여, 힙에 큰 값을 남겨 둡니다.
@end deffn

For max-heaps, the following functions are provided:

@geindex heapify_max() (heapq 모듈)
@anchor{library/heapq heapq heapify_max}@anchor{221}
@deffn {함수} heapq.heapify_max (x)

Transform list `x' into a max-heap, in-place, in linear time.


Added in version 3.14.

@end deffn

@geindex heappush_max() (heapq 모듈)
@anchor{library/heapq heapq heappush_max}@anchor{222}
@deffn {함수} heapq.heappush_max (heap, item)

Push the value `item' onto the max-heap `heap', maintaining the max-heap
invariant.


Added in version 3.14.

@end deffn

@geindex heappop_max() (heapq 모듈)
@anchor{library/heapq heapq heappop_max}@anchor{223}
@deffn {함수} heapq.heappop_max (heap)

Pop and return the largest item from the max-heap `heap', maintaining the
max-heap invariant.  If the max-heap is empty, @ref{173a,,IndexError} is raised.
To access the largest item without popping it, use @code{maxheap[0]}.


Added in version 3.14.

@end deffn

@geindex heappushpop_max() (heapq 모듈)
@anchor{library/heapq heapq heappushpop_max}@anchor{225}
@deffn {함수} heapq.heappushpop_max (heap, item)

Push `item' on the max-heap `heap', then pop and return the largest item
from `heap'.
The combined action runs more efficiently than @ref{222,,heappush_max()}
followed by a separate call to @ref{223,,heappop_max()}.


Added in version 3.14.

@end deffn

@geindex heapreplace_max() (heapq 모듈)
@anchor{library/heapq heapq heapreplace_max}@anchor{224}
@deffn {함수} heapq.heapreplace_max (heap, item)

Pop and return the largest item from the max-heap `heap' and also push the
new `item'.
The max-heap size doesn’t change. If the max-heap is empty,
@ref{173a,,IndexError} is raised.

The value returned may be smaller than the `item' added.  Refer to the
analogous function @ref{29c7,,heapreplace()} for detailed usage notes.


Added in version 3.14.

@end deffn

이 모듈은 또한 힙 기반의 세 가지 범용 함수를 제공합니다.

@geindex merge() (heapq 모듈)
@anchor{library/heapq heapq merge}@anchor{1004}
@deffn {함수} heapq.merge (*iterables, key=None, reverse=False)

여러 정렬된 입력을 단일 정렬된 출력으로 병합합니다 (예를 들어, 여러 로그 파일에서 타임 스탬프 된 항목을 병합합니다). 정렬된 값에 대한 @ref{4ca,,이터레이터}를 반환합니다.

@code{sorted(itertools.chain(*iterables))}와 비슷하지만 이터러블을 반환하고, 데이터를 한 번에 메모리로 가져오지 않으며, 각 입력 스트림이 이미 (최소에서 최대로) 정렬된 것으로 가정합니다.

키워드 인자로 지정해야 하는 두 개의 선택적 인자가 있습니다.

`key'는 각 입력 요소에서 비교 키를 추출하는 데 사용되는 단일 인자의 @ref{1005,,키 함수}를 지정합니다. 기본값은 @code{None}입니다 (요소를 직접 비교합니다).

`reverse'는 불리언 값입니다. @code{True}로 설정하면, 각 비교가 반대로 된 것처럼 입력 요소가 병합됩니다. @code{sorted(itertools.chain(*iterables), reverse=True)}와 유사한 동작을 달성하려면 모든 이터러블이 최대에서 최소로 정렬되어 있어야 합니다.


버전 3.5에서 변경: 선택적 `key'와 `reverse' 매개 변수를 추가했습니다.

@end deffn

@geindex nlargest() (heapq 모듈)
@anchor{library/heapq heapq nlargest}@anchor{29c8}
@deffn {함수} heapq.nlargest (n, iterable, key=None)

`iterable'에 의해 정의된 데이터 집합에서 `n' 개의 가장 큰 요소로 구성된 리스트를 반환합니다. `key'가 제공되면 `iterable'의 각 요소에서 비교 키를 추출하는 데 사용되는 단일 인자 함수를 지정합니다 (예를 들어, @code{key=str.lower}). 다음과 동등합니다: @code{sorted(iterable, key=key, reverse=True)[:n]}.
@end deffn

@geindex nsmallest() (heapq 모듈)
@anchor{library/heapq heapq nsmallest}@anchor{29c9}
@deffn {함수} heapq.nsmallest (n, iterable, key=None)

`iterable'에 의해 정의된 데이터 집합에서 `n' 개의 가장 작은 요소로 구성된 리스트를 반환합니다. `key'가 제공되면 `iterable'의 각 요소에서 비교 키를 추출하는 데 사용되는 단일 인자 함수를 지정합니다 (예를 들어, @code{key=str.lower}). 다음과 동등합니다: @code{sorted(iterable, key=key)[:n]}.
@end deffn

마지막 두 함수는 작은 `n' 값에서 가장 잘 동작합니다. 값이 크면, @ref{dc6,,sorted()} 기능을 사용하는 것이 더 효율적입니다. 또한, @code{n==1}일 때는, 내장 @ref{110a,,min()}과 @ref{110b,,max()} 함수를 사용하는 것이 더 효율적입니다. 이 함수를 반복해서 사용해야 하면, iterable을 실제 힙으로 바꾸는 것이 좋습니다.

@menu
* 기본 예:: 
* Other Applications:: 
* 우선순위 큐 구현 참고 사항:: 
* 이론:: 

@end menu

@node 기본 예,Other Applications,,heapq — 힙 큐 알고리즘
@anchor{library/heapq basic-examples}@anchor{29ca}
@subsubsection 기본 예


힙 정렬@footnote{https://en.wikipedia.org/wiki/Heapsort}은 모든 값을 힙으로 푸시한 다음 한 번에 하나씩 가장 작은 값을 팝 하여 구현할 수 있습니다:

@example
>>> def heapsort(iterable):
...     h = []
...     for value in iterable:
...         heappush(h, value)
...     return [heappop(h) for i in range(len(h))]
...
>>> heapsort([1, 3, 5, 7, 9, 2, 4, 6, 8, 0])
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
@end example

이것은 @code{sorted(iterable)}과 비슷하지만, @ref{dc6,,sorted()}와 달리, 이 구현은 안정적(stable)이지 않습니다.

힙 요소는 튜플일 수 있습니다. 추적하는 기본 레코드와 함께 비교 값(가령 작업 우선순위)을 지정하는 데 유용합니다:

@example
>>> h = []
>>> heappush(h, (5, 'write code'))
>>> heappush(h, (7, 'release product'))
>>> heappush(h, (1, 'write spec'))
>>> heappush(h, (3, 'create tests'))
>>> heappop(h)
(1, 'write spec')
@end example

@node Other Applications,우선순위 큐 구현 참고 사항,기본 예,heapq — 힙 큐 알고리즘
@anchor{library/heapq other-applications}@anchor{29cb}
@subsubsection Other Applications


Medians@footnote{https://en.wikipedia.org/wiki/Median} are a measure of
central tendency for a set of numbers.  In distributions skewed by
outliers, the median provides a more stable estimate than an average
(arithmetic mean).  A running median is an online algorithm@footnote{https://en.wikipedia.org/wiki/Online_algorithm} that updates
continuously as new data arrives.

A running median can be efficiently implemented by balancing two heaps,
a max-heap for values at or below the midpoint and a min-heap for values
above the midpoint.  When the two heaps have the same size, the new
median is the average of the tops of the two heaps; otherwise, the
median is at the top of the larger heap:

@example
def running_median(iterable):
    "Yields the cumulative median of values seen so far."

    lo = []  # max-heap
    hi = []  # min-heap (same size as or one smaller than lo)

    for x in iterable:
        if len(lo) == len(hi):
            heappush_max(lo, heappushpop(hi, x))
            yield lo[0]
        else:
            heappush(hi, heappushpop_max(lo, x))
            yield (lo[0] + hi[0]) / 2
@end example

For example:

@example
>>> list(running_median([5.0, 9.0, 4.0, 12.0, 8.0, 9.0]))
[5.0, 7.0, 5.0, 7.0, 8.0, 8.5]
@end example

@node 우선순위 큐 구현 참고 사항,이론,Other Applications,heapq — 힙 큐 알고리즘
@anchor{library/heapq priority-queue-implementation-notes}@anchor{29cc}
@subsubsection 우선순위 큐 구현 참고 사항


우선순위 큐@footnote{https://en.wikipedia.org/wiki/Priority_queue}는 힙의 일반적인 사용이며, 몇 가지 구현 과제가 있습니다:


@itemize *

@item 
정렬 안정성: 우선순위가 같은 두 개의 작업을 어떻게 원래 추가된 순서대로 반환합니까?

@item 
우선순위가 같고 작업에 기본 비교 순서가 없으면 (우선순위, 작업) 쌍에 대한 튜플 비교가 성립하지 않습니다.

@item 
작업의 우선순위가 변경되면, 어떻게 힙의 새로운 위치로 옮깁니까?

@item 
또는 계류 중인 작업을 삭제해야 하면, 작업을 어떻게 찾고 큐에서 제거합니까?
@end itemize

처음 두 가지 과제에 대한 해결책은 항목을 우선순위, 항목 수 및 작업을 포함하는 3-요소 리스트로 저장하는 것입니다. 항목 수는 순위 결정자 역할을 하므로 우선순위가 같은 두 작업이 추가된 순서대로 반환됩니다. 두 항목 수가 같은 경우는 없어서, 튜플 비교는 두 작업을 직접 비교하려고 하지 않습니다.

비교할 수 없는 작업의 문제에 대한 또 다른 해결책은 작업 항목을 무시하고 우선순위 필드만 비교하는 래퍼 클래스를 만드는 것입니다:

@example
from dataclasses import dataclass, field
from typing import Any

@@dataclass(order=True)
class PrioritizedItem:
    priority: int
    item: Any=field(compare=False)
@end example

나머지 과제는 계류 중인 작업을 찾고 우선순위를 변경하거나 완전히 제거하는 것과 관련이 있습니다. 작업을 찾는 것은 큐에 있는 항목을 가리키는 딕셔너리를 사용해서 해결할 수 있습니다.

힙 구조 불변성을 깨뜨리기 때문에 항목을 제거하거나 우선순위를 변경하는 것은 더 어렵습니다. 따라서, 가능한 해결책은 항목을 제거된 것으로 표시하고 우선순위가 수정된 새 항목을 추가하는 것입니다:

@example
pq = []                         # l힙에 배치된 항목의 리스트
entry_finder = @{@}               # 작업에서 항목으로의 매핑
REMOVED = '<removed-task>'      # 삭제된 작업을 위한 자리 표시기
counter = itertools.count()     # 고유한 시퀀스 카운트

def add_task(task, priority=0):
    '새 작업을 추가하거나 기존 작업의 우선순위를 갱신합니다'
    if task in entry_finder:
        remove_task(task)
    count = next(counter)
    entry = [priority, count, task]
    entry_finder[task] = entry
    heappush(pq, entry)

def remove_task(task):
    '기존 작업을 REMOVED로 표시합니다.  발견되지 않으면 KeyError를 발생시킵니다.'
    entry = entry_finder.pop(task)
    entry[-1] = REMOVED

def pop_task():
    '가장 낮은 우선순위 작업을 삭제하고 반환합니다. 비어있으면 KeyError를 발생시킵니다.
    while pq:
        priority, count, task = heappop(pq)
        if task is not REMOVED:
            del entry_finder[task]
            return task
    raise KeyError('pop from an empty priority queue')
@end example

@node 이론,,우선순위 큐 구현 참고 사항,heapq — 힙 큐 알고리즘
@anchor{library/heapq theory}@anchor{29cd}
@subsubsection 이론


힙은 0부터 요소를 셀 때, 모든 `k'에 대해 @code{a[k] <= a[2*k+1]}와 @code{a[k] <= a[2*k+2]}가 유지되는 배열입니다. 비교를 위해, 존재하지 않는 요소는 무한인 것으로 간주합니다. 힙의 흥미로운 특성은 @code{a[0]}이 항상 가장 작은 요소라는 것입니다.

위의 특이한 불변성은 토너먼트를 위한 효율적인 메모리 표현을 위한 것입니다. 아래 숫자는 @code{a[k]}가 아니라 `k'입니다:

@example
0

              1                                 2

      3               4                5               6

  7       8       9       10      11      12      13      14

15 16   17 18   19 20   21 22   23 24   25 26   27 28   29 30
@end example

위의 트리에서, 각 셀 `k'는 @code{2*k+1}과 @code{2*k+2}위에 있습니다. 우리가 스포츠에서 볼 수 있는 일반적인 이진 토너먼트에서, 각 셀은 아래에 있는 두 개의 셀의 승자가 되며, 트리 아래로 승자를 추적하여 모든 상대를 볼 수 있습니다. 그러나, 이러한 토너먼트의 많은 컴퓨터 응용에서 승자의 이력을 추적할 필요는 없습니다. 메모리 효율성을 높이기 위해, 승자가 승격될 때, 하위 수준에서 다른 것으로 대체하려고 시도합니다. 규칙은 셀과 셀 아래의 두 셀이 세 개의 다른 항목을 포함하지만, 위의 셀은 아래의 두 셀에 “이기는” 것입니다.

이 힙 불변성이 항상 보호된다면, 인덱스 0은 분명히 최종 승자입니다. 이것을 제거하고 “다음” 승자를 찾는 가장 간단한 알고리즘 적인 방법은 어떤 패자(위의 도표에서 셀 30이라고 합시다)를 0 위치로 옮기고, 불변성을 다시 만족할 때까지 값을 교환하면서 이 새로운 0을 트리 아래로 침투시키는 것입니다. 이것은 트리의 총 항목 수에 대해 분명히 로그 함수적(logarithmic)입니다. 모든 항목에 대해 반복하면, `O'(`n' log `n') 정렬을 얻게 됩니다.

이 정렬의 멋진 기능은 삽입된 항목이 추출한 마지막 0번째 요소보다 “더 나은” 항목이 아니라면, 정렬이 진행되는 동안 새 항목을 효율적으로 삽입 할 수 있다는 것입니다. 이는 트리가 들어오는 모든 이벤트를 담고, “승리” 조건이 가장 작은 예약 시간을 의미하는 시뮬레이션 문맥에서 특히 유용합니다. 이벤트가 실행을 위해 다른 이벤트를 예약하면, 이들은 미래에 예약되어서, 쉽게 힙에 들어갈 수 있습니다. 따라서, 힙은 스케줄러를 구현하기에 좋은 구조입니다 (이것이 제가 MIDI 시퀀서에 사용한 것입니다 :-).

스케줄러를 구현하기 위한 다양한 구조가 광범위하게 연구되었으며, 힙은 합리적으로 빠르며, 속도가 거의 일정합니다, 최악의 경우는 평균 경우와 크게 다르지 않기 때문에 스케줄러에 좋습니다. 하지만, 최악의 경우는 끔찍할 수 있습니다만, 전반적으로 더 효율적인 다른 표현이 있기는 합니다.

힙은 큰 디스크 정렬에도 매우 유용합니다. 여러분은 아마도 큰 정렬은 “런(runs)”(크기가 일반적으로 CPU 메모리 크기와 관련된 사전 정렬된 시퀀스)을 생성한 후에 이러한 런들에 대한 병합 패스가 따라옴을 의미하며, 이러한 병합은 종종 매우 영리하게 조직됨을 알고 있을 겁니다 @footnote{
요즘 최신 디스크 밸런싱 알고리즘은 영리하다기보다는 성가시며, 이는 디스크의 탐색(seek) 기능으로 인한 결과입니다. 큰 테이프 드라이브와 같이 탐색할 수 없는 장치에서는, 이야기가 상당히 달랐으며, 각 테이프 움직임이 가장 효과적일 수 있도록 (즉, 병합을 “진행하는데” 최대한 참여할 수 있도록) (일찌감치) 계획하기 위해 아주 영리해야 했습니다. 일부 테이프는 반대 방향으로 읽을 수도 있었으며, 이것은 되감기 시간을 피하는 데 사용되기도 했습니다. 저를 믿으십시오, 진짜 훌륭한 테이프 정렬은 장관이었습니다! 언제나, 정렬은 항상 위대한 예술이었습니다! :-)
}. 초기 정렬이 가능한 한 가장 긴 런을 생성하는 것이 매우 중요합니다. 토너먼트는 이를 달성하기 위한 좋은 방법입니다. 토너먼트를 개최하는 데 사용할 수 있는 모든 메모리를 사용하여 현재 런에 맞는 항목들을 교체하고 침투시키면, 무작위 입력을 위한 메모리 크기의 두 배인 런을 생성하게 되고, 적당히 정렬된 입력에 대해서는 더 좋습니다.

더 나아가, 또한 디스크에 0번째 항목을 출력하고 현재 토너먼트에 맞지 않는 입력을 받으면 (그 값이 마지막 출력값을 “이기기” 때문에), 힙에 넣을 수 없어서 힙의 크기가 줄어듭니다. 해제된 메모리는 두 번째 힙을 점진적으로 구축하는데 즉시 영리하게 재사용될 수 있고, 두 번째 힙이 자라는 속도는 첫 번째 힙이 줄어드는 것과 같습니다. 첫 번째 힙이 완전히 사라지면, 힙을 전환하고 새 런을 시작합니다. 영리하고 매우 효과적입니다!

한마디로, 힙은 알아두어야 할 유용한 메모리 구조입니다. 저는 몇 가지 응용 프로그램에서 사용하며, ‘힙’ 모듈을 근처에 두는 것이 좋다고 생각합니다. :-)

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node bisect — 배열 이진 분할 알고리즘,array — 효율적인 숫자 배열,heapq — 힙 큐 알고리즘,데이터형
@anchor{library/bisect doc}@anchor{29ce}@anchor{library/bisect bisect-array-bisection-algorithm}@anchor{29cf}@anchor{library/bisect module-bisect}@anchor{12}@anchor{library/bisect translation-repo}@anchor{29d0}
@subsection @code{bisect} — 배열 이진 분할 알고리즘


@geindex module; bisect

@c example based on the PyModules FAQ entry by Aaron Watters <arw@pythonpros.com>

`소스 코드:' Lib/bisect.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/bisect.py}


__________________________________________________________________


이 모듈은 정렬된 리스트를 삽입 후에 다시 정렬할 필요 없도록 관리할 수 있도록 지원합니다. 값비싼 비교 연산이 포함된 항목의 긴 리스트의 경우, 이는 선형 검색이나 빈번한 재정렬에 비해 개선된 것입니다.

The module is called @code{bisect} because it uses a basic bisection
algorithm to do its work.  Unlike other bisection tools that search for a
specific value, the functions in this module are designed to locate an
insertion point. Accordingly, the functions never call an @ref{cf1,,__eq__()}
method to determine whether a value has been found.  Instead, the
functions only call the @ref{14a5,,__lt__()} method and will return an insertion
point between values in an array.

@cartouche
@quotation 참고 
The functions in this module are not thread-safe. If multiple threads
concurrently use @code{bisect} functions on the same sequence, this
may result in undefined behaviour. Likewise, if the provided sequence
is mutated by a different thread while a @code{bisect} function
is operating on it, the result is undefined. For example, using
@ref{29d1,,insort_left()} on the same list from multiple threads
may result in the list becoming unsorted.
@end quotation
@end cartouche
@anchor{library/bisect bisect-functions}@anchor{29d2}
다음과 같은 함수가 제공됩니다:

@geindex bisect_left() (bisect 모듈)
@anchor{library/bisect bisect bisect_left}@anchor{29d3}
@deffn {함수} bisect.bisect_left (a, x, lo=0, hi=len(a), *, key=None)

정렬된 순서를 유지하도록 `a'에 `x'를 삽입할 위치를 찾습니다. 매개 변수 `lo' 와 `hi'는 고려해야 할 리스트의 부분집합을 지정하는 데 사용될 수 있습니다; 기본적으로 전체 리스트가 사용됩니다. `x'가 `a'에 이미 있으면, 삽입 위치는 기존 항목 앞(왼쪽)이 됩니다. 반환 값은 `a'가 이미 정렬되었다고 가정할 때 @code{list.insert()}의 첫 번째 매개 변수로 사용하기에 적합합니다.

반환된 삽입 위치 `ip'는 배열 `a'를 두 개의 조각으로 분할하여, 왼쪽에 대해서는 @code{all(elem < x for elem in a[lo : ip])}이 참이고, 오른쪽에 대해서는 @code{all(elem >= x for elem in a[ip : hi])}이 참이 되도록 만듭니다.

`key' specifies a @ref{1005,,key function} of one argument that is used to
extract a comparison key from each element in the array.  To support
searching complex records, the key function is not applied to the `x' value.

If `key' is @code{None}, the elements are compared directly and
no key function is called.


버전 3.10에서 변경: `key' 매개 변수를 추가했습니다.

@end deffn

@geindex bisect_right() (bisect 모듈)
@geindex bisect() (bisect 모듈)
@anchor{library/bisect bisect bisect_right}@anchor{29d4}
@deffn {함수} bisect.bisect_right (a, x, lo=0, hi=len(a), *, key=None)
@anchor{library/bisect bisect bisect}@anchor{29d5}
@deffnx {함수} bisect.bisect (a, x, lo=0, hi=len(a), *, key=None)

@ref{29d3,,bisect_left()}와 비슷하지만, `a'에 있는 `x'의 기존 항목 뒤(오른쪽)에 오는 삽입 위치를 반환합니다.

반환된 삽입 위치 `ip'는 배열 `a'를 두 개의 조각으로 분할하여, 왼쪽에 대해서는 @code{all(elem <= x for elem in a[lo : ip])}이 참이고, 오른쪽에 대해서는 @code{all(elem > x for elem in a[ip : hi])}이 참이 되도록 만듭니다.


버전 3.10에서 변경: `key' 매개 변수를 추가했습니다.

@end deffn

@geindex insort_left() (bisect 모듈)
@anchor{library/bisect bisect insort_left}@anchor{29d1}
@deffn {함수} bisect.insort_left (a, x, lo=0, hi=len(a), *, key=None)

Insert `x' in `a' in sorted order.

This function first runs @ref{29d3,,bisect_left()} to locate an insertion point.
Next, it runs the @ref{23da,,insert()} method on `a' to insert `x' at the
appropriate position to maintain sort order.

To support inserting records in a table, the `key' function (if any) is
applied to `x' for the search step but not for the insertion step.

Keep in mind that the `O'(log `n') search is dominated by the slow `O'(`n')
insertion step.


버전 3.10에서 변경: `key' 매개 변수를 추가했습니다.

@end deffn

@geindex insort_right() (bisect 모듈)
@geindex insort() (bisect 모듈)
@anchor{library/bisect bisect insort_right}@anchor{29d6}
@deffn {함수} bisect.insort_right (a, x, lo=0, hi=len(a), *, key=None)
@anchor{library/bisect bisect insort}@anchor{29d7}
@deffnx {함수} bisect.insort (a, x, lo=0, hi=len(a), *, key=None)

@ref{29d1,,insort_left()}와 비슷하지만, `a'에 `x'를 `x'의 기존 항목 다음에 삽입합니다.

This function first runs @ref{29d4,,bisect_right()} to locate an insertion point.
Next, it runs the @ref{23da,,insert()} method on `a' to insert `x' at the
appropriate position to maintain sort order.

To support inserting records in a table, the `key' function (if any) is
applied to `x' for the search step but not for the insertion step.

Keep in mind that the `O'(log `n') search is dominated by the slow `O'(`n')
insertion step.


버전 3.10에서 변경: `key' 매개 변수를 추가했습니다.

@end deffn

@menu
* Performance Notes:: 
* 정렬된 리스트 검색하기:: 
* 예제: 예제<2>. 

@end menu

@node Performance Notes,정렬된 리스트 검색하기,,bisect — 배열 이진 분할 알고리즘
@anchor{library/bisect performance-notes}@anchor{29d8}
@subsubsection Performance Notes


When writing time sensitive code using `bisect()' and `insort()', keep these
thoughts in mind:


@itemize *

@item 
Bisection is effective for searching ranges of values.
For locating specific values, dictionaries are more performant.

@item 
The `insort()' functions are `O'(`n') because the logarithmic search step
is dominated by the linear time insertion step.

@item 
The search functions are stateless and discard key function results after
they are used.  Consequently, if the search functions are used in a loop,
the key function may be called again and again on the same array elements.
If the key function isn’t fast, consider wrapping it with
@ref{17ce,,functools.cache()} to avoid duplicate computations.  Alternatively,
consider searching an array of precomputed keys to locate the insertion
point (as shown in the examples section below).
@end itemize


@subsubheading 더 보기



@itemize *

@item 
Sorted Collections@footnote{https://grantjenks.com/docs/sortedcollections/} is a high performance
module that uses `bisect' to managed sorted collections of data.

@item 
bisect를 사용하여 직접적인 검색 메서드와 키 함수 지원을 포함하는 완전한 기능을 갖춘 컬렉션 클래스를 만드는 SortedCollection recipe@footnote{https://code.activestate.com/recipes/577197-sortedcollection/}. 검색 중에 불필요한 키 함수 호출을 피하고자 키는 미리 계산됩니다.
@end itemize


@node 정렬된 리스트 검색하기,예제<2>,Performance Notes,bisect — 배열 이진 분할 알고리즘
@anchor{library/bisect searching-sorted-lists}@anchor{29d9}
@subsubsection 정렬된 리스트 검색하기


위의 @ref{29d2,,bisect functions}는 삽입 위치를 찾는 데 유용하지만, 일반적인 검색 작업에 사용하기가 까다롭거나 어색할 수 있습니다. 다음 다섯 함수는 정렬된 리스트에 대한 표준 조회로 변환하는 방법을 보여줍니다:

@example
def index(a, x):
    'x 와 정확히 같은 가장 왼쪽의 값을 찾습니다'
    i = bisect_left(a, x)
    if i != len(a) and a[i] == x:
        return i
    raise ValueError

def find_lt(a, x):
    'x보다 작은 가장 오른쪽 값을 찾습니다'
    i = bisect_left(a, x)
    if i:
        return a[i-1]
    raise ValueError

def find_le(a, x):
    'x보다 작거나 같은 가장 오른쪽 값을 찾습니다'
    i = bisect_right(a, x)
    if i:
        return a[i-1]
    raise ValueError

def find_gt(a, x):
    'x보다 큰 가장 왼쪽 값을 찾습니다'
    i = bisect_right(a, x)
    if i != len(a):
        return a[i]
    raise ValueError

def find_ge(a, x):
    'x보다 크거나 같은 가장 왼쪽 항목을 찾습니다'
    i = bisect_left(a, x)
    if i != len(a):
        return a[i]
    raise ValueError
@end example

@node 예제<2>,,정렬된 리스트 검색하기,bisect — 배열 이진 분할 알고리즘
@anchor{library/bisect examples}@anchor{29da}
@subsubsection 예제

@anchor{library/bisect bisect-example}@anchor{29db}
@ref{29d5,,bisect()} 함수는 숫자 테이블 조회에 유용할 수 있습니다. 이 예제는 @code{bisect()}를 사용하여 (가령) 시험 점수에 대한 문자 등급을 조회하는데, 정렬된 숫자 경계점 집합에 기반합니다: 90 이상은 ‘A’, 80에서 89는 ‘B’ 등입니다:

@example
>>> def grade(score)
...     i = bisect([60, 70, 80, 90], score)
...     return "FDCBA"[i]
...
>>> [grade(score) for score in [33, 99, 77, 70, 89, 90, 100]]
['F', 'A', 'C', 'C', 'B', 'A', 'A']
@end example

The @ref{29d5,,bisect()} and @ref{29d7,,insort()} functions also work with
lists of tuples.  The `key' argument can serve to extract the field used for ordering
records in a table:

@example
>>> from collections import namedtuple
>>> from operator import attrgetter
>>> from bisect import bisect, insort
>>> from pprint import pprint

>>> Movie = namedtuple('Movie', ('name', 'released', 'director'))

>>> movies = [
...     Movie('Jaws', 1975, 'Spielberg'),
...     Movie('Titanic', 1997, 'Cameron'),
...     Movie('The Birds', 1963, 'Hitchcock'),
...     Movie('Aliens', 1986, 'Cameron')
... ]

>>> # 1960년 이후 개봉한 최초의 영화를 찾습니다
>>> by_year = attrgetter('released')
>>> movies.sort(key=by_year)
>>> movies[bisect(movies, 1960, key=by_year)]
Movie(name='The Birds', released=1963, director='Hitchcock')

>>> # 정렬 순서를 유지하면서 영화를 삽입합니다
>>> romance = Movie('Love Story', 1970, 'Hiller')
>>> insort(movies, romance, key=by_year)
>>> pprint(movies)
[Movie(name='The Birds', released=1963, director='Hitchcock'),
 Movie(name='Love Story', released=1970, director='Hiller'),
 Movie(name='Jaws', released=1975, director='Spielberg'),
 Movie(name='Aliens', released=1986, director='Cameron'),
 Movie(name='Titanic', released=1997, director='Cameron')]
@end example

키 함수가 비싸면, 미리 계산된 키 목록을 검색하여 레코드의 인덱스를 찾으면 반복돠는 함수 호출을 피할 수 있습니다:

@example
>>> data = [('red', 5), ('blue', 1), ('yellow', 8), ('black', 0)]
>>> data.sort(key=lambda r: r[1])       # 또는 operator.itemgetter(1) 를 사용하세요.
>>> keys = [r[1] for r in data]         # 미리 계산된 키 리스트.
>>> data[bisect_left(keys, 0)]
('black', 0)
>>> data[bisect_left(keys, 1)]
('blue', 1)
>>> data[bisect_left(keys, 5)]
('red', 5)
>>> data[bisect_left(keys, 8)]
('yellow', 8)
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node array — 효율적인 숫자 배열,weakref — Weak references,bisect — 배열 이진 분할 알고리즘,데이터형
@anchor{library/array doc}@anchor{29dc}@anchor{library/array array-efficient-arrays-of-numeric-values}@anchor{29dd}@anchor{library/array module-array}@anchor{8}@anchor{library/array translation-repo}@anchor{29de}
@subsection @code{array} — 효율적인 숫자 배열


@geindex module; array

@geindex 배열


__________________________________________________________________


This module defines an object type which can compactly represent an array of
basic values: characters, integers, floating-point numbers.  Arrays are mutable @ref{715,,sequence}
types and behave very much like lists, except that the type of objects stored in
them is constrained.  The type is specified at object creation time by using a
`type code', which is a single character.  The following type codes are
defined:


@multitable {xxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxx} 
@headitem

형 코드

@tab

C 형

@tab

파이썬 형

@tab

최소 크기(바이트)

@tab

노트

@item

@code{'b'}

@tab

signed char

@tab

int

@tab

1

@tab

@item

@code{'B'}

@tab

unsigned char

@tab

int

@tab

1

@tab

@item

@code{'u'}

@tab

wchar_t

@tab

유니코드 문자

@tab

2

@tab

(1)

@item

@code{'w'}

@tab

Py_UCS4

@tab

유니코드 문자

@tab

4

@tab

(2)

@item

@code{'h'}

@tab

signed short

@tab

int

@tab

2

@tab

@item

@code{'H'}

@tab

unsigned short

@tab

int

@tab

2

@tab

@item

@code{'i'}

@tab

signed int

@tab

int

@tab

2

@tab

@item

@code{'I'}

@tab

unsigned int

@tab

int

@tab

2

@tab

@item

@code{'l'}

@tab

signed long

@tab

int

@tab

4

@tab

@item

@code{'L'}

@tab

unsigned long

@tab

int

@tab

4

@tab

@item

@code{'q'}

@tab

signed long long

@tab

int

@tab

8

@tab

@item

@code{'Q'}

@tab

unsigned long long

@tab

int

@tab

8

@tab

@item

@code{'f'}

@tab

float

@tab

float

@tab

4

@tab

@item

@code{'d'}

@tab

double

@tab

float

@tab

8

@tab

@end multitable


노트:


@enumerate 

@item 
플랫폼에 따라 16비트 또는 32비트 일 수 있습니다.


버전 3.9에서 변경: @code{array('u')}는 이제 폐지된 @code{Py_UNICODE} 대신 @code{wchar_t}를 C형으로 사용합니다. @code{Py_UNICODE}는 파이썬 3.3부터 @code{wchar_t}의 별칭이라서 이 변경은 동작에 영향을 미치지 않습니다.



Deprecated since version 3.3, will be removed in version 3.16: Please migrate to @code{'w'} typecode.


@item 

Added in version 3.13.

@end enumerate


@subsubheading 더 보기


The @ref{283f,,ctypes} and
@ref{283b,,struct} modules,
as well as third-party modules like numpy@footnote{https://numpy.org/doc/stable/reference/arrays.interface.html#object.__array_interface__},
use similar – but slightly different – type codes.


값의 실제 표현은 기계 아키텍처에 의해(엄격히 말하자면 C 구현에 의해) 결정됩니다. 실제 크기는 @ref{29df,,array.itemsize} 어트리뷰트를 통해 액세스할 수 있습니다.

모듈은 다음 항목을 정의합니다:

@geindex typecodes (array 모듈)
@anchor{library/array array typecodes}@anchor{29e0}
@deffn {데이터} array.typecodes

사용 가능한 모든 형 코드가 있는 문자열.
@end deffn

모듈은 다음 형을 정의합니다:

@geindex array (array 클래스)
@anchor{library/array array array}@anchor{4c0}
@deffn {클래스} array.array (typecode[, initializer])

항목이 `typecode'에 의해 제한되는 새 배열, 선택적인 `initializer' 값으로 초기화되는데, @ref{192,,bytes} 나 @ref{344,,bytearray} 객체, 유니코드 문자열 또는 적절한 형의 요소에 대한 이터러블이어야 합니다.

@ref{192,,bytes} 나 @ref{344,,bytearray} 객체가 주어지면, initializer는 새 배열의 @ref{1476,,frombytes()} 메서드로 전달됩니다; 유니코드 문자열이 주어지면, initializer는 @ref{29e1,,fromunicode()} 메서드로 전달됩니다; 그렇지 않으면, initializer의 이터레이터가 @ref{29e2,,extend()} 메서드에 전달되어 배열에 초기 항목들을 추가합니다.

Array objects support the ordinary @ref{25c3,,mutable} @ref{715,,sequence} operations of indexing, slicing,
concatenation, and multiplication.  When using slice assignment, the assigned
value must be an array object with the same type code; in all other cases,
@ref{198,,TypeError} is raised. Array objects also implement the buffer interface,
and may be used wherever @ref{193,,bytes-like objects} are supported.

@code{typecode}, @code{initializer} 인자로 @ref{1c6c,,감사 이벤트(auditing event)} @code{array.__new__}를 발생시킵니다.

@geindex typecode (array.array의 속성)
@anchor{library/array array array typecode}@anchor{29e3}
@deffn {속성} typecode

배열을 만드는 데 사용된 typecode 문자.
@end deffn

@geindex itemsize (array.array의 속성)
@anchor{library/array array array itemsize}@anchor{29df}
@deffn {속성} itemsize

내부 표현에서 하나의 배열 항목의 길이 (바이트).
@end deffn

@geindex append() (array.array 메서드)
@anchor{library/array array array append}@anchor{29e4}
@deffn {메서드} append (value, /)

Append a new item with the specified value to the end of the array.
@end deffn

@geindex buffer_info() (array.array 메서드)
@anchor{library/array array array buffer_info}@anchor{29e5}
@deffn {메서드} buffer_info ()

배열의 내용을 담는 데 사용된 버퍼의 현재 메모리 주소와 요소의 수로 표현한 길이를 제공하는 튜플 @code{(address, length)}를 반환합니다. 바이트 단위의 메모리 버퍼 크기는 @code{array.buffer_info()[1] * array.itemsize}로 계산할 수 있습니다. 이것은 특정 @code{ioctl()} 연산과 같은 메모리 주소가 필요한 저수준(그리고 근본적으로 안전하지 않은) I/O 인터페이스로 작업할 때 간혹 유용합니다. 반환된 숫자는 배열이 존재하고 길이 변경 연산이 적용되지 않는 한 유효합니다.

@cartouche
@quotation 참고 
C나 C++로 작성된 코드(이 정보를 효율적으로 사용하는 유일한 방법)에서 배열 객체를 사용할 때, 배열 객체가 지원하는 버퍼 인터페이스를 사용하는 것이 좋습니다. 이 메서드는 이전 버전과의 호환성을 위해 유지되며 새 코드에서는 사용하지 않아야 합니다. 버퍼 인터페이스는 @ref{260,,버퍼 프로토콜}에 설명되어 있습니다.
@end quotation
@end cartouche
@end deffn

@geindex byteswap() (array.array 메서드)
@anchor{library/array array array byteswap}@anchor{29e6}
@deffn {메서드} byteswap ()

배열의 모든 항목을 “바이트 스와프(byteswap)” 합니다. 1, 2, 4 또는 8바이트 크기의 값에 대해서만 지원됩니다; 다른 형의 값이면 @ref{244,,RuntimeError}가 발생합니다. 바이트 순서가 다른 컴퓨터에서 작성된 파일에서 데이터를 읽을 때 유용합니다.
@end deffn

@geindex count() (array.array 메서드)
@anchor{library/array array array count}@anchor{29e7}
@deffn {메서드} count (value, /)

Return the number of occurrences of `value' in the array.
@end deffn

@geindex extend() (array.array 메서드)
@anchor{library/array array array extend}@anchor{29e2}
@deffn {메서드} extend (iterable, /)

`iterable'의 항목을 배열의 끝에 추가합니다. `iterable'이 다른 배열이면, `정확히' 같은 형 코드를 가져야 합니다; 그렇지 않으면, @ref{198,,TypeError}가 발생합니다. `iterable'이 배열이 아니면, 이터러블이어야 하며 요소는 배열에 추가할 올바른 형이어야 합니다.
@end deffn

@geindex frombytes() (array.array 메서드)
@anchor{library/array array array frombytes}@anchor{1476}
@deffn {메서드} frombytes (buffer, /)

@ref{193,,바이트열류 객체}에서 항목을 추가합니다. 내용을 기곗값(machine value)의 배열로 해석합니다 (마치 @ref{14c5,,fromfile()} 메서드를 사용하여 파일에서 읽은 것처럼).


Added in version 3.2: @code{fromstring()}은 명확하게 하려고 @ref{1476,,frombytes()}로 이름을 바꿨습니다.

@end deffn

@geindex fromfile() (array.array 메서드)
@anchor{library/array array array fromfile}@anchor{14c5}
@deffn {메서드} fromfile (f, n, /)

@ref{13c8,,파일 객체} `f'에서 (기곗값으로) `n' 항목을 읽고 배열의 끝에 추가합니다. `n' 미만의 항목만 사용할 수 있으면 @ref{14de,,EOFError}가 발생하지만, 사용 가능한 항목은 여전히 배열에 삽입됩니다.
@end deffn

@geindex fromlist() (array.array 메서드)
@anchor{library/array array array fromlist}@anchor{29e8}
@deffn {메서드} fromlist (list, /)

리스트에서 항목을 추가합니다. 이것은 형 에러가 있으면 배열이 변경되지 않는다는 점만 제외하면 @code{for x in list: a.append(x)}와 동등합니다.
@end deffn

@geindex fromunicode() (array.array 메서드)
@anchor{library/array array array fromunicode}@anchor{29e1}
@deffn {메서드} fromunicode (ustr, /)

주어진 유니코드 문자열의 데이터로 이 배열을 확장합니다. 배열은 형 코드가 @code{'u'} 나 @code{'w'} 이어야 합니다; 그렇지 않으면 @ref{2ec,,ValueError}가 발생합니다. 다른 형의 배열에 유니코드 데이터를 추가하려면 @code{array.frombytes(unicodestring.encode(enc))}를 사용하십시오.
@end deffn

@geindex index() (array.array 메서드)
@anchor{library/array array array index}@anchor{9e1}
@deffn {메서드} index (value[, start[, stop]])

Return the smallest `i' such that `i' is the index of the first occurrence of
`value' in the array.  The optional arguments `start' and `stop' can be
specified to search for `value' within a subsection of the array.  Raise
@ref{2ec,,ValueError} if `value' is not found.


버전 3.10에서 변경: Added optional `start' and `stop' parameters.

@end deffn

@geindex insert() (array.array 메서드)
@anchor{library/array array array insert}@anchor{29e9}
@deffn {메서드} insert (index, value, /)

Insert a new item `value' in the array before position `index'. Negative
values are treated as being relative to the end of the array.
@end deffn

@geindex pop() (array.array 메서드)
@anchor{library/array array array pop}@anchor{29ea}
@deffn {메서드} pop (index=-1, /)

배열에서 인덱스 `i'에 있는 항목을 제거하고 이를 반환합니다. 선택적 인자의 기본값은 @code{-1}이므로, 기본적으로 마지막 항목이 제거되고 반환됩니다.
@end deffn

@geindex remove() (array.array 메서드)
@anchor{library/array array array remove}@anchor{29eb}
@deffn {메서드} remove (value, /)

Remove the first occurrence of `value' from the array.
@end deffn

@geindex clear() (array.array 메서드)
@anchor{library/array array array clear}@anchor{4bf}
@deffn {메서드} clear ()

배열에서 모든 항목을 제거합니다.


Added in version 3.13.

@end deffn

@geindex reverse() (array.array 메서드)
@anchor{library/array array array reverse}@anchor{29ec}
@deffn {메서드} reverse ()

배열의 항목 순서를 뒤집습니다.
@end deffn

@geindex tobytes() (array.array 메서드)
@anchor{library/array array array tobytes}@anchor{1475}
@deffn {메서드} tobytes ()

배열을 기곗값 배열로 변환하고 바이트열 표현(@ref{14c6,,tofile()} 메서드로 파일에 기록될 바이트 시퀀스와 같습니다)을 반환합니다.


Added in version 3.2: @code{tostring()}은 명확하게 하려고 @ref{1475,,tobytes()}로 이름을 바꿨습니다.

@end deffn

@geindex tofile() (array.array 메서드)
@anchor{library/array array array tofile}@anchor{14c6}
@deffn {메서드} tofile (f, /)

모든 항목을 (기곗값으로) @ref{13c8,,파일 객체} `f'에 씁니다.
@end deffn

@geindex tolist() (array.array 메서드)
@anchor{library/array array array tolist}@anchor{29ed}
@deffn {메서드} tolist ()

배열을 같은 항목이 있는 일반 리스트로 변환합니다.
@end deffn

@geindex tounicode() (array.array 메서드)
@anchor{library/array array array tounicode}@anchor{29ee}
@deffn {메서드} tounicode ()

배열을 유니코드 문자열로 변환합니다. 배열은 형 코드가 @code{'u'} 나 @code{'w'} 이어야 합니다; 그렇지 않으면 @ref{2ec,,ValueError}가 발생합니다. 다른 형의 배열로부터 유니코드 문자열을 얻으려면 @code{array.tobytes().decode(enc)}를 사용하십시오.
@end deffn
@end deffn

배열 객체의 문자열 표현은 @code{array(typecode, initializer)} 형태를 취합니다. 배열이 비어 있으면 `initializer'가 생략되고, 그렇지 않으면 `typecode'가 @code{'u'} 나 @code{'w'} 인 경우 유니코드 문자열이 되고, 그렇지 않으면 숫자 리스트가 됩니다. 문자열 표현은 @ref{4a4,,eval()}을 사용하여 같은 형과 값을 갖는 배열로 다시 변환될 수 있음이 보장됩니다. 단 @code{from array import array}를 사용하여 @ref{4c0,,array} 클래스를 임포트 한다고 가정합니다. 변수 @code{inf} 와 @code{nan} 도 해당 부동소수점 값을 포함하는 경우 정의해야합니다. 예:

@example
array('l')
array('w', 'hello \u2641')
array('l', [1, 2, 3, 4, 5])
array('d', [1.0, 2.0, 3.14, -inf, nan])
@end example


@subsubheading 더 보기



@table @asis

@item 모듈 @ref{db,,struct}

이질적인(heterogeneous) 바이너리 데이터의 패킹과 언 패킹.

@item NumPy@footnote{https://numpy.org/}

NumPy 패키지는 다른 배열형을 정의합니다.
@end table


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node weakref — Weak references,types — 동적 형 생성과 내장형 이름,array — 효율적인 숫자 배열,데이터형
@anchor{library/weakref doc}@anchor{29ef}@anchor{library/weakref mod-weakref}@anchor{110c}@anchor{library/weakref module-weakref}@anchor{11a}@anchor{library/weakref translation-repo}@anchor{29f0}@anchor{library/weakref weakref-weak-references}@anchor{29f1}
@subsection @code{weakref} — Weak references


@geindex module; weakref

`소스 코드:' Lib/weakref.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/weakref.py}


__________________________________________________________________


The @code{weakref} module allows the Python programmer to create `weak
references' to objects.

@c When making changes to the examples in this file, be sure to update
@c Lib/test/test_weakref.py::libreftest too!

이하에서, 용어 `참조대상(referent)'은 약한 참조로 참조되는 객체를 의미합니다.

객체에 대한 약한 참조만으로는 객체를 살아있게 유지할 수 없습니다: 참조대상에 대한 유일한 남은 참조가 약한 참조면, @ref{17dd,,가비지 수거}는 자유롭게 참조대상을 파괴하고 메모리를 다른 용도로 재사용할 수 있습니다. 그러나 객체가 실제로 파괴될 때까지 약한 참조는 강한 참조가 없어도 객체를 반환할 수 있습니다.

약한 참조의 주요 용도는 큰 객체를 보유하는 캐시나 매핑을 구현하는 것입니다. 큰 객체는 캐시나 매핑에 등장한다는 이유만으로 살아 있지 않아야 합니다.

For example, if you have a number of large binary image objects, you may wish to
associate a name with each.  If you used a Python dictionary to map names to
images, or images to names, the image objects would remain alive just because
they appeared as values or keys in the dictionaries.  The
@ref{192a,,WeakKeyDictionary} and @ref{192b,,WeakValueDictionary} classes supplied by
the @code{weakref} module are an alternative, using weak references to construct
mappings that don’t keep objects alive solely because they appear in the mapping
objects.  If, for example, an image object is a value in a
@code{WeakValueDictionary}, then when the last remaining references to that
image object are the weak references held by weak mappings, garbage collection
can reclaim the object, and its corresponding entries in weak mappings are
simply deleted.

@ref{192a,,WeakKeyDictionary}와 @ref{192b,,WeakValueDictionary}는 구현에 약한 참조를 사용하여, 가비지 수거에서 키나 값이 회수될 때, 약한 딕셔너리에 알리는 약한 참조에 대한 콜백 함수를 설정합니다. @ref{7f4,,WeakSet}은 @ref{184,,set} 인터페이스를 구현하지만, @code{WeakKeyDictionary} 처럼 원소에 대한 약한 참조를 유지합니다.

@ref{c6e,,finalize}는 객체가 가비지 수거될 때 호출될 정리 함수를 등록하는 간단한 방법을 제공합니다. 이 모듈은 원시 약한 참조에 콜백 함수를 설정하는 것보다 사용하기가 더 쉽습니다. 모듈은 객체가 수거될 때까지 자동으로 파이널라이저가 활성 상태로 유지되도록 하기 때문입니다.

Most programs should find that using one of these weak container types
or @ref{c6e,,finalize} is all they need – it’s not usually necessary to
create your own weak references directly.  The low-level machinery is
exposed by the @code{weakref} module for the benefit of advanced uses.

모든 객체를 약하게 참조할 수 있는 것은 아닙니다. 약한 참조를 지원하는 객체에는 클래스 인스턴스, 파이썬으로 작성된 함수 (C로 작성된 함수는 아닙니다), 인스턴스 메서드, 집합, 불변 집합(frozenset), 일부 @ref{13c8,,파일 객체}, @ref{1260,,제너레이터}, 형 객체, 소켓, 배열, 데크(deque), 정규식 패턴 객체 및 코드 객체가 포함됩니다.


버전 3.2에서 변경: thread.lock, threading.Lock 및 코드 객체에 대한 지원이 추가되었습니다.


@ref{24d,,list}와 @ref{183,,dict}와 같은 여러 내장형은 약한 참조를 직접 지원하지 않지만, 서브 클래싱을 통해 지원을 추가할 수 있습니다:

@example
class Dict(dict):
    pass

obj = Dict(red=1, green=2, blue=3)   # 이 객체는 약한 참조할 수 있습니다
@end example

@ref{610,,tuple}과 @ref{19b,,int}와 같은 다른 내장형은 서브 클래싱 될 때도 약한 참조를 지원하지 않습니다.

확장형은 쉽게 약한 참조를 지원하도록 만들 수 있습니다; @ref{29f2,,약한 참조 지원}을 참조하십시오.

When @code{__slots__} are defined for a given type, weak reference support is
disabled unless a @code{'__weakref__'} string is also present in the sequence of
strings in the @code{__slots__} declaration.
See @ref{237b,,__slots__ documentation} for details.

@geindex ref (weakref 클래스)
@anchor{library/weakref weakref ref}@anchor{11ef}
@deffn {클래스} weakref.ref (object[, callback])

`object'에 대한 약한 참조를 반환합니다. 참조대상이 아직 살아있으면 참조 객체를 호출하여 원래 객체를 얻을 수 있습니다. 참조대상이 더는 존재하지 않으면 참조 객체를 호출할 때 @ref{884,,None}이 반환됩니다. @code{None}이 아닌 `callback'이 제공되고, 반환된 약한 참조 객체가 여전히 살아있으면, 객체가 파이널라이즈 되려고 할 때 콜백이 호출됩니다; 약한 참조 객체는 콜백에 유일한 매개 변수로 전달됩니다; 참조대상은 더는 사용할 수 없습니다.

같은 객체에 대해 여러 개의 약한 참조를 구성할 수 있습니다. 각 약한 참조에 등록된 콜백은 가장 최근에 등록된 콜백에서 가장 오래전에 등록된 콜백 순으로 호출됩니다.

콜백에 의해 발생한 예외는 표준 에러 출력에 표시되지만, 전파될 수는 없습니다; 객체의 @ref{11fc,,__del__()} 메서드에서 발생한 예외와 정확히 같은 방식으로 처리됩니다.

약한 참조는 `object'가 해시 가능하면 @ref{823,,해시 가능}입니다. `object'가 삭제된 후에도 해시값을 유지합니다. 오직 `object'가 삭제된 후에 @ref{800,,hash()}를 처음 호출하면, 호출은 @ref{198,,TypeError}를 발생시킵니다.

약한 참조는 동등 검사를 지원하지만, 순서는 지원하지 않습니다. 참조대상이 여전히 살아 있다면, 두 참조는 (`callback'과 관계없이) 참조대상과 같은 동등 관계를 갖습니다. 참조대상이 삭제되었으면, 참조 객체가 같은 객체일 때만 참조가 같습니다.

이것은 팩토리 함수가 아니라 서브 클래싱 할 수 있는 형입니다.

@geindex __callback__ (weakref.ref의 속성)
@anchor{library/weakref weakref ref __callback__}@anchor{11f0}
@deffn {속성} __callback__

이 읽기 전용 어트리뷰트는 현재 약한 참조와 연관된 콜백을 반환합니다. 콜백이 없거나 약한 참조의 참조대상이 더는 살아있지 않으면 이 어트리뷰트의 값은 @code{None}이 됩니다.
@end deffn


버전 3.4에서 변경: @ref{11f0,,__callback__} 어트리뷰트를 추가했습니다.

@end deffn

@geindex proxy() (weakref 모듈)
@anchor{library/weakref weakref proxy}@anchor{c45}
@deffn {함수} weakref.proxy (object[, callback])

`object'로의 약한 참조를 사용하는 프락시를 반환합니다. 이는 약한 참조 객체에서 사용되는 명시적 역참조를 요구하는 대신 대부분의 문맥에서 프락시의 사용을 지원합니다. 반환된 객체는 `object'가 콜러블인지에 따라 @code{ProxyType}이나 @code{CallableProxyType} 형을 갖습니다. 프락시 객체는 참조대상에 관계없이 @ref{823,,해시 가능}하지 않습니다; 이것은 그들의 근본적인 가변 특성과 관련된 여러 가지 문제를 피하고, 딕셔너리 키로 사용하는 것을 방지합니다. `callback'은 @ref{11ef,,ref()} 함수의 같은 이름의 매개 변수와 같습니다.

Accessing an attribute of the proxy object after the referent is
garbage collected raises @ref{1712,,ReferenceError}.


버전 3.8에서 변경: 행렬 곱셈 연산자 @code{@@}와 @code{@@=}을 포함하도록 프락시 객체에 대한 연산자 지원을 확장했습니다.

@end deffn

@geindex getweakrefcount() (weakref 모듈)
@anchor{library/weakref weakref getweakrefcount}@anchor{29f3}
@deffn {함수} weakref.getweakrefcount (object)

`object'를 참조하는 약한 참조와 프락시의 개수를 반환합니다.
@end deffn

@geindex getweakrefs() (weakref 모듈)
@anchor{library/weakref weakref getweakrefs}@anchor{29f4}
@deffn {함수} weakref.getweakrefs (object)

`object'를 참조하는 모든 약한 참조와 프락시 객체의 리스트를 반환합니다.
@end deffn

@geindex WeakKeyDictionary (weakref 클래스)
@anchor{library/weakref weakref WeakKeyDictionary}@anchor{192a}
@deffn {클래스} weakref.WeakKeyDictionary ([dict])

키를 약하게 참조하는 매핑 클래스. 더는 키에 대한 강한 참조가 없으면 딕셔너리의 항목이 삭제됩니다. 이것은 응용 프로그램의 다른 부분이 소유한 객체에 어트리뷰트를 추가하지 않고도 추가 데이터를 연결하는 데 사용될 수 있습니다. 어트리뷰트 액세스를 재정의하는 객체에 특히 유용할 수 있습니다.

Note that when a key with equal value to an existing key (but not equal identity)
is inserted into the dictionary, it replaces the value but does not replace the
existing key. Due to this, when the reference to the original key is deleted, it
also deletes the entry in the dictionary:

@example
>>> class T(str): pass
...
>>> k1, k2 = T(), T()
>>> d = weakref.WeakKeyDictionary()
>>> d[k1] = 1   # d = @{k1: 1@}
>>> d[k2] = 2   # d = @{k1: 2@}
>>> del k1      # d = @{@}
@end example

A workaround would be to remove the key prior to reassignment:

@example
>>> class T(str): pass
...
>>> k1, k2 = T(), T()
>>> d = weakref.WeakKeyDictionary()
>>> d[k1] = 1   # d = @{k1: 1@}
>>> del d[k1]
>>> d[k2] = 2   # d = @{k2: 2@}
>>> del k1      # d = @{k2: 2@}
@end example


버전 3.9에서 변경: 
@geindex Python 향상 제안; PEP 584
PEP 584@footnote{https://peps.python.org/pep-0584/}에 지정된 대로, @code{|}와 @code{|=} 연산자에 대한 지원이 추가되었습니다.

@end deffn

@ref{192a,,WeakKeyDictionary} 객체에는 내부 참조를 직접 노출하는 추가 메서드가 있습니다. 참조는 사용되는 시점에 “살아있다고” 보장되지 않아서, 참조를 호출한 결과를 사용하기 전에 확인해야 합니다. 가비지 수거기가 키를 필요 이상으로 길게 유지하도록 하는 참조를 만들지 않도록 하는 데 사용할 수 있습니다.

@geindex keyrefs() (weakref.WeakKeyDictionary 메서드)
@anchor{library/weakref weakref WeakKeyDictionary keyrefs}@anchor{29f5}
@deffn {메서드} WeakKeyDictionary.keyrefs ()

키에 대한 약한 참조의 이터러블을 반환합니다.
@end deffn

@geindex WeakValueDictionary (weakref 클래스)
@anchor{library/weakref weakref WeakValueDictionary}@anchor{192b}
@deffn {클래스} weakref.WeakValueDictionary ([dict])

값을 약하게 참조하는 매핑 클래스. 값에 대한 강한 참조가 더는 존재하지 않을 때 딕셔너리의 항목이 삭제됩니다.


버전 3.9에서 변경: 
@geindex Python 향상 제안; PEP 584
PEP 584@footnote{https://peps.python.org/pep-0584/}에 지정된 대로, @code{|}와 @code{|=} 연산자에 대한 지원이 추가되었습니다.

@end deffn

@ref{192b,,WeakValueDictionary} 객체에는 @ref{29f5,,WeakKeyDictionary.keyrefs} 메서드와 같은 문제가 있는 추가 메서드가 있습니다.

@geindex valuerefs() (weakref.WeakValueDictionary 메서드)
@anchor{library/weakref weakref WeakValueDictionary valuerefs}@anchor{29f6}
@deffn {메서드} WeakValueDictionary.valuerefs ()

값에 대한 약한 참조의 이터러블을 반환합니다.
@end deffn

@geindex WeakSet (weakref 클래스)
@anchor{library/weakref weakref WeakSet}@anchor{7f4}
@deffn {클래스} weakref.WeakSet ([elements])

원소에 대한 약한 참조를 유지하는 집합 클래스. 원소에 대한 강한 참조가 더는 존재하지 않을 때 원소가 삭제됩니다.
@end deffn

@geindex WeakMethod (weakref 클래스)
@anchor{library/weakref weakref WeakMethod}@anchor{11ee}
@deffn {클래스} weakref.WeakMethod (method[, callback])

연결된 메서드(즉, 클래스에 정의되고 인스턴스에서 조회된 메서드)에 대한 약한 참조를 시뮬레이트 하는 사용자 지정 @ref{11ef,,ref} 서브 클래스. 연결된 메서드는 일시적이므로, 표준 약한 참조는 유지할 수 없습니다. @ref{11ee,,WeakMethod}에는 객체나 원래 함수가 죽을 때까지 연결된 메서드를 다시 만드는 특별한 코드가 있습니다:

@example
>>> class C:
...     def method(self):
...         print("method called!")
...
>>> c = C()
>>> r = weakref.ref(c.method)
>>> r()
>>> r = weakref.WeakMethod(c.method)
>>> r()
<bound method C.method of <__main__.C object at 0x7fc859830220>>
>>> r()()
method called!
>>> del c
>>> gc.collect()
0
>>> r()
>>>
@end example

`callback' is the same as the parameter of the same name to the @ref{11ef,,ref()} function.


Added in version 3.4.

@end deffn

@geindex finalize (weakref 클래스)
@anchor{library/weakref weakref finalize}@anchor{c6e}
@deffn {클래스} weakref.finalize (obj, func, /, *args, **kwargs)

`obj'가 가비지 수거될 때 호출되는 콜러블 파이널라이저 객체를 반환합니다. 일반적인 약한 참조와 달리, 파이널라이저는 참조 객체가 수집될 때까지 항상 생존하므로, 수명 주기 관리가 크게 간소화됩니다.

파이널라이저는 (명시적으로나 가비지 수거에서) 호출될 때까지 `살아있다고' 간주하며, 그 후 `죽습니다'. 살아있는 파이널라이저를 호출하면 @code{func(*arg, **kwargs)}를 평가한 결과가 반환되고, 죽은 파이널라이저를 호출하면 @ref{884,,None}이 반환됩니다.

가비지 수거 중에 파이널라이저 콜백에서 발생한 예외는 표준 에러 출력에 표시되지만, 전파할 수는 없습니다. 객체의 @ref{11fc,,__del__()} 메서드나 약한 참조의 콜백에서 발생하는 예외와 같은 방식으로 처리됩니다.

프로그램이 종료될 때, @ref{d,,atexit} 어트리뷰트가 거짓으로 설정되지 않은 한 각 남은 살아있는 파이널라이저가 호출됩니다. 만들어진 순서와 반대 순서로 호출됩니다.

모듈 전역이 @ref{884,,None}으로 교체된 경우 @ref{47a,,인터프리터 종료}의 후반 동안에는 파이널라이저가 콜백을 호출하지 않습니다.

@geindex __call__() (weakref.finalize 메서드)
@anchor{library/weakref weakref finalize __call__}@anchor{29f7}
@deffn {메서드} __call__ ()

`self'가 살아 있으면 이를 죽은 것으로 표시하고 @code{func(*args, **kwargs)} 호출 결과를 반환합니다. `self'가 죽었으면 @ref{884,,None}을 반환합니다.
@end deffn

@geindex detach() (weakref.finalize 메서드)
@anchor{library/weakref weakref finalize detach}@anchor{29f8}
@deffn {메서드} detach ()

`self'가 살아 있으면 이를 죽은 것으로 표시하고 튜플 @code{(obj, func, args, kwargs)}를 반환합니다. `self'가 죽었으면 @ref{884,,None}을 반환합니다.
@end deffn

@geindex peek() (weakref.finalize 메서드)
@anchor{library/weakref weakref finalize peek}@anchor{29f9}
@deffn {메서드} peek ()

`self'가 살아 있으면 튜플 @code{(obj, func, args, kwargs)}를 반환합니다. `self'가 죽었으면 @ref{884,,None}을 반환합니다.
@end deffn

@geindex alive (weakref.finalize의 속성)
@anchor{library/weakref weakref finalize alive}@anchor{29fa}
@deffn {속성} alive

파이널라이저가 살아 있으면 참이고, 그렇지 않으면 거짓인 프로퍼티.
@end deffn

@geindex atexit (weakref.finalize의 속성)
@anchor{library/weakref weakref finalize atexit}@anchor{29fb}
@deffn {속성} atexit

기본값이 참인, 쓰기 가능한 불리언 프로퍼티. 프로그램이 종료할 때, @ref{29fb,,atexit}가 참인 남은 모든 살아있는 파이널라이저를 호출합니다. 그것들은 만들어진 순서와 반대 순서로 호출됩니다.
@end deffn

@cartouche
@quotation 참고 
`func', `args' 및 `kwargs'가 직접이나 간접적으로 `obj'에 대한 참조를 소유하지 않는 것이 중요합니다. 그렇지 않으면 `obj'는 가비지 수거되지 않습니다. 특히, `func'는 `obj'의 연결된 메서드가 아니어야 합니다.
@end quotation
@end cartouche


Added in version 3.4.

@end deffn

@geindex ReferenceType (weakref 모듈)
@anchor{library/weakref weakref ReferenceType}@anchor{1b5b}
@deffn {데이터} weakref.ReferenceType

약한 참조 객체의 형 객체.
@end deffn

@geindex ProxyType (weakref 모듈)
@anchor{library/weakref weakref ProxyType}@anchor{1b5c}
@deffn {데이터} weakref.ProxyType

콜러블이 아닌 객체의 프락시를 위한 형 객체.
@end deffn

@geindex CallableProxyType (weakref 모듈)
@anchor{library/weakref weakref CallableProxyType}@anchor{1b5d}
@deffn {데이터} weakref.CallableProxyType

콜러블 객체의 프락시를 위한 형 객체.
@end deffn

@geindex ProxyTypes (weakref 모듈)
@anchor{library/weakref weakref ProxyTypes}@anchor{29fc}
@deffn {데이터} weakref.ProxyTypes

프락시의 모든 형 객체를 포함하는 시퀀스. 이것은 두 프락시 형 모두의 이름 지정에 의존하지 않고 객체가 프락시인지 검사하기 더 쉽게 만들 수 있습니다.
@end deffn


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 205

@item PEP 205@footnote{https://peps.python.org/pep-0205/} - 약한 참조

이전 구현에 대한 링크와 다른 언어의 유사한 기능에 대한 정보를 포함하는, 이 기능에 대한 제안과 근거.
@end table


@menu
* 약한 참조 객체:: 
* 예: 예<2>. 
* 파이널라이저 객체:: 
* 파이널라이저와 __del__() 메서드의 비교: 파이널라이저와 __del__ 메서드의 비교. 

@end menu

@node 약한 참조 객체,예<2>,,weakref — Weak references
@anchor{library/weakref weak-reference-objects}@anchor{29fd}@anchor{library/weakref weakref-objects}@anchor{29fe}
@subsubsection 약한 참조 객체


약한 참조 객체에는 @ref{11f0,,ref.__callback__} 외에 메서드와 어트리뷰트가 없습니다. 약한 참조 객체는 참조대상이 아직 존재한다면 호출함으로써 얻을 수 있도록 합니다:

@example
>>> import weakref
>>> class Object:
...     pass
...
>>> o = Object()
>>> r = weakref.ref(o)
>>> o2 = r()
>>> o is o2
True
@end example

참조대상이 더는 존재하지 않을 때, 참조 객체를 호출하면 @ref{884,,None}을 반환합니다:

@example
>>> del o, o2
>>> print(r())
None
@end example

약한 참조 객체가 여전히 살아있는지를 검사하는 것은 @code{ref() is not None} 표현식을 사용하여 수행해야 합니다. 일반적으로, 참조 객체를 사용할 필요가 있는 응용 프로그램 코드는 다음 패턴을 따라야 합니다:

@example
# r은 약한 참조 객체입니다
o = r()
if o is None:
    # 참조대상이 가비지 수거되었습니다
    print("Object has been deallocated; can't frobnicate.")
else:
    print("Object is still live!")
    o.do_something_useful()
@end example

“생존”에 대해 별도의 검사를 사용하면 스레드 응용 프로그램에서 경쟁 조건이 발생합니다; 약한 참조가 호출되기 전에 다른 스레드가 약한 참조를 무효화 할 수 있습니다; 위에 표시된 관용구는 단일 스레드 응용 프로그램뿐만 아니라 다중 스레드 응용 프로그램에서도 안전합니다.

서브 클래싱을 통해 @ref{11ef,,ref} 객체의 특수한 버전을 만들 수 있습니다. 이는 @ref{192b,,WeakValueDictionary} 구현에 사용되어 매핑의 각 항목에 대한 메모리 오버헤드를 줄입니다. 이는 추가 정보를 참조와 연관시키는 데 가장 유용 할 수 있지만, 참조대상을 꺼내기 위한 호출에 추가 처리를 삽입하는 데 사용될 수도 있습니다.

이 예제는 @ref{11ef,,ref}의 서브 클래스를 사용하여 객체에 대한 추가 정보를 저장하고 참조대상에 액세스할 때 반환되는 값에 영향을 주는 방법을 보여줍니다:

@example
import weakref

class ExtendedRef(weakref.ref):
    def __init__(self, ob, callback=None, /, **annotations):
        super().__init__(ob, callback)
        self.__counter = 0
        for k, v in annotations.items():
            setattr(self, k, v)

    def __call__(self):
        """참조대상과 참조가 호출된 횟수를 포함하는 쌍을 반환합니다.
        """
        ob = super().__call__()
        if ob is not None:
            self.__counter += 1
            ob = (ob, self.__counter)
        return ob
@end example

@node 예<2>,파이널라이저 객체,약한 참조 객체,weakref — Weak references
@anchor{library/weakref example}@anchor{29ff}@anchor{library/weakref weakref-example}@anchor{2a00}
@subsubsection 예


이 간단한 예제는 응용 프로그램이 객체 ID를 사용하여 이전에 본 객체를 조회하는 방법을 보여줍니다. 그런 다음 객체를 강제로 살아있도록 하지 않으면서 다른 자료 구조에서 객체의 ID를 사용할 수 있지만, 살아있다면 객체를 여전히 ID로 조회할 수 있습니다.

@c Example contributed by Tim Peters.

@example
import weakref

_id2obj_dict = weakref.WeakValueDictionary()

def remember(obj):
    oid = id(obj)
    _id2obj_dict[oid] = obj
    return oid

def id2obj(oid):
    return _id2obj_dict[oid]
@end example

@node 파이널라이저 객체,파이널라이저와 __del__ 메서드의 비교,예<2>,weakref — Weak references
@anchor{library/weakref finalize-examples}@anchor{2a01}@anchor{library/weakref finalizer-objects}@anchor{2a02}
@subsubsection 파이널라이저 객체


@ref{c6e,,finalize}를 사용해서 얻을 수 있는 주요 이점은 반환된 파이널라이저 객체를 보존할 필요 없이 콜백을 간단하게 등록할 수 있다는 것입니다. 예를 들어

@example
>>> import weakref
>>> class Object:
...     pass
...
>>> kenny = Object()
>>> weakref.finalize(kenny, print, "You killed Kenny!")
<finalize object at ...; for 'Object' at ...>
>>> del kenny
You killed Kenny!
@end example

파이널라이저를 직접 호출할 수도 있습니다. 그러나 파이널라이저는 콜백을 최대 한 번 호출합니다.

@example
>>> def callback(x, y, z):
...     print("CALLBACK")
...     return x + y + z
...
>>> obj = Object()
>>> f = weakref.finalize(obj, callback, 1, 2, z=3)
>>> assert f.alive
>>> assert f() == 6
CALLBACK
>>> assert not f.alive
>>> f()                     # callback not called because finalizer dead
>>> del obj                 # callback not called because finalizer dead
@end example

@ref{29f8,,detach()} 메서드를 사용하여 파이널라이저를 등록 취소할 수 있습니다. 그러면 파이널라이저를 죽이고 만들어질 때 생성자에 전달된 인자가 반환됩니다.

@example
>>> obj = Object()
>>> f = weakref.finalize(obj, callback, 1, 2, z=3)
>>> f.detach()
(<...Object object ...>, <function callback ...>, (1, 2), @{'z': 3@})
>>> newobj, func, args, kwargs = _
>>> assert not f.alive
>>> assert newobj is obj
>>> assert func(*args, **kwargs) == 6
CALLBACK
@end example

@ref{29fb,,atexit} 어트리뷰트를 @ref{d2a,,False}로 설정하지 않는 한, 파이널라이저가 살아있다면 프로그램이 종료될 때 호출됩니다. 예를 들어

@example
>>> obj = Object()
>>> weakref.finalize(obj, print, "obj dead or exiting")
<finalize object at ...; for 'Object' at ...>
>>> exit()
obj dead or exiting
@end example

@node 파이널라이저와 __del__ 메서드의 비교,,파이널라이저 객체,weakref — Weak references
@anchor{library/weakref comparing-finalizers-with-del-methods}@anchor{2a03}
@subsubsection 파이널라이저와 @code{__del__()} 메서드의 비교


인스턴스가 임시 디렉터리를 나타내는 클래스를 만들고 싶다고 가정하십시오. 다음 이벤트 중 첫 번째 것이 발생할 때 디렉터리는 내용과 함께 삭제되어야 합니다:


@itemize *

@item 
객체가 가비지 수거됩니다,

@item 
객체의 @code{remove()} 메서드가 호출됩니다, 또는

@item 
프로그램이 종료합니다.
@end itemize

다음과 같이 @ref{11fc,,__del__()} 메서드를 사용하여 클래스를 구현하려고 시도할 수 있습니다:

@example
class TempDir:
    def __init__(self):
        self.name = tempfile.mkdtemp()

    def remove(self):
        if self.name is not None:
            shutil.rmtree(self.name)
            self.name = None

    @@property
    def removed(self):
        return self.name is None

    def __del__(self):
        self.remove()
@end example

파이썬 3.4부터, @ref{11fc,,__del__()} 메서드는 더는 참조 순환이 가비지 수거되는 것을 막지 않으며, @ref{47a,,인터프리터 종료} 중에 모듈 전역이 더는 @ref{884,,None}으로 강제되지 않습니다. 따라서 이 코드는 CPython에서 아무런 문제 없이 작동해야 합니다.

그러나, @ref{11fc,,__del__()} 메서드의 처리는 인터프리터의 가비지 수거기 구현에 대한 내부 세부 사항에 의존하기 때문에 구현에 따라 다르기로 악명 높습니다.

더욱 강인한 대안은 객체의 전체 상태에 액세스하기보다 필요한 특정 함수와 객체만 참조하는 파이널라이저를 정의하는 것일 수 있습니다:

@example
class TempDir:
    def __init__(self):
        self.name = tempfile.mkdtemp()
        self._finalizer = weakref.finalize(self, shutil.rmtree, self.name)

    def remove(self):
        self._finalizer()

    @@property
    def removed(self):
        return not self._finalizer.alive
@end example

이처럼 정의된 파이널라이저는 디렉터리를 적절히 정리하는 데 필요한 세부 사항에 대한 참조만 받습니다. 객체가 가비지 수거되지 않으면 종료 시에 파이널라이저는 여전히 호출됩니다.

약한 참조 기반 파이널라이저의 다른 장점은 제삼자가 정의를 제어하는 클래스에 대해 파이널라이저를 등록하는 데 사용할 수 있다는 것입니다, 가령 모듈이 언로드 될 때 코드 실행하기:

@example
import weakref, sys
def unloading_module():
    # 함수 바디에서 모듈 전역으로의 묵시적 참조
weakref.finalize(sys.modules[__name__], unloading_module)
@end example

@cartouche
@quotation 참고 
프로그램이 종료될 때 데몬 스레드에서 파이널라이저 객체를 만들면 종료 시에 파이널라이저가 호출되지 않을 가능성이 있습니다. 그러나, 데몬 스레드 @ref{a7e,,atexit.register()}에서, @code{try: ... finally: ...}와 @code{with: ...}는 정리가 발생한다고 보장하지 않습니다.
@end quotation
@end cartouche

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node types — 동적 형 생성과 내장형 이름,copy — 얕은 복사와 깊은 복사 연산,weakref — Weak references,데이터형
@anchor{library/types doc}@anchor{2a04}@anchor{library/types module-types}@anchor{109}@anchor{library/types translation-repo}@anchor{2a05}@anchor{library/types types-dynamic-type-creation-and-names-for-built-in-types}@anchor{2a06}
@subsection @code{types} — 동적 형 생성과 내장형 이름


@geindex module; types

`소스 코드:' Lib/types.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/types.py}


__________________________________________________________________


이 모듈은 새로운 형의 동적 생성을 지원하는 유틸리티 함수를 정의합니다.

표준 파이썬 인터프리터가 사용하지만, @ref{19b,,int}나 @ref{169,,str}처럼 내장으로 노출되지 않는 일부 객체 형의 이름도 정의합니다.

마지막으로, 내장되기에 충분히 기본적이지 않은 몇 가지 추가 형 관련 유틸리티 클래스와 함수를 제공합니다.

@menu
* 동적 형 생성:: 
* 표준 인터프리터 형:: 
* 추가 유틸리티 클래스와 함수:: 
* 코루틴 유틸리티 함수:: 

@end menu

@node 동적 형 생성,표준 인터프리터 형,,types — 동적 형 생성과 내장형 이름
@anchor{library/types dynamic-type-creation}@anchor{2a07}
@subsubsection 동적 형 생성


@geindex new_class() (types 모듈)
@anchor{library/types types new_class}@anchor{1366}
@deffn {함수} types.new_class (name, bases=(), kwds=None, exec_body=None)

적절한 메타 클래스를 사용하여 동적으로 클래스 객체를 만듭니다.

처음 세 개의 인자는 클래스 정의 헤더를 구성하는 요소들입니다: 클래스 이름, 베이스 클래스 (순서대로), 키워드 인자 (가령 @code{metaclass}).

`exec_body' 인자는 새로 만들어진 클래스 이름 공간을 채우는 데 사용되는 콜백입니다. 클래스 이름 공간을 유일한 인자로 받아들이고 클래스 내용으로 이름 공간을 직접 갱신해야 합니다. 콜백이 제공되지 않으면, @code{lambda ns: None}를 전달하는 것과 같은 효과가 있습니다.


Added in version 3.3.

@end deffn

@geindex prepare_class() (types 모듈)
@anchor{library/types types prepare_class}@anchor{1367}
@deffn {함수} types.prepare_class (name, bases=(), kwds=None)

적절한 메타 클래스를 계산하고 클래스 이름 공간을 만듭니다.

인자는 클래스 정의 헤더를 구성하는 요소들입니다: 클래스 이름, 베이스 클래스 (순서대로) 및 키워드 인자 (가령 @code{metaclass}).

반환 값은 3-튜플입니다: @code{metaclass, namespace, kwds}

`metaclass'는 적절한 메타 클래스이고, `namespace'는 준비된 클래스 이름 공간이며 `kwds'는 @code{'metaclass'} 항목이 제거된 전달된 `kwds' 인자의 갱신된 사본입니다. `kwds' 인자가 전달되지 않으면, 빈 딕셔너리가 됩니다.


Added in version 3.3.



버전 3.6에서 변경: 반환된 튜플의 @code{namespace} 요소의 기본값이 변경되었습니다. 이제 메타 클래스에 @code{__prepare__} 메서드가 없으면 삽입 순서 보존 맵핑이 사용됩니다.

@end deffn


@subsubheading 더 보기



@table @asis

@item @ref{23be,,메타 클래스}

이 함수들이 지원하는 클래스 생성 절차에 대한 자세한 내용

@geindex Python 향상 제안; PEP 3115

@item PEP 3115@footnote{https://peps.python.org/pep-3115/} - 파이썬 3000의 메타 클래스

@code{__prepare__} 이름 공간 훅을 도입했습니다
@end table


@geindex resolve_bases() (types 모듈)
@anchor{library/types types resolve_bases}@anchor{d94}
@deffn {함수} types.resolve_bases (bases)

@geindex Python 향상 제안; PEP 560
PEP 560@footnote{https://peps.python.org/pep-0560/}의 명세에 따라 MRO 항목을 동적으로 결정합니다.

이 함수는 @ref{f43,,type}의 인스턴스가 아닌 항목들을 `bases'에서 찾고, @ref{ce2,,__mro_entries__()} 메서드가 있는 각 객체가 이 메서드 호출의 언 패킹 된 결과로 대체된 튜플을 반환합니다. `bases' 항목이 @code{type}의 인스턴스이거나, @code{__mro_entries__()} 메서드가 없으면, 반환 튜플에 변경되지 않은 상태로 포함됩니다.


Added in version 3.7.

@end deffn

@geindex get_original_bases() (types 모듈)
@anchor{library/types types get_original_bases}@anchor{6f4}
@deffn {함수} types.get_original_bases (cls, /)

Return the tuple of objects originally given as the bases of `cls' before
the @ref{ce2,,__mro_entries__()} method has been called on any bases
(following the mechanisms laid out in 
@geindex Python 향상 제안; PEP 560
PEP 560@footnote{https://peps.python.org/pep-0560/}). This is useful for
introspecting @ref{6f5,,Generics}.

For classes that have an @code{__orig_bases__} attribute, this
function returns the value of @code{cls.__orig_bases__}.
For classes without the @code{__orig_bases__} attribute,
@ref{16b1,,cls.__bases__} is returned.

예제:

@example
from typing import TypeVar, Generic, NamedTuple, TypedDict

T = TypeVar("T")
class Foo(Generic[T]): ...
class Bar(Foo[int], float): ...
class Baz(list[str]): ...
Eggs = NamedTuple("Eggs", [("a", int), ("b", str)])
Spam = TypedDict("Spam", @{"a": int, "b": str@})

assert Bar.__bases__ == (Foo, float)
assert get_original_bases(Bar) == (Foo[int], float)

assert Baz.__bases__ == (list,)
assert get_original_bases(Baz) == (list[str],)

assert Eggs.__bases__ == (tuple,)
assert get_original_bases(Eggs) == (NamedTuple,)

assert Spam.__bases__ == (dict,)
assert get_original_bases(Spam) == (TypedDict,)

assert int.__bases__ == (object,)
assert get_original_bases(int) == (object,)
@end example


Added in version 3.12.

@end deffn


@subsubheading 더 보기


@geindex Python 향상 제안; PEP 560
PEP 560@footnote{https://peps.python.org/pep-0560/} - typing 모듈과 제네릭 형에 대한 코어 지원


@node 표준 인터프리터 형,추가 유틸리티 클래스와 함수,동적 형 생성,types — 동적 형 생성과 내장형 이름
@anchor{library/types standard-interpreter-types}@anchor{2a08}
@subsubsection 표준 인터프리터 형


이 모듈은 파이썬 인터프리터를 구현하는 데 필요한 많은 형의 이름을 제공합니다. @code{listiterator} 형과 같이 처리 중에 우연히 발생하는 일부 형은 의도적으로 포함하지 않았습니다.

이러한 이름의 일반적인 용도는 @ref{2ad,,isinstance()}나 @ref{9c4,,issubclass()} 검사입니다.

이러한 형을 인스턴스 화할 때는 서명이 파이썬 버전마다 다를 수 있음에 유의해야 합니다.

다음과 같은 형들에 대해 표준 이름이 정의됩니다:

@geindex NoneType (types 모듈)
@anchor{library/types types NoneType}@anchor{a52}
@deffn {데이터} types.NoneType

The type of @ref{884,,None}.


Added in version 3.10.

@end deffn

@geindex FunctionType (types 모듈)
@geindex LambdaType (types 모듈)
@anchor{library/types types FunctionType}@anchor{a83}
@deffn {데이터} types.FunctionType
@anchor{library/types types LambdaType}@anchor{2a09}
@deffnx {데이터} types.LambdaType

사용자 정의 함수와 @ref{14a2,,lambda} 표현식이 만든 함수의 형.

인자 @code{code}로 @ref{1c6c,,감사 이벤트} @code{function.__new__}를 발생시킵니다.

감사 이벤트는 함수 객체의 직접 인스턴스 화에서만 발생하며, 일반 컴파일에서는 발생하지 않습니다.
@end deffn

@geindex GeneratorType (types 모듈)
@anchor{library/types types GeneratorType}@anchor{19ab}
@deffn {데이터} types.GeneratorType

제너레이터 함수가 만든, @ref{1260,,제너레이터}-이터레이터 객체의 형.
@end deffn

@geindex CoroutineType (types 모듈)
@anchor{library/types types CoroutineType}@anchor{1088}
@deffn {데이터} types.CoroutineType

@ref{7ec,,async def} 함수가 만든 @ref{6b8,,코루틴} 객체의 형.


Added in version 3.5.

@end deffn

@geindex AsyncGeneratorType (types 모듈)
@anchor{library/types types AsyncGeneratorType}@anchor{2a0a}
@deffn {데이터} types.AsyncGeneratorType

비동기 제너레이터 함수가 만든, @ref{249b,,비동기 제너레이터}-이터레이터 객체의 형.


Added in version 3.6.

@end deffn

@geindex CodeType (types 클래스)
@anchor{library/types types CodeType}@anchor{32f}
@deffn {클래스} types.CodeType (**kwargs)

@geindex 내장 함수;컴파일

@ref{4b2,,compile()}이 반환하는 것과 같은 @ref{4e6,,코드 객체}의 형.

인자 @code{code}, @code{filename}, @code{name}, @code{argcount}, @code{posonlyargcount}, @code{kwonlyargcount}, @code{nlocals}, @code{stacksize}, @code{flags}로 @ref{1c6c,,감사 이벤트} @code{code.__new__}를 발생시킵니다.

감사된 인자는 초기화자가 요구하는 이름이나 위치와 일치하지 않을 수 있음에 유의하십시오. 감사 이벤트는 코드 객체의 직접 인스턴스 화에서만 발생하며, 일반 컴파일에서는 발생하지 않습니다.
@end deffn

@geindex CellType (types 모듈)
@anchor{library/types types CellType}@anchor{2a0b}
@deffn {데이터} types.CellType

셀 객체의 형: 이러한 객체는 함수의 @ref{1895,,클로저 변수}에 대한 컨테이너로 사용됩니다.


Added in version 3.8.

@end deffn

@geindex MethodType (types 모듈)
@anchor{library/types types MethodType}@anchor{1b81}
@deffn {데이터} types.MethodType

사용자 정의 클래스 인스턴스의 메서드 형.
@end deffn

@geindex BuiltinFunctionType (types 모듈)
@geindex BuiltinMethodType (types 모듈)
@anchor{library/types types BuiltinFunctionType}@anchor{2a0c}
@deffn {데이터} types.BuiltinFunctionType
@anchor{library/types types BuiltinMethodType}@anchor{2a0d}
@deffnx {데이터} types.BuiltinMethodType

@ref{83f,,len()}이나 @ref{277,,sys.exit()} 와 같은 내장 함수와 내장 클래스의 메서드의 형. (여기서, “내장”이라는 용어는 “C로 작성된”을 의미합니다.)
@end deffn

@geindex WrapperDescriptorType (types 모듈)
@anchor{library/types types WrapperDescriptorType}@anchor{d91}
@deffn {데이터} types.WrapperDescriptorType

@ref{8be,,object.__init__()}나 @ref{14a5,,object.__lt__()}와 같은, 일부 내장 데이터형과 베이스 클래스의 메서드의 형.


Added in version 3.7.

@end deffn

@geindex MethodWrapperType (types 모듈)
@anchor{library/types types MethodWrapperType}@anchor{85a}
@deffn {데이터} types.MethodWrapperType

일부 내장 데이터형과 베이스 클래스의 `연결된(bound)' 메서드의 형. 예를 들어 @code{object().__str__}의 형입니다.


Added in version 3.7.

@end deffn

@geindex NotImplementedType (types 모듈)
@anchor{library/types types NotImplementedType}@anchor{a53}
@deffn {데이터} types.NotImplementedType

The type of @ref{1a2,,NotImplemented}.


Added in version 3.10.

@end deffn

@geindex MethodDescriptorType (types 모듈)
@anchor{library/types types MethodDescriptorType}@anchor{d92}
@deffn {데이터} types.MethodDescriptorType

@ref{260a,,str.join()}과 같은 일부 내장 데이터형의 메서드의 형.


Added in version 3.7.

@end deffn

@geindex ClassMethodDescriptorType (types 모듈)
@anchor{library/types types ClassMethodDescriptorType}@anchor{d93}
@deffn {데이터} types.ClassMethodDescriptorType

@code{dict.__dict__['fromkeys']}와 같은 일부 내장 데이터형의 `연결되지 않은(unbound)' 클래스 메서드의 형.


Added in version 3.7.

@end deffn

@geindex ModuleType (types 클래스)
@anchor{library/types types ModuleType}@anchor{1013}
@deffn {클래스} types.ModuleType (name, doc=None)

@ref{19de,,모듈}의 형. 생성자는 만들 모듈의 이름과 선택적으로 @ref{22e9,,독스트링}을 취합니다.


@subsubheading 더 보기



@table @asis

@item @ref{235b,,Documentation on module objects}

Provides details on the special attributes that can be found on
instances of @code{ModuleType}.

@item @ref{1012,,importlib.util.module_from_spec()}

Modules created using the @code{ModuleType} constructor are
created with many of their special attributes unset or set to default
values. @code{module_from_spec()} provides a more robust way of
creating @code{ModuleType} instances which ensures the various
attributes are set appropriately.
@end table

@end deffn

@geindex EllipsisType (types 모듈)
@anchor{library/types types EllipsisType}@anchor{a51}
@deffn {데이터} types.EllipsisType

The type of @ref{2325,,Ellipsis}.


Added in version 3.10.

@end deffn

@geindex GenericAlias (types 클래스)
@anchor{library/types types GenericAlias}@anchor{9ec}
@deffn {클래스} types.GenericAlias (t_origin, t_args)

@code{list[int]}와 같은 @ref{8c0,,매개 변수화된 제네릭}의 형입니다.

@code{t_origin}은 @code{list}, @code{tuple} 또는 @code{dict}와 같이 매개 변수화되지 않은 제네릭 클래스여야 합니다. @code{t_args}는 @code{t_origin}을 매개 변수화하는 형의 @ref{610,,tuple}(길이 1일 수 있습니다)이어야 합니다:

@example
>>> from types import GenericAlias

>>> list[int] == GenericAlias(list, (int,))
True
>>> dict[str, int] == GenericAlias(dict, (str, int))
True
@end example


Added in version 3.9.



버전 3.9.2에서 변경: 이 형은 이제 서브 클래싱 할 수 있습니다.



@subsubheading 더 보기



@table @asis

@item @ref{8c0,,Generic Alias Types}

In-depth documentation on instances of @code{types.GenericAlias}

@geindex Python 향상 제안; PEP 585

@item PEP 585@footnote{https://peps.python.org/pep-0585/} - Type Hinting Generics In Standard Collections

Introducing the @code{types.GenericAlias} class
@end table

@end deffn

@geindex UnionType (types 클래스)
@anchor{library/types types UnionType}@anchor{2a7}
@deffn {클래스} types.UnionType

The type of @ref{9c5,,union type expressions}.


Added in version 3.10.



버전 3.14에서 변경: This is now an alias for @ref{2a8,,typing.Union}.

@end deffn

@geindex TracebackType (types 클래스)
@anchor{library/types types TracebackType}@anchor{ce9}
@deffn {클래스} types.TracebackType (tb_next, tb_frame, tb_lasti, tb_lineno)

@code{sys.exception().__traceback__}에서 발견되는 것과 같은 트레이스백 객체의 형.

사용 가능한 어트리뷰트와 연산에 대한 세부 사항 및 동적으로 트레이스백을 만드는 것에 대한 지침은 @ref{cea,,언어 레퍼런스}를 참조하십시오.
@end deffn

@geindex FrameType (types 모듈)
@anchor{library/types types FrameType}@anchor{1bec}
@deffn {데이터} types.FrameType

@code{tb}가 트레이스백 객체일 때 @ref{23a1,,tb.tb_frame}에서 발견되는 것과 같은 @ref{8ee,,프레임 객체}의 형.
@end deffn

@geindex GetSetDescriptorType (types 모듈)
@anchor{library/types types GetSetDescriptorType}@anchor{2a0e}
@deffn {데이터} types.GetSetDescriptorType

@ref{4a6,,FrameType.f_locals}나 @code{array.array.typecode}와 같은, @code{PyGetSetDef}가 있는 확장 모듈에서 정의된 객체의 형. 이 형은 객체 어트리뷰트에 대한 디스크립터로 사용됩니다. @ref{4b3,,property} 형과 같은 목적을 갖지만, 확장 모듈에 정의된 클래스에 사용됩니다.
@end deffn

@geindex MemberDescriptorType (types 모듈)
@anchor{library/types types MemberDescriptorType}@anchor{2a0f}
@deffn {데이터} types.MemberDescriptorType

@code{datetime.timedelta.days}와 같은, @code{PyMemberDef}가 있는 확장 모듈에서 정의된 객체의 형. 이 형은 표준 변환 함수를 사용하는 간단한 C 데이터 멤버의 디스크립터로 사용됩니다; @ref{4b3,,property} 형과 같은 목적을 갖지만, 확장 모듈에 정의된 클래스를 위한 것입니다.

In addition, when a class is defined with a @ref{16f0,,__slots__} attribute, then for
each slot, an instance of @code{MemberDescriptorType} will be added as an attribute
on the class. This allows the slot to appear in the class’s @ref{e56,,__dict__}.

파이썬의 다른 구현에서, 이 형은 @code{GetSetDescriptorType}과 같을 수 있습니다.
@end deffn

@geindex MappingProxyType (types 클래스)
@anchor{library/types types MappingProxyType}@anchor{697}
@deffn {클래스} types.MappingProxyType (mapping)

매핑의 읽기 전용 프락시. 매핑 항목에 대한 동적 뷰를 제공하는데, 매핑이 변경될 때 뷰가 이러한 변경 사항을 반영함을 의미합니다.


Added in version 3.3.



버전 3.9에서 변경: 
@geindex Python 향상 제안; PEP 584
PEP 584@footnote{https://peps.python.org/pep-0584/}의 새 병합 (@code{|}) 연산자를 지원하도록 갱신되었습니다. 단순히 하부 매핑에 위임합니다.



@deffn {Describe} key in proxy

하부 매핑에 키 `key'가 있으면 @code{True}를, 그렇지 않으면 @code{False}를 반환합니다.
@end deffn


@deffn {Describe} proxy[key]

키 `key'를 사용하여 하부 매핑의 항목을 반환합니다. `key'가 하부 매핑에 없으면 @ref{5e5,,KeyError}를 발생시킵니다.
@end deffn


@deffn {Describe} iter(proxy)

하부 매핑의 키에 대한 이터레이터를 반환합니다. 이것은 @code{iter(proxy.keys())}의 줄임 표현입니다.
@end deffn


@deffn {Describe} len(proxy)

하부 매핑의 항목 수를 반환합니다.
@end deffn

@geindex copy() (types.MappingProxyType 메서드)
@anchor{library/types types MappingProxyType copy}@anchor{2a10}
@deffn {메서드} copy ()

하부 매핑의 얕은 사본을 반환합니다.
@end deffn

@geindex get() (types.MappingProxyType 메서드)
@anchor{library/types types MappingProxyType get}@anchor{2a11}
@deffn {메서드} get (key[, default])

`key'가 하부 매핑에 있으면 `key'의 값을, 그렇지 않으면 `default'를 반환합니다. `default'를 지정하지 않으면, 기본적으로 @code{None}으로 설정되므로, 이 메서드는 절대 @ref{5e5,,KeyError}를 발생시키지 않습니다.
@end deffn

@geindex items() (types.MappingProxyType 메서드)
@anchor{library/types types MappingProxyType items}@anchor{2a12}
@deffn {메서드} items ()

하부 매핑의 항목(items)(@code{(key, value)} 쌍)의 새 뷰를 반환합니다.
@end deffn

@geindex keys() (types.MappingProxyType 메서드)
@anchor{library/types types MappingProxyType keys}@anchor{2a13}
@deffn {메서드} keys ()

하부 매핑의 키(keys)의 새로운 뷰를 반환합니다.
@end deffn

@geindex values() (types.MappingProxyType 메서드)
@anchor{library/types types MappingProxyType values}@anchor{2a14}
@deffn {메서드} values ()

하부 매핑의 값(values)의 새 뷰를 반환합니다.
@end deffn


@deffn {Describe} reversed(proxy)

하부 매핑의 키(keys)에 대한 역 이터레이터를 반환합니다.


Added in version 3.9.

@end deffn


@deffn {Describe} hash(proxy)

하부 매핑의 해시를 반환합니다.


Added in version 3.12.

@end deffn
@end deffn

@geindex CapsuleType (types 클래스)
@anchor{library/types types CapsuleType}@anchor{2a15}
@deffn {클래스} types.CapsuleType

The type of @ref{2a16,,capsule objects}.


Added in version 3.13.

@end deffn

@node 추가 유틸리티 클래스와 함수,코루틴 유틸리티 함수,표준 인터프리터 형,types — 동적 형 생성과 내장형 이름
@anchor{library/types additional-utility-classes-and-functions}@anchor{2a17}
@subsubsection 추가 유틸리티 클래스와 함수


@geindex SimpleNamespace (types 클래스)
@anchor{library/types types SimpleNamespace}@anchor{4e5}
@deffn {클래스} types.SimpleNamespace

이름 공간에 대한 어트리뷰트 액세스와 의미 있는 repr을 제공하는 간단한 @ref{c7d,,object} 서브 클래스.

Unlike @ref{c7d,,object}, with @code{SimpleNamespace} you can add and remove
attributes.

@code{SimpleNamespace} objects may be initialized
in the same way as @ref{183,,dict}: either with keyword arguments,
with a single positional argument, or with both.
When initialized with keyword arguments,
those are directly added to the underlying namespace.
Alternatively, when initialized with a positional argument,
the underlying namespace will be updated with key-value pairs
from that argument (either a mapping object or
an @ref{142c,,iterable} object producing key-value pairs).
All such keys must be strings.

형은 다음 코드와 대략 동등합니다:

@example
class SimpleNamespace:
    def __init__(self, mapping_or_iterable=(), /, **kwargs):
        self.__dict__.update(mapping_or_iterable)
        self.__dict__.update(kwargs)

    def __repr__(self):
        items = (f"@{k@}=@{v!r@}" for k, v in self.__dict__.items())
        return "@{@}(@{@})".format(type(self).__name__, ", ".join(items))

    def __eq__(self, other):
        if isinstance(self, SimpleNamespace) and isinstance(other, SimpleNamespace):
           return self.__dict__ == other.__dict__
        return NotImplemented
@end example

@code{SimpleNamespace}는 @code{class NS: pass}의 대체품으로 유용할 수 있습니다. 하지만, 구조화된 레코드형에는 @ref{4e0,,namedtuple()}을 대신 사용하십시오.

@code{SimpleNamespace} objects are supported by @ref{1c0,,copy.replace()}.


Added in version 3.3.



버전 3.9에서 변경: repr의 어트리뷰트 순서가 알파벳순에서 삽입 순으로 변경되었습니다 (@code{dict}처럼).



버전 3.13에서 변경: Added support for an optional positional argument.

@end deffn

@geindex DynamicClassAttribute() (types 모듈)
@anchor{library/types types DynamicClassAttribute}@anchor{83b}
@deffn {함수} types.DynamicClassAttribute (fget=None, fset=None, fdel=None, doc=None)

클래스의 어트리뷰트 액세스를 __getattr__ 로 보냅니다.

디스크립터이며, 인스턴스와 클래스를 통해 액세스할 때 다르게 작동하는 어트리뷰트를 정의하는 데 사용됩니다. 인스턴스 액세스는 정상적으로 유지되지만, 클래스를 통한 어트리뷰트 액세스는 클래스의 __getattr__ 메서드로 보냅니다; 이는 AttributeError를 발생 시켜 수행됩니다.

이를 통해 인스턴스에서 활성화된 프로퍼티를 가짐과 동시에, 클래스에서 같은 이름을 가진 가상 어트리뷰트를 가질 수 있습니다 (예제는 @ref{841,,enum.Enum}을 참조하십시오).


Added in version 3.4.

@end deffn

@node 코루틴 유틸리티 함수,,추가 유틸리티 클래스와 함수,types — 동적 형 생성과 내장형 이름
@anchor{library/types coroutine-utility-functions}@anchor{2a18}
@subsubsection 코루틴 유틸리티 함수


@geindex coroutine() (types 모듈)
@anchor{library/types types coroutine}@anchor{1087}
@deffn {함수} types.coroutine (gen_func)

이 함수는 @ref{1260,,제너레이터} 함수를 제너레이터 기반 코루틴을 반환하는 @ref{f72,,코루틴 함수}로 변환합니다. 제너레이터 기반 코루틴은 여전히 @ref{dd8,,제너레이터 이터레이터}이지만, @ref{6b8,,코루틴} 객체로도 간주하며 @ref{4c9,,어웨이터블}입니다. 그러나, 반드시 @ref{f74,,__await__()} 메서드를 구현할 필요는 없습니다.

`gen_func'가 제너레이터 함수면 제자리(in-place)에서 수정됩니다.

`gen_func'가 제너레이터 함수가 아니면, 래핑 됩니다. @ref{fda,,collections.abc.Generator}의 인스턴스를 반환하면, 인스턴스는 `어웨이터블' 프락시 객체로 래핑 됩니다. 다른 모든 형의 객체는 그대로 반환됩니다.


Added in version 3.5.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node copy — 얕은 복사와 깊은 복사 연산,pprint — 예쁜 데이터 인쇄기,types — 동적 형 생성과 내장형 이름,데이터형
@anchor{library/copy doc}@anchor{2a19}@anchor{library/copy copy-shallow-and-deep-copy-operations}@anchor{2a1a}@anchor{library/copy module-copy}@anchor{29}@anchor{library/copy translation-repo}@anchor{2a1b}
@subsection @code{copy} — 얕은 복사와 깊은 복사 연산


@geindex module; copy

`소스 코드:' Lib/copy.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/copy.py}


__________________________________________________________________


파이썬에서 대입문은 객체를 복사하지 않고, 대상과 객체 사이에 바인딩을 만듭니다.가변(mutable) 컬렉션 또는 가변(mutable) 항목들을 포함한 컬렉션의 경우때로 컬렉션을 변경하지 않고 사본을 변경하기 위해 복사가 필요합니다.이 모듈은 일반적인 얕은 복사와 깊은 복사 연산을 제공합니다. (아래 설명 참고)

인터페이스 요약:

@geindex copy() (copy 모듈)
@anchor{library/copy copy copy}@anchor{756}
@deffn {함수} copy.copy (obj)

`obj'의 얕은 사본을 반환합니다.
@end deffn

@geindex deepcopy() (copy 모듈)
@anchor{library/copy copy deepcopy}@anchor{d64}
@deffn {함수} copy.deepcopy (obj[, memo])

`obj'의 깊은 사본을 반환합니다.
@end deffn

@geindex replace() (copy 모듈)
@anchor{library/copy copy replace}@anchor{1c0}
@deffn {함수} copy.replace (obj, /, **changes)

Creates a new object of the same type as `obj', replacing fields with values
from `changes'.


Added in version 3.13.

@end deffn

@geindex Error
@anchor{library/copy copy Error}@anchor{2a1c}
@deffn {예외} copy.Error

모듈 특정 에러의 경우 발생됩니다.
@end deffn
@anchor{library/copy shallow-vs-deep-copy}@anchor{1fe2}
얕은 복사와 깊은 복사의 차이점은복합 객체(리스트 또는 클래스 인스턴스들과 같은 다른 객체를 포함한 객체)에만 유효합니다.


@itemize *

@item 
`얕은 복사'는 새로운 복합 객체를 만들고,(가능한 범위까지) 원본 객체를 가리키는 `참조'를 새로운 복합 객체에 삽입합니다.

@item 
`깊은 복사'는 새로운 복합 객체를 만들고,재귀적으로 원본 객체의 `사본'을 새로 만든 복합 객체에 삽입합니다.
@end itemize

깊은 복사 연산은 얕은 복사 연산에는 없는 두 가지 문제가 있습니다:


@itemize *

@item 
재귀 객체(직접적 또는 간접적으로 자신에 대한 참조를 포함하는 복합 객체)는 순환 루프의 원인이 될 수 있습니다.

@item 
깊은 복사는 모든 것을 복사하기 때문에, 지나치게 많이 복사할 수 있습니다. 가령, 복사본 간에 공유할 의도가 있는 것까지도.
@end itemize

@ref{d64,,deepcopy()} 함수는 다음과 같은 방법으로 이 문제들을 피합니다:


@itemize *

@item 
현재 복사 패스 중에 이미 복사된 객체의 @code{memo} 딕셔너리를 가지고 있습니다; 그리고

@item 
사용자 정의 클래스가 복사 연산 또는 복사된 구성요소 집합을 재정의하도록 합니다.
@end itemize

이 모듈은 모듈, 메서드, 스택 트레이스, 스택 프레임, 파일, 소켓, 윈도우나 그 비슷한 유형들은 복사하지 않습니다. 원래 객체를 변화시키지 않고 반환함으로써 함수와 클래스를 (얕고 깊게) “복사” 합니다; 이것은 @ref{ab,,pickle} 모듈로 처리되는 방식과 호환됩니다.

딕셔너리의 얕은 복사는 @ref{dc8,,dict.copy()}를 사용하여 복사할 수 있습니다.그리고 리스트의 얕은 복사는 예를 들어 @code{copied_list = original_list[:]} 처럼전체 리스트의 슬라이스를 대입하여 리스트를 복사할 수도 있습니다.

@geindex 모듈;피클

Classes can use the same interfaces to control copying that they use to control
pickling.  See the description of module @ref{ab,,pickle} for information on these
methods.  In fact, the @code{copy} module uses the registered
pickle functions from the @ref{2a,,copyreg} module.

@geindex __copy__() (복사 프로토콜)
@geindex __deepcopy__() (복사 프로토콜)

클래스가 자체적으로 복사 구현을 정의하기 위해선, @ref{17e5,,__copy__()} 와 @ref{17e6,,__deepcopy__()} 같은 특수 메서드를 정의할 수 있습니다.

@anchor{library/copy object __copy__}@anchor{17e5}
@deffn {메서드} object.__copy__ (self)

얕은 복사 연산을 실행하기 위해 호출됩니다; 추가적인 인자를 전달 하지 않습니다.
@end deffn

@anchor{library/copy object __deepcopy__}@anchor{17e6}
@deffn {메서드} object.__deepcopy__ (self, memo)

깊은 복사 연산을 실행하기 위해 호출됩니다; `memo' 딕셔너리가 하나의 인자로 전달됩니다. @code{__deepcopy__} 구현에서 구성요소의 깊은 복사를 만들기 위해선, 구성요소를 첫 번째 인자로 하고 `memo' 딕셔너리를 두 번째 인자로 하여 @ref{d64,,deepcopy()} 함수를 호출해야 합니다. `memo' 딕셔너리는 불투명 객체로 취급해야 합니다.
@end deffn

@geindex __replace__() (치환 프로토콜)

Function @code{copy.replace()} is more limited
than @ref{756,,copy()} and @ref{d64,,deepcopy()},
and only supports named tuples created by @ref{4e0,,namedtuple()},
@ref{33,,dataclasses}, and other classes which define method @ref{47d,,__replace__()}.

@anchor{library/copy object __replace__}@anchor{47d}
@deffn {메서드} object.__replace__ (self, /, **changes)

This method should create a new object of the same type,
replacing fields with values from `changes'.


Added in version 3.13.

@end deffn


@subsubheading 더 보기



@table @asis

@item 모듈 @ref{ab,,pickle}

객체 상태 조회와 복원을 지원하는데 사용되는 특수 메서드에 관한 논의
@end table


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node pprint — 예쁜 데이터 인쇄기,reprlib — 대안 repr 구현,copy — 얕은 복사와 깊은 복사 연산,데이터형
@anchor{library/pprint doc}@anchor{2a1d}@anchor{library/pprint module-pprint}@anchor{b3}@anchor{library/pprint pprint-data-pretty-printer}@anchor{2a1e}@anchor{library/pprint translation-repo}@anchor{2a1f}
@subsection @code{pprint} — 예쁜 데이터 인쇄기


@geindex module; pprint

`소스 코드:' Lib/pprint.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/pprint.py}


__________________________________________________________________


The @code{pprint} module provides a capability to “pretty-print” arbitrary
Python data structures in a form which can be used as input to the interpreter.
If the formatted structures include objects which are not fundamental Python
types, the representation may not be loadable.  This may be the case if objects
such as files, sockets or classes are included, as well as many other
objects which are not representable as Python literals.

포맷된 표현은 할 수 있다면 객체를 한 줄에 유지하고, 허용된 너비에 맞지 않으면 여러 줄로 나눕니다. 허용된 너비는 `width' 매개 변수로 조정할 수 있고, 기본 값은 80 자 입니다.


버전 3.9에서 변경: @ref{4e5,,types.SimpleNamespace}를 예쁘게 인쇄하는 지원이 추가되었습니다.



버전 3.10에서 변경: @ref{4e1,,dataclasses.dataclass}를 예쁘게 인쇄하는 지원이 추가되었습니다.


@menu
* 함수: 함수<3>. 
* PrettyPrinter 객체:: 
* 예제: 예제<3>. 

@end menu

@node 함수<3>,PrettyPrinter 객체,,pprint — 예쁜 데이터 인쇄기
@anchor{library/pprint functions}@anchor{2a20}@anchor{library/pprint pprint-functions}@anchor{2a21}
@subsubsection 함수


@geindex pp() (pprint 모듈)
@anchor{library/pprint pprint pp}@anchor{c17}
@deffn {함수} pprint.pp (object, stream=None, indent=1, width=80, depth=None, *, compact=False, sort_dicts=False, underscore_numbers=False)

`object'의 포맷된 표현에 줄 바꿈을 추가해서 인쇄합니다. 이 함수는 @ref{1174,,print()} 함수 대신 대화형 인터프리터에서 값을 검사하는 데 사용할 수 있습니다. 팁: 스코프 내에서 사용하기 위해 @code{print = pprint.pp}를 다시 대입할 수도 있습니다.

@*매개변수: 

@itemize *

@item 
@code{object} – The object to be printed.

@item 
@code{stream} (@ref{17b3,,file-like object} | None) – A file-like object to which the output will be written
by calling its @code{write()} method.
If @code{None} (the default), @ref{ccc,,sys.stdout} is used.

@item 
@code{indent} (@ref{19b,,int}) – 각 중첩 수준에 대해 추가되는 들여쓰기 양.

@item 
@code{width} (@ref{19b,,int}) – The desired maximum number of characters per line in the output.
If a structure cannot be formatted within the width constraint,
a best effort will be made.

@item 
@code{depth} (@ref{19b,,int}@code{ | }@code{None}) – The number of nesting levels which may be printed.
If the data structure being printed is too deep,
the next contained level is replaced by @code{...}.
If @code{None} (the default), there is no constraint
on the depth of the objects being formatted.

@item 
@code{compact} (@ref{3c3,,bool}) – Control the way long @ref{715,,sequences} are formatted.
If @code{False} (the default),
each item of a sequence will be formatted on a separate line,
otherwise as many items as will fit within the `width'
will be formatted on each output line.

@item 
@code{sort_dicts} (@ref{3c3,,bool}) – If @code{True}, dictionaries will be formatted with
their keys sorted, otherwise
they will be displayed in insertion order (the default).

@item 
@code{underscore_numbers} (@ref{3c3,,bool}) – If @code{True},
integers will be formatted with the @code{_} character for a thousands separator,
otherwise underscores are not displayed (the default).
@end itemize


@example
>>> import pprint
>>> stuff = ['spam', 'eggs', 'lumberjack', 'knights', 'ni']
>>> stuff.insert(0, stuff)
>>> pprint.pp(stuff)
[<Recursion on list with id=...>,
 'spam',
 'eggs',
 'lumberjack',
 'knights',
 'ni']
@end example


Added in version 3.8.

@end deffn

@geindex pprint() (pprint 모듈)
@anchor{library/pprint pprint pprint}@anchor{a29}
@deffn {함수} pprint.pprint (object, stream=None, indent=1, width=80, depth=None, *, compact=False, sort_dicts=True, underscore_numbers=False)

Alias for @ref{c17,,pp()} with `sort_dicts' set to @code{True} by default,
which would automatically sort the dictionaries’ keys,
you might want to use @code{pp()} instead where it is @code{False} by default.
@end deffn

@geindex pformat() (pprint 모듈)
@anchor{library/pprint pprint pformat}@anchor{117f}
@deffn {함수} pprint.pformat (object, indent=1, width=80, depth=None, *, compact=False, sort_dicts=True, underscore_numbers=False)

`object'의 포맷된 표현을 문자열로 반환합니다. `indent', `width', `depth', `compact', `sort_dicts' 및 `underscore_numbers'는 포매팅 매개 변수로 @ref{117e,,PrettyPrinter} 생성자에 전달되고, 그 의미는 위 설명서에서 기술된 대입니다.
@end deffn

@geindex isreadable() (pprint 모듈)
@anchor{library/pprint pprint isreadable}@anchor{2a22}
@deffn {함수} pprint.isreadable (object)

@geindex 내장 함수;eval

`object'의 포맷된 표현이 “읽을 수 있는”지, 즉 @ref{4a4,,eval()}을 사용하여 값을 재구성하는 데 사용할 수 있는지 판단합니다. 재귀적 객체에 대해서는 항상 @code{False}를 반환합니다.

@example
>>> pprint.isreadable(stuff)
False
@end example
@end deffn

@geindex isrecursive() (pprint 모듈)
@anchor{library/pprint pprint isrecursive}@anchor{2a23}
@deffn {함수} pprint.isrecursive (object)

Determine if `object' requires a recursive representation.  This function is
subject to the same limitations as noted in @ref{2a24,,saferepr()} below and may raise an
@ref{f67,,RecursionError} if it fails to detect a recursive object.
@end deffn

@geindex saferepr() (pprint 모듈)
@anchor{library/pprint pprint saferepr}@anchor{2a24}
@deffn {함수} pprint.saferepr (object)

일부 일반적인 자료 구조(@ref{183,,dict}, @ref{24d,,list}, @ref{610,,tuple} 과 @code{__repr__}이 재정의되지 않은 서브클래스의 인스턴스)에서의 재귀에 대해 보호되는, `object'의 문자열 표현을 반환합니다. 객체의 표현이 재귀적 항목을 노출하면, 재귀적 참조는 @code{<Recursion on typename with id=number>}로 표시됩니다. 표현에는 이외의 다른 포매팅이 적용되지 않습니다.

@example
>>> pprint.saferepr(stuff)
"[<Recursion on list with id=...>, 'spam', 'eggs', 'lumberjack', 'knights', 'ni']"
@end example
@end deffn

@node PrettyPrinter 객체,예제<3>,함수<3>,pprint — 예쁜 데이터 인쇄기
@anchor{library/pprint id1}@anchor{2a25}@anchor{library/pprint prettyprinter-objects}@anchor{2a26}
@subsubsection PrettyPrinter 객체


@geindex ...;자리 표시자

@geindex PrettyPrinter (pprint 클래스)
@anchor{library/pprint pprint PrettyPrinter}@anchor{117e}
@deffn {클래스} pprint.PrettyPrinter (indent=1, width=80, depth=None, stream=None, *, compact=False, sort_dicts=True, underscore_numbers=False)

@ref{117e,,PrettyPrinter} 인스턴스를 만듭니다.

Arguments have the same meaning as for @ref{c17,,pp()}.
Note that they are in a different order, and that `sort_dicts' defaults to @code{True}.

@example
>>> import pprint
>>> stuff = ['spam', 'eggs', 'lumberjack', 'knights', 'ni']
>>> stuff.insert(0, stuff[:])
>>> pp = pprint.PrettyPrinter(indent=4)
>>> pp.pprint(stuff)
[   ['spam', 'eggs', 'lumberjack', 'knights', 'ni'],
    'spam',
    'eggs',
    'lumberjack',
    'knights',
    'ni']
>>> pp = pprint.PrettyPrinter(width=41, compact=True)
>>> pp.pprint(stuff)
[['spam', 'eggs', 'lumberjack',
  'knights', 'ni'],
 'spam', 'eggs', 'lumberjack', 'knights',
 'ni']
>>> tup = ('spam', ('eggs', ('lumberjack', ('knights', ('ni', ('dead',
... ('parrot', ('fresh fruit',))))))))
>>> pp = pprint.PrettyPrinter(depth=6)
>>> pp.pprint(tup)
('spam', ('eggs', ('lumberjack', ('knights', ('ni', ('dead', (...)))))))
@end example


버전 3.4에서 변경: `compact' 매개 변수가 추가되었습니다.



버전 3.8에서 변경: `sort_dicts' 매개 변수가 추가되었습니다.



버전 3.10에서 변경: `underscore_numbers' 매개 변수가 추가되었습니다.



버전 3.11에서 변경: No longer attempts to write to @code{sys.stdout} if it is @code{None}.

@end deffn

@ref{117e,,PrettyPrinter} 인스턴스에는 다음과 같은 메서드가 있습니다:

@geindex pformat() (pprint.PrettyPrinter 메서드)
@anchor{library/pprint pprint PrettyPrinter pformat}@anchor{2a27}
@deffn {메서드} PrettyPrinter.pformat (object)

`object'의 포맷된 표현을 반환합니다. @ref{117e,,PrettyPrinter} 생성자에 전달된 옵션을 고려합니다.
@end deffn

@geindex pprint() (pprint.PrettyPrinter 메서드)
@anchor{library/pprint pprint PrettyPrinter pprint}@anchor{2a28}
@deffn {메서드} PrettyPrinter.pprint (object)

구성된 스트림에 `object'의 포맷된 표현과 불 넘김을 인쇄합니다.
@end deffn

다음 메서드는 같은 이름의 해당 함수에 대한 구현을 제공합니다. 새로운 @ref{117e,,PrettyPrinter} 객체를 만들 필요가 없으므로, 인스턴스에서 이러한 메서드를 사용하는 것이 약간 더 효율적입니다.

@geindex isreadable() (pprint.PrettyPrinter 메서드)
@anchor{library/pprint pprint PrettyPrinter isreadable}@anchor{2a29}
@deffn {메서드} PrettyPrinter.isreadable (object)

@geindex 내장 함수;eval

object의 포맷된 표현이 “읽을 수 있는”지, 즉 @ref{4a4,,eval()}을 사용하여 값을 재구성하는 데 사용할 수 있는지 판단합니다. 재귀 객체에 대해 @code{False}를 반환함에 유의하십시오. @ref{117e,,PrettyPrinter}의 `depth' 매개 변수가 설정되고 객체가 허용된 것보다 더 깊으면, @code{False}를 반환합니다.
@end deffn

@geindex isrecursive() (pprint.PrettyPrinter 메서드)
@anchor{library/pprint pprint PrettyPrinter isrecursive}@anchor{2a2a}
@deffn {메서드} PrettyPrinter.isrecursive (object)

object가 재귀적 표현을 요구하는지 판단합니다.
@end deffn

이 메서드는 서브 클래스가 객체가 문자열로 변환되는 방식을 수정할 수 있도록 하는 훅으로 제공됩니다. 기본 구현은 @ref{2a24,,saferepr()} 구현의 내부를 사용합니다.

@geindex format() (pprint.PrettyPrinter 메서드)
@anchor{library/pprint pprint PrettyPrinter format}@anchor{1ce4}
@deffn {메서드} PrettyPrinter.format (object, context, maxlevels, level)

세 가지 값을 반환합니다: 포맷된 버전의 `object'를 문자열로, 결과가 읽을 수 있는지를 나타내는 플래그와 재귀가 감지되었는지를 나타내는 플래그. 첫 번째 인자는 표시할 객체입니다. 두 번째는 현재 표현 컨텍스트(표현에 영향을 주는 `object'의 직접 및 간접 컨테이너)의 일부인 객체의 @ref{1628,,id()}를 키로 포함하는 딕셔너리입니다; 이미 `context'에 표현된 객체가 표현되어야 할 필요가 있으면, 세 번째 반환 값은 @code{True}이어야 합니다. @ref{1ce4,,format()} 메서드에 대한 재귀 호출은 컨테이너에 대한 추가 항목을 이 딕셔너리에 추가해야 합니다. 세 번째 인자 `maxlevels'는 재귀에 요청된 제한을 줍니다; 요청된 제한이 없으면 @code{0}입니다. 이 인자는 재귀 호출에 수정되지 않은 채 전달되어야 합니다. 네 번째 인자 `level'은 현재 수준을 제공합니다; 재귀 호출은 현재 호출보다 작은 값으로 전달되어야 합니다.
@end deffn

@node 예제<3>,,PrettyPrinter 객체,pprint — 예쁜 데이터 인쇄기
@anchor{library/pprint example}@anchor{2a2b}@anchor{library/pprint pprint-example}@anchor{2a2c}
@subsubsection 예제


@ref{c17,,pp()} 함수와 매개 변수의 여러 용도를 예시하기 위해, PyPI@footnote{https://pypi.org}에서 프로젝트에 대한 정보를 가져옵시다:

@example
>>> import json
>>> import pprint
>>> from urllib.request import urlopen
>>> with urlopen('https://pypi.org/pypi/sampleproject/1.2.0/json') as resp:
...     project_info = json.load(resp)['info']
@end example

기본적인 형태에서, @ref{c17,,pp()}는 전체 객체를 보여줍니다:

@example
>>> pprint.pp(project_info)
@{'author': 'The Python Packaging Authority',
 'author_email': 'pypa-dev@@googlegroups.com',
 'bugtrack_url': None,
 'classifiers': ['Development Status :: 3 - Alpha',
                 'Intended Audience :: Developers',
                 'License :: OSI Approved :: MIT License',
                 'Programming Language :: Python :: 2',
                 'Programming Language :: Python :: 2.6',
                 'Programming Language :: Python :: 2.7',
                 'Programming Language :: Python :: 3',
                 'Programming Language :: Python :: 3.2',
                 'Programming Language :: Python :: 3.3',
                 'Programming Language :: Python :: 3.4',
                 'Topic :: Software Development :: Build Tools'],
 'description': 'A sample Python project\n'
                '=======================\n'
                '\n'
                'This is the description file for the project.\n'
                '\n'
                'The file should use UTF-8 encoding and be written using '
                'ReStructured Text. It\n'
                'will be used to generate the project webpage on PyPI, and '
                'should be written for\n'
                'that purpose.\n'
                '\n'
                'Typical contents for this file would include an overview of '
                'the project, basic\n'
                'usage examples, etc. Generally, including the project '
                'changelog in here is not\n'
                'a good idea, although a simple "What\'s New" section for the '
                'most recent version\n'
                'may be appropriate.',
 'description_content_type': None,
 'docs_url': None,
 'download_url': 'UNKNOWN',
 'downloads': @{'last_day': -1, 'last_month': -1, 'last_week': -1@},
 'home_page': 'https://github.com/pypa/sampleproject',
 'keywords': 'sample setuptools development',
 'license': 'MIT',
 'maintainer': None,
 'maintainer_email': None,
 'name': 'sampleproject',
 'package_url': 'https://pypi.org/project/sampleproject/',
 'platform': 'UNKNOWN',
 'project_url': 'https://pypi.org/project/sampleproject/',
 'project_urls': @{'Download': 'UNKNOWN',
                  'Homepage': 'https://github.com/pypa/sampleproject'@},
 'release_url': 'https://pypi.org/project/sampleproject/1.2.0/',
 'requires_dist': None,
 'requires_python': None,
 'summary': 'A sample Python project',
 'version': '1.2.0'@}
@end example

결과는 특정 `depth'로 제한될 수 있습니다 (더 깊은 내용에는 줄임표가 사용됩니다):

@example
>>> pprint.pp(project_info, depth=1)
@{'author': 'The Python Packaging Authority',
 'author_email': 'pypa-dev@@googlegroups.com',
 'bugtrack_url': None,
 'classifiers': [...],
 'description': 'A sample Python project\n'
                '=======================\n'
                '\n'
                'This is the description file for the project.\n'
                '\n'
                'The file should use UTF-8 encoding and be written using '
                'ReStructured Text. It\n'
                'will be used to generate the project webpage on PyPI, and '
                'should be written for\n'
                'that purpose.\n'
                '\n'
                'Typical contents for this file would include an overview of '
                'the project, basic\n'
                'usage examples, etc. Generally, including the project '
                'changelog in here is not\n'
                'a good idea, although a simple "What\'s New" section for the '
                'most recent version\n'
                'may be appropriate.',
 'description_content_type': None,
 'docs_url': None,
 'download_url': 'UNKNOWN',
 'downloads': @{...@},
 'home_page': 'https://github.com/pypa/sampleproject',
 'keywords': 'sample setuptools development',
 'license': 'MIT',
 'maintainer': None,
 'maintainer_email': None,
 'name': 'sampleproject',
 'package_url': 'https://pypi.org/project/sampleproject/',
 'platform': 'UNKNOWN',
 'project_url': 'https://pypi.org/project/sampleproject/',
 'project_urls': @{...@},
 'release_url': 'https://pypi.org/project/sampleproject/1.2.0/',
 'requires_dist': None,
 'requires_python': None,
 'summary': 'A sample Python project',
 'version': '1.2.0'@}
@end example

또한, 최대 문자 `width'를 제안할 수 있습니다. 긴 객체를 분할 할 수 없으면, 지정된 너비를 초과합니다:

@example
>>> pprint.pp(project_info, depth=1, width=60)
@{'author': 'The Python Packaging Authority',
 'author_email': 'pypa-dev@@googlegroups.com',
 'bugtrack_url': None,
 'classifiers': [...],
 'description': 'A sample Python project\n'
                '=======================\n'
                '\n'
                'This is the description file for the '
                'project.\n'
                '\n'
                'The file should use UTF-8 encoding and be '
                'written using ReStructured Text. It\n'
                'will be used to generate the project '
                'webpage on PyPI, and should be written '
                'for\n'
                'that purpose.\n'
                '\n'
                'Typical contents for this file would '
                'include an overview of the project, '
                'basic\n'
                'usage examples, etc. Generally, including '
                'the project changelog in here is not\n'
                'a good idea, although a simple "What\'s '
                'New" section for the most recent version\n'
                'may be appropriate.',
 'description_content_type': None,
 'docs_url': None,
 'download_url': 'UNKNOWN',
 'downloads': @{...@},
 'home_page': 'https://github.com/pypa/sampleproject',
 'keywords': 'sample setuptools development',
 'license': 'MIT',
 'maintainer': None,
 'maintainer_email': None,
 'name': 'sampleproject',
 'package_url': 'https://pypi.org/project/sampleproject/',
 'platform': 'UNKNOWN',
 'project_url': 'https://pypi.org/project/sampleproject/',
 'project_urls': @{...@},
 'release_url': 'https://pypi.org/project/sampleproject/1.2.0/',
 'requires_dist': None,
 'requires_python': None,
 'summary': 'A sample Python project',
 'version': '1.2.0'@}
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node reprlib — 대안 repr 구현,enum — 열거형 지원,pprint — 예쁜 데이터 인쇄기,데이터형
@anchor{library/reprlib doc}@anchor{2a2d}@anchor{library/reprlib module-reprlib}@anchor{c0}@anchor{library/reprlib reprlib-alternate-repr-implementation}@anchor{2a2e}@anchor{library/reprlib translation-repo}@anchor{2a2f}
@subsection @code{reprlib} — 대안 @code{repr()} 구현


@geindex module; reprlib

`소스 코드:' Lib/reprlib.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/reprlib.py}


__________________________________________________________________


@code{reprlib} 모듈은 결과 문자열의 크기에 제한이 있는 객체 표현을 생성하는 수단을 제공합니다. 파이썬 디버거에서 사용되며 다른 문맥에서도 유용할 수 있습니다.

이 모듈은 클래스, 인스턴스 및 함수를 제공합니다.:

@geindex Repr (reprlib 클래스)
@anchor{library/reprlib reprlib Repr}@anchor{2a30}
@deffn {클래스} reprlib.Repr (*, maxlevel=6, maxtuple=6, maxlist=6, maxarray=5, maxdict=4, maxset=6, maxfrozenset=6, maxdeque=6, maxstring=30, maxlong=40, maxother=30, fillvalue='...', indent=None)

내장 @ref{1c1,,repr()}과 유사한 함수를 구현하는 데 유용한 포매팅 서비스를 제공하는 클래스; 과도하게 긴 표현의 생성을 피하고자 객체 형별로 크기 제한이 추가됩니다.

The keyword arguments of the constructor can be used as a shortcut to set the
attributes of the @code{Repr} instance. Which means that the following
initialization:

@example
aRepr = reprlib.Repr(maxlevel=3)
@end example

Is equivalent to:

@example
aRepr = reprlib.Repr()
aRepr.maxlevel = 3
@end example

See section @ref{2a31,,Repr Objects} for more information about @code{Repr}
attributes.


버전 3.12에서 변경: Allow attributes to be set via keyword arguments.

@end deffn

@geindex aRepr (reprlib 모듈)
@anchor{library/reprlib reprlib aRepr}@anchor{2a32}
@deffn {데이터} reprlib.aRepr

아래에 설명된 @ref{2a33,,repr()}로 함수를 제공하는 데 사용되는 @ref{2a30,,Repr}의 인스턴스입니다. 이 객체의 어트리뷰트를 변경하면 @code{repr()}과 파이썬 디버거에서 사용되는 크기 제한에 영향을 줍니다.
@end deffn

@geindex repr() (reprlib 모듈)
@anchor{library/reprlib reprlib repr}@anchor{2a33}
@deffn {함수} reprlib.repr (obj)

@code{aRepr}의 @ref{2a34,,repr()} 메서드입니다. 같은 이름의 내장 함수에 의해 반환된 것과 비슷한 문자열을 반환하지만, 대부분의 크기에는 제한이 있습니다.
@end deffn

크기 제한 도구 외에도, 모듈은 @ref{82e,,__repr__()}에 대한 재귀 호출을 감지하고 대신 자리 표시자 문자열을 치환하는 데코레이터를 제공합니다.

@geindex ...;자리 표시자

@geindex recursive_repr() (reprlib 모듈)
@anchor{library/reprlib reprlib recursive_repr}@anchor{13f8}
@deffn {함수} @@reprlib.recursive_repr (fillvalue='...')

같은 스레드 내에서의 재귀 호출을 감지하는 @ref{82e,,__repr__()} 메서드용 데코레이터. 재귀 호출이 이루어지면, `fillvalue'가 반환되고, 그렇지 않으면 평상시의 @code{__repr__()} 호출이 수행됩니다. 예를 들어:

@example
>>> from reprlib import recursive_repr
>>> class MyList(list):
...     @@recursive_repr()
...     def __repr__(self):
...         return '<' + '|'.join(map(repr, self)) + '>'
...
>>> m = MyList('abc')
>>> m.append(m)
>>> m.append('x')
>>> print(m)
<'a'|'b'|'c'|...|'x'>
@end example


Added in version 3.2.

@end deffn

@menu
* Repr 객체:: 
* Repr 객체 서브 클래싱:: 

@end menu

@node Repr 객체,Repr 객체 서브 클래싱,,reprlib — 대안 repr 구현
@anchor{library/reprlib id1}@anchor{2a31}@anchor{library/reprlib repr-objects}@anchor{2a35}
@subsubsection Repr 객체


@ref{2a30,,Repr} 인스턴스는 여러 객체 형의 표현에 대한 크기 제한과 특정 객체 형을 포맷하는 메서드를 제공하는데 사용될 수 있습니다.

@geindex fillvalue (reprlib.Repr의 속성)
@anchor{library/reprlib reprlib Repr fillvalue}@anchor{2a36}
@deffn {속성} Repr.fillvalue

This string is displayed for recursive references. It defaults to
@code{...}.


Added in version 3.11.

@end deffn

@geindex maxlevel (reprlib.Repr의 속성)
@anchor{library/reprlib reprlib Repr maxlevel}@anchor{2a37}
@deffn {속성} Repr.maxlevel

재귀적 표현의 생성에 대한 심도 한계. 기본값은 @code{6}입니다.
@end deffn

@geindex maxdict (reprlib.Repr의 속성)
@geindex maxlist (reprlib.Repr의 속성)
@geindex maxtuple (reprlib.Repr의 속성)
@geindex maxset (reprlib.Repr의 속성)
@geindex maxfrozenset (reprlib.Repr의 속성)
@geindex maxdeque (reprlib.Repr의 속성)
@geindex maxarray (reprlib.Repr의 속성)
@anchor{library/reprlib reprlib Repr maxdict}@anchor{2a38}
@deffn {속성} Repr.maxdict
@anchor{library/reprlib reprlib Repr maxlist}@anchor{2a39}
@deffnx {속성} Repr.maxlist
@anchor{library/reprlib reprlib Repr maxtuple}@anchor{2a3a}
@deffnx {속성} Repr.maxtuple
@anchor{library/reprlib reprlib Repr maxset}@anchor{2a3b}
@deffnx {속성} Repr.maxset
@anchor{library/reprlib reprlib Repr maxfrozenset}@anchor{2a3c}
@deffnx {속성} Repr.maxfrozenset
@anchor{library/reprlib reprlib Repr maxdeque}@anchor{2a3d}
@deffnx {속성} Repr.maxdeque
@anchor{library/reprlib reprlib Repr maxarray}@anchor{2a3e}
@deffnx {속성} Repr.maxarray

명명된 객체 형을 표현하는 항목 수 제한. 기본값은 @ref{2a38,,maxdict}은 @code{4}, @ref{2a3e,,maxarray}는 @code{5} 이고 그 외는 @code{6}입니다.
@end deffn

@geindex maxlong (reprlib.Repr의 속성)
@anchor{library/reprlib reprlib Repr maxlong}@anchor{2a3f}
@deffn {속성} Repr.maxlong

정수 표현의 최대 문자 수입니다. 숫자는 가운데에서 삭제됩니다. 기본값은 @code{40}입니다.
@end deffn

@geindex maxstring (reprlib.Repr의 속성)
@anchor{library/reprlib reprlib Repr maxstring}@anchor{2a40}
@deffn {속성} Repr.maxstring

문자열 표현의 문자 수 제한. 문자열의 “통상” 표현이 문자 소스로써 사용되는 것에 주의해 주세요: 표현에 이스케이프 시퀀스가 필요하면, 표현이 짧아질 때 이것이 망가질 수 있습니다. 기본값은 @code{30}입니다.
@end deffn

@geindex maxother (reprlib.Repr의 속성)
@anchor{library/reprlib reprlib Repr maxother}@anchor{2a41}
@deffn {속성} Repr.maxother

이 제한은 @ref{2a30,,Repr} 객체에서 구체적인 포맷 메서드를 사용할 수 없는 객체 형의 크기를 제어하는 데 사용됩니다. @ref{2a40,,maxstring}과 비슷한 방식으로 적용됩니다. 기본값은 @code{20}입니다.
@end deffn

@geindex indent (reprlib.Repr의 속성)
@anchor{library/reprlib reprlib Repr indent}@anchor{2a42}
@deffn {속성} Repr.indent

If this attribute is set to @code{None} (the default), the output is formatted
with no line breaks or indentation, like the standard @ref{1c1,,repr()}.
For example:

@example
>>> example = [
...     1, 'spam', @{'a': 2, 'b': 'spam eggs', 'c': @{3: 4.5, 6: []@}@}, 'ham']
>>> import reprlib
>>> aRepr = reprlib.Repr()
>>> print(aRepr.repr(example))
[1, 'spam', @{'a': 2, 'b': 'spam eggs', 'c': @{3: 4.5, 6: []@}@}, 'ham']
@end example

If @code{indent} is set to a string, each recursion level
is placed on its own line, indented by that string:

@example
>>> aRepr.indent = '-->'
>>> print(aRepr.repr(example))
[
-->1,
-->'spam',
-->@{
-->-->'a': 2,
-->-->'b': 'spam eggs',
-->-->'c': @{
-->-->-->3: 4.5,
-->-->-->6: [],
-->-->@},
-->@},
-->'ham',
]
@end example

Setting @code{indent} to a positive integer value behaves as if it
was set to a string with that number of spaces:

@example
>>> aRepr.indent = 4
>>> print(aRepr.repr(example))
[
    1,
    'spam',
    @{
        'a': 2,
        'b': 'spam eggs',
        'c': @{
            3: 4.5,
            6: [],
        @},
    @},
    'ham',
]
@end example


Added in version 3.12.

@end deffn

@geindex repr() (reprlib.Repr 메서드)
@anchor{library/reprlib reprlib Repr repr}@anchor{2a34}
@deffn {메서드} Repr.repr (obj)

인스턴스에 의해 부과된 포매팅을 사용하는 내장 @ref{1c1,,repr()}와 등등합니다.
@end deffn

@geindex repr1() (reprlib.Repr 메서드)
@anchor{library/reprlib reprlib Repr repr1}@anchor{2a43}
@deffn {메서드} Repr.repr1 (obj, level)

@ref{2a34,,repr()}에서 사용되는 재귀적 구현. `obj'의 형을 사용하여 호출할 포매팅 메서드를 결정하고, `obj' 와 `level'을 전달합니다. 형별 메서드는 재귀적 포매팅을 수행하기 위해 @ref{2a43,,repr1()}을 호출해야 하는데, 재귀 호출에서 `level' 값으로 @code{level - 1}을 사용합니다.
@end deffn


@deffn {메서드} Repr.repr_TYPE (obj, level)

특정 형의 포매팅 메서드는 형 이름에 기반하는 이름의 메서드로 구현됩니다. 메서드 이름에서, `TYPE' 은 @code{'_'.join(type(obj).__name__.split())}으로 치환됩니다. 이 메서드로의 디스패치는 @ref{2a43,,repr1()}에 의해 처리됩니다. 재귀적으로 값을 포맷해야 하는 형별 메서드는 @code{self.repr1(subobj, level - 1)}을 호출해야 합니다.
@end deffn

@node Repr 객체 서브 클래싱,,Repr 객체,reprlib — 대안 repr 구현
@anchor{library/reprlib subclassing-repr-objects}@anchor{2a44}@anchor{library/reprlib subclassing-reprs}@anchor{2a45}
@subsubsection Repr 객체 서브 클래싱


@ref{2a43,,Repr.repr1()}에 의한 동적 디스패치의 사용은 @ref{2a30,,Repr}의 서브 클래스가 추가 내장 객체 형에 대한 지원을 추가하거나 이미 지원되는 형의 처리를 수정할 수 있도록 합니다. 이 예제는 파일 객체에 대한 특별한 지원이 어떻게 추가될 수 있는지 보여줍니다:

@example
import reprlib
import sys

class MyRepr(reprlib.Repr):

    def repr_TextIOWrapper(self, obj, level):
        if obj.name in @{'<stdin>', '<stdout>', '<stderr>'@}:
            return obj.name
        return repr(obj)

aRepr = MyRepr()
print(aRepr.repr(sys.stdin))         # '<stdin>' 을 인쇄합니다
@end example

@example
<stdin>
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node enum — 열거형 지원,graphlib — 그래프와 유사한 구조에 작동하는 기능,reprlib — 대안 repr 구현,데이터형
@anchor{library/enum doc}@anchor{2a46}@anchor{library/enum enum-support-for-enumerations}@anchor{2a47}@anchor{library/enum module-enum}@anchor{5a}@anchor{library/enum translation-repo}@anchor{2a48}
@subsection @code{enum} — 열거형 지원


@geindex module; enum


Added in version 3.4.


`소스 코드:' Lib/enum.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/enum.py}

@subsubheading Important



This page contains the API reference information. For tutorial
information and discussion of more advanced topics, see


@itemize *

@item 
@ref{2a49,,Basic Tutorial}

@item 
@ref{2a4a,,Advanced Tutorial}

@item 
@ref{2a4b,,Enum Cookbook}
@end itemize


__________________________________________________________________


열거형은:


@itemize *

@item 
is a set of symbolic names (members) bound to unique values

@item 
can be iterated over to return its canonical (i.e. non-alias) members in
definition order

@item 
uses `call' syntax to return members by value

@item 
uses `index' syntax to return members by name
@end itemize

Enumerations are created either by using @ref{14dc,,class} syntax, or by
using function-call syntax:

@example
>>> from enum import Enum

>>> # 클래스 문법
>>> class Color(Enum):
...     RED = 1
...     GREEN = 2
...     BLUE = 3

>>> # 함수형 문법
>>> Color = Enum('Color', [('RED', 1), ('GREEN', 2), ('BLUE', 3)])
@end example

@ref{14dc,,class} 문법을 사용하여 Enum을 만들 수 있기는 하지만, Enum은 일반적인 파이썬 클래스가 아닙니다. 자세한 내용은 @ref{2a4c,,열거형은 어떻게 다릅니까?} 를 참조하십시오.

@cartouche
@quotation 참고 
명명법


@itemize -

@item 
@code{Color} 클래스는 `열거형(enumeration)' (또는 `enum') 입니다.

@item 
@code{Color.RED}, @code{Color.GREEN} 등의 어트리뷰트는 `열거형 멤버(enumeration members)'(또는 `members')이며 기능상 상수입니다.

@item 
열거형 멤버에는 `이름(names)'과 `값(values)'이 있습니다 (@code{Color.RED}의 이름은 @code{RED}, @code{Color.BLUE}의 값은 @code{3}, 등)
@end itemize
@end quotation
@end cartouche


__________________________________________________________________


@menu
* Module contents:: 
* Data types:: 
* Utilities and decorators:: 
* 참고 사항:: 

@end menu

@node Module contents,Data types,,enum — 열거형 지원
@anchor{library/enum module-contents}@anchor{2a4d}
@subsubsection Module contents


@quotation

@ref{4f7,,EnumType}

@quotation

The @code{type} for Enum and its subclasses.
@end quotation

@ref{841,,Enum}

@quotation

열거형 상수를 만들기 위한 베이스 클래스.
@end quotation

@ref{eda,,IntEnum}

@quotation

@ref{19b,,int}의 서브 클래스이기도 한 열거형 상수를 만들기 위한 베이스 클래스. (@ref{2a4e,,Notes})
@end quotation

@ref{82c,,StrEnum}

@quotation

@ref{169,,str}의 서브 클래스이기도 한 열거형 상수를 만들기 위한 베이스 클래스. (@ref{2a4e,,Notes})
@end quotation

@ref{834,,Flag}

@quotation

@ref{834,,Flag} 멤버십을 잃지 않고 비트 연산을 사용하여 결합할 수 있는 열거형 상수를 만들기 위한 베이스 클래스.
@end quotation

@ref{e99,,IntFlag}

@quotation

@ref{e99,,IntFlag} 멤버십을 잃지 않고 비트 연산자를 사용하여 결합할 수 있는 열거형 상수를 만들기 위한 베이스 클래스. @code{IntFlag} 멤버도 @ref{19b,,int}의 서브 클래스입니다. (@ref{2a4e,,Notes})
@end quotation

@ref{82d,,ReprEnum}

@quotation

Used by @ref{eda,,IntEnum}, @ref{82c,,StrEnum}, and @ref{e99,,IntFlag}
to keep the @ref{169,,str()} of the mixed-in type.
@end quotation

@ref{837,,EnumCheck}

@quotation

An enumeration with the values @code{CONTINUOUS}, @code{NAMED_FLAGS}, and
@code{UNIQUE}, for use with @ref{836,,verify()} to ensure various constraints
are met by a given enumeration.
@end quotation

@ref{835,,FlagBoundary}

@quotation

An enumeration with the values @code{STRICT}, @code{CONFORM}, @code{EJECT}, and
@code{KEEP} which allows for more fine-grained control over how invalid values
are dealt with in an enumeration.
@end quotation

@ref{4f6,,EnumDict}

@quotation

A subclass of @ref{183,,dict} for use when subclassing @ref{4f7,,EnumType}.
@end quotation

@ref{e9a,,auto}

@quotation

Instances are replaced with an appropriate value for Enum members.
@ref{82c,,StrEnum} defaults to the lower-cased version of the member name,
while other Enums default to 1 and increase from there.
@end quotation

@ref{83a,,property()}

@quotation

Allows @ref{841,,Enum} members to have attributes without conflicting with
member names.  The @code{value} and @code{name} attributes are implemented this
way.
@end quotation

@ref{2a4f,,unique()}

@quotation

한 값에 하나의 이름 만 연결되도록 하는 Enum 클래스 데코레이터.
@end quotation

@ref{836,,verify()}

@quotation

Enum class decorator that checks user-selectable constraints on an
enumeration.
@end quotation

@ref{838,,member()}

@quotation

Make @code{obj} a member.  Can be used as a decorator.
@end quotation

@ref{839,,nonmember()}

@quotation

Do not make @code{obj} a member.  Can be used as a decorator.
@end quotation

@ref{83c,,global_enum()}

@quotation

Modify the @ref{169,,str()} and @ref{1c1,,repr()} of an enum
to show its members as belonging to the module instead of its class,
and export the enum members to the global namespace.
@end quotation

@ref{2a50,,show_flag_values()}

@quotation

Return a list of all power-of-two integers contained in a flag.
@end quotation

@ref{1795,,enum.bin()}

@quotation

Like built-in @ref{14ad,,bin()}, except negative values are represented in
two’s complement, and the leading bit always indicates sign
(@code{0} implies positive, @code{1} implies negative).
@end quotation
@end quotation


Added in version 3.6: @code{Flag}, @code{IntFlag}, @code{auto}



Added in version 3.11: @code{StrEnum}, @code{EnumCheck}, @code{ReprEnum}, @code{FlagBoundary}, @code{property}, @code{member}, @code{nonmember}, @code{global_enum}, @code{show_flag_values}



Added in version 3.13: @code{EnumDict}



__________________________________________________________________


@node Data types,Utilities and decorators,Module contents,enum — 열거형 지원
@anchor{library/enum data-types}@anchor{2a51}
@subsubsection Data types


@geindex EnumType (enum 클래스)
@anchor{library/enum enum EnumType}@anchor{4f7}
@deffn {클래스} enum.EnumType

`EnumType' is the @ref{23d0,,metaclass} for `enum' enumerations.  It is possible
to subclass `EnumType' – see @ref{2a52,,Subclassing EnumType}
for details.

@code{EnumType} is responsible for setting the correct @code{__repr__()},
@code{__str__()}, @code{__format__()}, and @code{__reduce__()} methods on the
final `enum', as well as creating the enum members, properly handling
duplicates, providing iteration over the enum class, etc.


Added in version 3.11: Before 3.11 @code{EnumType} was called @code{EnumMeta}, which is still available as an alias.


@geindex __call__() (enum.EnumType 메서드)
@anchor{library/enum enum EnumType __call__}@anchor{2a53}
@deffn {메서드} __call__ (cls, value, names=None, *, module=None, qualname=None, type=None, start=1, boundary=None)

This method is called in two different ways:


@itemize *

@item 
to look up an existing member:

@quotation

@*cls: 
The enum class being called.


@*value: 
The value to lookup.

@end quotation

@item 
to use the @code{cls} enum to create a new enum (only if the existing enum
does not have any members):

@quotation

@*cls: 
The enum class being called.


@*value: 
The name of the new Enum to create.


@*names: 
The names/values of the members for the new Enum.


@*module: 
새로운 Enum 이 만들어지는 모듈의 이름.


@*qualname: 
이 Enum 이 모듈에서 실제로 위치한 곳.


@*type: 
A mix-in type for the new Enum.


@*start: 
The first integer value for the Enum (used by @ref{e9a,,auto}).


@*boundary: 
How to handle out-of-range values from bit operations (@ref{834,,Flag} only).

@end quotation
@end itemize
@end deffn

@geindex __contains__() (enum.EnumType 메서드)
@anchor{library/enum enum EnumType __contains__}@anchor{2a54}
@deffn {메서드} __contains__ (cls, member)

Returns @code{True} if member belongs to the @code{cls}:

@example
>>> some_var = Color.RED
>>> some_var in Color
True
>>> Color.RED.value in Color
True
@end example


버전 3.12에서 변경: Before Python 3.12, a @code{TypeError} is raised if a
non-Enum-member is used in a containment check.

@end deffn

@geindex __dir__() (enum.EnumType 메서드)
@anchor{library/enum enum EnumType __dir__}@anchor{2a55}
@deffn {메서드} __dir__ (cls)

Returns @code{['__class__', '__doc__', '__members__', '__module__']} and the
names of the members in `cls':

@example
>>> dir(Color)
['BLUE', 'GREEN', 'RED', '__class__', '__contains__', '__doc__', '__getitem__', '__init_subclass__', '__iter__', '__len__', '__members__', '__module__', '__name__', '__qualname__']
@end example
@end deffn

@geindex __getitem__() (enum.EnumType 메서드)
@anchor{library/enum enum EnumType __getitem__}@anchor{2a56}
@deffn {메서드} __getitem__ (cls, name)

Returns the Enum member in `cls' matching `name', or raises a @ref{5e5,,KeyError}:

@example
>>> Color['BLUE']
<Color.BLUE: 3>
@end example
@end deffn

@geindex __iter__() (enum.EnumType 메서드)
@anchor{library/enum enum EnumType __iter__}@anchor{2a57}
@deffn {메서드} __iter__ (cls)

`cls' 의 각 멤버를 정의 순서로 반환합니다:

@example
>>> list(Color)
[<Color.RED: 1>, <Color.GREEN: 2>, <Color.BLUE: 3>]
@end example
@end deffn

@geindex __len__() (enum.EnumType 메서드)
@anchor{library/enum enum EnumType __len__}@anchor{2a58}
@deffn {메서드} __len__ (cls)

Returns the number of member in `cls':

@example
>>> len(Color)
3
@end example
@end deffn

@geindex __members__ (enum.EnumType의 속성)
@anchor{library/enum enum EnumType __members__}@anchor{2a59}
@deffn {속성} __members__

Returns a mapping of every enum name to its member, including aliases
@end deffn

@geindex __reversed__() (enum.EnumType 메서드)
@anchor{library/enum enum EnumType __reversed__}@anchor{2a5a}
@deffn {메서드} __reversed__ (cls)

Returns each member in `cls' in reverse definition order:

@example
>>> list(reversed(Color))
[<Color.BLUE: 3>, <Color.GREEN: 2>, <Color.RED: 1>]
@end example
@end deffn
@end deffn

@geindex Enum (enum 클래스)
@anchor{library/enum enum Enum}@anchor{841}
@deffn {클래스} enum.Enum

`Enum' is the base class for all `enum' enumerations.

@geindex name (enum.Enum의 속성)
@anchor{library/enum enum Enum name}@anchor{2a5b}
@deffn {속성} name

The name used to define the @code{Enum} member:

@example
>>> Color.BLUE.name
'BLUE'
@end example
@end deffn

@geindex value (enum.Enum의 속성)
@anchor{library/enum enum Enum value}@anchor{2a5c}
@deffn {속성} value

The value given to the @code{Enum} member:

@example
>>> Color.RED.value
1
@end example

멤버의 값, @ref{2a5d,,__new__()}에서 설정할 수 있습니다.

@cartouche
@quotation 참고 
Enum 멤버 값

멤버 값은 아무것이나 될 수 있습니다: @ref{19b,,int}, @ref{169,,str} 등. 정확한 값이 중요하지 않다면, @ref{e9a,,auto} 인스턴스를 사용할 수 있으며 적절한 값이 선택됩니다. 자세한 내용은 @code{auto}를 참조하세요.

While mutable/unhashable values, such as @ref{183,,dict}, @ref{24d,,list} or
a mutable @ref{4e1,,dataclass}, can be used, they will have a
quadratic performance impact during creation relative to the
total number of mutable/unhashable values in the enum.
@end quotation
@end cartouche
@end deffn

@geindex _name_ (enum.Enum의 속성)
@anchor{library/enum enum Enum _name_}@anchor{2a5e}
@deffn {속성} _name_

멤버의 이름.
@end deffn

@geindex _value_ (enum.Enum의 속성)
@anchor{library/enum enum Enum _value_}@anchor{2a5f}
@deffn {속성} _value_

멤버의 값, @ref{2a5d,,__new__()}에서 설정할 수 있습니다.
@end deffn

@geindex _order_ (enum.Enum의 속성)
@anchor{library/enum enum Enum _order_}@anchor{2a60}
@deffn {속성} _order_

더는 사용되지 않습니다, 하위 호환성을 위해 유지됩니다. (클래스 생성 중 제거되는 클래스 어트리뷰트)

The @code{_order_} attribute can be provided to help keep Python 2 / Python 3 code in sync.
It will be checked against the actual order of the enumeration and raise an error if the two do not match:

@example
>>> class Color(Enum):
...     _order_ = 'RED GREEN BLUE'
...     RED = 1
...     BLUE = 3
...     GREEN = 2
...
Traceback (most recent call last):
...
TypeError: member order does not match _order_:
   ['RED', 'BLUE', 'GREEN']
   ['RED', 'GREEN', 'BLUE']
@end example

@cartouche
@quotation 참고 
In Python 2 code the @code{_order_} attribute is necessary as definition
order is lost before it can be recorded.
@end quotation
@end cartouche


Added in version 3.6.

@end deffn

@geindex _ignore_ (enum.Enum의 속성)
@anchor{library/enum enum Enum _ignore_}@anchor{2a61}
@deffn {속성} _ignore_

@code{_ignore_} is only used during creation and is removed from the
enumeration once creation is complete.

@code{_ignore_} is a list of names that will not become members, and whose
names will also be removed from the completed enumeration.  See
@ref{2a62,,TimePeriod} for an example.


Added in version 3.7.

@end deffn

@geindex __dir__() (enum.Enum 메서드)
@anchor{library/enum enum Enum __dir__}@anchor{1c02}
@deffn {메서드} __dir__ (self)

Returns @code{['__class__', '__doc__', '__module__', 'name', 'value']} and
any public methods defined on `self.__class__':

@example
>>> from enum import Enum
>>> import datetime as dt
>>> class Weekday(Enum):
...     MONDAY = 1
...     TUESDAY = 2
...     WEDNESDAY = 3
...     THURSDAY = 4
...     FRIDAY = 5
...     SATURDAY = 6
...     SUNDAY = 7
...     @@classmethod
...     def today(cls):
...         print(f'today is @{cls(dt.date.today().isoweekday()).name@}')
...
>>> dir(Weekday.SATURDAY)
['__class__', '__doc__', '__eq__', '__hash__', '__module__', 'name', 'today', 'value']
@end example
@end deffn

@geindex _generate_next_value_() (enum.Enum 메서드)
@anchor{library/enum enum Enum _generate_next_value_}@anchor{2a63}
@deffn {메서드} _generate_next_value_ (name, start, count, last_values)

@quotation

@*name: 
The name of the member being defined (e.g. ‘RED’).


@*start: 
The start value for the Enum; the default is 1.


@*count: 
The number of members currently defined, not including this one.


@*last_values: 
A list of the previous values.

@end quotation

A `staticmethod' that is used to determine the next value returned by
@ref{e9a,,auto}.

@cartouche
@quotation 참고 
For standard @code{Enum} classes the next value chosen is the highest
value seen incremented by one.

For @ref{834,,Flag} classes the next value chosen will be the next highest
power-of-two.
@end quotation
@end cartouche

This method may be overridden, e.g.:

@example
>>> from enum import auto, Enum
>>> class PowersOfThree(Enum):
...     @@staticmethod
...     def _generate_next_value_(name, start, count, last_values):
...         return 3 ** (count + 1)
...     FIRST = auto()
...     SECOND = auto()
...
>>> PowersOfThree.SECOND.value
9
@end example


Added in version 3.6.



버전 3.13에서 변경: Prior versions would use the last seen value instead of the highest value.

@end deffn

@geindex __init__() (enum.Enum 메서드)
@anchor{library/enum enum Enum __init__}@anchor{2a64}
@deffn {메서드} __init__ (self, *args, **kwds)

By default, does nothing.  If multiple values are given in the member
assignment, those values become separate arguments to @code{__init__}; e.g.

@example
>>> from enum import Enum
>>> class Weekday(Enum):
...     MONDAY = 1, 'Mon'
@end example

@code{Weekday.__init__()} would be called as @code{Weekday.__init__(self, 1, 'Mon')}
@end deffn

@geindex __init_subclass__() (enum.Enum 메서드)
@anchor{library/enum enum Enum __init_subclass__}@anchor{2a65}
@deffn {메서드} __init_subclass__ (cls, **kwds)

A `classmethod' that is used to further configure subsequent subclasses.
By default, does nothing.
@end deffn

@geindex _missing_() (enum.Enum 메서드)
@anchor{library/enum enum Enum _missing_}@anchor{2a66}
@deffn {메서드} _missing_ (cls, value)

A `classmethod' for looking up values not found in `cls'.  By default it
does nothing, but can be overridden to implement custom search behavior:

@example
>>> from enum import auto, StrEnum
>>> class Build(StrEnum):
...     DEBUG = auto()
...     OPTIMIZED = auto()
...     @@classmethod
...     def _missing_(cls, value):
...         value = value.lower()
...         for member in cls:
...             if member.value == value:
...                 return member
...         return None
...
>>> Build.DEBUG.value
'debug'
>>> Build('deBUG')
<Build.DEBUG: 'debug'>
@end example


Added in version 3.6.

@end deffn

@geindex __new__() (enum.Enum 메서드)
@anchor{library/enum enum Enum __new__}@anchor{2a5d}
@deffn {메서드} __new__ (cls, *args, **kwds)

By default, doesn’t exist.  If specified, either in the enum class
definition or in a mixin class (such as @code{int}), all values given
in the member assignment will be passed; e.g.

@example
>>> from enum import Enum
>>> class MyIntEnum(int, Enum):
...     TWENTYSIX = '1a', 16
@end example

results in the call @code{int('1a', 16)} and a value of @code{26} for the member.

@cartouche
@quotation 참고 
When writing a custom @code{__new__}, do not use @code{super().__new__} –
call the appropriate @code{__new__} instead.
@end quotation
@end cartouche
@end deffn

@geindex __repr__() (enum.Enum 메서드)
@anchor{library/enum enum Enum __repr__}@anchor{1af8}
@deffn {메서드} __repr__ (self)

Returns the string used for `repr()' calls.  By default, returns the
`Enum' name, member name, and value, but can be overridden:

@example
>>> from enum import auto, Enum
>>> class OtherStyle(Enum):
...     ALTERNATE = auto()
...     OTHER = auto()
...     SOMETHING_ELSE = auto()
...     def __repr__(self):
...         cls_name = self.__class__.__name__
...         return f'@{cls_name@}.@{self.name@}'
...
>>> OtherStyle.ALTERNATE, str(OtherStyle.ALTERNATE), f"@{OtherStyle.ALTERNATE@}"
(OtherStyle.ALTERNATE, 'OtherStyle.ALTERNATE', 'OtherStyle.ALTERNATE')
@end example
@end deffn

@geindex __str__() (enum.Enum 메서드)
@anchor{library/enum enum Enum __str__}@anchor{833}
@deffn {메서드} __str__ (self)

Returns the string used for `str()' calls.  By default, returns the
`Enum' name and member name, but can be overridden:

@example
>>> from enum import auto, Enum
>>> class OtherStyle(Enum):
...     ALTERNATE = auto()
...     OTHER = auto()
...     SOMETHING_ELSE = auto()
...     def __str__(self):
...         return f'@{self.name@}'
...
>>> OtherStyle.ALTERNATE, str(OtherStyle.ALTERNATE), f"@{OtherStyle.ALTERNATE@}"
(<OtherStyle.ALTERNATE: 1>, 'ALTERNATE', 'ALTERNATE')
@end example
@end deffn

@geindex __format__() (enum.Enum 메서드)
@anchor{library/enum enum Enum __format__}@anchor{831}
@deffn {메서드} __format__ (self)

Returns the string used for `format()' and `f-string' calls.  By default,
returns @ref{833,,__str__()} return value, but can be overridden:

@example
>>> from enum import auto, Enum
>>> class OtherStyle(Enum):
...     ALTERNATE = auto()
...     OTHER = auto()
...     SOMETHING_ELSE = auto()
...     def __format__(self, spec):
...         return f'@{self.name@}'
...
>>> OtherStyle.ALTERNATE, str(OtherStyle.ALTERNATE), f"@{OtherStyle.ALTERNATE@}"
(<OtherStyle.ALTERNATE: 1>, 'OtherStyle.ALTERNATE', 'ALTERNATE')
@end example
@end deffn

@cartouche
@quotation 참고 
Using @ref{e9a,,auto} with @code{Enum} results in integers of increasing value,
starting with @code{1}.
@end quotation
@end cartouche


버전 3.12에서 변경: Added @ref{1af7,,Dataclass support}


@geindex _add_alias_() (enum.Enum 메서드)
@anchor{library/enum enum Enum _add_alias_}@anchor{2a67}
@deffn {메서드} _add_alias_ ()

Adds a new name as an alias to an existing member:

@example
>>> Color.RED._add_alias_("ERROR")
>>> Color.ERROR
<Color.RED: 1>
@end example

Raises a @ref{452,,NameError} if the name is already assigned to a different member.


Added in version 3.13.

@end deffn

@geindex _add_value_alias_() (enum.Enum 메서드)
@anchor{library/enum enum Enum _add_value_alias_}@anchor{2a68}
@deffn {메서드} _add_value_alias_ ()

Adds a new value as an alias to an existing member:

@example
>>> Color.RED._add_value_alias_(42)
>>> Color(42)
<Color.RED: 1>
@end example


@display
Raises a @ref{2ec,,ValueError} if the value is already linked with a different member.@w{ }
See @ref{2a69,,MultiValueEnum} for an example.@w{ }
@end display




Added in version 3.13.

@end deffn
@end deffn

@geindex IntEnum (enum 클래스)
@anchor{library/enum enum IntEnum}@anchor{eda}
@deffn {클래스} enum.IntEnum

`IntEnum' is the same as @ref{841,,Enum}, but its members are also integers and can be
used anywhere that an integer can be used.  If any integer operation is performed
with an `IntEnum' member, the resulting value loses its enumeration status.

@example
>>> from enum import IntEnum
>>> class Number(IntEnum):
...     ONE = 1
...     TWO = 2
...     THREE = 3
...
>>> Number.THREE
<Number.THREE: 3>
>>> Number.ONE + Number.TWO
3
>>> Number.THREE + 5
8
>>> Number.THREE == 3
True
@end example

@cartouche
@quotation 참고 
Using @ref{e9a,,auto} with @code{IntEnum} results in integers of increasing
value, starting with @code{1}.
@end quotation
@end cartouche


버전 3.11에서 변경: @ref{82f,,__str__()} is now @code{int.__str__()} to
better support the `replacement of existing constants' use-case.
@ref{830,,__format__()} was already @code{int.__format__()} for that same reason.

@end deffn

@geindex StrEnum (enum 클래스)
@anchor{library/enum enum StrEnum}@anchor{82c}
@deffn {클래스} enum.StrEnum

`StrEnum' is the same as @ref{841,,Enum}, but its members are also strings and
can be used in most of the same places that a string can be used. The result
of any string operation performed on or with a `StrEnum' member is not part
of the enumeration.

@example
>>> from enum import StrEnum, auto
>>> class Color(StrEnum):
...     RED = 'r'
...     GREEN = 'g'
...     BLUE = 'b'
...     UNKNOWN = auto()
...
>>> Color.RED
<Color.RED: 'r'>
>>> Color.UNKNOWN
<Color.UNKNOWN: 'unknown'>
>>> str(Color.UNKNOWN)
'unknown'
@end example

@cartouche
@quotation 참고 
There are places in the stdlib that check for an exact @ref{169,,str}
instead of a @code{str} subclass (i.e. @code{type(unknown) == str}
instead of @code{isinstance(unknown, str)}), and in those locations you
will need to use @code{str(MyStrEnum.MY_MEMBER)}.
@end quotation
@end cartouche

@cartouche
@quotation 참고 
Using @ref{e9a,,auto} with @code{StrEnum} results in the lower-cased member
name as the value.
@end quotation
@end cartouche

@cartouche
@quotation 참고 
@ref{82f,,__str__()} is @code{str.__str__()} to better support the
`replacement of existing constants' use-case.  @ref{830,,__format__()} is likewise
@code{str.__format__()} for that same reason.
@end quotation
@end cartouche


Added in version 3.11.

@end deffn

@geindex Flag (enum 클래스)
@anchor{library/enum enum Flag}@anchor{834}
@deffn {클래스} enum.Flag

@code{Flag} is the same as @ref{841,,Enum}, but its members support the bitwise
operators @code{&} (`AND'), @code{|} (`OR'), @code{^} (`XOR'), and @code{~} (`INVERT');
the results of those operations are (aliases of) members of the enumeration.

@geindex __contains__() (enum.Flag 메서드)
@anchor{library/enum enum Flag __contains__}@anchor{2a6a}
@deffn {메서드} __contains__ (self, value)

Returns `True' if value is in self:

@example
>>> from enum import Flag, auto
>>> class Color(Flag):
...     RED = auto()
...     GREEN = auto()
...     BLUE = auto()
...
>>> purple = Color.RED | Color.BLUE
>>> white = Color.RED | Color.GREEN | Color.BLUE
>>> Color.GREEN in purple
False
>>> Color.GREEN in white
True
>>> purple in white
True
>>> white in purple
False
@end example
@end deffn


@deffn {메서드} __iter__(self):

Returns all contained non-alias members:

@example
>>> list(Color.RED)
[<Color.RED: 1>]
>>> list(purple)
[<Color.RED: 1>, <Color.BLUE: 4>]
@end example


Added in version 3.11.

@end deffn


@deffn {메서드} __len__(self):

Returns number of members in flag:

@example
>>> len(Color.GREEN)
1
>>> len(white)
3
@end example


Added in version 3.11.

@end deffn


@deffn {메서드} __bool__(self):

Returns `True' if any members in flag, `False' otherwise:

@example
>>> bool(Color.GREEN)
True
>>> bool(white)
True
>>> black = Color(0)
>>> bool(black)
False
@end example
@end deffn

@geindex __or__() (enum.Flag 메서드)
@anchor{library/enum enum Flag __or__}@anchor{2a6b}
@deffn {메서드} __or__ (self, other)

Returns current flag binary or’ed with other:

@example
>>> Color.RED | Color.GREEN
<Color.RED|GREEN: 3>
@end example
@end deffn

@geindex __and__() (enum.Flag 메서드)
@anchor{library/enum enum Flag __and__}@anchor{2a6c}
@deffn {메서드} __and__ (self, other)

Returns current flag binary and’ed with other:

@example
>>> purple & white
<Color.RED|BLUE: 5>
>>> purple & Color.GREEN
<Color: 0>
@end example
@end deffn

@geindex __xor__() (enum.Flag 메서드)
@anchor{library/enum enum Flag __xor__}@anchor{2a6d}
@deffn {메서드} __xor__ (self, other)

Returns current flag binary xor’ed with other:

@example
>>> purple ^ white
<Color.GREEN: 2>
>>> purple ^ Color.GREEN
<Color.RED|GREEN|BLUE: 7>
@end example
@end deffn


@deffn {메서드} __invert__(self):

Returns all the flags in `type(self)' that are not in `self':

@example
>>> ~white
<Color: 0>
>>> ~purple
<Color.GREEN: 2>
>>> ~Color.RED
<Color.GREEN|BLUE: 6>
@end example
@end deffn

@geindex _numeric_repr_() (enum.Flag 메서드)
@anchor{library/enum enum Flag _numeric_repr_}@anchor{2a6e}
@deffn {메서드} _numeric_repr_ ()

Function used to format any remaining unnamed numeric values.  Default is
the value’s repr; common choices are @ref{14d4,,hex()} and @ref{14d3,,oct()}.
@end deffn

@cartouche
@quotation 참고 
Using @ref{e9a,,auto} with @code{Flag} results in integers that are powers
of two, starting with @code{1}.
@end quotation
@end cartouche


버전 3.11에서 변경: The `repr()' of zero-valued flags has changed.  It
is now:

@example
>>> Color(0)
<Color: 0>
@end example

@end deffn

@geindex IntFlag (enum 클래스)
@anchor{library/enum enum IntFlag}@anchor{e99}
@deffn {클래스} enum.IntFlag

@code{IntFlag} is the same as @ref{834,,Flag}, but its members are also integers and can be
used anywhere that an integer can be used.

@example
>>> from enum import IntFlag, auto
>>> class Color(IntFlag):
...     RED = auto()
...     GREEN = auto()
...     BLUE = auto()
...
>>> Color.RED & 2
<Color: 0>
>>> Color.RED | 2
<Color.RED|GREEN: 3>
@end example

If any integer operation is performed with an `IntFlag' member, the result is
not an `IntFlag':

@example
>>> Color.RED + 2
3
@end example

If a @ref{834,,Flag} operation is performed with an `IntFlag' member and:


@itemize *

@item 
the result is a valid `IntFlag': an `IntFlag' is returned

@item 
the result is not a valid `IntFlag': the result depends on the @ref{835,,FlagBoundary} setting
@end itemize

The @ref{1c1,,repr()} of unnamed zero-valued flags has changed.  It is now:

@example
>>> Color(0)
<Color: 0>
@end example

@cartouche
@quotation 참고 
Using @ref{e9a,,auto} with @code{IntFlag} results in integers that are powers
of two, starting with @code{1}.
@end quotation
@end cartouche


버전 3.11에서 변경: @ref{82f,,__str__()} is now @code{int.__str__()} to better support the
`replacement of existing constants' use-case.  @ref{830,,__format__()} was
already @code{int.__format__()} for that same reason.

Inversion of an @code{IntFlag} now returns a positive value that is the
union of all flags not in the given flag, rather than a negative value.
This matches the existing @ref{834,,Flag} behavior.

@end deffn

@geindex ReprEnum (enum 클래스)
@anchor{library/enum enum ReprEnum}@anchor{82d}
@deffn {클래스} enum.ReprEnum

@code{ReprEnum} uses the @ref{1af8,,repr()} of @ref{841,,Enum},
but the @ref{169,,str()} of the mixed-in data type:


@itemize *

@item 
@code{int.__str__()} for @ref{eda,,IntEnum} and @ref{e99,,IntFlag}

@item 
@code{str.__str__()} for @ref{82c,,StrEnum}
@end itemize

Inherit from @code{ReprEnum} to keep the @ref{169,,str()} / @ref{199,,format()}
of the mixed-in data type instead of using the
@ref{841,,Enum}-default @ref{833,,str()}.


Added in version 3.11.

@end deffn

@geindex EnumCheck (enum 클래스)
@anchor{library/enum enum EnumCheck}@anchor{837}
@deffn {클래스} enum.EnumCheck

`EnumCheck' contains the options used by the @ref{836,,verify()} decorator to ensure
various constraints; failed constraints result in a @ref{2ec,,ValueError}.

@geindex UNIQUE (enum.EnumCheck의 속성)
@anchor{library/enum enum EnumCheck UNIQUE}@anchor{2a6f}
@deffn {속성} UNIQUE

Ensure that each value has only one name:

@example
>>> from enum import Enum, verify, UNIQUE
>>> @@verify(UNIQUE)
... class Color(Enum):
...     RED = 1
...     GREEN = 2
...     BLUE = 3
...     CRIMSON = 1
Traceback (most recent call last):
...
ValueError: aliases found in <enum 'Color'>: CRIMSON -> RED
@end example
@end deffn

@geindex CONTINUOUS (enum.EnumCheck의 속성)
@anchor{library/enum enum EnumCheck CONTINUOUS}@anchor{2a70}
@deffn {속성} CONTINUOUS

Ensure that there are no missing values between the lowest-valued member
and the highest-valued member:

@example
>>> from enum import Enum, verify, CONTINUOUS
>>> @@verify(CONTINUOUS)
... class Color(Enum):
...     RED = 1
...     GREEN = 2
...     BLUE = 5
Traceback (most recent call last):
...
ValueError: invalid enum 'Color': missing values 3, 4
@end example
@end deffn

@geindex NAMED_FLAGS (enum.EnumCheck의 속성)
@anchor{library/enum enum EnumCheck NAMED_FLAGS}@anchor{2a71}
@deffn {속성} NAMED_FLAGS

Ensure that any flag groups/masks contain only named flags – useful when
values are specified instead of being generated by @ref{e9a,,auto()}:

@example
>>> from enum import Flag, verify, NAMED_FLAGS
>>> @@verify(NAMED_FLAGS)
... class Color(Flag):
...     RED = 1
...     GREEN = 2
...     BLUE = 4
...     WHITE = 15
...     NEON = 31
Traceback (most recent call last):
...
ValueError: invalid Flag 'Color': aliases WHITE and NEON are missing combined values of 0x18 [use enum.show_flag_values(value) for details]
@end example
@end deffn

@cartouche
@quotation 참고 
CONTINUOUS and NAMED_FLAGS are designed to work with integer-valued members.
@end quotation
@end cartouche


Added in version 3.11.

@end deffn

@geindex FlagBoundary (enum 클래스)
@anchor{library/enum enum FlagBoundary}@anchor{835}
@deffn {클래스} enum.FlagBoundary

@code{FlagBoundary} controls how out-of-range values are handled in @ref{834,,Flag} and its
subclasses.

@geindex STRICT (enum.FlagBoundary의 속성)
@anchor{library/enum enum FlagBoundary STRICT}@anchor{2a72}
@deffn {속성} STRICT

Out-of-range values cause a @ref{2ec,,ValueError} to be raised. This is the
default for @ref{834,,Flag}:

@example
>>> from enum import Flag, STRICT, auto
>>> class StrictFlag(Flag, boundary=STRICT):
...     RED = auto()
...     GREEN = auto()
...     BLUE = auto()
...
>>> StrictFlag(2**2 + 2**4)
Traceback (most recent call last):
...
ValueError: <flag 'StrictFlag'> invalid value 20
    given 0b0 10100
  allowed 0b0 00111
@end example
@end deffn

@geindex CONFORM (enum.FlagBoundary의 속성)
@anchor{library/enum enum FlagBoundary CONFORM}@anchor{2a73}
@deffn {속성} CONFORM

Out-of-range values have invalid values removed, leaving a valid @ref{834,,Flag}
value:

@example
>>> from enum import Flag, CONFORM, auto
>>> class ConformFlag(Flag, boundary=CONFORM):
...     RED = auto()
...     GREEN = auto()
...     BLUE = auto()
...
>>> ConformFlag(2**2 + 2**4)
<ConformFlag.BLUE: 4>
@end example
@end deffn

@geindex EJECT (enum.FlagBoundary의 속성)
@anchor{library/enum enum FlagBoundary EJECT}@anchor{2a74}
@deffn {속성} EJECT

Out-of-range values lose their @ref{834,,Flag} membership and revert to @ref{19b,,int}.

@example
>>> from enum import Flag, EJECT, auto
>>> class EjectFlag(Flag, boundary=EJECT):
...     RED = auto()
...     GREEN = auto()
...     BLUE = auto()
...
>>> EjectFlag(2**2 + 2**4)
20
@end example
@end deffn

@geindex KEEP (enum.FlagBoundary의 속성)
@anchor{library/enum enum FlagBoundary KEEP}@anchor{2a75}
@deffn {속성} KEEP

Out-of-range values are kept, and the @ref{834,,Flag} membership is kept.
This is the default for @ref{e99,,IntFlag}:

@example
>>> from enum import Flag, KEEP, auto
>>> class KeepFlag(Flag, boundary=KEEP):
...     RED = auto()
...     GREEN = auto()
...     BLUE = auto()
...
>>> KeepFlag(2**2 + 2**4)
<KeepFlag.BLUE|16: 20>
@end example
@end deffn


Added in version 3.11.

@end deffn

@geindex EnumDict (enum 클래스)
@anchor{library/enum enum EnumDict}@anchor{4f6}
@deffn {클래스} enum.EnumDict

`EnumDict' is a subclass of @ref{183,,dict} that is used as the namespace
for defining enum classes (see @ref{e57,,클래스 이름 공간 준비하기}).
It is exposed to allow subclasses of @ref{4f7,,EnumType} with advanced
behavior like having multiple values per member.
It should be called with the name of the enum class being created, otherwise
private names and internal classes will not be handled correctly.

Note that only the @ref{12b1,,MutableMapping} interface
(@ref{14d0,,__setitem__()} and @ref{166a,,update()}) is overridden.
It may be possible to bypass the checks using other @code{dict}
operations like @ref{2401,,|=}.

@geindex member_names (enum.EnumDict의 속성)
@anchor{library/enum enum EnumDict member_names}@anchor{2a76}
@deffn {속성} member_names

멤버 이름의 리스트.
@end deffn


Added in version 3.13.

@end deffn


__________________________________________________________________


@menu
* 지원되는 __dunder__ 이름:: 
* 지원되는 _sunder_ 이름:: 

@end menu

@node 지원되는 __dunder__ 이름,지원되는 _sunder_ 이름,,Data types
@anchor{library/enum enum-dunder-sunder}@anchor{2a77}@anchor{library/enum supported-dunder-names}@anchor{2a78}
@subsubsection 지원되는 @code{__dunder__} 이름


@ref{2a59,,__members__}는 @code{member_name}:@code{member} 항목의 읽기 전용 순서 있는 매핑입니다. 클래스에서만 이용할 수 있습니다.

@ref{2a5d,,__new__()}, if specified, must create and return the enum members;
it is also a very good idea to set the member’s @ref{2a5f,,_value_} appropriately.
Once all the members are created it is no longer used.

@node 지원되는 _sunder_ 이름,,지원되는 __dunder__ 이름,Data types
@anchor{library/enum supported-sunder-names}@anchor{2a79}
@subsubsection 지원되는 @code{_sunder_} 이름



@itemize -

@item 
@ref{2a5e,,_name_} – 멤버의 이름

@item 
@ref{2a5f,,_value_} – 멤버의 값; @code{__new__}에서 설정할 수 있습니다

@item 
@ref{2a66,,_missing_()} – 값을 찾을 수 없을 때 사용되는 조회 함수; 재정의할 수 있습니다

@item 
@ref{2a61,,_ignore_} – 멤버로 변환되지 않고 최종 클래스에서 제거될 @ref{24d,,list}나 @ref{169,,str} 형의 이름 목록

@item 
@ref{2a60,,_order_} – 더는 사용되지 않습니다, 하위 호환성을 위해 유지됩니다 (클래스 생성 중 제거되는 클래스 어트리뷰트)

@item 
@ref{2a63,,_generate_next_value_()} – 열거형 멤버에 대한 적절한 값을 얻기 위해 사용합니다; 재정의할 수 있습니다

@item 
@ref{2a67,,_add_alias_()} – adds a new name as an alias to an existing
member.

@item 
@ref{2a68,,_add_value_alias_()} – adds a new value as an alias to an
existing member.

@item 
While @code{_sunder_} names are generally reserved for the further development
of the @ref{841,,Enum} class and can not be used, some are explicitly allowed:


@itemize -

@item 
@code{_repr_*} (e.g. @code{_repr_html_}), as used in IPython's rich display@footnote{https://ipython.readthedocs.io/en/stable/config/integrating.html#rich-display}
@end itemize
@end itemize


Added in version 3.6: @code{_missing_}, @code{_order_}, @code{_generate_next_value_}



Added in version 3.7: @code{_ignore_}



Added in version 3.13: @code{_add_alias_}, @code{_add_value_alias_}, @code{_repr_*}



__________________________________________________________________


@node Utilities and decorators,참고 사항,Data types,enum — 열거형 지원
@anchor{library/enum ipython-s-rich-display}@anchor{2a7a}@anchor{library/enum utilities-and-decorators}@anchor{2a7b}
@subsubsection Utilities and decorators


@geindex auto (enum 클래스)
@anchor{library/enum enum auto}@anchor{e9a}
@deffn {클래스} enum.auto

`auto' can be used in place of a value.  If used, the `Enum' machinery will
call an @ref{841,,Enum}’s @ref{2a63,,_generate_next_value_()} to get an appropriate value.
For @code{Enum} and @ref{eda,,IntEnum} that appropriate value will be the last value plus
one; for @ref{834,,Flag} and @ref{e99,,IntFlag} it will be the first power-of-two greater
than the highest value; for @ref{82c,,StrEnum} it will be the lower-cased version of
the member’s name.  Care must be taken if mixing `auto()' with manually
specified values.

`auto' instances are only resolved when at the top level of an assignment, either by
itself or as part of a tuple:


@itemize *

@item 
@code{FIRST = auto()} will work (auto() is replaced with @code{1});

@item 
@code{SECOND = auto(), -2} will work (auto is replaced with @code{2}, so @code{2, -2} is
used to create the @code{SECOND} enum member;

@item 
@code{THREE = [auto(), -3]} will `not' work (@code{[<auto instance>, -3]} is used to
create the @code{THREE} enum member)
@end itemize


버전 3.11.1에서 변경: In prior versions, @code{auto()} had to be the only thing
on the assignment line to work properly.


@code{_generate_next_value_} can be overridden to customize the values used by
`auto'.

@cartouche
@quotation 참고 
in 3.13 the default @code{_generate_next_value_} will always return
the highest member value incremented by 1, and will fail if any
member is an incompatible type.
@end quotation
@end cartouche
@end deffn

@geindex property() (enum 모듈)
@anchor{library/enum enum property}@anchor{83a}
@deffn {함수} @@enum.property

A decorator similar to the built-in `property', but specifically for
enumerations.  It allows member attributes to have the same names as members
themselves.

@cartouche
@quotation 참고 
the `property' and the member must be defined in separate classes;
for example, the `value' and `name' attributes are defined in the
`Enum' class, and `Enum' subclasses can define members with the
names @code{value} and @code{name}.
@end quotation
@end cartouche


Added in version 3.11.

@end deffn

@geindex unique() (enum 모듈)
@anchor{library/enum enum unique}@anchor{2a4f}
@deffn {함수} @@enum.unique

열거형 용 @ref{14dc,,class} 데코레이터입니다. 열거형의 @ref{2a59,,__members__}를 검색하여, 별칭을 수집합니다; 발견되면 @ref{2ec,,ValueError}가 세부 정보와 함께 발생합니다:

@example
>>> from enum import Enum, unique
>>> @@unique
... class Mistake(Enum):
...     ONE = 1
...     TWO = 2
...     THREE = 3
...     FOUR = 3
...
Traceback (most recent call last):
...
ValueError: duplicate values found in <enum 'Mistake'>: FOUR -> THREE
@end example
@end deffn

@geindex verify() (enum 모듈)
@anchor{library/enum enum verify}@anchor{836}
@deffn {함수} @@enum.verify

A @ref{14dc,,class} decorator specifically for enumerations.  Members from
@ref{837,,EnumCheck} are used to specify which constraints should be checked
on the decorated enumeration.


Added in version 3.11.

@end deffn

@geindex member() (enum 모듈)
@anchor{library/enum enum member}@anchor{838}
@deffn {함수} @@enum.member

A decorator for use in enums: its target will become a member.


Added in version 3.11.

@end deffn

@geindex nonmember() (enum 모듈)
@anchor{library/enum enum nonmember}@anchor{839}
@deffn {함수} @@enum.nonmember

A decorator for use in enums: its target will not become a member.


Added in version 3.11.

@end deffn

@geindex global_enum() (enum 모듈)
@anchor{library/enum enum global_enum}@anchor{83c}
@deffn {함수} @@enum.global_enum

A decorator to change the @ref{169,,str()} and @ref{1c1,,repr()} of an enum
to show its members as belonging to the module instead of its class.
Should only be used when the enum members are exported
to the module global namespace (see @ref{83e,,re.RegexFlag} for an example).


Added in version 3.11.

@end deffn

@geindex show_flag_values() (enum 모듈)
@anchor{library/enum enum show_flag_values}@anchor{2a50}
@deffn {함수} enum.show_flag_values (value)

Return a list of all power-of-two integers contained in a flag `value'.


Added in version 3.11.

@end deffn

@geindex bin() (enum 모듈)
@anchor{library/enum enum bin}@anchor{1795}
@deffn {함수} enum.bin (num, max_bits=None)

Like built-in @code{bin()}, except negative values are represented in
two’s complement, and the leading bit always indicates sign
(@code{0} implies positive, @code{1} implies negative).

@example
>>> import enum
>>> enum.bin(10)
'0b0 1010'
>>> enum.bin(~10)   # ~10 is -11
'0b1 0101'
@end example


Added in version 3.11.

@end deffn


__________________________________________________________________


@node 참고 사항,,Utilities and decorators,enum — 열거형 지원
@anchor{library/enum notes}@anchor{2a4e}
@subsubsection 참고 사항


@ref{eda,,IntEnum}, @ref{82c,,StrEnum}, 및 @ref{e99,,IntFlag}

@quotation

These three enum types are designed to be drop-in replacements for existing
integer- and string-based values; as such, they have extra limitations:


@itemize -

@item 
@code{__str__} uses the value and not the name of the enum member

@item 
@code{__format__}, because it uses @code{__str__}, will also use the value of
the enum member instead of its name
@end itemize

If you do not need/want those limitations, you can either create your own
base class by mixing in the @code{int} or @code{str} type yourself:

@example
>>> from enum import Enum
>>> class MyIntEnum(int, Enum):
...     pass
@end example

or you can reassign the appropriate @ref{169,,str()}, etc., in your enum:

@example
>>> from enum import Enum, IntEnum
>>> class MyIntEnum(IntEnum):
...     __str__ = Enum.__str__
@end example
@end quotation

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node graphlib — 그래프와 유사한 구조에 작동하는 기능,,enum — 열거형 지원,데이터형
@anchor{library/graphlib doc}@anchor{2a7c}@anchor{library/graphlib graphlib-functionality-to-operate-with-graph-like-structures}@anchor{2a7d}@anchor{library/graphlib module-graphlib}@anchor{69}@anchor{library/graphlib translation-repo}@anchor{2a7e}
@subsection @code{graphlib} — 그래프와 유사한 구조에 작동하는 기능


@geindex module; graphlib

`소스 코드:' Lib/graphlib.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/graphlib.py}

@c import graphlib
@c from graphlib import *


__________________________________________________________________


@geindex TopologicalSorter (graphlib 클래스)
@anchor{library/graphlib graphlib TopologicalSorter}@anchor{ade}
@deffn {클래스} graphlib.TopologicalSorter (graph=None)

@ref{823,,해시 가능} 노드의 그래프(graph)를 위상 정렬(topological sort)하는 기능을 제공합니다.

위상 순서(topological order)는 그래프(graph)에서 꼭짓점(vertex)의 선형 순서로, 꼭짓점 u에서 꼭짓점 v로 가는 모든 유향 변(directed edge) u -> v 에 대해, 꼭짓점 u가 꼭짓점 v보다 앞에 옵니다. 예를 들어, 그래프의 꼭짓점은 수행될 작업을 나타낼 수 있고, 변은 하나의 작업이 다른 작업보다 먼저 수행되어야 한다는 제약을 나타낼 수 있습니다; 이 예에서, 위상 순서는 유효한 작업 순서입니다. 그래프에 유향 순환이 없는 경우, 즉 유향 비순환 그래프인 경우에만 완전한 위상 정렬이 가능합니다.

선택적 `graph' 인자가 제공되면 키가 노드이고 값이 그래프에서 해당 노드의 모든 선행 노드(키의 값을 가리키는 변이 있는 노드)의 이터러블인 비순환 그래프를 나타내는 딕셔너리이어야 합니다). @ref{2a7f,,add()} 메서드를 사용하여 그래프에 추가 노드를 추가할 수 있습니다.

일반적으로, 주어진 그래프의 정렬을 수행하는 데 필요한 단계는 다음과 같습니다:


@itemize *

@item 
선택적 초기 그래프를 사용하여 @ref{ade,,TopologicalSorter}의 인스턴스를 만듭니다.

@item 
그래프에 노드를 추가합니다.

@item 
그래프에서 @ref{21f,,prepare()}를 호출합니다.

@item 
@ref{2a80,,is_active()}가 @code{True}인 동안, @ref{2a81,,get_ready()}가 반환하는 노드를 이터레이트하고 이들을 처리합니다. 처리가 완료됨에 따라, 각 노드에 @ref{2a82,,done()}을 호출합니다.
@end itemize

그래프에서 노드의 즉각적인 정렬이 필요하고 병렬화가 개입하지 않으면, 편의 메서드 @ref{2a83,,TopologicalSorter.static_order()}를 직접 사용할 수 있습니다:

@example
>>> graph = @{"D": @{"B", "C"@}, "C": @{"A"@}, "B": @{"A"@}@}
>>> ts = TopologicalSorter(graph)
>>> tuple(ts.static_order())
('A', 'C', 'B', 'D')
@end example

이 클래스는 노드가 준비됨에 따라 병렬 처리를 쉽게 지원하도록 설계되었습니다. 예를 들어:

@example
topological_sorter = TopologicalSorter()

# 'topological_sorter' 에 노드를 추가합니다...

topological_sorter.prepare()
while topological_sorter.is_active():
    for node in topological_sorter.get_ready():
        # 작업자 스레드나 프로세스는 'task_queue' 큐에서 작업할 노드를 꺼냅니다.
        task_queue.put(node)

    # 노드의 작업이 완료되면, 작업자는 노드를 'finalized_tasks_queue' 에 넣어서
    # 작업할 더 많은 노드를 얻을 수 있도록 합니다. 'is_active()'의 정의는, 이 시점에서,
    # 아직 'done()'으로 전달되지 않은 하나 이상의 노드가 'task_queue'에 있다고 보장해서,
    # 이 블로킹 'get()'은 (결국) 성공합니다. 'done()'을 호출한 후, 다시 'get_ready()'를
    # 호출하도록 루프로 돌아가서, 새로 풀려난 노드를 논리적으로 가능한 한 빨리 'task_queue'에
    # 넣습니다.
    node = finalized_tasks_queue.get()
    topological_sorter.done(node)
@end example

@geindex add() (graphlib.TopologicalSorter 메서드)
@anchor{library/graphlib graphlib TopologicalSorter add}@anchor{2a7f}
@deffn {메서드} add (node, *predecessors)

새 노드와 그 선행 노드를 그래프에 추가합니다. `node'와 `predecessors'의 모든 요소는 모두 @ref{823,,해시 가능}해야 합니다.

같은 노드 인자로 여러 번 호출되면, 종속성 집합은 전달된 모든 종속성의 합집합입니다.

종속성이 없는 노드를 추가하거나(`predecessors'가 제공되지 않는 경우) 종속성을 두 번 제공할 수 있습니다. 이전에 제공되지 않은 노드가 `predecessors'에 포함되면, 노드는 그 자신의 선행 노드 없이 자동으로 그래프에 추가됩니다.

@ref{21f,,prepare()} 이후에 호출되면 @ref{2ec,,ValueError}가 발생합니다.
@end deffn

@geindex prepare() (graphlib.TopologicalSorter 메서드)
@anchor{library/graphlib graphlib TopologicalSorter prepare}@anchor{21f}
@deffn {메서드} prepare ()

그래프를 완료로 표시하고 그래프에서 순환을 검사합니다. 순환이 감지되면, @ref{2a84,,CycleError}가 발생하지만, 순환이 더 진행하는 것을 차단할 때까지 @ref{2a81,,get_ready()}를 사용하여 여전히 가능한 많은 노드를 얻을 수 있습니다. 이 함수를 호출한 후에는, 그래프를 수정할 수 없어서, @ref{2a7f,,add()}를 사용하여 더는 노드를 추가할 수 없습니다.

A @ref{2ec,,ValueError} will be raised if the sort has been started by
@ref{2a83,,static_order()} or @ref{2a81,,get_ready()}.


버전 3.14에서 변경: @code{prepare()} can now be called more than once as long as the sort has
not started. Previously this raised @ref{2ec,,ValueError}.

@end deffn

@geindex is_active() (graphlib.TopologicalSorter 메서드)
@anchor{library/graphlib graphlib TopologicalSorter is_active}@anchor{2a80}
@deffn {메서드} is_active ()

더 진행할 수 있으면 @code{True}를, 그렇지 않으면 @code{False}를 반환합니다. 순환이 결정을 차단하지 않고 @ref{2a81,,TopologicalSorter.get_ready()}에 의해 아직 반환되지 않은 준비된 노드가 아직 있거나 @ref{2a82,,TopologicalSorter.done()}으로 표시된 노드 수가 @code{TopologicalSorter.get_ready()}에 의해 반환된 수보다 작으면 진행할 수 있습니다.

이 클래스의 @ref{14da,,__bool__()} 메서드는 이 함수로 위임됩니다, 그래서 다음 대신:

@example
if ts.is_active():
    ...
@end example

다음처럼 간단하게 할 수 있습니다:

@example
if ts:
    ...
@end example

이전에 @ref{21f,,prepare()}를 호출하지 않고 호출되면 @ref{2ec,,ValueError}가 발생합니다.
@end deffn

@geindex done() (graphlib.TopologicalSorter 메서드)
@anchor{library/graphlib graphlib TopologicalSorter done}@anchor{2a82}
@deffn {메서드} done (*nodes)

@ref{2a81,,TopologicalSorter.get_ready()}에 의해 반환된 노드 집합이 처리된 것으로 표시하여, `nodes'에 있는 각 노드의 모든 후속 노드들이 @code{TopologicalSorter.get_ready()}에 대한 호출로 나중에 반환되도록 차단 해제합니다.

`nodes'에 있는 노드가 이 메서드에 대한 이전 호출에 의해 이미 처리된 것으로 표시되었거나 @ref{2a7f,,TopologicalSorter.add()}를 사용하여 그래프에 추가되지 않았거나, @ref{21f,,prepare()}를 호출하지 않고 호출되었거나, 또는 @ref{2a81,,get_ready()}가 아직 노드를 반환하지 않았으면 @ref{2ec,,ValueError}를 발생시킵니다.
@end deffn

@geindex get_ready() (graphlib.TopologicalSorter 메서드)
@anchor{library/graphlib graphlib TopologicalSorter get_ready}@anchor{2a81}
@deffn {메서드} get_ready ()

준비된 모든 노드가 담긴 @code{tuple}을 반환합니다. 처음에는 선행 노드가 없는 모든 노드를 반환하며, 일단 @ref{2a82,,TopologicalSorter.done()}을 호출하여 처리된 것으로 표시되면, 추가 호출은 모든 선행 노드가 이미 처리된 모든 새 노드를 반환합니다. 더는 진행할 수 없으면, 빈 튜플이 반환됩니다.

이전에 @ref{21f,,prepare()}를 호출하지 않고 호출되면 @ref{2ec,,ValueError}가 발생합니다.
@end deffn

@geindex static_order() (graphlib.TopologicalSorter 메서드)
@anchor{library/graphlib graphlib TopologicalSorter static_order}@anchor{2a83}
@deffn {메서드} static_order ()

노드들을 위상 순서로 이터레이트하는 이터레이터 객체를 반환합니다. 이 메서드를 사용할 때, @ref{21f,,prepare()}와 @ref{2a82,,done()}은 호출하지 않아야 합니다. 이 메서드는 다음과 동등합니다:

@example
def static_order(self):
    self.prepare()
    while self.is_active():
        node_group = self.get_ready()
        yield from node_group
        self.done(*node_group)
@end example

반환되는 특정 순서는 항목이 그래프에 삽입된 특정 순서에 따라 달라질 수 있습니다. 예를 들면:

@example
>>> ts = TopologicalSorter()
>>> ts.add(3, 2, 1)
>>> ts.add(1, 0)
>>> print([*ts.static_order()])
[2, 0, 1, 3]

>>> ts2 = TopologicalSorter()
>>> ts2.add(1, 0)
>>> ts2.add(3, 2, 1)
>>> print([*ts2.static_order()])
[0, 2, 1, 3]
@end example

이것은 그래프에서 “0”과 “2”가 같은 수준에 있고 (@ref{2a81,,get_ready()}에 대한 같은 호출에서 반환됩니다) 이들 간의 순서는 삽입 순서에 따라 결정되기 때문입니다.

순환이 감지되면 @ref{2a84,,CycleError}가 발생합니다.
@end deffn


Added in version 3.9.

@end deffn

@menu
* 예외: 예외<3>. 

@end menu

@node 예외<3>,,,graphlib — 그래프와 유사한 구조에 작동하는 기능
@anchor{library/graphlib exceptions}@anchor{2a85}
@subsubsection 예외


The @code{graphlib} module defines the following exception classes:

@geindex CycleError
@anchor{library/graphlib graphlib CycleError}@anchor{2a84}
@deffn {예외} graphlib.CycleError

작업 그래프에 순환이 있으면 @ref{21f,,TopologicalSorter.prepare()}가 발생시키는 @ref{2ec,,ValueError}의 서브 클래스. 여러 순환이 존재하면, 그들 중 오직 하나의 정의되지 않은 선택만 보고되고 예외에 포함됩니다.

감지된 순환은 예외 인스턴스의 @ref{78c,,args} 어트리뷰트에서 두 번째 요소를 통해 액세스 할 수 있으며 각 노드가 그래프에서 리스트에 있는 다음 노드의 직전 선행 노드가 되도록 노드 리스트로 구성됩니다. 보고된 리스트에서, 순환임을 분명히 하기 위해, 처음과 마지막 노드는 같습니다.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 숫자와 수학 모듈,함수형 프로그래밍 모듈,데이터형,파이썬 표준 라이브러리
@anchor{library/numeric doc}@anchor{2a86}@anchor{library/numeric numeric}@anchor{2a87}@anchor{library/numeric numeric-and-mathematical-modules}@anchor{2a88}@anchor{library/numeric translation-repo}@anchor{2a89}
@section 숫자와 수학 모듈


이 장에 나와있는 모듈들은 숫자와 수학에 관련된 함수와 데이터 타입을 제공합니다. @ref{a2,,numbers} 모듈은 숫자 데이터 타입을 위한 추상 계층 구조를 정의합니다. @ref{92,,math} 와 @ref{19,,cmath} 모듈은 부동소수와 복소수를 위한 여러 수학 함수를 가지고 있습니다. @ref{3a,,decimal} 모듈은 임의의 정밀도 계산을 사용하여 정확한 10진수 표현을 지원합니다.

이 장에는 다음과 같은 모듈이 설명되어 있습니다:

@menu
* numbers — 숫자 추상 베이스 클래스:: 
* math — 수학 함수:: 
* cmath — 복소수를 위한 수학 함수:: 
* decimal — Decimal fixed-point and floating-point arithmetic:: 
* fractions — 유리수:: 
* random — 의사 난수 생성:: 
* statistics — 수학 통계 함수:: 

@end menu

@node numbers — 숫자 추상 베이스 클래스,math — 수학 함수,,숫자와 수학 모듈
@anchor{library/numbers doc}@anchor{2a8a}@anchor{library/numbers module-numbers}@anchor{a2}@anchor{library/numbers numbers-numeric-abstract-base-classes}@anchor{2a8b}
@subsection @code{numbers} — 숫자 추상 베이스 클래스


@geindex module; numbers

`소스 코드:' Lib/numbers.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/numbers.py}


__________________________________________________________________


@code{numbers} 모듈(
@geindex Python 향상 제안; PEP 3141
PEP 3141@footnote{https://peps.python.org/pep-3141/})은 숫자에 대한 @ref{13bb,,추상 베이스 클래스} 의 계층 구조를 정의합니다. 계층 구조가 깊어질수록 더 많은 연산이 정의되어 있습니다. 이 모듈에 정의된 모든 형은 인스턴스로 만들 수 없습니다.

@geindex Number (numbers 클래스)
@anchor{library/numbers numbers Number}@anchor{2a8c}
@deffn {클래스} numbers.Number

숫자 계층의 최상위 클래스입니다. 형에 상관없이 인자 `x' 가 숫자인지 확인하려면 @code{isinstance(x, Number)} 를 사용하세요.
@end deffn

@menu
* 숫자 계층:: 
* 형 구현자를 위한 주의 사항:: 

@end menu

@node 숫자 계층,형 구현자를 위한 주의 사항,,numbers — 숫자 추상 베이스 클래스
@anchor{library/numbers the-numeric-tower}@anchor{2a8d}
@subsubsection 숫자 계층


@geindex Complex (numbers 클래스)
@anchor{library/numbers numbers Complex}@anchor{25fd}
@deffn {클래스} numbers.Complex

이 서브 클래스는 복소수를 표현하고 내장 @ref{197,,complex} 형에 사용되는 연산을 포함합니다. 여기에는 @code{complex} 와 @ref{3c3,,bool} 형으로의 변환과 @ref{2a8e,,real}, @ref{2a8f,,imag}, @code{+}, @code{-}, @code{*}, @code{/}, @code{**}, @ref{208b,,abs()}, @ref{2a90,,conjugate()}, @code{==}, @code{!=} 이 포함됩니다. @code{-} 와 @code{!=} 를 제외하고는 모두 추상입니다.

@geindex real (numbers.Complex의 속성)
@anchor{library/numbers numbers Complex real}@anchor{2a8e}
@deffn {속성} real

추상. 복소수의 실수부를 반환합니다.
@end deffn

@geindex imag (numbers.Complex의 속성)
@anchor{library/numbers numbers Complex imag}@anchor{2a8f}
@deffn {속성} imag

추상. 복소수의 허수부를 반환합니다.
@end deffn

@geindex conjugate() (numbers.Complex 메서드)
@anchor{library/numbers numbers Complex conjugate}@anchor{2a90}
@deffn {메서드} abstractmethod conjugate ()

추상 메서드. 켤레 복소수를 반환합니다. 예를 들어 @code{(1+3j).conjugate() == (1-3j)} 입니다.
@end deffn
@end deffn

@geindex Real (numbers 클래스)
@anchor{library/numbers numbers Real}@anchor{25f3}
@deffn {클래스} numbers.Real

@code{Real} 클래스는 @ref{25fd,,Complex} 클래스에 실수 연산을 추가합니다.

요약하면 @ref{196,,float} 로의 변환과 @ref{15c4,,math.trunc()}, @ref{14df,,round()}, @ref{15c2,,math.floor()}, @ref{15c3,,math.ceil()}, @ref{b98,,divmod()}, @code{//}, @code{%}, @code{<}, @code{<=}, @code{>}, @code{>=} 가 포함됩니다.

이 클래스는 또한 @ref{197,,complex()}, @ref{2a8e,,real}, @ref{2a8f,,imag}, @ref{2a90,,conjugate()} 를 위한 기본값을 제공합니다.
@end deffn

@geindex Rational (numbers 클래스)
@anchor{library/numbers numbers Rational}@anchor{14c3}
@deffn {클래스} numbers.Rational

@ref{25f3,,Real} 의 하위 형이고 @ref{2a91,,numerator} 와 @ref{2a92,,denominator} 프로퍼티가 추가됩니다. 또한 @ref{196,,float()} 함수를 위한 기본값을 제공합니다.

The @ref{2a91,,numerator} and @ref{2a92,,denominator} values
should be instances of @ref{240a,,Integral} and should be in lowest terms with
@code{denominator} positive.

@geindex numerator (numbers.Rational의 속성)
@anchor{library/numbers numbers Rational numerator}@anchor{2a91}
@deffn {속성} numerator

Abstract.  The numerator of this rational number.
@end deffn

@geindex denominator (numbers.Rational의 속성)
@anchor{library/numbers numbers Rational denominator}@anchor{2a92}
@deffn {속성} denominator

Abstract.  The denominator of this rational number.
@end deffn
@end deffn

@geindex Integral (numbers 클래스)
@anchor{library/numbers numbers Integral}@anchor{240a}
@deffn {클래스} numbers.Integral

@ref{14c3,,Rational} 의 하위 형이고 @ref{19b,,int} 클래스로 변환 기능이 추가됩니다. @ref{196,,float()}, @ref{2a91,,numerator}, @ref{2a92,,denominator} 를 위한 기본값을 제공합니다. 모듈러스가 있는 @ref{1a4,,pow()}를 위한 추상 메서드와 비트 연산 @code{<<}, @code{>>}, @code{&}, @code{^}, @code{|}, @code{~} 를 추가합니다.
@end deffn

@node 형 구현자를 위한 주의 사항,,숫자 계층,numbers — 숫자 추상 베이스 클래스
@anchor{library/numbers notes-for-type-implementers}@anchor{2a93}
@subsubsection 형 구현자를 위한 주의 사항


구현자는 동일한 숫자가 같게 취급되고 같은 값으로 해싱되도록 해야 합니다. 만약 종류가 다른 실수의 하위 형이 있는 경우 조금 까다로울 수 있습니다. 예를 들어 @ref{213,,fractions.Fraction} 클래스는 @ref{800,,hash()} 함수를 다음과 같이 구현합니다:

@example
def __hash__(self):
    if self.denominator == 1:
        # 정수입니다.
        return hash(self.numerator)
    # 비싼 검사이지만, 확실히 맞습니다.
    if self == float(self):
        return hash(float(self))
    else:
        # 간단한 분수에서의 높은 충돌률을 피하기위해 튜플의 해시를 사용합니다.
        return hash((self.numerator, self.denominator))
@end example

@menu
* 더 많은 숫자 추상 베이스 클래스(ABC) 추가: 더 많은 숫자 추상 베이스 클래스 ABC 추가. 
* 산술 연산 구현:: 

@end menu

@node 더 많은 숫자 추상 베이스 클래스 ABC 추가,산술 연산 구현,,형 구현자를 위한 주의 사항
@anchor{library/numbers adding-more-numeric-abcs}@anchor{2a94}
@subsubsection 더 많은 숫자 추상 베이스 클래스(ABC) 추가


물론 숫자를 위한 ABC를 추가하는 것이 가능합니다. 그렇지 않으면 엉망으로 상속 계층이 구현될 것입니다. @ref{25fd,,Complex} 와 @ref{25f3,,Real} 사이에 다음과 같이 @code{MyFoo} 를 추가할 수 있습니다:

@example
class MyFoo(Complex): ...
MyFoo.register(Real)
@end example

@node 산술 연산 구현,,더 많은 숫자 추상 베이스 클래스 ABC 추가,형 구현자를 위한 주의 사항
@anchor{library/numbers id1}@anchor{2a95}@anchor{library/numbers implementing-the-arithmetic-operations}@anchor{232f}
@subsubsection 산술 연산 구현


다른 형에 대한 연산은 두 인자의 형에 관해 알고 있는 구현을 호출하거나 두 인자를 가장 비슷한 내장형으로 변환하여 연산하도록 산술 연산을 구현하는 것이 좋습니다. @ref{240a,,Integral} 클래스의 하위 형일 경우에 @ref{23dd,,__add__()} 와 @ref{23de,,__radd__()} 메서드는 다음과 같이 정의되어야 함을 의미합니다:

@example
class MyIntegral(Integral):

    def __add__(self, other):
        if isinstance(other, MyIntegral):
            return do_my_adding_stuff(self, other)
        elif isinstance(other, OtherTypeIKnowAbout):
            return do_my_other_adding_stuff(self, other)
        else:
            return NotImplemented

    def __radd__(self, other):
        if isinstance(other, MyIntegral):
            return do_my_adding_stuff(other, self)
        elif isinstance(other, OtherTypeIKnowAbout):
            return do_my_other_adding_stuff(other, self)
        elif isinstance(other, Integral):
            return int(other) + int(self)
        elif isinstance(other, Real):
            return float(other) + float(self)
        elif isinstance(other, Complex):
            return complex(other) + complex(self)
        else:
            return NotImplemented
@end example

@ref{25fd,,Complex} 클래스의 서브클래스에는 다섯 가지의 서로 다른 혼합형 연산이 있습니다. 위의 코드에서 @code{MyIntegral} 와 @code{OtherTypeIKnowAbout} 를 제외한 나머지를 기본구조라고 하겠습니다. @code{a} 는 @code{Complex} 의 하위 형인 @code{A} 의 인스턴스입니다(즉 @code{a : A <: Complex} 입니다). 비슷하게 @code{b : B <: Complex} 입니다. @code{a + b} 인 경우를 생각해 보겠습니다:


@enumerate 

@item 
만약 @code{A} 가 @code{b} 를 받는 @ref{23dd,,__add__()} 메서드를 정의했다면 모든 것이 문제없이 처리됩니다.

@item 
@code{A} 가 기본구조 코드로 진입하고 @ref{23dd,,__add__()}로 부터 어떤 값을 반환한다면 @code{B} 가 똑똑하게 정의한 @ref{23de,,__radd__()} 메서드를 놓칠 수 있습니다. 이를 피하려면 기본구조는 @code{__add__()} 에서 @ref{1a2,,NotImplemented} 를 반환해야 합니다. (또는 @code{A} 가 @code{__add__()} 메서드를 전혀 구현하지 않을 수도 있습니다.)

@item 
그다음 @code{B} 의 @ref{23de,,__radd__()} 메서드가 기회를 얻습니다. 이 메서드가 @code{a} 를 받을 수 있다면 모든 것이 문제없이 처리됩니다.

@item 
기본구조 코드로 돌아온다면 더 시도해 볼 수 있는 메서드가 없으므로 기본적으로 수행될 구현을 작성해야 합니다.

@item 
만약 @code{B <: A} 라면 파이썬은 @code{A.__add__} 메서드 전에 @code{B.__radd__} 를 시도합니다. @code{A} 에 대해서 알고 @code{B} 가 구현되었기 때문에 이런 행동은 문제없습니다. 따라서 @ref{25fd,,Complex} 에 위임하기 전에 이 인스턴스를 처리할 수 있습니다.
@end enumerate

만약 어떤 것도 공유하지 않는 @code{A <: Complex} 와 @code{B <: Real} 라면 적절한 공유 연산(shared operation)은 내장 @ref{197,,complex} 클래스에 연관된 것입니다. 양쪽의 @ref{23de,,__radd__()} 메서드가 여기에 해당하므로 @code{a+b == b+a} 가 됩니다.

대부분 주어진 어떤 형에 대한 연산은 매우 비슷하므로, 주어진 연산자의 정방향(forward) 인스턴스와 역방향(reverse) 인스턴스를 생성하는 헬퍼 함수를 정의하는 것이 유용합니다. 예를 들어 @ref{213,,fractions.Fraction} 클래스는 다음과 같이 사용합니다:

@example
def _operator_fallbacks(monomorphic_operator, fallback_operator):
    def forward(a, b):
        if isinstance(b, (int, Fraction)):
            return monomorphic_operator(a, b)
        elif isinstance(b, float):
            return fallback_operator(float(a), b)
        elif isinstance(b, complex):
            return fallback_operator(complex(a), b)
        else:
            return NotImplemented
    forward.__name__ = '__' + fallback_operator.__name__ + '__'
    forward.__doc__ = monomorphic_operator.__doc__

    def reverse(b, a):
        if isinstance(a, Rational):
            # 정수를 포함합니다.
            return monomorphic_operator(a, b)
        elif isinstance(a, Real):
            return fallback_operator(float(a), float(b))
        elif isinstance(a, Complex):
            return fallback_operator(complex(a), complex(b))
        else:
            return NotImplemented
    reverse.__name__ = '__r' + fallback_operator.__name__ + '__'
    reverse.__doc__ = monomorphic_operator.__doc__

    return forward, reverse

def _add(a, b):
    """a + b"""
    return Fraction(a.numerator * b.denominator +
                    b.numerator * a.denominator,
                    a.denominator * b.denominator)

__add__, __radd__ = _operator_fallbacks(_add, operator.add)

# ...
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node math — 수학 함수,cmath — 복소수를 위한 수학 함수,numbers — 숫자 추상 베이스 클래스,숫자와 수학 모듈
@anchor{library/math doc}@anchor{2a96}@anchor{library/math math-mathematical-functions}@anchor{2a97}@anchor{library/math module-math}@anchor{92}@anchor{library/math translation-repo}@anchor{2a98}
@subsection @code{math} — 수학 함수


@geindex module; math

@c from math import fsum


__________________________________________________________________


This module provides access to common mathematical functions and constants,
including those defined by the C standard.

이 함수는 복소수와 함께 사용할 수 없습니다; 복소수를 지원해야 하면 @ref{19,,cmath} 모듈에 있는 같은 이름의 함수를 사용하십시오. 대부분 사용자는 복소수를 이해하는 데 필요한 수준의 수학을 배우고 싶어 하지 않기 때문에 복소수를 지원하는 함수와 그렇지 않은 함수를 구별했습니다. 복소수 결과 대신 예외를 수신하면 매개 변수로 사용된 예상치 못한 복소수를 조기에 감지할 수 있기 때문에, 프로그래머는 처음 위치에서 생성된 경로와 원인을 파악할 수 있습니다.

이 모듈에서 제공하는 함수는 다음과 같습니다. 달리 명시되지 않는 한 모든 반환 값은 float입니다.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

`수론적 함수'

@tab

@item

@ref{8de,,comb(n@comma{} k)}

@tab

반복과 순서 없이 `n' 개의 항목에서 `k' 개의 항목을 선택하는 방법의 수

@item

@ref{b41,,factorial(n)}

@tab

`n' 계승

@item

@ref{b0c,,gcd(*integers)}

@tab

정수 인자의 최대 공약수

@item

@ref{bf7,,isqrt(n)}

@tab

음이 아닌 정수 `n'의 정수 제곱근

@item

@ref{b0d,,lcm(*integers)}

@tab

정수 인자의 최소 공배수

@item

@ref{8df,,perm(n@comma{} k)}

@tab

반복 없고 순서 있게 `n' 개의 항목에서 `k' 개의 항목을 선택하는 방법의 수

@item

`부동 소수점 산술'

@tab

@item

@ref{15c3,,ceil(x)}

@tab

`x'의 천장값, `x'보다 크거나 같은 가장 작은 정수

@item

@ref{2a99,,fabs(x)}

@tab

`x'의 절댓값

@item

@ref{15c2,,floor(x)}

@tab

`x'의 바닥값, `x'보다 작거나 같은 가장 큰 정수

@item

@ref{513,,fma(x@comma{} y@comma{} z)}

@tab

Fused multiply-add operation: @code{(x * y) + z}

@item

@ref{24c8,,fmod(x@comma{} y)}

@tab

나누기 @code{x / y}의 나머지

@item

@ref{2a9a,,modf(x)}

@tab

`x'의 소수와 정수 부분

@item

@ref{d49,,remainder(x@comma{} y)}

@tab

`y'에 대한 `x'의 나머지

@item

@ref{15c4,,trunc(x)}

@tab

`x'의 정수부

@item

`부종 소수점 조작 함수'

@tab

@item

@ref{15d8,,copysign(x@comma{} y)}

@tab

`x'의 크기(절댓값)와 `y'의 부호를 갖는 값

@item

@ref{2a9b,,frexp(x)}

@tab

`x'의 가수(mantissa)와 지수(exponent)

@item

@ref{faf,,isclose(a@comma{} b@comma{} rel_tol@comma{} abs_tol)}

@tab

값 `a'와 `b'가 서로 가까이 있는지 검사합니다

@item

@ref{13f0,,isfinite(x)}

@tab

`x'가 무한대나 NaN이 아닌지 검사합니다

@item

@ref{15d6,,isinf(x)}

@tab

`x'가 양 또는 음의 무한대인지 검사합니다

@item

@ref{15d7,,isnan(x)}

@tab

`x'가 NaN(not a number)인지 검사합니다

@item

@ref{1842,,ldexp(x@comma{} i)}

@tab

@code{x * (2**i)}, 함수 @ref{2a9b,,frexp()}의 역

@item

@ref{6bf,,nextafter(x@comma{} y@comma{} steps)}

@tab

`x' 에서 `y' 방향으로 `steps' 스텝 다음의 부동 소수점 값

@item

@ref{b0e,,ulp(x)}

@tab

`x'의 최하위 비트 값

@item

`거듭제곱, 지수 및 로그 함수'

@tab

@item

@ref{870,,cbrt(x)}

@tab

`x'의 세제곱근

@item

@ref{1518,,exp(x)}

@tab

`e' 의 `x' 거듭제곱

@item

@ref{86f,,exp2(x)}

@tab

`2' 의 `x' 거듭제곱

@item

@ref{13f1,,expm1(x)}

@tab

`e' 의 `x' 거듭제곱 빼기 1

@item

@ref{16c5,,log(x@comma{} base)}

@tab

주어진 밑(기본값 `e')의 `x' 의 로그

@item

@ref{15dd,,log1p(x)}

@tab

`x'의 자연로그 (밑 `e')

@item

@ref{12e0,,log2(x)}

@tab

`x'의 밑이 2인 로그

@item

@ref{1949,,log10(x)}

@tab

`x'의 밑이 10인 로그

@item

@ref{871,,pow(x@comma{} y)}

@tab

`x'의 `y' 거듭제곱

@item

@ref{bf8,,sqrt(x)}

@tab

`x'의 제곱근

@item

`합과 곱 함수'

@tab

@item

@ref{bf4,,dist(p@comma{} q)}

@tab

좌표의 이터러블로 제공되는, 두 점 `p'와 `q' 사이의 유클리드 거리

@item

@ref{15d9,,fsum(iterable)}

@tab

입력 `iterable'에 있는 값들의 합

@item

@ref{bf5,,hypot(*coordinates)}

@tab

좌표 이터러블의 유클리드 크기(norm)

@item

@ref{bf6,,prod(iterable@comma{} start)}

@tab

`start' 값으로 시작하는, 입력 `iterable'에 있는 요소들의 곱

@item

@ref{6be,,sumprod(p@comma{} q)}

@tab

Sum of products from two iterables `p' and `q'

@item

`각도 변환'

@tab

@item

@ref{2a9c,,degrees(x)}

@tab

각도 `x'를 라디안에서 도(degree)로 변환합니다

@item

@ref{2a9d,,radians(x)}

@tab

각도 `x'를 도(degree)에서 라디안으로 변환합니다

@item

`삼각 함수'

@tab

@item

@ref{2a9e,,acos(x)}

@tab

`x'의 아크 코사인(arc cosine)

@item

@ref{2a9f,,asin(x)}

@tab

`x'의 아크 사인(arc sine)

@item

@ref{2aa0,,atan(x)}

@tab

`x'의 아크 탄젠트(arc tangent)

@item

@ref{2aa1,,atan2(y@comma{} x)}

@tab

@code{atan(y / x)}

@item

@ref{16c4,,cos(x)}

@tab

`x'의 코사인

@item

@ref{16c3,,sin(x)}

@tab

`x'의 사인

@item

@ref{2aa2,,tan(x)}

@tab

`x'의 탄젠트

@item

`쌍곡선 함수'

@tab

@item

@ref{15da,,acosh(x)}

@tab

`x'의 역 쌍곡 코사인(inverse hyperbolic cosine)

@item

@ref{15db,,asinh(x)}

@tab

`x'의 역 쌍곡 사인(inverse hyperbolic sine)

@item

@ref{15dc,,atanh(x)}

@tab

`x'의 역 쌍곡 탄젠트(inverse hyperbolic tangent)

@item

@ref{2aa3,,cosh(x)}

@tab

`x'의 쌍곡 코사인(hyperbolic cosine)

@item

@ref{2aa4,,sinh(x)}

@tab

`x'의 쌍곡 사인(hyperbolic sine)

@item

@ref{2aa5,,tanh(x)}

@tab

`x'의 쌍곡 탄젠트(hyperbolic tangent)

@item

`특수 함수'

@tab

@item

@ref{dd2,,erf(x)}

@tab

`x'의 오차 함수(error function)@footnote{https://en.wikipedia.org/wiki/Error_function}

@item

@ref{dd3,,erfc(x)}

@tab

`x'의 여오차 함수(complementary error function)@footnote{https://en.wikipedia.org/wiki/Error_function}

@item

@ref{13f2,,gamma(x)}

@tab

`x'의 감마 함수(Gamma function)@footnote{https://en.wikipedia.org/wiki/Gamma_function}

@item

@ref{13f3,,lgamma(x)}

@tab

`x'의 감마 함수(Gamma function)@footnote{https://en.wikipedia.org/wiki/Gamma_function}의 절댓값의 자연로그

@item

`상수'

@tab

@item

@ref{2aa6,,pi}

@tab

`π' = 3.141592…

@item

@ref{2aa7,,e}

@tab

`e' = 2.718281…

@item

@ref{2aa8,,tau}

@tab

`τ' = 2`π' = 6.283185…

@item

@ref{e7d,,inf}

@tab

양의 무한대

@item

@ref{872,,nan}

@tab

“Not a number” (NaN)

@end multitable


@menu
* 수론적 함수:: 
* 부동 소수점 산술:: 
* 부동 소수점 조작 함수:: 
* 거듭제곱@comma{} 지수 및 로그 함수: 거듭제곱 지수 및 로그 함수. 
* 합과 곱 함수:: 
* 각도 변환:: 
* 삼각 함수:: 
* 쌍곡선 함수:: 
* 특수 함수:: 
* 상수: 상수<2>. 

@end menu

@node 수론적 함수,부동 소수점 산술,,math — 수학 함수
@anchor{library/math number-theoretic-functions}@anchor{2aa9}
@subsubsection 수론적 함수


@geindex comb() (math 모듈)
@anchor{library/math math comb}@anchor{8de}
@deffn {함수} math.comb (n, k)

반복과 순서 없이 `n' 개의 항목에서 `k' 개의 항목을 선택하는 방법의 수를 반환합니다.

@code{k <= n}이면 @code{n! / (k! * (n - k)!)}로 평가되고, @code{k > n}이면 0으로 평가됩니다.

@code{(1 + x)ⁿ}의 다항식 전개에서 k 번째 항의 계수와 같기 때문에 이항 계수(binomial coefficient)라고도 합니다.

인자 중 어느 하나라도 정수가 아니면 @ref{198,,TypeError}를 발생시킵니다. 인자 중 어느 하나라도 음수이면 @ref{2ec,,ValueError}를 발생시킵니다.


Added in version 3.8.

@end deffn

@geindex factorial() (math 모듈)
@anchor{library/math math factorial}@anchor{b41}
@deffn {함수} math.factorial (n)

Return factorial of the nonnegative integer `n'.


버전 3.10에서 변경: 정숫값 부동 소수점(@code{5.0}과 같은)은 더는 허용되지 않습니다.

@end deffn

@geindex gcd() (math 모듈)
@anchor{library/math math gcd}@anchor{b0c}
@deffn {함수} math.gcd (*integers)

지정된 정수 인자의 최대 공약수를 반환합니다. 인자 중 하나가 0이 아니면, 반환된 값은 모든 인자를 나누는 가장 큰 양의 정수입니다. 모든 인자가 0이면, 반환 값은 @code{0}입니다. 인자가 없는 @code{gcd()}는 @code{0}을 반환합니다.


Added in version 3.5.



버전 3.9에서 변경: 임의의 개수 인자에 대한 지원이 추가되었습니다. 이전에는, 단지 두 개의 인자만 지원되었습니다.

@end deffn

@geindex isqrt() (math 모듈)
@anchor{library/math math isqrt}@anchor{bf7}
@deffn {함수} math.isqrt (n)

음이 아닌 정수 `n'의 정수 제곱근을 반환합니다. 이것은 `n'의 정확한 제곱근의 바닥(floor)입니다, 또는, 동등하게, `a'² ≤ `n'을 만족하는 가장 큰 정수 `a'입니다.

일부 응용 프로그램에서는, `n' ≤ `a'² 을 만족하는 가장 작은 정수 `a', 즉 `n'의 정확한 제곱근의 천장(ceiling)을 구하는 것이 더 편리합니다. 양의 `n'에 대해, 이것은 @code{a = 1 + isqrt(n - 1)}을 사용하여 계산할 수 있습니다.


Added in version 3.8.

@end deffn

@geindex lcm() (math 모듈)
@anchor{library/math math lcm}@anchor{b0d}
@deffn {함수} math.lcm (*integers)

지정된 정수 인자의 최소 공배수를 반환합니다. 모든 인자가 0이 아니면, 반환 값은 모든 인자의 배수인 가장 작은 양의 정수입니다. 인자 중 어느 하나가 0이면, 반환 값은 @code{0}입니다. 인자가 없는 @code{lcm()}은 @code{1}을 반환합니다.


Added in version 3.9.

@end deffn

@geindex perm() (math 모듈)
@anchor{library/math math perm}@anchor{8df}
@deffn {함수} math.perm (n, k=None)

반복 없고 순서 있게 `n' 개의 항목에서 `k' 개의 항목을 선택하는 방법의 수를 반환합니다.

@code{k <= n}이면 @code{n! / (n - k)!} 로 평가되고, @code{k > n}이면 0으로 평가됩니다.

`k'가 지정되지 않거나 @code{None}이면, `k'의 기본값은 `n'이고 함수는 @code{n!} 을 반환합니다.

인자 중 어느 하나라도 정수가 아니면 @ref{198,,TypeError}를 발생시킵니다. 인자 중 어느 하나라도 음수이면 @ref{2ec,,ValueError}를 발생시킵니다.


Added in version 3.8.

@end deffn

@node 부동 소수점 산술,부동 소수점 조작 함수,수론적 함수,math — 수학 함수
@anchor{library/math floating-point-arithmetic}@anchor{2aaa}
@subsubsection 부동 소수점 산술


@geindex ceil() (math 모듈)
@anchor{library/math math ceil}@anchor{15c3}
@deffn {함수} math.ceil (x)

`x'보다 크거나 같은 가장 작은 정수인 `x'의 천장값(ceiling)을 반환합니다. `x'가 float가 아니면, @ref{2409,,x.__ceil__}에 위임하고, 이것은 @ref{240a,,Integral} 값을 반환해야 합니다.
@end deffn

@geindex fabs() (math 모듈)
@anchor{library/math math fabs}@anchor{2a99}
@deffn {함수} math.fabs (x)

`x'의 절댓값을 반환합니다.
@end deffn

@geindex floor() (math 모듈)
@anchor{library/math math floor}@anchor{15c2}
@deffn {함수} math.floor (x)

`x'보다 작거나 같은 가장 큰 정수인 `x'의 바닥값(floor)을 반환합니다. `x'가 float가 아니면, @ref{2408,,x.__floor__}에 위임하고, 이것은 @ref{240a,,Integral} 값을 반환해야 합니다.
@end deffn

@geindex fma() (math 모듈)
@anchor{library/math math fma}@anchor{513}
@deffn {함수} math.fma (x, y, z)

Fused multiply-add operation. Return @code{(x * y) + z}, computed as though with
infinite precision and range followed by a single round to the @code{float}
format. This operation often provides better accuracy than the direct
expression @code{(x * y) + z}.

This function follows the specification of the fusedMultiplyAdd operation
described in the IEEE 754 standard. The standard leaves one case
implementation-defined, namely the result of @code{fma(0, inf, nan)}
and @code{fma(inf, 0, nan)}. In these cases, @code{math.fma} returns a NaN,
and does not raise any exception.


Added in version 3.13.

@end deffn

@geindex fmod() (math 모듈)
@anchor{library/math math fmod}@anchor{24c8}
@deffn {함수} math.fmod (x, y)

플랫폼 C 라이브러리 함수 @code{fmod(x, y)}이 정의한 대로, @code{x / y}의 부동 소수점 나머지를 반환합니다. 파이썬 표현식 @code{x % y}가 같은 결과를 반환하지 않을 수 있음에 유의하십시오. C 표준의 의도는 어떤 정수 `n'에 대해 @code{fmod(x, y)}가 @code{x - n*y}와 정확히 (수학적으로; 무한 정밀도로) 같고, 결과는 `x'와 같은 부호를 가지며 크기(절댓값)는 @code{abs(y)}보다 작아지도록 하는 것입니다. 파이썬의 @code{x % y}는 대신 `y'의 부호를 갖는 결과를 반환하며 float 인자에 대해 정확하게 계산할 수 없을 수 있습니다. 예를 들어, @code{fmod(-1e-100, 1e100)}는 @code{-1e-100}이지만, 파이썬의 @code{-1e-100 % 1e100}의 결과는 @code{1e100-1e-100}이며, 부동 소수점으로 정확하게 표현할 수 없어서, 의외의 @code{1e100}으로 반올림됩니다. 이러한 이유로, 함수 @ref{24c8,,fmod()}는 일반적으로 float로 작업할 때 선호되는 반면 파이썬의 @code{x % y}는 정수로 작업할 때 선호됩니다.
@end deffn

@geindex modf() (math 모듈)
@anchor{library/math math modf}@anchor{2a9a}
@deffn {함수} math.modf (x)

`x'의 소수와 정수 부분을 반환합니다. 두 결과 모두 `x'의 부호를 가지며 float입니다.

@ref{2a9a,,modf()}는 C 대응물과는 다른 호출/반환 패턴을 가지고 있음에 유의하십시오: 두 번째 반환 값을 ‘출력 매개 변수’로 반환하는 대신 (파이썬에는 그러한 것이 없습니다), 단일 인자를 받아서 값의 쌍을 반환합니다.
@end deffn

@geindex remainder() (math 모듈)
@anchor{library/math math remainder}@anchor{d49}
@deffn {함수} math.remainder (x, y)

`y'에 대한 `x'의 IEEE 754 스타일 나머지를 반환합니다. 유한한 `x' 와 0이 아닌 유한한 `y'에 대해, 이것은 차이 @code{x - n*y}입니다. 여기서 @code{n}은 몫 @code{x / y}의 정확한 값에 가장 가까운 정수입니다. @code{x / y}가 두 개의 인접한 정수 사이의 정확히 중간이면, 가장 가까운 `짝수' 정수가 @code{n}으로 사용됩니다. 따라서 나머지 @code{r = remainder(x, y)}는 항상 @code{abs(r) <= 0.5 * abs(y)}를 만족합니다.

IEEE 754에 따른 특별한 경우: 특히, @code{remainder(x, math.inf)}는 모든 유한한 `x'에 대해서는 `x'이고, @code{remainder(x, 0)}과 @code{remainder(math.inf, x)}는 모든 NaN이 아닌 `x'에 대해 @ref{2ec,,ValueError}를 발생시킵니다. 나머지 연산의 결과가 0이면, 해당 0은 `x' 와 같은 부호를 갖습니다.

IEEE 754 이진 부동 소수점을 사용하는 플랫폼에서, 이 연산의 결과는 항상 정확하게 표현 가능합니다: 자리 올림 오차는 발생하지 않습니다.


Added in version 3.7.

@end deffn

@geindex trunc() (math 모듈)
@anchor{library/math math trunc}@anchor{15c4}
@deffn {함수} math.trunc (x)

Return `x' with the fractional part
removed, leaving the integer part.  This rounds toward 0: @code{trunc()} is
equivalent to @ref{15c2,,floor()} for positive `x', and equivalent to @ref{15c3,,ceil()}
for negative `x'. If `x' is not a float, delegates to @ref{19c,,x.__trunc__}, which should return an @ref{240a,,Integral} value.
@end deffn

@ref{15c3,,ceil()}, @ref{15c2,,floor()} 및 @ref{2a9a,,modf()} 함수의 경우, 충분히 큰 절댓값을 갖는 `모든' 부동 소수점 숫자는 정확한 정수입니다. 파이썬 float는 일반적으로 53비트 이하의 정밀도를 가지는데 (플랫폼 C double 형과 같습니다), 이때 @code{abs(x) >= 2**52}를 만족하는 모든 float `x'는 소수 비트를 갖지 않습니다.

@node 부동 소수점 조작 함수,거듭제곱 지수 및 로그 함수,부동 소수점 산술,math — 수학 함수
@anchor{library/math floating-point-manipulation-functions}@anchor{2aab}
@subsubsection 부동 소수점 조작 함수


@geindex copysign() (math 모듈)
@anchor{library/math math copysign}@anchor{15d8}
@deffn {함수} math.copysign (x, y)

`x'의 크기(절댓값)와 `y'의 부호를 갖는 float를 반환합니다. 부호 있는 0을 지원하는 플랫폼에서, @code{copysign(1.0, -0.0)}은 `-1.0'을 반환합니다.
@end deffn

@geindex frexp() (math 모듈)
@anchor{library/math math frexp}@anchor{2a9b}
@deffn {함수} math.frexp (x)

`x'의 가수(mantissa)와 지수(exponent)를 @code{(m, e)} 쌍으로 반환합니다. `m'은 float이고, `e'는 정수이며, 정확히 @code{x == m * 2**e}가 성립합니다. `x'가 0이면, @code{(0.0, 0)}을 반환하고, 그렇지 않으면 @code{0.5 <= abs(m) < 1}입니다. 이것은 float의 내부 표현을 이식성 있는 방식으로 “분리”하는 데 사용됩니다.

@ref{2a9b,,frexp()}는 C 대응물과는 다른 호출/반환 패턴을 가지고 있음에 유의하십시오: 두 번째 반환 값을 ‘출력 매개 변수’로 반환하는 대신 (파이썬에는 그러한 것이 없습니다), 단일 인자를 받아서 값의 쌍을 반환합니다.
@end deffn

@geindex isclose() (math 모듈)
@anchor{library/math math isclose}@anchor{faf}
@deffn {함수} math.isclose (a, b, *, rel_tol=1e-09, abs_tol=0.0)

값 `a'와 `b'가 서로 가까이 있으면 @code{True}를, 그렇지 않으면 @code{False}를 반환합니다.

두 값이 근접한 것으로 간주하는지는 주어진 절대와 상대 허용 오차에 따라 결정됩니다. 에러가 발생하지 않으면, 결과는 다음과 같습니다: @code{abs(a-b) <= max(rel_tol * max(abs(a), abs(b)), abs_tol)}.

`rel_tol'은 상대 허용 오차입니다 – `a'와 `b' 중 더 큰 절댓값에 대해 상대적으로, `a'와 `b' 간에 허용되는 최대 차이입니다. 예를 들어, 허용 오차를 5%로 설정하려면, @code{rel_tol=0.05}를 전달하십시오. 기본 허용 오차는 @code{1e-09}이며, 두 값이 약 9자리 십진 숫자 내에서 같다는 것을 보장합니다. `rel_tol'은 음이 아니고 @code{1.0}보다 작아야 합니다.

`abs_tol' is the absolute tolerance; it defaults to @code{0.0} and it must be
nonnegative.  When comparing @code{x} to @code{0.0}, @code{isclose(x, 0)} is computed
as @code{abs(x) <= rel_tol  * abs(x)}, which is @code{False} for any nonzero @code{x} and
`rel_tol' less than @code{1.0}.  So add an appropriate positive `abs_tol' argument
to the call.

IEEE 754 특수 값 @code{NaN}, @code{inf} 및 @code{-inf}는 IEEE 규칙에 따라 처리됩니다. 특히, @code{NaN}은 @code{NaN}을 포함하여 다른 어떤 값과도 근접한 것으로 간주하지 않습니다. @code{inf}와 @code{-inf}는 오직 자신과만 가까운 것으로 간주합니다.


Added in version 3.5.



@subsubheading 더 보기


@geindex Python 향상 제안; PEP 485
PEP 485@footnote{https://peps.python.org/pep-0485/} – 근사적 동등성을 검사하는 함수

@end deffn

@geindex isfinite() (math 모듈)
@anchor{library/math math isfinite}@anchor{13f0}
@deffn {함수} math.isfinite (x)

`x'가 무한대나 NaN이 아니면 @code{True}를, 그렇지 않으면 @code{False}를 반환합니다. (@code{0.0}은 `유한'한 것으로 간주합니다.)


Added in version 3.2.

@end deffn

@geindex isinf() (math 모듈)
@anchor{library/math math isinf}@anchor{15d6}
@deffn {함수} math.isinf (x)

`x'가 양 또는 음의 무한대이면 @code{True}를, 그렇지 않으면 @code{False}를 반환합니다.
@end deffn

@geindex isnan() (math 모듈)
@anchor{library/math math isnan}@anchor{15d7}
@deffn {함수} math.isnan (x)

`x'가 NaN(not a number)이면 @code{True}를, 그렇지 않으면 @code{False}를 반환합니다.
@end deffn

@geindex ldexp() (math 모듈)
@anchor{library/math math ldexp}@anchor{1842}
@deffn {함수} math.ldexp (x, i)

@code{x * (2**i)}를 반환합니다. 이것은 본질적으로 함수 @ref{2a9b,,frexp()}의 역입니다.
@end deffn

@geindex nextafter() (math 모듈)
@anchor{library/math math nextafter}@anchor{6bf}
@deffn {함수} math.nextafter (x, y, steps=1)

`x'에서 `y' 방향으로 `steps' 스텝 다음의 부동 소수점 값을 반환합니다.

`x'가 `y'와 같으면, `steps'이 0이 아닌 한 `y'를 반환합니다.

예:


@itemize *

@item 
@code{math.nextafter(x, math.inf)}는 올라갑니다: 양의 무한대를 향해.

@item 
@code{math.nextafter(x, -math.inf)}는 내려갑니다: 음의 무한대를 향해.

@item 
@code{math.nextafter(x, 0.0)}는 0을 향합니다.

@item 
@code{math.nextafter(x, math.copysign(math.inf, x))}는 0에서 멀어집니다.
@end itemize

@ref{b0e,,math.ulp()}도 참조하십시오.


Added in version 3.9.



버전 3.12에서 변경: `steps' 인자를 추가했습니다.

@end deffn

@geindex ulp() (math 모듈)
@anchor{library/math math ulp}@anchor{b0e}
@deffn {함수} math.ulp (x)

float `x'의 최하위 비트 값을 반환합니다:


@itemize *

@item 
`x'가 NaN(not a number)이면, `x'를 반환합니다.

@item 
`x'가 음수이면, @code{ulp(-x)}를 반환합니다.

@item 
`x'가 양의 무한대이면, `x'를 반환합니다.

@item 
`x'가 0과 같으면, 가장 작은 양의 `정규화되지 않은(denormalized)' 표현 가능한 float를 반환합니다 (가장 작은 양의 `정규화된' float, @ref{1dcc,,sys.float_info.min}보다 작습니다).

@item 
`x'가 가장 큰 양의 표현 가능한 float와 같으면, `x'보다 작은 첫 번째 float가 @code{x - ulp(x)}가 되도록, `x'의 최하위 비트 값을 반환합니다.

@item 
그렇지 않으면 (`x'가 양의 유한 수이면), `x'보다 큰 첫 번째 float가 @code{x + ulp(x)}가 되도록, `x'의 최하위 비트 값을 반환합니다.
@end itemize

ULP는 “Unit in the Last Place(마지막 자리의 단위)”를 나타냅니다.

@ref{6bf,,math.nextafter()}와 @ref{1dcc,,sys.float_info.epsilon}도 참조하십시오.


Added in version 3.9.

@end deffn

@node 거듭제곱 지수 및 로그 함수,합과 곱 함수,부동 소수점 조작 함수,math — 수학 함수
@anchor{library/math power-exponential-and-logarithmic-functions}@anchor{2aac}
@subsubsection 거듭제곱, 지수 및 로그 함수


@geindex cbrt() (math 모듈)
@anchor{library/math math cbrt}@anchor{870}
@deffn {함수} math.cbrt (x)

`x'의 세제곱근을 반환합니다.


Added in version 3.11.

@end deffn

@geindex exp() (math 모듈)
@anchor{library/math math exp}@anchor{1518}
@deffn {함수} math.exp (x)

`e'의 `x' 거듭제곱을 반환합니다. 여기서 `e' = 2.718281… 는 자연로그의 밑(base)입니다. 일반적으로 @code{math.e ** x}나 @code{pow(math.e, x)}보다 정확합니다.
@end deffn

@geindex exp2() (math 모듈)
@anchor{library/math math exp2}@anchor{86f}
@deffn {함수} math.exp2 (x)

`2'의 `x' 거듭제곱을 반환합니다.


Added in version 3.11.

@end deffn

@geindex expm1() (math 모듈)
@anchor{library/math math expm1}@anchor{13f1}
@deffn {함수} math.expm1 (x)

`e'의 `x' 거듭제곱에서 1을 뺀 값을 반환합니다. 여기서 `e'는 자연로그의 밑(base)입니다. 작은 float `x'의 경우, @code{exp(x) - 1}의 뺄셈은 상당한 정밀도 소실@footnote{https://en.wikipedia.org/wiki/Loss_of_significance}을 일으킬 수 있습니다; @ref{13f1,,expm1()} 함수는 이 양을 최대 정밀도로 계산하는 방법을 제공합니다:

@example
>>> from math import exp, expm1
>>> exp(1e-5) - 1  # gives result accurate to 11 places
1.0000050000069649e-05
>>> expm1(1e-5)    # result accurate to full precision
1.0000050000166668e-05
@end example


Added in version 3.2.

@end deffn

@geindex log() (math 모듈)
@anchor{library/math math log}@anchor{16c5}
@deffn {함수} math.log (x[, base])

하나의 인자를 제공하면, `x'의 자연로그를 반환합니다 (밑 `e').

두 개의 인자를 제공하면, 주어진 `밑(base)'으로 `x'의 로그를 반환합니다, @code{log(x)/log(base)}로 계산합니다.
@end deffn

@geindex log1p() (math 모듈)
@anchor{library/math math log1p}@anchor{15dd}
@deffn {함수} math.log1p (x)

`1+x'의 자연로그를 반환합니다 (밑 `e'). 결과는 0에 가까운 `x'에 대해 정확한 방식으로 계산됩니다.
@end deffn

@geindex log2() (math 모듈)
@anchor{library/math math log2}@anchor{12e0}
@deffn {함수} math.log2 (x)

`x'의 밑이 2인 로그를 반환합니다. 이것은 일반적으로 @code{log(x, 2)}보다 정확합니다.


Added in version 3.3.



@subsubheading 더 보기


@ref{25f7,,int.bit_length()}는 부호와 선행 0을 제외하고 정수를 이진수로 나타내는 데 필요한 비트 수를 반환합니다.

@end deffn

@geindex log10() (math 모듈)
@anchor{library/math math log10}@anchor{1949}
@deffn {함수} math.log10 (x)

`x'의 밑이 10인 로그를 반환합니다. 이것은 일반적으로 @code{log(x, 10)}보다 정확합니다.
@end deffn

@geindex pow() (math 모듈)
@anchor{library/math math pow}@anchor{871}
@deffn {함수} math.pow (x, y)

`x'의 `y' 거듭제곱을 반환합니다. 예외적인 경우는 최대한 IEEE 754 표준을 따릅니다. 특히, `x'가 0이거나 NaN일 때도 @code{pow(1.0, x)}와 @code{pow(x, 0.0)}는 항상 @code{1.0}을 반환합니다. `x' 와 `y'가 모두 유한하고, `x'가 음수이고, `y'가 정수가 아니면 @code{pow(x, y)}는 정의되지 않고 @ref{2ec,,ValueError}를 발생시킵니다.

내장 @code{**} 연산자와 달리, @ref{871,,math.pow()}는 두 인자를 모두 @ref{196,,float} 형으로 변환합니다. 정확한 정수 거듭제곱을 계산하려면 @code{**}나 내장 @ref{1a4,,pow()} 함수를 사용하십시오.


버전 3.11에서 변경: The special cases @code{pow(0.0, -inf)} and @code{pow(-0.0, -inf)} were
changed to return @code{inf} instead of raising @ref{2ec,,ValueError},
for consistency with IEEE 754.

@end deffn

@geindex sqrt() (math 모듈)
@anchor{library/math math sqrt}@anchor{bf8}
@deffn {함수} math.sqrt (x)

`x'의 제곱근을 반환합니다.
@end deffn

@node 합과 곱 함수,각도 변환,거듭제곱 지수 및 로그 함수,math — 수학 함수
@anchor{library/math summation-and-product-functions}@anchor{2aad}
@subsubsection 합과 곱 함수


@geindex dist() (math 모듈)
@anchor{library/math math dist}@anchor{bf4}
@deffn {함수} math.dist (p, q)

각각 좌표 시퀀스(또는 이터러블)로 제공되는, 두 점 `p'와 `q' 사이의 유클리드 거리를 반환합니다. 두 점의 차원(dimension)은 같아야 합니다.

대략 다음과 동등합니다:

@example
sqrt(sum((px - qx) ** 2.0 for px, qx in zip(p, q)))
@end example


Added in version 3.8.

@end deffn

@geindex fsum() (math 모듈)
@anchor{library/math math fsum}@anchor{15d9}
@deffn {함수} math.fsum (iterable)

이터러블(iterable)에 있는 값의 정확한(accurate) 부동 소수점 합을 반환합니다. 여러 중간 부분 합을 추적하여 정밀도 손실을 방지합니다.

알고리즘의 정확도는 IEEE-754 산술의 보증과 자리 올림 모드가 짝수로 반올림(half-even)인 일반적인 경우에 의존합니다. 윈도우 이외의 일부 빌드에서, 하부 C 라이브러리는 확장 정밀도 덧셈을 사용하고, 때때로 중간 합을 이중 자리 올림(double-round) 하여 최하위 비트(least significant bit)에서 분리할 수 있습니다.

자세한 논의와 두 가지 대안은, ASPN cookbook recipes for accurate floating point summation@footnote{https://code.activestate.com/recipes/393090-binary-floating-point-summation-accurate-to-full-p/}을 참조하십시오.
@end deffn

@geindex hypot() (math 모듈)
@anchor{library/math math hypot}@anchor{bf5}
@deffn {함수} math.hypot (*coordinates)

유클리드 크기(norm) @code{sqrt(sum(x**2 for x in coordinates))}를 반환합니다. 원점에서 coordinates로 지정된 점까지의 벡터의 길이입니다.

2차원 점 @code{(x, y)}의 경우, 피타고라스 정리를 사용하여 직각 삼각형의 빗변(hypotenuse)을 계산하는 것과 동등합니다, @code{sqrt(x*x + y*y)}.


버전 3.8에서 변경: n 차원 점에 대한 지원이 추가되었습니다. 이전에는, 2차원인 경우만 지원되었습니다.



버전 3.10에서 변경: Improved the algorithm’s accuracy so that the maximum error is
under 1 ulp (unit in the last place).  More typically, the result
is almost always correctly rounded to within 1/2 ulp.

@end deffn

@geindex prod() (math 모듈)
@anchor{library/math math prod}@anchor{bf6}
@deffn {함수} math.prod (iterable, *, start=1)

입력 `이터러블(iterable)'에 있는 모든 요소의 곱을 계산합니다. 곱의 기본 `start' 값은 @code{1}입니다.

iterable이 비어 있으면, start 값을 반환합니다. 이 함수는 숫자 값과 함께 사용하기 위한 것으로, 숫자가 아닌 형을 거부 할 수 있습니다.


Added in version 3.8.

@end deffn

@geindex sumprod() (math 모듈)
@anchor{library/math math sumprod}@anchor{6be}
@deffn {함수} math.sumprod (p, q)

Return the sum of products of values from two iterables `p' and `q'.

Raises @ref{2ec,,ValueError} if the inputs do not have the same length.

대략 다음과 동등합니다:

@example
sum(map(operator.mul, p, q, strict=True))
@end example

For float and mixed int/float inputs, the intermediate products
and sums are computed with extended precision.


Added in version 3.12.

@end deffn

@node 각도 변환,삼각 함수,합과 곱 함수,math — 수학 함수
@anchor{library/math angular-conversion}@anchor{2aae}
@subsubsection 각도 변환


@geindex degrees() (math 모듈)
@anchor{library/math math degrees}@anchor{2a9c}
@deffn {함수} math.degrees (x)

각도 `x'를 라디안에서 도(degree)로 변환합니다.
@end deffn

@geindex radians() (math 모듈)
@anchor{library/math math radians}@anchor{2a9d}
@deffn {함수} math.radians (x)

각도 `x'를 도(degree)에서 라디안으로 변환합니다.
@end deffn

@node 삼각 함수,쌍곡선 함수,각도 변환,math — 수학 함수
@anchor{library/math trigonometric-functions}@anchor{2aaf}
@subsubsection 삼각 함수


@geindex acos() (math 모듈)
@anchor{library/math math acos}@anchor{2a9e}
@deffn {함수} math.acos (x)

`x'의 아크 코사인(arc cosine)을 라디안으로 반환합니다. 결과는 @code{0}과 @code{pi} 사이입니다.
@end deffn

@geindex asin() (math 모듈)
@anchor{library/math math asin}@anchor{2a9f}
@deffn {함수} math.asin (x)

`x'의 아크 사인(arc sine)을 라디안으로 반환합니다. 결과는 @code{-pi/2}와 @code{pi/2} 사이입니다.
@end deffn

@geindex atan() (math 모듈)
@anchor{library/math math atan}@anchor{2aa0}
@deffn {함수} math.atan (x)

`x'의 아크 탄젠트(arc tangent)를 라디안으로 반환합니다. 결과는 @code{-pi/2}와 @code{pi/2} 사이입니다.
@end deffn

@geindex atan2() (math 모듈)
@anchor{library/math math atan2}@anchor{2aa1}
@deffn {함수} math.atan2 (y, x)

@code{atan(y / x)}를 라디안으로 반환합니다. 결과는 @code{-pi}와 @code{pi} 사이입니다. 평면에 있는 원점에서 점 @code{(x, y)}까지의 벡터는 양의 X 축과 이 각도를 이룹니다. @ref{2aa1,,atan2()}의 요점은 두 입력의 부호가 모두 알려져 있기 때문에 각도에 대한 정확한 사분면을 계산할 수 있다는 것입니다. 예를 들어, @code{atan(1)}과 @code{atan2(1, 1)}은 모두 @code{pi/4}이지만, @code{atan2(-1, -1)}은 @code{-3*pi/4}입니다.
@end deffn

@geindex cos() (math 모듈)
@anchor{library/math math cos}@anchor{16c4}
@deffn {함수} math.cos (x)

`x' 라디안의 코사인(cosine)을 반환합니다.
@end deffn

@geindex sin() (math 모듈)
@anchor{library/math math sin}@anchor{16c3}
@deffn {함수} math.sin (x)

`x' 라디안의 사인(sine)을 반환합니다.
@end deffn

@geindex tan() (math 모듈)
@anchor{library/math math tan}@anchor{2aa2}
@deffn {함수} math.tan (x)

`x' 라디안의 탄젠트(tangent)를 반환합니다.
@end deffn

@node 쌍곡선 함수,특수 함수,삼각 함수,math — 수학 함수
@anchor{library/math hyperbolic-functions}@anchor{2ab0}
@subsubsection 쌍곡선 함수


쌍곡선 함수@footnote{https://en.wikipedia.org/wiki/Hyperbolic_functions}는 원 대신 쌍곡선을 기반으로 하는 삼각 함수의 동류(analog)입니다.

@geindex acosh() (math 모듈)
@anchor{library/math math acosh}@anchor{15da}
@deffn {함수} math.acosh (x)

`x'의 역 쌍곡 코사인(inverse hyperbolic cosine)을 반환합니다.
@end deffn

@geindex asinh() (math 모듈)
@anchor{library/math math asinh}@anchor{15db}
@deffn {함수} math.asinh (x)

`x'의 역 쌍곡 사인(inverse hyperbolic sine)을 반환합니다.
@end deffn

@geindex atanh() (math 모듈)
@anchor{library/math math atanh}@anchor{15dc}
@deffn {함수} math.atanh (x)

`x'의 역 쌍곡 탄젠트(inverse hyperbolic tangent)를 반환합니다.
@end deffn

@geindex cosh() (math 모듈)
@anchor{library/math math cosh}@anchor{2aa3}
@deffn {함수} math.cosh (x)

`x'의 쌍곡 코사인(hyperbolic cosine)을 반환합니다.
@end deffn

@geindex sinh() (math 모듈)
@anchor{library/math math sinh}@anchor{2aa4}
@deffn {함수} math.sinh (x)

`x'의 쌍곡 사인(hyperbolic sine)을 반환합니다.
@end deffn

@geindex tanh() (math 모듈)
@anchor{library/math math tanh}@anchor{2aa5}
@deffn {함수} math.tanh (x)

`x'의 쌍곡 탄젠트(hyperbolic tangent)를 반환합니다.
@end deffn

@node 특수 함수,상수<2>,쌍곡선 함수,math — 수학 함수
@anchor{library/math special-functions}@anchor{2ab1}
@subsubsection 특수 함수


@geindex erf() (math 모듈)
@anchor{library/math math erf}@anchor{dd2}
@deffn {함수} math.erf (x)

`x'의 오차 함수(error function)@footnote{https://en.wikipedia.org/wiki/Error_function}를 반환합니다.

@ref{dd2,,erf()} 함수는 누적 표준 정규 분포@footnote{https://en.wikipedia.org/wiki/Cumulative_distribution_function}와 같은 전통적인 통계 함수를 계산하는 데 사용할 수 있습니다:

@example
def phi(x):
    '표준 정규 분포의 누적 분포 함수'
    return (1.0 + erf(x / sqrt(2.0))) / 2.0
@end example


Added in version 3.2.

@end deffn

@geindex erfc() (math 모듈)
@anchor{library/math math erfc}@anchor{dd3}
@deffn {함수} math.erfc (x)

`x'의 여오차 함수를 반환합니다. 여오차 함수(complementary error function)@footnote{https://en.wikipedia.org/wiki/Error_function}는 @code{1.0 - erf(x)}로 정의됩니다. 뺄셈으로 인해 유효 숫자의 소실@footnote{https://en.wikipedia.org/wiki/Loss_of_significance}이 발생하는 `x'의 큰 값에 사용됩니다.


Added in version 3.2.

@end deffn

@geindex gamma() (math 모듈)
@anchor{library/math math gamma}@anchor{13f2}
@deffn {함수} math.gamma (x)

`x'의 감마 함수(Gamma function)@footnote{https://en.wikipedia.org/wiki/Gamma_function}를 반환합니다.


Added in version 3.2.

@end deffn

@geindex lgamma() (math 모듈)
@anchor{library/math math lgamma}@anchor{13f3}
@deffn {함수} math.lgamma (x)

`x'의 감마 함수의 절댓값의 자연로그를 반환합니다.


Added in version 3.2.

@end deffn

@node 상수<2>,,특수 함수,math — 수학 함수
@anchor{library/math constants}@anchor{2ab2}
@subsubsection 상수


@geindex pi (math 모듈)
@anchor{library/math math pi}@anchor{2aa6}
@deffn {데이터} math.pi

사용 가능한 정밀도로, 수학 상수 `π' = 3.141592…
@end deffn

@geindex e (math 모듈)
@anchor{library/math math e}@anchor{2aa7}
@deffn {데이터} math.e

사용 가능한 정밀도로, 수학 상수 `e' = 2.718281…
@end deffn

@geindex tau (math 모듈)
@anchor{library/math math tau}@anchor{2aa8}
@deffn {데이터} math.tau

The mathematical constant `τ' = 6.283185…, to available precision.
Tau is a circle constant equal to 2`π', the ratio of a circle’s circumference to
its radius. To learn more about Tau, check out Vi Hart’s video Pi is (still) Wrong@footnote{https://vimeo.com/147792667}, and start celebrating
Tau day@footnote{https://tauday.com/} by eating twice as much pie!


Added in version 3.6.

@end deffn

@geindex inf (math 모듈)
@anchor{library/math math inf}@anchor{e7d}
@deffn {데이터} math.inf

부동 소수점 양의 무한대. (음의 무한대는 @code{-math.inf}를 사용하십시오.) @code{float('inf')}의 출력과 동등합니다.


Added in version 3.5.

@end deffn

@geindex nan (math 모듈)
@anchor{library/math math nan}@anchor{872}
@deffn {데이터} math.nan

A floating-point “not a number” (NaN) value. Equivalent to the output of
@code{float('nan')}. Due to the requirements of the IEEE-754 standard@footnote{https://en.wikipedia.org/wiki/IEEE_754}, @code{math.nan} and @code{float('nan')} are
not considered to equal to any other numeric value, including themselves. To check
whether a number is a NaN, use the @ref{15d7,,isnan()} function to test
for NaNs instead of @code{is} or @code{==}.
Example:

@example
>>> import math
>>> math.nan == math.nan
False
>>> float('nan') == float('nan')
False
>>> math.isnan(math.nan)
True
>>> math.isnan(float('nan'))
True
@end example


Added in version 3.5.



버전 3.11에서 변경: It is now always available.

@end deffn

`CPython 구현 상세:' The @code{math} module consists mostly of thin wrappers around the platform C
math library functions.  Behavior in exceptional cases follows Annex F of
the C99 standard where appropriate.  The current implementation will raise
@ref{2ec,,ValueError} for invalid operations like @code{sqrt(-1.0)} or @code{log(0.0)}
(where C99 Annex F recommends signaling invalid operation or divide-by-zero),
and @ref{a81,,OverflowError} for results that overflow (for example,
@code{exp(1000.0)}).  A NaN will not be returned from any of the functions
above unless one or more of the input arguments was a NaN; in that case,
most functions will return a NaN, but (again following C99 Annex F) there
are some exceptions to this rule, for example @code{pow(float('nan'), 0.0)} or
@code{hypot(float('nan'), float('inf'))}.

파이썬은 신호를 주는 NaN(signaling NaN)을 조용한 NaN(quiet NaN)과 구별하기 위해 노력하지 않으며, 신호를 주는 NaN의 동작은 지정되지 않은 상태로 남아 있습니다. 일반적인 동작은 모든 NaN을 조용한 것으로 취급하는 것입니다.


@subsubheading 더 보기



@table @asis

@item 모듈 @ref{19,,cmath}

이 함수 중 많은 것들의 복소수 버전.
@end table


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node cmath — 복소수를 위한 수학 함수,decimal — Decimal fixed-point and floating-point arithmetic,math — 수학 함수,숫자와 수학 모듈
@anchor{library/cmath doc}@anchor{2ab3}@anchor{library/cmath cmath-mathematical-functions-for-complex-numbers}@anchor{2ab4}@anchor{library/cmath module-cmath}@anchor{19}@anchor{library/cmath translation-repo}@anchor{2ab5}
@subsection @code{cmath} — 복소수를 위한 수학 함수


@geindex module; cmath


__________________________________________________________________


이 모듈은 복소수를 위한 수학 함수에 대한 액세스를 제공합니다. 이 모듈의 함수는 정수, 부동 소수점 수 또는 복소수를 인자로 받아들입니다. 이들은 또한 @ref{7fc,,__complex__()}나 @ref{bc0,,__float__()} 메서드를 가진 임의의 파이썬 객체를 받아들일 것입니다: 이 메서드는 객체를 각각 복소수나 부동 소수점 수로 변환하기 위해 사용되며, 함수는 변환 결과에 적용됩니다.

@cartouche
@quotation 참고 
For functions involving branch cuts, we have the problem of deciding how to
define those functions on the cut itself. Following Kahan’s “Branch cuts for
complex elementary functions” paper, as well as Annex G of C99 and later C
standards, we use the sign of zero to distinguish one side of the branch cut
from the other: for a branch cut along (a portion of) the real axis we look
at the sign of the imaginary part, while for a branch cut along the
imaginary axis we look at the sign of the real part.

For example, the @ref{2ab6,,cmath.sqrt()} function has a branch cut along the
negative real axis. An argument of @code{-2-0j} is treated as
though it lies `below' the branch cut, and so gives a result on the negative
imaginary axis:

@example
>>> cmath.sqrt(-2-0j)
-1.4142135623730951j
@end example

But an argument of @code{-2+0j} is treated as though it lies above
the branch cut:

@example
>>> cmath.sqrt(-2+0j)
1.4142135623730951j
@end example
@end quotation
@end cartouche


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

`극좌표 변환'

@tab

@item

@ref{2ab7,,phase(z)}

@tab

`z'의 위상을 반환합니다

@item

@ref{2ab8,,polar(z)}

@tab

`z'의 극좌표 표현을 반환합니다

@item

@ref{2ab9,,rect(r@comma{} phi)}

@tab

극좌표 `r'과 `phi'를 가지는 복소수 `z'를 반환합니다

@item

`거듭제곱과 로그 함수'

@tab

@item

@ref{2aba,,exp(z)}

@tab

Return `e' raised to the power `z'

@item

@ref{2abb,,log(z[@comma{} base])}

@tab

Return the logarithm of `z' to the given `base' (`e' by default)

@item

@ref{2abc,,log10(z)}

@tab

`z'의 10을 밑으로하는 로그를 반환합니다

@item

@ref{2ab6,,sqrt(z)}

@tab

`z'의 제곱근을 반환합니다

@item

`삼각 함수'

@tab

@item

@ref{2abd,,acos(z)}

@tab

`z'의 아크 코사인을 반환합니다

@item

@ref{2abe,,asin(z)}

@tab

`z'의 아크 사인을 반환합니다

@item

@ref{2abf,,atan(z)}

@tab

`z'의 아크 탄젠트를 반환합니다

@item

@ref{2ac0,,cos(z)}

@tab

`z'의 코사인을 반환합니다

@item

@ref{2ac1,,sin(z)}

@tab

`z'의 사인을 반환합니다

@item

@ref{2ac2,,tan(z)}

@tab

`z'의 탄젠트를 반환합니다

@item

`쌍곡선(hyperbolic) 함수'

@tab

@item

@ref{2ac3,,acosh(z)}

@tab

`z'의 역 쌍곡선 코사인을 반환합니다

@item

@ref{2ac4,,asinh(z)}

@tab

`z'의 역 쌍곡선 사인을 반환합니다

@item

@ref{2ac5,,atanh(z)}

@tab

`z'의 역 쌍곡선 탄젠트를 반환합니다

@item

@ref{2ac6,,cosh(z)}

@tab

`z'의 쌍곡선 코사인을 반환합니다

@item

@ref{2ac7,,sinh(z)}

@tab

`z'의 쌍곡선 사인을 반환합니다

@item

@ref{2ac8,,tanh(z)}

@tab

`z'의 쌍곡선 탄젠트를 반환합니다

@item

`분류 함수'

@tab

@item

@ref{2ac9,,isfinite(z)}

@tab

Check if all components of `z' are finite

@item

@ref{2aca,,isinf(z)}

@tab

Check if any component of `z' is infinite

@item

@ref{2acb,,isnan(z)}

@tab

Check if any component of `z' is a NaN

@item

@ref{fb0,,isclose(a@comma{} b@comma{} *@comma{} rel_tol@comma{} abs_tol)}

@tab

`a'와 `b' 값이 서로 가까운지 검사합니다

@item

`상수'

@tab

@item

@ref{2acc,,pi}

@tab

`π' = 3.141592…

@item

@ref{2acd,,e}

@tab

`e' = 2.718281…

@item

@ref{e7c,,tau}

@tab

`τ' = 2`π' = 6.283185…

@item

@ref{e7e,,inf}

@tab

Positive infinity

@item

@ref{e80,,infj}

@tab

Pure imaginary infinity

@item

@ref{e7f,,nan}

@tab

“Not a number” (NaN)

@item

@ref{e81,,nanj}

@tab

Pure imaginary NaN

@end multitable


@menu
* 극좌표 변환:: 
* 거듭제곱과 로그 함수:: 
* 삼각 함수: 삼각 함수<2>. 
* 쌍곡선(hyperbolic) 함수: 쌍곡선 hyperbolic 함수. 
* 분류 함수:: 
* 상수: 상수<3>. 

@end menu

@node 극좌표 변환,거듭제곱과 로그 함수,,cmath — 복소수를 위한 수학 함수
@anchor{library/cmath conversions-to-and-from-polar-coordinates}@anchor{2ace}
@subsubsection 극좌표 변환


파이썬 복소수 @code{z}는 `직교' 혹은 `데카르트' 좌표를 사용하여 내부적으로 저장됩니다. `실수부' @code{z.real}과 `허수부' @code{z.imag}에 의해 완전히 결정됩니다.

`극좌표(polar coordinates)'는 복소수를 나타내는 다른 방법을 제공합니다. 극좌표에서, 복소수 `z'는 모듈러스(modulus) `r'과 위상 각(phase angle) `phi'로 정의됩니다. 모듈러스 `r'은 `z'에서 원점까지의 거리이며, 위상 `phi'는 양의 x축에서 원점과 `z'를 잇는 선분으로의 라디안(radian)으로 측정한 반 시계 방향 각도입니다.

네이티브 직교 좌표와 극좌표 간의 변환에 다음 함수를 사용할 수 있습니다.

@geindex phase() (cmath 모듈)
@anchor{library/cmath cmath phase}@anchor{2ab7}
@deffn {함수} cmath.phase (z)

`z'의 위상(`z'의 `편각(argument)'이라고도 합니다)을 float로 반환합니다. @code{phase(z)}는 @code{math.atan2(z.imag, z.real)}과 동등합니다. 결과는 [-`π', `π'] 범위에 놓이고, 이 작업의 분지 절단은 음의 실수 축에 놓입니다. 결과의 부호가 @code{z.imag}가 0일 때도 @code{z.imag}의 부호와 같음을 의미합니다:

@example
>>> phase(-1+0j)
3.141592653589793
>>> phase(-1-0j)
-3.141592653589793
@end example
@end deffn

@cartouche
@quotation 참고 
The modulus (absolute value) of a complex number `z' can be
computed using the built-in @ref{208b,,abs()} function.  There is no
separate @code{cmath} module function for this operation.
@end quotation
@end cartouche

@geindex polar() (cmath 모듈)
@anchor{library/cmath cmath polar}@anchor{2ab8}
@deffn {함수} cmath.polar (z)

`z' 표현을 극좌표로 반환합니다. 쌍 @code{(r, phi)}를 반환합니다. 여기서 `r'은 `z'의 모듈러스이고 `phi'는 `z'의 위상입니다. @code{polar(z)}는 @code{(abs(z), phase(z))}와 동등합니다.
@end deffn

@geindex rect() (cmath 모듈)
@anchor{library/cmath cmath rect}@anchor{2ab9}
@deffn {함수} cmath.rect (r, phi)

극좌표 `r'과 `phi'를 가지는 복소수 `z'를 반환합니다. @code{complex(r * math.cos(phi), r * math.sin(phi))}와 동등합니다.
@end deffn

@node 거듭제곱과 로그 함수,삼각 함수<2>,극좌표 변환,cmath — 복소수를 위한 수학 함수
@anchor{library/cmath power-and-logarithmic-functions}@anchor{2acf}
@subsubsection 거듭제곱과 로그 함수


@geindex exp() (cmath 모듈)
@anchor{library/cmath cmath exp}@anchor{2aba}
@deffn {함수} cmath.exp (z)

`e'의 `z' 거듭제곱을 반환합니다. 여기서 `e'는 자연로그(natural logarithms)의 밑입니다.
@end deffn

@geindex log() (cmath 모듈)
@anchor{library/cmath cmath log}@anchor{2abb}
@deffn {함수} cmath.log (z[, base])

주어진 밑 `base'에 대한 `z'의 로그를 반환합니다. `base'가 지정되지 않으면, `z'의 자연로그를 반환합니다. 음의 실수 축을 따라 0에서부터 -∞ 까지 가는 하나의 분지 절단이 있습니다.
@end deffn

@geindex log10() (cmath 모듈)
@anchor{library/cmath cmath log10}@anchor{2abc}
@deffn {함수} cmath.log10 (z)

`z'의 밑이 10인 로그를 반환합니다. 이것은 @ref{2abb,,log()}와 같은 분지 절단을 가집니다.
@end deffn

@geindex sqrt() (cmath 모듈)
@anchor{library/cmath cmath sqrt}@anchor{2ab6}
@deffn {함수} cmath.sqrt (z)

`z'의 제곱근을 반환합니다. 이것은 @ref{2abb,,log()}와 같은 분지 절단을 가집니다.
@end deffn

@node 삼각 함수<2>,쌍곡선 hyperbolic 함수,거듭제곱과 로그 함수,cmath — 복소수를 위한 수학 함수
@anchor{library/cmath trigonometric-functions}@anchor{2ad0}
@subsubsection 삼각 함수


@geindex acos() (cmath 모듈)
@anchor{library/cmath cmath acos}@anchor{2abd}
@deffn {함수} cmath.acos (z)

`z'의 아크 코사인을 반환합니다. 두 개의 분지 절단이 있습니다: 하나는 실수 축을 따라 1에서 오른쪽으로 ∞까지 확장합니다. 다른 하나는 실수 축을 따라 -1에서 왼쪽으로 -∞까지 확장합니다.
@end deffn

@geindex asin() (cmath 모듈)
@anchor{library/cmath cmath asin}@anchor{2abe}
@deffn {함수} cmath.asin (z)

`z'의 아크 사인을 반환합니다. 이것은 @ref{2abd,,acos()}와 같은 분지 절단을 가집니다.
@end deffn

@geindex atan() (cmath 모듈)
@anchor{library/cmath cmath atan}@anchor{2abf}
@deffn {함수} cmath.atan (z)

`z'의 아크 탄젠트를 반환합니다. 두 개의 분지 절단이 있습니다: 하나는 허수 축을 따라 @code{1j}에서 @code{∞j}까지 확장합니다. 다른 하나는 허수 축을 따라 @code{-1j}에서 @code{-∞j}까지 확장합니다.
@end deffn

@geindex cos() (cmath 모듈)
@anchor{library/cmath cmath cos}@anchor{2ac0}
@deffn {함수} cmath.cos (z)

`z'의 코사인을 반환합니다.
@end deffn

@geindex sin() (cmath 모듈)
@anchor{library/cmath cmath sin}@anchor{2ac1}
@deffn {함수} cmath.sin (z)

`z'의 사인을 반환합니다.
@end deffn

@geindex tan() (cmath 모듈)
@anchor{library/cmath cmath tan}@anchor{2ac2}
@deffn {함수} cmath.tan (z)

`z'의 탄젠트를 반환합니다.
@end deffn

@node 쌍곡선 hyperbolic 함수,분류 함수,삼각 함수<2>,cmath — 복소수를 위한 수학 함수
@anchor{library/cmath hyperbolic-functions}@anchor{2ad1}
@subsubsection 쌍곡선(hyperbolic) 함수


@geindex acosh() (cmath 모듈)
@anchor{library/cmath cmath acosh}@anchor{2ac3}
@deffn {함수} cmath.acosh (z)

`z'의 역 쌍곡선 코사인을 반환합니다. 하나의 분지 절단이 있습니다, 실수 축을 따라 1에서 왼쪽으로 -∞까지 확장합니다.
@end deffn

@geindex asinh() (cmath 모듈)
@anchor{library/cmath cmath asinh}@anchor{2ac4}
@deffn {함수} cmath.asinh (z)

`z'의 역 쌍곡선 사인을 반환합니다. 두 개의 분지 절단이 있습니다: 하나는 허수 축을 따라 @code{1j}에서 @code{∞j}까지 확장합니다. 다른 하나는 허수 축을 따라 @code{-1j}에서 @code{-∞j}까지 확장합니다.
@end deffn

@geindex atanh() (cmath 모듈)
@anchor{library/cmath cmath atanh}@anchor{2ac5}
@deffn {함수} cmath.atanh (z)

`z'의 역 쌍곡선 탄젠트를 반환합니다. 두 개의 분지 절단이 있습니다: 하나는 실수 축을 따라 @code{1}에서 @code{∞}까지 확장합니다. 다른 하나는 실수 축을 따라 @code{-1}에서 @code{-∞}까지 확장합니다.
@end deffn

@geindex cosh() (cmath 모듈)
@anchor{library/cmath cmath cosh}@anchor{2ac6}
@deffn {함수} cmath.cosh (z)

`z'의 쌍곡선 코사인을 반환합니다.
@end deffn

@geindex sinh() (cmath 모듈)
@anchor{library/cmath cmath sinh}@anchor{2ac7}
@deffn {함수} cmath.sinh (z)

`z'의 쌍곡선 사인을 반환합니다.
@end deffn

@geindex tanh() (cmath 모듈)
@anchor{library/cmath cmath tanh}@anchor{2ac8}
@deffn {함수} cmath.tanh (z)

`z'의 쌍곡선 탄젠트를 반환합니다.
@end deffn

@node 분류 함수,상수<3>,쌍곡선 hyperbolic 함수,cmath — 복소수를 위한 수학 함수
@anchor{library/cmath classification-functions}@anchor{2ad2}
@subsubsection 분류 함수


@geindex isfinite() (cmath 모듈)
@anchor{library/cmath cmath isfinite}@anchor{2ac9}
@deffn {함수} cmath.isfinite (z)

`z'의 실수부와 허수부가 모두 유한이면 @code{True}를 반환하고, 그렇지 않으면 @code{False}를 반환합니다.


Added in version 3.2.

@end deffn

@geindex isinf() (cmath 모듈)
@anchor{library/cmath cmath isinf}@anchor{2aca}
@deffn {함수} cmath.isinf (z)

`z'의 실수부나 허수부 중 하나가 무한이면 @code{True}를 반환하고, 그렇지 않으면 @code{False}를 반환합니다.
@end deffn

@geindex isnan() (cmath 모듈)
@anchor{library/cmath cmath isnan}@anchor{2acb}
@deffn {함수} cmath.isnan (z)

`z'의 실수부나 허수부 중 하나가 NaN이면 @code{True}를 반환하고, 그렇지 않으면 @code{False}를 반환합니다.
@end deffn

@geindex isclose() (cmath 모듈)
@anchor{library/cmath cmath isclose}@anchor{fb0}
@deffn {함수} cmath.isclose (a, b, *, rel_tol=1e-09, abs_tol=0.0)

`a'와 `b' 값이 서로 가까우면 @code{True}를 반환하고, 그렇지 않으면 @code{False}를 반환합니다.

두 값을 가까운 것으로 간주하는지는 주어진 절대와 상대 허용 오차에 따라 결정됩니다. 에러가 발생하지 않으면, 결과는 다음과 같습니다: @code{abs(a-b) <= max(rel_tol * max(abs(a), abs(b)), abs_tol)}.

`rel_tol'은 상대 허용 오차입니다 – `a'와 `b' 사이의 최대 허용 차이이고, `a'나 `b'의 절댓값 중 더 큰 값에 상대적입니다. 예를 들어, 5%의 허용 오차를 설정하려면, @code{rel_tol=0.05}를 전달하십시오. 기본 허용 오차는 @code{1e-09}이며, 이는 두 값이 약 9자리 십진 숫자 내에서 같음을 보장합니다. `rel_tol'은 음이 아니고 @code{1.0}보다 작아야 합니다.

`abs_tol'은 절대 허용 오차입니다; 기본값은 @code{0.0}이고 음이 아니어야합니다. @code{x}를 @code{0.0}과 비교할 때, @code{isclose(x, 0)}는 @code{abs(x) <= rel_tol  * abs(x)}로 계산되며, 모든 @code{x}와 @code{1.0}보다 작은 rel_tol 에 대해 @code{False}가 됩니다. 따라서 호출에 적절한 양의 abs_tol 인자를 추가하십시오.

IEEE 754 특수 값 @code{NaN}, @code{inf} 및 @code{-inf}는 IEEE 규칙에 따라 처리됩니다. 특히, @code{NaN}은 @code{NaN}을 포함한 다른 모는 값과 가깝다고 간주하지 않습니다. @code{inf}와 @code{-inf}는 그들 자신하고만 가깝다고 간주합니다.


Added in version 3.5.



@subsubheading 더 보기


@geindex Python 향상 제안; PEP 485
PEP 485@footnote{https://peps.python.org/pep-0485/} – 근사 동등을 검사하는 함수.

@end deffn

@node 상수<3>,,분류 함수,cmath — 복소수를 위한 수학 함수
@anchor{library/cmath constants}@anchor{2ad3}
@subsubsection 상수


@geindex pi (cmath 모듈)
@anchor{library/cmath cmath pi}@anchor{2acc}
@deffn {데이터} cmath.pi

수학 상수 `π'의 float 값.
@end deffn

@geindex e (cmath 모듈)
@anchor{library/cmath cmath e}@anchor{2acd}
@deffn {데이터} cmath.e

수학 상수 `e'의 float 값.
@end deffn

@geindex tau (cmath 모듈)
@anchor{library/cmath cmath tau}@anchor{e7c}
@deffn {데이터} cmath.tau

수학 상수 `τ'의 float 값.


Added in version 3.6.

@end deffn

@geindex inf (cmath 모듈)
@anchor{library/cmath cmath inf}@anchor{e7e}
@deffn {데이터} cmath.inf

부동 소수점 양의 무한대. @code{float('inf')}와 동등합니다.


Added in version 3.6.

@end deffn

@geindex infj (cmath 모듈)
@anchor{library/cmath cmath infj}@anchor{e80}
@deffn {데이터} cmath.infj

0 실수부와 양의 무한대 허수부를 갖는 복소수. @code{complex(0.0, float('inf'))}와 동등합니다.


Added in version 3.6.

@end deffn

@geindex nan (cmath 모듈)
@anchor{library/cmath cmath nan}@anchor{e7f}
@deffn {데이터} cmath.nan

A floating-point “not a number” (NaN) value.  Equivalent to
@code{float('nan')}. See also @ref{872,,math.nan}.


Added in version 3.6.

@end deffn

@geindex nanj (cmath 모듈)
@anchor{library/cmath cmath nanj}@anchor{e81}
@deffn {데이터} cmath.nanj

0 실수부와 NaN 허수부를 갖는 복소수. @code{complex(0.0, float('nan'))}과 동등합니다.


Added in version 3.6.

@end deffn

@geindex 모듈;수학

Note that the selection of functions is similar, but not identical, to that in
module @ref{92,,math}.  The reason for having two modules is that some users aren’t
interested in complex numbers, and perhaps don’t even know what they are.  They
would rather have @code{math.sqrt(-1)} raise an exception than return a complex
number. Also note that the functions defined in @code{cmath} always return a
complex number, even if the answer can be expressed as a real number (in which
case the complex number has an imaginary part of zero).

분지 절단에 대한 참고 사항: 주어진 함수가 연속적이지 않은 점을 지나는 곡선입니다. 이것들은 많은 복소수 기능에서 필요한 기능입니다. 복소수 함수로 계산해야 할 때, 분지 절단에 대해 이해가 필요하다고 가정합니다. 이해를 위해서는 복소 변수에 관한 (너무 기초적이지 않은) 아무 책이나 참고하면 됩니다. 수치 계산의 목적으로 분지 절단을 적절히 선택하는 방법에 대한 정보에 대해서는, 다음과 같은 좋은 참고 문헌이 있습니다:


@subsubheading 더 보기


Kahan, W: Branch cuts for complex elementary functions; or, Much ado about nothing’s sign bit. Iserles, A., and Powell, M. (eds.), The state of the art in numerical analysis. Clarendon Press (1987) pp165–211.


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node decimal — Decimal fixed-point and floating-point arithmetic,fractions — 유리수,cmath — 복소수를 위한 수학 함수,숫자와 수학 모듈
@anchor{library/decimal doc}@anchor{2ad4}@anchor{library/decimal decimal-decimal-fixed-point-and-floating-point-arithmetic}@anchor{2ad5}@anchor{library/decimal module-decimal}@anchor{3a}@anchor{library/decimal translation-repo}@anchor{2ad6}
@subsection @code{decimal} — Decimal fixed-point and floating-point arithmetic


@geindex module; decimal

`소스 코드:' Lib/decimal.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/decimal.py}

@c import modules for testing inline doctests with the Sphinx doctest builder

@c import decimal
@c import math
@c from decimal import *
@c # make sure each group gets a fresh context
@c setcontext(Context())

@c # make sure other tests (outside this file) get a fresh context
@c setcontext(Context())


__________________________________________________________________


The @code{decimal} module provides support for fast correctly rounded
decimal floating-point arithmetic. It offers several advantages over the
@ref{196,,float} datatype:


@itemize *

@item 
Decimal “is based on a floating-point model@footnote{https://speleotrove.com/decimal/damodel.html#refnumber} which was designed
with people in mind, and necessarily has a paramount guiding principle –
computers must provide an arithmetic that works in the same way as the
arithmetic that people learn at school.” – excerpt from the decimal
arithmetic specification.

@item 
Decimal numbers can be represented exactly.  In contrast, numbers like
@code{1.1} and @code{2.2} do not have exact representations in binary
floating point. End users typically would not expect @code{1.1 + 2.2} to display
as @code{3.3000000000000003} as it does with binary floating point.

@item 
The exactness carries over into arithmetic.  In decimal floating point, @code{0.1
+ 0.1 + 0.1 - 0.3} is exactly equal to zero.  In binary floating point, the result
is @code{5.5511151231257827e-017}.  While near to zero, the differences
prevent reliable equality testing and differences can accumulate. For this
reason, decimal is preferred in accounting applications which have strict
equality invariants.

@item 
The decimal module incorporates a notion of significant places so that @code{1.30
+ 1.20} is @code{2.50}.  The trailing zero is kept to indicate significance.
This is the customary presentation for monetary applications. For
multiplication, the “schoolbook” approach uses all the figures in the
multiplicands.  For instance, @code{1.3 * 1.2} gives @code{1.56} while @code{1.30 *
1.20} gives @code{1.5600}.

@item 
하드웨어 기반 이진 부동 소수점과는 달리, decimal 모듈은 사용자가 변경할 수 있는 정밀도(기본값은 28자리)를 가지며, 주어진 문제에 따라 필요한 만큼 커질 수 있습니다:

@example
>>> from decimal import *
>>> getcontext().prec = 6
>>> Decimal(1) / Decimal(7)
Decimal('0.142857')
>>> getcontext().prec = 28
>>> Decimal(1) / Decimal(7)
Decimal('0.1428571428571428571428571429')
@end example

@item 
이진 및 십진 부동 소수점 모두 출판된 표준에 따라 구현됩니다. 내장 float 형이 기능의 적당한 부분만을 드러내지만, decimal 모듈은 표준의 모든 필수 부분을 노출합니다. 필요한 경우, 프로그래머는 자리 올림(rounding) 및 신호(signal) 처리를 완전히 제어할 수 있습니다. 여기에는 정확하지 않은 연산을 차단하기 위한 예외를 사용하여 정확한 산술을 강제하는 옵션이 포함됩니다.

@item 
decimal 모듈은 “편견 없이, (때로 고정 소수점 산술이라고도 불리는) 정확한 자리 올림 없는 십진 산술과 자리 올림 있는 부동 소수점 산술을 모두” 지원하도록 설계되었습니다. – 십진 산술 명세에서 발췌.
@end itemize

모듈 설계의 중심 개념은 세 가지입니다: 십진수, 산술을 위한 컨텍스트, 신호(signal).

A decimal number is immutable.  It has a sign, coefficient digits, and an
exponent.  To preserve significance, the coefficient digits do not truncate
trailing zeros.  Decimals also include special values such as
@code{Infinity}, @code{-Infinity}, and @code{NaN}.  The standard also
differentiates @code{-0} from @code{+0}.

산술 컨텍스트는 정밀도, 자리 올림 규칙, 지수에 대한 제한, 연산 결과를 나타내는 플래그 및 신호가 예외로 처리될지를 결정하는 트랩 활성화기(trap enabler)를 지정하는 환경입니다. 자리 올림 옵션에는 @ref{2ad7,,ROUND_CEILING}, @ref{2ad8,,ROUND_DOWN}, @ref{2ad9,,ROUND_FLOOR}, @ref{2ada,,ROUND_HALF_DOWN}, @ref{2adb,,ROUND_HALF_EVEN}, @ref{2adc,,ROUND_HALF_UP}, @ref{2add,,ROUND_UP} 및 @ref{2ade,,ROUND_05UP} 가 있습니다.

신호는 계산 과정에서 발생하는 예외적인 조건의 그룹입니다. 응용 프로그램의 필요에 따라, 신호가 무시되거나, 정보로 간주하거나, 예외로 처리될 수 있습니다. decimal 모듈의 신호는 @ref{2adf,,Clamped}, @ref{12ad,,InvalidOperation}, @ref{2ae0,,DivisionByZero}, @ref{2ae1,,Inexact}, @ref{2ae2,,Rounded}, @ref{2ae3,,Subnormal}, @ref{2ae4,,Overflow}, @ref{2ae5,,Underflow}, @ref{12a2,,FloatOperation} 입니다.

각 신호에는 플래그와 트랩 활성화기가 있습니다. 신호와 만났을 때, 플래그가 1로 설정되고 트랩 활성화기가 1로 설정된 경우, 예외가 발생합니다. 플래그는 상태가 유지되므로(sticky) 계산을 감시하기 전에 재설정할 필요가 있습니다.


@subsubheading 더 보기



@itemize *

@item 
IBM’s General Decimal Arithmetic Specification, The General Decimal Arithmetic Specification@footnote{https://speleotrove.com/decimal/decarith.html}.
@end itemize


@c %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

@menu
* Quick-start tutorial:: 
* Decimal 객체:: 
* Context 객체:: 
* 상수: 상수<4>. 
* 자리 올림 모드:: 
* 신호:: 
* Floating-point notes:: 
* 스레드로 작업하기:: 
* 조리법:: 
* Decimal FAQ:: 

@end menu

@node Quick-start tutorial,Decimal 객체,,decimal — Decimal fixed-point and floating-point arithmetic
@anchor{library/decimal decimal-tutorial}@anchor{2ae6}@anchor{library/decimal quick-start-tutorial}@anchor{2ae7}
@subsubsection Quick-start tutorial


decimal을 사용하는 일반적인 시작은 모듈을 임포트하고, @ref{1938,,getcontext()} 로 현재 컨텍스트를 보고, 필요하다면 정밀도, 자리 올림 또는 활성화된 트랩에 대해 새 값을 설정하는 것입니다:

@example
>>> from decimal import *
>>> getcontext()
Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999,
        capitals=1, clamp=0, flags=[], traps=[Overflow, DivisionByZero,
        InvalidOperation])

>>> getcontext().prec = 7       # Set a new precision
@end example

Decimal instances can be constructed from integers, strings, floats, or tuples.
Construction from an integer or a float performs an exact conversion of the
value of that integer or float.  Decimal numbers include special values such as
@code{NaN} which stands for “Not a number”, positive and negative
@code{Infinity}, and @code{-0}:

@example
>>> getcontext().prec = 28
>>> Decimal(10)
Decimal('10')
>>> Decimal('3.14')
Decimal('3.14')
>>> Decimal(3.14)
Decimal('3.140000000000000124344978758017532527446746826171875')
>>> Decimal((0, (3, 1, 4), -2))
Decimal('3.14')
>>> Decimal(str(2.0 ** 0.5))
Decimal('1.4142135623730951')
>>> Decimal(2) ** Decimal('0.5')
Decimal('1.414213562373095048801688724')
>>> Decimal('NaN')
Decimal('NaN')
>>> Decimal('-Infinity')
Decimal('-Infinity')
@end example

@ref{12a2,,FloatOperation} 신호를 트랩 하는 경우, 실수로 생성자나 대소비교에서 Decimal 수와 실수(float)를 혼합하면 예외가 발생합니다:

@example
>>> c = getcontext()
>>> c.traps[FloatOperation] = True
>>> Decimal(3.14)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
decimal.FloatOperation: [<class 'decimal.FloatOperation'>]
>>> Decimal('3.5') < 3.7
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
decimal.FloatOperation: [<class 'decimal.FloatOperation'>]
>>> Decimal('3.5') == 3.5
True
@end example


Added in version 3.3.


새로운 Decimal의 유효 숫자는 입력된 숫자의 개수에 의해서만 결정됩니다. 컨텍스트 정밀도 및 자리 올림은 오직 산술 연산 중에만 작용합니다.

@example
>>> getcontext().prec = 6
>>> Decimal('3.0')
Decimal('3.0')
>>> Decimal('3.1415926535')
Decimal('3.1415926535')
>>> Decimal('3.1415926535') + Decimal('2.7182818285')
Decimal('5.85987')
>>> getcontext().rounding = ROUND_UP
>>> Decimal('3.1415926535') + Decimal('2.7182818285')
Decimal('5.85988')
@end example

C 버전의 내부 제한을 초과하면, Decimal 을 만들 때 @ref{12ad,,InvalidOperation} 를 일으킵니다:

@example
>>> Decimal("1e9999999999999999999")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
decimal.InvalidOperation: [<class 'decimal.InvalidOperation'>]
@end example


버전 3.3에서 변경.


Decimals interact well with much of the rest of Python.  Here is a small decimal
floating-point flying circus:

@example
>>> data = list(map(Decimal, '1.34 1.87 3.45 2.35 1.00 0.03 9.25'.split()))
>>> max(data)
Decimal('9.25')
>>> min(data)
Decimal('0.03')
>>> sorted(data)
[Decimal('0.03'), Decimal('1.00'), Decimal('1.34'), Decimal('1.87'),
 Decimal('2.35'), Decimal('3.45'), Decimal('9.25')]
>>> sum(data)
Decimal('19.29')
>>> a,b,c = data[:3]
>>> str(a)
'1.34'
>>> float(a)
1.34
>>> round(a, 1)
Decimal('1.3')
>>> int(a)
1
>>> a * 5
Decimal('6.70')
>>> a * b
Decimal('2.5058')
>>> c % a
Decimal('0.77')
@end example

Decimals can be formatted (with @ref{199,,format()} built-in or @ref{19a,,포맷 문자열 리터럴}) in
fixed-point or scientific notation, using the same formatting syntax (see
@ref{4f9,,Format specification mini-language}) as builtin @ref{196,,float} type:

@example
>>> format(Decimal('2.675'), "f")
'2.675'
>>> format(Decimal('2.675'), ".2f")
'2.68'
>>> f"@{Decimal('2.675'):.2f@}"
'2.68'
>>> format(Decimal('2.675'), ".2e")
'2.68e+0'
>>> with localcontext() as ctx:
...     ctx.rounding = ROUND_DOWN
...     print(format(Decimal('2.675'), ".2f"))
...
2.67
@end example

그리고 Decimal에는 몇 가지 수학 함수도 있습니다:

@example
>>> getcontext().prec = 28
>>> Decimal(2).sqrt()
Decimal('1.414213562373095048801688724')
>>> Decimal(1).exp()
Decimal('2.718281828459045235360287471')
>>> Decimal('10').ln()
Decimal('2.302585092994045684017991455')
>>> Decimal('10').log10()
Decimal('1')
@end example

The @ref{12b5,,quantize()} method rounds a number to a fixed exponent.  This method is
useful for monetary applications that often round results to a fixed number of
places:

@example
>>> Decimal('7.325').quantize(Decimal('.01'), rounding=ROUND_DOWN)
Decimal('7.32')
>>> Decimal('7.325').quantize(Decimal('1.'), rounding=ROUND_UP)
Decimal('8')
@end example

위에서 보듯이, @ref{1938,,getcontext()} 함수는 현재 컨텍스트에 액세스하고 설정을 변경할 수 있게 합니다. 이 방법은 대부분 응용 프로그램의 요구를 충족시킵니다.

For more advanced work, it may be useful to create alternate contexts using the
@ref{12b4,,Context()} constructor.  To make an alternate active, use the @ref{2ae8,,setcontext()}
function.

In accordance with the standard, the @code{decimal} module provides two ready to
use standard contexts, @ref{12a9,,BasicContext} and @ref{12aa,,ExtendedContext}. The
former is especially useful for debugging because many of the traps are
enabled:

@example
>>> myothercontext = Context(prec=60, rounding=ROUND_HALF_DOWN)
>>> setcontext(myothercontext)
>>> Decimal(1) / Decimal(7)
Decimal('0.142857142857142857142857142857142857142857142857142857142857')

>>> ExtendedContext
Context(prec=9, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999,
        capitals=1, clamp=0, flags=[], traps=[])
>>> setcontext(ExtendedContext)
>>> Decimal(1) / Decimal(7)
Decimal('0.142857143')
>>> Decimal(42) / Decimal(0)
Decimal('Infinity')

>>> setcontext(BasicContext)
>>> Decimal(42) / Decimal(0)
Traceback (most recent call last):
  File "<pyshell#143>", line 1, in -toplevel-
    Decimal(42) / Decimal(0)
DivisionByZero: x / 0
@end example

Contexts also have signal flags for monitoring exceptional conditions
encountered during computations.  The flags remain set until explicitly cleared,
so it is best to clear the flags before each set of monitored computations by
using the @ref{2ae9,,clear_flags()} method.

@example
>>> setcontext(ExtendedContext)
>>> getcontext().clear_flags()
>>> Decimal(355) / Decimal(113)
Decimal('3.14159292')
>>> getcontext()
Context(prec=9, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999,
        capitals=1, clamp=0, flags=[Inexact, Rounded], traps=[])
@end example

The `flags' entry shows that the rational approximation to pi was
rounded (digits beyond the context precision were thrown away) and that the
result is inexact (some of the discarded digits were non-zero).

Individual traps are set using the dictionary in the @ref{12b3,,traps}
attribute of a context:

@example
>>> setcontext(ExtendedContext)
>>> Decimal(1) / Decimal(0)
Decimal('Infinity')
>>> getcontext().traps[DivisionByZero] = 1
>>> Decimal(1) / Decimal(0)
Traceback (most recent call last):
  File "<pyshell#112>", line 1, in -toplevel-
    Decimal(1) / Decimal(0)
DivisionByZero: x / 0
@end example

대부분 프로그램은 프로그램 시작 시에 한 번만 현재 컨텍스트를 조정합니다. 그리고, 많은 응용 프로그램에서, 데이터는 루프 내에서 단일형변환으로 @ref{1fe,,Decimal}로 변환되어, 프로그램 대부분은 다른 파이썬 숫자 형과 별로 다르지 않게 데이터를 조작합니다.

@c %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

@node Decimal 객체,Context 객체,Quick-start tutorial,decimal — Decimal fixed-point and floating-point arithmetic
@anchor{library/decimal decimal-decimal}@anchor{2aea}@anchor{library/decimal decimal-objects}@anchor{2aeb}
@subsubsection Decimal 객체


@geindex Decimal (decimal 클래스)
@anchor{library/decimal decimal Decimal}@anchor{1fe}
@deffn {클래스} decimal.Decimal (value='0', context=None)

`value' 를 기반으로 새 @ref{1fe,,Decimal} 객체를 만듭니다.

`value' 는 정수, 문자열, 튜플, @ref{196,,float} 또는 다른 @ref{1fe,,Decimal} 객체일 수 있습니다. `value' 가 주어지지 않으면, @code{Decimal('0')} 을 반환합니다. `value' 가 문자열이면, 앞뒤의 공백 문자 및 밑줄이 제거된 후 십진수 문자열 문법에 맞아야 합니다:

@example
sign           ::=  '+' | '-'
digit          ::=  '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9'
indicator      ::=  'e' | 'E'
digits         ::=  digit [digit]...
decimal-part   ::=  digits '.' [digits] | ['.'] digits
exponent-part  ::=  indicator [sign] digits
infinity       ::=  'Infinity' | 'Inf'
nan            ::=  'NaN' [digits] | 'sNaN' [digits]
numeric-value  ::=  decimal-part [exponent-part] | infinity
numeric-string ::=  [sign] numeric-value | [sign] nan
@end example

Other Unicode decimal digits are also permitted where @code{digit}
appears above.  These include decimal digits from various other
alphabets (for example, Arabic-Indic and Devanāgarī digits) along
with the fullwidth digits @code{'\uff10'} through @code{'\uff19'}.
Case is not significant, so, for example, @code{inf}, @code{Inf}, @code{INFINITY},
and @code{iNfINity} are all acceptable spellings for positive infinity.

If `value' is a @ref{610,,tuple}, it should have three components, a sign
(@code{0} for positive or @code{1} for negative), a @code{tuple} of
digits, and an integer exponent. For example, @code{Decimal((0, (1, 4, 1, 4), -3))}
returns @code{Decimal('1.414')}.

If `value' is a @ref{196,,float}, the binary floating-point value is losslessly
converted to its exact decimal equivalent.  This conversion can often require
53 or more digits of precision.  For example, @code{Decimal(float('1.1'))}
converts to
@code{Decimal('1.100000000000000088817841970012523233890533447265625')}.

`context' 정밀도는 저장되는 자릿수에 영향을 주지 않습니다. 저장되는 자릿수는 `value' 의 자릿수만으로 결정됩니다. 예를 들어 @code{Decimal('3.00000')} 은 컨텍스트 정밀도가 단지 3이라도 5개의 모든 0을 기록합니다.

The purpose of the `context' argument is determining what to do if `value' is a
malformed string.  If the context traps @ref{12ad,,InvalidOperation}, an exception
is raised; otherwise, the constructor returns a new Decimal with the value of
@code{NaN}.

일단 만들어지면, @ref{1fe,,Decimal} 객체는 불변입니다.


버전 3.2에서 변경: 생성자에 대한 인자는 이제 @ref{196,,float} 인스턴스가 될 수 있습니다.



버전 3.3에서 변경: @ref{196,,float} 인자는 @ref{12a2,,FloatOperation} 트랩이 설정되면 예외를 발생시킵니다. 기본적으로 트랩은 꺼져 있습니다.



버전 3.6에서 변경: 코드에서의 정수와 부동 소수점 리터럴과 마찬가지로, 밑줄로 무리 지을 수 있습니다.


Decimal floating-point objects share many properties with the other built-in
numeric types such as @ref{196,,float} and @ref{19b,,int}.  All of the usual math
operations and special methods apply.  Likewise, decimal objects can be
copied, pickled, printed, used as dictionary keys, used as set elements,
compared, sorted, and coerced to another type (such as @code{float} or
@code{int}).

Decimal 객체에 대한 산술과 정수 및 실수에 대한 산술에는 약간의 차이가 있습니다. Decimal 객체에 나머지 연산자 @code{%} 가 적용될 때, 결과의 부호는 제수의 부호가 아닌 `피제수'의 부호가 됩니다:

@example
>>> (-7) % 4
1
>>> Decimal(-7) % Decimal(4)
Decimal('-3')
@end example

정수 나눗셈 연산자 @code{//} 의 동작 역시 비슷한 차이를 보입니다. 즉, 가장 가까운 정수로 내림하는 대신 실제 몫의 정수 부(0을 향해 자르기)를 돌려줍니다. 그래서 일반적인 항등식 @code{x == (x // y) * y + x % y} 를 유지합니다:

@example
>>> -7 // 4
-2
>>> Decimal(-7) // Decimal(4)
Decimal('-1')
@end example

@code{%} 와 @code{//} 연산자는 명세에 설명된 대로 각각 @code{remainder} 와 @code{divide-integer} 연산을 구현합니다.

Decimal 객체는 일반적으로 산술 연산에서 float 나 @ref{213,,fractions.Fraction} 인스턴스와 결합 할 수 없습니다: 예를 들어, @ref{196,,float} 에 a @ref{1fe,,Decimal}을 더하려고 하면 @ref{198,,TypeError} 를 일으킵니다. 그러나, 파이썬의 비교 연산자를 사용하여 @code{Decimal} 인스턴스 @code{x} 와 다른 숫자 @code{y} 를 비교할 수 있습니다. 이렇게 해서 서로 다른 형의 숫자 간에 동등 비교를 할 때 혼란스러운 결과를 피합니다.


버전 3.2에서 변경: @ref{1fe,,Decimal} 인스턴스와 다른 숫자 형 사이의 혼합형 비교가 이제 완전히 지원됩니다.


In addition to the standard numeric properties, decimal floating-point
objects also have a number of specialized methods:

@geindex adjusted() (decimal.Decimal 메서드)
@anchor{library/decimal decimal Decimal adjusted}@anchor{2aec}
@deffn {메서드} adjusted ()

최상위 숫자만 남을 때까지 계수의 가장 오른쪽 숫자들을 밀어내도록 조정된 지수를 반환합니다. @code{Decimal('321e+5').adjusted()} 는 7을 반환합니다. 소수점으로부터의 최상위 유효 숫자의 위치를 결정하는 데 사용됩니다.
@end deffn

@geindex as_integer_ratio() (decimal.Decimal 메서드)
@anchor{library/decimal decimal Decimal as_integer_ratio}@anchor{e91}
@deffn {메서드} as_integer_ratio ()

주어진 @ref{1fe,,Decimal} 인스턴스를, 분모가 양수인 기약 분수로 나타내는 정수의 쌍 @code{(n, d)} 을 돌려줍니다:

@example
>>> Decimal('-3.14').as_integer_ratio()
(-157, 50)
@end example

변환은 정확합니다. 무한대는 OverflowError를, NaN 은 ValueError를 일으킵니다.
@end deffn


Added in version 3.6.


@geindex as_tuple() (decimal.Decimal 메서드)
@anchor{library/decimal decimal Decimal as_tuple}@anchor{2aed}
@deffn {메서드} as_tuple ()

숫자의 @ref{85d,,네임드 튜플} 표현을 반환합니다: @code{DecimalTuple(sign, digits, exponent)}.
@end deffn

@geindex canonical() (decimal.Decimal 메서드)
@anchor{library/decimal decimal Decimal canonical}@anchor{2aee}
@deffn {메서드} canonical ()

인자의 규범적인 인코딩을 돌려줍니다. 현재 @ref{1fe,,Decimal} 인스턴스의 인코딩은 항상 규범적이므로, 이 연산은 인자를 변경하지 않고 반환합니다.
@end deffn

@geindex compare() (decimal.Decimal 메서드)
@anchor{library/decimal decimal Decimal compare}@anchor{2aef}
@deffn {메서드} compare (other, context=None)

두 Decimal 인스턴스의 값을 비교합니다. @ref{2aef,,compare()} 는 Decimal 인스턴스를 반환하고, 피연산자 중 하나가 NaN이면 결과는 NaN입니다:

@example
a or b is a NaN  ==> Decimal('NaN')
a < b            ==> Decimal('-1')
a == b           ==> Decimal('0')
a > b            ==> Decimal('1')
@end example
@end deffn

@geindex compare_signal() (decimal.Decimal 메서드)
@anchor{library/decimal decimal Decimal compare_signal}@anchor{2af0}
@deffn {메서드} compare_signal (other, context=None)

이 연산은, 모든 NaN 이 신호를 준다는 것을 제외하면 @ref{2aef,,compare()} 메서드와 같습니다. 즉, 피연산자가 모두 신호를 주는 NaN이 아니면, 모든 조용한 NaN 피연산자가 마치 신호를 주는 NaN 인 것처럼 처리됩니다.
@end deffn

@geindex compare_total() (decimal.Decimal 메서드)
@anchor{library/decimal decimal Decimal compare_total}@anchor{2af1}
@deffn {메서드} compare_total (other, context=None)

두 개의 피연산자를 숫자 값 대신 추상 표현을 사용하여 비교합니다. @ref{2aef,,compare()} 메서드와 비슷하지만, 결과는 @ref{1fe,,Decimal} 인스턴스에 대해 전 순서(total ordering)를 부여합니다. 같은 숫자 값을 갖지만 다른 표현의 두 @code{Decimal} 인스턴스는 이 순서에 의해 다른 것으로 비교됩니다:

@example
>>> Decimal('12.0').compare_total(Decimal('12'))
Decimal('-1')
@end example

조용한 NaN과 신호를 주는 NaN도 전 순서에 포함됩니다. 이 함수의 결과는, 두 피연산자가 같은 표현을 가질 때 @code{Decimal('0')}, 첫 번째 피연산자가 전 순서에서 두 번째 피연산자보다 낮으면 @code{Decimal('-1')}, 첫 번째 피연산자가 전 순서에서 두 번째 피연산자보다 높으면 @code{Decimal('1')} 입니다. 전 순서에 대한 세부 사항은 명세를 참조하십시오.

이 연산은 컨텍스트의 영향을 받지 않고, 조용합니다: 어떤 플래그도 변경되지 않고, 어떤 자리 올림도 수행되지 않습니다. 예외적으로, 두 번째 피연산자를 정확하게 변환할 수 없으면 C 버전은 InvalidOperation을 발생시킬 수 있습니다.
@end deffn

@geindex compare_total_mag() (decimal.Decimal 메서드)
@anchor{library/decimal decimal Decimal compare_total_mag}@anchor{2af2}
@deffn {메서드} compare_total_mag (other, context=None)

@ref{2af1,,compare_total()}처럼 두 개의 피연산자를 숫자 값 대신 추상 표현을 사용하여 비교하지만, 각 피연산자의 부호를 무시합니다. @code{x.compare_total_mag(y)} 는 @code{x.copy_abs().compare_total(y.copy_abs())} 와 동등합니다.

이 연산은 컨텍스트의 영향을 받지 않고, 조용합니다: 어떤 플래그도 변경되지 않고, 어떤 자리 올림도 수행되지 않습니다. 예외적으로, 두 번째 피연산자를 정확하게 변환할 수 없으면 C 버전은 InvalidOperation을 발생시킬 수 있습니다.
@end deffn

@geindex conjugate() (decimal.Decimal 메서드)
@anchor{library/decimal decimal Decimal conjugate}@anchor{2af3}
@deffn {메서드} conjugate ()

그냥 self를 돌려줍니다. 이 메서드는 Decimal 명세를 준수하기 위한 것뿐입니다.
@end deffn

@geindex copy_abs() (decimal.Decimal 메서드)
@anchor{library/decimal decimal Decimal copy_abs}@anchor{2af4}
@deffn {메서드} copy_abs ()

인자의 절댓값을 반환합니다. 이 연산은 컨텍스트의 영향을 받지 않고, 조용합니다: 어떤 플래그도 변경되지 않고, 어떤 자리 올림도 수행되지 않습니다.
@end deffn

@geindex copy_negate() (decimal.Decimal 메서드)
@anchor{library/decimal decimal Decimal copy_negate}@anchor{2af5}
@deffn {메서드} copy_negate ()

인자의 음의 부정을 돌려줍니다. 이 연산은 컨텍스트의 영향을 받지 않고, 조용합니다: 어떤 플래그도 변경되지 않고, 어떤 자리 올림도 수행되지 않습니다.
@end deffn

@geindex copy_sign() (decimal.Decimal 메서드)
@anchor{library/decimal decimal Decimal copy_sign}@anchor{2af6}
@deffn {메서드} copy_sign (other, context=None)

두 번째 피연산자의 부호와 같은 부호로 설정된 첫 번째 피연산자의 복사본을 반환합니다. 예를 들어:

@example
>>> Decimal('2.3').copy_sign(Decimal('-1.5'))
Decimal('-2.3')
@end example

이 연산은 컨텍스트의 영향을 받지 않고, 조용합니다: 어떤 플래그도 변경되지 않고, 어떤 자리 올림도 수행되지 않습니다. 예외적으로, 두 번째 피연산자를 정확하게 변환할 수 없으면 C 버전은 InvalidOperation을 발생시킬 수 있습니다.
@end deffn

@geindex exp() (decimal.Decimal 메서드)
@anchor{library/decimal decimal Decimal exp}@anchor{12af}
@deffn {메서드} exp (context=None)

주어진 숫자에 대한 (자연) 지수 함수 @code{e**x} 의 값을 반환합니다. 결과는 @ref{2adb,,ROUND_HALF_EVEN} 자리 올림 모드를 사용하여 올바르게 자리 올림 됩니다.

@example
>>> Decimal(1).exp()
Decimal('2.718281828459045235360287471')
>>> Decimal(321).exp()
Decimal('2.561702493119680037517373933E+139')
@end example
@end deffn

@geindex from_float() (decimal.Decimal의 클래스 메서드)
@anchor{library/decimal decimal Decimal from_float}@anchor{1409}
@deffn {메서드} classmethod from_float (f, /)

Alternative constructor that only accepts instances of @ref{196,,float} or
@ref{19b,,int}.

Note @code{Decimal.from_float(0.1)} is not the same as @code{Decimal('0.1')}.
Since 0.1 is not exactly representable in binary floating point, the
value is stored as the nearest representable value which is
@code{0x1.999999999999ap-4}.  That equivalent value in decimal is
@code{0.1000000000000000055511151231257827021181583404541015625}.

@cartouche
@quotation 참고 
파이썬 3.2 이후부터는, @ref{1fe,,Decimal} 인스턴스를 @ref{196,,float}에서 직접 생성할 수 있습니다.
@end quotation
@end cartouche

@example
>>> Decimal.from_float(0.1)
Decimal('0.1000000000000000055511151231257827021181583404541015625')
>>> Decimal.from_float(float('nan'))
Decimal('NaN')
>>> Decimal.from_float(float('inf'))
Decimal('Infinity')
>>> Decimal.from_float(float('-inf'))
Decimal('-Infinity')
@end example


Added in version 3.1.

@end deffn

@geindex from_number() (decimal.Decimal의 클래스 메서드)
@anchor{library/decimal decimal Decimal from_number}@anchor{1fd}
@deffn {메서드} classmethod from_number (number, /)

Alternative constructor that only accepts instances of
@ref{196,,float}, @ref{19b,,int} or @code{Decimal}, but not strings
or tuples.

@example
>>> Decimal.from_number(314)
Decimal('314')
>>> Decimal.from_number(0.1)
Decimal('0.1000000000000000055511151231257827021181583404541015625')
>>> Decimal.from_number(Decimal('3.14'))
Decimal('3.14')
@end example


Added in version 3.14.

@end deffn

@geindex fma() (decimal.Decimal 메서드)
@anchor{library/decimal decimal Decimal fma}@anchor{2af7}
@deffn {메서드} fma (other, third, context=None)

합성된 곱셈-덧셈(fused multiply-add). 중간값 self*other의 자리 올림 없이 self*other+third를 반환합니다.

@example
>>> Decimal(2).fma(3, 5)
Decimal('11')
@end example
@end deffn

@geindex is_canonical() (decimal.Decimal 메서드)
@anchor{library/decimal decimal Decimal is_canonical}@anchor{2af8}
@deffn {메서드} is_canonical ()

인자가 규범적이면 @ref{e06,,True}를 반환하고, 그렇지 않으면 @ref{d2a,,False}를 반환합니다. 현재 @ref{1fe,,Decimal} 인스턴스는 항상 규범적이므로 이 연산은 항상 @code{True}를 반환합니다.
@end deffn

@geindex is_finite() (decimal.Decimal 메서드)
@anchor{library/decimal decimal Decimal is_finite}@anchor{2af9}
@deffn {메서드} is_finite ()

인자가 유한 수이면 @ref{e06,,True}를 반환하고, 인자가 무한대나 NaN 이면 @ref{d2a,,False}를 반환합니다.
@end deffn

@geindex is_infinite() (decimal.Decimal 메서드)
@anchor{library/decimal decimal Decimal is_infinite}@anchor{2afa}
@deffn {메서드} is_infinite ()

인자가 양이나 음의 무한대면 @ref{e06,,True}를 반환하고, 그렇지 않으면 @ref{d2a,,False}를 반환합니다.
@end deffn

@geindex is_nan() (decimal.Decimal 메서드)
@anchor{library/decimal decimal Decimal is_nan}@anchor{2afb}
@deffn {메서드} is_nan ()

인자가 (조용한 또는 신호를 주는) NaN이면 @ref{e06,,True}를 반환하고, 그렇지 않으면 @ref{d2a,,False}를 반환합니다.
@end deffn

@geindex is_normal() (decimal.Decimal 메서드)
@anchor{library/decimal decimal Decimal is_normal}@anchor{2afc}
@deffn {메서드} is_normal (context=None)

인자가 `정상(normal)' 유한 수이면 @ref{e06,,True}를 반환합니다. 인자가 0, 비정상(subnormal), 무한대 또는 NaN 이면 @ref{d2a,,False}를 반환합니다.
@end deffn

@geindex is_qnan() (decimal.Decimal 메서드)
@anchor{library/decimal decimal Decimal is_qnan}@anchor{2afd}
@deffn {메서드} is_qnan ()

인자가 조용한 NaN이면 @ref{e06,,True}를 반환하고, 그렇지 않으면 @ref{d2a,,False}를 반환합니다.
@end deffn

@geindex is_signed() (decimal.Decimal 메서드)
@anchor{library/decimal decimal Decimal is_signed}@anchor{2afe}
@deffn {메서드} is_signed ()

인자가 음의 부호를 가지면 @ref{e06,,True}를 반환하고, 그렇지 않으면 @ref{d2a,,False}를 반환합니다. 0과 NaN 모두 부호를 가질 수 있다는 것에 유의하세요.
@end deffn

@geindex is_snan() (decimal.Decimal 메서드)
@anchor{library/decimal decimal Decimal is_snan}@anchor{2aff}
@deffn {메서드} is_snan ()

인자가 신호를 주는 NaN이면 @ref{e06,,True}를 반환하고, 그렇지 않으면 @ref{d2a,,False}를 반환합니다.
@end deffn

@geindex is_subnormal() (decimal.Decimal 메서드)
@anchor{library/decimal decimal Decimal is_subnormal}@anchor{2b00}
@deffn {메서드} is_subnormal (context=None)

인자가 비정상(subnormal)이면 @ref{e06,,True}를 반환하고, 그렇지 않으면 @ref{d2a,,False}를 반환합니다.
@end deffn

@geindex is_zero() (decimal.Decimal 메서드)
@anchor{library/decimal decimal Decimal is_zero}@anchor{2b01}
@deffn {메서드} is_zero ()

인자가 (양 또는 음의) 0이면 @ref{e06,,True}를 반환하고, 그렇지 않으면 @ref{d2a,,False}를 반환합니다.
@end deffn

@geindex ln() (decimal.Decimal 메서드)
@anchor{library/decimal decimal Decimal ln}@anchor{12b0}
@deffn {메서드} ln (context=None)

피연산자의 자연로그(밑 e)를 반환합니다. 결과는 @ref{2adb,,ROUND_HALF_EVEN} 자리 올림 모드를 사용하여 올바르게 반올림됩니다.
@end deffn

@geindex log10() (decimal.Decimal 메서드)
@anchor{library/decimal decimal Decimal log10}@anchor{2b02}
@deffn {메서드} log10 (context=None)

피연산자의 상용로그를 반환합니다. 결과는 @ref{2adb,,ROUND_HALF_EVEN} 자리 올림 모드를 사용하여 올바르게 반올림됩니다.
@end deffn

@geindex logb() (decimal.Decimal 메서드)
@anchor{library/decimal decimal Decimal logb}@anchor{2b03}
@deffn {메서드} logb (context=None)

0이 아닌 수의 경우, 피연산자의 조정된 지수를 @ref{1fe,,Decimal} 인스턴스로 반환합니다. 피연산자가 0이면 @code{Decimal('-Infinity')} 가 반환되고 @ref{2ae0,,DivisionByZero} 플래그가 발생합니다. 피연산자가 무한대면 @code{Decimal('Infinity')} 가 반환됩니다.
@end deffn

@geindex logical_and() (decimal.Decimal 메서드)
@anchor{library/decimal decimal Decimal logical_and}@anchor{2b04}
@deffn {메서드} logical_and (other, context=None)

@ref{2b04,,logical_and()} 는 두 개의 `논리적 피연산자'(@ref{2b05,,논리적 피연산자}를 보세요)를 취하는 논리적 연산입니다. 결과는 두 피연산자의 자릿수별 @code{and} 입니다.
@end deffn

@geindex logical_invert() (decimal.Decimal 메서드)
@anchor{library/decimal decimal Decimal logical_invert}@anchor{2b06}
@deffn {메서드} logical_invert (context=None)

@ref{2b06,,logical_invert()} 는 논리적 연산입니다. 결과는 피연산자의 자릿수별 반전입니다.
@end deffn

@geindex logical_or() (decimal.Decimal 메서드)
@anchor{library/decimal decimal Decimal logical_or}@anchor{2b07}
@deffn {메서드} logical_or (other, context=None)

@ref{2b07,,logical_or()} 는 두 개의 `논리적 피연산자'(@ref{2b05,,논리적 피연산자}를 보세요)를 취하는 논리적 연산입니다. 결과는 두 피연산자의 자릿수별 @code{or} 입니다.
@end deffn

@geindex logical_xor() (decimal.Decimal 메서드)
@anchor{library/decimal decimal Decimal logical_xor}@anchor{2b08}
@deffn {메서드} logical_xor (other, context=None)

@ref{2b08,,logical_xor()}은 두 개의 `논리적 피연산자'(@ref{2b05,,논리적 피연산자}를 보세요)를 취하는 논리적 연산입니다. 결과는 두 피연산자의 자릿수별 배타적 or입니다.
@end deffn

@geindex max() (decimal.Decimal 메서드)
@anchor{library/decimal decimal Decimal max}@anchor{2b09}
@deffn {메서드} max (other, context=None)

Like @code{max(self, other)} except that the context rounding rule is applied
before returning and that @code{NaN} values are either signaled or
ignored (depending on the context and whether they are signaling or
quiet).
@end deffn

@geindex max_mag() (decimal.Decimal 메서드)
@anchor{library/decimal decimal Decimal max_mag}@anchor{2b0a}
@deffn {메서드} max_mag (other, context=None)

@ref{2b09,,max()}와 비슷하지만, 피연산자의 절댓값을 사용하여 비교가 이루어집니다.
@end deffn

@geindex min() (decimal.Decimal 메서드)
@anchor{library/decimal decimal Decimal min}@anchor{2b0b}
@deffn {메서드} min (other, context=None)

Like @code{min(self, other)} except that the context rounding rule is applied
before returning and that @code{NaN} values are either signaled or
ignored (depending on the context and whether they are signaling or
quiet).
@end deffn

@geindex min_mag() (decimal.Decimal 메서드)
@anchor{library/decimal decimal Decimal min_mag}@anchor{2b0c}
@deffn {메서드} min_mag (other, context=None)

@ref{2b0b,,min()}과 비슷하지만, 피연산자의 절댓값을 사용하여 비교가 이루어집니다.
@end deffn

@geindex next_minus() (decimal.Decimal 메서드)
@anchor{library/decimal decimal Decimal next_minus}@anchor{2b0d}
@deffn {메서드} next_minus (context=None)

주어진 피연산자보다 작고, 주어진 컨텍스트(또는 context가 주어지지 않으면 현재 스레드의 컨텍스트)에서 표현 가능한 가장 큰 수를 돌려줍니다.
@end deffn

@geindex next_plus() (decimal.Decimal 메서드)
@anchor{library/decimal decimal Decimal next_plus}@anchor{2b0e}
@deffn {메서드} next_plus (context=None)

주어진 피연산자보다 크고, 주어진 컨텍스트(또는 context가 주어지지 않으면 현재 스레드의 컨텍스트)에서 표현 가능한 가장 작은 수를 돌려줍니다.
@end deffn

@geindex next_toward() (decimal.Decimal 메서드)
@anchor{library/decimal decimal Decimal next_toward}@anchor{2b0f}
@deffn {메서드} next_toward (other, context=None)

두 피연산자가 같지 않으면, 두 번째 피연산자의 방향으로 첫 번째 피연산자에 가장 가까운 숫자를 반환합니다. 두 피연산자가 수치로 같으면, 첫 번째 피연산자의 복사본을 반환하는데, 부호를 두 번째 피연산자의 것으로 설정합니다.
@end deffn

@geindex normalize() (decimal.Decimal 메서드)
@anchor{library/decimal decimal Decimal normalize}@anchor{2b10}
@deffn {메서드} normalize (context=None)

Used for producing canonical values of an equivalence
class within either the current context or the specified context.

This has the same semantics as the unary plus operation, except that if
the final result is finite it is reduced to its simplest form, with all
trailing zeros removed and its sign preserved. That is, while the
coefficient is non-zero and a multiple of ten the coefficient is divided
by ten and the exponent is incremented by 1. Otherwise (the coefficient is
zero) the exponent is set to 0. In all cases the sign is unchanged.

For example, @code{Decimal('32.100')} and @code{Decimal('0.321000e+2')} both
normalize to the equivalent value @code{Decimal('32.1')}.

Note that rounding is applied `before' reducing to simplest form.

In the latest versions of the specification, this operation is also known
as @code{reduce}.
@end deffn

@geindex number_class() (decimal.Decimal 메서드)
@anchor{library/decimal decimal Decimal number_class}@anchor{2b11}
@deffn {메서드} number_class (context=None)

피연산자의 `클래스' 를 설명하는 문자열을 반환합니다. 반환 값은 다음 10개의 문자열 중 하나입니다.


@itemize *

@item 
@code{"-Infinity"}, 피연산자가 음의 무한대임을 나타냅니다.

@item 
@code{"-Normal"}, 피연산자가 음의 정상 수임을 나타냅니다.

@item 
@code{"-Subnormal"}, 피연산자가 음의 비정상 수임을 나타냅니다.

@item 
@code{"-Zero"}, 피연산자가 음의 0임을 나타냅니다.

@item 
@code{"+Zero"}, 피연산자가 양의 0임을 나타냅니다.

@item 
@code{"+Subnormal"}, 피연산자가 양의 비정상 수임을 나타냅니다.

@item 
@code{"+Normal"}, 피연산자가 양의 정상 수임을 나타냅니다.

@item 
@code{"+Infinity"}, 피연산자가 양의 무한대임을 나타냅니다.

@item 
@code{"NaN"}, 피연산자가 조용한 NaN(Not a Number)임을 나타냅니다.

@item 
@code{"sNaN"}, 피연산자가 신호를 주는 NaN임을 나타냅니다.
@end itemize
@end deffn

@geindex quantize() (decimal.Decimal 메서드)
@anchor{library/decimal decimal Decimal quantize}@anchor{12b5}
@deffn {메서드} quantize (exp, rounding=None, context=None)

자리 올림 후에 첫 번째 피연산자와 같고 두 번째 피연산자의 지수를 갖는 값을 반환합니다.

@example
>>> Decimal('1.41421356').quantize(Decimal('1.000'))
Decimal('1.414')
@end example

다른 연산과 달리, quantize 연산 후의 계수의 길이가 정밀도보다 크면, @ref{12ad,,InvalidOperation} 신호를 줍니다. 이는, 에러 조건이 없으면, quantize 된 지수가 항상 오른쪽 피연산자의 지수와 같음을 보장합니다.

또한, 다른 연산과는 달리, 결과가 비정상(subnormal)이고 부정확한 경우조차도, quantize는 결코 Underflow 신호를 보내지 않습니다.

두 번째 피연산자의 지수가 첫 번째 피연산자의 지수보다 크면 자리 올림이 필요할 수 있습니다. 이 경우, 자리 올림 모드는 (주어지면) @code{rounding} 인자에 의해 결정됩니다. 그렇지 않으면 주어진 @code{context} 인자에 의해 결정됩니다; 두 인자 모두 주어지지 않으면, 현재 스레드의 컨텍스트의 자리 올림 모드가 사용됩니다.

An error is returned whenever the resulting exponent is greater than
@ref{12ab,,Emax} or less than @ref{2b12,,Etiny()}.
@end deffn

@geindex radix() (decimal.Decimal 메서드)
@anchor{library/decimal decimal Decimal radix}@anchor{2b13}
@deffn {메서드} radix ()

@ref{1fe,,Decimal} 클래스가 모든 산술을 수행하는 진수(기수)인 @code{Decimal(10)} 을 반환합니다. 명세와의 호환성을 위해 포함됩니다.
@end deffn

@geindex remainder_near() (decimal.Decimal 메서드)
@anchor{library/decimal decimal Decimal remainder_near}@anchor{2b14}
@deffn {메서드} remainder_near (other, context=None)

`self' 를 `other' 로 나눈 나머지를 반환합니다. 이것은 나머지의 절댓값을 최소화하기 위해 나머지의 부호가 선택된다는 점에서 @code{self % other} 와 다릅니다. 좀 더 정확히 말하면, 반환 값은 @code{self - n * other} 인데, 여기서 @code{n} 은 @code{self / other} 의 정확한 값에 가장 가까운 정수이고, 두 개의 정수와의 거리가 같으면 짝수가 선택됩니다.

결과가 0이면 그 부호는 `self' 의 부호가 됩니다.

@example
>>> Decimal(18).remainder_near(Decimal(10))
Decimal('-2')
>>> Decimal(25).remainder_near(Decimal(10))
Decimal('5')
>>> Decimal(35).remainder_near(Decimal(10))
Decimal('-5')
@end example
@end deffn

@geindex rotate() (decimal.Decimal 메서드)
@anchor{library/decimal decimal Decimal rotate}@anchor{2b15}
@deffn {메서드} rotate (other, context=None)

첫 번째 피연산자의 계수를 두 번째 피연산자로 지정된 양만큼 회전한 결과를 반환합니다. 두 번째 피연산자는 -precision에서 precision 범위의 정수여야 합니다. 두 번째 피연산자의 절댓값은 회전할 자리의 수를 나타냅니다. 두 번째 피연산자가 양수면 왼쪽으로 회전합니다; 그렇지 않으면 오른쪽으로 회전합니다. 필요하면 정밀도에 맞추기 위해 첫 번째 피연산자의 계수에 0이 왼쪽에 채워집니다. 첫 번째 피연산자의 부호와 지수는 변경되지 않습니다.
@end deffn

@geindex same_quantum() (decimal.Decimal 메서드)
@anchor{library/decimal decimal Decimal same_quantum}@anchor{2b16}
@deffn {메서드} same_quantum (other, context=None)

Test whether self and other have the same exponent or whether both are
@code{NaN}.

이 연산은 컨텍스트의 영향을 받지 않고, 조용합니다: 어떤 플래그도 변경되지 않고, 어떤 자리 올림도 수행되지 않습니다. 예외적으로, 두 번째 피연산자를 정확하게 변환할 수 없으면 C 버전은 InvalidOperation을 발생시킬 수 있습니다.
@end deffn

@geindex scaleb() (decimal.Decimal 메서드)
@anchor{library/decimal decimal Decimal scaleb}@anchor{2b17}
@deffn {메서드} scaleb (other, context=None)

첫 번째 피연산자의 지수를 두 번째 피연산자만큼 조정한 값을 반환합니다. 달리 표현하면, 첫 번째 피연산자에 @code{10**other} 를 곱한 값을 반환합니다. 두 번째 피연산자는 정수여야 합니다.
@end deffn

@geindex shift() (decimal.Decimal 메서드)
@anchor{library/decimal decimal Decimal shift}@anchor{2b18}
@deffn {메서드} shift (other, context=None)

첫 번째 피연산자의 계수를 두 번째 피연산자로 지정된 양만큼 이동한 결과를 반환합니다. 두 번째 피연산자는 -precision에서 precision 범위의 정수여야 합니다. 두 번째 피연산자의 절댓값은 이동할 자리의 수를 나타냅니다. 두 번째 피연산자가 양수면 왼쪽으로 이동합니다; 그렇지 않으면 오른쪽으로 이동합니다. 이동으로 인해 계수에 들어오는 숫자는 0입니다. 첫 번째 피연산자의 부호와 지수는 변경되지 않습니다.
@end deffn

@geindex sqrt() (decimal.Decimal 메서드)
@anchor{library/decimal decimal Decimal sqrt}@anchor{2b19}
@deffn {메서드} sqrt (context=None)

인자의 제곱근을 완전한 정밀도로 반환합니다.
@end deffn

@geindex to_eng_string() (decimal.Decimal 메서드)
@anchor{library/decimal decimal Decimal to_eng_string}@anchor{2b1a}
@deffn {메서드} to_eng_string (context=None)

문자열로 변환합니다. 지수가 필요하면 공학 표기법을 사용합니다.

공학 표기법의 지수는 3의 배수입니다. 이렇게 하면 소수점 왼쪽에 최대 3자리를 남기게 되고, 하나나 두 개의 후행 0을 추가해야 할 수 있습니다.

예를 들어, 이 메서드는 @code{Decimal('123E+1')} 을 @code{Decimal('1.23E+3')} 으로 변환합니다.
@end deffn

@geindex to_integral() (decimal.Decimal 메서드)
@anchor{library/decimal decimal Decimal to_integral}@anchor{2b1b}
@deffn {메서드} to_integral (rounding=None, context=None)

@ref{2b1c,,to_integral_value()} 메서드와 같습니다. @code{to_integral} 이름은 이전 버전과의 호환성을 위해 유지되었습니다.
@end deffn

@geindex to_integral_exact() (decimal.Decimal 메서드)
@anchor{library/decimal decimal Decimal to_integral_exact}@anchor{2b1d}
@deffn {메서드} to_integral_exact (rounding=None, context=None)

@ref{2ae1,,Inexact} 나 @ref{2ae2,,Rounded} 신호를 주면서 가장 가까운 정수로 자리 올림 합니다. 자리 올림 모드는 (주어지면) @code{rounding} 매개 변수에 의해, 그렇지 않으면 그렇지 않으면 @code{context} 에 의해 결정됩니다. 두 매개 변수 모두 지정되지 않으면, 현재 컨텍스트의 자리 올림 모드가 사용됩니다.
@end deffn

@geindex to_integral_value() (decimal.Decimal 메서드)
@anchor{library/decimal decimal Decimal to_integral_value}@anchor{2b1c}
@deffn {메서드} to_integral_value (rounding=None, context=None)

@ref{2ae1,,Inexact} 나 @ref{2ae2,,Rounded} 신호를 주지 않고 가장 가까운 정수로 자리 올림 합니다. 주어지면, `rounding' 을 적용합니다; 그렇지 않으면, 제공된 `context' 나 현재 컨텍스트의 자리 올림 방법을 사용합니다.
@end deffn

Decimal numbers can be rounded using the @ref{14df,,round()} function:


@deffn {Describe} round(number)
@end deffn


@deffn {Describe} round(number, ndigits)

If `ndigits' is not given or @code{None},
returns the nearest @ref{19b,,int} to `number',
rounding ties to even, and ignoring the rounding mode of the
@code{Decimal} context.  Raises @ref{a81,,OverflowError} if `number' is an
infinity or @ref{2ec,,ValueError} if it is a (quiet or signaling) NaN.

If `ndigits' is an @ref{19b,,int}, the context’s rounding mode is respected
and a @code{Decimal} representing `number' rounded to the nearest
multiple of @code{Decimal('1E-ndigits')} is returned; in this case,
@code{round(number, ndigits)} is equivalent to
@code{self.quantize(Decimal('1E-ndigits'))}.  Returns @code{Decimal('NaN')} if
`number' is a quiet NaN.  Raises @ref{12ad,,InvalidOperation} if `number'
is an infinity, a signaling NaN, or if the length of the coefficient after
the quantize operation would be greater than the current context’s
precision.  In other words, for the non-corner cases:


@itemize *

@item 
if `ndigits' is positive, return `number' rounded to `ndigits' decimal
places;

@item 
if `ndigits' is zero, return `number' rounded to the nearest integer;

@item 
if `ndigits' is negative, return `number' rounded to the nearest
multiple of @code{10**abs(ndigits)}.
@end itemize

For example:

@example
>>> from decimal import Decimal, getcontext, ROUND_DOWN
>>> getcontext().rounding = ROUND_DOWN
>>> round(Decimal('3.75'))     # context rounding ignored
4
>>> round(Decimal('3.5'))      # round-ties-to-even
4
>>> round(Decimal('3.75'), 0)  # uses the context rounding
Decimal('3')
>>> round(Decimal('3.75'), 1)
Decimal('3.7')
>>> round(Decimal('3.75'), -1)
Decimal('0E+1')
@end example
@end deffn
@end deffn

@menu
* 논리적 피연산자:: 

@end menu

@node 논리적 피연산자,,,Decimal 객체
@anchor{library/decimal logical-operands}@anchor{2b1e}@anchor{library/decimal logical-operands-label}@anchor{2b05}
@subsubsection 논리적 피연산자


The @ref{2b04,,logical_and()}, @ref{2b06,,logical_invert()}, @ref{2b07,,logical_or()},
and @ref{2b08,,logical_xor()} methods expect their arguments to be `logical
operands'.  A `logical operand' is a @ref{1fe,,Decimal} instance whose
exponent and sign are both zero, and whose digits are all either
@code{0} or @code{1}.

@c %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

@node Context 객체,상수<4>,Decimal 객체,decimal — Decimal fixed-point and floating-point arithmetic
@anchor{library/decimal context-objects}@anchor{2b1f}@anchor{library/decimal decimal-context}@anchor{276b}
@subsubsection Context 객체


컨텍스트는 산술 연산을 위한 환경입니다. 정밀도를 제어하고, 자리 올림 규칙을 설정하며, 어떤 신호가 예외로 처리되는지 결정하고, 지수의 범위를 제한합니다.

각 스레드는 자신만의 현재 컨텍스트를 가지는데, @ref{1938,,getcontext()} 와 @ref{2ae8,,setcontext()} 함수를 사용하여 액세스하거나 변경합니다:

@geindex getcontext() (decimal 모듈)
@anchor{library/decimal decimal getcontext}@anchor{1938}
@deffn {함수} decimal.getcontext ()

활성 스레드의 현재 컨텍스트를 돌려줍니다.
@end deffn

@geindex setcontext() (decimal 모듈)
@anchor{library/decimal decimal setcontext}@anchor{2ae8}
@deffn {함수} decimal.setcontext (c, /)

활성 스레드의 현재 컨텍스트를 `c' 로 설정합니다.
@end deffn

또한 @ref{186,,with} 문과 @ref{158b,,localcontext()} 함수를 사용하여 활성 컨텍스트를 일시적으로 변경할 수 있습니다.

@geindex localcontext() (decimal 모듈)
@anchor{library/decimal decimal localcontext}@anchor{158b}
@deffn {함수} decimal.localcontext (ctx=None, **kwargs)

Return a context manager that will set the current context for the active thread
to a copy of `ctx' on entry to the with-statement and restore the previous context
when exiting the with-statement. If no context is specified, a copy of the
current context is used.  The `kwargs' argument is used to set the attributes
of the new context.

예를 들어, 다음 코드는 현재 십진 정밀도를 42자리로 설정하고, 계산을 수행한 다음, 이전 컨텍스트를 자동으로 복원합니다:

@example
from decimal import localcontext

with localcontext() as ctx:
    ctx.prec = 42   # Perform a high precision calculation
    s = calculate_something()
s = +s  # Round the final result back to the default precision
@end example

Using keyword arguments, the code would be the following:

@example
from decimal import localcontext

with localcontext(prec=42) as ctx:
    s = calculate_something()
s = +s
@end example

Raises @ref{198,,TypeError} if `kwargs' supplies an attribute that @ref{12b4,,Context} doesn’t
support.  Raises either @code{TypeError} or @ref{2ec,,ValueError} if `kwargs' supplies an
invalid value for an attribute.


버전 3.11에서 변경: @ref{158b,,localcontext()} now supports setting context attributes through the use of keyword arguments.

@end deffn

@geindex IEEEContext() (decimal 모듈)
@anchor{library/decimal decimal IEEEContext}@anchor{1ff}
@deffn {함수} decimal.IEEEContext (bits)

Return a context object initialized to the proper values for one of the
IEEE interchange formats.  The argument must be a multiple of 32 and less
than @ref{2b20,,IEEE_CONTEXT_MAX_BITS}.


Added in version 3.14.

@end deffn

아래에 설명된 @ref{12b4,,Context} 생성자를 사용하여 새로운 컨텍스트를 만들 수도 있습니다. 또한, 이 모듈은 세 가지 미리 만들어진 컨텍스트를 제공합니다:

@geindex BasicContext (decimal 모듈)
@anchor{library/decimal decimal BasicContext}@anchor{12a9}
@deffn {데이터} decimal.BasicContext

이것은 일반 십진 산술 명세에서 정의된 표준 컨텍스트입니다. 정밀도는 9로 설정됩니다. 자리 올림은 @ref{2adc,,ROUND_HALF_UP}으로 설정됩니다. 모든 플래그가 지워집니다. 모든 트랩은 @ref{2ae1,,Inexact}, @ref{2ae2,,Rounded}, @ref{2ae3,,Subnormal}을 제외하고는 활성화됩니다 (예외로 처리됩니다).

많은 트랩이 활성화되었으므로, 이 컨텍스트는 디버깅에 유용합니다.
@end deffn

@geindex ExtendedContext (decimal 모듈)
@anchor{library/decimal decimal ExtendedContext}@anchor{12aa}
@deffn {데이터} decimal.ExtendedContext

이것은 일반 십진 산술 명세에서 정의된 표준 컨텍스트입니다. 정밀도는 9로 설정됩니다. 자리 올림은 @ref{2adb,,ROUND_HALF_EVEN}으로 설정됩니다. 모든 플래그가 지워집니다. 아무 트랩도 활성화되지 않습니다 (그래서 계산 중에 예외가 발생하지 않습니다).

Because the traps are disabled, this context is useful for applications that
prefer to have result value of @code{NaN} or @code{Infinity} instead of
raising exceptions.  This allows an application to complete a run in the
presence of conditions that would otherwise halt the program.
@end deffn

@geindex DefaultContext (decimal 모듈)
@anchor{library/decimal decimal DefaultContext}@anchor{12a8}
@deffn {데이터} decimal.DefaultContext

이 컨텍스트는 새로운 컨텍스트의 프로토타입으로 @ref{12b4,,Context} 생성자에 의해 사용됩니다. 필드(가령 정밀도)를 변경하면 @code{Context} 생성자에 의해 생성된 새로운 컨텍스트에 대한 기본값을 변경하는 효과가 있습니다.

이 컨텍스트는 다중 스레드 환경에서 가장 유용합니다. 스레드가 시작되기 전에 필드 중 하나를 변경하면 시스템 전체의 기본값을 설정하는 효과가 있습니다. 스레드가 시작된 후에 필드를 변경하는 것은. 스레드 동기화를 통해 경쟁 조건을 방지해야 하므로 권장되지 않습니다.

단일 스레드 환경에서는, 이 컨텍스트를 아예 사용하지 않는 것이 좋습니다. 대신, 아래에 설명된 대로 명시적으로 컨텍스트를 만드십시오.

The default values are @ref{2b21,,Context.prec}=@code{28},
@ref{2b22,,Context.rounding}=@ref{2adb,,ROUND_HALF_EVEN},
and enabled traps for @ref{2ae4,,Overflow}, @ref{12ad,,InvalidOperation}, and
@ref{2ae0,,DivisionByZero}.
@end deffn

3개의 제공된 컨텍스트 외에도, 새로운 컨텍스트를 @ref{12b4,,Context} 생성자를 사용하여 만들 수 있습니다.

@geindex Context (decimal 클래스)
@anchor{library/decimal decimal Context}@anchor{12b4}
@deffn {클래스} decimal.Context (prec=None, rounding=None, Emin=None, Emax=None, capitals=None, clamp=None, flags=None, traps=None)

새로운 컨텍스트를 만듭니다. 필드가 지정되지 않았거나 @ref{884,,None} 이면, 기본값은 @ref{12a8,,DefaultContext} 에서 복사됩니다. `flags' 필드가 지정되지 않았거나 @code{None} 이면, 모든 플래그가 지워집니다.

@geindex prec (decimal.Context의 속성)
@anchor{library/decimal decimal Context prec}@anchor{2b21}
@deffn {속성} prec

An integer in the range [@code{1}, @ref{12a5,,MAX_PREC}] that sets
the precision for arithmetic operations in the context.
@end deffn

@geindex rounding (decimal.Context의 속성)
@anchor{library/decimal decimal Context rounding}@anchor{2b22}
@deffn {속성} rounding

One of the constants listed in the section @ref{2b23,,Rounding Modes}.
@end deffn

@geindex traps (decimal.Context의 속성)
@geindex flags (decimal.Context의 속성)
@anchor{library/decimal decimal Context traps}@anchor{12b3}
@deffn {속성} traps
@anchor{library/decimal decimal Context flags}@anchor{12b2}
@deffnx {속성} flags

Lists of any signals to be set. Generally, new contexts should only set
traps and leave the flags clear.
@end deffn

@geindex Emin (decimal.Context의 속성)
@geindex Emax (decimal.Context의 속성)
@anchor{library/decimal decimal Context Emin}@anchor{12ac}
@deffn {속성} Emin
@anchor{library/decimal decimal Context Emax}@anchor{12ab}
@deffnx {속성} Emax

Integers specifying the outer limits allowable for exponents. `Emin' must
be in the range [@ref{12a7,,MIN_EMIN}, @code{0}], `Emax' in the range
[@code{0}, @ref{12a6,,MAX_EMAX}].
@end deffn

@geindex capitals (decimal.Context의 속성)
@anchor{library/decimal decimal Context capitals}@anchor{2b24}
@deffn {속성} capitals

Either @code{0} or @code{1} (the default). If set to
@code{1}, exponents are printed with a capital @code{E}; otherwise, a
lowercase @code{e} is used: @code{Decimal('6.02e+23')}.
@end deffn

@geindex clamp (decimal.Context의 속성)
@anchor{library/decimal decimal Context clamp}@anchor{13a3}
@deffn {속성} clamp

Either @code{0} (the default) or @code{1}.  If set to @code{1}, the exponent @code{e}
of a @ref{1fe,,Decimal} instance representable in this context is strictly
limited to the range @code{Emin - prec + 1 <= e <= Emax - prec + 1}.
If `clamp' is @code{0} then a weaker condition holds: the adjusted exponent of
the @code{Decimal} instance is at most @ref{12ab,,Emax}.  When `clamp' is
@code{1}, a large normal number will, where possible, have its
exponent reduced and a corresponding number of zeros added to its
coefficient, in order to fit the exponent constraints; this
preserves the value of the number but loses information about
significant trailing zeros.  For example:

@example
>>> Context(prec=6, Emax=999, clamp=1).create_decimal('1.23e999')
Decimal('1.23000E+999')
@end example

A `clamp' value of @code{1} allows compatibility with the
fixed-width decimal interchange formats specified in IEEE 754.
@end deffn

The @code{Context} class defines several general purpose methods as well as
a large number of methods for doing arithmetic directly in a given context.
In addition, for each of the @ref{1fe,,Decimal} methods described above (with
the exception of the @ref{2aec,,adjusted()} and @ref{2aed,,as_tuple()} methods) there is
a corresponding @code{Context} method.  For example, for a @code{Context}
instance @code{C} and @code{Decimal} instance @code{x}, @code{C.exp(x)} is
equivalent to @code{x.exp(context=C)}.  Each @code{Context} method accepts a
Python integer (an instance of @ref{19b,,int}) anywhere that a
Decimal instance is accepted.

@geindex clear_flags() (decimal.Context 메서드)
@anchor{library/decimal decimal Context clear_flags}@anchor{2ae9}
@deffn {메서드} clear_flags ()

Resets all of the flags to @code{0}.
@end deffn

@geindex clear_traps() (decimal.Context 메서드)
@anchor{library/decimal decimal Context clear_traps}@anchor{2b25}
@deffn {메서드} clear_traps ()

Resets all of the traps to @code{0}.


Added in version 3.3.

@end deffn

@geindex copy() (decimal.Context 메서드)
@anchor{library/decimal decimal Context copy}@anchor{2b26}
@deffn {메서드} copy ()

컨텍스트의 복사본을 돌려줍니다.
@end deffn

@geindex copy_decimal() (decimal.Context 메서드)
@anchor{library/decimal decimal Context copy_decimal}@anchor{2b27}
@deffn {메서드} copy_decimal (num, /)

Decimal 인스턴스 num의 복사본을 반환합니다.
@end deffn

@geindex create_decimal() (decimal.Context 메서드)
@anchor{library/decimal decimal Context create_decimal}@anchor{12ae}
@deffn {메서드} create_decimal (num='0', /)

`self' 를 컨텍스트로 사용해서, `num' 으로 새 Decimal 인스턴스를 만듭니다. @ref{1fe,,Decimal} 생성자와 달리, 컨텍스트 정밀도, 자리 올림 방법, 플래그 및 트랩이 변환에 적용됩니다.

이는 상수가 보통 응용 프로그램에 필요한 것보다 더 큰 정밀도로 제공되기 때문에 유용합니다. 또 다른 이점은 자리 올림이 현재 정밀도를 초과하는 자릿수로 인한 의도하지 않은 결과를 즉시 제거한다는 것입니다. 다음 예제에서, 자리 올림 되지 않은 입력을 사용한다는 것은 합계에 0을 추가하면 결과가 달라질 수 있음을 의미합니다.:

@example
>>> getcontext().prec = 3
>>> Decimal('3.4445') + Decimal('1.0023')
Decimal('4.45')
>>> Decimal('3.4445') + Decimal(0) + Decimal('1.0023')
Decimal('4.44')
@end example

이 메서드는 IBM 명세의 to-number 연산을 구현합니다. 인자가 문자열이면, 선행 또는 후행 공백이나 밑줄이 허용되지 않습니다.
@end deffn

@geindex create_decimal_from_float() (decimal.Context 메서드)
@anchor{library/decimal decimal Context create_decimal_from_float}@anchor{2b28}
@deffn {메서드} create_decimal_from_float (f, /)

float `f' 로 새 Decimal 인스턴스를 만들지만, `self' 를 컨텍스트로 사용하여 자리 올림 합니다. @ref{1409,,Decimal.from_float()} 클래스 메서드와는 달리, 컨텍스트 정밀도, 자리 올림 방법, 플래그 및 트랩이 변환에 적용됩니다.

@example
>>> context = Context(prec=5, rounding=ROUND_DOWN)
>>> context.create_decimal_from_float(math.pi)
Decimal('3.1415')
>>> context = Context(prec=5, traps=[Inexact])
>>> context.create_decimal_from_float(math.pi)
Traceback (most recent call last):
    ...
decimal.Inexact: None
@end example


Added in version 3.1.

@end deffn

@geindex Etiny() (decimal.Context 메서드)
@anchor{library/decimal decimal Context Etiny}@anchor{2b12}
@deffn {메서드} Etiny ()

비정상 결과에 대한 최소 지수 값인 @code{Emin - prec + 1} 과 같은 값을 반환합니다. 언더 플로우가 발생하면, 지수는 @ref{2b12,,Etiny} 로 설정됩니다.
@end deffn

@geindex Etop() (decimal.Context 메서드)
@anchor{library/decimal decimal Context Etop}@anchor{2b29}
@deffn {메서드} Etop ()

@code{Emax - prec + 1} 과 같은 값을 반환합니다.
@end deffn

십진수로 작업하는 일반적인 접근법은 @ref{1fe,,Decimal} 인스턴스를 생성한 다음 활성 스레드의 현재 컨텍스트 내에서 진행되는 산술 연산을 적용하는 것입니다. 다른 방법은 특정 컨텍스트 내에서 계산하기 위해 컨텍스트 메서드를 사용하는 것입니다. 메서드는 @code{Decimal} 클래스의 메서드와 비슷하며 여기에서는 간단히 설명합니다.

@geindex abs() (decimal.Context 메서드)
@anchor{library/decimal decimal Context abs}@anchor{2b2a}
@deffn {메서드} abs (x, /)

`x' 의 절댓값을 돌려줍니다.
@end deffn

@geindex add() (decimal.Context 메서드)
@anchor{library/decimal decimal Context add}@anchor{2b2b}
@deffn {메서드} add (x, y, /)

`x' 와 `y' 의 합을 돌려줍니다.
@end deffn

@geindex canonical() (decimal.Context 메서드)
@anchor{library/decimal decimal Context canonical}@anchor{150b}
@deffn {메서드} canonical (x, /)

같은 Decimal 객체 `x' 를 반환합니다.
@end deffn

@geindex compare() (decimal.Context 메서드)
@anchor{library/decimal decimal Context compare}@anchor{2b2c}
@deffn {메서드} compare (x, y, /)

`x' 와 `y' 를 수치로 비교합니다.
@end deffn

@geindex compare_signal() (decimal.Context 메서드)
@anchor{library/decimal decimal Context compare_signal}@anchor{2b2d}
@deffn {메서드} compare_signal (x, y, /)

두 피연산자의 값을 수치로 비교합니다.
@end deffn

@geindex compare_total() (decimal.Context 메서드)
@anchor{library/decimal decimal Context compare_total}@anchor{2b2e}
@deffn {메서드} compare_total (x, y, /)

추상 표현을 사용하여 두 피연산자를 비교합니다.
@end deffn

@geindex compare_total_mag() (decimal.Context 메서드)
@anchor{library/decimal decimal Context compare_total_mag}@anchor{2b2f}
@deffn {메서드} compare_total_mag (x, y, /)

부호를 무시하고, 추상 표현을 사용하여 두 피연산자를 비교합니다.
@end deffn

@geindex copy_abs() (decimal.Context 메서드)
@anchor{library/decimal decimal Context copy_abs}@anchor{2b30}
@deffn {메서드} copy_abs (x, /)

부호가 0으로 설정되어있는 `x' 의 복사본을 돌려줍니다.
@end deffn

@geindex copy_negate() (decimal.Context 메서드)
@anchor{library/decimal decimal Context copy_negate}@anchor{2b31}
@deffn {메서드} copy_negate (x, /)

부호가 반전된 `x' 복사본을 반환합니다.
@end deffn

@geindex copy_sign() (decimal.Context 메서드)
@anchor{library/decimal decimal Context copy_sign}@anchor{2b32}
@deffn {메서드} copy_sign (x, y, /)

`y' 에서 `x' 로 부호를 복사합니다.
@end deffn

@geindex divide() (decimal.Context 메서드)
@anchor{library/decimal decimal Context divide}@anchor{2b33}
@deffn {메서드} divide (x, y, /)

`x' 를 `y' 로 나눈 값을 반환합니다.
@end deffn

@geindex divide_int() (decimal.Context 메서드)
@anchor{library/decimal decimal Context divide_int}@anchor{2b34}
@deffn {메서드} divide_int (x, y, /)

`x' 를 `y' 로 나눈 후 정수로 잘라낸 값을 반환합니다.
@end deffn

@geindex divmod() (decimal.Context 메서드)
@anchor{library/decimal decimal Context divmod}@anchor{2b35}
@deffn {메서드} divmod (x, y, /)

두 숫자를 나누고 결과의 정수 부분을 반환합니다.
@end deffn

@geindex exp() (decimal.Context 메서드)
@anchor{library/decimal decimal Context exp}@anchor{2b36}
@deffn {메서드} exp (x, /)

Returns @code{e ** x}.
@end deffn

@geindex fma() (decimal.Context 메서드)
@anchor{library/decimal decimal Context fma}@anchor{2b37}
@deffn {메서드} fma (x, y, z, /)

`x' 에 `y' 를 곱한 후 `z' 를 더한 값을 반환합니다.
@end deffn

@geindex is_canonical() (decimal.Context 메서드)
@anchor{library/decimal decimal Context is_canonical}@anchor{150c}
@deffn {메서드} is_canonical (x, /)

`x' 가 규범적일 경우 @code{True}를 반환합니다; 그렇지 않으면 @code{False}를 반환합니다.
@end deffn

@geindex is_finite() (decimal.Context 메서드)
@anchor{library/decimal decimal Context is_finite}@anchor{2b38}
@deffn {메서드} is_finite (x, /)

`x' 가 유한이면 @code{True}를 반환합니다; 그렇지 않으면 @code{False}를 반환합니다.
@end deffn

@geindex is_infinite() (decimal.Context 메서드)
@anchor{library/decimal decimal Context is_infinite}@anchor{2b39}
@deffn {메서드} is_infinite (x, /)

`x' 가 무한대면 @code{True}를 반환합니다; 그렇지 않으면 @code{False}를 반환합니다.
@end deffn

@geindex is_nan() (decimal.Context 메서드)
@anchor{library/decimal decimal Context is_nan}@anchor{2b3a}
@deffn {메서드} is_nan (x, /)

`x' 가 qNaN 이나 sNaN 이면 @code{True}를 반환합니다; 그렇지 않으면 @code{False}를 반환합니다.
@end deffn

@geindex is_normal() (decimal.Context 메서드)
@anchor{library/decimal decimal Context is_normal}@anchor{2b3b}
@deffn {메서드} is_normal (x, /)

`x' 가 정상 수면 @code{True}를 반환합니다; 그렇지 않으면 @code{False}를 반환합니다.
@end deffn

@geindex is_qnan() (decimal.Context 메서드)
@anchor{library/decimal decimal Context is_qnan}@anchor{2b3c}
@deffn {메서드} is_qnan (x, /)

`x' 가 조용한 NaN이면 @code{True}를 반환합니다; 그렇지 않으면 @code{False}를 반환합니다.
@end deffn

@geindex is_signed() (decimal.Context 메서드)
@anchor{library/decimal decimal Context is_signed}@anchor{2b3d}
@deffn {메서드} is_signed (x, /)

`x' 가 음수면 @code{True}를 반환합니다; 그렇지 않으면 @code{False}를 반환합니다.
@end deffn

@geindex is_snan() (decimal.Context 메서드)
@anchor{library/decimal decimal Context is_snan}@anchor{2b3e}
@deffn {메서드} is_snan (x, /)

`x' 가 신호를 주는 NaN 이면 @code{True}를 반환합니다; 그렇지 않으면 @code{False}를 반환합니다.
@end deffn

@geindex is_subnormal() (decimal.Context 메서드)
@anchor{library/decimal decimal Context is_subnormal}@anchor{2b3f}
@deffn {메서드} is_subnormal (x, /)

`x' 가 비정상이면 @code{True}를 반환합니다; 그렇지 않으면 @code{False}를 반환합니다.
@end deffn

@geindex is_zero() (decimal.Context 메서드)
@anchor{library/decimal decimal Context is_zero}@anchor{2b40}
@deffn {메서드} is_zero (x, /)

`x' 가 0이면 @code{True}를 반환합니다; 그렇지 않으면 @code{False}를 반환합니다.
@end deffn

@geindex ln() (decimal.Context 메서드)
@anchor{library/decimal decimal Context ln}@anchor{2b41}
@deffn {메서드} ln (x, /)

`x' 의 자연로그(밑 e)를 반환합니다.
@end deffn

@geindex log10() (decimal.Context 메서드)
@anchor{library/decimal decimal Context log10}@anchor{2b42}
@deffn {메서드} log10 (x, /)

`x' 의 상용로그를 반환합니다.
@end deffn

@geindex logb() (decimal.Context 메서드)
@anchor{library/decimal decimal Context logb}@anchor{2b43}
@deffn {메서드} logb (x, /)

피연산자의 최상위 유효 숫자의 크기의 지수를 반환합니다.
@end deffn

@geindex logical_and() (decimal.Context 메서드)
@anchor{library/decimal decimal Context logical_and}@anchor{2b44}
@deffn {메서드} logical_and (x, y, /)

각 피연산자의 자릿수별로 논리적 연산 `and' 를 적용합니다.
@end deffn

@geindex logical_invert() (decimal.Context 메서드)
@anchor{library/decimal decimal Context logical_invert}@anchor{2b45}
@deffn {메서드} logical_invert (x, /)

`x' 의 모든 자릿수를 반전합니다.
@end deffn

@geindex logical_or() (decimal.Context 메서드)
@anchor{library/decimal decimal Context logical_or}@anchor{2b46}
@deffn {메서드} logical_or (x, y, /)

각 피연산자의 자릿수별로 논리적 연산 `or' 를 적용합니다.
@end deffn

@geindex logical_xor() (decimal.Context 메서드)
@anchor{library/decimal decimal Context logical_xor}@anchor{2b47}
@deffn {메서드} logical_xor (x, y, /)

각 피연산자의 자릿수별로 논리적 연산 `xor' 를 적용합니다.
@end deffn

@geindex max() (decimal.Context 메서드)
@anchor{library/decimal decimal Context max}@anchor{2b48}
@deffn {메서드} max (x, y, /)

두 값을 수치로 비교해, 최댓값을 돌려줍니다.
@end deffn

@geindex max_mag() (decimal.Context 메서드)
@anchor{library/decimal decimal Context max_mag}@anchor{2b49}
@deffn {메서드} max_mag (x, y, /)

부호를 무시하고 값을 수치로 비교합니다.
@end deffn

@geindex min() (decimal.Context 메서드)
@anchor{library/decimal decimal Context min}@anchor{2b4a}
@deffn {메서드} min (x, y, /)

두 값을 수치로 비교해, 최솟값을 돌려줍니다.
@end deffn

@geindex min_mag() (decimal.Context 메서드)
@anchor{library/decimal decimal Context min_mag}@anchor{2b4b}
@deffn {메서드} min_mag (x, y, /)

부호를 무시하고 값을 수치로 비교합니다.
@end deffn

@geindex minus() (decimal.Context 메서드)
@anchor{library/decimal decimal Context minus}@anchor{2b4c}
@deffn {메서드} minus (x, /)

minus는 파이썬에서 단항 접두사 빼기 연산자에 해당합니다.
@end deffn

@geindex multiply() (decimal.Context 메서드)
@anchor{library/decimal decimal Context multiply}@anchor{2b4d}
@deffn {메서드} multiply (x, y, /)

`x' 와 `y' 의 곱을 반환합니다.
@end deffn

@geindex next_minus() (decimal.Context 메서드)
@anchor{library/decimal decimal Context next_minus}@anchor{2b4e}
@deffn {메서드} next_minus (x, /)

`x' 보다 작고 표현 가능한 가장 큰 수를 반환합니다.
@end deffn

@geindex next_plus() (decimal.Context 메서드)
@anchor{library/decimal decimal Context next_plus}@anchor{2b4f}
@deffn {메서드} next_plus (x, /)

`x' 보다 크고 표현 가능한 가장 작은 수를 반환합니다.
@end deffn

@geindex next_toward() (decimal.Context 메서드)
@anchor{library/decimal decimal Context next_toward}@anchor{2b50}
@deffn {메서드} next_toward (x, y, /)

`y' 방향으로 `x' 에 가장 가까운 숫자를 반환합니다.
@end deffn

@geindex normalize() (decimal.Context 메서드)
@anchor{library/decimal decimal Context normalize}@anchor{2b51}
@deffn {메서드} normalize (x, /)

`x' 를 가장 간단한 형태로 환원합니다.
@end deffn

@geindex number_class() (decimal.Context 메서드)
@anchor{library/decimal decimal Context number_class}@anchor{2b52}
@deffn {메서드} number_class (x, /)

`x' 의 클래스를 가리키는 문자열을 돌려줍니다.
@end deffn

@geindex plus() (decimal.Context 메서드)
@anchor{library/decimal decimal Context plus}@anchor{2b53}
@deffn {메서드} plus (x, /)

plus는 파이썬에서 단항 접두사 더하기 연산자에 해당합니다. 이 연산은 컨텍스트 정밀도와 자리 올림을 적용하므로 항등 연산이 `아닙니다'.
@end deffn

@geindex power() (decimal.Context 메서드)
@anchor{library/decimal decimal Context power}@anchor{2b54}
@deffn {메서드} power (x, y, modulo=None)

@code{x} 의 @code{y} 거듭제곱을 돌려줍니다. 주어지면 @code{modulo} 모듈로로 환원합니다.

With two arguments, compute @code{x**y}.  If @code{x} is negative then @code{y}
must be integral.  The result will be inexact unless @code{y} is integral and
the result is finite and can be expressed exactly in ‘precision’ digits.
The rounding mode of the context is used. Results are always correctly rounded
in the Python version.

@code{Decimal(0) ** Decimal(0)}은 @code{InvalidOperation}이 되며, @code{InvalidOperation}가 트랩 되지 않으면, @code{Decimal('NaN')}이 됩니다.


버전 3.3에서 변경: The C module computes @code{power()} in terms of the correctly rounded
@ref{2b36,,exp()} and @ref{2b41,,ln()} functions. The result is well-defined but
only “almost always correctly rounded”.


세 인자로는 @code{(x**y) % modulo} 를 계산합니다. 세 인자 형식의 경우, 인자에 다음과 같은 제한이 있습니다:


@itemize -

@item 
세 인자는 모두 정수여야 합니다.

@item 
@code{y} 는 음수가 아니어야 합니다.

@item 
@code{x} 나 @code{y} 중 적어도 하나는 0이 아니어야 합니다

@item 
@code{modulo} 는 0이 아니고 최대 ‘precision’ 자릿수를 가져야 합니다
@end itemize

@code{Context.power(x, y, modulo)} 의 결괏값은 무한 정밀도로 @code{(x**y) % modulo} 를 계산할 때 얻을 수 있는 값과 같지만, 더 효율적으로 계산됩니다. 결과의 지수는 @code{x}, @code{y} 및 @code{modulo} 의 지수와 관계없이 0입니다. 결과는 항상 정확합니다.
@end deffn

@geindex quantize() (decimal.Context 메서드)
@anchor{library/decimal decimal Context quantize}@anchor{2b55}
@deffn {메서드} quantize (x, y, /)

`y' 의 지수를 가지는 (자리 올림 된) `x' 와 같은 값을 반환합니다.
@end deffn

@geindex radix() (decimal.Context 메서드)
@anchor{library/decimal decimal Context radix}@anchor{2b56}
@deffn {메서드} radix ()

Decimal이기 때문에 단지 10을 반환합니다, :)
@end deffn

@geindex remainder() (decimal.Context 메서드)
@anchor{library/decimal decimal Context remainder}@anchor{2b57}
@deffn {메서드} remainder (x, y, /)

정수 나눗셈의 나머지를 반환합니다.

결과가 0이 아닐 때, 결과의 부호는 원래의 피제수와 같습니다.
@end deffn

@geindex remainder_near() (decimal.Context 메서드)
@anchor{library/decimal decimal Context remainder_near}@anchor{2b58}
@deffn {메서드} remainder_near (x, y, /)

@code{x - y * n} 을 반환하는데, `n' 은 @code{x / y} 의 정확한 값에 가장 가까운 정수입니다 (결과가 0이면 그 부호는 `x' 의 부호가 됩니다).
@end deffn

@geindex rotate() (decimal.Context 메서드)
@anchor{library/decimal decimal Context rotate}@anchor{2b59}
@deffn {메서드} rotate (x, y, /)

`x' 를 `y' 번 회전한 복사본을 반환합니다.
@end deffn

@geindex same_quantum() (decimal.Context 메서드)
@anchor{library/decimal decimal Context same_quantum}@anchor{2b5a}
@deffn {메서드} same_quantum (x, y, /)

두 피연산자의 지수가 같으면 @code{True}를 반환합니다.
@end deffn

@geindex scaleb() (decimal.Context 메서드)
@anchor{library/decimal decimal Context scaleb}@anchor{2b5b}
@deffn {메서드} scaleb (x, y, /)

첫 번째 피연산자의 지수에 두 번째 값을 더해서 반환합니다.
@end deffn

@geindex shift() (decimal.Context 메서드)
@anchor{library/decimal decimal Context shift}@anchor{2b5c}
@deffn {메서드} shift (x, y, /)

`x' 를 `y' 번 이동한 복사본을 반환합니다.
@end deffn

@geindex sqrt() (decimal.Context 메서드)
@anchor{library/decimal decimal Context sqrt}@anchor{2b5d}
@deffn {메서드} sqrt (x, /)

음이 아닌 수의 제곱근을 컨텍스트의 정밀도로 반환합니다.
@end deffn

@geindex subtract() (decimal.Context 메서드)
@anchor{library/decimal decimal Context subtract}@anchor{2b5e}
@deffn {메서드} subtract (x, y, /)

`x' 와 `y' 의 차를 돌려줍니다.
@end deffn

@geindex to_eng_string() (decimal.Context 메서드)
@anchor{library/decimal decimal Context to_eng_string}@anchor{2b5f}
@deffn {메서드} to_eng_string (x, /)

문자열로 변환합니다. 지수가 필요하면 공학 표기법을 사용합니다.

공학 표기법의 지수는 3의 배수입니다. 이렇게 하면 소수점 왼쪽에 최대 3자리를 남기게 되고, 하나나 두 개의 후행 0을 추가해야 할 수 있습니다.
@end deffn

@geindex to_integral_exact() (decimal.Context 메서드)
@anchor{library/decimal decimal Context to_integral_exact}@anchor{2b60}
@deffn {메서드} to_integral_exact (x, /)

정수로 자리 올림 합니다.
@end deffn

@geindex to_sci_string() (decimal.Context 메서드)
@anchor{library/decimal decimal Context to_sci_string}@anchor{2b61}
@deffn {메서드} to_sci_string (x, /)

과학 표기법을 사용하여 숫자를 문자열로 변환합니다.
@end deffn
@end deffn

@c %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

@node 상수<4>,자리 올림 모드,Context 객체,decimal — Decimal fixed-point and floating-point arithmetic
@anchor{library/decimal constants}@anchor{2b62}@anchor{library/decimal decimal-rounding-modes}@anchor{2b63}
@subsubsection 상수


이 절의 상수는 C 모듈에서만 의미가 있습니다. 호환성을 위해 순수 파이썬 버전에도 포함되어 있습니다.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

@tab

32-비트

@tab

64-비트

@item

@geindex MAX_PREC (decimal 모듈)
@anchor{library/decimal decimal MAX_PREC}@anchor{12a5}
@deffn {데이터} decimal.MAX_PREC
@end deffn

@tab

@code{425000000}

@tab

@code{999999999999999999}

@item

@geindex MAX_EMAX (decimal 모듈)
@anchor{library/decimal decimal MAX_EMAX}@anchor{12a6}
@deffn {데이터} decimal.MAX_EMAX
@end deffn

@tab

@code{425000000}

@tab

@code{999999999999999999}

@item

@geindex MIN_EMIN (decimal 모듈)
@anchor{library/decimal decimal MIN_EMIN}@anchor{12a7}
@deffn {데이터} decimal.MIN_EMIN
@end deffn

@tab

@code{-425000000}

@tab

@code{-999999999999999999}

@item

@geindex MIN_ETINY (decimal 모듈)
@anchor{library/decimal decimal MIN_ETINY}@anchor{2b64}
@deffn {데이터} decimal.MIN_ETINY
@end deffn

@tab

@code{-849999999}

@tab

@code{-1999999999999999997}

@item

@geindex IEEE_CONTEXT_MAX_BITS (decimal 모듈)
@anchor{library/decimal decimal IEEE_CONTEXT_MAX_BITS}@anchor{2b20}
@deffn {데이터} decimal.IEEE_CONTEXT_MAX_BITS
@end deffn

@tab

@code{256}

@tab

@code{512}

@end multitable


@geindex HAVE_THREADS (decimal 모듈)
@anchor{library/decimal decimal HAVE_THREADS}@anchor{12a3}
@deffn {데이터} decimal.HAVE_THREADS

값은 @code{True}입니다. 이제 파이썬에는 항상 스레드가 있기 때문에, 폐지되었습니다.


버전 3.9부터 폐지됨.

@end deffn

@geindex HAVE_CONTEXTVAR (decimal 모듈)
@anchor{library/decimal decimal HAVE_CONTEXTVAR}@anchor{2166}
@deffn {데이터} decimal.HAVE_CONTEXTVAR

The default value is @code{True}. If Python is @ref{2165,,configured using the --without-decimal-contextvar option},
the C version uses a thread-local rather than a coroutine-local context and the value
is @code{False}.  This is slightly faster in some nested context scenarios.


Added in version 3.8.3.

@end deffn

@node 자리 올림 모드,신호,상수<4>,decimal — Decimal fixed-point and floating-point arithmetic
@anchor{library/decimal rounding-modes}@anchor{2b23}
@subsubsection 자리 올림 모드


@geindex ROUND_CEILING (decimal 모듈)
@anchor{library/decimal decimal ROUND_CEILING}@anchor{2ad7}
@deffn {데이터} decimal.ROUND_CEILING

Round towards @code{Infinity}.
@end deffn

@geindex ROUND_DOWN (decimal 모듈)
@anchor{library/decimal decimal ROUND_DOWN}@anchor{2ad8}
@deffn {데이터} decimal.ROUND_DOWN

0을 향해 자리 올림 합니다.
@end deffn

@geindex ROUND_FLOOR (decimal 모듈)
@anchor{library/decimal decimal ROUND_FLOOR}@anchor{2ad9}
@deffn {데이터} decimal.ROUND_FLOOR

Round towards @code{-Infinity}.
@end deffn

@geindex ROUND_HALF_DOWN (decimal 모듈)
@anchor{library/decimal decimal ROUND_HALF_DOWN}@anchor{2ada}
@deffn {데이터} decimal.ROUND_HALF_DOWN

가장 가까운 값으로 반올림하고, 동률이면 0에서 가까운 것을 선택합니다.
@end deffn

@geindex ROUND_HALF_EVEN (decimal 모듈)
@anchor{library/decimal decimal ROUND_HALF_EVEN}@anchor{2adb}
@deffn {데이터} decimal.ROUND_HALF_EVEN

가장 가까운 값으로 반올림하고, 동률이면 짝수를 선택합니다.
@end deffn

@geindex ROUND_HALF_UP (decimal 모듈)
@anchor{library/decimal decimal ROUND_HALF_UP}@anchor{2adc}
@deffn {데이터} decimal.ROUND_HALF_UP

가장 가까운 값으로 반올림하고, 동률이면 0에서 먼 것을 선택합니다.
@end deffn

@geindex ROUND_UP (decimal 모듈)
@anchor{library/decimal decimal ROUND_UP}@anchor{2add}
@deffn {데이터} decimal.ROUND_UP

0에서 먼 쪽으로 자리 올림 합니다.
@end deffn

@geindex ROUND_05UP (decimal 모듈)
@anchor{library/decimal decimal ROUND_05UP}@anchor{2ade}
@deffn {데이터} decimal.ROUND_05UP

0을 향해 자리 올림 했을 때 마지막 숫자가 0이나 5면 0에서 먼 쪽으로 자리 올림 합니다. 그렇지 않으면 0을 향해 자리 올림 합니다.
@end deffn

@node 신호,Floating-point notes,자리 올림 모드,decimal — Decimal fixed-point and floating-point arithmetic
@anchor{library/decimal decimal-signals}@anchor{2b65}@anchor{library/decimal signals}@anchor{2b66}
@subsubsection 신호


신호는 계산 중 발생하는 조건을 나타냅니다. 각각은 하나의 컨텍스트 플래그와 하나의 컨텍스트 트랩 활성화기에 대응합니다.

컨텍스트 플래그는 조건이 발생할 때마다 설정됩니다. 계산 후에, 플래그는 정보를 얻기 위한 목적으로 확인될 수 있습니다 (예를 들어, 계산이 정확한지를 판별하기 위해). 플래그를 확인한 후 다음 계산을 시작하기 전에 모든 플래그를 지우십시오.

컨텍스트의 트랩 활성화기가 신호에 대해 설정되면, 조건은 파이썬 예외를 일으킵니다. 예를 들어, @ref{2ae0,,DivisionByZero} 트랩이 설정되면, 이 조건을 만날 때 @ref{2ae0,,DivisionByZero} 예외가 발생합니다.

@geindex Clamped (decimal 클래스)
@anchor{library/decimal decimal Clamped}@anchor{2adf}
@deffn {클래스} decimal.Clamped

표현 제약 조건에 맞도록 지수를 변경했습니다.

Typically, clamping occurs when an exponent falls outside the context’s
@ref{12ac,,Emin} and @ref{12ab,,Emax} limits.  If possible, the exponent is reduced to
fit by adding zeros to the coefficient.
@end deffn

@geindex DecimalException (decimal 클래스)
@anchor{library/decimal decimal DecimalException}@anchor{2b67}
@deffn {클래스} decimal.DecimalException

다른 신호의 베이스 클래스이고 @ref{26eb,,ArithmeticError} 의 서브 클래스입니다.
@end deffn

@geindex DivisionByZero (decimal 클래스)
@anchor{library/decimal decimal DivisionByZero}@anchor{2ae0}
@deffn {클래스} decimal.DivisionByZero

무한대가 아닌 숫자를 0으로 나눴다는 신호를 줍니다.

Can occur with division, modulo division, or when raising a number to a negative
power.  If this signal is not trapped, returns @code{Infinity} or
@code{-Infinity} with the sign determined by the inputs to the calculation.
@end deffn

@geindex Inexact (decimal 클래스)
@anchor{library/decimal decimal Inexact}@anchor{2ae1}
@deffn {클래스} decimal.Inexact

자리 올림이 발생했고 결과가 정확하지 않음을 나타냅니다.

자리 올림 도중 0이 아닌 숫자가 삭제된 경우 신호를 줍니다. 자리 올림 된 결과가 반환됩니다. 신호 플래그나 트랩은 결과가 정확하지 않을 때를 감지하는 데 사용됩니다.
@end deffn

@geindex InvalidOperation (decimal 클래스)
@anchor{library/decimal decimal InvalidOperation}@anchor{12ad}
@deffn {클래스} decimal.InvalidOperation

유효하지 않은 연산이 수행되었습니다.

Indicates that an operation was requested that does not make sense. If not
trapped, returns @code{NaN}.  Possible causes include:

@example
Infinity - Infinity
0 * Infinity
Infinity / Infinity
x % 0
Infinity % x
sqrt(-x) and x > 0
0 ** 0
x ** (non-integer)
x ** Infinity
@end example
@end deffn

@geindex Overflow (decimal 클래스)
@anchor{library/decimal decimal Overflow}@anchor{2ae4}
@deffn {클래스} decimal.Overflow

수치적 오버플로.

Indicates the exponent is larger than @ref{12ab,,Context.Emax} after rounding has
occurred.  If not trapped, the result depends on the rounding mode, either
pulling inward to the largest representable finite number or rounding outward
to @code{Infinity}.  In either case, @ref{2ae1,,Inexact} and @ref{2ae2,,Rounded}
are also signaled.
@end deffn

@geindex Rounded (decimal 클래스)
@anchor{library/decimal decimal Rounded}@anchor{2ae2}
@deffn {클래스} decimal.Rounded

정보가 손실되지는 않았지만 자리 올림이 발생했습니다.

Signaled whenever rounding discards digits; even if those digits are zero
(such as rounding @code{5.00} to @code{5.0}).  If not trapped, returns
the result unchanged.  This signal is used to detect loss of significant
digits.
@end deffn

@geindex Subnormal (decimal 클래스)
@anchor{library/decimal decimal Subnormal}@anchor{2ae3}
@deffn {클래스} decimal.Subnormal

Exponent was lower than @ref{12ac,,Emin} prior to rounding.

연산 결과가 비정상(지수가 너무 작음)일 때 발생합니다. 트랩 되지 않으면, 결과를 그대로 반환합니다.
@end deffn

@geindex Underflow (decimal 클래스)
@anchor{library/decimal decimal Underflow}@anchor{2ae5}
@deffn {클래스} decimal.Underflow

결과가 0으로 자리 올림 되는 수치적 언더플로.

자리 올림에 의해 비정상 결과가 0으로 밀릴 때 발생합니다. @ref{2ae1,,Inexact}와 @ref{2ae3,,Subnormal} 신호도 줍니다.
@end deffn

@geindex FloatOperation (decimal 클래스)
@anchor{library/decimal decimal FloatOperation}@anchor{12a2}
@deffn {클래스} decimal.FloatOperation

float와 Decimal을 혼합하는 데 더 엄격한 의미를 사용합니다.

신호가 트랩되지 않으면 (기본값), @ref{1fe,,Decimal} 생성자, @ref{12ae,,create_decimal()} 및 모든 비교 연산자에서 float와 Decimal을 혼합 할 수 있습니다. 변환과 비교 모두 정확합니다. 복합 연산의 발생은 컨텍스트 플래그에 @ref{12a2,,FloatOperation} 을 설정하여 조용히 기록됩니다. @ref{1409,,from_float()} 나 @ref{2b28,,create_decimal_from_float()} 를 사용한 명시적 변환은 플래그를 설정하지 않습니다.

그렇지 않으면 (신호가 트랩되면), 같음 비교와 명시적 변환만 조용히 수행됩니다. 다른 모든 혼합된 연산은 @ref{12a2,,FloatOperation} 을 발생시킵니다.
@end deffn

다음 표는 신호의 계층 구조를 요약한 것입니다:

@example
exceptions.ArithmeticError(exceptions.Exception)
    DecimalException
        Clamped
        DivisionByZero(DecimalException, exceptions.ZeroDivisionError)
        Inexact
            Overflow(Inexact, Rounded)
            Underflow(Inexact, Rounded, Subnormal)
        InvalidOperation
        Rounded
        Subnormal
        FloatOperation(DecimalException, exceptions.TypeError)
@end example

@c %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

@node Floating-point notes,스레드로 작업하기,신호,decimal — Decimal fixed-point and floating-point arithmetic
@anchor{library/decimal decimal-notes}@anchor{2b68}@anchor{library/decimal floating-point-notes}@anchor{2b69}
@subsubsection Floating-point notes


@menu
* 증가시킨 정밀도로 자리 올림 오차 줄이기:: 
* 특수 값:: 

@end menu

@node 증가시킨 정밀도로 자리 올림 오차 줄이기,특수 값,,Floating-point notes
@anchor{library/decimal mitigating-round-off-error-with-increased-precision}@anchor{2b6a}
@subsubsection 증가시킨 정밀도로 자리 올림 오차 줄이기


The use of decimal floating point eliminates decimal representation error
(making it possible to represent @code{0.1} exactly); however, some operations
can still incur round-off error when non-zero digits exceed the fixed precision.

The effects of round-off error can be amplified by the addition or subtraction
of nearly offsetting quantities resulting in loss of significance.  Knuth
provides two instructive examples where rounded floating-point arithmetic with
insufficient precision causes the breakdown of the associative and distributive
properties of addition:

@example
# Examples from Seminumerical Algorithms, Section 4.2.2.
>>> from decimal import Decimal, getcontext
>>> getcontext().prec = 8

>>> u, v, w = Decimal(11111113), Decimal(-11111111), Decimal('7.51111111')
>>> (u + v) + w
Decimal('9.5111111')
>>> u + (v + w)
Decimal('10')

>>> u, v, w = Decimal(20000), Decimal(-6), Decimal('6.0000003')
>>> (u*v) + (u*w)
Decimal('0.01')
>>> u * (v+w)
Decimal('0.0060000')
@end example

The @code{decimal} module makes it possible to restore the identities by
expanding the precision sufficiently to avoid loss of significance:

@example
>>> getcontext().prec = 20
>>> u, v, w = Decimal(11111113), Decimal(-11111111), Decimal('7.51111111')
>>> (u + v) + w
Decimal('9.51111111')
>>> u + (v + w)
Decimal('9.51111111')
>>>
>>> u, v, w = Decimal(20000), Decimal(-6), Decimal('6.0000003')
>>> (u*v) + (u*w)
Decimal('0.0060000')
>>> u * (v+w)
Decimal('0.0060000')
@end example

@node 특수 값,,증가시킨 정밀도로 자리 올림 오차 줄이기,Floating-point notes
@anchor{library/decimal special-values}@anchor{2b6b}
@subsubsection 특수 값


The number system for the @code{decimal} module provides special values
including @code{NaN}, @code{sNaN}, @code{-Infinity}, @code{Infinity},
and two zeros, @code{+0} and @code{-0}.

무한대는 다음과 같이 직접 생성될 수 있습니다: @code{Decimal('Infinity')}. 또한, @ref{2ae0,,DivisionByZero} 신호가 트랩 되지 않을 때 0으로 나눠서 발생할 수 있습니다. 마찬가지로, @ref{2ae4,,Overflow} 신호가 트랩 되지 않을 때, 무한대는 표현 가능한 가장 큰 수의 한계를 넘어서 자리 올림 된 결과가 될 수 있습니다.

무한대는 부호가 있고 (아핀) 산술 연산에 사용될 수 있는데, 매우 크고 불확정적(indeterminate)인 숫자로 취급됩니다. 예를 들어, 무한대에 상수를 더하면 또 다른 무한대를 줍니다.

Some operations are indeterminate and return @code{NaN}, or if the
@ref{12ad,,InvalidOperation} signal is trapped, raise an exception.  For example,
@code{0/0} returns @code{NaN} which means “not a number”.  This variety of
@code{NaN} is quiet and, once created, will flow through other computations
always resulting in another @code{NaN}.  This behavior can be useful for a
series of computations that occasionally have missing inputs — it allows the
calculation to proceed while flagging specific results as invalid.

A variant is @code{sNaN} which signals rather than remaining quiet after every
operation.  This is a useful return value when an invalid result needs to
interrupt a calculation for special handling.

The behavior of Python’s comparison operators can be a little surprising where a
@code{NaN} is involved.  A test for equality where one of the operands is a
quiet or signaling @code{NaN} always returns @ref{d2a,,False} (even when doing
@code{Decimal('NaN')==Decimal('NaN')}), while a test for inequality always returns
@ref{e06,,True}.  An attempt to compare two Decimals using any of the @code{<},
@code{<=}, @code{>} or @code{>=} operators will raise the @ref{12ad,,InvalidOperation} signal
if either operand is a @code{NaN}, and return @code{False} if this signal is
not trapped.  Note that the General Decimal Arithmetic specification does not
specify the behavior of direct comparisons; these rules for comparisons
involving a @code{NaN} were taken from the IEEE 854 standard (see Table 3 in
section 5.7).  To ensure strict standards-compliance, use the @ref{2aef,,compare()}
and @ref{2af0,,compare_signal()} methods instead.

부호 있는 0은 언더플로 하는 계산의 결과일 수 있습니다. 계산을 더 정밀하게 수행한다면 얻게 될 결과의 기호를 유지합니다. 크기가 0이기 때문에, 양과 음의 0은 같다고 취급되며 부호는 정보 용입니다.

In addition to the two signed zeros which are distinct yet equal, there are
various representations of zero with differing precisions yet equivalent in
value.  This takes a bit of getting used to.  For an eye accustomed to
normalized floating-point representations, it is not immediately obvious that
the following calculation returns a value equal to zero:

@example
>>> 1 / Decimal('Infinity')
Decimal('0E-1000026')
@end example

@c %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

@node 스레드로 작업하기,조리법,Floating-point notes,decimal — Decimal fixed-point and floating-point arithmetic
@anchor{library/decimal decimal-threads}@anchor{2b6c}@anchor{library/decimal working-with-threads}@anchor{2b6d}
@subsubsection 스레드로 작업하기


@ref{1938,,getcontext()} 함수는 스레드마다 다른 @ref{12b4,,Context} 객체에 접근합니다. 별도의 스레드 컨텍스트를 갖는다는 것은 스레드가 다른 스레드를 방해하지 않고 변경할 수 있음을 의미합니다 (가령 @code{getcontext().prec=10}).

마찬가지로, @ref{2ae8,,setcontext()} 함수는 자동으로 대상을 현재 스레드에 할당합니다.

If @ref{2ae8,,setcontext()} has not been called before @ref{1938,,getcontext()}, then
@code{getcontext()} will automatically create a new context for use in the
current thread.  New context objects have default values set from the
@ref{12a8,,decimal.DefaultContext} object.

The @ref{175,,sys.flags.thread_inherit_context} flag affects the context for
new threads.  If the flag is false, new threads will start with an empty
context.  In this case, @ref{1938,,getcontext()} will create a new context object
when called and use the default values from `DefaultContext'.  If the flag
is true, new threads will start with a copy of context from the caller of
@ref{178,,threading.Thread.start()}.

To control the defaults so that each thread will use the same values throughout
the application, directly modify the `DefaultContext' object. This should be
done `before' any threads are started so that there won’t be a race condition
between threads calling @ref{1938,,getcontext()}. For example:

@example
# Set applicationwide defaults for all threads about to be launched
DefaultContext.prec = 12
DefaultContext.rounding = ROUND_DOWN
DefaultContext.traps = ExtendedContext.traps.copy()
DefaultContext.traps[InvalidOperation] = 1
setcontext(DefaultContext)

# Afterwards, the threads can be started
t1.start()
t2.start()
t3.start()
 . . .
@end example

@c %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

@node 조리법,Decimal FAQ,스레드로 작업하기,decimal — Decimal fixed-point and floating-point arithmetic
@anchor{library/decimal decimal-recipes}@anchor{2b6e}@anchor{library/decimal recipes}@anchor{2b6f}
@subsubsection 조리법


다음은 유틸리티 함수로 사용되고 @ref{1fe,,Decimal} 클래스로 작업하는 방법을 보여주는 몇 가지 조리법입니다:

@example
def moneyfmt(value, places=2, curr='@w{'}, sep=',', dp='.',
             pos='@w{'}, neg='-', trailneg='@w{'}):
    """Convert Decimal to a money formatted string.

    places:  required number of places after the decimal point
    curr:    optional currency symbol before the sign (may be blank)
    sep:     optional grouping separator (comma, period, space, or blank)
    dp:      decimal point indicator (comma or period)
             only specify as blank when places is zero
    pos:     optional sign for positive numbers: '+', space or blank
    neg:     optional sign for negative numbers: '-', '(', space or blank
    trailneg:optional trailing minus indicator:  '-', ')', space or blank

    >>> d = Decimal('-1234567.8901')
    >>> moneyfmt(d, curr='$')
    '-$1,234,567.89'
    >>> moneyfmt(d, places=0, sep='.', dp='@w{'}, neg='@w{'}, trailneg='-')
    '1.234.568-'
    >>> moneyfmt(d, curr='$', neg='(', trailneg=')')
    '($1,234,567.89)'
    >>> moneyfmt(Decimal(123456789), sep=' ')
    '123 456 789.00'
    >>> moneyfmt(Decimal('-0.02'), neg='<', trailneg='>')
    '<0.02>'

    """
    q = Decimal(10) ** -places      # 2 places --> '0.01'
    sign, digits, exp = value.quantize(q).as_tuple()
    result = []
    digits = list(map(str, digits))
    build, next = result.append, digits.pop
    if sign:
        build(trailneg)
    for i in range(places):
        build(next() if digits else '0')
    if places:
        build(dp)
    if not digits:
        build('0')
    i = 0
    while digits:
        build(next())
        i += 1
        if i == 3 and digits:
            i = 0
            build(sep)
    build(curr)
    build(neg if sign else pos)
    return '@w{'}.join(reversed(result))

def pi():
    """Compute Pi to the current precision.

    >>> print(pi())
    3.141592653589793238462643383

    """
    getcontext().prec += 2  # extra digits for intermediate steps
    three = Decimal(3)      # substitute "three=3.0" for regular floats
    lasts, t, s, n, na, d, da = 0, three, 3, 1, 0, 0, 24
    while s != lasts:
        lasts = s
        n, na = n+na, na+8
        d, da = d+da, da+32
        t = (t * n) / d
        s += t
    getcontext().prec -= 2
    return +s               # unary plus applies the new precision

def exp(x):
    """Return e raised to the power of x.  Result type matches input type.

    >>> print(exp(Decimal(1)))
    2.718281828459045235360287471
    >>> print(exp(Decimal(2)))
    7.389056098930650227230427461
    >>> print(exp(2.0))
    7.38905609893
    >>> print(exp(2+0j))
    (7.38905609893+0j)

    """
    getcontext().prec += 2
    i, lasts, s, fact, num = 0, 0, 1, 1, 1
    while s != lasts:
        lasts = s
        i += 1
        fact *= i
        num *= x
        s += num / fact
    getcontext().prec -= 2
    return +s

def cos(x):
    """Return the cosine of x as measured in radians.

    The Taylor series approximation works best for a small value of x.
    For larger values, first compute x = x % (2 * pi).

    >>> print(cos(Decimal('0.5')))
    0.8775825618903727161162815826
    >>> print(cos(0.5))
    0.87758256189
    >>> print(cos(0.5+0j))
    (0.87758256189+0j)

    """
    getcontext().prec += 2
    i, lasts, s, fact, num, sign = 0, 0, 1, 1, 1, 1
    while s != lasts:
        lasts = s
        i += 2
        fact *= i * (i-1)
        num *= x * x
        sign *= -1
        s += num / fact * sign
    getcontext().prec -= 2
    return +s

def sin(x):
    """Return the sine of x as measured in radians.

    The Taylor series approximation works best for a small value of x.
    For larger values, first compute x = x % (2 * pi).

    >>> print(sin(Decimal('0.5')))
    0.4794255386042030002732879352
    >>> print(sin(0.5))
    0.479425538604
    >>> print(sin(0.5+0j))
    (0.479425538604+0j)

    """
    getcontext().prec += 2
    i, lasts, s, fact, num, sign = 1, 0, x, 1, x, 1
    while s != lasts:
        lasts = s
        i += 2
        fact *= i * (i-1)
        num *= x * x
        sign *= -1
        s += num / fact * sign
    getcontext().prec -= 2
    return +s
@end example

@c %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

@node Decimal FAQ,,조리법,decimal — Decimal fixed-point and floating-point arithmetic
@anchor{library/decimal decimal-faq}@anchor{2b70}@anchor{library/decimal id1}@anchor{2b71}
@subsubsection Decimal FAQ


Q: It is cumbersome to type @code{decimal.Decimal('1234.5')}.  Is there a way to
minimize typing when using the interactive interpreter?

A: Some users abbreviate the constructor to just a single letter:

@example
>>> D = decimal.Decimal
>>> D('1.23') + D('3.45')
Decimal('4.68')
@end example

Q: In a fixed-point application with two decimal places, some inputs have many
places and need to be rounded.  Others are not supposed to have excess digits
and need to be validated.  What methods should be used?

A: The @ref{12b5,,quantize()} method rounds to a fixed number of decimal places. If
the @ref{2ae1,,Inexact} trap is set, it is also useful for validation:

@example
>>> TWOPLACES = Decimal(10) ** -2       # same as Decimal('0.01')
@end example

@example
>>> # Round to two places
>>> Decimal('3.214').quantize(TWOPLACES)
Decimal('3.21')
@end example

@example
>>> # Validate that a number does not exceed two places
>>> Decimal('3.21').quantize(TWOPLACES, context=Context(traps=[Inexact]))
Decimal('3.21')
@end example

@example
>>> Decimal('3.214').quantize(TWOPLACES, context=Context(traps=[Inexact]))
Traceback (most recent call last):
   ...
Inexact: None
@end example

Q: Once I have valid two place inputs, how do I maintain that invariant
throughout an application?

A: Some operations like addition, subtraction, and multiplication by an integer
will automatically preserve fixed point.  Others operations, like division and
non-integer multiplication, will change the number of decimal places and need to
be followed-up with a @ref{12b5,,quantize()} step:

@example
>>> a = Decimal('102.72')           # Initial fixed-point values
>>> b = Decimal('3.17')
>>> a + b                           # Addition preserves fixed-point
Decimal('105.89')
>>> a - b
Decimal('99.55')
>>> a * 42                          # So does integer multiplication
Decimal('4314.24')
>>> (a * b).quantize(TWOPLACES)     # Must quantize non-integer multiplication
Decimal('325.62')
>>> (b / a).quantize(TWOPLACES)     # And quantize division
Decimal('0.03')
@end example

In developing fixed-point applications, it is convenient to define functions
to handle the @ref{12b5,,quantize()} step:

@example
>>> def mul(x, y, fp=TWOPLACES):
...     return (x * y).quantize(fp)
...
>>> def div(x, y, fp=TWOPLACES):
...     return (x / y).quantize(fp)
@end example

@example
>>> mul(a, b)                       # Automatically preserve fixed-point
Decimal('325.62')
>>> div(b, a)
Decimal('0.03')
@end example

Q: There are many ways to express the same value.  The numbers @code{200},
@code{200.000}, @code{2E2}, and @code{.02E+4} all have the same value at
various precisions. Is there a way to transform them to a single recognizable
canonical value?

A: The @ref{2b10,,normalize()} method maps all equivalent values to a single
representative:

@example
>>> values = map(Decimal, '200 200.000 2E2 .02E+4'.split())
>>> [v.normalize() for v in values]
[Decimal('2E+2'), Decimal('2E+2'), Decimal('2E+2'), Decimal('2E+2')]
@end example

Q: When does rounding occur in a computation?

A: It occurs `after' the computation.  The philosophy of the decimal
specification is that numbers are considered exact and are created
independent of the current context.  They can even have greater
precision than current context.  Computations process with those
exact inputs and then rounding (or other context operations) is
applied to the `result' of the computation:

@example
>>> getcontext().prec = 5
>>> pi = Decimal('3.1415926535')   # More than 5 digits
>>> pi                             # All digits are retained
Decimal('3.1415926535')
>>> pi + 0                         # Rounded after an addition
Decimal('3.1416')
>>> pi - Decimal('0.00005')        # Subtract unrounded numbers, then round
Decimal('3.1415')
>>> pi + 0 - Decimal('0.00005').   # Intermediate values are rounded
Decimal('3.1416')
@end example

Q: Some decimal values always print with exponential notation.  Is there a way
to get a non-exponential representation?

A: For some values, exponential notation is the only way to express the number
of significant places in the coefficient.  For example, expressing
@code{5.0E+3} as @code{5000} keeps the value constant but cannot show the
original’s two-place significance.

응용 프로그램이 유효 숫자를 추적하는 데 신경 쓰지 않으면, 지수 및 후행 0을 제거하고 유효숫자를 잃지만, 값이 바뀌지 않도록 하기는 쉽습니다:

@example
>>> def remove_exponent(d):
...     return d.quantize(Decimal(1)) if d == d.to_integral() else d.normalize()
@end example

@example
>>> remove_exponent(Decimal('5E+3'))
Decimal('5000')
@end example

Q: Is there a way to convert a regular float to a @ref{1fe,,Decimal}?

A: Yes, any binary floating-point number can be exactly expressed as a
Decimal though an exact conversion may take more precision than intuition would
suggest:

@example
>>> Decimal(math.pi)
Decimal('3.141592653589793115997963468544185161590576171875')
@end example

Q: Within a complex calculation, how can I make sure that I haven’t gotten a
spurious result because of insufficient precision or rounding anomalies.

A: The decimal module makes it easy to test results.  A best practice is to
re-run calculations using greater precision and with various rounding modes.
Widely differing results indicate insufficient precision, rounding mode issues,
ill-conditioned inputs, or a numerically unstable algorithm.

Q: I noticed that context precision is applied to the results of operations but
not to the inputs.  Is there anything to watch out for when mixing values of
different precisions?

A: Yes.  The principle is that all values are considered to be exact and so is
the arithmetic on those values.  Only the results are rounded.  The advantage
for inputs is that “what you type is what you get”.  A disadvantage is that the
results can look odd if you forget that the inputs haven’t been rounded:

@example
>>> getcontext().prec = 3
>>> Decimal('3.104') + Decimal('2.104')
Decimal('5.21')
>>> Decimal('3.104') + Decimal('0.000') + Decimal('2.104')
Decimal('5.20')
@end example

해법은 정밀도를 높이거나 단항 플러스 연산을 사용하여 입력의 자리 올림을 강제 수행하는 것입니다:

@example
>>> getcontext().prec = 3
>>> +Decimal('1.23456789')      # unary plus triggers rounding
Decimal('1.23')
@end example

다른 방법으로, 입력은 @ref{12ae,,Context.create_decimal()} 메서드를 사용하여 생성 시에 자리 올림 될 수 있습니다:

@example
>>> Context(prec=5, rounding=ROUND_DOWN).create_decimal('1.2345678')
Decimal('1.2345')
@end example

Q: Is the CPython implementation fast for large numbers?

A: Yes.  In the CPython and PyPy3 implementations, the C/CFFI versions of
the decimal module integrate the high speed libmpdec@footnote{https://www.bytereef.org/mpdecimal/doc/libmpdec/index.html} library for
arbitrary precision correctly rounded decimal floating-point arithmetic @footnote{

Added in version 3.3.

}.
@code{libmpdec} uses Karatsuba multiplication@footnote{https://en.wikipedia.org/wiki/Karatsuba_algorithm}
for medium-sized numbers and the Number Theoretic Transform@footnote{https://en.wikipedia.org/wiki/Discrete_Fourier_transform_(general)#Number-theoretic_transform}
for very large numbers.

The context must be adapted for exact arbitrary precision arithmetic. @ref{12ac,,Emin}
and @ref{12ab,,Emax} should always be set to the maximum values, @ref{13a3,,clamp}
should always be 0 (the default).  Setting @ref{2b21,,prec} requires some care.

The easiest approach for trying out bignum arithmetic is to use the maximum
value for @ref{2b21,,prec} as well @footnote{

버전 3.9에서 변경: 이 접근법은 정수가 아닌 거듭제곱을 제외한 모든 정확한 결과에 적용됩니다.

}:

@example
>>> setcontext(Context(prec=MAX_PREC, Emax=MAX_EMAX, Emin=MIN_EMIN))
>>> x = Decimal(2) ** 256
>>> x / 128
Decimal('904625697166532776746648320380374280103671755200316906558262375061821325312')
@end example

For inexact results, @ref{12a5,,MAX_PREC} is far too large on 64-bit platforms and
the available memory will be insufficient:

@example
>>> Decimal(1) / 3
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
MemoryError
@end example

On systems with overallocation (e.g. Linux), a more sophisticated approach is to
adjust @ref{2b21,,prec} to the amount of available RAM.  Suppose that you have 8GB of
RAM and expect 10 simultaneous operands using a maximum of 500MB each:

@example
>>> import sys
>>>
>>> # Maximum number of digits for a single operand using 500MB in 8-byte words
>>> # with 19 digits per word (4-byte and 9 digits for the 32-bit build):
>>> maxdigits = 19 * ((500 * 1024**2) // 8)
>>>
>>> # Check that this works:
>>> c = Context(prec=maxdigits, Emax=MAX_EMAX, Emin=MIN_EMIN)
>>> c.traps[Inexact] = True
>>> setcontext(c)
>>>
>>> # Fill the available precision with nines:
>>> x = Decimal(0).logical_invert() * 9
>>> sys.getsizeof(x)
524288112
>>> x + 2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  decimal.Inexact: [<class 'decimal.Inexact'>]
@end example

일반적으로 (그리고 특히 초과 할당이 없는 시스템에서), 더 엄격한 경계를 추정하고 모든 계산이 정확할 것으로 예상되면 @ref{2ae1,,Inexact} 트랩을 설정하는 것이 좋습니다.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node fractions — 유리수,random — 의사 난수 생성,decimal — Decimal fixed-point and floating-point arithmetic,숫자와 수학 모듈
@anchor{library/fractions doc}@anchor{2b72}@anchor{library/fractions fractions-rational-numbers}@anchor{2b73}@anchor{library/fractions module-fractions}@anchor{61}@anchor{library/fractions translation-repo}@anchor{2b74}
@subsection @code{fractions} — 유리수


@geindex module; fractions

`소스 코드:' Lib/fractions.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/fractions.py}


__________________________________________________________________


The @code{fractions} module provides support for rational number arithmetic.

A Fraction instance can be constructed from a pair of rational numbers, from
a single number, or from a string.

@geindex as_integer_ratio()

@geindex Fraction (fractions 클래스)
@anchor{library/fractions fractions Fraction}@anchor{213}
@deffn {클래스} fractions.Fraction (numerator=0, denominator=1)

@deffnx {클래스} fractions.Fraction (number)

@deffnx {클래스} fractions.Fraction (string)

The first version requires that `numerator' and `denominator' are instances
of @ref{14c3,,numbers.Rational} and returns a new @code{Fraction} instance
with a value equal to @code{numerator/denominator}.
If `denominator' is zero, it raises a @ref{b3f,,ZeroDivisionError}.

The second version requires that `number' is an instance of
@ref{14c3,,numbers.Rational} or has the @code{as_integer_ratio()} method
(this includes @ref{196,,float} and @ref{1fe,,decimal.Decimal}).
It returns a @code{Fraction} instance with exactly the same value.
Assumed, that the @code{as_integer_ratio()} method returns a pair
of coprime integers and last one is positive.
Note that due to the
usual issues with binary point (see @ref{20fe,,부동 소수점 산술; 문제점 및 한계}), the
argument to @code{Fraction(1.1)} is not exactly equal to 11/10, and so
@code{Fraction(1.1)} does `not' return @code{Fraction(11, 10)} as one might expect.
(But see the documentation for the @ref{2b75,,limit_denominator()} method below.)

The last version of the constructor expects a string.
The usual form for this instance is:

@example
[sign] numerator ['/' denominator]
@end example

이때, 선택적 @code{sign}은 ‘+’ 나 ‘-‘일 수 있으며 @code{numerator} 와 @code{denominator}(있다면)는 십진수 문자열입니다 (밑줄은 코드에서 정수 리터럴과 마찬가지로 숫자를 구분하는 데 사용할 수 있습니다). 또한, 유한한 값을 나타내고 @ref{196,,float} 생성자에서 허용하는 모든 문자열은 @ref{213,,Fraction} 생성자에서도 허용됩니다. 모든 형식에서, 입력 문자열에는 선행과/이나 후행 공백이 있을 수도 있습니다. 여기 예제가 있습니다:

@example
>>> from fractions import Fraction
>>> Fraction(16, -10)
Fraction(-8, 5)
>>> Fraction(123)
Fraction(123, 1)
>>> Fraction()
Fraction(0, 1)
>>> Fraction('3/7')
Fraction(3, 7)
>>> Fraction(' -3/7 ')
Fraction(-3, 7)
>>> Fraction('1.414213 \t\n')
Fraction(1414213, 1000000)
>>> Fraction('-.125')
Fraction(-1, 8)
>>> Fraction('7e-6')
Fraction(7, 1000000)
>>> Fraction(2.25)
Fraction(9, 4)
>>> Fraction(1.1)
Fraction(2476979795053773, 2251799813685248)
>>> from decimal import Decimal
>>> Fraction(Decimal('1.1'))
Fraction(11, 10)
@end example

@ref{213,,Fraction} 클래스는 추상 베이스 클래스 @ref{14c3,,numbers.Rational}를 상속하며, 그 클래스의 모든 메서드와 연산을 구현합니다. @code{Fraction} 인스턴스는 @ref{823,,해시 가능}하고, 불변으로 취급해야 합니다. 또한, @code{Fraction}에는 다음과 같은 프로퍼티와 메서드가 있습니다:


버전 3.2에서 변경: @ref{213,,Fraction} 생성자는 이제 @ref{196,,float}와 @ref{1fe,,decimal.Decimal} 인스턴스를 받아들입니다.



버전 3.9에서 변경: @ref{b0c,,math.gcd()} 함수가 이제 `numerator'와 `denominator'를 정규화하는 데 사용됩니다. @code{math.gcd()}는 항상 @ref{19b,,int} 형을 반환합니다. 이전에는, GCD 형이 `numerator'와 `denominator'에 의존했습니다.



버전 3.11에서 변경: Underscores are now permitted when creating a @code{Fraction} instance
from a string, following 
@geindex Python 향상 제안; PEP 515
PEP 515@footnote{https://peps.python.org/pep-0515/} rules.



버전 3.11에서 변경: @code{Fraction} implements @code{__int__} now to satisfy
@code{typing.SupportsInt} instance checks.



버전 3.12에서 변경: Space is allowed around the slash for string inputs: @code{Fraction('2 / 3')}.



버전 3.12에서 변경: @code{Fraction} instances now support float-style formatting, with
presentation types @code{"e"}, @code{"E"}, @code{"f"}, @code{"F"}, @code{"g"}, @code{"G"}
and @code{"%""}.



버전 3.13에서 변경: Formatting of @code{Fraction} instances without a presentation type
now supports fill, alignment, sign handling, minimum width and grouping.



버전 3.14에서 변경: The @code{Fraction} constructor now accepts any objects with the
@code{as_integer_ratio()} method.


@geindex numerator (fractions.Fraction의 속성)
@anchor{library/fractions fractions Fraction numerator}@anchor{2b76}
@deffn {속성} numerator

기약 분수로 나타낼 때 Fraction의 분자.
@end deffn

@geindex denominator (fractions.Fraction의 속성)
@anchor{library/fractions fractions Fraction denominator}@anchor{2b77}
@deffn {속성} denominator

Denominator of the Fraction in lowest terms.
Guaranteed to be positive.
@end deffn

@geindex as_integer_ratio() (fractions.Fraction 메서드)
@anchor{library/fractions fractions Fraction as_integer_ratio}@anchor{2b78}
@deffn {메서드} as_integer_ratio ()

비율이 원래 Fraction과 같습니다. 비율은 양의 분모를 갖는 가장 작은 항으로 표현됩니다.


Added in version 3.8.

@end deffn

@geindex is_integer() (fractions.Fraction 메서드)
@anchor{library/fractions fractions Fraction is_integer}@anchor{2b79}
@deffn {메서드} is_integer ()

Return @code{True} if the Fraction is an integer.


Added in version 3.12.

@end deffn

@geindex from_float() (fractions.Fraction의 클래스 메서드)
@anchor{library/fractions fractions Fraction from_float}@anchor{140a}
@deffn {메서드} classmethod from_float (f)

@ref{196,,float} 나 @ref{240a,,numbers.Integral}의 인스턴스만 받아들이는 대체 생성자. @code{Fraction.from_float(0.3)}가 @code{Fraction(3, 10)}와 같은 값이 아니라는 점에 유의하십시오.

@cartouche
@quotation 참고 
파이썬 3.2 이상에서는, @ref{196,,float}에서 직접 @ref{213,,Fraction} 인스턴스를 생성할 수도 있습니다.
@end quotation
@end cartouche
@end deffn

@geindex from_decimal() (fractions.Fraction의 클래스 메서드)
@anchor{library/fractions fractions Fraction from_decimal}@anchor{140b}
@deffn {메서드} classmethod from_decimal (dec)

@ref{1fe,,decimal.Decimal} 나 @ref{240a,,numbers.Integral}의 인스턴스만 받아들이는 대체 생성자.

@cartouche
@quotation 참고 
파이썬 3.2 이상에서는, @ref{1fe,,decimal.Decimal} 인스턴스에서 직접 @ref{213,,Fraction} 인스턴스를 생성할 수도 있습니다.
@end quotation
@end cartouche
@end deffn

@geindex from_number() (fractions.Fraction의 클래스 메서드)
@anchor{library/fractions fractions Fraction from_number}@anchor{214}
@deffn {메서드} classmethod from_number (number)

Alternative constructor which only accepts instances of
@ref{240a,,numbers.Integral}, @ref{14c3,,numbers.Rational},
@ref{196,,float} or @ref{1fe,,decimal.Decimal}, and objects with
the @code{as_integer_ratio()} method, but not strings.


Added in version 3.14.

@end deffn

@geindex limit_denominator() (fractions.Fraction 메서드)
@anchor{library/fractions fractions Fraction limit_denominator}@anchor{2b75}
@deffn {메서드} limit_denominator (max_denominator=1000000)

분모가 최대 max_denominator인 @code{self}에 가장 가까운 @ref{213,,Fraction}을 찾아서 반환합니다. 이 메서드는 주어진 부동 소수점 수에 대한 유리한 근사를 찾는 데 유용합니다:

@example
>>> from fractions import Fraction
>>> Fraction('3.1415926535897932').limit_denominator(1000)
Fraction(355, 113)
@end example

또는 float로 표현된 유리수를 복구할 때 유용합니다:

@example
>>> from math import pi, cos
>>> Fraction(cos(pi/3))
Fraction(4503599627370497, 9007199254740992)
>>> Fraction(cos(pi/3)).limit_denominator()
Fraction(1, 2)
>>> Fraction(1.1).limit_denominator()
Fraction(11, 10)
@end example
@end deffn

@geindex __floor__() (fractions.Fraction 메서드)
@anchor{library/fractions fractions Fraction __floor__}@anchor{1af5}
@deffn {메서드} __floor__ ()

가장 큰 @ref{19b,,int} @code{<= self}를 반환합니다. 이 메서드는 @ref{15c2,,math.floor()} 함수를 통해 액세스할 수도 있습니다:

@example
>>> from math import floor
>>> floor(Fraction(355, 113))
3
@end example
@end deffn

@geindex __ceil__() (fractions.Fraction 메서드)
@anchor{library/fractions fractions Fraction __ceil__}@anchor{1af4}
@deffn {메서드} __ceil__ ()

가장 작은 @ref{19b,,int} @code{>= self}를 반환합니다. 이 메서드는 @ref{15c3,,math.ceil()} 함수를 통해 액세스할 수도 있습니다.
@end deffn

@geindex __round__() (fractions.Fraction 메서드)
@anchor{library/fractions fractions Fraction __round__}@anchor{1af3}
@deffn {메서드} __round__ ()

@deffnx {메서드} __round__ (ndigits)

첫 번째 버전은 @code{self}에 가장 가까운 @ref{19b,,int}를 반환하는데, 절반은 짝수로 자리 올림 합니다. 두 번째 버전은 @code{self}를 가장 가까운 @code{Fraction(1, 10**ndigits)}의 배수로 자리 올림 하는데 (@code{ndigits}가 음수면 논리적으로), 역시 짝수로 자리 올림 합니다. 이 메서드는 @ref{14df,,round()} 함수를 통해 액세스할 수도 있습니다.
@end deffn

@geindex __format__() (fractions.Fraction 메서드)
@anchor{library/fractions fractions Fraction __format__}@anchor{2b7a}
@deffn {메서드} __format__ (format_spec, /)

Provides support for formatting of @code{Fraction} instances via the
@ref{832,,str.format()} method, the @ref{199,,format()} built-in function, or
@ref{19a,,Formatted string literals}.

If the @code{format_spec} format specification string does not end with one
of the presentation types @code{'e'}, @code{'E'}, @code{'f'}, @code{'F'}, @code{'g'},
@code{'G'} or @code{'%'} then formatting follows the general rules for fill,
alignment, sign handling, minimum width, and grouping as described in the
@ref{4f9,,format specification mini-language}. The “alternate
form” flag @code{'#'} is supported: if present, it forces the output string
to always include an explicit denominator, even when the value being
formatted is an exact integer. The zero-fill flag @code{'0'} is not
supported.

If the @code{format_spec} format specification string ends with one of
the presentation types @code{'e'}, @code{'E'}, @code{'f'}, @code{'F'}, @code{'g'},
@code{'G'} or @code{'%'} then formatting follows the rules outlined for the
@ref{196,,float} type in the @ref{4f9,,Format specification mini-language} section.

Here are some examples:

@example
>>> from fractions import Fraction
>>> format(Fraction(103993, 33102), '_')
'103_993/33_102'
>>> format(Fraction(1, 7), '.^+10')
'...+1/7...'
>>> format(Fraction(3, 1), '@w{'})
'3'
>>> format(Fraction(3, 1), '#')
'3/1'
>>> format(Fraction(1, 7), '.40g')
'0.1428571428571428571428571428571428571429'
>>> format(Fraction('1234567.855'), '_.2f')
'1_234_567.86'
>>> f"@{Fraction(355, 113):*>20.6e@}"
'********3.141593e+00'
>>> old_price, new_price = 499, 672
>>> "@{:.2%@} price increase".format(Fraction(new_price, old_price) - 1)
'34.67% price increase'
@end example
@end deffn
@end deffn


@subsubheading 더 보기



@table @asis

@item 모듈 @ref{a2,,numbers}

숫자 계층을 구성하는 추상 베이스 클래스.
@end table


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node random — 의사 난수 생성,statistics — 수학 통계 함수,fractions — 유리수,숫자와 수학 모듈
@anchor{library/random doc}@anchor{2b7b}@anchor{library/random module-random}@anchor{bd}@anchor{library/random random-generate-pseudo-random-numbers}@anchor{2b7c}@anchor{library/random translation-repo}@anchor{2b7d}
@subsection @code{random} — 의사 난수 생성


@geindex module; random

`소스 코드:' Lib/random.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/random.py}


__________________________________________________________________


이 모듈은 다양한 분포에 대한 의사 난수 생성기를 구현합니다.

정수에 대해서는, 범위에서 균일한 선택이 있습니다. 시퀀스에 대해서는, 무작위 요소의 균일한 선택, 리스트를 제자리(in-place)에서 임의 순열을 생성하는 함수 및 중복 없는(without replacement) 무작위 표본 추출(sampling)을 위한 함수가 있습니다.

실수에 대해서는, 균일(uniform), 정규(normal) (가우시안(Gaussian)), 로그 정규(lognormal), 음의 지수(negative exponential), 감마(gamma) 및 베타(beta) 분포를 계산하는 함수가 있습니다. 각도 분포를 생성하기 위해, 폰 미제스(von Mises) 분포를 사용할 수 있습니다.

거의 모든 모듈 함수는 기본 함수 @ref{94e,,random()}에 의존하는데, 이 함수는 반 열린 구간 @code{0.0 <= X < 1.0} 에서 무작위 float를 균일하게 생성합니다. 파이썬은 메르센 트위스터(Mersenne Twister)를 핵심 생성기로 사용합니다. 53비트 정밀도의 float를 생성하며, 주기는 2**19937-1 입니다. C로 작성된 하부 구현은 빠르고 스레드 안전합니다. 메르센 트위스터는 가장 광범위하게 테스트 된 난수 생성기 중 하나입니다. 그러나, 완전히 결정적이므로, 모든 목적에 적합하지는 않으며, 암호화 목적에는 전혀 적합하지 않습니다.

이 모듈에서 제공하는 함수는 실제로는 @ref{1c5a,,random.Random} 클래스의 숨겨진 인스턴스에 대해 연결된 메서드입니다. @ref{1c5a,,Random} 인스턴스를 직접 인스턴스 화하여 상태를 공유하지 않는 생성기를 얻을 수 있습니다.

Class @ref{1c5a,,Random} can also be subclassed if you want to use a different
basic generator of your own devising: see the documentation on that class for
more details.

The @code{random} module also provides the @ref{2b7e,,SystemRandom} class which
uses the system function @ref{745,,os.urandom()} to generate random numbers
from sources provided by the operating system.

@cartouche
@quotation 경고 
이 모듈의 의사 난수 생성기를 보안 목적으로 사용해서는 안 됩니다. 보안이나 암호화 용도를 위해서는, @ref{c5,,secrets} 모듈을 참조하십시오.
@end quotation
@end cartouche


@subsubheading 더 보기


M. Matsumoto and T. Nishimura, “Mersenne Twister: A 623-dimensionally
equidistributed uniform pseudorandom number generator”, ACM Transactions on
Modeling and Computer Simulation Vol. 8, No. 1, January pp.3–30 1998.

긴 주기와 비교적 간단한 업데이트 연산을 하는 호환 가능한 대체 난수 생성기를 위한 Complementary-Multiply-with-Carry recipe@footnote{https://code.activestate.com/recipes/576707-long-period-random-number-generator/}


@cartouche
@quotation 참고 
The global random number generator and instances of @ref{1c5a,,Random} are thread-safe.
However, in the free-threaded build, concurrent calls to the global generator or
to the same instance of @code{Random} may encounter contention and poor performance.
Consider using separate instances of @code{Random} per thread instead.
@end quotation
@end cartouche

@menu
* 관리 함수:: 
* 바이트열 함수:: 
* 정수 함수:: 
* 시퀀스 함수:: 
* 이산 분포:: 
* 실수 분포:: 
* 대체 생성기:: 
* 재현성에 대한 참고 사항:: 
* 예제: 예제<4>. 
* 조리법: 조리법<2>. 
* Command-line usage: Command-line usage<2>. 
* Command-line example:: 

@end menu

@node 관리 함수,바이트열 함수,,random — 의사 난수 생성
@anchor{library/random bookkeeping-functions}@anchor{2b7f}
@subsubsection 관리 함수


@geindex seed() (random 모듈)
@anchor{library/random random seed}@anchor{1478}
@deffn {함수} random.seed (a=None, version=2)

난수 생성기를 초기화합니다.

`a'가 생략되거나 @code{None}이면, 현재 시스템 시간이 사용됩니다. 운영 체제에서 임의성 소스(randomness sources)를 제공하면, 시스템 시간 대신 사용됩니다 (가용성에 대한 자세한 내용은 @ref{745,,os.urandom()} 함수를 참조하십시오).

If `a' is an int, its absolute value is used directly.

버전(version) 2(기본값)에서는, @ref{169,,str}, @ref{192,,bytes} 또는 @ref{344,,bytearray} 객체가 @ref{19b,,int}로 변환되어 모든 비트가 사용됩니다.

버전(version) 1(이전 버전의 파이썬에서 온 임의의 시퀀스를 재현하기 위해 제공됩니다)에서는, @ref{169,,str}과 @ref{192,,bytes}를 위한 알고리즘은 더 좁은 범위의 시드(seed)를 생성합니다.


버전 3.2에서 변경: 문자열 시드의 모든 비트를 사용하는 버전 2 체계로 이동했습니다.



버전 3.11에서 변경: `seed'는 다음 형 중 하나여야 합니다: @code{None}, @ref{19b,,int}, @ref{196,,float}, @ref{169,,str}, @ref{192,,bytes} 또는 @ref{344,,bytearray}.

@end deffn

@geindex getstate() (random 모듈)
@anchor{library/random random getstate}@anchor{2b80}
@deffn {함수} random.getstate ()

생성기의 현재 내부 상태를 포착하는 객체를 반환합니다. 이 객체는 @ref{2b81,,setstate()}로 전달되어 상태를 복원 할 수 있습니다.
@end deffn

@geindex setstate() (random 모듈)
@anchor{library/random random setstate}@anchor{2b81}
@deffn {함수} random.setstate (state)

`state'는 @ref{2b80,,getstate()}에 대한 이전 호출에서 얻은 것이어야 하고, @ref{2b81,,setstate()}는 생성기의 내부 상태를 @code{getstate()}가 호출될 당시의 상태로 복원합니다.
@end deffn

@node 바이트열 함수,정수 함수,관리 함수,random — 의사 난수 생성
@anchor{library/random functions-for-bytes}@anchor{2b82}
@subsubsection 바이트열 함수


@geindex randbytes() (random 모듈)
@anchor{library/random random randbytes}@anchor{1829}
@deffn {함수} random.randbytes (n)

`n' 무작위 바이트를 생성합니다.

이 메서드를 사용하여 보안 토큰을 생성해서는 안 됩니다. 대신 @ref{2b83,,secrets.token_bytes()}를 사용하십시오.


Added in version 3.9.

@end deffn

@node 정수 함수,시퀀스 함수,바이트열 함수,random — 의사 난수 생성
@anchor{library/random functions-for-integers}@anchor{2b84}
@subsubsection 정수 함수


@geindex randrange() (random 모듈)
@anchor{library/random random randrange}@anchor{a6b}
@deffn {함수} random.randrange (stop)

@deffnx {함수} random.randrange (start, stop[, step])

Return a randomly selected element from @code{range(start, stop, step)}.

This is roughly equivalent to @code{choice(range(start, stop, step))} but
supports arbitrarily large ranges and is optimized for common cases.

The positional argument pattern matches the @ref{b3d,,range()} function.

Keyword arguments should not be used because they can be interpreted
in unexpected ways. For example @code{randrange(start=100)} is interpreted
as @code{randrange(0, 100, 1)}.


버전 3.2에서 변경: @ref{a6b,,randrange()}는 균일하게 분포된 값을 생성하는 데 있어 더욱 정교합니다. 이전에는 약간 고르지 않은 분포를 생성 할 수 있는 @code{int(random()*n)}와 같은 스타일을 사용했습니다.



버전 3.12에서 변경: Automatic conversion of non-integer types is no longer supported.
Calls such as @code{randrange(10.0)} and @code{randrange(Fraction(10, 1))}
now raise a @ref{198,,TypeError}.

@end deffn

@geindex randint() (random 모듈)
@anchor{library/random random randint}@anchor{1434}
@deffn {함수} random.randint (a, b)

@code{a <= N <= b}를 만족하는 임의의 정수 `N'을 반환합니다. @code{randrange(a, b+1)}의 별칭.
@end deffn

@geindex getrandbits() (random 모듈)
@anchor{library/random random getrandbits}@anchor{120c}
@deffn {함수} random.getrandbits (k)

`k' 임의의 비트를 갖는 음이 아닌 파이썬 정수를 반환합니다. 이 메서드는 메르센 트위스터(Mersenne Twister) 생성기와 함께 제공되며, 일부 다른 생성기도 API의 선택적 부분으로 제공할 수 있습니다. 사용 가능할 때, @ref{120c,,getrandbits()}는 @ref{a6b,,randrange()}가 임의로 넓은 범위를 처리 할 수 있도록 합니다.


버전 3.9에서 변경: 이 메서드는 이제 `k'에 0을 허용합니다.

@end deffn

@node 시퀀스 함수,이산 분포,정수 함수,random — 의사 난수 생성
@anchor{library/random functions-for-sequences}@anchor{2b85}
@subsubsection 시퀀스 함수


@geindex choice() (random 모듈)
@anchor{library/random random choice}@anchor{1435}
@deffn {함수} random.choice (seq)

비어 있지 않은 시퀀스 `seq'에서 임의의 요소를 반환합니다. `seq'가 비어 있으면, @ref{173a,,IndexError}를 발생시킵니다.
@end deffn

@geindex choices() (random 모듈)
@anchor{library/random random choices}@anchor{ec0}
@deffn {함수} random.choices (population, weights=None, *, cum_weights=None, k=1)

`population'에서 중복을 허락하면서(with replacement) 선택한 `k' 크기의 요소 리스트를 반환합니다. `population'이 비어 있으면, @ref{173a,,IndexError}를 발생시킵니다.

`weights' 시퀀스가 지정되면, 상대 가중치에 따라 선택됩니다. 대안적으로, `cum_weights' 시퀀스가 제공되면, (아마도 @ref{bef,,itertools.accumulate()}를 사용하여 계산된) 누적 가중치(cumulative weights)에 따라 선택이 이루어집니다. 예를 들어, 상대 가중치 @code{[10, 5, 30, 5]}는 누적 가중치 @code{[10, 15, 45, 50]}과 동등합니다. 내부적으로, 상대 가중치는 선택하기 전에 누적 가중치로 변환되므로, 누적 가중치를 제공하면 작업이 줄어듭니다.

`weights'나 `cum_weights'를 지정하지 않으면, 같은 확률로 선택됩니다. weights 시퀀스가 제공되면, `population' 시퀀스와 길이가 같아야 합니다. `weights'와 `cum_weights'를 모두 지정하는 것은 @ref{198,,TypeError}입니다.

`weights'나 `cum_weights'는 @ref{bd,,random()}이 반환하는 @ref{196,,float} 값과 상호 운용되는 모든 숫자 형을 사용할 수 있습니다 (정수, 부동 소수점(float) 및 유리수(fractions)는 포함하지만, 십진수(decimal)는 제외합니다). 가중치는 음수가 아니고 유한하다고 가정합니다. 모든 가중치가 0이면 @ref{2ec,,ValueError}가 발생합니다.

주어진 시드에 대해, 균등한 가중치를 갖는 @ref{ec0,,choices()} 함수는 일반적으로 @ref{1435,,choice()}에 대한 반복 호출과는 다른 시퀀스를 생성합니다. @code{choices()}에서 사용하는 알고리즘은 내부 일관성과 속도를 위해 부동 소수점 산술을 사용합니다. @code{choice()}에서 사용하는 알고리즘은 자리 올림 오차로 인한 작은 바이어스(bias)를 피하려고 반복 선택을 통한 정수 산술로 기본 설정됩니다.


Added in version 3.6.



버전 3.9에서 변경: 모든 가중치가 0이면 @ref{2ec,,ValueError}를 발생시킵니다.

@end deffn

@geindex shuffle() (random 모듈)
@anchor{library/random random shuffle}@anchor{94d}
@deffn {함수} random.shuffle (x)

시퀀스 `x'를 제자리에서 섞습니다.

불변 시퀀스를 섞고 새로운 섞인 리스트를 반환하려면, 대신 @code{sample(x, k=len(x))}를 사용하십시오.

작은 @code{len(x)}의 경우에조차, `x'의 총 순열 수는 대부분의 난수 생성기 주기보다 빠르게 커질 수 있습니다. 이것은 긴 시퀀스의 대부분 순열이 절대로 생성될 수 없음을 의미합니다. 예를 들어, 길이가 2080인 시퀀스가 메르센 트위스터 난수 생성기의 주기 안에 들어갈 수 있는 최대입니다.


버전 3.11에서 변경: 선택적 매개 변수 `random'을 제거했습니다.

@end deffn

@geindex sample() (random 모듈)
@anchor{library/random random sample}@anchor{94c}
@deffn {함수} random.sample (population, k, *, counts=None)

population 시퀀스에서 선택한 고유한 요소의 `k' 길이 리스트를 반환합니다. 중복 없는(without replacement) 무작위 표본 추출(sampling)에 사용됩니다.

원래 population을 변경하지 않고, population의 요소를 포함하는 새 리스트를 반환합니다. 결과 리스트는 선택 순서를 따라서, 모든 서브 슬라이스도 유효한 임의의 표본이 됩니다. 이것은 추첨 당첨자(표본)를 대상(grand prize)과 차점자들(서브 슬라이스)로 나눌 수 있도록 합니다.

population의 멤버는 @ref{823,,해시 가능}하거나 고유할 필요가 없습니다. population이 반복을 포함하면, 각 등장(occurrence)은 표본에서 가능한 선택입니다.

반복되는 요소는 한 번에 하나씩 또는 선택적 키워드 전용 `counts' 매개 변수로 지정할 수 있습니다. 예를 들어 @code{sample(['red', 'blue'], counts=[4, 2], k=5)}는 @code{sample(['red', 'red', 'red', 'red', 'blue', 'blue'], k=5)}와 동등합니다.

정수 범위에서 표본을 선택하려면, @ref{b3d,,range()} 객체를 인자로 사용하십시오. 이는 큰 population에서 표본 추출할 때 특히 빠르고 공간 효율적입니다: @code{sample(range(10000000), k=60)}.

표본 크기가 population 크기보다 크면 @ref{2ec,,ValueError}가 발생합니다.


버전 3.9에서 변경: `counts' 매개 변수를 추가했습니다.



버전 3.11에서 변경: The `population' must be a sequence.  Automatic conversion of sets
to lists is no longer supported.

@end deffn

@node 이산 분포,실수 분포,시퀀스 함수,random — 의사 난수 생성
@anchor{library/random discrete-distributions}@anchor{2b86}
@subsubsection 이산 분포


The following function generates a discrete distribution.

@geindex binomialvariate() (random 모듈)
@anchor{library/random random binomialvariate}@anchor{6d6}
@deffn {함수} random.binomialvariate (n=1, p=0.5)

Binomial distribution@footnote{https://mathworld.wolfram.com/BinomialDistribution.html}.
Return the number of successes for `n' independent trials with the
probability of success in each trial being `p':

Mathematically equivalent to:

@example
sum(random() < p for i in range(n))
@end example

The number of trials `n' should be a non-negative integer.
The probability of success `p' should be between @code{0.0 <= p <= 1.0}.
The result is an integer in the range @code{0 <= X <= n}.


Added in version 3.12.

@end deffn

@node 실수 분포,대체 생성기,이산 분포,random — 의사 난수 생성
@anchor{library/random id1}@anchor{2b87}@anchor{library/random real-valued-distributions}@anchor{2b88}
@subsubsection 실수 분포


다음 함수는 특정 실수 분포를 생성합니다. 함수 매개 변수는 일반적인 수학적 관행에 사용되는 분포 방정식에서 해당 변수의 이름을 따서 명명됩니다; 이러한 방정식의 대부분은 모든 통계 교과서에서 찾을 수 있습니다.

@geindex random() (random 모듈)
@anchor{library/random random random}@anchor{94e}
@deffn {함수} random.random ()

@code{0.0 <= X < 1.0} 구간에서 다음 임의의 부동 소수점 숫자를 반환합니다
@end deffn

@geindex uniform() (random 모듈)
@anchor{library/random random uniform}@anchor{2b89}
@deffn {함수} random.uniform (a, b)

@code{a <= b} 일 때 @code{a <= N <= b}, @code{b < a} 일 때 @code{b <= N <= a}를 만족하는 임의의 부동 소수점 숫자 `N'을 반환합니다.

종단 값 @code{b}는 표현식 @code{a + (b-a) * random()}의 부동 소수점 자리 올림에 따라 범위에 포함되거나 포함되지 않을 수 있습니다.
@end deffn

@geindex triangular() (random 모듈)
@anchor{library/random random triangular}@anchor{2b8a}
@deffn {함수} random.triangular (low, high, mode)

@code{low <= N <= high}를 만족하고 이 경계 사이에 지정된 `모드(mode)'를 갖는 임의의 부동 소수점 숫자 `N'을 반환합니다. `low' 및 `high' 경계는 기본적으로 0과 1입니다. `mode' 인자는 기본적으로 경계 사이의 중간 점으로, 대칭 분포를 제공합니다.
@end deffn

@geindex betavariate() (random 모듈)
@anchor{library/random random betavariate}@anchor{2b8b}
@deffn {함수} random.betavariate (alpha, beta)

베타 분포. 매개 변수의 조건은 @code{alpha > 0}과 @code{beta > 0}입니다. 반환된 값의 범위는 0에서 1입니다.
@end deffn

@geindex expovariate() (random 모듈)
@anchor{library/random random expovariate}@anchor{6d7}
@deffn {함수} random.expovariate (lambd=1.0)

지수 분포. `lambd'는 1.0을 원하는 평균으로 나눈 값입니다. 0이 아니어야 합니다. (매개 변수는 “lambda”라고 부르지만, 파이썬에서는 예약어입니다.) 반환된 값의 범위는, `lambd'가 양수이면 0에서 양의 무한대이고, `lambd'가 음수이면 음의 무한대에서 0입니다.


버전 3.12에서 변경: Added the default value for @code{lambd}.

@end deffn

@geindex gammavariate() (random 모듈)
@anchor{library/random random gammavariate}@anchor{2b8c}
@deffn {함수} random.gammavariate (alpha, beta)

Gamma distribution.  (`Not' the gamma function!)  The shape and
scale parameters, `alpha' and `beta', must have positive values.
(Calling conventions vary and some sources define ‘beta’
as the inverse of the scale).

확률 분포 함수는 다음과 같습니다:

@example
x ** (alpha - 1) * math.exp(-x / beta)
pdf(x) =  --------------------------------------
            math.gamma(alpha) * beta ** alpha
@end example
@end deffn

@geindex gauss() (random 모듈)
@anchor{library/random random gauss}@anchor{1bd6}
@deffn {함수} random.gauss (mu=0.0, sigma=1.0)

정규 분포, 가우시안 분포라고도 합니다. `mu'는 평균이고, `sigma'는 표준 편차입니다. 이것은 아래에 정의된 @ref{1bd7,,normalvariate()} 함수보다 약간 빠릅니다.

다중 스레딩 참고: 두 스레드가 이 함수를 동시에 호출하면, 같은 반환 값을 받을 수 있습니다. 이것은 세 가지 방법으로 피할 수 있습니다. 1) 각 스레드가 난수 생성기의 다른 인스턴스를 사용하도록 합니다. 2) 모든 호출에 록을 둡니다. 3) 더 느리지만, 스레드 안전한 @ref{1bd7,,normalvariate()} 함수를 대신 사용합니다.


버전 3.11에서 변경: `mu' and `sigma' now have default arguments.

@end deffn

@geindex lognormvariate() (random 모듈)
@anchor{library/random random lognormvariate}@anchor{2b8d}
@deffn {함수} random.lognormvariate (mu, sigma)

로그 정규 분포. 이 분포의 자연로그를 취하면, 평균 `mu'와 표준 편차 `sigma'를 갖는 정규 분포를 얻게 됩니다. `mu'는 아무 값이나 될 수 있으며, `sigma'는 0보다 커야 합니다.
@end deffn

@geindex normalvariate() (random 모듈)
@anchor{library/random random normalvariate}@anchor{1bd7}
@deffn {함수} random.normalvariate (mu=0.0, sigma=1.0)

정규 분포. `mu'는 평균이고, `sigma'는 표준 편차입니다.


버전 3.11에서 변경: `mu' and `sigma' now have default arguments.

@end deffn

@geindex vonmisesvariate() (random 모듈)
@anchor{library/random random vonmisesvariate}@anchor{2b8e}
@deffn {함수} random.vonmisesvariate (mu, kappa)

`mu'는 0과 2*`pi' 사이의 라디안으로 표현된 평균 각도이며, `kappa'는 0 이상이어야 하는 집중도(concentration) 매개 변수입니다.  `kappa'가 0이면, 이 분포는 0에서 2*`pi'에 걸친 균등한 임의의 각도로 환원됩니다.
@end deffn

@geindex paretovariate() (random 모듈)
@anchor{library/random random paretovariate}@anchor{2b8f}
@deffn {함수} random.paretovariate (alpha)

파레토 분포. `alpha'는 모양(shape) 매개 변수입니다.
@end deffn

@geindex weibullvariate() (random 모듈)
@anchor{library/random random weibullvariate}@anchor{2b90}
@deffn {함수} random.weibullvariate (alpha, beta)

베이불 분포. `alpha'는 크기(scale) 매개 변수이고 `beta'는 모양(shape) 매개 변수입니다.
@end deffn

@node 대체 생성기,재현성에 대한 참고 사항,실수 분포,random — 의사 난수 생성
@anchor{library/random alternative-generator}@anchor{2b91}
@subsubsection 대체 생성기


@geindex Random (random 클래스)
@anchor{library/random random Random}@anchor{1c5a}
@deffn {클래스} random.Random ([seed])

Class that implements the default pseudo-random number generator used by the
@code{random} module.


버전 3.11에서 변경: 이전에는 `seed'가 해시 가능한 어떤 객체라도 될 수 있었습니다. 이제는 다음 형으로 제한됩니다: @code{None}, @ref{19b,,int}, @ref{196,,float}, @ref{169,,str}, @ref{192,,bytes} 또는 @ref{344,,bytearray}.


Subclasses of @code{Random} should override the following methods if they
wish to make use of a different basic generator:

@geindex seed() (random.Random 메서드)
@anchor{library/random random Random seed}@anchor{1d67}
@deffn {메서드} seed (a=None, version=2)

Override this method in subclasses to customise the @ref{1478,,seed()}
behaviour of @code{Random} instances.
@end deffn

@geindex getstate() (random.Random 메서드)
@anchor{library/random random Random getstate}@anchor{2b92}
@deffn {메서드} getstate ()

Override this method in subclasses to customise the @ref{2b80,,getstate()}
behaviour of @code{Random} instances.
@end deffn

@geindex setstate() (random.Random 메서드)
@anchor{library/random random Random setstate}@anchor{2b93}
@deffn {메서드} setstate (state)

Override this method in subclasses to customise the @ref{2b81,,setstate()}
behaviour of @code{Random} instances.
@end deffn

@geindex random() (random.Random 메서드)
@anchor{library/random random Random random}@anchor{2b94}
@deffn {메서드} random ()

Override this method in subclasses to customise the @ref{94e,,random()}
behaviour of @code{Random} instances.
@end deffn

Optionally, a custom generator subclass can also supply the following method:

@geindex getrandbits() (random.Random 메서드)
@anchor{library/random random Random getrandbits}@anchor{2b95}
@deffn {메서드} getrandbits (k)

Override this method in subclasses to customise the
@ref{120c,,getrandbits()} behaviour of @code{Random} instances.
@end deffn

@geindex randbytes() (random.Random 메서드)
@anchor{library/random random Random randbytes}@anchor{b23}
@deffn {메서드} randbytes (n)

Override this method in subclasses to customise the
@ref{1829,,randbytes()} behaviour of @code{Random} instances.
@end deffn
@end deffn

@geindex SystemRandom (random 클래스)
@anchor{library/random random SystemRandom}@anchor{2b7e}
@deffn {클래스} random.SystemRandom ([seed])

운영 체제에서 제공하는 소스에서 난수를 생성하기 위해 @ref{745,,os.urandom()} 함수를 사용하는 클래스. 모든 시스템에서 사용 가능한 것은 아닙니다. 소프트웨어 상태에 의존하지 않으며, 시퀀스는 재현되지 않습니다. 따라서, @ref{1478,,seed()} 메서드는 효과가 없으며, 무시됩니다. @ref{2b80,,getstate()}와 @ref{2b81,,setstate()} 메서드는 호출되면 @ref{36b,,NotImplementedError}를 발생시킵니다.
@end deffn

@node 재현성에 대한 참고 사항,예제<4>,대체 생성기,random — 의사 난수 생성
@anchor{library/random notes-on-reproducibility}@anchor{2b96}
@subsubsection 재현성에 대한 참고 사항


때때로 의사 난수 생성기가 만든 시퀀스를 재현하는 것이 유용 할 수 있습니다. 시드 값을 재사용하면, 여러 스레드가 실행되고 있지 않은 한 실행할 때마다 같은 시퀀스를 재현할 수 있어야 합니다.

random 모듈의 알고리즘과 시딩(seeding) 함수의 대부분은 파이썬 버전에 따라 변경될 수 있지만, 두 가지 측면은 변경되지 않음이 보장됩니다:


@itemize *

@item 
새로운 시딩 메서드가 추가되면, 이전 버전과 호환되는 시더(seeder)가 제공될 것입니다.

@item 
호환 시더에 같은 시드가 제공되면 생성기의 @ref{2b94,,random()} 메서드는 같은 시퀀스를 계속 생성할 것입니다.
@end itemize

@node 예제<4>,조리법<2>,재현성에 대한 참고 사항,random — 의사 난수 생성
@anchor{library/random examples}@anchor{2b97}@anchor{library/random random-examples}@anchor{13e1}
@subsubsection 예제


기본 예제:

@example
>>> random()                          # 무작위 float:  0.0 <= x < 1.0
0.37444887175646646

>>> uniform(2.5, 10.0)                # 무작위 float:  2.5 <= x <= 10.0
3.1800146073117523

>>> expovariate(1 / 5)                # 평균 5초의 도착 간격
5.148957571865031

>>> randrange(10)                     # 경계를 포함하는 0에서 9 사이의 정수
7

>>> randrange(0, 101, 2)              # 경계를 포함하는 0에서 100 사이의 짝수 정수
26

>>> choice(['win', 'lose', 'draw'])   # 시퀀스로부터의 단일 무작위 요소
'draw'

>>> deck = 'ace two three four'.split()
>>> shuffle(deck)                     # 리스트를 섞습니다
>>> deck
['four', 'two', 'ace', 'three']

>>> sample([10, 20, 30, 40, 50], k=4) # 중복 없는 4개의 표본
[40, 10, 50, 30]
@end example

시뮬레이션:

@example
>>> # 여섯 개의 룰렛 휠이 회전합니다 (중복을 허락하는 가중치 있는 샘플링)
>>> choices(['red', 'black', 'green'], [18, 18, 2], k=6)
['red', 'green', 'black', 'black', 'red', 'black']

>>> # 52장의 카드 덱에서 중복 없이 20장의 카드를 나누고,
>>> # 10 값(10, 잭, 퀸 또는 킹)을
>>> # 가진 카드의 비율을 결정합니다.
>>> deal = sample(['tens', 'low cards'], counts=[16, 36], k=20)
>>> deal.count('tens') / 20
0.15

>>> # 60%의 확률로 앞(head)이 나오는 편향된(biased) 동전을 7번 던졌을 때 5번 이상
>>> # 앞이 나올 확률을 추정합니다.
>>> sum(binomialvariate(n=7, p=0.6) >= 5 for i in range(10_000)) / 10_000
0.4169

>>> # 다섯 표본의 중간값이 가운데 2개의 사분위(quartile)에 있을 확률
>>> def trial():
...     return 2_500 <= sorted(choices(range(10_000), k=5))[2] < 7_500
...
>>> sum(trial() for i in range(10_000)) / 10_000
0.7958
@end example

표본의 평균에 대한 신뢰 구간을 추정하기 위해 중복을 허용하는(with replacement) 재표본추출(resampling)을 사용하는 통계적 부트스트래핑(statistical bootstrapping)@footnote{https://en.wikipedia.org/wiki/Bootstrapping_(statistics)}의 예:

@example
# https://www.thoughtco.com/example-of-bootstrapping-3126155
from statistics import fmean as mean
from random import choices

data = [41, 50, 29, 37, 81, 30, 73, 63, 20, 35, 68, 22, 60, 31, 95]
means = sorted(mean(choices(data, k=len(data))) for i in range(100))
print(f'The sample mean of @{mean(data):.1f@} has a 90% confidence '
      f'interval from @{means[5]:.1f@} to @{means[94]:.1f@}')
@end example

약물과 위약의 효과 간에 관찰된 차이의 통계적 유의성 또는 p-값@footnote{https://en.wikipedia.org/wiki/P-value}을 결정하기 위한 재표본추출 순열 검증(resampling permutation test)@footnote{https://en.wikipedia.org/wiki/Resampling_(statistics)#Permutation_tests}의 예:

@example
# Dennis Shasha 와 Manda Wilson의 "Statistics is Easy" 에서 따온 예제
from statistics import fmean as mean
from random import shuffle

drug = [54, 73, 53, 70, 73, 68, 52, 65, 65]
placebo = [54, 51, 58, 44, 55, 52, 42, 47, 58, 46]
observed_diff = mean(drug) - mean(placebo)

n = 10_000
count = 0
combined = drug + placebo
for i in range(n):
    shuffle(combined)
    new_diff = mean(combined[:len(drug)]) - mean(combined[len(drug):])
    count += (new_diff >= observed_diff)

print(f'@{n@} label reshufflings produced only @{count@} instances with a difference')
print(f'at least as extreme as the observed difference of @{observed_diff:.1f@}.')
print(f'The one-sided p-value of @{count / n:.4f@} leads us to reject the null')
print(f'hypothesis that there is no difference between the drug and the placebo.')
@end example

다중 서버 큐를 위한 도착 시간과 서비스 제공의 시뮬레이션:

@example
from heapq import heapify, heapreplace
from random import expovariate, gauss
from statistics import mean, quantiles

average_arrival_interval = 5.6
average_service_time = 15.0
stdev_service_time = 3.5
num_servers = 3

waits = []
arrival_time = 0.0
servers = [0.0] * num_servers  # 각 서버를 사용할 수 있는 시간
heapify(servers)
for i in range(1_000_000):
    arrival_time += expovariate(1.0 / average_arrival_interval)
    next_server_available = servers[0]
    wait = max(0.0, next_server_available - arrival_time)
    waits.append(wait)
    service_duration = max(0.0, gauss(average_service_time, stdev_service_time))
    service_completed = arrival_time + wait + service_duration
    heapreplace(servers, service_completed)

print(f'Mean wait: @{mean(waits):.1f@}   Max wait: @{max(waits):.1f@}')
print('Quartiles:', [round(q, 1) for q in quantiles(waits)])
@end example


@subsubheading 더 보기


시뮬레이션(simulation), 표본 추출(sampling), 섞기(shuffling) 및 교차 검증(cross-validation)을 포함하는 몇 가지 기본 개념만을 사용한, 통계 분석에 대한 Jake Vanderplas@footnote{https://us.pycon.org/2016/speaker/profile/295/}의 비디오 자습서 Statistics for Hackers@footnote{https://www.youtube.com/watch?v=Iq9DzN6mvYA}

Economics Simulation@footnote{https://nbviewer.org/url/norvig.com/ipython/Economics.ipynb} 이 모듈에서 제공하는 많은 도구와 분포(gauss, uniform, sample, betavariate, choice, triangular 및 randrange)의 효과적인 사용을 보여주는 Peter Norvig@footnote{https://norvig.com/bio.html}의 시장(marketplace) 시뮬레이션.

A Concrete Introduction to Probability (using Python)@footnote{https://nbviewer.org/url/norvig.com/ipython/Probability.ipynb} 확률 이론의 기초, 시뮬레이션 작성 방법 및 파이썬을 사용해서 데이터 분석을 수행하는 방법을 다루는 Peter Norvig@footnote{https://norvig.com/bio.html}의 자습서.


@node 조리법<2>,Command-line usage<2>,예제<4>,random — 의사 난수 생성
@anchor{library/random recipes}@anchor{2b98}
@subsubsection 조리법


These recipes show how to efficiently make random selections
from the combinatoric iterators in the @ref{85,,itertools} module:

@example
import random

def random_product(*iterables, repeat=1):
    "Random selection from itertools.product(*iterables, repeat=repeat)"
    pools = tuple(map(tuple, iterables)) * repeat
    return tuple(map(random.choice, pools))

def random_permutation(iterable, r=None):
    "Random selection from itertools.permutations(iterable, r)"
    pool = tuple(iterable)
    r = len(pool) if r is None else r
    return tuple(random.sample(pool, r))

def random_combination(iterable, r):
    "Random selection from itertools.combinations(iterable, r)"
    pool = tuple(iterable)
    n = len(pool)
    indices = sorted(random.sample(range(n), r))
    return tuple(pool[i] for i in indices)

def random_combination_with_replacement(iterable, r):
    "Choose r elements with replacement.  Order the result to match the iterable."
    # Result will be in set(itertools.combinations_with_replacement(iterable, r)).
    pool = tuple(iterable)
    n = len(pool)
    indices = sorted(random.choices(range(n), k=r))
    return tuple(pool[i] for i in indices)

def random_derangement(iterable):
    "Choose a permutation where no element stays in its original position."
    seq = tuple(iterable)
    if len(seq) < 2:
        if not seq:
            return ()
        raise IndexError('No derangments to choose from')
    perm = list(range(len(seq)))
    start = tuple(perm)
    while True:
        random.shuffle(perm)
        if all(p != q for p, q in zip(start, perm)):
            return tuple([seq[i] for i in perm])
@end example

@c >>> import random
@c 
@c 
@c >>> random.seed(8675309)
@c >>> random_product('ABCDEFG', repeat=5)
@c ('D', 'B', 'E', 'F', 'E')
@c 
@c 
@c >>> random.seed(8675309)
@c >>> random_permutation('ABCDEFG')
@c ('D', 'B', 'E', 'C', 'G', 'A', 'F')
@c >>> random_permutation('ABCDEFG', 5)
@c ('A', 'G', 'D', 'C', 'B')
@c 
@c 
@c >>> random.seed(8675309)
@c >>> random_combination('ABCDEFG', 7)
@c ('A', 'B', 'C', 'D', 'E', 'F', 'G')
@c >>> random_combination('ABCDEFG', 6)
@c ('A', 'B', 'C', 'D', 'F', 'G')
@c >>> random_combination('ABCDEFG', 5)
@c ('A', 'B', 'C', 'E', 'F')
@c >>> random_combination('ABCDEFG', 4)
@c ('B', 'C', 'D', 'G')
@c >>> random_combination('ABCDEFG', 3)
@c ('B', 'E', 'G')
@c >>> random_combination('ABCDEFG', 2)
@c ('E', 'G')
@c >>> random_combination('ABCDEFG', 1)
@c ('C',)
@c >>> random_combination('ABCDEFG', 0)
@c ()
@c 
@c 
@c >>> random.seed(8675309)
@c >>> random_combination_with_replacement('ABCDEFG', 7)
@c ('B', 'C', 'D', 'E', 'E', 'E', 'G')
@c >>> random_combination_with_replacement('ABCDEFG', 3)
@c ('A', 'B', 'E')
@c >>> random_combination_with_replacement('ABCDEFG', 2)
@c ('A', 'G')
@c >>> random_combination_with_replacement('ABCDEFG', 1)
@c ('E',)
@c >>> random_combination_with_replacement('ABCDEFG', 0)
@c ()
@c 
@c 
@c >>> random.seed(8675309)
@c >>> random_derangement('')
@c ()
@c >>> random_derangement('A')
@c Traceback (most recent call last):
@c ...
@c IndexError: No derangments to choose from
@c >>> random_derangement('AB')
@c ('B', 'A')
@c >>> random_derangement('ABC')
@c ('C', 'A', 'B')
@c >>> random_derangement('ABCD')
@c ('B', 'A', 'D', 'C')
@c >>> random_derangement('ABCDE')
@c ('B', 'C', 'A', 'E', 'D')
@c >>> # Identical inputs treated as distinct
@c >>> identical = 20
@c >>> random_derangement((10, identical, 30, identical))
@c (20, 30, 10, 20)

기본 @ref{94e,,random()}은 `0.0 ≤ x < 1.0' 범위에서 2⁻⁵³의 배수를 반환합니다. 이러한 모든 숫자는 균등 간격으로 분포되어있고 파이썬 float로 정확하게 표현할 수 있습니다. 그러나, 해당 범위의 다른 많은 표현 가능한 부동 소수점은 가능한 선택이 아닙니다. 예를 들어, @code{0.05954861408025609}는 2⁻⁵³의 정수배가 아닙니다.

다음 조리법은 다른 접근 방식을 사용합니다. 범위의 모든 부동 소수점이 가능한 선택입니다. 가수(mantissa)는 `2⁵² ≤ mantissa < 2⁵³' 범위에 있는 정수의 균등 분포(uniform distribution)에서 옵니다. 지수(exponent)는 `-53'보다 작은 지수가 다음으로 큰 지수의 절반만큼 자주 발생하는 기하 분포(geometric distribution)에서 옵니다.

@example
from random import Random
from math import ldexp

class FullRandom(Random):

    def random(self):
        mantissa = 0x10_0000_0000_0000 | self.getrandbits(52)
        exponent = -53
        x = 0
        while not x:
            x = self.getrandbits(32)
            exponent += x.bit_length() - 32
        return ldexp(mantissa, exponent)
@end example

클래스의 모든 @ref{2b88,,실숫값 분포}는 새 메서드를 사용합니다:

@example
>>> fr = FullRandom()
>>> fr.random()
0.05954861408025609
>>> fr.expovariate(0.25)
8.87925541791544
@end example

조리법은 개념적으로 `0.0 ≤ x < 1.0' 범위의 2⁻¹⁰⁷⁴의 모든 배수에서 선택하는 알고리즘과 동등합니다. 이러한 모든 숫자는 균등한 간격이지만, 대부분은 가장 가까운 표현 가능한 파이썬 부동 소수점으로 자리 내림해야 합니다. (값 2⁻¹⁰⁷⁴은 가장 작은 양의 정규화되지 않은 부동 소수점이며 @code{math.ulp(0.0)}과 같습니다.)


@subsubheading 더 보기


Generating Pseudo-random Floating-Point Values@footnote{https://allendowney.com/research/rand/downey07randfloat.pdf} Allen B. Downey의 논문은 @ref{94e,,random()}이 일반적으로 생성하는 것보다 더 세밀한 부동 소수점을 생성하는 방법을 설명합니다.


@node Command-line usage<2>,Command-line example,조리법<2>,random — 의사 난수 생성
@anchor{library/random command-line-usage}@anchor{2b99}@anchor{library/random random-cli}@anchor{47f}
@subsubsection Command-line usage



Added in version 3.13.


The @code{random} module can be executed from the command line.

@example
python -m random [-h] [-c CHOICE [CHOICE ...] | -i N | -f N] [input ...]
@end example

The following options are accepted:

@geindex random 명령줄 옵션; -h
@geindex random 명령줄 옵션; --help
@anchor{library/random cmdoption-random-h}@anchor{2b9a}@anchor{library/random cmdoption-random-help}@anchor{2b9b}
@deffn {Option} @w{-}h, @w{-}@w{-}help

Show the help message and exit.
@end deffn

@geindex random 명령줄 옵션; -c
@geindex random 명령줄 옵션; --choice
@anchor{library/random cmdoption-random-c}@anchor{2b9c}
@deffn {Option} @w{-}c CHOICE [CHOICE ...]
@anchor{library/random cmdoption-random-choice}@anchor{2b9d}
@deffnx {Option} @w{-}@w{-}choice CHOICE [CHOICE ...]

Print a random choice, using @ref{1435,,choice()}.
@end deffn

@geindex random 명령줄 옵션; -i
@geindex random 명령줄 옵션; --integer
@anchor{library/random cmdoption-random-i}@anchor{2b9e}
@deffn {Option} @w{-}i <N>
@anchor{library/random cmdoption-random-integer}@anchor{2b9f}
@deffnx {Option} @w{-}@w{-}integer <N>

Print a random integer between 1 and N inclusive, using @ref{1434,,randint()}.
@end deffn

@geindex random 명령줄 옵션; -f
@geindex random 명령줄 옵션; --float
@anchor{library/random cmdoption-random-f}@anchor{2ba0}
@deffn {Option} @w{-}f <N>
@anchor{library/random cmdoption-random-float}@anchor{2ba1}
@deffnx {Option} @w{-}@w{-}float <N>

Print a random floating-point number between 0 and N inclusive,
using @ref{2b89,,uniform()}.
@end deffn

If no options are given, the output depends on the input:


@itemize *

@item 
String or multiple: same as @ref{2b9d,,--choice}.

@item 
Integer: same as @ref{2b9f,,--integer}.

@item 
Float: same as @ref{2ba1,,--float}.
@end itemize

@node Command-line example,,Command-line usage<2>,random — 의사 난수 생성
@anchor{library/random command-line-example}@anchor{2ba2}@anchor{library/random random-cli-example}@anchor{2ba3}
@subsubsection Command-line example


Here are some examples of the @code{random} command-line interface:

@example
$ # 무작위로 하나를 선택합니다
$ python -m random egg bacon sausage spam "Lobster Thermidor aux crevettes with a Mornay sauce"
Lobster Thermidor aux crevettes with a Mornay sauce

$ # 정수 난수
$ python -m random 6
6

$ # 실수 난수
$ python -m random 1.8
1.7080016272295635

$ # 명시적 인자로
$ python  -m random --choice egg bacon sausage spam "Lobster Thermidor aux crevettes with a Mornay sauce"
egg

$ python -m random --integer 6
3

$ python -m random --float 1.8
1.5666339105010318

$ python -m random --integer 6
5

$ python -m random --float 6
3.1942323316565915
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node statistics — 수학 통계 함수,,random — 의사 난수 생성,숫자와 수학 모듈
@anchor{library/statistics doc}@anchor{2ba4}@anchor{library/statistics module-statistics}@anchor{d7}@anchor{library/statistics statistics-mathematical-statistics-functions}@anchor{2ba5}@anchor{library/statistics translation-repo}@anchor{2ba6}
@subsection @code{statistics} — 수학 통계 함수


@geindex module; statistics


Added in version 3.4.


`소스 코드:' Lib/statistics.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/statistics.py}

@c from statistics import *
@c import math
@c __name__ = '<doctest>'


__________________________________________________________________


이 모듈은 숫자 (@ref{25f3,,Real} 값) 데이터의 수학적 통계를 계산하는 함수를 제공합니다.

이 모듈은 NumPy@footnote{https://numpy.org}, SciPy@footnote{https://scipy.org/}와 같은 제삼자 라이브러리나 Minitab, SAS 및 Matlab과 같은 통계 전문가를 대상으로 하는 완전한 기능의 통계 패키지와 경쟁하기 위한 것이 아닙니다. 그래프를 그릴 수 있는 과학 계산기의 수준을 목표로 합니다.

달리 명시되지 않는 한, 이 함수는 @ref{19b,,int}, @ref{196,,float}, @ref{1fe,,decimal.Decimal} 및 @ref{213,,fractions.Fraction}을 지원합니다. 다른 형(숫자 계층에 있든 없든)에서의 동작은 현재 지원되지 않습니다. 여러 형의 컬렉션도 정의되지 않으며 구현에 따라 다릅니다. 입력 데이터가 혼합형으로 구성되었으면, @ref{19f,,map()}을 사용하여 일관된 결과를 보장 할 수 있습니다, 예를 들어 @code{map(float, input_data)}.

Some datasets use @code{NaN} (not a number) values to represent missing data.
Since NaNs have unusual comparison semantics, they cause surprising or
undefined behaviors in the statistics functions that sort data or that count
occurrences.  The functions affected are @code{median()}, @code{median_low()},
@code{median_high()}, @code{median_grouped()}, @code{mode()}, @code{multimode()}, and
@code{quantiles()}.  The @code{NaN} values should be stripped before calling these
functions:

@example
>>> from statistics import median
>>> from math import isnan
>>> from itertools import filterfalse

>>> data = [20.7, float('NaN'),19.2, 18.3, float('NaN'), 14.4]
>>> sorted(data)  # 놀라운 행동을 보입니다
[20.7, nan, 14.4, 18.3, 19.2, nan]
>>> median(data)  # 예상치 못한 결과입니다
16.35

>>> sum(map(isnan, data))    # 누락된 값의 수
2
>>> clean = list(filterfalse(isnan, data))  # NaN 값을 제거합니다
>>> clean
[20.7, 19.2, 18.3, 14.4]
>>> sorted(clean)  # 정렬이 이제 예상대로 작동합니다
[14.4, 18.3, 19.2, 20.7]
>>> median(clean)       # 이제 결과가 잘 정의됩니다
18.75
@end example

@menu
* 평균과 중심 위치의 측정:: 
* 분산 측정:: 
* Statistics for relations between two inputs:: 
* 함수 세부 사항:: 
* 예외: 예외<4>. 
* NormalDist 객체:: 
* 예제와 조리법: 예제와 조리법<2>. 

@end menu

@node 평균과 중심 위치의 측정,분산 측정,,statistics — 수학 통계 함수
@anchor{library/statistics averages-and-measures-of-central-location}@anchor{2ba7}
@subsubsection 평균과 중심 위치의 측정


이 함수는 모집단(population)이나 표본(sample)에서 평균이나 최빈값을 계산합니다.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

@ref{8e0,,mean()}

@tab

데이터의 산술 평균(arithmetic mean) ( “average”).

@item

@ref{c28,,fmean()}

@tab

빠른, 부동 소수점 산술 평균, 선택적 가중치 적용.

@item

@ref{c29,,geometric_mean()}

@tab

데이터의 기하 평균(geometric mean).

@item

@ref{edc,,harmonic_mean()}

@tab

데이터의 조화 평균(harmonic mean).

@item

@ref{552,,kde()}

@tab

Estimate the probability density distribution of the data.

@item

@ref{553,,kde_random()}

@tab

Random sampling from the PDF generated by kde().

@item

@ref{2ba8,,median()}

@tab

데이터의 중앙값(median) (중간값).

@item

@ref{2ba9,,median_low()}

@tab

데이터의 낮은 중앙값(low median).

@item

@ref{2baa,,median_high()}

@tab

데이터의 높은 중앙값(high median).

@item

@ref{2bab,,median_grouped()}

@tab

그룹화된 데이터의 중앙값 (50번째 백분위 수)

@item

@ref{c84,,mode()}

@tab

이산(discrete) 또는 범주(nominal) 데이터의 단일 최빈값(mode) (가장 흔한 값)

@item

@ref{c2a,,multimode()}

@tab

이산 또는 범주 데이터의 최빈값(mode) (가장 흔한 값) 리스트.

@item

@ref{c2b,,quantiles()}

@tab

데이터를 같은 확률을 갖는 구간으로 나눕니다.

@end multitable


@node 분산 측정,Statistics for relations between two inputs,평균과 중심 위치의 측정,statistics — 수학 통계 함수
@anchor{library/statistics measures-of-spread}@anchor{2bac}
@subsubsection 분산 측정


이 함수는 모집단이나 표본이 평균값에서 벗어나는 정도를 측정합니다.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

@ref{17b7,,pstdev()}

@tab

데이터의 모집단 표준 편차(population standard deviation).

@item

@ref{2bad,,pvariance()}

@tab

데이터의 모집단 분산(population variance).

@item

@ref{8e2,,stdev()}

@tab

데이터의 표본 표준 편차(sample standard deviation).

@item

@ref{8e1,,variance()}

@tab

데이터의 표본 분산(sample variance).

@end multitable


@node Statistics for relations between two inputs,함수 세부 사항,분산 측정,statistics — 수학 통계 함수
@anchor{library/statistics statistics-for-relations-between-two-inputs}@anchor{2bae}
@subsubsection Statistics for relations between two inputs


These functions calculate statistics regarding relations between two inputs.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

@ref{a31,,covariance()}

@tab

두 변수의 표본 공분산.

@item

@ref{6e2,,correlation()}

@tab

Pearson and Spearman’s correlation coefficients.

@item

@ref{a32,,linear_regression()}

@tab

Slope and intercept for simple linear regression.

@end multitable


@node 함수 세부 사항,예외<4>,Statistics for relations between two inputs,statistics — 수학 통계 함수
@anchor{library/statistics function-details}@anchor{2baf}
@subsubsection 함수 세부 사항


참고: 함수에 전달되는 데이터가 정렬될 필요는 없습니다. 하지만, 읽기 쉽도록 대부분 예제는 정렬된 시퀀스를 보여줍니다.

@geindex mean() (statistics 모듈)
@anchor{library/statistics statistics mean}@anchor{8e0}
@deffn {함수} statistics.mean (data)

시퀀스나 이터러블일 수 있는 `data'의 표본 산술 평균을 반환합니다.

산술 평균은 데이터의 합을 데이터 포인트 수로 나눈 값입니다. 흔히 “평균”이라고 합니다만, 많은 수학적 평균 중 하나일 뿐입니다. 데이터의 중심 위치에 대한 측정(measure)입니다.

`data'가 비어 있으면, @ref{2bb0,,StatisticsError}가 발생합니다.

사용 예:

@example
>>> mean([1, 2, 3, 4, 4])
2.8
>>> mean([-1.0, 2.5, 3.25, 5.75])
2.625

>>> from fractions import Fraction as F
>>> mean([F(3, 7), F(1, 21), F(5, 3), F(1, 3)])
Fraction(13, 21)

>>> from decimal import Decimal as D
>>> mean([D("0.5"), D("0.75"), D("0.625"), D("0.375")])
Decimal('0.5625')
@end example

@cartouche
@quotation 참고 
평균은 특이치@footnote{https://en.wikipedia.org/wiki/Outlier}의 영향을 많이 받으며, 반드시 데이터 포인트의 전형적인 예는 아닙니다. 비록 효율성은 떨어지지만, 더 강인한, 중심 경향성@footnote{https://en.wikipedia.org/wiki/Central_tendency}의 측정은, @ref{2ba8,,median()}을 참조하십시오.

표본 평균은 실제 모집단 평균의 편향되지 않은(unbiased) 추정치를 제공합니다. 즉, 가능한 모든 표본에 대해 평균을 취하면, @code{mean(sample)}은 전체 모집단의 실제 평균에 수렴합니다. `data'가 표본이 아닌 전체 모집단을 나타낸다면, @code{mean(data)}는 실제 모집단 평균 μ를 계산하는 것과 동등합니다.
@end quotation
@end cartouche
@end deffn

@geindex fmean() (statistics 모듈)
@anchor{library/statistics statistics fmean}@anchor{c28}
@deffn {함수} statistics.fmean (data, weights=None)

`data'를 float로 변환하고 산술 평균을 계산합니다.

@ref{8e0,,mean()} 함수보다 빠르게 실행되며 항상 @ref{196,,float}를 반환합니다. `data'는 시퀀스나 이터러블일 수 있습니다. 입력 data가 비어 있으면 @ref{2bb0,,StatisticsError}를 발생시킵니다.

@example
>>> fmean([3.5, 4.0, 5.25])
4.25
@end example

Optional weighting is supported.  For example, a professor assigns a
grade for a course by weighting quizzes at 20%, homework at 20%, a
midterm exam at 30%, and a final exam at 30%:

@example
>>> grades = [85, 92, 83, 91]
>>> weights = [0.20, 0.20, 0.30, 0.30]
>>> fmean(grades, weights)
87.6
@end example

If `weights' is supplied, it must be the same length as the `data' or
a @ref{2ec,,ValueError} will be raised.


Added in version 3.8.



버전 3.11에서 변경: Added support for `weights'.

@end deffn

@geindex geometric_mean() (statistics 모듈)
@anchor{library/statistics statistics geometric_mean}@anchor{c29}
@deffn {함수} statistics.geometric_mean (data)

`data'를 float로 변환하고 기하 평균(geometric mean)을 계산합니다.

기하 평균은 값의 곱을 사용하는 `data'의 중심 경향(central tendency)이나 대표값(typical value)을 나타냅니다 (합을 사용하는 산술 평균과 달리).

입력 data가 비어 있거나, 0을 포함하거나, 음수 값을 포함하면 @ref{2bb0,,StatisticsError}를 발생시킵니다. `data'는 시퀀스나 이터러블일 수 있습니다.

정확한 결과를 얻기 위해 특별한 노력을 기울이지는 않습니다. (하지만, 향후 변경될 수 있습니다.)

@example
>>> round(geometric_mean([54, 24, 36]), 1)
36.0
@end example


Added in version 3.8.

@end deffn

@geindex harmonic_mean() (statistics 모듈)
@anchor{library/statistics statistics harmonic_mean}@anchor{edc}
@deffn {함수} statistics.harmonic_mean (data, weights=None)

실숫값 숫자의 시퀀스나 이터러블인 `data'의 조화 평균(harmonic mean)을 반환합니다. `weights'가 생략되거나 @code{None}이면, 균등 가중치를 가정합니다.

조화 평균은 데이터의 역수의 산술 @ref{8e0,,mean()}의 역수입니다. 예를 들어, 세 `a', `b' 및 `c' 값의 조화 평균은 @code{3/(1/a + 1/b + 1/c)}와 동등합니다. 값 중 하나가 0이면, 결과는 0입니다.

조화 평균은 데이터의 중심 위치의 측정인 평균의 한가지 유형입니다. 예를 들어 속도와 같은 비율(ratio)이나 율(rate)을 평균할 때 종종 적합합니다.

자동차가 40km/hr로 10km를 주행한 다음, 60km/hr로 10km를 주행한다고 가정해 봅시다. 평균 속도는 얼마입니까?

@example
>>> harmonic_mean([40, 60])
48.0
@end example

Suppose a car travels 40 km/hr for 5 km, and when traffic clears,
speeds-up to 60 km/hr for the remaining 30 km of the journey. What
is the average speed?

@example
>>> harmonic_mean([40, 60], weights=[5, 30])
56.0
@end example

`data'가 비어 있거나, 0보다 작은 값이 있거나, 가중 합이 양수가 아니면 @ref{2bb0,,StatisticsError}가 발생합니다.

현재 알고리즘은 입력에서 0을 만나면 조기 종료됩니다. 이는 후속 입력의 유효성을 검사하지 않았음을 의미합니다. (이 동작은 나중에 변경될 수 있습니다.)


Added in version 3.6.



버전 3.10에서 변경: Added support for `weights'.

@end deffn

@geindex kde() (statistics 모듈)
@anchor{library/statistics statistics kde}@anchor{552}
@deffn {함수} statistics.kde (data, h, kernel='normal', *, cumulative=False)

Kernel Density Estimation (KDE)@footnote{https://www.itm-conferences.org/articles/itmconf/pdf/2018/08/itmconf_sam2018_00037.pdf}:
Create a continuous probability density function or cumulative
distribution function from discrete samples.

The basic idea is to smooth the data using a kernel function@footnote{https://en.wikipedia.org/wiki/Kernel_(statistics)}.
to help draw inferences about a population from a sample.

The degree of smoothing is controlled by the scaling parameter `h'
which is called the bandwidth.  Smaller values emphasize local
features while larger values give smoother results.

The `kernel' determines the relative weights of the sample data
points.  Generally, the choice of kernel shape does not matter
as much as the more influential bandwidth smoothing parameter.

Kernels that give some weight to every sample point include
`normal' (`gauss'), `logistic', and `sigmoid'.

Kernels that only give weight to sample points within the bandwidth
include `rectangular' (`uniform'), `triangular', `parabolic'
(`epanechnikov'), `quartic' (`biweight'), `triweight', and `cosine'.

If `cumulative' is true, will return a cumulative distribution function.

`data' 시퀀스가 비어 있으면 @ref{2bb0,,StatisticsError}를 발생시킵니다.

Wikipedia has an example@footnote{https://en.wikipedia.org/wiki/Kernel_density_estimation#Example}
where we can use @code{kde()} to generate and plot a probability
density function estimated from a small sample:

@example
>>> sample = [-2.1, -1.3, -0.4, 1.9, 5.1, 6.2]
>>> f_hat = kde(sample, h=1.5)
>>> xarr = [i/100 for i in range(-750, 1100)]
>>> yarr = [f_hat(x) for x in xarr]
@end example

The points in @code{xarr} and @code{yarr} can be used to make a PDF plot:

@image{python-figures/kde_example,,,Scatter plot of the estimated probability density function.,png}


Added in version 3.13.

@end deffn

@geindex kde_random() (statistics 모듈)
@anchor{library/statistics statistics kde_random}@anchor{553}
@deffn {함수} statistics.kde_random (data, h, kernel='normal', *, seed=None)

Return a function that makes a random selection from the estimated
probability density function produced by @code{kde(data, h, kernel)}.

Providing a `seed' allows reproducible selections. In the future, the
values may change slightly as more accurate kernel inverse CDF estimates
are implemented.  The seed may be an integer, float, str, or bytes.

`data' 시퀀스가 비어 있으면 @ref{2bb0,,StatisticsError}를 발생시킵니다.

Continuing the example for @ref{552,,kde()}, we can use
@code{kde_random()} to generate new random selections from an
estimated probability density function:

@example
>>> data = [-2.1, -1.3, -0.4, 1.9, 5.1, 6.2]
>>> rand = kde_random(data, h=1.5, seed=8675309)
>>> new_selections = [rand() for i in range(10)]
>>> [round(x, 1) for x in new_selections]
[0.7, 6.2, 1.2, 6.9, 7.0, 1.8, 2.5, -0.5, -1.8, 5.6]
@end example


Added in version 3.13.

@end deffn

@geindex median() (statistics 모듈)
@anchor{library/statistics statistics median}@anchor{2ba8}
@deffn {함수} statistics.median (data)

일반적인 “중간 2개의 평균” 방법을 사용하여, 숫자 data의 중앙값(중간값)을 반환합니다. `data'가 비어 있으면, @ref{2bb0,,StatisticsError}가 발생합니다. `data'는 시퀀스나 이터러블일 수 있습니다.

중앙값은 중심 위치에 대한 강인한 측정이며, 특이치가 있을 때 영향을 덜 받습니다. 데이터 포인트 수가 홀수면, 가운데 데이터 포인트가 반환됩니다:

@example
>>> median([1, 3, 5])
3
@end example

데이터 포인트 수가 짝수면, 중앙값은 두 가운데 값의 평균을 취하여 보간됩니다:

@example
>>> median([1, 3, 5, 7])
4.0
@end example

데이터가 이산(discrete)적이고, 중앙값이 실제 데이터 포인트가 아니라도 상관없을 때 적합합니다.

데이터가 순서는 있지만 (대소 비교 지원) 숫자가 아니면 (덧셈을 지원하지 않음), 대신 @ref{2ba9,,median_low()}나 @ref{2baa,,median_high()}를 사용하는 것을 고려하십시오.
@end deffn

@geindex median_low() (statistics 모듈)
@anchor{library/statistics statistics median_low}@anchor{2ba9}
@deffn {함수} statistics.median_low (data)

숫자 데이터의 낮은 중앙값을 반환합니다. `data'가 비어 있으면 @ref{2bb0,,StatisticsError}가 발생합니다. `data'는 시퀀스나 이터러블일 수 있습니다.

낮은 중앙값은 항상 데이터 세트의 멤버입니다. 데이터 포인트 수가 홀수이면 중간값이 반환됩니다. 짝수이면, 두 중간값 중 작은 값이 반환됩니다.

@example
>>> median_low([1, 3, 5])
3
>>> median_low([1, 3, 5, 7])
3
@end example

데이터가 이산(discrete)적이고 보간된 값이 아닌 실제 데이터 포인트를 중앙값으로 선호할 때 낮은 중앙값을 사용하십시오.
@end deffn

@geindex median_high() (statistics 모듈)
@anchor{library/statistics statistics median_high}@anchor{2baa}
@deffn {함수} statistics.median_high (data)

데이터의 높은 중앙값을 반환합니다. `data'가 비어 있으면 @ref{2bb0,,StatisticsError}가 발생합니다. `data'는 시퀀스나 이터러블일 수 있습니다.

높은 중앙값은 항상 데이터 세트의 멤버입니다. 데이터 포인트 수가 홀수이면 중간값이 반환됩니다. 짝수이면, 두 중간값 중 큰 값이 반환됩니다.

@example
>>> median_high([1, 3, 5])
3
>>> median_high([1, 3, 5, 7])
5
@end example

데이터가 이산(discrete)적이고 보간된 값이 아닌 실제 데이터 포인트를 중앙값으로 선호할 때 높은 중앙값을 사용하십시오.
@end deffn

@geindex median_grouped() (statistics 모듈)
@anchor{library/statistics statistics median_grouped}@anchor{2bab}
@deffn {함수} statistics.median_grouped (data, interval=1.0)

Estimates the median for numeric data that has been grouped or binned@footnote{https://en.wikipedia.org/wiki/Data_binning} around the midpoints
of consecutive, fixed-width intervals.

The `data' can be any iterable of numeric data with each value being
exactly the midpoint of a bin.  At least one value must be present.

The `interval' is the width of each bin.

For example, demographic information may have been summarized into
consecutive ten-year age groups with each group being represented
by the 5-year midpoints of the intervals:

@example
>>> from collections import Counter
>>> demographics = Counter(@{
...    25: 172,   # 20 에서 30 세
...    35: 484,   # 30 에서 40 세
...    45: 387,   # 40 에서 50 세
...    55:  22,   # 50 에서 60 세
...    65:   6,   # 60 에서 70 세
... @})
...
@end example

The 50th percentile (median) is the 536th person out of the 1071
member cohort.  That person is in the 30 to 40 year old age group.

The regular @ref{2ba8,,median()} function would assume that everyone in the
tricenarian age group was exactly 35 years old.  A more tenable
assumption is that the 484 members of that age group are evenly
distributed between 30 and 40.  For that, we use
@code{median_grouped()}:

@example
>>> data = list(demographics.elements())
>>> median(data)
35
>>> round(median_grouped(data, interval=10), 1)
37.5
@end example

The caller is responsible for making sure the data points are separated
by exact multiples of `interval'.  This is essential for getting a
correct result.  The function does not check this precondition.

Inputs may be any numeric type that can be coerced to a float during
the interpolation step.
@end deffn

@geindex mode() (statistics 모듈)
@anchor{library/statistics statistics mode}@anchor{c84}
@deffn {함수} statistics.mode (data)

이산(discrete)적이거나 범주(nominal)적인 `data'에서 가장 흔한 단일 데이터 포인트를 반환합니다. 최빈값(mode)은 (존재할 때) 가장 흔한 값이며 중심 위치의 측정으로 기능합니다.

같은 빈도의 여러 최빈값이 있으면, `data'에서 처음 발견된 첫 번째 값을 반환합니다. 여러 최빈값 중 가장 작거나 가장 큰 값이 필요하면 대신 @code{min(multimode(data))}나 @code{max(multimode(data))}를 사용하십시오. 입력 `data'가 비어 있으면, @ref{2bb0,,StatisticsError}가 발생합니다.

@code{mode}는 이산 데이터를 가정하고 단일 값을 반환합니다. 이것이 학교에서 일반적으로 가르치는 최빈값의 표준적인 처리입니다:

@example
>>> mode([1, 1, 2, 3, 3, 3, 3, 4])
3
@end example

최빈값은 범주(nominal)적 (숫자가 아닌) 데이터에도 적용되는 이 패키지에 있는 유일한 통계라는 점에서 특별합니다:

@example
>>> mode(["red", "blue", "blue", "red", "green", "red", "red"])
'red'
@end example

Only hashable inputs are supported.  To handle type @ref{184,,set},
consider casting to @ref{7f1,,frozenset}.  To handle type @ref{24d,,list},
consider casting to @ref{610,,tuple}.  For mixed or nested inputs, consider
using this slower quadratic algorithm that only depends on equality tests:
@code{max(data, key=data.count)}.


버전 3.8에서 변경: 이제 첫 번째 최빈값을 모드를 반환하여 다봉(multimodal) 데이터 세트를 처리합니다. 이전에는, 둘 이상의 최빈값이 발견되면 @ref{2bb0,,StatisticsError}가 발생했습니다.

@end deffn

@geindex multimode() (statistics 모듈)
@anchor{library/statistics statistics multimode}@anchor{c2a}
@deffn {함수} statistics.multimode (data)

`data'에서 먼저 발견되는 순서대로 가장 자주 등장하는 값의 리스트를 반환합니다. 여러 최빈값이 있으면 둘 이상의 결과를 반환하고, `data'가 비어 있으면 빈 리스트를 반환합니다:

@example
>>> multimode('aabbbbccddddeeffffgg')
['b', 'd', 'f']
>>> multimode('@w{'})
[]
@end example


Added in version 3.8.

@end deffn

@geindex pstdev() (statistics 모듈)
@anchor{library/statistics statistics pstdev}@anchor{17b7}
@deffn {함수} statistics.pstdev (data, mu=None)

모집단 표준 편차(모집단 분산의 제곱근)를 반환합니다. 인자와 기타 세부 사항은 @ref{2bad,,pvariance()}를 참조하십시오.

@example
>>> pstdev([1.5, 2.5, 2.5, 2.75, 3.25, 4.75])
0.986893273527251
@end example
@end deffn

@geindex pvariance() (statistics 모듈)
@anchor{library/statistics statistics pvariance}@anchor{2bad}
@deffn {함수} statistics.pvariance (data, mu=None)

실수 숫자의 비어있지 않은 시퀀스나 이터러블인 `data'의 모집단 분산을 반환합니다. 분산(또는 평균에 대한 이차 모멘트)은 데이터 변동성(퍼진 정도)의 측정입니다. 큰 분산은 데이터가 퍼져 있음을 나타냅니다; 작은 분산은 평균 주변에 군집되어 있음을 나타냅니다.

선택적 두 번째 인자 `mu'가 제공되면, `data'의 `모집단' 평균이어야 합니다. 평균이 아닌 점을 기준으로 이차 모멘트를 계산하는 데에도 사용할 수 있습니다. 누락되었거나 @code{None}(기본값)이면, 산술 평균이 자동으로 계산됩니다.

이 함수를 사용하여 전체 모집단의 분산을 계산하십시오. 표본으로 분산을 추정하려면, 일반적으로 @ref{8e1,,variance()} 함수가 더 좋은 선택입니다.

`data'가 비어 있으면 @ref{2bb0,,StatisticsError}를 발생시킵니다.

예:

@example
>>> data = [0.0, 0.25, 0.25, 1.25, 1.5, 1.75, 2.75, 3.25]
>>> pvariance(data)
1.25
@end example

데이터의 평균을 이미 계산했다면, 재계산을 피하고자 선택적인 두 번째 인자 `mu'로 전달할 수 있습니다:

@example
>>> mu = mean(data)
>>> pvariance(data, mu)
1.25
@end example

Decimal과 Fraction이 지원됩니다:

@example
>>> from decimal import Decimal as D
>>> pvariance([D("27.5"), D("30.25"), D("30.25"), D("34.5"), D("41.75")])
Decimal('24.815')

>>> from fractions import Fraction as F
>>> pvariance([F(1, 4), F(5, 4), F(1, 2)])
Fraction(13, 72)
@end example

@cartouche
@quotation 참고 
전체 모집단으로 호출하면, 모집단 분산 σ²을 줍니다. 대신 표본으로 호출하면, 편향된(biased) 표본 분산 s²이 됩니다, N 자유도의 분산이라고도 합니다.

실제 모집단 평균 μ를 어떻게든 알고 있다면, 알려진 모집단 평균을 두 번째 인자로 지정해서, 이 함수를 사용하여 표본의 분산을 계산할 수 있습니다. 데이터 포인트가 모집단의 무작위 표본이면, 결과는 모집단 분산의 편향 없는(unbiased) 추정치가 됩니다.
@end quotation
@end cartouche
@end deffn

@geindex stdev() (statistics 모듈)
@anchor{library/statistics statistics stdev}@anchor{8e2}
@deffn {함수} statistics.stdev (data, xbar=None)

표본 표준 편차(표본 분산의 제곱근)를 반환합니다. 인자와 기타 세부 사항은 @ref{8e1,,variance()}를 참조하십시오.

@example
>>> stdev([1.5, 2.5, 2.5, 2.75, 3.25, 4.75])
1.0810874155219827
@end example
@end deffn

@geindex variance() (statistics 모듈)
@anchor{library/statistics statistics variance}@anchor{8e1}
@deffn {함수} statistics.variance (data, xbar=None)

적어도 두 개의 실수 숫자를 제공하는 이터러블인 `data'의 표본 분산을 반환합니다. 분산(또는 평균에 대한 이차 모멘트)은 데이터 변동성(퍼진 정도)의 측정입니다. 큰 분산은 데이터가 퍼져 있음을 나타냅니다; 작은 분산은 평균 주변에 군집되어 있음을 나타냅니다.

선택적 두 번째 인자 `xbar'가 제공되면, `data'의 `표본' 평균이어야 합니다. 누락되었거나 @code{None}(기본값)이면, 평균은 자동으로 계산됩니다.

데이터가 모집단의 표본이면 이 함수를 사용하십시오. 전체 모집단의 분산을 계산하려면, @ref{2bad,,pvariance()}를 참조하십시오.

`data'의 두 개 미만의 값을 갖고 있으면 @ref{2bb0,,StatisticsError}를 발생시킵니다.

예:

@example
>>> data = [2.75, 1.75, 1.25, 0.25, 0.5, 1.25, 3.5]
>>> variance(data)
1.3720238095238095
@end example

데이터의 표본 평균을 이미 계산했다면, 재계산을 피하고자 선택적인 두 번째 인자 `xbar'로 전달할 수 있습니다:

@example
>>> m = mean(data)
>>> variance(data, m)
1.3720238095238095
@end example

이 함수는 실제 평균을 `xbar'로 전달했는지 확인하지 않습니다. `xbar'에 임의의 값을 사용하면 결과가 유효하지 않거나 불가능한 값일 수 있습니다.

Decimal과 Fraction 값이 지원됩니다:

@example
>>> from decimal import Decimal as D
>>> variance([D("27.5"), D("30.25"), D("30.25"), D("34.5"), D("41.75")])
Decimal('31.01875')

>>> from fractions import Fraction as F
>>> variance([F(1, 6), F(1, 2), F(5, 3)])
Fraction(67, 108)
@end example

@cartouche
@quotation 참고 
이것은 베셀 보정(Bessel’s correction)을 적용한 표본 분산 s² 입니다, N-1 자유도의 분산이라고도 합니다. 데이터 포인트가 대표적(예를 들어, 독립적이고 동일하게 분포된)이라면, 결과는 실제 모집단 분산의 편향 없는(unbiased) 추정치가 되어야 합니다.

실제 모집단 평균 μ를 어떻게든 알고 있다면 `mu' 매개 변수로 @ref{2bad,,pvariance()} 함수에 전달하여 표본의 분산을 구해야 합니다.
@end quotation
@end cartouche
@end deffn

@geindex quantiles() (statistics 모듈)
@anchor{library/statistics statistics quantiles}@anchor{c2b}
@deffn {함수} statistics.quantiles (data, *, n=4, method='exclusive')

`data'를 같은 확률을 갖는 `n' 개의 연속 구간으로 나눕니다. 구간을 분할하는 @code{n - 1}개의 절단 점(cut point) 리스트를 반환합니다.

사분위는 `n'을 4로 설정하십시오 (기본값). 십분위는 `n'을 10으로 설정하십시오. 백분위는 `n'을 100으로 설정하십시오. 그러면 `data'를 100개의 같은 크기 그룹으로 분할하는 99개의 절단 점이 제공됩니다. `n'이 1 미만이면 @ref{2bb0,,StatisticsError}를 발생시킵니다.

`data'는 표본 데이터를 포함하는 모든 이터러블일 수 있습니다. 의미 있는 결과를 얻으려면, `data'의 데이터 포인트 수가 `n'보다 커야 합니다. 최소한 하나의 데이터 포인트도 없으면 @ref{2bb0,,StatisticsError}를 발생시킵니다.

절단 점은 가장 가까운 두 개의 데이터 포인트에서 선형 보간됩니다. 예를 들어, 절단 점이 두 표본 값 @code{100}과 @code{112} 사이의 거리로 1/3 지점에 해당하면, 절단 점은 @code{104}로 평가됩니다.

균등 분위(quantile) 계산 방법(`method')은 `data'가 모집단에서 가능한 최젓값과 최곳값을 포함하는지 제외하는지에 따라 달라질 수 있습니다.

기본 `method'는 “exclusive”이며, 표본에서 발견되는 것보다 더 극단적인 값을 가질 수 있는 모집단에서 표본 추출된 데이터에 사용됩니다. `m' 개의 정렬된 데이터 포인트의 `i-번째' 아래로 떨어지는 모집단 부분은 @code{i / (m + 1)}로 계산됩니다. 9개의 표본 값을 주면, 이 방법은 그들을 정렬한 다음, 다음과 같은 백분위를 할당합니다: 10%, 20%, 30%, 40%, 50%, 60%, 70%, 80%, 90%.

`method'를 “inclusive”로 설정하는 것은 모집단 데이터를 기술하거나 모집단의 가장 극단적인 값을 포함하는 것으로 알려진 표본에 사용됩니다. `data'의 최솟값은 0번째 백분위 수로 취급되고 최댓값은 100번째 백분위 수로 취급됩니다. `m' 개의 정렬된 데이터 포인트의 `i-번째' 아래로 떨어지는 모집단 부분은 @code{(i - 1) / (m - 1)}로 계산됩니다. 11개의 표본 값을 주면, 이 방법은 그들을 정렬한 다음, 다음과 같은 백분위를 할당합니다: 0%, 10%, 20%, 30%, 40%, 50%, 60%, 70%, 80%, 90%, 100%.

@example
# 경험적으로 표본 추출된 데이터에 대한 십 분위 절단 점
>>> data = [105, 129, 87, 86, 111, 111, 89, 81, 108, 92, 110,
...         100, 75, 105, 103, 109, 76, 119, 99, 91, 103, 129,
...         106, 101, 84, 111, 74, 87, 86, 103, 103, 106, 86,
...         111, 75, 87, 102, 121, 111, 88, 89, 101, 106, 95,
...         103, 107, 101, 81, 109, 104]
>>> [round(q, 1) for q in quantiles(data, n=10)]
[81.0, 86.2, 89.0, 99.4, 102.5, 103.6, 106.0, 109.8, 111.0]
@end example


Added in version 3.8.



버전 3.13에서 변경: No longer raises an exception for an input with only a single data point.
This allows quantile estimates to be built up one sample point
at a time becoming gradually more refined with each new data point.

@end deffn

@geindex covariance() (statistics 모듈)
@anchor{library/statistics statistics covariance}@anchor{a31}
@deffn {함수} statistics.covariance (x, y, /)

Return the sample covariance of two inputs `x' and `y'. Covariance
is a measure of the joint variability of two inputs.

Both inputs must be of the same length (no less than two), otherwise
@ref{2bb0,,StatisticsError} is raised.

예:

@example
>>> x = [1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> y = [1, 2, 3, 1, 2, 3, 1, 2, 3]
>>> covariance(x, y)
0.75
>>> z = [9, 8, 7, 6, 5, 4, 3, 2, 1]
>>> covariance(x, z)
-7.5
>>> covariance(z, x)
-7.5
@end example


Added in version 3.10.

@end deffn

@geindex correlation() (statistics 모듈)
@anchor{library/statistics statistics correlation}@anchor{6e2}
@deffn {함수} statistics.correlation (x, y, /, *, method='linear')

Return the Pearson's correlation coefficient@footnote{https://en.wikipedia.org/wiki/Pearson_correlation_coefficient}
for two inputs. Pearson’s correlation coefficient `r' takes values
between -1 and +1. It measures the strength and direction of a linear
relationship.

If `method' is “ranked”, computes Spearman's rank correlation coefficient@footnote{https://en.wikipedia.org/wiki/Spearman%27s_rank_correlation_coefficient}
for two inputs. The data is replaced by ranks.  Ties are averaged so that
equal values receive the same rank.  The resulting coefficient measures the
strength of a monotonic relationship.

Spearman’s correlation coefficient is appropriate for ordinal data or for
continuous data that doesn’t meet the linear proportion requirement for
Pearson’s correlation coefficient.

Both inputs must be of the same length (no less than two), and need
not to be constant, otherwise @ref{2bb0,,StatisticsError} is raised.

Example with Kepler's laws of planetary motion@footnote{https://en.wikipedia.org/wiki/Kepler's_laws_of_planetary_motion}:

@example
>>> # 수성, 금성, 지구, 화성, 목성, 토성, 천왕성 및  해왕성
>>> orbital_period = [88, 225, 365, 687, 4331, 10_756, 30_687, 60_190]    # days
>>> dist_from_sun = [58, 108, 150, 228, 778, 1_400, 2_900, 4_500] # million km

>>> # 완벽한 단조 관계가 존재함을 보입니다
>>> correlation(orbital_period, dist_from_sun, method='ranked')
1.0

>>> # 선형 관계가 불완전함을 관찰합니다
>>> round(correlation(orbital_period, dist_from_sun), 4)
0.9882

>>> # 케플러의 제3법칙을 시연합니다: 궤도 주기의 제곱과
>>> # 태양으로부터의 거리 세제곱 간에 선형 상관관계가
>>> # 존재합니다.
>>> period_squared = [p * p for p in orbital_period]
>>> dist_cubed = [d * d * d for d in dist_from_sun]
>>> round(correlation(period_squared, dist_cubed), 4)
1.0
@end example


Added in version 3.10.



버전 3.12에서 변경: Added support for Spearman’s rank correlation coefficient.

@end deffn

@geindex linear_regression() (statistics 모듈)
@anchor{library/statistics statistics linear_regression}@anchor{a32}
@deffn {함수} statistics.linear_regression (x, y, /, *, proportional=False)

Return the slope and intercept of simple linear regression@footnote{https://en.wikipedia.org/wiki/Simple_linear_regression}
parameters estimated using ordinary least squares. Simple linear
regression describes the relationship between an independent variable `x' and
a dependent variable `y' in terms of this linear function:

@quotation

`y = slope * x + intercept + noise'
@end quotation

where @code{slope} and @code{intercept} are the regression parameters that are
estimated, and @code{noise} represents the
variability of the data that was not explained by the linear regression
(it is equal to the difference between predicted and actual values
of the dependent variable).

Both inputs must be of the same length (no less than two), and
the independent variable `x' cannot be constant;
otherwise a @ref{2bb0,,StatisticsError} is raised.

For example, we can use the release dates of the Monty Python films@footnote{https://en.wikipedia.org/wiki/Monty_Python#Films}
to predict the cumulative number of Monty Python films
that would have been produced by 2019
assuming that they had kept the pace.

@example
>>> year = [1971, 1975, 1979, 1982, 1983]
>>> films_total = [1, 2, 3, 4, 5]
>>> slope, intercept = linear_regression(year, films_total)
>>> round(slope * 2019 + intercept)
16
@end example

If `proportional' is true, the independent variable `x' and the
dependent variable `y' are assumed to be directly proportional.
The data is fit to a line passing through the origin.
Since the `intercept' will always be 0.0, the underlying linear
function simplifies to:

@quotation

`y = slope * x + noise'
@end quotation

Continuing the example from @ref{6e2,,correlation()}, we look to see
how well a model based on major planets can predict the orbital
distances for dwarf planets:

@example
>>> model = linear_regression(period_squared, dist_cubed, proportional=True)
>>> slope = model.slope

>>> # 왜행성:             명왕성,    에리스,     마케마케,    하우메아,    세레스
>>> orbital_periods = [90_560, 204_199, 111_845, 103_410, 1_680]  # 일
>>> predicted_dist = [math.cbrt(slope * (p * p)) for p in orbital_periods]
>>> list(map(round, predicted_dist))
[5912, 10166, 6806, 6459, 414]

>>> [5_906, 10_152, 6_796, 6_450, 414]  # 백만 km 단위의 실제 거리
[5906, 10152, 6796, 6450, 414]
@end example


Added in version 3.10.



버전 3.11에서 변경: Added support for `proportional'.

@end deffn

@node 예외<4>,NormalDist 객체,함수 세부 사항,statistics — 수학 통계 함수
@anchor{library/statistics exceptions}@anchor{2bb1}
@subsubsection 예외


하나의 예외가 정의됩니다:

@geindex StatisticsError
@anchor{library/statistics statistics StatisticsError}@anchor{2bb0}
@deffn {예외} statistics.StatisticsError

통계 관련 예외를 위한 @ref{2ec,,ValueError}의 서브 클래스.
@end deffn

@node NormalDist 객체,예제와 조리법<2>,예외<4>,statistics — 수학 통계 함수
@anchor{library/statistics normaldist-objects}@anchor{2bb2}
@subsubsection @code{NormalDist} 객체


@ref{c2c,,NormalDist}는 무작위 변수@footnote{http://www.stat.yale.edu/Courses/1997-98/101/ranvar.htm}의 정규 분포를 만들고 조작하기 위한 도구입니다. 데이터 측정의 평균과 표준 편차를 단일 엔티티로 취급하는 클래스입니다.

정규 분포는 중심 극한 정리(Central Limit Theorem)@footnote{https://en.wikipedia.org/wiki/Central_limit_theorem}에서 도출되며 통계에서 광범위하게 응용됩니다.

@geindex NormalDist (statistics 클래스)
@anchor{library/statistics statistics NormalDist}@anchor{c2c}
@deffn {클래스} statistics.NormalDist (mu=0.0, sigma=1.0)

`mu'가 산술 평균@footnote{https://en.wikipedia.org/wiki/Arithmetic_mean}을 나타내고 `sigma'가 표준 편차@footnote{https://en.wikipedia.org/wiki/Standard_deviation}를 나타내는 새 `NormalDist' 객체를 반환합니다.

`sigma'가 음수이면 @ref{2bb0,,StatisticsError}를 발생시킵니다.

@geindex mean (statistics.NormalDist의 속성)
@anchor{library/statistics statistics NormalDist mean}@anchor{2bb3}
@deffn {속성} mean

정규 분포의 산술 평균@footnote{https://en.wikipedia.org/wiki/Arithmetic_mean}에 대한 읽기 전용 프로퍼티.
@end deffn

@geindex median (statistics.NormalDist의 속성)
@anchor{library/statistics statistics NormalDist median}@anchor{2bb4}
@deffn {속성} median

정규 분포의 중앙값@footnote{https://en.wikipedia.org/wiki/Median}에 대한 읽기 전용 프로퍼티.
@end deffn

@geindex mode (statistics.NormalDist의 속성)
@anchor{library/statistics statistics NormalDist mode}@anchor{2bb5}
@deffn {속성} mode

정규 분포의 최빈값@footnote{https://en.wikipedia.org/wiki/Mode_(statistics)}에 대한 읽기 전용 프로퍼티.
@end deffn

@geindex stdev (statistics.NormalDist의 속성)
@anchor{library/statistics statistics NormalDist stdev}@anchor{2bb6}
@deffn {속성} stdev

정규 분포의 표준 편차@footnote{https://en.wikipedia.org/wiki/Standard_deviation}에 대한 읽기 전용 프로퍼티.
@end deffn

@geindex variance (statistics.NormalDist의 속성)
@anchor{library/statistics statistics NormalDist variance}@anchor{2bb7}
@deffn {속성} variance

정규 분포의 분산@footnote{https://en.wikipedia.org/wiki/Variance}에 대한 읽기 전용 프로퍼티. 표준 편차의 제곱과 같습니다.
@end deffn

@geindex from_samples() (statistics.NormalDist의 클래스 메서드)
@anchor{library/statistics statistics NormalDist from_samples}@anchor{2bb8}
@deffn {메서드} classmethod from_samples (data)

@ref{c28,,fmean()}과 @ref{8e2,,stdev()}를 사용해서 `data'에서 추정된 `mu'와 `sigma' 매개 변수로 정규 분포 인스턴스를 만듭니다.

`data'는 임의의 @ref{142c,,이터러블}일 수 있으며 @ref{196,,float} 형으로 변환될 수 있는 값으로 구성되어야 합니다. `data'가 두 개 이상의 값을 포함하지 않으면 @ref{2bb0,,StatisticsError}를 발생시키는데, 중심 값을 추정하는 데 적어도 한 점이 필요하고 분산을 추정하는 데 적어도 두 점이 필요하기 때문입니다.
@end deffn

@geindex samples() (statistics.NormalDist 메서드)
@anchor{library/statistics statistics NormalDist samples}@anchor{2bb9}
@deffn {메서드} samples (n, *, seed=None)

주어진 평균과 표준 편차로 `n' 개의 무작위 표본을 생성합니다. @ref{196,,float} 값의 @ref{24d,,list}를 반환합니다.

`seed'가 제공되면, 하부 난수 생성기의 새 인스턴스를 만듭니다. 이는 다중 스레딩 문맥에서도, 재현 가능한 결과를 만드는 데 유용합니다.


버전 3.13에서 변경.


Switched to a faster algorithm.  To reproduce samples from previous
versions, use @ref{1478,,random.seed()} and @ref{1bd6,,random.gauss()}.
@end deffn

@geindex pdf() (statistics.NormalDist 메서드)
@anchor{library/statistics statistics NormalDist pdf}@anchor{2bba}
@deffn {메서드} pdf (x)

확률 밀도 함수(pdf)@footnote{https://en.wikipedia.org/wiki/Probability_density_function}를 사용하여, 무작위 변수 `X'가 주어진 값 `x'에 가까울 상대적 가능도(likelihood)를 계산합니다. 수학적으로, 비율 @code{P(x <= X < x+dx) / dx}의 `dx'가 0으로 접근할 때의 극한값입니다.

상대적 가능도는 좁은 구간에 표본이 발생할 수 있는 확률을 구간의 너비로 나눈 값으로 계산됩니다 (그래서 “밀도”라고 합니다). 가능도는 다른 점에 상대적이기 때문에, @code{1.0}보다 클 수 있습니다.
@end deffn

@geindex cdf() (statistics.NormalDist 메서드)
@anchor{library/statistics statistics NormalDist cdf}@anchor{1855}
@deffn {메서드} cdf (x)

누적 분포 함수 (cdf)@footnote{https://en.wikipedia.org/wiki/Cumulative_distribution_function}를 사용하여, 무작위 변수 `X'가 `x'보다 작거나 같을 확률을 계산합니다. 수학적으로, @code{P(X <= x)}라고 씁니다.
@end deffn

@geindex inv_cdf() (statistics.NormalDist 메서드)
@anchor{library/statistics statistics NormalDist inv_cdf}@anchor{2bbb}
@deffn {메서드} inv_cdf (p)

분위 함수(quantile function)@footnote{https://en.wikipedia.org/wiki/Quantile_function}나 백분위 수(percent-point)@footnote{https://web.archive.org/web/20190203145224/https://www.statisticshowto.datasciencecentral.com/inverse-distribution-function/} 함수라고도 하는 역 누적 분포 함수를 계산합니다. 수학적으로, @code{x : P(X <= x) = p}라고 씁니다.

변수가 `x'보다 작거나 같을 확률이 주어진 확률 `p'와 같아지도록 하는 무작위 변수 `X'의 값 `x'를 찾습니다.
@end deffn

@geindex overlap() (statistics.NormalDist 메서드)
@anchor{library/statistics statistics NormalDist overlap}@anchor{2bbc}
@deffn {메서드} overlap (other)

두 정규 확률 분포 간의 일치를 측정합니다. 두 확률 밀도 함수가 겹치는 영역의 면적@footnote{https://www.rasch.org/rmt/rmt101r.htm}을 제공하는 0.0과 1.0 사이의 값을 반환합니다.
@end deffn

@geindex quantiles() (statistics.NormalDist 메서드)
@anchor{library/statistics statistics NormalDist quantiles}@anchor{2bbd}
@deffn {메서드} quantiles (n=4)

정규 분포를 같은 확률을 갖는 `n' 개의 연속 구간으로 나눕니다. 구간을 분할하는 (n - 1)개의 절단 점(cut point) 리스트를 반환합니다.

사분위는 `n'을 4로 설정하십시오 (기본값). 십분위는 `n'을 10으로 설정하십시오. 백분위는 `n'을 100으로 설정하십시오, 그러면 정규 분포를 100개의 같은 크기 그룹으로 분할하는 99개의 절단 점이 제공됩니다.
@end deffn

@geindex zscore() (statistics.NormalDist 메서드)
@anchor{library/statistics statistics NormalDist zscore}@anchor{2bbe}
@deffn {메서드} zscore (x)

정규 분포의 평균 위나 아래의 표준 편차 수로 `x'를 설명하는 표준 점수(Standard Score)@footnote{https://www.statisticshowto.com/probability-and-statistics/z-score/}를 계산합니다: @code{(x - mean) / stdev}.


Added in version 3.9.

@end deffn

@ref{c2c,,NormalDist}의 인스턴스는 상수에 의한 덧셈, 뺄셈, 곱셈 및 나눗셈을 지원합니다. 이러한 연산은 이동(translation)과 확대(scaling)에 사용됩니다. 예를 들면:

@example
>>> temperature_february = NormalDist(5, 2.5)             # 섭씨
>>> temperature_february * (9/5) + 32                     # 화씨
NormalDist(mu=41.0, sigma=4.5)
@end example

상수를 @ref{c2c,,NormalDist}의 인스턴스로 나누는 것은 결과가 정규 분포가 되지 않기 때문에 지원되지 않습니다.

정규 분포는 독립 변수의 가산(additive) 효과에서 발생하므로, 두 독립된 정규 분포 무작위 변수를 더하고 빼는 것@footnote{https://en.wikipedia.org/wiki/Sum_of_normally_distributed_random_variables}은 @ref{c2c,,NormalDist}의 인스턴스로 나타낼 수 있습니다. 예를 들면:

@example
>>> birth_weights = NormalDist.from_samples([2.5, 3.1, 2.1, 2.4, 2.7, 3.5])
>>> drug_effects = NormalDist(0.4, 0.15)
>>> combined = birth_weights + drug_effects
>>> round(combined.mean, 1)
3.1
>>> round(combined.stdev, 1)
0.5
@end example


Added in version 3.8.

@end deffn

@node 예제와 조리법<2>,,NormalDist 객체,statistics — 수학 통계 함수
@anchor{library/statistics examples-and-recipes}@anchor{2bbf}
@subsubsection 예제와 조리법


@menu
* 고전적인 확률 문제:: 
* Monte Carlo inputs for simulations:: 
* Approximating binomial distributions:: 
* Naive bayesian classifier:: 

@end menu

@node 고전적인 확률 문제,Monte Carlo inputs for simulations,,예제와 조리법<2>
@anchor{library/statistics classic-probability-problems}@anchor{2bc0}
@subsubsection 고전적인 확률 문제


@ref{c2c,,NormalDist}는 고전적인 확률 문제를 쉽게 해결합니다.

예를 들어, 점수가 평균 1060이고 표준 편차가 195인 정규 분포를 보이는 SAT 시험의 역사적 데이터@footnote{https://nces.ed.gov/programs/digest/d17/tables/dt17_226.40.asp}를 줄 때, 시험 점수가 1100에서 1200 사이인 학생들의 백분율을 결정하십시오. 가장 가까운 정수로 반올림하십시오:

@example
>>> sat = NormalDist(1060, 195)
>>> fraction = sat.cdf(1200 + 0.5) - sat.cdf(1100 - 0.5)
>>> round(fraction * 100.0, 1)
18.4
@end example

SAT 점수의 사분위 수(quartiles)@footnote{https://en.wikipedia.org/wiki/Quartile}와 십분위 수(deciles)@footnote{https://en.wikipedia.org/wiki/Decile}를 찾으십시오:

@example
>>> list(map(round, sat.quantiles()))
[928, 1060, 1192]
>>> list(map(round, sat.quantiles(n=10)))
[810, 896, 958, 1011, 1060, 1109, 1162, 1224, 1310]
@end example

@node Monte Carlo inputs for simulations,Approximating binomial distributions,고전적인 확률 문제,예제와 조리법<2>
@anchor{library/statistics monte-carlo-inputs-for-simulations}@anchor{2bc1}
@subsubsection Monte Carlo inputs for simulations


분석적으로 풀기 쉽지 않은 모델의 분포를 추정하기 위해, @ref{c2c,,NormalDist}는 몬테카를로 시뮬레이션(Monte Carlo simulation)@footnote{https://en.wikipedia.org/wiki/Monte_Carlo_method}을 위한 입력 표본을 생성 할 수 있습니다:

@example
>>> def model(x, y, z):
...     return (3*x + 7*x*y - 5*y) / (11 * z)
...
>>> n = 100_000
>>> X = NormalDist(10, 2.5).samples(n, seed=3652260728)
>>> Y = NormalDist(15, 1.75).samples(n, seed=4582495471)
>>> Z = NormalDist(50, 1.25).samples(n, seed=6582483453)
>>> quantiles(map(model, X, Y, Z))
[1.4591308524824727, 1.8035946855390597, 2.175091447274739]
@end example

@node Approximating binomial distributions,Naive bayesian classifier,Monte Carlo inputs for simulations,예제와 조리법<2>
@anchor{library/statistics approximating-binomial-distributions}@anchor{2bc2}
@subsubsection Approximating binomial distributions


표본 크기가 크고 성공적인 시행의 확률이 50%에 가까울 때 정규 분포를 사용하여 이항 분포(Binomial distributions)@footnote{https://mathworld.wolfram.com/BinomialDistribution.html}를 근사할 수 있습니다.

예를 들어, 오픈 소스 회의에는 750명의 참석자와 500명 정원의 방 두 개가 있습니다. 파이썬과 루비에 대한 발표가 있습니다. 이전 회의에서는, 참석자의 65%가 파이썬 발표를 듣는 것을 선호했습니다. 모집단 선호도가 변경되지 않았다고 가정할 때, 파이썬 방이 정원 한도 내에 머무를 확률은 얼마입니까?

@example
>>> n = 750             # 표본 크기
>>> p = 0.65            # 파이썬 선호도
>>> q = 1.0 - p         # 루비 선호도
>>> k = 500             # 방 정원

>>> # 누적 정규 분포를 사용한 근사
>>> from math import sqrt
>>> round(NormalDist(mu=n*p, sigma=sqrt(n*p*q)).cdf(k + 0.5), 4)
0.8402

>>> # 누적 이항 분포를 사용한 정확한 해법
>>> from math import comb, fsum
>>> round(fsum(comb(n, r) * p**r * q**(n-r) for r in range(k+1)), 4)
0.8402

>>> # 시뮬레이션을 사용한 근사
>>> from random import seed, binomialvariate
>>> seed(8675309)
>>> mean(binomialvariate(n, p) <= k for i in range(10_000))
0.8406
@end example

@node Naive bayesian classifier,,Approximating binomial distributions,예제와 조리법<2>
@anchor{library/statistics naive-bayesian-classifier}@anchor{2bc3}
@subsubsection Naive bayesian classifier


정규 분포는 기계 학습 문제에서 흔히 등장합니다.

위키백과에는 나이브 베이즈 분류기(Naive Bayesian Classifier)의 멋진 예@footnote{https://en.wikipedia.org/wiki/Naive_Bayes_classifier#Person_classification}가 있습니다. 문제는 키, 몸무게 및 발 크기를 포함하는 정규 분포된 피처(feature)들로부터 사람의 성별을 예측하는 것입니다.

우리는 8명을 측정한 훈련 데이터 집합을 받았습니다. 측정값은 정규 분포로 가정되므로, @ref{c2c,,NormalDist}로 데이터를 요약합니다:

@example
>>> height_male = NormalDist.from_samples([6, 5.92, 5.58, 5.92])
>>> height_female = NormalDist.from_samples([5, 5.5, 5.42, 5.75])
>>> weight_male = NormalDist.from_samples([180, 190, 170, 165])
>>> weight_female = NormalDist.from_samples([100, 150, 130, 150])
>>> foot_size_male = NormalDist.from_samples([12, 11, 12, 10])
>>> foot_size_female = NormalDist.from_samples([6, 8, 7, 9])
@end example

다음으로, 피처 측정은 알려졌지만, 성별을 모르는 새로운 사람을 만납니다:

@example
>>> ht = 6.0        # 키
>>> wt = 130        # 몸무게
>>> fs = 8          # 발 크기
@end example

남성이나 여성일 50%의 사전 확률(prior probability)@footnote{https://en.wikipedia.org/wiki/Prior_probability}로 시작하여, 사전 확률에 주어진 성별이 피처 측정을 줄 우도(likelihood)를 곱해서 사후 확률(posterior)을 계산합니다.:

@example
>>> prior_male = 0.5
>>> prior_female = 0.5
>>> posterior_male = (prior_male * height_male.pdf(ht) *
...                   weight_male.pdf(wt) * foot_size_male.pdf(fs))

>>> posterior_female = (prior_female * height_female.pdf(ht) *
...                     weight_female.pdf(wt) * foot_size_female.pdf(fs))
@end example

최종 예측은 가장 큰 사후 확률(posterior)이 됩니다. 이것을 최대 사후 확률(maximum a posteriori)@footnote{https://en.wikipedia.org/wiki/Maximum_a_posteriori_estimation} 또는 MAP이라고 합니다.:

@example
>>> 'male' if posterior_male > posterior_female else 'female'
'female'
@end example

@c # This modelines must appear within the last ten lines of the file.
@c kate: indent-width 3; remove-trailing-space on; replace-tabs on; encoding utf-8;

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 함수형 프로그래밍 모듈,파일과 디렉터리 액세스,숫자와 수학 모듈,파이썬 표준 라이브러리
@anchor{library/functional doc}@anchor{2bc4}@anchor{library/functional functional-programming-modules}@anchor{2bc5}@anchor{library/functional translation-repo}@anchor{2bc6}
@section 함수형 프로그래밍 모듈


이 장에서 설명하는 모듈은 함수형 프로그래밍 스타일을 지원하는 함수 및 클래스와 콜러블에 대한 일반 연산을 제공합니다.

이 장에서는 다음 모듈에 관해 설명합니다:

@menu
* itertools — Functions creating iterators for efficient looping:: 
* functools — 고차 함수와 콜러블 객체에 대한 연산:: 
* operator — 함수로서의 표준 연산자:: 

@end menu

@node itertools — Functions creating iterators for efficient looping,functools — 고차 함수와 콜러블 객체에 대한 연산,,함수형 프로그래밍 모듈
@anchor{library/itertools doc}@anchor{2bc7}@anchor{library/itertools itertools-functions-creating-iterators-for-efficient-looping}@anchor{2bc8}@anchor{library/itertools module-itertools}@anchor{85}
@subsection @code{itertools} — Functions creating iterators for efficient looping


@geindex module; itertools

@c from itertools import *
@c import collections
@c import math
@c import operator
@c import random


__________________________________________________________________


이 모듈은 APL, Haskell 및 SML의 구성물들에서 영감을 얻은 여러 @ref{4ca,,이터레이터} 빌딩 블록을 구현합니다. 각각을 파이썬에 적합한 형태로 개선했습니다.

이 모듈은 자체적으로 혹은 조합하여 유용한 빠르고 메모리 효율적인 도구의 핵심 집합을 표준화합니다. 함께 모여, 순수 파이썬에서 간결하고 효율적으로 특수화된 도구를 구성할 수 있도록 하는 “이터레이터 대수(iterator algebra)”를 형성합니다.

예를 들어, SML은 테이블 화 도구를 제공합니다: 시퀀스 @code{f(0), f(1), ...}를 생성하는 @code{tabulate(f)}. @ref{19f,,map()}과 @ref{1488,,count()}를 결합하여 @code{map(f, count())}를 형성해서 파이썬에서도 같은 효과를 얻을 수 있습니다.

`General iterators:'


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

이터레이터

@tab

인자

@tab

결과

@tab

예

@item

@ref{bef,,accumulate()}

@tab

p [,func]

@tab

p0, p0+p1, p0+p1+p2, …

@tab

@code{accumulate([1,2,3,4,5]) → 1 3 6 10 15}

@item

@ref{510,,batched()}

@tab

p, n

@tab

(p0, p1, …, p_n-1), …

@tab

@code{batched('ABCDEFG', n=3) → ABC DEF G}

@item

@ref{25df,,chain()}

@tab

p, q, …

@tab

p0, p1, … plast, q0, q1, …

@tab

@code{chain('ABC', 'DEF') → A B C D E F}

@item

@ref{2bc9,,chain.from_iterable()}

@tab

iterable

@tab

p0, p1, … plast, q0, q1, …

@tab

@code{chain.from_iterable(['ABC', 'DEF']) → A B C D E F}

@item

@ref{1487,,compress()}

@tab

data, selectors

@tab

(d[0] if s[0]), (d[1] if s[1]), …

@tab

@code{compress('ABCDEF', [1,0,1,0,1,1]) → A C E F}

@item

@ref{1488,,count()}

@tab

[start[, step]]

@tab

start, start+step, start+2*step, …

@tab

@code{count(10) → 10 11 12 13 14 ...}

@item

@ref{2bca,,cycle()}

@tab

p

@tab

p0, p1, … plast, p0, p1, …

@tab

@code{cycle('ABCD') → A B C D A B C D ...}

@item

@ref{2bcb,,dropwhile()}

@tab

predicate, seq

@tab

seq[n], seq[n+1], starting when predicate fails

@tab

@code{dropwhile(lambda x: x<5, [1,4,6,3,8]) → 6 3 8}

@item

@ref{25ce,,filterfalse()}

@tab

predicate, seq

@tab

elements of seq where predicate(elem) fails

@tab

@code{filterfalse(lambda x: x<5, [1,4,6,3,8]) → 6 8}

@item

@ref{2bcc,,groupby()}

@tab

iterable[, key]

@tab

key(v)의 값으로 그룹화된 서브 이터레이터들

@tab

@code{groupby(['A','B','DEF'], len) → (1, A B) (3, DEF)}

@item

@ref{d42,,islice()}

@tab

seq, [start,] stop [, step]

@tab

seq[start:stop:step]의 요소들

@tab

@code{islice('ABCDEFG', 2, None) → C D E F G}

@item

@ref{a16,,pairwise()}

@tab

iterable

@tab

(p[0], p[1]), (p[1], p[2])

@tab

@code{pairwise('ABCDEFG') → AB BC CD DE EF FG}

@item

@ref{185c,,repeat()}

@tab

elem [,n]

@tab

elem, elem, elem, … 끝없이 또는 최대 n 번

@tab

@code{repeat(10, 3) → 10 10 10}

@item

@ref{12e9,,starmap()}

@tab

func, seq

@tab

func(*seq[0]), func(*seq[1]), …

@tab

@code{starmap(pow, [(2,5), (3,2), (10,3)]) → 32 9 1000}

@item

@ref{2bcd,,takewhile()}

@tab

predicate, seq

@tab

seq[0], seq[1], until predicate fails

@tab

@code{takewhile(lambda x: x<5, [1,4,6,3,8]) → 1 4}

@item

@ref{2bce,,tee()}

@tab

it, n

@tab

it1, it2, … itn 하나의 이터레이터를 n개의 이터레이터로 나눕니다

@tab

@code{tee('ABC', 2) → A B C, A B C}

@item

@ref{14a3,,zip_longest()}

@tab

p, q, …

@tab

(p[0], q[0]), (p[1], q[1]), …

@tab

@code{zip_longest('ABCD', 'xy', fillvalue='-') → Ax By C- D-}

@end multitable


`조합형 이터레이터:'


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

이터레이터

@tab

인자

@tab

결과

@item

@ref{1517,,product()}

@tab

p, q, … [repeat=1]

@tab

데카르트 곱(cartesian product), 중첩된 for 루프와 동등합니다

@item

@ref{1cda,,permutations()}

@tab

p[, r]

@tab

r-길이 튜플들, 모든 가능한 순서, 반복되는 요소 없음

@item

@ref{1516,,combinations()}

@tab

p, r

@tab

r-길이 튜플들, 정렬된 순서, 반복되는 요소 없음

@item

@ref{1486,,combinations_with_replacement()}

@tab

p, r

@tab

r-길이 튜플들, 정렬된 순서, 반복되는 요소 있음

@end multitable



@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

예

@tab

결과

@item

@code{product('ABCD', repeat=2)}

@tab

@code{AA AB AC AD BA BB BC BD CA CB CC CD DA DB DC DD}

@item

@code{permutations('ABCD', 2)}

@tab

@code{AB AC AD BA BC BD CA CB CD DA DB DC}

@item

@code{combinations('ABCD', 2)}

@tab

@code{AB AC AD BC BD CD}

@item

@code{combinations_with_replacement('ABCD', 2)}

@tab

@code{AA AB AC AD BB BC BD CC CD DD}

@end multitable


@menu
* Itertool Functions:: 
* Itertools 조리법:: 

@end menu

@node Itertool Functions,Itertools 조리법,,itertools — Functions creating iterators for efficient looping
@anchor{library/itertools itertool-functions}@anchor{2bcf}@anchor{library/itertools itertools-functions}@anchor{2bd0}
@subsubsection Itertool Functions


The following functions all construct and return iterators. Some provide
streams of infinite length, so they should only be accessed by functions or
loops that truncate the stream.

@geindex accumulate() (itertools 모듈)
@anchor{library/itertools itertools accumulate}@anchor{bef}
@deffn {함수} itertools.accumulate (iterable[, function, *, initial=None])

Make an iterator that returns accumulated sums or accumulated
results from other binary functions.

The `function' defaults to addition.  The `function' should accept
two arguments, an accumulated total and a value from the `iterable'.

If an `initial' value is provided, the accumulation will start with
that value and the output will have one more element than the input
iterable.

대략 다음과 동등합니다:

@example
def accumulate(iterable, function=operator.add, *, initial=None):
    'Return running totals'
    # accumulate([1,2,3,4,5]) → 1 3 6 10 15
    # accumulate([1,2,3,4,5], initial=100) → 100 101 103 106 110 115
    # accumulate([1,2,3,4,5], operator.mul) → 1 2 6 24 120

    iterator = iter(iterable)
    total = initial
    if initial is None:
        try:
            total = next(iterator)
        except StopIteration:
            return

    yield total
    for element in iterator:
        total = function(total, element)
        yield total
@end example

To compute a running minimum, set `function' to @ref{110a,,min()}.
For a running maximum, set `function' to @ref{110b,,max()}.
Or for a running product, set `function' to @ref{2bd1,,operator.mul()}.
To build an amortization table@footnote{https://www.ramseysolutions.com/real-estate/amortization-schedule},
accumulate the interest and apply payments:

@example
>>> data = [3, 4, 6, 2, 1, 9, 0, 7, 5, 8]
>>> list(accumulate(data, max))              # running maximum
[3, 4, 6, 6, 6, 9, 9, 9, 9, 9]
>>> list(accumulate(data, operator.mul))     # running product
[3, 12, 72, 144, 144, 1296, 0, 0, 0, 0]

# Amortize a 5% loan of 1000 with 10 annual payments of 90
>>> update = lambda balance, payment: round(balance * 1.05) - payment
>>> list(accumulate(repeat(90, 10), update, initial=1_000))
[1000, 960, 918, 874, 828, 779, 728, 674, 618, 559, 497]
@end example

최종 누적값만 반환하는 유사한 함수에 대해서는 @ref{21a,,functools.reduce()}를 참조하십시오.


Added in version 3.2.



버전 3.3에서 변경: Added the optional `function' parameter.



버전 3.8에서 변경: 선택적 `initial' 매개 변수를 추가했습니다.

@end deffn

@geindex batched() (itertools 모듈)
@anchor{library/itertools itertools batched}@anchor{510}
@deffn {함수} itertools.batched (iterable, n, *, strict=False)

Batch data from the `iterable' into tuples of length `n'. The last
batch may be shorter than `n'.

If `strict' is true, will raise a @ref{2ec,,ValueError} if the final
batch is shorter than `n'.

Loops over the input iterable and accumulates data into tuples up to
size `n'.  The input is consumed lazily, just enough to fill a batch.
The result is yielded as soon as the batch is full or when the input
iterable is exhausted:

@example
>>> flattened_data = ['roses', 'red', 'violets', 'blue', 'sugar', 'sweet']
>>> unflattened = list(batched(flattened_data, 2))
>>> unflattened
[('roses', 'red'), ('violets', 'blue'), ('sugar', 'sweet')]
@end example

대략 다음과 동등합니다:

@example
def batched(iterable, n, *, strict=False):
    # batched('ABCDEFG', 3) → ABC DEF G
    if n < 1:
        raise ValueError('n must be at least one')
    iterator = iter(iterable)
    while batch := tuple(islice(iterator, n)):
        if strict and len(batch) != n:
            raise ValueError('batched(): incomplete batch')
        yield batch
@end example


Added in version 3.12.



버전 3.13에서 변경: Added the `strict' option.

@end deffn

@geindex chain() (itertools 모듈)
@anchor{library/itertools itertools chain}@anchor{25df}
@deffn {함수} itertools.chain (*iterables)

Make an iterator that returns elements from the first iterable until
it is exhausted, then proceeds to the next iterable, until all of the
iterables are exhausted.  This combines multiple data sources into a
single iterator.  Roughly equivalent to:

@example
def chain(*iterables):
    # chain('ABC', 'DEF') → A B C D E F
    for iterable in iterables:
        yield from iterable
@end example
@end deffn

@geindex from_iterable() (itertools.chain의 클래스 메서드)
@anchor{library/itertools itertools chain from_iterable}@anchor{2bc9}
@deffn {메서드} classmethod chain.from_iterable (iterable)

@ref{25df,,chain()}의 대체 생성자. 게으르게 평가되는 단일 이터러블 인자에서 연쇄 입력을 가져옵니다. 대략 다음과 동등합니다:

@example
def from_iterable(iterables):
    # chain.from_iterable(['ABC', 'DEF']) → A B C D E F
    for iterable in iterables:
        yield from iterable
@end example
@end deffn

@geindex combinations() (itertools 모듈)
@anchor{library/itertools itertools combinations}@anchor{1516}
@deffn {함수} itertools.combinations (iterable, r)

입력 `iterable'에서 요소의 길이 `r' 서브 시퀀스들을 반환합니다.

The output is a subsequence of @ref{1517,,product()} keeping only entries that
are subsequences of the `iterable'.  The length of the output is given
by @ref{8de,,math.comb()} which computes @code{n! / r! / (n - r)!} when @code{0 ≤ r
≤ n} or zero when @code{r > n}.

The combination tuples are emitted in lexicographic order according to
the order of the input `iterable'. If the input `iterable' is sorted,
the output tuples will be produced in sorted order.

Elements are treated as unique based on their position, not on their
value.  If the input elements are unique, there will be no repeated
values within each combination.

대략 다음과 동등합니다:

@example
def combinations(iterable, r):
    # combinations('ABCD', 2) → AB AC AD BC BD CD
    # combinations(range(4), 3) → 012 013 023 123

    pool = tuple(iterable)
    n = len(pool)
    if r > n:
        return
    indices = list(range(r))

    yield tuple(pool[i] for i in indices)
    while True:
        for i in reversed(range(r)):
            if indices[i] != i + n - r:
                break
        else:
            return
        indices[i] += 1
        for j in range(i+1, r):
            indices[j] = indices[j-1] + 1
        yield tuple(pool[i] for i in indices)
@end example
@end deffn

@geindex combinations_with_replacement() (itertools 모듈)
@anchor{library/itertools itertools combinations_with_replacement}@anchor{1486}
@deffn {함수} itertools.combinations_with_replacement (iterable, r)

입력 `iterable'에서 요소의 길이 `r' 서브 시퀀스들을 반환하는데, 개별 요소를 두 번 이상 반복할 수 있습니다.

The output is a subsequence of @ref{1517,,product()} that keeps only entries
that are subsequences (with possible repeated elements) of the
`iterable'.  The number of subsequence returned is @code{(n + r - 1)! / r! /
(n - 1)!} when @code{n > 0}.

The combination tuples are emitted in lexicographic order according to
the order of the input `iterable'. if the input `iterable' is sorted,
the output tuples will be produced in sorted order.

Elements are treated as unique based on their position, not on their
value.  If the input elements are unique, the generated combinations
will also be unique.

대략 다음과 동등합니다:

@example
def combinations_with_replacement(iterable, r):
    # combinations_with_replacement('ABC', 2) → AA AB AC BB BC CC

    pool = tuple(iterable)
    n = len(pool)
    if not n and r:
        return
    indices = [0] * r

    yield tuple(pool[i] for i in indices)
    while True:
        for i in reversed(range(r)):
            if indices[i] != n - 1:
                break
        else:
            return
        indices[i:] = [indices[i] + 1] * (r - i)
        yield tuple(pool[i] for i in indices)
@end example


Added in version 3.1.

@end deffn

@geindex compress() (itertools 모듈)
@anchor{library/itertools itertools compress}@anchor{1487}
@deffn {함수} itertools.compress (data, selectors)

Make an iterator that returns elements from `data' where the
corresponding element in `selectors' is true.  Stops when either the
`data' or `selectors' iterables have been exhausted.  Roughly
equivalent to:

@example
def compress(data, selectors):
    # compress('ABCDEF', [1,0,1,0,1,1]) → A C E F
    return (datum for datum, selector in zip(data, selectors) if selector)
@end example


Added in version 3.1.

@end deffn

@geindex count() (itertools 모듈)
@anchor{library/itertools itertools count}@anchor{1488}
@deffn {함수} itertools.count (start=0, step=1)

Make an iterator that returns evenly spaced values beginning with
`start'. Can be used with @ref{19f,,map()} to generate consecutive data
points or with @ref{1a0,,zip()} to add sequence numbers.  Roughly
equivalent to:

@example
def count(start=0, step=1):
    # count(10) → 10 11 12 13 14 ...
    # count(2.5, 0.5) → 2.5 3.0 3.5 ...
    n = start
    while True:
        yield n
        n += step
@end example

When counting with floating-point numbers, better accuracy can sometimes be
achieved by substituting multiplicative code such as: @code{(start + step * i
for i in count())}.


버전 3.1에서 변경: `step' 인자를 추가하고 정수가 아닌 인자를 허용했습니다.

@end deffn

@geindex cycle() (itertools 모듈)
@anchor{library/itertools itertools cycle}@anchor{2bca}
@deffn {함수} itertools.cycle (iterable)

Make an iterator returning elements from the `iterable' and saving a
copy of each.  When the iterable is exhausted, return elements from
the saved copy.  Repeats indefinitely.  Roughly equivalent to:

@example
def cycle(iterable):
    # cycle('ABCD') → A B C D A B C D A B C D ...

    saved = []
    for element in iterable:
        yield element
        saved.append(element)

    while saved:
        for element in saved:
            yield element
@end example

This itertool may require significant auxiliary storage (depending on
the length of the iterable).
@end deffn

@geindex dropwhile() (itertools 모듈)
@anchor{library/itertools itertools dropwhile}@anchor{2bcb}
@deffn {함수} itertools.dropwhile (predicate, iterable)

Make an iterator that drops elements from the `iterable' while the
`predicate' is true and afterwards returns every element.  Roughly
equivalent to:

@example
def dropwhile(predicate, iterable):
    # dropwhile(lambda x: x<5, [1,4,6,3,8]) → 6 3 8

    iterator = iter(iterable)
    for x in iterator:
        if not predicate(x):
            yield x
            break

    for x in iterator:
        yield x
@end example

Note this does not produce `any' output until the predicate first
becomes false, so this itertool may have a lengthy start-up time.
@end deffn

@geindex filterfalse() (itertools 모듈)
@anchor{library/itertools itertools filterfalse}@anchor{25ce}
@deffn {함수} itertools.filterfalse (predicate, iterable)

Make an iterator that filters elements from the `iterable' returning
only those for which the `predicate' returns a false value.  If
`predicate' is @code{None}, returns the items that are false.  Roughly
equivalent to:

@example
def filterfalse(predicate, iterable):
    # filterfalse(lambda x: x<5, [1,4,6,3,8]) → 6 8

    if predicate is None:
        predicate = bool

    for x in iterable:
        if not predicate(x):
            yield x
@end example
@end deffn

@geindex groupby() (itertools 모듈)
@anchor{library/itertools itertools groupby}@anchor{2bcc}
@deffn {함수} itertools.groupby (iterable, key=None)

`iterable'에서 연속적인 키와 그룹을 반환하는 이터레이터를 만듭니다. `key'는 각 요소의 키값을 계산하는 함수입니다. 지정되지 않거나 @code{None}이면, `key'의 기본값은 항등함수(identity function)이고 요소를 변경하지 않고 반환합니다. 일반적으로, iterable은 같은 키 함수로 이미 정렬되어 있어야 합니다.

@ref{2bcc,,groupby()}의 작동은 유닉스의 @code{uniq} 필터와 유사합니다. 키 함수의 값이 변경될 때마다 중단(break)이나 새 그룹을 생성합니다 (이것이 일반적으로 같은 키 함수를 사용하여 데이터를 정렬해야 하는 이유입니다). 이 동작은 입력 순서와 관계없이 공통 요소를 집계하는 SQL의 GROUP BY와 다릅니다.

반환되는 그룹 자체는 @ref{2bcc,,groupby()}와 하부 이터러블(iterable)을 공유하는 이터레이터입니다. 소스가 공유되므로, @code{groupby()} 객체가 진행하면, 이전 그룹은 이 더는 보이지 않게 됩니다. 따라서, 나중에 데이터가 필요하면, 리스트로 저장해야 합니다:

@example
groups = []
uniquekeys = []
data = sorted(data, key=keyfunc)
for k, g in groupby(data, keyfunc):
    groups.append(list(g))      # Store group iterator as a list
    uniquekeys.append(k)
@end example

@ref{2bcc,,groupby()}는 대략 다음과 동등합니다:

@example
def groupby(iterable, key=None):
    # [k for k, g in groupby('AAAABBBCCDAABBB')] → A B C D A B
    # [list(g) for k, g in groupby('AAAABBBCCD')] → AAAA BBB CC D

    keyfunc = (lambda x: x) if key is None else key
    iterator = iter(iterable)
    exhausted = False

    def _grouper(target_key):
        nonlocal curr_value, curr_key, exhausted
        yield curr_value
        for curr_value in iterator:
            curr_key = keyfunc(curr_value)
            if curr_key != target_key:
                return
            yield curr_value
        exhausted = True

    try:
        curr_value = next(iterator)
    except StopIteration:
        return
    curr_key = keyfunc(curr_value)

    while not exhausted:
        target_key = curr_key
        curr_group = _grouper(target_key)
        yield curr_key, curr_group
        if curr_key == target_key:
            for _ in curr_group:
                pass
@end example
@end deffn

@geindex islice() (itertools 모듈)
@anchor{library/itertools itertools islice}@anchor{d42}
@deffn {함수} itertools.islice (iterable, stop)

@deffnx {함수} itertools.islice (iterable, start, stop[, step])

Make an iterator that returns selected elements from the iterable.
Works like sequence slicing but does not support negative values for
`start', `stop', or `step'.

If `start' is zero or @code{None}, iteration starts at zero.  Otherwise,
elements from the iterable are skipped until `start' is reached.

If `stop' is @code{None}, iteration continues until the input is
exhausted, if at all.  Otherwise, it stops at the specified position.

If `step' is @code{None}, the step defaults to one.  Elements are returned
consecutively unless `step' is set higher than one which results in
items being skipped.

대략 다음과 동등합니다:

@example
def islice(iterable, *args):
    # islice('ABCDEFG', 2) → A B
    # islice('ABCDEFG', 2, 4) → C D
    # islice('ABCDEFG', 2, None) → C D E F G
    # islice('ABCDEFG', 0, None, 2) → A C E G

    s = slice(*args)
    start = 0 if s.start is None else s.start
    stop = s.stop
    step = 1 if s.step is None else s.step
    if start < 0 or (stop is not None and stop < 0) or step <= 0:
        raise ValueError

    indices = count() if stop is None else range(max(start, stop))
    next_i = start
    for i, element in zip(indices, iterable):
        if i == next_i:
            yield element
            next_i += step
@end example

If the input is an iterator, then fully consuming the `islice'
advances the input iterator by @code{max(start, stop)} steps regardless
of the `step' value.
@end deffn

@geindex pairwise() (itertools 모듈)
@anchor{library/itertools itertools pairwise}@anchor{a16}
@deffn {함수} itertools.pairwise (iterable)

Return successive overlapping pairs taken from the input `iterable'.

The number of 2-tuples in the output iterator will be one fewer than the
number of inputs.  It will be empty if the input iterable has fewer than
two values.

대략 다음과 동등합니다:

@example
def pairwise(iterable):
    # pairwise('ABCDEFG') → AB BC CD DE EF FG

    iterator = iter(iterable)
    a = next(iterator, None)

    for b in iterator:
        yield a, b
        a = b
@end example


Added in version 3.10.

@end deffn

@geindex permutations() (itertools 모듈)
@anchor{library/itertools itertools permutations}@anchor{1cda}
@deffn {함수} itertools.permutations (iterable, r=None)

Return successive `r' length permutations of elements@footnote{https://www.britannica.com/science/permutation} from the `iterable'.

`r'이 지정되지 않았거나 @code{None}이면, `r'의 기본값은 `iterable'의 길이이며 가능한 모든 최대 길이 순열이 생성됩니다.

The output is a subsequence of @ref{1517,,product()} where entries with
repeated elements have been filtered out.  The length of the output is
given by @ref{8df,,math.perm()} which computes @code{n! / (n - r)!} when
@code{0 ≤ r ≤ n} or zero when @code{r > n}.

The permutation tuples are emitted in lexicographic order according to
the order of the input `iterable'.  If the input `iterable' is sorted,
the output tuples will be produced in sorted order.

Elements are treated as unique based on their position, not on their
value.  If the input elements are unique, there will be no repeated
values within a permutation.

대략 다음과 동등합니다:

@example
def permutations(iterable, r=None):
    # permutations('ABCD', 2) → AB AC AD BA BC BD CA CB CD DA DB DC
    # permutations(range(3)) → 012 021 102 120 201 210

    pool = tuple(iterable)
    n = len(pool)
    r = n if r is None else r
    if r > n:
        return

    indices = list(range(n))
    cycles = list(range(n, n-r, -1))
    yield tuple(pool[i] for i in indices[:r])

    while n:
        for i in reversed(range(r)):
            cycles[i] -= 1
            if cycles[i] == 0:
                indices[i:] = indices[i+1:] + indices[i:i+1]
                cycles[i] = n - i
            else:
                j = cycles[i]
                indices[i], indices[-j] = indices[-j], indices[i]
                yield tuple(pool[i] for i in indices[:r])
                break
        else:
            return
@end example
@end deffn

@geindex product() (itertools 모듈)
@anchor{library/itertools itertools product}@anchor{1517}
@deffn {함수} itertools.product (*iterables, repeat=1)

Cartesian product@footnote{https://en.wikipedia.org/wiki/Cartesian_product}
of the input iterables.

대략 제너레이터 표현식에서의 중첩된 for-루프와 동등합니다. 예를 들어, @code{product(A, B)}는 @code{((x,y) for x in A for y in B)}와 같은 것을 반환합니다.

중첩된 루프는 매 이터레이션마다 가장 오른쪽 요소가 진행되는 주행 거리계처럼 순환합니다. 이 패턴은 사전식 순서를 만들어서 입력의 이터러블들이 정렬되어 있다면, 곱(product) 튜플이 정렬된 순서로 방출됩니다.

이터러블의 자신과의 곱을 계산하려면, 선택적 `repeat' 키워드 인자를 사용하여 반복 횟수를 지정하십시오. 예를 들어, @code{product(A, repeat=4)}는 @code{product(A, A, A, A)}와 같은 것을 뜻합니다.

이 함수는 실제 구현이 메모리에 중간 결과를 쌓지 않는다는 점을 제외하고 다음 코드와 대략 동등합니다:

@example
def product(*iterables, repeat=1):
    # product('ABCD', 'xy') → Ax Ay Bx By Cx Cy Dx Dy
    # product(range(2), repeat=3) → 000 001 010 011 100 101 110 111

    if repeat < 0:
        raise ValueError('repeat argument cannot be negative')
    pools = [tuple(pool) for pool in iterables] * repeat

    result = [[]]
    for pool in pools:
        result = [x+[y] for x in result for y in pool]

    for prod in result:
        yield tuple(prod)
@end example

@ref{1517,,product()}가 실행되기 전에, 입력 이터러블을 완전히 소비하여, 곱을 생성하기 위해 값의 풀(pool)을 메모리에 유지합니다. 따라서, 유한 입력에만 유용합니다.
@end deffn

@geindex repeat() (itertools 모듈)
@anchor{library/itertools itertools repeat}@anchor{185c}
@deffn {함수} itertools.repeat (object[, times])

Make an iterator that returns `object' over and over again. Runs indefinitely
unless the `times' argument is specified.

대략 다음과 동등합니다:

@example
def repeat(object, times=None):
    # repeat(10, 3) → 10 10 10
    if times is None:
        while True:
            yield object
    else:
        for i in range(times):
            yield object
@end example

A common use for `repeat' is to supply a stream of constant values to `map'
or `zip':

@example
>>> list(map(pow, range(10), repeat(2)))
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
@end example
@end deffn

@geindex starmap() (itertools 모듈)
@anchor{library/itertools itertools starmap}@anchor{12e9}
@deffn {함수} itertools.starmap (function, iterable)

Make an iterator that computes the `function' using arguments obtained
from the `iterable'.  Used instead of @ref{19f,,map()} when argument
parameters have already been “pre-zipped” into tuples.

The difference between @ref{19f,,map()} and @code{starmap()} parallels the
distinction between @code{function(a,b)} and @code{function(*c)}. Roughly
equivalent to:

@example
def starmap(function, iterable):
    # starmap(pow, [(2,5), (3,2), (10,3)]) → 32 9 1000
    for args in iterable:
        yield function(*args)
@end example
@end deffn

@geindex takewhile() (itertools 모듈)
@anchor{library/itertools itertools takewhile}@anchor{2bcd}
@deffn {함수} itertools.takewhile (predicate, iterable)

Make an iterator that returns elements from the `iterable' as long as
the `predicate' is true.  Roughly equivalent to:

@example
def takewhile(predicate, iterable):
    # takewhile(lambda x: x<5, [1,4,6,3,8]) → 1 4
    for x in iterable:
        if not predicate(x):
            break
        yield x
@end example

Note, the element that first fails the predicate condition is
consumed from the input iterator and there is no way to access it.
This could be an issue if an application wants to further consume the
input iterator after `takewhile' has been run to exhaustion.  To work
around this problem, consider using more-itertools before_and_after()@footnote{https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.before_and_after}
instead.
@end deffn

@geindex tee() (itertools 모듈)
@anchor{library/itertools itertools tee}@anchor{2bce}
@deffn {함수} itertools.tee (iterable, n=2)

단일 iterable에서 `n' 개의 독립 이터레이터를 반환합니다.

대략 다음과 동등합니다:

@example
def tee(iterable, n=2):
    if n < 0:
        raise ValueError
    if n == 0:
        return ()
    iterator = _tee(iterable)
    result = [iterator]
    for _ in range(n - 1):
        result.append(_tee(iterator))
    return tuple(result)

class _tee:

    def __init__(self, iterable):
        it = iter(iterable)
        if isinstance(it, _tee):
            self.iterator = it.iterator
            self.link = it.link
        else:
            self.iterator = it
            self.link = [None, None]

    def __iter__(self):
        return self

    def __next__(self):
        link = self.link
        if link[1] is None:
            link[0] = next(self.iterator)
            link[1] = [None, None]
        value, self.link = link
        return value
@end example

When the input `iterable' is already a tee iterator object, all
members of the return tuple are constructed as if they had been
produced by the upstream @ref{2bce,,tee()} call.  This “flattening step”
allows nested @code{tee()} calls to share the same underlying data
chain and to have a single update step rather than a chain of calls.

The flattening property makes tee iterators efficiently peekable:

@example
def lookahead(tee_iterator):
     "Return the next value without moving the input forward"
     [forked_iterator] = tee(tee_iterator, 1)
     return next(forked_iterator)
@end example

@example
>>> iterator = iter('abcdef')
>>> [iterator] = tee(iterator, 1)   # Make the input peekable
>>> next(iterator)                  # Move the iterator forward
'a'
>>> lookahead(iterator)             # Check next value
'b'
>>> next(iterator)                  # Continue moving forward
'b'
@end example

@code{tee} iterators are not threadsafe. A @ref{244,,RuntimeError} may be
raised when simultaneously using iterators returned by the same @ref{2bce,,tee()}
call, even if the original `iterable' is threadsafe.

이 이터레이터 도구에는 상당한 보조 기억 장치가 필요할 수 있습니다 (일시적으로 저장해야 하는 데이터양에 따라 다릅니다). 일반적으로, 다른 이터레이터가 시작하기 전에 하나의 이터레이터가 대부분이나 모든 데이터를 사용하면, @ref{2bce,,tee()} 대신 @ref{24d,,list()}를 사용하는 것이 더 빠릅니다.
@end deffn

@geindex zip_longest() (itertools 모듈)
@anchor{library/itertools itertools zip_longest}@anchor{14a3}
@deffn {함수} itertools.zip_longest (*iterables, fillvalue=None)

Make an iterator that aggregates elements from each of the
`iterables'.

If the iterables are of uneven length, missing values are filled-in
with `fillvalue'.  If not specified, `fillvalue' defaults to @code{None}.

Iteration continues until the longest iterable is exhausted.

대략 다음과 동등합니다:

@example
def zip_longest(*iterables, fillvalue=None):
    # zip_longest('ABCD', 'xy', fillvalue='-') → Ax By C- D-

    iterators = list(map(iter, iterables))
    num_active = len(iterators)
    if not num_active:
        return

    while True:
        values = []
        for i, iterator in enumerate(iterators):
            try:
                value = next(iterator)
            except StopIteration:
                num_active -= 1
                if not num_active:
                    return
                iterators[i] = repeat(fillvalue)
                value = fillvalue
            values.append(value)
        yield tuple(values)
@end example

If one of the iterables is potentially infinite, then the @code{zip_longest()}
function should be wrapped with something that limits the number of calls
(for example @ref{d42,,islice()} or @ref{2bcd,,takewhile()}).
@end deffn

@node Itertools 조리법,,Itertool Functions,itertools — Functions creating iterators for efficient looping
@anchor{library/itertools id1}@anchor{2bd2}@anchor{library/itertools itertools-recipes}@anchor{1463}
@subsubsection Itertools 조리법


이 섹션에서는 기존 itertools를 빌딩 블록으로 사용하여 확장 도구 집합을 만드는 방법을 보여줍니다.

The primary purpose of the itertools recipes is educational.  The recipes show
various ways of thinking about individual tools — for example, that
@code{chain.from_iterable} is related to the concept of flattening.  The recipes
also give ideas about ways that the tools can be combined — for example, how
@code{starmap()} and @code{repeat()} can work together.  The recipes also show patterns
for using itertools with the @ref{a3,,operator} and @ref{1e,,collections} modules as
well as with the built-in itertools such as @code{map()}, @code{filter()},
@code{reversed()}, and @code{enumerate()}.

A secondary purpose of the recipes is to serve as an incubator.  The
@code{accumulate()}, @code{compress()}, and @code{pairwise()} itertools started out as
recipes.  Currently, the @code{sliding_window()}, @code{derangements()}, and @code{sieve()}
recipes are being tested to see whether they prove their worth.

Substantially all of these recipes and many, many others can be installed from
the more-itertools@footnote{https://pypi.org/project/more-itertools/} project found
on the Python Package Index:

@example
python -m pip install more-itertools
@end example

Many of the recipes offer the same high performance as the underlying toolset.
Superior memory performance is kept by processing elements one at a time rather
than bringing the whole iterable into memory all at once. Code volume is kept
small by linking the tools together in a functional style@footnote{https://www.cs.kent.ac.uk/people/staff/dat/miranda/whyfp90.pdf}.  High speed
is retained by preferring “vectorized” building blocks over the use of for-loops
and @ref{1260,,generators} which incur interpreter overhead.

@example
from itertools import (accumulate, batched, chain, combinations, compress,
     count, cycle, filterfalse, groupby, islice, permutations, product,
     repeat, starmap, tee, zip_longest)
from collections import Counter, deque
from contextlib import suppress
from functools import reduce
from math import comb, isqrt, prod, sumprod
from operator import getitem, is_not, itemgetter, mul, neg, truediv


# ==== Basic one liners ====

def take(n, iterable):
    "Return first n items of the iterable as a list."
    return list(islice(iterable, n))

def prepend(value, iterable):
    "Prepend a single value in front of an iterable."
    # prepend(1, [2, 3, 4]) → 1 2 3 4
    return chain([value], iterable)

def running_mean(iterable):
    "Yield the average of all values seen so far."
    # running_mean([8.5, 9.5, 7.5, 6.5]) -> 8.5 9.0 8.5 8.0
    return map(truediv, accumulate(iterable), count(1))

def repeatfunc(function, times=None, *args):
    "Repeat calls to a function with specified arguments."
    if times is None:
        return starmap(function, repeat(args))
    return starmap(function, repeat(args, times))

def flatten(list_of_lists):
    "Flatten one level of nesting."
    return chain.from_iterable(list_of_lists)

def ncycles(iterable, n):
    "Returns the sequence elements n times."
    return chain.from_iterable(repeat(tuple(iterable), n))

def loops(n):
    "Loop n times. Like range(n) but without creating integers."
    # for _ in loops(100): ...
    return repeat(None, n)

def tail(n, iterable):
    "Return an iterator over the last n items."
    # tail(3, 'ABCDEFG') → E F G
    return iter(deque(iterable, maxlen=n))

def consume(iterator, n=None):
    "Advance the iterator n-steps ahead. If n is None, consume entirely."
    # Use functions that consume iterators at C speed.
    if n is None:
        deque(iterator, maxlen=0)
    else:
        next(islice(iterator, n, n), None)

def nth(iterable, n, default=None):
    "Returns the nth item or a default value."
    return next(islice(iterable, n, None), default)

def quantify(iterable, predicate=bool):
    "Given a predicate that returns True or False, count the True results."
    return sum(map(predicate, iterable))

def first_true(iterable, default=False, predicate=None):
    "Returns the first true value or the *default* if there is no true value."
    # first_true([a, b, c], x) → a or b or c or x
    # first_true([a, b], x, f) → a if f(a) else b if f(b) else x
    return next(filter(predicate, iterable), default)

def all_equal(iterable, key=None):
    "Returns True if all the elements are equal to each other."
    # all_equal('4٤௪౪໔', key=int) → True
    return len(take(2, groupby(iterable, key))) <= 1


# ==== Data pipelines ====

def unique_justseen(iterable, key=None):
    "Yield unique elements, preserving order. Remember only the element just seen."
    # unique_justseen('AAAABBBCCDAABBB') → A B C D A B
    # unique_justseen('ABBcCAD', str.casefold) → A B c A D
    if key is None:
        return map(itemgetter(0), groupby(iterable))
    return map(next, map(itemgetter(1), groupby(iterable, key)))

def unique_everseen(iterable, key=None):
    "Yield unique elements, preserving order. Remember all elements ever seen."
    # unique_everseen('AAAABBBCCDAABBB') → A B C D
    # unique_everseen('ABBcCAD', str.casefold) → A B c D
    seen = set()
    if key is None:
        for element in filterfalse(seen.__contains__, iterable):
            seen.add(element)
            yield element
    else:
        for element in iterable:
            k = key(element)
            if k not in seen:
                seen.add(k)
                yield element

def unique(iterable, key=None, reverse=False):
   "Yield unique elements in sorted order. Supports unhashable inputs."
   # unique([[1, 2], [3, 4], [1, 2]]) → [1, 2] [3, 4]
   sequenced = sorted(iterable, key=key, reverse=reverse)
   return unique_justseen(sequenced, key=key)

def sliding_window(iterable, n):
    "Collect data into overlapping fixed-length chunks or blocks."
    # sliding_window('ABCDEFG', 3) → ABC BCD CDE DEF EFG
    iterator = iter(iterable)
    window = deque(islice(iterator, n - 1), maxlen=n)
    for x in iterator:
        window.append(x)
        yield tuple(window)

def grouper(iterable, n, *, incomplete='fill', fillvalue=None):
    "Collect data into non-overlapping fixed-length chunks or blocks."
    # grouper('ABCDEFG', 3, fillvalue='x')       → ABC DEF Gxx
    # grouper('ABCDEFG', 3, incomplete='strict') → ABC DEF ValueError
    # grouper('ABCDEFG', 3, incomplete='ignore') → ABC DEF
    iterators = [iter(iterable)] * n
    match incomplete:
        case 'fill':
            return zip_longest(*iterators, fillvalue=fillvalue)
        case 'strict':
            return zip(*iterators, strict=True)
        case 'ignore':
            return zip(*iterators)
        case _:
            raise ValueError('Expected fill, strict, or ignore')

def roundrobin(*iterables):
    "Visit input iterables in a cycle until each is exhausted."
    # roundrobin('ABC', 'D', 'EF') → A D E B F C
    # Algorithm credited to George Sakkis
    iterators = map(iter, iterables)
    for num_active in range(len(iterables), 0, -1):
        iterators = cycle(islice(iterators, num_active))
        yield from map(next, iterators)

def subslices(seq):
    "Return all contiguous non-empty subslices of a sequence."
    # subslices('ABCD') → A AB ABC ABCD B BC BCD C CD D
    slices = starmap(slice, combinations(range(len(seq) + 1), 2))
    return map(getitem, repeat(seq), slices)

def derangements(iterable, r=None):
    "Produce r length permutations without fixed points."
    # derangements('ABCD') → BADC BCDA BDAC CADB CDAB CDBA DABC DCAB DCBA
    # Algorithm credited to Stefan Pochmann
    seq = tuple(iterable)
    pos = tuple(range(len(seq)))
    have_moved = map(map, repeat(is_not), repeat(pos), permutations(pos, r=r))
    valid_derangements = map(all, have_moved)
    return compress(permutations(seq, r=r), valid_derangements)

def iter_index(iterable, value, start=0, stop=None):
    "Return indices where a value occurs in a sequence or iterable."
    # iter_index('AABCADEAF', 'A') → 0 1 4 7
    seq_index = getattr(iterable, 'index', None)
    if seq_index is None:
        iterator = islice(iterable, start, stop)
        for i, element in enumerate(iterator, start):
            if element is value or element == value:
                yield i
    else:
        stop = len(iterable) if stop is None else stop
        i = start
        with suppress(ValueError):
            while True:
                yield (i := seq_index(value, i, stop))
                i += 1

def iter_except(function, exception, first=None):
    "Convert a call-until-exception interface to an iterator interface."
    # iter_except(d.popitem, KeyError) → non-blocking dictionary iterator
    with suppress(exception):
        if first is not None:
            yield first()
        while True:
            yield function()


# ==== Mathematical operations ====

def multinomial(*counts):
    "Number of distinct arrangements of a multiset."
    # Counter('abracadabra').values() → 5 2 2 1 1
    # multinomial(5, 2, 2, 1, 1) → 83160
    return prod(map(comb, accumulate(counts), counts))

def powerset(iterable):
    "Subsequences of the iterable from shortest to longest."
    # powerset([1,2,3]) → () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)
    s = list(iterable)
    return chain.from_iterable(combinations(s, r) for r in range(len(s)+1))

def sum_of_squares(iterable):
    "Add up the squares of the input values."
    # sum_of_squares([10, 20, 30]) → 1400
    return sumprod(*tee(iterable))


# ==== Matrix operations ====

def reshape(matrix, columns):
    "Reshape a 2-D matrix to have a given number of columns."
    # reshape([(0, 1), (2, 3), (4, 5)], 3) →  (0, 1, 2) (3, 4, 5)
    return batched(chain.from_iterable(matrix), columns, strict=True)

def transpose(matrix):
    "Swap the rows and columns of a 2-D matrix."
    # transpose([(1, 2, 3), (11, 22, 33)]) → (1, 11) (2, 22) (3, 33)
    return zip(*matrix, strict=True)

def matmul(m1, m2):
    "Multiply two matrices."
    # matmul([(7, 5), (3, 5)], [(2, 5), (7, 9)]) → (49, 80) (41, 60)
    n = len(m2[0])
    return batched(starmap(sumprod, product(m1, transpose(m2))), n)


# ==== Polynomial arithmetic ====

def convolve(signal, kernel):
    """Discrete linear convolution of two iterables.
    Equivalent to polynomial multiplication.

    Convolutions are mathematically commutative; however, the inputs are
    evaluated differently.  The signal is consumed lazily and can be
    infinite. The kernel is fully consumed before the calculations begin.

    Article:  https://betterexplained.com/articles/intuitive-convolution/
    Video:    https://www.youtube.com/watch?v=KuXjwB4LzSA
    """
    # convolve([1, -1, -20], [1, -3]) → 1 -4 -17 60
    # convolve(data, [0.25, 0.25, 0.25, 0.25]) → Moving average (blur)
    # convolve(data, [1/2, 0, -1/2]) → 1st derivative estimate
    # convolve(data, [1, -2, 1]) → 2nd derivative estimate
    kernel = tuple(kernel)[::-1]
    n = len(kernel)
    padded_signal = chain(repeat(0, n-1), signal, repeat(0, n-1))
    windowed_signal = sliding_window(padded_signal, n)
    return map(sumprod, repeat(kernel), windowed_signal)

def polynomial_from_roots(roots):
    """Compute a polynomial's coefficients from its roots.

       (x - 5) (x + 4) (x - 3)  expands to:   x³ -4x² -17x + 60
    """
    # polynomial_from_roots([5, -4, 3]) → [1, -4, -17, 60]
    factors = zip(repeat(1), map(neg, roots))
    return list(reduce(convolve, factors, [1]))

def polynomial_eval(coefficients, x):
    """Evaluate a polynomial at a specific value.

    Computes with better numeric stability than Horner's method.
    """
    # Evaluate x³ -4x² -17x + 60 at x = 5
    # polynomial_eval([1, -4, -17, 60], x=5) → 0
    n = len(coefficients)
    if not n:
        return type(x)(0)
    powers = map(pow, repeat(x), reversed(range(n)))
    return sumprod(coefficients, powers)

def polynomial_derivative(coefficients):
    """Compute the first derivative of a polynomial.

       f(x)  =  x³ -4x² -17x + 60
       f'(x) = 3x² -8x  -17
    """
    # polynomial_derivative([1, -4, -17, 60]) → [3, -8, -17]
    n = len(coefficients)
    powers = reversed(range(1, n))
    return list(map(mul, coefficients, powers))


# ==== Number theory ====

def sieve(n):
    "Primes less than n."
    # sieve(30) → 2 3 5 7 11 13 17 19 23 29
    if n > 2:
        yield 2
    data = bytearray((0, 1)) * (n // 2)
    for p in iter_index(data, 1, start=3, stop=isqrt(n) + 1):
        data[p*p : n : p+p] = bytes(len(range(p*p, n, p+p)))
    yield from iter_index(data, 1, start=3)

def factor(n):
    "Prime factors of n."
    # factor(99) → 3 3 11
    # factor(1_000_000_000_000_007) → 47 59 360620266859
    # factor(1_000_000_000_000_403) → 1000000000000403
    for prime in sieve(isqrt(n) + 1):
        while not n % prime:
            yield prime
            n //= prime
            if n == 1:
                return
    if n > 1:
        yield n

def is_prime(n):
    "Return True if n is prime."
    # is_prime(1_000_000_000_000_403) → True
    return n > 1 and next(factor(n)) == n

def totient(n):
    "Count of natural numbers up to n that are coprime to n."
    # https://mathworld.wolfram.com/TotientFunction.html
    # totient(12) → 4 because len([1, 5, 7, 11]) == 4
    for prime in set(factor(n)):
        n -= n // prime
    return n
@end example

@c These examples no longer appear in the docs but are guaranteed
@c to keep working.
@c 
@c >>> amounts = [120.15, 764.05, 823.14]
@c >>> for checknum, amount in zip(count(1200), amounts):
@c ...     print('Check %d is for $%.2f' % (checknum, amount))
@c ...
@c Check 1200 is for $120.15
@c Check 1201 is for $764.05
@c Check 1202 is for $823.14
@c 
@c >>> import operator
@c >>> for cube in map(operator.pow, range(1,4), repeat(3)):
@c ...    print(cube)
@c ...
@c 1
@c 8
@c 27
@c 
@c >>> reportlines = ['EuroPython', 'Roster', '', 'alex', '', 'laura', '', 'martin', '', 'walter', '', 'samuele']
@c >>> for name in islice(reportlines, 3, None, 2):
@c ...    print(name.title())
@c ...
@c Alex
@c Laura
@c Martin
@c Walter
@c Samuele
@c 
@c >>> from operator import itemgetter
@c >>> d = dict(a=1, b=2, c=1, d=2, e=1, f=2, g=3)
@c >>> di = sorted(sorted(d.items()), key=itemgetter(1))
@c >>> for k, g in groupby(di, itemgetter(1)):
@c ...     print(k, list(map(itemgetter(0), g)))
@c ...
@c 1 ['a', 'c', 'e']
@c 2 ['b', 'd', 'f']
@c 3 ['g']
@c 
@c # Find runs of consecutive numbers using groupby.  The key to the solution
@c # is differencing with a range so that consecutive numbers all appear in
@c # same group.
@c >>> data = [ 1,  4,5,6, 10, 15,16,17,18, 22, 25,26,27,28]
@c >>> for k, g in groupby(enumerate(data), lambda t:t[0]-t[1]):
@c ...     print(list(map(operator.itemgetter(1), g)))
@c ...
@c [1]
@c [4, 5, 6]
@c [10]
@c [15, 16, 17, 18]
@c [22]
@c [25, 26, 27, 28]
@c 
@c Now, we test all of the itertool recipes
@c 
@c >>> take(10, count())
@c [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
@c >>> # Verify that the input is consumed lazily
@c >>> it = iter('abcdef')
@c >>> take(3, it)
@c ['a', 'b', 'c']
@c >>> list(it)
@c ['d', 'e', 'f']
@c 
@c 
@c >>> list(prepend(1, [2, 3, 4]))
@c [1, 2, 3, 4]
@c 
@c 
@c >>> list(enumerate('abc'))
@c [(0, 'a'), (1, 'b'), (2, 'c')]
@c 
@c 
@c >>> list(running_mean([8.5, 9.5, 7.5, 6.5]))
@c [8.5, 9.0, 8.5, 8.0]
@c 
@c 
@c >>> for _ in loops(5):
@c ...     print('hi')
@c ...
@c hi
@c hi
@c hi
@c hi
@c hi
@c 
@c 
@c >>> list(tail(3, 'ABCDEFG'))
@c ['E', 'F', 'G']
@c >>> # Verify the input is consumed greedily
@c >>> input_iterator = iter('ABCDEFG')
@c >>> output_iterator = tail(3, input_iterator)
@c >>> list(input_iterator)
@c []
@c 
@c 
@c >>> it = iter(range(10))
@c >>> consume(it, 3)
@c >>> # Verify the input is consumed lazily
@c >>> next(it)
@c 3
@c >>> # Verify the input is consumed completely
@c >>> consume(it)
@c >>> next(it, 'Done')
@c 'Done'
@c 
@c 
@c >>> nth('abcde', 3)
@c 'd'
@c >>> nth('abcde', 9) is None
@c True
@c >>> # Verify that the input is consumed lazily
@c >>> it = iter('abcde')
@c >>> nth(it, 2)
@c 'c'
@c >>> list(it)
@c ['d', 'e']
@c 
@c 
@c >>> [all_equal(s) for s in ('', 'A', 'AAAA', 'AAAB', 'AAABA')]
@c [True, True, True, False, False]
@c >>> [all_equal(s, key=str.casefold) for s in ('', 'A', 'AaAa', 'AAAB', 'AAABA')]
@c [True, True, True, False, False]
@c >>> # Verify that the input is consumed lazily and that only
@c >>> # one element of a second equivalence class is used to disprove
@c >>> # the assertion that all elements are equal.
@c >>> it = iter('aaabbbccc')
@c >>> all_equal(it)
@c False
@c >>> ''.join(it)
@c 'bbccc'
@c 
@c 
@c >>> quantify(range(99), lambda x: x%2==0)
@c 50
@c >>> quantify([True, False, False, True, True])
@c 3
@c >>> quantify(range(12), predicate=lambda x: x%2==1)
@c 6
@c 
@c 
@c >>> a = [[1, 2, 3], [4, 5, 6]]
@c >>> list(flatten(a))
@c [1, 2, 3, 4, 5, 6]
@c 
@c 
@c >>> list(ncycles('abc', 3))
@c ['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c']
@c >>> # Verify greedy consumption of input iterator
@c >>> input_iterator = iter('abc')
@c >>> output_iterator = ncycles(input_iterator, 3)
@c >>> list(input_iterator)
@c []
@c 
@c 
@c >>> sum_of_squares([10, 20, 30])
@c 1400
@c 
@c 
@c >>> list(reshape([(0, 1), (2, 3), (4, 5)], 3))
@c [(0, 1, 2), (3, 4, 5)]
@c >>> M = [(0, 1, 2, 3), (4, 5, 6, 7), (8, 9, 10, 11)]
@c >>> list(reshape(M, 1))
@c [(0,), (1,), (2,), (3,), (4,), (5,), (6,), (7,), (8,), (9,), (10,), (11,)]
@c >>> list(reshape(M, 2))
@c [(0, 1), (2, 3), (4, 5), (6, 7), (8, 9), (10, 11)]
@c >>> list(reshape(M, 3))
@c [(0, 1, 2), (3, 4, 5), (6, 7, 8), (9, 10, 11)]
@c >>> list(reshape(M, 4))
@c [(0, 1, 2, 3), (4, 5, 6, 7), (8, 9, 10, 11)]
@c >>> list(reshape(M, 5))
@c Traceback (most recent call last):
@c ...
@c ValueError: batched(): incomplete batch
@c >>> list(reshape(M, 6))
@c [(0, 1, 2, 3, 4, 5), (6, 7, 8, 9, 10, 11)]
@c >>> list(reshape(M, 12))
@c [(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)]
@c 
@c 
@c >>> list(transpose([(1, 2, 3), (11, 22, 33)]))
@c [(1, 11), (2, 22), (3, 33)]
@c >>> # Verify that the inputs are consumed lazily
@c >>> input1 = iter([1, 2, 3])
@c >>> input2 = iter([11, 22, 33])
@c >>> output_iterator = transpose([input1, input2])
@c >>> next(output_iterator)
@c (1, 11)
@c >>> list(zip(input1, input2))
@c [(2, 22), (3, 33)]
@c 
@c 
@c >>> list(matmul([(7, 5), (3, 5)], [[2, 5], [7, 9]]))
@c [(49, 80), (41, 60)]
@c >>> list(matmul([[2, 5], [7, 9], [3, 4]], [[7, 11, 5, 4, 9], [3, 5, 2, 6, 3]]))
@c [(29, 47, 20, 38, 33), (76, 122, 53, 82, 90), (33, 53, 23, 36, 39)]
@c 
@c 
@c >>> list(convolve([1, -1, -20], [1, -3])) == [1, -4, -17, 60]
@c True
@c >>> data = [20, 40, 24, 32, 20, 28, 16]
@c >>> list(convolve(data, [0.25, 0.25, 0.25, 0.25]))
@c [5.0, 15.0, 21.0, 29.0, 29.0, 26.0, 24.0, 16.0, 11.0, 4.0]
@c >>> list(convolve(data, [1, -1]))
@c [20, 20, -16, 8, -12, 8, -12, -16]
@c >>> list(convolve(data, [1, -2, 1]))
@c [20, 0, -36, 24, -20, 20, -20, -4, 16]
@c >>> # Verify signal is consumed lazily and the kernel greedily
@c >>> signal_iterator = iter([10, 20, 30, 40, 50])
@c >>> kernel_iterator = iter([1, 2, 3])
@c >>> output_iterator = convolve(signal_iterator, kernel_iterator)
@c >>> list(kernel_iterator)
@c []
@c >>> next(output_iterator)
@c 10
@c >>> next(output_iterator)
@c 40
@c >>> list(signal_iterator)
@c [30, 40, 50]
@c 
@c 
@c >>> from fractions import Fraction
@c >>> from decimal import Decimal
@c >>> polynomial_eval([1, -4, -17, 60], x=5)
@c 0
@c >>> x = 5; x**3 - 4*x**2 -17*x + 60
@c 0
@c >>> polynomial_eval([1, -4, -17, 60], x=2.5)
@c 8.125
@c >>> x = 2.5; x**3 - 4*x**2 -17*x + 60
@c 8.125
@c >>> polynomial_eval([1, -4, -17, 60], x=Fraction(2, 3))
@c Fraction(1274, 27)
@c >>> x = Fraction(2, 3); x**3 - 4*x**2 -17*x + 60
@c Fraction(1274, 27)
@c >>> polynomial_eval([1, -4, -17, 60], x=Decimal('1.75'))
@c Decimal('23.359375')
@c >>> x = Decimal('1.75'); x**3 - 4*x**2 -17*x + 60
@c Decimal('23.359375')
@c >>> polynomial_eval([], 2)
@c 0
@c >>> polynomial_eval([], 2.5)
@c 0.0
@c >>> polynomial_eval([], Fraction(2, 3))
@c Fraction(0, 1)
@c >>> polynomial_eval([], Decimal('1.75'))
@c Decimal('0')
@c >>> polynomial_eval([11], 7) == 11
@c True
@c >>> polynomial_eval([11, 2], 7) == 11 * 7 + 2
@c True
@c 
@c 
@c >>> polynomial_from_roots([5, -4, 3])
@c [1, -4, -17, 60]
@c >>> factored = lambda x: (x - 5) * (x + 4) * (x - 3)
@c >>> expanded = lambda x: x**3 -4*x**2 -17*x + 60
@c >>> all(factored(x) == expanded(x) for x in range(-10, 11))
@c True
@c 
@c 
@c >>> polynomial_derivative([1, -4, -17, 60])
@c [3, -8, -17]
@c 
@c 
@c >>> list(iter_index('AABCADEAF', 'A'))
@c [0, 1, 4, 7]
@c >>> list(iter_index('AABCADEAF', 'B'))
@c [2]
@c >>> list(iter_index('AABCADEAF', 'X'))
@c []
@c >>> list(iter_index('', 'X'))
@c []
@c >>> list(iter_index('AABCADEAF', 'A', 1))
@c [1, 4, 7]
@c >>> list(iter_index(iter('AABCADEAF'), 'A', 1))
@c [1, 4, 7]
@c >>> list(iter_index('AABCADEAF', 'A', 2))
@c [4, 7]
@c >>> list(iter_index(iter('AABCADEAF'), 'A', 2))
@c [4, 7]
@c >>> list(iter_index('AABCADEAF', 'A', 10))
@c []
@c >>> list(iter_index(iter('AABCADEAF'), 'A', 10))
@c []
@c >>> list(iter_index('AABCADEAF', 'A', 1, 7))
@c [1, 4]
@c >>> list(iter_index(iter('AABCADEAF'), 'A', 1, 7))
@c [1, 4]
@c >>> # Verify that ValueErrors not swallowed (gh-107208)
@c >>> def assert_no_value(iterable, forbidden_value):
@c ...     for item in iterable:
@c ...         if item == forbidden_value:
@c ...             raise ValueError
@c ...         yield item
@c ...
@c >>> list(iter_index(assert_no_value('AABCADEAF', 'B'), 'A'))
@c Traceback (most recent call last):
@c ...
@c ValueError
@c >>> # Verify that both paths can find identical NaN values
@c >>> x = float('NaN')
@c >>> y = float('NaN')
@c >>> list(iter_index([0, x, x, y, 0], x))
@c [1, 2]
@c >>> list(iter_index(iter([0, x, x, y, 0]), x))
@c [1, 2]
@c >>> # Test list input. Lists do not support None for the stop argument
@c >>> list(iter_index(list('AABCADEAF'), 'A'))
@c [0, 1, 4, 7]
@c >>> # Verify that input is consumed lazily
@c >>> input_iterator = iter('AABCADEAF')
@c >>> output_iterator = iter_index(input_iterator, 'A')
@c >>> next(output_iterator)
@c 0
@c >>> next(output_iterator)
@c 1
@c >>> next(output_iterator)
@c 4
@c >>> ''.join(input_iterator)
@c 'DEAF'
@c 
@c 
@c >>> # Verify that the target value can be a sequence.
@c >>> seq = [[10, 20], [30, 40], 30, 40, [30, 40], 50]
@c >>> target = [30, 40]
@c >>> list(iter_index(seq, target))
@c [1, 4]
@c 
@c 
@c >>> # Verify faithfulness to type specific index() method behaviors.
@c >>> # For example, bytes and str perform continuous-subsequence searches
@c >>> # that do not match the general behavior specified
@c >>> # in collections.abc.Sequence.index().
@c >>> seq = 'abracadabra'
@c >>> target = 'ab'
@c >>> list(iter_index(seq, target))
@c [0, 7]
@c 
@c 
@c >>> list(sieve(30))
@c [2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
@c >>> small_primes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
@c >>> all(list(sieve(n)) == [p for p in small_primes if p < n] for n in range(101))
@c True
@c >>> len(list(sieve(100)))
@c 25
@c >>> len(list(sieve(1_000)))
@c 168
@c >>> len(list(sieve(10_000)))
@c 1229
@c >>> len(list(sieve(100_000)))
@c 9592
@c >>> len(list(sieve(1_000_000)))
@c 78498
@c >>> carmichael = {561, 1105, 1729, 2465, 2821, 6601, 8911}  # https://oeis.org/A002997
@c >>> set(sieve(10_000)).isdisjoint(carmichael)
@c True
@c 
@c 
@c >>> small_primes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
@c >>> list(filter(is_prime, range(-100, 100))) == small_primes
@c True
@c >>> carmichael = {561, 1105, 1729, 2465, 2821, 6601, 8911}  # https://oeis.org/A002997
@c >>> any(map(is_prime, carmichael))
@c False
@c >>> # https://www.wolframalpha.com/input?i=is+128884753939+prime
@c >>> is_prime(128_884_753_939)           # large prime
@c True
@c >>> is_prime(999953 * 999983)           # large semiprime
@c False
@c >>> is_prime(1_000_000_000_000_007)     # factor() example
@c False
@c >>> is_prime(1_000_000_000_000_403)     # factor() example
@c True
@c 
@c 
@c >>> list(factor(99))                    # Code example 1
@c [3, 3, 11]
@c >>> list(factor(1_000_000_000_000_007)) # Code example 2
@c [47, 59, 360620266859]
@c >>> list(factor(1_000_000_000_000_403)) # Code example 3
@c [1000000000000403]
@c >>> list(factor(0))
@c []
@c >>> list(factor(1))
@c []
@c >>> list(factor(2))
@c [2]
@c >>> list(factor(3))
@c [3]
@c >>> list(factor(4))
@c [2, 2]
@c >>> list(factor(5))
@c [5]
@c >>> list(factor(6))
@c [2, 3]
@c >>> list(factor(7))
@c [7]
@c >>> list(factor(8))
@c [2, 2, 2]
@c >>> list(factor(9))
@c [3, 3]
@c >>> list(factor(10))
@c [2, 5]
@c >>> list(factor(128_884_753_939))       # large prime
@c [128884753939]
@c >>> list(factor(999953 * 999983))       # large semiprime
@c [999953, 999983]
@c >>> list(factor(6 ** 20)) == [2] * 20 + [3] * 20   # large power
@c True
@c >>> list(factor(909_909_090_909))       # large multiterm composite
@c [3, 3, 7, 13, 13, 751, 113797]
@c >>> math.prod([3, 3, 7, 13, 13, 751, 113797])
@c 909909090909
@c >>> all(math.prod(factor(n)) == n for n in range(1, 2_000))
@c True
@c >>> all(set(factor(n)) <= set(sieve(n+1)) for n in range(2_000))
@c True
@c >>> all(list(factor(n)) == sorted(factor(n)) for n in range(2_000))
@c True
@c 
@c 
@c >>> totient(0)  # https://www.wolframalpha.com/input?i=totient+0
@c 0
@c >>> first_totients = [1, 1, 2, 2, 4, 2, 6, 4, 6, 4, 10, 4, 12, 6, 8, 8, 16, 6,
@c ... 18, 8, 12, 10, 22, 8, 20, 12, 18, 12, 28, 8, 30, 16, 20, 16, 24, 12, 36, 18,
@c ... 24, 16, 40, 12, 42, 20, 24, 22, 46, 16, 42, 20, 32, 24, 52, 18, 40, 24, 36,
@c ... 28, 58, 16, 60, 30, 36, 32, 48, 20, 66, 32, 44]  # https://oeis.org/A000010
@c ...
@c >>> list(map(totient, range(1, 70))) == first_totients
@c True
@c >>> reference_totient = lambda n: sum(math.gcd(t, n) == 1 for t in range(1, n+1))
@c >>> all(totient(n) == reference_totient(n) for n in range(1000))
@c True
@c >>> totient(128_884_753_939) == 128_884_753_938  # large prime
@c True
@c >>> totient(999953 * 999983) == 999952 * 999982  # large semiprime
@c True
@c >>> totient(6 ** 20) == 1 * 2**19 * 2 * 3**19    # repeated primes
@c True
@c 
@c 
@c >>> list(flatten([('a', 'b'), (), ('c', 'd', 'e'), ('f',), ('g', 'h', 'i')]))
@c ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']
@c 
@c 
@c >>> list(repeatfunc(pow, 5, 2, 3))
@c [8, 8, 8, 8, 8]
@c >>> take(5, map(int, repeatfunc(random.random)))
@c [0, 0, 0, 0, 0]
@c >>> random.seed(85753098575309)
@c >>> list(repeatfunc(random.random, 3))
@c [0.16370491282496968, 0.45889608687313455, 0.3747076837820118]
@c >>> list(repeatfunc(chr, 3, 65))
@c ['A', 'A', 'A']
@c >>> list(repeatfunc(pow, 3, 2, 5))
@c [32, 32, 32]
@c 
@c 
@c >>> list(grouper('abcdefg', 3, fillvalue='x'))
@c [('a', 'b', 'c'), ('d', 'e', 'f'), ('g', 'x', 'x')]
@c 
@c 
@c >>> it = grouper('abcdefg', 3, incomplete='strict')
@c >>> next(it)
@c ('a', 'b', 'c')
@c >>> next(it)
@c ('d', 'e', 'f')
@c >>> next(it)
@c Traceback (most recent call last):
@c   ...
@c ValueError: zip() argument 2 is shorter than argument 1
@c 
@c >>> list(grouper('abcdefg', n=3, incomplete='ignore'))
@c [('a', 'b', 'c'), ('d', 'e', 'f')]
@c 
@c 
@c >>> list(sliding_window('ABCDEFG', 1))
@c [('A',), ('B',), ('C',), ('D',), ('E',), ('F',), ('G',)]
@c >>> list(sliding_window('ABCDEFG', 2))
@c [('A', 'B'), ('B', 'C'), ('C', 'D'), ('D', 'E'), ('E', 'F'), ('F', 'G')]
@c >>> list(sliding_window('ABCDEFG', 3))
@c [('A', 'B', 'C'), ('B', 'C', 'D'), ('C', 'D', 'E'), ('D', 'E', 'F'), ('E', 'F', 'G')]
@c >>> list(sliding_window('ABCDEFG', 4))
@c [('A', 'B', 'C', 'D'), ('B', 'C', 'D', 'E'), ('C', 'D', 'E', 'F'), ('D', 'E', 'F', 'G')]
@c >>> list(sliding_window('ABCDEFG', 5))
@c [('A', 'B', 'C', 'D', 'E'), ('B', 'C', 'D', 'E', 'F'), ('C', 'D', 'E', 'F', 'G')]
@c >>> list(sliding_window('ABCDEFG', 6))
@c [('A', 'B', 'C', 'D', 'E', 'F'), ('B', 'C', 'D', 'E', 'F', 'G')]
@c >>> list(sliding_window('ABCDEFG', 7))
@c [('A', 'B', 'C', 'D', 'E', 'F', 'G')]
@c >>> list(sliding_window('ABCDEFG', 8))
@c []
@c >>> try:
@c ...     list(sliding_window('ABCDEFG', -1))
@c ... except ValueError:
@c ...     'zero or negative n not supported'
@c ...
@c 'zero or negative n not supported'
@c >>> try:
@c ...     list(sliding_window('ABCDEFG', 0))
@c ... except ValueError:
@c ...     'zero or negative n not supported'
@c ...
@c 'zero or negative n not supported'
@c 
@c 
@c >>> list(roundrobin('abc', 'd', 'ef'))
@c ['a', 'd', 'e', 'b', 'f', 'c']
@c >>> ranges = [range(5, 1000), range(4, 3000), range(0), range(3, 2000), range(2, 5000), range(1, 3500)]
@c >>> collections.Counter(roundrobin(*ranges)) == collections.Counter(chain(*ranges))
@c True
@c >>> # Verify that the inputs are consumed lazily
@c >>> input_iterators = list(map(iter, ['abcd', 'ef', '', 'ghijk', 'l', 'mnopqr']))
@c >>> output_iterator = roundrobin(*input_iterators)
@c >>> ''.join(islice(output_iterator, 10))
@c 'aeglmbfhnc'
@c >>> ''.join(chain(*input_iterators))
@c 'dijkopqr'
@c 
@c 
@c >>> list(subslices('ABCD'))
@c ['A', 'AB', 'ABC', 'ABCD', 'B', 'BC', 'BCD', 'C', 'CD', 'D']
@c 
@c 
@c >>> ' '.join(map(''.join, derangements('ABCD')))
@c 'BADC BCDA BDAC CADB CDAB CDBA DABC DCAB DCBA'
@c >>> ' '.join(map(''.join, derangements('ABCD', 3)))
@c 'BAD BCA BCD BDA CAB CAD CDA CDB DAB DCA DCB'
@c >>> ' '.join(map(''.join, derangements('ABCD', 2)))
@c 'BA BC BD CA CD DA DC'
@c >>> ' '.join(map(''.join, derangements('ABCD', 1)))
@c 'B C D'
@c >>> ' '.join(map(''.join, derangements('ABCD', 0)))
@c ''
@c >>> # Compare number of derangements to https://oeis.org/A000166
@c >>> [len(list(derangements(range(n)))) for n in range(10)]
@c [1, 0, 1, 2, 9, 44, 265, 1854, 14833, 133496]
@c >>> # Verify that identical objects are treated as unique by position
@c >>> identical = 'X'
@c >>> distinct = 'x'
@c >>> seq1 = ('A', identical, 'B', identical)
@c >>> result1 = ' '.join(map(''.join, derangements(seq1)))
@c >>> result1
@c 'XAXB XBXA XXAB BAXX BXAX BXXA XAXB XBAX XBXA'
@c >>> seq2 = ('A', identical, 'B', distinct)
@c >>> result2 = ' '.join(map(''.join, derangements(seq2)))
@c >>> result2
@c 'XAxB XBxA XxAB BAxX BxAX BxXA xAXB xBAX xBXA'
@c >>> result1 == result2
@c False
@c >>> result1.casefold() == result2.casefold()
@c True
@c 
@c 
@c >>> list(powerset([1,2,3]))
@c [(), (1,), (2,), (3,), (1, 2), (1, 3), (2, 3), (1, 2, 3)]
@c >>> all(len(list(powerset(range(n)))) == 2**n for n in range(18))
@c True
@c >>> list(powerset('abcde')) == sorted(sorted(set(powerset('abcde'))), key=len)
@c True
@c 
@c 
@c >>> list(unique_everseen('AAAABBBCCDAABBB'))
@c ['A', 'B', 'C', 'D']
@c >>> list(unique_everseen('ABBCcAD', str.casefold))
@c ['A', 'B', 'C', 'D']
@c >>> list(unique_everseen('ABBcCAD', str.casefold))
@c ['A', 'B', 'c', 'D']
@c >>> # Verify that the input is consumed lazily
@c >>> input_iterator = iter('AAAABBBCCDAABBB')
@c >>> output_iterator = unique_everseen(input_iterator)
@c >>> next(output_iterator)
@c 'A'
@c >>> ''.join(input_iterator)
@c 'AAABBBCCDAABBB'
@c 
@c 
@c >>> list(unique_justseen('AAAABBBCCDAABBB'))
@c ['A', 'B', 'C', 'D', 'A', 'B']
@c >>> list(unique_justseen('ABBCcAD', str.casefold))
@c ['A', 'B', 'C', 'A', 'D']
@c >>> list(unique_justseen('ABBcCAD', str.casefold))
@c ['A', 'B', 'c', 'A', 'D']
@c >>> # Verify that the input is consumed lazily
@c >>> input_iterator = iter('AAAABBBCCDAABBB')
@c >>> output_iterator = unique_justseen(input_iterator)
@c >>> next(output_iterator)
@c 'A'
@c >>> ''.join(input_iterator)
@c 'AAABBBCCDAABBB'
@c 
@c 
@c >>> list(unique([[1, 2], [3, 4], [1, 2]]))
@c [[1, 2], [3, 4]]
@c >>> list(unique('ABBcCAD', str.casefold))
@c ['A', 'B', 'c', 'D']
@c >>> list(unique('ABBcCAD', str.casefold, reverse=True))
@c ['D', 'c', 'B', 'A']
@c 
@c 
@c >>> d = dict(a=1, b=2, c=3)
@c >>> it = iter_except(d.popitem, KeyError)
@c >>> d['d'] = 4
@c >>> next(it)
@c ('d', 4)
@c >>> next(it)
@c ('c', 3)
@c >>> next(it)
@c ('b', 2)
@c >>> d['e'] = 5
@c >>> next(it)
@c ('e', 5)
@c >>> next(it)
@c ('a', 1)
@c >>> next(it, 'empty')
@c 'empty'
@c 
@c 
@c >>> first_true('ABC0DEF1', '9', str.isdigit)
@c '0'
@c >>> # Verify that inputs are consumed lazily
@c >>> it = iter('ABC0DEF1')
@c >>> first_true(it, predicate=str.isdigit)
@c '0'
@c >>> ''.join(it)
@c 'DEF1'
@c 
@c >>> multinomial(5, 2, 2, 1, 1)
@c 83160
@c >>> word = 'coffee'
@c >>> multinomial(*Counter(word).values()) == len(set(permutations(word)))
@c True

@c # Old recipes and their tests which are guaranteed to continue to work.
@c 
@c def tabulate(function, start=0):
@c     "Return function(0), function(1), ..."
@c     return map(function, count(start))
@c 
@c def old_sumprod_recipe(vec1, vec2):
@c     "Compute a sum of products."
@c     return sum(starmap(operator.mul, zip(vec1, vec2, strict=True)))
@c 
@c def dotproduct(vec1, vec2):
@c     return sum(map(operator.mul, vec1, vec2))
@c 
@c def pad_none(iterable):
@c     """Returns the sequence elements and then returns None indefinitely.
@c 
@c     Useful for emulating the behavior of the built-in map() function.
@c     """
@c     return chain(iterable, repeat(None))
@c 
@c def triplewise(iterable):
@c     "Return overlapping triplets from an iterable"
@c     # triplewise('ABCDEFG') → ABC BCD CDE DEF EFG
@c     for (a, _), (b, c) in pairwise(pairwise(iterable)):
@c         yield a, b, c
@c 
@c def nth_combination(iterable, r, index):
@c     "Equivalent to list(combinations(iterable, r))[index]"
@c     pool = tuple(iterable)
@c     n = len(pool)
@c     c = math.comb(n, r)
@c     if index < 0:
@c         index += c
@c     if index < 0 or index >= c:
@c         raise IndexError
@c     result = []
@c     while r:
@c         c, n, r = c*r//n, n-1, r-1
@c         while index >= c:
@c             index -= c
@c             c, n = c*(n-r)//n, n-1
@c         result.append(pool[-1-n])
@c     return tuple(result)
@c 
@c def before_and_after(predicate, it):
@c    """ Variant of takewhile() that allows complete
@c        access to the remainder of the iterator.
@c 
@c        >>> it = iter('ABCdEfGhI')
@c        >>> all_upper, remainder = before_and_after(str.isupper, it)
@c        >>> ''.join(all_upper)
@c        'ABC'
@c        >>> ''.join(remainder)     # takewhile() would lose the 'd'
@c        'dEfGhI'
@c 
@c        Note that the true iterator must be fully consumed
@c        before the remainder iterator can generate valid results.
@c    """
@c    it = iter(it)
@c    transition = []
@c 
@c    def true_iterator():
@c        for elem in it:
@c            if predicate(elem):
@c                yield elem
@c            else:
@c                transition.append(elem)
@c                return
@c 
@c    return true_iterator(), chain(transition, it)
@c 
@c def partition(predicate, iterable):
@c     """Partition entries into false entries and true entries.
@c 
@c     If *predicate* is slow, consider wrapping it with functools.lru_cache().
@c     """
@c     # partition(is_odd, range(10)) → 0 2 4 6 8   and  1 3 5 7 9
@c     t1, t2 = tee(iterable)
@c     return filterfalse(predicate, t1), filter(predicate, t2)

@c >>> list(islice(tabulate(lambda x: 2*x), 4))
@c [0, 2, 4, 6]
@c 
@c 
@c >>> dotproduct([1,2,3], [4,5,6])
@c 32
@c 
@c 
@c >>> old_sumprod_recipe([1,2,3], [4,5,6])
@c 32
@c 
@c 
@c >>> list(islice(pad_none('abc'), 0, 6))
@c ['a', 'b', 'c', None, None, None]
@c 
@c 
@c >>> list(triplewise('ABCDEFG'))
@c [('A', 'B', 'C'), ('B', 'C', 'D'), ('C', 'D', 'E'), ('D', 'E', 'F'), ('E', 'F', 'G')]
@c 
@c 
@c >>> population = 'ABCDEFGH'
@c >>> for r in range(len(population) + 1):
@c ...     seq = list(combinations(population, r))
@c ...     for i in range(len(seq)):
@c ...         assert nth_combination(population, r, i) == seq[i]
@c ...     for i in range(-len(seq), 0):
@c ...         assert nth_combination(population, r, i) == seq[i]
@c ...
@c >>> iterable = 'abcde'
@c >>> r = 3
@c >>> combos = list(combinations(iterable, r))
@c >>> all(nth_combination(iterable, r, i) == comb for i, comb in enumerate(combos))
@c True
@c 
@c 
@c >>> it = iter('ABCdEfGhI')
@c >>> all_upper, remainder = before_and_after(str.isupper, it)
@c >>> ''.join(all_upper)
@c 'ABC'
@c >>> ''.join(remainder)
@c 'dEfGhI'
@c 
@c 
@c >>> def is_odd(x):
@c ...     return x % 2 == 1
@c ...
@c >>> evens, odds = partition(is_odd, range(10))
@c >>> list(evens)
@c [0, 2, 4, 6, 8]
@c >>> list(odds)
@c [1, 3, 5, 7, 9]
@c >>> # Verify that the input is consumed lazily
@c >>> input_iterator = iter(range(10))
@c >>> evens, odds = partition(is_odd, input_iterator)
@c >>> next(odds)
@c 1
@c >>> next(odds)
@c 3
@c >>> next(evens)
@c 0
@c >>> list(input_iterator)
@c [4, 5, 6, 7, 8, 9]

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node functools — 고차 함수와 콜러블 객체에 대한 연산,operator — 함수로서의 표준 연산자,itertools — Functions creating iterators for efficient looping,함수형 프로그래밍 모듈
@anchor{library/functools doc}@anchor{2bd3}@anchor{library/functools functools-higher-order-functions-and-operations-on-callable-objects}@anchor{2bd4}@anchor{library/functools module-functools}@anchor{63}@anchor{library/functools translation-repo}@anchor{2bd5}
@subsection @code{functools} — 고차 함수와 콜러블 객체에 대한 연산


@geindex module; functools

`소스 코드:' Lib/functools.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/functools.py}

@c import functools
@c from functools import *


__________________________________________________________________


The @code{functools} module is for higher-order functions: functions that act on
or return other functions. In general, any callable object can be treated as a
function for the purposes of this module.

The @code{functools} module defines the following functions:

@geindex cache() (functools 모듈)
@anchor{library/functools functools cache}@anchor{17ce}
@deffn {함수} @@functools.cache (user_function)

단순하고 가벼운 무제한 함수 캐시. 때때로 "memoize"@footnote{https://en.wikipedia.org/wiki/Memoization}라고도 합니다.

@code{lru_cache(maxsize=None)}와 같은 것을 반환하여, 함수 인자의 딕셔너리 조회 주위로 얇은 래퍼를 만듭니다. 이전 값을 제거할 필요가 없어서, 크기 제한이 있는 @ref{be1,,lru_cache()}보다 작고 빠릅니다.

예를 들면:

@example
@@cache
def factorial(n):
    return n * factorial(n-1) if n else 1

>>> factorial(10)   # no previously cached result, makes 11 recursive calls
3628800
>>> factorial(5)    # no new calls, just returns the cached result
120
>>> factorial(12)   # two new recursive calls, factorial(10) is cached
479001600
@end example

The cache is threadsafe so that the wrapped function can be used in
multiple threads.  This means that the underlying data structure will
remain coherent during concurrent updates.

It is possible for the wrapped function to be called more than once if
another thread makes an additional call before the initial call has been
completed and cached.


Added in version 3.9.

@end deffn

@geindex cached_property() (functools 모듈)
@anchor{library/functools functools cached_property}@anchor{762}
@deffn {함수} @@functools.cached_property (func)

클래스의 메서드를 값이 한 번 계산된 다음 인스턴스 수명 동안 일반 어트리뷰트로 캐시 되는 프로퍼티로 변환합니다. @ref{4b3,,property()}와 유사하고, 캐싱이 추가되었습니다. 비싸게 계산되고 그 외에는 사실상 불변인 인스턴스의 프로퍼티에 유용합니다.

예:

@example
class DataSet:

    def __init__(self, sequence_of_numbers):
        self._data = tuple(sequence_of_numbers)

    @@cached_property
    def stdev(self):
        return statistics.stdev(self._data)
@end example

@ref{762,,cached_property()}의 메커니즘은 @ref{4b3,,property()}와 다소 다릅니다. 일반 프로퍼티는 setter가 정의되지 않은 경우 어트리뷰트 쓰기를 차단합니다. 이와는 달리, `cached_property'는 쓰기를 허용합니다.

`cached_property' 데코레이터는 조회 시에만, 같은 이름의 어트리뷰트가 존재하지 않을 때만 실행됩니다. 실행되면, `cached_property'는 같은 이름의 어트리뷰트에 기록합니다. 후속 어트리뷰트 읽기와 쓰기는 `cached_property' 메서드보다 우선하며 일반 어트리뷰트처럼 작동합니다.

캐시 된 값은 어트리뷰트를 삭제하여 지울 수 있습니다. 이렇게 하면 `cached_property' 메서드가 다시 실행됩니다.

The `cached_property' does not prevent a possible race condition in
multi-threaded usage. The getter function could run more than once on the
same instance, with the latest run setting the cached value. If the cached
property is idempotent or otherwise not harmful to run more than once on an
instance, this is fine. If synchronization is needed, implement the necessary
locking inside the decorated getter function or around the cached property
access.

이 데코레이터는 
@geindex Python 향상 제안; PEP 412
PEP 412@footnote{https://peps.python.org/pep-0412/} 키 공유 딕셔너리의 작동을 방해함에 유의하십시오. 이는 인스턴스 딕셔너리가 평소보다 더 많은 공간을 차지할 수 있음을 의미합니다.

또한, 이 데코레이터는 각 인스턴스의 @code{__dict__} 어트리뷰트가 가변 매핑일 것을 요구합니다. 이는 메타 클래스(형 인스턴스의 @code{__dict__} 어트리뷰트가 클래스 이름 공간에 대한 읽기 전용 프락시이기 때문에)와 @code{__dict__}를 정의된 슬롯 중 하나로 포함하지 않고 @code{__slots__}를 지정하는 것(이러한 클래스는 @code{__dict__} 어트리뷰트를 전혀 제공하지 않기 때문에)과 같은 일부 형에서 작동하지 않음을 의미합니다.

가변 매핑을 사용할 수 없거나 공간 효율적인 키 공유가 필요하면, @ref{be1,,lru_cache()} 위에 @ref{4b3,,property()}를 쌓아서 @ref{762,,cached_property()}와 유사한 효과를 얻을 수도 있습니다. 이것이 @code{cached_property()}와 어떻게 다른지에 관한 자세한 내용은 @ref{2bd6,,How do I cache method calls?}을 찹조하세요.


Added in version 3.8.



버전 3.12에서 변경: Prior to Python 3.12, @code{cached_property} included an undocumented lock to
ensure that in multi-threaded usage the getter function was guaranteed to
run only once per instance. However, the lock was per-property, not
per-instance, which could result in unacceptably high lock contention. In
Python 3.12+ this locking is removed.

@end deffn

@geindex cmp_to_key() (functools 모듈)
@anchor{library/functools functools cmp_to_key}@anchor{13df}
@deffn {함수} functools.cmp_to_key (func)

구식 비교 함수를 @ref{1005,,키 함수}로 변환합니다. (@ref{dc6,,sorted()}, @ref{110a,,min()}, @ref{110b,,max()}, @ref{29c8,,heapq.nlargest()}, @ref{29c9,,heapq.nsmallest()}, @ref{2bcc,,itertools.groupby()}와 같은) 키 함수를 받아들이는 도구와 함께 사용됩니다. 이 함수는 주로 비교 함수 사용을 지원하는 파이썬 2에서 변환되는 프로그램의 전이 도구로 사용됩니다.

비교 함수는 두 개의 인자를 받아들이고, 그들을 비교하여, 작으면 음수, 같으면 0, 크면 양수를 반환하는 콜러블입니다. 키 함수는 하나의 인자를 받아들이고 정렬 키로 사용할 다른 값을 반환하는 콜러블입니다.

예:

@example
sorted(iterable, key=cmp_to_key(locale.strcoll))  # 로케일을 고려한 정렬 순서
@end example

정렬 예제와 간략한 정렬 자습서는 @ref{25de,,정렬 기법}를 참조하십시오.


Added in version 3.2.

@end deffn

@geindex lru_cache() (functools 모듈)
@anchor{library/functools functools lru_cache}@anchor{be1}
@deffn {함수} @@functools.lru_cache (user_function)

@deffnx {함수} @@functools.lru_cache (maxsize=128, typed=False)

가장 최근의 `maxsize' 호출까지 저장하는 기억하는(memoizing) 콜러블 함수를 감싸는 데코레이터. 비싸거나 I/O 병목 함수가 같은 인자로 주기적으로 호출될 때 시간을 절약할 수 있습니다.

The cache is threadsafe so that the wrapped function can be used in
multiple threads.  This means that the underlying data structure will
remain coherent during concurrent updates.

It is possible for the wrapped function to be called more than once if
another thread makes an additional call before the initial call has been
completed and cached.

결과를 캐시 하는 데 딕셔너리가 사용되기 때문에, 함수에 대한 위치와 키워드 인자는 @ref{823,,해시 가능}해야 합니다.

서도 다른 인자 패턴은 별도의 캐시 항목을 갖는 별개의 호출로 간주할 수 있습니다. 예를 들어, @code{f(a=1, b=2)}와 @code{f(b=2, a=1)}은 키워드 인자 순서가 다르며 두 개의 개별 캐시 항목을 가질 수 있습니다.

`user_function'이 지정되면, 콜러블이어야 합니다. 이는 `lru_cache' 데코레이터를 사용자 함수에 직접 적용 할 수 있도록 하며, `maxsize'를 기본값 128로 유지합니다:

@example
@@lru_cache
def count_vowels(sentence):
    return sum(sentence.count(vowel) for vowel in 'AEIOUaeiou')
@end example

`maxsize'가 @code{None}으로 설정되면, LRU 기능이 비활성화되고 캐시가 제한 없이 커질 수 있습니다.

If `typed' is set to true, function arguments of different types will be
cached separately.  If `typed' is false, the implementation will usually
regard them as equivalent calls and only cache a single result. (Some
types such as `str' and `int' may be cached separately even when `typed'
is false.)

Note, type specificity applies only to the function’s immediate arguments
rather than their contents.  The scalar arguments, @code{Decimal(42)} and
@code{Fraction(42)} are treated as distinct calls with distinct results.
In contrast, the tuple arguments @code{('answer', Decimal(42))} and
@code{('answer', Fraction(42))} are treated as equivalent.

래핑 된 함수는 `maxsize'와 `typed'의 값을 표시하는 새 @ref{183,,dict}를 반환하는 @code{cache_parameters()} 함수로 인스트루먼트 됩니다. 이것은 정보 제공만을 위한 것입니다. 값을 변경해도 효과가 없습니다.

@geindex cache_info() (functools.lru_cache 메서드)
@anchor{library/functools functools lru_cache cache_info}@anchor{2bd7}
To help measure the effectiveness of the cache and tune the `maxsize'
parameter, the wrapped function is instrumented with a @code{cache_info()}
function that returns a @ref{85d,,named tuple} showing `hits', `misses',
`maxsize' and `currsize'.

@geindex cache_clear() (functools.lru_cache 메서드)
@anchor{library/functools functools lru_cache cache_clear}@anchor{2bd8}
The decorator also provides a @code{cache_clear()} function for clearing or
invalidating the cache.

원래의 하부 함수는 @code{__wrapped__} 어트리뷰트를 통해 액세스 할 수 있습니다. 이것은 인트로스펙션, 캐시 우회 또는 다른 캐시로 함수를 다시 래핑하는 데 유용합니다.

The cache keeps references to the arguments and return values until they age
out of the cache or until the cache is cleared.

If a method is cached, the @code{self} instance argument is included in the
cache.  See @ref{2bd6,,How do I cache method calls?}

LRU (least recently used) 캐시@footnote{https://en.wikipedia.org/wiki/Cache_replacement_policies#Least_Recently_Used_(LRU)}는 가장 최근 호출이 향후 호출에 대한 최상의 예측일 때 가장 잘 작동합니다 (예를 들어, 뉴스 서버에서 가장 인기 있는 기사는 매일 바뀌는 경향이 있습니다). 캐시의 크기 제한은 웹 서버와 같은 오래 실행되는 프로세스에서 제한 없이 캐시가 커지지 않도록 합니다.

일반적으로, LRU 캐시는 이전에 계산된 값을 재사용하려고 할 때만 사용해야 합니다. 따라서, 부작용이 있는 함수, 각 호출에서 고유한 가변 객체를 만들어야 하는 함수 (가령 제너레이터와 비동기 함수), time()이나 random()과 같은 비순수(impure) 함수를 캐시 하는 것은 의미가 없습니다.

정적 웹 콘텐츠를 위한 LRU 캐시의 예:

@example
@@lru_cache(maxsize=32)
def get_pep(num):
    'PEP(Python Enhancement Proposal) 텍스트를 가져옵니다'
    resource = f'https://peps.python.org/pep-@{num:04d@}'
    try:
        with urllib.request.urlopen(resource) as s:
            return s.read()
    except urllib.error.HTTPError:
        return 'Not Found'

>>> for n in 8, 290, 308, 320, 8, 218, 320, 279, 289, 320, 9991:
...     pep = get_pep(n)
...     print(n, len(pep))

>>> get_pep.cache_info()
CacheInfo(hits=3, misses=8, maxsize=32, currsize=8)
@end example

동적 프로그래밍(dynamic programming)@footnote{https://en.wikipedia.org/wiki/Dynamic_programming} 기법을 구현하기 위해 캐시를 사용하여 피보나치 수@footnote{https://en.wikipedia.org/wiki/Fibonacci_number}를 효율적으로 계산하는 예:

@example
@@lru_cache(maxsize=None)
def fib(n):
    if n < 2:
        return n
    return fib(n-1) + fib(n-2)

>>> [fib(n) for n in range(16)]
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610]

>>> fib.cache_info()
CacheInfo(hits=28, misses=16, maxsize=None, currsize=16)
@end example


Added in version 3.2.



버전 3.3에서 변경: `typed' 옵션을 추가했습니다.



버전 3.8에서 변경: `user_function' 옵션을 추가했습니다.



버전 3.9에서 변경: @code{cache_parameters()} 함수를 추가했습니다

@end deffn

@geindex total_ordering() (functools 모듈)
@anchor{library/functools functools total_ordering}@anchor{1141}
@deffn {함수} @@functools.total_ordering

하나 이상의 풍부한 비교(rich comparison) 순서 메서드를 정의하는 클래스를 주면, 이 클래스 데코레이터가 나머지를 제공합니다. 가능한 모든 풍부한 비교 연산을 지정하는 데 드는 노력이 단순화됩니다:

The class must define one of @ref{14a5,,__lt__()}, @ref{150f,,__le__()},
@ref{1510,,__gt__()}, or @ref{1511,,__ge__()}.
In addition, the class should supply an @ref{cf1,,__eq__()} method.

예를 들면:

@example
@@total_ordering
class Student:
    def _is_valid_operand(self, other):
        return (hasattr(other, "lastname") and
                hasattr(other, "firstname"))
    def __eq__(self, other):
        if not self._is_valid_operand(other):
            return NotImplemented
        return ((self.lastname.lower(), self.firstname.lower()) ==
                (other.lastname.lower(), other.firstname.lower()))
    def __lt__(self, other):
        if not self._is_valid_operand(other):
            return NotImplemented
        return ((self.lastname.lower(), self.firstname.lower()) <
                (other.lastname.lower(), other.firstname.lower()))
@end example

@cartouche
@quotation 참고 
이 데코레이터를 사용하면 올바르게 동작하는 전 순서(totally ordered) 형을 쉽게 만들 수 있지만, 파생된 비교 메서드에서 실행 속도가 느려지고 스택 트레이스가 더 복잡해지는 대가를 지불합니다. 성능 벤치마킹이 이것이 특정 응용 프로그램의 병목임을 가리키면, 6가지의 풍부한 비교 메서드를 모두 구현하여 속도를 쉽게 높일 수 있습니다.
@end quotation
@end cartouche

@cartouche
@quotation 참고 
This decorator makes no attempt to override methods that have been
declared in the class `or its superclasses'. Meaning that if a
superclass defines a comparison operator, `total_ordering' will not
implement it again, even if the original method is abstract.
@end quotation
@end cartouche


Added in version 3.2.



버전 3.4에서 변경: 인식할 수 없는 형에 대해 하부 비교 함수에서 @code{NotImplemented}를 반환하는 것이 이제 지원됩니다.

@end deffn

@geindex Placeholder (functools 모듈)
@anchor{library/functools functools Placeholder}@anchor{216}
@deffn {데이터} functools.Placeholder

A singleton object used as a sentinel to reserve a place
for positional arguments when calling @ref{217,,partial()}
and @ref{218,,partialmethod()}.


Added in version 3.14.

@end deffn

@geindex partial() (functools 모듈)
@anchor{library/functools functools partial}@anchor{217}
@deffn {함수} functools.partial (func, /, *args, **keywords)

호출될 때 위치 인자 `args'와 키워드 인자 `keywords'로 호출된 `func'처럼 동작하는 새 @ref{219,,partial 객체}를 반환합니다. 더 많은 인자가 호출에 제공되면, `args'에 추가됩니다. 추가 키워드 인자가 제공되면, `keywords'를 확장하고 대체합니다. 대략 다음과 동등합니다:

@example
def partial(func, /, *args, **keywords):
    def newfunc(*more_args, **more_keywords):
        return func(*args, *more_args, **(keywords | more_keywords))
    newfunc.func = func
    newfunc.args = args
    newfunc.keywords = keywords
    return newfunc
@end example

The @code{partial()} function is used for partial function application which “freezes”
some portion of a function’s arguments and/or keywords resulting in a new object
with a simplified signature.  For example, @code{partial()} can be used to create
a callable that behaves like the @ref{19b,,int()} function where the `base' argument
defaults to @code{2}:

@example
>>> basetwo = partial(int, base=2)
>>> basetwo.__doc__ = 'Convert base 2 string to an int.'
>>> basetwo('10010')
18
@end example

If @ref{216,,Placeholder} sentinels are present in `args', they will be filled first
when @code{partial()} is called. This makes it possible to pre-fill any positional
argument with a call to @code{partial()}; without @code{Placeholder},
only the chosen number of leading positional arguments can be pre-filled.

If any @code{Placeholder} sentinels are present, all must be filled at call time:

@example
>>> say_to_world = partial(print, Placeholder, Placeholder, "world!")
>>> say_to_world('Hello', 'dear')
Hello dear world!
@end example

Calling @code{say_to_world('Hello')} raises a @ref{198,,TypeError}, because
only one positional argument is provided, but there are two placeholders
that must be filled in.

If @code{partial()} is applied to an existing @code{partial()} object,
@code{Placeholder} sentinels of the input object are filled in with
new positional arguments.
A placeholder can be retained by inserting a new
@code{Placeholder} sentinel to the place held by a previous @code{Placeholder}:

@example
>>> from functools import partial, Placeholder as _
>>> remove = partial(str.replace, _, _, '@w{'})
>>> message = 'Hello, dear dear world!'
>>> remove(message, ' dear')
'Hello, world!'
>>> remove_dear = partial(remove, _, ' dear')
>>> remove_dear(message)
'Hello, world!'
>>> remove_first_dear = partial(remove_dear, _, 1)
>>> remove_first_dear(message)
'Hello, dear world!'
@end example

@code{Placeholder} cannot be passed to @code{partial()} as a keyword argument.


버전 3.14에서 변경: Added support for @ref{216,,Placeholder} in positional arguments.

@end deffn

@geindex partialmethod (functools 클래스)
@anchor{library/functools functools partialmethod}@anchor{218}
@deffn {클래스} functools.partialmethod (func, /, *args, **keywords)

직접 호출하기보다는 메서드 정의로 사용되도록 설계된 것을 제외하고는 @ref{217,,partial}과 같이 동작하는 새 @ref{218,,partialmethod} 디스크립터를 반환합니다.

`func'는 @ref{1884,,디스크립터}나 콜러블이어야 합니다 (일반 함수처럼 둘 모두인 객체는 디스크립터로 처리됩니다).

When `func' is a descriptor (such as a normal Python function,
@ref{48f,,classmethod()}, @ref{453,,staticmethod()}, @ref{128a,,abstractmethod()} or
another instance of @code{partialmethod}), calls to @code{__get__} are
delegated to the underlying descriptor, and an appropriate
@ref{219,,partial object} returned as the result.

`func'가 디스크립터가 아닌 콜러블이면, 적절한 연결된 메서드가 동적으로 만들어집니다. 이것은 메서드로 사용될 때 일반 파이썬 함수처럼 작동합니다: @ref{218,,partialmethod} 생성자에 제공된 `args'와 `keywords'보다도 전에 `self' 인자가 첫 번째 위치 인자로 삽입됩니다.

예:

@example
>>> class Cell:
...     def __init__(self):
...         self._alive = False
...     @@property
...     def alive(self):
...         return self._alive
...     def set_state(self, state):
...         self._alive = bool(state)
...     set_alive = partialmethod(set_state, True)
...     set_dead = partialmethod(set_state, False)
...
>>> c = Cell()
>>> c.alive
False
>>> c.set_alive()
>>> c.alive
True
@end example


Added in version 3.4.

@end deffn

@geindex reduce() (functools 모듈)
@anchor{library/functools functools reduce}@anchor{21a}
@deffn {함수} functools.reduce (function, iterable, /[, initial])

두 인자의 `function'을 왼쪽에서 오른쪽으로 `iterable'의 항목에 누적적으로 적용해서, 이터러블을 단일 값으로 줄입니다. 예를 들어, @code{reduce(lambda x, y: x+y, [1, 2, 3, 4, 5])}는 @code{((((1+2)+3)+4)+5)}를 계산합니다. 왼쪽 인자 `x'는 누적값이고 오른쪽 인자 `y'는 `iterable'에서 온 갱신 값입니다. 선택적 `initial'가 있으면, 계산에서 이터러블의 항목 앞에 배치되고, 이터러블이 비어있을 때 기본값의 역할을 합니다. `initial'가 제공되지 않고 `iterable'에 하나의 항목만 포함되면, 첫 번째 항목이 반환됩니다.

대략 다음과 동등합니다:

@example
initial_missing = object()

def reduce(function, iterable, /, initial=initial_missing):
    it = iter(iterable)
    if initial is initial_missing:
        value = next(it)
    else:
        value = initial
    for element in it:
        value = function(value, element)
    return value
@end example

모든 중간값을 산출하는 이터레이터는 @ref{bef,,itertools.accumulate()}를 참조하십시오.


버전 3.14에서 변경: `initial' is now supported as a keyword argument.

@end deffn

@geindex singledispatch() (functools 모듈)
@anchor{library/functools functools singledispatch}@anchor{84a}
@deffn {함수} @@functools.singledispatch

함수를 @ref{be2,,싱글 디스패치} @ref{be3,,제네릭 함수}로 변환합니다.

제네릭 함수를 정의하려면, @code{@@singledispatch} 데코레이터로 데코레이트 하십시오. @code{@@singledispatch}를 사용해서 함수를 정의할 때, 디스패치는 첫 번째 인자의 형으로 일어남에 유의하십시오:

@example
>>> from functools import singledispatch
>>> @@singledispatch
... def fun(arg, verbose=False):
...     if verbose:
...         print("Let me just say,", end=" ")
...     print(arg)
@end example

@geindex register() (functools.singledispatch 메서드)
@anchor{library/functools functools singledispatch register}@anchor{2bd9}
To add overloaded implementations to the function, use the @code{register()}
attribute of the generic function, which can be used as a decorator.  For
functions annotated with types, the decorator will infer the type of the
first argument automatically:

@example
>>> @@fun.register
... def _(arg: int, verbose=False):
...     if verbose:
...         print("Strength in numbers, eh?", end=" ")
...     print(arg)
...
>>> @@fun.register
... def _(arg: list, verbose=False):
...     if verbose:
...         print("Enumerate this:")
...     for i, elem in enumerate(arg):
...         print(i, elem)
@end example

@ref{2a8,,typing.Union} can also be used:

@example
>>> @@fun.register
... def _(arg: int | float, verbose=False):
...     if verbose:
...         print("Strength in numbers, eh?", end=" ")
...     print(arg)
...
>>> from typing import Union
>>> @@fun.register
... def _(arg: Union[list, set], verbose=False):
...     if verbose:
...         print("Enumerate this:")
...     for i, elem in enumerate(arg):
...         print(i, elem)
...
@end example

형 어노테이션을 사용하지 않는 코드의 경우, 적절한 형 인자를 데코레이터 자체에 명시적으로 전달할 수 있습니다:

@example
>>> @@fun.register(complex)
... def _(arg, verbose=False):
...     if verbose:
...         print("Better than complicated.", end=" ")
...     print(arg.real, arg.imag)
...
@end example

For code that dispatches on a collections type (e.g., @code{list}), but wants
to typehint the items of the collection (e.g., @code{list[int]}), the
dispatch type should be passed explicitly to the decorator itself with the
typehint going into the function definition:

@example
>>> @@fun.register(list)
... def _(arg: list[int], verbose=False):
...     if verbose:
...         print("Enumerate this:")
...     for i, elem in enumerate(arg):
...         print(i, elem)
@end example

@cartouche
@quotation 참고 
At runtime the function will dispatch on an instance of a list regardless
of the type contained within the list i.e. @code{[1,2,3]} will be
dispatched the same as @code{["foo", "bar", "baz"]}. The annotation
provided in this example is for static type checkers only and has no
runtime impact.
@end quotation
@end cartouche

To enable registering @ref{2bda,,lambdas} and pre-existing functions,
the @ref{2bd9,,register()} attribute can also be used in a functional form:

@example
>>> def nothing(arg, verbose=False):
...     print("Nothing.")
...
>>> fun.register(type(None), nothing)
@end example

The @ref{2bd9,,register()} attribute returns the undecorated function. This
enables decorator stacking, @ref{ab,,pickling}, and the creation
of unit tests for each variant independently:

@example
>>> @@fun.register(float)
... @@fun.register(Decimal)
... def fun_num(arg, verbose=False):
...     if verbose:
...         print("Half of your number:", end=" ")
...     print(arg / 2)
...
>>> fun_num is fun
False
@end example

호출되면, 제네릭 함수는 첫 번째 인자의 형에 따라 디스패치 합니다:

@example
>>> fun("Hello, world.")
Hello, world.
>>> fun("test.", verbose=True)
Let me just say, test.
>>> fun(42, verbose=True)
Strength in numbers, eh? 42
>>> fun(['spam', 'spam', 'eggs', 'spam'], verbose=True)
Enumerate this:
0 spam
1 spam
2 eggs
3 spam
>>> fun(None)
Nothing.
>>> fun(1.23)
0.615
@end example

특정 형에 대해 등록된 구현이 없으면, 더 일반적인 구현을 찾는 데 메서드 결정 순서가 사용됩니다. @code{@@singledispatch}로 데코레이트 된 원래 함수는 베이스 @ref{c7d,,object} 형으로 등록되어서, 더 나은 구현이 발견되지 않으면 사용됩니다.

구현이 @ref{13bb,,추상 베이스 클래스}에 등록되면, 베이스 클래스의 가상 서브 클래스는 그 구현으로 디스패치 됩니다:

@example
>>> from collections.abc import Mapping
>>> @@fun.register
... def _(arg: Mapping, verbose=False):
...     if verbose:
...         print("Keys & Values")
...     for key, value in arg.items():
...         print(key, "=>", value)
...
>>> fun(@{"a": "b"@})
a => b
@end example

제네릭 함수가 주어진 형에 대해 어떤 구현을 선택하는지 확인하려면 @code{dispatch()} 어트리뷰트를 사용하십시오:

@example
>>> fun.dispatch(float)
<function fun_num at 0x1035a2840>
>>> fun.dispatch(dict)    # 참고: 기본 구현
<function fun at 0x103fe0000>
@end example

등록된 모든 구현에 액세스하려면, 읽기 전용 @code{registry} 어트리뷰트를 사용하십시오:

@example
>>> fun.registry.keys()
dict_keys([<class 'NoneType'>, <class 'int'>, <class 'object'>,
          <class 'decimal.Decimal'>, <class 'list'>,
          <class 'float'>])
>>> fun.registry[float]
<function fun_num at 0x1035a2840>
>>> fun.registry[object]
<function fun at 0x103fe0000>
@end example


Added in version 3.4.



버전 3.7에서 변경: The @ref{2bd9,,register()} attribute now supports using type annotations.



버전 3.11에서 변경: The @ref{2bd9,,register()} attribute now supports
@ref{2a8,,typing.Union} as a type annotation.

@end deffn

@geindex singledispatchmethod (functools 클래스)
@anchor{library/functools functools singledispatchmethod}@anchor{be4}
@deffn {클래스} functools.singledispatchmethod (func)

메서드를 @ref{be2,,싱글 디스패치} @ref{be3,,제네릭 함수}로 변환합니다.

To define a generic method, decorate it with the @code{@@singledispatchmethod}
decorator. When defining a method using @code{@@singledispatchmethod}, note
that the dispatch happens on the type of the first non-`self' or non-`cls'
argument:

@example
class Negator:
    @@singledispatchmethod
    def neg(self, arg):
        raise NotImplementedError("Cannot negate a")

    @@neg.register
    def _(self, arg: int):
        return -arg

    @@neg.register
    def _(self, arg: bool):
        return not arg
@end example

@code{@@singledispatchmethod} supports nesting with other decorators such as
@ref{48f,,@@classmethod}. Note that to allow for
@code{dispatcher.register}, @code{singledispatchmethod} must be the `outer most'
decorator. Here is the @code{Negator} class with the @code{neg} methods bound to
the class, rather than an instance of the class:

@example
class Negator:
    @@singledispatchmethod
    @@classmethod
    def neg(cls, arg):
        raise NotImplementedError("Cannot negate a")

    @@neg.register
    @@classmethod
    def _(cls, arg: int):
        return -arg

    @@neg.register
    @@classmethod
    def _(cls, arg: bool):
        return not arg
@end example

The same pattern can be used for other similar decorators:
@ref{453,,@@staticmethod}, @ref{128a,,@@~abc.abstractmethod}, and others.


Added in version 3.8.

@end deffn

@geindex update_wrapper() (functools 모듈)
@anchor{library/functools functools update_wrapper}@anchor{1221}
@deffn {함수} functools.update_wrapper (wrapper, wrapped, assigned=WRAPPER_ASSIGNMENTS, updated=WRAPPER_UPDATES)

`wrapped' 함수처럼 보이도록 `wrapper' 함수를 갱신합니다. 선택적 인자는 원래 함수의 어떤 어트리뷰트가 wrapper 함수의 일치하는 어트리뷰트에 직접 대입되고 wrapper 함수의 어떤 어트리뷰트가 원래 함수의 해당 어트리뷰트로 갱신되는지 지정하는 튜플입니다. 이 인자들의 기본값은 모듈 수준 상수 @code{WRAPPER_ASSIGNMENTS}(wrapper 함수의 @ref{2347,,__module__}, @ref{14d9,,__name__}, @ref{2346,,__qualname__}, @ref{13dd,,__annotations__}, @ref{234a,,__type_params__} 및 @ref{13de,,__doc__} 독스트링에 대입합니다)와 @code{WRAPPER_UPDATES}(wrapper 함수의 @ref{14d7,,__dict__}, 즉 인스턴스 딕셔너리를 갱신합니다)입니다.

내부 검사와 기타 목적(예를 들어 @ref{be1,,lru_cache()}와 같은 캐싱 데코레이터 우회)을 위해 원래 함수에 액세스 할 수 있도록, 이 함수는 래핑 되는 함수를 가리키는 @code{__wrapped__} 어트리뷰트를 wrapper에 자동으로 추가합니다.

이 함수의 주요 용도는 데코레이트 된 함수를 래핑하고 wrapper를 반환하는 @ref{939,,데코레이터} 함수에서 사용하는 것입니다. wrapper 함수가 갱신되지 않으면, 반환된 함수의 메타 데이터는 원래 함수 정의가 아닌 wrapper 정의를 반영하게 되어 일반적으로 도움이 되지 않습니다.

@ref{1221,,update_wrapper()}는 함수 이외의 콜러블과 함께 사용할 수 있습니다. 래핑 되는 객체에서 누락된 `assigned'나 `updated'로 이름 지정된 어트리뷰트는 무시됩니다 (즉, 이 함수는 wrapper 함수에서 그 어트리뷰트를 설정하려고 시도하지 않습니다). wrapper 함수 자체에 `updated'에 이름 지정된 어트리뷰트가 없으면 여전히 @ref{5ee,,AttributeError}가 발생합니다.


버전 3.2에서 변경: The @code{__wrapped__} attribute is now automatically added.
The @ref{13dd,,__annotations__} attribute is now copied by default.
Missing attributes no longer trigger an @ref{5ee,,AttributeError}.



버전 3.4에서 변경: @code{__wrapped__} 어트리뷰트는 이제 해당 함수가 @code{__wrapped__} 어트리뷰트를 정의한 경우에도 항상 래핑 된 함수를 참조합니다. (bpo-17482@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=17482}를 참조하십시오)



버전 3.12에서 변경: The @ref{234a,,__type_params__} attribute is now copied by default.

@end deffn

@geindex wraps() (functools 모듈)
@anchor{library/functools functools wraps}@anchor{115c}
@deffn {함수} @@functools.wraps (wrapped, assigned=WRAPPER_ASSIGNMENTS, updated=WRAPPER_UPDATES)

래퍼 함수를 정의할 때 함수 데코레이터로 @ref{1221,,update_wrapper()}를 호출하기 위한 편의 함수입니다. @code{partial(update_wrapper, wrapped=wrapped, assigned=assigned, updated=updated)}와 동등합니다. 예를 들면:

@example
>>> from functools import wraps
>>> def my_decorator(f):
...     @@wraps(f)
...     def wrapper(*args, **kwds):
...         print('Calling decorated function')
...         return f(*args, **kwds)
...     return wrapper
...
>>> @@my_decorator
... def example():
...     """Docstring"""
...     print('Called example function')
...
>>> example()
Calling decorated function
Called example function
>>> example.__name__
'example'
>>> example.__doc__
'Docstring'
@end example

Without the use of this decorator factory, the name of the example function
would have been @code{'wrapper'}, and the docstring of the original @code{example()}
would have been lost.
@end deffn

@menu
* partial 객체:: 

@end menu

@node partial 객체,,,functools — 고차 함수와 콜러블 객체에 대한 연산
@anchor{library/functools id1}@anchor{2bdb}@anchor{library/functools partial-objects}@anchor{219}
@subsubsection @code{partial} 객체


@ref{217,,partial} 객체는 @ref{217,,partial()}이 만든 콜러블 객체입니다. 세 가지 읽기 전용 어트리뷰트가 있습니다:

@geindex func (functools.partial의 속성)
@anchor{library/functools functools partial func}@anchor{2bdc}
@deffn {속성} partial.func

콜러블 객체나 함수. @ref{217,,partial} 객체에 대한 호출은 새로운 인자와 키워드와 함께 @ref{2bdc,,func}로 전달됩니다.
@end deffn

@geindex args (functools.partial의 속성)
@anchor{library/functools functools partial args}@anchor{2bdd}
@deffn {속성} partial.args

@ref{217,,partial} 객체 호출에 제공되는 위치 인자 앞에 추가될 가장 왼쪽 위치 인자들입니다.
@end deffn

@geindex keywords (functools.partial의 속성)
@anchor{library/functools functools partial keywords}@anchor{2bde}
@deffn {속성} partial.keywords

@ref{217,,partial} 객체가 호출될 때 제공될 키워드 인자들입니다.
@end deffn

@ref{217,,partial} objects are like @ref{59b,,function objects} in that they are
callable, weak referenceable, and can have attributes.  There are some important
differences.  For instance, the @ref{1265,,__name__} and @ref{b21,,__doc__} attributes
are not created automatically.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node operator — 함수로서의 표준 연산자,,functools — 고차 함수와 콜러블 객체에 대한 연산,함수형 프로그래밍 모듈
@anchor{library/operator doc}@anchor{2bdf}@anchor{library/operator module-operator}@anchor{a3}@anchor{library/operator operator-standard-operators-as-functions}@anchor{2be0}@anchor{library/operator translation-repo}@anchor{2be1}
@subsection @code{operator} — 함수로서의 표준 연산자


@geindex module; operator

`소스 코드:' Lib/operator.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/operator.py}

@c import operator
@c from operator import itemgetter, iadd


__________________________________________________________________


The @code{operator} module exports a set of efficient functions corresponding to
the intrinsic operators of Python.  For example, @code{operator.add(x, y)} is
equivalent to the expression @code{x+y}. Many function names are those used for
special methods, without the double underscores.  For backward compatibility,
many of these have a variant with the double underscores kept. The variants
without the double underscores are preferred for clarity.

함수는 객체 비교, 논리 연산, 수학 연산 및 시퀀스 연산을 수행하는 범주로 분류됩니다.

객체 비교 함수는 모든 객체에 유용하며, 이들이 지원하는 풍부한 비교(rich comparison) 연산자의 이름을 따릅니다:

@geindex lt() (operator 모듈)
@geindex le() (operator 모듈)
@geindex eq() (operator 모듈)
@geindex ne() (operator 모듈)
@geindex ge() (operator 모듈)
@geindex gt() (operator 모듈)
@geindex __lt__() (operator 모듈)
@geindex __le__() (operator 모듈)
@geindex __eq__() (operator 모듈)
@geindex __ne__() (operator 모듈)
@geindex __ge__() (operator 모듈)
@geindex __gt__() (operator 모듈)
@anchor{library/operator operator lt}@anchor{2be2}
@deffn {함수} operator.lt (a, b)
@anchor{library/operator operator le}@anchor{2be3}
@deffnx {함수} operator.le (a, b)
@anchor{library/operator operator eq}@anchor{2be4}
@deffnx {함수} operator.eq (a, b)
@anchor{library/operator operator ne}@anchor{2be5}
@deffnx {함수} operator.ne (a, b)
@anchor{library/operator operator ge}@anchor{2be6}
@deffnx {함수} operator.ge (a, b)
@anchor{library/operator operator gt}@anchor{2be7}
@deffnx {함수} operator.gt (a, b)
@anchor{library/operator operator __lt__}@anchor{2be8}
@deffnx {함수} operator.__lt__ (a, b)
@anchor{library/operator operator __le__}@anchor{2be9}
@deffnx {함수} operator.__le__ (a, b)
@anchor{library/operator operator __eq__}@anchor{2bea}
@deffnx {함수} operator.__eq__ (a, b)
@anchor{library/operator operator __ne__}@anchor{2beb}
@deffnx {함수} operator.__ne__ (a, b)
@anchor{library/operator operator __ge__}@anchor{2bec}
@deffnx {함수} operator.__ge__ (a, b)
@anchor{library/operator operator __gt__}@anchor{2bed}
@deffnx {함수} operator.__gt__ (a, b)

`a'와 `b' 사이에 “풍부한 비교(rich comparisons)”를 수행합니다. 구체적으로, @code{lt(a, b)}는 @code{a < b}와 동등하고, @code{le(a, b)}는 @code{a <= b}와 동등하고, @code{eq(a, b)}는 @code{a == b}와 동등하고, @code{ne(a, b)}는 @code{a != b}와 동등하고, @code{gt(a, b)}는 @code{a > b}와 동등하고, @code{ge(a, b)}는 @code{a >= b}와 동등합니다. 이러한 함수는 불리언 값으로 해석 할 수도 있고, 그렇지 않을 수도 있는 임의의 값을 반환 할 수 있음에 유의하십시오. 풍부한 비교에 대한 자세한 정보는 @ref{24d0,,비교}를 참조하십시오.
@end deffn

논리 연산도 일반적으로 모든 객체에 적용 할 수 있으며, 진릿값 검사, 아이덴티티 검사 및 불리언 연산을 지원합니다:

@geindex not_() (operator 모듈)
@geindex __not__() (operator 모듈)
@anchor{library/operator operator not_}@anchor{2bee}
@deffn {함수} operator.not_ (obj)
@anchor{library/operator operator __not__}@anchor{2bef}
@deffnx {함수} operator.__not__ (obj)

@ref{24da,,not} `obj'의 결과를 반환합니다. (객체 인스턴스에는 @code{__not__()} 메서드가 없음에 유의하십시오; 인터프리터의 코어만이 이 연산을 정의합니다. 결과는 @ref{14da,,__bool__()}과 @ref{1797,,__len__()} 메서드의 영향을 받습니다.)
@end deffn

@geindex truth() (operator 모듈)
@anchor{library/operator operator truth}@anchor{2bf0}
@deffn {함수} operator.truth (obj)

`obj'가 참이면 @ref{e06,,True}를 반환하고, 그렇지 않으면 @ref{d2a,,False}를 반환합니다. 이것은 @ref{3c3,,bool} 생성자를 사용하는 것과 동등합니다.
@end deffn

@geindex is_() (operator 모듈)
@anchor{library/operator operator is_}@anchor{2bf1}
@deffn {함수} operator.is_ (a, b)

@code{a is b}를 반환합니다. 객체 아이덴티티를 검사합니다.
@end deffn

@geindex is_not() (operator 모듈)
@anchor{library/operator operator is_not}@anchor{2bf2}
@deffn {함수} operator.is_not (a, b)

@code{a is not b}를 반환합니다. 객체 아이덴티티를 검사합니다.
@end deffn

@geindex is_none() (operator 모듈)
@anchor{library/operator operator is_none}@anchor{255}
@deffn {함수} operator.is_none (a)

Return @code{a is None}.  Tests object identity.


Added in version 3.14.

@end deffn

@geindex is_not_none() (operator 모듈)
@anchor{library/operator operator is_not_none}@anchor{256}
@deffn {함수} operator.is_not_none (a)

Return @code{a is not None}.  Tests object identity.


Added in version 3.14.

@end deffn

수학적 및 비트별 연산이 가장 많습니다:

@geindex abs() (operator 모듈)
@geindex __abs__() (operator 모듈)
@anchor{library/operator operator abs}@anchor{2bf3}
@deffn {함수} operator.abs (obj)
@anchor{library/operator operator __abs__}@anchor{2bf4}
@deffnx {함수} operator.__abs__ (obj)

`obj'의 절댓값을 반환합니다.
@end deffn

@geindex add() (operator 모듈)
@geindex __add__() (operator 모듈)
@anchor{library/operator operator add}@anchor{2bf5}
@deffn {함수} operator.add (a, b)
@anchor{library/operator operator __add__}@anchor{2bf6}
@deffnx {함수} operator.__add__ (a, b)

`a'와 `b' 숫자에 대해, @code{a + b}를 반환합니다.
@end deffn

@geindex and_() (operator 모듈)
@geindex __and__() (operator 모듈)
@anchor{library/operator operator and_}@anchor{2bf7}
@deffn {함수} operator.and_ (a, b)
@anchor{library/operator operator __and__}@anchor{2bf8}
@deffnx {함수} operator.__and__ (a, b)

`a'와 `b'의 비트별 논리곱(and)을 반환합니다.
@end deffn

@geindex floordiv() (operator 모듈)
@geindex __floordiv__() (operator 모듈)
@anchor{library/operator operator floordiv}@anchor{2bf9}
@deffn {함수} operator.floordiv (a, b)
@anchor{library/operator operator __floordiv__}@anchor{2bfa}
@deffnx {함수} operator.__floordiv__ (a, b)

@code{a // b}를 반환합니다.
@end deffn

@geindex index() (operator 모듈)
@geindex __index__() (operator 모듈)
@anchor{library/operator operator index}@anchor{1ccf}
@deffn {함수} operator.index (a)
@anchor{library/operator operator __index__}@anchor{2bfb}
@deffnx {함수} operator.__index__ (a)

정수로 변환된 `a'를 반환합니다. @code{a.__index__()}와 동등합니다.


버전 3.10에서 변경: The result always has exact type @ref{19b,,int}.  Previously, the result
could have been an instance of a subclass of @code{int}.

@end deffn

@geindex inv() (operator 모듈)
@geindex invert() (operator 모듈)
@geindex __inv__() (operator 모듈)
@geindex __invert__() (operator 모듈)
@anchor{library/operator operator inv}@anchor{2bfc}
@deffn {함수} operator.inv (obj)
@anchor{library/operator operator invert}@anchor{2bfd}
@deffnx {함수} operator.invert (obj)
@anchor{library/operator operator __inv__}@anchor{2bfe}
@deffnx {함수} operator.__inv__ (obj)
@anchor{library/operator operator __invert__}@anchor{2bff}
@deffnx {함수} operator.__invert__ (obj)

숫자 `obj'의 비트별 반전을 반환합니다. 이것은 @code{~obj}와 동등합니다.
@end deffn

@geindex lshift() (operator 모듈)
@geindex __lshift__() (operator 모듈)
@anchor{library/operator operator lshift}@anchor{2c00}
@deffn {함수} operator.lshift (a, b)
@anchor{library/operator operator __lshift__}@anchor{2c01}
@deffnx {함수} operator.__lshift__ (a, b)

`a'를 `b'만큼 왼쪽으로 시프트 한 값을 반환합니다.
@end deffn

@geindex mod() (operator 모듈)
@geindex __mod__() (operator 모듈)
@anchor{library/operator operator mod}@anchor{2c02}
@deffn {함수} operator.mod (a, b)
@anchor{library/operator operator __mod__}@anchor{2c03}
@deffnx {함수} operator.__mod__ (a, b)

@code{a % b}를 반환합니다.
@end deffn

@geindex mul() (operator 모듈)
@geindex __mul__() (operator 모듈)
@anchor{library/operator operator mul}@anchor{2bd1}
@deffn {함수} operator.mul (a, b)
@anchor{library/operator operator __mul__}@anchor{2c04}
@deffnx {함수} operator.__mul__ (a, b)

`a'와 `b' 숫자에 대해, @code{a * b}를 반환합니다.
@end deffn

@geindex matmul() (operator 모듈)
@geindex __matmul__() (operator 모듈)
@anchor{library/operator operator matmul}@anchor{1034}
@deffn {함수} operator.matmul (a, b)
@anchor{library/operator operator __matmul__}@anchor{2c05}
@deffnx {함수} operator.__matmul__ (a, b)

@code{a @@ b}를 반환합니다.


Added in version 3.5.

@end deffn

@geindex neg() (operator 모듈)
@geindex __neg__() (operator 모듈)
@anchor{library/operator operator neg}@anchor{2c06}
@deffn {함수} operator.neg (obj)
@anchor{library/operator operator __neg__}@anchor{2c07}
@deffnx {함수} operator.__neg__ (obj)

`obj'의 부정(@code{-obj})을 반환합니다.
@end deffn

@geindex or_() (operator 모듈)
@geindex __or__() (operator 모듈)
@anchor{library/operator operator or_}@anchor{2c08}
@deffn {함수} operator.or_ (a, b)
@anchor{library/operator operator __or__}@anchor{2c09}
@deffnx {함수} operator.__or__ (a, b)

`a'와 `b'의 비트별 논리합(or)을 반환합니다.
@end deffn

@geindex pos() (operator 모듈)
@geindex __pos__() (operator 모듈)
@anchor{library/operator operator pos}@anchor{2c0a}
@deffn {함수} operator.pos (obj)
@anchor{library/operator operator __pos__}@anchor{2c0b}
@deffnx {함수} operator.__pos__ (obj)

양의 `obj'(@code{+obj})를 반환합니다.
@end deffn

@geindex pow() (operator 모듈)
@geindex __pow__() (operator 모듈)
@anchor{library/operator operator pow}@anchor{2c0c}
@deffn {함수} operator.pow (a, b)
@anchor{library/operator operator __pow__}@anchor{2c0d}
@deffnx {함수} operator.__pow__ (a, b)

`a'와 `b' 숫자에 대해, @code{a ** b}를 반환합니다.
@end deffn

@geindex rshift() (operator 모듈)
@geindex __rshift__() (operator 모듈)
@anchor{library/operator operator rshift}@anchor{2c0e}
@deffn {함수} operator.rshift (a, b)
@anchor{library/operator operator __rshift__}@anchor{2c0f}
@deffnx {함수} operator.__rshift__ (a, b)

`a'를 `b'만큼 오른쪽으로 시프트 한 값을 반환합니다.
@end deffn

@geindex sub() (operator 모듈)
@geindex __sub__() (operator 모듈)
@anchor{library/operator operator sub}@anchor{2c10}
@deffn {함수} operator.sub (a, b)
@anchor{library/operator operator __sub__}@anchor{2c11}
@deffnx {함수} operator.__sub__ (a, b)

@code{a - b}를 반환합니다.
@end deffn

@geindex truediv() (operator 모듈)
@geindex __truediv__() (operator 모듈)
@anchor{library/operator operator truediv}@anchor{2c12}
@deffn {함수} operator.truediv (a, b)
@anchor{library/operator operator __truediv__}@anchor{2c13}
@deffnx {함수} operator.__truediv__ (a, b)

@code{a / b}를 반환합니다. 여기서 2/3는 0이 아니라 .66입니다. 이것은 “실수(true)” 나누기라고 도합니다.
@end deffn

@geindex xor() (operator 모듈)
@geindex __xor__() (operator 모듈)
@anchor{library/operator operator xor}@anchor{2c14}
@deffn {함수} operator.xor (a, b)
@anchor{library/operator operator __xor__}@anchor{2c15}
@deffnx {함수} operator.__xor__ (a, b)

`a'와 `b'의 비트별 배타적 논리합을 반환합니다.
@end deffn

시퀀스에 적용되는 연산(일부는 매핑에도 적용됩니다)은 다음과 같습니다:

@geindex concat() (operator 모듈)
@geindex __concat__() (operator 모듈)
@anchor{library/operator operator concat}@anchor{2c16}
@deffn {함수} operator.concat (a, b)
@anchor{library/operator operator __concat__}@anchor{2c17}
@deffnx {함수} operator.__concat__ (a, b)

`a'와 `b' 시퀀스에 대해 @code{a + b}를 반환합니다.
@end deffn

@geindex contains() (operator 모듈)
@geindex __contains__() (operator 모듈)
@anchor{library/operator operator contains}@anchor{ad7}
@deffn {함수} operator.contains (a, b)
@anchor{library/operator operator __contains__}@anchor{2c18}
@deffnx {함수} operator.__contains__ (a, b)

@code{b in a} 검사의 결과를 반환합니다. 피연산자가 뒤집혀 있음에 유의하십시오.
@end deffn

@geindex countOf() (operator 모듈)
@anchor{library/operator operator countOf}@anchor{ad9}
@deffn {함수} operator.countOf (a, b)

`a'에서 `b'가 발생하는 횟수를 반환합니다.
@end deffn

@geindex delitem() (operator 모듈)
@geindex __delitem__() (operator 모듈)
@anchor{library/operator operator delitem}@anchor{2c19}
@deffn {함수} operator.delitem (a, b)
@anchor{library/operator operator __delitem__}@anchor{2c1a}
@deffnx {함수} operator.__delitem__ (a, b)

`a'의 값을 인덱스 `b'에서 제거합니다.
@end deffn

@geindex getitem() (operator 모듈)
@geindex __getitem__() (operator 모듈)
@anchor{library/operator operator getitem}@anchor{2c1b}
@deffn {함수} operator.getitem (a, b)
@anchor{library/operator operator __getitem__}@anchor{2c1c}
@deffnx {함수} operator.__getitem__ (a, b)

인덱스 `b'에 있는 `a'의 값을 반환합니다.
@end deffn

@geindex indexOf() (operator 모듈)
@anchor{library/operator operator indexOf}@anchor{ad8}
@deffn {함수} operator.indexOf (a, b)

`a'에서 `b'가 처음으로 발견되는 인덱스를 반환합니다.
@end deffn

@geindex setitem() (operator 모듈)
@geindex __setitem__() (operator 모듈)
@anchor{library/operator operator setitem}@anchor{2c1d}
@deffn {함수} operator.setitem (a, b, c)
@anchor{library/operator operator __setitem__}@anchor{2c1e}
@deffnx {함수} operator.__setitem__ (a, b, c)

인덱스 `b'의 `a'의 값을 `c'로 설정합니다.
@end deffn

@geindex length_hint() (operator 모듈)
@anchor{library/operator operator length_hint}@anchor{116c}
@deffn {함수} operator.length_hint (obj, default=0)

`obj' 객체의 추정된 길이를 반환합니다. 먼저 실제 길이를 반환하려고 시도한 다음, @ref{110d,,object.__length_hint__()}를 사용하여 추정치를 반환하려고 하고, 마지막으로 default 값을 반환합니다.


Added in version 3.4.

@end deffn

The following operation works with callables:

@geindex call() (operator 모듈)
@geindex __call__() (operator 모듈)
@anchor{library/operator operator call}@anchor{1c20}
@deffn {함수} operator.call (obj, /, *args, **kwargs)
@anchor{library/operator operator __call__}@anchor{2c1f}
@deffnx {함수} operator.__call__ (obj, /, *args, **kwargs)

@code{obj(*args, **kwargs)}를 반환합니다.


Added in version 3.11.

@end deffn

The @code{operator} module also defines tools for generalized attribute and item
lookups.  These are useful for making fast field extractors as arguments for
@ref{19f,,map()}, @ref{dc6,,sorted()}, @ref{2bcc,,itertools.groupby()}, or other functions that
expect a function argument.

@geindex attrgetter() (operator 모듈)
@anchor{library/operator operator attrgetter}@anchor{1032}
@deffn {함수} operator.attrgetter (attr)

@deffnx {함수} operator.attrgetter (*attrs)

피연산자에서 `attr'을 꺼내는 콜러블 객체를 반환합니다. 둘 이상의 어트리뷰트가 요청되면, 어트리뷰트의 튜플을 반환합니다. 어트리뷰트 이름은 점을 포함할 수도 있습니다. 예를 들어:


@itemize *

@item 
@code{f = attrgetter('name')} 다음에, @code{f(b)} 호출은 @code{b.name}을 반환합니다.

@item 
@code{f = attrgetter('name', 'date')} 다음에, @code{f(b)} 호출은 @code{(b.name, b.date)}를 반환합니다.

@item 
@code{f = attrgetter('name.first', 'name.last')} 다음에, @code{f(b)} 호출은 @code{(b.name.first, b.name.last)}를 반환합니다.
@end itemize

다음과 동등합니다:

@example
def attrgetter(*items):
    if any(not isinstance(item, str) for item in items):
        raise TypeError('attribute name must be a string')
    if len(items) == 1:
        attr = items[0]
        def g(obj):
            return resolve_attr(obj, attr)
    else:
        def g(obj):
            return tuple(resolve_attr(obj, attr) for attr in items)
    return g

def resolve_attr(obj, attr):
    for name in attr.split("."):
        obj = getattr(obj, name)
    return obj
@end example
@end deffn

@geindex itemgetter() (operator 모듈)
@anchor{library/operator operator itemgetter}@anchor{c56}
@deffn {함수} operator.itemgetter (item)

@deffnx {함수} operator.itemgetter (*items)

피연산자의 @ref{588,,__getitem__()} 메서드를 사용하여 피연산자에서 `item'을 꺼내는 콜러블 객체를 반환합니다. 여러 항목이 지정되면, 조회 값의 튜플을 반환합니다. 예를 들어:


@itemize *

@item 
@code{f = itemgetter(2)} 다음에, @code{f(r)} 호출은 @code{r[2]}를 반환합니다.

@item 
@code{g = itemgetter(2, 5, 3)} 다음에, @code{g(r)} 호출은 @code{(r[2], r[5], r[3])}을 반환합니다.
@end itemize

다음과 동등합니다:

@example
def itemgetter(*items):
    if len(items) == 1:
        item = items[0]
        def g(obj):
            return obj[item]
    else:
        def g(obj):
            return tuple(obj[item] for item in items)
    return g
@end example

항목은 피연산자의 @ref{588,,__getitem__()} 메서드에서 허용되는 모든 형이 될 수 있습니다. 딕셔너리는 모든 @ref{823,,해시 가능} 값을 허용합니다. 리스트, 튜플 및 문자열은 인덱스나 슬라이스를 허용합니다:

@example
>>> itemgetter(1)('ABCDEFG')
'B'
>>> itemgetter(1, 3, 5)('ABCDEFG')
('B', 'D', 'F')
>>> itemgetter(slice(2, None))('ABCDEFG')
'CDEFG'
>>> soldier = dict(rank='captain', name='dotterbart')
>>> itemgetter('rank')(soldier)
'captain'
@end example

튜플 레코드에서 특정 필드를 꺼내기 위해 @ref{c56,,itemgetter()}를 사용하는 예:

@example
>>> inventory = [('apple', 3), ('banana', 2), ('pear', 5), ('orange', 1)]
>>> getcount = itemgetter(1)
>>> list(map(getcount, inventory))
[3, 2, 5, 1]
>>> sorted(inventory, key=getcount)
[('orange', 1), ('banana', 2), ('apple', 3), ('pear', 5)]
@end example
@end deffn

@geindex methodcaller() (operator 모듈)
@anchor{library/operator operator methodcaller}@anchor{1033}
@deffn {함수} operator.methodcaller (name, /, *args, **kwargs)

피연산자에서 `name' 메서드를 호출하는 콜러블 객체를 반환합니다. 추가 인자 및/또는 키워드 인자가 주어지면, 해당 인자도 메서드에 제공됩니다. 예를 들어:


@itemize *

@item 
@code{f = methodcaller('name')} 다음에, @code{f(b)} 호출은 @code{b.name()}을 반환합니다.

@item 
@code{f = methodcaller('name', 'foo', bar=1)} 다음에, @code{f(b)} 호출은 @code{b.name('foo', bar=1)}을 반환합니다.
@end itemize

다음과 동등합니다:

@example
def methodcaller(name, /, *args, **kwargs):
    def caller(obj):
        return getattr(obj, name)(*args, **kwargs)
    return caller
@end example
@end deffn

@menu
* 연산자를 함수에 매핑하기:: 
* 제자리 연산자:: 

@end menu

@node 연산자를 함수에 매핑하기,제자리 연산자,,operator — 함수로서의 표준 연산자
@anchor{library/operator mapping-operators-to-functions}@anchor{2c20}@anchor{library/operator operator-map}@anchor{2c21}
@subsubsection 연산자를 함수에 매핑하기


This table shows how abstract operations correspond to operator symbols in the
Python syntax and the functions in the @code{operator} module.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

연산

@tab

문법

@tab

함수

@item

더하기(Addition)

@tab

@code{a + b}

@tab

@code{add(a, b)}

@item

이어붙이기(Concatenation)

@tab

@code{seq1 + seq2}

@tab

@code{concat(seq1, seq2)}

@item

포함 검사(Containment Test)

@tab

@code{obj in seq}

@tab

@code{contains(seq, obj)}

@item

나누기(Division)

@tab

@code{a / b}

@tab

@code{truediv(a, b)}

@item

나누기(Division)

@tab

@code{a // b}

@tab

@code{floordiv(a, b)}

@item

비트별 논리곱(Bitwise And)

@tab

@code{a & b}

@tab

@code{and_(a, b)}

@item

비트별 배타적 논리합(Bitwise Exclusive Or)

@tab

@code{a ^ b}

@tab

@code{xor(a, b)}

@item

비트별 반전(Bitwise Inversion)

@tab

@code{~ a}

@tab

@code{invert(a)}

@item

비트별 논리합(Bitwise Or)

@tab

@code{a | b}

@tab

@code{or_(a, b)}

@item

거듭제곱(Exponentiation)

@tab

@code{a ** b}

@tab

@code{pow(a, b)}

@item

아이덴티티(Identity)

@tab

@code{a is b}

@tab

@code{is_(a, b)}

@item

아이덴티티(Identity)

@tab

@code{a is not b}

@tab

@code{is_not(a, b)}

@item

아이덴티티(Identity)

@tab

@code{a is None}

@tab

@code{is_none(a)}

@item

아이덴티티(Identity)

@tab

@code{a is not None}

@tab

@code{is_not_none(a)}

@item

인덱싱된 대입(Indexed Assignment)

@tab

@code{obj[k] = v}

@tab

@code{setitem(obj, k, v)}

@item

인덱싱된 삭제(Indexed Deletion)

@tab

@code{del obj[k]}

@tab

@code{delitem(obj, k)}

@item

인덱싱(Indexing)

@tab

@code{obj[k]}

@tab

@code{getitem(obj, k)}

@item

왼쪽으로 시프트(Left Shift)

@tab

@code{a << b}

@tab

@code{lshift(a, b)}

@item

모듈로(Modulo)

@tab

@code{a % b}

@tab

@code{mod(a, b)}

@item

곱하기(Multiplication)

@tab

@code{a * b}

@tab

@code{mul(a, b)}

@item

행렬 곱하기(Matrix Multiplication)

@tab

@code{a @@ b}

@tab

@code{matmul(a, b)}

@item

부정 (산술)(Negation (Arithmetic))

@tab

@code{- a}

@tab

@code{neg(a)}

@item

부정 (논리)(Negation (Logical))

@tab

@code{not a}

@tab

@code{not_(a)}

@item

양(Positive)

@tab

@code{+ a}

@tab

@code{pos(a)}

@item

오른쪽으로 시프트(Right Shift)

@tab

@code{a >> b}

@tab

@code{rshift(a, b)}

@item

슬라이스 대입(Slice Assignment)

@tab

@code{seq[i:j] = values}

@tab

@code{setitem(seq, slice(i, j), values)}

@item

슬라이스 삭제(Slice Deletion)

@tab

@code{del seq[i:j]}

@tab

@code{delitem(seq, slice(i, j))}

@item

슬라이싱(Slicing)

@tab

@code{seq[i:j]}

@tab

@code{getitem(seq, slice(i, j))}

@item

문자열 포매팅(String Formatting)

@tab

@code{s % obj}

@tab

@code{mod(s, obj)}

@item

빼기(Subtraction)

@tab

@code{a - b}

@tab

@code{sub(a, b)}

@item

진릿값 검사(Truth Test)

@tab

@code{obj}

@tab

@code{truth(obj)}

@item

대소비교(Ordering)

@tab

@code{a < b}

@tab

@code{lt(a, b)}

@item

대소비교(Ordering)

@tab

@code{a <= b}

@tab

@code{le(a, b)}

@item

동등성(Equality)

@tab

@code{a == b}

@tab

@code{eq(a, b)}

@item

다름(Difference)

@tab

@code{a != b}

@tab

@code{ne(a, b)}

@item

대소비교(Ordering)

@tab

@code{a >= b}

@tab

@code{ge(a, b)}

@item

대소비교(Ordering)

@tab

@code{a > b}

@tab

@code{gt(a, b)}

@end multitable


@node 제자리 연산자,,연산자를 함수에 매핑하기,operator — 함수로서의 표준 연산자
@anchor{library/operator in-place-operators}@anchor{2c22}
@subsubsection 제자리 연산자


많은 연산에는 “제자리(in-place)” 버전이 있습니다. 아래에 나열된 것들은 일반적인 문법보다 제자리 연산자에 대한 더 기본적인 액세스를 제공하는 함수입니다; 예를 들어, @ref{2c23,,문장} @code{x += y}는 @code{x = operator.iadd(x, y)}와 동등합니다. 또 다른 식으로는, @code{z = operator.iadd(x, y)}가 복합문 @code{z = x; z += y}와 동등하다고 말하는 것입니다.

이 예제들에서, 제자리 메서드가 호출될 때, 계산과 대입이 두 개의 분리된 단계에서 수행된다는 점에 유의하십시오. 아래 나열된 제자리 함수는 제자리 메서드를 호출하는 첫 번째 단계만 수행합니다. 두 번째 단계인 대입은 처리되지 않습니다.

문자열, 숫자 및 튜플과 같은 불변 대상의 경우, 갱신된 값이 계산되지만, 입력 변수에 다시 할당되지 않습니다:

@example
>>> a = 'hello'
>>> iadd(a, ' world')
'hello world'
>>> a
'hello'
@end example

리스트와 딕셔너리 같은 가변 대상의 경우, 제자리 메서드가 갱신을 수행하므로, 이후 대입이 필요하지 않습니다:

@example
>>> s = ['h', 'e', 'l', 'l', 'o']
>>> iadd(s, [' ', 'w', 'o', 'r', 'l', 'd'])
['h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd']
>>> s
['h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd']
@end example

@geindex iadd() (operator 모듈)
@geindex __iadd__() (operator 모듈)
@anchor{library/operator operator iadd}@anchor{2c24}
@deffn {함수} operator.iadd (a, b)
@anchor{library/operator operator __iadd__}@anchor{2c25}
@deffnx {함수} operator.__iadd__ (a, b)

@code{a = iadd(a, b)}는 @code{a += b}와 동등합니다.
@end deffn

@geindex iand() (operator 모듈)
@geindex __iand__() (operator 모듈)
@anchor{library/operator operator iand}@anchor{2c26}
@deffn {함수} operator.iand (a, b)
@anchor{library/operator operator __iand__}@anchor{2c27}
@deffnx {함수} operator.__iand__ (a, b)

@code{a = iand(a, b)}는 @code{a &= b}와 동등합니다.
@end deffn

@geindex iconcat() (operator 모듈)
@geindex __iconcat__() (operator 모듈)
@anchor{library/operator operator iconcat}@anchor{2c28}
@deffn {함수} operator.iconcat (a, b)
@anchor{library/operator operator __iconcat__}@anchor{2c29}
@deffnx {함수} operator.__iconcat__ (a, b)

`a'와 `b' 시퀀스에 대해, @code{a = iconcat(a, b)}는 @code{a += b}와 동등합니다.
@end deffn

@geindex ifloordiv() (operator 모듈)
@geindex __ifloordiv__() (operator 모듈)
@anchor{library/operator operator ifloordiv}@anchor{2c2a}
@deffn {함수} operator.ifloordiv (a, b)
@anchor{library/operator operator __ifloordiv__}@anchor{2c2b}
@deffnx {함수} operator.__ifloordiv__ (a, b)

@code{a = ifloordiv(a, b)}는 @code{a //= b}와 동등합니다.
@end deffn

@geindex ilshift() (operator 모듈)
@geindex __ilshift__() (operator 모듈)
@anchor{library/operator operator ilshift}@anchor{2c2c}
@deffn {함수} operator.ilshift (a, b)
@anchor{library/operator operator __ilshift__}@anchor{2c2d}
@deffnx {함수} operator.__ilshift__ (a, b)

@code{a = ilshift(a, b)}는 @code{a <<= b}와 동등합니다.
@end deffn

@geindex imod() (operator 모듈)
@geindex __imod__() (operator 모듈)
@anchor{library/operator operator imod}@anchor{2c2e}
@deffn {함수} operator.imod (a, b)
@anchor{library/operator operator __imod__}@anchor{2c2f}
@deffnx {함수} operator.__imod__ (a, b)

@code{a = imod(a, b)}는 @code{a %= b}와 동등합니다.
@end deffn

@geindex imul() (operator 모듈)
@geindex __imul__() (operator 모듈)
@anchor{library/operator operator imul}@anchor{2c30}
@deffn {함수} operator.imul (a, b)
@anchor{library/operator operator __imul__}@anchor{2c31}
@deffnx {함수} operator.__imul__ (a, b)

@code{a = imul(a, b)}는 @code{a *= b}와 동등합니다.
@end deffn

@geindex imatmul() (operator 모듈)
@geindex __imatmul__() (operator 모듈)
@anchor{library/operator operator imatmul}@anchor{1035}
@deffn {함수} operator.imatmul (a, b)
@anchor{library/operator operator __imatmul__}@anchor{2c32}
@deffnx {함수} operator.__imatmul__ (a, b)

@code{a = imatmul(a, b)}는 @code{a @@= b}와 동등합니다.


Added in version 3.5.

@end deffn

@geindex ior() (operator 모듈)
@geindex __ior__() (operator 모듈)
@anchor{library/operator operator ior}@anchor{2c33}
@deffn {함수} operator.ior (a, b)
@anchor{library/operator operator __ior__}@anchor{2c34}
@deffnx {함수} operator.__ior__ (a, b)

@code{a = ior(a, b)}는 @code{a |= b}와 동등합니다.
@end deffn

@geindex ipow() (operator 모듈)
@geindex __ipow__() (operator 모듈)
@anchor{library/operator operator ipow}@anchor{2c35}
@deffn {함수} operator.ipow (a, b)
@anchor{library/operator operator __ipow__}@anchor{2c36}
@deffnx {함수} operator.__ipow__ (a, b)

@code{a = ipow(a, b)}는 @code{a **= b}와 동등합니다.
@end deffn

@geindex irshift() (operator 모듈)
@geindex __irshift__() (operator 모듈)
@anchor{library/operator operator irshift}@anchor{2c37}
@deffn {함수} operator.irshift (a, b)
@anchor{library/operator operator __irshift__}@anchor{2c38}
@deffnx {함수} operator.__irshift__ (a, b)

@code{a = irshift(a, b)}는 @code{a >>= b}와 동등합니다.
@end deffn

@geindex isub() (operator 모듈)
@geindex __isub__() (operator 모듈)
@anchor{library/operator operator isub}@anchor{2c39}
@deffn {함수} operator.isub (a, b)
@anchor{library/operator operator __isub__}@anchor{2c3a}
@deffnx {함수} operator.__isub__ (a, b)

@code{a = isub(a, b)}는 @code{a -= b}와 동등합니다.
@end deffn

@geindex itruediv() (operator 모듈)
@geindex __itruediv__() (operator 모듈)
@anchor{library/operator operator itruediv}@anchor{2c3b}
@deffn {함수} operator.itruediv (a, b)
@anchor{library/operator operator __itruediv__}@anchor{2c3c}
@deffnx {함수} operator.__itruediv__ (a, b)

@code{a = itruediv(a, b)}는 @code{a /= b}와 동등합니다.
@end deffn

@geindex ixor() (operator 모듈)
@geindex __ixor__() (operator 모듈)
@anchor{library/operator operator ixor}@anchor{2c3d}
@deffn {함수} operator.ixor (a, b)
@anchor{library/operator operator __ixor__}@anchor{2c3e}
@deffnx {함수} operator.__ixor__ (a, b)

@code{a = ixor(a, b)}는 @code{a ^= b}와 동등합니다.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 파일과 디렉터리 액세스,데이터 지속성,함수형 프로그래밍 모듈,파이썬 표준 라이브러리
@anchor{library/filesys doc}@anchor{2c3f}@anchor{library/filesys file-and-directory-access}@anchor{2c40}@anchor{library/filesys filesys}@anchor{2c41}@anchor{library/filesys translation-repo}@anchor{2c42}
@section 파일과 디렉터리 액세스


이 장에서 설명하는 모듈은 디스크 파일과 디렉터리를 다룹니다. 예를 들어, 파일의 속성을 읽고, 이식성 있는 방식으로 경로를 조작하고, 임시 파일을 만드는 모듈이 있습니다. 이 장의 전체 모듈 목록은 다음과 같습니다:

@menu
* pathlib — Object-oriented filesystem paths:: 
* os.path — 일반적인 경로명 조작: os path — 일반적인 경로명 조작. 
* stat — stat() 결과 해석하기: stat — stat 결과 해석하기. 
* filecmp — 파일과 디렉터리 비교:: 
* tempfile — 임시 파일과 디렉터리 생성:: 
* glob — 유닉스 스타일 경로명 패턴 확장:: 
* fnmatch — 유닉스 파일명 패턴 일치:: 
* linecache — 텍스트 줄에 대한 무작위 액세스:: 
* shutil — 고수준 파일 연산:: 

@end menu

@node pathlib — Object-oriented filesystem paths,os path — 일반적인 경로명 조작,,파일과 디렉터리 액세스
@anchor{library/pathlib doc}@anchor{2c43}@anchor{library/pathlib module-pathlib}@anchor{a8}@anchor{library/pathlib pathlib-object-oriented-filesystem-paths}@anchor{2c44}
@subsection @code{pathlib} — Object-oriented filesystem paths


@geindex module; pathlib


Added in version 3.4.


`Source code:' Lib/pathlib/@footnote{https://github.com/python/cpython/tree/3.14/Lib/pathlib/}

@geindex path;operations


__________________________________________________________________


이 모듈은 다른 운영 체제에 적합한 의미 체계를 가진 파일 시스템 경로를 나타내는 클래스를 제공합니다. 경로 클래스는 I/O 없이 순수한 계산 연산을 제공하는 @ref{2c45,,순수한 경로}와 순수한 경로를 상속하지만, I/O 연산도 제공하는 @ref{2c46,,구상 경로}로 구분됩니다.

@image{python-figures/pathlib-inheritance,,,Inheritance diagram showing the classes available in pathlib. The most basic class is PurePath@comma{} which has three direct subclasses: PurePosixPath@comma{} PureWindowsPath@comma{} and Path. Further to these four classes@comma{} there are two classes that use multiple inheritance: PosixPath subclasses PurePosixPath and Path@comma{} and WindowsPath subclasses PureWindowsPath and Path.,png}

이전에 이 모듈을 사용한 적이 없거나 어떤 클래스가 작업에 적합한지 확신이 없다면, @ref{266,,Path}가 가장 적합할 가능성이 높습니다. 코드가 실행되는 플랫폼의 @ref{2c46,,구상 경로}를 인스턴스화 합니다.

순수한 경로는 특별한 경우에 유용합니다; 예를 들면:


@enumerate 

@item 
유닉스 기계에서 윈도우 경로를 조작하려고 할 때 (또는 그 반대). 유닉스에서 실행할 때는 @ref{2c47,,WindowsPath}를 인스턴스화 할 수 없지만, @ref{1a75,,PureWindowsPath}는 인스턴스화 할 수 있습니다.

@item 
코드가 실제로 OS에 액세스하지 않고 경로만 조작한다는 확신이 필요할 때. 이 경우, 순수 클래스 중 하나를 인스턴스화 하면 OS 액세스 연산이 없어서 유용 할 수 있습니다.
@end enumerate


@subsubheading 더 보기


@geindex Python 향상 제안; PEP 428
PEP 428@footnote{https://peps.python.org/pep-0428/}: pathlib 모듈 – 객체 지향 파일 시스템 경로.



@subsubheading 더 보기


문자열에 대한 저수준 경로 조작을 위해, @ref{a6,,os.path} 모듈을 사용할 수도 있습니다.


@menu
* 기본 사용:: 
* Exceptions: Exceptions<2>. 
* 순수한 경로:: 
* 구상 경로:: 
* Pattern language:: 
* Comparison to the glob module:: 
* Comparison to the os and os.path modules: Comparison to the os and os path modules. 
* Protocols:: 

@end menu

@node 기본 사용,Exceptions<2>,,pathlib — Object-oriented filesystem paths
@anchor{library/pathlib basic-use}@anchor{2c48}
@subsubsection 기본 사용


메인 클래스 임포트 하기:

@example
>>> from pathlib import Path
@end example

서브 디렉터리 나열하기:

@example
>>> p = Path('.')
>>> [x for x in p.iterdir() if x.is_dir()]
[PosixPath('.hg'), PosixPath('docs'), PosixPath('dist'),
 PosixPath('__pycache__'), PosixPath('build')]
@end example

이 디렉터리 트리에 있는 파이썬 소스 파일 나열하기:

@example
>>> list(p.glob('**/*.py'))
[PosixPath('test_pathlib.py'), PosixPath('setup.py'),
 PosixPath('pathlib.py'), PosixPath('docs/conf.py'),
 PosixPath('build/lib/pathlib.py')]
@end example

디렉터리 트리 내에서 탐색하기:

@example
>>> p = Path('/etc')
>>> q = p / 'init.d' / 'reboot'
>>> q
PosixPath('/etc/init.d/reboot')
>>> q.resolve()
PosixPath('/etc/rc.d/init.d/halt')
@end example

경로 속성 조회하기:

@example
>>> q.exists()
True
>>> q.is_dir()
False
@end example

파일 열기:

@example
>>> with q.open() as f: f.readline()
...
'#!/bin/bash\n'
@end example

@node Exceptions<2>,순수한 경로,기본 사용,pathlib — Object-oriented filesystem paths
@anchor{library/pathlib exceptions}@anchor{2c49}
@subsubsection Exceptions


@geindex UnsupportedOperation
@anchor{library/pathlib pathlib UnsupportedOperation}@anchor{533}
@deffn {예외} pathlib.UnsupportedOperation

An exception inheriting @ref{36b,,NotImplementedError} that is raised when an
unsupported operation is called on a path object.


Added in version 3.13.

@end deffn

@node 순수한 경로,구상 경로,Exceptions<2>,pathlib — Object-oriented filesystem paths
@anchor{library/pathlib id1}@anchor{2c4a}@anchor{library/pathlib pure-paths}@anchor{2c45}
@subsubsection 순수한 경로


순수한 경로 객체는 실제로 파일 시스템에 액세스하지 않는 경로 처리 연산을 제공합니다. 이 클래스에 액세스하는 방법에는 세 가지가 있으며, `플레이버(flavours)'라고도 부릅니다:

@geindex PurePath (pathlib 클래스)
@anchor{library/pathlib pathlib PurePath}@anchor{6cc}
@deffn {클래스} pathlib.PurePath (*pathsegments)

시스템의 경로 플레이버를 나타내는 일반 클래스 (인스턴스화 하면 @ref{2c4b,,PurePosixPath}나 @ref{1a75,,PureWindowsPath}를 만듭니다):

@example
>>> PurePath('setup.py')      # Running on a Unix machine
PurePosixPath('setup.py')
@end example

Each element of `pathsegments' can be either a string representing a
path segment, or an object implementing the @ref{e4a,,os.PathLike} interface
where the @ref{e4b,,__fspath__()} method returns a string,
such as another path object:

@example
>>> PurePath('foo', 'some/path', 'bar')
PurePosixPath('foo/some/path/bar')
>>> PurePath(Path('foo'), Path('bar'))
PurePosixPath('foo/bar')
@end example

`pathsegments'가 비어 있으면, 현재 디렉터리를 가정합니다:

@example
>>> PurePath()
PurePosixPath('.')
@end example

If a segment is an absolute path, all previous segments are ignored
(like @ref{19a9,,os.path.join()}):

@example
>>> PurePath('/etc', '/usr', 'lib64')
PurePosixPath('/usr/lib64')
>>> PureWindowsPath('c:/Windows', 'd:bar')
PureWindowsPath('d:bar')
@end example

On Windows, the drive is not reset when a rooted relative path
segment (e.g., @code{r'\foo'}) is encountered:

@example
>>> PureWindowsPath('c:/Windows', '/Program Files')
PureWindowsPath('c:/Program Files')
@end example

Spurious slashes and single dots are collapsed, but double dots (@code{'..'})
and leading double slashes (@code{'//'}) are not, since this would change the
meaning of a path for various reasons (e.g. symbolic links, UNC paths):

@example
>>> PurePath('foo//bar')
PurePosixPath('foo/bar')
>>> PurePath('//foo/bar')
PurePosixPath('//foo/bar')
>>> PurePath('foo/./bar')
PurePosixPath('foo/bar')
>>> PurePath('foo/../bar')
PurePosixPath('foo/../bar')
@end example

(나이브한 접근법은 @code{PurePosixPath('foo/../bar')}를 @code{PurePosixPath('bar')}와 동등하게 만드는데, @code{foo}가 다른 디렉터리에 대한 심볼릭 링크일 때는 잘못됩니다)

순수한 경로 객체는 @ref{e4a,,os.PathLike} 인터페이스를 구현하여, 이 인터페이스가 허용되는 모든 위치에서 사용할 수 있습니다.


버전 3.6에서 변경: @ref{e4a,,os.PathLike} 인터페이스에 대한 지원이 추가되었습니다.

@end deffn

@geindex PurePosixPath (pathlib 클래스)
@anchor{library/pathlib pathlib PurePosixPath}@anchor{2c4b}
@deffn {클래스} pathlib.PurePosixPath (*pathsegments)

@ref{6cc,,PurePath}의 서브 클래스, 이 경로 플레이버는 윈도우 이외의 파일 시스템 경로를 나타냅니다:

@example
>>> PurePosixPath('/etc/hosts')
PurePosixPath('/etc/hosts')
@end example

`pathsegments'는 @ref{6cc,,PurePath}와 유사하게 지정됩니다.
@end deffn

@geindex PureWindowsPath (pathlib 클래스)
@anchor{library/pathlib pathlib PureWindowsPath}@anchor{1a75}
@deffn {클래스} pathlib.PureWindowsPath (*pathsegments)

A subclass of @ref{6cc,,PurePath}, this path flavour represents Windows
filesystem paths, including UNC paths@footnote{https://en.wikipedia.org/wiki/Path_(computing)#UNC}:

@example
>>> PureWindowsPath('c:/', 'Users', 'Ximénez')
PureWindowsPath('c:/Users/Ximénez')
>>> PureWindowsPath('//server/share/file')
PureWindowsPath('//server/share/file')
@end example

`pathsegments'는 @ref{6cc,,PurePath}와 유사하게 지정됩니다.
@end deffn

실행 중인 시스템과 관계없이, 이러한 모든 클래스를 인스턴스화 할 수 있는데, 시스템 호출을 수행하는 연산을 제공하지 않기 때문입니다.

@menu
* 일반 속성:: 
* 연산자:: 
* 개별 부분에 액세스하기:: 
* 메서드와 프로퍼티:: 

@end menu

@node 일반 속성,연산자,,순수한 경로
@anchor{library/pathlib general-properties}@anchor{2c4c}
@subsubsection 일반 속성


Paths are immutable and @ref{823,,hashable}.  Paths of a same flavour are comparable
and orderable.  These properties respect the flavour’s case-folding
semantics:

@example
>>> PurePosixPath('foo') == PurePosixPath('FOO')
False
>>> PureWindowsPath('foo') == PureWindowsPath('FOO')
True
>>> PureWindowsPath('FOO') in @{ PureWindowsPath('foo') @}
True
>>> PureWindowsPath('C:') < PureWindowsPath('d:')
True
@end example

다른 플레이버의 경로는 다르다고 비교되며 대소 비교할 수 없습니다:

@example
>>> PureWindowsPath('foo') == PurePosixPath('foo')
False
>>> PureWindowsPath('foo') < PurePosixPath('foo')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: '<' not supported between instances of 'PureWindowsPath' and 'PurePosixPath'
@end example

@node 연산자,개별 부분에 액세스하기,일반 속성,순수한 경로
@anchor{library/pathlib operators}@anchor{2c4d}
@subsubsection 연산자


The slash operator helps create child paths, like @ref{19a9,,os.path.join()}.
If the argument is an absolute path, the previous path is ignored.
On Windows, the drive is not reset when the argument is a rooted
relative path (e.g., @code{r'\foo'}):

@example
>>> p = PurePath('/etc')
>>> p
PurePosixPath('/etc')
>>> p / 'init.d' / 'apache2'
PurePosixPath('/etc/init.d/apache2')
>>> q = PurePath('bin')
>>> '/usr' / q
PurePosixPath('/usr/bin')
>>> p / '/an_absolute_path'
PurePosixPath('/an_absolute_path')
>>> PureWindowsPath('c:/Windows', '/Program Files')
PureWindowsPath('c:/Program Files')
@end example

경로 객체는 @ref{e4a,,os.PathLike}을 구현하는 객체가 허용되는 모든 곳에서 사용할 수 있습니다:

@example
>>> import os
>>> p = PurePath('/etc')
>>> os.fspath(p)
'/etc'
@end example

경로의 문자열 표현은 원시 파일 시스템 경로 자체(네이티브 형식으로, 예를 들어 윈도우에서 역 슬래시)로, 파일 경로를 문자열로 받아들이는 모든 함수에 전달할 수 있습니다:

@example
>>> p = PurePath('/etc')
>>> str(p)
'/etc'
>>> p = PureWindowsPath('c:/Program Files')
>>> str(p)
'c:\\Program Files'
@end example

마찬가지로, 경로에 대해 @ref{192,,bytes}를 호출하면 @ref{e4e,,os.fsencode()}로 인코딩된 바이트열 객체로 원시 파일 시스템 경로를 제공합니다:

@example
>>> bytes(p)
b'/etc'
@end example

@cartouche
@quotation 참고 
@ref{192,,bytes} 호출은 유닉스에서만 권장됩니다. 윈도우에서, 유니코드 형식이 파일 시스템 경로의 규범적(canonical) 표현입니다.
@end quotation
@end cartouche

@node 개별 부분에 액세스하기,메서드와 프로퍼티,연산자,순수한 경로
@anchor{library/pathlib accessing-individual-parts}@anchor{2c4e}
@subsubsection 개별 부분에 액세스하기


경로의 개별 “부분”(구성 요소)에 액세스하려면, 다음 프로퍼티를 사용하십시오:

@geindex parts (pathlib.PurePath의 속성)
@anchor{library/pathlib pathlib PurePath parts}@anchor{2c4f}
@deffn {속성} PurePath.parts

경로의 다양한 구성 요소로의 액세스를 제공하는 튜플:

@example
>>> p = PurePath('/usr/bin/python3')
>>> p.parts
('/', 'usr', 'bin', 'python3')

>>> p = PureWindowsPath('c:/Program Files/PSF')
>>> p.parts
('c:\\', 'Program Files', 'PSF')
@end example

(드라이브와 로컬 루트가 단일 부분으로 다시 그룹화되는 방식에 유의하십시오)
@end deffn

@node 메서드와 프로퍼티,,개별 부분에 액세스하기,순수한 경로
@anchor{library/pathlib methods-and-properties}@anchor{2c50}
@subsubsection 메서드와 프로퍼티


@c from pathlib import PurePath, PurePosixPath, PureWindowsPath

순수한 경로는 다음과 같은 메서드와 프로퍼티를 제공합니다:

@geindex parser (pathlib.PurePath의 속성)
@anchor{library/pathlib pathlib PurePath parser}@anchor{536}
@deffn {속성} PurePath.parser

The implementation of the @ref{a6,,os.path} module used for low-level path
parsing and joining: either @code{posixpath} or @code{ntpath}.


Added in version 3.13.

@end deffn

@geindex drive (pathlib.PurePath의 속성)
@anchor{library/pathlib pathlib PurePath drive}@anchor{2c51}
@deffn {속성} PurePath.drive

드라이브 문자나 이름을 나타내는 문자열, 있다면:

@example
>>> PureWindowsPath('c:/Program Files/').drive
'c:'
>>> PureWindowsPath('/Program Files/').drive
'@w{'}
>>> PurePosixPath('/etc').drive
'@w{'}
@end example

UNC 공유도 드라이브로 간주합니다:

@example
>>> PureWindowsPath('//host/share/foo.txt').drive
'\\\\host\\share'
@end example
@end deffn

@geindex root (pathlib.PurePath의 속성)
@anchor{library/pathlib pathlib PurePath root}@anchor{2c52}
@deffn {속성} PurePath.root

(로컬이나 글로벌) 루트를 나타내는 문자열, 있다면:

@example
>>> PureWindowsPath('c:/Program Files/').root
'\\'
>>> PureWindowsPath('c:Program Files/').root
'@w{'}
>>> PurePosixPath('/etc').root
'/'
@end example

UNC 공유에는 항상 루트가 있습니다:

@example
>>> PureWindowsPath('//host/share').root
'\\'
@end example

If the path starts with more than two successive slashes,
@ref{2c4b,,PurePosixPath} collapses them:

@example
>>> PurePosixPath('//etc').root
'//'
>>> PurePosixPath('///etc').root
'/'
>>> PurePosixPath('////etc').root
'/'
@end example

@cartouche
@quotation 참고 
This behavior conforms to `The Open Group Base Specifications Issue 6',
paragraph 4.11 Pathname Resolution@footnote{https://pubs.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap04.html#tag_04_11}:

`“A pathname that begins with two successive slashes may be interpreted in
an implementation-defined manner, although more than two leading slashes
shall be treated as a single slash.”'
@end quotation
@end cartouche
@end deffn

@geindex anchor (pathlib.PurePath의 속성)
@anchor{library/pathlib pathlib PurePath anchor}@anchor{2c53}
@deffn {속성} PurePath.anchor

드라이브와 루트의 이어 붙이기:

@example
>>> PureWindowsPath('c:/Program Files/').anchor
'c:\\'
>>> PureWindowsPath('c:Program Files/').anchor
'c:'
>>> PurePosixPath('/etc').anchor
'/'
>>> PureWindowsPath('//host/share').anchor
'\\\\host\\share\\'
@end example
@end deffn

@geindex parents (pathlib.PurePath의 속성)
@anchor{library/pathlib pathlib PurePath parents}@anchor{a21}
@deffn {속성} PurePath.parents

경로의 논리적 조상에 대한 액세스를 제공하는 불변 시퀀스:

@example
>>> p = PureWindowsPath('c:/foo/bar/setup.py')
>>> p.parents[0]
PureWindowsPath('c:/foo/bar')
>>> p.parents[1]
PureWindowsPath('c:/foo')
>>> p.parents[2]
PureWindowsPath('c:/')
@end example


버전 3.10에서 변경: The parents sequence now supports @ref{24ae,,slices} and negative index values.

@end deffn

@geindex parent (pathlib.PurePath의 속성)
@anchor{library/pathlib pathlib PurePath parent}@anchor{1a9c}
@deffn {속성} PurePath.parent

경로의 논리적 부모:

@example
>>> p = PurePosixPath('/a/b/c/d')
>>> p.parent
PurePosixPath('/a/b/c')
@end example

앵커나 빈 경로를 넘어갈 수 없습니다:

@example
>>> p = PurePosixPath('/')
>>> p.parent
PurePosixPath('/')
>>> p = PurePosixPath('.')
>>> p.parent
PurePosixPath('.')
@end example

@cartouche
@quotation 참고 
이것은 순수한 어휘(lexical) 연산이라서, 다음과 같이 동작합니다:

@example
>>> p = PurePosixPath('foo/..')
>>> p.parent
PurePosixPath('foo')
@end example

If you want to walk an arbitrary filesystem path upwards, it is
recommended to first call @ref{1a6d,,Path.resolve()} so as to resolve
symlinks and eliminate @code{".."} components.
@end quotation
@end cartouche
@end deffn

@geindex name (pathlib.PurePath의 속성)
@anchor{library/pathlib pathlib PurePath name}@anchor{2c54}
@deffn {속성} PurePath.name

드라이브와 루트를 제외하고, 마지막 경로 구성 요소를 나타내는 문자열, 있다면:

@example
>>> PurePosixPath('my/library/setup.py').name
'setup.py'
@end example

UNC 드라이브 이름은 고려되지 않습니다:

@example
>>> PureWindowsPath('//some/share/setup.py').name
'setup.py'
>>> PureWindowsPath('//some/share').name
'@w{'}
@end example
@end deffn

@geindex suffix (pathlib.PurePath의 속성)
@anchor{library/pathlib pathlib PurePath suffix}@anchor{1958}
@deffn {속성} PurePath.suffix

The last dot-separated portion of the final component, if any:

@example
>>> PurePosixPath('my/library/setup.py').suffix
'.py'
>>> PurePosixPath('my/library.tar.gz').suffix
'.gz'
>>> PurePosixPath('my/library').suffix
'@w{'}
@end example

This is commonly called the file extension.


버전 3.14에서 변경: A single dot (”@code{.}”) is considered a valid suffix.

@end deffn

@geindex suffixes (pathlib.PurePath의 속성)
@anchor{library/pathlib pathlib PurePath suffixes}@anchor{1959}
@deffn {속성} PurePath.suffixes

A list of the path’s suffixes, often called file extensions:

@example
>>> PurePosixPath('my/library.tar.gar').suffixes
['.tar', '.gar']
>>> PurePosixPath('my/library.tar.gz').suffixes
['.tar', '.gz']
>>> PurePosixPath('my/library').suffixes
[]
@end example


버전 3.14에서 변경: A single dot (”@code{.}”) is considered a valid suffix.

@end deffn

@geindex stem (pathlib.PurePath의 속성)
@anchor{library/pathlib pathlib PurePath stem}@anchor{2c55}
@deffn {속성} PurePath.stem

suffix가 없는, 마지막 경로 구성 요소:

@example
>>> PurePosixPath('my/library.tar.gz').stem
'library.tar'
>>> PurePosixPath('my/library.tar').stem
'library'
>>> PurePosixPath('my/library').stem
'library'
@end example


버전 3.14에서 변경: A single dot (”@code{.}”) is considered a valid suffix.

@end deffn

@geindex as_posix() (pathlib.PurePath 메서드)
@anchor{library/pathlib pathlib PurePath as_posix}@anchor{2c56}
@deffn {메서드} PurePath.as_posix ()

슬래시(@code{/})가 있는 경로의 문자열 표현을 반환합니다:

@example
>>> p = PureWindowsPath('c:\\windows')
>>> str(p)
'c:\\windows'
>>> p.as_posix()
'c:/windows'
@end example
@end deffn

@geindex is_absolute() (pathlib.PurePath 메서드)
@anchor{library/pathlib pathlib PurePath is_absolute}@anchor{1a9b}
@deffn {메서드} PurePath.is_absolute ()

경로가 절대적인지 아닌지를 반환합니다. 루트와 (플레이버가 허락하면) 드라이브가 모두 있으면 경로를 절대적이라고 간주합니다:

@example
>>> PurePosixPath('/a/b').is_absolute()
True
>>> PurePosixPath('a/b').is_absolute()
False

>>> PureWindowsPath('c:/a/b').is_absolute()
True
>>> PureWindowsPath('/a/b').is_absolute()
False
>>> PureWindowsPath('c:').is_absolute()
False
>>> PureWindowsPath('//some/share').is_absolute()
True
@end example
@end deffn

@geindex is_relative_to() (pathlib.PurePath 메서드)
@anchor{library/pathlib pathlib PurePath is_relative_to}@anchor{2fe}
@deffn {메서드} PurePath.is_relative_to (other)

이 경로가 `other' 경로에 상대적인지를 반환합니다.

@example
>>> p = PurePath('/etc/passwd')
>>> p.is_relative_to('/etc')
True
>>> p.is_relative_to('/usr')
False
@end example

This method is string-based; it neither accesses the filesystem nor treats
“@code{..}” segments specially. The following code is equivalent:

@example
>>> u = PurePath('/usr')
>>> u == p or u in p.parents
False
@end example


Added in version 3.9.



Deprecated since version 3.12, removed in version 3.14: Passing additional arguments is deprecated; if supplied, they are joined
with `other'.

@end deffn

@geindex is_reserved() (pathlib.PurePath 메서드)
@anchor{library/pathlib pathlib PurePath is_reserved}@anchor{32a}
@deffn {메서드} PurePath.is_reserved ()

@ref{1a75,,PureWindowsPath}에서는, 경로를 윈도우에서 예약된 것으로 간주하면 @code{True}를, 그렇지 않으면 @code{False}를 반환합니다. @ref{2c4b,,PurePosixPath}에서는, 항상 @code{False}가 반환됩니다.


버전 3.13에서 변경: Windows path names that contain a colon, or end with a dot or a space,
are considered reserved. UNC paths may be reserved.



Deprecated since version 3.13, will be removed in version 3.15: This method is deprecated; use @ref{32b,,os.path.isreserved()} to detect
reserved paths on Windows.

@end deffn

@geindex joinpath() (pathlib.PurePath 메서드)
@anchor{library/pathlib pathlib PurePath joinpath}@anchor{2c57}
@deffn {메서드} PurePath.joinpath (*pathsegments)

Calling this method is equivalent to combining the path with each of
the given `pathsegments' in turn:

@example
>>> PurePosixPath('/etc').joinpath('passwd')
PurePosixPath('/etc/passwd')
>>> PurePosixPath('/etc').joinpath(PurePosixPath('passwd'))
PurePosixPath('/etc/passwd')
>>> PurePosixPath('/etc').joinpath('init.d', 'apache2')
PurePosixPath('/etc/init.d/apache2')
>>> PureWindowsPath('c:').joinpath('/Program Files')
PureWindowsPath('c:/Program Files')
@end example
@end deffn

@geindex full_match() (pathlib.PurePath 메서드)
@anchor{library/pathlib pathlib PurePath full_match}@anchor{535}
@deffn {메서드} PurePath.full_match (pattern, *, case_sensitive=None)

Match this path against the provided glob-style pattern.  Return @code{True}
if matching is successful, @code{False} otherwise.  For example:

@example
>>> PurePath('a/b.py').full_match('a/*.py')
True
>>> PurePath('a/b.py').full_match('*.py')
False
>>> PurePath('/a/b/c.py').full_match('/a/**')
True
>>> PurePath('/a/b/c.py').full_match('**/*.py')
True
@end example


@subsubheading 더 보기


@ref{2c58,,Pattern language} documentation.


다른 메서드와 마찬가지로, 대소 문자를 구분할지는 플랫폼 기본값을 따릅니다:

@example
>>> PurePosixPath('b.py').full_match('*.PY')
False
>>> PureWindowsPath('b.py').full_match('*.PY')
True
@end example

Set `case_sensitive' to @code{True} or @code{False} to override this behaviour.


Added in version 3.13.

@end deffn

@geindex match() (pathlib.PurePath 메서드)
@anchor{library/pathlib pathlib PurePath match}@anchor{6d2}
@deffn {메서드} PurePath.match (pattern, *, case_sensitive=None)

Match this path against the provided non-recursive glob-style pattern.
Return @code{True} if matching is successful, @code{False} otherwise.

This method is similar to @ref{535,,full_match()}, but empty patterns
aren’t allowed (@ref{2ec,,ValueError} is raised), the recursive wildcard
“@code{**}” isn’t supported (it acts like non-recursive “@code{*}”), and if a
relative pattern is provided, then matching is done from the right:

@example
>>> PurePath('a/b.py').match('*.py')
True
>>> PurePath('/a/b/c.py').match('b/*.py')
True
>>> PurePath('/a/b/c.py').match('a/*.py')
False
@end example


버전 3.12에서 변경: The `pattern' parameter accepts a @ref{5a0,,path-like object}.



버전 3.12에서 변경: The `case_sensitive' parameter was added.

@end deffn

@geindex relative_to() (pathlib.PurePath 메서드)
@anchor{library/pathlib pathlib PurePath relative_to}@anchor{2fd}
@deffn {메서드} PurePath.relative_to (other, walk_up=False)

Compute a version of this path relative to the path represented by
`other'.  If it’s impossible, @ref{2ec,,ValueError} is raised:

@example
>>> p = PurePosixPath('/etc/passwd')
>>> p.relative_to('/')
PurePosixPath('etc/passwd')
>>> p.relative_to('/etc')
PurePosixPath('passwd')
>>> p.relative_to('/usr')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "pathlib.py", line 941, in relative_to
    raise ValueError(error_message.format(str(self), str(formatted)))
ValueError: '/etc/passwd' is not in the subpath of '/usr' OR one path is relative and the other is absolute.
@end example

When `walk_up' is false (the default), the path must start with `other'.
When the argument is true, @code{..} entries may be added to form the
relative path. In all other cases, such as the paths referencing
different drives, @ref{2ec,,ValueError} is raised.:

@example
>>> p.relative_to('/usr', walk_up=True)
PurePosixPath('../etc/passwd')
>>> p.relative_to('foo', walk_up=True)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "pathlib.py", line 941, in relative_to
    raise ValueError(error_message.format(str(self), str(formatted)))
ValueError: '/etc/passwd' is not on the same drive as 'foo' OR one path is relative and the other is absolute.
@end example

@cartouche
@quotation 경고 
This function is part of @ref{6cc,,PurePath} and works with strings.
It does not check or access the underlying file structure.
This can impact the `walk_up' option as it assumes that no symlinks
are present in the path; call @ref{1a6d,,resolve()} first if
necessary to resolve symlinks.
@end quotation
@end cartouche


버전 3.12에서 변경: The `walk_up' parameter was added (old behavior is the same as @code{walk_up=False}).



Deprecated since version 3.12, removed in version 3.14: Passing additional positional arguments is deprecated; if supplied,
they are joined with `other'.

@end deffn

@geindex with_name() (pathlib.PurePath 메서드)
@anchor{library/pathlib pathlib PurePath with_name}@anchor{1a68}
@deffn {메서드} PurePath.with_name (name)

@ref{2c54,,name}이 변경된 새 경로를 반환합니다. 원래 경로에 이름(name)이 없으면 ValueError가 발생합니다:

@example
>>> p = PureWindowsPath('c:/Downloads/pathlib.tar.gz')
>>> p.with_name('setup.py')
PureWindowsPath('c:/Downloads/setup.py')
>>> p = PureWindowsPath('c:/')
>>> p.with_name('setup.py')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/antoine/cpython/default/Lib/pathlib.py", line 751, in with_name
    raise ValueError("%r has an empty name" % (self,))
ValueError: PureWindowsPath('c:/') has an empty name
@end example
@end deffn

@geindex with_stem() (pathlib.PurePath 메서드)
@anchor{library/pathlib pathlib PurePath with_stem}@anchor{19dc}
@deffn {메서드} PurePath.with_stem (stem)

@ref{2c55,,stem}이 변경된 새 경로를 반환합니다. 원래 경로에 이름(name)이 없으면, ValueError가 발생합니다:

@example
>>> p = PureWindowsPath('c:/Downloads/draft.txt')
>>> p.with_stem('final')
PureWindowsPath('c:/Downloads/final.txt')
>>> p = PureWindowsPath('c:/Downloads/pathlib.tar.gz')
>>> p.with_stem('lib')
PureWindowsPath('c:/Downloads/lib.gz')
>>> p = PureWindowsPath('c:/')
>>> p.with_stem('@w{'})
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/antoine/cpython/default/Lib/pathlib.py", line 861, in with_stem
    return self.with_name(stem + self.suffix)
  File "/home/antoine/cpython/default/Lib/pathlib.py", line 851, in with_name
    raise ValueError("%r has an empty name" % (self,))
ValueError: PureWindowsPath('c:/') has an empty name
@end example


Added in version 3.9.

@end deffn

@geindex with_suffix() (pathlib.PurePath 메서드)
@anchor{library/pathlib pathlib PurePath with_suffix}@anchor{1957}
@deffn {메서드} PurePath.with_suffix (suffix)

@ref{1958,,suffix}가 변경된 새 경로를 반환합니다. 원래 경로에 접미사(suffix)가 없으면, 새 `suffix'가 대신 추가됩니다. `suffix'가 빈 문자열이면, 원래 접미사가 제거됩니다:

@example
>>> p = PureWindowsPath('c:/Downloads/pathlib.tar.gz')
>>> p.with_suffix('.bz2')
PureWindowsPath('c:/Downloads/pathlib.tar.bz2')
>>> p = PureWindowsPath('README')
>>> p.with_suffix('.txt')
PureWindowsPath('README.txt')
>>> p = PureWindowsPath('README.txt')
>>> p.with_suffix('@w{'})
PureWindowsPath('README')
@end example


버전 3.14에서 변경: A single dot (”@code{.}”) is considered a valid suffix. In previous
versions, @ref{2ec,,ValueError} is raised if a single dot is supplied.

@end deffn

@geindex with_segments() (pathlib.PurePath 메서드)
@anchor{library/pathlib pathlib PurePath with_segments}@anchor{6cd}
@deffn {메서드} PurePath.with_segments (*pathsegments)

Create a new path object of the same type by combining the given
`pathsegments'. This method is called whenever a derivative path is created,
such as from @ref{1a9c,,parent} and @ref{2fd,,relative_to()}. Subclasses may
override this method to pass information to derivative paths, for example:

@example
from pathlib import PurePosixPath

class MyPath(PurePosixPath):
    def __init__(self, *pathsegments, session_id):
        super().__init__(*pathsegments)
        self.session_id = session_id

    def with_segments(self, *pathsegments):
        return type(self)(*pathsegments, session_id=self.session_id)

etc = MyPath('/etc', session_id=42)
hosts = etc / 'hosts'
print(hosts.session_id)  # 42
@end example


Added in version 3.12.

@end deffn

@node 구상 경로,Pattern language,순수한 경로,pathlib — Object-oriented filesystem paths
@anchor{library/pathlib concrete-paths}@anchor{2c46}@anchor{library/pathlib id2}@anchor{2c59}
@subsubsection 구상 경로


구상 경로는 순수한 경로 클래스의 서브 클래스입니다. 후자가 제공하는 연산 외에도, 경로 객체에 대해 시스템 호출을 수행하는 메서드도 제공합니다. 구상 경로를 인스턴스화 하는 세 가지 방법이 있습니다:

@geindex Path (pathlib 클래스)
@anchor{library/pathlib pathlib Path}@anchor{266}
@deffn {클래스} pathlib.Path (*pathsegments)

@ref{6cc,,PurePath}의 서브 클래스, 이 클래스는 시스템의 경로 플레이버의 구상 경로를 나타냅니다 (인스턴스화 하면 @ref{2c5a,,PosixPath}나 @ref{2c47,,WindowsPath}를 만듭니다):

@example
>>> Path('setup.py')
PosixPath('setup.py')
@end example

`pathsegments'는 @ref{6cc,,PurePath}와 유사하게 지정됩니다.
@end deffn

@geindex PosixPath (pathlib 클래스)
@anchor{library/pathlib pathlib PosixPath}@anchor{2c5a}
@deffn {클래스} pathlib.PosixPath (*pathsegments)

@ref{266,,Path}와 @ref{2c4b,,PurePosixPath}의 서브 클래스, 이 클래스는 윈도우 이외의 구상 파일 시스템 경로를 나타냅니다:

@example
>>> PosixPath('/etc/hosts')
PosixPath('/etc/hosts')
@end example

`pathsegments'는 @ref{6cc,,PurePath}와 유사하게 지정됩니다.


버전 3.13에서 변경: Raises @ref{533,,UnsupportedOperation} on Windows. In previous versions,
@ref{36b,,NotImplementedError} was raised instead.

@end deffn

@geindex WindowsPath (pathlib 클래스)
@anchor{library/pathlib pathlib WindowsPath}@anchor{2c47}
@deffn {클래스} pathlib.WindowsPath (*pathsegments)

@ref{266,,Path}와 @ref{1a75,,PureWindowsPath}의 서브 클래스, 이 클래스는 구상 윈도우 파일 시스템 경로를 나타냅니다:

@example
>>> WindowsPath('c:/', 'Users', 'Ximénez')
WindowsPath('c:/Users/Ximénez')
@end example

`pathsegments'는 @ref{6cc,,PurePath}와 유사하게 지정됩니다.


버전 3.13에서 변경: Raises @ref{533,,UnsupportedOperation} on non-Windows platforms. In previous
versions, @ref{36b,,NotImplementedError} was raised instead.

@end deffn

여러분의 시스템에 해당하는 클래스 플레이버만 인스턴스화 할 수 있습니다 (호환되지 않는 경로 플레이버에 대한 시스템 호출을 허용하면 응용 프로그램에서 버그나 실패가 발생할 수 있습니다):

@example
>>> import os
>>> os.name
'posix'
>>> Path('setup.py')
PosixPath('setup.py')
>>> PosixPath('setup.py')
PosixPath('setup.py')
>>> WindowsPath('setup.py')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "pathlib.py", line 798, in __new__
    % (cls.__name__,))
UnsupportedOperation: cannot instantiate 'WindowsPath' on your system
@end example

Some concrete path methods can raise an @ref{2c0,,OSError} if a system call fails
(for example because the path doesn’t exist).

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

@end menu

@node Parsing and generating URIs,Expanding and resolving paths,,구상 경로
@anchor{library/pathlib parsing-and-generating-uris}@anchor{2c5b}
@subsubsection Parsing and generating URIs


Concrete path objects can be created from, and represented as, ‘file’ URIs
conforming to 
@geindex RFC; RFC 8089
RFC 8089@footnote{https://datatracker.ietf.org/doc/html/rfc8089.html}.

@cartouche
@quotation 참고 
File URIs are not portable across machines with different
@ref{2c5c,,filesystem encodings}.
@end quotation
@end cartouche

@geindex from_uri() (pathlib.Path의 클래스 메서드)
@anchor{library/pathlib pathlib Path from_uri}@anchor{534}
@deffn {메서드} classmethod Path.from_uri (uri)

Return a new path object from parsing a ‘file’ URI. For example:

@example
>>> p = Path.from_uri('file:///etc/hosts')
PosixPath('/etc/hosts')
@end example

On Windows, DOS device and UNC paths may be parsed from URIs:

@example
>>> p = Path.from_uri('file:///c:/windows')
WindowsPath('c:/windows')
>>> p = Path.from_uri('file://server/share')
WindowsPath('//server/share')
@end example

Several variant forms are supported:

@example
>>> p = Path.from_uri('file:////server/share')
WindowsPath('//server/share')
>>> p = Path.from_uri('file://///server/share')
WindowsPath('//server/share')
>>> p = Path.from_uri('file:c:/windows')
WindowsPath('c:/windows')
>>> p = Path.from_uri('file:/c|/windows')
WindowsPath('c:/windows')
@end example

@ref{2ec,,ValueError} is raised if the URI does not start with @code{file:}, or
the parsed path isn’t absolute.


Added in version 3.13.



버전 3.14에서 변경: The URL authority is discarded if it matches the local hostname.
Otherwise, if the authority isn’t empty or @code{localhost}, then on
Windows a UNC path is returned (as before), and on other platforms a
@ref{2ec,,ValueError} is raised.

@end deffn

@geindex as_uri() (pathlib.Path 메서드)
@anchor{library/pathlib pathlib Path as_uri}@anchor{31c}
@deffn {메서드} Path.as_uri ()

Represent the path as a ‘file’ URI.  @ref{2ec,,ValueError} is raised if
the path isn’t absolute.

@example
>>> p = PosixPath('/etc/passwd')
>>> p.as_uri()
'file:///etc/passwd'
>>> p = WindowsPath('c:/Windows')
>>> p.as_uri()
'file:///c:/Windows'
@end example


Deprecated since version 3.14, will be removed in version 3.19: Calling this method from @ref{6cc,,PurePath} rather than @ref{266,,Path} is
possible but deprecated. The method’s use of @ref{e4e,,os.fsencode()} makes
it strictly impure.

@end deffn

@node Expanding and resolving paths,Querying file type and status,Parsing and generating URIs,구상 경로
@anchor{library/pathlib expanding-and-resolving-paths}@anchor{2c5d}
@subsubsection Expanding and resolving paths


@geindex home() (pathlib.Path의 클래스 메서드)
@anchor{library/pathlib pathlib Path home}@anchor{1042}
@deffn {메서드} classmethod Path.home ()

Return a new path object representing the user’s home directory (as
returned by @ref{c08,,os.path.expanduser()} with @code{~} construct). If the home
directory can’t be resolved, @ref{244,,RuntimeError} is raised.

@example
>>> Path.home()
PosixPath('/home/antoine')
@end example


Added in version 3.5.

@end deffn

@geindex expanduser() (pathlib.Path 메서드)
@anchor{library/pathlib pathlib Path expanduser}@anchor{1041}
@deffn {메서드} Path.expanduser ()

Return a new path with expanded @code{~} and @code{~user} constructs,
as returned by @ref{c08,,os.path.expanduser()}. If a home directory can’t be
resolved, @ref{244,,RuntimeError} is raised.

@example
>>> p = PosixPath('~/films/Monty Python')
>>> p.expanduser()
PosixPath('/home/eric/films/Monty Python')
@end example


Added in version 3.5.

@end deffn

@geindex cwd() (pathlib.Path의 클래스 메서드)
@anchor{library/pathlib pathlib Path cwd}@anchor{1a9a}
@deffn {메서드} classmethod Path.cwd ()

현재 디렉터리를 나타내는 새 경로 객체를 반환합니다. @ref{190a,,os.getcwd()}가 반환하는 것과 유사합니다:

@example
>>> Path.cwd()
PosixPath('/home/antoine/pathlib')
@end example
@end deffn

@geindex absolute() (pathlib.Path 메서드)
@anchor{library/pathlib pathlib Path absolute}@anchor{1a26}
@deffn {메서드} Path.absolute ()

Make the path absolute, without normalization or resolving symlinks.
Returns a new path object:

@example
>>> p = Path('tests')
>>> p
PosixPath('tests')
>>> p.absolute()
PosixPath('/home/antoine/pathlib/tests')
@end example
@end deffn

@geindex resolve() (pathlib.Path 메서드)
@anchor{library/pathlib pathlib Path resolve}@anchor{1a6d}
@deffn {메서드} Path.resolve (strict=False)

심볼릭 링크를 결정하여, 경로를 절대적으로 만듭니다. 새로운 경로 객체가 반환됩니다:

@example
>>> p = Path()
>>> p
PosixPath('.')
>>> p.resolve()
PosixPath('/home/antoine/pathlib')
@end example

“@code{..}” 구성 요소도 제거됩니다 (이것이 이렇게 하는 유일한 메서드입니다):

@example
>>> p = Path('docs/../setup.py')
>>> p.resolve()
PosixPath('/home/antoine/pathlib/setup.py')
@end example

If a path doesn’t exist or a symlink loop is encountered, and `strict' is
@code{True}, @ref{2c0,,OSError} is raised.  If `strict' is @code{False}, the path is
resolved as far as possible and any remainder is appended without checking
whether it exists.


버전 3.6에서 변경: The `strict' parameter was added (pre-3.6 behavior is strict).



버전 3.13에서 변경: Symlink loops are treated like other errors: @ref{2c0,,OSError} is raised in
strict mode, and no exception is raised in non-strict mode. In previous
versions, @ref{244,,RuntimeError} is raised no matter the value of `strict'.

@end deffn

@geindex readlink() (pathlib.Path 메서드)
@anchor{library/pathlib pathlib Path readlink}@anchor{b1a}
@deffn {메서드} Path.readlink ()

심볼릭 링크가 가리키는 경로를 반환합니다 (@ref{b19,,os.readlink()}가 반환하는 것과 유사합니다):

@example
>>> p = Path('mylink')
>>> p.symlink_to('setup.py')
>>> p.readlink()
PosixPath('setup.py')
@end example


Added in version 3.9.



버전 3.13에서 변경: Raises @ref{533,,UnsupportedOperation} if @ref{b19,,os.readlink()} is not
available. In previous versions, @ref{36b,,NotImplementedError} was raised.

@end deffn

@node Querying file type and status,Reading and writing files,Expanding and resolving paths,구상 경로
@anchor{library/pathlib querying-file-type-and-status}@anchor{2c5e}
@subsubsection Querying file type and status



버전 3.8에서 변경: @ref{c0a,,exists()}, @ref{53a,,is_dir()}, @ref{539,,is_file()},
@ref{c0b,,is_mount()}, @ref{c0c,,is_symlink()},
@ref{c0d,,is_block_device()}, @ref{c0e,,is_char_device()},
@ref{c0f,,is_fifo()}, @ref{c10,,is_socket()} now return @code{False}
instead of raising an exception for paths that contain characters
unrepresentable at the OS level.



버전 3.14에서 변경: The methods given above now return @code{False} instead of raising any
@ref{2c0,,OSError} exception from the operating system. In previous versions,
some kinds of @code{OSError} exception are raised, and others suppressed.
The new behaviour is consistent with @ref{c02,,os.path.exists()},
@ref{c04,,os.path.isdir()}, etc. Use @ref{a24,,stat()} to retrieve the file
status without suppressing exceptions.


@geindex stat() (pathlib.Path 메서드)
@anchor{library/pathlib pathlib Path stat}@anchor{a24}
@deffn {메서드} Path.stat (*, follow_symlinks=True)

Return an @ref{16c6,,os.stat_result} object containing information about this path, like @ref{26d,,os.stat()}.
The result is looked up at each call to this method.

This method normally follows symlinks; to stat a symlink add the argument
@code{follow_symlinks=False}, or use @ref{2c5f,,lstat()}.

@example
>>> p = Path('setup.py')
>>> p.stat().st_size
956
>>> p.stat().st_mtime
1327883547.852554
@end example


버전 3.10에서 변경: The `follow_symlinks' parameter was added.

@end deffn

@geindex lstat() (pathlib.Path 메서드)
@anchor{library/pathlib pathlib Path lstat}@anchor{2c5f}
@deffn {메서드} Path.lstat ()

@ref{a24,,Path.stat()}과 비슷하지만, 경로가 심볼릭 링크를 가리키면, 대상이 아닌 심볼릭 링크의 정보를 반환합니다.
@end deffn

@geindex exists() (pathlib.Path 메서드)
@anchor{library/pathlib pathlib Path exists}@anchor{c0a}
@deffn {메서드} Path.exists (*, follow_symlinks=True)

Return @code{True} if the path points to an existing file or directory.
@code{False} will be returned if the path is invalid, inaccessible or missing.
Use @ref{a24,,Path.stat()} to distinguish between these cases.

This method normally follows symlinks; to check if a symlink exists, add
the argument @code{follow_symlinks=False}.

@example
>>> Path('.').exists()
True
>>> Path('setup.py').exists()
True
>>> Path('/etc').exists()
True
>>> Path('nonexistentfile').exists()
False
@end example


버전 3.12에서 변경: The `follow_symlinks' parameter was added.

@end deffn

@geindex is_file() (pathlib.Path 메서드)
@anchor{library/pathlib pathlib Path is_file}@anchor{539}
@deffn {메서드} Path.is_file (*, follow_symlinks=True)

Return @code{True} if the path points to a regular file. @code{False} will be
returned if the path is invalid, inaccessible or missing, or if it points
to something other than a regular file. Use @ref{a24,,Path.stat()} to
distinguish between these cases.

This method normally follows symlinks; to exclude symlinks, add the
argument @code{follow_symlinks=False}.


버전 3.13에서 변경: The `follow_symlinks' parameter was added.

@end deffn

@geindex is_dir() (pathlib.Path 메서드)
@anchor{library/pathlib pathlib Path is_dir}@anchor{53a}
@deffn {메서드} Path.is_dir (*, follow_symlinks=True)

Return @code{True} if the path points to a directory. @code{False} will be
returned if the path is invalid, inaccessible or missing, or if it points
to something other than a directory. Use @ref{a24,,Path.stat()} to distinguish
between these cases.

This method normally follows symlinks; to exclude symlinks to directories,
add the argument @code{follow_symlinks=False}.


버전 3.13에서 변경: The `follow_symlinks' parameter was added.

@end deffn

@geindex is_symlink() (pathlib.Path 메서드)
@anchor{library/pathlib pathlib Path is_symlink}@anchor{c0c}
@deffn {메서드} Path.is_symlink ()

Return @code{True} if the path points to a symbolic link, even if that symlink
is broken. @code{False} will be returned if the path is invalid, inaccessible
or missing, or if it points to something other than a symbolic link. Use
@ref{a24,,Path.stat()} to distinguish between these cases.
@end deffn

@geindex is_junction() (pathlib.Path 메서드)
@anchor{library/pathlib pathlib Path is_junction}@anchor{6d1}
@deffn {메서드} Path.is_junction ()

Return @code{True} if the path points to a junction, and @code{False} for any other
type of file. Currently only Windows supports junctions.


Added in version 3.12.

@end deffn

@geindex is_mount() (pathlib.Path 메서드)
@anchor{library/pathlib pathlib Path is_mount}@anchor{c0b}
@deffn {메서드} Path.is_mount ()

Return @code{True} if the path is a `mount point': a point in a
file system where a different file system has been mounted.  On POSIX, the
function checks whether `path'’s parent, @code{path/..}, is on a different
device than `path', or whether @code{path/..} and `path' point to the same
i-node on the same device — this should detect mount points for all Unix
and POSIX variants.  On Windows, a mount point is considered to be a drive
letter root (e.g. @code{c:\}), a UNC share (e.g. @code{\\server\share}), or a
mounted filesystem directory.


Added in version 3.7.



버전 3.12에서 변경: Windows support was added.

@end deffn

@geindex is_socket() (pathlib.Path 메서드)
@anchor{library/pathlib pathlib Path is_socket}@anchor{c10}
@deffn {메서드} Path.is_socket ()

Return @code{True} if the path points to a Unix socket. @code{False} will be
returned if the path is invalid, inaccessible or missing, or if it points
to something other than a Unix socket. Use @ref{a24,,Path.stat()} to
distinguish between these cases.
@end deffn

@geindex is_fifo() (pathlib.Path 메서드)
@anchor{library/pathlib pathlib Path is_fifo}@anchor{c0f}
@deffn {메서드} Path.is_fifo ()

Return @code{True} if the path points to a FIFO. @code{False} will be returned if
the path is invalid, inaccessible or missing, or if it points to something
other than a FIFO. Use @ref{a24,,Path.stat()} to distinguish between these
cases.
@end deffn

@geindex is_block_device() (pathlib.Path 메서드)
@anchor{library/pathlib pathlib Path is_block_device}@anchor{c0d}
@deffn {메서드} Path.is_block_device ()

Return @code{True} if the path points to a block device. @code{False} will be
returned if the path is invalid, inaccessible or missing, or if it points
to something other than a block device. Use @ref{a24,,Path.stat()} to
distinguish between these cases.
@end deffn

@geindex is_char_device() (pathlib.Path 메서드)
@anchor{library/pathlib pathlib Path is_char_device}@anchor{c0e}
@deffn {메서드} Path.is_char_device ()

Return @code{True} if the path points to a character device. @code{False} will be
returned if the path is invalid, inaccessible or missing, or if it points
to something other than a character device. Use @ref{a24,,Path.stat()} to
distinguish between these cases.
@end deffn

@geindex samefile() (pathlib.Path 메서드)
@anchor{library/pathlib pathlib Path samefile}@anchor{103f}
@deffn {메서드} Path.samefile (other_path)

이 경로가 `other_path'와 같은 파일을 가리키는지를 반환합니다. `other_path'는 Path 객체이거나 문자열일 수 있습니다. 의미는 @ref{1170,,os.path.samefile()}과 @ref{116f,,os.path.samestat()}과 유사합니다.

어떤 이유로 파일에 액세스할 수 없으면 @ref{2c0,,OSError}가 발생할 수 있습니다.

@example
>>> p = Path('spam')
>>> q = Path('eggs')
>>> p.samefile(q)
False
>>> p.samefile('spam')
True
@end example


Added in version 3.5.

@end deffn

@geindex info (pathlib.Path의 속성)
@anchor{library/pathlib pathlib Path info}@anchor{26b}
@deffn {속성} Path.info

A @ref{26c,,PathInfo} object that supports querying file type
information. The object exposes methods that cache their results, which can
help reduce the number of system calls needed when switching on file type.
For example:

@example
>>> p = Path('src')
>>> if p.info.is_symlink():
...     print('symlink')
... elif p.info.is_dir():
...     print('directory')
... elif p.info.exists():
...     print('something else')
... else:
...     print('not found')
...
directory
@end example

If the path was generated from @ref{26e,,Path.iterdir()} then this attribute is
initialized with some information about the file type gleaned from scanning
the parent directory. Merely accessing @code{Path.info} does not perform
any filesystem queries.

To fetch up-to-date information, it’s best to call @ref{53a,,Path.is_dir()},
@ref{539,,is_file()} and @ref{c0c,,is_symlink()} rather than methods of
this attribute. There is no way to reset the cache; instead you can create
a new path object with an empty info cache via @code{p = Path(p)}.


Added in version 3.14.

@end deffn

@node Reading and writing files,Reading directories,Querying file type and status,구상 경로
@anchor{library/pathlib reading-and-writing-files}@anchor{2c60}
@subsubsection Reading and writing files


@geindex open() (pathlib.Path 메서드)
@anchor{library/pathlib pathlib Path open}@anchor{2c61}
@deffn {메서드} Path.open (mode='r', buffering=-1, encoding=None, errors=None, newline=None)

내장 @ref{316,,open()} 함수처럼, 경로가 가리키는 파일을 엽니다:

@example
>>> p = Path('setup.py')
>>> with p.open() as f:
...     f.readline()
...
'#!/usr/bin/env python3\n'
@end example
@end deffn

@geindex read_text() (pathlib.Path 메서드)
@anchor{library/pathlib pathlib Path read_text}@anchor{1044}
@deffn {메서드} Path.read_text (encoding=None, errors=None, newline=None)

가리키는 파일의 디코딩된 내용을 문자열로 반환합니다:

@example
>>> p = Path('my_text_file')
>>> p.write_text('Text file contents')
18
>>> p.read_text()
'Text file contents'
@end example

파일이 열린 다음에 닫힙니다. 선택적 매개 변수는 @ref{316,,open()}과 같은 의미입니다.


Added in version 3.5.



버전 3.13에서 변경: The `newline' parameter was added.

@end deffn

@geindex read_bytes() (pathlib.Path 메서드)
@anchor{library/pathlib pathlib Path read_bytes}@anchor{2df}
@deffn {메서드} Path.read_bytes ()

가리키는 파일의 바이너리 내용을 바이트열 객체로 반환합니다:

@example
>>> p = Path('my_binary_file')
>>> p.write_bytes(b'Binary file contents')
20
>>> p.read_bytes()
b'Binary file contents'
@end example


Added in version 3.5.

@end deffn

@geindex write_text() (pathlib.Path 메서드)
@anchor{library/pathlib pathlib Path write_text}@anchor{1043}
@deffn {메서드} Path.write_text (data, encoding=None, errors=None, newline=None)

가리키는 파일을 텍스트 모드로 열고, `data'를 쓴 다음, 파일을 닫습니다:

@example
>>> p = Path('my_text_file')
>>> p.write_text('Text file contents')
18
>>> p.read_text()
'Text file contents'
@end example

같은 이름의 기존 파일을 덮어씁니다. 선택적 매개 변수는 @ref{316,,open()}에서와 같은 의미입니다.


Added in version 3.5.



버전 3.10에서 변경: The `newline' parameter was added.

@end deffn

@geindex write_bytes() (pathlib.Path 메서드)
@anchor{library/pathlib pathlib Path write_bytes}@anchor{1045}
@deffn {메서드} Path.write_bytes (data)

가리키는 파일을 바이너리 모드로 열고, `data'를 쓴 다음, 파일을 닫습니다:

@example
>>> p = Path('my_binary_file')
>>> p.write_bytes(b'Binary file contents')
20
>>> p.read_bytes()
b'Binary file contents'
@end example

같은 이름의 기존 파일을 덮어씁니다.


Added in version 3.5.

@end deffn

@node Reading directories,Creating files and directories,Reading and writing files,구상 경로
@anchor{library/pathlib reading-directories}@anchor{2c62}
@subsubsection Reading directories


@geindex iterdir() (pathlib.Path 메서드)
@anchor{library/pathlib pathlib Path iterdir}@anchor{26e}
@deffn {메서드} Path.iterdir ()

경로가 디렉터리를 가리킬 때, 디렉터리 내용의 경로 객체를 산출합니다:

@example
>>> p = Path('docs')
>>> for child in p.iterdir(): child
...
PosixPath('docs/conf.py')
PosixPath('docs/_templates')
PosixPath('docs/make.bat')
PosixPath('docs/index.rst')
PosixPath('docs/_build')
PosixPath('docs/_static')
PosixPath('docs/Makefile')
@end example

The children are yielded in arbitrary order, and the special entries
@code{'.'} and @code{'..'} are not included.  If a file is removed from or added
to the directory after creating the iterator, it is unspecified whether
a path object for that file is included.

If the path is not a directory or otherwise inaccessible, @ref{2c0,,OSError} is
raised.
@end deffn

@geindex glob() (pathlib.Path 메서드)
@anchor{library/pathlib pathlib Path glob}@anchor{537}
@deffn {메서드} Path.glob (pattern, *, case_sensitive=None, recurse_symlinks=False)

이 경로로 표현되는 디렉터리에서, 주어진 상대 `pattern'을 glob 하여, 일치하는 모든 파일을 (종류와 관계없이) 산출합니다:

@example
>>> sorted(Path('.').glob('*.py'))
[PosixPath('pathlib.py'), PosixPath('setup.py'), PosixPath('test_pathlib.py')]
>>> sorted(Path('.').glob('*/*.py'))
[PosixPath('docs/conf.py')]
>>> sorted(Path('.').glob('**/*.py'))
[PosixPath('build/lib/pathlib.py'),
 PosixPath('docs/conf.py'),
 PosixPath('pathlib.py'),
 PosixPath('setup.py'),
 PosixPath('test_pathlib.py')]
@end example

@cartouche
@quotation 참고 
The paths are returned in no particular order.
If you need a specific order, sort the results.
@end quotation
@end cartouche


@subsubheading 더 보기


@ref{2c58,,Pattern language} documentation.


By default, or when the `case_sensitive' keyword-only argument is set to
@code{None}, this method matches paths using platform-specific casing rules:
typically, case-sensitive on POSIX, and case-insensitive on Windows.
Set `case_sensitive' to @code{True} or @code{False} to override this behaviour.

By default, or when the `recurse_symlinks' keyword-only argument is set to
@code{False}, this method follows symlinks except when expanding “@code{**}”
wildcards. Set `recurse_symlinks' to @code{True} to always follow symlinks.

인자 @code{self}, @code{pattern}으로 @ref{1c6c,,감사 이벤트} @code{pathlib.Path.glob}을 발생시킵니다.


버전 3.12에서 변경: The `case_sensitive' parameter was added.



버전 3.13에서 변경: The `recurse_symlinks' parameter was added.



버전 3.13에서 변경: The `pattern' parameter accepts a @ref{5a0,,path-like object}.



버전 3.13에서 변경: Any @ref{2c0,,OSError} exceptions raised from scanning the filesystem are
suppressed. In previous versions, such exceptions are suppressed in many
cases, but not all.

@end deffn

@geindex rglob() (pathlib.Path 메서드)
@anchor{library/pathlib pathlib Path rglob}@anchor{538}
@deffn {메서드} Path.rglob (pattern, *, case_sensitive=None, recurse_symlinks=False)

Glob the given relative `pattern' recursively.  This is like calling
@ref{537,,Path.glob()} with “@code{**/}” added in front of the `pattern'.

@cartouche
@quotation 참고 
The paths are returned in no particular order.
If you need a specific order, sort the results.
@end quotation
@end cartouche


@subsubheading 더 보기


@ref{2c58,,Pattern language} and @ref{537,,Path.glob()} documentation.


인자 @code{self}, @code{pattern}으로 @ref{1c6c,,감사 이벤트} @code{pathlib.Path.rglob}을 발생시킵니다.


버전 3.12에서 변경: The `case_sensitive' parameter was added.



버전 3.13에서 변경: The `recurse_symlinks' parameter was added.



버전 3.13에서 변경: The `pattern' parameter accepts a @ref{5a0,,path-like object}.

@end deffn

@geindex walk() (pathlib.Path 메서드)
@anchor{library/pathlib pathlib Path walk}@anchor{6ce}
@deffn {메서드} Path.walk (top_down=True, on_error=None, follow_symlinks=False)

Generate the file names in a directory tree by walking the tree
either top-down or bottom-up.

For each directory in the directory tree rooted at `self' (including
`self' but excluding ‘.’ and ‘..’), the method yields a 3-tuple of
@code{(dirpath, dirnames, filenames)}.

`dirpath' is a @ref{266,,Path} to the directory currently being walked,
`dirnames' is a list of strings for the names of subdirectories in `dirpath'
(excluding @code{'.'} and @code{'..'}), and `filenames' is a list of strings for
the names of the non-directory files in `dirpath'. To get a full path
(which begins with `self') to a file or directory in `dirpath', do
@code{dirpath / name}. Whether or not the lists are sorted is file
system-dependent.

If the optional argument `top_down' is true (which is the default), the triple for a
directory is generated before the triples for any of its subdirectories
(directories are walked top-down).  If `top_down' is false, the triple
for a directory is generated after the triples for all of its subdirectories
(directories are walked bottom-up). No matter the value of `top_down', the
list of subdirectories is retrieved before the triples for the directory and
its subdirectories are walked.

When `top_down' is true, the caller can modify the `dirnames' list in-place
(for example, using @ref{1b1d,,del} or slice assignment), and @code{Path.walk()}
will only recurse into the subdirectories whose names remain in `dirnames'.
This can be used to prune the search, or to impose a specific order of visiting,
or even to inform @code{Path.walk()} about directories the caller creates or
renames before it resumes @code{Path.walk()} again. Modifying `dirnames' when
`top_down' is false has no effect on the behavior of @code{Path.walk()} since the
directories in `dirnames' have already been generated by the time `dirnames'
is yielded to the caller.

By default, errors from @ref{c53,,os.scandir()} are ignored.  If the optional
argument `on_error' is specified, it should be a callable; it will be
called with one argument, an @ref{2c0,,OSError} instance. The callable can handle the
error to continue the walk or re-raise it to stop the walk. Note that the
filename is available as the @code{filename} attribute of the exception object.

By default, @code{Path.walk()} does not follow symbolic links, and instead adds them
to the `filenames' list. Set `follow_symlinks' to true to resolve symlinks
and place them in `dirnames' and `filenames' as appropriate for their targets, and
consequently visit directories pointed to by symlinks (where supported).

@cartouche
@quotation 참고 
Be aware that setting `follow_symlinks' to true can lead to infinite
recursion if a link points to a parent directory of itself. @code{Path.walk()}
does not keep track of the directories it has already visited.
@end quotation
@end cartouche

@cartouche
@quotation 참고 
@code{Path.walk()} assumes the directories it walks are not modified during
execution. For example, if a directory from `dirnames' has been replaced
with a symlink and `follow_symlinks' is false, @code{Path.walk()} will
still try to descend into it. To prevent such behavior, remove directories
from `dirnames' as appropriate.
@end quotation
@end cartouche

@cartouche
@quotation 참고 
Unlike @ref{6cf,,os.walk()}, @code{Path.walk()} lists symlinks to directories in
`filenames' if `follow_symlinks' is false.
@end quotation
@end cartouche

This example displays the number of bytes used by all files in each directory,
while ignoring @code{__pycache__} directories:

@example
from pathlib import Path
for root, dirs, files in Path("cpython/Lib/concurrent").walk(on_error=print):
  print(
      root,
      "consumes",
      sum((root / file).stat().st_size for file in files),
      "bytes in",
      len(files),
      "non-directory files"
  )
  if '__pycache__' in dirs:
        dirs.remove('__pycache__')
@end example

This next example is a simple implementation of @ref{356,,shutil.rmtree()}.
Walking the tree bottom-up is essential as @ref{2c63,,rmdir()} doesn’t allow
deleting a directory before it is empty:

@example
# Delete everything reachable from the directory "top".
# CAUTION:  This is dangerous! For example, if top == Path('/'),
# it could delete all of your files.
for root, dirs, files in top.walk(top_down=False):
    for name in files:
        (root / name).unlink()
    for name in dirs:
        (root / name).rmdir()
@end example


Added in version 3.12.

@end deffn

@node Creating files and directories,Copying moving and deleting,Reading directories,구상 경로
@anchor{library/pathlib creating-files-and-directories}@anchor{2c64}
@subsubsection Creating files and directories


@geindex touch() (pathlib.Path 메서드)
@anchor{library/pathlib pathlib Path touch}@anchor{2c65}
@deffn {메서드} Path.touch (mode=0o666, exist_ok=True)

Create a file at this given path.  If `mode' is given, it is combined
with the process’s @code{umask} value to determine the file mode and access
flags.  If the file already exists, the function succeeds when `exist_ok'
is true (and its modification time is updated to the current time),
otherwise @ref{121f,,FileExistsError} is raised.


@subsubheading 더 보기


The @ref{2c61,,open()}, @ref{1043,,write_text()} and
@ref{1045,,write_bytes()} methods are often used to create files.

@end deffn

@geindex mkdir() (pathlib.Path 메서드)
@anchor{library/pathlib pathlib Path mkdir}@anchor{1040}
@deffn {메서드} Path.mkdir (mode=0o777, parents=False, exist_ok=False)

Create a new directory at this given path.  If `mode' is given, it is
combined with the process’s @code{umask} value to determine the file mode
and access flags.  If the path already exists, @ref{121f,,FileExistsError}
is raised.

`parents'가 참이면, 이 경로의 누락 된 부모를 필요하면 만듭니다; 이것들은 `mode'를 고려하지 않고 기본 권한으로 만들어집니다 (POSIX @code{mkdir -p} 명령을 모방합니다).

`parents'가 거짓(기본값)이면, 누락된 부모가 @ref{264,,FileNotFoundError}를 발생시킵니다.

`exist_ok'가 거짓(기본값)이면, 대상 디렉터리가 이미 존재하면 @ref{121f,,FileExistsError}가 발생합니다.

If `exist_ok' is true, @ref{121f,,FileExistsError} will not be raised unless the given
path already exists in the file system and is not a directory (same
behavior as the POSIX @code{mkdir -p} command).


버전 3.5에서 변경: `exist_ok' 매개 변수가 추가되었습니다.

@end deffn

@geindex symlink_to() (pathlib.Path 메서드)
@anchor{library/pathlib pathlib Path symlink_to}@anchor{a23}
@deffn {메서드} Path.symlink_to (target, target_is_directory=False)

Make this path a symbolic link pointing to `target'.

On Windows, a symlink represents either a file or a directory, and does not
morph to the target dynamically.  If the target is present, the type of the
symlink will be created to match. Otherwise, the symlink will be created
as a directory if `target_is_directory' is true or a file symlink (the
default) otherwise.  On non-Windows platforms, `target_is_directory' is ignored.

@example
>>> p = Path('mylink')
>>> p.symlink_to('setup.py')
>>> p.resolve()
PosixPath('/home/antoine/pathlib/setup.py')
>>> p.stat().st_size
956
>>> p.lstat().st_size
8
@end example

@cartouche
@quotation 참고 
인자의 순서(링크, 대상)는 @ref{12f9,,os.symlink()}와 반대입니다.
@end quotation
@end cartouche


버전 3.13에서 변경: Raises @ref{533,,UnsupportedOperation} if @ref{12f9,,os.symlink()} is not
available. In previous versions, @ref{36b,,NotImplementedError} was raised.

@end deffn

@geindex hardlink_to() (pathlib.Path 메서드)
@anchor{library/pathlib pathlib Path hardlink_to}@anchor{a22}
@deffn {메서드} Path.hardlink_to (target)

Make this path a hard link to the same file as `target'.

@cartouche
@quotation 참고 
The order of arguments (link, target) is the reverse
of @ref{12f4,,os.link()}’s.
@end quotation
@end cartouche


Added in version 3.10.



버전 3.13에서 변경: Raises @ref{533,,UnsupportedOperation} if @ref{12f4,,os.link()} is not
available. In previous versions, @ref{36b,,NotImplementedError} was raised.

@end deffn

@node Copying moving and deleting,Permissions and ownership,Creating files and directories,구상 경로
@anchor{library/pathlib copying-moving-and-deleting}@anchor{2c66}
@subsubsection Copying, moving and deleting


@geindex copy() (pathlib.Path 메서드)
@anchor{library/pathlib pathlib Path copy}@anchor{267}
@deffn {메서드} Path.copy (target, *, follow_symlinks=True, preserve_metadata=False)

Copy this file or directory tree to the given `target', and return a new
@code{Path} instance pointing to `target'.

If the source is a file, the target will be replaced if it is an existing
file. If the source is a symlink and `follow_symlinks' is true (the
default), the symlink’s target is copied. Otherwise, the symlink is
recreated at the destination.

If `preserve_metadata' is false (the default), only directory structures
and file data are guaranteed to be copied. Set `preserve_metadata' to true
to ensure that file and directory permissions, flags, last access and
modification times, and extended attributes are copied where supported.
This argument has no effect when copying files on Windows (where
metadata is always preserved).

@cartouche
@quotation 참고 
Where supported by the operating system and file system, this method
performs a lightweight copy, where data blocks are only copied when
modified. This is known as copy-on-write.
@end quotation
@end cartouche


Added in version 3.14.

@end deffn

@geindex copy_into() (pathlib.Path 메서드)
@anchor{library/pathlib pathlib Path copy_into}@anchor{268}
@deffn {메서드} Path.copy_into (target_dir, *, follow_symlinks=True, preserve_metadata=False)

Copy this file or directory tree into the given `target_dir', which should
be an existing directory. Other arguments are handled identically to
@ref{267,,Path.copy()}. Returns a new @code{Path} instance pointing to the
copy.


Added in version 3.14.

@end deffn

@geindex rename() (pathlib.Path 메서드)
@anchor{library/pathlib pathlib Path rename}@anchor{1893}
@deffn {메서드} Path.rename (target)

Rename this file or directory to the given `target', and return a new
@code{Path} instance pointing to `target'.  On Unix, if `target' exists
and is a file, it will be replaced silently if the user has permission.
On Windows, if `target' exists, @ref{121f,,FileExistsError} will be raised.
`target' can be either a string or another path object:

@example
>>> p = Path('foo')
>>> p.open('w').write('some text')
9
>>> target = Path('bar')
>>> p.rename(target)
PosixPath('bar')
>>> target.open().read()
'some text'
@end example

The target path may be absolute or relative. Relative paths are interpreted
relative to the current working directory, `not' the directory of the
@code{Path} object.

It is implemented in terms of @ref{12f6,,os.rename()} and gives the same guarantees.


버전 3.8에서 변경: Added return value, return the new @code{Path} instance.

@end deffn

@geindex replace() (pathlib.Path 메서드)
@anchor{library/pathlib pathlib Path replace}@anchor{2c67}
@deffn {메서드} Path.replace (target)

Rename this file or directory to the given `target', and return a new
@code{Path} instance pointing to `target'.  If `target' points to an
existing file or empty directory, it will be unconditionally replaced.

The target path may be absolute or relative. Relative paths are interpreted
relative to the current working directory, `not' the directory of the
@code{Path} object.


버전 3.8에서 변경: Added return value, return the new @code{Path} instance.

@end deffn

@geindex move() (pathlib.Path 메서드)
@anchor{library/pathlib pathlib Path move}@anchor{269}
@deffn {메서드} Path.move (target)

Move this file or directory tree to the given `target', and return a new
@code{Path} instance pointing to `target'.

If the `target' doesn’t exist it will be created. If both this path and the
`target' are existing files, then the target is overwritten. If both paths
point to the same file or directory, or the `target' is a non-empty
directory, then @ref{2c0,,OSError} is raised.

If both paths are on the same filesystem, the move is performed with
@ref{12f7,,os.replace()}. Otherwise, this path is copied (preserving metadata and
symlinks) and then deleted.


Added in version 3.14.

@end deffn

@geindex move_into() (pathlib.Path 메서드)
@anchor{library/pathlib pathlib Path move_into}@anchor{26a}
@deffn {메서드} Path.move_into (target_dir)

Move this file or directory tree into the given `target_dir', which should
be an existing directory. Returns a new @code{Path} instance pointing to
the moved path.


Added in version 3.14.

@end deffn

@geindex unlink() (pathlib.Path 메서드)
@anchor{library/pathlib pathlib Path unlink}@anchor{1dd2}
@deffn {메서드} Path.unlink (missing_ok=False)

이 파일이나 심볼릭 링크를 제거합니다. 경로가 디렉터리를 가리키면, @ref{2c63,,Path.rmdir()}을 대신 사용하십시오.

`missing_ok'가 거짓(기본값)이면, 경로가 없을 때 @ref{264,,FileNotFoundError}가 발생합니다.

`missing_ok'가 참이면, @ref{264,,FileNotFoundError} 예외는 무시됩니다 (POSIX @code{rm -f} 명령과 같은 동작).


버전 3.8에서 변경: `missing_ok' 매개 변수가 추가되었습니다.

@end deffn

@geindex rmdir() (pathlib.Path 메서드)
@anchor{library/pathlib pathlib Path rmdir}@anchor{2c63}
@deffn {메서드} Path.rmdir ()

이 디렉터리를 제거합니다. 디렉터리는 비어 있어야 합니다.
@end deffn

@node Permissions and ownership,,Copying moving and deleting,구상 경로
@anchor{library/pathlib permissions-and-ownership}@anchor{2c68}
@subsubsection Permissions and ownership


@geindex owner() (pathlib.Path 메서드)
@anchor{library/pathlib pathlib Path owner}@anchor{53b}
@deffn {메서드} Path.owner (*, follow_symlinks=True)

Return the name of the user owning the file. @ref{5e5,,KeyError} is raised
if the file’s user identifier (UID) isn’t found in the system database.

This method normally follows symlinks; to get the owner of the symlink, add
the argument @code{follow_symlinks=False}.


버전 3.13에서 변경: Raises @ref{533,,UnsupportedOperation} if the @ref{b7,,pwd} module is not
available. In earlier versions, @ref{36b,,NotImplementedError} was raised.



버전 3.13에서 변경: The `follow_symlinks' parameter was added.

@end deffn

@geindex group() (pathlib.Path 메서드)
@anchor{library/pathlib pathlib Path group}@anchor{53c}
@deffn {메서드} Path.group (*, follow_symlinks=True)

Return the name of the group owning the file. @ref{5e5,,KeyError} is raised
if the file’s group identifier (GID) isn’t found in the system database.

This method normally follows symlinks; to get the group of the symlink, add
the argument @code{follow_symlinks=False}.


버전 3.13에서 변경: Raises @ref{533,,UnsupportedOperation} if the @ref{6a,,grp} module is not
available. In earlier versions, @ref{36b,,NotImplementedError} was raised.



버전 3.13에서 변경: The `follow_symlinks' parameter was added.

@end deffn

@geindex chmod() (pathlib.Path 메서드)
@anchor{library/pathlib pathlib Path chmod}@anchor{a25}
@deffn {메서드} Path.chmod (mode, *, follow_symlinks=True)

Change the file mode and permissions, like @ref{529,,os.chmod()}.

This method normally follows symlinks. Some Unix flavours support changing
permissions on the symlink itself; on these platforms you may add the
argument @code{follow_symlinks=False}, or use @ref{2c69,,lchmod()}.

@example
>>> p = Path('setup.py')
>>> p.stat().st_mode
33277
>>> p.chmod(0o444)
>>> p.stat().st_mode
33060
@end example


버전 3.10에서 변경: The `follow_symlinks' parameter was added.

@end deffn

@geindex lchmod() (pathlib.Path 메서드)
@anchor{library/pathlib pathlib Path lchmod}@anchor{2c69}
@deffn {메서드} Path.lchmod (mode)

@ref{a25,,Path.chmod()}와 비슷하지만, 경로가 심볼릭 링크를 가리키면, 대상이 아닌 심볼릭 링크의 모드가 변경됩니다.
@end deffn

@node Pattern language,Comparison to the glob module,구상 경로,pathlib — Object-oriented filesystem paths
@anchor{library/pathlib pathlib-pattern-language}@anchor{2c58}@anchor{library/pathlib pattern-language}@anchor{2c6a}
@subsubsection Pattern language


The following wildcards are supported in patterns for
@ref{535,,full_match()}, @ref{537,,glob()} and @ref{538,,rglob()}:


@table @asis

@item @code{**} (entire segment)

Matches any number of file or directory segments, including zero.

@item @code{*} (entire segment)

Matches one file or directory segment.

@item @code{*} (part of a segment)

Matches any number of non-separator characters, including zero.

@item @code{?}

Matches one non-separator character.

@item @code{[seq]}

Matches one character in `seq', where `seq' is a sequence of characters.
Range expressions are supported; for example, @code{[a-z]} matches any lowercase ASCII letter.
Multiple ranges can be combined: @code{[a-zA-Z0-9_]} matches any ASCII letter, digit, or underscore.

@item @code{[!seq]}

Matches one character not in `seq', where `seq' follows the same rules as above.
@end table

For a literal match, wrap the meta-characters in brackets.
For example, @code{"[?]"} matches the character @code{"?"}.

The “@code{**}” wildcard enables recursive globbing. A few examples:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Pattern

@tab

Meaning

@item

“@code{**/*}”

@tab

Any path with at least one segment.

@item

“@code{**/*.py}”

@tab

Any path with a final segment ending “@code{.py}”.

@item

“@code{assets/**}”

@tab

Any path starting with “@code{assets/}”.

@item

“@code{assets/**/*}”

@tab

Any path starting with “@code{assets/}”, excluding “@code{assets/}” itself.

@end multitable


@cartouche
@quotation 참고 
Globbing with the “@code{**}” wildcard visits every directory in the tree.
Large directory trees may take a long time to search.
@end quotation
@end cartouche


버전 3.13에서 변경: Globbing with a pattern that ends with “@code{**}” returns both files and
directories. In previous versions, only directories were returned.


In @ref{537,,Path.glob()} and @ref{538,,rglob()}, a trailing slash may be added to
the pattern to match only directories.


버전 3.11에서 변경: Globbing with a pattern that ends with a pathname components separator
(@ref{879,,sep} or @ref{87a,,altsep}) returns only directories.


@node Comparison to the glob module,Comparison to the os and os path modules,Pattern language,pathlib — Object-oriented filesystem paths
@anchor{library/pathlib comparison-to-the-glob-module}@anchor{2c6b}
@subsubsection Comparison to the @code{glob} module


The patterns accepted and results generated by @ref{537,,Path.glob()} and
@ref{538,,Path.rglob()} differ slightly from those by the @ref{68,,glob} module:


@enumerate 

@item 
Files beginning with a dot are not special in pathlib. This is
like passing @code{include_hidden=True} to @ref{59f,,glob.glob()}.

@item 
“@code{**}” pattern components are always recursive in pathlib. This is like
passing @code{recursive=True} to @ref{59f,,glob.glob()}.

@item 
“@code{**}” pattern components do not follow symlinks by default in pathlib.
This behaviour has no equivalent in @ref{59f,,glob.glob()}, but you can pass
@code{recurse_symlinks=True} to @ref{537,,Path.glob()} for compatible behaviour.

@item 
Like all @ref{6cc,,PurePath} and @ref{266,,Path} objects, the values returned
from @ref{537,,Path.glob()} and @ref{538,,Path.rglob()} don’t include trailing
slashes.

@item 
The values returned from pathlib’s @code{path.glob()} and @code{path.rglob()}
include the `path' as a prefix, unlike the results of
@code{glob.glob(root_dir=path)}.

@item 
The values returned from pathlib’s @code{path.glob()} and @code{path.rglob()}
may include `path' itself, for example when globbing “@code{**}”, whereas the
results of @code{glob.glob(root_dir=path)} never include an empty string that
would correspond to `path'.
@end enumerate

@node Comparison to the os and os path modules,Protocols,Comparison to the glob module,pathlib — Object-oriented filesystem paths
@anchor{library/pathlib comparison-to-the-os-and-os-path-modules}@anchor{2c6c}
@subsubsection Comparison to the @code{os} and @code{os.path} modules


pathlib implements path operations using @ref{6cc,,PurePath} and @ref{266,,Path}
objects, and so it’s said to be `object-oriented'. On the other hand, the
@ref{a5,,os} and @ref{a6,,os.path} modules supply functions that work with low-level
@code{str} and @code{bytes} objects, which is a more `procedural' approach. Some
users consider the object-oriented style to be more readable.

Many functions in @ref{a5,,os} and @ref{a6,,os.path} support @code{bytes} paths and
@ref{12ef,,paths relative to directory descriptors}. These features aren’t
available in pathlib.

Python’s @code{str} and @code{bytes} types, and portions of the @ref{a5,,os} and
@ref{a6,,os.path} modules, are written in C and are very speedy. pathlib is
written in pure Python and is often slower, but rarely slow enough to matter.

pathlib’s path normalization is slightly more opinionated and consistent than
@ref{a6,,os.path}. For example, whereas @ref{151f,,os.path.abspath()} eliminates
“@code{..}” segments from a path, which may change its meaning if symlinks are
involved, @ref{1a26,,Path.absolute()} preserves these segments for greater safety.

pathlib’s path normalization may render it unsuitable for some applications:


@enumerate 

@item 
pathlib normalizes @code{Path("my_folder/")} to @code{Path("my_folder")}, which
changes a path’s meaning when supplied to various operating system APIs and
command-line utilities. Specifically, the absence of a trailing separator
may allow the path to be resolved as either a file or directory, rather
than a directory only.

@item 
pathlib normalizes @code{Path("./my_program")} to @code{Path("my_program")},
which changes a path’s meaning when used as an executable search path, such
as in a shell or when spawning a child process. Specifically, the absence
of a separator in the path may force it to be looked up in 
@geindex PATH
@geindex 환경 변수; PATH
@code{PATH}
rather than the current directory.
@end enumerate

As a consequence of these differences, pathlib is not a drop-in replacement
for @ref{a6,,os.path}.

@menu
* Corresponding tools:: 

@end menu

@node Corresponding tools,,,Comparison to the os and os path modules
@anchor{library/pathlib corresponding-tools}@anchor{2c6d}
@subsubsection Corresponding tools


아래는 다양한 @ref{a5,,os} 함수를 해당 @ref{6cc,,PurePath}/@ref{266,,Path} 대응 물에 매핑하는 표입니다.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

@ref{a5,,os} and @ref{a6,,os.path}

@tab

@code{pathlib}

@item

@ref{2c6e,,os.path.dirname()}

@tab

@ref{1a9c,,PurePath.parent}

@item

@ref{2c6f,,os.path.basename()}

@tab

@ref{2c54,,PurePath.name}

@item

@ref{195a,,os.path.splitext()}

@tab

@ref{2c55,,PurePath.stem}, @ref{1958,,PurePath.suffix}

@item

@ref{19a9,,os.path.join()}

@tab

@ref{2c57,,PurePath.joinpath()}

@item

@ref{531,,os.path.isabs()}

@tab

@ref{1a9b,,PurePath.is_absolute()}

@item

@ref{6d0,,os.path.relpath()}

@tab

@ref{2fd,,PurePath.relative_to()} @footnote{
@ref{6d0,,os.path.relpath()} calls @ref{151f,,abspath()} to make paths
absolute and remove “@code{..}” parts, whereas @ref{2fd,,PurePath.relative_to()}
is a lexical operation that raises @ref{2ec,,ValueError} when its inputs’
anchors differ (e.g. if one path is absolute and the other relative.)
}

@item

@ref{c08,,os.path.expanduser()}

@tab

@ref{1041,,Path.expanduser()} @footnote{
@ref{c08,,os.path.expanduser()} returns the path unchanged if the home
directory can’t be resolved, whereas @ref{1041,,Path.expanduser()} raises
@ref{244,,RuntimeError}.
}

@item

@ref{262,,os.path.realpath()}

@tab

@ref{1a6d,,Path.resolve()}

@item

@ref{151f,,os.path.abspath()}

@tab

@ref{1a26,,Path.absolute()} @footnote{
@ref{151f,,os.path.abspath()} removes “@code{..}” components without resolving
symlinks, which may change the meaning of the path, whereas
@ref{1a26,,Path.absolute()} leaves any “@code{..}” components in the path.
}

@item

@ref{c02,,os.path.exists()}

@tab

@ref{c0a,,Path.exists()}

@item

@ref{c05,,os.path.isfile()}

@tab

@ref{539,,Path.is_file()}

@item

@ref{c04,,os.path.isdir()}

@tab

@ref{53a,,Path.is_dir()}

@item

@ref{c00,,os.path.islink()}

@tab

@ref{c0c,,Path.is_symlink()}

@item

@ref{6c9,,os.path.isjunction()}

@tab

@ref{6d1,,Path.is_junction()}

@item

@ref{c06,,os.path.ismount()}

@tab

@ref{c0b,,Path.is_mount()}

@item

@ref{1170,,os.path.samefile()}

@tab

@ref{103f,,Path.samefile()}

@item

@ref{190a,,os.getcwd()}

@tab

@ref{1a9a,,Path.cwd()}

@item

@ref{26d,,os.stat()}

@tab

@ref{a24,,Path.stat()}

@item

@ref{6c7,,os.lstat()}

@tab

@ref{2c5f,,Path.lstat()}

@item

@ref{12ff,,os.listdir()}

@tab

@ref{26e,,Path.iterdir()}

@item

@ref{6cf,,os.walk()}

@tab

@ref{6ce,,Path.walk()} @footnote{
@ref{6cf,,os.walk()} always follows symlinks when categorizing paths into
`dirnames' and `filenames', whereas @ref{6ce,,Path.walk()} categorizes all
symlinks into `filenames' when `follow_symlinks' is false (the default.)
}

@item

@ref{52b,,os.mkdir()}, @ref{52c,,os.makedirs()}

@tab

@ref{1040,,Path.mkdir()}

@item

@ref{12f4,,os.link()}

@tab

@ref{a22,,Path.hardlink_to()}

@item

@ref{12f9,,os.symlink()}

@tab

@ref{a23,,Path.symlink_to()}

@item

@ref{b19,,os.readlink()}

@tab

@ref{b1a,,Path.readlink()}

@item

@ref{12f6,,os.rename()}

@tab

@ref{1893,,Path.rename()}

@item

@ref{12f7,,os.replace()}

@tab

@ref{2c67,,Path.replace()}

@item

@ref{12f5,,os.remove()}, @ref{12fa,,os.unlink()}

@tab

@ref{1dd2,,Path.unlink()}

@item

@ref{12f8,,os.rmdir()}

@tab

@ref{2c63,,Path.rmdir()}

@item

@ref{529,,os.chmod()}

@tab

@ref{a25,,Path.chmod()}

@item

@ref{528,,os.lchmod()}

@tab

@ref{2c69,,Path.lchmod()}

@end multitable


@node Protocols,,Comparison to the os and os path modules,pathlib — Object-oriented filesystem paths
@anchor{library/pathlib module-pathlib types}@anchor{a9}@anchor{library/pathlib protocols}@anchor{2c70}
@subsubsection Protocols


@geindex module; pathlib.types

The @code{pathlib.types} module provides types for static type checking.


Added in version 3.14.


@geindex PathInfo (pathlib.types 클래스)
@anchor{library/pathlib pathlib types PathInfo}@anchor{26c}
@deffn {클래스} pathlib.types.PathInfo

A @ref{569,,typing.Protocol} describing the
@ref{26b,,Path.info} attribute. Implementations may
return cached results from their methods.

@geindex exists() (pathlib.types.PathInfo 메서드)
@anchor{library/pathlib pathlib types PathInfo exists}@anchor{2c71}
@deffn {메서드} exists (*, follow_symlinks=True)

Return @code{True} if the path is an existing file or directory, or any
other kind of file; return @code{False} if the path doesn’t exist.

If `follow_symlinks' is @code{False}, return @code{True} for symlinks without
checking if their targets exist.
@end deffn

@geindex is_dir() (pathlib.types.PathInfo 메서드)
@anchor{library/pathlib pathlib types PathInfo is_dir}@anchor{2c72}
@deffn {메서드} is_dir (*, follow_symlinks=True)

Return @code{True} if the path is a directory, or a symbolic link pointing
to a directory; return @code{False} if the path is (or points to) any other
kind of file, or if it doesn’t exist.

If `follow_symlinks' is @code{False}, return @code{True} only if the path
is a directory (without following symlinks); return @code{False} if the
path is any other kind of file, or if it doesn’t exist.
@end deffn

@geindex is_file() (pathlib.types.PathInfo 메서드)
@anchor{library/pathlib pathlib types PathInfo is_file}@anchor{2c73}
@deffn {메서드} is_file (*, follow_symlinks=True)

Return @code{True} if the path is a file, or a symbolic link pointing to
a file; return @code{False} if the path is (or points to) a directory or
other non-file, or if it doesn’t exist.

If `follow_symlinks' is @code{False}, return @code{True} only if the path
is a file (without following symlinks); return @code{False} if the path
is a directory or other non-file, or if it doesn’t exist.
@end deffn

@geindex is_symlink() (pathlib.types.PathInfo 메서드)
@anchor{library/pathlib pathlib types PathInfo is_symlink}@anchor{2c74}
@deffn {메서드} is_symlink ()

Return @code{True} if the path is a symbolic link (even if broken); return
@code{False} if the path is a directory or any kind of file, or if it
doesn’t exist.
@end deffn
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node os path — 일반적인 경로명 조작,stat — stat 결과 해석하기,pathlib — Object-oriented filesystem paths,파일과 디렉터리 액세스
@anchor{library/os path doc}@anchor{2c75}@anchor{library/os path module-os path}@anchor{a6}@anchor{library/os path os-path-common-pathname-manipulations}@anchor{2c76}@anchor{library/os path translation-repo}@anchor{2c77}
@subsection @code{os.path} — 일반적인 경로명 조작


@geindex module; os.path

`소스 코드:' Lib/genericpath.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/genericpath.py}, Lib/posixpath.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/posixpath.py} (POSIX용) 및 Lib/ntpath.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/ntpath.py} (윈도우용)

@geindex 경로;연산


__________________________________________________________________


이 모듈은 경로명에 유용한 함수를 구현합니다. 파일을 읽거나 쓰려면 @ref{316,,open()}을 참조하고, 파일 시스템에 액세스하려면 @ref{a5,,os} 모듈을 참조하십시오. 경로 매개 변수는 문자열, 바이트열 또는 @ref{e4a,,os.PathLike} 프로토콜을 구현하는 모든 객체로 전달할 수 있습니다.

유닉스 셸과 달리, 파이썬은 어떤 `자동' 경로 확장도 수행하지 않습니다. @ref{c08,,expanduser()}와 @ref{15de,,expandvars()}와 같은 함수는 응용 프로그램이 셸과 같은 경로 확장을 원할 때 명시적으로 호출할 수 있습니다. (@ref{68,,glob} 모듈도 참조하십시오.)


@subsubheading 더 보기


@ref{a8,,pathlib} 모듈은 고수준의 경로 객체를 제공합니다.


@cartouche
@quotation 참고 
이 모든 함수는 매개 변수가 모두 바이트열 객체이거나 모두 문자열 객체인 것만 허락합니다. 경로나 파일 이름이 반환되면, 결과는 같은 형의 객체입니다.
@end quotation
@end cartouche

@cartouche
@quotation 참고 
Since different operating systems have different path name conventions, there
are several versions of this module in the standard library.  The
@code{os.path} module is always the path module suitable for the operating
system Python is running on, and therefore usable for local paths.  However,
you can also import and use the individual modules if you want to manipulate
a path that is `always' in one of the different formats.  They all have the
same interface:


@itemize *

@item 
@code{posixpath} for UNIX-style paths

@item 
@code{ntpath} for Windows paths
@end itemize
@end quotation
@end cartouche


버전 3.8에서 변경: @ref{c02,,exists()}, @ref{c03,,lexists()}, @ref{c04,,isdir()}, @ref{c05,,isfile()}, @ref{c00,,islink()} 및 @ref{c06,,ismount()}는 이제 OS 수준에서 표현할 수 없는 문자나 바이트를 포함하는 경로에 대해 예외를 발생시키는 대신 @code{False}를 반환합니다.


@geindex abspath() (os.path 모듈)
@anchor{library/os path os path abspath}@anchor{151f}
@deffn {함수} os.path.abspath (path)

Return a normalized absolutized version of the pathname `path'. On most
platforms, this is equivalent to calling @code{normpath(join(os.getcwd(), path))}.


@subsubheading 더 보기


@ref{19a9,,os.path.join()} and @ref{151e,,os.path.normpath()}.



버전 3.6에서 변경: @ref{5a0,,경로류 객체}를 받아들입니다.

@end deffn

@geindex basename() (os.path 모듈)
@anchor{library/os path os path basename}@anchor{2c6f}
@deffn {함수} os.path.basename (path, /)

경로명 `path'의 기본 이름을 반환합니다. 이것은 `path'를 함수 @ref{2c78,,split()}에 전달하여 반환된 쌍의 두 번째 요소입니다. 이 함수의 결과는 유닉스 @code{basename} 프로그램과 다름에 유의하십시오; @code{'/foo/bar/'}에 대해 @code{basename}은 @code{'bar'}를 반환하고, @ref{2c6f,,basename()} 함수는 빈 문자열(@code{'@w{'}})을 반환합니다.


버전 3.6에서 변경: @ref{5a0,,경로류 객체}를 받아들입니다.

@end deffn

@geindex commonpath() (os.path 모듈)
@anchor{library/os path os path commonpath}@anchor{103c}
@deffn {함수} os.path.commonpath (paths)

이터러블 `paths'에 있는 각 경로명의 가장 긴 공통 하위 경로(sub-path)를 반환합니다. `paths'에 절대 경로명과 상대 경로명이 모두 있거나, `paths'가 다른 드라이브에 있거나, `paths'가 비어 있으면 @ref{2ec,,ValueError}를 발생시킵니다. @ref{103d,,commonprefix()}와 달리, 유효한 경로를 반환합니다.


Added in version 3.5.



버전 3.6에서 변경: @ref{5a0,,경로류 객체}의 시퀀스를 받아들입니다.



버전 3.13에서 변경: Any iterable can now be passed, rather than just sequences.

@end deffn

@geindex commonprefix() (os.path 모듈)
@anchor{library/os path os path commonprefix}@anchor{103d}
@deffn {함수} os.path.commonprefix (list, /)

Return the longest string prefix (taken character-by-character) that is a
prefix of all strings in `list'.  If `list' is empty, return the empty string
(@code{'@w{'}}).

@cartouche
@quotation 경고 
This function may return invalid paths because it works a
character at a time.
If you need a `common path prefix', then the algorithm
implemented in this function is not secure. Use
@ref{103c,,commonpath()} for finding a common path prefix.

@example
>>> os.path.commonprefix(['/usr/lib', '/usr/local/lib'])
'/usr/l'

>>> os.path.commonpath(['/usr/lib', '/usr/local/lib'])
'/usr'
@end example
@end quotation
@end cartouche


버전 3.6에서 변경: @ref{5a0,,경로류 객체}를 받아들입니다.

@end deffn

@geindex dirname() (os.path 모듈)
@anchor{library/os path os path dirname}@anchor{2c6e}
@deffn {함수} os.path.dirname (path, /)

경로명 `path'의 디렉터리 이름을 반환합니다. 이것은 `path'를 함수 @ref{2c78,,split()}에 전달하여 반환된 쌍의 첫 번째 요소입니다.


버전 3.6에서 변경: @ref{5a0,,경로류 객체}를 받아들입니다.

@end deffn

@geindex exists() (os.path 모듈)
@anchor{library/os path os path exists}@anchor{c02}
@deffn {함수} os.path.exists (path)

`path'가 기존 경로나 열린 파일 기술자를 참조하면 @code{True}를 반환합니다. 깨진 심볼릭 링크에 대해서는 @code{False}를 반환합니다. 일부 플랫폼에서, `path'가 물리적으로 존재하더라도, 요청된 파일에 대해 @ref{26d,,os.stat()}을 실행할 권한이 없으면 이 함수는 @code{False}를 반환할 수 있습니다.


버전 3.3에서 변경: `path'는 이제 정수가 될 수 있습니다: 열린 파일 기술자이면 @code{True}가 반환되고, 그렇지 않으면 @code{False}가 반환됩니다.



버전 3.6에서 변경: @ref{5a0,,경로류 객체}를 받아들입니다.

@end deffn

@geindex lexists() (os.path 모듈)
@anchor{library/os path os path lexists}@anchor{c03}
@deffn {함수} os.path.lexists (path)

`path'가 깨진 심볼릭 링크를 포함하여 기존 경로를 참조하면 @code{True}를 반환합니다. @ref{6c7,,os.lstat()}이 없는 플랫폼에서 @ref{c02,,exists()}와 동등합니다.


버전 3.6에서 변경: @ref{5a0,,경로류 객체}를 받아들입니다.

@end deffn

@geindex ~ (물결표);홈 디렉터리 확장

@geindex expanduser() (os.path 모듈)
@anchor{library/os path os path expanduser}@anchor{c08}
@deffn {함수} os.path.expanduser (path)

유닉스와 윈도우에서, @code{~}나 @code{~user}의 초기 구성 요소가 해당 `사용자'의 홈 디렉터리로 치환된 인자를 반환합니다.

@geindex 모듈;pwd

유닉스에서, 초기 @code{~}는 환경 변수 
@geindex HOME
@geindex 환경 변수; HOME
@code{HOME}이 설정되어 있다면 그것으로 치환됩니다; 그렇지 않으면 현재 사용자의 홈 디렉터리가 내장 모듈 @ref{b7,,pwd}를 통해 비밀번호 디렉터리에서 조회됩니다. 초기 @code{~user}는 비밀번호 디렉터리에서 직접 조회됩니다.

윈도우에서, 
@geindex USERPROFILE
@geindex 환경 변수; USERPROFILE
@code{USERPROFILE}이 설정되었으면 이것이 사용됩니다, 그렇지 않으면 
@geindex HOMEPATH
@geindex 환경 변수; HOMEPATH
@code{HOMEPATH}와 
@geindex HOMEDRIVE
@geindex 환경 변수; HOMEDRIVE
@code{HOMEDRIVE}의 조합이 사용됩니다. 초기 @code{~user}는 현재 사용자의 홈 디렉터리의 마지막 디렉터리 구성 요소가 
@geindex USERNAME
@geindex 환경 변수; USERNAME
@code{USERNAME}과 일치하는지 확인하고, 일치하면 교체하는 방식으로 처리됩니다.

확장이 실패하거나 경로가 물결표로 시작하지 않으면, 경로는 변경되지 않은 상태로 반환됩니다.


버전 3.6에서 변경: @ref{5a0,,경로류 객체}를 받아들입니다.



버전 3.8에서 변경: 더는 윈도우에서 
@geindex HOME
@geindex 환경 변수; HOME
@code{HOME}을 사용하지 않습니다.

@end deffn

@geindex $ (달러);환경 변수 확장
@geindex % (퍼센트);환경 변수 확장 (윈도우)

@geindex expandvars() (os.path 모듈)
@anchor{library/os path os path expandvars}@anchor{15de}
@deffn {함수} os.path.expandvars (path)

환경 변수로 확장된 인자를 반환합니다. @code{$name}이나 @code{$@{name@}} 형식의 부분 문자열이 환경 변수 `name'의 값으로 치환됩니다. 잘못된 변수 이름과 존재하지 않는 변수에 대한 참조는 변경되지 않고 남습니다.

윈도우에서, @code{$name}과 @code{$@{name@}} 외에 @code{%name%} 확장이 지원됩니다.


버전 3.6에서 변경: @ref{5a0,,경로류 객체}를 받아들입니다.

@end deffn

@geindex getatime() (os.path 모듈)
@anchor{library/os path os path getatime}@anchor{2c79}
@deffn {함수} os.path.getatime (path, /)

`path'의 마지막 액세스 시간을 반환합니다. 반환 값은 에포크(epoch) 이후 초 수를 나타내는 부동 소수점 숫자입니다 (@ref{f4,,time} 모듈을 참조하십시오). 파일이 없거나 액세스할 수 없으면 @ref{2c0,,OSError}를 발생시킵니다.
@end deffn

@geindex getmtime() (os.path 모듈)
@anchor{library/os path os path getmtime}@anchor{2c7a}
@deffn {함수} os.path.getmtime (path, /)

`path'를 마지막으로 수정한 시간을 반환합니다. 반환 값은 에포크(epoch) 이후 초 수를 나타내는 부동 소수점 숫자입니다 (@ref{f4,,time} 모듈을 참조하십시오). 파일이 없거나 액세스할 수 없으면 @ref{2c0,,OSError}를 발생시킵니다.


버전 3.6에서 변경: @ref{5a0,,경로류 객체}를 받아들입니다.

@end deffn

@geindex getctime() (os.path 모듈)
@anchor{library/os path os path getctime}@anchor{2c7b}
@deffn {함수} os.path.getctime (path, /)

시스템의 ctime을 반환하는데, 일부 시스템(가령 유닉스)에서는 마지막 메타 데이터 변경 시간이고, 다른 시스템(가령 윈도우)에서는 `path' 생성 시간입니다. 반환 값은 에포크(epoch) 이후 초 수를 나타내는 부동 소수점 숫자입니다 (@ref{f4,,time} 모듈을 참조하십시오). 파일이 없거나 액세스할 수 없으면 @ref{2c0,,OSError}를 발생시킵니다.


버전 3.6에서 변경: @ref{5a0,,경로류 객체}를 받아들입니다.

@end deffn

@geindex getsize() (os.path 모듈)
@anchor{library/os path os path getsize}@anchor{2c7c}
@deffn {함수} os.path.getsize (path, /)

`path'의 크기를 바이트 단위로 반환합니다. 파일이 없거나 액세스할 수 없으면 @ref{2c0,,OSError}를 발생시킵니다.


버전 3.6에서 변경: @ref{5a0,,경로류 객체}를 받아들입니다.

@end deffn

@geindex isabs() (os.path 모듈)
@anchor{library/os path os path isabs}@anchor{531}
@deffn {함수} os.path.isabs (path, /)

`path'가 절대 경로명이면 @code{True}를 반환합니다. 유닉스에서는 슬래시로 시작하고, 윈도우에서는 두 개의 (역)슬래시나 드라이브 문자, 콜론 및 (역)슬래시를 합친 것으로 시작함을 의미합니다.


@subsubheading 더 보기


@ref{151f,,abspath()}



버전 3.6에서 변경: @ref{5a0,,경로류 객체}를 받아들입니다.



버전 3.13에서 변경: On Windows, returns @code{False} if the given path starts with exactly one
(back)slash.

@end deffn

@geindex isfile() (os.path 모듈)
@anchor{library/os path os path isfile}@anchor{c05}
@deffn {함수} os.path.isfile (path)

`path'가 @ref{c02,,존재하는} 일반 파일이면 @code{True}를 반환합니다. 이것은 심볼릭 링크를 따르므로, 같은 경로에 대해 @ref{c00,,islink()}와 @ref{c05,,isfile()}이 모두 참일 수 있습니다.


버전 3.6에서 변경: @ref{5a0,,경로류 객체}를 받아들입니다.

@end deffn

@geindex isdir() (os.path 모듈)
@anchor{library/os path os path isdir}@anchor{c04}
@deffn {함수} os.path.isdir (path, /)

`path'가 @ref{c02,,존재하는} 디렉터리이면 @code{True}를 반환합니다. 이것은 심볼릭 링크를 따르므로, 같은 경로에 대해 @ref{c00,,islink()}와 @ref{c04,,isdir()}이 모두 참일 수 있습니다.


버전 3.6에서 변경: @ref{5a0,,경로류 객체}를 받아들입니다.

@end deffn

@geindex isjunction() (os.path 모듈)
@anchor{library/os path os path isjunction}@anchor{6c9}
@deffn {함수} os.path.isjunction (path)

`path'가 정션(junction)인 @ref{c03,,존재하는} 디렉터리 항목을 가리키면 @code{True}를 반환합니다. 현재 플랫폼에서 정션을 지원하지 않으면 항상 @code{False}를 반환합니다.


Added in version 3.12.

@end deffn

@geindex islink() (os.path 모듈)
@anchor{library/os path os path islink}@anchor{c00}
@deffn {함수} os.path.islink (path)

`path'가 심볼릭 링크인 @ref{c02,,존재하는} 디렉터리 항목을 가리키면 @code{True}를 반환합니다. 파이썬 런타임에서 심볼릭 링크를 지원하지 않으면 항상 @code{False}입니다.


버전 3.6에서 변경: @ref{5a0,,경로류 객체}를 받아들입니다.

@end deffn

@geindex ismount() (os.path 모듈)
@anchor{library/os path os path ismount}@anchor{c06}
@deffn {함수} os.path.ismount (path)

Return @code{True} if pathname `path' is a `mount point': a point in a
file system where a different file system has been mounted.  On POSIX, the
function checks whether `path'’s parent, @code{`path'/..}, is on a different
device than `path', or whether @code{`path'/..} and `path' point to the same
i-node on the same device — this should detect mount points for all Unix
and POSIX variants.  It is not able to reliably detect bind mounts on the
same filesystem. On Linux systems, it will always return @code{True} for btrfs
subvolumes, even if they aren’t mount points. On Windows, a drive letter root
and a share UNC are always mount points, and for any other path
@code{GetVolumePathName} is called to see if it is different from the input path.


버전 3.4에서 변경: 윈도우에서 비 루트 마운트 지점 감지 지원을 추가했습니다.



버전 3.6에서 변경: @ref{5a0,,경로류 객체}를 받아들입니다.

@end deffn

@geindex isdevdrive() (os.path 모듈)
@anchor{library/os path os path isdevdrive}@anchor{19c2}
@deffn {함수} os.path.isdevdrive (path)

Return @code{True} if pathname `path' is located on a Windows Dev Drive.
A Dev Drive is optimized for developer scenarios, and offers faster
performance for reading and writing files. It is recommended for use for
source code, temporary build directories, package caches, and other
IO-intensive operations.

May raise an error for an invalid path, for example, one without a
recognizable drive, but returns @code{False} on platforms that do not support
Dev Drives. See the Windows documentation@footnote{https://learn.microsoft.com/windows/dev-drive/}
for information on enabling and creating Dev Drives.


Added in version 3.12.



버전 3.13에서 변경: The function is now available on all platforms, and will always return @code{False} on those that have no support for Dev Drives

@end deffn

@geindex isreserved() (os.path 모듈)
@anchor{library/os path os path isreserved}@anchor{32b}
@deffn {함수} os.path.isreserved (path)

Return @code{True} if `path' is a reserved pathname on the current system.

On Windows, reserved filenames include those that end with a space or dot;
those that contain colons (i.e. file streams such as “name:stream”),
wildcard characters (i.e. @code{'*?"<>'}), pipe, or ASCII control characters;
as well as DOS device names such as “NUL”, “CON”, “CONIN$”, “CONOUT$”,
“AUX”, “PRN”, “COM1”, and “LPT1”.

@cartouche
@quotation 참고 
This function approximates rules for reserved paths on most Windows
systems. These rules change over time in various Windows releases.
This function may be updated in future Python releases as changes to
the rules become broadly available.
@end quotation
@end cartouche

@ref{213c,,가용성}: Windows.


Added in version 3.13.

@end deffn

@geindex join() (os.path 모듈)
@anchor{library/os path os path join}@anchor{19a9}
@deffn {함수} os.path.join (path, /, *paths)

Join one or more path segments intelligently.  The return value is the
concatenation of `path' and all members of `*paths', with exactly one
directory separator following each non-empty part, except the last. That is,
the result will only end in a separator if the last part is either empty or
ends in a separator.

If a segment is an absolute path (which on Windows requires both a drive and
a root), then all previous segments are ignored and joining continues from the
absolute path segment. On Linux, for example:

@example
>>> os.path.join('/home/foo', 'bar')
'/home/foo/bar'
>>> os.path.join('/home/foo', '/home/bar')
'/home/bar'
@end example

On Windows, the drive is not reset when a rooted path segment (e.g.,
@code{r'\foo'}) is encountered. If a segment is on a different drive or is an
absolute path, all previous segments are ignored and the drive is reset. For
example:

@example
>>> os.path.join('c:\\', 'foo')
'c:\\foo'
>>> os.path.join('c:\\foo', 'd:\\bar')
'd:\\bar'
@end example

Note that since there is a current directory for each drive,
@code{os.path.join("c:", "foo")} represents a path relative to the current
directory on drive @code{C:} (@code{c:foo}), not @code{c:\foo}.


버전 3.6에서 변경: `path'와 `paths'에 대해 @ref{5a0,,경로류 객체}를 받아들입니다.

@end deffn

@geindex normcase() (os.path 모듈)
@anchor{library/os path os path normcase}@anchor{2c7d}
@deffn {함수} os.path.normcase (path, /)

경로명의 대소 문자를 정규화합니다. 윈도우에서는, 경로명의 모든 문자를 소문자로 변환하고, 슬래시도 역 슬래시로 변환합니다. 다른 운영 체제에서는, 경로를 변경하지 않고 반환합니다.


버전 3.6에서 변경: @ref{5a0,,경로류 객체}를 받아들입니다.

@end deffn

@geindex normpath() (os.path 모듈)
@anchor{library/os path os path normpath}@anchor{151e}
@deffn {함수} os.path.normpath (path)

중복된 구분자와 상위 수준 참조를 접어 경로명을 정규화합니다. 그래서 @code{A//B}, @code{A/B/}, @code{A/./B} 및 @code{A/foo/../B}가 모두 @code{A/B}가 됩니다. 이 문자열 조작은 심볼릭 링크가 포함된 경로의 의미를 변경할 수 있습니다. 윈도우에서는, 슬래시를 역 슬래시로 변환합니다. 대소 문자를 정규화하려면, @ref{2c7d,,normcase()}를 사용하십시오.

@cartouche
@quotation 참고 
On POSIX systems, in accordance with IEEE Std 1003.1 2013 Edition; 4.13 Pathname Resolution@footnote{https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap04.html#tag_04_13},
if a pathname begins with exactly two slashes, the first component
following the leading characters may be interpreted in an implementation-defined
manner, although more than two leading characters shall be treated as a
single character.
@end quotation
@end cartouche


버전 3.6에서 변경: @ref{5a0,,경로류 객체}를 받아들입니다.

@end deffn

@geindex realpath() (os.path 모듈)
@anchor{library/os path os path realpath}@anchor{262}
@deffn {함수} os.path.realpath (path, /, *, strict=False)

(운영 체제에서 지원한다면) 경로에서 발견된 심볼릭 링크를 제거해서 지정된 파일명의 규범적(canonical) 경로를 반환합니다. 윈도우에서, 이 함수는 또한 @code{C:\\PROGRA~1}와 같은 MS-DOS (8.3 이라고도 합니다) 스타일 이름을 @code{C:\\Program Files}로 해석합니다.

By default, the path is evaluated up to the first component that does not
exist, is a symlink loop, or whose evaluation raises @ref{2c0,,OSError}.
All such components are appended unchanged to the existing part of the path.

Some errors that are handled this way include “access denied”, “not a
directory”, or “bad argument to internal function”. Thus, the
resulting path may be missing or inaccessible, may still contain
links or loops, and may traverse non-directories.

This behavior can be modified by keyword arguments:

If `strict' is @code{True}, the first error encountered when evaluating the path is
re-raised.
In particular, @ref{264,,FileNotFoundError} is raised if `path' does not exist,
or another @ref{2c0,,OSError} if it is otherwise inaccessible.

If `strict' is @ref{263,,os.path.ALLOW_MISSING}, errors other than
@ref{264,,FileNotFoundError} are re-raised (as with @code{strict=True}).
Thus, the returned path will not contain any symbolic links, but the named
file and some of its parent directories may be missing.

@cartouche
@quotation 참고 
This function emulates the operating system’s procedure for making a path
canonical, which differs slightly between Windows and UNIX with respect
to how links and subsequent path components interact.

Operating system APIs make paths canonical as needed, so it’s not
normally necessary to call this function.
@end quotation
@end cartouche


버전 3.6에서 변경: @ref{5a0,,경로류 객체}를 받아들입니다.



버전 3.8에서 변경: 윈도우에서 심볼릭 링크와 정션(junctions)이 이제 해석됩니다.



버전 3.10에서 변경: The `strict' parameter was added.



버전 3.14에서 변경: The @ref{263,,ALLOW_MISSING} value for the `strict' parameter
was added.

@end deffn

@geindex ALLOW_MISSING (os.path 모듈)
@anchor{library/os path os path ALLOW_MISSING}@anchor{263}
@deffn {데이터} os.path.ALLOW_MISSING

Special value used for the `strict' argument in @ref{262,,realpath()}.


Added in version 3.14.

@end deffn

@geindex relpath() (os.path 모듈)
@anchor{library/os path os path relpath}@anchor{6d0}
@deffn {함수} os.path.relpath (path, start=os.curdir)

현재 디렉터리나 선택적 `start' 디렉터리로부터 `path'로의 상대 파일 경로를 반환합니다. 이것은 경로 계산입니다: `path'나 `start'의 존재나 특성을 확인하기 위해 파일 시스템을 액세스하지 않습니다. 윈도우에서, `path'와 `start'가 다른 드라이브에 있을 때 @ref{2ec,,ValueError}가 발생합니다.

`start'의 기본값은 @ref{2c7e,,os.curdir}입니다.


버전 3.6에서 변경: @ref{5a0,,경로류 객체}를 받아들입니다.

@end deffn

@geindex samefile() (os.path 모듈)
@anchor{library/os path os path samefile}@anchor{1170}
@deffn {함수} os.path.samefile (path1, path2, /)

두 경로명 인자가 같은 파일이나 디렉터리를 가리키면 @code{True}를 반환합니다. 장치 번호와 i-노드 번호로 결정하며 경로명 중 어느 하나에 대해 @ref{26d,,os.stat()} 호출이 실패하면 예외를 발생시킵니다.


버전 3.2에서 변경: 윈도우 지원이 추가되었습니다.



버전 3.4에서 변경: 윈도우는 이제 다른 모든 플랫폼과 같은 구현을 사용합니다.



버전 3.6에서 변경: @ref{5a0,,경로류 객체}를 받아들입니다.

@end deffn

@geindex sameopenfile() (os.path 모듈)
@anchor{library/os path os path sameopenfile}@anchor{2c7f}
@deffn {함수} os.path.sameopenfile (fp1, fp2)

파일 기술자 `fp1'과 `fp2'가 같은 파일을 가리키면 @code{True}를 반환합니다.


버전 3.2에서 변경: 윈도우 지원이 추가되었습니다.



버전 3.6에서 변경: @ref{5a0,,경로류 객체}를 받아들입니다.

@end deffn

@geindex samestat() (os.path 모듈)
@anchor{library/os path os path samestat}@anchor{116f}
@deffn {함수} os.path.samestat (stat1, stat2, /)

stat 튜플 `stat1'과 `stat2'가 같은 파일을 가리키면 @code{True}를 반환합니다. 이러한 구조는 @ref{f8b,,os.fstat()}, @ref{6c7,,os.lstat()} 또는 @ref{26d,,os.stat()}에 의해 반환되었을 수 있습니다. 이 함수는 @ref{1170,,samefile()}과 @ref{2c7f,,sameopenfile()}에서 사용하는 하부 비교를 구현합니다.


버전 3.4에서 변경: 윈도우 지원이 추가되었습니다.

@end deffn

@geindex split() (os.path 모듈)
@anchor{library/os path os path split}@anchor{2c78}
@deffn {함수} os.path.split (path, /)

Split the pathname `path' into a pair, @code{(head, tail)} where `tail' is the
last pathname component and `head' is everything leading up to that.  The
`tail' part will never contain a slash; if `path' ends in a slash, `tail'
will be empty.  If there is no slash in `path', `head' will be empty.  If
`path' is empty, both `head' and `tail' are empty.  Trailing slashes are
stripped from `head' unless it is the root (one or more slashes only).  In
all cases, @code{join(head, tail)} returns a path to the same location as `path'
(but the strings may differ).  Also see the functions @ref{19a9,,join()},
@ref{2c6e,,dirname()} and @ref{2c6f,,basename()}.


버전 3.6에서 변경: @ref{5a0,,경로류 객체}를 받아들입니다.

@end deffn

@geindex splitdrive() (os.path 모듈)
@anchor{library/os path os path splitdrive}@anchor{dee}
@deffn {함수} os.path.splitdrive (path, /)

경로명 `path'를 쌍 @code{(drive, tail)}로 분할합니다. 여기서 `drive'는 마운트 지점이나 빈 문자열입니다. 드라이브 지정을 사용하지 않는 시스템에서 `drive'는 항상 빈 문자열입니다. 모든 경우에, @code{drive + tail}은 `path'와 같습니다.

윈도우에서는, 경로명을 드라이브/UNC 공유 지점과 상대 경로로 분할합니다.

경로에 드라이브 문자가 포함되면, drive는 콜론까지의 콜론을 포함하는 모든 것을 포함합니다:

@example
>>> splitdrive("c:/dir")
("c:", "/dir")
@end example

경로에 UNC 경로가 포함되면, drive는 호스트 이름과 공유를 포함합니다:

@example
>>> splitdrive("//host/computer/dir")
("//host/computer", "/dir")
@end example


버전 3.6에서 변경: @ref{5a0,,경로류 객체}를 받아들입니다.

@end deffn

@geindex splitroot() (os.path 모듈)
@anchor{library/os path os path splitroot}@anchor{6ca}
@deffn {함수} os.path.splitroot (path, /)

경로명 `path'를 3항 튜플 @code{(drive, root, tail)}로 분할합니다. 여기서 `drive'는 장치 이름이나 마운트 지점, `root'는 드라이브 뒤에 오는 구분자 문자열, `tail'은 루트 뒤의 모든 것입니다. 이 항목들 모두 빈 문자열일 수 있습니다. 모든 경우에, @code{drive + root + tail}은 `path'와 같습니다.

On POSIX systems, `drive' is always empty. The `root' may be empty (if `path' is
relative), a single forward slash (if `path' is absolute), or two forward slashes
(implementation-defined per IEEE Std 1003.1-2017; 4.13 Pathname Resolution@footnote{https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap04.html#tag_04_13}.)
For example:

@example
>>> splitroot('/home/sam')
('@w{'}, '/', 'home/sam')
>>> splitroot('//home/sam')
('@w{'}, '//', 'home/sam')
>>> splitroot('///home/sam')
('@w{'}, '/', '//home/sam')
@end example

On Windows, `drive' may be empty, a drive-letter name, a UNC share, or a device
name. The `root' may be empty, a forward slash, or a backward slash. For
example:

@example
>>> splitroot('C:/Users/Sam')
('C:', '/', 'Users/Sam')
>>> splitroot('//Server/Share/Users/Sam')
('//Server/Share', '/', 'Users/Sam')
@end example


Added in version 3.12.

@end deffn

@geindex splitext() (os.path 모듈)
@anchor{library/os path os path splitext}@anchor{195a}
@deffn {함수} os.path.splitext (path, /)

경로명 `path'를 @code{root + ext == path}가 되도록 쌍 @code{(root, ext)}로 분할하는데, 확장자 `ext'는 비어 있거나 마침표로 시작하고 최대 하나의 마침표를 포함합니다.

If the path contains no extension, `ext' will be @code{'@w{'}}:

@example
>>> splitext('bar')
('bar', '@w{'})
@end example

If the path contains an extension, then `ext' will be set to this extension,
including the leading period. Note that previous periods will be ignored:

@example
>>> splitext('foo.bar.exe')
('foo.bar', '.exe')
>>> splitext('/foo/bar.exe')
('/foo/bar', '.exe')
@end example

Leading periods of the last component of the path are considered to
be part of the root:

@example
>>> splitext('.cshrc')
('.cshrc', '@w{'})
>>> splitext('/foo/....jpg')
('/foo/....jpg', '@w{'})
@end example


버전 3.6에서 변경: @ref{5a0,,경로류 객체}를 받아들입니다.

@end deffn

@geindex supports_unicode_filenames (os.path 모듈)
@anchor{library/os path os path supports_unicode_filenames}@anchor{1693}
@deffn {데이터} os.path.supports_unicode_filenames

(파일 시스템에 의해 부과된 제한 내에서) 임의의 유니코드 문자열을 파일 이름으로 사용할 수 있으면 @code{True}.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node stat — stat 결과 해석하기,filecmp — 파일과 디렉터리 비교,os path — 일반적인 경로명 조작,파일과 디렉터리 액세스
@anchor{library/stat doc}@anchor{2c80}@anchor{library/stat module-stat}@anchor{d6}@anchor{library/stat stat-interpreting-stat-results}@anchor{2c81}@anchor{library/stat translation-repo}@anchor{2c82}
@subsection @code{stat} — @code{stat()} 결과 해석하기


@geindex module; stat

`소스 코드:' Lib/stat.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/stat.py}


__________________________________________________________________


The @code{stat} module defines constants and functions for interpreting the
results of @ref{26d,,os.stat()}, @ref{f8b,,os.fstat()} and @ref{6c7,,os.lstat()} (if they
exist).  For complete details about the @code{stat()}, @code{fstat()} and
@code{lstat()} calls, consult the documentation for your system.


버전 3.4에서 변경: stat 모듈은 C 구현으로 지원됩니다.


The @code{stat} module defines the following functions to test for specific file
types:

@geindex S_ISDIR() (stat 모듈)
@anchor{library/stat stat S_ISDIR}@anchor{2c83}
@deffn {함수} stat.S_ISDIR (mode)

mode가 디렉터리로부터 왔으면 0이 아닌 값을 반환합니다.
@end deffn

@geindex S_ISCHR() (stat 모듈)
@anchor{library/stat stat S_ISCHR}@anchor{2c84}
@deffn {함수} stat.S_ISCHR (mode)

mode가 문자 특수 장치(character special device) 파일로부터 왔으면 0이 아닌 값을 반환합니다.
@end deffn

@geindex S_ISBLK() (stat 모듈)
@anchor{library/stat stat S_ISBLK}@anchor{2c85}
@deffn {함수} stat.S_ISBLK (mode)

mode가 블록 특수 장치(block special device) 파일로부터 왔으면 0이 아닌 값을 반환합니다.
@end deffn

@geindex S_ISREG() (stat 모듈)
@anchor{library/stat stat S_ISREG}@anchor{2c86}
@deffn {함수} stat.S_ISREG (mode)

mode가 일반 파일로부터 왔으면 0이 아닌 값을 반환합니다.
@end deffn

@geindex S_ISFIFO() (stat 모듈)
@anchor{library/stat stat S_ISFIFO}@anchor{2c87}
@deffn {함수} stat.S_ISFIFO (mode)

mode가 FIFO(네임드 파이프)로부터 왔으면 0이 아닌 값을 반환합니다.
@end deffn

@geindex S_ISLNK() (stat 모듈)
@anchor{library/stat stat S_ISLNK}@anchor{2c88}
@deffn {함수} stat.S_ISLNK (mode)

mode가 심볼릭 링크로부터 왔으면 0이 아닌 값을 반환합니다.
@end deffn

@geindex S_ISSOCK() (stat 모듈)
@anchor{library/stat stat S_ISSOCK}@anchor{2c89}
@deffn {함수} stat.S_ISSOCK (mode)

mode가 소켓으로부터 왔으면 0이 아닌 값을 반환합니다.
@end deffn

@geindex S_ISDOOR() (stat 모듈)
@anchor{library/stat stat S_ISDOOR}@anchor{1da8}
@deffn {함수} stat.S_ISDOOR (mode)

mode가 door로부터 왔으면 0이 아닌 값을 반환합니다.


Added in version 3.4.

@end deffn

@geindex S_ISPORT() (stat 모듈)
@anchor{library/stat stat S_ISPORT}@anchor{1da9}
@deffn {함수} stat.S_ISPORT (mode)

mode가 이벤트 포트(event port)로부터 왔으면 0이 아닌 값을 반환합니다.


Added in version 3.4.

@end deffn

@geindex S_ISWHT() (stat 모듈)
@anchor{library/stat stat S_ISWHT}@anchor{1daa}
@deffn {함수} stat.S_ISWHT (mode)

mode가 화이트 아웃(whiteout)으로부터 왔으면 0이 아닌 값을 반환합니다.


Added in version 3.4.

@end deffn

파일의 모드(mode)를 보다 일반적으로 조작하기 위한 두 가지 추가 함수가 정의됩니다:

@geindex S_IMODE() (stat 모듈)
@anchor{library/stat stat S_IMODE}@anchor{2c8a}
@deffn {함수} stat.S_IMODE (mode)

@ref{529,,os.chmod()}로 설정할 수 있는 파일 모드 부분을 반환합니다 —즉, 파일의 권한(permission) 비트, 끈끈한(sticky) 비트, set-group-id 및 set-user-id 비트 (지원하는 시스템에서).
@end deffn

@geindex S_IFMT() (stat 모듈)
@anchor{library/stat stat S_IFMT}@anchor{2c8b}
@deffn {함수} stat.S_IFMT (mode)

파일 유형을 기술하는 파일 모드 부분을 반환합니다 (위의 @code{S_IS*()} 함수에서 사용됩니다).
@end deffn

일반적으로, 파일 유형을 검사하는 데 @code{os.path.is*()} 함수를 사용합니다; 이 함수들은 같은 파일에 대해 여러 개의 검사를 수행하고, 검사마다 @code{stat()} 시스템 호출 하는 오버헤드를 피하려고 할 때 유용합니다. 또한, 블록과 문자 장치 검사와 같이, @ref{a6,,os.path}에서 처리되지 않는 파일에 대한 정보를 확인할 때 유용합니다.

예제:

@example
import os, sys
from stat import *

def walktree(top, callback):
    '@w{'}'top에 뿌리를 둔 디렉터리 트리를 재귀적으로 탐색해 내려가면서,
       각 일반 파일에 대해 콜백 함수를 호출합니다'@w{'}'

    for f in os.listdir(top):
        pathname = os.path.join(top, f)
        mode = os.lstat(pathname).st_mode
        if S_ISDIR(mode):
            # 디렉터리입니다, 재귀적으로 내려갑니다
            walktree(pathname, callback)
        elif S_ISREG(mode):
            # 파일입니다, 콜백 함수를 호출합니다.
            callback(pathname)
        else:
            # 알 수 없는 파일 유형입니다, 메시지를 인쇄합니다
            print('Skipping %s' % pathname)

def visitfile(file):
    print('visiting', file)

if __name__ == '__main__':
    walktree(sys.argv[1], visitfile)
@end example

파일의 모드를 사람이 읽을 수 있는 문자열로 변환하기 위한 추가 유틸리티 함수가 제공됩니다:

@geindex filemode() (stat 모듈)
@anchor{library/stat stat filemode}@anchor{1350}
@deffn {함수} stat.filemode (mode)

파일의 mode를 ‘-rwxrwxrwx’ 형식의 문자열로 변환합니다.


Added in version 3.3.



버전 3.4에서 변경: 이 함수는 @ref{11ba,,S_IFDOOR}, @ref{11bb,,S_IFPORT} 및 @ref{11bc,,S_IFWHT}를 지원합니다.

@end deffn

아래의 모든 변수는 단순히 @ref{26d,,os.stat()}, @ref{f8b,,os.fstat()} 또는 @ref{6c7,,os.lstat()}에 의해 반환된 10-튜플에 대한 기호 인덱스입니다.

@geindex ST_MODE (stat 모듈)
@anchor{library/stat stat ST_MODE}@anchor{11b9}
@deffn {데이터} stat.ST_MODE

아이 노드(inode) 보호 모드.
@end deffn

@geindex ST_INO (stat 모듈)
@anchor{library/stat stat ST_INO}@anchor{2c8c}
@deffn {데이터} stat.ST_INO

아이 노드(inode) 번호.
@end deffn

@geindex ST_DEV (stat 모듈)
@anchor{library/stat stat ST_DEV}@anchor{2c8d}
@deffn {데이터} stat.ST_DEV

아이 노드(inode)가 위치한 장치.
@end deffn

@geindex ST_NLINK (stat 모듈)
@anchor{library/stat stat ST_NLINK}@anchor{2c8e}
@deffn {데이터} stat.ST_NLINK

아이 노드(inode)에 대한 링크 수.
@end deffn

@geindex ST_UID (stat 모듈)
@anchor{library/stat stat ST_UID}@anchor{2c8f}
@deffn {데이터} stat.ST_UID

소유자의 사용자 id.
@end deffn

@geindex ST_GID (stat 모듈)
@anchor{library/stat stat ST_GID}@anchor{2c90}
@deffn {데이터} stat.ST_GID

소유자의 그룹 id.
@end deffn

@geindex ST_SIZE (stat 모듈)
@anchor{library/stat stat ST_SIZE}@anchor{2c91}
@deffn {데이터} stat.ST_SIZE

일반 파일의 크기(바이트); 일부 특수 파일에서는 대기중인 데이터의 양.
@end deffn

@geindex ST_ATIME (stat 모듈)
@anchor{library/stat stat ST_ATIME}@anchor{2c92}
@deffn {데이터} stat.ST_ATIME

마지막 액세스 시간.
@end deffn

@geindex ST_MTIME (stat 모듈)
@anchor{library/stat stat ST_MTIME}@anchor{2c93}
@deffn {데이터} stat.ST_MTIME

마지막 수정 시간.
@end deffn

@geindex ST_CTIME (stat 모듈)
@anchor{library/stat stat ST_CTIME}@anchor{2c94}
@deffn {데이터} stat.ST_CTIME

운영 체제에서 보고한 “ctime”. (유닉스와 같은) 일부 시스템에서는 마지막 메타 데이터 변경 시간이고, (윈도우와 같은) 다른 시스템에서는 생성 시간입니다 (자세한 내용은 플랫폼 설명서를 참조하십시오).
@end deffn

“파일 크기”의 해석은 파일 유형에 따라 달라집니다. 일반 파일에서는 바이트로 표현한 파일의 크기입니다. 대부분의 유닉스(특히 리눅스를 포함하는)의 FIFO와 소켓에서, “크기”는 @ref{26d,,os.stat()}, @ref{f8b,,os.fstat()} 또는 @ref{6c7,,os.lstat()}를 호출한 시점에 읽기 대기 중인 바이트 수입니다; 이것은 때때로, 특히 비 블로킹으로 연 후에 이러한 특수 파일 중 하나를 폴링할 때 유용할 수 있습니다. 다른 문자와 블록 장치에서 크기 필드의 의미는 하부 시스템 호출의 구현에 따라 더 다양합니다.

아래의 변수는 @ref{11b9,,ST_MODE} 필드에서 사용되는 플래그를 정의합니다.

첫 번째 플래그 집합을 사용하는 것보다 위의 함수를 사용하는 것이 더 이식성 있습니다:

@geindex S_IFSOCK (stat 모듈)
@anchor{library/stat stat S_IFSOCK}@anchor{2c95}
@deffn {데이터} stat.S_IFSOCK

소켓.
@end deffn

@geindex S_IFLNK (stat 모듈)
@anchor{library/stat stat S_IFLNK}@anchor{2c96}
@deffn {데이터} stat.S_IFLNK

심볼릭 링크.
@end deffn

@geindex S_IFREG (stat 모듈)
@anchor{library/stat stat S_IFREG}@anchor{2c97}
@deffn {데이터} stat.S_IFREG

일반 파일.
@end deffn

@geindex S_IFBLK (stat 모듈)
@anchor{library/stat stat S_IFBLK}@anchor{2c98}
@deffn {데이터} stat.S_IFBLK

블록 장치.
@end deffn

@geindex S_IFDIR (stat 모듈)
@anchor{library/stat stat S_IFDIR}@anchor{2c99}
@deffn {데이터} stat.S_IFDIR

디렉터리.
@end deffn

@geindex S_IFCHR (stat 모듈)
@anchor{library/stat stat S_IFCHR}@anchor{2c9a}
@deffn {데이터} stat.S_IFCHR

문자 장치.
@end deffn

@geindex S_IFIFO (stat 모듈)
@anchor{library/stat stat S_IFIFO}@anchor{2c9b}
@deffn {데이터} stat.S_IFIFO

FIFO.
@end deffn

@geindex S_IFDOOR (stat 모듈)
@anchor{library/stat stat S_IFDOOR}@anchor{11ba}
@deffn {데이터} stat.S_IFDOOR

Door.


Added in version 3.4.

@end deffn

@geindex S_IFPORT (stat 모듈)
@anchor{library/stat stat S_IFPORT}@anchor{11bb}
@deffn {데이터} stat.S_IFPORT

이벤트 포트.


Added in version 3.4.

@end deffn

@geindex S_IFWHT (stat 모듈)
@anchor{library/stat stat S_IFWHT}@anchor{11bc}
@deffn {데이터} stat.S_IFWHT

화이트 아웃(whiteout).


Added in version 3.4.

@end deffn

@cartouche
@quotation 참고 
플랫폼이 파일 유형을 지원하지 않으면, @ref{11ba,,S_IFDOOR}, @ref{11bb,,S_IFPORT} 또는 @ref{11bc,,S_IFWHT}는 0으로 정의됩니다.
@end quotation
@end cartouche

다음 플래그는 @ref{529,,os.chmod()}의 `mode' 인자에서도 사용할 수 있습니다:

@geindex S_ISUID (stat 모듈)
@anchor{library/stat stat S_ISUID}@anchor{2c9c}
@deffn {데이터} stat.S_ISUID

Set-user-ID 비트.
@end deffn

@geindex S_ISGID (stat 모듈)
@anchor{library/stat stat S_ISGID}@anchor{2c9d}
@deffn {데이터} stat.S_ISGID

Set-group-ID 비트. 이 비트는 몇 가지 특별한 용도로 사용됩니다. 디렉터리에서는 그 디렉터리가 BSD의 의미가 있음을 나타냅니다: 여기에 만들어진 파일은 만드는 프로세스의 유효 그룹 ID가 아니라 디렉터리에서 그룹 ID를 상속받고, @ref{2c9d,,S_ISGID} 비트 설정도 얻습니다. 그룹 실행 비트(@ref{2c9e,,S_IXGRP})가 설정되지 않은 파일의 경우, set-group-ID 비트는 필수 파일/레코드 잠금을 나타냅니다 (@ref{2c9f,,S_ENFMT}도 참조하십시오).
@end deffn

@geindex S_ISVTX (stat 모듈)
@anchor{library/stat stat S_ISVTX}@anchor{2ca0}
@deffn {데이터} stat.S_ISVTX

끈끈한(sticky) 비트. 이 비트가 디렉터리에 설정되면, 해당 디렉터리의 파일은 파일의 소유자, 디렉터리의 소유자 또는 권한 있는(privileged) 프로세스에 의해서만 이름이 바뀌거나 삭제될 수 있음을 의미합니다.
@end deffn

@geindex S_IRWXU (stat 모듈)
@anchor{library/stat stat S_IRWXU}@anchor{2ca1}
@deffn {데이터} stat.S_IRWXU

파일 소유자 권한(permission) 마스크.
@end deffn

@geindex S_IRUSR (stat 모듈)
@anchor{library/stat stat S_IRUSR}@anchor{2ca2}
@deffn {데이터} stat.S_IRUSR

소유자에게 읽기 권한이 있습니다.
@end deffn

@geindex S_IWUSR (stat 모듈)
@anchor{library/stat stat S_IWUSR}@anchor{2ca3}
@deffn {데이터} stat.S_IWUSR

소유자에게 쓰기 권한이 있습니다.
@end deffn

@geindex S_IXUSR (stat 모듈)
@anchor{library/stat stat S_IXUSR}@anchor{2ca4}
@deffn {데이터} stat.S_IXUSR

소유자에게 실행 권한이 있습니다.
@end deffn

@geindex S_IRWXG (stat 모듈)
@anchor{library/stat stat S_IRWXG}@anchor{2ca5}
@deffn {데이터} stat.S_IRWXG

그룹 권한 마스크.
@end deffn

@geindex S_IRGRP (stat 모듈)
@anchor{library/stat stat S_IRGRP}@anchor{2ca6}
@deffn {데이터} stat.S_IRGRP

그룹에 읽기 권한이 있습니다.
@end deffn

@geindex S_IWGRP (stat 모듈)
@anchor{library/stat stat S_IWGRP}@anchor{2ca7}
@deffn {데이터} stat.S_IWGRP

그룹에 쓰기 권한이 있습니다.
@end deffn

@geindex S_IXGRP (stat 모듈)
@anchor{library/stat stat S_IXGRP}@anchor{2c9e}
@deffn {데이터} stat.S_IXGRP

그룹에 실행 권한이 있습니다.
@end deffn

@geindex S_IRWXO (stat 모듈)
@anchor{library/stat stat S_IRWXO}@anchor{2ca8}
@deffn {데이터} stat.S_IRWXO

다른 사용자(그룹에 없는)에 대한 권한 마스크.
@end deffn

@geindex S_IROTH (stat 모듈)
@anchor{library/stat stat S_IROTH}@anchor{2ca9}
@deffn {데이터} stat.S_IROTH

다른 사용자에게 읽기 권한이 있습니다.
@end deffn

@geindex S_IWOTH (stat 모듈)
@anchor{library/stat stat S_IWOTH}@anchor{2caa}
@deffn {데이터} stat.S_IWOTH

다른 사용자에게 쓰기 권한이 있습니다.
@end deffn

@geindex S_IXOTH (stat 모듈)
@anchor{library/stat stat S_IXOTH}@anchor{2cab}
@deffn {데이터} stat.S_IXOTH

다른 사용자에게 실행 권한이 있습니다.
@end deffn

@geindex S_ENFMT (stat 모듈)
@anchor{library/stat stat S_ENFMT}@anchor{2c9f}
@deffn {데이터} stat.S_ENFMT

System V 파일 잠금 강제. 이 플래그는 @ref{2c9d,,S_ISGID}와 공유됩니다: 파일/레코드 잠금이 그룹 실행 비트(@ref{2c9e,,S_IXGRP})가 설정되지 않은 파일에 적용됩니다.
@end deffn

@geindex S_IREAD (stat 모듈)
@anchor{library/stat stat S_IREAD}@anchor{2cac}
@deffn {데이터} stat.S_IREAD

@ref{2ca2,,S_IRUSR}에 대한 유닉스 V7 동의어.
@end deffn

@geindex S_IWRITE (stat 모듈)
@anchor{library/stat stat S_IWRITE}@anchor{2cad}
@deffn {데이터} stat.S_IWRITE

@ref{2ca3,,S_IWUSR}에 대한 유닉스 V7 동의어.
@end deffn

@geindex S_IEXEC (stat 모듈)
@anchor{library/stat stat S_IEXEC}@anchor{2cae}
@deffn {데이터} stat.S_IEXEC

@ref{2ca4,,S_IXUSR}에 대한 유닉스 V7 동의어.
@end deffn

다음 플래그는 @ref{12f2,,os.chflags()}의 `flags' 인자에서 사용될 수 있습니다:

@geindex UF_SETTABLE (stat 모듈)
@anchor{library/stat stat UF_SETTABLE}@anchor{2caf}
@deffn {데이터} stat.UF_SETTABLE

All user settable flags.


Added in version 3.13.

@end deffn

@geindex UF_NODUMP (stat 모듈)
@anchor{library/stat stat UF_NODUMP}@anchor{2cb0}
@deffn {데이터} stat.UF_NODUMP

파일을 덤프하지 마십시오.
@end deffn

@geindex UF_IMMUTABLE (stat 모듈)
@anchor{library/stat stat UF_IMMUTABLE}@anchor{2cb1}
@deffn {데이터} stat.UF_IMMUTABLE

파일을 변경할 수 없습니다.
@end deffn

@geindex UF_APPEND (stat 모듈)
@anchor{library/stat stat UF_APPEND}@anchor{2cb2}
@deffn {데이터} stat.UF_APPEND

파일은 덧붙이기만 할 수 있습니다.
@end deffn

@geindex UF_OPAQUE (stat 모듈)
@anchor{library/stat stat UF_OPAQUE}@anchor{2cb3}
@deffn {데이터} stat.UF_OPAQUE

디렉터리는 유니언 스택(union stack)을 통해 볼 때 불투명합니다.
@end deffn

@geindex UF_NOUNLINK (stat 모듈)
@anchor{library/stat stat UF_NOUNLINK}@anchor{2cb4}
@deffn {데이터} stat.UF_NOUNLINK

파일의 이름을 변경하거나 삭제할 수 없습니다.
@end deffn

@geindex UF_COMPRESSED (stat 모듈)
@anchor{library/stat stat UF_COMPRESSED}@anchor{2cb5}
@deffn {데이터} stat.UF_COMPRESSED

파일은 압축되어 저장됩니다 (맥 OS 10.6+).
@end deffn

@geindex UF_TRACKED (stat 모듈)
@anchor{library/stat stat UF_TRACKED}@anchor{2cb6}
@deffn {데이터} stat.UF_TRACKED

Used for handling document IDs (macOS)


Added in version 3.13.

@end deffn

@geindex UF_DATAVAULT (stat 모듈)
@anchor{library/stat stat UF_DATAVAULT}@anchor{2cb7}
@deffn {데이터} stat.UF_DATAVAULT

The file needs an entitlement for reading or writing (macOS 10.13+)


Added in version 3.13.

@end deffn

@geindex UF_HIDDEN (stat 모듈)
@anchor{library/stat stat UF_HIDDEN}@anchor{2cb8}
@deffn {데이터} stat.UF_HIDDEN

파일을 GUI에 표시하면 안 됩니다 (맥 OS 10.5+).
@end deffn

@geindex SF_SETTABLE (stat 모듈)
@anchor{library/stat stat SF_SETTABLE}@anchor{2cb9}
@deffn {데이터} stat.SF_SETTABLE

All super-user changeable flags


Added in version 3.13.

@end deffn

@geindex SF_SUPPORTED (stat 모듈)
@anchor{library/stat stat SF_SUPPORTED}@anchor{2cba}
@deffn {데이터} stat.SF_SUPPORTED

All super-user supported flags

@ref{213c,,가용성}: macOS


Added in version 3.13.

@end deffn

@geindex SF_SYNTHETIC (stat 모듈)
@anchor{library/stat stat SF_SYNTHETIC}@anchor{2cbb}
@deffn {데이터} stat.SF_SYNTHETIC

All super-user read-only synthetic flags

@ref{213c,,가용성}: macOS


Added in version 3.13.

@end deffn

@geindex SF_ARCHIVED (stat 모듈)
@anchor{library/stat stat SF_ARCHIVED}@anchor{2cbc}
@deffn {데이터} stat.SF_ARCHIVED

파일을 보관(archive)할 수 있습니다.
@end deffn

@geindex SF_IMMUTABLE (stat 모듈)
@anchor{library/stat stat SF_IMMUTABLE}@anchor{2cbd}
@deffn {데이터} stat.SF_IMMUTABLE

파일을 변경할 수 없습니다.
@end deffn

@geindex SF_APPEND (stat 모듈)
@anchor{library/stat stat SF_APPEND}@anchor{2cbe}
@deffn {데이터} stat.SF_APPEND

파일은 덧붙이기만 할 수 있습니다.
@end deffn

@geindex SF_RESTRICTED (stat 모듈)
@anchor{library/stat stat SF_RESTRICTED}@anchor{2cbf}
@deffn {데이터} stat.SF_RESTRICTED

The file needs an entitlement to write to (macOS 10.13+)


Added in version 3.13.

@end deffn

@geindex SF_NOUNLINK (stat 모듈)
@anchor{library/stat stat SF_NOUNLINK}@anchor{2cc0}
@deffn {데이터} stat.SF_NOUNLINK

파일의 이름을 변경하거나 삭제할 수 없습니다.
@end deffn

@geindex SF_SNAPSHOT (stat 모듈)
@anchor{library/stat stat SF_SNAPSHOT}@anchor{2cc1}
@deffn {데이터} stat.SF_SNAPSHOT

파일은 스냅숏(snapshot) 파일입니다.
@end deffn

@geindex SF_FIRMLINK (stat 모듈)
@anchor{library/stat stat SF_FIRMLINK}@anchor{2cc2}
@deffn {데이터} stat.SF_FIRMLINK

The file is a firmlink (macOS 10.15+)


Added in version 3.13.

@end deffn

@geindex SF_DATALESS (stat 모듈)
@anchor{library/stat stat SF_DATALESS}@anchor{2cc3}
@deffn {데이터} stat.SF_DATALESS

The file is a dataless object (macOS 10.15+)


Added in version 3.13.

@end deffn

자세한 정보는 *BSD나 맥 OS 시스템 매뉴얼 페이지 @code{chflags(2)@footnote{https://manpages.debian.org/chflags(2)}}를 참조하십시오.

윈도우에서 @ref{26d,,os.stat()}에 의해 반환된 @code{st_file_attributes} 멤버의 비트를 검사할 때 다음 파일 어트리뷰트 상수를 사용할 수 있습니다. 이러한 상수의 의미에 대한 자세한 내용은 Windows API documentation@footnote{https://msdn.microsoft.com/en-us/library/windows/desktop/gg258117.aspx}을 참조하십시오.

@geindex FILE_ATTRIBUTE_ARCHIVE (stat 모듈)
@geindex FILE_ATTRIBUTE_COMPRESSED (stat 모듈)
@geindex FILE_ATTRIBUTE_DEVICE (stat 모듈)
@geindex FILE_ATTRIBUTE_DIRECTORY (stat 모듈)
@geindex FILE_ATTRIBUTE_ENCRYPTED (stat 모듈)
@geindex FILE_ATTRIBUTE_HIDDEN (stat 모듈)
@geindex FILE_ATTRIBUTE_INTEGRITY_STREAM (stat 모듈)
@geindex FILE_ATTRIBUTE_NORMAL (stat 모듈)
@geindex FILE_ATTRIBUTE_NOT_CONTENT_INDEXED (stat 모듈)
@geindex FILE_ATTRIBUTE_NO_SCRUB_DATA (stat 모듈)
@geindex FILE_ATTRIBUTE_OFFLINE (stat 모듈)
@geindex FILE_ATTRIBUTE_READONLY (stat 모듈)
@geindex FILE_ATTRIBUTE_REPARSE_POINT (stat 모듈)
@geindex FILE_ATTRIBUTE_SPARSE_FILE (stat 모듈)
@geindex FILE_ATTRIBUTE_SYSTEM (stat 모듈)
@geindex FILE_ATTRIBUTE_TEMPORARY (stat 모듈)
@geindex FILE_ATTRIBUTE_VIRTUAL (stat 모듈)
@anchor{library/stat stat FILE_ATTRIBUTE_ARCHIVE}@anchor{2cc4}
@deffn {데이터} stat.FILE_ATTRIBUTE_ARCHIVE
@anchor{library/stat stat FILE_ATTRIBUTE_COMPRESSED}@anchor{2cc5}
@deffnx {데이터} stat.FILE_ATTRIBUTE_COMPRESSED
@anchor{library/stat stat FILE_ATTRIBUTE_DEVICE}@anchor{2cc6}
@deffnx {데이터} stat.FILE_ATTRIBUTE_DEVICE
@anchor{library/stat stat FILE_ATTRIBUTE_DIRECTORY}@anchor{2cc7}
@deffnx {데이터} stat.FILE_ATTRIBUTE_DIRECTORY
@anchor{library/stat stat FILE_ATTRIBUTE_ENCRYPTED}@anchor{2cc8}
@deffnx {데이터} stat.FILE_ATTRIBUTE_ENCRYPTED
@anchor{library/stat stat FILE_ATTRIBUTE_HIDDEN}@anchor{2cc9}
@deffnx {데이터} stat.FILE_ATTRIBUTE_HIDDEN
@anchor{library/stat stat FILE_ATTRIBUTE_INTEGRITY_STREAM}@anchor{2cca}
@deffnx {데이터} stat.FILE_ATTRIBUTE_INTEGRITY_STREAM
@anchor{library/stat stat FILE_ATTRIBUTE_NORMAL}@anchor{2ccb}
@deffnx {데이터} stat.FILE_ATTRIBUTE_NORMAL
@anchor{library/stat stat FILE_ATTRIBUTE_NOT_CONTENT_INDEXED}@anchor{2ccc}
@deffnx {데이터} stat.FILE_ATTRIBUTE_NOT_CONTENT_INDEXED
@anchor{library/stat stat FILE_ATTRIBUTE_NO_SCRUB_DATA}@anchor{2ccd}
@deffnx {데이터} stat.FILE_ATTRIBUTE_NO_SCRUB_DATA
@anchor{library/stat stat FILE_ATTRIBUTE_OFFLINE}@anchor{2cce}
@deffnx {데이터} stat.FILE_ATTRIBUTE_OFFLINE
@anchor{library/stat stat FILE_ATTRIBUTE_READONLY}@anchor{2ccf}
@deffnx {데이터} stat.FILE_ATTRIBUTE_READONLY
@anchor{library/stat stat FILE_ATTRIBUTE_REPARSE_POINT}@anchor{2cd0}
@deffnx {데이터} stat.FILE_ATTRIBUTE_REPARSE_POINT
@anchor{library/stat stat FILE_ATTRIBUTE_SPARSE_FILE}@anchor{2cd1}
@deffnx {데이터} stat.FILE_ATTRIBUTE_SPARSE_FILE
@anchor{library/stat stat FILE_ATTRIBUTE_SYSTEM}@anchor{2cd2}
@deffnx {데이터} stat.FILE_ATTRIBUTE_SYSTEM
@anchor{library/stat stat FILE_ATTRIBUTE_TEMPORARY}@anchor{2cd3}
@deffnx {데이터} stat.FILE_ATTRIBUTE_TEMPORARY
@anchor{library/stat stat FILE_ATTRIBUTE_VIRTUAL}@anchor{2cd4}
@deffnx {데이터} stat.FILE_ATTRIBUTE_VIRTUAL


Added in version 3.5.

@end deffn

윈도우에서, @ref{6c7,,os.lstat()}이 반환한 @code{st_reparse_tag} 멤버와 비교하기 위해 다음 상수를 사용할 수 있습니다. 이것들은 잘 알려진 상수이지만, 완전한 목록은 아닙니다.

@geindex IO_REPARSE_TAG_SYMLINK (stat 모듈)
@geindex IO_REPARSE_TAG_MOUNT_POINT (stat 모듈)
@geindex IO_REPARSE_TAG_APPEXECLINK (stat 모듈)
@anchor{library/stat stat IO_REPARSE_TAG_SYMLINK}@anchor{2cd5}
@deffn {데이터} stat.IO_REPARSE_TAG_SYMLINK
@anchor{library/stat stat IO_REPARSE_TAG_MOUNT_POINT}@anchor{2cd6}
@deffnx {데이터} stat.IO_REPARSE_TAG_MOUNT_POINT
@anchor{library/stat stat IO_REPARSE_TAG_APPEXECLINK}@anchor{2cd7}
@deffnx {데이터} stat.IO_REPARSE_TAG_APPEXECLINK


Added in version 3.8.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node filecmp — 파일과 디렉터리 비교,tempfile — 임시 파일과 디렉터리 생성,stat — stat 결과 해석하기,파일과 디렉터리 액세스
@anchor{library/filecmp doc}@anchor{2cd8}@anchor{library/filecmp filecmp-file-and-directory-comparisons}@anchor{2cd9}@anchor{library/filecmp module-filecmp}@anchor{5e}@anchor{library/filecmp translation-repo}@anchor{2cda}
@subsection @code{filecmp} — 파일과 디렉터리 비교


@geindex module; filecmp

`소스 코드:' Lib/filecmp.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/filecmp.py}


__________________________________________________________________


The @code{filecmp} module defines functions to compare files and directories,
with various optional time/correctness trade-offs. For comparing files,
see also the @ref{3b,,difflib} module.

The @code{filecmp} module defines the following functions:

@geindex cmp() (filecmp 모듈)
@anchor{library/filecmp filecmp cmp}@anchor{19dd}
@deffn {함수} filecmp.cmp (f1, f2, shallow=True)

`f1'와 `f2'로 이름이 지정된 파일을 비교하여, 같아 보이면 @code{True}를 반환하고, 그렇지 않으면 @code{False}를 반환합니다.

`shallow'가 참이고 두 파일의 @ref{26d,,os.stat()} 서명(파일 유형, 크기, 수정 시간)이 동일하면, 파일을 같다고 취급합니다.

그렇지 않으면, 파일의 크기나 내용이 다를 때 다르다고 취급합니다.

이 함수는 외부 프로그램을 호출하지 않으므로 이식성과 효율성을 제공합니다.

이 함수는 과거 비교와 결과에 대해 캐시를 사용합니다. 파일에 대한 @ref{26d,,os.stat()} 정보가 변경되면 캐시 항목이 무효화 됩니다. 전체 캐시는 @ref{113d,,clear_cache()}를 사용하여 지울 수 있습니다.
@end deffn

@geindex cmpfiles() (filecmp 모듈)
@anchor{library/filecmp filecmp cmpfiles}@anchor{1946}
@deffn {함수} filecmp.cmpfiles (dir1, dir2, common, shallow=True)

두 디렉터리 `dir1' 과 `dir2'에 있는 이름이 `common'으로 지정된 파일들을 비교합니다.

파일 이름의 세 가지 리스트를 반환합니다: `match', `mismatch', `errors'. `match'는 일치하는 파일 리스트를 포함하고, `mismatch'는 일치하지 않는 파일의 이름을 포함하며, `errors'는 비교할 수 없는 파일의 이름을 나열합니다. 파일이 디렉터리 중 하나에 없거나, 사용자가 읽을 수 있는 권한이 없거나, 다른 이유로 인해 비교를 수행할 수 없으면 파일은 `errors'에 나열됩니다.

`shallow' 매개 변수는 @ref{19dd,,filecmp.cmp()}와 같은 의미와 기본값을 가집니다.

예를 들어, @code{cmpfiles('a', 'b', ['c', 'd/e'])}는 @code{a/c}와 @code{b/c}, @code{a/d/e}와 @code{b/d/e}를 비교합니다. @code{'c'} 와 @code{'d/e'}는 각각 반환된 세 개의 리스트 중 하나에 포함됩니다.
@end deffn

@geindex clear_cache() (filecmp 모듈)
@anchor{library/filecmp filecmp clear_cache}@anchor{113d}
@deffn {함수} filecmp.clear_cache ()

filecmp 캐시를 지웁니다. 파일이 수정된 후 너무 빨리 비교되어 하부 파일 시스템의 mtime 해상도 내에 있을 때 유용합니다.


Added in version 3.4.

@end deffn

@menu
* dircmp 클래스:: 

@end menu

@node dircmp 클래스,,,filecmp — 파일과 디렉터리 비교
@anchor{library/filecmp dircmp-objects}@anchor{2cdb}@anchor{library/filecmp the-dircmp-class}@anchor{2cdc}
@subsubsection @code{dircmp} 클래스


@geindex dircmp (filecmp 클래스)
@anchor{library/filecmp filecmp dircmp}@anchor{113f}
@deffn {클래스} filecmp.dircmp (a, b, ignore=None, hide=None, *, shallow=True)

`a'와 `b' 디렉터리를 비교하기 위한, 새로운 디렉터리 비교 객체를 만듭니다. `ignore'는 무시할 이름 리스트며, 기본값은 @ref{113e,,filecmp.DEFAULT_IGNORES}입니다. `hide'는 숨길 이름 리스트며 기본값은 @code{[os.curdir, os.pardir]}입니다.

@ref{113f,,dircmp} 클래스는 (`shallow' 매개 변수를 지원하지만) 기본적으로는 @ref{19dd,,filecmp.cmp()}에서 설명하는 `얕은(shallow)' 비교를 통해 파일을 비교합니다.


버전 3.13에서 변경: `shallow' 매개 변수를 추가했습니다.


@ref{113f,,dircmp} 클래스는 다음 메서드를 제공합니다:

@geindex report() (filecmp.dircmp 메서드)
@anchor{library/filecmp filecmp dircmp report}@anchor{2cdd}
@deffn {메서드} report ()

`a'와 `b' 사이의 비교를 (@ref{ccc,,sys.stdout}로) 인쇄합니다.
@end deffn

@geindex report_partial_closure() (filecmp.dircmp 메서드)
@anchor{library/filecmp filecmp dircmp report_partial_closure}@anchor{2cde}
@deffn {메서드} report_partial_closure ()

`a'와 `b' 및 공통 직접 하위 디렉터리 사이의 비교를 인쇄합니다.
@end deffn

@geindex report_full_closure() (filecmp.dircmp 메서드)
@anchor{library/filecmp filecmp dircmp report_full_closure}@anchor{2cdf}
@deffn {메서드} report_full_closure ()

`a'와 `b' 및 공통 하위 디렉터리 (재귀적으로) 사이의 비교를 인쇄합니다.
@end deffn

@ref{113f,,dircmp} 클래스는 비교되는 디렉터리 트리에 대한 다양한 정보 비트를 얻는 데 사용될 수 있는 여러 가지 흥미로운 어트리뷰트를 제공합니다.

@ref{6f9,,__getattr__()} 훅을 통해, 모든 어트리뷰트가 느긋하게(lazily) 계산되므로, 계산하기가 가벼운 어트리뷰트만 사용하면 속도가 저하되지 않습니다.

@geindex left (filecmp.dircmp의 속성)
@anchor{library/filecmp filecmp dircmp left}@anchor{2ce0}
@deffn {속성} left

디렉터리 `a'.
@end deffn

@geindex right (filecmp.dircmp의 속성)
@anchor{library/filecmp filecmp dircmp right}@anchor{2ce1}
@deffn {속성} right

디렉터리 `b'.
@end deffn

@geindex left_list (filecmp.dircmp의 속성)
@anchor{library/filecmp filecmp dircmp left_list}@anchor{2ce2}
@deffn {속성} left_list

`hide' 와 `ignore'로 필터링 된, `a'의 파일과 하위 디렉터리.
@end deffn

@geindex right_list (filecmp.dircmp의 속성)
@anchor{library/filecmp filecmp dircmp right_list}@anchor{2ce3}
@deffn {속성} right_list

`hide' 와 `ignore'로 필터링 된, `b'의 파일과 하위 디렉터리.
@end deffn

@geindex common (filecmp.dircmp의 속성)
@anchor{library/filecmp filecmp dircmp common}@anchor{2ce4}
@deffn {속성} common

`a' 와 `b'의 공통 파일과 하위 디렉터리.
@end deffn

@geindex left_only (filecmp.dircmp의 속성)
@anchor{library/filecmp filecmp dircmp left_only}@anchor{2ce5}
@deffn {속성} left_only

`a'에만 있는 파일과 하위 디렉터리.
@end deffn

@geindex right_only (filecmp.dircmp의 속성)
@anchor{library/filecmp filecmp dircmp right_only}@anchor{2ce6}
@deffn {속성} right_only

`b'에만 있는 파일과 하위 디렉터리.
@end deffn

@geindex common_dirs (filecmp.dircmp의 속성)
@anchor{library/filecmp filecmp dircmp common_dirs}@anchor{2ce7}
@deffn {속성} common_dirs

`a' 및 `b'의 공통 하위 디렉터리.
@end deffn

@geindex common_files (filecmp.dircmp의 속성)
@anchor{library/filecmp filecmp dircmp common_files}@anchor{2ce8}
@deffn {속성} common_files

`a' 와 `b'의 공통 파일.
@end deffn

@geindex common_funny (filecmp.dircmp의 속성)
@anchor{library/filecmp filecmp dircmp common_funny}@anchor{2ce9}
@deffn {속성} common_funny

`a'와 `b'의 공통 이름으로, 디렉터리 간에 유형이 다르거나, @ref{26d,,os.stat()}가 에러를 보고하는 이름.
@end deffn

@geindex same_files (filecmp.dircmp의 속성)
@anchor{library/filecmp filecmp dircmp same_files}@anchor{2cea}
@deffn {속성} same_files

`a' 와 `b'에 모두 있고, 클래스의 파일 비교 연산자를 사용할 때 같은 파일.
@end deffn

@geindex diff_files (filecmp.dircmp의 속성)
@anchor{library/filecmp filecmp dircmp diff_files}@anchor{2ceb}
@deffn {속성} diff_files

`a' 및 `b'에 모두 있고, 클래스의 파일 비교 연산자를 사용할 때 내용이 다른 파일.
@end deffn

@geindex funny_files (filecmp.dircmp의 속성)
@anchor{library/filecmp filecmp dircmp funny_files}@anchor{2cec}
@deffn {속성} funny_files

`a' 및 `b'에 모두 있지만, 비교할 수 없는 파일.
@end deffn

@geindex subdirs (filecmp.dircmp의 속성)
@anchor{library/filecmp filecmp dircmp subdirs}@anchor{1ce2}
@deffn {속성} subdirs

@ref{2ce7,,common_dirs}의 이름을 @ref{113f,,dircmp} 인스턴스로 (또는 이 인스턴스가 @code{dircmp}의 서브 클래스인 MyDirCmp 형이면 MyDirCmp 인스턴스로) 매핑하는 딕셔너리.


버전 3.10에서 변경: Previously entries were always @code{dircmp} instances. Now entries
are the same type as `self', if `self' is a subclass of
@code{dircmp}.

@end deffn
@end deffn

@geindex DEFAULT_IGNORES (filecmp 모듈)
@anchor{library/filecmp filecmp DEFAULT_IGNORES}@anchor{113e}
@deffn {데이터} filecmp.DEFAULT_IGNORES


Added in version 3.4.


@ref{113f,,dircmp}에 의해 기본적으로 무시되는 디렉터리 리스트.
@end deffn

다음은 이름이 같지만, 내용이 다른 파일을 표시하기 위해, @code{subdirs} 어트리뷰트로 두 개의 디렉터리를 재귀적으로 검색하는 간단한 예제입니다:

@example
>>> from filecmp import dircmp
>>> def print_diff_files(dcmp):
...     for name in dcmp.diff_files:
...         print("diff_file %s found in %s and %s" % (name, dcmp.left,
...               dcmp.right))
...     for sub_dcmp in dcmp.subdirs.values():
...         print_diff_files(sub_dcmp)
...
>>> dcmp = dircmp('dir1', 'dir2')
>>> print_diff_files(dcmp)
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node tempfile — 임시 파일과 디렉터리 생성,glob — 유닉스 스타일 경로명 패턴 확장,filecmp — 파일과 디렉터리 비교,파일과 디렉터리 액세스
@anchor{library/tempfile doc}@anchor{2ced}@anchor{library/tempfile module-tempfile}@anchor{e6}@anchor{library/tempfile tempfile-generate-temporary-files-and-directories}@anchor{2cee}@anchor{library/tempfile translation-repo}@anchor{2cef}
@subsection @code{tempfile} — 임시 파일과 디렉터리 생성


@geindex module; tempfile

`소스 코드:' Lib/tempfile.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/tempfile.py}

@geindex 임시;파일명
@geindex 임시;파일


__________________________________________________________________


이 모듈은 임시 파일과 디렉터리를 만듭니다. 지원되는 모든 플랫폼에서 작동합니다. @ref{2cf0,,TemporaryFile}, @ref{6ec,,NamedTemporaryFile}, @ref{1439,,TemporaryDirectory} 및 @ref{8a1,,SpooledTemporaryFile}은 자동 정리를 제공하고 @ref{1e1,,컨텍스트 관리자}로 사용할 수 있는 고수준 인터페이스입니다. @ref{2cf1,,mkstemp()}와 @ref{52d,,mkdtemp()}는 수동 정리가 필요한 저수준 함수입니다.

사용자가 호출할 수 있는 모든 함수와 생성자는 임시 파일과 디렉터리의 위치와 이름을 직접 제어할 수 있도록 하는 추가 인자를 취합니다. 이 모듈에서 사용하는 파일 이름에는 무작위 문자의 문자열이 포함되어있어 공유 임시 디렉터리에서 해당 파일을 안전하게 만들 수 있도록 합니다. 이전 버전과의 호환성을 유지하기 위해, 인자 순서는 다소 이상합니다; 명확성을 위해 키워드 인자를 사용하는 것이 좋습니다.

이 모듈은 다음과 같은 사용자 호출 가능 항목을 정의합니다:

@geindex TemporaryFile() (tempfile 모듈)
@anchor{library/tempfile tempfile TemporaryFile}@anchor{2cf0}
@deffn {함수} tempfile.TemporaryFile (mode='w+b', buffering=-1, encoding=None, newline=None, suffix=None, prefix=None, dir=None, *, errors=None)

임시 저장 영역으로 사용할 수 있는 @ref{17b3,,파일류 객체}를 반환합니다. @ref{2cf1,,mkstemp()}와 같은 규칙을 사용하여 파일이 안전하게 만들어집니다. 닫히는 즉시 삭제됩니다 (객체가 가비지 수집될 때 묵시적인 닫기를 포함합니다). 유닉스에서, 파일의 디렉터리 항목은 전혀 만들어지지 않거나 파일이 만들어진 직후에 제거됩니다. 다른 플랫폼은 이를 지원하지 않습니다; 코드는 이 함수를 사용하여 만들어진 임시 파일이 파일 시스템에서 보이는 이름이 있거나 없는지에 의존해서는 안 됩니다.

결과 객체는 @ref{1e1,,컨텍스트 관리자}로 사용할 수 있습니다 (@ref{2cf2,,예}를 참조하십시오). 컨텍스트가 완료되거나 파일 객체가 파괴되면 임시 파일이 파일 시스템에서 제거됩니다.

`mode' 매개 변수는 기본적으로 @code{'w+b'}로 설정되므로 만들어진 파일을 닫지 않고 읽고 쓸 수 있습니다. 저장된 데이터와 관계없이 모든 플랫폼에서 일관되게 작동하도록 바이너리 모드가 사용됩니다. `buffering', `encoding', `errors' 및 `newline'은 @ref{316,,open()}처럼 해석됩니다.

`dir', `prefix' 및 `suffix' 매개 변수는 @ref{2cf1,,mkstemp()}와 같은 의미와 기본값을 갖습니다.

반환된 객체는 POSIX 플랫폼에서 실제 파일 객체입니다. 다른 플랫폼에서는, @code{file} 어트리뷰트가 하부 실제 파일 객체인 파일류 객체입니다.

@ref{1172,,os.O_TMPFILE} 플래그는 사용할 수 있고 작동하면 사용됩니다 (리눅스 특정, 리눅스 커널 3.11 이상이 필요합니다).

On platforms that are neither Posix nor Cygwin, TemporaryFile is an alias
for NamedTemporaryFile.

인자 @code{fullpath}로 @ref{1c6c,,감사 이벤트} @code{tempfile.mkstemp}를 발생시킵니다.


버전 3.5에서 변경: 사용할 수 있으면 @ref{1172,,os.O_TMPFILE} 플래그가 사용됩니다.



버전 3.8에서 변경: `errors' 매개 변수를 추가했습니다.

@end deffn

@geindex NamedTemporaryFile() (tempfile 모듈)
@anchor{library/tempfile tempfile NamedTemporaryFile}@anchor{6ec}
@deffn {함수} tempfile.NamedTemporaryFile (mode='w+b', buffering=-1, encoding=None, newline=None, suffix=None, prefix=None, dir=None, delete=True, *, errors=None, delete_on_close=True)

이 함수는 다음과 같은 차이를 제외하고는 @ref{2cf0,,TemporaryFile()}과 똑같이 작동합니다:


@itemize *

@item 
이 함수는 파일 시스템에서 보이는 이름을 가지는 것이 보장되는 파일을 반환합니다.

@item 
To manage the named file, it extends the parameters of
@ref{2cf0,,TemporaryFile()} with `delete' and `delete_on_close' parameters that
determine whether and how the named file should be automatically deleted.
@end itemize

반환된 객체는 항상 @code{file} 어트리뷰트가 하부 실제 파일 객체인 @ref{17b3,,파일류 객체}입니다. 이 파일류 객체는 일반 파일과 마찬가지로 @ref{186,,with} 문에서 사용할 수 있습니다. 임시 파일의 이름은 반환된 파일류 객체의 @code{name} 어트리뷰트에서 꺼낼 수 있습니다. 유닉스에서, @ref{2cf0,,TemporaryFile()}과 달리, 파일 생성 직후에 디렉터리 항목이 삭제(unlink)되지 않습니다.

If `delete' is true (the default) and `delete_on_close' is true (the
default), the file is deleted as soon as it is closed. If `delete' is true
and `delete_on_close' is false, the file is deleted on context manager exit
only, or else when the @ref{17b3,,file-like object} is finalized. Deletion is not
always guaranteed in this case (see @ref{11fc,,object.__del__()}). If `delete' is
false, the value of `delete_on_close' is ignored.

Therefore to use the name of the temporary file to reopen the file after
closing it, either make sure not to delete the file upon closure (set the
`delete' parameter to be false) or, in case the temporary file is created in
a @ref{186,,with} statement, set the `delete_on_close' parameter to be false.
The latter approach is recommended as it provides assistance in automatic
cleaning of the temporary file upon the context manager exit.

Opening the temporary file again by its name while it is still open works as
follows:


@itemize *

@item 
On POSIX the file can always be opened again.

@item 
On Windows, make sure that at least one of the following conditions are
fulfilled:


@itemize *

@item 
`delete' is false

@item 
additional open shares delete access (e.g. by calling @ref{f91,,os.open()}
with the flag @code{O_TEMPORARY})

@item 
`delete' is true but `delete_on_close' is false. Note, that in this
case the additional opens that do not share delete access (e.g.
created via builtin @ref{316,,open()}) must be closed before exiting the
context manager, else the @ref{12fa,,os.unlink()} call on context manager
exit will fail with a @ref{f3d,,PermissionError}.
@end itemize
@end itemize

On Windows, if `delete_on_close' is false, and the file is created in a
directory for which the user lacks delete access, then the @ref{12fa,,os.unlink()}
call on exit of the context manager will fail with a @ref{f3d,,PermissionError}.
This cannot happen when `delete_on_close' is true because delete access is
requested by the open, which fails immediately if the requested access is not
granted.

On POSIX (only), a process that is terminated abruptly with SIGKILL
cannot automatically delete any NamedTemporaryFiles it created.

인자 @code{fullpath}로 @ref{1c6c,,감사 이벤트} @code{tempfile.mkstemp}를 발생시킵니다.


버전 3.8에서 변경: `errors' 매개 변수를 추가했습니다.



버전 3.12에서 변경: `delete_on_close' 매개 변수를 추가했습니다.

@end deffn

@geindex SpooledTemporaryFile (tempfile 클래스)
@anchor{library/tempfile tempfile SpooledTemporaryFile}@anchor{8a1}
@deffn {클래스} tempfile.SpooledTemporaryFile (max_size=0, mode='w+b', buffering=-1, encoding=None, newline=None, suffix=None, prefix=None, dir=None, *, errors=None)

이 클래스는 파일 크기가 `max_size'를 초과할 때까지, 또는 파일의 @ref{17b4,,fileno()} 메서드가 호출될 때까지 데이터가 메모리에 스풀링 되는 것을 제외하고는 @ref{2cf0,,TemporaryFile()}과 똑같이 작동합니다. 이 시점에서 내용은 디스크에 기록되고 @code{TemporaryFile()}처럼 작업이 진행됩니다.

@geindex rollover() (tempfile.SpooledTemporaryFile 메서드)
@anchor{library/tempfile tempfile SpooledTemporaryFile rollover}@anchor{2cf3}
@deffn {메서드} rollover ()

결과 파일에는 추가 메서드인 @code{rollover()}가 있으며, 파일 크기와 관계없이 파일을 디스크 상의 파일로 롤오버(roll over) 합니다.
@end deffn

반환된 객체는 파일류 객체인데, @ref{2cf3,,rollover()}가 호출되었는지에 따라 @code{_file} 어트리뷰트는 @ref{10a3,,io.BytesIO}나 @ref{9be,,io.TextIOWrapper} 객체(바이너리나 텍스트 `mode'가 지정되었는지에 따라)이거나 실제 파일 객체입니다. 이 파일류 객체는 일반 파일과 마찬가지로 @ref{186,,with} 문에서 사용할 수 있습니다.


버전 3.3에서 변경: truncate 메서드는 이제 `size' 인자를 허용합니다.



버전 3.8에서 변경: `errors' 매개 변수를 추가했습니다.



버전 3.11에서 변경: Fully implements the @ref{8a2,,io.BufferedIOBase} and
@ref{8a3,,io.TextIOBase} abstract base classes (depending on whether binary
or text `mode' was specified).

@end deffn

@geindex TemporaryDirectory (tempfile 클래스)
@anchor{library/tempfile tempfile TemporaryDirectory}@anchor{1439}
@deffn {클래스} tempfile.TemporaryDirectory (suffix=None, prefix=None, dir=None, ignore_cleanup_errors=False, *, delete=True)

이 클래스는 @ref{52d,,mkdtemp()}와 같은 규칙을 사용하여 임시 디렉터리를 안전하게 만듭니다. 결과 객체는 @ref{1e1,,컨텍스트 관리자}로 사용할 수 있습니다 (@ref{2cf2,,예}를 참조하십시오). 컨텍스트가 완료되거나 임시 디렉터리 객체가 파괴되면 새로 만들어진 임시 디렉터리와 모든 내용이 파일 시스템에서 제거됩니다.

@geindex name (tempfile.TemporaryDirectory의 속성)
@anchor{library/tempfile tempfile TemporaryDirectory name}@anchor{2cf4}
@deffn {속성} name

반환된 객체의 @code{name} 어트리뷰트에서 디렉터리 이름을 꺼낼 수 있습니다. 반환된 객체가 @ref{1e1,,컨텍스트 관리자}로 사용될 때, @code{name}은 @ref{186,,with} 문의 @code{as} 절의 대상에 (있다면) 대입됩니다.
@end deffn

@geindex cleanup() (tempfile.TemporaryDirectory 메서드)
@anchor{library/tempfile tempfile TemporaryDirectory cleanup}@anchor{2cf5}
@deffn {메서드} cleanup ()

The directory can be explicitly cleaned up by calling the
@code{cleanup()} method. If `ignore_cleanup_errors' is true, any unhandled
exceptions during explicit or implicit cleanup (such as a
@ref{f3d,,PermissionError} removing open files on Windows) will be ignored,
and the remaining removable items deleted on a “best-effort” basis.
Otherwise, errors will be raised in whatever context cleanup occurs
(the @code{cleanup()} call, exiting the context manager, when the object
is garbage-collected or during interpreter shutdown).
@end deffn

The `delete' parameter can be used to disable cleanup of the directory tree
upon exiting the context.  While it may seem unusual for a context manager
to disable the action taken when exiting the context, it can be useful during
debugging or when you need your cleanup behavior to be conditional based on
other logic.

인자 @code{fullpath}로 @ref{1c6c,,감사 이벤트} @code{tempfile.mkdtemp}를 발생시킵니다.


Added in version 3.2.



버전 3.10에서 변경: `ignore_cleanup_errors' 매개 변수를 추가했습니다.



버전 3.12에서 변경: `delete' 매개 변수를 추가했습니다.

@end deffn

@geindex mkstemp() (tempfile 모듈)
@anchor{library/tempfile tempfile mkstemp}@anchor{2cf1}
@deffn {함수} tempfile.mkstemp (suffix=None, prefix=None, dir=None, text=False)

Creates a temporary file in the most secure manner possible.  There are
no race conditions in the file’s creation, assuming that the platform
properly implements the @ref{2cf6,,os.O_EXCL} flag for @ref{f91,,os.open()}.  The
file is readable and writable only by the creating user ID.  If the
platform uses permission bits to indicate whether a file is executable,
the file is executable by no one.

The file descriptor is @ref{10fb,,not inherited by child processes}.

@ref{2cf0,,TemporaryFile()}과 달리, @ref{2cf1,,mkstemp()}의 사용자는 임시 파일로의 작업을 끝내면 파일을 삭제해야 합니다.

`suffix'가 @code{None}이 아니면, 파일 이름은 해당 접미사로 끝납니다, 그렇지 않으면 접미사가 없습니다. @ref{2cf1,,mkstemp()}는 파일 이름과 접미사 사이에 점을 넣지 않습니다; 필요하면 `suffix'의 시작 부분에 넣으십시오.

`prefix'가 @code{None}이 아니면, 파일 이름은 해당 접두사로 시작합니다; 그렇지 않으면 기본 접두사가 사용됩니다. 기본값은 @ref{2cf7,,gettempprefix()}나 @ref{2cf8,,gettempprefixb()} 중 적절한 것의 반환 값입니다.

`dir'이 @code{None}이 아니면, 파일은 해당 디렉터리에 만들어집니다; 그렇지 않으면 기본 디렉터리가 사용됩니다. 기본 디렉터리는 플랫폼별 목록에서 선택되지만, 응용 프로그램 사용자는 `TMPDIR', `TEMP' 또는 `TMP' 환경 변수를 설정하여 디렉터리 위치를 제어할 수 있습니다. 따라서 생성된 파일명이 @code{os.popen()}을 통해 외부 명령에 전달될 때 따옴표 처리할 필요가 없는 것과 같은 멋진 속성을 가질 것이라는 보장은 없습니다.

`suffix', `prefix' 및 `dir' 중 어느 것이라도 @code{None}이 아니면, 그들은 같은 형이어야 합니다. 이들이 바이트열이면, 반환되는 이름은 str 대신 바이트열입니다. 기본 동작으로 바이트열 반환 값을 강제하려면 @code{suffix=b'@w{'}}를 전달하십시오.

`text'가 지정되고 참이면, 파일은 텍스트 모드로 열립니다. 그렇지 않으면 (기본값) 파일은 바이너리 모드로 열립니다.

@ref{2cf1,,mkstemp()}는 열린 파일에 대한 OS 수준 핸들(@ref{f91,,os.open()}에서 반환하는 것)과 해당 파일의 절대 경로를 이 순서대로 포함하는 튜플을 반환합니다.

인자 @code{fullpath}로 @ref{1c6c,,감사 이벤트} @code{tempfile.mkstemp}를 발생시킵니다.


버전 3.5에서 변경: 바이트열 반환 값을 얻기 위해 `suffix', `prefix' 및 `dir'를 이제 바이트열로 제공할 수 있습니다. 이전에는, str만 허용되었습니다. `suffix'와 `prefix'는 이제 기본값이 @code{None}이고 적절한 기본값이 사용되도록 합니다.



버전 3.6에서 변경: `dir' 매개 변수는 이제 @ref{5a0,,경로류 객체}를 받아들입니다.

@end deffn

@geindex mkdtemp() (tempfile 모듈)
@anchor{library/tempfile tempfile mkdtemp}@anchor{52d}
@deffn {함수} tempfile.mkdtemp (suffix=None, prefix=None, dir=None)

가장 안전한 방식으로 임시 디렉터리를 만듭니다. 디렉터리 생성에 경쟁 조건이 없습니다. 디렉터리는 만드는 사용자 ID만 읽고 쓰고 검색할 수 있습니다.

@ref{52d,,mkdtemp()}의 사용자는 임시 디렉터리로의 작업을 끝내면 임시 디렉터리와 디렉터리의 내용을 삭제해야 합니다.

`prefix', `suffix' 및 `dir' 인자는 @ref{2cf1,,mkstemp()}와 같습니다.

@ref{52d,,mkdtemp()}는 새 디렉터리의 절대 경로명을 반환합니다.

인자 @code{fullpath}로 @ref{1c6c,,감사 이벤트} @code{tempfile.mkdtemp}를 발생시킵니다.


버전 3.5에서 변경: 바이트열 반환 값을 얻기 위해 `suffix', `prefix' 및 `dir'를 이제 바이트열로 제공할 수 있습니다. 이전에는, str만 허용되었습니다. `suffix'와 `prefix'는 이제 기본값이 @code{None}이고 적절한 기본값이 사용되도록 합니다.



버전 3.6에서 변경: `dir' 매개 변수는 이제 @ref{5a0,,경로류 객체}를 받아들입니다.



버전 3.12에서 변경: 이제 `dir'이 상대 경로일 때도, @ref{52d,,mkdtemp()}는 항상 절대 경로를 반환합니다.

@end deffn

@geindex gettempdir() (tempfile 모듈)
@anchor{library/tempfile tempfile gettempdir}@anchor{1c90}
@deffn {함수} tempfile.gettempdir ()

임시 파일에 사용된 디렉터리 이름을 반환합니다. 이것은 이 모듈의 모든 함수에 대한 `dir' 인자의 기본값을 정의합니다.

파이썬은 표준 디렉터리 목록을 검색하여 호출하는 사용자가 파일을 만들 수 있는 디렉터리를 찾습니다. 목록은 다음과 같습니다:


@enumerate 

@item 
@geindex TMPDIR
@geindex 환경 변수; TMPDIR
@code{TMPDIR} 환경 변수로 명명된 디렉터리.

@item 
@geindex TEMP
@geindex 환경 변수; TEMP
@code{TEMP} 환경 변수로 명명된 디렉터리.

@item 
@geindex TMP
@geindex 환경 변수; TMP
@code{TMP} 환경 변수로 명명된 디렉터리.

@item 
플랫폼별 위치:


@itemize *

@item 
윈도우에서, 디렉터리 @code{C:\TEMP}, @code{C:\TMP}, @code{\TEMP} 및 @code{\TMP}, 이 순서대로.

@item 
다른 모든 플랫폼에서, 디렉터리 @code{/tmp}, @code{/var/tmp} 및 @code{/usr/tmp}, 이 순서대로.
@end itemize

@item 
최후의 수단으로, 현재 작업 디렉터리.
@end enumerate

이 검색 결과는 캐시 됩니다, 아래 @ref{1c8f,,tempdir} 설명을 참조하십시오.


버전 3.10에서 변경: Always returns a str.  Previously it would return any @ref{1c8f,,tempdir}
value regardless of type so long as it was not @code{None}.

@end deffn

@geindex gettempdirb() (tempfile 모듈)
@anchor{library/tempfile tempfile gettempdirb}@anchor{1c91}
@deffn {함수} tempfile.gettempdirb ()

@ref{1c90,,gettempdir()}과 같지만, 반환 값이 바이트열입니다.


Added in version 3.5.

@end deffn

@geindex gettempprefix() (tempfile 모듈)
@anchor{library/tempfile tempfile gettempprefix}@anchor{2cf7}
@deffn {함수} tempfile.gettempprefix ()

임시 파일을 만드는 데 사용된 파일명 접두사를 반환합니다. 디렉터리 구성 요소가 포함되어 있지 않습니다.
@end deffn

@geindex gettempprefixb() (tempfile 모듈)
@anchor{library/tempfile tempfile gettempprefixb}@anchor{2cf8}
@deffn {함수} tempfile.gettempprefixb ()

@ref{2cf7,,gettempprefix()}와 같지만, 반환 값이 바이트열입니다.


Added in version 3.5.

@end deffn

모듈은 전역 변수를 사용하여 @ref{1c90,,gettempdir()}이 반환한 임시 파일에 사용되는 디렉터리의 이름을 저장합니다. 선택 절차를 무시하도록 직접 설정할 수 있지만, 권장하지 않습니다. 이 모듈의 모든 함수는 디렉터리를 지정하는 데 사용할 수 있는 `dir' 인자를 사용합니다. 이는 전역 API 동작을 변경하여 주의하지 않는 다른 코드를 놀라게 하지 않도록 권장되는 방법입니다.

@geindex tempdir (tempfile 모듈)
@anchor{library/tempfile tempfile tempdir}@anchor{1c8f}
@deffn {데이터} tempfile.tempdir

@code{None} 이외의 값으로 설정되면, 이 변수는 이 모듈에 정의된 함수의 `dir' 인자의 기본값을 정의합니다 (형이 바이트열인지 문자열인지도 정의합니다). @ref{5a0,,경로류 객체}일 수 없습니다.

@ref{2cf7,,gettempprefix()}를 제외한 위의 함수를 호출할 때 @code{tempdir}이 @code{None}(기본값)이면 @ref{1c90,,gettempdir()}에 설명된 알고리즘에 따라 초기화됩니다.

@cartouche
@quotation 참고 
Beware that if you set @code{tempdir} to a bytes value, there is a
nasty side effect: The global default return type of
@ref{2cf1,,mkstemp()} and @ref{52d,,mkdtemp()} changes to bytes when no
explicit @code{prefix}, @code{suffix}, or @code{dir} arguments of type
str are supplied. Please do not write code expecting or
depending on this. This awkward behavior is maintained for
compatibility with the historical implementation.
@end quotation
@end cartouche
@end deffn

@menu
* 예: 예<3>. 
* 폐지된 함수와 변수:: 

@end menu

@node 예<3>,폐지된 함수와 변수,,tempfile — 임시 파일과 디렉터리 생성
@anchor{library/tempfile examples}@anchor{2cf9}@anchor{library/tempfile tempfile-examples}@anchor{2cf2}
@subsubsection 예


Here are some examples of typical usage of the @code{tempfile} module:

@example
>>> import tempfile

# 임시 파일을 만들고 약간의 데이터를 기록합니다
>>> fp = tempfile.TemporaryFile()
>>> fp.write(b'Hello world!')
# 파일에서 데이터를 읽습니다
>>> fp.seek(0)
>>> fp.read()
b'Hello world!'
# 파일을 닫습니다, 삭제됩니다
>>> fp.close()

# 컨텍스트 관리자를 사용해서 임시 파일을 만듭니다
>>> with tempfile.TemporaryFile() as fp:
...     fp.write(b'Hello world!')
...     fp.seek(0)
...     fp.read()
b'Hello world!'
>>>
# 파일은 이제 닫히고 삭제됩니다

# 컨텍스트 관리자를 사용해서 임시 파일을 만듭니다
# 파일을 닫고, 이름을 사용해서 파일을 다십 엽니다
>>> with tempfile.NamedTemporaryFile(delete_on_close=False) as fp:
...     fp.write(b'Hello world!')
...     fp.close()
... # 파일은 닫히지만, 삭제되지는 않습니다
... # 이름을 사용해서 파일을 다시 엽니다
...     with open(fp.name, mode='rb') as f:
...         f.read()
b'Hello world!'
>>>
# 파일은 이제 삭제됩니다

# 컨텍스트 관리자를 사용해서 임시 디렉터리를 만듭니다
>>> with tempfile.TemporaryDirectory() as tmpdirname:
...     print('created temporary directory', tmpdirname)
>>>
# 디렉터리와 내용은 삭제되었습니다
@end example

@node 폐지된 함수와 변수,,예<3>,tempfile — 임시 파일과 디렉터리 생성
@anchor{library/tempfile deprecated-functions-and-variables}@anchor{2cfa}@anchor{library/tempfile tempfile-mktemp-deprecated}@anchor{2cfb}
@subsubsection 폐지된 함수와 변수


임시 파일을 만드는 역사적인 방법은 먼저 @ref{1c2e,,mktemp()} 함수를 사용하여 파일 이름을 생성한 다음 이 이름을 사용하여 파일을 만드는 것입니다. 불행히도 @code{mktemp()} 호출과 파일을 만들려는 후속 시도 사이에 다른 프로세스가 이 이름으로 파일을 만들 수 있어서 이 방법은 안전하지 않습니다. 해결책은 두 단계를 결합하고 파일을 즉시 만드는 것입니다. 이 접근법이 @ref{2cf1,,mkstemp()}와 위에서 설명한 다른 함수에서 사용됩니다.

@geindex mktemp() (tempfile 모듈)
@anchor{library/tempfile tempfile mktemp}@anchor{1c2e}
@deffn {함수} tempfile.mktemp (suffix='@w{'}, prefix='tmp', dir=None)


버전 2.3부터 폐지됨: 대신 @ref{2cf1,,mkstemp()}를 사용하십시오.


호출하는 시점에 존재하지 않는 파일의 절대 경로명을 반환합니다. `prefix', `suffix' 및 `dir' 인자는 바이트열 파일 이름, @code{suffix=None} 및 @code{prefix=None}이 지원되지 않는다는 점을 제외하고 @ref{2cf1,,mkstemp()}의 같은 인자와 유사합니다.

@cartouche
@quotation 경고 
이 함수를 사용하면 프로그램에 보안 허점이 생길 수 있습니다. 반환된 파일 이름으로 무언가를 하면서 시간을 보내는 동안, 다른 누군가가 당신에게 펀치를 날릴 수 있습니다. @ref{1c2e,,mktemp()} 사용은 @code{delete=False} 매개 변수를 전달하여 @ref{6ec,,NamedTemporaryFile()}로 쉽게 대체할 수 있습니다:

@example
>>> f = NamedTemporaryFile(delete=False)
>>> f.name
'/tmp/tmptjujjt'
>>> f.write(b"Hello World!\n")
13
>>> f.close()
>>> os.unlink(f.name)
>>> os.path.exists(f.name)
False
@end example
@end quotation
@end cartouche
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node glob — 유닉스 스타일 경로명 패턴 확장,fnmatch — 유닉스 파일명 패턴 일치,tempfile — 임시 파일과 디렉터리 생성,파일과 디렉터리 액세스
@anchor{library/glob doc}@anchor{2cfc}@anchor{library/glob glob-unix-style-pathname-pattern-expansion}@anchor{2cfd}@anchor{library/glob module-glob}@anchor{68}@anchor{library/glob translation-repo}@anchor{2cfe}
@subsection @code{glob} — 유닉스 스타일 경로명 패턴 확장


@geindex module; glob

`소스 코드:' Lib/glob.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/glob.py}

@geindex 파일명;경로명 확장


__________________________________________________________________


@geindex * (애스터리스크);glob 스타일 와일드카드
@geindex ? (물음표);glob 스타일 와일드카드
@geindex [] (대괄호);glob 스타일 와일드카드
@geindex ! (느낌표);glob 스타일 와일드카드
@geindex - (마이너스);glob 스타일 와일드카드
@geindex . (점);glob 스타일 와일드카드

The @code{glob} module finds pathnames
using pattern matching rules similar to the Unix shell.
No tilde expansion is done, but @code{*}, @code{?}, and character
ranges expressed with @code{[]} will be correctly matched.  This is done by using
the @ref{c53,,os.scandir()} and @ref{1c52,,fnmatch.fnmatch()} functions in concert, and
not by actually invoking a subshell.

@cartouche
@quotation 참고 
The pathnames are returned in no particular order.  If you need a specific
order, sort the results.
@end quotation
@end cartouche

Files beginning with a dot (@code{.}) can only be matched by
patterns that also start with a dot,
unlike @ref{1c52,,fnmatch.fnmatch()} or @ref{537,,pathlib.Path.glob()}.
For tilde and shell variable expansion, use @ref{c08,,os.path.expanduser()} and
@ref{15de,,os.path.expandvars()}.

리터럴 일치를 위해서는, 대괄호 안에 메타 문자를 넣습니다. 예를 들어, @code{'[?]'}는 @code{'?'} 문자와 일치합니다.

The @code{glob} module defines the following functions:

@geindex glob() (glob 모듈)
@anchor{library/glob glob glob}@anchor{59f}
@deffn {함수} glob.glob (pathname, *, root_dir=None, dir_fd=None, recursive=False, include_hidden=False)

경로 지정을 포함하는 문자열인 `pathname'에 일치하는 경로 이름의 비어있을 수 있는 리스트를 반환합니다. `pathname'은 절대(@code{/usr/src/Python-1.5/Makefile}처럼)나 상대(@code{../../Tools/*/*.gif}처럼)일 수 있으며, 셸 스타일 와일드카드를 포함할 수 있습니다. 깨진 심볼릭 링크가 결과에 포함됩니다 (셸과 마찬가지로). 결과가 정렬되는지는 파일 시스템에 따라 다릅니다. 이 함수 호출 중에 조건을 만족하는 파일이 제거되거나 추가되면, 해당 파일의 경로 이름이 포함될지는 지정되지 않습니다.

If `root_dir' is not @code{None}, it should be a @ref{5a0,,path-like object}
specifying the root directory for searching.  It has the same effect on
@code{glob()} as changing the current directory before calling it.  If
`pathname' is relative, the result will contain paths relative to
`root_dir'.

This function can support @ref{12ef,,paths relative to directory descriptors} with the `dir_fd' parameter.

@geindex **;glob 스타일 와일드카드

`recursive'가 참이면, “@code{**}” 패턴은 모든 파일과 0개 이상의 디렉터리, 서브 디렉터리 및 디렉터리로의 심볼릭 링크와 일치합니다. 패턴 다음에 @ref{879,,os.sep}이나 @ref{87a,,os.altsep}이 오면, 파일은 일치하지 않습니다.

If `include_hidden' is true, “@code{**}” pattern will match hidden directories.

@code{pathname}, @code{recursive}를 인자로 @ref{1c6c,,감사 이벤트(auditing event)} @code{glob.glob}을 발생시킵니다.

@code{pathname}, @code{recursive}, @code{root_dir}, @code{dir_fd}를 인자로 @ref{1c6c,,감사 이벤트(auditing event)} @code{glob.glob/2}을 발생시킵니다.

@cartouche
@quotation 참고 
커다란 디렉터리 트리에서 “@code{**}” 패턴을 사용하면 과도한 시간이 걸릴 수 있습니다.
@end quotation
@end cartouche

@cartouche
@quotation 참고 
This function may return duplicate path names if `pathname'
contains multiple “@code{**}” patterns and `recursive' is true.
@end quotation
@end cartouche


버전 3.5에서 변경: “@code{**}” 를 사용하는 재귀적 glob 지원.



버전 3.10에서 변경: `root_dir' 과 `dir_fd' 매개 변수를 추가했습니다.



버전 3.11에서 변경: `include_hidden' 매개 변수를 추가했습니다.

@end deffn

@geindex iglob() (glob 모듈)
@anchor{library/glob glob iglob}@anchor{a08}
@deffn {함수} glob.iglob (pathname, *, root_dir=None, dir_fd=None, recursive=False, include_hidden=False)

실제로 동시에 저장하지 않고 @ref{68,,glob()}과 같은 값을 산출하는 @ref{4ca,,이터레이터}를 반환합니다.

@code{pathname}, @code{recursive}를 인자로 @ref{1c6c,,감사 이벤트(auditing event)} @code{glob.glob}을 발생시킵니다.

@code{pathname}, @code{recursive}, @code{root_dir}, @code{dir_fd}를 인자로 @ref{1c6c,,감사 이벤트(auditing event)} @code{glob.glob/2}을 발생시킵니다.

@cartouche
@quotation 참고 
This function may return duplicate path names if `pathname'
contains multiple “@code{**}” patterns and `recursive' is true.
@end quotation
@end cartouche


버전 3.5에서 변경: “@code{**}” 를 사용하는 재귀적 glob 지원.



버전 3.10에서 변경: `root_dir' 과 `dir_fd' 매개 변수를 추가했습니다.



버전 3.11에서 변경: `include_hidden' 매개 변수를 추가했습니다.

@end deffn

@geindex escape() (glob 모듈)
@anchor{library/glob glob escape}@anchor{1144}
@deffn {함수} glob.escape (pathname)

모든 특수 문자(@code{'?'}, @code{'*'} 및 @code{'['})를 이스케이프 처리합니다. 이것은 특수 문자가 들어있을 수 있는 임의의 리터럴 문자열을 일치시키려는 경우에 유용합니다. 드라이브/UNC 셰어 포인트의 특수 문자는 이스케이프 되지 않습니다, 예를 들어, 윈도우에서 @code{escape('//?/c:/Quo vadis?.txt')}는 @code{'//?/c:/Quo vadis[?].txt'}를 반환합니다.


Added in version 3.4.

@end deffn

@geindex translate() (glob 모듈)
@anchor{library/glob glob translate}@anchor{1852}
@deffn {함수} glob.translate (pathname, *, recursive=False, include_hidden=False, seps=None)

Convert the given path specification to a regular expression for use with
@ref{1432,,re.match()}. The path specification can contain shell-style wildcards.

예를 들어:

@example
>>> import glob, re
>>>
>>> regex = glob.translate('**/*.txt', recursive=True, include_hidden=True)
>>> regex
'(?s:(?:.+/)?[^/]*\\.txt)\\z'
>>> reobj = re.compile(regex)
>>> reobj.match('foo/bar/baz.txt')
<re.Match object; span=(0, 15), match='foo/bar/baz.txt'>
@end example

Path separators and segments are meaningful to this function, unlike
@ref{1851,,fnmatch.translate()}. By default wildcards do not match path
separators, and @code{*} pattern segments match precisely one path segment.

If `recursive' is true, the pattern segment “@code{**}” will match any number
of path segments.

If `include_hidden' is true, wildcards can match path segments that start
with a dot (@code{.}).

A sequence of path separators may be supplied to the `seps' argument. If
not given, @ref{879,,os.sep} and @ref{87a,,altsep} (if available) are used.


@subsubheading 더 보기


@ref{535,,pathlib.PurePath.full_match()} and @ref{537,,pathlib.Path.glob()}
methods, which call this function to implement pattern matching and
globbing.



Added in version 3.13.

@end deffn

@menu
* 예제: 예제<5>. 

@end menu

@node 예제<5>,,,glob — 유닉스 스타일 경로명 패턴 확장
@anchor{library/glob examples}@anchor{2cff}
@subsubsection 예제


다음과 같은 파일을 포함하는 디렉터리를 고려하십시오: @code{1.gif}, @code{2.txt}, @code{card.gif} 및 @code{3.txt} 파일 만 포함하는 서브 디렉터리 @code{sub}. @ref{68,,glob()}은 다음과 같은 결과를 산출합니다. 경로의 선행 구성 요소가 보존되는 방법에 유의하십시오.

@example
>>> import glob
>>> glob.glob('./[0-9].*')
['./1.gif', './2.txt']
>>> glob.glob('*.gif')
['1.gif', 'card.gif']
>>> glob.glob('?.gif')
['1.gif']
>>> glob.glob('**/*.txt', recursive=True)
['2.txt', 'sub/3.txt']
>>> glob.glob('./**/', recursive=True)
['./', './sub/']
@end example

디렉터리에 @code{.}으로 시작하는 파일이 있으면, 기본적으로 일치하지 않습니다. 예를 들어, @code{card.gif} 와 @code{.card.gif}를 포함하는 디렉터리를 고려하십시오:

@example
>>> import glob
>>> glob.glob('*.gif')
['card.gif']
>>> glob.glob('.c*')
['.card.gif']
@end example


@subsubheading 더 보기


@ref{60,,fnmatch} 모듈은 셸 스타일 파일명 (경로가 아님) 확장을 제공합니다.



@subsubheading 더 보기


@ref{a8,,pathlib} 모듈은 고수준의 경로 객체를 제공합니다.


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node fnmatch — 유닉스 파일명 패턴 일치,linecache — 텍스트 줄에 대한 무작위 액세스,glob — 유닉스 스타일 경로명 패턴 확장,파일과 디렉터리 액세스
@anchor{library/fnmatch doc}@anchor{2d00}@anchor{library/fnmatch fnmatch-unix-filename-pattern-matching}@anchor{2d01}@anchor{library/fnmatch module-fnmatch}@anchor{60}@anchor{library/fnmatch translation-repo}@anchor{2d02}
@subsection @code{fnmatch} — 유닉스 파일명 패턴 일치


@geindex module; fnmatch

`소스 코드:' Lib/fnmatch.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/fnmatch.py}

@geindex 파일명;와일드카드 확장

@geindex 모듈;re


__________________________________________________________________


이 모듈은 유닉스 셸 스타일의 와일드카드를 지원하며, 이는 정규식(@ref{be,,re} 모듈에서 설명합니다)과는 `다릅니다'. 셸 스타일 와일드카드에 사용되는 특수 문자는 다음과 같습니다:

@geindex * (애스터리스크);glob 스타일 와일드카드
@geindex ? (물음표);glob 스타일 와일드카드
@geindex [] (대괄호);glob 스타일 와일드카드
@geindex ! (느낌표);glob 스타일 와일드카드
@geindex - (마이너스);glob 스타일 와일드카드


@multitable {xxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

패턴

@tab

의미

@item

@code{*}

@tab

모든 것과 일치합니다

@item

@code{?}

@tab

모든 단일 문자와 일치합니다

@item

@code{[seq]}

@tab

`seq'의 모든 문자와 일치합니다.

@item

@code{[!seq]}

@tab

`seq'에 없는 모든 문자와 일치합니다

@end multitable


리터럴 일치의 경우, 대괄호 안에 메타 문자를 넣습니다. 예를 들어, @code{'[?]'}는 @code{'?'} 문자와 일치합니다.

@geindex 모듈;glob

파일명 분리 기호(유닉스에서 @code{'/'})는 이 모듈에서 특수하지 `않습니다'. 경로명 확장은 모듈 @ref{68,,glob}을 참조하십시오 (@code{glob}은 경로명 세그먼트와 일치시키기 위해 @ref{1c54,,filter()}를 사용합니다). 마찬가지로, 마침표로 시작하는 파일명은 이 모듈에서 특수하지 않으며, @code{*} 및 @code{?} 패턴과 일치합니다.

Unless stated otherwise, “filename string” and “pattern string” either refer to
@ref{169,,str} or @code{ISO-8859-1} encoded @ref{192,,bytes} objects. Note that the
functions documented below do not allow to mix a @code{bytes} pattern with
a @code{str} filename, and vice-versa.

Finally, note that @ref{be1,,functools.lru_cache()} with a `maxsize' of 32768
is used to cache the (typed) compiled regex patterns in the following
functions: @ref{60,,fnmatch()}, @ref{1c53,,fnmatchcase()}, @ref{1c54,,filter()}, @ref{211,,filterfalse()}.

@geindex fnmatch() (fnmatch 모듈)
@anchor{library/fnmatch fnmatch fnmatch}@anchor{1c52}
@deffn {함수} fnmatch.fnmatch (name, pat)

파일명 문자열 `name'이 패턴 문자열 `pat'와 일치하는지를 검사하여, @code{True} 나 @code{False}를 반환합니다. 두 매개 변수는 모두 @ref{2c7d,,os.path.normcase()}를 사용하여 대소 문자를 정규화합니다. @ref{1c53,,fnmatchcase()}는 운영 체제의 표준인지에 관계없이, 대소문자를 구분하는 비교를 수행하는 데 사용할 수 있습니다.

이 예제는 현재 디렉터리의 확장자 @code{.txt} 인 모든 파일 이름을 인쇄합니다:

@example
import fnmatch
import os

for file in os.listdir('.'):
    if fnmatch.fnmatch(file, '*.txt'):
        print(file)
@end example
@end deffn

@geindex fnmatchcase() (fnmatch 모듈)
@anchor{library/fnmatch fnmatch fnmatchcase}@anchor{1c53}
@deffn {함수} fnmatch.fnmatchcase (name, pat)

파일명 문자열 `name'이 패턴 문자열 `pat'와 일치하는지를 검사하여, @code{True} 나 @code{False}를 반환합니다; 비교는 대소 문자를 구분하며, @ref{2c7d,,os.path.normcase()}를 적용하지 않습니다.
@end deffn

@geindex filter() (fnmatch 모듈)
@anchor{library/fnmatch fnmatch filter}@anchor{1c54}
@deffn {함수} fnmatch.filter (names, pat)

패턴 문자열 `pat'와 일치하는 파일명 문자열의 @ref{142c,,이터러블} `names'의 요소로 리스트를 구축합니다. @code{[n for n in names if fnmatch(n, pat)]}과 같지만, 더 효율적으로 구현됩니다.
@end deffn

@geindex filterfalse() (fnmatch 모듈)
@anchor{library/fnmatch fnmatch filterfalse}@anchor{211}
@deffn {함수} fnmatch.filterfalse (names, pat)

Construct a list from those elements of the @ref{142c,,iterable} of filename
strings `names' that do not match the pattern string `pat'.
It is the same as @code{[n for n in names if not fnmatch(n, pat)]},
but implemented more efficiently.


Added in version 3.14.

@end deffn

@geindex translate() (fnmatch 모듈)
@anchor{library/fnmatch fnmatch translate}@anchor{1851}
@deffn {함수} fnmatch.translate (pat)

셸 스타일의 패턴 `pat'를 @ref{1432,,re.match()}에서 사용하기 위해 정규식으로 변환한 값을 반환합니다. 패턴은 @ref{169,,str}일 것으로 기대합니다.

예제:

@example
>>> import fnmatch, re
>>>
>>> regex = fnmatch.translate('*.txt')
>>> regex
'(?s:.*\\.txt)\\z'
>>> reobj = re.compile(regex)
>>> reobj.match('foobar.txt')
<re.Match object; span=(0, 10), match='foobar.txt'>
@end example
@end deffn


@subsubheading 더 보기



@table @asis

@item 모듈 @ref{68,,glob}

유닉스 셸 스타일 경로 확장.
@end table


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node linecache — 텍스트 줄에 대한 무작위 액세스,shutil — 고수준 파일 연산,fnmatch — 유닉스 파일명 패턴 일치,파일과 디렉터리 액세스
@anchor{library/linecache doc}@anchor{2d03}@anchor{library/linecache linecache-random-access-to-text-lines}@anchor{2d04}@anchor{library/linecache module-linecache}@anchor{89}@anchor{library/linecache translation-repo}@anchor{2d05}
@subsection @code{linecache} — 텍스트 줄에 대한 무작위 액세스


@geindex module; linecache

`소스 코드:' Lib/linecache.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/linecache.py}


__________________________________________________________________


The @code{linecache} module allows one to get any line from a Python source file, while
attempting to optimize internally, using a cache, the common case where many
lines are read from a single file.  This is used by the @ref{104,,traceback} module
to retrieve source lines for inclusion in  the formatted traceback.

@ref{2d06,,tokenize.open()} 함수가 파일을 여는 데 사용됩니다. 이 함수는 @ref{17be,,tokenize.detect_encoding()}를 사용하여 파일의 인코딩을 가져옵니다; 인코딩 토큰이 없으면, 파일 인코딩의 기본값은 UTF-8입니다.

The @code{linecache} module defines the following functions:

@geindex getline() (linecache 모듈)
@anchor{library/linecache linecache getline}@anchor{240}
@deffn {함수} linecache.getline (filename, lineno, module_globals=None)

`filename' 파일에서 `lineno' 줄을 가져옵니다. 이 함수는 절대 예외를 발생시키지 않을 것입니다 — 에러 시 @code{'@w{'}}를 반환합니다 (발견된 줄의 줄 바꿈 문자는 포함됩니다).

@geindex 모듈;검색;경로

If `filename' indicates a frozen module (starting with @code{'<frozen '}), the function
will attempt to get the real file name from @code{module_globals['__file__']} if
`module_globals' is not @code{None}.

`filename'이라는 파일이 없으면, 이 함수는 먼저 `module_globals'에서 
@geindex Python 향상 제안; PEP 302
PEP 302@footnote{https://peps.python.org/pep-0302/} @code{__loader__}를 확인합니다. 그런 로더가 있고 @code{get_source} 메서드를 정의하고 있으면, 그것이 소스 줄을 결정합니다 (@code{get_source()}가 @code{None}을 반환하면, @code{'@w{'}}이 반환됩니다). 마지막으로, `filename'이 상대 파일명이면, 모듈 검색 경로, @code{sys.path}, 에 있는 항목들에 상대적으로 검색됩니다.


버전 3.14에서 변경: Support `filename' of frozen modules.

@end deffn

@geindex clearcache() (linecache 모듈)
@anchor{library/linecache linecache clearcache}@anchor{2d07}
@deffn {함수} linecache.clearcache ()

캐시를 지웁니다. 이전에 @ref{240,,getline()}를 사용하여 읽은 파일의 줄이 더는 필요하지 않으면 이 함수를 사용하십시오.
@end deffn

@geindex checkcache() (linecache 모듈)
@anchor{library/linecache linecache checkcache}@anchor{18ec}
@deffn {함수} linecache.checkcache (filename=None)

캐시의 유효성을 확인합니다. 캐시의 파일이 디스크에서 변경되었을 수 있고, 갱신된 버전이 필요하면 이 함수를 사용하십시오. `filename'이 생략되면, 캐시의 모든 항목을 검사합니다.
@end deffn

@geindex lazycache() (linecache 모듈)
@anchor{library/linecache linecache lazycache}@anchor{1023}
@deffn {함수} linecache.lazycache (filename, module_globals)

이후 호출에서 `module_globals'가 @code{None}이더라도 @ref{240,,getline()}을 통해 나중에 해당 줄을 가져올 수 있도록, 파일 기반이 아닌 모듈에 대한 충분한 정보를 캡처합니다. 이렇게 하면 라인이 실제로 필요할 때까지 모듈 전역을 무기한으로 들고 있지 않고도 I/O를 회피합니다.


Added in version 3.5.

@end deffn

예제:

@example
>>> import linecache
>>> linecache.getline(linecache.__file__, 8)
'import sys\n'
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node shutil — 고수준 파일 연산,,linecache — 텍스트 줄에 대한 무작위 액세스,파일과 디렉터리 액세스
@anchor{library/shutil doc}@anchor{2d08}@anchor{library/shutil module-shutil}@anchor{ca}@anchor{library/shutil shutil-high-level-file-operations}@anchor{2d09}@anchor{library/shutil translation-repo}@anchor{2d0a}
@subsection @code{shutil} — 고수준 파일 연산


@geindex module; shutil

@c partly based on the docstrings

`소스 코드:' Lib/shutil.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/shutil.py}

@geindex 파일;복사하기
@geindex 파일 복사하기


__________________________________________________________________


The @code{shutil} module offers a number of high-level operations on files and
collections of files.  In particular, functions are provided  which support file
copying and removal. For operations on individual files, see also the
@ref{a5,,os} module.

@cartouche
@quotation 경고 
더 고수준의 파일 복사 함수(@ref{c4e,,shutil.copy()}, @ref{c4f,,shutil.copy2()})조차도 모든 파일 메타 데이터를 복사할 수는 없습니다.

POSIX 플랫폼에서, 이는 ACL뿐만 아니라 파일 소유자와 그룹이 유실됨을 의미합니다. Mac OS에서는, 리소스 포크(resource fork)와 기타 메타 데이터가 사용되지 않습니다. 이는 리소스가 손실되고 파일 유형과 작성자 코드가 올바르지 않음을 의미합니다. 윈도우에서는, 파일 소유자, ACL 및 대체 데이터 스트림(alternate data streams)이 복사되지 않습니다.
@end quotation
@end cartouche

@menu
* 디렉터리와 파일 연산:: 
* 아카이브 연산:: 
* 출력 터미널의 크기 조회하기:: 

@end menu

@node 디렉터리와 파일 연산,아카이브 연산,,shutil — 고수준 파일 연산
@anchor{library/shutil directory-and-files-operations}@anchor{2d0b}@anchor{library/shutil file-operations}@anchor{2d0c}
@subsubsection 디렉터리와 파일 연산


@geindex copyfileobj() (shutil 모듈)
@anchor{library/shutil shutil copyfileobj}@anchor{c51}
@deffn {함수} shutil.copyfileobj (fsrc, fdst[, length])

@ref{13c8,,파일류 객체} `fsrc'의 내용을 파일류 객체 `fdst'에 복사합니다. 주어지면, 정수 `length'는 버퍼 크기입니다. 특히, 음의 `length' 값은 청크 단위로 소스 데이터를 반복하지 않고 데이터를 복사하는 것을 의미합니다; 기본적으로 제어되지 않은 메모리 소비를 피하고자 데이터를 청크로 읽습니다. `fsrc' 객체의 현재 파일 위치가 0이 아니면, 현재 파일 위치에서 파일 끝까지의 내용만 복사됨에 유의하십시오.

@code{copyfileobj()} will `not' guarantee that the destination stream has
been flushed on completion of the copy. If you want to read from the
destination at the completion of the copy operation (for example, reading
the contents of a temporary file that has been copied from a HTTP stream),
you must ensure that you have called @ref{2d0d,,flush()} or
@ref{505,,close()} on the file-like object before attempting to read
the destination file.
@end deffn

@geindex copyfile() (shutil 모듈)
@anchor{library/shutil shutil copyfile}@anchor{c4d}
@deffn {함수} shutil.copyfile (src, dst, *, follow_symlinks=True)

가능한 가장 효율적인 방법으로 이름이 `src' 인 파일의 내용을 (메타 데이터 없이) 이름이 `dst' 인 파일에 복사하고 `dst'를 반환합니다. `src'와 `dst'는 @ref{5a0,,경로류 객체}나 문자열로 지정된 경로 이름입니다.

`dst'는 완전한 대상 파일 이름이어야 합니다; 대상 디렉터리 경로를 허용하는 복사는 @ref{c4e,,copy()}를 참조하십시오. `src'와 `dst'가 같은 파일을 지정하면, @ref{119d,,SameFileError}가 발생합니다.

대상 위치는 쓰기 가능해야 합니다; 그렇지 않으면, @ref{2c0,,OSError} 예외가 발생합니다. `dst'가 이미 존재하면, 교체됩니다. 문자나 블록 장치 및 파이프와 같은 특수 파일은 이 함수로 복사할 수 없습니다.

`follow_symlinks'가 거짓이고 `src'가 심볼릭 링크이면, `src'가 가리키는 파일을 복사하는 대신 새 심볼릭 링크가 만들어집니다.

인자 @code{src}, @code{dst}로 @ref{1c6c,,감사 이벤트} @code{shutil.copyfile}을 발생시킵니다.


버전 3.3에서 변경: 예전에는 @ref{2c0,,OSError} 대신 @ref{1252,,IOError}를 발생시켰습니다. `follow_symlinks' 인자가 추가되었습니다. 이제 `dst'를 반환합니다.



버전 3.4에서 변경: @ref{119c,,Error} 대신 @ref{119d,,SameFileError}를 발생시킵니다. 후자는 전자의 서브 클래스라서, 이 변경은 이전 버전과 호환됩니다.



버전 3.8에서 변경: 파일을 더 효율적으로 복사하기 위해 플랫폼별 빠른 복사(fast-copy) 시스템 호출을 내부적으로 사용할 수 있습니다. @ref{c52,,플랫폼 의존적 효율적인 복사 연산} 섹션을 참조하십시오.

@end deffn

@geindex SpecialFileError
@anchor{library/shutil shutil SpecialFileError}@anchor{1520}
@deffn {예외} shutil.SpecialFileError

This exception is raised when @ref{c4d,,copyfile()} or @ref{c1d,,copytree()} attempt
to copy a named pipe.


Added in version 2.7.

@end deffn

@geindex SameFileError
@anchor{library/shutil shutil SameFileError}@anchor{119d}
@deffn {예외} shutil.SameFileError

이 예외는 @ref{c4d,,copyfile()}의 소스와 대상이 같은 파일일 때 발생합니다.


Added in version 3.4.

@end deffn

@geindex copymode() (shutil 모듈)
@anchor{library/shutil shutil copymode}@anchor{1a24}
@deffn {함수} shutil.copymode (src, dst, *, follow_symlinks=True)

`src'에서 `dst'로 권한 비트를 복사합니다. 파일 내용, 소유자 및 그룹은 영향을 받지 않습니다. `src'와 `dst'는 @ref{5a0,,경로류 객체}나 문자열로 지정된 경로 이름입니다. `follow_symlinks'가 거짓이고 `src'와 `dst'가 모두 심볼릭 링크이면, @ref{1a24,,copymode()}는 (가리키는 파일이 아니라) `dst' 자체의 모드를 수정하려고 시도합니다. 이 기능이 모든 플랫폼에서 사용 가능한 것은 아닙니다; 자세한 내용은 @ref{1333,,copystat()}을 참조하십시오. @code{copymode()}가 로컬 플랫폼에서 심볼릭 링크를 수정할 수 없고, 그렇게 하도록 요청받으면, 아무것도 하지 않고 반환합니다.

인자 @code{src}, @code{dst}로 @ref{1c6c,,감사 이벤트} @code{shutil.copymode}를 발생시킵니다.


버전 3.3에서 변경: `follow_symlinks' 인자가 추가되었습니다.

@end deffn

@geindex copystat() (shutil 모듈)
@anchor{library/shutil shutil copystat}@anchor{1333}
@deffn {함수} shutil.copystat (src, dst, *, follow_symlinks=True)

권한 비트, 마지막 액세스 시간, 마지막 수정 시간 및 플래그를 `src'에서 `dst'로 복사합니다. 리눅스에서 @ref{1333,,copystat()}은 가능하면 “확장 어트리뷰트(extended attributes)”도 복사합니다. 파일 내용, 소유자 및 그룹은 영향을 받지 않습니다. `src'와 `dst'는 @ref{5a0,,경로류 객체}나 문자열로 지정된 경로 이름입니다.

`follow_symlinks'가 거짓이고 `src'와 `dst'가 모두 심볼릭 링크를 참조하면, @ref{1333,,copystat()}은 심볼릭 링크가 참조하는 파일이 아닌 심볼릭 링크 자체에 대해 작동합니다 - `src' 심볼릭 링크에서 정보를 읽고, `dst' 심볼릭 링크로 정보를 씁니다.

@cartouche
@quotation 참고 
모든 플랫폼이 심볼릭 링크를 검사하고 수정할 수 있는 기능을 제공하지는 않습니다. 파이썬 자체는 어떤 기능이 로컬에서 사용 가능한지 알려줄 수 있습니다.


@itemize *

@item 
@code{os.chmod in os.supports_follow_symlinks}가 @code{True}이면, @ref{1333,,copystat()}은 심볼릭 링크의 권한 비트를 수정할 수 있습니다.

@item 
@code{os.utime in os.supports_follow_symlinks}가 @code{True}이면, @ref{1333,,copystat()}은 심볼릭 링크의 마지막 액세스와 수정 시간을 수정할 수 있습니다.

@item 
@code{os.chflags in os.supports_follow_symlinks}가 @code{True}이면, @ref{1333,,copystat()}은 심볼릭 링크의 플래그를 수정할 수 있습니다. (@code{os.chflags}가 모든 플랫폼에서 사용 가능한 것은 아닙니다.)
@end itemize

이 기능 중 일부나 전부를 사용할 수 없는 플랫폼에서, 심볼릭 링크를 수정하라는 요청을 하면, @ref{1333,,copystat()}은 가능한 모든 것들을 복사합니다. @code{copystat()}은 절대 실패를 반환하지 않습니다.

자세한 내용은 @ref{12fd,,os.supports_follow_symlinks}를 참조하십시오.
@end quotation
@end cartouche

인자 @code{src}, @code{dst}로 @ref{1c6c,,감사 이벤트} @code{shutil.copystat}을 발생시킵니다.


버전 3.3에서 변경: `follow_symlinks' 인자와 리눅스 확장 어트리뷰트 지원을 추가했습니다.

@end deffn

@geindex copy() (shutil 모듈)
@anchor{library/shutil shutil copy}@anchor{c4e}
@deffn {함수} shutil.copy (src, dst, *, follow_symlinks=True)

파일 `src'를 파일이나 디렉터리 `dst'에 복사합니다. `src'와 `dst'는 @ref{5a0,,경로류 객체}나 문자열이어야 합니다. `dst'가 디렉터리를 지정하면, 파일은 `src'의 기본 파일명을 사용하여 `dst'로 복사됩니다. `dst'가 이미 존재하는 파일을 지정하면 대체됩니다. 새로 만든 파일의 경로를 반환합니다.

`follow_symlinks'가 거짓이고, `src'가 심볼릭 링크이면, `dst'는 심볼릭 링크로 만들어집니다. `follow_symlinks'가 참이고 `src'가 심볼릭 링크이면, `dst'는 `src'가 참조하는 파일의 사본이 됩니다.

@ref{c4e,,copy()}는 파일 데이터와 파일의 권한 모드(@ref{529,,os.chmod()}를 참조하십시오)를 복사합니다. 파일의 생성과 수정 시간과 같은 다른 메타 데이터는 유지되지 않습니다. 원본의 모든 파일 메타 데이터를 유지하려면 대신 @ref{c4f,,copy2()}를 사용하십시오.

인자 @code{src}, @code{dst}로 @ref{1c6c,,감사 이벤트} @code{shutil.copyfile}을 발생시킵니다.

인자 @code{src}, @code{dst}로 @ref{1c6c,,감사 이벤트} @code{shutil.copymode}를 발생시킵니다.


버전 3.3에서 변경: `follow_symlinks' 인자가 추가되었습니다. 이제 새로 만든 파일의 경로를 반환합니다.



버전 3.8에서 변경: 파일을 더 효율적으로 복사하기 위해 플랫폼별 빠른 복사(fast-copy) 시스템 호출을 내부적으로 사용할 수 있습니다. @ref{c52,,플랫폼 의존적 효율적인 복사 연산} 섹션을 참조하십시오.

@end deffn

@geindex copy2() (shutil 모듈)
@anchor{library/shutil shutil copy2}@anchor{c4f}
@deffn {함수} shutil.copy2 (src, dst, *, follow_symlinks=True)

@ref{c4f,,copy2()}가 파일 메타 데이터 보존도 시도한다는 점을 제외하고는 @ref{c4e,,copy()}와 동일합니다.

`follow_symlinks'가 거짓이고, `src'가 심볼릭 링크이면, @ref{c4f,,copy2()}는 `src' 심볼릭 링크의 모든 메타 데이터를 새로 만들어진 `dst' 심볼릭 링크로 복사하려고 시도합니다. 그러나, 이 기능이 모든 플랫폼에서 사용 가능한 것은 아닙니다. 이 기능의 일부나 전부를 사용할 수 없는 플랫폼에서, @code{copy2()}는 가능한 모든 메타 데이터를 보존합니다; @code{copy2()}는 파일 메타 데이터를 보존할 수 없다는 이유로 예외를 발생시키지 않습니다.

@ref{c4f,,copy2()}는 @ref{1333,,copystat()}을 사용하여 파일 메타 데이터를 복사합니다. 심볼릭 링크 메타 데이터 수정을 위한 플랫폼 지원에 대한 자세한 정보는 @code{copystat()}을 참조하십시오.

인자 @code{src}, @code{dst}로 @ref{1c6c,,감사 이벤트} @code{shutil.copyfile}을 발생시킵니다.

인자 @code{src}, @code{dst}로 @ref{1c6c,,감사 이벤트} @code{shutil.copystat}을 발생시킵니다.


버전 3.3에서 변경: `follow_symlinks' 인자를 추가하고, 확장 파일 시스템 어트리뷰트도 복사하려고 합니다 (현재 리눅스만 해당합니다). 이제 새로 만든 파일의 경로를 반환합니다.



버전 3.8에서 변경: 파일을 더 효율적으로 복사하기 위해 플랫폼별 빠른 복사(fast-copy) 시스템 호출을 내부적으로 사용할 수 있습니다. @ref{c52,,플랫폼 의존적 효율적인 복사 연산} 섹션을 참조하십시오.

@end deffn

@geindex ignore_patterns() (shutil 모듈)
@anchor{library/shutil shutil ignore_patterns}@anchor{2d0e}
@deffn {함수} shutil.ignore_patterns (*patterns)

이 팩토리 함수는 @ref{c1d,,copytree()}의 `ignore' 인자를 위한 콜러블 함수로 사용할 수 있는 함수를 만드는데, 제공된 glob 스타일 `patterns' 중 하나와 일치하는 파일과 디렉터리를 무시하도록 합니다. 아래 예를 참조하십시오.
@end deffn

@geindex copytree() (shutil 모듈)
@anchor{library/shutil shutil copytree}@anchor{c1d}
@deffn {함수} shutil.copytree (src, dst, symlinks=False, ignore=None, copy_function=copy2, ignore_dangling_symlinks=False, dirs_exist_ok=False)

`src'를 루트로 하는 전체 디렉터리 트리를 `dst'라는 디렉터리에 재귀적으로 복사하고 대상 디렉터리를 반환합니다. `dst'를 포함해야 하는 모든 중간 디렉터리도 기본적으로 생성됩니다.

디렉터리의 권한과 시간은 @ref{1333,,copystat()}으로 복사되고, 개별 파일은 @ref{c4f,,copy2()}를 사용하여 복사됩니다.

`symlinks'가 참이면, 소스 트리의 심볼릭 링크가 새 트리에서 심볼릭 링크로 표시되고 플랫폼이 허용하는 한 원래 링크의 메타 데이터가 복사됩니다; 거짓이거나 생략되면, 링크된 파일의 내용과 메타 데이터가 새 트리에 복사됩니다.

`symlinks'가 거짓이면, 심볼릭 링크가 가리키는 파일이 존재하지 않으면, 복사 과정 종료 시 발생하는 @ref{119c,,Error} 예외의 에러 리스트에 예외가 추가됩니다. 이 예외를 침묵시키려면 선택적 `ignore_dangling_symlinks' 플래그를 참으로 설정할 수 있습니다. 이 옵션은 @ref{12f9,,os.symlink()}를 지원하지 않는 플랫폼에는 영향을 미치지 않음에 주목하십시오.

`ignore'가 주어지면, @ref{c1d,,copytree()}가 방문하는 디렉터리와 @ref{12ff,,os.listdir()}가 반환한 이 디렉터리 내용의 리스트를 인자로 수신하는 콜러블 이어야 합니다. @code{copytree()}는 재귀적으로 호출되기 때문에, 복사되는 디렉터리마다 `ignore' 콜러블이 한 번 호출됩니다. 콜러블은 현재 디렉터리에 상대적인 디렉터리와 파일 이름의 시퀀스를 반환해야 합니다 (즉, 두 번째 인자에 있는 항목의 부분집합); 이 이름들은 복사 과정에서 무시됩니다. @ref{2d0e,,ignore_patterns()}를 사용하여 glob 스타일 패턴을 기반으로 이름을 무시하는 콜러블을 만들 수 있습니다.

예외가 발생하면, 이유 리스트와 함께 @ref{119c,,Error}가 발생합니다.

`copy_function'이 제공되면, 각 파일을 복사하는 데 사용되는 콜러블 이어야 합니다. 소스 경로와 대상 경로를 인자로 호출됩니다. 기본적으로, @ref{c4f,,copy2()}가 사용되지만, 같은 서명을 지원하는 (@ref{c4e,,copy()}와 같은) 모든 함수를 사용할 수 있습니다.

If `dirs_exist_ok' is false (the default) and `dst' already exists, a
@ref{121f,,FileExistsError} is raised. If `dirs_exist_ok' is true, the copying
operation will continue if it encounters existing directories, and files
within the `dst' tree will be overwritten by corresponding files from the
`src' tree.

인자 @code{src}, @code{dst}로 @ref{1c6c,,감사 이벤트} @code{shutil.copytree}를 발생시킵니다.


버전 3.2에서 변경: 사용자 정의 복사 함수를 제공할 수 있도록 `copy_function' 인자를 추가했습니다. `symlinks'가 거짓일 때 연결이 끊긴(dangling) 심볼릭 링크 에러를 침묵시키도록 `ignore_dangling_symlinks' 인자를 추가했습니다.



버전 3.3에서 변경: `symlinks'가 거짓일 때 메타 데이터를 복사합니다. 이제 `dst'를 반환합니다.



버전 3.8에서 변경: 파일을 더 효율적으로 복사하기 위해 플랫폼별 빠른 복사(fast-copy) 시스템 호출을 내부적으로 사용할 수 있습니다. @ref{c52,,플랫폼 의존적 효율적인 복사 연산} 섹션을 참조하십시오.



버전 3.8에서 변경: `dirs_exist_ok' 매개 변수를 추가했습니다.

@end deffn

@geindex rmtree() (shutil 모듈)
@anchor{library/shutil shutil rmtree}@anchor{356}
@deffn {함수} shutil.rmtree (path, ignore_errors=False, onerror=None, *, onexc=None, dir_fd=None)

@geindex 디렉터리;삭제하기

전체 디렉터리 트리를 삭제합니다; `path'는 디렉터리를 가리켜야 합니다 (하지만 디렉터리에 대한 심볼릭 링크는 아닙니다). `ignore_errors'가 참이면, 삭제 실패로 인한 에러는 무시됩니다; 거짓이거나 생략되면, 이러한 에러는 `onexc'나 `onerror'로 지정된 처리기를 호출하여 처리하거나, 모두 생략하면 예외는 호출자에게 전파됩니다.

This function can support @ref{12ef,,paths relative to directory descriptors}.

@cartouche
@quotation 참고 
필요한 fd 기반 함수를 지원하는 플랫폼에서는 기본적으로 @ref{356,,rmtree()}의 심볼릭 링크 공격 방지 버전이 사용됩니다. 다른 플랫폼에서는, @code{rmtree()} 구현이 심볼릭 링크 공격에 취약합니다: 적절한 타이밍과 상황에 따라, 공격자는 파일 시스템에서 심볼릭 링크를 조작하여 다른 방법으로는 액세스할 수 없는 파일을 삭제할 수 있습니다. 응용 프로그램은 @ref{2d0f,,rmtree.avoids_symlink_attacks} 함수 어트리뷰트를 사용하여 어떤 버전이 사용되는지 판별할 수 있습니다.
@end quotation
@end cartouche

`onexc'가 제공되면, 세 가지 매개 변수를 받아들이는 콜러블 이어야 합니다: `function', `path' 및 `excinfo'.

첫 번째 매개 변수 `function'은 예외를 발생시킨 함수입니다; 플랫폼과 구현에 따라 다릅니다. 두 번째 매개 변수 `path'는 `function'에 전달된 경로 이름입니다. 세 번째 매개 변수 `excinfo'는 발생한 예외입니다. `onexc'에 의해 발생한 예외는 포착되지 않습니다.

The deprecated `onerror' is similar to `onexc', except that the third
parameter it receives is the tuple returned from @ref{899,,sys.exc_info()}.


@subsubheading 더 보기


@ref{2d10,,rmtree 예} for an example of handling the removal
of a directory tree that contains read-only files.


인자 @code{path}, @code{dir_fd}로 @ref{1c6c,,감사 이벤트} @code{shutil.rmtree}를 발생시킵니다.


버전 3.3에서 변경: 플랫폼이 fd 기반 함수를 지원하면 자동으로 사용되는 심볼릭 링크 공격 방지 버전을 추가했습니다.



버전 3.8에서 변경: 윈도우에서, 정션(junction)을 제거하기 전에 더는 디렉터리 정션의 내용을 삭제하지 않습니다.



버전 3.11에서 변경: `dir_fd' 매개 변수를 추가했습니다.



버전 3.12에서 변경: Added the `onexc' parameter, deprecated `onerror'.



버전 3.13에서 변경: @code{rmtree()} now ignores @ref{264,,FileNotFoundError} exceptions for all
but the top-level path.
Exceptions other than @ref{2c0,,OSError} and subclasses of @code{OSError}
are now always propagated to the caller.


@geindex avoids_symlink_attacks (shutil.rmtree의 속성)
@anchor{library/shutil shutil rmtree avoids_symlink_attacks}@anchor{2d0f}
@deffn {속성} rmtree.avoids_symlink_attacks

현재 플랫폼과 구현이 @ref{356,,rmtree()}의 심볼릭 링크 공격 방지 버전을 제공하는지를 나타냅니다. 현재 이것은 fd 기반 디렉터리 액세스 함수를 지원하는 플랫폼에서만 참입니다.


Added in version 3.3.

@end deffn
@end deffn

@geindex move() (shutil 모듈)
@anchor{library/shutil shutil move}@anchor{c50}
@deffn {함수} shutil.move (src, dst, copy_function=copy2)

파일이나 디렉터리(`src')를 다른 위치로 재귀적으로 옮기고 대상을 반환합니다.

대상이 기존 디렉터리이거나 디렉터리를 가리키는 심볼릭 링크면, `src'가 해당 디렉터리 내로 이동됩니다. 해당 디렉터리 내의 대상 경로는 이미 존재해서는 안 됩니다.

`dst'가 이미 존재하지만, 디렉터리가 아니면, @ref{12f6,,os.rename()} 의미에 따라 덮어쓸 수 있습니다.

대상이 현재 파일 시스템에 있으면, @ref{12f6,,os.rename()}이 사용됩니다. 그렇지 않으면, `copy_function'을 사용하여 `src'를 대상으로 복사한 다음 제거합니다. 심볼릭 링크의 경우, `src'의 대상을 가리키는 새 심볼릭 링크가 대상으로 만들어지고 `src'가 제거됩니다.

`copy_function'이 제공되면, `src'와 대상 두 개의 인자를 취하는 콜러블 이어야 하며, @ref{12f6,,os.rename()}을 사용할 수 없을 때 `src'를 대상으로 복사하는 데 사용됩니다. 소스가 디렉터리이면, @ref{c1d,,copytree()}가 호출되고 `copy_function'을 전달합니다. 기본 `copy_function'은 @ref{c4f,,copy2()}입니다. `copy_function'으로 @ref{c4e,,copy()}를 사용하면 메타 데이터를 복사하지 않는 비용을 지불하는 대신 메타 데이터도 복사할 때 실패하는 이동이 성공할 수 있습니다.

인자 @code{src}, @code{dst}로 @ref{1c6c,,감사 이벤트} @code{shutil.move}를 발생시킵니다.


버전 3.3에서 변경: 외부 파일 시스템에 대한 명시적 심볼릭 링크 처리를 추가하여, GNU @code{mv}의 동작에 맞게 조정했습니다. 이제 `dst'를 반환합니다.



버전 3.5에서 변경: `copy_function' 키워드 인자를 추가했습니다.



버전 3.8에서 변경: 파일을 더 효율적으로 복사하기 위해 플랫폼별 빠른 복사(fast-copy) 시스템 호출을 내부적으로 사용할 수 있습니다. @ref{c52,,플랫폼 의존적 효율적인 복사 연산} 섹션을 참조하십시오.



버전 3.9에서 변경: `src'와 `dst' 모두에 대해 @ref{5a0,,경로류 객체}를 받아들입니다.

@end deffn

@geindex disk_usage() (shutil 모듈)
@anchor{library/shutil shutil disk_usage}@anchor{1332}
@deffn {함수} shutil.disk_usage (path)

지정된 경로(path)에 대한 디스크 사용량 통계를 `total', `used' 및 `free' 어트리뷰트를 갖는 @ref{85d,,네임드 튜플}로 반환합니다. 이들은 바이트 단위의 총, 사용된, 여유 공간의 양입니다. `path'는 파일이나 디렉터리일 수 있습니다.

@cartouche
@quotation 참고 
On Unix filesystems, `path' must point to a path within a `mounted'
filesystem partition. On those platforms, CPython doesn’t attempt to
retrieve disk usage information from non-mounted filesystems.
@end quotation
@end cartouche


Added in version 3.3.



버전 3.8에서 변경: 윈도우에서, `path'는 이제 파일이나 디렉터리일 수 있습니다.


@ref{213c,,가용성}: Unix, Windows.
@end deffn

@geindex chown() (shutil 모듈)
@anchor{library/shutil shutil chown}@anchor{548}
@deffn {함수} shutil.chown (path, user=None, group=None, *, dir_fd=None, follow_symlinks=True)

주어진 `path'의 소유자 `user' 및/또는 `group'을 변경합니다.

`user'는 시스템 사용자 이름이나 uid 일 수 있습니다; `group'도 마찬가지입니다. 최소한 하나의 인자가 필요합니다.

하부 함수인 @ref{12f3,,os.chown()}도 참조하십시오.

인자 @code{path}, @code{user}, @code{group}으로 @ref{1c6c,,감사 이벤트} @code{shutil.chown}을 발생시킵니다.

@ref{213c,,가용성}: Unix.


Added in version 3.3.



버전 3.13에서 변경: `dir_fd' 와 `follow_symlinks' 매개 변수가 추가되었습니다.

@end deffn

@geindex which() (shutil 모듈)
@anchor{library/shutil shutil which}@anchor{6da}
@deffn {함수} shutil.which (cmd, mode=os.F_OK | os.X_OK, path=None)

주어진 `cmd'가 호출되면 실행될 실행 파일의 경로를 반환합니다. 아무런 `cmd'도 호출되지 않을 것이라면, @code{None}을 반환합니다.

`mode'는 @ref{12f1,,os.access()}에 전달되는 권한 마스크입니다, 기본적으로 파일이 존재하고 실행 가능한지를 판단합니다.

`path' is a “@code{PATH} string” specifying the directories to look in,
delimited by @ref{2131,,os.pathsep}. When no `path' is specified, the
@geindex PATH
@geindex 환경 변수; PATH
@code{PATH} environment variable is read from @ref{259,,os.environ},
falling back to @ref{1de1,,os.defpath} if it is not set.

If `cmd' contains a directory component, @code{which()} only checks the
specified path directly and does not search the directories listed in
`path' or in the system’s 
@geindex PATH
@geindex 환경 변수; PATH
@code{PATH} environment variable.

On Windows, the current directory is prepended to the `path' if `mode' does
not include @code{os.X_OK}. When the `mode' does include @code{os.X_OK}, the
Windows API @code{NeedCurrentDirectoryForExePathW} will be consulted to
determine if the current directory should be prepended to `path'. To avoid
consulting the current working directory for executables: set the environment
variable @code{NoDefaultCurrentDirectoryInExePath}.

또한 윈도우에서, 
@geindex PATHEXT
@geindex 환경 변수; PATHEXT
@code{PATHEXT} 환경 변수는 확장자가 포함되지 않은 명령을 해석하는 데 사용됩니다. 예를 들어, @code{shutil.which("python")}을 호출하면, @ref{6da,,which()}는 @code{PATHEXT}를 검색하여 `path' 디렉터리에서 @code{python.exe}를 찾아야 한다는 것을 알 수 있습니다. 예를 들어, 윈도우에서:

@example
>>> shutil.which("python")
'C:\\Python33\\python.EXE'
@end example

This is also applied when `cmd' is a path that contains a directory
component:

@example
>>> shutil.which("C:\\Python33\\python")
'C:\\Python33\\python.EXE'
@end example


Added in version 3.3.



버전 3.8에서 변경: 이제 @ref{192,,bytes} 형을 받아들입니다. `cmd' 형이 @code{bytes}이면 결과 형도 @code{bytes}입니다.



버전 3.12에서 변경: On Windows, the current directory is no longer prepended to the search
path if `mode' includes @code{os.X_OK} and WinAPI
@code{NeedCurrentDirectoryForExePathW(cmd)} is false, else the current
directory is prepended even if it is already in the search path;
@code{PATHEXT} is used now even when `cmd' includes a directory component
or ends with an extension that is in @code{PATHEXT}; and filenames that
have no extension can now be found.

@end deffn

@geindex Error
@anchor{library/shutil shutil Error}@anchor{119c}
@deffn {예외} shutil.Error

이 예외는 다중 파일 연산 중에 발생한 예외를 수집합니다. @ref{c1d,,copytree()}의 경우, 예외 인자는 3-튜플(`srcname', `dstname', `exception')의 리스트입니다.
@end deffn

@menu
* 플랫폼 의존적 효율적인 복사 연산:: 
* copytree 예:: 
* rmtree 예:: 

@end menu

@node 플랫폼 의존적 효율적인 복사 연산,copytree 예,,디렉터리와 파일 연산
@anchor{library/shutil platform-dependent-efficient-copy-operations}@anchor{2d11}@anchor{library/shutil shutil-platform-dependent-efficient-copy-operations}@anchor{c52}
@subsubsection 플랫폼 의존적 효율적인 복사 연산


파이썬 3.8부터, 파일 복사를 수반하는 모든 함수(@ref{c4d,,copyfile()}, @ref{c4e,,copy()}, @ref{c4f,,copy2()}, @ref{c1d,,copytree()} 및 @ref{c50,,move()})는 파일을 더 효율적으로 복사하기 위해 플랫폼별 “빠른 복사(fast-copy)” 시스템 호출을 사용할 수 있습니다 (bpo-33671@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33671}을 참조하십시오). “빠른 복사”는 복사 연산이 커널 내에서 발생하여, “@code{outfd.write(infd.read())}”와 같이 파이썬에서 사용자 공간 버퍼 사용을 피함을 의미합니다.

macOS에서는 fcopyfile@footnote{http://www.manpagez.com/man/3/copyfile/}이 (메타 데이터가 아닌) 파일 내용을 복사하는 데 사용됩니다.

On Linux @ref{18b5,,os.copy_file_range()} or @ref{d04,,os.sendfile()} is used.

On Solaris @ref{d04,,os.sendfile()} is used.

윈도우에서는 @ref{c4d,,shutil.copyfile()}이 더 큰 기본 버퍼 크기(64 KiB 대신 1 MiB)를 사용하고 @ref{c51,,shutil.copyfileobj()}의 @ref{165,,memoryview()} 기반 변형이 사용됩니다.

If the fast-copy operation fails and no data was written in the destination
file then shutil will silently fall back to less efficient
@ref{c51,,copyfileobj()} function internally.


버전 3.8에서 변경.



버전 3.14에서 변경: Solaris now uses @ref{d04,,os.sendfile()}.



버전 3.14에서 변경: Copy-on-write or server-side copy may be used internally via
@ref{18b5,,os.copy_file_range()} on supported Linux filesystems.


@node copytree 예,rmtree 예,플랫폼 의존적 효율적인 복사 연산,디렉터리와 파일 연산
@anchor{library/shutil copytree-example}@anchor{2d12}@anchor{library/shutil shutil-copytree-example}@anchor{2d13}
@subsubsection copytree 예


@ref{2d0e,,ignore_patterns()} 도우미를 사용하는 예:

@example
from shutil import copytree, ignore_patterns

copytree(source, destination, ignore=ignore_patterns('*.pyc', 'tmp*'))
@end example

이것은 @code{.pyc} 파일과 이름이 @code{tmp}로 시작하는 파일이나 디렉터리를 제외한 모든 것을 복사합니다.

로깅 호출을 추가하기 위해 `ignore' 인자를 사용하는 또 다른 예:

@example
from shutil import copytree
import logging

def _logpath(path, names):
    logging.info('Working in %s', path)
    return []   # 아무것도 무시되지 않습니다

copytree(source, destination, ignore=_logpath)
@end example

@node rmtree 예,,copytree 예,디렉터리와 파일 연산
@anchor{library/shutil rmtree-example}@anchor{2d14}@anchor{library/shutil shutil-rmtree-example}@anchor{2d10}
@subsubsection rmtree 예


이 예는 윈도우에서 일부 파일에 읽기 전용 비트가 설정된 디렉터리 트리를 삭제하는 방법을 보여줍니다. onexc 콜백을 사용하여 읽기 전용 비트를 지우고 삭제를 다시 시도합니다. 후속 실패는 전파됩니다.

@example
import os, stat
import shutil

def remove_readonly(func, path, _):
    "읽기 전용 비트를 지우고 삭제를 다시 시도합니다"
    os.chmod(path, stat.S_IWRITE)
    func(path)

shutil.rmtree(directory, onexc=remove_readonly)
@end example

@node 아카이브 연산,출력 터미널의 크기 조회하기,디렉터리와 파일 연산,shutil — 고수준 파일 연산
@anchor{library/shutil archiving-operations}@anchor{141d}@anchor{library/shutil id1}@anchor{2d15}
@subsubsection 아카이브 연산



Added in version 3.2.



버전 3.5에서 변경: `xztar' 형식에 대한 지원이 추가되었습니다.


압축 및 아카이브 된 파일을 만들고 읽는 고수준 유틸리티도 제공됩니다. 이들은 @ref{137,,zipfile}과 @ref{e4,,tarfile} 모듈에 의존합니다.

@geindex make_archive() (shutil 모듈)
@anchor{library/shutil shutil make_archive}@anchor{6d9}
@deffn {함수} shutil.make_archive (base_name, format[, root_dir[, base_dir[, verbose[, dry_run[, owner[, group[, logger]]]]]]])

아카이브 파일(가령 zip이나 tar)을 만들고 이름을 반환합니다.

`base_name'은 만들 파일의 이름인데, 경로를 포함하고 형식별 확장자는 제외합니다.

`format' is the archive format: one of
“zip” (if the @ref{139,,zlib} module is available), “tar”, “gztar” (if the
@code{zlib} module is available), “bztar” (if the @ref{14,,bz2} module is
available), “xztar” (if the @ref{8e,,lzma} module is available), or “zstdtar”
(if the @ref{23,,compression.zstd} module is available).

`root_dir'은 아카이브의 루트 디렉터리가 될 디렉터리입니다, 아카이브의 모든 경로는 이것에 상대적입니다; 예를 들어, 보통 아카이브를 만들기 전에 `root_dir'로 chdir 합니다.

`base_dir'은 아카이브를 시작할 디렉터리입니다; 즉, `base_dir'은 아카이브에 있는 모든 파일과 디렉터리의 공통 접두사가 됩니다. `base_dir'은 `root_dir'에 상대적으로 제공되어야 합니다. `base_dir'과 `root_dir'을 함께 사용하는 방법은 @ref{2d16,,base_dir을 사용한 아카이브 예}를 참조하십시오.

`root_dir'과 `base_dir'은 모두 현재 디렉터리가 기본값입니다.

`dry_run'이 참이면, 아카이브가 만들어지지 않지만, 실행될 연산이 `logger'에 로그 됩니다.

tar 아카이브를 만들 때 `owner와 *group'이 사용됩니다. 기본적으로, 현재 소유자와 그룹을 사용합니다.

`logger'는 
@geindex Python 향상 제안; PEP 282
PEP 282@footnote{https://peps.python.org/pep-0282/}와 호환되는 객체여야 합니다, 일반적으로 @ref{d45,,logging.Logger}의 인스턴스.

`verbose' 인자는 사용되지 않으며 폐지되었습니다.

인자 @code{base_name}, @code{format}, @code{root_dir}, @code{base_dir}로 @ref{1c6c,,감사 이벤트} @code{shutil.make_archive}를 발생시킵니다.

@cartouche
@quotation 참고 
This function is not thread-safe when custom archivers registered
with @ref{2d17,,register_archive_format()} do not support the `root_dir'
argument.  In this case it
temporarily changes the current working directory of the process
to `root_dir' to perform archiving.
@end quotation
@end cartouche


버전 3.8에서 변경: @code{format="tar"}로 만들어진 아카이브에 기존 GNU 형식 대신 최신 pax (POSIX.1-2001) 형식이 사용됩니다.



버전 3.10.6에서 변경: This function is now made thread-safe during creation of standard
@code{.zip} and tar archives.

@end deffn

@geindex get_archive_formats() (shutil 모듈)
@anchor{library/shutil shutil get_archive_formats}@anchor{2d18}
@deffn {함수} shutil.get_archive_formats ()

아카이브에 지원되는 형식의 리스트를 반환합니다. 반환된 시퀀스의 각 요소는 튜플 @code{(name, description)}입니다.

By default @code{shutil} provides these formats:


@itemize -

@item 
`zip': ZIP 파일 (@ref{139,,zlib} 모듈을 사용할 수 있으면).

@item 
`tar': 압축되지 않은 tar 파일. 새 아카이브에 POSIX.1-2001 pax 형식을 사용합니다.

@item 
`gztar': gzip 된 tar 파일 (@ref{139,,zlib} 모듈을 사용할 수 있으면).

@item 
`bztar': bzip2 된 tar 파일 (@ref{14,,bz2} 모듈을 사용할 수 있으면).

@item 
`xztar': xz 된 tar 파일 (@ref{8e,,lzma} 모듈을 사용할 수 있으면).

@item 
`zstdtar': Zstandard compressed tar-file (if the @ref{23,,compression.zstd}
module is available).
@end itemize

@ref{2d17,,register_archive_format()}을 사용하여, 새 형식을 등록하거나 기존 형식에 대해 여러분 자신의 아카이버를 제공할 수 있습니다.
@end deffn

@geindex register_archive_format() (shutil 모듈)
@anchor{library/shutil shutil register_archive_format}@anchor{2d17}
@deffn {함수} shutil.register_archive_format (name, function[, extra_args[, description]])

`name' 형식을 위한 아카이버를 등록합니다.

`function'은 아카이브를 만드는 데 사용되는 콜러블입니다. 콜러블은 만들 파일의 `base_name'과 그 뒤에 아카이브를 시작할 `base_dir'(기본값은 @ref{2c7e,,os.curdir})를 받습니다. 추가 인자는 키워드 인자로 전달됩니다: `owner', `group', `dry_run' 및 `logger' (@ref{6d9,,make_archive()}로 전달됩니다).

If `function' has the custom attribute @code{function.supports_root_dir} set to @code{True},
the `root_dir' argument is passed as a keyword argument.
Otherwise the current working directory of the process is temporarily
changed to `root_dir' before calling `function'.
In this case @ref{6d9,,make_archive()} is not thread-safe.

주어지면, `extra_args'는 아카이버 콜러블이 사용될 때 추가 키워드 인자로 사용되는 @code{(name, value)} 쌍의 시퀀스입니다.

`description'은 아카이버 목록을 반환하는 @ref{2d18,,get_archive_formats()}에서 사용됩니다. 기본값은 빈 문자열입니다.


버전 3.12에서 변경: `root_dir' 인자를 지원하는 함수들에 대한 지원이 추가되었습니다.

@end deffn

@geindex unregister_archive_format() (shutil 모듈)
@anchor{library/shutil shutil unregister_archive_format}@anchor{2d19}
@deffn {함수} shutil.unregister_archive_format (name)

지원되는 형식 리스트에서 `name' 아카이브 형식을 제거합니다.
@end deffn

@geindex unpack_archive() (shutil 모듈)
@anchor{library/shutil shutil unpack_archive}@anchor{695}
@deffn {함수} shutil.unpack_archive (filename[, extract_dir[, format[, filter]]])

아카이브를 풉니다. `filename'은 아카이브의 전체 경로입니다.

`extract_dir'은 아카이브가 풀리는 대상 디렉터리의 이름입니다. 제공되지 않으면, 현재 작업 디렉터리가 사용됩니다.

`format' is the archive format: one of “zip”, “tar”, “gztar”, “bztar”,
“xztar”, or “zstdtar”.  Or any other format registered with
@ref{2d1a,,register_unpack_format()}.  If not provided, @code{unpack_archive()}
will use the archive file name extension and see if an unpacker was
registered for that extension.  In case none is found,
a @ref{2ec,,ValueError} is raised.

The keyword-only `filter' argument is passed to the underlying unpacking
function. For zip files, `filter' is not accepted.
For tar files, it is recommended to use @code{'data'} (default since Python
3.14), unless using features specific to tar and UNIX-like filesystems.
(See @ref{696,,Extraction filters} for details.)

인자 @code{filename}, @code{extract_dir}, @code{format}으로 @ref{1c6c,,감사 이벤트} @code{shutil.unpack_archive}를 발생시킵니다.

@cartouche
@quotation 경고 
Never extract archives from untrusted sources without prior inspection.
It is possible that files are created outside of the path specified in
the `extract_dir' argument, e.g. members that have absolute filenames
starting with “/” or filenames with two dots “..”.

Since Python 3.14, the defaults for both built-in formats (zip and tar
files) will prevent the most dangerous of such security issues,
but will not prevent `all' unintended behavior.
Read the @ref{2d1b,,Hints for further verification}
section for tar-specific details.
@end quotation
@end cartouche


버전 3.7에서 변경: `filename'과 `extract_dir'에 대해 @ref{5a0,,경로류 객체}를 받아들입니다.



버전 3.12에서 변경: `filter' 인자를 추가했습니다.

@end deffn

@geindex register_unpack_format() (shutil 모듈)
@anchor{library/shutil shutil register_unpack_format}@anchor{2d1a}
@deffn {함수} shutil.register_unpack_format (name, extensions, function[, extra_args[, description]])

아카이브 해제기를 등록합니다. `name'은 형식의 이름이고 `extensions'는 형식에 해당하는 확장자의 리스트입니다, 가령 Zip 파일의 경우 @code{.zip}.

`function'은 아카이브를 푸는 데 사용되는 콜러블입니다. 콜러블은 다음을 받습니다:


@itemize -

@item 
아카이브의 경로, 위치 인자로;

@item 
아카이브를 추출해야 하는 디렉터리, 위치 인자로;

@item 
possibly a `filter' keyword argument, if it was given to
@ref{695,,unpack_archive()};

@item 
additional keyword arguments, specified by `extra_args' as a sequence
of @code{(name, value)} tuples.
@end itemize

`description'은 형식을 설명하기 위해 제공될 수 있으며, @ref{2d1c,,get_unpack_formats()} 함수에 의해 반환됩니다.
@end deffn

@geindex unregister_unpack_format() (shutil 모듈)
@anchor{library/shutil shutil unregister_unpack_format}@anchor{2d1d}
@deffn {함수} shutil.unregister_unpack_format (name)

아카이브 해제 형식을 등록 취소합니다. `name'은 형식의 이름입니다.
@end deffn

@geindex get_unpack_formats() (shutil 모듈)
@anchor{library/shutil shutil get_unpack_formats}@anchor{2d1c}
@deffn {함수} shutil.get_unpack_formats ()

아카이브 해제를 위해 등록된 모든 형식의 리스트를 반환합니다. 반환된 시퀀스의 각 요소는 튜플 @code{(name, extensions, description)}입니다.

By default @code{shutil} provides these formats:


@itemize -

@item 
`zip': ZIP 파일 (압축된 파일의 해제는 해당 모듈을 사용할 수 있을 때만 작동합니다).

@item 
`tar': 압축되지 않은 tar 파일.

@item 
`gztar': gzip 된 tar 파일 (@ref{139,,zlib} 모듈을 사용할 수 있으면).

@item 
`bztar': bzip2 된 tar 파일 (@ref{14,,bz2} 모듈을 사용할 수 있으면).

@item 
`xztar': xz 된 tar 파일 (@ref{8e,,lzma} 모듈을 사용할 수 있으면).

@item 
`zstdtar': Zstandard compressed tar-file (if the @ref{23,,compression.zstd}
module is available).
@end itemize

@ref{2d1a,,register_unpack_format()}을 사용하여, 새 형식을 등록하거나 기존 형식에 대한 여러분 자신의 아카이브 해제기를 제공할 수 있습니다.
@end deffn

@menu
* 아카이브 예:: 
* base_dir을 사용한 아카이브 예:: 

@end menu

@node 아카이브 예,base_dir을 사용한 아카이브 예,,아카이브 연산
@anchor{library/shutil archiving-example}@anchor{2d1e}@anchor{library/shutil shutil-archiving-example}@anchor{2d1f}
@subsubsection 아카이브 예


이 예에서는, 사용자의 @code{.ssh} 디렉터리에 있는 모든 파일을 포함하는 gzip 된 tar 파일 아카이브를 만듭니다:

@example
>>> from shutil import make_archive
>>> import os
>>> archive_name = os.path.expanduser(os.path.join('~', 'myarchive'))
>>> root_dir = os.path.expanduser(os.path.join('~', '.ssh'))
>>> make_archive(archive_name, 'gztar', root_dir)
'/Users/tarek/myarchive.tar.gz'
@end example

결과 아카이브에는 다음이 포함됩니다:

@example
$ tar -tzvf /Users/tarek/myarchive.tar.gz
drwx------ tarek/staff       0 2010-02-01 16:23:40 ./
-rw-r--r-- tarek/staff     609 2008-06-09 13:26:54 ./authorized_keys
-rwxr-xr-x tarek/staff      65 2008-06-09 13:26:54 ./config
-rwx------ tarek/staff     668 2008-06-09 13:26:54 ./id_dsa
-rwxr-xr-x tarek/staff     609 2008-06-09 13:26:54 ./id_dsa.pub
-rw------- tarek/staff    1675 2008-06-09 13:26:54 ./id_rsa
-rw-r--r-- tarek/staff     397 2008-06-09 13:26:54 ./id_rsa.pub
-rw-r--r-- tarek/staff   37192 2010-02-06 18:23:10 ./known_hosts
@end example

@node base_dir을 사용한 아카이브 예,,아카이브 예,아카이브 연산
@anchor{library/shutil archiving-example-with-base-dir}@anchor{2d20}@anchor{library/shutil shutil-archiving-example-with-basedir}@anchor{2d16}
@subsubsection `base_dir'을 사용한 아카이브 예


이 예에서는, @ref{2d1f,,위의 예}와 유사하게, @ref{6d9,,make_archive()}를 사용하는 방법을 보여 주지만, 이번에는 `base_dir'을 사용합니다. 이제 다음 디렉터리 구조가 있습니다:

@example
$ tree tmp
tmp
└── root
    └── structure
        ├── content
            └── please_add.txt
        └── do_not_add.txt
@end example

최종 아카이브에는, @code{please_add.txt}가 포함되어야 하지만, @code{do_not_add.txt}는 포함되지 않아야 합니다. 따라서 다음을 사용합니다:

@example
>>> from shutil import make_archive
>>> import os
>>> archive_name = os.path.expanduser(os.path.join('~', 'myarchive'))
>>> make_archive(
...     archive_name,
...     'tar',
...     root_dir='tmp/root',
...     base_dir='structure/content',
... )
'/Users/tarek/myarchive.tar'
@end example

결과 아카이브에 파일을 나열하면 다음과 같습니다:

@example
$ python -m tarfile -l /Users/tarek/myarchive.tar
structure/content/
structure/content/please_add.txt
@end example

@node 출력 터미널의 크기 조회하기,,아카이브 연산,shutil — 고수준 파일 연산
@anchor{library/shutil querying-the-size-of-the-output-terminal}@anchor{2d21}
@subsubsection 출력 터미널의 크기 조회하기


@geindex get_terminal_size() (shutil 모듈)
@anchor{library/shutil shutil get_terminal_size}@anchor{1308}
@deffn {함수} shutil.get_terminal_size (fallback=(columns, lines))

터미널 창의 크기를 가져옵니다.

두 차원 각각에 대해, 환경 변수 @code{COLUMNS}와 @code{LINES}가 각각 확인됩니다. 변수가 정의되고 값이 양의 정수이면 사용됩니다.

@code{COLUMNS}나 @code{LINES}가 정의되지 않으면 (이것이 일반적입니다), @ref{1307,,os.get_terminal_size()}를 호출하여 @ref{2d22,,sys.__stdout__}에 연결된 터미널을 조회합니다.

시스템이 조회를 지원하지 않거나, 터미널에 연결되어 있지 않기 때문에 터미널 크기를 성공적으로 조회할 수 없으면, @code{fallback} 매개 변수에 제공된 값이 사용됩니다. @code{fallback}의 기본값은 많은 터미널 에뮬레이터에서 사용하는 기본 크기인 @code{(80, 24)}입니다.

반환된 값은 @ref{2d23,,os.terminal_size} 형의 네임드 튜플입니다.

참조: The Single UNIX Specification, Version 2, Other Environment Variables@footnote{https://pubs.opengroup.org/onlinepubs/7908799/xbd/envvar.html#tag_002_003}.


Added in version 3.3.



버전 3.11에서 변경: The @code{fallback} values are also used if @ref{1307,,os.get_terminal_size()}
returns zeroes.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)


@subsubheading 더 보기



@table @asis

@item 모듈 @ref{a5,,os}

운영 체제 인터페이스. 파이썬 @ref{13c8,,파일 객체}보다 저수준으로 파일을 다루는 함수를 포함합니다.

@item 모듈 @ref{83,,io}

파이썬의 내장 I/O 라이브러리. 추상 클래스와 파일 I/O와 같은 구상 클래스를 모두 포함합니다.

@item 내장 함수 @ref{316,,open()}

파이썬으로 읽고 쓰기 위해 파일을 여는 표준 방법.
@end table


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 데이터 지속성,데이터 압축 및 보관,파일과 디렉터리 액세스,파이썬 표준 라이브러리
@anchor{library/persistence doc}@anchor{2d24}@anchor{library/persistence data-persistence}@anchor{2d25}@anchor{library/persistence persistence}@anchor{2d26}@anchor{library/persistence translation-repo}@anchor{2d27}
@section 데이터 지속성


이 장에서 설명하는 모듈은 파이썬 데이터를 디스크에 지속적인 형태로 저장하는 것을 지원합니다. @ref{ab,,pickle}과 @ref{91,,marshal} 모듈은 많은 파이썬 데이터형을 바이트 스트림으로 바꿀 수 있고 그 바이트열로부터 객체를 재생성할 수 있습니다. 다양한 DBM 관련 모듈은 문자열에서 다른 문자열로의 매핑을 저장하는 일군의 해시 기반 파일 형식을 지원합니다.

이 장에서 설명하는 모듈 목록은 다음과 같습니다:

@menu
* pickle — 파이썬 객체 직렬화:: 
* copyreg — pickle 지원 함수 등록:: 
* shelve — 파이썬 객체 지속성:: 
* marshal — 내부 파이썬 객체 직렬화:: 
* dbm — 유닉스 “데이터베이스” 인터페이스:: 
* sqlite3 — DB-API 2.0 interface for SQLite databases: sqlite3 — DB-API 2 0 interface for SQLite databases. 

@end menu

@node pickle — 파이썬 객체 직렬화,copyreg — pickle 지원 함수 등록,,데이터 지속성
@anchor{library/pickle doc}@anchor{2d28}@anchor{library/pickle module-pickle}@anchor{ab}@anchor{library/pickle pickle-python-object-serialization}@anchor{2d29}
@subsection @code{pickle} — 파이썬 객체 직렬화


@geindex module; pickle

`소스 코드:' Lib/pickle.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/pickle.py}

@geindex 지속성
@geindex 지속적;객체
@geindex 직렬화하기;객체
@geindex 마샬링;객체
@geindex 평탄화;객체
@geindex 피클링;객체


__________________________________________________________________


The @code{pickle} module implements binary protocols for serializing and
de-serializing a Python object structure.  `“Pickling”' is the process
whereby a Python object hierarchy is converted into a byte stream, and
`“unpickling”' is the inverse operation, whereby a byte stream
(from a @ref{206c,,binary file} or @ref{193,,bytes-like object}) is converted
back into an object hierarchy.  Pickling (and unpickling) is alternatively
known as “serialization”, “marshalling,” @footnote{
이것을 @ref{91,,marshal} 모듈과 혼동하지 마십시오.
} or “flattening”; however, to
avoid confusion, the terms used here are “pickling” and “unpickling”.

@cartouche
@quotation 경고 
@code{pickle} 모듈은 `안전하지 않습니다'. 신뢰할 수 있는 데이터만 언 피클 하십시오.

`언 피클 시 임의의 코드를 실행하는' 악의적인 피클 데이터를 구성할 수 있습니다. 신뢰할 수 없는 출처에서 왔거나 변조되었을 수 있는 데이터를 절대로 언 피클 하지 마십시오.

변조되지 않았음을 보장하려면 @ref{6e,,hmac}으로 데이터에 서명하는 것을 고려하십시오.

신뢰할 수 없는 데이터를 처리한다면, @ref{86,,json}과 같은 안전한 직렬화 형식이 더 적합 할 수 있습니다. @ref{2d2a,,json 과의 비교}를 참조하십시오.
@end quotation
@end cartouche

@menu
* 다른 파이썬 모듈과의 관계:: 
* 데이터 스트림 형식:: 
* 모듈 인터페이스:: 
* 어떤 것이 피클 되고 역 피클 될 수 있을까요?:: 
* 클래스 인스턴스 피클링:: 
* 형@comma{} 함수 및 기타 객체에 대한 사용자 정의 환원: 형 함수 및 기타 객체에 대한 사용자 정의 환원. 
* 아웃 오브 밴드 버퍼:: 
* 전역 제한하기:: 
* 성능:: 
* 예제: 예제<7>. 
* Command-line interface:: 

@end menu

@node 다른 파이썬 모듈과의 관계,데이터 스트림 형식,,pickle — 파이썬 객체 직렬화
@anchor{library/pickle relationship-to-other-python-modules}@anchor{2d2b}
@subsubsection 다른 파이썬 모듈과의 관계


@menu
* marshal 과의 비교:: 
* json 과의 비교:: 

@end menu

@node marshal 과의 비교,json 과의 비교,,다른 파이썬 모듈과의 관계
@anchor{library/pickle comparison-with-marshal}@anchor{2d2c}
@subsubsection @code{marshal} 과의 비교


Python has a more primitive serialization module called @ref{91,,marshal}, but in
general @code{pickle} should always be the preferred way to serialize Python
objects.  @code{marshal} exists primarily to support Python’s @code{.pyc}
files.

The @code{pickle} module differs from @ref{91,,marshal} in several significant ways:


@itemize *

@item 
@ref{91,,marshal} cannot be used to serialize user-defined classes and their
instances.  @code{pickle} can save and restore class instances transparently,
however the class definition must be importable and live in the same module as
when the object was stored.

@item 
The @ref{91,,marshal} serialization format is not guaranteed to be portable
across Python versions.  Because its primary job in life is to support
@code{.pyc} files, the Python implementers reserve the right to change the
serialization format in non-backwards compatible ways should the need arise.
The @code{pickle} serialization format is guaranteed to be backwards compatible
across Python releases provided a compatible pickle protocol is chosen and
pickling and unpickling code deals with Python 2 to Python 3 type differences
if your data is crossing that unique breaking change language boundary.
@end itemize

@node json 과의 비교,,marshal 과의 비교,다른 파이썬 모듈과의 관계
@anchor{library/pickle comparison-with-json}@anchor{2d2a}@anchor{library/pickle id2}@anchor{2d2d}
@subsubsection @code{json} 과의 비교


pickle 프로토콜과 JSON (JavaScript Object Notation)@footnote{https://json.org} 간에는 근본적인 차이가 있습니다:


@itemize *

@item 
JSON은 텍스트 직렬화 형식(유니코드 텍스트를 출력하지만, 대개는 @code{utf-8} 으로 인코딩됩니다)인 반면, pickle은 바이너리 직렬화 형식입니다.

@item 
JSON은 사람이 읽을 수 있지만, 피클은 그렇지 않습니다.

@item 
JSON은 상호 운용이 가능하며 파이썬 생태계 외부에서 널리 사용되는 반면, 피클은 파이썬으로만 한정됩니다.

@item 
JSON은, 기본적으로, 파이썬 내장형 일부만 표시할 수 있으며 사용자 정의 클래스는 표시할 수 없습니다; 피클은 매우 많은 수의 파이썬 형을 나타낼 수 있습니다 (그중 많은 것들은 파이썬의 인트로스펙션 기능을 영리하게 사용하여 자동으로; 복잡한 경우는 @ref{2d2e,,특정 객체 API} 를 구현해서 해결할 수 있습니다);

@item 
pickle과 달리, 신뢰할 수 없는 JSON의 역 직렬화는 그 자체로 임의 코드 실행 취약점을 만들지는 않습니다.
@end itemize


@subsubheading 더 보기


@ref{86,,json} 모듈: JSON 직렬화와 역 직렬화를 가능하게 하는 표준 라이브러리 모듈.


@node 데이터 스트림 형식,모듈 인터페이스,다른 파이썬 모듈과의 관계,pickle — 파이썬 객체 직렬화
@anchor{library/pickle data-stream-format}@anchor{2d2f}@anchor{library/pickle pickle-protocols}@anchor{27b}
@subsubsection 데이터 스트림 형식


@geindex 외부 데이터 표현

The data format used by @code{pickle} is Python-specific.  This has the
advantage that there are no restrictions imposed by external standards such as
JSON (which can’t represent pointer sharing); however it means that
non-Python programs may not be able to reconstruct pickled Python objects.

By default, the @code{pickle} data format uses a relatively compact binary
representation.  If you need optimal size characteristics, you can efficiently
@ref{2d30,,compress} pickled data.

The module @ref{ac,,pickletools} contains tools for analyzing data streams
generated by @code{pickle}.  @code{pickletools} source code has extensive
comments about opcodes used by pickle protocols.

현재 피클링에 쓸 수 있는 6가지 프로토콜이 있습니다. 사용된 프로토콜이 높을수록, 생성된 피클을 읽으려면 더 최신 파이썬 버전이 필요합니다.


@itemize *

@item 
프로토콜 버전 0은 최초의 “사람이 읽을 수 있는” 프로토콜이며 이전 버전의 파이썬과 과거 호환됩니다.

@item 
프로토콜 버전 1은 역시 이전 버전의 파이썬과 호환되는 오래된 바이너리 형식입니다.

@item 
프로토콜 버전 2는 파이썬 2.3에서 소개되었습니다. 그것은 훨씬 더 효율적인 @ref{2d31,,뉴스타일 클래스}의 피클링을 제공합니다. 프로토콜 2에 의해 개선된 사항에 대한 정보는 
@geindex Python 향상 제안; PEP 307
PEP 307@footnote{https://peps.python.org/pep-0307/}을 참조하십시오.

@item 
프로토콜 버전 3은 파이썬 3.0에서 추가되었습니다. 명시적으로 @ref{192,,bytes} 객체를 지원하며 파이썬 2.x에서 역 피클 될 수 없습니다. 이것은 파이썬 3.0–3.7에서 기본 프로토콜이었습니다.

@item 
Protocol version 4 was added in Python 3.4.  It adds support for very large
objects, pickling more kinds of objects, and some data format
optimizations.  This was the default protocol in Python 3.8–3.13.
Refer to 
@geindex Python 향상 제안; PEP 3154
PEP 3154@footnote{https://peps.python.org/pep-3154/} for information about improvements brought by
protocol 4.

@item 
Protocol version 5 was added in Python 3.8.  It adds support for out-of-band
data and speedup for in-band data.  It is the default protocol starting with
Python 3.14.  Refer to 
@geindex Python 향상 제안; PEP 574
PEP 574@footnote{https://peps.python.org/pep-0574/} for information about improvements brought
by protocol 5.
@end itemize

@cartouche
@quotation 참고 
Serialization is a more primitive notion than persistence; although
@code{pickle} reads and writes file objects, it does not handle the issue of
naming persistent objects, nor the (even more complicated) issue of concurrent
access to persistent objects.  The @code{pickle} module can transform a complex
object into a byte stream and it can transform the byte stream into an object
with the same internal structure.  Perhaps the most obvious thing to do with
these byte streams is to write them onto a file, but it is also conceivable to
send them across a network or store them in a database.  The @ref{c8,,shelve}
module provides a simple interface to pickle and unpickle objects on
DBM-style database files.
@end quotation
@end cartouche

@node 모듈 인터페이스,어떤 것이 피클 되고 역 피클 될 수 있을까요?,데이터 스트림 형식,pickle — 파이썬 객체 직렬화
@anchor{library/pickle module-interface}@anchor{2d32}
@subsubsection 모듈 인터페이스


객체 계층 구조를 직렬화하려면, 단순히 @ref{16a9,,dumps()} 함수를 호출하면 됩니다. 마찬가지로, 데이터 스트림을 역 직렬화하려면 @ref{f0c,,loads()} 함수를 호출합니다. 그러나, 직렬화와 역 직렬화에 대한 더 많은 제어를 원하면, 각각 @ref{c12,,Pickler} 나 @ref{177f,,Unpickler} 객체를 만들 수 있습니다.

The @code{pickle} module provides the following constants:

@geindex HIGHEST_PROTOCOL (pickle 모듈)
@anchor{library/pickle pickle HIGHEST_PROTOCOL}@anchor{16aa}
@deffn {데이터} pickle.HIGHEST_PROTOCOL

정수, 사용 가능한 가장 높은 @ref{27b,,프로토콜 버전}. 이 값은 함수 @ref{2d33,,dump()}와 @ref{16a9,,dumps()} 그리고 @ref{c12,,Pickler} 생성자에 `protocol' 값으로 전달될 수 있습니다.
@end deffn

@geindex DEFAULT_PROTOCOL (pickle 모듈)
@anchor{library/pickle pickle DEFAULT_PROTOCOL}@anchor{a2f}
@deffn {데이터} pickle.DEFAULT_PROTOCOL

An integer, the default @ref{27b,,protocol version} used
for pickling.  May be less than @ref{16aa,,HIGHEST_PROTOCOL}.  Currently the
default protocol is 5, introduced in Python 3.8 and incompatible
with previous versions. This version introduces support for out-of-band
buffers, where 
@geindex Python 향상 제안; PEP 3118
PEP 3118@footnote{https://peps.python.org/pep-3118/}-compatible data can be transmitted separately
from the main pickle stream.


버전 3.0에서 변경: 기본 프로토콜은 3입니다.



버전 3.8에서 변경: 기본 프로토콜은 4입니다.



버전 3.14에서 변경: The default protocol is 5.

@end deffn

The @code{pickle} module provides the following functions to make the pickling
process more convenient:

@geindex dump() (pickle 모듈)
@anchor{library/pickle pickle dump}@anchor{2d33}
@deffn {함수} pickle.dump (obj, file, protocol=None, *, fix_imports=True, buffer_callback=None)

객체 `obj' 의 피클 된 표현을 열린 @ref{13c8,,파일 객체} `file' 에 씁니다. 이것은 @code{Pickler(file, protocol).dump(obj)} 와 동등합니다.

인자 `file', `protocol', `fix_imports' 및 `buffer_callback'은 @ref{c12,,Pickler} 생성자에서와 같은 의미입니다.


버전 3.8에서 변경: `buffer_callback' 인자가 추가되었습니다.

@end deffn

@geindex dumps() (pickle 모듈)
@anchor{library/pickle pickle dumps}@anchor{16a9}
@deffn {함수} pickle.dumps (obj, protocol=None, *, fix_imports=True, buffer_callback=None)

객체 `obj'의 피클 된 표현을 파일에 쓰는 대신 @ref{192,,bytes} 객체로 반환합니다.

인자 `protocol', `fix_imports' 및 `buffer_callback'은 @ref{c12,,Pickler} 생성자에서와 같은 의미입니다.


버전 3.8에서 변경: `buffer_callback' 인자가 추가되었습니다.

@end deffn

@geindex load() (pickle 모듈)
@anchor{library/pickle pickle load}@anchor{f0b}
@deffn {함수} pickle.load (file, *, fix_imports=True, encoding='ASCII', errors='strict', buffers=None)

열린 @ref{13c8,,파일 객체} `file' 에서 객체의 피클 된 표현을 읽고, 그 안에 지정된 객체 계층 구조를 재구성하여 반환합니다. 이것은 @code{Unpickler(file).load()} 와 동등합니다.

피클의 프로토콜 버전이 자동으로 감지되므로 프로토콜 인자가 필요하지 않습니다. 객체의 피클 된 표현 뒤에 남는 바이트열은 무시됩니다.

인자 `file', `fix_imports', `encoding', `errors', `strict' 및 `buffers'는 @ref{177f,,Unpickler} 생성자에서와 같은 의미입니다.


버전 3.8에서 변경: `buffers' 인자가 추가되었습니다.

@end deffn

@geindex loads() (pickle 모듈)
@anchor{library/pickle pickle loads}@anchor{f0c}
@deffn {함수} pickle.loads (data, /, *, fix_imports=True, encoding='ASCII', errors='strict', buffers=None)

객체의 피클 된 표현 `data'의 재구성된 객체 계층 구조를 반환합니다. `data'는 @ref{193,,바이트열류 객체}여야 합니다.

피클의 프로토콜 버전이 자동으로 감지되므로 프로토콜 인자가 필요하지 않습니다. 객체의 피클 된 표현 뒤에 남는 바이트열은 무시됩니다.

인자 `fix_imports', `encoding', `errors', `strict' 및 `buffers'는 @ref{177f,,Unpickler} 생성자에서와 같은 의미입니다.


버전 3.8에서 변경: `buffers' 인자가 추가되었습니다.

@end deffn

The @code{pickle} module defines three exceptions:

@geindex PickleError
@anchor{library/pickle pickle PickleError}@anchor{2d34}
@deffn {예외} pickle.PickleError

다른 피클링 예외의 공통 베이스 클래스입니다. @ref{bcc,,Exception}을 상속합니다.
@end deffn

@geindex PicklingError
@anchor{library/pickle pickle PicklingError}@anchor{1943}
@deffn {예외} pickle.PicklingError

@ref{c12,,Pickler} 가 피클 가능하지 않은 객체를 만날 때 발생하는 에러. @ref{2d34,,PickleError} 를 상속합니다.

어떤 종류의 객체가 피클 될 수 있는지 배우려면 @ref{2d35,,어떤 것이 피클 되고 역 피클 될 수 있을까요?}를 참조하십시오.
@end deffn

@geindex UnpicklingError
@anchor{library/pickle pickle UnpicklingError}@anchor{2d36}
@deffn {예외} pickle.UnpicklingError

데이터 손상 또는 보안 위반과 같이 객체를 역 피클 할 때 문제가 있으면 발생하는 에러. @ref{2d34,,PickleError} 를 상속합니다.

역 피클링 중에 다른 예외도 발생할 수 있음에 유의하십시오. AttributeError, EOFError, ImportError, IndexError 등이 발생할 수 있지만, 이에 국한되지는 않습니다.
@end deffn

The @code{pickle} module exports three classes, @ref{c12,,Pickler},
@ref{177f,,Unpickler} and @ref{1782,,PickleBuffer}:

@geindex Pickler (pickle 클래스)
@anchor{library/pickle pickle Pickler}@anchor{c12}
@deffn {클래스} pickle.Pickler (file, protocol=None, *, fix_imports=True, buffer_callback=None)

피클 데이터 스트림을 쓸 바이너리 파일을 받아들입니다.

선택적 `protocol' 인자(정수)는 피클러가 주어진 프로토콜을 사용하도록 지시합니다; 지원되는 프로토콜은 0부터 @ref{16aa,,HIGHEST_PROTOCOL} 입니다. 지정하지 않으면 기본값은 @ref{a2f,,DEFAULT_PROTOCOL} 입니다. 음수가 지정되면, @code{HIGHEST_PROTOCOL} 이 선택됩니다.

`file' 인자에는 단일 바이트열 인자를 받아들이는 write() 메서드가 있어야 합니다. 따라서 바이너리 쓰기를 위해 열린 디스크 상의 파일, @ref{10a3,,io.BytesIO} 인스턴스 또는 이 인터페이스를 충족시키는 다른 사용자 정의 객체일 수 있습니다.

`fix_imports' 가 참이고 `protocol' 이 3보다 작으면, pickle은 새로운 파이썬 3 이름을 파이썬 2에서 사용된 이전 모듈 이름에 매핑하려고 시도하여, 파이썬 2에서 피클 데이터 스트림을 읽을 수 있도록 합니다.

`buffer_callback'이 @code{None} (기본값) 이면, 버퍼 뷰는 피클 스트림의 일부로 `file'로 직렬화됩니다.

`buffer_callback'이 @code{None}이 아니면, 버퍼 뷰로 여러 번 호출될 수 있습니다. 콜백이 거짓 값(가령 @code{None})을 반환하면, 주어진 버퍼는 @ref{2d37,,아웃 오브 밴드}입니다; 그렇지 않으면 버퍼는 인 밴드, 즉 피클 스트림 내부에 직렬화됩니다.

`buffer_callback'이 @code{None}이 아니고 `protocol'이 @code{None}이거나 5보다 작으면 에러입니다.


버전 3.8에서 변경: `buffer_callback' 인자가 추가되었습니다.


@geindex dump() (pickle.Pickler 메서드)
@anchor{library/pickle pickle Pickler dump}@anchor{1e21}
@deffn {메서드} dump (obj)

생성자에 주어진 열린 파일 객체에 `obj' 의 피클 된 표현을 씁니다.
@end deffn

@geindex persistent_id() (pickle.Pickler 메서드)
@anchor{library/pickle pickle Pickler persistent_id}@anchor{190d}
@deffn {메서드} persistent_id (obj)

기본적으로 아무것도 하지 않습니다. 이것은 서브 클래스가 재정의할 수 있게 하려고 존재합니다.

@ref{190d,,persistent_id()} 가 @code{None} 을 반환하면, `obj' 는 보통 때처럼 피클 됩니다. 다른 값은 @ref{c12,,Pickler} 가 `obj' 의 지속성(persistent) ID로 반환 값을 출력하도록 합니다. 이 지속성 ID의 의미는 @ref{1915,,Unpickler.persistent_load()} 에 의해 정의되어야 합니다. @code{persistent_id()} 에 의해 반환된 값 자체는 지속성 ID를 가질 수 없음에 유의하십시오.

자세한 내용과 사용 예는 @ref{2d38,,외부 객체의 지속성}를 참조하십시오.


버전 3.13에서 변경: Add the default implementation of this method in the C implementation
of @code{Pickler}.

@end deffn

@geindex dispatch_table (pickle.Pickler의 속성)
@anchor{library/pickle pickle Pickler dispatch_table}@anchor{1327}
@deffn {속성} dispatch_table

피클러 객체의 디스패치 테이블은 @ref{2d39,,copyreg.pickle()} 을 사용하여 선언할 수 있는 `환원 함수(reduction functions)' 의 등록소입니다. 키가 클래스이고 값이 환원 함수인 매핑입니다. 환원 함수는 관련 클래스의 단일 인자를 취하며 @ref{bc5,,__reduce__()} 메서드와 같은 인터페이스를 따라야 합니다.

기본적으로, 피클러 객체는 @ref{1327,,dispatch_table} 어트리뷰트를 가지지 않을 것이고, 대신 @ref{2a,,copyreg} 모듈에 의해 관리되는 전역 디스패치 테이블을 사용할 것입니다. 그러나 특정 피클러 객체의 피클링을 사용자 정의하기 위해서 @code{dispatch_table} 어트리뷰트를 딕셔너리류 객체로 설정할 수 있습니다. 또는, @ref{c12,,Pickler} 의 서브 클래스가 @code{dispatch_table} 어트리뷰트를 가지고 있다면, 이 클래스의 인스턴스를 위한 기본 디스패치 테이블로 사용됩니다.

사용 예는 @ref{2d3a,,디스패치 테이블}을 참조하십시오.


Added in version 3.3.

@end deffn

@geindex reducer_override() (pickle.Pickler 메서드)
@anchor{library/pickle pickle Pickler reducer_override}@anchor{c13}
@deffn {메서드} reducer_override (obj)

@ref{c12,,Pickler} 서브 클래스에서 정의할 수 있는 특수 환원기(reducer). 이 메서드는 @ref{1327,,dispatch_table}에 있는 모든 감속기보다 우선순위가 높습니다. @ref{bc5,,__reduce__()} 메서드와 같은 인터페이스를 따라야 하며, 선택적으로 @ref{1a2,,NotImplemented}를 반환하여 @code{obj}를 피클 하기 위해 @code{dispatch_table} 등록 환원기로 폴백(fallback)하도록 할 수 있습니다.

자세한 예는 @ref{2d3b,,형@comma{} 함수 및 기타 객체에 대한 사용자 정의 환원}을 참조하십시오.


Added in version 3.8.

@end deffn

@geindex fast (pickle.Pickler의 속성)
@anchor{library/pickle pickle Pickler fast}@anchor{2d3c}
@deffn {속성} fast

폐지되었습니다. 참값으로 설정된 경우 빠른 모드를 활성화합니다. 빠른 모드는 메모 사용을 비활성화하므로, 불필요한 PUT 옵코드를 생성하지 않아 피클링 절차의 속도를 높입니다. 자신을 참조하는 객체에 사용되면 안 됩니다. 그렇지 않으면 @ref{c12,,Pickler} 가 무한 재귀에 빠집니다.

더 간결한 피클이 필요하면 @ref{2d3d,,pickletools.optimize()} 를 사용하십시오.
@end deffn

@geindex clear_memo() (pickle.Pickler 메서드)
@anchor{library/pickle pickle Pickler clear_memo}@anchor{2d3e}
@deffn {메서드} clear_memo ()

Clears the pickler’s “memo”.

The memo is the data structure that remembers which objects the
pickler has already seen, so that shared or recursive objects
are pickled by reference and not by value.  This method is
useful when re-using picklers.
@end deffn
@end deffn

@geindex Unpickler (pickle 클래스)
@anchor{library/pickle pickle Unpickler}@anchor{177f}
@deffn {클래스} pickle.Unpickler (file, *, fix_imports=True, encoding='ASCII', errors='strict', buffers=None)

피클 데이터 스트림을 읽는 데 사용될 바이너리 파일을 받아들입니다.

피클의 프로토콜 버전이 자동으로 감지되므로 프로토콜 인자가 필요하지 않습니다.

인자 `file' 에는 세 가지 메서드가 있어야 합니다, @ref{8a2,,io.BufferedIOBase} 인터페이스 처럼, 정수 인자를 받아들이는 read() 메서드, 버퍼 인자를 받아들이는 readinto() 메서드 그리고 인자가 없는 readline() 메서드. 따라서 `file' 은 바이너리 읽기를 위해 열린 디스크 상의 파일, @ref{10a3,,io.BytesIO} 객체 또는 이 인터페이스를 만족하는 다른 사용자 정의 객체일 수 있습니다.

선택적 인자 `fix_imports', `encoding' 및 `errors'는 파이썬 2에서 생성된 피클 스트림에 대한 호환성 지원을 제어하는 데 사용됩니다. `fix_imports' 가 참이면, pickle은 이전 파이썬 2 이름을 파이썬 3에서 사용된 새로운 이름으로 매핑하려고 합니다. `encoding' 과 `errors' 는 파이썬 2에 의해 피클 된 8비트 문자열 인스턴스를 디코딩하는 방법을 pickle에게 알려줍니다. 기본값은 각각 ‘ASCII’와 ‘strict’ 입니다. `encoding' 은 ‘bytes’ 가 될 수 있는데, 8비트 문자열 인스턴스를 바이트열 객체로 읽습니다. NumPy 배열과 파이썬 2에서 피클 된 @ref{4e2,,datetime}, @ref{1fa,,date} 및 @ref{1fb,,time} 인스턴스를 역 피클링하려면 @code{encoding='latin1'}을 사용해야 합니다.

`buffers'가 @code{None} (기본값) 이면, 역 직렬화에 필요한 모든 데이터가 피클 스트림에 포함되어야 합니다. 이것은 @ref{c12,,Pickler}가 인스턴스 화 될 때 (또는 @ref{2d33,,dump()}나 @ref{16a9,,dumps()}가 호출될 때) `buffer_callback' 인자가 @code{None}이었음을 뜻합니다.

`buffers'가 @code{None}이 아니면, 피클 스트림이 @ref{2d37,,아웃 오브 밴드} 버퍼 뷰를 참조할 때마다 소비되는 버퍼가 활성화된 객체의 이터러블이어야 합니다. 이러한 버퍼는 Pickler 객체의 `buffer_callback'에 순서대로 제공되었습니다.


버전 3.8에서 변경: `buffers' 인자가 추가되었습니다.


@geindex load() (pickle.Unpickler 메서드)
@anchor{library/pickle pickle Unpickler load}@anchor{2d3f}
@deffn {메서드} load ()

생성자에 주어진 열린 파일 객체에서 객체의 피클 된 표현을 읽고, 그 안에 지정된 객체 계층 구조를 재구성하여 반환합니다. 객체의 피클 된 표현 뒤에 남는 바이트열은 무시됩니다.
@end deffn

@geindex persistent_load() (pickle.Unpickler 메서드)
@anchor{library/pickle pickle Unpickler persistent_load}@anchor{1915}
@deffn {메서드} persistent_load (pid)

기본적으로 @ref{2d36,,UnpicklingError}를 발생시킵니다.

정의되면, @ref{1915,,persistent_load()} 는 지속성 ID `pid' 로 지정된 객체를 반환해야 합니다. 유효하지 않은 지속성 ID가 발견되면 @ref{2d36,,UnpicklingError}를 일으켜야 합니다.

자세한 내용과 사용 예는 @ref{2d38,,외부 객체의 지속성}를 참조하십시오.


버전 3.13에서 변경: Add the default implementation of this method in the C implementation
of @code{Unpickler}.

@end deffn

@geindex find_class() (pickle.Unpickler 메서드)
@anchor{library/pickle pickle Unpickler find_class}@anchor{2d40}
@deffn {메서드} find_class (module, name)

필요하면 `module' 을 임포트하고 거기에서 `name' 이라는 객체를 반환합니다. 여기서 `module' 및 `name' 인자는 @ref{169,,str} 객체입니다. 그 이름이 제시하는 것과는 달리, @ref{2d40,,find_class()} 는 함수를 찾는 데에도 사용됨에 유의하십시오.

로드되는 객체의 형과 로드 방법을 제어하기 위해 서브 클래스는 이것을 재정의할 수 있고, 잠재적으로 보안 위험을 감소시킵니다. 자세한 내용은 @ref{2d41,,전역 제한하기}를 참조하십시오.

@code{module}, @code{name}을 인자로 @ref{1c6c,,감사 이벤트(auditing event)} @code{pickle.find_class}를 발생시킵니다.
@end deffn
@end deffn

@geindex PickleBuffer (pickle 클래스)
@anchor{library/pickle pickle PickleBuffer}@anchor{1782}
@deffn {클래스} pickle.PickleBuffer (buffer)

피클 가능한 데이터를 나타내는 버퍼의 래퍼. `buffer'는 @ref{193,,바이트열류 객체}나 N-차원 배열과 같은 @ref{260,,버퍼 제공} 객체여야 합니다.

@ref{1782,,PickleBuffer} 자체가 버퍼 제공자이므로, @ref{165,,memoryview}와 같은 버퍼 제공 객체를 기대하는 다른 API로 전달할 수 있습니다.

@ref{1782,,PickleBuffer} 객체는 피클 프로토콜 5 이상만 사용하여 직렬화할 수 있습니다. 그들은 @ref{2d37,,아웃 오브 밴드 직렬화} 대상입니다.


Added in version 3.8.


@geindex raw() (pickle.PickleBuffer 메서드)
@anchor{library/pickle pickle PickleBuffer raw}@anchor{2d42}
@deffn {메서드} raw ()

이 버퍼의 하부 메모리 영역의 @ref{165,,memoryview}를 반환합니다. 반환된 객체는 @code{B} (부호 없는 바이트) 형식의 1-차원 C 연속 메모리 뷰입니다. 버퍼가 C나 포트란 연속적이지 않으면 @ref{179f,,BufferError}가 발생합니다.
@end deffn

@geindex release() (pickle.PickleBuffer 메서드)
@anchor{library/pickle pickle PickleBuffer release}@anchor{2d43}
@deffn {메서드} release ()

PickleBuffer 객체에 의해 노출된 하부 버퍼를 해제합니다.
@end deffn
@end deffn

@node 어떤 것이 피클 되고 역 피클 될 수 있을까요?,클래스 인스턴스 피클링,모듈 인터페이스,pickle — 파이썬 객체 직렬화
@anchor{library/pickle pickle-picklable}@anchor{2d35}@anchor{library/pickle what-can-be-pickled-and-unpickled}@anchor{2d44}
@subsubsection 어떤 것이 피클 되고 역 피클 될 수 있을까요?


다음 형을 피클 할 수 있습니다:


@itemize *

@item 
built-in constants (@code{None}, @code{True}, @code{False}, @code{Ellipsis}, and
@ref{1a2,,NotImplemented});

@item 
정수, 실수, 복소수;

@item 
문자열, 바이트열, 바이트 배열(bytearray);

@item 
피클 가능한 객체만 포함하는 튜플, 리스트, 집합과 딕셔너리;

@item 
모듈의 최상위 수준에서 액세스할 수 있는 (내장 및 사용자 정의) 함수 (@ref{14a2,,lambda} 가 아니라 @ref{165f,,def} 를 사용하는);

@item 
모듈의 최상위 수준에서 액세스할 수 있는 클래스;

@item 
instances of such classes for which the result of calling @ref{7f0,,__getstate__()}
is picklable  (see section @ref{2d2e,,클래스 인스턴스 피클링} for details).
@end itemize

피클 가능하지 않은 객체를 피클 하려고 하면 @ref{1943,,PicklingError} 예외가 발생합니다; 이런 일이 일어났을 때, 특정할 수 없는 길이의 바이트열이 하부 파일에 이미 기록되었을 수 있습니다. 매우 재귀적인 데이터 구조를 피클 하려고 하면 최대 재귀 깊이를 초과할 수 있고, 이때 @ref{f67,,RecursionError} 가 발생합니다. @ref{6e9,,sys.setrecursionlimit()} 을 사용하여 이 제한을 조심스럽게 올릴 수 있습니다.

함수(내장 및 사용자 정의)는 값이 아니라 완전히 @ref{1d21,,정규화된 이름}으로 피클 됨에 유의하십시오. @footnote{
이것이 @code{lambda} 함수가 pickle 될 수 없는 이유입니다: 모든 @ref{14a2,,lambda} 함수는 같은 이름을 공유합니다: @code{<lambda>}.
} 이것은 함수를 포함하는 모듈과 클래스의 이름과 함께 함수의 이름만 피클 된다는 것을 의미합니다. 함수의 코드도 함수 어트리뷰트도 피클 되지 않습니다. 따라서 정의하는 모듈은 역 피클 환경에서 임포트 가능해야 하며, 모듈에는 그 이름의 객체가 있어야 합니다. 그렇지 않으면 예외가 발생합니다. @footnote{
발생하는 예외는 @ref{659,,ImportError} 나 @ref{5ee,,AttributeError} 일 가능성이 크지만, 그 밖의 다른 것일 수 있습니다.
}

마찬가지로, 클래스는 완전히 정규화된 이름으로 피클 되므로 역 피클링 환경에서 같은 제한이 적용됩니다. 클래스의 코드 나 데이터가 피클 되지 않음에 유의하세요. 그래서 다음 예제에서 클래스 어트리뷰트 @code{attr} 은 역 피클링 환경에서 복원되지 않습니다:

@example
class Foo:
    attr = 'A class attribute'

picklestring = pickle.dumps(Foo)
@end example

이러한 제한이 피클 가능한 함수와 클래스가 모듈의 최상위 수준에서 정의되어야 하는 이유입니다.

마찬가지로, 클래스 인스턴스가 피클 될 때, 클래스의 코드와 데이터는 함께 피클 되지 않습니다. 인스턴스 데이터만 피클 됩니다. 이는 의도한 것으로, 클래스의 버그를 수정하거나 클래스에 메서드를 추가할 수 있고, 이전 버전의 클래스로 만들어진 객체를 여전히 로드 할 수 있습니다. 여러 버전의 클래스에 걸치는 수명이 긴 객체를 만들 계획이라면, 클래스의 @ref{bc6,,__setstate__()} 메서드로 적절한 변환을 할 수 있도록 객체에 버전 번호를 넣는 것이 좋습니다.

@node 클래스 인스턴스 피클링,형 함수 및 기타 객체에 대한 사용자 정의 환원,어떤 것이 피클 되고 역 피클 될 수 있을까요?,pickle — 파이썬 객체 직렬화
@anchor{library/pickle pickle-inst}@anchor{2d2e}@anchor{library/pickle pickling-class-instances}@anchor{2d45}
@subsubsection 클래스 인스턴스 피클링


이 절에서는 클래스 인스턴스를 피클 및 역 피클 하는 방법을 정의, 사용자 정의 및 제어할 수 있는 일반적인 메커니즘을 설명합니다.

대부분은, 인스턴스를 피클 가능하게 만드는 데 추가 코드가 필요하지 않습니다. 기본적으로, pickle은 인트로스펙션을 통해 인스턴스의 클래스와 어트리뷰트를 조회합니다. 클래스 인스턴스가 역 피클 될 때, @ref{8be,,__init__()} 메서드는 보통 호출되지 `않습니다'. 기본 동작은, 먼저 초기화되지 않은 인스턴스를 만든 다음 저장된 어트리뷰트를 복원합니다. 다음 코드는 이 동작의 구현을 보여줍니다:

@example
def save(obj):
    return (obj.__class__, obj.__dict__)

def restore(cls, attributes):
    obj = cls.__new__(cls)
    obj.__dict__.update(attributes)
    return obj
@end example

클래스는 다음과 같은 하나 이상의 특수 메서드를 제공하여 기본 동작을 변경할 수 있습니다:

@geindex __getnewargs_ex__() (object 메서드)
@anchor{library/pickle object __getnewargs_ex__}@anchor{2d46}
@deffn {메서드} object.__getnewargs_ex__ ()

In protocols 2 and newer, classes that implement the
@ref{2d46,,__getnewargs_ex__()} method can dictate the values passed to the
@ref{79f,,__new__()} method upon unpickling.  The method must return a pair
@code{(args, kwargs)} where `args' is a tuple of positional arguments
and `kwargs' a dictionary of named arguments for constructing the
object.  Those will be passed to the @code{__new__()} method upon
unpickling.

클래스의 @ref{79f,,__new__()} 메서드에 키워드 전용 인자가 필요하면 이 메서드를 구현해야 합니다. 그렇지 않으면 호환성을 위해 @ref{fd3,,__getnewargs__()} 를 구현하는 것이 좋습니다.


버전 3.6에서 변경: @ref{2d46,,__getnewargs_ex__()} 는 이제 프로토콜 2와 3에서 사용됩니다.

@end deffn

@geindex __getnewargs__() (object 메서드)
@anchor{library/pickle object __getnewargs__}@anchor{fd3}
@deffn {메서드} object.__getnewargs__ ()

이 메서드는 @ref{2d46,,__getnewargs_ex__()} 와 비슷한 목적을 수행하지만, 위치 인자만 지원합니다. 역 피클링 때 @ref{79f,,__new__()} 메서드에 전달될 인자의 튜플 @code{args} 를 반환해야 합니다.

@ref{2d46,,__getnewargs_ex__()} 가 정의되면 @ref{fd3,,__getnewargs__()} 는 호출되지 않습니다.


버전 3.6에서 변경: 파이썬 3.6 이전에는, 프로토콜 2와 3에서 @ref{2d46,,__getnewargs_ex__()} 대신 @ref{fd3,,__getnewargs__()} 가 호출되었습니다.

@end deffn

@geindex __getstate__() (object 메서드)
@anchor{library/pickle object __getstate__}@anchor{7f0}
@deffn {메서드} object.__getstate__ ()

클래스는 @ref{7f0,,__getstate__()} 메서드를 재정의함으로써 인스턴스가 피클 되는 방식을 추가로 제어할 수 있습니다. 기본 상태 대신, 이 메서드가 호출되고 반환된 객체를 인스턴스의 내용으로 피클 합니다. 다음과 같은 경우가 있습니다:


@itemize *

@item 
For a class that has no instance @ref{77c,,__dict__} and no
@ref{16f0,,__slots__}, the default state is @code{None}.

@item 
For a class that has an instance @ref{77c,,__dict__} and no
@ref{16f0,,__slots__}, the default state is @code{self.__dict__}.

@item 
For a class that has an instance @ref{77c,,__dict__} and
@ref{16f0,,__slots__}, the default state is a tuple consisting of two
dictionaries:  @code{self.__dict__}, and a dictionary mapping slot
names to slot values.  Only slots that have a value are
included in the latter.

@item 
For a class that has @ref{16f0,,__slots__} and no instance
@ref{77c,,__dict__}, the default state is a tuple whose first item
is @code{None} and whose second item is a dictionary mapping slot names
to slot values described in the previous bullet.
@end itemize


버전 3.11에서 변경: Added the default implementation of the @code{__getstate__()} method in the
@ref{c7d,,object} class.

@end deffn

@geindex __setstate__() (object 메서드)
@anchor{library/pickle object __setstate__}@anchor{bc6}
@deffn {메서드} object.__setstate__ (state)

역 피클링 때, 클래스가 @ref{bc6,,__setstate__()} 를 정의하면, 그것은 역 피클 된 상태(state)로 호출됩니다. 이 경우 상태 객체가 딕셔너리일 필요는 없습니다. 그렇지 않으면, 피클 된 상태는 딕셔너리 여야하고 그 항목이 새 인스턴스의 딕셔너리에 삽입됩니다.

@cartouche
@quotation 참고 
@ref{bc5,,__reduce__()} 가 피클링 때 값이 거짓 @code{None}인 상태를 반환하면, @ref{bc6,,__setstate__()} 메서드가 역 피클링 때 호출되지 않습니다.
@end quotation
@end cartouche
@end deffn

@ref{7f0,,__getstate__()} 와 @ref{bc6,,__setstate__()} 메서드를 사용하는 방법에 대한 더 자세한 정보는 @ref{2d47,,상태 저장 객체 처리} 절을 참조하십시오.

@cartouche
@quotation 참고 
역 피클링 시간에, @ref{6f9,,__getattr__()}, @ref{dca,,__getattribute__()}, 또는 @ref{2378,,__setattr__()} 같은 메서드가 인스턴스에 호출될 수 있습니다. 그러한 메서드들이 어떤 내부 불변성이 참인 것에 의존하는 경우, 형은 그런 불변성을 유지하기 위해 @ref{79f,,__new__()} 를 구현해야 합니다, 인스턴스를 역 피클링할 때 @ref{8be,,__init__()}가 호출되지 않기 때문입니다.
@end quotation
@end cartouche

@geindex 복사;프로토콜

앞으로 살펴보겠지만, 피클은 위에서 설명한 메서드를 직접 사용하지 않습니다. 사실, 이 메서드들은 @ref{bc5,,__reduce__()} 특수 메서드를 구현하는 복사 프로토콜의 일부입니다. 복사 프로토콜은 객체를 피클 하고 복사하는 데 필요한 데이터를 조회하기 위한 통일된 인터페이스를 제공합니다. @footnote{
@ref{29,,copy} 모듈은 얕거나 깊은 복사 연산에 이 프로토콜을 사용합니다.
}

강력하기는 하지만, 여러분의 클래스에서 직접 @ref{bc5,,__reduce__()} 를 구현하면 잘못되기 쉽습니다. 이런 이유로, 클래스 설계자는 가능하면 고수준 인터페이스(즉, @ref{2d46,,__getnewargs_ex__()}, @ref{7f0,,__getstate__()} 및 @ref{bc6,,__setstate__()})를 사용해야 합니다. 하지만, 우리는 @code{__reduce__()} 를 사용하는 것이 유일한 옵션이거나 더 효율적인 피클링을 제공하거나 혹은 둘 다인 경우를 보여줄 것입니다.

@geindex __reduce__() (object 메서드)
@anchor{library/pickle object __reduce__}@anchor{bc5}
@deffn {메서드} object.__reduce__ ()

인터페이스는 현재 다음과 같이 정의됩니다. @ref{bc5,,__reduce__()} 메서드는 아무런 인자도 받아들이지 않으며 문자열이나 바람직하게는 튜플을 반환합니다 (반환된 객체는 흔히 “환원 값(reduce value)”이라고 불립니다).

문자열이 반환되면, 문자열은 전역 변수의 이름으로 해석되어야 합니다. 모듈에 상대적인 객체의 지역 이름이어야 합니다; pickle 모듈은 객체의 모듈을 결정하기 위해 모듈 이름 공간을 검색합니다. 이 동작은 일반적으로 싱글톤에 유용합니다.

튜플이 반환될 때는, 길이가 2나 6이 되어야 합니다. 선택적인 항목은 생략되거나 @code{None} 이 값으로 제공될 수 있습니다. 각 항목의 의미는 순서대로 다음과 같습니다:

@c XXX Mention __newobj__ special-case?


@itemize *

@item 
객체의 초기 버전을 만들기 위해 호출할 콜러블 객체.

@item 
콜러블 객체에 대한 인자의 튜플. 콜러블 객체가 인자를 받아들이지 않으면 빈 튜플을 제공해야 합니다.

@item 
선택적으로, 객체의 상태. 앞에서 설명한 대로 객체의 @ref{bc6,,__setstate__()} 메서드에 전달됩니다. 객체에 그런 메서드가 없다면, 그 값은 딕셔너리 여야 하며 객체의 @ref{77c,,__dict__} 어트리뷰트에 추가됩니다.

@item 
Optionally, an iterator (and not a sequence) yielding successive items.
These items will be appended to the object either using
@code{obj.append(item)} or, in batch, using @code{obj.extend(list_of_items)}.
This is primarily used for list subclasses, but may be used by other
classes as long as they have @ref{23d6,,append()}
and @ref{23d9,,extend()} methods with
the appropriate signature.  (Whether @code{append()} or @code{extend()} is
used depends on which pickle protocol version is used as well as the number
of items to append, so both must be supported.)

@item 
선택적으로, 연속적인 키-값 쌍을 생성하는 이터레이터(시퀀스가 아닙니다). 이 항목들은 @code{obj[key] = value} 를 사용하여 객체에 저장됩니다. 이것은 주로 딕셔너리 서브 클래스에 사용되지만, @ref{14d0,,__setitem__()} 을 구현하는 한 다른 클래스에서 사용될 수 있습니다.

@item 
선택적으로, @code{(obj, state)} 서명을 가진 콜러블. 이 콜러블은 @code{obj}의 정적 @ref{bc6,,__setstate__()} 메서드 대신에 특정 객체의 상태 갱신 동작을 프로그래밍 방식으로 제어할 수 있도록 합니다. @code{None}이 아니면, 이 콜러블은 @code{obj}의 @code{__setstate__()}보다 우선 합니다.


Added in version 3.8: 선택적인 여섯 번째 튜플 항목 @code{(obj, state)}가 추가되었습니다.

@end itemize
@end deffn

@geindex __reduce_ex__() (object 메서드)
@anchor{library/pickle object __reduce_ex__}@anchor{196c}
@deffn {메서드} object.__reduce_ex__ (protocol)

또는, @ref{196c,,__reduce_ex__()} 메서드를 정의할 수 있습니다. 유일한 차이점은 이 메서드가 프로토콜 버전인 단일 정수 인자를 받아들여야 한다는 것입니다. 정의되면, pickle은 @ref{bc5,,__reduce__()} 메서드보다 선호합니다. 또한, @code{__reduce__()} 는 자동으로 확장 버전의 동의어가 됩니다. 이 메서드의 주된 용도는 구형 파이썬 배포를 위해 과거 호환성 있는 환원 값을 제공하는 것입니다.
@end deffn

@menu
* 외부 객체의 지속성:: 
* 디스패치 테이블:: 
* 상태 저장 객체 처리:: 

@end menu

@node 외부 객체의 지속성,디스패치 테이블,,클래스 인스턴스 피클링
@anchor{library/pickle persistence-of-external-objects}@anchor{2d48}@anchor{library/pickle pickle-persistent}@anchor{2d38}
@subsubsection 외부 객체의 지속성


@geindex persistent_id (피클 프로토콜)
@geindex persistent_load (피클 프로토콜)

For the benefit of object persistence, the @code{pickle} module supports the
notion of a reference to an object outside the pickled data stream.  Such
objects are referenced by a persistent ID, which should be either a string of
alphanumeric characters (for protocol 0) @footnote{
영숫자 문자의 제한은 프로토콜 0에서 지속성 ID가 개행 문자로 구분되기 때문입니다. 따라서 지속성 ID에 개행 문자가 포함되면 결과 피클돤 데이터를 읽을 수 없게 됩니다.
} or just an arbitrary object (for
any newer protocol).

The resolution of such persistent IDs is not defined by the @code{pickle}
module; it will delegate this resolution to the user-defined methods on the
pickler and unpickler, @ref{190d,,persistent_id()} and
@ref{1915,,persistent_load()} respectively.

지속성 ID를 가진 객체를 피클 하기 위해서, 피클러는 객체를 인자로 받아서 그 객체에 대해 @code{None} 또는 지속성 ID를 반환하는 사용자 정의 @ref{190d,,persistent_id()} 메서드가 있어야 합니다. @code{None} 이 반환되면, 피클러는 단순히 객체를 피클 합니다. 지속성 ID 문자열이 반환되면, 피클러는 마커와 함께 해당 객체를 피클 하여 역 피클러가 이를 지속성 ID로 인식하게 합니다.

외부 객체를 역 피클 하려면, 역 피클러는 지속성 ID 객체를 받아들여 참조된 객체를 반환하는 사용자 정의 @ref{1915,,persistent_load()} 메서드를 가져야 합니다.

다음은 지속성 ID를 외부 객체를 참조로 피클 하는데 사용하는 방법을 보여주는 포괄적인 예입니다.

@example
# 지속성 ID를 외부 객체를 참조로 피클 하는데 사용하는 방법을 보여주는 간단한 예제.
# external objects by reference.

import pickle
import sqlite3
from collections import namedtuple

# 우리 데이터베이스의 레코드를 나타내는 간단한 클래스.
MemoRecord = namedtuple("MemoRecord", "key, task")

class DBPickler(pickle.Pickler):

    def persistent_id(self, obj):
        # MemoRecord를 일반 클래스 인스턴스로 피클 하는 대신,
        # 지속성 ID를 출력합니다.
        if isinstance(obj, MemoRecord):
            # 여기서, 우리의 지속성 ID는 태그와 데이터베이스의 특정 레코드를 참조하는 키를 포함하는
            # 단순한 튜플입니다.
            return ("MemoRecord", obj.key)
        else:
            # obj에 지속성 ID가 없으면, None을 반환합니다. 이것은 obj가 평소와 같이 피클 되어야
            # 함을 의미합니다.
            return None


class DBUnpickler(pickle.Unpickler):

    def __init__(self, file, connection):
        super().__init__(file)
        self.connection = connection

    def persistent_load(self, pid):
        # 이 메서드는, 지속성 ID를 만날 때마다 호출됩니다.
        # 여기에서, pid는 DBPickler가 반환한 튜플입니다.
        cursor = self.connection.cursor()
        type_tag, key_id = pid
        if type_tag == "MemoRecord":
            # 데이터베이스에서 참조 된 레코드를 반입하여 리턴하십시오.
            cursor.execute("SELECT * FROM memos WHERE key=?", (str(key_id),))
            key, task = cursor.fetchone()
            return MemoRecord(key, task)
        else:
            # 올바른 객체를 반환할 수 없으면 항상 에러를 일으켜야 합니다.
            # 그렇지 않으면, 언피클러는 None이 지속성 ID에 의해 참조되는 객체라고
            # 생각할 것입니다.
            raise pickle.UnpicklingError("unsupported persistent object")


def main():
    import io
    import pprint

    # 데이터베이스를 초기화하고 값을 채웁니다.
    conn = sqlite3.connect(":memory:")
    cursor = conn.cursor()
    cursor.execute("CREATE TABLE memos(key INTEGER PRIMARY KEY, task TEXT)")
    tasks = (
        'give food to fish',
        'prepare group meeting',
        'fight with a zebra',
        )
    for task in tasks:
        cursor.execute("INSERT INTO memos VALUES(NULL, ?)", (task,))

    # 피클 할 레코드를 가져옵니다.
    cursor.execute("SELECT * FROM memos")
    memos = [MemoRecord(key, task) for key, task in cursor]
    # 사용자 정의 DBPickler를 사용하여 레코드를 저장합니다.
    file = io.BytesIO()
    DBPickler(file).dump(memos)

    print("Pickled records:")
    pprint.pprint(memos)

    # 확인을 위해 레코드를 갱신합니다.
    cursor.execute("UPDATE memos SET task='learn italian' WHERE key=1")

    # 피클 데이터 스트림에서 레코드를 로드합니다.
    file.seek(0)
    memos = DBUnpickler(file, conn).load()

    print("Unpickled records:")
    pprint.pprint(memos)


if __name__ == '__main__':
    main()
@end example

@node 디스패치 테이블,상태 저장 객체 처리,외부 객체의 지속성,클래스 인스턴스 피클링
@anchor{library/pickle dispatch-tables}@anchor{2d49}@anchor{library/pickle pickle-dispatch}@anchor{2d3a}
@subsubsection 디스패치 테이블


피클링에 의존하는 다른 코드를 방해하지 않고 일부 클래스의 피클링을 사용자 정의하려면, 사설 디스패치 테이블을 갖는 피클러를 만들 수 있습니다.

@ref{2a,,copyreg} 모듈에 의해 관리되는 전역 디스패치 테이블은 @code{copyreg.dispatch_table}로 사용 가능합니다. 그러므로, 사설 디스패치 테이블로 @code{copyreg.dispatch_table} 의 수정된 복사본을 사용할 수 있습니다.

예를 들면

@example
f = io.BytesIO()
p = pickle.Pickler(f)
p.dispatch_table = copyreg.dispatch_table.copy()
p.dispatch_table[SomeClass] = reduce_SomeClass
@end example

는 @code{SomeClass} 클래스를 특별히 처리하는 사설 디스패치 테이블을 갖는 @ref{c12,,pickle.Pickler} 의 인스턴스를 생성합니다. 또는, 코드

@example
class MyPickler(pickle.Pickler):
    dispatch_table = copyreg.dispatch_table.copy()
    dispatch_table[SomeClass] = reduce_SomeClass
f = io.BytesIO()
p = MyPickler(f)
@end example

가 같은 일을 하지만, @code{MyPickler} 의 모든 인스턴스는 기본적으로 사설 디스패치 테이블을 공유합니다. 반면에, 다음 코드

@example
copyreg.pickle(SomeClass, reduce_SomeClass)
f = io.BytesIO()
p = pickle.Pickler(f)
@end example

는 @ref{2a,,copyreg} 모듈의 모든 사용자가 공유하는 전역 디스패치 테이블을 수정합니다.

@node 상태 저장 객체 처리,,디스패치 테이블,클래스 인스턴스 피클링
@anchor{library/pickle handling-stateful-objects}@anchor{2d4a}@anchor{library/pickle pickle-state}@anchor{2d47}
@subsubsection 상태 저장 객체 처리


@geindex __getstate__() (복사 프로토콜)
@geindex __setstate__() (복사 프로토콜)

다음은 클래스의 피클 동작을 수정하는 방법을 보여주는 예제입니다. 아래의 @code{TextReader} 클래스는 텍스트 파일을 열고, @code{readline()} 메서드가 호출될 때마다 줄 번호와 줄 내용을 반환합니다. @code{TextReader} 인스턴스가 피클 되면, 파일 객체 멤버를 `제외한' 모든 어트리뷰트가 저장됩니다. 인스턴스가 역 피클 될 때, 파일이 다시 열리고, 마지막 위치에서 읽기가 다시 시작됩니다. @code{__setstate__()} 와 @code{__getstate__()} 메서드가 이 행동을 구현하는 데 사용됩니다.

@example
class TextReader:
    """텍스트 파일의 줄을 인쇄하고 번호를 매깁니다."""

    def __init__(self, filename):
        self.filename = filename
        self.file = open(filename)
        self.lineno = 0

    def readline(self):
        self.lineno += 1
        line = self.file.readline()
        if not line:
            return None
        if line.endswith('\n'):
            line = line[:-1]
        return "%i: %s" % (self.lineno, line)

    def __getstate__(self):
        # 우리의 모든 인스턴스 어트리뷰트를 포함하는 self.__dict__ 에서 객체의
        # 상태를 복사합니다. 원래 상태를 수정하지 않으려면 항상 dict.copy()
        # 메서드를 사용하십시오.
        state = self.__dict__.copy()
        # 피클 가능하지 않은 항목을 제거합니다.
        del state['file']
        return state

    def __setstate__(self, state):
        # 인스턴스 어트리뷰트(즉, filename 과 lineno)를 복원합니다.
        self.__dict__.update(state)
        # 이전에 열린 파일의 상태를 복원합니다. 그렇게 하려면, 다시 열어서 행 수를 복원할
        # 때까지 읽어야 합니다.
        file = open(self.filename)
        for _ in range(self.lineno):
            file.readline()
        # 마지막으로, 파일을 저장합니다.
        self.file = file
@end example

사용 예는 다음과 같은 식입니다:

@example
>>> reader = TextReader("hello.txt")
>>> reader.readline()
'1: Hello world!'
>>> reader.readline()
'2: I am line number two.'
>>> new_reader = pickle.loads(pickle.dumps(reader))
>>> new_reader.readline()
'3: Goodbye!'
@end example

@node 형 함수 및 기타 객체에 대한 사용자 정의 환원,아웃 오브 밴드 버퍼,클래스 인스턴스 피클링,pickle — 파이썬 객체 직렬화
@anchor{library/pickle custom-reduction-for-types-functions-and-other-objects}@anchor{2d4b}@anchor{library/pickle reducer-override}@anchor{2d3b}
@subsubsection 형, 함수 및 기타 객체에 대한 사용자 정의 환원



Added in version 3.8.


때로, @ref{1327,,dispatch_table}이 충분히 유연하지 않을 수 있습니다. 특히 객체의 형이 아닌 다른 기준에 따라 피클링을 사용자 정의하거나, 함수와 클래스 피클링을 사용자 정의하고 싶을 수 있습니다.

이럴 때, @ref{c12,,Pickler} 클래스의 서브 클래스를 만들고 @ref{c13,,reducer_override()} 메서드를 구현할 수 있습니다. 이 메서드는 임의의 환원 튜플을 반환할 수 있습니다 (@ref{bc5,,__reduce__()}를 참조하십시오). 또는 @ref{1a2,,NotImplemented}를 반환하여 전통적인 동작으로 폴백(fallback)할 수 있습니다.

@ref{1327,,dispatch_table}과 @ref{c13,,reducer_override()}가 모두 정의되면, @code{reducer_override()} 메서드가 우선합니다.

@cartouche
@quotation 참고 
성능상의 이유로, 다음과 같은 객체에 대해서는 @ref{c13,,reducer_override()}가 호출되지 않을 수 있습니다: @code{None}, @code{True}, @code{False} 및 @ref{19b,,int}, @ref{196,,float}, @ref{192,,bytes}, @ref{169,,str}, @ref{183,,dict}, @ref{184,,set}, @ref{7f1,,frozenset}, @ref{24d,,list} 및 @ref{610,,tuple}의 정확한(exact) 인스턴스.
@end quotation
@end cartouche

다음은 주어진 클래스를 피클링하고 재구성할 수 있도록 하는 간단한 예제입니다:

@example
import io
import pickle

class MyClass:
    my_attribute = 1

class MyPickler(pickle.Pickler):
    def reducer_override(self, obj):
        """MyClass를 위한 사용자 정의 환원자."""
        if getattr(obj, "__name__", None) == "MyClass":
            return type, (obj.__name__, obj.__bases__,
                          @{'my_attribute': obj.my_attribute@})
        else:
            # 다른 모든 객체는, 일반적인 환원을 사용합니다
            return NotImplemented

f = io.BytesIO()
p = MyPickler(f)
p.dump(MyClass)

del MyClass

unpickled_class = pickle.loads(f.getvalue())

assert isinstance(unpickled_class, type)
assert unpickled_class.__name__ == "MyClass"
assert unpickled_class.my_attribute == 1
@end example

@node 아웃 오브 밴드 버퍼,전역 제한하기,형 함수 및 기타 객체에 대한 사용자 정의 환원,pickle — 파이썬 객체 직렬화
@anchor{library/pickle out-of-band-buffers}@anchor{2d4c}@anchor{library/pickle pickle-oob}@anchor{2d37}
@subsubsection 아웃 오브 밴드 버퍼



Added in version 3.8.


In some contexts, the @code{pickle} module is used to transfer massive amounts
of data.  Therefore, it can be important to minimize the number of memory
copies, to preserve performance and resource consumption.  However, normal
operation of the @code{pickle} module, as it transforms a graph-like structure
of objects into a sequential stream of bytes, intrinsically involves copying
data to and from the pickle stream.

`제공자(provider)'(전송될 객체 형의 구현)와 `소비자(consumer)'(통신 시스템의 구현)가 모두 피클 프로토콜 5 이상에서 제공되는 아웃 오브 밴드 전송 기능을 지원하면 이 제약 조건을 피할 수 있습니다.

@menu
* 제공자 API:: 
* 소비자 API:: 
* 예제: 예제<6>. 

@end menu

@node 제공자 API,소비자 API,,아웃 오브 밴드 버퍼
@anchor{library/pickle provider-api}@anchor{2d4d}
@subsubsection 제공자 API


피클 될 대형 데이터 객체는 프로토콜 5 이상에 특화된 @ref{196c,,__reduce_ex__()} 메서드를 구현해야 합니다. 이 메서드는 대형 데이터에 대해 (예를 들어 @ref{192,,bytes} 객체 대신) @ref{1782,,PickleBuffer} 인스턴스를 반환합니다.

A @ref{1782,,PickleBuffer} object `signals' that the underlying buffer is
eligible for out-of-band data transfer.  Those objects remain compatible
with normal usage of the @code{pickle} module.  However, consumers can also
opt-in to tell @code{pickle} that they will handle those buffers by
themselves.

@node 소비자 API,예제<6>,제공자 API,아웃 오브 밴드 버퍼
@anchor{library/pickle consumer-api}@anchor{2d4e}
@subsubsection 소비자 API


통신 시스템은 객체 그래프를 직렬화할 때 생성된 @ref{1782,,PickleBuffer} 객체의 사용자 정의 처리를 활성화할 수 있습니다.

송신 측에서는, `buffer_callback' 인자를 @ref{c12,,Pickler} (또는 @ref{2d33,,dump()}나 @ref{16a9,,dumps()} 함수)에 전달해야 합니다. 이 인자는 객체 그래프를 피클링할 때 생성된 각 @ref{1782,,PickleBuffer}로 호출됩니다. `buffer_callback'에 의해 누적된 버퍼는 피클 스트림으로 복사되지 않고, 저렴한 마커만 삽입됩니다.

수신 측에서는, `buffer_callback'에 전달된 버퍼의 이터러블인 `buffers' 인자를 @ref{177f,,Unpickler} (또는 @ref{f0b,,load()}나 @ref{f0c,,loads()} 함수)에 전달해야 합니다. 그 이터러블은 `buffer_callback'에 전달된 것과 같은 순서로 버퍼를 만들어야 합니다. 이러한 버퍼는 피클링이 원래 @ref{1782,,PickleBuffer} 객체를 생성한 객체의 재구성자가 기대하는 데이터를 제공합니다.

송신 측과 수신 측 사이에서, 통신 시스템은 아웃 오브 밴드 버퍼를 위한 자체 전송 메커니즘을 자유롭게 구현할 수 있습니다. 잠재적인 최적화에는 공유 메모리나 데이터 유형에 따른 압축이 포함됩니다.

@node 예제<6>,,소비자 API,아웃 오브 밴드 버퍼
@anchor{library/pickle example}@anchor{2d4f}
@subsubsection 예제


다음은 아웃 오브 버퍼 피클링에 참여할 수 있는 @ref{344,,bytearray} 서브 클래스를 구현하는 간단한 예제입니다:

@example
class ZeroCopyByteArray(bytearray):

    def __reduce_ex__(self, protocol):
        if protocol >= 5:
            return type(self)._reconstruct, (PickleBuffer(self),), None
        else:
            # PickleBuffer는 피클 프로토콜 <= 4 에서는 금지됩니다.
            return type(self)._reconstruct, (bytearray(self),)

    @@classmethod
    def _reconstruct(cls, obj):
        with memoryview(obj) as m:
            # 원래 버퍼 객체에 대한 핸들을 얻습니다
            obj = m.obj
            if type(obj) is cls:
                # 원래 버퍼 객체는 ZeroCopyByteArray 이며,
                # 그대로 반환합니다.
                return obj
            else:
                return cls(obj)
@end example

재구성자(@code{_reconstruct} 클래스 메서드)는 올바른 형이면 버퍼를 제공하는 객체를 반환합니다. 이것은 이 장난감 예제에서 제로-복사 동작을 흉내 내는 손쉬운 방법입니다.

소비자 측에서는, 그 객체들을 일반적인 방법으로 피클 할 수 있습니다. 역 직렬화될 때 원래 객체의 사본을 제공합니다:

@example
b = ZeroCopyByteArray(b"abc")
data = pickle.dumps(b, protocol=5)
new_b = pickle.loads(data)
print(b == new_b)  # True
print(b is new_b)  # False: 복사가 발생했습니다
@end example

그러나 `buffer_callback'을 전달하고 역 직렬화할 때 누적된 버퍼를 돌려주면, 원래의 객체를 다시 얻을 수 있습니다:

@example
b = ZeroCopyByteArray(b"abc")
buffers = []
data = pickle.dumps(b, protocol=5, buffer_callback=buffers.append)
new_b = pickle.loads(data, buffers=buffers)
print(b == new_b)  # True
print(b is new_b)  # True: 복사가 발생하지 않았습니다
@end example

이 예제는 @ref{344,,bytearray}가 자체 메모리를 할당한다는 사실로 인해 제한됩니다: 즉, 다른 객체의 메모리를 사용하는 @code{bytearray} 인스턴스를 만들 수 없습니다. 그러나, NumPy 배열과 같은 제삼자 데이터형에는 이러한 제한이 없으며, 별개의 프로세스나 시스템 간에 전송할 때 제로-복사 피클링(또는 최소한의 복사)을 사용할 수 있습니다.


@subsubheading 더 보기


@geindex Python 향상 제안; PEP 574
PEP 574@footnote{https://peps.python.org/pep-0574/} – 아웃 오브 밴드 데이터를 포함하는 피클 프로토콜 5


@node 전역 제한하기,성능,아웃 오브 밴드 버퍼,pickle — 파이썬 객체 직렬화
@anchor{library/pickle pickle-restrict}@anchor{2d41}@anchor{library/pickle restricting-globals}@anchor{2d50}
@subsubsection 전역 제한하기


@geindex find_class() (피클 프로토콜)

기본적으로, 역 피클링은 피클 데이터에서 찾은 모든 클래스나 함수를 임포트 합니다. 많은 응용 프로그램에서는, 역 피클러가 임의 코드를 임포트하고 호출할 수 있으므로, 이 동작을 받아들일 수 없습니다. 이 손으로 만든 피클 데이터 스트림이 로드될 때 하는 일을 생각해보십시오:

@example
>>> import pickle
>>> pickle.loads(b"cos\nsystem\n(S'echo hello world'\ntR.")
hello world
0
@end example

이 예제에서, 역 피클러는 @ref{1662,,os.system()} 함수를 임포트하고 문자열 인자 “echo hello world”를 적용합니다. 이 예제가 공격적이지는 않지만, 어떤 것들은 시스템을 손상할 수 있다고 상상하기 어렵지 않습니다.

이런 이유로, 여러분은 @ref{2d40,,Unpickler.find_class()}를 사용자 정의하여 언 피클 되는 것을 제어하고 싶을 수 있습니다. 이름이 제안하는 것과는 달리, @code{Unpickler.find_class()} 는 전역(즉, 클래스나 함수)이 요청될 때마다 호출됩니다. 따라서 전역을 완전히 금지하거나 안전한 부분집합으로 제한할 수 있습니다.

다음은 @ref{13,,builtins} 모듈에서 몇 가지 안전한 클래스만 로드되도록 허용하는 역 피클러의 예입니다:

@example
import builtins
import io
import pickle

safe_builtins = @{
    'range',
    'complex',
    'set',
    'frozenset',
    'slice',
@}

class RestrictedUnpickler(pickle.Unpickler):

    def find_class(self, module, name):
        # builtins의 안전한 클래스만 허용합니다.
        if module == "builtins" and name in safe_builtins:
            return getattr(builtins, name)
        # 다른 모든 것을 금지합니다.
        raise pickle.UnpicklingError("global '%s.%s' is forbidden" %
                                     (module, name))

def restricted_loads(s):
    """pickle.loads()와 유사한 도움 함수."""
    return RestrictedUnpickler(io.BytesIO(s)).load()
@end example

우리의 역 피클러가 의도대로 작동하는 사용 예:

@example
>>> restricted_loads(pickle.dumps([1, 2, range(15)]))
[1, 2, range(0, 15)]
>>> restricted_loads(b"cos\nsystem\n(S'echo hello world'\ntR.")
Traceback (most recent call last):
  ...
pickle.UnpicklingError: global 'os.system' is forbidden
>>> restricted_loads(b'cbuiltins\neval\n'
...                  b'(S\'getattr(__import__("os"), "system")'
...                  b'("echo hello world")\'\ntR.')
Traceback (most recent call last):
  ...
pickle.UnpicklingError: global 'builtins.eval' is forbidden
@end example

@c XXX Add note about how extension codes could evade our protection
@c mechanism (e.g. cached classes do not invokes find_class()).

예를 통해 알 수 있듯이, 역 피클을 허락하는 것에 주의를 기울여야 합니다. 따라서 보안이 중요하다면, @ref{134,,xmlrpc.client} 나 제삼자 솔루션의 마샬링 API 같은 대안을 고려할 수 있습니다.

@node 성능,예제<7>,전역 제한하기,pickle — 파이썬 객체 직렬화
@anchor{library/pickle performance}@anchor{2d51}
@subsubsection 성능


Recent versions of the pickle protocol (from protocol 2 and upwards) feature
efficient binary encodings for several common features and built-in types.
Also, the @code{pickle} module has a transparent optimizer written in C.

@node 예제<7>,Command-line interface,성능,pickle — 파이썬 객체 직렬화
@anchor{library/pickle examples}@anchor{2d52}@anchor{library/pickle pickle-example}@anchor{2d53}
@subsubsection 예제


가장 간단한 코드로, @ref{2d33,,dump()}와 @ref{f0b,,load()} 함수를 사용하십시오.

@example
import pickle

# pickle이 지원하는 임의의 객체 모음.
data = @{
    'a': [1, 2.0, 3+4j],
    'b': ("character string", b"byte string"),
    'c': @{None, True, False@}
@}

with open('data.pickle', 'wb') as f:
    # 사용 가능한 가장 높은 프로토콜을 사용하여 'data' 딕셔너리를 피클 합니다.
    pickle.dump(data, f, pickle.HIGHEST_PROTOCOL)
@end example

다음 예제는 결과로 나온 피클 데이터를 읽습니다.

@example
import pickle

with open('data.pickle', 'rb') as f:
    # 사용된 프로토콜 버전이 자동으로 감지되므로,
    # 지정할 필요가 없습니다.
    data = pickle.load(f)
@end example

@c XXX: Add examples showing how to optimize pickles for size (like using

@c pickletools.optimize() or the gzip module).

@node Command-line interface,,예제<7>,pickle — 파이썬 객체 직렬화
@anchor{library/pickle command-line-interface}@anchor{2d54}@anchor{library/pickle pickle-cli}@anchor{2d55}
@subsubsection Command-line interface


The @code{pickle} module can be invoked as a script from the command line,
it will display contents of the pickle files. However, when the pickle file
that you want to examine comes from an untrusted source, @code{-m pickletools}
is a safer option because it does not execute pickle bytecode, see
@ref{2d56,,pickletools CLI usage}.

@example
python -m pickle pickle_file [pickle_file ...]
@end example

The following option is accepted:

@geindex pickle 명령줄 옵션; pickle_file
@anchor{library/pickle cmdoption-pickle-arg-pickle_file}@anchor{2d57}
@deffn {Option} pickle_file

A pickle file to read, or @code{-} to indicate reading from standard input.
@end deffn


@subsubheading 더 보기



@table @asis

@item 모듈 @ref{2a,,copyreg}

확장형에 대한 피클 인터페이스 생성자 등록

@item 모듈 @ref{ac,,pickletools}

피클 된 데이터로 작업하고 분석하는 도구.

@item 모듈 @ref{c8,,shelve}

Indexed databases of objects; uses @code{pickle}.

@item 모듈 @ref{29,,copy}

얕거나 깊은 객체 복사.

@item 모듈 @ref{91,,marshal}

내장형의 고성능 직렬화.
@end table


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node copyreg — pickle 지원 함수 등록,shelve — 파이썬 객체 지속성,pickle — 파이썬 객체 직렬화,데이터 지속성
@anchor{library/copyreg doc}@anchor{2d58}@anchor{library/copyreg copyreg-register-pickle-support-functions}@anchor{2d59}@anchor{library/copyreg module-copyreg}@anchor{2a}@anchor{library/copyreg translation-repo}@anchor{2d5a}
@subsection @code{copyreg} — @code{pickle} 지원 함수 등록


@geindex module; copyreg

`소스 코드:' Lib/copyreg.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/copyreg.py}

@geindex 모듈;피클
@geindex 모듈;복사


__________________________________________________________________


The @code{copyreg} module offers a way to define functions used while pickling
specific objects.  The @ref{ab,,pickle} and @ref{29,,copy} modules use those functions
when pickling/copying those objects.  The module provides configuration
information about object constructors which are not classes.
Such constructors may be factory functions or class instances.

@geindex constructor() (copyreg 모듈)
@anchor{library/copyreg copyreg constructor}@anchor{2d5b}
@deffn {함수} copyreg.constructor (object)

`object'를 유효한 생성자로 선언합니다. `object'가 콜러블이 아니면 (따라서 생성자로 유효하지 않으면), @ref{198,,TypeError}가 발생합니다.
@end deffn

@geindex pickle() (copyreg 모듈)
@anchor{library/copyreg copyreg pickle}@anchor{2d39}
@deffn {함수} copyreg.pickle (type, function, constructor_ob=None)

`function'이 `type' 형의 객체에 대한 “환원” 함수로 사용되어야 한다고 선언합니다. `function'는 문자열이나 2개에서 또는 6개 사이의 요소를 포함하는 튜플을 반환해야 합니다. `function'의 인터페이스에 대한 자세한 내용은 @ref{1327,,dispatch_table}을 참조하십시오.

The `constructor_ob' parameter is a legacy feature and is now ignored, but if
passed it must be a callable.

피클러 객체나 @ref{c12,,pickle.Pickler}의 서브 클래스의 @ref{1327,,dispatch_table} 어트리뷰트도 환원 함수를 선언하는 데 사용될 수 있습니다.
@end deffn

@menu
* 예제: 예제<8>. 

@end menu

@node 예제<8>,,,copyreg — pickle 지원 함수 등록
@anchor{library/copyreg example}@anchor{2d5c}
@subsubsection 예제


아래 예제는 피클 함수를 등록하는 방법과 사용법을 보여줍니다.:

@example
>>> import copyreg, copy, pickle
>>> class C:
...     def __init__(self, a):
...         self.a = a
...
>>> def pickle_c(c):
...     print("pickling a C instance...")
...     return C, (c.a,)
...
>>> copyreg.pickle(C, pickle_c)
>>> c = C(1)
>>> d = copy.copy(c)
pickling a C instance...
>>> p = pickle.dumps(c)
pickling a C instance...
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node shelve — 파이썬 객체 지속성,marshal — 내부 파이썬 객체 직렬화,copyreg — pickle 지원 함수 등록,데이터 지속성
@anchor{library/shelve doc}@anchor{2d5d}@anchor{library/shelve module-shelve}@anchor{c8}@anchor{library/shelve shelve-python-object-persistence}@anchor{2d5e}@anchor{library/shelve translation-repo}@anchor{2d5f}
@subsection @code{shelve} — 파이썬 객체 지속성


@geindex module; shelve

`소스 코드:' Lib/shelve.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/shelve.py}

@geindex 모듈;피클


__________________________________________________________________


“쉘프(shelf)”는 영속적인(persistent) 딕셔너리류 객체입니다. “dbm” 데이터베이스와의 차이점은 쉘프의 값(키가 아닙니다!)이 사실상 임의의 파이썬 객체일 수 있다는 것입니다 — @ref{ab,,pickle} 모듈에서 처리할 수 있는 모든 것입니다. 여기에는 대부분의 클래스 인스턴스, 재귀적 데이터형 및 많은 공유 서브 객체를 포함하는 객체가 포함됩니다. 키는 일반 문자열입니다.

@geindex open() (shelve 모듈)
@anchor{library/shelve shelve open}@anchor{1a71}
@deffn {함수} shelve.open (filename, flag='c', protocol=None, writeback=False)

영속적 딕셔너리를 엽니다. 지정된 filename은 하부 데이터베이스의 기본 파일명입니다. 부작용으로, 확장명이 파일명에 추가될 수 있으며 여러 개의 파일이 만들어질 수 있습니다. 기본적으로, 하부 데이터베이스 파일은 읽기와 쓰기 용으로 열립니다. 선택적 `flag' 매개 변수는 @ref{112b,,dbm.open()}의 `flag' 매개 변수와 같게 해석됩니다.

기본적으로, 값을 직렬화하는 데 @ref{a2f,,pickle.DEFAULT_PROTOCOL}로 생성된 피클이 사용됩니다. 피클 프로토콜의 버전은 `protocol' 매개 변수로 지정할 수 있습니다.

파이썬 의미론 때문에, 쉘프는 가변 영속 딕셔너리 항목이 언제 수정되는지 알 수 없습니다. 기본적으로 수정된 객체는 쉘프에 `대입될 때만' 기록됩니다 (@ref{2d60,,예제}를 참조하십시오). 선택적인 `writeback' 매개 변수가 @code{True}로 설정되면, 액세스 된 모든 항목도 메모리에 캐시 되고, @ref{2d61,,sync()}와 @ref{2d62,,close()}가 호출될 때 다시 기록됩니다; 이것은 영속 딕셔너리의 가변 항목을 변경하는 것을 더 수월하게 만들지만, 많은 항목이 액세스 되면, 캐시를 위해 막대한 양의 메모리를 소비할 수 있으며, 액세스 된 모든 항목을 다시 기록하기 때문에 닫기 연산이 매우 느려질 수 있습니다 (어떤 액세스 된 항목이 가변인지, 어떤 것이 실제로 변경되었는지를 판별할 방법이 없습니다).


버전 3.10에서 변경: @ref{a2f,,pickle.DEFAULT_PROTOCOL} is now used as the default pickle
protocol.



버전 3.11에서 변경: Accepts @ref{5a0,,path-like object} for filename.


@cartouche
@quotation 참고 
쉘프가 자동으로 닫히는 것에 의지하지 마십시오; 더는 필요 없을 때 @ref{2d62,,close()}를 명시적으로 호출하거나, @ref{1a71,,shelve.open()}을 컨텍스트 관리자로 사용하십시오:

@example
with shelve.open('spam') as db:
    db['eggs'] = 'eggs'
@end example
@end quotation
@end cartouche
@end deffn
@anchor{library/shelve shelve-security}@anchor{2d63}
@cartouche
@quotation 경고 
Because the @code{shelve} module is backed by @ref{ab,,pickle}, it is insecure
to load a shelf from an untrusted source.  Like with pickle, loading a shelf
can execute arbitrary code.
@end quotation
@end cartouche

Shelf objects support most of the methods and operations supported by dictionaries
(except copying, constructors and operators @code{|} and @code{|=}).  This eases the
transition from dictionary based scripts to those requiring persistent storage.

두 가지 추가 메서드가 지원됩니다:

@geindex sync() (shelve.Shelf 메서드)
@anchor{library/shelve shelve Shelf sync}@anchor{2d61}
@deffn {메서드} Shelf.sync ()

`writeback'을 @ref{e06,,True}로 설정하여 쉘프를 열었으면, 캐시의 모든 항목을 다시 기록합니다. 또한, 적절하다면, 캐시를 비우고 디스크 상의 영속 딕셔너리를 동기화합니다. @ref{2d62,,close()}로 쉘프를 닫을 때 자동으로 호출됩니다.
@end deffn

@geindex close() (shelve.Shelf 메서드)
@anchor{library/shelve shelve Shelf close}@anchor{2d62}
@deffn {메서드} Shelf.close ()

영구 `딕셔너리' 객체를 동기화하고 닫습니다. 닫힌 쉘프에 대한 연산은 @ref{2ec,,ValueError}로 실패합니다.
@end deffn


@subsubheading 더 보기


널리 지원되는 저장 형식과 기본 딕셔너리의 속도를 갖춘 Persistent dictionary recipe@footnote{https://code.activestate.com/recipes/576642-persistent-dict-with-multiple-standard-file-format/}


@menu
* 제약 사항:: 
* 예제: 예제<9>. 

@end menu

@node 제약 사항,예제<9>,,shelve — 파이썬 객체 지속성
@anchor{library/shelve restrictions}@anchor{2d64}
@subsubsection 제약 사항


@geindex 모듈;dbm.ndbm
@geindex 모듈;dbm.gnu


@itemize *

@item 
사용되는 데이터베이스 패키지의 선택(가령 @ref{38,,dbm.ndbm}이나 @ref{37,,dbm.gnu})은 어떤 인터페이스가 사용 가능한지에 따라 다릅니다. 따라서 @ref{35,,dbm}을 사용하여 데이터베이스를 직접 여는 것은 안전하지 않습니다. 또한, 데이터베이스는 (불행히도) @code{dbm}이 사용된다면 그것의 제약이 적용됩니다 — 이것은 데이터베이스에 저장되는 객체(의 피클 된 표현이)가 상당히 작아야 하며, 드물긴 하지만 키 충돌로 인해 데이터베이스가 업데이트를 거부할 수 있음을 뜻합니다.

@item 
The @code{shelve} module does not support `concurrent' read/write access to
shelved objects.  (Multiple simultaneous read accesses are safe.)  When a
program has a shelf open for writing, no other program should have it open for
reading or writing.  Unix file locking can be used to solve this, but this
differs across Unix versions and requires knowledge about the database
implementation used.

@item 
On macOS @ref{38,,dbm.ndbm} can silently corrupt the database file on updates,
which can cause hard crashes when trying to read from the database.
@end itemize

@geindex Shelf (shelve 클래스)
@anchor{library/shelve shelve Shelf}@anchor{119a}
@deffn {클래스} shelve.Shelf (dict, protocol=None, writeback=False, keyencoding='utf-8')

`dict' 객체에 피클 된 값을 저장하는 @ref{12b1,,collections.abc.MutableMapping}의 서브 클래스.

기본적으로, 값을 직렬화하는 데 @ref{a2f,,pickle.DEFAULT_PROTOCOL}로 생성된 피클이 사용됩니다. 피클 프로토콜의 버전은 `protocol' 매개 변수로 지정할 수 있습니다. 피클 프로토콜에 대한 설명은 @ref{ab,,pickle} 설명서를 참조하십시오.

`writeback' 매개 변수가 @code{True}이면, 객체는 액세스 된 모든 항목의 캐시를 보유하고 sync와 close 할 때 `dict'에 다시 씁니다. 이것은 가변 항목에 대한 자연스러운 연산을 허락하지만, 더 많은 메모리를 소비하고 sync와 close 연산이 오래 걸릴 수 있습니다.

`keyencoding' 매개 변수는 하부 dict에 사용되기 전에 키를 인코딩하는 데 사용되는 인코딩입니다.

@ref{119a,,Shelf} 객체는 컨텍스트 관리자로 사용할 수도 있습니다. 이 경우 @ref{186,,with} 블록이 끝날 때 자동으로 닫힙니다.


버전 3.2에서 변경: `keyencoding' 매개 변수가 추가되었습니다; 이전에는 키가 항상 UTF-8으로 인코딩되었습니다.



버전 3.4에서 변경: 컨텍스트 관리자 지원 추가.



버전 3.10에서 변경: @ref{a2f,,pickle.DEFAULT_PROTOCOL} is now used as the default pickle
protocol.

@end deffn

@geindex BsdDbShelf (shelve 클래스)
@anchor{library/shelve shelve BsdDbShelf}@anchor{26be}
@deffn {클래스} shelve.BsdDbShelf (dict, protocol=None, writeback=False, keyencoding='utf-8')

@code{first()}, @code{next()}, @code{previous()}, @code{last()} 및 @code{set_location()} 메서드를 노출하는 @ref{119a,,Shelf}의 서브 클래스. pybsddb@footnote{https://www.jcea.es/programacion/pybsddb.htm}의 제삼자 @code{bsddb} 모듈에서는 사용할 수 있지만 다른 데이터베이스 모듈에서는 사용할 수 없습니다. 생성자에 전달된 `dict' 객체는 이러한 메서드를 지원해야 합니다. 이것은 일반적으로 @code{bsddb.hashopen()}, @code{bsddb.btopen()} 또는 @code{bsddb.rnopen()} 중 하나를 호출하여 수행됩니다. 선택적 `protocol', `writeback' 및 `keyencoding' 매개 변수는 @code{Shelf} 클래스와 같게 해석됩니다.
@end deffn

@geindex DbfilenameShelf (shelve 클래스)
@anchor{library/shelve shelve DbfilenameShelf}@anchor{26bf}
@deffn {클래스} shelve.DbfilenameShelf (filename, flag='c', protocol=None, writeback=False)

딕셔너리류 객체 대신에 `filename'을 받아들이는 @ref{119a,,Shelf}의 서브 클래스. 하부 파일은 @ref{112b,,dbm.open()}을 사용하여 열립니다. 기본적으로, 파일은 읽기와 쓰기가 가능하도록 만들어지고 열립니다. 선택적 `flag' 매개 변수는 @ref{1a71,,open()} 기능과 같게 해석됩니다. 선택적 `protocol'과 `writeback' 매개 변수는 @code{Shelf} 클래스와 같게 해석됩니다.
@end deffn

@node 예제<9>,,제약 사항,shelve — 파이썬 객체 지속성
@anchor{library/shelve example}@anchor{2d65}@anchor{library/shelve shelve-example}@anchor{2d60}
@subsubsection 예제


인터페이스를 요약하면 (@code{key}는 문자열입니다, @code{data}는 임의의 객체입니다):

@example
import shelve

d = shelve.open(filename)  # 열기 -- 파일은 저수준 라이브러리에 의해 추가된 접미사를 얻을
                           # 수 있습니다

d[key] = data              # 키에 데이터를 저장합니다 (기존 키를 사용하면 예전 데이터를
                           # 덮어씁니다)
data = d[key]              # 키에서 데이터의 사본을 꺼냅니다 (그런 키가 없으면 KeyError를
                           # 발생시킵니다)
del d[key]                 # 키에 저장된 데이터를 삭제합니다 (그런 키가 없으면 KeyError를
                           # 발생시킵니다)

flag = key in d            # 키가 존재하면 참입니다
klist = list(d.keys())     # 존재하는 모든 키의 리스트 (느립니다!)

# d가 writeback=True 없이 열렸으므로, 주의하십시오:
d['xx'] = [0, 1, 2]        # 이것은 예상대로 작동합니다, 하지만...
d['xx'].append(3)          # *이것은 그렇지 않습니다!* -- d['xx']는 여전히 [0, 1, 2]입니다!

# writeback=True 없이 열린 d에서는, 신중하게 코딩해야 합니다:
temp = d['xx']             # 사본을 꺼냅니다
temp.append(5)             # 사본을 수정합니다
d['xx'] = temp             # 영속적으로 만들기 위해, 사본을 다시 저장합니다

# 또는, d=shelve.open(filename,writeback=True)는 단지 d['xx'].append(5)로
# 코딩해도 기대한 대로 동작하게 만들지만, 더 많은 메모리를 소비하고 d.close() 연산을 더
# 느리게 만듭니다.

d.close()                  # 닫습니다
@end example


@subsubheading 더 보기



@table @asis

@item 모듈 @ref{35,,dbm}

@code{dbm} 스타일 데이터베이스에 대한 범용 인터페이스.

@item 모듈 @ref{ab,,pickle}

Object serialization used by @code{shelve}.
@end table


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node marshal — 내부 파이썬 객체 직렬화,dbm — 유닉스 “데이터베이스” 인터페이스,shelve — 파이썬 객체 지속성,데이터 지속성
@anchor{library/marshal doc}@anchor{2d66}@anchor{library/marshal marshal-internal-python-object-serialization}@anchor{2d67}@anchor{library/marshal module-marshal}@anchor{91}@anchor{library/marshal translation-repo}@anchor{2d68}
@subsection @code{marshal} — 내부 파이썬 객체 직렬화


@geindex module; marshal


__________________________________________________________________


이 모듈은 바이너리 형식으로 파이썬 값을 읽고 쓸 수 있는 함수를 포함합니다. 형식은 파이썬에만 국한되지만, 기계 아키텍처 문제에는 독립적입니다 (예를 들어, 파이썬 값을 PC의 파일에 기록하고 파일을 맥으로 보낸 다음, 그곳에서 다시 읽을 수 있습니다). 형식의 세부 사항은 의도적으로 설명하지 않습니다; 파이썬 버전 간에 변경될 수 있습니다 (드물긴 하지만). @footnote{
이 모듈의 이름은 (다른 것 중에서도) Modula-3의 설계자가 사용하는 약간의 용어에서 유래합니다. 이들은 자급적(self-contained) 형식으로 데이터를 전달하는 데 “마샬링(marshalling)”이라는 용어를 사용합니다. 엄밀히 말하면, “마샬”은 내부의 어떤 데이터를 외부 형식(예를 들어 RPC 버퍼에)으로 변환하는 것을, “역 마샬”은 그 반대 절차를 뜻합니다.
}

@geindex 모듈;피클
@geindex 모듈;쉘프

This is not a general “persistence” module.  For general persistence and
transfer of Python objects through RPC calls, see the modules @ref{ab,,pickle} and
@ref{c8,,shelve}.  The @code{marshal} module exists mainly to support reading and
writing the “pseudo-compiled” code for Python modules of @code{.pyc} files.
Therefore, the Python maintainers reserve the right to modify the marshal format
in backward incompatible ways should the need arise.
The format of code objects is not compatible between Python versions,
even if the version of the format is the same.
De-serializing a code object in the incorrect Python version has undefined behavior.
If you’re serializing and
de-serializing Python objects, use the @code{pickle} module instead – the
performance is comparable, version independence is guaranteed, and pickle
supports a substantially wider range of objects than marshal.

@cartouche
@quotation 경고 
The @code{marshal} module is not intended to be secure against erroneous or
maliciously constructed data.  Never unmarshal data received from an
untrusted or unauthenticated source.
@end quotation
@end cartouche

파일을 읽고 쓰는 함수는 물론 바이트열류 객체에서 작동하는 함수도 있습니다.

@geindex 객체;코드
@geindex 코드 객체

Not all Python object types are supported; in general, only objects whose value
is independent from a particular invocation of Python can be written and read by
this module.  The following types are supported:


@itemize *

@item 
Numeric types: @ref{19b,,int}, @ref{3c3,,bool}, @ref{196,,float}, @ref{197,,complex}.

@item 
Strings (@ref{169,,str}) and @ref{192,,bytes}.
@ref{193,,Bytes-like objects} like @ref{344,,bytearray} are
marshalled as @code{bytes}.

@item 
Containers: @ref{610,,tuple}, @ref{24d,,list}, @ref{184,,set}, @ref{7f1,,frozenset},
and (since @ref{2d69,,version} 5), @ref{693,,slice}.
It should be understood that these are supported only if the values contained
therein are themselves supported.
Recursive containers are supported since @code{version} 3.

@item 
The singletons @ref{884,,None}, @ref{2325,,Ellipsis} and @ref{df4,,StopIteration}.

@item 
@ref{1b,,code} objects, if `allow_code' is true. See note above about
version dependence.
@end itemize


버전 3.4에서 변경: 


@itemize *

@item 
Added format version 3, which supports marshalling recursive lists, sets
and dictionaries.

@item 
Added format version 4, which supports efficient representations
of short strings.
@end itemize



버전 3.14에서 변경: Added format version 5, which allows marshalling slices.


모듈은 다음 함수를 정의합니다:

@geindex dump() (marshal 모듈)
@anchor{library/marshal marshal dump}@anchor{2d6a}
@deffn {함수} marshal.dump (value, file, version=version, /, *, allow_code=True)

열린 파일에 값을 기록합니다. value는 지원되는 형이어야 합니다. 파일은 쓰기 가능한 @ref{206c,,바이너리 파일} 이어야 합니다.

value가 지원되지 않는 형이면 (또는 지원되지 않는 형의 객체를 담고 있다면) @ref{2ec,,ValueError} 예외가 발생합니다 — 하지만, 찌꺼기 데이터도 파일에 기록됩니다. @ref{1df3,,load()}로 객체를 제대로 읽을 수 없습니다. @ref{4e6,,코드 객체}는 `allow_code'가 참일 때만 지원됩니다.

`version' 인자는 @code{dump}가 사용해야 하는 데이터 형식을 나타냅니다 (아래를 참조하십시오).

Raises an @ref{1c6c,,auditing event} @code{marshal.dumps} with arguments @code{value}, @code{version}.


버전 3.13에서 변경: Added the `allow_code' parameter.

@end deffn

@geindex load() (marshal 모듈)
@anchor{library/marshal marshal load}@anchor{1df3}
@deffn {함수} marshal.load (file, /, *, allow_code=True)

열린 파일에서 하나의 값을 읽고 그것을 반환합니다. 유효한 값을 읽히지 않으면 (예를 들어, 데이터가 다른 파이썬 버전의 호환되지 않는 마샬 형식이라서) @ref{14de,,EOFError}, @ref{2ec,,ValueError} 또는 @ref{198,,TypeError}를 발생시킵니다. @ref{4e6,,코드 객체}는 `allow_code'가 참일 때만 지원됩니다. 파일은 읽을 수 있는 @ref{206c,,바이너리 파일} 이어야 합니다.

Raises an @ref{1c6c,,auditing event} @code{marshal.load} with no arguments.

@cartouche
@quotation 참고 
지원하지 않는 형을 포함하는 객체가 @ref{2d6a,,dump()}로 마샬 되었으면, @ref{1df3,,load()}는 역 마샬이 불가능한 형을 @code{None}으로 치환합니다.
@end quotation
@end cartouche


버전 3.10에서 변경: This call used to raise a @code{code.__new__} audit event for each code object. Now
it raises a single @code{marshal.load} event for the entire load operation.



버전 3.13에서 변경: Added the `allow_code' parameter.

@end deffn

@geindex dumps() (marshal 모듈)
@anchor{library/marshal marshal dumps}@anchor{10a4}
@deffn {함수} marshal.dumps (value, version=version, /, *, allow_code=True)

@code{dump(value, file)}에 의해 파일에 기록될 바이트열 객체를 반환합니다. value는 지원되는 형이어야 합니다. value가 지원되지 않는 형이면 (또는 지원되지 않는 형의 객체를 담고 있다면) @ref{2ec,,ValueError} 예외를 발생시킵니다. @ref{4e6,,코드 객체}는 `allow_code'가 참일 때만 지원됩니다.

`version' 인자는 @code{dumps}가 사용해야 하는 데이터 형식을 나타냅니다 (아래를 참조하십시오).

Raises an @ref{1c6c,,auditing event} @code{marshal.dumps} with arguments @code{value}, @code{version}.


버전 3.13에서 변경: Added the `allow_code' parameter.

@end deffn

@geindex loads() (marshal 모듈)
@anchor{library/marshal marshal loads}@anchor{2d6b}
@deffn {함수} marshal.loads (bytes, /, *, allow_code=True)

@ref{193,,바이트열류 객체}를 값으로 변환합니다. 유효한 값이 없으면 @ref{14de,,EOFError}, @ref{2ec,,ValueError} 또는 @ref{198,,TypeError}를 발생시킵니다. @ref{4e6,,코드 객체}는 `allow_code'가 참일 때만 지원됩니다. 입력의 여분의 바이트는 무시됩니다.

Raises an @ref{1c6c,,auditing event} @code{marshal.loads} with argument @code{bytes}.


버전 3.10에서 변경: This call used to raise a @code{code.__new__} audit event for each code object. Now
it raises a single @code{marshal.loads} event for the entire load operation.



버전 3.13에서 변경: Added the `allow_code' parameter.

@end deffn

또한, 다음 상수가 정의됩니다:

@geindex version (marshal 모듈)
@anchor{library/marshal marshal version}@anchor{2d69}
@deffn {데이터} marshal.version

Indicates the format that the module uses.
Version 0 is the historical first version; subsequent versions
add new features.
Generally, a new version becomes the default when it is introduced.


@multitable {xxxxxxxxx} {xxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Version

@tab

Available since

@tab

New features

@item

1

@tab

Python 2.4

@tab

Sharing interned strings

@item

2

@tab

Python 2.5

@tab

Binary representation of floats

@item

3

@tab

Python 3.4

@tab

Support for object instancing and recursion

@item

4

@tab

Python 3.4

@tab

Efficient representation of short strings

@item

5

@tab

Python 3.14

@tab

Support for @ref{693,,slice} objects

@end multitable

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node dbm — 유닉스 “데이터베이스” 인터페이스,sqlite3 — DB-API 2 0 interface for SQLite databases,marshal — 내부 파이썬 객체 직렬화,데이터 지속성
@anchor{library/dbm doc}@anchor{2d6c}@anchor{library/dbm dbm-interfaces-to-unix-databases}@anchor{2d6d}@anchor{library/dbm module-dbm}@anchor{35}@anchor{library/dbm translation-repo}@anchor{2d6e}
@subsection @code{dbm} — 유닉스 “데이터베이스” 인터페이스


@geindex module; dbm

`소스 코드:' Lib/dbm/__init__.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/dbm/__init__.py}


__________________________________________________________________


@code{dbm} is a generic interface to variants of the DBM database:


@itemize *

@item 
@ref{39,,dbm.sqlite3}

@item 
@ref{37,,dbm.gnu}

@item 
@ref{38,,dbm.ndbm}
@end itemize

이러한 모듈이 설치되어 있지 않으면, @ref{36,,dbm.dumb} 모듈에 있는 느리지만 간단한 구현이 사용됩니다. 오라클 Berkeley DB에 대한 제삼자 인터페이스@footnote{https://www.jcea.es/programacion/pybsddb.htm}가 있습니다.

@geindex error
@anchor{library/dbm dbm error}@anchor{2d6f}
@deffn {예외} dbm.error

지원되는 각 모듈에 의해 발생할 수 있는 예외를 포함하는 튜플. 역시 @ref{2d6f,,dbm.error}라고 이름 붙인 고유한 예외를 첫 번째 항목으로 갖고 있습니다 — @code{dbm.error}가 발생할 때 이것이 사용됩니다.
@end deffn

@geindex whichdb() (dbm 모듈)
@anchor{library/dbm dbm whichdb}@anchor{2d70}
@deffn {함수} dbm.whichdb (filename)

이 함수는 사용 가능한 몇 가지 간단한 데이터베이스 모듈 — @ref{39,,dbm.sqlite3}, @ref{37,,dbm.gnu}, @ref{38,,dbm.ndbm} 또는 @ref{36,,dbm.dumb} — 중 어느 것을 사용하여 주어진 파일을 열어야 하는지 추측합니다.

다음 값 중 하나를 반환합니다:


@itemize *

@item 
읽을 수 없거나 존재하지 않아 파일을 열 수 없으면 @code{None}

@item 
파일 형식을 추측할 수 없으면 빈 문자열(@code{'@w{'}})

@item 
필요한 모듈 이름을 포함하는 문자열, 가령 @code{'dbm.ndbm'}이나 @code{'dbm.gnu'}
@end itemize


버전 3.11에서 변경: `filename' accepts a @ref{5a0,,path-like object}.

@end deffn

@c Substitutions for the open() flag param docs;
@c all submodules use the same text.

@geindex open() (dbm 모듈)
@anchor{library/dbm dbm open}@anchor{112b}
@deffn {함수} dbm.open (file, flag='r', mode=0o666)

데이터베이스를 열고 해당 데이터베이스 객체를 반환합니다.

@*매개변수: 

@itemize *

@item 
@code{file} (@ref{5a0,,path-like object}) – 열 데이터베이스 파일. 데이터베이스 파일이 이미 존재하면, @ref{2d70,,whichdb()} 함수를 사용하여 유형을 판별하고 적절한 모듈이 사용됩니다; 존재하지 않으면, 위에 나열된 것 중 임포트 할 수 있는 첫 번째 서브 모듈이 사용됩니다.

@item 
@code{flag} (@ref{169,,str}) – 

@itemize *

@item 
@code{'r'} (기본값): Open existing database for reading only.

@item 
@code{'w'}: Open existing database for reading and writing.

@item 
@code{'c'}: Open database for reading and writing, creating it if it doesn’t exist.

@item 
@code{'n'}: Always create a new, empty database, open for reading and writing.
@end itemize


@item 
@code{mode} (@ref{19b,,int}) – The Unix file access mode of the file (default: octal @code{0o666}),
used only when the database has to be created.
@end itemize



버전 3.11에서 변경: `file' accepts a @ref{5a0,,path-like object}.

@end deffn

The object returned by @ref{112b,,open()} supports the basic
functionality of mutable @ref{13c0,,mappings};
keys and their corresponding values can be stored, retrieved, and
deleted, and iteration, the @ref{34b,,in} operator and methods @code{keys()},
@code{get()}, @code{setdefault()} and @code{clear()} are available.
The @code{keys()} method returns a list instead of a view object.
The @code{setdefault()} method requires two arguments.

키와 값은 항상 @ref{192,,bytes}로 저장됩니다. 이는 문자열이 사용될 때 저장되기 전에 기본 인코딩으로 묵시적으로 변환됨을 의미합니다.

이 객체는 @ref{186,,with} 문에서도 사용되도록 지원해서, 완료될 때 자동으로 닫힙니다.


버전 3.2에서 변경: @code{get()} and @code{setdefault()} methods are now available for all
@code{dbm} backends.



버전 3.4에서 변경: @ref{112b,,open()}이 반환한 객체에 컨텍스트 관리 프로토콜에 대한 기본 지원을 추가했습니다.



버전 3.8에서 변경: 읽기 전용 데이터베이스에서 키를 삭제하면 @ref{5e5,,KeyError} 대신 데이터베이스 모듈 특정 예외가 발생합니다.



버전 3.13에서 변경: @code{clear()} methods are now available for all @code{dbm} backends.


다음 예제는 일부 호스트 명과 해당 제목을 기록한 다음, 데이터베이스의 내용을 인쇄합니다:

@example
import dbm

# 데이터베이스를 엽니다, 필요하면 만듭니다.
with dbm.open('cache', 'c') as db:

    # 어떤 값을 저장합니다
    db[b'hello'] = b'there'
    db['www.python.org'] = 'Python Website'
    db['www.cnn.com'] = 'Cable News Network'

    # 키는 이제 바이트열로 간주함에 유의하십시오.
    assert db[b'www.python.org'] == b'Python Website'
    # 값이 바이트열임에 주목하십시오.
    assert db['www.cnn.com'] == b'Cable News Network'

    # 종종 사용되는 dict 인터페이스의 메서드도 작동합니다.
    print(db.get('python.org', b'not present'))

    # 문자열이 아닌 키나 값을 저장하면 예외(대부분 TypeError)가
    # 발생합니다.
    db['www.yahoo.com'] = 4

# with 문을 떠날 때 db가 자동으로 닫힙니다.
@end example


@subsubheading 더 보기



@table @asis

@item 모듈 @ref{c8,,shelve}

문자열이 아닌 데이터를 저장하는 지속성 모듈.
@end table


개별 서브 모듈은 다음 섹션에서 설명합니다.

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

@end menu

@node dbm sqlite3 — SQLite backend for dbm,dbm gnu — GNU database manager,,dbm — 유닉스 “데이터베이스” 인터페이스
@anchor{library/dbm dbm-sqlite3-sqlite-backend-for-dbm}@anchor{2d71}@anchor{library/dbm module-dbm sqlite3}@anchor{39}
@subsubsection @code{dbm.sqlite3} — SQLite backend for dbm


@geindex module; dbm.sqlite3


Added in version 3.13.


`소스 코드:' Lib/dbm/sqlite3.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/dbm/sqlite3.py}


__________________________________________________________________


This module uses the standard library @ref{d4,,sqlite3} module to provide an
SQLite backend for the @code{dbm} module.
The files created by @code{dbm.sqlite3} can thus be opened by @code{sqlite3},
or any other SQLite browser, including the SQLite CLI.

@c include for modules that don't work on WASM

@ref{213c,,가용성}: not WASI.

이 모듈은 웹어셈블리에서 작동하지 않거나 제공되지 않습니다. 자세한 내용은 @ref{1b68,,웹어셈블리 플랫폼}을 참조하세요.

@geindex open() (dbm.sqlite3 모듈)
@anchor{library/dbm dbm sqlite3 open}@anchor{2d72}
@deffn {함수} dbm.sqlite3.open (filename, /, flag='r', mode=0o666)

Open an SQLite database.

@*매개변수: 

@itemize *

@item 
@code{filename} (@ref{5a0,,path-like object}) – The path to the database to be opened.

@item 
@code{flag} (@ref{169,,str}) – 

@itemize *

@item 
@code{'r'} (기본값): Open existing database for reading only.

@item 
@code{'w'}: Open existing database for reading and writing.

@item 
@code{'c'}: Open database for reading and writing, creating it if it doesn’t exist.

@item 
@code{'n'}: Always create a new, empty database, open for reading and writing.
@end itemize


@item 
@code{mode} – 파일의 유닉스 파일 액세스 모드 (기본값: 8진수 @code{0o666}), 데이터베이스를 만들어야 할 때만 사용됩니다.
@end itemize


The returned database object behaves similar to a mutable @ref{13c0,,mapping},
but the @code{keys()} method returns a list, and
the @code{setdefault()} method requires two arguments.
It also supports a “closing” context manager via the @ref{186,,with} keyword.

The following method is also provided:

@geindex close() (dbm.sqlite3.sqlite3 메서드)
@anchor{library/dbm dbm sqlite3 sqlite3 close}@anchor{2d73}
@deffn {메서드} sqlite3.close ()

Close the SQLite database.
@end deffn
@end deffn

@node dbm gnu — GNU database manager,dbm ndbm — New Database Manager,dbm sqlite3 — SQLite backend for dbm,dbm — 유닉스 “데이터베이스” 인터페이스
@anchor{library/dbm dbm-gnu-gnu-database-manager}@anchor{2d74}@anchor{library/dbm module-dbm gnu}@anchor{37}
@subsubsection @code{dbm.gnu} — GNU database manager


@geindex module; dbm.gnu

`소스 코드:' Lib/dbm/gnu.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/dbm/gnu.py}


__________________________________________________________________


The @code{dbm.gnu} module provides an interface to the @abbr{GDBM,GNU dbm}
library, similar to the @ref{38,,dbm.ndbm} module, but with additional
functionality like crash tolerance.

@cartouche
@quotation 참고 
The file formats created by @code{dbm.gnu} and @ref{38,,dbm.ndbm} are incompatible
and can not be used interchangeably.
@end quotation
@end cartouche

@c include for modules that don't work on WASM or mobile platforms

@ref{213c,,가용성}: not Android, not iOS, not WASI.

이 모듈은 @ref{2259,,모바일 플랫폼}이나 @ref{1b68,,웹어셈블리 플랫폼}에서 지원되지 않습니다.

@ref{213c,,가용성}: Unix.

@geindex error
@anchor{library/dbm dbm gnu error}@anchor{c90}
@deffn {예외} dbm.gnu.error

Raised on @code{dbm.gnu}-specific errors, such as I/O errors. @ref{5e5,,KeyError} is
raised for general mapping errors like specifying an incorrect key.
@end deffn

@geindex open_flags (dbm.gnu 모듈)
@anchor{library/dbm dbm gnu open_flags}@anchor{2d75}
@deffn {데이터} dbm.gnu.open_flags

A string of characters the `flag' parameter of @ref{1e1c,,open()} supports.
@end deffn

@geindex open() (dbm.gnu 모듈)
@anchor{library/dbm dbm gnu open}@anchor{1e1c}
@deffn {함수} dbm.gnu.open (filename, flag='r', mode=0o666, /)

GDBM 데이터베이스를 열고 @code{gdbm} 객체를 반환합니다.

@*매개변수: 

@itemize *

@item 
@code{filename} (@ref{5a0,,path-like object}) – 열 데이터베이스 파일.

@item 
@code{flag} (@ref{169,,str}) – 

@itemize *

@item 
@code{'r'} (기본값): Open existing database for reading only.

@item 
@code{'w'}: Open existing database for reading and writing.

@item 
@code{'c'}: Open database for reading and writing, creating it if it doesn’t exist.

@item 
@code{'n'}: Always create a new, empty database, open for reading and writing.
@end itemize

데이터베이스를 여는 방법을 제어하기 위해 다음과 같은 추가 문자가 추가될 수 있습니다:


@itemize *

@item 
@code{'f'}: 데이터베이스를 빠른 모드로 엽니다. 데이터베이스로의 쓰기는 동기화되지 않습니다.

@item 
@code{'s'}: 동기화 모드. 데이터베이스 변경 사항이 파일에 즉시 기록됩니다.

@item 
@code{'u'}: 데이터베이스를 잠그지 않습니다.
@end itemize

모든 플래그가 모든 버전의 GDBM에서 유효한 것은 아닙니다. 지원되는 플래그 문자의 목록은 @code{open_flags} 멤버를 참조하세요.


@item 
@code{mode} (@ref{19b,,int}) – The Unix file access mode of the file (default: octal @code{0o666}),
used only when the database has to be created.
@end itemize


@*예외 발생: 
@ref{c90,,error} – 유효하지 않은 `flag' 인자가 전달될 때.



버전 3.11에서 변경: `filename' accepts a @ref{5a0,,path-like object}.


@code{gdbm} objects behave similar to mutable @ref{13c0,,mappings},
but methods @code{items()}, @code{values()}, @code{pop()}, @code{popitem()},
and @code{update()} are not supported,
the @code{keys()} method returns a list, and
the @code{setdefault()} method requires two arguments.
It also supports a “closing” context manager via the @ref{186,,with} keyword.


버전 3.2에서 변경: Added the @code{get()} and @code{setdefault()} methods.



버전 3.13에서 변경: Added the @code{clear()} method.


The following methods are also provided:

@geindex close() (dbm.gnu.gdbm 메서드)
@anchor{library/dbm dbm gnu gdbm close}@anchor{2d76}
@deffn {메서드} gdbm.close ()

GDBM 데이터베이스를 닫습니다.
@end deffn

@geindex firstkey() (dbm.gnu.gdbm 메서드)
@anchor{library/dbm dbm gnu gdbm firstkey}@anchor{2d77}
@deffn {메서드} gdbm.firstkey ()

이 메서드와 @ref{2d78,,nextkey()} 메서드를 사용하여 데이터베이스의 모든 키를 순회할 수 있습니다. 순회는 GDBM의 내부 해시값 순이며, 키의 값으로 정렬되지 않습니다. 이 메서드는 시작 키를 반환합니다.
@end deffn

@geindex nextkey() (dbm.gnu.gdbm 메서드)
@anchor{library/dbm dbm gnu gdbm nextkey}@anchor{2d78}
@deffn {메서드} gdbm.nextkey (key)

순회에서 `key' 뒤에 오는 키를 반환합니다. 다음 코드는 메모리에 모든 키를 포함하는 리스트를 만들지 않고, 데이터베이스 @code{db}의 모든 키를 인쇄합니다:

@example
k = db.firstkey()
while k is not None:
    print(k)
    k = db.nextkey(k)
@end example
@end deffn

@geindex reorganize() (dbm.gnu.gdbm 메서드)
@anchor{library/dbm dbm gnu gdbm reorganize}@anchor{2d79}
@deffn {메서드} gdbm.reorganize ()

많은 삭제를 수행한 후에, GDBM 파일이 사용하는 공간을 줄이려면, 이 루틴이 데이터베이스를 재구성합니다. @code{gdbm} 객체는 이 재구성을 사용할 때 외에는 데이터베이스 파일의 길이를 줄이지 않습니다; 그렇지 않으면, 삭제된 파일 공간이 유지되고 새 (키, 값) 쌍이 추가될 때 재사용됩니다.
@end deffn

@geindex sync() (dbm.gnu.gdbm 메서드)
@anchor{library/dbm dbm gnu gdbm sync}@anchor{2d7a}
@deffn {메서드} gdbm.sync ()

데이터베이스가 빠른 모드로 열렸을 때, 이 메서드를 사용하면 기록되지 않은 데이터가 디스크에 기록됩니다.
@end deffn
@end deffn

@node dbm ndbm — New Database Manager,dbm dumb — Portable DBM implementation,dbm gnu — GNU database manager,dbm — 유닉스 “데이터베이스” 인터페이스
@anchor{library/dbm dbm-ndbm-new-database-manager}@anchor{2d7b}@anchor{library/dbm module-dbm ndbm}@anchor{38}
@subsubsection @code{dbm.ndbm} — New Database Manager


@geindex module; dbm.ndbm

`소스 코드:' Lib/dbm/ndbm.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/dbm/ndbm.py}


__________________________________________________________________


The @code{dbm.ndbm} module provides an interface to the
@abbr{NDBM,New Database Manager} library.
This module can be used with the “classic” NDBM interface or the
@abbr{GDBM} compatibility interface.

@cartouche
@quotation 참고 
The file formats created by @ref{37,,dbm.gnu} and @code{dbm.ndbm} are incompatible
and can not be used interchangeably.
@end quotation
@end cartouche

@cartouche
@quotation 경고 
The NDBM library shipped as part of macOS has an undocumented limitation on the
size of values, which can result in corrupted database files
when storing values larger than this limit. Reading such corrupted files can
result in a hard crash (segmentation fault).
@end quotation
@end cartouche

@c include for modules that don't work on WASM or mobile platforms

@ref{213c,,가용성}: not Android, not iOS, not WASI.

이 모듈은 @ref{2259,,모바일 플랫폼}이나 @ref{1b68,,웹어셈블리 플랫폼}에서 지원되지 않습니다.

@ref{213c,,가용성}: Unix.

@geindex error
@anchor{library/dbm dbm ndbm error}@anchor{c91}
@deffn {예외} dbm.ndbm.error

Raised on @code{dbm.ndbm}-specific errors, such as I/O errors. @ref{5e5,,KeyError} is raised
for general mapping errors like specifying an incorrect key.
@end deffn

@geindex library (dbm.ndbm 모듈)
@anchor{library/dbm dbm ndbm library}@anchor{2d7c}
@deffn {데이터} dbm.ndbm.library

사용된 NDBM 구현 라이브러리의 이름.
@end deffn

@geindex open() (dbm.ndbm 모듈)
@anchor{library/dbm dbm ndbm open}@anchor{1e1d}
@deffn {함수} dbm.ndbm.open (filename, flag='r', mode=0o666, /)

NDBM 데이터베이스를 열고 @code{ndbm} 객체를 반환합니다.

@*매개변수: 

@itemize *

@item 
@code{filename} (@ref{5a0,,path-like object}) – 데이터베이스 파일의 (@code{.dir}이나 @code{.pag} 확장자가 제거된) 이름(basename)입니다.

@item 
@code{flag} (@ref{169,,str}) – 

@itemize *

@item 
@code{'r'} (기본값): Open existing database for reading only.

@item 
@code{'w'}: Open existing database for reading and writing.

@item 
@code{'c'}: Open database for reading and writing, creating it if it doesn’t exist.

@item 
@code{'n'}: Always create a new, empty database, open for reading and writing.
@end itemize


@item 
@code{mode} (@ref{19b,,int}) – The Unix file access mode of the file (default: octal @code{0o666}),
used only when the database has to be created.
@end itemize



버전 3.11에서 변경: Accepts @ref{5a0,,path-like object} for filename.


@code{ndbm} objects behave similar to mutable @ref{13c0,,mappings},
but methods @code{items()}, @code{values()}, @code{pop()}, @code{popitem()},
and @code{update()} are not supported,
the @code{keys()} method returns a list, and
the @code{setdefault()} method requires two arguments.
It also supports a “closing” context manager via the @ref{186,,with} keyword.


버전 3.2에서 변경: Added the @code{get()} and @code{setdefault()} methods.



버전 3.13에서 변경: Added the @code{clear()} method.


The following method is also provided:

@geindex close() (dbm.ndbm.ndbm 메서드)
@anchor{library/dbm dbm ndbm ndbm close}@anchor{2d7d}
@deffn {메서드} ndbm.close ()

NDBM 데이터베이스를 닫습니다.
@end deffn
@end deffn

@node dbm dumb — Portable DBM implementation,,dbm ndbm — New Database Manager,dbm — 유닉스 “데이터베이스” 인터페이스
@anchor{library/dbm dbm-dumb-portable-dbm-implementation}@anchor{2d7e}@anchor{library/dbm module-dbm dumb}@anchor{36}
@subsubsection @code{dbm.dumb} — Portable DBM implementation


@geindex module; dbm.dumb

`소스 코드:' Lib/dbm/dumb.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/dbm/dumb.py}

@geindex 데이터베이스

@cartouche
@quotation 참고 
The @code{dbm.dumb} module is intended as a last resort fallback for the
@code{dbm} module when a more robust module is not available. The @code{dbm.dumb}
module is not written for speed and is not nearly as heavily used as the other
database modules.
@end quotation
@end cartouche


__________________________________________________________________


The @code{dbm.dumb} module provides a persistent @ref{183,,dict}-like
interface which is written entirely in Python.
Unlike other @code{dbm} backends, such as @ref{37,,dbm.gnu}, no
external library is required.

@code{dbm.dumb} 모듈은 다음과 같은 것들을 정의합니다:

@geindex error
@anchor{library/dbm dbm dumb error}@anchor{c8f}
@deffn {예외} dbm.dumb.error

Raised on @code{dbm.dumb}-specific errors, such as I/O errors.  @ref{5e5,,KeyError} is
raised for general mapping errors like specifying an incorrect key.
@end deffn

@geindex open() (dbm.dumb 모듈)
@anchor{library/dbm dbm dumb open}@anchor{c8c}
@deffn {함수} dbm.dumb.open (filename, flag='c', mode=0o666)

Open a @code{dbm.dumb} database.

@*매개변수: 

@itemize *

@item 
@code{filename} – 
The basename of the database file (without extensions).
A new database creates the following files:


@itemize -

@item 
@code{`filename'.dat}

@item 
@code{`filename'.dir}
@end itemize


@item 
@code{flag} (@ref{169,,str}) – 

@itemize *

@item 
@code{'r'}: Open existing database for reading only.

@item 
@code{'w'}: Open existing database for reading and writing.

@item 
@code{'c'} (기본값): Open database for reading and writing, creating it if it doesn’t exist.

@item 
@code{'n'}: Always create a new, empty database, open for reading and writing.
@end itemize


@item 
@code{mode} (@ref{19b,,int}) – The Unix file access mode of the file (default: octal @code{0o666}),
used only when the database has to be created.
@end itemize


@cartouche
@quotation 경고 
파이썬 AST 컴파일러의 스택 깊이 제한으로 인해, 충분히 큰/복잡한 항목이 있는 데이터베이스를 로드할 때 파이썬 인터프리터가 충돌할 수 있습니다.
@end quotation
@end cartouche


버전 3.5에서 변경: `flag'이 @code{'n'} 일 때, @ref{c8c,,open()}은 항상 새 데이터베이스를 만듭니다.



버전 3.8에서 변경: A database opened read-only if `flag' is @code{'r'}.
A database is not created if it does not exist if `flag' is @code{'r'} or @code{'w'}.



버전 3.11에서 변경: `filename' accepts a @ref{5a0,,path-like object}.


The returned database object behaves similar to a mutable @ref{13c0,,mapping},
but the @code{keys()} and @code{items()} methods return lists, and
the @code{setdefault()} method requires two arguments.
It also supports a “closing” context manager via the @ref{186,,with} keyword.

The following methods are also provided:

@geindex close() (dbm.dumb.dumbdbm 메서드)
@anchor{library/dbm dbm dumb dumbdbm close}@anchor{2d7f}
@deffn {메서드} dumbdbm.close ()

데이터베이스를 닫습니다.
@end deffn

@geindex sync() (dbm.dumb.dumbdbm 메서드)
@anchor{library/dbm dbm dumb dumbdbm sync}@anchor{2d80}
@deffn {메서드} dumbdbm.sync ()

디스크 상의 디렉터리와 데이터 파일을 동기화합니다. 이 메서드는 @ref{2d61,,shelve.Shelf.sync()} 메서드에 의해 호출됩니다.
@end deffn
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node sqlite3 — DB-API 2 0 interface for SQLite databases,,dbm — 유닉스 “데이터베이스” 인터페이스,데이터 지속성
@anchor{library/sqlite3 doc}@anchor{2d81}@anchor{library/sqlite3 module-sqlite3}@anchor{d4}@anchor{library/sqlite3 sqlite3-db-api-2-0-interface-for-sqlite-databases}@anchor{2d82}@anchor{library/sqlite3 translation-repo}@anchor{2d83}
@subsection @code{sqlite3} — DB-API 2.0 interface for SQLite databases


@geindex module; sqlite3

`소스 코드:' Lib/sqlite3/@footnote{https://github.com/python/cpython/tree/3.14/Lib/sqlite3/}

@c Make sure we always doctest the tutorial with an empty database.

@c import sqlite3
@c src = sqlite3.connect(":memory:", isolation_level=None)
@c dst = sqlite3.connect("tutorial.db", isolation_level=None)
@c src.backup(dst)
@c src.close()
@c dst.close()
@c del src, dst
@anchor{library/sqlite3 sqlite3-intro}@anchor{2d84}
SQLite는 별도의 서버 프로세스가 필요 없고 SQL 질의 언어의 비표준 변형을 사용하여 데이터베이스에 액세스할 수 있는 경량 디스크 기반 데이터베이스를 제공하는 C 라이브러리입니다. 일부 응용 프로그램은 내부 데이터 저장을 위해 SQLite를 사용할 수 있습니다. SQLite를 사용하여 응용 프로그램을 프로토타입 한 다음 PostgreSQL 이나 Oracle과 같은 더 큰 데이터베이스로 코드를 이식할 수도 있습니다.

The @code{sqlite3} module was written by Gerhard Häring.  It provides an SQL interface
compliant with the DB-API 2.0 specification described by 
@geindex Python 향상 제안; PEP 249
PEP 249@footnote{https://peps.python.org/pep-0249/}, and
requires the third-party SQLite@footnote{https://sqlite.org/} library.

This is an @ref{2157,,optional module}.
If it is missing from your copy of CPython,
look for documentation from your distributor (that is,
whoever provided Python to you).
If you are the distributor, see @ref{2155,,Requirements for optional modules}.

@c Similar notes appear in the docs of the modules:
@c - zipfile
@c - tarfile

This document includes four main sections:


@itemize *

@item 
@ref{2d85,,Tutorial} teaches how to use the @code{sqlite3} module.

@item 
@ref{2d86,,Reference} describes the classes and functions this module
defines.

@item 
@ref{2d87,,How-to guides} details how to handle specific tasks.

@item 
@ref{2d88,,Explanation} provides in-depth background on
transaction control.
@end itemize


@subsubheading 더 보기



@table @asis

@item @indicateurl{https://www.sqlite.org}

SQLite 웹 페이지; 설명서는 지원되는 SQL 언어에 대한 문법과 사용 가능한 데이터형을 설명합니다.

@item @indicateurl{https://www.w3schools.com/sql/}

SQL 문법 학습을 위한 자습서, 레퍼런스 및 예제

@geindex Python 향상 제안; PEP 249

@item PEP 249@footnote{https://peps.python.org/pep-0249/} - 데이터베이스 API 명세 2.0

Marc-André Lemburg가 작성한 PEP.
@end table


@c We use the following practises for SQL code:
@c - UPPERCASE for keywords
@c - snake_case for schema
@c - single quotes for string literals
@c - singular for table names
@c - if needed, use double quotes for table and column names

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

@end menu

@node Tutorial,Reference,,sqlite3 — DB-API 2 0 interface for SQLite databases
@anchor{library/sqlite3 sqlite3-tutorial}@anchor{2d85}@anchor{library/sqlite3 tutorial}@anchor{2d89}
@subsubsection Tutorial


In this tutorial, you will create a database of Monty Python movies
using basic @code{sqlite3} functionality.
It assumes a fundamental understanding of database concepts,
including cursors@footnote{https://en.wikipedia.org/wiki/Cursor_(databases)} and transactions@footnote{https://en.wikipedia.org/wiki/Database_transaction}.

First, we need to create a new database and open
a database connection to allow @code{sqlite3} to work with it.
Call @ref{5a5,,sqlite3.connect()} to create a connection to
the database @code{tutorial.db} in the current working directory,
implicitly creating it if it does not exist:

@example
import sqlite3
con = sqlite3.connect("tutorial.db")
@end example

The returned @ref{54c,,Connection} object @code{con}
represents the connection to the on-disk database.

In order to execute SQL statements and fetch results from SQL queries,
we will need to use a database cursor.
Call @ref{2d8a,,con.cursor()} to create the @ref{2d8b,,Cursor}:

@example
cur = con.cursor()
@end example

Now that we’ve got a database connection and a cursor,
we can create a database table @code{movie} with columns for title,
release year, and review score.
For simplicity, we can just use column names in the table declaration –
thanks to the flexible typing@footnote{https://www.sqlite.org/flextypegood.html} feature of SQLite,
specifying the data types is optional.
Execute the @code{CREATE TABLE} statement
by calling @ref{5af,,cur.execute(...)}:

@example
cur.execute("CREATE TABLE movie(title, year, score)")
@end example

@c Ideally, we'd use sqlite_schema instead of sqlite_master below,
@c but SQLite versions older than 3.33.0 do not recognise that variant.

We can verify that the new table has been created by querying
the @code{sqlite_master} table built-in to SQLite,
which should now contain an entry for the @code{movie} table definition
(see The Schema Table@footnote{https://www.sqlite.org/schematab.html} for details).
Execute that query by calling @ref{5af,,cur.execute(...)},
assign the result to @code{res},
and call @ref{2d8c,,res.fetchone()} to fetch the resulting row:

@example
>>> res = cur.execute("SELECT name FROM sqlite_master")
>>> res.fetchone()
('movie',)
@end example

We can see that the table has been created,
as the query returns a @ref{610,,tuple} containing the table’s name.
If we query @code{sqlite_master} for a non-existent table @code{spam},
@code{res.fetchone()} will return @code{None}:

@example
>>> res = cur.execute("SELECT name FROM sqlite_master WHERE name='spam'")
>>> res.fetchone() is None
True
@end example

Now, add two rows of data supplied as SQL literals
by executing an @code{INSERT} statement,
once again by calling @ref{5af,,cur.execute(...)}:

@example
cur.execute("""
    INSERT INTO movie VALUES
        ('Monty Python and the Holy Grail', 1975, 8.2),
        ('And Now for Something Completely Different', 1971, 7.5)
""")
@end example

The @code{INSERT} statement implicitly opens a transaction,
which needs to be committed before changes are saved in the database
(see @ref{2d8d,,Transaction control} for details).
Call @ref{2d8e,,con.commit()} on the connection object
to commit the transaction:

@example
con.commit()
@end example

We can verify that the data was inserted correctly
by executing a @code{SELECT} query.
Use the now-familiar @ref{5af,,cur.execute(...)} to
assign the result to @code{res},
and call @ref{2d8f,,res.fetchall()} to return all resulting rows:

@example
>>> res = cur.execute("SELECT score FROM movie")
>>> res.fetchall()
[(8.2,), (7.5,)]
@end example

The result is a @ref{24d,,list} of two @code{tuple}s, one per row,
each containing that row’s @code{score} value.

Now, insert three more rows by calling
@ref{5b0,,cur.executemany(...)}:

@example
data = [
    ("Monty Python Live at the Hollywood Bowl", 1982, 7.9),
    ("Monty Python's The Meaning of Life", 1983, 7.5),
    ("Monty Python's Life of Brian", 1979, 8.0),
]
cur.executemany("INSERT INTO movie VALUES(?, ?, ?)", data)
con.commit()  # Remember to commit the transaction after executing INSERT.
@end example

Notice that @code{?} placeholders are used to bind @code{data} to the query.
Always use placeholders instead of @ref{2058,,string formatting}
to bind Python values to SQL statements,
to avoid SQL injection attacks@footnote{https://en.wikipedia.org/wiki/SQL_injection}
(see @ref{5b1,,How to use placeholders to bind values in SQL queries} for more details).

We can verify that the new rows were inserted
by executing a @code{SELECT} query,
this time iterating over the results of the query:

@example
>>> for row in cur.execute("SELECT year, title FROM movie ORDER BY year"):
...     print(row)
(1971, 'And Now for Something Completely Different')
(1975, 'Monty Python and the Holy Grail')
(1979, "Monty Python's Life of Brian")
(1982, 'Monty Python Live at the Hollywood Bowl')
(1983, "Monty Python's The Meaning of Life")
@end example

Each row is a two-item @ref{610,,tuple} of @code{(year, title)},
matching the columns selected in the query.

Finally, verify that the database has been written to disk
by calling @ref{54d,,con.close()}
to close the existing connection, opening a new one,
creating a new cursor, then querying the database:

@example
>>> con.close()
>>> new_con = sqlite3.connect("tutorial.db")
>>> new_cur = new_con.cursor()
>>> res = new_cur.execute("SELECT title, year FROM movie ORDER BY score DESC")
>>> title, year = res.fetchone()
>>> print(f'The highest scoring Monty Python movie is @{title!r@}, released in @{year@}')
The highest scoring Monty Python movie is 'Monty Python and the Holy Grail', released in 1975
>>> new_con.close()
@end example

You’ve now created an SQLite database using the @code{sqlite3} module,
inserted data and retrieved values from it in multiple ways.


@subsubheading 더 보기



@itemize *

@item 
@ref{2d87,,How-to guides} for further reading:


@itemize *

@item 
@ref{5b1,,How to use placeholders to bind values in SQL queries}

@item 
@ref{2d90,,How to adapt custom Python types to SQLite values}

@item 
@ref{2d91,,How to convert SQLite values to custom Python types}

@item 
@ref{1b6a,,How to use the connection context manager}

@item 
@ref{2d92,,How to create and use row factories}
@end itemize

@item 
@ref{2d88,,Explanation} for in-depth background on transaction control.
@end itemize


@node Reference,How-to guides,Tutorial,sqlite3 — DB-API 2 0 interface for SQLite databases
@anchor{library/sqlite3 reference}@anchor{2d93}@anchor{library/sqlite3 sqlite3-reference}@anchor{2d86}
@subsubsection Reference


@c We keep the old sqlite3-module-contents ref to prevent breaking links.
@anchor{library/sqlite3 sqlite3-module-contents}@anchor{2d94}
@menu
* Module functions:: 
* Module constants:: 
* Connection objects:: 
* Cursor objects:: 
* Row objects:: 
* Blob objects:: 
* PrepareProtocol objects:: 
* 예외: 예외<5>. 
* SQLite 와 파이썬 형:: 
* Default adapters and converters (deprecated): Default adapters and converters deprecated. 
* Command-line interface: Command-line interface<2>. 

@end menu

@node Module functions,Module constants,,Reference
@anchor{library/sqlite3 module-functions}@anchor{2d95}@anchor{library/sqlite3 sqlite3-module-functions}@anchor{2d96}
@subsubsection Module functions


@geindex connect() (sqlite3 모듈)
@anchor{library/sqlite3 sqlite3 connect}@anchor{5a5}
@deffn {함수} sqlite3.connect (database, timeout=5.0, detect_types=0, isolation_level='DEFERRED', check_same_thread=True, factory=sqlite3.Connection, cached_statements=128, uri=False, *, autocommit=sqlite3.LEGACY_TRANSACTION_CONTROL)

Open a connection to an SQLite database.

@*매개변수: 

@itemize *

@item 
@code{database} (@ref{5a0,,path-like object}) – The path to the database file to be opened.
You can pass @code{":memory:"} to create an SQLite database existing only in memory@footnote{https://sqlite.org/inmemorydb.html}, and open a connection
to it.

@item 
@code{timeout} (@ref{196,,float}) – How many seconds the connection should wait before raising
an @ref{1c50,,OperationalError} when a table is locked.
If another connection opens a transaction to modify a table,
that table will be locked until the transaction is committed.
Default five seconds.

@item 
@code{detect_types} (@ref{19b,,int}) – Control whether and how data types not
@ref{2d97,,natively supported by SQLite}
are looked up to be converted to Python types,
using the converters registered with @ref{2d98,,register_converter()}.
Set it to any combination (using @code{|}, bitwise or) of
@ref{2d99,,PARSE_DECLTYPES} and @ref{2d9a,,PARSE_COLNAMES}
to enable this.
Column names take precedence over declared types if both flags are set.
By default (@code{0}), type detection is disabled.

@item 
@code{isolation_level} (@ref{169,,str}@code{ | }@code{None}) – Control legacy transaction handling behaviour.
See @ref{2d9b,,Connection.isolation_level} and
@ref{2d9c,,Transaction control via the isolation_level attribute} for more information.
Can be @code{"DEFERRED"} (default), @code{"EXCLUSIVE"} or @code{"IMMEDIATE"};
or @code{None} to disable opening transactions implicitly.
Has no effect unless @ref{6dc,,Connection.autocommit} is set to
@ref{2d9d,,LEGACY_TRANSACTION_CONTROL} (the default).

@item 
@code{check_same_thread} (@ref{3c3,,bool}) – If @code{True} (default), @ref{305,,ProgrammingError} will be raised
if the database connection is used by a thread
other than the one that created it.
If @code{False}, the connection may be accessed in multiple threads;
write operations may need to be serialized by the user
to avoid data corruption.
See @ref{88b,,threadsafety} for more information.

@item 
@code{factory} (@ref{54c,,Connection}) – A custom subclass of @ref{54c,,Connection} to create the connection with,
if not the default @code{Connection} class.

@item 
@code{cached_statements} (@ref{19b,,int}) – The number of statements that @code{sqlite3}
should internally cache for this connection, to avoid parsing overhead.
By default, 128 statements.

@item 
@code{uri} (@ref{3c3,,bool}) – If set to @code{True}, `database' is interpreted as a
@abbr{URI,Uniform Resource Identifier} with a file path
and an optional query string.
The scheme part `must' be @code{"file:"},
and the path can be relative or absolute.
The query string allows passing parameters to SQLite,
enabling various @ref{2d9e,,How to work with SQLite URIs}.

@item 
@code{autocommit} (@ref{3c3,,bool}) – Control 
@geindex Python 향상 제안; PEP 249
PEP 249@footnote{https://peps.python.org/pep-0249/} transaction handling behaviour.
See @ref{6dc,,Connection.autocommit} and
@ref{6dd,,Transaction control via the autocommit attribute} for more information.
`autocommit' currently defaults to
@ref{2d9d,,LEGACY_TRANSACTION_CONTROL}.
The default will change to @code{False} in a future Python release.
@end itemize


@*반환 형식: 
@ref{54c,,Connection}


인자 @code{database}로 @ref{1c6c,,감사 이벤트(auditing event)} @code{sqlite3.connect}를 발생시킵니다.

Raises an @ref{1c6c,,auditing event} @code{sqlite3.connect/handle} with argument @code{connection_handle}.


버전 3.4에서 변경: `uri' 매개 변수가 추가되었습니다.



버전 3.7에서 변경: `database'는 이제 문자열뿐만 아니라 @ref{5a0,,경로류 객체} 일 수도 있습니다.



버전 3.10에서 변경: Added the @code{sqlite3.connect/handle} auditing event.



버전 3.12에서 변경: Added the `autocommit' parameter.



버전 3.13에서 변경: Positional use of the parameters `timeout', `detect_types',
`isolation_level', `check_same_thread', `factory', `cached_statements',
and `uri' is deprecated.
They will become keyword-only parameters in Python 3.15.

@end deffn

@geindex complete_statement() (sqlite3 모듈)
@anchor{library/sqlite3 sqlite3 complete_statement}@anchor{2d9f}
@deffn {함수} sqlite3.complete_statement (statement)

Return @code{True} if the string `statement' appears to contain
one or more complete SQL statements.
No syntactic verification or parsing of any kind is performed,
other than checking that there are no unclosed string literals
and the statement is terminated by a semicolon.

For example:

@example
>>> sqlite3.complete_statement("SELECT foo FROM bar;")
True
>>> sqlite3.complete_statement("SELECT foo")
False
@end example

This function may be useful during command-line input
to determine if the entered text seems to form a complete SQL statement,
or if additional input is needed before calling @ref{5af,,execute()}.

See @code{runsource()} in Lib/sqlite3/__main__.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/sqlite3/__main__.py}
for real-world use.
@end deffn

@geindex enable_callback_tracebacks() (sqlite3 모듈)
@anchor{library/sqlite3 sqlite3 enable_callback_tracebacks}@anchor{2da0}
@deffn {함수} sqlite3.enable_callback_tracebacks (flag, /)

Enable or disable callback tracebacks.
By default you will not get any tracebacks in user-defined functions,
aggregates, converters, authorizer callbacks etc. If you want to debug them,
you can call this function with `flag' set to @code{True}. Afterwards, you
will get tracebacks from callbacks on @ref{b33,,sys.stderr}. Use @code{False}
to disable the feature again.

@cartouche
@quotation 참고 
Errors in user-defined function callbacks are logged as unraisable exceptions.
Use an @ref{506,,unraisable hook handler} for
introspection of the failed callback.
@end quotation
@end cartouche
@end deffn

@geindex register_adapter() (sqlite3 모듈)
@anchor{library/sqlite3 sqlite3 register_adapter}@anchor{2da1}
@deffn {함수} sqlite3.register_adapter (type, adapter, /)

Register an `adapter' @ref{2da2,,callable} to adapt the Python type `type'
into an SQLite type.
The adapter is called with a Python object of type `type' as its sole
argument, and must return a value of a
@ref{2d97,,type that SQLite natively understands}.
@end deffn

@geindex register_converter() (sqlite3 모듈)
@anchor{library/sqlite3 sqlite3 register_converter}@anchor{2d98}
@deffn {함수} sqlite3.register_converter (typename, converter, /)

Register the `converter' @ref{2da2,,callable} to convert SQLite objects of type
`typename' into a Python object of a specific type.
The converter is invoked for all SQLite values of type `typename';
it is passed a @ref{192,,bytes} object and should return an object of the
desired Python type.
Consult the parameter `detect_types' of
@ref{5a5,,connect()} for information regarding how type detection works.

Note: `typename' and the name of the type in your query are matched
case-insensitively.
@end deffn

@node Module constants,Connection objects,Module functions,Reference
@anchor{library/sqlite3 module-constants}@anchor{2da3}@anchor{library/sqlite3 sqlite3-module-constants}@anchor{2da4}
@subsubsection Module constants


@geindex LEGACY_TRANSACTION_CONTROL (sqlite3 모듈)
@anchor{library/sqlite3 sqlite3 LEGACY_TRANSACTION_CONTROL}@anchor{2d9d}
@deffn {데이터} sqlite3.LEGACY_TRANSACTION_CONTROL

Set @ref{6dc,,autocommit} to this constant to select
old style (pre-Python 3.12) transaction control behaviour.
See @ref{2d9c,,Transaction control via the isolation_level attribute} for more information.
@end deffn

@geindex PARSE_DECLTYPES (sqlite3 모듈)
@anchor{library/sqlite3 sqlite3 PARSE_DECLTYPES}@anchor{2d99}
@deffn {데이터} sqlite3.PARSE_DECLTYPES

Pass this flag value to the `detect_types' parameter of
@ref{5a5,,connect()} to look up a converter function using
the declared types for each column.
The types are declared when the database table is created.
@code{sqlite3} will look up a converter function using the first word of the
declared type as the converter dictionary key.
For example:

@example
CREATE TABLE test(
   i integer primary key,  ! will look up a converter named "integer"
   p point,                ! will look up a converter named "point"
   n number(10)            ! will look up a converter named "number"
 )
@end example

This flag may be combined with @ref{2d9a,,PARSE_COLNAMES} using the @code{|}
(bitwise or) operator.

@cartouche
@quotation 참고 
Generated fields (for example @code{MAX(p)}) are returned as @ref{169,,str}.
Use @code{PARSE_COLNAMES} to enforce types for such queries.
@end quotation
@end cartouche
@end deffn

@geindex PARSE_COLNAMES (sqlite3 모듈)
@anchor{library/sqlite3 sqlite3 PARSE_COLNAMES}@anchor{2d9a}
@deffn {데이터} sqlite3.PARSE_COLNAMES

Pass this flag value to the `detect_types' parameter of
@ref{5a5,,connect()} to look up a converter function by
using the type name, parsed from the query column name,
as the converter dictionary key.
The query column name must be wrapped in double quotes (@code{"})
and the type name must be wrapped in square brackets (@code{[]}).

@example
SELECT MAX(p) as "p [point]" FROM test;  ! will look up converter "point"
@end example

This flag may be combined with @ref{2d99,,PARSE_DECLTYPES} using the @code{|}
(bitwise or) operator.
@end deffn

@geindex SQLITE_OK (sqlite3 모듈)
@geindex SQLITE_DENY (sqlite3 모듈)
@geindex SQLITE_IGNORE (sqlite3 모듈)
@anchor{library/sqlite3 sqlite3 SQLITE_OK}@anchor{2da5}
@deffn {데이터} sqlite3.SQLITE_OK
@anchor{library/sqlite3 sqlite3 SQLITE_DENY}@anchor{2da6}
@deffnx {데이터} sqlite3.SQLITE_DENY
@anchor{library/sqlite3 sqlite3 SQLITE_IGNORE}@anchor{2da7}
@deffnx {데이터} sqlite3.SQLITE_IGNORE

Flags that should be returned by the `authorizer_callback' @ref{2da2,,callable}
passed to @ref{5a8,,Connection.set_authorizer()}, to indicate whether:


@itemize *

@item 
Access is allowed (@code{SQLITE_OK}),

@item 
The SQL statement should be aborted with an error (@code{SQLITE_DENY})

@item 
The column should be treated as a @code{NULL} value (@code{SQLITE_IGNORE})
@end itemize
@end deffn

@geindex apilevel (sqlite3 모듈)
@anchor{library/sqlite3 sqlite3 apilevel}@anchor{2da8}
@deffn {데이터} sqlite3.apilevel

String constant stating the supported DB-API level. Required by the DB-API.
Hard-coded to @code{"2.0"}.
@end deffn

@geindex paramstyle (sqlite3 모듈)
@anchor{library/sqlite3 sqlite3 paramstyle}@anchor{2da9}
@deffn {데이터} sqlite3.paramstyle

String constant stating the type of parameter marker formatting expected by
the @code{sqlite3} module. Required by the DB-API. Hard-coded to
@code{"qmark"}.

@cartouche
@quotation 참고 
The @code{named} DB-API parameter style is also supported.
@end quotation
@end cartouche
@end deffn

@geindex sqlite_version (sqlite3 모듈)
@anchor{library/sqlite3 sqlite3 sqlite_version}@anchor{303}
@deffn {데이터} sqlite3.sqlite_version

Version number of the runtime SQLite library as a @ref{169,,string}.
@end deffn

@geindex sqlite_version_info (sqlite3 모듈)
@anchor{library/sqlite3 sqlite3 sqlite_version_info}@anchor{304}
@deffn {데이터} sqlite3.sqlite_version_info

Version number of the runtime SQLite library as a @ref{610,,tuple} of
@ref{19b,,integers}.
@end deffn

@geindex threadsafety (sqlite3 모듈)
@anchor{library/sqlite3 sqlite3 threadsafety}@anchor{88b}
@deffn {데이터} sqlite3.threadsafety

Integer constant required by the DB-API 2.0, stating the level of thread
safety the @code{sqlite3} module supports. This attribute is set based on
the default threading mode@footnote{https://sqlite.org/threadsafe.html} the
underlying SQLite library is compiled with. The SQLite threading modes are:


@enumerate 

@item 
`Single-thread': In this mode, all mutexes are disabled and SQLite is
unsafe to use in more than a single thread at once.

@item 
`Multi-thread': In this mode, SQLite can be safely used by multiple
threads provided that no single database connection is used
simultaneously in two or more threads.

@item 
`Serialized': In serialized mode, SQLite can be safely used by
multiple threads with no restriction.
@end enumerate

The mappings from SQLite threading modes to DB-API 2.0 threadsafety levels
are as follows:


@multitable {xxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

SQLite threading
mode

@tab

@geindex Python 향상 제안; PEP 0249#threadsafety
threadsafety@footnote{https://peps.python.org/pep-0249/#threadsafety}

@tab

SQLITE_THREADSAFE@footnote{https://sqlite.org/compile.html#threadsafe}

@tab

DB-API 2.0 meaning

@item

single-thread

@tab

0

@tab

0

@tab

Threads may not share the
module

@item

multi-thread

@tab

1

@tab

2

@tab

Threads may share the module,
but not connections

@item

serialized

@tab

3

@tab

1

@tab

Threads may share the module,
connections and cursors

@end multitable



버전 3.11에서 변경: Set `threadsafety' dynamically instead of hard-coding it to @code{1}.

@end deffn

@geindex SQLITE_DBCONFIG_DEFENSIVE (sqlite3 모듈)
@geindex SQLITE_DBCONFIG_DQS_DDL (sqlite3 모듈)
@geindex SQLITE_DBCONFIG_DQS_DML (sqlite3 모듈)
@geindex SQLITE_DBCONFIG_ENABLE_FKEY (sqlite3 모듈)
@geindex SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER (sqlite3 모듈)
@geindex SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION (sqlite3 모듈)
@geindex SQLITE_DBCONFIG_ENABLE_QPSG (sqlite3 모듈)
@geindex SQLITE_DBCONFIG_ENABLE_TRIGGER (sqlite3 모듈)
@geindex SQLITE_DBCONFIG_ENABLE_VIEW (sqlite3 모듈)
@geindex SQLITE_DBCONFIG_LEGACY_ALTER_TABLE (sqlite3 모듈)
@geindex SQLITE_DBCONFIG_LEGACY_FILE_FORMAT (sqlite3 모듈)
@geindex SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE (sqlite3 모듈)
@geindex SQLITE_DBCONFIG_RESET_DATABASE (sqlite3 모듈)
@geindex SQLITE_DBCONFIG_TRIGGER_EQP (sqlite3 모듈)
@geindex SQLITE_DBCONFIG_TRUSTED_SCHEMA (sqlite3 모듈)
@geindex SQLITE_DBCONFIG_WRITABLE_SCHEMA (sqlite3 모듈)
@anchor{library/sqlite3 sqlite3-dbconfig-constants}@anchor{2daa}@anchor{library/sqlite3 sqlite3 SQLITE_DBCONFIG_DEFENSIVE}@anchor{2dab}
@deffn {데이터} sqlite3.SQLITE_DBCONFIG_DEFENSIVE
@anchor{library/sqlite3 sqlite3 SQLITE_DBCONFIG_DQS_DDL}@anchor{2dac}
@deffnx {데이터} sqlite3.SQLITE_DBCONFIG_DQS_DDL
@anchor{library/sqlite3 sqlite3 SQLITE_DBCONFIG_DQS_DML}@anchor{2dad}
@deffnx {데이터} sqlite3.SQLITE_DBCONFIG_DQS_DML
@anchor{library/sqlite3 sqlite3 SQLITE_DBCONFIG_ENABLE_FKEY}@anchor{2dae}
@deffnx {데이터} sqlite3.SQLITE_DBCONFIG_ENABLE_FKEY
@anchor{library/sqlite3 sqlite3 SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER}@anchor{2daf}
@deffnx {데이터} sqlite3.SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER
@anchor{library/sqlite3 sqlite3 SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION}@anchor{2db0}
@deffnx {데이터} sqlite3.SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION
@anchor{library/sqlite3 sqlite3 SQLITE_DBCONFIG_ENABLE_QPSG}@anchor{2db1}
@deffnx {데이터} sqlite3.SQLITE_DBCONFIG_ENABLE_QPSG
@anchor{library/sqlite3 sqlite3 SQLITE_DBCONFIG_ENABLE_TRIGGER}@anchor{2db2}
@deffnx {데이터} sqlite3.SQLITE_DBCONFIG_ENABLE_TRIGGER
@anchor{library/sqlite3 sqlite3 SQLITE_DBCONFIG_ENABLE_VIEW}@anchor{2db3}
@deffnx {데이터} sqlite3.SQLITE_DBCONFIG_ENABLE_VIEW
@anchor{library/sqlite3 sqlite3 SQLITE_DBCONFIG_LEGACY_ALTER_TABLE}@anchor{2db4}
@deffnx {데이터} sqlite3.SQLITE_DBCONFIG_LEGACY_ALTER_TABLE
@anchor{library/sqlite3 sqlite3 SQLITE_DBCONFIG_LEGACY_FILE_FORMAT}@anchor{2db5}
@deffnx {데이터} sqlite3.SQLITE_DBCONFIG_LEGACY_FILE_FORMAT
@anchor{library/sqlite3 sqlite3 SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE}@anchor{2db6}
@deffnx {데이터} sqlite3.SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE
@anchor{library/sqlite3 sqlite3 SQLITE_DBCONFIG_RESET_DATABASE}@anchor{2db7}
@deffnx {데이터} sqlite3.SQLITE_DBCONFIG_RESET_DATABASE
@anchor{library/sqlite3 sqlite3 SQLITE_DBCONFIG_TRIGGER_EQP}@anchor{2db8}
@deffnx {데이터} sqlite3.SQLITE_DBCONFIG_TRIGGER_EQP
@anchor{library/sqlite3 sqlite3 SQLITE_DBCONFIG_TRUSTED_SCHEMA}@anchor{2db9}
@deffnx {데이터} sqlite3.SQLITE_DBCONFIG_TRUSTED_SCHEMA
@anchor{library/sqlite3 sqlite3 SQLITE_DBCONFIG_WRITABLE_SCHEMA}@anchor{2dba}
@deffnx {데이터} sqlite3.SQLITE_DBCONFIG_WRITABLE_SCHEMA

These constants are used for the @ref{6e0,,Connection.setconfig()}
and @ref{6df,,getconfig()} methods.

The availability of these constants varies depending on the version of SQLite
Python was compiled with.


Added in version 3.12.



@subsubheading 더 보기



@table @asis

@item @indicateurl{https://www.sqlite.org/c3ref/c_dbconfig_defensive.html}

SQLite docs: Database Connection Configuration Options
@end table

@end deffn


Deprecated since version 3.12, removed in version 3.14: The @code{version} and @code{version_info} constants.


@node Connection objects,Cursor objects,Module constants,Reference
@anchor{library/sqlite3 connection-objects}@anchor{2dbb}@anchor{library/sqlite3 sqlite3-connection-objects}@anchor{2dbc}
@subsubsection Connection objects


@geindex Connection (sqlite3 클래스)
@anchor{library/sqlite3 sqlite3 Connection}@anchor{54c}
@deffn {클래스} sqlite3.Connection

Each open SQLite database is represented by a @code{Connection} object,
which is created using @ref{5a5,,sqlite3.connect()}.
Their main purpose is creating @ref{2d8b,,Cursor} objects,
and @ref{2d8d,,Transaction control}.


@subsubheading 더 보기



@itemize *

@item 
@ref{2dbd,,How to use connection shortcut methods}

@item 
@ref{1b6a,,How to use the connection context manager}
@end itemize



버전 3.13에서 변경: A @ref{54e,,ResourceWarning} is emitted if @ref{54d,,close()} is not called before
a @code{Connection} object is deleted.


An SQLite database connection has the following attributes and methods:

@geindex cursor() (sqlite3.Connection 메서드)
@anchor{library/sqlite3 sqlite3 Connection cursor}@anchor{2d8a}
@deffn {메서드} cursor (factory=Cursor)

Create and return a @ref{2d8b,,Cursor} object.
The cursor method accepts a single optional parameter `factory'. If
supplied, this must be a @ref{2da2,,callable} returning
an instance of @code{Cursor} or its subclasses.
@end deffn

@geindex blobopen() (sqlite3.Connection 메서드)
@anchor{library/sqlite3 sqlite3 Connection blobopen}@anchor{890}
@deffn {메서드} blobopen (table, column, rowid, /, *, readonly=False, name='main')

Open a @ref{891,,Blob} handle to an existing
@abbr{BLOB,Binary Large OBject}.

@*매개변수: 

@itemize *

@item 
@code{table} (@ref{169,,str}) – The name of the table where the blob is located.

@item 
@code{column} (@ref{169,,str}) – The name of the column where the blob is located.

@item 
@code{rowid} (@ref{19b,,int}) – The row id where the blob is located.

@item 
@code{readonly} (@ref{3c3,,bool}) – Set to @code{True} if the blob should be opened without write
permissions.
Defaults to @code{False}.

@item 
@code{name} (@ref{169,,str}) – The name of the database where the blob is located.
Defaults to @code{"main"}.
@end itemize


@*예외 발생: 
@ref{1c50,,OperationalError} – When trying to open a blob in a @code{WITHOUT ROWID} table.


@*반환 형식: 
@ref{891,,Blob}


@cartouche
@quotation 참고 
The blob size cannot be changed using the @ref{891,,Blob} class.
Use the SQL function @code{zeroblob} to create a blob with a fixed size.
@end quotation
@end cartouche


Added in version 3.11.

@end deffn

@geindex commit() (sqlite3.Connection 메서드)
@anchor{library/sqlite3 sqlite3 Connection commit}@anchor{2d8e}
@deffn {메서드} commit ()

Commit any pending transaction to the database.
If @ref{6dc,,autocommit} is @code{True}, or there is no open transaction,
this method does nothing.
If @code{autocommit} is @code{False}, a new transaction is implicitly
opened if a pending transaction was committed by this method.
@end deffn

@geindex rollback() (sqlite3.Connection 메서드)
@anchor{library/sqlite3 sqlite3 Connection rollback}@anchor{2dbe}
@deffn {메서드} rollback ()

Roll back to the start of any pending transaction.
If @ref{6dc,,autocommit} is @code{True}, or there is no open transaction,
this method does nothing.
If @code{autocommit} is @code{False}, a new transaction is implicitly
opened if a pending transaction was rolled back by this method.
@end deffn

@geindex close() (sqlite3.Connection 메서드)
@anchor{library/sqlite3 sqlite3 Connection close}@anchor{54d}
@deffn {메서드} close ()

Close the database connection.
If @ref{6dc,,autocommit} is @code{False},
any pending transaction is implicitly rolled back.
If @code{autocommit} is @code{True} or @ref{2d9d,,LEGACY_TRANSACTION_CONTROL},
no implicit transaction control is executed.
Make sure to @ref{2d8e,,commit()} before closing
to avoid losing pending changes.
@end deffn

@geindex execute() (sqlite3.Connection 메서드)
@anchor{library/sqlite3 sqlite3 Connection execute}@anchor{2dbf}
@deffn {메서드} execute (sql, parameters=(), /)

Create a new @ref{2d8b,,Cursor} object and call
@ref{5af,,execute()} on it with the given `sql' and `parameters'.
Return the new cursor object.
@end deffn

@geindex executemany() (sqlite3.Connection 메서드)
@anchor{library/sqlite3 sqlite3 Connection executemany}@anchor{2dc0}
@deffn {메서드} executemany (sql, parameters, /)

Create a new @ref{2d8b,,Cursor} object and call
@ref{5b0,,executemany()} on it with the given `sql' and `parameters'.
Return the new cursor object.
@end deffn

@geindex executescript() (sqlite3.Connection 메서드)
@anchor{library/sqlite3 sqlite3 Connection executescript}@anchor{2dc1}
@deffn {메서드} executescript (sql_script, /)

Create a new @ref{2d8b,,Cursor} object and call
@ref{2dc2,,executescript()} on it with the given `sql_script'.
Return the new cursor object.
@end deffn

@geindex create_function() (sqlite3.Connection 메서드)
@anchor{library/sqlite3 sqlite3 Connection create_function}@anchor{5a6}
@deffn {메서드} create_function (name, narg, func, *, deterministic=False)

Create or remove a user-defined SQL function.

@*매개변수: 

@itemize *

@item 
@code{name} (@ref{169,,str}) – The name of the SQL function.

@item 
@code{narg} (@ref{19b,,int}) – The number of arguments the SQL function can accept.
If @code{-1}, it may take any number of arguments.

@item 
@code{func} (@ref{2dc3,,callback} | None) – A @ref{2da2,,callable} that is called when the SQL function is invoked.
The callable must return @ref{2d97,,a type natively supported by SQLite}.
Set to @code{None} to remove an existing SQL function.

@item 
@code{deterministic} (@ref{3c3,,bool}) – If @code{True}, the created SQL function is marked as
deterministic@footnote{https://sqlite.org/deterministic.html},
which allows SQLite to perform additional optimizations.
@end itemize



버전 3.8에서 변경: Added the `deterministic' parameter.


예:

@example
>>> import hashlib
>>> def md5sum(t):
...     return hashlib.md5(t).hexdigest()
>>> con = sqlite3.connect(":memory:")
>>> con.create_function("md5", 1, md5sum)
>>> for row in con.execute("SELECT md5(?)", (b"foo",)):
...     print(row)
('acbd18db4cc2f85cedef654fccc4a4d8',)
>>> con.close()
@end example


버전 3.13에서 변경: Passing `name', `narg', and `func' as keyword arguments is deprecated.
These parameters will become positional-only in Python 3.15.

@end deffn

@geindex create_aggregate() (sqlite3.Connection 메서드)
@anchor{library/sqlite3 sqlite3 Connection create_aggregate}@anchor{5a7}
@deffn {메서드} create_aggregate (name, n_arg, aggregate_class)

Create or remove a user-defined SQL aggregate function.

@*매개변수: 

@itemize *

@item 
@code{name} (@ref{169,,str}) – The name of the SQL aggregate function.

@item 
@code{n_arg} (@ref{19b,,int}) – The number of arguments the SQL aggregate function can accept.
If @code{-1}, it may take any number of arguments.

@item 
@code{aggregate_class} (@ref{1cfa,,class} | None) – 
A class must implement the following methods:


@itemize *

@item 
@code{step()}: Add a row to the aggregate.

@item 
@code{finalize()}: Return the final result of the aggregate as
@ref{2d97,,a type natively supported by SQLite}.
@end itemize

The number of arguments that the @code{step()} method must accept
is controlled by `n_arg'.

Set to @code{None} to remove an existing SQL aggregate function.

@end itemize


예:

@example
class MySum:
    def __init__(self):
        self.count = 0

    def step(self, value):
        self.count += value

    def finalize(self):
        return self.count

con = sqlite3.connect(":memory:")
con.create_aggregate("mysum", 1, MySum)
cur = con.execute("CREATE TABLE test(i)")
cur.execute("INSERT INTO test(i) VALUES(1)")
cur.execute("INSERT INTO test(i) VALUES(2)")
cur.execute("SELECT mysum(i) FROM test")
print(cur.fetchone()[0])

con.close()
@end example

@c 3


버전 3.13에서 변경: Passing `name', `n_arg', and `aggregate_class' as keyword arguments is deprecated.
These parameters will become positional-only in Python 3.15.

@end deffn

@geindex create_window_function() (sqlite3.Connection 메서드)
@anchor{library/sqlite3 sqlite3 Connection create_window_function}@anchor{88f}
@deffn {메서드} create_window_function (name, num_params, aggregate_class, /)

Create or remove a user-defined aggregate window function.

@*매개변수: 

@itemize *

@item 
@code{name} (@ref{169,,str}) – The name of the SQL aggregate window function to create or remove.

@item 
@code{num_params} (@ref{19b,,int}) – The number of arguments the SQL aggregate window function can accept.
If @code{-1}, it may take any number of arguments.

@item 
@code{aggregate_class} (@ref{1cfa,,class} | None) – 
A class that must implement the following methods:


@itemize *

@item 
@code{step()}: Add a row to the current window.

@item 
@code{value()}: Return the current value of the aggregate.

@item 
@code{inverse()}: Remove a row from the current window.

@item 
@code{finalize()}: Return the final result of the aggregate as
@ref{2d97,,a type natively supported by SQLite}.
@end itemize

The number of arguments that the @code{step()} and @code{value()} methods
must accept is controlled by `num_params'.

Set to @code{None} to remove an existing SQL aggregate window function.

@end itemize


@*예외 발생: 
@ref{2dc4,,NotSupportedError} – If used with a version of SQLite older than 3.25.0,
which does not support aggregate window functions.



Added in version 3.11.


예:

@example
# Example taken from https://www.sqlite.org/windowfunctions.html#udfwinfunc
class WindowSumInt:
    def __init__(self):
        self.count = 0

    def step(self, value):
        """Add a row to the current window."""
        self.count += value

    def value(self):
        """Return the current value of the aggregate."""
        return self.count

    def inverse(self, value):
        """Remove a row from the current window."""
        self.count -= value

    def finalize(self):
        """Return the final value of the aggregate.

        Any clean-up actions should be placed here.
        """
        return self.count


con = sqlite3.connect(":memory:")
cur = con.execute("CREATE TABLE test(x, y)")
values = [
    ("a", 4),
    ("b", 5),
    ("c", 3),
    ("d", 8),
    ("e", 1),
]
cur.executemany("INSERT INTO test VALUES(?, ?)", values)
con.create_window_function("sumint", 1, WindowSumInt)
cur.execute("""
    SELECT x, sumint(y) OVER (
        ORDER BY x ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING
    ) AS sum_y
    FROM test ORDER BY x
""")
print(cur.fetchall())
con.close()
@end example

@c [('a', 9), ('b', 12), ('c', 16), ('d', 12), ('e', 9)]
@end deffn

@geindex create_collation() (sqlite3.Connection 메서드)
@anchor{library/sqlite3 sqlite3 Connection create_collation}@anchor{885}
@deffn {메서드} create_collation (name, callable, /)

Create a collation named `name' using the collating function `callable'.
`callable' is passed two @ref{169,,string} arguments,
and it should return an @ref{19b,,integer}:


@itemize *

@item 
@code{1} if the first is ordered higher than the second

@item 
@code{-1} if the first is ordered lower than the second

@item 
@code{0} if they are ordered equal
@end itemize

The following example shows a reverse sorting collation:

@example
def collate_reverse(string1, string2):
    if string1 == string2:
        return 0
    elif string1 < string2:
        return 1
    else:
        return -1

con = sqlite3.connect(":memory:")
con.create_collation("reverse", collate_reverse)

cur = con.execute("CREATE TABLE test(x)")
cur.executemany("INSERT INTO test(x) VALUES(?)", [("a",), ("b",)])
cur.execute("SELECT x FROM test ORDER BY x COLLATE reverse")
for row in cur:
    print(row)
con.close()
@end example

@c ('b',)
@c ('a',)

Remove a collation function by setting `callable' to @code{None}.


버전 3.11에서 변경: The collation name can contain any Unicode character.  Earlier, only
ASCII characters were allowed.

@end deffn

@geindex interrupt() (sqlite3.Connection 메서드)
@anchor{library/sqlite3 sqlite3 Connection interrupt}@anchor{2dc5}
@deffn {메서드} interrupt ()

Call this method from a different thread to abort any queries that might
be executing on the connection.
Aborted queries will raise an @ref{1c50,,OperationalError}.
@end deffn

@geindex set_authorizer() (sqlite3.Connection 메서드)
@anchor{library/sqlite3 sqlite3 Connection set_authorizer}@anchor{5a8}
@deffn {메서드} set_authorizer (authorizer_callback)

Register @ref{2da2,,callable} `authorizer_callback' to be invoked
for each attempt to access a column of a table in the database.
The callback should return one of @ref{2da5,,SQLITE_OK},
@ref{2da6,,SQLITE_DENY}, or @ref{2da7,,SQLITE_IGNORE}
to signal how access to the column should be handled
by the underlying SQLite library.

The first argument to the callback signifies what kind of operation is to be
authorized. The second and third argument will be arguments or @code{None}
depending on the first argument. The 4th argument is the name of the database
(“main”, “temp”, etc.) if applicable. The 5th argument is the name of the
inner-most trigger or view that is responsible for the access attempt or
@code{None} if this access attempt is directly from input SQL code.

Please consult the SQLite documentation about the possible values for the first
argument and the meaning of the second and third argument depending on the first
one. All necessary constants are available in the @code{sqlite3} module.

Passing @code{None} as `authorizer_callback' will disable the authorizer.


버전 3.11에서 변경: Added support for disabling the authorizer using @code{None}.



버전 3.13에서 변경: Passing `authorizer_callback' as a keyword argument is deprecated.
The parameter will become positional-only in Python 3.15.

@end deffn

@geindex set_progress_handler() (sqlite3.Connection 메서드)
@anchor{library/sqlite3 sqlite3 Connection set_progress_handler}@anchor{5a9}
@deffn {메서드} set_progress_handler (progress_handler, n)

Register @ref{2da2,,callable} `progress_handler' to be invoked for every `n'
instructions of the SQLite virtual machine. This is useful if you want to
get called from SQLite during long-running operations, for example to update
a GUI.

If you want to clear any previously installed progress handler, call the
method with @code{None} for `progress_handler'.

Returning a non-zero value from the handler function will terminate the
currently executing query and cause it to raise a @ref{2dc6,,DatabaseError}
exception.


버전 3.13에서 변경: Passing `progress_handler' as a keyword argument is deprecated.
The parameter will become positional-only in Python 3.15.

@end deffn

@geindex set_trace_callback() (sqlite3.Connection 메서드)
@anchor{library/sqlite3 sqlite3 Connection set_trace_callback}@anchor{5aa}
@deffn {메서드} set_trace_callback (trace_callback)

Register @ref{2da2,,callable} `trace_callback' to be invoked
for each SQL statement that is actually executed by the SQLite backend.

The only argument passed to the callback is the statement (as
@ref{169,,str}) that is being executed. The return value of the callback is
ignored. Note that the backend does not only run statements passed to the
@ref{5af,,Cursor.execute()} methods.  Other sources include the
@ref{2d8d,,transaction management} of the
@code{sqlite3} module and the execution of triggers defined in the current
database.

Passing @code{None} as `trace_callback' will disable the trace callback.

@cartouche
@quotation 참고 
Exceptions raised in the trace callback are not propagated. As a
development and debugging aid, use
@ref{2da0,,enable_callback_tracebacks()} to enable printing
tracebacks from exceptions raised in the trace callback.
@end quotation
@end cartouche


Added in version 3.3.



버전 3.13에서 변경: Passing `trace_callback' as a keyword argument is deprecated.
The parameter will become positional-only in Python 3.15.

@end deffn

@geindex enable_load_extension() (sqlite3.Connection 메서드)
@anchor{library/sqlite3 sqlite3 Connection enable_load_extension}@anchor{a3f}
@deffn {메서드} enable_load_extension (enabled, /)

Enable the SQLite engine to load SQLite extensions from shared libraries
if `enabled' is @code{True};
else, disallow loading SQLite extensions.
SQLite extensions can define new functions,
aggregates or whole new virtual table implementations.  One well-known
extension is the fulltext-search extension distributed with SQLite.

@cartouche
@quotation 참고 
The @code{sqlite3} module is not built with loadable extension support by
default, because some platforms (notably macOS) have SQLite
libraries which are compiled without this feature.
To get loadable extension support,
you must pass the @ref{215f,,--enable-loadable-sqlite-extensions} option
to @code{configure}.
@end quotation
@end cartouche

Raises an @ref{1c6c,,auditing event} @code{sqlite3.enable_load_extension} with arguments @code{connection}, @code{enabled}.


Added in version 3.2.



버전 3.10에서 변경: Added the @code{sqlite3.enable_load_extension} auditing event.


@c We cannot doctest the load extension API, since there is no convenient
@c way to skip it.

@example
con.enable_load_extension(True)

# Load the fulltext search extension
con.execute("select load_extension('./fts3.so')")

# alternatively you can load the extension using an API call:
# con.load_extension("./fts3.so")

# disable extension loading again
con.enable_load_extension(False)

# example from SQLite wiki
con.execute("CREATE VIRTUAL TABLE recipe USING fts3(name, ingredients)")
con.executescript("""
    INSERT INTO recipe (name, ingredients) VALUES('broccoli stew', 'broccoli peppers cheese tomatoes');
    INSERT INTO recipe (name, ingredients) VALUES('pumpkin stew', 'pumpkin onions garlic celery');
    INSERT INTO recipe (name, ingredients) VALUES('broccoli pie', 'broccoli cheese onions flour');
    INSERT INTO recipe (name, ingredients) VALUES('pumpkin pie', 'pumpkin sugar flour butter');
    """)
for row in con.execute("SELECT rowid, name, ingredients FROM recipe WHERE name MATCH 'pie'"):
    print(row)
@end example
@end deffn

@geindex load_extension() (sqlite3.Connection 메서드)
@anchor{library/sqlite3 sqlite3 Connection load_extension}@anchor{6de}
@deffn {메서드} load_extension (path, /, *, entrypoint=None)

Load an SQLite extension from a shared library.
Enable extension loading with @ref{a3f,,enable_load_extension()} before
calling this method.

@*매개변수: 

@itemize *

@item 
@code{path} (@ref{169,,str}) – The path to the SQLite extension.

@item 
@code{entrypoint} (@ref{169,,str}@code{ | }@code{None}) – Entry point name.
If @code{None} (the default),
SQLite will come up with an entry point name of its own;
see the SQLite docs Loading an Extension@footnote{https://www.sqlite.org/loadext.html#loading_an_extension} for details.
@end itemize


Raises an @ref{1c6c,,auditing event} @code{sqlite3.load_extension} with arguments @code{connection}, @code{path}.


Added in version 3.2.



버전 3.10에서 변경: Added the @code{sqlite3.load_extension} auditing event.



버전 3.12에서 변경: Added the `entrypoint' parameter.

@end deffn

@geindex iterdump() (sqlite3.Connection 메서드)
@anchor{library/sqlite3 sqlite3 Connection iterdump}@anchor{54f}
@deffn {메서드} iterdump (*, filter=None)

Return an @ref{4ca,,iterator} to dump the database as SQL source code.
Useful when saving an in-memory database for later restoration.
Similar to the @code{.dump} command in the @code{sqlite3} shell.

@*매개변수: 
@code{filter} (@ref{169,,str}@code{ | }@code{None}) – An optional @code{LIKE} pattern for database objects to dump, e.g. @code{prefix_%}.
If @code{None} (the default), all database objects will be included.


예:

@example
# Convert file example.db to SQL dump file dump.sql
con = sqlite3.connect('example.db')
with open('dump.sql', 'w') as f:
    for line in con.iterdump():
        f.write('%s\n' % line)
con.close()
@end example


@subsubheading 더 보기


@ref{2dc7,,How to handle non-UTF-8 text encodings}



버전 3.13에서 변경: Added the `filter' parameter.

@end deffn

@geindex backup() (sqlite3.Connection 메서드)
@anchor{library/sqlite3 sqlite3 Connection backup}@anchor{d72}
@deffn {메서드} backup (target, *, pages=-1, progress=None, name='main', sleep=0.250)

Create a backup of an SQLite database.

Works even if the database is being accessed by other clients
or concurrently by the same connection.

@*매개변수: 

@itemize *

@item 
@code{target} (@ref{54c,,Connection}) – The database connection to save the backup to.

@item 
@code{pages} (@ref{19b,,int}) – The number of pages to copy at a time.
If equal to or less than @code{0},
the entire database is copied in a single step.
Defaults to @code{-1}.

@item 
@code{progress} (@ref{2dc3,,callback} | None) – If set to a @ref{2da2,,callable},
it is invoked with three integer arguments for every backup iteration:
the `status' of the last iteration,
the `remaining' number of pages still to be copied,
and the `total' number of pages.
Defaults to @code{None}.

@item 
@code{name} (@ref{169,,str}) – The name of the database to back up.
Either @code{"main"} (the default) for the main database,
@code{"temp"} for the temporary database,
or the name of a custom database as attached using the
@code{ATTACH DATABASE} SQL statement.

@item 
@code{sleep} (@ref{196,,float}) – The number of seconds to sleep between successive attempts
to back up remaining pages.
@end itemize


Example 1, copy an existing database into another:

@example
def progress(status, remaining, total):
    print(f'Copied @{total-remaining@} of @{total@} pages...')

src = sqlite3.connect('example.db')
dst = sqlite3.connect('backup.db')
with dst:
    src.backup(dst, pages=1, progress=progress)
dst.close()
src.close()
@end example

@c Copied 0 of 0 pages...

Example 2, copy an existing database into a transient copy:

@example
src = sqlite3.connect('example.db')
dst = sqlite3.connect(':memory:')
src.backup(dst)
dst.close()
src.close()
@end example


Added in version 3.7.



@subsubheading 더 보기


@ref{2dc7,,How to handle non-UTF-8 text encodings}

@end deffn

@geindex getlimit() (sqlite3.Connection 메서드)
@anchor{library/sqlite3 sqlite3 Connection getlimit}@anchor{88a}
@deffn {메서드} getlimit (category, /)

Get a connection runtime limit.

@*매개변수: 
@code{category} (@ref{19b,,int}) – The SQLite limit category@footnote{https://www.sqlite.org/c3ref/c_limit_attached.html} to be queried.


@*반환 형식: 
@ref{19b,,int}


@*예외 발생: 
@ref{305,,ProgrammingError} – If `category' is not recognised by the underlying SQLite library.


Example, query the maximum length of an SQL statement
for @code{Connection} @code{con} (the default is 1000000000):

@c import sqlite3
@c con = sqlite3.connect(":memory:")
@c con.setlimit(sqlite3.SQLITE_LIMIT_SQL_LENGTH, 1_000_000_000)
@c con.setlimit(sqlite3.SQLITE_LIMIT_ATTACHED, 10)

@example
>>> con.getlimit(sqlite3.SQLITE_LIMIT_SQL_LENGTH)
1000000000
@end example


Added in version 3.11.

@end deffn

@geindex setlimit() (sqlite3.Connection 메서드)
@anchor{library/sqlite3 sqlite3 Connection setlimit}@anchor{889}
@deffn {메서드} setlimit (category, limit, /)

Set a connection runtime limit.
Attempts to increase a limit above its hard upper bound are silently
truncated to the hard upper bound. Regardless of whether or not the limit
was changed, the prior value of the limit is returned.

@*매개변수: 

@itemize *

@item 
@code{category} (@ref{19b,,int}) – The SQLite limit category@footnote{https://www.sqlite.org/c3ref/c_limit_attached.html} to be set.

@item 
@code{limit} (@ref{19b,,int}) – The value of the new limit.
If negative, the current limit is unchanged.
@end itemize


@*반환 형식: 
@ref{19b,,int}


@*예외 발생: 
@ref{305,,ProgrammingError} – If `category' is not recognised by the underlying SQLite library.


Example, limit the number of attached databases to 1
for @code{Connection} @code{con} (the default limit is 10):

@example
>>> con.setlimit(sqlite3.SQLITE_LIMIT_ATTACHED, 1)
10
>>> con.getlimit(sqlite3.SQLITE_LIMIT_ATTACHED)
1
@end example

@c con.close()


Added in version 3.11.

@end deffn

@geindex getconfig() (sqlite3.Connection 메서드)
@anchor{library/sqlite3 sqlite3 Connection getconfig}@anchor{6df}
@deffn {메서드} getconfig (op, /)

Query a boolean connection configuration option.

@*매개변수: 
@code{op} (@ref{19b,,int}) – A @ref{2daa,,SQLITE_DBCONFIG code}.


@*반환 형식: 
@ref{3c3,,bool}



Added in version 3.12.

@end deffn

@geindex setconfig() (sqlite3.Connection 메서드)
@anchor{library/sqlite3 sqlite3 Connection setconfig}@anchor{6e0}
@deffn {메서드} setconfig (op, enable=True, /)

Set a boolean connection configuration option.

@*매개변수: 

@itemize *

@item 
@code{op} (@ref{19b,,int}) – A @ref{2daa,,SQLITE_DBCONFIG code}.

@item 
@code{enable} (@ref{3c3,,bool}) – @code{True} if the configuration option should be enabled (default);
@code{False} if it should be disabled.
@end itemize



Added in version 3.12.

@end deffn

@geindex serialize() (sqlite3.Connection 메서드)
@anchor{library/sqlite3 sqlite3 Connection serialize}@anchor{88d}
@deffn {메서드} serialize (*, name='main')

Serialize a database into a @ref{192,,bytes} object.  For an
ordinary on-disk database file, the serialization is just a copy of the
disk file.  For an in-memory database or a “temp” database, the
serialization is the same sequence of bytes which would be written to
disk if that database were backed up to disk.

@*매개변수: 
@code{name} (@ref{169,,str}) – The database name to be serialized.
Defaults to @code{"main"}.


@*반환 형식: 
@ref{192,,bytes}


@cartouche
@quotation 참고 
This method is only available if the underlying SQLite library has the
serialize API.
@end quotation
@end cartouche


Added in version 3.11.

@end deffn

@geindex deserialize() (sqlite3.Connection 메서드)
@anchor{library/sqlite3 sqlite3 Connection deserialize}@anchor{88e}
@deffn {메서드} deserialize (data, /, *, name='main')

Deserialize a @ref{88d,,serialized} database into a
@code{Connection}.
This method causes the database connection to disconnect from database
`name', and reopen `name' as an in-memory database based on the
serialization contained in `data'.

@*매개변수: 

@itemize *

@item 
@code{data} (@ref{192,,bytes}) – A serialized database.

@item 
@code{name} (@ref{169,,str}) – The database name to deserialize into.
Defaults to @code{"main"}.
@end itemize


@*예외 발생: 

@itemize *

@item 
@ref{1c50,,OperationalError} – If the database connection is currently involved in a read
transaction or a backup operation.

@item 
@ref{2dc6,,DatabaseError} – If `data' does not contain a valid SQLite database.

@item 
@ref{a81,,OverflowError} – If @ref{83f,,len(data)} is larger than @code{2**63 - 1}.
@end itemize


@cartouche
@quotation 참고 
This method is only available if the underlying SQLite library has the
deserialize API.
@end quotation
@end cartouche


Added in version 3.11.

@end deffn

@geindex autocommit (sqlite3.Connection의 속성)
@anchor{library/sqlite3 sqlite3 Connection autocommit}@anchor{6dc}
@deffn {속성} autocommit

This attribute controls 
@geindex Python 향상 제안; PEP 249
PEP 249@footnote{https://peps.python.org/pep-0249/}-compliant transaction behaviour.
@code{autocommit} has three allowed values:


@itemize *

@item 
@code{False}: Select 
@geindex Python 향상 제안; PEP 249
PEP 249@footnote{https://peps.python.org/pep-0249/}-compliant transaction behaviour,
implying that @code{sqlite3} ensures a transaction is always open.
Use @ref{2d8e,,commit()} and @ref{2dbe,,rollback()} to close transactions.

This is the recommended value of @code{autocommit}.

@item 
@code{True}: Use SQLite’s autocommit mode@footnote{https://www.sqlite.org/lang_transaction.html#implicit_versus_explicit_transactions}.
@ref{2d8e,,commit()} and @ref{2dbe,,rollback()} have no effect in this mode.

@item 
@ref{2d9d,,LEGACY_TRANSACTION_CONTROL}:
Pre-Python 3.12 (non-
@geindex Python 향상 제안; PEP 249
PEP 249@footnote{https://peps.python.org/pep-0249/}-compliant) transaction control.
See @ref{2d9b,,isolation_level} for more details.

This is currently the default value of @code{autocommit}.
@end itemize

Changing @code{autocommit} to @code{False} will open a new transaction,
and changing it to @code{True} will commit any pending transaction.

See @ref{6dd,,Transaction control via the autocommit attribute} for more details.

@cartouche
@quotation 참고 
The @ref{2d9b,,isolation_level} attribute has no effect unless
@ref{6dc,,autocommit} is @ref{2d9d,,LEGACY_TRANSACTION_CONTROL}.
@end quotation
@end cartouche


Added in version 3.12.

@end deffn

@geindex in_transaction (sqlite3.Connection의 속성)
@anchor{library/sqlite3 sqlite3 Connection in_transaction}@anchor{2dc8}
@deffn {속성} in_transaction

This read-only attribute corresponds to the low-level SQLite
autocommit mode@footnote{https://www.sqlite.org/lang_transaction.html#implicit_versus_explicit_transactions}.

@code{True} if a transaction is active (there are uncommitted changes),
@code{False} otherwise.


Added in version 3.2.

@end deffn

@geindex isolation_level (sqlite3.Connection의 속성)
@anchor{library/sqlite3 sqlite3 Connection isolation_level}@anchor{2d9b}
@deffn {속성} isolation_level

Controls the @ref{2d9c,,legacy transaction handling mode} of @code{sqlite3}.
If set to @code{None}, transactions are never implicitly opened.
If set to one of @code{"DEFERRED"}, @code{"IMMEDIATE"}, or @code{"EXCLUSIVE"},
corresponding to the underlying SQLite transaction behaviour@footnote{https://www.sqlite.org/lang_transaction.html#deferred_immediate_and_exclusive_transactions},
@ref{2d9c,,implicit transaction management} is performed.

If not overridden by the `isolation_level' parameter of @ref{5a5,,connect()},
the default is @code{""}, which is an alias for @code{"DEFERRED"}.

@cartouche
@quotation 참고 
Using @ref{6dc,,autocommit} to control transaction handling is
recommended over using @code{isolation_level}.
@code{isolation_level} has no effect unless @code{autocommit} is
set to @ref{2d9d,,LEGACY_TRANSACTION_CONTROL} (the default).
@end quotation
@end cartouche
@end deffn

@geindex row_factory (sqlite3.Connection의 속성)
@anchor{library/sqlite3 sqlite3 Connection row_factory}@anchor{19a5}
@deffn {속성} row_factory

The initial @ref{2dc9,,row_factory}
for @ref{2d8b,,Cursor} objects created from this connection.
Assigning to this attribute does not affect the @code{row_factory}
of existing cursors belonging to this connection, only new ones.
Is @code{None} by default,
meaning each row is returned as a @ref{610,,tuple}.

See @ref{2d92,,How to create and use row factories} for more details.
@end deffn

@geindex text_factory (sqlite3.Connection의 속성)
@anchor{library/sqlite3 sqlite3 Connection text_factory}@anchor{2dca}
@deffn {속성} text_factory

A @ref{2da2,,callable} that accepts a @ref{192,,bytes} parameter
and returns a text representation of it.
The callable is invoked for SQLite values with the @code{TEXT} data type.
By default, this attribute is set to @ref{169,,str}.

See @ref{2dc7,,How to handle non-UTF-8 text encodings} for more details.
@end deffn

@geindex total_changes (sqlite3.Connection의 속성)
@anchor{library/sqlite3 sqlite3 Connection total_changes}@anchor{2dcb}
@deffn {속성} total_changes

Return the total number of database rows that have been modified, inserted, or
deleted since the database connection was opened.
@end deffn
@end deffn

@node Cursor objects,Row objects,Connection objects,Reference
@anchor{library/sqlite3 cursor-objects}@anchor{2dcc}@anchor{library/sqlite3 sqlite3-cursor-objects}@anchor{2dcd}
@subsubsection Cursor objects


@quotation

A @code{Cursor} object represents a database cursor@footnote{https://en.wikipedia.org/wiki/Cursor_(databases)}
which is used to execute SQL statements,
and manage the context of a fetch operation.
Cursors are created using @ref{2d8a,,Connection.cursor()},
or by using any of the @ref{2dbd,,connection shortcut methods}.

Cursor objects are @ref{4ca,,iterators},
meaning that if you @ref{5af,,execute()} a @code{SELECT} query,
you can simply iterate over the cursor to fetch the resulting rows:

@c import sqlite3
@c con = sqlite3.connect(":memory:", isolation_level=None)
@c cur = con.execute("CREATE TABLE data(t)")
@c cur.execute("INSERT INTO data VALUES(1)")

@example
for row in cur.execute("SELECT t FROM data"):
    print(row)
@end example

@c (1,)
@end quotation

@geindex Cursor (sqlite3 클래스)
@anchor{library/sqlite3 sqlite3 Cursor}@anchor{2d8b}
@deffn {클래스} sqlite3.Cursor

@ref{2d8b,,Cursor} 인스턴스에는 다음과 같은 어트리뷰트와 메서드가 있습니다.

@geindex ? (question mark);in SQL statements

@geindex ; (colon);in SQL statements

@geindex execute() (sqlite3.Cursor 메서드)
@anchor{library/sqlite3 sqlite3 Cursor execute}@anchor{5af}
@deffn {메서드} execute (sql, parameters=(), /)

Execute a single SQL statement,
optionally binding Python values using
@ref{5b1,,placeholders}.

@*매개변수: 

@itemize *

@item 
@code{sql} (@ref{169,,str}) – A single SQL statement.

@item 
@code{parameters} (@ref{183,,dict} | @ref{715,,sequence}) – Python values to bind to placeholders in `sql'.
A @code{dict} if named placeholders are used.
A sequence if unnamed placeholders are used.
See @ref{5b1,,How to use placeholders to bind values in SQL queries}.
@end itemize


@*예외 발생: 
@ref{305,,ProgrammingError} – When `sql' contains more than one SQL statement.
When @ref{5b1,,named placeholders} are used
and `parameters' is a sequence instead of a @ref{183,,dict}.


If @ref{6dc,,autocommit} is
@ref{2d9d,,LEGACY_TRANSACTION_CONTROL},
@ref{2d9b,,isolation_level} is not @code{None},
`sql' is an @code{INSERT}, @code{UPDATE}, @code{DELETE}, or @code{REPLACE} statement,
and there is no open transaction,
a transaction is implicitly opened before executing `sql'.


버전 3.14에서 변경: @ref{305,,ProgrammingError} is emitted if
@ref{5b1,,named placeholders} are used
and `parameters' is a sequence instead of a @ref{183,,dict}.


Use @ref{2dc2,,executescript()} to execute multiple SQL statements.
@end deffn

@geindex executemany() (sqlite3.Cursor 메서드)
@anchor{library/sqlite3 sqlite3 Cursor executemany}@anchor{5b0}
@deffn {메서드} executemany (sql, parameters, /)

For every item in `parameters',
repeatedly execute the @ref{5b1,,parameterized}
@abbr{DML,Data Manipulation Language} SQL statement `sql'.

Uses the same implicit transaction handling as @ref{5af,,execute()}.

@*매개변수: 

@itemize *

@item 
@code{sql} (@ref{169,,str}) – A single SQL DML statement.

@item 
@code{parameters} (@ref{142c,,iterable}) – An iterable of parameters to bind with
the placeholders in `sql'.
See @ref{5b1,,How to use placeholders to bind values in SQL queries}.
@end itemize


@*예외 발생: 
@ref{305,,ProgrammingError} – When `sql' contains more than one SQL statement
or is not a DML statement,
When @ref{5b1,,named placeholders} are used
and the items in `parameters' are sequences instead of @ref{183,,dict}s.


예:

@example
rows = [
    ("row1",),
    ("row2",),
]
# cur is an sqlite3.Cursor object
cur.executemany("INSERT INTO data VALUES(?)", rows)
@end example

@c con.close()

@cartouche
@quotation 참고 
Any resulting rows are discarded,
including DML statements with RETURNING clauses@footnote{https://www.sqlite.org/lang_returning.html}.
@end quotation
@end cartouche


버전 3.14에서 변경: @ref{305,,ProgrammingError} is emitted if
@ref{5b1,,named placeholders} are used
and the items in `parameters' are sequences
instead of @ref{183,,dict}s.

@end deffn

@geindex executescript() (sqlite3.Cursor 메서드)
@anchor{library/sqlite3 sqlite3 Cursor executescript}@anchor{2dc2}
@deffn {메서드} executescript (sql_script, /)

Execute the SQL statements in `sql_script'.
If the @ref{6dc,,autocommit} is
@ref{2d9d,,LEGACY_TRANSACTION_CONTROL}
and there is a pending transaction,
an implicit @code{COMMIT} statement is executed first.
No other implicit transaction control is performed;
any transaction control must be added to `sql_script'.

`sql_script' must be a @ref{169,,string}.

예:

@example
# cur is an sqlite3.Cursor object
cur.executescript("""
    BEGIN;
    CREATE TABLE person(firstname, lastname, age);
    CREATE TABLE book(title, author, published);
    CREATE TABLE publisher(name, address);
    COMMIT;
""")
@end example
@end deffn

@geindex fetchone() (sqlite3.Cursor 메서드)
@anchor{library/sqlite3 sqlite3 Cursor fetchone}@anchor{2d8c}
@deffn {메서드} fetchone ()

If @ref{2dc9,,row_factory} is @code{None},
return the next row query result set as a @ref{610,,tuple}.
Else, pass it to the row factory and return its result.
Return @code{None} if no more data is available.
@end deffn

@geindex fetchmany() (sqlite3.Cursor 메서드)
@anchor{library/sqlite3 sqlite3 Cursor fetchmany}@anchor{17ae}
@deffn {메서드} fetchmany (size=cursor.arraysize)

Return the next set of rows of a query result as a @ref{24d,,list}.
Return an empty list if no more rows are available.

The number of rows to fetch per call is specified by the `size' parameter.
If `size' is not given, @ref{17af,,arraysize} determines the number of rows
to be fetched.
If fewer than `size' rows are available,
as many rows as are available are returned.

`size' 매개 변수와 관련된 성능 고려 사항이 있습니다. 최적의 성능을 위해서, 일반적으로 arraysize 어트리뷰트를 사용하는 것이 가장 좋습니다. `size' 매개 변수가 사용되면, @ref{17ae,,fetchmany()} 호출마다 같은 값을 유지하는 것이 가장 좋습니다.


버전 3.14.1에서 변경: Negative `size' values are rejected by raising @ref{2ec,,ValueError}.

@end deffn

@geindex fetchall() (sqlite3.Cursor 메서드)
@anchor{library/sqlite3 sqlite3 Cursor fetchall}@anchor{2d8f}
@deffn {메서드} fetchall ()

Return all (remaining) rows of a query result as a @ref{24d,,list}.
Return an empty list if no rows are available.
Note that the @ref{17af,,arraysize} attribute can affect the performance of
this operation.
@end deffn

@geindex close() (sqlite3.Cursor 메서드)
@anchor{library/sqlite3 sqlite3 Cursor close}@anchor{2dce}
@deffn {메서드} close ()

(@code{__del__}이 호출 될 때가 아니라) 지금 커서를 닫습니다.

이 시점부터는 커서를 사용할 수 없습니다; 커서로 어떤 연산이건 시도하면 @ref{305,,ProgrammingError} 예외가 발생합니다.
@end deffn

@geindex setinputsizes() (sqlite3.Cursor 메서드)
@anchor{library/sqlite3 sqlite3 Cursor setinputsizes}@anchor{2dcf}
@deffn {메서드} setinputsizes (sizes, /)

Required by the DB-API. Does nothing in @code{sqlite3}.
@end deffn

@geindex setoutputsize() (sqlite3.Cursor 메서드)
@anchor{library/sqlite3 sqlite3 Cursor setoutputsize}@anchor{2dd0}
@deffn {메서드} setoutputsize (size, column=None, /)

Required by the DB-API. Does nothing in @code{sqlite3}.
@end deffn

@geindex arraysize (sqlite3.Cursor의 속성)
@anchor{library/sqlite3 sqlite3 Cursor arraysize}@anchor{17af}
@deffn {속성} arraysize

@ref{17ae,,fetchmany()}에 의해 반환되는 행의 수를 제어하는 읽기/쓰기 어트리뷰트. 기본값은 1입니다. 이는 호출 당 하나의 행을 가져오는 것을 뜻합니다.


버전 3.14.1에서 변경: Negative values are rejected by raising @ref{2ec,,ValueError}.

@end deffn

@geindex connection (sqlite3.Cursor의 속성)
@anchor{library/sqlite3 sqlite3 Cursor connection}@anchor{2dd1}
@deffn {속성} connection

Read-only attribute that provides the SQLite database @ref{54c,,Connection}
belonging to the cursor.  A @code{Cursor} object created by
calling @ref{2d8a,,con.cursor()} will have a
@ref{2dd1,,connection} attribute that refers to `con':

@example
>>> con = sqlite3.connect(":memory:")
>>> cur = con.cursor()
>>> cur.connection == con
True
>>> con.close()
@end example
@end deffn

@geindex description (sqlite3.Cursor의 속성)
@anchor{library/sqlite3 sqlite3 Cursor description}@anchor{18ad}
@deffn {속성} description

Read-only attribute that provides the column names of the last query. To
remain compatible with the Python DB API, it returns a 7-tuple for each
column where the last six items of each tuple are @code{None}.

일치하는 행이 없는 @code{SELECT} 문에도 설정됩니다.
@end deffn

@geindex lastrowid (sqlite3.Cursor의 속성)
@anchor{library/sqlite3 sqlite3 Cursor lastrowid}@anchor{ecb}
@deffn {속성} lastrowid

Read-only attribute that provides the row id of the last inserted row. It
is only updated after successful @code{INSERT} or @code{REPLACE} statements
using the @ref{5af,,execute()} method.  For other statements, after
@ref{5b0,,executemany()} or @ref{2dc2,,executescript()}, or if the insertion failed,
the value of @code{lastrowid} is left unchanged.  The initial value of
@code{lastrowid} is @code{None}.

@cartouche
@quotation 참고 
Inserts into @code{WITHOUT ROWID} tables are not recorded.
@end quotation
@end cartouche


버전 3.6에서 변경: @code{REPLACE} 문에 대한 지원이 추가되었습니다.

@end deffn

@geindex rowcount (sqlite3.Cursor의 속성)
@anchor{library/sqlite3 sqlite3 Cursor rowcount}@anchor{1b5e}
@deffn {속성} rowcount

Read-only attribute that provides the number of modified rows for
@code{INSERT}, @code{UPDATE}, @code{DELETE}, and @code{REPLACE} statements;
is @code{-1} for other statements,
including @abbr{CTE,Common Table Expression} queries.
It is only updated by the @ref{5af,,execute()} and @ref{5b0,,executemany()} methods,
after the statement has run to completion.
This means that any resulting rows must be fetched in order for
@code{rowcount} to be updated.
@end deffn

@geindex row_factory (sqlite3.Cursor의 속성)
@anchor{library/sqlite3 sqlite3 Cursor row_factory}@anchor{2dc9}
@deffn {속성} row_factory

Control how a row fetched from this @code{Cursor} is represented.
If @code{None}, a row is represented as a @ref{610,,tuple}.
Can be set to the included @ref{1070,,sqlite3.Row};
or a @ref{2da2,,callable} that accepts two arguments,
a @code{Cursor} object and the @code{tuple} of row values,
and returns a custom object representing an SQLite row.

Defaults to what @ref{19a5,,Connection.row_factory} was set to
when the @code{Cursor} was created.
Assigning to this attribute does not affect
@code{Connection.row_factory} of the parent connection.

See @ref{2d92,,How to create and use row factories} for more details.
@end deffn
@end deffn

@c The sqlite3.Row example used to be a how-to. It has now been incorporated
@c into the Row reference. We keep the anchor here in order not to break
@c existing links.
@anchor{library/sqlite3 sqlite3-columns-by-name}@anchor{2dd2}
@node Row objects,Blob objects,Cursor objects,Reference
@anchor{library/sqlite3 row-objects}@anchor{2dd3}@anchor{library/sqlite3 sqlite3-row-objects}@anchor{2dd4}
@subsubsection Row objects


@geindex Row (sqlite3 클래스)
@anchor{library/sqlite3 sqlite3 Row}@anchor{1070}
@deffn {클래스} sqlite3.Row

A @code{Row} instance serves as a highly optimized
@ref{19a5,,row_factory} for @ref{54c,,Connection} objects.
It supports iteration, equality testing, @ref{83f,,len()},
and @ref{13c0,,mapping} access by column name and index.

Two @code{Row} objects compare equal
if they have identical column names and values.

See @ref{2d92,,How to create and use row factories} for more details.

@geindex keys() (sqlite3.Row 메서드)
@anchor{library/sqlite3 sqlite3 Row keys}@anchor{2dd5}
@deffn {메서드} keys ()

Return a @ref{24d,,list} of column names as @ref{169,,strings}.
Immediately after a query,
it is the first member of each tuple in @ref{18ad,,Cursor.description}.
@end deffn


버전 3.5에서 변경: 슬라이싱 지원이 추가되었습니다.

@end deffn

@node Blob objects,PrepareProtocol objects,Row objects,Reference
@anchor{library/sqlite3 blob-objects}@anchor{2dd6}@anchor{library/sqlite3 sqlite3-blob-objects}@anchor{2dd7}
@subsubsection Blob objects


@geindex Blob (sqlite3 클래스)
@anchor{library/sqlite3 sqlite3 Blob}@anchor{891}
@deffn {클래스} sqlite3.Blob


Added in version 3.11.


A @code{Blob} instance is a @ref{17b3,,file-like object}
that can read and write data in an SQLite @abbr{BLOB}.
Call @ref{83f,,len(blob)} to get the size (number of bytes) of the blob.
Use indices and @ref{24ae,,slices} for direct access to the blob data.

Use the @code{Blob} as a @ref{1e1,,context manager} to ensure that the blob
handle is closed after use.

@example
con = sqlite3.connect(":memory:")
con.execute("CREATE TABLE test(blob_col blob)")
con.execute("INSERT INTO test(blob_col) VALUES(zeroblob(13))")

# Write to our blob, using two write operations:
with con.blobopen("test", "blob_col", 1) as blob:
    blob.write(b"hello, ")
    blob.write(b"world.")
    # Modify the first and last bytes of our blob
    blob[0] = ord("H")
    blob[-1] = ord("!")

# Read the contents of our blob
with con.blobopen("test", "blob_col", 1) as blob:
    greeting = blob.read()

print(greeting)  # outputs "b'Hello, world!'"
con.close()
@end example

@c b'Hello, world!'

@geindex close() (sqlite3.Blob 메서드)
@anchor{library/sqlite3 sqlite3 Blob close}@anchor{2dd8}
@deffn {메서드} close ()

Close the blob.

The blob will be unusable from this point onward.  An
@ref{1c23,,Error} (or subclass) exception will be raised if any
further operation is attempted with the blob.
@end deffn

@geindex read() (sqlite3.Blob 메서드)
@anchor{library/sqlite3 sqlite3 Blob read}@anchor{2dd9}
@deffn {메서드} read (length=-1, /)

Read `length' bytes of data from the blob at the current offset position.
If the end of the blob is reached, the data up to
@abbr{EOF,End of File} will be returned.  When `length' is not
specified, or is negative, @code{read()} will read until the end of
the blob.
@end deffn

@geindex write() (sqlite3.Blob 메서드)
@anchor{library/sqlite3 sqlite3 Blob write}@anchor{2dda}
@deffn {메서드} write (data, /)

Write `data' to the blob at the current offset.  This function cannot
change the blob length.  Writing beyond the end of the blob will raise
@ref{2ec,,ValueError}.
@end deffn

@geindex tell() (sqlite3.Blob 메서드)
@anchor{library/sqlite3 sqlite3 Blob tell}@anchor{2ddb}
@deffn {메서드} tell ()

Return the current access position of the blob.
@end deffn

@geindex seek() (sqlite3.Blob 메서드)
@anchor{library/sqlite3 sqlite3 Blob seek}@anchor{2ddc}
@deffn {메서드} seek (offset, origin=os.SEEK_SET, /)

Set the current access position of the blob to `offset'.  The `origin'
argument defaults to @ref{1492,,os.SEEK_SET} (absolute blob positioning).
Other values for `origin' are @ref{1493,,os.SEEK_CUR} (seek relative to the
current position) and @ref{1494,,os.SEEK_END} (seek relative to the blob’s
end).
@end deffn
@end deffn

@node PrepareProtocol objects,예외<5>,Blob objects,Reference
@anchor{library/sqlite3 prepareprotocol-objects}@anchor{2ddd}
@subsubsection PrepareProtocol objects


@geindex PrepareProtocol (sqlite3 클래스)
@anchor{library/sqlite3 sqlite3 PrepareProtocol}@anchor{1b69}
@deffn {클래스} sqlite3.PrepareProtocol

The PrepareProtocol type’s single purpose is to act as a 
@geindex Python 향상 제안; PEP 246
PEP 246@footnote{https://peps.python.org/pep-0246/} style
adaption protocol for objects that can @ref{2dde,,adapt themselves} to @ref{2d97,,native SQLite types}.
@end deffn

@node 예외<5>,SQLite 와 파이썬 형,PrepareProtocol objects,Reference
@anchor{library/sqlite3 exceptions}@anchor{2ddf}@anchor{library/sqlite3 sqlite3-exceptions}@anchor{2de0}
@subsubsection 예외


The exception hierarchy is defined by the DB-API 2.0 (
@geindex Python 향상 제안; PEP 249
PEP 249@footnote{https://peps.python.org/pep-0249/}).

@geindex Warning
@anchor{library/sqlite3 sqlite3 Warning}@anchor{1bb4}
@deffn {예외} sqlite3.Warning

This exception is not currently raised by the @code{sqlite3} module,
but may be raised by applications using @code{sqlite3},
for example if a user-defined function truncates data while inserting.
@code{Warning} is a subclass of @ref{bcc,,Exception}.
@end deffn

@geindex Error
@anchor{library/sqlite3 sqlite3 Error}@anchor{1c23}
@deffn {예외} sqlite3.Error

The base class of the other exceptions in this module.
Use this to catch all errors with one single @ref{1ab,,except} statement.
@code{Error} is a subclass of @ref{bcc,,Exception}.

If the exception originated from within the SQLite library,
the following two attributes are added to the exception:

@geindex sqlite_errorcode (sqlite3.Error의 속성)
@anchor{library/sqlite3 sqlite3 Error sqlite_errorcode}@anchor{887}
@deffn {속성} sqlite_errorcode

The numeric error code from the
SQLite API@footnote{https://sqlite.org/rescode.html}


Added in version 3.11.

@end deffn

@geindex sqlite_errorname (sqlite3.Error의 속성)
@anchor{library/sqlite3 sqlite3 Error sqlite_errorname}@anchor{888}
@deffn {속성} sqlite_errorname

The symbolic name of the numeric error code
from the SQLite API@footnote{https://sqlite.org/rescode.html}


Added in version 3.11.

@end deffn
@end deffn

@geindex InterfaceError
@anchor{library/sqlite3 sqlite3 InterfaceError}@anchor{88c}
@deffn {예외} sqlite3.InterfaceError

Exception raised for misuse of the low-level SQLite C API.
In other words, if this exception is raised, it probably indicates a bug in the
@code{sqlite3} module.
@code{InterfaceError} is a subclass of @ref{1c23,,Error}.
@end deffn

@geindex DatabaseError
@anchor{library/sqlite3 sqlite3 DatabaseError}@anchor{2dc6}
@deffn {예외} sqlite3.DatabaseError

Exception raised for errors that are related to the database.
This serves as the base exception for several types of database errors.
It is only raised implicitly through the specialised subclasses.
@code{DatabaseError} is a subclass of @ref{1c23,,Error}.
@end deffn

@geindex DataError
@anchor{library/sqlite3 sqlite3 DataError}@anchor{1c4f}
@deffn {예외} sqlite3.DataError

Exception raised for errors caused by problems with the processed data,
like numeric values out of range, and strings which are too long.
@code{DataError} is a subclass of @ref{2dc6,,DatabaseError}.
@end deffn

@geindex OperationalError
@anchor{library/sqlite3 sqlite3 OperationalError}@anchor{1c50}
@deffn {예외} sqlite3.OperationalError

Exception raised for errors that are related to the database’s operation,
and not necessarily under the control of the programmer.
For example, the database path is not found,
or a transaction could not be processed.
@code{OperationalError} is a subclass of @ref{2dc6,,DatabaseError}.
@end deffn

@geindex IntegrityError
@anchor{library/sqlite3 sqlite3 IntegrityError}@anchor{2de1}
@deffn {예외} sqlite3.IntegrityError

데이터베이스의 관계형 무결성이 영향을 받을 때 발생하는 예외. 예를 들어, 외부 키(foreign key) 검사가 실패할 때. @ref{2dc6,,DatabaseError}의 서브 클래스입니다.
@end deffn

@geindex InternalError
@anchor{library/sqlite3 sqlite3 InternalError}@anchor{2de2}
@deffn {예외} sqlite3.InternalError

Exception raised when SQLite encounters an internal error.
If this is raised, it may indicate that there is a problem with the runtime
SQLite library.
@code{InternalError} is a subclass of @ref{2dc6,,DatabaseError}.
@end deffn

@geindex ProgrammingError
@anchor{library/sqlite3 sqlite3 ProgrammingError}@anchor{305}
@deffn {예외} sqlite3.ProgrammingError

Exception raised for @code{sqlite3} API programming errors,
for example supplying the wrong number of bindings to a query,
or trying to operate on a closed @ref{54c,,Connection}.
@code{ProgrammingError} is a subclass of @ref{2dc6,,DatabaseError}.
@end deffn

@geindex NotSupportedError
@anchor{library/sqlite3 sqlite3 NotSupportedError}@anchor{2dc4}
@deffn {예외} sqlite3.NotSupportedError

Exception raised in case a method or database API is not supported by the
underlying SQLite library. For example, setting `deterministic' to
@code{True} in @ref{5a6,,create_function()}, if the underlying SQLite library
does not support deterministic functions.
@code{NotSupportedError} is a subclass of @ref{2dc6,,DatabaseError}.
@end deffn

@node SQLite 와 파이썬 형,Default adapters and converters deprecated,예외<5>,Reference
@anchor{library/sqlite3 sqlite-and-python-types}@anchor{2de3}@anchor{library/sqlite3 sqlite3-types}@anchor{2d97}
@subsubsection SQLite 와 파이썬 형


SQLite는 기본적으로 다음 형을 지원합니다: @code{NULL}, @code{INTEGER}, @code{REAL}, @code{TEXT}, @code{BLOB}.

따라서 다음과 같은 파이썬 형을 아무 문제 없이 SQLite로 보낼 수 있습니다:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxx} 
@headitem

파이썬 형

@tab

SQLite 형

@item

@code{None}

@tab

@code{NULL}

@item

@ref{19b,,int}

@tab

@code{INTEGER}

@item

@ref{196,,float}

@tab

@code{REAL}

@item

@ref{169,,str}

@tab

@code{TEXT}

@item

@ref{192,,bytes}

@tab

@code{BLOB}

@end multitable


이것은 SQLite 형이 기본적으로 파이썬 형으로 변환되는 방법입니다:


@multitable {xxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

SQLite 형

@tab

파이썬 형

@item

@code{NULL}

@tab

@code{None}

@item

@code{INTEGER}

@tab

@ref{19b,,int}

@item

@code{REAL}

@tab

@ref{196,,float}

@item

@code{TEXT}

@tab

@ref{2dca,,text_factory}에 따라 다릅니다, 기본적으로 @ref{169,,str}.

@item

@code{BLOB}

@tab

@ref{192,,bytes}

@end multitable


The type system of the @code{sqlite3} module is extensible in two ways: you can
store additional Python types in an SQLite database via
@ref{2d90,,object adapters},
and you can let the @code{sqlite3} module convert SQLite types to
Python types via @ref{2d91,,converters}.

@node Default adapters and converters deprecated,Command-line interface<2>,SQLite 와 파이썬 형,Reference
@anchor{library/sqlite3 default-adapters-and-converters-deprecated}@anchor{2de4}@anchor{library/sqlite3 sqlite3-default-converters}@anchor{713}
@subsubsection Default adapters and converters (deprecated)


@cartouche
@quotation 참고 
The default adapters and converters are deprecated as of Python 3.12.
Instead, use the @ref{714,,Adapter and converter recipes}
and tailor them to your needs.
@end quotation
@end cartouche

The deprecated default adapters and converters consist of:


@itemize *

@item 
An adapter for @ref{1fa,,datetime.date} objects to @ref{169,,strings} in
ISO 8601@footnote{https://en.wikipedia.org/wiki/ISO_8601} format.

@item 
An adapter for @ref{4e2,,datetime.datetime} objects to strings in
ISO 8601 format.

@item 
A converter for @ref{2d91,,declared} “date” types to
@ref{1fa,,datetime.date} objects.

@item 
A converter for declared “timestamp” types to
@ref{4e2,,datetime.datetime} objects.
Fractional parts will be truncated to 6 digits (microsecond precision).
@end itemize

@cartouche
@quotation 참고 
The default “timestamp” converter ignores UTC offsets in the database and
always returns a naive @ref{4e2,,datetime.datetime} object. To preserve UTC
offsets in timestamps, either leave converters disabled, or register an
offset-aware converter with @ref{2d98,,register_converter()}.
@end quotation
@end cartouche


버전 3.12부터 폐지됨.


@node Command-line interface<2>,,Default adapters and converters deprecated,Reference
@anchor{library/sqlite3 command-line-interface}@anchor{2de5}@anchor{library/sqlite3 sqlite3-cli}@anchor{672}
@subsubsection Command-line interface


The @code{sqlite3} module can be invoked as a script,
using the interpreter’s @ref{23c,,-m} switch,
in order to provide a simple SQLite shell.
The argument signature is as follows:

@example
python -m sqlite3 [-h] [-v] [filename] [sql]
@end example

Type @code{.quit} or CTRL-D to exit the shell.

@geindex python--m-sqlite3-[-h]-[-v]-[filename]-[sql] 명령줄 옵션; -h
@geindex python--m-sqlite3-[-h]-[-v]-[filename]-[sql] 명령줄 옵션; --help
@anchor{library/sqlite3 cmdoption-python-m-sqlite3-h-v-filename-sql-h}@anchor{2de6}@anchor{library/sqlite3 cmdoption-python-m-sqlite3-h-v-filename-sql-help}@anchor{2de7}
@deffn {Option} @w{-}h, @w{-}@w{-}help

Print CLI help.
@end deffn

@geindex python--m-sqlite3-[-h]-[-v]-[filename]-[sql] 명령줄 옵션; -v
@geindex python--m-sqlite3-[-h]-[-v]-[filename]-[sql] 명령줄 옵션; --version
@anchor{library/sqlite3 cmdoption-python-m-sqlite3-h-v-filename-sql-v}@anchor{2de8}@anchor{library/sqlite3 cmdoption-python-m-sqlite3-h-v-filename-sql-version}@anchor{2de9}
@deffn {Option} @w{-}v, @w{-}@w{-}version

Print underlying SQLite library version.
@end deffn


Added in version 3.12.


@node How-to guides,Explanation,Reference,sqlite3 — DB-API 2 0 interface for SQLite databases
@anchor{library/sqlite3 how-to-guides}@anchor{2dea}@anchor{library/sqlite3 sqlite3-howtos}@anchor{2d87}
@subsubsection How-to guides


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

@end menu

@node How to use placeholders to bind values in SQL queries,How to adapt custom Python types to SQLite values,,How-to guides
@anchor{library/sqlite3 how-to-use-placeholders-to-bind-values-in-sql-queries}@anchor{2deb}@anchor{library/sqlite3 sqlite3-placeholders}@anchor{5b1}
@subsubsection How to use placeholders to bind values in SQL queries


SQL operations usually need to use values from Python variables. However,
beware of using Python’s string operations to assemble queries, as they
are vulnerable to SQL injection attacks@footnote{https://en.wikipedia.org/wiki/SQL_injection}. For example, an attacker can simply
close the single quote and inject @code{OR TRUE} to select all rows:

@example
>>> # Never do this -- insecure!
>>> symbol = input()
' OR TRUE; --
>>> sql = "SELECT * FROM stocks WHERE symbol = '%s'" % symbol
>>> print(sql)
SELECT * FROM stocks WHERE symbol = '@w{'} OR TRUE; --'
>>> cur.execute(sql)
@end example

Instead, use the DB-API’s parameter substitution. To insert a variable into a
query string, use a placeholder in the string, and substitute the actual values
into the query by providing them as a @ref{610,,tuple} of values to the second
argument of the cursor’s @ref{5af,,execute()} method.

An SQL statement may use one of two kinds of placeholders:
question marks (qmark style) or named placeholders (named style).
For the qmark style, `parameters' must be a
@ref{715,,sequence} whose length must match the number of placeholders,
or a @ref{305,,ProgrammingError} is raised.
For the named style, `parameters' must be
an instance of a @ref{183,,dict} (or a subclass),
which must contain keys for all named parameters;
any extra items are ignored.
Here’s an example of both styles:

@example
con = sqlite3.connect(":memory:")
cur = con.execute("CREATE TABLE lang(name, first_appeared)")

# This is the named style used with executemany():
data = (
    @{"name": "C", "year": 1972@},
    @{"name": "Fortran", "year": 1957@},
    @{"name": "Python", "year": 1991@},
    @{"name": "Go", "year": 2009@},
)
cur.executemany("INSERT INTO lang VALUES(:name, :year)", data)

# This is the qmark style used in a SELECT query:
params = (1972,)
cur.execute("SELECT * FROM lang WHERE first_appeared = ?", params)
print(cur.fetchall())
con.close()
@end example

@c [('C', 1972)]

@cartouche
@quotation 참고 
@geindex Python 향상 제안; PEP 249
PEP 249@footnote{https://peps.python.org/pep-0249/} numeric placeholders are `not' supported.
If used, they will be interpreted as named placeholders.
@end quotation
@end cartouche

@node How to adapt custom Python types to SQLite values,How to convert SQLite values to custom Python types,How to use placeholders to bind values in SQL queries,How-to guides
@anchor{library/sqlite3 how-to-adapt-custom-python-types-to-sqlite-values}@anchor{2dec}@anchor{library/sqlite3 sqlite3-adapters}@anchor{2d90}
@subsubsection How to adapt custom Python types to SQLite values


SQLite supports only a limited set of data types natively.
To store custom Python types in SQLite databases, `adapt' them to one of the
@ref{2d97,,Python types SQLite natively understands}.

There are two ways to adapt Python objects to SQLite types:
letting your object adapt itself, or using an `adapter callable'.
The latter will take precedence above the former.
For a library that exports a custom type,
it may make sense to enable that type to adapt itself.
As an application developer, it may make more sense to take direct control by
registering custom adapter functions.

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

@end menu

@node How to write adaptable objects,How to register adapter callables,,How to adapt custom Python types to SQLite values
@anchor{library/sqlite3 how-to-write-adaptable-objects}@anchor{2ded}@anchor{library/sqlite3 sqlite3-conform}@anchor{2dde}
@subsubsection How to write adaptable objects


Suppose we have a @code{Point} class that represents a pair of coordinates,
@code{x} and @code{y}, in a Cartesian coordinate system.
The coordinate pair will be stored as a text string in the database,
using a semicolon to separate the coordinates.
This can be implemented by adding a @code{__conform__(self, protocol)}
method which returns the adapted value.
The object passed to `protocol' will be of type @ref{1b69,,PrepareProtocol}.

@example
class Point:
    def __init__(self, x, y):
        self.x, self.y = x, y

    def __conform__(self, protocol):
        if protocol is sqlite3.PrepareProtocol:
            return f"@{self.x@};@{self.y@}"

con = sqlite3.connect(":memory:")
cur = con.cursor()

cur.execute("SELECT ?", (Point(4.0, -3.2),))
print(cur.fetchone()[0])
con.close()
@end example

@c 4.0;-3.2

@node How to register adapter callables,,How to write adaptable objects,How to adapt custom Python types to SQLite values
@anchor{library/sqlite3 how-to-register-adapter-callables}@anchor{2dee}
@subsubsection How to register adapter callables


The other possibility is to create a function that converts the Python object
to an SQLite-compatible type.
This function can then be registered using @ref{2da1,,register_adapter()}.

@example
class Point:
    def __init__(self, x, y):
        self.x, self.y = x, y

def adapt_point(point):
    return f"@{point.x@};@{point.y@}"

sqlite3.register_adapter(Point, adapt_point)

con = sqlite3.connect(":memory:")
cur = con.cursor()

cur.execute("SELECT ?", (Point(1.0, 2.5),))
print(cur.fetchone()[0])
con.close()
@end example

@c 1.0;2.5

@node How to convert SQLite values to custom Python types,Adapter and converter recipes,How to adapt custom Python types to SQLite values,How-to guides
@anchor{library/sqlite3 how-to-convert-sqlite-values-to-custom-python-types}@anchor{2def}@anchor{library/sqlite3 sqlite3-converters}@anchor{2d91}
@subsubsection How to convert SQLite values to custom Python types


Writing an adapter lets you convert `from' custom Python types `to' SQLite
values.
To be able to convert `from' SQLite values `to' custom Python types,
we use `converters'.

Let’s go back to the @code{Point} class. We stored the x and y coordinates
separated via semicolons as strings in SQLite.

First, we’ll define a converter function that accepts the string as a parameter
and constructs a @code{Point} object from it.

@cartouche
@quotation 참고 
Converter functions are `always' passed a @ref{192,,bytes} object,
no matter the underlying SQLite data type.
@end quotation
@end cartouche

@example
def convert_point(s):
    x, y = map(float, s.split(b";"))
    return Point(x, y)
@end example

We now need to tell @code{sqlite3} when it should convert a given SQLite value.
This is done when connecting to a database, using the `detect_types' parameter
of @ref{5a5,,connect()}. There are three options:


@itemize *

@item 
Implicit: set `detect_types' to @ref{2d99,,PARSE_DECLTYPES}

@item 
Explicit: set `detect_types' to @ref{2d9a,,PARSE_COLNAMES}

@item 
Both: set `detect_types' to
@code{sqlite3.PARSE_DECLTYPES | sqlite3.PARSE_COLNAMES}.
Column names take precedence over declared types.
@end itemize

The following example illustrates the implicit and explicit approaches:

@example
class Point:
    def __init__(self, x, y):
        self.x, self.y = x, y

    def __repr__(self):
        return f"Point(@{self.x@}, @{self.y@})"

def adapt_point(point):
    return f"@{point.x@};@{point.y@}"

def convert_point(s):
    x, y = list(map(float, s.split(b";")))
    return Point(x, y)

# Register the adapter and converter
sqlite3.register_adapter(Point, adapt_point)
sqlite3.register_converter("point", convert_point)

# 1) Parse using declared types
p = Point(4.0, -3.2)
con = sqlite3.connect(":memory:", detect_types=sqlite3.PARSE_DECLTYPES)
cur = con.execute("CREATE TABLE test(p point)")

cur.execute("INSERT INTO test(p) VALUES(?)", (p,))
cur.execute("SELECT p FROM test")
print("with declared types:", cur.fetchone()[0])
cur.close()
con.close()

# 2) Parse using column names
con = sqlite3.connect(":memory:", detect_types=sqlite3.PARSE_COLNAMES)
cur = con.execute("CREATE TABLE test(p)")

cur.execute("INSERT INTO test(p) VALUES(?)", (p,))
cur.execute('SELECT p AS "p [point]" FROM test')
print("with column names:", cur.fetchone()[0])
cur.close()
con.close()
@end example

@c with declared types: Point(4.0, -3.2)
@c with column names: Point(4.0, -3.2)

@node Adapter and converter recipes,How to use connection shortcut methods,How to convert SQLite values to custom Python types,How-to guides
@anchor{library/sqlite3 adapter-and-converter-recipes}@anchor{2df0}@anchor{library/sqlite3 sqlite3-adapter-converter-recipes}@anchor{714}
@subsubsection Adapter and converter recipes


This section shows recipes for common adapters and converters.

@example
import datetime as dt
import sqlite3

def adapt_date_iso(val):
    """Adapt datetime.date to ISO 8601 date."""
    return val.isoformat()

def adapt_datetime_iso(val):
    """Adapt datetime.datetime to timezone-naive ISO 8601 date."""
    return val.replace(tzinfo=None).isoformat()

def adapt_datetime_epoch(val):
    """Adapt datetime.datetime to Unix timestamp."""
    return int(val.timestamp())

sqlite3.register_adapter(dt.date, adapt_date_iso)
sqlite3.register_adapter(dt.datetime, adapt_datetime_iso)
sqlite3.register_adapter(dt.datetime, adapt_datetime_epoch)

def convert_date(val):
    """Convert ISO 8601 date to datetime.date object."""
    return dt.date.fromisoformat(val.decode())

def convert_datetime(val):
    """Convert ISO 8601 datetime to datetime.datetime object."""
    return dt.datetime.fromisoformat(val.decode())

def convert_timestamp(val):
    """Convert Unix epoch timestamp to datetime.datetime object."""
    return dt.datetime.fromtimestamp(int(val))

sqlite3.register_converter("date", convert_date)
sqlite3.register_converter("datetime", convert_datetime)
sqlite3.register_converter("timestamp", convert_timestamp)
@end example

@c when = dt.datetime(2019, 5, 18, 15, 17, 8, 123456)
@c 
@c assert adapt_date_iso(when.date()) == "2019-05-18"
@c assert convert_date(b"2019-05-18") == when.date()
@c 
@c assert adapt_datetime_iso(when) == "2019-05-18T15:17:08.123456"
@c assert convert_datetime(b"2019-05-18T15:17:08.123456") == when
@c 
@c # Using current time as fromtimestamp() returns local date/time.
@c # Dropping microseconds as adapt_datetime_epoch truncates fractional second part.
@c now = dt.datetime.now().replace(microsecond=0)
@c current_timestamp = int(now.timestamp())
@c 
@c assert adapt_datetime_epoch(now) == current_timestamp
@c assert convert_timestamp(str(current_timestamp).encode()) == now

@node How to use connection shortcut methods,How to use the connection context manager,Adapter and converter recipes,How-to guides
@anchor{library/sqlite3 how-to-use-connection-shortcut-methods}@anchor{2df1}@anchor{library/sqlite3 sqlite3-connection-shortcuts}@anchor{2dbd}
@subsubsection How to use connection shortcut methods


Using the @ref{2dbf,,execute()},
@ref{2dc0,,executemany()}, and @ref{2dc1,,executescript()}
methods of the @ref{54c,,Connection} class, your code can
be written more concisely because you don’t have to create the (often
superfluous) @ref{2d8b,,Cursor} objects explicitly. Instead, the @code{Cursor}
objects are created implicitly and these shortcut methods return the cursor
objects. This way, you can execute a @code{SELECT} statement and iterate over it
directly using only a single call on the @code{Connection} object.

@example
# Create and fill the table.
con = sqlite3.connect(":memory:")
con.execute("CREATE TABLE lang(name, first_appeared)")
data = [
    ("C++", 1985),
    ("Objective-C", 1984),
]
con.executemany("INSERT INTO lang(name, first_appeared) VALUES(?, ?)", data)

# Print the table contents
for row in con.execute("SELECT name, first_appeared FROM lang"):
    print(row)

print("I just deleted", con.execute("DELETE FROM lang").rowcount, "rows")

# close() is not a shortcut method and it's not called automatically;
# the connection object should be closed manually
con.close()
@end example

@c ('C++', 1985)
@c ('Objective-C', 1984)
@c I just deleted 2 rows

@node How to use the connection context manager,How to work with SQLite URIs,How to use connection shortcut methods,How-to guides
@anchor{library/sqlite3 how-to-use-the-connection-context-manager}@anchor{2df2}@anchor{library/sqlite3 sqlite3-connection-context-manager}@anchor{1b6a}
@subsubsection How to use the connection context manager


A @ref{54c,,Connection} object can be used as a context manager that
automatically commits or rolls back open transactions when leaving the body of
the context manager.
If the body of the @ref{186,,with} statement finishes without exceptions,
the transaction is committed.
If this commit fails,
or if the body of the @code{with} statement raises an uncaught exception,
the transaction is rolled back.
If @ref{6dc,,autocommit} is @code{False},
a new transaction is implicitly opened after committing or rolling back.

If there is no open transaction upon leaving the body of the @code{with} statement,
or if @ref{6dc,,autocommit} is @code{True},
the context manager does nothing.

@cartouche
@quotation 참고 
The context manager neither implicitly opens a new transaction
nor closes the connection. If you need a closing context manager, consider
using @ref{158e,,contextlib.closing()}.
@end quotation
@end cartouche

@example
con = sqlite3.connect(":memory:")
con.execute("CREATE TABLE lang(id INTEGER PRIMARY KEY, name VARCHAR UNIQUE)")

# Successful, con.commit() is called automatically afterwards
with con:
    con.execute("INSERT INTO lang(name) VALUES(?)", ("Python",))

# con.rollback() is called after the with block finishes with an exception,
# the exception is still raised and must be caught
try:
    with con:
        con.execute("INSERT INTO lang(name) VALUES(?)", ("Python",))
except sqlite3.IntegrityError:
    print("couldn't add Python twice")

# Connection object used as context manager only commits or rollbacks transactions,
# so the connection object should be closed manually
con.close()
@end example

@c couldn't add Python twice

@node How to work with SQLite URIs,How to create and use row factories,How to use the connection context manager,How-to guides
@anchor{library/sqlite3 how-to-work-with-sqlite-uris}@anchor{2df3}@anchor{library/sqlite3 sqlite3-uri-tricks}@anchor{2d9e}
@subsubsection How to work with SQLite URIs


Some useful URI tricks include:


@itemize *

@item 
Open a database in read-only mode:
@end itemize

@example
>>> con = sqlite3.connect("file:tutorial.db?mode=ro", uri=True)
>>> con.execute("CREATE TABLE readonly(data)")
Traceback (most recent call last):
OperationalError: attempt to write a readonly database
>>> con.close()
@end example


@itemize *

@item 
Do not implicitly create a new database file if it does not already exist;
will raise @ref{1c50,,OperationalError} if unable to create a new file:
@end itemize

@example
>>> con = sqlite3.connect("file:nosuchdb.db?mode=rw", uri=True)
Traceback (most recent call last):
OperationalError: unable to open database file
@end example


@itemize *

@item 
Create a shared named in-memory database:
@end itemize

@example
db = "file:mem1?mode=memory&cache=shared"
con1 = sqlite3.connect(db, uri=True)
con2 = sqlite3.connect(db, uri=True)
with con1:
    con1.execute("CREATE TABLE shared(data)")
    con1.execute("INSERT INTO shared VALUES(28)")
res = con2.execute("SELECT data FROM shared")
assert res.fetchone() == (28,)

con1.close()
con2.close()
@end example

More information about this feature, including a list of parameters,
can be found in the SQLite URI documentation@footnote{https://www.sqlite.org/uri.html}.

@node How to create and use row factories,How to handle non-UTF-8 text encodings,How to work with SQLite URIs,How-to guides
@anchor{library/sqlite3 how-to-create-and-use-row-factories}@anchor{2df4}@anchor{library/sqlite3 sqlite3-howto-row-factory}@anchor{2d92}
@subsubsection How to create and use row factories


By default, @code{sqlite3} represents each row as a @ref{610,,tuple}.
If a @code{tuple} does not suit your needs,
you can use the @ref{1070,,sqlite3.Row} class
or a custom @ref{2dc9,,row_factory}.

While @code{row_factory} exists as an attribute both on the
@ref{2d8b,,Cursor} and the @ref{54c,,Connection},
it is recommended to set @ref{19a5,,Connection.row_factory},
so all cursors created from the connection will use the same row factory.

@code{Row} provides indexed and case-insensitive named access to columns,
with minimal memory overhead and performance impact over a @code{tuple}.
To use @code{Row} as a row factory,
assign it to the @code{row_factory} attribute:

@example
>>> con = sqlite3.connect(":memory:")
>>> con.row_factory = sqlite3.Row
@end example

Queries now return @code{Row} objects:

@example
>>> res = con.execute("SELECT 'Earth' AS name, 6378 AS radius")
>>> row = res.fetchone()
>>> row.keys()
['name', 'radius']
>>> row[0]         # Access by index.
'Earth'
>>> row["name"]    # Access by name.
'Earth'
>>> row["RADIUS"]  # Column names are case-insensitive.
6378
>>> con.close()
@end example

@cartouche
@quotation 참고 
The @code{FROM} clause can be omitted in the @code{SELECT} statement, as in the
above example. In such cases, SQLite returns a single row with columns
defined by expressions, e.g. literals, with the given aliases
@code{expr AS alias}.
@end quotation
@end cartouche

You can create a custom @ref{2dc9,,row_factory}
that returns each row as a @ref{183,,dict}, with column names mapped to values:

@example
def dict_factory(cursor, row):
    fields = [column[0] for column in cursor.description]
    return @{key: value for key, value in zip(fields, row)@}
@end example

Using it, queries now return a @code{dict} instead of a @code{tuple}:

@example
>>> con = sqlite3.connect(":memory:")
>>> con.row_factory = dict_factory
>>> for row in con.execute("SELECT 1 AS a, 2 AS b"):
...     print(row)
@{'a': 1, 'b': 2@}
>>> con.close()
@end example

The following row factory returns a @ref{85d,,named tuple}:

@example
from collections import namedtuple

def namedtuple_factory(cursor, row):
    fields = [column[0] for column in cursor.description]
    cls = namedtuple("Row", fields)
    return cls._make(row)
@end example

@code{namedtuple_factory()} can be used as follows:

@example
>>> con = sqlite3.connect(":memory:")
>>> con.row_factory = namedtuple_factory
>>> cur = con.execute("SELECT 1 AS a, 2 AS b")
>>> row = cur.fetchone()
>>> row
Row(a=1, b=2)
>>> row[0]  # Indexed access.
1
>>> row.b   # Attribute access.
2
>>> con.close()
@end example

With some adjustments, the above recipe can be adapted to use a
@ref{4e1,,dataclass}, or any other custom class,
instead of a @ref{4e0,,namedtuple}.

@node How to handle non-UTF-8 text encodings,,How to create and use row factories,How-to guides
@anchor{library/sqlite3 how-to-handle-non-utf-8-text-encodings}@anchor{2df5}@anchor{library/sqlite3 sqlite3-howto-encoding}@anchor{2dc7}
@subsubsection How to handle non-UTF-8 text encodings


By default, @code{sqlite3} uses @ref{169,,str} to adapt SQLite values
with the @code{TEXT} data type.
This works well for UTF-8 encoded text, but it might fail for other encodings
and invalid UTF-8.
You can use a custom @ref{2dca,,text_factory} to handle such cases.

Because of SQLite’s flexible typing@footnote{https://www.sqlite.org/flextypegood.html}, it is not uncommon to encounter table
columns with the @code{TEXT} data type containing non-UTF-8 encodings,
or even arbitrary data.
To demonstrate, let’s assume we have a database with ISO-8859-2 (Latin-2)
encoded text, for example a table of Czech-English dictionary entries.
Assuming we now have a @ref{54c,,Connection} instance @code{con}
connected to this database,
we can decode the Latin-2 encoded text using this @ref{2dca,,text_factory}:

@example
con.text_factory = lambda data: str(data, encoding="latin2")
@end example

For invalid UTF-8 or arbitrary data in stored in @code{TEXT} table columns,
you can use the following technique, borrowed from the @ref{14a9,,유니코드 HOWTO}:

@example
con.text_factory = lambda data: str(data, errors="surrogateescape")
@end example

@cartouche
@quotation 참고 
The @code{sqlite3} module API does not support strings
containing surrogates.
@end quotation
@end cartouche


@subsubheading 더 보기


@ref{14a9,,유니코드 HOWTO}


@node Explanation,,How-to guides,sqlite3 — DB-API 2 0 interface for SQLite databases
@anchor{library/sqlite3 explanation}@anchor{2df6}@anchor{library/sqlite3 sqlite3-explanation}@anchor{2d88}
@subsubsection Explanation

@anchor{library/sqlite3 sqlite3-transaction-control}@anchor{2df7}
@menu
* Transaction control:: 

@end menu

@node Transaction control,,,Explanation
@anchor{library/sqlite3 sqlite3-controlling-transactions}@anchor{2d8d}@anchor{library/sqlite3 transaction-control}@anchor{2df8}
@subsubsection Transaction control


@code{sqlite3} offers multiple methods of controlling whether,
when and how database transactions are opened and closed.
@ref{6dd,,Transaction control via the autocommit attribute} is recommended,
while @ref{2d9c,,Transaction control via the isolation_level attribute}
retains the pre-Python 3.12 behaviour.

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

@end menu

@node Transaction control via the autocommit attribute,Transaction control via the isolation_level attribute,,Transaction control
@anchor{library/sqlite3 sqlite3-transaction-control-autocommit}@anchor{6dd}@anchor{library/sqlite3 transaction-control-via-the-autocommit-attribute}@anchor{2df9}
@subsubsection Transaction control via the @code{autocommit} attribute


The recommended way of controlling transaction behaviour is through
the @ref{6dc,,Connection.autocommit} attribute,
which should preferably be set using the `autocommit' parameter
of @ref{5a5,,connect()}.

It is suggested to set `autocommit' to @code{False},
which implies 
@geindex Python 향상 제안; PEP 249
PEP 249@footnote{https://peps.python.org/pep-0249/}-compliant transaction control.
This means:


@itemize *

@item 
@code{sqlite3} ensures that a transaction is always open,
so @ref{5a5,,connect()}, @ref{2d8e,,Connection.commit()}, and @ref{2dbe,,Connection.rollback()}
will implicitly open a new transaction
(immediately after closing the pending one, for the latter two).
@code{sqlite3} uses @code{BEGIN DEFERRED} statements when opening transactions.

@item 
Transactions should be committed explicitly using @code{commit()}.

@item 
Transactions should be rolled back explicitly using @code{rollback()}.

@item 
An implicit rollback is performed if the database is
@ref{54d,,close()}-ed with pending changes.
@end itemize

Set `autocommit' to @code{True} to enable SQLite’s autocommit mode@footnote{https://www.sqlite.org/lang_transaction.html#implicit_versus_explicit_transactions}.
In this mode, @ref{2d8e,,Connection.commit()} and @ref{2dbe,,Connection.rollback()}
have no effect.
Note that SQLite’s autocommit mode is distinct from
the 
@geindex Python 향상 제안; PEP 249
PEP 249@footnote{https://peps.python.org/pep-0249/}-compliant @ref{6dc,,Connection.autocommit} attribute;
use @ref{2dc8,,Connection.in_transaction} to query
the low-level SQLite autocommit mode.

Set `autocommit' to @ref{2d9d,,LEGACY_TRANSACTION_CONTROL}
to leave transaction control behaviour to the
@ref{2d9b,,Connection.isolation_level} attribute.
See @ref{2d9c,,Transaction control via the isolation_level attribute} for more information.

@node Transaction control via the isolation_level attribute,,Transaction control via the autocommit attribute,Transaction control
@anchor{library/sqlite3 sqlite3-transaction-control-isolation-level}@anchor{2d9c}@anchor{library/sqlite3 transaction-control-via-the-isolation-level-attribute}@anchor{2dfa}
@subsubsection Transaction control via the @code{isolation_level} attribute


@cartouche
@quotation 참고 
The recommended way of controlling transactions is via the
@ref{6dc,,autocommit} attribute.
See @ref{6dd,,Transaction control via the autocommit attribute}.
@end quotation
@end cartouche

If @ref{6dc,,Connection.autocommit} is set to
@ref{2d9d,,LEGACY_TRANSACTION_CONTROL} (the default),
transaction behaviour is controlled using
the @ref{2d9b,,Connection.isolation_level} attribute.
Otherwise, @code{isolation_level} has no effect.

If the connection attribute @ref{2d9b,,isolation_level}
is not @code{None},
new transactions are implicitly opened before
@ref{5af,,execute()} and @ref{5b0,,executemany()} executes
@code{INSERT}, @code{UPDATE}, @code{DELETE}, or @code{REPLACE} statements;
for other statements, no implicit transaction handling is performed.
Use the @ref{2d8e,,commit()} and @ref{2dbe,,rollback()} methods
to respectively commit and roll back pending transactions.
You can choose the underlying SQLite transaction behaviour@footnote{https://www.sqlite.org/lang_transaction.html#deferred_immediate_and_exclusive_transactions} —
that is, whether and what type of @code{BEGIN} statements @code{sqlite3}
implicitly executes –
via the @code{isolation_level} attribute.

If @ref{2d9b,,isolation_level} is set to @code{None},
no transactions are implicitly opened at all.
This leaves the underlying SQLite library in autocommit mode@footnote{https://www.sqlite.org/lang_transaction.html#implicit_versus_explicit_transactions},
but also allows the user to perform their own transaction handling
using explicit SQL statements.
The underlying SQLite library autocommit mode can be queried using the
@ref{2dc8,,in_transaction} attribute.

The @ref{2dc2,,executescript()} method implicitly commits
any pending transaction before execution of the given SQL script,
regardless of the value of @ref{2d9b,,isolation_level}.


버전 3.6에서 변경: @code{sqlite3} used to implicitly commit an open transaction before DDL
statements.  This is no longer the case.



버전 3.12에서 변경: The recommended way of controlling transactions is now via the
@ref{6dc,,autocommit} attribute.


@c import os
@c os.remove("backup.db")
@c os.remove("dump.sql")
@c os.remove("example.db")
@c os.remove("tutorial.db")

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 데이터 압축 및 보관,파일 형식,데이터 지속성,파이썬 표준 라이브러리
@anchor{library/archiving doc}@anchor{2d30}@anchor{library/archiving archiving}@anchor{2dfb}@anchor{library/archiving data-compression-and-archiving}@anchor{2dfc}@anchor{library/archiving translation-repo}@anchor{2dfd}
@section 데이터 압축 및 보관


The modules described in this chapter support data compression with the zlib,
gzip, bzip2, lzma, and zstd algorithms, and the creation of ZIP- and tar-format
archives.  See also @ref{141d,,아카이브 연산} provided by the @ref{ca,,shutil}
module.

@menu
* The compression package:: 
* compression.zstd — Compression compatible with the Zstandard format: compression zstd — Compression compatible with the Zstandard format. 
* zlib — gzip 과 호환되는 압축:: 
* gzip — gzip 파일 지원:: 
* bz2 — bzip2 압축 지원:: 
* lzma — LZMA 알고리즘을 사용한 압축:: 
* zipfile — ZIP 아카이브 작업:: 
* tarfile — tar 아카이브 파일 읽기와 쓰기:: 

@end menu

@node The compression package,compression zstd — Compression compatible with the Zstandard format,,데이터 압축 및 보관
@anchor{library/compression doc}@anchor{2dfe}@anchor{library/compression module-compression}@anchor{22}@anchor{library/compression the-compression-package}@anchor{2dff}
@subsection The @code{compression} package


@geindex module; compression


Added in version 3.14.


The @code{compression} package contains the canonical compression modules
containing interfaces to several different compression algorithms. Some of
these modules have historically been available as separate modules; those will
continue to be available under their original names for compatibility reasons,
and will not be removed without a deprecation cycle. The use of modules in
@code{compression} is encouraged where practical.


@itemize *

@item 
@code{compression.bz2} – Re-exports @ref{14,,bz2}

@item 
@code{compression.gzip} – Re-exports @ref{6b,,gzip}

@item 
@code{compression.lzma} – Re-exports @ref{8e,,lzma}

@item 
@code{compression.zlib} – Re-exports @ref{139,,zlib}

@item 
@ref{23,,compression.zstd} – Wrapper for the Zstandard compression library
@end itemize

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node compression zstd — Compression compatible with the Zstandard format,zlib — gzip 과 호환되는 압축,The compression package,데이터 압축 및 보관
@anchor{library/compression zstd doc}@anchor{2e00}@anchor{library/compression zstd compression-zstd-compression-compatible-with-the-zstandard-format}@anchor{2e01}@anchor{library/compression zstd module-compression zstd}@anchor{23}@anchor{library/compression zstd translation-repo}@anchor{2e02}
@subsection @code{compression.zstd} — Compression compatible with the Zstandard format


@geindex module; compression.zstd


Added in version 3.14.


`Source code:' Lib/compression/zstd/__init__.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/compression/zstd/__init__.py}


__________________________________________________________________


This module provides classes and functions for compressing and decompressing
data using the Zstandard (or `zstd') compression algorithm. The
zstd manual@footnote{https://facebook.github.io/zstd/doc/api_manual_latest.html}
describes Zstandard as “a fast lossless compression algorithm, targeting
real-time compression scenarios at zlib-level and better compression ratios.”
Also included is a file interface that supports reading and writing the
contents of @code{.zst} files created by the @code{zstd} utility, as well as
raw zstd compressed streams.

The @code{compression.zstd} module contains:


@itemize *

@item 
The @ref{2e03,,open()} function and @ref{2e04,,ZstdFile} class for reading and
writing compressed files.

@item 
The @ref{2e05,,ZstdCompressor} and @ref{2e06,,ZstdDecompressor} classes for
incremental (de)compression.

@item 
The @ref{2e07,,compress()} and @ref{2e08,,decompress()} functions for one-shot
(de)compression.

@item 
The @ref{2e09,,train_dict()} and @ref{2e0a,,finalize_dict()} functions and the
@ref{2e0b,,ZstdDict} class to train and manage Zstandard dictionaries.

@item 
The @ref{2e0c,,CompressionParameter}, @ref{2e0d,,DecompressionParameter}, and
@ref{2e0e,,Strategy} classes for setting advanced (de)compression parameters.
@end itemize

This is an @ref{2157,,optional module}.
If it is missing from your copy of CPython,
look for documentation from your distributor (that is,
whoever provided Python to you).
If you are the distributor, see @ref{2155,,Requirements for optional modules}.

@c Similar notes appear in the docs of the modules:
@c - zipfile
@c - tarfile

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

@end menu

@node Exceptions<3>,Reading and writing compressed files,,compression zstd — Compression compatible with the Zstandard format
@anchor{library/compression zstd exceptions}@anchor{2e0f}
@subsubsection Exceptions


@geindex ZstdError
@anchor{library/compression zstd compression zstd ZstdError}@anchor{2e10}
@deffn {예외} compression.zstd.ZstdError

This exception is raised when an error occurs during compression or
decompression, or while initializing the (de)compressor state.
@end deffn

@node Reading and writing compressed files,Compressing and decompressing data in memory,Exceptions<3>,compression zstd — Compression compatible with the Zstandard format
@anchor{library/compression zstd reading-and-writing-compressed-files}@anchor{2e11}
@subsubsection Reading and writing compressed files


@geindex open() (compression.zstd 모듈)
@anchor{library/compression zstd compression zstd open}@anchor{2e03}
@deffn {함수} compression.zstd.open (file, /, mode='rb', *, level=None, options=None, zstd_dict=None, encoding=None, errors=None, newline=None)

Open a Zstandard-compressed file in binary or text mode, returning a
@ref{13c8,,file object}.

The `file' argument can be either a file name (given as a
@ref{169,,str}, @ref{192,,bytes} or @ref{5a0,,path-like}
object), in which case the named file is opened, or it can be an existing
file object to read from or write to.

The mode argument can be either @code{'rb'} for reading (default), @code{'wb'} for
overwriting, @code{'ab'} for appending, or @code{'xb'} for exclusive creation.
These can equivalently be given as @code{'r'}, @code{'w'}, @code{'a'}, and @code{'x'}
respectively. You may also open in text mode with @code{'rt'}, @code{'wt'},
@code{'at'}, and @code{'xt'} respectively.

When reading, the `options' argument can be a dictionary providing advanced
decompression parameters; see @ref{2e0d,,DecompressionParameter} for detailed
information about supported
parameters. The `zstd_dict' argument is a @ref{2e0b,,ZstdDict} instance to be
used during decompression. When reading, if the `level'
argument is not None, a @code{TypeError} will be raised.

When writing, the `options' argument can be a dictionary
providing advanced compression parameters; see
@ref{2e0c,,CompressionParameter} for detailed information about supported
parameters. The `level' argument is the compression level to use when
writing compressed data. Only one of `level' or `options' may be non-None.
The `zstd_dict' argument is a @ref{2e0b,,ZstdDict} instance to be used during
compression.

In binary mode, this function is equivalent to the @ref{2e04,,ZstdFile}
constructor: @code{ZstdFile(file, mode, ...)}. In this case, the
`encoding', `errors', and `newline' parameters must not be provided.

In text mode, a @ref{2e04,,ZstdFile} object is created, and wrapped in an
@ref{9be,,io.TextIOWrapper} instance with the specified encoding, error
handling behavior, and line endings.
@end deffn

@geindex ZstdFile (compression.zstd 클래스)
@anchor{library/compression zstd compression zstd ZstdFile}@anchor{2e04}
@deffn {클래스} compression.zstd.ZstdFile (file, /, mode='rb', *, level=None, options=None, zstd_dict=None)

Open a Zstandard-compressed file in binary mode.

A @code{ZstdFile} can wrap an already-open @ref{13c8,,file object}, or operate
directly on a named file. The `file' argument specifies either the file
object to wrap, or the name of the file to open (as a @ref{169,,str},
@ref{192,,bytes} or @ref{5a0,,path-like} object). If
wrapping an existing file object, the wrapped file will not be closed when
the @code{ZstdFile} is closed.

The `mode' argument can be either @code{'rb'} for reading (default), @code{'wb'}
for overwriting, @code{'xb'} for exclusive creation, or @code{'ab'} for appending.
These can equivalently be given as @code{'r'}, @code{'w'}, @code{'x'} and @code{'a'}
respectively.

If `file' is a file object (rather than an actual file name), a mode of
@code{'w'} does not truncate the file, and is instead equivalent to @code{'a'}.

When reading, the `options' argument can be a dictionary
providing advanced decompression parameters; see
@ref{2e0d,,DecompressionParameter} for detailed information about supported
parameters. The `zstd_dict' argument is a @ref{2e0b,,ZstdDict} instance to be
used during decompression. When reading, if the `level'
argument is not None, a @code{TypeError} will be raised.

When writing, the `options' argument can be a dictionary
providing advanced compression parameters; see
@ref{2e0c,,CompressionParameter} for detailed information about supported
parameters. The `level' argument is the compression level to use when
writing compressed data. Only one of `level' or `options' may be passed. The
`zstd_dict' argument is a @ref{2e0b,,ZstdDict} instance to be used during
compression.

@code{ZstdFile} supports all the members specified by
@ref{8a2,,io.BufferedIOBase}, except for @ref{2e12,,detach()}
and @ref{1515,,truncate()}.
Iteration and the @ref{186,,with} statement are supported.

The following method and attributes are also provided:

@geindex peek() (compression.zstd.ZstdFile 메서드)
@anchor{library/compression zstd compression zstd ZstdFile peek}@anchor{2e13}
@deffn {메서드} peek (size=-1)

Return buffered data without advancing the file position. At least one
byte of data will be returned, unless EOF has been reached. The exact
number of bytes returned is unspecified (the `size' argument is ignored).

@cartouche
@quotation 참고 
While calling @code{peek()} does not change the file position of
the @code{ZstdFile}, it may change the position of the underlying
file object (for example, if the @code{ZstdFile} was constructed by
passing a file object for `file').
@end quotation
@end cartouche
@end deffn

@geindex mode (compression.zstd.ZstdFile의 속성)
@anchor{library/compression zstd compression zstd ZstdFile mode}@anchor{2e14}
@deffn {속성} mode

@code{'rb'} for reading and @code{'wb'} for writing.
@end deffn

@geindex name (compression.zstd.ZstdFile의 속성)
@anchor{library/compression zstd compression zstd ZstdFile name}@anchor{2e15}
@deffn {속성} name

The name of the Zstandard file. Equivalent to the @ref{2e16,,name}
attribute of the underlying @ref{13c8,,file object}.
@end deffn
@end deffn

@node Compressing and decompressing data in memory,Zstandard dictionaries,Reading and writing compressed files,compression zstd — Compression compatible with the Zstandard format
@anchor{library/compression zstd compressing-and-decompressing-data-in-memory}@anchor{2e17}
@subsubsection Compressing and decompressing data in memory


@geindex compress() (compression.zstd 모듈)
@anchor{library/compression zstd compression zstd compress}@anchor{2e07}
@deffn {함수} compression.zstd.compress (data, level=None, options=None, zstd_dict=None)

Compress `data' (a @ref{193,,bytes-like object}), returning the compressed
data as a @ref{192,,bytes} object.

The `level' argument is an integer controlling the level of
compression. `level' is an alternative to setting
@ref{2e18,,CompressionParameter.compression_level} in `options'. Use
@ref{2e19,,bounds()} on
@code{compression_level} to get the values that can
be passed for `level'. If advanced compression options are needed, the
`level' argument must be omitted and in the `options' dictionary the
@code{CompressionParameter.compression_level} parameter should be set.

The `options' argument is a Python dictionary containing advanced
compression parameters. The valid keys and values for compression parameters
are documented as part of the @ref{2e0c,,CompressionParameter} documentation.

The `zstd_dict' argument is an instance of @ref{2e0b,,ZstdDict}
containing trained data to improve compression efficiency. The
function @ref{2e09,,train_dict()} can be used to generate a Zstandard dictionary.
@end deffn

@geindex decompress() (compression.zstd 모듈)
@anchor{library/compression zstd compression zstd decompress}@anchor{2e08}
@deffn {함수} compression.zstd.decompress (data, zstd_dict=None, options=None)

Decompress `data' (a @ref{193,,bytes-like object}), returning the uncompressed
data as a @ref{192,,bytes} object.

The `options' argument is a Python dictionary containing advanced
decompression parameters. The valid keys and values for compression
parameters are documented as part of the @ref{2e0d,,DecompressionParameter}
documentation.

The `zstd_dict' argument is an instance of @ref{2e0b,,ZstdDict}
containing trained data used during compression. This must be
the same Zstandard dictionary used during compression.

If `data' is the concatenation of multiple distinct compressed frames,
decompress all of these frames, and return the concatenation of the results.
@end deffn

@geindex ZstdCompressor (compression.zstd 클래스)
@anchor{library/compression zstd compression zstd ZstdCompressor}@anchor{2e05}
@deffn {클래스} compression.zstd.ZstdCompressor (level=None, options=None, zstd_dict=None)

Create a compressor object, which can be used to compress data
incrementally.

For a more convenient way of compressing a single chunk of data, see the
module-level function @ref{2e07,,compress()}.

The `level' argument is an integer controlling the level of
compression. `level' is an alternative to setting
@ref{2e18,,CompressionParameter.compression_level} in `options'. Use
@ref{2e19,,bounds()} on
@code{compression_level} to get the values that can
be passed for `level'. If advanced compression options are needed, the
`level' argument must be omitted and in the `options' dictionary the
@code{CompressionParameter.compression_level} parameter should be set.

The `options' argument is a Python dictionary containing advanced
compression parameters. The valid keys and values for compression parameters
are documented as part of the @ref{2e0c,,CompressionParameter} documentation.

The `zstd_dict' argument is an optional instance of @ref{2e0b,,ZstdDict}
containing trained data to improve compression efficiency. The
function @ref{2e09,,train_dict()} can be used to generate a Zstandard dictionary.

@geindex compress() (compression.zstd.ZstdCompressor 메서드)
@anchor{library/compression zstd compression zstd ZstdCompressor compress}@anchor{2e1a}
@deffn {메서드} compress (data, mode=ZstdCompressor.CONTINUE)

Compress `data' (a @ref{193,,bytes-like object}), returning a @ref{192,,bytes}
object with compressed data if possible, or otherwise an empty
@code{bytes} object. Some of `data' may be buffered internally, for
use in later calls to @code{compress()} and @ref{2e1b,,flush()}. The returned
data should be concatenated with the output of any previous calls to
@code{compress()}.

The `mode' argument is a @code{ZstdCompressor} attribute, either
@ref{2e1c,,CONTINUE}, @ref{2e1d,,FLUSH_BLOCK},
or @ref{2e1e,,FLUSH_FRAME}.

When all data has been provided to the compressor, call the
@ref{2e1b,,flush()} method to finish the compression process. If
@code{compress()} is called with `mode' set to @ref{2e1e,,FLUSH_FRAME},
@code{flush()} should not be called, as it would write out a new empty
frame.
@end deffn

@geindex flush() (compression.zstd.ZstdCompressor 메서드)
@anchor{library/compression zstd compression zstd ZstdCompressor flush}@anchor{2e1b}
@deffn {메서드} flush (mode=ZstdCompressor.FLUSH_FRAME)

Finish the compression process, returning a @ref{192,,bytes} object
containing any data stored in the compressor’s internal buffers.

The `mode' argument is a @code{ZstdCompressor} attribute, either
@ref{2e1d,,FLUSH_BLOCK}, or @ref{2e1e,,FLUSH_FRAME}.
@end deffn

@geindex set_pledged_input_size() (compression.zstd.ZstdCompressor 메서드)
@anchor{library/compression zstd compression zstd ZstdCompressor set_pledged_input_size}@anchor{2e1f}
@deffn {메서드} set_pledged_input_size (size)

Specify the amount of uncompressed data `size' that will be provided for
the next frame. `size' will be written into the frame header of the next
frame unless @ref{2e20,,CompressionParameter.content_size_flag} is @code{False}
or @code{0}. A size of @code{0} means that the frame is empty. If `size' is
@code{None}, the frame header will omit the frame size. Frames that include
the uncompressed data size require less memory to decompress, especially
at higher compression levels.

If @ref{2e21,,last_mode} is not @ref{2e1e,,FLUSH_FRAME}, a
@ref{2ec,,ValueError} is raised as the compressor is not at the start of
a frame. If the pledged size does not match the actual size of data
provided to @ref{2e1a,,compress()}, future calls to @code{compress()} or
@ref{2e1b,,flush()} may raise @ref{2e10,,ZstdError} and the last chunk of data may
be lost.

After @ref{2e1b,,flush()} or @ref{2e1a,,compress()} are called with mode
@ref{2e1e,,FLUSH_FRAME}, the next frame will not include the frame size into
the header unless @code{set_pledged_input_size()} is called again.
@end deffn

@geindex CONTINUE (compression.zstd.ZstdCompressor의 속성)
@anchor{library/compression zstd compression zstd ZstdCompressor CONTINUE}@anchor{2e1c}
@deffn {속성} CONTINUE

Collect more data for compression, which may or may not generate output
immediately. This mode optimizes the compression ratio by maximizing the
amount of data per block and frame.
@end deffn

@geindex FLUSH_BLOCK (compression.zstd.ZstdCompressor의 속성)
@anchor{library/compression zstd compression zstd ZstdCompressor FLUSH_BLOCK}@anchor{2e1d}
@deffn {속성} FLUSH_BLOCK

Complete and write a block to the data stream. The data returned so far
can be immediately decompressed. Past data can still be referenced in
future blocks generated by calls to @ref{2e1a,,compress()},
improving compression.
@end deffn

@geindex FLUSH_FRAME (compression.zstd.ZstdCompressor의 속성)
@anchor{library/compression zstd compression zstd ZstdCompressor FLUSH_FRAME}@anchor{2e1e}
@deffn {속성} FLUSH_FRAME

Complete and write out a frame. Future data provided to
@ref{2e1a,,compress()} will be written into a new frame and
`cannot' reference past data.
@end deffn

@geindex last_mode (compression.zstd.ZstdCompressor의 속성)
@anchor{library/compression zstd compression zstd ZstdCompressor last_mode}@anchor{2e21}
@deffn {속성} last_mode

The last mode passed to either @ref{2e1a,,compress()} or @ref{2e1b,,flush()}.
The value can be one of @ref{2e1c,,CONTINUE}, @ref{2e1d,,FLUSH_BLOCK}, or
@ref{2e1e,,FLUSH_FRAME}. The initial value is @code{FLUSH_FRAME},
signifying that the compressor is at the start of a new frame.
@end deffn
@end deffn

@geindex ZstdDecompressor (compression.zstd 클래스)
@anchor{library/compression zstd compression zstd ZstdDecompressor}@anchor{2e06}
@deffn {클래스} compression.zstd.ZstdDecompressor (zstd_dict=None, options=None)

Create a decompressor object, which can be used to decompress data
incrementally.

For a more convenient way of decompressing an entire compressed stream at
once, see the module-level function @ref{2e08,,decompress()}.

The `options' argument is a Python dictionary containing advanced
decompression parameters. The valid keys and values for compression
parameters are documented as part of the @ref{2e0d,,DecompressionParameter}
documentation.

The `zstd_dict' argument is an instance of @ref{2e0b,,ZstdDict}
containing trained data used during compression. This must be
the same Zstandard dictionary used during compression.

@cartouche
@quotation 참고 
This class does not transparently handle inputs containing multiple
compressed frames, unlike the @ref{2e08,,decompress()} function and
@ref{2e04,,ZstdFile} class. To decompress a multi-frame input, you should
use @code{decompress()}, @code{ZstdFile} if working with a
@ref{13c8,,file object}, or multiple @code{ZstdDecompressor} instances.
@end quotation
@end cartouche

@geindex decompress() (compression.zstd.ZstdDecompressor 메서드)
@anchor{library/compression zstd compression zstd ZstdDecompressor decompress}@anchor{2e22}
@deffn {메서드} decompress (data, max_length=-1)

Decompress `data' (a @ref{193,,bytes-like object}), returning
uncompressed data as bytes. Some of `data' may be buffered
internally, for use in later calls to @code{decompress()}.
The returned data should be concatenated with the output of any previous
calls to @code{decompress()}.

If `max_length' is non-negative, the method returns at most `max_length'
bytes of decompressed data. If this limit is reached and further
output can be produced, the @ref{2e23,,needs_input} attribute will
be set to @code{False}. In this case, the next call to
@code{decompress()} may provide `data' as @code{b'@w{'}} to obtain
more of the output.

If all of the input data was decompressed and returned (either
because this was less than `max_length' bytes, or because
`max_length' was negative), the @ref{2e23,,needs_input} attribute
will be set to @code{True}.

Attempting to decompress data after the end of a frame will raise a
@ref{2e10,,ZstdError}. Any data found after the end of the frame is ignored
and saved in the @ref{2e24,,unused_data} attribute.
@end deffn

@geindex eof (compression.zstd.ZstdDecompressor의 속성)
@anchor{library/compression zstd compression zstd ZstdDecompressor eof}@anchor{2e25}
@deffn {속성} eof

@code{True} if the end-of-stream marker has been reached.
@end deffn

@geindex unused_data (compression.zstd.ZstdDecompressor의 속성)
@anchor{library/compression zstd compression zstd ZstdDecompressor unused_data}@anchor{2e24}
@deffn {속성} unused_data

Data found after the end of the compressed stream.

Before the end of the stream is reached, this will be @code{b'@w{'}}.
@end deffn

@geindex needs_input (compression.zstd.ZstdDecompressor의 속성)
@anchor{library/compression zstd compression zstd ZstdDecompressor needs_input}@anchor{2e23}
@deffn {속성} needs_input

@code{False} if the @ref{2e22,,decompress()} method can provide more
decompressed data before requiring new compressed input.
@end deffn
@end deffn

@node Zstandard dictionaries,Advanced parameter control,Compressing and decompressing data in memory,compression zstd — Compression compatible with the Zstandard format
@anchor{library/compression zstd zstandard-dictionaries}@anchor{2e26}
@subsubsection Zstandard dictionaries


@geindex train_dict() (compression.zstd 모듈)
@anchor{library/compression zstd compression zstd train_dict}@anchor{2e09}
@deffn {함수} compression.zstd.train_dict (samples, dict_size)

Train a Zstandard dictionary, returning a @ref{2e0b,,ZstdDict} instance.
Zstandard dictionaries enable more efficient compression of smaller sizes
of data, which is traditionally difficult to compress due to less
repetition. If you are compressing multiple similar groups of data (such as
similar files), Zstandard dictionaries can improve compression ratios and
speed significantly.

The `samples' argument (an iterable of @ref{192,,bytes} objects), is the
population of samples used to train the Zstandard dictionary.

The `dict_size' argument, an integer, is the maximum size (in bytes) the
Zstandard dictionary should be. The Zstandard documentation suggests an
absolute maximum of no more than 100 KB, but the maximum can often be smaller
depending on the data. Larger dictionaries generally slow down compression,
but improve compression ratios. Smaller dictionaries lead to faster
compression, but reduce the compression ratio.
@end deffn

@geindex finalize_dict() (compression.zstd 모듈)
@anchor{library/compression zstd compression zstd finalize_dict}@anchor{2e0a}
@deffn {함수} compression.zstd.finalize_dict (zstd_dict, /, samples, dict_size, level)

An advanced function for converting a “raw content” Zstandard dictionary into
a regular Zstandard dictionary. “Raw content” dictionaries are a sequence of
bytes that do not need to follow the structure of a normal Zstandard
dictionary.

The `zstd_dict' argument is a @ref{2e0b,,ZstdDict} instance with
the @ref{2e27,,dict_content} containing the raw dictionary contents.

The `samples' argument (an iterable of @ref{192,,bytes} objects), contains
sample data for generating the Zstandard dictionary.

The `dict_size' argument, an integer, is the maximum size (in bytes) the
Zstandard dictionary should be. See @ref{2e09,,train_dict()} for
suggestions on the maximum dictionary size.

The `level' argument (an integer) is the compression level expected to be
passed to the compressors using this dictionary. The dictionary information
varies for each compression level, so tuning for the proper compression
level can make compression more efficient.
@end deffn

@geindex ZstdDict (compression.zstd 클래스)
@anchor{library/compression zstd compression zstd ZstdDict}@anchor{2e0b}
@deffn {클래스} compression.zstd.ZstdDict (dict_content, /, *, is_raw=False)

A wrapper around Zstandard dictionaries. Dictionaries can be used to improve
the compression of many small chunks of data. Use @ref{2e09,,train_dict()} if you
need to train a new dictionary from sample data.

The `dict_content' argument (a @ref{193,,bytes-like object}), is the already
trained dictionary information.

The `is_raw' argument, a boolean, is an advanced parameter controlling the
meaning of `dict_content'. @code{True} means `dict_content' is a “raw content”
dictionary, without any format restrictions. @code{False} means `dict_content'
is an ordinary Zstandard dictionary, created from Zstandard functions,
for example, @ref{2e09,,train_dict()} or the external @code{zstd} CLI.

When passing a @code{ZstdDict} to a function, the
@code{as_digested_dict} and @code{as_undigested_dict} attributes can
control how the dictionary is loaded by passing them as the @code{zstd_dict}
argument, for example, @code{compress(data, zstd_dict=zd.as_digested_dict)}.
Digesting a dictionary is a costly operation that occurs when loading a
Zstandard dictionary. When making multiple calls to compression or
decompression, passing a digested dictionary will reduce the overhead of
loading the dictionary.

@quotation
Difference for compression



@multitable {xxxxxxxxxxxx} {xxxxxxxxxxxxxxxx} {xxxxxxxxxxxx} 
@headitem

@tab

Digested dictionary

@tab

Undigested dictionary

@item

Advanced parameters of the compressor which may be overridden by
the dictionary’s parameters

@tab

@code{window_log}, @code{hash_log}, @code{chain_log}, @code{search_log},
@code{min_match}, @code{target_length}, @code{strategy},
@code{enable_long_distance_matching}, @code{ldm_hash_log},
@code{ldm_min_match}, @code{ldm_bucket_size_log}, @code{ldm_hash_rate_log},
and some non-public parameters.

@tab

None

@item

@code{ZstdDict} internally caches the dictionary

@tab

Yes. It’s faster when loading a digested dictionary again with the
same compression level.

@tab

No. If you wish to load an undigested dictionary multiple times,
consider reusing a compressor object.

@end multitable

@end quotation

If passing a @code{ZstdDict} without any attribute, an undigested
dictionary is passed by default when compressing and a digested dictionary
is generated if necessary and passed by default when decompressing.

@quotation

@geindex dict_content (compression.zstd.ZstdDict의 속성)
@anchor{library/compression zstd compression zstd ZstdDict dict_content}@anchor{2e27}
@deffn {속성} dict_content

The content of the Zstandard dictionary, a @code{bytes} object. It’s the
same as the `dict_content' argument in the @code{__init__} method. It can
be used with other programs, such as the @code{zstd} CLI program.
@end deffn

@geindex dict_id (compression.zstd.ZstdDict의 속성)
@anchor{library/compression zstd compression zstd ZstdDict dict_id}@anchor{2e28}
@deffn {속성} dict_id

Identifier of the Zstandard dictionary, a non-negative int value.

Non-zero means the dictionary is ordinary, created by Zstandard
functions and following the Zstandard format.

@code{0} means a “raw content” dictionary, free of any format restriction,
used for advanced users.

@cartouche
@quotation 참고 
The meaning of @code{0} for @code{ZstdDict.dict_id} is different
from the @code{dictionary_id} attribute to the @ref{2e29,,get_frame_info()}
function.
@end quotation
@end cartouche
@end deffn

@geindex as_digested_dict (compression.zstd.ZstdDict의 속성)
@anchor{library/compression zstd compression zstd ZstdDict as_digested_dict}@anchor{2e2a}
@deffn {속성} as_digested_dict

Load as a digested dictionary.
@end deffn

@geindex as_undigested_dict (compression.zstd.ZstdDict의 속성)
@anchor{library/compression zstd compression zstd ZstdDict as_undigested_dict}@anchor{2e2b}
@deffn {속성} as_undigested_dict

Load as an undigested dictionary.
@end deffn
@end quotation
@end deffn

@node Advanced parameter control,Miscellaneous,Zstandard dictionaries,compression zstd — Compression compatible with the Zstandard format
@anchor{library/compression zstd advanced-parameter-control}@anchor{2e2c}
@subsubsection Advanced parameter control


@geindex CompressionParameter (compression.zstd 클래스)
@anchor{library/compression zstd compression zstd CompressionParameter}@anchor{2e0c}
@deffn {클래스} compression.zstd.CompressionParameter

An @ref{eda,,IntEnum} containing the advanced compression parameter
keys that can be used when compressing data.

The @ref{2e19,,bounds()} method can be used on any attribute to get the valid
values for that parameter.

Parameters are optional; any omitted parameter will have it’s value selected
automatically.

Example getting the lower and upper bound of @ref{2e18,,compression_level}:

@example
lower, upper = CompressionParameter.compression_level.bounds()
@end example

Example setting the @ref{2e2d,,window_log} to the maximum size:

@example
_lower, upper = CompressionParameter.window_log.bounds()
options = @{CompressionParameter.window_log: upper@}
compress(b'venezuelan beaver cheese', options=options)
@end example

@geindex bounds() (compression.zstd.CompressionParameter 메서드)
@anchor{library/compression zstd compression zstd CompressionParameter bounds}@anchor{2e19}
@deffn {메서드} bounds ()

Return the tuple of int bounds, @code{(lower, upper)}, of a compression
parameter. This method should be called on the attribute you wish to
retrieve the bounds of. For example, to get the valid values for
@ref{2e18,,compression_level}, one may check the result of
@code{CompressionParameter.compression_level.bounds()}.

Both the lower and upper bounds are inclusive.
@end deffn

@geindex compression_level (compression.zstd.CompressionParameter의 속성)
@anchor{library/compression zstd compression zstd CompressionParameter compression_level}@anchor{2e18}
@deffn {속성} compression_level

A high-level means of setting other compression parameters that affect
the speed and ratio of compressing data.

Regular compression levels are greater than @code{0}. Values greater than
@code{20} are considered “ultra” compression and require more memory than
other levels. Negative values can be used to trade off faster compression
for worse compression ratios.

Setting the level to zero uses @ref{2e2e,,COMPRESSION_LEVEL_DEFAULT}.
@end deffn

@geindex window_log (compression.zstd.CompressionParameter의 속성)
@anchor{library/compression zstd compression zstd CompressionParameter window_log}@anchor{2e2d}
@deffn {속성} window_log

Maximum allowed back-reference distance the compressor can use when
compressing data, expressed as power of two, @code{1 << window_log} bytes.
This parameter greatly influences the memory usage of compression. Higher
values require more memory but gain better compression values.

A value of zero causes the value to be selected automatically.
@end deffn

@geindex hash_log (compression.zstd.CompressionParameter의 속성)
@anchor{library/compression zstd compression zstd CompressionParameter hash_log}@anchor{2e2f}
@deffn {속성} hash_log

Size of the initial probe table, as a power of two. The resulting memory
usage is @code{1 << (hash_log+2)} bytes. Larger tables improve compression
ratio of strategies <= @ref{2e30,,dfast}, and improve compression
speed of strategies > @code{dfast}.

A value of zero causes the value to be selected automatically.
@end deffn

@geindex chain_log (compression.zstd.CompressionParameter의 속성)
@anchor{library/compression zstd compression zstd CompressionParameter chain_log}@anchor{2e31}
@deffn {속성} chain_log

Size of the multi-probe search table, as a power of two. The resulting
memory usage is @code{1 << (chain_log+2)} bytes. Larger tables result in
better and slower compression. This parameter has no effect for the
@ref{2e32,,fast} strategy. It’s still useful when using
@ref{2e30,,dfast} strategy, in which case it defines a secondary
probe table.

A value of zero causes the value to be selected automatically.
@end deffn

@geindex search_log (compression.zstd.CompressionParameter의 속성)
@anchor{library/compression zstd compression zstd CompressionParameter search_log}@anchor{2e33}
@deffn {속성} search_log

Number of search attempts, as a power of two. More attempts result in
better and slower compression. This parameter is useless for
@ref{2e32,,fast} and @ref{2e30,,dfast} strategies.

A value of zero causes the value to be selected automatically.
@end deffn

@geindex min_match (compression.zstd.CompressionParameter의 속성)
@anchor{library/compression zstd compression zstd CompressionParameter min_match}@anchor{2e34}
@deffn {속성} min_match

Minimum size of searched matches. Larger values increase compression and
decompression speed, but decrease ratio. Note that Zstandard can still
find matches of smaller size, it just tweaks its search algorithm to look
for this size and larger. For all strategies < @ref{2e35,,btopt},
the effective minimum is @code{4}; for all strategies
> @ref{2e32,,fast}, the effective maximum is @code{6}.

A value of zero causes the value to be selected automatically.
@end deffn

@geindex target_length (compression.zstd.CompressionParameter의 속성)
@anchor{library/compression zstd compression zstd CompressionParameter target_length}@anchor{2e36}
@deffn {속성} target_length

The impact of this field depends on the selected @ref{2e0e,,Strategy}.

For strategies @ref{2e35,,btopt}, @ref{2e37,,btultra} and
@ref{2e38,,btultra2}, the value is the length of a match
considered “good enough” to stop searching. Larger values make
compression ratios better, but compresses slower.

For strategy @ref{2e32,,fast}, it is the distance between match
sampling. Larger values make compression faster, but with a worse
compression ratio.

A value of zero causes the value to be selected automatically.
@end deffn

@geindex strategy (compression.zstd.CompressionParameter의 속성)
@anchor{library/compression zstd compression zstd CompressionParameter strategy}@anchor{2e39}
@deffn {속성} strategy

The higher the value of selected strategy, the more complex the
compression technique used by zstd, resulting in higher compression
ratios but slower compression.


@subsubheading 더 보기


@ref{2e0e,,Strategy}

@end deffn

@geindex enable_long_distance_matching (compression.zstd.CompressionParameter의 속성)
@anchor{library/compression zstd compression zstd CompressionParameter enable_long_distance_matching}@anchor{2e3a}
@deffn {속성} enable_long_distance_matching

Long distance matching can be used to improve compression for large
inputs by finding large matches at greater distances. It increases memory
usage and window size.

@code{True} or @code{1} enable long distance matching while @code{False} or @code{0}
disable it.

Enabling this parameter increases default
@ref{2e2d,,window_log} to 128 MiB except when expressly
set to a different value. This setting is enabled by default if
@code{window_log} >= 128 MiB and the compression
strategy >= @ref{2e35,,btopt} (compression level 16+).
@end deffn

@geindex ldm_hash_log (compression.zstd.CompressionParameter의 속성)
@anchor{library/compression zstd compression zstd CompressionParameter ldm_hash_log}@anchor{2e3b}
@deffn {속성} ldm_hash_log

Size of the table for long distance matching, as a power of two. Larger
values increase memory usage and compression ratio, but decrease
compression speed.

A value of zero causes the value to be selected automatically.
@end deffn

@geindex ldm_min_match (compression.zstd.CompressionParameter의 속성)
@anchor{library/compression zstd compression zstd CompressionParameter ldm_min_match}@anchor{2e3c}
@deffn {속성} ldm_min_match

Minimum match size for long distance matcher. Larger or too small values
can often decrease the compression ratio.

A value of zero causes the value to be selected automatically.
@end deffn

@geindex ldm_bucket_size_log (compression.zstd.CompressionParameter의 속성)
@anchor{library/compression zstd compression zstd CompressionParameter ldm_bucket_size_log}@anchor{2e3d}
@deffn {속성} ldm_bucket_size_log

Log size of each bucket in the long distance matcher hash table for
collision resolution. Larger values improve collision resolution but
decrease compression speed.

A value of zero causes the value to be selected automatically.
@end deffn

@geindex ldm_hash_rate_log (compression.zstd.CompressionParameter의 속성)
@anchor{library/compression zstd compression zstd CompressionParameter ldm_hash_rate_log}@anchor{2e3e}
@deffn {속성} ldm_hash_rate_log

Frequency of inserting/looking up entries into the long distance matcher
hash table. Larger values improve compression speed. Deviating far from
the default value will likely result in a compression ratio decrease.

A value of zero causes the value to be selected automatically.
@end deffn

@geindex content_size_flag (compression.zstd.CompressionParameter의 속성)
@anchor{library/compression zstd compression zstd CompressionParameter content_size_flag}@anchor{2e20}
@deffn {속성} content_size_flag

Write the size of the data to be compressed into the Zstandard frame
header when known prior to compressing.

This flag only takes effect under the following scenarios:


@itemize *

@item 
Calling @ref{2e07,,compress()} for one-shot compression

@item 
Providing all of the data to be compressed in the frame in a single
@ref{2e1a,,ZstdCompressor.compress()} call, with the
@ref{2e1e,,ZstdCompressor.FLUSH_FRAME} mode.

@item 
Calling @ref{2e1f,,ZstdCompressor.set_pledged_input_size()} with the exact
amount of data that will be provided to the compressor prior to any
calls to @ref{2e1a,,ZstdCompressor.compress()} for the current frame.
@code{ZstdCompressor.set_pledged_input_size()} must be called for each
new frame.
@end itemize

All other compression calls may not write the size information into the
frame header.

@code{True} or @code{1} enable the content size flag while @code{False} or @code{0}
disable it.
@end deffn

@geindex checksum_flag (compression.zstd.CompressionParameter의 속성)
@anchor{library/compression zstd compression zstd CompressionParameter checksum_flag}@anchor{2e3f}
@deffn {속성} checksum_flag

A four-byte checksum using XXHash64 of the uncompressed content is
written at the end of each frame. Zstandard’s decompression code verifies
the checksum. If there is a mismatch a @ref{2e10,,ZstdError} exception is
raised.

@code{True} or @code{1} enable checksum generation while @code{False} or @code{0}
disable it.
@end deffn

@geindex dict_id_flag (compression.zstd.CompressionParameter의 속성)
@anchor{library/compression zstd compression zstd CompressionParameter dict_id_flag}@anchor{2e40}
@deffn {속성} dict_id_flag

When compressing with a @ref{2e0b,,ZstdDict}, the dictionary’s ID is written
into the frame header.

@code{True} or @code{1} enable storing the dictionary ID while @code{False} or
@code{0} disable it.
@end deffn

@geindex nb_workers (compression.zstd.CompressionParameter의 속성)
@anchor{library/compression zstd compression zstd CompressionParameter nb_workers}@anchor{2e41}
@deffn {속성} nb_workers

Select how many threads will be spawned to compress in parallel. When
@code{nb_workers} > 0, enables multi-threaded compression, a value of
@code{1} means “one-thread multi-threaded mode”. More workers improve speed,
but also increase memory usage and slightly reduce compression ratio.

A value of zero disables multi-threading.
@end deffn

@geindex job_size (compression.zstd.CompressionParameter의 속성)
@anchor{library/compression zstd compression zstd CompressionParameter job_size}@anchor{2e42}
@deffn {속성} job_size

Size of a compression job, in bytes. This value is enforced only when
@ref{2e41,,nb_workers} >= 1. Each compression job is
completed in parallel, so this value can indirectly impact the number of
active threads.

A value of zero causes the value to be selected automatically.
@end deffn

@geindex overlap_log (compression.zstd.CompressionParameter의 속성)
@anchor{library/compression zstd compression zstd CompressionParameter overlap_log}@anchor{2e43}
@deffn {속성} overlap_log

Sets how much data is reloaded from previous jobs (threads) for new jobs
to be used by the look behind window during compression. This value is
only used when @ref{2e41,,nb_workers} >= 1. Acceptable
values vary from 0 to 9.

@quotation


@itemize *

@item 
0 means dynamically set the overlap amount

@item 
1 means no overlap

@item 
9 means use a full window size from the previous job
@end itemize
@end quotation

Each increment halves/doubles the overlap size. “8” means an overlap of
@code{window_size/2}, “7” means an overlap of @code{window_size/4}, etc.
@end deffn
@end deffn

@geindex DecompressionParameter (compression.zstd 클래스)
@anchor{library/compression zstd compression zstd DecompressionParameter}@anchor{2e0d}
@deffn {클래스} compression.zstd.DecompressionParameter

An @ref{eda,,IntEnum} containing the advanced decompression parameter
keys that can be used when decompressing data. Parameters are optional; any
omitted parameter will have it’s value selected automatically.

The @ref{2e44,,bounds()} method can be used on any attribute to get the valid
values for that parameter.

Example setting the @ref{2e45,,window_log_max} to the maximum size:

@example
data = compress(b'Some very long buffer of bytes...')

_lower, upper = DecompressionParameter.window_log_max.bounds()

options = @{DecompressionParameter.window_log_max: upper@}
decompress(data, options=options)
@end example

@geindex bounds() (compression.zstd.DecompressionParameter 메서드)
@anchor{library/compression zstd compression zstd DecompressionParameter bounds}@anchor{2e44}
@deffn {메서드} bounds ()

Return the tuple of int bounds, @code{(lower, upper)}, of a decompression
parameter. This method should be called on the attribute you wish to
retrieve the bounds of.

Both the lower and upper bounds are inclusive.
@end deffn

@geindex window_log_max (compression.zstd.DecompressionParameter의 속성)
@anchor{library/compression zstd compression zstd DecompressionParameter window_log_max}@anchor{2e45}
@deffn {속성} window_log_max

The base-two logarithm of the maximum size of the window used during
decompression. This can be useful to limit the amount of memory used when
decompressing data. A larger maximum window size leads to faster
decompression.

A value of zero causes the value to be selected automatically.
@end deffn
@end deffn

@geindex Strategy (compression.zstd 클래스)
@anchor{library/compression zstd compression zstd Strategy}@anchor{2e0e}
@deffn {클래스} compression.zstd.Strategy

An @ref{eda,,IntEnum} containing strategies for compression.
Higher-numbered strategies correspond to more complex and slower
compression.

@cartouche
@quotation 참고 
The values of attributes of @code{Strategy} are not necessarily stable
across zstd versions. Only the ordering of the attributes may be relied
upon. The attributes are listed below in order.
@end quotation
@end cartouche

The following strategies are available:

@geindex fast (compression.zstd.Strategy의 속성)
@anchor{library/compression zstd compression zstd Strategy fast}@anchor{2e32}
@deffn {속성} fast
@end deffn

@geindex dfast (compression.zstd.Strategy의 속성)
@anchor{library/compression zstd compression zstd Strategy dfast}@anchor{2e30}
@deffn {속성} dfast
@end deffn

@geindex greedy (compression.zstd.Strategy의 속성)
@anchor{library/compression zstd compression zstd Strategy greedy}@anchor{2e46}
@deffn {속성} greedy
@end deffn

@geindex lazy (compression.zstd.Strategy의 속성)
@anchor{library/compression zstd compression zstd Strategy lazy}@anchor{2e47}
@deffn {속성} lazy
@end deffn

@geindex lazy2 (compression.zstd.Strategy의 속성)
@anchor{library/compression zstd compression zstd Strategy lazy2}@anchor{2e48}
@deffn {속성} lazy2
@end deffn

@geindex btlazy2 (compression.zstd.Strategy의 속성)
@anchor{library/compression zstd compression zstd Strategy btlazy2}@anchor{2e49}
@deffn {속성} btlazy2
@end deffn

@geindex btopt (compression.zstd.Strategy의 속성)
@anchor{library/compression zstd compression zstd Strategy btopt}@anchor{2e35}
@deffn {속성} btopt
@end deffn

@geindex btultra (compression.zstd.Strategy의 속성)
@anchor{library/compression zstd compression zstd Strategy btultra}@anchor{2e37}
@deffn {속성} btultra
@end deffn

@geindex btultra2 (compression.zstd.Strategy의 속성)
@anchor{library/compression zstd compression zstd Strategy btultra2}@anchor{2e38}
@deffn {속성} btultra2
@end deffn
@end deffn

@node Miscellaneous,Examples,Advanced parameter control,compression zstd — Compression compatible with the Zstandard format
@anchor{library/compression zstd miscellaneous}@anchor{2e4a}
@subsubsection Miscellaneous


@geindex get_frame_info() (compression.zstd 모듈)
@anchor{library/compression zstd compression zstd get_frame_info}@anchor{2e29}
@deffn {함수} compression.zstd.get_frame_info (frame_buffer)

Retrieve a @ref{2e4b,,FrameInfo} object containing metadata about a Zstandard
frame. Frames contain metadata related to the compressed data they hold.
@end deffn

@geindex FrameInfo (compression.zstd 클래스)
@anchor{library/compression zstd compression zstd FrameInfo}@anchor{2e4b}
@deffn {클래스} compression.zstd.FrameInfo

Metadata related to a Zstandard frame.

@geindex decompressed_size (compression.zstd.FrameInfo의 속성)
@anchor{library/compression zstd compression zstd FrameInfo decompressed_size}@anchor{2e4c}
@deffn {속성} decompressed_size

The size of the decompressed contents of the frame.
@end deffn

@geindex dictionary_id (compression.zstd.FrameInfo의 속성)
@anchor{library/compression zstd compression zstd FrameInfo dictionary_id}@anchor{2e4d}
@deffn {속성} dictionary_id

An integer representing the Zstandard dictionary ID needed for
decompressing the frame. @code{0} means the dictionary ID was not
recorded in the frame header. This may mean that a Zstandard dictionary
is not needed, or that the ID of a required dictionary was not recorded.
@end deffn
@end deffn

@geindex COMPRESSION_LEVEL_DEFAULT (compression.zstd 모듈)
@anchor{library/compression zstd compression zstd COMPRESSION_LEVEL_DEFAULT}@anchor{2e2e}
@deffn {속성} compression.zstd.COMPRESSION_LEVEL_DEFAULT

The default compression level for Zstandard: @code{3}.
@end deffn

@geindex zstd_version_info (compression.zstd 모듈)
@anchor{library/compression zstd compression zstd zstd_version_info}@anchor{2e4e}
@deffn {속성} compression.zstd.zstd_version_info

Version number of the runtime zstd library as a tuple of integers
(major, minor, release).
@end deffn

@node Examples,,Miscellaneous,compression zstd — Compression compatible with the Zstandard format
@anchor{library/compression zstd examples}@anchor{2e4f}
@subsubsection Examples


Reading in a compressed file:

@example
from compression import zstd

with zstd.open("file.zst") as f:
    file_content = f.read()
@end example

Creating a compressed file:

@example
from compression import zstd

data = b"Insert Data Here"
with zstd.open("file.zst", "w") as f:
    f.write(data)
@end example

Compressing data in memory:

@example
from compression import zstd

data_in = b"Insert Data Here"
data_out = zstd.compress(data_in)
@end example

Incremental compression:

@example
from compression import zstd

comp = zstd.ZstdCompressor()
out1 = comp.compress(b"Some data\n")
out2 = comp.compress(b"Another piece of data\n")
out3 = comp.compress(b"Even more data\n")
out4 = comp.flush()
# Concatenate all the partial results:
result = b"".join([out1, out2, out3, out4])
@end example

Writing compressed data to an already-open file:

@example
from compression import zstd

with open("myfile", "wb") as f:
    f.write(b"This data will not be compressed\n")
    with zstd.open(f, "w") as zstf:
        zstf.write(b"This *will* be compressed\n")
    f.write(b"Not compressed\n")
@end example

Creating a compressed file using compression parameters:

@example
from compression import zstd

options = @{
   zstd.CompressionParameter.checksum_flag: 1
@}
with zstd.open("file.zst", "w", options=options) as f:
    f.write(b"Mind if I squeeze in?")
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node zlib — gzip 과 호환되는 압축,gzip — gzip 파일 지원,compression zstd — Compression compatible with the Zstandard format,데이터 압축 및 보관
@anchor{library/zlib doc}@anchor{2e50}@anchor{library/zlib module-zlib}@anchor{139}@anchor{library/zlib translation-repo}@anchor{2e51}@anchor{library/zlib zlib-compression-compatible-with-gzip}@anchor{2e52}
@subsection @code{zlib} — @code{gzip} 과 호환되는 압축


@geindex module; zlib


__________________________________________________________________


For applications that require data compression, the functions in this module
allow compression and decompression, using the zlib library@footnote{https://www.zlib.net}.

This is an @ref{2157,,optional module}.
If it is missing from your copy of CPython,
look for documentation from your distributor (that is,
whoever provided Python to you).
If you are the distributor, see @ref{2155,,Requirements for optional modules}.

@c Similar notes appear in the docs of the modules:
@c - zipfile
@c - tarfile

zlib’s functions have many options and often need to be used in a particular
order.  This documentation doesn’t attempt to cover all of the permutations;
consult the zlib manual@footnote{https://www.zlib.net/manual.html} for authoritative
information.

@code{.gz} 파일 읽기와 쓰기에 대해서는 @ref{6b,,gzip} 모듈을 참조하십시오.

이 모듈에서 사용 가능한 예외와 함수는 다음과 같습니다:

@geindex error
@anchor{library/zlib zlib error}@anchor{2e53}
@deffn {예외} zlib.error

압축과 압축 해제 에러에서 발생하는 예외.
@end deffn

@geindex adler32() (zlib 모듈)
@anchor{library/zlib zlib adler32}@anchor{1bb8}
@deffn {함수} zlib.adler32 (data[, value])

`data'의 Adler-32 체크섬을 계산합니다. (Adler-32 체크섬은 CRC32만큼 신뢰성 있지만, 훨씬 빠르게 계산할 수 있습니다.) 결과는 부호 없는 32비트 정수입니다. `value'가 있으면, 체크섬의 시작 값으로 사용됩니다; 그렇지 않으면, 기본값 1이 사용됩니다. `value'를 전달하면 여러 입력을 이어붙인 것에 대한 잇따른(running) 체크섬을 계산할 수 있습니다. 알고리즘은 암호학적으로 강력하지 않아서, 인증이나 디지털 서명에 사용해서는 안 됩니다. 알고리즘은 체크섬 알고리즘으로 사용하도록 설계되었으므로, 일반적인 해시 알고리즘으로 사용하기에 적합하지 않습니다.


버전 3.0에서 변경: 결과는 항상 부호 없는 값입니다.

@end deffn

@geindex compress() (zlib 모듈)
@anchor{library/zlib zlib compress}@anchor{84e}
@deffn {함수} zlib.compress (data, /, level=Z_DEFAULT_COMPRESSION, wbits=MAX_WBITS)

Compresses the bytes in `data', returning a bytes object containing compressed data.
`level' is an integer from @code{0} to @code{9} or @code{-1} controlling the level of compression;
See @ref{2e54,,Z_BEST_SPEED} (@code{1}), @ref{2e55,,Z_BEST_COMPRESSION} (@code{9}),
@ref{2e56,,Z_NO_COMPRESSION} (@code{0}), and the default,
@ref{2e57,,Z_DEFAULT_COMPRESSION} (@code{-1}) for more information about these values.
@anchor{library/zlib compress-wbits}@anchor{2e58}
The `wbits' argument controls the size of the history buffer (or the
“window size”) used when compressing data, and whether a header and
trailer is included in the output.  It can take several ranges of values,
defaulting to @code{15} (@ref{2e59,,MAX_WBITS}):


@itemize *

@item 
+9 에서 +15: 창 크기의 밑이 2인 로그, 그래서 창 크기는 512에서 32768 사이의 범위입니다. 값이 클수록 메모리 사용량이 증가하면서 압축률이 높아집니다. 결과 출력에는 zlib 특정 헤더와 트레일러가 포함됩니다.

@item 
−9 에서 −15: `wbits'의 절댓값을 창 크기의 로그로 사용하면서, 헤더나 후행 체크섬 없이 원시 출력 스트림을 생성합니다.

@item 
+25 에서 +31 = 16 + (9 에서 15): 하위 4비트를 창 크기의 로그로 사용하면서, 출력에 기본 @code{gzip} 헤더와 후행 체크섬을 포함합니다.
@end itemize

에러가 발생하면 @ref{2e53,,error} 예외를 발생시킵니다.


버전 3.6에서 변경: `level'은 이제 키워드 매개 변수로 사용될 수 있습니다.



버전 3.11에서 변경: The `wbits' parameter is now available to set window bits and
compression type.

@end deffn

@geindex compressobj() (zlib 모듈)
@anchor{library/zlib zlib compressobj}@anchor{2e5a}
@deffn {함수} zlib.compressobj (level=Z_DEFAULT_COMPRESSION, method=DEFLATED, wbits=MAX_WBITS, memLevel=DEF_MEM_LEVEL, strategy=Z_DEFAULT_STRATEGY[, zdict])

메모리에 한 번에 맞지 않는 데이터 스트림을 압축하는 데 사용되는 압축 객체를 반환합니다.

`level' is the compression level – an integer from @code{0} to @code{9} or @code{-1}.
See @ref{2e54,,Z_BEST_SPEED} (@code{1}), @ref{2e55,,Z_BEST_COMPRESSION} (@code{9}),
@ref{2e56,,Z_NO_COMPRESSION} (@code{0}), and the default,
@ref{2e57,,Z_DEFAULT_COMPRESSION} (@code{-1}) for more information about these values.

`method'는 압축 알고리즘입니다. 현재, 유일하게 지원되는 값은 @ref{2e5b,,DEFLATED}입니다.

`wbits' 매개 변수는 히스토리 버퍼의 크기(또는 “창 크기(window size)”)와, 어떤 헤더와 트레일러 형식을 사용할지를 제어합니다. @ref{2e58,,compress()에서 설명된 것}과 같은 의미입니다.

`memLevel' 인자는 내부 압축 상태에 사용되는 메모리양을 제어합니다. 유효한 값의 범위는 @code{1}에서 @code{9}입니다. 값이 클수록 더 많은 메모리를 사용하지만, 더 빠르고 더 작은 출력을 생성합니다.

`strategy' is used to tune the compression algorithm. Possible values are
@ref{2e5c,,Z_DEFAULT_STRATEGY}, @ref{2e5d,,Z_FILTERED}, @ref{2e5e,,Z_HUFFMAN_ONLY},
@ref{2e5f,,Z_RLE} and @ref{2e60,,Z_FIXED}.

`zdict'는 사전 정의된 압축 딕셔너리입니다. 이것은 압축될 데이터에서 자주 나타날 것으로 예상되는 서브 시퀀스를 포함하는 일련의 바이트 시퀀스(가령 @ref{192,,bytes} 객체)입니다. 가장 흔할 것으로 예상되는 서브 시퀀스는 딕셔너리 끝에 와야 합니다.


버전 3.3에서 변경: `zdict' 매개 변수와 키워드 인자 지원이 추가되었습니다.

@end deffn

@geindex crc32() (zlib 모듈)
@anchor{library/zlib zlib crc32}@anchor{1a10}
@deffn {함수} zlib.crc32 (data[, value])

@geindex 순환 중복 검사
@geindex 체크섬;순환 중복 검사

`data'의 CRC (Cyclic Redundancy Check; 순환 중복 검사) 체크섬을 계산합니다. 결과는 부호 없는 32비트 정수입니다. `value'가 있으면, 체크섬의 시작 값으로 사용됩니다; 그렇지 않으면, 기본값 1이 사용됩니다. `value'를 전달하면 여러 입력을 이어붙인 것에 대한 잇따른(running) 체크섬을 계산할 수 있습니다. 알고리즘은 암호학적으로 강력하지 않아서, 인증이나 디지털 서명에 사용해서는 안 됩니다. 알고리즘은 체크섬 알고리즘으로 사용하도록 설계되었으므로, 일반적인 해시 알고리즘으로 사용하기에 적합하지 않습니다.


버전 3.0에서 변경: 결과는 항상 부호 없는 값입니다.

@end deffn

@geindex decompress() (zlib 모듈)
@anchor{library/zlib zlib decompress}@anchor{f08}
@deffn {함수} zlib.decompress (data, /, wbits=MAX_WBITS, bufsize=DEF_BUF_SIZE)

`data'에 있는 바이트열을 압축 해제하여, 압축되지 않은 데이터를 포함하는 바이트열 객체를 반환합니다. `wbits' 매개 변수는 `data'의 형식에 따라 다르며, 아래에서 자세히 설명합니다. `bufsize'가 제공되면, 출력 버퍼의 초기 크기로 사용됩니다. 에러가 발생하면 @ref{2e53,,error} 예외를 발생시킵니다.
@anchor{library/zlib decompress-wbits}@anchor{2e61}
`wbits' 인자는 히스토리 버퍼의 크기(또는 “창 크기(window size)”)와, 어떤 헤더와 트레일러 형식을 기대하는지를 제어합니다. @ref{2e5a,,compressobj()}의 매개 변수와 유사하지만, 더 많은 범위의 값을 받아들입니다:


@itemize *

@item 
+8 에서 +15: 창 크기의 밑이 2인 로그. 입력은 zlib 헤더와 트레일러를 포함해야 합니다.

@item 
0: zlib 헤더에서 창 크기를 자동으로 결정합니다. zlib 1.2.3.5부터 지원됩니다.

@item 
−8 에서 −15: `wbits'의 절댓값을 창 크기의 로그로 사용합니다. 입력은 헤더나 트레일러가 없는 원시 스트림이어야 합니다.

@item 
+24 에서 +31 = 16 + (8 에서 15): 값의 하위 4비트를 창 크기의 로그로 사용합니다. 입력은 gzip 헤더와 트레일러를 포함해야 합니다.

@item 
+40 에서 +47 = 32 + (8 에서 15): 값의 하위 4비트를 창 크기의 로그로 사용하고, zlib나 gzip 형식을 자동으로 받아들입니다.
@end itemize

스트림을 압축 해제할 때, 창 크기는 스트림을 압축하는 데 원래 사용된 크기보다 작아서는 안 됩니다; 너무 작은 값을 사용하면 @ref{2e53,,error} 예외가 발생할 수 있습니다. 기본 `wbits' 값은 가장 큰 창 크기에 해당하며 zlib 헤더와 트레일러가 포함될 것을 요구합니다.

`bufsize'는 압축 해제된 데이터를 담는 데 사용되는 버퍼의 초기 크기입니다. 더 많은 공간이 필요하면, 필요에 따라 버퍼 크기가 증가하므로, 이 값을 정확하게 얻을 필요는 없습니다; 조정하면 @code{malloc()}에 대한 몇 번의 호출만 절약됩니다.


버전 3.6에서 변경: `wbits'와 `bufsize'는 키워드 인자로 사용할 수 있습니다.

@end deffn

@geindex decompressobj() (zlib 모듈)
@anchor{library/zlib zlib decompressobj}@anchor{2e62}
@deffn {함수} zlib.decompressobj (wbits=MAX_WBITS[, zdict])

메모리에 한 번에 맞지 않는 데이터 스트림을 압축 해제하는 데 사용되는 압축 해제 객체를 반환합니다.

`wbits' 인자는 히스토리 버퍼의 크기(또는 “창 크기(window size)”)와, 어떤 헤더와 트레일러 형식을 기대하는지를 제어합니다. @ref{2e61,,decompress()에서 설명된 것}과 같은 의미입니다.

`zdict' 매개 변수는 사전 정의된 압축 딕셔너리를 지정합니다. 제공되면,, 압축 해제할 데이터를 생성한 압축기에서 사용한 것과 같은 딕셔너리이어야 합니다.

@cartouche
@quotation 참고 
`zdict'가 가변 객체(가령 @ref{344,,bytearray})이면, @ref{2e62,,decompressobj()}에 대한 호출과 압축 해제기의 @code{decompress()} 메서드에 대한 첫 번째 호출 사이에 내용을 수정해서는 안 됩니다.
@end quotation
@end cartouche


버전 3.3에서 변경: `zdict' 매개 변수를 추가했습니다.

@end deffn

압축 객체는 다음 메서드를 지원합니다:

@geindex compress() (zlib.Compress 메서드)
@anchor{library/zlib zlib Compress compress}@anchor{2e63}
@deffn {메서드} Compress.compress (data)

`data'를 압축하여, `data'의 데이터 중 적어도 일부에 대한 압축된 데이터가 포함된 바이트열 객체를 반환합니다. 이 데이터는 @ref{84e,,compress()} 메서드에 대한 이전 호출에서 생성된 출력에 이어붙여야 합니다. 일부 입력은 나중에 처리하기 위해 내부 버퍼에 보관될 수 있습니다.
@end deffn

@geindex flush() (zlib.Compress 메서드)
@anchor{library/zlib zlib Compress flush}@anchor{2e64}
@deffn {메서드} Compress.flush ([mode])

All pending input is processed, and a bytes object containing the remaining compressed
output is returned.  `mode' can be selected from the constants
@ref{2e65,,Z_NO_FLUSH}, @ref{2e66,,Z_PARTIAL_FLUSH}, @ref{2e67,,Z_SYNC_FLUSH},
@ref{2e68,,Z_FULL_FLUSH}, @ref{2e69,,Z_BLOCK}, or @ref{2e6a,,Z_FINISH},
defaulting to @code{Z_FINISH}.  Except @code{Z_FINISH}, all constants
allow compressing further bytestrings of data, while @code{Z_FINISH} finishes the
compressed stream and prevents compressing any more data.  After calling @code{flush()}
with `mode' set to @code{Z_FINISH}, the @ref{84e,,compress()} method cannot be called again;
the only realistic action is to delete the object.
@end deffn

@geindex copy() (zlib.Compress 메서드)
@anchor{library/zlib zlib Compress copy}@anchor{2e6b}
@deffn {메서드} Compress.copy ()

압축 객체의 복사본을 반환합니다. 공통 초기 접두사를 공유하는 데이터 집합을 효율적으로 압축하는 데 사용할 수 있습니다.
@end deffn


버전 3.8에서 변경: 압축 객체에 @ref{756,,copy.copy()}와 @ref{d64,,copy.deepcopy()} 지원이 추가되었습니다.


압축 해제 객체는 다음과 같은 메서드와 어트리뷰트를 지원합니다:

@geindex unused_data (zlib.Decompress의 속성)
@anchor{library/zlib zlib Decompress unused_data}@anchor{2e6c}
@deffn {속성} Decompress.unused_data

압축된 데이터가 끝난 뒤의 바이트를 포함하는 바이트열 객체. 즉, 압축 데이터가 들어 있는 마지막 바이트를 사용할 수 있을 때까지 @code{b""}로 남습니다. 전체 바이트열이 압축된 데이터를 포함하는 것으로 판명되면, 이것은 빈 바이트열 객체인 @code{b""}입니다.
@end deffn

@geindex unconsumed_tail (zlib.Decompress의 속성)
@anchor{library/zlib zlib Decompress unconsumed_tail}@anchor{2e6d}
@deffn {속성} Decompress.unconsumed_tail

압축되지 않은 데이터 버퍼의 한계를 초과하기 때문에 마지막 @ref{f08,,decompress()} 호출에 의해 소비되지 않은 모든 데이터를 포함하는 바이트열 객체. 이 데이터는 아직 zlib 장치가 볼 수 없었기 때문에 올바른 출력을 얻으려면 후속 @code{decompress()} 메서드 호출에 다시 공급해야 합니다 (아마도 추가 데이터를 이것에 이어붙여서).
@end deffn

@geindex eof (zlib.Decompress의 속성)
@anchor{library/zlib zlib Decompress eof}@anchor{1372}
@deffn {속성} Decompress.eof

압축된 데이터 스트림의 끝에 도달했는지를 나타내는 불리언.

올바르게 구성된 압축 스트림과 불완전하거나 잘린 스트림을 구별할 수 있도록 합니다.


Added in version 3.3.

@end deffn

@geindex decompress() (zlib.Decompress 메서드)
@anchor{library/zlib zlib Decompress decompress}@anchor{2e6e}
@deffn {메서드} Decompress.decompress (data, max_length=0)

`data'를 압축 해제하여, `string'의 데이터 중 적어도 일부에 해당하는 압축되지 않은 데이터를 포함하는 바이트열 객체를 반환합니다. 이 데이터는 @ref{f08,,decompress()} 메서드에 대한 이전 호출에서 생성된 출력에 이어붙여야 합니다. 입력 데이터 중 일부는 나중에 처리하기 위해 내부 버퍼에 보존될 수 있습니다.

선택적 매개 변수 `max_length'가 0이 아니면 반환 값은 `max_length'보다 길지 않습니다. 이는 모든 압축 입력을 처리할 수 없음을 뜻합니다; 소비되지 않은 데이터는 @ref{2e6d,,unconsumed_tail} 어트리뷰트에 저장됩니다. 압축 해제를 계속하려면 이 바이트열을 @ref{f08,,decompress()}에 대한 후속 호출로 전달해야 합니다. `max_length'가 0이면 전체 입력이 압축 해제되고, @code{unconsumed_tail}은 비어 있습니다.


버전 3.6에서 변경: `max_length'는 키워드 인자로 사용할 수 있습니다.

@end deffn

@geindex flush() (zlib.Decompress 메서드)
@anchor{library/zlib zlib Decompress flush}@anchor{2e6f}
@deffn {메서드} Decompress.flush ([length])

계류 중인 모든 입력이 처리되고, 나머지 압축되지 않은 출력을 포함하는 바이트열 객체가 반환됩니다. @ref{2e6f,,flush()}를 호출한 후, @ref{f08,,decompress()} 메서드를 다시 호출할 수 없습니다; 유일한 현실적인 조치는 객체를 삭제하는 것입니다.

선택적 매개 변수 `length'는 출력 버퍼의 초기 크기를 설정합니다.
@end deffn

@geindex copy() (zlib.Decompress 메서드)
@anchor{library/zlib zlib Decompress copy}@anchor{2e70}
@deffn {메서드} Decompress.copy ()

압축 해제 객체의 복사본을 반환합니다. 이것은 미래 시점에 스트림으로의 임의 탐색(random seek) 속도를 높이기 위해 데이터 스트림의 중간 지점에서 압축 해제기의 상태를 저장하는 데 사용될 수 있습니다.
@end deffn


버전 3.8에서 변경: 압축 해제 객체에 @ref{756,,copy.copy()}와 @ref{d64,,copy.deepcopy()} 지원이 추가되었습니다.


The following constants are available to configure compression and decompression
behavior:

@geindex DEFLATED (zlib 모듈)
@anchor{library/zlib zlib DEFLATED}@anchor{2e5b}
@deffn {데이터} zlib.DEFLATED

The deflate compression method.
@end deffn

@geindex MAX_WBITS (zlib 모듈)
@anchor{library/zlib zlib MAX_WBITS}@anchor{2e59}
@deffn {데이터} zlib.MAX_WBITS

The maximum window size, expressed as a power of 2.
For example, if @code{MAX_WBITS} is @code{15} it results in a window size
of @code{32 KiB}.
@end deffn

@geindex DEF_MEM_LEVEL (zlib 모듈)
@anchor{library/zlib zlib DEF_MEM_LEVEL}@anchor{2e71}
@deffn {데이터} zlib.DEF_MEM_LEVEL

The default memory level for compression objects.
@end deffn

@geindex DEF_BUF_SIZE (zlib 모듈)
@anchor{library/zlib zlib DEF_BUF_SIZE}@anchor{2e72}
@deffn {데이터} zlib.DEF_BUF_SIZE

The default buffer size for decompression operations.
@end deffn

@geindex Z_NO_COMPRESSION (zlib 모듈)
@anchor{library/zlib zlib Z_NO_COMPRESSION}@anchor{2e56}
@deffn {데이터} zlib.Z_NO_COMPRESSION

Compression level @code{0}; no compression.


Added in version 3.6.

@end deffn

@geindex Z_BEST_SPEED (zlib 모듈)
@anchor{library/zlib zlib Z_BEST_SPEED}@anchor{2e54}
@deffn {데이터} zlib.Z_BEST_SPEED

Compression level @code{1}; fastest and produces the least compression.
@end deffn

@geindex Z_BEST_COMPRESSION (zlib 모듈)
@anchor{library/zlib zlib Z_BEST_COMPRESSION}@anchor{2e55}
@deffn {데이터} zlib.Z_BEST_COMPRESSION

Compression level @code{9}; slowest and produces the most compression.
@end deffn

@geindex Z_DEFAULT_COMPRESSION (zlib 모듈)
@anchor{library/zlib zlib Z_DEFAULT_COMPRESSION}@anchor{2e57}
@deffn {데이터} zlib.Z_DEFAULT_COMPRESSION

Default compression level (@code{-1}); a compromise between speed and
compression. Currently equivalent to compression level @code{6}.
@end deffn

@geindex Z_DEFAULT_STRATEGY (zlib 모듈)
@anchor{library/zlib zlib Z_DEFAULT_STRATEGY}@anchor{2e5c}
@deffn {데이터} zlib.Z_DEFAULT_STRATEGY

Default compression strategy, for normal data.
@end deffn

@geindex Z_FILTERED (zlib 모듈)
@anchor{library/zlib zlib Z_FILTERED}@anchor{2e5d}
@deffn {데이터} zlib.Z_FILTERED

Compression strategy for data produced by a filter (or predictor).
@end deffn

@geindex Z_HUFFMAN_ONLY (zlib 모듈)
@anchor{library/zlib zlib Z_HUFFMAN_ONLY}@anchor{2e5e}
@deffn {데이터} zlib.Z_HUFFMAN_ONLY

Compression strategy that forces Huffman coding only.
@end deffn

@geindex Z_RLE (zlib 모듈)
@anchor{library/zlib zlib Z_RLE}@anchor{2e5f}
@deffn {데이터} zlib.Z_RLE

Compression strategy that limits match distances to one (run-length encoding).

This constant is only available if Python was compiled with zlib
1.2.0.1 or greater.


Added in version 3.6.

@end deffn

@geindex Z_FIXED (zlib 모듈)
@anchor{library/zlib zlib Z_FIXED}@anchor{2e60}
@deffn {데이터} zlib.Z_FIXED

Compression strategy that prevents the use of dynamic Huffman codes.

This constant is only available if Python was compiled with zlib
1.2.2.2 or greater.


Added in version 3.6.

@end deffn

@geindex Z_NO_FLUSH (zlib 모듈)
@anchor{library/zlib zlib Z_NO_FLUSH}@anchor{2e65}
@deffn {데이터} zlib.Z_NO_FLUSH

Flush mode @code{0}. No special flushing behavior.


Added in version 3.6.

@end deffn

@geindex Z_PARTIAL_FLUSH (zlib 모듈)
@anchor{library/zlib zlib Z_PARTIAL_FLUSH}@anchor{2e66}
@deffn {데이터} zlib.Z_PARTIAL_FLUSH

Flush mode @code{1}. Flush as much output as possible.
@end deffn

@geindex Z_SYNC_FLUSH (zlib 모듈)
@anchor{library/zlib zlib Z_SYNC_FLUSH}@anchor{2e67}
@deffn {데이터} zlib.Z_SYNC_FLUSH

Flush mode @code{2}. All output is flushed and the output is aligned to a byte boundary.
@end deffn

@geindex Z_FULL_FLUSH (zlib 모듈)
@anchor{library/zlib zlib Z_FULL_FLUSH}@anchor{2e68}
@deffn {데이터} zlib.Z_FULL_FLUSH

Flush mode @code{3}. All output is flushed and the compression state is reset.
@end deffn

@geindex Z_FINISH (zlib 모듈)
@anchor{library/zlib zlib Z_FINISH}@anchor{2e6a}
@deffn {데이터} zlib.Z_FINISH

Flush mode @code{4}. All pending input is processed, no more input is expected.
@end deffn

@geindex Z_BLOCK (zlib 모듈)
@anchor{library/zlib zlib Z_BLOCK}@anchor{2e69}
@deffn {데이터} zlib.Z_BLOCK

Flush mode @code{5}. A deflate block is completed and emitted.

This constant is only available if Python was compiled with zlib
1.2.2.2 or greater.


Added in version 3.6.

@end deffn

@geindex Z_TREES (zlib 모듈)
@anchor{library/zlib zlib Z_TREES}@anchor{2e73}
@deffn {데이터} zlib.Z_TREES

Flush mode @code{6}, for inflate operations. Instructs inflate to return when
it gets to the next deflate block boundary.

This constant is only available if Python was compiled with zlib
1.2.3.4 or greater.


Added in version 3.6.

@end deffn

사용 중인 zlib 라이브러리 버전에 대한 정보는 다음 상수를 통해 사용할 수 있습니다:

@geindex ZLIB_VERSION (zlib 모듈)
@anchor{library/zlib zlib ZLIB_VERSION}@anchor{2e74}
@deffn {데이터} zlib.ZLIB_VERSION

모듈을 빌드하는 데 사용된 zlib 라이브러리의 버전 문자열. @ref{1373,,ZLIB_RUNTIME_VERSION}으로 사용 가능한, 실행 시간에 실제로 사용되는 zlib 라이브러리와 다를 수 있습니다.
@end deffn

@geindex ZLIB_RUNTIME_VERSION (zlib 모듈)
@anchor{library/zlib zlib ZLIB_RUNTIME_VERSION}@anchor{1373}
@deffn {데이터} zlib.ZLIB_RUNTIME_VERSION

인터프리터가 실제로 로드한 zlib 라이브러리의 버전 문자열.


Added in version 3.3.

@end deffn

@geindex ZLIBNG_VERSION (zlib 모듈)
@anchor{library/zlib zlib ZLIBNG_VERSION}@anchor{2e75}
@deffn {데이터} zlib.ZLIBNG_VERSION

The version string of the zlib-ng library that was used for building the
module if zlib-ng was used. When present, the @ref{2e74,,ZLIB_VERSION} and
@ref{1373,,ZLIB_RUNTIME_VERSION} constants reflect the version of the zlib API
provided by zlib-ng.

If zlib-ng was not used to build the module, this constant will be absent.


Added in version 3.14.

@end deffn


@subsubheading 더 보기



@table @asis

@item 모듈 @ref{6b,,gzip}

@code{gzip} 형식 파일 읽기와 쓰기

@item @indicateurl{https://www.zlib.net}

zlib 라이브러리 홈페이지.

@item @indicateurl{https://www.zlib.net/manual.html}

zlib 매뉴얼은 라이브러리의 많은 함수의 의미와 사용법을 설명합니다.
@end table

In case gzip (de)compression is a bottleneck, the python-isal@footnote{https://github.com/pycompression/python-isal}
package speeds up (de)compression with a mostly compatible API.


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node gzip — gzip 파일 지원,bz2 — bzip2 압축 지원,zlib — gzip 과 호환되는 압축,데이터 압축 및 보관
@anchor{library/gzip doc}@anchor{2e76}@anchor{library/gzip gzip-support-for-gzip-files}@anchor{2e77}@anchor{library/gzip module-gzip}@anchor{6b}@anchor{library/gzip translation-repo}@anchor{2e78}
@subsection @code{gzip} — @code{gzip} 파일 지원


@geindex module; gzip

`소스 코드:' Lib/gzip.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/gzip.py}


__________________________________________________________________


이 모듈은 GNU 프로그램 @code{gzip}과 @code{gunzip}처럼 파일을 압축하고 압축을 푸는 간단한 인터페이스를 제공합니다.

This is an @ref{2157,,optional module}.
If it is missing from your copy of CPython,
look for documentation from your distributor (that is,
whoever provided Python to you).
If you are the distributor, see @ref{2155,,Requirements for optional modules}.

@c Similar notes appear in the docs of the modules:
@c - zipfile
@c - tarfile

데이터 압축은 @ref{139,,zlib} 모듈에 의해 제공됩니다.

The @code{gzip} module provides the @ref{65a,,GzipFile} class, as well as the
@ref{2e79,,open()}, @ref{84d,,compress()} and @ref{1412,,decompress()} convenience functions.
The @code{GzipFile} class reads and writes @code{gzip}-format files,
automatically compressing or decompressing the data so that it looks like an
ordinary @ref{13c8,,file object}.

@code{compress}와 @code{pack} 프로그램에서 생성된 것과 같은, @code{gzip}과 @code{gunzip} 프로그램으로 압축을 풀 수 있는 추가 파일 형식은 이 모듈에서 지원하지 않습니다.

이 모듈은 다음 항목을 정의합니다:

@geindex open() (gzip 모듈)
@anchor{library/gzip gzip open}@anchor{2e79}
@deffn {함수} gzip.open (filename, mode='rb', compresslevel=9, encoding=None, errors=None, newline=None)

바이너리나 텍스트 모드로 gzip으로 압축된 파일을 열고, @ref{13c8,,파일 객체}를 반환합니다.

`filename' 인자는 실제 파일명(@ref{169,,str}이나 @ref{192,,bytes} 객체)이나, 읽거나 쓸 기존 파일 객체가 될 수 있습니다.

`mode' 인자는 바이너리 모드의 경우 @code{'r'}, @code{'rb'}, @code{'a'}, @code{'ab'}, @code{'w'}, @code{'wb'}, @code{'x'} 또는 @code{'xb'}, 또는 텍스트 모드의 경우 @code{'rt'}, @code{'at'}, @code{'wt'} 또는 @code{'xt'} 중 하나일 수 있습니다. 기본값은 @code{'rb'}입니다.

`compresslevel' 인자는 @ref{65a,,GzipFile} 생성자와 마찬가지로 0에서 9 사이의 정수입니다.

바이너리 모드의 경우, 이 함수는 @ref{65a,,GzipFile} 생성자 @code{GzipFile(filename, mode, compresslevel)}와 동등합니다. 이 경우, `encoding', `errors' 및 `newline' 인자를 제공하면 안 됩니다.

텍스트 모드의 경우, @ref{65a,,GzipFile} 객체가 만들어지고, 지정된 인코딩, 에러 처리 동작 및 줄 종료를 갖는 @ref{9be,,io.TextIOWrapper} 인스턴스로 감싸집니다.


버전 3.3에서 변경: 파일 객체인 `filename' 지원, 텍스트 모드 지원 및 `encoding', `errors' 및 `newline' 인자가 추가되었습니다.



버전 3.4에서 변경: @code{'x'}, @code{'xb'} 및 @code{'xt'} 모드에 대한 지원이 추가되었습니다.



버전 3.6에서 변경: @ref{5a0,,경로류 객체}를 받아들입니다.

@end deffn

@geindex BadGzipFile
@anchor{library/gzip gzip BadGzipFile}@anchor{be9}
@deffn {예외} gzip.BadGzipFile

유효하지 않은 gzip 파일에 대한 예외. @ref{2c0,,OSError}를 상속합니다. @ref{14de,,EOFError}와 @ref{2e53,,zlib.error}도 유효하지 않은 gzip 파일에 대해서 발생할 수 있습니다.


Added in version 3.8.

@end deffn

@geindex GzipFile (gzip 클래스)
@anchor{library/gzip gzip GzipFile}@anchor{65a}
@deffn {클래스} gzip.GzipFile (filename=None, mode=None, compresslevel=9, fileobj=None, mtime=None)

@ref{1515,,truncate()} 메서드를 제외하고, 대부분 @ref{13c8,,파일 객체} 메서드를 흉내 내는 @ref{65a,,GzipFile} 클래스의 생성자입니다. `fileobj'와 `filename' 중 적어도 하나는 의미 있는 값을 부여해야 합니다.

새 클래스 인스턴스는 `fileobj'를 기반으로 하는데, 일반 파일, @ref{10a3,,io.BytesIO} 객체 또는 파일을 흉내 내는 다른 객체가 될 수 있습니다. 기본값은 @code{None}이며, 이 경우 파일 객체를 제공하기 위해 `filename'이 열립니다.

`fileobj'가 @code{None}이 아닐 때, `filename' 인자는 @code{gzip} 파일 헤더에 포함되는 데만 사용되며, 이 헤더에는 압축되지 않은 파일의 원래 파일명이 포함될 수 있습니다. 보고 알 수 있다면, `fileobj'의 파일명을 기본값으로 사용합니다; 그렇지 않으면, 기본값은 빈 문자열이며, 이 경우 원래 파일명은 헤더에 포함되지 않습니다.

`mode' 인자는 파일을 읽을지 쓸지에 따라 @code{'r'}, @code{'rb'}, @code{'a'}, @code{'ab'}, @code{'w'}, @code{'wb'}, @code{'x'} 또는 @code{'xb'} 중 하나일 수 있습니다. 보고 알 수 있다면, 기본값은 `fileobj'의 모드입니다; 그렇지 않으면, 기본값은 @code{'rb'}입니다. 향후 파이썬 릴리스에서는 `fileobj'의 모드가 사용되지 않습니다. 항상 쓰기를 위해서는 `mode'를 지정하는 것이 좋습니다.

파일이 항상 바이너리 모드로 열림에 유의하십시오. 텍스트 모드로 압축 파일을 열려면, @ref{2e79,,open()}을 사용하십시오 (또는 @ref{65a,,GzipFile}을 @ref{9be,,io.TextIOWrapper}로 감싸십시오).

`compresslevel' 인자는 압축 수준을 제어하는 @code{0}에서 @code{9}까지의 정수입니다; @code{1}은 가장 빠르고 압축률이 가장 낮으며, @code{9}는 가장 느리고 압축률이 가장 높습니다. @code{0}은 압축하지 않습니다. 기본값은 @code{9}입니다.

The optional `mtime' argument is the timestamp requested by gzip. The time
is in Unix format, i.e., seconds since 00:00:00 UTC, January 1, 1970.
If `mtime' is omitted or @code{None}, the current time is used. Use `mtime' = 0
to generate a compressed stream that does not depend on creation time.

See below for the @ref{2e7a,,mtime} attribute that is set when decompressing.

@ref{65a,,GzipFile} 객체의 @code{close()} 메서드를 호출해도 `fileobj'를 닫지 않습니다, 압축된 데이터 뒤에 뭔가 추가하기를 원할 수 있기 때문입니다. 또한, 이는 `fileobj'로 쓰기 위해 열린 @ref{10a3,,io.BytesIO} 객체를 전달하고, @code{io.BytesIO} 객체의 @ref{2e7b,,getvalue()} 메서드를 사용하여 결과 메모리 버퍼를 얻을 수 있도록 합니다.

@ref{65a,,GzipFile}은 이터레이션과 @ref{186,,with} 문을 포함하여 @ref{8a2,,io.BufferedIOBase} 인터페이스를 지원합니다. @ref{1515,,truncate()} 메서드 만 구현되지 않습니다.

@ref{65a,,GzipFile}은 다음 메서드와 어트리뷰트도 제공합니다:

@geindex peek() (gzip.GzipFile 메서드)
@anchor{library/gzip gzip GzipFile peek}@anchor{1411}
@deffn {메서드} peek (n)

파일 위치를 전진시키지 않고 압축되지 않은 `n' 바이트를 읽습니다. 반환된 바이트 수는 요청한 것보다 많거나 적을 수 있습니다.

@cartouche
@quotation 참고 
@ref{1411,,peek()}를 호출할 때 @ref{65a,,GzipFile}의 파일 위치가 변경되지는 않지만, 하부 파일 객체의 위치는 변경될 수 있습니다 (예를 들어, @code{GzipFile}이 `fileobj' 매개 변수로 생성된 경우).
@end quotation
@end cartouche


Added in version 3.2.

@end deffn

@geindex mode (gzip.GzipFile의 속성)
@anchor{library/gzip gzip GzipFile mode}@anchor{2e7c}
@deffn {속성} mode

@code{'rb'} for reading and @code{'wb'} for writing.


버전 3.13에서 변경: In previous versions it was an integer @code{1} or @code{2}.

@end deffn

@geindex mtime (gzip.GzipFile의 속성)
@anchor{library/gzip gzip GzipFile mtime}@anchor{2e7a}
@deffn {속성} mtime

압축을 풀 때, 이 어트리뷰트는 가장 최근에 읽은 헤더의 마지막 타임스탬프로 설정됩니다. 유닉스 에포크 (1970-01-01 00:00:00 UTC) 이후의 시간(초)를 나타내는 정수입니다. 헤더를 읽기 전의 초깃값은 @code{None}입니다.
@end deffn

@geindex name (gzip.GzipFile의 속성)
@anchor{library/gzip gzip GzipFile name}@anchor{730}
@deffn {속성} name

The path to the gzip file on disk, as a @ref{169,,str} or @ref{192,,bytes}.
Equivalent to the output of @ref{e4c,,os.fspath()} on the original input path,
with no other normalization, resolution or expansion.
@end deffn


버전 3.1에서 변경: `mtime' 생성자 인자와 @ref{2e7a,,mtime} 어트리뷰트와 함께 @ref{186,,with} 문에 대한 지원이 추가되었습니다.



버전 3.2에서 변경: 제로 패딩(zero-padded)된 파일과 위치 변경할 수 없는(unseekable) 파일에 대한 지원이 추가되었습니다.



버전 3.3에서 변경: @ref{2e7d,,io.BufferedIOBase.read1()} 메서드가 이제 구현됩니다.



버전 3.4에서 변경: @code{'x'} 및 @code{'xb'} 모드에 대한 지원이 추가되었습니다.



버전 3.5에서 변경: 임의의 @ref{193,,바이트열류 객체}를 쓰는 지원이 추가되었습니다. 이제 @ref{152d,,read()} 메서드는 @code{None} 인자를 받아들입니다.



버전 3.6에서 변경: @ref{5a0,,경로류 객체}를 받아들입니다.



버전 3.9부터 폐지됨: `mode' 인자를 지정하지 않고 쓰기 위해 @ref{65a,,GzipFile}을 여는 것은 폐지되었습니다.



버전 3.12에서 변경: Remove the @code{filename} attribute, use the @ref{730,,name}
attribute instead.

@end deffn

@geindex compress() (gzip 모듈)
@anchor{library/gzip gzip compress}@anchor{84d}
@deffn {함수} gzip.compress (data, compresslevel=9, *, mtime=0)

Compress the `data', returning a @ref{192,,bytes} object containing
the compressed data.  `compresslevel' and `mtime' have the same meaning as in
the @ref{65a,,GzipFile} constructor above,
but `mtime' defaults to 0 for reproducible output.


Added in version 3.2.



버전 3.8에서 변경: 재현성 있는 출력을 위한 `mtime' 매개 변수가 추가되었습니다.



버전 3.11에서 변경: Speed is improved by compressing all data at once instead of in a
streamed fashion. Calls with `mtime' set to @code{0} are delegated to
@ref{84e,,zlib.compress()} for better speed. In this situation the
output may contain a gzip header “OS” byte value other than 255
“unknown” as supplied by the underlying zlib implementation.



버전 3.13에서 변경: The gzip header OS byte is guaranteed to be set to 255 when this function
is used as was the case in 3.10 and earlier.



버전 3.14에서 변경: The `mtime' parameter now defaults to 0 for reproducible output.
For the previous behaviour of using the current time,
pass @code{None} to `mtime'.

@end deffn

@geindex decompress() (gzip 모듈)
@anchor{library/gzip gzip decompress}@anchor{1412}
@deffn {함수} gzip.decompress (data)

Decompress the `data', returning a @ref{192,,bytes} object containing the
uncompressed data. This function is capable of decompressing multi-member
gzip data (multiple gzip blocks concatenated together). When the data is
certain to contain only one member the @ref{f08,,zlib.decompress()} function with
`wbits' set to 31 is faster.


Added in version 3.2.



버전 3.11에서 변경: Speed is improved by decompressing members at once in memory instead of in
a streamed fashion.

@end deffn

@menu
* 사용 예: 사용 예<2>. 
* Command-line interface: Command-line interface<3>. 

@end menu

@node 사용 예<2>,Command-line interface<3>,,gzip — gzip 파일 지원
@anchor{library/gzip examples-of-usage}@anchor{2e7e}@anchor{library/gzip gzip-usage-examples}@anchor{2e7f}
@subsubsection 사용 예


압축된 파일을 읽는 방법의 예:

@example
import gzip
with gzip.open('/home/joe/file.txt.gz', 'rb') as f:
    file_content = f.read()
@end example

압축된 GZIP 파일을 만드는 방법의 예:

@example
import gzip
content = b"Lots of content here"
with gzip.open('/home/joe/file.txt.gz', 'wb') as f:
    f.write(content)
@end example

기존 파일을 GZIP 압축하는 방법의 예:

@example
import gzip
import shutil
with open('/home/joe/file.txt', 'rb') as f_in:
    with gzip.open('/home/joe/file.txt.gz', 'wb') as f_out:
        shutil.copyfileobj(f_in, f_out)
@end example

바이너리 문자열을 GZIP 압축하는 방법의 예:

@example
import gzip
s_in = b"Lots of content here"
s_out = gzip.compress(s_in)
@end example


@subsubheading 더 보기



@table @asis

@item 모듈 @ref{139,,zlib}

@code{gzip} 파일 형식을 지원하는 데 필요한 기본 데이터 압축 모듈.
@end table

In case gzip (de)compression is a bottleneck, the python-isal@footnote{https://github.com/pycompression/python-isal}
package speeds up (de)compression with a mostly compatible API.


@node Command-line interface<3>,,사용 예<2>,gzip — gzip 파일 지원
@anchor{library/gzip command-line-interface}@anchor{2e80}@anchor{library/gzip gzip-cli}@anchor{2e81}
@subsubsection Command-line interface


The @code{gzip} module provides a simple command line interface to compress or
decompress files.

Once executed the @code{gzip} module keeps the input file(s).


버전 3.8에서 변경: 새로운 명령 중 인터페이스를 사용법과 함께 추가합니다. 기본적으로, CLI를 실행할 때, 기본 압축 수준은 6입니다.


@menu
* Command-line options:: 

@end menu

@node Command-line options,,,Command-line interface<3>
@anchor{library/gzip command-line-options}@anchor{2e82}
@subsubsection Command-line options


@geindex gzip 명령줄 옵션; file
@anchor{library/gzip cmdoption-gzip-arg-file}@anchor{2e83}
@deffn {Option} file

`file'이 지정되지 않으면, @ref{75e,,sys.stdin}에서 읽습니다.
@end deffn

@geindex gzip 명령줄 옵션; --fast
@anchor{library/gzip cmdoption-gzip-fast}@anchor{2e84}
@deffn {Option} @w{-}@w{-}fast

가장 빠른 압축 방법(압축을 덜 함)을 나타냅니다.
@end deffn

@geindex gzip 명령줄 옵션; --best
@anchor{library/gzip cmdoption-gzip-best}@anchor{2e85}
@deffn {Option} @w{-}@w{-}best

가장 느린 압축 방법(최상의 압축)을 나타냅니다.
@end deffn

@geindex gzip 명령줄 옵션; -d
@geindex gzip 명령줄 옵션; --decompress
@anchor{library/gzip cmdoption-gzip-d}@anchor{2e86}@anchor{library/gzip cmdoption-gzip-decompress}@anchor{2e87}
@deffn {Option} @w{-}d, @w{-}@w{-}decompress

주어진 파일의 압축을 풉니다.
@end deffn

@geindex gzip 명령줄 옵션; -h
@geindex gzip 명령줄 옵션; --help
@anchor{library/gzip cmdoption-gzip-h}@anchor{2e88}@anchor{library/gzip cmdoption-gzip-help}@anchor{2e89}
@deffn {Option} @w{-}h, @w{-}@w{-}help

도움말 메시지를 표시합니다.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node bz2 — bzip2 압축 지원,lzma — LZMA 알고리즘을 사용한 압축,gzip — gzip 파일 지원,데이터 압축 및 보관
@anchor{library/bz2 doc}@anchor{2e8a}@anchor{library/bz2 bz2-support-for-bzip2-compression}@anchor{2e8b}@anchor{library/bz2 module-bz2}@anchor{14}@anchor{library/bz2 translation-repo}@anchor{2e8c}
@subsection @code{bz2} — @code{bzip2} 압축 지원


@geindex module; bz2

`소스 코드:' Lib/bz2.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/bz2.py}


__________________________________________________________________


이 모듈은 bzip2 압축 알고리즘을 사용하여 데이터 압축과 압축 해제를 위한 포괄적인 인터페이스를 제공합니다.

The @code{bz2} module contains:


@itemize *

@item 
압축된 파일을 읽고 쓰기 위한 @ref{1292,,open()} 함수와 @ref{a66,,BZ2File} 클래스.

@item 
증분 압축(해제)을 위한 @ref{1acc,,BZ2Compressor}와 @ref{1aca,,BZ2Decompressor} 클래스.

@item 
일괄 압축(해제)을 위한 @ref{28a2,,compress()}와 @ref{1293,,decompress()} 함수.
@end itemize

This is an @ref{2157,,optional module}.
If it is missing from your copy of CPython,
look for documentation from your distributor (that is,
whoever provided Python to you).
If you are the distributor, see @ref{2155,,Requirements for optional modules}.

@c Similar notes appear in the docs of the modules:
@c - zipfile
@c - tarfile

@menu
* 파일 압축(해제): 파일 압축 해제. 
* 증분 압축(해제): 증분 압축 해제. 
* 일괄 압축(해제): 일괄 압축 해제. 
* 사용 예: 사용 예<3>. 

@end menu

@node 파일 압축 해제,증분 압축 해제,,bz2 — bzip2 압축 지원
@anchor{library/bz2 de-compression-of-files}@anchor{2e8d}
@subsubsection 파일 압축(해제)


@geindex open() (bz2 모듈)
@anchor{library/bz2 bz2 open}@anchor{1292}
@deffn {함수} bz2.open (filename, mode='rb', compresslevel=9, encoding=None, errors=None, newline=None)

바이너리나 텍스트 모드로 bzip2 압축된 파일을 열고, @ref{13c8,,파일 객체}를 반환합니다.

@ref{a66,,BZ2File}의 생성자와 마찬가지로, `filename' 인자는 실제 파일명(@ref{169,,str}이나 @ref{192,,bytes} 객체)이거나, 읽거나 쓸 기존 파일 객체가 될 수 있습니다.

`mode' 인자는 바이너리 모드의 경우 @code{'r'}, @code{'rb'}, @code{'w'}, @code{'wb'}, @code{'x'}, @code{'xb'}, @code{'a'} 또는 @code{'ab'}, 또는 텍스트 모드의 경우 @code{'rt'}, @code{'wt'}, @code{'xt'} 또는 @code{'at'} 중 하나일 수 있습니다. 기본값은 @code{'rb'}입니다.

`compresslevel' 인자는 @ref{a66,,BZ2File} 생성자와 마찬가지로 1에서 9 사이의 정수입니다.

바이너리 모드의 경우, 이 함수는 @ref{a66,,BZ2File} 생성자 @code{BZ2File(filename, mode, compresslevel=compresslevel)}와 동등합니다. 이 경우, `encoding', `errors' 및 `newline' 인자를 제공하면 안 됩니다.

텍스트 모드의 경우, @ref{a66,,BZ2File} 객체가 만들어지고, 지정된 인코딩, 에러 처리 동작 및 줄 종료를 갖는 @ref{9be,,io.TextIOWrapper} 인스턴스로 감싸집니다.


Added in version 3.3.



버전 3.4에서 변경: @code{'x'} (배타적 생성) 모드가 추가되었습니다.



버전 3.6에서 변경: @ref{5a0,,경로류 객체}를 받아들입니다.

@end deffn

@geindex BZ2File (bz2 클래스)
@anchor{library/bz2 bz2 BZ2File}@anchor{a66}
@deffn {클래스} bz2.BZ2File (filename, mode='r', *, compresslevel=9)

바이너리 모드로 bzip2 압축된 파일을 엽니다.

`filename'이 @ref{169,,str}이나 @ref{192,,bytes} 객체면, 명명된 파일을 직접 엽니다. 그렇지 않으면, `filename'은 @ref{13c8,,파일 객체} 여야 하며, 압축된 데이터를 읽거나 쓰는 데 사용됩니다.

`mode' 인자는 읽기를 위한 @code{'r'} (기본값), 덮어쓰기를 위한 @code{'w'}, 배타적 생성을 위한 @code{'x'} 또는 덧붙이기를 위한 @code{'a'} 중 하나일 수 있습니다. 이들은 각각 @code{'rb'}, @code{'wb'}, @code{'xb'} 및 @code{'ab'}로 주어지는 것과 동등합니다.

`filename'이 (실제 파일 이름 대신) 파일 객체면, @code{'w'} 모드는 파일을 자르지 않으며, 대신 @code{'a'}와 동등합니다.

`mode'가 @code{'w'}나 @code{'a'}이면, `compresslevel'은 압축 수준을 지정하는 @code{1}과 @code{9} 사이의 정수일 수 있습니다: @code{1}은 압축률이 가장 낮고, @code{9}(기본값)는 압축률이 가장 높습니다.

`mode'가 @code{'r'}이면, 입력 파일은 여러 개의 압축된 스트림을 이어 붙인 것일 수 있습니다.

@ref{a66,,BZ2File}은 @ref{2e12,,detach()}와 @ref{1515,,truncate()}를 제외하고, @ref{8a2,,io.BufferedIOBase}가 지정하는 모든 멤버를 제공합니다. 이터레이션과 @ref{186,,with} 문이 지원됩니다.

@ref{a66,,BZ2File}는 다음 메서드와 어트리뷰트도 제공합니다:

@geindex peek() (bz2.BZ2File 메서드)
@anchor{library/bz2 bz2 BZ2File peek}@anchor{2e8e}
@deffn {메서드} peek ([n])

파일 위치를 전진시키지 않고 버퍼링 된 데이터를 반환합니다. (EOF에 있지 않은 한) 적어도 1바이트의 데이터가 반환됩니다. 반환되는 정확한 바이트 수는 지정되지 않습니다.

@cartouche
@quotation 참고 
@ref{2e8e,,peek()}를 호출할 때 @ref{a66,,BZ2File}의 파일 위치가 변경되지는 않지만, 하부 파일 객체의 위치는 변경될 수 있습니다 (예를 들어, @code{BZ2File}이 `filename'에 파일 객체를 전달하여 생성된 경우).
@end quotation
@end cartouche


Added in version 3.3.

@end deffn

@geindex fileno() (bz2.BZ2File 메서드)
@anchor{library/bz2 bz2 BZ2File fileno}@anchor{2e8f}
@deffn {메서드} fileno ()

Return the file descriptor for the underlying file.


Added in version 3.3.

@end deffn

@geindex readable() (bz2.BZ2File 메서드)
@anchor{library/bz2 bz2 BZ2File readable}@anchor{2e90}
@deffn {메서드} readable ()

Return whether the file was opened for reading.


Added in version 3.3.

@end deffn

@geindex seekable() (bz2.BZ2File 메서드)
@anchor{library/bz2 bz2 BZ2File seekable}@anchor{2e91}
@deffn {메서드} seekable ()

Return whether the file supports seeking.


Added in version 3.3.

@end deffn

@geindex writable() (bz2.BZ2File 메서드)
@anchor{library/bz2 bz2 BZ2File writable}@anchor{2e92}
@deffn {메서드} writable ()

Return whether the file was opened for writing.


Added in version 3.3.

@end deffn

@geindex read1() (bz2.BZ2File 메서드)
@anchor{library/bz2 bz2 BZ2File read1}@anchor{2e93}
@deffn {메서드} read1 (size=-1)

Read up to `size' uncompressed bytes, while trying to avoid
making multiple reads from the underlying stream. Reads up to a
buffer’s worth of data if size is negative.

Returns @code{b'@w{'}} if the file is at EOF.


Added in version 3.3.

@end deffn

@geindex readinto() (bz2.BZ2File 메서드)
@anchor{library/bz2 bz2 BZ2File readinto}@anchor{2e94}
@deffn {메서드} readinto (b)

Read bytes into `b'.

Returns the number of bytes read (0 for EOF).


Added in version 3.3.

@end deffn

@geindex mode (bz2.BZ2File의 속성)
@anchor{library/bz2 bz2 BZ2File mode}@anchor{2e95}
@deffn {속성} mode

@code{'rb'} for reading and @code{'wb'} for writing.


Added in version 3.13.

@end deffn

@geindex name (bz2.BZ2File의 속성)
@anchor{library/bz2 bz2 BZ2File name}@anchor{2e96}
@deffn {속성} name

The bzip2 file name.  Equivalent to the @ref{2e16,,name}
attribute of the underlying @ref{13c8,,file object}.


Added in version 3.13.

@end deffn


버전 3.1에서 변경: @ref{186,,with} 문에 대한 지원이 추가되었습니다.



버전 3.3에서 변경: 실제 파일명 대신 @ref{13c8,,파일 객체} 인 `filename'에 대한 지원이 추가되었습니다.

다중 스트림 파일 읽기 지원과 함께, @code{'a'} (덧붙이기) 모드가 추가되었습니다.



버전 3.4에서 변경: @code{'x'} (배타적 생성) 모드가 추가되었습니다.



버전 3.5에서 변경: @ref{152d,,read()} 메서드는 이제 @code{None} 인자를 받아들입니다.



버전 3.6에서 변경: @ref{5a0,,경로류 객체}를 받아들입니다.



버전 3.9에서 변경: `buffering' 매개 변수가 제거되었습니다. 파이썬 3.0부터 무시되고 폐지되었습니다. 파일을 여는 방법을 제어하려면 열린 파일 객체를 전달하십시오.

`compresslevel' 매개 변수가 키워드 전용이 되었습니다.



버전 3.10에서 변경: This class is thread unsafe in the face of multiple simultaneous
readers or writers, just like its equivalent classes in @ref{6b,,gzip} and
@ref{8e,,lzma} have always been.

@end deffn

@node 증분 압축 해제,일괄 압축 해제,파일 압축 해제,bz2 — bzip2 압축 지원
@anchor{library/bz2 incremental-de-compression}@anchor{2e97}
@subsubsection 증분 압축(해제)


@geindex BZ2Compressor (bz2 클래스)
@anchor{library/bz2 bz2 BZ2Compressor}@anchor{1acc}
@deffn {클래스} bz2.BZ2Compressor (compresslevel=9)

새로운 압축기 객체를 만듭니다. 이 객체는 증분 적으로(incrementally) 데이터를 압축하는 데 사용될 수 있습니다. 일괄(one-shot) 압축에는, 대신 @ref{28a2,,compress()} 함수를 사용하십시오.

주어진다면, `compresslevel'은 @code{1}과 @code{9} 사이의 정수여야 합니다. 기본값은 @code{9}입니다.

@geindex compress() (bz2.BZ2Compressor 메서드)
@anchor{library/bz2 bz2 BZ2Compressor compress}@anchor{2e98}
@deffn {메서드} compress (data)

압축기 객체에 데이터를 제공합니다. 가능하면 압축된 데이터 청크를 반환하고, 그렇지 않으면 빈 바이트열을 반환합니다.

압축기에 데이터 제공이 끝나면, @ref{2e99,,flush()} 메서드를 호출하여 압축 공정을 마무리하십시오.
@end deffn

@geindex flush() (bz2.BZ2Compressor 메서드)
@anchor{library/bz2 bz2 BZ2Compressor flush}@anchor{2e99}
@deffn {메서드} flush ()

압축 공정을 마칩니다. 내부 버퍼에 남아있는 압축된 데이터를 반환합니다.

이 메서드가 호출된 후에는, 압축기 객체를 사용할 수 없습니다.
@end deffn
@end deffn

@geindex BZ2Decompressor (bz2 클래스)
@anchor{library/bz2 bz2 BZ2Decompressor}@anchor{1aca}
@deffn {클래스} bz2.BZ2Decompressor

새로운 압축 해제기 객체를 만듭니다. 이 객체는 데이터를 증분 적으로 압축 해제하는 데 사용될 수 있습니다. 일괄 압축에는, 대신 @ref{1293,,decompress()} 함수를 사용하십시오.

@cartouche
@quotation 참고 
이 클래스는 @ref{1293,,decompress()}와 @ref{a66,,BZ2File}과 달리 다중 압축 스트림을 포함하는 입력을 투명하게 처리하지 않습니다. @ref{1aca,,BZ2Decompressor}로 다중 스트림 입력의 압축을 풀어야 한다면, 각 스트림 마다 새 압축 해제기를 사용해야 합니다.
@end quotation
@end cartouche

@geindex decompress() (bz2.BZ2Decompressor 메서드)
@anchor{library/bz2 bz2 BZ2Decompressor decompress}@anchor{fc9}
@deffn {메서드} decompress (data, max_length=-1)

`data'(@ref{193,,바이트열류 객체})의 압축을 풀고, 압축되지 않은 데이터를 바이트열로 반환합니다. 일부 `data'는 나중에 @ref{1293,,decompress()}를 호출할 때 사용할 수 있도록 내부에 버퍼링 됩니다. 반환된 데이터는 @code{decompress()}에 대한 이전 호출의 출력에 이어붙여야 합니다.

`max_length'가 음수가 아니면, 최대 `max_length' 바이트의 압축 해제된 데이터를 반환합니다. 이 제한에 도달했고, 추가 출력을 생성할 수 없으면, @ref{2e9a,,needs_input} 어트리뷰트는 @code{False}로 설정됩니다. 이때, @ref{fc9,,decompress()}에 대한 다음 호출은 출력을 더 얻기 위해 `data'를 @code{b'@w{'}}로 제공할 수 있습니다.

입력 데이터가 모두 압축 해제되고 반환되었으면 (`max_length' 바이트 미만이거나 `max_length'가 음수라서), @ref{2e9a,,needs_input} 어트리뷰트가 @code{True}로 설정됩니다.

스트림의 끝에 도달한 이후에 데이터의 압축을 풀려고 하면, @ref{14de,,EOFError}가 발생합니다. 스트림의 끝 이후에 발견된 모든 데이터는 무시되고, @ref{2e9b,,unused_data} 어트리뷰트에 저장됩니다.


버전 3.5에서 변경: `max_length' 매개 변수가 추가되었습니다.

@end deffn

@geindex eof (bz2.BZ2Decompressor의 속성)
@anchor{library/bz2 bz2 BZ2Decompressor eof}@anchor{2e9c}
@deffn {속성} eof

스트림의 끝(end-of-stream) 마커에 도달했으면 @code{True}.


Added in version 3.3.

@end deffn

@geindex unused_data (bz2.BZ2Decompressor의 속성)
@anchor{library/bz2 bz2 BZ2Decompressor unused_data}@anchor{2e9b}
@deffn {속성} unused_data

압축된 스트림의 끝 이후에 발견된 데이터.

스트림의 끝에 도달하기 전에 이 어트리뷰트를 액세스하면, 값은 @code{b'@w{'}}가 됩니다.
@end deffn

@geindex needs_input (bz2.BZ2Decompressor의 속성)
@anchor{library/bz2 bz2 BZ2Decompressor needs_input}@anchor{2e9a}
@deffn {속성} needs_input

@ref{fc9,,decompress()} 메서드가 새로운 압축된 입력을 요구하기 전에 압축 해제된 데이터를 더 제공할 수 있으면 @code{False}.


Added in version 3.5.

@end deffn
@end deffn

@node 일괄 압축 해제,사용 예<3>,증분 압축 해제,bz2 — bzip2 압축 지원
@anchor{library/bz2 one-shot-de-compression}@anchor{2e9d}
@subsubsection 일괄 압축(해제)


@geindex compress() (bz2 모듈)
@anchor{library/bz2 bz2 compress}@anchor{28a2}
@deffn {함수} bz2.compress (data, compresslevel=9)

@ref{193,,비이트열류 객체}, `data'를 압축합니다.

주어진다면, `compresslevel'은 @code{1}과 @code{9} 사이의 정수여야 합니다. 기본값은 @code{9}입니다.

증분 압축에는, 대신 @ref{1acc,,BZ2Compressor}를 사용하십시오.
@end deffn

@geindex decompress() (bz2 모듈)
@anchor{library/bz2 bz2 decompress}@anchor{1293}
@deffn {함수} bz2.decompress (data)

@ref{193,,비이트열류 객체}, `data'를 압축 해제합니다.

`data'가 다중 압축 스트림을 이어붙인 것이면, 모든 스트림의 압축을 풉니다.

증분 압축 해제에는, 대신 @ref{1aca,,BZ2Decompressor}를 사용하십시오.


버전 3.3에서 변경: 다중 스트림 입력에 대한 지원이 추가되었습니다.

@end deffn

@node 사용 예<3>,,일괄 압축 해제,bz2 — bzip2 압축 지원
@anchor{library/bz2 bz2-usage-examples}@anchor{2e9e}@anchor{library/bz2 examples-of-usage}@anchor{2e9f}
@subsubsection 사용 예


Below are some examples of typical usage of the @code{bz2} module.

왕복 압축을 시연하기 위해 @ref{28a2,,compress()}와 @ref{1293,,decompress()} 사용하기:

@example
>>> import bz2
>>> data = b"""\
... Donec rhoncus quis sapien sit amet molestie. Fusce scelerisque vel augue
... nec ullamcorper. Nam rutrum pretium placerat. Aliquam vel tristique lorem,
... sit amet cursus ante. In interdum laoreet mi, sit amet ultrices purus
... pulvinar a. Nam gravida euismod magna, non varius justo tincidunt feugiat.
... Aliquam pharetra lacus non risus vehicula rutrum. Maecenas aliquam leo
... felis. Pellentesque semper nunc sit amet nibh ullamcorper, ac elementum
... dolor luctus. Curabitur lacinia mi ornare consectetur vestibulum."""
>>> c = bz2.compress(data)
>>> len(data) / len(c)  # Data compression ratio
1.513595166163142
>>> d = bz2.decompress(c)
>>> data == d  # Check equality to original object after round-trip
True
@end example

증분 압축을 위한 @ref{1acc,,BZ2Compressor} 사용하기:

@example
>>> import bz2
>>> def gen_data(chunks=10, chunksize=1000):
...     """Yield incremental blocks of chunksize bytes."""
...     for _ in range(chunks):
...         yield b"z" * chunksize
...
>>> comp = bz2.BZ2Compressor()
>>> out = b""
>>> for chunk in gen_data():
...     # Provide data to the compressor object
...     out = out + comp.compress(chunk)
...
>>> # Finish the compression process.  Call this once you have
>>> # finished providing data to the compressor.
>>> out = out + comp.flush()
@end example

위의 예제는 매우 “무작위적이지 않은” 데이터 스트림(@code{b"z"} 청크의 스트림)을 사용합니다. 무작위 데이터는 압축이 잘되지 않지만, 반복적인 데이터는 일반적으로 높은 압축률을 산출합니다.

바이너리 모드로 bzip2 압축된 파일을 쓰고 읽기:

@example
>>> import bz2
>>> data = b"""\
... Donec rhoncus quis sapien sit amet molestie. Fusce scelerisque vel augue
... nec ullamcorper. Nam rutrum pretium placerat. Aliquam vel tristique lorem,
... sit amet cursus ante. In interdum laoreet mi, sit amet ultrices purus
... pulvinar a. Nam gravida euismod magna, non varius justo tincidunt feugiat.
... Aliquam pharetra lacus non risus vehicula rutrum. Maecenas aliquam leo
... felis. Pellentesque semper nunc sit amet nibh ullamcorper, ac elementum
... dolor luctus. Curabitur lacinia mi ornare consectetur vestibulum."""
>>> with bz2.open("myfile.bz2", "wb") as f:
...     # Write compressed data to file
...     unused = f.write(data)
...
>>> with bz2.open("myfile.bz2", "rb") as f:
...     # Decompress data from file
...     content = f.read()
...
>>> content == data  # Check equality to original object after round-trip
True
@end example

@c import os
@c os.remove("myfile.bz2")

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node lzma — LZMA 알고리즘을 사용한 압축,zipfile — ZIP 아카이브 작업,bz2 — bzip2 압축 지원,데이터 압축 및 보관
@anchor{library/lzma doc}@anchor{2ea0}@anchor{library/lzma lzma-compression-using-the-lzma-algorithm}@anchor{2ea1}@anchor{library/lzma module-lzma}@anchor{8e}@anchor{library/lzma translation-repo}@anchor{2ea2}
@subsection @code{lzma} — LZMA 알고리즘을 사용한 압축


@geindex module; lzma


Added in version 3.3.


`소스 코드:' Lib/lzma.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/lzma.py}


__________________________________________________________________


이 모듈은 LZMA 압축 알고리즘을 사용하여 데이터를 압축 및 압축 해제하기 위한 클래스와 편의 함수를 제공합니다. 또한 @code{xz} 유틸리티에서 사용되는 @code{.xz}와 레거시 @code{.lzma} 파일 형식뿐만 아니라 원시 압축 스트림을 지원하는 파일 인터페이스도 포함되어 있습니다.

이 모듈에서 제공하는 인터페이스는 @ref{14,,bz2} 모듈의 인터페이스와 매우 유사합니다. @ref{120b,,LZMAFile}과 @ref{a66,,bz2.BZ2File}은 스레드 안전하지 `않아서', 여러 스레드에서 단일 @code{LZMAFile} 인스턴스를 사용해야 하면 록으로 보호해야 합니다.

This is an @ref{2157,,optional module}.
If it is missing from your copy of CPython,
look for documentation from your distributor (that is,
whoever provided Python to you).
If you are the distributor, see @ref{2155,,Requirements for optional modules}.

@c Similar notes appear in the docs of the modules:
@c - zipfile
@c - tarfile

@geindex LZMAError
@anchor{library/lzma lzma LZMAError}@anchor{2ea3}
@deffn {예외} lzma.LZMAError

이 예외는 압축이나 압축 해제 중, 또는 압축기/압축 해제기 상태를 초기화하는 동안 에러가 발생할 때 발생합니다.
@end deffn

@menu
* 압축 파일 읽기와 쓰기:: 
* 메모리에서의 데이터 압축과 압축 해제:: 
* 기타:: 
* 사용자 정의 필터 체인 지정:: 
* 예: 예<4>. 

@end menu

@node 압축 파일 읽기와 쓰기,메모리에서의 데이터 압축과 압축 해제,,lzma — LZMA 알고리즘을 사용한 압축
@anchor{library/lzma reading-and-writing-compressed-files}@anchor{2ea4}
@subsubsection 압축 파일 읽기와 쓰기


@geindex open() (lzma 모듈)
@anchor{library/lzma lzma open}@anchor{2ea5}
@deffn {함수} lzma.open (filename, mode='rb', *, format=None, check=-1, preset=None, filters=None, encoding=None, errors=None, newline=None)

바이너리나 텍스트 모드에서 LZMA 압축 파일을 열고, @ref{13c8,,파일 객체}를 반환합니다.

`filename' 인자는 실제 파일 이름(@ref{169,,str}, @ref{192,,bytes} 또는 @ref{5a0,,경로류} 객체로 제공됩니다)일 수 있고, 이때는 명명된 파일이 열립니다. 또는 읽거나 쓸 기존 파일 객체일 수 있습니다.

`mode' 인자는 바이너리 모드의 경우 @code{"r"}, @code{"rb"}, @code{"w"}, @code{"wb"}, @code{"x"}, @code{"xb"}, @code{"a"} 또는 @code{"ab"}이거나, 텍스트 모드의 경우 @code{"rt"}, @code{"wt"}, @code{"xt"} 또는 @code{"at"} 일 수 있습니다. 기본값은 @code{"rb"}입니다.

파일을 읽기 위해 열 때, `format'과 `filters' 인자는 @ref{1ac9,,LZMADecompressor}와 같은 의미입니다. 이 경우, `check'과 `preset' 인자를 사용하지 않아야 합니다.

파일을 쓰기 위해 열 때, `format', `check', `preset' 및 `filters' 인자는 @ref{1acb,,LZMACompressor}와 같은 의미입니다.

바이너리 모드의 경우, 이 함수는 @ref{120b,,LZMAFile} 생성자와 동등합니다: @code{LZMAFile(filename, mode, ...)}. 이 경우, `encoding', `errors' 및 `newline' 인자는 제공하지 않아야 합니다.

텍스트 모드의 경우, @ref{120b,,LZMAFile} 객체가 만들어지고, 지정된 인코딩, 에러 처리 동작 및 줄 종료로 @ref{9be,,io.TextIOWrapper} 인스턴스로 감쌉니다.


버전 3.4에서 변경: @code{"x"}, @code{"xb"} 및 @code{"xt"} 모드에 대한 지원이 추가되었습니다.



버전 3.6에서 변경: @ref{5a0,,경로류 객체}를 허용합니다.

@end deffn

@geindex LZMAFile (lzma 클래스)
@anchor{library/lzma lzma LZMAFile}@anchor{120b}
@deffn {클래스} lzma.LZMAFile (filename=None, mode='r', *, format=None, check=-1, preset=None, filters=None)

바이너리 모드로 LZMA 압축 파일을 엽니다.

@ref{120b,,LZMAFile}은 이미 열려있는 @ref{13c8,,파일 객체}를 래핑하거나, 명명된 파일에 직접 작용할 수 있습니다. `filename' 인자는 래핑할 파일 객체나 열 파일의 이름(@ref{169,,str}, @ref{192,,bytes} 또는 @ref{5a0,,경로류} 객체로)을 지정합니다. 기존 파일 객체를 래핑할 때, 래핑 된 파일은 @code{LZMAFile}이 닫힐 때 닫히지 않습니다.

`mode' 인자는 읽기 위한 @code{"r"} (기본값), 덮어쓰기 위한 @code{"w"}, 배타적 생성을 위한 @code{"x"} 또는 덧붙이기를 위한 @code{"a"} 일 수 있습니다. 이들은 각각 @code{"rb"}, @code{"wb"}, @code{"xb"} 및 @code{"ab"}로 동등하게 제공될 수 있습니다.

`filename'이 (실제 파일 이름이 아닌) 파일 객체이면, @code{"w"} 모드는 파일을 자르지 않으며, 대신 @code{"a"}와 동등합니다.

읽기 위해 파일을 열 때, 입력 파일은 여러 개의 개별 압축 스트림을 연결한 것일 수 있습니다. 이들은 단일 논리 스트림으로 투명하게 디코딩됩니다.

파일을 읽기 위해 열 때, `format'과 `filters' 인자는 @ref{1ac9,,LZMADecompressor}와 같은 의미입니다. 이 경우, `check'과 `preset' 인자를 사용하지 않아야 합니다.

파일을 쓰기 위해 열 때, `format', `check', `preset' 및 `filters' 인자는 @ref{1acb,,LZMACompressor}와 같은 의미입니다.

@ref{120b,,LZMAFile}은 @ref{2e12,,detach()}와 @ref{1515,,truncate()}를 제외하고, @ref{8a2,,io.BufferedIOBase} 가 지정하는 모든 멤버를 지원합니다. 이터레이션과 @ref{186,,with} 문이 지원됩니다.

다음과 같은 메서드와 어트리뷰트도 제공됩니다:

@geindex peek() (lzma.LZMAFile 메서드)
@anchor{library/lzma lzma LZMAFile peek}@anchor{2ea6}
@deffn {메서드} peek (size=-1)

파일 위치를 진행하지 않고 버퍼링 된 데이터를 반환합니다. EOF에 도달하지 않았으면, 최소 1바이트의 데이터가 반환됩니다. 반환되는 정확한 바이트 수는 지정되지 않습니다 (`size' 인자는 무시됩니다).

@cartouche
@quotation 참고 
@ref{2ea6,,peek()}를 호출해도 @ref{120b,,LZMAFile}의 파일 위치는 변경되지 않지만, 하부 파일 객체의 위치는 변경될 수 있습니다 (예를 들어 @code{LZMAFile}이 `filename'으로 파일 객체를 전달하여 생성되었을 때).
@end quotation
@end cartouche
@end deffn

@geindex mode (lzma.LZMAFile의 속성)
@anchor{library/lzma lzma LZMAFile mode}@anchor{2ea7}
@deffn {속성} mode

@code{'rb'} for reading and @code{'wb'} for writing.


Added in version 3.13.

@end deffn

@geindex name (lzma.LZMAFile의 속성)
@anchor{library/lzma lzma LZMAFile name}@anchor{2ea8}
@deffn {속성} name

The lzma file name.  Equivalent to the @ref{2e16,,name}
attribute of the underlying @ref{13c8,,file object}.


Added in version 3.13.

@end deffn


버전 3.4에서 변경: @code{"x"}와 @code{"xb"} 모드에 대한 지원이 추가되었습니다.



버전 3.5에서 변경: @ref{152d,,read()} 메서드는 이제 @code{None} 인자를 허용합니다.



버전 3.6에서 변경: @ref{5a0,,경로류 객체}를 허용합니다.

@end deffn

@node 메모리에서의 데이터 압축과 압축 해제,기타,압축 파일 읽기와 쓰기,lzma — LZMA 알고리즘을 사용한 압축
@anchor{library/lzma compressing-and-decompressing-data-in-memory}@anchor{2ea9}
@subsubsection 메모리에서의 데이터 압축과 압축 해제


@geindex LZMACompressor (lzma 클래스)
@anchor{library/lzma lzma LZMACompressor}@anchor{1acb}
@deffn {클래스} lzma.LZMACompressor (format=FORMAT_XZ, check=-1, preset=None, filters=None)

데이터를 증분 압축하는 데 사용할 수 있는 압축기 객체를 만듭니다.

단일 데이터 청크를 압축하는 더 편리한 방법은, @ref{2eaa,,compress()}를 참조하십시오.

`format' 인자는 사용해야 할 컨테이너 형식을 지정합니다. 가능한 값은 다음과 같습니다:


@itemize *

@item 

@table @asis

@item @code{FORMAT_XZ}: @code{.xz} 컨테이너 형식.

이것이 기본 형식입니다.
@end table

@item 

@table @asis

@item @code{FORMAT_ALONE}: 레거시 @code{.lzma} 컨테이너 형식.

이 형식은 @code{.xz}보다 제한적입니다 – 무결성 검사나 다중 필터를 지원하지 않습니다.
@end table

@item 

@table @asis

@item @code{FORMAT_RAW}: 컨테이너 형식을 사용하지 않는 원시 데이터 스트림.

이 형식 지정자는 무결성 검사를 지원하지 않으며, 항상 사용자 지정 필터 체인(압축과 압축 해제 모두를 위한)을 지정해야 합니다. 또한, 이 방식으로 압축된 데이터는 @code{FORMAT_AUTO}를 사용하여 압축 해제할 수 없습니다 (@ref{1ac9,,LZMADecompressor}를 참조하십시오).
@end table
@end itemize

`check' 인자는 압축된 데이터에 포함할 무결성 검사 유형을 지정합니다. 이 검사는 압축을 풀 때 데이터가 손상되지 않았는지 확인하는 데 사용됩니다. 가능한 값은 다음과 같습니다:


@itemize *

@item 
@code{CHECK_NONE}: 무결성 검사가 없습니다. 이것은 @code{FORMAT_ALONE}과 @code{FORMAT_RAW}에 대한 기본값(그리고 유일하게 허용된 값)입니다.

@item 
@code{CHECK_CRC32}: 32비트 순환 중복 검사(Cyclic Redundancy Check).

@item 
@code{CHECK_CRC64}: 64비트 순환 중복 검사(Cyclic Redundancy Check). 이것이 @code{FORMAT_XZ}의 기본값입니다.

@item 
@code{CHECK_SHA256}: 256비트 보안 해시 알고리즘(Secure Hash Algorithm).
@end itemize

지정된 검사가 지원되지 않으면, @ref{2ea3,,LZMAError}가 발생합니다.

압축 설정은 사전 설정 압축 수준(`preset' 인자 사용), 또는 사용자 정의 필터 체인(`filters' 인자 사용)으로 지정할 수 있습니다.

`preset' 인자(제공된 경우)는 @code{0}rhk @code{9} 사이의 (경계 포함) 정수여야 하며, 선택적으로 상수 @code{PRESET_EXTREME}과 OR 할 수 있습니다. `preset*과 *filters'가 모두 제공되지 않으면, 기본 동작은 @code{PRESET_DEFAULT}(사전 설정 수준 @code{6})를 사용하는 것입니다. 사전 설정이 높을수록 출력은 작아 지지만, 압축 과정은 느려집니다.

@cartouche
@quotation 참고 
CPU를 많이 사용하는 것 외에도, 사전 설정이 높은 압축은 훨씬 더 많은 메모리를 요구합니다 (그리고 압축을 풀기 위해 더 많은 메모리를 요구하는 출력을 생성합니다). 예를 들어 사전 설정 @code{9}를 사용하면, @ref{1acb,,LZMACompressor} 객체의 오버헤드가 800 MiB에 이를 수 있습니다. 이런 이유로, 일반적으로 기본 사전 설정을 사용하는 것이 가장 좋습니다.
@end quotation
@end cartouche

`filters' 인자(제공된 경우)는 필터 체인 지정자여야 합니다. 자세한 내용은 @ref{2eab,,사용자 정의 필터 체인 지정}을 참조하십시오.

@geindex compress() (lzma.LZMACompressor 메서드)
@anchor{library/lzma lzma LZMACompressor compress}@anchor{2eac}
@deffn {메서드} compress (data)

`data'(@ref{192,,bytes} 객체)를 압축하여, 적어도 입력의 일부에 대한 압축 데이터가 포함된 @code{bytes} 객체를 반환합니다. `data'의 일부는 나중에 @ref{2eaa,,compress()}와 @ref{2ead,,flush()}에 대한 호출에 사용하기 위해 내부적으로 버퍼링 될 수 있습니다. 반환된 데이터는 @code{compress()}에 대한 이전 호출의 출력에 이어 붙여야 합니다.
@end deffn

@geindex flush() (lzma.LZMACompressor 메서드)
@anchor{library/lzma lzma LZMACompressor flush}@anchor{2ead}
@deffn {메서드} flush ()

압축 과정을 마치고, 압축기의 내부 버퍼에 저장된 모든 데이터가 포함된 @ref{192,,bytes} 객체를 반환합니다.

이 메서드를 호출한 후에는 압축기를 사용할 수 없습니다.
@end deffn
@end deffn

@geindex LZMADecompressor (lzma 클래스)
@anchor{library/lzma lzma LZMADecompressor}@anchor{1ac9}
@deffn {클래스} lzma.LZMADecompressor (format=FORMAT_AUTO, memlimit=None, filters=None)

데이터를 점진적으로 압축 해제하는 데 사용할 수 있는 압축 해제기 객체를 만듭니다.

전체 압축 스트림을 한 번에 압축 해제하는 더 편리한 방법은 @ref{2eae,,decompress()}를 참조하십시오.

`format' 인자는 사용해야 하는 컨테이너 형식을 지정합니다. 기본값은 @code{FORMAT_AUTO}이며, @code{.xz}와 @code{.lzma} 파일을 모두 압축 해제할 수 있습니다. 다른 가능한 값은 @code{FORMAT_XZ}, @code{FORMAT_ALONE} 및 @code{FORMAT_RAW}입니다.

`memlimit' 인자는 압축 해제기가 사용할 수 있는 메모리양의 한계(바이트)를 지정합니다. 이 인자를 사용할 때, 주어진 메모리 한계 내에서 입력을 압축 해제할 수 없으면 @ref{2ea3,,LZMAError}로 압축 해제에 실패합니다.

`filters' 인자는 압축 해제 중인 스트림을 만드는 데 사용된 필터 체인을 지정합니다. `format'이 @code{FORMAT_RAW}이면 이 인자가 필요하지만, 다른 형식에는 사용하지 않아야 합니다. 필터 체인에 대한 자세한 내용은 @ref{2eab,,사용자 정의 필터 체인 지정}을 참조하십시오.

@cartouche
@quotation 참고 
이 클래스는 @ref{2eae,,decompress()}와 @ref{120b,,LZMAFile}과 달리, 여러 압축 스트림을 포함하는 입력을 투명하게 처리하지 않습니다. @ref{1ac9,,LZMADecompressor}로 다중 스트림 입력을 압축 해제하려면 각 스트림에 대해 새로운 압축 해제기를 만들어야 합니다.
@end quotation
@end cartouche

@geindex decompress() (lzma.LZMADecompressor 메서드)
@anchor{library/lzma lzma LZMADecompressor decompress}@anchor{102d}
@deffn {메서드} decompress (data, max_length=-1)

`data'(@ref{193,,바이트열류 객체})를 압축 해제하고, 압축되지 않은 데이터를 바이트열로 반환합니다. `data'의 일부는 나중에 @ref{2eae,,decompress()}를 호출할 때 사용하기 위해 내부적으로 버퍼링 될 수 있습니다. 반환된 데이터는 @code{decompress()}에 대한 이전 호출의 출력에 이어 붙여야 합니다.

`max_length'가 음수가 아니면, 최대 `max_length' 바이트의 압축 해제된 데이터를 반환합니다. 이 한계에 도달하고 추가 출력을 생성할 수 있으면, @ref{2eaf,,needs_input} 어트리뷰트가 @code{False}로 설정됩니다. 이 경우, 다음 @ref{102d,,decompress()} 호출은 `data'를 @code{b'@w{'}}로 제공하여 더 많은 출력을 얻을 수 있습니다.

모든 입력 데이터가 압축 해제되어 반환되면 (이것이 `max_length' 바이트 미만이거나 `max_length'가 음수이기 때문에), @ref{2eaf,,needs_input} 어트리뷰트는 @code{True}로 설정됩니다.

스트림 끝에 도달한 후 데이터 압축 해제를 시도하면 @ref{14de,,EOFError}가 발생합니다. 스트림 끝 이후에 발견되는 모든 데이터는 무시되고 @ref{2eb0,,unused_data} 어트리뷰트에 저장됩니다.


버전 3.5에서 변경: `max_length' 매개 변수를 추가했습니다.

@end deffn

@geindex check (lzma.LZMADecompressor의 속성)
@anchor{library/lzma lzma LZMADecompressor check}@anchor{2eb1}
@deffn {속성} check

입력 스트림이 사용하는 무결성 검사의 ID. 사용되는 무결성 검사를 결정하기 위해 충분한 입력이 디코딩될 때까지 @code{CHECK_UNKNOWN}일 수 있습니다.
@end deffn

@geindex eof (lzma.LZMADecompressor의 속성)
@anchor{library/lzma lzma LZMADecompressor eof}@anchor{2eb2}
@deffn {속성} eof

스트림 끝 마커에 도달하면 @code{True}.
@end deffn

@geindex unused_data (lzma.LZMADecompressor의 속성)
@anchor{library/lzma lzma LZMADecompressor unused_data}@anchor{2eb0}
@deffn {속성} unused_data

압축된 스트림이 끝난 후 발견된 데이터.

스트림의 끝에 도달하기 전에, 이것은 @code{b""}입니다.
@end deffn

@geindex needs_input (lzma.LZMADecompressor의 속성)
@anchor{library/lzma lzma LZMADecompressor needs_input}@anchor{2eaf}
@deffn {속성} needs_input

@ref{102d,,decompress()} 메서드가 새로운 압축 입력을 요구하기 전에 더 많은 압축 해제된 데이터를 제공 할 수 있으면 @code{False}.


Added in version 3.5.

@end deffn
@end deffn

@geindex compress() (lzma 모듈)
@anchor{library/lzma lzma compress}@anchor{2eaa}
@deffn {함수} lzma.compress (data, format=FORMAT_XZ, check=-1, preset=None, filters=None)

`data'(@ref{192,,bytes} 객체)를 압축하여, 압축된 데이터를 @code{bytes} 객체로 반환합니다.

`format', `check', `preset' 및 `filters' 인자에 대한 설명은 위의 @ref{1acb,,LZMACompressor}를 참조하십시오.
@end deffn

@geindex decompress() (lzma 모듈)
@anchor{library/lzma lzma decompress}@anchor{2eae}
@deffn {함수} lzma.decompress (data, format=FORMAT_AUTO, memlimit=None, filters=None)

`data'(@ref{192,,bytes} 객체)를 압축 해제하여, 압축되지 않은 데이터를 @code{bytes} 객체로 반환합니다.

`data'가 여러 개의 개별 압축 스트림의 연결이면, 이러한 스트림들을 모두 압축 해제하고 결과를 이어붙여 반환합니다.

`format', `memlimit' 및 `filters' 인자에 대한 설명은 위의 @ref{1ac9,,LZMADecompressor}를 참조하십시오.
@end deffn

@node 기타,사용자 정의 필터 체인 지정,메모리에서의 데이터 압축과 압축 해제,lzma — LZMA 알고리즘을 사용한 압축
@anchor{library/lzma miscellaneous}@anchor{2eb3}
@subsubsection 기타


@geindex is_check_supported() (lzma 모듈)
@anchor{library/lzma lzma is_check_supported}@anchor{2eb4}
@deffn {함수} lzma.is_check_supported (check)

주어진 무결성 검사가 이 시스템에서 지원되면 @code{True}를 반환합니다.

@code{CHECK_NONE}과 @code{CHECK_CRC32}는 항상 지원됩니다. 제한된 기능 집합으로 컴파일된 @code{liblzma} 버전을 사용하는 경우 @code{CHECK_CRC64}와 @code{CHECK_SHA256}을 사용하지 못할 수 있습니다.
@end deffn

@node 사용자 정의 필터 체인 지정,예<4>,기타,lzma — LZMA 알고리즘을 사용한 압축
@anchor{library/lzma filter-chain-specs}@anchor{2eab}@anchor{library/lzma specifying-custom-filter-chains}@anchor{2eb5}
@subsubsection 사용자 정의 필터 체인 지정


필터 체인 지정자는 딕셔너리의 시퀀스로, 각 딕셔너리에는 단일 필터의 ID와 옵션이 포함됩니다. 각 딕셔너리는 키 @code{"id"}를 포함해야 하며, 필터 종속 옵션을 지정하기 위해 추가 키를 포함할 수 있습니다. 유효한 필터 ID는 다음과 같습니다:


@itemize *

@item 
압축 필터:


@itemize *

@item 
@code{FILTER_LZMA1} (@code{FORMAT_ALONE}과 함께 사용)

@item 
@code{FILTER_LZMA2} (@code{FORMAT_XZ} 및 @code{FORMAT_RAW}와 함께 사용)
@end itemize

@item 
델타 필터:


@itemize *

@item 
@code{FILTER_DELTA}
@end itemize

@item 
Branch-Call-Jump (BCJ) 필터:


@itemize *

@item 
@code{FILTER_X86}

@item 
@code{FILTER_IA64}

@item 
@code{FILTER_ARM}

@item 
@code{FILTER_ARMTHUMB}

@item 
@code{FILTER_POWERPC}

@item 
@code{FILTER_SPARC}
@end itemize
@end itemize

필터 체인은 최대 4개의 필터로 구성될 수 있으며, 비워 둘 수 없습니다. 체인의 마지막 필터는 압축 필터여야 하고, 다른 필터는 델타나 BCJ 필터여야 합니다.

압축 필터는 다음 옵션을 지원합니다 (필터를 나타내는 딕셔너리에 추가 항목으로 지정됩니다):


@itemize *

@item 
@code{preset}: 명시적으로 지정되지 않은 옵션의 기본값 소스로 사용할 압축 사전 설정.

@item 
@code{dict_size}: 바이트로 표현한 딕셔너리 크기. 4 KiB와 1.5 GiB 사이여야 합니다 (경계 포함).

@item 
@code{lc}: 리터럴 컨텍스트 비트 수.

@item 
@code{lp}: 리터럴 위치 비트 수. 합계 @code{lc + lp}는 최대 4여야 합니다.

@item 
@code{pb}: 위치 비트 수; 최대 4여야 합니다.

@item 
@code{mode}: @code{MODE_FAST}나 @code{MODE_NORMAL}.

@item 
@code{nice_len}: 매치에서 “좋은 길이”로 간주하는 것. 273 이하여야 합니다.

@item 
@code{mf}: 사용할 매치 파인더 – @code{MF_HC3}, @code{MF_HC4}, @code{MF_BT2}, @code{MF_BT3} 또는 @code{MF_BT4}.

@item 
@code{depth}: 매치 파인더가 사용하는 최대 검색 깊이. 0(기본값)은 다른 필터 옵션을 기반으로 자동 선택함을 의미합니다.
@end itemize

델타 필터는 바이트 간 차이를 저장하여, 특정 상황에서 압축기에 대해 더 반복적인 입력을 생성합니다. 한 가지 옵션을 지원합니다, @code{dist}. 이것은 빼야 할 바이트 간의 거리를 나타냅니다. 기본값은 1입니다. 즉, 인접 바이트 간 차이를 취합니다.

BCJ 필터는 기계 코드에 적용하려는 것입니다. 이들은 압축기가 이용할 수 있는 중복성을 높이기 위해 코드에서 상대 분기, 호출 및 점프를 절대 주소 지정을 사용하도록 변환합니다. 이 필터는 한 가지 옵션을 지원합니다, @code{start_offset}. 이것은 입력 데이터의 시작 부분으로 매핑되어야 하는 주소를 지정합니다. 기본값은 0입니다.

@node 예<4>,,사용자 정의 필터 체인 지정,lzma — LZMA 알고리즘을 사용한 압축
@anchor{library/lzma examples}@anchor{2eb6}
@subsubsection 예


압축 파일 읽기:

@example
import lzma
with lzma.open("file.xz") as f:
    file_content = f.read()
@end example

압축 파일 만들기:

@example
import lzma
data = b"Insert Data Here"
with lzma.open("file.xz", "w") as f:
    f.write(data)
@end example

메모리에서 데이터 압축하기:

@example
import lzma
data_in = b"Insert Data Here"
data_out = lzma.compress(data_in)
@end example

증분 압축:

@example
import lzma
lzc = lzma.LZMACompressor()
out1 = lzc.compress(b"Some data\n")
out2 = lzc.compress(b"Another piece of data\n")
out3 = lzc.compress(b"Even more data\n")
out4 = lzc.flush()
# 모든 부분 결과를 이어 붙입니다:
result = b"".join([out1, out2, out3, out4])
@end example

이미 열린 파일에 압축된 데이터 쓰기:

@example
import lzma
with open("file.xz", "wb") as f:
    f.write(b"This data will not be compressed\n")
    with lzma.open(f, "w") as lzf:
        lzf.write(b"This *will* be compressed\n")
    f.write(b"Not compressed\n")
@end example

사용자 정의 필터 체인을 사용하여 압축 파일 만들기:

@example
import lzma
my_filters = [
    @{"id": lzma.FILTER_DELTA, "dist": 5@},
    @{"id": lzma.FILTER_LZMA2, "preset": 7 | lzma.PRESET_EXTREME@},
]
with lzma.open("file.xz", "w", filters=my_filters) as f:
    f.write(b"blah blah blah")
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node zipfile — ZIP 아카이브 작업,tarfile — tar 아카이브 파일 읽기와 쓰기,lzma — LZMA 알고리즘을 사용한 압축,데이터 압축 및 보관
@anchor{library/zipfile doc}@anchor{2eb7}@anchor{library/zipfile module-zipfile}@anchor{137}@anchor{library/zipfile translation-repo}@anchor{2eb8}@anchor{library/zipfile zipfile-work-with-zip-archives}@anchor{2eb9}
@subsection @code{zipfile} — ZIP 아카이브 작업


@geindex module; zipfile

`소스 코드:' Lib/zipfile/@footnote{https://github.com/python/cpython/tree/3.14/Lib/zipfile/}


__________________________________________________________________


ZIP 파일 형식은 흔히 쓰이는 아카이브와 압축 표준입니다. 이 모듈은 ZIP 파일을 만들고, 읽고, 쓰고, 추가하고, 나열하는 도구를 제공합니다. 이 모듈의 고급 사용을 위해서는 PKZIP Application Note@footnote{https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT}에 정의된 형식의 이해가 필요합니다.

This module does not handle multipart ZIP files.
It can handle ZIP files that use the ZIP64 extensions
(that is ZIP files that are more than 4 GiB in size).  It supports
decryption of encrypted files in ZIP archives, but it cannot
create an encrypted file.  Decryption is extremely slow as it is
implemented in native Python rather than C.

@c The following paragraph should be similar to ../includes/optional-module.rst

Handling compressed archives requires @ref{2157,,optional modules}
such as @ref{139,,zlib}, @ref{14,,bz2}, @ref{8e,,lzma}, and @ref{23,,compression.zstd}.
If any of them are missing from your copy of CPython,
look for documentation from your distributor (that is,
whoever provided Python to you).
If you are the distributor, see @ref{2155,,Requirements for optional modules}.

이 모듈은 다음 항목을 정의합니다:

@geindex BadZipFile
@anchor{library/zipfile zipfile BadZipFile}@anchor{1b66}
@deffn {예외} zipfile.BadZipFile

잘못된 ZIP 파일로 인해 발생하는 에러.


Added in version 3.2.

@end deffn

@geindex BadZipfile
@anchor{library/zipfile zipfile BadZipfile}@anchor{2eba}
@deffn {예외} zipfile.BadZipfile

이전 파이썬 버전과의 호환성을 위한, @ref{1b66,,BadZipFile}의 별칭.


버전 3.2부터 폐지됨.

@end deffn

@geindex LargeZipFile
@anchor{library/zipfile zipfile LargeZipFile}@anchor{2ebb}
@deffn {예외} zipfile.LargeZipFile

ZIP 파일에 ZIP64 기능이 필요하지만 활성화되지 않았을 때 발생하는 에러.
@end deffn


@deffn {클래스} zipfile.ZipFile

ZIP 파일을 읽고 쓰는 클래스. 생성자 세부 사항은 @ref{2ebc,,ZipFile objects} 섹션을 참조하십시오.
@end deffn


@deffn {클래스} zipfile.Path

Class that implements a subset of the interface provided by
@ref{266,,pathlib.Path}, including the full
@ref{2fa,,importlib.resources.abc.Traversable} interface.


Added in version 3.8.

@end deffn


@deffn {클래스} zipfile.PyZipFile

파이썬 라이브러리를 포함하는 ZIP 아카이브를 만들기 위한 클래스.
@end deffn

@geindex ZipInfo (zipfile 클래스)
@anchor{library/zipfile zipfile ZipInfo}@anchor{2cb}
@deffn {클래스} zipfile.ZipInfo (filename='NoName', date_time=(1980, 1, 1, 0, 0, 0))

Class used to represent information about a member of an archive. Instances
of this class are returned by the @ref{2ebd,,getinfo()} and @ref{2ebe,,infolist()}
methods of @ref{8d2,,ZipFile} objects.  Most users of the @code{zipfile} module
will not need to create these, but only use those created by this
module. `filename' should be the full name of the archive member, and
`date_time' should be a tuple containing six fields which describe the time
of the last modification to the file; the fields are described in section
@ref{2ebf,,ZipInfo objects}.


버전 3.13에서 변경: A public @code{compress_level} attribute has been added to expose the
formerly protected @code{_compresslevel}.  The older protected name
continues to work as a property for backwards compatibility.


@geindex _for_archive() (zipfile.ZipInfo 메서드)
@anchor{library/zipfile zipfile ZipInfo _for_archive}@anchor{2ca}
@deffn {메서드} _for_archive (archive)

Resolve the date_time, compression attributes, and external attributes
to suitable defaults as used by @ref{2cc,,ZipFile.writestr()}.

Returns self for chaining.


Added in version 3.14.

@end deffn
@end deffn

@geindex is_zipfile() (zipfile 모듈)
@anchor{library/zipfile zipfile is_zipfile}@anchor{152f}
@deffn {함수} zipfile.is_zipfile (filename)

`filename'이 매직 번호에 기반하여 유효한 ZIP 파일이면 @code{True}를, 그렇지 않으면 @code{False}를 반환합니다. `filename'은 파일이거나 파일류 객체일 수도 있습니다.


버전 3.1에서 변경: 파일과 파일류 객체를 지원합니다.

@end deffn

@geindex ZIP_STORED (zipfile 모듈)
@anchor{library/zipfile zipfile ZIP_STORED}@anchor{2ec0}
@deffn {데이터} zipfile.ZIP_STORED

압축되지 않은 아카이브 멤버를 위한 숫자 상수.
@end deffn

@geindex ZIP_DEFLATED (zipfile 모듈)
@anchor{library/zipfile zipfile ZIP_DEFLATED}@anchor{2ec1}
@deffn {데이터} zipfile.ZIP_DEFLATED

일반적인 ZIP 압축 방법을 위한 숫자 상수. @ref{139,,zlib} 모듈이 필요합니다.
@end deffn

@geindex ZIP_BZIP2 (zipfile 모듈)
@anchor{library/zipfile zipfile ZIP_BZIP2}@anchor{2ec2}
@deffn {데이터} zipfile.ZIP_BZIP2

BZIP2 압축 방법을 위한 숫자 상수. @ref{14,,bz2} 모듈이 필요합니다.


Added in version 3.3.

@end deffn

@geindex ZIP_LZMA (zipfile 모듈)
@anchor{library/zipfile zipfile ZIP_LZMA}@anchor{2ec3}
@deffn {데이터} zipfile.ZIP_LZMA

LZMA 압축 방법을 위한 숫자 상수. @ref{8e,,lzma} 모듈이 필요합니다.


Added in version 3.3.

@end deffn

@geindex ZIP_ZSTANDARD (zipfile 모듈)
@anchor{library/zipfile zipfile ZIP_ZSTANDARD}@anchor{2ec4}
@deffn {데이터} zipfile.ZIP_ZSTANDARD

The numeric constant for Zstandard compression. This requires the
@ref{23,,compression.zstd} module.

@cartouche
@quotation 참고 
In APPNOTE 6.3.7, the method ID @code{20} was assigned to Zstandard
compression. This was changed in APPNOTE 6.3.8 to method ID @code{93} to
avoid conflicts, with method ID @code{20} being deprecated. For
compatibility, the @code{zipfile} module reads both method IDs but will
only write data with method ID @code{93}.
@end quotation
@end cartouche


Added in version 3.14.

@end deffn

@cartouche
@quotation 참고 
The ZIP file format specification has included support for bzip2 compression
since 2001, for LZMA compression since 2006, and Zstandard compression since
2020. However, some tools (including older Python releases) do not support
these compression methods, and may either refuse to process the ZIP file
altogether, or fail to extract individual files.
@end quotation
@end cartouche


@subsubheading 더 보기



@table @asis

@item PKZIP Application Note@footnote{https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT}

사용된 형식과 알고리즘의 저자인 Phil Katz의 ZIP 파일 형식에 대한 설명서.

@item Info-ZIP 홈페이지@footnote{https://infozip.sourceforge.net/}

Info-ZIP 프로젝트의 ZIP 아카이브 프로그램과 개발 라이브러리에 관한 정보.
@end table


@menu
* ZipFile objects:: 
* Path objects:: 
* PyZipFile objects:: 
* ZipInfo objects:: 
* Command-line interface: Command-line interface<4>. 
* 압축 해제 함정:: 

@end menu

@node ZipFile objects,Path objects,,zipfile — ZIP 아카이브 작업
@anchor{library/zipfile id1}@anchor{2ec5}@anchor{library/zipfile zipfile-objects}@anchor{2ebc}
@subsubsection ZipFile objects


@geindex ZipFile (zipfile 클래스)
@anchor{library/zipfile zipfile ZipFile}@anchor{8d2}
@deffn {클래스} zipfile.ZipFile (file, mode='r', compression=ZIP_STORED, allowZip64=True, compresslevel=None, *, strict_timestamps=True, metadata_encoding=None)

ZIP 파일을 엽니다, 여기서 `file'은 파일에 대한 경로 (문자열), 파일류 객체 또는 @ref{5a0,,경로류 객체}일 수 있습니다.

`mode' 매개 변수는 기존 파일을 읽으려면 @code{'r'}, 새 파일을 자르고 쓰려면 @code{'w'}, 기존 파일에 추가하려면 @code{'a'}, 새 파일을 독점적으로 작성하고 쓰려면 @code{'x'} 이어야 합니다. `mode'가 @code{'x'}이고 `file'이 기존 파일을 참조하면, @ref{121f,,FileExistsError} 가 발생합니다. `mode'가 @code{'a'}이고 `file'이 기존 ZIP 파일을 참조하면, 추가 파일이 이곳으로 추가됩니다. `file'이 ZIP 파일을 참조하지 않으면, 새 ZIP 아카이브를 파일에 덧붙입니다(append). 이는 ZIP 아카이브를 다른 파일(가령 @code{python.exe})에 추가하기 위한 것입니다. `mode'가 @code{'a'}이고 파일이 아예 존재하지 않으면, 파일이 만들어집니다. `mode'가 @code{'r'}이나 @code{'a'}이면, 파일은 탐색 가능(seekable)해야 합니다.

`compression' is the ZIP compression method to use when writing the archive,
and should be @ref{2ec0,,ZIP_STORED}, @ref{2ec1,,ZIP_DEFLATED},
@ref{2ec2,,ZIP_BZIP2}, @ref{2ec3,,ZIP_LZMA}, or @ref{2ec4,,ZIP_ZSTANDARD};
unrecognized values will cause @ref{36b,,NotImplementedError} to be raised.  If
@code{ZIP_DEFLATED}, @code{ZIP_BZIP2}, @code{ZIP_LZMA}, or
@code{ZIP_ZSTANDARD} is specified but the corresponding module
(@ref{139,,zlib}, @ref{14,,bz2}, @ref{8e,,lzma}, or @ref{23,,compression.zstd}) is not
available, @ref{244,,RuntimeError} is raised. The default is @code{ZIP_STORED}.

If `allowZip64' is @code{True} (the default) zipfile will create ZIP files that
use the ZIP64 extensions when the zipfile is larger than 4 GiB. If it is
@code{false} @code{zipfile} will raise an exception when the ZIP file would
require ZIP64 extensions.

The `compresslevel' parameter controls the compression level to use when
writing files to the archive.
When using @ref{2ec0,,ZIP_STORED} or @ref{2ec3,,ZIP_LZMA} it has no effect.
When using @ref{2ec1,,ZIP_DEFLATED} integers @code{0} through @code{9} are accepted
(see @ref{2e5a,,zlib} for more information).
When using @ref{2ec2,,ZIP_BZIP2} integers @code{1} through @code{9} are accepted
(see @ref{a66,,bz2} for more information).
When using @ref{2ec4,,ZIP_ZSTANDARD} integers @code{-131072} through @code{22} are
commonly accepted (see
@ref{2e18,,CompressionParameter.compression_level}
for more on retrieving valid values and their meaning).

`strict_timestamps' 인자를 @code{False}로 설정하면, 1980-01-01 이전의 zip 파일을 허용하는 대신 타임 스탬프를 1980-01-01로 설정합니다. 2107-12-31 이후의 파일에 대해서도 비슷한 동작이 발생하며, 타임 스탬프는 역시 한곗값으로 설정됩니다.

When mode is @code{'r'}, `metadata_encoding' may be set to the name of a codec,
which will be used to decode metadata such as the names of members and ZIP
comments.

파일이 @code{'w'}, @code{'x'} 또는 @code{'a'} 모드로 만들어졌고 아카이브에 아무런 파일도 추가하지 않고 @ref{2ec6,,닫히면}, 비어있는 아카이브에 적합한 ZIP 구조가 파일에 기록됩니다.

ZipFile은 또한 컨텍스트 관리자이므로 @ref{186,,with} 문을 지원합니다. 이 예에서, `myzip'은 @code{with} 문 스위트가 완료된 후에 닫힙니다 – 예외가 발생할 때조차 그렇습니다:

@example
with ZipFile('spam.zip', 'w') as myzip:
    myzip.write('eggs.txt')
@end example

@cartouche
@quotation 참고 
`metadata_encoding' is an instance-wide setting for the ZipFile.
It is not possible to set this on a per-member basis.

This attribute is a workaround for legacy implementations which produce
archives with names in the current locale encoding or code page (mostly
on Windows).  According to the .ZIP standard, the encoding of metadata
may be specified to be either IBM code page (default) or UTF-8 by a flag
in the archive header.
That flag takes precedence over `metadata_encoding', which is
a Python-specific extension.
@end quotation
@end cartouche


버전 3.2에서 변경: @ref{8d2,,ZipFile}을 컨텍스트 관리자로 사용하는 기능이 추가되었습니다.



버전 3.3에서 변경: @ref{14,,bzip2}와 @ref{8e,,lzma} 압축에 대한 지원이 추가되었습니다.



버전 3.4에서 변경: ZIP64 확장은 기본적으로 활성화됩니다.



버전 3.5에서 변경: 탐색할 수 없는(unseekable) 스트림으로의 쓰기 지원을 추가했습니다. @code{'x'} 모드에 대한 지원이 추가되었습니다.



버전 3.6에서 변경: 이전에는, 인식할 수 없는 compression 값에 대해 평범한 @ref{244,,RuntimeError}가 발생했습니다.



버전 3.6.2에서 변경: `file' 매개 변수는 @ref{5a0,,경로류 객체}를 받아들입니다.



버전 3.7에서 변경: `compresslevel' 매개 변수를 추가했습니다.



버전 3.8에서 변경: `strict_timestamps' 키워드 전용 매개 변수



버전 3.11에서 변경: Added support for specifying member name encoding for reading
metadata in the zipfile’s directory and file headers.

@end deffn

@geindex close() (zipfile.ZipFile 메서드)
@anchor{library/zipfile zipfile ZipFile close}@anchor{2ec6}
@deffn {메서드} ZipFile.close ()

아카이브 파일을 닫습니다. 프로그램을 종료하기 전에 @ref{2ec6,,close()}를 호출해야 합니다. 그렇지 않으면 필수 레코드가 기록되지 않습니다.
@end deffn

@geindex getinfo() (zipfile.ZipFile 메서드)
@anchor{library/zipfile zipfile ZipFile getinfo}@anchor{2ebd}
@deffn {메서드} ZipFile.getinfo (name)

아카이브 멤버 `name'에 관한 정보가 있는 @ref{2cb,,ZipInfo} 객체를 반환합니다. 현재 아카이브에 포함되지 않은 이름에 대해 @ref{2ebd,,getinfo()}를 호출하면 @ref{5e5,,KeyError}가 발생합니다.
@end deffn

@geindex infolist() (zipfile.ZipFile 메서드)
@anchor{library/zipfile zipfile ZipFile infolist}@anchor{2ebe}
@deffn {메서드} ZipFile.infolist ()

아카이브의 각 멤버에 대한 @ref{2cb,,ZipInfo} 객체를 포함하는 리스트를 반환합니다. 기존 아카이브가 열린 경우 객체는 디스크의 실제 ZIP 파일에 있는 항목과 순서가 같습니다.
@end deffn

@geindex namelist() (zipfile.ZipFile 메서드)
@anchor{library/zipfile zipfile ZipFile namelist}@anchor{2ec7}
@deffn {메서드} ZipFile.namelist ()

아카이브 멤버의 리스트를 이름으로 반환합니다.
@end deffn

@geindex open() (zipfile.ZipFile 메서드)
@anchor{library/zipfile zipfile ZipFile open}@anchor{65b}
@deffn {메서드} ZipFile.open (name, mode='r', pwd=None, *, force_zip64=False)

아카이브 멤버를 바이너리 파일류 객체로 액세스합니다. `name'은 아카이브 내의 파일 이름이거나 @ref{2cb,,ZipInfo} 객체일 수 있습니다. 포함될 때 `mode' 매개 변수는 @code{'r'}(기본값)이거나 @code{'w'} 이어야 합니다. `pwd'는 암호화된 ZIP 파일을 해독하는 데 사용되는 @ref{192,,bytes} 객체인 비밀번호입니다.

@ref{65b,,open()}은 컨텍스트 관리자이기도 하므로 @ref{186,,with} 문을 지원합니다:

@example
with ZipFile('spam.zip') as myzip:
    with myzip.open('eggs.txt') as myfile:
        print(myfile.read())
@end example

`mode' @code{'r'}에서 파일류 객체(@code{ZipExtFile})는 읽기 전용이며 다음 메서드를 제공합니다: @ref{152d,,read()}, @ref{152e,,readline()}, @ref{27c5,,readlines()}, @ref{1491,,seek()}, @ref{15b1,,tell()}, @ref{20a8,,__iter__()}, @ref{14d2,,__next__()}. 이러한 객체는 ZipFile과 독립적으로 작동할 수 있습니다.

@code{mode='w'}에서, @ref{ed6,,write()} 메서드를 지원하는 쓰기 가능한 파일 핸들이 반환됩니다. 쓰기 가능한 파일 핸들이 열려있는 동안, ZIP 파일에서 다른 파일을 읽거나 쓰려고 시도하면 @ref{2ec,,ValueError}가 발생합니다.

In both cases the file-like object has also attributes @code{name},
which is equivalent to the name of a file within the archive, and
@code{mode}, which is @code{'rb'} or @code{'wb'} depending on the input mode.

파일을 기록할 때, 파일 크기를 미리 알 수 없지만 2GiB를 초과할 수 있으면, 헤더 형식이 큰 파일을 지원할 수 있도록 @code{force_zip64=True}를 전달하십시오. 파일 크기가 미리 알려졌으면, @ref{2ec8,,file_size}가 설정된 @ref{2cb,,ZipInfo} 객체를 구성하고, 이를 `name' 매개 변수로 사용하십시오.

@cartouche
@quotation 참고 
@ref{65b,,open()}, @ref{2ec9,,read()} 및 @ref{2eca,,extract()} 메서드는 파일명이나 @ref{2cb,,ZipInfo} 객체를 취할 수 있습니다. 중복 이름을 가진 멤버가 포함된 ZIP 파일을 읽으려고 할 때 이 점에 감사할 것입니다.
@end quotation
@end cartouche


버전 3.6에서 변경: @code{mode='U'} 지원이 제거되었습니다. @ref{f34,,유니버설 줄 넘김} 모드로 압축된 텍스트 파일을 읽으려면 @ref{9be,,io.TextIOWrapper}를 사용하십시오.



버전 3.6에서 변경: 이제 @ref{65b,,ZipFile.open()}은 이제 @code{mode='w'} 옵션으로 파일을 아카이브에 기록하는 데 사용될 수 있습니다.



버전 3.6에서 변경: 닫힌 ZipFile에 @ref{65b,,open()}을 호출하면 @ref{2ec,,ValueError}가 발생합니다. 이전에는, @ref{244,,RuntimeError}가 발생했습니다.



버전 3.13에서 변경: Added attributes @code{name} and @code{mode} for the writeable
file-like object.
The value of the @code{mode} attribute for the readable file-like
object was changed from @code{'r'} to @code{'rb'}.

@end deffn

@geindex extract() (zipfile.ZipFile 메서드)
@anchor{library/zipfile zipfile ZipFile extract}@anchor{2eca}
@deffn {메서드} ZipFile.extract (member, path=None, pwd=None)

아카이브에서 현재 작업 디렉터리로 멤버를 추출합니다. `member'는 전체 이름이거나 @ref{2cb,,ZipInfo} 객체여야 합니다. 파일 정보는 최대한 정확하게 추출됩니다. `path'는 추출할 다른 디렉터리를 지정합니다. `member'는 파일 이름이나 @code{ZipInfo} 객체일 수 있습니다. `pwd'는 암호화된 파일에 사용되는 @ref{192,,bytes} 객체인 비밀번호입니다.

만들어진 정규화된 경로(디렉터리나 새 파일)를 반환합니다.

@cartouche
@quotation 참고 
멤버 파일명이 절대 경로이면, 드라이브/UNC 공유 지점(sharepoint)과 선행 (역) 슬래시가 제거됩니다, 예를 들어: @code{///foo/bar}는 유닉스에서 @code{foo/bar}가 되고, 윈도우에서 @code{C:\foo\bar}는 @code{foo\bar}가 됩니다. 그리고 멤버 파일명의 모든 @code{".."} 구성 요소가 제거됩니다, 예를 들어: @code{../../foo../../ba..r}은 @code{foo../ba..r}이 됩니다. 윈도우에서 잘못된 문자(@code{:}, @code{<}, @code{>}, @code{|}, @code{"}, @code{?} 및 @code{*})는 밑줄(@code{_})로 대체됩니다.
@end quotation
@end cartouche


버전 3.6에서 변경: 닫힌 ZipFile에서 @ref{2eca,,extract()}를 호출하면 @ref{2ec,,ValueError}가 발생합니다. 이전에는 @ref{244,,RuntimeError}가 발생했습니다.



버전 3.6.2에서 변경: `path' 매개 변수는 @ref{5a0,,경로류 객체}를 받아들입니다.

@end deffn

@geindex extractall() (zipfile.ZipFile 메서드)
@anchor{library/zipfile zipfile ZipFile extractall}@anchor{2ecb}
@deffn {메서드} ZipFile.extractall (path=None, members=None, pwd=None)

아카이브에서 현재 작업 디렉터리로 모든 멤버를 추출합니다. `path'는 추출할 다른 디렉터리를 지정합니다. `members'는 선택적이며 @ref{2ec7,,namelist()}가 반환한 리스트의 부분 집합이어야 합니다. `pwd'는 암호화된 파일에 사용되는 @ref{192,,bytes} 객체인 비밀번호입니다.

@cartouche
@quotation 경고 
사전 검사 없이 신뢰할 수 없는 출처의 아카이브를 추출하지 마십시오. 파일이 `path' 밖에 만들어질 수 있습니다, 예를 들어 @code{"/"}로 시작하는 절대 파일명을 가진 멤버나 두 점 @code{".."}을 포함하는 파일명. 이 모듈은 이를 방지하려고 시도합니다. @ref{2eca,,extract()} 참고를 참조하십시오.
@end quotation
@end cartouche


버전 3.6에서 변경: 닫힌 ZipFile에서 @ref{2ecb,,extractall()}을 호출하면 @ref{2ec,,ValueError}가 발생합니다. 이전에는 @ref{244,,RuntimeError}가 발생했습니다.



버전 3.6.2에서 변경: `path' 매개 변수는 @ref{5a0,,경로류 객체}를 받아들입니다.

@end deffn

@geindex printdir() (zipfile.ZipFile 메서드)
@anchor{library/zipfile zipfile ZipFile printdir}@anchor{2ecc}
@deffn {메서드} ZipFile.printdir ()

아카이브의 목차를 @code{sys.stdout}으로 인쇄합니다.
@end deffn

@geindex setpassword() (zipfile.ZipFile 메서드)
@anchor{library/zipfile zipfile ZipFile setpassword}@anchor{2ecd}
@deffn {메서드} ZipFile.setpassword (pwd)

암호화된 파일을 추출하기 위해 `pwd'(@ref{192,,bytes} 객체)를 기본 비밀번호로 설정합니다.
@end deffn

@geindex read() (zipfile.ZipFile 메서드)
@anchor{library/zipfile zipfile ZipFile read}@anchor{2ec9}
@deffn {메서드} ZipFile.read (name, pwd=None)

Return the bytes of the file `name' in the archive.  `name' is the name of the
file in the archive, or a @ref{2cb,,ZipInfo} object.  The archive must be open for
read or append. `pwd' is the password used for encrypted files as a @ref{192,,bytes}
object and, if specified, overrides the default password set with @ref{2ecd,,setpassword()}.
Calling @ref{2ec9,,read()} on a ZipFile that uses a compression method other than
@ref{2ec0,,ZIP_STORED}, @ref{2ec1,,ZIP_DEFLATED}, @ref{2ec2,,ZIP_BZIP2},
@ref{2ec3,,ZIP_LZMA}, or @ref{2ec4,,ZIP_ZSTANDARD} will raise a
@ref{36b,,NotImplementedError}. An error will also be raised if the
corresponding compression module is not available.


버전 3.6에서 변경: 닫힌 ZipFile에서 @ref{2ec9,,read()}를 호출하면 @ref{2ec,,ValueError}가 발생합니다. 이전에는 @ref{244,,RuntimeError}가 발생했습니다.

@end deffn

@geindex testzip() (zipfile.ZipFile 메서드)
@anchor{library/zipfile zipfile ZipFile testzip}@anchor{2ece}
@deffn {메서드} ZipFile.testzip ()

아카이브의 모든 파일을 읽고 CRC와 파일 헤더를 확인합니다. 첫 번째 불량 파일의 이름을 반환하거나, @code{None}을 반환합니다.


버전 3.6에서 변경: 닫힌 ZipFile에서 @ref{2ece,,testzip()}을 호출하면 @ref{2ec,,ValueError}가 발생합니다. 이전에는 @ref{244,,RuntimeError}가 발생했습니다.

@end deffn

@geindex write() (zipfile.ZipFile 메서드)
@anchor{library/zipfile zipfile ZipFile write}@anchor{f48}
@deffn {메서드} ZipFile.write (filename, arcname=None, compress_type=None, compresslevel=None)

`filename'이라는 파일을 아카이브에 기록하고, 아카이브 이름으로 `arcname'을 지정합니다 (기본적으로, `filename'과 같지만, 드라이브 문자가 없고 선행 경로 구분 기호가 제거됩니다). 주어지면, `compress_type'은 새 항목에 대해 생성자의 `compression' 매개 변수에 제공된 값을 대체합니다. 마찬가지로, `compresslevel'은 주어지면 생성자를 대체합니다. 아카이브는 @code{'w'}, @code{'x'} 또는 @code{'a'} 모드로 열려 있어야 합니다.

@cartouche
@quotation 참고 
The ZIP file standard historically did not specify a metadata encoding,
but strongly recommended CP437 (the original IBM PC encoding) for
interoperability.  Recent versions allow use of UTF-8 (only).  In this
module, UTF-8 will automatically be used to write the member names if
they contain any non-ASCII characters.  It is not possible to write
member names in any encoding other than ASCII or UTF-8.
@end quotation
@end cartouche

@cartouche
@quotation 참고 
아카이브 이름은 아카이브 루트에 상대적이어야 합니다. 즉, 경로 구분 기호로 시작해서는 안 됩니다.
@end quotation
@end cartouche

@cartouche
@quotation 참고 
@code{arcname}(또는 @code{arcname}이 제공되지 않으면 @code{filename})에 널 바이트가 포함되어 있으면, 아카이브의 파일 이름이 널 바이트에서 잘립니다.
@end quotation
@end cartouche

@cartouche
@quotation 참고 
A leading slash in the filename may lead to the archive being impossible to
open in some zip programs on Windows systems.
@end quotation
@end cartouche


버전 3.6에서 변경: @code{'r'} 모드로 만들어진 ZipFile이나 닫힌 ZipFile에서 @ref{f48,,write()}를 호출하면 @ref{2ec,,ValueError}가 발생합니다. 이전에는 @ref{244,,RuntimeError}가 발생했습니다.

@end deffn

@geindex writestr() (zipfile.ZipFile 메서드)
@anchor{library/zipfile zipfile ZipFile writestr}@anchor{2cc}
@deffn {메서드} ZipFile.writestr (zinfo_or_arcname, data, compress_type=None, compresslevel=None)

파일을 아카이브에 기록합니다. 내용은 `data'이며, @ref{169,,str}이나 @ref{192,,bytes} 인스턴스일 수 있습니다; @code{str}이면 먼저 UTF-8로 인코딩됩니다. `zinfo_or_arcname'은 아카이브에 제공될 파일 이름이거나 @ref{2cb,,ZipInfo} 인스턴스입니다. 인스턴스이면 최소한 파일명, 날짜 및 시간을 지정해야 합니다. 이름이면, 날짜와 시간이 현재 날짜와 시간으로 설정됩니다. 아카이브는 @code{'w'}, @code{'x'} 또는 @code{'a'} 모드로 열려 있어야 합니다.

주어지면, `compress_type'은 새 항목에 대해 생성자의 `compression' 매개 변수에 제공되거나 `zinfo_or_arcname'(@ref{2cb,,ZipInfo} 인스턴스인 경우)의 값을 대체합니다. 마찬가지로, `compresslevel'은 주어지면 생성자를 대체합니다.

@cartouche
@quotation 참고 
@ref{2cb,,ZipInfo} 인스턴스를 `zinfo_or_arcname' 매개 변수로 전달할 때, 사용되는 압축 방법은 주어진 @code{ZipInfo} 인스턴스의 `compress_type' 멤버에 지정된 압축 방법입니다. 기본적으로, @code{ZipInfo} 생성자는 이 멤버를 @ref{2ec0,,ZIP_STORED}로 설정합니다.
@end quotation
@end cartouche


버전 3.2에서 변경: `compress_type' 인자.



버전 3.6에서 변경: @code{'r'} 모드로 만들어진 ZipFile이나 닫힌 ZipFile에서 @ref{2cc,,writestr()}을 호출하면, @ref{2ec,,ValueError}가 발생합니다. 이전에는 @ref{244,,RuntimeError}가 발생했습니다.



버전 3.14에서 변경: Now respects the 
@geindex SOURCE_DATE_EPOCH
@geindex 환경 변수; SOURCE_DATE_EPOCH
@code{SOURCE_DATE_EPOCH} environment variable.
If set, it uses this value as the modification timestamp for the file
written into the ZIP archive, instead of using the current time.

@end deffn

@geindex mkdir() (zipfile.ZipFile 메서드)
@anchor{library/zipfile zipfile ZipFile mkdir}@anchor{8d3}
@deffn {메서드} ZipFile.mkdir (zinfo_or_directory, mode=511)

Create a directory inside the archive.  If `zinfo_or_directory' is a string,
a directory is created inside the archive with the mode that is specified in
the `mode' argument. If, however, `zinfo_or_directory' is
a @ref{2cb,,ZipInfo} instance then the `mode' argument is ignored.

The archive must be opened with mode @code{'w'}, @code{'x'} or @code{'a'}.


Added in version 3.11.

@end deffn

다음과 같은 데이터 어트리뷰트도 사용할 수 있습니다:

@geindex filename (zipfile.ZipFile의 속성)
@anchor{library/zipfile zipfile ZipFile filename}@anchor{2ecf}
@deffn {속성} ZipFile.filename

ZIP 파일의 이름.
@end deffn

@geindex debug (zipfile.ZipFile의 속성)
@anchor{library/zipfile zipfile ZipFile debug}@anchor{2ed0}
@deffn {속성} ZipFile.debug

사용할 디버그 출력 수준. 이것은 @code{0}(기본값, 출력 없음)에서 @code{3}(가장 많은 출력)으로 설정될 수 있습니다. 디버깅 정보는 @code{sys.stdout}에 기록됩니다.
@end deffn

@geindex comment (zipfile.ZipFile의 속성)
@anchor{library/zipfile zipfile ZipFile comment}@anchor{2ed1}
@deffn {속성} ZipFile.comment

ZIP 파일에 연관되는 주석은 @ref{192,,bytes} 객체입니다. @code{'w'}, @code{'x'} 또는 @code{'a'} 모드로 만들어진 @ref{8d2,,ZipFile} 인스턴스에 주석을 대입하면, 65535바이트를 넘지 않아야 합니다. 이보다 긴 주석은 잘립니다.
@end deffn

@node Path objects,PyZipFile objects,ZipFile objects,zipfile — ZIP 아카이브 작업
@anchor{library/zipfile id2}@anchor{2ed2}@anchor{library/zipfile path-objects}@anchor{2ed3}
@subsubsection Path objects


@geindex Path (zipfile 클래스)
@anchor{library/zipfile zipfile Path}@anchor{8d7}
@deffn {클래스} zipfile.Path (root, at='@w{'})

@code{root} zip 파일(@ref{8d2,,ZipFile} 생성자에 전달하기에 적합한 @code{ZipFile} 인스턴스나 @code{file}일 수 있습니다)에서 Path 객체를 생성합니다.

@code{at}은 zip 파일 내에서 이 Path의 위치를 지정합니다, 예를 들어 ‘dir/file.txt’, ‘dir/’ 또는 ‘’. 기본값은 빈 문자열이며, 루트를 나타냅니다.

@cartouche
@quotation 참고 
The @code{Path} class does not sanitize filenames within the ZIP archive. Unlike
the @ref{2eca,,ZipFile.extract()} and @ref{2ecb,,ZipFile.extractall()} methods, it is the
caller’s responsibility to validate or sanitize filenames to prevent path traversal
vulnerabilities (e.g., filenames containing “..” or absolute paths). When handling
untrusted archives, consider resolving filenames using @ref{151f,,os.path.abspath()}
and checking against the target directory with @ref{103c,,os.path.commonpath()}.
@end quotation
@end cartouche
@end deffn

Path 객체는 @ref{266,,pathlib.Path} 객체의 다음 기능을 노출합니다:

@code{/} 연산자나 @code{joinpath}를 사용하여 Path 객체를 순회할 수 있습니다.

@geindex name (zipfile.Path의 속성)
@anchor{library/zipfile zipfile Path name}@anchor{2ed4}
@deffn {속성} Path.name

최종 경로 구성 요소.
@end deffn

@geindex open() (zipfile.Path 메서드)
@anchor{library/zipfile zipfile Path open}@anchor{1908}
@deffn {메서드} Path.open (mode='r', *, pwd, **)

현재 경로에서 @ref{65b,,ZipFile.open()}을 호출합니다. 지원되는 모드를 통해 읽기 또는 쓰기, 텍스트 또는 바이너리로 여는 것을 허락합니다: ‘r’, ‘w’, ‘rb’, ‘wb’. 위치와 키워드 인자는 텍스트로 열 때 @ref{9be,,io.TextIOWrapper}로 전달되고 그렇지 않으면 무시됩니다. @code{pwd}는 @code{ZipFile.open()}에 대한 @code{pwd} 매개 변수입니다.


버전 3.9에서 변경: open에 텍스트와 바이너리 모드에 대한 지원이 추가되었습니다. 기본 모드는 이제 텍스트입니다.



버전 3.11.2에서 변경: The @code{encoding} parameter can be supplied as a positional argument
without causing a @ref{198,,TypeError}. As it could in 3.9. Code needing to
be compatible with unpatched 3.10 and 3.11 versions must pass all
@ref{9be,,io.TextIOWrapper} arguments, @code{encoding} included, as keywords.

@end deffn

@geindex iterdir() (zipfile.Path 메서드)
@anchor{library/zipfile zipfile Path iterdir}@anchor{2ed5}
@deffn {메서드} Path.iterdir ()

현재 디렉터리의 자식을 열거합니다.
@end deffn

@geindex is_dir() (zipfile.Path 메서드)
@anchor{library/zipfile zipfile Path is_dir}@anchor{2ed6}
@deffn {메서드} Path.is_dir ()

현재 컨텍스트가 디렉터리를 참조하면 @code{True}를 반환합니다.
@end deffn

@geindex is_file() (zipfile.Path 메서드)
@anchor{library/zipfile zipfile Path is_file}@anchor{2ed7}
@deffn {메서드} Path.is_file ()

현재 컨텍스트가 파일을 참조하면 @code{True}를 반환합니다.
@end deffn

@geindex is_symlink() (zipfile.Path 메서드)
@anchor{library/zipfile zipfile Path is_symlink}@anchor{2ed8}
@deffn {메서드} Path.is_symlink ()

현재 컨텍스트가 심볼릭 링크를 참조하면 @code{True}를 반환합니다.


Added in version 3.12.



버전 3.13에서 변경: Previously, @code{is_symlink} would unconditionally return @code{False}.

@end deffn

@geindex exists() (zipfile.Path 메서드)
@anchor{library/zipfile zipfile Path exists}@anchor{2ed9}
@deffn {메서드} Path.exists ()

현재 컨텍스트가 zip 파일에 있는 파일이나 디렉터리를 참조하면 @code{True}를 반환합니다.
@end deffn

@geindex Path.suffix (zipfile 모듈)
@anchor{library/zipfile zipfile Path suffix}@anchor{8d5}
@deffn {데이터} Path.suffix

The last dot-separated portion of the final component, if any.
This is commonly called the file extension.


Added in version 3.11: Added @code{Path.suffix} property.

@end deffn

@geindex Path.stem (zipfile 모듈)
@anchor{library/zipfile zipfile Path stem}@anchor{8d4}
@deffn {데이터} Path.stem

접미사(suffix)가 없는 최종 경로 구성 요소.


Added in version 3.11: Added @code{Path.stem} property.

@end deffn

@geindex Path.suffixes (zipfile 모듈)
@anchor{library/zipfile zipfile Path suffixes}@anchor{8d6}
@deffn {데이터} Path.suffixes

A list of the path’s suffixes, commonly called file extensions.


Added in version 3.11: Added @code{Path.suffixes} property.

@end deffn

@geindex read_text() (zipfile.Path 메서드)
@anchor{library/zipfile zipfile Path read_text}@anchor{1adc}
@deffn {메서드} Path.read_text (*, **)

현재 파일을 유니코드 텍스트로 읽습니다. 위치와 키워드 인자는 @ref{9be,,io.TextIOWrapper}로 전달됩니다 (컨텍스트에 의해 암시되는 @code{buffer} 제외).


버전 3.11.2에서 변경: The @code{encoding} parameter can be supplied as a positional argument
without causing a @ref{198,,TypeError}. As it could in 3.9. Code needing to
be compatible with unpatched 3.10 and 3.11 versions must pass all
@ref{9be,,io.TextIOWrapper} arguments, @code{encoding} included, as keywords.

@end deffn

@geindex read_bytes() (zipfile.Path 메서드)
@anchor{library/zipfile zipfile Path read_bytes}@anchor{2eda}
@deffn {메서드} Path.read_bytes ()

현재 파일을 바이트열로 읽습니다.
@end deffn

@geindex joinpath() (zipfile.Path 메서드)
@anchor{library/zipfile zipfile Path joinpath}@anchor{2edb}
@deffn {메서드} Path.joinpath (*other)

Return a new Path object with each of the `other' arguments
joined. The following are equivalent:

@example
>>> Path(...).joinpath('child').joinpath('grandchild')
>>> Path(...).joinpath('child', 'grandchild')
>>> Path(...) / 'child' / 'grandchild'
@end example


버전 3.10에서 변경: Prior to 3.10, @code{joinpath} was undocumented and accepted
exactly one parameter.

@end deffn

The zipp@footnote{https://pypi.org/project/zipp/} project provides backports
of the latest path object functionality to older Pythons. Use
@code{zipp.Path} in place of @code{zipfile.Path} for early access to
changes.

@node PyZipFile objects,ZipInfo objects,Path objects,zipfile — ZIP 아카이브 작업
@anchor{library/zipfile id3}@anchor{2edc}@anchor{library/zipfile pyzipfile-objects}@anchor{2edd}
@subsubsection PyZipFile objects


@ref{11f8,,PyZipFile} 생성자는 @ref{8d2,,ZipFile} 생성자와 같은 매개 변수와 하나의 추가 매개 변수 `optimize'를 취합니다.

@geindex PyZipFile (zipfile 클래스)
@anchor{library/zipfile zipfile PyZipFile}@anchor{11f8}
@deffn {클래스} zipfile.PyZipFile (file, mode='r', compression=ZIP_STORED, allowZip64=True, optimize=-1)


버전 3.2에서 변경: `optimize' 매개 변수를 추가했습니다.



버전 3.4에서 변경: ZIP64 확장은 기본적으로 활성화됩니다.


인스턴스에는 @ref{8d2,,ZipFile} 객체의 메서드들 외에 한 가지 추가 메서드가 있습니다:

@geindex writepy() (zipfile.PyZipFile 메서드)
@anchor{library/zipfile zipfile PyZipFile writepy}@anchor{11f7}
@deffn {메서드} writepy (pathname, basename='@w{'}, filterfunc=None)

파일 @code{*.py}를 검색하고 해당 파일을 아카이브에 추가합니다.

@ref{11f8,,PyZipFile}에 대한 `optimize' 매개 변수가 제공되지 않았거나 @code{-1}이면, 해당 파일은 @code{*.pyc} 파일이며, 필요하면 컴파일합니다.

@ref{11f8,,PyZipFile}에 대한 `optimize' 매개 변수가 @code{0}, @code{1} 또는 @code{2}이면, 해당 최적화 수준(@ref{4b2,,compile()}을 참조하십시오)의  파일 만 아카이브에 추가되며, 필요하면 컴파일합니다.

`pathname'이 파일이면, 파일 이름은 @code{.py}로 끝나야하며, 단지 그 (해당 @code{*.pyc}) 파일 만 최상위 수준에 추가됩니다 (경로 정보 없음). `pathname'이 @code{.py}로 끝나지 않는 파일이면, @ref{244,,RuntimeError}가 발생합니다. 디렉터리이고, 디렉터리가 패키지 디렉터리가 아니면, 모든 파일 @code{*.pyc}가 최상위 수준에 추가됩니다. 디렉터리가 패키지 디렉터리이면, 모든 @code{*.pyc}가 패키지 이름의 파일 경로 아래에 추가되고, 서브 디렉터리가 패키지 디렉터리이면, 이들 모두도 재귀적으로 정렬된 순서로 추가됩니다.

`basename'은 내부 전용입니다.

`filterfunc'가 주어지면, 단일 문자열 인자를 취하는 함수여야 합니다. 아카이브에 추가되기 전에 각 경로(개별 전체 파일 경로를 포함합니다)를 전달합니다. `filterfunc'가 거짓 값을 반환하면, 경로가 추가되지 않으며, 디렉터리이면 내용이 무시됩니다. 예를 들어, 테스트 파일이 모두 @code{test} 디렉터리에 있거나 문자열 @code{test_}로 시작하면, `filterfunc'를 사용하여 해당 파일들을 제외할 수 있습니다:

@example
>>> zf = PyZipFile('myprog.zip')
>>> def notests(s):
...     fn = os.path.basename(s)
...     return (not (fn == 'test' or fn.startswith('test_')))
...
>>> zf.writepy('myprog', filterfunc=notests)
@end example

@ref{11f7,,writepy()} 메서드는 다음과 같은 파일 이름으로 아카이브를 만듭니다:

@example
string.pyc                   # 최상위 이름
test/__init__.pyc            # 패키지 디렉터리
test/testall.pyc             # 모듈 test.testall
test/bogus/__init__.pyc      # 서브 패키지 디렉터리
test/bogus/myfile.pyc        # 서브 모듈 test.bogus.myfile
@end example


버전 3.4에서 변경: `filterfunc' 매개 변수를 추가했습니다.



버전 3.6.2에서 변경: `pathname' 매개 변수는 @ref{5a0,,경로류 객체}를 받아들입니다.



버전 3.7에서 변경: 재귀는 디렉터리 항목을 정렬합니다.

@end deffn
@end deffn

@node ZipInfo objects,Command-line interface<4>,PyZipFile objects,zipfile — ZIP 아카이브 작업
@anchor{library/zipfile id4}@anchor{2ede}@anchor{library/zipfile zipinfo-objects}@anchor{2ebf}
@subsubsection ZipInfo objects


@ref{2cb,,ZipInfo} 클래스의 인스턴스는 @ref{8d2,,ZipFile} 객체의 @ref{2ebd,,getinfo()}와 @ref{2ebe,,infolist()} 메서드가 반환합니다. 각 객체는 ZIP 아카이브의 단일 멤버에 대한 정보를 저장합니다.

파일 시스템 파일의 @ref{2cb,,ZipInfo} 인스턴스를 만드는 클래스 메서드가 하나 있습니다:

@geindex from_file() (zipfile.ZipInfo의 클래스 메서드)
@anchor{library/zipfile zipfile ZipInfo from_file}@anchor{f05}
@deffn {메서드} classmethod ZipInfo.from_file (filename, arcname=None, *, strict_timestamps=True)

zip 파일에 파일을 추가할 수 있도록, 파일 시스템의 파일에 대한 @ref{2cb,,ZipInfo} 인스턴스를 생성합니다.

`filename'은 파일 시스템에서 파일이나 디렉터리의 경로여야 합니다.

`arcname'이 지정되면, 아카이브 내에서의 이름으로 사용됩니다. `arcname'을 지정하지 않으면, 이름은 `filename'과 같지만, 드라이브 문자와 선행 경로 구분 기호가 제거됩니다.

`strict_timestamps' 인자를 @code{False}로 설정하면, 1980-01-01 이전의 zip 파일을 허용하는 대신 타임 스탬프를 1980-01-01로 설정합니다. 2107-12-31 이후의 파일에 대해서도 비슷한 동작이 발생하며, 타임 스탬프는 역시 한곗값으로 설정됩니다.


Added in version 3.6.



버전 3.6.2에서 변경: `filename' 매개 변수는 @ref{5a0,,경로류 객체}를 받아들입니다.



버전 3.8에서 변경: `strict_timestamps' 키워드 전용 매개 변수를 추가했습니다.

@end deffn

인스턴스에는 다음과 같은 메서드와 어트리뷰트가 있습니다:

@geindex is_dir() (zipfile.ZipInfo 메서드)
@anchor{library/zipfile zipfile ZipInfo is_dir}@anchor{f06}
@deffn {메서드} ZipInfo.is_dir ()

이 아카이브 멤버가 디렉터리이면 @code{True}를 반환합니다.

이것은 항목 이름을 사용합니다: 디렉터리는 항상 @code{/}로 끝나야 합니다.


Added in version 3.6.

@end deffn

@geindex filename (zipfile.ZipInfo의 속성)
@anchor{library/zipfile zipfile ZipInfo filename}@anchor{2edf}
@deffn {속성} ZipInfo.filename

아카이브에서의 파일의 이름.
@end deffn

@geindex date_time (zipfile.ZipInfo의 속성)
@anchor{library/zipfile zipfile ZipInfo date_time}@anchor{2ee0}
@deffn {속성} ZipInfo.date_time

The time and date of the last modification to the archive member.  This is a
tuple of six values representing the “last [modified] file time” and “last [modified] file date”
fields from the ZIP file’s central directory.

The tuple contains:


@multitable {xxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

인덱스

@tab

값

@item

@code{0}

@tab

연도 (>= 1980)

@item

@code{1}

@tab

월 (1에서 시작)

@item

@code{2}

@tab

월 중 일 (1에서 시작)

@item

@code{3}

@tab

시간 (0에서 시작)

@item

@code{4}

@tab

분 (0에서 시작)

@item

@code{5}

@tab

초 (0에서 시작)

@end multitable


@cartouche
@quotation 참고 
The ZIP format supports multiple timestamp fields in different locations
(central directory, extra fields for NTFS/UNIX systems, etc.). This attribute
specifically returns the timestamp from the central directory. The central
directory timestamp format in ZIP files does not support timestamps before
1980. While some extra field formats (such as UNIX timestamps) can represent
earlier dates, this attribute only returns the central directory timestamp.

The central directory timestamp is interpreted as representing local
time, rather than UTC time, to match the behavior of other zip tools.
@end quotation
@end cartouche
@end deffn

@geindex compress_type (zipfile.ZipInfo의 속성)
@anchor{library/zipfile zipfile ZipInfo compress_type}@anchor{2ee1}
@deffn {속성} ZipInfo.compress_type

아카이브 멤버의 압축 유형.
@end deffn

@geindex comment (zipfile.ZipInfo의 속성)
@anchor{library/zipfile zipfile ZipInfo comment}@anchor{2ee2}
@deffn {속성} ZipInfo.comment

@ref{192,,bytes} 객체로 제공되는 개별 아카이브 멤버에 대한 주석.
@end deffn

@geindex extra (zipfile.ZipInfo의 속성)
@anchor{library/zipfile zipfile ZipInfo extra}@anchor{2ee3}
@deffn {속성} ZipInfo.extra

확장 필드 데이터. PKZIP Application Note@footnote{https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT}는 이 @ref{192,,bytes} 객체에 포함된 데이터의 내부 구조에 대한 주석을 포함합니다.
@end deffn

@geindex create_system (zipfile.ZipInfo의 속성)
@anchor{library/zipfile zipfile ZipInfo create_system}@anchor{2ee4}
@deffn {속성} ZipInfo.create_system

ZIP 아카이브를 만든 시스템.
@end deffn

@geindex create_version (zipfile.ZipInfo의 속성)
@anchor{library/zipfile zipfile ZipInfo create_version}@anchor{2ee5}
@deffn {속성} ZipInfo.create_version

ZIP 아카이브를 만든 PKZIP 버전.
@end deffn

@geindex extract_version (zipfile.ZipInfo의 속성)
@anchor{library/zipfile zipfile ZipInfo extract_version}@anchor{2ee6}
@deffn {속성} ZipInfo.extract_version

아카이브를 추출하기 위해 필요한 PKZIP 버전.
@end deffn

@geindex reserved (zipfile.ZipInfo의 속성)
@anchor{library/zipfile zipfile ZipInfo reserved}@anchor{2ee7}
@deffn {속성} ZipInfo.reserved

반드시 0이어야 합니다.
@end deffn

@geindex flag_bits (zipfile.ZipInfo의 속성)
@anchor{library/zipfile zipfile ZipInfo flag_bits}@anchor{2ee8}
@deffn {속성} ZipInfo.flag_bits

ZIP 플래그 비트.
@end deffn

@geindex volume (zipfile.ZipInfo의 속성)
@anchor{library/zipfile zipfile ZipInfo volume}@anchor{2ee9}
@deffn {속성} ZipInfo.volume

파일 헤더의 볼륨 번호.
@end deffn

@geindex internal_attr (zipfile.ZipInfo의 속성)
@anchor{library/zipfile zipfile ZipInfo internal_attr}@anchor{2eea}
@deffn {속성} ZipInfo.internal_attr

내부 어트리뷰트.
@end deffn

@geindex external_attr (zipfile.ZipInfo의 속성)
@anchor{library/zipfile zipfile ZipInfo external_attr}@anchor{2eeb}
@deffn {속성} ZipInfo.external_attr

외부 파일 어트리뷰트.
@end deffn

@geindex header_offset (zipfile.ZipInfo의 속성)
@anchor{library/zipfile zipfile ZipInfo header_offset}@anchor{2eec}
@deffn {속성} ZipInfo.header_offset

파일 헤더의 바이트 오프셋.
@end deffn

@geindex CRC (zipfile.ZipInfo의 속성)
@anchor{library/zipfile zipfile ZipInfo CRC}@anchor{2eed}
@deffn {속성} ZipInfo.CRC

압축되지 않은 파일의 CRC-32.
@end deffn

@geindex compress_size (zipfile.ZipInfo의 속성)
@anchor{library/zipfile zipfile ZipInfo compress_size}@anchor{2eee}
@deffn {속성} ZipInfo.compress_size

압축된 데이터의 크기.
@end deffn

@geindex file_size (zipfile.ZipInfo의 속성)
@anchor{library/zipfile zipfile ZipInfo file_size}@anchor{2ec8}
@deffn {속성} ZipInfo.file_size

압축되지 않은 파일의 크기.
@end deffn

@node Command-line interface<4>,압축 해제 함정,ZipInfo objects,zipfile — ZIP 아카이브 작업
@anchor{library/zipfile command-line-interface}@anchor{2eef}@anchor{library/zipfile zipfile-commandline}@anchor{2ef0}
@subsubsection Command-line interface


The @code{zipfile} module provides a simple command-line interface to interact
with ZIP archives.

새 ZIP 아카이브를 만들려면 @ref{2ef1,,-c} 옵션 뒤에 이름을 지정한 다음 포함해야 할 파일 이름을 나열하십시오:

@example
$ python -m zipfile -c monty.zip spam.txt eggs.txt
@end example

디렉터리 전달도 허용됩니다:

@example
$ python -m zipfile -c monty.zip life-of-brian_1979/
@end example

ZIP 아카이브를 지정된 디렉터리로 추출하려면, @ref{2ef2,,-e} 옵션을 사용하십시오:

@example
$ python -m zipfile -e monty.zip target-dir/
@end example

ZIP 아카이브에 있는 파일 목록을 보려면, @ref{2ef3,,-l} 옵션을 사용하십시오:

@example
$ python -m zipfile -l monty.zip
@end example

@menu
* 명령 줄 옵션:: 

@end menu

@node 명령 줄 옵션,,,Command-line interface<4>
@anchor{library/zipfile command-line-options}@anchor{2ef4}
@subsubsection 명령 줄 옵션


@geindex zipfile 명령줄 옵션; -l
@geindex zipfile 명령줄 옵션; --list
@anchor{library/zipfile cmdoption-zipfile-l}@anchor{2ef3}
@deffn {Option} @w{-}l <zipfile>
@anchor{library/zipfile cmdoption-zipfile-list}@anchor{2ef5}
@deffnx {Option} @w{-}@w{-}list <zipfile>

zip 파일에 있는 파일을 나열합니다.
@end deffn

@geindex zipfile 명령줄 옵션; -c
@geindex zipfile 명령줄 옵션; --create
@anchor{library/zipfile cmdoption-zipfile-c}@anchor{2ef1}
@deffn {Option} @w{-}c <zipfile> <source1> ... <sourceN>
@anchor{library/zipfile cmdoption-zipfile-create}@anchor{2ef6}
@deffnx {Option} @w{-}@w{-}create <zipfile> <source1> ... <sourceN>

소스 파일로 zip 파일을 만듭니다.
@end deffn

@geindex zipfile 명령줄 옵션; -e
@geindex zipfile 명령줄 옵션; --extract
@anchor{library/zipfile cmdoption-zipfile-e}@anchor{2ef2}
@deffn {Option} @w{-}e <zipfile> <output_dir>
@anchor{library/zipfile cmdoption-zipfile-extract}@anchor{2ef7}
@deffnx {Option} @w{-}@w{-}extract <zipfile> <output_dir>

zip 파일을 대상 디렉터리로 추출합니다.
@end deffn

@geindex zipfile 명령줄 옵션; -t
@geindex zipfile 명령줄 옵션; --test
@anchor{library/zipfile cmdoption-zipfile-t}@anchor{2ef8}
@deffn {Option} @w{-}t <zipfile>
@anchor{library/zipfile cmdoption-zipfile-test}@anchor{2ef9}
@deffnx {Option} @w{-}@w{-}test <zipfile>

zip 파일이 유효한지 테스트합니다.
@end deffn

@geindex zipfile 명령줄 옵션; --metadata-encoding
@anchor{library/zipfile cmdoption-zipfile-metadata-encoding}@anchor{2efa}
@deffn {Option} @w{-}@w{-}metadata@w{-}encoding <encoding>

Specify encoding of member names for @ref{2ef3,,-l}, @ref{2ef2,,-e} and
@ref{2ef8,,-t}.


Added in version 3.11.

@end deffn

@node 압축 해제 함정,,Command-line interface<4>,zipfile — ZIP 아카이브 작업
@anchor{library/zipfile decompression-pitfalls}@anchor{2efb}
@subsubsection 압축 해제 함정


아래 나열된 일부 함정으로 인해 zipfile 모듈에서의 추출이 실패할 수 있습니다.

@menu
* 파일 자체에서:: 
* File system limitations:: 
* 자원 제한:: 
* 중단:: 
* 추출의 기본 동작:: 

@end menu

@node 파일 자체에서,File system limitations,,압축 해제 함정
@anchor{library/zipfile from-file-itself}@anchor{2efc}
@subsubsection 파일 자체에서


잘못된 암호 / CRC 체크섬 / ZIP 형식 또는 지원되지 않는 압축 방법 / 암호 해독으로 인해 압축 해제에 실패할 수 있습니다.

@node File system limitations,자원 제한,파일 자체에서,압축 해제 함정
@anchor{library/zipfile file-system-limitations}@anchor{2efd}
@subsubsection File system limitations


다른 파일 시스템의 제한을 초과하면 압축 해제에 실패할 수 있습니다. 가령 디렉터리 항목에 허용되는 문자, 파일 이름 길이, 경로명 길이, 단일 파일 크기 및 파일 수 등.

@node 자원 제한,중단,File system limitations,압축 해제 함정
@anchor{library/zipfile resources-limitations}@anchor{2efe}@anchor{library/zipfile zipfile-resources-limitations}@anchor{2eff}
@subsubsection 자원 제한


메모리나 디스크 볼륨이 부족하면 압축 해제에 실패합니다. 예를 들어, 압축 해제 폭탄(일명 ZIP bomb@footnote{https://en.wikipedia.org/wiki/Zip_bomb})을 zipfile 라이브러리에 적용하면 디스크 볼륨이 소진될 수 있습니다.

@node 중단,추출의 기본 동작,자원 제한,압축 해제 함정
@anchor{library/zipfile interruption}@anchor{2f00}
@subsubsection 중단


Ctrl-C 누르기나 압축 해제 프로세스를 죽이는 것과 같은 압축 해제 중 중단으로 인해 아카이브 압축 해제가 불완전할 수 있습니다.

@node 추출의 기본 동작,,중단,압축 해제 함정
@anchor{library/zipfile default-behaviors-of-extraction}@anchor{2f01}
@subsubsection 추출의 기본 동작


기본 추출 동작을 모르면 예기치 않은 압축 해제 결과가 발생할 수 있습니다. 예를 들어, 같은 아카이브를 두 번 추출하면, 묻지 않고 파일을 덮어씁니다.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node tarfile — tar 아카이브 파일 읽기와 쓰기,,zipfile — ZIP 아카이브 작업,데이터 압축 및 보관
@anchor{library/tarfile doc}@anchor{2f02}@anchor{library/tarfile module-tarfile}@anchor{e4}@anchor{library/tarfile tarfile-read-and-write-tar-archive-files}@anchor{2f03}@anchor{library/tarfile translation-repo}@anchor{2f04}
@subsection @code{tarfile} — tar 아카이브 파일 읽기와 쓰기


@geindex module; tarfile

`소스 코드:' Lib/tarfile.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/tarfile.py}


__________________________________________________________________


The @code{tarfile} module makes it possible to read and write tar
archives, including those using gzip, bz2 and lzma compression.
Use the @ref{137,,zipfile} module to read or write @code{.zip} files, or the
higher-level functions in @ref{141d,,shutil}.

몇 가지 세부 사항:


@itemize *

@item 
reads and writes @ref{6b,,gzip}, @ref{14,,bz2}, @ref{23,,compression.zstd}, and
@ref{8e,,lzma} compressed archives if the respective modules are available.

@c The following paragraph should be similar to ../includes/optional-module.rst

If any of these @ref{2157,,optional modules} are missing from
your copy of CPython, look for documentation from your distributor (that is,
whoever provided Python to you).
If you are the distributor, see @ref{2155,,Requirements for optional modules}.

@item 
POSIX.1-1988 (ustar) 형식에 대한 읽기/쓰기 지원.

@item 
`longname'과 `longlink' 확장을 포함한 GNU tar 형식에 대한 읽기/쓰기 지원, 스파스(sparse) 파일 복원을 포함하여 모든 `sparse' 확장 변형에 대한 읽기 전용 지원.

@item 
POSIX.1-2001 (pax) 형식에 대한 읽기/쓰기 지원.

@item 
디렉터리, 일반 파일, 하드 링크, 심볼릭 링크, fifo, 문자 장치 및 블록 장치를 처리하고 타임 스탬프, 액세스 권한 및 소유자와 같은 파일 정보를 획득하고 복원할 수 있습니다.
@end itemize


버전 3.3에서 변경: @ref{8e,,lzma} 압축에 대한 지원이 추가되었습니다.



버전 3.12에서 변경: Archives are extracted using a @ref{696,,filter},
which makes it possible to either limit surprising/dangerous features,
or to acknowledge that they are expected and the archive is fully trusted.



버전 3.14에서 변경: Set the default extraction filter to @ref{29a,,data},
which disallows some dangerous features such as links to absolute paths
or paths outside of the destination. Previously, the filter strategy
was equivalent to @ref{2f05,,fully_trusted}.



버전 3.14에서 변경: Added support for Zstandard compression using @ref{23,,compression.zstd}.


@geindex open() (tarfile 모듈)
@anchor{library/tarfile tarfile open}@anchor{1076}
@deffn {함수} tarfile.open (name=None, mode='r', fileobj=None, bufsize=10240, **kwargs)

경로명 `name'에 대한 @ref{1415,,TarFile} 객체를 반환합니다. @code{TarFile} 객체와 허용되는 키워드 인자에 대한 자세한 정보는 @ref{2f06,,TarFile 객체}를 참조하십시오.

`mode'는 @code{'filemode[:compression]'} 형식의 문자열이어야 하며, 기본값은 @code{'r'}입니다. 다음은 mode 조합의 전체 목록입니다:


@multitable {xxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

모드

@tab

동작

@item

@code{'r'} or
@code{'r:*'}

@tab

투명한 압축으로 읽기 위해 엽니다 (권장합니다).

@item

@code{'r:'}

@tab

압축하지 않고 독점적으로 읽기 위해 엽니다.

@item

@code{'r:gz'}

@tab

gzip 압축으로 읽기 위해 엽니다.

@item

@code{'r:bz2'}

@tab

bzip2 압축으로 읽기 위해 엽니다.

@item

@code{'r:xz'}

@tab

lzma 압축으로 읽기 위해 엽니다.

@item

@code{'r:zst'}

@tab

Open for reading with Zstandard compression.

@item

@code{'x'} 또는 @code{'x:'}

@tab

압축하지 않고 독점적으로 tar 파일을 만듭니다. 이미 있으면 @ref{121f,,FileExistsError} 예외를 발생시킵니다.

@item

@code{'x:gz'}

@tab

gzip 압축으로 tar 파일을 만듭니다. 이미 있으면 @ref{121f,,FileExistsError} 예외를 발생시킵니다.

@item

@code{'x:bz2'}

@tab

bzip2 압축으로 tar 파일을 만듭니다. 이미 있으면 @ref{121f,,FileExistsError} 예외를 발생시킵니다.

@item

@code{'x:xz'}

@tab

lzma 압축으로 tar 파일을 만듭니다. 이미 있으면 @ref{121f,,FileExistsError} 예외를 발생시킵니다.

@item

@code{'x:zst'}

@tab

Create a tarfile with Zstandard compression.
Raise a @ref{121f,,FileExistsError} exception
if it already exists.

@item

@code{'a'} or
@code{'a:'}

@tab

압축하지 않고 추가하기 위해 엽니다. 파일이 없으면 만들어집니다.

@item

@code{'w'} or
@code{'w:'}

@tab

압축되지 않은 쓰기를 위해 엽니다.

@item

@code{'w:gz'}

@tab

gzip 압축 쓰기를 위해 엽니다.

@item

@code{'w:bz2'}

@tab

bzip2 압축 쓰기를 위해 엽니다.

@item

@code{'w:xz'}

@tab

lzma 압축 쓰기를 위해 엽니다.

@item

@code{'w:zst'}

@tab

Open for Zstandard compressed writing.

@end multitable


@code{'a:gz'}, @code{'a:bz2'} 또는 @code{'a:xz'}는 불가능함에 유의하십시오. `mode'가 특정 (압축된) 파일을 읽기 위해 여는 데 적합하지 않으면 @ref{1c4d,,ReadError}가 발생합니다. 이것을 피하려면 `mode' @code{'r'}을 사용하십시오. 압축 방법이 지원되지 않으면, @ref{2f07,,CompressionError}가 발생합니다.

`fileobj'가 지정되면, `name'에 대해 바이너리 모드로 열린 @ref{13c8,,파일 객체}의 대안으로 사용됩니다. 위치 0에 있다고 가정합니다.

@code{'w:gz'}, @code{'x:gz'}, @code{'w|gz'}, @code{'w:bz2'}, @code{'x:bz2'}, @code{'w|bz2'} 모드의 경우, @ref{1076,,tarfile.open()}은 파일의 압축 수준을 지정하는 키워드 인자 `compresslevel'(기본값 @code{9})을 받아들입니다.

For modes @code{'w:xz'}, @code{'x:xz'} and @code{'w|xz'}, @ref{1076,,tarfile.open()} accepts the
keyword argument `preset' to specify the compression level of the file.

For modes @code{'w:zst'}, @code{'x:zst'} and @code{'w|zst'}, @ref{1076,,tarfile.open()}
accepts the keyword argument `level' to specify the compression level of
the file. The keyword argument `options' may also be passed, providing
advanced Zstandard compression parameters described by
@ref{2e0c,,CompressionParameter}. The keyword argument
`zstd_dict' can be passed to provide a @ref{2e0b,,ZstdDict},
a Zstandard dictionary used to improve compression of smaller amounts of
data.

특별한 목적으로, `mode'에는 두 번째 형식이 있습니다: @code{'filemode|[compression]'}. @ref{1076,,tarfile.open()}은 데이터를 블록 스트림으로 처리하는 @ref{1415,,TarFile} 객체를 반환합니다. 파일에서 무작위 탐색(random seeking)을 수행하지 않습니다. 주어지면,, `fileobj'는 (`mode'에 따라) 바이트열과 호환되는 @ref{101b,,read()}나 @ref{15b0,,write()} 메서드가 있는 임의의 객체일 수 있습니다. `bufsize'는 블록 크기를 지정하고 기본값은 @code{20 * 512} 바이트입니다. 이 변형을 예를 들어 @code{sys.stdin.buffer}, 소켓 @ref{13c8,,파일 객체} 또는 테이프 장치와 함께 사용하십시오. 그러나, 이러한 @code{TarFile} 객체는 무작위 액세스를 허용하지 않는다는 제한이 있습니다 (@ref{2f08,,예}를 참조하십시오). 현재 가능한 모드는 다음과 같습니다:


@multitable {xxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

모드

@tab

동작

@item

@code{'r|*'}

@tab

투명한 압축으로 읽기 위해 tar 블록의 `스트림'을 엽니다.

@item

@code{'r|'}

@tab

읽기 위해 압축되지 않은 tar 블록의 `스트림'을 엽니다.

@item

@code{'r|gz'}

@tab

읽기 위해 gzip 압축 `스트림'을 엽니다.

@item

@code{'r|bz2'}

@tab

읽기 위해 bzip2 압축 `스트림'을 엽니다.

@item

@code{'r|xz'}

@tab

읽기 위해 lzma 압축 `스트림'을 엽니다.

@item

@code{'r|zst'}

@tab

Open a Zstandard compressed `stream' for
reading.

@item

@code{'w|'}

@tab

쓰기 위해 압축되지 않은 `스트림'을 엽니다.

@item

@code{'w|gz'}

@tab

쓰기 위해 gzip 압축 `스트림'을 엽니다.

@item

@code{'w|bz2'}

@tab

쓰기 위해 bzip2 압축 `스트림'을 엽니다.

@item

@code{'w|xz'}

@tab

쓰기 위해 lzma 압축 `스트림'을 엽니다.

@item

@code{'w|zst'}

@tab

Open a Zstandard compressed `stream' for
writing.

@end multitable



버전 3.5에서 변경: @code{'x'} (독점 생성) 모드가 추가되었습니다.



버전 3.6에서 변경: `name' 매개 변수는 @ref{5a0,,경로류 객체}를 받아들입니다.



버전 3.12에서 변경: The `compresslevel' keyword argument also works for streams.



버전 3.14에서 변경: The `preset' keyword argument also works for streams.

@end deffn


@deffn {클래스} tarfile.TarFile

tar 아카이브를 읽고 쓰는 클래스. 이 클래스를 직접 사용하지 마십시오: 대신 @ref{1076,,tarfile.open()}을 사용하십시오. @ref{2f06,,TarFile 객체}를 참조하십시오.
@end deffn

@geindex is_tarfile() (tarfile 모듈)
@anchor{library/tarfile tarfile is_tarfile}@anchor{1bd9}
@deffn {함수} tarfile.is_tarfile (name)

Return @ref{e06,,True} if `name' is a tar archive file, that the @code{tarfile}
module can read. `name' may be a @ref{169,,str}, file, or file-like object.


버전 3.9에서 변경: 파일과 파일류 객체 지원.

@end deffn

The @code{tarfile} module defines the following exceptions:

@geindex TarError
@anchor{library/tarfile tarfile TarError}@anchor{2f09}
@deffn {예외} tarfile.TarError

Base class for all @code{tarfile} exceptions.
@end deffn

@geindex ReadError
@anchor{library/tarfile tarfile ReadError}@anchor{1c4d}
@deffn {예외} tarfile.ReadError

Is raised when a tar archive is opened, that either cannot be handled by the
@code{tarfile} module or is somehow invalid.
@end deffn

@geindex CompressionError
@anchor{library/tarfile tarfile CompressionError}@anchor{2f07}
@deffn {예외} tarfile.CompressionError

압축 방법이 지원되지 않거나 데이터를 올바르게 디코딩할 수 없을 때 발생합니다.
@end deffn

@geindex StreamError
@anchor{library/tarfile tarfile StreamError}@anchor{2f0a}
@deffn {예외} tarfile.StreamError

스트림류 @ref{1415,,TarFile} 객체에 일반적인 제한 사항으로 인해 발생합니다.
@end deffn

@geindex ExtractError
@anchor{library/tarfile tarfile ExtractError}@anchor{2f0b}
@deffn {예외} tarfile.ExtractError

@ref{29c,,TarFile.extract()}를 사용할 때 `치명적이지 않은' 에러에 대해 발생하지만, @ref{29e,,TarFile.errorlevel}@code{== 2}일 때만 발생합니다.
@end deffn

@geindex HeaderError
@anchor{library/tarfile tarfile HeaderError}@anchor{2f0c}
@deffn {예외} tarfile.HeaderError

버퍼가 유효하지 않을 때 @ref{2f0d,,TarInfo.frombuf()}에 의해 발생합니다.
@end deffn

@geindex FilterError
@anchor{library/tarfile tarfile FilterError}@anchor{2f0e}
@deffn {예외} tarfile.FilterError

Base class for members @ref{2f0f,,refused} by
filters.

@geindex tarinfo (tarfile.FilterError의 속성)
@anchor{library/tarfile tarfile FilterError tarinfo}@anchor{2f10}
@deffn {속성} tarinfo

Information about the member that the filter refused to extract,
as @ref{2f11,,TarInfo}.
@end deffn
@end deffn

@geindex AbsolutePathError
@anchor{library/tarfile tarfile AbsolutePathError}@anchor{2f12}
@deffn {예외} tarfile.AbsolutePathError

Raised to refuse extracting a member with an absolute path.
@end deffn

@geindex OutsideDestinationError
@anchor{library/tarfile tarfile OutsideDestinationError}@anchor{2f13}
@deffn {예외} tarfile.OutsideDestinationError

Raised to refuse extracting a member outside the destination directory.
@end deffn

@geindex SpecialFileError
@anchor{library/tarfile tarfile SpecialFileError}@anchor{2f14}
@deffn {예외} tarfile.SpecialFileError

Raised to refuse extracting a special file (e.g. a device or pipe).
@end deffn

@geindex AbsoluteLinkError
@anchor{library/tarfile tarfile AbsoluteLinkError}@anchor{2f15}
@deffn {예외} tarfile.AbsoluteLinkError

Raised to refuse extracting a symbolic link with an absolute path.
@end deffn

@geindex LinkOutsideDestinationError
@anchor{library/tarfile tarfile LinkOutsideDestinationError}@anchor{2f16}
@deffn {예외} tarfile.LinkOutsideDestinationError

Raised to refuse extracting a symbolic link pointing outside the destination
directory.
@end deffn

@geindex LinkFallbackError
@anchor{library/tarfile tarfile LinkFallbackError}@anchor{29d}
@deffn {예외} tarfile.LinkFallbackError

Raised to refuse emulating a link (hard or symbolic) by extracting another
archive member, when that member would be rejected by the filter location.
The exception that was raised to reject the replacement member is available
as @code{BaseException.__context__}.


Added in version 3.14.

@end deffn

모듈 수준에서 다음 상수를 사용할 수 있습니다:

@geindex ENCODING (tarfile 모듈)
@anchor{library/tarfile tarfile ENCODING}@anchor{2f17}
@deffn {데이터} tarfile.ENCODING

기본 문자 인코딩: 윈도우의 경우 @code{'utf-8'}, 그렇지 않으면 @ref{e52,,sys.getfilesystemencoding()} 이 반환하는 값.
@end deffn

@geindex REGTYPE (tarfile 모듈)
@geindex AREGTYPE (tarfile 모듈)
@anchor{library/tarfile tarfile REGTYPE}@anchor{2f18}
@deffn {데이터} tarfile.REGTYPE
@anchor{library/tarfile tarfile AREGTYPE}@anchor{2f19}
@deffnx {데이터} tarfile.AREGTYPE

A regular file @ref{2f1a,,type}.
@end deffn

@geindex LNKTYPE (tarfile 모듈)
@anchor{library/tarfile tarfile LNKTYPE}@anchor{2f1b}
@deffn {데이터} tarfile.LNKTYPE

A link (inside tarfile) @ref{2f1a,,type}.
@end deffn

@geindex SYMTYPE (tarfile 모듈)
@anchor{library/tarfile tarfile SYMTYPE}@anchor{2f1c}
@deffn {데이터} tarfile.SYMTYPE

A symbolic link @ref{2f1a,,type}.
@end deffn

@geindex CHRTYPE (tarfile 모듈)
@anchor{library/tarfile tarfile CHRTYPE}@anchor{2f1d}
@deffn {데이터} tarfile.CHRTYPE

A character special device @ref{2f1a,,type}.
@end deffn

@geindex BLKTYPE (tarfile 모듈)
@anchor{library/tarfile tarfile BLKTYPE}@anchor{2f1e}
@deffn {데이터} tarfile.BLKTYPE

A block special device @ref{2f1a,,type}.
@end deffn

@geindex DIRTYPE (tarfile 모듈)
@anchor{library/tarfile tarfile DIRTYPE}@anchor{2f1f}
@deffn {데이터} tarfile.DIRTYPE

A directory @ref{2f1a,,type}.
@end deffn

@geindex FIFOTYPE (tarfile 모듈)
@anchor{library/tarfile tarfile FIFOTYPE}@anchor{2f20}
@deffn {데이터} tarfile.FIFOTYPE

A FIFO special device @ref{2f1a,,type}.
@end deffn

@geindex CONTTYPE (tarfile 모듈)
@anchor{library/tarfile tarfile CONTTYPE}@anchor{2f21}
@deffn {데이터} tarfile.CONTTYPE

A contiguous file @ref{2f1a,,type}.
@end deffn

@geindex GNUTYPE_LONGNAME (tarfile 모듈)
@anchor{library/tarfile tarfile GNUTYPE_LONGNAME}@anchor{2f22}
@deffn {데이터} tarfile.GNUTYPE_LONGNAME

A GNU tar longname @ref{2f1a,,type}.
@end deffn

@geindex GNUTYPE_LONGLINK (tarfile 모듈)
@anchor{library/tarfile tarfile GNUTYPE_LONGLINK}@anchor{2f23}
@deffn {데이터} tarfile.GNUTYPE_LONGLINK

A GNU tar longlink @ref{2f1a,,type}.
@end deffn

@geindex GNUTYPE_SPARSE (tarfile 모듈)
@anchor{library/tarfile tarfile GNUTYPE_SPARSE}@anchor{2f24}
@deffn {데이터} tarfile.GNUTYPE_SPARSE

A GNU tar sparse file @ref{2f1a,,type}.
@end deffn

Each of the following constants defines a tar archive format that the
@code{tarfile} module is able to create. See section @ref{2f25,,지원되는 tar 형식} for
details.

@geindex USTAR_FORMAT (tarfile 모듈)
@anchor{library/tarfile tarfile USTAR_FORMAT}@anchor{2f26}
@deffn {데이터} tarfile.USTAR_FORMAT

POSIX.1-1988 (ustar) 형식.
@end deffn

@geindex GNU_FORMAT (tarfile 모듈)
@anchor{library/tarfile tarfile GNU_FORMAT}@anchor{2f27}
@deffn {데이터} tarfile.GNU_FORMAT

GNU tar 형식.
@end deffn

@geindex PAX_FORMAT (tarfile 모듈)
@anchor{library/tarfile tarfile PAX_FORMAT}@anchor{2f28}
@deffn {데이터} tarfile.PAX_FORMAT

POSIX.1-2001 (pax) 형식.
@end deffn

@geindex DEFAULT_FORMAT (tarfile 모듈)
@anchor{library/tarfile tarfile DEFAULT_FORMAT}@anchor{2f29}
@deffn {데이터} tarfile.DEFAULT_FORMAT

아카이브를 만들기 위한 기본 형식. 이것은 현재 @ref{2f28,,PAX_FORMAT}입니다.


버전 3.8에서 변경: 새 아카이브의 기본 형식이 @ref{2f27,,GNU_FORMAT}에서 @ref{2f28,,PAX_FORMAT}으로 변경되었습니다.

@end deffn


@subsubheading 더 보기



@table @asis

@item 모듈 @ref{137,,zipfile}

@ref{137,,zipfile} 표준 모듈의 설명서.

@item @ref{141d,,아카이브 연산}

표준 @ref{ca,,shutil} 모듈이 제공하는 고수준 아카이브 기능에 대한 설명서.

@item GNU tar manual@comma{} Basic Tar Format@footnote{https://www.gnu.org/software/tar/manual/html_node/Standard.html}

GNU tar 확장을 포함한, tar 아카이브 파일에 대한 설명서.
@end table


@menu
* TarFile 객체:: 
* TarInfo 객체:: 
* Extraction filters:: 
* 명령 줄 인터페이스:: 
* 예: 예<5>. 
* 지원되는 tar 형식:: 
* 유니코드 문제:: 

@end menu

@node TarFile 객체,TarInfo 객체,,tarfile — tar 아카이브 파일 읽기와 쓰기
@anchor{library/tarfile id1}@anchor{2f2a}@anchor{library/tarfile tarfile-objects}@anchor{2f06}
@subsubsection TarFile 객체


@ref{1415,,TarFile} 객체는 tar 아카이브에 대한 인터페이스를 제공합니다. tar 아카이브는 블록의 시퀀스입니다. 아카이브 멤버(저장된 파일)는 헤더 블록과 그 뒤에 오는 데이터 블록으로 구성됩니다. tar 아카이브에 파일을 여러 번 저장할 수 있습니다. 각 아카이브 멤버는 @ref{1416,,TarInfo} 객체로 표현됩니다. 세부 사항은 @ref{2f11,,TarInfo 객체}를 참조하십시오.

@ref{1415,,TarFile} 객체는 @ref{186,,with} 문에서 컨텍스트 관리자로 사용될 수 있습니다. 블록이 완료되면 자동으로 닫힙니다. 예외가 있는 경우, 쓰기 위해 열린 아카이브는 마무리되지 않음에 유의하십시오; 내부적으로 사용된 파일 객체만 닫힙니다. 사용 사례는 @ref{2f08,,예} 섹션을 참조하십시오.


Added in version 3.2: 컨텍스트 관리 프로토콜에 대한 지원이 추가되었습니다.


@geindex TarFile (tarfile 클래스)
@anchor{library/tarfile tarfile TarFile}@anchor{1415}
@deffn {클래스} tarfile.TarFile (name=None, mode='r', fileobj=None, format=DEFAULT_FORMAT, tarinfo=TarInfo, dereference=False, ignore_zeros=False, encoding=ENCODING, errors='surrogateescape', pax_headers=None, debug=0, errorlevel=1, stream=False)

다음의 모든 인자는 선택적이며 인스턴스 어트리뷰트로도 액세스 할 수 있습니다.

`name'은 아카이브의 경로명입니다. `name'은 @ref{5a0,,경로류 객체}일 수 있습니다. `fileobj'가 주어지면 생략할 수 있습니다. 이 경우, 파일 객체의 @code{name} 어트리뷰트가 있다면 사용됩니다.

`mode'는 기존 아카이브에서 읽는 @code{'r'}, 기존 파일에 데이터를 추가하는 @code{'a'}, 기존 파일을 덮어쓰는 새 파일을 만드는 @code{'w'} 또는 존재하지 않을 때만 새 파일을 만드는 @code{'x'}입니다.

`fileobj'가 주어지면, 데이터를 읽거나 쓰는 데 사용됩니다. 그것이 결정될 수 있다면, `mode'는 `fileobj'의 모드에 의해 재정의됩니다. `fileobj'는 위치 0에서 사용됩니다.

@cartouche
@quotation 참고 
@ref{1415,,TarFile}이 닫힐 때, `fileobj'는 닫히지 않습니다.
@end quotation
@end cartouche

`format'은 쓰기를 위한 아카이브 형식을 제어합니다. 모듈 수준에서 정의되는 상수 @ref{2f26,,USTAR_FORMAT}, @ref{2f27,,GNU_FORMAT} 또는 @ref{2f28,,PAX_FORMAT} 중 하나여야 합니다. 읽을 때, 형식은 자동 감지됩니다, 단일 아카이브에 다른 형식이 존재할 때조차 그렇습니다.

`tarinfo' 인자를 사용하여 기본 @ref{1416,,TarInfo} 클래스를 다른 클래스로 바꿀 수 있습니다.

`dereference'가 @ref{d2a,,False}이면, 아카이브에 심볼릭과 하드 링크를 추가합니다. @ref{e06,,True}이면, 대상 파일의 내용을 아카이브에 추가합니다. 이는 심볼릭 링크를 지원하지 않는 시스템에는 영향을 미치지 않습니다.

`ignore_zeros'가 @ref{d2a,,False}이면, 빈 블록을 아카이브의 끝으로 처리합니다. @ref{e06,,True}이면, 비어있는 (그래서 잘못된) 블록을 건너뛰고 최대한 많은 멤버를 확보하려고 합니다. 이어붙였거나 손상된 아카이브를 읽을 때만 유용합니다.

`debug'는 @code{0}(디버그 메시지 없음)에서 @code{3}(모든 디버그 메시지)까지 설정할 수 있습니다. 메시지는 @code{sys.stderr}에 기록됩니다.

`errorlevel' controls how extraction errors are handled,
see @ref{29e,,the corresponding attribute}.

`encoding'과 `errors' 인자는 아카이브를 읽거나 쓰는 데 사용되는 문자 인코딩과 변환 에러 처리 방법을 정의합니다. 기본 설정은 대부분의 사용자에게 적용됩니다. 자세한 정보는 @ref{2f2b,,유니코드 문제} 섹션을 참조하십시오.

`pax_headers' 인자는 선택적인 문자열의 딕셔너리로, `format'이 @ref{2f28,,PAX_FORMAT}이면 pax 전역 헤더로 추가됩니다.

If `stream' is set to @ref{e06,,True} then while reading the archive info about files
in the archive are not cached, saving memory.


버전 3.2에서 변경: `errors' 인자의 기본값으로 @code{'surrogateescape'}를 사용합니다.



버전 3.5에서 변경: @code{'x'} (독점 생성) 모드가 추가되었습니다.



버전 3.6에서 변경: `name' 매개 변수는 @ref{5a0,,경로류 객체}를 받아들입니다.



버전 3.13에서 변경: `stream' 매개 변수를 추가했습니다.

@end deffn

@geindex open() (tarfile.TarFile의 클래스 메서드)
@anchor{library/tarfile tarfile TarFile open}@anchor{1bda}
@deffn {메서드} classmethod TarFile.open (...)

대체 생성자. @ref{1076,,tarfile.open()} 함수는 실제로 이 클래스 메서드의 바로 가기입니다.
@end deffn

@geindex getmember() (tarfile.TarFile 메서드)
@anchor{library/tarfile tarfile TarFile getmember}@anchor{1bee}
@deffn {메서드} TarFile.getmember (name)

멤버 `name'에 대한 @ref{1416,,TarInfo} 객체를 반환합니다. 아카이브에서 `name'을 찾을 수 없으면 @ref{5e5,,KeyError}가 발생합니다.

@cartouche
@quotation 참고 
아카이브에서 멤버가 두 번 이상 등장하면, 마지막 등장을 최신 버전으로 간주합니다.
@end quotation
@end cartouche
@end deffn

@geindex getmembers() (tarfile.TarFile 메서드)
@anchor{library/tarfile tarfile TarFile getmembers}@anchor{1078}
@deffn {메서드} TarFile.getmembers ()

아카이브 멤버를 @ref{1416,,TarInfo} 객체의 리스트로 반환합니다. 리스트는 아카이브의 멤버와 순서가 같습니다.
@end deffn

@geindex getnames() (tarfile.TarFile 메서드)
@anchor{library/tarfile tarfile TarFile getnames}@anchor{2f2c}
@deffn {메서드} TarFile.getnames ()

멤버를 이름의 리스트로 반환합니다. @ref{1078,,getmembers()}가 반환하는 리스트와 순서가 같습니다.
@end deffn

@geindex list() (tarfile.TarFile 메서드)
@anchor{library/tarfile tarfile TarFile list}@anchor{1077}
@deffn {메서드} TarFile.list (verbose=True, *, members=None)

목차를 @code{sys.stdout}으로 인쇄합니다. `verbose'가 @ref{d2a,,False}이면, 멤버 이름만 인쇄됩니다. @ref{e06,,True}이면, @code{ls -l}과 유사한 출력이 생성됩니다. 선택적 `members'가 제공되면, @ref{1078,,getmembers()}가 반환한 리스트의 부분집합이어야 합니다.


버전 3.5에서 변경: `members' 매개 변수를 추가했습니다.

@end deffn

@geindex next() (tarfile.TarFile 메서드)
@anchor{library/tarfile tarfile TarFile next}@anchor{2f2d}
@deffn {메서드} TarFile.next ()

@ref{1415,,TarFile}을 읽기 위해 열었을 때, 아카이브의 다음 멤버를 @ref{1416,,TarInfo} 객체로 반환합니다. 더는 없으면, @ref{884,,None}을 반환합니다.
@end deffn

@geindex extractall() (tarfile.TarFile 메서드)
@anchor{library/tarfile tarfile TarFile extractall}@anchor{29b}
@deffn {메서드} TarFile.extractall (path='.', members=None, *, numeric_owner=False, filter=None)

아카이브의 모든 멤버(members)를 현재 작업 디렉터리나 디렉터리 `path'로 추출합니다. 선택적 `members'가 제공되면, @ref{1078,,getmembers()}가 반환하는 리스트의 부분집합이어야 합니다. 소유자, 수정 시간 및 권한과 같은 디렉터리 정보는 모든 멤버가 추출된 후에 설정됩니다. 이것은 두 가지 문제를 해결하기 위한 것입니다: 디렉터리의 수정 시간은 파일이 생성될 때마다 재설정됩니다. 또한 디렉터리의 권한이 쓰기를 허용하지 않으면, 파일 추출이 실패합니다.

`numeric_owner'가 @ref{e06,,True}이면, tar 파일의 uid와 gid 번호는 추출된 파일의 소유자/그룹을 설정하는 데 사용됩니다. 그렇지 않으면, tar 파일의 이름값이 사용됩니다.

The `filter' argument specifies how @code{members} are modified or rejected
before extraction.
See @ref{696,,Extraction filters} for details.
It is recommended to set this explicitly only if specific `tar' features
are required, or as @code{filter='data'} to support Python versions with a less
secure default (3.13 and lower).

@cartouche
@quotation 경고 
Never extract archives from untrusted sources without prior inspection.

Since Python 3.14, the default (@ref{29a,,data}) will prevent
the most dangerous security issues.
However, it will not prevent `all' unintended or insecure behavior.
Read the @ref{696,,Extraction filters} section for details.
@end quotation
@end cartouche


버전 3.5에서 변경: `numeric_owner' 매개 변수를 추가했습니다.



버전 3.6에서 변경: `path' 매개 변수는 @ref{5a0,,경로류 객체}를 받아들입니다.



버전 3.12에서 변경: `filter' 매개 변수를 추가했습니다.



버전 3.14에서 변경: The `filter' parameter now defaults to @code{'data'}.

@end deffn

@geindex extract() (tarfile.TarFile 메서드)
@anchor{library/tarfile tarfile TarFile extract}@anchor{29c}
@deffn {메서드} TarFile.extract (member, path='@w{'}, set_attrs=True, *, numeric_owner=False, filter=None)

전체 이름을 사용하여, 아카이브에서 현재 작업 디렉터리로 멤버(member)를 추출합니다. 파일 정보는 최대한 정확하게 추출됩니다. `member'는 파일명이나 @ref{1416,,TarInfo} 객체일 수 있습니다. `path'를 사용하여 다른 디렉터리를 지정할 수 있습니다. `path'는 @ref{5a0,,경로류 객체}일 수 있습니다. `set_attrs'가 거짓이 아닌 한 파일 어트리뷰트(소유자, 수정 시간, 모드)가 설정됩니다.

The `numeric_owner' and `filter' arguments are the same as
for @ref{29b,,extractall()}.

@cartouche
@quotation 참고 
@ref{29c,,extract()} 메서드는 여러 추출 문제를 처리하지 않습니다. 대부분의 경우 @ref{29b,,extractall()} 메서드 사용을 고려해야 합니다.
@end quotation
@end cartouche

@cartouche
@quotation 경고 
Never extract archives from untrusted sources without prior inspection.
See the warning for @ref{29b,,extractall()} for details.
@end quotation
@end cartouche


버전 3.2에서 변경: `set_attrs' 매개 변수를 추가했습니다.



버전 3.5에서 변경: `numeric_owner' 매개 변수를 추가했습니다.



버전 3.6에서 변경: `path' 매개 변수는 @ref{5a0,,경로류 객체}를 받아들입니다.



버전 3.12에서 변경: `filter' 매개 변수를 추가했습니다.

@end deffn

@geindex extractfile() (tarfile.TarFile 메서드)
@anchor{library/tarfile tarfile TarFile extractfile}@anchor{2f2e}
@deffn {메서드} TarFile.extractfile (member)

아카이브에서 멤버(member)를 파일 객체로 추출합니다. `member'는 파일명이나 @ref{1416,,TarInfo} 객체일 수 있습니다. `member'가 일반 파일이나 링크이면, @ref{1413,,io.BufferedReader} 객체가 반환됩니다. 다른 모든 기존 멤버에 대해서는, @ref{884,,None}이 반환됩니다. `member'가 아카이브에 없으면, @ref{5e5,,KeyError}가 발생합니다.


버전 3.3에서 변경: @ref{1413,,io.BufferedReader} 객체를 반환합니다.



버전 3.13에서 변경: The returned @ref{1413,,io.BufferedReader} object has the @code{mode}
attribute which is always equal to @code{'rb'}.

@end deffn

@geindex errorlevel (tarfile.TarFile의 속성)
@anchor{library/tarfile tarfile TarFile errorlevel}@anchor{29e}
@deffn {속성} TarFile.errorlevel: @ref{19b,,int}

`errorlevel'이 @code{0}이면, @ref{29c,,TarFile.extract()}와 @ref{29b,,TarFile.extractall()}를 사용할 때 에러가 무시됩니다. 그런데도, `debug'이 0보다 크면, 디버그 출력에 에러 메시지로 나타납니다. @code{1}이면 (기본값), 모든 `치명적' 에러가 @ref{2c0,,OSError}나 @ref{2f0e,,FilterError} 예외로 발생합니다. @code{2}이면, 모든 `치명적이지 않은' 에러도 @ref{2f09,,TarError} 예외로 발생합니다.

Some exceptions, e.g. ones caused by wrong argument types or data
corruption, are always raised.

Custom @ref{696,,extraction filters}
should raise @ref{2f0e,,FilterError} for `fatal' errors
and @ref{2f0b,,ExtractError} for `non-fatal' ones.

Note that when an exception is raised, the archive may be partially
extracted. It is the user’s responsibility to clean up.
@end deffn

@geindex extraction_filter (tarfile.TarFile의 속성)
@anchor{library/tarfile tarfile TarFile extraction_filter}@anchor{2f2f}
@deffn {속성} TarFile.extraction_filter


Added in version 3.12.


The @ref{696,,extraction filter} used
as a default for the `filter' argument of @ref{29c,,extract()}
and @ref{29b,,extractall()}.

The attribute may be @code{None} or a callable.
String names are not allowed for this attribute, unlike the `filter'
argument to @ref{29c,,extract()}.

If @code{extraction_filter} is @code{None} (the default), extraction methods
will use the @ref{29a,,data} filter by default.

The attribute may be set on instances or overridden in subclasses.
It also is possible to set it on the @code{TarFile} class itself to set a
global default, although, since it affects all uses of `tarfile',
it is best practice to only do so in top-level applications or
@ref{cc,,site configuration}.
To set a global default this way, a filter function needs to be wrapped in
@ref{453,,staticmethod()} to prevent injection of a @code{self} argument.


버전 3.14에서 변경: The default filter is set to @ref{29a,,data},
which disallows some dangerous features such as links to absolute paths
or paths outside of the destination.
Previously, the default was equivalent to
@ref{2f05,,fully_trusted}.

@end deffn

@geindex add() (tarfile.TarFile 메서드)
@anchor{library/tarfile tarfile TarFile add}@anchor{ded}
@deffn {메서드} TarFile.add (name, arcname=None, recursive=True, *, filter=None)

`name' 파일을 아카이브에 추가합니다. `name'은 모든 유형의 파일(디렉터리, fifo, 심볼릭 링크 등)일 수 있습니다. 지정되면, `arcname'은 아카이브에 있는 파일의 대체 이름을 지정합니다. 디렉터리는 기본적으로 재귀적으로 추가됩니다. `recursive'를 @ref{d2a,,False}로 설정하면, 이를 피할 수 있습니다. 재귀는 항목을 정렬된 순서로 추가합니다. `filter'가 제공되면, @ref{1416,,TarInfo} 객체 인자를 취하고 변경된 @code{TarInfo} 객체를 반환하는 함수여야 합니다. 이것이 대신 @ref{884,,None}을 반환하면, @code{TarInfo} 객체가 아카이브에서 제외됩니다. 예는 @ref{2f08,,예}를 참조하십시오.


버전 3.2에서 변경: `filter' 매개 변수를 추가했습니다.



버전 3.7에서 변경: 재귀는 항목을 정렬된 순서로 추가합니다.

@end deffn

@geindex addfile() (tarfile.TarFile 메서드)
@anchor{library/tarfile tarfile TarFile addfile}@anchor{19a7}
@deffn {메서드} TarFile.addfile (tarinfo, fileobj=None)

@ref{1416,,TarInfo} 객체 `tarinfo'를 아카이브에 추가합니다. `tarinfo'가 0이 아닌 크기의 일반 파일이면, `fileobj' 인자는 @ref{206c,,바이너리 파일}이어야 하고, 여기서 @code{tarinfo.size} 바이트를 읽어서 아카이브에 추가합니다. @code{TarInfo} 객체를 직접 혹은 @ref{2f30,,gettarinfo()}를 사용하여  만들 수 있습니다.


버전 3.13에서 변경: `fileobj' must be given for non-zero-sized regular files.

@end deffn

@geindex gettarinfo() (tarfile.TarFile 메서드)
@anchor{library/tarfile tarfile TarFile gettarinfo}@anchor{2f30}
@deffn {메서드} TarFile.gettarinfo (name=None, arcname=None, fileobj=None)

기존 파일에서 @ref{26d,,os.stat()}이나 이와 동등한 것의 결과로부터 @ref{1416,,TarInfo} 객체를 만듭니다. 파일은 `name'으로 이름을 지정하거나, 파일 기술자를 갖는 @ref{13c8,,파일 객체} `fileobj'로 지정됩니다. `name'은 @ref{5a0,,경로류 객체}일 수 있습니다. 주어지면, `arcname'은 아카이브에 있는 파일의 대체 이름을 지정하고, 그렇지 않으면, 이름은 `fileobj'의 @ref{2e16,,name} 어트리뷰트나 `name' 인자에서 취합니다. 이름은 텍스트 문자열이어야 합니다.

@ref{19a7,,addfile()}을 사용하여 추가하기 전에 @ref{1416,,TarInfo}의 일부 어트리뷰트를 수정할 수 있습니다. 파일 객체가 파일의 시작 부분에 위치한 일반 파일 객체가 아니면, @ref{2f31,,size}와 같은 어트리뷰트를 수정해야 할 수 있습니다. @ref{65a,,GzipFile}과 같은 객체가 이 상황에 해당합니다. @ref{2f32,,name}도 수정될 수 있으며, 이 경우 `arcname'은 더미 문자열일 수 있습니다.


버전 3.6에서 변경: `name' 매개 변수는 @ref{5a0,,경로류 객체}를 받아들입니다.

@end deffn

@geindex close() (tarfile.TarFile 메서드)
@anchor{library/tarfile tarfile TarFile close}@anchor{2f33}
@deffn {메서드} TarFile.close ()

@ref{1415,,TarFile}을 닫습니다. 쓰기 모드에서는, 두 개의 마무리 0블록이 아카이브에 추가됩니다.
@end deffn

@geindex pax_headers (tarfile.TarFile의 속성)
@anchor{library/tarfile tarfile TarFile pax_headers}@anchor{2f34}
@deffn {속성} TarFile.pax_headers: @ref{183,,dict}

pax 전역 헤더의 키-값 쌍을 포함하는 딕셔너리.
@end deffn

@node TarInfo 객체,Extraction filters,TarFile 객체,tarfile — tar 아카이브 파일 읽기와 쓰기
@anchor{library/tarfile id2}@anchor{2f35}@anchor{library/tarfile tarinfo-objects}@anchor{2f11}
@subsubsection TarInfo 객체


@ref{1416,,TarInfo} 객체는 @ref{1415,,TarFile}에 있는 하나의 멤버를 나타냅니다. 파일의 모든 필수 어트리뷰트(파일 유형, 크기, 시간, 권한, 소유자 등과 같은)를 저장하는 것 외에도, 파일 유형을 결정하는 유용한 메서드를 제공합니다. 파일의 데이터 자체를 포함하지 `않습니다'.

@ref{1416,,TarInfo} 객체는 @ref{1415,,TarFile}의 메서드 @ref{1bee,,getmember()}, @ref{1078,,getmembers()} 및 @ref{2f30,,gettarinfo()}에 의해 반환됩니다.

Modifying the objects returned by @ref{1bee,,getmember()} or
@ref{1078,,getmembers()} will affect all subsequent
operations on the archive.
For cases where this is unwanted, you can use @ref{29,,copy.copy()} or
call the @ref{2f36,,replace()} method to create a modified copy in one step.

Several attributes can be set to @code{None} to indicate that a piece of metadata
is unused or unknown.
Different @ref{1416,,TarInfo} methods handle @code{None} differently:


@itemize -

@item 
The @ref{29c,,extract()} or @ref{29b,,extractall()} methods will
ignore the corresponding metadata, leaving it set to a default.

@item 
@ref{19a7,,addfile()} will fail.

@item 
@ref{1077,,list()} will print a placeholder string.
@end itemize

@geindex TarInfo (tarfile 클래스)
@anchor{library/tarfile tarfile TarInfo}@anchor{1416}
@deffn {클래스} tarfile.TarInfo (name='@w{'})

@ref{1416,,TarInfo} 객체를 만듭니다.
@end deffn

@geindex frombuf() (tarfile.TarInfo의 클래스 메서드)
@anchor{library/tarfile tarfile TarInfo frombuf}@anchor{2f0d}
@deffn {메서드} classmethod TarInfo.frombuf (buf, encoding, errors)

문자열 버퍼 `buf'에서 @ref{1416,,TarInfo} 객체를 만들고 반환합니다.

버퍼가 유효하지 않으면 @ref{2f0c,,HeaderError}를 발생시킵니다.
@end deffn

@geindex fromtarfile() (tarfile.TarInfo의 클래스 메서드)
@anchor{library/tarfile tarfile TarInfo fromtarfile}@anchor{2f37}
@deffn {메서드} classmethod TarInfo.fromtarfile (tarfile)

@ref{1415,,TarFile} 객체 `tarfile'에서 다음 멤버를 읽고 @ref{1416,,TarInfo} 객체로 반환합니다.
@end deffn

@geindex tobuf() (tarfile.TarInfo 메서드)
@anchor{library/tarfile tarfile TarInfo tobuf}@anchor{2f38}
@deffn {메서드} TarInfo.tobuf (format=DEFAULT_FORMAT, encoding=ENCODING, errors='surrogateescape')

@ref{1416,,TarInfo} 객체에서 문자열 버퍼를 만듭니다. 인자에 대한 정보는 @ref{1415,,TarFile} 클래스의 생성자를 참조하십시오.


버전 3.2에서 변경: `errors' 인자의 기본값으로 @code{'surrogateescape'}를 사용합니다.

@end deffn

@code{TarInfo} 객체에는 다음과 같은 공개 데이터 어트리뷰트가 있습니다:

@geindex name (tarfile.TarInfo의 속성)
@anchor{library/tarfile tarfile TarInfo name}@anchor{2f32}
@deffn {속성} TarInfo.name: @ref{169,,str}

아카이브 멤버의 이름
@end deffn

@geindex size (tarfile.TarInfo의 속성)
@anchor{library/tarfile tarfile TarInfo size}@anchor{2f31}
@deffn {속성} TarInfo.size: @ref{19b,,int}

바이트 단위의 크기.
@end deffn

@geindex mtime (tarfile.TarInfo의 속성)
@anchor{library/tarfile tarfile TarInfo mtime}@anchor{2f39}
@deffn {속성} TarInfo.mtime: @ref{19b,,int} | @ref{196,,float}

Time of last modification in seconds since the @ref{2f3a,,epoch},
as in @ref{2f3b,,os.stat_result.st_mtime}.


버전 3.12에서 변경: Can be set to @code{None} for @ref{29c,,extract()} and
@ref{29b,,extractall()}, causing extraction to skip applying this
attribute.

@end deffn

@geindex mode (tarfile.TarInfo의 속성)
@anchor{library/tarfile tarfile TarInfo mode}@anchor{2f3c}
@deffn {속성} TarInfo.mode: @ref{19b,,int}

Permission bits, as for @ref{529,,os.chmod()}.


버전 3.12에서 변경: Can be set to @code{None} for @ref{29c,,extract()} and
@ref{29b,,extractall()}, causing extraction to skip applying this
attribute.

@end deffn

@geindex type (tarfile.TarInfo의 속성)
@anchor{library/tarfile tarfile TarInfo type}@anchor{2f1a}
@deffn {속성} TarInfo.type

파일 유형. `type'은 일반적으로 다음 상수 중 하나입니다: @ref{2f18,,REGTYPE}, @ref{2f19,,AREGTYPE}, @ref{2f1b,,LNKTYPE}, @ref{2f1c,,SYMTYPE}, @ref{2f1f,,DIRTYPE}, @ref{2f20,,FIFOTYPE}, @ref{2f21,,CONTTYPE}, @ref{2f1d,,CHRTYPE}, @ref{2f1e,,BLKTYPE}, @ref{2f24,,GNUTYPE_SPARSE}. @ref{1416,,TarInfo} 객체의 유형을 더 편리하게 결정하려면, 아래 @code{is*()} 메서드를 사용하십시오.
@end deffn

@geindex linkname (tarfile.TarInfo의 속성)
@anchor{library/tarfile tarfile TarInfo linkname}@anchor{2f3d}
@deffn {속성} TarInfo.linkname: @ref{169,,str}

대상 파일 이름의 이름, @ref{2f1b,,LNKTYPE}과 @ref{2f1c,,SYMTYPE} 유형의 @ref{1416,,TarInfo} 객체에만 존재합니다.

For symbolic links (@code{SYMTYPE}), the `linkname' is relative to the directory
that contains the link.
For hard links (@code{LNKTYPE}), the `linkname' is relative to the root of
the archive.
@end deffn

@geindex uid (tarfile.TarInfo의 속성)
@anchor{library/tarfile tarfile TarInfo uid}@anchor{2f3e}
@deffn {속성} TarInfo.uid: @ref{19b,,int}

이 멤버를 처음 저장한 사용자의 사용자 ID.


버전 3.12에서 변경: Can be set to @code{None} for @ref{29c,,extract()} and
@ref{29b,,extractall()}, causing extraction to skip applying this
attribute.

@end deffn

@geindex gid (tarfile.TarInfo의 속성)
@anchor{library/tarfile tarfile TarInfo gid}@anchor{2f3f}
@deffn {속성} TarInfo.gid: @ref{19b,,int}

이 멤버를 처음 저장한 사용자의 그룹 ID.


버전 3.12에서 변경: Can be set to @code{None} for @ref{29c,,extract()} and
@ref{29b,,extractall()}, causing extraction to skip applying this
attribute.

@end deffn

@geindex uname (tarfile.TarInfo의 속성)
@anchor{library/tarfile tarfile TarInfo uname}@anchor{2f40}
@deffn {속성} TarInfo.uname: @ref{169,,str}

사용자 이름.


버전 3.12에서 변경: Can be set to @code{None} for @ref{29c,,extract()} and
@ref{29b,,extractall()}, causing extraction to skip applying this
attribute.

@end deffn

@geindex gname (tarfile.TarInfo의 속성)
@anchor{library/tarfile tarfile TarInfo gname}@anchor{2f41}
@deffn {속성} TarInfo.gname: @ref{169,,str}

그룹 이름.


버전 3.12에서 변경: Can be set to @code{None} for @ref{29c,,extract()} and
@ref{29b,,extractall()}, causing extraction to skip applying this
attribute.

@end deffn

@geindex chksum (tarfile.TarInfo의 속성)
@anchor{library/tarfile tarfile TarInfo chksum}@anchor{2f42}
@deffn {속성} TarInfo.chksum: @ref{19b,,int}

Header checksum.
@end deffn

@geindex devmajor (tarfile.TarInfo의 속성)
@anchor{library/tarfile tarfile TarInfo devmajor}@anchor{2f43}
@deffn {속성} TarInfo.devmajor: @ref{19b,,int}

Device major number.
@end deffn

@geindex devminor (tarfile.TarInfo의 속성)
@anchor{library/tarfile tarfile TarInfo devminor}@anchor{2f44}
@deffn {속성} TarInfo.devminor: @ref{19b,,int}

Device minor number.
@end deffn

@geindex offset (tarfile.TarInfo의 속성)
@anchor{library/tarfile tarfile TarInfo offset}@anchor{2f45}
@deffn {속성} TarInfo.offset: @ref{19b,,int}

The tar header starts here.
@end deffn

@geindex offset_data (tarfile.TarInfo의 속성)
@anchor{library/tarfile tarfile TarInfo offset_data}@anchor{2f46}
@deffn {속성} TarInfo.offset_data: @ref{19b,,int}

The file’s data starts here.
@end deffn

@geindex sparse (tarfile.TarInfo의 속성)
@anchor{library/tarfile tarfile TarInfo sparse}@anchor{2f47}
@deffn {속성} TarInfo.sparse

Sparse member information.
@end deffn

@geindex pax_headers (tarfile.TarInfo의 속성)
@anchor{library/tarfile tarfile TarInfo pax_headers}@anchor{2f48}
@deffn {속성} TarInfo.pax_headers: @ref{183,,dict}

연관된 pax 확장 헤더의 키-값 쌍을 포함하는 딕셔너리.
@end deffn

@geindex replace() (tarfile.TarInfo 메서드)
@anchor{library/tarfile tarfile TarInfo replace}@anchor{2f36}
@deffn {메서드} TarInfo.replace (name=..., mtime=..., mode=..., linkname=..., uid=..., gid=..., uname=..., gname=..., deep=True)


Added in version 3.12.


Return a `new' copy of the @code{TarInfo} object with the given attributes
changed. For example, to return a @code{TarInfo} with the group name set to
@code{'staff'}, use:

@example
new_tarinfo = old_tarinfo.replace(gname='staff')
@end example

By default, a deep copy is made.
If `deep' is false, the copy is shallow, i.e. @code{pax_headers}
and any custom attributes are shared with the original @code{TarInfo} object.
@end deffn

@ref{1416,,TarInfo} 객체는 편리한 조회 메서드도 제공합니다:

@geindex isfile() (tarfile.TarInfo 메서드)
@anchor{library/tarfile tarfile TarInfo isfile}@anchor{2f49}
@deffn {메서드} TarInfo.isfile ()

@ref{1416,,TarInfo} 객체가 일반 파일이면 @ref{e06,,True}를 반환합니다.
@end deffn

@geindex isreg() (tarfile.TarInfo 메서드)
@anchor{library/tarfile tarfile TarInfo isreg}@anchor{2f4a}
@deffn {메서드} TarInfo.isreg ()

@ref{2f49,,isfile()}과 같습니다.
@end deffn

@geindex isdir() (tarfile.TarInfo 메서드)
@anchor{library/tarfile tarfile TarInfo isdir}@anchor{2f4b}
@deffn {메서드} TarInfo.isdir ()

디렉터리이면 @ref{e06,,True}를 반환합니다.
@end deffn

@geindex issym() (tarfile.TarInfo 메서드)
@anchor{library/tarfile tarfile TarInfo issym}@anchor{2f4c}
@deffn {메서드} TarInfo.issym ()

심볼릭 링크이면 @ref{e06,,True}를 반환합니다.
@end deffn

@geindex islnk() (tarfile.TarInfo 메서드)
@anchor{library/tarfile tarfile TarInfo islnk}@anchor{2f4d}
@deffn {메서드} TarInfo.islnk ()

하드 링크이면 @ref{e06,,True}를 반환합니다.
@end deffn

@geindex ischr() (tarfile.TarInfo 메서드)
@anchor{library/tarfile tarfile TarInfo ischr}@anchor{2f4e}
@deffn {메서드} TarInfo.ischr ()

문자 장치이면 @ref{e06,,True}를 반환합니다.
@end deffn

@geindex isblk() (tarfile.TarInfo 메서드)
@anchor{library/tarfile tarfile TarInfo isblk}@anchor{2f4f}
@deffn {메서드} TarInfo.isblk ()

블록 장치이면 @ref{e06,,True}를 반환합니다.
@end deffn

@geindex isfifo() (tarfile.TarInfo 메서드)
@anchor{library/tarfile tarfile TarInfo isfifo}@anchor{2f50}
@deffn {메서드} TarInfo.isfifo ()

FIFO이면 @ref{e06,,True}를 반환합니다.
@end deffn

@geindex isdev() (tarfile.TarInfo 메서드)
@anchor{library/tarfile tarfile TarInfo isdev}@anchor{2f51}
@deffn {메서드} TarInfo.isdev ()

문자 장치, 블록 장치 또는 FIFO 중 하나이면 @ref{e06,,True}를 반환합니다.
@end deffn

@node Extraction filters,명령 줄 인터페이스,TarInfo 객체,tarfile — tar 아카이브 파일 읽기와 쓰기
@anchor{library/tarfile extraction-filters}@anchor{2f52}@anchor{library/tarfile tarfile-extraction-filter}@anchor{696}
@subsubsection Extraction filters



Added in version 3.12.


The `tar' format is designed to capture all details of a UNIX-like filesystem,
which makes it very powerful.
Unfortunately, the features make it easy to create tar files that have
unintended – and possibly malicious – effects when extracted.
For example, extracting a tar file can overwrite arbitrary files in various
ways (e.g.  by using absolute paths, @code{..} path components, or symlinks that
affect later members).

In most cases, the full functionality is not needed.
Therefore, `tarfile' supports extraction filters: a mechanism to limit
functionality, and thus mitigate some of the security issues.

@cartouche
@quotation 경고 
None of the available filters blocks `all' dangerous archive features.
Never extract archives from untrusted sources without prior inspection.
See also @ref{2d1b,,Hints for further verification}.
@end quotation
@end cartouche


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 706

@item PEP 706@footnote{https://peps.python.org/pep-0706/}

Contains further motivation and rationale behind the design.
@end table


The `filter' argument to @ref{29c,,TarFile.extract()} or @ref{29b,,extractall()}
can be:


@itemize *

@item 
the string @code{'fully_trusted'}: Honor all metadata as specified in the
archive.
Should be used if the user trusts the archive completely, or implements
their own complex verification.

@item 
the string @code{'tar'}: Honor most `tar'-specific features (i.e. features of
UNIX-like filesystems), but block features that are very likely to be
surprising or malicious. See @ref{2f53,,tar_filter()} for details.

@item 
the string @code{'data'}: Ignore or block most features specific to UNIX-like
filesystems. Intended for extracting cross-platform data archives.
See @ref{29a,,data_filter()} for details.

@item 
@code{None} (default): Use @ref{2f2f,,TarFile.extraction_filter}.

If that is also @code{None} (the default), the @code{'data'} filter will be used.

@quotation


버전 3.14에서 변경: The default filter is set to @ref{29a,,data}.
Previously, the default was equivalent to
@ref{2f05,,fully_trusted}.

@end quotation

@item 
A callable which will be called for each extracted member with a
@ref{2f11,,TarInfo} describing the member and the destination
path to where the archive is extracted (i.e. the same path is used for all
members):

@example
filter(member: TarInfo, path: str, /) -> TarInfo | None
@end example

The callable is called just before each member is extracted, so it can
take the current state of the disk into account.
It can:


@itemize -

@item 
return a @ref{1416,,TarInfo} object which will be used instead of the metadata
in the archive, or

@item 
return @code{None}, in which case the member will be skipped, or

@item 
raise an exception to abort the operation or skip the member,
depending on @ref{29e,,errorlevel}.
Note that when extraction is aborted, @ref{29b,,extractall()} may leave
the archive partially extracted. It does not attempt to clean up.
@end itemize
@end itemize

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

@end menu

@node Default named filters,Filter errors,,Extraction filters
@anchor{library/tarfile default-named-filters}@anchor{2f54}
@subsubsection Default named filters


The pre-defined, named filters are available as functions, so they can be
reused in custom filters:

@geindex fully_trusted_filter() (tarfile 모듈)
@anchor{library/tarfile tarfile fully_trusted_filter}@anchor{2f05}
@deffn {함수} tarfile.fully_trusted_filter (member, path)

Return `member' unchanged.

This implements the @code{'fully_trusted'} filter.
@end deffn

@geindex tar_filter() (tarfile 모듈)
@anchor{library/tarfile tarfile tar_filter}@anchor{2f53}
@deffn {함수} tarfile.tar_filter (member, path)

Implements the @code{'tar'} filter.


@itemize -

@item 
Strip leading slashes (@code{/} and @ref{879,,os.sep}) from filenames.

@item 
@ref{2f0f,,Refuse} to extract files with absolute
paths (in case the name is absolute
even after stripping slashes, e.g. @code{C:/foo} on Windows).
This raises @ref{2f12,,AbsolutePathError}.

@item 
@ref{2f0f,,Refuse} to extract files whose absolute
path (after following symlinks) would end up outside the destination.
This raises @ref{2f13,,OutsideDestinationError}.

@item 
Clear high mode bits (setuid, setgid, sticky) and group/other write bits
(@ref{2ca7,,S_IWGRP} | @ref{2caa,,S_IWOTH}).
@end itemize

Return the modified @code{TarInfo} member.
@end deffn

@geindex data_filter() (tarfile 모듈)
@anchor{library/tarfile tarfile data_filter}@anchor{29a}
@deffn {함수} tarfile.data_filter (member, path)

Implements the @code{'data'} filter.
In addition to what @code{tar_filter} does:


@itemize -

@item 
Normalize link targets (@ref{2f3d,,TarInfo.linkname}) using
@ref{151e,,os.path.normpath()}.
Note that this removes internal @code{..} components, which may change the
meaning of the link if the path in @code{TarInfo.linkname} traverses
symbolic links.

@item 
@ref{2f0f,,Refuse} to extract links (hard or soft)
that link to absolute paths, or ones that link outside the destination.

This raises @ref{2f15,,AbsoluteLinkError} or
@ref{2f16,,LinkOutsideDestinationError}.

Note that such files are refused even on platforms that do not support
symbolic links.

@item 
@ref{2f0f,,Refuse} to extract device files
(including pipes).
This raises @ref{2f14,,SpecialFileError}.

@item 
For regular files, including hard links:


@itemize -

@item 
Set the owner read and write permissions
(@ref{2ca2,,S_IRUSR} | @ref{2ca3,,S_IWUSR}).

@item 
Remove the group & other executable permission
(@ref{2c9e,,S_IXGRP} | @ref{2cab,,S_IXOTH})
if the owner doesn’t have it (@ref{2ca4,,S_IXUSR}).
@end itemize

@item 
For other files (directories), set @code{mode} to @code{None}, so
that extraction methods skip applying permission bits.

@item 
Set user and group info (@code{uid}, @code{gid}, @code{uname}, @code{gname})
to @code{None}, so that extraction methods skip setting it.
@end itemize

Return the modified @code{TarInfo} member.

Note that this filter does not block `all' dangerous archive features.
See @ref{2d1b,,Hints for further verification}  for details.


버전 3.14에서 변경: Link targets are now normalized.

@end deffn

@node Filter errors,Hints for further verification,Default named filters,Extraction filters
@anchor{library/tarfile filter-errors}@anchor{2f55}@anchor{library/tarfile tarfile-extraction-refuse}@anchor{2f0f}
@subsubsection Filter errors


When a filter refuses to extract a file, it will raise an appropriate exception,
a subclass of @ref{2f0e,,FilterError}.
This will abort the extraction if @ref{29e,,TarFile.errorlevel} is 1 or more.
With @code{errorlevel=0} the error will be logged and the member will be skipped,
but extraction will continue.

@node Hints for further verification,Supporting older Python versions,Filter errors,Extraction filters
@anchor{library/tarfile hints-for-further-verification}@anchor{2f56}@anchor{library/tarfile tarfile-further-verification}@anchor{2d1b}
@subsubsection Hints for further verification


Even with @code{filter='data'}, `tarfile' is not suited for extracting untrusted
files without prior inspection.
Among other issues, the pre-defined filters do not prevent denial-of-service
attacks. Users should do additional checks.

Here is an incomplete list of things to consider:


@itemize *

@item 
Extract to a @ref{52d,,new temporary directory}
to prevent e.g. exploiting pre-existing links, and to make it easier to
clean up after a failed extraction.

@item 
Disallow symbolic links if you do not need the functionality.

@item 
When working with untrusted data, use external (e.g. OS-level) limits on
disk, memory and CPU usage.

@item 
Check filenames against an allow-list of characters
(to filter out control characters, confusables, foreign path separators,
and so on).

@item 
Check that filenames have expected extensions (discouraging files that
execute when you “click on them”, or extension-less files like Windows
special device names).

@item 
Limit the number of extracted files, total size of extracted data,
filename length (including symlink length), and size of individual files.

@item 
Check for files that would be shadowed on case-insensitive filesystems.
@end itemize

Also note that:


@itemize *

@item 
Tar files may contain multiple versions of the same file.
Later ones are expected to overwrite any earlier ones.
This feature is crucial to allow updating tape archives, but can be abused
maliciously.

@item 
`tarfile' does not protect against issues with “live” data,
e.g. an attacker tinkering with the destination (or source) directory while
extraction (or archiving) is in progress.
@end itemize

@node Supporting older Python versions,Stateful extraction filter example,Hints for further verification,Extraction filters
@anchor{library/tarfile supporting-older-python-versions}@anchor{2f57}
@subsubsection Supporting older Python versions


Extraction filters were added to Python 3.12, but may be backported to older
versions as security updates.
To check whether the feature is available, use e.g.
@code{hasattr(tarfile, 'data_filter')} rather than checking the Python version.

The following examples show how to support Python versions with and without
the feature.
Note that setting @code{extraction_filter} will affect any subsequent operations.


@itemize *

@item 
Fully trusted archive:

@example
my_tarfile.extraction_filter = (lambda member, path: member)
my_tarfile.extractall()
@end example

@item 
Use the @code{'data'} filter if available, but revert to Python 3.11 behavior
(@code{'fully_trusted'}) if this feature is not available:

@example
my_tarfile.extraction_filter = getattr(tarfile, 'data_filter',
                                       (lambda member, path: member))
my_tarfile.extractall()
@end example

@item 
Use the @code{'data'} filter; `fail' if it is not available:

@example
my_tarfile.extractall(filter=tarfile.data_filter)
@end example

or:

@example
my_tarfile.extraction_filter = tarfile.data_filter
my_tarfile.extractall()
@end example

@item 
Use the @code{'data'} filter; `warn' if it is not available:

@example
if hasattr(tarfile, 'data_filter'):
    my_tarfile.extractall(filter='data')
else:
    # 더는 필요하지 않을 때 제거하세요
    warn_the_user('Extracting may be unsafe; consider updating Python')
    my_tarfile.extractall()
@end example
@end itemize

@node Stateful extraction filter example,,Supporting older Python versions,Extraction filters
@anchor{library/tarfile stateful-extraction-filter-example}@anchor{2f58}
@subsubsection Stateful extraction filter example


While `tarfile'’s extraction methods take a simple `filter' callable,
custom filters may be more complex objects with an internal state.
It may be useful to write these as context managers, to be used like this:

@example
with StatefulFilter() as filter_func:
    tar.extractall(path, filter=filter_func)
@end example

Such a filter can be written as, for example:

@example
class StatefulFilter:
    def __init__(self):
        self.file_count = 0

    def __enter__(self):
        return self

    def __call__(self, member, path):
        self.file_count += 1
        return member

    def __exit__(self, *exc_info):
        print(f'@{self.file_count@} files extracted')
@end example

@node 명령 줄 인터페이스,예<5>,Extraction filters,tarfile — tar 아카이브 파일 읽기와 쓰기
@anchor{library/tarfile command-line-interface}@anchor{2f59}@anchor{library/tarfile tarfile-commandline}@anchor{11ca}
@subsubsection 명령 줄 인터페이스



Added in version 3.4.


The @code{tarfile} module provides a simple command-line interface to interact
with tar archives.

새 tar 아카이브를 만들려면, @ref{2f5a,,-c} 옵션 뒤에 이름을 지정한 다음 포함해야 하는 파일 이름을 나열하십시오:

@example
$ python -m tarfile -c monty.tar  spam.txt eggs.txt
@end example

디렉터리 전달도 허용됩니다:

@example
$ python -m tarfile -c monty.tar life-of-brian_1979/
@end example

tar 아카이브를 현재 디렉터리로 추출하려면, @ref{2f5b,,-e} 옵션을 사용하십시오:

@example
$ python -m tarfile -e monty.tar
@end example

디렉터리 이름을 전달하여 tar 아카이브를 다른 디렉터리로 추출할 수도 있습니다:

@example
$ python -m tarfile -e monty.tar  other-dir/
@end example

tar 아카이브에 있는 파일 목록을 보려면, @ref{2f5c,,-l} 옵션을 사용하십시오:

@example
$ python -m tarfile -l monty.tar
@end example

@menu
* 명령 줄 옵션: 명령 줄 옵션<2>. 

@end menu

@node 명령 줄 옵션<2>,,,명령 줄 인터페이스
@anchor{library/tarfile command-line-options}@anchor{2f5d}
@subsubsection 명령 줄 옵션


@geindex tarfile 명령줄 옵션; -l
@geindex tarfile 명령줄 옵션; --list
@anchor{library/tarfile cmdoption-tarfile-l}@anchor{2f5c}
@deffn {Option} @w{-}l <tarfile>
@anchor{library/tarfile cmdoption-tarfile-list}@anchor{2f5e}
@deffnx {Option} @w{-}@w{-}list <tarfile>

tarfile에 있는 파일을 나열합니다.
@end deffn

@geindex tarfile 명령줄 옵션; -c
@geindex tarfile 명령줄 옵션; --create
@anchor{library/tarfile cmdoption-tarfile-c}@anchor{2f5a}
@deffn {Option} @w{-}c <tarfile> <source1> ... <sourceN>
@anchor{library/tarfile cmdoption-tarfile-create}@anchor{2f5f}
@deffnx {Option} @w{-}@w{-}create <tarfile> <source1> ... <sourceN>

소스 파일에서 tarfile을 만듭니다.
@end deffn

@geindex tarfile 명령줄 옵션; -e
@geindex tarfile 명령줄 옵션; --extract
@anchor{library/tarfile cmdoption-tarfile-e}@anchor{2f5b}
@deffn {Option} @w{-}e <tarfile> [<output_dir>]
@anchor{library/tarfile cmdoption-tarfile-extract}@anchor{2f60}
@deffnx {Option} @w{-}@w{-}extract <tarfile> [<output_dir>]

`output_dir'이 지정되지 않으면 tarfile을 현재 디렉터리로 추출합니다.
@end deffn

@geindex tarfile 명령줄 옵션; -t
@geindex tarfile 명령줄 옵션; --test
@anchor{library/tarfile cmdoption-tarfile-t}@anchor{2f61}
@deffn {Option} @w{-}t <tarfile>
@anchor{library/tarfile cmdoption-tarfile-test}@anchor{2f62}
@deffnx {Option} @w{-}@w{-}test <tarfile>

tarfile이 유효한지 테스트합니다.
@end deffn

@geindex tarfile 명령줄 옵션; -v
@geindex tarfile 명령줄 옵션; --verbose
@anchor{library/tarfile cmdoption-tarfile-v}@anchor{2f63}@anchor{library/tarfile cmdoption-tarfile-verbose}@anchor{2f64}
@deffn {Option} @w{-}v, @w{-}@w{-}verbose

상세한 출력.
@end deffn

@geindex tarfile 명령줄 옵션; --filter
@anchor{library/tarfile cmdoption-tarfile-filter}@anchor{2f65}
@deffn {Option} @w{-}@w{-}filter <filtername>

Specifies the `filter' for @code{--extract}.
See @ref{696,,Extraction filters} for details.
Only string names are accepted (that is, @code{fully_trusted}, @code{tar},
and @code{data}).
@end deffn

@node 예<5>,지원되는 tar 형식,명령 줄 인터페이스,tarfile — tar 아카이브 파일 읽기와 쓰기
@anchor{library/tarfile examples}@anchor{2f66}@anchor{library/tarfile tar-examples}@anchor{2f08}
@subsubsection 예


@menu
* Reading examples:: 
* Writing examples:: 

@end menu

@node Reading examples,Writing examples,,예<5>
@anchor{library/tarfile reading-examples}@anchor{2f67}
@subsubsection Reading examples


전체 tar 아카이브를 현재 작업 디렉터리로 추출하는 방법:

@example
import tarfile
tar = tarfile.open("sample.tar.gz")
tar.extractall(filter='data')
tar.close()
@end example

리스트 대신 제너레이터 함수를 사용하여 @ref{29b,,TarFile.extractall()}로 tar 아카이브의 부분집합을 추출하는 방법:

@example
import os
import tarfile

def py_files(members):
    for tarinfo in members:
        if os.path.splitext(tarinfo.name)[1] == ".py":
            yield tarinfo

tar = tarfile.open("sample.tar.gz")
tar.extractall(members=py_files(tar))
tar.close()
@end example

gzip 압축 tar 아카이브를 읽고 일부 멤버 정보를 표시하는 방법:

@example
import tarfile
tar = tarfile.open("sample.tar.gz", "r:gz")
for tarinfo in tar:
    print(tarinfo.name, "is", tarinfo.size, "bytes in size and is ", end="")
    if tarinfo.isreg():
        print("a regular file.")
    elif tarinfo.isdir():
        print("a directory.")
    else:
        print("something else.")
tar.close()
@end example

@node Writing examples,,Reading examples,예<5>
@anchor{library/tarfile writing-examples}@anchor{2f68}
@subsubsection Writing examples


파일명 리스트로 압축되지 않은 tar 아카이브를 만드는 방법:

@example
import tarfile
tar = tarfile.open("sample.tar", "w")
for name in ["foo", "bar", "quux"]:
    tar.add(name)
tar.close()
@end example

@ref{186,,with} 문을 사용한 같은 예제:

@example
import tarfile
with tarfile.open("sample.tar", "w") as tar:
    for name in ["foo", "bar", "quux"]:
        tar.add(name)
@end example

How to create and write an archive to stdout using
@ref{ccc,,sys.stdout.buffer} in the `fileobj' parameter
in @ref{ded,,TarFile.add()}:

@example
import sys
import tarfile
with tarfile.open("sample.tar.gz", "w|gz", fileobj=sys.stdout.buffer) as tar:
    for name in ["foo", "bar", "quux"]:
        tar.add(name)
@end example

@ref{ded,,TarFile.add()}의 `filter' 매개 변수를 사용하여 아카이브를 만들고 사용자 정보를 재설정하는 방법:

@example
import tarfile
def reset(tarinfo):
    tarinfo.uid = tarinfo.gid = 0
    tarinfo.uname = tarinfo.gname = "root"
    return tarinfo
tar = tarfile.open("sample.tar.gz", "w:gz")
tar.add("foo", filter=reset)
tar.close()
@end example

@node 지원되는 tar 형식,유니코드 문제,예<5>,tarfile — tar 아카이브 파일 읽기와 쓰기
@anchor{library/tarfile supported-tar-formats}@anchor{2f69}@anchor{library/tarfile tar-formats}@anchor{2f25}
@subsubsection 지원되는 tar 형식


There are three tar formats that can be created with the @code{tarfile} module:


@itemize *

@item 
POSIX.1-1988 ustar 형식 (@ref{2f26,,USTAR_FORMAT}). 최대 256자 길이의 파일명과 최대 100자 링크 이름을 지원합니다. 최대 파일 크기는 8 GiB입니다. 이것은 오래되고 제한적이지만 널리 지원되는 형식입니다.

@item 
The GNU tar format (@ref{2f27,,GNU_FORMAT}). It supports long filenames and
linknames, files bigger than 8 GiB and sparse files. It is the de facto
standard on GNU/Linux systems. @code{tarfile} fully supports the GNU tar
extensions for long names, sparse file support is read-only.

@item 
POSIX.1-2001 pax 형식 (@ref{2f28,,PAX_FORMAT}). 사실상 제한이 없는 가장 유연한 형식입니다. 긴 파일명과 링크 이름, 큰 파일을 지원하며 경로명을 이식성 있는 방식으로 저장합니다. GNU tar, bsdtar/libarchive 및 star를 포함한 최신 tar 구현은 확장된 `pax' 기능을 완벽하게 지원합니다; 일부 오래되었거나 유지 관리되지 않는 라이브러리는 그렇지 않을 수 있지만, `pax' 아카이브를 마치 범용적으로 지원되는 `ustar' 형식인 것처럼 취급해야 합니다. 새 아카이브의 현재 기본 형식입니다.

다른 방법으로 저장할 수 없는 정보를 위해 추가 헤더를 사용하여 기존 `ustar' 형식을 확장합니다. pax 헤더에는 두 가지 종류가 있습니다: 확장(extended) 헤더는 후속 파일 헤더에만 영향을 미치며, 전역(global) 헤더는 전체 아카이브에 유효하며 뒤따르는 파일 모두에 영향을 미칩니다. pax 헤더의 모든 데이터는 이식성의 이유로 `UTF-8'로 인코딩됩니다.
@end itemize

읽을 수는 있지만 만들 수 없는 tar 형식의 변형이 더 있습니다:


@itemize *

@item 
고대 V7 형식. 이것은 일반 파일과 디렉터리 만 저장하는 유닉스 7판(Unix Seventh Edition)에서 온 첫 번째 tar 형식입니다. 이름은 100자 이하여야 합니다. 사용자/그룹 이름 정보는 없습니다. ASCII가 아닌 문자가 있는 필드의 경우 일부 아카이브에서 헤더 체크섬이 잘못 계산되었습니다.

@item 
SunOS tar 확장 형식. 이 형식은 POSIX.1-2001 pax 형식의 변형이지만, 호환되지 않습니다.
@end itemize

@node 유니코드 문제,,지원되는 tar 형식,tarfile — tar 아카이브 파일 읽기와 쓰기
@anchor{library/tarfile tar-unicode}@anchor{2f2b}@anchor{library/tarfile unicode-issues}@anchor{2f6a}
@subsubsection 유니코드 문제


tar 형식은 원래 파일 시스템 정보 보존에 중점을 두고 테이프 드라이브에서 백업하기 위해 고안되었습니다. 현재 tar 아카이브는 일반적으로 파일 배포와 네트워크를 통한 아카이브 교환에 사용됩니다. 원래 형식(다른 모든 형식의 기초)의 한 가지 문제점은 다른 문자 인코딩을 지원한다는 개념이 없다는 것입니다. 예를 들어, `UTF-8' 시스템에서 만들어진 일반 tar 아카이브는 `ASCII'가 아닌 문자가 포함되면 `Latin-1' 시스템에서 올바르게 읽을 수 없습니다. (파일명, 링크 이름, 사용자/그룹 이름과 같은) 텍스트 메타 데이터가 손상된 것으로 나타납니다. 불행히도, 아카이브의 인코딩을 자동 감지하는 방법은 없습니다. pax 형식은 이 문제를 해결하도록 설계되었습니다. 범용 문자 인코딩 `UTF-8'을 사용하여 ASCII가 아닌 메타 데이터를 저장합니다.

The details of character conversion in @code{tarfile} are controlled by the
`encoding' and `errors' keyword arguments of the @ref{1415,,TarFile} class.

`encoding'은 아카이브의 메타 데이터에 사용할 문자 인코딩을 정의합니다. 기본값은 @ref{e52,,sys.getfilesystemencoding()} 이고, 또는 폴 백으로 @code{'ascii'}입니다. 아카이브를 읽거나 쓰는지에 따라, 메타 데이터를 디코딩하거나 인코딩해야 합니다. `encoding'이 올바르게 설정되지 않으면, 이 변환이 실패 할 수 있습니다.

`errors' 인자는 변환할 수 없는 문자를 처리하는 방법을 정의합니다. 가능한 값은 섹션 @ref{1b6d,,에러 처리기}에 나열되어 있습니다. 기본 체계는 파이썬은 파일 시스템 호출에도 사용하는 @code{'surrogateescape'}입니다, @ref{2f6b,,파일명@comma{} 명령 줄 인자 및 환경 변수}를 참조하십시오.

@ref{2f28,,PAX_FORMAT} 아카이브(기본값)의 경우, 모든 메타 데이터가 `UTF-8'을 사용하여 저장기 때문에 `encoding'은 일반적으로 필요하지 않습니다. `encoding'은 바이너리 pax 헤더가 디코딩되거나 서로게이트 문자가 있는 문자열이 저장될 때와 같은 드문 경우에만 사용됩니다.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 파일 형식,암호화 서비스,데이터 압축 및 보관,파이썬 표준 라이브러리
@anchor{library/fileformats doc}@anchor{2f6c}@anchor{library/fileformats file-formats}@anchor{2f6d}@anchor{library/fileformats fileformats}@anchor{2f6e}@anchor{library/fileformats translation-repo}@anchor{2f6f}
@section 파일 형식


이 장에서 설명하는 모듈들은 마크업 언어가 아니고 전자 메일과 무관한 다양한 파일 형식을 구문 분석합니다.

@menu
* csv — CSV 파일 읽기와 쓰기:: 
* configparser — 구성 파일 구문 분석기:: 
* tomllib — Parse TOML files:: 
* netrc — netrc 파일 처리:: 
* plistlib — 애플 .plist 파일 생성과 구문 분석: plistlib — 애플 plist 파일 생성과 구문 분석. 

@end menu

@node csv — CSV 파일 읽기와 쓰기,configparser — 구성 파일 구문 분석기,,파일 형식
@anchor{library/csv doc}@anchor{2f70}@anchor{library/csv csv-csv-file-reading-and-writing}@anchor{2f71}@anchor{library/csv module-csv}@anchor{2d}
@subsection @code{csv} — CSV 파일 읽기와 쓰기


@geindex module; csv

`소스 코드:' Lib/csv.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/csv.py}

@geindex csv
@geindex 데이터;표 형식


__________________________________________________________________


소위 CSV (Comma Separated Values – 쉼표로 구분된 값) 형식은 스프레드시트와 데이터베이스에 대한 가장 일반적인 가져오기 및 내보내기 형식입니다. CSV 형식은 
@geindex RFC; RFC 4180
RFC 4180@footnote{https://datatracker.ietf.org/doc/html/rfc4180.html}에서 표준화된 방식으로 형식을 기술하기 전에 여러 해 동안 사용되었습니다. 잘 정의된 표준이 없다는 것은 다른 애플리케이션에 의해 생성되고 소비되는 데이터에 미묘한 차이가 존재한다는 것을 의미합니다. 이러한 차이로 인해 여러 소스의 CSV 파일을 처리하는 것이 번거로울 수 있습니다. 그러나 분리 문자와 인용 문자가 다양하기는 해도, 전체 형식은 유사하여 프로그래머에게 데이터 읽기와 쓰기 세부 사항을 숨기면서도 이러한 데이터를 효율적으로 조작할 수 있는 단일 모듈을 작성하는 것이 가능합니다.

The @code{csv} module implements classes to read and write tabular data in CSV
format.  It allows programmers to say, “write this data in the format preferred
by Excel,” or “read data from this file which was generated by Excel,” without
knowing the precise details of the CSV format used by Excel.  Programmers can
also describe the CSV formats understood by other applications or define their
own special-purpose CSV formats.

The @code{csv} module’s @ref{6ad,,reader} and @ref{6ae,,writer} objects read and
write sequences.  Programmers can also read and write data in dictionary form
using the @ref{bd7,,DictReader} and @ref{1403,,DictWriter} classes.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 305

@item PEP 305@footnote{https://peps.python.org/pep-0305/} - CSV File API

파이썬에 이 모듈의 추가를 제안한 파이썬 개선 제안.
@end table


@menu
* 모듈 내용: 모듈 내용<2>. 
* 방언과 포매팅 파라미터:: 
* 판독기 객체:: 
* 기록기 객체:: 
* 예제: 예제<10>. 

@end menu

@node 모듈 내용<2>,방언과 포매팅 파라미터,,csv — CSV 파일 읽기와 쓰기
@anchor{library/csv csv-contents}@anchor{2f72}@anchor{library/csv module-contents}@anchor{2f73}
@subsubsection 모듈 내용


The @code{csv} module defines the following functions:

@geindex 유니버설 줄 넘김;csv.reader 함수

@geindex reader() (csv 모듈)
@anchor{library/csv csv reader}@anchor{6ad}
@deffn {함수} csv.reader (csvfile, /, dialect='excel', **fmtparams)

지정된 `csvfile'의 줄을 처리하는 @ref{2f74,,판독기(reader) 객체}를 반환합니다. csvfile은 문자열의 이터러블이어야 하며, 각 문자열은 판독기가 정의한 csv 형식이어야 합니다. csvfile은 보통 파일류 객체이거나 리스트입니다. `csvfile'가 파일 객체이면, @code{newline='@w{'}}로 열렸어야 합니다. @footnote{
If @code{newline='@w{'}} is not specified, newlines embedded inside quoted fields
will not be interpreted correctly, and on platforms that use @code{\r\n} line endings
on write an extra @code{\r} will be added.  It should always be safe to specify
@code{newline='@w{'}}, since the csv module does its own
(@ref{f34,,universal}) newline handling.
} 특정 CSV 방언(dialect)에만 적용되는 파라미터 집합을 정의하는 데 사용되는 선택적 `dialect' 매개 변수를 지정할 수 있습니다. @ref{182a,,Dialect} 클래스의 서브 클래스의 인스턴스이거나 @ref{1b92,,list_dialects()} 함수가 반환하는 문자열 중 하나일 수 있습니다. 다른 선택적 `fmtparams' 키워드 인자는 현재 방언의 개별 포매팅 파라미터를 대체 할 수 있습니다. 방언과 포매팅 파라미터에 대한 자세한 내용은 @ref{2f75,,방언과 포매팅 파라미터} 절을 참조하십시오.

Each row read from the csv file is returned as a list of strings.  No
automatic data type conversion is performed unless the @ref{1948,,QUOTE_NONNUMERIC} format
option is specified (in which case unquoted fields are transformed into floats).

간단한 사용 예:

@example
>>> import csv
>>> with open('eggs.csv', newline='@w{'}) as csvfile:
...     spamreader = csv.reader(csvfile, delimiter=' ', quotechar='|')
...     for row in spamreader:
...         print(', '.join(row))
Spam, Spam, Spam, Spam, Spam, Baked Beans
Spam, Lovely Spam, Wonderful Spam
@end example
@end deffn

@geindex writer() (csv 모듈)
@anchor{library/csv csv writer}@anchor{6ae}
@deffn {함수} csv.writer (csvfile, /, dialect='excel', **fmtparams)

지정된 파일류 객체에 분리된 문자열로 사용자의 데이터를 변환하는 기록기(writer) 객체를 반환합니다. `csvfile'은 @ref{2059,,write()} 메서드가 있는 모든 객체일 수 있습니다. `csvfile'이 파일 객체면, @code{newline='@w{'}}으로 열렸어야 합니다 @footnote{
If @code{newline='@w{'}} is not specified, newlines embedded inside quoted fields
will not be interpreted correctly, and on platforms that use @code{\r\n} line endings
on write an extra @code{\r} will be added.  It should always be safe to specify
@code{newline='@w{'}}, since the csv module does its own
(@ref{f34,,universal}) newline handling.
}. 특정 CSV 방언(dialect)에만 적용되는 파라미터 집합을 정의하는 데 사용되는 선택적 `dialect' 매개 변수를 지정할 수 있습니다. @ref{182a,,Dialect} 클래스의 서브 클래스의 인스턴스이거나 @ref{1b92,,list_dialects()} 함수가 반환하는 문자열 중 하나일 수 있습니다. 다른 선택적 `fmtparams' 키워드 인자는 현재 방언의 개별 포매팅 파라미터를 대체 할 수 있습니다. 방언과 포매팅 파라미터에 대한 자세한 내용은 @ref{2f75,,방언과 포매팅 파라미터} 절을 참조하십시오. DB API를 구현하는 모듈과 가능한 한 쉽게 인터페이스 하기 위해, 값 @ref{884,,None}은 빈 문자열로 기록됩니다. 이것은 가역 변환이 아니지만, @code{cursor.fetch*} 호출에서 반환된 데이터를 전처리하지 않고도, SQL NULL 데이터값을 CSV 파일로 쉽게 덤프할 수 있습니다. 다른 모든 비 문자열 데이터는 기록 전에 @ref{169,,str()}로 문자열화 됩니다.

간단한 사용 예:

@example
import csv
with open('eggs.csv', 'w', newline='@w{'}) as csvfile:
    spamwriter = csv.writer(csvfile, delimiter=' ',
                            quotechar='|', quoting=csv.QUOTE_MINIMAL)
    spamwriter.writerow(['Spam'] * 5 + ['Baked Beans'])
    spamwriter.writerow(['Spam', 'Lovely Spam', 'Wonderful Spam'])
@end example
@end deffn

@geindex register_dialect() (csv 모듈)
@anchor{library/csv csv register_dialect}@anchor{193a}
@deffn {함수} csv.register_dialect (name, /, dialect='excel', **fmtparams)

`dialect'를 `name'과 연관시킵니다. `name'은 문자열이어야 합니다. 방언은 @ref{182a,,Dialect}의 서브 클래스 전달, `fmtparams' 키워드 인자 또는 둘 모두를 사용하여 지정할 수 있는데, 키워드 인자가 dialect의 매개 변수보다 우선합니다. 방언과 포매팅 파라미터에 대한 자세한 내용은 @ref{2f75,,방언과 포매팅 파라미터} 절을 참조하십시오.
@end deffn

@geindex unregister_dialect() (csv 모듈)
@anchor{library/csv csv unregister_dialect}@anchor{1b91}
@deffn {함수} csv.unregister_dialect (name)

방언(dialect) 등록소에서 `name'과 관련된 연관된 방언을 삭제합니다. `name'이 등록된 방언 이름이 아니면 @ref{2f76,,Error}가 발생합니다.
@end deffn

@geindex get_dialect() (csv 모듈)
@anchor{library/csv csv get_dialect}@anchor{1b90}
@deffn {함수} csv.get_dialect (name)

`name'과 연관된 방언을 반환합니다. `name'이 등록된 방언 이름이 아니면 @ref{2f76,,Error}가 발생합니다. 이 함수는 불변 @ref{182a,,Dialect}를 반환합니다.
@end deffn

@geindex list_dialects() (csv 모듈)
@anchor{library/csv csv list_dialects}@anchor{1b92}
@deffn {함수} csv.list_dialects ()

등록된 모든 방언의 이름을 반환합니다.
@end deffn

@geindex field_size_limit() (csv 모듈)
@anchor{library/csv csv field_size_limit}@anchor{1b8f}
@deffn {함수} csv.field_size_limit ()

@deffnx {함수} csv.field_size_limit (new_limit)

구문 분석기가 허락하는 현재의 최대 필드 크기를 반환합니다. `new_limit'가 주어지면, 이것이 새로운 한계가 됩니다.
@end deffn

The @code{csv} module defines the following classes:

@geindex DictReader (csv 클래스)
@anchor{library/csv csv DictReader}@anchor{bd7}
@deffn {클래스} csv.DictReader (f, fieldnames=None, restkey=None, restval=None, dialect='excel', *args, **kwds)

일반 판독기처럼 작동하지만 각 행(row)의 정보를 키가 선택적 `fieldnames' 매개 변수로 지정된 @ref{183,,dict}로 매핑하는 객체를 만듭니다.

`fieldnames' 매개 변수는 @ref{715,,시퀀스}입니다. `fieldnames'를 생략하면, 파일 `f'의 첫 번째 행에 있는 값들을 fieldnames로 사용하며 결과에서 생략됩니다. `fieldnames'를 제공하면, 사용되고 첫 번째 행은 결과에 포함됩니다. 필드 이름이 어떻게 결정되는지와 관계없이, 딕셔너리는 원래 순서를 유지합니다.

행에 fieldnames보다 많은 필드가 있으면, 나머지 데이터가 리스트에 저장되고 `restkey'(기본값은 @code{None})로 지정된 필드 이름으로 저장됩니다. 비어 있지 않은 행에 fieldnames보다 필드 수가 적다면, 빠진 값은 `restval'(기본값은 @code{None})의 값으로 채워집니다.

다른 모든 선택적 또는 키워드 인자는 하부 @ref{6ad,,reader} 인스턴스에 전달됩니다.

If the argument passed to `fieldnames' is an iterator, it will be coerced to a @ref{24d,,list}.


버전 3.6에서 변경: 반환된 행은 이제 @code{OrderedDict} 형입니다.



버전 3.8에서 변경: 반환된 행은 이제 @ref{183,,dict} 형입니다.


간단한 사용 예:

@example
>>> import csv
>>> with open('names.csv', newline='@w{'}) as csvfile:
...     reader = csv.DictReader(csvfile)
...     for row in reader:
...         print(row['first_name'], row['last_name'])
...
Eric Idle
John Cleese

>>> print(row)
@{'first_name': 'John', 'last_name': 'Cleese'@}
@end example
@end deffn

@geindex DictWriter (csv 클래스)
@anchor{library/csv csv DictWriter}@anchor{1403}
@deffn {클래스} csv.DictWriter (f, fieldnames, restval='@w{'}, extrasaction='raise', dialect='excel', *args, **kwds)

일반 기록기처럼 작동하지만 딕셔너리를 출력 행에 매핑하는 객체를 만듭니다. `fieldnames' 매개 변수는 키의 @ref{1f,,시퀀스}인데, @ref{fe8,,writerow()} 메서드에 전달된 딕셔너리의 값이 `f' 파일에 기록되는 순서를 식별합니다. 선택적 `restval' 매개 변수는 딕셔너리에 `fieldnames'의 키가 빠졌을 때 기록될 값을 지정합니다. @code{writerow()} 메서드에 전달된 딕셔너리에 `fieldnames'에 없는 키가 포함되어 있으면, 선택적 `extrasaction' 매개 변수가 수행할 작업을 지시합니다. 기본값인 @code{'raise'}로 설정되면, @ref{2ec,,ValueError}가 발생합니다. @code{'ignore'}로 설정하면, 딕셔너리의 추가 값이 무시됩니다. 다른 선택적 또는 키워드 인자는 하부 @ref{6ae,,writer} 인스턴스에 전달됩니다.

@ref{bd7,,DictReader} 클래스와 달리 @ref{1403,,DictWriter} 클래스의 `fieldnames' 매개 변수는 선택 사항이 아닙니다.

If the argument passed to `fieldnames' is an iterator, it will be coerced to a @ref{24d,,list}.

간단한 사용 예:

@example
import csv

with open('names.csv', 'w', newline='@w{'}) as csvfile:
    fieldnames = ['first_name', 'last_name']
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)

    writer.writeheader()
    writer.writerow(@{'first_name': 'Baked', 'last_name': 'Beans'@})
    writer.writerow(@{'first_name': 'Lovely', 'last_name': 'Spam'@})
    writer.writerow(@{'first_name': 'Wonderful', 'last_name': 'Spam'@})
@end example
@end deffn

@geindex Dialect (csv 클래스)
@anchor{library/csv csv Dialect}@anchor{182a}
@deffn {클래스} csv.Dialect

The @code{Dialect} class is a container class whose attributes contain
information for how to handle doublequotes, whitespace, delimiters, etc.
Due to the lack of a strict CSV specification, different applications
produce subtly different CSV data.  @code{Dialect} instances define how
@ref{6ad,,reader} and @ref{6ae,,writer} instances behave.

All available @code{Dialect} names are returned by @ref{1b92,,list_dialects()},
and they can be registered with specific @ref{6ad,,reader} and @ref{6ae,,writer}
classes through their initializer (@code{__init__}) functions like this:

@example
import csv

with open('students.csv', 'w', newline='@w{'}) as csvfile:
    writer = csv.writer(csvfile, dialect='unix')
@end example
@end deffn

@geindex excel (csv 클래스)
@anchor{library/csv csv excel}@anchor{2f77}
@deffn {클래스} csv.excel

@ref{2f77,,excel} 클래스는 Excel에서 생성한 CSV 파일의 일반적인 속성을 정의합니다. 방언 이름 @code{'excel'}로 등록됩니다.
@end deffn

@geindex excel_tab (csv 클래스)
@anchor{library/csv csv excel_tab}@anchor{2f78}
@deffn {클래스} csv.excel_tab

@ref{2f78,,excel_tab} 클래스는 Excel에서 생성된 TAB 구분 파일의 일반적인 속성을 정의합니다. 방언 이름 @code{'excel-tab'}으로 등록됩니다.
@end deffn

@geindex unix_dialect (csv 클래스)
@anchor{library/csv csv unix_dialect}@anchor{1402}
@deffn {클래스} csv.unix_dialect

@ref{1402,,unix_dialect} 클래스는 유닉스 시스템에서 생성된 CSV 파일의 일반적인 속성을 정의합니다. 즉, @code{'\n'}을 줄 종결자로 사용하고 모든 필드를 인용 처리합니다. 방언 이름 @code{'unix'}로 등록됩니다.


Added in version 3.2.

@end deffn

@geindex Sniffer (csv 클래스)
@anchor{library/csv csv Sniffer}@anchor{2f79}
@deffn {클래스} csv.Sniffer

@ref{2f79,,Sniffer} 클래스는 CSV 파일의 형식을 추론하는 데 사용됩니다.

@ref{2f79,,Sniffer} 클래스는 두 가지 메서드를 제공합니다:

@geindex sniff() (csv.Sniffer 메서드)
@anchor{library/csv csv Sniffer sniff}@anchor{2f7a}
@deffn {메서드} sniff (sample, delimiters=None)

지정된 `sample'을 분석하고 발견된 파라미터를 반영하는 @ref{182a,,Dialect} 서브 클래스를 반환합니다. 선택적인 `delimiters' 매개 변수를 주면, 가능한 유효한 구분 문자를 포함하는 문자열로 해석됩니다.
@end deffn

@geindex has_header() (csv.Sniffer 메서드)
@anchor{library/csv csv Sniffer has_header}@anchor{1c55}
@deffn {메서드} has_header (sample)

sample 텍스트(CSV 형식으로 추정합니다)를 분석하고, 첫 번째 행이 일련의 열 머리글로 보이면 @ref{e06,,True}를 반환합니다. 각 열을 검사하면서, 샘플에 헤더가 포함되어 있는지 추정하기 위해 두 가지 주요 기준 중 하나가 고려됩니다:


@itemize -

@item 
the second through n-th rows contain numeric values

@item 
the second through n-th rows contain strings where at least one value’s
length differs from that of the putative header of that column.
@end itemize

Twenty-one rows after the header are sampled; if more than half of the
columns + rows meet the criteria, @ref{e06,,True} is returned.
@end deffn

@cartouche
@quotation 참고 
This method is a rough heuristic and may produce both false positives and
negatives.
@end quotation
@end cartouche
@end deffn

@ref{2f79,,Sniffer} 사용 예:

@example
with open('example.csv', newline='@w{'}) as csvfile:
    dialect = csv.Sniffer().sniff(csvfile.read(1024))
    csvfile.seek(0)
    reader = csv.reader(csvfile, dialect)
    # ... CSV 파일 내용을 여기에서 처리합니다 ...
@end example
@anchor{library/csv csv-constants}@anchor{2f7b}
The @code{csv} module defines the following constants:

@geindex QUOTE_ALL (csv 모듈)
@anchor{library/csv csv QUOTE_ALL}@anchor{2f7c}
@deffn {데이터} csv.QUOTE_ALL

@ref{6ae,,writer} 객체에 모든 필드를 인용 처리하도록 지시합니다.
@end deffn

@geindex QUOTE_MINIMAL (csv 모듈)
@anchor{library/csv csv QUOTE_MINIMAL}@anchor{2f7d}
@deffn {데이터} csv.QUOTE_MINIMAL

Instructs @ref{6ae,,writer} objects to only quote those fields which contain
special characters such as `delimiter', `quotechar', @code{'\r'}, @code{'\n'}
or any of the characters in `lineterminator'.
@end deffn

@geindex QUOTE_NONNUMERIC (csv 모듈)
@anchor{library/csv csv QUOTE_NONNUMERIC}@anchor{1948}
@deffn {데이터} csv.QUOTE_NONNUMERIC

@ref{6ae,,writer} 객체에 모든 숫자가 아닌 필드를 인용 처리하도록 지시합니다.

Instructs @ref{6ad,,reader} objects to convert all non-quoted fields to type @ref{196,,float}.

@cartouche
@quotation 참고 
Some numeric types, such as @ref{3c3,,bool}, @ref{213,,Fraction},
or @ref{eda,,IntEnum}, have a string representation that cannot be
converted to @ref{196,,float}.
They cannot be read in the @code{QUOTE_NONNUMERIC} and
@ref{6ac,,QUOTE_STRINGS} modes.
@end quotation
@end cartouche
@end deffn

@geindex QUOTE_NONE (csv 모듈)
@anchor{library/csv csv QUOTE_NONE}@anchor{2f7e}
@deffn {데이터} csv.QUOTE_NONE

Instructs @ref{6ae,,writer} objects to never quote fields.
When the current `delimiter', `quotechar', `escapechar', @code{'\r'}, @code{'\n'}
or any of the characters in `lineterminator' occurs in output data
it is preceded by the current `escapechar' character.
If `escapechar' is not set, the writer will raise @ref{2f76,,Error} if
any characters that require escaping are encountered.
Set `quotechar' to @code{None} to prevent its escaping.

@ref{6ad,,reader} 객체에게 인용 문자의 특별한 처리를 수행하지 않도록 지시합니다.
@end deffn

@geindex QUOTE_NOTNULL (csv 모듈)
@anchor{library/csv csv QUOTE_NOTNULL}@anchor{6ab}
@deffn {데이터} csv.QUOTE_NOTNULL

Instructs @ref{6ae,,writer} objects to quote all fields which are not
@code{None}.  This is similar to @ref{2f7c,,QUOTE_ALL}, except that if a
field value is @code{None} an empty (unquoted) string is written.

Instructs @ref{6ad,,reader} objects to interpret an empty (unquoted) field
as @code{None} and to otherwise behave as @ref{2f7c,,QUOTE_ALL}.


Added in version 3.12.

@end deffn

@geindex QUOTE_STRINGS (csv 모듈)
@anchor{library/csv csv QUOTE_STRINGS}@anchor{6ac}
@deffn {데이터} csv.QUOTE_STRINGS

Instructs @ref{6ae,,writer} objects to always place quotes around fields
which are strings.  This is similar to @ref{1948,,QUOTE_NONNUMERIC}, except that if a
field value is @code{None} an empty (unquoted) string is written.

Instructs @ref{6ad,,reader} objects to interpret an empty (unquoted) string as @code{None} and
to otherwise behave as @ref{1948,,QUOTE_NONNUMERIC}.


Added in version 3.12.

@end deffn

The @code{csv} module defines the following exception:

@geindex Error
@anchor{library/csv csv Error}@anchor{2f76}
@deffn {예외} csv.Error

에러가 감지될 때 모든 함수가 발생시킵니다.
@end deffn

@node 방언과 포매팅 파라미터,판독기 객체,모듈 내용<2>,csv — CSV 파일 읽기와 쓰기
@anchor{library/csv csv-fmt-params}@anchor{2f75}@anchor{library/csv dialects-and-formatting-parameters}@anchor{2f7f}
@subsubsection 방언과 포매팅 파라미터


입력과 출력 레코드의 형식을 더 쉽게 지정할 수 있도록, 특정 포매팅 파라미터가 함께 방언으로 묶입니다. 방언(dialect)은 CSV 파일의 형식을 설명하는 다양한 어트리뷰트를 포함하는 @ref{182a,,Dialect} 클래스의 서브 클래스입니다. @ref{6ad,,reader}나 @ref{6ae,,writer} 객체를 만들 때, 프로그래머는 문자열이나 @code{Dialect} 클래스의 서브 클래스를 dialect 매개 변수로 지정할 수 있습니다. `dialect' 매개 변수에 추가하여, 또는 대신에, 프로그래머는 아래에서 @code{Dialect} 클래스에 대해 정의된 어트리뷰트와 같은 이름을 갖는 개별 포매팅 매개 변수를 지정할 수 있습니다.

방언은 다음 어트리뷰트를 지원합니다:

@geindex delimiter (csv.Dialect의 속성)
@anchor{library/csv csv Dialect delimiter}@anchor{2f80}
@deffn {속성} Dialect.delimiter

필드를 구분하는 데 사용되는 한 문자로 된 문자열. 기본값은 @code{','}입니다.
@end deffn

@geindex doublequote (csv.Dialect의 속성)
@anchor{library/csv csv Dialect doublequote}@anchor{2f81}
@deffn {속성} Dialect.doublequote

필드 안에 나타나는 `quotechar'의 인스턴스를 인용 처리하는 방법을 제어합니다. @ref{e06,,True}일 때, 문자를 두 개로 늘립니다. @ref{d2a,,False}일 때, `escapechar'를 `quotechar'의 접두어로 사용합니다. 기본값은 @code{True}입니다.

출력 시, `doublequote'가 @ref{d2a,,False}이고 아무런 `escapechar'가 설정되지 않았으면, 필드에 `quotechar'가 있으면 @ref{2f76,,Error}가 발생합니다.
@end deffn

@geindex escapechar (csv.Dialect의 속성)
@anchor{library/csv csv Dialect escapechar}@anchor{2f82}
@deffn {속성} Dialect.escapechar

A one-character string used by the writer to escape characters that
require escaping:

@quotation


@itemize *

@item 
the `delimiter', the `quotechar', @code{'\r'}, @code{'\n'} and any of the
characters in `lineterminator' are escaped if `quoting' is set to
@ref{2f7e,,QUOTE_NONE};

@item 
the `quotechar' is escaped if `doublequote' is @ref{d2a,,False};

@item 
the `escapechar' itself.
@end itemize
@end quotation

On reading, the `escapechar' removes any special meaning from
the following character. It defaults to @ref{884,,None}, which disables escaping.


버전 3.11에서 변경: An empty `escapechar' is not allowed.

@end deffn

@geindex lineterminator (csv.Dialect의 속성)
@anchor{library/csv csv Dialect lineterminator}@anchor{2f83}
@deffn {속성} Dialect.lineterminator

@ref{6ae,,writer}에 의해 생성된 행을 종료하는 데 사용되는 문자열. 기본값은 @code{'\r\n'}입니다.

@cartouche
@quotation 참고 
@ref{6ad,,reader}는 @code{'\r'}이나 @code{'\n'}을 줄 종료로 인식하도록 하드 코딩되어 있으며, `lineterminator'를 무시합니다. 이 동작은 앞으로 변경될 수 있습니다.
@end quotation
@end cartouche
@end deffn

@geindex quotechar (csv.Dialect의 속성)
@anchor{library/csv csv Dialect quotechar}@anchor{2f84}
@deffn {속성} Dialect.quotechar

A one-character string used to quote fields containing special characters,
such as the `delimiter' or the `quotechar', or which contain new-line
characters (@code{'\r'}, @code{'\n'} or any of the characters in `lineterminator').
It defaults to @code{'"'}.
Can be set to @code{None} to prevent escaping @code{'"'} if `quoting' is set
to @ref{2f7e,,QUOTE_NONE}.


버전 3.11에서 변경: An empty `quotechar' is not allowed.

@end deffn

@geindex quoting (csv.Dialect의 속성)
@anchor{library/csv csv Dialect quoting}@anchor{2f85}
@deffn {속성} Dialect.quoting

Controls when quotes should be generated by the writer and recognised by the
reader.  It can take on any of the @ref{2f7b,,QUOTE_* constants}
and defaults to @ref{2f7d,,QUOTE_MINIMAL} if `quotechar' is not @code{None},
and @ref{2f7e,,QUOTE_NONE} otherwise.
@end deffn

@geindex skipinitialspace (csv.Dialect의 속성)
@anchor{library/csv csv Dialect skipinitialspace}@anchor{2f86}
@deffn {속성} Dialect.skipinitialspace

When @ref{e06,,True}, spaces immediately following the `delimiter' are ignored.
The default is @ref{d2a,,False}.  When combining @code{delimiter=' '} with
@code{skipinitialspace=True}, unquoted empty fields are not allowed.
@end deffn

@geindex strict (csv.Dialect의 속성)
@anchor{library/csv csv Dialect strict}@anchor{2f87}
@deffn {속성} Dialect.strict

@code{True}일 때, 잘못된 CSV 입력에서 예외 @ref{2f76,,Error}를 발생시킵니다. 기본값은 @code{False}입니다.
@end deffn

@node 판독기 객체,기록기 객체,방언과 포매팅 파라미터,csv — CSV 파일 읽기와 쓰기
@anchor{library/csv id3}@anchor{2f88}@anchor{library/csv reader-objects}@anchor{2f74}
@subsubsection 판독기 객체


판독기 객체(@ref{bd7,,DictReader} 인스턴스와 @ref{6ad,,reader()} 함수에서 반환한 객체)에는 다음과 같은 공용 메서드가 있습니다:

@geindex __next__() (csv.csvreader 메서드)
@anchor{library/csv csv csvreader __next__}@anchor{2f89}
@deffn {메서드} csvreader.__next__ ()

판독기의 이터러블 객체의 다음 행을 현재 @ref{182a,,Dialect}에 따라 구문 분석하여 리스트(객체가 @ref{6ad,,reader()}에서 반환된 경우)나 딕셔너리(@ref{bd7,,DictReader} 인스턴스인 경우)로 반환합니다. 보통 이것을 @code{next(reader)}처럼 호출합니다.
@end deffn

판독기 객체에는 다음과 같은 공용 어트리뷰트가 있습니다:

@geindex dialect (csv.csvreader의 속성)
@anchor{library/csv csv csvreader dialect}@anchor{2f8a}
@deffn {속성} csvreader.dialect

구문 분석기가 사용 중인 방언의 읽기 전용 설명.
@end deffn

@geindex line_num (csv.csvreader의 속성)
@anchor{library/csv csv csvreader line_num}@anchor{2f8b}
@deffn {속성} csvreader.line_num

소스 이터레이터에서 읽은 줄 수. 레코드가 여러 줄에 걸쳐 있을 수 있으므로, 이것은 반환된 레코드 수와 같지 않습니다.
@end deffn

DictReader 객체에는 다음과 같은 공용 어트리뷰트가 있습니다:

@geindex fieldnames (csv.DictReader의 속성)
@anchor{library/csv csv DictReader fieldnames}@anchor{2f8c}
@deffn {속성} DictReader.fieldnames

객체를 만들 때 매개 변수로 전달되지 않았으면, 이 어트리뷰트는 첫 번째 액세스 시나 파일에서 첫 번째 레코드를 읽을 때 초기화됩니다.
@end deffn

@node 기록기 객체,예제<10>,판독기 객체,csv — CSV 파일 읽기와 쓰기
@anchor{library/csv writer-objects}@anchor{2f8d}
@subsubsection 기록기 객체


@ref{6ae,,writer} 객체(@ref{1403,,DictWriter} 인스턴스와 @ref{6ae,,writer()} 함수에서 반환한 객체)에는 다음과 같은 공용 메서드가 있습니다. `row'는 @code{writer} 객체의 경우 문자열이나 숫자의 이터러블이어야 하며, @code{DictWriter} 객체의 경우 fieldnames를 (@ref{169,,str()}을 먼저 통과시킴으로써) 문자열이나 숫자로 매핑하는 딕셔너리이어야 합니다. 복소수는 괄호로 둘러싸여 기록됨에 유의하십시오. 이것은 CSV 파일을 읽는 다른 프로그램에서 문제를 일으킬 수 있습니다 (복소수를 지원한다고 가정할 때).

@geindex writerow() (csv.csvwriter 메서드)
@anchor{library/csv csv csvwriter writerow}@anchor{fe8}
@deffn {메서드} csvwriter.writerow (row, /)

`row' 매개 변수를 현재 @ref{182a,,Dialect}에 따라 포매팅해서, 기록기의 파일 객체에 씁니다. 하부 파일 객체의 `write' 메서드 호출의 반환 값을 반환합니다.


버전 3.5에서 변경: 임의의 이터러블 지원 추가.

@end deffn

@geindex writerows() (csv.csvwriter 메서드)
@anchor{library/csv csv csvwriter writerows}@anchor{2f8e}
@deffn {메서드} csvwriter.writerows (rows, /)

`rows'(위에서 설명한 `row' 객체의 이터러블)에 있는 모든 요소를 현재 방언에 따라 포매팅해서, 기록기의 파일 객체에 씁니다.
@end deffn

기록기 객체에는 다음과 같은 공용 어트리뷰트가 있습니다:

@geindex dialect (csv.csvwriter의 속성)
@anchor{library/csv csv csvwriter dialect}@anchor{2f8f}
@deffn {속성} csvwriter.dialect

기록기가 사용 중인 방언의 읽기 전용 설명.
@end deffn

DictWriter 객체의 공용 메서드는 다음과 같습니다:

@geindex writeheader() (csv.DictWriter 메서드)
@anchor{library/csv csv DictWriter writeheader}@anchor{1404}
@deffn {메서드} DictWriter.writeheader ()

(생성자에 지정된 대로) 필드 이름을 담은 행을 현재 방언에 따라 포매팅해서, 기록기의 파일 객체에 씁니다. 내부적으로 사용되는 @ref{fe8,,csvwriter.writerow()} 호출의 반환 값을 반환합니다.


Added in version 3.2.



버전 3.8에서 변경: @ref{1404,,writeheader()}는 이제 내부적으로 사용하는 @ref{fe8,,csvwriter.writerow()} 메서드에서 반환된 값도 반환합니다.

@end deffn

@node 예제<10>,,기록기 객체,csv — CSV 파일 읽기와 쓰기
@anchor{library/csv csv-examples}@anchor{2f90}@anchor{library/csv examples}@anchor{2f91}
@subsubsection 예제


CSV 파일을 읽는 가장 간단한 예:

@example
import csv
with open('some.csv', newline='@w{'}) as f:
    reader = csv.reader(f)
    for row in reader:
        print(row)
@end example

다른 형식의 파일 읽기:

@example
import csv
with open('passwd', newline='@w{'}) as f:
    reader = csv.reader(f, delimiter=':', quoting=csv.QUOTE_NONE)
    for row in reader:
        print(row)
@end example

대응하는 가장 간단한 쓰기 예는 다음과 같습니다:

@example
import csv
with open('some.csv', 'w', newline='@w{'}) as f:
    writer = csv.writer(f)
    writer.writerows(someiterable)
@end example

CSV 파일을 읽기로 여는 데 @ref{316,,open()}이 사용되므로, 파일은 기본적으로 시스템 기본 인코딩(@ref{329,,locale.getencoding()}를 참조하세요)을 사용하여 유니코드로 디코딩됩니다. 다른 인코딩을 사용하여 파일을 디코딩하려면 open의 @code{encoding} 인자를 사용하십시오:

@example
import csv
with open('some.csv', newline='@w{'}, encoding='utf-8') as f:
    reader = csv.reader(f)
    for row in reader:
        print(row)
@end example

시스템 기본 인코딩 이외의 다른 것으로 쓸 때도 마찬가지입니다: 출력 파일을 열 때 encoding 인자를 지정하십시오.

새로운 방언 등록하기:

@example
import csv
csv.register_dialect('unixpwd', delimiter=':', quoting=csv.QUOTE_NONE)
with open('passwd', newline='@w{'}) as f:
    reader = csv.reader(f, 'unixpwd')
@end example

판독기의 약간 더 고급 사용 — 에러 잡기와 보고:

@example
import csv, sys
filename = 'some.csv'
with open(filename, newline='@w{'}) as f:
    reader = csv.reader(f)
    try:
        for row in reader:
            print(row)
    except csv.Error as e:
        sys.exit(f'file @{filename@}, line @{reader.line_num@}: @{e@}')
@end example

또한, 모듈이 문자열 구문 분석을 직접 지원하지는 않지만, 쉽게 수행할 수 있습니다:

@example
import csv
for row in csv.reader(['one,two,three']):
    print(row)
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node configparser — 구성 파일 구문 분석기,tomllib — Parse TOML files,csv — CSV 파일 읽기와 쓰기,파일 형식
@anchor{library/configparser doc}@anchor{2f92}@anchor{library/configparser configparser-configuration-file-parser}@anchor{2f93}@anchor{library/configparser module-configparser}@anchor{26}@anchor{library/configparser translation-repo}@anchor{2f94}
@subsection @code{configparser} — 구성 파일 구문 분석기


@geindex module; configparser

`소스 코드:' Lib/configparser.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/configparser.py}

@geindex .ini;파일
@geindex 구성;파일
@geindex ini 파일
@geindex 윈도우 ini 파일


__________________________________________________________________


이 모듈은 마이크로소프트 윈도우 INI 파일과 유사한 구조를 제공하는 기본 구성 언어를 구현하는 @ref{4de,,ConfigParser} 클래스를 제공합니다. 이를 사용하여 최종 사용자가 쉽게 사용자 정의 할 수 있는 파이썬 프로그램을 작성할 수 있습니다.

@cartouche
@quotation 참고 
이 라이브러리는 윈도우 레지스트리 확장 버전의 INI 문법에 사용된 값-형 접두사를 해석하거나 기록하지 `않습니다'.
@end quotation
@end cartouche


@subsubheading 더 보기



@table @asis

@item 모듈 @ref{102,,tomllib}

TOML is a well-specified format for application configuration files.
It is specifically designed to be an improved version of INI.

@item 모듈 @ref{c9,,shlex}

응용 프로그램 구성 파일에도 사용할 수 있는 유닉스 셸과 유사한 미니 언어를 만드는 것에 관한 지원.

@item 모듈 @ref{86,,json}

@code{json} 모듈은 자바스크립트 문법의 부분 집합을 구현하며, 때로는 구성에 사용되지만 주석을 지원하지 않습니다.
@end table


@c import configparser

@c import os
@c os.remove("example.ini")
@c os.remove("override.ini")

@menu
* 빠른 시작:: 
* 지원되는 데이터형:: 
* 대체 값:: 
* 지원되는 INI 파일 구조:: 
* Unnamed Sections:: 
* 값의 보간:: 
* 매핑 프로토콜 액세스:: 
* 구문 분석기 동작 사용자 정의:: 
* 레거시 API 예제:: 
* ConfigParser 객체:: 
* RawConfigParser 객체:: 
* 예외: 예외<6>. 

@end menu

@node 빠른 시작,지원되는 데이터형,,configparser — 구성 파일 구문 분석기
@anchor{library/configparser quick-start}@anchor{2f95}
@subsubsection 빠른 시작


다음과 같은 매우 기본적인 구성 파일을 봅시다:

@example
[DEFAULT]
ServerAliveInterval = 45
Compression = yes
CompressionLevel = 9
ForwardX11 = yes

[forge.example]
User = hg

[topsecret.server.example]
Port = 50022
ForwardX11 = no
@end example

The structure of INI files is described @ref{2f96,,in the following section}.  Essentially, the file
consists of sections, each of which contains keys with values.
@code{configparser} classes can read and write such files.  Let’s start by
creating the above configuration file programmatically.

@example
>>> import configparser
>>> config = configparser.ConfigParser()
>>> config['DEFAULT'] = @{'ServerAliveInterval': '45',
...                      'Compression': 'yes',
...                      'CompressionLevel': '9'@}
>>> config['forge.example'] = @{@}
>>> config['forge.example']['User'] = 'hg'
>>> config['topsecret.server.example'] = @{@}
>>> topsecret = config['topsecret.server.example']
>>> topsecret['Port'] = '50022'     # 구문 분석기를 변경합니다
>>> topsecret['ForwardX11'] = 'no'  # 여기도 마찬가지입니다
>>> config['DEFAULT']['ForwardX11'] = 'yes'
>>> with open('example.ini', 'w') as configfile:
...   config.write(configfile)
...
@end example

보시다시피, 구성 구문 분석기는 딕셔너리처럼 취급할 수 있습니다. @ref{2f97,,나중에 설명되는} 차이점이 있지만, 동작은 딕셔너리에서 기대하는 것과 매우 비슷합니다.

이제 구성 파일을 만들고 저장했으니, 파일을 다시 읽고 담긴 데이터를 탐색합시다.

@example
>>> config = configparser.ConfigParser()
>>> config.sections()
[]
>>> config.read('example.ini')
['example.ini']
>>> config.sections()
['forge.example', 'topsecret.server.example']
>>> 'forge.example' in config
True
>>> 'python.org' in config
False
>>> config['forge.example']['User']
'hg'
>>> config['DEFAULT']['Compression']
'yes'
>>> topsecret = config['topsecret.server.example']
>>> topsecret['ForwardX11']
'no'
>>> topsecret['Port']
'50022'
>>> for key in config['forge.example']:
...     print(key)
user
compressionlevel
serveraliveinterval
compression
forwardx11
>>> config['forge.example']['ForwardX11']
'yes'
@end example

위에서 볼 수 있듯이, API는 매우 간단합니다. 유일한 마법은 @code{DEFAULT} 섹션인데, 다른 모든 섹션에 대한 기본값을 제공합니다 @footnote{
구성 구문 분석기는 심도 있는 사용자 정의를 허용합니다. 각주 참조로 요약된 동작을 변경하는 데 관심이 있으면 @ref{2f98,,구문 분석기 동작 사용자 정의} 섹션을 참조하십시오.
}. 섹션의 키는 대소 문자를 구분하지 않으며 소문자로 저장됨에 유의하십시오 @footnote{
구성 구문 분석기는 심도 있는 사용자 정의를 허용합니다. 각주 참조로 요약된 동작을 변경하는 데 관심이 있으면 @ref{2f98,,구문 분석기 동작 사용자 정의} 섹션을 참조하십시오.
}.

It is possible to read several configurations into a single
@ref{4de,,ConfigParser}, where the most recently added configuration has the
highest priority. Any conflicting keys are taken from the more recent
configuration while the previously existing keys are retained. The example
below reads in an @code{override.ini} file, which will override any conflicting
keys from the @code{example.ini} file.

@example
[DEFAULT]
ServerAliveInterval = -1
@end example

@example
>>> config_override = configparser.ConfigParser()
>>> config_override['DEFAULT'] = @{'ServerAliveInterval': '-1'@}
>>> with open('override.ini', 'w') as configfile:
...     config_override.write(configfile)
...
>>> config_override = configparser.ConfigParser()
>>> config_override.read(['example.ini', 'override.ini'])
['example.ini', 'override.ini']
>>> print(config_override.get('DEFAULT', 'ServerAliveInterval'))
-1
@end example

This behaviour is equivalent to a @ref{166d,,ConfigParser.read()} call with several
files passed to the `filenames' parameter.

@node 지원되는 데이터형,대체 값,빠른 시작,configparser — 구성 파일 구문 분석기
@anchor{library/configparser supported-datatypes}@anchor{2f99}
@subsubsection 지원되는 데이터형


구성 구문 분석기는 구성 파일에 있는 값의 데이터형을 추측하지 않고, 항상 내부적으로 문자열로 저장합니다. 이것은 다른 데이터형이 필요하면, 직접 변환해야 함을 뜻합니다:

@example
>>> int(topsecret['Port'])
50022
>>> float(topsecret['CompressionLevel'])
9.0
@end example

이 작업이 매우 흔하기 때문에, 구성 구문 분석기는 정수, 부동 소수점 및 불리언을 처리하는 편리한 게터(getter) 메서드를 제공합니다. 마지막 것이 가장 흥미로운데, @code{bool('False')} 가 여전히 @code{True}이기 때문에 @code{bool()} 에 값을 전달하는 것만으로는 충분치 않기 때문입니다. 이것이 구성 구문 분석기가 @ref{2f9a,,getboolean()}도 제공하는 이유입니다. 이 메서드는 대소 문자를 구분하지 않으며 @code{'yes'}/@code{'no'}, @code{'on'}/@code{'off'}, @code{'true'}/@code{'false'} 및 @code{'1'}/@code{'0'}에서 불리언 값을 인식합니다 @footnote{
구성 구문 분석기는 심도 있는 사용자 정의를 허용합니다. 각주 참조로 요약된 동작을 변경하는 데 관심이 있으면 @ref{2f98,,구문 분석기 동작 사용자 정의} 섹션을 참조하십시오.
}. 예를 들면:

@example
>>> topsecret.getboolean('ForwardX11')
False
>>> config['forge.example'].getboolean('ForwardX11')
True
>>> config.getboolean('forge.example', 'Compression')
True
@end example

@ref{2f9a,,getboolean()} 외에도, 구성 구문 분석기는 동등한 @ref{2f9b,,getint()}와 @ref{2f9c,,getfloat()} 메서드를 제공합니다. 여러분 자신의 변환기를 등록하고 제공된 변환기를 사용자 정의 할 수 있습니다. @footnote{
구성 구문 분석기는 심도 있는 사용자 정의를 허용합니다. 각주 참조로 요약된 동작을 변경하는 데 관심이 있으면 @ref{2f98,,구문 분석기 동작 사용자 정의} 섹션을 참조하십시오.
}

@node 대체 값,지원되는 INI 파일 구조,지원되는 데이터형,configparser — 구성 파일 구문 분석기
@anchor{library/configparser fallback-values}@anchor{2f9d}
@subsubsection 대체 값


딕셔너리와 마찬가지로, 섹션의 @ref{1470,,get()} 메서드를 사용하여 대체(fallback) 값을 제공할 수 있습니다:

@example
>>> topsecret.get('Port')
'50022'
>>> topsecret.get('CompressionLevel')
'9'
>>> topsecret.get('Cipher')
>>> topsecret.get('Cipher', '3des-cbc')
'3des-cbc'
@end example

기본값이 대체 값보다 우선함에 유의하십시오. 예를 들어, 이 예에서 @code{'CompressionLevel'} 키는 @code{'DEFAULT'} 섹션에서만 지정되었습니다. 이것을 @code{'topsecret.server.example'} 섹션에서 가져오려고 하면 대체 값을 지정하더라도 항상 기본값을 얻습니다:

@example
>>> topsecret.get('CompressionLevel', '3')
'9'
@end example

알아 두어야 할 또 다른 사항은 구문 분석기 수준의 @ref{1470,,get()} 메서드가 이전 버전과의 호환성을 위해 유지되는 더 복잡한 사용자 정의 인터페이스를 제공한다는 것입니다. 이 메서드를 사용할 때, @code{fallback} 키워드 전용 인자를 통해 대체 값을 제공할 수 있습니다:

@example
>>> config.get('forge.example', 'monster',
...            fallback='No such things as monsters')
'No such things as monsters'
@end example

@ref{2f9b,,getint()}, @ref{2f9c,,getfloat()} 및 @ref{2f9a,,getboolean()} 메서드에 같은 @code{fallback} 인자를 사용할 수 있습니다. 예를 들면:

@example
>>> 'BatchMode' in topsecret
False
>>> topsecret.getboolean('BatchMode', fallback=True)
True
>>> config['DEFAULT']['BatchMode'] = 'no'
>>> topsecret.getboolean('BatchMode', fallback=True)
False
@end example

@node 지원되는 INI 파일 구조,Unnamed Sections,대체 값,configparser — 구성 파일 구문 분석기
@anchor{library/configparser supported-ini-file-structure}@anchor{2f96}
@subsubsection 지원되는 INI 파일 구조


구성 파일은 섹션으로 구성되며, 각 섹션은 @code{[section]} 헤더로 시작하고, 특정 문자열(기본적으로 @code{=}이나 @code{:} @footnote{
구성 구문 분석기는 심도 있는 사용자 정의를 허용합니다. 각주 참조로 요약된 동작을 변경하는 데 관심이 있으면 @ref{2f98,,구문 분석기 동작 사용자 정의} 섹션을 참조하십시오.
})로 구분된 키/값 항목들이 뒤따릅니다. 기본적으로, 섹션 이름은 대소 문자를 구분하지만 키는 구분하지 않습니다 @footnote{
구성 구문 분석기는 심도 있는 사용자 정의를 허용합니다. 각주 참조로 요약된 동작을 변경하는 데 관심이 있으면 @ref{2f98,,구문 분석기 동작 사용자 정의} 섹션을 참조하십시오.
}. 선행과 후행 공백은 키와 값에서 제거됩니다. 구문 분석기가 이를 허용하도록 구성되어 있다면 값을 생략할 수 있으며 @footnote{
구성 구문 분석기는 심도 있는 사용자 정의를 허용합니다. 각주 참조로 요약된 동작을 변경하는 데 관심이 있으면 @ref{2f98,,구문 분석기 동작 사용자 정의} 섹션을 참조하십시오.
}, 이 경우 키/값 구분자도 생략될 수 있습니다. 값의 첫 줄보다 깊이 들여쓰기만 하면 값이 여러 줄에 걸쳐있을 수 있습니다. 구문 분석기의 모드에 따라, 빈 줄은 여러 줄 값의 일부로 취급되거나 무시될 수 있습니다.

By default, a valid section name can be any string that does not contain ‘\n’.
To change this, see @ref{2f9e,,ConfigParser.SECTCRE}.

The first section name may be omitted if the parser is configured to allow an
unnamed top level section with @code{allow_unnamed_section=True}. In this case,
the keys/values may be retrieved by @ref{1792,,UNNAMED_SECTION} as in
@code{config[UNNAMED_SECTION]}.

구성 파일에는 특정 문자(기본적으로 @code{#}과 @code{;} @footnote{
구성 구문 분석기는 심도 있는 사용자 정의를 허용합니다. 각주 참조로 요약된 동작을 변경하는 데 관심이 있으면 @ref{2f98,,구문 분석기 동작 사용자 정의} 섹션을 참조하십시오.
})를 접두사로 붙인 주석이 포함될 수 있습니다. 주석은 주석이 없다면 빈 줄일 곳에 있을 수 있으며, 들여쓰기 될 수 있습니다. @footnote{
구성 구문 분석기는 심도 있는 사용자 정의를 허용합니다. 각주 참조로 요약된 동작을 변경하는 데 관심이 있으면 @ref{2f98,,구문 분석기 동작 사용자 정의} 섹션을 참조하십시오.
}

예를 들면:

@example
[Simple Values]
key=value
spaces in keys=allowed
spaces in values=allowed as well
spaces around the delimiter = obviously
you can also use : to delimit keys from values

[All Values Are Strings]
values like this: 1000000
or this: 3.14159265359
are they treated as numbers? : no
integers, floats and booleans are held as: strings
can use the API to get converted values directly: true

[Multiline Values]
chorus: I'm a lumberjack, and I'm okay
    I sleep all night and I work all day

[No Values]
key_without_value
empty string value here =

[You can use comments]
# 이것처럼
; 또는 이것처럼

# 기본적으로 빈 줄에만 허용됩니다.
# 인라인 주석은 사용자가 구분 문자를 값의 일부로
# 사용하지 못하게 하므로 해로울 수 있습니다.
# 그러해도, 이것을 사용자 정의할 수 있습니다.

    [Sections Can Be Indented]
        can_values_be_as_well = True
        does_that_mean_anything_special = False
        purpose = formatting for readability
        multiline_values = are
            handled just fine as
            long as they are indented
            deeper than the first line
            of a value
        # 주석도 들여 쓸 수 있다고 언급했나요?
@end example

@node Unnamed Sections,값의 보간,지원되는 INI 파일 구조,configparser — 구성 파일 구문 분석기
@anchor{library/configparser id10}@anchor{2f9f}@anchor{library/configparser unnamed-sections}@anchor{2fa0}
@subsubsection Unnamed Sections


The name of the first section (or unique) may be omitted and values
retrieved by the @ref{1792,,UNNAMED_SECTION} attribute.

@example
>>> config = """
... option = value
...
... [  Section 2  ]
... another = val
... """
>>> unnamed = configparser.ConfigParser(allow_unnamed_section=True)
>>> unnamed.read_string(config)
>>> unnamed.get(configparser.UNNAMED_SECTION, 'option')
'value'
@end example

@node 값의 보간,매핑 프로토콜 액세스,Unnamed Sections,configparser — 구성 파일 구문 분석기
@anchor{library/configparser interpolation-of-values}@anchor{2fa1}
@subsubsection 값의 보간


핵심 기능 위에, @ref{4de,,ConfigParser}는 보간(interpolation)을 지원합니다. 이는 @code{get()} 호출에서 값을 반환하기 전에 값을 전처리할 수 있음을 의미합니다.

@geindex % (퍼센트);구성 파일의 보간

@geindex BasicInterpolation (configparser 클래스)
@anchor{library/configparser configparser BasicInterpolation}@anchor{92b}
@deffn {클래스} configparser.BasicInterpolation

@ref{4de,,ConfigParser}에서 사용되는 기본 구현. 같은 섹션의 다른 값이나 특수한 기본 섹션의 값을 참조하는 포맷 문자열을 포함하는 값을 사용할 수 있도록 합니다 @footnote{
구성 구문 분석기는 심도 있는 사용자 정의를 허용합니다. 각주 참조로 요약된 동작을 변경하는 데 관심이 있으면 @ref{2f98,,구문 분석기 동작 사용자 정의} 섹션을 참조하십시오.
}. 초기화할 때 추가 기본값을 제공할 수 있습니다.

예를 들면:

@example
[Paths]
home_dir: /Users
my_dir: %(home_dir)s/lumberjack
my_pictures: %(my_dir)s/Pictures

[Escape]
# %% 를 사용하여 % 기호를 이스케이프 합니다 (% 는 이스케이프 해야 하는 유일한 문자입니다):
gain: 80%%
@end example

위의 예에서, `interpolation'이 @code{BasicInterpolation()} 으로 설정된 @ref{4de,,ConfigParser}는 @code{%(home_dir)s}를 @code{home_dir}의 값(이 경우 @code{/Users})으로 해석합니다. 결과적으로 @code{%(my_dir)s}는 @code{/Users/lumberjack}으로 해석됩니다. 모든 보간은 요청 시 수행되므로 참조 체인에 사용된 키를 구성 파일에서 특정 순서로 지정할 필요는 없습니다.

@code{interpolation}을 @code{None}으로 설정하면, 구문 분석기는 @code{my_pictures}의 값을 @code{%(my_dir)s/Pictures}로, @code{my_dir}의 값을 @code{%(home_dir)s/lumberjack}으로 반환합니다.
@end deffn

@geindex $ (달러);구성 파일의 보간

@geindex ExtendedInterpolation (configparser 클래스)
@anchor{library/configparser configparser ExtendedInterpolation}@anchor{92c}
@deffn {클래스} configparser.ExtendedInterpolation

예를 들어 @code{zc.buildout}에서 사용되는 고급 문법을 구현하는 보간 대체 처리기. 확장 보간은 @code{$@{section:option@}}을 사용하여 외부 섹션의 값을 나타냅니다. 보간은 여러 수준으로 확장될 수 있습니다. 편의상, @code{section:} 부분을 생략하면, 보간은 현재 섹션(그리고 가능하면 특수 섹션의 기본값)으로 기본 설정됩니다.

예를 들어, 기본 보간으로 위에서 지정한 구성은, 확장 보간으로는 다음과 같습니다:

@example
[Paths]
home_dir: /Users
my_dir: $@{home_dir@}/lumberjack
my_pictures: $@{my_dir@}/Pictures

[Escape]
# $$ 를 사용하여 $ 기호를 이스케이프 합니다 ($ 는 이스케이프 해야 하는 유일한 문자입니다):
cost: $$80
@end example

다른 섹션의 값도 가져올 수 있습니다:

@example
[Common]
home_dir: /Users
library_dir: /Library
system_dir: /System
macports_dir: /opt/local

[Frameworks]
Python: 3.2
path: $@{Common:system_dir@}/Library/Frameworks/

[Arthur]
nickname: Two Sheds
last_name: Jackson
my_dir: $@{Common:home_dir@}/twosheds
my_pictures: $@{my_dir@}/Pictures
python_dir: $@{Frameworks:path@}/Python/Versions/$@{Frameworks:Python@}
@end example
@end deffn

@node 매핑 프로토콜 액세스,구문 분석기 동작 사용자 정의,값의 보간,configparser — 구성 파일 구문 분석기
@anchor{library/configparser mapping-protocol-access}@anchor{2f97}
@subsubsection 매핑 프로토콜 액세스



Added in version 3.2.


Mapping protocol access is a generic name for functionality that enables using
custom objects as if they were dictionaries.  In case of @code{configparser},
the mapping interface implementation is using the
@code{parser['section']['option']} notation.

@code{parser['section']}은 특히 구문 분석기의 섹션 데이터에 대한 프락시를 반환합니다. 이는 값은 복사되지 않지만 필요할 때 원래 구문 분석기에서 가져옴을 뜻합니다. 더욱 중요한 것은 섹션 프락시에서 값이 변경되면, 실제로 원래 구문 분석기에서 변경된다는 것입니다.

@code{configparser} objects behave as close to actual dictionaries as possible.
The mapping interface is complete and adheres to the
@ref{12b1,,MutableMapping} ABC.
However, there are a few differences that should be taken into account:


@itemize *

@item 
기본적으로, 섹션의 모든 키는 대소 문자를 구분하지 않고 액세스 할 수 있습니다 @footnote{
구성 구문 분석기는 심도 있는 사용자 정의를 허용합니다. 각주 참조로 요약된 동작을 변경하는 데 관심이 있으면 @ref{2f98,,구문 분석기 동작 사용자 정의} 섹션을 참조하십시오.
}. 예를 들어 @code{for option in parser["section"]}는 @code{optionxform} 변환된 옵션 키 이름만 산출합니다. 이것은 기본적으로 소문자 키를 의미합니다. 동시에, 키 @code{'a'}를 보유하는 섹션의 경우, 두 표현식 모두 @code{True}를 반환합니다:

@example
"a" in parser["section"]
"A" in parser["section"]
@end example

@item 
모든 섹션에는 @code{DEFAULTSECT} 값도 포함되어 있는데, 섹션에 대한 @code{.clear()}가 섹션을 비어 보이게 만들 수 없다는 뜻입니다. 이것은 섹션에서 기본값을 삭제할 수 없기 때문입니다 (기술적으로는 기본값이 거기 없기 때문입니다). 섹션에서 재정의되었으면, 삭제하면 기본값이 다시 보입니다. 기본값을 삭제하려고 하면 @ref{5e5,,KeyError}가 발생합니다.

@item 
@code{DEFAULTSECT}는 구문 분석기에서 제거할 수 없습니다:


@itemize *

@item 
삭제하려고 하면 @ref{2ec,,ValueError}가 발생합니다,

@item 
@code{parser.clear()}는 이것을 그대로 남겨둡니다,

@item 
@code{parser.popitem()}은 이것을 절대 반환하지 않습니다.
@end itemize

@item 
@code{parser.get(section, option, **kwargs)} - 두 번째 인자는 대체 값이 `아닙니다'. 그러나 섹션 수준 @code{get()} 메서드는 매핑 프로토콜과 클래식 configparser API와 모두 호환됨에 유의하십시오.

@item 
@code{parser.items()}는 매핑 프로토콜과 호환됩니다 (DEFAULTSECT를 포함하여 `section_name', `section_proxy' 쌍의 리스트를 반환합니다). 그러나, 이 메서드는 인자와 함께 호출 할 수도 있습니다: @code{parser.items(section, raw, vars)}. 후자의 호출은 지정된 @code{section}에 대한 `option', `value' 쌍의 리스트를 반환하며, 모든 보간이 확장됩니다 (@code{raw=True}가 제공되지 않는 한).
@end itemize

매핑 프로토콜은 기존 레거시 API 위에 구현되므로 원래 인터페이스를 재정의하는 서브 클래스에서도 여전히 매핑이 작동해야 합니다.

@node 구문 분석기 동작 사용자 정의,레거시 API 예제,매핑 프로토콜 액세스,configparser — 구성 파일 구문 분석기
@anchor{library/configparser customizing-parser-behaviour}@anchor{2f98}
@subsubsection 구문 분석기 동작 사용자 정의


There are nearly as many INI format variants as there are applications using it.
@code{configparser} goes a long way to provide support for the largest sensible
set of INI styles available.  The default functionality is mainly dictated by
historical background and it’s very likely that you will want to customize some
of the features.

특정 구성 구문 분석기의 작동 방식을 변경하는 가장 흔한 방법은 @code{__init__()} 옵션을 사용하는 것입니다:


@itemize *

@item 
`defaults', 기본값: @code{None}

이 옵션은 처음에 @code{DEFAULT} 섹션에 배치될 키-값 쌍의 딕셔너리를 받아들입니다. 이것은 지정하지 않으면 설명된 기본값과 같은 값이 되는 간결한 구성 파일을 지원하는 우아한 방법입니다.

힌트: 특정 섹션에 대한 기본값을 지정하려면, 실제 파일을 읽기 전에 @ref{2fa2,,read_dict()}를 사용하십시오.

@item 
`dict_type', 기본값: @ref{183,,dict}

이 옵션은 매핑 프로토콜의 작동 방식과 기록된 구성 파일의 꼴에 큰 영향을 미칩니다. 표준 딕셔너리를 사용하면, 모든 섹션이 구문 분석기에 추가된 순서대로 저장됩니다. 섹션 내의 옵션도 마찬가지입니다.

대체 딕셔너리 형을 사용하여 예를 들어 다시 쓸 때 섹션과 옵션을 정렬할 수 있습니다.

참고: 단일 연산에서 키-값 쌍의 집합을 추가하는 방법이 있습니다. 이러한 연산에서 일반 딕셔너리를 사용하면 키 순서가 유지됩니다. 예를 들면:

@example
>>> parser = configparser.ConfigParser()
>>> parser.read_dict(@{'section1': @{'key1': 'value1',
...                                'key2': 'value2',
...                                'key3': 'value3'@},
...                   'section2': @{'keyA': 'valueA',
...                                'keyB': 'valueB',
...                                'keyC': 'valueC'@},
...                   'section3': @{'foo': 'x',
...                                'bar': 'y',
...                                'baz': 'z'@}
... @})
>>> parser.sections()
['section1', 'section2', 'section3']
>>> [option for option in parser['section3']]
['foo', 'bar', 'baz']
@end example

@item 
`allow_no_value', 기본값: @code{False}

Some configuration files are known to include settings without values, but
which otherwise conform to the syntax supported by @code{configparser}.  The
`allow_no_value' parameter to the constructor can be used to
indicate that such values should be accepted:

@example
>>> import configparser

>>> sample_config = """
... [mysqld]
...   user = mysql
...   pid-file = /var/run/mysqld/mysqld.pid
...   skip-external-locking
...   old_passwords = 1
...   skip-bdb
...   # we don't need ACID today
...   skip-innodb
... """
>>> config = configparser.ConfigParser(allow_no_value=True)
>>> config.read_string(sample_config)

>>> # 값이 있는 설정은 이전처럼 처리됩니다:
>>> config["mysqld"]["user"]
'mysql'

>>> # 값이 없는 설정은 None을 제공합니다:
>>> config["mysqld"]["skip-bdb"]

>>> # 지정되지 않은 설정은 여전히 에러를 발생시킵니다:
>>> config["mysqld"]["does-not-exist"]
Traceback (most recent call last):
  ...
KeyError: 'does-not-exist'
@end example

@item 
`delimiters', 기본값: @code{('=', ':')}

구분자(delimiters)는 섹션 내의 값에서 키를 구분하는 부분 문자열입니다. 줄에서 처음 나타나는 구분하는 부분 문자열을 구분자로 간주합니다. 이는 값에 (하지만 키는 아닙니다) 구분자가 포함될 수 있음을 의미합니다.

@ref{1de,,ConfigParser.write()}에 대한 `space_around_delimiters' 인자도 참조하십시오.

@item 
`comment_prefixes', 기본값: @code{('#', ';')}

@item 
`inline_comment_prefixes', 기본값 : @code{None}

주석 접두사는 구성 파일 내에서 유효한 주석의 시작을 나타내는 문자열입니다. `comment_prefixes'는 주석이 없으면 빈 줄일 때만 (선택적으로 들여쓰기 됩니다) 사용되는 반면  `inline_comment_prefixes'는 모든 유효한 값 (예를 들어 섹션 이름, 옵션 및 빈 줄 역시) 뒤에 사용될 수 있습니다. 기본적으로 인라인 주석은 비활성화되어 있으며 @code{'#'}과 @code{';'}이 전체 줄 주석의 접두사로 사용됩니다.


버전 3.2에서 변경: In previous versions of @code{configparser} behaviour matched
@code{comment_prefixes=('#',';')} and @code{inline_comment_prefixes=(';',)}.


구성 구문 분석기는 주석 접두사 이스케이프를 지원하지 않아서 `inline_comment_prefixes'를 사용하면 사용자가 주석 접두사로 사용되는 문자로 옵션값을 지정하지 못할 수 있습니다. 확실하지 않으면, `inline_comment_prefixes'를 설정하지 마십시오. 어떤 상황에서든, 여러 줄 값에서 줄의 시작 부분에 주석 접두사 문자를 저장하는 유일한 방법은 접두사를 보간하는 것입니다, 예를 들어:

@example
>>> from configparser import ConfigParser, ExtendedInterpolation
>>> parser = ConfigParser(interpolation=ExtendedInterpolation())
>>> # the default BasicInterpolation could be used as well
>>> parser.read_string("""
... [DEFAULT]
... hash = #
...
... [hashes]
... shebang =
...   $@{hash@}!/usr/bin/env python
...   $@{hash@} -*- coding: utf-8 -*-
...
... extensions =
...   enabled_extension
...   another_extension
...   #disabled_by_comment
...   yet_another_extension
...
... interpolation not necessary = if # is not at line start
... even in multiline values = line #1
...   line #2
...   line #3
... """)
>>> print(parser['hashes']['shebang'])

#!/usr/bin/env python
# -*- coding: utf-8 -*-
>>> print(parser['hashes']['extensions'])

enabled_extension
another_extension
yet_another_extension
>>> print(parser['hashes']['interpolation not necessary'])
if # is not at line start
>>> print(parser['hashes']['even in multiline values'])
line #1
line #2
line #3
@end example

@item 
`strict', 기본값: @code{True}

@code{True}로 설정하면, 구문 분석기는 단일 소스에서 읽는 (@ref{729,,read_file()}, @ref{2fa3,,read_string()} 또는 @ref{2fa2,,read_dict()}를 사용해서) 동안 섹션이나 옵션 중복을 허용하지 않습니다. 새로운 응용 프로그램에서는 엄격한(strict) 구문 분석기를 사용하는 것이 좋습니다.


버전 3.2에서 변경: In previous versions of @code{configparser} behaviour matched
@code{strict=False}.


@item 
`empty_lines_in_values', 기본값: @code{True}

구성 구문 분석기에서는, 값을 담는 키보다 많이 들여쓰기만 하면 값이 여러 줄에 걸쳐있을 수 있습니다. 기본적으로 구문 분석기는 빈 줄도 값의 일부가 되도록 합니다. 동시에, 가독성을 높이기 위해 키를 임의로 들여 쓸 수 있습니다. 결과적으로, 구성 파일이 커지고 복잡해지면, 사용자가 파일 구조를 쉽게 놓칠 수 있습니다. 예를 들어 봅시다:

@example
[Section]
key = multiline
  value with a gotcha

 this = is still a part of the multiline value of 'key'
@end example

이것은 사용자가 가변 폭 글꼴을 사용하여 파일을 편집하고 있다면, 보는 데 특히 문제가 될 수 있습니다. 따라서 응용 프로그램에 빈 줄이 있는 값이 필요하지 않으면, 허용하지 않는 것이 좋습니다. 이렇게 하면 빈 줄이 매번 키를 분리합니다. 위의 예에서는, @code{key}와 @code{this}의 두 키를 생성합니다.

@item 
`default_section', 기본값: @code{configparser.DEFAULTSECT} (즉: @code{"DEFAULT"})

다른 섹션이나 보간 목적으로 기본값의 특수한 섹션을 허용하는 규칙은 이 라이브러리의 강력한 개념으로, 사용자가 복잡한 선언적 구성을 만들 수 있도록 합니다. 이 섹션은 일반적으로 @code{"DEFAULT"}라고 하지만 다른 유효한 섹션 이름을 가리키도록 사용자 정의할 수 있습니다. 몇 가지 흔한 값은 이렇습니다: @code{"general"}이나 @code{"common"}. 제공된 이름은 모든 소스에서 읽을 때 기본값 섹션을 인식하는 데 사용되며 구성을 파일에 다시 쓸 때 사용됩니다. 현재 값은 @code{parser_instance.default_section} 어트리뷰트를 사용하여 꺼낼 수 있으며 실행 시간에 수정될 수 있습니다 (즉 파일을 한 형식에서 다른 형식으로 변환하기 위해).

@item 
`interpolation', 기본값: @code{configparser.BasicInterpolation}

`interpolation' 인자를 통해 사용자 정의 처리기를 제공하여 보간 동작을 사용자 정의할 수 있습니다. @code{None}은 보간을 완전히 끄는 데 사용할 수 있으며, @code{ExtendedInterpolation()} 은 @code{zc.buildout}에서 영감을 얻은 고급 변형을 제공합니다. 이 주제에 관한 자세한 내용은 @ref{2fa1,,전용 설명서 섹션}에 있습니다. @ref{1163,,RawConfigParser} 의 기본값은 @code{None}입니다.

@item 
`converters', 기본값: 설정되지 않음

구성 구문 분석기는 형 변환을 수행하는 옵션값 게터를 제공합니다. 기본적으로 @ref{2f9b,,getint()}, @ref{2f9c,,getfloat()} 및 @ref{2f9a,,getboolean()}가 구현됩니다. 다른 게터가 바람직하다면, 사용자는 그것들을 서브 클래스에 정의하거나 각 키가 변환기의 이름이고 각 값이 이 변환을 구현하는 콜러블인 딕셔너리를 전달할 수 있습니다. 예를 들어, @code{@{'decimal': decimal.Decimal@}}을 전달하면 구문 분석기 객체와 모든 섹션 프락시 모두에 @code{getdecimal()}이 추가됩니다. 즉, @code{parser_instance.getdecimal('section', 'key', fallback=0)}과 @code{parser_instance['section'].getdecimal('key', 0)}을 모두 쓸 수 있습니다.

변환기가 구문 분석기의 상태에 액세스해야 하면, 구성 구문 분석기 서브 클래스에서 메서드로 구현될 수 있습니다. 이 메서드의 이름이 @code{get}으로 시작하면, 모든 섹션 프락시에서 dict 호환 형식으로 사용할 수 있습니다 (위의 @code{getdecimal()} 예를 참조하십시오).
@end itemize

이러한 구문 분석기 어트리뷰트의 기본값을 재정의하여 더 고급 사용자 정의를 수행할 수 있습니다. 기본값은 클래스에서 정의되므로, 서브 클래스나 어트리뷰트 대입으로 재정의할 수 있습니다.

@geindex BOOLEAN_STATES (configparser.ConfigParser의 속성)
@anchor{library/configparser configparser ConfigParser BOOLEAN_STATES}@anchor{2fa4}
@deffn {속성} ConfigParser.BOOLEAN_STATES

@ref{2f9a,,getboolean()}을 사용할 때 기본적으로, 구성 구문 분석기는 다음 값들을 @code{True}로 간주하고: @code{'1'}, @code{'yes'}, @code{'true'}, @code{'on'} 다음 값들을 @code{False}로 간주합니다: @code{'0'}, @code{'no'}, @code{'false'}, @code{'off'}. 문자열과 불리언 결과를 사용자 정의 딕셔너리로 지정하여 이를 재정의할 수 있습니다. 예를 들면:

@example
>>> custom = configparser.ConfigParser()
>>> custom['section1'] = @{'funky': 'nope'@}
>>> custom['section1'].getboolean('funky')
Traceback (most recent call last):
...
ValueError: Not a boolean: nope
>>> custom.BOOLEAN_STATES = @{'sure': True, 'nope': False@}
>>> custom['section1'].getboolean('funky')
False
@end example

다른 일반적인 불리언 쌍에는 @code{accept}/@code{reject}나 @code{enabled}/@code{disabled}가 포함됩니다.
@end deffn


@deffn {메서드} ConfigParser.optionxform (option)

이 메서드는 모든 읽기, get 또는 set 연산에서 옵션 이름을 변환합니다. 기본값은 이름을 소문자로 변환합니다. 이는 또한 구성 파일을 기록할 때 모든 키가 소문자가 됨을 의미합니다. 이것이 부적절하다면 이 메서드를 재정의하십시오. 예를 들면:

@example
>>> config = """
... [Section1]
... Key = Value
...
... [Section2]
... AnotherKey = Value
... """
>>> typical = configparser.ConfigParser()
>>> typical.read_string(config)
>>> list(typical['Section1'].keys())
['key']
>>> list(typical['Section2'].keys())
['anotherkey']
>>> custom = configparser.RawConfigParser()
>>> custom.optionxform = lambda option: option
>>> custom.read_string(config)
>>> list(custom['Section1'].keys())
['Key']
>>> list(custom['Section2'].keys())
['AnotherKey']
@end example

@cartouche
@quotation 참고 
optionxform 함수는 옵션 이름을 규범적 형식으로 변환합니다. 이 함수는 멱등적(idempotent) 함수여야 합니다: 이름이 이미 규범적 형식이면, 변경되지 않은 상태로 반환해야 합니다.
@end quotation
@end cartouche
@end deffn

@geindex SECTCRE (configparser.ConfigParser의 속성)
@anchor{library/configparser configparser ConfigParser SECTCRE}@anchor{2f9e}
@deffn {속성} ConfigParser.SECTCRE

섹션 헤더를 구문 분석하는 데 사용되는 컴파일된 정규식. 기본값은 @code{[section]}을 이름 @code{"section"}과 일치시킵니다. 공백은 섹션 이름의 일부로 간주해서, @code{[  larch  ]}는 이름이 @code{"  larch  "}인 섹션으로 읽힙니다. 이것이 부적절하다면 이 어트리뷰트를 재정의하십시오. 예를 들면:

@example
>>> import re
>>> config = """
... [Section 1]
... option = value
...
... [  Section 2  ]
... another = val
... """
>>> typical = configparser.ConfigParser()
>>> typical.read_string(config)
>>> typical.sections()
['Section 1', '  Section 2  ']
>>> custom = configparser.ConfigParser()
>>> custom.SECTCRE = re.compile(r"\[ *(?P<header>[^]]+?) *\]")
>>> custom.read_string(config)
>>> custom.sections()
['Section 1', 'Section 2']
@end example

@cartouche
@quotation 참고 
ConfigParser 객체는 옵션 줄을 인식하기 위해 @code{OPTCRE} 어트리뷰트도 사용하지만, 생성자 옵션 `allow_no_value'와 `delimiters'를 방해하기 때문에 재정의하지 않는 것이 좋습니다.
@end quotation
@end cartouche
@end deffn

@node 레거시 API 예제,ConfigParser 객체,구문 분석기 동작 사용자 정의,configparser — 구성 파일 구문 분석기
@anchor{library/configparser legacy-api-examples}@anchor{2fa5}
@subsubsection 레거시 API 예제


Mainly because of backwards compatibility concerns, @code{configparser}
provides also a legacy API with explicit @code{get}/@code{set} methods.  While there
are valid use cases for the methods outlined below, mapping protocol access is
preferred for new projects.  The legacy API is at times more advanced,
low-level and downright counterintuitive.

구성 파일에 쓰는 예:

@example
import configparser

config = configparser.RawConfigParser()

# RawConfigParser 의 set 함수를 사용하면, 문자열이 아닌 값을
# 키에 내부적으로 대입할 수 있지만, 파일에 쓰려고 할 때나
# 비 원시 모드로 가져올 때 에러가 발생함에 유의하십시오.
# 매핑 프로토콜이나 ConfigParser의 set()을 사용하여
# 값을 설정하면 이러한 대입이 허용되지 않습니다.
config.add_section('Section1')
config.set('Section1', 'an_int', '15')
config.set('Section1', 'a_bool', 'true')
config.set('Section1', 'a_float', '3.1415')
config.set('Section1', 'baz', 'fun')
config.set('Section1', 'bar', 'Python')
config.set('Section1', 'foo', '%(bar)s is %(baz)s!')

# 구성 파일을 'example.cfg'에 기록하기
with open('example.cfg', 'w') as configfile:
    config.write(configfile)
@end example

구성 파일을 다시 읽는 예:

@example
import configparser

config = configparser.RawConfigParser()
config.read('example.cfg')

# 값이 float가 아니면 getfloat()는 예외를 발생시킵니다
# getint()와 getboolean() 또한 해당 유형에 대해 이렇게 합니다
a_float = config.getfloat('Section1', 'a_float')
an_int = config.getint('Section1', 'an_int')
print(a_float + an_int)

# 다음 출력은 '%(bar)s' 나 '%(baz)s' 를 보간하지 않음에 유의하십시오.
# RawConfigParser() 를 사용하고 있기 때문입니다.
if config.getboolean('Section1', 'a_bool'):
    print(config.get('Section1', 'foo'))
@end example

보간을 얻으려면, @ref{4de,,ConfigParser}를 사용하십시오:

@example
import configparser

cfg = configparser.ConfigParser()
cfg.read('example.cfg')

# 단일 get 연산에서 보간을 사용하지 않으려면 get()의 선택적 *raw* 인자를
# True로 설정하십시오.
print(cfg.get('Section1', 'foo', raw=False))  # -> "Python is fun!"
print(cfg.get('Section1', 'foo', raw=True))   # -> "%(bar)s is %(baz)s!"

# 선택적 *vars* 인자는 보간에서 우선하는 멤버가
# 포함된 dict입니다.
print(cfg.get('Section1', 'foo', vars=@{'bar': 'Documentation',
                                       'baz': 'evil'@}))

# 선택적 *fallback* 인자를 사용하여 대체 값을 제공할 수 있습니다
print(cfg.get('Section1', 'foo'))
      # -> "Python is fun!"

print(cfg.get('Section1', 'foo', fallback='Monty is not.'))
      # -> "Python is fun!"

print(cfg.get('Section1', 'monster', fallback='No such things as monsters.'))
      # -> "No such things as monsters."

# print(cfg.get('Section1', 'monster')) 만은 NoOptionError 를 발생시킵니다
# 하지만 이렇게 사용할 수도 있습니다:

print(cfg.get('Section1', 'monster', fallback=None))
      # -> None
@end example

기본값은 두 가지 유형의 ConfigParser 모두에서 사용할 수 있습니다. 사용된 옵션이 다른 곳에 정의되어 있지 않으면 보간에 사용됩니다.

@example
import configparser

# 'bar'와 'baz'의 기본값이 각각 'Life'와 'hard'인 새 인스턴스
config = configparser.ConfigParser(@{'bar': 'Life', 'baz': 'hard'@})
config.read('example.cfg')

print(config.get('Section1', 'foo'))     # -> "Python is fun!"
config.remove_option('Section1', 'bar')
config.remove_option('Section1', 'baz')
print(config.get('Section1', 'foo'))     # -> "Life is hard!"
@end example

@node ConfigParser 객체,RawConfigParser 객체,레거시 API 예제,configparser — 구성 파일 구문 분석기
@anchor{library/configparser configparser-objects}@anchor{2fa6}@anchor{library/configparser id13}@anchor{2fa7}
@subsubsection ConfigParser 객체


@geindex ConfigParser (configparser 클래스)
@anchor{library/configparser configparser ConfigParser}@anchor{4de}
@deffn {클래스} configparser.ConfigParser (defaults=None, dict_type=dict, allow_no_value=False, *, delimiters=('=', ':'), comment_prefixes=('#', ';'), inline_comment_prefixes=None, strict=True, empty_lines_in_values=True, default_section=configparser.DEFAULTSECT, interpolation=BasicInterpolation(), converters=@{@}, allow_unnamed_section=False)

메인 구성 구문 분석기. `defaults'가 주어지면, 내장 기본값의 딕셔너리로 초기화됩니다. `dict_type'이 제공되면, 섹션 리스트, 섹션 내의 옵션 및 기본값에 대한 딕셔너리 객체를 만드는 데 사용됩니다.

`delimiters'가 주어지면, 키를 값과 나누는 부분 문자열 집합으로 사용됩니다. `comment_prefixes'가 주어지면, 주석이 없다면 빈 줄일 곳에서 주석을 시작하는 접두사의 부분 문자열 집합으로 사용됩니다. 주석은 들여 쓸 수 있습니다. `inline_comment_prefixes'가 주어지면, 비어 있지 않은 줄에서 주석을 시작하는 접두사의 부분 문자열 집합으로 사용됩니다.

`strict'가 @code{True}(기본값)이면, 구문 분석기는 단일 소스(파일, 문자열 또는 딕셔너리)에서 읽는 동안 섹션이나 옵션의 중복을 허용하지 않고, @ref{1473,,DuplicateSectionError} 나 @ref{1474,,DuplicateOptionError}를 발생시킵니다. `empty_lines_in_values'가 @code{False}이면 (기본값: @code{True}), 각 빈 줄은 옵션의 끝을 나타냅니다. 그렇지 않으면, 여러 줄 옵션의 내부 빈 줄이 값의 일부로 유지됩니다. `allow_no_value'가 @code{True}이면 (기본값: @code{False}), 값이 없는 옵션이 허용됩니다; 이들에 대해 저장되는 값은 @code{None}이며 후행 구분자 없이 직렬화됩니다.

`default_section'이 주어지면, 다른 섹션과 보간 목적의 기본값을 담는 특수한 섹션의 이름을 지정합니다 (보통 @code{"DEFAULT"}라는 이름). 이 값은 @code{default_section} 인스턴스 어트리뷰트를 사용하여 실행 시간에 꺼내고 변경할 수 있습니다. 이는 이미 구문 분석된 구성 파일을 재평가하지 않지만, 구문 분석된 설정을 새 구성 파일에 기록할 때 사용됩니다.

`interpolation' 인자를 통해 사용자 정의 처리기를 제공하여 보간 동작을 사용자 정의할 수 있습니다. @code{None}은 보간을 완전히 끄는 데 사용할 수 있으며, @code{ExtendedInterpolation()} 은 @code{zc.buildout}에서 영감을 얻은 고급 변형을 제공합니다. 이 주제에 관한 자세한 내용은 @ref{2fa1,,전용 설명서 섹션}에 있습니다.

보간에 사용된 모든 옵션 이름은 다른 옵션 이름 참조와 마찬가지로 @ref{2fa8,,optionxform()} 메서드를 통해 전달됩니다. 예를 들어, (옵션 이름을 소문자로 변환하는) @code{optionxform()}의 기본 구현을 사용하면, 값 @code{foo %(bar)s}와 @code{foo %(BAR)s}가 동등합니다.

`converters'가 주어지면, 각 키는 형 변환기의 이름을 나타내고 각 값은 문자열에서 원하는 데이터형으로의 변환을 구현하는 콜러블인 딕셔너리이어야 합니다. 모든 변환기는 구문 분석기 객체와 섹션 프락시에서 자신만의 해당 @code{get*()} 메서드를 갖습니다.

When `allow_unnamed_section' is @code{True} (default: @code{False}),
the first section name can be omitted. See the
@ref{2fa0,,"Unnamed Sections" section}.

It is possible to read several configurations into a single
@ref{4de,,ConfigParser}, where the most recently added configuration has the
highest priority. Any conflicting keys are taken from the more recent
configuration while the previously existing keys are retained. The example
below reads in an @code{override.ini} file, which will override any conflicting
keys from the @code{example.ini} file.

@example
[DEFAULT]
ServerAliveInterval = -1
@end example

@example
>>> config_override = configparser.ConfigParser()
>>> config_override['DEFAULT'] = @{'ServerAliveInterval': '-1'@}
>>> with open('override.ini', 'w') as configfile:
...     config_override.write(configfile)
...
>>> config_override = configparser.ConfigParser()
>>> config_override.read(['example.ini', 'override.ini'])
['example.ini', 'override.ini']
>>> print(config_override.get('DEFAULT', 'ServerAliveInterval'))
-1
@end example


버전 3.1에서 변경: 기본 `dict_type'은 @ref{7f2,,collections.OrderedDict}입니다.



버전 3.2에서 변경: `allow_no_value', `delimiters', `comment_prefixes', `strict', `empty_lines_in_values', `default_section' 및 `interpolation'이 추가되었습니다.



버전 3.5에서 변경: `converters' 인자가 추가되었습니다.



버전 3.7에서 변경: `defaults' 인자는 @ref{2fa2,,read_dict()}로 읽혀, 구문 분석기 전체에 일관된 동작을 제공합니다: 문자열이 아닌 키와 값은 묵시적으로 문자열로 변환됩니다.



버전 3.8에서 변경: 이제 삽입 순서를 유지하므로, 기본 `dict_type'은 @ref{183,,dict}입니다.



버전 3.13에서 변경: Raise a @ref{2fa9,,MultilineContinuationError} when `allow_no_value' is
@code{True}, and a key without a value is continued with an indented line.



버전 3.13에서 변경: `allow_unnamed_section' 인자가 추가되었습니다.


@geindex defaults() (configparser.ConfigParser 메서드)
@anchor{library/configparser configparser ConfigParser defaults}@anchor{2faa}
@deffn {메서드} defaults ()

인스턴스 전체 기본값을 포함하는 딕셔너리를 반환합니다.
@end deffn

@geindex sections() (configparser.ConfigParser 메서드)
@anchor{library/configparser configparser ConfigParser sections}@anchor{2fab}
@deffn {메서드} sections ()

사용 가능한 섹션 리스트를 반환합니다; `기본값 섹션'은 리스트에 포함되지 않습니다.
@end deffn

@geindex add_section() (configparser.ConfigParser 메서드)
@anchor{library/configparser configparser ConfigParser add_section}@anchor{1472}
@deffn {메서드} add_section (section)

`section'이라는 섹션을 인스턴스에 추가합니다. 주어진 이름의 섹션이 이미 존재하면, @ref{1473,,DuplicateSectionError} 가 발생합니다. `기본값 섹션' 이름이 전달되면, @ref{2ec,,ValueError}가 발생합니다. 섹션의 이름은 문자열이어야 합니다; 그렇지 않으면, @ref{198,,TypeError}가 발생합니다.


버전 3.2에서 변경: 문자열이 아닌 섹션 이름은 @ref{198,,TypeError}를 발생시킵니다.

@end deffn

@geindex has_section() (configparser.ConfigParser 메서드)
@anchor{library/configparser configparser ConfigParser has_section}@anchor{2fac}
@deffn {메서드} has_section (section)

이름 지정된 `section'이 구성에 있는지를 나타냅니다. `기본값 섹션'은 인정되지 않습니다.
@end deffn

@geindex options() (configparser.ConfigParser 메서드)
@anchor{library/configparser configparser ConfigParser options}@anchor{2fad}
@deffn {메서드} options (section)

지정된 `section'에서 사용 가능한 옵션 리스트를 반환합니다.
@end deffn

@geindex has_option() (configparser.ConfigParser 메서드)
@anchor{library/configparser configparser ConfigParser has_option}@anchor{2fae}
@deffn {메서드} has_option (section, option)

주어진 `section'이 존재하고, 주어진 `option'을 포함하면, @ref{e06,,True}를 반환합니다; 그렇지 않으면 @ref{d2a,,False}를 반환합니다. 지정된 `section'이 @ref{884,,None}이거나 빈 문자열이면, DEFAULT로 가정합니다.
@end deffn

@geindex read() (configparser.ConfigParser 메서드)
@anchor{library/configparser configparser ConfigParser read}@anchor{166d}
@deffn {메서드} read (filenames, encoding=None)

파일명들의 이터러블을 읽고 구문 분석하여, 성공적으로 구문 분석된 파일명의 리스트를 반환합니다.

`filenames'가 문자열, @ref{192,,bytes} 객체 또는 @ref{5a0,,경로류 객체}이면 단일 파일명으로 처리됩니다. `filenames'에서 이름 지정된 파일을 열 수 없으면, 해당 파일은 무시됩니다. 이는 잠재적인 구성 파일 위치(예를 들어, 현재 디렉터리, 사용자의 홈 디렉터리 및 일부 시스템 전체 디렉터리)의 이터러블을 지정할 수 있도록 설계되었으며, 이터러블에 있는 존재하는 모든 구성 파일을 읽습니다.

제공된 이름의 파일이 아무것도 없으면, @ref{4de,,ConfigParser} 인스턴스는 빈 데이터 집합을 포함합니다. 파일에서 초깃값을 로드해야 하는 응용 프로그램은 선택적 파일에 대해 @ref{166d,,read()}를 호출하기 전에 @ref{729,,read_file()}을 사용하여 필수 파일을 로드해야 합니다:

@example
import configparser, os

config = configparser.ConfigParser()
config.read_file(open('defaults.cfg'))
config.read(['site.cfg', os.path.expanduser('~/.myapp.cfg')],
            encoding='cp1250')
@end example


버전 3.2에서 변경: `encoding' 매개 변수를 추가했습니다. 이전에는, @ref{316,,open()}의 기본 인코딩을 사용하여 모든 파일을 읽었습니다.



버전 3.6.1에서 변경: `filenames' 매개 변수는 @ref{5a0,,경로류 객체}를 받아들입니다.



버전 3.7에서 변경: `filenames' 매개 변수는 @ref{192,,bytes} 객체를 받아들입니다.

@end deffn

@geindex read_file() (configparser.ConfigParser 메서드)
@anchor{library/configparser configparser ConfigParser read_file}@anchor{729}
@deffn {메서드} read_file (f, source=None)

`f'에서 구성 데이터를 읽고 구문 분석합니다. `f'는 유니코드 문자열을 산출하는 이터러블 이어야 합니다 (예를 들어 텍스트 모드로 열린 파일).

선택적 인자 `source'는 읽을 파일의 이름을 지정합니다. 지정하지 않고 `f'에 @code{name} 어트리뷰트가 있으면, 이것이 `source'로 사용됩니다; 기본값은 @code{'<???>'}입니다.


Added in version 3.2: @code{readfp()}를 대체합니다.

@end deffn

@geindex read_string() (configparser.ConfigParser 메서드)
@anchor{library/configparser configparser ConfigParser read_string}@anchor{2fa3}
@deffn {메서드} read_string (string, source='<string>')

문자열에서 구성 데이터를 구문 분석합니다.

선택적 인자 `source'는 전달된 string의 문맥 특정 이름을 지정합니다. 지정하지 않으면, @code{'<string>'}이 사용됩니다. 일반적으로 파일 시스템 경로나 URL이어야 합니다.


Added in version 3.2.

@end deffn

@geindex read_dict() (configparser.ConfigParser 메서드)
@anchor{library/configparser configparser ConfigParser read_dict}@anchor{2fa2}
@deffn {메서드} read_dict (dictionary, source='<dict>')

딕셔너리와 같은 @code{items()} 메서드를 제공하는 임의의 객체에서 구성을 로드합니다. 키는 섹션 이름이며, 값은 섹션에 있어야 하는 키와 값이 들어 있는 딕셔너리입니다. 사용된 딕셔너리 형이 순서를 유지하면, 섹션과 해당 키가 순서대로 추가됩니다. 값은 자동으로 문자열로 변환됩니다.

선택적 인자 `source'는 전달된 dictionary의 문맥 특정 이름을 지정합니다. 지정하지 않으면, @code{<dict>}가 사용됩니다.

이 메서드를 사용하면 구문 분석 기간에 상태를 복사할 수 있습니다.


Added in version 3.2.

@end deffn

@geindex get() (configparser.ConfigParser 메서드)
@anchor{library/configparser configparser ConfigParser get}@anchor{1470}
@deffn {메서드} get (section, option, *, raw=False, vars=None[, fallback])

명명된 `section'에서 `option' 값을 가져옵니다. `vars'가 제공되면, 딕셔너리이어야 합니다. `option'은 `vars' (제공되면), `section' 및 `DEFAULTSECT' 에서 순서대로 조회됩니다. 키를 찾을 수 없고 `fallback'이 제공되면, 대체 값으로 사용됩니다. @code{None}은 `fallback' 값으로 제공될 수 있습니다.

`raw' 인자가 참이 아닌 한, 모든 @code{'%'} 보간이 반환 값에서 확장됩니다. 보간 키의 값은 옵션과 같은 방식으로 조회됩니다.


버전 3.2에서 변경: 인자 `raw', `vars' 및 `fallback'은 사용자가 세 번째 인자를 `fallback' 폴 백으로 사용하지 못하도록 하기 위해 키워드 전용입니다 (특히 매핑 프로토콜을 사용할 때).

@end deffn

@geindex getint() (configparser.ConfigParser 메서드)
@anchor{library/configparser configparser ConfigParser getint}@anchor{2f9b}
@deffn {메서드} getint (section, option, *, raw=False, vars=None[, fallback])

지정된 `section'의 `option'을 정수로 강제 변환하는 편의 메서드. `raw', `vars' 및 `fallback'에 대한 설명은 @ref{1470,,get()}을 참조하십시오.
@end deffn

@geindex getfloat() (configparser.ConfigParser 메서드)
@anchor{library/configparser configparser ConfigParser getfloat}@anchor{2f9c}
@deffn {메서드} getfloat (section, option, *, raw=False, vars=None[, fallback])

지정된 `section'의 `option'을 부동 소수점 수로 강제 변환하는 편의 메서드. `raw', `vars' 및 `fallback'에 대한 설명은 @ref{1470,,get()}을 참조하십시오.
@end deffn

@geindex getboolean() (configparser.ConfigParser 메서드)
@anchor{library/configparser configparser ConfigParser getboolean}@anchor{2f9a}
@deffn {메서드} getboolean (section, option, *, raw=False, vars=None[, fallback])

지정된 `section'의 `option'을 불리언 값으로 강제 변환하는 편의 메서드. 옵션에 허용되는 값은 이 메서드가 @code{True}를 반환하게 하는 @code{'1'}, @code{'yes'}, @code{'true'} 및 @code{'on'}과 @code{False}를 반환하게 하는 @code{'0'}, @code{'no'}, @code{'false'} 및 @code{'off'}입니다. 이 문자열 값은 대소 문자를 구분하지 않고 확인됩니다. 다른 모든 값은 @ref{2ec,,ValueError}를 발생시킵니다. `raw', `vars' 및 `fallback'에 대한 설명은 @ref{1470,,get()}을 참조하십시오.
@end deffn

@geindex items() (configparser.ConfigParser 메서드)
@anchor{library/configparser configparser ConfigParser items}@anchor{2faf}
@deffn {메서드} items (raw=False, vars=None)

@deffnx {메서드} items (section, raw=False, vars=None)

`section'이 제공되지 않으면, DEFAULTSECT를 포함하여, `section_name', `section_proxy' 쌍의 리스트를 반환합니다.

그렇지 않으면, 주어진 `section'의 옵션에 대해 `name', `value' 쌍의 리스트를 반환합니다. 선택적 인자는 @ref{1470,,get()} 메서드에서와 같은 의미입니다.


버전 3.8에서 변경: `vars'에 있는 항목은 더는 결과에 나타나지 않습니다. 이전 동작은 실제 구문 분석기 옵션과 보간을 위해 제공된 변수를 혼합했습니다.

@end deffn

@geindex set() (configparser.ConfigParser 메서드)
@anchor{library/configparser configparser ConfigParser set}@anchor{1471}
@deffn {메서드} set (section, option, value)

주어진 섹션이 존재하면, 주어진 옵션을 지정된 값으로 설정합니다; 그렇지 않으면 @ref{2fb0,,NoSectionError}를 발생시킵니다. `option'과 `value'는 문자열이어야 합니다; 그렇지 않으면, @ref{198,,TypeError}가 발생합니다.
@end deffn

@geindex write() (configparser.ConfigParser 메서드)
@anchor{library/configparser configparser ConfigParser write}@anchor{1de}
@deffn {메서드} write (fileobject, space_around_delimiters=True)

텍스트 모드로 열렸어야 하는 (문자열을 받아들이는), 지정된 @ref{13c8,,파일 객체}에 구성의 표현을 기록합니다. 이 표현은 향후 @ref{166d,,read()} 호출로 구문 분석할 수 있습니다. `space_around_delimiters'가 참이면, 키와 값 사이의 구분자는 공백으로 둘러싸입니다.


버전 3.14에서 변경: Raises InvalidWriteError if this would write a representation which cannot
be accurately parsed by a future @ref{166d,,read()} call from this parser.

@end deffn

@cartouche
@quotation 참고 
Comments in the original configuration file are not preserved when
writing the configuration back.
What is considered a comment, depends on the given values for
`comment_prefix' and `inline_comment_prefix'.
@end quotation
@end cartouche

@geindex remove_option() (configparser.ConfigParser 메서드)
@anchor{library/configparser configparser ConfigParser remove_option}@anchor{2fb1}
@deffn {메서드} remove_option (section, option)

지정된 `section'에서 지정된 `option'을 제거합니다. 섹션이 존재하지 않으면, @ref{2fb0,,NoSectionError}를 발생시킵니다. 제거되는 옵션이 존재했으면 @ref{e06,,True}를 반환합니다; 그렇지 않으면 @ref{d2a,,False}를 반환합니다.
@end deffn

@geindex remove_section() (configparser.ConfigParser 메서드)
@anchor{library/configparser configparser ConfigParser remove_section}@anchor{2fb2}
@deffn {메서드} remove_section (section)

지정된 `section'을 구성에서 제거합니다. 실제로 섹션이 존재하면, @code{True}를 반환합니다. 그렇지 않으면 @code{False}를 반환합니다.
@end deffn

@geindex optionxform() (configparser.ConfigParser 메서드)
@anchor{library/configparser configparser ConfigParser optionxform}@anchor{2fa8}
@deffn {메서드} optionxform (option)

입력 파일에서 발견되거나 클라이언트 코드에서 전달된 옵션 이름 `option'을 내부 구조에서 사용되어야 하는 형식으로 변환합니다. 기본 구현은 `option'의 소문자 버전을 반환합니다; 이 동작에 영향을 주기 위해 서브 클래스가 이것을 재정의하거나 클라이언트 코드가 인스턴스에 이 이름의 어트리뷰트를 설정할 수 있습니다.

이 메서드를 사용하기 위해 구문 분석기를 서브 클래싱할 필요는 없으며, 문자열 인자를 취해서 문자열을 반환하는 함수로 인스턴스에 설정할 수도 있습니다. 예를 들어 @code{str}로 설정하면 옵션 이름이 대소 문자를 구분하게 됩니다:

@example
cfgparser = ConfigParser()
cfgparser.optionxform = str
@end example

구성 파일을 읽을 때, @ref{2fa8,,optionxform()}이 호출되기 전에 옵션 이름 주위의 공백이 제거됨에 유의하십시오.
@end deffn
@end deffn

@geindex UNNAMED_SECTION (configparser 모듈)
@anchor{library/configparser configparser UNNAMED_SECTION}@anchor{1792}
@deffn {데이터} configparser.UNNAMED_SECTION

A special object representing a section name used to reference the unnamed section (see @ref{2fa0,,Unnamed Sections}).
@end deffn

@geindex MAX_INTERPOLATION_DEPTH (configparser 모듈)
@anchor{library/configparser configparser MAX_INTERPOLATION_DEPTH}@anchor{2fb3}
@deffn {데이터} configparser.MAX_INTERPOLATION_DEPTH

`raw' 매개 변수가 거짓일 때 @ref{1470,,get()}의 재귀 보간의 최대 깊이. 기본 `interpolation'을 사용할 때만 의미 있습니다.
@end deffn

@node RawConfigParser 객체,예외<6>,ConfigParser 객체,configparser — 구성 파일 구문 분석기
@anchor{library/configparser id15}@anchor{2fb4}@anchor{library/configparser rawconfigparser-objects}@anchor{2fb5}
@subsubsection RawConfigParser 객체


@geindex RawConfigParser (configparser 클래스)
@anchor{library/configparser configparser RawConfigParser}@anchor{1163}
@deffn {클래스} configparser.RawConfigParser (defaults=None, dict_type=dict, allow_no_value=False, *, delimiters=('=', ':'), comment_prefixes=('#', ';'), inline_comment_prefixes=None, strict=True, empty_lines_in_values=True, default_section=configparser.DEFAULTSECT, interpolation=BasicInterpolation(), converters=@{@}, allow_unnamed_section=False)

@ref{4de,,ConfigParser}의 레거시 변형. 기본적으로 보간이 비활성화되어 있으며 레거시 @code{defaults=} 키워드 인자 처리뿐만 아니라 안전하지 않은 @code{add_section}과 @code{set} 메서드를 통해 문자열이 아닌 섹션 이름, 옵션 이름 및 값을 허용합니다.


버전 3.2에서 변경: `allow_no_value', `delimiters', `comment_prefixes', `strict', `empty_lines_in_values', `default_section' 및 `interpolation'이 추가되었습니다.



버전 3.5에서 변경: `converters' 인자가 추가되었습니다.



버전 3.8에서 변경: 이제 삽입 순서를 유지하므로, 기본 `dict_type'은 @ref{183,,dict}입니다.



버전 3.13에서 변경: `allow_unnamed_section' 인자가 추가되었습니다.


@cartouche
@quotation 참고 
내부에 저장되는 값의 형을 검사하는 @ref{4de,,ConfigParser}를 대신 사용하는 것을 고려하십시오. 보간을 원하지 않으면, @code{ConfigParser(interpolation=None)} 을 사용할 수 있습니다.
@end quotation
@end cartouche

@geindex add_section() (configparser.RawConfigParser 메서드)
@anchor{library/configparser configparser RawConfigParser add_section}@anchor{2fb6}
@deffn {메서드} add_section (section)

Add a section named `section' or @ref{1792,,UNNAMED_SECTION} to the instance.

If the given section already exists, @ref{1473,,DuplicateSectionError} is
raised. If the `default section' name is passed, @ref{2ec,,ValueError} is
raised. If @ref{1792,,UNNAMED_SECTION} is passed and support is disabled,
@ref{2fb7,,UnnamedSectionDisabledError} is raised.

`section'의 형을 검사하지 않아서 사용자가 문자열이 아닌 섹션을 만들 수 있도록 합니다. 이 동작은 지원되지 않으며 내부 에러를 일으킬 수 있습니다.
@end deffn


버전 3.14에서 변경: Added support for @ref{1792,,UNNAMED_SECTION}.


@geindex set() (configparser.RawConfigParser 메서드)
@anchor{library/configparser configparser RawConfigParser set}@anchor{2fb8}
@deffn {메서드} set (section, option, value)

주어진 섹션이 존재하면, 주어진 옵션을 지정된 값으로 설정합니다; 그렇지 않으면 @ref{2fb0,,NoSectionError}를 발생시킵니다. 문자열이 아닌 값을 `내부에' 저장하도록 @ref{1163,,RawConfigParser}(또는 `raw' 매개 변수가 참으로 설정된 @ref{4de,,ConfigParser})를 사용할 수 있지만, 전체 기능(보간과 파일로의 출력을 포함하는)은 문자열 값으로만 수행할 수 있습니다.

이 메서드를 사용하면 문자열이 아닌 값을 키에 내부적으로 대입할 수 있습니다. 이 동작은 지원되지 않으며 파일에 쓰려고 하거나 비 원시 모드에서 가져오려고 할 때 에러가 발생합니다. 이러한 대입을 허용하지 않는 `매핑 프로토콜 API를 사용하십시오'.
@end deffn
@end deffn

@node 예외<6>,,RawConfigParser 객체,configparser — 구성 파일 구문 분석기
@anchor{library/configparser exceptions}@anchor{2fb9}
@subsubsection 예외


@geindex Error
@anchor{library/configparser configparser Error}@anchor{2fba}
@deffn {예외} configparser.Error

Base class for all other @code{configparser} exceptions.
@end deffn

@geindex NoSectionError
@anchor{library/configparser configparser NoSectionError}@anchor{2fb0}
@deffn {예외} configparser.NoSectionError

지정된 섹션을 찾지 못할 때 발생하는 예외.
@end deffn

@geindex DuplicateSectionError
@anchor{library/configparser configparser DuplicateSectionError}@anchor{1473}
@deffn {예외} configparser.DuplicateSectionError

이미 존재하는 이름으로 @ref{1472,,add_section()}을 호출하거나 엄격한(strict) 구문 분석기에서 단일 입력 파일, 문자열 또는 딕셔너리에서 섹션이 두 번 이상 발견될 때 발생하는 예외.


버전 3.2에서 변경: 선택적 `source'와 `lineno' 어트리뷰트 및 @code{__init__()}에 대한 인자를 추가했습니다.

@end deffn

@geindex DuplicateOptionError
@anchor{library/configparser configparser DuplicateOptionError}@anchor{1474}
@deffn {예외} configparser.DuplicateOptionError

단일 파일, 문자열 또는 딕셔너리에서 읽는 동안 단일 옵션이 두 번 나타날 때 엄격한(strict) 구문 분석기가 발생시키는 예외. 이는 맞춤법과 대소 문자 구분과 관련된 에러를 잡습니다, 예를 들어 딕셔너리에는 대소 문자를 구분하지 않는 같은 구성 키를 나타내는 두 개의 키가 있을 수 있습니다.
@end deffn

@geindex NoOptionError
@anchor{library/configparser configparser NoOptionError}@anchor{2fbb}
@deffn {예외} configparser.NoOptionError

지정된 섹션에서 지정된 옵션을 찾지 못할 때 발생하는 예외.
@end deffn

@geindex InterpolationError
@anchor{library/configparser configparser InterpolationError}@anchor{2fbc}
@deffn {예외} configparser.InterpolationError

문자열 보간 수행 시 문제가 발생할 때 발생하는 예외의 베이스 클래스.
@end deffn

@geindex InterpolationDepthError
@anchor{library/configparser configparser InterpolationDepthError}@anchor{2fbd}
@deffn {예외} configparser.InterpolationDepthError

이터레이션 횟수가 @ref{2fb3,,MAX_INTERPOLATION_DEPTH}를 초과하여 문자열 보간을 완료할 수 없을 때 발생하는 예외. @ref{2fbc,,InterpolationError}의 서브 클래스.
@end deffn

@geindex InterpolationMissingOptionError
@anchor{library/configparser configparser InterpolationMissingOptionError}@anchor{2fbe}
@deffn {예외} configparser.InterpolationMissingOptionError

값에서 참조된 옵션이 존재하지 않을 때 발생하는 예외. @ref{2fbc,,InterpolationError}의 서브 클래스.
@end deffn

@geindex InterpolationSyntaxError
@anchor{library/configparser configparser InterpolationSyntaxError}@anchor{2fbf}
@deffn {예외} configparser.InterpolationSyntaxError

치환이 이루어질 소스 텍스트가 요구되는 문법을 준수하지 않을 때 발생하는 예외. @ref{2fbc,,InterpolationError}의 서브 클래스.
@end deffn

@geindex MissingSectionHeaderError
@anchor{library/configparser configparser MissingSectionHeaderError}@anchor{2fc0}
@deffn {예외} configparser.MissingSectionHeaderError

섹션 헤더가 없는 파일을 구문 분석하려고 할 때 발생하는 예외.
@end deffn

@geindex ParsingError
@anchor{library/configparser configparser ParsingError}@anchor{728}
@deffn {예외} configparser.ParsingError

파일 구문 분석 중에 에러가 발생할 때 발생하는 예외.


버전 3.12에서 변경: 일관성을 위해 @code{filename} 어트리뷰트와 @code{__init__()} 생성자 인자가 제거되었습니다. 3.2부터 @code{source}라는 이름으로 사용할 수 있었습니다.

@end deffn

@geindex MultilineContinuationError
@anchor{library/configparser configparser MultilineContinuationError}@anchor{2fa9}
@deffn {예외} configparser.MultilineContinuationError

Exception raised when a key without a corresponding value is continued with
an indented line.


Added in version 3.13.

@end deffn

@geindex UnnamedSectionDisabledError
@anchor{library/configparser configparser UnnamedSectionDisabledError}@anchor{2fb7}
@deffn {예외} configparser.UnnamedSectionDisabledError

Exception raised when attempting to use the
@ref{1792,,UNNAMED_SECTION} without enabling it.

@quotation


Added in version 3.14.

@end quotation
@end deffn

@geindex InvalidWriteError
@anchor{library/configparser configparser InvalidWriteError}@anchor{1df}
@deffn {예외} configparser.InvalidWriteError

Exception raised when an attempted @ref{1de,,ConfigParser.write()} would not be parsed
accurately with a future @ref{166d,,ConfigParser.read()} call.

Ex: Writing a key beginning with the @ref{2f9e,,ConfigParser.SECTCRE} pattern
would parse as a section header when read. Attempting to write this will raise
this exception.


Added in version 3.14.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node tomllib — Parse TOML files,netrc — netrc 파일 처리,configparser — 구성 파일 구문 분석기,파일 형식
@anchor{library/tomllib doc}@anchor{2fc1}@anchor{library/tomllib module-tomllib}@anchor{102}@anchor{library/tomllib tomllib-parse-toml-files}@anchor{2fc2}@anchor{library/tomllib translation-repo}@anchor{2fc3}
@subsection @code{tomllib} — Parse TOML files


@geindex module; tomllib


Added in version 3.11.


`Source code:' Lib/tomllib@footnote{https://github.com/python/cpython/tree/3.14/Lib/tomllib}


__________________________________________________________________


This module provides an interface for parsing TOML 1.0.0 (Tom’s Obvious Minimal
Language, https://toml.io@footnote{https://toml.io/en/}). This module does not
support writing TOML.


@subsubheading 더 보기


The Tomli-W package@footnote{https://pypi.org/project/tomli-w/}
is a TOML writer that can be used in conjunction with this module,
providing a write API familiar to users of the standard library
@ref{91,,marshal} and @ref{ab,,pickle} modules.



@subsubheading 더 보기


The TOML Kit package@footnote{https://pypi.org/project/tomlkit/}
is a style-preserving TOML library with both read and write capability.
It is a recommended replacement for this module for editing already
existing TOML files.


This module defines the following functions:

@geindex load() (tomllib 모듈)
@anchor{library/tomllib tomllib load}@anchor{2fc4}
@deffn {함수} tomllib.load (fp, /, *, parse_float=float)

Read a TOML file. The first argument should be a readable and binary file object.
Return a @ref{183,,dict}. Convert TOML types to Python using this
@ref{2fc5,,conversion table}.

`parse_float' will be called with the string of every TOML
float to be decoded.  By default, this is equivalent to @code{float(num_str)}.
This can be used to use another datatype or parser for TOML floats
(e.g. @ref{1fe,,decimal.Decimal}). The callable must not return a
@ref{183,,dict} or a @ref{24d,,list}, else a @ref{2ec,,ValueError} is raised.

A @ref{190e,,TOMLDecodeError} will be raised on an invalid TOML document.
@end deffn

@geindex loads() (tomllib 모듈)
@anchor{library/tomllib tomllib loads}@anchor{192d}
@deffn {함수} tomllib.loads (s, /, *, parse_float=float)

Load TOML from a @ref{169,,str} object. Return a @ref{183,,dict}. Convert TOML
types to Python using this @ref{2fc5,,conversion table}. The
`parse_float' argument has the same meaning as in @ref{2fc4,,load()}.

A @ref{190e,,TOMLDecodeError} will be raised on an invalid TOML document.
@end deffn

The following exceptions are available:

@geindex TOMLDecodeError
@anchor{library/tomllib tomllib TOMLDecodeError}@anchor{190e}
@deffn {예외} tomllib.TOMLDecodeError (msg, doc, pos)

Subclass of @ref{2ec,,ValueError} with the following additional attributes:

@geindex msg (tomllib.TOMLDecodeError의 속성)
@anchor{library/tomllib tomllib TOMLDecodeError msg}@anchor{2fc6}
@deffn {속성} msg

The unformatted error message.
@end deffn

@geindex doc (tomllib.TOMLDecodeError의 속성)
@anchor{library/tomllib tomllib TOMLDecodeError doc}@anchor{2fc7}
@deffn {속성} doc

The TOML document being parsed.
@end deffn

@geindex pos (tomllib.TOMLDecodeError의 속성)
@anchor{library/tomllib tomllib TOMLDecodeError pos}@anchor{2fc8}
@deffn {속성} pos

The index of `doc' where parsing failed.
@end deffn

@geindex lineno (tomllib.TOMLDecodeError의 속성)
@anchor{library/tomllib tomllib TOMLDecodeError lineno}@anchor{2fc9}
@deffn {속성} lineno

The line corresponding to `pos'.
@end deffn

@geindex colno (tomllib.TOMLDecodeError의 속성)
@anchor{library/tomllib tomllib TOMLDecodeError colno}@anchor{2fca}
@deffn {속성} colno

The column corresponding to `pos'.
@end deffn


버전 3.14에서 변경: Added the `msg', `doc' and `pos' parameters.
Added the @ref{2fc6,,msg}, @ref{2fc7,,doc}, @ref{2fc8,,pos}, @ref{2fc9,,lineno} and @ref{2fca,,colno} attributes.



버전 3.14부터 폐지됨: Passing free-form positional arguments is deprecated.

@end deffn

@menu
* Examples: Examples<2>. 
* Conversion Table:: 

@end menu

@node Examples<2>,Conversion Table,,tomllib — Parse TOML files
@anchor{library/tomllib examples}@anchor{2fcb}
@subsubsection Examples


Parsing a TOML file:

@example
import tomllib

with open("pyproject.toml", "rb") as f:
    data = tomllib.load(f)
@end example

Parsing a TOML string:

@example
import tomllib

toml_str = """
python-version = "3.11.0"
python-implementation = "CPython"
"""

data = tomllib.loads(toml_str)
@end example

@node Conversion Table,,Examples<2>,tomllib — Parse TOML files
@anchor{library/tomllib conversion-table}@anchor{2fcc}
@subsubsection Conversion Table

@anchor{library/tomllib toml-to-py-table}@anchor{2fc5}

@multitable {xxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

TOML

@tab

Python

@item

TOML document

@tab

dict

@item

string

@tab

str

@item

integer

@tab

int

@item

float

@tab

float (configurable with `parse_float')

@item

boolean

@tab

bool

@item

offset date-time

@tab

datetime.datetime (@code{tzinfo} attribute set to an instance of @code{datetime.timezone})

@item

local date-time

@tab

datetime.datetime (@code{tzinfo} attribute set to @code{None})

@item

local date

@tab

datetime.date

@item

local time

@tab

datetime.time

@item

array

@tab

list

@item

table

@tab

dict

@item

inline table

@tab

dict

@item

array of tables

@tab

list of dicts

@end multitable


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node netrc — netrc 파일 처리,plistlib — 애플 plist 파일 생성과 구문 분석,tomllib — Parse TOML files,파일 형식
@anchor{library/netrc doc}@anchor{2fcd}@anchor{library/netrc module-netrc}@anchor{9f}@anchor{library/netrc netrc-netrc-file-processing}@anchor{2fce}@anchor{library/netrc translation-repo}@anchor{2fcf}
@subsection @code{netrc} — netrc 파일 처리


@geindex module; netrc

`소스 코드:' Lib/netrc.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/netrc.py}


__________________________________________________________________


@ref{1c77,,netrc} 클래스는 유닉스 @code{ftp} 프로그램과 다른 FTP 클라이언트가 사용하는 netrc 파일 형식을 구문 분석하고 캡슐화합니다.

@geindex netrc (netrc 클래스)
@anchor{library/netrc netrc netrc}@anchor{1c77}
@deffn {클래스} netrc.netrc ([file])

A @ref{1c77,,netrc} instance or subclass instance encapsulates data from  a netrc
file.  The initialization argument, if present, specifies the file to parse.  If
no argument is given, the file @code{.netrc} in the user’s home directory –
as determined by @ref{c08,,os.path.expanduser()} – will be read.  Otherwise,
a @ref{264,,FileNotFoundError} exception will be raised.
Parse errors will raise @ref{2fd0,,NetrcParseError} with diagnostic
information including the file name, line number, and terminating token.

If no argument is specified on a POSIX system, the presence of passwords in
the @code{.netrc} file will raise a @ref{2fd0,,NetrcParseError} if the file
ownership or permissions are insecure (owned by a user other than the user
running the process, or accessible for read or write by any other user).
This implements security behavior equivalent to that of ftp and other
programs that use @code{.netrc}. Such security checks are not available
on platforms that do not support @ref{181a,,os.getuid()}.


버전 3.4에서 변경: POSIX 권한 검사를 추가했습니다.



버전 3.7에서 변경: `file'이 인자로 전달되지 않으면 @ref{c08,,os.path.expanduser()}가 @code{.netrc} 파일의 위치를 찾는 데 사용됩니다.



버전 3.10에서 변경: @code{netrc} try UTF-8 encoding before using locale specific
encoding.
The entry in the netrc file no longer needs to contain all tokens.  The missing
tokens’ value default to an empty string.  All the tokens and their values now
can contain arbitrary characters, like whitespace and non-ASCII characters.
If the login name is anonymous, it won’t trigger the security check.

@end deffn

@geindex NetrcParseError
@anchor{library/netrc netrc NetrcParseError}@anchor{2fd0}
@deffn {예외} netrc.NetrcParseError

소스 텍스트에 문법적인 에러가 있을 때 @ref{1c77,,netrc} 클래스에서 발생하는 예외. 이 예외 인스턴스는 세 가지 흥미로운 어트리뷰트를 제공합니다.

@geindex msg (netrc.NetrcParseError의 속성)
@anchor{library/netrc netrc NetrcParseError msg}@anchor{2fd1}
@deffn {속성} msg

에러의 텍스트 설명.
@end deffn

@geindex filename (netrc.NetrcParseError의 속성)
@anchor{library/netrc netrc NetrcParseError filename}@anchor{2fd2}
@deffn {속성} filename

소스 파일의 이름.
@end deffn

@geindex lineno (netrc.NetrcParseError의 속성)
@anchor{library/netrc netrc NetrcParseError lineno}@anchor{2fd3}
@deffn {속성} lineno

에러가 발견된 줄 번호.
@end deffn
@end deffn

@menu
* netrc 객체:: 

@end menu

@node netrc 객체,,,netrc — netrc 파일 처리
@anchor{library/netrc id1}@anchor{2fd4}@anchor{library/netrc netrc-objects}@anchor{2fd5}
@subsubsection netrc 객체


@ref{1c77,,netrc} 인스턴스에는 다음과 같은 메서드가 있습니다:

@geindex authenticators() (netrc.netrc 메서드)
@anchor{library/netrc netrc netrc authenticators}@anchor{2fd6}
@deffn {메서드} netrc.authenticators (host)

`host'에 대한 인증 자의 3-tuple @code{(login, account, password)}를 반환합니다. netrc 파일에 주어진 호스트에 대한 항목이 없으면 ‘default’ 항목과 연관된 튜플을 반환합니다. 일치하는 호스트도 기본 항목도 사용할 수 없으면 @code{None}을 반환합니다.
@end deffn

@geindex __repr__() (netrc.netrc 메서드)
@anchor{library/netrc netrc netrc __repr__}@anchor{2fd7}
@deffn {메서드} netrc.__repr__ ()

클래스 데이터를 netrc 파일의 형식의 문자열로 덤프합니다. (이것은 주석을 버리고 엔트리를 재정렬할 수 있습니다.)
@end deffn

@ref{1c77,,netrc}의 인스턴스에는 공개 인스턴스 변수가 있습니다:

@geindex hosts (netrc.netrc의 속성)
@anchor{library/netrc netrc netrc hosts}@anchor{2fd8}
@deffn {속성} netrc.hosts

호스트 이름을 @code{(login, account, password)} 튜플에 매핑하는 딕셔너리. ‘default’ 항목이 있으면 그 이름의 의사 호스트로 표시됩니다.
@end deffn

@geindex macros (netrc.netrc의 속성)
@anchor{library/netrc netrc netrc macros}@anchor{2fd9}
@deffn {속성} netrc.macros

매크로 이름을 문자열 리스트에 매핑하는 딕셔너리.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node plistlib — 애플 plist 파일 생성과 구문 분석,,netrc — netrc 파일 처리,파일 형식
@anchor{library/plistlib doc}@anchor{2fda}@anchor{library/plistlib module-plistlib}@anchor{b0}@anchor{library/plistlib plistlib-generate-and-parse-apple-plist-files}@anchor{2fdb}@anchor{library/plistlib translation-repo}@anchor{2fdc}
@subsection @code{plistlib} — 애플 @code{.plist} 파일 생성과 구문 분석


@geindex module; plistlib

@c (harvested from docstrings in the original file)

`소스 코드:' Lib/plistlib.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/plistlib.py}

@geindex plist;파일
@geindex 프로퍼티 리스트


__________________________________________________________________


이 모듈은 애플, 주로 macOS와 iOS에서 사용되는 “프로퍼티 리스트(property list)” 파일을 읽고 쓰는 인터페이스를 제공합니다. 이 모듈은 바이너리와 XML plist 파일을 모두 지원합니다.

프로퍼티 리스트 (@code{.plist}) 파일 형식은 딕셔너리, 리스트, 숫자 및 문자열과 같은 기본 객체 형을 지원하는 간단한 직렬화입니다. 일반적으로 최상위 객체는 딕셔너리입니다.

plist 파일을 쓰고 구문 분석하려면, @ref{b4a,,dump()}와 @ref{b48,,load()} 함수를 사용하십시오.

plist 데이터를 바이트열이나 문자열 객체로 작업하려면, @ref{b4b,,dumps()}와 @ref{b49,,loads()}를 사용하십시오.

값은 문자열, 정수, 부동 소수점, 논릿값, 튜플, 리스트, 딕셔너리 (단, 문자열 키만 가능), @ref{192,,bytes}, @ref{344,,bytearray} 또는 @ref{4e2,,datetime.datetime} 객체일 수 있습니다.


버전 3.4에서 변경: 새 API, 이전 API는 폐지되었습니다. 바이너리 형식 plist에 대한 지원이 추가되었습니다.



버전 3.8에서 변경: NSKeyedArchiver 와 NSKeyedUnarchiver 에서 사용되듯이 바이너리 plist에서 @ref{c15,,UID} 토큰을 읽고 쓰는 것에 대한 지원이 추가되었습니다.



버전 3.9에서 변경: 낡은 API가 제거되었습니다.



@subsubheading 더 보기



@table @asis

@item PList 매뉴얼 페이지@footnote{https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/PropertyLists/}

애플의 파일 형식 설명서.
@end table


이 모듈은 다음 함수를 정의합니다:

@geindex load() (plistlib 모듈)
@anchor{library/plistlib plistlib load}@anchor{b48}
@deffn {함수} plistlib.load (fp, *, fmt=None, dict_type=dict, aware_datetime=False)

plist 파일을 읽습니다. `fp'는 읽을 수 있는 바이너리 파일 객체여야 합니다. 해독된 루트 객체를 반환합니다 (일반적으로 딕셔너리입니다).

`fmt'는 파일의 형식이며 다음 값이 유효합니다:


@itemize *

@item 
@ref{884,,None}: 파일 형식을 자동 감지

@item 
@ref{1178,,FMT_XML}: XML 파일 형식

@item 
@ref{1179,,FMT_BINARY}: 바이너리 plist 형식
@end itemize

`dict_type'은 plist 파일에서 읽은 딕셔너리에 사용되는 형입니다.

When `aware_datetime' is true, fields with type @code{datetime.datetime} will
be created as @ref{28bd,,aware object}, with
@code{tzinfo} as @ref{712,,datetime.UTC}.

@ref{1178,,FMT_XML} 형식의 XML 데이터는 @ref{12c,,xml.parsers.expat} 의 Expat 구문 분석기로 구문 분석됩니다 – 잘못된 형식의 XML로 인한 예외에 대해서는 해당 설명서를 참조하십시오. 알 수 없는 엘리먼트는 plist 구문분석기에서 단순히 무시됩니다.

구문 분석기는 파일을 구문 분석할 수 없을 때 @ref{1cf7,,InvalidFileException}를 발생시킵니다.


Added in version 3.4.



버전 3.13에서 변경: 키워드 전용 매개 변수 `aware_datetime'이 추가되었습니다.

@end deffn

@geindex loads() (plistlib 모듈)
@anchor{library/plistlib plistlib loads}@anchor{b49}
@deffn {함수} plistlib.loads (data, *, fmt=None, dict_type=dict, aware_datetime=False)

바이트열이나 문자열 객체에서 plist를 로드합니다. 키워드 인자에 대한 설명은 @ref{b48,,load()}를 참조하십시오.


Added in version 3.4.



버전 3.13에서 변경: `data' can be a string when `fmt' equals @ref{1178,,FMT_XML}.

@end deffn

@geindex dump() (plistlib 모듈)
@anchor{library/plistlib plistlib dump}@anchor{b4a}
@deffn {함수} plistlib.dump (value, fp, *, fmt=FMT_XML, sort_keys=True, skipkeys=False, aware_datetime=False)

plist 파일에 `value'를 씁니다. `fp'는 쓰기 가능한 바이너리 파일 객체여야 합니다.

`fmt' 인자는 plist 파일의 형식을 지정하며 다음 값 중 하나일 수 있습니다:


@itemize *

@item 
@ref{1178,,FMT_XML}: XML 형식의 plist 파일

@item 
@ref{1179,,FMT_BINARY}: 바이너리 형식의 plist 파일
@end itemize

`sort_keys'가 참(기본값)이면 딕셔너리의 키가 정렬된 순서로 plist에 기록되고, 그렇지 않으면 딕셔너리의 이터레이션 순서로 기록됩니다.

`skipkeys'가 거짓(기본값)일 때, 딕셔너리의 키가 문자열이 아니면 함수는 @ref{198,,TypeError}를 발생시킵니다. 그렇지 않으면 해당 키를 건너뜁니다.

When `aware_datetime' is true and any field with type @code{datetime.datetime}
is set as an @ref{28bd,,aware object}, it will convert to
UTC timezone before writing it.

객체가 지원되지 않는 형이거나 지원되지 않는 형의 객체를 포함하는 컨테이너면 @ref{198,,TypeError}가 발생합니다.

(바이너리) plist 파일에서 표현할 수 없는 정숫값은 @ref{a81,,OverflowError}를 발생시킵니다.


Added in version 3.4.



버전 3.13에서 변경: 키워드 전용 매개 변수 `aware_datetime'이 추가되었습니다.

@end deffn

@geindex dumps() (plistlib 모듈)
@anchor{library/plistlib plistlib dumps}@anchor{b4b}
@deffn {함수} plistlib.dumps (value, *, fmt=FMT_XML, sort_keys=True, skipkeys=False, aware_datetime=False)

plist 형식의 바이트열 객체로 `value'를 반환합니다. 이 함수의 키워드 인자에 대한 설명은 @ref{b4a,,dump()} 설명서를 참조하십시오.


Added in version 3.4.

@end deffn

다음 클래스를 사용할 수 있습니다:

@geindex UID (plistlib 클래스)
@anchor{library/plistlib plistlib UID}@anchor{c15}
@deffn {클래스} plistlib.UID (data)

@ref{19b,,int}를 감쌉니다. 이것은 UID를 포함하는 NSKeyedArchiver 인코딩된 데이터를 읽거나 쓸 때 사용됩니다 (PList 매뉴얼을 참조하십시오).

@geindex data (plistlib.UID의 속성)
@anchor{library/plistlib plistlib UID data}@anchor{2fdd}
@deffn {속성} data

UID의 int 값. 반드시 범위 @code{0 <= data < 2**64}에 있어야 합니다.
@end deffn


Added in version 3.8.

@end deffn

다음 상수를 사용할 수 있습니다:

@geindex FMT_XML (plistlib 모듈)
@anchor{library/plistlib plistlib FMT_XML}@anchor{1178}
@deffn {데이터} plistlib.FMT_XML

plist 파일의 XML 형식.


Added in version 3.4.

@end deffn

@geindex FMT_BINARY (plistlib 모듈)
@anchor{library/plistlib plistlib FMT_BINARY}@anchor{1179}
@deffn {데이터} plistlib.FMT_BINARY

plist 파일의 바이너리 형식


Added in version 3.4.

@end deffn

이 모듈은 다음 예외를 정의합니다:

@geindex InvalidFileException
@anchor{library/plistlib plistlib InvalidFileException}@anchor{1cf7}
@deffn {예외} plistlib.InvalidFileException

파일을 구문 분석할 수 없을 때 발생합니다.


Added in version 3.4.

@end deffn

@menu
* 예제: 예제<11>. 

@end menu

@node 예제<11>,,,plistlib — 애플 plist 파일 생성과 구문 분석
@anchor{library/plistlib examples}@anchor{2fde}
@subsubsection 예제


plist 만들기:

@example
import datetime as dt
import plistlib

pl = dict(
    aString = "Doodah",
    aList = ["A", "B", 12, 32.1, [1, 2, 3]],
    aFloat = 0.1,
    anInt = 728,
    aDict = dict(
        anotherString = "<hello & hi there!>",
        aThirdString = "M\xe4ssig, Ma\xdf",
        aTrueValue = True,
        aFalseValue = False,
    ),
    someData = b"<binary gunk>",
    someMoreData = b"<lots of binary gunk>" * 10,
    aDate = dt.datetime.now()
)
print(plistlib.dumps(pl).decode())
@end example

plist 구문 분석하기:

@example
import plistlib

plist = b"""<plist version="1.0">
<dict>
    <key>foo</key>
    <string>bar</string>
</dict>
</plist>"""
pl = plistlib.loads(plist)
print(pl["foo"])
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 암호화 서비스,일반 운영 체제 서비스,파일 형식,파이썬 표준 라이브러리
@anchor{library/crypto doc}@anchor{2fdf}@anchor{library/crypto crypto}@anchor{2fe0}@anchor{library/crypto cryptographic-services}@anchor{2fe1}@anchor{library/crypto translation-repo}@anchor{2fe2}
@section 암호화 서비스


@geindex 암호화

이 장에서 설명하는 모듈은 다양한 암호화 알고리즘을 구현합니다. 가용성은 설치에 달려있습니다. 다음은 개요입니다:

@menu
* hashlib — 보안 해시와 메시지 요약:: 
* hmac — 메시지 인증을 위한 키 해싱:: 
* secrets — 비밀 관리를 위한 안전한 난수 생성:: 

@end menu

@node hashlib — 보안 해시와 메시지 요약,hmac — 메시지 인증을 위한 키 해싱,,암호화 서비스
@anchor{library/hashlib doc}@anchor{2fe3}@anchor{library/hashlib hashlib-secure-hashes-and-message-digests}@anchor{2fe4}@anchor{library/hashlib module-hashlib}@anchor{6c}
@subsection @code{hashlib} — 보안 해시와 메시지 요약


@geindex module; hashlib

`소스 코드:' Lib/hashlib.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/hashlib.py}

@geindex 메시지 다이제스트@comma{} MD5
@geindex secure hash algorithm@comma{} SHA1@comma{} SHA2@comma{} SHA224@comma{} SHA256@comma{} SHA384@comma{} SHA512@comma{} SHA3@comma{} Shake@comma{} Blake2

@c import hashlib


__________________________________________________________________


This module implements a common interface to many different hash algorithms.
Included are the FIPS secure hash algorithms SHA224, SHA256, SHA384, SHA512,
(defined in the FIPS 180-4 standard@footnote{https://csrc.nist.gov/pubs/fips/180-4/upd1/final}), the SHA-3 series (defined in the FIPS 202 standard@footnote{https://csrc.nist.gov/pubs/fips/202/final}) as well as the legacy algorithms SHA1 (formerly part of FIPS@footnote{https://csrc.nist.gov/news/2023/decision-to-revise-fips-180-4})
and the MD5 algorithm (defined in internet 
@geindex RFC; RFC 1321
RFC 1321@footnote{https://datatracker.ietf.org/doc/html/rfc1321.html}).

@cartouche
@quotation 참고 
adler32나 crc32 해시 함수를 원한다면, @ref{139,,zlib} 모듈에 있습니다.
@end quotation
@end cartouche

@menu
* 해시 알고리즘:: 
* 사용법:: 
* 생성자:: 
* 어트리뷰트:: 
* 해시 객체:: 
* SHAKE 가변 길이 요약:: 
* 파일 해싱:: 
* 키 파생:: 
* BLAKE2:: 

@end menu

@node 해시 알고리즘,사용법,,hashlib — 보안 해시와 메시지 요약
@anchor{library/hashlib hash-algorithms}@anchor{2fe5}@anchor{library/hashlib id1}@anchor{2fe6}
@subsubsection 해시 알고리즘


`해시(hash)'의 유형마다 이름이 지정된 생성자 메서드가 있습니다. 모두 같은 간단한 인터페이스를 갖는 해시 객체를 반환합니다. 예를 들어: SHA-256 해시 객체를 만들려면 @ref{18af,,sha256()}을 사용하십시오. 이제 @ref{2fe7,,update} 메서드를 사용하여 이 객체에 @ref{193,,바이트열류 객체}(보통 @ref{192,,bytes})를 공급할 수 있습니다. 언제든지 @ref{2fe8,,digest()}나 @ref{2fe9,,hexdigest()} 메서드를 사용하여 지금까지 공급된 데이터의 연결에 대한 `요약(digest)'을 요청할 수 있습니다.

To allow multithreading, the Python @ref{164,,GIL} is released while computing a
hash supplied more than 2047 bytes of data at once in its constructor or
@ref{2fe7,,.update} method.

@geindex OpenSSL;(모듈 hashlib 에서의 사용)

이 모듈에 항상 존재하는 해시 알고리즘의 생성자는 @ref{2fea,,sha1()}, @ref{2feb,,sha224()}, @ref{18af,,sha256()}, @ref{2fec,,sha384()}, @ref{2fed,,sha512()}, @ref{e9f,,sha3_224()}, @ref{ea0,,sha3_256()}, @ref{ea1,,sha3_384()}, @ref{ea2,,sha3_512()}, @ref{ea3,,shake_128()}, @ref{ea4,,shake_256()}, @ref{851,,blake2b()} 및 @ref{852,,blake2s()}입니다. @ref{1826,,md5()}는 일반적으로 사용할 수 있지만, 드문 “FIPS 호환” 파이썬 빌드를 사용하는 경우에는 빠지거나 차단될 수 있습니다. 이는 @ref{1578,,algorithms_guaranteed}에 해당합니다.

Additional algorithms may also be available if your Python distribution’s
@code{hashlib} was linked against a build of OpenSSL that provides others.
Others `are not guaranteed available' on all installations and will only be
accessible by name via @ref{1d2b,,new()}.  See @ref{1579,,algorithms_available}.

@cartouche
@quotation 경고 
(MD5와 SHA1을 포함하는) 일부 알고리즘은 해시 충돌 약점(hash collision weaknesses)이 알려져 있습니다. Attacks on cryptographic hash algorithms@footnote{https://en.wikipedia.org/wiki/Cryptographic_hash_function#Attacks_on_cryptographic_hash_algorithms}와 이 문서의 끝에 있는 @ref{2fee,,더 보기} 섹션을 참조하십시오.
@end quotation
@end cartouche


Added in version 3.6: SHA3(Keccak)과 SHAKE 생성자 @ref{e9f,,sha3_224()}, @ref{ea0,,sha3_256()}, @ref{ea1,,sha3_384()}, @ref{ea2,,sha3_512()}, @ref{ea3,,shake_128()}, @ref{ea4,,shake_256()}이 추가되었습니다. @ref{851,,blake2b()}와 @ref{852,,blake2s()}가 추가되었습니다.

@anchor{library/hashlib hashlib-usedforsecurity}@anchor{2fef}

버전 3.9에서 변경: 모든 hashlib 생성자는 기본값이 @code{True}인 키워드 전용 인자 `usedforsecurity'를 취합니다. 값이 거짓이면 제한된 환경에서 안전하지 않고 차단된 해싱 알고리즘 사용을 허락합니다. @code{False}는 해싱 알고리즘이 보안 문맥에서 사용되지 않음을 나타냅니다, 예를 들어 암호화가 아닌 단방향 압축 함수로.



버전 3.9에서 변경: Hashlib는 이제 OpenSSL 에서 SHA3와 SHAKE를 제공하는 경우 이를 사용합니다.



버전 3.12에서 변경: For any of the MD5, SHA1, SHA2, or SHA3 algorithms that the linked
OpenSSL does not provide we fall back to a verified implementation from
the HACL* project@footnote{https://github.com/hacl-star/hacl-star}.


@node 사용법,생성자,해시 알고리즘,hashlib — 보안 해시와 메시지 요약
@anchor{library/hashlib usage}@anchor{2ff0}
@subsubsection 사용법


바이트 문자열 @code{b"Nobody inspects the spammish repetition"}의 요약을 얻으려면 다음을 수행하십시오:

@example
>>> import hashlib
>>> m = hashlib.sha256()
>>> m.update(b"Nobody inspects")
>>> m.update(b" the spammish repetition")
>>> m.digest()
b'\x03\x1e\xdd@}Ae\x15\x93\xc5\xfe\\\x00o\xa5u+7\xfd\xdf\xf7\xbcN\x84:\xa6\xaf\x0c\x95\x0fK\x94\x06'
>>> m.hexdigest()
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
@end example

더 압축하면:

@example
>>> hashlib.sha256(b"Nobody inspects the spammish repetition").hexdigest()
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
@end example

@node 생성자,어트리뷰트,사용법,hashlib — 보안 해시와 메시지 요약
@anchor{library/hashlib constructors}@anchor{2ff1}
@subsubsection 생성자


@geindex new() (hashlib 모듈)
@anchor{library/hashlib hashlib new}@anchor{1d2b}
@deffn {함수} hashlib.new (name[, data], *, usedforsecurity=True)

원하는 알고리즘의 문자열 `name'을 첫 번째 매개 변수로 취하는 일반 생성자입니다. 또한 위에 나열된 해시뿐만 아니라 OpenSSL 라이브러리가 제공할 수 있는 다른 알고리즘에 대한 액세스를 허용하기 위해 존재합니다.
@end deffn

알고리즘 이름으로 @ref{1d2b,,new()} 사용하기:

@example
>>> h = hashlib.new('sha256')
>>> h.update(b"Nobody inspects the spammish repetition")
>>> h.hexdigest()
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
@end example

@geindex md5() (hashlib 모듈)
@anchor{library/hashlib hashlib md5}@anchor{1826}
@deffn {함수} hashlib.md5 ([data], *, usedforsecurity=True)
@end deffn

@geindex sha1() (hashlib 모듈)
@anchor{library/hashlib hashlib sha1}@anchor{2fea}
@deffn {함수} hashlib.sha1 ([data], *, usedforsecurity=True)
@end deffn

@geindex sha224() (hashlib 모듈)
@anchor{library/hashlib hashlib sha224}@anchor{2feb}
@deffn {함수} hashlib.sha224 ([data], *, usedforsecurity=True)
@end deffn

@geindex sha256() (hashlib 모듈)
@anchor{library/hashlib hashlib sha256}@anchor{18af}
@deffn {함수} hashlib.sha256 ([data], *, usedforsecurity=True)
@end deffn

@geindex sha384() (hashlib 모듈)
@anchor{library/hashlib hashlib sha384}@anchor{2fec}
@deffn {함수} hashlib.sha384 ([data], *, usedforsecurity=True)
@end deffn

@geindex sha512() (hashlib 모듈)
@anchor{library/hashlib hashlib sha512}@anchor{2fed}
@deffn {함수} hashlib.sha512 ([data], *, usedforsecurity=True)
@end deffn

@geindex sha3_224() (hashlib 모듈)
@anchor{library/hashlib hashlib sha3_224}@anchor{e9f}
@deffn {함수} hashlib.sha3_224 ([data], *, usedforsecurity=True)
@end deffn

@geindex sha3_256() (hashlib 모듈)
@anchor{library/hashlib hashlib sha3_256}@anchor{ea0}
@deffn {함수} hashlib.sha3_256 ([data], *, usedforsecurity=True)
@end deffn

@geindex sha3_384() (hashlib 모듈)
@anchor{library/hashlib hashlib sha3_384}@anchor{ea1}
@deffn {함수} hashlib.sha3_384 ([data], *, usedforsecurity=True)
@end deffn

@geindex sha3_512() (hashlib 모듈)
@anchor{library/hashlib hashlib sha3_512}@anchor{ea2}
@deffn {함수} hashlib.sha3_512 ([data], *, usedforsecurity=True)
@end deffn

이름 붙은 생성자는 알고리즘 이름을 @ref{1d2b,,new()}로 전달하는 것보다 빠릅니다.

@node 어트리뷰트,해시 객체,생성자,hashlib — 보안 해시와 메시지 요약
@anchor{library/hashlib attributes}@anchor{2ff2}
@subsubsection 어트리뷰트


hashlib는 다음과 같은 상수 모듈 어트리뷰트를 제공합니다:

@geindex algorithms_guaranteed (hashlib 모듈)
@anchor{library/hashlib hashlib algorithms_guaranteed}@anchor{1578}
@deffn {데이터} hashlib.algorithms_guaranteed

모든 플랫폼에서 이 모듈이 지원하도록 보장된 해시 알고리즘의 이름을 포함하는 집합. ‘md5’는 일부 업스트림 공급자가 이를 제외하는 이상한 “FIPS 호환” 파이썬 빌드를 제공하지만, 이 목록에 있음에 유의하십시오.


Added in version 3.2.

@end deffn

@geindex algorithms_available (hashlib 모듈)
@anchor{library/hashlib hashlib algorithms_available}@anchor{1579}
@deffn {데이터} hashlib.algorithms_available

실행 중인 파이썬 인터프리터에서 사용 가능한 해시 알고리즘의 이름이 포함된 집합. 이 이름들은 @ref{1d2b,,new()}에 전달될 때 인식됩니다. @ref{1578,,algorithms_guaranteed}는 항상 부분 집합입니다. 이 집합에서 같은 알고리즘이 다른 이름으로 여러 번 나타날 수 있습니다 (OpenSSL 덕분입니다).


Added in version 3.2.

@end deffn

@node 해시 객체,SHAKE 가변 길이 요약,어트리뷰트,hashlib — 보안 해시와 메시지 요약
@anchor{library/hashlib hash-objects}@anchor{2ff3}
@subsubsection 해시 객체


다음 값은 생성자가 반환한 해시 객체의 상수 어트리뷰트로 제공됩니다:

@geindex hash.digest_size (hashlib 모듈)
@anchor{library/hashlib hashlib hash digest_size}@anchor{2ff4}
@deffn {데이터} hash.digest_size

결과 해시의 바이트 단위의 크기.
@end deffn

@geindex hash.block_size (hashlib 모듈)
@anchor{library/hashlib hashlib hash block_size}@anchor{2ff5}
@deffn {데이터} hash.block_size

해시 알고리즘의 바이트 단위의 내부 블록 크기.
@end deffn

해시 객체에는 다음과 같은 어트리뷰트가 있습니다:

@geindex name (hashlib.hash의 속성)
@anchor{library/hashlib hashlib hash name}@anchor{1146}
@deffn {속성} hash.name

이 해시의 규범적 이름, 항상 소문자이며 항상 이 유형의 다른 해시를 만들기 위한 @ref{1d2b,,new()}에 대한 매개 변수로 적합합니다.


버전 3.4에서 변경: name 어트리뷰트는 처음부터 CPython에 존재했지만, 파이썬 3.4 이전에는 공식적으로 지정되지 않아서, 일부 플랫폼에는 존재하지 않을 수 있습니다.

@end deffn

해시 객체에는 다음과 같은 메서드가 있습니다:

@geindex update() (hashlib.hash 메서드)
@anchor{library/hashlib hashlib hash update}@anchor{2fe7}
@deffn {메서드} hash.update (data)

@ref{193,,바이트열류 객체}로 해시 객체를 갱신합니다. 반복되는 호출은 모든 인자를 이어붙인 단일 호출과 동등합니다: @code{m.update(a); m.update(b)}는 @code{m.update(a+b)}와 동등합니다.
@end deffn

@geindex digest() (hashlib.hash 메서드)
@anchor{library/hashlib hashlib hash digest}@anchor{2fe8}
@deffn {메서드} hash.digest ()

지금까지 @ref{2fe7,,update()} 메서드에 전달된 데이터의 요약을 반환합니다. 이것은 @ref{2ff4,,digest_size} 크기의 바이트열 객체이며 0에서 255까지의 전체 범위에 있는 바이트를 포함할 수 있습니다.
@end deffn

@geindex hexdigest() (hashlib.hash 메서드)
@anchor{library/hashlib hashlib hash hexdigest}@anchor{2fe9}
@deffn {메서드} hash.hexdigest ()

@ref{2fe8,,digest()}와 유사하지만, 요약은 16진수 숫자만 포함하는 두 배 길이의 문자열 객체로 반환됩니다. 전자 메일이나 기타 바이너리가 아닌 환경에서 값을 안전하게 교환하는 데 사용할 수 있습니다.
@end deffn

@geindex copy() (hashlib.hash 메서드)
@anchor{library/hashlib hashlib hash copy}@anchor{2ff6}
@deffn {메서드} hash.copy ()

해시 객체의 사본(“복제본”)을 반환합니다. 이것은 공통된 초기 부분 문자열을 공유하는 데이터의 요약을 효율적으로 계산하는 데 사용될 수 있습니다.
@end deffn

@node SHAKE 가변 길이 요약,파일 해싱,해시 객체,hashlib — 보안 해시와 메시지 요약
@anchor{library/hashlib shake-variable-length-digests}@anchor{2ff7}
@subsubsection SHAKE 가변 길이 요약


@geindex shake_128() (hashlib 모듈)
@anchor{library/hashlib hashlib shake_128}@anchor{ea3}
@deffn {함수} hashlib.shake_128 ([data], *, usedforsecurity=True)
@end deffn

@geindex shake_256() (hashlib 모듈)
@anchor{library/hashlib hashlib shake_256}@anchor{ea4}
@deffn {함수} hashlib.shake_256 ([data], *, usedforsecurity=True)
@end deffn

@ref{ea3,,shake_128()}과 @ref{ea4,,shake_256()} 알고리즘은 length_in_bits//2 (최대 128이나 256) 비트의 보안성으로 가변 길이 요약을 제공합니다. 따라서 digest 메서드에는 길이(length)가 필요합니다. 최대 길이는 SHAKE 알고리즘에 의해 제한되지 않습니다.

@geindex digest() (hashlib.shake 메서드)
@anchor{library/hashlib hashlib shake digest}@anchor{1e16}
@deffn {메서드} shake.digest (length)

지금까지 @ref{2fe7,,update()} 메서드에 전달된 데이터의 요약을 반환합니다. 이것은 `length' 크기의 바이트열 객체이며 0에서 255까지의 전체 범위에 있는 바이트를 포함할 수 있습니다.
@end deffn

@geindex hexdigest() (hashlib.shake 메서드)
@anchor{library/hashlib hashlib shake hexdigest}@anchor{1e17}
@deffn {메서드} shake.hexdigest (length)

@ref{1e16,,digest()}와 유사하지만, 요약은 16진수 숫자만 포함하는 두 배 길이의 문자열 객체로 반환됩니다. 전자 메일이나 기타 바이너리가 아닌 환경에서 값을 교환하는 데 사용할 수 있습니다.
@end deffn

사용 예:

@example
>>> h = hashlib.shake_256(b'Nobody inspects the spammish repetition')
>>> h.hexdigest(20)
'44709d6fcb83d92a76dcb0b668c98e1b1d3dafe7'
@end example

@node 파일 해싱,키 파생,SHAKE 가변 길이 요약,hashlib — 보안 해시와 메시지 요약
@anchor{library/hashlib file-hashing}@anchor{2ff8}
@subsubsection 파일 해싱


The hashlib module provides a helper function for efficient hashing of
a file or file-like object.

@geindex file_digest() (hashlib 모듈)
@anchor{library/hashlib hashlib file_digest}@anchor{853}
@deffn {함수} hashlib.file_digest (fileobj, digest, /)

Return a digest object that has been updated with contents of file object.

`fileobj' must be a file-like object opened for reading in binary mode.
It accepts file objects from  builtin @ref{316,,open()}, @ref{10a3,,BytesIO}
instances, SocketIO objects from @ref{13a4,,socket.socket.makefile()}, and
similar. `fileobj' must be opened in blocking mode, otherwise a
@ref{235,,BlockingIOError} may be raised.

The function may bypass Python’s I/O and use the file descriptor
from @ref{17b4,,fileno()} directly. `fileobj' must be assumed to be
in an unknown state after this function returns or raises. It is up to
the caller to close `fileobj'.

`digest' must either be a hash algorithm name as a `str', a hash
constructor, or a callable that returns a hash object.

예제:

@example
>>> import io, hashlib, hmac
>>> with open("library/hashlib.rst", "rb") as f:
...     digest = hashlib.file_digest(f, "sha256")
...
>>> digest.hexdigest()
'...'
@end example

@example
>>> buf = io.BytesIO(b"somedata")
>>> mac1 = hmac.HMAC(b"key", digestmod=hashlib.sha512)
>>> digest = hashlib.file_digest(buf, lambda: mac1)
@end example

@example
>>> digest is mac1
True
>>> mac2 = hmac.HMAC(b"key", b"somedata", digestmod=hashlib.sha512)
>>> mac1.digest() == mac2.digest()
True
@end example


Added in version 3.11.



버전 3.14에서 변경: Now raises a @ref{235,,BlockingIOError} if the file is opened in non-blocking
mode. Previously, spurious null bytes were added to the digest.

@end deffn

@node 키 파생,BLAKE2,파일 해싱,hashlib — 보안 해시와 메시지 요약
@anchor{library/hashlib key-derivation}@anchor{2ff9}
@subsubsection 키 파생


키 파생(key derivation)과 키 확장(key stretching) 알고리즘은 안전한 암호 해싱을 위해 설계되었습니다. @code{sha1(password)}와 같은 순진한 알고리즘은 무차별 대입 공격에 내성이 없습니다. 올바른 암호 해싱 함수는 조정할 수 있고, 느리고, 솔트(salt)@footnote{https://en.wikipedia.org/wiki/Salt_%28cryptography%29}를 포함해야 합니다.

@geindex pbkdf2_hmac() (hashlib 모듈)
@anchor{library/hashlib hashlib pbkdf2_hmac}@anchor{732}
@deffn {함수} hashlib.pbkdf2_hmac (hash_name, password, salt, iterations, dklen=None)

이 함수는 PKCS#5 암호 기반 키 파생 함수 2를 제공합니다. 의사 난수 함수로 HMAC을 사용합니다.

문자열 `hash_name'은 원하는 HMAC을 위한 해시 요약 알고리즘의 이름입니다, 예를 들어 ‘sha1’이나 ‘sha256’. `password'와 `salt'는 바이트 버퍼로 해석됩니다. 응용 프로그램과 라이브러리는 `password'를 적당한 길이(예를 들어 1024)로 제한해야 합니다. `salt'는 적절한 소스(예를 들어 @ref{745,,os.urandom()})로부터 온 약 16이나 그 이상의 바이트여야 합니다.

The number of `iterations' should be chosen based on the hash algorithm and
computing power. As of 2022, hundreds of thousands of iterations of SHA-256
are suggested. For rationale as to why and how to choose what is best for
your application, read `Appendix A.2.2' of NIST-SP-800-132@footnote{https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-132.pdf}. The answers
on the stackexchange pbkdf2 iterations question@footnote{https://security.stackexchange.com/questions/3959/recommended-of-iterations-when-using-pbkdf2-sha256/} explain in detail.

`dklen'은 파생 키의 바이트 수로 표현한 길이입니다. `dklen'이 @code{None}이면 해시 알고리즘 `hash_name'의 요약 크기가 사용됩니다, 예를 들어 SHA-512의 경우 64.

@example
>>> from hashlib import pbkdf2_hmac
>>> our_app_iters = 500_000  # Application specific, read above.
>>> dk = pbkdf2_hmac('sha256', b'password', b'bad salt' * 2, our_app_iters)
>>> dk.hex()
'15530bba69924174860db778f2c6f8104d3aaf9d26241840c8c4a641c8d000a9'
@end example

Function only available when Python is compiled with OpenSSL.


Added in version 3.4.



버전 3.12에서 변경: Function now only available when Python is built with OpenSSL. The slow
pure Python implementation has been removed.

@end deffn

@geindex scrypt() (hashlib 모듈)
@anchor{library/hashlib hashlib scrypt}@anchor{e37}
@deffn {함수} hashlib.scrypt (password, *, salt, n, r, p, maxmem=0, dklen=64)

이 함수는 
@geindex RFC; RFC 7914
RFC 7914@footnote{https://datatracker.ietf.org/doc/html/rfc7914.html}에 정의된 대로 scrypt 암호 기반 키 파생 함수를 제공합니다.

`password'와 `salt'는 @ref{193,,바이트열류 객체}여야 합니다. 응용 프로그램과 라이브러리는 `password'를 적당한 길이(예를 들어 1024)로 제한해야 합니다. `salt'는 적절한 소스(예를 들어 @ref{745,,os.urandom()})로부터 온 약 16이나 그 이상의 바이트여야 합니다.

`n'은 CPU/ 메모리 비용 계수, `r'은 블록 크기, `p'는 병렬화 계수이고 `maxmem'은 메모리를 제한합니다 (OpenSSL 1.1.0의 기본값은 32 MiB 입니다). `dklen'은 파생 키의 바이트 수로 표현한 길이입니다.


Added in version 3.6.

@end deffn

@node BLAKE2,,키 파생,hashlib — 보안 해시와 메시지 요약
@anchor{library/hashlib blake2}@anchor{2ffa}@anchor{library/hashlib hashlib-blake2}@anchor{2ffb}
@subsubsection BLAKE2


@geindex blake2b@comma{} blake2s

BLAKE2@footnote{https://www.blake2.net}는 
@geindex RFC; RFC 7693
RFC 7693@footnote{https://datatracker.ietf.org/doc/html/rfc7693.html}에 정의된 암호화 해시 함수로, 두 가지 방식으로 제공됩니다:


@itemize *

@item 
`BLAKE2b', 64비트 플랫폼에 최적화되어 있으며 1에서 64바이트 사이의 모든 크기의 요약을 생성합니다,

@item 
`BLAKE2s', 8비트에서 32비트 플랫폼에 최적화되어 있으며 1에서 32바이트 사이의 모든 크기의 요약을 생성합니다.
@end itemize

BLAKE2는 `키 모드(keyed mode)' (HMAC@footnote{https://en.wikipedia.org/wiki/Hash-based_message_authentication_code}의 더 빠르고 간단한 대체), `솔트 해싱(salted hashing)', `개인화(personalization)' 및 `트리 해싱(tree hashing)'을 지원합니다.

Hash objects from this module follow the API of standard library’s
@code{hashlib} objects.

@menu
* 해시 객체 만들기:: 
* 상수: 상수<5>. 
* 예: 예<6>. 
* 크레딧:: 

@end menu

@node 해시 객체 만들기,상수<5>,,BLAKE2
@anchor{library/hashlib creating-hash-objects}@anchor{2ffc}
@subsubsection 해시 객체 만들기


생성자 함수를 호출하여 새 해시 객체를 만듭니다:

@geindex blake2b() (hashlib 모듈)
@anchor{library/hashlib hashlib blake2b}@anchor{851}
@deffn {함수} hashlib.blake2b (data=b'@w{'}, *, digest_size=64, key=b'@w{'}, salt=b'@w{'}, person=b'@w{'}, fanout=1, depth=1, leaf_size=0, node_offset=0, node_depth=0, inner_size=0, last_node=False, usedforsecurity=True)
@end deffn

@geindex blake2s() (hashlib 모듈)
@anchor{library/hashlib hashlib blake2s}@anchor{852}
@deffn {함수} hashlib.blake2s (data=b'@w{'}, *, digest_size=32, key=b'@w{'}, salt=b'@w{'}, person=b'@w{'}, fanout=1, depth=1, leaf_size=0, node_offset=0, node_depth=0, inner_size=0, last_node=False, usedforsecurity=True)
@end deffn

이 함수는 BLAKE2b나 BLAKE2s를 계산하기위한 해당 해시 객체를 반환합니다. 선택적으로 다음과 같은 일반 매개 변수를 취합니다:


@itemize *

@item 
`data': 해시 할 초기 데이터 청크, @ref{193,,바이트열류 객체}여야 합니다. 위치 인자로만 전달될 수 있습니다.

@item 
`digest_size': 바이트 단위의 출력 요약 크기.

@item 
`key': 키 해싱을 위한 키 (BLAKE2b의 경우 최대 64바이트, BLAKE2s의 경우 최대 32바이트).

@item 
`salt': 무작위 해싱을 위한 솔트 (BLAKE2b의 경우 최대 16바이트, BLAKE2s의 경우 최대 8바이트).

@item 
`person': 개인화 문자열 (BLAKE2b의 경우 최대 16바이트, BLAKE2s의 경우 최대 8바이트).
@end itemize

다음 표는 일반 매개 변수의 제한(바이트 단위)을 보여줍니다:


@multitable {xxxxxxxxx} {xxxxxxxxxxxxx} {xxxxxxxxxx} {xxxxxxxxxxx} {xxxxxxxxxxxxx} 
@headitem

해시

@tab

digest_size

@tab

len(key)

@tab

len(salt)

@tab

len(person)

@item

BLAKE2b

@tab

64

@tab

64

@tab

16

@tab

16

@item

BLAKE2s

@tab

32

@tab

32

@tab

8

@tab

8

@end multitable


@cartouche
@quotation 참고 
BLAKE2 명세는 솔트와 개인화 매개 변수에 대해 상수 길이를 정의하지만, 편의상, 이 구현에서는 지정된 길이까지 모든 크기의 바이트 문자열을 받아들입니다. 매개 변수의 길이가 지정된 길이보다 작으면, 0으로 채워지므로, 예를 들어 @code{b'salt'}와 @code{b'salt\x00'}은 같은 값입니다. (`key'의 경우에는 해당하지 않습니다.)
@end quotation
@end cartouche

이 크기는 아래 설명된 모듈 @ref{2ffd,,상수}로 제공됩니다.

생성자 함수는 다음 트리 해싱 매개 변수도 받아들입니다:


@itemize *

@item 
`fanout': 팬아웃 (0에서 255, 무제한이면 0, 순차적 모드(sequential mode)이면 1).

@item 
`depth': 트리의 최대 깊이 (1에서 255, 무제한이면 255, 순차적 모드이면 1).

@item 
`leaf_size': 리프의 최대 바이트 길이 (0에서 @code{2**32-1}, 무제한이거나 순차적 모드이면 0).

@item 
`node_offset': 노드 오프셋 (BLAKE2b의 경우 0에서 @code{2**64-1}, BLAKE2s의 경우 0에서 @code{2**48-1}, 첫 번째, 가장 왼쪽, 리프 또는 순차적 모드이면 0).

@item 
`node_depth': 노드 깊이 (0에서 255, 리프나 순차적 모드이면 0).

@item 
`inner_size': 내부 요약 크기 (BLAKE2b의 경우 0에서 64, BLAKE2s의 경우 0에서 32, 순차적 모드이면 0).

@item 
`last_node': 처리된 노드가 마지막 노드인지를 나타내는 불리언 (순차적 모드이면 @code{False}).
@end itemize


@float Figure

@image{python-figures/hashlib-blake2-tree,,,Explanation of tree mode parameters.,png}

@end float


트리 해싱에 대한 포괄적인 리뷰는 BLAKE2 명세@footnote{https://www.blake2.net/blake2_20130129.pdf}의 섹션 2.10을 참조하십시오.

@node 상수<5>,예<6>,해시 객체 만들기,BLAKE2
@anchor{library/hashlib constants}@anchor{2ffd}
@subsubsection 상수


@geindex blake2b.SALT_SIZE (hashlib 모듈)
@anchor{library/hashlib hashlib blake2b SALT_SIZE}@anchor{2ffe}
@deffn {데이터} blake2b.SALT_SIZE
@end deffn

@geindex blake2s.SALT_SIZE (hashlib 모듈)
@anchor{library/hashlib hashlib blake2s SALT_SIZE}@anchor{2fff}
@deffn {데이터} blake2s.SALT_SIZE
@end deffn

솔트 길이 (생성자가 허용하는 최대 길이).

@geindex blake2b.PERSON_SIZE (hashlib 모듈)
@anchor{library/hashlib hashlib blake2b PERSON_SIZE}@anchor{3000}
@deffn {데이터} blake2b.PERSON_SIZE
@end deffn

@geindex blake2s.PERSON_SIZE (hashlib 모듈)
@anchor{library/hashlib hashlib blake2s PERSON_SIZE}@anchor{3001}
@deffn {데이터} blake2s.PERSON_SIZE
@end deffn

개인화 문자열 길이 (생성자가 허용하는 최대 길이).

@geindex blake2b.MAX_KEY_SIZE (hashlib 모듈)
@anchor{library/hashlib hashlib blake2b MAX_KEY_SIZE}@anchor{3002}
@deffn {데이터} blake2b.MAX_KEY_SIZE
@end deffn

@geindex blake2s.MAX_KEY_SIZE (hashlib 모듈)
@anchor{library/hashlib hashlib blake2s MAX_KEY_SIZE}@anchor{3003}
@deffn {데이터} blake2s.MAX_KEY_SIZE
@end deffn

최대 키 크기.

@geindex blake2b.MAX_DIGEST_SIZE (hashlib 모듈)
@anchor{library/hashlib hashlib blake2b MAX_DIGEST_SIZE}@anchor{3004}
@deffn {데이터} blake2b.MAX_DIGEST_SIZE
@end deffn

@geindex blake2s.MAX_DIGEST_SIZE (hashlib 모듈)
@anchor{library/hashlib hashlib blake2s MAX_DIGEST_SIZE}@anchor{3005}
@deffn {데이터} blake2s.MAX_DIGEST_SIZE
@end deffn

해시 함수가 출력할 수 있는 최대 요약 크기.

@node 예<6>,크레딧,상수<5>,BLAKE2
@anchor{library/hashlib examples}@anchor{3006}
@subsubsection 예


@menu
* 간단한 해싱:: 
* 다른 요약 크기 사용하기:: 
* 키 해싱:: 
* 무작위 해싱:: 
* 개인화:: 
* 트리 모드:: 

@end menu

@node 간단한 해싱,다른 요약 크기 사용하기,,예<6>
@anchor{library/hashlib simple-hashing}@anchor{3007}
@subsubsection 간단한 해싱


어떤 데이터의 해시를 계산하려면, 먼저 적절한 생성자 함수(@ref{851,,blake2b()}나 @ref{852,,blake2s()})를 호출하여 해시 객체를 생성한 다음, 객체에서 @ref{2fe7,,update()}를 호출하여 데이터로 갱신하고, 마지막으로 @ref{2fe8,,digest()}(또는 16진수 인코딩 문자열의 경우 @ref{2fe9,,hexdigest()})를 호출하여 객체에서 요약을 가져와야 합니다.

@example
>>> from hashlib import blake2b
>>> h = blake2b()
>>> h.update(b'Hello world')
>>> h.hexdigest()
'6ff843ba685842aa82031d3f53c48b66326df7639a63d128974c5c14f31a0f33343a8c65551134ed1ae0f2b0dd2bb495dc81039e3eeb0aa1bb0388bbeac29183'
@end example

줄여서, 첫 번째 데이터 청크를 위치 인자로 생성자에 전달하여 직접 갱신할 수 있습니다:

@example
>>> from hashlib import blake2b
>>> blake2b(b'Hello world').hexdigest()
'6ff843ba685842aa82031d3f53c48b66326df7639a63d128974c5c14f31a0f33343a8c65551134ed1ae0f2b0dd2bb495dc81039e3eeb0aa1bb0388bbeac29183'
@end example

해시를 반복적으로 갱신하는 데 필요한 만큼 @ref{2fe7,,hash.update()}를 호출할 수 있습니다:

@example
>>> from hashlib import blake2b
>>> items = [b'Hello', b' ', b'world']
>>> h = blake2b()
>>> for item in items:
...     h.update(item)
...
>>> h.hexdigest()
'6ff843ba685842aa82031d3f53c48b66326df7639a63d128974c5c14f31a0f33343a8c65551134ed1ae0f2b0dd2bb495dc81039e3eeb0aa1bb0388bbeac29183'
@end example

@node 다른 요약 크기 사용하기,키 해싱,간단한 해싱,예<6>
@anchor{library/hashlib using-different-digest-sizes}@anchor{3008}
@subsubsection 다른 요약 크기 사용하기


BLAKE2는 BLAKE2b의 경우 최대 64바이트, BLAKE2s의 경우 최대 32바이트까지 요약 크기를 구성할 수 있습니다. 예를 들어, 출력 크기를 변경하지 않고 SHA-1을 BLAKE2b로 바꾸려면, BLAKE2b에 20바이트 요약을 생성하도록 지시할 수 있습니다:

@example
>>> from hashlib import blake2b
>>> h = blake2b(digest_size=20)
>>> h.update(b'Replacing SHA1 with the more secure function')
>>> h.hexdigest()
'd24f26cf8de66472d58d4e1b1774b4c9158b1f4c'
>>> h.digest_size
20
>>> len(h.digest())
20
@end example

요약 크기가 다른 해시 객체의 출력은 완전히 다릅니다 (짧은 해시는 긴 해시의 접두사가 `아닙니다'); BLAKE2b와 BLAKE2s는 출력 길이가 같더라도 다른 출력을 생성합니다:

@example
>>> from hashlib import blake2b, blake2s
>>> blake2b(digest_size=10).hexdigest()
'6fa1d8fcfd719046d762'
>>> blake2b(digest_size=11).hexdigest()
'eb6ec15daf9546254f0809'
>>> blake2s(digest_size=10).hexdigest()
'1bf21a98c78a1c376ae9'
>>> blake2s(digest_size=11).hexdigest()
'567004bf96e4a25773ebf4'
@end example

@node 키 해싱,무작위 해싱,다른 요약 크기 사용하기,예<6>
@anchor{library/hashlib keyed-hashing}@anchor{3009}
@subsubsection 키 해싱


키 해싱(keyed hashing)은 해시 기반 메시지 인증 코드(HMAC - Hash-based message authentication code)@footnote{https://en.wikipedia.org/wiki/HMAC}을 더 빠르고 간단하게 대체하는 인증에 사용할 수 있습니다. BLAKE2는 BLAKE에서 상속된 비구별성(indifferentiability) 속성 덕분에 접두사-MAC 모드에서 안전하게 사용할 수 있습니다.

이 예는 키 @code{b'pseudorandom key'}로 메시지 @code{b'message data'}에 대한 (16진 인코딩된) 128비트 인증 코드를 얻는 방법을 보여줍니다:

@example
>>> from hashlib import blake2b
>>> h = blake2b(key=b'pseudorandom key', digest_size=16)
>>> h.update(b'message data')
>>> h.hexdigest()
'3d363ff7401e02026f4a4687d4863ced'
@end example

실용적인 예로, 웹 응용 프로그램은 사용자에게 전송된 쿠키에 대칭적으로 서명한 후 나중에 변조되지 않았는지 확인할 수 있습니다:

@example
>>> from hashlib import blake2b
>>> from hmac import compare_digest
>>>
>>> SECRET_KEY = b'pseudorandomly generated server secret key'
>>> AUTH_SIZE = 16
>>>
>>> def sign(cookie):
...     h = blake2b(digest_size=AUTH_SIZE, key=SECRET_KEY)
...     h.update(cookie)
...     return h.hexdigest().encode('utf-8')
>>>
>>> def verify(cookie, sig):
...     good_sig = sign(cookie)
...     return compare_digest(good_sig, sig)
>>>
>>> cookie = b'user-alice'
>>> sig = sign(cookie)
>>> print("@{0@},@{1@}".format(cookie.decode('utf-8'), sig))
user-alice,b'43b3c982cf697e0c5ab22172d1ca7421'
>>> verify(cookie, sig)
True
>>> verify(b'user-bob', sig)
False
>>> verify(cookie, b'0102030405060708090a0b0c0d0e0f00')
False
@end example

네이티브 키 해싱 모드가 있더라도, 물론 BLAKE2를 @ref{6e,,hmac} 모듈을 사용하여 HMAC 구성에 사용할 수 있습니다:

@example
>>> import hmac, hashlib
>>> m = hmac.new(b'secret key', digestmod=hashlib.blake2s)
>>> m.update(b'message')
>>> m.hexdigest()
'e3c8102868d28b5ff85fc35dda07329970d1a01e273c37481326fe0c861c8142'
@end example

@node 무작위 해싱,개인화,키 해싱,예<6>
@anchor{library/hashlib randomized-hashing}@anchor{300a}
@subsubsection 무작위 해싱


`salt' 매개 변수를 설정하면 해시 함수에 무작위화를 도입할 수 있습니다. 무작위 해싱은 디지털 서명에 사용된 해시 함수에 대한 충돌 공격(collision attacks)을 방지하는 데 유용합니다.

@quotation

무작위 해싱은 한 당사자(메시지 준비자)가 두 번째 당사자(메시지 서명자)가 서명할 메시지의 전부나 일부를 생성하는 상황을 위해 설계되었습니다. 메시지 준비자가 암호화 해시 함수 충돌(즉, 같은 해시값을 생성하는 두 메시지)을 찾을 수 있으면, 같은 해시값과 디지털 서명을 생성하는 의미 있는 메시지 버전을 준비할 수 있지만, 결과는 다릅니다 (예를 들어, 계정으로 $10 대신에 $1,000,000을 이체하는 행위). 암호화 해시 함수는 주요 목표로 충돌 내성을 갖도록 설계되었지만, 현재 암호화 해시 함수 공격에 대한 집중으로 인해 주어진 암호화 해시 함수가 예상보다 적은 충돌 내성을 제공할 수 있습니다. 무작위 해싱은 준비자가 디지털 서명 생성 프로세스 동안 궁극적으로 같은 해시값을 산출하는 두 개 이상의 메시지를 생성할 가능성을 줄여서, 서명자에게 추가적인 보호를 제공합니다 – 설사 해시 함수의 충돌을 찾는 것이 실용적이더라도. 그러나, 무작위 해싱을 사용하면 메시지의 모든 부분을 서명자가 준비할 때 디지털 서명이 제공하는 보안의 양을 줄일 수 있습니다.

(NIST SP-800-106 "Randomized Hashing for Digital Signatures"@footnote{https://csrc.nist.gov/pubs/sp/800/106/final})
@end quotation

BLAKE2에서 솔트는 각 압축 함수에 대한 입력이 아니라 초기화 중에 해시 함수에 대한 일회성 입력으로 처리됩니다.

@cartouche
@quotation 경고 
BLAKE2나 SHA-256과 같은 기타 범용 암호화 해시 함수를 사용하는 `솔트 해싱(salted hashing)'(또는 그냥 해싱)은 암호(password) 해싱에 적합하지 않습니다. 자세한 정보는 BLAKE2 FAQ@footnote{https://www.blake2.net/#qa}를 참조하십시오.
@end quotation
@end cartouche


@example
>>> import os
>>> from hashlib import blake2b
>>> msg = b'some message'
>>> # Calculate the first hash with a random salt.
>>> salt1 = os.urandom(blake2b.SALT_SIZE)
>>> h1 = blake2b(salt=salt1)
>>> h1.update(msg)
>>> # Calculate the second hash with a different random salt.
>>> salt2 = os.urandom(blake2b.SALT_SIZE)
>>> h2 = blake2b(salt=salt2)
>>> h2.update(msg)
>>> # The digests are different.
>>> h1.digest() != h2.digest()
True
@end example

@node 개인화,트리 모드,무작위 해싱,예<6>
@anchor{library/hashlib personalization}@anchor{300b}
@subsubsection 개인화


때로는 해시 함수가 다른 목적으로 같은 입력에 대해 다른 요약을 생성하도록 강제하는 것이 유용합니다. Skein 해시 함수의 저자를 인용합니다:

@quotation

모든 응용 프로그램 설계자는 이렇게 하는 것을 진지하게 고려하도록 권장합니다; 우리는 유사하거나 관련된 데이터에 대해 두 해시 계산이 수행되었기 때문에, 프로토콜의 한 부분에서 계산된 해시가 완전히 다른 부분에서 사용될 수 있는 프로토콜을 많이 보았으며, 공격자는 응용 프로그램이 해시 입력을 갖게 만들도록 강제할 수 있습니다. 프로토콜에 사용된 각 해시 함수를 개인화하면 이러한 유형의 공격이 중단됩니다.

(The Skein Hash Function Family@footnote{https://www.schneier.com/wp-content/uploads/2016/02/skein.pdf},
p. 21)
@end quotation

BLAKE2는 바이트열을 `person' 인자에 전달하여 개인화할 수 있습니다:

@example
>>> from hashlib import blake2b
>>> FILES_HASH_PERSON = b'MyApp Files Hash'
>>> BLOCK_HASH_PERSON = b'MyApp Block Hash'
>>> h = blake2b(digest_size=32, person=FILES_HASH_PERSON)
>>> h.update(b'the same content')
>>> h.hexdigest()
'20d9cd024d4fb086aae819a1432dd2466de12947831b75c5a30cf2676095d3b4'
>>> h = blake2b(digest_size=32, person=BLOCK_HASH_PERSON)
>>> h.update(b'the same content')
>>> h.hexdigest()
'cf68fb5761b9c44e7878bfb2c4c9aea52264a80b75005e65619778de59f383a3'
@end example

키 모드와 함께 개인화를 사용하여, 한 키에서 다른 키들을 파생시킬 수도 있습니다.

@example
>>> from hashlib import blake2s
>>> from base64 import b64decode, b64encode
>>> orig_key = b64decode(b'Rm5EPJai72qcK3RGBpW3vPNfZy5OZothY+kHY6h21KM=')
>>> enc_key = blake2s(key=orig_key, person=b'kEncrypt').digest()
>>> mac_key = blake2s(key=orig_key, person=b'kMAC').digest()
>>> print(b64encode(enc_key).decode('utf-8'))
rbPb15S/Z9t+agffno5wuhB77VbRi6F9Iv2qIxU7WHw=
>>> print(b64encode(mac_key).decode('utf-8'))
G9GtHFE1YluXY1zWPlYk1e/nWfu0WSEb0KRcjhDeP/o=
@end example

@node 트리 모드,,개인화,예<6>
@anchor{library/hashlib tree-mode}@anchor{300c}
@subsubsection 트리 모드


다음은 두 개의 리프 노드를 갖는 최소 트리를 해싱하는 예입니다:

@example
10
 /  \
00  01
@end example

이 예는 64바이트 내부 요약을 사용하고, 32바이트 최종 요약을 반환합니다:

@example
>>> from hashlib import blake2b
>>>
>>> FANOUT = 2
>>> DEPTH = 2
>>> LEAF_SIZE = 4096
>>> INNER_SIZE = 64
>>>
>>> buf = bytearray(6000)
>>>
>>> # 왼쪽 리프
... h00 = blake2b(buf[0:LEAF_SIZE], fanout=FANOUT, depth=DEPTH,
...               leaf_size=LEAF_SIZE, inner_size=INNER_SIZE,
...               node_offset=0, node_depth=0, last_node=False)
>>> # 오른쪽 리프
... h01 = blake2b(buf[LEAF_SIZE:], fanout=FANOUT, depth=DEPTH,
...               leaf_size=LEAF_SIZE, inner_size=INNER_SIZE,
...               node_offset=1, node_depth=0, last_node=True)
>>> # 루트 노드
... h10 = blake2b(digest_size=32, fanout=FANOUT, depth=DEPTH,
...               leaf_size=LEAF_SIZE, inner_size=INNER_SIZE,
...               node_offset=0, node_depth=1, last_node=True)
>>> h10.update(h00.digest())
>>> h10.update(h01.digest())
>>> h10.hexdigest()
'3ad2a9b37c6070e374c7a8c508fe20ca86b6ed54e286e93a0318e95e881db5aa'
@end example

@node 크레딧,,예<6>,BLAKE2
@anchor{library/hashlib credits}@anchor{300d}
@subsubsection 크레딧


BLAKE2@footnote{https://www.blake2.net}는 `Jean-Philippe Aumasson', `Luca Henzen', `Willi Meier' 및 `Raphael C.-W. Phan'이 만든 SHA-3@footnote{https://en.wikipedia.org/wiki/Secure_Hash_Algorithms} 파이널리스트 BLAKE@footnote{https://web.archive.org/web/20200918190133/https://131002.net/blake/}를 기반으로 `Jean-Philippe Aumasson', `Samuel Neves', `Zooko Wilcox-O’Hearn' 및 `Christian Winnerlein'이 설계했습니다.

`Daniel J.  Bernstein'이 설계한 ChaCha@footnote{https://cr.yp.to/chacha.html} 암호(cipher)의 핵심 알고리즘을 사용합니다.

표준 라이브러리 구현은 pyblake2@footnote{https://pythonhosted.org/pyblake2/} 모듈에 기반합니다. 이것은 `Samuel Neves'가 작성한 C 구현을 기반으로 `Dmitry Chestnykh'가 작성했습니다. 이 설명서는 pyblake2@footnote{https://pythonhosted.org/pyblake2/}에서 복사했으며 `Dmitry Chestnykh'가 작성했습니다.

C 코드는 `Christian Heimes'가 파이썬 용으로 부분적으로 재작성했습니다.

다음 공개 도메인 기부는 C 해시 함수 구현, 확장 코드 및 이 설명서 모두에 적용됩니다:

@quotation

법률에 따라 가능한 범위 내에서, 저자(들)는 이 소프트웨어에 대한 모든 저작권과 관련되고 둘러싼 권리를 전 세계 공개 도메인에 기부했습니다. 이 소프트웨어는 보증 없이 배포됩니다.

이 소프트웨어와 함께 CC0 Public Domain Dedication의 사본을 받았어야 합니다. 그렇지 않으면, @indicateurl{https://creativecommons.org/publicdomain/zero/1.0/} 을 참조하십시오.
@end quotation

다음과 같은 사람들은 Creative Commons Public Domain Dedication 1.0 Universal에 따라 개발을 돕거나 프로젝트와 공개 도메인에 변경에 기여했습니다:


@itemize *

@item 
`Alexandr Sokolovskiy'
@end itemize
@anchor{library/hashlib hashlib-seealso}@anchor{2fee}

@subsubheading 더 보기



@table @asis

@item 모듈 @ref{6e,,hmac}

해시를 사용하여 메시지 인증 코드를 생성하는 모듈.

@item 모듈 @ref{f,,base64}

바이너리가 아닌 환경을 위해 바이너리 해시를 인코딩하는 다른 방법.

@item @indicateurl{https://nvlpubs.nist.gov/nistpubs/fips/nist.fips.180-4.pdf}

Secure Hash Algorithms에 관한 FIPS 180-4 발행물.

@item @indicateurl{https://csrc.nist.gov/pubs/fips/202/final}

SHA-3 표준에 관한 FIPS 202 발행물.

@item @indicateurl{https://www.blake2.net/}

공식 BLAKE2 웹 사이트.

@item @indicateurl{https://en.wikipedia.org/wiki/Cryptographic_hash_function}

어떤 알고리즘에 알려진 문제가 있고 그것이 사용에 어떤 의미가 있는지에 대한 정보가 포함된 위키피디아 기사.

@item @indicateurl{https://www.ietf.org/rfc/rfc8018.txt}

PKCS #5: Password-Based Cryptography Specification Version 2.1

@item @indicateurl{https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-132.pdf}

NIST Recommendation for Password-Based Key Derivation.
@end table


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node hmac — 메시지 인증을 위한 키 해싱,secrets — 비밀 관리를 위한 안전한 난수 생성,hashlib — 보안 해시와 메시지 요약,암호화 서비스
@anchor{library/hmac doc}@anchor{300e}@anchor{library/hmac hmac-keyed-hashing-for-message-authentication}@anchor{300f}@anchor{library/hmac module-hmac}@anchor{6e}@anchor{library/hmac translation-repo}@anchor{3010}
@subsection @code{hmac} — 메시지 인증을 위한 키 해싱


@geindex module; hmac

`소스 코드:' Lib/hmac.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/hmac.py}


__________________________________________________________________


This module implements the HMAC algorithm as described by 
@geindex RFC; RFC 2104
RFC 2104@footnote{https://datatracker.ietf.org/doc/html/rfc2104.html}.
The interface allows to use any hash function with a `fixed' digest size.
In particular, extendable output functions such as SHAKE-128 or SHAKE-256
cannot be used with HMAC.

@geindex new() (hmac 모듈)
@anchor{library/hmac hmac new}@anchor{c95}
@deffn {함수} hmac.new (key, msg=None, digestmod)

새로운 hmac 객체를 반환합니다. `key'는 비밀 키를 제공하는 바이트열이나 바이트 배열(bytearray) 객체입니다. `msg'가 있으면, @code{update(msg)} 메서드 호출이 수행됩니다. `digestmod'는 다이제스트 이름, 다이제스트 생성자 또는 HMAC 객체가 사용할 모듈입니다. @ref{1d2b,,hashlib.new()}에 적합한 모든 이름일 수 있습니다. 인자의 위치에도 불구하고, 필수입니다.


버전 3.4에서 변경: 매개 변수 `key'는 바이트열 또는 바이트 배열 객체일 수 있습니다. 매개 변수 `msg'는 @ref{6c,,hashlib}가 지원하는 모든 형이 될 수 있습니다. 매개 변수 `digestmod'는 해시 알고리즘의 이름이 될 수 있습니다.



버전 3.8에서 변경: `digestmod' 인자는 이제 필수입니다. 초기 `msg'가 없을 때 어색함을 피하려면 키워드 인자로 전달하십시오.

@end deffn

@geindex digest() (hmac 모듈)
@anchor{library/hmac hmac digest}@anchor{d31}
@deffn {함수} hmac.digest (key, msg, digest)

주어진 비밀 `key' 와 `digest'로 `msg'의 다이제스트를 반환합니다. 이 함수는 @code{HMAC(key, msg, digest).digest()}와 동등하지만, 최적화된 C 나 인라인 구현을 사용해서, 메모리에 맞는 메시지에는 더 빠릅니다. 매개 변수 `key', `msg' 및 `digest'는 @ref{c95,,new()}에서와 같은 뜻입니다.

CPython 구현 세부 사항, 최적화된 C 구현은 `digest'가 문자열이고 OpenSSL에서 지원하는 다이제스트 알고리즘의 이름일 때만 사용됩니다.


Added in version 3.7.

@end deffn

@geindex HMAC (hmac 클래스)
@anchor{library/hmac hmac HMAC}@anchor{d32}
@deffn {클래스} hmac.HMAC

HMAC 객체에는 다음과 같은 메서드가 있습니다:
@end deffn

@geindex update() (hmac.HMAC 메서드)
@anchor{library/hmac hmac HMAC update}@anchor{1148}
@deffn {메서드} HMAC.update (msg)

hmac 객체를 `msg'로 갱신합니다. 반복되는 호출은 모든 인자를 이어붙인 단일 호출과 동등합니다: @code{m.update(a); m.update(b)}는 @code{m.update(a + b)}와 동등합니다.


버전 3.4에서 변경: 매개 변수 `msg'는 @ref{6c,,hashlib}가 지원하는 모든 형이 될 수 있습니다.

@end deffn

@geindex digest() (hmac.HMAC 메서드)
@anchor{library/hmac hmac HMAC digest}@anchor{3011}
@deffn {메서드} HMAC.digest ()

지금까지 @ref{1148,,update()} 메서드로 전달된 바이트들의 다이제스트를 반환합니다. 이 바이트열 객체는 생성자에게 주어진 다이제스트의 `digest_size'와 길이가 같습니다. NUL 바이트를 포함하여 비 ASCII 바이트를 포함할 수 있습니다.

@cartouche
@quotation 경고 
검증 루틴에서 @ref{d31,,digest()}의 출력을 외부에서 제공되는 다이제스트와 비교할 때, @code{==} 연산자 대신 @ref{12ce,,compare_digest()} 함수를 사용하여 타이밍 공격의 취약점을 줄이는 것이 좋습니다.
@end quotation
@end cartouche
@end deffn

@geindex hexdigest() (hmac.HMAC 메서드)
@anchor{library/hmac hmac HMAC hexdigest}@anchor{3012}
@deffn {메서드} HMAC.hexdigest ()

다이제스트가 16진수만 포함하는 길이가 두 배인 문자열로 반환된다는 점을 제외하고는 @ref{d31,,digest()}와 같습니다. 이것은 전자 메일이나 기타 비 바이너리 환경에서 값을 안전하게 교환하는 데 사용될 수 있습니다.

@cartouche
@quotation 경고 
검증 루틴에서 @ref{3012,,hexdigest()}의 출력을 외부에서 제공되는 다이제스트와 비교할 때, @code{==} 연산자 대신 @ref{12ce,,compare_digest()} 함수를 사용하여 타이밍 공격의 취약점을 줄이는 것이 좋습니다.
@end quotation
@end cartouche
@end deffn

@geindex copy() (hmac.HMAC 메서드)
@anchor{library/hmac hmac HMAC copy}@anchor{1789}
@deffn {메서드} HMAC.copy ()

hmac 객체의 복사본(“클론”)을 반환합니다. 이것은 공통 초기 부분 문자열을 공유하는 문자열들의 다이제스트를 효율적으로 계산하는 데 사용할 수 있습니다.
@end deffn

hmac 객체에는 다음과 같은 어트리뷰트가 있습니다:

@geindex digest_size (hmac.HMAC의 속성)
@anchor{library/hmac hmac HMAC digest_size}@anchor{114b}
@deffn {속성} HMAC.digest_size

결과 HMAC 다이제스트의 크기(바이트).
@end deffn

@geindex block_size (hmac.HMAC의 속성)
@anchor{library/hmac hmac HMAC block_size}@anchor{1149}
@deffn {속성} HMAC.block_size

해시 알고리즘의 내부 블록 크기(바이트).


Added in version 3.4.

@end deffn

@geindex name (hmac.HMAC의 속성)
@anchor{library/hmac hmac HMAC name}@anchor{114a}
@deffn {속성} HMAC.name

이 HMAC의 규범적 이름, 항상 소문자, 예를 들어 @code{hmac-md5}.


Added in version 3.4.

@end deffn


버전 3.10에서 변경: 설명되지 않은 어트리뷰트 @code{HMAC.digest_cons}, @code{HMAC.inner} 및 @code{HMAC.outer}를 제거했습니다.


이 모듈은 또한 다음 도우미 함수를 제공합니다:

@geindex compare_digest() (hmac 모듈)
@anchor{library/hmac hmac compare_digest}@anchor{12ce}
@deffn {함수} hmac.compare_digest (a, b)

@code{a == b}를 반환합니다. 이 함수는 내용 기반의 단락(short circuiting) 동작을 피함으로써 타이밍 분석을 방지하도록 설계된 접근법을 사용해서 암호화에 적합하게 만듭니다. `a'와 `b'는 모두 같은 형이어야 합니다: @ref{169,,str} (ASCII만, 예를 들어 @ref{3012,,HMAC.hexdigest()}에 의해 반환된 것과 같은 것) 이나 @ref{193,,바이트열류 객체}.

@cartouche
@quotation 참고 
`a'와 `b'의 길이가 다르거나 에러가 발생하면, 타이밍 공격이 이론적으로는 `a' 와 `b'의 형과 길이에 관한 정보를 드러낼 수 있습니다 - 하지만 그 값은 아닙니다.
@end quotation
@end cartouche


Added in version 3.3.



버전 3.10에서 변경: 이 함수는 사용할 수 있으면 내부적으로 OpenSSL의 @code{CRYPTO_memcmp()}를 사용합니다.

@end deffn


@subsubheading 더 보기



@table @asis

@item 모듈 @ref{6c,,hashlib}

안전한 해시 함수를 제공하는 파이썬 모듈.
@end table


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node secrets — 비밀 관리를 위한 안전한 난수 생성,,hmac — 메시지 인증을 위한 키 해싱,암호화 서비스
@anchor{library/secrets doc}@anchor{3013}@anchor{library/secrets module-secrets}@anchor{c5}@anchor{library/secrets secrets-generate-secure-random-numbers-for-managing-secrets}@anchor{3014}@anchor{library/secrets translation-repo}@anchor{3015}
@subsection @code{secrets} — 비밀 관리를 위한 안전한 난수 생성


@geindex module; secrets


Added in version 3.6.


@c from secrets import *
@c __name__ = '<doctest>'

`소스 코드:' Lib/secrets.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/secrets.py}


__________________________________________________________________


The @code{secrets} module is used for generating cryptographically strong
random numbers suitable for managing data such as passwords, account
authentication, security tokens, and related secrets.

In particular, @code{secrets} should be used in preference to the
default pseudo-random number generator in the @ref{bd,,random} module, which
is designed for modelling and simulation, not security or cryptography.


@subsubheading 더 보기


@geindex Python 향상 제안; PEP 506
PEP 506@footnote{https://peps.python.org/pep-0506/}


@menu
* 난수:: 
* 토큰 생성:: 
* 기타 함수:: 
* 조리법과 모범 사례:: 

@end menu

@node 난수,토큰 생성,,secrets — 비밀 관리를 위한 안전한 난수 생성
@anchor{library/secrets random-numbers}@anchor{3016}
@subsubsection 난수


The @code{secrets} module provides access to the most secure source of
randomness that your operating system provides.

@geindex SystemRandom (secrets 클래스)
@anchor{library/secrets secrets SystemRandom}@anchor{3017}
@deffn {클래스} secrets.SystemRandom

운영 체제에서 제공하는 최고 품질의 소스를 사용하여 난수를 생성하는 클래스. 자세한 내용은 @ref{2b7e,,random.SystemRandom}를 참조하십시오.
@end deffn

@geindex choice() (secrets 모듈)
@anchor{library/secrets secrets choice}@anchor{3018}
@deffn {함수} secrets.choice (seq)

비어있지 않은 시퀀스로부터 무작위로 선택된 요소를 돌려줍니다.
@end deffn

@geindex randbelow() (secrets 모듈)
@anchor{library/secrets secrets randbelow}@anchor{3019}
@deffn {함수} secrets.randbelow (exclusive_upper_bound)

범위 [0, `exclusive_upper_bound')에서 무작위 int를 돌려줍니다.
@end deffn

@geindex randbits() (secrets 모듈)
@anchor{library/secrets secrets randbits}@anchor{301a}
@deffn {함수} secrets.randbits (k)

`k' 무작위 비트를 가지는 음이 아닌 int를 돌려줍니다.
@end deffn

@node 토큰 생성,기타 함수,난수,secrets — 비밀 관리를 위한 안전한 난수 생성
@anchor{library/secrets generating-tokens}@anchor{301b}
@subsubsection 토큰 생성


The @code{secrets} module provides functions for generating secure
tokens, suitable for applications such as password resets,
hard-to-guess URLs, and similar.

@geindex token_bytes() (secrets 모듈)
@anchor{library/secrets secrets token_bytes}@anchor{2b83}
@deffn {함수} secrets.token_bytes (nbytes=None)

Return a random byte string containing `nbytes' number of bytes.

If `nbytes' is not specified or @code{None}, @ref{301c,,DEFAULT_ENTROPY}
is used instead.

@example
>>> token_bytes(16)
b'\xebr\x17D*t\xae\xd4\xe3S\xb6\xe2\xebP1\x8b'
@end example
@end deffn

@geindex token_hex() (secrets 모듈)
@anchor{library/secrets secrets token_hex}@anchor{1b24}
@deffn {함수} secrets.token_hex (nbytes=None)

Return a random text string, in hexadecimal.  The string has `nbytes'
random bytes, each byte converted to two hex digits.

If `nbytes' is not specified or @code{None}, @ref{301c,,DEFAULT_ENTROPY}
is used instead.

@example
>>> token_hex(16)
'f9bf78b9a18ce6d46a0cd2b0b86df9da'
@end example
@end deffn

@geindex token_urlsafe() (secrets 모듈)
@anchor{library/secrets secrets token_urlsafe}@anchor{301d}
@deffn {함수} secrets.token_urlsafe (nbytes=None)

Return a random URL-safe text string, containing `nbytes' random
bytes.  The text is Base64 encoded, so on average each byte results
in approximately 1.3 characters.

If `nbytes' is not specified or @code{None}, @ref{301c,,DEFAULT_ENTROPY}
is used instead.

@example
>>> token_urlsafe(16)
'Drmhze6EPcv0fN_81Bj-nA'
@end example
@end deffn

@menu
* 토큰은 몇 바이트를 사용해야 합니까?:: 

@end menu

@node 토큰은 몇 바이트를 사용해야 합니까?,,,토큰 생성
@anchor{library/secrets how-many-bytes-should-tokens-use}@anchor{301e}
@subsubsection 토큰은 몇 바이트를 사용해야 합니까?


To be secure against
brute-force attacks@footnote{https://en.wikipedia.org/wiki/Brute-force_attack},
tokens need to have sufficient randomness.  Unfortunately, what is
considered sufficient will necessarily increase as computers get more
powerful and able to make more guesses in a shorter period.  As of 2015,
it is believed that 32 bytes (256 bits) of randomness is sufficient for
the typical use-case expected for the @code{secrets} module.

자신의 토큰 길이를 관리하려는 사용자는, 여러 @code{token_*} 함수에 @ref{19b,,int} 인자를 제공하여 토큰에 사용되는 무작위성의 양을 명시적으로 지정할 수 있습니다. 이 인자는 사용할 무작위성의 바이트 수로 사용됩니다.

Otherwise, if no argument is provided, or if the argument is @code{None},
the @code{token_*} functions use @ref{301c,,DEFAULT_ENTROPY} instead.

@geindex DEFAULT_ENTROPY (secrets 모듈)
@anchor{library/secrets secrets DEFAULT_ENTROPY}@anchor{301c}
@deffn {데이터} secrets.DEFAULT_ENTROPY

Default number of bytes of randomness used by the @code{token_*} functions.

The exact value is subject to change at any time, including during
maintenance releases.
@end deffn

@node 기타 함수,조리법과 모범 사례,토큰 생성,secrets — 비밀 관리를 위한 안전한 난수 생성
@anchor{library/secrets other-functions}@anchor{301f}
@subsubsection 기타 함수


@geindex compare_digest() (secrets 모듈)
@anchor{library/secrets secrets compare_digest}@anchor{3020}
@deffn {함수} secrets.compare_digest (a, b)

문자열 혹은 @ref{193,,바이트열류 객체} `a'와 `b'가 같으면 @code{True}를, 그렇지 않으면 @code{False}를 반환하는데, “고정 시간 비교(constant-time compare)”를 사용하여 타이밍 공격@footnote{https://codahale.com/a-lesson-in-timing-attacks/}의 위험을 줄입니다. 자세한 내용은 @ref{12ce,,hmac.compare_digest()}를 참조하십시오.
@end deffn

@node 조리법과 모범 사례,,기타 함수,secrets — 비밀 관리를 위한 안전한 난수 생성
@anchor{library/secrets recipes-and-best-practices}@anchor{3021}
@subsubsection 조리법과 모범 사례


This section shows recipes and best practices for using @code{secrets}
to manage a basic level of security.

8문자 영숫자 암호 생성합니다:

@example
import string
import secrets
alphabet = string.ascii_letters + string.digits
password = '@w{'}.join(secrets.choice(alphabet) for i in range(8))
@end example

@cartouche
@quotation 참고 
응용 프로그램은 평문인지 암호문인지 관계없이, 
@geindex Common Weakness Enumeration; CWE 257
암호를 복원 가능한 형식으로 저장@footnote{https://cwe.mitre.org/data/definitions/257.html}해서는 안 됩니다. 이들은 암호학적으로 강력한 단방향(비가역적) 해시 함수를 사용하여 솔트되고 해시 되어야 합니다.
@end quotation
@end cartouche

적어도 하나의 소문자, 적어도 하나의 대문자 및 적어도 3개의 숫자가 있는 10자의 영숫자 암호를 생성합니다:

@example
import string
import secrets
alphabet = string.ascii_letters + string.digits
while True:
    password = '@w{'}.join(secrets.choice(alphabet) for i in range(10))
    if (any(c.islower() for c in password)
            and any(c.isupper() for c in password)
            and sum(c.isdigit() for c in password) >= 3):
        break
@end example

XKCD-스타일 암호문@footnote{https://xkcd.com/936/}을 생성합니다:

@example
import secrets
# 표준 리눅스 시스템에서는, 편리한 딕셔너리 파일을 사용하십시오.
# 다른 플랫폼에서는, 자신의 단어 목록을 제공해야 할 수도 있습니다.
with open('/usr/share/dict/words') as f:
    words = [word.strip() for word in f]
    password = ' '.join(secrets.choice(words) for i in range(4))
@end example

암호 복구 응용에 적합한 보안 토큰을 포함하는 추측하기 어려운 임시 URL을 생성합니다:

@example
import secrets
url = 'https://example.com/reset=' + secrets.token_urlsafe()
@end example

@c # This modeline must appear within the last ten lines of the file.
@c kate: indent-width 3; remove-trailing-space on; replace-tabs on; encoding utf-8;

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 일반 운영 체제 서비스,Command-line interface libraries,암호화 서비스,파이썬 표준 라이브러리
@anchor{library/allos doc}@anchor{3022}@anchor{library/allos allos}@anchor{3023}@anchor{library/allos generic-operating-system-services}@anchor{3024}@anchor{library/allos translation-repo}@anchor{3025}
@section 일반 운영 체제 서비스


이 장에서 설명하는 모듈은 파일 및 시계와 같은 (거의) 모든 운영 체제에서 사용할 수 있는 운영 체제 기능에 대한 인터페이스를 제공합니다. 인터페이스는 일반적으로 유닉스 또는 C 인터페이스를 모델로 하지만, 대부분의 다른 시스템에서도 사용할 수 있습니다. 다음은 개요입니다:

@menu
* os — Miscellaneous operating system interfaces:: 
* io — 스트림 작업을 위한 핵심 도구:: 
* time — 시간 액세스와 변환:: 
* logging — 파이썬 로깅 시설:: 
* logging.config — 로깅 구성: logging config — 로깅 구성. 
* logging.handlers — 로깅 처리기: logging handlers — 로깅 처리기. 
* platform — 하부 플랫폼의 식별 데이터에 대한 액세스:: 
* errno — 표준 errno 시스템 기호:: 
* ctypes — A foreign function library for Python:: 

@end menu

@node os — Miscellaneous operating system interfaces,io — 스트림 작업을 위한 핵심 도구,,일반 운영 체제 서비스
@anchor{library/os doc}@anchor{3026}@anchor{library/os module-os}@anchor{a5}@anchor{library/os os-miscellaneous-operating-system-interfaces}@anchor{3027}
@subsection @code{os} — Miscellaneous operating system interfaces


@geindex module; os

`소스 코드:' Lib/os.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/os.py}


__________________________________________________________________


이 모듈은 운영 체제 종속 기능을 사용하는 이식성 있는 방법을 제공합니다. 파일을 읽거나 쓰고 싶으면 @ref{316,,open()}을 보세요, 경로를 조작하려면 @ref{a6,,os.path} 모듈을 보시고, 명령 줄에서 주어진 모든 파일의 모든 줄을 읽으려면 @ref{5f,,fileinput} 모듈을 보십시오. 임시 파일과 디렉터리를 만들려면 @ref{e6,,tempfile} 모듈을 보시고, 고수준의 파일과 디렉터리 처리는 @ref{ca,,shutil} 모듈을 보십시오.

이러한 기능의 가용성에 대한 참고 사항:


@itemize *

@item 
내장된 모든 운영 체제 종속적인 파이썬 모듈의 설계는, 같은 기능을 사용할 수 있는 한, 같은 인터페이스를 사용합니다; 예를 들어, 함수 @code{os.stat(path)}는 `path' 에 대한 stat 정보를 같은 (POSIX 인터페이스에서 기원한) 형식으로 반환합니다.

@item 
Extensions peculiar to a particular operating system are also available
through the @code{os} module, but using them is of course a threat to
portability.

@item 
경로 또는 파일명을 받아들이는 모든 함수는 바이트열과 문자열 객체를 모두 허용하며, 경로나 파일명이 반환되면 같은 형의 객체를 반환합니다.

@item 
On VxWorks, os.popen, os.fork, os.execv and os.spawn*p* are not supported.

@item 
On WebAssembly platforms, Android and iOS, large parts of the @code{os} module are
not available or behave differently. APIs related to processes (e.g.
@ref{4b6,,fork()}, @ref{12fe,,execve()}) and resources (e.g. @ref{1306,,nice()})
are not available. Others like @ref{181a,,getuid()} and @ref{3028,,getpid()} are
emulated or stubs. WebAssembly platforms also lack support for signals (e.g.
@ref{156c,,kill()}, @ref{f97,,wait()}).
@end itemize

@cartouche
@quotation 참고 
이 모듈의 모든 함수는, 올바르지 않거나 액세스할 수 없는 파일명과 경로일 때, 또는 올바른 형의 인자이지만, 운영 체제에서 허용하지 않으면 @ref{2c0,,OSError}(또는 이것의 서브 클래스)를 발생시킵니다.
@end quotation
@end cartouche

@geindex error
@anchor{library/os os error}@anchor{3029}
@deffn {예외} os.error

내장 @ref{2c0,,OSError} 예외의 별칭.
@end deffn

@geindex name (os 모듈)
@anchor{library/os os name}@anchor{302a}
@deffn {데이터} os.name

임포트 된 운영 체제 종속 모듈의 이름. 다음과 같은 이름이 현재 등록되어있습니다: @code{'posix'}, @code{'nt'}, @code{'java'}.


@subsubheading 더 보기


@ref{291,,sys.platform} has a finer granularity.  @ref{131b,,os.uname()} gives
system-dependent version information.

@ref{af,,platform} 모듈은 시스템의 아이덴티티에 대한 자세한 검사를 제공합니다.

@end deffn
@anchor{library/os os-filenames}@anchor{2f6b}
@menu
* 파일명@comma{} 명령 줄 인자 및 환경 변수: 파일명 명령 줄 인자 및 환경 변수. 
* Python UTF-8 Mode:: 
* 프로세스 매개 변수:: 
* 파일 객체 생성:: 
* 파일 기술자 연산:: 
* 파일과 디렉터리:: 
* 프로세스 관리:: 
* 스케줄러에 대한 인터페이스:: 
* 기타 시스템 정보:: 
* 난수: 난수<2>. 

@end menu

@node 파일명 명령 줄 인자 및 환경 변수,Python UTF-8 Mode,,os — Miscellaneous operating system interfaces
@anchor{library/os file-names-command-line-arguments-and-environment-variables}@anchor{302b}@anchor{library/os filesystem-encoding}@anchor{2c5c}
@subsubsection 파일명, 명령 줄 인자 및 환경 변수


In Python, file names, command line arguments, and environment variables are
represented using the string type. On some systems, decoding these strings to
and from bytes is necessary before passing them to the operating system. Python
uses the @ref{75c,,filesystem encoding and error handler} to perform this
conversion (see @ref{e52,,sys.getfilesystemencoding()}).

The @ref{75c,,filesystem encoding and error handler} are configured at Python
startup by the @ref{992,,PyConfig_Read()} function: see
@ref{41b,,filesystem_encoding} and
@ref{41c,,filesystem_errors} members of @ref{3f7,,PyConfig}.


버전 3.1에서 변경: On some systems, conversion using the file system encoding may fail. In this
case, Python uses the @ref{2878,,surrogateescape encoding error handler}, which means that undecodable bytes are replaced by a
Unicode character U+DC`xx' on decoding, and these are again
translated to the original byte on encoding.


The @ref{75c,,file system encoding} must
guarantee to successfully decode all bytes below 128. If the file system
encoding fails to provide this guarantee, API functions can raise
@ref{462,,UnicodeError}.

See also the @ref{54a,,locale encoding}.

@node Python UTF-8 Mode,프로세스 매개 변수,파일명 명령 줄 인자 및 환경 변수,os — Miscellaneous operating system interfaces
@anchor{library/os python-utf-8-mode}@anchor{302c}@anchor{library/os utf8-mode}@anchor{865}
@subsubsection Python UTF-8 Mode



Added in version 3.7: See 
@geindex Python 향상 제안; PEP 540
PEP 540@footnote{https://peps.python.org/pep-0540/} for more details.


The Python UTF-8 Mode ignores the @ref{54a,,locale encoding} and forces the usage
of the UTF-8 encoding:


@itemize *

@item 
Use UTF-8 as the @ref{75c,,filesystem encoding}.

@item 
@ref{e52,,sys.getfilesystemencoding()} returns @code{'utf-8'}.

@item 
@ref{75b,,locale.getpreferredencoding()} returns @code{'utf-8'} (the `do_setlocale'
argument has no effect).

@item 
@ref{75e,,sys.stdin}, @ref{ccc,,sys.stdout}, and @ref{b33,,sys.stderr} all use
UTF-8 as their text encoding, with the @code{surrogateescape}
@ref{1b6d,,error handler} being enabled for @code{sys.stdin}
and @code{sys.stdout} (@code{sys.stderr} continues to use
@code{backslashreplace} as it does in the default locale-aware mode)

@item 
On Unix, @ref{1c33,,os.device_encoding()} returns @code{'utf-8'} rather than the
device encoding.
@end itemize

Note that the standard stream settings in UTF-8 mode can be overridden by
@geindex PYTHONIOENCODING
@geindex 환경 변수; PYTHONIOENCODING
@ref{1209,,PYTHONIOENCODING} (just as they can be in the default locale-aware
mode).

As a consequence of the changes in those lower level APIs, other higher
level APIs also exhibit different default behaviours:


@itemize *

@item 
Command line arguments, environment variables and filenames are decoded
to text using the UTF-8 encoding.

@item 
@ref{e4d,,os.fsdecode()} and @ref{e4e,,os.fsencode()} use the UTF-8 encoding.

@item 
@ref{316,,open()}, @ref{73f,,io.open()}, and @ref{315,,codecs.open()} use the UTF-8
encoding by default. However, they still use the strict error handler by
default so that attempting to open a binary file in text mode is likely
to raise an exception rather than producing nonsense data.
@end itemize

The @ref{865,,Python UTF-8 Mode} is enabled if the LC_CTYPE locale is
@code{C} or @code{POSIX} at Python startup (see the @ref{992,,PyConfig_Read()}
function).

It can be enabled or disabled using the @ref{16f,,-X utf8} command line
option and the 
@geindex PYTHONUTF8
@geindex 환경 변수; PYTHONUTF8
@ref{cce,,PYTHONUTF8} environment variable.

If the 
@geindex PYTHONUTF8
@geindex 환경 변수; PYTHONUTF8
@ref{cce,,PYTHONUTF8} environment variable is not set at all, then the
interpreter defaults to using the current locale settings, `unless' the current
locale is identified as a legacy ASCII-based locale (as described for
@geindex PYTHONCOERCECLOCALE
@geindex 환경 변수; PYTHONCOERCECLOCALE
@ref{ccb,,PYTHONCOERCECLOCALE}), and locale coercion is either disabled or
fails. In such legacy locales, the interpreter will default to enabling UTF-8
mode unless explicitly instructed not to do so.

The Python UTF-8 Mode can only be enabled at the Python startup. Its value
can be read from @ref{89b,,sys.flags.utf8_mode}.

See also the @ref{221a,,UTF-8 mode on Windows}
and the @ref{75c,,filesystem encoding and error handler}.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 686

@item PEP 686@footnote{https://peps.python.org/pep-0686/}

Python 3.15 will make @ref{865,,Python UTF-8 Mode} default.
@end table


@node 프로세스 매개 변수,파일 객체 생성,Python UTF-8 Mode,os — Miscellaneous operating system interfaces
@anchor{library/os os-procinfo}@anchor{302d}@anchor{library/os process-parameters}@anchor{302e}
@subsubsection 프로세스 매개 변수


이 함수들과 데이터 항목은 현재 프로세스와 사용자에 관한 정보와 관련 연산을 제공합니다.

@geindex ctermid() (os 모듈)
@anchor{library/os os ctermid}@anchor{302f}
@deffn {함수} os.ctermid ()

프로세스의 제어 터미널에 해당하는 파일명을 반환합니다.

@ref{213c,,가용성}: Unix, not WASI.
@end deffn

@geindex environ (os 모듈)
@anchor{library/os os environ}@anchor{259}
@deffn {데이터} os.environ

A @ref{13c0,,mapping} object where keys and values are strings that represent
the process environment.  For example, @code{environ['HOME']} is the pathname
of your home directory (on some platforms), and is equivalent to
@code{getenv("HOME")} in C.

This mapping is captured the first time the @code{os} module is imported,
typically during Python startup as part of processing @code{site.py}.  Changes
to the environment made after this time are not reflected in @ref{259,,os.environ},
except for changes made by modifying @code{os.environ} directly.

이 매핑은 환경을 조회하는 것뿐 아니라 환경을 수정하는 데도 사용될 수 있습니다. 매핑이 수정될 때 @ref{25b,,putenv()}가 자동으로 호출됩니다.

유닉스에서, 키와 값은 @ref{e52,,sys.getfilesystemencoding()} 과 @code{'surrogateescape'} 에러 처리기를 사용합니다. 다른 인코딩을 사용하려면 @ref{25a,,environb}를 사용하십시오.

On Windows, the keys are converted to uppercase. This also applies when
getting, setting, or deleting an item. For example,
@code{environ['monty'] = 'python'} maps the key @code{'MONTY'} to the value
@code{'python'}.

@cartouche
@quotation 참고 
Calling @ref{25b,,putenv()} directly does not change @ref{259,,os.environ}, so it’s better
to modify @code{os.environ}.
@end quotation
@end cartouche

@cartouche
@quotation 참고 
On some platforms, including FreeBSD and macOS, setting @code{environ} may
cause memory leaks.  Refer to the system documentation for
@code{putenv()}.
@end quotation
@end cartouche

You can delete items in this mapping to unset environment variables.
@ref{25c,,unsetenv()} will be called automatically when an item is deleted from
@ref{259,,os.environ}, and when one of the @code{pop()} or @code{clear()} methods is
called.


@subsubheading 더 보기


The @ref{258,,os.reload_environ()} function.



버전 3.9에서 변경: 
@geindex Python 향상 제안; PEP 584
PEP 584@footnote{https://peps.python.org/pep-0584/}의 병합(@code{|})과 업데이트(@code{|=}) 연산자를 지원하도록 갱신되었습니다.

@end deffn

@geindex environb (os 모듈)
@anchor{library/os os environb}@anchor{25a}
@deffn {데이터} os.environb

Bytes version of @ref{259,,environ}: a @ref{13c0,,mapping} object where both keys
and values are @ref{192,,bytes} objects representing the process environment.
@code{environ} and @code{environb} are synchronized (modifying
@code{environb} updates @code{environ}, and vice versa).

@code{environb} is only available if @ref{141a,,supports_bytes_environ} is
@code{True}.


Added in version 3.2.



버전 3.9에서 변경: 
@geindex Python 향상 제안; PEP 584
PEP 584@footnote{https://peps.python.org/pep-0584/}의 병합(@code{|})과 업데이트(@code{|=}) 연산자를 지원하도록 갱신되었습니다.

@end deffn

@geindex reload_environ() (os 모듈)
@anchor{library/os os reload_environ}@anchor{258}
@deffn {함수} os.reload_environ ()

The @ref{259,,os.environ} and @ref{25a,,os.environb} mappings are a cache of
environment variables at the time that Python started.
As such, changes to the current process environment are not reflected
if made outside Python, or by @ref{25b,,os.putenv()} or @ref{25c,,os.unsetenv()}.
Use @code{os.reload_environ()} to update @code{os.environ} and @code{os.environb}
with any such changes to the current process environment.

@cartouche
@quotation 경고 
This function is not thread-safe. Calling it while the environment is
being modified in another thread is an undefined behavior. Reading from
@ref{259,,os.environ} or @ref{25a,,os.environb}, or calling @ref{3030,,os.getenv()}
while reloading, may return an empty result.
@end quotation
@end cartouche


Added in version 3.14.

@end deffn


@deffn {함수} os.chdir (path)

@deffnx {함수} os.fchdir (fd)

@deffnx {함수} os.getcwd ()

이 함수는 @ref{3031,,파일과 디렉터리}에 설명되어 있습니다.
@end deffn

@geindex fsencode() (os 모듈)
@anchor{library/os os fsencode}@anchor{e4e}
@deffn {함수} os.fsencode (filename)

Encode @ref{5a0,,path-like} `filename' to the
@ref{75c,,filesystem encoding and error handler}; return @ref{192,,bytes}
unchanged.

@ref{e4d,,fsdecode()}는 역 함수입니다.


Added in version 3.2.



버전 3.6에서 변경: @ref{e4a,,os.PathLike} 인터페이스를 구현하는 객체를 받아들이도록 지원이 추가되었습니다.

@end deffn

@geindex fsdecode() (os 모듈)
@anchor{library/os os fsdecode}@anchor{e4d}
@deffn {함수} os.fsdecode (filename)

Decode the @ref{5a0,,path-like} `filename' from the
@ref{75c,,filesystem encoding and error handler}; return @ref{169,,str}
unchanged.

@ref{e4e,,fsencode()}는 역 함수입니다.


Added in version 3.2.



버전 3.6에서 변경: @ref{e4a,,os.PathLike} 인터페이스를 구현하는 객체를 받아들이도록 지원이 추가되었습니다.

@end deffn

@geindex fspath() (os 모듈)
@anchor{library/os os fspath}@anchor{e4c}
@deffn {함수} os.fspath (path)

경로의 파일 시스템 표현을 돌려줍니다.

@ref{169,,str}이나 @ref{192,,bytes}가 전달되면, 변경되지 않은 상태로 반환됩니다. 그렇지 않으면 @ref{e4b,,__fspath__()}가 호출되고, 해당 값이 @code{str}이나 @code{bytes} 객체인 한 그 값이 반환됩니다. 다른 모든 경우에는 @ref{198,,TypeError}가 발생합니다.


Added in version 3.6.

@end deffn

@geindex PathLike (os 클래스)
@anchor{library/os os PathLike}@anchor{e4a}
@deffn {클래스} os.PathLike

파일 시스템 경로를 나타내는 객체(예를 들어 @ref{6cc,,pathlib.PurePath})의 @ref{13bb,,추상 베이스 클래스}입니다.


Added in version 3.6.


@geindex __fspath__() (os.PathLike 메서드)
@anchor{library/os os PathLike __fspath__}@anchor{e4b}
@deffn {메서드} abstractmethod __fspath__ ()

객체의 파일 시스템 경로 표현을 돌려줍니다.

이 메서드는 @ref{169,,str}이나 @ref{192,,bytes} 객체만 반환해야 하며, @code{str}을 선호합니다.
@end deffn
@end deffn

@geindex getenv() (os 모듈)
@anchor{library/os os getenv}@anchor{3030}
@deffn {함수} os.getenv (key, default=None)

Return the value of the environment variable `key' as a string if it exists, or
`default' if it doesn’t. `key' is a string. Note that
since @code{getenv()} uses @ref{259,,os.environ}, the mapping of @code{getenv()} is
similarly also captured on import, and the function may not reflect
future environment changes.

유닉스에서, 키와 값은 @ref{e52,,sys.getfilesystemencoding()} 과 @code{'surrogateescape'} 에러 처리기로 디코딩됩니다. 다른 인코딩을 사용하려면 @ref{141b,,os.getenvb()}를 사용하십시오.

@ref{213c,,가용성}: Unix, Windows.
@end deffn

@geindex getenvb() (os 모듈)
@anchor{library/os os getenvb}@anchor{141b}
@deffn {함수} os.getenvb (key, default=None)

Return the value of the environment variable `key' as bytes if it exists, or
`default' if it doesn’t. `key' must be bytes. Note that
since @code{getenvb()} uses @ref{25a,,os.environb}, the mapping of @code{getenvb()} is
similarly also captured on import, and the function may not reflect
future environment changes.

@code{getenvb()} is only available if @ref{141a,,supports_bytes_environ}
is @code{True}.

@ref{213c,,가용성}: Unix.


Added in version 3.2.

@end deffn

@geindex get_exec_path() (os 모듈)
@anchor{library/os os get_exec_path}@anchor{3032}
@deffn {함수} os.get_exec_path (env=None)

셸과 비슷하게, 프로세스를 시작할 때 지정된 이름의 실행 파일을 검색할 디렉터리 리스트를 반환합니다. (지정된다면) `env' 는 PATH를 조회할 환경 변수 딕셔너리 여야 합니다. 기본적으로, `env' 가 @code{None}이면, @ref{259,,environ}이 사용됩니다.


Added in version 3.2.

@end deffn

@geindex getegid() (os 모듈)
@anchor{library/os os getegid}@anchor{3033}
@deffn {함수} os.getegid ()

현재 프로세스의 유효(effective) 그룹 ID를 반환합니다. 이것은 현재 프로세스에서 실행 중인 파일의 “set id” 비트에 해당합니다.

@ref{213c,,가용성}: Unix, not WASI.
@end deffn

@geindex geteuid() (os 모듈)
@anchor{library/os os geteuid}@anchor{1b70}
@deffn {함수} os.geteuid ()

@geindex user;effective id

현재 프로세스의 유효(effective) 사용자 ID를 반환합니다.

@ref{213c,,가용성}: Unix, not WASI.
@end deffn

@geindex getgid() (os 모듈)
@anchor{library/os os getgid}@anchor{3034}
@deffn {함수} os.getgid ()

@geindex process;group

현재 프로세스의 실제(real) 그룹 ID를 반환합니다.

@ref{213c,,가용성}: Unix.

The function is a stub on WASI, see @ref{1b68,,웹어셈블리 플랫폼} for more
information.
@end deffn

@geindex getgrouplist() (os 모듈)
@anchor{library/os os getgrouplist}@anchor{1319}
@deffn {함수} os.getgrouplist (user, group, /)

Return list of group ids that `user' belongs to. If `group' is not in the
list, it is included; typically, `group' is specified as the group ID
field from the password record for `user', because that group ID will
otherwise be potentially omitted.

@ref{213c,,가용성}: Unix, not WASI.


Added in version 3.3.

@end deffn

@geindex getgroups() (os 모듈)
@anchor{library/os os getgroups}@anchor{3035}
@deffn {함수} os.getgroups ()

현재 프로세스와 관련된 보충(supplemental) 그룹 ID 목록을 반환합니다.

@ref{213c,,가용성}: Unix, not WASI.

@cartouche
@quotation 참고 
On macOS, @code{getgroups()} behavior differs somewhat from
other Unix platforms. If the Python interpreter was built with a
deployment target of @code{10.5} or earlier, @code{getgroups()} returns
the list of effective group ids associated with the current user process;
this list is limited to a system-defined number of entries, typically 16,
and may be modified by calls to @ref{3036,,setgroups()} if suitably privileged.
If built with a deployment target greater than @code{10.5},
@code{getgroups()} returns the current group access list for the user
associated with the effective user id of the process; the group access
list may change over the lifetime of the process, it is not affected by
calls to @code{setgroups()}, and its length is not limited to 16.  The
deployment target value, @code{MACOSX_DEPLOYMENT_TARGET}, can be
obtained with @ref{174,,sysconfig.get_config_var()}.
@end quotation
@end cartouche
@end deffn

@geindex getlogin() (os 모듈)
@anchor{library/os os getlogin}@anchor{1825}
@deffn {함수} os.getlogin ()

프로세스의 제어 터미널에 로그인한 사용자의 이름을 반환합니다. 대부분 목적에서, @ref{658,,getpass.getuser()}를 사용하는 것이 더 유용한데, 이 함수는 환경 변수 
@geindex LOGNAME
@geindex 환경 변수; LOGNAME
@code{LOGNAME} 이나 
@geindex USERNAME
@geindex 환경 변수; USERNAME
@code{USERNAME}을 검사하여 사용자가 누구인지 알아내고, 현재 실제 사용자 ID의 로그인 이름을 얻기 위해 @code{pwd.getpwuid(os.getuid())[0]}로 폴백 하기 때문입니다.

@ref{213c,,가용성}: Unix, Windows, not WASI.
@end deffn

@geindex getpgid() (os 모듈)
@anchor{library/os os getpgid}@anchor{3037}
@deffn {함수} os.getpgid (pid)

프로세스 ID `pid' 를 갖는 프로세스의 프로세스 그룹 ID를 반환합니다. `pid' 가 0이면, 현재 프로세스의 프로세스 그룹 id가 반환됩니다.

@ref{213c,,가용성}: Unix, not WASI.
@end deffn

@geindex getpgrp() (os 모듈)
@anchor{library/os os getpgrp}@anchor{3038}
@deffn {함수} os.getpgrp ()

@geindex process;group

현재 프로세스 그룹의 ID를 반환합니다.

@ref{213c,,가용성}: Unix, not WASI.
@end deffn

@geindex getpid() (os 모듈)
@anchor{library/os os getpid}@anchor{3028}
@deffn {함수} os.getpid ()

@geindex process;id

현재의 프로세스 ID를 반환합니다.

The function is a stub on WASI, see @ref{1b68,,웹어셈블리 플랫폼} for more
information.
@end deffn

@geindex getppid() (os 모듈)
@anchor{library/os os getppid}@anchor{19cc}
@deffn {함수} os.getppid ()

@geindex process;id of parent

부모의 프로세스 ID를 반환합니다. 부모 프로세스가 종료했으면, 유닉스에서 반환된 id는 init 프로세스 (1) 중 하나이며, 윈도우에서는 여전히 같은 id인데, 다른 프로세스에서 이미 재사용했을 수 있습니다.

@ref{213c,,가용성}: Unix, Windows, not WASI.


버전 3.2에서 변경: 윈도우에 대한 지원이 추가되었습니다.

@end deffn

@geindex getpriority() (os 모듈)
@anchor{library/os os getpriority}@anchor{1304}
@deffn {함수} os.getpriority (which, who)

@geindex process;scheduling priority

프로그램 스케줄 우선순위를 얻습니다. `which' 값은 @ref{3039,,PRIO_PROCESS}, @ref{303a,,PRIO_PGRP} 또는 @ref{303b,,PRIO_USER} 중 하나이고, `who'는 `which' 에 상대적으로 해석됩니다 (@code{PRIO_PROCESS} 면 프로세스 식별자, @code{PRIO_PGRP} 면 프로세스 그룹 식별자, @code{PRIO_USER} 면 사용자 ID). 0 값의 `who'는 (각각) 호출하는 프로세스, 호출하는 프로세스의 프로세스 그룹, 호출하는 프로세스의 실제 사용자 ID를 나타냅니다.

@ref{213c,,가용성}: Unix, not WASI.


Added in version 3.3.

@end deffn

@geindex PRIO_PROCESS (os 모듈)
@geindex PRIO_PGRP (os 모듈)
@geindex PRIO_USER (os 모듈)
@anchor{library/os os PRIO_PROCESS}@anchor{3039}
@deffn {데이터} os.PRIO_PROCESS
@anchor{library/os os PRIO_PGRP}@anchor{303a}
@deffnx {데이터} os.PRIO_PGRP
@anchor{library/os os PRIO_USER}@anchor{303b}
@deffnx {데이터} os.PRIO_USER

@ref{1304,,getpriority()} 와 @ref{1305,,setpriority()} 함수의 매개 변숫값

@ref{213c,,가용성}: Unix, not WASI.


Added in version 3.3.

@end deffn

@geindex PRIO_DARWIN_THREAD (os 모듈)
@geindex PRIO_DARWIN_PROCESS (os 모듈)
@geindex PRIO_DARWIN_BG (os 모듈)
@geindex PRIO_DARWIN_NONUI (os 모듈)
@anchor{library/os os PRIO_DARWIN_THREAD}@anchor{303c}
@deffn {데이터} os.PRIO_DARWIN_THREAD
@anchor{library/os os PRIO_DARWIN_PROCESS}@anchor{303d}
@deffnx {데이터} os.PRIO_DARWIN_PROCESS
@anchor{library/os os PRIO_DARWIN_BG}@anchor{303e}
@deffnx {데이터} os.PRIO_DARWIN_BG
@anchor{library/os os PRIO_DARWIN_NONUI}@anchor{303f}
@deffnx {데이터} os.PRIO_DARWIN_NONUI

@ref{1304,,getpriority()} 와 @ref{1305,,setpriority()} 함수의 매개 변숫값

@ref{213c,,가용성}: macOS


Added in version 3.12.

@end deffn

@geindex getresuid() (os 모듈)
@anchor{library/os os getresuid}@anchor{151a}
@deffn {함수} os.getresuid ()

현재 프로세스의 실제(real), 유효(effective) 및 저장된(saved) 사용자 ID를 나타내는 튜플 (ruid, euid, suid)를 반환합니다.

@ref{213c,,가용성}: Unix, not WASI.


Added in version 3.2.

@end deffn

@geindex getresgid() (os 모듈)
@anchor{library/os os getresgid}@anchor{1519}
@deffn {함수} os.getresgid ()

현재 프로세스의 실제(real), 유효(effective) 및 저장된(saved) 그룹 ID를 나타내는 튜플 (rgid, egid, sgid)를 반환합니다.

@ref{213c,,가용성}: Unix, not WASI.


Added in version 3.2.

@end deffn

@geindex getuid() (os 모듈)
@anchor{library/os os getuid}@anchor{181a}
@deffn {함수} os.getuid ()

@geindex user;id

현재 프로세스의 실제(real) 사용자 ID를 반환합니다.

@ref{213c,,가용성}: Unix.

The function is a stub on WASI, see @ref{1b68,,웹어셈블리 플랫폼} for more
information.
@end deffn

@geindex initgroups() (os 모듈)
@anchor{library/os os initgroups}@anchor{151d}
@deffn {함수} os.initgroups (username, gid, /)

Call the system @code{initgroups()} to initialize the group access list with all of
the groups of which the specified username is a member, plus the specified
group id.

@ref{213c,,가용성}: Unix, not WASI, not Android.


Added in version 3.2.

@end deffn

@geindex putenv() (os 모듈)
@anchor{library/os os putenv}@anchor{25b}
@deffn {함수} os.putenv (key, value, /)

@geindex environment variables;setting

`key' 라는 환경 변수를 문자열 `value' 로 설정합니다. 이러한 환경의 변화는 @ref{1662,,os.system()}, @ref{31a,,popen()} 또는 @ref{4b6,,fork()} 및 @ref{3040,,execv()}로 시작된 자식 프로세스에 영향을 줍니다.

Assignments to items in @ref{259,,os.environ} are automatically translated into
corresponding calls to @code{putenv()}; however, calls to @code{putenv()}
don’t update @code{os.environ}, so it is actually preferable to assign to items
of @code{os.environ}. This also applies to @ref{3030,,getenv()} and @ref{141b,,getenvb()}, which
respectively use @code{os.environ} and @ref{25a,,os.environb} in their implementations.

See also the @ref{258,,os.reload_environ()} function.

@cartouche
@quotation 참고 
On some platforms, including FreeBSD and macOS, setting @code{environ} may
cause memory leaks. Refer to the system documentation for @code{putenv()}.
@end quotation
@end cartouche

@code{key}, @code{value}를 인자로 @ref{1c6c,,감사 이벤트(auditing event)} @code{os.putenv}를 발생시킵니다.


버전 3.9에서 변경: 이 함수는 이제 항상 사용할 수 있습니다.

@end deffn

@geindex setegid() (os 모듈)
@anchor{library/os os setegid}@anchor{3041}
@deffn {함수} os.setegid (egid, /)

현재 프로세스의 유효 그룹 ID를 설정합니다.

@ref{213c,,가용성}: Unix, not WASI, not Android.
@end deffn

@geindex seteuid() (os 모듈)
@anchor{library/os os seteuid}@anchor{3042}
@deffn {함수} os.seteuid (euid, /)

현재 프로세스의 유효 사용자 ID를 설정합니다.

@ref{213c,,가용성}: Unix, not WASI, not Android.
@end deffn

@geindex setgid() (os 모듈)
@anchor{library/os os setgid}@anchor{3043}
@deffn {함수} os.setgid (gid, /)

현재 프로세스의 그룹 ID를 설정합니다.

@ref{213c,,가용성}: Unix, not WASI, not Android.
@end deffn

@geindex setgroups() (os 모듈)
@anchor{library/os os setgroups}@anchor{3036}
@deffn {함수} os.setgroups (groups, /)

현재 프로세스와 연관된 보충(supplemental) 그룹 ID의 목록을 `groups'로 설정합니다. `groups' 는 시퀀스 여야 하며, 각 요소는 그룹을 식별하는 정수여야 합니다. 이 연산은 대개 슈퍼 유저만 사용할 수 있습니다.

@ref{213c,,가용성}: Unix, not WASI.

@cartouche
@quotation 참고 
On macOS, the length of `groups' may not exceed the
system-defined maximum number of effective group ids, typically 16.
See the documentation for @ref{3035,,getgroups()} for cases where it may not
return the same group list set by calling setgroups().
@end quotation
@end cartouche
@end deffn

@geindex setns() (os 모듈)
@anchor{library/os os setns}@anchor{1b3f}
@deffn {함수} os.setns (fd, nstype=0)

Reassociate the current thread with a Linux namespace.
See the @code{setns(2)@footnote{https://manpages.debian.org/setns(2)}} and @code{namespaces(7)@footnote{https://manpages.debian.org/namespaces(7)}} man pages for more
details.

If `fd' refers to a @code{/proc/`pid'/ns/} link, @code{setns()} reassociates the
calling thread with the namespace associated with that link,
and `nstype' may be set to one of the
@ref{3044,,CLONE_NEW* constants}
to impose constraints on the operation
(@code{0} means no constraints).

Since Linux 5.8, `fd' may refer to a PID file descriptor obtained from
@ref{6a3,,pidfd_open()}. In this case, @code{setns()} reassociates the calling thread
into one or more of the same namespaces as the thread referred to by `fd'.
This is subject to any constraints imposed by `nstype',
which is a bit mask combining one or more of the
@ref{3044,,CLONE_NEW* constants},
e.g. @code{setns(fd, os.CLONE_NEWUTS | os.CLONE_NEWPID)}.
The caller’s memberships in unspecified namespaces are left unchanged.

`fd' can be any object with a @ref{17b4,,fileno()} method, or a raw file descriptor.

This example reassociates the thread with the @code{init} process’s network namespace:

@example
fd = os.open("/proc/1/ns/net", os.O_RDONLY)
os.setns(fd, os.CLONE_NEWNET)
os.close(fd)
@end example

@ref{213c,,가용성}: Linux >= 3.0 with glibc >= 2.14.


Added in version 3.12.



@subsubheading 더 보기


The @ref{1b40,,unshare()} function.

@end deffn

@geindex setpgrp() (os 모듈)
@anchor{library/os os setpgrp}@anchor{3045}
@deffn {함수} os.setpgrp ()

Call the system call @code{setpgrp()} or @code{setpgrp(0, 0)} depending on
which version is implemented (if any).  See the Unix manual for the semantics.

@ref{213c,,가용성}: Unix, not WASI.
@end deffn

@geindex setpgid() (os 모듈)
@anchor{library/os os setpgid}@anchor{3046}
@deffn {함수} os.setpgid (pid, pgrp, /)

Call the system call @code{setpgid()} to set the process group id of the
process with id `pid' to the process group with id `pgrp'.  See the Unix manual
for the semantics.

@ref{213c,,가용성}: Unix, not WASI.
@end deffn

@geindex setpriority() (os 모듈)
@anchor{library/os os setpriority}@anchor{1305}
@deffn {함수} os.setpriority (which, who, priority)

@geindex process;scheduling priority

프로그램 스케줄 우선순위를 설정합니다. `which' 값은 @ref{3039,,PRIO_PROCESS}, @ref{303a,,PRIO_PGRP} 또는 @ref{303b,,PRIO_USER} 중 하나이고, `who'는 `which' 에 상대적으로 해석됩니다 (@code{PRIO_PROCESS} 면 프로세스 식별자, @code{PRIO_PGRP} 면 프로세스 그룹 식별자, @code{PRIO_USER} 면 사용자 ID). 0 값의 `who'는 (각각) 호출하는 프로세스, 호출하는 프로세스의 프로세스 그룹, 호출하는 프로세스의 실제 사용자 ID를 나타냅니다. `priority' 는 -20에서 19 사이의 값입니다. 기본 우선순위는 0입니다; 우선순위가 낮으면 더 유리하게 스케줄 됩니다.

@ref{213c,,가용성}: Unix, not WASI.


Added in version 3.3.

@end deffn

@geindex setregid() (os 모듈)
@anchor{library/os os setregid}@anchor{3047}
@deffn {함수} os.setregid (rgid, egid, /)

현재 프로세스의 실제(real) 및 유효한(effective) 그룹 ID를 설정합니다.

@ref{213c,,가용성}: Unix, not WASI, not Android.
@end deffn

@geindex setresgid() (os 모듈)
@anchor{library/os os setresgid}@anchor{151b}
@deffn {함수} os.setresgid (rgid, egid, sgid, /)

현재 프로세스의 실제(real), 유효(effective) 및 저장된(saved) 그룹 ID를 설정합니다.

@ref{213c,,가용성}: Unix, not WASI, not Android.


Added in version 3.2.

@end deffn

@geindex setresuid() (os 모듈)
@anchor{library/os os setresuid}@anchor{151c}
@deffn {함수} os.setresuid (ruid, euid, suid, /)

현재 프로세스의 실제(real), 유효(effective) 및 저장된(saved) 사용자 ID를 설정합니다.

@ref{213c,,가용성}: Unix, not WASI, not Android.


Added in version 3.2.

@end deffn

@geindex setreuid() (os 모듈)
@anchor{library/os os setreuid}@anchor{3048}
@deffn {함수} os.setreuid (ruid, euid, /)

현재 프로세스의 실제(real) 및 유효(effective) 사용자 ID를 설정합니다.

@ref{213c,,가용성}: Unix, not WASI, not Android.
@end deffn

@geindex getsid() (os 모듈)
@anchor{library/os os getsid}@anchor{3049}
@deffn {함수} os.getsid (pid, /)

Call the system call @code{getsid()}.  See the Unix manual for the semantics.

@ref{213c,,가용성}: Unix, not WASI.
@end deffn

@geindex setsid() (os 모듈)
@anchor{library/os os setsid}@anchor{1db7}
@deffn {함수} os.setsid ()

Call the system call @code{setsid()}.  See the Unix manual for the semantics.

@ref{213c,,가용성}: Unix, not WASI.
@end deffn

@geindex setuid() (os 모듈)
@anchor{library/os os setuid}@anchor{304a}
@deffn {함수} os.setuid (uid, /)

@geindex user;id@comma{} setting

현재 프로세스의 사용자 ID를 설정합니다.

@ref{213c,,가용성}: Unix, not WASI, not Android.
@end deffn

@c placed in this section since it relates to errno.... a little weak

@geindex strerror() (os 모듈)
@anchor{library/os os strerror}@anchor{304b}
@deffn {함수} os.strerror (code, /)

Return the error message corresponding to the error code in `code'.
On platforms where @code{strerror()} returns @code{NULL} when given an unknown
error number, @ref{2ec,,ValueError} is raised.
@end deffn

@geindex supports_bytes_environ (os 모듈)
@anchor{library/os os supports_bytes_environ}@anchor{141a}
@deffn {데이터} os.supports_bytes_environ

환경의 원시 OS 형이 바이트열이면 @code{True} (예를 들어, 윈도우에서는 @code{False}).


Added in version 3.2.

@end deffn

@geindex umask() (os 모듈)
@anchor{library/os os umask}@anchor{304c}
@deffn {함수} os.umask (mask, /)

현재 숫자 umask를 설정하고 이전 umask를 반환합니다.

The function is a stub on WASI, see @ref{1b68,,웹어셈블리 플랫폼} for more
information.
@end deffn

@geindex uname() (os 모듈)
@anchor{library/os os uname}@anchor{131b}
@deffn {함수} os.uname ()

@geindex gethostname() (in module socket)
@geindex gethostbyaddr() (in module socket)

현재 운영 체제를 식별하는 정보를 반환합니다. 반환 값은 5가지 어트리뷰트를 가진 객체입니다:


@itemize *

@item 
@code{sysname} - 운영 체제 이름

@item 
@code{nodename} - 네트워크상의 기계 이름 (구현이 정의)

@item 
@code{release} - 운영 체제 릴리스

@item 
@code{version} - 운영 체제 버전

@item 
@code{machine} - 하드웨어 식별자
@end itemize

하위 호환성을 위해, 이 객체는 이터러블이기도 해서, @code{sysname}, @code{nodename}, @code{release}, @code{version} 및 @code{machine}이 이 순서로 포함된 5-튜플처럼 작동합니다.

일부 시스템에서는 @code{nodename}을 8자나 선행 구성 요소로 자릅니다; 호스트 이름을 얻는 더 좋은 방법은 @ref{304d,,socket.gethostname()} 또는 더 나아가 @code{socket.gethostbyaddr(socket.gethostname())}입니다.

On macOS, iOS and Android, this returns the `kernel' name and version (i.e.,
@code{'Darwin'} on macOS and iOS; @code{'Linux'} on Android). @ref{1e0f,,platform.uname()}
can be used to get the user-facing operating system name and version on iOS and
Android.

@ref{213c,,가용성}: Unix.


버전 3.3에서 변경: 반환형이 튜플에서 이름이 지정된 어트리뷰트를 가진 튜플류 객체로 변경되었습니다.

@end deffn

@geindex unsetenv() (os 모듈)
@anchor{library/os os unsetenv}@anchor{25c}
@deffn {함수} os.unsetenv (key, /)

@geindex environment variables;deleting

`key' 라는 이름의 환경 변수를 삭제합니다. 이러한 환경 변화는 @ref{1662,,os.system()}, @ref{31a,,popen()} 또는 @ref{4b6,,fork()} 및 @ref{3040,,execv()}로 시작된 자식 프로세스에 영향을 줍니다.

Deletion of items in @ref{259,,os.environ} is automatically translated into a
corresponding call to @code{unsetenv()}; however, calls to @code{unsetenv()}
don’t update @code{os.environ}, so it is actually preferable to delete items of
@code{os.environ}.

See also the @ref{258,,os.reload_environ()} function.

@code{key}를 인자로 @ref{1c6c,,감사 이벤트(auditing event)} @code{os.unsetenv}를 발생시킵니다.


버전 3.9에서 변경: 이 함수는 이제 항상 사용할 수 있고 윈도우에서도 사용할 수 있습니다.

@end deffn

@geindex unshare() (os 모듈)
@anchor{library/os os unshare}@anchor{1b40}
@deffn {함수} os.unshare (flags)

Disassociate parts of the process execution context, and move them into a
newly created namespace.
See the @code{unshare(2)@footnote{https://manpages.debian.org/unshare(2)}}
man page for more details.
The `flags' argument is a bit mask, combining zero or more of the
@ref{3044,,CLONE_* constants},
that specifies which parts of the execution context should be
unshared from their existing associations and moved to a new namespace.
If the `flags' argument is @code{0}, no changes are made to the calling process’s
execution context.

@ref{213c,,가용성}: Linux >= 2.6.16.


Added in version 3.12.



@subsubheading 더 보기


The @ref{1b3f,,setns()} function.

@end deffn
@anchor{library/os os-unshare-clone-flags}@anchor{3044}
Flags to the @ref{1b40,,unshare()} function, if the implementation supports them.
See @code{unshare(2)@footnote{https://manpages.debian.org/unshare(2)}} in the Linux manual
for their exact effect and availability.

@geindex CLONE_FILES (os 모듈)
@geindex CLONE_FS (os 모듈)
@geindex CLONE_NEWCGROUP (os 모듈)
@geindex CLONE_NEWIPC (os 모듈)
@geindex CLONE_NEWNET (os 모듈)
@geindex CLONE_NEWNS (os 모듈)
@geindex CLONE_NEWPID (os 모듈)
@geindex CLONE_NEWTIME (os 모듈)
@geindex CLONE_NEWUSER (os 모듈)
@geindex CLONE_NEWUTS (os 모듈)
@geindex CLONE_SIGHAND (os 모듈)
@geindex CLONE_SYSVSEM (os 모듈)
@geindex CLONE_THREAD (os 모듈)
@geindex CLONE_VM (os 모듈)
@anchor{library/os os CLONE_FILES}@anchor{304e}
@deffn {데이터} os.CLONE_FILES
@anchor{library/os os CLONE_FS}@anchor{304f}
@deffnx {데이터} os.CLONE_FS
@anchor{library/os os CLONE_NEWCGROUP}@anchor{3050}
@deffnx {데이터} os.CLONE_NEWCGROUP
@anchor{library/os os CLONE_NEWIPC}@anchor{3051}
@deffnx {데이터} os.CLONE_NEWIPC
@anchor{library/os os CLONE_NEWNET}@anchor{3052}
@deffnx {데이터} os.CLONE_NEWNET
@anchor{library/os os CLONE_NEWNS}@anchor{3053}
@deffnx {데이터} os.CLONE_NEWNS
@anchor{library/os os CLONE_NEWPID}@anchor{3054}
@deffnx {데이터} os.CLONE_NEWPID
@anchor{library/os os CLONE_NEWTIME}@anchor{3055}
@deffnx {데이터} os.CLONE_NEWTIME
@anchor{library/os os CLONE_NEWUSER}@anchor{3056}
@deffnx {데이터} os.CLONE_NEWUSER
@anchor{library/os os CLONE_NEWUTS}@anchor{3057}
@deffnx {데이터} os.CLONE_NEWUTS
@anchor{library/os os CLONE_SIGHAND}@anchor{3058}
@deffnx {데이터} os.CLONE_SIGHAND
@anchor{library/os os CLONE_SYSVSEM}@anchor{3059}
@deffnx {데이터} os.CLONE_SYSVSEM
@anchor{library/os os CLONE_THREAD}@anchor{305a}
@deffnx {데이터} os.CLONE_THREAD
@anchor{library/os os CLONE_VM}@anchor{305b}
@deffnx {데이터} os.CLONE_VM
@end deffn

@node 파일 객체 생성,파일 기술자 연산,프로세스 매개 변수,os — Miscellaneous operating system interfaces
@anchor{library/os file-object-creation}@anchor{305c}@anchor{library/os os-newstreams}@anchor{305d}
@subsubsection 파일 객체 생성


이 함수들은 새로운 @ref{13c8,,파일 객체}를 만듭니다. (파일 기술자를 여는 것에 관해서는 @ref{f91,,open()}를 참조하십시오.)

@geindex fdopen() (os 모듈)
@anchor{library/os os fdopen}@anchor{237d}
@deffn {함수} os.fdopen (fd, *args, **kwargs)

파일 기술자 `fd에' 연결된 열린 파일 객체를 반환합니다. 이것은 @ref{316,,open()} 내장 함수의 별칭이며 같은 인자를 받아들입니다. 유일한 차이점은 @ref{237d,,fdopen()}의 첫 번째 인자는 항상 정수여야 한다는 것입니다.
@end deffn

@node 파일 기술자 연산,파일과 디렉터리,파일 객체 생성,os — Miscellaneous operating system interfaces
@anchor{library/os file-descriptor-operations}@anchor{305e}@anchor{library/os os-fd-ops}@anchor{305f}
@subsubsection 파일 기술자 연산


이 함수들은 파일 기술자를 사용하여 참조된 I/O 스트림에 작용합니다.

파일 기술자는 현재 프로세스에 의해 열린 파일에 대응하는 작은 정수입니다. 예를 들어, 표준 입력은 보통 파일 기술자 0이고, 표준 출력은 1이며, 표준 에러는 2입니다. 프로세스에 의해 열린 추가 파일은 3, 4, 5 등으로 지정됩니다. “파일 기술자”라는 이름은 약간 기만적입니다; 유닉스 플랫폼에서, 소켓과 파이프도 파일 기술자에 의해 참조됩니다.

@ref{17b4,,fileno()} 메서드는 필요할 때 @ref{13c8,,파일 객체}와 연관된 파일 기술자를 얻는 데 사용될 수 있습니다. 파일 기술자를 직접 사용하면 파일 객체 메서드를 거치지 않아서, 데이터의 내부 버퍼링과 같은 측면을 무시하게 되는 것에 유의하십시오.

@geindex close() (os 모듈)
@anchor{library/os os close}@anchor{d6a}
@deffn {함수} os.close (fd)

파일 기술자 `fd'를 닫습니다.

@cartouche
@quotation 참고 
이 함수는 저수준 I/O를 위한 것이며, @ref{f91,,os.open()} 또는 @ref{1b62,,pipe()}에 의해 반환된 파일 기술자에 적용되어야 합니다. 내장 함수 @ref{316,,open()} 나 @ref{31a,,popen()} 또는 @ref{237d,,fdopen()}에 의해 반환된 “파일 객체”를 닫으려면, @ref{505,,close()} 메서드를 사용하십시오.
@end quotation
@end cartouche
@end deffn

@geindex closerange() (os 모듈)
@anchor{library/os os closerange}@anchor{3060}
@deffn {함수} os.closerange (fd_low, fd_high, /)

에러는 무시하면서, `fd_low'(포함)부터 `fd_high'(제외)까지 모든 파일 기술자를 닫습니다. 다음과 동등합니다 (하지만 훨씬 빠릅니다):

@example
for fd in range(fd_low, fd_high):
    try:
        os.close(fd)
    except OSError:
        pass
@end example
@end deffn

@geindex copy_file_range() (os 모듈)
@anchor{library/os os copy_file_range}@anchor{18b5}
@deffn {함수} os.copy_file_range (src, dst, count, offset_src=None, offset_dst=None)

Copy `count' bytes from file descriptor `src', starting from offset
`offset_src', to file descriptor `dst', starting from offset `offset_dst'.
If `offset_src' is @code{None}, then `src' is read from the current position;
respectively for `offset_dst'.

In Linux kernel older than 5.3, the files pointed to by `src' and `dst'
must reside in the same filesystem, otherwise an @ref{2c0,,OSError} is
raised with @ref{17ba,,errno} set to @ref{3061,,errno.EXDEV}.

This copy is done without the additional cost of transferring data
from the kernel to user space and then back into the kernel. Additionally,
some filesystems could implement extra optimizations, such as the use of
reflinks (i.e., two or more inodes that share pointers to the same
copy-on-write disk blocks; supported file systems include btrfs and XFS)
and server-side copy (in the case of NFS).

The function copies bytes between two file descriptors. Text options, like
the encoding and the line ending, are ignored.

반환 값은 복사된 바이트의 양입니다. 이것은 요구된 양보다 적을 수 있습니다.

@cartouche
@quotation 참고 
On Linux, @ref{18b5,,os.copy_file_range()} should not be used for copying a
range of a pseudo file from a special filesystem like procfs and sysfs.
It will always copy no bytes and return 0 as if the file was empty
because of a known Linux kernel issue.
@end quotation
@end cartouche

@ref{213c,,가용성}: Linux >= 4.5 with glibc >= 2.27.


Added in version 3.8.

@end deffn

@geindex device_encoding() (os 모듈)
@anchor{library/os os device_encoding}@anchor{1c33}
@deffn {함수} os.device_encoding (fd)

`fd' 와 연관된 장치가 터미널에 연결되어 있을 때 인코딩을 설명하는 문자열을 반환합니다; 그렇지 않으면 @ref{884,,None}을 반환합니다.

On Unix, if the @ref{865,,Python UTF-8 Mode} is enabled, return
@code{'UTF-8'} rather than the device encoding.


버전 3.10에서 변경: On Unix, the function now implements the Python UTF-8 Mode.

@end deffn

@geindex dup() (os 모듈)
@anchor{library/os os dup}@anchor{1dbf}
@deffn {함수} os.dup (fd, /)

파일 기술자 `fd' 의 복사본을 반환합니다. 새 파일 기술자는 @ref{10fb,,상속 불가능}합니다.

윈도우에서는, 표준 스트림(0: stdin, 1: stdout, 2: stderr)을 복제할 때, 새 파일 기술자가 @ref{10fb,,상속 가능}합니다.

@ref{213c,,가용성}: not WASI.


버전 3.4에서 변경: 새로운 파일 기술자는 이제 상속 불가능합니다.

@end deffn

@geindex dup2() (os 모듈)
@anchor{library/os os dup2}@anchor{d59}
@deffn {함수} os.dup2 (fd, fd2, inheritable=True)

파일 기술자 `fd' 를 `fd2'에 복제하고, 필요하면 먼저 후자를 닫습니다. `fd2'를 반환합니다. 새로운 파일 기술자는 기본적으로 @ref{10fb,,상속 가능}하고, `inheritable' 이 @code{False}면 상속 불가능합니다.

@ref{213c,,가용성}: not WASI.


버전 3.4에서 변경: 선택적 `inheritable' 매개 변수를 추가했습니다.



버전 3.7에서 변경: 성공하면 `fd2' 를 반환합니다. 이전에는 항상 @code{None}을 반환했습니다.

@end deffn

@geindex fchmod() (os 모듈)
@anchor{library/os os fchmod}@anchor{52a}
@deffn {함수} os.fchmod (fd, mode)

`fd' 에 의해 주어진 파일의 모드를 숫자 `mode' 로 변경합니다. `mode'의 가능한 값은 @ref{529,,chmod()} 문서를 참조하십시오. 파이썬 3.3부터는, @code{os.chmod(fd, mode)}와 같습니다.

@code{path}, @code{mode}, @code{dir_fd}를 인자로 @ref{1c6c,,감사 이벤트(auditing event)} @code{os.chmod}를 발생시킵니다.

@ref{213c,,가용성}: Unix, Windows.

The function is limited on WASI, see @ref{1b68,,웹어셈블리 플랫폼} for more
information.


버전 3.13에서 변경: Added support on Windows.

@end deffn

@geindex fchown() (os 모듈)
@anchor{library/os os fchown}@anchor{f89}
@deffn {함수} os.fchown (fd, uid, gid)

`fd' 에 의해 주어진 파일의 소유자와 그룹 id를 숫자 `uid' 와 `gid'로 변경합니다. ID 중 하나를 변경하지 않으려면, 그것을 -1로 설정하십시오. @ref{12f3,,chown()}를 참조하십시오. 파이썬 3.3부터는, @code{os.chown(fd, uid, gid)}와 같습니다.

@code{path}, @code{uid}, @code{gid}, @code{dir_fd}를 인자로 @ref{1c6c,,감사 이벤트(auditing event)} @code{os.chown}을 발생시킵니다.

@ref{213c,,가용성}: Unix.

The function is limited on WASI, see @ref{1b68,,웹어셈블리 플랫폼} for more
information.
@end deffn

@geindex fdatasync() (os 모듈)
@anchor{library/os os fdatasync}@anchor{f8a}
@deffn {함수} os.fdatasync (fd)

파일 기술자 `fd' 로 주어진 파일을 디스크에 쓰도록 강제합니다. 메타 데이터를 갱신하도록 강제하지 않습니다.

@ref{213c,,가용성}: Unix.

@cartouche
@quotation 참고 
이 함수는 MacOS에서는 사용할 수 없습니다.
@end quotation
@end cartouche
@end deffn

@geindex fpathconf() (os 모듈)
@anchor{library/os os fpathconf}@anchor{3062}
@deffn {함수} os.fpathconf (fd, name, /)

열린 파일과 관련된 시스템 구성 정보를 반환합니다. `name' 은 조회할 구성 값을 지정합니다; 정의된 시스템 값의 이름인 문자열일 수 있습니다; 이 이름은 여러 표준(POSIX.1, 유닉스 95, 유닉스 98 및 기타)에서 지정됩니다. 일부 플랫폼은 추가 이름도 정의합니다. 호스트 운영 체제에 알려진 이름은 @code{pathconf_names} 딕셔너리에서 제공됩니다. 이 매핑에 포함되지 않은 구성 변수의 경우, `name'에 정수를 전달하는 것도 허용됩니다.

`name' 이 문자열이고 알 수 없으면, @ref{2ec,,ValueError}가 발생합니다. `name'에 대한 특정 값이 호스트 시스템에서 지원되지 않으면, @code{pathconf_names}에 포함되어 있어도, 에러 번호가 @ref{1dcf,,errno.EINVAL}인 @ref{2c0,,OSError}가 발생합니다.

파이썬 3.3부터, @code{os.pathconf(fd, name)}과 같습니다.

@ref{213c,,가용성}: Unix.
@end deffn

@geindex fstat() (os 모듈)
@anchor{library/os os fstat}@anchor{f8b}
@deffn {함수} os.fstat (fd)

파일 기술자 `fd' 의 상태를 가져옵니다. @ref{16c6,,stat_result} 객체를 반환합니다.

파이썬 3.3부터는, @code{os.stat(fd)}와 같습니다.


@subsubheading 더 보기


@ref{26d,,stat()} 함수.

@end deffn

@geindex fstatvfs() (os 모듈)
@anchor{library/os os fstatvfs}@anchor{f8c}
@deffn {함수} os.fstatvfs (fd, /)

@ref{1301,,statvfs()} 처럼, 파일 기술자 `fd' 와 연관된 파일을 포함하는 파일 시스템에 대한 정보를 반환합니다. 파이썬 3.3부터는, @code{os.statvfs(fd)}와 같습니다.

@ref{213c,,가용성}: Unix.
@end deffn

@geindex fsync() (os 모듈)
@anchor{library/os os fsync}@anchor{f8d}
@deffn {함수} os.fsync (fd)

Force write of file with filedescriptor `fd' to disk.  On Unix, this calls the
native @code{fsync()} function; on Windows, the MS @code{_commit()} function.

버퍼링 된 파이썬 @ref{13c8,,파일 객체} `f'로 시작하는 경우, `f' 와 연관된 모든 내부 버퍼가 디스크에 기록되게 하려면, 먼저 @code{f.flush()}를 수행한 다음 @code{os.fsync(f.fileno())}를 하십시오.

@ref{213c,,가용성}: Unix, Windows.
@end deffn

@geindex ftruncate() (os 모듈)
@anchor{library/os os ftruncate}@anchor{f8e}
@deffn {함수} os.ftruncate (fd, length, /)

파일 기술자 `fd'에 해당하는 파일을 잘라내어 최대 `length' 바이트가 되도록 만듭니다. 파이썬 3.3부터는, @code{os.truncate(fd, length)}와 같습니다.

@code{fd}, @code{length}를 인자로 @ref{1c6c,,감사 이벤트(auditing event)} @code{os.truncate}를 발생시킵니다.

@ref{213c,,가용성}: Unix, Windows.


버전 3.5에서 변경: 윈도우 지원 추가

@end deffn

@geindex get_blocking() (os 모듈)
@anchor{library/os os get_blocking}@anchor{1038}
@deffn {함수} os.get_blocking (fd, /)

파일 기술자의 블로킹 모드를 얻어옵니다: @ref{103a,,O_NONBLOCK} 플래그가 설정되었으면 @code{False}, 플래그가 지워졌으면 @code{True}.

@ref{1039,,set_blocking()} 및 @ref{3063,,socket.socket.setblocking()}도 참조하십시오.

@ref{213c,,가용성}: Unix, Windows.

The function is limited on WASI, see @ref{1b68,,웹어셈블리 플랫폼} for more
information.

On Windows, this function is limited to pipes.


Added in version 3.5.



버전 3.12에서 변경: Added support for pipes on Windows.

@end deffn

@geindex grantpt() (os 모듈)
@anchor{library/os os grantpt}@anchor{19fe}
@deffn {함수} os.grantpt (fd, /)

Grant access to the slave pseudo-terminal device associated with the
master pseudo-terminal device to which the file descriptor `fd' refers.
The file descriptor `fd' is not closed upon failure.

Calls the C standard library function @code{grantpt()}.

@ref{213c,,가용성}: Unix, not WASI.


Added in version 3.13.

@end deffn

@geindex isatty() (os 모듈)
@anchor{library/os os isatty}@anchor{1c32}
@deffn {함수} os.isatty (fd, /)

파일 기술자 `fd' 가 열려 있고 tty(류의) 장치에 연결되어 있으면 @code{True}를 반환하고, 그렇지 않으면 @code{False}를 반환합니다.
@end deffn

@geindex lockf() (os 모듈)
@anchor{library/os os lockf}@anchor{1318}
@deffn {함수} os.lockf (fd, cmd, len, /)

열린 파일 기술자에 POSIX 록을 적용, 검사 또는 제거합니다. `fd' 는 열린 파일 기술자입니다. `cmd' 는 사용할 명령을 지정합니다 - @ref{3064,,F_LOCK}, @ref{3065,,F_TLOCK}, @ref{3066,,F_ULOCK} 또는 @ref{3067,,F_TEST} 중 하나. `len' 은 잠글 파일의 영역을 지정합니다.

@code{fd}, @code{cmd}, @code{len}을 인자로 @ref{1c6c,,감사 이벤트(auditing event)} @code{os.lockf}를 발생시킵니다.

@ref{213c,,가용성}: Unix.


Added in version 3.3.

@end deffn

@geindex F_LOCK (os 모듈)
@geindex F_TLOCK (os 모듈)
@geindex F_ULOCK (os 모듈)
@geindex F_TEST (os 모듈)
@anchor{library/os os F_LOCK}@anchor{3064}
@deffn {데이터} os.F_LOCK
@anchor{library/os os F_TLOCK}@anchor{3065}
@deffnx {데이터} os.F_TLOCK
@anchor{library/os os F_ULOCK}@anchor{3066}
@deffnx {데이터} os.F_ULOCK
@anchor{library/os os F_TEST}@anchor{3067}
@deffnx {데이터} os.F_TEST

@ref{1318,,lockf()}가 취할 조치를 지정하는 플래그.

@ref{213c,,가용성}: Unix.


Added in version 3.3.

@end deffn

@geindex login_tty() (os 모듈)
@anchor{library/os os login_tty}@anchor{1ac8}
@deffn {함수} os.login_tty (fd, /)

Prepare the tty of which fd is a file descriptor for a new login session.
Make the calling process a session leader; make the tty the controlling tty,
the stdin, the stdout, and the stderr of the calling process; close fd.

@ref{213c,,가용성}: Unix, not WASI.


Added in version 3.11.

@end deffn

@geindex lseek() (os 모듈)
@anchor{library/os os lseek}@anchor{131c}
@deffn {함수} os.lseek (fd, pos, whence, /)

Set the current position of file descriptor `fd' to position `pos', modified
by `whence', and return the new position in bytes relative to
the start of the file.
Valid values for `whence' are:


@itemize *

@item 
@ref{1492,,SEEK_SET} or @code{0} – set `pos' relative to the beginning of the file

@item 
@ref{1493,,SEEK_CUR} or @code{1} – set `pos' relative to the current file position

@item 
@ref{1494,,SEEK_END} or @code{2} – set `pos' relative to the end of the file

@item 
@ref{3068,,SEEK_HOLE} – set `pos' to the next data location, relative to `pos'

@item 
@ref{3069,,SEEK_DATA} – set `pos' to the next data hole, relative to `pos'
@end itemize


버전 3.3에서 변경: Add support for @code{SEEK_HOLE} and @code{SEEK_DATA}.

@end deffn

@geindex SEEK_SET (os 모듈)
@geindex SEEK_CUR (os 모듈)
@geindex SEEK_END (os 모듈)
@anchor{library/os os SEEK_SET}@anchor{1492}
@deffn {데이터} os.SEEK_SET
@anchor{library/os os SEEK_CUR}@anchor{1493}
@deffnx {데이터} os.SEEK_CUR
@anchor{library/os os SEEK_END}@anchor{1494}
@deffnx {데이터} os.SEEK_END

Parameters to the @ref{131c,,lseek()} function and the @ref{1491,,seek()}
method on @ref{13c8,,file-like objects},
for whence to adjust the file position indicator.


@table @asis

@item @ref{1492,,SEEK_SET}

Adjust the file position relative to the beginning of the file.

@item @ref{1493,,SEEK_CUR}

Adjust the file position relative to the current file position.

@item @ref{1494,,SEEK_END}

Adjust the file position relative to the end of the file.
@end table

Their values are 0, 1, and 2, respectively.
@end deffn

@geindex SEEK_HOLE (os 모듈)
@geindex SEEK_DATA (os 모듈)
@anchor{library/os os SEEK_HOLE}@anchor{3068}
@deffn {데이터} os.SEEK_HOLE
@anchor{library/os os SEEK_DATA}@anchor{3069}
@deffnx {데이터} os.SEEK_DATA

Parameters to the @ref{131c,,lseek()} function and the @ref{1491,,seek()}
method on @ref{13c8,,file-like objects},
for seeking file data and holes on sparsely allocated files.


@table @asis

@item @code{SEEK_DATA}

Adjust the file offset to the next location containing data,
relative to the seek position.

@item @code{SEEK_HOLE}

Adjust the file offset to the next location containing a hole,
relative to the seek position.
A hole is defined as a sequence of zeros.
@end table

@cartouche
@quotation 참고 
These operations only make sense for filesystems that support them.
@end quotation
@end cartouche

@ref{213c,,가용성}: Linux >= 3.1, macOS, Unix


Added in version 3.3.

@end deffn

@geindex open() (os 모듈)
@anchor{library/os os open}@anchor{f91}
@deffn {함수} os.open (path, flags, mode=0o777, *, dir_fd=None)

파일 `path'를 열고 `flags' 에 따른 다양한 플래그와 때로 `mode' 따른 모드를 설정합니다. `mode'를 계산할 때, 현재 umask 값으로 먼저 마스킹합니다. 새롭게 열린 파일의 파일 기술자를 돌려줍니다. 새 파일 기술자는 @ref{10fb,,상속 불가능}합니다.

For a description of the flag and mode values, see the C run-time documentation;
flag constants (like @ref{306a,,O_RDONLY} and @ref{306b,,O_WRONLY}) are defined in
the @code{os} module.  In particular, on Windows adding
@ref{306c,,O_BINARY} is needed to open files in binary mode.

이 함수는 `dir_fd' 매개 변수로 @ref{12ef,,디렉터리 기술자에 상대적인 경로}를 지원할 수 있습니다.

@code{path}, @code{mode}, @code{flags}를 인자로 @ref{1c6c,,감사 이벤트(auditing event)} @code{open}을 발생시킵니다.


버전 3.4에서 변경: 새로운 파일 기술자는 이제 상속 불가능합니다.


@cartouche
@quotation 참고 
This function is intended for low-level I/O.  For normal usage, use the
built-in function @ref{316,,open()}, which returns a @ref{13c8,,file object} with
@ref{152d,,read()} and @ref{ed6,,write()} methods.
To wrap a file descriptor in a file object, use @ref{237d,,fdopen()}.
@end quotation
@end cartouche


버전 3.3에서 변경: `dir_fd' 매개 변수가 추가되었습니다.



버전 3.5에서 변경: 시스템 호출이 인터럽트 되고 시그널 처리기가 예외를 발생시키지 않으면, 함수는 이제 @ref{f87,,InterruptedError} 예외를 일으키는 대신 시스템 호출을 재시도합니다 (이유는 
@geindex Python 향상 제안; PEP 475
PEP 475@footnote{https://peps.python.org/pep-0475/}를 참조하세요).



버전 3.6에서 변경: @ref{5a0,,경로류 객체}를 받아들입니다.

@end deffn

다음 상수는 @ref{f91,,open()} 함수에 대한 `flags' 매개 변수의 옵션입니다. 비트별 OR 연산자 @code{|}를 사용하여 결합할 수 있습니다. 일부는 모든 플랫폼에서 사용할 수는 없습니다. 가용성과 사용에 대한 설명은 유닉스의 @code{open(2)@footnote{https://manpages.debian.org/open(2)}} 매뉴얼 페이지 또는 윈도우의 MSDN@footnote{https://msdn.microsoft.com/en-us/library/z0kc8e3z.aspx}을 참조하십시오.

@geindex O_RDONLY (os 모듈)
@geindex O_WRONLY (os 모듈)
@geindex O_RDWR (os 모듈)
@geindex O_APPEND (os 모듈)
@geindex O_CREAT (os 모듈)
@geindex O_EXCL (os 모듈)
@geindex O_TRUNC (os 모듈)
@anchor{library/os os O_RDONLY}@anchor{306a}
@deffn {데이터} os.O_RDONLY
@anchor{library/os os O_WRONLY}@anchor{306b}
@deffnx {데이터} os.O_WRONLY
@anchor{library/os os O_RDWR}@anchor{306d}
@deffnx {데이터} os.O_RDWR
@anchor{library/os os O_APPEND}@anchor{306e}
@deffnx {데이터} os.O_APPEND
@anchor{library/os os O_CREAT}@anchor{306f}
@deffnx {데이터} os.O_CREAT
@anchor{library/os os O_EXCL}@anchor{2cf6}
@deffnx {데이터} os.O_EXCL
@anchor{library/os os O_TRUNC}@anchor{3070}
@deffnx {데이터} os.O_TRUNC

위의 상수는 유닉스 및 윈도우에서 사용할 수 있습니다.
@end deffn

@geindex O_DSYNC (os 모듈)
@geindex O_RSYNC (os 모듈)
@geindex O_SYNC (os 모듈)
@geindex O_NDELAY (os 모듈)
@geindex O_NONBLOCK (os 모듈)
@geindex O_NOCTTY (os 모듈)
@geindex O_CLOEXEC (os 모듈)
@anchor{library/os os O_DSYNC}@anchor{3071}
@deffn {데이터} os.O_DSYNC
@anchor{library/os os O_RSYNC}@anchor{3072}
@deffnx {데이터} os.O_RSYNC
@anchor{library/os os O_SYNC}@anchor{3073}
@deffnx {데이터} os.O_SYNC
@anchor{library/os os O_NDELAY}@anchor{3074}
@deffnx {데이터} os.O_NDELAY
@anchor{library/os os O_NONBLOCK}@anchor{103a}
@deffnx {데이터} os.O_NONBLOCK
@anchor{library/os os O_NOCTTY}@anchor{3075}
@deffnx {데이터} os.O_NOCTTY
@anchor{library/os os O_CLOEXEC}@anchor{127b}
@deffnx {데이터} os.O_CLOEXEC

위의 상수는 유닉스에서만 사용할 수 있습니다.


버전 3.3에서 변경: @ref{127b,,O_CLOEXEC} 상수를 추가합니다.

@end deffn

@geindex O_BINARY (os 모듈)
@geindex O_NOINHERIT (os 모듈)
@geindex O_SHORT_LIVED (os 모듈)
@geindex O_TEMPORARY (os 모듈)
@geindex O_RANDOM (os 모듈)
@geindex O_SEQUENTIAL (os 모듈)
@geindex O_TEXT (os 모듈)
@anchor{library/os os O_BINARY}@anchor{306c}
@deffn {데이터} os.O_BINARY
@anchor{library/os os O_NOINHERIT}@anchor{3076}
@deffnx {데이터} os.O_NOINHERIT
@anchor{library/os os O_SHORT_LIVED}@anchor{3077}
@deffnx {데이터} os.O_SHORT_LIVED
@anchor{library/os os O_TEMPORARY}@anchor{3078}
@deffnx {데이터} os.O_TEMPORARY
@anchor{library/os os O_RANDOM}@anchor{3079}
@deffnx {데이터} os.O_RANDOM
@anchor{library/os os O_SEQUENTIAL}@anchor{307a}
@deffnx {데이터} os.O_SEQUENTIAL
@anchor{library/os os O_TEXT}@anchor{307b}
@deffnx {데이터} os.O_TEXT

위의 상수는 윈도우에서만 사용할 수 있습니다.
@end deffn

@geindex O_EVTONLY (os 모듈)
@geindex O_FSYNC (os 모듈)
@geindex O_SYMLINK (os 모듈)
@geindex O_NOFOLLOW_ANY (os 모듈)
@anchor{library/os os O_EVTONLY}@anchor{a1b}
@deffn {데이터} os.O_EVTONLY
@anchor{library/os os O_FSYNC}@anchor{a1c}
@deffnx {데이터} os.O_FSYNC
@anchor{library/os os O_SYMLINK}@anchor{a1d}
@deffnx {데이터} os.O_SYMLINK
@anchor{library/os os O_NOFOLLOW_ANY}@anchor{a1e}
@deffnx {데이터} os.O_NOFOLLOW_ANY

The above constants are only available on macOS.


버전 3.10에서 변경: Add @code{O_EVTONLY}, @code{O_FSYNC}, @code{O_SYMLINK}
and @code{O_NOFOLLOW_ANY} constants.

@end deffn

@geindex O_ASYNC (os 모듈)
@geindex O_DIRECT (os 모듈)
@geindex O_DIRECTORY (os 모듈)
@geindex O_NOFOLLOW (os 모듈)
@geindex O_NOATIME (os 모듈)
@geindex O_PATH (os 모듈)
@geindex O_TMPFILE (os 모듈)
@geindex O_SHLOCK (os 모듈)
@geindex O_EXLOCK (os 모듈)
@anchor{library/os os O_ASYNC}@anchor{307c}
@deffn {데이터} os.O_ASYNC
@anchor{library/os os O_DIRECT}@anchor{307d}
@deffnx {데이터} os.O_DIRECT
@anchor{library/os os O_DIRECTORY}@anchor{307e}
@deffnx {데이터} os.O_DIRECTORY
@anchor{library/os os O_NOFOLLOW}@anchor{307f}
@deffnx {데이터} os.O_NOFOLLOW
@anchor{library/os os O_NOATIME}@anchor{3080}
@deffnx {데이터} os.O_NOATIME
@anchor{library/os os O_PATH}@anchor{1171}
@deffnx {데이터} os.O_PATH
@anchor{library/os os O_TMPFILE}@anchor{1172}
@deffnx {데이터} os.O_TMPFILE
@anchor{library/os os O_SHLOCK}@anchor{1634}
@deffnx {데이터} os.O_SHLOCK
@anchor{library/os os O_EXLOCK}@anchor{1635}
@deffnx {데이터} os.O_EXLOCK

위의 상수는 확장이며 C 라이브러리에서 정의하지 않으면 존재하지 않습니다.


버전 3.4에서 변경: 지원하는 시스템에 @ref{1171,,O_PATH}를 추가합니다. 리눅스 커널 3.11 이상에서만 사용 가능한 @ref{1172,,O_TMPFILE}를 추가합니다.

@end deffn

@geindex openpty() (os 모듈)
@anchor{library/os os openpty}@anchor{3081}
@deffn {함수} os.openpty ()

@geindex module;pty

새로운 의사 터미널 쌍을 엽니다. 파일 기술자의 쌍 @code{(master, slave)} 를 반환하는데, 각각 pty와 tty 입니다. 새 파일 기술자는 @ref{10fb,,상속 불가능}합니다. (약간) 더 이식성 있는 접근 방식을 사용하려면, @ref{b6,,pty} 모듈을 사용하십시오.

@ref{213c,,가용성}: Unix, not WASI.


버전 3.4에서 변경: 새로운 파일 기술자는 이제 상속 불가능합니다.

@end deffn

@geindex pipe() (os 모듈)
@anchor{library/os os pipe}@anchor{1b62}
@deffn {함수} os.pipe ()

파이프를 만듭니다. 파일 기술자 쌍 @code{(r, w)} 를 반환하는데, 각각 읽기와 쓰기에 사용할 수 있습니다. 새 파일 기술자는 @ref{10fb,,상속 불가능}합니다.

@ref{213c,,가용성}: Unix, Windows.


버전 3.4에서 변경: 새로운 파일 기술자는 이제 상속 불가능합니다.

@end deffn

@geindex pipe2() (os 모듈)
@anchor{library/os os pipe2}@anchor{12ee}
@deffn {함수} os.pipe2 (flags, /)

`flags' 가 원자적으로 설정된 파이프를 만듭니다. `flags' 는 다음과 같은 값들을 하나 이상 OR 해서 만들 수 있습니다: @ref{103a,,O_NONBLOCK}, @ref{127b,,O_CLOEXEC}. 파일 기술자 쌍 @code{(r, w)} 를 반환하는데, 각각 읽기와 쓰기에 사용할 수 있습니다.

@ref{213c,,가용성}: Unix, not WASI.


Added in version 3.3.

@end deffn

@geindex posix_fallocate() (os 모듈)
@anchor{library/os os posix_fallocate}@anchor{f93}
@deffn {함수} os.posix_fallocate (fd, offset, len, /)

`fd'로 지정된 파일이 `offset' 에서 시작하여 `len' 바이트 동안 계속되도록 충분한 디스크 공간을 할당합니다.

@ref{213c,,가용성}: Unix.


Added in version 3.3.

@end deffn

@geindex posix_fadvise() (os 모듈)
@anchor{library/os os posix_fadvise}@anchor{f92}
@deffn {함수} os.posix_fadvise (fd, offset, len, advice, /)

특정 패턴으로 데이터에 액세스하려는 의도를 알려 커널이 최적화할 수 있도록 합니다. 조언(advice)은 `fd에' 의해 지정된 파일의 `offset' 에서 시작하여 `len' 바이트 동안 계속되는 영역에 적용됩니다. `advice'는 @ref{3082,,POSIX_FADV_NORMAL}, @ref{3083,,POSIX_FADV_SEQUENTIAL}, @ref{3084,,POSIX_FADV_RANDOM}, @ref{3085,,POSIX_FADV_NOREUSE}, @ref{3086,,POSIX_FADV_WILLNEED} 또는 @ref{3087,,POSIX_FADV_DONTNEED} 중 하나입니다.

@ref{213c,,가용성}: Unix.


Added in version 3.3.

@end deffn

@geindex POSIX_FADV_NORMAL (os 모듈)
@geindex POSIX_FADV_SEQUENTIAL (os 모듈)
@geindex POSIX_FADV_RANDOM (os 모듈)
@geindex POSIX_FADV_NOREUSE (os 모듈)
@geindex POSIX_FADV_WILLNEED (os 모듈)
@geindex POSIX_FADV_DONTNEED (os 모듈)
@anchor{library/os os POSIX_FADV_NORMAL}@anchor{3082}
@deffn {데이터} os.POSIX_FADV_NORMAL
@anchor{library/os os POSIX_FADV_SEQUENTIAL}@anchor{3083}
@deffnx {데이터} os.POSIX_FADV_SEQUENTIAL
@anchor{library/os os POSIX_FADV_RANDOM}@anchor{3084}
@deffnx {데이터} os.POSIX_FADV_RANDOM
@anchor{library/os os POSIX_FADV_NOREUSE}@anchor{3085}
@deffnx {데이터} os.POSIX_FADV_NOREUSE
@anchor{library/os os POSIX_FADV_WILLNEED}@anchor{3086}
@deffnx {데이터} os.POSIX_FADV_WILLNEED
@anchor{library/os os POSIX_FADV_DONTNEED}@anchor{3087}
@deffnx {데이터} os.POSIX_FADV_DONTNEED

사용 가능성이 큰 액세스 패턴을 지정하는 @ref{f92,,posix_fadvise()}의 `advice' 에 사용될 수 있는 플래그.

@ref{213c,,가용성}: Unix.


Added in version 3.3.

@end deffn

@geindex pread() (os 모듈)
@anchor{library/os os pread}@anchor{d55}
@deffn {함수} os.pread (fd, n, offset, /)

파일 기술자 `fd'에서 `offset' 의 위치부터 최대 `n' 바이트를 읽어 들이고, 파일 오프셋은 변경되지 않은 채로 남겨 둡니다.

읽어 들인 바이트를 포함하는 바이트열을 돌려줍니다. `fd' 에 의해 참조된 파일의 끝에 도달하면, 빈 바이트열 객체가 반환됩니다.

@ref{213c,,가용성}: Unix.


Added in version 3.3.

@end deffn

@geindex posix_openpt() (os 모듈)
@anchor{library/os os posix_openpt}@anchor{19fd}
@deffn {함수} os.posix_openpt (oflag, /)

Open and return a file descriptor for a master pseudo-terminal device.

Calls the C standard library function @code{posix_openpt()}. The `oflag'
argument is used to set file status flags and file access modes as
specified in the manual page of @code{posix_openpt()} of your system.

The returned file descriptor is @ref{10fb,,non-inheritable}.
If the value @ref{127b,,O_CLOEXEC} is available on the system, it is added to
`oflag'.

@ref{213c,,가용성}: Unix, not WASI.


Added in version 3.13.

@end deffn

@geindex preadv() (os 모듈)
@anchor{library/os os preadv}@anchor{d53}
@deffn {함수} os.preadv (fd, buffers, offset, flags=0, /)

파일 기술자 `fd'에서 `offset' 위치부터 가변 @ref{193,,바이트열류 객체들} `buffers' 로 읽어 들이고, 파일 오프셋은 변경되지 않은 채로 남겨 둡니다. 데이터가 가득 찰 때까지 각 버퍼로 데이터를 전송한 다음 나머지 데이터를 보관하기 위해 시퀀스의 다음 버퍼로 이동합니다.

flags 인자는 다음 플래그 중 0개 이상의 비트별 OR를 포함합니다:


@itemize -

@item 
@ref{3088,,RWF_HIPRI}

@item 
@ref{3089,,RWF_NOWAIT}
@end itemize

실제로 읽힌 총 바이트 수를 반환합니다. 이 값은 모든 객체의 총 용량보다 작을 수 있습니다.

운영 체제는 사용할 수 있는 버퍼 수에 한계(@ref{18ee,,sysconf()} 값 @code{'SC_IOV_MAX'})를 설정할 수 있습니다.

@ref{d54,,os.readv()} 와 @ref{d55,,os.pread()}의 기능을 결합합니다.

@ref{213c,,가용성}: Linux >= 2.6.30, FreeBSD >= 6.0, OpenBSD >= 2.7, AIX >= 7.1.

Using flags requires Linux >= 4.6.


Added in version 3.7.

@end deffn

@geindex RWF_NOWAIT (os 모듈)
@anchor{library/os os RWF_NOWAIT}@anchor{3089}
@deffn {데이터} os.RWF_NOWAIT

즉시 사용할 수 없는 데이터를 기다리지 않습니다. 이 플래그를 지정하면, 하부 저장 장치에서 데이터를 읽어야 하거나 록을 기다려야 할 때 즉시 시스템 호출이 반환됩니다.

If some data was successfully read, it will return the number of bytes read.
If no bytes were read, it will return @code{-1} and set errno to
@ref{2703,,errno.EAGAIN}.

@ref{213c,,가용성}: Linux >= 4.14.


Added in version 3.7.

@end deffn

@geindex RWF_HIPRI (os 모듈)
@anchor{library/os os RWF_HIPRI}@anchor{3088}
@deffn {데이터} os.RWF_HIPRI

우선순위가 높은 읽기/쓰기. 블록 기반 파일 시스템이 장치의 폴링을 사용할 수 있게 하여, 지연은 짧아 지지만, 추가 자원을 사용할 수 있습니다.

현재, 리눅스에서, 이 기능은 @ref{307d,,O_DIRECT} 플래그를 사용하여 열린 파일 기술자에만 사용할 수 있습니다.

@ref{213c,,가용성}: Linux >= 4.6.


Added in version 3.7.

@end deffn

@geindex ptsname() (os 모듈)
@anchor{library/os os ptsname}@anchor{1a00}
@deffn {함수} os.ptsname (fd, /)

Return the name of the slave pseudo-terminal device associated with the
master pseudo-terminal device to which the file descriptor `fd' refers.
The file descriptor `fd' is not closed upon failure.

Calls the reentrant C standard library function @code{ptsname_r()} if
it is available; otherwise, the C standard library function
@code{ptsname()}, which is not guaranteed to be thread-safe, is called.

@ref{213c,,가용성}: Unix, not WASI.


Added in version 3.13.

@end deffn

@geindex pwrite() (os 모듈)
@anchor{library/os os pwrite}@anchor{d58}
@deffn {함수} os.pwrite (fd, str, offset, /)

파일 기술자 `fd'의 `offset' 위치에 `str' 바이트열을 쓰고, 파일 오프셋은 변경되지 않은 채로 남겨 둡니다.

실제로 쓴 바이트 수를 반환합니다.

@ref{213c,,가용성}: Unix.


Added in version 3.3.

@end deffn

@geindex pwritev() (os 모듈)
@anchor{library/os os pwritev}@anchor{d56}
@deffn {함수} os.pwritev (fd, buffers, offset, flags=0, /)

Write the `buffers' contents to file descriptor `fd' at an offset `offset',
leaving the file offset unchanged.  `buffers' must be a sequence of
@ref{193,,bytes-like objects}. Buffers are processed in
array order. Entire contents of the first buffer is written before
proceeding to the second, and so on.

flags 인자는 다음 플래그 중 0개 이상의 비트별 OR를 포함합니다:


@itemize -

@item 
@ref{308a,,RWF_DSYNC}

@item 
@ref{308b,,RWF_SYNC}

@item 
@ref{1d2a,,RWF_APPEND}
@end itemize

실제로 쓴 총 바이트 수를 반환합니다.

운영 체제는 사용할 수 있는 버퍼 수에 한계(@ref{18ee,,sysconf()} 값 @code{'SC_IOV_MAX'})를 설정할 수 있습니다.

@ref{d57,,os.writev()} 와 @ref{d58,,os.pwrite()}의 기능을 결합합니다.

@ref{213c,,가용성}: Linux >= 2.6.30, FreeBSD >= 6.0, OpenBSD >= 2.7, AIX >= 7.1.

Using flags requires Linux >= 4.6.


Added in version 3.7.

@end deffn

@geindex RWF_DSYNC (os 모듈)
@anchor{library/os os RWF_DSYNC}@anchor{308a}
@deffn {데이터} os.RWF_DSYNC

Provide a per-write equivalent of the @ref{3071,,O_DSYNC} @ref{f91,,os.open()} flag.
This flag effect applies only to the data range written by the system call.

@ref{213c,,가용성}: Linux >= 4.7.


Added in version 3.7.

@end deffn

@geindex RWF_SYNC (os 모듈)
@anchor{library/os os RWF_SYNC}@anchor{308b}
@deffn {데이터} os.RWF_SYNC

Provide a per-write equivalent of the @ref{3073,,O_SYNC} @ref{f91,,os.open()} flag.
This flag effect applies only to the data range written by the system call.

@ref{213c,,가용성}: Linux >= 4.7.


Added in version 3.7.

@end deffn

@geindex RWF_APPEND (os 모듈)
@anchor{library/os os RWF_APPEND}@anchor{1d2a}
@deffn {데이터} os.RWF_APPEND

Provide a per-write equivalent of the @ref{306e,,O_APPEND} @ref{f91,,os.open()}
flag. This flag is meaningful only for @ref{d56,,os.pwritev()}, and its
effect applies only to the data range written by the system call. The
`offset' argument does not affect the write operation; the data is always
appended to the end of the file. However, if the `offset' argument is
@code{-1}, the current file `offset' is updated.

@ref{213c,,가용성}: Linux >= 4.16.


Added in version 3.10.

@end deffn

@geindex read() (os 모듈)
@anchor{library/os os read}@anchor{f94}
@deffn {함수} os.read (fd, n, /)

파일 기술자 `fd'에서 최대 `n' 바이트를 읽습니다.

읽어 들인 바이트를 포함하는 바이트열을 돌려줍니다. `fd' 에 의해 참조된 파일의 끝에 도달하면, 빈 바이트열 객체가 반환됩니다.

@cartouche
@quotation 참고 
This function is intended for low-level I/O and must be applied to a file
descriptor as returned by @ref{f91,,os.open()} or @ref{1b62,,pipe()}.  To read a
“file object” returned by the built-in function @ref{316,,open()} or by
@ref{31a,,popen()} or @ref{237d,,fdopen()}, or @ref{75e,,sys.stdin}, use its
@ref{206a,,read()} or @ref{152e,,readline()} methods.
@end quotation
@end cartouche


버전 3.5에서 변경: 시스템 호출이 인터럽트 되고 시그널 처리기가 예외를 발생시키지 않으면, 함수는 이제 @ref{f87,,InterruptedError} 예외를 일으키는 대신 시스템 호출을 재시도합니다 (이유는 
@geindex Python 향상 제안; PEP 475
PEP 475@footnote{https://peps.python.org/pep-0475/}를 참조하세요).

@end deffn

@geindex readinto() (os 모듈)
@anchor{library/os os readinto}@anchor{25f}
@deffn {함수} os.readinto (fd, buffer, /)

Read from a file descriptor `fd' into a mutable
@ref{260,,buffer object} `buffer'.

The `buffer' should be mutable and @ref{193,,bytes-like}. On
success, returns the number of bytes read. Less bytes may be read than the
size of the buffer. The underlying system call will be retried when
interrupted by a signal, unless the signal handler raises an exception.
Other errors will not be retried and an error will be raised.

Returns 0 if `fd' is at end of file or if the provided `buffer' has
length 0 (which can be used to check for errors without reading data).
Never returns negative.

@cartouche
@quotation 참고 
This function is intended for low-level I/O and must be applied to a file
descriptor as returned by @ref{f91,,os.open()} or @ref{1b62,,os.pipe()}.  To read a
“file object” returned by the built-in function @ref{316,,open()}, or
@ref{75e,,sys.stdin}, use its member functions, for example
@ref{1897,,io.BufferedIOBase.readinto()}, @ref{152d,,io.BufferedIOBase.read()}, or
@ref{206a,,io.TextIOBase.read()}
@end quotation
@end cartouche


Added in version 3.14.

@end deffn

@geindex sendfile() (os 모듈)
@anchor{library/os os sendfile}@anchor{d04}
@deffn {함수} os.sendfile (out_fd, in_fd, offset, count)

@deffnx {함수} os.sendfile (out_fd, in_fd, offset, count, headers=(), trailers=(), flags=0)

파일 기술자 `in_fd'에서 파일 기술자 `out_fd' 로 `offset'에서 시작하여 `count' 바이트를 복사합니다. 전송된 바이트 수를 반환합니다. EOF에 도달하면 @code{0}을 반환합니다.

첫 번째 함수 서명은 @ref{d04,,sendfile()}를 정의하는 모든 플랫폼에서 지원됩니다.

리눅스에서, `offset'이 @code{None}으로 주어지면, `in_fd'의 현재 위치에서 바이트를 읽고 `in_fd'의 위치가 갱신됩니다.

The second case may be used on macOS and FreeBSD where `headers' and
`trailers' are arbitrary sequences of buffers that are written before and
after the data from `in_fd' is written. It returns the same as the first case.

On macOS and FreeBSD, a value of @code{0} for `count' specifies to send until
the end of `in_fd' is reached.

모든 플랫폼은 `out_fd' 파일 기술자로 소켓을 지원하고, 일부 플랫폼은 다른 유형(예를 들어 일반 파일, 파이프)들도 허락합니다.

이기종 플랫폼 응용 프로그램은 `headers', `trailers' 및 `flags' 인자를 사용해서는 안 됩니다.

@ref{213c,,가용성}: Unix, not WASI.

@cartouche
@quotation 참고 
@ref{d04,,sendfile()}의 고수준 래퍼는, @ref{105c,,socket.socket.sendfile()}을 보십시오.
@end quotation
@end cartouche


Added in version 3.3.



버전 3.9에서 변경: 매개 변수 `out'과 `in'의 이름이 `out_fd'와 `in_fd'로 변경되었습니다.

@end deffn

@geindex SF_NODISKIO (os 모듈)
@geindex SF_MNOWAIT (os 모듈)
@geindex SF_SYNC (os 모듈)
@anchor{library/os os SF_NODISKIO}@anchor{308c}
@deffn {데이터} os.SF_NODISKIO
@anchor{library/os os SF_MNOWAIT}@anchor{308d}
@deffnx {데이터} os.SF_MNOWAIT
@anchor{library/os os SF_SYNC}@anchor{308e}
@deffnx {데이터} os.SF_SYNC

구현이 지원하는 경우, @ref{d04,,sendfile()} 함수에 대한 매개 변수입니다.

@ref{213c,,가용성}: Unix, not WASI.


Added in version 3.3.

@end deffn

@geindex SF_NOCACHE (os 모듈)
@anchor{library/os os SF_NOCACHE}@anchor{308f}
@deffn {데이터} os.SF_NOCACHE

Parameter to the @ref{d04,,sendfile()} function, if the implementation supports
it. The data won’t be cached in the virtual memory and will be freed afterwards.

@ref{213c,,가용성}: Unix, not WASI.


Added in version 3.11.

@end deffn

@geindex set_blocking() (os 모듈)
@anchor{library/os os set_blocking}@anchor{1039}
@deffn {함수} os.set_blocking (fd, blocking, /)

지정된 파일 기술자의 블로킹 모드를 설정합니다. blocking이 @code{False}면 @ref{103a,,O_NONBLOCK} 플래그를 설정하고, 그렇지 않으면 플래그를 지웁니다.

@ref{1038,,get_blocking()}과 @ref{3063,,socket.socket.setblocking()}도 참조하십시오.

@ref{213c,,가용성}: Unix, Windows.

The function is limited on WASI, see @ref{1b68,,웹어셈블리 플랫폼} for more
information.

On Windows, this function is limited to pipes.


Added in version 3.5.



버전 3.12에서 변경: Added support for pipes on Windows.

@end deffn

@geindex splice() (os 모듈)
@anchor{library/os os splice}@anchor{a1a}
@deffn {함수} os.splice (src, dst, count, offset_src=None, offset_dst=None, flags=0)

Transfer `count' bytes from file descriptor `src', starting from offset
`offset_src', to file descriptor `dst', starting from offset `offset_dst'.

The splicing behaviour can be modified by specifying a `flags' value.
Any of the following variables may used, combined using bitwise OR
(the @code{|} operator):


@itemize *

@item 
If @ref{3090,,SPLICE_F_MOVE} is specified,
the kernel is asked to move pages instead of copying,
but pages may still be copied if the kernel cannot move the pages from the pipe.

@item 
If @ref{3091,,SPLICE_F_NONBLOCK} is specified,
the kernel is asked to not block on I/O.
This makes the splice pipe operations nonblocking,
but splice may nevertheless block because the spliced file descriptors may block.

@item 
If @ref{3092,,SPLICE_F_MORE} is specified,
it hints to the kernel that more data will be coming in a subsequent splice.
@end itemize

At least one of the file descriptors must refer to a pipe. If `offset_src'
is @code{None}, then `src' is read from the current position; respectively for
`offset_dst'. The offset associated to the file descriptor that refers to a
pipe must be @code{None}. The files pointed to by `src' and `dst' must reside in
the same filesystem, otherwise an @ref{2c0,,OSError} is raised with
@ref{17ba,,errno} set to @ref{3061,,errno.EXDEV}.

이 복사는 커널에서 사용자 공간으로 데이터를 전송한 다음 다시 커널로 전송하는 추가 비용 없이 수행됩니다. 또한, 일부 파일 시스템은 추가 최적화를 구현할 수 있습니다. 두 파일이 바이너리로 열린 것처럼 복사가 수행됩니다.

Upon successful completion, returns the number of bytes spliced to or from
the pipe. A return value of 0 means end of input. If `src' refers to a
pipe, then this means that there was no data to transfer, and it would not
make sense to block because there are no writers connected to the write end
of the pipe.


@subsubheading 더 보기


The @code{splice(2)@footnote{https://manpages.debian.org/splice(2)}} man page.


@ref{213c,,가용성}: Linux >= 2.6.17 with glibc >= 2.5


Added in version 3.10.

@end deffn

@geindex SPLICE_F_MOVE (os 모듈)
@geindex SPLICE_F_NONBLOCK (os 모듈)
@geindex SPLICE_F_MORE (os 모듈)
@anchor{library/os os SPLICE_F_MOVE}@anchor{3090}
@deffn {데이터} os.SPLICE_F_MOVE
@anchor{library/os os SPLICE_F_NONBLOCK}@anchor{3091}
@deffnx {데이터} os.SPLICE_F_NONBLOCK
@anchor{library/os os SPLICE_F_MORE}@anchor{3092}
@deffnx {데이터} os.SPLICE_F_MORE


Added in version 3.10.

@end deffn

@geindex readv() (os 모듈)
@anchor{library/os os readv}@anchor{d54}
@deffn {함수} os.readv (fd, buffers, /)

파일 기술자 `fd'에서 여러 가변 @ref{193,,바이트열류 객체} `buffers'로 읽어 들입니다. 데이터가 가득 찰 때까지 각 버퍼로 데이터를 전송한 다음 나머지 데이터를 보관하기 위해 시퀀스의 다음 버퍼로 이동합니다.

실제로 읽힌 총 바이트 수를 반환합니다. 이 값은 모든 객체의 총 용량보다 작을 수 있습니다.

운영 체제는 사용할 수 있는 버퍼 수에 한계(@ref{18ee,,sysconf()} 값 @code{'SC_IOV_MAX'})를 설정할 수 있습니다.

@ref{213c,,가용성}: Unix.


Added in version 3.3.

@end deffn

@geindex tcgetpgrp() (os 모듈)
@anchor{library/os os tcgetpgrp}@anchor{3093}
@deffn {함수} os.tcgetpgrp (fd, /)

`fd'(@ref{f91,,os.open()}에 의해 반환된 것과 같은 열린 파일 기술자)에 의해 주어진 터미널과 관련된 프로세스 그룹을 반환합니다.

@ref{213c,,가용성}: Unix, not WASI.
@end deffn

@geindex tcsetpgrp() (os 모듈)
@anchor{library/os os tcsetpgrp}@anchor{3094}
@deffn {함수} os.tcsetpgrp (fd, pg, /)

`fd'(@ref{f91,,os.open()}에 의해 반환된 것과 같은 열린 파일 기술자)에 의해 주어진 터미널과 관련된 프로세스 그룹을 `pg'로 설정합니다.

@ref{213c,,가용성}: Unix, not WASI.
@end deffn

@geindex ttyname() (os 모듈)
@anchor{library/os os ttyname}@anchor{3095}
@deffn {함수} os.ttyname (fd, /)

파일 기술자 `fd'와 관련된 터미널 장치를 나타내는 문자열을 돌려줍니다. `fd' 가 터미널 장치와 연관되어 있지 않으면, 예외가 발생합니다.

@ref{213c,,가용성}: Unix.
@end deffn

@geindex unlockpt() (os 모듈)
@anchor{library/os os unlockpt}@anchor{19ff}
@deffn {함수} os.unlockpt (fd, /)

Unlock the slave pseudo-terminal device associated with the master
pseudo-terminal device to which the file descriptor `fd' refers.
The file descriptor `fd' is not closed upon failure.

Calls the C standard library function @code{unlockpt()}.

@ref{213c,,가용성}: Unix, not WASI.


Added in version 3.13.

@end deffn

@geindex write() (os 모듈)
@anchor{library/os os write}@anchor{f9a}
@deffn {함수} os.write (fd, str, /)

`str' 바이트열을 파일 기술자 `fd' 에 씁니다.

실제로 쓴 바이트 수를 반환합니다.

@cartouche
@quotation 참고 
This function is intended for low-level I/O and must be applied to a file
descriptor as returned by @ref{f91,,os.open()} or @ref{1b62,,pipe()}.  To write a “file
object” returned by the built-in function @ref{316,,open()} or by @ref{31a,,popen()} or
@ref{237d,,fdopen()}, or @ref{ccc,,sys.stdout} or @ref{b33,,sys.stderr}, use its
@ref{2059,,write()} method.
@end quotation
@end cartouche


버전 3.5에서 변경: 시스템 호출이 인터럽트 되고 시그널 처리기가 예외를 발생시키지 않으면, 함수는 이제 @ref{f87,,InterruptedError} 예외를 일으키는 대신 시스템 호출을 재시도합니다 (이유는 
@geindex Python 향상 제안; PEP 475
PEP 475@footnote{https://peps.python.org/pep-0475/}를 참조하세요).

@end deffn

@geindex writev() (os 모듈)
@anchor{library/os os writev}@anchor{d57}
@deffn {함수} os.writev (fd, buffers, /)

`buffers' 내용을 파일 기술자 `fd'에 씁니다. `buffers' 는 @ref{193,,바이트열류 객체}의 시퀀스 여야 합니다. 버퍼는 배열 순서로 처리됩니다. 첫 번째 버퍼의 전체 내용은 두 번째 버퍼로 진행하기 전에 기록되고, 같은 식으로 계속 진행합니다.

실제로 쓴 총 바이트 수를 반환합니다.

운영 체제는 사용할 수 있는 버퍼 수에 한계(@ref{18ee,,sysconf()} 값 @code{'SC_IOV_MAX'})를 설정할 수 있습니다.

@ref{213c,,가용성}: Unix.


Added in version 3.3.

@end deffn

@menu
* 터미널의 크기 조회하기:: 
* 파일 기술자의 상속:: 

@end menu

@node 터미널의 크기 조회하기,파일 기술자의 상속,,파일 기술자 연산
@anchor{library/os querying-the-size-of-a-terminal}@anchor{3096}@anchor{library/os terminal-size}@anchor{3097}
@subsubsection 터미널의 크기 조회하기



Added in version 3.3.


@geindex get_terminal_size() (os 모듈)
@anchor{library/os os get_terminal_size}@anchor{1307}
@deffn {함수} os.get_terminal_size (fd=STDOUT_FILENO, /)

터미널 창의 크기를 @code{(columns, lines)} 로 반환하는데, @ref{2d23,,terminal_size} 형의 튜플입니다.

선택적 인자 @code{fd}(기본값 @code{STDOUT_FILENO}, 즉 표준 출력)는 조회할 파일 기술자를 지정합니다.

파일 기술자가 터미널에 연결되어 있지 않으면, @ref{2c0,,OSError}가 발생합니다.

@ref{1308,,shutil.get_terminal_size()}가 일반적으로 사용해야 하는 고수준 함수이며, @code{os.get_terminal_size}는 저수준 구현입니다.

@ref{213c,,가용성}: Unix, Windows.
@end deffn

@geindex terminal_size (os 클래스)
@anchor{library/os os terminal_size}@anchor{2d23}
@deffn {클래스} os.terminal_size

터미널 창 크기 @code{(columns, lines)}를 저장하는 튜플의 서브 클래스.

@geindex columns (os.terminal_size의 속성)
@anchor{library/os os terminal_size columns}@anchor{3098}
@deffn {속성} columns

문자 단위의 터미널 창의 너비.
@end deffn

@geindex lines (os.terminal_size의 속성)
@anchor{library/os os terminal_size lines}@anchor{3099}
@deffn {속성} lines

문자 단위의 터미널 창의 높이.
@end deffn
@end deffn

@node 파일 기술자의 상속,,터미널의 크기 조회하기,파일 기술자 연산
@anchor{library/os fd-inheritance}@anchor{10fb}@anchor{library/os inheritance-of-file-descriptors}@anchor{309a}
@subsubsection 파일 기술자의 상속



Added in version 3.4.


파일 기술자는 자식 프로세스가 파일 기술자를 상속받을 수 있는지를 나타내는 “상속 가능” 플래그를 가지고 있습니다. 파이썬 3.4부터, 파이썬에 의해 생성된 파일 기술자는 기본적으로 상속 불가능합니다.

On UNIX, non-inheritable file descriptors are closed in child processes at the
execution of a new program, other file descriptors are inherited. Note that
non-inheritable file descriptors are still `inherited' by child processes on @ref{4b6,,os.fork()}.

윈도우에서는, 항상 상속되는 표준 스트림(파일 기술자 0, 1, 2: stdin, stdout, stderr)을 제외하고, 상속 불가능한 핸들 및 파일 기술자는 자식 프로세스에서 닫힙니다. @ref{31b,,spawn*} 함수를 사용하면, 상속 가능한 모든 핸들과 상속 가능한 모든 파일 기술자가 상속됩니다. @ref{dc,,subprocess} 모듈을 사용하면, 표준 스트림을 제외한 모든 파일 기술자가 닫히고, 상속 가능한 핸들은 `close_fds' 매개 변수가 @code{False} 일 때만 상속됩니다.

On WebAssembly platforms, the file descriptor cannot be modified.

@geindex get_inheritable() (os 모듈)
@anchor{library/os os get_inheritable}@anchor{10fc}
@deffn {함수} os.get_inheritable (fd, /)

지정된 파일 기술자의 “상속 가능” 플래그를 가져옵니다 (논릿값).
@end deffn

@geindex set_inheritable() (os 모듈)
@anchor{library/os os set_inheritable}@anchor{10fd}
@deffn {함수} os.set_inheritable (fd, inheritable, /)

지정된 파일 기술자의 “상속 가능(inheritable)” 플래그를 설정합니다.
@end deffn

@geindex get_handle_inheritable() (os 모듈)
@anchor{library/os os get_handle_inheritable}@anchor{10fe}
@deffn {함수} os.get_handle_inheritable (handle, /)

지정된 핸들의 “상속 가능” 플래그를 가져옵니다 (논릿값).

@ref{213c,,가용성}: Windows.
@end deffn

@geindex set_handle_inheritable() (os 모듈)
@anchor{library/os os set_handle_inheritable}@anchor{10ff}
@deffn {함수} os.set_handle_inheritable (handle, inheritable, /)

지정된 핸들의 “상속 가능(inheritable)” 플래그를 설정합니다.

@ref{213c,,가용성}: Windows.
@end deffn

@node 파일과 디렉터리,프로세스 관리,파일 기술자 연산,os — Miscellaneous operating system interfaces
@anchor{library/os files-and-directories}@anchor{309b}@anchor{library/os os-file-dir}@anchor{3031}
@subsubsection 파일과 디렉터리


일부 유닉스 플랫폼에서, 이 함수 중 많은 것들이 다음 기능 중 하나 이상을 지원합니다:
@anchor{library/os path-fd}@anchor{d52}

@itemize *

@item 
`specifying a file descriptor:'
Normally the `path' argument provided to functions in the @code{os} module
must be a string specifying a file path.  However, some functions now
alternatively accept an open file descriptor for their `path' argument.
The function will then operate on the file referred to by the descriptor.
For POSIX systems, Python will call the variant of the function prefixed
with @code{f} (e.g. call @code{fchdir} instead of @code{chdir}).

@ref{1302,,os.supports_fd}를 사용하여, 여러분의 플랫폼에서 특정 함수에 파일 기술자로 `path'를 지정할 수 있는지를 확인할 수 있습니다. 사용할 수 없을 때, 사용하면 @ref{36b,,NotImplementedError}를 발생시킵니다.

함수가 `dir_fd' 나 `follow_symlinks' 인자도 지원하면, `path' 에 파일 기술자를 제공할 때, 이 중 하나를 지정하는 것은 에러입니다.
@end itemize
@anchor{library/os dir-fd}@anchor{12ef}

@itemize *

@item 
`paths relative to directory descriptors:' If `dir_fd' is not @code{None}, it
should be a file descriptor referring to a directory, and the path to operate
on should be relative; path will then be relative to that directory.  If the
path is absolute, `dir_fd' is ignored.  For POSIX systems, Python will call
the variant of the function with an @code{at} suffix and possibly prefixed with
@code{f} (e.g. call @code{faccessat} instead of @code{access}).

@ref{12fc,,os.supports_dir_fd}를 사용하여, 여러분의 플랫폼에서 특정 함수에 `dir_fd'가 지원되는지를 확인할 수 있습니다. 사용할 수 없을 때, 사용하면 @ref{36b,,NotImplementedError}를 발생시킵니다.
@end itemize
@anchor{library/os follow-symlinks}@anchor{12f0}

@itemize *

@item 
`not following symlinks:' If `follow_symlinks' is
@code{False}, and the last element of the path to operate on is a symbolic link,
the function will operate on the symbolic link itself rather than the file
pointed to by the link.  For POSIX systems, Python will call the @code{l...}
variant of the function.

@ref{12fd,,os.supports_follow_symlinks}를 사용하여, 여러분의 플랫폼에서 특정 함수에 `follow_symlinks'가 지원되는지를 확인할 수 있습니다. 사용할 수 없을 때, 사용하면 @ref{36b,,NotImplementedError}를 발생시킵니다.
@end itemize

@geindex access() (os 모듈)
@anchor{library/os os access}@anchor{12f1}
@deffn {함수} os.access (path, mode, *, dir_fd=None, effective_ids=False, follow_symlinks=True)

실제(real) uid/gid를 사용해서 `path'를 액세스할 수 있는지 검사합니다. 대부분의 연산은 유효한(effective) uid/gid를 사용할 것이므로, 이 함수는 suid/sgid 환경에서 호출하는 사용자가 지정된 `path' 에 대한 액세스 권한이 있는지 검사하는데 사용할 수 있습니다. `path'가 존재하는지를 검사하려면 `mode' 는 @ref{309c,,F_OK} 여야 하며, 권한을 검사하려면 하나 이상의 @ref{309d,,R_OK}, @ref{309e,,W_OK} 및 @ref{309f,,X_OK}를 OR 값일 수 있습니다. 액세스가 허용되면 @ref{e06,,True}를 반환하고, 그렇지 않으면 @ref{d2a,,False}를 반환합니다. 더 자세한 정보는 유닉스 매뉴얼 페이지 @code{access(2)@footnote{https://manpages.debian.org/access(2)}}를 참조하십시오.

이 함수는 @ref{12ef,,디렉터리 기술자에 상대적인 경로} 와 @ref{12f0,,심볼릭 링크를 따르지 않음}을 지원할 수 있습니다.

`effective_ids' 가 @code{True}면, @ref{12f1,,access()}는 실제(real) uid/gid 대신 유효한(effective) uid/gid를 사용하여 액세스 검사를 수행합니다. `effective_ids' 는 플랫폼에서 지원되지 않을 수 있습니다; @ref{1303,,os.supports_effective_ids}를 사용하여, 사용할 수 있는지를 확인할 수 있습니다. 사용할 수 없을 때, 사용하면 @ref{36b,,NotImplementedError}를 발생시킵니다.

@cartouche
@quotation 참고 
예를 들어, 실제로 @ref{316,,open()}를 사용하여 파일을 열기 전에, @ref{12f1,,access()}를 사용하여 파일을 여는 권한이 있는지 확인하는 것은 보안 구멍을 만듭니다. 사용자가 파일을 확인하고 조작을 위해 열기 사이의 짧은 시간 간격을 악용할 수 있기 때문입니다. @ref{30a0,,EAFP} 기법을 사용하는 것이 좋습니다. 예를 들면:

@example
if os.access("myfile", os.R_OK):
    with open("myfile") as fp:
        return fp.read()
return "some default data"
@end example

는 다음과 같이 쓰는 것이 더 좋습니다:

@example
try:
    fp = open("myfile")
except PermissionError:
    return "some default data"
else:
    with fp:
        return fp.read()
@end example
@end quotation
@end cartouche

@cartouche
@quotation 참고 
@ref{12f1,,access()}가 성공할 것임을 알릴 때도, I/O 연산이 실패할 수 있습니다. 특히 일반적인 POSIX 권한 비트 모델을 넘어서는 권한 의미가 있을 수 있는 네트워크 파일 시스템에 대한 연산에서 그럴 수 있습니다.
@end quotation
@end cartouche


버전 3.3에서 변경: `dir_fd', `effective_ids' 및 `follow_symlinks' 매개 변수를 추가했습니다.



버전 3.6에서 변경: @ref{5a0,,경로류 객체}를 받아들입니다.

@end deffn

@geindex F_OK (os 모듈)
@geindex R_OK (os 모듈)
@geindex W_OK (os 모듈)
@geindex X_OK (os 모듈)
@anchor{library/os os F_OK}@anchor{309c}
@deffn {데이터} os.F_OK
@anchor{library/os os R_OK}@anchor{309d}
@deffnx {데이터} os.R_OK
@anchor{library/os os W_OK}@anchor{309e}
@deffnx {데이터} os.W_OK
@anchor{library/os os X_OK}@anchor{309f}
@deffnx {데이터} os.X_OK

`path' 의 존재 여부, 읽기 가능성, 쓰기 가능성 및 실행 가능성을 검사하기 위해, @ref{12f1,,access()}의 `mode' 매개 변수로 전달할 값입니다.
@end deffn

@geindex chdir() (os 모듈)
@anchor{library/os os chdir}@anchor{820}
@deffn {함수} os.chdir (path)

@geindex directory;changing

현재 작업 디렉터리를 `path'로 변경합니다.

이 함수는 @ref{d52,,파일 기술자 지정}을 지원할 수 있습니다. 기술자는 열려있는 파일이 아니라, 열려있는 디렉터리를 참조해야 합니다.

이 함수는 @ref{2c0,,OSError}와 @ref{264,,FileNotFoundError}, @ref{f3d,,PermissionError} 및 @ref{1259,,NotADirectoryError}와 같은 서브 클래스를 발생시킬 수 있습니다.

@code{path}를 인자로 @ref{1c6c,,감사 이벤트(auditing event)} @code{os.chdir}을 발생시킵니다.


버전 3.3에서 변경: 일부 플랫폼에서 `path' 를 파일 기술자로 지정하는 지원이 추가되었습니다.



버전 3.6에서 변경: @ref{5a0,,경로류 객체}를 받아들입니다.

@end deffn

@geindex chflags() (os 모듈)
@anchor{library/os os chflags}@anchor{12f2}
@deffn {함수} os.chflags (path, flags, *, follow_symlinks=True)

`path' 의 플래그를 숫자 `flags'로 설정합니다. `flags'는 다음 값들(@ref{d6,,stat} 모듈에 정의된 대로)의 조합(비트별 OR)을 취할 수 있습니다:


@itemize *

@item 
@ref{2cb0,,stat.UF_NODUMP}

@item 
@ref{2cb1,,stat.UF_IMMUTABLE}

@item 
@ref{2cb2,,stat.UF_APPEND}

@item 
@ref{2cb3,,stat.UF_OPAQUE}

@item 
@ref{2cb4,,stat.UF_NOUNLINK}

@item 
@ref{2cb5,,stat.UF_COMPRESSED}

@item 
@ref{2cb8,,stat.UF_HIDDEN}

@item 
@ref{2cbc,,stat.SF_ARCHIVED}

@item 
@ref{2cbd,,stat.SF_IMMUTABLE}

@item 
@ref{2cbe,,stat.SF_APPEND}

@item 
@ref{2cc0,,stat.SF_NOUNLINK}

@item 
@ref{2cc1,,stat.SF_SNAPSHOT}
@end itemize

이 함수는 @ref{12f0,,심볼릭 링크를 따르지 않음}을 지원할 수 있습니다.

@code{path}, @code{flags}를 인자로 @ref{1c6c,,감사 이벤트(auditing event)} @code{os.chflags}를 발생시킵니다.

@ref{213c,,가용성}: Unix, not WASI.


버전 3.3에서 변경: Added the `follow_symlinks' parameter.



버전 3.6에서 변경: @ref{5a0,,경로류 객체}를 받아들입니다.

@end deffn

@geindex chmod() (os 모듈)
@anchor{library/os os chmod}@anchor{529}
@deffn {함수} os.chmod (path, mode, *, dir_fd=None, follow_symlinks=True)

`path'의 모드를 숫자 `mode'로 변경합니다. `mode' 는 다음 값들(@ref{d6,,stat} 모듈에 정의된 대로)이나 이들의 비트별 OR 조합을 취할 수 있습니다:


@itemize *

@item 
@ref{2c9c,,stat.S_ISUID}

@item 
@ref{2c9d,,stat.S_ISGID}

@item 
@ref{2c9f,,stat.S_ENFMT}

@item 
@ref{2ca0,,stat.S_ISVTX}

@item 
@ref{2cac,,stat.S_IREAD}

@item 
@ref{2cad,,stat.S_IWRITE}

@item 
@ref{2cae,,stat.S_IEXEC}

@item 
@ref{2ca1,,stat.S_IRWXU}

@item 
@ref{2ca2,,stat.S_IRUSR}

@item 
@ref{2ca3,,stat.S_IWUSR}

@item 
@ref{2ca4,,stat.S_IXUSR}

@item 
@ref{2ca5,,stat.S_IRWXG}

@item 
@ref{2ca6,,stat.S_IRGRP}

@item 
@ref{2ca7,,stat.S_IWGRP}

@item 
@ref{2c9e,,stat.S_IXGRP}

@item 
@ref{2ca8,,stat.S_IRWXO}

@item 
@ref{2ca9,,stat.S_IROTH}

@item 
@ref{2caa,,stat.S_IWOTH}

@item 
@ref{2cab,,stat.S_IXOTH}
@end itemize

이 함수는 @ref{d52,,파일 기술자 지정}, @ref{12ef,,디렉터리 기술자에 상대적인 경로} 및 @ref{12f0,,심볼릭 링크를 따르지 않음}을 지원할 수 있습니다.

@cartouche
@quotation 참고 
Although Windows supports @code{chmod()}, you can only set the file’s
read-only flag with it (via the @code{stat.S_IWRITE} and @code{stat.S_IREAD}
constants or a corresponding integer value).  All other bits are ignored.
The default value of `follow_symlinks' is @code{False} on Windows.

The function is limited on WASI, see @ref{1b68,,웹어셈블리 플랫폼} for more
information.
@end quotation
@end cartouche

@code{path}, @code{mode}, @code{dir_fd}를 인자로 @ref{1c6c,,감사 이벤트(auditing event)} @code{os.chmod}를 발생시킵니다.


버전 3.3에서 변경: `path'를 열린 파일 기술자로 지정하는 지원과 `dir_fd' 및 `follow_symlinks' 인자가 추가되었습니다.



버전 3.6에서 변경: @ref{5a0,,경로류 객체}를 받아들입니다.



버전 3.13에서 변경: Added support for a file descriptor and the `follow_symlinks' argument
on Windows.

@end deffn

@geindex chown() (os 모듈)
@anchor{library/os os chown}@anchor{12f3}
@deffn {함수} os.chown (path, uid, gid, *, dir_fd=None, follow_symlinks=True)

`path' 의 소유자와 그룹 ID를 숫자 `uid' 와 `gid'로 변경합니다. ID 중 하나를 변경하지 않으려면, 그것을 -1로 설정하십시오.

이 함수는 @ref{d52,,파일 기술자 지정}, @ref{12ef,,디렉터리 기술자에 상대적인 경로} 및 @ref{12f0,,심볼릭 링크를 따르지 않음}을 지원할 수 있습니다.

숫자 ID 이외에 이름을 허용하는 고수준 함수는 @ref{548,,shutil.chown()}를 참조하십시오.

@code{path}, @code{uid}, @code{gid}, @code{dir_fd}를 인자로 @ref{1c6c,,감사 이벤트(auditing event)} @code{os.chown}을 발생시킵니다.

@ref{213c,,가용성}: Unix.

The function is limited on WASI, see @ref{1b68,,웹어셈블리 플랫폼} for more
information.


버전 3.3에서 변경: `path'를 열린 파일 기술자로 지정하는 지원과 `dir_fd' 및 `follow_symlinks' 인자가 추가되었습니다.



버전 3.6에서 변경: @ref{5a0,,경로류 객체}를 지원합니다.

@end deffn

@geindex chroot() (os 모듈)
@anchor{library/os os chroot}@anchor{1d7a}
@deffn {함수} os.chroot (path)

현재 프로세스의 루트 디렉터리를 `path'로 변경합니다.

@ref{213c,,가용성}: Unix, not WASI, not Android.


버전 3.6에서 변경: @ref{5a0,,경로류 객체}를 받아들입니다.

@end deffn

@geindex fchdir() (os 모듈)
@anchor{library/os os fchdir}@anchor{f88}
@deffn {함수} os.fchdir (fd)

현재 작업 디렉터리를 파일 기술자 `fd'가 나타내는 디렉터리로 변경합니다. 기술자는 열려있는 파일이 아니라 열려있는 디렉터리를 참조해야 합니다. 파이썬 3.3부터는, @code{os.chdir(fd)}와 같습니다.

@code{path}를 인자로 @ref{1c6c,,감사 이벤트(auditing event)} @code{os.chdir}을 발생시킵니다.

@ref{213c,,가용성}: Unix.
@end deffn

@geindex getcwd() (os 모듈)
@anchor{library/os os getcwd}@anchor{190a}
@deffn {함수} os.getcwd ()

현재 작업 디렉터리를 나타내는 문자열을 반환합니다.
@end deffn

@geindex getcwdb() (os 모듈)
@anchor{library/os os getcwdb}@anchor{c81}
@deffn {함수} os.getcwdb ()

현재 작업 디렉터리를 나타내는 바이트열을 반환합니다.


버전 3.8에서 변경: 이 함수는 이제 윈도우에서 ANSI 코드 페이지가 아닌 UTF-8 인코딩을 사용합니다: 이유는 
@geindex Python 향상 제안; PEP 529
PEP 529@footnote{https://peps.python.org/pep-0529/}를 참조하십시오. 이 함수는 윈도우에서 더는 폐지되지 않습니다.

@end deffn

@geindex lchflags() (os 모듈)
@anchor{library/os os lchflags}@anchor{30a1}
@deffn {함수} os.lchflags (path, flags)

`path' 의 플래그를, @ref{12f2,,chflags()} 처럼, 숫자 `flags'로 설정하지만, 심볼릭 링크를 따르지 않습니다. 파이썬 3.3부터는, @code{os.chflags(path, flags, follow_symlinks=False)}와 같습니다.

@code{path}, @code{flags}를 인자로 @ref{1c6c,,감사 이벤트(auditing event)} @code{os.chflags}를 발생시킵니다.

@ref{213c,,가용성}: Unix, not WASI.


버전 3.6에서 변경: @ref{5a0,,경로류 객체}를 받아들입니다.

@end deffn

@geindex lchmod() (os 모듈)
@anchor{library/os os lchmod}@anchor{528}
@deffn {함수} os.lchmod (path, mode)

`path' 모드를 숫자 `mode'로 변경합니다. path가 심볼릭 링크면, 이 함수는 타깃이 아닌 심볼릭 링크에 영향을 미칩니다. `mode'의 가능한 값은 @ref{529,,chmod()} 문서를 참조하십시오. 파이썬 3.3부터는, @code{os.chmod(path, mode, follow_symlinks=False)}와 같습니다.

@code{lchmod()} is not part of POSIX, but Unix implementations may have it if
changing the mode of symbolic links is supported.

@code{path}, @code{mode}, @code{dir_fd}를 인자로 @ref{1c6c,,감사 이벤트(auditing event)} @code{os.chmod}를 발생시킵니다.

@ref{213c,,가용성}: Unix, Windows, not Linux, FreeBSD >= 1.3, NetBSD >= 1.3, not OpenBSD


버전 3.6에서 변경: @ref{5a0,,경로류 객체}를 받아들입니다.



버전 3.13에서 변경: Added support on Windows.

@end deffn

@geindex lchown() (os 모듈)
@anchor{library/os os lchown}@anchor{30a2}
@deffn {함수} os.lchown (path, uid, gid)

`path' 의 소유자와 그룹 ID를 숫자 `uid' 와 `gid'로 변경합니다. 이 함수는 심볼릭 링크를 따르지 않습니다. 파이썬 3.3부터는, @code{os.chown(path, uid, gid, follow_symlinks=False)}와 같습니다.

@code{path}, @code{uid}, @code{gid}, @code{dir_fd}를 인자로 @ref{1c6c,,감사 이벤트(auditing event)} @code{os.chown}을 발생시킵니다.

@ref{213c,,가용성}: Unix.


버전 3.6에서 변경: @ref{5a0,,경로류 객체}를 받아들입니다.

@end deffn

@geindex link() (os 모듈)
@anchor{library/os os link}@anchor{12f4}
@deffn {함수} os.link (src, dst, *, src_dir_fd=None, dst_dir_fd=None, follow_symlinks=True)

`src'를 가리키는 `dst' 라는 이름의 하드 링크를 만듭니다.

This function can support specifying `src_dir_fd' and/or `dst_dir_fd' to
supply @ref{12ef,,paths relative to directory descriptors}, and @ref{12f0,,not following symlinks}.
The default value of `follow_symlinks' is @code{False} on Windows.

@code{src}, @code{dst}, @code{src_dir_fd}, @code{dst_dir_fd}를 인자로 @ref{1c6c,,감사 이벤트(auditing event)} @code{os.link}를 발생시킵니다.

@ref{213c,,가용성}: Unix, Windows.


버전 3.2에서 변경: 윈도우 지원이 추가되었습니다.



버전 3.3에서 변경: Added the `src_dir_fd', `dst_dir_fd', and `follow_symlinks' parameters.



버전 3.6에서 변경: `src' 및 `dst'로 @ref{5a0,,경로류 객체}를 받아들입니다.

@end deffn

@geindex listdir() (os 모듈)
@anchor{library/os os listdir}@anchor{12ff}
@deffn {함수} os.listdir (path='.')

`path'에 의해 주어진 디렉터리에 있는 항목들의 이름을 담고 있는 리스트를 반환합니다. 리스트는 임의의 순서로 나열되며, 디렉터리에 존재하더라도 특수 항목 @code{'.'} 과 @code{'..'}는 포함하지 않습니다. 이 함수 호출 중에 디렉터리에서 파일이 제거되거나 추가되면, 해당 파일의 이름이 포함되는지는 지정되지 않습니다.

`path'는 @ref{5a0,,경로류 객체} 일 수 있습니다. `path' 가 @code{bytes} 형이면 (직접 또는 @ref{e4a,,PathLike} 인터페이스를 통해 간접적으로), 반환되는 파일명도 @code{bytes} 형입니다; 다른 모든 상황에서는 형 @code{str}이 됩니다.

이 함수는 또한 @ref{d52,,파일 기술자 지정}을 지원할 수 있습니다; 파일 기술자는 디렉터리를 참조해야 합니다.

@code{path}를 인자로 @ref{1c6c,,감사 이벤트(auditing event)} @code{os.listdir}을 발생시킵니다.

@cartouche
@quotation 참고 
@code{str} 파일명을 @code{bytes}로 인코딩하려면, @ref{e4e,,fsencode()}를 사용하십시오.
@end quotation
@end cartouche


@subsubheading 더 보기


@ref{c53,,scandir()} 함수는 파일 어트리뷰트 정보와 함께 디렉터리 항목을 반환하므로, 많은 일반적인 사용 사례에서 더 나은 성능을 제공합니다.



버전 3.2에서 변경: `path' 매개 변수는 선택 사항이 되었습니다.



버전 3.3에서 변경: `path'에 열린 파일 기술자를 지정하는 지원이 추가되었습니다.



버전 3.6에서 변경: @ref{5a0,,경로류 객체}를 받아들입니다.

@end deffn

@geindex listdrives() (os 모듈)
@anchor{library/os os listdrives}@anchor{6c4}
@deffn {함수} os.listdrives ()

Return a list containing the names of drives on a Windows system.

A drive name typically looks like @code{'C:\\'}. Not every drive name
will be associated with a volume, and some may be inaccessible for
a variety of reasons, including permissions, network connectivity
or missing media. This function does not test for access.

May raise @ref{2c0,,OSError} if an error occurs collecting the drive
names.

Raises an @ref{1c6c,,auditing event} @code{os.listdrives} with no arguments.

@ref{213c,,가용성}: Windows


Added in version 3.12.

@end deffn

@geindex listmounts() (os 모듈)
@anchor{library/os os listmounts}@anchor{6c6}
@deffn {함수} os.listmounts (volume)

Return a list containing the mount points for a volume on a Windows
system.

`volume' must be represented as a GUID path, like those returned by
@ref{6c5,,os.listvolumes()}. Volumes may be mounted in multiple locations
or not at all. In the latter case, the list will be empty. Mount
points that are not associated with a volume will not be returned by
this function.

The mount points return by this function will be absolute paths, and
may be longer than the drive name.

Raises @ref{2c0,,OSError} if the volume is not recognized or if an error
occurs collecting the paths.

Raises an @ref{1c6c,,auditing event} @code{os.listmounts} with argument @code{volume}.

@ref{213c,,가용성}: Windows


Added in version 3.12.

@end deffn

@geindex listvolumes() (os 모듈)
@anchor{library/os os listvolumes}@anchor{6c5}
@deffn {함수} os.listvolumes ()

Return a list containing the volumes in the system.

Volumes are typically represented as a GUID path that looks like
@code{\\?\Volume@{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx@}\}. Files can
usually be accessed through a GUID path, permissions allowing.
However, users are generally not familiar with them, and so the
recommended use of this function is to retrieve mount points
using @ref{6c6,,os.listmounts()}.

May raise @ref{2c0,,OSError} if an error occurs collecting the volumes.

Raises an @ref{1c6c,,auditing event} @code{os.listvolumes} with no arguments.

@ref{213c,,가용성}: Windows


Added in version 3.12.

@end deffn

@geindex lstat() (os 모듈)
@anchor{library/os os lstat}@anchor{6c7}
@deffn {함수} os.lstat (path, *, dir_fd=None)

Perform the equivalent of an @code{lstat()} system call on the given path.
Similar to @ref{26d,,stat()}, but does not follow symbolic links. Return a
@ref{16c6,,stat_result} object.

심볼릭 링크를 지원하지 않는 플랫폼에서, 이 함수는 @ref{26d,,stat()}의 별칭입니다.

파이썬 3.3부터는, @code{os.stat(path, dir_fd=dir_fd, follow_symlinks=False)}와 같습니다.

이 기능은 @ref{12ef,,디렉터리 기술자에 상대적인 경로}도 지원할 수 있습니다.


@subsubheading 더 보기


@ref{26d,,stat()} 함수.



버전 3.2에서 변경: 윈도우 6.0 (Vista) 심볼릭 링크에 대한 지원이 추가되었습니다.



버전 3.3에서 변경: `dir_fd' 매개 변수가 추가되었습니다.



버전 3.6에서 변경: @ref{5a0,,경로류 객체}를 받아들입니다.



버전 3.8에서 변경: 윈도우에서, 이제 심볼릭 링크와 디렉터리 정션(directory junction)을 포함하는 다른 경로를 나타내는 재해석 지점(reparse point, 이름 서로게이트)을 엽니다. 다른 유형의 재해석 지점은 운영 체제에서 @ref{26d,,stat()}에서 처럼 결정됩니다.

@end deffn

@geindex mkdir() (os 모듈)
@anchor{library/os os mkdir}@anchor{52b}
@deffn {함수} os.mkdir (path, mode=0o777, *, dir_fd=None)

숫자 모드 `mode'로 `path' 라는 디렉터리를 만듭니다.

If the directory already exists, @ref{121f,,FileExistsError} is raised. If a parent
directory in the path does not exist, @ref{264,,FileNotFoundError} is raised.
@anchor{library/os mkdir-modebits}@anchor{30a3}
일부 시스템에서는, `mode'가 무시됩니다. 모드가 사용될 때, 현재 umask 값으로 먼저 마스킹합니다. 마지막 9비트 (즉, `mode' 의 8진 표현의 마지막 3자리 수) 이외의 비트가 설정되면, 그 의미는 플랫폼에 따라 다릅니다. 일부 플랫폼에서는, 이것들이 무시되며, 설정하려면 명시적으로 @ref{529,,chmod()}를 호출해야 합니다.

On Windows, a `mode' of @code{0o700} is specifically handled to apply access
control to the new directory such that only the current user and
administrators have access. Other values of `mode' are ignored.

이 기능은 @ref{12ef,,디렉터리 기술자에 상대적인 경로}도 지원할 수 있습니다.

임시 디렉터리를 만들 수도 있습니다; @ref{e6,,tempfile} 모듈의 @ref{52d,,tempfile.mkdtemp()} 함수를 참조하십시오.

@code{path}, @code{mode}, @code{dir_fd}를 인자로 @ref{1c6c,,감사 이벤트(auditing event)} @code{os.mkdir}을 발생시킵니다.


버전 3.3에서 변경: `dir_fd' 매개 변수가 추가되었습니다.



버전 3.6에서 변경: @ref{5a0,,경로류 객체}를 받아들입니다.



버전 3.13에서 변경: Windows now handles a `mode' of @code{0o700}.

@end deffn

@geindex makedirs() (os 모듈)
@anchor{library/os os makedirs}@anchor{52c}
@deffn {함수} os.makedirs (name, mode=0o777, exist_ok=False)

@geindex directory;creating
@geindex UNC paths;and os.makedirs()

재귀적 디렉터리 생성 함수. @ref{52b,,mkdir()}와 비슷하지만, 말단 디렉터리를 포함하는 데 필요한 모든 중간 수준 디렉터리들을 만듭니다.

The `mode' parameter is passed to @ref{52b,,mkdir()} for creating the leaf
directory; see @ref{30a3,,the mkdir() description} for how it
is interpreted.  To set the file permission bits of any newly created parent
directories you can set the umask before invoking @code{makedirs()}.  The
file permission bits of existing parent directories are not changed.

If `exist_ok' is @code{False} (the default), a @ref{121f,,FileExistsError} is
raised if the target directory already exists.

@cartouche
@quotation 참고 
@ref{52c,,makedirs()}는 생성할 경로 요소에 @ref{30a4,,pardir}(예를 들어, 유닉스 시스템의 경우 “..”)이 포함되어 있으면 혼란해 할 수 있습니다.
@end quotation
@end cartouche

이 함수는 UNC 경로를 올바르게 처리합니다.

@code{path}, @code{mode}, @code{dir_fd}를 인자로 @ref{1c6c,,감사 이벤트(auditing event)} @code{os.mkdir}을 발생시킵니다.


버전 3.2에서 변경: Added the `exist_ok' parameter.



버전 3.4.1에서 변경: 파이썬 3.4.1 이전에는, `exist_ok' 가 @code{True}이고 디렉터리가 존재한다면, `mode' 가 기존 디렉터리의 모드와 일치하지 않을 때, @ref{52c,,makedirs()}는 여전히 에러를 발생시킵니다. 이 동작은 안전하게 구현할 수 없으므로, 파이썬 3.4.1에서 제거되었습니다. bpo-21082@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=21082}를 참조하십시오.



버전 3.6에서 변경: @ref{5a0,,경로류 객체}를 받아들입니다.



버전 3.7에서 변경: The `mode' argument no longer affects the file permission bits of
newly created intermediate-level directories.

@end deffn

@geindex mkfifo() (os 모듈)
@anchor{library/os os mkfifo}@anchor{f8f}
@deffn {함수} os.mkfifo (path, mode=0o666, *, dir_fd=None)

숫자 모드 `mode'로 `path' 라는 이름의 FIFO(이름있는 파이프)를 만듭니다. 현재 umask 값으로 먼저 모드를 마스킹합니다.

이 기능은 @ref{12ef,,디렉터리 기술자에 상대적인 경로}도 지원할 수 있습니다.

FIFO는 일반 파일처럼 액세스할 수 있는 파이프입니다. FIFO는 삭제될 때까지 존재합니다 (예를 들어 @ref{12fa,,os.unlink()}로). 일반적으로, FIFO는 “클라이언트”와 “서버” 유형 프로세스 사이에서 랑데부로 사용됩니다: 서버는 FIFO를 읽기 용도로 열고, 클라이언트는 쓰기 용도로 엽니다. @ref{f8f,,mkfifo()}가 FIFO를 열지는 않는다는 점에 유의하십시오 — 단지 랑데부 포인트를 생성합니다.

@ref{213c,,가용성}: Unix, not WASI.


버전 3.3에서 변경: `dir_fd' 매개 변수가 추가되었습니다.



버전 3.6에서 변경: @ref{5a0,,경로류 객체}를 받아들입니다.

@end deffn

@geindex mknod() (os 모듈)
@anchor{library/os os mknod}@anchor{f90}
@deffn {함수} os.mknod (path, mode=0o600, device=0, *, dir_fd=None)

`path' 라는 이름의 파일 시스템 노드(파일, 장치 특수 파일 또는 이름있는 파이프)를 만듭니다. `mode' 는 사용 권한과 생성될 노드의 유형을 모두 지정하며, @code{stat.S_IFREG}, @code{stat.S_IFCHR}, @code{stat.S_IFBLK} 및 @code{stat.S_IFIFO} 중 하나와 결합(비트별 OR)합니다 (이 상수들은 @ref{d6,,stat}에 있습니다). @code{stat.S_IFCHR}와 @code{stat.S_IFBLK}의 경우, `device' 는 새로 만들어지는 장치 특수 파일(아마도 @ref{1961,,os.makedev()}를 사용해서)을 정의합니다, 그렇지 않으면 무시됩니다.

이 기능은 @ref{12ef,,디렉터리 기술자에 상대적인 경로}도 지원할 수 있습니다.

@ref{213c,,가용성}: Unix, not WASI.


버전 3.3에서 변경: `dir_fd' 매개 변수가 추가되었습니다.



버전 3.6에서 변경: @ref{5a0,,경로류 객체}를 받아들입니다.

@end deffn

@geindex major() (os 모듈)
@anchor{library/os os major}@anchor{195f}
@deffn {함수} os.major (device, /)

Extract the device major number from a raw device number (usually the
@code{st_dev} or @code{st_rdev} field from @code{stat}).
@end deffn

@geindex minor() (os 모듈)
@anchor{library/os os minor}@anchor{1960}
@deffn {함수} os.minor (device, /)

Extract the device minor number from a raw device number (usually the
@code{st_dev} or @code{st_rdev} field from @code{stat}).
@end deffn

@geindex makedev() (os 모듈)
@anchor{library/os os makedev}@anchor{1961}
@deffn {함수} os.makedev (major, minor, /)

주 장치 번호와 부 장치 번호로 원시 장치 번호를 조립합니다.
@end deffn

@geindex pathconf() (os 모듈)
@anchor{library/os os pathconf}@anchor{1300}
@deffn {함수} os.pathconf (path, name)

이름있는 파일과 관련된 시스템 구성 정보를 반환합니다. `name' 은 조회할 구성 값을 지정합니다; 정의된 시스템 값의 이름인 문자열일 수 있습니다; 이 이름은 여러 표준(POSIX.1, 유닉스 95, 유닉스 98 및 기타)에서 지정됩니다. 일부 플랫폼은 추가적인 이름도 정의합니다. 호스트 운영 체제에 알려진 이름은 @code{pathconf_names} 딕셔너리에서 제공됩니다. 이 매핑에 포함되지 않은 구성 변수를 위해, `name'에 정수를 전달하는 것도 허용됩니다.

`name' 이 문자열이고 알 수 없으면, @ref{2ec,,ValueError}가 발생합니다. `name'에 대한 특정 값이 호스트 시스템에서 지원되지 않으면, @code{pathconf_names}에 포함되어 있어도, 에러 번호가 @ref{1dcf,,errno.EINVAL}인 @ref{2c0,,OSError}가 발생합니다.

이 함수는 @ref{d52,,파일 기술자 지정}을 지원할 수 있습니다.

@ref{213c,,가용성}: Unix.


버전 3.6에서 변경: @ref{5a0,,경로류 객체}를 받아들입니다.

@end deffn

@geindex pathconf_names (os 모듈)
@anchor{library/os os pathconf_names}@anchor{30a5}
@deffn {데이터} os.pathconf_names

@ref{1300,,pathconf()}와 @ref{3062,,fpathconf()}가 받아들이는 이름을 호스트 운영 체제에서 해당 이름에 대해 정의된 정숫값으로 매핑하는 딕셔너리. 이것은 시스템에 알려진 이름 집합을 판별하는 데 사용될 수 있습니다.

@ref{213c,,가용성}: Unix.
@end deffn

@geindex readlink() (os 모듈)
@anchor{library/os os readlink}@anchor{b19}
@deffn {함수} os.readlink (path, *, dir_fd=None)

심볼릭 링크가 가리키는 경로를 나타내는 문자열을 반환합니다. 결과는 절대 또는 상대 경로명일 수 있습니다; 상대 경로이면 @code{os.path.join(os.path.dirname(path), result)}를 사용하여 절대 경로명으로 변환할 수 있습니다.

`path' 가 (직접 또는 @ref{e4a,,PathLike} 인터페이스를 통해 간접적으로) 문자열 객체면, 결과도 문자열 객체가 되고, 호출은 UnicodeDecodeError를 발생시킬 수 있습니다. `path' 가 (직접 또는 간접적으로) 바이트열 객체면, 결과는 바이트열 객체가 됩니다.

이 기능은 @ref{12ef,,디렉터리 기술자에 상대적인 경로}도 지원할 수 있습니다.

링크를 포함할 수 있는 경로를 결정(resolve)하려고 할 때, @ref{262,,realpath()}를 사용하여 재귀와 플랫폼 차이를 올바르게 처리하십시오.

@ref{213c,,가용성}: Unix, Windows.


버전 3.2에서 변경: 윈도우 6.0 (Vista) 심볼릭 링크에 대한 지원이 추가되었습니다.



버전 3.3에서 변경: `dir_fd' 매개 변수가 추가되었습니다.



버전 3.6에서 변경: 유닉스에서 @ref{5a0,,경로류 객체}를 받아들입니다.



버전 3.8에서 변경: 윈도우에서 @ref{5a0,,경로류 객체}와 바이트열 객체를 받아들입니다.

디렉터리 정션(directory junction)에 대한 지원이 추가되었고, 이전에 반환되던 선택적 “print name” 필드 대신 치환 경로(일반적으로 @code{\\?\} 접두사를 포함합니다)를 반환하도록 변경되었습니다.

@end deffn

@geindex remove() (os 모듈)
@anchor{library/os os remove}@anchor{12f5}
@deffn {함수} os.remove (path, *, dir_fd=None)

Remove (delete) the file `path'.  If `path' is a directory, an
@ref{2c0,,OSError} is raised.  Use @ref{12f8,,rmdir()} to remove directories.
If the file does not exist, a @ref{264,,FileNotFoundError} is raised.

이 함수는 @ref{12ef,,디렉터리 기술자에 상대적인 경로}를 지원할 수 있습니다.

윈도우에서, 사용 중인 파일을 제거하려고 시도하면 예외가 발생합니다; 유닉스에서는 디렉터리 항목이 제거되지만, 원본 파일이 더는 사용되지 않을 때까지 파일에 할당된 저장 공간을 사용할 수 없습니다.

이 함수는 의미 적으로 @ref{12fa,,unlink()}와 같습니다.

@code{path}, @code{dir_fd}를 인자로 @ref{1c6c,,감사 이벤트(auditing event)} @code{os.remove}를 발생시킵니다.


버전 3.3에서 변경: `dir_fd' 매개 변수가 추가되었습니다.



버전 3.6에서 변경: @ref{5a0,,경로류 객체}를 받아들입니다.

@end deffn

@geindex removedirs() (os 모듈)
@anchor{library/os os removedirs}@anchor{30a6}
@deffn {함수} os.removedirs (name)

@geindex directory;deleting

재귀적으로 디렉터리를 제거합니다. @ref{12f8,,rmdir()} 처럼 동작하는데 다음과 같은 차이가 있습니다. 말단 디렉터리가 성공적으로 제거되면, @ref{30a6,,removedirs()}는 에러가 발생할 때까지 `path'에 언급된 모든 상위 디렉터리를 연속적으로 제거하려고 합니다 (에러는 무시되는데, 이는 일반적으로 부모 디렉터리가 비어 있음을 뜻하기 때문입니다). 예를 들어, @code{os.removedirs('foo/bar/baz')}는 먼저 @code{'foo/bar/baz'} 디렉터리를 제거한 다음, @code{'foo/bar'} 및 @code{'foo'}가 비어 있으면 제거합니다. 말단 디렉터리를 성공적으로 제거할 수 없으면, @ref{2c0,,OSError}를 발생시킵니다.

@code{path}, @code{dir_fd}를 인자로 @ref{1c6c,,감사 이벤트(auditing event)} @code{os.remove}를 발생시킵니다.


버전 3.6에서 변경: @ref{5a0,,경로류 객체}를 받아들입니다.

@end deffn

@geindex rename() (os 모듈)
@anchor{library/os os rename}@anchor{12f6}
@deffn {함수} os.rename (src, dst, *, src_dir_fd=None, dst_dir_fd=None)

파일 또는 디렉터리 `src'의 이름을 `dst'로 바꿉니다. `dst'가 존재하면, 많은 경우에 @ref{2c0,,OSError} 서브 클래스로 연산이 실패합니다:

On Windows, if `dst' exists a @ref{121f,,FileExistsError} is always raised.
The operation may fail if `src' and `dst' are on different filesystems. Use
@ref{c50,,shutil.move()} to support moves to a different filesystem.

On Unix, if `src' is a file and `dst' is a directory or vice-versa, an
@ref{1258,,IsADirectoryError} or a @ref{1259,,NotADirectoryError} will be raised
respectively.  If both are directories and `dst' is empty, `dst' will be
silently replaced.  If `dst' is a non-empty directory, an @ref{2c0,,OSError}
is raised. If both are files, `dst' will be replaced silently if the user
has permission.  The operation may fail on some Unix flavors if `src' and
`dst' are on different filesystems.  If successful, the renaming will be an
atomic operation (this is a POSIX requirement).

이 함수는 @ref{12ef,,디렉터리 기술자에 상대적인 경로}를 제공하도록 `src_dir_fd' 와/나 `dst_dir_fd' 를 지정하는 것을 지원할 수 있습니다.

플랫폼에 무관하게 대상을 덮어쓰길 원하면, @ref{12f7,,replace()}를 사용하십시오.

@code{src}, @code{dst}, @code{src_dir_fd}, @code{dst_dir_fd}를 인자로 @ref{1c6c,,감사 이벤트(auditing event)} @code{os.rename}을 발생시킵니다.


버전 3.3에서 변경: Added the `src_dir_fd' and `dst_dir_fd' parameters.



버전 3.6에서 변경: `src' 및 `dst'로 @ref{5a0,,경로류 객체}를 받아들입니다.

@end deffn

@geindex renames() (os 모듈)
@anchor{library/os os renames}@anchor{30a7}
@deffn {함수} os.renames (old, new)

재귀적 디렉터리 또는 파일 이름 바꾸기 함수. @ref{12f6,,rename()}처럼 작동하지만, 새 경로명이 유효하도록 만들기 위해 먼저 필요한 중간 디렉터리를 만드는 점이 다릅니다. 이름을 변경한 후에는, 이전 이름의 가장 오른쪽 경로 세그먼트에 해당하는 디렉터리를 @ref{30a6,,removedirs()}를 사용하여 제거합니다.

@cartouche
@quotation 참고 
이 함수는 말단 디렉터리나 파일을 제거하는 데 필요한 권한이 없을 때, 새 디렉터리 구조를 만든 상태에서 실패할 수 있습니다.
@end quotation
@end cartouche

@code{src}, @code{dst}, @code{src_dir_fd}, @code{dst_dir_fd}를 인자로 @ref{1c6c,,감사 이벤트(auditing event)} @code{os.rename}을 발생시킵니다.


버전 3.6에서 변경: `old' 와 `new' 에 @ref{5a0,,경로류 객체}를 받아들입니다.

@end deffn

@geindex replace() (os 모듈)
@anchor{library/os os replace}@anchor{12f7}
@deffn {함수} os.replace (src, dst, *, src_dir_fd=None, dst_dir_fd=None)

Rename the file or directory `src' to `dst'.  If `dst' is a non-empty directory,
@ref{2c0,,OSError} will be raised.  If `dst' exists and is a file, it will
be replaced silently if the user has permission.  The operation may fail
if `src' and `dst' are on different filesystems.  If successful,
the renaming will be an atomic operation (this is a POSIX requirement).

이 함수는 @ref{12ef,,디렉터리 기술자에 상대적인 경로}를 제공하도록 `src_dir_fd' 와/나 `dst_dir_fd' 를 지정하는 것을 지원할 수 있습니다.

@code{src}, @code{dst}, @code{src_dir_fd}, @code{dst_dir_fd}를 인자로 @ref{1c6c,,감사 이벤트(auditing event)} @code{os.rename}을 발생시킵니다.


Added in version 3.3.



버전 3.6에서 변경: `src' 및 `dst'로 @ref{5a0,,경로류 객체}를 받아들입니다.

@end deffn

@geindex rmdir() (os 모듈)
@anchor{library/os os rmdir}@anchor{12f8}
@deffn {함수} os.rmdir (path, *, dir_fd=None)

Remove (delete) the directory `path'.  If the directory does not exist or is
not empty, a @ref{264,,FileNotFoundError} or an @ref{2c0,,OSError} is raised
respectively.  In order to remove whole directory trees,
@ref{356,,shutil.rmtree()} can be used.

이 함수는 @ref{12ef,,디렉터리 기술자에 상대적인 경로}를 지원할 수 있습니다.

@code{path}, @code{dir_fd}를 인자로 @ref{1c6c,,감사 이벤트(auditing event)} @code{os.rmdir}을 발생시킵니다.


버전 3.3에서 변경: `dir_fd' 매개 변수가 추가되었습니다.



버전 3.6에서 변경: @ref{5a0,,경로류 객체}를 받아들입니다.

@end deffn

@geindex scandir() (os 모듈)
@anchor{library/os os scandir}@anchor{c53}
@deffn {함수} os.scandir (path='.')

`path'로 지정된 디렉터리 내의 항목에 대응하는 @ref{6c2,,os.DirEntry} 객체의 이터레이터를 돌려줍니다. 항목은 임의의 순서로 제공되며, 특수 항목 @code{'.'} 및 @code{'..'}는 포함되지 않습니다. 이터레이터를 만든 후에 디렉터리에서 파일이 제거되거나 추가되면, 해당 파일의 항목이 포함되는지는 지정되지 않습니다.

@ref{12ff,,listdir()} 대신 @ref{c53,,scandir()}를 사용하면, 디렉터리를 검색할 때 운영 체제가 제공한다면 @ref{6c2,,os.DirEntry} 객체가 파일 유형과 파일 어트리뷰트 정보를 제공하기 때문에, 이것들이 필요한 코드의 성능을 크게 개선할 수 있습니다. 모든 @code{os.DirEntry} 메서드가 시스템 호출을 수행할 수 있지만, 일반적으로 @ref{30a8,,is_dir()} 및 @ref{f83,,is_file()}는 심볼릭 링크에 대해서만 시스템 호출을 요구합니다; @ref{1a6b,,os.DirEntry.stat()}는 유닉스에서 항상 시스템 호출을 요구하지만 윈도우에서는 심볼릭 링크에 대해서만 시스템 호출을 요구합니다.

`path' 는 @ref{5a0,,경로류 객체} 일 수 있습니다. `path' 가 (직접 또는 @ref{e4a,,PathLike} 인터페이스를 통해 간접적으로) @code{bytes} 형이면, 각 @ref{6c2,,os.DirEntry}의 @ref{30a9,,name} 및 @ref{19f8,,path} 어트리뷰트의 형은 @code{bytes}입니다. 다른 모든 상황에서는 형 @code{str}이 됩니다.

이 함수는 또한 @ref{d52,,파일 기술자 지정}을 지원할 수 있습니다; 파일 기술자는 디렉터리를 참조해야 합니다.

@code{path}를 인자로 @ref{1c6c,,감사 이벤트(auditing event)} @code{os.scandir}을 발생시킵니다.

@ref{c53,,scandir()} 이터레이터는 @ref{1e1,,컨텍스트 관리자} 프로토콜을 지원하고 다음과 같은 메서드를 제공합니다:

@geindex close() (os.scandir 메서드)
@anchor{library/os os scandir close}@anchor{eb7}
@deffn {메서드} scandir.close ()

이터레이터를 닫고 확보한 자원을 반납합니다.

이터레이터가 소진되거나 가비지 수집될 때 또는 이터레이션 중에 에러가 발생하면 자동으로 호출됩니다. 하지만 명시적으로 호출하거나 @ref{186,,with} 문을 사용하는 것이 좋습니다.


Added in version 3.6.

@end deffn

다음 예제는 주어진 `path'의 @code{'.'}로 시작하지 않는 모든 파일(디렉터리 제외)을 표시하기 위한 @ref{c53,,scandir()}의 간단한 사용을 보여줍니다. @code{entry.is_file()} 호출은 일반적으로 추가 시스템 호출을 하지 않습니다:

@example
with os.scandir(path) as it:
    for entry in it:
        if not entry.name.startswith('.') and entry.is_file():
            print(entry.name)
@end example

@cartouche
@quotation 참고 
On Unix-based systems, @ref{c53,,scandir()} uses the system’s
opendir()@footnote{https://pubs.opengroup.org/onlinepubs/009695399/functions/opendir.html}
and
readdir()@footnote{https://pubs.opengroup.org/onlinepubs/009695399/functions/readdir_r.html}
functions. On Windows, it uses the Win32
FindFirstFileW@footnote{https://msdn.microsoft.com/en-us/library/windows/desktop/aa364418(v=vs.85).aspx}
and
FindNextFileW@footnote{https://msdn.microsoft.com/en-us/library/windows/desktop/aa364428(v=vs.85).aspx}
functions.
@end quotation
@end cartouche


Added in version 3.5.



버전 3.6에서 변경: Added support for the @ref{1e1,,context manager} protocol and the
@ref{eb7,,close()} method.  If a @ref{c53,,scandir()} iterator is neither
exhausted nor explicitly closed a @ref{54e,,ResourceWarning} will be emitted
in its destructor.

이 함수는 @ref{5a0,,경로류 객체}를 받아들입니다.



버전 3.7에서 변경: 유닉스에서 @ref{d52,,파일 기술자}에 대한 지원이 추가되었습니다.

@end deffn

@geindex DirEntry (os 클래스)
@anchor{library/os os DirEntry}@anchor{6c2}
@deffn {클래스} os.DirEntry

디렉터리 항목의 파일 경로와 다른 파일 어트리뷰트를 노출하기 위해 @ref{c53,,scandir()}에 의해 산출되는 객체.

@ref{c53,,scandir()}는 추가 시스템 호출 없이 가능한 많은 정보를 제공합니다. @code{stat()} 또는 @code{lstat()} 시스템 호출이 이루어지면, @code{os.DirEntry} 객체는 결과를 캐시 합니다.

@code{os.DirEntry} 인스턴스는 수명이 긴 데이터 구조에 저장하는 용도가 아닙니다; 파일 메타 데이터가 변경되었거나 @ref{c53,,scandir()}를 호출한 후 오랜 시간이 지났음을 안다면, @code{os.stat(entry.path)}를 호출하여 최신 정보를 가져오십시오.

@code{os.DirEntry} 메서드는 운영 체제 시스템 호출을 할 수 있으므로, @ref{2c0,,OSError}를 일으킬 수도 있습니다. 에러에 대해 매우 세부적인 제어가 필요하면, @code{os.DirEntry} 메서드 중 하나를 호출할 때 @code{OSError}를 잡은 후 적절하게 처리할 수 있습니다.

@ref{5a0,,경로류 객체}로 직접 사용할 수 있도록, @code{os.DirEntry}는 @ref{e4a,,PathLike} 인터페이스를 구현합니다.

@code{os.DirEntry} 인스턴스의 어트리뷰트 및 메서드는 다음과 같습니다:

@geindex name (os.DirEntry의 속성)
@anchor{library/os os DirEntry name}@anchor{30a9}
@deffn {속성} name

@ref{c53,,scandir()} `path' 인자에 상대적인, 항목의 기본(base) 파일명.

@ref{302a,,name} 어트리뷰트는 @ref{c53,,scandir()} `path' 인자가 @code{bytes} 형이면 @code{bytes} 고, 그렇지 않으면 @code{str} 입니다. 바이트열 파일명을 디코딩하려면 @ref{e4d,,fsdecode()}를 사용하십시오.
@end deffn

@geindex path (os.DirEntry의 속성)
@anchor{library/os os DirEntry path}@anchor{19f8}
@deffn {속성} path

항목의 전체 경로명: @code{os.path.join(scandir_path, entry.name)}과 같습니다. 여기서 `scandir_path' 는 @ref{c53,,scandir()} `path' 인자입니다. 경로는 @code{scandir()} `path' 인자가 절대 경로일 때만 절대 경로입니다. @code{scandir()} `path' 인자가 @ref{d52,,파일 기술자}면, @ref{a6,,path} 어트리뷰트는 @ref{302a,,name} 어트리뷰트와 같습니다.

@ref{a6,,path} 어트리뷰트는 @ref{c53,,scandir()} `path' 인자가 @code{bytes} 형이면 @code{bytes}고, 그렇지 않으면 @code{str} 입니다. 바이트열 파일명을 디코딩하려면 @ref{e4d,,fsdecode()}를 사용하십시오.
@end deffn

@geindex inode() (os.DirEntry 메서드)
@anchor{library/os os DirEntry inode}@anchor{1a4d}
@deffn {메서드} inode ()

항목의 아이노드(inode) 번호를 반환합니다.

결과는 @code{os.DirEntry} 객체에 캐시 됩니다. 최신 정보를 가져오려면 @code{os.stat(entry.path, follow_symlinks=False).st_ino}를 사용하십시오.

최초의 캐시 되지 않은 호출에서, 윈도우 에서는 시스템 호출이 필요하지만, 유닉스에서는 그렇지 않습니다.
@end deffn

@geindex is_dir() (os.DirEntry 메서드)
@anchor{library/os os DirEntry is_dir}@anchor{30a8}
@deffn {메서드} is_dir (*, follow_symlinks=True)

이 항목이 디렉터리 또는 디렉터리를 가리키는 심볼릭 링크면 @code{True}를 반환합니다; 항목이 다른 종류의 파일이거나 다른 종류의 파일을 가리키면, 또는 더는 존재하지 않으면 @code{False}를 반환합니다.

`follow_symlinks' 가 @code{False}면, 이 항목이 디렉터리일 때만 (심볼릭 링크를 따르지 않고) @code{True}를 반환합니다; 항목이 다른 종류의 파일이거나 더는 존재하지 않으면 @code{False}를 반환합니다.

결과는 `follow_symlinks' 가 @code{True} 및 @code{False}일 때에 대해 별도로 @code{os.DirEntry} 객체에 캐시 됩니다. 최신 정보를 가져오려면, @ref{2c83,,stat.S_ISDIR()}로 @ref{26d,,os.stat()}을 호출하십시오.

최초의 캐시 되지 않은 호출에서, 대부분 시스템 호출이 필요하지 않습니다. 특히, 심볼릭 링크가 아니면, 윈도우나 유닉스 모두 시스템 호출이 필요하지 않은데, 네트워크 파일 시스템과 같이 @code{dirent.d_type == DT_UNKNOWN}를 반환하는 특정 유닉스 파일 시스템은 예외입니다. 항목이 심볼릭 링크면, `follow_symlinks' 가 @code{False}가 아닌 이상, 심볼릭 링크를 따르기 위해 시스템 호출이 필요합니다.

이 메서드는, @ref{f3d,,PermissionError}와 같은, @ref{2c0,,OSError}를 발생시킬 수 있지만, @ref{264,,FileNotFoundError}는 잡혀서 발생하지 않습니다.
@end deffn

@geindex is_file() (os.DirEntry 메서드)
@anchor{library/os os DirEntry is_file}@anchor{f83}
@deffn {메서드} is_file (*, follow_symlinks=True)

이 항목이 파일이나 파일을 가리키는 심볼릭 링크면 @code{True}를 반환합니다; 항목이 디렉터리 또는 다른 비 파일 항목이거나, 그런 것을 가리키거나, 더는 존재하지 않으면 @code{False}를 반환합니다.

`follow_symlinks' 가 @code{False}면, 이 항목이 파일일 때만 (심볼릭 링크를 따르지 않고) @code{True}를 반환합니다; 항목이 디렉터리 나 다른 비 파일 항목이거나 더는 존재하지 않으면 @code{False}를 반환합니다.

결과는 @code{os.DirEntry} 객체에 캐시 됩니다. 캐싱, 시스템 호출, 예외 발생은 @ref{30a8,,is_dir()}과 같습니다.
@end deffn

@geindex is_symlink() (os.DirEntry 메서드)
@anchor{library/os os DirEntry is_symlink}@anchor{30aa}
@deffn {메서드} is_symlink ()

이 항목이 심볼릭 링크면 (망가졌다 하더라도) @code{True}를 반환합니다; 항목이 디렉터리 나 어떤 종류의 파일이거나 더는 존재하지 않으면 @code{False}를 반환합니다.

결과는 @code{os.DirEntry} 객체에 캐시 됩니다. 최신 정보를 가져오려면 @ref{c00,,os.path.islink()}를 호출하십시오.

첫 번째, 캐시 되지 않은 호출에서는 시스템 호출이 필요하지 않습니다. 특히 윈도우 나 유닉스는 @code{dirent.d_type == DT_UNKNOWN}를 반환하는 특정 유닉스 파일 시스템 (예 : 네트워크 파일 시스템)을 제외하고는 시스템 호출이 필요하지 않습니다.

이 메서드는, @ref{f3d,,PermissionError}와 같은, @ref{2c0,,OSError}를 발생시킬 수 있지만, @ref{264,,FileNotFoundError}는 잡혀서 발생하지 않습니다.
@end deffn

@geindex is_junction() (os.DirEntry 메서드)
@anchor{library/os os DirEntry is_junction}@anchor{6c3}
@deffn {메서드} is_junction ()

Return @code{True} if this entry is a junction (even if broken);
return @code{False} if the entry points to a regular directory, any kind
of file, a symlink, or if it doesn’t exist anymore.

The result is cached on the @code{os.DirEntry} object. Call
@ref{6c9,,os.path.isjunction()} to fetch up-to-date information.


Added in version 3.12.

@end deffn

@geindex stat() (os.DirEntry 메서드)
@anchor{library/os os DirEntry stat}@anchor{1a6b}
@deffn {메서드} stat (*, follow_symlinks=True)

이 항목의 @ref{16c6,,stat_result} 객체를 돌려줍니다. 이 메서드는 기본적으로 심볼릭 링크를 따릅니다; 심볼릭 링크를 stat 하려면, @code{follow_symlinks=False} 인자를 추가하십시오.

유닉스에서, 이 메서드는 항상 시스템 호출을 요구합니다. 윈도우에서, `follow_symlinks' 가 @code{True}이고 항목이 재해석 지점(reparse point, 예를 들어, 심볼릭 링크나 디렉터리 정션(directory junction))일 때만 시스템 호출이 필요합니다.

윈도우에서, @ref{16c6,,stat_result}의 @code{st_ino}, @code{st_dev} 및 @code{st_nlink} 어트리뷰트는 항상 0으로 설정됩니다. 이러한 어트리뷰트를 얻으려면 @ref{26d,,os.stat()}을 호출하십시오.

결과는 `follow_symlinks' 가 @code{True} 및 @code{False}일 때에 대해 별도로 @code{os.DirEntry} 객체에 캐시 됩니다. 최신 정보를 가져오려면, @ref{26d,,os.stat()}을 호출하십시오.
@end deffn

Note that there is a nice correspondence between several attributes
and methods of @code{os.DirEntry} and of @ref{266,,pathlib.Path}.  In
particular, the @code{name} attribute has the same
meaning, as do the @code{is_dir()}, @code{is_file()}, @code{is_symlink()},
@code{is_junction()}, and @code{stat()} methods.


Added in version 3.5.



버전 3.6에서 변경: @ref{e4a,,PathLike} 인터페이스에 대한 지원이 추가되었습니다. 윈도우에서 @ref{192,,bytes} 경로에 대한 지원이 추가되었습니다.



버전 3.12에서 변경: The @code{st_ctime} attribute of a stat result is deprecated on Windows.
The file creation time is properly available as @code{st_birthtime}, and
in the future @code{st_ctime} may be changed to return zero or the
metadata change time, if available.

@end deffn

@geindex stat() (os 모듈)
@anchor{library/os os stat}@anchor{26d}
@deffn {함수} os.stat (path, *, dir_fd=None, follow_symlinks=True)

파일 또는 파일 기술자의 상태를 가져옵니다. 주어진 경로에 대해 @code{stat()} 시스템 호출과 같은 작업을 수행합니다. `path' 는 문자열이나 바이트열 – 직접 또는 @ref{e4a,,PathLike} 인터페이스를 통해 간접적으로 – 또는 열린 파일 기술자로 지정될 수 있습니다. @ref{16c6,,stat_result} 객체를 반환합니다.

이 함수는 일반적으로 심볼릭 링크를 따릅니다; 심볼릭 링크를 stat 하려면, 인자 @code{follow_symlinks=False}를 추가하거나 @ref{6c7,,lstat()}를 사용하십시오.

이 함수는 @ref{d52,,파일 기술자 지정} 및 @ref{12f0,,심볼릭 링크를 따르지 않음}을 지원할 수 있습니다.

윈도우에서, @code{follow_symlinks=False}를 전달하면 심볼릭 링크와 디렉터리 정션(directory junction)을 포함하는 모든 이름 서로게이트(name-surrogate) 재해석 지점(reparse point)을 따라가지 않습니다. 링크처럼 보이지 않거나 운영 체제에서 따라갈 수 없는 다른 유형의 재해석 지점은 직접 열립니다. 여러 링크 체인을 따라갈 때, 전체 탐색을 방해하는 비 링크 대신 원래 링크가 반환될 수 있습니다. 이 경우 최종 경로에 대한 stat 결과를 얻으려면, @ref{262,,os.path.realpath()} 함수를 사용하여 가능한 한 멀리 간 경로 이름을 확인한 다음 드 결과에 대해 @ref{6c7,,lstat()}을 호출하십시오. 매달린(dangling) 심볼릭 링크나 정션 지점에는 적용되지 않고, 일반적인 예외가 발생합니다.

@geindex module;stat

예:

@example
>>> import os
>>> statinfo = os.stat('somefile.txt')
>>> statinfo
os.stat_result(st_mode=33188, st_ino=7876932, st_dev=234881026,
st_nlink=1, st_uid=501, st_gid=501, st_size=264, st_atime=1297230295,
st_mtime=1297230027, st_ctime=1297230027)
>>> statinfo.st_size
264
@end example


@subsubheading 더 보기


@ref{f8b,,fstat()} 및 @ref{6c7,,lstat()} 함수.



버전 3.3에서 변경: Added the `dir_fd' and `follow_symlinks' parameters,
specifying a file descriptor instead of a path.



버전 3.6에서 변경: @ref{5a0,,경로류 객체}를 받아들입니다.



버전 3.8에서 변경: 윈도우에서, 이제 운영 체제가 결정할 수 있는 모든 재해석 지점을 따라가고, @code{follow_symlinks=False}를 전달하면 모든 이름 서로게이트 재해석 지점을 따라가지 않습니다. 운영 체제가 따라갈 수 없는 재해석 지점에 도달하면, `stat'은 이제 에러를 발생시키는 대신 @code{follow_symlinks=False}가 지정된 것처럼 원래 경로에 대한 정보를 반환합니다.

@end deffn

@geindex stat_result (os 클래스)
@anchor{library/os os stat_result}@anchor{16c6}
@deffn {클래스} os.stat_result

Object whose attributes correspond roughly to the members of the
@code{stat} structure. It is used for the result of @ref{26d,,os.stat()},
@ref{f8b,,os.fstat()} and @ref{6c7,,os.lstat()}.

어트리뷰트:

@geindex st_mode (os.stat_result의 속성)
@anchor{library/os os stat_result st_mode}@anchor{bfe}
@deffn {속성} st_mode

파일 모드: 파일 유형 및 파일 모드 비트 (사용 권한).
@end deffn

@geindex st_ino (os.stat_result의 속성)
@anchor{library/os os stat_result st_ino}@anchor{30ab}
@deffn {속성} st_ino

플랫폼에 따라 다르지만, 0이 아니면, 지정된 값의 @code{st_dev}은 파일을 고유하게 식별합니다. 일반적으로:


@itemize *

@item 
유닉스의 아이노드 번호,

@item 
윈도우의 파일 인덱스@footnote{https://msdn.microsoft.com/en-us/library/aa363788}
@end itemize
@end deffn

@geindex st_dev (os.stat_result의 속성)
@anchor{library/os os stat_result st_dev}@anchor{30ac}
@deffn {속성} st_dev

이 파일이 있는 장치의 식별자.
@end deffn

@geindex st_nlink (os.stat_result의 속성)
@anchor{library/os os stat_result st_nlink}@anchor{30ad}
@deffn {속성} st_nlink

하드 링크 수.
@end deffn

@geindex st_uid (os.stat_result의 속성)
@anchor{library/os os stat_result st_uid}@anchor{30ae}
@deffn {속성} st_uid

파일 소유자의 사용자 식별자.
@end deffn

@geindex st_gid (os.stat_result의 속성)
@anchor{library/os os stat_result st_gid}@anchor{30af}
@deffn {속성} st_gid

파일 소유자의 그룹 식별자.
@end deffn

@geindex st_size (os.stat_result의 속성)
@anchor{library/os os stat_result st_size}@anchor{30b0}
@deffn {속성} st_size

일반 파일 또는 심볼릭 링크면, 바이트 단위의 파일의 크기. 심볼릭 링크의 크기는 포함하고 있는 경로명의 길이이며, 끝나는 널 바이트는 포함하지 않습니다.
@end deffn

타임스탬프:

@geindex st_atime (os.stat_result의 속성)
@anchor{library/os os stat_result st_atime}@anchor{30b1}
@deffn {속성} st_atime

초 단위의 가장 최근의 액세스 시간.
@end deffn

@geindex st_mtime (os.stat_result의 속성)
@anchor{library/os os stat_result st_mtime}@anchor{2f3b}
@deffn {속성} st_mtime

초 단위의 가장 최근의 내용 수정 시간.
@end deffn

@geindex st_ctime (os.stat_result의 속성)
@anchor{library/os os stat_result st_ctime}@anchor{30b2}
@deffn {속성} st_ctime

Time of most recent metadata change expressed in seconds.


버전 3.12에서 변경: @code{st_ctime} is deprecated on Windows. Use @code{st_birthtime} for
the file creation time. In the future, @code{st_ctime} will contain
the time of the most recent metadata change, as for other platforms.

@end deffn

@geindex st_atime_ns (os.stat_result의 속성)
@anchor{library/os os stat_result st_atime_ns}@anchor{30b3}
@deffn {속성} st_atime_ns

나노초 정수 단위의 가장 최근의 액세스 시간.


Added in version 3.3.

@end deffn

@geindex st_mtime_ns (os.stat_result의 속성)
@anchor{library/os os stat_result st_mtime_ns}@anchor{30b4}
@deffn {속성} st_mtime_ns

나노초 정수 단위의 가장 최근의 내용 수정 시간.


Added in version 3.3.

@end deffn

@geindex st_ctime_ns (os.stat_result의 속성)
@anchor{library/os os stat_result st_ctime_ns}@anchor{30b5}
@deffn {속성} st_ctime_ns

Time of most recent metadata change expressed in nanoseconds as an
integer.


Added in version 3.3.



버전 3.12에서 변경: @code{st_ctime_ns} is deprecated on Windows. Use @code{st_birthtime_ns}
for the file creation time. In the future, @code{st_ctime} will contain
the time of the most recent metadata change, as for other platforms.

@end deffn

@geindex st_birthtime (os.stat_result의 속성)
@anchor{library/os os stat_result st_birthtime}@anchor{30b6}
@deffn {속성} st_birthtime

Time of file creation expressed in seconds. This attribute is not
always available, and may raise @ref{5ee,,AttributeError}.


버전 3.12에서 변경: @code{st_birthtime} is now available on Windows.

@end deffn

@geindex st_birthtime_ns (os.stat_result의 속성)
@anchor{library/os os stat_result st_birthtime_ns}@anchor{30b7}
@deffn {속성} st_birthtime_ns

Time of file creation expressed in nanoseconds as an integer.
This attribute is not always available, and may raise
@ref{5ee,,AttributeError}.


Added in version 3.12.

@end deffn

@cartouche
@quotation 참고 
The exact meaning and resolution of the @ref{30b1,,st_atime},
@ref{2f3b,,st_mtime}, @ref{30b2,,st_ctime} and @ref{30b6,,st_birthtime} attributes
depend on the operating system and the file system. For example, on
Windows systems using the FAT32 file systems, @code{st_mtime} has
2-second resolution, and @code{st_atime} has only 1-day resolution.
See your operating system documentation for details.

Similarly, although @ref{30b3,,st_atime_ns}, @ref{30b4,,st_mtime_ns},
@ref{30b5,,st_ctime_ns} and @ref{30b7,,st_birthtime_ns} are always expressed in
nanoseconds, many systems do not provide nanosecond precision.  On
systems that do provide nanosecond precision, the floating-point object
used to store @ref{30b1,,st_atime}, @ref{2f3b,,st_mtime}, @ref{30b2,,st_ctime} and
@ref{30b6,,st_birthtime} cannot preserve all of it, and as such will be
slightly inexact. If you need the exact timestamps you should always use
@code{st_atime_ns}, @code{st_mtime_ns}, @code{st_ctime_ns} and
@code{st_birthtime_ns}.
@end quotation
@end cartouche

(리눅스와 같은) 일부 유닉스 시스템에서는, 다음 어트리뷰트도 사용할 수 있습니다:

@geindex st_blocks (os.stat_result의 속성)
@anchor{library/os os stat_result st_blocks}@anchor{30b8}
@deffn {속성} st_blocks

파일에 할당된 512-바이트 블록 수. 파일에 구멍이 있으면 @ref{30b0,,st_size}/512보다 작을 수 있습니다.
@end deffn

@geindex st_blksize (os.stat_result의 속성)
@anchor{library/os os stat_result st_blksize}@anchor{30b9}
@deffn {속성} st_blksize

효율적인 파일 시스템 I/O를 위해 “선호되는” 블록 크기. 더 작은 크기로 파일에 기록하면 비효율적인 읽기-수정-다시 쓰기가 발생할 수 있습니다.
@end deffn

@geindex st_rdev (os.stat_result의 속성)
@anchor{library/os os stat_result st_rdev}@anchor{17c5}
@deffn {속성} st_rdev

아이노드 장치면 장치 유형.
@end deffn

@geindex st_flags (os.stat_result의 속성)
@anchor{library/os os stat_result st_flags}@anchor{30ba}
@deffn {속성} st_flags

파일에 대한 사용자 정의 플래그.
@end deffn

(FreeBSD와 같은) 다른 유닉스 시스템에서는, 다음 어트리뷰트를 사용할 수 있습니다 (그러나 root가 사용하려고 할 때만 채워질 수 있습니다):

@geindex st_gen (os.stat_result의 속성)
@anchor{library/os os stat_result st_gen}@anchor{30bb}
@deffn {속성} st_gen

파일 생성 번호.
@end deffn

Solaris 및 파생 상품에서, 다음 어트리뷰트도 사용할 수 있습니다:

@geindex st_fstype (os.stat_result의 속성)
@anchor{library/os os stat_result st_fstype}@anchor{d5a}
@deffn {속성} st_fstype

파일을 포함하는 파일 시스템의 유형을 고유하게 식별하는 문자열.
@end deffn

On macOS systems, the following attributes may also be available:

@geindex st_rsize (os.stat_result의 속성)
@anchor{library/os os stat_result st_rsize}@anchor{30bc}
@deffn {속성} st_rsize

파일의 실제 크기.
@end deffn

@geindex st_creator (os.stat_result의 속성)
@anchor{library/os os stat_result st_creator}@anchor{30bd}
@deffn {속성} st_creator

파일의 생성자.
@end deffn

@geindex st_type (os.stat_result의 속성)
@anchor{library/os os stat_result st_type}@anchor{30be}
@deffn {속성} st_type

파일 유형.
@end deffn

윈도우 시스템에서는, 다음 어트리뷰트도 사용할 수 있습니다:

@geindex st_file_attributes (os.stat_result의 속성)
@anchor{library/os os stat_result st_file_attributes}@anchor{1037}
@deffn {속성} st_file_attributes

Windows file attributes: @code{dwFileAttributes} member of the
@code{BY_HANDLE_FILE_INFORMATION} structure returned by
@code{GetFileInformationByHandle()}.
See the @code{FILE_ATTRIBUTE_* <stat.FILE_ATTRIBUTE_ARCHIVE>}
constants in the @ref{d6,,stat} module.


Added in version 3.5.

@end deffn

@geindex st_reparse_tag (os.stat_result의 속성)
@anchor{library/os os stat_result st_reparse_tag}@anchor{bff}
@deffn {속성} st_reparse_tag

When @ref{1037,,st_file_attributes} has the @ref{2cd0,,FILE_ATTRIBUTE_REPARSE_POINT}
set, this field contains the tag identifying the type of reparse point.
See the @ref{2cd5,,IO_REPARSE_TAG_*}
constants in the @ref{d6,,stat} module.
@end deffn

The standard module @ref{d6,,stat} defines functions and constants that are
useful for extracting information from a @code{stat} structure. (On
Windows, some items are filled with dummy values.)

For backward compatibility, a @code{stat_result} instance is also
accessible as a tuple of at least 10 integers giving the most important (and
portable) members of the @code{stat} structure, in the order
@ref{bfe,,st_mode}, @ref{30ab,,st_ino}, @ref{30ac,,st_dev}, @ref{30ad,,st_nlink},
@ref{30ae,,st_uid}, @ref{30af,,st_gid}, @ref{30b0,,st_size}, @ref{30b1,,st_atime},
@ref{2f3b,,st_mtime}, @ref{30b2,,st_ctime}. More items may be added at the end by
some implementations. For compatibility with older Python versions,
accessing @code{stat_result} as a tuple always returns integers.


버전 3.5에서 변경: 윈도우는 이제 사용 가능할 때 파일 인덱스를 @ref{30ab,,st_ino}로 반환합니다.



버전 3.7에서 변경: Solaris/파생 제품에 @ref{d5a,,st_fstype} 멤버를 추가했습니다.



버전 3.8에서 변경: 윈도우에서 @ref{bff,,st_reparse_tag} 멤버를 추가했습니다.



버전 3.8에서 변경: 윈도우에서, @ref{bfe,,st_mode} 멤버는 이제 특수 파일을 @code{S_IFCHR}, @code{S_IFIFO} 또는 @code{S_IFBLK}로 적절히 식별합니다.



버전 3.12에서 변경: On Windows, @ref{30b2,,st_ctime} is deprecated. Eventually, it will
contain the last metadata change time, for consistency with other
platforms, but for now still contains creation time.
Use @ref{30b6,,st_birthtime} for the creation time.

On Windows, @ref{30ab,,st_ino} may now be up to 128 bits, depending
on the file system. Previously it would not be above 64 bits, and
larger file identifiers would be arbitrarily packed.

On Windows, @ref{17c5,,st_rdev} no longer returns a value. Previously
it would contain the same as @ref{30ac,,st_dev}, which was incorrect.

Added the @ref{30b6,,st_birthtime} member on Windows.

@end deffn

@geindex statvfs() (os 모듈)
@anchor{library/os os statvfs}@anchor{1301}
@deffn {함수} os.statvfs (path)

Perform a @code{statvfs()} system call on the given path.  The return value is
an object whose attributes describe the filesystem on the given path, and
correspond to the members of the @code{statvfs} structure, namely:
@code{f_bsize}, @code{f_frsize}, @code{f_blocks}, @code{f_bfree},
@code{f_bavail}, @code{f_files}, @code{f_ffree}, @code{f_favail},
@code{f_flag}, @code{f_namemax}, @code{f_fsid}.

@code{f_flag} 어트리뷰트의 비트 플래그에 대해 두 개의 모듈 수준 상수가 정의됩니다: @code{ST_RDONLY}가 설정되면, 파일 시스템은 읽기 전용으로 마운트되었고, @code{ST_NOSUID}가 설정되면, setuid/setgid 비트의 의미가 비활성화되었거나 지원되지 않습니다.

추가적인 모듈 수준 상수가 GNU/glibc 기반 시스템에 대해 정의됩니다. 이들은 @code{ST_NODEV} (장치 특수 파일에 대한 액세스 금지), @code{ST_NOEXEC} (프로그램 실행 금지), @code{ST_SYNCHRONOUS} (한 번에 쓰기 동기화), @code{ST_MANDLOCK} (FS에 필수 잠금 허용), @code{ST_WRITE} (파일/디렉터리/심볼릭 링크 쓰기), @code{ST_APPEND} (덧붙이기 전용 파일), @code{ST_IMMUTABLE} (불변 파일), @code{ST_NOATIME} (액세스 시간을 갱신하지 않음), @code{ST_NODIRATIME} (디렉터리 액세스 시간을 갱신하지 않음), @code{ST_RELATIME} (mtime/ctime에 상대적으로 atime을 갱신).

이 함수는 @ref{d52,,파일 기술자 지정}을 지원할 수 있습니다.

@ref{213c,,가용성}: Unix.


버전 3.2에서 변경: @code{ST_RDONLY} 및 @code{ST_NOSUID} 상수가 추가되었습니다.



버전 3.3에서 변경: `path'에 열린 파일 기술자를 지정하는 지원이 추가되었습니다.



버전 3.4에서 변경: @code{ST_NODEV}, @code{ST_NOEXEC}, @code{ST_SYNCHRONOUS}, @code{ST_MANDLOCK}, @code{ST_WRITE}, @code{ST_APPEND}, @code{ST_IMMUTABLE}, @code{ST_NOATIME}, @code{ST_NODIRATIME} 및 @code{ST_RELATIME} 상수가 추가되었습니다.



버전 3.6에서 변경: @ref{5a0,,경로류 객체}를 받아들입니다.



버전 3.7에서 변경: Added the @code{f_fsid} attribute.

@end deffn

@geindex supports_dir_fd (os 모듈)
@anchor{library/os os supports_dir_fd}@anchor{12fc}
@deffn {데이터} os.supports_dir_fd

A @ref{184,,set} object indicating which functions in the @code{os}
module accept an open file descriptor for their `dir_fd' parameter.
Different platforms provide different features, and the underlying
functionality Python uses to implement the `dir_fd' parameter is not
available on all platforms Python supports.  For consistency’s sake,
functions that may support `dir_fd' always allow specifying the
parameter, but will throw an exception if the functionality is used
when it’s not locally available. (Specifying @code{None} for `dir_fd'
is always supported on all platforms.)

특정 함수가 `dir_fd' 매개 변수로 열린 파일 기술자를 받아들이는지 확인하려면, @code{supports_dir_fd}에 @code{in} 연산자를 사용하십시오. 예를 들어, 이 표현식은 로컬 플랫폼에서 @ref{26d,,os.stat()}이 `dir_fd' 매개 변수로 열린 파일 기술자를 받아들이면 @code{True}로 평가됩니다:

@example
os.stat in os.supports_dir_fd
@end example

현재 `dir_fd' 매개 변수는 유닉스 플랫폼에서만 작동합니다; 어느 것도 윈도우에서 작동하지 않습니다.


Added in version 3.3.

@end deffn

@geindex supports_effective_ids (os 모듈)
@anchor{library/os os supports_effective_ids}@anchor{1303}
@deffn {데이터} os.supports_effective_ids

@ref{12f1,,os.access()}가 로컬 플랫폼에서 `effective_ids' 매개 변수에 @code{True}를 지정하는 것을 허용하는지를 나타내는 @ref{184,,set} 객체. (`effective_ids'에 @code{False}를 지정하는 것은 모든 플랫폼에서 항상 지원됩니다.) 로컬 플랫폼이 지원하면, 컬렉션에 @code{os.access()}가 포함됩니다; 그렇지 않으면 비어있게 됩니다.

이 표현식은 로컬 플랫폼에서 @ref{12f1,,os.access()}가 @code{effective_ids=True}를 지원하면 @code{True}로 평가됩니다:

@example
os.access in os.supports_effective_ids
@end example

현재 `effective_ids' 는 유닉스 플랫폼에서만 지원됩니다; 윈도우에서는 작동하지 않습니다.


Added in version 3.3.

@end deffn

@geindex supports_fd (os 모듈)
@anchor{library/os os supports_fd}@anchor{1302}
@deffn {데이터} os.supports_fd

A @ref{184,,set} object indicating which functions in the
@code{os} module permit specifying their `path' parameter as an open file
descriptor on the local platform.  Different platforms provide different
features, and the underlying functionality Python uses to accept open file
descriptors as `path' arguments is not available on all platforms Python
supports.

특정 함수가 `path' 매개 변수에 열린 파일 기술자를 지정할 수 있도록 허용하는지를 판단하려면, @code{supports_fd}에 @code{in} 연산자를 사용하십시오. 예를 들어, 이 표현식은 로컬 플랫폼에서 @ref{820,,os.chdir()}가 `path'로 열린 파일 기술자를 받아들이면 @code{True}로 평가됩니다:

@example
os.chdir in os.supports_fd
@end example


Added in version 3.3.

@end deffn

@geindex supports_follow_symlinks (os 모듈)
@anchor{library/os os supports_follow_symlinks}@anchor{12fd}
@deffn {데이터} os.supports_follow_symlinks

A @ref{184,,set} object indicating which functions in the @code{os} module
accept @code{False} for their `follow_symlinks' parameter on the local platform.
Different platforms provide different features, and the underlying
functionality Python uses to implement `follow_symlinks' is not available
on all platforms Python supports.  For consistency’s sake, functions that
may support `follow_symlinks' always allow specifying the parameter, but
will throw an exception if the functionality is used when it’s not locally
available.  (Specifying @code{True} for `follow_symlinks' is always supported
on all platforms.)

특정 함수가 `follow_symlinks' 매개 변수로 @code{False}를 받아들이는지 확인하려면, @code{supports_follow_symlinks}에 @code{in} 연산자를 사용하십시오. 예를 들어, 이 표현식은 로컬 플랫폼에서 @ref{26d,,os.stat()}을 호출할 때 @code{follow_symlinks=False}를 지정할 수 있으면 @code{True}로 평가됩니다:

@example
os.stat in os.supports_follow_symlinks
@end example


Added in version 3.3.

@end deffn

@geindex symlink() (os 모듈)
@anchor{library/os os symlink}@anchor{12f9}
@deffn {함수} os.symlink (src, dst, target_is_directory=False, *, dir_fd=None)

`src를' 가리키는 `dst' 라는 이름의 심볼릭 링크를 만듭니다.

The `src' parameter refers to the target of the link (the file or directory being linked to),
and `dst' is the name of the link being created.

윈도우에서, 심볼릭 링크는 파일이나 디렉터리를 나타내며, 동적으로 대상에 맞춰 변형되지 않습니다. 대상이 있으면, 일치하도록 심볼릭 링크의 유형이 만들어집니다. 그렇지 않으면, `target_is_directory' 가 @code{True} 면 심볼릭 링크가 디렉터리로 만들어지고, 그렇지 않으면 파일 심볼릭 링크(기본값)가 만들어집니다. 비 윈도우 플랫폼에서는 `target_is_directory' 가 무시됩니다.

이 함수는 @ref{12ef,,디렉터리 기술자에 상대적인 경로}를 지원할 수 있습니다.

@cartouche
@quotation 참고 
최신 버전의 윈도우 10에서, 개발자 모드가 활성화되면, 권한이 없는 계정이 심볼릭 링크를 만들 수 있습니다. 개발자 모드를 사용할 수 없거나 활성화되어 있지 않으면, `SeCreateSymbolicLinkPrivilege' 권한이 필요하거나, 프로세스를 관리자로 실행해야 합니다.

권한이 없는 사용자가 함수를 호출하면 @ref{2c0,,OSError}가 발생합니다.
@end quotation
@end cartouche

@code{src}, @code{dst}, @code{dir_fd}를 인자로 @ref{1c6c,,감사 이벤트(auditing event)} @code{os.symlink}를 발생시킵니다.

@ref{213c,,가용성}: Unix, Windows.

The function is limited on WASI, see @ref{1b68,,웹어셈블리 플랫폼} for more
information.


버전 3.2에서 변경: 윈도우 6.0 (Vista) 심볼릭 링크에 대한 지원이 추가되었습니다.



버전 3.3에서 변경: Added the `dir_fd' parameter, and now allow `target_is_directory'
on non-Windows platforms.



버전 3.6에서 변경: `src' 및 `dst'로 @ref{5a0,,경로류 객체}를 받아들입니다.



버전 3.8에서 변경: 개발자 모드가 있는 윈도우에서 권한 상승 없는(unelevated) 심볼릭 링크에 대한 지원이 추가되었습니다.

@end deffn

@geindex sync() (os 모듈)
@anchor{library/os os sync}@anchor{1317}
@deffn {함수} os.sync ()

디스크에 모든 것을 쓰도록 강제합니다.

@ref{213c,,가용성}: Unix.


Added in version 3.3.

@end deffn

@geindex truncate() (os 모듈)
@anchor{library/os os truncate}@anchor{103b}
@deffn {함수} os.truncate (path, length)

최대 `length' 바이트가 되도록 `path'에 해당하는 파일을 자릅니다.

이 함수는 @ref{d52,,파일 기술자 지정}을 지원할 수 있습니다.

@code{path}, @code{length}를 인자로 @ref{1c6c,,감사 이벤트(auditing event)} @code{os.truncate}를 발생시킵니다.

@ref{213c,,가용성}: Unix, Windows.


Added in version 3.3.



버전 3.5에서 변경: 윈도우 지원 추가



버전 3.6에서 변경: @ref{5a0,,경로류 객체}를 받아들입니다.

@end deffn

@geindex unlink() (os 모듈)
@anchor{library/os os unlink}@anchor{12fa}
@deffn {함수} os.unlink (path, *, dir_fd=None)

파일 `path'를 제거(삭제)합니다. 이 함수는 의미상 @ref{12f5,,remove()}와 같습니다; @code{unlink} 라는 이름은 전통적인 유닉스 이름입니다. 자세한 내용은 @code{remove()} 설명서를 참조하십시오.

@code{path}, @code{dir_fd}를 인자로 @ref{1c6c,,감사 이벤트(auditing event)} @code{os.remove}를 발생시킵니다.


버전 3.3에서 변경: `dir_fd' 매개 변수가 추가되었습니다.



버전 3.6에서 변경: @ref{5a0,,경로류 객체}를 받아들입니다.

@end deffn

@geindex utime() (os 모듈)
@anchor{library/os os utime}@anchor{12fb}
@deffn {함수} os.utime (path, times=None, *[, ns], dir_fd=None, follow_symlinks=True)

`path'로 지정된 파일의 액세스 및 수정 시간을 설정합니다.

@ref{12fb,,utime()}은 `times' 과 `ns' 라는 두 개의 선택적 매개 변수를 취합니다. `path'에 설정할 시간을 지정하며 다음과 같이 사용됩니다:


@itemize -

@item 
`ns' 가 지정되면, @code{(atime_ns, mtime_ns)} 형식의 2-튜플이어야 하며, 각 멤버는 나노초를 나타내는 int입니다.

@item 
`times' 가 @code{None}이 아니면, @code{(atime, mtime)} 형식의 2-튜플이어야 하며, 각 멤버는 초를 나타내는 int 또는 float입니다.

@item 
`times' 가 @code{None}이고 `ns' 가 지정되지 않으면, @code{ns=(atime_ns, mtime_ns)}를 지정하는 것과 같은데, 두 시간 모두 현재 시각입니다.
@end itemize

`times' 와 `ns'에 모두 튜플을 지정하는 것은 에러입니다.

Note that the exact times you set here may not be returned by a subsequent
@ref{26d,,stat()} call, depending on the resolution with which your operating
system records access and modification times; see @code{stat()}. The best
way to preserve exact times is to use the `st_atime_ns' and `st_mtime_ns'
fields from the @code{os.stat()} result object with the `ns' parameter to
@ref{12fb,,utime()}.

이 함수는 @ref{d52,,파일 기술자 지정}, @ref{12ef,,디렉터리 기술자에 상대적인 경로} 및 @ref{12f0,,심볼릭 링크를 따르지 않음}을 지원할 수 있습니다.

@code{path}, @code{times}, @code{ns}, @code{dir_fd}를 인자로 @ref{1c6c,,감사 이벤트(auditing event)} @code{os.utime}을 발생시킵니다.


버전 3.3에서 변경: `path'에 열린 파일 기술자를 지정하는 것과 `dir_fd' , `follow_symlinks' 및 `ns' 매개 변수 지원이 추가되었습니다.



버전 3.6에서 변경: @ref{5a0,,경로류 객체}를 받아들입니다.

@end deffn

@geindex walk() (os 모듈)
@anchor{library/os os walk}@anchor{6cf}
@deffn {함수} os.walk (top, topdown=True, onerror=None, followlinks=False)

@geindex directory;walking
@geindex directory;traversal

트리를 하향식 또는 상향식으로 탐색하여 디렉터리 트리에 있는 파일명을 생성합니다. 디렉터리 `top'을 루트로 하는 트리의 디렉터리(`top' 자체를 포함합니다)마다, 3-튜플 @code{(dirpath, dirnames, filenames)}를 산출합니다.

`dirpath' is a string, the path to the directory.  `dirnames' is a list of the
names of the subdirectories in `dirpath' (including symlinks to directories,
and excluding @code{'.'} and @code{'..'}).
`filenames' is a list of the names of the non-directory files in `dirpath'.
Note that the names in the lists contain no path components.  To get a full path
(which begins with `top') to a file or directory in `dirpath', do
@code{os.path.join(dirpath, name)}.  Whether or not the lists are sorted
depends on the file system.  If a file is removed from or added to the
`dirpath' directory during generating the lists, whether a name for that
file be included is unspecified.

선택적 인자 `topdown' 이 @code{True}이거나 지정되지 않으면, 디렉터리에 대한 3-튜플은 하위 디렉터리에 대한 3-튜플이 생성되기 전에 생성됩니다 (디렉터리는 하향식으로 생성됩니다). `topdown' 이 @code{False}면, 모든 하위 디렉터리에 대한 3-튜플 다음에 디렉터리에 대한 3-튜플이 생성됩니다 (디렉터리가 상향식으로 생성됨). `topdown' 의 값에 상관없이, 디렉터리와 해당 하위 디렉터리의 튜플이 생성되기 전에 하위 디렉터리 목록이 조회됩니다.

`topdown' 이 @code{True} 일 때, 호출자는 (아마도 @ref{1b1d,,del} 또는 슬라이스 대입을 사용하여) `dirnames' 리스트를 수정할 수 있으며, @ref{6cf,,walk()}는 이름이 `dirnames' 남아있는 하위 디렉터리로만 재귀합니다; 검색을 가지치기하거나, 특정 방문 순서를 지정하거나, 심지어 @code{walk()}가 다시 시작하기 전에 호출자가 새로 만들거나 이름을 바꾼 디렉터리에 대해 @code{walk()}에 알릴 때도 사용할 수 있습니다. `topdown' 이 @code{False}일 때 `dirnames'를 수정하는 것은 walk의 동작에 영향을 주지 못하는데, 상향식 모드에서 `dirnames'의 디렉터리는 `dirpath' 자체가 생성되기 전에 생성되기 때문입니다.

기본적으로, @ref{c53,,scandir()} 호출의 에러는 무시됩니다. 선택적 인자 `onerror' 가 지정되면, 함수여야 합니다; 하나의 인자 @ref{2c0,,OSError} 인스턴스로 호출됩니다. 에러를 보고하고 walk를 계속하도록 하거나, 예외를 발생시켜 walk를 중단할 수 있습니다. 파일명은 예외 객체의 @code{filename} 어트리뷰트로 제공됩니다.

기본적으로, @ref{6cf,,walk()}는 디렉터리로 해석되는 심볼릭 링크로 이동하지 않습니다. 지원하는 시스템에서, 심볼릭 링크가 가리키는 디렉터리를 방문하려면, `followlinks'를 @code{True}로 설정하십시오.

@cartouche
@quotation 참고 
심볼릭 링크가 자신의 부모 디렉터리를 가리킬 때, `followlinks'를 @code{True}로 설정하면 무한 재귀가 발생할 수 있음에 주의해야 합니다. @ref{6cf,,walk()}는 이미 방문한 디렉터리를 추적하지 않습니다.
@end quotation
@end cartouche

@cartouche
@quotation 참고 
상대 경로명을 전달할 때는, @ref{6cf,,walk()}가 실행되는 도중 현재 작업 디렉터리를 변경하지 마십시오. @code{walk()}는 현재 디렉터리를 절대로 변경하지 않으며, 호출자도 마찬가지라고 가정합니다.
@end quotation
@end cartouche

This example displays the number of bytes taken by non-directory files in each
directory under the starting directory, except that it doesn’t look under any
@code{__pycache__} subdirectory:

@example
import os
from os.path import join, getsize
for root, dirs, files in os.walk('python/Lib/xml'):
    print(root, "consumes", end=" ")
    print(sum(getsize(join(root, name)) for name in files), end=" ")
    print("bytes in", len(files), "non-directory files")
    if '__pycache__' in dirs:
        dirs.remove('__pycache__')  # don't visit __pycache__ directories
@end example

다음 예(@ref{356,,shutil.rmtree()}의 간단한 구현)에서는, 트리를 상향식으로 탐색하는 것이 필수적입니다, @ref{12f8,,rmdir()}는 비어 있지 않은 디렉터리를 삭제할 수 없습니다:

@example
# Delete everything reachable from the directory named in "top",
# assuming there are no symbolic links.
# CAUTION:  This is dangerous!  For example, if top == '/', it
# could delete all your disk files.
import os
for root, dirs, files in os.walk(top, topdown=False):
    for name in files:
        os.remove(os.path.join(root, name))
    for name in dirs:
        os.rmdir(os.path.join(root, name))
os.rmdir(top)
@end example

@code{top}, @code{topdown}, @code{onerror}, @code{followlinks}를 인자로 @ref{1c6c,,감사 이벤트(auditing event)} @code{os.walk}를 발생시킵니다.


버전 3.5에서 변경: 이 함수는 이제 @ref{12ff,,os.listdir()} 대신 @ref{c53,,os.scandir()}를 호출하기 때문에, @ref{26d,,os.stat()} 호출 수를 줄여 더 빨라졌습니다.



버전 3.6에서 변경: @ref{5a0,,경로류 객체}를 받아들입니다.

@end deffn

@geindex fwalk() (os 모듈)
@anchor{library/os os fwalk}@anchor{d51}
@deffn {함수} os.fwalk (top='.', topdown=True, onerror=None, *, follow_symlinks=False, dir_fd=None)

@geindex directory;walking
@geindex directory;traversal

이 함수는 @ref{6cf,,walk()}와 똑같이 동작합니다. 단, 4-튜플 @code{(dirpath, dirnames, filenames, dirfd)}를 산출하고 @code{dir_fd}를 지원합니다.

`dirpath' , `dirnames' 및 `filenames' 은 @ref{6cf,,walk()} 출력과 같고, `dirfd' 는 `dirpath' 디렉터리를 가리키는 파일 기술자입니다.

이 함수는 항상 @ref{12ef,,디렉터리 기술자에 상대적인 경로} 및 @ref{12f0,,심볼릭 링크를 따르지 않음}을 지원합니다. 하지만, 다른 함수와는 달리, `follow_symlinks'에 대한 @ref{d51,,fwalk()}의 기본값은 @code{False}임에 주의하십시오.

@cartouche
@quotation 참고 
@ref{d51,,fwalk()}는 다음 이터레이션 단계까지만 유효한 파일 기술자를 산출하기 때문에, 더 오래 유지하려면 복제해야 합니다 (예를 들어, @ref{1dbf,,dup()}로).
@end quotation
@end cartouche

This example displays the number of bytes taken by non-directory files in each
directory under the starting directory, except that it doesn’t look under any
@code{__pycache__} subdirectory:

@example
import os
for root, dirs, files, rootfd in os.fwalk('python/Lib/xml'):
    print(root, "consumes", end=" ")
    print(sum([os.stat(name, dir_fd=rootfd).st_size for name in files]),
          end=" ")
    print("bytes in", len(files), "non-directory files")
    if '__pycache__' in dirs:
        dirs.remove('__pycache__')  # don't visit __pycache__ directories
@end example

다음 예에서는, 트리를 상향식으로 탐색하는 것이 필수적입니다: @ref{12f8,,rmdir()}는 비어 있지 않은 디렉터리를 삭제할 수 없습니다:

@example
# Delete everything reachable from the directory named in "top",
# assuming there are no symbolic links.
# CAUTION:  This is dangerous!  For example, if top == '/', it
# could delete all your disk files.
import os
for root, dirs, files, rootfd in os.fwalk(top, topdown=False):
    for name in files:
        os.unlink(name, dir_fd=rootfd)
    for name in dirs:
        os.rmdir(name, dir_fd=rootfd)
@end example

@code{top}, @code{topdown}, @code{onerror}, @code{follow_symlinks}, @code{dir_fd}를 인자로 @ref{1c6c,,감사 이벤트(auditing event)} @code{os.fwalk}를 발생시킵니다.

@ref{213c,,가용성}: Unix.


Added in version 3.3.



버전 3.6에서 변경: @ref{5a0,,경로류 객체}를 받아들입니다.



버전 3.7에서 변경: @ref{192,,bytes} 경로에 대한 지원이 추가되었습니다.

@end deffn

@geindex memfd_create() (os 모듈)
@anchor{library/os os memfd_create}@anchor{bfd}
@deffn {함수} os.memfd_create (name[, flags=os.MFD_CLOEXEC])

익명 파일을 만들고 이를 가리키는 파일 기술자를 반환합니다. `flags'는 시스템에서 사용할 수 있는 @code{os.MFD_*} 상수(또는 이들의 비트별 OR 조합) 중 하나여야 합니다. 기본적으로, 새 파일 기술자는 @ref{10fb,,상속 불가능}합니다.

`name'에 제공된 이름은 파일명으로 사용되며 해당 심볼릭 링크의 대상으로 @code{/proc/self/fd/} 디렉터리에 표시됩니다. 표시된 이름에는 항상 @code{memfd:} 접두어가 붙으며 디버깅 목적으로만 사용됩니다. 이름은 파일 기술자의 동작에 영향을 미치지 않고, 여러 파일이 부작용 없이 같은 이름을 가질 수 있습니다.

@ref{213c,,가용성}: Linux >= 3.17 with glibc >= 2.27.


Added in version 3.8.

@end deffn

@geindex MFD_CLOEXEC (os 모듈)
@geindex MFD_ALLOW_SEALING (os 모듈)
@geindex MFD_HUGETLB (os 모듈)
@geindex MFD_HUGE_SHIFT (os 모듈)
@geindex MFD_HUGE_MASK (os 모듈)
@geindex MFD_HUGE_64KB (os 모듈)
@geindex MFD_HUGE_512KB (os 모듈)
@geindex MFD_HUGE_1MB (os 모듈)
@geindex MFD_HUGE_2MB (os 모듈)
@geindex MFD_HUGE_8MB (os 모듈)
@geindex MFD_HUGE_16MB (os 모듈)
@geindex MFD_HUGE_32MB (os 모듈)
@geindex MFD_HUGE_256MB (os 모듈)
@geindex MFD_HUGE_512MB (os 모듈)
@geindex MFD_HUGE_1GB (os 모듈)
@geindex MFD_HUGE_2GB (os 모듈)
@geindex MFD_HUGE_16GB (os 모듈)
@anchor{library/os os MFD_CLOEXEC}@anchor{30bf}
@deffn {데이터} os.MFD_CLOEXEC
@anchor{library/os os MFD_ALLOW_SEALING}@anchor{30c0}
@deffnx {데이터} os.MFD_ALLOW_SEALING
@anchor{library/os os MFD_HUGETLB}@anchor{30c1}
@deffnx {데이터} os.MFD_HUGETLB
@anchor{library/os os MFD_HUGE_SHIFT}@anchor{30c2}
@deffnx {데이터} os.MFD_HUGE_SHIFT
@anchor{library/os os MFD_HUGE_MASK}@anchor{30c3}
@deffnx {데이터} os.MFD_HUGE_MASK
@anchor{library/os os MFD_HUGE_64KB}@anchor{30c4}
@deffnx {데이터} os.MFD_HUGE_64KB
@anchor{library/os os MFD_HUGE_512KB}@anchor{30c5}
@deffnx {데이터} os.MFD_HUGE_512KB
@anchor{library/os os MFD_HUGE_1MB}@anchor{30c6}
@deffnx {데이터} os.MFD_HUGE_1MB
@anchor{library/os os MFD_HUGE_2MB}@anchor{30c7}
@deffnx {데이터} os.MFD_HUGE_2MB
@anchor{library/os os MFD_HUGE_8MB}@anchor{30c8}
@deffnx {데이터} os.MFD_HUGE_8MB
@anchor{library/os os MFD_HUGE_16MB}@anchor{30c9}
@deffnx {데이터} os.MFD_HUGE_16MB
@anchor{library/os os MFD_HUGE_32MB}@anchor{30ca}
@deffnx {데이터} os.MFD_HUGE_32MB
@anchor{library/os os MFD_HUGE_256MB}@anchor{30cb}
@deffnx {데이터} os.MFD_HUGE_256MB
@anchor{library/os os MFD_HUGE_512MB}@anchor{30cc}
@deffnx {데이터} os.MFD_HUGE_512MB
@anchor{library/os os MFD_HUGE_1GB}@anchor{30cd}
@deffnx {데이터} os.MFD_HUGE_1GB
@anchor{library/os os MFD_HUGE_2GB}@anchor{30ce}
@deffnx {데이터} os.MFD_HUGE_2GB
@anchor{library/os os MFD_HUGE_16GB}@anchor{30cf}
@deffnx {데이터} os.MFD_HUGE_16GB

이 플래그들은 @ref{bfd,,memfd_create()}로 전달될 수 있습니다.

@ref{213c,,가용성}: Linux >= 3.17 with glibc >= 2.27

The @code{MFD_HUGE*} flags are only available since Linux 4.14.


Added in version 3.8.

@end deffn

@geindex eventfd() (os 모듈)
@anchor{library/os os eventfd}@anchor{a19}
@deffn {함수} os.eventfd (initval[, flags=os.EFD_CLOEXEC])

Create and return an event file descriptor. The file descriptors supports
raw @ref{f94,,read()} and @ref{f9a,,write()} with a buffer size of 8,
@ref{f9f,,select()}, @ref{30d0,,poll()} and similar. See man page
@code{eventfd(2)@footnote{https://manpages.debian.org/eventfd(2)}} for more information.  By default, the
new file descriptor is @ref{10fb,,non-inheritable}.

`initval' is the initial value of the event counter. The initial value
must be a 32 bit unsigned integer. Please note that the initial value is
limited to a 32 bit unsigned int although the event counter is an unsigned
64 bit integer with a maximum value of 2@w{^64}-2.

`flags' can be constructed from @ref{1b56,,EFD_CLOEXEC},
@ref{1b57,,EFD_NONBLOCK}, and @ref{1b58,,EFD_SEMAPHORE}.

If @ref{1b58,,EFD_SEMAPHORE} is specified and the event counter is non-zero,
@ref{30d1,,eventfd_read()} returns 1 and decrements the counter by one.

If @ref{1b58,,EFD_SEMAPHORE} is not specified and the event counter is
non-zero, @ref{30d1,,eventfd_read()} returns the current event counter value and
resets the counter to zero.

If the event counter is zero and @ref{1b57,,EFD_NONBLOCK} is not
specified, @ref{30d1,,eventfd_read()} blocks.

@ref{30d2,,eventfd_write()} increments the event counter. Write blocks if the
write operation would increment the counter to a value larger than
2@w{^64}-2.

예:

@example
import os

# semaphore with start value '1'
fd = os.eventfd(1, os.EFD_SEMAPHORE | os.EFD_CLOEXEC)
try:
    # acquire semaphore
    v = os.eventfd_read(fd)
    try:
        do_work()
    finally:
        # release semaphore
        os.eventfd_write(fd, v)
finally:
    os.close(fd)
@end example

@ref{213c,,가용성}: Linux >= 2.6.27 with glibc >= 2.8


Added in version 3.10.

@end deffn

@geindex eventfd_read() (os 모듈)
@anchor{library/os os eventfd_read}@anchor{30d1}
@deffn {함수} os.eventfd_read (fd)

Read value from an @ref{a19,,eventfd()} file descriptor and return a 64 bit
unsigned int. The function does not verify that `fd' is an @code{eventfd()}.

@ref{213c,,가용성}: Linux >= 2.6.27


Added in version 3.10.

@end deffn

@geindex eventfd_write() (os 모듈)
@anchor{library/os os eventfd_write}@anchor{30d2}
@deffn {함수} os.eventfd_write (fd, value)

Add value to an @ref{a19,,eventfd()} file descriptor. `value' must be a 64 bit
unsigned int. The function does not verify that `fd' is an @code{eventfd()}.

@ref{213c,,가용성}: Linux >= 2.6.27


Added in version 3.10.

@end deffn

@geindex EFD_CLOEXEC (os 모듈)
@anchor{library/os os EFD_CLOEXEC}@anchor{1b56}
@deffn {데이터} os.EFD_CLOEXEC

Set close-on-exec flag for new @ref{a19,,eventfd()} file descriptor.

@ref{213c,,가용성}: Linux >= 2.6.27


Added in version 3.10.

@end deffn

@geindex EFD_NONBLOCK (os 모듈)
@anchor{library/os os EFD_NONBLOCK}@anchor{1b57}
@deffn {데이터} os.EFD_NONBLOCK

Set @ref{103a,,O_NONBLOCK} status flag for new @ref{a19,,eventfd()} file
descriptor.

@ref{213c,,가용성}: Linux >= 2.6.27


Added in version 3.10.

@end deffn

@geindex EFD_SEMAPHORE (os 모듈)
@anchor{library/os os EFD_SEMAPHORE}@anchor{1b58}
@deffn {데이터} os.EFD_SEMAPHORE

Provide semaphore-like semantics for reads from an @ref{a19,,eventfd()} file
descriptor. On read the internal counter is decremented by one.

@ref{213c,,가용성}: Linux >= 2.6.30


Added in version 3.10.

@end deffn

@menu
* Timer File Descriptors:: 
* 리눅스 확장 어트리뷰트:: 

@end menu

@node Timer File Descriptors,리눅스 확장 어트리뷰트,,파일과 디렉터리
@anchor{library/os os-timerfd}@anchor{47e}@anchor{library/os timer-file-descriptors}@anchor{30d3}
@subsubsection Timer File Descriptors



Added in version 3.13.


These functions provide support for Linux’s `timer file descriptor' API.
Naturally, they are all only available on Linux.

@geindex timerfd_create() (os 모듈)
@anchor{library/os os timerfd_create}@anchor{51f}
@deffn {함수} os.timerfd_create (clockid, /, *, flags=0)

Create and return a timer file descriptor (`timerfd').

The file descriptor returned by @code{timerfd_create()} supports:


@itemize -

@item 
@ref{f94,,read()}

@item 
@ref{f9f,,select()}

@item 
@ref{30d0,,poll()}
@end itemize

The file descriptor’s @ref{f94,,read()} method can be called with a buffer size
of 8. If the timer has already expired one or more times, @code{read()}
returns the number of expirations with the host’s endianness, which may be
converted to an @ref{19b,,int} by @code{int.from_bytes(x, byteorder=sys.byteorder)}.

@ref{f9f,,select()} and @ref{30d0,,poll()} can be used to wait until
timer expires and the file descriptor is readable.

`clockid' must be a valid @ref{30d4,,clock ID},
as defined in the @ref{f4,,time} module:


@itemize -

@item 
@ref{8a8,,time.CLOCK_REALTIME}

@item 
@ref{8a7,,time.CLOCK_MONOTONIC}

@item 
@ref{d86,,time.CLOCK_BOOTTIME} (Since Linux 3.15 for timerfd_create)
@end itemize

If `clockid' is @ref{8a8,,time.CLOCK_REALTIME}, a settable system-wide
real-time clock is used. If system clock is changed, timer setting need
to be updated. To cancel timer when system clock is changed, see
@ref{527,,TFD_TIMER_CANCEL_ON_SET}.

If `clockid' is @ref{8a7,,time.CLOCK_MONOTONIC}, a non-settable monotonically
increasing clock is used. Even if the system clock is changed, the timer
setting will not be affected.

If `clockid' is @ref{d86,,time.CLOCK_BOOTTIME}, same as @ref{8a7,,time.CLOCK_MONOTONIC}
except it includes any time that the system is suspended.

The file descriptor’s behaviour can be modified by specifying a `flags' value.
Any of the following variables may be used, combined using bitwise OR
(the @code{|} operator):


@itemize -

@item 
@ref{524,,TFD_NONBLOCK}

@item 
@ref{525,,TFD_CLOEXEC}
@end itemize

If @ref{524,,TFD_NONBLOCK} is not set as a flag, @ref{f94,,read()} blocks until
the timer expires. If it is set as a flag, @code{read()} doesn’t block, but
If there hasn’t been an expiration since the last call to read,
@code{read()} raises @ref{2c0,,OSError} with @code{errno} is set to
@ref{2703,,errno.EAGAIN}.

@ref{525,,TFD_CLOEXEC} is always set by Python automatically.

The file descriptor must be closed with @ref{d6a,,os.close()} when it is no
longer needed, or else the file descriptor will be leaked.


@subsubheading 더 보기


The @code{timerfd_create(2)@footnote{https://manpages.debian.org/timerfd_create(2)}} man page.


@ref{213c,,가용성}: Linux >= 2.6.27 with glibc >= 2.8


Added in version 3.13.

@end deffn

@geindex timerfd_settime() (os 모듈)
@anchor{library/os os timerfd_settime}@anchor{520}
@deffn {함수} os.timerfd_settime (fd, /, *, flags=flags, initial=0.0, interval=0.0)

Alter a timer file descriptor’s internal timer.
This function operates the same interval timer as @ref{521,,timerfd_settime_ns()}.

`fd' must be a valid timer file descriptor.

The timer’s behaviour can be modified by specifying a `flags' value.
Any of the following variables may be used, combined using bitwise OR
(the @code{|} operator):


@itemize -

@item 
@ref{526,,TFD_TIMER_ABSTIME}

@item 
@ref{527,,TFD_TIMER_CANCEL_ON_SET}
@end itemize

The timer is disabled by setting `initial' to zero (@code{0}).
If `initial' is equal to or greater than zero, the timer is enabled.
If `initial' is less than zero, it raises an @ref{2c0,,OSError} exception
with @code{errno} set to @ref{1dcf,,errno.EINVAL}

By default the timer will fire when `initial' seconds have elapsed.
(If `initial' is zero, timer will fire immediately.)

However, if the @ref{526,,TFD_TIMER_ABSTIME} flag is set,
the timer will fire when the timer’s clock
(set by `clockid' in @ref{51f,,timerfd_create()}) reaches `initial' seconds.

The timer’s interval is set by the `interval' @ref{196,,float}.
If `interval' is zero, the timer only fires once, on the initial expiration.
If `interval' is greater than zero, the timer fires every time `interval'
seconds have elapsed since the previous expiration.
If `interval' is less than zero, it raises @ref{2c0,,OSError} with @code{errno}
set to @ref{1dcf,,errno.EINVAL}

If the @ref{527,,TFD_TIMER_CANCEL_ON_SET} flag is set along with
@ref{526,,TFD_TIMER_ABSTIME} and the clock for this timer is
@ref{8a8,,time.CLOCK_REALTIME}, the timer is marked as cancelable if the
real-time clock is changed discontinuously. Reading the descriptor is
aborted with the error ECANCELED.

Linux manages system clock as UTC. A daylight-savings time transition is
done by changing time offset only and doesn’t cause discontinuous system
clock change.

Discontinuous system clock change will be caused by the following events:


@itemize -

@item 
@code{settimeofday}

@item 
@code{clock_settime}

@item 
set the system date and time by @code{date} command
@end itemize

Return a two-item tuple of (@code{next_expiration}, @code{interval}) from
the previous timer state, before this function executed.


@subsubheading 더 보기


@code{timerfd_create(2)@footnote{https://manpages.debian.org/timerfd_create(2)}}, @code{timerfd_settime(2)@footnote{https://manpages.debian.org/timerfd_settime(2)}},
@code{settimeofday(2)@footnote{https://manpages.debian.org/settimeofday(2)}}, @code{clock_settime(2)@footnote{https://manpages.debian.org/clock_settime(2)}},
and @code{date(1)@footnote{https://manpages.debian.org/date(1)}}.


@ref{213c,,가용성}: Linux >= 2.6.27 with glibc >= 2.8


Added in version 3.13.

@end deffn

@geindex timerfd_settime_ns() (os 모듈)
@anchor{library/os os timerfd_settime_ns}@anchor{521}
@deffn {함수} os.timerfd_settime_ns (fd, /, *, flags=0, initial=0, interval=0)

Similar to @ref{520,,timerfd_settime()}, but use time as nanoseconds.
This function operates the same interval timer as @code{timerfd_settime()}.

@ref{213c,,가용성}: Linux >= 2.6.27 with glibc >= 2.8


Added in version 3.13.

@end deffn

@geindex timerfd_gettime() (os 모듈)
@anchor{library/os os timerfd_gettime}@anchor{522}
@deffn {함수} os.timerfd_gettime (fd, /)

Return a two-item tuple of floats (@code{next_expiration}, @code{interval}).

@code{next_expiration} denotes the relative time until the timer next fires,
regardless of if the @ref{526,,TFD_TIMER_ABSTIME} flag is set.

@code{interval} denotes the timer’s interval.
If zero, the timer will only fire once, after @code{next_expiration} seconds
have elapsed.


@subsubheading 더 보기


@code{timerfd_gettime(2)@footnote{https://manpages.debian.org/timerfd_gettime(2)}}


@ref{213c,,가용성}: Linux >= 2.6.27 with glibc >= 2.8


Added in version 3.13.

@end deffn

@geindex timerfd_gettime_ns() (os 모듈)
@anchor{library/os os timerfd_gettime_ns}@anchor{523}
@deffn {함수} os.timerfd_gettime_ns (fd, /)

Similar to @ref{522,,timerfd_gettime()}, but return time as nanoseconds.

@ref{213c,,가용성}: Linux >= 2.6.27 with glibc >= 2.8


Added in version 3.13.

@end deffn

@geindex TFD_NONBLOCK (os 모듈)
@anchor{library/os os TFD_NONBLOCK}@anchor{524}
@deffn {데이터} os.TFD_NONBLOCK

A flag for the @ref{51f,,timerfd_create()} function,
which sets the @ref{103a,,O_NONBLOCK} status flag for the new timer file
descriptor. If @ref{524,,TFD_NONBLOCK} is not set as a flag, @ref{f94,,read()} blocks.

@ref{213c,,가용성}: Linux >= 2.6.27 with glibc >= 2.8


Added in version 3.13.

@end deffn

@geindex TFD_CLOEXEC (os 모듈)
@anchor{library/os os TFD_CLOEXEC}@anchor{525}
@deffn {데이터} os.TFD_CLOEXEC

A flag for the @ref{51f,,timerfd_create()} function,
If @ref{525,,TFD_CLOEXEC} is set as a flag, set close-on-exec flag for new file
descriptor.

@ref{213c,,가용성}: Linux >= 2.6.27 with glibc >= 2.8


Added in version 3.13.

@end deffn

@geindex TFD_TIMER_ABSTIME (os 모듈)
@anchor{library/os os TFD_TIMER_ABSTIME}@anchor{526}
@deffn {데이터} os.TFD_TIMER_ABSTIME

A flag for the @ref{520,,timerfd_settime()} and @ref{521,,timerfd_settime_ns()} functions.
If this flag is set, `initial' is interpreted as an absolute value on the
timer’s clock (in UTC seconds or nanoseconds since the Unix Epoch).

@ref{213c,,가용성}: Linux >= 2.6.27 with glibc >= 2.8


Added in version 3.13.

@end deffn

@geindex TFD_TIMER_CANCEL_ON_SET (os 모듈)
@anchor{library/os os TFD_TIMER_CANCEL_ON_SET}@anchor{527}
@deffn {데이터} os.TFD_TIMER_CANCEL_ON_SET

A flag for the @ref{520,,timerfd_settime()} and @ref{521,,timerfd_settime_ns()}
functions along with @ref{526,,TFD_TIMER_ABSTIME}.
The timer is cancelled when the time of the underlying clock changes
discontinuously.

@ref{213c,,가용성}: Linux >= 2.6.27 with glibc >= 2.8


Added in version 3.13.

@end deffn

@node 리눅스 확장 어트리뷰트,,Timer File Descriptors,파일과 디렉터리
@anchor{library/os linux-extended-attributes}@anchor{30d5}
@subsubsection 리눅스 확장 어트리뷰트



Added in version 3.3.


이 함수들은 모두 리눅스에서만 사용 가능합니다.

@geindex getxattr() (os 모듈)
@anchor{library/os os getxattr}@anchor{1309}
@deffn {함수} os.getxattr (path, attribute, *, follow_symlinks=True)

`path'의 확장 파일 시스템 어트리뷰트 `attribute'의 값을 반환합니다. `attribute' 는 bytes 또는 str(직접 또는 @ref{e4a,,PathLike} 인터페이스를 통해 간접적으로)일 수 있습니다. str이면, 파일 시스템 인코딩으로 인코딩됩니다.

이 함수는 @ref{d52,,파일 기술자 지정} 및 @ref{12f0,,심볼릭 링크를 따르지 않음}을 지원할 수 있습니다.

@code{path}, @code{attribute}를 인자로 @ref{1c6c,,감사 이벤트(auditing event)} @code{os.getxattr}을 발생시킵니다.


버전 3.6에서 변경: `path' 및 `attribute'에 대해 @ref{5a0,,경로류 객체}를 받아들입니다.

@end deffn

@geindex listxattr() (os 모듈)
@anchor{library/os os listxattr}@anchor{130a}
@deffn {함수} os.listxattr (path=None, *, follow_symlinks=True)

`path' 의 확장 파일 시스템 어트리뷰트 목록을 반환합니다. 목록의 어트리뷰트는 파일 시스템 인코딩으로 디코딩된 문자열로 표시됩니다. `path' 가 @code{None}이면, @ref{130a,,listxattr()}는 현재 디렉터리를 검사합니다.

이 함수는 @ref{d52,,파일 기술자 지정} 및 @ref{12f0,,심볼릭 링크를 따르지 않음}을 지원할 수 있습니다.

@code{path}를 인자로 @ref{1c6c,,감사 이벤트(auditing event)} @code{os.listxattr}을 발생시킵니다.


버전 3.6에서 변경: @ref{5a0,,경로류 객체}를 받아들입니다.

@end deffn

@geindex removexattr() (os 모듈)
@anchor{library/os os removexattr}@anchor{130b}
@deffn {함수} os.removexattr (path, attribute, *, follow_symlinks=True)

Removes the extended filesystem attribute `attribute' from `path'.
`attribute' should be bytes or str (directly or indirectly through the
@ref{e4a,,PathLike} interface). If it is a string, it is encoded
with the @ref{75c,,filesystem encoding and error handler}.

이 함수는 @ref{d52,,파일 기술자 지정} 및 @ref{12f0,,심볼릭 링크를 따르지 않음}을 지원할 수 있습니다.

@code{path}, @code{attribute}를 인자로 @ref{1c6c,,감사 이벤트(auditing event)} @code{os.removexattr}을 발생시킵니다.


버전 3.6에서 변경: `path' 및 `attribute'에 대해 @ref{5a0,,경로류 객체}를 받아들입니다.

@end deffn

@geindex setxattr() (os 모듈)
@anchor{library/os os setxattr}@anchor{130c}
@deffn {함수} os.setxattr (path, attribute, value, flags=0, *, follow_symlinks=True)

Set the extended filesystem attribute `attribute' on `path' to `value'.
`attribute' must be a bytes or str with no embedded NULs (directly or
indirectly through the @ref{e4a,,PathLike} interface). If it is a str,
it is encoded with the @ref{75c,,filesystem encoding and error handler}.  `flags' may be
@ref{30d6,,XATTR_REPLACE} or @ref{30d7,,XATTR_CREATE}. If @code{XATTR_REPLACE} is
given and the attribute does not exist, @code{ENODATA} will be raised.
If @code{XATTR_CREATE} is given and the attribute already exists, the
attribute will not be created and @code{EEXISTS} will be raised.

이 함수는 @ref{d52,,파일 기술자 지정} 및 @ref{12f0,,심볼릭 링크를 따르지 않음}을 지원할 수 있습니다.

@cartouche
@quotation 참고 
리눅스 커널 버전 2.6.39 미만의 버그로 인해 flags 인자가 일부 파일 시스템에서 무시되었습니다.
@end quotation
@end cartouche

@code{path}, @code{attribute}, @code{value}, @code{flags}를 인자로 @ref{1c6c,,감사 이벤트(auditing event)} @code{os.setxattr}을 발생시킵니다.


버전 3.6에서 변경: `path' 및 `attribute'에 대해 @ref{5a0,,경로류 객체}를 받아들입니다.

@end deffn

@geindex XATTR_SIZE_MAX (os 모듈)
@anchor{library/os os XATTR_SIZE_MAX}@anchor{30d8}
@deffn {데이터} os.XATTR_SIZE_MAX

확장 어트리뷰트 값의 최대 크기입니다. 현재, 리눅스에서 64 KiB입니다.
@end deffn

@geindex XATTR_CREATE (os 모듈)
@anchor{library/os os XATTR_CREATE}@anchor{30d7}
@deffn {데이터} os.XATTR_CREATE

이것은 @ref{130c,,setxattr()}의 flags 인자를 위한 값입니다. 연산이 반드시 어트리뷰트를 새로 만들어야 함을 나타냅니다.
@end deffn

@geindex XATTR_REPLACE (os 모듈)
@anchor{library/os os XATTR_REPLACE}@anchor{30d6}
@deffn {데이터} os.XATTR_REPLACE

이것은 @ref{130c,,setxattr()}의 flags 인자를 위한 값입니다. 연산이 반드시 기존 어트리뷰트를 대체해야 함을 나타냅니다.
@end deffn

@node 프로세스 관리,스케줄러에 대한 인터페이스,파일과 디렉터리,os — Miscellaneous operating system interfaces
@anchor{library/os os-process}@anchor{30d9}@anchor{library/os process-management}@anchor{30da}
@subsubsection 프로세스 관리


이 함수들은 프로세스를 만들고 관리하는데 사용될 수 있습니다.

다양한 @ref{30db,,exec*} 함수는 프로세스로 로드되는 새 프로그램에 대한 인자 목록을 받아들입니다. 각각의 경우에, 첫 번째 인자는 사용자가 명령 줄에 입력할 수 있는 인자가 아닌 프로그램 자체의 이름으로 새 프로그램에 전달됩니다. C 프로그래머에게, 이것은 프로그램의 @code{main()}에 전달된 @code{argv[0]}입니다. 예를 들어, @code{os.execv('/bin/echo', ['foo', 'bar'])}는 표준 출력에 @code{bar}만 인쇄합니다; @code{foo}는 무시되는 것처럼 보이게 됩니다.

@geindex abort() (os 모듈)
@anchor{library/os os abort}@anchor{30dc}
@deffn {함수} os.abort ()

현재 프로세스에 @code{SIGABRT} 시그널을 생성합니다. 유닉스에서, 기본 동작은 코어 덤프를 생성하는 것입니다; 윈도우에서, 프로세스는 즉시 종료 코드 @code{3}을 반환합니다. 이 함수를 호출하면 @ref{1339,,signal.signal()}를 사용하여 @code{SIGABRT}에 등록된 파이썬 시그널 처리기를 호출하지 않게 됨에 주의하시기 바랍니다.
@end deffn

@geindex add_dll_directory() (os 모듈)
@anchor{library/os os add_dll_directory}@anchor{bdc}
@deffn {함수} os.add_dll_directory (path)

DLL 검색 경로에 path를 추가합니다.

This search path is used when resolving dependencies for imported
extension modules (the module itself is resolved through
@ref{3e4,,sys.path}), and also by @ref{2e,,ctypes}.

반환된 객체의 `close()'를 호출하거나 반환된 객체를 @ref{186,,with} 문에서 사용하여 디렉터리를 제거하십시오.

DLL이 로드되는 방법에 대한 자세한 내용은 마이크로소프트 설명서@footnote{https://msdn.microsoft.com/44228cf2-6306-466c-8f16-f513cd3ba8b5}를 참조하십시오.

@code{path}를 인자로 @ref{1c6c,,감사 이벤트(auditing event)} @code{os.add_dll_directory}를 발생시킵니다.

@ref{213c,,가용성}: Windows.


Added in version 3.8: 이전 버전의 CPython은 현재 프로세스의 기본 동작을 사용하여 DLL을 해결(resolve)합니다. 이로 인해 때때로 
@geindex PATH
@geindex 환경 변수; PATH
@code{PATH}나 현재 작업 디렉터리를 검색하거나, @code{AddDllDirectory}와 같은 OS 함수가 효과가 없게 되는 것과 같은 일관성 없는 결과를 낳습니다.

3.8에서는, 일관성을 보장하기 위해 이제 DLL이 로드되는 두 가지 기본 방법이 프로세스 전반의 동작을 명시적으로 재정의합니다. 라이브러리 갱신에 대한 정보는 @ref{c94,,이식 주의 사항}을 참조하십시오.

@end deffn

@geindex execl() (os 모듈)
@geindex execle() (os 모듈)
@geindex execlp() (os 모듈)
@geindex execlpe() (os 모듈)
@geindex execv() (os 모듈)
@geindex execve() (os 모듈)
@geindex execvp() (os 모듈)
@geindex execvpe() (os 모듈)
@anchor{library/os os execl}@anchor{30db}
@deffn {함수} os.execl (path, arg0, arg1, ...)
@anchor{library/os os execle}@anchor{30dd}
@deffnx {함수} os.execle (path, arg0, arg1, ..., env)
@anchor{library/os os execlp}@anchor{30de}
@deffnx {함수} os.execlp (file, arg0, arg1, ...)
@anchor{library/os os execlpe}@anchor{30df}
@deffnx {함수} os.execlpe (file, arg0, arg1, ..., env)
@anchor{library/os os execv}@anchor{3040}
@deffnx {함수} os.execv (path, args)
@anchor{library/os os execve}@anchor{12fe}
@deffnx {함수} os.execve (path, args, env)
@anchor{library/os os execvp}@anchor{30e0}
@deffnx {함수} os.execvp (file, args)
@anchor{library/os os execvpe}@anchor{30e1}
@deffnx {함수} os.execvpe (file, args, env)

이 함수들은 모두 현재 프로세스를 대체해서 새로운 프로그램을 실행합니다; 반환되지 않습니다. 유닉스에서, 새로운 실행 파일이 현재 프로세스에 로드되고, 호출자와 같은 프로세스 ID를 갖게 됩니다. 에러는 @ref{2c0,,OSError} 예외로 보고됩니다.

The current process is replaced immediately. Open file objects and
descriptors are not flushed, so if there may be data buffered
on these open files, you should flush them using
@ref{2d0d,,flush()} or @ref{f8d,,os.fsync()} before calling an
@ref{30db,,exec*} function.

The “l” and “v” variants of the @ref{30db,,exec*} functions differ in how
command-line arguments are passed.  The “l” variants are perhaps the easiest
to work with if the number of parameters is fixed when the code is written; the
individual parameters simply become additional parameters to the @code{execl*()}
functions.  The “v” variants are good when the number of parameters is
variable, with the arguments being passed in a list or tuple as the `args'
parameter.  In either case, the arguments to the child process should start with
the name of the command being run, but this is not enforced.

The variants which include a “p” near the end (@ref{30de,,execlp()},
@ref{30df,,execlpe()}, @ref{30e0,,execvp()}, and @ref{30e1,,execvpe()}) will use the
@geindex PATH
@geindex 환경 변수; PATH
@code{PATH} environment variable to locate the program `file'.  When the
environment is being replaced (using one of the @ref{30db,,exec*e} variants,
discussed in the next paragraph), the new environment is used as the source of
the 
@geindex PATH
@geindex 환경 변수; PATH
@code{PATH} variable. The other variants, @code{execl()}, @ref{30dd,,execle()},
@ref{3040,,execv()}, and @ref{12fe,,execve()}, will not use the 
@geindex PATH
@geindex 환경 변수; PATH
@code{PATH} variable to
locate the executable; `path' must contain an appropriate absolute or relative
path. Relative paths must include at least one slash, even on Windows, as
plain names will not be resolved.

@ref{30dd,,execle()}, @ref{30df,,execlpe()}, @ref{12fe,,execve()}, @ref{30e1,,execvpe()}의 경우 (모두 “e”로 끝납니다), `env' 매개 변수는 새 프로세스의 환경 변수를 정의하는 데 사용되는 매핑이어야 합니다 (이것이 현재 프로세스의 환경 대신 사용됩니다); 함수 @ref{30db,,execl()}, @ref{30de,,execlp()}, @ref{3040,,execv()} 및 @ref{30e0,,execvp()}는 모두 새 프로세스가 현재 프로세스의 환경을 상속하게 합니다.

일부 플랫폼에서 @ref{12fe,,execve()}의 경우, `path' 는 열린 파일 기술자로도 지정될 수 있습니다. 이 기능은 여러분의 플랫폼에서 지원되지 않을 수 있습니다; @ref{1302,,os.supports_fd}를 사용하여 사용할 수 있는지를 확인할 수 있습니다. 사용할 수 없을 때, 이를 사용하면 @ref{36b,,NotImplementedError}가 발생합니다.

@code{path}, @code{args}, @code{env}를 인자로 @ref{1c6c,,감사 이벤트(auditing event)} @code{os.exec}를 발생시킵니다.

@ref{213c,,가용성}: Unix, Windows, not WASI, not Android, not iOS.


버전 3.3에서 변경: @ref{12fe,,execve()}의 `path'에 열린 파일 기술자를 지정하는 지원이 추가되었습니다.



버전 3.6에서 변경: @ref{5a0,,경로류 객체}를 받아들입니다.

@end deffn

@geindex _exit() (os 모듈)
@anchor{library/os os _exit}@anchor{26ff}
@deffn {함수} os._exit (n)

상태 `n'으로 프로세스를 종료합니다. 클린업 처리기를 호출하거나, stdio 버퍼를 플러시 하거나 등등은 수행하지 않습니다.

@cartouche
@quotation 참고 
The standard way to exit is @ref{277,,sys.exit(n)}.  @code{_exit()} should
normally only be used in the child process after a @ref{4b6,,fork()}.
@end quotation
@end cartouche
@end deffn

필수 조건은 아니지만, 다음 종료 코드가 정의되어 있으며 @ref{26ff,,_exit()}와 함께 사용할 수 있습니다. 이것은 메일 서버의 외부 명령 배달 프로그램과 같이 파이썬으로 작성된 시스템 프로그램에서 일반적으로 사용됩니다.

@cartouche
@quotation 참고 
약간의 차이점이 있어서, 이들 중 일부는 모든 유닉스 플랫폼에서 사용하지는 못할 수 있습니다. 이 상수는 하부 플랫폼에서 정의될 때만 정의됩니다.
@end quotation
@end cartouche

@geindex EX_OK (os 모듈)
@anchor{library/os os EX_OK}@anchor{30e2}
@deffn {데이터} os.EX_OK

Exit code that means no error occurred. May be taken from the defined value of
@code{EXIT_SUCCESS} on some platforms. Generally has a value of zero.

@ref{213c,,가용성}: Unix, Windows.
@end deffn

@geindex EX_USAGE (os 모듈)
@anchor{library/os os EX_USAGE}@anchor{30e3}
@deffn {데이터} os.EX_USAGE

잘못된 개수의 인자가 제공된 경우처럼, 명령이 잘못 사용되었음을 나타내는 종료 코드.

@ref{213c,,가용성}: Unix, not WASI.
@end deffn

@geindex EX_DATAERR (os 모듈)
@anchor{library/os os EX_DATAERR}@anchor{30e4}
@deffn {데이터} os.EX_DATAERR

입력 데이터가 잘못되었음을 나타내는 종료 코드.

@ref{213c,,가용성}: Unix, not WASI.
@end deffn

@geindex EX_NOINPUT (os 모듈)
@anchor{library/os os EX_NOINPUT}@anchor{30e5}
@deffn {데이터} os.EX_NOINPUT

입력 파일이 없거나 읽을 수 없음을 나타내는 종료 코드.

@ref{213c,,가용성}: Unix, not WASI.
@end deffn

@geindex EX_NOUSER (os 모듈)
@anchor{library/os os EX_NOUSER}@anchor{30e6}
@deffn {데이터} os.EX_NOUSER

지정된 사용자가 존재하지 않음을 나타내는 종료 코드.

@ref{213c,,가용성}: Unix, not WASI.
@end deffn

@geindex EX_NOHOST (os 모듈)
@anchor{library/os os EX_NOHOST}@anchor{30e7}
@deffn {데이터} os.EX_NOHOST

지정된 호스트가 존재하지 않음을 나타내는 종료 코드.

@ref{213c,,가용성}: Unix, not WASI.
@end deffn

@geindex EX_UNAVAILABLE (os 모듈)
@anchor{library/os os EX_UNAVAILABLE}@anchor{30e8}
@deffn {데이터} os.EX_UNAVAILABLE

필수 서비스를 사용할 수 없음을 나타내는 종료 코드.

@ref{213c,,가용성}: Unix, not WASI.
@end deffn

@geindex EX_SOFTWARE (os 모듈)
@anchor{library/os os EX_SOFTWARE}@anchor{30e9}
@deffn {데이터} os.EX_SOFTWARE

내부 소프트웨어 에러가 감지되었음을 나타내는 종료 코드.

@ref{213c,,가용성}: Unix, not WASI.
@end deffn

@geindex EX_OSERR (os 모듈)
@anchor{library/os os EX_OSERR}@anchor{30ea}
@deffn {데이터} os.EX_OSERR

포크 하거나 파이프를 만들 수 없는 등, 운영 체제 에러가 감지되었음을 나타내는 종료 코드.

@ref{213c,,가용성}: Unix, not WASI.
@end deffn

@geindex EX_OSFILE (os 모듈)
@anchor{library/os os EX_OSFILE}@anchor{30eb}
@deffn {데이터} os.EX_OSFILE

일부 시스템 파일이 없거나, 열 수 없거나, 다른 에러가 있음을 나타내는 종료 코드.

@ref{213c,,가용성}: Unix, not WASI.
@end deffn

@geindex EX_CANTCREAT (os 모듈)
@anchor{library/os os EX_CANTCREAT}@anchor{30ec}
@deffn {데이터} os.EX_CANTCREAT

사용자가 지정한 출력 파일을 만들 수 없음을 나타내는 종료 코드.

@ref{213c,,가용성}: Unix, not WASI.
@end deffn

@geindex EX_IOERR (os 모듈)
@anchor{library/os os EX_IOERR}@anchor{30ed}
@deffn {데이터} os.EX_IOERR

일부 파일에서 I/O를 수행하는 동안 에러가 발생했음을 나타내는 종료 코드.

@ref{213c,,가용성}: Unix, not WASI.
@end deffn

@geindex EX_TEMPFAIL (os 모듈)
@anchor{library/os os EX_TEMPFAIL}@anchor{30ee}
@deffn {데이터} os.EX_TEMPFAIL

임시 에러가 발생했음을 나타내는 종료 코드. 이는 재시도 가능한 작업 중에 만들 수 없었던 네트워크 연결과 같이 실제로는 에러가 아닐 수 있는 것을 나타냅니다.

@ref{213c,,가용성}: Unix, not WASI.
@end deffn

@geindex EX_PROTOCOL (os 모듈)
@anchor{library/os os EX_PROTOCOL}@anchor{30ef}
@deffn {데이터} os.EX_PROTOCOL

프로토콜 교환이 불법이거나 유효하지 않거나 이해되지 않았음을 나타내는 종료 코드.

@ref{213c,,가용성}: Unix, not WASI.
@end deffn

@geindex EX_NOPERM (os 모듈)
@anchor{library/os os EX_NOPERM}@anchor{30f0}
@deffn {데이터} os.EX_NOPERM

작업을 수행할 수 있는 권한이 충분하지 않음을 나타내는 종료 코드 (파일 시스템 문제에는 사용하지 않습니다).

@ref{213c,,가용성}: Unix, not WASI.
@end deffn

@geindex EX_CONFIG (os 모듈)
@anchor{library/os os EX_CONFIG}@anchor{30f1}
@deffn {데이터} os.EX_CONFIG

어떤 종류의 구성 에러가 발생했음을 나타내는 종료 코드.

@ref{213c,,가용성}: Unix, not WASI.
@end deffn

@geindex EX_NOTFOUND (os 모듈)
@anchor{library/os os EX_NOTFOUND}@anchor{30f2}
@deffn {데이터} os.EX_NOTFOUND

“항목을 찾을 수 없습니다” 와 같은 것을 의미하는 종료 코드.

@ref{213c,,가용성}: Unix, not WASI.
@end deffn

@geindex fork() (os 모듈)
@anchor{library/os os fork}@anchor{4b6}
@deffn {함수} os.fork ()

자식 프로세스를 포크 합니다. 자식에서는 @code{0}을 반환하고, 부모에서는 자식의 프로세스 ID를 반환합니다. 에러가 발생하면 @ref{2c0,,OSError}를 일으킵니다.

FreeBSD <= 6.3 및 Cygwin을 포함한 일부 플랫폼은 스레드에서 @code{fork()}를 사용할 때 알려진 문제점이 있습니다.

인자 없이 @ref{1c6c,,감사 이벤트(auditing event)} @code{os.fork}를 발생시킵니다.

@cartouche
@quotation 경고 
If you use TLS sockets in an application calling @code{fork()}, see
the warning in the @ref{d5,,ssl} documentation.
@end quotation
@end cartouche

@cartouche
@quotation 경고 
On macOS the use of this function is unsafe when mixed with using
higher-level system APIs, and that includes using @ref{111,,urllib.request}.
@end quotation
@end cartouche


버전 3.8에서 변경: 서브 인터프리터에서 @code{fork()}를 호출하는 것은 더는 지원되지 않습니다 (@ref{244,,RuntimeError}가 발생합니다).



버전 3.12에서 변경: If Python is able to detect that your process has multiple
threads, @ref{4b6,,os.fork()} now raises a @ref{1a3,,DeprecationWarning}.

We chose to surface this as a warning, when detectable, to better
inform developers of a design problem that the POSIX platform
specifically notes as not supported. Even in code that
`appears' to work, it has never been safe to mix threading with
@ref{4b6,,os.fork()} on POSIX platforms. The CPython runtime itself has
always made API calls that are not safe for use in the child
process when threads existed in the parent (such as @code{malloc} and
@code{free}).

Users of macOS or users of libc or malloc implementations other
than those typically found in glibc to date are among those
already more likely to experience deadlocks running such code.

See this discussion on fork being incompatible with threads@footnote{https://discuss.python.org/t/33555}
for technical details of why we’re surfacing this longstanding
platform compatibility problem to developers.


@ref{213c,,가용성}: POSIX, not WASI, not Android, not iOS.
@end deffn

@geindex forkpty() (os 모듈)
@anchor{library/os os forkpty}@anchor{4b7}
@deffn {함수} os.forkpty ()

새 의사 터미널을 자식의 제어 터미널로 사용하여 자식 프로세스를 포크 합니다. @code{(pid, fd)} 쌍을 반환하는데, 여기서 `pid' 는 자식에서 @code{0}이고, 부모에서는 새 자식의 프로세스 ID이고, `fd' 는 의사 터미널의 마스터 단의 파일 기술자입니다. 좀 더 이식성 있는 접근법을 사용하려면, @ref{b6,,pty} 모듈을 사용하십시오. 에러가 발생하면 @ref{2c0,,OSError}를 일으킵니다.

인자 없이 @ref{1c6c,,감사 이벤트(auditing event)} @code{os.forkpty}를 발생시킵니다.

@cartouche
@quotation 경고 
On macOS the use of this function is unsafe when mixed with using
higher-level system APIs, and that includes using @ref{111,,urllib.request}.
@end quotation
@end cartouche


버전 3.8에서 변경: 서브 인터프리터에서 @code{forkpty()}를 호출하는 것은 더는 지원되지 않습니다 (@ref{244,,RuntimeError}가 발생합니다).



버전 3.12에서 변경: If Python is able to detect that your process has multiple
threads, this now raises a @ref{1a3,,DeprecationWarning}. See the
longer explanation on @ref{4b6,,os.fork()}.


@ref{213c,,가용성}: Unix, not WASI, not Android, not iOS.
@end deffn

@geindex kill() (os 모듈)
@anchor{library/os os kill}@anchor{156c}
@deffn {함수} os.kill (pid, sig, /)

@geindex process;killing
@geindex process;signalling

프로세스 `pid'에 시그널 `sig'를 보냅니다. 호스트 플랫폼에서 사용할 수 있는 구체적인 시그널에 대한 상수는 @ref{cb,,signal} 모듈에 정의되어 있습니다.

Windows: The @ref{156d,,signal.CTRL_C_EVENT} and
@ref{156e,,signal.CTRL_BREAK_EVENT} signals are special signals which can
only be sent to console processes which share a common console window,
e.g., some subprocesses. Any other value for `sig' will cause the process
to be unconditionally killed by the TerminateProcess API, and the exit code
will be set to `sig'.

@ref{1336,,signal.pthread_kill()}도 참조하십시오.

@code{pid}, @code{sig}를 인자로 @ref{1c6c,,감사 이벤트(auditing event)} @code{os.kill}을 발생시킵니다.

@ref{213c,,가용성}: Unix, Windows, not WASI, not iOS.


버전 3.2에서 변경: 윈도우 지원이 추가되었습니다.

@end deffn

@geindex killpg() (os 모듈)
@anchor{library/os os killpg}@anchor{1db8}
@deffn {함수} os.killpg (pgid, sig, /)

@geindex process;killing
@geindex process;signalling

시그널 `sig' 를 프로세스 그룹 `pgid' 로 보냅니다.

@code{pgid}, @code{sig}를 인자로 @ref{1c6c,,감사 이벤트(auditing event)} @code{os.killpg}를 발생시킵니다.

@ref{213c,,가용성}: Unix, not WASI, not iOS.
@end deffn

@geindex nice() (os 모듈)
@anchor{library/os os nice}@anchor{1306}
@deffn {함수} os.nice (increment, /)

프로세스의 “우선도(niceness)”에 `increment' 를 추가합니다. 새로운 우선도를 반환합니다.

@ref{213c,,가용성}: Unix, not WASI.
@end deffn

@geindex pidfd_open() (os 모듈)
@anchor{library/os os pidfd_open}@anchor{6a3}
@deffn {함수} os.pidfd_open (pid, flags=0)

Return a file descriptor referring to the process `pid' with `flags' set.
This descriptor can be used to perform process management without races
and signals.

자세한 내용은 @code{pidfd_open(2)@footnote{https://manpages.debian.org/pidfd_open(2)}} 매뉴얼 페이지를 참조하십시오.

@ref{213c,,가용성}: Linux >= 5.3, Android >= @ref{d82,,build-time} API level 31


Added in version 3.9.


@geindex PIDFD_NONBLOCK (os 모듈)
@anchor{library/os os PIDFD_NONBLOCK}@anchor{6c1}
@deffn {데이터} os.PIDFD_NONBLOCK

This flag indicates that the file descriptor will be non-blocking.
If the process referred to by the file descriptor has not yet terminated,
then an attempt to wait on the file descriptor using @code{waitid(2)@footnote{https://manpages.debian.org/waitid(2)}}
will immediately return the error @ref{2703,,EAGAIN} rather than blocking.
@end deffn

@ref{213c,,가용성}: Linux >= 5.10


Added in version 3.12.

@end deffn

@geindex plock() (os 모듈)
@anchor{library/os os plock}@anchor{30f3}
@deffn {함수} os.plock (op, /)

프로그램 세그먼트를 메모리에 잠급니다. (@code{<sys/lock.h>}에서 정의된) `op' 값은 잠기는 세그먼트를 판별합니다.

@ref{213c,,가용성}: Unix, not WASI, not iOS.
@end deffn

@geindex popen() (os 모듈)
@anchor{library/os os popen}@anchor{31a}
@deffn {함수} os.popen (cmd, mode='r', buffering=-1)

Open a pipe to or from command `cmd'.
The return value is an open file object
connected to the pipe, which can be read or written depending on whether `mode'
is @code{'r'} (default) or @code{'w'}.
The `buffering' argument have the same meaning as
the corresponding argument to the built-in @ref{316,,open()} function. The
returned file object reads or writes text strings rather than bytes.

@code{close} 메서드는 자식 프로세스가 성공적으로 종료되면 @ref{884,,None}을 반환하고, 에러가 있으면 자식 프로세스가 반환한 코드를 반환합니다. POSIX 시스템에서, 반환 코드가 양수면, 프로세스의 반환 값을 1바이트 왼쪽으로 시프트 한 값을 나타냅니다. 반환 코드가 음수면, 음의 반환 코드로 주어진 시그널에 의해 강제 종료된 것입니다. 예를 들어, 자식 프로세스가 죽었을(kill) 때 반환 값은 @code{- signal.SIGKILL} 일 수 있습니다. 윈도우 시스템에서, 반환 값은 자식 프로세스의 부호 있는 정수 반환 코드를 포함합니다.

유닉스에서, @ref{b17,,waitstatus_to_exitcode()}는 @code{None}이 아닐 때 @code{close} 메서드 결과(종료 상태)를 종료 코드로 변환하는 데 사용할 수 있습니다. 윈도우에서, @code{close} 메서드 결과는 직접 종료 코드(또는 @code{None})입니다.

이것은 @ref{4b8,,subprocess.Popen}를 사용하여 구현됩니다; 자식 프로세스를 관리하고 통신하는 보다 강력한 방법에 대해서는 이 클래스의 설명서를 참조하십시오.

@ref{213c,,가용성}: not WASI, not Android, not iOS.

@cartouche
@quotation 참고 
The @ref{865,,Python UTF-8 Mode} affects encodings used
for `cmd' and pipe contents.

@code{popen()} is a simple wrapper around @ref{4b8,,subprocess.Popen}.
Use @code{subprocess.Popen} or @ref{d7e,,subprocess.run()} to
control options like encodings.
@end quotation
@end cartouche


버전 3.14부터 폐지됨: The function is @ref{23d,,soft deprecated} and should no longer be used to
write new code. The @ref{dc,,subprocess} module is recommended instead.

@end deffn

@geindex posix_spawn() (os 모듈)
@anchor{library/os os posix_spawn}@anchor{52e}
@deffn {함수} os.posix_spawn (path, argv, env, *, file_actions=None, setpgroup=None, resetids=False, setsid=False, setsigmask=(), setsigdef=(), scheduler=None)

Wraps the @code{posix_spawn()} C library API for use from Python.

대부분 사용자는 @ref{52e,,posix_spawn()} 대신 @ref{d7e,,subprocess.run()}을 사용해야 합니다.

The positional-only arguments `path', `args', and `env' are similar to
@ref{12fe,,execve()}. `env' is allowed to be @code{None}, in which case current
process’ environment is used.

`path' 매개 변수는 실행 파일의 경로입니다. `path'에는 디렉터리가 있어야 합니다. 디렉터리 없이 실행 파일을 전달하려면 @ref{1769,,posix_spawnp()}를 사용하십시오.

`file_actions' 인자는 C 라이브러리 구현의 @code{fork()}와 @code{exec()} 단계 사이의 자식 프로세스에서 특정 파일 기술자에 취할 동작을 설명하는 튜플의 시퀀스 일 수 있습니다. 각 튜플의 첫 번째 항목은 나머지 튜플 요소를 설명하는, 아래에 나열된 세 가지 형 지시자 중 하나여야 합니다:

@geindex POSIX_SPAWN_OPEN (os 모듈)
@anchor{library/os os POSIX_SPAWN_OPEN}@anchor{30f4}
@deffn {데이터} os.POSIX_SPAWN_OPEN

(@code{os.POSIX_SPAWN_OPEN}, `fd', `path', `flags', `mode')

@code{os.dup2(os.open(path, flags, mode), fd)}를 수행합니다.
@end deffn

@geindex POSIX_SPAWN_CLOSE (os 모듈)
@anchor{library/os os POSIX_SPAWN_CLOSE}@anchor{30f5}
@deffn {데이터} os.POSIX_SPAWN_CLOSE

(@code{os.POSIX_SPAWN_CLOSE}, `fd')

@code{os.close(fd)}를 수행합니다.
@end deffn

@geindex POSIX_SPAWN_DUP2 (os 모듈)
@anchor{library/os os POSIX_SPAWN_DUP2}@anchor{30f6}
@deffn {데이터} os.POSIX_SPAWN_DUP2

(@code{os.POSIX_SPAWN_DUP2}, `fd', `new_fd')

@code{os.dup2(fd, new_fd)}를 수행합니다.
@end deffn

@geindex POSIX_SPAWN_CLOSEFROM (os 모듈)
@anchor{library/os os POSIX_SPAWN_CLOSEFROM}@anchor{52f}
@deffn {데이터} os.POSIX_SPAWN_CLOSEFROM

(@code{os.POSIX_SPAWN_CLOSEFROM}, `fd')

Performs @code{os.closerange(fd, INF)}.
@end deffn

These tuples correspond to the C library
@code{posix_spawn_file_actions_addopen()},
@code{posix_spawn_file_actions_addclose()},
@code{posix_spawn_file_actions_adddup2()}, and
@code{posix_spawn_file_actions_addclosefrom_np()} API calls used to prepare
for the @code{posix_spawn()} call itself.

The `setpgroup' argument will set the process group of the child to the value
specified. If the value specified is 0, the child’s process group ID will be
made the same as its process ID. If the value of `setpgroup' is not set, the
child will inherit the parent’s process group ID. This argument corresponds
to the C library @code{POSIX_SPAWN_SETPGROUP} flag.

If the `resetids' argument is @code{True} it will reset the effective UID and
GID of the child to the real UID and GID of the parent process. If the
argument is @code{False}, then the child retains the effective UID and GID of
the parent. In either case, if the set-user-ID and set-group-ID permission
bits are enabled on the executable file, their effect will override the
setting of the effective UID and GID. This argument corresponds to the C
library @code{POSIX_SPAWN_RESETIDS} flag.

If the `setsid' argument is @code{True}, it will create a new session ID
for @code{posix_spawn}. `setsid' requires @code{POSIX_SPAWN_SETSID}
or @code{POSIX_SPAWN_SETSID_NP} flag. Otherwise, @ref{36b,,NotImplementedError}
is raised.

The `setsigmask' argument will set the signal mask to the signal set
specified. If the parameter is not used, then the child inherits the
parent’s signal mask. This argument corresponds to the C library
@code{POSIX_SPAWN_SETSIGMASK} flag.

The `sigdef' argument will reset the disposition of all signals in the set
specified. This argument corresponds to the C library
@code{POSIX_SPAWN_SETSIGDEF} flag.

The `scheduler' argument must be a tuple containing the (optional) scheduler
policy and an instance of @ref{1911,,sched_param} with the scheduler parameters.
A value of @code{None} in the place of the scheduler policy indicates that is
not being provided. This argument is a combination of the C library
@code{POSIX_SPAWN_SETSCHEDPARAM} and @code{POSIX_SPAWN_SETSCHEDULER}
flags.

@code{path}, @code{argv}, @code{env}를 인자로 @ref{1c6c,,감사 이벤트(auditing event)} @code{os.posix_spawn}을 발생시킵니다.


Added in version 3.8.



버전 3.13에서 변경: `env' parameter accepts @code{None}.
@code{os.POSIX_SPAWN_CLOSEFROM} is available on platforms where
@code{posix_spawn_file_actions_addclosefrom_np()} exists.


@ref{213c,,가용성}: Unix, not WASI, not Android, not iOS.
@end deffn

@geindex posix_spawnp() (os 모듈)
@anchor{library/os os posix_spawnp}@anchor{1769}
@deffn {함수} os.posix_spawnp (path, argv, env, *, file_actions=None, setpgroup=None, resetids=False, setsid=False, setsigmask=(), setsigdef=(), scheduler=None)

Wraps the @code{posix_spawnp()} C library API for use from Python.

시스템이 (@code{execvp(3)}과 같은 방식으로) 
@geindex PATH
@geindex 환경 변수; PATH
@code{PATH} 환경 변수에 의해 지정된 디렉터리 목록에서 `실행' 파일을 검색한다는 점을 제외하고는 @ref{52e,,posix_spawn()}과 유사합니다.

@code{path}, @code{argv}, @code{env}를 인자로 @ref{1c6c,,감사 이벤트(auditing event)} @code{os.posix_spawn}을 발생시킵니다.


Added in version 3.8.


@ref{213c,,가용성}: POSIX, not WASI, not Android, not iOS.

See @ref{52e,,posix_spawn()} documentation.
@end deffn

@geindex register_at_fork() (os 모듈)
@anchor{library/os os register_at_fork}@anchor{355}
@deffn {함수} os.register_at_fork (*, before=None, after_in_parent=None, after_in_child=None)

@ref{4b6,,os.fork()} 또는 유사한 프로세스 복제 API를 사용하여 새 자식 프로세스가 포크 될 때 실행될 콜러블들을 등록합니다. 매개 변수는 선택적이며 키워드 전용입니다. 각각은 다른 호출 지점을 지정합니다.


@itemize *

@item 
`before' 는 자식 프로세스를 포크 하기 전에 호출되는 함수입니다.

@item 
`after_in_parent' 는 자식 프로세스를 포크 한 후에 부모 프로세스에서 호출되는 함수입니다.

@item 
`after_in_child' 는 자식 프로세스에서 호출되는 함수입니다.
@end itemize

이러한 호출은 제거가 파이썬 인터프리터로 반환될 것으로 예상되는 경우에만 수행됩니다. 일반적인 @ref{dc,,subprocess} 실행은 자식이 인터프리터로 재진입하지 않기 때문에, 이 호출들이 일어나지 않습니다.

포크 이전에 실행되도록 등록된 함수는 등록 역순으로 실행됩니다. 포크 후에 실행되도록 등록된 함수(부모나 자식 모두)는 등록 순서로 호출됩니다.

제삼자 C 코드에 의한 @code{fork()} 호출은, 그것이 명시적으로 @ref{db7,,PyOS_BeforeFork()}, @ref{db8,,PyOS_AfterFork_Parent()} 및 @ref{430,,PyOS_AfterFork_Child()}를 호출하지 않는 한, 이 함수들을 호출하지 않습니다.

함수 등록을 취소할 방법은 없습니다.

@ref{213c,,가용성}: Unix, not WASI, not Android, not iOS.


Added in version 3.7.

@end deffn

@geindex spawnl() (os 모듈)
@geindex spawnle() (os 모듈)
@geindex spawnlp() (os 모듈)
@geindex spawnlpe() (os 모듈)
@geindex spawnv() (os 모듈)
@geindex spawnve() (os 모듈)
@geindex spawnvp() (os 모듈)
@geindex spawnvpe() (os 모듈)
@anchor{library/os os spawnl}@anchor{31b}
@deffn {함수} os.spawnl (mode, path, ...)
@anchor{library/os os spawnle}@anchor{30f7}
@deffnx {함수} os.spawnle (mode, path, ..., env)
@anchor{library/os os spawnlp}@anchor{30f8}
@deffnx {함수} os.spawnlp (mode, file, ...)
@anchor{library/os os spawnlpe}@anchor{30f9}
@deffnx {함수} os.spawnlpe (mode, file, ..., env)
@anchor{library/os os spawnv}@anchor{30fa}
@deffnx {함수} os.spawnv (mode, path, args)
@anchor{library/os os spawnve}@anchor{30fb}
@deffnx {함수} os.spawnve (mode, path, args, env)
@anchor{library/os os spawnvp}@anchor{30fc}
@deffnx {함수} os.spawnvp (mode, file, args)
@anchor{library/os os spawnvpe}@anchor{30fd}
@deffnx {함수} os.spawnvpe (mode, file, args, env)

새 프로세스에서 프로그램 `path' 를 실행합니다.

(@ref{dc,,subprocess} 모듈은 새 프로세스를 생성하고 결과를 조회하는데, 더욱 강력한 기능을 제공합니다; 이 모듈을 사용하는 것이 이 함수들을 사용하는 것보다 더 바람직합니다. 특히 @ref{138d,,Replacing Older Functions with the subprocess Module} 섹션을 확인하십시오.)

`mode' 가 @ref{30fe,,P_NOWAIT}면, 이 함수는 새 프로세스의 프로세스 ID를 반환합니다; `mode'가 @ref{30ff,,P_WAIT}면, 종료 코드(정상적으로 종료했을 때)나 @code{-signal}(`signal'은 프로세스를 죽인 시그널입니다)을 반환합니다. 윈도우에서, 프로세스 ID는 실제로 프로세스 핸들이므로, @ref{f99,,waitpid()} 함수에 사용할 수 있습니다.

VxWorks에서, 이 함수는 새로운 프로세스가 죽을(kill) 때 @code{-signal}을 반환하지 않습니다. 대신 OSError 예외가 발생합니다.

The “l” and “v” variants of the @code{spawn*} functions differ in how
command-line arguments are passed.  The “l” variants are perhaps the easiest
to work with if the number of parameters is fixed when the code is written; the
individual parameters simply become additional parameters to the
@code{spawnl*()} functions.  The “v” variants are good when the number of
parameters is variable, with the arguments being passed in a list or tuple as
the `args' parameter.  In either case, the arguments to the child process must
start with the name of the command being run.

끝 근처에 두 번째 “p”가 포함된 변형(@ref{30f8,,spawnlp()}, @ref{30f9,,spawnlpe()}, @ref{30fc,,spawnvp()} 및 @ref{30fd,,spawnvpe()})은 
@geindex PATH
@geindex 환경 변수; PATH
@code{PATH} 환경 변수를 사용하여 프로그램 `file' 을 찾습니다. 환경이 대체 될 때 (다음 단락에서 설명할 @ref{31b,,spawn*e} 변형 중 하나를 사용하여), 새 환경이 
@geindex PATH
@geindex 환경 변수; PATH
@code{PATH} 변수의 소스로 사용됩니다. 다른 변형 @code{spawnl()}, @ref{30f7,,spawnle()}, @ref{30fa,,spawnv()} 및 @ref{30fb,,spawnve()}는 
@geindex PATH
@geindex 환경 변수; PATH
@code{PATH} 변수를 사용하여 실행 파일을 찾지 않습니다; `path' 에는 반드시 적절한 절대 또는 상대 경로가 있어야 합니다.

@ref{30f7,,spawnle()}, @ref{30f9,,spawnlpe()}, @ref{30fb,,spawnve()} 및 @ref{30fd,,spawnvpe()}의 경우 (모두 “e”로 끝납니다), `env' 매개 변수는 새 프로세스의 환경 변수를 정의하는 데 사용되는 매핑이어야 합니다 (이것이 현재 프로세스의 환경 대신 사용됩니다); 함수 @ref{31b,,spawnl()}, @ref{30f8,,spawnlp()}, @ref{30fa,,spawnv()} 및 @ref{30fc,,spawnvp()}는 모두 새 프로세스가 현재 프로세스의 환경을 상속하게 합니다. `env' 딕셔너리의 키와 값은 반드시 문자열이어야 함에 주의하십시오; 잘못된 키나 값은 반환 값 @code{127}로 함수가 실패하게 합니다.

예를 들어, @ref{30f8,,spawnlp()} 및 @ref{30fd,,spawnvpe()}에 대한 다음 호출은 동등합니다:

@example
import os
os.spawnlp(os.P_WAIT, 'cp', 'cp', 'index.html', '/dev/null')

L = ['cp', 'index.html', '/dev/null']
os.spawnvpe(os.P_WAIT, 'cp', L, os.environ)
@end example

@code{mode}, @code{path}, @code{args}, @code{env}를 인자로 @ref{1c6c,,감사 이벤트(auditing event)} @code{os.spawn}을 발생시킵니다.

@ref{213c,,가용성}: Unix, Windows, not WASI, not Android, not iOS.

@code{spawnlp()}, @code{spawnlpe()}, @code{spawnvp()}
and @code{spawnvpe()} are not available on Windows.  @code{spawnle()} and
@code{spawnve()} are not thread-safe on Windows; we advise you to use the
@ref{dc,,subprocess} module instead.


버전 3.6에서 변경: @ref{5a0,,경로류 객체}를 받아들입니다.



버전 3.14부터 폐지됨: These functions are @ref{23d,,soft deprecated} and should no longer be used
to write new code. The @ref{dc,,subprocess} module is recommended instead.

@end deffn

@geindex P_NOWAIT (os 모듈)
@geindex P_NOWAITO (os 모듈)
@anchor{library/os os P_NOWAIT}@anchor{30fe}
@deffn {데이터} os.P_NOWAIT
@anchor{library/os os P_NOWAITO}@anchor{3100}
@deffnx {데이터} os.P_NOWAITO

Possible values for the `mode' parameter to the @ref{31b,,spawn*} family of
functions.  If either of these values is given, the @code{spawn*} functions
will return as soon as the new process has been created, with the process id as
the return value.

@ref{213c,,가용성}: Unix, Windows.
@end deffn

@geindex P_WAIT (os 모듈)
@anchor{library/os os P_WAIT}@anchor{30ff}
@deffn {데이터} os.P_WAIT

Possible value for the `mode' parameter to the @ref{31b,,spawn*} family of
functions.  If this is given as `mode', the @code{spawn*} functions will not
return until the new process has run to completion and will return the exit code
of the process the run is successful, or @code{-signal} if a signal kills the
process.

@ref{213c,,가용성}: Unix, Windows.
@end deffn

@geindex P_DETACH (os 모듈)
@geindex P_OVERLAY (os 모듈)
@anchor{library/os os P_DETACH}@anchor{3101}
@deffn {데이터} os.P_DETACH
@anchor{library/os os P_OVERLAY}@anchor{3102}
@deffnx {데이터} os.P_OVERLAY

@ref{31b,,spawn*} 계열 함수의 `mode' 매개 변수에 사용할 수 있는 값. 이들은 위에 나열된 것보다 이식성이 낮습니다. @ref{3101,,P_DETACH}는 @ref{30fe,,P_NOWAIT}와 비슷하지만, 새 프로세스는 호출 프로세스의 콘솔에서 분리됩니다. @ref{3102,,P_OVERLAY}가 사용되면, 현재 프로세스가 대체됩니다; @code{spawn*} 함수가 반환되지 않습니다.

@ref{213c,,가용성}: Windows.
@end deffn

@geindex startfile() (os 모듈)
@anchor{library/os os startfile}@anchor{1c80}
@deffn {함수} os.startfile (path[, operation][, arguments][, cwd][, show_cmd])

연관된 응용 프로그램으로 파일을 시작합니다.

When `operation' is not specified, this acts like double-clicking
the file in Windows Explorer, or giving the file name as an argument to the
@code{start} command from the interactive command shell: the file is opened
with whatever application (if any) its extension is associated.

When another `operation' is given, it must be a “command verb” that specifies
what should be done with the file. Common verbs documented by Microsoft are @code{'open'},
@code{'print'} and  @code{'edit'} (to be used on files) as well as @code{'explore'} and
@code{'find'} (to be used on directories).

When launching an application, specify `arguments' to be passed as a single
string. This argument may have no effect when using this function to launch a
document.

The default working directory is inherited, but may be overridden by the `cwd'
argument. This should be an absolute path. A relative `path' will be resolved
against this argument.

Use `show_cmd' to override the default window style. Whether this has any
effect will depend on the application being launched. Values are integers as
supported by the Win32 @code{ShellExecute()} function.

@code{startfile()} returns as soon as the associated application is launched.
There is no option to wait for the application to close, and no way to retrieve
the application’s exit status.  The `path' parameter is relative to the current
directory or `cwd'.  If you want to use an absolute path, make sure the first
character is not a slash (@code{'/'})  Use @ref{a8,,pathlib} or the
@ref{151e,,os.path.normpath()} function to ensure that paths are properly encoded for
Win32.

To reduce interpreter startup overhead, the Win32 @code{ShellExecute()}
function is not resolved until this function is first called.  If the function
cannot be resolved, @ref{36b,,NotImplementedError} will be raised.

@code{path}, @code{operation}을 인자로 @ref{1c6c,,감사 이벤트(auditing event)} @code{os.startfile}을 발생시킵니다.

Raises an @ref{1c6c,,auditing event} @code{os.startfile/2} with arguments @code{path}, @code{operation}, @code{arguments}, @code{cwd}, @code{show_cmd}.

@ref{213c,,가용성}: Windows.


버전 3.10에서 변경: Added the `arguments', `cwd' and `show_cmd' arguments, and the
@code{os.startfile/2} audit event.

@end deffn

@geindex system() (os 모듈)
@anchor{library/os os system}@anchor{1662}
@deffn {함수} os.system (command)

Execute the command (a string) in a subshell.  This is implemented by calling
the Standard C function @code{system()}, and has the same limitations.
Changes to @ref{75e,,sys.stdin}, etc. are not reflected in the environment of
the executed command. If `command' generates any output, it will be sent to
the interpreter standard output stream. The C standard does not
specify the meaning of the return value of the C function, so the return
value of the Python function is system-dependent.

On Unix, the return value is the exit status of the process encoded in the
format specified for @ref{f97,,wait()}.

윈도우에서, 반환 값은 `command'를 실행한 후 시스템 셸에서 반환한 값입니다. 셸은 윈도우 환경 변수 
@geindex COMSPEC
@geindex 환경 변수; COMSPEC
@code{COMSPEC}에 의해 제공됩니다: 보통 @code{cmd.exe}인데, 명령 실행의 종료 상태를 반환합니다; 기본이 아닌 셸을 사용하는 시스템에서는 셸 설명서를 참조하십시오.

The @ref{dc,,subprocess} module provides more powerful facilities for spawning
new processes and retrieving their results; using that module is recommended
to using this function.  See the @ref{138d,,Replacing Older Functions with the subprocess Module} section in
the @code{subprocess} documentation for some helpful recipes.

유닉스에서, @ref{b17,,waitstatus_to_exitcode()}를 사용하여 결과(종료 상태)를 종료 코드로 변환할 수 있습니다. 윈도우에서, 결과는 직접 종료 코드입니다.

@code{command}를 인자로 @ref{1c6c,,감사 이벤트(auditing event)} @code{os.system}을 발생시킵니다.

@ref{213c,,가용성}: Unix, Windows, not WASI, not Android, not iOS.
@end deffn

@geindex times() (os 모듈)
@anchor{library/os os times}@anchor{131a}
@deffn {함수} os.times ()

현재 전역 프로세스 시간을 반환합니다. 반환 값은 5가지 어트리뷰트를 가진 객체입니다:


@itemize *

@item 
@code{user} - user time

@item 
@code{system} - system time

@item 
@code{children_user} - user time of all child processes

@item 
@code{children_system} - system time of all child processes

@item 
@code{elapsed} - elapsed real time since a fixed point in the past
@end itemize

For backwards compatibility, this object also behaves like a five-tuple
containing @code{user}, @code{system}, @code{children_user},
@code{children_system}, and @code{elapsed} in that order.

See the Unix manual page
@code{times(2)@footnote{https://manpages.debian.org/times(2)}} and times(3)@footnote{https://man.freebsd.org/cgi/man.cgi?time(3)} manual page on Unix or the GetProcessTimes MSDN@footnote{https://docs.microsoft.com/windows/win32/api/processthreadsapi/nf-processthreadsapi-getprocesstimes}
on Windows. On Windows, only @code{user} and @code{system} are known; the other attributes are zero.

@ref{213c,,가용성}: Unix, Windows.


버전 3.3에서 변경: 반환형이 튜플에서 이름이 지정된 어트리뷰트를 가진 튜플류 객체로 변경되었습니다.

@end deffn

@geindex wait() (os 모듈)
@anchor{library/os os wait}@anchor{f97}
@deffn {함수} os.wait ()

자식 프로세스가 완료될 때까지 기다렸다가, pid 및 종료 상태 표시를 포함하는 튜플을 반환합니다: 종료 상태 표시는 16비트 숫자인데, 하위 바이트가 프로세스를 죽인 시그널 번호이고, 상위 바이트가 종료 상태(시그널 번호가 0이면)입니다; 코어 파일이 생성되면 하위 바이트의 상위 비트가 설정됩니다.

If there are no children that could be waited for, @ref{1257,,ChildProcessError}
is raised.

@ref{b17,,waitstatus_to_exitcode()}를 사용하여 종료 상태를 종료 코드로 변환할 수 있습니다.

@ref{213c,,가용성}: Unix, not WASI, not Android, not iOS.


@subsubheading 더 보기


The other @code{wait*()} functions documented below can be used to wait for the
completion of a specific child process and have more options.
@ref{f99,,waitpid()} is the only one also available on Windows.

@end deffn

@geindex waitid() (os 모듈)
@anchor{library/os os waitid}@anchor{f98}
@deffn {함수} os.waitid (idtype, id, options, /)

Wait for the completion of a child process.

`idtype' can be @ref{3103,,P_PID}, @ref{3104,,P_PGID}, @ref{3105,,P_ALL}, or (on Linux) @ref{b16,,P_PIDFD}.
The interpretation of `id' depends on it; see their individual descriptions.

`options' is an OR combination of flags.  At least one of @ref{3106,,WEXITED},
@ref{3107,,WSTOPPED} or @ref{3108,,WCONTINUED} is required;
@ref{3109,,WNOHANG} and @ref{310a,,WNOWAIT} are additional optional flags.

The return value is an object representing the data contained in the
@code{siginfo_t} structure with the following attributes:


@itemize *

@item 
@code{si_pid} (process ID)

@item 
@code{si_uid} (real user ID of the child)

@item 
@code{si_signo} (always @ref{310b,,SIGCHLD})

@item 
@code{si_status} (the exit status or signal number, depending on @code{si_code})

@item 
@code{si_code} (see @ref{310c,,CLD_EXITED} for possible values)
@end itemize

If @ref{3109,,WNOHANG} is specified and there are no matching children in the
requested state, @code{None} is returned.
Otherwise, if there are no matching children
that could be waited for, @ref{1257,,ChildProcessError} is raised.

@ref{213c,,가용성}: Unix, not WASI, not Android, not iOS.


Added in version 3.3.



버전 3.13에서 변경: This function is now available on macOS as well.

@end deffn

@geindex waitpid() (os 모듈)
@anchor{library/os os waitpid}@anchor{f99}
@deffn {함수} os.waitpid (pid, options, /)

이 함수의 세부 사항은 유닉스 및 윈도우에서 다릅니다.

유닉스에서: 프로세스 ID `pid'에 의해 주어진 자식 프로세스의 완료를 기다리고, 프로세스 ID와 종료 상태 표시(@ref{f97,,wait()}처럼 인코딩됨)를 포함하는 튜플을 반환합니다. 호출의 의미는 정수 `options' 의 값에 영향을 받는데, 일반 작업의 경우 @code{0} 이어야 합니다.

`pid' 가 @code{0}보다 크면, @ref{f99,,waitpid()}는 해당 프로세스에 대한 상태 정보를 요청합니다. `pid' 가 @code{0}이면, 현재 프로세스의 프로세스 그룹에 있는 모든 자식의 상태를 요청합니다. `pid' 가 @code{-1}이면, 현재 프로세스의 모든 자식의 상태를 요청합니다. `pid' 가 @code{-1}보다 작으면, 프로세스 그룹 @code{-pid}(`pid' 의 절댓값)에 있는 모든 프로세스의 상태를 요청합니다.

`options' is an OR combination of flags.  If it contains @ref{3109,,WNOHANG} and
there are no matching children in the requested state, @code{(0, 0)} is
returned.  Otherwise, if there are no matching children that could be waited
for, @ref{1257,,ChildProcessError} is raised.  Other options that can be used are
@ref{310d,,WUNTRACED} and @ref{3108,,WCONTINUED}.

윈도우에서: 프로세스 핸들 `pid'로 지정된 프로세스가 완료될 때까지 기다리고, `pid'와 종료 상태를 8비트 왼쪽으로 시프트 한 값을 포함하는 튜플을 반환합니다 (시프팅이 함수를 더 이식성 있게 만듭니다). @code{0}보다 작거나 같은 `pid' 는 윈도우에서 특별한 의미가 없고 예외가 발생합니다. 정수 `options' 의 값은 아무 효과가 없습니다. `pid' 는 id가 알려진 모든 프로세스를 가리킬 수 있습니다, 반드시 자식 프로세스일 필요는 없습니다. @ref{30fe,,P_NOWAIT}로 호출된 @ref{31b,,spawn*} 함수는 적절한 프로세스 핸들을 반환합니다.

@ref{b17,,waitstatus_to_exitcode()}를 사용하여 종료 상태를 종료 코드로 변환할 수 있습니다.

@ref{213c,,가용성}: Unix, Windows, not WASI, not Android, not iOS.


버전 3.5에서 변경: 시스템 호출이 인터럽트 되고 시그널 처리기가 예외를 발생시키지 않으면, 함수는 이제 @ref{f87,,InterruptedError} 예외를 일으키는 대신 시스템 호출을 재시도합니다 (이유는 
@geindex Python 향상 제안; PEP 475
PEP 475@footnote{https://peps.python.org/pep-0475/}를 참조하세요).

@end deffn

@geindex wait3() (os 모듈)
@anchor{library/os os wait3}@anchor{f95}
@deffn {함수} os.wait3 (options)

Similar to @ref{f99,,waitpid()}, except no process id argument is given and a
3-element tuple containing the child’s process id, exit status indication,
and resource usage information is returned.  Refer to
@ref{1636,,resource.getrusage()} for details on resource usage information.  The
`options' argument is the same as that provided to @code{waitpid()} and
@ref{f96,,wait4()}.

@ref{b17,,waitstatus_to_exitcode()}를 사용하여 종료 상태를 종료 코드로 변환할 수 있습니다.

@ref{213c,,가용성}: Unix, not WASI, not Android, not iOS.
@end deffn

@geindex wait4() (os 모듈)
@anchor{library/os os wait4}@anchor{f96}
@deffn {함수} os.wait4 (pid, options)

Similar to @ref{f99,,waitpid()}, except a 3-element tuple, containing the child’s
process id, exit status indication, and resource usage information is
returned.  Refer to @ref{1636,,resource.getrusage()} for details on resource usage
information.  The arguments to @code{wait4()} are the same as those provided
to @code{waitpid()}.

@ref{b17,,waitstatus_to_exitcode()}를 사용하여 종료 상태를 종료 코드로 변환할 수 있습니다.

@ref{213c,,가용성}: Unix, not WASI, not Android, not iOS.
@end deffn

@geindex P_PID (os 모듈)
@geindex P_PGID (os 모듈)
@geindex P_ALL (os 모듈)
@geindex P_PIDFD (os 모듈)
@anchor{library/os os P_PID}@anchor{3103}
@deffn {데이터} os.P_PID
@anchor{library/os os P_PGID}@anchor{3104}
@deffnx {데이터} os.P_PGID
@anchor{library/os os P_ALL}@anchor{3105}
@deffnx {데이터} os.P_ALL
@anchor{library/os os P_PIDFD}@anchor{b16}
@deffnx {데이터} os.P_PIDFD

These are the possible values for `idtype' in @ref{f98,,waitid()}. They affect
how `id' is interpreted:


@itemize *

@item 
@code{P_PID} - wait for the child whose PID is `id'.

@item 
@code{P_PGID} - wait for any child whose progress group ID is `id'.

@item 
@code{P_ALL} - wait for any child; `id' is ignored.

@item 
@code{P_PIDFD} - wait for the child identified by the file descriptor
`id' (a process file descriptor created with @ref{6a3,,pidfd_open()}).
@end itemize

@ref{213c,,가용성}: Unix, not WASI, not Android, not iOS.

@cartouche
@quotation 참고 
@code{P_PIDFD} is only available on Linux >= 5.4.
@end quotation
@end cartouche


Added in version 3.3.



Added in version 3.9: The @code{P_PIDFD} constant.

@end deffn

@geindex WCONTINUED (os 모듈)
@anchor{library/os os WCONTINUED}@anchor{3108}
@deffn {데이터} os.WCONTINUED

This `options' flag for @ref{f99,,waitpid()}, @ref{f95,,wait3()}, @ref{f96,,wait4()}, and
@ref{f98,,waitid()} causes child processes to be reported if they have been
continued from a job control stop since they were last reported.

@ref{213c,,가용성}: Unix, not WASI, not Android, not iOS.
@end deffn

@geindex WEXITED (os 모듈)
@anchor{library/os os WEXITED}@anchor{3106}
@deffn {데이터} os.WEXITED

This `options' flag for @ref{f98,,waitid()} causes child processes that have terminated to
be reported.

The other @code{wait*} functions always report children that have terminated,
so this option is not available for them.

@ref{213c,,가용성}: Unix, not WASI, not Android, not iOS.


Added in version 3.3.

@end deffn

@geindex WSTOPPED (os 모듈)
@anchor{library/os os WSTOPPED}@anchor{3107}
@deffn {데이터} os.WSTOPPED

This `options' flag for @ref{f98,,waitid()} causes child processes that have been stopped
by the delivery of a signal to be reported.

This option is not available for the other @code{wait*} functions.

@ref{213c,,가용성}: Unix, not WASI, not Android, not iOS.


Added in version 3.3.

@end deffn

@geindex WUNTRACED (os 모듈)
@anchor{library/os os WUNTRACED}@anchor{310d}
@deffn {데이터} os.WUNTRACED

This `options' flag for @ref{f99,,waitpid()}, @ref{f95,,wait3()}, and @ref{f96,,wait4()} causes
child processes to also be reported if they have been stopped but their
current state has not been reported since they were stopped.

This option is not available for @ref{f98,,waitid()}.

@ref{213c,,가용성}: Unix, not WASI, not Android, not iOS.
@end deffn

@geindex WNOHANG (os 모듈)
@anchor{library/os os WNOHANG}@anchor{3109}
@deffn {데이터} os.WNOHANG

This `options' flag causes @ref{f99,,waitpid()}, @ref{f95,,wait3()}, @ref{f96,,wait4()}, and
@ref{f98,,waitid()} to return right away if no child process status is available
immediately.

@ref{213c,,가용성}: Unix, not WASI, not Android, not iOS.
@end deffn

@geindex WNOWAIT (os 모듈)
@anchor{library/os os WNOWAIT}@anchor{310a}
@deffn {데이터} os.WNOWAIT

This `options' flag causes @ref{f98,,waitid()} to leave the child in a waitable state, so that
a later @code{wait*()} call can be used to retrieve the child status information again.

This option is not available for the other @code{wait*} functions.

@ref{213c,,가용성}: Unix, not WASI, not Android, not iOS.
@end deffn

@geindex CLD_EXITED (os 모듈)
@geindex CLD_KILLED (os 모듈)
@geindex CLD_DUMPED (os 모듈)
@geindex CLD_TRAPPED (os 모듈)
@geindex CLD_STOPPED (os 모듈)
@geindex CLD_CONTINUED (os 모듈)
@anchor{library/os os CLD_EXITED}@anchor{310c}
@deffn {데이터} os.CLD_EXITED
@anchor{library/os os CLD_KILLED}@anchor{b14}
@deffnx {데이터} os.CLD_KILLED
@anchor{library/os os CLD_DUMPED}@anchor{310e}
@deffnx {데이터} os.CLD_DUMPED
@anchor{library/os os CLD_TRAPPED}@anchor{310f}
@deffnx {데이터} os.CLD_TRAPPED
@anchor{library/os os CLD_STOPPED}@anchor{b15}
@deffnx {데이터} os.CLD_STOPPED
@anchor{library/os os CLD_CONTINUED}@anchor{3110}
@deffnx {데이터} os.CLD_CONTINUED

These are the possible values for @code{si_code} in the result returned by
@ref{f98,,waitid()}.

@ref{213c,,가용성}: Unix, not WASI, not Android, not iOS.


Added in version 3.3.



버전 3.9에서 변경: @ref{b14,,CLD_KILLED}와 @ref{b15,,CLD_STOPPED} 값을 추가했습니다.

@end deffn

@geindex waitstatus_to_exitcode() (os 모듈)
@anchor{library/os os waitstatus_to_exitcode}@anchor{b17}
@deffn {함수} os.waitstatus_to_exitcode (status)

대기 상태(wait status)를 종료 코드로 변환합니다.

유닉스에서:


@itemize *

@item 
프로세스가 정상적으로 종료되면 (@code{WIFEXITED(status)}가 참이면), 프로세스 종료 상태를 반환합니다 (@code{WEXITSTATUS(status)}를 반환합니다): 결과는 0보다 크거나 같습니다.

@item 
프로세스가 시그널에 의해 종료되면 (@code{WIFSIGNALED(status)}가 참이면), @code{-signum}을 반환합니다, 여기서 `signum'은 프로세스를 종료시킨 시그널 번호입니다 (@code{-WTERMSIG(status)}를 반환합니다): 결과는 0보다 작습니다.

@item 
그렇지 않으면, @ref{2ec,,ValueError}를 발생시킵니다.
@end itemize

윈도우에서, 8비트만큼 오른쪽으로 시프트된 `status'를 반환합니다.

유닉스에서, 프로세스가 추적되고 있거나 @ref{f99,,waitpid()}가 @ref{310d,,WUNTRACED} 옵션으로 호출되었으면, 호출자는 먼저 @code{WIFSTOPPED(status)}가 참인지 확인해야 합니다. @code{WIFSTOPPED(status)}가 참이면 이 함수를 호출하면 안 됩니다.


@subsubheading 더 보기


@ref{3111,,WIFEXITED()}, @ref{3112,,WEXITSTATUS()}, @ref{3113,,WIFSIGNALED()}, @ref{3114,,WTERMSIG()}, @ref{3115,,WIFSTOPPED()}, @ref{3116,,WSTOPSIG()} 함수.


@ref{213c,,가용성}: Unix, Windows, not WASI, not Android, not iOS.


Added in version 3.9.

@end deffn

다음 함수들은 @ref{1662,,system()}, @ref{f97,,wait()} 또는 @ref{f99,,waitpid()}에 의해 반환된 프로세스 상태 코드를 매개 변수로 받아들입니다. 이것들은 프로세스의 처리를 결정하는 데 사용될 수 있습니다.

@geindex WCOREDUMP() (os 모듈)
@anchor{library/os os WCOREDUMP}@anchor{3117}
@deffn {함수} os.WCOREDUMP (status, /)

프로세스에 대해 코어 덤프가 생성되었으면 @code{True}를 반환하고, 그렇지 않으면 @code{False}를 반환합니다.

이 함수는 @ref{3113,,WIFSIGNALED()}가 참일 때만 사용해야 합니다.

@ref{213c,,가용성}: Unix, not WASI, not Android, not iOS.
@end deffn

@geindex WIFCONTINUED() (os 모듈)
@anchor{library/os os WIFCONTINUED}@anchor{3118}
@deffn {함수} os.WIFCONTINUED (status)

Return @code{True} if a stopped child has been resumed by delivery of
@ref{3119,,SIGCONT} (if the process has been continued from a job
control stop), otherwise return @code{False}.

@ref{3108,,WCONTINUED} 옵션을 참조하십시오.

@ref{213c,,가용성}: Unix, not WASI, not Android, not iOS.
@end deffn

@geindex WIFSTOPPED() (os 모듈)
@anchor{library/os os WIFSTOPPED}@anchor{3115}
@deffn {함수} os.WIFSTOPPED (status)

시그널의 전달로 인해 프로세스가 중지되었으면 @code{True}를 반환하고, 그렇지 않으면 @code{False}를 반환합니다.

@ref{3115,,WIFSTOPPED()}는 @ref{310d,,WUNTRACED} 옵션을 사용하여 @ref{f99,,waitpid()}을 호출했거나 프로세스가 추적되고 있을 때만 @code{True}를 반환합니다 (@code{ptrace(2)@footnote{https://manpages.debian.org/ptrace(2)}}를 참조하십시오).

@ref{213c,,가용성}: Unix, not WASI, not Android, not iOS.
@end deffn

@geindex WIFSIGNALED() (os 모듈)
@anchor{library/os os WIFSIGNALED}@anchor{3113}
@deffn {함수} os.WIFSIGNALED (status)

시그널로 인해 프로세스가 종료되었으면 @code{True}를 반환하고, 그렇지 않으면 @code{False}를 반환합니다.

@ref{213c,,가용성}: Unix, not WASI, not Android, not iOS.
@end deffn

@geindex WIFEXITED() (os 모듈)
@anchor{library/os os WIFEXITED}@anchor{3111}
@deffn {함수} os.WIFEXITED (status)

프로세스가 정상 종료했으면 @code{True}를 반환합니다, 즉 @code{exit()}나 @code{_exit()}를 호출했거나, @code{main()}에서 반환하여; 그렇지 않으면 @code{False}를 반환합니다.

@ref{213c,,가용성}: Unix, not WASI, not Android, not iOS.
@end deffn

@geindex WEXITSTATUS() (os 모듈)
@anchor{library/os os WEXITSTATUS}@anchor{3112}
@deffn {함수} os.WEXITSTATUS (status)

프로세스 종료 상태를 반환합니다.

이 함수는 @ref{3111,,WIFEXITED()}가 참일 때만 사용해야 합니다.

@ref{213c,,가용성}: Unix, not WASI, not Android, not iOS.
@end deffn

@geindex WSTOPSIG() (os 모듈)
@anchor{library/os os WSTOPSIG}@anchor{3116}
@deffn {함수} os.WSTOPSIG (status)

프로세스를 멈추게 한 시그널을 반환합니다.

이 함수는 @ref{3115,,WIFSTOPPED()}가 참일 때만 사용해야 합니다.

@ref{213c,,가용성}: Unix, not WASI, not Android, not iOS.
@end deffn

@geindex WTERMSIG() (os 모듈)
@anchor{library/os os WTERMSIG}@anchor{3114}
@deffn {함수} os.WTERMSIG (status)

프로세스를 종료시킨 시그널의 번호를 반환합니다.

이 함수는 @ref{3113,,WIFSIGNALED()}가 참일 때만 사용해야 합니다.

@ref{213c,,가용성}: Unix, not WASI, not Android, not iOS.
@end deffn

@node 스케줄러에 대한 인터페이스,기타 시스템 정보,프로세스 관리,os — Miscellaneous operating system interfaces
@anchor{library/os interface-to-the-scheduler}@anchor{311a}
@subsubsection 스케줄러에 대한 인터페이스


이 함수들은 운영 체제가 프로세스에 CPU 시간을 할당하는 방법을 제어합니다. 일부 유닉스 플랫폼에서만 사용할 수 있습니다. 자세한 내용은 유닉스 매뉴얼 페이지를 참조하십시오.


Added in version 3.3.


다음 스케줄 정책은 운영 체제에서 지원하는 경우 공개됩니다.

@geindex SCHED_OTHER (os 모듈)
@anchor{library/os os-scheduling-policy}@anchor{311b}@anchor{library/os os SCHED_OTHER}@anchor{311c}
@deffn {데이터} os.SCHED_OTHER

기본 스케줄 정책.
@end deffn

@geindex SCHED_BATCH (os 모듈)
@anchor{library/os os SCHED_BATCH}@anchor{311d}
@deffn {데이터} os.SCHED_BATCH

컴퓨터의 나머지 부분에서 반응성을 유지하려고 하는 CPU 집약적인 프로세스를 위한 스케줄 정책.
@end deffn

@geindex SCHED_DEADLINE (os 모듈)
@anchor{library/os os SCHED_DEADLINE}@anchor{25d}
@deffn {데이터} os.SCHED_DEADLINE

Scheduling policy for tasks with deadline constraints.


Added in version 3.14.

@end deffn

@geindex SCHED_IDLE (os 모듈)
@anchor{library/os os SCHED_IDLE}@anchor{311e}
@deffn {데이터} os.SCHED_IDLE

매우 낮은 우선순위의 배경 작업에 대한 스케줄 정책.
@end deffn

@geindex SCHED_NORMAL (os 모듈)
@anchor{library/os os SCHED_NORMAL}@anchor{25e}
@deffn {데이터} os.SCHED_NORMAL

Alias for @ref{311c,,SCHED_OTHER}.


Added in version 3.14.

@end deffn

@geindex SCHED_SPORADIC (os 모듈)
@anchor{library/os os SCHED_SPORADIC}@anchor{311f}
@deffn {데이터} os.SCHED_SPORADIC

간헐적인 서버 프로그램을 위한 스케줄 정책.
@end deffn

@geindex SCHED_FIFO (os 모듈)
@anchor{library/os os SCHED_FIFO}@anchor{3120}
@deffn {데이터} os.SCHED_FIFO

선입 선출 (First In First Out) 스케줄 정책.
@end deffn

@geindex SCHED_RR (os 모듈)
@anchor{library/os os SCHED_RR}@anchor{3121}
@deffn {데이터} os.SCHED_RR

라운드 로빈 스케줄 정책.
@end deffn

@geindex SCHED_RESET_ON_FORK (os 모듈)
@anchor{library/os os SCHED_RESET_ON_FORK}@anchor{3122}
@deffn {데이터} os.SCHED_RESET_ON_FORK

이 플래그는 다른 스케줄 정책과 OR 될 수 있습니다. 이 플래그가 설정되어있는 프로세스가 포크 할 때, 자식의 스케줄링 정책 및 우선순위가 기본값으로 재설정됩니다.
@end deffn

@geindex sched_param (os 클래스)
@anchor{library/os os sched_param}@anchor{1911}
@deffn {클래스} os.sched_param (sched_priority)

이 클래스는 @ref{1314,,sched_setparam()}, @ref{1315,,sched_setscheduler()}, 및 @ref{1310,,sched_getparam()}에서 사용되는 튜닝 가능한 스케줄 파라미터를 나타냅니다. 불변입니다.

현재, 가능한 매개 변수는 하나뿐입니다:

@geindex sched_priority (os.sched_param의 속성)
@anchor{library/os os sched_param sched_priority}@anchor{3123}
@deffn {속성} sched_priority

스케줄 정책의 스케줄 우선순위.
@end deffn
@end deffn

@geindex sched_get_priority_min() (os 모듈)
@anchor{library/os os sched_get_priority_min}@anchor{130e}
@deffn {함수} os.sched_get_priority_min (policy)

`policy'의 최소 우선순위 값을 가져옵니다. `policy' 는 위의 스케줄 정책 상수 중 하나입니다.
@end deffn

@geindex sched_get_priority_max() (os 모듈)
@anchor{library/os os sched_get_priority_max}@anchor{130d}
@deffn {함수} os.sched_get_priority_max (policy)

`policy'의 최대 우선순위 값을 가져옵니다. `policy' 는 위의 스케줄 정책 상수 중 하나입니다.
@end deffn

@geindex sched_setscheduler() (os 모듈)
@anchor{library/os os sched_setscheduler}@anchor{1315}
@deffn {함수} os.sched_setscheduler (pid, policy, param, /)

PID가 `pid'인 프로세스의 스케줄 정책을 설정합니다. `pid' 가 0이면, 호출하는 프로세스를 의미합니다. `policy' 는 위의 스케줄 정책 상수 중 하나입니다. `param' 은 @ref{1911,,sched_param} 인스턴스입니다.
@end deffn

@geindex sched_getscheduler() (os 모듈)
@anchor{library/os os sched_getscheduler}@anchor{1311}
@deffn {함수} os.sched_getscheduler (pid, /)

PID가 `pid'인 프로세스의 스케줄 정책을 반환합니다. `pid' 가 0이면, 호출하는 프로세스를 의미합니다. 결과는 위의 스케줄 정책 상수 중 하나입니다.
@end deffn

@geindex sched_setparam() (os 모듈)
@anchor{library/os os sched_setparam}@anchor{1314}
@deffn {함수} os.sched_setparam (pid, param, /)

Set the scheduling parameters for the process with PID `pid'. A `pid' of 0 means
the calling process. `param' is a @ref{1911,,sched_param} instance.
@end deffn

@geindex sched_getparam() (os 모듈)
@anchor{library/os os sched_getparam}@anchor{1310}
@deffn {함수} os.sched_getparam (pid, /)

PID가 `pid'인 프로세스의 스케줄 매개 변수를 @ref{1911,,sched_param} 인스턴스로 반환합니다. `pid' 가 0이면 호출하는 프로세스를 의미합니다.
@end deffn

@geindex sched_rr_get_interval() (os 모듈)
@anchor{library/os os sched_rr_get_interval}@anchor{1312}
@deffn {함수} os.sched_rr_get_interval (pid, /)

PID가 `pid'인 프로세스의 라운드 로빈 퀀텀을 초 단위로 반환합니다. `pid' 가 0이면 호출하는 프로세스를 의미합니다.
@end deffn

@geindex sched_yield() (os 모듈)
@anchor{library/os os sched_yield}@anchor{1316}
@deffn {함수} os.sched_yield ()

Voluntarily relinquish the CPU. See @code{sched_yield(2)@footnote{https://manpages.debian.org/sched_yield(2)}} for details.
@end deffn

@geindex sched_setaffinity() (os 모듈)
@anchor{library/os os sched_setaffinity}@anchor{1313}
@deffn {함수} os.sched_setaffinity (pid, mask, /)

PID가 `pid'인 프로세스(또는 0이면 현재 프로세스)를 CPU 집합으로 제한합니다. `mask' 는 프로세스가 제한되어야 하는 CPU 집합을 나타내는 정수의 이터러블입니다.
@end deffn

@geindex sched_getaffinity() (os 모듈)
@anchor{library/os os sched_getaffinity}@anchor{130f}
@deffn {함수} os.sched_getaffinity (pid, /)

Return the set of CPUs the process with PID `pid' is restricted to.

If `pid' is zero, return the set of CPUs the calling thread of the current
process is restricted to.

See also the @ref{51d,,process_cpu_count()} function.
@end deffn

@node 기타 시스템 정보,난수<2>,스케줄러에 대한 인터페이스,os — Miscellaneous operating system interfaces
@anchor{library/os miscellaneous-system-information}@anchor{3124}@anchor{library/os os-path}@anchor{3125}
@subsubsection 기타 시스템 정보


@geindex confstr() (os 모듈)
@anchor{library/os os confstr}@anchor{18ed}
@deffn {함수} os.confstr (name, /)

문자열 값 시스템 구성 값을 반환합니다. `name' 은 조회할 구성 값을 지정합니다; 정의된 시스템 값의 이름인 문자열일 수 있습니다; 이 이름은 여러 표준(POSIX, 유닉스 95, 유닉스 98 및 기타)에서 지정됩니다. 일부 플랫폼은 추가 이름도 정의합니다. 호스트 운영 체제에 알려진 이름은 @code{confstr_names} 딕셔너리의 키로 제공됩니다. 해당 매핑에 포함되지 않은 구성 변수를 위해, `name'에 정수를 전달하는 것도 허용됩니다.

`name' 으로 지정된 구성 값이 정의되어 있지 않으면, @code{None}이 반환됩니다.

`name' 이 문자열이고 알 수 없으면, @ref{2ec,,ValueError}가 발생합니다. `name'에 대한 특정 값이 호스트 시스템에서 지원되지 않으면, @code{confstr_names}에 포함되어 있어도, 에러 번호 @ref{1dcf,,errno.EINVAL}로 @ref{2c0,,OSError}가 발생합니다.

@ref{213c,,가용성}: Unix.
@end deffn

@geindex confstr_names (os 모듈)
@anchor{library/os os confstr_names}@anchor{3126}
@deffn {데이터} os.confstr_names

@ref{18ed,,confstr()}에서 허용하는 이름을 호스트 운영 체제가 해당 이름에 대해 정의한 정숫값으로 매핑하는 딕셔너리입니다. 이것은 시스템에 알려진 이름 집합을 판별하는 데 사용될 수 있습니다.

@ref{213c,,가용성}: Unix.
@end deffn

@geindex cpu_count() (os 모듈)
@anchor{library/os os cpu_count}@anchor{4db}
@deffn {함수} os.cpu_count ()

Return the number of logical CPUs in the `system'. Returns @code{None} if
undetermined.

The @ref{51d,,process_cpu_count()} function can be used to get the number of
logical CPUs usable by the calling thread of the `current process'.


Added in version 3.4.



버전 3.13에서 변경: If @ref{16f,,-X cpu_count} is given or 
@geindex PYTHON_CPU_COUNT
@geindex 환경 변수; PYTHON_CPU_COUNT
@ref{51e,,PYTHON_CPU_COUNT} is set,
@code{cpu_count()} returns the override value `n'.

@end deffn

@geindex getloadavg() (os 모듈)
@anchor{library/os os getloadavg}@anchor{1926}
@deffn {함수} os.getloadavg ()

마지막 1, 5, 15분에 걸쳐 평균한 시스템 실행 대기열의 프로세스 수를 반환하거나, 로드 평균을 얻을 수 없으면, @ref{2c0,,OSError}를 발생시킵니다.

@ref{213c,,가용성}: Unix.
@end deffn

@geindex process_cpu_count() (os 모듈)
@anchor{library/os os process_cpu_count}@anchor{51d}
@deffn {함수} os.process_cpu_count ()

Get the number of logical CPUs usable by the calling thread of the `current
process'. Returns @code{None} if undetermined. It can be less than
@ref{4db,,cpu_count()} depending on the CPU affinity.

The @ref{4db,,cpu_count()} function can be used to get the number of logical CPUs
in the `system'.

If @ref{16f,,-X cpu_count} is given or 
@geindex PYTHON_CPU_COUNT
@geindex 환경 변수; PYTHON_CPU_COUNT
@ref{51e,,PYTHON_CPU_COUNT} is set,
@code{process_cpu_count()} returns the override value `n'.

See also the @ref{130f,,sched_getaffinity()} function.


Added in version 3.13.

@end deffn

@geindex sysconf() (os 모듈)
@anchor{library/os os sysconf}@anchor{18ee}
@deffn {함수} os.sysconf (name, /)

정숫값 시스템 구성 값을 반환합니다. `name' 으로 지정된 구성 값이 정의되어 있지 않으면, @code{-1}이 반환됩니다. @ref{18ed,,confstr()}의 `name' 매개 변수에 관한 주석은 여기에도 적용됩니다; 알려진 이름에 대한 정보를 제공하는 딕셔너리는 @code{sysconf_names}에 의해 제공됩니다.

@ref{213c,,가용성}: Unix.
@end deffn

@geindex sysconf_names (os 모듈)
@anchor{library/os os sysconf_names}@anchor{3127}
@deffn {데이터} os.sysconf_names

@ref{18ee,,sysconf()}에서 허용하는 이름을 호스트 운영 체제가 해당 이름에 대해 정의한 정숫값으로 매핑하는 딕셔너리입니다. 이것은 시스템에 알려진 이름 집합을 판별하는 데 사용될 수 있습니다.

@ref{213c,,가용성}: Unix.


버전 3.11에서 변경: Add @code{'SC_MINSIGSTKSZ'} name.

@end deffn

다음 데이터값들은 경로 조작 연산을 지원하는 데 사용됩니다. 이는 모든 플랫폼에서 정의됩니다.

경로명에 대한 고수준 연산은 @ref{a6,,os.path} 모듈에서 정의됩니다.

@geindex . (dot);in pathnames

@geindex curdir (os 모듈)
@anchor{library/os os curdir}@anchor{2c7e}
@deffn {데이터} os.curdir

현재 디렉터리를 가리키기 위해 운영 체제에서 사용하는 상수 문자열. 이것은 윈도우 및 POSIX의 경우 @code{'.'}입니다. @ref{a6,,os.path}를 통해서도 제공됩니다.
@end deffn

@geindex ..;in pathnames

@geindex pardir (os 모듈)
@anchor{library/os os pardir}@anchor{30a4}
@deffn {데이터} os.pardir

부모 디렉터리를 가리키기 위해 운영 체제에서 사용하는 상수 문자열입니다. 이것은 윈도우 및 POSIX의 경우 @code{'..'}입니다. @ref{a6,,os.path}를 통해서도 제공됩니다.
@end deffn

@geindex / (slash);in pathnames

@geindex \ (backslash);in pathnames (Windows)

@geindex sep (os 모듈)
@anchor{library/os os sep}@anchor{879}
@deffn {데이터} os.sep

경로명 구성 요소를 분리하기 위해 운영 체제에서 사용하는 문자. 이것은 POSIX의 경우 @code{'/'}이고, 윈도우의 경우 @code{'\\'}입니다. 이것을 아는 것만으로는 경로명을 구문 분석하거나 이어붙일 수는 없습니다만 — @ref{2c78,,os.path.split()}와 @ref{19a9,,os.path.join()}를 사용하세요 — 가끔 유용합니다. @ref{a6,,os.path}를 통해서도 제공됩니다.
@end deffn

@geindex / (slash);in pathnames

@geindex altsep (os 모듈)
@anchor{library/os os altsep}@anchor{87a}
@deffn {데이터} os.altsep

경로명 구성 요소를 분리하기 위해 운영 체제에서 사용하는 대체 문자이거나, 단 하나의 구분 문자만 있는 경우 @code{None}입니다. @code{sep}가 백 슬래시인 윈도우 시스템에서는 @code{'/'}로 설정됩니다. @ref{a6,,os.path}를 통해서도 제공됩니다.
@end deffn

@geindex . (dot);in pathnames

@geindex extsep (os 모듈)
@anchor{library/os os extsep}@anchor{3128}
@deffn {데이터} os.extsep

기본 파일명과 확장자를 구분하는 문자; 예를 들어, @code{os.py}에서 @code{'.'}. @ref{a6,,os.path}를 통해서도 제공됩니다.
@end deffn

@geindex ; (colon);path separator (POSIX)
@geindex ; (semicolon)

@geindex pathsep (os 모듈)
@anchor{library/os os pathsep}@anchor{2131}
@deffn {데이터} os.pathsep

검색 경로 구성 요소(
@geindex PATH
@geindex 환경 변수; PATH
@code{PATH}에서와 같이)를 분리하기 위해 운영 체제에서 관습적으로 사용하는 문자, 가령 POSIX의 @code{':'} 또는 윈도우의 @code{';'}. @ref{a6,,os.path}를 통해서도 제공됩니다.
@end deffn

@geindex defpath (os 모듈)
@anchor{library/os os defpath}@anchor{1de1}
@deffn {데이터} os.defpath

환경에 @code{'PATH'} 키가 없을 때, @ref{30db,,exec*p*} 및 @ref{31b,,spawn*p*}에서 사용하는 기본 검색 경로. @ref{a6,,os.path}를 통해서도 제공됩니다.
@end deffn

@geindex linesep (os 모듈)
@anchor{library/os os linesep}@anchor{25dc}
@deffn {데이터} os.linesep

현재 플랫폼에서 행을 분리(또는 종료)하는 데 사용되는 문자열. 이는 POSIX의 @code{'\n'}와 같은 단일 문자이거나, 윈도우의 @code{'\r\n'}와 같은 여러 문자일 수 있습니다. 텍스트 모드로 열린(기본값) 파일에 쓸 때 줄 종결자로 `os.linesep'를 사용하지 마십시오; 대신 모든 플랫폼에서 단일 @code{'\n'}를 사용하십시오.
@end deffn

@geindex devnull (os 모듈)
@anchor{library/os os devnull}@anchor{1e10}
@deffn {데이터} os.devnull

널(null) 장치의 파일 경로. 예를 들어: POSIX의 경우 @code{'/dev/null'}, 윈도우의 경우 @code{'nul'}. @ref{a6,,os.path}를 통해서도 제공됩니다.
@end deffn

@geindex RTLD_LAZY (os 모듈)
@geindex RTLD_NOW (os 모듈)
@geindex RTLD_GLOBAL (os 모듈)
@geindex RTLD_LOCAL (os 모듈)
@geindex RTLD_NODELETE (os 모듈)
@geindex RTLD_NOLOAD (os 모듈)
@geindex RTLD_DEEPBIND (os 모듈)
@anchor{library/os os RTLD_LAZY}@anchor{131d}
@deffn {데이터} os.RTLD_LAZY
@anchor{library/os os RTLD_NOW}@anchor{131e}
@deffnx {데이터} os.RTLD_NOW
@anchor{library/os os RTLD_GLOBAL}@anchor{131f}
@deffnx {데이터} os.RTLD_GLOBAL
@anchor{library/os os RTLD_LOCAL}@anchor{1320}
@deffnx {데이터} os.RTLD_LOCAL
@anchor{library/os os RTLD_NODELETE}@anchor{1321}
@deffnx {데이터} os.RTLD_NODELETE
@anchor{library/os os RTLD_NOLOAD}@anchor{1322}
@deffnx {데이터} os.RTLD_NOLOAD
@anchor{library/os os RTLD_DEEPBIND}@anchor{1323}
@deffnx {데이터} os.RTLD_DEEPBIND

@ref{1324,,setdlopenflags()} 및 @ref{1713,,getdlopenflags()} 함수에 사용하는 플래그. 각 플래그가 의미하는 바는 유닉스 매뉴얼 페이지 @code{dlopen(3)@footnote{https://manpages.debian.org/dlopen(3)}}를 참조하십시오.


Added in version 3.3.

@end deffn

@node 난수<2>,,기타 시스템 정보,os — Miscellaneous operating system interfaces
@anchor{library/os random-numbers}@anchor{3129}
@subsubsection 난수


@geindex getrandom() (os 모듈)
@anchor{library/os os getrandom}@anchor{eb8}
@deffn {함수} os.getrandom (size, flags=0)

최대 `size' 크기의 난수 바이트열을 업습니다. 이 함수는 요청한 것보다 짧은 바이트열를 반환할 수 있습니다.

이 바이트열은 사용자 공간 난수 발생기를 시드 하거나 암호화 목적으로 사용할 수 있습니다.

@code{getrandom()}는 장치 드라이버 및 기타 환경 소음원에서 수집한 엔트로피에 의존합니다. 대량의 데이터를 불필요하게 읽는 것은 @code{/dev/random} 및 @code{/dev/urandom} 장치의 다른 사용자에게 부정적인 영향을 미칩니다.

The flags argument is a bit mask that can contain zero or more of the
following values ORed together: @ref{312a,,os.GRND_RANDOM} and
@ref{312b,,GRND_NONBLOCK}.

See also the Linux getrandom() manual page@footnote{https://man7.org/linux/man-pages/man2/getrandom.2.html}.

@ref{213c,,가용성}: Linux >= 3.17.


Added in version 3.6.

@end deffn

@geindex urandom() (os 모듈)
@anchor{library/os os urandom}@anchor{745}
@deffn {함수} os.urandom (size, /)

Return a bytestring of `size' random bytes suitable for cryptographic use.

이 함수는 OS 종속적인 임의성 소스에서 난수 바이트열을 반환합니다. 반환된 데이터는 암호화 응용에 충분하도록 예측할 수 없어야 하지만, 정확한 품질은 OS 구현에 따라 달라집니다.

리눅스에서, @code{getrandom()} 시스템 호출을 사용할 수 있으면, 블로킹 모드로 사용됩니다: 시스템의 urandom 엔트로피 풀이 초기화될 때까지 블록 됩니다 (커널이 128비트의 엔트로피를 수집합니다). 이유는 
@geindex Python 향상 제안; PEP 524
PEP 524@footnote{https://peps.python.org/pep-0524/}를 참조하십시오. 리눅스에서, @ref{eb8,,getrandom()} 함수는 (@ref{312b,,GRND_NONBLOCK} 플래그를 사용하여) 비 블로킹 모드로 난수 바이트열을 얻거나, 시스템 urandom 엔트로피 풀이 초기화될 때까지 폴링 할 수 있습니다.

유닉스류 시스템에서, @code{/dev/urandom} 장치에서 난수 바이트열을 읽습니다. @code{/dev/urandom} 장치를 사용할 수 없거나 읽을 수 없으면, @ref{36b,,NotImplementedError} 예외가 발생합니다.

On Windows, it will use @code{BCryptGenRandom()}.


@subsubheading 더 보기


@ref{c5,,secrets} 모듈은 고수준 함수를 제공합니다. 플랫폼에서 제공되는 난수 발생기에 대한 사용하기 쉬운 인터페이스는 @ref{2b7e,,random.SystemRandom}를 참조하십시오.



버전 3.5에서 변경: 리눅스 3.17 및 이후 버전에서, 이제 @code{getrandom()} 시스템 호출을 사용할 수 있으면 사용합니다. OpenBSD 5.6 이상에서, C @code{getentropy()} 함수가 이제 사용됩니다. 이 함수들은 내부 파일 기술자의 사용을 피합니다.



버전 3.5.2에서 변경: 리눅스에서, @code{getrandom()} 시스템 호출이 블록 하면 (urandom 엔트로피 풀이 아직 초기화되지 않았으면), @code{/dev/urandom}을 읽는 것으로 대체됩니다.



버전 3.6에서 변경: 리눅스에서, @code{getrandom()}은 이제 보안을 강화하기 위해 블로킹 모드로 사용됩니다.



버전 3.11에서 변경: On Windows, @code{BCryptGenRandom()} is used instead of @code{CryptGenRandom()}
which is deprecated.

@end deffn

@geindex GRND_NONBLOCK (os 모듈)
@anchor{library/os os GRND_NONBLOCK}@anchor{312b}
@deffn {데이터} os.GRND_NONBLOCK

기본적으로, @code{/dev/random}에서 읽을 때, @ref{eb8,,getrandom()}는 사용할 수 있는 난수 바이트열이 없으면 블록 하고, @code{/dev/urandom}에서 읽을 때는, 엔트로피 풀이 아직 초기화되지 않았으면 블록 합니다.

@ref{312b,,GRND_NONBLOCK} 플래그가 설정되면, @ref{eb8,,getrandom()}는 이럴 때 블록 하지 않고, 대신 즉시 @ref{235,,BlockingIOError}를 발생시킵니다.


Added in version 3.6.

@end deffn

@geindex GRND_RANDOM (os 모듈)
@anchor{library/os os GRND_RANDOM}@anchor{312a}
@deffn {데이터} os.GRND_RANDOM

이 비트가 설정되면, @code{/dev/urandom} 풀 대신 @code{/dev/random} 풀에서 난수 바이트열을 얻습니다.


Added in version 3.6.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node io — 스트림 작업을 위한 핵심 도구,time — 시간 액세스와 변환,os — Miscellaneous operating system interfaces,일반 운영 체제 서비스
@anchor{library/io doc}@anchor{312c}@anchor{library/io io-core-tools-for-working-with-streams}@anchor{312d}@anchor{library/io module-io}@anchor{83}@anchor{library/io translation-repo}@anchor{312e}
@subsection @code{io} — 스트림 작업을 위한 핵심 도구


@geindex module; io

`소스 코드:' Lib/io.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/io.py}


__________________________________________________________________


@menu
* 개요: 개요<2>. 
* 텍스트 인코딩: 텍스트 인코딩<2>. 
* 고수준 모듈 인터페이스:: 
* 클래스 위계:: 
* Static Typing:: 
* 성능: 성능<2>. 

@end menu

@node 개요<2>,텍스트 인코딩<2>,,io — 스트림 작업을 위한 핵심 도구
@anchor{library/io io-overview}@anchor{25da}@anchor{library/io overview}@anchor{312f}
@subsubsection 개요


@geindex 파일 객체;io 모듈

The @code{io} module provides Python’s main facilities for dealing with various
types of I/O.  There are three main types of I/O: `text I/O', `binary I/O'
and `raw I/O'.  These are generic categories, and various backing stores can
be used for each of them.  A concrete object belonging to any of these
categories is called a @ref{13c8,,file object}.  Other common terms are `stream'
and `file-like object'.

범주와 상관없이, 각 구상 스트림 객체에는 다양한 기능이 있습니다: 읽기 전용, 쓰기 전용 또는 읽고-쓰기일 수 있습니다. 또한 임의의 무작위 액세스(임의의 위치로 전방이나 후방 탐색)를 허용하거나 순차적 액세스(예를 들어 소켓이나 파이프의 경우)만 허용할 수 있습니다.

모든 스트림은 그것에 제공하는 데이터형에 주의를 기울입니다. 예를 들어 @ref{169,,str} 객체를 바이너리 스트림의 @code{write()} 메서드에 제공하면 @ref{198,,TypeError}가 발생합니다. 텍스트 스트림의 @code{write()} 메서드에 @ref{192,,bytes} 객체를 제공해도 마찬가지입니다.


버전 3.3에서 변경: @ref{1252,,IOError}가 이제는 @ref{2c0,,OSError}의 별칭이라서, @code{IOError}를 발생시켰던 연산은 이제 @code{OSError}를 발생시킵니다.


@menu
* 텍스트 I/O:: 
* 바이너리 I/O:: 
* 원시 I/O:: 

@end menu

@node 텍스트 I/O,바이너리 I/O,,개요<2>
@anchor{library/io text-i-o}@anchor{3130}
@subsubsection 텍스트 I/O


텍스트 I/O는 @ref{169,,str} 객체를 기대하고 생성합니다. 이는 배경 저장소가 네이티브 하게 바이트열로 구성되었을 때마다 (가령 파일의 경우), 플랫폼별 줄 넘김 문자의 선택적 변환뿐만 아니라 데이터의 인코딩과 디코딩이 투명하게 이루어짐을 의미합니다.

텍스트 스트림을 만드는 가장 쉬운 방법은 @ref{316,,open()}을 사용하는 것이고, 선택적으로 인코딩을 지정합니다:

@example
f = open("myfile.txt", "r", encoding="utf-8")
@end example

인 메모리 텍스트 스트림도 @ref{1128,,StringIO} 객체로 제공됩니다:

@example
f = io.StringIO("some initial text data")
@end example

@cartouche
@quotation 참고 
When working with a non-blocking stream, be aware that read operations on text I/O objects
might raise a @ref{235,,BlockingIOError} if the stream cannot perform the operation
immediately.
@end quotation
@end cartouche

텍스트 스트림 API는 @ref{8a3,,TextIOBase}의 설명서에 자세히 설명되어 있습니다.

@node 바이너리 I/O,원시 I/O,텍스트 I/O,개요<2>
@anchor{library/io binary-i-o}@anchor{3131}
@subsubsection 바이너리 I/O


바이너리 I/O(`버퍼링 된(buffered) I/O'라고도 합니다)는 @ref{193,,바이트열류 객체}를 기대하고 @ref{192,,bytes} 객체를 생성합니다. 인코딩, 디코딩 또는 줄 넘김 변환이 수행되지 않습니다. 이 범주의 스트림은 모든 종류의 텍스트가 아닌 데이터에 사용할 수 있으며, 텍스트 데이터 처리를 수동으로 제어해야 할 때도 사용할 수 있습니다.

바이너리 스트림을 만드는 가장 쉬운 방법은 모드 문자열에 @code{'b'}를 제공하여 @ref{316,,open()}을 사용하는 것입니다:

@example
f = open("myfile.jpg", "rb")
@end example

인 메모리 바이너리 스트림도 @ref{10a3,,BytesIO} 객체로 제공됩니다:

@example
f = io.BytesIO(b"some initial binary data: \x00\x01")
@end example

바이너리 스트림 API는 @ref{8a2,,BufferedIOBase} 설명서에 자세히 설명되어 있습니다.

다른 라이브러리 모듈은 텍스트나 바이너리 스트림을 만드는 다른 방법을 제공할 수 있습니다. 예를 들어 @ref{13a4,,socket.socket.makefile()}을 참조하십시오.

@node 원시 I/O,,바이너리 I/O,개요<2>
@anchor{library/io raw-i-o}@anchor{3132}
@subsubsection 원시 I/O


원시 I/O(`버퍼링 되지 않은(unbuffered) I/O'라고도 합니다)는 일반적으로 바이너리와 텍스트 스트림을 위한 저수준 빌딩 블록으로 사용됩니다; 사용자 코드에서 원시 스트림을 직접 조작하는 것은 거의 유용하지 않습니다. 그런데도, 버퍼링을 비활성화해서 바이너리 모드로 파일을 열어 원시 스트림을 만들 수 있습니다:

@example
f = open("myfile.jpg", "rb", buffering=0)
@end example

원시 스트림 API는 @ref{12d5,,RawIOBase} 설명서에 자세히 설명되어 있습니다.

@node 텍스트 인코딩<2>,고수준 모듈 인터페이스,개요<2>,io — 스트림 작업을 위한 핵심 도구
@anchor{library/io io-text-encoding}@anchor{9c0}@anchor{library/io text-encoding}@anchor{3133}
@subsubsection 텍스트 인코딩


The default encoding of @ref{9be,,TextIOWrapper} and @ref{316,,open()} is
locale-specific (@ref{329,,locale.getencoding()}).

However, many developers forget to specify the encoding when opening text files
encoded in UTF-8 (e.g. JSON, TOML, Markdown, etc…) since most Unix
platforms use UTF-8 locale by default. This causes bugs because the locale
encoding is not UTF-8 for most Windows users. For example:

@example
# 파일에 비 ASCII 문자가 있을 때 윈도우에서 작동하지 않을 수 있습니다.
with open("README.md") as f:
    long_description = f.read()
@end example

Accordingly, it is highly recommended that you specify the encoding
explicitly when opening text files. If you want to use UTF-8, pass
@code{encoding="utf-8"}. To use the current locale encoding,
@code{encoding="locale"} is supported since Python 3.10.


@subsubheading 더 보기



@table @asis

@item @ref{865,,Python UTF-8 Mode}

Python UTF-8 Mode can be used to change the default encoding to
UTF-8 from locale-specific encoding.

@geindex Python 향상 제안; PEP 686

@item PEP 686@footnote{https://peps.python.org/pep-0686/}

Python 3.15 will make @ref{865,,Python UTF-8 Mode} default.
@end table


@menu
* Opt-in EncodingWarning:: 

@end menu

@node Opt-in EncodingWarning,,,텍스트 인코딩<2>
@anchor{library/io io-encoding-warning}@anchor{213d}@anchor{library/io opt-in-encodingwarning}@anchor{3134}
@subsubsection Opt-in EncodingWarning



Added in version 3.10: See 
@geindex Python 향상 제안; PEP 597
PEP 597@footnote{https://peps.python.org/pep-0597/} for more details.


To find where the default locale encoding is used, you can enable
the @ref{16f,,-X warn_default_encoding} command line option or set the
@geindex PYTHONWARNDEFAULTENCODING
@geindex 환경 변수; PYTHONWARNDEFAULTENCODING
@ref{9bf,,PYTHONWARNDEFAULTENCODING} environment variable, which will
emit an @ref{212b,,EncodingWarning} when the default encoding is used.

If you are providing an API that uses @ref{316,,open()} or
@ref{9be,,TextIOWrapper} and passes @code{encoding=None} as a parameter, you
can use @ref{1a3d,,text_encoding()} so that callers of the API will emit an
@ref{212b,,EncodingWarning} if they don’t pass an @code{encoding}. However,
please consider using UTF-8 by default (i.e. @code{encoding="utf-8"}) for
new APIs.

@node 고수준 모듈 인터페이스,클래스 위계,텍스트 인코딩<2>,io — 스트림 작업을 위한 핵심 도구
@anchor{library/io high-level-module-interface}@anchor{3135}
@subsubsection 고수준 모듈 인터페이스


@geindex DEFAULT_BUFFER_SIZE (io 모듈)
@anchor{library/io io DEFAULT_BUFFER_SIZE}@anchor{1a3e}
@deffn {데이터} io.DEFAULT_BUFFER_SIZE

모듈의 버퍼링 된 I/O 클래스에서 사용하는 기본 버퍼 크기를 포함하는 int. @ref{316,,open()}은 가능하면 파일의 blksize(@ref{26d,,os.stat()}으로 얻은)를 사용합니다.
@end deffn

@geindex open() (io 모듈)
@anchor{library/io io open}@anchor{73f}
@deffn {함수} io.open (file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

이것은 내장 @ref{316,,open()} 함수의 별칭입니다.

이 함수는 인자 `path', `mode' 및 `flags'로 @ref{1c6c,,감사 이벤트} @code{open}을 발생시킵니다. `mode'와 `flags' 인자는 원래 호출에서 수정되었거나 유추되었을 수 있습니다.
@end deffn

@geindex open_code() (io 모듈)
@anchor{library/io io open_code}@anchor{175c}
@deffn {함수} io.open_code (path)

제공된 파일을 @code{'rb'} 모드로 엽니다. 이 함수는 내용을 실행 코드로 취급하려고 할 때 사용해야 합니다.

`path'는 @ref{169,,str}이고 절대 경로여야 합니다.

이 함수의 동작은 @ref{1a99,,PyFile_SetOpenCodeHook()} 에 대한 이전 호출로 재정의될 수 있습니다. 하지만, `path'가 @ref{169,,str}이고 절대 경로임을 가정할 때, @code{open_code(path)}는 항상 @code{open(path, 'rb')}와 같게 동작해야 합니다. 동작의 재정의는 파일의 추가 유효성 검사나 사전 처리를 위한 것입니다.


Added in version 3.8.

@end deffn

@geindex text_encoding() (io 모듈)
@anchor{library/io io text_encoding}@anchor{1a3d}
@deffn {함수} io.text_encoding (encoding, stacklevel=2, /)

This is a helper function for callables that use @ref{316,,open()} or
@ref{9be,,TextIOWrapper} and have an @code{encoding=None} parameter.

This function returns `encoding' if it is not @code{None}.
Otherwise, it returns @code{"locale"} or @code{"utf-8"} depending on
@ref{865,,UTF-8 Mode}.

This function emits an @ref{212b,,EncodingWarning} if
@ref{89b,,sys.flags.warn_default_encoding} is true and `encoding'
is @code{None}. `stacklevel' specifies where the warning is emitted.
For example:

@example
def read_text(path, encoding=None):
    encoding = io.text_encoding(encoding)  # stacklevel=2
    with open(path, encoding) as f:
        return f.read()
@end example

In this example, an @ref{212b,,EncodingWarning} is emitted for the caller of
@code{read_text()}.

See @ref{9c0,,텍스트 인코딩} for more information.


Added in version 3.10.



버전 3.11에서 변경: @code{text_encoding()} returns “utf-8” when UTF-8 mode is enabled and
`encoding' is @code{None}.

@end deffn

@geindex BlockingIOError
@anchor{library/io io BlockingIOError}@anchor{3136}
@deffn {예외} io.BlockingIOError

이것은 내장 @ref{235,,BlockingIOError} 예외에 대한 호환 별칭입니다.
@end deffn

@geindex UnsupportedOperation
@anchor{library/io io UnsupportedOperation}@anchor{1d7d}
@deffn {예외} io.UnsupportedOperation

지원되지 않는 연산이 스트림에서 호출될 때 발생하는 @ref{2c0,,OSError}와 @ref{2ec,,ValueError}를 상속하는 예외.
@end deffn


@subsubheading 더 보기



@table @asis

@item @ref{df,,sys}

표준 IO 스트림을 포함합니다: @ref{75e,,sys.stdin}, @ref{ccc,,sys.stdout} 및 @ref{b33,,sys.stderr}.
@end table


@node 클래스 위계,Static Typing,고수준 모듈 인터페이스,io — 스트림 작업을 위한 핵심 도구
@anchor{library/io class-hierarchy}@anchor{3137}
@subsubsection 클래스 위계


I/O 스트림의 구현은 클래스의 위계(hierarchy)로 구성됩니다. 먼저 다양한 범주의 스트림을 지정하는 데 사용되는 @ref{13bb,,추상 베이스 클래스}(ABC)가 있고, 그다음으로 표준 스트림 구현을 제공하는 구상 클래스가 있습니다.

@cartouche
@quotation 참고 
추상 베이스 클래스는 또한 구상 스트림 클래스의 구현을 돕기 위해 일부 메서드의 기본 구현을 제공합니다. 예를 들어, @ref{8a2,,BufferedIOBase}는 최적화되지 않은 @code{readinto()}와 @code{readline()} 구현을 제공합니다.
@end quotation
@end cartouche

I/O 위계의 맨 위에는 추상 베이스 클래스 @ref{504,,IOBase}가 있습니다. 스트림에 대한 기본 인터페이스를 정의합니다. 그러나 스트림에 대한 읽기와 쓰기가 분리되지 않음에 유의하십시오; 구현은 주어진 연산을 지원하지 않으면 @ref{1d7d,,UnsupportedOperation}을 발생시킬 수 있습니다.

@ref{12d5,,RawIOBase} ABC는 @ref{504,,IOBase}를 확장합니다. 스크림에 대한 바이트열의 읽기와 쓰기를 처리합니다. @ref{1514,,FileIO}는 @code{RawIOBase}를 서브 클래싱하여 기계의 파일 시스템에 있는 파일에 대한 인터페이스를 제공합니다.

@ref{8a2,,BufferedIOBase} ABC는 @ref{504,,IOBase}를 확장합니다. 원시 바이너리 스트림(@ref{12d5,,RawIOBase})에 대한 버퍼링을 다룹니다. 이것의 서브 클래스, @ref{15b6,,BufferedWriter}, @ref{1413,,BufferedReader} 및 @ref{15b8,,BufferedRWPair}는 각각 쓸 수 있는, 읽을 수 있는, 그리고 읽고 쓸 수 있는 원시 바이너리 스트림을 버퍼링합니다. @ref{15b7,,BufferedRandom}은 탐색할 수 있는 (seekable) 스트림에 버퍼 인터페이스를 제공합니다. 또 다른 @code{BufferedIOBase} 서브 클래스 @ref{10a3,,BytesIO}는 인 메모리 바이트열의 스트림입니다.

@ref{8a3,,TextIOBase} ABC는 @ref{504,,IOBase}를 확장합니다. 이것은 바이트가 텍스트를 나타내는 스트림을 다루고, 문자열과의 인코딩과 디코딩을 처리합니다. @code{TextIOBase}를 확장하는 @ref{9be,,TextIOWrapper}는 버퍼링 된 원시 스트림(@ref{8a2,,BufferedIOBase})에 대한 버퍼링 된 텍스트 인터페이스입니다. 마지막으로, @ref{1128,,StringIO}는 텍스트에 대한 인 메모리 스트림입니다.

인자 이름은 명세의 일부가 아니며, @ref{316,,open()}의 인자는 키워드 인자로만 사용하려는 의도입니다.

The following table summarizes the ABCs provided by the @code{io} module:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

ABC

@tab

상속

@tab

스텁(stub) 메서드

@tab

믹스 인 메서드와 프로퍼티

@item

@ref{504,,IOBase}

@tab

@tab

@code{fileno}, @code{seek} 및 @code{truncate}

@tab

@code{close}, @code{closed}, @code{__enter__}, @code{__exit__}, @code{flush}, @code{isatty}, @code{__iter__}, @code{__next__}, @code{readable}, @code{readline}, @code{readlines}, @code{seekable}, @code{tell}, @code{writable} 및 @code{writelines}

@item

@ref{12d5,,RawIOBase}

@tab

@ref{504,,IOBase}

@tab

@code{readinto}와 @code{write}

@tab

상속된 @ref{504,,IOBase} 메서드, @code{read} 및 @code{readall}

@item

@ref{8a2,,BufferedIOBase}

@tab

@ref{504,,IOBase}

@tab

@code{detach}, @code{read}, @code{read1} 및 @code{write}

@tab

상속된 @ref{504,,IOBase} 메서드, @code{readinto} 및 @code{readinto1}

@item

@ref{8a3,,TextIOBase}

@tab

@ref{504,,IOBase}

@tab

@code{detach}, @code{read}, @code{readline} 및 @code{write}

@tab

상속된 @ref{504,,IOBase} 메서드, @code{encoding}, @code{errors} 및 @code{newlines}

@end multitable


@menu
* I/O 베이스 클래스:: 
* 원시 파일 I/O:: 
* 버퍼링 된 스트림:: 
* 텍스트 I/O: 텍스트 I/O<2>. 

@end menu

@node I/O 베이스 클래스,원시 파일 I/O,,클래스 위계
@anchor{library/io i-o-base-classes}@anchor{3138}
@subsubsection I/O 베이스 클래스


@geindex IOBase (io 클래스)
@anchor{library/io io IOBase}@anchor{504}
@deffn {클래스} io.IOBase

모든 I/O 클래스의 추상 베이스 클래스.

이 클래스는 파생 클래스가 선택적으로 재정의할 수 있는 많은 메서드에 대해 빈 추상 구현을 제공합니다; 기본 구현은 읽거나 쓰거나 탐색할 수 없는 파일을 나타냅니다.

@ref{504,,IOBase}가 서명이 다양하기 때문에 @code{read()}나 @code{write()}를 선언하지 않더라도, 구현과 클라이언트는 해당 메서드를 인터페이스의 일부로 고려해야 합니다. 또한, 지원하지 않는 연산이 호출될 때 구현은 @ref{2ec,,ValueError}(또는 @ref{1d7d,,UnsupportedOperation})를 발생시킬 수 있습니다.

파일에서 읽거나 파일에 쓰는 바이너리 데이터에 사용되는 기본형은 @ref{192,,bytes}입니다. 다른 @ref{193,,바이트열류 객체}도 메서드 인자로 허용됩니다. 텍스트 I/O 클래스는 @ref{169,,str} 데이터로 작동합니다.

닫힌 스트림에 대한 모든 메서드(조회조차도) 호출은 정의되어 있지 않습니다. 이 경우 구현은 @ref{2ec,,ValueError}를 발생시킬 수 있습니다.

@ref{504,,IOBase}(및 그 서브 클래스)는 이터레이터 프로토콜을 지원합니다. 즉, 스트림에서 줄을 산출하면서 @code{IOBase} 객체를 이터레이트 할 수 있습니다. 스트림이 바이너리 스트림(바이트열을 산출합니다)인지 텍스트 스트림(문자열을 산출합니다)인지에 따라 줄은 약간 다르게 정의됩니다. 아래 @ref{152e,,readline()}을 참조하십시오.

@ref{504,,IOBase}는 컨텍스트 관리자이기도 해서, @ref{186,,with} 문을 지원합니다. 이 예에서, `file'은 @code{with} 문의 스위트가 완료된 후에 닫힙니다 — 예외가 발생하더라도:

@example
with open('spam.txt', 'w') as file:
    file.write('Spam and eggs!')
@end example

@ref{504,,IOBase}는 다음 데이터 어트리뷰트와 메서드를 제공합니다:

@geindex close() (io.IOBase 메서드)
@anchor{library/io io IOBase close}@anchor{505}
@deffn {메서드} close ()

이 스트림을 플러시하고 닫습니다. 파일이 이미 닫혔으면 이 메서드는 효과가 없습니다. 일단 파일이 닫히면, 파일에 대한 모든 연산(예를 들어 읽기나 쓰기)이 @ref{2ec,,ValueError}를 발생시킵니다.

편의상, 이 메서드를 두 번 이상 호출할 수 있습니다; 그러나 첫 번째 호출만 효과가 있습니다.
@end deffn

@geindex closed (io.IOBase의 속성)
@anchor{library/io io IOBase closed}@anchor{1e0b}
@deffn {속성} closed

스트림이 닫혔으면 @code{True}.
@end deffn

@geindex fileno() (io.IOBase 메서드)
@anchor{library/io io IOBase fileno}@anchor{17b4}
@deffn {메서드} fileno ()

존재한다면 스트림의 하부 파일 기술자(정수)를 반환합니다. IO 객체가 파일 기술자를 사용하지 않으면 @ref{2c0,,OSError}가 발생합니다.
@end deffn

@geindex flush() (io.IOBase 메서드)
@anchor{library/io io IOBase flush}@anchor{2d0d}
@deffn {메서드} flush ()

해당하면 스트림의 쓰기 버퍼를 플러시합니다. 이것은 읽기 전용과 비 블로킹 스트림에 대해서는 아무것도 하지 않습니다.
@end deffn

@geindex isatty() (io.IOBase 메서드)
@anchor{library/io io IOBase isatty}@anchor{2067}
@deffn {메서드} isatty ()

스트림이 대화형이면 (즉, 터미널/tty 장치에 연결되었으면) @code{True}를 반환합니다.
@end deffn

@geindex readable() (io.IOBase 메서드)
@anchor{library/io io IOBase readable}@anchor{15b2}
@deffn {메서드} readable ()

스트림을 읽을 수 있으면 @code{True}를 반환합니다. @code{False}이면, @code{read()}는 @ref{2c0,,OSError}를 발생시킵니다.
@end deffn

@geindex readline() (io.IOBase 메서드)
@anchor{library/io io IOBase readline}@anchor{152e}
@deffn {메서드} readline (size=-1, /)

스트림에서 한 줄을 읽고 반환합니다. `size'가 지정되면, 최대 `size' 바이트를 읽습니다.

줄 종결자는 바이너리 파일의 경우 항상 @code{b'\n'}입니다; 텍스트 파일의 경우, @ref{316,,open()}에 대한 `newline' 인자를 사용하여 인식되는 줄 종결자를 선택할 수 있습니다.
@end deffn

@geindex readlines() (io.IOBase 메서드)
@anchor{library/io io IOBase readlines}@anchor{27c5}
@deffn {메서드} readlines (hint=-1, /)

스트림에서 줄 리스트를 읽고 반환합니다. `hint'는 읽을 줄 수를 제어하도록 지정할 수 있습니다: 지금까지 모든 줄의 총 크기(바이트/문자 단위)가 `hint'를 초과하면 더는 줄을 읽지 않습니다.

`hint' values of @code{0} or less, as well as @code{None}, are treated as no
hint.

@code{file.readlines()}를 호출하지 않고 @code{for line in file: ...}을 사용하여 파일 객체를 이미 이터레이트 할 수 있음에 유의하십시오.
@end deffn

@geindex seek() (io.IOBase 메서드)
@anchor{library/io io IOBase seek}@anchor{1491}
@deffn {메서드} seek (offset, whence=os.SEEK_SET, /)

스트림 위치를 `whence'가 가리키는 위치를 기준으로 상대적으로 해석되는 지정된 바이트 `offset'으로 변경하고, 새 절대 위치를 반환합니다. `whence'의 값은 다음과 같습니다:


@itemize *

@item 
@ref{1492,,os.SEEK_SET} 또는 @code{0} – 스트림의 시작(기본값); `offset'은 0이거나 양수여야 합니다

@item 
@ref{1493,,os.SEEK_CUR} 또는 @code{1} – 현재 스트림 위치; `offset'은 음수일 수 있습니다

@item 
@ref{1494,,os.SEEK_END} 또는 @code{2} – 스트림의 끝; `offset'은 일반적으로 음수입니다
@end itemize


Added in version 3.1: @code{SEEK_*} 상수.



Added in version 3.3: 일부 운영 체제는 @ref{3068,,os.SEEK_HOLE}이나 @ref{3069,,os.SEEK_DATA}와 같은 추가 값을 지원할 수 있습니다. 파일에 대해 유효한 값은 그것이 텍스트나 바이너리 모드 중 어느 것으로 열렸는지에 따라 달라질 수 있습니다.

@end deffn

@geindex seekable() (io.IOBase 메서드)
@anchor{library/io io IOBase seekable}@anchor{15b4}
@deffn {메서드} seekable ()

스트림이 무작위 액세스를 지원하면 @code{True}를 반환합니다. @code{False}이면, @ref{1491,,seek()}, @ref{15b1,,tell()} 및 @ref{1515,,truncate()}가 @ref{2c0,,OSError}를 발생시킵니다.
@end deffn

@geindex tell() (io.IOBase 메서드)
@anchor{library/io io IOBase tell}@anchor{15b1}
@deffn {메서드} tell ()

현재의 스트림 위치를 반환합니다.
@end deffn

@geindex truncate() (io.IOBase 메서드)
@anchor{library/io io IOBase truncate}@anchor{1515}
@deffn {메서드} truncate (size=None, /)

바이트 단위로 지정된 `size'로 스트림 크기를 조정합니다 (또는 `size'가 지정되지 않으면 현재 위치). 현재 스트림 위치는 변경되지 않습니다. 이 크기 조정은 현재 파일 크기를 늘리거나 줄일 수 있습니다. 확장의 경우, 새 파일 영역의 내용은 플랫폼에 따라 다릅니다 (대부분의 시스템에서, 추가 바이트는 0으로 채워집니다). 새 파일 크기가 반환됩니다.


버전 3.5에서 변경: 윈도우는 이제 확장 시 파일을 0으로 채웁니다.

@end deffn

@geindex writable() (io.IOBase 메서드)
@anchor{library/io io IOBase writable}@anchor{15b3}
@deffn {메서드} writable ()

스트림이 쓰기를 지원하면 @code{True}를 반환합니다. @code{False}이면, @code{write()}와 @ref{1515,,truncate()}는 @ref{2c0,,OSError}를 발생시킵니다.
@end deffn

@geindex writelines() (io.IOBase 메서드)
@anchor{library/io io IOBase writelines}@anchor{1781}
@deffn {메서드} writelines (lines, /)

스트림에 줄 리스트를 씁니다. 줄 구분자는 추가되지 않아서, 제공된 각 줄 끝에 줄 구분자가 있는 것이 일반적입니다.
@end deffn

@geindex __del__() (io.IOBase 메서드)
@anchor{library/io io IOBase __del__}@anchor{3139}
@deffn {메서드} __del__ ()

객체 파괴를 준비합니다. @ref{504,,IOBase}는 인스턴스의 @ref{505,,close()} 메서드를 호출하는 이 메서드의 기본 구현을 제공합니다.
@end deffn
@end deffn

@geindex RawIOBase (io 클래스)
@anchor{library/io io RawIOBase}@anchor{12d5}
@deffn {클래스} io.RawIOBase

원시 바이너리 스트림의 베이스 클래스. @ref{504,,IOBase}를 상속합니다.

원시 바이너리 스트림은 일반적으로 하부 OS 장치나 API에 대한 저수준 액세스를 제공하며, 이것을 고수준 프리미티브로 캡슐화하려고 하지 않습니다 (이 기능은 이 페이지에서 나중에 설명할 버퍼링 된 바이너리 스트림과 텍스트 스트림에서 고수준으로 수행됩니다).

@ref{12d5,,RawIOBase}는 @ref{504,,IOBase}에서 온 것 외에 이 메서드를 제공합니다:

@geindex read() (io.RawIOBase 메서드)
@anchor{library/io io RawIOBase read}@anchor{101b}
@deffn {메서드} read (size=-1, /)

객체에서 최대 `size' 바이트를 읽고 반환합니다. 편의상, `size'가 지정되지 않거나 -1이면, EOF까지의 모든 바이트가 반환됩니다. 그렇지 않으면, 하나의 시스템 호출만 수행됩니다. 운영 체제 시스템 호출이 `size' 바이트 미만을 반환하면 `size' 바이트 미만이 반환될 수 있습니다.

0바이트가 반환되고, `size'가 0이 아니면, 파일의 끝을 나타냅니다. 객체가 비 블로킹 모드이고 사용 가능한 바이트가 없으면 @code{None}이 반환됩니다.

기본 구현은 @ref{313a,,readall()}과 @ref{101c,,readinto()}로 위임합니다.
@end deffn

@geindex readall() (io.RawIOBase 메서드)
@anchor{library/io io RawIOBase readall}@anchor{313a}
@deffn {메서드} readall ()

필요한 경우 스트림에 대한 다중 호출을 사용하여, EOF까지 스트림의 모든 바이트를 읽고 반환합니다.
@end deffn

@geindex readinto() (io.RawIOBase 메서드)
@anchor{library/io io RawIOBase readinto}@anchor{101c}
@deffn {메서드} readinto (b, /)

미리 할당되고, 쓰기 가능한 @ref{193,,바이트열류 객체} `b'로 바이트를 읽고 읽은 바이트 수를 반환합니다. 예를 들어, `b'는 @ref{344,,bytearray}일 수 있습니다. 객체가 비 블로킹 모드이고 사용 가능한 바이트가 없으면, @code{None}이 반환됩니다.
@end deffn

@geindex write() (io.RawIOBase 메서드)
@anchor{library/io io RawIOBase write}@anchor{15b0}
@deffn {메서드} write (b, /)

주어진 @ref{193,,바이트열류 객체}, `b'를 하부 원시 스트림에 쓰고, 쓴 바이트 수를 반환합니다. 하부 원시 스트림의 특성에 따라, 특히 비 블로킹 모드이면 바이트 단위로 `b'의 길이보다 짧을 수 있습니다. 원시 스트림이 블록 하지 않도록 설정되었고 단일 바이트를 당장 쓸 수 없으면 @code{None}이 반환됩니다. 호출자는 이 메서드가 반환된 후 `b'를 해제하거나 변경할 수 있어서, 구현은 메서드 호출 중에만 `b'에 액세스해야 합니다.
@end deffn
@end deffn

@geindex BufferedIOBase (io 클래스)
@anchor{library/io io BufferedIOBase}@anchor{8a2}
@deffn {클래스} io.BufferedIOBase

어떤 종류의 버퍼링을 지원하는 바이너리 스트림의 베이스 클래스. @ref{504,,IOBase}를 상속합니다.

The main difference with @ref{12d5,,RawIOBase} is that methods @ref{152d,,read()},
@ref{1897,,readinto()} and @ref{ed6,,write()} will try (respectively) to read
as much input as requested or to emit all provided data.

In addition, if the underlying raw stream is in non-blocking mode, when the
system returns would block @ref{ed6,,write()} will raise @ref{235,,BlockingIOError}
with @ref{2707,,BlockingIOError.characters_written} and @ref{152d,,read()} will return
data read so far or @code{None} if no data is available.

또한, @ref{152d,,read()} 메서드에는 @ref{1897,,readinto()}로 위임하는 기본 구현이 없습니다.

일반적인 @ref{8a2,,BufferedIOBase} 구현은 @ref{12d5,,RawIOBase} 구현에서 상속하지 말고, @ref{15b6,,BufferedWriter}와 @ref{1413,,BufferedReader}처럼 감싸야 합니다.

@ref{8a2,,BufferedIOBase}는 @ref{504,,IOBase}에서 온 것 외에 다음 데이터 어트리뷰트와 메서드를 제공하거나 재정의합니다:

@geindex raw (io.BufferedIOBase의 속성)
@anchor{library/io io BufferedIOBase raw}@anchor{15b5}
@deffn {속성} raw

@ref{8a2,,BufferedIOBase} 가 다루는 하부 원시 스트림 (@ref{12d5,,RawIOBase} 인스턴스). 이것은 @code{BufferedIOBase} API의 일부가 아니며 일부 구현에는 없을 수 있습니다.
@end deffn

@geindex detach() (io.BufferedIOBase 메서드)
@anchor{library/io io BufferedIOBase detach}@anchor{2e12}
@deffn {메서드} detach ()

하부 원시 스트림을 버퍼에서 분리하고 반환합니다.

원시 스트림이 분리된 후에는, 버퍼가 사용할 수 없는 상태가 됩니다.

@ref{10a3,,BytesIO}와 같은 일부 버퍼에는 이 메서드가 반환할 단일 원시 스트림 개념이 없습니다. 그들은 @ref{1d7d,,UnsupportedOperation}을 발생시킵니다.


Added in version 3.1.

@end deffn

@geindex read() (io.BufferedIOBase 메서드)
@anchor{library/io io BufferedIOBase read}@anchor{152d}
@deffn {메서드} read (size=-1, /)

Read and return up to `size' bytes. If the argument is omitted, @code{None},
or negative read as much as possible.

Fewer bytes may be returned than requested. An empty @ref{192,,bytes} object
is returned if the stream is already at EOF. More than one read may be
made and calls may be retried if specific errors are encountered, see
@ref{f94,,os.read()} and 
@geindex Python 향상 제안; PEP 475
PEP 475@footnote{https://peps.python.org/pep-0475/} for more details. Less than size bytes
being returned does not imply that EOF is imminent.

When reading as much as possible the default implementation will use
@code{raw.readall} if available (which should implement
@ref{313a,,RawIOBase.readall()}), otherwise will read in a loop until read
returns @code{None}, an empty @ref{192,,bytes}, or a non-retryable error. For
most streams this is to EOF, but for non-blocking streams more data may
become available.

@cartouche
@quotation 참고 
When the underlying raw stream is non-blocking, implementations may
either raise @ref{235,,BlockingIOError} or return @code{None} if no data is
available. @code{io} implementations return @code{None}.
@end quotation
@end cartouche
@end deffn

@geindex read1() (io.BufferedIOBase 메서드)
@anchor{library/io io BufferedIOBase read1}@anchor{2e7d}
@deffn {메서드} read1 (size=-1, /)

Read and return up to `size' bytes, calling @ref{101c,,readinto()}
which may retry if @ref{f86,,EINTR} is encountered per
@geindex Python 향상 제안; PEP 475
PEP 475@footnote{https://peps.python.org/pep-0475/}. If `size' is @code{-1} or not provided, the implementation will
choose an arbitrary value for `size'.

@cartouche
@quotation 참고 
When the underlying raw stream is non-blocking, implementations may
either raise @ref{235,,BlockingIOError} or return @code{None} if no data is
available. @code{io} implementations return @code{None}.
@end quotation
@end cartouche
@end deffn

@geindex readinto() (io.BufferedIOBase 메서드)
@anchor{library/io io BufferedIOBase readinto}@anchor{1897}
@deffn {메서드} readinto (b, /)

미리 할당되고, 쓰기 가능한 @ref{193,,바이트열류 객체} `b'로 바이트를 읽고 읽은 바이트 수를 반환합니다. 예를 들어, `b'는 @ref{344,,bytearray}일 수 있습니다.

@ref{152d,,read()}와 마찬가지로, 하부 원시 스트림이 대화식이 아닌 한, 여러 읽기가 수행될 수 있습니다.

하부 원시 스트림이 비 블로킹 모드이고, 현재 사용 가능한 데이터가 없으면 @ref{235,,BlockingIOError} 가 발생합니다.
@end deffn

@geindex readinto1() (io.BufferedIOBase 메서드)
@anchor{library/io io BufferedIOBase readinto1}@anchor{101d}
@deffn {메서드} readinto1 (b, /)

하부 원시 스트림의 @ref{101b,,read()} (또는 @ref{101c,,readinto()}) 메서드를 최대 한 번만 호출하여, 미리 할당된 쓰기 가능한 @ref{193,,바이트열류 객체} `b'로 바이트를 읽습니다. 읽은 바이트 수를 반환합니다.

하부 원시 스트림이 비 블로킹 모드이고, 현재 사용 가능한 데이터가 없으면 @ref{235,,BlockingIOError} 가 발생합니다.


Added in version 3.5.

@end deffn

@geindex write() (io.BufferedIOBase 메서드)
@anchor{library/io io BufferedIOBase write}@anchor{ed6}
@deffn {메서드} write (b, /)

주어진 @ref{193,,바이트열류 객체}, `b'를 쓰고 기록된 바이트 수를 반환합니다 (쓰기에 실패하면 @ref{2c0,,OSError}가 발생하기 때문에 항상 바이트 단위로 `b' 길이와 같습니다). 실제 구현에 따라, 이러한 바이트는 하부 스트림에 쉽게 쓸 수 있거나, 성능과 지연 이유로 버퍼에 보관될 수 있습니다.

비 블로킹 모드에서, 데이터를 원시 스트림에 기록해야 하지만 원시 스트림이 블로킹 없이 모든 데이터를 받아들일 수 없으면, @ref{235,,BlockingIOError} 가 발생합니다.

호출자는 이 메서드가 반환된 후 `b'를 해제하거나 변경할 수 있어서, 구현은 메서드 호출 중에만 `b'에 액세스해야 합니다.
@end deffn
@end deffn

@node 원시 파일 I/O,버퍼링 된 스트림,I/O 베이스 클래스,클래스 위계
@anchor{library/io raw-file-i-o}@anchor{313b}
@subsubsection 원시 파일 I/O


@geindex FileIO (io 클래스)
@anchor{library/io io FileIO}@anchor{1514}
@deffn {클래스} io.FileIO (name, mode='r', closefd=True, opener=None)

바이트열 데이터를 포함하는 OS 수준 파일을 나타내는 원시 바이너리 스트림. @ref{12d5,,RawIOBase}를 상속합니다.

`name'은 다음 두 가지 중 하나일 수 있습니다:


@itemize *

@item 
열릴 파일의 경로를 나타내는 문자열이나 @ref{192,,bytes} 객체. 이 경우 closefd는 @code{True}(기본값)이어야 합니다. 그렇지 않으면 에러가 발생합니다.

@item 
결과 @ref{1514,,FileIO} 객체가 액세스할 기존 OS 수준 파일 기술자의 번호를 나타내는 정수. FileIO 객체가 닫힐 때, `closefd'가 @code{False}로 설정되어 있지 않은 한 이 fd도 닫힙니다.
@end itemize

`mode'는 읽기(기본값), 쓰기, 배타적 생성 또는 덧붙이기를 위해 @code{'r'}, @code{'w'}, @code{'x'} 또는 @code{'a'}일 수 있습니다. 쓰기나 덧붙이기로 열 때 파일이 존재하지 않으면 만들어집니다; 쓰기 위해 열면 파일이 잘립니다. 생성을 위해 열었을 때 파일이 이미 존재하면 @ref{121f,,FileExistsError} 가 발생합니다. 생성하기 위해 파일을 여는 것은 쓰기를 의미하므로, 이 모드는 @code{'w'}와 유사한 방식으로 작동합니다. 읽기와 쓰기를 동시에 허락하려면 @code{'+'}를 모드에 추가하십시오.

이 클래스의 @ref{101b,,read()} (양수 인자로 호출되었을 때), @ref{101c,,readinto()} 및 @ref{15b0,,write()} 메서드는 하나의 시스템 호출만 수행합니다.

콜러블을 `opener'로 전달하여 사용자 정의 오프너를 사용할 수 있습니다. 그러면 파일 객체의 하부 파일 기술자는 (`name', `flags')로 `opener'를 호출하여 얻습니다. `opener'는 열린 파일 기술자를 반환해야 합니다 (@ref{f91,,os.open}을 `opener'로 전달하면 @code{None}을 전달하는 것과 유사한 기능이 됩니다).

새로 만들어진 파일은 @ref{10fb,,상속 불가능}합니다.

`opener' 매개 변수 사용에 대한 예는 @ref{316,,open()} 내장 함수를 참조하십시오.


버전 3.3에서 변경: `opener' 매개 변수가 추가되었습니다. @code{'x'} 모드가 추가되었습니다.



버전 3.4에서 변경: 이제 파일이 상속 불가능합니다.


@ref{1514,,FileIO}는 @ref{12d5,,RawIOBase}와 @ref{504,,IOBase}에서 온 것 외에 다음 데이터 어트리뷰트를 제공합니다:

@geindex mode (io.FileIO의 속성)
@anchor{library/io io FileIO mode}@anchor{313c}
@deffn {속성} mode

생성자에 제공된 모드.
@end deffn

@geindex name (io.FileIO의 속성)
@anchor{library/io io FileIO name}@anchor{2e16}
@deffn {속성} name

파일 이름. 생성자에 이름이 지정되지 않으면 파일의 파일 기술자입니다.
@end deffn
@end deffn

@node 버퍼링 된 스트림,텍스트 I/O<2>,원시 파일 I/O,클래스 위계
@anchor{library/io buffered-streams}@anchor{313d}
@subsubsection 버퍼링 된 스트림


버퍼링 된 I/O 스트림은 원시 I/O보다 I/O 장치에 대한 더 고수준의 인터페이스를 제공합니다.

@geindex BytesIO (io 클래스)
@anchor{library/io io BytesIO}@anchor{10a3}
@deffn {클래스} io.BytesIO (initial_bytes=b'@w{'})

인 메모리 바이트 버퍼를 사용하는 바이너리 스트림. @ref{8a2,,BufferedIOBase}를 상속합니다. @ref{505,,close()} 메서드가 호출될 때 버퍼가 폐기됩니다.

선택적 인자 `initial_bytes'는 초기 데이터를 포함하는 @ref{193,,바이트열류 객체}입니다.

@ref{10a3,,BytesIO}는 @ref{8a2,,BufferedIOBase}와 @ref{504,,IOBase}의 메서드 외에 다음 메서드를 제공하거나 재정의합니다:

@geindex getbuffer() (io.BytesIO 메서드)
@anchor{library/io io BytesIO getbuffer}@anchor{13f6}
@deffn {메서드} getbuffer ()

복사하지 않고 버퍼의 내용에 대한 읽을 수 있고 쓸 수 있는 뷰를 반환합니다. 또한, 뷰를 변경하면 버퍼의 내용이 투명하게 갱신됩니다:

@example
>>> b = io.BytesIO(b"abcdef")
>>> view = b.getbuffer()
>>> view[2:4] = b"56"
>>> b.getvalue()
b'ab56ef'
@end example

@cartouche
@quotation 참고 
뷰가 존재하는 한, @ref{10a3,,BytesIO} 객체의 크기를 조정하거나 닫을 수 없습니다.
@end quotation
@end cartouche


Added in version 3.2.

@end deffn

@geindex getvalue() (io.BytesIO 메서드)
@anchor{library/io io BytesIO getvalue}@anchor{2e7b}
@deffn {메서드} getvalue ()

버퍼의 전체 내용을 포함하는 @ref{192,,bytes}를 반환합니다.
@end deffn

@geindex read1() (io.BytesIO 메서드)
@anchor{library/io io BytesIO read1}@anchor{313e}
@deffn {메서드} read1 (size=-1, /)

@ref{10a3,,BytesIO}에서, 이것은 @ref{152d,,read()}와 같습니다.


버전 3.7에서 변경: `size' 인자는 이제 선택적입니다.

@end deffn

@geindex readinto1() (io.BytesIO 메서드)
@anchor{library/io io BytesIO readinto1}@anchor{313f}
@deffn {메서드} readinto1 (b, /)

@ref{10a3,,BytesIO}에서, 이것은 @ref{1897,,readinto()}와 같습니다.


Added in version 3.5.

@end deffn
@end deffn

@geindex BufferedReader (io 클래스)
@anchor{library/io io BufferedReader}@anchor{1413}
@deffn {클래스} io.BufferedReader (raw, buffer_size=DEFAULT_BUFFER_SIZE)

읽을 수 있고 탐색할 수 없는(non seekable) @ref{12d5,,RawIOBase} 원시 바이너리 스트림에 대한 고수준의 액세스를 제공하는 버퍼링 된 바이너리 스트림. @ref{8a2,,BufferedIOBase}를 상속합니다.

이 객체에서 데이터를 읽을 때, 하부 원시 스트림에서 더 많은 양의 데이터가 요청되어, 내부 버퍼에 보관될 수 있습니다. 버퍼링 된 데이터는 후속 읽기에서 직접 반환될 수 있습니다.

생성자는 주어진 읽을 수 있는 `raw' 스트림과 `buffer_size'에 대해 @ref{1413,,BufferedReader}를 만듭니다. `buffer_size'를 생략하면, @ref{1a3e,,DEFAULT_BUFFER_SIZE}가 사용됩니다.

@ref{1413,,BufferedReader}는 @ref{8a2,,BufferedIOBase}와 @ref{504,,IOBase}의 메서드 외에 다음 메서드를 제공하거나 재정의합니다:

@geindex peek() (io.BufferedReader 메서드)
@anchor{library/io io BufferedReader peek}@anchor{3140}
@deffn {메서드} peek (size=0, /)

Return bytes from the stream without advancing the position. The number of
bytes returned may be less or more than requested. If the underlying raw
stream is non-blocking and the operation would block, returns empty bytes.
@end deffn

@geindex read() (io.BufferedReader 메서드)
@anchor{library/io io BufferedReader read}@anchor{3141}
@deffn {메서드} read (size=-1, /)

In @code{BufferedReader} this is the same as @ref{152d,,io.BufferedIOBase.read()}
@end deffn

@geindex read1() (io.BufferedReader 메서드)
@anchor{library/io io BufferedReader read1}@anchor{3142}
@deffn {메서드} read1 (size=-1, /)

In @code{BufferedReader} this is the same as @ref{2e7d,,io.BufferedIOBase.read1()}


버전 3.7에서 변경: `size' 인자는 이제 선택적입니다.

@end deffn
@end deffn

@geindex BufferedWriter (io 클래스)
@anchor{library/io io BufferedWriter}@anchor{15b6}
@deffn {클래스} io.BufferedWriter (raw, buffer_size=DEFAULT_BUFFER_SIZE)

쓸 수 있고 탐색할 수 없는(non seekable) @ref{12d5,,RawIOBase} 원시 바이너리 스트림에 대한 고수준 액세스를 제공하는 버퍼링 된 바이너리 스트림. @ref{8a2,,BufferedIOBase}를 상속합니다.

이 객체에 쓸 때, 데이터는 일반적으로 내부 버퍼에 배치됩니다. 버퍼는 다음과 같은 다양한 조건에서 하부 @ref{12d5,,RawIOBase} 객체에 기록됩니다:


@itemize *

@item 
계류 중인 모든 데이터에 비해 버퍼가 너무 작아질 때;

@item 
@ref{3143,,flush()}가 호출될 때;

@item 
@ref{1491,,seek()}이 요청될 때 (@ref{15b7,,BufferedRandom} 객체의 경우);

@item 
@ref{15b6,,BufferedWriter} 객체가 닫히거나 파괴될 때.
@end itemize

생성자는 주어진 쓰기 가능한 `raw' 스트림에 대해 @ref{15b6,,BufferedWriter}를 만듭니다. `buffer_size'가 제공되지 않으면, 기본값은 @ref{1a3e,,DEFAULT_BUFFER_SIZE}입니다.

@ref{15b6,,BufferedWriter}는 @ref{8a2,,BufferedIOBase}와 @ref{504,,IOBase}의 메서드 외에 다음 메서드를 제공하거나 재정의합니다:

@geindex flush() (io.BufferedWriter 메서드)
@anchor{library/io io BufferedWriter flush}@anchor{3143}
@deffn {메서드} flush ()

버퍼에 있는 바이트를 원시 스트림으로 강제 출력합니다. 원시 스트림이 블록되면 @ref{235,,BlockingIOError}를 발생시켜야 합니다.
@end deffn

@geindex write() (io.BufferedWriter 메서드)
@anchor{library/io io BufferedWriter write}@anchor{3144}
@deffn {메서드} write (b, /)

Write the @ref{193,,bytes-like object}, `b', and return the
number of bytes written.  When in non-blocking mode, a
@ref{235,,BlockingIOError} with @ref{2707,,BlockingIOError.characters_written} set
is raised if the buffer needs to be written out but the raw stream blocks.
@end deffn
@end deffn

@geindex BufferedRandom (io 클래스)
@anchor{library/io io BufferedRandom}@anchor{15b7}
@deffn {클래스} io.BufferedRandom (raw, buffer_size=DEFAULT_BUFFER_SIZE)

탐색할 수 있는 (seekable) @ref{12d5,,RawIOBase} 원시 바이너리 스트림에 고수준의 액세스를 제공하는 버퍼링 된 바이너리 스트림. @ref{1413,,BufferedReader}와 @ref{15b6,,BufferedWriter}를 상속합니다.

생성자는 첫 번째 인자로 주어진 탐색 가능한 원시 스트림에 대한 판독기(reader)와 기록기(writer)를 만듭니다. `buffer_size'를 생략하면 기본값은 @ref{1a3e,,DEFAULT_BUFFER_SIZE}입니다.

@ref{15b7,,BufferedRandom}은 @ref{1413,,BufferedReader}나 @ref{15b6,,BufferedWriter}가 수행 할 수 있는 모든 작업을 수행할 수 있습니다. 또한, @ref{1491,,seek()}과 @ref{15b1,,tell()}이 구현되도록 보장됩니다.
@end deffn

@geindex BufferedRWPair (io 클래스)
@anchor{library/io io BufferedRWPair}@anchor{15b8}
@deffn {클래스} io.BufferedRWPair (reader, writer, buffer_size=DEFAULT_BUFFER_SIZE, /)

하나는 읽을 수 있고, 다른 하나는 쓸 수 있는, 두 개의 탐색할 수 없는 (non seekable) @ref{12d5,,RawIOBase} 원시 바이너리 스트림에 대한 고수준 액세스를 제공하는 버퍼링 된 바이너리 스트림. @ref{8a2,,BufferedIOBase}를 상속합니다.

`reader'와 `writer'는 각각 읽고 쓸 수 있는 @ref{12d5,,RawIOBase} 객체입니다. `buffer_size'가 생략되면 기본값은 @ref{1a3e,,DEFAULT_BUFFER_SIZE}입니다.

@ref{15b8,,BufferedRWPair}는 @ref{1d7d,,UnsupportedOperation}을 발생시키는 @ref{2e12,,detach()}를 제외한 모든 @ref{8a2,,BufferedIOBase} 의 메서드를 구현합니다.

@cartouche
@quotation 경고 
@ref{15b8,,BufferedRWPair}는 하부 원시 스트림에 대한 동기화된 액세스를 시도하지 않습니다. reader와 writer로 같은 객체를 전달해서는 안 됩니다; 대신 @ref{15b7,,BufferedRandom}을 사용하십시오.
@end quotation
@end cartouche
@end deffn

@node 텍스트 I/O<2>,,버퍼링 된 스트림,클래스 위계
@anchor{library/io id1}@anchor{3145}
@subsubsection 텍스트 I/O


@geindex TextIOBase (io 클래스)
@anchor{library/io io TextIOBase}@anchor{8a3}
@deffn {클래스} io.TextIOBase

텍스트 스트림의 베이스 클래스. 이 클래스는 스트림 I/O를 위한 문자와 줄 기반 인터페이스를 제공합니다. @ref{504,,IOBase}를 상속합니다.

@ref{8a3,,TextIOBase}는 @ref{504,,IOBase}에서 온 것 외에 다음 데이터 어트리뷰트와 메서드를 제공하거나 재정의합니다:

@geindex encoding (io.TextIOBase의 속성)
@anchor{library/io io TextIOBase encoding}@anchor{3146}
@deffn {속성} encoding

스트림의 바이트열을 문자열로 디코딩하고, 문자열을 바이트열로 인코딩하는 데 사용되는 인코딩의 이름.
@end deffn

@geindex errors (io.TextIOBase의 속성)
@anchor{library/io io TextIOBase errors}@anchor{1513}
@deffn {속성} errors

디코더나 인코더의 에러 설정.
@end deffn

@geindex newlines (io.TextIOBase의 속성)
@anchor{library/io io TextIOBase newlines}@anchor{3147}
@deffn {속성} newlines

지금까지 번역된 줄 넘김을 나타내는, 문자열, 문자열 튜플 또는 @code{None}. 구현과 초기 생성자 플래그에 따라, 사용하지 못할 수 있습니다.
@end deffn

@geindex buffer (io.TextIOBase의 속성)
@anchor{library/io io TextIOBase buffer}@anchor{14a8}
@deffn {속성} buffer

The underlying binary buffer (a @ref{8a2,,BufferedIOBase}
or @ref{12d5,,RawIOBase} instance) that @code{TextIOBase} deals with.
This is not part of the @code{TextIOBase} API and may not exist
in some implementations.
@end deffn

@geindex detach() (io.TextIOBase 메서드)
@anchor{library/io io TextIOBase detach}@anchor{1788}
@deffn {메서드} detach ()

하부 바이너리 버퍼를 @ref{8a3,,TextIOBase}와 분리하여 반환합니다.

하부 버퍼가 분리된 후에는, @ref{8a3,,TextIOBase}는 사용할 수 없는 상태가 됩니다.

@ref{1128,,StringIO}와 같은 일부 @ref{8a3,,TextIOBase} 구현에는 하부 버퍼 개념이 없을 수 있으며 이 메서드를 호출하면 @ref{1d7d,,UnsupportedOperation}이 발생합니다.


Added in version 3.1.

@end deffn

@geindex read() (io.TextIOBase 메서드)
@anchor{library/io io TextIOBase read}@anchor{206a}
@deffn {메서드} read (size=-1, /)

스트림에서 최대 `size' 문자를 단일 @ref{169,,str}로 읽고 반환합니다. `size'가 음수이거나 @code{None}이면 EOF까지 읽습니다.
@end deffn

@geindex readline() (io.TextIOBase 메서드)
@anchor{library/io io TextIOBase readline}@anchor{20a4}
@deffn {메서드} readline (size=-1, /)

줄 넘김이나 EOF까지 읽고 단일 @ref{169,,str}을 반환합니다. 스트림이 이미 EOF에 있으면, 빈 문자열이 반환됩니다.

`size'가 지정되면, 최대 `size' 문자를 읽습니다.
@end deffn

@geindex seek() (io.TextIOBase 메서드)
@anchor{library/io io TextIOBase seek}@anchor{3148}
@deffn {메서드} seek (offset, whence=SEEK_SET, /)

스트림 위치를 지정된 `offset'으로 변경합니다. 동작은 `whence' 매개 변수에 따라 다릅니다. `whence'의 기본값은 @code{SEEK_SET}입니다.


@itemize *

@item 
@code{SEEK_SET}이나 @code{0}: 스트림의 시작부터 탐색합니다 (기본값); `offset'은 @ref{3149,,TextIOBase.tell()}이 반환한 숫자이거나 0이어야 합니다. 다른 `offset' 값은 정의되지 않은 동작을 생성합니다.

@item 
@code{SEEK_CUR}이나 @code{1}: 현재 위치로 “seek” 합니다; `offset'은 0이어야 하며, 이는 아무런 일도 하지 않습니다 (다른 모든 값은 지원되지 않습니다).

@item 
@code{SEEK_END}나 @code{2}: 스트림의 끝으로 seek 합니다; `offset'은 0이어야 합니다 (다른 모든 값은 지원되지 않습니다).
@end itemize

새로운 절대 위치를 불투명한 숫자로 반환합니다.


Added in version 3.1: @code{SEEK_*} 상수.

@end deffn

@geindex tell() (io.TextIOBase 메서드)
@anchor{library/io io TextIOBase tell}@anchor{3149}
@deffn {메서드} tell ()

현재 스트림 위치를 불투명한 숫자로 반환합니다. 숫자는 일반적으로 하부 바이너리 저장소의 바이트 수를 나타내지 않습니다.
@end deffn

@geindex write() (io.TextIOBase 메서드)
@anchor{library/io io TextIOBase write}@anchor{2059}
@deffn {메서드} write (s, /)

문자열 `s'를 스트림에 쓰고 쓴 문자 수를 반환합니다.
@end deffn
@end deffn

@geindex TextIOWrapper (io 클래스)
@anchor{library/io io TextIOWrapper}@anchor{9be}
@deffn {클래스} io.TextIOWrapper (buffer, encoding=None, errors=None, newline=None, line_buffering=False, write_through=False)

@ref{8a2,,BufferedIOBase} 버퍼링 된 바이너리 스트림에 대한 고수준의 액세스를 제공하는 버퍼링 된 텍스트 스트림. @ref{8a3,,TextIOBase}를 상속합니다.

`encoding' gives the name of the encoding that the stream will be decoded or
encoded with.  In @ref{865,,UTF-8 Mode}, this defaults to UTF-8.
Otherwise, it defaults to @ref{329,,locale.getencoding()}.
@code{encoding="locale"} can be used to specify the current locale’s encoding
explicitly. See @ref{9c0,,텍스트 인코딩} for more information.

`errors'는 인코딩과 디코딩 에러 처리 방법을 지정하는 선택적 문자열입니다. 인코딩 에러가 있을 때 @ref{2ec,,ValueError} 예외를 발생시키려면 @code{'strict'}를 전달하고 (기본값 @code{None}은 같은 효과를 줍니다), 에러를 무시하려면 @code{'ignore'}를 전달하십시오. (인코딩 에러를 무시하면 데이터가 손실될 수 있음에 유의하십시오.) @code{'replace'}는 잘못된 데이터가 있는 곳에 대체 마커(가령 @code{'?'})가 삽입되도록 합니다. @code{'backslashreplace'}는 잘못된 데이터를 역 슬래시 이스케이프 시퀀스로 대체합니다. 기록할 때, @code{'xmlcharrefreplace'}(적절한 XML 문자 참조로 대체합니다)나 @code{'namereplace'}(@code{\N@{...@}} 이스케이프 시퀀스로 대체합니다)를 사용할 수 있습니다. @ref{16a0,,codecs.register_error()}로 등록된 다른 에러 처리 이름도 유효합니다.

@geindex 유니버설 줄 넘김;io.TextIOWrapper 클래스

`newline'은 줄 끝 처리 방법을 제어합니다. @code{None}, @code{'@w{'}}, @code{'\n'}, @code{'\r'} 및 @code{'\r\n'} 일 수 있습니다. 다음과 같이 작동합니다:


@itemize *

@item 
스트림에서 입력을 읽을 때, `newline'이 @code{None}이면, @ref{f34,,유니버설 줄 넘김} 모드가 활성화됩니다. 입력의 줄은 @code{'\n'}, @code{'\r'} 또는 @code{'\r\n'}으로 끝날 수 있으며, 호출자에게 반환되기 전에 @code{'\n'}으로 변환됩니다. `newline'이 @code{'@w{'}}이면, 유니버설 줄 넘김 모드가 활성화되지만, 줄 끝은 변환되지 않은 상태로 호출자에게 반환됩니다. `newline'이 다른 유효한 값이면, 입력 줄은 주어진 문자열로만 끝나고, 줄 끝은 변환되지 않은 상태로 호출자에게 반환됩니다.

@item 
스트림에 출력을 기록할 때, `newline'이 @code{None}이면, 기록되는 모든 @code{'\n'} 문자는 시스템 기본 줄 구분자 @ref{25dc,,os.linesep}으로 변환됩니다. `newline'이 @code{'@w{'}}이나 @code{'\n'}이면, 변환이 수행되지 않습니다. `newline'이 다른 유효한 값이면, 기록되는 모든 @code{'\n'} 문자는 주어진 문자열로 변환됩니다.
@end itemize

`line_buffering'이 @code{True}이면, write 호출에 줄 넘김 문자나 캐리지 리턴이 포함되어 있으면 @ref{2d0d,,flush()}가 암시됩니다.

`write_through'가 @code{True}이면, @ref{ed6,,write()}에 대한 호출은 버퍼링 되지 않음이 보장됩니다: @ref{9be,,TextIOWrapper} 객체에 기록된 모든 데이터는 즉시 하부 바이너리 `buffer'로 처리됩니다.


버전 3.3에서 변경: `write_through' 인자가 추가되었습니다.



버전 3.3에서 변경: 기본 `encoding'은 이제 @code{locale.getpreferredencoding()} 대신 @code{locale.getpreferredencoding(False)}입니다. @ref{328,,locale.setlocale()}을 사용하여 임시 로케일 인코딩을 변경하지 않고, 사용자가 선호하는 인코딩 대신 현재 로케일 인코딩을 사용합니다.



버전 3.10에서 변경: The `encoding' argument now supports the @code{"locale"} dummy encoding name.


@cartouche
@quotation 참고 
When the underlying raw stream is non-blocking, a @ref{235,,BlockingIOError}
may be raised if a read operation cannot be completed immediately.
@end quotation
@end cartouche

@ref{9be,,TextIOWrapper}는 @ref{8a3,,TextIOBase}와 @ref{504,,IOBase}에서 온 것 외에 다음 데이터 어트리뷰트와 메서드를 제공합니다:

@geindex line_buffering (io.TextIOWrapper의 속성)
@anchor{library/io io TextIOWrapper line_buffering}@anchor{314a}
@deffn {속성} line_buffering

줄 버퍼링이 활성화되었는지 여부.
@end deffn

@geindex write_through (io.TextIOWrapper의 속성)
@anchor{library/io io TextIOWrapper write_through}@anchor{314b}
@deffn {속성} write_through

쓰기가 하부 바이너리 버퍼로 즉시 전달되는지 여부.


Added in version 3.7.

@end deffn

@geindex reconfigure() (io.TextIOWrapper 메서드)
@anchor{library/io io TextIOWrapper reconfigure}@anchor{d3f}
@deffn {메서드} reconfigure (*, encoding=None, errors=None, newline=None, line_buffering=None, write_through=None)

`encoding', `errors', `newline', `line_buffering' 및 `write_through'에 대한 새로운 설정을 사용하여 이 텍스트 스트림을 재구성합니다.

`encoding'이 지정되었지만, `errors'가 지정되지 않았을 때 @code{errors='strict'}가 사용되는 것을 제외하고, 지정되지 않은 매개 변수는 현재 설정을 유지합니다.

스트림에서 일부 데이터를 이미 읽었다면 encoding이나 newline을 변경할 수 없습니다. 반면에, 기록 후의 encoding 변경은 가능합니다.

이 메서드는 새 매개 변수를 설정하기 전에 묵시적 스트림 플러시를 수행합니다.


Added in version 3.7.



버전 3.11에서 변경: The method supports @code{encoding="locale"} option.

@end deffn

@geindex seek() (io.TextIOWrapper 메서드)
@anchor{library/io io TextIOWrapper seek}@anchor{314c}
@deffn {메서드} seek (cookie, whence=os.SEEK_SET, /)

Set the stream position.
Return the new stream position as an @ref{19b,,int}.

Four operations are supported,
given by the following argument combinations:


@itemize *

@item 
@code{seek(0, SEEK_SET)}: Rewind to the start of the stream.

@item 
@code{seek(cookie, SEEK_SET)}: Restore a previous position;
`cookie' `must be' a number returned by @ref{17b8,,tell()}.

@item 
@code{seek(0, SEEK_END)}: Fast-forward to the end of the stream.

@item 
@code{seek(0, SEEK_CUR)}: 현재의 스트림 위치를 변경하지 않습니다.
@end itemize

Any other argument combinations are invalid,
and may raise exceptions.


@subsubheading 더 보기


@ref{1492,,os.SEEK_SET}, @ref{1493,,os.SEEK_CUR}, and @ref{1494,,os.SEEK_END}.

@end deffn

@geindex tell() (io.TextIOWrapper 메서드)
@anchor{library/io io TextIOWrapper tell}@anchor{17b8}
@deffn {메서드} tell ()

Return the stream position as an opaque number.
The return value of @code{tell()} can be given as input to @ref{314c,,seek()},
to restore a previous stream position.
@end deffn
@end deffn

@geindex StringIO (io 클래스)
@anchor{library/io io StringIO}@anchor{1128}
@deffn {클래스} io.StringIO (initial_value='@w{'}, newline='\n')

인 메모리 텍스트 버퍼를 사용하는 텍스트 스트림. @ref{8a3,,TextIOBase}를 상속합니다.

@ref{505,,close()} 메서드가 호출될 때 텍스트 버퍼가 폐기됩니다.

버퍼의 초깃값은 `initial_value'를 제공하여 설정할 수 있습니다. 줄 바꿈 변환이 활성화되면, 줄 바꿈은 @ref{2059,,write()} 한 것처럼 인코딩됩니다. 스트림은 버퍼의 시작 부분에 위치하며, 이는 기존 파일을 @code{w+} 모드로 여는 것을 흉내내어 시작부터 즉시 쓰기나 초기 값을 텊어쓰는 쓰기에 준비되도록 합니다. @code{a+} 모드로 파일을 여는 것을 흉내내려면, @code{f.seek(0, io.SEEK_END)}을 사용하여 스트림을 버퍼의 끝으로 재위치 시키세요.

출력을 스트림에 쓸 때, `newline'이 @code{None}이면, 모든 플랫폼에서 줄 넘김이 @code{\n}로 기록된다는 점을 제외하고는, `newline' 인자는 @ref{9be,,TextIOWrapper}에서 처럼 작동합니다.

@ref{1128,,StringIO}는 @ref{8a3,,TextIOBase}와 @ref{504,,IOBase}의 메서드 외에 이 메서드를 제공합니다:

@geindex getvalue() (io.StringIO 메서드)
@anchor{library/io io StringIO getvalue}@anchor{314d}
@deffn {메서드} getvalue ()

버퍼의 전체 내용을 포함하는 @ref{169,,str}을 반환합니다. 스트림 위치는 변경되지 않지만, 줄 넘김은 @ref{206a,,read()}와 같이 디코딩됩니다.
@end deffn

사용 예:

@example
import io

output = io.StringIO()
output.write('First line.\n')
print('Second line.', file=output)

# 파일 내용을 꺼냅니다 -- 'First line.\nSecond line.\n' 이 됩니다.
contents = output.getvalue()

# 객체를 닫고 메모리 버퍼를 폐기합니다 --
# .getvalue() 는 이제 예외를 발생시킵니다.
output.close()
@end example
@end deffn

@geindex 유니버설 줄 넘김;io.IncrementalNewlineDecoder 클래스

@geindex IncrementalNewlineDecoder (io 클래스)
@anchor{library/io io IncrementalNewlineDecoder}@anchor{1766}
@deffn {클래스} io.IncrementalNewlineDecoder

@ref{f34,,유니버설 줄 넘김} 모드의 줄 넘김 디코딩을 하는 도우미 코덱. @ref{285c,,codecs.IncrementalDecoder}를 상속합니다.
@end deffn

@node Static Typing,성능<2>,클래스 위계,io — 스트림 작업을 위한 핵심 도구
@anchor{library/io static-typing}@anchor{314e}
@subsubsection Static Typing


The following protocols can be used for annotating function and method
arguments for simple stream reading or writing operations. They are decorated
with @ref{673,,@@typing.runtime_checkable}.

@geindex Reader (io 클래스)
@anchor{library/io io Reader}@anchor{236}
@deffn {클래스} io.Reader [T]

Generic protocol for reading from a file or other input stream. @code{T} will
usually be @ref{169,,str} or @ref{192,,bytes}, but can be any type that is
read from the stream.


Added in version 3.14.


@geindex read() (io.Reader 메서드)
@anchor{library/io io Reader read}@anchor{314f}
@deffn {메서드} read ()

@deffnx {메서드} read (size, /)

Read data from the input stream and return it. If `size' is
specified, it should be an integer, and at most `size' items
(bytes/characters) will be read.
@end deffn

For example:

@example
def read_it(reader: Reader[str]):
    data = reader.read(11)
    assert isinstance(data, str)
@end example
@end deffn

@geindex Writer (io 클래스)
@anchor{library/io io Writer}@anchor{237}
@deffn {클래스} io.Writer [T]

Generic protocol for writing to a file or other output stream. @code{T} will
usually be @ref{169,,str} or @ref{192,,bytes}, but can be any type that can be
written to the stream.


Added in version 3.14.


@geindex write() (io.Writer 메서드)
@anchor{library/io io Writer write}@anchor{3150}
@deffn {메서드} write (data, /)

Write `data' to the output stream and return the number of items
(bytes/characters) written.
@end deffn

For example:

@example
def write_binary(writer: Writer[bytes]):
    writer.write(b"Hello world!\n")
@end example
@end deffn

See @ref{3151,,ABCs and Protocols for working with I/O} for other I/O related protocols and classes that can be
used for static type checking.

@node 성능<2>,,Static Typing,io — 스트림 작업을 위한 핵심 도구
@anchor{library/io performance}@anchor{3152}
@subsubsection 성능


이 섹션에서는 제공된 구상 I/O 구현의 성능에 대해 논합니다.

@menu
* 바이너리 I/O: 바이너리 I/O<2>. 
* 텍스트 I/O: 텍스트 I/O<3>. 
* 다중 스레드:: 
* 재진입:: 

@end menu

@node 바이너리 I/O<2>,텍스트 I/O<3>,,성능<2>
@anchor{library/io id2}@anchor{3153}
@subsubsection 바이너리 I/O


사용자가 단일 바이트를 요청할 때조차 큰 데이터 청크만 읽고 써서, 버퍼링 된 I/O는 운영 체제의 버퍼링 되지 않은 I/O 루틴을 호출하고 실행할 때의 비효율성을 숨깁니다. 이득은 OS 와 수행되는 I/O 종류에 따라 다릅니다. 예를 들어, 리눅스와 같은 일부 최신 OS에서는, 버퍼링 되지 않은 디스크 I/O는 버퍼링 된 I/O만큼 빠를 수 있습니다. 그러나 요점은 버퍼링 된 I/O가 플랫폼과 배경 장치와 관계없이 예측 가능한 성능을 제공한다는 것입니다. 따라서, 바이너리 데이터에는 버퍼링 되지 않은 I/O보다는 버퍼링 된 I/O를 사용하는 것이 거의 항상 바람직합니다.

@node 텍스트 I/O<3>,다중 스레드,바이너리 I/O<2>,성능<2>
@anchor{library/io id3}@anchor{3154}
@subsubsection 텍스트 I/O


바이너리 저장소(가령 파일)에 대한 텍스트 I/O는 같은 저장소에 대한 바이너리 I/O보다 상당히 느린데, 문자 코덱을 사용하여 유니코드와 바이너리 데이터 간의 변환이 필요하기 때문입니다. 이것은 큰 로그 파일과 같은 많은 양의 텍스트 데이터를 처리할 때 드러날 수 있습니다. 또한, @ref{3149,,tell()}과 @ref{3148,,seek()}은 사용된 재구성 알고리즘으로 인해 상당히 느립니다.

그러나, @ref{1128,,StringIO}는 네이티브 인 메모리 유니코드 컨테이너이며 @ref{10a3,,BytesIO}와 비슷한 속도를 나타냅니다.

@node 다중 스레드,재진입,텍스트 I/O<3>,성능<2>
@anchor{library/io multi-threading}@anchor{3155}
@subsubsection 다중 스레드


@ref{1514,,FileIO} 객체는 감싼 운영 체제 호출(가령 유닉스의 @code{read(2)@footnote{https://manpages.debian.org/read(2)}})이 스레드 안전하다면 스레드 안전합니다.

바이너리 버퍼링 된 객체(@ref{1413,,BufferedReader}, @ref{15b6,,BufferedWriter}, @ref{15b7,,BufferedRandom} 및 @ref{15b8,,BufferedRWPair} 의 인스턴스)는 록을 사용하여 내부 구조를 보호합니다; 따라서 여러 스레드에서 동시에 호출하는 것이 안전합니다.

@ref{9be,,TextIOWrapper} 객체는 스레드 안전하지 않습니다.

@node 재진입,,다중 스레드,성능<2>
@anchor{library/io reentrancy}@anchor{3156}
@subsubsection 재진입


바이너리 버퍼링 된 객체(@ref{1413,,BufferedReader}, @ref{15b6,,BufferedWriter}, @ref{15b7,,BufferedRandom} 및 @ref{15b8,,BufferedRWPair} 의 인스턴스)는 재진입할 수 없습니다. 재진입 호출이 정상적인 상황에서는 발생하지 않지만, @ref{cb,,signal} 처리기에서 I/O를 수행한다면 발생할 수 있습니다. 스레드가 이미 액세스 중인 버퍼링 된 객체에 다시 진입하려고 하면, @ref{244,,RuntimeError}가 발생합니다. 이것이 다른 스레드가 버퍼링 된 객체에 진입하는 것을 막는 것은 아님에 유의하십시오.

@ref{316,,open()} 함수는 버퍼링 된 객체를 @ref{9be,,TextIOWrapper} 안에 감싸기 때문에, 위의 내용은 텍스트 파일에도 묵시적으로 확장됩니다. 여기에는 표준 스트림이 포함되므로 내장 @ref{1174,,print()} 함수에도 영향을 줍니다.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node time — 시간 액세스와 변환,logging — 파이썬 로깅 시설,io — 스트림 작업을 위한 핵심 도구,일반 운영 체제 서비스
@anchor{library/time doc}@anchor{3157}@anchor{library/time module-time}@anchor{f4}@anchor{library/time time-time-access-and-conversions}@anchor{3158}@anchor{library/time translation-repo}@anchor{3159}
@subsection @code{time} — 시간 액세스와 변환


@geindex module; time


__________________________________________________________________


이 모듈은 다양한 시간 관련 함수를 제공합니다. 관련 기능에 대해서는, @ref{34,,datetime}과 @ref{15,,calendar} 모듈도 참조하십시오.

이 모듈을 항상 사용할 수 있지만, 모든 플랫폼에서 모든 함수를 사용할 수 있는 것은 아닙니다. 이 모듈에 정의된 대부분의 함수는 같은 이름의 플랫폼 C 라이브러리 함수를 호출합니다. 이러한 함수의 의미는 플랫폼마다 달라서, 플랫폼 설명서를 참조하면 도움이 될 수 있습니다.

일부 용어와 관례에 대한 설명을 순서대로 제시합니다.

@geindex 에포크
@anchor{library/time epoch}@anchor{2f3a}

@itemize *

@item 
`에포크(epoch)'는 시간이 시작되는 시점이며, @code{time.gmtime(0)}의 반환값입니다. 모든 플랫폼에서 1970년 1월 1일, 00:00:00(UTC) 입니다.
@end itemize

@geindex 에포크 이후 초


@itemize *

@item 
용어 `에포크 이후의 초(seconds since the epoch)'는 에포크 이후로 총 지나간 초를 나타내는데, 보통 윤초@footnote{https://en.wikipedia.org/wiki/Leap_second}는 제외합니다. 모든 POSIX 호환 플랫폼에서 윤초는 이 총계에서 제외됩니다.
@end itemize

@geindex 2038년


@itemize *

@item 
이 모듈의 함수는 @ref{2f3a,,에포크} 전이나 먼 미래의 날짜와 시간을 처리하지 못할 수 있습니다. 미래의 컷오프 지점은 C 라이브러리에 의해 결정됩니다; 32비트 시스템의 경우, 일반적으로 2038년입니다.
@end itemize

@geindex 2자리 숫자 연도


@itemize *

@item 
함수 @ref{1632,,strptime()}은 @code{%y} 포맷 코드가 제공될 때 2자리 연도를 구문 분석할 수 있습니다. 2자리 연도를 구문 분석할 때, POSIX와 ISO C 표준에 따라 변환됩니다: 값 69–99는 1969–1999에, 값 0–68은 2000–2068에 매핑됩니다.
@end itemize

@geindex UTC
@geindex 협정 세계시
@geindex 그리니치 표준시


@itemize *

@item 
UTC is Coordinated Universal Time@footnote{https://en.wikipedia.org/wiki/Coordinated_Universal_Time} and superseded Greenwich Mean Time@footnote{https://en.wikipedia.org/wiki/Greenwich_Mean_Time} or
GMT as the basis of international timekeeping. The acronym UTC is not a
mistake but conforms to an earlier, language-agnostic naming scheme for time
standards such as UT0, UT1, and UT2.
@end itemize

@geindex 일광 절약 시간


@itemize *

@item 
DST는 일광 절약 시간(Daylight Saving Time)인데, 일 년 중 일부 기간 시간대를 (일반적으로) 한 시간 조정합니다. DST 규칙은 매직(현지 법에 따라 결정됩니다)이며 해가 바뀜에 따라 변경될 수 있습니다. C 라이브러리에는 현지 규칙이 포함된 테이블이 있으며 (종종 유연성을 위해 시스템 파일에서 읽습니다) 이 점에서 진정한 지혜(True Wisdom)의 유일한 원천입니다.

@item 
다양한 실시간 함수의 정밀도는 값이나 인자가 표현되는 단위가 제안하는 것보다 못할 수 있습니다. 예를 들어 대부분의 유닉스 시스템에서 시계는 초당 50회나 100회만 “틱(ticks)”합니다.

@item 
반면에, @ref{55c,,time()}과 @ref{8ab,,sleep()}의 정밀도는 그들의 유닉스의 해당하는 것보다 낫습니다: 시간은 부동 소수점 숫자로 표현되고, @code{time()}은 사용 가능한 가장 정확한 시간을 반환하며 (사용할 수 있으면 유닉스 @code{gettimeofday()}를 사용합니다), @code{sleep()}은 0이 아닌 소수부를 갖는 시간을 받아들입니다 (사용할 수 있으면, 이것을 구현하는 데 유닉스 @code{select()}를 사용합니다).

@item 
@ref{13c5,,gmtime()}, @ref{16fe,,localtime()} 및 @ref{1632,,strptime()}에 의해 반환되고 @ref{13ec,,asctime()}, @ref{13ed,,mktime()} 및 @ref{13ee,,strftime()}이 받아들이는 시간 값은 9개의 정수의 시퀀스입니다. @code{gmtime()}, @code{localtime()} 및 @code{strptime()}의 반환 값은 개별 필드에 대한 어트리뷰트 이름도 제공합니다.

이러한 객체에 대한 설명은 @ref{ee5,,struct_time}을 참조하십시오.


버전 3.3에서 변경: 플랫폼이 해당 @code{struct tm} 멤버를 지원할 때 @ref{315a,,tm_gmtoff}와 @ref{315b,,tm_zone} 어트리뷰트를 제공하도록 @ref{ee5,,struct_time} 형이 확장되었습니다.



버전 3.6에서 변경: @ref{ee5,,struct_time} 어트리뷰트 @ref{315a,,tm_gmtoff}와 @ref{315b,,tm_zone}은 이제 모든 플랫폼에서 사용 가능합니다.


@item 
시간 표현 간에 변환하려면 다음 함수를 사용하십시오:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

변환 전

@tab

변환 후

@tab

변환 함수

@item

에포크 이후 초

@tab

UTC의 @ref{ee5,,struct_time}

@tab

@ref{13c5,,gmtime()}

@item

에포크 이후 초

@tab

현지 시간의 @ref{ee5,,struct_time}

@tab

@ref{16fe,,localtime()}

@item

UTC의 @ref{ee5,,struct_time}

@tab

에포크 이후 초

@tab

@ref{296b,,calendar.timegm()}

@item

현지 시간의 @ref{ee5,,struct_time}

@tab

에포크 이후 초

@tab

@ref{13ed,,mktime()}

@end multitable

@end itemize

@menu
* 함수: 함수<4>. 
* 시계 ID 상수:: 
* 시간대 상수:: 

@end menu

@node 함수<4>,시계 ID 상수,,time — 시간 액세스와 변환
@anchor{library/time functions}@anchor{315c}@anchor{library/time time-functions}@anchor{315d}
@subsubsection 함수


@geindex asctime() (time 모듈)
@anchor{library/time time asctime}@anchor{13ec}
@deffn {함수} time.asctime ([t])

@ref{13c5,,gmtime()}이나 @ref{16fe,,localtime()} 이 반환한 시간을 나타내는 튜플이나 @ref{ee5,,struct_time}을 @code{'Sun Jun 20 23:21:05 1993'} 형식의 문자열로 변환합니다. 날짜(day) 필드는 두 문자 길이이며 날짜가 한자리이면 스페이스로 채워집니다, 예를 들어: @code{'Wed Jun  9 04:26:40 1993'}.

`t'가 제공되지 않으면, @ref{16fe,,localtime()} 에서 반환된 현재 시각이 사용됩니다. 로케일 정보는 @ref{13ec,,asctime()}에서 사용되지 않습니다.

@cartouche
@quotation 참고 
같은 이름의 C 함수와 달리, @ref{13ec,,asctime()}은 끝에 줄 바꿈을 추가하지 않습니다.
@end quotation
@end cartouche
@end deffn

@geindex pthread_getcpuclockid() (time 모듈)
@anchor{library/time time pthread_getcpuclockid}@anchor{d8a}
@deffn {함수} time.pthread_getcpuclockid (thread_id)

지정된 `thread_id'에 대한 스레드 특정 CPU-시간 시계의 `clk_id'를 반환합니다.

`thread_id'에 적합한 값을 얻으려면 @ref{135f,,threading.get_ident()} 나 @ref{176,,threading.Thread} 객체의 @ref{315e,,ident} 어트리뷰트를 사용하십시오.

@cartouche
@quotation 경고 
유효하지 않거나 만료된 `thread_id'를 전달하면 정의되지 않은 동작이 발생할 수 있습니다, 가령 세그먼트 폴트(segmentation fault).
@end quotation
@end cartouche

@ref{213c,,가용성}: Unix

자세한 내용은 @code{pthread_getcpuclockid(3)@footnote{https://manpages.debian.org/pthread_getcpuclockid(3)}} 매뉴얼 페이지를 참조하십시오.


Added in version 3.7.

@end deffn

@geindex clock_getres() (time 모듈)
@anchor{library/time time clock_getres}@anchor{1362}
@deffn {함수} time.clock_getres (clk_id)

지정된 시계 `clk_id'의 해상도(정밀도)를 반환합니다. `clk_id'에 허용되는 값 리스트는 @ref{30d4,,시계 ID 상수}를 참조하십시오.

@ref{213c,,가용성}: Unix.


Added in version 3.3.

@end deffn

@geindex clock_gettime() (time 모듈)
@anchor{library/time time clock_gettime}@anchor{1363}
@deffn {함수} time.clock_gettime (clk_id) -> float

지정된 시계 `clk_id'의 시간을 반환합니다. `clk_id'에 허용되는 값 리스트는 @ref{30d4,,시계 ID 상수}를 참조하십시오.

Use @ref{cda,,clock_gettime_ns()} to avoid the precision loss caused by the
@ref{196,,float} type.

@ref{213c,,가용성}: Unix.


Added in version 3.3.

@end deffn

@geindex clock_gettime_ns() (time 모듈)
@anchor{library/time time clock_gettime_ns}@anchor{cda}
@deffn {함수} time.clock_gettime_ns (clk_id) -> int

@ref{1363,,clock_gettime()}과 비슷하지만, 시간을 나노초로 반환합니다.

@ref{213c,,가용성}: Unix.


Added in version 3.7.

@end deffn

@geindex clock_settime() (time 모듈)
@anchor{library/time time clock_settime}@anchor{1364}
@deffn {함수} time.clock_settime (clk_id, time: float)

지정된 시계 `clk_id'의 시간을 설정합니다. 현재, @ref{8a8,,CLOCK_REALTIME}이 `clk_id'에 대해 유일하게 허용되는 값입니다.

Use @ref{cdb,,clock_settime_ns()} to avoid the precision loss caused by the
@ref{196,,float} type.

@ref{213c,,가용성}: Unix, not Android, not iOS.


Added in version 3.3.

@end deffn

@geindex clock_settime_ns() (time 모듈)
@anchor{library/time time clock_settime_ns}@anchor{cdb}
@deffn {함수} time.clock_settime_ns (clk_id, time: int)

@ref{1364,,clock_settime()}과 비슷하지만, 나노초로 시간을 설정합니다.

@ref{213c,,가용성}: Unix, not Android, not iOS.


Added in version 3.7.

@end deffn

@geindex ctime() (time 모듈)
@anchor{library/time time ctime}@anchor{28e9}
@deffn {함수} time.ctime ([secs])

@ref{2f3a,,에포크} 이후 초로 표현된 시간을 현지 시간을 나타내는 @code{'Sun Jun 20 23:21:05 1993'} 형식의 문자열로 변환합니다. 날짜(day) 필드는 두 문자 길이이며 날짜가 한자리이면 스페이스로 채워집니다, 예를 들어: @code{'Wed Jun  9 04:26:40 1993'}.

`secs'가 제공되지 않거나 @ref{884,,None}이면, @ref{55c,,time()}이 반환하는 현재 시각이 사용됩니다. @code{ctime(secs)}는 @code{asctime(localtime(secs))}와 동등합니다. 로케일 정보는 @ref{28e9,,ctime()}에서 사용되지 않습니다.
@end deffn

@geindex get_clock_info() (time 모듈)
@anchor{library/time time get_clock_info}@anchor{1361}
@deffn {함수} time.get_clock_info (name)

지정된 시계에 대한 정보를 이름 공간 객체로 가져옵니다. 지원되는 시계 이름과 그 값을 읽는 해당 함수는 다음과 같습니다:


@itemize *

@item 
@code{'monotonic'}: @ref{55b,,time.monotonic()}

@item 
@code{'perf_counter'}: @ref{c79,,time.perf_counter()}

@item 
@code{'process_time'}: @ref{c7a,,time.process_time()}

@item 
@code{'thread_time'}: @ref{b30,,time.thread_time()}

@item 
@code{'time'}: @ref{55c,,time.time()}
@end itemize

결과는 다음과 같은 어트리뷰트를 갖습니다:


@itemize -

@item 
`adjustable': @code{True} if the clock can be set to jump forward or backward
in time, @code{False} otherwise. Does not refer to gradual NTP rate adjustments.

@item 
`implementation': 시계값을 얻는 데 사용되는 하부 C 함수의 이름. 가능한 값은 @ref{30d4,,시계 ID 상수}를 참조하십시오.

@item 
`monotonic': 시계가 뒤로 이동할 수 없으면 @code{True}, 그렇지 않으면 @code{False}

@item 
`resolution': 초 단위의 시계 해상도 (@ref{196,,float})
@end itemize


Added in version 3.3.

@end deffn

@geindex gmtime() (time 모듈)
@anchor{library/time time gmtime}@anchor{13c5}
@deffn {함수} time.gmtime ([secs])

@ref{2f3a,,에포크} 이후의 초 단위 시간을 dst 플래그가 항상 0인 UTC인 @ref{ee5,,struct_time}으로 변환합니다. `secs'가 제공되지 않거나 @ref{884,,None}이면, @ref{55c,,time()}에서 반환된 현재 시각이 사용됩니다. 초의 소수부는 무시됩니다. @code{struct_time} 객체에 대한 설명은 위를 참조하십시오. 이 함수의 역에 대해서는 @ref{296b,,calendar.timegm()}을 참조하십시오.
@end deffn

@geindex localtime() (time 모듈)
@anchor{library/time time localtime}@anchor{16fe}
@deffn {함수} time.localtime ([secs])

@ref{13c5,,gmtime()}과 같지만, 현지 시간으로 변환합니다. `secs'가 제공되지 않거나 @ref{884,,None}이면 @ref{55c,,time()}에서 반환된 현재 시각이 사용됩니다. DST가 주어진 시간에 적용되면 dst 플래그는 @code{1}로 설정됩니다.

@code{localtime()} may raise @ref{a81,,OverflowError}, if the timestamp is
outside the range of values supported by the platform C @code{localtime()}
or @code{gmtime()} functions, and @ref{2c0,,OSError} on @code{localtime()} or
@code{gmtime()} failure. It’s common for this to be restricted to years
between 1970 and 2038.
@end deffn

@geindex mktime() (time 모듈)
@anchor{library/time time mktime}@anchor{13ed}
@deffn {함수} time.mktime (t)

이것은 @ref{16fe,,localtime()} 의 역함수입니다. 인자는 UTC가 아니라 `현지' 시간으로 시간을 표현하는 @ref{ee5,,struct_time}이나 전체 9-튜플 (dst 플래그가 필요하기 때문에; 알 수 없으면 dst 플래그로 @code{-1}을 사용하십시오)입니다. @ref{55c,,time()}과의 호환성을 위해, 부동 소수점 숫자를 반환합니다. 입력값을 유효한 시간으로 표현할 수 없으면, @ref{a81,,OverflowError}나 @ref{2ec,,ValueError}가 발생합니다 (유효하지 않은 값이 파이썬이나 하부 C 라이브러리 중 어디에서 잡히는지에 따라 다릅니다). 시간을 생성 할 수 있는 가장 이른 날짜는 플랫폼에 따라 다릅니다.
@end deffn

@geindex monotonic() (time 모듈)
@anchor{library/time time monotonic}@anchor{55b}
@deffn {함수} time.monotonic () -> float

단조(monotonic) 시계, 즉 뒤로 갈 수 없는 시계의 값을 (소수부가 있는 초로) 반환합니다. 시계는 시스템 시계 갱신의 영향을 받지 않습니다. 반환된 값의 기준점은 정의되어 있지 않아서, 두 호출 결과 간의 차이만 유효합니다.

Clock:


@itemize *

@item 
On Windows, call @code{QueryPerformanceCounter()} and
@code{QueryPerformanceFrequency()}.

@item 
On macOS, call @code{mach_absolute_time()} and @code{mach_timebase_info()}.

@item 
On HP-UX, call @code{gethrtime()}.

@item 
Call @code{clock_gettime(CLOCK_HIGHRES)} if available.

@item 
Otherwise, call @code{clock_gettime(CLOCK_MONOTONIC)}.
@end itemize

Use @ref{cdc,,monotonic_ns()} to avoid the precision loss caused by the
@ref{196,,float} type.


Added in version 3.3.



버전 3.5에서 변경: The function is now always available and the clock is now the same for
all processes.



버전 3.10에서 변경: On macOS, the clock is now the same for all processes.

@end deffn

@geindex monotonic_ns() (time 모듈)
@anchor{library/time time monotonic_ns}@anchor{cdc}
@deffn {함수} time.monotonic_ns () -> int

@ref{55b,,monotonic()}과 비슷하지만, 시간을 나노초로 반환합니다.


Added in version 3.7.

@end deffn

@geindex perf_counter() (time 모듈)
@anchor{library/time time perf_counter}@anchor{c79}
@deffn {함수} time.perf_counter () -> float

@geindex 벤치마킹

Return the value (in fractional seconds) of a performance counter, i.e. a
clock with the highest available resolution to measure a short duration.  It
does include time elapsed during sleep. The clock is the same for all
processes. The reference
point of the returned value is undefined, so that only the difference between
the results of two calls is valid.

`CPython 구현 상세:' On CPython, use the same clock as @ref{55b,,time.monotonic()} and is a
monotonic clock, i.e. a clock that cannot go backwards.

Use @ref{cdd,,perf_counter_ns()} to avoid the precision loss caused by the
@ref{196,,float} type.


Added in version 3.3.



버전 3.10에서 변경: On Windows, the clock is now the same for all processes.



버전 3.13에서 변경: @ref{55b,,time.monotonic()} 과 같은 시계를 사용합니다.

@end deffn

@geindex perf_counter_ns() (time 모듈)
@anchor{library/time time perf_counter_ns}@anchor{cdd}
@deffn {함수} time.perf_counter_ns () -> int

@ref{c79,,perf_counter()}와 비슷하지만, 시간을 나노초로 반환합니다.


Added in version 3.7.

@end deffn

@geindex process_time() (time 모듈)
@anchor{library/time time process_time}@anchor{c7a}
@deffn {함수} time.process_time () -> float

@geindex CPU 시간
@geindex 프로세서 시간
@geindex 벤치마킹

현재 프로세스의 시스템과 사용자 CPU 시간 합계의 값을 (소수부가 있는 초로) 반환합니다. 수면 중 경과 시간은 포함되지 않습니다. 정의상 프로세스 수준입니다. 반환된 값의 기준점은 정의되어 있지 않아서, 두 호출 결과 간의 차이만 유효합니다.

Use @ref{cde,,process_time_ns()} to avoid the precision loss caused by the
@ref{196,,float} type.


Added in version 3.3.

@end deffn

@geindex process_time_ns() (time 모듈)
@anchor{library/time time process_time_ns}@anchor{cde}
@deffn {함수} time.process_time_ns () -> int

@ref{c7a,,process_time()}과 비슷하지만, 시간을 나노초로 반환합니다.


Added in version 3.7.

@end deffn

@geindex sleep() (time 모듈)
@anchor{library/time time sleep}@anchor{8ab}
@deffn {함수} time.sleep (secs)

Suspend execution of the calling thread for the given number of seconds.
The argument may be a floating-point number to indicate a more precise sleep
time.

If the sleep is interrupted by a signal and no exception is raised by the
signal handler, the sleep is restarted with a recomputed timeout.

The suspension time may be longer than requested by an arbitrary amount,
because of the scheduling of other activity in the system.

@subsubheading 윈도우 구현


On Windows, if `secs' is zero, the thread relinquishes the remainder of its
time slice to any other thread that is ready to run. If there are no other
threads ready to run, the function returns immediately, and the thread
continues execution.  On Windows 10 and newer the implementation uses
a high-resolution timer@footnote{https://learn.microsoft.com/windows/win32/api/synchapi/nf-synchapi-createwaitabletimerexw}
which provides resolution of 100 nanoseconds. If `secs' is zero, @code{Sleep(0)} is used.

@subsubheading 유닉스 구현



@itemize *

@item 
Use @code{clock_nanosleep()} if available (resolution: 1 nanosecond);

@item 
Or use @code{nanosleep()} if available (resolution: 1 nanosecond);

@item 
Or use @code{select()} (resolution: 1 microsecond).
@end itemize

@cartouche
@quotation 참고 
To emulate a “no-op”, use @ref{17e,,pass} instead of @code{time.sleep(0)}.

To voluntarily relinquish the CPU, specify a real-time @ref{311b,,scheduling policy} and use @ref{1316,,os.sched_yield()} instead.
@end quotation
@end cartouche

Raises an @ref{1c6c,,auditing event} @code{time.sleep} with argument @code{secs}.


버전 3.5에서 변경: 시그널 처리기가 예외를 발생시키는 경우를 제외하고, 시그널에 의해 휴면이 중단되더라도 이 함수는 이제 최소한 `secs' 동안 휴면합니다 (근거는 
@geindex Python 향상 제안; PEP 475
PEP 475@footnote{https://peps.python.org/pep-0475/}를 참조하십시오).



버전 3.11에서 변경: On Unix, the @code{clock_nanosleep()} and @code{nanosleep()} functions are now
used if available. On Windows, a waitable timer is now used.



버전 3.13에서 변경: Raises an auditing event.

@end deffn

@geindex % (퍼센트);날짜/시간 형식

@geindex strftime() (time 모듈)
@anchor{library/time time strftime}@anchor{13ee}
@deffn {함수} time.strftime (format[, t])

@ref{13c5,,gmtime()}이나 @ref{16fe,,localtime()} 에 의해 반환된 시간을 나타내는 튜플이나 @ref{ee5,,struct_time}을 `format' 인자로 지정된 문자열로 변환합니다. `t'가 제공되지 않으면, @code{localtime()} 에서 반환된 현재 시각이 사용됩니다. `format'은 문자열이어야 합니다. `t'의 필드 중 어느 것이라도 허용 범위를 벗어나면 @ref{2ec,,ValueError}가 발생합니다.

0은 시간 튜플의 어느 위치에 대해서도 유효한 인자입니다; 그것이 일반적으로 유효하지 않으면 값이 올바른 값으로 강제 변환됩니다.

`format' 문자열은 다음 지시자(directives)를 포함할 수 있습니다. 선택적 필드 너비와 정밀도 명세 없이 표시되며, @ref{13ee,,strftime()} 결과에서 표시된 문자로 대체됩니다:


@multitable {xxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxx} 
@headitem

지시자

@tab

의미

@tab

노트

@item

@code{%a}

@tab

로케일의 약식 요일 이름.

@tab

@item

@code{%A}

@tab

로케일의 전체 요일 이름.

@tab

@item

@code{%b}

@tab

로케일의 약식 월 이름.

@tab

@item

@code{%B}

@tab

로케일의 전체 월 이름.

@tab

@item

@code{%c}

@tab

로케일의 적절한 날짜와 시간 표현.

@tab

@item

@code{%d}

@tab

월중 일(day of the month)을 십진수로 [01,31].

@tab

@item

@code{%f}

@tab


@table @asis

@item 마이크로 초를 십진수로

[000000,999999].
@end table

@tab

(1)

@item

@code{%H}

@tab

시(24시간제)를 십진수로 [00,23].

@tab

@item

@code{%I}

@tab

시(12시간제)를 십진수로 [01,12].

@tab

@item

@code{%j}

@tab

연중 일(day of the year)을 십진수로 [001,366].

@tab

@item

@code{%m}

@tab

월을 십진수로 [01,12].

@tab

@item

@code{%M}

@tab

분을 십진수로 [00,59].

@tab

@item

@code{%p}

@tab

AM이나 PM에 해당하는 로케일의 값.

@tab

(2)

@item

@code{%S}

@tab

초를 십진수로 [00,61].

@tab

(3)

@item

@code{%U}

@tab

연중 주 번호(일요일이 주의 시작)를 십진수로 [00,53]. 첫 번째 일요일에 선행하는 새해의 모든 날은 주 0으로 간주합니다.

@tab

(4)

@item

@code{%u}

@tab

요일(월요일은 1; 일요일은 7)을 십진수로 [1, 7].

@tab

@item

@code{%w}

@tab

요일을 십진수로 [0(일요일),6].

@tab

@item

@code{%W}

@tab

연중 주 번호(월요일이 주의 시작)를 십진수로 [00,53]. 첫 번째 월요일에 선행하는 새해의 모든 말은 주 0으로 간주합니다.

@tab

(4)

@item

@code{%x}

@tab

로케일의 적절한 날짜 표현.

@tab

@item

@code{%X}

@tab

로케일의 적절한 시간 표현.

@tab

@item

@code{%y}

@tab

세기가 없는 해(year)를 십진수로 [00,99].

@tab

@item

@code{%Y}

@tab

세기가 있는 해(year)를 십진수로.

@tab

@item

@code{%z}

@tab

UTC/GMT로부터의 양이나 음의 시차를 +HHMM 또는 -HHMM 형식으로 나타내는 시간대 오프셋. 여기서 H는 십진수 시 숫자를 나타내고 M은 십진수 분 숫자를 나타냅니다 [-23:59, +23:59]. @footnote{
The use of @code{%Z} is now deprecated, but the @code{%z} escape that expands to the
preferred hour/minute offset is not supported by all ANSI C libraries. Also, a
strict reading of the original 1982 
@geindex RFC; RFC 822
@uref{https://datatracker.ietf.org/doc/html/rfc822.html,RFC 822} standard calls for a two-digit
year (@code{%y} rather than @code{%Y}), but practice moved to 4-digit years long before the
year 2000.  After that, 
@geindex RFC; RFC 822
@uref{https://datatracker.ietf.org/doc/html/rfc822.html,RFC 822} became obsolete and the 4-digit year has
been first recommended by 
@geindex RFC; RFC 1123
@uref{https://datatracker.ietf.org/doc/html/rfc1123.html,RFC 1123} and then mandated by 
@geindex RFC; RFC 2822
@uref{https://datatracker.ietf.org/doc/html/rfc2822.html,RFC 2822},
with 
@geindex RFC; RFC 5322
@uref{https://datatracker.ietf.org/doc/html/rfc5322.html,RFC 5322} continuing this requirement.
}

@tab

@item

@code{%Z}

@tab

시간대 이름 (시간대가 없으면 문자가 없습니다). 폐지되었습니다. @footnote{
The use of @code{%Z} is now deprecated, but the @code{%z} escape that expands to the
preferred hour/minute offset is not supported by all ANSI C libraries. Also, a
strict reading of the original 1982 
@geindex RFC; RFC 822
@uref{https://datatracker.ietf.org/doc/html/rfc822.html,RFC 822} standard calls for a two-digit
year (@code{%y} rather than @code{%Y}), but practice moved to 4-digit years long before the
year 2000.  After that, 
@geindex RFC; RFC 822
@uref{https://datatracker.ietf.org/doc/html/rfc822.html,RFC 822} became obsolete and the 4-digit year has
been first recommended by 
@geindex RFC; RFC 1123
@uref{https://datatracker.ietf.org/doc/html/rfc1123.html,RFC 1123} and then mandated by 
@geindex RFC; RFC 2822
@uref{https://datatracker.ietf.org/doc/html/rfc2822.html,RFC 2822},
with 
@geindex RFC; RFC 5322
@uref{https://datatracker.ietf.org/doc/html/rfc5322.html,RFC 5322} continuing this requirement.
}

@tab

@item

@code{%G}

@tab

ISO 8601 year (similar to @code{%Y} but follows
the rules for the ISO 8601 calendar year).
The year starts with the week that contains
the first Thursday of the calendar year.

@tab

@item

@code{%V}

@tab

ISO 8601 week number (as a decimal number
[01,53]). The first week of the year is the
one that contains the first Thursday of the
year. Weeks start on Monday.

@tab

@item

@code{%%}

@tab

리터럴 @code{'%'} 문자.

@tab

@end multitable


노트:


@enumerate 

@item 
The @code{%f} format directive only applies to @ref{1632,,strptime()},
not to @code{strftime()}. However, see also @ref{1951,,datetime.datetime.strptime()} and
@ref{e8d,,datetime.datetime.strftime()} where the @code{%f} format directive
@ref{28bb,,applies to microseconds}.

@item 
@ref{1632,,strptime()} 함수와 함께 사용할 때, @code{%I} 지시자를 사용하여 시(hour)를 구문 분석하면 @code{%p} 지시자는 출력 시(hour) 필드에만 영향을 줍니다.
@end enumerate
@anchor{library/time leap-second}@anchor{315f}

@enumerate 3

@item 
범위는 실제로 @code{0}에서 @code{61}입니다; 값 @code{60}은 윤초@footnote{https://en.wikipedia.org/wiki/Leap_second}를 나타내는 타임 스탬프에서 유효하고 값 @code{61}은 역사적 이유로 지원됩니다.

@item 
@ref{1632,,strptime()} 함수와 함께 사용할 때, @code{%U}와 @code{%W}는 주중 일(day of the week)과 해(year)가 지정된 경우에만 계산에 사용됩니다.
@end enumerate

Here is an example, a format for dates compatible with that specified  in the
@geindex RFC; RFC 5322
RFC 5322@footnote{https://datatracker.ietf.org/doc/html/rfc5322.html} Internet email standard.  @footnote{
The use of @code{%Z} is now deprecated, but the @code{%z} escape that expands to the
preferred hour/minute offset is not supported by all ANSI C libraries. Also, a
strict reading of the original 1982 
@geindex RFC; RFC 822
@uref{https://datatracker.ietf.org/doc/html/rfc822.html,RFC 822} standard calls for a two-digit
year (@code{%y} rather than @code{%Y}), but practice moved to 4-digit years long before the
year 2000.  After that, 
@geindex RFC; RFC 822
@uref{https://datatracker.ietf.org/doc/html/rfc822.html,RFC 822} became obsolete and the 4-digit year has
been first recommended by 
@geindex RFC; RFC 1123
@uref{https://datatracker.ietf.org/doc/html/rfc1123.html,RFC 1123} and then mandated by 
@geindex RFC; RFC 2822
@uref{https://datatracker.ietf.org/doc/html/rfc2822.html,RFC 2822},
with 
@geindex RFC; RFC 5322
@uref{https://datatracker.ietf.org/doc/html/rfc5322.html,RFC 5322} continuing this requirement.
}

@example
>>> from time import gmtime, strftime
>>> strftime("%a, %d %b %Y %H:%M:%S +0000", gmtime())
'Thu, 28 Jun 2001 14:17:15 +0000'
@end example

특정 플랫폼에서는 추가 지시자가 지원될 수 있지만, 여기에 나열된 지시자에만 ANSI C에서 표준화된 의미가 있습니다. 플랫폼에서 지원되는 전체 포맷 코드 집합을 보려면, @code{strftime(3)@footnote{https://manpages.debian.org/strftime(3)}} 설명서를 참조하십시오.

일부 플랫폼에서, 선택적 필드 너비와 정밀도 명세는 지시자의 초기 @code{'%'} 뒤에 그 순서대로 나올 수 있습니다; 이것 또한 이식성이 없습니다. 필드 너비는 일반적으로 2이며, @code{%j}는 3입니다.
@end deffn

@geindex % (퍼센트);날짜/시간 형식

@geindex strptime() (time 모듈)
@anchor{library/time time strptime}@anchor{1632}
@deffn {함수} time.strptime (string[, format])

포맷(format)에 따라 시간을 나타내는 문자열을 구문 분석합니다. 반환 값은 @ref{13c5,,gmtime()}이나 @ref{16fe,,localtime()} 에 의해 반환되는 것과 같은 @ref{ee5,,struct_time}입니다.

`format' 매개 변수는 @ref{13ee,,strftime()}에서 사용된 것과 같은 지시자를 사용합니다; 기본값은 @ref{28e9,,ctime()}이 반환한 포맷과 일치하는 @code{"%a %b %d %H:%M:%S %Y"}입니다. `format'에 따라 `string'을 구문 분석할 수 없거나, 구문 분석 후 여분의 데이터가 있으면, @ref{2ec,,ValueError}가 발생합니다. 더 정확한 값을 유추할 수 없을 때 누락된 데이터를 채우는 데 사용되는 기본값은 @code{(1900, 1, 1, 0, 0, 0, 0, 1, -1)}입니다. `string'과 `format'은 모두 문자열이어야 합니다.

예를 들면:

@example
>>> import time
>>> time.strptime("30 Nov 00", "%d %b %y")
time.struct_time(tm_year=2000, tm_mon=11, tm_mday=30, tm_hour=0, tm_min=0,
                 tm_sec=0, tm_wday=3, tm_yday=335, tm_isdst=-1)
@end example

@code{%Z} 지시자에 대한 지원은 @code{tzname}에 포함된 값과 @code{daylight}가 참인지를 기반으로 합니다. 이로 인해, 항상 알려진 (그리고 일광 절약 시간제가 아닌 시간대로 간주하는) UTC와 GMT를 인식하는 것을 제외하고는 플랫폼에 따라 다릅니다.

설명서에 지정된 지시자만 지원됩니다. @code{strftime()}은 플랫폼별로 구현되기 때문에 때로는 나열된 것보다 많은 지시자를 제공할 수 있습니다. 그러나 @code{strptime()}은 플랫폼과 독립적이라서 지원된다고 설명하지 않은 사용 가능한 모든 지시자를 반드시 지원하지는 않습니다.
@end deffn

@geindex struct_time (time 클래스)
@anchor{library/time time struct_time}@anchor{ee5}
@deffn {클래스} time.struct_time

@ref{13c5,,gmtime()}, @ref{16fe,,localtime()} 및 @ref{1632,,strptime()}이 반환하는 시간 값 시퀀스의 형. @ref{85d,,네임드 튜플} 인터페이스를 갖는 객체입니다: 인덱스와 어트리뷰트 이름으로 값에 액세스 할 수 있습니다. 다음과 같은 값이 있습니다:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

인덱스

@tab

어트리뷰트

@tab

값

@item

0

@tab

@geindex tm_year (time.struct_time의 속성)
@anchor{library/time time struct_time tm_year}@anchor{16fd}
@deffn {속성} tm_year
@end deffn

@tab

(예를 들어, 1993)

@item

1

@tab

@geindex tm_mon (time.struct_time의 속성)
@anchor{library/time time struct_time tm_mon}@anchor{3160}
@deffn {속성} tm_mon
@end deffn

@tab

범위 [1, 12]

@item

2

@tab

@geindex tm_mday (time.struct_time의 속성)
@anchor{library/time time struct_time tm_mday}@anchor{3161}
@deffn {속성} tm_mday
@end deffn

@tab

범위 [1, 31]

@item

3

@tab

@geindex tm_hour (time.struct_time의 속성)
@anchor{library/time time struct_time tm_hour}@anchor{3162}
@deffn {속성} tm_hour
@end deffn

@tab

범위 [0, 23]

@item

4

@tab

@geindex tm_min (time.struct_time의 속성)
@anchor{library/time time struct_time tm_min}@anchor{3163}
@deffn {속성} tm_min
@end deffn

@tab

범위 [0, 59]

@item

5

@tab

@geindex tm_sec (time.struct_time의 속성)
@anchor{library/time time struct_time tm_sec}@anchor{3164}
@deffn {속성} tm_sec
@end deffn

@tab

범위 [0, 61]; @ref{13ee,,strftime()} 의 @ref{315f,,노트 (2)}를 참조하십시오

@item

6

@tab

@geindex tm_wday (time.struct_time의 속성)
@anchor{library/time time struct_time tm_wday}@anchor{3165}
@deffn {속성} tm_wday
@end deffn

@tab

범위 [0, 6]; 월요일은 0

@item

7

@tab

@geindex tm_yday (time.struct_time의 속성)
@anchor{library/time time struct_time tm_yday}@anchor{3166}
@deffn {속성} tm_yday
@end deffn

@tab

범위 [1, 366]

@item

8

@tab

@geindex tm_isdst (time.struct_time의 속성)
@anchor{library/time time struct_time tm_isdst}@anchor{28fa}
@deffn {속성} tm_isdst
@end deffn

@tab

0, 1 또는 -1; 아래를 참조하십시오

@item

해당 없음

@tab

@geindex tm_zone (time.struct_time의 속성)
@anchor{library/time time struct_time tm_zone}@anchor{315b}
@deffn {속성} tm_zone
@end deffn

@tab

시간대 이름의 약어

@item

해당 없음

@tab

@geindex tm_gmtoff (time.struct_time의 속성)
@anchor{library/time time struct_time tm_gmtoff}@anchor{315a}
@deffn {속성} tm_gmtoff
@end deffn

@tab

UTC에서 동쪽으로 초 단위 오프셋

@end multitable


C 구조체와 달리, 월 값의 범위는 [0, 11]이 아니라 [1, 12] 임에 유의하십시오.

@ref{13ed,,mktime()} 호출에서, 일광 절약 시간제가 발효 중이면 @ref{28fa,,tm_isdst}가 1로 설정되고, 그렇지 않으면 0으로 설정될 수 있습니다. 값이 -1이면 알 수 없다는 뜻이고, 일반적으로 올바른 상태가 채워집니다.

길이가 잘못된 튜플이 @ref{ee5,,struct_time}을 기대하는 함수에 전달되거나, 잘못된 형의 요소가 있으면, @ref{198,,TypeError}가 발생합니다.
@end deffn

@geindex time() (time 모듈)
@anchor{library/time time time}@anchor{55c}
@deffn {함수} time.time () -> float

@ref{2f3a,,에포크} 이후 초를 나타내는 시간을 부동 소수점 숫자로 반환합니다. 윤초@footnote{https://en.wikipedia.org/wiki/Leap_second}의 처리는 플랫폼에 따라 다릅니다. 윈도우와 대부분의 유닉스 시스템에서, 윤초는 @ref{2f3a,,에포크} 이후의 초를 나타내는 시간에 계산되지 않습니다. 이것을 흔히 유닉스 시간@footnote{https://en.wikipedia.org/wiki/Unix_time}이라고 합니다.

시간이 항상 부동 소수점 숫자로 반환되더라도, 모든 시스템이 1초보다 정밀한 정밀도를 제공하는 것은 아님에 유의하십시오. 이 함수는 일반적으로 감소하지 않는 값을 반환하지만, 두 호출 사이에 시스템 시계가 뒤로 설정되면 이전 호출보다 작은 값을 반환할 수 있습니다.

@ref{55c,,time()}에 의해 반환된 숫자는 더 일반적인 시간 형식(즉 년, 월, 일, 시 등…)으로 변환될 수 있는데, @ref{13c5,,gmtime()} 함수에 전달하여 UTC로, @ref{16fe,,localtime()} 함수에 전달하여 현지 시간으로 변환할 수 있습니다. 두 경우 모두 달력 날짜의 구성 요소를 어트리뷰트로 액세스 할 수 있는 @ref{ee5,,struct_time} 객체가 반환됩니다.

Clock:


@itemize *

@item 
On Windows, call @code{GetSystemTimePreciseAsFileTime()}.

@item 
Call @code{clock_gettime(CLOCK_REALTIME)} if available.

@item 
Otherwise, call @code{gettimeofday()}.
@end itemize

Use @ref{cdf,,time_ns()} to avoid the precision loss caused by the @ref{196,,float}
type.
@end deffn


버전 3.13에서 변경: On Windows, calls @code{GetSystemTimePreciseAsFileTime()} instead of
@code{GetSystemTimeAsFileTime()}.


@geindex time_ns() (time 모듈)
@anchor{library/time time time_ns}@anchor{cdf}
@deffn {함수} time.time_ns () -> int

@ref{55c,,time()}과 비슷하지만, 시간을 @ref{2f3a,,에포크} 이후의 나노초를 나타내는 정수로 반환합니다.


Added in version 3.7.

@end deffn

@geindex thread_time() (time 모듈)
@anchor{library/time time thread_time}@anchor{b30}
@deffn {함수} time.thread_time () -> float

@geindex CPU 시간
@geindex 프로세서 시간
@geindex 벤치마킹

현재 스레드의 시스템과 사용자 CPU 시간 합계의 값을 (소수부가 있는 초로) 반환합니다. 수면 중에 지난 시간은 포함되지 않습니다. 정의상 스레드 수준입니다. 반환된 값의 기준점은 정의되어 있지 않아서, 같은 스레드에서 이루어지는 두 호출 결과 간의 차이만 유효합니다.

Use @ref{d89,,thread_time_ns()} to avoid the precision loss caused by the
@ref{196,,float} type.

@ref{213c,,가용성}: Linux, Unix, Windows.

@code{CLOCK_THREAD_CPUTIME_ID}를 지원하는 유닉스 시스템.


Added in version 3.7.

@end deffn

@geindex thread_time_ns() (time 모듈)
@anchor{library/time time thread_time_ns}@anchor{d89}
@deffn {함수} time.thread_time_ns () -> int

@ref{b30,,thread_time()}과 비슷하지만, 시간을 나노초로 반환합니다.


Added in version 3.7.

@end deffn

@geindex tzset() (time 모듈)
@anchor{library/time time tzset}@anchor{3167}
@deffn {함수} time.tzset ()

라이브러리 루틴이 사용하는 시간 변환 규칙을 재설정합니다. 환경 변수 
@geindex TZ
@geindex 환경 변수; TZ
@code{TZ}는 이것이 수행되는 방법을 지정합니다. 또한 변수 @code{tzname} (
@geindex TZ
@geindex 환경 변수; TZ
@code{TZ} 환경 변수에서), @code{timezone} (UTC에서 서쪽으로 DST가 아닌 초), @code{altzone} (UTC에서 서쪽으로 DST 초) 및 @code{daylight} (이 시간대가 일광 절약 시간 규칙이 없으면 0으로, 일광 절약 시간이 적용될 때 시간, 과거, 현재 또는 미래가 있으면 0이 아닌 값으로)를 설정합니다.

@ref{213c,,가용성}: Unix.

@cartouche
@quotation 참고 
많은 경우에, 
@geindex TZ
@geindex 환경 변수; TZ
@code{TZ} 환경 변수를 변경하면 @ref{3167,,tzset()}을 호출하지 않고도 @ref{16fe,,localtime()} 과 같은 함수의 출력에 영향을 줄 수 있지만, 이 동작에 의존해서는 안 됩니다.

@geindex TZ
@geindex 환경 변수; TZ
@code{TZ} 환경 변수에는 공백이 없어야 합니다.
@end quotation
@end cartouche

@geindex TZ
@geindex 환경 변수; TZ
@code{TZ} 환경 변수의 표준 형식은 다음과 같습니다 (명확함을 위해 공백을 추가했습니다):

@example
std offset [dst [offset [,start[/time], end[/time]]]]
@end example

구성 요소는 다음과 같습니다:


@table @asis

@item @code{std}와 @code{dst}

시간대 약어를 제공하는 세 개 이상의 영숫자. 이들은 time.tzname으로 전파됩니다

@item @code{offset}

오프셋은 다음과 같은 형식입니다: @code{± hh[:mm[:ss]]}. UTC에 도달하기 위해 현지 시간에 더하는 값을 나타냅니다. 앞에 ‘-‘가 있으면, 시간대는 본초 자오선(Prime Meridian)의 동쪽입니다; 그렇지 않으면, 서쪽입니다. dst 다음에 오프셋이 없으면, 일광 절약 시간은 표준 시간보다 1시간 빠르다고 가정합니다.

@item @code{start[/time], end[/time]}

언제 DST로 변경하고, 언제 돌아오는지를 나타냅니다. 시작(start) 날짜와 종료(end) 날짜의 형식은 다음 중 하나입니다:


@table @asis

@item @code{J@var{n}}

율리우스 일 `n' (1 <= `n' <= 365). 윤일(leap days)은 계산되지 않아서, 모든 연도에서 2월 28일은 59일이고 3월 1일은 60일입니다.

@item @code{@var{n}}

0부터 시작하는 율리우스 일 (0 <= `n' <= 365). 윤일(leap days)이 계산되며, 2월 29일을 가리킬 수 있습니다.

@item @code{M@var{m}.@var{n}.@var{d}}

연중 월 `m'의 주 `n'의 `d'번째 요일 (0 <= `d' <= 6, 1 <= `n' <= 5, 1 <= `m' <= 12, 여기서 주 5는 “월 `m'의 마지막 `d' 요일”을 뜻하는데, 4번째나 5번째 주에 발생할 수 있습니다). 주 1은 `d'번째 요일이 등장하는 첫 주입니다. 요일 0은 일요일입니다.
@end table

@code{time}은 선행 부호(‘-‘나 ‘+’)가 허용되지 않는다는 점을 제외하고 @code{offset}과 형식이 같습니다. time이 제공되지 않으면, 기본값은 02:00:00입니다.
@end table

@example
>>> os.environ['TZ'] = 'EST+05EDT,M4.1.0,M10.5.0'
>>> time.tzset()
>>> time.strftime('%X %x %Z')
'02:07:36 05/08/03 EDT'
>>> os.environ['TZ'] = 'AEST-10AEDT-11,M10.5.0,M3.5.0'
>>> time.tzset()
>>> time.strftime('%X %x %Z')
'16:08:12 05/08/03 AEST'
@end example

많은 유닉스 시스템(*BSD, 리눅스, Solaris 및 Darwin을 포함합니다)에서, 시스템의 zoneinfo (@code{tzfile(5)@footnote{https://manpages.debian.org/tzfile(5)}}) 데이터베이스를 사용하여 시간대 규칙을 지정하는 것이 더 편리합니다. 이렇게 하려면, 
@geindex TZ
@geindex 환경 변수; TZ
@code{TZ} 환경 변수를 시스템 ‘zoneinfo’ 시간대 데이터베이스의 루트(일반적으로 @code{/usr/share/zoneinfo}에 있습니다)에 상대적인 필요한 시간대 데이터 파일의 경로로 설정하십시오. 예를 들어, @code{'US/Eastern'}, @code{'Australia/Melbourne'}, @code{'Egypt'} 또는 @code{'Europe/Amsterdam'}.

@example
>>> os.environ['TZ'] = 'US/Eastern'
>>> time.tzset()
>>> time.tzname
('EST', 'EDT')
>>> os.environ['TZ'] = 'Egypt'
>>> time.tzset()
>>> time.tzname
('EET', 'EEST')
@end example
@end deffn

@node 시계 ID 상수,시간대 상수,함수<4>,time — 시간 액세스와 변환
@anchor{library/time clock-id-constants}@anchor{3168}@anchor{library/time time-clock-id-constants}@anchor{30d4}
@subsubsection 시계 ID 상수


이 상수들은 @ref{1362,,clock_getres()}와 @ref{1363,,clock_gettime()}의 매개 변수로 사용됩니다.

@geindex CLOCK_BOOTTIME (time 모듈)
@anchor{library/time time CLOCK_BOOTTIME}@anchor{d86}
@deffn {데이터} time.CLOCK_BOOTTIME

@ref{8a7,,CLOCK_MONOTONIC}과 동일하지만, 시스템이 일시 중단된 시간도 포함합니다.

이를 통해 응용 프로그램은 @code{settimeofday()} 등을 사용하여 시간이 변경되면 불연속성이 발생할 수 있는 @ref{8a8,,CLOCK_REALTIME}의 복잡함을 다루지 않고도 일시 중단을 인식하는 단조 시계를 얻을 수 있습니다.

@ref{213c,,가용성}: Linux >= 2.6.39.


Added in version 3.7.

@end deffn

@geindex CLOCK_HIGHRES (time 모듈)
@anchor{library/time time CLOCK_HIGHRES}@anchor{3169}
@deffn {데이터} time.CLOCK_HIGHRES

Solaris OS에는 최적의 하드웨어 소스를 사용하려고 하는 @code{CLOCK_HIGHRES} 타이머가 있으며, 나노초에 가까운 해상도를 제공합니다. @code{CLOCK_HIGHRES}는 조정 불가능한 고해상도 시계입니다.

@ref{213c,,가용성}: Solaris.


Added in version 3.3.

@end deffn

@geindex CLOCK_MONOTONIC (time 모듈)
@anchor{library/time time CLOCK_MONOTONIC}@anchor{8a7}
@deffn {데이터} time.CLOCK_MONOTONIC

설정할 수 없고 어떤 지정되지 않은 시작점 이후의 단조 시간을 나타내는 시계.

@ref{213c,,가용성}: Unix.


Added in version 3.3.

@end deffn

@geindex CLOCK_MONOTONIC_RAW (time 모듈)
@anchor{library/time time CLOCK_MONOTONIC_RAW}@anchor{316a}
@deffn {데이터} time.CLOCK_MONOTONIC_RAW

@ref{8a7,,CLOCK_MONOTONIC}과 비슷하지만, NTP 조정이 적용되지 않는 원시 하드웨어 기반 시간에 대한 액세스를 제공합니다.

@ref{213c,,가용성}: Linux >= 2.6.28, macOS >= 10.12.


Added in version 3.3.

@end deffn

@geindex CLOCK_MONOTONIC_RAW_APPROX (time 모듈)
@anchor{library/time time CLOCK_MONOTONIC_RAW_APPROX}@anchor{316b}
@deffn {데이터} time.CLOCK_MONOTONIC_RAW_APPROX

Similar to @ref{316a,,CLOCK_MONOTONIC_RAW}, but reads a value cached by
the system at context switch and hence has less accuracy.

@ref{213c,,가용성}: macOS >= 10.12.


Added in version 3.13.

@end deffn

@geindex CLOCK_PROCESS_CPUTIME_ID (time 모듈)
@anchor{library/time time CLOCK_PROCESS_CPUTIME_ID}@anchor{316c}
@deffn {데이터} time.CLOCK_PROCESS_CPUTIME_ID

CPU의 고해상도 프로세스별 타이머.

@ref{213c,,가용성}: Unix.


Added in version 3.3.

@end deffn

@geindex CLOCK_PROF (time 모듈)
@anchor{library/time time CLOCK_PROF}@anchor{d87}
@deffn {데이터} time.CLOCK_PROF

CPU의 고해상도 프로세스별 타이머.

@ref{213c,,가용성}: FreeBSD, NetBSD >= 7, OpenBSD.


Added in version 3.7.

@end deffn

@geindex CLOCK_TAI (time 모듈)
@anchor{library/time time CLOCK_TAI}@anchor{1d54}
@deffn {데이터} time.CLOCK_TAI

International Atomic Time@footnote{https://www.nist.gov/pml/time-and-frequency-division/how-utcnist-related-coordinated-universal-time-utc-international}

이것이 정확한 답을 주려면 시스템에 최신 윤초 표가 있어야 합니다. PTP나 NTP 소프트웨어는 윤초 표를 유지할 수 있습니다.

@ref{213c,,가용성}: Linux.


Added in version 3.9.

@end deffn

@geindex CLOCK_THREAD_CPUTIME_ID (time 모듈)
@anchor{library/time time CLOCK_THREAD_CPUTIME_ID}@anchor{316d}
@deffn {데이터} time.CLOCK_THREAD_CPUTIME_ID

스레드별 CPU 시간 시계.

@ref{213c,,가용성}: Unix.


Added in version 3.3.

@end deffn

@geindex CLOCK_UPTIME (time 모듈)
@anchor{library/time time CLOCK_UPTIME}@anchor{d88}
@deffn {데이터} time.CLOCK_UPTIME

절댓값이 시스템이 실행되고 정지되지 않은 시간인 시간, 절대와 간격 모두로, 정확한 가동 시간 측정을 제공합니다.

@ref{213c,,가용성}: FreeBSD, OpenBSD >= 5.5.


Added in version 3.7.

@end deffn

@geindex CLOCK_UPTIME_RAW (time 모듈)
@anchor{library/time time CLOCK_UPTIME_RAW}@anchor{c36}
@deffn {데이터} time.CLOCK_UPTIME_RAW

주파수나 시간 조정에 영향을 받지 않고 시스템이 휴면하는 중에는 증가하지 않는 임의의 지점 이후의 시간을 추적하면서 단조 증가 하는 시계.

@ref{213c,,가용성}: macOS >= 10.12.


Added in version 3.8.

@end deffn

@geindex CLOCK_UPTIME_RAW_APPROX (time 모듈)
@anchor{library/time time CLOCK_UPTIME_RAW_APPROX}@anchor{316e}
@deffn {데이터} time.CLOCK_UPTIME_RAW_APPROX

Like @ref{c36,,CLOCK_UPTIME_RAW}, but the value is cached by the system
at context switches and therefore has less accuracy.

@ref{213c,,가용성}: macOS >= 10.12.


Added in version 3.13.

@end deffn

다음 상수는 @ref{1364,,clock_settime()}에 보낼 수 있는 유일한 매개 변수입니다.

@geindex CLOCK_REALTIME (time 모듈)
@anchor{library/time time CLOCK_REALTIME}@anchor{8a8}
@deffn {데이터} time.CLOCK_REALTIME

Real-time clock.  Setting this clock requires appropriate privileges.
The clock is the same for all processes.

@ref{213c,,가용성}: Unix.


Added in version 3.3.

@end deffn

@node 시간대 상수,,시계 ID 상수,time — 시간 액세스와 변환
@anchor{library/time time-timezone-constants}@anchor{316f}@anchor{library/time timezone-constants}@anchor{3170}
@subsubsection 시간대 상수


@geindex altzone (time 모듈)
@anchor{library/time time altzone}@anchor{3171}
@deffn {데이터} time.altzone

정의된 것이 있다면, 현지 DST 시간대의 UTC 서쪽으로 초 단위 오프셋. 현지 DST 시간대가 UTC 동쪽이면 음수입니다 (영국을 포함한 서유럽의 경우). @code{daylight}가 0이 아닌 경우에만 사용하십시오. 아래 참고 사항을 참조하십시오.
@end deffn

@geindex daylight (time 모듈)
@anchor{library/time time daylight}@anchor{3172}
@deffn {데이터} time.daylight

DST 시간대가 정의되면 0이 아닙니다. 아래 참고 사항을 참조하십시오.
@end deffn

@geindex timezone (time 모듈)
@anchor{library/time time timezone}@anchor{3173}
@deffn {데이터} time.timezone

UTC 서쪽으로 초 단위의, 현지 (DST가 아닌) 시간대의 오프셋 (대부분 서부 유럽 지역에서는 음수, 미국에서는 양수, 영국에서는 0). 아래 참고 사항을 참조하십시오.
@end deffn

@geindex tzname (time 모듈)
@anchor{library/time time tzname}@anchor{3174}
@deffn {데이터} time.tzname

두 문자열의 튜플: 첫 번째는 현지 DST가 아닌 시간대의 이름이고, 두 번째는 현지 DST 시간대의 이름입니다. DST 시간대가 정의되어 있지 않으면, 두 번째 문자열을 사용하지 않아야 합니다. 아래 참고 사항을 참조하십시오.
@end deffn

@cartouche
@quotation 참고 
위의 시간대 상수 (@ref{3171,,altzone}, @ref{3172,,daylight}, @ref{3173,,timezone} 및 @ref{3174,,tzname})의 경우, 값은 모듈 로드 시간이나 @ref{3167,,tzset()}이 마지막으로 호출된 시간에 적용되는 시간대 규칙에 의해 결정되며 과거의 시간에는 올바르지 않을 수 있습니다. 시간대 정보를 얻으려면 @ref{16fe,,localtime()} 결과의 @ref{315a,,tm_gmtoff}와 @ref{315b,,tm_zone}을 사용하는 것이 좋습니다.
@end quotation
@end cartouche


@subsubheading 더 보기



@table @asis

@item 모듈 @ref{34,,datetime}

날짜와 시간에 대한 더 객체 지향적인 인터페이스.

@item 모듈 @ref{8a,,locale}

국제화 서비스. 로케일 설정은 @ref{13ee,,strftime()}과 @ref{1632,,strptime()}의 많은 포맷 지시자의 해석에 영향을 줍니다.

@item 모듈 @ref{15,,calendar}

일반적인 캘린더 관련 함수. @ref{296b,,timegm()}은 이 모듈에 있는 @ref{13c5,,gmtime()}의 역함수입니다.
@end table


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node logging — 파이썬 로깅 시설,logging config — 로깅 구성,time — 시간 액세스와 변환,일반 운영 체제 서비스
@anchor{library/logging doc}@anchor{3175}@anchor{library/logging logging-logging-facility-for-python}@anchor{3176}@anchor{library/logging module-logging}@anchor{8b}@anchor{library/logging translation-repo}@anchor{3177}
@subsection @code{logging} — 파이썬 로깅 시설


@geindex module; logging

`소스 코드:' Lib/logging/__init__.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/logging/__init__.py}

@geindex 에러;logging

@subsubheading Important



이 페이지는 API 레퍼런스 정보를 담고 있습니다. 자습서 정보 및 고급 주제에 대한 설명은 다음을 참조하십시오.


@itemize *

@item 
@ref{13fa,,기초 자습서}

@item 
@ref{13fb,,고급 자습서}

@item 
@ref{13fc,,로깅 요리책}
@end itemize


__________________________________________________________________


이 모듈은 응용 프로그램과 라이브러리를 위한 유연한 이벤트 로깅 시스템을 구현하는 함수와 클래스를 정의합니다.

표준 라이브러리 모듈로 로깅 API를 제공하는 것의 주요 이점은, 모든 파이썬 모듈이 로깅에 참여할 수 있어서, 응용 프로그램 로그에 여러분 자신의 메시지를 제삼자 모듈의 메시지와 통합할 수 있다는 것입니다.

Here’s a simple example of idiomatic usage:

@example
# myapp.py
import logging
import mylib
logger = logging.getLogger(__name__)

def main():
    logging.basicConfig(filename='myapp.log', level=logging.INFO)
    logger.info('Started')
    mylib.do_something()
    logger.info('Finished')

if __name__ == '__main__':
    main()
@end example

@example
# mylib.py
import logging
logger = logging.getLogger(__name__)

def do_something():
    logger.info('Doing something')
@end example

If you run `myapp.py', you should see this in `myapp.log':

@example
INFO:__main__:Started
INFO:mylib:Doing something
INFO:__main__:Finished
@end example

The key feature of this idiomatic usage is that the majority of code is simply
creating a module level logger with @code{getLogger(__name__)}, and using that
logger to do any needed logging. This is concise, while allowing downstream
code fine-grained control if needed. Logged messages to the module-level logger
get forwarded to handlers of loggers in higher-level modules, all the way up to
the highest-level logger known as the root logger; this approach is known as
hierarchical logging.

For logging to be useful, it needs to be configured: setting the levels and
destinations for each logger, potentially changing how specific modules log,
often based on command-line arguments or application configuration. In most
cases, like the one above, only the root logger needs to be so configured, since
all the lower level loggers at module level eventually forward their messages to
its handlers.  @ref{bf2,,basicConfig()} provides a quick way to configure
the root logger that handles many use cases.

이 모듈은 많은 기능과 유연성을 제공합니다. 로깅에 익숙하지 않다면, 감을 잡는 가장 좋은 방법은 자습서를 보는 것입니다 (`위와 오른쪽에 있는 링크를 참조하세요').

모듈에 의해 정의된 기본 클래스는, 그들의 어트리뷰트와 메서드와 함께, 아래 절에서 나열됩니다.


@itemize *

@item 
로거는 응용 프로그램 코드가 직접 사용하는 인터페이스를 노출합니다.

@item 
처리기는 (로거가 만든) 로그 레코드를 적절한 목적지로 보냅니다.

@item 
필터는 출력할 로그 레코드를 결정하기 위한 더 세분된 기능을 제공합니다.

@item 
포매터는 최종 출력에서 로그 레코드의 배치를 지정합니다.
@end itemize

@menu
* Logger 객체:: 
* 로깅 수준:: 
* Handler 객체:: 
* Formatter 객체:: 
* Filter 객체:: 
* LogRecord 객체:: 
* LogRecord 어트리뷰트:: 
* LoggerAdapter 객체:: 
* 스레드 안전성:: 
* 모듈 수준 함수:: 
* 모듈 수준 어트리뷰트:: 
* warnings 모듈과의 통합:: 

@end menu

@node Logger 객체,로깅 수준,,logging — 파이썬 로깅 시설
@anchor{library/logging logger}@anchor{3178}@anchor{library/logging logger-objects}@anchor{3179}
@subsubsection Logger 객체


로거에는 다음과 같은 어트리뷰트와 메서드가 있습니다. 로거는 `결코' 직접 인스턴스를 만드는 일 없이, 항상 모듈 수준의 함수 @code{logging.getLogger(name)} 를 거치는 것에 주의하십시오. 같은 이름(name)으로 @ref{b59,,getLogger()} 를 여러 번 호출해도 항상 같은 로거 객체에 대한 참조를 돌려줍니다.

@code{name} 은 잠재적으로 @code{foo.bar.baz} 와 같이 마침표로 구분된 계층적 값입니다 (하지만 그냥 간단한 @code{foo} 도 가능합니다). 계층적 목록에서 더 아래쪽에 있는 로거는 목록에서 상위에 있는 로거의 자식입니다. 예를 들어, 이름이 @code{foo} 인 로거가 주어지면, @code{foo.bar}, @code{foo.bar.baz}, 그리고 @code{foo.bam} 의 이름을 가진 로거는 모두 @code{foo} 의 자손입니다. 또한, 모든 로거는 루트 로거의 자손입니다. 로거 이름 계층 구조는 파이썬 패키지 계층 구조와 비슷하며, @code{logging.getLogger(__name__)} 를 사용하여 모듈 단위로 로거를 구성하는 경우는 패키지 계층 구조와 같아집니다. 왜냐하면, 모듈에서, @code{__name__} 은 파이썬 패키지 이름 공간의 모듈 이름이기 때문입니다.

@geindex Logger (logging 클래스)
@anchor{library/logging logging Logger}@anchor{d45}
@deffn {클래스} logging.Logger

@geindex name (logging.Logger의 속성)
@anchor{library/logging logging Logger name}@anchor{317a}
@deffn {속성} name

This is the logger’s name, and is the value that was passed to @ref{b59,,getLogger()}
to obtain the logger.

@cartouche
@quotation 참고 
This attribute should be treated as read-only.
@end quotation
@end cartouche
@end deffn

@geindex level (logging.Logger의 속성)
@anchor{library/logging logging Logger level}@anchor{317b}
@deffn {속성} level

The threshold of this logger, as set by the @ref{1698,,setLevel()} method.

@cartouche
@quotation 참고 
Do not set this attribute directly - always use @ref{1698,,setLevel()},
which has checks for the level passed to it.
@end quotation
@end cartouche
@end deffn

@geindex parent (logging.Logger의 속성)
@anchor{library/logging logging Logger parent}@anchor{317c}
@deffn {속성} parent

The parent logger of this logger. It may change based on later instantiation
of loggers which are higher up in the namespace hierarchy.

@cartouche
@quotation 참고 
This value should be treated as read-only.
@end quotation
@end cartouche
@end deffn

@geindex propagate (logging.Logger의 속성)
@anchor{library/logging logging Logger propagate}@anchor{169a}
@deffn {속성} propagate

이 어트리뷰트가 참으로 평가되면, 이 로거에 로그 된 이벤트는 이 로거에 연결된 처리기뿐 아니라 상위 계층 (조상) 로거의 처리기로 전달됩니다. 메시지는 조상 로거의 처리기에 직접 전달됩니다 - 조상 로거의 수준이나 필터는 고려하지 않습니다.

이 값이 거짓으로 평가되면, 로깅 메시지가 조상 로거의 처리기로 전달되지 않습니다.

Spelling it out with an example: If the propagate attribute of the logger named
@code{A.B.C} evaluates to true, any event logged to @code{A.B.C} via a method call such as
@code{logging.getLogger('A.B.C').error(...)} will [subject to passing that logger’s
level and filter settings] be passed in turn to any handlers attached to loggers
named @code{A.B}, @code{A} and the root logger, after first being passed to any handlers
attached to @code{A.B.C}. If any logger in the chain @code{A.B.C}, @code{A.B}, @code{A} has its
@code{propagate} attribute set to false, then that is the last logger whose handlers
are offered the event to handle, and propagation stops at that point.

생성자는 이 어트리뷰트를 @code{True} 로 설정합니다.

@cartouche
@quotation 참고 
로거 `와' 하나 이상의 조상에 처리기를 중복해서 연결하면, 같은 레코드를 여러 번 출력할 수 있습니다. 일반적으로, 하나 이상의 로거에 처리기를 붙일 필요는 없습니다. 로거 계층에서 가장 높은 적절한 로거에 처리기를 연결하면, propagate 설정이 @code{True} 로 남아있는 모든 자식 로거들이 로그 하는 모든 이벤트를 보게 됩니다. 일반적인 시나리오는 루트 로거에만 처리기를 연결하고, 전파가 나머지를 처리하도록 하는 것입니다.
@end quotation
@end cartouche
@end deffn

@geindex handlers (logging.Logger의 속성)
@anchor{library/logging logging Logger handlers}@anchor{317d}
@deffn {속성} handlers

The list of handlers directly attached to this logger instance.

@cartouche
@quotation 참고 
This attribute should be treated as read-only; it is normally changed via
the @ref{317e,,addHandler()} and @ref{317f,,removeHandler()} methods, which use locks to ensure
thread-safe operation.
@end quotation
@end cartouche
@end deffn

@geindex disabled (logging.Logger의 속성)
@anchor{library/logging logging Logger disabled}@anchor{3180}
@deffn {속성} disabled

This attribute disables handling of any events. It is set to @code{False} in the
initializer, and only changed by logging configuration code.

@cartouche
@quotation 참고 
This attribute should be treated as read-only.
@end quotation
@end cartouche
@end deffn

@geindex setLevel() (logging.Logger 메서드)
@anchor{library/logging logging Logger setLevel}@anchor{1698}
@deffn {메서드} setLevel (level)

이 로거의 수준 경계를 `level' 로 설정합니다. `level' 보다 덜 심각한 로깅 메시지는 무시됩니다; 심각도 `level' 이상의 로깅 메시지는, 처리기 수준이 `level' 보다 높은 심각도 수준으로 설정되지 않는 한, 이 로거에 연결된 처리기가 출력합니다.

로거가 만들어질 때, 수준은 @ref{3181,,NOTSET} (로거가 루트 로거 일 때는 모든 메시지를 처리하게 하고, 로거가 루트 로거가 아니면 모든 메시지를 부모에게 위임하도록 합니다) 으로 설정됩니다. 루트 로거는 수준 @ref{20dd,,WARNING}으로 만들어짐에 유의하세요.

‘부모에게 위임’이라는 말은, 로거 수준이 NOTSET 인 경우, NOTSET 이외의 수준을 갖는 조상이 발견되거나 루트에 도달할 때까지 조상 로거 체인을 탐색함을 의미합니다.

NOTSET 이외의 수준을 갖는 조상이 발견되면, 그 조상의 수준을 조상 검색이 시작된 로거의 유효 수준으로 간주하여, 로깅 이벤트를 처리할지를 결정하는 데 사용됩니다.

루트에 도달하면, 그리고 루트가 NOTSET 수준을 갖고 있으면, 모든 메시지가 처리됩니다. 그렇지 않으면 루트 수준이 유효 수준으로 사용됩니다.

수준의 목록은 @ref{869,,로깅 수준}를 보세요.


버전 3.2에서 변경: `level' 매개 변수는 이제 @ref{20dc,,INFO}와 같은 정수 상수 대신 ‘INFO’와 같은 수준의 문자열 표현을 허용합니다. 그러나 수준은 내부적으로 정수로 저장되며, @ref{3182,,getEffectiveLevel()} 및 @ref{14fb,,isEnabledFor()}와 같은 메서드는 정수를 반환하거나 정수가 전달되기를 기대합니다.

@end deffn

@geindex isEnabledFor() (logging.Logger 메서드)
@anchor{library/logging logging Logger isEnabledFor}@anchor{14fb}
@deffn {메서드} isEnabledFor (level)

심각도 `level' 의 메시지가 이 로거에서 처리될지를 알려줍니다. 이 메서드는 먼저 @code{logging.disable(level)} 에 의해 설정된 모듈 수준의 수준을 확인한 다음, @ref{3182,,getEffectiveLevel()}로 확인되는 로거의 유효 수준을 검사합니다.
@end deffn

@geindex getEffectiveLevel() (logging.Logger 메서드)
@anchor{library/logging logging Logger getEffectiveLevel}@anchor{3182}
@deffn {메서드} getEffectiveLevel ()

이 로거의 유효 수준을 알려줍니다. @ref{1698,,setLevel()} 을 사용하여 @ref{3181,,NOTSET} 이외의 값이 설정되면, 그 값이 반환됩니다. 그렇지 않으면, @code{NOTSET} 이외의 값이 발견될 때까지 루트를 향해 계층 구조를 탐색하고, 그 값이 반환됩니다. 반환되는 값은 정수이며, 일반적으로 @ref{20db,,logging.DEBUG}, @ref{20dc,,logging.INFO} 등 중 하나입니다.
@end deffn

@geindex getChild() (logging.Logger 메서드)
@anchor{library/logging logging Logger getChild}@anchor{14f9}
@deffn {메서드} getChild (suffix)

접미사에 의해 결정되는, 이 로거의 자손 로거를 반환합니다. 그러므로, @code{logging.getLogger('abc').getChild('def.ghi')} 는 @code{logging.getLogger('abc.def.ghi')} 와 같은 로거를 반환합니다. 이것은 편의 메서드인데, 부모 로거가 리터럴 문자열이 아닌 이름(가령 @code{__name__})을 사용하여 명명될 때 유용합니다.


Added in version 3.2.

@end deffn

@geindex getChildren() (logging.Logger 메서드)
@anchor{library/logging logging Logger getChildren}@anchor{1b50}
@deffn {메서드} getChildren ()

Returns a set of loggers which are immediate children of this logger. So for
example @code{logging.getLogger().getChildren()} might return a set containing
loggers named @code{foo} and @code{bar}, but a logger named @code{foo.bar} wouldn’t be
included in the set. Likewise, @code{logging.getLogger('foo').getChildren()} might
return a set including a logger named @code{foo.bar}, but it wouldn’t include one
named @code{foo.bar.baz}.


Added in version 3.12.

@end deffn

@geindex debug() (logging.Logger 메서드)
@anchor{library/logging logging Logger debug}@anchor{102a}
@deffn {메서드} debug (msg, *args, **kwargs)

이 로거에 수준 @ref{20db,,DEBUG} 메시지를 로그 합니다. `msg' 는 메시지 포맷 문자열이고, `args' 는 문자열 포매팅 연산자를 사용하여 `msg' 에 병합되는 인자입니다. (이는 포맷 문자열에 키워드를 사용하고, 인자로 하나의 딕셔너리를 전달할 수 있음을 의미합니다.) `args'가 제공되지 않으면 `msg'에 % 포매팅 연산이 수행되지 않습니다.

`kwargs' 에서 검사되는 네 개의 키워드 인자가 있습니다: `exc_info', `stack_info', `stacklevel' 및 `extra'.

`exc_info' 가 거짓으로 평가되지 않으면, 로깅 메시지에 예외 정보가 추가됩니다. 예외 튜플 (@ref{899,,sys.exc_info()} 에 의해 반환되는 형식) 또는 예외 인스턴스가 제공되면 사용됩니다; 그렇지 않으면 예외 정보를 얻기 위해 @code{sys.exc_info()} 를 호출합니다.

두 번째 선택적 키워드 인자는 `stack_info' 이며, 기본값은 @code{False} 입니다. 참이면, 실제 로깅 호출을 포함하는 스택 정보가 로깅 메시지에 추가됩니다. 이것은 `exc_info' 를 지정할 때 표시되는 것과 같은 스택 정보가 아닙니다: 전자(`stack_info')는 스택의 맨 아래에서 현재 스레드의 로깅 호출까지의 스택 프레임이며, 후자(`exc_info')는 예외가 일어난 후에 예외 처리기를 찾으면서 되감은 스택 프레임에 대한 정보입니다.

`exc_info' 와는 독립적으로 `stack_info' 를 지정할 수 있습니다. 예를 들어 예외가 발생하지 않은 경우에도 코드의 특정 지점에 어떻게 도달했는지 보여줄 수 있습니다. 스택 프레임은 다음과 같은 헤더 행 다음에 인쇄됩니다:

@example
Stack (most recent call last):
@end example

예외 프레임을 표시할 때 사용되는 @code{Traceback (most recent call last):} 을 흉내 내고 있습니다.

세 번째 선택적 키워드 인자는 `stacklevel'이며, 기본값은 @code{1}입니다. 1보다 크면, 로깅 이벤트용으로 만들어진 @ref{11e5,,LogRecord}에 설정된 줄 번호와 함수 이름을 계산할 때 해당 수의 스택 프레임을 건너뜁니다. 기록된 함수 이름, 파일명 및 줄 번호가 도우미 함수/메서드에 대한 정보가 아니라 호출자의 정보가 되도록, 로깅 도우미에서 사용할 수 있습니다. 이 매개 변수의 이름은 @ref{118,,warnings} 모듈에 있는 비슷한 것과 같도록 맞췄습니다.

네 번째 키워드 인자는 `extra' 로, 로깅 이벤트용으로 만들어진 @ref{11e5,,LogRecord}의 @ref{77c,,__dict__} 를 사용자 정의 어트리뷰트로 채우는 데 사용되는 딕셔너리를 전달할 수 있습니다. 이러한 사용자 정의 어트리뷰트는 원하는 대로 사용할 수 있습니다. 예를 들어, 로그 메시지에 포함할 수 있습니다. 예를 들면:

@example
FORMAT = '%(asctime)s %(clientip)-15s %(user)-8s %(message)s'
logging.basicConfig(format=FORMAT)
d = @{'clientip': '192.168.0.1', 'user': 'fbloggs'@}
logger = logging.getLogger('tcpserver')
logger.warning('Protocol problem: %s', 'connection reset', extra=d)
@end example

는 이렇게 인쇄할 것입니다

@example
2006-02-08 22:20:02,165 192.168.0.1 fbloggs  Protocol problem: connection reset
@end example

`extra' 에 전달된 딕셔너리의 키가, 로깅 시스템에서 사용하는 키와 충돌해서는 안 됩니다. (어떤 키가 로깅 시스템에 의해 사용되는지에 대한 더 많은 정보는 @ref{3183,,LogRecord 어트리뷰트}에 있는 절을 보십시오.)

로그 된 메시지에서 이러한 어트리뷰트를 사용하려면 몇 가지 주의를 기울여야 합니다. 위의 예에서, 예를 들어, @ref{169c,,Formatter} 에 설정한 포맷 문자열은 @ref{11e5,,LogRecord}의 어트리뷰트 딕셔너리에 ‘clientip’ 과 ‘user’ 가 있을 것으로 기대하고 있습니다. 이것들이 없는 경우 문자열 포매팅 예외가 발생하기 때문에 메시지가 기록되지 않습니다. 따라서 이 경우, 항상 이 키를 포함하는 `extra' 딕셔너리를 전달해야 합니다.

성가신 일입니다만, 이 기능은 여러 문맥에서 같은 코드가 실행되고 관심 있는 조건들(가령 원격 클라이언트 IP 주소와 인증된 사용자 이름)이 문맥에 따라 발생하는 다중 스레드 서버와 같은 특수한 상황을 위한 것입니다. 이런 상황에서는, 특수한 @ref{169c,,Formatter} 가 특정한 @ref{169b,,Handler}와 함께 사용될 가능성이 큽니다.

If no handler is attached to this logger (or any of its ancestors,
taking into account the relevant @ref{169a,,Logger.propagate} attributes),
the message will be sent to the handler set on @ref{13ff,,lastResort}.


버전 3.2에서 변경: `stack_info' 매개 변수가 추가되었습니다.



버전 3.5에서 변경: `exc_info' 매개 변수는 이제 예외 인스턴스를 받아들입니다.



버전 3.8에서 변경: `stacklevel' 매개 변수가 추가되었습니다.

@end deffn

@geindex info() (logging.Logger 메서드)
@anchor{library/logging logging Logger info}@anchor{3184}
@deffn {메서드} info (msg, *args, **kwargs)

이 로거에 수준 @ref{20dc,,INFO} 메시지를 로그 합니다. 인자는 @ref{3185,,debug()}처럼 해석됩니다.
@end deffn

@geindex warning() (logging.Logger 메서드)
@anchor{library/logging logging Logger warning}@anchor{1a74}
@deffn {메서드} warning (msg, *args, **kwargs)

이 로거에 수준 @ref{20dd,,WARNING} 메시지를 로그 합니다. 인자는 @ref{3185,,debug()}처럼 해석됩니다.

@cartouche
@quotation 참고 
기능적으로 @code{warning} 와 같은, 구식의 @code{warn} 메서드가 있습니다. @code{warn} 은 폐지되었으므로 사용하지 마십시오 - 대신 @code{warning} 을 사용하십시오.
@end quotation
@end cartouche
@end deffn

@geindex error() (logging.Logger 메서드)
@anchor{library/logging logging Logger error}@anchor{3186}
@deffn {메서드} error (msg, *args, **kwargs)

이 로거에 수준 @ref{20de,,ERROR} 메시지를 로그 합니다. 인자는 @ref{3185,,debug()}처럼 해석됩니다.
@end deffn

@geindex critical() (logging.Logger 메서드)
@anchor{library/logging logging Logger critical}@anchor{1029}
@deffn {메서드} critical (msg, *args, **kwargs)

이 로거에 수준 @ref{20df,,CRITICAL} 메시지를 로그 합니다. 인자는 @ref{3185,,debug()}처럼 해석됩니다.
@end deffn

@geindex log() (logging.Logger 메서드)
@anchor{library/logging logging Logger log}@anchor{1027}
@deffn {메서드} log (level, msg, *args, **kwargs)

이 로거에 정수 수준 `level' 로 메시지를 로그 합니다. 다른 인자는 @ref{3185,,debug()}처럼 해석됩니다.
@end deffn

@geindex exception() (logging.Logger 메서드)
@anchor{library/logging logging Logger exception}@anchor{1028}
@deffn {메서드} exception (msg, *args, **kwargs)

이 로거에 수준 @ref{20de,,ERROR} 메시지를 로그 합니다. 인자는 @ref{3185,,debug()}처럼 해석됩니다. 예외 정보가 로깅 메시지에 추가됩니다. 이 메서드는 예외 처리기에서만 호출해야 합니다.
@end deffn

@geindex addFilter() (logging.Logger 메서드)
@anchor{library/logging logging Logger addFilter}@anchor{3187}
@deffn {메서드} addFilter (filter)

지정된 필터 `filter' 를 이 로거에 추가합니다.
@end deffn

@geindex removeFilter() (logging.Logger 메서드)
@anchor{library/logging logging Logger removeFilter}@anchor{3188}
@deffn {메서드} removeFilter (filter)

이 로거에서 지정된 필터 `filter' 를 제거합니다.
@end deffn

@geindex filter() (logging.Logger 메서드)
@anchor{library/logging logging Logger filter}@anchor{3189}
@deffn {메서드} filter (record)

이 로거의 필터를 레코드(record)에 적용하고 레코드가 처리 대상이면 @code{True}를 반환합니다. 필터 중 어느 하나가 거짓 값을 반환할 때까지 필터는 차례로 참조됩니다. 그중 아무것도 거짓 값을 반환하지 않으면 레코드가 처리됩니다 (처리기로 전달됩니다). 어느 하나가 거짓 값을 반환하면, 더 이상의 레코드 처리는 이루어지지 않습니다.
@end deffn

@geindex addHandler() (logging.Logger 메서드)
@anchor{library/logging logging Logger addHandler}@anchor{317e}
@deffn {메서드} addHandler (hdlr)

지정된 처리기 `hdlr' 를 이 로거에 추가합니다.
@end deffn

@geindex removeHandler() (logging.Logger 메서드)
@anchor{library/logging logging Logger removeHandler}@anchor{317f}
@deffn {메서드} removeHandler (hdlr)

이 로거에서 지정된 처리기 `hdlr' 을 제거합니다.
@end deffn

@geindex findCaller() (logging.Logger 메서드)
@anchor{library/logging logging Logger findCaller}@anchor{318a}
@deffn {메서드} findCaller (stack_info=False, stacklevel=1)

호출자의 소스 파일 이름과 행 번호를 찾습니다. 파일 이름, 행 번호, 함수 이름 및 스택 정보를 4-요소 튜플로 반환합니다. 스택 정보는 `stack_info' 가 @code{True} 가 아니면 @code{None} 으로 반환됩니다.

`stacklevel' 매개 변수는 @ref{3185,,debug()}과 기타 API를 호출하는 코드에서 전달됩니다. 1보다 크면, 반환되는 값을 결정하기 전에 초과분만큼 스택 프레임을 건너뜁니다. 일반적으로 도무미/래퍼 코드에서 로깅 API를 호출할 때 유용한데, 이벤트 로그의 정보가 도우미/래퍼 코드가 아니라 호출자 코드를 참조하도록 합니다.
@end deffn

@geindex handle() (logging.Logger 메서드)
@anchor{library/logging logging Logger handle}@anchor{318b}
@deffn {메서드} handle (record)

이 로거와 그 조상(거짓 값의 `propagate' 가 발견될 때까지)과 연관된 모든 처리기에 레코드를 전달하여 레코드를 처리합니다. 이 메서드는 로컬에서 만든 레코드뿐만 아니라 소켓에서 받아서 언피클된 레코드를 처리하는 데 사용됩니다. @ref{3189,,filter()} 를 사용하여 로거 수준 필터링을 적용합니다.
@end deffn

@geindex makeRecord() (logging.Logger 메서드)
@anchor{library/logging logging Logger makeRecord}@anchor{318c}
@deffn {메서드} makeRecord (name, level, fn, lno, msg, args, exc_info, func=None, extra=None, sinfo=None)

이 메서드는 특수한 @ref{11e5,,LogRecord} 인스턴스를 만들기 위해 서브 클래스에서 재정의할 수 있는 팩토리 메서드입니다.
@end deffn

@geindex hasHandlers() (logging.Logger 메서드)
@anchor{library/logging logging Logger hasHandlers}@anchor{318d}
@deffn {메서드} hasHandlers ()

이 로거에 처리기가 구성되어 있는지 확인합니다. 이 로거의 처리기와 로거 계층의 부모를 찾습니다. 처리기가 발견되면 @code{True} 를 반환하고, 그렇지 않으면 @code{False} 를 반환합니다. 이 메서드는 ‘propagate’ 어트리뷰트가 거짓으로 설정된 로거가 발견될 때 계층 구조 검색을 중지합니다 - 그 로거가 처리기가 있는지 검사하는 마지막 로거가 됩니다.


Added in version 3.2.

@end deffn


버전 3.7에서 변경: 이제 로거는 피클 되고 언피클 될 수 있습니다.

@end deffn

@node 로깅 수준,Handler 객체,Logger 객체,logging — 파이썬 로깅 시설
@anchor{library/logging levels}@anchor{869}@anchor{library/logging logging-levels}@anchor{318e}
@subsubsection 로깅 수준


로깅 수준의 숫자 값은 다음 표에 나와 있습니다. 여러분 자신의 수준을 정의하고, 미리 정의된 수준과 상대적인 특정 값을 갖도록 하려는 경우 필요합니다. 같은 숫자 값을 가진 수준을 정의하면 미리 정의된 값을 덮어씁니다; 미리 정의된 이름이 유실됩니다.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

수준

@tab

숫자 값

@tab

What it means / When to use it

@item

@geindex NOTSET (logging 모듈)
@anchor{library/logging logging NOTSET}@anchor{3181}
@deffn {데이터} logging.NOTSET
@end deffn

@tab

0

@tab

When set on a logger, indicates that
ancestor loggers are to be consulted
to determine the effective level.
If that still resolves to
@code{NOTSET}, then all events
are logged. When set on a handler,
all events are handled.

@item

@geindex DEBUG (logging 모듈)
@anchor{library/logging logging DEBUG}@anchor{20db}
@deffn {데이터} logging.DEBUG
@end deffn

@tab

10

@tab

Detailed information, typically only
of interest to a developer trying to
diagnose a problem.

@item

@geindex INFO (logging 모듈)
@anchor{library/logging logging INFO}@anchor{20dc}
@deffn {데이터} logging.INFO
@end deffn

@tab

20

@tab

Confirmation that things are working
as expected.

@item

@geindex WARNING (logging 모듈)
@anchor{library/logging logging WARNING}@anchor{20dd}
@deffn {데이터} logging.WARNING
@end deffn

@tab

30

@tab

An indication that something
unexpected happened, or that a
problem might occur in the near
future (e.g. ‘disk space low’). The
software is still working as
expected.

@item

@geindex ERROR (logging 모듈)
@anchor{library/logging logging ERROR}@anchor{20de}
@deffn {데이터} logging.ERROR
@end deffn

@tab

40

@tab

Due to a more serious problem, the
software has not been able to
perform some function.

@item

@geindex CRITICAL (logging 모듈)
@anchor{library/logging logging CRITICAL}@anchor{20df}
@deffn {데이터} logging.CRITICAL
@end deffn

@tab

50

@tab

A serious error, indicating that the
program itself may be unable to
continue running.

@end multitable


@node Handler 객체,Formatter 객체,로깅 수준,logging — 파이썬 로깅 시설
@anchor{library/logging handler}@anchor{318f}@anchor{library/logging handler-objects}@anchor{3190}
@subsubsection Handler 객체


처리기에는 다음과 같은 어트리뷰트와 메서드가 있습니다. @ref{169b,,Handler} 는 절대로 직접 인스턴스로 만들어지지 않음에 주의하세요; 이 클래스는 더욱 유용한 서브 클래스의 베이스가 됩니다. 그러나, 서브 클래스의 @code{__init__()} 메서드는 @ref{3191,,Handler.__init__()} 을 호출해야 합니다.

@geindex Handler (logging 클래스)
@anchor{library/logging logging Handler}@anchor{169b}
@deffn {클래스} logging.Handler

@geindex __init__() (logging.Handler 메서드)
@anchor{library/logging logging Handler __init__}@anchor{3191}
@deffn {메서드} __init__ (level=NOTSET)

수준을 설정하고, 필터 목록을 빈 리스트로 설정하고, I/O 메커니즘에 대한 액세스를 직렬화하기 위해 (@ref{3192,,createLock()} 을 사용하여) 록을 생성함으로써 @ref{169b,,Handler} 인스턴스를 초기화합니다.
@end deffn

@geindex createLock() (logging.Handler 메서드)
@anchor{library/logging logging Handler createLock}@anchor{3192}
@deffn {메서드} createLock ()

스레드 안전하지 않은 하부 I/O 기능에 대한 액세스를 직렬화하는 데 사용할 수 있는 스레드 록을 초기화합니다.
@end deffn

@geindex acquire() (logging.Handler 메서드)
@anchor{library/logging logging Handler acquire}@anchor{3193}
@deffn {메서드} acquire ()

@ref{3192,,createLock()} 로 생성된 스레드 록을 확보합니다.
@end deffn

@geindex release() (logging.Handler 메서드)
@anchor{library/logging logging Handler release}@anchor{3194}
@deffn {메서드} release ()

@ref{3193,,acquire()}로 확보한 스레드 록을 반납합니다.
@end deffn

@geindex setLevel() (logging.Handler 메서드)
@anchor{library/logging logging Handler setLevel}@anchor{3195}
@deffn {메서드} setLevel (level)

이 처리기의 수준 경계를 `level' 로 설정합니다. `level' 보다 덜 심각한 로깅 메시지는 무시됩니다. 처리기가 만들어질 때, 수준은 @ref{3181,,NOTSET} (모든 메시지가 처리되게 합니다) 으로 설정됩니다.

수준의 목록은 @ref{869,,로깅 수준}를 보세요.


버전 3.2에서 변경: `level' 매개 변수는 이제 @ref{20dc,,INFO}와 같은 정수 상수 대신 ‘INFO’와 같은 수준 문자열 표현을 허용합니다.

@end deffn

@geindex setFormatter() (logging.Handler 메서드)
@anchor{library/logging logging Handler setFormatter}@anchor{3196}
@deffn {메서드} setFormatter (fmt)

Sets the formatter for this handler to `fmt'.
The `fmt' argument must be a @ref{169c,,Formatter} instance or @code{None}.
@end deffn

@geindex addFilter() (logging.Handler 메서드)
@anchor{library/logging logging Handler addFilter}@anchor{3197}
@deffn {메서드} addFilter (filter)

지정된 필터 `filter' 를 이 처리기에 추가합니다.
@end deffn

@geindex removeFilter() (logging.Handler 메서드)
@anchor{library/logging logging Handler removeFilter}@anchor{3198}
@deffn {메서드} removeFilter (filter)

이 처리기에서 지정된 필터 `filter' 를 제거합니다.
@end deffn

@geindex filter() (logging.Handler 메서드)
@anchor{library/logging logging Handler filter}@anchor{3199}
@deffn {메서드} filter (record)

이 처리기의 필터를 레코드에 적용하고 레코드가 처리 대상이면 @code{True}를 반환합니다. 필터 중 어느 하나가 거짓 값을 반환할 때까지 필터는 차례로 확인됩니다. 그중 아무것도 거짓 값을 반환하지 않으면 레코드가 출력됩니다. 어느 하나가 거짓 값을 반환하면 처리기는 레코드를 출력하지 않습니다.
@end deffn

@geindex flush() (logging.Handler 메서드)
@anchor{library/logging logging Handler flush}@anchor{319a}
@deffn {메서드} flush ()

모든 로그 출력이 플러시 되었음을 확실히 합니다. 이 버전은 아무것도 하지 않으며, 서브 클래스에 의해 구현됩니다.
@end deffn

@geindex close() (logging.Handler 메서드)
@anchor{library/logging logging Handler close}@anchor{319b}
@deffn {메서드} close ()

처리기가 사용하는 자원을 정리합니다. 이 버전은 출력하지 않지만, 이름으로 처리기를 검색하는 데 사용되는 내부 맵에서 처리기를 제거합니다.

서브 클래스는 이것이 재정의된 @ref{319b,,close()} 메서드에서 이 메서드를 호출해야 합니다.
@end deffn

@geindex handle() (logging.Handler 메서드)
@anchor{library/logging logging Handler handle}@anchor{319c}
@deffn {메서드} handle (record)

처리기에 추가된 필터에 따라 조건부로, 지정된 로깅 레코드를 출력합니다. 레코드의 실제 출력을 I/O 스레드 록의 확보/해제로 둘러쌉니다.
@end deffn

@geindex handleError() (logging.Handler 메서드)
@anchor{library/logging logging Handler handleError}@anchor{319d}
@deffn {메서드} handleError (record)

이 메서드는 @ref{319e,,emit()} 호출 중에 예외가 발생할 때 처리기에서 호출됩니다. 모듈 수준 어트리뷰트 @ref{13fe,,raiseExceptions} 가 @code{False} 인 경우 예외는 조용히 무시됩니다. 이 동작은 대부분 로깅 시스템에서 원하는 방식입니다 - 대부분 사용자는 로깅 시스템 자체의 에러에 관심이 없고, 응용 프로그램 에러에 더 관심이 있습니다. 그러나 원하는 경우, 사용자 정의 처리기로 바꿀 수 있습니다. 지정된 레코드는 예외가 발생할 때 처리되고 있던 레코드입니다. (@code{raiseExceptions} 의 기본값은 @code{True} 입니다. 개발 중에 더 유용합니다).
@end deffn

@geindex format() (logging.Handler 메서드)
@anchor{library/logging logging Handler format}@anchor{319f}
@deffn {메서드} format (record)

레코드를 포맷합니다 - 포매터가 설정된 경우 사용합니다. 그렇지 않으면 모듈의 기본 포매터를 사용합니다.
@end deffn

@geindex emit() (logging.Handler 메서드)
@anchor{library/logging logging Handler emit}@anchor{319e}
@deffn {메서드} emit (record)

지정된 로깅 레코드를 실제로 로그 하는 데 필요한 작업을 수행합니다. 이 버전은 서브 클래스에 의해 구현될 것으로 보고 @ref{36b,,NotImplementedError}를 발생시킵니다.

@cartouche
@quotation 경고 
This method is called after a handler-level lock is acquired, which
is released after this method returns. When you override this method, note
that you should be careful when calling anything that invokes other parts of
the logging API which might do locking, because that might result in a
deadlock. Specifically:


@itemize *

@item 
Logging configuration APIs acquire the module-level lock, and then
individual handler-level locks as those handlers are configured.

@item 
Many logging APIs lock the module-level lock. If such an API is called
from this method, it could cause a deadlock if a configuration call is
made on another thread, because that thread will try to acquire the
module-level lock `before' the handler-level lock, whereas this thread
tries to acquire the module-level lock `after' the handler-level lock
(because in this method, the handler-level lock has already been acquired).
@end itemize
@end quotation
@end cartouche
@end deffn
@end deffn

표준으로 포함된 처리기 목록은 @ref{8d,,logging.handlers} 를 참조하십시오.

@node Formatter 객체,Filter 객체,Handler 객체,logging — 파이썬 로깅 시설
@anchor{library/logging formatter-objects}@anchor{31a0}@anchor{library/logging id1}@anchor{31a1}
@subsubsection Formatter 객체


@geindex Formatter (logging 클래스)
@anchor{library/logging logging Formatter}@anchor{169c}
@deffn {클래스} logging.Formatter (fmt=None, datefmt=None, style='%', validate=True, *, defaults=None)

Responsible for converting a @ref{11e5,,LogRecord} to an output string
to be interpreted by a human or external system.

@*매개변수: 

@itemize *

@item 
@code{fmt} (@ref{169,,str}) – A format string in the given `style' for
the logged output as a whole.
The possible mapping keys are drawn from the @ref{11e5,,LogRecord} object’s
@ref{3183,,LogRecord 어트리뷰트}.
If not specified, @code{'%(message)s'} is used,
which is just the logged message.

@item 
@code{datefmt} (@ref{169,,str}) – A format string for the date/time portion of the logged output.
If not specified, the default described in @ref{31a2,,formatTime()} is used.

@item 
@code{style} (@ref{169,,str}) – Can be one of @code{'%'}, @code{'@{'} or @code{'$'} and determines
how the format string will be merged with its data: using one of
@ref{8da,,printf 스타일 문자열 포매팅} (@code{%}), @ref{832,,str.format()} (@code{@{})
or @ref{896,,string.Template} (@code{$}). This only applies to
`fmt' (e.g. @code{'%(message)s'} versus @code{'@{message@}'}),
not to the actual log messages passed to the logging methods.
However, there are @ref{31a3,,other ways}
to use @code{@{}- and @code{$}-formatting for log messages.

@item 
@code{validate} (@ref{3c3,,bool}) – @code{True}면 (기본값), `fmt'와 `style'이 잘못되거나 일치하지 않을 때 @ref{2ec,,ValueError}를 발생시킵니다; 예를 들어, @code{logging.Formatter('%(asctime)s - %(message)s', style='@{')}.

@item 
@code{defaults} (@ref{183,,dict}@code{[}@ref{169,,str}@code{, }@code{Any}@code{]}) – A dictionary with default values to use in custom fields.
For example,
@code{logging.Formatter('%(ip)s %(message)s', defaults=@{"ip": None@})}
@end itemize



버전 3.2에서 변경: `style' 매개 변수가 추가되었습니다.



버전 3.8에서 변경: `validate' 매개 변수가 추가되었습니다.



버전 3.10에서 변경: `defaults' 매개 변수가 추가되었습니다.


@geindex format() (logging.Formatter 메서드)
@anchor{library/logging logging Formatter format}@anchor{31a4}
@deffn {메서드} format (record)

레코드의 어트리뷰트 딕셔너리가 문자열 포매팅 연산의 피연산자로 사용됩니다. 결과 문자열을 반환합니다. 딕셔너리를 포맷하기 전에 몇 가지 준비 단계가 수행됩니다. 레코드의 `message' 어트리뷰트를 `msg' % `args' 를 사용하여 계산합니다. 포매팅 문자열에 @code{'(asctime)'} 이 들어 있으면, @ref{31a2,,formatTime()} 이 호출되어 이벤트 시간을 포매팅합니다. 예외 정보가 있는 경우, @ref{31a5,,formatException()} 을 사용하여 포매팅 되고 메시지에 덧붙입니다. 포맷된 예외 정보는 `exc_text' 어트리뷰트에 캐시 됩니다. 예외 정보를 피클 해서 네트워크를 통해 전송할 수 있으므로 유용합니다만, 예외 정보의 포매팅을 사용자 정의하는 @ref{169c,,Formatter} 서브 클래스가 두 개 이상 있는 경우 주의해야 합니다. 이 경우, 한 포매터가 포매팅을 완료한 후 (`exc_text' 어트리뷰트를 @code{None}으로 설정하여) 캐시 된 값을 지워서 그 이벤트를 처리하는 다음 포매터가 캐시 된 값을 사용하지 않고, 새로 계산할 수 있도록 해야 합니다.

스택 정보가 있는 경우, 예외 정보 뒤에 덧붙입니다. 필요할 경우 @ref{31a6,,formatStack()} 을 사용하여 변환합니다.
@end deffn

@geindex formatTime() (logging.Formatter 메서드)
@anchor{library/logging logging Formatter formatTime}@anchor{31a2}
@deffn {메서드} formatTime (record, datefmt=None)

이 메서드는 포맷된 시간을 사용하려는 포매터에 의해 @ref{199,,format()}에서 호출되어야 합니다. 이 메서드는 특정 요구 사항을 제공하기 위해 포매터에서 재정의될 수 있지만, 기본 동작은 다음과 같습니다: `datefmt'(문자열)이 지정된 경우, @ref{13ee,,time.strftime()} 를 사용하여 레코드 생성 시간을 포매팅합니다. 그렇지 않으면 ‘%Y-%m-%d %H:%M:%S,uuu’ 포맷이 사용됩니다. 여기서 uuu 부분은 밀리 초 값이고, 다른 문자들은 @code{time.strftime()} 설명서를 따릅니다. 이 포맷의 표현된 시간의 예는 @code{2003-01-23 00:29:50,411} 입니다. 결과 문자열이 반환됩니다.

이 함수는 사용자가 구성할 수 있는 함수를 사용하여 생성 시간을 튜플로 변환합니다. 기본적으로 @ref{16fe,,time.localtime()} 이 사용됩니다; 특정 포매터 인스턴스에서 이를 변경하려면, @code{converter} 어트리뷰트를 @code{time.localtime()} 또는 @ref{13c5,,time.gmtime()} 과 같은 서명을 가진 함수로 설정하십시오. 모든 포매터를 변경하려면, 예를 들어 모든 로깅 시간을 GMT로 표시하려면, @code{Formatter} 클래스의 @code{converter} 어트리뷰트를 설정하십시오.


버전 3.3에서 변경: 예전에는, 기본 포맷이 다음과 같이 하드 코딩되었습니다: @code{2010-09-06 22:38:15,292}. 쉼표 앞에 있는 부분은 strptime 포맷 문자열(@code{'%Y-%m-%d %H:%M:%S'})이며, 쉼표 뒤의 부분은 밀리 초 값입니다. strptime에 밀리 초 포맷 표시자가 없으므로, 밀리 초 값은 다른 포맷 문자열 @code{'%s,%03d'} 을 사용하여 추가됩니다 — 이 두 포맷 문자열 모두 이 메서드에 하드 코드 되었습니다. 이 변경으로, 이 문자열들은 클래스 수준 어트리뷰트로 정의되었고, 원하는 경우 인스턴스 수준에서 재정의할 수 있습니다. 어트리뷰트 이름은 @code{default_time_format}(strptime 포맷 문자열)과 @code{default_msec_format}(밀리 초 값 추가용)입니다.



버전 3.9에서 변경: @code{default_msec_format}은 @code{None}일 수 있습니다.

@end deffn

@geindex formatException() (logging.Formatter 메서드)
@anchor{library/logging logging Formatter formatException}@anchor{31a5}
@deffn {메서드} formatException (exc_info)

지정된 예외 정보(@ref{899,,sys.exc_info()} 에 의해 반환되는 표준 예외 튜플)를 문자열로 포맷합니다. 이 기본 구현은 @ref{a4f,,traceback.print_exception()}을 사용합니다. 결과 문자열이 반환됩니다.
@end deffn

@geindex formatStack() (logging.Formatter 메서드)
@anchor{library/logging logging Formatter formatStack}@anchor{31a6}
@deffn {메서드} formatStack (stack_info)

지정된 스택 정보(@ref{1085,,traceback.print_stack()} 에 의해 반환된 문자열이지만 마지막 줄 바꿈이 제거됩니다)을 문자열로 포맷합니다. 이 기본 구현은 입력 값을 그대로 반환합니다.
@end deffn
@end deffn

@geindex BufferingFormatter (logging 클래스)
@anchor{library/logging logging BufferingFormatter}@anchor{31a7}
@deffn {클래스} logging.BufferingFormatter (linefmt=None)

A base formatter class suitable for subclassing when you want to format a
number of records. You can pass a @ref{169c,,Formatter} instance which you want
to use to format each line (that corresponds to a single record). If not
specified, the default formatter (which just outputs the event message) is
used as the line formatter.

@geindex formatHeader() (logging.BufferingFormatter 메서드)
@anchor{library/logging logging BufferingFormatter formatHeader}@anchor{31a8}
@deffn {메서드} formatHeader (records)

Return a header for a list of `records'. The base implementation just
returns the empty string. You will need to override this method if you
want specific behaviour, e.g. to show the count of records, a title or a
separator line.
@end deffn

@geindex formatFooter() (logging.BufferingFormatter 메서드)
@anchor{library/logging logging BufferingFormatter formatFooter}@anchor{31a9}
@deffn {메서드} formatFooter (records)

Return a footer for a list of `records'. The base implementation just
returns the empty string. You will need to override this method if you
want specific behaviour, e.g. to show the count of records or a separator
line.
@end deffn

@geindex format() (logging.BufferingFormatter 메서드)
@anchor{library/logging logging BufferingFormatter format}@anchor{31aa}
@deffn {메서드} format (records)

Return formatted text for a list of `records'. The base implementation
just returns the empty string if there are no records; otherwise, it
returns the concatenation of the header, each record formatted with the
line formatter, and the footer.
@end deffn
@end deffn

@node Filter 객체,LogRecord 객체,Formatter 객체,logging — 파이썬 로깅 시설
@anchor{library/logging filter}@anchor{31ab}@anchor{library/logging filter-objects}@anchor{31ac}
@subsubsection Filter 객체


@code{Filter} 는 수준을 통해 제공되는 것보다 더 정교한 필터링을 위해 @code{Handler} 와 @code{Logger} 에 의해 사용될 수 있습니다. 베이스 필터 클래스는 로거 계층 구조의 특정 지점 아래에 있는 이벤트만 허용합니다. 예를 들어 ‘A.B’로 초기화된 필터는, 로거 ‘A.B’, ‘A.B.C’, ‘A.B.C.D’, ‘A.B.D’ 등이 로그 한 이벤트를 허용하지만, ‘A.BB’, ‘B.A.B’ 등은 허용하지 않습니다. 빈 문자열을 사용하면 모든 이벤트를 통과시킵니다.

@geindex Filter (logging 클래스)
@anchor{library/logging logging Filter}@anchor{1400}
@deffn {클래스} logging.Filter (name='@w{'})

@ref{1400,,Filter} 클래스의 인스턴스를 반환합니다. `name' 을 제공하면, 필터를 통과하도록 허용할 로거(그 자식들도 포함합니다)의 이름을 지정합니다. `name' 이 빈 문자열이면, 모든 이벤트를 허용합니다.

@geindex filter() (logging.Filter 메서드)
@anchor{library/logging logging Filter filter}@anchor{31ad}
@deffn {메서드} filter (record)

Is the specified record to be logged? Returns false for no, true for
yes. Filters can either modify log records in-place or return a completely
different record instance which will replace the original
log record in any future processing of the event.
@end deffn
@end deffn

처리기에 연결된 필터는 이벤트를 처리기가 출력하기 전에 호출되는 반면, 로거에 연결된 필터는 이벤트가 로깅될 때마다 (@ref{3185,,debug()}, @ref{31ae,,info()} 등) 처리기로 이벤트를 보내기 전에 호출됩니다. 이는 자손 로거가 만든 이벤트들은, 같은 필터가 자손들에게도 적용되지 않는 한, 로거의 필터 설정으로 필터링 되지 않는다는 것을 뜻합니다.

실제로 @code{Filter} 의 서브 클래스를 만들 필요는 없습니다: 같은 의미가 있는 @code{filter} 메서드를 가진 인스턴스는 무엇이건 전달할 수 있습니다.


버전 3.2에서 변경: 특수한 @code{Filter} 클래스를 만들거나 @code{filter} 메서드를 가진 다른 클래스를 사용할 필요가 없습니다: 함수(또는 다른 콜러블)를 필터로 사용할 수 있습니다. 필터링 로직은 필터 객체가 @code{filter} 어트리뷰트를 가졌는지 확인합니다: 만약 있다면 @code{Filter} 라고 가정하고 @ref{31ad,,filter()} 메서드를 호출합니다. 그렇지 않으면 콜러블이라고 가정하고 레코드를 단일 매개 변수로 호출합니다. 반환된 값은 @code{filter()} 가 반환하는 값과 같은 의미를 지녀야 합니다.



버전 3.12에서 변경: You can now return a @ref{11e5,,LogRecord} instance from filters to replace
the log record rather than modifying it in place. This allows filters attached to
a @ref{169b,,Handler} to modify the log record before it is emitted, without
having side effects on other handlers.


필터는 수준보다 정교한 기준에 따라 레코드를 필터링하는 데 주로 사용되지만, 필터가 연결되는 처리기나 로거에서 처리되는 모든 레코드를 볼 수 있습니다: 이 특성은, 특정 로거나 처리기가 얼마나 많은 레코드를 처리하는지 센다거나, 처리 중인 @ref{11e5,,LogRecord}에 어트리뷰트를 추가, 변경, 삭제하려고 할 때 유용합니다. 당연히, LogRecord를 변경하는 것은 주의를 필요로 하는 일이지만, 로그에 문맥 정보를 주입하는 것을 허용합니다 (@ref{31af,,문맥 정보 전달에 필터 사용하기}를 보세요).

@node LogRecord 객체,LogRecord 어트리뷰트,Filter 객체,logging — 파이썬 로깅 시설
@anchor{library/logging log-record}@anchor{31b0}@anchor{library/logging logrecord-objects}@anchor{31b1}
@subsubsection LogRecord 객체


@ref{11e5,,LogRecord} 인스턴스는 뭔가 로깅 될 때마다 @ref{d45,,Logger} 에 의해 자동으로 생성되며, @ref{31b2,,makeLogRecord()}를 통해 수동으로 생성될 수 있습니다 (예를 들어, 네트워크에서 수신된 피클 된 이벤트의 경우).

@geindex LogRecord (logging 클래스)
@anchor{library/logging logging LogRecord}@anchor{11e5}
@deffn {클래스} logging.LogRecord (name, level, pathname, lineno, msg, args, exc_info, func=None, sinfo=None)

로그 되는 이벤트와 관련된 모든 정보를 담고 있습니다.

주요 정보는 `msg'와 `args' 로 전달되며, @code{msg % args} 를 사용하여 병합되어 레코드의 @code{message} 어트리뷰트를 만듭니다.

@*매개변수: 

@itemize *

@item 
@code{name} (@ref{169,,str}) – 이 @code{LogRecord}가 나타내는 이벤트를 로그 하는데 사용된 로거의 이름. @code{LogRecord}의 로거 이름은 다른 (조상) 로거에 연결된 처리기가 출력하더라도 항상 이 값을 갖게됨에 유의하십시오.

@item 
@code{level} (@ref{19b,,int}) – 로깅 이벤트의 @ref{869,,숫자 수준} (가령 @code{10}은 @code{DEBUG}, @code{20}은 @code{INFO} 등). 이 값은 LogRecord의 `두' 어트리뷰트로 변환됩니다: 숫자 값을 위한 @code{levelno} 와 해당 수준 이름을 위한 @code{levelname}.

@item 
@code{pathname} (@ref{169,,str}) – 로깅 호출이 발생한 소스 파일의 전체 문자열 경로.

@item 
@code{lineno} (@ref{19b,,int}) – 로깅 호출이 발생한 소스 파일의 행 번호.

@item 
@code{msg} (@ref{8ba,,Any}) – 이벤트 설명 메시지. 변수 데이터를 위한 자리 표시자가 있는 %-포맷 문자열이거나, 임의의 객체일 수 있습니다 (@ref{31b3,,임의의 객체를 메시지로 사용하기}를 참조하세요).

@item 
@code{args} (@ref{610,,tuple}@code{ | }@ref{183,,dict}@code{[}@ref{169,,str}@code{, }@ref{8ba,,Any}@code{]}) – 이벤트 설명을 얻기 위해 `msg' 인자에 병합할 변수 데이터.

@item 
@code{exc_info} (@ref{610,,tuple}@code{[}@ref{f43,,type}@code{[}@ref{7d6,,BaseException}@code{]}@code{, }@code{BaseException}@code{, }@ref{ce9,,types.TracebackType}@code{] }@code{| }@code{None}) – 현재의 예외 정보를 가지는 예외 튜플로, @ref{899,,sys.exc_info()}가 반환하는 값. 예외 정보가 없는 경우는 @code{None}.

@item 
@code{func} (@ref{169,,str}@code{ | }@code{None}) – 로깅 호출을 호출한 함수 또는 메서드의 이름.

@item 
@code{sinfo} (@ref{169,,str}@code{ | }@code{None}) – 현재 스레드에서 스택의 바닥부터 로깅 호출까지의 스택 정보를 나타내는 텍스트 문자열.
@end itemize


@geindex getMessage() (logging.LogRecord 메서드)
@anchor{library/logging logging LogRecord getMessage}@anchor{31b4}
@deffn {메서드} getMessage ()

사용자가 제공 한 인자를 메시지와 병합한 후, 이 @ref{11e5,,LogRecord} 인스턴스에 대한 메시지를 반환합니다. 로깅 호출에 제공된 사용자 제공 메시지 인자가 문자열이 아닌 경우, @ref{169,,str()} 이 호출되어 문자열로 변환됩니다. 이렇게 해서 사용자 정의 클래스를 메시지로 사용할 수 있도록 하는데, 그 클래스의 @code{__str__} 메서드는 사용할 실제 포맷 문자열을 반환 할 수 있습니다.
@end deffn


버전 3.2에서 변경: 레코드를 생성하는 데 사용되는 팩토리를 제공함으로써, @ref{11e5,,LogRecord}의 생성을 더 구성할 수 있게 만들었습니다. 팩토리는 @ref{31b5,,getLogRecordFactory()}와 @ref{31b6,,setLogRecordFactory()} (팩토리의 서명은 이곳을 참조하십시오) 를 사용하여 설정할 수 있습니다.


이 기능은 @ref{11e5,,LogRecord} 생성 시에 여러분 자신의 값을 주입하는데 사용할 수 있습니다. 다음과 같은 패턴을 사용할 수 있습니다:

@example
old_factory = logging.getLogRecordFactory()

def record_factory(*args, **kwargs):
    record = old_factory(*args, **kwargs)
    record.custom_attribute = 0xdecafbad
    return record

logging.setLogRecordFactory(record_factory)
@end example

이 패턴을 사용하면 여러 팩토리를 체인으로 묶을 수 있으며, 서로의 어트리뷰트를 덮어쓰거나 위에 나열된 표준 어트리뷰트를 실수로 덮어쓰지 않는 한 놀랄만한 일이 일어나지는 않아야 합니다.
@end deffn

@node LogRecord 어트리뷰트,LoggerAdapter 객체,LogRecord 객체,logging — 파이썬 로깅 시설
@anchor{library/logging id2}@anchor{31b7}@anchor{library/logging logrecord-attributes}@anchor{3183}
@subsubsection LogRecord 어트리뷰트


LogRecord에는 많은 어트리뷰트가 있으며, 대부분 어트리뷰트는 생성자의 매개 변수에서 옵니다. (LogRecord 생성자 매개 변수와 LogRecord 어트리뷰트의 이름이 항상 정확하게 일치하는 것은 아닙니다.) 이러한 어트리뷰트를 사용하여 레코드의 데이터를 포맷 문자열로 병합 할 수 있습니다. 다음 표는 어트리뷰트 이름, 의미와 해당 자리 표시자를 %-스타일 포맷 문자열로 (알파벳 순서로) 나열합니다.

@{@}-포매팅(@ref{832,,str.format()})을 사용한다면, @code{@{attrname@}} 을 포맷 문자열의 자리 표시자로 사용할 수 있습니다. $-포매팅(@ref{896,,string.Template})을 사용하고 있다면, @code{$@{attrname@}} 형식을 사용하십시오. 두 경우 모두, 물론, @code{attrname} 을 사용하려는 실제 어트리뷰트 이름으로 대체하십시오.

@{@}-포매팅의 경우, 어트리뷰트 이름 다음에 콜론(:)으로 구분하여 포매팅 플래그를 지정할 수 있습니다. 예를 들어, @code{@{msecs:03.0f@}} 자리 표시자는 밀리 초 값 @code{4} 를 @code{004} 로 포맷합니다. 사용할 수 있는 옵션에 대한 자세한 내용은 @ref{832,,str.format()} 설명서를 참조하십시오.


@multitable {xxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

어트리뷰트 이름

@tab

포맷

@tab

설명

@item

args

@tab

직접 포맷할 필요는 없습니다.

@tab

@code{message} 를 생성하기 위해 @code{msg} 에 병합되는 인자의 튜플. 또는 (인자가 하나뿐이고 딕셔너리일 때) 병합을 위해 값이 사용되는 딕셔너리.

@item

asctime

@tab

@code{%(asctime)s}

@tab

사람이 읽을 수 있는, @ref{11e5,,LogRecord} 가 생성된 시간. 기본적으로 ‘2003-07-08 16:49:45,896’ 형식입니다 (쉼표 뒤의 숫자는 밀리 초 부분입니다).

@item

created

@tab

@code{%(created)f}

@tab

@ref{11e5,,LogRecord} 가 생성된 시간 (@ref{cdf,,time.time_ns()} / 1e9 이 반환하는 값).

@item

exc_info

@tab

직접 포맷할 필요는 없습니다.

@tab

예외 튜플 (@code{sys.exc_info} 에서 제공) 또는, 예외가 발생하지 않았다면, @code{None}.

@item

exc_text

@tab

직접 포맷할 필요는 없습니다.

@tab

Exception information formatted as a string.
This is set when @ref{31a4,,Formatter.format()} is
invoked, or @code{None} if no exception has
occurred.

@item

filename

@tab

@code{%(filename)s}

@tab

@code{pathname} 의 파일명 부분.

@item

funcName

@tab

@code{%(funcName)s}

@tab

로깅 호출을 포함하는 함수의 이름.

@item

levelname

@tab

@code{%(levelname)s}

@tab

메시지의 텍스트 로깅 수준 (@code{'DEBUG'}, @code{'INFO'}, @code{'WARNING'}, @code{'ERROR'}, @code{'CRITICAL'}).

@item

levelno

@tab

@code{%(levelno)s}

@tab

메시지의 숫자 로깅 수준 (@ref{20db,,DEBUG}, @ref{20dc,,INFO}, @ref{20dd,,WARNING}, @ref{20de,,ERROR}, @ref{20df,,CRITICAL}).

@item

lineno

@tab

@code{%(lineno)d}

@tab

로깅 호출이 일어난 소스 행 번호 (사용 가능한 경우).

@item

message

@tab

@code{%(message)s}

@tab

로그 된 메시지. @code{msg % args} 로 계산됩니다. @ref{31a4,,Formatter.format()} 이 호출 될 때 설정됩니다.

@item

module

@tab

@code{%(module)s}

@tab

모듈 (@code{filename} 의 이름 부분).

@item

msecs

@tab

@code{%(msecs)d}

@tab

@ref{11e5,,LogRecord} 가 생성된 시간의 밀리 초 부분.

@item

msg

@tab

직접 포맷할 필요는 없습니다.

@tab

원래 로깅 호출에서 전달된 포맷 문자열. @code{args} 와 병합하여 @code{message} 를 만듭니다. 또는 임의의 객체 (@ref{31b3,,임의의 객체를 메시지로 사용하기} 를 보세요).

@item

name

@tab

@code{%(name)s}

@tab

로깅 호출에 사용된 로거의 이름.

@item

pathname

@tab

@code{%(pathname)s}

@tab

로깅 호출이 일어난 소스 파일의 전체 경로명 (사용 가능한 경우).

@item

process

@tab

@code{%(process)d}

@tab

프로세스 ID (사용 가능한 경우).

@item

processName

@tab

@code{%(processName)s}

@tab

프로세스 이름 (사용 가능한 경우).

@item

relativeCreated

@tab

@code{%(relativeCreated)d}

@tab

logging 모듈이 로드된 시간을 기준으로 LogRecord가 생성된 시간 (밀리 초).

@item

stack_info

@tab

직접 포맷할 필요는 없습니다.

@tab

현재 스레드의 스택 바닥에서 이 레코드를 생성한 로깅 호출의 스택 프레임까지의 스택 프레임 정보 (사용 가능한 경우).

@item

thread

@tab

@code{%(thread)d}

@tab

스레드 ID (사용 가능한 경우).

@item

threadName

@tab

@code{%(threadName)s}

@tab

스레드 이름 (사용 가능한 경우).

@item

taskName

@tab

@code{%(taskName)s}

@tab

@ref{1c7,,asyncio.Task} 이름 (사용 가능한 경우).

@end multitable



버전 3.1에서 변경: `processName' 이 추가되었습니다.



버전 3.12에서 변경: `taskName' 이 추가되었습니다.


@node LoggerAdapter 객체,스레드 안전성,LogRecord 어트리뷰트,logging — 파이썬 로깅 시설
@anchor{library/logging logger-adapter}@anchor{31b8}@anchor{library/logging loggeradapter-objects}@anchor{31b9}
@subsubsection LoggerAdapter 객체


@ref{14fa,,LoggerAdapter} 인스턴스는 문맥 정보를 로깅 호출에 편리하게 전달하는 데 사용됩니다. 사용 예는, @ref{31ba,,로그 출력에 문맥 정보 추가} 섹션을 참조하십시오.

@geindex LoggerAdapter (logging 클래스)
@anchor{library/logging logging LoggerAdapter}@anchor{14fa}
@deffn {클래스} logging.LoggerAdapter (logger, extra=None, merge_extra=False)

Returns an instance of @code{LoggerAdapter} initialized with an
underlying @ref{d45,,Logger} instance, an optional dict-like object (`extra'),
and an optional boolean (`merge_extra') indicating whether or not
the `extra' argument of individual log calls should be merged with
the @code{LoggerAdapter} extra.
The default behavior is to ignore the `extra' argument of individual log
calls and only use the one of the @code{LoggerAdapter} instance

@geindex process() (logging.LoggerAdapter 메서드)
@anchor{library/logging logging LoggerAdapter process}@anchor{31bb}
@deffn {메서드} process (msg, kwargs)

문맥 정보를 삽입하기 위해 로깅 호출에 전달된 메시지 와 키워드 인자를 수정합니다. 이 구현은 생성자에 `extra' 로 전달된 객체를 가져와서 ‘extra’ 키를 사용하여 `kwargs' 에 추가합니다. 반환 값은 전달된 인자의 (수정된) 버전을 담은 (`msg', `kwargs') 튜플입니다.
@end deffn

@geindex manager (logging.LoggerAdapter의 속성)
@anchor{library/logging logging LoggerAdapter manager}@anchor{31bc}
@deffn {속성} manager

Delegates to the underlying @code{manager} on `logger'.
@end deffn

@geindex _log (logging.LoggerAdapter의 속성)
@anchor{library/logging logging LoggerAdapter _log}@anchor{31bd}
@deffn {속성} _log

Delegates to the underlying @code{_log()} method on `logger'.
@end deffn

위의 것에 더해, @ref{14fa,,LoggerAdapter} 는 다음과 같은 @ref{d45,,Logger} 의 메서드를 지원합니다: @ref{102a,,debug()}, @ref{3184,,info()}, @ref{1a74,,warning()}, @ref{3186,,error()}, @ref{1028,,exception()}, @ref{1029,,critical()}, @ref{1027,,log()}, @ref{14fb,,isEnabledFor()}, @ref{3182,,getEffectiveLevel()}, @ref{1698,,setLevel()}, @ref{318d,,hasHandlers()}. 이 메서드들은 @code{Logger} 에 있는 것과 똑같은 서명을 가지므로, 두 형의 인스턴스를 바꿔쓸 수 있습니다.


버전 3.2에서 변경: @ref{14fb,,isEnabledFor()}, @ref{3182,,getEffectiveLevel()}, @ref{1698,,setLevel()} 그리고 @ref{318d,,hasHandlers()} 메서드가 @ref{14fa,,LoggerAdapter} 에 추가되었습니다. 이 메서드는 하부 로거로 위임합니다.



버전 3.6에서 변경: Attribute @code{manager} and method @code{_log()} were added, which
delegate to the underlying logger and allow adapters to be nested.



버전 3.10에서 변경: The `extra' argument is now optional.



버전 3.13에서 변경: The `merge_extra' parameter was added.

@end deffn

@node 스레드 안전성,모듈 수준 함수,LoggerAdapter 객체,logging — 파이썬 로깅 시설
@anchor{library/logging thread-safety}@anchor{31be}
@subsubsection 스레드 안전성


The logging module is intended to be thread-safe without any special work
needing to be done by its clients. It achieves this through using threading
locks; there is one lock to serialize access to the module’s shared data, and
each handler also creates a lock to serialize access to its underlying I/O.

@ref{cb,,signal} 모듈을 사용하여 비동기 시그널 처리기를 구현한다면, 그 처리기 내에서는 logging을 사용할 수 없을 수도 있습니다. 이는 @ref{f3,,threading} 모듈의 록 구현이 언제나 재진입할 수 있지는 않아서 그러한 시그널 처리기에서 호출할 수 없기 때문입니다.

@node 모듈 수준 함수,모듈 수준 어트리뷰트,스레드 안전성,logging — 파이썬 로깅 시설
@anchor{library/logging module-level-functions}@anchor{31bf}
@subsubsection 모듈 수준 함수


위에서 설명한 클래스 외에도 많은 모듈 수준 함수가 있습니다.

@geindex getLogger() (logging 모듈)
@anchor{library/logging logging getLogger}@anchor{b59}
@deffn {함수} logging.getLogger (name=None)

지정된 이름(name)의 로거를 돌려주거나, name이 @code{None} 인 경우, 계층의 루트 로거를 돌려줍니다. 지정된 경우, name은 일반적으로 `‘a’', `‘a.b’' 또는 `‘a.b.c.d’' 와 같이 점으로 구분된 계층적 이름입니다. 이 이름의 선택은 전적으로 logging을 사용하는 개발자에게 달려 있지만, @ref{3178,,Logger 객체}에서 언급한 대로, 특별한 이유가 없는 한 @code{__name__}을 사용하는 것을 권장합니다.

같은 이름으로 이 함수를 여러 번 호출하면 모두 같은 로거 인스턴스를 반환합니다. 이것은 응용 프로그램의 다른 부분 간에 로거 인스턴스를 전달할 필요가 없다는 것을 뜻합니다.
@end deffn

@geindex getLoggerClass() (logging 모듈)
@anchor{library/logging logging getLoggerClass}@anchor{31c0}
@deffn {함수} logging.getLoggerClass ()

표준 @ref{d45,,Logger} 클래스를 반환하거나, @ref{31c1,,setLoggerClass()} 에 전달된 마지막 클래스를 반환합니다. 이 함수는 새 클래스 정의 내에서 호출하여, 사용자 정의 @code{Logger} 클래스를 설치할 때 다른 코드가 이미 적용한 사용자 정의를 취소하지 않도록 할 수 있습니다. 예를 들면:

@example
class MyLogger(logging.getLoggerClass()):
    # ... 여기에서 동작을 재정의 합니다
@end example
@end deffn

@geindex getLogRecordFactory() (logging 모듈)
@anchor{library/logging logging getLogRecordFactory}@anchor{31b5}
@deffn {함수} logging.getLogRecordFactory ()

@ref{11e5,,LogRecord} 를 생성하는 데 사용되는 콜러블을 반환합니다.


Added in version 3.2: 이 함수는 @ref{31b6,,setLogRecordFactory()}와 함께 제공되어, 개발자가 로깅 이벤트를 나타내는 @ref{11e5,,LogRecord} 가 만들어지는 방법을 더욱 잘 제어 할 수 있도록 합니다.


팩토리가 어떻게 호출되는지에 대한 더 자세한 정보는 @ref{31b6,,setLogRecordFactory()}를 보세요.
@end deffn

@geindex debug() (logging 모듈)
@anchor{library/logging logging debug}@anchor{3185}
@deffn {함수} logging.debug (msg, *args, **kwargs)

This is a convenience function that calls @ref{102a,,Logger.debug()}, on the root
logger. The handling of the arguments is in every way identical
to what is described in that method.

The only difference is that if the root logger has no handlers, then
@ref{bf2,,basicConfig()} is called, prior to calling @code{debug} on the root logger.

For very short scripts or quick demonstrations of @code{logging} facilities,
@code{debug} and the other module-level functions may be convenient. However,
most programs will want to carefully and explicitly control the logging
configuration, and should therefore prefer creating a module-level logger and
calling @ref{102a,,Logger.debug()} (or other level-specific methods) on it, as
described at the beginning of this documentation.
@end deffn

@geindex info() (logging 모듈)
@anchor{library/logging logging info}@anchor{31ae}
@deffn {함수} logging.info (msg, *args, **kwargs)

루트 로거에 수준 @ref{20dc,,INFO} 메시지를 로그 합니다. 그 밖의 인자와 동작은 @ref{3185,,debug()}와 같습니다.
@end deffn

@geindex warning() (logging 모듈)
@anchor{library/logging logging warning}@anchor{354}
@deffn {함수} logging.warning (msg, *args, **kwargs)

루트 로거에 수준 @ref{20dd,,WARNING} 메시지를 로그 합니다. 그 밖의 인자와 동작은 @ref{3185,,debug()}와 같습니다.

@cartouche
@quotation 참고 
기능적으로 @code{warning} 와 같은, 구식의 @code{warn} 함수가 있습니다. @code{warn} 은 폐지되었으므로 사용하지 마십시오 - 대신 @code{warning} 을 사용하십시오.
@end quotation
@end cartouche
@end deffn

@geindex error() (logging 모듈)
@anchor{library/logging logging error}@anchor{31c2}
@deffn {함수} logging.error (msg, *args, **kwargs)

루트 로거에 수준 @ref{20de,,ERROR} 메시지를 로그 합니다. 그 밖의 인자와 동작은 @ref{3185,,debug()}와 같습니다.
@end deffn

@geindex critical() (logging 모듈)
@anchor{library/logging logging critical}@anchor{31c3}
@deffn {함수} logging.critical (msg, *args, **kwargs)

루트 로거에 수준 @ref{20df,,CRITICAL} 메시지를 로그 합니다. 그 밖의 인자와 동작은 @ref{3185,,debug()}와 같습니다.
@end deffn

@geindex exception() (logging 모듈)
@anchor{library/logging logging exception}@anchor{1699}
@deffn {함수} logging.exception (msg, *args, **kwargs)

루트 로거에 수준 @ref{20de,,ERROR} 메시지를 로그 합니다. 그 밖의 인자와 동작은 @ref{3185,,debug()}와 같습니다. 예외 정보가 로깅 메시지에 추가됩니다. 이 메서드는 예외 처리기에서만 호출해야 합니다.
@end deffn

@geindex log() (logging 모듈)
@anchor{library/logging logging log}@anchor{31c4}
@deffn {함수} logging.log (level, msg, *args, **kwargs)

루트 로거에 수준 `level' 의 메시지를 로그 합니다. 그 밖의 인자와 동작은 @ref{3185,,debug()}와 같습니다.
@end deffn

@geindex disable() (logging 모듈)
@anchor{library/logging logging disable}@anchor{31c5}
@deffn {함수} logging.disable (level=CRITICAL)

모든 로거의 수준을 `level' 로 오버라이드합니다. 로거 자체 수준보다 우선합니다. 전체 응용 프로그램에서 로깅 출력을 일시적으로 억제해야 할 필요가 생길 때 이 함수가 유용합니다. 그 효과는 심각도 `level' 및 그 밑의 모든 로깅 호출을 무효화시킵니다. 따라서 INFO 값으로 호출하면 모든 INFO 및 DEBUG 이벤트는 삭제되지만, WARNING 이상의 심각도는 로거의 유효 수준에 따라 처리됩니다. @code{logging.disable(logging.NOTSET)} 이 호출되면, 이 오버라이딩 수준을 실질적으로 제거하므로, 로깅 출력은 다시 개별 로거의 유효 수준에 따르게 됩니다.

@code{CRITICAL} 보다 더 높은 사용자 정의 로깅 수준을 정의했다면 (권장하지 않습니다), `level' 매개 변수의 기본값에 의존할 수 없고 적절한 값을 명시적으로 제공해야 합니다.


버전 3.7에서 변경: `level' 매개 변수의 기본값은 수준 @code{CRITICAL} 입니다. 이 변경 사항에 대한 자세한 내용은 bpo-28524@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=28524}를 참조하십시오.

@end deffn

@geindex addLevelName() (logging 모듈)
@anchor{library/logging logging addLevelName}@anchor{31c6}
@deffn {함수} logging.addLevelName (level, levelName)

내부 딕셔너리에 수준 `level' 을 텍스트 `levelName' 과 연결합니다. 이 딕셔너리는 숫자 수준을 텍스트 표현으로 매핑하는데 (예를 들어, @ref{169c,,Formatter} 가 메시지를 포매팅할 때) 사용됩니다. 이 기능을 사용해서 여러분 자신의 수준을 정의할 수도 있습니다. 제약 조건은, 사용되는 모든 수준이 이 함수를 사용하여 등록되어야 하고, 수준은 양의 정수이어야 하며, 심각도가 높아질수록 값이 커져야 한다는 것입니다.

@cartouche
@quotation 참고 
자신만의 수준을 정의할 생각이라면 @ref{31c7,,사용자 정의 수준} 섹션을 보십시오.
@end quotation
@end cartouche
@end deffn

@geindex getLevelNamesMapping() (logging 모듈)
@anchor{library/logging logging getLevelNamesMapping}@anchor{868}
@deffn {함수} logging.getLevelNamesMapping ()

Returns a mapping from level names to their corresponding logging levels. For example, the
string “CRITICAL” maps to @ref{20df,,CRITICAL}. The returned mapping is copied from an internal
mapping on each call to this function.


Added in version 3.11.

@end deffn

@geindex getLevelName() (logging 모듈)
@anchor{library/logging logging getLevelName}@anchor{31c8}
@deffn {함수} logging.getLevelName (level)

로깅 수준 `level' 의 텍스트 표현을 반환합니다.

`level'이 미리 정의된 수준 @ref{20df,,CRITICAL}, @ref{20de,,ERROR}, @ref{20dd,,WARNING}, @ref{20dc,,INFO} 또는 @ref{20db,,DEBUG} 중 하나면 해당 문자열을 얻게 됩니다. @ref{31c6,,addLevelName()}을 사용하여 수준과 이름을 연관 지었다면, `level' 과 연결된 이름이 반환됩니다. 정의된 수준 중 하나에 해당하는 숫자 값이 전달되면, 해당 문자열 표현이 반환됩니다.

`level' 매개 변수는 ‘INFO’ 와 같은 수준의 문자열 표현도 받아들입니다. 이럴 때, 이 함수는 해당 수준의 숫자 값을 반환합니다.

일치하는 숫자나 문자열 값이 전달되지 않으면, 문자열 ‘Level %s’ % level 이 반환됩니다.

@cartouche
@quotation 참고 
수준은 (로깅 로직에서 비교해야 하므로) 내부적으로 정수입니다. 이 함수는 정수 수준과 @code{%(levelname)s} 포맷 지정자(@ref{3183,,LogRecord 어트리뷰트}를 보세요)로 포맷된 로그 출력에 표시된 이름 간의 변환에 사용됩니다.
@end quotation
@end cartouche


버전 3.4에서 변경: 3.4 이전의 파이썬 버전에서, 이 함수로 텍스트 수준을 전달할 수 있고, 해당 수준의 숫자 값을 반환합니다. 이 문서로 만들어지지 않은 동작은 실수로 간주하여, 파이썬 3.4에서 제거되었습니다. 하지만 이전 버전과의 호환성을 유지하기 위해 3.4.2에서 복원되었습니다.

@end deffn

@geindex getHandlerByName() (logging 모듈)
@anchor{library/logging logging getHandlerByName}@anchor{1b60}
@deffn {함수} logging.getHandlerByName (name)

Returns a handler with the specified `name', or @code{None} if there is no handler
with that name.


Added in version 3.12.

@end deffn

@geindex getHandlerNames() (logging 모듈)
@anchor{library/logging logging getHandlerNames}@anchor{1a6e}
@deffn {함수} logging.getHandlerNames ()

Returns an immutable set of all known handler names.


Added in version 3.12.

@end deffn

@geindex makeLogRecord() (logging 모듈)
@anchor{library/logging logging makeLogRecord}@anchor{31b2}
@deffn {함수} logging.makeLogRecord (attrdict)

어트리뷰트가 `attrdict' 로 정의된 새로운 @ref{11e5,,LogRecord} 인스턴스를 만들어서 반환합니다. 이 함수는 피클 된 @code{LogRecord} 어트리뷰트 딕셔너리를 소켓으로 보내고, 수신 단에서 @code{LogRecord} 인스턴스로 재구성할 때 유용합니다.
@end deffn

@geindex basicConfig() (logging 모듈)
@anchor{library/logging logging basicConfig}@anchor{bf2}
@deffn {함수} logging.basicConfig (**kwargs)

기본 @ref{169c,,Formatter}로 @ref{13fd,,StreamHandler} 를 생성하고 루트 로거에 추가하여 로깅 시스템의 기본 구성을 수행합니다. 함수 @ref{3185,,debug()}, @ref{31ae,,info()}, @ref{354,,warning()}, @ref{31c2,,error()} 그리고 @ref{31c3,,critical()}은 루트 로거에 처리기가 정의되어 있지 않으면 자동으로 @ref{bf2,,basicConfig()}를 호출합니다.

이 함수는 루트 로거에 이미 처리기가 구성되어있는 경우, 키워드 인자 `force'가 @code{True}로 설정되지 않는 한, 아무 작업도 수행하지 않습니다.

@cartouche
@quotation 참고 
이 함수는 다른 스레드가 시작되기 전에 메인 스레드에서 호출되어야 합니다. 2.7.1과 3.2 이전의 파이썬 버전에서, 이 함수를 여러 스레드에서 호출하면, (드문 경우지만) 처리기가 두 번 이상 루트 로거에 추가되어, 로그에 메시지가 중복되는 것과 같은 예기치 않은 결과가 발생할 수 있습니다.
@end quotation
@end cartouche

다음 키워드 인자가 지원됩니다.


@multitable {xxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

포맷

@tab

설명

@item

`filename'

@tab

@ref{13fd,,StreamHandler} 대신 지정된 파일명을 사용해 @ref{1c51,,FileHandler}를 만들도록 지정합니다.

@item

`filemode'

@tab

`filename' 이 지정되었으면, 이 @ref{25d9,,모드} 로 파일을 엽니다. 기본값은 @code{'a'} 입니다.

@item

`format'

@tab

처리기에 지정된 포맷 문자열을 사용합니다. 기본값은 콜론으로 구분된 어트리뷰트 @code{levelname}, @code{name} 및 @code{message} 입니다.

@item

`datefmt'

@tab

@ref{13ee,,time.strftime()} 에서 허용하는 방식대로 지정된 날짜/시간 포맷을 사용합니다.

@item

`style'

@tab

`format' 을 지정하면, 포맷 문자열에 이 스타일을 사용합니다. @code{'%'}, @code{'@{'}, @code{'$'} 중 하나인데 각각 @ref{8da,,printf 스타일}, @ref{832,,str.format()}, @ref{896,,string.Template} 에 대응됩니다. 기본값은 @code{'%'} 입니다.

@item

`level'

@tab

루트 로거의 수준을 지정된 @ref{869,,수준} 으로 설정합니다.

@item

`stream'

@tab

@ref{13fd,,StreamHandler}의 초기화에 지정된 스트림을 사용합니다. 이 인자는 `filename' 과 호환되지 않습니다 - 둘 다 있으면 @code{ValueError} 가 발생합니다.

@item

`handlers'

@tab

지정된 경우, 루트 로거에 추가할 이미 만들어진 처리기의 이터러블이어야 합니다. 아직 포매터 세트가 없는 처리기에는 이 함수에서 만들어진 기본 포매터가 지정됩니다. 이 인자는 `filename' 또는 `stream' 과 호환되지 않습니다 - 둘 다 있으면 @code{ValueError} 가 발생합니다.

@item

`force'

@tab

이 키워드 인자가 참으로 지정되면, 루트 로거에 연결된 기존 처리기는 다른 인자에 지정된 대로 구성을 수행하기 전에 모두 제거되고 닫힙니다.

@item

`encoding'

@tab

이 키워드 인자가 `filename'과 함께 지정되면, 그 값이 @ref{1c51,,FileHandler}가 만들어질 때 사용되어, 결국 출력 파일을 열 때 사용됩니다.

@item

`errors'

@tab

이 키워드 인자가 `filename'과 함께 지정되면, 그 값이 @ref{1c51,,FileHandler}가 만들어질 때 사용되어, 결국 출력 파일을 열 때 사용됩니다. 지정하지 않으면, ‘backslashreplace’ 값이 사용됩니다. @code{None}이 지정되면, @ref{316,,open()}에 그대로 전달되는데, 이는 ‘errors’를 전달한 것처럼 처리된다는 것에 유의하십시오.

@end multitable



버전 3.2에서 변경: `style' 인자가 추가되었습니다.



버전 3.3에서 변경: `handlers' 인자가 추가되었습니다. 호환되지 않는 인자(예를 들어, `handlers' 를 `stream' 이나 `filename' 과 함께 쓰거나, `stream' 을 `filename' 과 함께 쓰는 경우)가 있는 상황을 파악하기 위한 검사가 추가되었습니다.



버전 3.8에서 변경: `force' 인자가 추가되었습니다.



버전 3.9에서 변경: `encoding'과 `errors' 인자가 추가되었습니다.

@end deffn

@geindex shutdown() (logging 모듈)
@anchor{library/logging logging shutdown}@anchor{31c9}
@deffn {함수} logging.shutdown ()

로깅 시스템에 모든 처리기를 플러시하고 닫아서 순차적인 종료를 수행하도록 알립니다. 응용 프로그램 종료 시 호출되어야 하고, 이 호출 후에는 로깅 시스템을 더는 사용하지 않아야 합니다.

logging 모듈이 임포트 될 때, 이 함수를 종료 처리기(@ref{d,,atexit}를 참조하십시오)로 등록하므로, 일반적으로 수동으로 수행할 필요가 없습니다.
@end deffn

@geindex setLoggerClass() (logging 모듈)
@anchor{library/logging logging setLoggerClass}@anchor{31c1}
@deffn {함수} logging.setLoggerClass (klass)

로거의 인스턴스를 만들 때 `klass' 클래스를 사용하도록 로깅 시스템에 지시합니다. 클래스는 @code{__init__()} 을 정의해야 하는데, name만 필수 인자로 요구하고, @code{__init__()} 는 @code{Logger.__init__()} 을 호출해야 합니다. 이 함수는 일반적으로 사용자 정의된 로거 동작이 필요한 응용 프로그램에서 로거의 인스턴스가 만들어지기 전에 호출됩니다. 이 호출 후, 다른 때와 마찬가지로, 서브 클래스를 사용하여 직접 로거의 인스턴스를 만들지 마십시오: 계속 @ref{b59,,logging.getLogger()} API를 사용하여 로거를 얻으십시오.
@end deffn

@geindex setLogRecordFactory() (logging 모듈)
@anchor{library/logging logging setLogRecordFactory}@anchor{31b6}
@deffn {함수} logging.setLogRecordFactory (factory)

@ref{11e5,,LogRecord} 를 만드는데 사용되는 콜러블을 설정합니다.

@*매개변수: 
@code{factory} – 로그 레코드의 인스턴스를 만드는데 사용되는 팩토리 콜러블.



Added in version 3.2: 이 함수는 @ref{31b5,,getLogRecordFactory()}와 함께 제공되어, 개발자가 로깅 이벤트를 나타내는 @ref{11e5,,LogRecord} 가 만들어지는 방법을 더욱 잘 제어 할 수 있도록 합니다.


팩토리의 서명은 다음과 같습니다:

@code{factory(name, level, fn, lno, msg, args, exc_info, func=None, sinfo=None, **kwargs)}

@quotation

@*name: 
로거 이름.


@*level: 
로깅 수준 (숫자).


@*fn: 
로깅 호출이 이루어진 파일의 전체 경로명.


@*lno: 
로깅 호출이 이루어진 파일의 행 번호.


@*msg: 
로깅 메시지


@*args: 
로깅 메시지에 대한 인자.


@*exc_info: 
예외 튜플 또는 @code{None}.


@*func: 
로깅 호출을 호출한 함수 또는 메서드의 이름


@*sinfo: 
@ref{1085,,traceback.print_stack()} 가 제공하는 것과 같은 스택 트레이스백. 호출 계층 구조를 보여줍니다.


@*kwargs: 
추가 키워드 인자.

@end quotation
@end deffn

@node 모듈 수준 어트리뷰트,warnings 모듈과의 통합,모듈 수준 함수,logging — 파이썬 로깅 시설
@anchor{library/logging module-level-attributes}@anchor{31ca}
@subsubsection 모듈 수준 어트리뷰트


@geindex lastResort (logging 모듈)
@anchor{library/logging logging lastResort}@anchor{13ff}
@deffn {데이터} logging.lastResort

“최후 수단 처리기” 는 이 어트리뷰트를 통해 제공됩니다. 이것은 @code{WARNING} 수준으로 @code{sys.stderr} 에 쓰는 @ref{13fd,,StreamHandler} 이고, 로깅 구성이 없을 때 로깅 이벤트를 처리하는 데 사용됩니다. 최종 결과는 @code{sys.stderr} 에 메시지를 출력하기만 하는 것입니다. 이것이 예전의 “no handlers could be found for logger XYZ” 라는 에러 메시지를 대체합니다. 어떤 이유로 이전 동작이 필요하면 @code{lastResort} 를 @code{None} 으로 설정할 수 있습니다.


Added in version 3.2.

@end deffn

@geindex raiseExceptions (logging 모듈)
@anchor{library/logging logging raiseExceptions}@anchor{13fe}
@deffn {데이터} logging.raiseExceptions

Used to see if exceptions during handling should be propagated.

기본값: @code{True}.

If @code{raiseExceptions} is @code{False},
exceptions get silently ignored. This is what is mostly wanted
for a logging system - most users will not care about errors in
the logging system, they are more interested in application errors.
@end deffn

@node warnings 모듈과의 통합,,모듈 수준 어트리뷰트,logging — 파이썬 로깅 시설
@anchor{library/logging integration-with-the-warnings-module}@anchor{31cb}
@subsubsection warnings 모듈과의 통합


The @ref{31cc,,captureWarnings()} function can be used to integrate @code{logging}
with the @ref{118,,warnings} module.

@geindex captureWarnings() (logging 모듈)
@anchor{library/logging logging captureWarnings}@anchor{31cc}
@deffn {함수} logging.captureWarnings (capture)

이 함수는 logging 이 경고를 캡처하는 것을 켜고 끄는 데 사용됩니다.

`capture' 가 @code{True} 면, @ref{118,,warnings} 모듈에 의해 발행된 경고는 로깅 시스템으로 리디렉션됩니다. 특히, 경고는 @ref{1df5,,warnings.formatwarning()} 을 사용하여 포맷되고, 결과 문자열을 @code{'py.warnings'} 라는 이름의 로거에 심각도 @ref{20dd,,WARNING}으로 로그 합니다.

`capture' 가 @code{False} 면, 로깅 시스템으로의 경고 리디렉션은 멈추고, 경고는 원래 목적지(즉, @code{captureWarnings(True)} 가 호출되기 전에 적용되던 곳)로 리디렉션됩니다.
@end deffn


@subsubheading 더 보기



@table @asis

@item 모듈 @ref{8c,,logging.config}

logging 모듈용 구성 API.

@item 모듈 @ref{8d,,logging.handlers}

logging 모듈에 포함된 유용한 처리기.

@geindex Python 향상 제안; PEP 282

@item PEP 282@footnote{https://peps.python.org/pep-0282/} - 로깅 시스템

파이썬 표준 라이브러리에 포함하기 위해 이 기능을 설명한 제안.

@item 원본 파이썬 로깅 패키지@footnote{https://old.red-dove.com/python_logging.html}

This is the original source for the @code{logging} package.  The version of the
package available from this site is suitable for use with Python 1.5.2, 2.1.x
and 2.2.x, which do not include the @code{logging} package in the standard
library.
@end table


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node logging config — 로깅 구성,logging handlers — 로깅 처리기,logging — 파이썬 로깅 시설,일반 운영 체제 서비스
@anchor{library/logging config doc}@anchor{31cd}@anchor{library/logging config logging-config-logging-configuration}@anchor{31ce}@anchor{library/logging config module-logging config}@anchor{8c}@anchor{library/logging config translation-repo}@anchor{31cf}
@subsection @code{logging.config} — 로깅 구성


@geindex module; logging.config

`소스 코드:' Lib/logging/config.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/logging/config.py}

@subsubheading Important



이 페이지에는 레퍼런스 정보만 있습니다. 자습서는 다음을 참조하십시오


@itemize *

@item 
@ref{13fa,,기초 자습서}

@item 
@ref{13fb,,고급 자습서}

@item 
@ref{13fc,,로깅 요리책}
@end itemize


__________________________________________________________________


이 절에서는 logging 모듈을 구성하기 위한 API에 관해 설명합니다.

@menu
* 구성 함수:: 
* 보안 고려 사항:: 
* 구성 딕셔너리 스키마:: 
* 구성 파일 형식:: 

@end menu

@node 구성 함수,보안 고려 사항,,logging config — 로깅 구성
@anchor{library/logging config configuration-functions}@anchor{31d0}@anchor{library/logging config logging-config-api}@anchor{14f6}
@subsubsection 구성 함수


The following functions configure the logging module. They are located in the
@code{logging.config} module.  Their use is optional — you can configure the
logging module using these functions or by making calls to the main API (defined
in @ref{8b,,logging} itself) and defining handlers which are declared either in
@code{logging} or @ref{8d,,logging.handlers}.

@geindex dictConfig() (logging.config 모듈)
@anchor{library/logging config logging config dictConfig}@anchor{13b5}
@deffn {함수} logging.config.dictConfig (config)

딕셔너리로 로깅 구성을 받습니다. 이 딕셔너리의 내용은 아래의 @ref{31d1,,구성 딕셔너리 스키마}에 설명되어 있습니다.

구성 중에 에러를 만나면, 이 함수는 적절하게 설명하는 메시지와 함께 @ref{2ec,,ValueError}, @ref{198,,TypeError}, @ref{5ee,,AttributeError} 또는 @ref{659,,ImportError}를 발생시킵니다. 다음은 에러를 발생시킬 수 있는 (불완전한) 조건 목록입니다:


@itemize *

@item 
문자열이 아니거나 실제 로깅 수준과 일치하지 않는 문자열인 @code{level}.

@item 
불리언이 아닌 @code{propagate} 값.

@item 
해당 대상이 없는 id.

@item 
증분(incremental) 호출 중에 발견된 존재하지 않는 처리기 id.

@item 
잘못된 로거 이름.

@item 
결정할 수 없는 내부나 외부 객체.
@end itemize

Parsing is performed by the @code{DictConfigurator} class, whose
constructor is passed the dictionary used for configuration, and
has a @code{configure()} method.  The @code{logging.config} module
has a callable attribute @code{dictConfigClass}
which is initially set to @code{DictConfigurator}.
You can replace the value of @code{dictConfigClass} with a
suitable implementation of your own.

@ref{13b5,,dictConfig()}는 @code{dictConfigClass}를 호출해서 지정된 딕셔너리를 전달한 다음, 반환된 객체의 @code{configure()} 메서드를 호출하여 구성을 적용합니다:

@example
def dictConfig(config):
    dictConfigClass(config).configure()
@end example

예를 들어, @code{DictConfigurator}의 서브 클래스는 자체 @code{__init__()}에서 @code{DictConfigurator.__init__()}를 호출한 다음, 후속 @code{configure()} 호출에서 사용할 수 있는 사용자 정의 접두사를 설정할 수 있습니다. @code{dictConfigClass}는 이 새 서브 클래스에 연결되고, @ref{13b5,,dictConfig()}는 기본, 사용자 정의되지 않은 상태에서와 똑같이 호출될 수 있습니다.


Added in version 3.2.

@end deffn

@geindex fileConfig() (logging.config 모듈)
@anchor{library/logging config logging config fileConfig}@anchor{d47}
@deffn {함수} logging.config.fileConfig (fname, defaults=None, disable_existing_loggers=True, encoding=None)

@ref{26,,configparser}-형식 파일에서 로깅 구성을 읽습니다. 파일 형식은 @ref{31d2,,구성 파일 형식}에 설명된 것과 같아야 합니다. 이 함수는 응용 프로그램에서 여러 번 호출 할 수 있어서, 최종 사용자가 여러 가지 미리 준비된 구성 중에서 선택할 수 있도록 합니다 (개발자가 선택 사항을 표시하고 선택한 구성을 로드하는 메커니즘을 제공한다면).

It will raise @ref{264,,FileNotFoundError} if the file
doesn’t exist and @ref{244,,RuntimeError} if the file is invalid or
empty.

@*매개변수: 

@itemize *

@item 
@code{fname} – 파일명, 또는 파일류 객체, 또는 @ref{1163,,RawConfigParser}에서 파생된 인스턴스. @code{RawConfigParser}-파생 인스턴스가 전달되면, 그대로 사용됩니다. 그렇지 않으면, @ref{4de,,ConfigParser}의 인스턴스가 만들어지고, 이것으로 @code{fname}으로 전달된 객체로부터 구성을 읽습니다. @ref{bf,,readline()} 메서드가 있으면, 파일류 객체라고 가정하고, @ref{729,,read_file()}을 사용하여 읽습니다; 그렇지 않으면, 파일명으로 간주하고 @ref{166d,,read()}로 전달됩니다.

@item 
@code{defaults} – @code{ConfigParser}로 전달되는 기본값을 이 인자로 지정할 수 있습니다.

@item 
@code{disable_existing_loggers} – @code{False}로 지정되면, 이 호출이 이루어졌을 때 존재하는 로거는 활성화된 상태로 남습니다. 기본값은 @code{True}이므로, 과거 호환성을 유지하도록 이전 동작을 활성화합니다. 이 동작은 이미 존재하는 비 루트 로거를 그들이나 그들의 조상이 로깅 구성에서 명시적으로 명명되지 않으면 비활성화하는 것입니다.

@item 
@code{encoding} – The encoding used to open file when `fname' is filename.
@end itemize



버전 3.4에서 변경: @ref{1163,,RawConfigParser}의 서브 클래스의 인스턴스가 이제 @code{fname}에 대한 값으로 허용됩니다. 이것은 다음을 쉽게 합니다:

@quotation


@itemize *

@item 
로깅 구성이 전체 응용 프로그램 구성의 일부인 구성 파일의 사용.

@item 
파일에서 읽어 들인 다음 @code{fileConfig}로 전달되기 전에 사용하는 응용 프로그램이 (예를 들어, 명령 줄 매개 변수나 실행 시간 환경의 다른 측면에 기반하여) 수정하는 구성의 사용.
@end itemize
@end quotation


버전 3.10에서 변경: Added the `encoding' parameter.



버전 3.12에서 변경: An exception will be thrown if the provided file
doesn’t exist or is invalid or empty.


@end deffn

@geindex listen() (logging.config 모듈)
@anchor{library/logging config logging config listen}@anchor{1164}
@deffn {함수} logging.config.listen (port=DEFAULT_LOGGING_CONFIG_PORT, verify=None)

지정된 포트에서 소켓 서버를 시작하고, 새 구성을 수신 대기합니다. 포트를 지정하지 않으면, 모듈의 기본 @code{DEFAULT_LOGGING_CONFIG_PORT}가 사용됩니다. 로깅 구성은 @ref{13b5,,dictConfig()}나 @ref{d47,,fileConfig()}로 처리하기에 적합한 파일로 전송됩니다. 서버를 시작하기 위해 @ref{178,,start()}를 호출할 수 있는 @ref{176,,Thread} 인스턴스를 반환하고, 적절할 때 @ref{13e9,,join()}할 수 있습니다. 서버를 중지하려면, @ref{31d3,,stopListening()}을 호출하십시오.

@code{verify} 인자가 지정되면, 소켓을 통해 수신된 바이트열이 유효하고 처리되어야 하는지를 확인하는 콜러블이어야 합니다. 소켓을 통해 전송되는 것을 암호화 및/또는 서명하고, @code{verify} 콜러블이 서명 확인 및/또는 암호 해독을 수행할 수 있습니다. @code{verify} 콜러블은 단일 인자(소켓을 통해 수신된 바이트열)로 호출되며, 처리할 바이트열이나 바이트열을 버려야 함을 나타내기 위해 @code{None}을 반환합니다. 반환된 바이트열은 전달된 바이트열과 같을 수 있고 (예를 들어, 확인만 수행될 때), 또는 완전히 다를 수 있습니다 (아마도 암호 해독이 수행될 때).

소켓으로 구성을 보내려면, 구성 파일을 읽어서 소켓에 @code{struct.pack('>L', n)}를 사용하여 바이너리로 만든 4바이트의 길이를 앞에 붙인 바이트 시퀀스를 보냅니다.
@anchor{library/logging config logging-eval-security}@anchor{31d4}
@cartouche
@quotation 참고 
구성 일부가 @ref{4a4,,eval()}로 전달되므로, 이 함수를 사용하면 사용자를 보안 위험에 노출할 수 있습니다. 이 함수는 소켓을 @code{localhost}에만 바인드하고, 원격 기계의 연결은 허용하지 않지만, 신뢰할 수 없는 코드가 @ref{1164,,listen()}을 호출하는 프로세스의 계정으로 실행될 수 있는 시나리오가 있습니다. 특히, @code{listen()}을 호출하는 프로세스가 사용자가 서로를 신뢰할 수 없는 다중 사용자 시스템에서 실행되는 경우, 악의적인 사용자는 피해자의 @code{listen()} 소켓에 연결하여 공격자가 피해자의 프로세스에서 실행하고자 하는 코드를 실행하는 구성을 보내는 것만으로도, 피해 사용자의 프로세스에서 사실상 임의의 코드를 실행할 수 있습니다. 이것은 기본 포트를 사용하는 경우 특히 쉽게 수행할 수 있지만, 다른 포트가 사용되는 경우에도 어렵지는 않습니다. 이러한 일이 발생할 위험을 피하려면, @code{listen()}에 @code{verify} 인자를 사용하여 인식되지 않은 구성이 적용되지 않도록 하십시오.
@end quotation
@end cartouche


버전 3.4에서 변경: @code{verify} 인자가 추가되었습니다.


@cartouche
@quotation 참고 
리스너에 기존 로거를 비활성화하지 않는 구성을 보내려면, @ref{13b5,,dictConfig()}를 사용하도록 구성에 JSON 형식을 사용해야 합니다. 이 방법은 보내는 구성에서 @code{disable_existing_loggers}를 @code{False}로 지정할 수 있도록 합니다.
@end quotation
@end cartouche
@end deffn

@geindex stopListening() (logging.config 모듈)
@anchor{library/logging config logging config stopListening}@anchor{31d3}
@deffn {함수} logging.config.stopListening ()

@ref{1164,,listen()}에 대한 호출로 만들어진 리스닝 서버를 중지합니다. 이것은 일반적으로 @code{listen()}의 반환 값에 대해 @code{join()}을 호출하기 전에 호출됩니다.
@end deffn

@node 보안 고려 사항,구성 딕셔너리 스키마,구성 함수,logging config — 로깅 구성
@anchor{library/logging config security-considerations}@anchor{31d5}
@subsubsection 보안 고려 사항


The logging configuration functionality tries to offer convenience, and in part this
is done by offering the ability to convert text in configuration files into Python
objects used in logging configuration - for example, as described in
@ref{31d6,,사용자 정의 객체}. However, these same mechanisms (importing
callables from user-defined modules and calling them with parameters from the
configuration) could be used to invoke any code you like, and for this reason you
should treat configuration files from untrusted sources with `extreme caution' and
satisfy yourself that nothing bad can happen if you load them, before actually loading
them.

@node 구성 딕셔너리 스키마,구성 파일 형식,보안 고려 사항,logging config — 로깅 구성
@anchor{library/logging config configuration-dictionary-schema}@anchor{31d7}@anchor{library/logging config logging-config-dictschema}@anchor{31d1}
@subsubsection 구성 딕셔너리 스키마


로깅 구성을 기술하려면 만들려는 다양한 객체와 그들 간의 연결을 나열해야 합니다; 예를 들어, ‘console’이라는 처리기를 만든 다음 ‘startup’이라는 로거가 ‘console’ 처리기에 메시지를 보낼 것이라고 말할 수 있습니다. 사용자 자신의 포매터나 처리기 클래스를 작성할 수 있으므로, 이러한 객체가 @ref{8b,,logging} 모듈에서 제공하는 객체로만 제한되지는 않습니다. 이러한 클래스의 매개 변수는 @code{sys.stderr}과 같은 외부 객체를 포함할 수도 있습니다. 이러한 객체와 연결을 기술하는 문법은 아래의 @ref{31d8,,객체 연결}에 정의되어 있습니다.

@menu
* 딕셔너리 스키마 세부사항:: 
* 증분 구성:: 
* 객체 연결:: 
* 사용자 정의 객체:: 
* 처리기 구성 순서:: 
* 외부 객체에 대한 액세스:: 
* 내부 객체에 대한 액세스:: 
* 임포트 결정과 사용자 정의 임포터:: 
* Configuring QueueHandler and QueueListener:: 

@end menu

@node 딕셔너리 스키마 세부사항,증분 구성,,구성 딕셔너리 스키마
@anchor{library/logging config dictionary-schema-details}@anchor{31d9}
@subsubsection 딕셔너리 스키마 세부사항


@ref{13b5,,dictConfig()}에 전달되는 딕셔너리에는 반드시 다음 키가 있어야 합니다:


@itemize *

@item 
`version' - 스키마 버전을 나타내는 정숫값으로 설정됩니다. 현재 유효한 유일한 값은 1이지만, 이 키를 사용하면 과거 호환성을 유지하면서 스키마를 발전시킬 수 있습니다.
@end itemize

다른 모든 키는 선택 사항이지만, 있으면 아래에 설명된 대로 해석됩니다. 아래에서 ‘구성 딕셔너리(configuring dict)’가 언급되는 모든 경우에, 특수한 @code{'()'} 키를 검사해서 사용자 정의 인스턴스화가 필요한지를 확인합니다. 있다면, 아래의 @ref{31d6,,사용자 정의 객체}에 설명된 메커니즘을 사용하여 인스턴스를 만듭니다; 그렇지 않다면, 어떤 인스턴스를 만들지를 결정하는데 문맥이 사용됩니다.
@anchor{library/logging config logging-config-dictschema-formatters}@anchor{31da}

@itemize *

@item 
`formatters' - 해당 값은 딕셔너리인데, 각 키는 포매터 id이고, 각 값은 해당 @ref{169c,,Formatter} 인스턴스를 구성하는 방법을 설명하는 딕셔너리입니다.

@ref{169c,,Formatter} 객체를 만들 때 전달된 인자에 대응되는, 다음과 같은 선택적 키를 구성 딕셔너리에서 검색합니다:


@itemize *

@item 
@code{format}

@item 
@code{datefmt}

@item 
@code{style}

@item 
@code{validate} (버전 >=3.8 부터)

@item 
@code{defaults} (버전 >=3.12 부터)
@end itemize

선택적 @code{class} 키는 포매터 클래스의 이름을 나타냅니다 (점으로 구분된 모듈과 클래스 이름). 인스턴스화 인자는 @ref{169c,,Formatter}와 같아서, 이 키는 사용자 정의 @code{Formatter} 서브 클래스를 인스턴스화하는 데 가장 유용합니다. 예를 들어, 대체 클래스는 확장되거나 축약한 형식으로 예외 트레이스백을 표시할 수 있습니다. 포매터가 다른 또는 추가 구성 키를 요구하면, @ref{31d6,,사용자 정의 객체}를 사용해야 합니다.

@item 
`filters' - 해당 값은 딕셔너리인데, 각 키가 필터 id이고 각 값은 해당 Filter 인스턴스를 구성하는 방법을 설명하는 딕셔너리입니다.

구성 딕셔너리는 키 @code{name}(기본값은 빈 문자열)으로 검색되며, 이는 @ref{1400,,logging.Filter} 인스턴스를 만드는 데 사용됩니다.

@item 
`handlers' - 해당 값은 딕셔너리인데, 각 키가 처리기 id이고 각 값은 해당 Handler 인스턴스를 구성하는 방법을 설명하는 딕셔너리입니다.

구성 딕셔너리는 다음 키에서 검색합니다:


@itemize *

@item 
@code{class} (필수). 이것은 처리기 클래스의 완전히 정규화된 이름입니다.

@item 
@code{level} (선택). 처리기의 수준.

@item 
@code{formatter} (선택). 이 처리기의 포매터의 id.

@item 
@code{filters} (선택). 이 처리기의 필터의 id의 리스트.


버전 3.11에서 변경: @code{filters} can take filter instances in addition to ids.

@end itemize

모든 `다른' 키는, 처리기의 생성자에 키워드 인자로 전달됩니다. 예를 들어, 다음과 같이 주어진 조각에서:

@example
handlers:
  console:
    class : logging.StreamHandler
    formatter: brief
    level   : INFO
    filters: [allow_foo]
    stream  : ext://sys.stdout
  file:
    class : logging.handlers.RotatingFileHandler
    formatter: precise
    filename: logconfig.log
    maxBytes: 1024
    backupCount: 3
@end example

id가 @code{console} 인 처리기는 @code{sys.stdout}를 하부 스트림으로 사용하는 @ref{13fd,,logging.StreamHandler}로 인스턴스가 만들어집니다. id가 @code{file} 인 처리기는 키워드 인자 @code{filename='logconfig.log', maxBytes=1024, backupCount=3}를 사용하여 @ref{1942,,logging.handlers.RotatingFileHandler}로 인스턴스가 만들어집니다.

@item 
`loggers' - 해당 값은 딕셔너리인데, 각 키가 로거 이름이고 각 값은 해당 Logger 인스턴스를 구성하는 방법을 설명하는 딕셔너리입니다.

구성 딕셔너리는 다음 키에서 검색합니다:


@itemize *

@item 
@code{level} (선택). 로거의 수준.

@item 
@code{propagate} (선택). 로거의 전파(propagation) 설정.

@item 
@code{filters} (선택). 이 로거의 필터의 id의 리스트


버전 3.11에서 변경: @code{filters} can take filter instances in addition to ids.


@item 
@code{handlers} (선택). 이 로거의 처리기의 id의 리스트.
@end itemize

지정된 로거는 지정된 수준, 전파, 필터와 처리기에 따라 구성됩니다.

@item 
`root' - 루트 로거에 대한 구성입니다. @code{propagate} 설정을 적용할 수 없다는 점을 제외하고 구성 처리는 모든 로거와 같습니다.

@item 
`incremental' - 구성을 기존 구성의 증분으로 해석할지 여부. 이 값의 기본값은 @code{False}이며, 이는 지정된 구성이 기존 구성을 기존 @ref{d47,,fileConfig()} API에서 사용된 것과 같은 의미로 대체 함을 뜻합니다.

지정된 값이 @code{True}이면, @ref{31db,,증분 구성} 절에서 설명하는 대로 구성이 처리됩니다.

@item 
`disable_existing_loggers' - 기존의 루트가 아닌 로거를 비활성화할지 여부. 이 설정은 @ref{d47,,fileConfig()}의 같은 이름의 매개 변수를 반영합니다. 없으면, 이 매개 변수의 기본값은 @code{True}입니다. `incremental'이 @code{True}이면 이 값은 무시됩니다.
@end itemize

@node 증분 구성,객체 연결,딕셔너리 스키마 세부사항,구성 딕셔너리 스키마
@anchor{library/logging config incremental-configuration}@anchor{31dc}@anchor{library/logging config logging-config-dict-incremental}@anchor{31db}
@subsubsection 증분 구성


증분 구성에 완벽한 유연성을 제공하기는 어렵습니다. 예를 들어, 필터와 포매터와 같은 객체는 익명이므로, 일단 구성이 설정되면, 이러한 익명 객체를 참조하여 구성을 보강할 수 없습니다.

또한, 일단 구성이 설정되면, 실행 시간에 로거, 처리기, 필터, 포매터의 객체 그래프를 임의로 변경해야 할 강력한 사례는 없습니다; 로거와 처리기의 상세도는 단지 수준(과, loggers에서는 전파 플래그)을 설정하여 제어할 수 있습니다. 객체 그래프를 임의로 안전하게 변경하는 것은 다중 스레드 환경에서 문제가 됩니다; 불가능하지는 않지만, 구현에 추가되는 복잡성을 상쇄할만한 가치가 없습니다.

따라서, 구성 딕셔너리의 @code{incremental} 키가 있고 @code{True}이면, 시스템은 @code{formatters}와 @code{filters} 항목을 완전히 무시하고 @code{handlers} 항목의 @code{level} 설정과 @code{loggers}와 @code{root} 항목의 @code{level}과 @code{propagate} 설정만 처리합니다.

구성 딕셔너리의 값을 사용하면 구성을 피클 된 딕셔너리의 형태로 네트워크를 통해 소켓 리스너로 전송할 수 있습니다. 따라서, 장기 실행 응용 프로그램의 로깅 상세도는 응용 프로그램을 중지하고 다시 시작할 필요 없이 도중에 변경될 수 있습니다.

@node 객체 연결,사용자 정의 객체,증분 구성,구성 딕셔너리 스키마
@anchor{library/logging config logging-config-dict-connections}@anchor{31d8}@anchor{library/logging config object-connections}@anchor{31dd}
@subsubsection 객체 연결


스키마는 객체 그래프에서 서로 연결된 로깅 객체 집합(로거, 처리기, 포매터, 필터)을 기술합니다. 따라서, 스키마는 객체 간의 연결을 표현할 필요가 있습니다. 예를 들어, 일단 구성되면, 특정 로거가 특정 처리기에 연결된다고 합시다. 이 토론의 목적을 위해, 둘 간의 연결에서 로거는 소스를, 처리기는 대상(destination)을 나타낸다고 할 수 있습니다. 물론 구성된 객체에서 이것은 처리기에 대한 참조를 갖는 로거로 표현됩니다. 구성 딕셔너리에서, 각 대상 객체에 명확하게 식별하는 id를 부여한 다음, 소스 객체의 구성에서 그 id를 사용하여, 소스와 그 id를 갖는 대상 객체 사이에 연결이 있음을 나타냅니다.

그래서, 예를 들어, 다음 YAML 조각을 고려해보십시오:

@example
formatters:
  brief:
    # id 'brief'인 포매터 구성이 여기에 옵니다
  precise:
    # id 'precise'인 포매터 구성이 여기에 옵니다
handlers:
  h1: #이것은 id입니다
   # id 'h1'인 처리기 구성이 여기에 옵니다
   formatter: brief
  h2: #이것은 다른 id입니다.
   # id 'h2'인 처리기 구성이 여기에 옵니다
   formatter: precise
loggers:
  foo.bar.baz:
    # 로거 'foo.bar.baz'의 다른 구성
    handlers: [h1, h2]
@end example

(참고: 딕셔너리에 해당하는 파이썬 소스 형식보다 약간 더 읽기 쉬우므로 여기에서 YAML을 사용했습니다.)

로거의 id는 로거로의 참조를 얻기 위해서 프로그램적으로 사용되는 로거 이름입니다, 예를 들어 @code{foo.bar.baz}. 포매터와 필터의 id는 임의의 문자열 값(가령 위의 @code{brief}, @code{precise})이 될 수 있으며, 일시적이므로 구성 딕셔너리 처리에만 의미가 있고 객체 간의 연결을 결정하는 데 사용되며, 구성 호출이 완료된 후에는 어디에도 남아있지 않습니다.

위의 조각은 @code{foo.bar.baz}라는 로거에 두 개의 처리기가 연결되어 있어야 하며, 이 처리기들은 처리기 id @code{h1}과 @code{h2}에 의해 기술됩니다. @code{h1}의 포매터는 id @code{brief}로 기술되는 것이고, @code{h2}의 포매터는 id @code{precise}로 기술되는 것입니다.

@node 사용자 정의 객체,처리기 구성 순서,객체 연결,구성 딕셔너리 스키마
@anchor{library/logging config logging-config-dict-userdef}@anchor{31d6}@anchor{library/logging config user-defined-objects}@anchor{31de}
@subsubsection 사용자 정의 객체


스키마는 처리기, 필터 및 포매터에 대한 사용자 정의 객체를 지원합니다. (로거에는 인스턴스마다 다른 형이 필요하지 않으므로, 이 구성 스키마에는 사용자 정의 로거 클래스에 대한 지원이 없습니다.)

구성할 객체는 구성을 자세히 설명하는 딕셔너리로 시술됩니다. 어떤 곳에서는, 로깅 시스템이 객체를 어떻게 인스턴스화할지 문맥으로부터 추측할 수 있지만, 사용자 정의 객체를 인스턴스화 해야 할 때, 시스템은 이를 수행하는 방법을 알 수 없습니다. 사용자 정의 객체 인스턴스화를 위한 완벽한 유연성을 제공하기 위해, 사용자는 ‘팩토리’를 제공해야 하는데, 구성 딕셔너리로 호출되고 인스턴스화 된 객체를 반환하는 콜러블입니다. 이것은 특수키 @code{'()'}로 제공되는 팩토리로의 절대적 임포트 경로로 표시됩니다. 다음은 구체적인 예입니다:

@example
formatters:
  brief:
    format: '%(message)s'
  default:
    format: '%(asctime)s %(levelname)-8s %(name)-15s %(message)s'
    datefmt: '%Y-%m-%d %H:%M:%S'
  custom:
      (): my.package.customFormatterFactory
      bar: baz
      spam: 99.9
      answer: 42
@end example

위의 YAML 조각은 세 가지 포매터를 정의합니다. 첫 번째(id @code{brief})는 지정된 포맷 문자열을 갖는 표준 @ref{169c,,logging.Formatter} 인스턴스입니다. 두 번째(id @code{default})는 더 긴 포맷을 가지며 명시적으로 시간 포맷을 정의하기도 하고, 이 두 포맷 문자열로 초기화된 @code{logging.Formatter}가 됩니다. 파이썬 소스 형식으로 표시하면, @code{brief}와 @code{default} 포매터는 각각 다음과 같은 구성 서브 딕셔너리를 갖습니다:

@example
@{
  'format' : '%(message)s'
@}
@end example

그리고:

@example
@{
  'format' : '%(asctime)s %(levelname)-8s %(name)-15s %(message)s',
  'datefmt' : '%Y-%m-%d %H:%M:%S'
@}
@end example

그리고, 이 딕셔너리에는 특수키 @code{'()'}가 포함되어 있지 않으므로, 문맥에서 인스턴스가 추론됩니다: 결과적으로, 표준 @ref{169c,,logging.Formatter} 인스턴스가 만들어집니다. 세 번째 포매터(id @code{custom})에 대한 구성 서브 딕셔너리는 다음과 같습니다:

@example
@{
  '()' : 'my.package.customFormatterFactory',
  'bar' : 'baz',
  'spam' : 99.9,
  'answer' : 42
@}
@end example

여기에는 특수키 @code{'()'}가 포함되어 있는데, 사용자 정의 인스턴스가 필요하다는 뜻입니다. 이때, 지정된 팩토리 콜러블이 사용됩니다. 그것이 실제 콜러블이면 직접 사용됩니다 - 그렇지 않고, (예에서와같이) 문자열을 지정하면 일반적인 임포트 메커니즘을 사용하여 실제 콜러블을 얻습니다. 콜러블은 구성 서브 딕셔너리의 `나머지' 항목을 키워드 인자로 호출됩니다. 위의 예제에서, id가 @code{custom}인 포매터는 다음과 같은 호출이 반환한다고 가정합니다:

@example
my.package.customFormatterFactory(bar='baz', spam=99.9, answer=42)
@end example

@cartouche
@quotation 경고 
The values for keys such as @code{bar}, @code{spam} and @code{answer} in
the above example should not be configuration dictionaries or references such
as @code{cfg://foo} or @code{ext://bar}, because they will not be processed by the
configuration machinery, but passed to the callable as-is.
@end quotation
@end cartouche

@code{'()'} 키가 유효한 키워드 매개 변수 이름이 아니라서 특수키로 사용되었습니다. 그러므로 호출에 사용되는 키워드 인자의 이름과 충돌하지 않습니다. @code{'()'}는 해당 값이 콜러블이라는 표시로도 기능합니다.


버전 3.11에서 변경: The @code{filters} member of @code{handlers} and @code{loggers} can take
filter instances in addition to ids.


You can also specify a special key @code{'.'} whose value is a
mapping of attribute names to values. If found, the specified attributes will
be set on the user-defined object before it is returned. Thus, with the
following configuration:

@example
@{
  '()' : 'my.package.customFormatterFactory',
  'bar' : 'baz',
  'spam' : 99.9,
  'answer' : 42,
  '.' @{
    'foo': 'bar',
    'baz': 'bozz'
  @}
@}
@end example

the returned formatter will have attribute @code{foo} set to @code{'bar'} and
attribute @code{baz} set to @code{'bozz'}.

@cartouche
@quotation 경고 
The values for attributes such as @code{foo} and @code{baz} in
the above example should not be configuration dictionaries or references such
as @code{cfg://foo} or @code{ext://bar}, because they will not be processed by the
configuration machinery, but set as attribute values as-is.
@end quotation
@end cartouche

@node 처리기 구성 순서,외부 객체에 대한 액세스,사용자 정의 객체,구성 딕셔너리 스키마
@anchor{library/logging config handler-config-dict-order}@anchor{31df}@anchor{library/logging config handler-configuration-order}@anchor{31e0}
@subsubsection 처리기 구성 순서


Handlers are configured in alphabetical order of their keys, and a configured
handler replaces the configuration dictionary in (a working copy of) the
@code{handlers} dictionary in the schema. If you use a construct such as
@code{cfg://handlers.foo}, then initially @code{handlers['foo']} points to the
configuration dictionary for the handler named @code{foo}, and later (once that
handler has been configured) it points to the configured handler instance.
Thus, @code{cfg://handlers.foo} could resolve to either a dictionary or a handler
instance. In general, it is wise to name handlers in a way such that dependent
handlers are configured `after' any handlers they depend on; that allows
something like @code{cfg://handlers.foo} to be used in configuring a handler that
depends on handler @code{foo}. If that dependent handler were named @code{bar},
problems would result, because the configuration of @code{bar} would be attempted
before that of @code{foo}, and @code{foo} would not yet have been configured.
However, if the dependent handler were named @code{foobar}, it would be configured
after @code{foo}, with the result that @code{cfg://handlers.foo} would resolve to
configured handler @code{foo}, and not its configuration dictionary.

@node 외부 객체에 대한 액세스,내부 객체에 대한 액세스,처리기 구성 순서,구성 딕셔너리 스키마
@anchor{library/logging config access-to-external-objects}@anchor{31e1}@anchor{library/logging config logging-config-dict-externalobj}@anchor{31e2}
@subsubsection 외부 객체에 대한 액세스


구성에서 구성 외부의 객체를 참조해야 하는 경우가 있습니다, 예를 들어 @code{sys.stderr}. 구성 딕셔너리가 파이썬 코드를 사용하여 만들어질 때는 간단하지만, 구성이 텍스트 파일(예를 들어, JSON, YAML)을 통해 제공될 때 문제가 발생합니다. 텍스트 파일에서는, @code{sys.stderr}를 리터럴 문자열 @code{'sys.stderr'}과 구별하는 표준 방법이 없습니다. 이 구별을 쉽게 하기 위해, 구성 시스템은 문자열 값에서 특정 접두사를 찾아 특수하게 처리합니다. 예를 들어, 리터럴 문자열 @code{'ext://sys.stderr'}이 구성에서 값으로 제공되면, @code{ext://}는 제거되고 값의 나머지 부분을 일반 임포트 메커니즘을 사용하여 처리합니다.

이러한 접두사의 처리는 프로토콜 처리와 유사한 방식으로 수행됩니다: 정규식 @code{^(?P<prefix>[a-z]+)://(?P<suffix>.*)$}와 일치하는 접두사를 찾는 일반 메커니즘이 있습니다. @code{prefix}가 인식되면 @code{suffix}는 접두사 종속적 방식으로 처리되고 처리 결과가 문자열 값을 대체합니다. 접두사가 인식되지 않으면, 문자열 값은 그대로 남습니다.

@node 내부 객체에 대한 액세스,임포트 결정과 사용자 정의 임포터,외부 객체에 대한 액세스,구성 딕셔너리 스키마
@anchor{library/logging config access-to-internal-objects}@anchor{31e3}@anchor{library/logging config logging-config-dict-internalobj}@anchor{31e4}
@subsubsection 내부 객체에 대한 액세스


외부 객체뿐만 아니라, 때로 구성에 있는 객체를 참조할 필요도 있습니다. 이것은 구성 시스템이 알고 있는 것들에 대해 묵시적으로 수행됩니다. 예를 들어, 로거나 처리기의 @code{level}에 대한 문자열 값 @code{'DEBUG'}은 자동으로 값 @code{logging.DEBUG}으로 변환되고, @code{handlers}, @code{filters} 및 @code{formatter} 항목은 객체 id를 받아서 적절한 대상 객체로 결정합니다.

하지만, @ref{8b,,logging} 모듈에 알려지지 않은 사용자 정의 객체에는 더욱 일반적인 메커니즘이 필요합니다. 예를 들어, 위임할 다른 처리기인 @code{target} 인자를 취하는 @ref{31e5,,logging.handlers.MemoryHandler}를 고려해봅시다. 시스템이 이미 이 클래스에 대해 알고 있으므로, 구성에서, 주어진 @code{target}은 단지 관련 target 처리기의 객체 id이기만 하면 되며, 시스템은 id로부터 처리기를 결정합니다. 그러나 사용자가 @code{alternate} 처리기를 갖는 @code{my.package.MyHandler}를 정의하면, 구성 시스템은 @code{alternate}가 처리기를 참조한다는 것을 알 수 없습니다. 이 문제를 해결하기 위해, 일반 결정 시스템은 사용자가 다음과 같이 지정할 수 있게 합니다:

@example
handlers:
  file:
    # 파일 처리기의 구성은 여기에 옵니다

  custom:
    (): my.package.MyHandler
    alternate: cfg://handlers.file
@end example

리터럴 문자열 @code{'cfg://handlers.file'}은 @code{ext://} 접두사가 있는 문자열과 비슷하게 결정되지만, 임포트 이름 공간이 아닌 구성 자체를 조회합니다. 이 메커니즘은 @code{str.format}에서 제공하는 것과 유사한 방식으로 점이나 인덱스로 액세스하는 것을 허락합니다. 따라서, 구성에서 다음과 같은 조각이 주어질 때:

@example
handlers:
  email:
    class: logging.handlers.SMTPHandler
    mailhost: localhost
    fromaddr: my_app@@domain.tld
    toaddrs:
      - support_team@@domain.tld
      - dev_team@@domain.tld
    subject: Houston, we have a problem.
@end example

문자열 @code{'cfg://handlers'}는 키 @code{handlers}의 딕셔너리로 결정되고, 문자열 @code{'cfg://handlers.email}은 @code{handlers} 딕셔너리에 있는 키 @code{email}의 딕셔너리로 결정됩니다, 등등. 문자열 @code{'cfg://handlers.email.toaddrs[1]}은 @code{'dev_team@@domain.tld'}로 결정되고 문자열 @code{'cfg://handlers.email.toaddrs[0]'}은 값 @code{'support_team@@domain.tld'}로 결정됩니다. @code{subject} 값은 @code{'cfg://handlers.email.subject'}나 동등하게 @code{'cfg://handlers.email[subject]'}를 사용하여 액세스할 수 있습니다. 후자의 형식은 키에 공백이나 영숫자가 아닌 문자가 포함되어있을 때만 필요합니다. 키에는 문자 @code{[} 와 @code{]}가 허용되지 않음에 유의하십시오. 인덱스값이 십진수로만 구성되면, 해당 정숫값을 사용하여 액세스가 시도되고, 필요하면 문자열 값으로 다시 시도합니다.

문자열 @code{cfg://handlers.myhandler.mykey.123}이 주어지면, @code{config_dict['handlers']['myhandler']['mykey']['123']}으로 변환됩니다. 문자열이 @code{cfg://handlers.myhandler.mykey[123]}로 지정되면, 시스템은 @code{config_dict['handlers']['myhandler']['mykey'][123]}에서 값을 가져오려고 시도하고, 실패하면 @code{config_dict['handlers']['myhandler']['mykey']['123']}으로 폴백합니다.

@node 임포트 결정과 사용자 정의 임포터,Configuring QueueHandler and QueueListener,내부 객체에 대한 액세스,구성 딕셔너리 스키마
@anchor{library/logging config import-resolution-and-custom-importers}@anchor{31e6}@anchor{library/logging config logging-import-resolution}@anchor{31e7}
@subsubsection 임포트 결정과 사용자 정의 임포터


임포트 결정은, 기본적으로, 임포트 하는데 내장 @ref{ad1,,__import__()} 함수를 사용합니다. 이것을 자신의 임포트 메커니즘으로 바꾸고 싶을 수 있습니다: 그렇다면, @code{DictConfigurator}나 그것의 슈퍼 클래스(@code{BaseConfigurator} 클래스)의 @code{importer} 어트리뷰트를 바꿀 수 있습니다. 그러나, 함수가 클래스에서 디스크립터를 통해 액세스 되는 방식 때문에 주의해야 합니다. 파이썬 콜러블을 사용하여 임포트를 수행하려고 하고, 인스턴스 수준이 아닌 클래스 수준에서 정의하려고 한다면, @ref{453,,staticmethod()}로 감쌀 필요가 있습니다. 예를 들면:

@example
from importlib import import_module
from logging.config import BaseConfigurator

BaseConfigurator.importer = staticmethod(import_module)
@end example

구성자 `instance'에서 임포트 콜러블을 설정한다면, @ref{453,,staticmethod()}로 감쌀 필요가 없습니다.

@node Configuring QueueHandler and QueueListener,,임포트 결정과 사용자 정의 임포터,구성 딕셔너리 스키마
@anchor{library/logging config configure-queue}@anchor{1947}@anchor{library/logging config configuring-queuehandler-and-queuelistener}@anchor{31e8}
@subsubsection Configuring QueueHandler and QueueListener


If you want to configure a @ref{1b5f,,QueueHandler}, noting that this
is normally used in conjunction with a @ref{242,,QueueListener}, you
can configure both together. After the configuration, the @code{QueueListener} instance
will be available as the @ref{31e9,,listener} attribute of
the created handler, and that in turn will be available to you using
@ref{1b60,,getHandlerByName()} and passing the name you have used for the
@code{QueueHandler} in your configuration. The dictionary schema for configuring the pair
is shown in the example YAML snippet below.

@example
handlers:
  qhand:
    class: logging.handlers.QueueHandler
    queue: my.module.queue_factory
    listener: my.package.CustomListener
    handlers:
      - hand_name_1
      - hand_name_2
      ...
@end example

The @code{queue} and @code{listener} keys are optional.

If the @code{queue} key is present, the corresponding value can be one of the following:


@itemize *

@item 
An object implementing the @ref{31ea,,Queue.put_nowait}
and @ref{31eb,,Queue.get} public API. For instance, this may be
an actual instance of @ref{1599,,queue.Queue} or a subclass thereof, or a proxy
obtained by @ref{31ec,,multiprocessing.managers.SyncManager.Queue()}.

This is of course only possible if you are constructing or modifying
the configuration dictionary in code.

@item 
A string that resolves to a callable which, when called with no arguments, returns
the queue instance to use. That callable could be a @ref{1599,,queue.Queue} subclass
or a function which returns a suitable queue instance,
such as @code{my.module.queue_factory()}.

@item 
A dict with a @code{'()'} key which is constructed in the usual way as discussed in
@ref{31d6,,사용자 정의 객체}. The result of this construction should be a
@ref{1599,,queue.Queue} instance.
@end itemize

If the  @code{queue} key is absent, a standard unbounded @ref{1599,,queue.Queue} instance is
created and used.

If the @code{listener} key is present, the corresponding value can be one of the following:


@itemize *

@item 
A subclass of @ref{242,,logging.handlers.QueueListener}. This is of course only
possible if you are constructing or modifying the configuration dictionary in
code.

@item 
A string which resolves to a class which is a subclass of @code{QueueListener}, such as
@code{'my.package.CustomListener'}.

@item 
A dict with a @code{'()'} key which is constructed in the usual way as discussed in
@ref{31d6,,사용자 정의 객체}. The result of this construction should be a
callable with the same signature as the @code{QueueListener} initializer.
@end itemize

If the @code{listener} key is absent, @ref{242,,logging.handlers.QueueListener} is used.

The values under the @code{handlers} key are the names of other handlers in the
configuration (not shown in the above snippet) which will be passed to the queue
listener.

Any custom queue handler and listener classes will need to be defined with the same
initialization signatures as @ref{1b5f,,QueueHandler} and
@ref{242,,QueueListener}.


Added in version 3.12.


@node 구성 파일 형식,,구성 딕셔너리 스키마,logging config — 로깅 구성
@anchor{library/logging config configuration-file-format}@anchor{31ed}@anchor{library/logging config logging-config-fileformat}@anchor{31d2}
@subsubsection 구성 파일 형식


@ref{d47,,fileConfig()}이 이해하는 구성 파일 형식은 @ref{26,,configparser} 기능을 기반으로 합니다. 파일에는 @code{[loggers]}, @code{[handlers]} 및 @code{[formatters]}라는 섹션이 있어야 하며, 이 섹션에서는 파일에 정의된 각 유형의 엔티티를 이름으로 식별합니다. 이러한 엔티티마다 해당 엔티티 구성 방법을 식별하는 별도의 섹션이 있습니다. 따라서, @code{[loggers]} 섹션에서 @code{log01}이라고 이름 붙은 로거에 대해, 관련 구성 세부 사항은 @code{[logger_log01]} 섹션에 담깁니다. 마찬가지로, @code{[handlers]} 섹션에서 @code{hand01}이라고 부르는 처리기는 @code{[handler_hand01]}이라는 섹션에 구성이 담기고, @code{[formatters]} 섹션에서 @code{form01}이라고 부르는 포매터는 @code{[formatter_form01]}이라는 섹션에서 구성이 지정됩니다. 루트 로거 구성은 @code{[logger_root]}라는 섹션에서 지정해야 합니다.

@cartouche
@quotation 참고 
@ref{d47,,fileConfig()} API는 @ref{13b5,,dictConfig()} API보다 오래되었으며 로깅의 특정 측면을 다루는 기능을 제공하지 않습니다. 예를 들어, @code{fileConfig()}를 사용해서는 간단한 정수 수준을 넘어서는 메시지 필터링을 제공하는 @ref{1400,,Filter} 객체를 구성할 수 없습니다. 로깅 구성에 @code{Filter} 인스턴스가 필요하면, @code{dictConfig()}를 사용해야 합니다. 향후 구성 기능의 개선은 @code{dictConfig()}에 추가될 것임에 유의하십시오. 따라서, 편리할 때 이 새로운 API로 전환하는 것을 고려해 볼 가치가 있습니다.
@end quotation
@end cartouche

파일에 있는 이 절의 예는 아래에 나와 있습니다.

@example
[loggers]
keys=root,log02,log03,log04,log05,log06,log07

[handlers]
keys=hand01,hand02,hand03,hand04,hand05,hand06,hand07,hand08,hand09

[formatters]
keys=form01,form02,form03,form04,form05,form06,form07,form08,form09
@end example

루트 로거는 수준과 처리기 목록을 지정해야 합니다. 루트 로거 섹션의 예가 아래에 나와 있습니다.

@example
[logger_root]
level=NOTSET
handlers=hand01
@end example

@code{level} 항목은 @code{DEBUG, INFO, WARNING, ERROR, CRITICAL} 또는 @code{NOTSET} 중 하나일 수 있습니다. 루트 로거에서만, @code{NOTSET}는 모든 메시지가 로그 됨을 의미합니다. 수준 값은 @code{logging} 패키지의 이름 공간 컨텍스트에서 @ref{25cd,,평가}됩니다.

@code{handlers} 항목은 @code{[handlers]} 섹션에 나타나야 하는 처리기 이름의 쉼표로 구분된 목록입니다. 이 이름들은 @code{[handlers]} 섹션에 나타나야 하며, 구성 파일에 해당 섹션이 있어야 합니다.

루트 로거가 아닌 로거의 경우, 몇 가지 추가 정보가 필요합니다. 이것은 다음 예제가 보여줍니다.

@example
[logger_parser]
level=DEBUG
handlers=hand01
propagate=1
qualname=compiler.parser
@end example

@code{level}과 @code{handlers} 항목은 루트 로거에서처럼 해석됩니다. 단, 루트가 아닌 로거의 수준이 @code{NOTSET}로 지정되면, 시스템은 로거의 유효 수준을 판별하기 위해 상위 계층 로거를 참조합니다. @code{propagate} 항목은 메시지가 이 로거로부터 더 높은 로거 계층의 처리기로 전파되어야 함을 나타내려면 1로 설정되고, 메시지가 계층 위의 처리기로 전달되지 `않음'을 나타내려면 0으로 설정됩니다. @code{qualname} 항목은 로거의 계층적 채널 이름, 즉 응용 프로그램에서 로거를 가져오는 데 사용되는 이름입니다.

처리기 구성을 지정하는 섹션은 다음과 같이 예시됩니다.

@example
[handler_hand01]
class=StreamHandler
level=NOTSET
formatter=form01
args=(sys.stdout,)
@end example

@code{class} 항목은 (@code{logging} 패키지의 이름 공간에서 @ref{4a4,,eval()}로 결정되는) 처리기의 클래스를 나타냅니다. @code{level}은 로거에서처럼 해석되며, @code{NOTSET}은 ‘모든 것을 로깅’을 의미합니다.

@code{formatter} 항목은 이 처리기의 포매터의 키 이름을 나타냅니다. 비어 있으면, 기본 포매터(@code{logging._defaultFormatter})가 사용됩니다. 이름이 지정되면, @code{[formatters]} 섹션에 나타나야 하며 구성 파일에 해당 섹션이 있어야 합니다.

@code{args} 항목은, @code{logging} 패키지의 이름 공간 컨텍스트에서 @ref{25cd,,평가}될 때, 처리기 클래스의 생성자에 대한 인자 목록입니다. 일반적인 항목 작성 방법을 보려면, 관련 처리기의 생성자나 아래 예제를 참조하십시오. 제공되지 않으면, 기본값은 @code{()}입니다.

선택적 @code{kwargs} 항목은, @code{logging} 패키지의 이름 공간 컨텍스트에서 @ref{25cd,,평가}될 때, 처리기 클래스의 생성자에 대한 키워드 인자 딕셔너리입니다. 제공되지 않으면, 기본값은 @code{@{@}}입니다.

@example
[handler_hand02]
class=FileHandler
level=DEBUG
formatter=form02
args=('python.log', 'w')

[handler_hand03]
class=handlers.SocketHandler
level=INFO
formatter=form03
args=('localhost', handlers.DEFAULT_TCP_LOGGING_PORT)

[handler_hand04]
class=handlers.DatagramHandler
level=WARN
formatter=form04
args=('localhost', handlers.DEFAULT_UDP_LOGGING_PORT)

[handler_hand05]
class=handlers.SysLogHandler
level=ERROR
formatter=form05
args=(('localhost', handlers.SYSLOG_UDP_PORT), handlers.SysLogHandler.LOG_USER)

[handler_hand06]
class=handlers.NTEventLogHandler
level=CRITICAL
formatter=form06
args=('Python Application', '@w{'}, 'Application')

[handler_hand07]
class=handlers.SMTPHandler
level=WARN
formatter=form07
args=('localhost', 'from@@abc', ['user1@@abc', 'user2@@xyz'], 'Logger Subject')
kwargs=@{'timeout': 10.0@}

[handler_hand08]
class=handlers.MemoryHandler
level=NOTSET
formatter=form08
target=
args=(10, ERROR)

[handler_hand09]
class=handlers.HTTPHandler
level=NOTSET
formatter=form09
args=('localhost:9022', '/log', 'GET')
kwargs=@{'secure': True@}
@end example

포매터 구성을 지정하는 섹션은 다음과 같이 예시됩니다.

@example
[formatter_form01]
format=F1 %(asctime)s %(levelname)s %(message)s %(customfield)s
datefmt=
style=%
validate=True
defaults=@{'customfield': 'defaultvalue'@}
class=logging.Formatter
@end example

The arguments for the formatter configuration are the same as the keys
in the dictionary schema @ref{31da,,formatters section}.

@code{defaults} 항목은, @code{logging} 패키지의 이름 공간 컨텍스트에서 @ref{25cd,,평가}될 때, 사용자 정의 포매팅 필드에 대한 기본 값의 딕셔너리입니다. 제공되지 않으면, 기본값은 @code{None}입니다.

@cartouche
@quotation 참고 
위에서 설명한 대로 @ref{4a4,,eval()}를 사용하기 때문에, @ref{1164,,listen()}을 사용하여 소켓을 통해 구성을 보내고 받을 때 발생할 수 있는 잠재적인 보안 위험이 있습니다. 위험은 상호 신뢰가 없는 여러 사용자가 같은 기계에서 코드를 실행할 때로 제한됩니다; 자세한 내용은 @code{listen()} 설명서를 참조하십시오.
@end quotation
@end cartouche


@subsubheading 더 보기



@table @asis

@item 모듈 @ref{8b,,logging}

logging 모듈에 관한 API 레퍼런스.

@item 모듈 @ref{8d,,logging.handlers}

logging 모듈에 포함된 유용한 처리기.
@end table


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node logging handlers — 로깅 처리기,platform — 하부 플랫폼의 식별 데이터에 대한 액세스,logging config — 로깅 구성,일반 운영 체제 서비스
@anchor{library/logging handlers doc}@anchor{31ee}@anchor{library/logging handlers logging-handlers-logging-handlers}@anchor{31ef}@anchor{library/logging handlers module-logging handlers}@anchor{8d}@anchor{library/logging handlers translation-repo}@anchor{31f0}
@subsection @code{logging.handlers} — 로깅 처리기


@geindex module; logging.handlers

`소스 코드:' Lib/logging/handlers.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/logging/handlers.py}

@subsubheading Important



이 페이지에는 레퍼런스 정보만 있습니다. 자습서는 다음을 참조하십시오


@itemize *

@item 
@ref{13fa,,기초 자습서}

@item 
@ref{13fb,,고급 자습서}

@item 
@ref{13fc,,로깅 요리책}
@end itemize


__________________________________________________________________


다음과 같은 유용한 처리기가 패키지에서 제공됩니다. 3개의 처리기(@ref{13fd,,StreamHandler}, @ref{1c51,,FileHandler}, @ref{1489,,NullHandler})는 실제로는 @ref{8b,,logging} 모듈 자체에 정의되어 있지만, 다른 처리기들과 함께 여기에서 설명합니다.

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

@end menu

@node StreamHandler,FileHandler,,logging handlers — 로깅 처리기
@anchor{library/logging handlers stream-handler}@anchor{31f1}@anchor{library/logging handlers streamhandler}@anchor{31f2}
@subsubsection StreamHandler


핵심 @ref{8b,,logging} 패키지에 있는 @ref{13fd,,StreamHandler} 클래스는 `sys.stdout', `sys.stderr' 또는 임의의 파일류 객체(또는 더 정확하게, @code{write()}와 @code{flush()} 메서드를 지원하는 모든 객체)와 같은 스트림으로 로깅 출력을 보냅니다.

@geindex StreamHandler (logging 클래스)
@anchor{library/logging handlers logging StreamHandler}@anchor{13fd}
@deffn {클래스} logging.StreamHandler (stream=None)

@ref{13fd,,StreamHandler} 클래스의 새로운 인스턴스를 반환합니다. `stream' 이 지정되면, 인스턴스는 그것을 로그 출력용으로 사용합니다; 그렇지 않으면, `sys.stderr' 이 사용됩니다.

@geindex emit() (logging.StreamHandler 메서드)
@anchor{library/logging handlers logging StreamHandler emit}@anchor{31f3}
@deffn {메서드} emit (record)

포매터가 지정되면, 레코드를 포맷하는 데 사용됩니다. 그런 다음 레코드는 @ref{31f4,,terminator}를 붙여 스트림에 기록됩니다. 예외 정보가 있으면, @ref{a4f,,traceback.print_exception()}을 사용하여 포맷한 후 스트림에 덧붙입니다.
@end deffn

@geindex flush() (logging.StreamHandler 메서드)
@anchor{library/logging handlers logging StreamHandler flush}@anchor{31f5}
@deffn {메서드} flush ()

스트림의 @ref{31f5,,flush()} 메서드를 호출해서 플러시 합니다. @code{close()} 메서드는 @ref{169b,,Handler} 에서 상속되고, 출력이 없으므로, 명시적 @code{flush()} 호출이 필요할 수도 있습니다.
@end deffn

@geindex setStream() (logging.StreamHandler 메서드)
@anchor{library/logging handlers logging StreamHandler setStream}@anchor{d46}
@deffn {메서드} setStream (stream)

지정한 값이 현재 값과 다르면, 인스턴스의 스트림을 지정된 값으로 설정합니다. 새 스트림이 설정되기 전에 이전 스트림이 플러시 됩니다.

@*매개변수: 
@code{stream} – 처리기가 사용할 스트림.


@*반환: 
스트림이 변경되면 이전 스트림, 그렇지 않으면 @code{None}.



Added in version 3.7.

@end deffn

@geindex terminator (logging.StreamHandler의 속성)
@anchor{library/logging handlers logging StreamHandler terminator}@anchor{31f4}
@deffn {속성} terminator

포맷된 레코드를 스트림에 쓸 때 종결자로 사용되는 문자열. 기본값은 @code{'\n'}입니다.

줄 바꿈 종료를 원하지 않으면, 처리기 인스턴스의 @code{terminator} 어트리뷰트를 빈 문자열로 설정할 수 있습니다.

이전 버전에서는, 종결자가 @code{'\n'}으로 하드 코딩되었습니다.


Added in version 3.2.

@end deffn
@end deffn

@node FileHandler,NullHandler,StreamHandler,logging handlers — 로깅 처리기
@anchor{library/logging handlers file-handler}@anchor{31f6}@anchor{library/logging handlers filehandler}@anchor{31f7}
@subsubsection FileHandler


핵심 @ref{8b,,logging} 패키지에 있는 @ref{1c51,,FileHandler} 클래스는 로깅 출력을 디스크 파일로 보냅니다. @ref{13fd,,StreamHandler} 에서 출력 기능을 상속받습니다.

@geindex FileHandler (logging 클래스)
@anchor{library/logging handlers logging FileHandler}@anchor{1c51}
@deffn {클래스} logging.FileHandler (filename, mode='a', encoding=None, delay=False, errors=None)

@ref{1c51,,FileHandler} 클래스의 새로운 인스턴스를 반환합니다. 지정된 파일이 열리고 로깅을 위한 스트림으로 사용됩니다. `mode' 가 지정되지 않으면, @code{'a'} 가 사용됩니다. `encoding' 이 @code{None} 이 아니면, `encoding'을 사용하여 파일을 엽니다. `delay' 가 참이면, 파일 열기는 @ref{31f8,,emit()}의 첫 번째 호출이 있을 때까지 연기됩니다. 기본적으로, 파일은 제한 없이 커집니다. `errors'가 지정되면, 인코딩 에러 처리 방법을 결정합니다.


버전 3.6에서 변경: 문자열 값뿐만 아니라, @ref{266,,Path} 객체도 `filename' 인자로 허용됩니다.



버전 3.9에서 변경: `errors' 매개 변수가 추가되었습니다.


@geindex close() (logging.FileHandler 메서드)
@anchor{library/logging handlers logging FileHandler close}@anchor{31f9}
@deffn {메서드} close ()

파일을 닫습니다.
@end deffn

@geindex emit() (logging.FileHandler 메서드)
@anchor{library/logging handlers logging FileHandler emit}@anchor{31f8}
@deffn {메서드} emit (record)

레코드를 파일에 출력합니다.

Note that if the file was closed due to logging shutdown at exit and the file
mode is ‘w’, the record will not be emitted (see bpo-42378@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=42378}).
@end deffn
@end deffn

@node NullHandler,WatchedFileHandler,FileHandler,logging handlers — 로깅 처리기
@anchor{library/logging handlers null-handler}@anchor{31fa}@anchor{library/logging handlers nullhandler}@anchor{31fb}
@subsubsection NullHandler



Added in version 3.1.


핵심 @ref{8b,,logging} 패키지에 있는 @ref{1489,,NullHandler} 클래스는 포맷이나 출력을 일절 하지 않습니다. 기본적으로 라이브러리 개발자가 사용하는 ‘no-op’ 처리기입니다.

@geindex NullHandler (logging 클래스)
@anchor{library/logging handlers logging NullHandler}@anchor{1489}
@deffn {클래스} logging.NullHandler

@ref{1489,,NullHandler} 클래스의 새로운 인스턴스를 반환합니다.

@geindex emit() (logging.NullHandler 메서드)
@anchor{library/logging handlers logging NullHandler emit}@anchor{31fc}
@deffn {메서드} emit (record)

이 메서드는 아무것도 하지 않습니다.
@end deffn

@geindex handle() (logging.NullHandler 메서드)
@anchor{library/logging handlers logging NullHandler handle}@anchor{31fd}
@deffn {메서드} handle (record)

이 메서드는 아무것도 하지 않습니다.
@end deffn

@geindex createLock() (logging.NullHandler 메서드)
@anchor{library/logging handlers logging NullHandler createLock}@anchor{31fe}
@deffn {메서드} createLock ()

액세스를 직렬화해야 하는 하부 I/O가 없으므로, 이 메서드는 록으로 @code{None} 을 반환합니다.
@end deffn
@end deffn

@ref{1489,,NullHandler} 사용법에 대한 더 많은 정보는 @ref{31ff,,라이브러리 로깅 구성}를 참조하세요.

@node WatchedFileHandler,BaseRotatingHandler,NullHandler,logging handlers — 로깅 처리기
@anchor{library/logging handlers watched-file-handler}@anchor{3200}@anchor{library/logging handlers watchedfilehandler}@anchor{3201}
@subsubsection WatchedFileHandler


The @ref{3202,,WatchedFileHandler} class, located in the @code{logging.handlers}
module, is a @code{FileHandler} which watches the file it is logging to. If
the file changes, it is closed and reopened using the file name.

로그 파일 회전을 수행하는 `newsyslog' 나 `logrotate' 와 같은 프로그램의 사용으로 인해 파일이 변경될 수 있습니다. 유닉스/리눅스에서 사용하기 위한 이 처리기는 마지막 출력 이후에 파일이 변경되었는지 감시합니다. (파일의 장치나 inode가 변경되면 파일이 변경된 것으로 간주합니다.) 파일이 변경되면, 이전 파일 스트림이 닫히고, 새 스트림을 얻기 위해 파일을 엽니다.

이 처리기는 윈도우에서 사용하기에 적합하지 않습니다. 윈도우에서는 열린 로그 파일을 이동하거나 이름을 변경할 수 없어서 - logging은 파일을 배타적 록으로 엽니다 - 이런 처리기가 필요하지 않기 때문입니다. 또한 `ST_INO' 는 윈도우에서 지원되지 않습니다; @ref{26d,,stat()}는 항상 이 값에 대해 0을 반환합니다.

@geindex WatchedFileHandler (logging.handlers 클래스)
@anchor{library/logging handlers logging handlers WatchedFileHandler}@anchor{3202}
@deffn {클래스} logging.handlers.WatchedFileHandler (filename, mode='a', encoding=None, delay=False, errors=None)

@code{FileHandler} 클래스의 새로운 인스턴스를 반환합니다. 지정된 파일이 열리고 로깅을 위한 스트림으로 사용됩니다. `mode' 가 지정되지 않으면, @code{'a'} 가 사용됩니다. `encoding' 이 @code{None} 이 아니면, `encoding'을 사용하여 파일을 엽니다. `delay' 가 참이면, 파일 열기는 @ref{3203,,emit()}의 첫 번째 호출이 있을 때까지 연기됩니다. 기본적으로, 파일은 제한 없이 커집니다. `errors'가 제공되면, 인코딩 에러 처리 방법을 결정합니다.


버전 3.6에서 변경: 문자열 값뿐만 아니라, @ref{266,,Path} 객체도 `filename' 인자로 허용됩니다.



버전 3.9에서 변경: `errors' 매개 변수가 추가되었습니다.


@geindex reopenIfNeeded() (logging.handlers.WatchedFileHandler 메서드)
@anchor{library/logging handlers logging handlers WatchedFileHandler reopenIfNeeded}@anchor{eb3}
@deffn {메서드} reopenIfNeeded ()

파일이 변경되었는지 확인합니다. 그렇다면, 기존 스트림을 플러시 한 후 닫고, 파일을 다시 엽니다. 일반적으로 레코드를 파일로 출력하기 전에 수행합니다.


Added in version 3.6.

@end deffn

@geindex emit() (logging.handlers.WatchedFileHandler 메서드)
@anchor{library/logging handlers logging handlers WatchedFileHandler emit}@anchor{3203}
@deffn {메서드} emit (record)

레코드를 파일에 출력하지만, 파일이 변경되었을 때 다시 열기 위해 @ref{eb3,,reopenIfNeeded()}를 먼저 호출합니다.
@end deffn
@end deffn

@node BaseRotatingHandler,RotatingFileHandler,WatchedFileHandler,logging handlers — 로깅 처리기
@anchor{library/logging handlers base-rotating-handler}@anchor{3204}@anchor{library/logging handlers baserotatinghandler}@anchor{3205}
@subsubsection BaseRotatingHandler


The @ref{3206,,BaseRotatingHandler} class, located in the @code{logging.handlers}
module, is the base class for the rotating file handlers,
@ref{1942,,RotatingFileHandler} and @ref{1160,,TimedRotatingFileHandler}. You should
not need to instantiate this class, but it has attributes and methods you may
need to override.

@geindex BaseRotatingHandler (logging.handlers 클래스)
@anchor{library/logging handlers logging handlers BaseRotatingHandler}@anchor{3206}
@deffn {클래스} logging.handlers.BaseRotatingHandler (filename, mode, encoding=None, delay=False, errors=None)

매개 변수는 @code{FileHandler} 와 같습니다. 어트리뷰트는 다음과 같습니다:

@geindex namer (logging.handlers.BaseRotatingHandler의 속성)
@anchor{library/logging handlers logging handlers BaseRotatingHandler namer}@anchor{3207}
@deffn {속성} namer

이 어트리뷰트가 콜러블로 설정되면, @ref{3208,,rotation_filename()} 메서드는 이 콜러블에 위임합니다. 콜러블로 전달되는 매개 변수는 @code{rotation_filename()}로 전달되는 것입니다.

@cartouche
@quotation 참고 
namer 함수는 롤오버 중에 꽤 자주 호출되므로, 가능한 한 간단하고 빨라야 합니다. 또한, 주어진 입력에 대해 매번 같은 출력을 반환해야 합니다, 그렇지 않으면 롤오버 동작이 예상대로 작동하지 않을 수 있습니다.

It’s also worth noting that care should be taken when using a namer to
preserve certain attributes in the filename which are used during rotation.
For example, @ref{1942,,RotatingFileHandler} expects to have a set of log files
whose names contain successive integers, so that rotation works as expected,
and @ref{1160,,TimedRotatingFileHandler} deletes old log files (based on the
@code{backupCount} parameter passed to the handler’s initializer) by determining
the oldest files to delete. For this to happen, the filenames should be
sortable using the date/time portion of the filename, and a namer needs to
respect this. (If a namer is wanted that doesn’t respect this scheme, it will
need to be used in a subclass of @code{TimedRotatingFileHandler} which
overrides the @ref{3209,,getFilesToDelete()} method to
fit in with the custom naming scheme.)
@end quotation
@end cartouche


Added in version 3.3.

@end deffn

@geindex rotator (logging.handlers.BaseRotatingHandler의 속성)
@anchor{library/logging handlers logging handlers BaseRotatingHandler rotator}@anchor{320a}
@deffn {속성} rotator

이 어트리뷰트가 콜러블로 설정되면, @ref{320b,,rotate()} 메서드는 이 콜러블에 위임합니다. 콜러블로 전달되는 매개 변수는 @code{rotate()}로 전달되는 것입니다.


Added in version 3.3.

@end deffn

@geindex rotation_filename() (logging.handlers.BaseRotatingHandler 메서드)
@anchor{library/logging handlers logging handlers BaseRotatingHandler rotation_filename}@anchor{3208}
@deffn {메서드} rotation_filename (default_name)

회전할 때 로그 파일의 파일명을 수정합니다.

사용자 정의 파일명을 제공할 수 있게 하려고 제공됩니다.

기본 구현은 처리기의 ‘namer’ 어트리뷰트를(콜러블이라면) 호출하는데, 기본 이름을 전달합니다. 어트리뷰트가 콜러블이 아니면 (기본값은 @code{None} 입니다), 이름은 변경되지 않고 반환됩니다.

@*매개변수: 
@code{default_name} – 로그 파일의 기본 이름.



Added in version 3.3.

@end deffn

@geindex rotate() (logging.handlers.BaseRotatingHandler 메서드)
@anchor{library/logging handlers logging handlers BaseRotatingHandler rotate}@anchor{320b}
@deffn {메서드} rotate (source, dest)

회전할 때, 현재 로그를 회전합니다.

기본 구현은 처리기의 ‘rotator’ 어트리뷰트를(콜러블이라면) 호출하는데, source와 dest 인자를 전달합니다. 어트리뷰트가 콜러블이 아니면 (기본값은 @code{None} 입니다), source를 dest 로 단순히 이름을 바꿉니다.

@*매개변수: 

@itemize *

@item 
@code{source} – 소스 파일명. 이것은 일반적으로 기본 파일명입니다, 예를 들어 ‘test.log’.

@item 
@code{dest} – 대상 파일명. 이것은 일반적으로 소스가 회전되는 곳입니다, 예를 들어 ‘test.log.1’.
@end itemize



Added in version 3.3.

@end deffn
@end deffn

어트리뷰트가 존재하는 이유는 서브 클래싱해야 할 필요를 줄이는 것입니다 - @ref{1942,,RotatingFileHandler}와 @ref{1160,,TimedRotatingFileHandler} 의 인스턴스에 같은 콜러블을 사용할 수 있습니다. namer 나 rotator 콜러블이 예외를 발생시키면, @code{emit()} 동안 발생하는 다른 예외와 같은 방식으로 처리됩니다, 즉 처리기의 @code{handleError()} 메서드를 통해.

회전 처리를 더 크게 변경해야 하면, 메서드를 재정의할 수 있습니다.

예는 @ref{320c,,rotator와 namer를 사용해서 로그 회전 처리하기}를 보십시오.

@node RotatingFileHandler,TimedRotatingFileHandler,BaseRotatingHandler,logging handlers — 로깅 처리기
@anchor{library/logging handlers rotating-file-handler}@anchor{320d}@anchor{library/logging handlers rotatingfilehandler}@anchor{320e}
@subsubsection RotatingFileHandler


The @ref{1942,,RotatingFileHandler} class, located in the @code{logging.handlers}
module, supports rotation of disk log files.

@geindex RotatingFileHandler (logging.handlers 클래스)
@anchor{library/logging handlers logging handlers RotatingFileHandler}@anchor{1942}
@deffn {클래스} logging.handlers.RotatingFileHandler (filename, mode='a', maxBytes=0, backupCount=0, encoding=None, delay=False, errors=None)

@ref{1942,,RotatingFileHandler} 클래스의 새로운 인스턴스를 반환합니다. 지정된 파일이 열리고 로깅을 위한 스트림으로 사용됩니다. `mode' 가 지정되지 않으면, @code{'a'} 가 사용됩니다. `encoding' 이 @code{None} 이 아니면, `encoding'을 사용하여 파일을 엽니다. `delay' 가 참이면, 파일 열기는 @ref{320f,,emit()}의 첫 번째 호출이 있을 때까지 연기됩니다. 기본적으로, 파일은 제한 없이 커집니다. `errors'가 제공되면, 인코딩 에러 처리 방법을 결정합니다.

미리 결정된 크기에서 파일을 `롤오버 (rollover)' 하기 위해 `maxBytes' 와 `backupCount' 값을 사용할 수 있습니다. 크기가 초과하려고 할 때, 파일이 닫히고 출력을 위해 새 파일이 조용히 열립니다. 롤오버는 현재 로그 파일이 거의 `maxBytes' 길이일 때마다 발생합니다; 그러나 `maxBytes' 나 `backupCount' 가 0이면 롤오버가 발생하지 않으므로, 일반적으로 `backupCount' 를 1 이상으로 설정하고, 0이 아닌 `maxBytes'를 사용하기를 원할 겁니다. `backupCount' 가 0이 아니면, 시스템은 파일명에 확장자 ‘.1’, ‘.2’ 등을 추가하여 지난 로그 파일을 저장합니다. 예를 들어, `backupCount' 가 5이고 기본 파일명이 @code{app.log} 면, @code{app.log}, @code{app.log.1}, @code{app.log.2}부터 @code{app.log.5} 까지의 파일을 얻게 됩니다. 기록되는 파일은 항상 @code{app.log} 입니다. 이 파일이 채워지면, 닫히고 @code{app.log.1} 로 이름이 변경됩니다, 그리고 파일 @code{app.log.1}, @code{app.log.2} 등이 존재하면, 이것들도 각기 @code{app.log.2}, @code{app.log.3} 등으로 이름이 변경됩니다.


버전 3.6에서 변경: 문자열 값뿐만 아니라, @ref{266,,Path} 객체도 `filename' 인자로 허용됩니다.



버전 3.9에서 변경: `errors' 매개 변수가 추가되었습니다.


@geindex doRollover() (logging.handlers.RotatingFileHandler 메서드)
@anchor{library/logging handlers logging handlers RotatingFileHandler doRollover}@anchor{3210}
@deffn {메서드} doRollover ()

위에서 설명한 대로 롤오버를 수행합니다.
@end deffn

@geindex emit() (logging.handlers.RotatingFileHandler 메서드)
@anchor{library/logging handlers logging handlers RotatingFileHandler emit}@anchor{320f}
@deffn {메서드} emit (record)

앞에서 설명한 대로 롤오버를 처리하면서, 파일에 레코드를 출력합니다.
@end deffn

@geindex shouldRollover() (logging.handlers.RotatingFileHandler 메서드)
@anchor{library/logging handlers logging handlers RotatingFileHandler shouldRollover}@anchor{3211}
@deffn {메서드} shouldRollover (record)

See if the supplied record would cause the file to exceed the configured size limit.
@end deffn
@end deffn

@node TimedRotatingFileHandler,SocketHandler,RotatingFileHandler,logging handlers — 로깅 처리기
@anchor{library/logging handlers timed-rotating-file-handler}@anchor{3212}@anchor{library/logging handlers timedrotatingfilehandler}@anchor{3213}
@subsubsection TimedRotatingFileHandler


The @ref{1160,,TimedRotatingFileHandler} class, located in the
@code{logging.handlers} module, supports rotation of disk log files at certain
timed intervals.

@geindex TimedRotatingFileHandler (logging.handlers 클래스)
@anchor{library/logging handlers logging handlers TimedRotatingFileHandler}@anchor{1160}
@deffn {클래스} logging.handlers.TimedRotatingFileHandler (filename, when='h', interval=1, backupCount=0, encoding=None, delay=False, utc=False, atTime=None, errors=None)

@ref{1160,,TimedRotatingFileHandler} 클래스의 새로운 인스턴스를 반환합니다. 지정된 파일이 열리고 로깅을 위한 스트림으로 사용됩니다. 회전 시 파일명 접미사도 설정합니다. `when' 과 `interval' 에 따라 회전이 일어납니다.

`when' 을 사용하여 `interval' 의 유형을 지정할 수 있습니다. 가능한 값의 목록은 아래와 같습니다. 대소 문자를 구분하지 않는다는 것에 유의하세요.


@multitable {xxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

값

@tab

interval의 유형

@tab

`atTime' 이 사용되는지와 사용되는 방식

@item

@code{'S'}

@tab

초

@tab

무시됩니다

@item

@code{'M'}

@tab

분

@tab

무시됩니다

@item

@code{'H'}

@tab

시간

@tab

무시됩니다

@item

@code{'D'}

@tab

일

@tab

무시됩니다

@item

@code{'W0'-'W6'}

@tab

요일 (0=월요일)

@tab

최초 롤오버 시간을 계산하는 데 사용됩니다

@item

@code{'midnight'}

@tab

`atTime' 을 지정하지 않으면 자정에, 그렇지 않으면 `atTime' 에 롤오버 합니다

@tab

최초 롤오버 시간을 계산하는 데 사용됩니다

@end multitable


요일 기반 회전을 사용할 때, 월요일은 ‘W0’, 화요일은 ‘W1’, 등등 일요일은 ‘W6’까지 지정하십시오. 이 경우, `interval' 에 전달된 값은 사용되지 않습니다.

시스템은 파일명에 확장자를 추가하여 지난 로그 파일을 저장합니다. 확장자는 날짜와 시간 기반이며, 롤오버 간격에 따라 strftime 형식 @code{%Y-%m-%d_%H-%M-%S} 이나 그 앞부분을 사용합니다.

다음 롤오버 시간을 처음 계산할 때 (처리기가 만들어질 때), 기존 로그 파일의 마지막 수정 시간 또는 (없으면) 현재 시각이 다음 회전이 발생할 때를 계산하는 데 사용됩니다.

`utc' 인자가 참이면, UTC 시간이 사용됩니다; 그렇지 않으면 현지 시간이 사용됩니다.

`backupCount' 가 0이 아니면, 최대 `backupCount' 개의 파일이 보관되고, 롤오버가 발생할 때 더 많은 파일이 생성되면 가장 오래된 파일이 삭제됩니다. 삭제 논리는 interval을 사용하여 삭제할 파일을 결정하므로, interval을 변경하면 오래된 파일이 남아있을 수 있습니다.

`delay' 가 참이면, 파일 열기는 @ref{3214,,emit()}에 대한 첫 번째 호출까지 지연됩니다.

`atTime' 이 @code{None} 이 아니면, 반드시 @code{datetime.time} 인스턴스여야 하는데, 롤오버가 “자정에” 또는 “특정 요일에” 발생하도록 설정된 경우에 롤오버가 발생하는 시간을 지정합니다. 이 경우, `atTime' 값은 `최초' 롤오버를 계산하는 데 사용되며, 이후 롤오버는 일반적인 간격 계산을 통해 계산됩니다.

`errors'가 지정되면, 인코딩 에러 처리 방법을 결정하는 데 사용됩니다.

@cartouche
@quotation 참고 
최초 롤오버 시간의 계산은 처리기가 초기화될 때 수행됩니다. 후속 롤오버 시간 계산은 롤오버가 발생하는 경우에만 수행되며, 롤오버는 출력을 내보낼 때만 발생합니다. 이것을 명심하지 않으면, 혼란이 생길 수 있습니다. 예를 들어, “매분” 간격을 설정하면, 이것이 항상 1분 간격의 (파일명을 갖는) 로그 파일들을 보게 된다는 것을 뜻하지는 않습니다; 응용 프로그램을 실행하는 동안, 로그 출력이 1분당 한 번보다 더 자주 `발생하면', 1분 간격의 로그 파일을 볼 것으로 예상할 수 있습니다. 반면, (가령) 로깅 메시지가 5분마다 한 번만 출력되면, 출력이 없는 (따라서 롤오버가 없는) 분에 해당하는 파일 시간의 틈이 생깁니다.
@end quotation
@end cartouche


버전 3.4에서 변경: `atTime' 매개 변수가 추가되었습니다.



버전 3.6에서 변경: 문자열 값뿐만 아니라, @ref{266,,Path} 객체도 `filename' 인자로 허용됩니다.



버전 3.9에서 변경: `errors' 매개 변수가 추가되었습니다.


@geindex doRollover() (logging.handlers.TimedRotatingFileHandler 메서드)
@anchor{library/logging handlers logging handlers TimedRotatingFileHandler doRollover}@anchor{3215}
@deffn {메서드} doRollover ()

위에서 설명한 대로 롤오버를 수행합니다.
@end deffn

@geindex emit() (logging.handlers.TimedRotatingFileHandler 메서드)
@anchor{library/logging handlers logging handlers TimedRotatingFileHandler emit}@anchor{3214}
@deffn {메서드} emit (record)

위에서 설명한 대로 롤오버를 처리하면서, 파일에 레코드를 출력합니다.
@end deffn

@geindex getFilesToDelete() (logging.handlers.TimedRotatingFileHandler 메서드)
@anchor{library/logging handlers logging handlers TimedRotatingFileHandler getFilesToDelete}@anchor{3209}
@deffn {메서드} getFilesToDelete ()

Returns a list of filenames which should be deleted as part of rollover. These
are the absolute paths of the oldest backup log files written by the handler.
@end deffn

@geindex shouldRollover() (logging.handlers.TimedRotatingFileHandler 메서드)
@anchor{library/logging handlers logging handlers TimedRotatingFileHandler shouldRollover}@anchor{3216}
@deffn {메서드} shouldRollover (record)

See if enough time has passed for a rollover to occur and if it has, compute
the next rollover time.
@end deffn
@end deffn

@node SocketHandler,DatagramHandler,TimedRotatingFileHandler,logging handlers — 로깅 처리기
@anchor{library/logging handlers socket-handler}@anchor{3217}@anchor{library/logging handlers sockethandler}@anchor{3218}
@subsubsection SocketHandler


The @ref{1161,,SocketHandler} class, located in the @code{logging.handlers} module,
sends logging output to a network socket. The base class uses a TCP socket.

@geindex SocketHandler (logging.handlers 클래스)
@anchor{library/logging handlers logging handlers SocketHandler}@anchor{1161}
@deffn {클래스} logging.handlers.SocketHandler (host, port)

`host' 와 `port'로 주어진 주소의 원격 기계와 통신하기 위한, @ref{1161,,SocketHandler} 클래스의 새로운 인스턴스를 반환합니다.


버전 3.4에서 변경: @code{port}가 @code{None}으로 지정되면, @code{host}의 값을 사용하여 유닉스 도메인 소켓이 만들어집니다 - 그렇지 않으면 TCP 소켓이 만들어집니다.


@geindex close() (logging.handlers.SocketHandler 메서드)
@anchor{library/logging handlers logging handlers SocketHandler close}@anchor{3219}
@deffn {메서드} close ()

소켓을 닫습니다.
@end deffn

@geindex emit() (logging.handlers.SocketHandler 메서드)
@anchor{library/logging handlers logging handlers SocketHandler emit}@anchor{321a}
@deffn {메서드} emit ()

레코드의 어트리뷰트 딕셔너리를 피클하고 바이너리 형식으로 소켓에 씁니다. 소켓에 에러가 있으면 조용히 패킷을 버립니다. 이전에 연결이 끊어졌으면, 연결을 다시 맺습니다. 수신 단에서 레코드를 @ref{11e5,,LogRecord}로 역 피클 하려면, @ref{31b2,,makeLogRecord()} 함수를 사용하십시오.
@end deffn

@geindex handleError() (logging.handlers.SocketHandler 메서드)
@anchor{library/logging handlers logging handlers SocketHandler handleError}@anchor{321b}
@deffn {메서드} handleError ()

@ref{321a,,emit()} 중에 발생한 에러를 처리합니다. 가장 큰 원인은 연결이 끊어지는 것입니다. 다음 이벤트에서 다시 시도할 수 있도록 소켓을 닫습니다.
@end deffn

@geindex makeSocket() (logging.handlers.SocketHandler 메서드)
@anchor{library/logging handlers logging handlers SocketHandler makeSocket}@anchor{321c}
@deffn {메서드} makeSocket ()

이것은 서브 클래스가 원하는 소켓의 정확한 유형을 정의 할 수 있게 하는 팩토리 메서드입니다. 기본 구현은 TCP 소켓(@ref{14f8,,socket.SOCK_STREAM})을 만듭니다.
@end deffn

@geindex makePickle() (logging.handlers.SocketHandler 메서드)
@anchor{library/logging handlers logging handlers SocketHandler makePickle}@anchor{321d}
@deffn {메서드} makePickle (record)

레코드의 어트리뷰트 딕셔너리를 바이너리 형식으로 피클하고 길이를 앞에 붙여서, 소켓을 통해 전송할 준비가 된 상태로 반환합니다. 이 연산의 세부 사항은 다음과 동등합니다:

@example
data = pickle.dumps(record_attr_dict, 1)
datalen = struct.pack('>L', len(data))
return datalen + data
@end example

피클은 완전히 안전하지 않습니다. 보안이 염려되면, 이 메서드를 재정의하여 더욱 안전한 메커니즘을 구현할 수 있습니다. 예를 들어, HMAC를 사용하여 피클에 서명한 다음 수신 단에서 확인하거나, 수신 단에서 전역 객체의 역 피클링을 비활성화할 수 있습니다.
@end deffn

@geindex send() (logging.handlers.SocketHandler 메서드)
@anchor{library/logging handlers logging handlers SocketHandler send}@anchor{321e}
@deffn {메서드} send (packet)

피클 된 바이트열 `packet' 을 소켓으로 보냅니다. 보내진 바이트열의 형식은 @ref{321d,,makePickle()}의 설명서에 있습니다.

이 함수는 네트워크가 붐빌 때 발생할 수 있는 부분 전송을 허용합니다.
@end deffn

@geindex createSocket() (logging.handlers.SocketHandler 메서드)
@anchor{library/logging handlers logging handlers SocketHandler createSocket}@anchor{86c}
@deffn {메서드} createSocket ()

소켓을 만들려고 합니다; 실패 시, 지수 백 오프 알고리즘을 사용합니다. 최초 실패 시 처리기는 보내려는 메시지를 버립니다. 후속 메시지가 같은 인스턴스에 의해 처리될 때, 일정한 시간이 지날 때까지 연결을 시도하지 않습니다. 기본 파라미터를 쓸 때, 최초 지연은 1초이고, 지연 후에도 연결을 만들 수 없으면, 처리기가 최대 30초가 될 때까지 매번 지연 시간을 두 배로 늘립니다.

이 동작은 다음 처리기 어트리뷰트에 의해 제어됩니다:


@itemize *

@item 
@code{retryStart} (최초 지연, 기본값은 1.0 초).

@item 
@code{retryFactor} (배율, 기본값은 2.0).

@item 
@code{retryMax} (최대 지연, 기본값은 30.0 초).
@end itemize

이것은, 처리기가 사용된 `후에' 원격 수신기가 시작되면, 메시지가 손실될 수 있음을 뜻합니다 (처리기가 지연이 경과 할 때까지 연결을 시도하지조차 않고, 지연 기간에 메시지를 조용히 버리기 때문입니다).
@end deffn
@end deffn

@node DatagramHandler,SysLogHandler,SocketHandler,logging handlers — 로깅 처리기
@anchor{library/logging handlers datagram-handler}@anchor{321f}@anchor{library/logging handlers datagramhandler}@anchor{3220}
@subsubsection DatagramHandler


The @ref{1162,,DatagramHandler} class, located in the @code{logging.handlers}
module, inherits from @ref{1161,,SocketHandler} to support sending logging messages
over UDP sockets.

@geindex DatagramHandler (logging.handlers 클래스)
@anchor{library/logging handlers logging handlers DatagramHandler}@anchor{1162}
@deffn {클래스} logging.handlers.DatagramHandler (host, port)

`host' 와 `port'로 주어진 주소의 원격 기계와 통신하기 위한, @ref{1162,,DatagramHandler} 클래스의 새로운 인스턴스를 반환합니다.

@cartouche
@quotation 참고 
As UDP is not a streaming protocol, there is no persistent connection
between an instance of this handler and `host'. For this reason, when using a
network socket, a DNS lookup might have to be made each time an event is
logged, which can introduce some latency into the system. If this affects you,
you can do a lookup yourself and initialize this handler using the looked-up IP
address rather than the hostname.
@end quotation
@end cartouche


버전 3.4에서 변경: @code{port}가 @code{None}으로 지정되면, @code{host}의 값을 사용하여 유닉스 도메인 소켓이 만들어집니다 - 그렇지 않으면 UDP 소켓이 만들어집니다.


@geindex emit() (logging.handlers.DatagramHandler 메서드)
@anchor{library/logging handlers logging handlers DatagramHandler emit}@anchor{3221}
@deffn {메서드} emit ()

레코드의 어트리뷰트 딕셔너리를 피클하고 바이너리 형식으로 소켓에 씁니다. 소켓에 에러가 있으면 조용히 패킷을 버립니다. 수신 단에서 레코드를 @ref{11e5,,LogRecord}로 역 피클 하려면, @ref{31b2,,makeLogRecord()} 함수를 사용하십시오.
@end deffn

@geindex makeSocket() (logging.handlers.DatagramHandler 메서드)
@anchor{library/logging handlers logging handlers DatagramHandler makeSocket}@anchor{3222}
@deffn {메서드} makeSocket ()

UDP 소켓(@ref{14f7,,socket.SOCK_DGRAM})을 만들기 위해 @ref{1161,,SocketHandler}의 팩토리 메서드가 여기에서 재정의되었습니다.
@end deffn

@geindex send() (logging.handlers.DatagramHandler 메서드)
@anchor{library/logging handlers logging handlers DatagramHandler send}@anchor{3223}
@deffn {메서드} send (s)

피클 된 바이트열을 소켓으로 보냅니다. 보낸 바이트열의 형식은 @ref{321d,,SocketHandler.makePickle()} 설명서에 있습니다.
@end deffn
@end deffn

@node SysLogHandler,NTEventLogHandler,DatagramHandler,logging handlers — 로깅 처리기
@anchor{library/logging handlers syslog-handler}@anchor{3224}@anchor{library/logging handlers sysloghandler}@anchor{3225}
@subsubsection SysLogHandler


The @ref{86b,,SysLogHandler} class, located in the @code{logging.handlers} module,
supports sending logging messages to a remote or local Unix syslog.

@geindex SysLogHandler (logging.handlers 클래스)
@anchor{library/logging handlers logging handlers SysLogHandler}@anchor{86b}
@deffn {클래스} logging.handlers.SysLogHandler (address=('localhost', SYSLOG_UDP_PORT), facility=LOG_USER, socktype=socket.SOCK_DGRAM, timeout=None)

Returns a new instance of the @code{SysLogHandler} class intended to
communicate with a remote Unix machine whose address is given by `address' in
the form of a @code{(host, port)} tuple.  If `address' is not specified,
@code{('localhost', 514)} is used.  The address is used to open a socket.  An
alternative to providing a @code{(host, port)} tuple is providing an address as a
string, for example ‘/dev/log’. In this case, a Unix domain socket is used to
send the message to the syslog. If `facility' is not specified,
@code{LOG_USER} is used. The type of socket opened depends on the
`socktype' argument, which defaults to @ref{14f7,,socket.SOCK_DGRAM} and thus
opens a UDP socket. To open a TCP socket (for use with the newer syslog
daemons such as rsyslog), specify a value of @ref{14f8,,socket.SOCK_STREAM}.
If `timeout' is specified, it sets a timeout (in seconds) for the socket operations.
This can help prevent the program from hanging indefinitely if the syslog server is
unreachable. By default, `timeout' is @code{None}, meaning no timeout is applied.

서버가 UDP 포트 514에서 수신을 기다리지 않으면, @ref{86b,,SysLogHandler}가 작동하지 않는 것처럼 보일 수 있습니다. 이 경우, 도메인 소켓에 대해 사용해야 하는 주소를 확인하십시오 - 이는 시스템에 따라 다릅니다. 예를 들어 리눅스에서는 보통 ‘/dev/log’ 이지만 OS/X에서는 ‘/var/run/syslog’ 입니다. 플랫폼을 확인하고 적절한 주소를 사용해야 합니다 (응용 프로그램을 여러 플랫폼에서 실행해야 하는 경우 실행 시간에 검사를 수행해야 할 수도 있습니다). 윈도우에서는, UDP 옵션을 사용해야 합니다.

@cartouche
@quotation 참고 
On macOS 12.x (Monterey), Apple has changed the behaviour of their
syslog daemon - it no longer listens on a domain socket. Therefore, you cannot
expect @code{SysLogHandler} to work on this system.

See gh-91070@footnote{https://github.com/python/cpython/issues/91070} for more information.
@end quotation
@end cartouche


버전 3.2에서 변경: `socktype' 이 추가되었습니다.



버전 3.14에서 변경: `timeout' was added.


@geindex close() (logging.handlers.SysLogHandler 메서드)
@anchor{library/logging handlers logging handlers SysLogHandler close}@anchor{3226}
@deffn {메서드} close ()

원격 호스트로의 소켓을 닫습니다.
@end deffn

@geindex createSocket() (logging.handlers.SysLogHandler 메서드)
@anchor{library/logging handlers logging handlers SysLogHandler createSocket}@anchor{86a}
@deffn {메서드} createSocket ()

Tries to create a socket and, if it’s not a datagram socket, connect it
to the other end. This method is called during handler initialization,
but it’s not regarded as an error if the other end isn’t listening at
this point - the method will be called again when emitting an event, if
there is no socket at that point.


Added in version 3.11.

@end deffn

@geindex emit() (logging.handlers.SysLogHandler 메서드)
@anchor{library/logging handlers logging handlers SysLogHandler emit}@anchor{3227}
@deffn {메서드} emit (record)

레코드가 포맷된 다음, syslog 서버로 전송됩니다. 예외 정보가 있으면, 서버로 보내 지지 `않습니다'.


버전 3.2.1에서 변경: (bpo-12168@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12168}를 보세요.) 이전 버전에서, syslog 데몬으로 보낸 메시지는 NUL 바이트로 항상 종료되었는데, 이전 버전의 데몬에서 관련 사양(
@geindex RFC; RFC 5424
RFC 5424@footnote{https://datatracker.ietf.org/doc/html/rfc5424.html})에 없는데도 불구하고 NUL 종료 메시지를 요구했기 때문입니다. 최신 버전의 데몬은 NUL 바이트를 기대하지는 않지만, 있는 경우 이를 제거하고, 더 최근의 (RFC 5424와 더 가깝게 일치하는) 데몬은 NUL 바이트를 메시지 일부로 전달합니다.

이러한 모든 다른 데몬 동작에 직면하여 syslog 메시지를 더욱 쉽게 처리할 수 있도록, NUL 바이트를 추가하는 작업은 클래스 수준 어트리뷰트 @code{append_nul}을 사용하여 구성할 수 있게 만들었습니다. 기본값은 @code{True}(기존 동작 유지)이지만, 특정 인스턴스가 NUL 종결자를 추가하지 `않도록' @code{SysLogHandler} 인스턴스에서 @code{False}로 설정할 수 있습니다.



버전 3.3에서 변경: (bpo-12419@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12419}를 보세요.) 이전 버전에서는, 메시지 소스를 식별하는 “ident” 나 “tag” 접두사를 위한 기능이 없었습니다. 이제는 클래스 수준의 어트리뷰트를 사용하여 지정할 수 있습니다, @code{""}을 기본값으로 사용하여 기존 동작을 유지하지만, @code{SysLogHandler} 인스턴스에서 재정의하여 해당 인스턴스가 처리하는 모든 메시지에 ident를 추가하도록 할 수 있습니다. 제공된 ident는 바이트열이 아닌 텍스트여야 하며 그대로 메시지 앞에 추가됩니다.

@end deffn

@geindex encodePriority() (logging.handlers.SysLogHandler 메서드)
@anchor{library/logging handlers logging handlers SysLogHandler encodePriority}@anchor{3228}
@deffn {메서드} encodePriority (facility, priority)

시설(facility)과 우선순위를 정수로 인코딩합니다. 문자열이나 정수를 전달할 수 있습니다 - 문자열이 전달되면, 내부 매핑 딕셔너리를 사용하여 정수로 변환합니다.

@code{LOG_} 기호 값은 @ref{86b,,SysLogHandler}에 정의되고 @code{sys/syslog.h} 헤더 파일에 정의된 값을 그대로 옮깁니다.

`우선순위'


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxx} 
@headitem

이름 (문자열)

@tab

기호 값

@item

@code{alert}

@tab

LOG_ALERT

@item

@code{crit} 또는 @code{critical}

@tab

LOG_CRIT

@item

@code{debug}

@tab

LOG_DEBUG

@item

@code{emerg} 또는 @code{panic}

@tab

LOG_EMERG

@item

@code{err} 또는 @code{error}

@tab

LOG_ERR

@item

@code{info}

@tab

LOG_INFO

@item

@code{notice}

@tab

LOG_NOTICE

@item

@code{warn} 또는 @code{warning}

@tab

LOG_WARNING

@end multitable


`시설'


@multitable {xxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxx} 
@headitem

이름 (문자열)

@tab

기호 값

@item

@code{auth}

@tab

LOG_AUTH

@item

@code{authpriv}

@tab

LOG_AUTHPRIV

@item

@code{cron}

@tab

LOG_CRON

@item

@code{daemon}

@tab

LOG_DAEMON

@item

@code{ftp}

@tab

LOG_FTP

@item

@code{kern}

@tab

LOG_KERN

@item

@code{lpr}

@tab

LOG_LPR

@item

@code{mail}

@tab

LOG_MAIL

@item

@code{news}

@tab

LOG_NEWS

@item

@code{syslog}

@tab

LOG_SYSLOG

@item

@code{user}

@tab

LOG_USER

@item

@code{uucp}

@tab

LOG_UUCP

@item

@code{local0}

@tab

LOG_LOCAL0

@item

@code{local1}

@tab

LOG_LOCAL1

@item

@code{local2}

@tab

LOG_LOCAL2

@item

@code{local3}

@tab

LOG_LOCAL3

@item

@code{local4}

@tab

LOG_LOCAL4

@item

@code{local5}

@tab

LOG_LOCAL5

@item

@code{local6}

@tab

LOG_LOCAL6

@item

@code{local7}

@tab

LOG_LOCAL7

@end multitable

@end deffn

@geindex mapPriority() (logging.handlers.SysLogHandler 메서드)
@anchor{library/logging handlers logging handlers SysLogHandler mapPriority}@anchor{3229}
@deffn {메서드} mapPriority (levelname)

로깅 수준 이름을 syslog 우선순위 이름으로 매핑합니다. 사용자 정의 수준을 사용하거나 기본 알고리즘이 여러분의 요구에 적합하지 않으면, 이 값을 재정의해야 할 수 있습니다. 기본 알고리즘은 @code{DEBUG}, @code{INFO}, @code{WARNING}, @code{ERROR} 및 @code{CRITICAL}을 동등한 syslog 이름으로 매핑하고, 다른 모든 수준 이름은 ‘warning’으로 매핑합니다.
@end deffn
@end deffn

@node NTEventLogHandler,SMTPHandler,SysLogHandler,logging handlers — 로깅 처리기
@anchor{library/logging handlers nt-eventlog-handler}@anchor{322a}@anchor{library/logging handlers nteventloghandler}@anchor{322b}
@subsubsection NTEventLogHandler


The @ref{322c,,NTEventLogHandler} class, located in the @code{logging.handlers}
module, supports sending logging messages to a local Windows NT, Windows 2000 or
Windows XP event log. Before you can use it, you need Mark Hammond’s Win32
extensions for Python installed.

@geindex NTEventLogHandler (logging.handlers 클래스)
@anchor{library/logging handlers logging handlers NTEventLogHandler}@anchor{322c}
@deffn {클래스} logging.handlers.NTEventLogHandler (appname, dllname=None, logtype='Application')

@ref{322c,,NTEventLogHandler} 클래스의 새 인스턴스를 반환합니다. `appname' 은 이벤트 로그에 나타나는 응용 프로그램 이름을 정의하는 데 사용됩니다. 이 이름을 사용하여 적절한 레지스트리 항목이 만들어집니다. `dllname' 은 로그에 보관할 메시지 정의를 포함하는 .dll 또는 .exe의 완전히 정규화된 경로명을 제공해야 합니다 (지정되지 않으면, @code{'win32service.pyd'}이 사용됩니다 - 이것은 Win32 확장과 함께 설치되며 몇 가지 기본 자리 표시자 메시지 정의를 포함합니다. 이 자리 표시자를 사용하면 전체 메시지 소스가 로그에 보관되므로 이벤트 로그가 커진다는 것에 유의하십시오. 간략한 로그를 원하면, 이벤트 로그에서 사용할 원하는 메시지 정의가 포함된 .dll 또는 .exe의 이름을 전달해야 합니다). `logtype' 은 @code{'Application'}, @code{'System'} 또는 @code{'Security'} 중 하나이며, 기본값은 @code{'Application'}입니다.

@geindex close() (logging.handlers.NTEventLogHandler 메서드)
@anchor{library/logging handlers logging handlers NTEventLogHandler close}@anchor{322d}
@deffn {메서드} close ()

이 시점에서, 이벤트 로그 항목의 소스로서의 응용 프로그램 이름을 레지스트리에서 제거할 수 있습니다. 그러나, 이렇게 하면, 이벤트 로그 뷰어에서 의도한 대로 이벤트를 볼 수 없게 됩니다 - 이벤트 로그 뷰어는 .dll 이름을 가져오기 위해 레지스트리에 액세스할 수 있어야 합니다. 현재 버전은 그렇게 하지 않습니다.
@end deffn

@geindex emit() (logging.handlers.NTEventLogHandler 메서드)
@anchor{library/logging handlers logging handlers NTEventLogHandler emit}@anchor{322e}
@deffn {메서드} emit (record)

메시지 ID, 이벤트 범주 및 이벤트 유형을 결정한 다음, 메시지를 NT 이벤트 로그에 기록합니다.
@end deffn

@geindex getEventCategory() (logging.handlers.NTEventLogHandler 메서드)
@anchor{library/logging handlers logging handlers NTEventLogHandler getEventCategory}@anchor{322f}
@deffn {메서드} getEventCategory (record)

레코드의 이벤트 범주를 반환합니다. 여러분 자신의 범주를 지정하려면, 이것을 재정의하십시오. 이 버전은 0을 반환합니다.
@end deffn

@geindex getEventType() (logging.handlers.NTEventLogHandler 메서드)
@anchor{library/logging handlers logging handlers NTEventLogHandler getEventType}@anchor{3230}
@deffn {메서드} getEventType (record)

레코드의 이벤트 유형을 반환합니다. 여러분 자신의 유형을 지정하려면, 이것을 재정의하십시오. 이 버전은 처리기의 typemap 어트리뷰트를 사용하여 매핑하는데, @code{__init__()}에서 @code{DEBUG}, @code{INFO}, @code{WARNING}, @code{ERROR} 및 @code{CRITICAL}에 대한 매핑이 포함된 딕셔너리로 설정됩니다. 여러분 자신의 수준을 사용한다면, 이 메서드를 재정의하거나 처리기의 `typemap' 어트리뷰트에 적절한 딕셔너리를 배치해야 합니다.
@end deffn

@geindex getMessageID() (logging.handlers.NTEventLogHandler 메서드)
@anchor{library/logging handlers logging handlers NTEventLogHandler getMessageID}@anchor{3231}
@deffn {메서드} getMessageID (record)

레코드의 메시지 ID를 반환합니다. 여러분 자신의 메시지를 사용한다면, 로거에 전달된 `msg'를 포맷 문자열이 아닌 ID로 사용할 수 있습니다. 그런 다음 여기에서 딕셔너리 조회를 사용하여 메시지 ID를 가져올 수 있습니다. 이 버전은 @code{win32service.pyd}의 기본 메시지 ID인 1을 반환합니다.
@end deffn
@end deffn

@node SMTPHandler,MemoryHandler,NTEventLogHandler,logging handlers — 로깅 처리기
@anchor{library/logging handlers smtp-handler}@anchor{3232}@anchor{library/logging handlers smtphandler}@anchor{3233}
@subsubsection SMTPHandler


The @ref{18b3,,SMTPHandler} class, located in the @code{logging.handlers} module,
supports sending logging messages to an email address via SMTP.

@geindex SMTPHandler (logging.handlers 클래스)
@anchor{library/logging handlers logging handlers SMTPHandler}@anchor{18b3}
@deffn {클래스} logging.handlers.SMTPHandler (mailhost, fromaddr, toaddrs, subject, credentials=None, secure=None, timeout=1.0)

@ref{18b3,,SMTPHandler} 클래스의 새 인스턴스를 반환합니다. 인스턴스는 전자 메일의 보내는 주소, 받는 주소와 제목 줄을 사용하여 초기화됩니다. `toaddrs' 는 문자열 리스트여야 합니다. 비표준 SMTP 포트를 지정하려면, `mailhost' 인자에 (host, port) 튜플 형식을 사용하십시오. 문자열을 사용하면 표준 SMTP 포트가 사용됩니다. SMTP 서버가 인증을 요구하면, `credentials' 인자에 (username, password) 튜플을 지정할 수 있습니다.

보안 프로토콜(TLS)의 사용을 지정하려면, `secure' 인자에 튜플을 전달하십시오. 이것은 인증 자격 증명(credentials)이 제공될 때만 사용됩니다. 튜플은 빈 튜플이거나, 키 파일 이름을 가진 단일 값 튜플이거나, 키 파일과 인증서 파일의 이름을 가진 2-튜플이어야 합니다. (이 튜플은 @ref{133d,,smtplib.SMTP.starttls()} 메서드에 전달됩니다.)

`timeout' 인자를 사용하여 SMTP 서버와의 통신에 시간제한을 지정할 수 있습니다.


버전 3.3에서 변경: `timeout' 매개 변수가 추가되었습니다.


@geindex emit() (logging.handlers.SMTPHandler 메서드)
@anchor{library/logging handlers logging handlers SMTPHandler emit}@anchor{3234}
@deffn {메서드} emit (record)

레코드를 포맷하고 지정된 주소로 보냅니다.
@end deffn

@geindex getSubject() (logging.handlers.SMTPHandler 메서드)
@anchor{library/logging handlers logging handlers SMTPHandler getSubject}@anchor{3235}
@deffn {메서드} getSubject (record)

레코드에 종속적인 제목 줄을 지정하려면, 이 메서드를 재정의하십시오.
@end deffn
@end deffn

@node MemoryHandler,HTTPHandler,SMTPHandler,logging handlers — 로깅 처리기
@anchor{library/logging handlers memory-handler}@anchor{3236}@anchor{library/logging handlers memoryhandler}@anchor{3237}
@subsubsection MemoryHandler


The @ref{31e5,,MemoryHandler} class, located in the @code{logging.handlers} module,
supports buffering of logging records in memory, periodically flushing them to a
`target' handler. Flushing occurs whenever the buffer is full, or when an
event of a certain severity or greater is seen.

@ref{31e5,,MemoryHandler}는 추상 클래스이면서, 더 일반적인 @ref{3238,,BufferingHandler}의 서브 클래스입니다. 이것은 레코드 로깅을 메모리에 버퍼링합니다. 각 레코드가 버퍼에 추가될 때마다, @code{shouldFlush()}를 호출하여 버퍼를 플러시 할지 확인합니다. 필요하면, @code{flush()}가 플러시를 수행할 것으로 기대합니다.

@geindex BufferingHandler (logging.handlers 클래스)
@anchor{library/logging handlers logging handlers BufferingHandler}@anchor{3238}
@deffn {클래스} logging.handlers.BufferingHandler (capacity)

지정된 용량(capacity)의 버퍼로 처리기를 초기화합니다. 여기서 `capacity'는 버퍼링 된 로깅 레코드 수를 의미합니다.

@geindex emit() (logging.handlers.BufferingHandler 메서드)
@anchor{library/logging handlers logging handlers BufferingHandler emit}@anchor{3239}
@deffn {메서드} emit (record)

레코드를 버퍼에 추가합니다. @ref{323a,,shouldFlush()}가 참을 반환하면 @ref{323b,,flush()}를 호출하여 버퍼를 처리합니다.
@end deffn

@geindex flush() (logging.handlers.BufferingHandler 메서드)
@anchor{library/logging handlers logging handlers BufferingHandler flush}@anchor{323b}
@deffn {메서드} flush ()

For a @code{BufferingHandler} instance, flushing means that it sets the
buffer to an empty list. This method can be overwritten to implement more useful
flushing behavior.
@end deffn

@geindex shouldFlush() (logging.handlers.BufferingHandler 메서드)
@anchor{library/logging handlers logging handlers BufferingHandler shouldFlush}@anchor{323a}
@deffn {메서드} shouldFlush (record)

버퍼의 용량이 찼으면 @code{True}를 반환합니다. 이 메서드는 사용자 정의 플러시 전략을 구현하기 위해 재정의될 수 있습니다.
@end deffn
@end deffn

@geindex MemoryHandler (logging.handlers 클래스)
@anchor{library/logging handlers logging handlers MemoryHandler}@anchor{31e5}
@deffn {클래스} logging.handlers.MemoryHandler (capacity, flushLevel=ERROR, target=None, flushOnClose=True)

@ref{31e5,,MemoryHandler} 클래스의 새 인스턴스를 반환합니다. 인스턴스는 `capacity'(버퍼 된 레코드 수)의 버퍼 크기로 초기화됩니다. `flushLevel'을 지정하지 않으면, @code{ERROR}가 사용됩니다. `target' 이 지정되지 않으면, 이 처리기가 유용한 것을 하기 전에, @ref{323c,,setTarget()}를 사용해 대상을 설정할 필요가 있습니다. `flushOnClose' 가 @code{False}로 지정되면, 처리기가 닫힐 때 버퍼가 플러시 되지 `않습니다'. 지정되지 않거나 @code{True}로 지정되면, 처리기가 닫힐 때 버퍼를 플러시 하는 이전 동작이 발생합니다.


버전 3.6에서 변경: `flushOnClose' 매개 변수가 추가되었습니다.


@geindex close() (logging.handlers.MemoryHandler 메서드)
@anchor{library/logging handlers logging handlers MemoryHandler close}@anchor{323d}
@deffn {메서드} close ()

@ref{323e,,flush()}를 호출하고, 대상(target)을 @code{None}으로 설정하고, 버퍼를 비웁니다.
@end deffn

@geindex flush() (logging.handlers.MemoryHandler 메서드)
@anchor{library/logging handlers logging handlers MemoryHandler flush}@anchor{323e}
@deffn {메서드} flush ()

@ref{31e5,,MemoryHandler} 인스턴스의 경우, 플러시는 버퍼링 된 레코드가 있다면 대상으로 보내는 것을 뜻합니다. 버퍼링된 레코드가 대상에 전송될 때 버퍼도 지워집니다. 다른 행동을 원하면 재정의하십시오.
@end deffn

@geindex setTarget() (logging.handlers.MemoryHandler 메서드)
@anchor{library/logging handlers logging handlers MemoryHandler setTarget}@anchor{323c}
@deffn {메서드} setTarget (target)

이 처리기의 대상 처리기를 설정합니다.
@end deffn

@geindex shouldFlush() (logging.handlers.MemoryHandler 메서드)
@anchor{library/logging handlers logging handlers MemoryHandler shouldFlush}@anchor{323f}
@deffn {메서드} shouldFlush (record)

버퍼 가득 참이나 레코드가 `flushLevel' 이상을 만드는지 확인합니다.
@end deffn
@end deffn

@node HTTPHandler,QueueHandler,MemoryHandler,logging handlers — 로깅 처리기
@anchor{library/logging handlers http-handler}@anchor{3240}@anchor{library/logging handlers httphandler}@anchor{3241}
@subsubsection HTTPHandler


The @ref{102b,,HTTPHandler} class, located in the @code{logging.handlers} module,
supports sending logging messages to a web server, using either @code{GET} or
@code{POST} semantics.

@geindex HTTPHandler (logging.handlers 클래스)
@anchor{library/logging handlers logging handlers HTTPHandler}@anchor{102b}
@deffn {클래스} logging.handlers.HTTPHandler (host, url, method='GET', secure=False, credentials=None, context=None)

@ref{102b,,HTTPHandler} 클래스의 새 인스턴스를 반환합니다. `host' 는 특정 포트 번호를 사용해야 하면 @code{host:port} 형식일 수 있습니다. `method' 를 지정하지 않으면 @code{GET}이 사용됩니다. `secure' 가 참이면, HTTPS 연결이 사용됩니다. `context' 매개 변수는 @ref{357,,ssl.SSLContext} 인스턴스로 설정되어, HTTPS 연결에 사용되는 SSL 설정을 구성할 수 있습니다. `credentials' 가 지정되면, 기본 인증을 사용하여 HTTP ‘Authorization’ 헤더에 배치되는 사용자 ID와 암호로 구성된 2-튜플이어야 합니다. credentials를 지정하면, 사용자 ID와 암호가 단순 텍스트로 전달되지 않도록 secure=True를 지정해야 합니다.


버전 3.5에서 변경: `context' 매개 변수가 추가되었습니다.


@geindex mapLogRecord() (logging.handlers.HTTPHandler 메서드)
@anchor{library/logging handlers logging handlers HTTPHandler mapLogRecord}@anchor{3242}
@deffn {메서드} mapLogRecord (record)

URL 인코딩되어 웹 서버로 전송되는, @code{record}에 기반한 딕셔너리를 제공합니다. 기본 구현은 @code{record.__dict__}를 반환합니다. 이 메서드는 재정의할 수 있는데, 예를 들어 @ref{11e5,,LogRecord}의 일부만 웹 서버로 보내지거나, 서버로 보내는 내용에 대한 보다 구체적인 사용자 정의가 필요한 경우입니다.
@end deffn

@geindex emit() (logging.handlers.HTTPHandler 메서드)
@anchor{library/logging handlers logging handlers HTTPHandler emit}@anchor{3243}
@deffn {메서드} emit (record)

URL 인코딩된 딕셔너리로 웹 서버에 레코드를 보냅니다. @ref{3242,,mapLogRecord()} 메서드가 레코드를 전송할 딕셔너리로 변환하는 데 사용됩니다.
@end deffn

@cartouche
@quotation 참고 
웹 서버로 보내기 위해 레코드를 준비하는 것은, 일반 포매팅 연산과 같지 않으므로, @ref{3196,,setFormatter()}를 사용해서 @ref{102b,,HTTPHandler}의 @ref{169c,,Formatter}를 지정하는 것은 효과가 없습니다. @ref{319f,,format()}을 호출하는 대신, 이 처리기는 @ref{3242,,mapLogRecord()}를 호출한 다음, @ref{1094,,urllib.parse.urlencode()}를 호출하여 웹 서버로 보내기에 적합한 형식으로 딕셔너리를 인코딩합니다.
@end quotation
@end cartouche
@end deffn

@node QueueHandler,QueueListener,HTTPHandler,logging handlers — 로깅 처리기
@anchor{library/logging handlers queue-handler}@anchor{3244}@anchor{library/logging handlers queuehandler}@anchor{3245}
@subsubsection QueueHandler



Added in version 3.2.


The @ref{1b5f,,QueueHandler} class, located in the @code{logging.handlers} module,
supports sending logging messages to a queue, such as those implemented in the
@ref{bb,,queue} or @ref{98,,multiprocessing} modules.

@ref{242,,QueueListener} 클래스와 함께, @ref{1b5f,,QueueHandler}를 사용하여 처리기가 로깅을 수행하는 스레드와 다른 스레드에서 작업을 수행하도록 할 수 있습니다. 이는 클라이언트를 처리하는 스레드가 가능한 한 신속하게 응답하고, 느린 작업(가령 @ref{18b3,,SMTPHandler}를 통해 전자 메일 보내기)은 별도의 스레드에서 수행되어야 하는 웹 응용 프로그램과 다른 서비스 응용 프로그램에서 중요합니다.

@geindex QueueHandler (logging.handlers 클래스)
@anchor{library/logging handlers logging handlers QueueHandler}@anchor{1b5f}
@deffn {클래스} logging.handlers.QueueHandler (queue)

@ref{1b5f,,QueueHandler} 클래스의 새 인스턴스를 반환합니다. 인스턴스는 메시지를 보낼 큐로 초기화됩니다. `queue'는 임의의 큐류(queue-like) 객체일 수 있습니다; 메시지를 보내는 방법을 알아야 하는 @ref{3246,,enqueue()} 메서드가 있는 그대로 사용합니다. 큐는 작업 추적 API를 갖도록 `요구되지' 않아서, `queue'에 @ref{d60,,SimpleQueue} 인스턴스를 사용할 수 있습니다.

@cartouche
@quotation 참고 
If you are using @ref{98,,multiprocessing}, you should avoid using
@ref{d60,,SimpleQueue} and instead use @ref{1b87,,multiprocessing.Queue}.
@end quotation
@end cartouche

@cartouche
@quotation 경고 
The @ref{98,,multiprocessing} module uses an internal logger created and
accessed via @ref{3247,,get_logger()}.
@ref{1b87,,multiprocessing.Queue} will log @code{DEBUG} level messages upon
items being queued. If those log messages are processed by a
@code{QueueHandler} using the same @code{multiprocessing.Queue} instance,
it will cause a deadlock or infinite recursion.
@end quotation
@end cartouche

@geindex emit() (logging.handlers.QueueHandler 메서드)
@anchor{library/logging handlers logging handlers QueueHandler emit}@anchor{3248}
@deffn {메서드} emit (record)

LogRecord를 준비한 결과를 큐에 넣습니다. 예외가 발생하면 (예를 들어, 유한(bounded) 큐가 다 차서), @ref{319d,,handleError()} 메서드가 호출되어 에러를 처리합니다. 이로 인해 레코드가 조용히 버려지거나 (@ref{13fe,,logging.raiseExceptions}가 @code{False} 인 경우), 메시지가 @code{sys.stderr}에 인쇄됩니다 (@code{logging.raiseExceptions}가 @code{True} 인 경우).
@end deffn

@geindex prepare() (logging.handlers.QueueHandler 메서드)
@anchor{library/logging handlers logging handlers QueueHandler prepare}@anchor{3249}
@deffn {메서드} prepare (record)

큐에 넣기 위해 레코드를 준비합니다. 이 메서드에 의해 반환된 객체는 큐에 들어갑니다.

The base implementation formats the record to merge the message,
arguments, exception and stack information, if present.  It also removes
unpickleable items from the record in-place. Specifically, it overwrites
the record’s @code{msg} and @code{message} attributes with the merged
message (obtained by calling the handler’s @ref{199,,format()} method), and
sets the @code{args}, @code{exc_info} and @code{exc_text} attributes
to @code{None}.

레코드를 dict 나 JSON 문자열로 변환하거나, 원본을 그대로 두고 레코드의 수정 된 복사본을 보내길 원한다면 이 메서드를 재정의할 수 있습니다.

@cartouche
@quotation 참고 
The base implementation formats the message with arguments, sets
the @code{message} and @code{msg} attributes to the formatted message and
sets the @code{args} and @code{exc_text} attributes to @code{None} to allow
pickling and to prevent further attempts at formatting. This means
that a handler on the @ref{242,,QueueListener} side won’t have the
information to do custom formatting, e.g. of exceptions. You may wish
to subclass @code{QueueHandler} and override this method to e.g. avoid
setting @code{exc_text} to @code{None}. Note that the @code{message} / @code{msg}
/ @code{args} changes are related to ensuring the record is pickleable,
and you might or might not be able to avoid doing that depending on
whether your @code{args} are pickleable. (Note that you may have to
consider not only your own code but also code in any libraries that
you use.)
@end quotation
@end cartouche
@end deffn

@geindex enqueue() (logging.handlers.QueueHandler 메서드)
@anchor{library/logging handlers logging handlers QueueHandler enqueue}@anchor{3246}
@deffn {메서드} enqueue (record)

@code{put_nowait()}를 사용하여 큐에 레코드를 넣습니다; 블로킹 동작이나 시간제한이나, 사용자 정의 큐 구현을 사용하려면 이 메서드를 재정의할 수 있습니다.
@end deffn

@geindex listener (logging.handlers.QueueHandler의 속성)
@anchor{library/logging handlers logging handlers QueueHandler listener}@anchor{31e9}
@deffn {속성} listener

When created via configuration using @ref{13b5,,dictConfig()}, this
attribute will contain a @ref{242,,QueueListener} instance for use with this
handler. Otherwise, it will be @code{None}.


Added in version 3.12.

@end deffn
@end deffn

@node QueueListener,,QueueHandler,logging handlers — 로깅 처리기
@anchor{library/logging handlers queue-listener}@anchor{324a}@anchor{library/logging handlers queuelistener}@anchor{324b}
@subsubsection QueueListener



Added in version 3.2.


The @ref{242,,QueueListener} class, located in the @code{logging.handlers}
module, supports receiving logging messages from a queue, such as those
implemented in the @ref{bb,,queue} or @ref{98,,multiprocessing} modules. The
messages are received from a queue in an internal thread and passed, on
the same thread, to one or more handlers for processing. While
@code{QueueListener} is not itself a handler, it is documented here
because it works hand-in-hand with @ref{1b5f,,QueueHandler}.

@ref{1b5f,,QueueHandler} 클래스와 함께, @ref{242,,QueueListener}를 사용하여 처리기가 로깅을 수행하는 스레드와 다른 스레드에서 작업을 수행하도록 할 수 있습니다. 이는 클라이언트를 처리하는 스레드가 가능한 한 신속하게 응답하고, 느린 작업(가령 @ref{18b3,,SMTPHandler}를 통해 전자 메일 보내기)은 별도의 스레드에서 수행되어야 하는 웹 응용 프로그램과 다른 서비스 응용 프로그램에서 중요합니다.

@geindex QueueListener (logging.handlers 클래스)
@anchor{library/logging handlers logging handlers QueueListener}@anchor{242}
@deffn {클래스} logging.handlers.QueueListener (queue, *handlers, respect_handler_level=False)

@ref{242,,QueueListener} 클래스의 새 인스턴스를 반환합니다. 인스턴스는 메시지를 보내는 큐와 큐에 있는 항목을 처리할 처리기의 리스트로 초기화됩니다. 큐는 임의의 큐류(queue-like) 객체일 수 있습니다; 메시지를 꺼내는 방법을 알아야 하는 @ref{324c,,dequeue()} 메서드가 있는 그대로 사용합니다. 큐는 작업 추적 API를 갖도록 `요구되지' 않아서 (가능하면 사용됩니다), `queue'에 @ref{d60,,SimpleQueue} 인스턴스를 사용할 수 있습니다.

@cartouche
@quotation 참고 
If you are using @ref{98,,multiprocessing}, you should avoid using
@ref{d60,,SimpleQueue} and instead use @ref{1b87,,multiprocessing.Queue}.
@end quotation
@end cartouche

@code{respect_handler_level}이 @code{True} 면, 처리기에 메시지를 전달할지를 결정할 때, 처리기의 수준이 존중됩니다 (메시지의 수준과 비교); 그렇지 않으면, 이전 파이썬 버전과 같게 동작합니다 - 항상 각 메시지를 모든 처리기에 전달합니다.


버전 3.5에서 변경: @code{respect_handler_level} 인자가 추가되었습니다.



버전 3.14에서 변경: @code{QueueListener} can now be used as a context manager via
@ref{186,,with}. When entering the context, the listener is started. When
exiting the context, the listener is stopped.
@ref{26ae,,__enter__()} returns the
@code{QueueListener} object.


@geindex dequeue() (logging.handlers.QueueListener 메서드)
@anchor{library/logging handlers logging handlers QueueListener dequeue}@anchor{324c}
@deffn {메서드} dequeue (block)

레코드를 큐에서 꺼내 반환합니다. 선택적으로 블록 됩니다.

기본 구현은 @code{get()}을 사용합니다. 시간제한을 사용하거나 사용자 정의 큐 구현을 사용하려면 이 메서드를 재정의할 수 있습니다.
@end deffn

@geindex prepare() (logging.handlers.QueueListener 메서드)
@anchor{library/logging handlers logging handlers QueueListener prepare}@anchor{324d}
@deffn {메서드} prepare (record)

처리를 위해 레코드를 준비합니다.

이 구현은 단지 전달된 레코드를 반환합니다. 사용자 정의 직렬화를 수행하거나 처리기에 전달하기 전에 레코드를 조작해야 하면, 이 메서드를 재정의할 수 있습니다.
@end deffn

@geindex handle() (logging.handlers.QueueListener 메서드)
@anchor{library/logging handlers logging handlers QueueListener handle}@anchor{324e}
@deffn {메서드} handle (record)

레코드를 처리합니다.

이것은 단지 모든 처리기로 레코드를 제공합니다. 처리기에 전달되는 실제 객체는 @ref{324d,,prepare()}에서 반환된 객체입니다.
@end deffn

@geindex start() (logging.handlers.QueueListener 메서드)
@anchor{library/logging handlers logging handlers QueueListener start}@anchor{243}
@deffn {메서드} start ()

수신기를 시작합니다.

이것은 처리하기 위해 큐에서 LogRecord를 관찰하는 배경 스레드를 시작합니다.


버전 3.14에서 변경: Raises @ref{244,,RuntimeError} if called and the listener is already
running.

@end deffn

@geindex stop() (logging.handlers.QueueListener 메서드)
@anchor{library/logging handlers logging handlers QueueListener stop}@anchor{324f}
@deffn {메서드} stop ()

수신기를 정지합니다.

스레드가 종료하도록 요청한 다음, 스레드가 종료할 때까지 대기합니다. 응용 프로그램이 종료되기 전에 이 함수를 호출하지 않으면, 레코드가 큐에 남아있을 수 있고, 이것들은 처리되지 않습니다.
@end deffn

@geindex enqueue_sentinel() (logging.handlers.QueueListener 메서드)
@anchor{library/logging handlers logging handlers QueueListener enqueue_sentinel}@anchor{3250}
@deffn {메서드} enqueue_sentinel ()

수신자에게 종료하도록 알리기 위해 큐에 종료 신호(sentinel)를 씁니다. 이 구현은 @code{put_nowait()}를 사용합니다. 시간제한을 사용하거나 사용자 정의 큐 구현을 사용하려면 이 메서드를 재정의할 수 있습니다.


Added in version 3.3.

@end deffn
@end deffn


@subsubheading 더 보기



@table @asis

@item 모듈 @ref{8b,,logging}

logging 모듈에 관한 API 레퍼런스.

@item 모듈 @ref{8c,,logging.config}

logging 모듈용 구성 API.
@end table


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node platform — 하부 플랫폼의 식별 데이터에 대한 액세스,errno — 표준 errno 시스템 기호,logging handlers — 로깅 처리기,일반 운영 체제 서비스
@anchor{library/platform doc}@anchor{3251}@anchor{library/platform module-platform}@anchor{af}@anchor{library/platform platform-access-to-underlying-platform-s-identifying-data}@anchor{3252}@anchor{library/platform translation-repo}@anchor{3253}
@subsection @code{platform} — 하부 플랫폼의 식별 데이터에 대한 액세스


@geindex module; platform

`소스 코드:' Lib/platform.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/platform.py}


__________________________________________________________________


@cartouche
@quotation 참고 
각 플랫폼은 알파벳순으로 나열되고, 리눅스는 유닉스 절에 포함됩니다.
@end quotation
@end cartouche

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

@end menu

@node Cross platform,Java platform,,platform — 하부 플랫폼의 식별 데이터에 대한 액세스
@anchor{library/platform cross-platform}@anchor{3254}
@subsubsection Cross platform


@geindex architecture() (platform 모듈)
@anchor{library/platform platform architecture}@anchor{1a06}
@deffn {함수} platform.architecture (executable=sys.executable, bits='@w{'}, linkage='@w{'})

다양한 아키텍처 정보에 대해 주어진 실행 파일(기본값은 파이썬 인터프리터 바이너리)을 조회합니다.

실행 파일에 사용된 비트 아키텍처와 링크 형식에 대한 정보가 들어있는 튜플 @code{(bits, linkage)}를 반환합니다. 두 값은 모두 문자열로 반환됩니다.

결정할 수 없는 값은 매개 변수 사전 설정에 따라 반환됩니다. bits가 @code{'@w{'}}로 주어지면, @code{sizeof(pointer)}(또는 파이썬 버전 < 1.5.2 에서는 @code{sizeof(long)})가 지원되는 포인터 크기를 나타내는 데 사용됩니다.

함수는 시스템의 @code{file} 명령을 사용하여 실제 작업을 수행합니다. 이것은 대부분(전부가 아니라면)의 유닉스 플랫폼과 일부 유닉스가 아닌 플랫폼에서 가능하며 실행 파일이 파이썬 인터프리터를 가리키는 경우에만 가능합니다. 위의 요구가 충족되지 않으면 합리적인 기본값이 사용됩니다.

@cartouche
@quotation 참고 
맥 OS(그리고 아마도 다른 플랫폼에서도)에서, 실행 파일은 다중 아키텍처를 포함하는 유니버설 파일일 수 있습니다.

현재 인터프리터가 “64-비트” 인지를 판단하려면, @ref{13ca,,sys.maxsize} 어트리뷰트를 조회하는 것이 더 신뢰성 있습니다.:

@example
is_64bits = sys.maxsize > 2**32
@end example
@end quotation
@end cartouche
@end deffn

@geindex machine() (platform 모듈)
@anchor{library/platform platform machine}@anchor{3255}
@deffn {함수} platform.machine ()

기계 유형을 반환합니다, 예를 들어 @code{'AMD64'}. 값을 판별할 수 없으면 빈 문자열이 반환됩니다.

The output is platform-dependent and may differ in casing and naming conventions.
@end deffn

@geindex node() (platform 모듈)
@anchor{library/platform platform node}@anchor{3256}
@deffn {함수} platform.node ()

컴퓨터의 네트워크 이름을 반환합니다 (완전히 정규화되지 않았을 수 있습니다!). 값을 판별할 수 없으면 빈 문자열이 반환됩니다.
@end deffn

@geindex platform() (platform 모듈)
@anchor{library/platform platform platform}@anchor{1ac4}
@deffn {함수} platform.platform (aliased=False, terse=False)

하부 플랫폼을 식별하는 가능한 한 많은 유용한 정보를 포함하는 단일 문자열을 반환합니다.

출력은 기계가 구문 분석하기보다는 `사람이 읽을 수' 있도록 합니다. 다른 플랫폼에서는 다르게 보일 수 있는데, 이는 의도 된 것입니다.

`aliased'가 참이면, 함수는 일반 이름과 다른 시스템 이름을 보고하는 다양한 플랫폼에 대해 별칭을 사용합니다, 예를 들어 SunOS는 Solaris로 보고됩니다. 이를 구현하는 데 @ref{3257,,system_alias()} 함수가 사용됩니다.

`terse'를 참으로 설정하면 함수가 플랫폼을 식별하는 데 필요한 절대적으로 최소한의 정보만 반환합니다.


버전 3.8에서 변경: macOS에서, 이 함수는 이제 darwin 버전 대신 macOS 버전을 얻기 위해 @ref{1e11,,mac_ver()} 를 사용합니다 (비어 있지 않은 릴리스 문자열을 반환한다면).

@end deffn

@geindex processor() (platform 모듈)
@anchor{library/platform platform processor}@anchor{3258}
@deffn {함수} platform.processor ()

(실제) 프로세서 이름을 반환합니다, 예를 들어 @code{'amdk6'}.

값을 판별할 수 없으면 빈 문자열이 반환됩니다. 많은 플랫폼이 이 정보를 제공하지 않거나 단순히 @ref{3255,,machine()}과 같은 값을 반환함에 유의하십시오. NetBSD가 그렇습니다.
@end deffn

@geindex python_build() (platform 모듈)
@anchor{library/platform platform python_build}@anchor{3259}
@deffn {함수} platform.python_build ()

파이썬 빌드 번호와 날짜를 문자열로 나타내는 튜플 @code{(buildno, builddate)}를 반환합니다.
@end deffn

@geindex python_compiler() (platform 모듈)
@anchor{library/platform platform python_compiler}@anchor{325a}
@deffn {함수} platform.python_compiler ()

파이썬 컴파일에 사용된 컴파일러를 식별하는 문자열을 반환합니다.
@end deffn

@geindex python_branch() (platform 모듈)
@anchor{library/platform platform python_branch}@anchor{325b}
@deffn {함수} platform.python_branch ()

파이썬 구현 SCM 브랜치를 식별하는 문자열을 반환합니다.
@end deffn

@geindex python_implementation() (platform 모듈)
@anchor{library/platform platform python_implementation}@anchor{325c}
@deffn {함수} platform.python_implementation ()

파이썬 구현을 식별하는 문자열을 반환합니다. 가능한 반환 값은 이렇습니다: ‘CPython’, ‘IronPython’, ‘Jython’, ‘PyPy’.
@end deffn

@geindex python_revision() (platform 모듈)
@anchor{library/platform platform python_revision}@anchor{325d}
@deffn {함수} platform.python_revision ()

파이썬 구현 SCM 리비전을 식별하는 문자열을 반환합니다.
@end deffn

@geindex python_version() (platform 모듈)
@anchor{library/platform platform python_version}@anchor{325e}
@deffn {함수} platform.python_version ()

파이썬 버전을 문자열 @code{'major.minor.patchlevel'}로 반환합니다.

파이썬 @code{sys.version}과 달리, 반환 값은 항상 patchlevel을 포함함에 유의하십시오 (기본값은 0입니다).
@end deffn

@geindex python_version_tuple() (platform 모듈)
@anchor{library/platform platform python_version_tuple}@anchor{325f}
@deffn {함수} platform.python_version_tuple ()

파이썬 버전을 문자열의 튜플 @code{(major, minor, patchlevel)}로 반환합니다.

파이썬 @code{sys.version}과 달리, 반환 값은 항상 patchlevel을 포함함에 유의하십시오 (기본값은 @code{'0'}입니다).
@end deffn

@geindex release() (platform 모듈)
@anchor{library/platform platform release}@anchor{3260}
@deffn {함수} platform.release ()

시스템의 릴리스를 반환합니다, 예를 들어 @code{'2.2.0'}이나 @code{'NT'}. 값을 판별할 수 없으면 빈 문자열이 반환됩니다.
@end deffn

@geindex system() (platform 모듈)
@anchor{library/platform platform system}@anchor{2264}
@deffn {함수} platform.system ()

시스템/OS 이름을 반환합니다, 가령 @code{'Linux'}, @code{'Darwin'}, @code{'Java'}, @code{'Windows'}. 값을 판별할 수 없으면 빈 문자열이 반환됩니다.

On iOS and Android, this returns the user-facing OS name (i.e, @code{'iOS},
@code{'iPadOS'} or @code{'Android'}). To obtain the kernel name (@code{'Darwin'} or
@code{'Linux'}), use @ref{131b,,os.uname()}.
@end deffn

@geindex system_alias() (platform 모듈)
@anchor{library/platform platform system_alias}@anchor{3257}
@deffn {함수} platform.system_alias (system, release, version)

일부 시스템에서 사용되는 상용 마케팅 이름으로 별칭 된 @code{(system, release, version)}을 반환합니다. 혼동을 일으킬 수 있는 일부 경우에 정보의 순서를 변경하기도 합니다.
@end deffn

@geindex version() (platform 모듈)
@anchor{library/platform platform version}@anchor{3261}
@deffn {함수} platform.version ()

시스템의 릴리스 버전을 반환합니다, 예를 들어 @code{'#3 on degas'}. 값을 판별할 수 없으면 빈 문자열이 반환됩니다.

On iOS and Android, this is the user-facing OS version. To obtain the
Darwin or Linux kernel version, use @ref{131b,,os.uname()}.
@end deffn

@geindex uname() (platform 모듈)
@anchor{library/platform platform uname}@anchor{1e0f}
@deffn {함수} platform.uname ()

꽤 이식성 있는 uname 인터페이스. @ref{2264,,system}, @ref{3256,,node}, @ref{3260,,release}, @ref{3261,,version}, @ref{3255,,machine}, @ref{3258,,processor}의 6개의 어트리뷰트를 포함한 @ref{4e0,,namedtuple()}를 반환합니다.

@ref{3258,,processor}는 요청 시 늦게 확인됩니다.

Note: the first two attribute names differ from the names presented by
@ref{131b,,os.uname()}, where they are named @code{sysname} and
@code{nodename}.

결정할 수 없는 항목은 @code{'@w{'}}로 설정됩니다.


버전 3.3에서 변경: 결과가 튜플에서 @ref{4e0,,namedtuple()}로 변경되었습니다.



버전 3.9에서 변경: @ref{3258,,processor} is resolved late instead of immediately.

@end deffn

@geindex invalidate_caches() (platform 모듈)
@anchor{library/platform platform invalidate_caches}@anchor{27d}
@deffn {함수} platform.invalidate_caches ()

Clear out the internal cache of information, such as the @ref{1e0f,,uname()}.
This is typically useful when the platform’s @ref{3256,,node()} is changed
by an external process and one needs to retrieve the updated value.


Added in version 3.14.

@end deffn

@node Java platform,Windows platform,Cross platform,platform — 하부 플랫폼의 식별 데이터에 대한 액세스
@anchor{library/platform java-platform}@anchor{3262}
@subsubsection Java platform


@geindex java_ver() (platform 모듈)
@anchor{library/platform platform java_ver}@anchor{32c}
@deffn {함수} platform.java_ver (release='@w{'}, vendor='@w{'}, vminfo=('@w{'}, '@w{'}, '@w{'}), osinfo=('@w{'}, '@w{'}, '@w{'}))

Jython의 버전 인터페이스.

튜플 @code{(release, vendor, vminfo, osinfo)}를 반환하는데, `vminfo'는 튜플 @code{(vm_name, vm_release, vm_vendor)}이고, `osinfo'는 튜플 @code{(os_name, os_version, os_arch)}입니다. 결정할 수 없는 값은 매개 변수로 지정된 기본값으로 설정됩니다 (기본값은 모두 @code{'@w{'}}입니다).


Deprecated since version 3.13, will be removed in version 3.15: It was largely untested, had a confusing API,
and was only useful for Jython support.

@end deffn

@node Windows platform,macOS platform,Java platform,platform — 하부 플랫폼의 식별 데이터에 대한 액세스
@anchor{library/platform windows-platform}@anchor{3263}
@subsubsection Windows platform


@geindex win32_ver() (platform 모듈)
@anchor{library/platform platform win32_ver}@anchor{1d47}
@deffn {함수} platform.win32_ver (release='@w{'}, version='@w{'}, csd='@w{'}, ptype='@w{'})

윈도우 레지스트리에서 추가 버전 정보를 얻고 OS 릴리스, 버전 번호, CSD 수준 (서비스 팩) 및 OS 유형(다중/단일 프로세서)을 가리키는 튜플 @code{(release, version, csd, ptype)}를 반환합니다. 파악할 수 없는 값은 매개 변수로 주어지는 기본값(모두 빈 문자열이 기본값입니다)으로 설정됩니다.

힌트: `ptype'은 단일 프로세서 NT 기계에서는 @code{'Uniprocessor Free'}이고 다중 프로세서 기계에서는 @code{'Multiprocessor Free'}입니다. @code{'Free'}는 디버깅 코드가 없는 OS 버전을 나타냅니다. 또한 @code{'Checked'}를 언급할 수 있는데, OS 버전이 디버깅 코드, 즉 인자, 범위 등을 검사하는 코드를 사용한다는 것을 뜻합니다.
@end deffn

@geindex win32_edition() (platform 모듈)
@anchor{library/platform platform win32_edition}@anchor{3264}
@deffn {함수} platform.win32_edition ()

현재 윈도우 에디션을 나타내는 문자열을 반환합니다. 값을 파악할 수 없으면 @code{None}을 반환합니다. 가능한 값은 @code{'Enterprise'}, @code{'IoTUAP'}, @code{'ServerStandard'} 및 @code{'nanoserver'}를 포함하지만 이에 국한되지는 않습니다.


Added in version 3.8.

@end deffn

@geindex win32_is_iot() (platform 모듈)
@anchor{library/platform platform win32_is_iot}@anchor{3265}
@deffn {함수} platform.win32_is_iot ()

@ref{3264,,win32_edition()}에 의해 반환된 윈도우 에디션이 IoT 에디션으로 인식되면 @code{True}를 반환합니다.


Added in version 3.8.

@end deffn

@node macOS platform,iOS platform,Windows platform,platform — 하부 플랫폼의 식별 데이터에 대한 액세스
@anchor{library/platform macos-platform}@anchor{3266}
@subsubsection macOS platform


@geindex mac_ver() (platform 모듈)
@anchor{library/platform platform mac_ver}@anchor{1e11}
@deffn {함수} platform.mac_ver (release='@w{'}, versioninfo=('@w{'}, '@w{'}, '@w{'}), machine='@w{'})

맥 OS 버전 정보를 얻고 튜플 @code{(release, versioninfo, machine)}으로 반환하는데, `versioninfo'는 튜플 @code{(version, dev_stage, non_release_version)}입니다.

결정할 수 없는 항목은 @code{'@w{'}}로 설정됩니다. 모든 튜플 항목은 문자열입니다.
@end deffn

@node iOS platform,Unix platforms,macOS platform,platform — 하부 플랫폼의 식별 데이터에 대한 액세스
@anchor{library/platform ios-platform}@anchor{3267}
@subsubsection iOS platform


@geindex ios_ver() (platform 모듈)
@anchor{library/platform platform ios_ver}@anchor{2263}
@deffn {함수} platform.ios_ver (system='@w{'}, release='@w{'}, model='@w{'}, is_simulator=False)

Get iOS version information and return it as a
@ref{4e0,,namedtuple()} with the following attributes:


@itemize *

@item 
@code{system} is the OS name; either @code{'iOS'} or @code{'iPadOS'}.

@item 
@code{release} is the iOS version number as a string (e.g., @code{'17.2'}).

@item 
@code{model} is the device model identifier; this will be a string like
@code{'iPhone13,2'} for a physical device, or @code{'iPhone'} on a simulator.

@item 
@code{is_simulator} is a boolean describing if the app is running on a
simulator or a physical device.
@end itemize

판단할 수 없는 항목은 매개 변수로 주어지는 기본값으로 설정됩니다.
@end deffn

@node Unix platforms,Linux platforms,iOS platform,platform — 하부 플랫폼의 식별 데이터에 대한 액세스
@anchor{library/platform unix-platforms}@anchor{3268}
@subsubsection Unix platforms


@geindex libc_ver() (platform 모듈)
@anchor{library/platform platform libc_ver}@anchor{17f8}
@deffn {함수} platform.libc_ver (executable=sys.executable, lib='@w{'}, version='@w{'}, chunksize=16384)

파일 executable(기본값은 파이썬 인터프리터입니다)이 링크된 libc 버전을 확인하려고 시도합니다. 문자열의 튜플 @code{(lib, version)}을 반환하는데, 조회가 실패하면 지정된 매개 변수를 기본값으로 사용합니다.

다른 libc 버전이 실행 파일에 심볼을 추가하는 방법에 대해 이 함수가 가진 지식은 아마도 @code{gcc}로 컴파일된 실행 파일에서만 사용 가능하다는 것에 유의하십시오.

파일은 `chunksize' 바이트의 청크 단위로 읽고 스캔됩니다.
@end deffn

@node Linux platforms,Android platform,Unix platforms,platform — 하부 플랫폼의 식별 데이터에 대한 액세스
@anchor{library/platform linux-platforms}@anchor{3269}
@subsubsection Linux platforms


@geindex freedesktop_os_release() (platform 모듈)
@anchor{library/platform platform freedesktop_os_release}@anchor{a27}
@deffn {함수} platform.freedesktop_os_release ()

Get operating system identification from @code{os-release} file and return
it as a dict. The @code{os-release} file is a freedesktop.org standard@footnote{https://www.freedesktop.org/software/systemd/man/os-release.html} and
is available in most Linux distributions. A noticeable exception is
Android and Android-based distributions.

Raises @ref{2c0,,OSError} or subclass when neither @code{/etc/os-release} nor
@code{/usr/lib/os-release} can be read.

On success, the function returns a dictionary where keys and values are
strings. Values have their special characters like @code{"} and @code{$}
unquoted. The fields @code{NAME}, @code{ID}, and @code{PRETTY_NAME} are always
defined according to the standard. All other fields are optional. Vendors
may include additional fields.

Note that fields like @code{NAME}, @code{VERSION}, and @code{VARIANT} are strings
suitable for presentation to users. Programs should use fields like
@code{ID}, @code{ID_LIKE}, @code{VERSION_ID}, or @code{VARIANT_ID} to identify
Linux distributions.

예제:

@example
def get_like_distro():
    info = platform.freedesktop_os_release()
    ids = [info["ID"]]
    if "ID_LIKE" in info:
        # id 들은 공백으로 구분되고 우선 순위에 따라 정렬됩니다
        ids.extend(info["ID_LIKE"].split())
    return ids
@end example


Added in version 3.10.

@end deffn

@node Android platform,Command-line usage<3>,Linux platforms,platform — 하부 플랫폼의 식별 데이터에 대한 액세스
@anchor{library/platform android-platform}@anchor{326a}
@subsubsection Android platform


@geindex android_ver() (platform 모듈)
@anchor{library/platform platform android_ver}@anchor{19c6}
@deffn {함수} platform.android_ver (release='@w{'}, api_level=0, manufacturer='@w{'}, model='@w{'}, device='@w{'}, is_emulator=False)

Get Android device information. Returns a @ref{4e0,,namedtuple()}
with the following attributes. Values which cannot be determined are set to
the defaults given as parameters.


@itemize *

@item 
@code{release} - Android version, as a string (e.g. @code{"14"}).

@item 
@code{api_level} - API level of the running device, as an integer (e.g. @code{34}
for Android 14). To get the API level which Python was built against, see
@ref{d82,,sys.getandroidapilevel()}.

@item 
@code{manufacturer} - Manufacturer name@footnote{https://developer.android.com/reference/android/os/Build#MANUFACTURER}.

@item 
@code{model} - Model name@footnote{https://developer.android.com/reference/android/os/Build#MODEL} –
typically the marketing name or model number.

@item 
@code{device} - Device name@footnote{https://developer.android.com/reference/android/os/Build#DEVICE} –
typically the model number or a codename.

@item 
@code{is_emulator} - @code{True} if the device is an emulator; @code{False} if it’s
a physical device.
@end itemize

Google maintains a list of known model and device names@footnote{https://storage.googleapis.com/play_public/supported_devices.html}.


Added in version 3.13.

@end deffn

@node Command-line usage<3>,,Android platform,platform — 하부 플랫폼의 식별 데이터에 대한 액세스
@anchor{library/platform command-line-usage}@anchor{326b}@anchor{library/platform platform-cli}@anchor{326c}
@subsubsection Command-line usage


@code{platform} can also be invoked directly using the @ref{23c,,-m}
switch of the interpreter:

@example
python -m platform [--terse] [--nonaliased] [@{nonaliased,terse@} ...]
@end example

The following options are accepted:

@geindex platform 명령줄 옵션; --terse
@anchor{library/platform cmdoption-platform-terse}@anchor{326d}
@deffn {Option} @w{-}@w{-}terse

Print terse information about the platform. This is equivalent to
calling @ref{1ac4,,platform.platform()} with the `terse' argument set to @code{True}.
@end deffn

@geindex platform 명령줄 옵션; --nonaliased
@anchor{library/platform cmdoption-platform-nonaliased}@anchor{326e}
@deffn {Option} @w{-}@w{-}nonaliased

Print platform information without system/OS name aliasing. This is
equivalent to calling @ref{1ac4,,platform.platform()} with the `aliased' argument
set to @code{True}.
@end deffn

You can also pass one or more positional arguments (@code{terse}, @code{nonaliased})
to explicitly control the output format. These behave similarly to their
corresponding options.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node errno — 표준 errno 시스템 기호,ctypes — A foreign function library for Python,platform — 하부 플랫폼의 식별 데이터에 대한 액세스,일반 운영 체제 서비스
@anchor{library/errno doc}@anchor{326f}@anchor{library/errno errno-standard-errno-system-symbols}@anchor{3270}@anchor{library/errno module-errno}@anchor{5b}@anchor{library/errno translation-repo}@anchor{3271}
@subsection @code{errno} — 표준 errno 시스템 기호


@geindex module; errno


__________________________________________________________________


이 모듈은 표준 @code{errno} 시스템 기호를 제공합니다. 각 기호의 값은 해당 정숫값입니다. 이름과 설명은 @code{linux/include/errno.h}에서 빌려 왔는데, 포괄적이어야 합니다.

@geindex errorcode (errno 모듈)
@anchor{library/errno errno errorcode}@anchor{3272}
@deffn {데이터} errno.errorcode

errno 값에서 하부 시스템의 문자열 이름으로의 매핑을 제공하는 딕셔너리입니다. 예를 들어, @code{errno.errorcode[errno.EPERM]}는 @code{'EPERM'}로 매핑됩니다.
@end deffn

숫자 에러 코드를 에러 메시지로 변환하려면, @ref{304b,,os.strerror()}를 사용하십시오.

다음 목록에서, 현재 플랫폼에서 사용되지 않는 기호는 모듈에서 정의하지 않습니다. 정의된 기호의 구체적인 목록은 @code{errno.errorcode.keys()}로 사용 가능합니다. 사용할 수 있는 기호는 다음과 같습니다:

@geindex EPERM (errno 모듈)
@anchor{library/errno errno EPERM}@anchor{1b54}
@deffn {데이터} errno.EPERM

Operation not permitted. 이 에러는 예외 @ref{f3d,,PermissionError}로 매핑됩니다.
@end deffn

@geindex ENOENT (errno 모듈)
@anchor{library/errno errno ENOENT}@anchor{270f}
@deffn {데이터} errno.ENOENT

No such file or directory – 그런 파일이나 디렉터리가 없습니다. 이 에러는 예외 @ref{264,,FileNotFoundError}로 매핑됩니다.
@end deffn

@geindex ESRCH (errno 모듈)
@anchor{library/errno errno ESRCH}@anchor{2713}
@deffn {데이터} errno.ESRCH

No such process – 그런 프로세스가 없습니다. 이 에러는 예외 @ref{125a,,ProcessLookupError}로 매핑됩니다.
@end deffn

@geindex EINTR (errno 모듈)
@anchor{library/errno errno EINTR}@anchor{f86}
@deffn {데이터} errno.EINTR

Interrupted system call – 중단된 시스템 호출. 이 에러는 예외 @ref{f87,,InterruptedError}로 매핑됩니다.
@end deffn

@geindex EIO (errno 모듈)
@anchor{library/errno errno EIO}@anchor{3273}
@deffn {데이터} errno.EIO

I/O error – I/O 에러
@end deffn

@geindex ENXIO (errno 모듈)
@anchor{library/errno errno ENXIO}@anchor{3274}
@deffn {데이터} errno.ENXIO

No such device or address – 그런 장치나 주소가 없습니다.
@end deffn

@geindex E2BIG (errno 모듈)
@anchor{library/errno errno E2BIG}@anchor{3275}
@deffn {데이터} errno.E2BIG

Arg list too long – 인자 목록이 너무 깁니다.
@end deffn

@geindex ENOEXEC (errno 모듈)
@anchor{library/errno errno ENOEXEC}@anchor{3276}
@deffn {데이터} errno.ENOEXEC

Exec format error – Exec 포맷 에러
@end deffn

@geindex EBADF (errno 모듈)
@anchor{library/errno errno EBADF}@anchor{b54}
@deffn {데이터} errno.EBADF

Bad file number – 잘못된 파일 번호
@end deffn

@geindex ECHILD (errno 모듈)
@anchor{library/errno errno ECHILD}@anchor{2708}
@deffn {데이터} errno.ECHILD

No child processes – 그런 자식 프로세스가 없습니다. 이 에러는 예외 @ref{1257,,ChildProcessError}로 매핑됩니다.
@end deffn

@geindex EAGAIN (errno 모듈)
@anchor{library/errno errno EAGAIN}@anchor{2703}
@deffn {데이터} errno.EAGAIN

Try again – 다시 시도하십시오. 이 에러는 예외 @ref{235,,BlockingIOError}로 매핑됩니다.
@end deffn

@geindex ENOMEM (errno 모듈)
@anchor{library/errno errno ENOMEM}@anchor{3277}
@deffn {데이터} errno.ENOMEM

Out of memory – 메모리 부족
@end deffn

@geindex EACCES (errno 모듈)
@anchor{library/errno errno EACCES}@anchor{2712}
@deffn {데이터} errno.EACCES

Permission denied – 사용 권한이 거부되었습니다. 이 에러는 예외 @ref{f3d,,PermissionError}로 매핑됩니다.
@end deffn

@geindex EFAULT (errno 모듈)
@anchor{library/errno errno EFAULT}@anchor{3278}
@deffn {데이터} errno.EFAULT

Bad address – 잘못된 주소
@end deffn

@geindex ENOTBLK (errno 모듈)
@anchor{library/errno errno ENOTBLK}@anchor{3279}
@deffn {데이터} errno.ENOTBLK

Block device required – 블록 장치가 필요합니다
@end deffn

@geindex EBUSY (errno 모듈)
@anchor{library/errno errno EBUSY}@anchor{327a}
@deffn {데이터} errno.EBUSY

Device or resource busy – 장치나 자원이 사용 중입니다
@end deffn

@geindex EEXIST (errno 모듈)
@anchor{library/errno errno EEXIST}@anchor{270e}
@deffn {데이터} errno.EEXIST

File exists – 파일이 존재합니다. 이 에러는 예외 @ref{121f,,FileExistsError}로 매핑됩니다.
@end deffn

@geindex EXDEV (errno 모듈)
@anchor{library/errno errno EXDEV}@anchor{3061}
@deffn {데이터} errno.EXDEV

Cross-device link – 장치 간 링크
@end deffn

@geindex ENODEV (errno 모듈)
@anchor{library/errno errno ENODEV}@anchor{327b}
@deffn {데이터} errno.ENODEV

No such device – 그런 장치가 없습니다
@end deffn

@geindex ENOTDIR (errno 모듈)
@anchor{library/errno errno ENOTDIR}@anchor{2711}
@deffn {데이터} errno.ENOTDIR

Not a directory – 디렉터리가 아닙니다. 이 에러는 예외 @ref{1259,,NotADirectoryError}로 매핑됩니다.
@end deffn

@geindex EISDIR (errno 모듈)
@anchor{library/errno errno EISDIR}@anchor{2710}
@deffn {데이터} errno.EISDIR

Is a directory – 디렉터리입니다. 이 에러는 예외 @ref{1258,,IsADirectoryError}로 매핑됩니다.
@end deffn

@geindex EINVAL (errno 모듈)
@anchor{library/errno errno EINVAL}@anchor{1dcf}
@deffn {데이터} errno.EINVAL

Invalid argument – 잘못된 인자
@end deffn

@geindex ENFILE (errno 모듈)
@anchor{library/errno errno ENFILE}@anchor{327c}
@deffn {데이터} errno.ENFILE

File table overflow – 파일 테이블 오버플로
@end deffn

@geindex EMFILE (errno 모듈)
@anchor{library/errno errno EMFILE}@anchor{327d}
@deffn {데이터} errno.EMFILE

Too many open files – 열려있는 파일이 너무 많습니다
@end deffn

@geindex ENOTTY (errno 모듈)
@anchor{library/errno errno ENOTTY}@anchor{327e}
@deffn {데이터} errno.ENOTTY

Not a typewriter – 타자기가 아닙니다
@end deffn

@geindex ETXTBSY (errno 모듈)
@anchor{library/errno errno ETXTBSY}@anchor{327f}
@deffn {데이터} errno.ETXTBSY

Text file busy – 텍스트 파일이 사용 중입니다
@end deffn

@geindex EFBIG (errno 모듈)
@anchor{library/errno errno EFBIG}@anchor{3280}
@deffn {데이터} errno.EFBIG

File too large – 파일이 너무 큽니다
@end deffn

@geindex ENOSPC (errno 모듈)
@anchor{library/errno errno ENOSPC}@anchor{3281}
@deffn {데이터} errno.ENOSPC

No space left on device – 장치에 남은 공간이 없습니다.
@end deffn

@geindex ESPIPE (errno 모듈)
@anchor{library/errno errno ESPIPE}@anchor{3282}
@deffn {데이터} errno.ESPIPE

Illegal seek – 잘못된 탐색
@end deffn

@geindex EROFS (errno 모듈)
@anchor{library/errno errno EROFS}@anchor{3283}
@deffn {데이터} errno.EROFS

Read-only file system – 읽기 전용 파일 시스템
@end deffn

@geindex EMLINK (errno 모듈)
@anchor{library/errno errno EMLINK}@anchor{3284}
@deffn {데이터} errno.EMLINK

Too many links – 링크가 너무 많습니다
@end deffn

@geindex EPIPE (errno 모듈)
@anchor{library/errno errno EPIPE}@anchor{2709}
@deffn {데이터} errno.EPIPE

Broken pipe – 깨진 파이프. 이 에러는 예외 @ref{125b,,BrokenPipeError}로 매핑됩니다.
@end deffn

@geindex EDOM (errno 모듈)
@anchor{library/errno errno EDOM}@anchor{3285}
@deffn {데이터} errno.EDOM

Math argument out of domain of func – 함수의 범위를 벗어난 수학 인자
@end deffn

@geindex ERANGE (errno 모듈)
@anchor{library/errno errno ERANGE}@anchor{3286}
@deffn {데이터} errno.ERANGE

Math result not representable – 수학 결과를 표현할 수 없습니다
@end deffn

@geindex EDEADLK (errno 모듈)
@anchor{library/errno errno EDEADLK}@anchor{3287}
@deffn {데이터} errno.EDEADLK

Resource deadlock would occur – 자원 교착 상태가 발생합니다
@end deffn

@geindex ENAMETOOLONG (errno 모듈)
@anchor{library/errno errno ENAMETOOLONG}@anchor{3288}
@deffn {데이터} errno.ENAMETOOLONG

File name too long – 파일 이름이 너무 깁니다
@end deffn

@geindex ENOLCK (errno 모듈)
@anchor{library/errno errno ENOLCK}@anchor{3289}
@deffn {데이터} errno.ENOLCK

No record locks available – 사용 가능한 레코드 록이 없습니다
@end deffn

@geindex ENOSYS (errno 모듈)
@anchor{library/errno errno ENOSYS}@anchor{1b55}
@deffn {데이터} errno.ENOSYS

Function not implemented – 기능이 구현되지 않았습니다
@end deffn

@geindex ENOTEMPTY (errno 모듈)
@anchor{library/errno errno ENOTEMPTY}@anchor{328a}
@deffn {데이터} errno.ENOTEMPTY

Directory not empty – 디렉터리가 비어 있지 않습니다
@end deffn

@geindex ELOOP (errno 모듈)
@anchor{library/errno errno ELOOP}@anchor{328b}
@deffn {데이터} errno.ELOOP

Too many symbolic links encountered – 마주친 심볼릭 링크가 너무 많습니다
@end deffn

@geindex EWOULDBLOCK (errno 모듈)
@anchor{library/errno errno EWOULDBLOCK}@anchor{2705}
@deffn {데이터} errno.EWOULDBLOCK

Operation would block – 연산이 블록 됩니다. 이 에러는 예외 @ref{235,,BlockingIOError}로 매핑됩니다.
@end deffn

@geindex ENOMSG (errno 모듈)
@anchor{library/errno errno ENOMSG}@anchor{328c}
@deffn {데이터} errno.ENOMSG

No message of desired type – 원하는 유형의 메시지가 없습니다
@end deffn

@geindex EIDRM (errno 모듈)
@anchor{library/errno errno EIDRM}@anchor{328d}
@deffn {데이터} errno.EIDRM

Identifier removed – 식별자가 삭제되었습니다
@end deffn

@geindex ECHRNG (errno 모듈)
@anchor{library/errno errno ECHRNG}@anchor{328e}
@deffn {데이터} errno.ECHRNG

Channel number out of range – 채널 번호가 범위를 벗어났습니다
@end deffn

@geindex EL2NSYNC (errno 모듈)
@anchor{library/errno errno EL2NSYNC}@anchor{328f}
@deffn {데이터} errno.EL2NSYNC

Level 2 not synchronized – 수준 2가 동기화되지 않았습니다
@end deffn

@geindex EL3HLT (errno 모듈)
@anchor{library/errno errno EL3HLT}@anchor{3290}
@deffn {데이터} errno.EL3HLT

Level 3 halted – 수준 3이 정지되었습니다
@end deffn

@geindex EL3RST (errno 모듈)
@anchor{library/errno errno EL3RST}@anchor{3291}
@deffn {데이터} errno.EL3RST

Level 3 reset – 수준 3이 재설정되었습니다
@end deffn

@geindex ELNRNG (errno 모듈)
@anchor{library/errno errno ELNRNG}@anchor{3292}
@deffn {데이터} errno.ELNRNG

Link number out of range – 링크 번호가 범위를 벗어났습니다
@end deffn

@geindex EUNATCH (errno 모듈)
@anchor{library/errno errno EUNATCH}@anchor{3293}
@deffn {데이터} errno.EUNATCH

Protocol driver not attached – 프로토콜 드라이버가 연결되지 않았습니다
@end deffn

@geindex ENOCSI (errno 모듈)
@anchor{library/errno errno ENOCSI}@anchor{3294}
@deffn {데이터} errno.ENOCSI

No CSI structure available – 사용 가능한 CSI 구조가 없습니다
@end deffn

@geindex EL2HLT (errno 모듈)
@anchor{library/errno errno EL2HLT}@anchor{3295}
@deffn {데이터} errno.EL2HLT

Level 2 halted – 수준 2가 중지되었습니다
@end deffn

@geindex EBADE (errno 모듈)
@anchor{library/errno errno EBADE}@anchor{3296}
@deffn {데이터} errno.EBADE

Invalid exchange – 잘못된 교환
@end deffn

@geindex EBADR (errno 모듈)
@anchor{library/errno errno EBADR}@anchor{3297}
@deffn {데이터} errno.EBADR

Invalid request descriptor – 잘못된 요청 기술자
@end deffn

@geindex EXFULL (errno 모듈)
@anchor{library/errno errno EXFULL}@anchor{3298}
@deffn {데이터} errno.EXFULL

Exchange full – 교환 포화
@end deffn

@geindex ENOANO (errno 모듈)
@anchor{library/errno errno ENOANO}@anchor{3299}
@deffn {데이터} errno.ENOANO

No anode – anode가 없습니다
@end deffn

@geindex EBADRQC (errno 모듈)
@anchor{library/errno errno EBADRQC}@anchor{329a}
@deffn {데이터} errno.EBADRQC

Invalid request code – 유효하지 않은 요청 코드
@end deffn

@geindex EBADSLT (errno 모듈)
@anchor{library/errno errno EBADSLT}@anchor{329b}
@deffn {데이터} errno.EBADSLT

Invalid slot – 유효하지 않은 슬롯
@end deffn

@geindex EDEADLOCK (errno 모듈)
@anchor{library/errno errno EDEADLOCK}@anchor{329c}
@deffn {데이터} errno.EDEADLOCK

File locking deadlock error – 파일 잠금 교착 상태 에러
@end deffn

@geindex EBFONT (errno 모듈)
@anchor{library/errno errno EBFONT}@anchor{329d}
@deffn {데이터} errno.EBFONT

Bad font file format – 잘못된 글꼴 파일 형식
@end deffn

@geindex ENOSTR (errno 모듈)
@anchor{library/errno errno ENOSTR}@anchor{329e}
@deffn {데이터} errno.ENOSTR

Device not a stream – 장치가 스트림이 아닙니다
@end deffn

@geindex ENODATA (errno 모듈)
@anchor{library/errno errno ENODATA}@anchor{329f}
@deffn {데이터} errno.ENODATA

No data available – 데이터가 없습니다
@end deffn

@geindex ETIME (errno 모듈)
@anchor{library/errno errno ETIME}@anchor{32a0}
@deffn {데이터} errno.ETIME

Timer expired – 타이머가 만료되었습니다
@end deffn

@geindex ENOSR (errno 모듈)
@anchor{library/errno errno ENOSR}@anchor{32a1}
@deffn {데이터} errno.ENOSR

Out of streams resources – 스트림 자원 부족
@end deffn

@geindex ENONET (errno 모듈)
@anchor{library/errno errno ENONET}@anchor{32a2}
@deffn {데이터} errno.ENONET

Machine is not on the network – 기계가 네트워크에 없습니다.
@end deffn

@geindex ENOPKG (errno 모듈)
@anchor{library/errno errno ENOPKG}@anchor{32a3}
@deffn {데이터} errno.ENOPKG

Package not installed – 패키지가 설치되지 않았습니다
@end deffn

@geindex EREMOTE (errno 모듈)
@anchor{library/errno errno EREMOTE}@anchor{32a4}
@deffn {데이터} errno.EREMOTE

Object is remote – 객체가 원격입니다
@end deffn

@geindex ENOLINK (errno 모듈)
@anchor{library/errno errno ENOLINK}@anchor{32a5}
@deffn {데이터} errno.ENOLINK

Link has been severed – 링크가 절단되었습니다
@end deffn

@geindex EADV (errno 모듈)
@anchor{library/errno errno EADV}@anchor{32a6}
@deffn {데이터} errno.EADV

Advertise error – 광고 에러
@end deffn

@geindex ESRMNT (errno 모듈)
@anchor{library/errno errno ESRMNT}@anchor{32a7}
@deffn {데이터} errno.ESRMNT

Srmount error – srmount 에러
@end deffn

@geindex ECOMM (errno 모듈)
@anchor{library/errno errno ECOMM}@anchor{32a8}
@deffn {데이터} errno.ECOMM

Communication error on send – 전송 시 통신 에러
@end deffn

@geindex EPROTO (errno 모듈)
@anchor{library/errno errno EPROTO}@anchor{32a9}
@deffn {데이터} errno.EPROTO

Protocol error – 프로토콜 에러
@end deffn

@geindex EMULTIHOP (errno 모듈)
@anchor{library/errno errno EMULTIHOP}@anchor{32aa}
@deffn {데이터} errno.EMULTIHOP

Multihop attempted – 다중 홉을 시도했습니다
@end deffn

@geindex EDOTDOT (errno 모듈)
@anchor{library/errno errno EDOTDOT}@anchor{32ab}
@deffn {데이터} errno.EDOTDOT

RFS specific error – RFS 특정 에러
@end deffn

@geindex EBADMSG (errno 모듈)
@anchor{library/errno errno EBADMSG}@anchor{32ac}
@deffn {데이터} errno.EBADMSG

Not a data message – 데이터 메시지가 아닙니다
@end deffn

@geindex EOVERFLOW (errno 모듈)
@anchor{library/errno errno EOVERFLOW}@anchor{32ad}
@deffn {데이터} errno.EOVERFLOW

Value too large for defined data type – 정의된 데이터형에 비해 값이 너무 큽니다
@end deffn

@geindex ENOTUNIQ (errno 모듈)
@anchor{library/errno errno ENOTUNIQ}@anchor{32ae}
@deffn {데이터} errno.ENOTUNIQ

Name not unique on network – 이름이 네트워크에서 고유하지 않습니다
@end deffn

@geindex EBADFD (errno 모듈)
@anchor{library/errno errno EBADFD}@anchor{32af}
@deffn {데이터} errno.EBADFD

File descriptor in bad state – 잘못된 상태의 파일 기술자
@end deffn

@geindex EREMCHG (errno 모듈)
@anchor{library/errno errno EREMCHG}@anchor{32b0}
@deffn {데이터} errno.EREMCHG

Remote address changed – 원격 주소가 변경되었습니다
@end deffn

@geindex ELIBACC (errno 모듈)
@anchor{library/errno errno ELIBACC}@anchor{32b1}
@deffn {데이터} errno.ELIBACC

Can not access a needed shared library – 필요한 공유 라이브러리에 액세스할 수 없습니다.
@end deffn

@geindex ELIBBAD (errno 모듈)
@anchor{library/errno errno ELIBBAD}@anchor{32b2}
@deffn {데이터} errno.ELIBBAD

Accessing a corrupted shared library – 손상된 공유 라이브러리 액세스
@end deffn

@geindex ELIBSCN (errno 모듈)
@anchor{library/errno errno ELIBSCN}@anchor{32b3}
@deffn {데이터} errno.ELIBSCN

.lib section in a.out corrupted – 손상된 a.out의 .lib 섹션
@end deffn

@geindex ELIBMAX (errno 모듈)
@anchor{library/errno errno ELIBMAX}@anchor{32b4}
@deffn {데이터} errno.ELIBMAX

Attempting to link in too many shared libraries – 너무 많은 공유 라이브러리 연결 시도
@end deffn

@geindex ELIBEXEC (errno 모듈)
@anchor{library/errno errno ELIBEXEC}@anchor{32b5}
@deffn {데이터} errno.ELIBEXEC

Cannot exec a shared library directly – 공유 라이브러리를 직접 실행할 수 없습니다
@end deffn

@geindex EILSEQ (errno 모듈)
@anchor{library/errno errno EILSEQ}@anchor{32b6}
@deffn {데이터} errno.EILSEQ

Illegal byte sequence – 잘못된 바이트 시퀀스
@end deffn

@geindex ERESTART (errno 모듈)
@anchor{library/errno errno ERESTART}@anchor{32b7}
@deffn {데이터} errno.ERESTART

Interrupted system call should be restarted – 중단된 시스템 호출을 다시 시작해야 합니다
@end deffn

@geindex ESTRPIPE (errno 모듈)
@anchor{library/errno errno ESTRPIPE}@anchor{32b8}
@deffn {데이터} errno.ESTRPIPE

Streams pipe error – 스트림 파이프 에러
@end deffn

@geindex EUSERS (errno 모듈)
@anchor{library/errno errno EUSERS}@anchor{32b9}
@deffn {데이터} errno.EUSERS

Too many users – 사용자가 너무 많습니다
@end deffn

@geindex ENOTSOCK (errno 모듈)
@anchor{library/errno errno ENOTSOCK}@anchor{32ba}
@deffn {데이터} errno.ENOTSOCK

Socket operation on non-socket – 비 소켓에 대한 소켓 연산
@end deffn

@geindex EDESTADDRREQ (errno 모듈)
@anchor{library/errno errno EDESTADDRREQ}@anchor{32bb}
@deffn {데이터} errno.EDESTADDRREQ

Destination address required – 목적지 주소가 필요합니다
@end deffn

@geindex EMSGSIZE (errno 모듈)
@anchor{library/errno errno EMSGSIZE}@anchor{32bc}
@deffn {데이터} errno.EMSGSIZE

Message too long – 메시지가 너무 깁니다
@end deffn

@geindex EPROTOTYPE (errno 모듈)
@anchor{library/errno errno EPROTOTYPE}@anchor{32bd}
@deffn {데이터} errno.EPROTOTYPE

Protocol wrong type for socket – 소켓에 대한 프로토콜 유형이 잘못되었습니다
@end deffn

@geindex ENOPROTOOPT (errno 모듈)
@anchor{library/errno errno ENOPROTOOPT}@anchor{32be}
@deffn {데이터} errno.ENOPROTOOPT

Protocol not available – 프로토콜을 사용할 수 없습니다
@end deffn

@geindex EPROTONOSUPPORT (errno 모듈)
@anchor{library/errno errno EPROTONOSUPPORT}@anchor{32bf}
@deffn {데이터} errno.EPROTONOSUPPORT

Protocol not supported – 지원되지 않는 프로토콜
@end deffn

@geindex ESOCKTNOSUPPORT (errno 모듈)
@anchor{library/errno errno ESOCKTNOSUPPORT}@anchor{32c0}
@deffn {데이터} errno.ESOCKTNOSUPPORT

Socket type not supported – 지원되지 않는 소켓 유형
@end deffn

@geindex EOPNOTSUPP (errno 모듈)
@anchor{library/errno errno EOPNOTSUPP}@anchor{32c1}
@deffn {데이터} errno.EOPNOTSUPP

Operation not supported on transport endpoint – 트랜스포트 끝점에서 지원되지 않는 연산
@end deffn

@geindex ENOTSUP (errno 모듈)
@anchor{library/errno errno ENOTSUP}@anchor{32c2}
@deffn {데이터} errno.ENOTSUP

Operation not supported – 지원되지 않는 연산


Added in version 3.2.

@end deffn

@geindex EPFNOSUPPORT (errno 모듈)
@anchor{library/errno errno EPFNOSUPPORT}@anchor{32c3}
@deffn {데이터} errno.EPFNOSUPPORT

Protocol family not supported – 지원되지 않는 프로토콜 패밀리
@end deffn

@geindex EAFNOSUPPORT (errno 모듈)
@anchor{library/errno errno EAFNOSUPPORT}@anchor{32c4}
@deffn {데이터} errno.EAFNOSUPPORT

Address family not supported by protocol – 프로토콜이 지원하지 않는 주소 패밀리
@end deffn

@geindex EADDRINUSE (errno 모듈)
@anchor{library/errno errno EADDRINUSE}@anchor{32c5}
@deffn {데이터} errno.EADDRINUSE

Address already in use – 이미 사용 중인 주소
@end deffn

@geindex EADDRNOTAVAIL (errno 모듈)
@anchor{library/errno errno EADDRNOTAVAIL}@anchor{32c6}
@deffn {데이터} errno.EADDRNOTAVAIL

Cannot assign requested address – 요청된 주소를 할당할 수 없습니다.
@end deffn

@geindex ENETDOWN (errno 모듈)
@anchor{library/errno errno ENETDOWN}@anchor{32c7}
@deffn {데이터} errno.ENETDOWN

Network is down – 네트워크가 다운되었습니다
@end deffn

@geindex ENETUNREACH (errno 모듈)
@anchor{library/errno errno ENETUNREACH}@anchor{1de6}
@deffn {데이터} errno.ENETUNREACH

Network is unreachable – 네트워크에 도달할 수 없습니다
@end deffn

@geindex ENETRESET (errno 모듈)
@anchor{library/errno errno ENETRESET}@anchor{32c8}
@deffn {데이터} errno.ENETRESET

Network dropped connection because of reset – 재설정으로 인해 네트워크 연결이 끊겼습니다
@end deffn

@geindex ECONNABORTED (errno 모듈)
@anchor{library/errno errno ECONNABORTED}@anchor{270b}
@deffn {데이터} errno.ECONNABORTED

Software caused connection abort – 소프트웨어로 인해 연결이 중단되었습니다. 이 에러는 예외 @ref{125c,,ConnectionAbortedError}로 매핑됩니다.
@end deffn

@geindex ECONNRESET (errno 모듈)
@anchor{library/errno errno ECONNRESET}@anchor{270d}
@deffn {데이터} errno.ECONNRESET

Connection reset by peer – 피어에 의한 연결 재설정. 이 에러는 예외 @ref{125e,,ConnectionResetError}로 매핑됩니다.
@end deffn

@geindex ENOBUFS (errno 모듈)
@anchor{library/errno errno ENOBUFS}@anchor{1b6f}
@deffn {데이터} errno.ENOBUFS

No buffer space available – 사용 가능한 버퍼 공간이 없습니다.
@end deffn

@geindex EISCONN (errno 모듈)
@anchor{library/errno errno EISCONN}@anchor{32c9}
@deffn {데이터} errno.EISCONN

Transport endpoint is already connected – 트랜스포트 끝점이 이미 연결되어 있습니다.
@end deffn

@geindex ENOTCONN (errno 모듈)
@anchor{library/errno errno ENOTCONN}@anchor{32ca}
@deffn {데이터} errno.ENOTCONN

Transport endpoint is not connected – 트랜스포트 끝점이 연결되어 있지 않습니다.
@end deffn

@geindex ESHUTDOWN (errno 모듈)
@anchor{library/errno errno ESHUTDOWN}@anchor{270a}
@deffn {데이터} errno.ESHUTDOWN

Cannot send after transport endpoint shutdown – 트랜스포트 끝점 종료 후에 보낼 수 없습니다. 이 에러는 예외 @ref{125b,,BrokenPipeError}로 매핑됩니다.
@end deffn

@geindex ETOOMANYREFS (errno 모듈)
@anchor{library/errno errno ETOOMANYREFS}@anchor{32cb}
@deffn {데이터} errno.ETOOMANYREFS

Too many references: cannot splice – 참조가 너무 많습니다: 연결할 수 없습니다
@end deffn

@geindex ETIMEDOUT (errno 모듈)
@anchor{library/errno errno ETIMEDOUT}@anchor{2714}
@deffn {데이터} errno.ETIMEDOUT

Connection timed out – 연결 시간이 초과하였습니다. 이 에러는 예외 @ref{a36,,TimeoutError}로 매핑됩니다.
@end deffn

@geindex ECONNREFUSED (errno 모듈)
@anchor{library/errno errno ECONNREFUSED}@anchor{270c}
@deffn {데이터} errno.ECONNREFUSED

Connection refused – 연결이 거부되었습니다. 이 에러는 예외 @ref{125d,,ConnectionRefusedError}로 매핑됩니다.
@end deffn

@geindex EHOSTDOWN (errno 모듈)
@anchor{library/errno errno EHOSTDOWN}@anchor{32cc}
@deffn {데이터} errno.EHOSTDOWN

Host is down – 호스트가 다운되었습니다
@end deffn

@geindex EHOSTUNREACH (errno 모듈)
@anchor{library/errno errno EHOSTUNREACH}@anchor{32cd}
@deffn {데이터} errno.EHOSTUNREACH

No route to host – 호스트로 가는 길이 없습니다
@end deffn

@geindex EHWPOISON (errno 모듈)
@anchor{library/errno errno EHWPOISON}@anchor{20b}
@deffn {데이터} errno.EHWPOISON

Memory page has hardware error.


Added in version 3.14.

@end deffn

@geindex EALREADY (errno 모듈)
@anchor{library/errno errno EALREADY}@anchor{2704}
@deffn {데이터} errno.EALREADY

Operation already in progress – 이미 진행 중인 연산. 이 에러는 예외 @ref{235,,BlockingIOError}로 매핑됩니다.
@end deffn

@geindex EINPROGRESS (errno 모듈)
@anchor{library/errno errno EINPROGRESS}@anchor{2706}
@deffn {데이터} errno.EINPROGRESS

Operation now in progress – 이제 연산이 진행 중입니다. 이 에러는 예외 @ref{235,,BlockingIOError}로 매핑됩니다.
@end deffn

@geindex ESTALE (errno 모듈)
@anchor{library/errno errno ESTALE}@anchor{32ce}
@deffn {데이터} errno.ESTALE

Stale NFS file handle – 오래된 NFS 파일 핸들
@end deffn

@geindex EUCLEAN (errno 모듈)
@anchor{library/errno errno EUCLEAN}@anchor{32cf}
@deffn {데이터} errno.EUCLEAN

Structure needs cleaning – 구조 청소 필요
@end deffn

@geindex ENOTNAM (errno 모듈)
@anchor{library/errno errno ENOTNAM}@anchor{32d0}
@deffn {데이터} errno.ENOTNAM

Not a XENIX named type file – XENIX 이름 붙은 형식 파일이 아닙니다
@end deffn

@geindex ENAVAIL (errno 모듈)
@anchor{library/errno errno ENAVAIL}@anchor{32d1}
@deffn {데이터} errno.ENAVAIL

No XENIX semaphores available – 사용할 수 있는 XENIX 세마포어가 없습니다
@end deffn

@geindex EISNAM (errno 모듈)
@anchor{library/errno errno EISNAM}@anchor{32d2}
@deffn {데이터} errno.EISNAM

Is a named type file – 이름 붙은 형식 파일입니다
@end deffn

@geindex EREMOTEIO (errno 모듈)
@anchor{library/errno errno EREMOTEIO}@anchor{32d3}
@deffn {데이터} errno.EREMOTEIO

Remote I/O error – 원격 I/O 에러
@end deffn

@geindex EDQUOT (errno 모듈)
@anchor{library/errno errno EDQUOT}@anchor{32d4}
@deffn {데이터} errno.EDQUOT

Quota exceeded – 할당량 초과
@end deffn

@geindex EQFULL (errno 모듈)
@anchor{library/errno errno EQFULL}@anchor{32d5}
@deffn {데이터} errno.EQFULL

Interface output queue is full


Added in version 3.11.

@end deffn

@geindex ENOMEDIUM (errno 모듈)
@anchor{library/errno errno ENOMEDIUM}@anchor{32d6}
@deffn {데이터} errno.ENOMEDIUM

No medium found
@end deffn

@geindex EMEDIUMTYPE (errno 모듈)
@anchor{library/errno errno EMEDIUMTYPE}@anchor{32d7}
@deffn {데이터} errno.EMEDIUMTYPE

Wrong medium type
@end deffn

@geindex ENOKEY (errno 모듈)
@anchor{library/errno errno ENOKEY}@anchor{32d8}
@deffn {데이터} errno.ENOKEY

Required key not available
@end deffn

@geindex EKEYEXPIRED (errno 모듈)
@anchor{library/errno errno EKEYEXPIRED}@anchor{32d9}
@deffn {데이터} errno.EKEYEXPIRED

Key has expired
@end deffn

@geindex EKEYREVOKED (errno 모듈)
@anchor{library/errno errno EKEYREVOKED}@anchor{32da}
@deffn {데이터} errno.EKEYREVOKED

Key has been revoked
@end deffn

@geindex EKEYREJECTED (errno 모듈)
@anchor{library/errno errno EKEYREJECTED}@anchor{32db}
@deffn {데이터} errno.EKEYREJECTED

Key was rejected by service
@end deffn

@geindex ERFKILL (errno 모듈)
@anchor{library/errno errno ERFKILL}@anchor{32dc}
@deffn {데이터} errno.ERFKILL

Operation not possible due to RF-kill
@end deffn

@geindex ELOCKUNMAPPED (errno 모듈)
@anchor{library/errno errno ELOCKUNMAPPED}@anchor{32dd}
@deffn {데이터} errno.ELOCKUNMAPPED

Locked lock was unmapped
@end deffn

@geindex ENOTACTIVE (errno 모듈)
@anchor{library/errno errno ENOTACTIVE}@anchor{32de}
@deffn {데이터} errno.ENOTACTIVE

Facility is not active
@end deffn

@geindex EAUTH (errno 모듈)
@anchor{library/errno errno EAUTH}@anchor{32df}
@deffn {데이터} errno.EAUTH

Authentication error


Added in version 3.2.

@end deffn

@geindex EBADARCH (errno 모듈)
@anchor{library/errno errno EBADARCH}@anchor{32e0}
@deffn {데이터} errno.EBADARCH

Bad CPU type in executable


Added in version 3.2.

@end deffn

@geindex EBADEXEC (errno 모듈)
@anchor{library/errno errno EBADEXEC}@anchor{32e1}
@deffn {데이터} errno.EBADEXEC

Bad executable (or shared library)


Added in version 3.2.

@end deffn

@geindex EBADMACHO (errno 모듈)
@anchor{library/errno errno EBADMACHO}@anchor{32e2}
@deffn {데이터} errno.EBADMACHO

Malformed Mach-o file


Added in version 3.2.

@end deffn

@geindex EDEVERR (errno 모듈)
@anchor{library/errno errno EDEVERR}@anchor{32e3}
@deffn {데이터} errno.EDEVERR

Device error


Added in version 3.2.

@end deffn

@geindex EFTYPE (errno 모듈)
@anchor{library/errno errno EFTYPE}@anchor{32e4}
@deffn {데이터} errno.EFTYPE

Inappropriate file type or format


Added in version 3.2.

@end deffn

@geindex ENEEDAUTH (errno 모듈)
@anchor{library/errno errno ENEEDAUTH}@anchor{32e5}
@deffn {데이터} errno.ENEEDAUTH

Need authenticator


Added in version 3.2.

@end deffn

@geindex ENOATTR (errno 모듈)
@anchor{library/errno errno ENOATTR}@anchor{32e6}
@deffn {데이터} errno.ENOATTR

Attribute not found


Added in version 3.2.

@end deffn

@geindex ENOPOLICY (errno 모듈)
@anchor{library/errno errno ENOPOLICY}@anchor{32e7}
@deffn {데이터} errno.ENOPOLICY

Policy not found


Added in version 3.2.

@end deffn

@geindex EPROCLIM (errno 모듈)
@anchor{library/errno errno EPROCLIM}@anchor{32e8}
@deffn {데이터} errno.EPROCLIM

Too many processes


Added in version 3.2.

@end deffn

@geindex EPROCUNAVAIL (errno 모듈)
@anchor{library/errno errno EPROCUNAVAIL}@anchor{32e9}
@deffn {데이터} errno.EPROCUNAVAIL

Bad procedure for program


Added in version 3.2.

@end deffn

@geindex EPROGMISMATCH (errno 모듈)
@anchor{library/errno errno EPROGMISMATCH}@anchor{32ea}
@deffn {데이터} errno.EPROGMISMATCH

Program version wrong


Added in version 3.2.

@end deffn

@geindex EPROGUNAVAIL (errno 모듈)
@anchor{library/errno errno EPROGUNAVAIL}@anchor{32eb}
@deffn {데이터} errno.EPROGUNAVAIL

RPC prog. not avail


Added in version 3.2.

@end deffn

@geindex EPWROFF (errno 모듈)
@anchor{library/errno errno EPWROFF}@anchor{32ec}
@deffn {데이터} errno.EPWROFF

Device power is off


Added in version 3.2.

@end deffn

@geindex EBADRPC (errno 모듈)
@anchor{library/errno errno EBADRPC}@anchor{32ed}
@deffn {데이터} errno.EBADRPC

RPC struct is bad


Added in version 3.2.

@end deffn

@geindex ERPCMISMATCH (errno 모듈)
@anchor{library/errno errno ERPCMISMATCH}@anchor{32ee}
@deffn {데이터} errno.ERPCMISMATCH

RPC version wrong


Added in version 3.2.

@end deffn

@geindex ESHLIBVERS (errno 모듈)
@anchor{library/errno errno ESHLIBVERS}@anchor{32ef}
@deffn {데이터} errno.ESHLIBVERS

Shared library version mismatch


Added in version 3.2.

@end deffn

@geindex ENOTCAPABLE (errno 모듈)
@anchor{library/errno errno ENOTCAPABLE}@anchor{1b3d}
@deffn {데이터} errno.ENOTCAPABLE

Capabilities insufficient. This error is mapped to the exception
@ref{f3d,,PermissionError}.

@ref{213c,,가용성}: WASI, FreeBSD


Added in version 3.11.1.

@end deffn

@geindex ECANCELED (errno 모듈)
@anchor{library/errno errno ECANCELED}@anchor{17c8}
@deffn {데이터} errno.ECANCELED

Operation canceled


Added in version 3.2.

@end deffn

@geindex EOWNERDEAD (errno 모듈)
@anchor{library/errno errno EOWNERDEAD}@anchor{32f0}
@deffn {데이터} errno.EOWNERDEAD

Owner died


Added in version 3.2.

@end deffn

@geindex ENOTRECOVERABLE (errno 모듈)
@anchor{library/errno errno ENOTRECOVERABLE}@anchor{32f1}
@deffn {데이터} errno.ENOTRECOVERABLE

State not recoverable


Added in version 3.2.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node ctypes — A foreign function library for Python,,errno — 표준 errno 시스템 기호,일반 운영 체제 서비스
@anchor{library/ctypes doc}@anchor{32f2}@anchor{library/ctypes ctypes-a-foreign-function-library-for-python}@anchor{32f3}@anchor{library/ctypes module-ctypes}@anchor{2e}@anchor{library/ctypes translation-repo}@anchor{32f4}
@subsection @code{ctypes} — A foreign function library for Python


@geindex module; ctypes

`Source code:' Lib/ctypes@footnote{https://github.com/python/cpython/tree/3.14/Lib/ctypes}


__________________________________________________________________


@code{ctypes} is a foreign function library for Python.  It provides C compatible
data types, and allows calling functions in DLLs or shared libraries.  It can be
used to wrap these libraries in pure Python.

This is an @ref{2157,,optional module}.
If it is missing from your copy of CPython,
look for documentation from your distributor (that is,
whoever provided Python to you).
If you are the distributor, see @ref{2155,,Requirements for optional modules}.

@c Similar notes appear in the docs of the modules:
@c - zipfile
@c - tarfile

@menu
* ctypes 자습서:: 
* ctypes 레퍼런스:: 

@end menu

@node ctypes 자습서,ctypes 레퍼런스,,ctypes — A foreign function library for Python
@anchor{library/ctypes ctypes-ctypes-tutorial}@anchor{32f5}@anchor{library/ctypes ctypes-tutorial}@anchor{32f6}
@subsubsection ctypes 자습서


참고: 일부 코드 예제는 ctypes @ref{32f7,,c_int} 형을 참조합니다. @code{sizeof(long) == sizeof(int)}인 플랫폼에서, 이는 @ref{32f8,,c_long}의 별칭입니다. 따라서 @code{c_int}를 기대할 때 @code{c_long}가 인쇄되더라도 혼란스러워하지 않아도 됩니다 — 이것들은 실제로 같은 형입니다.

@menu
* 동적 링크 라이브러리 로드하기:: 
* 로드된 dll에서 함수에 액세스하기:: 
* 함수 호출하기:: 
* 기본 데이터형:: 
* 함수 호출하기@comma{} 계속: 함수 호출하기 계속. 
* Calling variadic functions:: 
* 사용자 정의 데이터형을 사용하여 함수 호출하기:: 
* 필수 인자 형 (함수 프로토타입) 지정하기: 필수 인자 형 함수 프로토타입 지정하기. 
* 반환형:: 
* 포인터 전달하기 (또는; 참조로 매개 변수 전달하기): 포인터 전달하기 또는 참조로 매개 변수 전달하기. 
* 구조체와 공용체:: 
* Structure/union layout@comma{} alignment and byte order: Structure/union layout alignment and byte order. 
* 구조체와 공용체의 비트 필드:: 
* 배열:: 
* 포인터:: 
* Thread safety without the GIL:: 
* 형 변환:: 
* 불완전한 형:: 
* 콜백 함수:: 
* dll에서 내 보낸 값을 액세스하기:: 
* 의외의 것들:: 
* 가변 크기 데이터형:: 

@end menu

@node 동적 링크 라이브러리 로드하기,로드된 dll에서 함수에 액세스하기,,ctypes 자습서
@anchor{library/ctypes ctypes-loading-dynamic-link-libraries}@anchor{32f9}@anchor{library/ctypes loading-dynamic-link-libraries}@anchor{32fa}
@subsubsection 동적 링크 라이브러리 로드하기


@code{ctypes} exports the @ref{32fb,,cdll}, and on Windows
@ref{32fc,,windll} and @ref{32fd,,oledll}
objects, for loading dynamic link libraries.

You load libraries by accessing them as attributes of these objects.
@code{cdll} loads libraries which export functions using the
standard @code{cdecl} calling convention, while @code{windll}
libraries call functions using the @code{stdcall}
calling convention.
@ref{32fd,,oledll} also uses the @code{stdcall} calling convention, and
assumes the functions return a Windows @code{HRESULT} error code. The error
code is used to automatically raise an @ref{2c0,,OSError} exception when the
function call fails.


버전 3.3에서 변경: 윈도우 에러는 @ref{1254,,WindowsError}를 일으켜왔습니다. 이제는 @ref{2c0,,OSError}의 별칭입니다.


Here are some examples for Windows. Note that @code{msvcrt} is the MS standard C
library containing most standard C functions, and uses the @code{cdecl} calling
convention:

@example
>>> from ctypes import *
>>> print(windll.kernel32)
<WinDLL 'kernel32', handle ... at ...>
>>> print(cdll.msvcrt)
<CDLL 'msvcrt', handle ... at ...>
>>> libc = cdll.msvcrt
>>>
@end example

윈도우는 일반적인 @code{.dll} 파일 접미사를 자동으로 추가합니다.

@cartouche
@quotation 참고 
@code{cdll.msvcrt}를 통해 표준 C 라이브러리에 액세스하면 파이썬에서 사용되는 라이브러리와 호환되지 않는 오래된 라이브러리 버전이 사용됩니다. 가능하면 파이썬 자체의 기능을 사용하거나, @code{msvcrt} 모듈을 임포트 해서 사용하십시오.
@end quotation
@end cartouche

Other systems require the filename `including' the extension to
load a library, so attribute access can not be used to load libraries. Either the
@ref{32fe,,LoadLibrary()} method of the dll loaders should be used,
or you should load the library by creating an instance of @ref{bdb,,CDLL}
by calling the constructor.

For example, on Linux:

@example
>>> cdll.LoadLibrary("libc.so.6")
<CDLL 'libc.so.6', handle ... at ...>
>>> libc = CDLL("libc.so.6")
>>> libc
<CDLL 'libc.so.6', handle ... at ...>
>>>
@end example

On macOS:

@example
>>> cdll.LoadLibrary("libc.dylib")
<CDLL 'libc.dylib', handle ... at ...>
>>> libc = CDLL("libc.dylib")
>>> libc
<CDLL 'libc.dylib', handle ... at ...>
@end example

@node 로드된 dll에서 함수에 액세스하기,함수 호출하기,동적 링크 라이브러리 로드하기,ctypes 자습서
@anchor{library/ctypes accessing-functions-from-loaded-dlls}@anchor{32ff}@anchor{library/ctypes ctypes-accessing-functions-from-loaded-dlls}@anchor{3300}
@subsubsection 로드된 dll에서 함수에 액세스하기


함수는 dll 객체의 어트리뷰트로 액세스 됩니다:

@example
>>> libc.printf
<_FuncPtr object at 0x...>
>>> print(windll.kernel32.GetModuleHandleA)
<_FuncPtr object at 0x...>
>>> print(windll.kernel32.MyOwnFunction)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "ctypes.py", line 239, in __getattr__
    func = _StdcallFuncPtr(name, self)
AttributeError: function 'MyOwnFunction' not found
>>>
@end example

Note that win32 system dlls like @code{kernel32} and @code{user32} often export ANSI
as well as UNICODE versions of a function. The UNICODE version is exported with
a @code{W} appended to the name, while the ANSI version is exported with an @code{A}
appended to the name. The win32 @code{GetModuleHandle} function, which returns a
`module handle' for a given module name, has the following C prototype, and a
macro is used to expose one of them as @code{GetModuleHandle} depending on whether
UNICODE is defined or not:

@example
/* ANSI version */
HMODULE GetModuleHandleA(LPCSTR lpModuleName);
/* UNICODE version */
HMODULE GetModuleHandleW(LPCWSTR lpModuleName);
@end example

`windll'는 마술적으로 이 중 하나를 선택하려고 하지 않으므로, @code{GetModuleHandleA} 나 @code{GetModuleHandleW}를 명시적으로 지정하여 필요한 버전에 액세스해야 하고, 그런 다음 각각 바이트열이나 문자열 객체로 호출해야 합니다.

때때로, dll은 @code{"??2@@YAPAXI@@Z"}와 같은 유효한 파이썬 식별자가 아닌 이름으로 함수를 내보냅니다. 이때는 @ref{dc9,,getattr()}를 사용하여 함수를 조회해야 합니다:

@example
>>> getattr(cdll.msvcrt, "??2@@YAPAXI@@Z")
<_FuncPtr object at 0x...>
>>>
@end example

윈도우에서, 일부 dll은 이름이 아니라 서수(ordinal)로 함수를 내보냅니다. 이 함수는 서수로 dll 객체를 인덱싱하여 액세스할 수 있습니다:

@example
>>> cdll.kernel32[1]
<_FuncPtr object at 0x...>
>>> cdll.kernel32[0]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "ctypes.py", line 310, in __getitem__
    func = _StdcallFuncPtr(name, self)
AttributeError: function ordinal 0 not found
>>>
@end example

@node 함수 호출하기,기본 데이터형,로드된 dll에서 함수에 액세스하기,ctypes 자습서
@anchor{library/ctypes calling-functions}@anchor{3301}@anchor{library/ctypes ctypes-calling-functions}@anchor{3302}
@subsubsection 함수 호출하기


You can call these functions like any other Python callable. This example uses
the @code{rand()} function, which takes no arguments and returns a pseudo-random integer:

@example
>>> print(libc.rand())
1804289383
@end example

On Windows, you can call the @code{GetModuleHandleA()} function, which returns a win32 module
handle (passing @code{None} as single argument to call it with a @code{NULL} pointer):

@example
>>> print(hex(windll.kernel32.GetModuleHandleA(None)))
0x1d000000
>>>
@end example

@code{cdecl} 호출 규칙을 사용하여 @code{stdcall} 함수를 호출하면 @ref{2ec,,ValueError}가 발생하고, 그 반대도 마찬가지입니다:

@example
>>> cdll.kernel32.GetModuleHandleA(None)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: Procedure probably called with not enough arguments (4 bytes missing)
>>>

>>> windll.msvcrt.printf(b"spam")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: Procedure probably called with too many arguments (4 bytes in excess)
>>>
@end example

올바른 호출 규칙을 찾으려면 C 헤더 파일이나 호출할 함수에 대한 설명서를 살펴봐야 합니다.

On Windows, @code{ctypes} uses win32 structured exception handling to prevent
crashes from general protection faults when functions are called with invalid
argument values:

@example
>>> windll.kernel32.GetModuleHandleA(32)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OSError: exception: access violation reading 0x00000020
>>>
@end example

There are, however, enough ways to crash Python with @code{ctypes}, so you
should be careful anyway.  The @ref{5c,,faulthandler} module can be helpful in
debugging crashes (e.g. from segmentation faults produced by erroneous C library
calls).

@code{None}, integers, bytes objects and (unicode) strings are the only native
Python objects that can directly be used as parameters in these function calls.
@code{None} is passed as a C @code{NULL} pointer, bytes objects and strings are passed
as pointer to the memory block that contains their data (char* or
wchar_t*).  Python integers are passed as the platform’s default C
int type, their value is masked to fit into the C type.

Before we move on calling functions with other parameter types, we have to learn
more about @code{ctypes} data types.

@node 기본 데이터형,함수 호출하기 계속,함수 호출하기,ctypes 자습서
@anchor{library/ctypes ctypes-fundamental-data-types}@anchor{283f}@anchor{library/ctypes fundamental-data-types}@anchor{3303}
@subsubsection 기본 데이터형


@code{ctypes} defines a number of primitive C compatible data types:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

ctypes 형

@tab

C 형

@tab

파이썬 형

@tab

@ref{3304,,_type_}

@item

@ref{3305,,c_bool}

@tab

_Bool

@tab

@ref{3c3,,bool}

@tab

@code{'?'}

@item

@ref{3306,,c_char}

@tab

char

@tab

1-character @ref{192,,bytes}

@tab

@code{'c'}

@item

@ref{3307,,c_wchar}

@tab

@code{wchar_t}

@tab

1-character @ref{169,,str}

@tab

@code{'u'}

@item

@ref{1ade,,c_byte}

@tab

char

@tab

@ref{19b,,int}

@tab

@code{'b'}

@item

@ref{1adf,,c_ubyte}

@tab

unsigned char

@tab

@ref{19b,,int}

@tab

@code{'B'}

@item

@ref{3308,,c_short}

@tab

short

@tab

@ref{19b,,int}

@tab

@code{'h'}

@item

@ref{3309,,c_ushort}

@tab

unsigned short

@tab

@ref{19b,,int}

@tab

@code{'H'}

@item

@ref{32f7,,c_int}

@tab

int

@tab

@ref{19b,,int}

@tab

@code{'i'} *

@item

@ref{330a,,c_int8}

@tab

@code{int8_t}

@tab

@ref{19b,,int}

@tab

*

@item

@ref{330b,,c_int16}

@tab

@code{int16_t}

@tab

@ref{19b,,int}

@tab

*

@item

@ref{330c,,c_int32}

@tab

@code{int32_t}

@tab

@ref{19b,,int}

@tab

*

@item

@ref{330d,,c_int64}

@tab

@code{int64_t}

@tab

@ref{19b,,int}

@tab

*

@item

@ref{330e,,c_uint}

@tab

unsigned int

@tab

@ref{19b,,int}

@tab

@code{'I'} *

@item

@ref{330f,,c_uint8}

@tab

@code{uint8_t}

@tab

@ref{19b,,int}

@tab

*

@item

@ref{3310,,c_uint16}

@tab

@code{uint16_t}

@tab

@ref{19b,,int}

@tab

*

@item

@ref{3311,,c_uint32}

@tab

@code{uint32_t}

@tab

@ref{19b,,int}

@tab

*

@item

@ref{3312,,c_uint64}

@tab

@code{uint64_t}

@tab

@ref{19b,,int}

@tab

*

@item

@ref{32f8,,c_long}

@tab

long

@tab

@ref{19b,,int}

@tab

@code{'l'}

@item

@ref{3313,,c_ulong}

@tab

unsigned long

@tab

@ref{19b,,int}

@tab

@code{'L'}

@item

@ref{3314,,c_longlong}

@tab

long long

@tab

@ref{19b,,int}

@tab

@code{'q'} *

@item

@ref{3315,,c_ulonglong}

@tab

unsigned long long

@tab

@ref{19b,,int}

@tab

@code{'Q'} *

@item

@ref{3316,,c_size_t}

@tab

@code{size_t}

@tab

@ref{19b,,int}

@tab

*

@item

@ref{1441,,c_ssize_t}

@tab

@ref{c54,,Py_ssize_t}

@tab

@ref{19b,,int}

@tab

*

@item

@ref{1b61,,c_time_t}

@tab

@code{time_t}

@tab

@ref{19b,,int}

@tab

*

@item

@ref{3317,,c_float}

@tab

float

@tab

@ref{196,,float}

@tab

@code{'f'}

@item

@ref{1cb5,,c_double}

@tab

double

@tab

@ref{196,,float}

@tab

@code{'d'}

@item

@ref{1cb6,,c_longdouble}

@tab

long double

@tab

@ref{196,,float}

@tab

@code{'g'} *

@item

@ref{1a57,,c_char_p}

@tab

char* (NUL terminated)

@tab

@ref{192,,bytes} or @code{None}

@tab

@code{'z'}

@item

@ref{1a58,,c_wchar_p}

@tab

wchar_t* (NUL terminated)

@tab

@ref{169,,str} or @code{None}

@tab

@code{'Z'}

@item

@ref{1a59,,c_void_p}

@tab

void*

@tab

@ref{19b,,int} or @code{None}

@tab

@code{'P'}

@item

@ref{1f3,,py_object}

@tab

@ref{5dc,,PyObject}*

@tab

@ref{c7d,,object}

@tab

@code{'O'}

@item

@ref{3318,,VARIANT_BOOL}

@tab

short int

@tab

@ref{3c3,,bool}

@tab

@code{'v'}

@end multitable


Additionally, if IEC 60559 compatible complex arithmetic (Annex G) is supported
in both C and @code{libffi}, the following complex types are available:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

ctypes 형

@tab

C 형

@tab

파이썬 형

@tab

@ref{3304,,_type_}

@item

@ref{1ed,,c_float_complex}

@tab

float complex

@tab

@ref{197,,complex}

@tab

@code{'F'}

@item

@ref{1ee,,c_double_complex}

@tab

double complex

@tab

@ref{197,,complex}

@tab

@code{'D'}

@item

@ref{1ef,,c_longdouble_complex}

@tab

long double complex

@tab

@ref{197,,complex}

@tab

@code{'G'}

@end multitable


이 모든 형은 올바른 형과 값의 선택적 초기화자로 호출해서 만들어질 수 있습니다:

@example
>>> c_int()
c_long(0)
>>> c_wchar_p("Hello, World")
c_wchar_p(140018365411392)
>>> c_ushort(-3)
c_ushort(65533)
>>>
@end example

The constructors for numeric types will convert input using
@ref{14da,,__bool__()},
@ref{19e,,__index__()} (for @code{int}),
@ref{bc0,,__float__()} or @ref{7fc,,__complex__()}.
This means @ref{3305,,c_bool} accepts any object with a truth value:

@example
>>> empty_list = []
>>> c_bool(empty_list)
c_bool(False)
@end example

이러한 형은 가변이므로, 값을 나중에 변경할 수도 있습니다:

@example
>>> i = c_int(42)
>>> print(i)
c_long(42)
>>> print(i.value)
42
>>> i.value = -99
>>> print(i.value)
-99
>>>
@end example

Assigning a new value to instances of the pointer types @ref{1a57,,c_char_p},
@ref{1a58,,c_wchar_p}, and @ref{1a59,,c_void_p} changes the `memory location' they
point to, `not the contents' of the memory block (of course not, because Python
string objects are immutable):

@example
>>> s = "Hello, World"
>>> c_s = c_wchar_p(s)
>>> print(c_s)
c_wchar_p(139966785747344)
>>> print(c_s.value)
Hello World
>>> c_s.value = "Hi, there"
>>> print(c_s)              # the memory location has changed
c_wchar_p(139966783348904)
>>> print(c_s.value)
Hi, there
>>> print(s)                # first object is unchanged
Hello, World
>>>
@end example

그러나, 이것들을 가변 메모리에 대한 포인터를 예상하는 함수에 전달하지 않도록 주의해야 합니다. 가변 메모리 블록이 필요하다면, ctypes에는 다양한 방법으로 이를 만드는 @ref{3319,,create_string_buffer()} 함수가 있습니다. 현재 메모리 블록 내용은 @code{raw} 프로퍼티를 사용하여 액세스(또는 변경)할 수 있습니다; NUL 종료 문자열로 액세스하려면 @code{value} 프로퍼티를 사용하십시오:

@example
>>> from ctypes import *
>>> p = create_string_buffer(3)            # create a 3 byte buffer, initialized to NUL bytes
>>> print(sizeof(p), repr(p.raw))
3 b'\x00\x00\x00'
>>> p = create_string_buffer(b"Hello")     # create a buffer containing a NUL terminated string
>>> print(sizeof(p), repr(p.raw))
6 b'Hello\x00'
>>> print(repr(p.value))
b'Hello'
>>> p = create_string_buffer(b"Hello", 10) # create a 10 byte buffer
>>> print(sizeof(p), repr(p.raw))
10 b'Hello\x00\x00\x00\x00\x00'
>>> p.value = b"Hi"
>>> print(sizeof(p), repr(p.raw))
10 b'Hi\x00lo\x00\x00\x00\x00\x00'
>>>
@end example

The @ref{3319,,create_string_buffer()} function replaces the old @code{c_buffer()}
function (which is still available as an alias).  To create a mutable memory
block containing unicode characters of the C type @code{wchar_t}, use the
@ref{1db1,,create_unicode_buffer()} function.

@node 함수 호출하기 계속,Calling variadic functions,기본 데이터형,ctypes 자습서
@anchor{library/ctypes calling-functions-continued}@anchor{331a}@anchor{library/ctypes ctypes-calling-functions-continued}@anchor{331b}
@subsubsection 함수 호출하기, 계속


printf는 @ref{ccc,,sys.stdout}이 `아니라' 실제 표준 출력으로 인쇄하므로, 이 예제는 콘솔 프롬프트에서만 작동하고 `IDLE' 이나 `PythonWin'에서는 작동하지 않음에 유의하십시오:

@example
>>> printf = libc.printf
>>> printf(b"Hello, %s\n", b"World!")
Hello, World!
14
>>> printf(b"Hello, %S\n", "World!")
Hello, World!
14
>>> printf(b"%d bottles of beer\n", 42)
42 bottles of beer
19
>>> printf(b"%f bottles of beer\n", 42.5)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ctypes.ArgumentError: argument 2: TypeError: Don't know how to convert parameter 2
>>>
@end example

As has been mentioned before, all Python types except integers, strings, and
bytes objects have to be wrapped in their corresponding @code{ctypes} type, so
that they can be converted to the required C data type:

@example
>>> printf(b"An int %d, a double %f\n", 1234, c_double(3.14))
An int 1234, a double 3.140000
31
>>>
@end example

@node Calling variadic functions,사용자 정의 데이터형을 사용하여 함수 호출하기,함수 호출하기 계속,ctypes 자습서
@anchor{library/ctypes calling-variadic-functions}@anchor{331c}@anchor{library/ctypes ctypes-calling-variadic-functions}@anchor{331d}
@subsubsection Calling variadic functions


On a lot of platforms calling variadic functions through ctypes is exactly the same
as calling functions with a fixed number of parameters. On some platforms, and in
particular ARM64 for Apple Platforms, the calling convention for variadic functions
is different than that for regular functions.

On those platforms it is required to specify the @ref{17c7,,argtypes}
attribute for the regular, non-variadic, function arguments:

@example
libc.printf.argtypes = [ctypes.c_char_p]
@end example

Because specifying the attribute does not inhibit portability it is advised to always
specify @ref{17c7,,argtypes} for all variadic functions.

@node 사용자 정의 데이터형을 사용하여 함수 호출하기,필수 인자 형 함수 프로토타입 지정하기,Calling variadic functions,ctypes 자습서
@anchor{library/ctypes calling-functions-with-your-own-custom-data-types}@anchor{331e}@anchor{library/ctypes ctypes-calling-functions-with-own-custom-data-types}@anchor{331f}
@subsubsection 사용자 정의 데이터형을 사용하여 함수 호출하기


You can also customize @code{ctypes} argument conversion to allow instances of
your own classes be used as function arguments. @code{ctypes} looks for an
@code{_as_parameter_} attribute and uses this as the function argument. The
attribute must be an integer, string, bytes, a @code{ctypes} instance, or an
object with an @code{_as_parameter_} attribute:

@example
>>> class Bottles:
...     def __init__(self, number):
...         self._as_parameter_ = number
...
>>> bottles = Bottles(42)
>>> printf(b"%d bottles of beer\n", bottles)
42 bottles of beer
19
>>>
@end example

If you don’t want to store the instance’s data in the @code{_as_parameter_}
instance variable, you could define a @ref{4b3,,property} which makes the
attribute available on request.

@node 필수 인자 형 함수 프로토타입 지정하기,반환형,사용자 정의 데이터형을 사용하여 함수 호출하기,ctypes 자습서
@anchor{library/ctypes ctypes-specifying-required-argument-types}@anchor{3320}@anchor{library/ctypes specifying-the-required-argument-types-function-prototypes}@anchor{3321}
@subsubsection 필수 인자 형 (함수 프로토타입) 지정하기


It is possible to specify the required argument types of functions exported from
DLLs by setting the @ref{17c7,,argtypes} attribute.

@ref{17c7,,argtypes} must be a sequence of C data types (the @code{printf()} function is
probably not a good example here, because it takes a variable number and
different types of parameters depending on the format string, on the other hand
this is quite handy to experiment with this feature):

@example
>>> printf.argtypes = [c_char_p, c_char_p, c_int, c_double]
>>> printf(b"String '%s', Int %d, Double %f\n", b"Hi", 10, 2.2)
String 'Hi', Int 10, Double 2.200000
37
>>>
@end example

포맷을 지정하면 호환되지 않는 인자 형으로부터 보호하고(C 함수의 프로토타입처럼), 유효한 형으로 인자를 변환하려고 시도합니다:

@example
>>> printf(b"%d %d %d", 1, 2, 3)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ctypes.ArgumentError: argument 2: TypeError: 'int' object cannot be interpreted as ctypes.c_char_p
>>> printf(b"%s %d %f\n", b"X", 2, 3)
X 2 3.000000
13
>>>
@end example

If you have defined your own classes which you pass to function calls, you have
to implement a @ref{3322,,from_param()} class method for them to be able to use them
in the @ref{17c7,,argtypes} sequence. The @code{from_param()} class method receives
the Python object passed to the function call, it should do a typecheck or
whatever is needed to make sure this object is acceptable, and then return the
object itself, its @code{_as_parameter_} attribute, or whatever you want to
pass as the C function argument in this case. Again, the result should be an
integer, string, bytes, a @code{ctypes} instance, or an object with an
@code{_as_parameter_} attribute.

@node 반환형,포인터 전달하기 또는 참조로 매개 변수 전달하기,필수 인자 형 함수 프로토타입 지정하기,ctypes 자습서
@anchor{library/ctypes ctypes-return-types}@anchor{3323}@anchor{library/ctypes return-types}@anchor{3324}
@subsubsection 반환형


@c from ctypes import CDLL, c_char, c_char_p
@c from ctypes.util import find_library
@c libc = CDLL(find_library('c'))
@c strchr = libc.strchr

By default functions are assumed to return the C int type.  Other
return types can be specified by setting the @ref{3325,,restype} attribute of the
function object.

The C prototype of @code{time()} is @code{time_t time(time_t *)}. Because @code{time_t}
might be of a different type than the default return type int, you should
specify the @code{restype} attribute:

@example
>>> libc.time.restype = c_time_t
@end example

The argument types can be specified using @ref{17c7,,argtypes}:

@example
>>> libc.time.argtypes = (POINTER(c_time_t),)
@end example

To call the function with a @code{NULL} pointer as first argument, use @code{None}:

@example
>>> print(libc.time(None))
1150640792
@end example

Here is a more advanced example, it uses the @code{strchr()} function, which expects
a string pointer and a char, and returns a pointer to a string:

@example
>>> strchr = libc.strchr
>>> strchr(b"abcdef", ord("d"))
8059983
>>> strchr.restype = c_char_p    # c_char_p is a pointer to a string
>>> strchr(b"abcdef", ord("d"))
b'def'
>>> print(strchr(b"abcdef", ord("x")))
None
>>>
@end example

If you want to avoid the @ref{2338,,ord("x")} calls above, you can set the
@ref{17c7,,argtypes} attribute, and the second argument will be converted from a
single character Python bytes object into a C char:

@example
>>> strchr.restype = c_char_p
>>> strchr.argtypes = [c_char_p, c_char]
>>> strchr(b"abcdef", b"d")
b'def'
>>> strchr(b"abcdef", b"def")
Traceback (most recent call last):
ctypes.ArgumentError: argument 2: TypeError: one character bytes, bytearray or integer expected
>>> print(strchr(b"abcdef", b"x"))
None
>>> strchr(b"abcdef", b"d")
b'def'
>>>
@end example

You can also use a callable Python object (a function or a class for example) as
the @ref{3325,,restype} attribute, if the foreign function returns an integer.  The
callable will be called with the `integer' the C function returns, and the
result of this call will be used as the result of your function call. This is
useful to check for error return values and automatically raise an exception:

@example
>>> GetModuleHandle = windll.kernel32.GetModuleHandleA
>>> def ValidHandle(value):
...     if value == 0:
...         raise WinError()
...     return value
...
>>>
>>> GetModuleHandle.restype = ValidHandle
>>> GetModuleHandle(None)
486539264
>>> GetModuleHandle("something silly")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in ValidHandle
OSError: [Errno 126] The specified module could not be found.
>>>
@end example

@code{WinError}는 윈도우 @code{FormatMessage()} api를 호출하여 에러 코드의 문자열 표현을 가져오고, 예외를 `반환하는' 함수입니다. @code{WinError}는 선택적 에러 코드 매개 변수를 취합니다, 제공하지 않으면 @ref{3326,,GetLastError()}를 호출하여 에러 코드를 가져옵니다.

Please note that a much more powerful error checking mechanism is available
through the @ref{3327,,errcheck} attribute;
see the reference manual for details.

@node 포인터 전달하기 또는 참조로 매개 변수 전달하기,구조체와 공용체,반환형,ctypes 자습서
@anchor{library/ctypes ctypes-passing-pointers}@anchor{3328}@anchor{library/ctypes passing-pointers-or-passing-parameters-by-reference}@anchor{3329}
@subsubsection 포인터 전달하기 (또는: 참조로 매개 변수 전달하기)


때때로 C api 함수는 매개 변수로 데이터형을 가리키는 `포인터'를 기대합니다, 아마도 해당 위치에 쓰기 위해서, 또는 데이터가 너무 커서 값으로 전달할 수 없어서. 이것은 `참조로 매개 변수 전달하기'로 알려져 있기도 합니다.

@code{ctypes} exports the @ref{332a,,byref()} function which is used to pass parameters
by reference.  The same effect can be achieved with the @ref{1a56,,pointer()} function,
although @code{pointer()} does a lot more work since it constructs a real pointer
object, so it is faster to use @code{byref()} if you don’t need the pointer
object in Python itself:

@example
>>> i = c_int()
>>> f = c_float()
>>> s = create_string_buffer(b'\000' * 32)
>>> print(i.value, f.value, repr(s.value))
0 0.0 b'@w{'}
>>> libc.sscanf(b"1 3.14 Hello", b"%d %f %s",
...             byref(i), byref(f), s)
3
>>> print(i.value, f.value, repr(s.value))
1 3.1400001049 b'Hello'
>>>
@end example

@node 구조체와 공용체,Structure/union layout alignment and byte order,포인터 전달하기 또는 참조로 매개 변수 전달하기,ctypes 자습서
@anchor{library/ctypes ctypes-structures-unions}@anchor{332b}@anchor{library/ctypes structures-and-unions}@anchor{332c}
@subsubsection 구조체와 공용체


Structures and unions must derive from the @ref{1e5,,Structure} and @ref{1e6,,Union}
base classes which are defined in the @code{ctypes} module. Each subclass must
define a @ref{1937,,_fields_} attribute.  @code{_fields_} must be a list of
`2-tuples', containing a `field name' and a `field type'.

The field type must be a @code{ctypes} type like @ref{32f7,,c_int}, or any other
derived @code{ctypes} type: structure, union, array, pointer.

다음은 `x' 및 `y'라는 두 개의 정수가 포함된 POINT 구조체의 간단한 예제이며, 생성자에서 구조체를 초기화하는 방법도 보여줍니다:

@example
>>> from ctypes import *
>>> class POINT(Structure):
...     _fields_ = [("x", c_int),
...                 ("y", c_int)]
...
>>> point = POINT(10, 20)
>>> print(point.x, point.y)
10 20
>>> point = POINT(y=5)
>>> print(point.x, point.y)
0 5
>>> POINT(1, 2, 3)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: too many initializers
>>>
@end example

그러나, 훨씬 복잡한 구조를 만들 수 있습니다. 구조체는 필드형으로 구조체를 사용하여 다른 구조체를 포함할 수 있습니다.

다음은 `upperleft' 및 `lowerright'라는 두 개의 POINT를 포함하는 RECT 구조체입니다:

@example
>>> class RECT(Structure):
...     _fields_ = [("upperleft", POINT),
...                 ("lowerright", POINT)]
...
>>> rc = RECT(point)
>>> print(rc.upperleft.x, rc.upperleft.y)
0 5
>>> print(rc.lowerright.x, rc.lowerright.y)
0 0
>>>
@end example

중첩된 구조체는 여러 가지 방법으로 생성자에서 초기화할 수 있습니다:

@example
>>> r = RECT(POINT(1, 2), POINT(3, 4))
>>> r = RECT((1, 2), (3, 4))
@end example

Field @ref{1884,,descriptor}s can be retrieved from the `class', they are useful
for debugging because they can provide useful information.
See @ref{1e8,,CField}:

@example
>>> POINT.x
<ctypes.CField 'x' type=c_int, ofs=0, size=4>
>>> POINT.y
<ctypes.CField 'y' type=c_int, ofs=4, size=4>
>>>
@end example
@anchor{library/ctypes ctypes-structureunion-alignment-byte-order}@anchor{332d}
@cartouche
@quotation 경고 
@code{ctypes} does not support passing unions or structures with bit-fields
to functions by value.  While this may work on 32-bit x86, it’s not
guaranteed by the library to work in the general case.  Unions and
structures with bit-fields should always be passed to functions by pointer.
@end quotation
@end cartouche

@node Structure/union layout alignment and byte order,구조체와 공용체의 비트 필드,구조체와 공용체,ctypes 자습서
@anchor{library/ctypes structure-union-layout-alignment-and-byte-order}@anchor{332e}
@subsubsection Structure/union layout, alignment and byte order


By default, Structure and Union fields are laid out in the same way the C
compiler does it.  It is possible to override this behavior entirely by specifying a
@ref{1e7,,_layout_} class attribute in the subclass definition; see
the attribute documentation for details.

It is possible to specify the maximum alignment for the fields and/or for the
structure itself by setting the class attributes @ref{317,,_pack_}
and/or @ref{4e8,,_align_}, respectively.
See the attribute documentation for details.

@code{ctypes} uses the native byte order for Structures and Unions.  To build
structures with non-native byte order, you can use one of the
@ref{332f,,BigEndianStructure}, @ref{3330,,LittleEndianStructure},
@ref{1bb5,,BigEndianUnion}, and @ref{1bb6,,LittleEndianUnion} base classes.  These
classes cannot contain pointer fields.

@node 구조체와 공용체의 비트 필드,배열,Structure/union layout alignment and byte order,ctypes 자습서
@anchor{library/ctypes bit-fields-in-structures-and-unions}@anchor{3331}@anchor{library/ctypes ctypes-bit-fields-in-structures-unions}@anchor{1e4}
@subsubsection 구조체와 공용체의 비트 필드


It is possible to create structures and unions containing bit fields. Bit fields
are only possible for integer fields, the bit width is specified as the third
item in the @ref{1937,,_fields_} tuples:

@example
>>> class Int(Structure):
...     _fields_ = [("first_16", c_int, 16),
...                 ("second_16", c_int, 16)]
...
>>> print(Int.first_16)
<ctypes.CField 'first_16' type=c_int, ofs=0, bit_size=16, bit_offset=0>
>>> print(Int.second_16)
<ctypes.CField 'second_16' type=c_int, ofs=0, bit_size=16, bit_offset=16>
@end example

It is important to note that bit field allocation and layout in memory are not
defined as a C standard; their implementation is compiler-specific.
By default, Python will attempt to match the behavior of a “native” compiler
for the current platform.
See the @ref{1e7,,_layout_} attribute for details on the default
behavior and how to change it.

@node 배열,포인터,구조체와 공용체의 비트 필드,ctypes 자습서
@anchor{library/ctypes arrays}@anchor{3332}@anchor{library/ctypes ctypes-arrays}@anchor{3333}
@subsubsection 배열


배열은 같은 형의 고정 된 수의 인스턴스를 포함하는 시퀀스입니다.

배열형을 만드는 데 권장되는 방법은 데이터형에 양의 정수를 곱하는 것입니다:

@example
TenPointsArrayType = POINT * 10
@end example

다음은 다소 인공적인 데이터형의 예입니다. 다른 항목들과 함께 4개의 POINT를 포함하는 구조체입니다:

@example
>>> from ctypes import *
>>> class POINT(Structure):
...     _fields_ = ("x", c_int), ("y", c_int)
...
>>> class MyStruct(Structure):
...     _fields_ = [("a", c_int),
...                 ("b", c_float),
...                 ("point_array", POINT * 4)]
>>>
>>> print(len(MyStruct().point_array))
4
>>>
@end example

인스턴스는 클래스를 호출하는 일반적인 방법으로 만들어집니다:

@example
arr = TenPointsArrayType()
for pt in arr:
    print(pt.x, pt.y)
@end example

위 코드는 배열 내용이 0으로 초기화되기 때문에, 일련의 @code{0 0} 줄을 인쇄합니다.

올바른 형의 초기화자를 지정할 수도 있습니다:

@example
>>> from ctypes import *
>>> TenIntegers = c_int * 10
>>> ii = TenIntegers(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
>>> print(ii)
<c_long_Array_10 object at 0x...>
>>> for i in ii: print(i, end=" ")
...
1 2 3 4 5 6 7 8 9 10
>>>
@end example

@node 포인터,Thread safety without the GIL,배열,ctypes 자습서
@anchor{library/ctypes ctypes-pointers}@anchor{3334}@anchor{library/ctypes pointers}@anchor{3335}
@subsubsection 포인터


Pointer instances are created by calling the @ref{1a56,,pointer()} function on a
@code{ctypes} type:

@example
>>> from ctypes import *
>>> i = c_int(42)
>>> pi = pointer(i)
>>>
@end example

포인터 인스턴스는 포인터가 가리키는 객체(위에서는 @code{i} 객체)를 반환하는 @ref{3336,,contents} 어트리뷰트를 가집니다:

@example
>>> pi.contents
c_long(42)
>>>
@end example

Note that @code{ctypes} does not have OOR (original object return), it constructs a
new, equivalent object each time you retrieve an attribute:

@example
>>> pi.contents is i
False
>>> pi.contents is pi.contents
False
>>>
@end example

다른 @ref{32f7,,c_int} 인스턴스를 포인터의 contents 어트리뷰트에 대입하면 포인터는 이 인스턴스가 저장되어있는 메모리 위치를 가리키게 됩니다:

@example
>>> i = c_int(99)
>>> pi.contents = i
>>> pi.contents
c_long(99)
>>>
@end example

@c XXX Document dereferencing pointers, and that it is preferred over the
@c .contents attribute.

포인터 인스턴스는 정수로도 인덱싱할 수 있습니다.:

@example
>>> pi[0]
99
>>>
@end example

정수 인덱스에 대입하면 가리키고 있는 값이 바뀝니다:

@example
>>> print(i)
c_long(99)
>>> pi[0] = 22
>>> print(i)
c_long(22)
>>>
@end example

0이 아닌 인덱스를 사용할 수도 있지만, C에서와 마찬가지로 자신이 하는 일을 알아야 합니다: 임의의 메모리 위치를 액세스하거나 변경할 수 있습니다. 일반적으로 C 함수에서 포인터를 받고, 포인터가 실제로 단일 항목 대신 배열을 가리키는 것을 `알' 때만 이 기능을 사용합니다.

Behind the scenes, the @ref{1a56,,pointer()} function does more than simply create
pointer instances, it has to create pointer `types' first. This is done with the
@ref{1f1,,POINTER()} function, which accepts any @code{ctypes} type, and returns a
new type:

@example
>>> PI = POINTER(c_int)
>>> PI
<class 'ctypes.LP_c_long'>
>>> PI(42)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: expected c_long instead of int
>>> PI(c_int(42))
<ctypes.LP_c_long object at 0x...>
>>>
@end example

인자 없이 포인터형을 호출하면 @code{NULL} 포인터가 만들어집니다. @code{NULL} 포인터는 @code{False} 논릿값을 갖습니다:

@example
>>> null_ptr = POINTER(c_int)()
>>> print(bool(null_ptr))
False
>>>
@end example

@code{ctypes} checks for @code{NULL} when dereferencing pointers (but dereferencing
invalid non-@code{NULL} pointers would crash Python):

@example
>>> null_ptr[0]
Traceback (most recent call last):
    ....
ValueError: NULL pointer access
>>>

>>> null_ptr[0] = 1234
Traceback (most recent call last):
    ....
ValueError: NULL pointer access
>>>
@end example

@node Thread safety without the GIL,형 변환,포인터,ctypes 자습서
@anchor{library/ctypes ctypes-thread-safety}@anchor{3337}@anchor{library/ctypes thread-safety-without-the-gil}@anchor{3338}
@subsubsection Thread safety without the GIL


From Python 3.13 onward, the @ref{164,,GIL} can be disabled on the @ref{1767,,free-threaded build}.
In ctypes, reads and writes to a single object concurrently is safe, but not across multiple objects:

@quotation

@example
>>> number = c_int(42)
>>> pointer_a = pointer(number)
>>> pointer_b = pointer(number)
@end example
@end quotation

In the above, it’s only safe for one object to read and write to the address at once if the GIL is disabled.
So, @code{pointer_a} can be shared and written to across multiple threads, but only if @code{pointer_b}
is not also attempting to do the same. If this is an issue, consider using a @ref{19f4,,threading.Lock}
to synchronize access to memory:

@quotation

@example
>>> import threading
>>> lock = threading.Lock()
>>> # Thread 1
>>> with lock:
...    pointer_a.contents = 24
>>> # Thread 2
>>> with lock:
...    pointer_b.contents = 42
@end example
@end quotation

@node 형 변환,불완전한 형,Thread safety without the GIL,ctypes 자습서
@anchor{library/ctypes ctypes-type-conversions}@anchor{3339}@anchor{library/ctypes type-conversions}@anchor{333a}
@subsubsection 형 변환


Usually, ctypes does strict type checking.  This means, if you have
@code{POINTER(c_int)} in the @ref{17c7,,argtypes} list of a function or as the type of
a member field in a structure definition, only instances of exactly the same
type are accepted.  There are some exceptions to this rule, where ctypes accepts
other objects.  For example, you can pass compatible array instances instead of
pointer types.  So, for @code{POINTER(c_int)}, ctypes accepts an array of c_int:

@example
>>> class Bar(Structure):
...     _fields_ = [("count", c_int), ("values", POINTER(c_int))]
...
>>> bar = Bar()
>>> bar.values = (c_int * 3)(1, 2, 3)
>>> bar.count = 3
>>> for i in range(bar.count):
...     print(bar.values[i])
...
1
2
3
>>>
@end example

In addition, if a function argument is explicitly declared to be a pointer type
(such as @code{POINTER(c_int)}) in @ref{17c7,,argtypes}, an object of the pointed
type (@code{c_int} in this case) can be passed to the function.  ctypes will apply
the required @ref{332a,,byref()} conversion in this case automatically.

POINTER 형 필드를 @code{NULL}로 설정하려면, @code{None}을 대입할 수 있습니다:

@example
>>> bar.values = None
>>>
@end example

@c XXX list other conversions...

Sometimes you have instances of incompatible types.  In C, you can cast one type
into another type.  @code{ctypes} provides a @ref{333b,,cast()} function which can be
used in the same way.  The @code{Bar} structure defined above accepts
@code{POINTER(c_int)} pointers or @ref{32f7,,c_int} arrays for its @code{values} field,
but not instances of other types:

@example
>>> bar.values = (c_byte * 4)()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: incompatible types, c_byte_Array_4 instance instead of LP_c_long instance
>>>
@end example

이럴 때, @ref{333b,,cast()} 함수가 편리합니다.

@ref{333b,,cast()} 함수는 ctypes 인스턴스를 다른 ctypes 데이터형에 대한 포인터로 변환하는 데 사용할 수 있습니다. @code{cast()}는 두 개의 매개 변수, 어떤 종류의 포인터로 변환될 수 있는 ctypes 객체와 ctypes 포인터형을 받아들입니다. 첫 번째 인자와 같은 메모리 블록을 참조하는 두 번째 인자의 인스턴스를 반환합니다:

@example
>>> a = (c_byte * 4)()
>>> cast(a, POINTER(c_int))
<ctypes.LP_c_long object at ...>
>>>
@end example

따라서, @ref{333b,,cast()}는 @code{Bar} 구조체의 @code{values} 필드에 대입하는 데 사용할 수 있습니다:

@example
>>> bar = Bar()
>>> bar.values = cast((c_byte * 4)(), POINTER(c_int))
>>> print(bar.values[0])
0
>>>
@end example

@node 불완전한 형,콜백 함수,형 변환,ctypes 자습서
@anchor{library/ctypes ctypes-incomplete-types}@anchor{318}@anchor{library/ctypes incomplete-types}@anchor{333c}
@subsubsection 불완전한 형


`불완전한 형'은 멤버가 아직 지정되지 않은 구조체, 공용체 또는 배열입니다. C에서, 이것들은 나중에 정의되는 전방 선언(forward declaration)으로 지정됩니다:

@example
struct cell; /* forward declaration */

struct cell @{
    char *name;
    struct cell *next;
@};
@end example

ctypes 코드로 그대로 옮기면 이렇게 되지만, 작동하지는 않습니다:

@example
>>> class cell(Structure):
...     _fields_ = [("name", c_char_p),
...                 ("next", POINTER(cell))]
...
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in cell
NameError: name 'cell' is not defined
>>>
@end example

because the new @code{class cell} is not available in the class statement itself.
In @code{ctypes}, we can define the @code{cell} class and set the
@ref{1937,,_fields_} attribute later, after the class statement:

@example
>>> from ctypes import *
>>> class cell(Structure):
...     pass
...
>>> cell._fields_ = [("name", c_char_p),
...                  ("next", POINTER(cell))]
>>>
@end example

해 봅시다. 우리는 두 개의 @code{cell} 인스턴스를 만들고, 서로를 가리키도록 한 다음, 마지막으로 포인터 체인을 몇 번 따라갑니다:

@example
>>> c1 = cell()
>>> c1.name = b"foo"
>>> c2 = cell()
>>> c2.name = b"bar"
>>> c1.next = pointer(c2)
>>> c2.next = pointer(c1)
>>> p = c1
>>> for i in range(8):
...     print(p.name, end=" ")
...     p = p.next[0]
...
foo bar foo bar foo bar foo bar
>>>
@end example

@node 콜백 함수,dll에서 내 보낸 값을 액세스하기,불완전한 형,ctypes 자습서
@anchor{library/ctypes callback-functions}@anchor{333d}@anchor{library/ctypes ctypes-callback-functions}@anchor{333e}
@subsubsection 콜백 함수


@code{ctypes} allows creating C callable function pointers from Python callables.
These are sometimes called `callback functions'.

먼저, 콜백 함수를 위한 클래스를 만들어야 합니다. 클래스는 호출 규칙, 반환형 및 이 함수가 받는 인자의 수와 형을 알고 있습니다.

@ref{333f,,CFUNCTYPE()} 팩토리 함수는 @code{cdecl} 호출 규칙을 사용하여 콜백 함수의 형을 만듭니다. 윈도우에서, @ref{3340,,WINFUNCTYPE()} 팩토리 함수는 @code{stdcall} 호출 규칙을 사용하여 콜백 함수 형을 만듭니다.

이러한 팩토리 함수는 모두 첫 번째 인자로 결과 형을, 나머지 인자로 콜백 함수가 기대하는 인자 형들로 호출됩니다.

I will present an example here which uses the standard C library’s
@code{qsort()} function, that is used to sort items with the help of a callback
function.  @code{qsort()} will be used to sort an array of integers:

@example
>>> IntArray5 = c_int * 5
>>> ia = IntArray5(5, 1, 7, 33, 99)
>>> qsort = libc.qsort
>>> qsort.restype = None
>>>
@end example

@code{qsort()} must be called with a pointer to the data to sort, the number of
items in the data array, the size of one item, and a pointer to the comparison
function, the callback. The callback will then be called with two pointers to
items, and it must return a negative integer if the first item is smaller than
the second, a zero if they are equal, and a positive integer otherwise.

따라서 콜백 함수는 정수에 대한 포인터들을 받고 정수를 반환해야 합니다. 먼저 콜백 함수를 위한 @code{형}을 만듭니다:

@example
>>> CMPFUNC = CFUNCTYPE(c_int, POINTER(c_int), POINTER(c_int))
>>>
@end example

시작하기 위해, 전달된 값을 보여주는 간단한 콜백이 있습니다:

@example
>>> def py_cmp_func(a, b):
...     print("py_cmp_func", a[0], b[0])
...     return 0
...
>>> cmp_func = CMPFUNC(py_cmp_func)
>>>
@end example

결과:

@example
>>> qsort(ia, len(ia), sizeof(c_int), cmp_func)
py_cmp_func 5 1
py_cmp_func 33 99
py_cmp_func 7 33
py_cmp_func 5 7
py_cmp_func 1 7
>>>
@end example

이제 실제로 두 항목을 비교하여 유용한 결과를 반환할 수 있습니다:

@example
>>> def py_cmp_func(a, b):
...     print("py_cmp_func", a[0], b[0])
...     return a[0] - b[0]
...
>>>
>>> qsort(ia, len(ia), sizeof(c_int), CMPFUNC(py_cmp_func))
py_cmp_func 5 1
py_cmp_func 33 99
py_cmp_func 7 33
py_cmp_func 1 7
py_cmp_func 5 7
>>>
@end example

쉽게 확인할 수 있듯이, 배열은 이제 정렬되었습니다:

@example
>>> for i in ia: print(i, end=" ")
...
1 5 7 33 99
>>>
@end example

함수 팩토리는 데코레이터 팩토리로 사용할 수 있으므로, 다음과 같이 작성할 수도 있습니다:

@example
>>> @@CFUNCTYPE(c_int, POINTER(c_int), POINTER(c_int))
... def py_cmp_func(a, b):
...     print("py_cmp_func", a[0], b[0])
...     return a[0] - b[0]
...
>>> qsort(ia, len(ia), sizeof(c_int), py_cmp_func)
py_cmp_func 5 1
py_cmp_func 33 99
py_cmp_func 7 33
py_cmp_func 1 7
py_cmp_func 5 7
>>>
@end example

@cartouche
@quotation 참고 
Make sure you keep references to @ref{333f,,CFUNCTYPE()} objects as long as they
are used from C code. @code{ctypes} doesn’t, and if you don’t, they may be
garbage collected, crashing your program when a callback is made.

또한, 콜백 함수가 파이썬 제어 바깥에서 만들어진 스레드(예를 들어, 콜백을 호출하는 외부 코드)에서 호출되면, ctypes는 모든 호출에 대해 새로운 더미 파이썬 스레드를 만듭니다. 이 동작은 대부분 적합하지만, @ref{1862,,threading.local}에 저장된 값은, 같은 C 스레드에서 호출되는 여러 콜백에서 살아남을 수 `없음'을 뜻합니다.
@end quotation
@end cartouche

@node dll에서 내 보낸 값을 액세스하기,의외의 것들,콜백 함수,ctypes 자습서
@anchor{library/ctypes accessing-values-exported-from-dlls}@anchor{3341}@anchor{library/ctypes ctypes-accessing-values-exported-from-dlls}@anchor{3342}
@subsubsection dll에서 내 보낸 값을 액세스하기


Some shared libraries not only export functions, they also export variables. An
example in the Python library itself is the @ref{381,,Py_Version}, Python
runtime version number encoded in a single constant integer.

@code{ctypes} can access values like this with the @ref{3343,,in_dll()} class methods of
the type.  `pythonapi' is a predefined symbol giving access to the Python C
api:

@example
>>> version = ctypes.c_int.in_dll(ctypes.pythonapi, "Py_Version")
>>> print(hex(version.value))
0x30c00a0
@end example

포인터의 사용법도 보여주는 확장 예제는 파이썬이 내 보낸 @ref{3344,,PyImport_FrozenModules} 포인터에 액세스합니다.

해당 값에 대한 문서를 인용하면:

@quotation

This pointer is initialized to point to an array of @ref{978,,_frozen}
records, terminated by one whose members are all @code{NULL} or zero.  When a frozen
module is imported, it is searched in this table.  Third-party code could play
tricks with this to provide a dynamically created collection of frozen modules.
@end quotation

So manipulating this pointer could even prove useful. To restrict the example
size, we show only how this table can be read with @code{ctypes}:

@example
>>> from ctypes import *
>>>
>>> class struct_frozen(Structure):
...     _fields_ = [("name", c_char_p),
...                 ("code", POINTER(c_ubyte)),
...                 ("size", c_int),
...                 ("get_code", POINTER(c_ubyte)),  # Function pointer
...                ]
...
>>>
@end example

We have defined the @ref{978,,_frozen} data type, so we can get the pointer
to the table:

@example
>>> FrozenTable = POINTER(struct_frozen)
>>> table = FrozenTable.in_dll(pythonapi, "_PyImport_FrozenBootstrap")
>>>
@end example

@code{table}이 @code{struct_frozen} 레코드의 배열에 대한 @code{포인터}이므로, 이터레이션할 수 있습니다. 하지만 포인터는 크기가 없으므로 루프를 종료하는 방법이 필요합니다. 조만간 액세스 위반 등으로 인해 충돌이 발생할 수 있으므로, @code{NULL} 엔트리가 발견되자마자 루프에서 벗어나는 것이 좋습니다:

@example
>>> for item in table:
...     if item.name is None:
...         break
...     print(item.name.decode("ascii"), item.size)
...
_frozen_importlib 31764
_frozen_importlib_external 41499
zipimport 12345
>>>
@end example

표준 파이썬이 프로즌 모듈과 프로즌 패키지(음수 @code{size} 멤버로 표시됨)를 가지고 있다는 사실은 잘 알려지지 않았으며, 테스트용으로만 사용됩니다. 예를 들어 @code{import __hello__}를 시도해보십시오.

@node 의외의 것들,가변 크기 데이터형,dll에서 내 보낸 값을 액세스하기,ctypes 자습서
@anchor{library/ctypes ctypes-surprises}@anchor{3345}@anchor{library/ctypes surprises}@anchor{3346}
@subsubsection 의외의 것들


There are some edges in @code{ctypes} where you might expect something other
than what actually happens.

다음 예제를 고려해보십시오:

@example
>>> from ctypes import *
>>> class POINT(Structure):
...     _fields_ = ("x", c_int), ("y", c_int)
...
>>> class RECT(Structure):
...     _fields_ = ("a", POINT), ("b", POINT)
...
>>> p1 = POINT(1, 2)
>>> p2 = POINT(3, 4)
>>> rc = RECT(p1, p2)
>>> print(rc.a.x, rc.a.y, rc.b.x, rc.b.y)
1 2 3 4
>>> # now swap the two points
>>> rc.a, rc.b = rc.b, rc.a
>>> print(rc.a.x, rc.a.y, rc.b.x, rc.b.y)
3 4 3 4
>>>
@end example

흠. 아마도 마지막 문장이 @code{3 4 1 2}를 인쇄할 것으로 기대했을 겁니다. 어떻게 된 걸까요? 위의 @code{rc.a, rc.b = rc.b, rc.a} 줄의 단계는 다음과 같습니다:

@example
>>> temp0, temp1 = rc.b, rc.a
>>> rc.a = temp0
>>> rc.b = temp1
>>>
@end example

@code{temp0} 과 @code{temp1}은 여전히 위의 @code{rc} 객체의 내부 버퍼를 사용하는 객체입니다. 따라서 @code{rc.a = temp0}를 실행하면 @code{temp0}의 버퍼 내용이 @code{rc}의 버퍼로 복사됩니다. 이것은, 결과적으로 @code{temp1}의 내용을 변경합니다. 따라서 마지막 대입인 @code{rc.b = temp1}은 기대하는 효과를 주지 못합니다.

Structure, Union 및 Array에서 서브 객체를 가져오는 것은 서브 객체를 `복사'하지 않고, 대신 루트 객체의 하부 버퍼에 액세스하는 래퍼 객체를 가져온다는 점에 유의하십시오.

예상과 다른 행동을 하는 또 다른 예는 다음과 같습니다:

@example
>>> s = c_char_p()
>>> s.value = b"abc def ghi"
>>> s.value
b'abc def ghi'
>>> s.value is s.value
False
>>>
@end example

@cartouche
@quotation 참고 
@ref{1a57,,c_char_p}로 인스턴스를 만든 객체는 바이트열이나 정수로 설정된 value만 가질 수 있습니다.
@end quotation
@end cartouche

@code{False}를 인쇄하는 이유는 무엇일까요? ctypes 인스턴스는 메모리 블록과 메모리 내용에 액세스하는 어떤 @ref{1884,,디스크립터}를 포함하는 객체입니다. 메모리 블록에 파이썬 객체를 저장하면 객체 자체를 저장하지 않고, 대신 객체의 @code{내용}을 저장합니다. 내용에 다시 액세스하면 매번 새로운 파이썬 객체가 생성됩니다!

@node 가변 크기 데이터형,,의외의 것들,ctypes 자습서
@anchor{library/ctypes ctypes-variable-sized-data-types}@anchor{3347}@anchor{library/ctypes variable-sized-data-types}@anchor{3348}
@subsubsection 가변 크기 데이터형


@code{ctypes} provides some support for variable-sized arrays and structures.

@ref{3349,,resize()} 함수는 기존 ctypes 객체의 메모리 버퍼 크기를 바꾸는 데 사용할 수 있습니다. 이 함수는 객체를 첫 번째 인자로 가져오고, 바이트 단위의 요청 된 크기를 두 번째 인자로 가져옵니다. 메모리 블록을 객체 형이 지정하는 원래 메모리 블록보다 작게 만들 수 없습니다. 시도하면 @ref{2ec,,ValueError}가 발생합니다:

@example
>>> short_array = (c_short * 4)()
>>> print(sizeof(short_array))
8
>>> resize(short_array, 4)
Traceback (most recent call last):
    ...
ValueError: minimum size is 8
>>> resize(short_array, 32)
>>> sizeof(short_array)
32
>>> sizeof(type(short_array))
8
>>>
@end example

훌륭합니다, 하지만 이 배열에 포함된 추가 요소에 어떻게 액세스할 수 있습니까? 형은 여전히 4개의 요소만 알고 있으므로, 다른 요소에 액세스하면 에러가 발생합니다:

@example
>>> short_array[:]
[0, 0, 0, 0]
>>> short_array[7]
Traceback (most recent call last):
    ...
IndexError: invalid index
>>>
@end example

Another way to use variable-sized data types with @code{ctypes} is to use the
dynamic nature of Python, and (re-)define the data type after the required size
is already known, on a case by case basis.

@node ctypes 레퍼런스,,ctypes 자습서,ctypes — A foreign function library for Python
@anchor{library/ctypes ctypes-ctypes-reference}@anchor{334a}@anchor{library/ctypes ctypes-reference}@anchor{334b}
@subsubsection ctypes 레퍼런스


@menu
* 공유 라이브러리 찾기:: 
* Listing loaded shared libraries:: 
* 공유 라이브러리 로드하기:: 
* 외부 함수:: 
* 함수 프로토타입:: 
* 유틸리티 함수:: 
* 데이터형: 데이터형<2>. 
* 기본 데이터형: 기본 데이터형<2>. 
* 구조화된 데이터형:: 
* 배열과 포인터:: 
* Exceptions: Exceptions<4>. 

@end menu

@node 공유 라이브러리 찾기,Listing loaded shared libraries,,ctypes 레퍼런스
@anchor{library/ctypes ctypes-finding-shared-libraries}@anchor{334c}@anchor{library/ctypes finding-shared-libraries}@anchor{334d}
@subsubsection 공유 라이브러리 찾기


컴파일 언어로 프로그래밍할 때, 공유 라이브러리는 프로그램을 컴파일/링크할 때와 프로그램을 실행할 때 액세스 됩니다.

The purpose of the @ref{f44,,find_library()} function is to locate a library in a way
similar to what the compiler or runtime loader does (on platforms with several
versions of a shared library the most recent should be loaded), while the ctypes
library loaders act like when a program is run, and call the runtime loader
directly.

The @code{ctypes.util} module provides a function which can help to determine
the library to load.


@deffn {데이터} ctypes.util.find_library (name)

라이브러리를 찾아서 경로명을 반환하려고 시도합니다. `name'은 `lib' 같은 접두사, @code{.so}, @code{.dylib} 또는 버전 번호와 같은 접미사가 없는 라이브러리 이름입니다 (이것은 posix 링커 옵션 @code{-l}에 사용되는 양식입니다). 라이브러리를 찾을 수 없으면 @code{None}을 반환합니다.
@end deffn

정확한 기능은 시스템에 따라 다릅니다.

On Linux, @ref{f44,,find_library()} tries to run external programs
(@code{/sbin/ldconfig}, @code{gcc}, @code{objdump} and @code{ld}) to find the library file.
It returns the filename of the library file.

Note that if the output of these programs does not correspond to the dynamic
linker used by Python, the result of this function may be misleading.


버전 3.6에서 변경: 리눅스에서, 다른 수단으로 라이브러리를 찾을 수 없으면, 라이브러리 검색 시 환경 변수 @code{LD_LIBRARY_PATH}의 값이 사용됩니다.


여기 예제가 있습니다:

@example
>>> from ctypes.util import find_library
>>> find_library("m")
'libm.so.6'
>>> find_library("c")
'libc.so.6'
>>> find_library("bz2")
'libbz2.so.1.0'
>>>
@end example

On macOS and Android, @ref{f44,,find_library()} uses the system’s
standard naming schemes and paths to locate the library, and returns a full
pathname if successful:

@example
>>> from ctypes.util import find_library
>>> find_library("c")
'/usr/lib/libc.dylib'
>>> find_library("m")
'/usr/lib/libm.dylib'
>>> find_library("bz2")
'/usr/lib/libbz2.dylib'
>>> find_library("AGL")
'/System/Library/Frameworks/AGL.framework/AGL'
>>>
@end example

On Windows, @ref{f44,,find_library()} searches along the system search path, and
returns the full pathname, but since there is no predefined naming scheme a call
like @code{find_library("c")} will fail and return @code{None}.

If wrapping a shared library with @code{ctypes}, it `may' be better to determine
the shared library name at development time, and hardcode that into the wrapper
module instead of using @ref{f44,,find_library()} to locate the library at runtime.

@node Listing loaded shared libraries,공유 라이브러리 로드하기,공유 라이브러리 찾기,ctypes 레퍼런스
@anchor{library/ctypes ctypes-listing-loaded-shared-libraries}@anchor{334e}@anchor{library/ctypes listing-loaded-shared-libraries}@anchor{334f}
@subsubsection Listing loaded shared libraries


When writing code that relies on code loaded from shared libraries, it can be
useful to know which shared libraries have already been loaded into the current
process.

The @code{ctypes.util} module provides the @ref{1f0,,dllist()} function,
which calls the different APIs provided by the various platforms to help determine
which shared libraries have already been loaded into the current process.

The exact output of this function will be system dependent. On most platforms,
the first entry of this list represents the current process itself, which may
be an empty string.
For example, on glibc-based Linux, the return may look like:

@example
>>> from ctypes.util import dllist
>>> dllist()
['@w{'}, 'linux-vdso.so.1', '/lib/x86_64-linux-gnu/libm.so.6', '/lib/x86_64-linux-gnu/libc.so.6', ... ]
@end example

@node 공유 라이브러리 로드하기,외부 함수,Listing loaded shared libraries,ctypes 레퍼런스
@anchor{library/ctypes ctypes-loading-shared-libraries}@anchor{3350}@anchor{library/ctypes loading-shared-libraries}@anchor{3351}
@subsubsection 공유 라이브러리 로드하기


There are several ways to load shared libraries into the Python process.  One
way is to instantiate @ref{bdb,,CDLL} or one of its subclasses:

@geindex CDLL (ctypes 클래스)
@anchor{library/ctypes ctypes CDLL}
@deffn {클래스} ctypes.CDLL (name, mode=DEFAULT_MODE, handle=None, use_errno=False, use_last_error=False, winmode=None)

Represents a loaded shared library.

Functions in this library use the standard C calling convention, and are
assumed to return int.
The Python @ref{474,,global interpreter lock} is released before calling any
function exported by these libraries, and reacquired afterwards.
For different function behavior, use a subclass: @ref{1ae0,,OleDLL},
@ref{1ae1,,WinDLL}, or @ref{1ae2,,PyDLL}.

If you have an existing @ref{3352,,handle} to an already
loaded shared library, it can be passed as the `handle' argument to wrap
the opened library in a new @code{CDLL} object.
In this case, `name' is only used to set the @ref{3353,,_name}
attribute, but it may be adjusted and/or validated.

If `handle' is @code{None}, the underlying platform’s @code{dlopen(3)@footnote{https://manpages.debian.org/dlopen(3)}} or
@code{LoadLibrary()} function is used to load the library into
the process, and to get a handle to it.

`name' is the pathname of the shared library to open.
If `name' does not contain a path separator, the library is found
in a platform-specific way.

On non-Windows systems, `name' can  be @code{None}. In this case,
@code{dlopen()} is called with @code{NULL}, which opens the main program
as a “library”.
(Some systems do the same is `name' is empty; @code{None}/@code{NULL} is more
portable.)

@cartouche
@quotation CPython implementation detail 
Since CPython is linked to @code{libc}, a @code{None} `name' is often used
to access the C standard library:

@example
>>> printf = ctypes.CDLL(None).printf
>>> printf.argtypes = [ctypes.c_char_p]
>>> printf(b"hello\n")
hello
6
@end example

To access the Python C API, prefer @ref{3354,,ctypes.pythonapi} which
works across platforms.
@end quotation
@end cartouche

`mode' 매개 변수는 라이브러리가 로드되는 방법을 지정하는 데 사용될 수 있습니다. 자세한 내용은, @code{dlopen(3)@footnote{https://manpages.debian.org/dlopen(3)}} 매뉴얼 페이지를 참조하십시오. 윈도우에서는, `mode'가 무시됩니다. posix 시스템에서는 RTLD_NOW가 항상 추가되며 구성할 수 없습니다.

The `use_errno' parameter, when set to true, enables a ctypes mechanism that
allows accessing the system @ref{5b,,errno} error number in a safe way.
@code{ctypes} maintains a thread-local copy of the system’s @code{errno}
variable; if you call foreign functions created with @code{use_errno=True} then the
@code{errno} value before the function call is swapped with the ctypes private
copy, the same happens immediately after the function call.

@ref{3355,,ctypes.get_errno()} 함수는 ctypes 내부 사본의 값을 반환하고, @ref{3356,,ctypes.set_errno()} 함수는 ctypes 내부 사본을 새 값으로 변경하고 이전 값을 반환합니다.

The `use_last_error' parameter, when set to true, enables the same mechanism for
the Windows error code which is managed by the @ref{3326,,GetLastError()} and
@code{SetLastError()} Windows API functions; @ref{3357,,ctypes.get_last_error()} and
@ref{3358,,ctypes.set_last_error()} are used to request and change the ctypes private
copy of the windows error code.

The `winmode' parameter is used on Windows to specify how the library is loaded
(since `mode' is ignored). It takes any value that is valid for the Win32 API
@code{LoadLibraryEx} flags parameter. When omitted, the default is to use the
flags that result in the most secure DLL load, which avoids issues such as DLL
hijacking. Passing the full path to the DLL is the safest way to ensure the
correct library and dependencies are loaded.

윈도우에서는 DLL 이름이 존재하더라도 @ref{bdb,,CDLL} 인스턴스 생성이 실패할 수 있습니다. 로드된 DLL의 종속 DLL을 찾을 수 없을 때, `“[WinError 126] The specified module could not be found”' 메시지로 @ref{2c0,,OSError} 에러가 발생합니다. 윈도우 API가 정보를 반환하지 않아서 이 에러 메시지에는 누락된 DLL의 이름이 포함되어 있지 않고, 이 에러를 진단하기 어렵게 만듭니다. 이 에러를 해결하고 찾을 수 없는 DLL을 확인하려면, 윈도우 디버깅과 추적 도구를 사용하여 종속 DLL 목록을 찾고 찾을 수 없는 DLL을 확인해야 합니다.


@subsubheading 더 보기


Microsoft DUMPBIN tool@footnote{https://learn.microsoft.com/en-us/cpp/build/reference/dumpbin-reference?view=msvc-170}
– A tool to find DLL dependents.



버전 3.8에서 변경: `winmode' 매개 변수가 추가되었습니다.



버전 3.12에서 변경: The `name' parameter can now be a @ref{5a0,,path-like object}.


Instances of this class have no public methods.  Functions exported by the
shared library can be accessed as attributes or by index.  Please note that
accessing the function through an attribute caches the result and therefore
accessing it repeatedly returns the same object each time.  On the other hand,
accessing it through an index returns a new object each time:

@example
>>> from ctypes import CDLL
>>> libc = CDLL("libc.so.6")  # On Linux
>>> libc.time == libc.time
True
>>> libc['time'] == libc['time']
False
@end example

The following public attributes are available. Their name starts with an
underscore to not clash with exported function names:

@geindex _handle (ctypes.CDLL의 속성)
@anchor{library/ctypes ctypes CDLL _handle}@anchor{3352}
@deffn {속성} _handle

라이브러리에 액세스하는 데 사용되는 시스템 핸들.
@end deffn

@geindex _name (ctypes.CDLL의 속성)
@anchor{library/ctypes ctypes CDLL _name}@anchor{3353}
@deffn {속성} _name

생성자에서 전달된 라이브러리의 이름.
@end deffn
@end deffn

@geindex OleDLL (ctypes 클래스)
@anchor{library/ctypes ctypes OleDLL}@anchor{1ae0}
@deffn {클래스} ctypes.OleDLL

See @ref{bdb,,CDLL}, the superclass, for common information.

Functions in this library use the @code{stdcall} calling convention, and are
assumed to return the windows specific @ref{3359,,HRESULT} code.  @code{HRESULT}
values contain information specifying whether the function call failed or
succeeded, together with additional error code.  If the return value signals a
failure, an @ref{2c0,,OSError} is automatically raised.

@ref{213c,,가용성}: Windows


버전 3.3에서 변경: @ref{1254,,WindowsError} used to be raised,
which is now an alias of @ref{2c0,,OSError}.

@end deffn

@geindex WinDLL (ctypes 클래스)
@anchor{library/ctypes ctypes WinDLL}@anchor{1ae1}
@deffn {클래스} ctypes.WinDLL

See @ref{bdb,,CDLL}, the superclass, for common information.

Functions in these libraries use the @code{stdcall} calling convention, and are
assumed to return int by default.

@ref{213c,,가용성}: Windows
@end deffn

@geindex PyDLL (ctypes 클래스)
@anchor{library/ctypes ctypes PyDLL}@anchor{1ae2}
@deffn {클래스} ctypes.PyDLL

See @ref{bdb,,CDLL}, the superclass, for common information.

When functions in this library are called, the
Python GIL is `not' released during the function call, and after the function
execution the Python error flag is checked. If the error flag is set, a Python
exception is raised.

Thus, this is only useful to call Python C API functions directly.
@end deffn

@geindex RTLD_GLOBAL (ctypes 모듈)
@anchor{library/ctypes ctypes RTLD_GLOBAL}@anchor{335a}
@deffn {데이터} ctypes.RTLD_GLOBAL

`mode' 매개 변수에 사용하는 플래그. 이 플래그를 사용할 수 없는 플랫폼에서는, 정수 0으로 정의됩니다.
@end deffn

@geindex RTLD_LOCAL (ctypes 모듈)
@anchor{library/ctypes ctypes RTLD_LOCAL}@anchor{335b}
@deffn {데이터} ctypes.RTLD_LOCAL

`mode' 매개 변수에 사용하는 플래그. 이 플래그를 사용할 수 없는 플랫폼에서는, `RTLD_GLOBAL'과 같습니다.
@end deffn

@geindex DEFAULT_MODE (ctypes 모듈)
@anchor{library/ctypes ctypes DEFAULT_MODE}@anchor{335c}
@deffn {데이터} ctypes.DEFAULT_MODE

공유 라이브러리를 로드하는 데 사용되는 기본 모드. OSX 10.3에서는 `RTLD_GLOBAL'이고, 그렇지 않으면 `RTLD_LOCAL'과 같습니다.
@end deffn

Shared libraries can also be loaded by using one of the prefabricated objects,
which are instances of the @ref{335d,,LibraryLoader} class, either by calling the
@ref{32fe,,LoadLibrary()} method, or by retrieving the library as
attribute of the loader instance.

@geindex LibraryLoader (ctypes 클래스)
@anchor{library/ctypes ctypes LibraryLoader}@anchor{335d}
@deffn {클래스} ctypes.LibraryLoader (dlltype)

공유 라이브러리를 로드하는 클래스. `dlltype'은 @ref{bdb,,CDLL}, @ref{1ae2,,PyDLL}, @ref{1ae1,,WinDLL} 또는 @ref{1ae0,,OleDLL} 형 중 하나여야 합니다.

@code{__getattr__()} has special behavior: It allows loading a shared library by
accessing it as attribute of a library loader instance.  The result is cached,
so repeated attribute accesses return the same library each time.

@geindex LoadLibrary() (ctypes.LibraryLoader 메서드)
@anchor{library/ctypes ctypes LibraryLoader LoadLibrary}@anchor{32fe}
@deffn {메서드} LoadLibrary (name)

공유 라이브러리를 프로세스에 로드하고 반환합니다. 이 메서드는 항상 라이브러리의 새 인스턴스를 반환합니다.
@end deffn
@end deffn

다음과 같은 사전 작성된 로더를 사용할 수 있습니다:

@geindex cdll (ctypes 모듈)
@anchor{library/ctypes ctypes cdll}@anchor{32fb}
@deffn {데이터} ctypes.cdll

@ref{bdb,,CDLL} 인스턴스를 만듭니다.
@end deffn

@geindex windll (ctypes 모듈)
@anchor{library/ctypes ctypes windll}@anchor{32fc}
@deffn {데이터} ctypes.windll

Creates @ref{1ae1,,WinDLL} instances.

@ref{213c,,가용성}: Windows
@end deffn

@geindex oledll (ctypes 모듈)
@anchor{library/ctypes ctypes oledll}@anchor{32fd}
@deffn {데이터} ctypes.oledll

Creates @ref{1ae0,,OleDLL} instances.

@ref{213c,,가용성}: Windows
@end deffn

@geindex pydll (ctypes 모듈)
@anchor{library/ctypes ctypes pydll}@anchor{335e}
@deffn {데이터} ctypes.pydll

@ref{1ae2,,PyDLL} 인스턴스를 만듭니다.
@end deffn

C 파이썬 API에 직접 액세스하기 위해, 바로 사용할 수 있는 파이썬 공유 라이브러리 객체가 제공됩니다:

@geindex pythonapi (ctypes 모듈)
@anchor{library/ctypes ctypes pythonapi}@anchor{3354}
@deffn {데이터} ctypes.pythonapi

An instance of @ref{1ae2,,PyDLL} that exposes Python C API functions as
attributes.  Note that all these functions are assumed to return C
int, which is of course not always the truth, so you have to assign
the correct @code{restype} attribute to use these functions.
@end deffn

이러한 객체를 통해 라이브러리를 로드하면 라이브러리를 로드하는 데 사용된 이름인 @code{name} 문자열 인자로 @ref{1c6c,,감사 이벤트(auditing event)} @code{ctypes.dlopen}을 발생시킵니다.

로드된 라이브러리에서 함수에 액세스하면 인자 @code{library}(라이브러리 객체)와 @code{name}(문자열이나 정수로 심볼의 이름)으로 감사 이벤트 @code{ctypes.dlsym}을 발생시킵니다.

객체 대신 라이브러리 핸들만 사용 가능한 경우, 함수에 액세스하면 인자 @code{handle}(원시 라이브러리 핸들)과 @code{name}으로 감사 이벤트 @code{ctypes.dlsym/handle}을 발생시킵니다.

@node 외부 함수,함수 프로토타입,공유 라이브러리 로드하기,ctypes 레퍼런스
@anchor{library/ctypes ctypes-foreign-functions}@anchor{335f}@anchor{library/ctypes foreign-functions}@anchor{3360}
@subsubsection 외부 함수


As explained in the previous section, foreign functions can be accessed as
attributes of loaded shared libraries.  The function objects created in this way
by default accept any number of arguments, accept any ctypes data instances as
arguments, and return the default result type specified by the library loader.

They are instances of a private local class @code{_FuncPtr} (not exposed
in @code{ctypes}) which inherits from the private @ref{18d3,,_CFuncPtr} class:

@example
>>> import ctypes
>>> lib = ctypes.CDLL(None)
>>> issubclass(lib._FuncPtr, ctypes._CFuncPtr)
True
>>> lib._FuncPtr is ctypes._CFuncPtr
False
@end example

@geindex _CFuncPtr (ctypes 클래스)
@anchor{library/ctypes ctypes _CFuncPtr}@anchor{18d3}
@deffn {클래스} ctypes._CFuncPtr

C 호출 가능한 외부 함수의 베이스 클래스.

외부 함수의 인스턴스는 C 호환 데이터형이기도 합니다; C 함수 포인터를 나타냅니다.

이 동작은 외부 함수 객체의 특수 어트리뷰트에 대입하여 사용자 정의할 수 있습니다.

@geindex restype (ctypes._CFuncPtr의 속성)
@anchor{library/ctypes ctypes _CFuncPtr restype}@anchor{3325}
@deffn {속성} restype

Assign a ctypes type to specify the result type of the foreign function.
Use @code{None} for void, a function not returning anything.

It is possible to assign a callable Python object that is not a ctypes
type, in this case the function is assumed to return a C int, and
the callable will be called with this integer, allowing further
processing or error checking.  Using this is deprecated, for more flexible
post processing or error checking use a ctypes data type as
@code{restype} and assign a callable to the @ref{3327,,errcheck} attribute.
@end deffn

@geindex argtypes (ctypes._CFuncPtr의 속성)
@anchor{library/ctypes ctypes _CFuncPtr argtypes}@anchor{17c7}
@deffn {속성} argtypes

ctypes 형의 튜플을 대입하여 함수가 받아들이는 인자 형을 지정합니다. @code{stdcall} 호출 규칙을 사용하는 함수는 이 튜플의 길이와 같은 수의 인자로만 호출할 수 있습니다; C 호출 규칙을 사용하는 함수는 추가적인 지정되지 않은 인자도 허용합니다.

When a foreign function is called, each actual argument is passed to the
@ref{3322,,from_param()} class method of the items in the @ref{17c7,,argtypes}
tuple, this method allows adapting the actual argument to an object that
the foreign function accepts.  For example, a @ref{1a57,,c_char_p} item in
the @code{argtypes} tuple will convert a string passed as argument into
a bytes object using ctypes conversion rules.

New: It is now possible to put items in argtypes which are not ctypes
types, but each item must have a @ref{3322,,from_param()} method which returns a
value usable as argument (integer, string, ctypes instance).  This allows
defining adapters that can adapt custom objects as function parameters.
@end deffn

@geindex errcheck (ctypes._CFuncPtr의 속성)
@anchor{library/ctypes ctypes _CFuncPtr errcheck}@anchor{3327}
@deffn {속성} errcheck

이 어트리뷰트에 파이썬 함수나 다른 콜러블을 대입합니다. 콜러블은 3개 이상의 인자로 호출됩니다:


@deffn {함수} callable (result, func, arguments)

`result' is what the foreign function returns, as specified by the
@code{restype} attribute.

`func'는 외부 함수 객체 자체이며, 같은 콜러블 객체를 재사용하여 여러 함수의 결과를 확인하거나 사후 처리할 수 있도록 합니다.

`arguments'는 원래 함수 호출에 전달된 매개 변수를 포함하는 튜플입니다. 사용된 인자에 따라 동작을 특수화할 수 있도록 합니다.
@end deffn

이 함수가 반환하는 객체는 외부 함수 호출에서 반환되지만, 결괏값을 확인하고 외부 함수 호출이 실패하면 예외를 발생시킬 수도 있습니다.
@end deffn
@end deffn


On Windows, when a foreign function call raises a system exception (for
example, due to an access violation), it will be captured and replaced with
a suitable Python exception. Further, an auditing event
@code{ctypes.set_exception} with argument @code{code} will be raised, allowing an
audit hook to replace the exception with its own.



Some ways to invoke foreign function calls as well as some of the
functions in this module may raise an auditing event
@code{ctypes.call_function} with arguments @code{function pointer} and @code{arguments}.


@node 함수 프로토타입,유틸리티 함수,외부 함수,ctypes 레퍼런스
@anchor{library/ctypes ctypes-function-prototypes}@anchor{3361}@anchor{library/ctypes function-prototypes}@anchor{3362}
@subsubsection 함수 프로토타입


함수 프로토타입의 인스턴스를 만들어서 외부 함수를 만들 수도 있습니다. 함수 프로토타입은 C의 함수 프로토타입과 비슷합니다; 구현을 정의하지 않고 함수(반환형, 인자형, 호출 규칙)를 설명합니다. 팩토리 함수는 원하는 결과형과 함수의 인자형들로 호출되어야 하며, 데코레이터 팩토리로 사용되어 @code{@@wrapper} 문법을 통해 함수에 적용될 수 있습니다. 예제는 @ref{333e,,콜백 함수}를 참조하십시오.

@geindex CFUNCTYPE() (ctypes 모듈)
@anchor{library/ctypes ctypes CFUNCTYPE}@anchor{333f}
@deffn {함수} ctypes.CFUNCTYPE (restype, *argtypes, use_errno=False, use_last_error=False)

반환된 함수 프로토타입은 표준 C 호출 규칙을 사용하는 함수를 만듭니다. 이 함수는 호출 중에 GIL을 해제합니다. `use_errno'를 참으로 설정하면, 시스템 @ref{5b,,errno} 변수의 ctypes 내부 복사본이 호출 전후에 실제 @code{errno} 값과 교환됩니다; `use_last_error'는 윈도우 에러 코드에 대해 같은 일을 합니다.
@end deffn

@geindex WINFUNCTYPE() (ctypes 모듈)
@anchor{library/ctypes ctypes WINFUNCTYPE}@anchor{3340}
@deffn {함수} ctypes.WINFUNCTYPE (restype, *argtypes, use_errno=False, use_last_error=False)

The returned function prototype creates functions that use the
@code{stdcall} calling convention.  The function will
release the GIL during the call.  `use_errno' and `use_last_error' have the
same meaning as above.

@ref{213c,,가용성}: Windows
@end deffn

@geindex PYFUNCTYPE() (ctypes 모듈)
@anchor{library/ctypes ctypes PYFUNCTYPE}@anchor{3363}
@deffn {함수} ctypes.PYFUNCTYPE (restype, *argtypes)

반환된 함수 프로토타입은 파이썬 호출 규칙을 사용하는 함수를 만듭니다. 이 함수는 호출 도중 GIL을 해제하지 `않습니다'.
@end deffn

이러한 팩토리 함수로 만들어진 함수 프로토타입은 호출의 매개 변수 형과 수에 따라 다른 방법으로 인스턴스를 만들 수 있습니다:


@deffn {함수} prototype (address)

지정된 정수 주소에 있는 외부 함수를 반환합니다.
@end deffn


@deffn {함수} prototype (callable)

파이썬 `callable'로 C 호출 가능 함수(콜백 함수)를 만듭니다.
@end deffn


@deffn {함수} prototype (func_spec[, paramflags])

공유 라이브러리가 내보낸 외부 함수를 반환합니다. `func_spec'은 2-튜플 @code{(name_or_ordinal, library)} 여야 합니다. 첫 번째 항목은 내보낸 함수의 문자열 이름이거나, 작은 정수로 표현된 내보낸 함수의 서수(ordinal)입니다. 두 번째 항목은 공유 라이브러리 인스턴스입니다.
@end deffn


@deffn {함수} prototype (vtbl_index, name[, paramflags[, iid]])

COM 메서드를 호출할 외부 함수를 반환합니다. `vtbl_index'는 가상 함수 테이블에 대한 인덱스이며, 작은 음이 아닌 정수입니다. `name'은 COM 메서드의 이름입니다. `iid'는 확장 에러 보고에 사용되는 인터페이스 식별자를 가리키는 선택적 포인터입니다.

If `iid' is not specified, an @ref{2c0,,OSError} is raised if the COM method
call fails. If `iid' is specified, a @ref{1e9,,COMError} is raised
instead.

COM methods use a special calling convention: They require a pointer to
the COM interface as first argument, in addition to those parameters that
are specified in the @code{argtypes} tuple.

@ref{213c,,가용성}: Windows
@end deffn

선택적 `paramflags' 매개 변수는 위에 설명된 기능보다 훨씬 많은 기능을 갖는 외부 함수 래퍼를 만듭니다.

`paramflags' must be a tuple of the same length as @ref{17c7,,argtypes}.

이 튜플의 각 항목에는 매개 변수에 대한 추가 정보가 들어 있으며, 한 개, 두 개 또는 세 개의 항목이 들어있는 튜플이어야 합니다.

첫 번째 항목은 매개 변수의 방향 플래그 조합을 포함하는 정수입니다:

@quotation


@table @asis

@item 1

함수에 대한 입력 매개 변수를 지정합니다.

@item 2

출력 매개 변수. 외부 함수가 값을 채웁니다.

@item 4

기본값이 정수 0인 입력 매개 변수.
@end table
@end quotation

선택적인 두 번째 항목은 문자열 매개 변수 이름입니다. 이것이 지정되면, 이름있는 매개 변수로 외부 함수를 호출할 수 있습니다.

선택적 세 번째 항목은 이 매개 변수의 기본값입니다.

The following example demonstrates how to wrap the Windows @code{MessageBoxW} function so
that it supports default parameters and named arguments. The C declaration from
the windows header file is this:

@example
WINUSERAPI int WINAPI
MessageBoxW(
    HWND hWnd,
    LPCWSTR lpText,
    LPCWSTR lpCaption,
    UINT uType);
@end example

Here is the wrapping with @code{ctypes}:

@example
>>> from ctypes import c_int, WINFUNCTYPE, windll
>>> from ctypes.wintypes import HWND, LPCWSTR, UINT
>>> prototype = WINFUNCTYPE(c_int, HWND, LPCWSTR, LPCWSTR, UINT)
>>> paramflags = (1, "hwnd", 0), (1, "text", "Hi"), (1, "caption", "Hello from ctypes"), (1, "flags", 0)
>>> MessageBox = prototype(("MessageBoxW", windll.user32), paramflags)
@end example

이제 @code{MessageBox} 외부 함수를 다음과 같이 호출할 수 있습니다.:

@example
>>> MessageBox()
>>> MessageBox(text="Spam, spam, spam")
>>> MessageBox(flags=2, text="foo bar")
@end example

두 번째 예제는 출력 매개 변수를 보여줍니다. win32 @code{GetWindowRect} 함수는 지정된 창의 크기를 조회하는데, 호출자가 제공해야 하는 @code{RECT} 구조체로 복사합니다. 다음은 C 선언입니다:

@example
WINUSERAPI BOOL WINAPI
GetWindowRect(
     HWND hWnd,
     LPRECT lpRect);
@end example

Here is the wrapping with @code{ctypes}:

@example
>>> from ctypes import POINTER, WINFUNCTYPE, windll, WinError
>>> from ctypes.wintypes import BOOL, HWND, RECT
>>> prototype = WINFUNCTYPE(BOOL, HWND, POINTER(RECT))
>>> paramflags = (1, "hwnd"), (2, "lprect")
>>> GetWindowRect = prototype(("GetWindowRect", windll.user32), paramflags)
>>>
@end example

출력 매개 변수가 있는 함수는, 하나뿐이면 자동으로 출력 매개 변숫값을 반환하고, 여러 개면 출력 매개 변숫값을 포함하는 튜플을 반환하므로, GetWindowRect 함수는 이제 호출되면 RECT 인스턴스를 반환합니다.

Output parameters can be combined with the @ref{3327,,errcheck} protocol to do
further output processing and error checking.  The win32 @code{GetWindowRect} api
function returns a @code{BOOL} to signal success or failure, so this function could
do the error checking, and raises an exception when the api call failed:

@example
>>> def errcheck(result, func, args):
...     if not result:
...         raise WinError()
...     return args
...
>>> GetWindowRect.errcheck = errcheck
>>>
@end example

If the @ref{3327,,errcheck} function returns the argument tuple it receives
unchanged, @code{ctypes} continues the normal processing it does on the output
parameters.  If you want to return a tuple of window coordinates instead of a
@code{RECT} instance, you can retrieve the fields in the function and return them
instead, the normal processing will no longer take place:

@example
>>> def errcheck(result, func, args):
...     if not result:
...         raise WinError()
...     rc = args[1]
...     return rc.left, rc.top, rc.bottom, rc.right
...
>>> GetWindowRect.errcheck = errcheck
>>>
@end example

@node 유틸리티 함수,데이터형<2>,함수 프로토타입,ctypes 레퍼런스
@anchor{library/ctypes ctypes-utility-functions}@anchor{3364}@anchor{library/ctypes utility-functions}@anchor{3365}
@subsubsection 유틸리티 함수


@geindex addressof() (ctypes 모듈)
@anchor{library/ctypes ctypes addressof}@anchor{3366}
@deffn {함수} ctypes.addressof (obj)

메모리 버퍼의 주소를 정수로 반환합니다. `obj'는 ctypes 형의 인스턴스여야 합니다.

인자 @code{obj}로 @ref{1c6c,,감사 이벤트} @code{ctypes.addressof}를 발생시킵니다.
@end deffn

@geindex alignment() (ctypes 모듈)
@anchor{library/ctypes ctypes alignment}@anchor{3367}
@deffn {함수} ctypes.alignment (obj_or_type)

ctypes 형의 정렬 요구 사항을 반환합니다. `obj_or_type'는 ctypes 형이나 인스턴스여야 합니다.
@end deffn

@geindex byref() (ctypes 모듈)
@anchor{library/ctypes ctypes byref}@anchor{332a}
@deffn {함수} ctypes.byref (obj[, offset])

`obj'에 대한 경량 포인터를 반환합니다. `obj'는 ctypes 형의 인스턴스여야 합니다. `offset'의 기본값은 0이며, 내부 포인터 값에 더해질 정수여야 합니다.

@code{byref(obj, offset)}는 이 C 코드에 해당합니다:

@example
(((char *)&obj) + offset)
@end example

반환된 객체는 외부 함수 호출 매개 변수로만 사용할 수 있습니다. @code{pointer(obj)}와 비슷하게 동작하지만, 훨씬 빨리 만들어집니다.
@end deffn

@geindex CopyComPointer() (ctypes 모듈)
@anchor{library/ctypes ctypes CopyComPointer}@anchor{1ea}
@deffn {함수} ctypes.CopyComPointer (src, dst)

Copies a COM pointer from `src' to `dst' and returns the Windows specific
@code{HRESULT} value.

If `src' is not @code{NULL}, its @code{AddRef} method is called, incrementing the
reference count.

In contrast, the reference count of `dst' will not be decremented before
assigning the new value. Unless `dst' is @code{NULL}, the caller is responsible
for decrementing the reference count by calling its @code{Release} method when
necessary.

@ref{213c,,가용성}: Windows


Added in version 3.14.

@end deffn

@geindex cast() (ctypes 모듈)
@anchor{library/ctypes ctypes cast}@anchor{333b}
@deffn {함수} ctypes.cast (obj, type)

이 함수는 C의 형 변환 연산자와 유사합니다. `obj'와 같은 메모리 블록을 가리키는 `type' 형의 새 인스턴스를 반환합니다. `type'은 포인터형이어야 하며, `obj'는 포인터로 해석될 수 있는 객체여야 합니다.
@end deffn

@geindex create_string_buffer() (ctypes 모듈)
@anchor{library/ctypes ctypes create_string_buffer}@anchor{3319}
@deffn {함수} ctypes.create_string_buffer (init, size=None)

@deffnx {함수} ctypes.create_string_buffer (size)

이 함수는 가변 문자 버퍼를 만듭니다. 반환된 객체는 @ref{3306,,c_char}의 ctypes 배열입니다.

If `size' is given (and not @code{None}), it must be an @ref{19b,,int}.
It specifies the size of the returned array.

If the `init' argument is given, it must be @ref{192,,bytes}. It is used
to initialize the array items. Bytes not initialized this way are
set to zero (NUL).

If `size' is not given (or if it is @code{None}), the buffer is made one element
larger than `init', effectively adding a NUL terminator.

If both arguments are given, `size' must not be less than @code{len(init)}.

@cartouche
@quotation 경고 
If `size' is equal to @code{len(init)}, a NUL terminator is
not added. Do not treat such a buffer as a C string.
@end quotation
@end cartouche

For example:

@example
>>> bytes(create_string_buffer(2))
b'\x00\x00'
>>> bytes(create_string_buffer(b'ab'))
b'ab\x00'
>>> bytes(create_string_buffer(b'ab', 2))
b'ab'
>>> bytes(create_string_buffer(b'ab', 4))
b'ab\x00\x00'
>>> bytes(create_string_buffer(b'abcdef', 2))
Traceback (most recent call last):
   ...
ValueError: byte string too long
@end example

@code{init}, @code{size} 인자로 @ref{1c6c,,감사 이벤트} @code{ctypes.create_string_buffer}를 발생시킵니다.
@end deffn

@geindex create_unicode_buffer() (ctypes 모듈)
@anchor{library/ctypes ctypes create_unicode_buffer}@anchor{1db1}
@deffn {함수} ctypes.create_unicode_buffer (init, size=None)

@deffnx {함수} ctypes.create_unicode_buffer (size)

이 함수는 가변 유니코드 문자 버퍼를 만듭니다. 반환된 객체는 @ref{3307,,c_wchar}의 ctypes 배열입니다.

The function takes the same arguments as @ref{3319,,create_string_buffer()} except
`init' must be a string and `size' counts @ref{3307,,c_wchar}.

@code{init}, @code{size} 인자로 @ref{1c6c,,감사 이벤트} @code{ctypes.create_unicode_buffer}를 발생시킵니다.
@end deffn

@geindex DllCanUnloadNow() (ctypes 모듈)
@anchor{library/ctypes ctypes DllCanUnloadNow}@anchor{3368}
@deffn {함수} ctypes.DllCanUnloadNow ()

This function is a hook which allows implementing in-process
COM servers with ctypes.  It is called from the DllCanUnloadNow function that
the _ctypes extension dll exports.

@ref{213c,,가용성}: Windows
@end deffn

@geindex DllGetClassObject() (ctypes 모듈)
@anchor{library/ctypes ctypes DllGetClassObject}@anchor{3369}
@deffn {함수} ctypes.DllGetClassObject ()

This function is a hook which allows implementing in-process
COM servers with ctypes.  It is called from the DllGetClassObject function
that the @code{_ctypes} extension dll exports.

@ref{213c,,가용성}: Windows
@end deffn

@geindex find_library() (ctypes.util 모듈)
@anchor{library/ctypes ctypes util find_library}@anchor{f44}
@deffn {함수} ctypes.util.find_library (name)

라이브러리를 찾아서 경로명을 반환하려고 시도합니다. `name'은 @code{lib} 같은 접두사, @code{.so}, @code{.dylib} 또는 버전 번호와 같은 접미사가 없는 라이브러리 이름입니다 (이것은 posix 링커 옵션 @code{-l}에 사용되는 양식입니다). 라이브러리를 찾을 수 없으면 @code{None}을 반환합니다.

정확한 기능은 시스템에 따라 다릅니다.

See @ref{334c,,공유 라이브러리 찾기} for complete documentation.
@end deffn

@geindex find_msvcrt() (ctypes.util 모듈)
@anchor{library/ctypes ctypes util find_msvcrt}@anchor{336a}
@deffn {함수} ctypes.util.find_msvcrt ()

Returns the filename of the VC runtime library used by Python,
and by the extension modules.  If the name of the library cannot be
determined, @code{None} is returned.

예를 들어, @code{free(void *)}에 대한 호출로 확장 모듈에 의해 할당된 메모리를 해제해야 하면, 메모리를 할당한 것과 같은 라이브러리에 있는 함수를 사용하는 것이 중요합니다.

@ref{213c,,가용성}: Windows
@end deffn

@geindex dllist() (ctypes.util 모듈)
@anchor{library/ctypes ctypes util dllist}@anchor{1f0}
@deffn {함수} ctypes.util.dllist ()

Try to provide a list of paths of the shared libraries loaded into the current
process.  These paths are not normalized or processed in any way.  The function
can raise @ref{2c0,,OSError} if the underlying platform APIs fail.
The exact functionality is system dependent.

On most platforms, the first element of the list represents the current
executable file. It may be an empty string.

@ref{213c,,가용성}: Windows, macOS, iOS, glibc, BSD libc, musl


Added in version 3.14.

@end deffn

@geindex FormatError() (ctypes 모듈)
@anchor{library/ctypes ctypes FormatError}@anchor{336b}
@deffn {함수} ctypes.FormatError ([code])

Returns a textual description of the error code `code'.  If no error code is
specified, the last error code is used by calling the Windows API function
@ref{3326,,GetLastError()}.

@ref{213c,,가용성}: Windows
@end deffn

@geindex GetLastError() (ctypes 모듈)
@anchor{library/ctypes ctypes GetLastError}@anchor{3326}
@deffn {함수} ctypes.GetLastError ()

Returns the last error code set by Windows in the calling thread.
This function calls the Windows @code{GetLastError()} function directly,
it does not return the ctypes-private copy of the error code.

@ref{213c,,가용성}: Windows
@end deffn

@geindex get_errno() (ctypes 모듈)
@anchor{library/ctypes ctypes get_errno}@anchor{3355}
@deffn {함수} ctypes.get_errno ()

호출하는 스레드에서 시스템 @ref{5b,,errno} 변수의 ctypes 내부 복사본의 현재 값을 반환합니다.

인자 없이 @ref{1c6c,,감사 이벤트} @code{ctypes.get_errno}를 발생시킵니다.
@end deffn

@geindex get_last_error() (ctypes 모듈)
@anchor{library/ctypes ctypes get_last_error}@anchor{3357}
@deffn {함수} ctypes.get_last_error ()

Returns the current value of the ctypes-private copy of the system
@code{LastError} variable in the calling thread.

@ref{213c,,가용성}: Windows

인자 없이 @ref{1c6c,,감사 이벤트} @code{ctypes.get_last_error}를 발생시킵니다.
@end deffn

@geindex memmove() (ctypes 모듈)
@anchor{library/ctypes ctypes memmove}@anchor{336c}
@deffn {함수} ctypes.memmove (dst, src, count)

표준 C memmove 라이브러리 함수와 같습니다: `count' 바이트를 `src'에서 `dst'로 복사합니다. `dst' 와 `src'는 정수이거나 포인터로 변환할 수 있는 ctypes 인스턴스여야 합니다.
@end deffn

@geindex memset() (ctypes 모듈)
@anchor{library/ctypes ctypes memset}@anchor{336d}
@deffn {함수} ctypes.memset (dst, c, count)

표준 C memset 라이브러리 함수와 같습니다: 주소 `dst'의 메모리 블록을 값 `c'의 `count' 바이트로 채웁니다. `dst'는 주소를 지정하는 정수거나 ctypes 인스턴스여야 합니다.
@end deffn

@geindex POINTER() (ctypes 모듈)
@anchor{library/ctypes ctypes POINTER}@anchor{1f1}
@deffn {함수} ctypes.POINTER (type, /)

Create or return a ctypes pointer type. Pointer types are cached and
reused internally, so calling this function repeatedly is cheap.
`type' must be a ctypes type.

`CPython 구현 상세:' The resulting pointer type is cached in the @code{__pointer_type__}
attribute of `type'.
It is possible to set this attribute before the first call to
@code{POINTER} in order to set a custom pointer type.
However, doing this is discouraged: manually creating a suitable
pointer type is difficult without relying on implementation
details that may change in future Python versions.
@end deffn

@geindex pointer() (ctypes 모듈)
@anchor{library/ctypes ctypes pointer}@anchor{1a56}
@deffn {함수} ctypes.pointer (obj, /)

Create a new pointer instance, pointing to `obj'.
The returned object is of the type @code{POINTER(type(obj))}.

참고 사항: 객체에 대한 포인터를 단지 외부 함수 호출로 전달하려면 훨씬 빠른 @code{byref(obj)}를 사용해야 합니다.
@end deffn

@geindex resize() (ctypes 모듈)
@anchor{library/ctypes ctypes resize}@anchor{3349}
@deffn {함수} ctypes.resize (obj, size)

이 함수는 `obj'의 내부 메모리 버퍼의 크기를 조정합니다. `obj'는 ctypes 형의 인스턴스여야 합니다. @code{sizeof(type(obj))}로 주어지는 객체 형의 원래 크기보다 버퍼를 작게 만들 수는 없지만, 버퍼를 확대할 수 있습니다.
@end deffn

@geindex set_errno() (ctypes 모듈)
@anchor{library/ctypes ctypes set_errno}@anchor{3356}
@deffn {함수} ctypes.set_errno (value)

호출 중인 스레드의 시스템 @ref{5b,,errno} 변수의 ctypes 내부 복사본의 현재 값을 `value'로 설정하고 이전 값을 반환합니다.

인자 @code{errno}로 @ref{1c6c,,감사 이벤트} @code{ctypes.set_errno}를 발생시킵니다.
@end deffn

@geindex set_last_error() (ctypes 모듈)
@anchor{library/ctypes ctypes set_last_error}@anchor{3358}
@deffn {함수} ctypes.set_last_error (value)

Sets the current value of the ctypes-private copy of the system
@code{LastError} variable in the calling thread to `value' and return the
previous value.

@ref{213c,,가용성}: Windows

인자 @code{error}로 @ref{1c6c,,감사 이벤트} @code{ctypes.set_last_error}를 발생시킵니다.
@end deffn

@geindex sizeof() (ctypes 모듈)
@anchor{library/ctypes ctypes sizeof}@anchor{336e}
@deffn {함수} ctypes.sizeof (obj_or_type)

ctypes 형이나 인스턴스 메모리 버퍼의 크기를 바이트 단위로 반환합니다. C @code{sizeof} 연산자와 같은 일을 합니다.
@end deffn

@geindex string_at() (ctypes 모듈)
@anchor{library/ctypes ctypes string_at}@anchor{1ec}
@deffn {함수} ctypes.string_at (ptr, size=-1)

Return the byte string at `void *ptr'.
If `size' is specified, it is used as size, otherwise the string is assumed
to be zero-terminated.

Raises an @ref{1c6c,,auditing event} @code{ctypes.string_at} with arguments @code{ptr}, @code{size}.
@end deffn

@geindex WinError() (ctypes 모듈)
@anchor{library/ctypes ctypes WinError}@anchor{336f}
@deffn {함수} ctypes.WinError (code=None, descr=None)

Creates an instance of @ref{2c0,,OSError}.  If `code' is not specified,
@ref{3326,,GetLastError()} is called to determine the error code. If `descr' is not
specified, @ref{336b,,FormatError()} is called to get a textual description of the
error.

@ref{213c,,가용성}: Windows


버전 3.3에서 변경: An instance of @ref{1254,,WindowsError} used to be created, which is now an
alias of @ref{2c0,,OSError}.

@end deffn

@geindex wstring_at() (ctypes 모듈)
@anchor{library/ctypes ctypes wstring_at}@anchor{3370}
@deffn {함수} ctypes.wstring_at (ptr, size=-1)

Return the wide-character string at `void *ptr'.
If `size' is specified, it is used as the number of
characters of the string, otherwise the string is assumed to be
zero-terminated.

Raises an @ref{1c6c,,auditing event} @code{ctypes.wstring_at} with arguments @code{ptr}, @code{size}.
@end deffn

@geindex memoryview_at() (ctypes 모듈)
@anchor{library/ctypes ctypes memoryview_at}@anchor{1eb}
@deffn {함수} ctypes.memoryview_at (ptr, size, readonly=False)

Return a @ref{165,,memoryview} object of length `size' that references memory
starting at `void *ptr'.

If `readonly' is true, the returned @code{memoryview} object can
not be used to modify the underlying memory.
(Changes made by other means will still be reflected in the returned
object.)

This function is similar to @ref{1ec,,string_at()} with the key
difference of not making a copy of the specified memory.
It is a semantically equivalent (but more efficient) alternative to
@code{memoryview((c_byte * size).from_address(ptr))}.
(While @ref{3371,,from_address()} only takes integers, `ptr' can also
be given as a @ref{1f1,,ctypes.POINTER} or a @ref{332a,,byref()} object.)

Raises an @ref{1c6c,,auditing event} @code{ctypes.memoryview_at} with arguments @code{address}, @code{size}, @code{readonly}.


Added in version 3.14.

@end deffn

@node 데이터형<2>,기본 데이터형<2>,유틸리티 함수,ctypes 레퍼런스
@anchor{library/ctypes ctypes-data-types}@anchor{3372}@anchor{library/ctypes data-types}@anchor{3373}
@subsubsection 데이터형


@geindex _CData (ctypes 클래스)
@anchor{library/ctypes ctypes _CData}@anchor{3374}
@deffn {클래스} ctypes._CData

이 비공개 클래스는 모든 ctypes 데이터형의 공통 베이스 클래스입니다. 무엇보다도, 모든 ctypes 형 인스턴스에는 C 호환 데이터를 보관하는 메모리 블록이 포함됩니다; 메모리 블록의 주소는 @ref{3366,,addressof()} 도우미 함수에 의해 반환됩니다. 다른 인스턴스 변수는 @ref{3375,,_objects}로 노출됩니다; 여기에는 메모리 블록에 포인터가 포함되어있을 때, 살려둘 필요가 있는 다른 파이썬 객체가 포함되어 있습니다.

ctypes 데이터형의 공통 메서드, 이것들은 모두 클래스 메서드입니다 (정확히 말하면, @ref{23d0,,메타 클래스}의 메서드입니다):

@geindex from_buffer() (ctypes._CData 메서드)
@anchor{library/ctypes ctypes _CData from_buffer}@anchor{3376}
@deffn {메서드} from_buffer (source[, offset])

이 메서드는 `source' 객체의 버퍼를 공유하는 ctypes 인스턴스를 반환합니다. `source' 객체는 쓰기 가능한 버퍼 인터페이스를 지원해야 합니다. 선택적 `offset' 매개 변수는 source 버퍼의 오프셋을 바이트 단위로 지정합니다; 기본값은 0입니다. source 버퍼가 충분히 크지 않으면 @ref{2ec,,ValueError}가 발생합니다.

인자 @code{pointer}, @code{size}, @code{offset}으로 @ref{1c6c,,감사 이벤트} @code{ctypes.cdata/buffer}를 발생시킵니다.
@end deffn

@geindex from_buffer_copy() (ctypes._CData 메서드)
@anchor{library/ctypes ctypes _CData from_buffer_copy}@anchor{3377}
@deffn {메서드} from_buffer_copy (source[, offset])

이 메서드는 읽을 수 있어야 하는 `source' 객체 버퍼에서 버퍼를 복사하여 ctypes 인스턴스를 만듭니다. 선택적 `offset' 매개 변수는 원본 버퍼의 오프셋을 바이트 단위로 지정합니다. 기본값은 0입니다. 소스 버퍼가 충분히 크지 않으면 @ref{2ec,,ValueError}가 발생합니다.

인자 @code{pointer}, @code{size}, @code{offset}으로 @ref{1c6c,,감사 이벤트} @code{ctypes.cdata/buffer}를 발생시킵니다.
@end deffn

@geindex from_address() (ctypes._CData 메서드)
@anchor{library/ctypes ctypes _CData from_address}@anchor{3371}
@deffn {메서드} from_address (address)

이 메서드는 정수 `address'로 지정된 메모리를 사용하여 ctypes 형 인스턴스를 반환합니다.

이 메서드와 이 메서드를 간접적으로 호출하는 다른 것들은 인자 @code{address}로 @ref{1c6c,,감사 이벤트} @code{ctypes.cdata}를 발생시킵니다.
@end deffn

@geindex from_param() (ctypes._CData 메서드)
@anchor{library/ctypes ctypes _CData from_param}@anchor{3322}
@deffn {메서드} from_param (obj)

This method adapts `obj' to a ctypes type.  It is called with the actual
object used in a foreign function call when the type is present in the
foreign function’s @ref{17c7,,argtypes} tuple;
it must return an object that can be used as a function call parameter.

모든 ctypes 데이터형은 이 클래스 메서드의 기본 구현을 갖는데, `obj' 가 이 형의 인스턴스면 `obj' 를 반환합니다. 일부 형은 다른 객체도 허용합니다.
@end deffn

@geindex in_dll() (ctypes._CData 메서드)
@anchor{library/ctypes ctypes _CData in_dll}@anchor{3343}
@deffn {메서드} in_dll (library, name)

이 메서드는 공유 라이브러리가 내보낸 ctypes 형 인스턴스를 반환합니다. `name'은 데이터를 내보내는 심볼의 이름이고, `library'는 로드된 공유 라이브러리입니다.
@end deffn

Common class variables of ctypes data types:

@geindex __pointer_type__ (ctypes._CData의 속성)
@anchor{library/ctypes ctypes _CData __pointer_type__}@anchor{1f2}
@deffn {속성} __pointer_type__

The pointer type that was created by calling
@ref{1f1,,POINTER()} for corresponding ctypes data type. If a pointer type
was not yet created, the attribute is missing.


Added in version 3.14.

@end deffn

ctypes 데이터형의 공통 인스턴스 변수:

@geindex _b_base_ (ctypes._CData의 속성)
@anchor{library/ctypes ctypes _CData _b_base_}@anchor{3378}
@deffn {속성} _b_base_

때로 ctypes 데이터 인스턴스는 포함하는 메모리 블록을 소유하지 않고, 베이스 객체의 메모리 블록의 일부를 공유합니다. @ref{3378,,_b_base_} 읽기 전용 멤버는 메모리 블록을 소유한 루트 ctypes 객체입니다.
@end deffn

@geindex _b_needsfree_ (ctypes._CData의 속성)
@anchor{library/ctypes ctypes _CData _b_needsfree_}@anchor{3379}
@deffn {속성} _b_needsfree_

이 읽기 전용 변수는 ctypes 데이터 인스턴스가 메모리 블록을 스스로 할당했을 때 참이고, 그렇지 않으면 거짓입니다.
@end deffn

@geindex _objects (ctypes._CData의 속성)
@anchor{library/ctypes ctypes _CData _objects}@anchor{3375}
@deffn {속성} _objects

이 멤버는 @code{None} 이거나 메모리 블록 내용이 계속 유효하도록 유지되어야 하는 파이썬 객체를 포함하는 딕셔너리입니다. 이 객체는 디버깅을 위해서만 노출됩니다; 이 딕셔너리의 내용을 수정하지 마십시오.
@end deffn
@end deffn

@node 기본 데이터형<2>,구조화된 데이터형,데이터형<2>,ctypes 레퍼런스
@anchor{library/ctypes ctypes-fundamental-data-types-2}@anchor{337a}@anchor{library/ctypes id1}@anchor{337b}
@subsubsection 기본 데이터형


@geindex _SimpleCData (ctypes 클래스)
@anchor{library/ctypes ctypes _SimpleCData}@anchor{337c}
@deffn {클래스} ctypes._SimpleCData

이 비공개 클래스는 모든 기본 ctypes 데이터형의 베이스 클래스입니다. 여기에는 기본 ctypes 데이터형의 공통 어트리뷰트가 들어 있으므로 여기에서 언급합니다. @ref{337c,,_SimpleCData}는 @ref{3374,,_CData}의 서브 클래스이므로, 메서드와 어트리뷰트를 상속받습니다. 포인터가 아니고 포인터를 포함하지 않는 ctypes 데이터형을 이제 피클 할 수 있습니다.

인스턴스에는 어트리뷰트가 하나 있습니다:

@geindex value (ctypes._SimpleCData의 속성)
@anchor{library/ctypes ctypes _SimpleCData value}@anchor{337d}
@deffn {속성} value

이 어트리뷰트는 인스턴스의 실제 값을 포함합니다. 정수형과 포인터형에서는 정수고, 문자형에서는 단일 문자 바이트열 객체나 문자열이고, 문자 포인터형에서는 파이썬 바이트열 객체나 문자열입니다.

When the @code{value} attribute is retrieved from a ctypes instance, usually
a new object is returned each time.  @code{ctypes} does `not' implement
original object return, always a new object is constructed.  The same is
true for all other ctypes object instances.
@end deffn

Each subclass has a class attribute:

@geindex _type_ (ctypes._SimpleCData의 속성)
@anchor{library/ctypes ctypes _SimpleCData _type_}@anchor{3304}
@deffn {속성} _type_

Class attribute that contains an internal type code, as a
single-character string.
See @ref{283f,,기본 데이터형} for a summary.

Types marked * in the summary may be (or always are) aliases of a
different @code{_SimpleCData} subclass, and will not necessarily
use the listed type code.
For example, if the platform’s long, long long
and time_t C types are the same, then @ref{32f8,,c_long},
@ref{3314,,c_longlong} and @ref{1b61,,c_time_t} all refer to a single class,
@code{c_long}, whose @ref{3304,,_type_} code is @code{'l'}.
The @code{'L'} code will be unused.


@subsubheading 더 보기


The @ref{8,,array} and @ref{283b,,struct} modules,
as well as third-party modules like numpy@footnote{https://numpy.org/doc/stable/reference/arrays.interface.html#object.__array_interface__},
use similar – but slightly different – type codes.

@end deffn
@end deffn

Fundamental data types, when returned as foreign function call results, or, for
example, by retrieving structure field members or array items, are transparently
converted to native Python types.  In other words, if a foreign function has a
@ref{3325,,restype} of @ref{1a57,,c_char_p}, you will always receive a Python bytes
object, `not' a @code{c_char_p} instance.

@c XXX above is false, it actually returns a Unicode string

Subclasses of fundamental data types do `not' inherit this behavior. So, if a
foreign functions @code{restype} is a subclass of @ref{1a59,,c_void_p}, you will
receive an instance of this subclass from the function call. Of course, you can
get the value of the pointer by accessing the @code{value} attribute.

다음은 기본 ctypes 데이터형입니다:

@geindex c_byte (ctypes 클래스)
@anchor{library/ctypes ctypes c_byte}@anchor{1ade}
@deffn {클래스} ctypes.c_byte

Represents the C signed char datatype, and interprets the value as
small integer.  The constructor accepts an optional integer initializer; no
overflow checking is done.
@end deffn

@geindex c_char (ctypes 클래스)
@anchor{library/ctypes ctypes c_char}@anchor{3306}
@deffn {클래스} ctypes.c_char

Represents the C char datatype, and interprets the value as a single
character.  The constructor accepts an optional string initializer, the
length of the string must be exactly one character.
@end deffn

@geindex c_char_p (ctypes 클래스)
@anchor{library/ctypes ctypes c_char_p}@anchor{1a57}
@deffn {클래스} ctypes.c_char_p

Represents the C char* datatype when it points to a zero-terminated
string.  For a general character pointer that may also point to binary data,
@code{POINTER(c_char)} must be used.  The constructor accepts an integer
address, or a bytes object.
@end deffn

@geindex c_double (ctypes 클래스)
@anchor{library/ctypes ctypes c_double}@anchor{1cb5}
@deffn {클래스} ctypes.c_double

Represents the C double datatype.  The constructor accepts an
optional float initializer.
@end deffn

@geindex c_longdouble (ctypes 클래스)
@anchor{library/ctypes ctypes c_longdouble}@anchor{1cb6}
@deffn {클래스} ctypes.c_longdouble

Represents the C long double datatype.  The constructor accepts an
optional float initializer.  On platforms where @code{sizeof(long double) ==
sizeof(double)} it is an alias to @ref{1cb5,,c_double}.
@end deffn

@geindex c_float (ctypes 클래스)
@anchor{library/ctypes ctypes c_float}@anchor{3317}
@deffn {클래스} ctypes.c_float

Represents the C float datatype.  The constructor accepts an
optional float initializer.
@end deffn

@geindex c_double_complex (ctypes 클래스)
@anchor{library/ctypes ctypes c_double_complex}@anchor{1ee}
@deffn {클래스} ctypes.c_double_complex

Represents the C double complex datatype, if available.  The
constructor accepts an optional @ref{197,,complex} initializer.


Added in version 3.14.

@end deffn

@geindex c_float_complex (ctypes 클래스)
@anchor{library/ctypes ctypes c_float_complex}@anchor{1ed}
@deffn {클래스} ctypes.c_float_complex

Represents the C float complex datatype, if available.  The
constructor accepts an optional @ref{197,,complex} initializer.


Added in version 3.14.

@end deffn

@geindex c_longdouble_complex (ctypes 클래스)
@anchor{library/ctypes ctypes c_longdouble_complex}@anchor{1ef}
@deffn {클래스} ctypes.c_longdouble_complex

Represents the C long double complex datatype, if available.  The
constructor accepts an optional @ref{197,,complex} initializer.


Added in version 3.14.

@end deffn

@geindex c_int (ctypes 클래스)
@anchor{library/ctypes ctypes c_int}@anchor{32f7}
@deffn {클래스} ctypes.c_int

Represents the C signed int datatype.  The constructor accepts an
optional integer initializer; no overflow checking is done.  On platforms
where @code{sizeof(int) == sizeof(long)} it is an alias to @ref{32f8,,c_long}.
@end deffn

@geindex c_int8 (ctypes 클래스)
@anchor{library/ctypes ctypes c_int8}@anchor{330a}
@deffn {클래스} ctypes.c_int8

Represents the C 8-bit signed int datatype.  It is an alias for
@ref{1ade,,c_byte}.
@end deffn

@geindex c_int16 (ctypes 클래스)
@anchor{library/ctypes ctypes c_int16}@anchor{330b}
@deffn {클래스} ctypes.c_int16

Represents the C 16-bit signed int datatype.  Usually an alias for
@ref{3308,,c_short}.
@end deffn

@geindex c_int32 (ctypes 클래스)
@anchor{library/ctypes ctypes c_int32}@anchor{330c}
@deffn {클래스} ctypes.c_int32

Represents the C 32-bit signed int datatype.  Usually an alias for
@ref{32f7,,c_int}.
@end deffn

@geindex c_int64 (ctypes 클래스)
@anchor{library/ctypes ctypes c_int64}@anchor{330d}
@deffn {클래스} ctypes.c_int64

Represents the C 64-bit signed int datatype.  Usually an alias for
@ref{3314,,c_longlong}.
@end deffn

@geindex c_long (ctypes 클래스)
@anchor{library/ctypes ctypes c_long}@anchor{32f8}
@deffn {클래스} ctypes.c_long

Represents the C signed long datatype.  The constructor accepts an
optional integer initializer; no overflow checking is done.
@end deffn

@geindex c_longlong (ctypes 클래스)
@anchor{library/ctypes ctypes c_longlong}@anchor{3314}
@deffn {클래스} ctypes.c_longlong

Represents the C signed long long datatype.  The constructor accepts
an optional integer initializer; no overflow checking is done.
On platforms where @code{sizeof(long long) == sizeof(long)} it is an alias
to @ref{32f8,,c_long}.
@end deffn

@geindex c_short (ctypes 클래스)
@anchor{library/ctypes ctypes c_short}@anchor{3308}
@deffn {클래스} ctypes.c_short

Represents the C signed short datatype.  The constructor accepts an
optional integer initializer; no overflow checking is done.
@end deffn

@geindex c_size_t (ctypes 클래스)
@anchor{library/ctypes ctypes c_size_t}@anchor{3316}
@deffn {클래스} ctypes.c_size_t

Represents the C @code{size_t} datatype.
Usually an alias for another unsigned integer type.
@end deffn

@geindex c_ssize_t (ctypes 클래스)
@anchor{library/ctypes ctypes c_ssize_t}@anchor{1441}
@deffn {클래스} ctypes.c_ssize_t

Represents the @ref{c54,,Py_ssize_t} datatype.
This is a signed version of @code{size_t};
that is, the POSIX @code{ssize_t} type.
Usually an alias for another integer type.


Added in version 3.2.

@end deffn

@geindex c_time_t (ctypes 클래스)
@anchor{library/ctypes ctypes c_time_t}@anchor{1b61}
@deffn {클래스} ctypes.c_time_t

Represents the C @code{time_t} datatype.
Usually an alias for another integer type.


Added in version 3.12.

@end deffn

@geindex c_ubyte (ctypes 클래스)
@anchor{library/ctypes ctypes c_ubyte}@anchor{1adf}
@deffn {클래스} ctypes.c_ubyte

Represents the C unsigned char datatype, it interprets the value as
small integer.  The constructor accepts an optional integer initializer; no
overflow checking is done.
@end deffn

@geindex c_uint (ctypes 클래스)
@anchor{library/ctypes ctypes c_uint}@anchor{330e}
@deffn {클래스} ctypes.c_uint

Represents the C unsigned int datatype.  The constructor accepts an
optional integer initializer; no overflow checking is done.  On platforms
where @code{sizeof(int) == sizeof(long)} it is an alias for @ref{3313,,c_ulong}.
@end deffn

@geindex c_uint8 (ctypes 클래스)
@anchor{library/ctypes ctypes c_uint8}@anchor{330f}
@deffn {클래스} ctypes.c_uint8

Represents the C 8-bit unsigned int datatype.  It is an alias for
@ref{1adf,,c_ubyte}.
@end deffn

@geindex c_uint16 (ctypes 클래스)
@anchor{library/ctypes ctypes c_uint16}@anchor{3310}
@deffn {클래스} ctypes.c_uint16

Represents the C 16-bit unsigned int datatype.  Usually an alias for
@ref{3309,,c_ushort}.
@end deffn

@geindex c_uint32 (ctypes 클래스)
@anchor{library/ctypes ctypes c_uint32}@anchor{3311}
@deffn {클래스} ctypes.c_uint32

Represents the C 32-bit unsigned int datatype.  Usually an alias for
@ref{330e,,c_uint}.
@end deffn

@geindex c_uint64 (ctypes 클래스)
@anchor{library/ctypes ctypes c_uint64}@anchor{3312}
@deffn {클래스} ctypes.c_uint64

Represents the C 64-bit unsigned int datatype.  Usually an alias for
@ref{3315,,c_ulonglong}.
@end deffn

@geindex c_ulong (ctypes 클래스)
@anchor{library/ctypes ctypes c_ulong}@anchor{3313}
@deffn {클래스} ctypes.c_ulong

Represents the C unsigned long datatype.  The constructor accepts an
optional integer initializer; no overflow checking is done.
@end deffn

@geindex c_ulonglong (ctypes 클래스)
@anchor{library/ctypes ctypes c_ulonglong}@anchor{3315}
@deffn {클래스} ctypes.c_ulonglong

Represents the C unsigned long long datatype.  The constructor
accepts an optional integer initializer; no overflow checking is done.
On platforms where @code{sizeof(long long) == sizeof(long)} it is an alias
to @ref{32f8,,c_long}.
@end deffn

@geindex c_ushort (ctypes 클래스)
@anchor{library/ctypes ctypes c_ushort}@anchor{3309}
@deffn {클래스} ctypes.c_ushort

Represents the C unsigned short datatype.  The constructor accepts
an optional integer initializer; no overflow checking is done.
@end deffn

@geindex c_void_p (ctypes 클래스)
@anchor{library/ctypes ctypes c_void_p}@anchor{1a59}
@deffn {클래스} ctypes.c_void_p

Represents the C void* type.  The value is represented as integer.
The constructor accepts an optional integer initializer.
@end deffn

@geindex c_wchar (ctypes 클래스)
@anchor{library/ctypes ctypes c_wchar}@anchor{3307}
@deffn {클래스} ctypes.c_wchar

C @code{wchar_t} 데이터형을 나타내고, 값을 단일 문자 유니코드 문자열로 해석합니다. 생성자는 선택적 문자열 초기화자를 받아들입니다, 문자열의 길이는 정확히 한 문자여야 합니다.
@end deffn

@geindex c_wchar_p (ctypes 클래스)
@anchor{library/ctypes ctypes c_wchar_p}@anchor{1a58}
@deffn {클래스} ctypes.c_wchar_p

Represents the C wchar_t* datatype, which must be a pointer to a
zero-terminated wide character string.  The constructor accepts an integer
address, or a string.
@end deffn

@geindex c_bool (ctypes 클래스)
@anchor{library/ctypes ctypes c_bool}@anchor{3305}
@deffn {클래스} ctypes.c_bool

Represent the C bool datatype (more accurately, _Bool from
C99).  Its value can be @code{True} or @code{False}, and the constructor accepts any object
that has a truth value.
@end deffn

@geindex HRESULT (ctypes 클래스)
@anchor{library/ctypes ctypes HRESULT}@anchor{3359}
@deffn {클래스} ctypes.HRESULT

Represents a @code{HRESULT} value, which contains success or
error information for a function or method call.

@ref{213c,,가용성}: Windows
@end deffn

@geindex py_object (ctypes 클래스)
@anchor{library/ctypes ctypes py_object}@anchor{1f3}
@deffn {클래스} ctypes.py_object

Represents the C @ref{5dc,,PyObject}* datatype.  Calling this without an
argument creates a @code{NULL} PyObject* pointer.


버전 3.14에서 변경: @code{py_object} is now a @ref{1a1,,generic type}.

@end deffn
@anchor{library/ctypes ctypes-wintypes}@anchor{3318}
The @code{ctypes.wintypes} module provides quite some other Windows specific
data types, for example @code{HWND}, @code{WPARAM},
@code{VARIANT_BOOL} or @code{DWORD}.
Some useful structures like @code{MSG} or @code{RECT} are also defined.

@node 구조화된 데이터형,배열과 포인터,기본 데이터형<2>,ctypes 레퍼런스
@anchor{library/ctypes ctypes-structured-data-types}@anchor{337e}@anchor{library/ctypes structured-data-types}@anchor{337f}
@subsubsection 구조화된 데이터형


@geindex Union (ctypes 클래스)
@anchor{library/ctypes ctypes Union}@anchor{1e6}
@deffn {클래스} ctypes.Union (*args, **kw)

네이티브 바이트 순서의 공용체를 위한 추상 베이스 클래스.

Unions share common attributes and behavior with structures;
see @ref{1e5,,Structure} documentation for details.
@end deffn

@geindex BigEndianUnion (ctypes 클래스)
@anchor{library/ctypes ctypes BigEndianUnion}@anchor{1bb5}
@deffn {클래스} ctypes.BigEndianUnion (*args, **kw)

Abstract base class for unions in `big endian' byte order.


Added in version 3.11.

@end deffn

@geindex LittleEndianUnion (ctypes 클래스)
@anchor{library/ctypes ctypes LittleEndianUnion}@anchor{1bb6}
@deffn {클래스} ctypes.LittleEndianUnion (*args, **kw)

Abstract base class for unions in `little endian' byte order.


Added in version 3.11.

@end deffn

@geindex BigEndianStructure (ctypes 클래스)
@anchor{library/ctypes ctypes BigEndianStructure}@anchor{332f}
@deffn {클래스} ctypes.BigEndianStructure (*args, **kw)

`빅엔디안(big endian)' 바이트 순서의 구조체를 위한 추상 베이스 클래스.
@end deffn

@geindex LittleEndianStructure (ctypes 클래스)
@anchor{library/ctypes ctypes LittleEndianStructure}@anchor{3330}
@deffn {클래스} ctypes.LittleEndianStructure (*args, **kw)

`리틀엔디안(little endian)' 바이트 순서로의 구조체를 위한 추상 베이스 클래스.
@end deffn

Structures and unions with non-native byte order cannot contain pointer type
fields, or any other data types containing pointer type fields.

@geindex Structure (ctypes 클래스)
@anchor{library/ctypes ctypes Structure}@anchor{1e5}
@deffn {클래스} ctypes.Structure (*args, **kw)

`네이티브' 바이트 순서의 구조체를 위한 추상 베이스 클래스.

Concrete structure and union types must be created by subclassing one of these
types, and at least define a @ref{1937,,_fields_} class variable. @code{ctypes} will
create @ref{1884,,descriptor}s which allow reading and writing the fields by direct
attribute accesses.  These are the

@geindex _fields_ (ctypes.Structure의 속성)
@anchor{library/ctypes ctypes Structure _fields_}@anchor{1937}
@deffn {속성} _fields_

구조체 필드를 정의하는 시퀀스. 항목은 2-튜플이나 3-튜플이어야 합니다. 첫 번째 항목은 필드의 이름이고, 두 번째 항목은 필드의 형을 지정합니다; 모든 ctypes 데이터형이 될 수 있습니다.

@ref{32f7,,c_int}와 같은 정수형 필드에서는, 세 번째 선택적 항목을 지정할 수 있습니다. 필드의 비트 폭을 정의하는 작은 양의 정수여야 합니다.

필드 이름은 하나의 구조체나 공용체 내에서 고유해야 합니다. 이것은 검사되지 않습니다, 이름이 중복되면 하나의 필드만 액세스할 수 있습니다.

@ref{1937,,_fields_} 클래스 변수를, Structure 서브 클래스를 정의하는 클래스 문 `뒤에서' 정의할 수 있습니다. 직접 또는 간접적으로 자신을 참조하는 데이터형을 만들 수 있게 합니다:

@example
class List(Structure):
    pass
List._fields_ = [("pnext", POINTER(List)),
                 ...
                ]
@end example

The @code{_fields_} class variable can only be set once.
Later assignments will raise an @ref{5ee,,AttributeError}.

Additionally, the @code{_fields_} class variable must be defined before
the structure or union type is first used: an instance or subclass is
created, @ref{336e,,sizeof()} is called on it, and so on.
Later assignments to @code{_fields_} will raise an @ref{5ee,,AttributeError}.
If @code{_fields_} has not been set before such use,
the structure or union will have no own fields, as if @code{_fields_}
was empty.

Sub-subclasses of structure types inherit the fields of the base class
plus the @ref{1937,,_fields_} defined in the sub-subclass, if any.
@end deffn

@geindex _pack_ (ctypes.Structure의 속성)
@anchor{library/ctypes ctypes Structure _pack_}@anchor{317}
@deffn {속성} _pack_

An optional small integer that allows overriding the alignment of
structure fields in the instance.

This is only implemented for the MSVC-compatible memory layout
(see @ref{1e7,,_layout_}).

Setting @code{_pack_} to 0 is the same as not setting it at all.
Otherwise, the value must be a positive power of two.
The effect is equivalent to @code{#pragma pack(N)} in C, except
@code{ctypes} may allow larger `n' than what the compiler accepts.

@code{_pack_} must already be defined
when @ref{1937,,_fields_} is assigned, otherwise it will have no effect.


Deprecated since version 3.14, will be removed in version 3.19: For historical reasons, if @code{_pack_} is non-zero,
the MSVC-compatible layout will be used by default.
On non-Windows platforms, this default is deprecated and is slated to
become an error in Python 3.19.
If it is intended, set @ref{1e7,,_layout_} to @code{'ms'}
explicitly.

@end deffn

@geindex _align_ (ctypes.Structure의 속성)
@anchor{library/ctypes ctypes Structure _align_}@anchor{4e8}
@deffn {속성} _align_

An optional small integer that allows increasing the alignment of
the structure when being packed or unpacked to/from memory.

The value must not be negative.
The effect is equivalent to @code{__attribute__((aligned(N)))} on GCC
or @code{#pragma align(N)} on MSVC, except @code{ctypes} may allow
values that the compiler would reject.

@code{_align_} can only `increase' a structure’s alignment
requirements. Setting it to 0 or 1 has no effect.

Using values that are not powers of two is discouraged and may lead to
surprising behavior.

@code{_align_} must already be defined
when @ref{1937,,_fields_} is assigned, otherwise it will have no effect.


Added in version 3.13.

@end deffn

@geindex _layout_ (ctypes.Structure의 속성)
@anchor{library/ctypes ctypes Structure _layout_}@anchor{1e7}
@deffn {속성} _layout_

An optional string naming the struct/union layout. It can currently
be set to:


@itemize -

@item 
@code{"ms"}: the layout used by the Microsoft compiler (MSVC).
On GCC and Clang, this layout can be selected with
@code{__attribute__((ms_struct))}.

@item 
@code{"gcc-sysv"}: the layout used by GCC with the System V or “SysV-like”
data model, as used on Linux and macOS.
With this layout, @ref{317,,_pack_} must be unset or zero.
@end itemize

If not set explicitly, @code{ctypes} will use a default that
matches the platform conventions. This default may change in future
Python releases (for example, when a new platform gains official support,
or when a difference between similar platforms is found).
Currently the default will be:


@itemize -

@item 
On Windows: @code{"ms"}

@item 
When @ref{317,,_pack_} is specified: @code{"ms"}.
(This is deprecated; see @code{_pack_} documentation.)

@item 
Otherwise: @code{"gcc-sysv"}
@end itemize

@code{_layout_} must already be defined when
@ref{1937,,_fields_} is assigned, otherwise it will have no effect.


Added in version 3.14.

@end deffn

@geindex _anonymous_ (ctypes.Structure의 속성)
@anchor{library/ctypes ctypes Structure _anonymous_}@anchor{3380}
@deffn {속성} _anonymous_

이름 없는(익명) 필드의 이름을 나열하는 선택적 시퀀스. @ref{1937,,_fields_}가 대입될 때 @ref{3380,,_anonymous_}는 이미 정의되어 있어야 합니다. 그렇지 않으면 아무 효과가 없습니다.

The fields listed in this variable must be structure or union type fields.
@code{ctypes} will create descriptors in the structure type that allows
accessing the nested fields directly, without the need to create the
structure or union field.

다음은 예제 형입니다 (윈도우):

@example
class _U(Union):
    _fields_ = [("lptdesc", POINTER(TYPEDESC)),
                ("lpadesc", POINTER(ARRAYDESC)),
                ("hreftype", HREFTYPE)]

class TYPEDESC(Structure):
    _anonymous_ = ("u",)
    _fields_ = [("u", _U),
                ("vt", VARTYPE)]
@end example

@code{TYPEDESC} 구조체는 COM 데이터형을 설명합니다. @code{vt} 필드는 공용체 필드 중 어느 것이 유효한지 지정합니다. @code{u} 필드가 익명 필드로 정의되었으므로, 이제 TYPEDESC 인스턴스에서 멤버에 직접 액세스할 수 있습니다. @code{td.lptdesc}와 @code{td.u.lptdesc}는 동등하지만, 앞에 있는 것이 임시 공용체 인스턴스를 만들 필요가 없으므로 더 빠릅니다:

@example
td = TYPEDESC()
td.vt = VT_PTR
td.lptdesc = POINTER(some_type)
td.u.lptdesc = POINTER(some_type)
@end example
@end deffn

구조체 형의 서브-서브 클래스를 정의할 수 있으며, 베이스 클래스의 필드를 상속합니다. 서브 클래스 정의에 별도의 @ref{1937,,_fields_} 변수가 있으면, 여기에 지정된 필드가 베이스 클래스의 필드에 추가됩니다.

구조체와 공용체 생성자는 위치와 키워드 인자를 모두 받아들입니다. 위치 인자는 @ref{1937,,_fields_}에 나타나는 순서대로 멤버 필드를 초기화하는 데 사용됩니다. 생성자의 키워드 인자는 어트리뷰트 대입으로 해석되므로, @code{_fields_}를 같은 이름으로 초기화하거나, @code{_fields_}에 없는 이름에 대한 새 어트리뷰트를 만듭니다.
@end deffn

@geindex CField (ctypes 클래스)
@anchor{library/ctypes ctypes CField}@anchor{1e8}
@deffn {클래스} ctypes.CField (*args, **kw)

Descriptor for fields of a @ref{1e5,,Structure} and @ref{1e6,,Union}.
For example:

@example
>>> class Color(Structure):
...     _fields_ = (
...         ('red', c_uint8),
...         ('green', c_uint8),
...         ('blue', c_uint8),
...         ('intense', c_bool, 1),
...         ('blinking', c_bool, 1),
...    )
...
>>> Color.red
<ctypes.CField 'red' type=c_ubyte, ofs=0, size=1>
>>> Color.green.type
<class 'ctypes.c_ubyte'>
>>> Color.blue.byte_offset
2
>>> Color.intense
<ctypes.CField 'intense' type=c_bool, ofs=3, bit_size=1, bit_offset=0>
>>> Color.blinking.bit_offset
1
@end example

All attributes are read-only.

@code{CField} objects are created via @ref{1937,,_fields_};
do not instantiate the class directly.


Added in version 3.14: Previously, descriptors only had @code{offset} and @code{size} attributes
and a readable string representation; the @code{CField} class was not
available directly.


@geindex name (ctypes.CField의 속성)
@anchor{library/ctypes ctypes CField name}@anchor{3381}
@deffn {속성} name

Name of the field, as a string.
@end deffn

@geindex type (ctypes.CField의 속성)
@anchor{library/ctypes ctypes CField type}@anchor{3382}
@deffn {속성} type

Type of the field, as a @ref{3372,,ctypes class}.
@end deffn

@geindex offset (ctypes.CField의 속성)
@geindex byte_offset (ctypes.CField의 속성)
@anchor{library/ctypes ctypes CField offset}@anchor{3383}
@deffn {속성} offset
@anchor{library/ctypes ctypes CField byte_offset}@anchor{3384}
@deffnx {속성} byte_offset

Offset of the field, in bytes.

For bitfields, this is the offset of the underlying byte-aligned
`storage unit'; see @ref{3385,,bit_offset}.
@end deffn

@geindex byte_size (ctypes.CField의 속성)
@anchor{library/ctypes ctypes CField byte_size}@anchor{3386}
@deffn {속성} byte_size

Size of the field, in bytes.

For bitfields, this is the size of the underlying `storage unit'.
Typically, it has the same size as the bitfield’s type.
@end deffn

@geindex size (ctypes.CField의 속성)
@anchor{library/ctypes ctypes CField size}@anchor{3387}
@deffn {속성} size

For non-bitfields, equivalent to @ref{3386,,byte_size}.

For bitfields, this contains a backwards-compatible bit-packed
value that combines @ref{3388,,bit_size} and
@ref{3385,,bit_offset}.
Prefer using the explicit attributes instead.
@end deffn

@geindex is_bitfield (ctypes.CField의 속성)
@anchor{library/ctypes ctypes CField is_bitfield}@anchor{3389}
@deffn {속성} is_bitfield

True if this is a bitfield.
@end deffn

@geindex bit_offset (ctypes.CField의 속성)
@geindex bit_size (ctypes.CField의 속성)
@anchor{library/ctypes ctypes CField bit_offset}@anchor{3385}
@deffn {속성} bit_offset
@anchor{library/ctypes ctypes CField bit_size}@anchor{3388}
@deffnx {속성} bit_size

The location of a bitfield within its `storage unit', that is, within
@ref{3386,,byte_size} bytes of memory starting at
@ref{3384,,byte_offset}.

To get the field’s value, read the storage unit as an integer,
@ref{24c9,,shift left} by @code{bit_offset} and
take the @code{bit_size} least significant bits.

For non-bitfields, @code{bit_offset} is zero
and @code{bit_size} is equal to @code{byte_size * 8}.
@end deffn

@geindex is_anonymous (ctypes.CField의 속성)
@anchor{library/ctypes ctypes CField is_anonymous}@anchor{338a}
@deffn {속성} is_anonymous

True if this field is anonymous, that is, it contains nested sub-fields
that should be merged into a containing structure or union.
@end deffn
@end deffn

@node 배열과 포인터,Exceptions<4>,구조화된 데이터형,ctypes 레퍼런스
@anchor{library/ctypes arrays-and-pointers}@anchor{338b}@anchor{library/ctypes ctypes-arrays-pointers}@anchor{338c}
@subsubsection 배열과 포인터


@geindex Array (ctypes 클래스)
@anchor{library/ctypes ctypes Array}@anchor{1e09}
@deffn {클래스} ctypes.Array (*args)

배열의 추상 베이스 클래스.

The recommended way to create concrete array types is by multiplying any
@code{ctypes} data type with a non-negative integer.  Alternatively, you can subclass
this type and define @ref{338d,,_length_} and @ref{338e,,_type_} class variables.
Array elements can be read and written using standard
subscript and slice accesses; for slice reads, the resulting object is
`not' itself an @code{Array}.

@geindex _length_ (ctypes.Array의 속성)
@anchor{library/ctypes ctypes Array _length_}@anchor{338d}
@deffn {속성} _length_

배열의 요소 수를 지정하는 양의 정수. 범위를 벗어나는 서브 스크립트는 @ref{173a,,IndexError}를 일으킵니다. @ref{83f,,len()}에 의해 반환됩니다.
@end deffn

@geindex _type_ (ctypes.Array의 속성)
@anchor{library/ctypes ctypes Array _type_}@anchor{338e}
@deffn {속성} _type_

배열의 각 요소 형을 지정합니다.
@end deffn

Array 서브 클래스 생성자는 요소를 순서대로 초기화하는 데 사용되는 위치 인자를 받아들입니다.
@end deffn

@geindex ARRAY() (ctypes 모듈)
@anchor{library/ctypes ctypes ARRAY}@anchor{59d}
@deffn {함수} ctypes.ARRAY (type, length)

Create an array.
Equivalent to @code{type * length}, where `type' is a
@code{ctypes} data type and `length' an integer.

This function is @ref{23d,,soft deprecated} in favor of multiplication.
There are no plans to remove it.
@end deffn

@geindex _Pointer (ctypes 클래스)
@anchor{library/ctypes ctypes _Pointer}@anchor{338f}
@deffn {클래스} ctypes._Pointer

포인터를 위한 내부 추상 베이스 클래스.

구상 포인터형은 가리킬 형으로 @ref{1f1,,POINTER()}를 호출해서 만들어집니다; 이것은 @ref{1a56,,pointer()}에 의해 자동으로 수행됩니다.

포인터가 배열을 가리키면, 그것의 요소는 표준 서브 스크립트 및 슬라이스 액세스를 사용하여 읽고 쓸 수 있습니다. 포인터 객체는 크기가 없으므로, @ref{83f,,len()}는 @ref{198,,TypeError}를 발생시킵니다. 음수 서브 스크립트는 (C처럼) 포인터 `앞의' 메모리를 읽을 것이고, 범위를 벗어나는 서브 스크립트는 (운이 좋다면) 액세스 위반으로 인해 충돌을 일으킬 것입니다.

@geindex _type_ (ctypes._Pointer의 속성)
@anchor{library/ctypes ctypes _Pointer _type_}@anchor{1853}
@deffn {속성} _type_

가리키는 형을 지정합니다.
@end deffn

@geindex contents (ctypes._Pointer의 속성)
@anchor{library/ctypes ctypes _Pointer contents}@anchor{3336}
@deffn {속성} contents

포인터가 가리키는 객체를 반환합니다. 이 어트리뷰트에 대입하면 대입된 객체를 가리키도록 포인터가 변경됩니다.
@end deffn
@end deffn

@node Exceptions<4>,,배열과 포인터,ctypes 레퍼런스
@anchor{library/ctypes ctypes-exceptions}@anchor{3390}@anchor{library/ctypes exceptions}@anchor{3391}
@subsubsection Exceptions


@geindex ArgumentError
@anchor{library/ctypes ctypes ArgumentError}@anchor{3392}
@deffn {예외} ctypes.ArgumentError

외부 함수 호출이 전달된 인자 중 하나를 변환할 수 없을 때 발생하는 예외.
@end deffn

@geindex COMError
@anchor{library/ctypes ctypes COMError}@anchor{1e9}
@deffn {예외} ctypes.COMError (hresult, text, details)

This exception is raised when a COM method call failed.

@geindex hresult (ctypes.COMError의 속성)
@anchor{library/ctypes ctypes COMError hresult}@anchor{3393}
@deffn {속성} hresult

The integer value representing the error code.
@end deffn

@geindex text (ctypes.COMError의 속성)
@anchor{library/ctypes ctypes COMError text}@anchor{3394}
@deffn {속성} text

The error message.
@end deffn

@geindex details (ctypes.COMError의 속성)
@anchor{library/ctypes ctypes COMError details}@anchor{3395}
@deffn {속성} details

The 5-tuple @code{(descr, source, helpfile, helpcontext, progid)}.

`descr' is the textual description.  `source' is the language-dependent
@code{ProgID} for the class or application that raised the error.  `helpfile'
is the path of the help file.  `helpcontext' is the help context
identifier.  `progid' is the @code{ProgID} of the interface that defined the
error.
@end deffn

@ref{213c,,가용성}: Windows


Added in version 3.14.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Command-line interface libraries,동시 실행,일반 운영 체제 서비스,파이썬 표준 라이브러리
@anchor{library/cmdlinelibs doc}@anchor{3396}@anchor{library/cmdlinelibs cmdlinelibs}@anchor{3397}@anchor{library/cmdlinelibs command-line-interface-libraries}@anchor{3398}@anchor{library/cmdlinelibs translation-repo}@anchor{3399}
@section Command-line interface libraries


The modules described in this chapter assist with implementing
command line and terminal interfaces for applications.

Here’s an overview:

@menu
* argparse — Parser for command-line options@comma{} arguments and subcommands: argparse — Parser for command-line options arguments and subcommands. 
* optparse — 명령 줄 옵션용 구문 분석기:: 
* getpass — 이식성 있는 암호 입력:: 
* fileinput — 여러 입력 스트림에서 줄을 이터레이트 하기:: 
* curses — 문자 셀 디스플레이를 위한 터미널 처리:: 
* curses.textpad — Text input widget for curses programs: curses textpad — Text input widget for curses programs. 
* curses.ascii — ASCII 문자용 유틸리티: curses ascii — ASCII 문자용 유틸리티. 
* curses.panel — curses 용 패널 스택 확장: curses panel — curses 용 패널 스택 확장. 
* cmd — 줄 지향 명령 인터프리터 지원:: 

@end menu

@node argparse — Parser for command-line options arguments and subcommands,optparse — 명령 줄 옵션용 구문 분석기,,Command-line interface libraries
@anchor{library/argparse doc}@anchor{339a}@anchor{library/argparse argparse-parser-for-command-line-options-arguments-and-subcommands}@anchor{339b}@anchor{library/argparse module-argparse}@anchor{7}
@subsection @code{argparse} — Parser for command-line options, arguments and subcommands


@geindex module; argparse


Added in version 3.2.


`소스 코드:' Lib/argparse.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/argparse.py}

@cartouche
@quotation 참고 
While @code{argparse} is the default recommended standard library module
for implementing basic command line applications, authors with more
exacting requirements for exactly how their command line applications
behave may find it doesn’t provide the necessary level of control.
Refer to @ref{339c,,Choosing an argument parsing library} for alternatives to
consider when @code{argparse} doesn’t support behaviors that the application
requires (such as entirely disabling support for interspersed options and
positional arguments, or accepting option parameter values that start
with @code{-} even when they correspond to another defined option).
@end quotation
@end cartouche


__________________________________________________________________


@subsubheading 자습서



이 페이지는 API 레퍼런스 정보를 담고 있습니다. 파이썬 명령행 파싱에 대한 더 친절한 소개를 원하시면, @ref{339d,,argparse 자습서} 를 보십시오.

The @code{argparse} module makes it easy to write user-friendly command-line
interfaces. The program defines what arguments it requires, and @code{argparse}
will figure out how to parse those out of @ref{1469,,sys.argv}.  The @code{argparse}
module also automatically generates help and usage messages.  The module
will also issue errors when users give the program invalid arguments.

The @code{argparse} module’s support for command-line interfaces is built
around an instance of @ref{1bd,,argparse.ArgumentParser}.  It is a container for
argument specifications and has options that apply to the parser as whole:

@example
parser = argparse.ArgumentParser(
                    prog='ProgramName',
                    description='What the program does',
                    epilog='Text at the bottom of help')
@end example

The @ref{4bd,,ArgumentParser.add_argument()} method attaches individual argument
specifications to the parser.  It supports positional arguments, options that
accept values, and on/off flags:

@example
parser.add_argument('filename')           # positional argument
parser.add_argument('-c', '--count')      # option that takes a value
parser.add_argument('-v', '--verbose',
                    action='store_true')  # on/off flag
@end example

The @ref{339e,,ArgumentParser.parse_args()} method runs the parser and places
the extracted data in a @ref{339f,,argparse.Namespace} object:

@example
args = parser.parse_args()
print(args.filename, args.count, args.verbose)
@end example

@cartouche
@quotation 참고 
If you’re looking for a guide about how to upgrade @ref{a4,,optparse} code
to @code{argparse}, see @ref{13b3,,Upgrading Optparse Code}.
@end quotation
@end cartouche

@menu
* ArgumentParser 객체:: 
* add_argument() 메서드: add_argument 메서드. 
* parse_args() 메서드: parse_args 메서드. 
* 기타 유틸리티:: 
* Exceptions: Exceptions<5>. 

@end menu

@node ArgumentParser 객체,add_argument 메서드,,argparse — Parser for command-line options arguments and subcommands
@anchor{library/argparse argumentparser-objects}@anchor{33a0}
@subsubsection ArgumentParser 객체


@geindex ArgumentParser (argparse 클래스)
@anchor{library/argparse argparse ArgumentParser}@anchor{1bd}
@deffn {클래스} argparse.ArgumentParser (prog=None, usage=None, description=None, epilog=None, parents=[], formatter_class=argparse.HelpFormatter, prefix_chars='-', fromfile_prefix_chars=None, argument_default=None, conflict_handler='error', add_help=True, allow_abbrev=True, exit_on_error=True, *, suggest_on_error=False, color=True)

새로운 @ref{1bd,,ArgumentParser} 객체를 만듭니다. 모든 매개 변수는 키워드 인자로 전달되어야 합니다. 매개 변수마다 아래에서 더 자세히 설명되지만, 요약하면 다음과 같습니다:


@itemize *

@item 
@ref{1bc,,prog} - The name of the program (default: generated from the @code{__main__}
module attributes and @code{sys.argv[0]})

@item 
@ref{33a1,,usage} - 프로그램 사용법을 설명하는 문자열 (기본값: 파서에 추가된 인자로부터 만들어지는 값)

@item 
@ref{33a2,,description} - Text to display before the argument help
(by default, no text)

@item 
@ref{33a3,,epilog} - Text to display after the argument help (by default, no text)

@item 
@ref{33a4,,parents} - @ref{1bd,,ArgumentParser} 객체들의 리스트이고, 이 들의 인자들도 포함된다

@item 
@ref{33a5,,formatter_class} - 도움말 출력을 사용자 정의하기 위한 클래스

@item 
@ref{33a6,,prefix_chars} - 선택 인자 앞에 붙는 문자 집합 (기본값: ‘-‘).

@item 
@ref{33a7,,fromfile_prefix_chars} - 추가 인자를 읽어야 하는 파일 앞에 붙는 문자 집합 (기본값: @code{None}).

@item 
@ref{33a8,,argument_default} - 인자의 전역 기본값 (기본값: @code{None})

@item 
@ref{33a9,,conflict_handler} - 충돌하는 선택 사항을 해결하기 위한 전략 (일반적으로 불필요함)

@item 
@ref{33aa,,add_help} - 파서에 @code{-h/--help} 옵션을 추가합니다 (기본값: @code{True})

@item 
@ref{fbd,,allow_abbrev} - Allows long options to be abbreviated if the
abbreviation is unambiguous (default: @code{True})

@item 
@ref{33ab,,exit_on_error} - Determines whether or not @code{ArgumentParser} exits with
error info when an error occurs. (default: @code{True})

@item 
@ref{33ac,,suggest_on_error} - Enables suggestions for mistyped argument choices
and subparser names (default: @code{False})

@item 
@ref{33ad,,color} - Allow color output (default: @code{True})
@end itemize


버전 3.5에서 변경: `allow_abbrev' 매개 변수가 추가되었습니다.



버전 3.8에서 변경: 이전 버전에서는, `allow_abbrev'는 @code{-vv}가 @code{-v -v}를 뜻하는 것과 같은 짧은 플래그의 그룹화도 비활성화했습니다.



버전 3.9에서 변경: `exit_on_error' 매개 변수가 추가되었습니다.



버전 3.14에서 변경: `suggest_on_error' and `color' parameters were added.

@end deffn

다음 절에서는 이들 각각의 사용 방법에 관해 설명합니다.

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

@end menu

@node prog,usage,,ArgumentParser 객체
@anchor{library/argparse id1}@anchor{33ae}@anchor{library/argparse prog}@anchor{1bc}
@subsubsection prog


By default, @ref{1bd,,ArgumentParser} calculates the name of the program
to display in help messages depending on the way the Python interpreter was run:


@itemize *

@item 
The @ref{2c6f,,base name} of @code{sys.argv[0]} if a file was
passed as argument.

@item 
The Python interpreter name followed by @code{sys.argv[0]} if a directory or
a zipfile was passed as argument.

@item 
The Python interpreter name followed by @code{-m} followed by the
module or package name if the @ref{23c,,-m} option was used.
@end itemize

This default is almost always desirable because it will make the help messages
match the string that was used to invoke the program on the command line.
However, to change this default behavior, another value can be supplied using
the @code{prog=} argument to @ref{1bd,,ArgumentParser}:

@example
>>> parser = argparse.ArgumentParser(prog='myprogram')
>>> parser.print_help()
usage: myprogram [-h]

options:
 -h, --help  show this help message and exit
@end example

Note that the program name, whether determined from @code{sys.argv[0]},
from the @code{__main__} module attributes or from the
@code{prog=} argument, is available to help messages using the @code{%(prog)s} format
specifier.

@example
>>> parser = argparse.ArgumentParser(prog='myprogram')
>>> parser.add_argument('--foo', help='foo of the %(prog)s program')
>>> parser.print_help()
usage: myprogram [-h] [--foo FOO]

options:
 -h, --help  show this help message and exit
 --foo FOO   foo of the myprogram program
@end example


버전 3.14에서 변경: The default @code{prog} value now reflects how @code{__main__} was actually executed,
rather than always being @code{os.path.basename(sys.argv[0])}.


@node usage,description,prog,ArgumentParser 객체
@anchor{library/argparse usage}@anchor{33a1}
@subsubsection usage


By default, @ref{1bd,,ArgumentParser} calculates the usage message from the
arguments it contains. The default message can be overridden with the
@code{usage=} keyword argument:

@example
>>> parser = argparse.ArgumentParser(prog='PROG', usage='%(prog)s [options]')
>>> parser.add_argument('--foo', nargs='?', help='foo help')
>>> parser.add_argument('bar', nargs='+', help='bar help')
>>> parser.print_help()
usage: PROG [options]

positional arguments:
 bar          bar help

options:
 -h, --help   show this help message and exit
 --foo [FOO]  foo help
@end example

@code{%(prog)s} 포맷 지정자는 사용법 메시지에서 프로그램 이름을 채울 때 사용할 수 있습니다.

When a custom usage message is specified for the main parser, you may also want to
consider passing  the @code{prog} argument to @ref{e10,,add_subparsers()}
or the @code{prog} and the @code{usage} arguments to
@code{add_parser()}, to ensure consistent command prefixes and
usage information across subparsers.

@node description,epilog,usage,ArgumentParser 객체
@anchor{library/argparse description}@anchor{33a2}@anchor{library/argparse id2}@anchor{33af}
@subsubsection description


Most calls to the @ref{1bd,,ArgumentParser} constructor will use the
@code{description=} keyword argument.  This argument gives a brief description of
what the program does and how it works.  In help messages, the description is
displayed between the command-line usage string and the help messages for the
various arguments.

기본적으로, 설명은 주어진 공간에 맞도록 줄 바꿈 됩니다. 이 동작을 변경하려면 @ref{33a5,,formatter_class} 인자를 참조하십시오.

@node epilog,parents,description,ArgumentParser 객체
@anchor{library/argparse epilog}@anchor{33a3}
@subsubsection epilog


일부 프로그램은 인자에 대한 설명 뒤에 프로그램에 대한 추가 설명을 표시하려고 합니다. 이러한 텍스트는 @code{epilog=} 에 대한 인자를 @ref{1bd,,ArgumentParser} 에 사용하여 지정할 수 있습니다:

@example
>>> parser = argparse.ArgumentParser(
...     description='A foo that bars',
...     epilog="And that's how you'd foo a bar")
>>> parser.print_help()
usage: argparse.py [-h]

A foo that bars

options:
 -h, --help  show this help message and exit

And that's how you'd foo a bar
@end example

@ref{33a2,,description} 인자와 마찬가지로, @code{epilog=} 텍스트가 기본적으로 줄 바꿈 됩니다만, 이 동작은 @ref{33a5,,formatter_class} 인자를 @ref{1bd,,ArgumentParser} 에 제공해서 조정할 수 있습니다.

@node parents,formatter_class,epilog,ArgumentParser 객체
@anchor{library/argparse parents}@anchor{33a4}
@subsubsection parents


때로는 여러 파서가 공통 인자 집합을 공유하는 경우가 있습니다. 이러한 인자의 정의를 반복하는 대신, 모든 공유 인자를 갖는 파서를 @ref{1bd,,ArgumentParser} 에 @code{parents=} 인자로 전달할 수 있습니다. @code{parents=} 인자는 @code{ArgumentParser} 객체의 리스트를 취하여, 그것들로부터 모든 위치와 선택 액션을 수집해서 새로 만들어지는 @code{ArgumentParser} 객체에 추가합니다:

@example
>>> parent_parser = argparse.ArgumentParser(add_help=False)
>>> parent_parser.add_argument('--parent', type=int)

>>> foo_parser = argparse.ArgumentParser(parents=[parent_parser])
>>> foo_parser.add_argument('foo')
>>> foo_parser.parse_args(['--parent', '2', 'XXX'])
Namespace(foo='XXX', parent=2)

>>> bar_parser = argparse.ArgumentParser(parents=[parent_parser])
>>> bar_parser.add_argument('--bar')
>>> bar_parser.parse_args(['--bar', 'YYY'])
Namespace(bar='YYY', parent=None)
@end example

대부분의 부모 파서는 @code{add_help=False} 를 지정합니다. 그렇지 않으면, @ref{1bd,,ArgumentParser} 는 (하나는 부모에, 하나는 자식에 있는) 두 개의 @code{-h/--help} 옵션을 보게 될 것이고, 에러를 발생시킵니다.

@cartouche
@quotation 참고 
@code{parents=} 를 통해 전달하기 전에 파서를 완전히 초기화해야 합니다. 자식 파서 다음에 부모 파서를 변경하면 자식에 반영되지 않습니다.
@end quotation
@end cartouche

@node formatter_class,prefix_chars,parents,ArgumentParser 객체
@anchor{library/argparse formatter-class}@anchor{33a5}@anchor{library/argparse id3}@anchor{33b0}
@subsubsection formatter_class


@ref{1bd,,ArgumentParser} 객체는 대체 포매팅 클래스를 지정함으로써 도움말 포매팅을 사용자 정의 할 수 있도록 합니다. 현재 네 가지 클래스가 있습니다:

@geindex RawDescriptionHelpFormatter (argparse 클래스)
@geindex RawTextHelpFormatter (argparse 클래스)
@geindex ArgumentDefaultsHelpFormatter (argparse 클래스)
@geindex MetavarTypeHelpFormatter (argparse 클래스)
@anchor{library/argparse argparse RawDescriptionHelpFormatter}@anchor{33b1}
@deffn {클래스} argparse.RawDescriptionHelpFormatter
@anchor{library/argparse argparse RawTextHelpFormatter}@anchor{33b2}
@deffnx {클래스} argparse.RawTextHelpFormatter
@anchor{library/argparse argparse ArgumentDefaultsHelpFormatter}@anchor{1c4e}
@deffnx {클래스} argparse.ArgumentDefaultsHelpFormatter
@anchor{library/argparse argparse MetavarTypeHelpFormatter}@anchor{33b3}
@deffnx {클래스} argparse.MetavarTypeHelpFormatter
@end deffn

@ref{33b1,,RawDescriptionHelpFormatter} 와 @ref{33b2,,RawTextHelpFormatter} 는 텍스트 설명이 표시되는 방법을 더 제어할 수 있도록 합니다. 기본적으로, @ref{1bd,,ArgumentParser} 객체는 명령행 도움말 메시지에서 @ref{33a2,,description} 및 @ref{33a3,,epilog} 텍스트를 줄 바꿈 합니다.:

@example
>>> parser = argparse.ArgumentParser(
...     prog='PROG',
...     description='@w{'}'this description
...         was indented weird
...             but that is okay'@w{'}',
...     epilog='@w{'}'
...             likewise for this epilog whose whitespace will
...         be cleaned up and whose words will be wrapped
...         across a couple lines'@w{'}')
>>> parser.print_help()
usage: PROG [-h]

this description was indented weird but that is okay

options:
 -h, --help  show this help message and exit

likewise for this epilog whose whitespace will be cleaned up and whose words
will be wrapped across a couple lines
@end example

@ref{33b1,,RawDescriptionHelpFormatter} 를 @code{formatter_class=} 로 전달하는 것은 @ref{33a2,,description} 과 @ref{33a3,,epilog} 가 이미 올바르게 포맷되어 있어서 줄 바꿈 되어서는 안 된다는 것을 가리킵니다:

@example
>>> parser = argparse.ArgumentParser(
...     prog='PROG',
...     formatter_class=argparse.RawDescriptionHelpFormatter,
...     description=textwrap.dedent('@w{'}'\
...         Please do not mess up this text!
...         --------------------------------
...             I have indented it
...             exactly the way
...             I want it
...         '@w{'}'))
>>> parser.print_help()
usage: PROG [-h]

Please do not mess up this text!
--------------------------------
   I have indented it
   exactly the way
   I want it

options:
 -h, --help  show this help message and exit
@end example

@ref{33b2,,RawTextHelpFormatter} maintains whitespace for all sorts of help text,
including argument descriptions. However, multiple newlines are replaced with
one. If you wish to preserve multiple blank lines, add spaces between the
newlines.

@ref{1c4e,,ArgumentDefaultsHelpFormatter} 는 기본값에 대한 정보를 각각의 인자 도움말 메시지에 자동으로 추가합니다:

@example
>>> parser = argparse.ArgumentParser(
...     prog='PROG',
...     formatter_class=argparse.ArgumentDefaultsHelpFormatter)
>>> parser.add_argument('--foo', type=int, default=42, help='FOO!')
>>> parser.add_argument('bar', nargs='*', default=[1, 2, 3], help='BAR!')
>>> parser.print_help()
usage: PROG [-h] [--foo FOO] [bar ...]

positional arguments:
 bar         BAR! (default: [1, 2, 3])

options:
 -h, --help  show this help message and exit
 --foo FOO   FOO! (default: 42)
@end example

@ref{33b3,,MetavarTypeHelpFormatter} 는 각 인자 값의 표시 이름으로 (일반 포매터처럼 @ref{33b4,,dest} 를 사용하는 대신에) @ref{33b5,,type} 인자의 이름을 사용합니다:

@example
>>> parser = argparse.ArgumentParser(
...     prog='PROG',
...     formatter_class=argparse.MetavarTypeHelpFormatter)
>>> parser.add_argument('--foo', type=int)
>>> parser.add_argument('bar', type=float)
>>> parser.print_help()
usage: PROG [-h] [--foo int] float

positional arguments:
  float

options:
  -h, --help  show this help message and exit
  --foo int
@end example

@node prefix_chars,fromfile_prefix_chars,formatter_class,ArgumentParser 객체
@anchor{library/argparse prefix-chars}@anchor{33a6}
@subsubsection prefix_chars


Most command-line options will use @code{-} as the prefix, e.g. @code{-f/--foo}.
Parsers that need to support different or additional prefix
characters, e.g. for options
like @code{+f} or @code{/foo}, may specify them using the @code{prefix_chars=} argument
to the @ref{1bd,,ArgumentParser} constructor:

@example
>>> parser = argparse.ArgumentParser(prog='PROG', prefix_chars='-+')
>>> parser.add_argument('+f')
>>> parser.add_argument('++bar')
>>> parser.parse_args('+f X ++bar Y'.split())
Namespace(bar='Y', f='X')
@end example

@code{prefix_chars=} 인자의 기본값은 @code{'-'} 입니다. @code{-} 를 포함하지 않는 문자 집합을 제공하면 @code{-f/--foo} 옵션이 허용되지 않게 됩니다.

@node fromfile_prefix_chars,argument_default,prefix_chars,ArgumentParser 객체
@anchor{library/argparse fromfile-prefix-chars}@anchor{33a7}
@subsubsection fromfile_prefix_chars


Sometimes, when dealing with a particularly long argument list, it
may make sense to keep the list of arguments in a file rather than typing it out
at the command line.  If the @code{fromfile_prefix_chars=} argument is given to the
@ref{1bd,,ArgumentParser} constructor, then arguments that start with any of the
specified characters will be treated as files, and will be replaced by the
arguments they contain.  For example:

@example
>>> with open('args.txt', 'w', encoding=sys.getfilesystemencoding()) as fp:
...     fp.write('-f\nbar')
...
>>> parser = argparse.ArgumentParser(fromfile_prefix_chars='@@')
>>> parser.add_argument('-f')
>>> parser.parse_args(['-f', 'foo', '@@args.txt'])
Namespace(f='bar')
@end example

Arguments read from a file must be one per line by default (but see also
@ref{33b6,,convert_arg_line_to_args()}) and are treated as if they
were in the same place as the original file referencing argument on the command
line.  So in the example above, the expression @code{['-f', 'foo', '@@args.txt']}
is considered equivalent to the expression @code{['-f', 'foo', '-f', 'bar']}.

@cartouche
@quotation 참고 
Empty lines are treated as empty strings (@code{'@w{'}}), which are allowed as values but
not as arguments. Empty lines that are read as arguments will result in an
“unrecognized arguments” error.
@end quotation
@end cartouche

@ref{1bd,,ArgumentParser} uses @ref{75c,,filesystem encoding and error handler}
to read the file containing arguments.

@code{fromfile_prefix_chars=} 인자의 기본값은 @code{None} 입니다. 이것은 인자가 절대로 파일 참조로 취급되지 않는다는 것을 의미합니다.


버전 3.12에서 변경: @ref{1bd,,ArgumentParser} changed encoding and errors to read arguments files
from default (e.g. @ref{75b,,locale.getpreferredencoding(False)}
and @code{"strict"}) to the @ref{75c,,filesystem encoding and error handler}.
Arguments file should be encoded in UTF-8 instead of ANSI Codepage on Windows.


@node argument_default,allow_abbrev,fromfile_prefix_chars,ArgumentParser 객체
@anchor{library/argparse argument-default}@anchor{33a8}
@subsubsection argument_default


일반적으로 인자의 기본값은 @ref{4bd,,add_argument()} 에 기본값을 전달하거나 특정 이름-값 쌍 집합을 사용하여 @ref{33b7,,set_defaults()} 메서드를 호출하여 지정됩니다. 그러나 때로는, 파서 전체에 적용되는 단일 기본값을 지정하는 것이 유용 할 수 있습니다. 이것은 @code{argument_default=} 키워드 인자를 @ref{1bd,,ArgumentParser} 에 전달함으로써 이루어질 수 있습니다. 예를 들어, @ref{339e,,parse_args()} 호출에서 어트리뷰트 생성을 전역적으로 억제하려면, @code{argument_default=SUPPRESS} 를 제공합니다:

@example
>>> parser = argparse.ArgumentParser(argument_default=argparse.SUPPRESS)
>>> parser.add_argument('--foo')
>>> parser.add_argument('bar', nargs='?')
>>> parser.parse_args(['--foo', '1', 'BAR'])
Namespace(bar='BAR', foo='1')
>>> parser.parse_args([])
Namespace()
@end example

@node allow_abbrev,conflict_handler,argument_default,ArgumentParser 객체
@anchor{library/argparse allow-abbrev}@anchor{fbd}@anchor{library/argparse id4}@anchor{33b8}
@subsubsection allow_abbrev


일반적으로 @ref{1bd,,ArgumentParser} 의 @ref{339e,,parse_args()} 메서드에 인자 리스트를 건네주면 긴 옵션의 @ref{fbe,,약어를 인식합니다}.

@code{allow_abbrev} 를 @code{False} 로 설정하면 이 기능을 비활성화 할 수 있습니다:

@example
>>> parser = argparse.ArgumentParser(prog='PROG', allow_abbrev=False)
>>> parser.add_argument('--foobar', action='store_true')
>>> parser.add_argument('--foonley', action='store_false')
>>> parser.parse_args(['--foon'])
usage: PROG [-h] [--foobar] [--foonley]
PROG: error: unrecognized arguments: --foon
@end example


Added in version 3.5.


@node conflict_handler,add_help,allow_abbrev,ArgumentParser 객체
@anchor{library/argparse conflict-handler}@anchor{33a9}
@subsubsection conflict_handler


@ref{1bd,,ArgumentParser} 객체는 같은 옵션 문자열을 가진 두 개의 액션을 허용하지 않습니다. 기본적으로 @code{ArgumentParser} 객체는 이미 사용 중인 옵션 문자열로 인자를 만들려고 시도하면 예외를 발생시킵니다

@example
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('-f', '--foo', help='old foo help')
>>> parser.add_argument('--foo', help='new foo help')
Traceback (most recent call last):
 ..
ArgumentError: argument --foo: conflicting option string(s): --foo
@end example

때로는 (예를 들어 @ref{33a4,,parents} 를 사용하는 경우) 같은 옵션 문자열을 갖는 예전의 인자들을 간단히 대체하는 것이 유용 할 수 있습니다. 이 동작을 얻으려면, @ref{1bd,,ArgumentParser} 의 @code{conflict_handler=} 인자에 @code{'resolve'} 값을 제공합니다:

@example
>>> parser = argparse.ArgumentParser(prog='PROG', conflict_handler='resolve')
>>> parser.add_argument('-f', '--foo', help='old foo help')
>>> parser.add_argument('--foo', help='new foo help')
>>> parser.print_help()
usage: PROG [-h] [-f FOO] [--foo FOO]

options:
 -h, --help  show this help message and exit
 -f FOO      old foo help
 --foo FOO   new foo help
@end example

@ref{1bd,,ArgumentParser} 객체는 모든 옵션 문자열이 재정의된 경우에만 액션을 제거합니다. 위의 예에서, 이전의 @code{-f/--foo} 액션은 @code{--foo} 옵션 문자열만 재정의되었기 때문에 @code{-f} 액션으로 유지됩니다.

@node add_help,exit_on_error,conflict_handler,ArgumentParser 객체
@anchor{library/argparse add-help}@anchor{33aa}
@subsubsection add_help


By default, @ref{1bd,,ArgumentParser} objects add an option which simply displays
the parser’s help message. If @code{-h} or @code{--help} is supplied at the command
line, the @code{ArgumentParser} help will be printed.

때에 따라, 이 도움말 옵션을 추가하지 않도록 설정하는 것이 유용 할 수 있습니다. @code{add_help=} 인자를 @code{False} 로 @ref{1bd,,ArgumentParser} 에 전달하면 됩니다:

@example
>>> parser = argparse.ArgumentParser(prog='PROG', add_help=False)
>>> parser.add_argument('--foo', help='foo help')
>>> parser.print_help()
usage: PROG [--foo FOO]

options:
 --foo FOO  foo help
@end example

도움말 옵션은 일반적으로 @code{-h/--help} 입니다. 예외는 @code{prefix_chars=} 가 지정되고 @code{-} 을 포함하지 않는 경우입니다. 이 경우 @code{-h} 와 @code{--help} 는 유효한 옵션이 아닙니다. 이 경우, @code{prefix_chars} 의 첫 번째 문자가 도움말 옵션 접두어로 사용됩니다:

@example
>>> parser = argparse.ArgumentParser(prog='PROG', prefix_chars='+/')
>>> parser.print_help()
usage: PROG [+h]

options:
  +h, ++help  show this help message and exit
@end example

@node exit_on_error,suggest_on_error,add_help,ArgumentParser 객체
@anchor{library/argparse exit-on-error}@anchor{33ab}
@subsubsection exit_on_error


Normally, when you pass an invalid argument list to the @ref{339e,,parse_args()}
method of an @ref{1bd,,ArgumentParser}, it will print a `message' to @ref{b33,,sys.stderr} and exit with a status
code of 2.

If the user would like to catch errors manually, the feature can be enabled by setting
@code{exit_on_error} to @code{False}:

@example
>>> parser = argparse.ArgumentParser(exit_on_error=False)
>>> parser.add_argument('--integers', type=int)
_StoreAction(option_strings=['--integers'], dest='integers', nargs=None, const=None, default=None, type=<class 'int'>, choices=None, help=None, metavar=None)
>>> try:
...     parser.parse_args('--integers a'.split())
... except argparse.ArgumentError:
...     print('Catching an argumentError')
...
Catching an argumentError
@end example


Added in version 3.9.


@node suggest_on_error,color,exit_on_error,ArgumentParser 객체
@anchor{library/argparse suggest-on-error}@anchor{33ac}
@subsubsection suggest_on_error


By default, when a user passes an invalid argument choice or subparser name,
@ref{1bd,,ArgumentParser} will exit with error info and list the permissible
argument choices (if specified) or subparser names as part of the error message.

If the user would like to enable suggestions for mistyped argument choices and
subparser names, the feature can be enabled by setting @code{suggest_on_error} to
@code{True}. Note that this only applies for arguments when the choices specified
are strings:

@example
>>> parser = argparse.ArgumentParser(suggest_on_error=True)
>>> parser.add_argument('--action', choices=['debug', 'dryrun'])
>>> parser.parse_args(['--action', 'debugg'])
usage: tester.py [-h] [--action @{debug,dryrun@}]
tester.py: error: argument --action: invalid choice: 'debugg', maybe you meant 'debug'? (choose from debug, dryrun)
@end example

If you’re writing code that needs to be compatible with older Python versions
and want to opportunistically use @code{suggest_on_error} when it’s available, you
can set it as an attribute after initializing the parser instead of using the
keyword argument:

@example
>>> parser = argparse.ArgumentParser(description='Process some integers.')
>>> parser.suggest_on_error = True
@end example


Added in version 3.14.


@node color,,suggest_on_error,ArgumentParser 객체
@anchor{library/argparse color}@anchor{33ad}
@subsubsection color


By default, the help message is printed in color using ANSI escape sequences@footnote{https://en.wikipedia.org/wiki/ANSI_escape_code}.
If you want plain text help messages, you can disable this @ref{1b7,,in your local environment}, or in the argument parser itself
by setting @code{color} to @code{False}:

@example
>>> parser = argparse.ArgumentParser(description='Process some integers.',
...                                  color=False)
>>> parser.add_argument('--action', choices=['sum', 'max'])
>>> parser.add_argument('integers', metavar='N', type=int, nargs='+',
...                     help='an integer for the accumulator')
>>> parser.parse_args(['--help'])
@end example

Note that when @code{color=True}, colored output depends on both environment
variables and terminal capabilities.  However, if @code{color=False}, colored
output is always disabled, even if environment variables like @code{FORCE_COLOR}
are set.

@cartouche
@quotation 참고 
Error messages will include color codes when redirecting stderr to a
file. To avoid this, set the NO_COLOR@footnote{https://no-color.org/} or 
@geindex PYTHON_COLORS
@geindex 환경 변수; PYTHON_COLORS
@ref{476,,PYTHON_COLORS}
environment variable (for example,
@code{NO_COLOR=1 python script.py 2> errors.txt}).
@end quotation
@end cartouche


Added in version 3.14.


@node add_argument 메서드,parse_args 메서드,ArgumentParser 객체,argparse — Parser for command-line options arguments and subcommands
@anchor{library/argparse the-add-argument-method}@anchor{33b9}
@subsubsection add_argument() 메서드


@geindex add_argument() (argparse.ArgumentParser 메서드)
@anchor{library/argparse argparse ArgumentParser add_argument}@anchor{4bd}
@deffn {메서드} ArgumentParser.add_argument (name or flags..., *[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest][, deprecated])

단일 명령행 인자를 구문 분석하는 방법을 정의합니다. 매개 변수마다 아래에서 더 자세히 설명되지만, 요약하면 다음과 같습니다:


@itemize *

@item 
@ref{33ba,,name or flags} - Either a name or a list of option strings, e.g. @code{'foo'}
or @code{'-f', '--foo'}.

@item 
@ref{192c,,action} - 명령행에서 이 인자가 발견될 때 수행 할 액션의 기본형.

@item 
@ref{1932,,nargs} - 소비되어야 하는 명령행 인자의 수.

@item 
@ref{1934,,const} - 일부 @ref{192c,,action} 및 @ref{1932,,nargs} 를 선택할 때 필요한 상숫값.

@item 
@ref{1933,,default} - 인자가 명령행에 없고 namespace 객체에 없으면 생성되는 값.

@item 
@ref{33b5,,type} - 명령행 인자가 변환되어야 할 형.

@item 
@ref{192e,,choices} - A sequence of the allowable values for the argument.

@item 
@ref{33bb,,required} - 명령행 옵션을 생략 할 수 있는지 아닌지 (선택적일 때만).

@item 
@ref{33bc,,help} - 인자가 하는 일에 대한 간단한 설명.

@item 
@ref{33bd,,metavar} - 사용 메시지에 사용되는 인자의 이름.

@item 
@ref{33b4,,dest} - @ref{339e,,parse_args()} 가 반환하는 객체에 추가될 어트리뷰트의 이름.

@item 
@ref{33be,,deprecated} - Whether or not use of the argument is deprecated.
@end itemize

The method returns an @ref{1b8a,,Action} object representing the argument.
@end deffn

다음 절에서는 이들 각각의 사용 방법에 관해 설명합니다.

@menu
* name or flags:: 
* action:: 
* nargs:: 
* const:: 
* default:: 
* type:: 
* choices:: 
* required:: 
* help:: 
* metavar:: 
* dest:: 
* deprecated:: 
* Action 클래스:: 

@end menu

@node name or flags,action,,add_argument 메서드
@anchor{library/argparse id5}@anchor{33bf}@anchor{library/argparse name-or-flags}@anchor{33ba}
@subsubsection name or flags


The @ref{4bd,,add_argument()} method must know whether an optional
argument, like @code{-f} or @code{--foo}, or a positional argument, like a list of
filenames, is expected.  The first arguments passed to
@code{add_argument()} must therefore be either a series of
flags, or a simple argument name.

For example, an optional argument could be created like:

@example
>>> parser.add_argument('-f', '--foo')
@end example

반면에 위치 인자는 이렇게 만들어집니다:

@example
>>> parser.add_argument('bar')
@end example

@ref{339e,,parse_args()} 가 호출되면, 선택 인자는 @code{-} 접두사로 식별되고, 그 밖의 인자는 위치 인자로 간주합니다:

@example
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('-f', '--foo')
>>> parser.add_argument('bar')
>>> parser.parse_args(['BAR'])
Namespace(bar='BAR', foo=None)
>>> parser.parse_args(['BAR', '--foo', 'FOO'])
Namespace(bar='BAR', foo='FOO')
>>> parser.parse_args(['--foo', 'FOO'])
usage: PROG [-h] [-f FOO] bar
PROG: error: the following arguments are required: bar
@end example

By default, @code{argparse} automatically handles the internal naming and
display names of arguments, simplifying the process without requiring
additional configuration.
As such, you do not need to specify the @ref{33b4,,dest} and @ref{33bd,,metavar} parameters.
For optional arguments, the @ref{33b4,,dest} parameter defaults to the argument name, with
underscores @code{_} replacing hyphens @code{-}. The @ref{33bd,,metavar} parameter defaults to
the upper-cased name. For example:

@example
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('--foo-bar')
>>> parser.parse_args(['--foo-bar', 'FOO-BAR'])
Namespace(foo_bar='FOO-BAR')
>>> parser.print_help()
usage:  [-h] [--foo-bar FOO-BAR]

optional arguments:
 -h, --help  show this help message and exit
 --foo-bar FOO-BAR
@end example

@node action,nargs,name or flags,add_argument 메서드
@anchor{library/argparse action}@anchor{192c}@anchor{library/argparse id6}@anchor{33c0}
@subsubsection action


@ref{1bd,,ArgumentParser} 객체는 명령행 인자를 액션과 연관시킵니다. 대부분의 액션은 단순히 @ref{339e,,parse_args()} 에 의해 반환된 객체에 어트리뷰트를 추가하기만 하지만, 액션은 관련된 명령행 인자로 무엇이든 할 수 있습니다. @code{action} 키워드 인자는 명령행 인자의 처리 방법을 지정합니다. 제공되는 액션은 다음과 같습니다:


@itemize *

@item 
@code{'store'} - This just stores the argument’s value.  This is the default
action.

@item 
@code{'store_const'} - This stores the value specified by the @ref{1934,,const} keyword
argument; note that the @ref{1934,,const} keyword argument defaults to @code{None}.  The
@code{'store_const'} action is most commonly used with optional arguments that
specify some sort of flag.  For example:

@example
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='store_const', const=42)
>>> parser.parse_args(['--foo'])
Namespace(foo=42)
@end example

@item 
@code{'store_true'} and @code{'store_false'} - These are special cases of
@code{'store_const'} that respectively store the values @code{True} and @code{False}
with default values of @code{False} and
@code{True}:

@example
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='store_true')
>>> parser.add_argument('--bar', action='store_false')
>>> parser.add_argument('--baz', action='store_false')
>>> parser.parse_args('--foo --bar'.split())
Namespace(foo=True, bar=False, baz=True)
@end example

@item 
@code{'append'} - This appends each argument value to a list.
It is useful for allowing an option to be specified multiple times.
If the default value is a non-empty list, the parsed value will start
with the default list’s elements and any values from the command line
will be appended after those default values. Example usage:

@example
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append', default=['0'])
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['0', '1', '2'])
@end example

@item 
@code{'append_const'} - This appends the value specified by
the @ref{1934,,const} keyword argument to a list; note that the @ref{1934,,const} keyword
argument defaults to @code{None}. The @code{'append_const'} action is typically
useful when multiple arguments need to store constants to the same list. For
example:

@example
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--str', dest='types', action='append_const', const=str)
>>> parser.add_argument('--int', dest='types', action='append_const', const=int)
>>> parser.parse_args('--str --int'.split())
Namespace(types=[<class 'str'>, <class 'int'>])
@end example

@item 
@code{'extend'} - This appends each item from a multi-value
argument to a list.
The @code{'extend'} action is typically used with the @ref{1932,,nargs} keyword argument
value @code{'+'} or @code{'*'}.
Note that when @ref{1932,,nargs} is @code{None} (the default) or @code{'?'}, each
character of the argument string will be appended to the list.
Example usage:

@example
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument("--foo", action="extend", nargs="+", type=str)
>>> parser.parse_args(["--foo", "f1", "--foo", "f2", "f3", "f4"])
Namespace(foo=['f1', 'f2', 'f3', 'f4'])
@end example


Added in version 3.8.


@item 
@code{'count'} - This counts the number of times an argument occurs. For
example, this is useful for increasing verbosity levels:

@example
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--verbose', '-v', action='count', default=0)
>>> parser.parse_args(['-vvv'])
Namespace(verbose=3)
@end example

참고, 명시적으로 `0'으로 설정되지 않으면 `default'는 @code{None}이 됩니다.

@item 
@code{'help'} - 현재 파서의 모든 옵션에 대한 완전한 도움말 메시지를 출력하고 종료합니다. 기본적으로 help 액션은 자동으로 파서에 추가됩니다. 출력이 만들어지는 방법에 대한 자세한 내용은 @ref{1bd,,ArgumentParser} 를 보세요.

@item 
@code{'version'} - @ref{4bd,,add_argument()} 호출에서 @code{version=} 키워드 인자를 기대하고, 호출되면 버전 정보를 출력하고 종료합니다:

@example
>>> import argparse
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('--version', action='version', version='%(prog)s 2.0')
>>> parser.parse_args(['--version'])
PROG 2.0
@end example
@end itemize

You may also specify an arbitrary action by passing an @ref{1b8a,,Action} subclass
(e.g. @ref{1bf0,,BooleanOptionalAction}) or other object that implements the same
interface. Only actions that consume command-line arguments (e.g. @code{'store'},
@code{'append'}, @code{'extend'}, or custom actions with non-zero @code{nargs}) can be used
with positional arguments.

The recommended way to create a custom action is to extend @ref{1b8a,,Action},
overriding the @code{__call__()} method and optionally the @code{__init__()} and
@code{format_usage()} methods. You can also register custom actions using the
@ref{33c1,,register()} method and reference them by their registered name.

사용자 정의 액션의 예:

@example
>>> class FooAction(argparse.Action):
...     def __init__(self, option_strings, dest, nargs=None, **kwargs):
...         if nargs is not None:
...             raise ValueError("nargs not allowed")
...         super().__init__(option_strings, dest, **kwargs)
...     def __call__(self, parser, namespace, values, option_string=None):
...         print('%r %r %r' % (namespace, values, option_string))
...         setattr(namespace, self.dest, values)
...
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action=FooAction)
>>> parser.add_argument('bar', action=FooAction)
>>> args = parser.parse_args('1 --foo 2'.split())
Namespace(bar=None, foo=None) '1' None
Namespace(bar='1', foo=None) '2' '--foo'
>>> args
Namespace(bar='1', foo='2')
@end example

자세한 내용은 @ref{1b8a,,Action} 을 참조하십시오.

@node nargs,const,action,add_argument 메서드
@anchor{library/argparse id7}@anchor{33c2}@anchor{library/argparse nargs}@anchor{1932}
@subsubsection nargs


@ref{1bd,,ArgumentParser} objects usually associate a single command-line argument with a
single action to be taken.  The @code{nargs} keyword argument associates a
different number of command-line arguments with a single action.
See also @ref{33c3,,Specifying ambiguous arguments}. The supported values are:


@itemize *

@item 
@code{N} (정수). 명령행에서 @code{N} 개의 인자를 함께 모아서 리스트에 넣습니다. 예를 들면:

@example
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', nargs=2)
>>> parser.add_argument('bar', nargs=1)
>>> parser.parse_args('c --foo a b'.split())
Namespace(bar=['c'], foo=['a', 'b'])
@end example

@code{nargs=1} 은 하나의 항목을 갖는 리스트를 생성합니다. 이는 항목 그대로 생성되는 기본값과 다릅니다.
@end itemize

@geindex ? (question mark);in argparse module


@itemize *

@item 
@code{'?'}. 가능하다면 한 인자가 명령행에서 소비되고 단일 항목으로 생성됩니다. 명령행 인자가 없으면 @ref{1933,,default} 의 값이 생성됩니다. 선택 인자의 경우 추가적인 경우가 있습니다 - 옵션 문자열은 있지만, 명령행 인자가 따라붙지 않는 경우입니다. 이 경우 @ref{1934,,const} 의 값이 생성됩니다. 이것을 보여주기 위해 몇 가지 예를 듭니다:

@example
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', nargs='?', const='c', default='d')
>>> parser.add_argument('bar', nargs='?', default='d')
>>> parser.parse_args(['XX', '--foo', 'YY'])
Namespace(bar='XX', foo='YY')
>>> parser.parse_args(['XX', '--foo'])
Namespace(bar='XX', foo='c')
>>> parser.parse_args([])
Namespace(bar='d', foo='d')
@end example

@code{nargs='?'} 의 흔한 사용법 중 하나는 선택적 입출력 파일을 허용하는 것입니다:

@example
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('infile', nargs='?')
>>> parser.add_argument('outfile', nargs='?')
>>> parser.parse_args(['input.txt', 'output.txt'])
Namespace(infile='input.txt', outfile='output.txt')
>>> parser.parse_args(['input.txt'])
Namespace(infile='input.txt', outfile=None)
>>> parser.parse_args([])
Namespace(infile=None, outfile=None)
@end example
@end itemize

@geindex * (asterisk);in argparse module


@itemize *

@item 
@code{'*'}. 모든 명령행 인자를 리스트로 수집합니다. 일반적으로 두 개 이상의 위치 인자에 대해 @code{nargs='*'} 를 사용하는 것은 별로 의미가 없지만, @code{nargs='*'} 를 갖는 여러 개의 선택 인자는 가능합니다. 예를 들면:

@example
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', nargs='*')
>>> parser.add_argument('--bar', nargs='*')
>>> parser.add_argument('baz', nargs='*')
>>> parser.parse_args('a b --foo x y --bar 1 2'.split())
Namespace(bar=['1', '2'], baz=['a', 'b'], foo=['x', 'y'])
@end example
@end itemize

@geindex + (plus);in argparse module


@itemize *

@item 
@code{'+'}. Just like @code{'*'}, all command-line arguments present are gathered into a
list.  Additionally, an error message will be generated if there wasn’t at
least one command-line argument present.  For example:

@example
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('foo', nargs='+')
>>> parser.parse_args(['a', 'b'])
Namespace(foo=['a', 'b'])
>>> parser.parse_args([])
usage: PROG [-h] foo [foo ...]
PROG: error: the following arguments are required: foo
@end example
@end itemize

If the @code{nargs} keyword argument is not provided, the number of arguments consumed
is determined by the @ref{192c,,action}.  Generally this means a single command-line argument
will be consumed and a single item (not a list) will be produced.
Actions that do not consume command-line arguments (e.g.
@code{'store_const'}) set @code{nargs=0}.

@node const,default,nargs,add_argument 메서드
@anchor{library/argparse const}@anchor{1934}@anchor{library/argparse id8}@anchor{33c4}
@subsubsection const


@ref{4bd,,add_argument()} 의 @code{const} 인자는 명령행에서 읽지는 않지만 다양한 @ref{1bd,,ArgumentParser} 액션에 필요한 상숫값을 저장하는 데 사용됩니다. 가장 흔한 두 가지 용도는 다음과 같습니다:


@itemize *

@item 
When @ref{4bd,,add_argument()} is called with
@code{action='store_const'} or @code{action='append_const'}.  These actions add the
@code{const} value to one of the attributes of the object returned by
@ref{339e,,parse_args()}. See the @ref{192c,,action} description for examples.
If @code{const} is not provided to @code{add_argument()}, it will
receive a default value of @code{None}.

@item 
When @ref{4bd,,add_argument()} is called with option strings
(like @code{-f} or @code{--foo}) and @code{nargs='?'}.  This creates an optional
argument that can be followed by zero or one command-line arguments.
When parsing the command line, if the option string is encountered with no
command-line argument following it, the value from @code{const} will be used.
See the @ref{1932,,nargs} description for examples.
@end itemize


버전 3.11에서 변경: @code{const=None} by default, including when @code{action='append_const'} or
@code{action='store_const'}.


@node default,type,const,add_argument 메서드
@anchor{library/argparse default}@anchor{1933}@anchor{library/argparse id9}@anchor{33c5}
@subsubsection default


모든 선택 인자와 일부 위치 인자는 명령행에서 생략될 수 있습니다. @ref{4bd,,add_argument()} 의 @code{default} 키워드 인자는, 기본값은 @code{None} 입니다, 명령행 인자가 없을 때 어떤 값을 사용해야 하는지를 지정합니다. 선택 인자의 경우, 옵션 문자열이 명령행에 없을 때 @code{default} 값이 사용됩니다:

@example
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', default=42)
>>> parser.parse_args(['--foo', '2'])
Namespace(foo='2')
>>> parser.parse_args([])
Namespace(foo=42)
@end example

If the target namespace already has an attribute set, the action `default'
will not overwrite it:

@example
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', default=42)
>>> parser.parse_args([], namespace=argparse.Namespace(foo=101))
Namespace(foo=101)
@end example

@code{default} 값이 문자열이면, 파서는 마치 명령행 인자인 것처럼 파싱합니다. 특히, 파서는 @ref{339f,,Namespace} 반환 값에 어트리뷰트를 설정하기 전에, 제공된 모든 @ref{33b5,,type} 변환 인자를 적용합니다. 그렇지 않은 경우, 파서는 값을 있는 그대로 사용합니다:

@example
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--length', default='10', type=int)
>>> parser.add_argument('--width', default=10.5, type=int)
>>> parser.parse_args()
Namespace(length=10, width=10.5)
@end example

@ref{1932,,nargs} 가 @code{?} 또는 @code{*} 인 위치 인자의 경우, 명령행 인자가 없을 때 @code{default} 값이 사용됩니다:

@example
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('foo', nargs='?', default=42)
>>> parser.parse_args(['a'])
Namespace(foo='a')
>>> parser.parse_args([])
Namespace(foo=42)
@end example

For @ref{33bb,,required} arguments, the @code{default} value is ignored. For example, this
applies to positional arguments with @ref{1932,,nargs} values other than @code{?} or @code{*},
or optional arguments marked as @code{required=True}.

@code{default=argparse.SUPPRESS} 를 지정하면 명령행 인자가 없는 경우 어트리뷰트가 추가되지 않습니다:

@example
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', default=argparse.SUPPRESS)
>>> parser.parse_args([])
Namespace()
>>> parser.parse_args(['--foo', '1'])
Namespace(foo='1')
@end example

@node type,choices,default,add_argument 메서드
@anchor{library/argparse argparse-type}@anchor{33c6}@anchor{library/argparse type}@anchor{33b5}
@subsubsection type


기본적으로, 파서는 명령행 인자를 간단한 문자열로 읽습니다. 그러나 꽤 자주 명령행 문자열은 @ref{196,,float}나 @ref{19b,,int}와 같은 다른 형으로 해석되어야 합니다. @ref{4bd,,add_argument()} 의 @code{type} 키워드는 필요한 형 검사와 형 변환이 수행되도록 합니다.

@ref{33b5,,type} 키워드가 @ref{1933,,default} 키워드와 함께 사용되면, 형 변환기는 기본값이 문자열일 때만 적용됩니다.

The argument to @code{type} can be a callable that accepts a single string or
the name of a registered type (see @ref{33c1,,register()})
If the function raises @ref{33c7,,ArgumentTypeError}, @ref{198,,TypeError}, or
@ref{2ec,,ValueError}, the exception is caught and a nicely formatted error
message is displayed. Other exception types are not handled.

일반적인 내장형과 함수는 형 변환기로 사용될 수 있습니다:

@example
import argparse
import pathlib

parser = argparse.ArgumentParser()
parser.add_argument('count', type=int)
parser.add_argument('distance', type=float)
parser.add_argument('street', type=ascii)
parser.add_argument('code_point', type=ord)
parser.add_argument('datapath', type=pathlib.Path)
@end example

사용자 정의 함수도 사용할 수 있습니다:

@example
>>> def hyphenated(string):
...     return '-'.join([word[:4] for word in string.casefold().split()])
...
>>> parser = argparse.ArgumentParser()
>>> _ = parser.add_argument('short_title', type=hyphenated)
>>> parser.parse_args(['"The Tale of Two Cities"'])
Namespace(short_title='"the-tale-of-two-citi')
@end example

@ref{3c3,,bool()} 함수는 형 변환기로 권장되지 않습니다. 빈 문자열을 @code{False}로, 비어 있지 않은 문자열을 @code{True}로 변환하는 것뿐입니다. 이것은 일반적으로 원하는 것이 아닙니다.

일반적으로, @code{type} 키워드는 지원되는 세 가지 예외 중 하나만 발생할 수 있는 간단한 변환에만 사용해야 하는 편의 기능입니다. 더 흥미로운 에러 처리나 리소스 관리가 필요한 모든 작업은 인자가 구문 분석된 후에 수행되어야 합니다.

For example, JSON or YAML conversions have complex error cases that require
better reporting than can be given by the @code{type} keyword.  A
@ref{1021,,JSONDecodeError} would not be well formatted and a
@ref{264,,FileNotFoundError} exception would not be handled at all.

Even @ref{30c,,FileType} has its limitations for use with the @code{type}
keyword.  If one argument uses @code{FileType} and then a
subsequent argument fails, an error is reported but the file is not
automatically closed.  In this case, it would be better to wait until after
the parser has run and then use the @ref{186,,with}-statement to manage the
files.

고정된 값 집합에 대해 단순히 확인하는 형 검사기의 경우, 대신 @ref{192e,,choices} 키워드를 사용하는 것을 고려하십시오.

@node choices,required,type,add_argument 메서드
@anchor{library/argparse choices}@anchor{192e}@anchor{library/argparse id10}@anchor{33c8}
@subsubsection choices


Some command-line arguments should be selected from a restricted set of values.
These can be handled by passing a sequence object as the `choices' keyword
argument to @ref{4bd,,add_argument()}.  When the command line is
parsed, argument values will be checked, and an error message will be displayed
if the argument was not one of the acceptable values:

@example
>>> parser = argparse.ArgumentParser(prog='game.py')
>>> parser.add_argument('move', choices=['rock', 'paper', 'scissors'])
>>> parser.parse_args(['rock'])
Namespace(move='rock')
>>> parser.parse_args(['fire'])
usage: game.py [-h] @{rock,paper,scissors@}
game.py: error: argument move: invalid choice: 'fire' (choose from 'rock',
'paper', 'scissors')
@end example

Any sequence can be passed as the `choices' value, so @ref{24d,,list} objects,
@ref{610,,tuple} objects, and custom sequences are all supported.

@ref{841,,enum.Enum}은 사용법, 도움말 및 에러 메시지에서 나타나는 방식을 제어하기 어렵기 때문에 사용하지 않는 것이 좋습니다.

Note that `choices' are checked after any @ref{33b5,,type}
conversions have been performed, so objects in `choices'
should match the @ref{33b5,,type} specified. This can make `choices'
appear unfamiliar in usage, help, or error messages.

To keep `choices' user-friendly, consider a custom type wrapper that
converts and formats values, or omit @ref{33b5,,type} and handle conversion in
your application code.

Formatted choices override the default `metavar' which is normally derived
from `dest'.  This is usually what you want because the user never sees the
`dest' parameter.  If this display isn’t desirable (perhaps because there are
many choices), just specify an explicit @ref{33bd,,metavar}.

@node required,help,choices,add_argument 메서드
@anchor{library/argparse id11}@anchor{33c9}@anchor{library/argparse required}@anchor{33bb}
@subsubsection required


In general, the @code{argparse} module assumes that flags like @code{-f} and @code{--bar}
indicate `optional' arguments, which can always be omitted at the command line.
To make an option `required', @code{True} can be specified for the @code{required=}
keyword argument to @ref{4bd,,add_argument()}:

@example
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', required=True)
>>> parser.parse_args(['--foo', 'BAR'])
Namespace(foo='BAR')
>>> parser.parse_args([])
usage: [-h] --foo FOO
: error: the following arguments are required: --foo
@end example

예에서 보듯이, 옵션이 @code{required} 로 표시되면, @ref{339e,,parse_args()} 는 그 옵션이 명령행에 없을 때 에러를 보고합니다.

@cartouche
@quotation 참고 
필수 옵션은 사용자가 `옵션' 이 `선택적' 일 것으로 기대하기 때문에 일반적으로 나쁜 형식으로 간주하므로 가능하면 피해야 합니다.
@end quotation
@end cartouche

@node help,metavar,required,add_argument 메서드
@anchor{library/argparse help}@anchor{33bc}@anchor{library/argparse id12}@anchor{33ca}
@subsubsection help


The @code{help} value is a string containing a brief description of the argument.
When a user requests help (usually by using @code{-h} or @code{--help} at the
command line), these @code{help} descriptions will be displayed with each
argument.

@code{help} 문자열은 프로그램 이름이나 인자 @ref{1933,,default} 와 같은 것들의 반복을 피하고자 다양한 포맷 지정자를 포함 할 수 있습니다. 사용할 수 있는 지정자는 프로그램 이름, @code{%(prog)s} 와 @ref{4bd,,add_argument()} 의 대부분의 키워드 인자, @code{%(default)s}, @code{%(type)s} 등을 포함합니다.:

@example
>>> parser = argparse.ArgumentParser(prog='frobble')
>>> parser.add_argument('bar', nargs='?', type=int, default=42,
...                     help='the bar to %(prog)s (default: %(default)s)')
>>> parser.print_help()
usage: frobble [-h] [bar]

positional arguments:
 bar     the bar to frobble (default: 42)

options:
 -h, --help  show this help message and exit
@end example

도움말 문자열이 %-포매팅을 지원하기 때문에, 도움말 문자열에 리터럴 @code{%} 을 표시하려면, @code{%%} 로 이스케이프 처리해야 합니다.

@code{argparse} supports silencing the help entry for certain options, by
setting the @code{help} value to @code{argparse.SUPPRESS}:

@example
>>> parser = argparse.ArgumentParser(prog='frobble')
>>> parser.add_argument('--foo', help=argparse.SUPPRESS)
>>> parser.print_help()
usage: frobble [-h]

options:
  -h, --help  show this help message and exit
@end example

@node metavar,dest,help,add_argument 메서드
@anchor{library/argparse id13}@anchor{33cb}@anchor{library/argparse metavar}@anchor{33bd}
@subsubsection metavar


When @ref{1bd,,ArgumentParser} generates help messages, it needs some way to refer
to each expected argument.  By default, @code{ArgumentParser} objects use the @ref{33b4,,dest}
value as the “name” of each object.  By default, for positional argument
actions, the @ref{33b4,,dest} value is used directly, and for optional argument actions,
the @ref{33b4,,dest} value is uppercased.  So, a single positional argument with
@code{dest='bar'} will be referred to as @code{bar}. A single
optional argument @code{--foo} that should be followed by a single command-line argument
will be referred to as @code{FOO}.  An example:

@example
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo')
>>> parser.add_argument('bar')
>>> parser.parse_args('X --foo Y'.split())
Namespace(bar='X', foo='Y')
>>> parser.print_help()
usage:  [-h] [--foo FOO] bar

positional arguments:
 bar

options:
 -h, --help  show this help message and exit
 --foo FOO
@end example

다른 이름은 @code{metavar} 로 지정할 수 있습니다:

@example
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', metavar='YYY')
>>> parser.add_argument('bar', metavar='XXX')
>>> parser.parse_args('X --foo Y'.split())
Namespace(bar='X', foo='Y')
>>> parser.print_help()
usage:  [-h] [--foo YYY] XXX

positional arguments:
 XXX

options:
 -h, --help  show this help message and exit
 --foo YYY
@end example

@code{metavar} 는 `표시되는' 이름 만 변경합니다 - @ref{339e,,parse_args()} 객체의 어트리뷰트 이름은 여전히 @ref{33b4,,dest} 값에 의해 결정됩니다.

@code{nargs} 값이 다르면 metavar 가 여러 번 사용될 수 있습니다. @code{metavar} 에 튜플을 제공하면 인자마다 다른 디스플레이가 지정됩니다:

@example
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('-x', nargs=2)
>>> parser.add_argument('--foo', nargs=2, metavar=('bar', 'baz'))
>>> parser.print_help()
usage: PROG [-h] [-x X X] [--foo bar baz]

options:
 -h, --help     show this help message and exit
 -x X X
 --foo bar baz
@end example

@node dest,deprecated,metavar,add_argument 메서드
@anchor{library/argparse dest}@anchor{33b4}@anchor{library/argparse id14}@anchor{33cc}
@subsubsection dest


대부분 @ref{1bd,,ArgumentParser} 액션은 @ref{339e,,parse_args()} 에 의해 반환된 객체의 어트리뷰트로 어떤 값을 추가합니다. 이 어트리뷰트의 이름은 @ref{4bd,,add_argument()} 의 @code{dest} 키워드 인자에 의해 결정됩니다. 위치 인자 액션의 경우, @code{dest} 는 일반적으로 @code{add_argument()} 에 첫 번째 인자로 제공됩니다.:

@example
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('bar')
>>> parser.parse_args(['XXX'])
Namespace(bar='XXX')
@end example

선택 인자 액션의 경우, @code{dest} 의 값은 보통 옵션 문자열에서 유추됩니다. @ref{1bd,,ArgumentParser} 는 첫 번째 긴 옵션 문자열을 취하고 앞의 @code{--} 문자열을 제거하여 @code{dest} 의 값을 만듭니다. 긴 옵션 문자열이 제공되지 않았다면 @code{dest} 는 첫 번째 짧은 옵션 문자열에서 앞의 @code{-} 문자를 제거하여 만듭니다. 문자열이 항상 유효한 어트리뷰트 이름이 되도록 만들기 위해 중간에 나오는 @code{-} 문자는 @code{_} 문자로 변환됩니다. 아래 예제는 이 동작을 보여줍니다:

@example
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('-f', '--foo-bar', '--foo')
>>> parser.add_argument('-x', '-y')
>>> parser.parse_args('-f 1 -x 2'.split())
Namespace(foo_bar='1', x='2')
>>> parser.parse_args('--foo 1 -y 2'.split())
Namespace(foo_bar='1', x='2')
@end example

@code{dest} 는 사용자 정의 어트리뷰트 이름을 지정할 수 있게 합니다:

@example
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', dest='bar')
>>> parser.parse_args('--foo XXX'.split())
Namespace(bar='XXX')
@end example

@node deprecated,Action 클래스,dest,add_argument 메서드
@anchor{library/argparse deprecated}@anchor{33be}@anchor{library/argparse id15}@anchor{33cd}
@subsubsection deprecated


During a project’s lifetime, some arguments may need to be removed from the
command line. Before removing them, you should inform
your users that the arguments are deprecated and will be removed.
The @code{deprecated} keyword argument of
@ref{4bd,,add_argument()}, which defaults to @code{False},
specifies if the argument is deprecated and will be removed
in the future.
For arguments, if @code{deprecated} is @code{True}, then a warning will be
printed to @ref{b33,,sys.stderr} when the argument is used:

@example
>>> import argparse
>>> parser = argparse.ArgumentParser(prog='snake.py')
>>> parser.add_argument('--legs', default=0, type=int, deprecated=True)
>>> parser.parse_args([])
Namespace(legs=0)
>>> parser.parse_args(['--legs', '4'])
snake.py: warning: option '--legs' is deprecated
Namespace(legs=4)
@end example


Added in version 3.13.


@node Action 클래스,,deprecated,add_argument 메서드
@anchor{library/argparse action-classes}@anchor{33ce}
@subsubsection Action 클래스


@code{Action} classes implement the Action API, a callable which returns a callable
which processes arguments from the command-line. Any object which follows
this API may be passed as the @code{action} parameter to
@ref{4bd,,add_argument()}.

@geindex Action (argparse 클래스)
@anchor{library/argparse argparse Action}@anchor{1b8a}
@deffn {클래스} argparse.Action (option_strings, dest, nargs=None, const=None, default=None, type=None, choices=None, required=False, help=None, metavar=None)

@code{Action} objects are used by an @ref{1bd,,ArgumentParser} to represent the information
needed to parse a single argument from one or more strings from the
command line. The @code{Action} class must accept the two positional arguments
plus any keyword arguments passed to @ref{4bd,,ArgumentParser.add_argument()}
except for the @code{action} itself.

Instances of @code{Action} (or return value of any callable to the
@code{action} parameter) should have attributes @code{dest},
@code{option_strings}, @code{default}, @code{type}, @code{required},
@code{help}, etc. defined. The easiest way to ensure these attributes
are defined is to call @code{Action.__init__()}.

@geindex __call__() (argparse.Action 메서드)
@anchor{library/argparse argparse Action __call__}@anchor{33cf}
@deffn {메서드} __call__ (parser, namespace, values, option_string=None)

@code{Action} instances should be callable, so subclasses must override the
@code{__call__()} method, which should accept four parameters:


@itemize *

@item 
`parser' - The @ref{1bd,,ArgumentParser} object which contains this action.

@item 
`namespace' - The @ref{339f,,Namespace} object that will be returned by
@ref{339e,,parse_args()}.  Most actions add an attribute to this
object using @ref{25be,,setattr()}.

@item 
`values' - The associated command-line arguments, with any type conversions
applied.  Type conversions are specified with the @ref{33b5,,type} keyword argument to
@ref{4bd,,add_argument()}.

@item 
`option_string' - The option string that was used to invoke this action.
The @code{option_string} argument is optional, and will be absent if the action
is associated with a positional argument.
@end itemize

The @code{__call__()} method may perform arbitrary actions, but will typically set
attributes on the @code{namespace} based on @code{dest} and @code{values}.
@end deffn

@geindex format_usage() (argparse.Action 메서드)
@anchor{library/argparse argparse Action format_usage}@anchor{33d0}
@deffn {메서드} format_usage ()

@code{Action} subclasses can define a @code{format_usage()} method that takes no argument
and return a string which will be used when printing the usage of the program.
If such method is not provided, a sensible default will be used.
@end deffn
@end deffn

@geindex BooleanOptionalAction (argparse 클래스)
@anchor{library/argparse argparse BooleanOptionalAction}@anchor{1bf0}
@deffn {클래스} argparse.BooleanOptionalAction

A subclass of @ref{1b8a,,Action} for handling boolean flags with positive
and negative options. Adding a single argument such as @code{--foo} automatically
creates both @code{--foo} and @code{--no-foo} options, storing @code{True} and @code{False}
respectively:

@example
>>> import argparse
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action=argparse.BooleanOptionalAction)
>>> parser.parse_args(['--no-foo'])
Namespace(foo=False)
@end example


Added in version 3.9.

@end deffn

@node parse_args 메서드,기타 유틸리티,add_argument 메서드,argparse — Parser for command-line options arguments and subcommands
@anchor{library/argparse the-parse-args-method}@anchor{33d1}
@subsubsection parse_args() 메서드


@geindex parse_args() (argparse.ArgumentParser 메서드)
@anchor{library/argparse argparse ArgumentParser parse_args}@anchor{339e}
@deffn {메서드} ArgumentParser.parse_args (args=None, namespace=None)

인자 문자열을 객체로 변환하고 namespace의 어트리뷰트로 설정합니다. 값들이 설정된 namespace를 돌려줍니다.

Previous calls to @ref{4bd,,add_argument()} determine exactly what objects are
created and how they are assigned. See the documentation for
@code{add_argument()} for details.


@itemize *

@item 
@ref{33d2,,args} - 구문 분석할 문자열 리스트. 기본값은 @ref{1469,,sys.argv} 에서 취합니다.

@item 
@ref{33d3,,namespace} - 어트리뷰트가 대입될 객체. 기본값은 새로 만들어지는 빈 @ref{339f,,Namespace} 객체입니다.
@end itemize
@end deffn

@menu
* 옵션값 문법:: 
* 잘못된 인자:: 
* - 를 포함하는 인자들:: 
* 인자 약어 (접두사 일치): 인자 약어 접두사 일치. 
* sys.argv 너머: sys argv 너머. 
* Namespace 객체:: 

@end menu

@node 옵션값 문법,잘못된 인자,,parse_args 메서드
@anchor{library/argparse option-value-syntax}@anchor{33d4}
@subsubsection 옵션값 문법


@ref{339e,,parse_args()} 메서드는 (취할 것이 있다면) 옵션의 값을 지정하는 몇 가지 방법을 지원합니다. 가장 단순한 경우, 옵션과 그 값은 두 개의 독립적인 인자로 전달됩니다:

@example
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('-x')
>>> parser.add_argument('--foo')
>>> parser.parse_args(['-x', 'X'])
Namespace(foo=None, x='X')
>>> parser.parse_args(['--foo', 'FOO'])
Namespace(foo='FOO', x=None)
@end example

긴 옵션(단일 문자보다 긴 이름을 가진 옵션)의 경우, 옵션과 값을 @code{=} 로 구분하여 단일 명령행 인자로 전달할 수도 있습니다:

@example
>>> parser.parse_args(['--foo=FOO'])
Namespace(foo='FOO', x=None)
@end example

짧은 옵션(한 문자 길이의 옵션)의 경우, 옵션과 해당 값을 이어붙일 수 있습니다:

@example
>>> parser.parse_args(['-xX'])
Namespace(foo=None, x='X')
@end example

여러 개의 짧은 옵션은 마지막 옵션만 값을 요구하는 한 (또는 그들 중 아무것도 값을 요구하지 않거나), 하나의 @code{-} 접두어를 사용하여 함께 결합 할 수 있습니다:

@example
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('-x', action='store_true')
>>> parser.add_argument('-y', action='store_true')
>>> parser.add_argument('-z')
>>> parser.parse_args(['-xyzZ'])
Namespace(x=True, y=True, z='Z')
@end example

@node 잘못된 인자,- 를 포함하는 인자들,옵션값 문법,parse_args 메서드
@anchor{library/argparse invalid-arguments}@anchor{33d5}
@subsubsection 잘못된 인자


명령행을 파싱할 때, @ref{339e,,parse_args()} 는 모호한 옵션, 유효하지 않은 형, 유효하지 않은 옵션, 잘못된 위치 인자의 수 등을 포함한 다양한 에러를 검사합니다. 이런 에러가 발생하면, 사용 메시지와 함께 에러를 인쇄합니다:

@example
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('--foo', type=int)
>>> parser.add_argument('bar', nargs='?')

>>> # invalid type
>>> parser.parse_args(['--foo', 'spam'])
usage: PROG [-h] [--foo FOO] [bar]
PROG: error: argument --foo: invalid int value: 'spam'

>>> # invalid option
>>> parser.parse_args(['--bar'])
usage: PROG [-h] [--foo FOO] [bar]
PROG: error: no such option: --bar

>>> # wrong number of arguments
>>> parser.parse_args(['spam', 'badger'])
usage: PROG [-h] [--foo FOO] [bar]
PROG: error: extra arguments found: badger
@end example

@node - 를 포함하는 인자들,인자 약어 접두사 일치,잘못된 인자,parse_args 메서드
@anchor{library/argparse arguments-containing}@anchor{33d6}
@subsubsection @code{-} 를 포함하는 인자들


@ref{339e,,parse_args()} 메서드는 사용자가 분명히 실수했을 때마다 에러를 주려고 하지만, 어떤 상황은 본질에서 모호합니다. 예를 들어, 명령행 인자 @code{-1} 은 옵션을 지정하려는 시도이거나 위치 인자를 제공하려는 시도일 수 있습니다. @code{parse_args()} 메서드는 이럴 때 신중합니다: 위치 인자는 음수처럼 보이고 파서에 음수처럼 보이는 옵션이 없을 때만 @code{-} 로 시작할 수 있습니다:

@example
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('-x')
>>> parser.add_argument('foo', nargs='?')

>>> # no negative number options, so -1 is a positional argument
>>> parser.parse_args(['-x', '-1'])
Namespace(foo=None, x='-1')

>>> # no negative number options, so -1 and -5 are positional arguments
>>> parser.parse_args(['-x', '-1', '-5'])
Namespace(foo='-5', x='-1')

>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('-1', dest='one')
>>> parser.add_argument('foo', nargs='?')

>>> # negative number options present, so -1 is an option
>>> parser.parse_args(['-1', 'X'])
Namespace(foo=None, one='X')

>>> # negative number options present, so -2 is an option
>>> parser.parse_args(['-2'])
usage: PROG [-h] [-1 ONE] [foo]
PROG: error: no such option: -2

>>> # negative number options present, so both -1s are options
>>> parser.parse_args(['-1', '-1'])
usage: PROG [-h] [-1 ONE] [foo]
PROG: error: argument -1: expected one argument
@end example

@code{-} 로 시작해야 하고, 음수처럼 보이지 않는 위치 인자가 있는 경우, @ref{339e,,parse_args()} 에 다음과 같은 의사 인자 @code{'--'} 를 삽입 할 수 있습니다. 그 이후의 모든 것은 위치 인자입니다:

@example
>>> parser.parse_args(['--', '-f'])
Namespace(foo='-f', one=None)
@end example

See also @ref{33c3,,the argparse howto on ambiguous arguments}
for more details.

@node 인자 약어 접두사 일치,sys argv 너머,- 를 포함하는 인자들,parse_args 메서드
@anchor{library/argparse argument-abbreviations-prefix-matching}@anchor{33d7}@anchor{library/argparse prefix-matching}@anchor{fbe}
@subsubsection 인자 약어 (접두사 일치)


@ref{339e,,parse_args()} 메서드는 @ref{fbd,,기본적으로} 약어가 모호하지 않으면 (접두사가 오직 하나의 옵션과 일치합니다) 긴 옵션을 접두사로 축약 할 수 있도록 합니다:

@example
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('-bacon')
>>> parser.add_argument('-badger')
>>> parser.parse_args('-bac MMM'.split())
Namespace(bacon='MMM', badger=None)
>>> parser.parse_args('-bad WOOD'.split())
Namespace(bacon=None, badger='WOOD')
>>> parser.parse_args('-ba BA'.split())
usage: PROG [-h] [-bacon BACON] [-badger BADGER]
PROG: error: ambiguous option: -ba could match -badger, -bacon
@end example

둘 이상의 옵션과 일치하는 인자는 에러를 일으킵니다. 이 기능은 @ref{fbd,,allow_abbrev}를 @code{False} 로 설정함으로써 비활성화시킬 수 있습니다.

@node sys argv 너머,Namespace 객체,인자 약어 접두사 일치,parse_args 메서드
@anchor{library/argparse args}@anchor{33d2}@anchor{library/argparse beyond-sys-argv}@anchor{33d8}
@subsubsection @code{sys.argv} 너머


Sometimes it may be useful to have an @ref{1bd,,ArgumentParser} parse arguments other than those
of @ref{1469,,sys.argv}.  This can be accomplished by passing a list of strings to
@ref{339e,,parse_args()}.  This is useful for testing at the
interactive prompt:

@example
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument(
...     'integers', metavar='int', type=int, choices=range(10),
...     nargs='+', help='an integer in the range 0..9')
>>> parser.add_argument(
...     '--sum', dest='accumulate', action='store_const', const=sum,
...     default=max, help='sum the integers (default: find the max)')
>>> parser.parse_args(['1', '2', '3', '4'])
Namespace(accumulate=<built-in function max>, integers=[1, 2, 3, 4])
>>> parser.parse_args(['1', '2', '3', '4', '--sum'])
Namespace(accumulate=<built-in function sum>, integers=[1, 2, 3, 4])
@end example

@node Namespace 객체,,sys argv 너머,parse_args 메서드
@anchor{library/argparse namespace}@anchor{33d3}@anchor{library/argparse the-namespace-object}@anchor{33d9}
@subsubsection Namespace 객체


@geindex Namespace (argparse 클래스)
@anchor{library/argparse argparse Namespace}@anchor{339f}
@deffn {클래스} argparse.Namespace

@ref{339e,,parse_args()} 가 어트리뷰트를 저장하고 반환할 객체를 만드는 데 기본적으로 사용하는 간단한 클래스.

이 클래스는 의도적으로 단순한데, 단지 가독성 있는 문자열 표현을 갖는 @ref{c7d,,object} 의 서브 클래스입니다. 어트리뷰트를 딕셔너리처럼 보기 원한다면, 표준 파이썬 관용구를 사용할 수 있습니다, @ref{1e1f,,vars()}:

@example
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo')
>>> args = parser.parse_args(['--foo', 'BAR'])
>>> vars(args)
@{'foo': 'BAR'@}
@end example

@ref{1bd,,ArgumentParser} 가 새 @ref{339f,,Namespace} 객체가 아니라 이미 존재하는 객체에 어트리뷰트를 대입하는 것이 유용 할 수 있습니다. @code{namespace=} 키워드 인자를 지정하면 됩니다:

@example
>>> class C:
...     pass
...
>>> c = C()
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo')
>>> parser.parse_args(args=['--foo', 'BAR'], namespace=c)
>>> c.foo
'BAR'
@end example
@end deffn

@node 기타 유틸리티,Exceptions<5>,parse_args 메서드,argparse — Parser for command-line options arguments and subcommands
@anchor{library/argparse other-utilities}@anchor{33da}
@subsubsection 기타 유틸리티


@menu
* Subcommands:: 
* FileType 객체:: 
* 인자 그룹:: 
* 상호 배제:: 
* 파서 기본값:: 
* 도움말 인쇄:: 
* 부분 파싱:: 
* 파일 파싱 사용자 정의:: 
* 종료 메서드:: 
* 혼합 파싱:: 
* Registering custom types or actions:: 

@end menu

@node Subcommands,FileType 객체,,기타 유틸리티
@anchor{library/argparse subcommands}@anchor{33db}
@subsubsection Subcommands


@geindex add_subparsers() (argparse.ArgumentParser 메서드)
@anchor{library/argparse argparse ArgumentParser add_subparsers}@anchor{e10}
@deffn {메서드} ArgumentParser.add_subparsers (*[, title][, description][, prog][, parser_class][, action][, dest][, required][, help][, metavar])

Many programs split up their functionality into a number of subcommands,
for example, the @code{svn} program can invoke subcommands like @code{svn
checkout}, @code{svn update}, and @code{svn commit}.  Splitting up functionality
this way can be a particularly good idea when a program performs several
different functions which require different kinds of command-line arguments.
@ref{1bd,,ArgumentParser} supports the creation of such subcommands with the
@code{add_subparsers()} method.  The @code{add_subparsers()} method is normally
called with no arguments and returns a special action object.  This object
has a single method, @code{add_parser()}, which takes a
command name and any @code{ArgumentParser} constructor arguments, and
returns an @code{ArgumentParser} object that can be modified as usual.

매개 변수 설명:


@itemize *

@item 
`title' - title for the sub-parser group in help output; by default
“subcommands” if description is provided, otherwise uses title for
positional arguments

@item 
`description' - description for the sub-parser group in help output, by
default @code{None}

@item 
`prog' - usage information that will be displayed with subcommand help,
by default the name of the program and any positional arguments before the
subparser argument

@item 
`parser_class' - class which will be used to create sub-parser instances, by
default the class of the current parser (e.g. @ref{1bd,,ArgumentParser})

@item 
@ref{192c,,action} - 이 인자를 명령행에서 만날 때 수행 할 액션의 기본형

@item 
@ref{33b4,,dest} - name of the attribute under which subcommand name will be
stored; by default @code{None} and no value is stored

@item 
@ref{33bb,,required} - 부속 명령이 꼭 제공되어야 하는지 아닌지, 기본값은 @code{False} (3.7에서 추가)

@item 
@ref{33bc,,help} - 도움말 출력의 부속 파서 그룹 도움말, 기본적으로 @code{None}

@item 
@ref{33bd,,metavar} - string presenting available subcommands in help; by default it
is @code{None} and presents subcommands in form @{cmd1, cmd2, ..@}
@end itemize

몇 가지 사용 예:

@example
>>> # create the top-level parser
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('--foo', action='store_true', help='foo help')
>>> subparsers = parser.add_subparsers(help='subcommand help')
>>>
>>> # create the parser for the "a" command
>>> parser_a = subparsers.add_parser('a', help='a help')
>>> parser_a.add_argument('bar', type=int, help='bar help')
>>>
>>> # create the parser for the "b" command
>>> parser_b = subparsers.add_parser('b', help='b help')
>>> parser_b.add_argument('--baz', choices=('X', 'Y', 'Z'), help='baz help')
>>>
>>> # parse some argument lists
>>> parser.parse_args(['a', '12'])
Namespace(bar=12, foo=False)
>>> parser.parse_args(['--foo', 'b', '--baz', 'Z'])
Namespace(baz='Z', foo=True)
@end example

@ref{339e,,parse_args()} 에 의해 반환된 객체는 주 파서와 명령행에 의해 선택된 부속 파서(다른 부속 파서는 아님)의 어트리뷰트만을 포함한다는 것에 주의하십시오. 그래서 위의 예에서, @code{a} 명령이 지정되면 @code{foo} 와 @code{bar} 어트리뷰트 만 존재하고, @code{b} 명령이 지정되면 @code{foo} 와 @code{baz} 어트리뷰트만 존재합니다.

Similarly, when a help message is requested from a subparser, only the help
for that particular parser will be printed.  The help message will not
include parent parser or sibling parser messages.  (A help message for each
subparser command, however, can be given by supplying the @code{help=} argument
to @code{add_parser()} as above.)

@example
>>> parser.parse_args(['--help'])
usage: PROG [-h] [--foo] @{a,b@} ...

positional arguments:
  @{a,b@}   subcommand help
    a     a help
    b     b help

options:
  -h, --help  show this help message and exit
  --foo   foo help

>>> parser.parse_args(['a', '--help'])
usage: PROG a [-h] bar

positional arguments:
  bar     bar help

options:
  -h, --help  show this help message and exit

>>> parser.parse_args(['b', '--help'])
usage: PROG b [-h] [--baz @{X,Y,Z@}]

options:
  -h, --help     show this help message and exit
  --baz @{X,Y,Z@}  baz help
@end example

@ref{e10,,add_subparsers()} 메서드는 또한 @code{title} 과 @code{description} 키워드 인자를 지원합니다. 둘 중 하나가 있으면 부속 파서의 명령이 도움말 출력에서 자체 그룹으로 나타납니다. 예를 들면:

@example
>>> parser = argparse.ArgumentParser()
>>> subparsers = parser.add_subparsers(title='subcommands',
...                                    description='valid subcommands',
...                                    help='additional help')
>>> subparsers.add_parser('foo')
>>> subparsers.add_parser('bar')
>>> parser.parse_args(['-h'])
usage:  [-h] @{foo,bar@} ...

options:
  -h, --help  show this help message and exit

subcommands:
  valid subcommands

  @{foo,bar@}   additional help
@end example

Furthermore, @code{add_parser()} supports an additional
`aliases' argument,
which allows multiple strings to refer to the same subparser. This example,
like @code{svn}, aliases @code{co} as a shorthand for @code{checkout}:

@example
>>> parser = argparse.ArgumentParser()
>>> subparsers = parser.add_subparsers()
>>> checkout = subparsers.add_parser('checkout', aliases=['co'])
>>> checkout.add_argument('foo')
>>> parser.parse_args(['co', 'bar'])
Namespace(foo='bar')
@end example

@code{add_parser()} supports also an additional
`deprecated' argument, which allows to deprecate the subparser.

@example
>>> import argparse
>>> parser = argparse.ArgumentParser(prog='chicken.py')
>>> subparsers = parser.add_subparsers()
>>> run = subparsers.add_parser('run')
>>> fly = subparsers.add_parser('fly', deprecated=True)
>>> parser.parse_args(['fly'])
chicken.py: warning: command 'fly' is deprecated
Namespace()
@end example


Added in version 3.13.


One particularly effective way of handling subcommands is to combine the use
of the @code{add_subparsers()} method with calls to @ref{33b7,,set_defaults()} so
that each subparser knows which Python function it should execute.  For
example:

@example
>>> # subcommand functions
>>> def foo(args):
...     print(args.x * args.y)
...
>>> def bar(args):
...     print('((%s))' % args.z)
...
>>> # create the top-level parser
>>> parser = argparse.ArgumentParser()
>>> subparsers = parser.add_subparsers(required=True)
>>>
>>> # create the parser for the "foo" command
>>> parser_foo = subparsers.add_parser('foo')
>>> parser_foo.add_argument('-x', type=int, default=1)
>>> parser_foo.add_argument('y', type=float)
>>> parser_foo.set_defaults(func=foo)
>>>
>>> # create the parser for the "bar" command
>>> parser_bar = subparsers.add_parser('bar')
>>> parser_bar.add_argument('z')
>>> parser_bar.set_defaults(func=bar)
>>>
>>> # parse the args and call whatever function was selected
>>> args = parser.parse_args('foo 1 -x 2'.split())
>>> args.func(args)
2.0
>>>
>>> # parse the args and call whatever function was selected
>>> args = parser.parse_args('bar XYZYX'.split())
>>> args.func(args)
((XYZYX))
@end example

이렇게 하면 @ref{339e,,parse_args()} 가 파싱이 완료된 후 적절한 함수를 호출하게 할 수 있습니다. 이처럼 액션과 함수를 연결하는 것이, 일반적으로 각 부속 파서가 서로 다른 액션을 처리하도록 하는 가장 쉬운 방법입니다. 그러나 호출된 부속 파서의 이름을 확인해야 하는 경우 @ref{e10,,add_subparsers()} 호출에 @code{dest} 키워드 인자를 제공합니다:

@example
>>> parser = argparse.ArgumentParser()
>>> subparsers = parser.add_subparsers(dest='subparser_name')
>>> subparser1 = subparsers.add_parser('1')
>>> subparser1.add_argument('-x')
>>> subparser2 = subparsers.add_parser('2')
>>> subparser2.add_argument('y')
>>> parser.parse_args(['2', 'frobble'])
Namespace(subparser_name='2', y='frobble')
@end example


버전 3.7에서 변경: New `required' keyword-only parameter.



버전 3.14에서 변경: Subparser’s `prog' is no longer affected by a custom usage message in
the main parser.

@end deffn

@node FileType 객체,인자 그룹,Subcommands,기타 유틸리티
@anchor{library/argparse filetype-objects}@anchor{33dc}
@subsubsection FileType 객체


@geindex FileType (argparse 클래스)
@anchor{library/argparse argparse FileType}@anchor{30c}
@deffn {클래스} argparse.FileType (mode='r', bufsize=-1, encoding=None, errors=None)

@ref{30c,,FileType} 팩토리는 @ref{4bd,,ArgumentParser.add_argument()} 의 type 인자로 전달될 수 있는 객체를 만듭니다. type으로 @code{FileType} 객체를 사용하는 인자는 명령행 인자를 요청된 모드, 버퍼 크기, 인코딩 및 오류 처리의 파일로 엽니다 (자세한 내용은 @ref{316,,open()} 함수를 참조하세요):

@example
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--raw', type=argparse.FileType('wb', 0))
>>> parser.add_argument('out', type=argparse.FileType('w', encoding='UTF-8'))
>>> parser.parse_args(['--raw', 'raw.dat', 'file.txt'])
Namespace(out=<_io.TextIOWrapper name='file.txt' mode='w' encoding='UTF-8'>, raw=<_io.FileIO name='raw.dat' mode='wb'>)
@end example

FileType objects understand the pseudo-argument @code{'-'} and automatically
convert this into @ref{75e,,sys.stdin} for readable @code{FileType} objects and
@ref{ccc,,sys.stdout} for writable @code{FileType} objects:

@example
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('infile', type=argparse.FileType('r'))
>>> parser.parse_args(['-'])
Namespace(infile=<_io.TextIOWrapper name='<stdin>' encoding='UTF-8'>)
@end example

@cartouche
@quotation 참고 
If one argument uses `FileType' and then a subsequent argument fails,
an error is reported but the file is not automatically closed.
This can also clobber the output files.
In this case, it would be better to wait until after the parser has
run and then use the @ref{186,,with}-statement to manage the files.
@end quotation
@end cartouche


버전 3.4에서 변경: Added the `encodings' and `errors' parameters.



버전 3.14부터 폐지됨.

@end deffn

@node 인자 그룹,상호 배제,FileType 객체,기타 유틸리티
@anchor{library/argparse argument-groups}@anchor{33dd}
@subsubsection 인자 그룹


@geindex add_argument_group() (argparse.ArgumentParser 메서드)
@anchor{library/argparse argparse ArgumentParser add_argument_group}@anchor{2eb}
@deffn {메서드} ArgumentParser.add_argument_group (title=None, description=None, *[, argument_default][, conflict_handler])

By default, @ref{1bd,,ArgumentParser} groups command-line arguments into
“positional arguments” and “options” when displaying help
messages. When there is a better conceptual grouping of arguments than this
default one, appropriate groups can be created using the
@code{add_argument_group()} method:

@example
>>> parser = argparse.ArgumentParser(prog='PROG', add_help=False)
>>> group = parser.add_argument_group('group')
>>> group.add_argument('--foo', help='foo help')
>>> group.add_argument('bar', help='bar help')
>>> parser.print_help()
usage: PROG [--foo FOO] bar

group:
  bar    bar help
  --foo FOO  foo help
@end example

The @code{add_argument_group()} method returns an argument group object which
has an @ref{4bd,,add_argument()} method just like a regular
@ref{1bd,,ArgumentParser}.  When an argument is added to the group, the parser
treats it just like a normal argument, but displays the argument in a
separate group for help messages.  The @code{add_argument_group()} method
accepts `title' and `description' arguments which can be used to
customize this display:

@example
>>> parser = argparse.ArgumentParser(prog='PROG', add_help=False)
>>> group1 = parser.add_argument_group('group1', 'group1 description')
>>> group1.add_argument('foo', help='foo help')
>>> group2 = parser.add_argument_group('group2', 'group2 description')
>>> group2.add_argument('--bar', help='bar help')
>>> parser.print_help()
usage: PROG [--bar BAR] foo

group1:
  group1 description

  foo    foo help

group2:
  group2 description

  --bar BAR  bar help
@end example

The optional, keyword-only parameters @ref{33a8,,argument_default} and @ref{33a9,,conflict_handler}
allow for finer-grained control of the behavior of the argument group. These
parameters have the same meaning as in the @ref{1bd,,ArgumentParser} constructor,
but apply specifically to the argument group rather than the entire parser.

사용자 정의 그룹에 없는 인자는 일반적인 “positional arguments” 및 “optional arguments” 섹션으로 들어갑니다.


Deprecated since version 3.11, removed in version 3.14: Calling @code{add_argument_group()} on an argument group now raises an
exception. This nesting was never supported, often failed to work
correctly, and was unintentionally exposed through inheritance.



버전 3.14부터 폐지됨: Passing @ref{33a6,,prefix_chars} to @code{add_argument_group()}
is now deprecated.

@end deffn

@node 상호 배제,파서 기본값,인자 그룹,기타 유틸리티
@anchor{library/argparse mutual-exclusion}@anchor{33de}
@subsubsection 상호 배제


@geindex add_mutually_exclusive_group() (argparse.ArgumentParser 메서드)
@anchor{library/argparse argparse ArgumentParser add_mutually_exclusive_group}@anchor{2ed}
@deffn {메서드} ArgumentParser.add_mutually_exclusive_group (required=False)

Create a mutually exclusive group. @code{argparse} will make sure that only
one of the arguments in the mutually exclusive group was present on the
command line:

@example
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> group = parser.add_mutually_exclusive_group()
>>> group.add_argument('--foo', action='store_true')
>>> group.add_argument('--bar', action='store_false')
>>> parser.parse_args(['--foo'])
Namespace(bar=True, foo=True)
>>> parser.parse_args(['--bar'])
Namespace(bar=False, foo=False)
>>> parser.parse_args(['--foo', '--bar'])
usage: PROG [-h] [--foo | --bar]
PROG: error: argument --bar: not allowed with argument --foo
@end example

@ref{2ed,,add_mutually_exclusive_group()} 메서드는 상호 배타적 인자 중 적어도 하나가 필요하다는 것을 나타내기 위한 `required' 인자도 받아들입니다:

@example
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> group = parser.add_mutually_exclusive_group(required=True)
>>> group.add_argument('--foo', action='store_true')
>>> group.add_argument('--bar', action='store_false')
>>> parser.parse_args([])
usage: PROG [-h] (--foo | --bar)
PROG: error: one of the arguments --foo --bar is required
@end example

Note that currently mutually exclusive argument groups do not support the
`title' and `description' arguments of
@ref{2eb,,add_argument_group()}. However, a mutually exclusive
group can be added to an argument group that has a title and description.
For example:

@example
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> group = parser.add_argument_group('Group title', 'Group description')
>>> exclusive_group = group.add_mutually_exclusive_group(required=True)
>>> exclusive_group.add_argument('--foo', help='foo help')
>>> exclusive_group.add_argument('--bar', help='bar help')
>>> parser.print_help()
usage: PROG [-h] (--foo FOO | --bar BAR)

options:
  -h, --help  show this help message and exit

Group title:
  Group description

  --foo FOO   foo help
  --bar BAR   bar help
@end example


Deprecated since version 3.11, removed in version 3.14: Calling @ref{2eb,,add_argument_group()} or @code{add_mutually_exclusive_group()}
on a mutually exclusive group now raises an exception. This nesting was
never supported, often failed to work correctly, and was unintentionally
exposed through inheritance.

@end deffn

@node 파서 기본값,도움말 인쇄,상호 배제,기타 유틸리티
@anchor{library/argparse parser-defaults}@anchor{33df}
@subsubsection 파서 기본값


@geindex set_defaults() (argparse.ArgumentParser 메서드)
@anchor{library/argparse argparse ArgumentParser set_defaults}@anchor{33b7}
@deffn {메서드} ArgumentParser.set_defaults (**kwargs)

대부분은, @ref{339e,,parse_args()} 에 의해 반환된 객체의 어트리뷰트는 명령행 인자와 인자 액션을 검사하여 완전히 결정됩니다. @ref{33b7,,set_defaults()} 는 명령행을 검사하지 않고 결정되는 몇 가지 추가적인 어트리뷰트를 추가할 수 있도록 합니다:

@example
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('foo', type=int)
>>> parser.set_defaults(bar=42, baz='badger')
>>> parser.parse_args(['736'])
Namespace(bar=42, baz='badger', foo=736)
@end example

Note that defaults can be set at both the parser level using @ref{33b7,,set_defaults()}
and at the argument level using @ref{4bd,,add_argument()}. If both are called for the
same argument, the last default set for an argument is used:

@example
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', default='bar')
>>> parser.set_defaults(foo='spam')
>>> parser.parse_args([])
Namespace(foo='spam')
@end example

파서 수준의 기본값은 여러 파서로 작업 할 때 특히 유용 할 수 있습니다. 이 유형의 예제는 @ref{e10,,add_subparsers()} 메서드를 참조하십시오.
@end deffn

@geindex get_default() (argparse.ArgumentParser 메서드)
@anchor{library/argparse argparse ArgumentParser get_default}@anchor{33e0}
@deffn {메서드} ArgumentParser.get_default (dest)

@ref{4bd,,add_argument()} 또는 @ref{33b7,,set_defaults()} 에 의해 설정된 이름 공간 어트리뷰트의 기본값을 가져옵니다:

@example
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', default='badger')
>>> parser.get_default('foo')
'badger'
@end example
@end deffn

@node 도움말 인쇄,부분 파싱,파서 기본값,기타 유틸리티
@anchor{library/argparse printing-help}@anchor{33e1}
@subsubsection 도움말 인쇄


대부분의 일반적인 응용 프로그램에서 @ref{339e,,parse_args()} 가 사용법이나 오류 메시지를 포매팅하고 인쇄하는 것을 담당합니다. 그러나 여러 가지 포매팅 방법이 제공됩니다:

@geindex print_usage() (argparse.ArgumentParser 메서드)
@anchor{library/argparse argparse ArgumentParser print_usage}@anchor{33e2}
@deffn {메서드} ArgumentParser.print_usage (file=None)

@ref{1bd,,ArgumentParser} 가 어떻게 명령행에서 호출되어야 하는지에 대한 간단한 설명을 인쇄합니다. `file' 이 @code{None} 이면, @ref{ccc,,sys.stdout} 이 가정됩니다.
@end deffn

@geindex print_help() (argparse.ArgumentParser 메서드)
@anchor{library/argparse argparse ArgumentParser print_help}@anchor{33e3}
@deffn {메서드} ArgumentParser.print_help (file=None)

프로그램 사용법과 @ref{1bd,,ArgumentParser} 에 등록된 인자에 대한 정보를 포함하는 도움말 메시지를 출력합니다. `file' 이 @code{None} 이면, @ref{ccc,,sys.stdout} 이 가정됩니다.
@end deffn

인쇄하는 대신 단순히 문자열을 반환하는, 이러한 메서드의 변형도 있습니다:

@geindex format_usage() (argparse.ArgumentParser 메서드)
@anchor{library/argparse argparse ArgumentParser format_usage}@anchor{1dad}
@deffn {메서드} ArgumentParser.format_usage ()

@ref{1bd,,ArgumentParser} 가 어떻게 명령행에서 호출되어야 하는지에 대한 간단한 설명을 담은 문자열을 반환합니다.
@end deffn

@geindex format_help() (argparse.ArgumentParser 메서드)
@anchor{library/argparse argparse ArgumentParser format_help}@anchor{33e4}
@deffn {메서드} ArgumentParser.format_help ()

프로그램 사용법과 @ref{1bd,,ArgumentParser} 에 등록된 인자에 대한 정보를 포함하는 도움말 메시지를 담은 문자열을 반환합니다.
@end deffn

@node 부분 파싱,파일 파싱 사용자 정의,도움말 인쇄,기타 유틸리티
@anchor{library/argparse partial-parsing}@anchor{33e5}
@subsubsection 부분 파싱


@geindex parse_known_args() (argparse.ArgumentParser 메서드)
@anchor{library/argparse argparse ArgumentParser parse_known_args}@anchor{33e6}
@deffn {메서드} ArgumentParser.parse_known_args (args=None, namespace=None)

Sometimes a script only needs to handle a specific set of command-line
arguments, leaving any unrecognized arguments for another script or program.
In these cases, the @code{parse_known_args()} method can be
useful.

This method works similarly to @ref{339e,,parse_args()}, but it does
not raise an error for extra, unrecognized arguments. Instead, it parses the
known arguments and returns a two item tuple that contains the populated
namespace and the list of any unrecognized arguments.

@example
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='store_true')
>>> parser.add_argument('bar')
>>> parser.parse_known_args(['--foo', '--badger', 'BAR', 'spam'])
(Namespace(bar='BAR', foo=True), ['--badger', 'spam'])
@end example
@end deffn

@cartouche
@quotation 경고 
@ref{fbe,,Prefix matching} rules apply to
@ref{33e6,,parse_known_args()}. The parser may consume an option even if it’s just
a prefix of one of its known options, instead of leaving it in the remaining
arguments list.
@end quotation
@end cartouche

@node 파일 파싱 사용자 정의,종료 메서드,부분 파싱,기타 유틸리티
@anchor{library/argparse customizing-file-parsing}@anchor{33e7}
@subsubsection 파일 파싱 사용자 정의


@geindex convert_arg_line_to_args() (argparse.ArgumentParser 메서드)
@anchor{library/argparse argparse ArgumentParser convert_arg_line_to_args}@anchor{33b6}
@deffn {메서드} ArgumentParser.convert_arg_line_to_args (arg_line)

파일에서 읽은 인자는 (@ref{1bd,,ArgumentParser} 생성자의 `fromfile_prefix_chars' 키워드 인자를 참조하세요) 한 줄에 하나의 인자로 읽습니다. 이 동작을 변경하려면 @ref{33b6,,convert_arg_line_to_args()} 를 재정의합니다.

이 메서드는 하나의 인자 `arg_line' 를 받아들이는데, 인자 파일에서 읽어 들인 문자열입니다. 이 문자열에서 파싱된 인자 리스트를 반환합니다. 메서드는 인자 파일에서 읽어 들이는 대로 한 줄에 한 번씩 순서대로 호출됩니다.

이 메서드의 재정의하는 유용한 경우는 스페이스로 분리된 각 단어를 인자로 처리하는 것입니다. 다음 예제는 이렇게 하는 방법을 보여줍니다:

@example
class MyArgumentParser(argparse.ArgumentParser):
    def convert_arg_line_to_args(self, arg_line):
        return arg_line.split()
@end example
@end deffn

@node 종료 메서드,혼합 파싱,파일 파싱 사용자 정의,기타 유틸리티
@anchor{library/argparse exiting-methods}@anchor{33e8}
@subsubsection 종료 메서드


@geindex exit() (argparse.ArgumentParser 메서드)
@anchor{library/argparse argparse ArgumentParser exit}@anchor{33e9}
@deffn {메서드} ArgumentParser.exit (status=0, message=None)

This method terminates the program, exiting with the specified `status'
and, if given, it prints a `message' to @ref{b33,,sys.stderr} before that.
The user can override this method to handle these steps differently:

@example
class ErrorCatchingArgumentParser(argparse.ArgumentParser):
    def exit(self, status=0, message=None):
        if status:
            raise Exception(f'Exiting because of an error: @{message@}')
        exit(status)
@end example
@end deffn

@geindex error() (argparse.ArgumentParser 메서드)
@anchor{library/argparse argparse ArgumentParser error}@anchor{33ea}
@deffn {메서드} ArgumentParser.error (message)

This method prints a usage message, including the `message', to
@ref{b33,,sys.stderr} and terminates the program with a status code of 2.
@end deffn

@node 혼합 파싱,Registering custom types or actions,종료 메서드,기타 유틸리티
@anchor{library/argparse intermixed-parsing}@anchor{33eb}
@subsubsection 혼합 파싱


@geindex parse_intermixed_args() (argparse.ArgumentParser 메서드)
@anchor{library/argparse argparse ArgumentParser parse_intermixed_args}@anchor{cf6}
@deffn {메서드} ArgumentParser.parse_intermixed_args (args=None, namespace=None)
@end deffn

@geindex parse_known_intermixed_args() (argparse.ArgumentParser 메서드)
@anchor{library/argparse argparse ArgumentParser parse_known_intermixed_args}@anchor{33ec}
@deffn {메서드} ArgumentParser.parse_known_intermixed_args (args=None, namespace=None)

많은 유닉스 명령은 사용자가 선택 인자와 위치 인자를 섞을 수 있도록 합니다. @ref{cf6,,parse_intermixed_args()} 와 @ref{33ec,,parse_known_intermixed_args()} 메서드는 이런 파싱 스타일을 지원합니다.

These parsers do not support all the @code{argparse} features, and will raise
exceptions if unsupported features are used.  In particular, subparsers,
and mutually exclusive groups that include both
optionals and positionals are not supported.

다음 예제는 @ref{33e6,,parse_known_args()} 와 @ref{cf6,,parse_intermixed_args()} 의 차이점을 보여줍니다: 전자는 여분의 인자로 @code{['2', '3']} 을 반환하는 반면, 후자는 모든 위치 인자를 @code{rest} 로 모읍니다.

@example
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo')
>>> parser.add_argument('cmd')
>>> parser.add_argument('rest', nargs='*', type=int)
>>> parser.parse_known_args('doit 1 --foo bar 2 3'.split())
(Namespace(cmd='doit', foo='bar', rest=[1]), ['2', '3'])
>>> parser.parse_intermixed_args('doit 1 --foo bar 2 3'.split())
Namespace(cmd='doit', foo='bar', rest=[1, 2, 3])
@end example

@ref{33ec,,parse_known_intermixed_args()} 는 채워진 이름 공간과 잔여 인자 문자열의 리스트를 포함하는 두 항목 튜플을 반환합니다. @ref{cf6,,parse_intermixed_args()} 는 파싱되지 않은 인자 문자열이 남아 있으면 에러를 발생시킵니다.


Added in version 3.7.

@end deffn

@node Registering custom types or actions,,혼합 파싱,기타 유틸리티
@anchor{library/argparse registering-custom-types-or-actions}@anchor{33ed}
@subsubsection Registering custom types or actions


@geindex register() (argparse.ArgumentParser 메서드)
@anchor{library/argparse argparse ArgumentParser register}@anchor{33c1}
@deffn {메서드} ArgumentParser.register (registry_name, value, object)

Sometimes it’s desirable to use a custom string in error messages to provide
more user-friendly output. In these cases, @code{register()} can be used to
register custom actions or types with a parser and allow you to reference the
type by their registered name instead of their callable name.

The @code{register()} method accepts three arguments - a `registry_name',
specifying the internal registry where the object will be stored (e.g.,
@code{action}, @code{type}), `value', which is the key under which the object will
be registered, and object, the callable to be registered.

The following example shows how to register a custom type with a parser:

@example
>>> import argparse
>>> parser = argparse.ArgumentParser()
>>> parser.register('type', 'hexadecimal integer', lambda s: int(s, 16))
>>> parser.add_argument('--foo', type='hexadecimal integer')
_StoreAction(option_strings=['--foo'], dest='foo', nargs=None, const=None, default=None, type='hexadecimal integer', choices=None, required=False, help=None, metavar=None, deprecated=False)
>>> parser.parse_args(['--foo', '0xFA'])
Namespace(foo=250)
>>> parser.parse_args(['--foo', '1.2'])
usage: PROG [-h] [--foo FOO]
PROG: error: argument --foo: invalid 'hexadecimal integer' value: '1.2'
@end example
@end deffn

@node Exceptions<5>,,기타 유틸리티,argparse — Parser for command-line options arguments and subcommands
@anchor{library/argparse exceptions}@anchor{33ee}
@subsubsection Exceptions


@geindex ArgumentError
@anchor{library/argparse argparse ArgumentError}@anchor{33ef}
@deffn {예외} argparse.ArgumentError

An error from creating or using an argument (optional or positional).

The string value of this exception is the message, augmented with
information about the argument that caused it.
@end deffn

@geindex ArgumentTypeError
@anchor{library/argparse argparse ArgumentTypeError}@anchor{33c7}
@deffn {예외} argparse.ArgumentTypeError

Raised when something goes wrong converting a command line string to a type.
@end deffn

@subsubheading Guides and Tutorials


@menu
* Argparse 자습서:: 
* Migrating optparse code to argparse:: 

@end menu

@node Argparse 자습서,Migrating optparse code to argparse,,Exceptions<5>
@anchor{howto/argparse doc}@anchor{33f0}@anchor{howto/argparse argparse-tutorial}@anchor{339d}@anchor{howto/argparse id1}@anchor{33f1}
@subsubsection Argparse 자습서


@*저자: 
Tshepang Mbambo


이 자습서는 파이썬 표준 라이브러리에서 권장하는 명령행 파싱 모듈인 @ref{7,,argparse} 에 대한 소개입니다.

@cartouche
@quotation 참고 
The standard library includes two other libraries directly related
to command-line parameter processing: the lower level @ref{a4,,optparse}
module (which may require more code to configure for a given application,
but also allows an application to request behaviors that @code{argparse}
doesn’t support), and the very low level @ref{65,,getopt} (which specifically
serves as an equivalent to the @code{getopt()} family of functions
available to C programmers).
While neither of those modules is covered directly in this guide, many of
the core concepts in @code{argparse} first originated in @code{optparse}, so
some aspects of this tutorial will also be relevant to @code{optparse} users.
@end quotation
@end cartouche

@menu
* 개념:: 
* 기본:: 
* 위치 인자 소개:: 
* 옵션 인자 소개:: 
* 위치 및 옵션 인자 결합하기:: 
* 조금 더 발전시키기:: 
* How to translate the argparse output:: 
* Custom type converters:: 
* 맺음말:: 

@end menu

@node 개념,기본,,Argparse 자습서
@anchor{howto/argparse concepts}@anchor{33f2}
@subsubsection 개념


@code{ls} 명령을 사용하여 이 입문서에서 다룰 기능들을 살펴봅시다:

@example
$ ls
cpython  devguide  prog.py  pypy  rm-unused-function.patch
$ ls pypy
ctypes_configure  demo  dotviewer  include  lib_pypy  lib-python ...
$ ls -l
total 20
drwxr-xr-x 19 wena wena 4096 Feb 18 18:51 cpython
drwxr-xr-x  4 wena wena 4096 Feb  8 12:04 devguide
-rwxr-xr-x  1 wena wena  535 Feb 19 00:05 prog.py
drwxr-xr-x 14 wena wena 4096 Feb  7 00:59 pypy
-rw-r--r--  1 wena wena  741 Feb 18 01:01 rm-unused-function.patch
$ ls --help
Usage: ls [OPTION]... [FILE]...
List information about the FILEs (the current directory by default).
Sort entries alphabetically if none of -cftuvSUX nor --sort is specified.
...
@end example

네 가지 명령에서 배울 수 있는 몇 가지 개념들입니다:


@itemize *

@item 
@code{ls} 명령은 옵션 없이 실행될 때도 유용합니다. 기본적으로 현재 디렉터리의 내용을 표시합니다.

@item 
기본적으로 제공하는 것 이상으로 원한다면, 조금 더 말합니다. 이 경우에는 다른 디렉터리인 @code{pypy} 를 표시하기를 원합니다. 우리가 한 것은 위치 인자라고 알려진 것을 지정하는 것입니다. 프로그램이 명령행에 표시되는 위치를 기준으로 값을 어떻게 처리해야 하는지를 알아야 하므로 이런 이름이 사용됩니다. 이 개념은 @code{cp} 와 같은 명령에 더 적절합니다. 가장 기본적인 사용법은 @code{cp SRC DEST} 입니다. 첫 번째 위치는 `복사하고자 하는 것' 이고 두 번째 위치는 `사본을 저장할 곳' 입니다.

@item 
자, 프로그램의 행동을 바꾸고 싶다고 합시다. 이 예에서는 파일 이름만 표시하는 대신 각 파일에 대한 정보를 더 많이 표시합니다. 이 경우 @code{-l} 은 옵션 인자로 알려져 있습니다.

@item 
이것이 도움말 텍스트입니다. 이전에 사용해보지 않은 프로그램을 접했을 때 도움말 텍스트를 읽는 것만으로 작동하는 방식을 이해할 수 있다는 점에서 매우 유용합니다.
@end itemize

@node 기본,위치 인자 소개,개념,Argparse 자습서
@anchor{howto/argparse the-basics}@anchor{33f3}
@subsubsection 기본


(거의) 아무것도 하지 않는 아주 간단한 예제로 시작합시다:

@example
import argparse
parser = argparse.ArgumentParser()
parser.parse_args()
@end example

다음은 코드를 실행한 결과입니다:

@example
$ python prog.py
$ python prog.py --help
usage: prog.py [-h]

options:
  -h, --help  show this help message and exit
$ python prog.py --verbose
usage: prog.py [-h]
prog.py: error: unrecognized arguments: --verbose
$ python prog.py foo
usage: prog.py [-h]
prog.py: error: unrecognized arguments: foo
@end example

일어난 일은 이렇습니다:


@itemize *

@item 
옵션 없이 스크립트를 실행하면 아무것도 표준 출력에 표시되지 않습니다. 별로 유용하지 않습니다.

@item 
두 번째는 @ref{7,,argparse} 모듈의 쓸모를 보여주기 시작합니다. 거의 아무것도 하지 않았지만 이미 도움말을 얻었습니다.

@item 
@code{--help} 옵션은, @code{-h} 로 단축할 수도 있습니다, 무료로 얻을 수 있는 유일한 옵션입니다 (즉, 지정할 필요가 없습니다). 다른 값을 지정하면 오류가 발생합니다. 그러나 그때조차도 우리는 사용 안내를 얻습니다, 여전히 공짜입니다.
@end itemize

@node 위치 인자 소개,옵션 인자 소개,기본,Argparse 자습서
@anchor{howto/argparse introducing-positional-arguments}@anchor{33f4}
@subsubsection 위치 인자 소개


예:

@example
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("echo")
args = parser.parse_args()
print(args.echo)
@end example

코드를 실행합니다:

@example
$ python prog.py
usage: prog.py [-h] echo
prog.py: error: the following arguments are required: echo
$ python prog.py --help
usage: prog.py [-h] echo

positional arguments:
  echo

options:
  -h, --help  show this help message and exit
$ python prog.py foo
foo
@end example

이런 일이 일어났습니다:


@itemize *

@item 
@ref{4bd,,add_argument()} 메서드를 추가했습니다. 이 메서드는 프로그램이 받고 싶은 명령행 옵션을 지정하기 위해 사용합니다. 이 경우 기능과 일치하도록 @code{echo} 라고 이름 붙였습니다.

@item 
이제 프로그램을 호출하려면 옵션을 지정해야 합니다.

@item 
@ref{339e,,parse_args()} 메서드는 실제로 지정된 옵션으로부터 온 데이터를 돌려줍니다. 이 경우에는 @code{echo} 입니다.

@item 
변수는 @ref{7,,argparse} 이 공짜로 수행하는 일종의 ‘마법’ 입니다 (즉, 값이 저장되는 변수를 지정할 필요가 없습니다). 또한, 그 이름이 메서드에 주어진 문자열 인자 @code{echo} 와 일치함을 알 수 있습니다.
@end itemize

그러나 도움말이 멋지게 보이지만, 현재로서는 가능한 최선이 아닙니다. 예를 들어 @code{echo} 가 위치 인자임을 볼 수 있지만, 추측하거나 소스 코드를 읽는 것 외에는 그것이 무엇을 하는지 모릅니다. 그럼 좀 더 유용하게 만들어 봅시다:

@example
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("echo", help="echo the string you use here")
args = parser.parse_args()
print(args.echo)
@end example

그러면 이렇게 됩니다:

@example
$ python prog.py -h
usage: prog.py [-h] echo

positional arguments:
  echo        echo the string you use here

options:
  -h, --help  show this help message and exit
@end example

이제, 뭔가 더 쓸모있는 일을 하는 것은 어떻습니까:

@example
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", help="display a square of a given number")
args = parser.parse_args()
print(args.square**2)
@end example

다음은 코드를 실행한 결과입니다:

@example
$ python prog.py 4
Traceback (most recent call last):
  File "prog.py", line 5, in <module>
    print(args.square**2)
TypeError: unsupported operand type(s) for ** or pow(): 'str' and 'int'
@end example

잘 안됐습니다. 우리가 달리 지시하지 않는다면, @ref{7,,argparse} 는 우리가 준 옵션들을 문자열로 취급하기 때문입니다. 그럼, @code{argparse} 에게 그 입력을 정수로 취급하라고 알려줍시다:

@example
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", help="display a square of a given number",
                    type=int)
args = parser.parse_args()
print(args.square**2)
@end example

다음은 코드를 실행한 결과입니다:

@example
$ python prog.py 4
16
$ python prog.py four
usage: prog.py [-h] square
prog.py: error: argument square: invalid int value: 'four'
@end example

잘 됩니다. 이제 이 프로그램은 잘못된 입력이 올 때 더 진행하지 않고 종료하기조차 합니다.

@node 옵션 인자 소개,위치 및 옵션 인자 결합하기,위치 인자 소개,Argparse 자습서
@anchor{howto/argparse introducing-optional-arguments}@anchor{33f5}
@subsubsection 옵션 인자 소개


지금까지 우리는 위치 인자를 다뤘습니다. 옵션 인자를 추가하는 방법에 대해 살펴봅시다:

@example
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--verbosity", help="increase output verbosity")
args = parser.parse_args()
if args.verbosity:
    print("verbosity turned on")
@end example

출력은 이렇습니다:

@example
$ python prog.py --verbosity 1
verbosity turned on
$ python prog.py
$ python prog.py --help
usage: prog.py [-h] [--verbosity VERBOSITY]

options:
  -h, --help            show this help message and exit
  --verbosity VERBOSITY
                        increase output verbosity
$ python prog.py --verbosity
usage: prog.py [-h] [--verbosity VERBOSITY]
prog.py: error: argument --verbosity: expected one argument
@end example

일어난 일은 이렇습니다:


@itemize *

@item 
이 프로그램은 @code{--verbosity} 가 지정되었을 때 어떤 것을 표시하고 그렇지 않을 때는 아무것도 표시하지 않도록 작성되었습니다.

@item 
옵션이 실제로 선택 사항임을 확인하기 위해, 이 옵션을 사용하지 않고 프로그램을 실행할 때 오류가 없습니다. 기본적으로 옵션 인자가 사용되지 않는다면 관련 변수 (이 경우 @code{args.verbosity})는 값으로 @code{None} 이 주어집니다. 이 때문에 @ref{181,,if} 문의 논리값 검사가 실패합니다.

@item 
도움말 메시지가 약간 달라졌습니다.

@item 
@code{--verbosity} 옵션을 사용할 때, 어떤 값을 지정해야 합니다. 어떤 값이건 상관없습니다.
@end itemize

위의 예제는 @code{--verbosity} 에 임의의 정숫값을 허용하지만, 우리의 간단한 프로그램에서는 실제로 @code{True} 또는 @code{False} 두 값만 쓸모 있습니다. 그것에 맞게 코드를 수정합시다:

@example
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--verbose", help="increase output verbosity",
                    action="store_true")
args = parser.parse_args()
if args.verbose:
    print("verbosity turned on")
@end example

출력은 이렇습니다:

@example
$ python prog.py --verbose
verbosity turned on
$ python prog.py --verbose 1
usage: prog.py [-h] [--verbose]
prog.py: error: unrecognized arguments: 1
$ python prog.py --help
usage: prog.py [-h] [--verbose]

options:
  -h, --help  show this help message and exit
  --verbose   increase output verbosity
@end example

일어난 일은 이렇습니다:


@itemize *

@item 
이 옵션은 이제 값을 요구하는 것이 아니라 플래그입니다. 이 개념과 일치하도록 옵션의 이름을 변경하기까지 했습니다. 새로운 키워드 @code{action} 을 지정하고, @code{"store_true"} 값을 지정했습니다. 이것은, 옵션이 지정되면 @code{args.verbose} 에 값 @code{True} 를 대입하라는 뜻입니다. 지정하지 않으면 묵시적으로 @code{False} 입니다.

@item 
값을 지정하면 불평하는데, 플래그의 정의를 따르고 있습니다.

@item 
도움말 텍스트가 바뀐 것을 확인하십시오.
@end itemize

@menu
* 짧은 옵션:: 

@end menu

@node 짧은 옵션,,,옵션 인자 소개
@anchor{howto/argparse short-options}@anchor{33f6}
@subsubsection 짧은 옵션


명령행 사용법에 익숙하다면 짧은 옵션 버전에 관한 내용을 아직 다루지 않았음을 알 수 있을 겁니다. 아주 간단합니다:

@example
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("-v", "--verbose", help="increase output verbosity",
                    action="store_true")
args = parser.parse_args()
if args.verbose:
    print("verbosity turned on")
@end example

그러면 이렇게 됩니다:

@example
$ python prog.py -v
verbosity turned on
$ python prog.py --help
usage: prog.py [-h] [-v]

options:
  -h, --help     show this help message and exit
  -v, --verbose  increase output verbosity
@end example

새로운 기능은 도움말 텍스트에도 반영됩니다.

@node 위치 및 옵션 인자 결합하기,조금 더 발전시키기,옵션 인자 소개,Argparse 자습서
@anchor{howto/argparse combining-positional-and-optional-arguments}@anchor{33f7}
@subsubsection 위치 및 옵션 인자 결합하기


프로그램이 점점 복잡해지고 있습니다:

@example
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", type=int,
                    help="display a square of a given number")
parser.add_argument("-v", "--verbose", action="store_true",
                    help="increase output verbosity")
args = parser.parse_args()
answer = args.square**2
if args.verbose:
    print(f"the square of @{args.square@} equals @{answer@}")
else:
    print(answer)
@end example

이제 출력은 이렇게 됩니다:

@example
$ python prog.py
usage: prog.py [-h] [-v] square
prog.py: error: the following arguments are required: square
$ python prog.py 4
16
$ python prog.py 4 --verbose
the square of 4 equals 16
$ python prog.py --verbose 4
the square of 4 equals 16
@end example


@itemize *

@item 
위치 인자를 다시 도입했기 때문에, 불평합니다.

@item 
순서는 중요하지 않습니다.
@end itemize

이 프로그램에 여러 상세도를 지정할 수 있도록 하는 능력을 다시 부여하고, 실제로 그것을 사용하는 것은 어떨까요:

@example
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", type=int,
                    help="display a square of a given number")
parser.add_argument("-v", "--verbosity", type=int,
                    help="increase output verbosity")
args = parser.parse_args()
answer = args.square**2
if args.verbosity == 2:
    print(f"the square of @{args.square@} equals @{answer@}")
elif args.verbosity == 1:
    print(f"@{args.square@}^2 == @{answer@}")
else:
    print(answer)
@end example

출력은 이렇습니다:

@example
$ python prog.py 4
16
$ python prog.py 4 -v
usage: prog.py [-h] [-v VERBOSITY] square
prog.py: error: argument -v/--verbosity: expected one argument
$ python prog.py 4 -v 1
4^2 == 16
$ python prog.py 4 -v 2
the square of 4 equals 16
$ python prog.py 4 -v 3
16
@end example

우리 프로그램의 버그를 드러내는 마지막 것을 제외하고는 그럴듯해 보입니다. @code{--verbosity} 옵션이 받아들일 수 있는 값을 제한해서 고쳐봅시다:

@example
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", type=int,
                    help="display a square of a given number")
parser.add_argument("-v", "--verbosity", type=int, choices=[0, 1, 2],
                    help="increase output verbosity")
args = parser.parse_args()
answer = args.square**2
if args.verbosity == 2:
    print(f"the square of @{args.square@} equals @{answer@}")
elif args.verbosity == 1:
    print(f"@{args.square@}^2 == @{answer@}")
else:
    print(answer)
@end example

출력은 이렇습니다:

@example
$ python prog.py 4 -v 3
usage: prog.py [-h] [-v @{0,1,2@}] square
prog.py: error: argument -v/--verbosity: invalid choice: 3 (choose from 0, 1, 2)
$ python prog.py 4 -h
usage: prog.py [-h] [-v @{0,1,2@}] square

positional arguments:
  square                display a square of a given number

options:
  -h, --help            show this help message and exit
  -v, --verbosity @{0,1,2@}
                        increase output verbosity
@end example

변경 내용은 오류 메시지와 도움말 문자열에도 반영됩니다.

이제 상세도를 다루는 다른 접근법을 사용해 봅시다, 이 방법은 꽤 널리 사용됩니다. 또한, 이 방법은 CPython 실행 파일이 자신의 상세도를 처리하는 방식과도 일치합니다 (@code{python --help} 의 결과를 확인하십시오):

@example
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", type=int,
                    help="display the square of a given number")
parser.add_argument("-v", "--verbosity", action="count",
                    help="increase output verbosity")
args = parser.parse_args()
answer = args.square**2
if args.verbosity == 2:
    print(f"the square of @{args.square@} equals @{answer@}")
elif args.verbosity == 1:
    print(f"@{args.square@}^2 == @{answer@}")
else:
    print(answer)
@end example

특정 옵션을 지정한 횟수를 계산하기 위해 “count” 라는 또 다른 액션을 도입했습니다.

@example
$ python prog.py 4
16
$ python prog.py 4 -v
4^2 == 16
$ python prog.py 4 -vv
the square of 4 equals 16
$ python prog.py 4 --verbosity --verbosity
the square of 4 equals 16
$ python prog.py 4 -v 1
usage: prog.py [-h] [-v] square
prog.py: error: unrecognized arguments: 1
$ python prog.py 4 -h
usage: prog.py [-h] [-v] square

positional arguments:
  square           display a square of a given number

options:
  -h, --help       show this help message and exit
  -v, --verbosity  increase output verbosity
$ python prog.py 4 -vvv
16
@end example


@itemize *

@item 
예, 이제 이전 버전의 스크립트처럼 (@code{action="store_true"} 와 유사하게) 플래그가 되었습니다. 출력되는 불평이 설명됩니다.

@item 
또한 “store_true” 액션과 비슷하게 작동하기도 합니다.

@item 
이제 여기에서 “count” 액션이 제공하는 것을 보여줍니다. 이런 종류의 사용법을 전에도 보았을 것입니다.

@item 
그리고, @code{-v} 플래그를 지정하지 않으면 그 플래그는 @code{None} 값으로 간주합니다.

@item 
예측하듯이, 플래그의 긴 형식을 지정하면, 같은 출력이 얻어져야 합니다.

@item 
안타깝게도 스크립트가 얻은 새로운 기능에 대한 도움말 출력은 그다지 유익하지 않지만, 스크립트의 문서를 개선하면 항상 해결할 수 있습니다 (예, @code{help} 키워드 인자를 사용해서).

@item 
마지막 출력은 우리 프로그램의 버그를 노출합니다.
@end itemize

고칩시다:

@example
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", type=int,
                    help="display a square of a given number")
parser.add_argument("-v", "--verbosity", action="count",
                    help="increase output verbosity")
args = parser.parse_args()
answer = args.square**2

# bugfix: replace == with >=
if args.verbosity >= 2:
    print(f"the square of @{args.square@} equals @{answer@}")
elif args.verbosity >= 1:
    print(f"@{args.square@}^2 == @{answer@}")
else:
    print(answer)
@end example

그러면 이렇게 됩니다:

@example
$ python prog.py 4 -vvv
the square of 4 equals 16
$ python prog.py 4 -vvvv
the square of 4 equals 16
$ python prog.py 4
Traceback (most recent call last):
  File "prog.py", line 11, in <module>
    if args.verbosity >= 2:
TypeError: '>=' not supported between instances of 'NoneType' and 'int'
@end example


@itemize *

@item 
첫 번째 출력은 잘 동작하고, 앞에서 나온 버그를 고칩니다. 즉, 2보다 크거나 같은 (>=) 모든 값을 최대의 상세도로 취급하고 싶습니다.

@item 
세 번째 결과가 좋지 않습니다.
@end itemize

이 버그를 고쳐 봅시다:

@example
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", type=int,
                    help="display a square of a given number")
parser.add_argument("-v", "--verbosity", action="count", default=0,
                    help="increase output verbosity")
args = parser.parse_args()
answer = args.square**2
if args.verbosity >= 2:
    print(f"the square of @{args.square@} equals @{answer@}")
elif args.verbosity >= 1:
    print(f"@{args.square@}^2 == @{answer@}")
else:
    print(answer)
@end example

또 다른 키워드 @code{default} 를 소개했습니다. 다른 int 값과 비교하기 위해 @code{0} 으로 설정했습니다. 기본적으로, 옵션 인자가 지정되지 않으면 @code{None} 값을 갖게 되고, 그것은 int 값과 비교될 수 없음을 (그래서 @ref{198,,TypeError} 예외를 일으킵니다) 기억하십시오.

그리고:

@example
$ python prog.py 4
16
@end example

여러분은 지금까지 배운 것만으로도 아주 멀리 갈 수 있으며, 우리는 단지 표면을 긁었을 뿐입니다. @ref{7,,argparse} 모듈은 매우 강력합니다. 이 자습서를 끝내기 전에 좀 더 탐색해 보겠습니다.

@node 조금 더 발전시키기,How to translate the argparse output,위치 및 옵션 인자 결합하기,Argparse 자습서
@anchor{howto/argparse getting-a-little-more-advanced}@anchor{33f8}
@subsubsection 조금 더 발전시키기


우리의 작은 프로그램을 확장하여 제곱만이 아닌 다른 거듭제곱을 수행하기를 원하면 어떻게 될까요:

@example
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("x", type=int, help="the base")
parser.add_argument("y", type=int, help="the exponent")
parser.add_argument("-v", "--verbosity", action="count", default=0)
args = parser.parse_args()
answer = args.x**args.y
if args.verbosity >= 2:
    print(f"@{args.x@} to the power @{args.y@} equals @{answer@}")
elif args.verbosity >= 1:
    print(f"@{args.x@}^@{args.y@} == @{answer@}")
else:
    print(answer)
@end example

출력:

@example
$ python prog.py
usage: prog.py [-h] [-v] x y
prog.py: error: the following arguments are required: x, y
$ python prog.py -h
usage: prog.py [-h] [-v] x y

positional arguments:
  x                the base
  y                the exponent

options:
  -h, --help       show this help message and exit
  -v, --verbosity
$ python prog.py 4 2 -v
4^2 == 16
@end example

지금까지는 표시되는 텍스트를 `변경' 하기 위해 상세도를 사용했습니다. 다음 예제는 대신 `더 많은' 텍스트를 표시하기 위해 상세도를 사용합니다:

@example
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("x", type=int, help="the base")
parser.add_argument("y", type=int, help="the exponent")
parser.add_argument("-v", "--verbosity", action="count", default=0)
args = parser.parse_args()
answer = args.x**args.y
if args.verbosity >= 2:
    print(f"Running '@{__file__@}'")
if args.verbosity >= 1:
    print(f"@{args.x@}^@{args.y@} == ", end="")
print(answer)
@end example

출력:

@example
$ python prog.py 4 2
16
$ python prog.py 4 2 -v
4^2 == 16
$ python prog.py 4 2 -vv
Running 'prog.py'
4^2 == 16
@end example

@menu
* Specifying ambiguous arguments:: 
* 충돌하는 옵션들:: 

@end menu

@node Specifying ambiguous arguments,충돌하는 옵션들,,조금 더 발전시키기
@anchor{howto/argparse id2}@anchor{33f9}@anchor{howto/argparse specifying-ambiguous-arguments}@anchor{33c3}
@subsubsection Specifying ambiguous arguments


When there is ambiguity in deciding whether an argument is positional or for an
argument, @code{--} can be used to tell @ref{339e,,parse_args()} that
everything after that is a positional argument:

@example
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('-n', nargs='+')
>>> parser.add_argument('args', nargs='*')

>>> # ambiguous, so parse_args assumes it's an option
>>> parser.parse_args(['-f'])
usage: PROG [-h] [-n N [N ...]] [args ...]
PROG: error: unrecognized arguments: -f

>>> parser.parse_args(['--', '-f'])
Namespace(args=['-f'], n=None)

>>> # ambiguous, so the -n option greedily accepts arguments
>>> parser.parse_args(['-n', '1', '2', '3'])
Namespace(args=[], n=['1', '2', '3'])

>>> parser.parse_args(['-n', '1', '--', '2', '3'])
Namespace(args=['2', '3'], n=['1'])
@end example

@node 충돌하는 옵션들,,Specifying ambiguous arguments,조금 더 발전시키기
@anchor{howto/argparse conflicting-options}@anchor{33fa}
@subsubsection 충돌하는 옵션들


지금까지 우리는 @ref{1bd,,argparse.ArgumentParser} 인스턴스의 두 가지 메서드로 작업 해왔습니다. 세 번째를 소개합시다, @ref{2ed,,add_mutually_exclusive_group()}. 이것은 서로 배타적인 옵션을 지정할 수 있도록 합니다. 새로운 기능을 더 잘 이해할 수 있도록 프로그램의 나머지 부분을 변경해 보겠습니다: @code{--quiet} 옵션을 도입하는데 @code{--verbose} 의 반대입니다:

@example
import argparse

parser = argparse.ArgumentParser()
group = parser.add_mutually_exclusive_group()
group.add_argument("-v", "--verbose", action="store_true")
group.add_argument("-q", "--quiet", action="store_true")
parser.add_argument("x", type=int, help="the base")
parser.add_argument("y", type=int, help="the exponent")
args = parser.parse_args()
answer = args.x**args.y

if args.quiet:
    print(answer)
elif args.verbose:
    print(f"@{args.x@} to the power @{args.y@} equals @{answer@}")
else:
    print(f"@{args.x@}^@{args.y@} == @{answer@}")
@end example

프로그램은 이제 더 간단 해졌으며, 데모를 위해 일부 기능을 잃어버렸습니다. 어쨌든, 출력은 이렇습니다:

@example
$ python prog.py 4 2
4^2 == 16
$ python prog.py 4 2 -q
16
$ python prog.py 4 2 -v
4 to the power 2 equals 16
$ python prog.py 4 2 -vq
usage: prog.py [-h] [-v | -q] x y
prog.py: error: argument -q/--quiet: not allowed with argument -v/--verbose
$ python prog.py 4 2 -v --quiet
usage: prog.py [-h] [-v | -q] x y
prog.py: error: argument -q/--quiet: not allowed with argument -v/--verbose
@end example

따라가기 쉽습니다. 여러분이 얻는 유연성을 볼 수 있도록 마지막 출력을 추가했습니다. 즉, 긴 형식 옵션을 짧은 형식 옵션과 섞어 쓸 수 있습니다.

결론을 내리기 전에, 여러분은 아마도 사용자들이 모를 경우를 대비해서 프로그램의 주요 목적을 알려주기를 원할 것입니다:

@example
import argparse

parser = argparse.ArgumentParser(description="calculate X to the power of Y")
group = parser.add_mutually_exclusive_group()
group.add_argument("-v", "--verbose", action="store_true")
group.add_argument("-q", "--quiet", action="store_true")
parser.add_argument("x", type=int, help="the base")
parser.add_argument("y", type=int, help="the exponent")
args = parser.parse_args()
answer = args.x**args.y

if args.quiet:
    print(answer)
elif args.verbose:
    print(f"@{args.x@} to the power @{args.y@} equals @{answer@}")
else:
    print(f"@{args.x@}^@{args.y@} == @{answer@}")
@end example

사용법 텍스트의 약간의 차이점에 유의하십시오. @code{[-v | -q]} 에 주목해야 하는데, @code{-v} 나 @code{-q} 를 사용할 수 있지만 동시에 둘 다를 사용할 수는 없다는 뜻입니다:

@example
$ python prog.py --help
usage: prog.py [-h] [-v | -q] x y

calculate X to the power of Y

positional arguments:
  x              the base
  y              the exponent

options:
  -h, --help     show this help message and exit
  -v, --verbose
  -q, --quiet
@end example

@node How to translate the argparse output,Custom type converters,조금 더 발전시키기,Argparse 자습서
@anchor{howto/argparse how-to-translate-the-argparse-output}@anchor{33fb}
@subsubsection How to translate the argparse output


The output of the @ref{7,,argparse} module such as its help text and error
messages are all made translatable using the @ref{67,,gettext} module. This
allows applications to easily localize messages produced by
@code{argparse}. See also @ref{33fc,,프로그램과 모듈의 국제화}.

For instance, in this @ref{7,,argparse} output:

@example
$ python prog.py --help
usage: prog.py [-h] [-v | -q] x y

calculate X to the power of Y

positional arguments:
  x              the base
  y              the exponent

options:
  -h, --help     show this help message and exit
  -v, --verbose
  -q, --quiet
@end example

The strings @code{usage:}, @code{positional arguments:}, @code{options:} and
@code{show this help message and exit} are all translatable.

In order to translate these strings, they must first be extracted
into a @code{.po} file. For example, using Babel@footnote{https://babel.pocoo.org/},
run this command:

@example
$ pybabel extract -o messages.po /usr/lib/python3.12/argparse.py
@end example

This command will extract all translatable strings from the @ref{7,,argparse}
module and output them into a file named @code{messages.po}. This command assumes
that your Python installation is in @code{/usr/lib}.

You can find out the location of the @ref{7,,argparse} module on your system
using this script:

@example
import argparse
print(argparse.__file__)
@end example

Once the messages in the @code{.po} file are translated and the translations are
installed using @ref{67,,gettext}, @ref{7,,argparse} will be able to display the
translated messages.

To translate your own strings in the @ref{7,,argparse} output, use @ref{67,,gettext}.

@node Custom type converters,맺음말,How to translate the argparse output,Argparse 자습서
@anchor{howto/argparse custom-type-converters}@anchor{33fd}
@subsubsection Custom type converters


The @ref{7,,argparse} module allows you to specify custom type converters for
your command-line arguments. This allows you to modify user input before it’s
stored in the @ref{339f,,argparse.Namespace}. This can be useful when you need to
pre-process the input before it is used in your program.

When using a custom type converter, you can use any callable that takes a
single string argument (the argument value) and returns the converted value.
However, if you need to handle more complex scenarios, you can use a custom
action class with the `action' parameter instead.

For example, let’s say you want to handle arguments with different prefixes and
process them accordingly:

@example
import argparse

parser = argparse.ArgumentParser(prefix_chars='-+')

parser.add_argument('-a', metavar='<value>', action='append',
                    type=lambda x: ('-', x))
parser.add_argument('+a', metavar='<value>', action='append',
                    type=lambda x: ('+', x))

args = parser.parse_args()
print(args)
@end example

출력:

@example
$ python prog.py -a value1 +a value2
Namespace(a=[('-', 'value1'), ('+', 'value2')])
@end example

이 예에서,:


@itemize *

@item 
Created a parser with custom prefix characters using the @code{prefix_chars}
parameter.

@item 
Defined two arguments, @code{-a} and @code{+a}, which used the @code{type} parameter to
create custom type converters to store the value in a tuple with the prefix.
@end itemize

Without the custom type converters, the arguments would have treated the @code{-a}
and @code{+a} as the same argument, which would have been undesirable. By using custom
type converters, we were able to differentiate between the two arguments.

@node 맺음말,,Custom type converters,Argparse 자습서
@anchor{howto/argparse conclusion}@anchor{33fe}
@subsubsection 맺음말


@ref{7,,argparse} 모듈은 여기에 제시된 것보다 훨씬 많은 것을 제공합니다. 문서는 아주 상세하고 철저하며 예제가 풍부합니다. 이 자습서를 끝내면 압도감 없이 쉽게 소화할 수 있을 겁니다.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)
@anchor{howto/argparse-optparse upgrading-optparse-code}@anchor{13b3}
@node Migrating optparse code to argparse,,Argparse 자습서,Exceptions<5>
@anchor{howto/argparse-optparse doc}@anchor{33ff}@anchor{howto/argparse-optparse migrating-optparse-code}@anchor{3400}@anchor{howto/argparse-optparse migrating-optparse-code-to-argparse}@anchor{3401}@anchor{howto/argparse-optparse translation-repo}@anchor{3402}
@subsubsection Migrating @code{optparse} code to @code{argparse}


The @ref{7,,argparse} module offers several higher level features not natively
provided by the @ref{a4,,optparse} module, including:


@itemize *

@item 
Handling positional arguments.

@item 
Supporting subcommands.

@item 
Allowing alternative option prefixes like @code{+} and @code{/}.

@item 
Handling zero-or-more and one-or-more style arguments.

@item 
Producing more informative usage messages.

@item 
Providing a much simpler interface for custom @code{type} and @code{action}.
@end itemize

Originally, the @ref{7,,argparse} module attempted to maintain compatibility
with @ref{a4,,optparse}.  However, the fundamental design differences between
supporting declarative command line option processing (while leaving positional
argument processing to application code), and supporting both named options
and positional arguments in the declarative interface mean that the
API has diverged from that of @code{optparse} over time.

As described in @ref{339c,,Choosing an argument parsing library}, applications that are
currently using @ref{a4,,optparse} and are happy with the way it works can
just continue to use @code{optparse}.

Application developers that are considering migrating should also review
the list of intrinsic behavioural differences described in that section
before deciding whether or not migration is desirable.

For applications that do choose to migrate from @ref{a4,,optparse} to @ref{7,,argparse},
the following suggestions should be helpful:


@itemize *

@item 
Replace all @ref{3403,,optparse.OptionParser.add_option()} calls with
@ref{4bd,,ArgumentParser.add_argument()} calls.

@item 
Replace @code{(options, args) = parser.parse_args()} with @code{args =
parser.parse_args()} and add additional @ref{4bd,,ArgumentParser.add_argument()}
calls for the positional arguments. Keep in mind that what was previously
called @code{options}, now in the @ref{7,,argparse} context is called @code{args}.

@item 
Replace @ref{3404,,optparse.OptionParser.disable_interspersed_args()}
by using @ref{cf6,,parse_intermixed_args()} instead of
@ref{339e,,parse_args()}.

@item 
Replace callback actions and the @code{callback_*} keyword arguments with
@code{type} or @code{action} arguments.

@item 
Replace string names for @code{type} keyword arguments with the corresponding
type objects (e.g. int, float, complex, etc).

@item 
Replace @ref{3405,,optparse.Values} with @ref{339f,,Namespace} and
@ref{3406,,optparse.OptionError} and @ref{3407,,optparse.OptionValueError} with
@ref{33ef,,ArgumentError}.

@item 
Replace strings with implicit arguments such as @code{%default} or @code{%prog} with
the standard Python syntax to use dictionaries to format strings, that is,
@code{%(default)s} and @code{%(prog)s}.

@item 
Replace the OptionParser constructor @code{version} argument with a call to
@code{parser.add_argument('--version', action='version', version='<the version>')}.
@end itemize

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node optparse — 명령 줄 옵션용 구문 분석기,getpass — 이식성 있는 암호 입력,argparse — Parser for command-line options arguments and subcommands,Command-line interface libraries
@anchor{library/optparse doc}@anchor{3408}@anchor{library/optparse module-optparse}@anchor{a4}@anchor{library/optparse optparse-parser-for-command-line-options}@anchor{3409}@anchor{library/optparse translation-repo}@anchor{340a}
@subsection @code{optparse} — 명령 줄 옵션용 구문 분석기


@geindex module; optparse

`소스 코드:' Lib/optparse.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/optparse.py}


__________________________________________________________________


@menu
* Choosing an argument parsing library:: 
* Introduction: Introduction<4>. 
* 배경:: 
* 자습서:: 
* 레퍼런스 지침서:: 
* 옵션 콜백:: 
* Extending optparse:: 
* 예외: 예외<7>. 

@end menu

@node Choosing an argument parsing library,Introduction<4>,,optparse — 명령 줄 옵션용 구문 분석기
@anchor{library/optparse choosing-an-argument-parser}@anchor{339c}@anchor{library/optparse choosing-an-argument-parsing-library}@anchor{340b}
@subsubsection Choosing an argument parsing library


The standard library includes three argument parsing libraries:


@itemize *

@item 
@ref{65,,getopt}: a module that closely mirrors the procedural C @code{getopt} API.
Included in the standard library since before the initial Python 1.0 release.

@item 
@code{optparse}: a declarative replacement for @code{getopt} that
provides equivalent functionality without requiring each application
to implement its own procedural option parsing logic. Included
in the standard library since the Python 2.3 release.

@item 
@ref{7,,argparse}: a more opinionated alternative to @code{optparse} that
provides more functionality by default, at the expense of reduced application
flexibility in controlling exactly how arguments are processed. Included in
the standard library since the Python 2.7 and Python 3.2 releases.
@end itemize

In the absence of more specific argument parsing design constraints, @ref{7,,argparse}
is the recommended choice for implementing command line applications, as it offers
the highest level of baseline functionality with the least application level code.

@ref{65,,getopt} is retained almost entirely for backwards compatibility reasons.
However, it also serves a niche use case as a tool for prototyping and testing
command line argument handling in @code{getopt}-based C applications.

@code{optparse} should be considered as an alternative to @ref{7,,argparse} in the
following cases:


@itemize *

@item 
an application is already using @code{optparse} and doesn’t want to risk the
subtle behavioural changes that may arise when migrating to @ref{7,,argparse}

@item 
the application requires additional control over the way options and
positional parameters are interleaved on the command line (including
the ability to disable the interleaving feature completely)

@item 
the application requires additional control over the incremental parsing
of command line elements (while @code{argparse} does support this, the
exact way it works in practice is undesirable for some use cases)

@item 
the application requires additional control over the handling of options
which accept parameter values that may start with @code{-} (such as delegated
options to be passed to invoked subprocesses)

@item 
the application requires some other command line parameter processing
behavior which @code{argparse} does not support, but which can be implemented
in terms of the lower level interface offered by @code{optparse}
@end itemize

These considerations also mean that @code{optparse} is likely to provide a
better foundation for library authors writing third party command line
argument processing libraries.

As a concrete example, consider the following two command line argument
parsing configurations, the first using @code{optparse}, and the second
using @code{argparse}:

@example
import optparse

if __name__ == '__main__':
    parser = optparse.OptionParser()
    parser.add_option('-o', '--output')
    parser.add_option('-v', dest='verbose', action='store_true')
    opts, args = parser.parse_args()
    process(args, output=opts.output, verbose=opts.verbose)
@end example

@example
import argparse

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('-o', '--output')
    parser.add_argument('-v', dest='verbose', action='store_true')
    parser.add_argument('rest', nargs='*')
    args = parser.parse_args()
    process(args.rest, output=args.output, verbose=args.verbose)
@end example

The most obvious difference is that in the @code{optparse} version, the non-option
arguments are processed separately by the application after the option processing
is complete. In the @code{argparse} version, positional arguments are declared and
processed in the same way as the named options.

However, the @code{argparse} version will also handle some parameter combination
differently from the way the @code{optparse} version would handle them.
For example (amongst other differences):


@itemize *

@item 
supplying @code{-o -v} gives @code{output="-v"} and @code{verbose=False}
when using @code{optparse}, but a usage error with @code{argparse}
(complaining that no value has been supplied for @code{-o/--output},
since @code{-v} is interpreted as meaning the verbosity flag)

@item 
similarly, supplying @code{-o --} gives @code{output="--"} and @code{args=()}
when using @code{optparse}, but a usage error with @code{argparse}
(also complaining that no value has been supplied for @code{-o/--output},
since @code{--} is interpreted as terminating the option processing
and treating all remaining values as positional arguments)

@item 
supplying @code{-o=foo} gives @code{output="=foo"} when using @code{optparse},
but gives @code{output="foo"} with @code{argparse} (since @code{=} is special
cased as an alternative separator for option parameter values)
@end itemize

Whether these differing behaviors in the @code{argparse} version are
considered desirable or a problem will depend on the specific command line
application use case.


@subsubheading 더 보기


click@footnote{https://pypi.org/project/click/} is a third party argument processing library (originally
based on @code{optparse}), which allows command line applications to be
developed as a set of decorated command implementation functions.

Other third party libraries, such as typer@footnote{https://pypi.org/project/typer/} or msgspec-click@footnote{https://pypi.org/project/msgspec-click/},
allow command line interfaces to be specified in ways that more effectively
integrate with static checking of Python type annotations.


@node Introduction<4>,배경,Choosing an argument parsing library,optparse — 명령 줄 옵션용 구문 분석기
@anchor{library/optparse introduction}@anchor{340c}
@subsubsection Introduction


@code{optparse} is a more convenient, flexible, and powerful library for parsing
command-line options than the minimalist @ref{65,,getopt} module.
@code{optparse} uses a more declarative style of command-line parsing:
you create an instance of @ref{16d2,,OptionParser},
populate it with options, and parse the command line.
@code{optparse} allows users to specify options in the conventional
GNU/POSIX syntax, and additionally generates usage and help messages for you.

Here’s an example of using @code{optparse} in a simple script:

@example
from optparse import OptionParser
...
parser = OptionParser()
parser.add_option("-f", "--file", dest="filename",
                  help="write report to FILE", metavar="FILE")
parser.add_option("-q", "--quiet",
                  action="store_false", dest="verbose", default=True,
                  help="don't print status messages to stdout")

(options, args) = parser.parse_args()
@end example

이 몇 줄의 코드로, 스크립트 사용자는 이제 명령 줄에서 “일반적인 작업”을 수행 할 수 있습니다, 예를 들면:

@example
<yourscript> --file=outfile -q
@end example

As it parses the command line, @code{optparse} sets attributes of the
@code{options} object returned by @ref{16d3,,parse_args()} based on user-supplied
command-line values.  When @code{parse_args()} returns from parsing this command
line, @code{options.filename} will be @code{"outfile"} and @code{options.verbose} will be
@code{False}.  @code{optparse} supports both long and short options, allows short
options to be merged together, and allows options to be associated with their
arguments in a variety of ways.  Thus, the following command lines are all
equivalent to the above example:

@example
<yourscript> -f outfile --quiet
<yourscript> --quiet --file outfile
<yourscript> -q -foutfile
<yourscript> -qfoutfile
@end example

또한, 사용자는 다음 중 하나를 실행할 수 있습니다

@example
<yourscript> -h
<yourscript> --help
@end example

and @code{optparse} will print out a brief summary of your script’s options:

@example
Usage: <yourscript> [options]

Options:
  -h, --help            show this help message and exit
  -f FILE, --file=FILE  write report to FILE
  -q, --quiet           don't print status messages to stdout
@end example

여기서 `yourscript'의 값은 (일반적으로 @code{sys.argv[0]}에서) 실행 시간에 결정됩니다.

@node 배경,자습서,Introduction<4>,optparse — 명령 줄 옵션용 구문 분석기
@anchor{library/optparse background}@anchor{340d}@anchor{library/optparse optparse-background}@anchor{340e}
@subsubsection 배경


@code{optparse} was explicitly designed to encourage the creation of programs
with straightforward command-line interfaces that follow the conventions
established by the @code{getopt()} family of functions available to C developers.
To that end, it supports only the most common command-line syntax and semantics
conventionally used under Unix.  If you are unfamiliar with these conventions,
reading this section will allow you to acquaint yourself with them.

@menu
* 용어:: 
* 옵션은 무엇을 위한 것입니까?:: 
* 위치 인자는 무엇을 위한 것입니까?:: 

@end menu

@node 용어,옵션은 무엇을 위한 것입니까?,,배경
@anchor{library/optparse optparse-terminology}@anchor{340f}@anchor{library/optparse terminology}@anchor{3410}
@subsubsection 용어



@table @asis

@item 인자(argument)

명령 줄에 입력하고, 셸에서 @code{execl()}이나 @code{execv()}로 전달한 문자열. 파이썬에서, 인자는 @code{sys.argv[1:]}의 요소입니다 (@code{sys.argv[0]}은 실행 중인 프로그램의 이름입니다). 유닉스 셸은 “워드(word)”라는 용어도 사용합니다.

때때로 @code{sys.argv[1:]} 이외의 인자 리스트로 대체하는 것이 바람직해서, “인자”를 “@code{sys.argv[1:]}이나 @code{sys.argv[1:]}의 대체로 제공된 다른 리스트의 요소”로 읽어야 합니다.

@item 옵션(option)

an argument used to supply extra information to guide or customize the
execution of a program.  There are many different syntaxes for options; the
traditional Unix syntax is a hyphen (“-”) followed by a single letter,
e.g. @code{-x} or @code{-F}.  Also, traditional Unix syntax allows multiple
options to be merged into a single argument, e.g. @code{-x -F} is equivalent
to @code{-xF}.  The GNU project introduced @code{--} followed by a series of
hyphen-separated words, e.g. @code{--file} or @code{--dry-run}.  These are the
only two option syntaxes provided by @code{optparse}.

세상에 등장했던 다른 옵션 문법은 다음과 같습니다:


@itemize *

@item 
몇 개의 문자가 뒤따르는 하이픈, 예를 들어 @code{-pf} (이것은 하나의 인자로 병합된 여러 옵션과 같은 것이 `아닙니다')

@item 
전체 단어가 뒤따르는 하이픈, 예를 들어 @code{-file} (기술적으로 이전 문법과 동등하지만, 일반적으로 같은 프로그램에서 등장하지 않습니다)

@item 
단일 문자나 몇 개의 문자 또는 단어가 뒤따르는 더하기 기호, 예를 들어 @code{+f}, @code{+rgb}

@item 
단일 문자나 몇 개의 문자 또는 단어가 뒤따르는 슬래시, 예를 들어 @code{/f}, @code{/file}
@end itemize

These option syntaxes are not supported by @code{optparse}, and they never
will be.  This is deliberate: the first three are non-standard on any
environment, and the last only makes sense if you’re exclusively targeting
Windows or certain legacy platforms (e.g. VMS, MS-DOS).

@item 옵션 인자(option argument)

an argument that follows an option, is closely associated with that option,
and is consumed from the argument list when that option is. With
@code{optparse}, option arguments may either be in a separate argument from
their option:

@example
-f foo
--file foo
@end example

또는 같은 인자에 포함될 수 있습니다:

@example
-ffoo
--file=foo
@end example

Typically, a given option either takes an argument or it doesn’t. Lots of
people want an “optional option arguments” feature, meaning that some options
will take an argument if they see it, and won’t if they don’t.  This is
somewhat controversial, because it makes parsing ambiguous: if @code{-a} takes
an optional argument and @code{-b} is another option entirely, how do we
interpret @code{-ab}?  Because of this ambiguity, @code{optparse} does not
support this feature.

@item 위치 인자(positional argument)

옵션이 구문 분석된 후, 즉 옵션과 해당 인자가 구문 분석되고 인자 목록에서 제거된 후 인자 목록에 남은 것.

@item 필수 옵션(required option)

an option that must be supplied on the command-line; note that the phrase
“required option” is self-contradictory in English.  @code{optparse} doesn’t
prevent you from implementing required options, but doesn’t give you much
help at it either.
@end table

예를 들어, 다음 가상 명령 줄을 고려하십시오:

@example
prog -v --report report.txt foo bar
@end example

@code{-v}와 @code{--report}는 둘 다 옵션입니다. @code{--report}가 하나의 인자를 취한다고 가정하면, @code{report.txt}는 옵션 인자입니다. @code{foo}와 @code{bar}는 위치 인자입니다.

@node 옵션은 무엇을 위한 것입니까?,위치 인자는 무엇을 위한 것입니까?,용어,배경
@anchor{library/optparse optparse-what-options-for}@anchor{3411}@anchor{library/optparse what-are-options-for}@anchor{3412}
@subsubsection 옵션은 무엇을 위한 것입니까?


옵션은 프로그램 실행을 조정하거나 사용자 정의하기 위한 추가 정보를 제공하는 데 사용됩니다. 명확하지 않은 경우, 옵션은 일반적으로 `선택적'입니다. 프로그램은 어떤 옵션도 없이 잘 실행될 수 있어야 합니다. (유닉스나 GNU 도구 집합에서 임의의 프로그램을 선택하십시오. 옵션 없이도 실행될 수 있으며 여전히 의미가 있습니까? 주요 예외는 @code{find}, @code{tar} 및 @code{dd}입니다 — 모두 비표준 문법과 혼란스러운 인터페이스 때문에 올바로 비판을 받은 돌연변이 괴짜입니다.)

많은 사람이 프로그램에 “필수 옵션”이 있기를 원합니다. 생각해보십시오. 필수라면, 그것은 `선택적(optional)이 아닙니다'! 당신의 프로그램이 성공적으로 실행하기 위해 절대적으로 필요한 정보가 있다면, 그것이 바로 위치 인자의 목적입니다.

좋은 명령 줄 인터페이스 설계의 예로, 파일 복사를 위한 겸손한 @code{cp} 유틸리티를 고려하십시오. 대상과 하나 이상의 소스를 제공하지 않고 파일을 복사하는 것은 의미가 없습니다. 따라서, 인자 없이 실행하면 @code{cp}가 실패합니다. 그러나 옵션이 전혀 필수로 요구하지 않는 유연하고 유용한 문법을 갖습니다:

@example
cp SOURCE DEST
cp SOURCE ... DEST-DIR
@end example

그것만으로도 꽤 멀리 갈 수 있습니다. 대부분의 @code{cp} 구현은 파일이 복사되는 방식을 정확하게 조정할 수 있는 여러 옵션을 제공합니다: 모드 및 수정 시간을 보존하고, 심볼릭 링크를 따르지 않고, 기존 파일을 건드리기 전에 물을 수 있습니다. 하지만 이 중 어느 것도 한 파일을 다른 파일로 복사하거나 여러 파일을 다른 디렉터리로 복사하는 @code{cp}의 핵심 임무를 방해하지 않습니다.

@node 위치 인자는 무엇을 위한 것입니까?,,옵션은 무엇을 위한 것입니까?,배경
@anchor{library/optparse optparse-what-positional-arguments-for}@anchor{3413}@anchor{library/optparse what-are-positional-arguments-for}@anchor{3414}
@subsubsection 위치 인자는 무엇을 위한 것입니까?


위치 인자는 프로그램이 실행하기 위해 절대적으로 필요로하는 정보를 위한 것입니다.

좋은 사용자 인터페이스에는 가능한 한 적은 절대 요구 사항이 있어야 합니다. 프로그램을 성공적으로 실행하기 위해 17개의 개별 정보를 요구한다면, 사용자로부터 해당 정보를 `어떻게' 얻는지는 중요하지 않습니다—대부분의 사람은 프로그램을 성공적으로 실행하기 전에 포기하고 떠납니다. 이것은 사용자 인터페이스가 명령 줄이든, 구성 파일이든, GUI이든 상관없이 적용됩니다: 사용자에게 그렇게 많은 요구를 하면, 대부분은 단순히 포기할 것입니다.

요컨대, 사용자가 절대적으로 제공해야 하는 정보의 양을 최소화하십시오—가능할 때마다 합리적인 기본값을 사용하십시오. 물론, 프로그램을 합리적으로 유연하게 만들고 싶기도 합니다. 그것이 바로 옵션이 있는 이유입니다. 다시 말하지만, 구성 파일의 항목인지, GUI의 “기본 설정” 대화 상자에 있는 위젯인지, 명령 줄 옵션인지는 중요하지 않습니다—구현하는 옵션이 많을수록, 프로그램이 더 유연해지고, 구현은 더 복잡해집니다. 물론 유연성이 너무 많으면 단점도 있습니다; 너무 많은 옵션은 사용자를 압도하고 코드 유지 관리를 훨씬 더 어렵게 만들 수 있습니다.

@node 자습서,레퍼런스 지침서,배경,optparse — 명령 줄 옵션용 구문 분석기
@anchor{library/optparse optparse-tutorial}@anchor{3415}@anchor{library/optparse tutorial}@anchor{3416}
@subsubsection 자습서


While @code{optparse} is quite flexible and powerful, it’s also straightforward
to use in most cases.  This section covers the code patterns that are common to
any @code{optparse}-based program.

먼저, OptionParser 클래스를 임포트 해야 합니다; 그런 다음 메인 프로그램의 초기에, OptionParser 인스턴스를 만듭니다:

@example
from optparse import OptionParser
...
parser = OptionParser()
@end example

그런 다음 옵션 정의를 시작할 수 있습니다. 기본 문법은 다음과 같습니다:

@example
parser.add_option(opt_str, ...,
                  attr=value, ...)
@end example

Each option has one or more option strings, such as @code{-f} or @code{--file},
and several option attributes that tell @code{optparse} what to expect and what
to do when it encounters that option on the command line.

일반적으로, 각 옵션에는 하나의 짧은 옵션 문자열과 하나의 긴 옵션 문자열이 있습니다, 예를 들어:

@example
parser.add_option("-f", "--file", ...)
@end example

전체적으로 적어도 하나의 옵션 문자열이 있는 한 원하는 만큼 짧은 옵션 문자열과 긴 옵션 문자열을 (없는 것도 포함합니다) 자유롭게 정의 할 수 있습니다.

The option strings passed to @ref{3403,,OptionParser.add_option()} are effectively
labels for the
option defined by that call.  For brevity, we will frequently refer to
`encountering an option' on the command line; in reality, @code{optparse}
encounters `option strings' and looks up options from them.

Once all of your options are defined, instruct @code{optparse} to parse your
program’s command line:

@example
(options, args) = parser.parse_args()
@end example

(원한다면, 사용자 정의 인자 리스트를 @ref{16d3,,parse_args()}에 전달할 수 있지만, 거의 필요하지 않습니다: 기본적으로 @code{sys.argv[1:]}을 사용합니다.)

@ref{16d3,,parse_args()}는 두 가지 값을 반환합니다:


@itemize *

@item 
@code{options}, 모든 옵션에 대한 값을 포함하는 객체—예를 들어 @code{--file}이 단일 문자열 인자를 취하면, @code{options.file}은 사용자가 제공한 파일명이거나, 사용자가 해당 옵션을 제공하지 않으면 @code{None}입니다.

@item 
@code{args}, 옵션 구문 분석 후 남은 위치 인자 리스트
@end itemize

이 자습서 섹션에서는 가장 중요한 4가지 옵션 어트리뷰트만 다룹니다: @ref{3417,,action}, @ref{3418,,type}, @ref{3419,,dest} (destination) 및 @ref{341a,,help}만 다룹니다. 이 중, @code{action}이 가장 기본입니다.

@menu
* 옵션 액션의 이해:: 
* store 액션:: 
* 불리언 (플래그) 옵션 처리하기: 불리언 플래그 옵션 처리하기. 
* 다른 액션들:: 
* 기본값:: 
* 도움말 생성하기:: 
* 버전 문자열 인쇄하기:: 
* How optparse handles errors:: 
* 모두 합치기:: 

@end menu

@node 옵션 액션의 이해,store 액션,,자습서
@anchor{library/optparse optparse-understanding-option-actions}@anchor{341b}@anchor{library/optparse understanding-option-actions}@anchor{341c}
@subsubsection 옵션 액션의 이해


Actions tell @code{optparse} what to do when it encounters an option on the
command line.  There is a fixed set of actions hard-coded into @code{optparse};
adding new actions is an advanced topic covered in section
@ref{341d,,Extending optparse}.  Most actions tell @code{optparse} to store
a value in some variable—for example, take a string from the command line and
store it in an attribute of @code{options}.

If you don’t specify an option action, @code{optparse} defaults to @code{store}.

@node store 액션,불리언 플래그 옵션 처리하기,옵션 액션의 이해,자습서
@anchor{library/optparse optparse-store-action}@anchor{341e}@anchor{library/optparse the-store-action}@anchor{341f}
@subsubsection store 액션


The most common option action is @code{store}, which tells @code{optparse} to take
the next argument (or the remainder of the current argument), ensure that it is
of the correct type, and store it to your chosen destination.

예를 들면:

@example
parser.add_option("-f", "--file",
                  action="store", type="string", dest="filename")
@end example

Now let’s make up a fake command line and ask @code{optparse} to parse it:

@example
args = ["-f", "foo.txt"]
(options, args) = parser.parse_args(args)
@end example

When @code{optparse} sees the option string @code{-f}, it consumes the next
argument, @code{foo.txt}, and stores it in @code{options.filename}.  So, after this
call to @ref{16d3,,parse_args()}, @code{options.filename} is @code{"foo.txt"}.

Some other option types supported by @code{optparse} are @code{int} and @code{float}.
Here’s an option that expects an integer argument:

@example
parser.add_option("-n", type="int", dest="num")
@end example

이 옵션에는 긴 옵션 문자열이 없는데, 완벽하게 허용됩니다. 또한, 기본값이 @code{store}이기 때문에 명시적인 액션이 없습니다.

다른 가짜 명령 줄을 구문 분석해 봅시다. 이번에는, 옵션 인자를 옵션 바로 다음에 붙일 것입니다: @code{-n42}(하나의 인자)는 @code{-n 42}(두 개의 인자)와 동등하므로, 다음 코드는

@example
(options, args) = parser.parse_args(["-n42"])
print(options.num)
@end example

@code{42}를 인쇄합니다.

If you don’t specify a type, @code{optparse} assumes @code{string}.  Combined with
the fact that the default action is @code{store}, that means our first example can
be a lot shorter:

@example
parser.add_option("-f", "--file", dest="filename")
@end example

If you don’t supply a destination, @code{optparse} figures out a sensible
default from the option strings: if the first long option string is
@code{--foo-bar}, then the default destination is @code{foo_bar}.  If there are no
long option strings, @code{optparse} looks at the first short option string: the
default destination for @code{-f} is @code{f}.

@code{optparse} also includes the built-in @code{complex} type.  Adding
types is covered in section @ref{341d,,Extending optparse}.

@node 불리언 플래그 옵션 처리하기,다른 액션들,store 액션,자습서
@anchor{library/optparse handling-boolean-flag-options}@anchor{3420}@anchor{library/optparse optparse-handling-boolean-options}@anchor{3421}
@subsubsection 불리언 (플래그) 옵션 처리하기


Flag options—set a variable to true or false when a particular option is
seen—are quite common.  @code{optparse} supports them with two separate actions,
@code{store_true} and @code{store_false}.  For example, you might have a @code{verbose}
flag that is turned on with @code{-v} and off with @code{-q}:

@example
parser.add_option("-v", action="store_true", dest="verbose")
parser.add_option("-q", action="store_false", dest="verbose")
@end example

여기에 대상이 같은 두 가지 옵션이 있는데, 완벽하게 괜찮습니다. (단지 기본값을 설정할 때 약간 주의해야 함을 뜻합니다—아래를 참조하십시오.)

When @code{optparse} encounters @code{-v} on the command line, it sets
@code{options.verbose} to @code{True}; when it encounters @code{-q},
@code{options.verbose} is set to @code{False}.

@node 다른 액션들,기본값,불리언 플래그 옵션 처리하기,자습서
@anchor{library/optparse optparse-other-actions}@anchor{3422}@anchor{library/optparse other-actions}@anchor{3423}
@subsubsection 다른 액션들


Some other actions supported by @code{optparse} are:


@table @asis

@item @code{"store_const"}

store a constant value, pre-set via @ref{3424,,Option.const}

@item @code{"append"}

이 옵션의 인자를 리스트에 추가합니다

@item @code{"count"}

카운터를 1씩 증가시킵니다

@item @code{"callback"}

지정된 함수를 호출합니다
@end table

이들은 섹션 @ref{3425,,레퍼런스 지침서}와 섹션 @ref{3426,,옵션 콜백}에서 다룹니다.

@node 기본값,도움말 생성하기,다른 액션들,자습서
@anchor{library/optparse default-values}@anchor{3427}@anchor{library/optparse optparse-default-values}@anchor{3428}
@subsubsection 기본값


All of the above examples involve setting some variable (the “destination”) when
certain command-line options are seen.  What happens if those options are never
seen?  Since we didn’t supply any defaults, they are all set to @code{None}.  This
is usually fine, but sometimes you want more control.  @code{optparse} lets you
supply a default value for each destination, which is assigned before the
command line is parsed.

First, consider the verbose/quiet example.  If we want @code{optparse} to set
@code{verbose} to @code{True} unless @code{-q} is seen, then we can do this:

@example
parser.add_option("-v", action="store_true", dest="verbose", default=True)
parser.add_option("-q", action="store_false", dest="verbose")
@end example

기본값은 특정 옵션이 아닌 `대상(destination)'에 적용되고, 이 두 옵션은 같은 대상을 갖기 때문에, 다음과 정확히 동등합니다:

@example
parser.add_option("-v", action="store_true", dest="verbose")
parser.add_option("-q", action="store_false", dest="verbose", default=True)
@end example

이걸 생각해봅시다:

@example
parser.add_option("-v", action="store_true", dest="verbose", default=False)
parser.add_option("-q", action="store_false", dest="verbose", default=True)
@end example

다시, @code{verbose}의 기본값은 @code{True}입니다: 특정 대상에 대해 제공되는 마지막 기본값이 사용되는 값입니다.

기본값을 지정하는 더 명확한 방법은 OptionParser의 @code{set_defaults()} 메서드인데, @ref{16d3,,parse_args()}를 호출하기 전에 언제든지 호출할 수 있습니다:

@example
parser.set_defaults(verbose=True)
parser.add_option(...)
(options, args) = parser.parse_args()
@end example

이전과 마찬가지로, 주어진 옵션 대상에 대해 지정된 마지막 값이 사용됩니다. 명확성을 위해, 둘 다가 아닌 한 가지 방법을 사용하여 기본값을 설정하십시오.

@node 도움말 생성하기,버전 문자열 인쇄하기,기본값,자습서
@anchor{library/optparse generating-help}@anchor{3429}@anchor{library/optparse optparse-generating-help}@anchor{342a}
@subsubsection 도움말 생성하기


@code{optparse}’s ability to generate help and usage text automatically is
useful for creating user-friendly command-line interfaces.  All you have to do
is supply a @ref{341a,,help} value for each option, and optionally a short
usage message for your whole program.  Here’s an OptionParser populated with
user-friendly (documented) options:

@example
usage = "usage: %prog [options] arg1 arg2"
parser = OptionParser(usage=usage)
parser.add_option("-v", "--verbose",
                  action="store_true", dest="verbose", default=True,
                  help="make lots of noise [default]")
parser.add_option("-q", "--quiet",
                  action="store_false", dest="verbose",
                  help="be vewwy quiet (I'm hunting wabbits)")
parser.add_option("-f", "--filename",
                  metavar="FILE", help="write output to FILE")
parser.add_option("-m", "--mode",
                  default="intermediate",
                  help="interaction mode: novice, intermediate, "
                       "or expert [default: %default]")
@end example

If @code{optparse} encounters either @code{-h} or @code{--help} on the
command-line, or if you just call @code{parser.print_help()}, it prints the
following to standard output:

@example
Usage: <yourscript> [options] arg1 arg2

Options:
  -h, --help            show this help message and exit
  -v, --verbose         make lots of noise [default]
  -q, --quiet           be vewwy quiet (I'm hunting wabbits)
  -f FILE, --filename=FILE
                        write output to FILE
  -m MODE, --mode=MODE  interaction mode: novice, intermediate, or
                        expert [default: intermediate]
@end example

(If the help output is triggered by a help option, @code{optparse} exits after
printing the help text.)

There’s a lot going on here to help @code{optparse} generate the best possible
help message:


@itemize *

@item 
스크립트는 자체 사용법 메시지를 정의합니다:

@example
usage = "usage: %prog [options] arg1 arg2"
@end example

@code{optparse} expands @code{%prog} in the usage string to the name of the
current program, i.e. @code{os.path.basename(sys.argv[0])}.  The expanded string
is then printed before the detailed option help.

If you don’t supply a usage string, @code{optparse} uses a bland but sensible
default: @code{"Usage: %prog [options]"}, which is fine if your script doesn’t
take any positional arguments.

@item 
every option defines a help string, and doesn’t worry about
line-wrapping—@code{optparse} takes care of wrapping lines and making
the help output look good.

@item 
값을 취하는 옵션은 자동으로 생성된 도움말 메시지에 이 사실을 나타냅니다, 예를 들어 “mode” 옵션의 경우:

@example
-m MODE, --mode=MODE
@end example

Here, “MODE” is called the meta-variable: it stands for the argument that the
user is expected to supply to @code{-m}/@code{--mode}.  By default,
@code{optparse} converts the destination variable name to uppercase and uses
that for the meta-variable.  Sometimes, that’s not what you want—for
example, the @code{--filename} option explicitly sets @code{metavar="FILE"},
resulting in this automatically generated option description:

@example
-f FILE, --filename=FILE
@end example

이것은 공간을 절약하는 것 이상으로 중요합니다: 수동으로 작성된 도움말 텍스트는 메타 변수 @code{FILE}을 사용하여 반 형식 구문 @code{-f FILE}과 비형식적 의미 설명 “write output to FILE” 사이에 연결이 있다는 단서를 사용자에게 알려줍니다. 이는 최종 사용자에게 도움말 텍스트를 훨씬 더 명확하고 유용하게 만드는 간단하지만, 효과적인 방법입니다.

@item 
options that have a default value can include @code{%default} in the help
string—@code{optparse} will replace it with @ref{169,,str()} of the option’s
default value.  If an option has no default value (or the default value is
@code{None}), @code{%default} expands to @code{none}.
@end itemize

@menu
* 옵션 그룹화하기:: 

@end menu

@node 옵션 그룹화하기,,,도움말 생성하기
@anchor{library/optparse grouping-options}@anchor{342b}
@subsubsection 옵션 그룹화하기


많은 옵션을 다룰 때, 더 나은 도움말 출력을 위해 이러한 옵션을 그룹화하는 것이 편리합니다. @ref{16d2,,OptionParser}에는 여러 옵션 그룹이 포함될 수 있으며 각 그룹에는 여러 옵션이 포함될 수 있습니다.

옵션 그룹은 클래스 @ref{342c,,OptionGroup}을 사용하여 얻습니다:

@geindex OptionGroup (optparse 클래스)
@anchor{library/optparse optparse OptionGroup}@anchor{342c}
@deffn {클래스} optparse.OptionGroup (parser, title, description=None)

여기서


@itemize *

@item 
parser는 그룹이 삽입될 @ref{16d2,,OptionParser} 인스턴스입니다

@item 
title은 그룹 제목입니다

@item 
description(선택 사항)은 그룹에 대한 자세한 설명입니다
@end itemize
@end deffn

@ref{342c,,OptionGroup}은 (@ref{16d2,,OptionParser} 처럼) @code{OptionContainer}에서 상속되므로 @code{add_option()} 메서드를 사용하여 그룹에 옵션을 추가할 수 있습니다.

일단 모든 옵션이 선언되면, @ref{16d2,,OptionParser} 메서드 @code{add_option_group()}을 사용하여 그룹이 이전에 정의된 구문 분석기에 추가됩니다.

이전 섹션에서 정의한 구문 분석기로 계속 진행하면, 구문 분석기에 @ref{342c,,OptionGroup}을 쉽게 추가할 수 있습니다:

@example
group = OptionGroup(parser, "Dangerous Options",
                    "Caution: use these options at your own risk.  "
                    "It is believed that some of them bite.")
group.add_option("-g", action="store_true", help="Group option.")
parser.add_option_group(group)
@end example

그러면 다음과 같은 도움말이 출력됩니다:

@example
Usage: <yourscript> [options] arg1 arg2

Options:
  -h, --help            show this help message and exit
  -v, --verbose         make lots of noise [default]
  -q, --quiet           be vewwy quiet (I'm hunting wabbits)
  -f FILE, --filename=FILE
                        write output to FILE
  -m MODE, --mode=MODE  interaction mode: novice, intermediate, or
                        expert [default: intermediate]

  Dangerous Options:
    Caution: use these options at your own risk.  It is believed that some
    of them bite.

    -g                  Group option.
@end example

좀 더 완전한 예는 둘 이상의 그룹을 수반할 수 있습니다: 여전히 이전 예를 확장합니다:

@example
group = OptionGroup(parser, "Dangerous Options",
                    "Caution: use these options at your own risk.  "
                    "It is believed that some of them bite.")
group.add_option("-g", action="store_true", help="Group option.")
parser.add_option_group(group)

group = OptionGroup(parser, "Debug Options")
group.add_option("-d", "--debug", action="store_true",
                 help="Print debug information")
group.add_option("-s", "--sql", action="store_true",
                 help="Print all SQL statements executed")
group.add_option("-e", action="store_true", help="Print every action done")
parser.add_option_group(group)
@end example

다음과 같은 출력을 줍니다:

@example
Usage: <yourscript> [options] arg1 arg2

Options:
  -h, --help            show this help message and exit
  -v, --verbose         make lots of noise [default]
  -q, --quiet           be vewwy quiet (I'm hunting wabbits)
  -f FILE, --filename=FILE
                        write output to FILE
  -m MODE, --mode=MODE  interaction mode: novice, intermediate, or expert
                        [default: intermediate]

  Dangerous Options:
    Caution: use these options at your own risk.  It is believed that some
    of them bite.

    -g                  Group option.

  Debug Options:
    -d, --debug         Print debug information
    -s, --sql           Print all SQL statements executed
    -e                  Print every action done
@end example

특히 옵션 그룹을 프로그래밍 방식으로 작업할 때, 또 다른 흥미로운 메서드는 다음과 같습니다:

@geindex get_option_group() (optparse.OptionParser 메서드)
@anchor{library/optparse optparse OptionParser get_option_group}@anchor{342d}
@deffn {메서드} OptionParser.get_option_group (opt_str)

짧거나 긴 옵션 문자열 `opt_str'(예를 들어 @code{'-o'}나 @code{'--option'})이 속한 @ref{342c,,OptionGroup}을 반환합니다. 그러한 @code{OptionGroup}이 없으면, @code{None}을 반환합니다.
@end deffn

@node 버전 문자열 인쇄하기,How optparse handles errors,도움말 생성하기,자습서
@anchor{library/optparse optparse-printing-version-string}@anchor{342e}@anchor{library/optparse printing-a-version-string}@anchor{342f}
@subsubsection 버전 문자열 인쇄하기


Similar to the brief usage string, @code{optparse} can also print a version
string for your program.  You have to supply the string as the @code{version}
argument to OptionParser:

@example
parser = OptionParser(usage="%prog [-f] [-q]", version="%prog 1.0")
@end example

@code{%prog} is expanded just like it is in @code{usage}.  Apart from that,
@code{version} can contain anything you like.  When you supply it, @code{optparse}
automatically adds a @code{--version} option to your parser. If it encounters
this option on the command line, it expands your @code{version} string (by
replacing @code{%prog}), prints it to stdout, and exits.

예를 들어, 스크립트가 @code{/usr/bin/foo}로 호출되면:

@example
$ /usr/bin/foo --version
foo 1.0
@end example

다음 두 가지 메서드를 사용하여 @code{version} 문자열을 인쇄하고 가져올 수 있습니다:

@geindex print_version() (optparse.OptionParser 메서드)
@anchor{library/optparse optparse OptionParser print_version}@anchor{3430}
@deffn {메서드} OptionParser.print_version (file=None)

현재 프로그램의 버전 메시지(@code{self.version})를 `file'(기본값은 표준 출력)로 인쇄합니다. @ref{3431,,print_usage()}와 마찬가지로, @code{self.version}에 등장하는 @code{%prog}는 현재 프로그램의 이름으로 대체됩니다. @code{self.version}이 비어 있거나 정의되지 않았으면 아무 작업도 수행하지 않습니다.
@end deffn

@geindex get_version() (optparse.OptionParser 메서드)
@anchor{library/optparse optparse OptionParser get_version}@anchor{3432}
@deffn {메서드} OptionParser.get_version ()

@ref{3430,,print_version()}과 같지만 인쇄하는 대신 버전 문자열을 반환합니다.
@end deffn

@node How optparse handles errors,모두 합치기,버전 문자열 인쇄하기,자습서
@anchor{library/optparse how-optparse-handles-errors}@anchor{3433}@anchor{library/optparse optparse-how-optparse-handles-errors}@anchor{3434}
@subsubsection How @code{optparse} handles errors


There are two broad classes of errors that @code{optparse} has to worry about:
programmer errors and user errors.  Programmer errors are usually erroneous
calls to @ref{3403,,OptionParser.add_option()}, e.g. invalid option strings, unknown
option attributes, missing option attributes, etc.  These are dealt with in the
usual way: raise an exception (either @ref{3406,,optparse.OptionError} or
@ref{198,,TypeError}) and let the program crash.

Handling user errors is much more important, since they are guaranteed to happen
no matter how stable your code is.  @code{optparse} can automatically detect
some user errors, such as bad option arguments (passing @code{-n 4x} where
@code{-n} takes an integer argument), missing arguments (@code{-n} at the end
of the command line, where @code{-n} takes an argument of any type).  Also,
you can call @code{OptionParser.error()} to signal an application-defined error
condition:

@example
(options, args) = parser.parse_args()
...
if options.a and options.b:
    parser.error("options -a and -b are mutually exclusive")
@end example

In either case, @code{optparse} handles the error the same way: it prints the
program’s usage message and an error message to standard error and exits with
error status 2.

사용자가 정수를 취하는 옵션에 @code{4x}를 전달하는 위의 첫 번째 예를 고려하십시오:

@example
$ /usr/bin/foo -n 4x
Usage: foo [options]

foo: error: option -n: invalid integer value: '4x'
@end example

또는 사용자가 값을 전혀 전달하지 못하는 경우:

@example
$ /usr/bin/foo -n
Usage: foo [options]

foo: error: -n option requires an argument
@end example

@code{optparse}-generated error messages take care always to mention the
option involved in the error; be sure to do the same when calling
@code{OptionParser.error()} from your application code.

If @code{optparse}’s default error-handling behaviour does not suit your needs,
you’ll need to subclass OptionParser and override its @code{exit()}
and/or @code{error()} methods.

@node 모두 합치기,,How optparse handles errors,자습서
@anchor{library/optparse optparse-putting-it-all-together}@anchor{3435}@anchor{library/optparse putting-it-all-together}@anchor{3436}
@subsubsection 모두 합치기


Here’s what @code{optparse}-based scripts usually look like:

@example
from optparse import OptionParser
...
def main():
    usage = "usage: %prog [options] arg"
    parser = OptionParser(usage)
    parser.add_option("-f", "--file", dest="filename",
                      help="read data from FILENAME")
    parser.add_option("-v", "--verbose",
                      action="store_true", dest="verbose")
    parser.add_option("-q", "--quiet",
                      action="store_false", dest="verbose")
    ...
    (options, args) = parser.parse_args()
    if len(args) != 1:
        parser.error("incorrect number of arguments")
    if options.verbose:
        print("reading %s..." % options.filename)
    ...

if __name__ == "__main__":
    main()
@end example

@node 레퍼런스 지침서,옵션 콜백,자습서,optparse — 명령 줄 옵션용 구문 분석기
@anchor{library/optparse optparse-reference-guide}@anchor{3425}@anchor{library/optparse reference-guide}@anchor{3437}
@subsubsection 레퍼런스 지침서


@menu
* 구문 분석기 만들기:: 
* 구문 분석기 채우기:: 
* 옵션 정의하기:: 
* 옵션 어트리뷰트:: 
* 표준 옵션 액션:: 
* 표준 옵션 형:: 
* 인자 구문 분석하기:: 
* 옵션 구문 분석기를 조회하고 조작하기:: 
* 옵션 간의 충돌:: 
* 정리:: 
* 기타 메서드:: 

@end menu

@node 구문 분석기 만들기,구문 분석기 채우기,,레퍼런스 지침서
@anchor{library/optparse creating-the-parser}@anchor{3438}@anchor{library/optparse optparse-creating-parser}@anchor{3439}
@subsubsection 구문 분석기 만들기


The first step in using @code{optparse} is to create an OptionParser instance.

@geindex OptionParser (optparse 클래스)
@anchor{library/optparse optparse OptionParser}@anchor{16d2}
@deffn {클래스} optparse.OptionParser (...)

OptionParser 생성자에는 필수 인자가 없지만, 여러 선택적 키워드 인자가 있습니다. 이들을 항상 키워드 인자로 전달해야 합니다, 즉, 인자가 선언된 순서에 의존하지 마십시오.


@table @asis

@item @code{usage} (기본값: @code{"%prog [options]"})

The usage summary to print when your program is run incorrectly or with a
help option.  When @code{optparse} prints the usage string, it expands
@code{%prog} to @code{os.path.basename(sys.argv[0])} (or to @code{prog} if you
passed that keyword argument).  To suppress a usage message, pass the
special value @code{optparse.SUPPRESS_USAGE}.

@item @code{option_list} (기본값: @code{[]})

구문 분석기를 채울 Option 객체 리스트. @code{option_list}의 옵션은 @code{standard_option_list}(OptionParser 서브 클래스에서 설정할 수 있는 클래스 어트리뷰트)의 모든 옵션 뒤에 추가되지만, 모든 버전(version) 또는 도움말(help) 옵션 앞에 추가됩니다. 폐지되었습니다; 대신 구문 분석기를 만든 후 @ref{3403,,add_option()}을 사용하십시오.

@item @code{option_class} (기본값: optparse.Option)

@ref{3403,,add_option()}에서 구문 분석기에 옵션을 추가할 때 사용할 클래스.

@item @code{version} (기본값: @code{None})

A version string to print when the user supplies a version option. If you
supply a true value for @code{version}, @code{optparse} automatically adds a
version option with the single option string @code{--version}.  The
substring @code{%prog} is expanded the same as for @code{usage}.

@item @code{conflict_handler} (기본값: @code{"error"})

충돌하는 옵션 문자열이 있는 옵션이 구문 분석기에 추가될 때 수행 할 작업을 지정합니다; 섹션 @ref{343a,,옵션 간의 충돌}을 참조하십시오.

@item @code{description} (기본값: @code{None})

A paragraph of text giving a brief overview of your program.
@code{optparse} reformats this paragraph to fit the current terminal width
and prints it when the user requests help (after @code{usage}, but before the
list of options).

@item @code{formatter} (기본값: 새 @code{IndentedHelpFormatter})

An instance of optparse.HelpFormatter that will be used for printing help
text.  @code{optparse} provides two concrete classes for this purpose:
IndentedHelpFormatter and TitledHelpFormatter.

@item @code{add_help_option} (기본값: @code{True})

If true, @code{optparse} will add a help option (with option strings @code{-h}
and @code{--help}) to the parser.

@item @code{prog}

@code{usage}와 @code{version}에서 @code{%prog}를 확장할 때 @code{os.path.basename(sys.argv[0])} 대신 사용할 문자열.

@item @code{epilog} (기본값: @code{None})

옵션 도움말 다음에 인쇄할 도움말 텍스트 단락.
@end table
@end deffn

@node 구문 분석기 채우기,옵션 정의하기,구문 분석기 만들기,레퍼런스 지침서
@anchor{library/optparse optparse-populating-parser}@anchor{343b}@anchor{library/optparse populating-the-parser}@anchor{343c}
@subsubsection 구문 분석기 채우기


구문 분석기를 옵션으로 채우는 방법에는 여러 가지가 있습니다. 선호되는 방법은 섹션 @ref{3415,,자습서}에 표시된 대로, @ref{3403,,OptionParser.add_option()}을 사용하는 것입니다. @code{add_option()}은 다음 두 가지 방법의 하나로 호출 할 수 있습니다:


@itemize *

@item 
(@code{make_option()}에서 반환되는 것과 같은) Option 인스턴스를 전달합니다

@item 
@code{make_option()}(즉, Option 생성자)에 허용되는 위치와 키워드 인자의 조합을 전달합니다, 그러면 Option 인스턴스를 만듭니다
@end itemize

다른 대안은 다음과 같이 미리 생성된 Option 인스턴스 리스트를 OptionParser 생성자에 전달하는 것입니다:

@example
option_list = [
    make_option("-f", "--filename",
                action="store", type="string", dest="filename"),
    make_option("-q", "--quiet",
                action="store_false", dest="verbose"),
    ]
parser = OptionParser(option_list=option_list)
@end example

(@code{make_option()} is a factory function for creating Option instances;
currently it is an alias for the Option constructor.  A future version of
@code{optparse} may split Option into several classes, and @code{make_option()}
will pick the right class to instantiate.  Do not instantiate Option directly.)

@node 옵션 정의하기,옵션 어트리뷰트,구문 분석기 채우기,레퍼런스 지침서
@anchor{library/optparse defining-options}@anchor{343d}@anchor{library/optparse optparse-defining-options}@anchor{343e}
@subsubsection 옵션 정의하기


각 Option 인스턴스는 동의어 명령 줄 옵션 문자열 집합을 나타냅니다, 예를 들어 @code{-f}와 @code{--file}. 짧거나 긴 옵션 문자열을 얼마든지 지정할 수 있지만, 전체적으로 옵션 문자열을 적어도 하나 지정해야 합니다.

@ref{343f,,Option} 인스턴스를 만드는 규범적 방법은 @ref{16d2,,OptionParser}의 @code{add_option()} 메서드를 사용하는 것입니다.

@geindex add_option() (optparse.OptionParser 메서드)
@anchor{library/optparse optparse OptionParser add_option}@anchor{3403}
@deffn {메서드} OptionParser.add_option (option)

@deffnx {메서드} OptionParser.add_option (*opt_str, attr=value, ...)

짧은 옵션 문자열로만 옵션을 정의하려면:

@example
parser.add_option("-f", attr=value, ...)
@end example

그리고 긴 옵션 문자열로만 옵션을 정의하려면:

@example
parser.add_option("--foo", attr=value, ...)
@end example

The keyword arguments define attributes of the new Option object.  The most
important option attribute is @ref{3417,,action}, and it largely
determines which other attributes are relevant or required.  If you pass
irrelevant option attributes, or fail to pass required ones, @code{optparse}
raises an @ref{3406,,OptionError} exception explaining your mistake.

An option’s `action' determines what @code{optparse} does when it encounters
this option on the command-line.  The standard option actions hard-coded into
@code{optparse} are:


@table @asis

@item @code{"store"}

이 옵션의 인자를 저장합니다 (기본값)

@item @code{"store_const"}

store a constant value, pre-set via @ref{3424,,Option.const}

@item @code{"store_true"}

@code{True}를 저장합니다

@item @code{"store_false"}

@code{False}를 저장합니다

@item @code{"append"}

이 옵션의 인자를 리스트에 추가합니다

@item @code{"append_const"}

리스트에 상숫값을 추가합니다, @ref{3424,,Option.const}로 사전 설정

@item @code{"count"}

카운터를 1씩 증가시킵니다

@item @code{"callback"}

지정된 함수를 호출합니다

@item @code{"help"}

모든 옵션과 해당 설명을 포함하는 사용법 메시지를 인쇄합니다
@end table

(액션을 제공하지 않으면, 기본값은 @code{"store"}입니다. 이 액션의 경우, @ref{3418,,type}과 @ref{3419,,dest} 옵션 어트리뷰트도 제공할 수 있습니다; @ref{3440,,표준 옵션 액션}을 참조하십시오.)
@end deffn

As you can see, most actions involve storing or updating a value somewhere.
@code{optparse} always creates a special object for this, conventionally called
@code{options}, which is an instance of @ref{3405,,optparse.Values}.

@geindex Values (optparse 클래스)
@anchor{library/optparse optparse Values}@anchor{3405}
@deffn {클래스} optparse.Values

An object holding parsed argument names and values as attributes.
Normally created by calling when calling @ref{16d3,,OptionParser.parse_args()},
and can be overridden by a custom subclass passed to the `values' argument of
@code{OptionParser.parse_args()} (as described in @ref{3441,,인자 구문 분석하기}).
@end deffn

옵션 인자(및 기타 다양한 값)는 @ref{3419,,dest} (destination) 옵션 어트리뷰트에 따라, 이 객체의 어트리뷰트로 저장됩니다.

예를 들어, 다음과 같이 호출할 때

@example
parser.parse_args()
@end example

one of the first things @code{optparse} does is create the @code{options} object:

@example
options = Values()
@end example

이 구문 분석기의 옵션 중 하나가 다음과 같이 정의되었으면:

@example
parser.add_option("-f", "--file", action="store", type="string", dest="filename")
@end example

그리고 구문 분석 중인 명령 줄에는 다음 중 하나가 포함되면:

@example
-ffoo
-f foo
--file=foo
--file foo
@end example

then @code{optparse}, on seeing this option, will do the equivalent of

@example
options.filename = "foo"
@end example

@ref{3418,,type}과 @ref{3419,,dest} 옵션 어트리뷰트는 @ref{3417,,action}만큼 중요하지만, @code{action}은 `모든' 옵션에 적합한 유일한 어트리뷰트입니다.

@node 옵션 어트리뷰트,표준 옵션 액션,옵션 정의하기,레퍼런스 지침서
@anchor{library/optparse option-attributes}@anchor{3442}@anchor{library/optparse optparse-option-attributes}@anchor{3443}
@subsubsection 옵션 어트리뷰트


@geindex Option (optparse 클래스)
@anchor{library/optparse optparse Option}@anchor{343f}
@deffn {클래스} optparse.Option

A single command line argument,
with various attributes passed by keyword to the constructor.
Normally created with @ref{3403,,OptionParser.add_option()} rather than directly,
and can be overridden by a custom class via the `option_class' argument
to @ref{16d2,,OptionParser}.
@end deffn

The following option attributes may be passed as keyword arguments to
@ref{3403,,OptionParser.add_option()}.  If you pass an option attribute that is not
relevant to a particular option, or fail to pass a required option attribute,
@code{optparse} raises @ref{3406,,OptionError}.

@geindex action (optparse.Option의 속성)
@anchor{library/optparse optparse Option action}@anchor{3417}
@deffn {속성} Option.action

(기본값: @code{"store"})

Determines @code{optparse}’s behaviour when this option is seen on the
command line; the available options are documented @ref{3440,,here}.
@end deffn

@geindex type (optparse.Option의 속성)
@anchor{library/optparse optparse Option type}@anchor{3418}
@deffn {속성} Option.type

(기본값: @code{"string"})

이 옵션이 기대하는 인자 형 (예를 들어, @code{"string"}이나 @code{"int"}); 사용 가능한 옵션 형은 @ref{3444,,여기}에 설명되어 있습니다.
@end deffn

@geindex dest (optparse.Option의 속성)
@anchor{library/optparse optparse Option dest}@anchor{3419}
@deffn {속성} Option.dest

(기본값: 옵션 문자열에서 파생됩니다)

If the option’s action implies writing or modifying a value somewhere, this
tells @code{optparse} where to write it: @code{dest} names an
attribute of the @code{options} object that @code{optparse} builds as it parses
the command line.
@end deffn

@geindex default (optparse.Option의 속성)
@anchor{library/optparse optparse Option default}@anchor{3445}
@deffn {속성} Option.default

옵션이 명령 줄에서 보이지 않으면 이 옵션의 대상에 사용할 값. @ref{3446,,OptionParser.set_defaults()}도 참조하십시오.
@end deffn

@geindex nargs (optparse.Option의 속성)
@anchor{library/optparse optparse Option nargs}@anchor{3447}
@deffn {속성} Option.nargs

(기본값: 1)

How many arguments of type @ref{3418,,type} should be consumed when this
option is seen.  If > 1, @code{optparse} will store a tuple of values to
@ref{3419,,dest}.
@end deffn

@geindex const (optparse.Option의 속성)
@anchor{library/optparse optparse Option const}@anchor{3424}
@deffn {속성} Option.const

상숫값을 저장하는 액션의 경우, 저장할 상숫값.
@end deffn

@geindex choices (optparse.Option의 속성)
@anchor{library/optparse optparse Option choices}@anchor{3448}
@deffn {속성} Option.choices

@code{"choice"} 형 옵션의 경우, 사용자가 이 중에서 선택할 수 있는 문자열 리스트.
@end deffn

@geindex callback (optparse.Option의 속성)
@anchor{library/optparse optparse Option callback}@anchor{3449}
@deffn {속성} Option.callback

액션 @code{"callback"}이 있는 옵션의 경우, 이 옵션이 보일 때 호출 할 콜러블. 콜러블에 전달된 인자에 대한 자세한 내용은 섹션 @ref{3426,,옵션 콜백}을 참조하십시오.
@end deffn

@geindex callback_args (optparse.Option의 속성)
@geindex callback_kwargs (optparse.Option의 속성)
@anchor{library/optparse optparse Option callback_args}@anchor{344a}
@deffn {속성} Option.callback_args
@anchor{library/optparse optparse Option callback_kwargs}@anchor{344b}
@deffnx {속성} Option.callback_kwargs

4개의 표준 콜백 인자 다음에 @code{callback}에 전달할 추가 위치와 키워드 인자.
@end deffn

@geindex help (optparse.Option의 속성)
@anchor{library/optparse optparse Option help}@anchor{341a}
@deffn {속성} Option.help

사용자가 @ref{341a,,help} 옵션을 제공한 (가령 @code{--help}) 후 사용 가능한 모든 옵션을 나열할 때 이 옵션에 대해 인쇄할 도움말 텍스트. 도움말 텍스트가 제공되지 않으면, 옵션이 도움말 텍스트 없이 나열됩니다. 이 옵션을 숨기려면, 특수 값 @code{optparse.SUPPRESS_HELP}를 사용하십시오.
@end deffn

@geindex metavar (optparse.Option의 속성)
@anchor{library/optparse optparse Option metavar}@anchor{344c}
@deffn {속성} Option.metavar

(기본값: 옵션 문자열에서 파생됩니다)

도움말 텍스트를 인쇄할 때 사용할 옵션 인자를 나타냅니다. 예제는 섹션 @ref{3415,,자습서}를 참조하십시오.
@end deffn

@node 표준 옵션 액션,표준 옵션 형,옵션 어트리뷰트,레퍼런스 지침서
@anchor{library/optparse optparse-standard-option-actions}@anchor{3440}@anchor{library/optparse standard-option-actions}@anchor{344d}
@subsubsection 표준 옵션 액션


The various option actions all have slightly different requirements and effects.
Most actions have several relevant option attributes which you may specify to
guide @code{optparse}’s behaviour; a few have required attributes, which you
must specify for any option using that action.


@itemize *

@item 
@code{"store"} [연관된 옵션: @ref{3418,,type}, @ref{3419,,dest}, @ref{3447,,nargs}, @ref{3448,,choices}]

옵션 뒤에 인자가 와야 하며, 인자는 @ref{3418,,type}에 따라 값으로 변환되고, @ref{3419,,dest}에 저장됩니다. @ref{3447,,nargs} > 1 이면, 명령 줄에서 여러 인자가 소비됩니다; 모두 @code{type}에 따라 변환되고 @code{dest}에 튜플로 저장됩니다. @ref{3444,,표준 옵션 형} 섹션을 참조하십시오.

@ref{3448,,choices}가 제공되면 (문자열 리스트나 튜플), 형의 기본값은 @code{"choice"}입니다.

@ref{3418,,type}이 제공되지 않으면, 기본값은 @code{"string"}입니다.

If @ref{3419,,dest} is not supplied, @code{optparse} derives a destination
from the first long option string (e.g., @code{--foo-bar} implies
@code{foo_bar}). If there are no long option strings, @code{optparse} derives a
destination from the first short option string (e.g., @code{-f} implies @code{f}).

예:

@example
parser.add_option("-f")
parser.add_option("-p", type="float", nargs=3, dest="point")
@end example

다음과 같은 명령 줄을 구문 분석할 때

@example
-f foo.txt -p 1 -3.5 4 -fbar.txt
@end example

@code{optparse} will set

@example
options.f = "foo.txt"
options.point = (1.0, -3.5, 4.0)
options.f = "bar.txt"
@end example

@item 
@code{"store_const"} [필수 옵션: @ref{3424,,const}; 연관된 옵션: @ref{3419,,dest}]

값 @ref{3424,,const}는 @ref{3419,,dest}에 저장됩니다.

예:

@example
parser.add_option("-q", "--quiet",
                  action="store_const", const=0, dest="verbose")
parser.add_option("-v", "--verbose",
                  action="store_const", const=1, dest="verbose")
parser.add_option("--noisy",
                  action="store_const", const=2, dest="verbose")
@end example

If @code{--noisy} is seen, @code{optparse} will set

@example
options.verbose = 2
@end example

@item 
@code{"store_true"} [연관된 옵션: @ref{3419,,dest}]

@code{True}를 @ref{3419,,dest}에 저장하는 @code{"store_const"}의 특별한 경우.

@item 
@code{"store_false"} [연관된 옵션: @ref{3419,,dest}]

@code{"store_true"}와 비슷하지만, @code{False}를 저장합니다.

예:

@example
parser.add_option("--clobber", action="store_true", dest="clobber")
parser.add_option("--no-clobber", action="store_false", dest="clobber")
@end example

@item 
@code{"append"} [연관된 옵션: @ref{3418,,type}, @ref{3419,,dest}, @ref{3447,,nargs}, @ref{3448,,choices}]

The option must be followed by an argument, which is appended to the list in
@ref{3419,,dest}.  If no default value for @code{dest} is
supplied, an empty list is automatically created when @code{optparse} first
encounters this option on the command-line.  If @ref{3447,,nargs} > 1,
multiple arguments are consumed, and a tuple of length @code{nargs}
is appended to @code{dest}.

@ref{3418,,type}과 @ref{3419,,dest}의 기본값은 @code{"store"} 액션의 경우와 같습니다.

예:

@example
parser.add_option("-t", "--tracks", action="append", type="int")
@end example

If @code{-t3} is seen on the command-line, @code{optparse} does the equivalent
of:

@example
options.tracks = []
options.tracks.append(int("3"))
@end example

잠시 후, @code{--tracks=4}가 보이면, 다음을 수행합니다:

@example
options.tracks.append(int("4"))
@end example

@code{append} 액션은 옵션의 현재 값에 대해 @code{append} 메서드를 호출합니다. 이는 지정된 모든 기본값에 @code{append} 메서드가 있어야 함을 의미합니다. 또한, 기본값이 비어 있지 않으면, 기본 요소가 옵션의 구문 분석된 값에 존재하며, 명령 줄의 모든 값이 기본값 뒤에 추가됨을 의미합니다:

@example
>>> parser.add_option("--files", action="append", default=['~/.mypkg/defaults'])
>>> opts, args = parser.parse_args(['--files', 'overrides.mypkg'])
>>> opts.files
['~/.mypkg/defaults', 'overrides.mypkg']
@end example

@item 
@code{"append_const"} [필수 옵션: @ref{3424,,const}; 연관된 옵션: @ref{3419,,dest}]

@code{"store_const"}와 비슷하지만, @ref{3424,,const} 값이 @ref{3419,,dest}에 추가됩니다; @code{"append"}와 마찬가지로, @code{dest}의 기본값은 @code{None}이며, 옵션이 처음 발견될 때 빈 리스트가 자동으로 만들어집니다.

@item 
@code{"count"} [연관된 옵션: @ref{3419,,dest}]

@ref{3419,,dest}에 저장된 정수를 증가시킵니다. 기본값이 제공되지 않으면, @code{dest}는 처음으로 증가하기 전에 0으로 설정됩니다.

예:

@example
parser.add_option("-v", action="count", dest="verbosity")
@end example

The first time @code{-v} is seen on the command line, @code{optparse} does the
equivalent of:

@example
options.verbosity = 0
options.verbosity += 1
@end example

이후에 @code{-v}가 나타날 때마다 다음과 같이 합니다

@example
options.verbosity += 1
@end example

@item 
@code{"callback"} [필수 옵션: @ref{3449,,callback}; 연관된 옵션: @ref{3418,,type}, @ref{3447,,nargs}, @ref{344a,,callback_args}, @ref{344b,,callback_kwargs}]

@ref{3449,,callback}으로 지정된 함수를 호출합니다, 이 함수는 다음과 같이 호출됩니다

@example
func(option, opt_str, value, parser, *args, **kwargs)
@end example

자세한 내용은 섹션 @ref{3426,,옵션 콜백}을 참조하십시오.

@item 
@code{"help"}

현재 옵션 구문 분석기의 모든 옵션에 대한 전체 도움말 메시지를 인쇄합니다. 도움말 메시지는 OptionParser의 생성자에 전달된 @code{usage} 문자열과 모든 옵션에 전달된 @ref{341a,,help} 문자열로 구성됩니다.

옵션에 @ref{341a,,help} 문자열이 제공되지 않아도, 도움말 메시지에 나열됩니다. 옵션을 완전히 생략하려면, 특수 값 @code{optparse.SUPPRESS_HELP}를 사용하십시오.

@code{optparse} automatically adds a @ref{341a,,help} option to all
OptionParsers, so you do not normally need to create one.

예:

@example
from optparse import OptionParser, SUPPRESS_HELP

# 일반적으로, 도움말 옵션은 자동으로 추가되지만, add_help_option 인자를
# 사용하여 억제할 수 있습니다
parser = OptionParser(add_help_option=False)

parser.add_option("-h", "--help", action="help")
parser.add_option("-v", action="store_true", dest="verbose",
                  help="Be moderately verbose")
parser.add_option("--file", dest="filename",
                  help="Input file to read data from")
parser.add_option("--secret", help=SUPPRESS_HELP)
@end example

If @code{optparse} sees either @code{-h} or @code{--help} on the command line,
it will print something like the following help message to stdout (assuming
@code{sys.argv[0]} is @code{"foo.py"}):

@example
Usage: foo.py [options]

Options:
  -h, --help        Show this help message and exit
  -v                Be moderately verbose
  --file=FILENAME   Input file to read data from
@end example

After printing the help message, @code{optparse} terminates your process with
@code{sys.exit(0)}.

@item 
@code{"version"}

Prints the version number supplied to the OptionParser to stdout and exits.
The version number is actually formatted and printed by the
@code{print_version()} method of OptionParser.  Generally only relevant if the
@code{version} argument is supplied to the OptionParser constructor.  As with
@ref{341a,,help} options, you will rarely create @code{version} options,
since @code{optparse} automatically adds them when needed.
@end itemize

@node 표준 옵션 형,인자 구문 분석하기,표준 옵션 액션,레퍼런스 지침서
@anchor{library/optparse optparse-standard-option-types}@anchor{3444}@anchor{library/optparse standard-option-types}@anchor{344e}
@subsubsection 표준 옵션 형


@code{optparse} has five built-in option types: @code{"string"}, @code{"int"},
@code{"choice"}, @code{"float"} and @code{"complex"}.  If you need to add new
option types, see section @ref{341d,,Extending optparse}.

문자열 옵션에 대한 인자는 어떤 방식으로도 검사되거나 변환되지 않습니다: 명령 줄의 텍스트는 있는 그대로 대상에 저장(또는 콜백에 전달)됩니다.

정수 인자(@code{"int"} 형)는 다음과 같이 구문 분석됩니다:


@itemize *

@item 
숫자가 @code{0x}로 시작하면, 16진수로 구문 분석됩니다

@item 
숫자가 @code{0}으로 시작하면, 8진수로 구문 분석됩니다

@item 
숫자가 @code{0b}로 시작하면, 이진수로 구문 분석됩니다

@item 
그렇지 않으면, 숫자는 10진수로 구문 분석됩니다
@end itemize

The conversion is done by calling @ref{19b,,int()} with the appropriate base (2, 8,
10, or 16).  If this fails, so will @code{optparse}, although with a more useful
error message.

@code{"float"}와 @code{"complex"} 옵션 인자는 유사한 에러 처리로 @ref{196,,float()}와 @ref{197,,complex()}로 직접 변환됩니다.

@code{"choice"} 옵션은 @code{"string"} 옵션의 서브 형입니다. @ref{3448,,choices} 옵션 어트리뷰트(문자열 시퀀스)는 허용되는 옵션 인자 집합을 정의합니다. @code{optparse.check_choice()}는 사용자가 제공한 옵션 인자를 이 마스터 리스트와 비교하고 유효하지 않은 문자열이 주어지면 @ref{3407,,OptionValueError} 를 발생시킵니다.

@node 인자 구문 분석하기,옵션 구문 분석기를 조회하고 조작하기,표준 옵션 형,레퍼런스 지침서
@anchor{library/optparse optparse-parsing-arguments}@anchor{3441}@anchor{library/optparse parsing-arguments}@anchor{344f}
@subsubsection 인자 구문 분석하기


OptionParser를 만들고 채우는 것의 요점은 @ref{16d3,,parse_args()} 메서드를 호출하는 것입니다.

@geindex parse_args() (optparse.OptionParser 메서드)
@anchor{library/optparse optparse OptionParser parse_args}@anchor{16d3}
@deffn {메서드} OptionParser.parse_args (args=None, values=None)

Parse the command-line options found in `args'.

입력 매개 변수는


@table @asis

@item @code{args}

처리할 인자의 리스트 (기본값: @code{sys.argv[1:]})

@item @code{values}

옵션 인자를 저장할 @ref{3405,,Values} 객체 (기본값: @code{Values}의 새 인스턴스) – 기존 객체를 제공하면, 옵션 기본값이 초기화되지 않습니다.
@end table

그리고 반환 값은 쌍 @code{(options, args)}이고


@table @asis

@item @code{options}

the same object that was passed in as `values', or the @code{optparse.Values}
instance created by @code{optparse}

@item @code{args}

모든 옵션이 처리된 후 남은 위치 인자
@end table
@end deffn

가장 일반적인 사용법은 두 키워드 인자 중 어느 것도 제공하지 않는 것입니다. @code{values}를 제공하면, 반복된 @ref{25be,,setattr()} 호출(옵션 대상에 저장된 모든 옵션 인자에 대해 대략 하나씩)로 수정되고, @ref{16d3,,parse_args()}에서 반환됩니다.

@ref{16d3,,parse_args()}가 인자 리스트에서 에러를 만나면, 적절한 최종 사용자 에러 메시지와 함께 OptionParser의 @code{error()} 메서드를 호출합니다. 이는 궁극적으로 종료 상태 2(명령 줄 에러에 대한 전통적인 유닉스 종료 상태)로 프로세스를 종료합니다.

@node 옵션 구문 분석기를 조회하고 조작하기,옵션 간의 충돌,인자 구문 분석하기,레퍼런스 지침서
@anchor{library/optparse optparse-querying-manipulating-option-parser}@anchor{3450}@anchor{library/optparse querying-and-manipulating-your-option-parser}@anchor{3451}
@subsubsection 옵션 구문 분석기를 조회하고 조작하기


옵션 구문 분석기의 기본 동작은 약간 사용자 정의 할 수 있으며, 옵션 구문 분석기를 들여다보고 거기에 무엇이 있는지 볼 수도 있습니다. OptionParser는 다음과 같은 몇 가지 메서드를 제공합니다:

@geindex disable_interspersed_args() (optparse.OptionParser 메서드)
@anchor{library/optparse optparse OptionParser disable_interspersed_args}@anchor{3404}
@deffn {메서드} OptionParser.disable_interspersed_args ()

Set parsing to stop on the first non-option.  For example, if @code{-a} and
@code{-b} are both simple options that take no arguments, @code{optparse}
normally accepts this syntax:

@example
prog -a arg1 -b arg2
@end example

그리고 다음과 동등하게 취급합니다

@example
prog -a -b arg1 arg2
@end example

이 기능을 비활성화하려면, @ref{3404,,disable_interspersed_args()}를 호출하십시오. 이렇게 하면 옵션 구문 분석이 첫 번째 옵션이 아닌 인자에서 중지되는, 전통적인 유닉스 문법이 복원됩니다.

자체 옵션이 있는 다른 명령을 실행하는 명령 프로세서가 있고 이러한 옵션이 혼동되지 않도록 하려면 이것을 사용하십시오. 예를 들어, 각 명령에는 다른 옵션 집합이 있을 수 있습니다.
@end deffn

@geindex enable_interspersed_args() (optparse.OptionParser 메서드)
@anchor{library/optparse optparse OptionParser enable_interspersed_args}@anchor{3452}
@deffn {메서드} OptionParser.enable_interspersed_args ()

첫 번째 옵션이 아닌 것에서 구문 분석이 중지되지 않도록 설정하여, 명령 인자와 스위치를 분산시킬 수 있도록 합니다. 이것이 기본 동작입니다.
@end deffn

@geindex get_option() (optparse.OptionParser 메서드)
@anchor{library/optparse optparse OptionParser get_option}@anchor{3453}
@deffn {메서드} OptionParser.get_option (opt_str)

옵션 문자열 `opt_str'을 갖는 Option 인스턴스를 반환합니다, 또는 해당 옵션 문자열을 갖는 옵션이 없으면 @code{None}을 반환합니다.
@end deffn

@geindex has_option() (optparse.OptionParser 메서드)
@anchor{library/optparse optparse OptionParser has_option}@anchor{3454}
@deffn {메서드} OptionParser.has_option (opt_str)

OptionParser에 옵션 문자열 `opt_str'을 갖는 옵션이 있으면 @code{True}를 반환합니다 (예를 들어, @code{-q}나 @code{--verbose}).
@end deffn

@geindex remove_option() (optparse.OptionParser 메서드)
@anchor{library/optparse optparse OptionParser remove_option}@anchor{3455}
@deffn {메서드} OptionParser.remove_option (opt_str)

@ref{16d2,,OptionParser}에 `opt_str'에 해당하는 옵션이 있으면, 해당 옵션이 제거됩니다. 해당 옵션이 다른 옵션 문자열을 제공하면, 해당 옵션 문자열은 모두 유효하지 않게 됩니다. 이 @code{OptionParser}에 속하는 옵션에서 `opt_str'이 등장하지 않으면, @ref{2ec,,ValueError}를 발생시킵니다.
@end deffn

@node 옵션 간의 충돌,정리,옵션 구문 분석기를 조회하고 조작하기,레퍼런스 지침서
@anchor{library/optparse conflicts-between-options}@anchor{3456}@anchor{library/optparse optparse-conflicts-between-options}@anchor{343a}
@subsubsection 옵션 간의 충돌


주의하지 않으면, 충돌하는 옵션 문자열을 갖는 옵션을 정의하기 쉽습니다:

@example
parser.add_option("-n", "--dry-run", ...)
...
parser.add_option("-n", "--noisy", ...)
@end example

(일부 표준 옵션을 사용하여 자체 OptionParser 서브 클래스를 정의한 경우 특히 그렇습니다.)

Every time you add an option, @code{optparse} checks for conflicts with existing
options.  If it finds any, it invokes the current conflict-handling mechanism.
You can set the conflict-handling mechanism either in the constructor:

@example
parser = OptionParser(..., conflict_handler=handler)
@end example

또는 별도의 호출로 가능합니다:

@example
parser.set_conflict_handler(handler)
@end example

사용 가능한 충돌 처리기는 다음과 같습니다:

@quotation


@table @asis

@item @code{"error"} (기본값)

옵션 충돌이 프로그래밍 에러라고 가정하고 @ref{3457,,OptionConflictError} 를 발생시킵니다

@item @code{"resolve"}

옵션 충돌을 지능적으로 해결합니다 (아래를 참조하십시오)
@end table
@end quotation

예를 들어, 충돌을 지능적으로 해결하고 @ref{16d2,,OptionParser}를 정의하고 충돌하는 옵션을 추가해 보겠습니다:

@example
parser = OptionParser(conflict_handler="resolve")
parser.add_option("-n", "--dry-run", ..., help="do no harm")
parser.add_option("-n", "--noisy", ..., help="be noisy")
@end example

At this point, @code{optparse} detects that a previously added option is already
using the @code{-n} option string.  Since @code{conflict_handler} is @code{"resolve"},
it resolves the situation by removing @code{-n} from the earlier option’s list of
option strings.  Now @code{--dry-run} is the only way for the user to activate
that option.  If the user asks for help, the help message will reflect that:

@example
Options:
  --dry-run     do no harm
  ...
  -n, --noisy   be noisy
@end example

It’s possible to whittle away the option strings for a previously added option
until there are none left, and the user has no way of invoking that option from
the command-line.  In that case, @code{optparse} removes that option completely,
so it doesn’t show up in help text or anywhere else. Carrying on with our
existing OptionParser:

@example
parser.add_option("--dry-run", ..., help="new dry-run option")
@end example

At this point, the original @code{-n}/@code{--dry-run} option is no longer
accessible, so @code{optparse} removes it, leaving this help text:

@example
Options:
  ...
  -n, --noisy   be noisy
  --dry-run     new dry-run option
@end example

@node 정리,기타 메서드,옵션 간의 충돌,레퍼런스 지침서
@anchor{library/optparse cleanup}@anchor{3458}@anchor{library/optparse optparse-cleanup}@anchor{3459}
@subsubsection 정리


OptionParser 인스턴스에는 여러 순환 참조가 있습니다. 이것은 파이썬의 가비지 수거기에선 문제가 되지 않지만, 작업이 끝나면 OptionParser에서 @code{destroy()}를 호출하여 순환 참조를 명시적으로 끊을 수 있습니다. 이것은 OptionParser에서 큰 객체 그래프에 도달할 수 있는 장기 실행 응용 프로그램에서 특히 유용합니다.

@node 기타 메서드,,정리,레퍼런스 지침서
@anchor{library/optparse optparse-other-methods}@anchor{345a}@anchor{library/optparse other-methods}@anchor{345b}
@subsubsection 기타 메서드


OptionParser는 몇 가지 다른 공용 메서드를 지원합니다:

@geindex set_usage() (optparse.OptionParser 메서드)
@anchor{library/optparse optparse OptionParser set_usage}@anchor{345c}
@deffn {메서드} OptionParser.set_usage (usage)

@code{usage} 생성자 키워드 인자에 대해 위에서 설명한 규칙에 따라 사용법 문자열을 설정합니다. @code{None}을 전달하면 기본 사용법 문자열이 설정됩니다; 사용법 메시지를 억제하려면 @code{optparse.SUPPRESS_USAGE}를 사용하십시오.
@end deffn

@geindex print_usage() (optparse.OptionParser 메서드)
@anchor{library/optparse optparse OptionParser print_usage}@anchor{3431}
@deffn {메서드} OptionParser.print_usage (file=None)

현재 프로그램의 사용법 메시지(@code{self.usage})를 `file'(기본값 stdout)로 인쇄합니다. @code{self.usage}에 등장하는 문자열 @code{%prog}는 현재 프로그램의 이름으로 대체됩니다. @code{self.usage}가 비어 있거나 정의되지 않았으면 아무 작업도 수행하지 않습니다.
@end deffn

@geindex get_usage() (optparse.OptionParser 메서드)
@anchor{library/optparse optparse OptionParser get_usage}@anchor{345d}
@deffn {메서드} OptionParser.get_usage ()

@ref{3431,,print_usage()}와 같지만 인쇄하는 대신 사용법 문자열을 반환합니다.
@end deffn

@geindex set_defaults() (optparse.OptionParser 메서드)
@anchor{library/optparse optparse OptionParser set_defaults}@anchor{3446}
@deffn {메서드} OptionParser.set_defaults (dest=value, ...)

한 번에 여러 옵션 대상에 대한 기본값을 설정합니다. 여러 옵션이 같은 대상을 공유 할 수 있기 때문에, @ref{3446,,set_defaults()}를 사용하여 옵션의 기본값을 설정하는 것이 좋습니다. 예를 들어, 여러 “mode” 옵션이 모두 같은 대상을 설정하면, 그중 하나가 기본값을 설정할 수 있으며 마지막 옵션이 이깁니다:

@example
parser.add_option("--advanced", action="store_const",
                  dest="mode", const="advanced",
                  default="novice")    # 아래에서 재정의됩니다
parser.add_option("--novice", action="store_const",
                  dest="mode", const="novice",
                  default="advanced")  # 위의 설정을 재정의합니다
@end example

이러한 혼동을 피하려면, @ref{3446,,set_defaults()}를 사용하십시오:

@example
parser.set_defaults(mode="advanced")
parser.add_option("--advanced", action="store_const",
                  dest="mode", const="advanced")
parser.add_option("--novice", action="store_const",
                  dest="mode", const="novice")
@end example
@end deffn

@node 옵션 콜백,Extending optparse,레퍼런스 지침서,optparse — 명령 줄 옵션용 구문 분석기
@anchor{library/optparse option-callbacks}@anchor{345e}@anchor{library/optparse optparse-option-callbacks}@anchor{3426}
@subsubsection 옵션 콜백


When @code{optparse}’s built-in actions and types aren’t quite enough for your
needs, you have two choices: extend @code{optparse} or define a callback option.
Extending @code{optparse} is more general, but overkill for a lot of simple
cases.  Quite often a simple callback is all you need.

콜백 옵션을 정의하는 두 단계가 있습니다:


@itemize *

@item 
@code{"callback"} 액션을 사용하여 옵션 자체를 정의합니다

@item 
콜백을 작성합니다; 이것은 아래에 설명된 대로, 최소한 4개의 인자를 취하는 함수(또는 메서드)입니다
@end itemize

@menu
* 콜백 옵션 정의하기:: 
* 콜백이 호출되는 방법:: 
* 콜백에서 에러 발생시키기:: 
* 콜백 예제 1; 간단한 콜백: 콜백 예제 1 간단한 콜백. 
* 콜백 예제 2; 옵션 순서 확인: 콜백 예제 2 옵션 순서 확인. 
* 콜백 예제 3; 옵션 순서 확인 (일반화): 콜백 예제 3 옵션 순서 확인 일반화. 
* 콜백 예제 4; 임의 조건 확인: 콜백 예제 4 임의 조건 확인. 
* 콜백 예제 5; 고정 인자: 콜백 예제 5 고정 인자. 
* 콜백 예제 6; 가변 인자: 콜백 예제 6 가변 인자. 

@end menu

@node 콜백 옵션 정의하기,콜백이 호출되는 방법,,옵션 콜백
@anchor{library/optparse defining-a-callback-option}@anchor{345f}@anchor{library/optparse optparse-defining-callback-option}@anchor{3460}
@subsubsection 콜백 옵션 정의하기


항상 그렇듯이, 콜백 옵션을 정의하는 가장 쉬운 방법은 @ref{3403,,OptionParser.add_option()} 메서드를 사용하는 것입니다. @ref{3417,,action}과 별도로 지정해야 하는 유일한 옵션 어트리뷰트는 호출할 함수인 @code{callback}입니다:

@example
parser.add_option("-c", action="callback", callback=my_callback)
@end example

@code{callback} is a function (or other callable object), so you must have already
defined @code{my_callback()} when you create this callback option. In this simple
case, @code{optparse} doesn’t even know if @code{-c} takes any arguments,
which usually means that the option takes no arguments—the mere presence of
@code{-c} on the command-line is all it needs to know.  In some
circumstances, though, you might want your callback to consume an arbitrary
number of command-line arguments.  This is where writing callbacks gets tricky;
it’s covered later in this section.

@code{optparse} always passes four particular arguments to your callback, and it
will only pass additional arguments if you specify them via
@ref{344a,,callback_args} and @ref{344b,,callback_kwargs}.  Thus, the
minimal callback function signature is:

@example
def my_callback(option, opt, value, parser):
@end example

콜백에 대한 네 가지 인자가 아래에 설명되어 있습니다.

콜백 옵션을 정의할 때 제공할 수 있는 몇 가지 다른 옵션 어트리뷰트가 있습니다:


@table @asis

@item @ref{3418,,type}

has its usual meaning: as with the @code{"store"} or @code{"append"} actions, it
instructs @code{optparse} to consume one argument and convert it to
@ref{3418,,type}.  Rather than storing the converted value(s) anywhere,
though, @code{optparse} passes it to your callback function.

@item @ref{3447,,nargs}

also has its usual meaning: if it is supplied and > 1, @code{optparse} will
consume @ref{3447,,nargs} arguments, each of which must be convertible to
@ref{3418,,type}.  It then passes a tuple of converted values to your
callback.

@item @ref{344a,,callback_args}

콜백에 전달할 추가 위치 인자의 튜플

@item @ref{344b,,callback_kwargs}

콜백에 전달할 추가 키워드 인자의 딕셔너리
@end table

@node 콜백이 호출되는 방법,콜백에서 에러 발생시키기,콜백 옵션 정의하기,옵션 콜백
@anchor{library/optparse how-callbacks-are-called}@anchor{3461}@anchor{library/optparse optparse-how-callbacks-called}@anchor{3462}
@subsubsection 콜백이 호출되는 방법


모든 콜백은 다음과 같이 호출됩니다:

@example
func(option, opt_str, value, parser, *args, **kwargs)
@end example

여기서


@table @asis

@item @code{option}

콜백을 호출하는 Option 인스턴스입니다

@item @code{opt_str}

콜백을 트리거 하는 명령 줄에 나타나는 옵션 문자열입니다. (축약된 긴 옵션이 사용되면, @code{opt_str}은 완전한, 규범적인 옵션 문자열이 됩니다—예를 들어 사용자가 @code{--foobar}의 약어로 명령 줄에 @code{--foo}를 입력하면, @code{opt_str}은 @code{"--foobar"}가 됩니다.)

@item @code{value}

is the argument to this option seen on the command-line.  @code{optparse} will
only expect an argument if @ref{3418,,type} is set; the type of @code{value} will be
the type implied by the option’s type.  If @code{type} for this option is
@code{None} (no argument expected), then @code{value} will be @code{None}.  If @ref{3447,,nargs}
> 1, @code{value} will be a tuple of values of the appropriate type.

@item @code{parser}

모든 것을 구동하는 OptionParser 인스턴스입니다, 인스턴스 어트리뷰트를 통해 다른 흥미로운 데이터에 액세스 할 수 있어서 주로 유용합니다:


@table @asis

@item @code{parser.largs}

남은 인자의 현재 리스트, 즉, 소비되었지만 옵션이나 옵션 인자가 아닌 인자. 예를 들어 더 많은 인자를 추가하여, @code{parser.largs}를 자유롭게 수정하십시오. (이 리스트는 @ref{16d3,,parse_args()}의 두 번째 반환 값인 @code{args}가 됩니다.)

@item @code{parser.rargs}

나머지 인자의 현재 리스트, 즉, @code{opt_str}과 @code{value}(해당한다면)가 제거되고, 그 뒤에 오는 인자만 그대로 남아 있습니다. 예를 들어 더 많은 인자를 소비하여, @code{parser.rargs}를 자유롭게 수정하십시오.

@item @code{parser.values}

the object where option values are by default stored (an instance of
optparse.OptionValues).  This lets callbacks use the same mechanism as the
rest of @code{optparse} for storing option values; you don’t need to mess
around with globals or closures.  You can also access or modify the
value(s) of any options already encountered on the command-line.
@end table

@item @code{args}

@ref{344a,,callback_args} 옵션 어트리뷰트를 통해 제공되는 임의의 위치 인자의 튜플입니다.

@item @code{kwargs}

@ref{344b,,callback_kwargs}를 통해 제공된 임의의 키워드 인자의 딕셔너리입니다.
@end table

@node 콜백에서 에러 발생시키기,콜백 예제 1 간단한 콜백,콜백이 호출되는 방법,옵션 콜백
@anchor{library/optparse optparse-raising-errors-in-callback}@anchor{3463}@anchor{library/optparse raising-errors-in-a-callback}@anchor{3464}
@subsubsection 콜백에서 에러 발생시키기


The callback function should raise @ref{3407,,OptionValueError} if there are any
problems with the option or its argument(s).  @code{optparse} catches this and
terminates the program, printing the error message you supply to stderr.  Your
message should be clear, concise, accurate, and mention the option at fault.
Otherwise, the user will have a hard time figuring out what they did wrong.

@node 콜백 예제 1 간단한 콜백,콜백 예제 2 옵션 순서 확인,콜백에서 에러 발생시키기,옵션 콜백
@anchor{library/optparse callback-example-1-trivial-callback}@anchor{3465}@anchor{library/optparse optparse-callback-example-1}@anchor{3466}
@subsubsection 콜백 예제 1: 간단한 콜백


다음은 인자를 취하지 않고, 단순히 옵션이 발견되었음을 기록하는 콜백 옵션의 예입니다:

@example
def record_foo_seen(option, opt_str, value, parser):
    parser.values.saw_foo = True

parser.add_option("--foo", action="callback", callback=record_foo_seen)
@end example

물론 @code{"store_true"} 액션으로 그렇게 할 수 있습니다.

@node 콜백 예제 2 옵션 순서 확인,콜백 예제 3 옵션 순서 확인 일반화,콜백 예제 1 간단한 콜백,옵션 콜백
@anchor{library/optparse callback-example-2-check-option-order}@anchor{3467}@anchor{library/optparse optparse-callback-example-2}@anchor{3468}
@subsubsection 콜백 예제 2: 옵션 순서 확인


여기에 약간 더 흥미로운 예가 있습니다: @code{-a}가 발견되었다는 사실을 기록하지만, 명령 줄에서 @code{-b} 뒤에 오면 폭발합니다.

@example
def check_order(option, opt_str, value, parser):
    if parser.values.b:
        raise OptionValueError("can't use -a after -b")
    parser.values.a = 1
...
parser.add_option("-a", action="callback", callback=check_order)
parser.add_option("-b", action="store_true", dest="b")
@end example

@node 콜백 예제 3 옵션 순서 확인 일반화,콜백 예제 4 임의 조건 확인,콜백 예제 2 옵션 순서 확인,옵션 콜백
@anchor{library/optparse callback-example-3-check-option-order-generalized}@anchor{3469}@anchor{library/optparse optparse-callback-example-3}@anchor{346a}
@subsubsection 콜백 예제 3: 옵션 순서 확인 (일반화)


이 콜백을 몇 가지 유사한 옵션에 다시 사용하려면 (플래그를 설정하지만, @code{-b}가 이미 보였으면 폭발함), 약간의 작업이 필요합니다: 에러 메시지와 설정하는 플래그를 일반화해야 합니다.

@example
def check_order(option, opt_str, value, parser):
    if parser.values.b:
        raise OptionValueError("can't use %s after -b" % opt_str)
    setattr(parser.values, option.dest, 1)
...
parser.add_option("-a", action="callback", callback=check_order, dest='a')
parser.add_option("-b", action="store_true", dest="b")
parser.add_option("-c", action="callback", callback=check_order, dest='c')
@end example

@node 콜백 예제 4 임의 조건 확인,콜백 예제 5 고정 인자,콜백 예제 3 옵션 순서 확인 일반화,옵션 콜백
@anchor{library/optparse callback-example-4-check-arbitrary-condition}@anchor{346b}@anchor{library/optparse optparse-callback-example-4}@anchor{346c}
@subsubsection 콜백 예제 4: 임의 조건 확인


물론, 여기에 어떤 조건도 넣을 수 있습니다—이미 정의된 옵션의 값을 확인하는 데 국한되지 않습니다. 예를 들어, 만월일 때 호출해서는 안 되는 옵션이 있으면, 다음과 같이 하면 됩니다:

@example
def check_moon(option, opt_str, value, parser):
    if is_moon_full():
        raise OptionValueError("%s option invalid when moon is full"
                               % opt_str)
    setattr(parser.values, option.dest, 1)
...
parser.add_option("--foo",
                  action="callback", callback=check_moon, dest="foo")
@end example

(@code{is_moon_full()}의 정의는 독자를 위한 연습 문제로 남겨 둡니다.)

@node 콜백 예제 5 고정 인자,콜백 예제 6 가변 인자,콜백 예제 4 임의 조건 확인,옵션 콜백
@anchor{library/optparse callback-example-5-fixed-arguments}@anchor{346d}@anchor{library/optparse optparse-callback-example-5}@anchor{346e}
@subsubsection 콜백 예제 5: 고정 인자


고정된 수의 인자를 사용하는 콜백 옵션을 정의하면 상황이 약간 더 흥미로워집니다. 콜백 옵션이 인자를 받도록 지정하는 것은 @code{"store"}나 @code{"append"} 옵션을 정의하는 것과 유사합니다: @ref{3418,,type}을 정의하면, 옵션은 해당 형으로 변환 할 수 있어야 하는 하나의 인자를 취합니다; @ref{3447,,nargs}를 추가로 정의하면, 옵션은 @code{nargs} 인자를 취합니다.

다음은 표준 @code{"store"} 액션을 흉내 내는 예입니다:

@example
def store_value(option, opt_str, value, parser):
    setattr(parser.values, option.dest, value)
...
parser.add_option("--foo",
                  action="callback", callback=store_value,
                  type="int", nargs=3, dest="foo")
@end example

Note that @code{optparse} takes care of consuming 3 arguments and converting
them to integers for you; all you have to do is store them.  (Or whatever;
obviously you don’t need a callback for this example.)

@node 콜백 예제 6 가변 인자,,콜백 예제 5 고정 인자,옵션 콜백
@anchor{library/optparse callback-example-6-variable-arguments}@anchor{346f}@anchor{library/optparse optparse-callback-example-6}@anchor{3470}
@subsubsection 콜백 예제 6: 가변 인자


Things get hairy when you want an option to take a variable number of arguments.
For this case, you must write a callback, as @code{optparse} doesn’t provide any
built-in capabilities for it.  And you have to deal with certain intricacies of
conventional Unix command-line parsing that @code{optparse} normally handles for
you.  In particular, callbacks should implement the conventional rules for bare
@code{--} and @code{-} arguments:


@itemize *

@item 
@code{--}나 @code{-}는 옵션 인자가 될 수 있습니다

@item 
날 @code{--} (어떤 옵션에 대한 인자가 아닌 경우): 명령 줄 처리를 중단하고 @code{--}를 버립니다

@item 
날 @code{-} (어떤 옵션에 대한 인자가 아닌 경우): 명령 줄 처리를 중지하지만 @code{-}는 유지합니다 (@code{parser.largs}에 추가합니다)
@end itemize

If you want an option that takes a variable number of arguments, there are
several subtle, tricky issues to worry about.  The exact implementation you
choose will be based on which trade-offs you’re willing to make for your
application (which is why @code{optparse} doesn’t support this sort of thing
directly).

그런데도, 가변 인자가 있는 옵션에 대한 콜백에는 가시가 있습니다:

@example
def vararg_callback(option, opt_str, value, parser):
    assert value is None
    value = []

    def floatable(str):
        try:
            float(str)
            return True
        except ValueError:
            return False

    for arg in parser.rargs:
        # --foo 와 같은 옵션에서 멈춥니다
        if arg[:2] == "--" and len(arg) > 2:
            break
        # -a 에서 멈추지만, -3 이나 -3.0 에서는 멈추지 않습니다
        if arg[:1] == "-" and len(arg) > 1 and not floatable(arg):
            break
        value.append(arg)

    del parser.rargs[:len(value)]
    setattr(parser.values, option.dest, value)

...
parser.add_option("-c", "--callback", dest="vararg_attr",
                  action="callback", callback=vararg_callback)
@end example

@node Extending optparse,예외<7>,옵션 콜백,optparse — 명령 줄 옵션용 구문 분석기
@anchor{library/optparse extending-optparse}@anchor{3471}@anchor{library/optparse optparse-extending-optparse}@anchor{341d}
@subsubsection Extending @code{optparse}


Since the two major controlling factors in how @code{optparse} interprets
command-line options are the action and type of each option, the most likely
direction of extension is to add new actions and new types.

@menu
* 새로운 형 추가하기:: 
* 새로운 액션 추가하기:: 

@end menu

@node 새로운 형 추가하기,새로운 액션 추가하기,,Extending optparse
@anchor{library/optparse adding-new-types}@anchor{3472}@anchor{library/optparse optparse-adding-new-types}@anchor{3473}
@subsubsection 새로운 형 추가하기


To add new types, you need to define your own subclass of @code{optparse}’s
@ref{343f,,Option} class.  This class has a couple of attributes that define
@code{optparse}’s types: @ref{3474,,TYPES} and @ref{3475,,TYPE_CHECKER}.

@geindex TYPES (optparse.Option의 속성)
@anchor{library/optparse optparse Option TYPES}@anchor{3474}
@deffn {속성} Option.TYPES

형 이름의 튜플; 여러분의 서브 클래스에서, 표준 튜플을 기반으로 하는 새 튜플 @ref{3474,,TYPES}를 정의하십시오.
@end deffn

@geindex TYPE_CHECKER (optparse.Option의 속성)
@anchor{library/optparse optparse Option TYPE_CHECKER}@anchor{3475}
@deffn {속성} Option.TYPE_CHECKER

형 이름을 형 검사 함수에 매핑하는 딕셔너리. 형 검사 함수는 다음과 같은 서명을 갖습니다:

@example
def check_mytype(option, opt, value)
@end example

여기서 @code{option}은 @ref{343f,,Option} 인스턴스이고, @code{opt}는 옵션 문자열(예를 들어, @code{-f})이며, @code{value}는 검사되고 원하는 형으로 변환되어야 하는 명령 줄의 문자열입니다. @code{check_mytype()}은 가상의 형 @code{mytype}의 객체를 반환해야 합니다. 형 검사 함수가 반환한 값은 @ref{16d3,,OptionParser.parse_args()}에서 반환한 OptionValues 인스턴스에 포함되거나 @code{value} 매개 변수로 콜백에 전달됩니다.

형 검사 함수는 문제가 발생하면 @ref{3407,,OptionValueError} 를 발생시켜야 합니다. @code{OptionValueError} 는 @ref{16d2,,OptionParser}의 @code{error()} 메서드에 있는 그대로 전달되는 단일 문자열 인자를 취하며, 이는 차례로 프로그램 이름과 문자열 @code{"error:"}를 앞에 붙이고 프로세스를 종료하기 전에 모든 것을 stderr에 인쇄합니다.
@end deffn

Here’s a silly example that demonstrates adding a @code{"complex"} option type to
parse Python-style complex numbers on the command line.  (This is even sillier
than it used to be, because @code{optparse} 1.3 added built-in support for
complex numbers, but never mind.)

첫째, 필요한 임포트:

@example
from copy import copy
from optparse import Option, OptionValueError
@end example

나중에 (Option 서브 클래스의 @ref{3475,,TYPE_CHECKER} 클래스 어트리뷰트에서) 참조되므로, 형 검사기를 먼저 정의해야 합니다:

@example
def check_complex(option, opt, value):
    try:
        return complex(value)
    except ValueError:
        raise OptionValueError(
            "option %s: invalid complex value: %r" % (opt, value))
@end example

마지막으로, Option 서브 클래스:

@example
class MyOption (Option):
    TYPES = Option.TYPES + ("complex",)
    TYPE_CHECKER = copy(Option.TYPE_CHECKER)
    TYPE_CHECKER["complex"] = check_complex
@end example

(If we didn’t make a @ref{29,,copy()} of @ref{3475,,Option.TYPE_CHECKER}, we would end
up modifying the @code{TYPE_CHECKER} attribute of @code{optparse}’s
Option class.  This being Python, nothing stops you from doing that except good
manners and common sense.)

That’s it!  Now you can write a script that uses the new option type just like
any other @code{optparse}-based script, except you have to instruct your
OptionParser to use MyOption instead of Option:

@example
parser = OptionParser(option_class=MyOption)
parser.add_option("-c", type="complex")
@end example

또는, 여러분 자신만의 옵션 목록을 만들어 OptionParser에 전달할 수 있습니다; 위의 방법으로 @code{add_option()}을 사용하지 않으면, OptionParser에 사용할 옵션 클래스를 알려줄 필요가 없습니다:

@example
option_list = [MyOption("-c", action="store", type="complex", dest="c")]
parser = OptionParser(option_list=option_list)
@end example

@node 새로운 액션 추가하기,,새로운 형 추가하기,Extending optparse
@anchor{library/optparse adding-new-actions}@anchor{3476}@anchor{library/optparse optparse-adding-new-actions}@anchor{3477}
@subsubsection 새로운 액션 추가하기


Adding new actions is a bit trickier, because you have to understand that
@code{optparse} has a couple of classifications for actions:


@table @asis

@item “저장” 액션

actions that result in @code{optparse} storing a value to an attribute of the
current OptionValues instance; these options require a @ref{3419,,dest}
attribute to be supplied to the Option constructor.

@item “형이 있는” 액션

명령 줄에서 값을 취하고 이것이 특정 형일 것으로 기대하는 액션; 또는, 특정 형으로 변환할 수 있는 문자열. 이러한 옵션을 사용하려면 Option 생성자에 @ref{3418,,type} 어트리뷰트를 제공해야 합니다.
@end table

이들은 겹치는 집합입니다: 일부 기본 “저장” 액션은 @code{"store"}, @code{"store_const"}, @code{"append"} 및 @code{"count"}이고, 기본 “형이 있는” 액션은 @code{"store"}, @code{"append"} 및 @code{"callback"}입니다.

액션을 추가할 때, Option의 다음 클래스 어트리뷰트 중 하나 이상에 나열하여 분류해야 합니다 (모두 문자열 리스트입니다):

@geindex ACTIONS (optparse.Option의 속성)
@anchor{library/optparse optparse Option ACTIONS}@anchor{3478}
@deffn {속성} Option.ACTIONS

모든 액션은 ACTIONS에 나열되어야 합니다.
@end deffn

@geindex STORE_ACTIONS (optparse.Option의 속성)
@anchor{library/optparse optparse Option STORE_ACTIONS}@anchor{3479}
@deffn {속성} Option.STORE_ACTIONS

“저장” 액션이 여기에 추가로 나열됩니다.
@end deffn

@geindex TYPED_ACTIONS (optparse.Option의 속성)
@anchor{library/optparse optparse Option TYPED_ACTIONS}@anchor{347a}
@deffn {속성} Option.TYPED_ACTIONS

“형이 있는” 액션이 여기에 추가로 나열됩니다.
@end deffn

@geindex ALWAYS_TYPED_ACTIONS (optparse.Option의 속성)
@anchor{library/optparse optparse Option ALWAYS_TYPED_ACTIONS}@anchor{347b}
@deffn {속성} Option.ALWAYS_TYPED_ACTIONS

Actions that always take a type (i.e. whose options always take a value) are
additionally listed here.  The only effect of this is that @code{optparse}
assigns the default type, @code{"string"}, to options with no explicit type
whose action is listed in @ref{347b,,ALWAYS_TYPED_ACTIONS}.
@end deffn

새 액션을 실제로 구현하려면, Option의 @code{take_action()} 메서드를 재정의하고 액션을 인식하는 케이스를 추가해야 합니다.

예를 들어, @code{"extend"} 액션을 추가해 보겠습니다. 이것은 표준 @code{"append"} 액션과 유사하지만, 명령 줄에서 단일 값을 취해서 기존 리스트에 추가하는 대신, @code{"extend"}는 단일 쉼표로 구분된 문자열에서 여러 값을 취해서 기존 리스트를 확장합니다. 즉, @code{--names}가 @code{"string"} 형의 @code{"extend"} 옵션이면, 다음과 같은 명령 줄은

@example
--names=foo,bar --names blah --names ding,dong
@end example

다음과 같은 리스트를 만듭니다

@example
["foo", "bar", "blah", "ding", "dong"]
@end example

다시 Option의 서브 클래스를 정의합니다:

@example
class MyOption(Option):

    ACTIONS = Option.ACTIONS + ("extend",)
    STORE_ACTIONS = Option.STORE_ACTIONS + ("extend",)
    TYPED_ACTIONS = Option.TYPED_ACTIONS + ("extend",)
    ALWAYS_TYPED_ACTIONS = Option.ALWAYS_TYPED_ACTIONS + ("extend",)

    def take_action(self, action, dest, opt, value, values, parser):
        if action == "extend":
            lvalue = value.split(",")
            values.ensure_value(dest, []).extend(lvalue)
        else:
            Option.take_action(
                self, action, dest, opt, value, values, parser)
@end example

참고할만한 특징:


@itemize *

@item 
@code{"extend"}는 명령 줄에서 값을 기대하기도 하고 그 값을 어딘가에 저장하기도 하므로, @ref{3479,,STORE_ACTIONS}와 @ref{347a,,TYPED_ACTIONS} 모두에 들어갑니다.

@item 
to ensure that @code{optparse} assigns the default type of @code{"string"} to
@code{"extend"} actions, we put the @code{"extend"} action in
@ref{347b,,ALWAYS_TYPED_ACTIONS} as well.

@item 
@code{MyOption.take_action()} implements just this one new action, and passes
control back to @code{Option.take_action()} for the standard @code{optparse}
actions.

@item 
@code{values}는 매우 유용한 @code{ensure_value()} 메서드를 제공하는 optparse_parser.Values 클래스의 인스턴스입니다. @code{ensure_value()}는 본질적으로 안전밸브가 있는 @ref{dc9,,getattr()}입니다; 다음과 같이 호출됩니다

@example
values.ensure_value(attr, value)
@end example

@code{values}의 @code{attr} 어트리뷰트가 존재하지 않거나 @code{None}이면, ensure_value()는 먼저 이를 @code{value}로 설정한 다음, @code{value}를 반환합니다. 이것은 @code{"extend"}, @code{"append"} 및 @code{"count"}와 같은 액션에 매우 편리합니다. 이 액션들은 모두 변수에 데이터를 누적하고 해당 변수가 특정 형(처음 두 개는 리스트, 마지막은 정수)이 될 것으로 기대합니다. @code{ensure_value()}를 사용한다는 것은 액션을 사용하는 스크립트가 문제의 옵션 대상에 대한 기본값 설정에 대해 걱정할 필요가 없음을 의미합니다; 기본값을 @code{None}으로 그대로 둘 수 있으며 @code{ensure_value()}는 필요할 때 올바르게 처리합니다.
@end itemize

@node 예외<7>,,Extending optparse,optparse — 명령 줄 옵션용 구문 분석기
@anchor{library/optparse exceptions}@anchor{347c}
@subsubsection 예외


@geindex OptionError
@anchor{library/optparse optparse OptionError}@anchor{3406}
@deffn {예외} optparse.OptionError

Raised if an @ref{343f,,Option} instance is created with invalid or
inconsistent arguments.
@end deffn

@geindex OptionConflictError
@anchor{library/optparse optparse OptionConflictError}@anchor{3457}
@deffn {예외} optparse.OptionConflictError

Raised if conflicting options are added to an @ref{16d2,,OptionParser}.
@end deffn

@geindex OptionValueError
@anchor{library/optparse optparse OptionValueError}@anchor{3407}
@deffn {예외} optparse.OptionValueError

Raised if an invalid option value is encountered on the command line.
@end deffn

@geindex BadOptionError
@anchor{library/optparse optparse BadOptionError}@anchor{347d}
@deffn {예외} optparse.BadOptionError

명령줄에서 잘못된 옵션이 전달되면 발생합니다.
@end deffn

@geindex AmbiguousOptionError
@anchor{library/optparse optparse AmbiguousOptionError}@anchor{347e}
@deffn {예외} optparse.AmbiguousOptionError

Raised if an ambiguous option is passed on the command line.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node getpass — 이식성 있는 암호 입력,fileinput — 여러 입력 스트림에서 줄을 이터레이트 하기,optparse — 명령 줄 옵션용 구문 분석기,Command-line interface libraries
@anchor{library/getpass doc}@anchor{347f}@anchor{library/getpass getpass-portable-password-input}@anchor{3480}@anchor{library/getpass module-getpass}@anchor{66}@anchor{library/getpass translation-repo}@anchor{3481}
@subsection @code{getpass} — 이식성 있는 암호 입력


@geindex module; getpass

@c Windows (& Mac?) support by Guido van Rossum.

`소스 코드:' Lib/getpass.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/getpass.py}


__________________________________________________________________


@c include for modules that don't work on WASM

@ref{213c,,가용성}: not WASI.

이 모듈은 웹어셈블리에서 작동하지 않거나 제공되지 않습니다. 자세한 내용은 @ref{1b68,,웹어셈블리 플랫폼}을 참조하세요.

The @code{getpass} module provides two functions:

@geindex getpass() (getpass 모듈)
@anchor{library/getpass getpass getpass}@anchor{21d}
@deffn {함수} getpass.getpass (prompt='Password: ', stream=None, *, echo_char=None)

에코 없이 사용자에게 암호를 묻습니다. 사용자는 `prompt' 문자열을 사용하여 프롬프트 됩니다. 기본값은 @code{'Password: '}입니다. 유닉스에서 프롬프트는 필요하다면 replace 에러 처리기를 사용하여 파일류 객체 `stream'에 기록됩니다. `stream'는 제어 터미널(@code{/dev/tty})이나 사용할 수 없으면 @code{sys.stderr}를 기본값으로 사용합니다 (이 인자는 윈도우에서 무시됩니다).

The `echo_char' argument controls how user input is displayed while typing.
If `echo_char' is @code{None} (default), input remains hidden. Otherwise,
`echo_char' must be a single printable ASCII character and each
typed character is replaced by it. For example, @code{echo_char='*'} will
display asterisks instead of the actual input.

에코가 없는 입력을 사용할 수 없으면, getpass()는 `stream'에 경고 메시지를 인쇄하고, @code{sys.stdin}에서 읽고, @ref{3482,,GetPassWarning}을 방출하는 것으로 돌아갑니다.

@cartouche
@quotation 참고 
IDLE 내에서 getpass를 호출하면, 대기 중인 창 자체가 아닌 IDLE을 시작한 터미널에서 입력이 수행될 수 있습니다.
@end quotation
@end cartouche

@cartouche
@quotation 참고 
On Unix systems, when `echo_char' is set, the terminal will be
configured to operate in
@code{noncanonical mode@footnote{https://manpages.debian.org/termios(3)#Canonical_and_noncanonical_mode}}.
In particular, this means that line editing shortcuts such as
@code{Ctrl}+@code{U} will not work and may insert unexpected characters into
the input.
@end quotation
@end cartouche


버전 3.14에서 변경: Added the `echo_char' parameter for keyboard feedback.

@end deffn

@geindex GetPassWarning
@anchor{library/getpass getpass GetPassWarning}@anchor{3482}
@deffn {예외} getpass.GetPassWarning

패스워드 입력이 에코 될 때 방출되는 @ref{2719,,UserWarning} 서브 클래스.
@end deffn

@geindex getuser() (getpass 모듈)
@anchor{library/getpass getpass getuser}@anchor{658}
@deffn {함수} getpass.getuser ()

사용자의 “로그인 이름”을 반환합니다.

이 함수는 환경 변수 
@geindex LOGNAME
@geindex 환경 변수; LOGNAME
@code{LOGNAME}, 
@geindex USER
@geindex 환경 변수; USER
@code{USER}, @code{LNAME} 및 
@geindex USERNAME
@geindex 환경 변수; USERNAME
@code{USERNAME}를 순서대로 검사하고, 비어 있지 않은 문자열로 설정된 첫 번째 값을 반환합니다. 아무것도 설정되지 않았으면, @ref{b7,,pwd} 모듈을 지원하는 시스템에서는 암호 데이터베이스의 로그인 이름이 반환되고, 그렇지 않으면 @ref{2c0,,OSError}가 발생합니다.

일반적으로, 이 함수는 @ref{1825,,os.getlogin()}보다 선호됩니다.


버전 3.13에서 변경: Previously, various exceptions beyond just @ref{2c0,,OSError} were raised.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node fileinput — 여러 입력 스트림에서 줄을 이터레이트 하기,curses — 문자 셀 디스플레이를 위한 터미널 처리,getpass — 이식성 있는 암호 입력,Command-line interface libraries
@anchor{library/fileinput doc}@anchor{3483}@anchor{library/fileinput fileinput-iterate-over-lines-from-multiple-input-streams}@anchor{3484}@anchor{library/fileinput module-fileinput}@anchor{5f}@anchor{library/fileinput translation-repo}@anchor{3485}
@subsection @code{fileinput} — 여러 입력 스트림에서 줄을 이터레이트 하기


@geindex module; fileinput

`소스 코드:' Lib/fileinput.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/fileinput.py}


__________________________________________________________________


이 모듈은 표준 입력이나 파일 목록에 대한 루프를 빠르게 작성하기 위한 도우미 클래스와 함수를 구현합니다. 단지 하나의 파일을 읽거나 쓰려면 @ref{316,,open()}을 참조하십시오.

일반적인 사용법은 다음과 같습니다:

@example
import fileinput
for line in fileinput.input(encoding="utf-8"):
    process(line)
@end example

이것은 @code{sys.argv[1:]}에 나열된 모든 파일의 줄을 이터레이트 하며, 목록이 비어 있으면 기본값은 @code{sys.stdin}입니다. 파일 이름이 @code{'-'}이면, 이 또한 @code{sys.stdin}으로 대체되고 선택적 인자 `mode'와 `openhook'은 무시됩니다. 대체 파일명 목록을 지정하려면, @ref{a00,,input()}의 첫 번째 인자로 전달하십시오. 단일 파일 이름도 허용됩니다.

모든 파일은 기본적으로 텍스트 모드로 열리지만, @ref{a00,,input()}이나 @ref{93f,,FileInput}을 호출할 때 `mode' 매개 변수를 지정하여 이를 재정의할 수 있습니다. 파일을 열거나 읽는 동안 I/O 에러가 발생하면, @ref{2c0,,OSError}가 발생합니다.


버전 3.3에서 변경: @ref{1252,,IOError}가 발생했었습니다; 이제 이것은 @ref{2c0,,OSError}의 별칭입니다.


@code{sys.stdin}이 두 번 이상 사용되면, 대화식으로 사용되거나 명시적으로 재설정된 경우(예를 들어, @code{sys.stdin.seek(0)}을 사용해서)를 제외하고 두 번째와 그 이후의 사용은 줄을 반환하지 않습니다.

빈 파일은 열리고 즉시 닫힙니다; 파일명 목록에 존재함이 인식되는 유일한 시간은 마지막에 열린 파일이 비어있을 때입니다.

줄은 줄 바꿈이 그대로 유지된 채로 반환됩니다. 즉, 파일의 마지막 줄에는 줄 바꿈이 없을 수도 있습니다.

@ref{a00,,fileinput.input()}이나 @ref{93f,,FileInput()}의 `openhook' 매개 변수를 통해 열기 훅을 제공하여 파일을 여는 방법을 제어할 수 있습니다. 훅은 두 개의 인자 `filename'과 `mode'를 취하고, 그에 따라 열린 파일류 객체를 반환하는 함수여야 합니다. `encoding' 및/또는 `errors'가 지정되면, 추가 키워드 인자로 훅에 전달됩니다. 이 모듈은 압축 파일을 지원하기 위해 @ref{a01,,hook_compressed()}를 제공합니다.

다음 함수는 이 모듈의 기본 인터페이스입니다:

@geindex input() (fileinput 모듈)
@anchor{library/fileinput fileinput input}@anchor{a00}
@deffn {함수} fileinput.input (files=None, inplace=False, backup='@w{'}, *, mode='r', openhook=None, encoding=None, errors=None)

@ref{93f,,FileInput} 클래스의 인스턴스를 만듭니다. 인스턴스는 이 모듈의 함수에 대한 전역 상태로 사용되며, 이터레이션 중에 사용하기 위해 반환되기도 합니다. 이 함수의 매개 변수는 @code{FileInput} 클래스의 생성자로 전달됩니다.

@ref{93f,,FileInput} 인스턴스는 @ref{186,,with} 문에서 컨텍스트 관리자로 사용될 수 있습니다. 이 예제에서, 예외가 발생하더라도 @code{with} 문이 종료된 후 `input'이 닫힙니다:

@example
with fileinput.input(files=('spam.txt', 'eggs.txt'), encoding="utf-8") as f:
    for line in f:
        process(line)
@end example


버전 3.2에서 변경: 컨텍스트 관리자로 사용할 수 있습니다.



버전 3.8에서 변경: 키워드 매개 변수 `mode'와 `openhook'은 이제 키워드 전용입니다.



버전 3.10에서 변경: 키워드 전용 매개 변수 `encoding' 와 `errors'를 추가했습니다.

@end deffn

다음 함수는 @ref{a00,,fileinput.input()}에 의해 만들어진 전역 상태를 사용합니다; 활성 상태가 없으면, @ref{244,,RuntimeError}가 발생합니다.

@geindex filename() (fileinput 모듈)
@anchor{library/fileinput fileinput filename}@anchor{3486}
@deffn {함수} fileinput.filename ()

현재 읽고 있는 파일의 이름을 반환합니다. 첫 번째 줄을 읽기 전에는, @code{None}을 반환합니다.
@end deffn

@geindex fileno() (fileinput 모듈)
@anchor{library/fileinput fileinput fileno}@anchor{1633}
@deffn {함수} fileinput.fileno ()

현재 파일의 정수 “파일 기술자”를 반환합니다. 파일이 열리지 않았으면 (첫 번째 줄 전과 파일 사이에), @code{-1}을 반환합니다.
@end deffn

@geindex lineno() (fileinput 모듈)
@anchor{library/fileinput fileinput lineno}@anchor{3487}
@deffn {함수} fileinput.lineno ()

방금 읽은 줄의 누적 줄 번호를 반환합니다. 첫 번째 줄을 읽기 전에는, @code{0}을 반환합니다. 마지막 파일의 마지막 줄을 읽은 후에는, 그 줄의 줄 번호를 반환합니다.
@end deffn

@geindex filelineno() (fileinput 모듈)
@anchor{library/fileinput fileinput filelineno}@anchor{3488}
@deffn {함수} fileinput.filelineno ()

현재 파일의 줄 번호를 반환합니다. 첫 번째 줄을 읽기 전에는, @code{0}을 반환합니다. 마지막 파일의 마지막 줄을 읽은 후에는, 그 줄의 파일 내에서의 줄 번호를 반환합니다.
@end deffn

@geindex isfirstline() (fileinput 모듈)
@anchor{library/fileinput fileinput isfirstline}@anchor{3489}
@deffn {함수} fileinput.isfirstline ()

방금 읽은 줄이 파일의 첫 번째 줄이면 @code{True}를, 그렇지 않으면 @code{False}를 반환합니다.
@end deffn

@geindex isstdin() (fileinput 모듈)
@anchor{library/fileinput fileinput isstdin}@anchor{348a}
@deffn {함수} fileinput.isstdin ()

마지막 줄을 @code{sys.stdin}에서 읽었으면 @code{True}를, 그렇지 않으면 @code{False}를 반환합니다.
@end deffn

@geindex nextfile() (fileinput 모듈)
@anchor{library/fileinput fileinput nextfile}@anchor{348b}
@deffn {함수} fileinput.nextfile ()

다음 이터레이션에서 다음 파일(있다면)의 첫 번째 줄을 읽도록 현재 파일을 닫습니다; 파일에서 읽지 않은 줄은 누적 줄 수에 포함되지 않습니다. 파일명은 다음 파일의 첫 번째 줄을 읽을 때까지 변경되지 않습니다. 첫 번째 줄을 읽기 전에는, 이 함수가 효과가 없습니다; 첫 번째 파일을 건너뛰는 데 사용할 수 없습니다. 마지막 파일의 마지막 줄을 읽은 후에는, 이 함수는 효과가 없습니다.
@end deffn

@geindex close() (fileinput 모듈)
@anchor{library/fileinput fileinput close}@anchor{348c}
@deffn {함수} fileinput.close ()

시퀀스를 닫습니다.
@end deffn

모듈이 제공하는 시퀀스 동작을 구현하는 클래스는 서브 클래싱에도 사용할 수 있습니다:

@geindex FileInput (fileinput 클래스)
@anchor{library/fileinput fileinput FileInput}@anchor{93f}
@deffn {클래스} fileinput.FileInput (files=None, inplace=False, backup='@w{'}, *, mode='r', openhook=None, encoding=None, errors=None)

@ref{93f,,FileInput} 클래스는 구현입니다; 그 메서드 @ref{3486,,filename()}, @ref{1633,,fileno()}, @ref{3487,,lineno()}, @ref{3488,,filelineno()}, @ref{3489,,isfirstline()}, @ref{348a,,isstdin()}, @ref{348b,,nextfile()} 및 @ref{348c,,close()}는 모듈에 있는 같은 이름의 함수에 해당합니다. 또한 @ref{142c,,이터러블}이고, 다음 입력 줄을 반환하는 @ref{20a4,,readline()} 메서드가 있습니다. 시퀀스는 엄격하게 순차적으로 액세스해야 합니다; 무작위 액세스와 @code{readline()}은 혼합될 수 없습니다.

`mode'로 @ref{316,,open()}에 전달할 파일 모드를 지정할 수 있습니다. @code{'r'} 과 @code{'rb'} 중 하나여야 합니다.

`openhook'이 제공되면 두 개의 인자 `filename'과 `mode'를 취하고, 이에 따라 열린 파일류 객체를 반환하는 함수여야 합니다. `inplace'와 `openhook'을 함께 사용할 수 없습니다.

You can specify `encoding' and `errors' that is passed to @ref{316,,open()} or `openhook'.

@ref{93f,,FileInput} 인스턴스는 @ref{186,,with} 문에서 컨텍스트 관리자로 사용될 수 있습니다. 이 예제에서, 예외가 발생하더라도 @code{with} 문이 종료된 후 `input'이 닫힙니다:

@example
with FileInput(files=('spam.txt', 'eggs.txt')) as input:
    process(input)
@end example


버전 3.2에서 변경: 컨텍스트 관리자로 사용할 수 있습니다.



버전 3.8에서 변경: 키워드 매개 변수 `mode'와 `openhook'은 이제 키워드 전용입니다.



버전 3.10에서 변경: 키워드 전용 매개 변수 `encoding' 와 `errors'를 추가했습니다.



버전 3.11에서 변경: @code{'rU'} 및 @code{'U'} 모드와 @code{__getitem__()} 메서드는 제거했습니다.

@end deffn

`선택적 제자리 필터링(in-place filtering):' 키워드 인자 @code{inplace=True}가 @ref{a00,,fileinput.input()}이나 @ref{93f,,FileInput} 생성자로 전달되면, 파일이 백업 파일로 이동되고 표준 출력은 입력 파일로 보내집니다 (백업 파일과 같은 이름의 파일이 이미 있으면, 조용히 대체됩니다). 이를 통해 입력 파일을 다시 쓰는 필터를 작성할 수 있습니다. `backup' 매개 변수가 제공되면 (일반적으로 @code{backup='.<some extension>'}으로), 백업 파일의 확장자를 지정하고, 백업 파일은 그대로 남아 있습니다; 기본적으로 확장자는 @code{'.bak'}이고, 출력 파일을 닫을 때 삭제됩니다. 표준 입력을 읽을 때는 제자리 필터링이 비활성화됩니다.

이 모듈은 다음과 같은 두 개의 열기 훅을 제공합니다:

@geindex hook_compressed() (fileinput 모듈)
@anchor{library/fileinput fileinput hook_compressed}@anchor{a01}
@deffn {함수} fileinput.hook_compressed (filename, mode, *, encoding=None, errors=None)

@ref{6b,,gzip}과 @ref{14,,bz2} 모듈을 사용하여 gzip과 bzip2로 압축된 파일(확장자 @code{'.gz'}와 @code{'.bz2'}로 인식합니다)을 투명하게 엽니다. 파일명 확장자가 @code{'.gz'}나 @code{'.bz2'}가 아니면, 파일이 정상적으로 열립니다 (즉, 압축 해제 없이 @ref{316,,open()}을 사용합니다).

The `encoding' and `errors' values are passed to @ref{9be,,io.TextIOWrapper}
for compressed files and open for normal files.

사용 예: @code{fi = fileinput.FileInput(openhook=fileinput.hook_compressed, encoding="utf-8")}


버전 3.10에서 변경: 키워드 전용 매개 변수 `encoding' 와 `errors'를 추가했습니다.

@end deffn

@geindex hook_encoded() (fileinput 모듈)
@anchor{library/fileinput fileinput hook_encoded}@anchor{e9d}
@deffn {함수} fileinput.hook_encoded (encoding, errors=None)

주어진 `encoding'과 `errors'를 사용하여 파일을 읽도록 @ref{316,,open()}으로 각 파일을 여는 훅을 반환합니다.

사용 예: @code{fi = fileinput.FileInput(openhook=fileinput.hook_encoded("utf-8", "surrogateescape"))}


버전 3.6에서 변경: 선택적 `errors' 매개 변수를 추가했습니다.



버전 3.10부터 폐지됨: This function is deprecated since @ref{a00,,fileinput.input()} and @ref{93f,,FileInput}
now have `encoding' and `errors' parameters.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node curses — 문자 셀 디스플레이를 위한 터미널 처리,curses textpad — Text input widget for curses programs,fileinput — 여러 입력 스트림에서 줄을 이터레이트 하기,Command-line interface libraries
@anchor{library/curses doc}@anchor{348d}@anchor{library/curses curses-terminal-handling-for-character-cell-displays}@anchor{348e}@anchor{library/curses module-curses}@anchor{2f}@anchor{library/curses translation-repo}@anchor{348f}
@subsection @code{curses} — 문자 셀 디스플레이를 위한 터미널 처리


@geindex module; curses

`소스 코드:' Lib/curses@footnote{https://github.com/python/cpython/tree/3.14/Lib/curses}


__________________________________________________________________


The @code{curses} module provides an interface to the curses library, the
de-facto standard for portable advanced terminal handling.

curses는 유닉스 환경에서 가장 널리 사용되지만, 윈도우, DOS 및 기타 시스템에서도 사용할 수 있는 버전이 있습니다. 이 확장 모듈은 리눅스와 유닉스의 BSD 변형에서 동작하는 오픈 소스 curses 라이브러리인 ncurses의 API와 일치하도록 설계되었습니다.

@c include for modules that don't work on WASM or mobile platforms

@ref{213c,,가용성}: not Android, not iOS, not WASI.

이 모듈은 @ref{2259,,모바일 플랫폼}이나 @ref{1b68,,웹어셈블리 플랫폼}에서 지원되지 않습니다.

This is an @ref{2157,,optional module}.
If it is missing from your copy of CPython,
look for documentation from your distributor (that is,
whoever provided Python to you).
If you are the distributor, see @ref{2155,,Requirements for optional modules}.

@c Similar notes appear in the docs of the modules:
@c - zipfile
@c - tarfile

@ref{213c,,가용성}: Unix.

@cartouche
@quotation 참고 
설명서에 `문자(character)'가 언급될 때마다 정수, 한 문자 유니코드 문자열 또는 한 바이트 바이트열로 지정할 수 있습니다.

설명서에 `문자 문자열(character string)'이 언급될 때마다 유니코드 문자열이나 바이트열로 지정할 수 있습니다.
@end quotation
@end cartouche


@subsubheading 더 보기



@table @asis

@item 모듈 @ref{30,,curses.ascii}

로케일 설정과 관계없이, ASCII 문자로 작업하기 위한 유틸리티.

@item 모듈 @ref{31,,curses.panel}

curses 창에 깊이를 추가하는 패널 스택 확장.

@item 모듈 @ref{32,,curses.textpad}

@code{Emacs}와 유사한 바인딩을 지원하는 curses를 위한 편집 가능한 텍스트 위젯.

@item @ref{3490,,파이썬 curses 프로그래밍}

Andrew Kuchling과 Eric Raymond가 작성한, curses를 파이썬에서 사용하는 것에 대한 자습서 자료.
@end table


@menu
* 함수: 함수<5>. 
* 창 객체:: 
* 상수: 상수<6>. 

@end menu

@node 함수<5>,창 객체,,curses — 문자 셀 디스플레이를 위한 터미널 처리
@anchor{library/curses curses-functions}@anchor{3491}@anchor{library/curses functions}@anchor{3492}
@subsubsection 함수


The module @code{curses} defines the following exception:

@geindex error
@anchor{library/curses curses error}@anchor{3493}
@deffn {예외} curses.error

curses 라이브러리 함수가 에러를 반환할 때 발생하는 예외.
@end deffn

@cartouche
@quotation 참고 
함수나 메서드에 대한 `x'나 `y' 인자가 선택 사항일 때마다, 기본값은 현재 커서 위치입니다. `attr'이 선택적일 때마다 기본값은 @ref{3494,,A_NORMAL}입니다.
@end quotation
@end cartouche

The module @code{curses} defines the following functions:

@geindex assume_default_colors() (curses 모듈)
@anchor{library/curses curses assume_default_colors}@anchor{1f6}
@deffn {함수} curses.assume_default_colors (fg, bg, /)

Allow use of default values for colors on terminals supporting this feature.
Use this to support transparency in your application.


@itemize *

@item 
Assign terminal default foreground/background colors to color number @code{-1}.
So @code{init_pair(x, COLOR_RED, -1)} will initialize pair `x' as red
on default background and @code{init_pair(x, -1, COLOR_BLUE)} will
initialize pair `x' as default foreground on blue.

@item 
Change the definition of the color-pair @code{0} to @code{(fg, bg)}.
@end itemize


Added in version 3.14.

@end deffn

@geindex baudrate() (curses 모듈)
@anchor{library/curses curses baudrate}@anchor{3495}
@deffn {함수} curses.baudrate ()

터미널의 출력 속도를 초당 비트 수로 반환합니다. 소프트웨어 터미널 에뮬레이터에서는 고정된 큰 값을 갖습니다. 역사적인 이유로 포함되었습니다; 이전에는, 시간 지연에 대한 출력 루프를 작성하는데, 때로는 회선 속도에 따라 인터페이스를 변경하는 데 사용되었습니다.
@end deffn

@geindex beep() (curses 모듈)
@anchor{library/curses curses beep}@anchor{3496}
@deffn {함수} curses.beep ()

짧은 주의 음을 냅니다.
@end deffn

@geindex can_change_color() (curses 모듈)
@anchor{library/curses curses can_change_color}@anchor{3497}
@deffn {함수} curses.can_change_color ()

프로그래머가 터미널에 표시되는 색상을 변경할 수 있는지에 따라 @code{True}나 @code{False}를 반환합니다.
@end deffn

@geindex cbreak() (curses 모듈)
@anchor{library/curses curses cbreak}@anchor{3498}
@deffn {함수} curses.cbreak ()

cbreak 모드로 들어갑니다. cbreak 모드(“드문(rare)” 모드라고도 합니다)에서는 일반 tty 줄 버퍼링이 꺼지고 문자를 하나씩 읽을 수 있습니다. 그러나, 원시(raw) 모드와 달리, 특수 문자(인터럽트(interrupt), 종료(quit), 일시 중단(suspend) 및 흐름 제어(flow control))는 tty 드라이버와 호출하는 프로그램에 영향을 미칩니다. @ref{3499,,raw()}를 먼저 호출한 다음 @ref{3498,,cbreak()}를 호출하면 터미널이 cbreak 모드로 유지됩니다.
@end deffn

@geindex color_content() (curses 모듈)
@anchor{library/curses curses color_content}@anchor{9f2}
@deffn {함수} curses.color_content (color_number)

@code{0}과 @code{COLORS - 1} 사이의 색상 `color_number'에서 빨강, 녹색 및 파랑 (RGB) 구성 요소의 강도(intensity)를 반환합니다. 주어진 색상에 대한 R,G,B 값이 포함된 3-튜플을 반환합니다. 이 값은 @code{0}(구성 요소 없음)과 @code{1000}(구성 요소의 최대량) 사이입니다.
@end deffn

@geindex color_pair() (curses 모듈)
@anchor{library/curses curses color_pair}@anchor{349a}
@deffn {함수} curses.color_pair (pair_number)

지정된 색상 쌍으로 텍스트를 표시하기 위한 속성값을 반환합니다. 처음 256 색상 쌍만 지원됩니다. 이 속성값은 @ref{349b,,A_STANDOUT}, @ref{349c,,A_REVERSE} 및 기타 @code{A_*} 속성과 결합할 수 있습니다. @ref{349d,,pair_number()}는 이 함수의 역입니다.
@end deffn

@geindex curs_set() (curses 모듈)
@anchor{library/curses curses curs_set}@anchor{349e}
@deffn {함수} curses.curs_set (visibility)

커서 상태를 설정합니다. `visibility'는 @code{0}, @code{1} 또는 @code{2}로 설정될 수 있는데, 각각 보이지 않음(invisible), 보통, 매우 잘 보임(very visible)입니다. 터미널이 요청된 visibility를 지원하면, 이전 커서 상태를 반환합니다; 그렇지 않으면 예외가 발생합니다. 많은 터미널에서, “보이는(visible)” 모드는 밑줄 커서이고 “매우 잘 보이는(very visible)” 모드는 블록 커서입니다.
@end deffn

@geindex def_prog_mode() (curses 모듈)
@anchor{library/curses curses def_prog_mode}@anchor{349f}
@deffn {함수} curses.def_prog_mode ()

현재 터미널 모드를 “프로그램(program)” 모드로 저장합니다. 프로그램 모드는 실행 중인 프로그램이 curses를 사용 중인 모드입니다. (반대는 “셸(shell)” 모드이며, 프로그램이 curses를 사용하지 않을 때입니다.) 이후에 @ref{34a0,,reset_prog_mode()}를 호출하면 이 모드가 복원됩니다.
@end deffn

@geindex def_shell_mode() (curses 모듈)
@anchor{library/curses curses def_shell_mode}@anchor{34a1}
@deffn {함수} curses.def_shell_mode ()

현재 터미널 모드를 “셸(shell)” 모드로 저장합니다. 셸 모드는 실행 중인 프로그램이 curses를 사용하지 않는 모드입니다. (반대는 “프로그램(program)” 모드이며, 프로그램이 curses 기능을 사용 중일 때입니다.) 이후에 @ref{34a2,,reset_shell_mode()}를 호출하면 이 모드가 복원됩니다.
@end deffn

@geindex delay_output() (curses 모듈)
@anchor{library/curses curses delay_output}@anchor{34a3}
@deffn {함수} curses.delay_output (ms)

출력에 `ms' 밀리초 일시 중지를 삽입합니다.
@end deffn

@geindex doupdate() (curses 모듈)
@anchor{library/curses curses doupdate}@anchor{34a4}
@deffn {함수} curses.doupdate ()

물리적 화면을 갱신합니다. curses 라이브러리는 두 개의 데이터 구조를 유지합니다. 하나는 현재 물리적 화면 내용을 표현하고 다른 하나는 원하는 다음 상태를 나타내는 가상 화면을 표현합니다. @ref{34a4,,doupdate()}는 물리적 화면을 가상 화면과 일치하도록 갱신합니다.

가상 화면은 창에 @ref{34a5,,addstr()}과 같은 쓰기 연산이 수행된 후 @ref{34a6,,noutrefresh()} 호출로 갱신될 수 있습니다. 일반적인 @ref{34a7,,refresh()} 호출은 단순히 @code{noutrefresh()} 후에 @code{doupdate()} 하는 것입니다; 여러 개의 창을 갱신해야 하면, 모든 창에서 @code{noutrefresh()} 호출을 실행한 다음 단일 @code{doupdate()}를 실행하여 속도 성능을 높이고 아마도 화면 깜박임을 줄일 수 있습니다.
@end deffn

@geindex echo() (curses 모듈)
@anchor{library/curses curses echo}@anchor{34a8}
@deffn {함수} curses.echo ()

반향(echo) 모드로 들어갑니다. 반향 모드에서는, 각 문자 입력이 입력되는 대로 화면에 반향을 일으킵니다.
@end deffn

@geindex endwin() (curses 모듈)
@anchor{library/curses curses endwin}@anchor{34a9}
@deffn {함수} curses.endwin ()

라이브러리를 초기화 해제하고, 터미널을 정상 상태로 되돌립니다.
@end deffn

@geindex erasechar() (curses 모듈)
@anchor{library/curses curses erasechar}@anchor{34aa}
@deffn {함수} curses.erasechar ()

사용자의 현재 지우기 문자(erase character)를 1바이트 바이트열 객체로 반환합니다. 유닉스 운영 체제에서 이는 curses 프로그램의 제어 tty의 특성이며, curses 라이브러리 자체에 의해 설정되지 않습니다.
@end deffn

@geindex filter() (curses 모듈)
@anchor{library/curses curses filter}@anchor{34ab}
@deffn {함수} curses.filter ()

@ref{34ab,,filter()} 루틴을 사용하는 경우 @ref{1910,,initscr()}을 호출하기 전에 호출해야 합니다. 이러한 호출 중에, 효과는 
@geindex LINES
@geindex 환경 변수; LINES
@code{LINES}가 @code{1}로 설정되고; @code{clear}, @code{cup}, @code{cud}, @code{cud1}, @code{cuu1}, @code{cuu}, @code{vpa} 기능이 비활성화되고; @code{home} 문자열이 @code{cr} 값으로 설정됩니다. 결과적으로 커서가 현재 줄에 갇혀서 화면이 갱신됩니다. 화면의 나머지 부분을 건드리지 않고 한 번에 한 글자(character-at-a-time) 줄 편집을 활성화하는데 사용될 수 있습니다.
@end deffn

@geindex flash() (curses 모듈)
@anchor{library/curses curses flash}@anchor{34ac}
@deffn {함수} curses.flash ()

화면을 깜박입니다. 즉, 반전 비디오로 변경한 다음 짧은 간격으로 되돌립니다. 어떤 사람들은 @ref{3496,,beep()}이 만드는 가청 주의 신호보다 이런 ‘시각적 벨’을 선호합니다.
@end deffn

@geindex flushinp() (curses 모듈)
@anchor{library/curses curses flushinp}@anchor{34ad}
@deffn {함수} curses.flushinp ()

모든 입력 버퍼를 플러시 합니다. 이렇게 하면 사용자가 입력했지만, 아직 프로그램에서 처리하지 않은 모든 선행 입력(typeahead)을 모두 버립니다.
@end deffn

@geindex getmouse() (curses 모듈)
@anchor{library/curses curses getmouse}@anchor{34ae}
@deffn {함수} curses.getmouse ()

@ref{1828,,getch()}가 @ref{34af,,KEY_MOUSE}를 반환하여 마우스 이벤트를 알린 후, 이 메서드는 대기 중인 마우스 이벤트를 꺼내기 위해 호출되어야 합니다, 이벤트는 5-튜플 @code{(id, x, y, z, bstate)}로 표현됩니다. `id'는 여러 장치를 구별하는 데 사용되는 ID 값이며, `x', `y', `z'는 이벤트 좌표입니다. (`z'는 현재 사용되지 않습니다.) `bstate'는 비트가 이벤트 유형을 나타내도록 설정되는 정숫값이며, 다음 상수 중 하나 이상의 비트별 OR입니다. 여기서 `n'은 1에서 5까지의 버튼 번호입니다: @ref{34b0,,BUTTONn_PRESSED}, @ref{34b1,,BUTTONn_RELEASED}, @ref{34b2,,BUTTONn_CLICKED}, @ref{34b3,,BUTTONn_DOUBLE_CLICKED}, @ref{34b4,,BUTTONn_TRIPLE_CLICKED}, @ref{34b5,,BUTTON_SHIFT}, @ref{34b6,,BUTTON_CTRL}, @ref{34b7,,BUTTON_ALT}.


버전 3.10에서 변경: The @code{BUTTON5_*} constants are now exposed if they are provided by the
underlying curses library.

@end deffn

@geindex getsyx() (curses 모듈)
@anchor{library/curses curses getsyx}@anchor{34b8}
@deffn {함수} curses.getsyx ()

가상 화면 커서의 현재 좌표를 튜플 @code{(y, x)}로 반환합니다. @ref{34b9,,leaveok}가 현재 @code{True}이면, @code{(-1, -1)}을 반환합니다.
@end deffn

@geindex getwin() (curses 모듈)
@anchor{library/curses curses getwin}@anchor{34ba}
@deffn {함수} curses.getwin (file)

이전 @ref{34bb,,window.putwin()} 호출로 파일에 저장된 창 관련 데이터를 읽습니다. 그런 다음 루틴은 해당 데이터를 사용하여 새 창을 만들고 초기화하여, 새 창 객체를 반환합니다.
@end deffn

@geindex has_colors() (curses 모듈)
@anchor{library/curses curses has_colors}@anchor{34bc}
@deffn {함수} curses.has_colors ()

터미널이 색상을 표시할 수 있으면 @code{True}를 반환합니다. 그렇지 않으면 @code{False}를 반환합니다.
@end deffn

@geindex has_extended_color_support() (curses 모듈)
@anchor{library/curses curses has_extended_color_support}@anchor{9f6}
@deffn {함수} curses.has_extended_color_support ()

Return @code{True} if the module supports extended colors; otherwise, return
@code{False}. Extended color support allows more than 256 color pairs for
terminals that support more than 16 colors (e.g. xterm-256color).

Extended color support requires ncurses version 6.1 or later.


Added in version 3.10.

@end deffn

@geindex has_ic() (curses 모듈)
@anchor{library/curses curses has_ic}@anchor{34bd}
@deffn {함수} curses.has_ic ()

터미널에 문자 삽입과 삭제 기능이 있으면 @code{True}를 반환합니다. 이 함수는 역사적인 이유로만 포함되는데, 모든 최신 소프트웨어 터미널 에뮬레이터에 이러한 기능이 있기 때문입니다.
@end deffn

@geindex has_il() (curses 모듈)
@anchor{library/curses curses has_il}@anchor{34be}
@deffn {함수} curses.has_il ()

터미널에 줄 삽입과 삭제 기능이 있거나, 영역 스크롤을 사용하여 시뮬레이션 할 수 있으면 @code{True}를 반환합니다. 이 함수는 역사적인 이유로만 포함되는데, 모든 최신 소프트웨어 터미널 에뮬레이터에 이러한 기능이 있기 때문입니다.
@end deffn

@geindex has_key() (curses 모듈)
@anchor{library/curses curses has_key}@anchor{34bf}
@deffn {함수} curses.has_key (ch)

키값 `ch'를 취하고, 현재 터미널 유형이 해당 값을 가진 키를 인식하면 @code{True}를 반환합니다.
@end deffn

@geindex halfdelay() (curses 모듈)
@anchor{library/curses curses halfdelay}@anchor{34c0}
@deffn {함수} curses.halfdelay (tenths)

사용자가 입력 한 문자를 프로그램에서 즉시 사용할 수 있다는 점에서 cbreak 모드와 유사한, 반 지연(half-delay) 모드에 사용됩니다. 그러나 `tenths' 10분의 1초 동안 블록한 후 아무것도 입력하지 않으면 예외가 발생합니다. `tenths'의 값은 @code{1}과 @code{255} 사이의 숫자여야 합니다. 반 지연 모드를 종료하려면 @ref{34c1,,nocbreak()}를 사용하십시오.
@end deffn

@geindex init_color() (curses 모듈)
@anchor{library/curses curses init_color}@anchor{9f3}
@deffn {함수} curses.init_color (color_number, r, g, b)

변경될 색상 번호와 뒤따르는 세 RGB 값(빨강, 녹색 및 파랑 성분의 양)을 취해서 색상의 정의를 변경합니다. `color_number'의 값은 @code{0}과 @code{COLORS - 1} 사이여야 합니다. `r', `g', `b'는 각각 @code{0}과 @code{1000} 사이의 값이어야 합니다. @ref{9f3,,init_color()}를 사용하면, 화면에서 해당 색상의 모든 항목이 즉시 새 정의로 변경됩니다. 이 함수는 대부분의 터미널에서 효과가 없습니다; @ref{3497,,can_change_color()}가 @code{True}를 반환할 때만 활성화됩니다.
@end deffn

@geindex init_pair() (curses 모듈)
@anchor{library/curses curses init_pair}@anchor{9f4}
@deffn {함수} curses.init_pair (pair_number, fg, bg)

Change the definition of a color-pair.  It takes three arguments: the number of
the color-pair to be changed, the foreground color number, and the background
color number.  The value of `pair_number' must be between @code{1} and
@code{COLOR_PAIRS - 1} (the @code{0} color pair can only be changed by
@ref{1f7,,use_default_colors()} and @ref{1f6,,assume_default_colors()}).
The value of `fg' and `bg' arguments must be between @code{0} and
@code{COLORS - 1}, or, after calling @code{use_default_colors()} or
@code{assume_default_colors()}, @code{-1}.
If the color-pair was previously initialized, the screen is
refreshed and all occurrences of that color-pair are changed to the new
definition.
@end deffn

@geindex initscr() (curses 모듈)
@anchor{library/curses curses initscr}@anchor{1910}
@deffn {함수} curses.initscr ()

라이브러리를 초기화합니다. 전체 화면을 나타내는 @ref{198a,,창} 객체를 반환합니다.

@cartouche
@quotation 참고 
터미널을 여는 중 에러가 발생하면, 하부 curses 라이브러리가 인터프리터를 종료시킬 수 있습니다.
@end quotation
@end cartouche
@end deffn

@geindex is_term_resized() (curses 모듈)
@anchor{library/curses curses is_term_resized}@anchor{34c2}
@deffn {함수} curses.is_term_resized (nlines, ncols)

@ref{1931,,resize_term()}이 창 구조를 수정한다면 @code{True}를, 그렇지 않으면 @code{False}를 반환합니다.
@end deffn

@geindex isendwin() (curses 모듈)
@anchor{library/curses curses isendwin}@anchor{34c3}
@deffn {함수} curses.isendwin ()

@ref{34a9,,endwin()}이 호출되었으면 (즉, curses 라이브러리가 초기화 해제되었다면) @code{True}를 반환합니다.
@end deffn

@geindex keyname() (curses 모듈)
@anchor{library/curses curses keyname}@anchor{34c4}
@deffn {함수} curses.keyname (k)

키 번호 `k'의 이름을 바이트열 객체로 반환합니다. 인쇄 가능한 ASCII 문자를 생성하는 키의 이름은 키의 문자입니다. 제어 키(control-key) 조합의 이름은 캐럿(@code{b'^'})과 그 뒤에오는 해당 인쇄 가능한 ASCII 문자로 구성된 2바이트 바이트열 객체입니다. 대체 키(alt-key) 조합(128–255)의 이름은 접두사 @code{b'M-'}와 그 뒤에 오는 해당 ASCII 문자의 이름으로 구성되는 바이트열 객체입니다.
@end deffn

@geindex killchar() (curses 모듈)
@anchor{library/curses curses killchar}@anchor{34c5}
@deffn {함수} curses.killchar ()

사용자의 현재 줄 삭제 문자(line kill character)를 1바이트 바이트열 객체로 반환합니다. 유닉스 운영 체제에서 이는 curses 프로그램의 제어 tty의 특성이며, curses 라이브러리 자체에 의해 설정되지 않습니다.
@end deffn

@geindex longname() (curses 모듈)
@anchor{library/curses curses longname}@anchor{34c6}
@deffn {함수} curses.longname ()

현재 터미널을 설명하는 terminfo 긴 이름 필드를 포함하는 바이트열 객체를 반환합니다. 자세한 설명의 최대 길이는 128자입니다. @ref{1910,,initscr()}을 호출한 후에만 정의됩니다.
@end deffn

@geindex meta() (curses 모듈)
@anchor{library/curses curses meta}@anchor{34c7}
@deffn {함수} curses.meta (flag)

`flag'가 @code{True}이면, 8비트 문자 입력을 허용합니다. `flag'가 @code{False}이면 7비트 문자만 허용합니다.
@end deffn

@geindex mouseinterval() (curses 모듈)
@anchor{library/curses curses mouseinterval}@anchor{34c8}
@deffn {함수} curses.mouseinterval (interval)

클릭으로 인식되기 위해 눌림(press)과 해제(release) 이벤트 사이에 지날 수 있는 최대 시간을 밀리초 단위로 설정하고, 이전 간격 값을 반환합니다. 기본값은 200 밀리 초, 즉 1/5초입니다.
@end deffn

@geindex mousemask() (curses 모듈)
@anchor{library/curses curses mousemask}@anchor{34c9}
@deffn {함수} curses.mousemask (mousemask)

마우스 이벤트가 보고되도록 설정하고, 튜플 @code{(availmask, oldmask)}를 반환합니다. `availmask'는 지정된 마우스 이벤트 중 보고 할 수 있는 것을 나타냅니다; 완전히 실패하면 @code{0}을 반환합니다. `oldmask'는 주어진 창의 마우스 이벤트 마스크의 이전 값입니다. 이 함수를 한 번도 호출하지 않으면, 마우스 이벤트가 보고되지 않습니다.
@end deffn

@geindex napms() (curses 모듈)
@anchor{library/curses curses napms}@anchor{190f}
@deffn {함수} curses.napms (ms)

`ms' 밀리초 동안 휴면합니다.
@end deffn

@geindex newpad() (curses 모듈)
@anchor{library/curses curses newpad}@anchor{34ca}
@deffn {함수} curses.newpad (nlines, ncols)

주어진 수의 행과 열로 새로운 패드 데이터 구조에 대한 포인터를 만들고 반환합니다. 패드를 창 객체로 반환합니다.

패드는 화면 크기에 의해 제한되지 않으며, 화면의 특정 부분과 반드시 관련될 필요는 없다는 점을 제외하면 창과 같습니다. 큰 창이 필요할 때 패드를 사용할 수 있으며, 한 번에 창의 일부만 화면에 표시됩니다. 패드의 자동 새로 고침(가령 스크롤이나 입력 반향)은 일어나지 않습니다. 패드의 @ref{34a7,,refresh()}와 @ref{34a6,,noutrefresh()} 메서드는 표시할 패드의 부분과 표시할 화면의 위치를 지정하기 위해 6개의 인자가 필요합니다. 인자는 `pminrow', `pmincol', `sminrow', `smincol', `smaxrow', `smaxcol'입니다; `p' 인자는 표시할 패드 영역의 왼쪽 위 모서리를 가리키고, `s' 인자는 패드 영역이 표시될 화면 위의 클리핑 상자를 정의합니다.
@end deffn

@geindex newwin() (curses 모듈)
@anchor{library/curses curses newwin}@anchor{34cb}
@deffn {함수} curses.newwin (nlines, ncols)

@deffnx {함수} curses.newwin (nlines, ncols, begin_y, begin_x)

왼쪽 위 모서리가 @code{(begin_y, begin_x)}이고, 높이/너비가 `nlines'/`ncols' 인 새 @ref{198a,,창}을 반환합니다.

기본적으로, 창은 지정된 위치에서 화면 오른쪽 하단으로 확장됩니다.
@end deffn

@geindex nl() (curses 모듈)
@anchor{library/curses curses nl}@anchor{34cc}
@deffn {함수} curses.nl ()

줄 바꿈(newline) 모드로 들어갑니다. 이 모드는 입력에서 리턴 키를 줄 바꿈으로 변환하고, 출력에서 줄 바꿈을 리턴(return)과 줄 넘김(line-feed)으로 변환합니다. 줄 바꿈 모드는 처음에 켜져 있습니다.
@end deffn

@geindex nocbreak() (curses 모듈)
@anchor{library/curses curses nocbreak}@anchor{34c1}
@deffn {함수} curses.nocbreak ()

cbreak 모드를 종료합니다. 줄 버퍼링을 사용하는 일반 “요리된(cooked)” 모드로 돌아갑니다.
@end deffn

@geindex noecho() (curses 모듈)
@anchor{library/curses curses noecho}@anchor{34cd}
@deffn {함수} curses.noecho ()

반향 모드를 종료합니다. 입력 문자 반향이 꺼집니다.
@end deffn

@geindex nonl() (curses 모듈)
@anchor{library/curses curses nonl}@anchor{34ce}
@deffn {함수} curses.nonl ()

줄 바꿈 모드를 종료합니다. 입력에서 리턴을 줄 바꿈으로 변환하는 것을 비활성화하고, 출력에서 줄 바꿈을 줄 바꿈/리턴으로 저수준 변환하는 것을 비활성화합니다 (그러나 이것은 @code{addch('\n')}의 동작을 변경하지는 않는데, 항상 가상 화면에서 리턴(return)과 줄 넘김(line feed)에 동등한 역할을 합니다). 변환이 꺼져 있으면, curses가 때로 수직 동작 속도를 약간 올릴 수 있습니다; 또한, 입력에서 리턴 키를 감지할 수 있습니다.
@end deffn

@geindex noqiflush() (curses 모듈)
@anchor{library/curses curses noqiflush}@anchor{34cf}
@deffn {함수} curses.noqiflush ()

@code{noqiflush()} 루틴이 사용되면, @code{INTR}, @code{QUIT} 및 @code{SUSP} 문자와 연관된 입력과 출력 큐의 일반 플러시가 수행되지 않습니다. 처리기가 종료한 후, 인터럽트가 발생하지 않은 것처럼 출력을 계속하려면 시그널 처리기에서 @code{noqiflush()}를 호출할 수 있습니다.
@end deffn

@geindex noraw() (curses 모듈)
@anchor{library/curses curses noraw}@anchor{34d0}
@deffn {함수} curses.noraw ()

원시(raw) 모드를 종료합니다. 줄 버퍼링을 사용하는 일반 “요리된(cooked)” 모드로 돌아갑니다.
@end deffn

@geindex pair_content() (curses 모듈)
@anchor{library/curses curses pair_content}@anchor{9f5}
@deffn {함수} curses.pair_content (pair_number)

요청된 색상 쌍의 색상이 포함된 튜플 @code{(fg, bg)}를 반환합니다. `pair_number'의 값은 @code{0}과 @code{COLOR_PAIRS - 1} 사이여야 합니다.
@end deffn

@geindex pair_number() (curses 모듈)
@anchor{library/curses curses pair_number}@anchor{349d}
@deffn {함수} curses.pair_number (attr)

속성값 `attr'로 설정된 색상 쌍의 번호를 반환합니다. @ref{349a,,color_pair()}는 이 함수의 역입니다.
@end deffn

@geindex putp() (curses 모듈)
@anchor{library/curses curses putp}@anchor{34d1}
@deffn {함수} curses.putp (str)

@code{tputs(str, 1, putchar)}와 동등합니다; 현재 터미널에 대해 지정된 terminfo 기능의 값을 내보냅니다. @ref{34d1,,putp()}의 출력은 항상 표준 출력을 향함에 유의하십시오.
@end deffn

@geindex qiflush() (curses 모듈)
@anchor{library/curses curses qiflush}@anchor{34d2}
@deffn {함수} curses.qiflush ([flag])

`flag'가 @code{False}이면, 효과는 @ref{34cf,,noqiflush()}를 호출하는 것과 같습니다. `flag'가 @code{True}이거나, 인자가 제공되지 않으면, 이러한 제어 문자를 읽을 때 큐가 플러시 됩니다.
@end deffn

@geindex raw() (curses 모듈)
@anchor{library/curses curses raw}@anchor{3499}
@deffn {함수} curses.raw ()

원시(raw) 모드로 들어갑니다. 원시 모드에서는, 일반 줄 버퍼링과 인터럽트, 종료, 일시 중단 및 흐름 제어 키 처리가 꺼집니다; curses 입력 함수로 문자가 한 번에 하나씩 제시됩니다.
@end deffn

@geindex reset_prog_mode() (curses 모듈)
@anchor{library/curses curses reset_prog_mode}@anchor{34a0}
@deffn {함수} curses.reset_prog_mode ()

@ref{349f,,def_prog_mode()}로 이전에 저장한 대로, 터미널을 “프로그램(program)” 모드로 복원합니다.
@end deffn

@geindex reset_shell_mode() (curses 모듈)
@anchor{library/curses curses reset_shell_mode}@anchor{34a2}
@deffn {함수} curses.reset_shell_mode ()

@ref{34a1,,def_shell_mode()}로 이전에 저장한 대로, 터미널을 “셸(shell)” 모드로 복원합니다.
@end deffn

@geindex resetty() (curses 모듈)
@anchor{library/curses curses resetty}@anchor{34d3}
@deffn {함수} curses.resetty ()

터미널 모드의 상태를 @ref{34d4,,savetty()}에 대한 마지막 호출 때의 상태로 복원합니다.
@end deffn

@geindex resize_term() (curses 모듈)
@anchor{library/curses curses resize_term}@anchor{1931}
@deffn {함수} curses.resize_term (nlines, ncols)

@ref{1930,,resizeterm()}이 사용하는 백 엔드 함수로, 대부분의 작업을 수행합니다; 창 크기를 조정할 때, @ref{1931,,resize_term()}은 확장되는 영역을 공백으로 채웁니다. 호출하는 응용 프로그램은 이러한 영역을 적절한 데이터로 채워야 합니다. @code{resize_term()} 함수는 모든 창의 크기를 조정하려고 합니다. 그러나, 패드의 호출 규칙으로 인해, 응용 프로그램과의 추가 상호 작용 없이 이들의 크기를 조정할 수 없습니다.
@end deffn

@geindex resizeterm() (curses 모듈)
@anchor{library/curses curses resizeterm}@anchor{1930}
@deffn {함수} curses.resizeterm (nlines, ncols)

표준과 현재 창의 크기를 지정된 크기로 조정하고, 창 크기를 기록하는 curses 라이브러리에서 사용하는 다른 관리 데이터를 조정합니다 (특히 SIGWINCH 처리기).
@end deffn

@geindex savetty() (curses 모듈)
@anchor{library/curses curses savetty}@anchor{34d4}
@deffn {함수} curses.savetty ()

터미널 모드의 현재 상태를 @ref{34d3,,resetty()}에서 사용 가능한 버퍼에 저장합니다.
@end deffn

@geindex get_escdelay() (curses 모듈)
@anchor{library/curses curses get_escdelay}@anchor{aec}
@deffn {함수} curses.get_escdelay ()

@ref{aed,,set_escdelay()}로 설정된 값을 가져옵니다.


Added in version 3.9.

@end deffn

@geindex set_escdelay() (curses 모듈)
@anchor{library/curses curses set_escdelay}@anchor{aed}
@deffn {함수} curses.set_escdelay (ms)

키보드에 입력된 개별 이스케이프 문자와 커서와 기능키로 전송된 이스케이프 시퀀스를 구별하기 위해, 이스케이프 문자를 읽은 후 기다릴 밀리초 수를 설정합니다.


Added in version 3.9.

@end deffn

@geindex get_tabsize() (curses 모듈)
@anchor{library/curses curses get_tabsize}@anchor{aee}
@deffn {함수} curses.get_tabsize ()

@ref{aef,,set_tabsize()}로 설정된 값을 가져옵니다.


Added in version 3.9.

@end deffn

@geindex set_tabsize() (curses 모듈)
@anchor{library/curses curses set_tabsize}@anchor{aef}
@deffn {함수} curses.set_tabsize (size)

탭을 창에 추가해서 탭 문자를 스페이스로 변환할 때 curses 라이브러리가 사용하는 열 수를 설정합니다.


Added in version 3.9.

@end deffn

@geindex setsyx() (curses 모듈)
@anchor{library/curses curses setsyx}@anchor{34d5}
@deffn {함수} curses.setsyx (y, x)

가상 화면 커서를 `y', `x'로 설정합니다. `y'와 `x'가 모두 @code{-1}이면, @ref{34b9,,leaveok}는 @code{True}로 설정됩니다.
@end deffn

@geindex setupterm() (curses 모듈)
@anchor{library/curses curses setupterm}@anchor{34d6}
@deffn {함수} curses.setupterm (term=None, fd=-1)

터미널을 초기화합니다. `term'은 터미널 이름을 제공하는 문자열이거나 @code{None}입니다; 생략되거나 @code{None}이면, 
@geindex TERM
@geindex 환경 변수; TERM
@code{TERM} 환경 변수의 값이 사용됩니다. `fd'는 초기화 시퀀스가 전송될 파일 기술자입니다; 제공되지 않거나 @code{-1}이면, @code{sys.stdout}의 파일 기술자가 사용됩니다.
@end deffn

@geindex start_color() (curses 모듈)
@anchor{library/curses curses start_color}@anchor{34d7}
@deffn {함수} curses.start_color ()

프로그래머가 색상을 사용하려면, 다른 색상 조작 루틴을 호출하기 전에 호출해야 합니다. @ref{1910,,initscr()} 직후 이 루틴을 호출하는 것이 좋습니다.

@code{start_color()} initializes eight basic colors (black, red,  green, yellow,
blue, magenta, cyan, and white), and two global variables in the @code{curses}
module, @ref{34d8,,COLORS} and @ref{34d9,,COLOR_PAIRS}, containing the maximum number
of colors and color-pairs the terminal can support.  It also restores the colors
on the terminal to the values they had when the terminal was just turned on.
@end deffn

@geindex termattrs() (curses 모듈)
@anchor{library/curses curses termattrs}@anchor{34da}
@deffn {함수} curses.termattrs ()

터미널이 지원하는 모든 비디오 속성의 논리적 OR를 반환합니다. 이 정보는 curses 프로그램이 화면 모양을 완전히 제어해야 할 때 유용합니다.
@end deffn

@geindex termname() (curses 모듈)
@anchor{library/curses curses termname}@anchor{34db}
@deffn {함수} curses.termname ()

환경 변수 
@geindex TERM
@geindex 환경 변수; TERM
@code{TERM}의 값을 14자로 잘린 바이트열 객체로 반환합니다.
@end deffn

@geindex tigetflag() (curses 모듈)
@anchor{library/curses curses tigetflag}@anchor{34dc}
@deffn {함수} curses.tigetflag (capname)

terminfo 기능 이름 `capname'에 해당하는 불리언 기능의 값을 정수로 반환합니다. `capname'이 불리언 기능이 아니면 @code{-1} 값을, 터미널 설명에서 취소되었거나 빠졌으면 @code{0}을 반환합니다.
@end deffn

@geindex tigetnum() (curses 모듈)
@anchor{library/curses curses tigetnum}@anchor{34dd}
@deffn {함수} curses.tigetnum (capname)

terminfo 기능 이름 `capname'에 해당하는 숫자 기능의 값을 정수로 반환합니다. `capname'이 숫자 기능이 아니면 @code{-2} 값을, 터미널 설명에서 취소되었거나 빠졌으면 @code{-1}을 반환합니다.
@end deffn

@geindex tigetstr() (curses 모듈)
@anchor{library/curses curses tigetstr}@anchor{34de}
@deffn {함수} curses.tigetstr (capname)

terminfo 기능 이름 `capname'에 해당하는 문자열 기능의 값을 바이트열 객체로 반환합니다. `capname'이 terminfo “문자열 기능”이 아니거나, 터미널 설명에서 취소되었거나 빠졌으면 @code{None}을 반환합니다.
@end deffn

@geindex tparm() (curses 모듈)
@anchor{library/curses curses tparm}@anchor{34df}
@deffn {함수} curses.tparm (str[, ...])

제공된 매개 변수를 사용하여 바이트열 객체 `str'을 인스턴스 화합니다. 여기서 `str'은 terminfo 데이터베이스에서 얻은 매개 변수화된 문자열이어야 합니다. 예를 들어 @code{tparm(tigetstr("cup"), 5, 3)}은 @code{b'\033[6;4H'}가 될 수 있습니다, 정확한 결과는 터미널 유형에 따라 다릅니다.
@end deffn

@geindex typeahead() (curses 모듈)
@anchor{library/curses curses typeahead}@anchor{34e0}
@deffn {함수} curses.typeahead (fd)

파일 기술자 `fd'가 선행 입력 검사(typeahead checking)에 사용되도록 지정합니다. `fd'가 @code{-1}이면, 선행 입력 검사가 수행되지 않습니다.

curses 라이브러리는 화면을 갱신하는 동안 정기적으로 선행 입력을 들여다보고 “라인 브레이크 아웃 최적화(line-breakout optimization)”를 수행합니다. 입력이 발견되고, 그것이 tty에서 왔으면, refresh나 doupdate가 다시 호출될 때까지 현재 갱신을 연기해서, 앞서 입력된 명령에 더 빠르게 응답 할 수 있도록 합니다. 이 함수를 사용하면 선행 입력 검사를 위해 다른 파일 기술자를 지정할 수 있습니다.
@end deffn

@geindex unctrl() (curses 모듈)
@anchor{library/curses curses unctrl}@anchor{34e1}
@deffn {함수} curses.unctrl (ch)

문자 `ch'의 인쇄 가능한 표현인 바이트열 객체를 반환합니다. 제어 문자는 캐럿과 그 뒤에 오는 문자로 표시됩니다, 예를 들어 @code{b'^C'}. 인쇄 문자는 그대로 남아 있습니다.
@end deffn

@geindex ungetch() (curses 모듈)
@anchor{library/curses curses ungetch}@anchor{34e2}
@deffn {함수} curses.ungetch (ch)

다음 @ref{1828,,getch()}가 반환하도록 `ch'를 푸시합니다.

@cartouche
@quotation 참고 
@code{getch()}가 호출되기 전에 하나의 `ch' 만 푸시할 수 있습니다.
@end quotation
@end cartouche
@end deffn

@geindex update_lines_cols() (curses 모듈)
@anchor{library/curses curses update_lines_cols}@anchor{fea}
@deffn {함수} curses.update_lines_cols ()

@ref{feb,,LINES}와 @ref{fec,,COLS} 모듈 변수를 갱신합니다. 수동 화면 크기 조정을 감지하는 데 유용합니다.


Added in version 3.5.

@end deffn

@geindex unget_wch() (curses 모듈)
@anchor{library/curses curses unget_wch}@anchor{129d}
@deffn {함수} curses.unget_wch (ch)

다음 @ref{129c,,get_wch()}가 반환하도록 `ch'를 푸시합니다.

@cartouche
@quotation 참고 
@code{get_wch()}가 호출되기 전에 하나의 `ch' 만 푸시할 수 있습니다.
@end quotation
@end cartouche


Added in version 3.3.

@end deffn

@geindex ungetmouse() (curses 모듈)
@anchor{library/curses curses ungetmouse}@anchor{34e3}
@deffn {함수} curses.ungetmouse (id, x, y, z, bstate)

주어진 상태 데이터와 결합하여, @ref{34af,,KEY_MOUSE} 이벤트를 입력 큐로 푸시합니다.
@end deffn

@geindex use_env() (curses 모듈)
@anchor{library/curses curses use_env}@anchor{34e4}
@deffn {함수} curses.use_env (flag)

사용되면, 이 함수는 @ref{1910,,initscr()}이나 newterm을 호출하기 전에 호출해야 합니다. `flag'가 @code{False}이면, 환경 변수 
@geindex LINES
@geindex 환경 변수; LINES
@code{LINES}와 
@geindex COLUMNS
@geindex 환경 변수; COLUMNS
@code{COLUMNS}(기본적으로 사용됩니다)가 설정되어 있거나, 창에서 curses가 실행 중인 경우(이때 기본 동작은 
@geindex LINES
@geindex 환경 변수; LINES
@code{LINES}와 
@geindex COLUMNS
@geindex 환경 변수; COLUMNS
@code{COLUMNS}가 설정되지 않았으면 창 크기를 사용하는 것입니다)에도 terminfo 데이터베이스에 지정된 행(lines)과 열(columns)의 값이 사용됩니다.
@end deffn

@geindex use_default_colors() (curses 모듈)
@anchor{library/curses curses use_default_colors}@anchor{1f7}
@deffn {함수} curses.use_default_colors ()

Equivalent to @code{assume_default_colors(-1, -1)}.
@end deffn

@geindex wrapper() (curses 모듈)
@anchor{library/curses curses wrapper}@anchor{c72}
@deffn {함수} curses.wrapper (func, /, *args, **kwargs)

curses를 초기화하고 다른 콜러블 객체 `func'를 호출하는데, 이 콜러블은 curses를 사용하는 응용 프로그램의 나머지 부분이어야 합니다. 응용 프로그램에서 예외가 발생하면, 이 함수는 예외를 다시 발생시키고 트레이스백을 생성하기 전에 터미널을 정상 상태로 복원합니다. 콜러블 객체 `func'는 메인 창 ‘stdscr’을 첫 번째 인자로 전달받고 @code{wrapper()}로 전달된 다른 모든 인자가 그 뒤를 따릅니다. `func'를 호출하기 전에, @code{wrapper()}는 cbreak 모드를 켜고, 반향을 끄고, 터미널 키패드를 활성화하고, 터미널에 색상이 지원되면 색상을 초기화합니다. 빠져나갈 때 (정상인지 예외로 인한 것인지 관계없이) 요리된(cooked) 모드를 복원하고, 반향을 켜고, 터미널 키패드를 비활성화합니다.
@end deffn

@node 창 객체,상수<6>,함수<5>,curses — 문자 셀 디스플레이를 위한 터미널 처리
@anchor{library/curses curses-window-objects}@anchor{198a}@anchor{library/curses window-objects}@anchor{34e5}
@subsubsection 창 객체


@geindex window (curses 클래스)
@anchor{library/curses curses window}@anchor{129a}
@deffn {클래스} curses.window

위의 @ref{1910,,initscr()}과 @ref{34cb,,newwin()}에 의해 반환된 창 객체에는 다음과 같은 메서드와 어트리뷰트가 있습니다:
@end deffn

@geindex addch() (curses.window 메서드)
@anchor{library/curses curses window addch}@anchor{34e6}
@deffn {메서드} window.addch (ch[, attr])

@deffnx {메서드} window.addch (y, x, ch[, attr])

속성 `attr'로 @code{(y, x)}에 문자 `ch'를 그려서, 그 위치에 이전에 그린 문자를 덮어씁니다. 기본적으로, 문자 위치와 속성은 창 객체의 현재 설정입니다.

@cartouche
@quotation 참고 
창, 하위 창(subwindow) 또는 패드 외부에 쓰면 @ref{3493,,curses.error}가 발생합니다. 창, 하위 창 또는 패드의 오른쪽 하단에 쓰려고 하면 문자가 인쇄된 후 예외가 발생합니다.
@end quotation
@end cartouche
@end deffn

@geindex addnstr() (curses.window 메서드)
@anchor{library/curses curses window addnstr}@anchor{34e7}
@deffn {메서드} window.addnstr (str, n[, attr])

@deffnx {메서드} window.addnstr (y, x, str, n[, attr])

@code{(y, x)}에 문자열 `str'의 최대 `n' 문자를 속성 `attr'로 그려, 이전 디스플레이의 내용을 덮어씁니다.
@end deffn

@geindex addstr() (curses.window 메서드)
@anchor{library/curses curses window addstr}@anchor{34a5}
@deffn {메서드} window.addstr (str[, attr])

@deffnx {메서드} window.addstr (y, x, str[, attr])

@code{(y, x)}에 문자열 `str'을 속성 `attr'로 그려, 이전 디스플레이의 내용을 덮어씁니다.

@cartouche
@quotation 참고 

@itemize *

@item 
창, 하위 창 또는 패드 외부에 쓰면 @ref{3493,,curses.error}가 발생합니다. 창, 하위 창 또는 패드의 오른쪽 하단에 쓰려고 하면 문자열이 인쇄된 후 예외가 발생합니다.

@item 
이 파이썬 모듈의 백 엔드인 ncurses에 있는 버그@footnote{https://bugs.python.org/issue35924}가 창 크기를 조정할 때 세그멘테이션 오류를 유발할 수 있습니다. 이것은 ncurses-6.1-20190511에서 수정되었습니다. 이전 ncurses에 갇혀 있다면, 줄 바꿈이 포함된 `str'로 @ref{34a5,,addstr()}을 호출하지 않으면 트리거를 피할 수 있습니다. 대신, 줄마다 @code{addstr()}을 따로 호출하십시오.
@end itemize
@end quotation
@end cartouche
@end deffn

@geindex attroff() (curses.window 메서드)
@anchor{library/curses curses window attroff}@anchor{34e8}
@deffn {메서드} window.attroff (attr)

현재 창에 대한 모든 쓰기에 적용된 “배경(background)” 집합에서 속성 `attr'을 제거합니다.
@end deffn

@geindex attron() (curses.window 메서드)
@anchor{library/curses curses window attron}@anchor{34e9}
@deffn {메서드} window.attron (attr)

Add attribute `attr' to the “background” set applied to all writes to the
current window.
@end deffn

@geindex attrset() (curses.window 메서드)
@anchor{library/curses curses window attrset}@anchor{34ea}
@deffn {메서드} window.attrset (attr)

속성의 “배경(background)” 집합을 `attr'로 설정합니다. 이 집합은 처음에 @code{0}입니다 (속성 없음).
@end deffn

@geindex bkgd() (curses.window 메서드)
@anchor{library/curses curses window bkgd}@anchor{34eb}
@deffn {메서드} window.bkgd (ch[, attr])

창의 배경 속성을 `attr' 속성을 가진 문자 `ch'로 설정합니다. 그런 다음 해당 창의 모든 문자 위치에 변경 사항이 적용됩니다:


@itemize *

@item 
창의 모든 문자 속성이 새 배경 속성으로 변경됩니다.

@item 
이전 배경 문자가 나타날 때마다, 새 배경 문자로 변경됩니다.
@end itemize
@end deffn

@geindex bkgdset() (curses.window 메서드)
@anchor{library/curses curses window bkgdset}@anchor{34ec}
@deffn {메서드} window.bkgdset (ch[, attr])

창의 배경을 설정합니다. 창의 배경은 문자와 속성의 모든 조합으로 구성됩니다. 배경의 속성 부분은 창에 쓰인 모든 비 공백 문자와 결합(OR)합니다. 배경의 문자와 속성 부분은 모두 공백 문자와 결합합니다. 배경은 문자의 속성이 되고 스크롤과 줄/문자 삽입/삭제 연산을 통해 문자와 함께 이동합니다.
@end deffn

@geindex border() (curses.window 메서드)
@anchor{library/curses curses window border}@anchor{34ed}
@deffn {메서드} window.border ([ls[, rs[, ts[, bs[, tl[, tr[, bl[, br]]]]]]]])

창의 가장자리 주위에 테두리를 그립니다. 각 매개 변수는 테두리의 특정 부분에 사용할 문자를 지정합니다; 자세한 내용은 아래 표를 참조하십시오.

@cartouche
@quotation 참고 
모든 매개 변수의 @code{0} 값은 해당 매개 변수에 기본 문자가 사용되도록 합니다. 키워드 매개 변수는 사용할 수 `없습니다'. 기본값은 이 표에 나열되어 있습니다:
@end quotation
@end cartouche


@multitable {xxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

매개 변수

@tab

설명

@tab

기본값

@item

`ls'

@tab

좌변

@tab

@ref{34ee,,ACS_VLINE}

@item

`rs'

@tab

우변

@tab

@ref{34ee,,ACS_VLINE}

@item

`ts'

@tab

상단

@tab

@ref{34ef,,ACS_HLINE}

@item

`bs'

@tab

하단

@tab

@ref{34ef,,ACS_HLINE}

@item

`tl'

@tab

왼쪽 위 모서리

@tab

@ref{34f0,,ACS_ULCORNER}

@item

`tr'

@tab

오른쪽 위 모서리

@tab

@ref{34f1,,ACS_URCORNER}

@item

`bl'

@tab

왼쪽 아래 모서리

@tab

@ref{34f2,,ACS_LLCORNER}

@item

`br'

@tab

오른쪽 아래 모서리

@tab

@ref{34f3,,ACS_LRCORNER}

@end multitable

@end deffn

@geindex box() (curses.window 메서드)
@anchor{library/curses curses window box}@anchor{34f4}
@deffn {메서드} window.box ([vertch, horch])

@ref{34ed,,border()}와 유사하지만, `ls'와 `rs'가 모두 `vertch'이고 `ts'와 `bs'가 모두 `horch'입니다. 이 함수는 항상 기본 모서리 문자를 사용합니다.
@end deffn

@geindex chgat() (curses.window 메서드)
@anchor{library/curses curses window chgat}@anchor{34f5}
@deffn {메서드} window.chgat (attr)

@deffnx {메서드} window.chgat (num, attr)

@deffnx {메서드} window.chgat (y, x, attr)

@deffnx {메서드} window.chgat (y, x, num, attr)

현재 커서 위치나 제공되면 @code{(y, x)} 위치에 `num' 문자의 속성을 설정합니다. `num'이 제공되지 않거나 @code{-1}이면, 줄 끝까지의 모든 문자에 속성이 설정됩니다. 이 함수는 제공되면 커서를 @code{(y, x)} 위치로 이동합니다. 변경된 줄을 @ref{34f6,,touchline()} 메서드를 사용하여 터치해서 다음 창 refresh로 내용이 다시 표시됩니다.
@end deffn

@geindex clear() (curses.window 메서드)
@anchor{library/curses curses window clear}@anchor{34f7}
@deffn {메서드} window.clear ()

@ref{34f8,,erase()}와 유사하지만, @ref{34a7,,refresh()}를 다음에 호출할 때 전체 창이 다시 그려집니다.
@end deffn

@geindex clearok() (curses.window 메서드)
@anchor{library/curses curses window clearok}@anchor{34f9}
@deffn {메서드} window.clearok (flag)

`flag'가 @code{True}이면, @ref{34a7,,refresh()}에 대한 다음 호출은 창을 완전히 지웁니다.
@end deffn

@geindex clrtobot() (curses.window 메서드)
@anchor{library/curses curses window clrtobot}@anchor{34fa}
@deffn {메서드} window.clrtobot ()

커서에서 창끝까지 지웁니다: 커서 아래의 모든 줄이 삭제된 다음, @ref{34fb,,clrtoeol()}과 동등한 것이 수행됩니다.
@end deffn

@geindex clrtoeol() (curses.window 메서드)
@anchor{library/curses curses window clrtoeol}@anchor{34fb}
@deffn {메서드} window.clrtoeol ()

커서에서 줄 끝까지 지웁니다.
@end deffn

@geindex cursyncup() (curses.window 메서드)
@anchor{library/curses curses window cursyncup}@anchor{34fc}
@deffn {메서드} window.cursyncup ()

창의 현재 커서 위치를 반영하도록 창의 모든 조상의 현재 커서 위치를 갱신합니다.
@end deffn

@geindex delch() (curses.window 메서드)
@anchor{library/curses curses window delch}@anchor{34fd}
@deffn {메서드} window.delch ([y, x])

@code{(y, x)}에서 문자를 삭제합니다.
@end deffn

@geindex deleteln() (curses.window 메서드)
@anchor{library/curses curses window deleteln}@anchor{34fe}
@deffn {메서드} window.deleteln ()

커서 아래의 줄을 삭제합니다. 다음 줄은 모두 한 줄씩 위로 이동합니다.
@end deffn

@geindex derwin() (curses.window 메서드)
@anchor{library/curses curses window derwin}@anchor{34ff}
@deffn {메서드} window.derwin (begin_y, begin_x)

@deffnx {메서드} window.derwin (nlines, ncols, begin_y, begin_x)

“창 파생(derive window)”의 약어인 @ref{34ff,,derwin()}은 @ref{3500,,subwin()}을 호출하는 것과 같지만, `begin_y'와 `begin_x'가 전체 화면에 상대적이 아니라 창의 원점에 상대적이라는 차이가 있습니다. 파생된 창에 대한 창 객체를 반환합니다.
@end deffn

@geindex echochar() (curses.window 메서드)
@anchor{library/curses curses window echochar}@anchor{3501}
@deffn {메서드} window.echochar (ch[, attr])

`attr' 속성을 가진 문자 `ch'를 추가하고, 즉시 창에서 @ref{34a7,,refresh()}를 호출합니다.
@end deffn

@geindex enclose() (curses.window 메서드)
@anchor{library/curses curses window enclose}@anchor{1c8e}
@deffn {메서드} window.enclose (y, x)

주어진 화면 상대적인 문자 셀 좌표 쌍이 주어진 창에 속하는지를 검사하고, @code{True}나 @code{False}를 반환합니다. 마우스 이벤트의 위치를 포함하는 화면 창의 부분 집합을 결정하는 데 유용합니다.


버전 3.10에서 변경: Previously it returned @code{1} or @code{0} instead of @code{True} or @code{False}.

@end deffn

@geindex encoding (curses.window의 속성)
@anchor{library/curses curses window encoding}@anchor{129b}
@deffn {속성} window.encoding

메서드 인자(유니코드 문자열과 문자)를 인코딩하는 데 사용되는 인코딩. encoding 어트리뷰트는 하위 창(subwindow)을 만들 때 (예를 들어 @ref{3500,,window.subwin()}으로) 부모 창에서 상속됩니다. 기본적으로, 현재 로케일 인코딩이 사용됩니다 (@ref{329,,locale.getencoding()}를 참조하십시오).


Added in version 3.3.

@end deffn

@geindex erase() (curses.window 메서드)
@anchor{library/curses curses window erase}@anchor{34f8}
@deffn {메서드} window.erase ()

창을 지웁니다.
@end deffn

@geindex getbegyx() (curses.window 메서드)
@anchor{library/curses curses window getbegyx}@anchor{3502}
@deffn {메서드} window.getbegyx ()

왼쪽 위 모서리 좌표의 튜플 @code{(y, x)}를 반환합니다.
@end deffn

@geindex getbkgd() (curses.window 메서드)
@anchor{library/curses curses window getbkgd}@anchor{3503}
@deffn {메서드} window.getbkgd ()

주어진 창의 현재 배경 문자/속성 쌍을 반환합니다.
@end deffn

@geindex getch() (curses.window 메서드)
@anchor{library/curses curses window getch}@anchor{1828}
@deffn {메서드} window.getch ([y, x])

문자를 얻습니다. 반환된 정수는 ASCII 범위일 필요가 `없음에' 유의하십시오: 기능키, 키패드 키 등은 255보다 큰 숫자로 표시됩니다. 지연 없는(no-delay) 모드에서, 입력이 없으면 @code{-1}을 반환하고, 그렇지 않으면 키가 눌릴 때까지 기다립니다.
@end deffn

@geindex get_wch() (curses.window 메서드)
@anchor{library/curses curses window get_wch}@anchor{129c}
@deffn {메서드} window.get_wch ([y, x])

와이드 문자(wide character)를 얻습니다. 대부분의 키에 대해서는 문자를 반환하고, 기능키, 키패드 키 및 기타 특수키에 대해서는 정수를 반환합니다. 지연 없는(no-delay) 모드에서, 입력이 없으면 예외를 발생시킵니다.


Added in version 3.3.

@end deffn

@geindex getkey() (curses.window 메서드)
@anchor{library/curses curses window getkey}@anchor{3504}
@deffn {메서드} window.getkey ([y, x])

문자를 얻습니다. @ref{1828,,getch()}처럼 정수를 반환하는 대신 문자열을 반환합니다. 기능키, 키패드 키 및 기타 특수키는 키 이름이 포함된 멀티 바이트 문자열을 반환합니다. 지연 없는(no-delay) 모드에서, 입력이 없으면 예외를 발생시킵니다.
@end deffn

@geindex getmaxyx() (curses.window 메서드)
@anchor{library/curses curses window getmaxyx}@anchor{3505}
@deffn {메서드} window.getmaxyx ()

창의 높이와 너비의 튜플 @code{(y, x)}를 반환합니다.
@end deffn

@geindex getparyx() (curses.window 메서드)
@anchor{library/curses curses window getparyx}@anchor{3506}
@deffn {메서드} window.getparyx ()

부모 창에 대해 상대적인 이 창의 시작 좌표를 튜플 @code{(y, x)}로 반환합니다. 이 창에 부모가 없으면 @code{(-1, -1)}을 반환합니다.
@end deffn

@geindex getstr() (curses.window 메서드)
@anchor{library/curses curses window getstr}@anchor{1840}
@deffn {메서드} window.getstr ()

@deffnx {메서드} window.getstr (n)

@deffnx {메서드} window.getstr (y, x)

@deffnx {메서드} window.getstr (y, x, n)

Read a bytes object from the user, with primitive line editing capacity.
The maximum value for `n' is 2047.


버전 3.14에서 변경: The maximum value for `n' was increased from 1023 to 2047.

@end deffn

@geindex getyx() (curses.window 메서드)
@anchor{library/curses curses window getyx}@anchor{3507}
@deffn {메서드} window.getyx ()

창의 왼쪽 위 모서리에 상대적인 현재 커서 위치의 튜플 @code{(y, x)}를 반환합니다.
@end deffn

@geindex hline() (curses.window 메서드)
@anchor{library/curses curses window hline}@anchor{3508}
@deffn {메서드} window.hline (ch, n)

@deffnx {메서드} window.hline (y, x, ch, n)

문자 `ch'로 구성된 길이 `n'의 @code{(y, x)}에서 시작하는 수평선을 표시합니다.
@end deffn

@geindex idcok() (curses.window 메서드)
@anchor{library/curses curses window idcok}@anchor{3509}
@deffn {메서드} window.idcok (flag)

`flag'가 @code{False}이면, curses는 더는 터미널의 하드웨어 문자 삽입/삭제 기능 사용을 고려하지 않습니다; `flag'가 @code{True}이면, 문자 삽입과 삭제 사용이 활성화됩니다. curses가 처음 초기화될 때, 기본적으로 문자 삽입/삭제 사용이 활성화됩니다.
@end deffn

@geindex idlok() (curses.window 메서드)
@anchor{library/curses curses window idlok}@anchor{350a}
@deffn {메서드} window.idlok (flag)

If `flag' is @code{True}, @code{curses} will try and use hardware line
editing facilities. Otherwise, line insertion/deletion are disabled.
@end deffn

@geindex immedok() (curses.window 메서드)
@anchor{library/curses curses window immedok}@anchor{350b}
@deffn {메서드} window.immedok (flag)

`flag'가 @code{True}이면, 창 이미지의 모든 변경이 자동으로 창을 새로 고칩니다; 더는 @ref{34a7,,refresh()}를 직접 호출할 필요가 없습니다. 그러나, wrefresh 호출이 반복되어, 성능이 크게 저하될 수 있습니다. 이 옵션은 기본적으로 비활성화되어 있습니다.
@end deffn

@geindex inch() (curses.window 메서드)
@anchor{library/curses curses window inch}@anchor{350c}
@deffn {메서드} window.inch ([y, x])

창의 주어진 위치에 있는 문자를 반환합니다. 하위 8비트는 문자이고, 상위 비트는 속성입니다.
@end deffn

@geindex insch() (curses.window 메서드)
@anchor{library/curses curses window insch}@anchor{350d}
@deffn {메서드} window.insch (ch[, attr])

@deffnx {메서드} window.insch (y, x, ch[, attr])

속성 `attr'로 @code{(y, x)}에 문자 `ch'를 그리면서, `x' 위치에서 한 문자씩 오른쪽으로 줄을 이동합니다.
@end deffn

@geindex insdelln() (curses.window 메서드)
@anchor{library/curses curses window insdelln}@anchor{350e}
@deffn {메서드} window.insdelln (nlines)

현재 줄 위의 지정된 창에 `nlines' 줄을 삽입합니다. `nlines' 바닥 줄은 손실됩니다. 음의 `nlines'의 경우, 커서 아래에 있는 줄에서 시작하여 `nlines' 줄을 삭제하고, 나머지 줄을 위로 이동합니다. 바닥 `nlines' 줄이 지워집니다. 현재 커서 위치는 같게 유지됩니다.
@end deffn

@geindex insertln() (curses.window 메서드)
@anchor{library/curses curses window insertln}@anchor{350f}
@deffn {메서드} window.insertln ()

커서 아래에 빈 줄을 삽입합니다. 그다음 모든 줄은 한 줄 아래로 이동합니다.
@end deffn

@geindex insnstr() (curses.window 메서드)
@anchor{library/curses curses window insnstr}@anchor{3510}
@deffn {메서드} window.insnstr (str, n[, attr])

@deffnx {메서드} window.insnstr (y, x, str, n[, attr])

커서 아래의 문자 앞에 최대 `n' 문자까지 문자열(줄에 맞는 최대 문자)을 삽입합니다. `n'이 0이거나 음수이면, 전체 문자열이 삽입됩니다. 커서 오른쪽의 모든 문자가 오른쪽으로 이동하고, 줄의 가장 오른쪽 문자들이 손실됩니다. 커서 위치는 변경되지 않습니다 (지정되면, `y', `x'로 이동한 후에).
@end deffn

@geindex insstr() (curses.window 메서드)
@anchor{library/curses curses window insstr}@anchor{3511}
@deffn {메서드} window.insstr (str[, attr])

@deffnx {메서드} window.insstr (y, x, str[, attr])

커서 아래의 문자 앞에 문자열(줄에 맞는 최대 문자)을 삽입합니다. 커서 오른쪽의 모든 문자가 오른쪽으로 이동하고, 줄의 가장 오른쪽 문자들이 손실됩니다. 커서 위치는 변경되지 않습니다 (지정되면, `y', `x'로 이동한 후에).
@end deffn

@geindex instr() (curses.window 메서드)
@anchor{library/curses curses window instr}@anchor{183f}
@deffn {메서드} window.instr ([n])

@deffnx {메서드} window.instr (y, x[, n])

Return a bytes object of characters, extracted from the window starting at the
current cursor position, or at `y', `x' if specified. Attributes are stripped
from the characters.  If `n' is specified, @code{instr()} returns a string
at most `n' characters long (exclusive of the trailing NUL).
The maximum value for `n' is 2047.


버전 3.14에서 변경: The maximum value for `n' was increased from 1023 to 2047.

@end deffn

@geindex is_linetouched() (curses.window 메서드)
@anchor{library/curses curses window is_linetouched}@anchor{3512}
@deffn {메서드} window.is_linetouched (line)

@ref{34a7,,refresh()}에 대한 마지막 호출 이후 지정된 줄이 수정되었으면 @code{True}를 반환합니다; 그렇지 않으면 @code{False}를 반환합니다. 주어진 창에서 `line'이 유효하지 않으면 @ref{3493,,curses.error} 예외를 발생시킵니다.
@end deffn

@geindex is_wintouched() (curses.window 메서드)
@anchor{library/curses curses window is_wintouched}@anchor{3513}
@deffn {메서드} window.is_wintouched ()

@ref{34a7,,refresh()}에 대한 마지막 호출 이후 지정된 창이 수정되었으면 @code{True}를 반환합니다; 그렇지 않으면 @code{False}를 반환합니다.
@end deffn

@geindex keypad() (curses.window 메서드)
@anchor{library/curses curses window keypad}@anchor{3514}
@deffn {메서드} window.keypad (flag)

If `flag' is @code{True}, escape sequences generated by some keys (keypad,  function keys)
will be interpreted by @code{curses}. If `flag' is @code{False}, escape sequences will be
left as is in the input stream.
@end deffn

@geindex leaveok() (curses.window 메서드)
@anchor{library/curses curses window leaveok}@anchor{34b9}
@deffn {메서드} window.leaveok (flag)

`flag'가 @code{True}이면, 커서는 “커서 위치”가 아니라 갱신 중인 위치에 남아 있습니다. 가능하면 커서 이동이 줄어듭니다. 가능하면 커서가 보이지 않게 합니다.

`flag'가 @code{False}이면, 커서는 갱신 후 항상 “커서 위치”에 있게 됩니다.
@end deffn

@geindex move() (curses.window 메서드)
@anchor{library/curses curses window move}@anchor{3515}
@deffn {메서드} window.move (new_y, new_x)

커서를 @code{(new_y, new_x)}로 이동합니다.
@end deffn

@geindex mvderwin() (curses.window 메서드)
@anchor{library/curses curses window mvderwin}@anchor{3516}
@deffn {메서드} window.mvderwin (y, x)

창을 부모 창 내부로 이동합니다. 창의 화면에 상대적인 매개 변수는 변경되지 않습니다. 이 루틴은 부모 창의 다른 부분을 화면에서 같은 물리적 위치에 표시하는 데 사용됩니다.
@end deffn

@geindex mvwin() (curses.window 메서드)
@anchor{library/curses curses window mvwin}@anchor{3517}
@deffn {메서드} window.mvwin (new_y, new_x)

왼쪽 위 모서리가 @code{(new_y, new_x)}가 되도록 창을 이동합니다.
@end deffn

@geindex nodelay() (curses.window 메서드)
@anchor{library/curses curses window nodelay}@anchor{3518}
@deffn {메서드} window.nodelay (flag)

`flag'가 @code{True}이면, @ref{1828,,getch()}가 비 블로킹이 됩니다.
@end deffn

@geindex notimeout() (curses.window 메서드)
@anchor{library/curses curses window notimeout}@anchor{3519}
@deffn {메서드} window.notimeout (flag)

`flag'가 @code{True}이면, 이스케이프 시퀀스가 시간 초과하지 않습니다.

`flag'가 @code{False}이면, 몇 밀리초 후에, 이스케이프 시퀀스가 해석되지 않고, 그대로 입력 스트림에 남아 있습니다.
@end deffn

@geindex noutrefresh() (curses.window 메서드)
@anchor{library/curses curses window noutrefresh}@anchor{34a6}
@deffn {메서드} window.noutrefresh ()

새로 고침을 표시하지만 기다립니다. 이 함수는 원하는 창의 상태를 나타내는 데이터 구조를 갱신하지만, 물리적 화면을 강제로 갱신하지는 않습니다. 이를 위해서는, @ref{34a4,,doupdate()}를 호출하십시오.
@end deffn

@geindex overlay() (curses.window 메서드)
@anchor{library/curses curses window overlay}@anchor{351a}
@deffn {메서드} window.overlay (destwin[, sminrow, smincol, dminrow, dmincol, dmaxrow, dmaxcol])

`destwin' 위에 창을 오버레이 합니다. 창의 크기가 같을 필요는 없으며, 겹치는 영역만 복사됩니다. 이 복사는 비 파괴적인데, 현재 배경 문자가 `destwin'의 이전 내용을 덮어쓰지 않습니다.

복사되는 영역을 세밀하게 제어하기 위해, @ref{351a,,overlay()}의 두 번째 형식을 사용할 수 있습니다. `sminrow'와 `smincol'은 소스 창의 왼쪽 위 좌표이며, 다른 변수들은 대상 창의 사각형을 표시합니다.
@end deffn

@geindex overwrite() (curses.window 메서드)
@anchor{library/curses curses window overwrite}@anchor{351b}
@deffn {메서드} window.overwrite (destwin[, sminrow, smincol, dminrow, dmincol, dmaxrow, dmaxcol])

`destwin' 위에 창을 덮어씁니다. 창의 크기가 같을 필요는 없으며, 이 경우 겹치는 영역만 복사됩니다. 이 복사는 파괴적인데, 현재 배경 문자가 `destwin'의 이전 내용을 덮어씁니다.

복사된 영역을 세밀하게 제어하기 위해, @ref{351b,,overwrite()}의 두 번째 형식을 사용할 수 있습니다. `sminrow'와 `smincol'은 소스 창의 왼쪽 위 좌표이며, 다른 변수들은 대상 창의 사각형을 표시합니다.
@end deffn

@geindex putwin() (curses.window 메서드)
@anchor{library/curses curses window putwin}@anchor{34bb}
@deffn {메서드} window.putwin (file)

창과 연관된 모든 데이터를 제공된 파일 객체에 기록합니다. 이 정보는 나중에 @ref{34ba,,getwin()} 함수를 사용하여 가져올 수 있습니다.
@end deffn

@geindex redrawln() (curses.window 메서드)
@anchor{library/curses curses window redrawln}@anchor{351c}
@deffn {메서드} window.redrawln (beg, num)

`beg' 줄에서 시작하는 `num' 화면 줄이 손상되었으며 다음 @ref{34a7,,refresh()} 호출에서 완전히 다시 그려야 함을 나타냅니다.
@end deffn

@geindex redrawwin() (curses.window 메서드)
@anchor{library/curses curses window redrawwin}@anchor{351d}
@deffn {메서드} window.redrawwin ()

전체 창을 터치하여, 다음 @ref{34a7,,refresh()} 호출에서 완전히 다시 그려지도록 합니다.
@end deffn

@geindex refresh() (curses.window 메서드)
@anchor{library/curses curses window refresh}@anchor{34a7}
@deffn {메서드} window.refresh ([pminrow, pmincol, sminrow, smincol, smaxrow, smaxcol])

화면을 즉시 갱신합니다 (이전 그리기/삭제 메서드와 실제 화면을 동기화합니다).

6개의 선택적 인자는 창이 @ref{34ca,,newpad()}로 만들어진 패드일 때만 지정할 수 있습니다. 추가 매개 변수는 패드와 화면의 어떤 부분이 관련되어 있는지를 나타내기 위해 필요합니다. `pminrow'와 `pmincol'은 패드에서 표시할 사각형의 왼쪽 위 모서리를 지정합니다. `sminrow', `smincol', `smaxrow' 및 `smaxcol'은 화면에 표시할 사각형의 변을 지정합니다. 사각형의 크기가 같아야 해서, 패드에서 표시할 사각형의 오른쪽 아래 모서리는 화면 좌표에서 계산됩니다. 두 사각형 모두 해당 구조 내에 완전히 포함되어야 합니다. `pminrow', `pmincol', `sminrow' 또는 `smincol'의 음수 값은 마치 0인 것처럼 처리됩니다.
@end deffn

@geindex resize() (curses.window 메서드)
@anchor{library/curses curses window resize}@anchor{351e}
@deffn {메서드} window.resize (nlines, ncols)

curses 창의 스토리지를 재할당하여 지정된 값으로 크기를 조정합니다. 두 크기 중 하나가 현재 값보다 크면, 창의 데이터는 현재 배경 변환 (@ref{34ec,,bkgdset()}으로 설정한)을 갖는 공백으로 채워집니다.
@end deffn

@geindex scroll() (curses.window 메서드)
@anchor{library/curses curses window scroll}@anchor{351f}
@deffn {메서드} window.scroll ([lines=1])

화면이나 스크롤 영역을 `lines' 줄 위로 스크롤 합니다.
@end deffn

@geindex scrollok() (curses.window 메서드)
@anchor{library/curses curses window scrollok}@anchor{3520}
@deffn {메서드} window.scrollok (flag)

맨 아래 줄에서의 줄 바꾸기나 마지막 줄의 마지막 문자 입력의 결과로, 창의 커서가 창이나 스크롤 영역의 경계를 벗어날 때 어떻게 할지를 제어합니다. `flag'가 @code{False}이면, 맨 아래 줄에 남습니다. `flag'가 @code{True}이면, 창은 한 줄 위로 스크롤 됩니다. 터미널에서 물리적 스크롤 효과를 얻으려면, @ref{350a,,idlok()}도 호출해야 함에 유의하십시오.
@end deffn

@geindex setscrreg() (curses.window 메서드)
@anchor{library/curses curses window setscrreg}@anchor{3521}
@deffn {메서드} window.setscrreg (top, bottom)

스크롤 영역을 `top' 줄에서 `bottom' 줄로 설정합니다. 모든 스크롤 작업은 이 영역에서 수행됩니다.
@end deffn

@geindex standend() (curses.window 메서드)
@anchor{library/curses curses window standend}@anchor{3522}
@deffn {메서드} window.standend ()

스탠드 아웃(standout) 속성을 끕니다. 일부 터미널에서는 모든 속성을 끄는 부작용이 있습니다.
@end deffn

@geindex standout() (curses.window 메서드)
@anchor{library/curses curses window standout}@anchor{3523}
@deffn {메서드} window.standout ()

속성 `A_STANDOUT'을 켭니다.
@end deffn

@geindex subpad() (curses.window 메서드)
@anchor{library/curses curses window subpad}@anchor{3524}
@deffn {메서드} window.subpad (begin_y, begin_x)

@deffnx {메서드} window.subpad (nlines, ncols, begin_y, begin_x)

왼쪽 위 모서리가 @code{(begin_y, begin_x)}이고, 너비/높이가 `ncols'/`nlines'인 서브 창을 반환합니다.
@end deffn

@geindex subwin() (curses.window 메서드)
@anchor{library/curses curses window subwin}@anchor{3500}
@deffn {메서드} window.subwin (begin_y, begin_x)

@deffnx {메서드} window.subwin (nlines, ncols, begin_y, begin_x)

왼쪽 위 모서리가 @code{(begin_y, begin_x)}이고, 너비/높이가 `ncols'/`nlines'인 서브 창을 반환합니다.

기본적으로, 서브 창은 지정된 위치에서 창의 오른쪽 아래 모서리에 이릅니다.
@end deffn

@geindex syncdown() (curses.window 메서드)
@anchor{library/curses curses window syncdown}@anchor{3525}
@deffn {메서드} window.syncdown ()

조상 창에서 터치된 창의 각 위치를 터치합니다. 이 루틴은 @ref{34a7,,refresh()}에 의해 호출되므로, 수동으로 호출할 필요가 거의 없습니다.
@end deffn

@geindex syncok() (curses.window 메서드)
@anchor{library/curses curses window syncok}@anchor{3526}
@deffn {메서드} window.syncok (flag)

`flag'가 @code{True}이면, 창에 변경 사항이 있을 때마다 @ref{3527,,syncup()}이 자동으로 호출됩니다.
@end deffn

@geindex syncup() (curses.window 메서드)
@anchor{library/curses curses window syncup}@anchor{3527}
@deffn {메서드} window.syncup ()

창에서 변경된 창 조상의 모든 위치를 터치합니다.
@end deffn

@geindex timeout() (curses.window 메서드)
@anchor{library/curses curses window timeout}@anchor{3528}
@deffn {메서드} window.timeout (delay)

창의 블로킹이나 비 블로킹 읽기 동작을 설정합니다. `delay'가 음수이면, 블로킹 읽기가 사용됩니다 (입력을 무한정 기다립니다). `delay'가 0이면, 비 블로킹 읽기가 사용되며, 대기 중인 입력이 없으면 @ref{1828,,getch()}는 @code{-1}을 반환합니다. `delay'가 양수이면, @code{getch()}는 `delay' 밀리초 동안 블록 하고, 해당 시간이 지나도 여전히 입력이 없으면 @code{-1}을 반환합니다.
@end deffn

@geindex touchline() (curses.window 메서드)
@anchor{library/curses curses window touchline}@anchor{34f6}
@deffn {메서드} window.touchline (start, count[, changed])

줄 `start'로 시작하여 `count' 줄이 변경된 것으로 가정합니다. `changed'가 제공되면, 영향을 받는 줄이 변경되었다고 (`changed'@code{=True}) 또는 변경되지 않았다고 (`changed'@code{=False}) 표시할지를 지정합니다.
@end deffn

@geindex touchwin() (curses.window 메서드)
@anchor{library/curses curses window touchwin}@anchor{3529}
@deffn {메서드} window.touchwin ()

그리기 최적화를 위해, 전체 창이 변경된 것으로 가정합니다.
@end deffn

@geindex untouchwin() (curses.window 메서드)
@anchor{library/curses curses window untouchwin}@anchor{352a}
@deffn {메서드} window.untouchwin ()

@ref{34a7,,refresh()}를 마지막으로 호출한 후에 창의 모든 줄을 변경되지 않은 것으로 표시합니다.
@end deffn

@geindex vline() (curses.window 메서드)
@anchor{library/curses curses window vline}@anchor{1afc}
@deffn {메서드} window.vline (ch, n[, attr])

@deffnx {메서드} window.vline (y, x, ch, n[, attr])

`attr' 속성을 가진 문자 `ch'로 구성된 길이 `n'의 @code{(y, x)}에서 시작하는 세로 선을 표시합니다.
@end deffn

@node 상수<6>,,창 객체,curses — 문자 셀 디스플레이를 위한 터미널 처리
@anchor{library/curses constants}@anchor{352b}
@subsubsection 상수


The @code{curses} module defines the following data members:

@geindex ERR (curses 모듈)
@anchor{library/curses curses ERR}@anchor{352c}
@deffn {데이터} curses.ERR

정수를 반환하는 일부 curses 루틴은 (가령 @ref{1828,,getch()}) 실패 시 @ref{352c,,ERR}을 반환합니다.
@end deffn

@geindex OK (curses 모듈)
@anchor{library/curses curses OK}@anchor{352d}
@deffn {데이터} curses.OK

정수를 반환하는 일부 curses 루틴은 (가령 @ref{190f,,napms()}) 성공 시 @ref{352d,,OK}를 반환합니다.
@end deffn

@geindex version (curses 모듈)
@anchor{library/curses curses version}@anchor{352e}
@deffn {데이터} curses.version

모듈의 현재 버전을 나타내는 바이트열 객체.
@end deffn

@geindex ncurses_version (curses 모듈)
@anchor{library/curses curses ncurses_version}@anchor{bd9}
@deffn {데이터} curses.ncurses_version

ncurses 라이브러리 버전의 세 가지 구성 요소를 포함하는 네임드 튜플: `major', `minor' 및 `patch'. 모든 값은 정수입니다. 구성 요소는 이름으로도 액세스 할 수 있어서, @code{curses.ncurses_version[0]}은 @code{curses.ncurses_version.major}와 동등합니다.

가용성: ncurses 라이브러리가 사용된 경우.


Added in version 3.8.

@end deffn

@geindex COLORS (curses 모듈)
@anchor{library/curses curses COLORS}@anchor{34d8}
@deffn {데이터} curses.COLORS

The maximum number of colors the terminal can support.
It is defined only after the call to @ref{34d7,,start_color()}.
@end deffn

@geindex COLOR_PAIRS (curses 모듈)
@anchor{library/curses curses COLOR_PAIRS}@anchor{34d9}
@deffn {데이터} curses.COLOR_PAIRS

The maximum number of color pairs the terminal can support.
It is defined only after the call to @ref{34d7,,start_color()}.
@end deffn

@geindex COLS (curses 모듈)
@anchor{library/curses curses COLS}@anchor{fec}
@deffn {데이터} curses.COLS

The width of the screen, i.e., the number of columns.
It is defined only after the call to @ref{1910,,initscr()}.
Updated by @ref{fea,,update_lines_cols()}, @ref{1930,,resizeterm()} and
@ref{1931,,resize_term()}.
@end deffn

@geindex LINES (curses 모듈)
@anchor{library/curses curses LINES}@anchor{feb}
@deffn {데이터} curses.LINES

The height of the screen, i.e., the number of lines.
It is defined only after the call to @ref{1910,,initscr()}.
Updated by @ref{fea,,update_lines_cols()}, @ref{1930,,resizeterm()} and
@ref{1931,,resize_term()}.
@end deffn

문자 셀 속성을 지정하기 위해 일부 상수를 사용할 수 있습니다. 사용 가능한 정확한 상수는 시스템에 따라 다릅니다.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

속성

@tab

의미

@item

@geindex A_ALTCHARSET (curses 모듈)
@anchor{library/curses curses A_ALTCHARSET}@anchor{352f}
@deffn {데이터} curses.A_ALTCHARSET
@end deffn

@tab

대체 문자 집합 모드

@item

@geindex A_BLINK (curses 모듈)
@anchor{library/curses curses A_BLINK}@anchor{3530}
@deffn {데이터} curses.A_BLINK
@end deffn

@tab

깜박임 모드

@item

@geindex A_BOLD (curses 모듈)
@anchor{library/curses curses A_BOLD}@anchor{3531}
@deffn {데이터} curses.A_BOLD
@end deffn

@tab

볼드 모드

@item

@geindex A_DIM (curses 모듈)
@anchor{library/curses curses A_DIM}@anchor{3532}
@deffn {데이터} curses.A_DIM
@end deffn

@tab

희미한 모드

@item

@geindex A_INVIS (curses 모듈)
@anchor{library/curses curses A_INVIS}@anchor{3533}
@deffn {데이터} curses.A_INVIS
@end deffn

@tab

보이지 않거나 공백 모드

@item

@geindex A_ITALIC (curses 모듈)
@anchor{library/curses curses A_ITALIC}@anchor{3534}
@deffn {데이터} curses.A_ITALIC
@end deffn

@tab

기울임 꼴 모드

@item

@geindex A_NORMAL (curses 모듈)
@anchor{library/curses curses A_NORMAL}@anchor{3494}
@deffn {데이터} curses.A_NORMAL
@end deffn

@tab

일반 속성

@item

@geindex A_PROTECT (curses 모듈)
@anchor{library/curses curses A_PROTECT}@anchor{3535}
@deffn {데이터} curses.A_PROTECT
@end deffn

@tab

보호 모드

@item

@geindex A_REVERSE (curses 모듈)
@anchor{library/curses curses A_REVERSE}@anchor{349c}
@deffn {데이터} curses.A_REVERSE
@end deffn

@tab

배경과 전경색 반전

@item

@geindex A_STANDOUT (curses 모듈)
@anchor{library/curses curses A_STANDOUT}@anchor{349b}
@deffn {데이터} curses.A_STANDOUT
@end deffn

@tab

눈에 띄는 모드

@item

@geindex A_UNDERLINE (curses 모듈)
@anchor{library/curses curses A_UNDERLINE}@anchor{3536}
@deffn {데이터} curses.A_UNDERLINE
@end deffn

@tab

밑줄 모드

@item

@geindex A_HORIZONTAL (curses 모듈)
@anchor{library/curses curses A_HORIZONTAL}@anchor{3537}
@deffn {데이터} curses.A_HORIZONTAL
@end deffn

@tab

수평 하이라이트

@item

@geindex A_LEFT (curses 모듈)
@anchor{library/curses curses A_LEFT}@anchor{3538}
@deffn {데이터} curses.A_LEFT
@end deffn

@tab

왼쪽 하이라이트

@item

@geindex A_LOW (curses 모듈)
@anchor{library/curses curses A_LOW}@anchor{3539}
@deffn {데이터} curses.A_LOW
@end deffn

@tab

낮은 하이라이트

@item

@geindex A_RIGHT (curses 모듈)
@anchor{library/curses curses A_RIGHT}@anchor{353a}
@deffn {데이터} curses.A_RIGHT
@end deffn

@tab

오른쪽 하이라이트

@item

@geindex A_TOP (curses 모듈)
@anchor{library/curses curses A_TOP}@anchor{353b}
@deffn {데이터} curses.A_TOP
@end deffn

@tab

상단 하이라이트

@item

@geindex A_VERTICAL (curses 모듈)
@anchor{library/curses curses A_VERTICAL}@anchor{353c}
@deffn {데이터} curses.A_VERTICAL
@end deffn

@tab

수직 하이라이트

@end multitable



Added in version 3.7: @code{A_ITALIC}이 추가되었습니다.


일부 메서드에서 반환한 해당 속성을 추출하기 위해 여러 상수를 사용할 수 있습니다.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

비트 마스크

@tab

의미

@item

@geindex A_ATTRIBUTES (curses 모듈)
@anchor{library/curses curses A_ATTRIBUTES}@anchor{353d}
@deffn {데이터} curses.A_ATTRIBUTES
@end deffn

@tab

속성을 추출하는 비트 마스크

@item

@geindex A_CHARTEXT (curses 모듈)
@anchor{library/curses curses A_CHARTEXT}@anchor{353e}
@deffn {데이터} curses.A_CHARTEXT
@end deffn

@tab

문자를 추출하는 비트 마스크

@item

@geindex A_COLOR (curses 모듈)
@anchor{library/curses curses A_COLOR}@anchor{353f}
@deffn {데이터} curses.A_COLOR
@end deffn

@tab

색상 쌍 필드 정보를 추출하는 비트 마스크

@end multitable


키는 @code{KEY_}로 시작하는 이름을 가진 정수 상수로 참조됩니다. 사용 가능한 정확한 키 기능은 시스템에 따라 다릅니다.

@c XXX this table is far too large! should it be alphabetized?


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

키 상수

@tab

키

@item

@geindex KEY_MIN (curses 모듈)
@anchor{library/curses curses KEY_MIN}@anchor{3540}
@deffn {데이터} curses.KEY_MIN
@end deffn

@tab

최소 키값

@item

@geindex KEY_BREAK (curses 모듈)
@anchor{library/curses curses KEY_BREAK}@anchor{3541}
@deffn {데이터} curses.KEY_BREAK
@end deffn

@tab

브레이크 키 (신뢰할 수 없습니다)

@item

@geindex KEY_DOWN (curses 모듈)
@anchor{library/curses curses KEY_DOWN}@anchor{3542}
@deffn {데이터} curses.KEY_DOWN
@end deffn

@tab

아래쪽 화살표

@item

@geindex KEY_UP (curses 모듈)
@anchor{library/curses curses KEY_UP}@anchor{3543}
@deffn {데이터} curses.KEY_UP
@end deffn

@tab

위쪽 화살표

@item

@geindex KEY_LEFT (curses 모듈)
@anchor{library/curses curses KEY_LEFT}@anchor{3544}
@deffn {데이터} curses.KEY_LEFT
@end deffn

@tab

왼쪽 화살표

@item

@geindex KEY_RIGHT (curses 모듈)
@anchor{library/curses curses KEY_RIGHT}@anchor{3545}
@deffn {데이터} curses.KEY_RIGHT
@end deffn

@tab

오른쪽 화살표

@item

@geindex KEY_HOME (curses 모듈)
@anchor{library/curses curses KEY_HOME}@anchor{3546}
@deffn {데이터} curses.KEY_HOME
@end deffn

@tab

홈 키 (위쪽+왼쪽 화살표)

@item

@geindex KEY_BACKSPACE (curses 모듈)
@anchor{library/curses curses KEY_BACKSPACE}@anchor{3547}
@deffn {데이터} curses.KEY_BACKSPACE
@end deffn

@tab

백스페이스 (신뢰할 수 없습니다)

@item

@geindex KEY_F0 (curses 모듈)
@anchor{library/curses curses KEY_F0}@anchor{3548}
@deffn {데이터} curses.KEY_F0
@end deffn

@tab

기능키. 최대 64개의 기능키가 지원됩니다.

@item

@geindex KEY_Fn (curses 모듈)
@anchor{library/curses curses KEY_Fn}@anchor{3549}
@deffn {데이터} curses.KEY_Fn
@end deffn

@tab

기능키 `n'의 값

@item

@geindex KEY_DL (curses 모듈)
@anchor{library/curses curses KEY_DL}@anchor{354a}
@deffn {데이터} curses.KEY_DL
@end deffn

@tab

줄 삭제

@item

@geindex KEY_IL (curses 모듈)
@anchor{library/curses curses KEY_IL}@anchor{354b}
@deffn {데이터} curses.KEY_IL
@end deffn

@tab

줄 삽입

@item

@geindex KEY_DC (curses 모듈)
@anchor{library/curses curses KEY_DC}@anchor{354c}
@deffn {데이터} curses.KEY_DC
@end deffn

@tab

문자 삭제

@item

@geindex KEY_IC (curses 모듈)
@anchor{library/curses curses KEY_IC}@anchor{354d}
@deffn {데이터} curses.KEY_IC
@end deffn

@tab

문자 삽입이나 삽입 모드로 들어가기

@item

@geindex KEY_EIC (curses 모듈)
@anchor{library/curses curses KEY_EIC}@anchor{354e}
@deffn {데이터} curses.KEY_EIC
@end deffn

@tab

문자 삽입 모드 종료

@item

@geindex KEY_CLEAR (curses 모듈)
@anchor{library/curses curses KEY_CLEAR}@anchor{354f}
@deffn {데이터} curses.KEY_CLEAR
@end deffn

@tab

화면 지우기

@item

@geindex KEY_EOS (curses 모듈)
@anchor{library/curses curses KEY_EOS}@anchor{3550}
@deffn {데이터} curses.KEY_EOS
@end deffn

@tab

화면 끝까지 지우기

@item

@geindex KEY_EOL (curses 모듈)
@anchor{library/curses curses KEY_EOL}@anchor{3551}
@deffn {데이터} curses.KEY_EOL
@end deffn

@tab

줄 끝까지 지우기

@item

@geindex KEY_SF (curses 모듈)
@anchor{library/curses curses KEY_SF}@anchor{3552}
@deffn {데이터} curses.KEY_SF
@end deffn

@tab

한 줄 앞으로 스크롤

@item

@geindex KEY_SR (curses 모듈)
@anchor{library/curses curses KEY_SR}@anchor{3553}
@deffn {데이터} curses.KEY_SR
@end deffn

@tab

한 줄 뒤로 스크롤 (역)

@item

@geindex KEY_NPAGE (curses 모듈)
@anchor{library/curses curses KEY_NPAGE}@anchor{3554}
@deffn {데이터} curses.KEY_NPAGE
@end deffn

@tab

다음 페이지

@item

@geindex KEY_PPAGE (curses 모듈)
@anchor{library/curses curses KEY_PPAGE}@anchor{3555}
@deffn {데이터} curses.KEY_PPAGE
@end deffn

@tab

이전 페이지

@item

@geindex KEY_STAB (curses 모듈)
@anchor{library/curses curses KEY_STAB}@anchor{3556}
@deffn {데이터} curses.KEY_STAB
@end deffn

@tab

탭 설정

@item

@geindex KEY_CTAB (curses 모듈)
@anchor{library/curses curses KEY_CTAB}@anchor{3557}
@deffn {데이터} curses.KEY_CTAB
@end deffn

@tab

탭 지우기

@item

@geindex KEY_CATAB (curses 모듈)
@anchor{library/curses curses KEY_CATAB}@anchor{3558}
@deffn {데이터} curses.KEY_CATAB
@end deffn

@tab

모든 탭 지우기

@item

@geindex KEY_ENTER (curses 모듈)
@anchor{library/curses curses KEY_ENTER}@anchor{3559}
@deffn {데이터} curses.KEY_ENTER
@end deffn

@tab

엔터나 발송 (신뢰할 수 없습니다)

@item

@geindex KEY_SRESET (curses 모듈)
@anchor{library/curses curses KEY_SRESET}@anchor{355a}
@deffn {데이터} curses.KEY_SRESET
@end deffn

@tab

소프트(soft) (부분) 재설정 (신뢰할 수 없습니다)

@item

@geindex KEY_RESET (curses 모듈)
@anchor{library/curses curses KEY_RESET}@anchor{355b}
@deffn {데이터} curses.KEY_RESET
@end deffn

@tab

재설정이나 하드(hard) 재설정 (신뢰할 수 없습니다)

@item

@geindex KEY_PRINT (curses 모듈)
@anchor{library/curses curses KEY_PRINT}@anchor{355c}
@deffn {데이터} curses.KEY_PRINT
@end deffn

@tab

인쇄

@item

@geindex KEY_LL (curses 모듈)
@anchor{library/curses curses KEY_LL}@anchor{355d}
@deffn {데이터} curses.KEY_LL
@end deffn

@tab

홈 다운이나 바닥 (왼쪽 아래)

@item

@geindex KEY_A1 (curses 모듈)
@anchor{library/curses curses KEY_A1}@anchor{355e}
@deffn {데이터} curses.KEY_A1
@end deffn

@tab

키패드의 왼쪽 위

@item

@geindex KEY_A3 (curses 모듈)
@anchor{library/curses curses KEY_A3}@anchor{355f}
@deffn {데이터} curses.KEY_A3
@end deffn

@tab

키패드의 오른쪽 위

@item

@geindex KEY_B2 (curses 모듈)
@anchor{library/curses curses KEY_B2}@anchor{3560}
@deffn {데이터} curses.KEY_B2
@end deffn

@tab

키패드 가운데

@item

@geindex KEY_C1 (curses 모듈)
@anchor{library/curses curses KEY_C1}@anchor{3561}
@deffn {데이터} curses.KEY_C1
@end deffn

@tab

키패드의 왼쪽 아래

@item

@geindex KEY_C3 (curses 모듈)
@anchor{library/curses curses KEY_C3}@anchor{3562}
@deffn {데이터} curses.KEY_C3
@end deffn

@tab

키패드의 오른쪽 아래

@item

@geindex KEY_BTAB (curses 모듈)
@anchor{library/curses curses KEY_BTAB}@anchor{3563}
@deffn {데이터} curses.KEY_BTAB
@end deffn

@tab

백 탭

@item

@geindex KEY_BEG (curses 모듈)
@anchor{library/curses curses KEY_BEG}@anchor{3564}
@deffn {데이터} curses.KEY_BEG
@end deffn

@tab

Beg (시작)

@item

@geindex KEY_CANCEL (curses 모듈)
@anchor{library/curses curses KEY_CANCEL}@anchor{3565}
@deffn {데이터} curses.KEY_CANCEL
@end deffn

@tab

취소

@item

@geindex KEY_CLOSE (curses 모듈)
@anchor{library/curses curses KEY_CLOSE}@anchor{3566}
@deffn {데이터} curses.KEY_CLOSE
@end deffn

@tab

닫기

@item

@geindex KEY_COMMAND (curses 모듈)
@anchor{library/curses curses KEY_COMMAND}@anchor{3567}
@deffn {데이터} curses.KEY_COMMAND
@end deffn

@tab

Cmd (명령)

@item

@geindex KEY_COPY (curses 모듈)
@anchor{library/curses curses KEY_COPY}@anchor{3568}
@deffn {데이터} curses.KEY_COPY
@end deffn

@tab

복사

@item

@geindex KEY_CREATE (curses 모듈)
@anchor{library/curses curses KEY_CREATE}@anchor{3569}
@deffn {데이터} curses.KEY_CREATE
@end deffn

@tab

생성

@item

@geindex KEY_END (curses 모듈)
@anchor{library/curses curses KEY_END}@anchor{356a}
@deffn {데이터} curses.KEY_END
@end deffn

@tab

끝

@item

@geindex KEY_EXIT (curses 모듈)
@anchor{library/curses curses KEY_EXIT}@anchor{356b}
@deffn {데이터} curses.KEY_EXIT
@end deffn

@tab

종료

@item

@geindex KEY_FIND (curses 모듈)
@anchor{library/curses curses KEY_FIND}@anchor{356c}
@deffn {데이터} curses.KEY_FIND
@end deffn

@tab

찾기

@item

@geindex KEY_HELP (curses 모듈)
@anchor{library/curses curses KEY_HELP}@anchor{356d}
@deffn {데이터} curses.KEY_HELP
@end deffn

@tab

도움말

@item

@geindex KEY_MARK (curses 모듈)
@anchor{library/curses curses KEY_MARK}@anchor{356e}
@deffn {데이터} curses.KEY_MARK
@end deffn

@tab

표시

@item

@geindex KEY_MESSAGE (curses 모듈)
@anchor{library/curses curses KEY_MESSAGE}@anchor{356f}
@deffn {데이터} curses.KEY_MESSAGE
@end deffn

@tab

메시지

@item

@geindex KEY_MOVE (curses 모듈)
@anchor{library/curses curses KEY_MOVE}@anchor{3570}
@deffn {데이터} curses.KEY_MOVE
@end deffn

@tab

이동

@item

@geindex KEY_NEXT (curses 모듈)
@anchor{library/curses curses KEY_NEXT}@anchor{3571}
@deffn {데이터} curses.KEY_NEXT
@end deffn

@tab

다음

@item

@geindex KEY_OPEN (curses 모듈)
@anchor{library/curses curses KEY_OPEN}@anchor{3572}
@deffn {데이터} curses.KEY_OPEN
@end deffn

@tab

열기

@item

@geindex KEY_OPTIONS (curses 모듈)
@anchor{library/curses curses KEY_OPTIONS}@anchor{3573}
@deffn {데이터} curses.KEY_OPTIONS
@end deffn

@tab

옵션

@item

@geindex KEY_PREVIOUS (curses 모듈)
@anchor{library/curses curses KEY_PREVIOUS}@anchor{3574}
@deffn {데이터} curses.KEY_PREVIOUS
@end deffn

@tab

Prev (이전)

@item

@geindex KEY_REDO (curses 모듈)
@anchor{library/curses curses KEY_REDO}@anchor{3575}
@deffn {데이터} curses.KEY_REDO
@end deffn

@tab

다시 하기

@item

@geindex KEY_REFERENCE (curses 모듈)
@anchor{library/curses curses KEY_REFERENCE}@anchor{3576}
@deffn {데이터} curses.KEY_REFERENCE
@end deffn

@tab

Ref (참조)

@item

@geindex KEY_REFRESH (curses 모듈)
@anchor{library/curses curses KEY_REFRESH}@anchor{3577}
@deffn {데이터} curses.KEY_REFRESH
@end deffn

@tab

새로 고침

@item

@geindex KEY_REPLACE (curses 모듈)
@anchor{library/curses curses KEY_REPLACE}@anchor{3578}
@deffn {데이터} curses.KEY_REPLACE
@end deffn

@tab

교체

@item

@geindex KEY_RESTART (curses 모듈)
@anchor{library/curses curses KEY_RESTART}@anchor{3579}
@deffn {데이터} curses.KEY_RESTART
@end deffn

@tab

재시작

@item

@geindex KEY_RESUME (curses 모듈)
@anchor{library/curses curses KEY_RESUME}@anchor{357a}
@deffn {데이터} curses.KEY_RESUME
@end deffn

@tab

재개

@item

@geindex KEY_SAVE (curses 모듈)
@anchor{library/curses curses KEY_SAVE}@anchor{357b}
@deffn {데이터} curses.KEY_SAVE
@end deffn

@tab

저장

@item

@geindex KEY_SBEG (curses 모듈)
@anchor{library/curses curses KEY_SBEG}@anchor{357c}
@deffn {데이터} curses.KEY_SBEG
@end deffn

@tab

시프트 Beg (시작)

@item

@geindex KEY_SCANCEL (curses 모듈)
@anchor{library/curses curses KEY_SCANCEL}@anchor{357d}
@deffn {데이터} curses.KEY_SCANCEL
@end deffn

@tab

시프트 취소

@item

@geindex KEY_SCOMMAND (curses 모듈)
@anchor{library/curses curses KEY_SCOMMAND}@anchor{357e}
@deffn {데이터} curses.KEY_SCOMMAND
@end deffn

@tab

시프트 명령

@item

@geindex KEY_SCOPY (curses 모듈)
@anchor{library/curses curses KEY_SCOPY}@anchor{357f}
@deffn {데이터} curses.KEY_SCOPY
@end deffn

@tab

시프트 복사

@item

@geindex KEY_SCREATE (curses 모듈)
@anchor{library/curses curses KEY_SCREATE}@anchor{3580}
@deffn {데이터} curses.KEY_SCREATE
@end deffn

@tab

시프트 생성

@item

@geindex KEY_SDC (curses 모듈)
@anchor{library/curses curses KEY_SDC}@anchor{3581}
@deffn {데이터} curses.KEY_SDC
@end deffn

@tab

시프트 문자 삭제

@item

@geindex KEY_SDL (curses 모듈)
@anchor{library/curses curses KEY_SDL}@anchor{3582}
@deffn {데이터} curses.KEY_SDL
@end deffn

@tab

시프트 줄 삭제

@item

@geindex KEY_SELECT (curses 모듈)
@anchor{library/curses curses KEY_SELECT}@anchor{3583}
@deffn {데이터} curses.KEY_SELECT
@end deffn

@tab

선택

@item

@geindex KEY_SEND (curses 모듈)
@anchor{library/curses curses KEY_SEND}@anchor{3584}
@deffn {데이터} curses.KEY_SEND
@end deffn

@tab

시프트 끝

@item

@geindex KEY_SEOL (curses 모듈)
@anchor{library/curses curses KEY_SEOL}@anchor{3585}
@deffn {데이터} curses.KEY_SEOL
@end deffn

@tab

시프트 줄 지우기

@item

@geindex KEY_SEXIT (curses 모듈)
@anchor{library/curses curses KEY_SEXIT}@anchor{3586}
@deffn {데이터} curses.KEY_SEXIT
@end deffn

@tab

시프트 종료

@item

@geindex KEY_SFIND (curses 모듈)
@anchor{library/curses curses KEY_SFIND}@anchor{3587}
@deffn {데이터} curses.KEY_SFIND
@end deffn

@tab

시프트 찾기

@item

@geindex KEY_SHELP (curses 모듈)
@anchor{library/curses curses KEY_SHELP}@anchor{3588}
@deffn {데이터} curses.KEY_SHELP
@end deffn

@tab

시프트 도움말

@item

@geindex KEY_SHOME (curses 모듈)
@anchor{library/curses curses KEY_SHOME}@anchor{3589}
@deffn {데이터} curses.KEY_SHOME
@end deffn

@tab

시프트 홈

@item

@geindex KEY_SIC (curses 모듈)
@anchor{library/curses curses KEY_SIC}@anchor{358a}
@deffn {데이터} curses.KEY_SIC
@end deffn

@tab

시프트 입력

@item

@geindex KEY_SLEFT (curses 모듈)
@anchor{library/curses curses KEY_SLEFT}@anchor{358b}
@deffn {데이터} curses.KEY_SLEFT
@end deffn

@tab

시프트 왼쪽 화살표

@item

@geindex KEY_SMESSAGE (curses 모듈)
@anchor{library/curses curses KEY_SMESSAGE}@anchor{358c}
@deffn {데이터} curses.KEY_SMESSAGE
@end deffn

@tab

시프트 메시지

@item

@geindex KEY_SMOVE (curses 모듈)
@anchor{library/curses curses KEY_SMOVE}@anchor{358d}
@deffn {데이터} curses.KEY_SMOVE
@end deffn

@tab

시프트 이동

@item

@geindex KEY_SNEXT (curses 모듈)
@anchor{library/curses curses KEY_SNEXT}@anchor{358e}
@deffn {데이터} curses.KEY_SNEXT
@end deffn

@tab

시프트 다음

@item

@geindex KEY_SOPTIONS (curses 모듈)
@anchor{library/curses curses KEY_SOPTIONS}@anchor{358f}
@deffn {데이터} curses.KEY_SOPTIONS
@end deffn

@tab

시프트 옵션

@item

@geindex KEY_SPREVIOUS (curses 모듈)
@anchor{library/curses curses KEY_SPREVIOUS}@anchor{3590}
@deffn {데이터} curses.KEY_SPREVIOUS
@end deffn

@tab

시프트 Prev

@item

@geindex KEY_SPRINT (curses 모듈)
@anchor{library/curses curses KEY_SPRINT}@anchor{3591}
@deffn {데이터} curses.KEY_SPRINT
@end deffn

@tab

시프트 인쇄

@item

@geindex KEY_SREDO (curses 모듈)
@anchor{library/curses curses KEY_SREDO}@anchor{3592}
@deffn {데이터} curses.KEY_SREDO
@end deffn

@tab

시프트 다시 하기

@item

@geindex KEY_SREPLACE (curses 모듈)
@anchor{library/curses curses KEY_SREPLACE}@anchor{3593}
@deffn {데이터} curses.KEY_SREPLACE
@end deffn

@tab

시프트 교체

@item

@geindex KEY_SRIGHT (curses 모듈)
@anchor{library/curses curses KEY_SRIGHT}@anchor{3594}
@deffn {데이터} curses.KEY_SRIGHT
@end deffn

@tab

시프트 오른쪽 화살표

@item

@geindex KEY_SRSUME (curses 모듈)
@anchor{library/curses curses KEY_SRSUME}@anchor{3595}
@deffn {데이터} curses.KEY_SRSUME
@end deffn

@tab

시프트 재개

@item

@geindex KEY_SSAVE (curses 모듈)
@anchor{library/curses curses KEY_SSAVE}@anchor{3596}
@deffn {데이터} curses.KEY_SSAVE
@end deffn

@tab

시프트 저장

@item

@geindex KEY_SSUSPEND (curses 모듈)
@anchor{library/curses curses KEY_SSUSPEND}@anchor{3597}
@deffn {데이터} curses.KEY_SSUSPEND
@end deffn

@tab

시프트 일시 중단

@item

@geindex KEY_SUNDO (curses 모듈)
@anchor{library/curses curses KEY_SUNDO}@anchor{3598}
@deffn {데이터} curses.KEY_SUNDO
@end deffn

@tab

시프트 실행 취소

@item

@geindex KEY_SUSPEND (curses 모듈)
@anchor{library/curses curses KEY_SUSPEND}@anchor{3599}
@deffn {데이터} curses.KEY_SUSPEND
@end deffn

@tab

일시 중단

@item

@geindex KEY_UNDO (curses 모듈)
@anchor{library/curses curses KEY_UNDO}@anchor{359a}
@deffn {데이터} curses.KEY_UNDO
@end deffn

@tab

실행 취소

@item

@geindex KEY_MOUSE (curses 모듈)
@anchor{library/curses curses KEY_MOUSE}@anchor{34af}
@deffn {데이터} curses.KEY_MOUSE
@end deffn

@tab

마우스 이벤트가 발생했습니다

@item

@geindex KEY_RESIZE (curses 모듈)
@anchor{library/curses curses KEY_RESIZE}@anchor{359b}
@deffn {데이터} curses.KEY_RESIZE
@end deffn

@tab

터미널 크기 조정 이벤트

@item

@geindex KEY_MAX (curses 모듈)
@anchor{library/curses curses KEY_MAX}@anchor{359c}
@deffn {데이터} curses.KEY_MAX
@end deffn

@tab

최대 키값

@end multitable


VT100과 이의 소프트웨어 에뮬레이션(가령 X 터미널 에뮬레이터)에는, 일반적으로 사용 가능한 기능키가 적어도 4개 (@ref{3549,,KEY_F1}, @code{KEY_F2}, @code{KEY_F3}, @code{KEY_F4}) 있고, 화살표 키는 @ref{3543,,KEY_UP}, @ref{3542,,KEY_DOWN}, @ref{3544,,KEY_LEFT} 및 @ref{3545,,KEY_RIGHT}에 명백한 방식으로 매핑됩니다. 여러분의 기계에 PC 키보드가 있으면, 화살표 키와 12개의 기능키를 기대하는 것이 안전합니다 (이전 PC 키보드에는 10개의 기능키만 있을 수 있습니다); 또한, 다음과 같은 키패드 매핑이 표준입니다:


@multitable {xxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxx} 
@headitem

키 기능

@tab

상수

@item

@code{Insert}

@tab

KEY_IC

@item

@code{Delete}

@tab

KEY_DC

@item

@code{Home}

@tab

KEY_HOME

@item

@code{End}

@tab

KEY_END

@item

@code{Page Up}

@tab

KEY_PPAGE

@item

@code{Page Down}

@tab

KEY_NPAGE

@end multitable

@anchor{library/curses curses-acs-codes}@anchor{359d}
다음 표는 대체 문자 집합의 문자를 나열합니다. 이들은 VT100 터미널에서 상속되며, 일반적으로 X 터미널과 같은 소프트웨어 에뮬레이션에서 사용할 수 있습니다. 사용 가능한 그래픽이 없으면, curses는 조잡한 인쇄 가능한 ASCII 근사치로 폴 백 합니다.

@cartouche
@quotation 참고 
@ref{1910,,initscr()}가 호출된 후에만 사용할 수 있습니다.
@end quotation
@end cartouche


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

ACS 코드

@tab

의미

@item

@geindex ACS_BBSS (curses 모듈)
@anchor{library/curses curses ACS_BBSS}@anchor{359e}
@deffn {데이터} curses.ACS_BBSS
@end deffn

@tab

오른쪽 위 모서리의 대체 이름

@item

@geindex ACS_BLOCK (curses 모듈)
@anchor{library/curses curses ACS_BLOCK}@anchor{359f}
@deffn {데이터} curses.ACS_BLOCK
@end deffn

@tab

채워진 사각형 블록

@item

@geindex ACS_BOARD (curses 모듈)
@anchor{library/curses curses ACS_BOARD}@anchor{35a0}
@deffn {데이터} curses.ACS_BOARD
@end deffn

@tab

사각형의 보드

@item

@geindex ACS_BSBS (curses 모듈)
@anchor{library/curses curses ACS_BSBS}@anchor{35a1}
@deffn {데이터} curses.ACS_BSBS
@end deffn

@tab

수평선의 대체 이름

@item

@geindex ACS_BSSB (curses 모듈)
@anchor{library/curses curses ACS_BSSB}@anchor{35a2}
@deffn {데이터} curses.ACS_BSSB
@end deffn

@tab

왼쪽 위 모서리의 대체 이름

@item

@geindex ACS_BSSS (curses 모듈)
@anchor{library/curses curses ACS_BSSS}@anchor{35a3}
@deffn {데이터} curses.ACS_BSSS
@end deffn

@tab

상단 티(top tee)의 대체 이름

@item

@geindex ACS_BTEE (curses 모듈)
@anchor{library/curses curses ACS_BTEE}@anchor{35a4}
@deffn {데이터} curses.ACS_BTEE
@end deffn

@tab

하단 티(bottom tee)

@item

@geindex ACS_BULLET (curses 모듈)
@anchor{library/curses curses ACS_BULLET}@anchor{35a5}
@deffn {데이터} curses.ACS_BULLET
@end deffn

@tab

불릿

@item

@geindex ACS_CKBOARD (curses 모듈)
@anchor{library/curses curses ACS_CKBOARD}@anchor{35a6}
@deffn {데이터} curses.ACS_CKBOARD
@end deffn

@tab

체커 보드 (점각)

@item

@geindex ACS_DARROW (curses 모듈)
@anchor{library/curses curses ACS_DARROW}@anchor{35a7}
@deffn {데이터} curses.ACS_DARROW
@end deffn

@tab

아래쪽을 가리키는 화살표

@item

@geindex ACS_DEGREE (curses 모듈)
@anchor{library/curses curses ACS_DEGREE}@anchor{35a8}
@deffn {데이터} curses.ACS_DEGREE
@end deffn

@tab

디그리 기호

@item

@geindex ACS_DIAMOND (curses 모듈)
@anchor{library/curses curses ACS_DIAMOND}@anchor{35a9}
@deffn {데이터} curses.ACS_DIAMOND
@end deffn

@tab

다이아몬드

@item

@geindex ACS_GEQUAL (curses 모듈)
@anchor{library/curses curses ACS_GEQUAL}@anchor{35aa}
@deffn {데이터} curses.ACS_GEQUAL
@end deffn

@tab

크거나 같음

@item

@geindex ACS_HLINE (curses 모듈)
@anchor{library/curses curses ACS_HLINE}@anchor{34ef}
@deffn {데이터} curses.ACS_HLINE
@end deffn

@tab

수평선

@item

@geindex ACS_LANTERN (curses 모듈)
@anchor{library/curses curses ACS_LANTERN}@anchor{35ab}
@deffn {데이터} curses.ACS_LANTERN
@end deffn

@tab

랜턴 기호

@item

@geindex ACS_LARROW (curses 모듈)
@anchor{library/curses curses ACS_LARROW}@anchor{35ac}
@deffn {데이터} curses.ACS_LARROW
@end deffn

@tab

왼쪽 화살표

@item

@geindex ACS_LEQUAL (curses 모듈)
@anchor{library/curses curses ACS_LEQUAL}@anchor{35ad}
@deffn {데이터} curses.ACS_LEQUAL
@end deffn

@tab

작거나 같음

@item

@geindex ACS_LLCORNER (curses 모듈)
@anchor{library/curses curses ACS_LLCORNER}@anchor{34f2}
@deffn {데이터} curses.ACS_LLCORNER
@end deffn

@tab

왼쪽 아래 모서리

@item

@geindex ACS_LRCORNER (curses 모듈)
@anchor{library/curses curses ACS_LRCORNER}@anchor{34f3}
@deffn {데이터} curses.ACS_LRCORNER
@end deffn

@tab

오른쪽 아래 모서리

@item

@geindex ACS_LTEE (curses 모듈)
@anchor{library/curses curses ACS_LTEE}@anchor{35ae}
@deffn {데이터} curses.ACS_LTEE
@end deffn

@tab

왼쪽 티(left tee)

@item

@geindex ACS_NEQUAL (curses 모듈)
@anchor{library/curses curses ACS_NEQUAL}@anchor{35af}
@deffn {데이터} curses.ACS_NEQUAL
@end deffn

@tab

같지 않음 기호

@item

@geindex ACS_PI (curses 모듈)
@anchor{library/curses curses ACS_PI}@anchor{35b0}
@deffn {데이터} curses.ACS_PI
@end deffn

@tab

글자 파이(pi)

@item

@geindex ACS_PLMINUS (curses 모듈)
@anchor{library/curses curses ACS_PLMINUS}@anchor{35b1}
@deffn {데이터} curses.ACS_PLMINUS
@end deffn

@tab

더하기-또는-빼기 기호

@item

@geindex ACS_PLUS (curses 모듈)
@anchor{library/curses curses ACS_PLUS}@anchor{35b2}
@deffn {데이터} curses.ACS_PLUS
@end deffn

@tab

큰 더하기 기호

@item

@geindex ACS_RARROW (curses 모듈)
@anchor{library/curses curses ACS_RARROW}@anchor{35b3}
@deffn {데이터} curses.ACS_RARROW
@end deffn

@tab

오른쪽 화살표

@item

@geindex ACS_RTEE (curses 모듈)
@anchor{library/curses curses ACS_RTEE}@anchor{35b4}
@deffn {데이터} curses.ACS_RTEE
@end deffn

@tab

오른쪽 티(right tee)

@item

@geindex ACS_S1 (curses 모듈)
@anchor{library/curses curses ACS_S1}@anchor{35b5}
@deffn {데이터} curses.ACS_S1
@end deffn

@tab

스캔 줄 1

@item

@geindex ACS_S3 (curses 모듈)
@anchor{library/curses curses ACS_S3}@anchor{35b6}
@deffn {데이터} curses.ACS_S3
@end deffn

@tab

스캔 줄 3

@item

@geindex ACS_S7 (curses 모듈)
@anchor{library/curses curses ACS_S7}@anchor{35b7}
@deffn {데이터} curses.ACS_S7
@end deffn

@tab

스캔 줄 7

@item

@geindex ACS_S9 (curses 모듈)
@anchor{library/curses curses ACS_S9}@anchor{35b8}
@deffn {데이터} curses.ACS_S9
@end deffn

@tab

스캔 줄 9

@item

@geindex ACS_SBBS (curses 모듈)
@anchor{library/curses curses ACS_SBBS}@anchor{35b9}
@deffn {데이터} curses.ACS_SBBS
@end deffn

@tab

오른쪽 아래 모서리의 대체 이름

@item

@geindex ACS_SBSB (curses 모듈)
@anchor{library/curses curses ACS_SBSB}@anchor{35ba}
@deffn {데이터} curses.ACS_SBSB
@end deffn

@tab

세로줄의 대체 이름

@item

@geindex ACS_SBSS (curses 모듈)
@anchor{library/curses curses ACS_SBSS}@anchor{35bb}
@deffn {데이터} curses.ACS_SBSS
@end deffn

@tab

오른쪽 티의 대체 이름

@item

@geindex ACS_SSBB (curses 모듈)
@anchor{library/curses curses ACS_SSBB}@anchor{35bc}
@deffn {데이터} curses.ACS_SSBB
@end deffn

@tab

왼쪽 아래 모서리의 대체 이름

@item

@geindex ACS_SSBS (curses 모듈)
@anchor{library/curses curses ACS_SSBS}@anchor{35bd}
@deffn {데이터} curses.ACS_SSBS
@end deffn

@tab

하단 티의 대체 이름

@item

@geindex ACS_SSSB (curses 모듈)
@anchor{library/curses curses ACS_SSSB}@anchor{35be}
@deffn {데이터} curses.ACS_SSSB
@end deffn

@tab

왼쪽 티의 대체 이름

@item

@geindex ACS_SSSS (curses 모듈)
@anchor{library/curses curses ACS_SSSS}@anchor{35bf}
@deffn {데이터} curses.ACS_SSSS
@end deffn

@tab

크로스 오버(crossover) 또는 큰 더하기의 대체 이름

@item

@geindex ACS_STERLING (curses 모듈)
@anchor{library/curses curses ACS_STERLING}@anchor{35c0}
@deffn {데이터} curses.ACS_STERLING
@end deffn

@tab

파운드 스털링(pound sterling)

@item

@geindex ACS_TTEE (curses 모듈)
@anchor{library/curses curses ACS_TTEE}@anchor{35c1}
@deffn {데이터} curses.ACS_TTEE
@end deffn

@tab

상단 티(top tee)

@item

@geindex ACS_UARROW (curses 모듈)
@anchor{library/curses curses ACS_UARROW}@anchor{35c2}
@deffn {데이터} curses.ACS_UARROW
@end deffn

@tab

위쪽 화살표

@item

@geindex ACS_ULCORNER (curses 모듈)
@anchor{library/curses curses ACS_ULCORNER}@anchor{34f0}
@deffn {데이터} curses.ACS_ULCORNER
@end deffn

@tab

왼쪽 위 모서리

@item

@geindex ACS_URCORNER (curses 모듈)
@anchor{library/curses curses ACS_URCORNER}@anchor{34f1}
@deffn {데이터} curses.ACS_URCORNER
@end deffn

@tab

오른쪽 위 모서리

@item

@geindex ACS_VLINE (curses 모듈)
@anchor{library/curses curses ACS_VLINE}@anchor{34ee}
@deffn {데이터} curses.ACS_VLINE
@end deffn

@tab

수직선

@end multitable


The following table lists mouse button constants used by @ref{34ae,,getmouse()}:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

마우스 버튼 상수

@tab

의미

@item

@geindex BUTTONn_PRESSED (curses 모듈)
@anchor{library/curses curses BUTTONn_PRESSED}@anchor{34b0}
@deffn {데이터} curses.BUTTONn_PRESSED
@end deffn

@tab

Mouse button `n' pressed

@item

@geindex BUTTONn_RELEASED (curses 모듈)
@anchor{library/curses curses BUTTONn_RELEASED}@anchor{34b1}
@deffn {데이터} curses.BUTTONn_RELEASED
@end deffn

@tab

Mouse button `n' released

@item

@geindex BUTTONn_CLICKED (curses 모듈)
@anchor{library/curses curses BUTTONn_CLICKED}@anchor{34b2}
@deffn {데이터} curses.BUTTONn_CLICKED
@end deffn

@tab

Mouse button `n' clicked

@item

@geindex BUTTONn_DOUBLE_CLICKED (curses 모듈)
@anchor{library/curses curses BUTTONn_DOUBLE_CLICKED}@anchor{34b3}
@deffn {데이터} curses.BUTTONn_DOUBLE_CLICKED
@end deffn

@tab

Mouse button `n' double clicked

@item

@geindex BUTTONn_TRIPLE_CLICKED (curses 모듈)
@anchor{library/curses curses BUTTONn_TRIPLE_CLICKED}@anchor{34b4}
@deffn {데이터} curses.BUTTONn_TRIPLE_CLICKED
@end deffn

@tab

Mouse button `n' triple clicked

@item

@geindex BUTTON_SHIFT (curses 모듈)
@anchor{library/curses curses BUTTON_SHIFT}@anchor{34b5}
@deffn {데이터} curses.BUTTON_SHIFT
@end deffn

@tab

Shift was down during button state change

@item

@geindex BUTTON_CTRL (curses 모듈)
@anchor{library/curses curses BUTTON_CTRL}@anchor{34b6}
@deffn {데이터} curses.BUTTON_CTRL
@end deffn

@tab

Control was down during button state change

@item

@geindex BUTTON_ALT (curses 모듈)
@anchor{library/curses curses BUTTON_ALT}@anchor{34b7}
@deffn {데이터} curses.BUTTON_ALT
@end deffn

@tab

Control was down during button state change

@end multitable



버전 3.10에서 변경: The @code{BUTTON5_*} constants are now exposed if they are provided by the
underlying curses library.


다음 표는 사전 정의된 색상을 나열합니다:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

상수

@tab

색상

@item

@geindex COLOR_BLACK (curses 모듈)
@anchor{library/curses curses COLOR_BLACK}@anchor{35c3}
@deffn {데이터} curses.COLOR_BLACK
@end deffn

@tab

검은색

@item

@geindex COLOR_BLUE (curses 모듈)
@anchor{library/curses curses COLOR_BLUE}@anchor{35c4}
@deffn {데이터} curses.COLOR_BLUE
@end deffn

@tab

파랑

@item

@geindex COLOR_CYAN (curses 모듈)
@anchor{library/curses curses COLOR_CYAN}@anchor{35c5}
@deffn {데이터} curses.COLOR_CYAN
@end deffn

@tab

시안 (청록색 - 밝은 초록이 섞인 파랑)

@item

@geindex COLOR_GREEN (curses 모듈)
@anchor{library/curses curses COLOR_GREEN}@anchor{35c6}
@deffn {데이터} curses.COLOR_GREEN
@end deffn

@tab

초록

@item

@geindex COLOR_MAGENTA (curses 모듈)
@anchor{library/curses curses COLOR_MAGENTA}@anchor{35c7}
@deffn {데이터} curses.COLOR_MAGENTA
@end deffn

@tab

마젠타 (자홍색)

@item

@geindex COLOR_RED (curses 모듈)
@anchor{library/curses curses COLOR_RED}@anchor{35c8}
@deffn {데이터} curses.COLOR_RED
@end deffn

@tab

빨강

@item

@geindex COLOR_WHITE (curses 모듈)
@anchor{library/curses curses COLOR_WHITE}@anchor{35c9}
@deffn {데이터} curses.COLOR_WHITE
@end deffn

@tab

흰색

@item

@geindex COLOR_YELLOW (curses 모듈)
@anchor{library/curses curses COLOR_YELLOW}@anchor{35ca}
@deffn {데이터} curses.COLOR_YELLOW
@end deffn

@tab

노랑

@end multitable


@node curses textpad — Text input widget for curses programs,curses ascii — ASCII 문자용 유틸리티,curses — 문자 셀 디스플레이를 위한 터미널 처리,Command-line interface libraries
@anchor{library/curses curses-textpad-text-input-widget-for-curses-programs}@anchor{35cb}@anchor{library/curses module-curses textpad}@anchor{32}
@subsection @code{curses.textpad} — Text input widget for curses programs


@geindex module; curses.textpad

The @code{curses.textpad} module provides a @ref{35cc,,Textbox} class that handles
elementary text editing in a curses window, supporting a set of keybindings
resembling those of Emacs (thus, also of Netscape Navigator, BBedit 6.x,
FrameMaker, and many other programs).  The module also provides a
rectangle-drawing function useful for framing text boxes or for other purposes.

The module @code{curses.textpad} defines the following function:

@geindex rectangle() (curses.textpad 모듈)
@anchor{library/curses curses textpad rectangle}@anchor{35cd}
@deffn {함수} curses.textpad.rectangle (win, uly, ulx, lry, lrx)

직사각형을 그립니다. 첫 번째 인자는 창 객체여야 합니다; 나머지 인자는 그 창에 상대적인 좌표입니다. 두 번째와 세 번째 인자는 그릴 사각형의 왼쪽 위 모서리의 y와 x 좌표입니다; 네 번째와 다섯 번째 인자는 오른쪽 아래 모서리의 y와 x 좌표입니다. 사각형은 이것이 가능한 터미널(xterm과 대부분의 다른 소프트웨어 터미널 에뮬레이터를 포함합니다)에서 VT100/IBM PC 양식 문자를 사용하여 그려집니다. 그렇지 않으면 ASCII 대시, 세로 막대 및 더하기 기호로 그려집니다.
@end deffn

@menu
* Textbox 객체:: 

@end menu

@node Textbox 객체,,,curses textpad — Text input widget for curses programs
@anchor{library/curses curses-textpad-objects}@anchor{35ce}@anchor{library/curses textbox-objects}@anchor{35cf}
@subsubsection Textbox 객체


다음과 같이 @ref{35cc,,Textbox} 객체를 인스턴스 화 할 수 있습니다:

@geindex Textbox (curses.textpad 클래스)
@anchor{library/curses curses textpad Textbox}@anchor{35cc}
@deffn {클래스} curses.textpad.Textbox (win)

텍스트 상자 위젯 객체를 반환합니다. `win' 인자는 텍스트 상자가 포함될 curses @ref{198a,,창} 객체여야 합니다. 텍스트 상자의 편집 커서는 처음에 좌표 @code{(0, 0)}으로 포함하는 창의 왼쪽 위 모서리에 있습니다. 인스턴스의 @ref{35d0,,stripspaces} 플래그가 처음에 켜집니다.

@ref{35cc,,Textbox} 객체에는 다음과 같은 메서드가 있습니다:

@geindex edit() (curses.textpad.Textbox 메서드)
@anchor{library/curses curses textpad Textbox edit}@anchor{35d1}
@deffn {메서드} edit ([validator])

이것이 일반적으로 사용하는 진입점입니다. 종료 키 입력 중 하나를 입력할 때까지 편집 키 입력을 받아들입니다. `validator'가 제공되면, 반드시 함수여야 합니다. 입력한 각 키 입력에 대해 키 입력을 매개 변수로 호출됩니다; 명령 디스패치가 그 결과에 대해 수행됩니다. 이 메서드는 창 내용을 문자열로 반환합니다; 창의 공백이 포함되는지는 @ref{35d0,,stripspaces} 어트리뷰트의 영향을 받습니다.
@end deffn

@geindex do_command() (curses.textpad.Textbox 메서드)
@anchor{library/curses curses textpad Textbox do_command}@anchor{35d2}
@deffn {메서드} do_command (ch)

단일 명령 키 입력을 처리합니다. 지원되는 특수키 입력은 다음과 같습니다:


@multitable {xxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

키 입력

@tab

동작

@item

@code{Control}-@code{A}

@tab

창의 왼쪽 가장자리로 이동합니다.

@item

@code{Control}-@code{B}

@tab

커서를 왼쪽으로 옮깁니다, 필요하면 앞줄로 넘어갑니다.

@item

@code{Control}-@code{D}

@tab

커서 아래의 문자를 삭제합니다.

@item

@code{Control}-@code{E}

@tab

오른쪽 가장자리(stripspaces가 꺼졌을 때)나 줄 끝(stripspaces가 켜졌을 때)으로 이동합니다.

@item

@code{Control}-@code{F}

@tab

커서를 오른쪽으로 옮깁니다, 필요하면 다음 줄로 넘어갑니다.

@item

@code{Control}-@code{G}

@tab

종료하고, 창 내용을 반환합니다.

@item

@code{Control}-@code{H}

@tab

문자를 뒤로 삭제합니다.

@item

@code{Control}-@code{J}

@tab

창이 한 줄이면 종료하고, 그렇지 않으면 줄 바꿈을 삽입합니다.

@item

@code{Control}-@code{K}

@tab

줄이 비어 있으면, 삭제하고, 그렇지 않으면 줄 끝까지 지웁니다.

@item

@code{Control}-@code{L}

@tab

화면을 새로 고칩니다.

@item

@code{Control}-@code{N}

@tab

커서를 아래로 옮깁니다; 한 줄 아래로 이동합니다.

@item

@code{Control}-@code{O}

@tab

커서 위치에 빈 줄을 삽입합니다.

@item

@code{Control}-@code{P}

@tab

커서를 위로 옮깁니다; 한 줄 위로 이동합니다.

@end multitable


이동이 불가능한 가장자리에 커서가 있으면 이동 연산이 수행되지 않습니다. 가능하면 다음 동의어가 지원됩니다:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxx} 
@headitem

상수

@tab

키 입력

@item

@ref{3544,,KEY_LEFT}

@tab

@code{Control}-@code{B}

@item

@ref{3545,,KEY_RIGHT}

@tab

@code{Control}-@code{F}

@item

@ref{3543,,KEY_UP}

@tab

@code{Control}-@code{P}

@item

@ref{3542,,KEY_DOWN}

@tab

@code{Control}-@code{N}

@item

@ref{3547,,KEY_BACKSPACE}

@tab

@code{Control}-@code{h}

@end multitable


다른 모든 키 입력은 주어진 문자를 삽입하고 (줄 넘김을 포함한) 오른쪽으로 이동하는 명령으로 처리됩니다.
@end deffn

@geindex gather() (curses.textpad.Textbox 메서드)
@anchor{library/curses curses textpad Textbox gather}@anchor{35d3}
@deffn {메서드} gather ()

창 내용을 문자열로 반환합니다; 창의 공백이 포함되는지는 @ref{35d0,,stripspaces} 멤버의 영향을 받습니다.
@end deffn

@geindex stripspaces (curses.textpad.Textbox의 속성)
@anchor{library/curses curses textpad Textbox stripspaces}@anchor{35d0}
@deffn {속성} stripspaces

이 어트리뷰트는 창의 공백 해석을 제어하는 플래그입니다. 켜져 있으면, 각 줄의 후행 공백이 무시됩니다; 후행 공백에 커서를 놓는 커서 동작은 대신 해당 줄의 끝으로 이동하고, 창 내용이 수집될 때 후행 공백이 제거됩니다.
@end deffn
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node curses ascii — ASCII 문자용 유틸리티,curses panel — curses 용 패널 스택 확장,curses textpad — Text input widget for curses programs,Command-line interface libraries
@anchor{library/curses ascii doc}@anchor{35d4}@anchor{library/curses ascii curses-ascii-utilities-for-ascii-characters}@anchor{35d5}@anchor{library/curses ascii module-curses ascii}@anchor{30}@anchor{library/curses ascii translation-repo}@anchor{35d6}
@subsection @code{curses.ascii} — ASCII 문자용 유틸리티


@geindex module; curses.ascii

`소스 코드:' Lib/curses/ascii.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/curses/ascii.py}


__________________________________________________________________


The @code{curses.ascii} module supplies name constants for ASCII characters and
functions to test membership in various ASCII character classes.  The constants
supplied are names for control characters as follows:


@multitable {xxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

이름

@tab

의미

@item

@geindex NUL (curses.ascii 모듈)
@anchor{library/curses ascii curses ascii NUL}@anchor{35d7}
@deffn {데이터} curses.ascii.NUL
@end deffn

@tab

@item

@geindex SOH (curses.ascii 모듈)
@anchor{library/curses ascii curses ascii SOH}@anchor{35d8}
@deffn {데이터} curses.ascii.SOH
@end deffn

@tab

헤딩의 시작(Start of heading), 콘솔 인터럽트

@item

@geindex STX (curses.ascii 모듈)
@anchor{library/curses ascii curses ascii STX}@anchor{35d9}
@deffn {데이터} curses.ascii.STX
@end deffn

@tab

텍스트의 시작(Start of text)

@item

@geindex ETX (curses.ascii 모듈)
@anchor{library/curses ascii curses ascii ETX}@anchor{35da}
@deffn {데이터} curses.ascii.ETX
@end deffn

@tab

텍스트 끝(End of text)

@item

@geindex EOT (curses.ascii 모듈)
@anchor{library/curses ascii curses ascii EOT}@anchor{35db}
@deffn {데이터} curses.ascii.EOT
@end deffn

@tab

전송 끝(End of transmission)

@item

@geindex ENQ (curses.ascii 모듈)
@anchor{library/curses ascii curses ascii ENQ}@anchor{35dc}
@deffn {데이터} curses.ascii.ENQ
@end deffn

@tab

문의(Enquiry), @ref{35dd,,ACK} 흐름 제어와 함께 제공

@item

@geindex ACK (curses.ascii 모듈)
@anchor{library/curses ascii curses ascii ACK}@anchor{35dd}
@deffn {데이터} curses.ascii.ACK
@end deffn

@tab

확인(Acknowledgement)

@item

@geindex BEL (curses.ascii 모듈)
@anchor{library/curses ascii curses ascii BEL}@anchor{35de}
@deffn {데이터} curses.ascii.BEL
@end deffn

@tab

벨(Bell)

@item

@geindex BS (curses.ascii 모듈)
@anchor{library/curses ascii curses ascii BS}@anchor{35df}
@deffn {데이터} curses.ascii.BS
@end deffn

@tab

백스페이스(Backspace)

@item

@geindex TAB (curses.ascii 모듈)
@anchor{library/curses ascii curses ascii TAB}@anchor{35e0}
@deffn {데이터} curses.ascii.TAB
@end deffn

@tab

탭(Tab)

@item

@geindex HT (curses.ascii 모듈)
@anchor{library/curses ascii curses ascii HT}@anchor{35e1}
@deffn {데이터} curses.ascii.HT
@end deffn

@tab

@ref{35e0,,TAB}의 별칭: “가로 탭(Horizontal tab)”

@item

@geindex LF (curses.ascii 모듈)
@anchor{library/curses ascii curses ascii LF}@anchor{35e2}
@deffn {데이터} curses.ascii.LF
@end deffn

@tab

줄 바꿈(Line feed)

@item

@geindex NL (curses.ascii 모듈)
@anchor{library/curses ascii curses ascii NL}@anchor{35e3}
@deffn {데이터} curses.ascii.NL
@end deffn

@tab

@ref{35e2,,LF}의 별칭: “새 줄(New line)”

@item

@geindex VT (curses.ascii 모듈)
@anchor{library/curses ascii curses ascii VT}@anchor{35e4}
@deffn {데이터} curses.ascii.VT
@end deffn

@tab

세로 탭(Vertical tab)

@item

@geindex FF (curses.ascii 모듈)
@anchor{library/curses ascii curses ascii FF}@anchor{35e5}
@deffn {데이터} curses.ascii.FF
@end deffn

@tab

용지 공급(Form feed)

@item

@geindex CR (curses.ascii 모듈)
@anchor{library/curses ascii curses ascii CR}@anchor{35e6}
@deffn {데이터} curses.ascii.CR
@end deffn

@tab

캐리지 리턴(Carriage return)

@item

@geindex SO (curses.ascii 모듈)
@anchor{library/curses ascii curses ascii SO}@anchor{35e7}
@deffn {데이터} curses.ascii.SO
@end deffn

@tab

시프트 아웃(Shift-out), 대체 문자 집합 시작

@item

@geindex SI (curses.ascii 모듈)
@anchor{library/curses ascii curses ascii SI}@anchor{35e8}
@deffn {데이터} curses.ascii.SI
@end deffn

@tab

시프트 인(Shift-in), 기본 문자 집합 재개

@item

@geindex DLE (curses.ascii 모듈)
@anchor{library/curses ascii curses ascii DLE}@anchor{35e9}
@deffn {데이터} curses.ascii.DLE
@end deffn

@tab

데이터 링크 이스케이프(Data-link escape)

@item

@geindex DC1 (curses.ascii 모듈)
@anchor{library/curses ascii curses ascii DC1}@anchor{35ea}
@deffn {데이터} curses.ascii.DC1
@end deffn

@tab

XON, 흐름 제어용

@item

@geindex DC2 (curses.ascii 모듈)
@anchor{library/curses ascii curses ascii DC2}@anchor{35eb}
@deffn {데이터} curses.ascii.DC2
@end deffn

@tab

장치 제어(Device control) 2, 블록 모드 흐름 제어

@item

@geindex DC3 (curses.ascii 모듈)
@anchor{library/curses ascii curses ascii DC3}@anchor{35ec}
@deffn {데이터} curses.ascii.DC3
@end deffn

@tab

XOFF, 흐름 제어용

@item

@geindex DC4 (curses.ascii 모듈)
@anchor{library/curses ascii curses ascii DC4}@anchor{35ed}
@deffn {데이터} curses.ascii.DC4
@end deffn

@tab

장치 제어(Device control) 4

@item

@geindex NAK (curses.ascii 모듈)
@anchor{library/curses ascii curses ascii NAK}@anchor{35ee}
@deffn {데이터} curses.ascii.NAK
@end deffn

@tab

부정적 확인(Negative acknowledgement)

@item

@geindex SYN (curses.ascii 모듈)
@anchor{library/curses ascii curses ascii SYN}@anchor{35ef}
@deffn {데이터} curses.ascii.SYN
@end deffn

@tab

동기 대기(Synchronous idle)

@item

@geindex ETB (curses.ascii 모듈)
@anchor{library/curses ascii curses ascii ETB}@anchor{35f0}
@deffn {데이터} curses.ascii.ETB
@end deffn

@tab

전송 블록 종료(End transmission block)

@item

@geindex CAN (curses.ascii 모듈)
@anchor{library/curses ascii curses ascii CAN}@anchor{35f1}
@deffn {데이터} curses.ascii.CAN
@end deffn

@tab

취소(Cancel)

@item

@geindex EM (curses.ascii 모듈)
@anchor{library/curses ascii curses ascii EM}@anchor{35f2}
@deffn {데이터} curses.ascii.EM
@end deffn

@tab

매체의 끝(End of medium)

@item

@geindex SUB (curses.ascii 모듈)
@anchor{library/curses ascii curses ascii SUB}@anchor{35f3}
@deffn {데이터} curses.ascii.SUB
@end deffn

@tab

치환(Substitute)

@item

@geindex ESC (curses.ascii 모듈)
@anchor{library/curses ascii curses ascii ESC}@anchor{35f4}
@deffn {데이터} curses.ascii.ESC
@end deffn

@tab

탈출(Escape)

@item

@geindex FS (curses.ascii 모듈)
@anchor{library/curses ascii curses ascii FS}@anchor{35f5}
@deffn {데이터} curses.ascii.FS
@end deffn

@tab

파일 구분자(File separator)

@item

@geindex GS (curses.ascii 모듈)
@anchor{library/curses ascii curses ascii GS}@anchor{35f6}
@deffn {데이터} curses.ascii.GS
@end deffn

@tab

그룹 구분자(Group separator)

@item

@geindex RS (curses.ascii 모듈)
@anchor{library/curses ascii curses ascii RS}@anchor{35f7}
@deffn {데이터} curses.ascii.RS
@end deffn

@tab

레코드 구분자(Record separator), 블록 모드 종료자

@item

@geindex US (curses.ascii 모듈)
@anchor{library/curses ascii curses ascii US}@anchor{35f8}
@deffn {데이터} curses.ascii.US
@end deffn

@tab

단위 구분자(Unit separator)

@item

@geindex SP (curses.ascii 모듈)
@anchor{library/curses ascii curses ascii SP}@anchor{35f9}
@deffn {데이터} curses.ascii.SP
@end deffn

@tab

스페이스(Space)

@item

@geindex DEL (curses.ascii 모듈)
@anchor{library/curses ascii curses ascii DEL}@anchor{35fa}
@deffn {데이터} curses.ascii.DEL
@end deffn

@tab

삭제(Delete)

@end multitable


이들 중 많은 것들이 현대적인 사용법에서 실질적인 중요성을 거의 가지고 있지 않습니다. 니모닉은 디지털 컴퓨터 이전의 텔레 프린터 규칙에서 파생되었습니다.

이 모듈은 표준 C 라이브러리의 함수에 따라 다음 함수를 제공합니다:

@geindex isalnum() (curses.ascii 모듈)
@anchor{library/curses ascii curses ascii isalnum}@anchor{35fb}
@deffn {함수} curses.ascii.isalnum (c)

ASCII 영숫자를 확인합니다; @code{isalpha(c) or isdigit(c)}와 동등합니다.
@end deffn

@geindex isalpha() (curses.ascii 모듈)
@anchor{library/curses ascii curses ascii isalpha}@anchor{35fc}
@deffn {함수} curses.ascii.isalpha (c)

ASCII 알파벳 문자를 확인합니다. @code{isupper(c) or islower(c)}와 동등합니다.
@end deffn

@geindex isascii() (curses.ascii 모듈)
@anchor{library/curses ascii curses ascii isascii}@anchor{35fd}
@deffn {함수} curses.ascii.isascii (c)

7비트 ASCII 집합에 맞는 문자 값을 확인합니다.
@end deffn

@geindex isblank() (curses.ascii 모듈)
@anchor{library/curses ascii curses ascii isblank}@anchor{35fe}
@deffn {함수} curses.ascii.isblank (c)

ASCII 공백 문자를 확인합니다; 스페이스나 가로 탭.
@end deffn

@geindex iscntrl() (curses.ascii 모듈)
@anchor{library/curses ascii curses ascii iscntrl}@anchor{35ff}
@deffn {함수} curses.ascii.iscntrl (c)

ASCII 제어 문자를 확인합니다 (0x00에서 0x1f 범위에 있거나 0x7f).
@end deffn

@geindex isdigit() (curses.ascii 모듈)
@anchor{library/curses ascii curses ascii isdigit}@anchor{3600}
@deffn {함수} curses.ascii.isdigit (c)

ASCII 십진 숫자, @code{'0'} 에서 @code{'9'}를 확인합니다. 이것은 @code{c in string.digits}와 동등합니다.
@end deffn

@geindex isgraph() (curses.ascii 모듈)
@anchor{library/curses ascii curses ascii isgraph}@anchor{3601}
@deffn {함수} curses.ascii.isgraph (c)

스페이스를 제외한 인쇄 가능한 ASCII 문자를 확인합니다.
@end deffn

@geindex islower() (curses.ascii 모듈)
@anchor{library/curses ascii curses ascii islower}@anchor{3602}
@deffn {함수} curses.ascii.islower (c)

ASCII 소문자를 확인합니다.
@end deffn

@geindex isprint() (curses.ascii 모듈)
@anchor{library/curses ascii curses ascii isprint}@anchor{3603}
@deffn {함수} curses.ascii.isprint (c)

스페이스를 포함하여 인쇄 가능한 ASCII 문자를 확인합니다.
@end deffn

@geindex ispunct() (curses.ascii 모듈)
@anchor{library/curses ascii curses ascii ispunct}@anchor{3604}
@deffn {함수} curses.ascii.ispunct (c)

스페이스나 영숫자가 아닌 인쇄 가능한 ASCII 문자를 확인합니다.
@end deffn

@geindex isspace() (curses.ascii 모듈)
@anchor{library/curses ascii curses ascii isspace}@anchor{3605}
@deffn {함수} curses.ascii.isspace (c)

ASCII 공백 문자를 확인합니다; 스페이스, 줄 바꿈, 캐리지 리턴, 용지 공급, 가로 탭, 세로 탭.
@end deffn

@geindex isupper() (curses.ascii 모듈)
@anchor{library/curses ascii curses ascii isupper}@anchor{3606}
@deffn {함수} curses.ascii.isupper (c)

ASCII 대문자를 확인합니다.
@end deffn

@geindex isxdigit() (curses.ascii 모듈)
@anchor{library/curses ascii curses ascii isxdigit}@anchor{3607}
@deffn {함수} curses.ascii.isxdigit (c)

ASCII 16진수를 확인합니다. 이것은 @code{c in string.hexdigits}와 동등합니다.
@end deffn

@geindex isctrl() (curses.ascii 모듈)
@anchor{library/curses ascii curses ascii isctrl}@anchor{3608}
@deffn {함수} curses.ascii.isctrl (c)

ASCII 제어 문자를 확인합니다 (정숫값 0에서 31).
@end deffn

@geindex ismeta() (curses.ascii 모듈)
@anchor{library/curses ascii curses ascii ismeta}@anchor{3609}
@deffn {함수} curses.ascii.ismeta (c)

비 ASCII 문자를 확인합니다 (0x80 이상의 정수 값).
@end deffn

이 함수는 정수나 단일 문자 문자열을 받아들입니다; 인자가 문자열이면, 내장 함수 @ref{2338,,ord()}를 사용하여 먼저 변환됩니다.

이 모든 함수는 전달한 문자열의 문자에서 파생된 서수 비트 값을 확인합니다; 호스트 기계의 문자 인코딩에 대해서는 실제로 아무것도 모릅니다.

다음 두 함수는 단일 문자 문자열이나 정수 바이트 값을 취합니다; 이들은 같은 유형의 값을 반환합니다.

@geindex ascii() (curses.ascii 모듈)
@anchor{library/curses ascii curses ascii ascii}@anchor{360a}
@deffn {함수} curses.ascii.ascii (c)

`c'의 하위 7비트에 해당하는 ASCII 값을 반환합니다.
@end deffn

@geindex ctrl() (curses.ascii 모듈)
@anchor{library/curses ascii curses ascii ctrl}@anchor{360b}
@deffn {함수} curses.ascii.ctrl (c)

주어진 문자에 해당하는 제어 문자를 반환합니다 (문자 비트 값은 0x1f와 비트별 and 됩니다).
@end deffn

@geindex alt() (curses.ascii 모듈)
@anchor{library/curses ascii curses ascii alt}@anchor{360c}
@deffn {함수} curses.ascii.alt (c)

주어진 ASCII 문자에 해당하는 8비트 문자를 반환합니다 (문자 비트 값은 0x80과 비트별 or 됩니다).
@end deffn

다음 함수는 단일 문자 문자열이나 정숫값을 취합니다; 문자열을 반환합니다.

@geindex ^ (캐럿);curses 모듈
@geindex ! (느낌표);curses 모듈

@geindex unctrl() (curses.ascii 모듈)
@anchor{library/curses ascii curses ascii unctrl}@anchor{360d}
@deffn {함수} curses.ascii.unctrl (c)

ASCII 문자 `c'의 문자열 표현을 반환합니다. `c'가 인쇄 가능하면, 이 문자열은 문자 자체입니다. 문자가 제어 문자(0x00–0x1f)이면 문자열은 캐럿(@code{'^'})과 그 뒤에 오는 해당 대문자로 구성됩니다. 문자가 ASCII 삭제(0x7f)이면 문자열은 @code{'^?'}입니다. 문자에 메타 비트(0x80)가 설정되어 있으면, 메타 비트가 제거되고, 앞의 규칙을 적용한 후, @code{'!'}를 결과 앞에 붙입니다.
@end deffn

@geindex controlnames (curses.ascii 모듈)
@anchor{library/curses ascii curses ascii controlnames}@anchor{360e}
@deffn {데이터} curses.ascii.controlnames

0(NUL)에서 0x1f(US)까지 32개의 ASCII 제어 문자에 대한 ASCII 니모닉과 (순서대로), 스페이스 문자를 위한 니모닉 @code{SP}를 포함하는 33요소 문자열 배열입니다.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node curses panel — curses 용 패널 스택 확장,cmd — 줄 지향 명령 인터프리터 지원,curses ascii — ASCII 문자용 유틸리티,Command-line interface libraries
@anchor{library/curses panel doc}@anchor{360f}@anchor{library/curses panel curses-panel-a-panel-stack-extension-for-curses}@anchor{3610}@anchor{library/curses panel module-curses panel}@anchor{31}@anchor{library/curses panel translation-repo}@anchor{3611}
@subsection @code{curses.panel} — curses 용 패널 스택 확장


@geindex module; curses.panel


__________________________________________________________________


패널은 깊이 기능이 추가된 창이라서, 서로의 위에 쌓을 수 있으며, 각 창의 보이는 부분만 표시됩니다. 패널을 추가하고, 스택에서 위나 아래로 옮기고, 제거할 수 있습니다.

@menu
* 함수: 함수<6>. 
* Panel 객체:: 

@end menu

@node 함수<6>,Panel 객체,,curses panel — curses 용 패널 스택 확장
@anchor{library/curses panel cursespanel-functions}@anchor{3612}@anchor{library/curses panel functions}@anchor{3613}
@subsubsection 함수


The module @code{curses.panel} defines the following functions:

@geindex bottom_panel() (curses.panel 모듈)
@anchor{library/curses panel curses panel bottom_panel}@anchor{3614}
@deffn {함수} curses.panel.bottom_panel ()

패널 스택에서 최하단 패널을 반환합니다.
@end deffn

@geindex new_panel() (curses.panel 모듈)
@anchor{library/curses panel curses panel new_panel}@anchor{3615}
@deffn {함수} curses.panel.new_panel (win)

주어진 창 `win'과 연관 지어진 패널 객체를 반환합니다. 반환된 패널 객체가 명시적으로 참조되도록 유지해야 합니다. 그렇지 않으면 패널 객체는 가비지 수집되어 패널 스택에서 제거됩니다.
@end deffn

@geindex top_panel() (curses.panel 모듈)
@anchor{library/curses panel curses panel top_panel}@anchor{3616}
@deffn {함수} curses.panel.top_panel ()

패널 스택의 최상단 패널을 반환합니다.
@end deffn

@geindex update_panels() (curses.panel 모듈)
@anchor{library/curses panel curses panel update_panels}@anchor{3617}
@deffn {함수} curses.panel.update_panels ()

패널 스택이 변경된 후 가상 화면을 갱신합니다. 이것은 @ref{34a4,,curses.doupdate()}를 호출하지 않아서, 여러분이 직접 해야 합니다.
@end deffn

@node Panel 객체,,함수<6>,curses panel — curses 용 패널 스택 확장
@anchor{library/curses panel curses-panel-objects}@anchor{3618}@anchor{library/curses panel panel-objects}@anchor{3619}
@subsubsection Panel 객체


위의 @ref{3615,,new_panel()}에 의해 반환된 패널 객체는 쌓인 순서가 있는 창입니다. 패널과 연관된 창이 항상 있고, 창이 내용을 결정합니다. 패널 메서드는 패널 스택에서 창의 깊이를 담당합니다.

패널 객체에는 다음과 같은 메서드가 있습니다:

@geindex above() (curses.panel.Panel 메서드)
@anchor{library/curses panel curses panel Panel above}@anchor{361a}
@deffn {메서드} Panel.above ()

현재 패널 위의 패널을 반환합니다.
@end deffn

@geindex below() (curses.panel.Panel 메서드)
@anchor{library/curses panel curses panel Panel below}@anchor{361b}
@deffn {메서드} Panel.below ()

현재 패널 아래의 패널을 반환합니다.
@end deffn

@geindex bottom() (curses.panel.Panel 메서드)
@anchor{library/curses panel curses panel Panel bottom}@anchor{361c}
@deffn {메서드} Panel.bottom ()

패널을 스택 맨 아래로 밉니다.”
@end deffn

@geindex hidden() (curses.panel.Panel 메서드)
@anchor{library/curses panel curses panel Panel hidden}@anchor{361d}
@deffn {메서드} Panel.hidden ()

패널이 숨겨져 있으면 (보이지 않으면) @code{True}를, 그렇지 않으면 @code{False}를 반환합니다.
@end deffn

@geindex hide() (curses.panel.Panel 메서드)
@anchor{library/curses panel curses panel Panel hide}@anchor{361e}
@deffn {메서드} Panel.hide ()

패널을 숨깁니다. 이것은 객체를 삭제하지 않고, 화면의 창을 보이지 않게 합니다.
@end deffn

@geindex move() (curses.panel.Panel 메서드)
@anchor{library/curses panel curses panel Panel move}@anchor{361f}
@deffn {메서드} Panel.move (y, x)

패널을 화면 좌표 @code{(y, x)}로 이동합니다.
@end deffn

@geindex replace() (curses.panel.Panel 메서드)
@anchor{library/curses panel curses panel Panel replace}@anchor{3620}
@deffn {메서드} Panel.replace (win)

패널과 연관된 창을 창 `win'으로 변경합니다.
@end deffn

@geindex set_userptr() (curses.panel.Panel 메서드)
@anchor{library/curses panel curses panel Panel set_userptr}@anchor{3621}
@deffn {메서드} Panel.set_userptr (obj)

패널의 사용자 포인터를 `obj'로 설정합니다. 이것은 임의의 데이터를 패널과 연관시키는 데 사용되며, 임의의 파이썬 객체가 될 수 있습니다.
@end deffn

@geindex show() (curses.panel.Panel 메서드)
@anchor{library/curses panel curses panel Panel show}@anchor{3622}
@deffn {메서드} Panel.show ()

(숨겼을 수도 있는) 패널을 표시합니다.
@end deffn

@geindex top() (curses.panel.Panel 메서드)
@anchor{library/curses panel curses panel Panel top}@anchor{3623}
@deffn {메서드} Panel.top ()

패널을 스택 맨 위로 밉니다.
@end deffn

@geindex userptr() (curses.panel.Panel 메서드)
@anchor{library/curses panel curses panel Panel userptr}@anchor{3624}
@deffn {메서드} Panel.userptr ()

패널의 사용자 포인터를 반환합니다. 이것은 임의의 파이썬 객체일 수 있습니다.
@end deffn

@geindex window() (curses.panel.Panel 메서드)
@anchor{library/curses panel curses panel Panel window}@anchor{3625}
@deffn {메서드} Panel.window ()

패널과 연관된 창 객체를 반환합니다.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node cmd — 줄 지향 명령 인터프리터 지원,,curses panel — curses 용 패널 스택 확장,Command-line interface libraries
@anchor{library/cmd doc}@anchor{3626}@anchor{library/cmd cmd-support-for-line-oriented-command-interpreters}@anchor{3627}@anchor{library/cmd module-cmd}@anchor{1a}@anchor{library/cmd translation-repo}@anchor{3628}
@subsection @code{cmd} — 줄 지향 명령 인터프리터 지원


@geindex module; cmd

`소스 코드:' Lib/cmd.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/cmd.py}


__________________________________________________________________


@ref{1850,,Cmd} 클래스는 줄 지향 명령 인터프리터를 작성하기 위한 간단한 프레임워크를 제공합니다. 이것들은 종종 테스트 하네스(test harnesses), 관리 도구 및 나중에 더 복잡한 인터페이스로 포장될 프로토타입에 유용합니다.

@geindex Cmd (cmd 클래스)
@anchor{library/cmd cmd Cmd}@anchor{1850}
@deffn {클래스} cmd.Cmd (completekey='tab', stdin=None, stdout=None)

@ref{1850,,Cmd} 인스턴스나 서브 클래스 인스턴스는 줄 지향 인터프리터 프레임워크입니다. @code{Cmd} 자체를 인스턴스로 만들 이유는 없습니다; 그보다는, @code{Cmd}의 메서드를 상속하고 액션 메서드를 캡슐화하기 위해 여러분 스스로 정의한 인터프리터 클래스의 슈퍼 클래스로 유용합니다.

선택적 인자 `completekey'는 완성 키(completion key)의 @ref{bf,,readline} 이름입니다; 기본값은 @code{Tab}입니다. `completekey'가 @ref{884,,None}이 아니고 @code{readline}을 사용할 수 있으면, 명령 완성이 자동으로 수행됩니다.

The default, @code{'tab'}, is treated specially, so that it refers to the
@code{Tab} key on every @ref{1a27,,readline.backend}.
Specifically, if @code{readline.backend} is @code{editline},
@code{Cmd} will use @code{'^I'} instead of @code{'tab'}.
Note that other values are not treated this way, and might only work
with a specific backend.

선택적 인자 `stdin'과 `stdout'은 Cmd 인스턴스나 서브 클래스 인스턴스가 입출력에 사용할 입력과 출력 파일 객체를 지정합니다. 지정하지 않으면, 기본적으로 @ref{75e,,sys.stdin}과 @ref{ccc,,sys.stdout}이 됩니다.

지정된 `stdin'을 사용하려면, 인스턴스의 @ref{3629,,use_rawinput} 어트리뷰트를 @code{False}로 설정해야 합니다, 그렇지 않으면 `stdin'이 무시됩니다.


버전 3.13에서 변경: @code{completekey='tab'} is replaced by @code{'^I'} for @code{editline}.

@end deffn

@menu
* Cmd 객체:: 
* Cmd 예:: 

@end menu

@node Cmd 객체,Cmd 예,,cmd — 줄 지향 명령 인터프리터 지원
@anchor{library/cmd cmd-objects}@anchor{362a}@anchor{library/cmd id1}@anchor{362b}
@subsubsection Cmd 객체


@ref{1850,,Cmd} 인스턴스에는 다음과 같은 메서드가 있습니다:

@geindex cmdloop() (cmd.Cmd 메서드)
@anchor{library/cmd cmd Cmd cmdloop}@anchor{362c}
@deffn {메서드} Cmd.cmdloop (intro=None)

반복해서 프롬프트를 제시하고, 입력을 받아들이고, 수신된 입력에서 초기 접두사를 구문 분석하고, 줄의 나머지 부분을 인자로 전달해서 액션 메서드를 호출합니다.

선택적 인자는 첫 번째 프롬프트 전에 제시할 배너나 소개 문자열입니다 (이것은 @ref{362d,,intro} 클래스 어트리뷰트를 재정의합니다).

@ref{bf,,readline} 모듈이 로드되면, 입력은 자동으로 @code{bash}와 유사한 히스토리 목록 편집을 상속합니다 (예를 들어, @code{Control}-@code{P}는 직전 명령으로 돌아가고(scroll back), @code{Control}-@code{N}은 다음 명령으로 이동하고(forward), @code{Control}-@code{F}는 커서를 비파괴적으로 오른쪽으로 이동하고, @code{Control}-@code{B}는 커서를 비파괴적으로 왼쪽으로 이동하고, 등등).

입력의 파일 끝(end-of-file)은 문자열 @code{'EOF'}로 전달됩니다.

@geindex ? (물음표);명령 인터프리터에서
@geindex ! (느낌표);명령 인터프리터에서

인터프리터 인스턴스는 메서드 @code{do_foo()}가 있을 때만 명령 이름 @code{foo}를 인식합니다. 특수한 경우로, 문자 @code{'?'}로 시작하는 줄은 메서드 @ref{1a2b,,do_help()}를 호출합니다. 또 다른 특수한 경우로, 문자 @code{'!'}로 시작하는 줄은 메서드 @code{do_shell()}을 (해당 메서드가 정의되었다면) 호출합니다.

이 메서드는 @ref{362e,,postcmd()} 메서드가 참값을 반환할 때 반환합니다. @code{postcmd()}에 대한 `stop' 인자는 명령의 해당 @code{do_*()} 메서드에서 반환되는 값입니다.

완성(completion)이 활성화되면, 명령 완성이 자동으로 수행되고, 명령 인자의 완성은 인자 `text', `line', `begidx' 및 `endidx'로 @code{complete_foo()}를 호출하여 수행됩니다. `text'는 일치시키려는 문자열 접두사입니다: 반환된 모든 일치는 이 문자열로 시작해야 합니다. `line'은 선행 공백이 제거된 현재 입력 줄이며, `begidx'와 `endidx'는 접두사 텍스트의 시작과 끝 인덱스로, 인자의 위치에 따라 다른 완성을 제공하는 데 사용될 수 있습니다.
@end deffn

@geindex do_help() (cmd.Cmd 메서드)
@anchor{library/cmd cmd Cmd do_help}@anchor{1a2b}
@deffn {메서드} Cmd.do_help (arg)

@ref{1850,,Cmd}의 모든 서브 클래스는 미리 정의된 @code{do_help()}를 상속합니다. 인자 @code{'bar'}로 호출되면, 이 메서드는 해당 메서드 @code{help_bar()}를 호출하고, 존재하지 않으면 @code{do_bar()}의 독스트링이 있다면 인쇄합니다. 인자가 없으면, @code{do_help()}는 사용 가능한 모든 도움말 주제(즉, 해당 @code{help_*()} 메서드가 있거나 독스트링이 있는 모든 명령)을 나열하고, 설명이 없는 명령도 나열합니다.
@end deffn

@geindex onecmd() (cmd.Cmd 메서드)
@anchor{library/cmd cmd Cmd onecmd}@anchor{362f}
@deffn {메서드} Cmd.onecmd (str)

프롬프트에 대한 응답으로 입력된 것처럼 인자를 해석합니다. 재정의될 수도 있지만, 일반적으로 그럴 필요가 없어야 합니다; 유용한 실행 훅에 대해서는 @ref{3630,,precmd()}와 @ref{362e,,postcmd()} 메서드를 참조하십시오. 반환 값은 인터프리터의 명령 해석이 중지되어야 하는지를 나타내는 플래그입니다. 명령 `str'을 위한 @code{do_*()} 메서드가 있으면, 해당 메서드의 반환 값이 반환되고, 그렇지 않으면 @ref{3631,,default()} 메서드의 반환 값이 반환됩니다.
@end deffn

@geindex emptyline() (cmd.Cmd 메서드)
@anchor{library/cmd cmd Cmd emptyline}@anchor{3632}
@deffn {메서드} Cmd.emptyline ()

프롬프트에 응답하여 빈 줄을 입력할 때 호출되는 메서드. 이 메서드를 재정의하지 않으면, 입력된 마지막 비어 있지 않은 명령을 반복합니다.
@end deffn

@geindex default() (cmd.Cmd 메서드)
@anchor{library/cmd cmd Cmd default}@anchor{3631}
@deffn {메서드} Cmd.default (line)

명령 접두사가 인식되지 않을 때 입력 줄로 호출되는 메서드. 이 메서드를 재정의하지 않으면, 에러 메시지를 인쇄하고 반환합니다.
@end deffn

@geindex completedefault() (cmd.Cmd 메서드)
@anchor{library/cmd cmd Cmd completedefault}@anchor{3633}
@deffn {메서드} Cmd.completedefault (text, line, begidx, endidx)

명령 별 @code{complete_*()} 메서드가 없을 때 입력 줄을 완성하기 위해 호출되는 메서드. 기본적으로, 빈 리스트를 반환합니다.
@end deffn

@geindex columnize() (cmd.Cmd 메서드)
@anchor{library/cmd cmd Cmd columnize}@anchor{1c07}
@deffn {메서드} Cmd.columnize (list, displaywidth=80)

Method called to display a list of strings as a compact set of columns.
Each column is only as wide as necessary.
Columns are separated by two spaces for readability.
@end deffn

@geindex precmd() (cmd.Cmd 메서드)
@anchor{library/cmd cmd Cmd precmd}@anchor{3630}
@deffn {메서드} Cmd.precmd (line)

명령 줄 `line'을 해석하기 직전에, 하지만 입력 프롬프트가 생성되고 제시된 후에 실행되는 훅 메서드. 이 메서드는 @ref{1850,,Cmd}에서는 스텁(stub)입니다; 서브 클래스에 의해 재정의되기 위해 존재합니다. 반환 값은 @ref{362f,,onecmd()} 메서드에 의해 실행될 명령으로 사용됩니다; @ref{3630,,precmd()} 구현은 명령을 다시 쓰거나 단순히 `line'을 변경하지 않고 반환 할 수 있습니다.
@end deffn

@geindex postcmd() (cmd.Cmd 메서드)
@anchor{library/cmd cmd Cmd postcmd}@anchor{362e}
@deffn {메서드} Cmd.postcmd (stop, line)

명령 호출이 완료된 직후에 실행되는 훅 메서드. 이 메서는 @ref{1850,,Cmd}에서는 스텁(stub)입니다; 서브 클래스에 의해 재정의되기 위해 존재합니다. `line'은 실행된 명령 줄이고, `stop'은 @ref{362e,,postcmd()}를 호출한 후 실행이 종료될지를 나타내는 플래그입니다; 이것은 @ref{362f,,onecmd()} 메서드의 반환 값입니다. 이 메서드의 반환 값은 `stop'에 해당하는 내부 플래그의 새 값으로 사용됩니다; 거짓을 반환하면 해석이 계속됩니다.
@end deffn

@geindex preloop() (cmd.Cmd 메서드)
@anchor{library/cmd cmd Cmd preloop}@anchor{3634}
@deffn {메서드} Cmd.preloop ()

@ref{362c,,cmdloop()}가 호출될 때 한 번 실행되는 훅 메서드. 이 메서드는 @ref{1850,,Cmd}에서는 스텁(stub)입니다; 서브 클래스에 의해 재정의되기 위해 존재합니다.
@end deffn

@geindex postloop() (cmd.Cmd 메서드)
@anchor{library/cmd cmd Cmd postloop}@anchor{3635}
@deffn {메서드} Cmd.postloop ()

@ref{362c,,cmdloop()}가 반환하려고 할 때 한 번 실행되는 훅 메서드. 이 메서드는 @ref{1850,,Cmd}에서는 스텁(stub)입니다; 서브 클래스에 의해 재정의되기 위해 존재합니다.
@end deffn

@ref{1850,,Cmd} 서브 클래스의 인스턴스에는 몇 가지 공용 인스턴스 변수가 있습니다:

@geindex prompt (cmd.Cmd의 속성)
@anchor{library/cmd cmd Cmd prompt}@anchor{3636}
@deffn {속성} Cmd.prompt

입력을 요청하는 프롬프트.
@end deffn

@geindex identchars (cmd.Cmd의 속성)
@anchor{library/cmd cmd Cmd identchars}@anchor{3637}
@deffn {속성} Cmd.identchars

명령 접두사에 허용되는 문자들의 문자열.
@end deffn

@geindex lastcmd (cmd.Cmd의 속성)
@anchor{library/cmd cmd Cmd lastcmd}@anchor{3638}
@deffn {속성} Cmd.lastcmd

비어 있지 않은 마지막 명령 접두사.
@end deffn

@geindex cmdqueue (cmd.Cmd의 속성)
@anchor{library/cmd cmd Cmd cmdqueue}@anchor{3639}
@deffn {속성} Cmd.cmdqueue

계류 중인 입력 줄의 리스트. cmdqueue 리스트는 새로운 입력이 필요할 때 @ref{362c,,cmdloop()}에서 점검됩니다; 비어 있지 않으면, 프롬프트에서 입력한 것처럼 해당 요소가 순서대로 처리됩니다.
@end deffn

@geindex intro (cmd.Cmd의 속성)
@anchor{library/cmd cmd Cmd intro}@anchor{362d}
@deffn {속성} Cmd.intro

소개나 배너로 제시할 문자열. @ref{362c,,cmdloop()} 메서드에 인자를 제공하여 재정의할 수 있습니다.
@end deffn

@geindex doc_header (cmd.Cmd의 속성)
@anchor{library/cmd cmd Cmd doc_header}@anchor{363a}
@deffn {속성} Cmd.doc_header

도움말 출력에 설명된 명령 섹션이 있을 때 제시할 헤더입니다.
@end deffn

@geindex misc_header (cmd.Cmd의 속성)
@anchor{library/cmd cmd Cmd misc_header}@anchor{363b}
@deffn {속성} Cmd.misc_header

도움말 출력에 기타 도움말 주제에 대한 섹션이 있을 때 제시할 헤더 (즉, 해당 @code{do_*()} 메서드가 없는 @code{help_*()} 메서드가 있을 때).
@end deffn

@geindex undoc_header (cmd.Cmd의 속성)
@anchor{library/cmd cmd Cmd undoc_header}@anchor{363c}
@deffn {속성} Cmd.undoc_header

도움말 출력에 설명되지 않은 명령에 대한 섹션이 있을 때 제시할 헤더 (즉, 해당 @code{help_*()} 메서드가 없는 @code{do_*()} 메서드가 있을 때).
@end deffn

@geindex ruler (cmd.Cmd의 속성)
@anchor{library/cmd cmd Cmd ruler}@anchor{363d}
@deffn {속성} Cmd.ruler

도움말 메시지 헤더 아래에 구분선을 그리는 데 사용되는 문자입니다. 비어 있으면, 눈금자 선이 그려지지 않습니다. 기본값은 @code{'='}입니다.
@end deffn

@geindex use_rawinput (cmd.Cmd의 속성)
@anchor{library/cmd cmd Cmd use_rawinput}@anchor{3629}
@deffn {속성} Cmd.use_rawinput

기본값이 참인 플래그. 참이면, @ref{362c,,cmdloop()}는 @ref{14dd,,input()}을 사용하여 프롬프트를 표시하고 다음 명령을 읽습니다; 거짓이면, @ref{ccc,,sys.stdout.write()}와 @ref{75e,,sys.stdin.readline()}이 사용됩니다. (이는 지원하는 시스템에서 @ref{bf,,readline}를 임포트 함으로써, 인터프리터가 @code{Emacs}와 유사한 줄 편집과 명령 히스토리 키 입력을 자동으로 지원한다는 의미입니다.)
@end deffn

@node Cmd 예,,Cmd 객체,cmd — 줄 지향 명령 인터프리터 지원
@anchor{library/cmd cmd-example}@anchor{363e}@anchor{library/cmd id2}@anchor{363f}
@subsubsection Cmd 예


The @code{cmd} module is mainly useful for building custom shells that let a
user work with a program interactively.

이 섹션에서는 @ref{107,,turtle} 모듈의 몇 가지 명령을 중심으로 셸을 작성하는 방법에 대한 간단한 예를 제공합니다.

@ref{3640,,forward()}와 같은 기본 turtle 명령은 @code{do_forward()}라는 메서드로 @ref{1850,,Cmd} 서브 클래스에 추가됩니다. 인자는 숫자로 변환되어 turtle 모듈로 전달됩니다. 독스트링은 셸에서 제공하는 도움말 유틸리티에서 사용됩니다.

이 예제에는 @ref{3630,,precmd()} 메서드로 구현된 기초적인 녹화와 재생 기능도 포함되는데, 이 메서드는 입력을 소문자로 변환하고 명령을 파일에 쓰는 역할을 합니다. @code{do_playback()} 메서드는 파일을 읽고 즉시 재생하기 위해 녹화된 명령을 @ref{3639,,cmdqueue}에 추가합니다:

@example
import cmd, sys
from turtle import *

class TurtleShell(cmd.Cmd):
    intro = 'Welcome to the turtle shell.   Type help or ? to list commands.\n'
    prompt = '(turtle) '
    file = None

    # ----- basic turtle commands -----
    def do_forward(self, arg):
        'Move the turtle forward by the specified distance:  FORWARD 10'
        forward(*parse(arg))
    def do_right(self, arg):
        'Turn turtle right by given number of degrees:  RIGHT 20'
        right(*parse(arg))
    def do_left(self, arg):
        'Turn turtle left by given number of degrees:  LEFT 90'
        left(*parse(arg))
    def do_goto(self, arg):
        'Move turtle to an absolute position with changing orientation.  GOTO 100 200'
        goto(*parse(arg))
    def do_home(self, arg):
        'Return turtle to the home position:  HOME'
        home()
    def do_circle(self, arg):
        'Draw circle with given radius an options extent and steps:  CIRCLE 50'
        circle(*parse(arg))
    def do_position(self, arg):
        'Print the current turtle position:  POSITION'
        print('Current position is %d %d\n' % position())
    def do_heading(self, arg):
        'Print the current turtle heading in degrees:  HEADING'
        print('Current heading is %d\n' % (heading(),))
    def do_color(self, arg):
        'Set the color:  COLOR BLUE'
        color(arg.lower())
    def do_undo(self, arg):
        'Undo (repeatedly) the last turtle action(s):  UNDO'
    def do_reset(self, arg):
        'Clear the screen and return turtle to center:  RESET'
        reset()
    def do_bye(self, arg):
        'Stop recording, close the turtle window, and exit:  BYE'
        print('Thank you for using Turtle')
        self.close()
        bye()
        return True

    # ----- record and playback -----
    def do_record(self, arg):
        'Save future commands to filename:  RECORD rose.cmd'
        self.file = open(arg, 'w')
    def do_playback(self, arg):
        'Playback commands from a file:  PLAYBACK rose.cmd'
        self.close()
        with open(arg) as f:
            self.cmdqueue.extend(f.read().splitlines())
    def precmd(self, line):
        line = line.lower()
        if self.file and 'playback' not in line:
            print(line, file=self.file)
        return line
    def close(self):
        if self.file:
            self.file.close()
            self.file = None

def parse(arg):
    'Convert a series of zero or more numbers to an argument tuple'
    return tuple(map(int, arg.split()))

if __name__ == '__main__':
    TurtleShell().cmdloop()
@end example

다음은 도움말 기능과, 명령을 반복하기 위해 빈 줄을 사용하는 방법과, 간단한 녹화와 재생기능을 보여주기 위해 turtle 셀을 사용한 예제 세션입니다:

@example
Welcome to the turtle shell.   Type help or ? to list commands.

(turtle) ?

Documented commands (type help <topic>):
========================================
bye     color    goto     home  playback  record  right
circle  forward  heading  left  position  reset   undo

(turtle) help forward
Move the turtle forward by the specified distance:  FORWARD 10
(turtle) record spiral.cmd
(turtle) position
Current position is 0 0

(turtle) heading
Current heading is 0

(turtle) reset
(turtle) circle 20
(turtle) right 30
(turtle) circle 40
(turtle) right 30
(turtle) circle 60
(turtle) right 30
(turtle) circle 80
(turtle) right 30
(turtle) circle 100
(turtle) right 30
(turtle) circle 120
(turtle) right 30
(turtle) circle 120
(turtle) heading
Current heading is 180

(turtle) forward 100
(turtle)
(turtle) right 90
(turtle) forward 100
(turtle)
(turtle) right 90
(turtle) forward 400
(turtle) right 90
(turtle) forward 500
(turtle) right 90
(turtle) forward 400
(turtle) right 90
(turtle) forward 300
(turtle) playback spiral.cmd
Current position is 0 0

Current heading is 0

Current heading is 180

(turtle) bye
Thank you for using Turtle
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 동시 실행,네트워킹과 프로세스 간 통신,Command-line interface libraries,파이썬 표준 라이브러리
@anchor{library/concurrency doc}@anchor{3641}@anchor{library/concurrency concurrency}@anchor{3642}@anchor{library/concurrency concurrent-execution}@anchor{3643}@anchor{library/concurrency translation-repo}@anchor{3644}
@section 동시 실행


이 장에서 설명하는 모듈은 코드의 동시 실행을 지원합니다. 적절한 도구 선택은 실행할 작업(CPU 병목 대 IO 병목)과 선호하는 개발 스타일(이벤트 구동 협력적 다중작업 대 선점적 다중작업)에 따라 달라집니다. 다음은 개요입니다:

@menu
* threading — 스레드 기반 병렬 처리:: 
* multiprocessing — Process-based parallelism:: 
* multiprocessing.shared_memory — 프로세스 간 직접 액세스를 위한 공유 메모리: multiprocessing shared_memory — 프로세스 간 직접 액세스를 위한 공유 메모리. 
* concurrent 패키지:: 
* concurrent.futures — 병렬 작업 실행하기: concurrent futures — 병렬 작업 실행하기. 
* concurrent.interpreters — Multiple interpreters in the same process: concurrent interpreters — Multiple interpreters in the same process. 
* subprocess — 서브 프로세스 관리:: 
* sched — 이벤트 스케줄러:: 
* queue — 동기화된 큐 클래스:: 
* contextvars — 컨텍스트 변수:: 
* _thread — 저수준 스레드 API:: 

@end menu

@node threading — 스레드 기반 병렬 처리,multiprocessing — Process-based parallelism,,동시 실행
@anchor{library/threading doc}@anchor{3645}@anchor{library/threading module-threading}@anchor{f3}@anchor{library/threading threading-thread-based-parallelism}@anchor{3646}
@subsection @code{threading} — 스레드 기반 병렬 처리


@geindex module; threading

`소스 코드:' Lib/threading.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/threading.py}


__________________________________________________________________


이 모듈은 저수준 @ref{2,,_thread} 모듈 위에 고수준 스레딩 인터페이스를 구축합니다.

@c include for modules that don't work on WASM

@ref{213c,,가용성}: not WASI.

이 모듈은 웹어셈블리에서 작동하지 않거나 제공되지 않습니다. 자세한 내용은 @ref{1b68,,웹어셈블리 플랫폼}을 참조하세요.

@menu
* Introduction: Introduction<5>. 
* GIL and performance considerations:: 
* Reference: Reference<2>. 
* with 문으로 록@comma{} 조건 및 세마포어 사용하기: with 문으로 록 조건 및 세마포어 사용하기. 

@end menu

@node Introduction<5>,GIL and performance considerations,,threading — 스레드 기반 병렬 처리
@anchor{library/threading introduction}@anchor{3647}
@subsubsection Introduction


The @code{threading} module provides a way to run multiple threads@footnote{https://en.wikipedia.org/wiki/Thread_(computing)} (smaller
units of a process) concurrently within a single process. It allows for the
creation and management of threads, making it possible to execute tasks in
parallel, sharing memory space. Threads are particularly useful when tasks are
I/O bound, such as file operations or making network requests,
where much of the time is spent waiting for external resources.

A typical use case for @code{threading} includes managing a pool of worker
threads that can process multiple tasks concurrently.  Here’s a basic example of
creating and starting threads using @ref{176,,Thread}:

@example
import threading
import time

def crawl(link, delay=3):
    print(f"crawl started for @{link@}")
    time.sleep(delay)  # Blocking I/O (simulating a network request)
    print(f"crawl ended for @{link@}")

links = [
    "https://python.org",
    "https://docs.python.org",
    "https://peps.python.org",
]

# Start threads for each link
threads = []
for link in links:
    # Using `args` to pass positional arguments and `kwargs` for keyword arguments
    t = threading.Thread(target=crawl, args=(link,), kwargs=@{"delay": 2@})
    threads.append(t)

# Start each thread
for t in threads:
    t.start()

# Wait for all threads to finish
for t in threads:
    t.join()
@end example


버전 3.7에서 변경: 이 모듈은 선택 사양이었지만, 이제는 항상 사용 가능합니다.



@subsubheading 더 보기


@ref{948,,concurrent.futures.ThreadPoolExecutor} offers a higher level interface
to push tasks to a background thread without blocking execution of the
calling thread, while still being able to retrieve their results when needed.

@ref{bb,,queue} provides a thread-safe interface for exchanging data between
running threads.

@ref{b,,asyncio} offers an alternative approach to achieving task level
concurrency without requiring the use of multiple operating system threads.


@cartouche
@quotation 참고 
In the Python 2.x series, this module contained @code{camelCase} names
for some methods and functions. These are deprecated as of Python 3.10,
but they are still supported for compatibility with Python 2.5 and lower.
@end quotation
@end cartouche

CPython에서는, @ref{474,,전역 인터프리터 록}으로 인해 한 번에 하나의 스레드만 파이썬 코드를 실행할 수 있습니다 (설사 일부 성능 지향 라이브러리가 이 제한을 극복할 수 있을지라도). 응용 프로그램에서 멀티 코어 기계의 계산 자원을 더 잘 활용하려면 @ref{98,,multiprocessing}이나 @ref{1d6,,concurrent.futures.ProcessPoolExecutor}를 사용하는 것이 좋습니다. 그러나, 여러 I/O 병목 작업을 동시에 실행하고 싶을 때 threading은 여전히 적절한 모델입니다.

@node GIL and performance considerations,Reference<2>,Introduction<5>,threading — 스레드 기반 병렬 처리
@anchor{library/threading gil-and-performance-considerations}@anchor{3648}
@subsubsection GIL and performance considerations


Unlike the @ref{98,,multiprocessing} module, which uses separate processes to
bypass the @ref{474,,global interpreter lock} (GIL), the threading module operates
within a single process, meaning that all threads share the same memory space.
However, the GIL limits the performance gains of threading when it comes to
CPU-bound tasks, as only one thread can execute Python bytecode at a time.
Despite this, threads remain a useful tool for achieving concurrency in many
scenarios.

As of Python 3.13, @ref{1f4,,free-threaded} builds
can disable the GIL, enabling true parallel execution of threads, but this
feature is not available by default (see 
@geindex Python 향상 제안; PEP 703
PEP 703@footnote{https://peps.python.org/pep-0703/}).

@c TODO: At some point this feature will become available by default.

@node Reference<2>,with 문으로 록 조건 및 세마포어 사용하기,GIL and performance considerations,threading — 스레드 기반 병렬 처리
@anchor{library/threading reference}@anchor{3649}
@subsubsection Reference


이 모듈은 다음 함수를 정의합니다:

@geindex active_count() (threading 모듈)
@anchor{library/threading threading active_count}@anchor{35f}
@deffn {함수} threading.active_count ()

현재 살아있는 @ref{176,,Thread} 객체 수를 반환합니다. 반환된 수는 @ref{1c58,,enumerate()}가 반환한 리스트의 길이와 같습니다.

The function @code{activeCount} is a deprecated alias for this function.
@end deffn

@geindex current_thread() (threading 모듈)
@anchor{library/threading threading current_thread}@anchor{35e}
@deffn {함수} threading.current_thread ()

Return the current @ref{176,,Thread} object, corresponding to the caller’s thread
of control.  If the caller’s thread of control was not created through the
@code{threading} module, a dummy thread object with limited functionality is
returned.

The function @code{currentThread} is a deprecated alias for this function.
@end deffn

@geindex excepthook() (threading 모듈)
@anchor{library/threading threading excepthook}@anchor{a4b}
@deffn {함수} threading.excepthook (args, /)

@ref{c30,,Thread.run()}에 의해 발생한 포착되지 않은 예외를 처리합니다.

`args' 인자에는 다음과 같은 어트리뷰트가 있습니다:


@itemize *

@item 
`exc_type': 예외 형.

@item 
`exc_value': 예외 값, @code{None}일 수 있습니다.

@item 
`exc_traceback': 예외 트레이스백, @code{None}일 수 있습니다.

@item 
`thread': 예외를 발생시킨 스레드, @code{None}일 수 있습니다.
@end itemize

`exc_type'이 @ref{f3b,,SystemExit}이면, 예외는 조용히 무시됩니다. 그렇지 않으면, @ref{b33,,sys.stderr}에 예외가 인쇄됩니다.

이 함수에서 예외가 발생하면, 이를 처리하기 위해 @ref{a0c,,sys.excepthook()}이 호출됩니다.

@ref{c30,,Thread.run()}에 의해 발생한 포착되지 않은 예외를 처리하는 방법을 제어하기 위해 @ref{a4b,,threading.excepthook()}을 재정의할 수 있습니다.

사용자 정의 훅을 사용하여 `exc_value'를 저장하면 참조 순환을 만들 수 있습니다. 예외가 더는 필요하지 않을 때 참조 순환을 끊기 위해 명시적으로 지워야 합니다.

사용자 정의 훅을 사용하여 `thread'를 저장하면 파이널라이즈 중인 객체로 설정되면 이를 되살릴 수 있습니다. 객체를 되살리는 것을 방지하려면 사용자 정의 훅이 완료된 후 `thread'를 보관하지 마십시오.


@subsubheading 더 보기


@ref{a0c,,sys.excepthook()}은 포착되지 않은 예외를 처리합니다.



Added in version 3.8.

@end deffn

@geindex __excepthook__ (threading 모듈)
@anchor{library/threading threading __excepthook__}@anchor{a4a}
@deffn {데이터} threading.__excepthook__

Holds the original value of @ref{a4b,,threading.excepthook()}. It is saved so that the
original value can be restored in case they happen to get replaced with
broken or alternative objects.


Added in version 3.10.

@end deffn

@geindex get_ident() (threading 모듈)
@anchor{library/threading threading get_ident}@anchor{135f}
@deffn {함수} threading.get_ident ()

현재 스레드의 ‘스레드 식별자’를 반환합니다. 이것은 0이 아닌 정수입니다. 이 값은 직접적인 의미가 없습니다; 이것은 매직 쿠키로 사용하려는 것입니다, 예를 들어 스레드 특정 데이터의 딕셔너리를 인덱싱하는 데 사용됩니다. 스레드 식별자는 스레드가 종료되고 다른 스레드가 만들어질 때 재활용될 수 있습니다.


Added in version 3.3.

@end deffn

@geindex get_native_id() (threading 모듈)
@anchor{library/threading threading get_native_id}@anchor{c31}
@deffn {함수} threading.get_native_id ()

커널이 할당한 현재 스레드의 네이티브 정수 스레드 ID를 반환합니다. 음수가 아닌 정수입니다. 이 값은 시스템 전체에서 이 특정 스레드를 고유하게 식별하는 데 사용될 수 있습니다 (스레드가 종료될 때까지, 그 후에는 OS에서 값을 재활용할 수 있습니다).

@ref{213c,,가용성}: Windows, FreeBSD, Linux, macOS, OpenBSD, NetBSD, AIX, DragonFlyBSD, GNU/kFreeBSD.


Added in version 3.8.



버전 3.13에서 변경: Added support for GNU/kFreeBSD.

@end deffn

@geindex enumerate() (threading 모듈)
@anchor{library/threading threading enumerate}@anchor{1c58}
@deffn {함수} threading.enumerate ()

현재 활성인 모든 @ref{176,,Thread} 객체의 리스트를 반환합니다. 이 리스트에는 데몬 스레드와 @ref{35e,,current_thread()}에서 만든 더미 스레드 객체가 포함됩니다. 종료된 스레드와 아직 시작되지 않은 스레드는 제외합니다. 그러나, 메인 스레드는 종료되었을 때 조차 항상 결과의 일부입니다.
@end deffn

@geindex main_thread() (threading 모듈)
@anchor{library/threading threading main_thread}@anchor{11d1}
@deffn {함수} threading.main_thread ()

메인 @ref{176,,Thread} 객체를 반환합니다. 정상적인 조건에서, 메인 스레드는 파이썬 인터프리터가 시작된 스레드입니다.


Added in version 3.4.

@end deffn

@geindex settrace() (threading 모듈)
@anchor{library/threading threading settrace}@anchor{a48}
@deffn {함수} threading.settrace (func)

@geindex 추적 함수

Set a trace function for all threads started from the @code{threading} module.
The `func' will be passed to  @ref{2e1,,sys.settrace()} for each thread, before its
@ref{c30,,run()} method is called.
@end deffn

@geindex settrace_all_threads() (threading 모듈)
@anchor{library/threading threading settrace_all_threads}@anchor{6ee}
@deffn {함수} threading.settrace_all_threads (func)

Set a trace function for all threads started from the @code{threading} module
and all Python threads that are currently executing.

`func'는 @ref{c30,,run()} 메서드가 호출되기 전에 각 스레드에 대해 @ref{2e1,,sys.settrace()}로 전달됩니다.


Added in version 3.12.

@end deffn

@geindex gettrace() (threading 모듈)
@anchor{library/threading threading gettrace}@anchor{a46}
@deffn {함수} threading.gettrace ()

@geindex 추적 함수
@geindex 디버거

Get the trace function as set by @ref{a48,,settrace()}.


Added in version 3.10.

@end deffn

@geindex setprofile() (threading 모듈)
@anchor{library/threading threading setprofile}@anchor{a49}
@deffn {함수} threading.setprofile (func)

@geindex 프로파일 함수

Set a profile function for all threads started from the @code{threading} module.
The `func' will be passed to  @ref{1703,,sys.setprofile()} for each thread, before its
@ref{c30,,run()} method is called.
@end deffn

@geindex setprofile_all_threads() (threading 모듈)
@anchor{library/threading threading setprofile_all_threads}@anchor{6ef}
@deffn {함수} threading.setprofile_all_threads (func)

Set a profile function for all threads started from the @code{threading} module
and all Python threads that are currently executing.

`func'는 @ref{c30,,run()} 메서드가 호출되기 전에 각 스레드에 대해 @ref{1703,,sys.setprofile()}로 전달됩니다.


Added in version 3.12.

@end deffn

@geindex getprofile() (threading 모듈)
@anchor{library/threading threading getprofile}@anchor{a47}
@deffn {함수} threading.getprofile ()

@geindex 프로파일 함수

Get the profiler function as set by @ref{a49,,setprofile()}.


Added in version 3.10.

@end deffn

@geindex stack_size() (threading 모듈)
@anchor{library/threading threading stack_size}@anchor{364a}
@deffn {함수} threading.stack_size ([size])

새 스레드를 만들 때 사용된 스레드 스택 크기를 반환합니다. 선택적 `size' 인자는 이후에 만들어지는 스레드에 사용할 스택 크기를 지정하며, 0(플랫폼이나 구성된 기본값을 사용합니다)이거나 32,768 (32 KiB) 이상의 양의 정숫값이어야 합니다. `size'를 지정하지 않으면, 0이 사용됩니다. 스레드 스택 크기 변경이 지원되지 않으면, @ref{244,,RuntimeError}가 발생합니다. 지정된 스택 크기가 유효하지 않으면, @ref{2ec,,ValueError}가 발생하고 스택 크기는 수정되지 않습니다. 32 KiB는 현재 인터프리터 자체에 충분한 스택 공간을 보장하기 위해 지원되는 최소 스택 크기 값입니다. 최소 스택 크기가 32 KiB 보다 커야 한다거나 시스템 메모리 페이지 크기의 배수로 할당해야 하는 등 일부 플랫폼에는 스택 크기 값에 대한 특정 제한이 있을 수 있습니다 - 자세한 내용은 플랫폼 설명서를 참조하십시오 (4 KiB 페이지는 흔합니다; 스택 크기에 4096의 배수를 사용하는 것이 더 구체적인 정보가 없을 때 제안하는 방법입니다).

@ref{213c,,가용성}: Windows, pthreads.

Unix platforms with POSIX threads support.
@end deffn

이 모듈은 또한 다음 상수를 정의합니다:

@geindex TIMEOUT_MAX (threading 모듈)
@anchor{library/threading threading TIMEOUT_MAX}@anchor{364b}
@deffn {데이터} threading.TIMEOUT_MAX

블로킹 함수(@ref{8a6,,Lock.acquire()}, @ref{107a,,RLock.acquire()}, @ref{1c64,,Condition.wait()} 등)의 `timeout' 매개 변수에 허용되는 최댓값. 이 값보다 큰 timeout을 지정하면 @ref{a81,,OverflowError}가 발생합니다.


Added in version 3.2.

@end deffn

이 모듈은 아래 섹션에 자세히 설명되는 많은 클래스를 정의합니다.

이 모듈의 설계는 Java의 스레딩 모델에 약하게 기반합니다. 그러나, Java가 록(locks)과 조건 변수(condition variables)를 모든 객체의 기본 동작으로 만들지만, 파이썬에서는 별도의 객체입니다. 파이썬의 @ref{176,,Thread} 클래스는 Java Thread 클래스 동작의 부분 집합을 지원합니다; 현재, 우선순위가 없고, 스레드 그룹이 없으며 스레드를 파괴, 중지, 일시 중지, 재개 또는 인터럽트 할 수 없습니다. 구현될 때, Java 스레드 클래스의 정적 메서드는 모듈 수준 함수에 매핑됩니다.

아래에 설명된 모든 메서드는 원자 적으로 실행됩니다.

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

@end menu

@node Thread-local data,Thread objects,,Reference<2>
@anchor{library/threading thread-local-data}@anchor{364c}
@subsubsection Thread-local data


Thread-local data is data whose values are thread specific. If you
have data that you want to be local to a thread, create a
@ref{1862,,local} object and use its attributes:

@example
>>> mydata = local()
>>> mydata.number = 42
>>> mydata.number
42
@end example

You can also access the @ref{1862,,local}-object’s dictionary:

@example
>>> mydata.__dict__
@{'number': 42@}
>>> mydata.__dict__.setdefault('widgets', [])
[]
>>> mydata.widgets
[]
@end example

If we access the data in a different thread:

@example
>>> log = []
>>> def f():
...     items = sorted(mydata.__dict__.items())
...     log.append(items)
...     mydata.number = 11
...     log.append(mydata.number)

>>> import threading
>>> thread = threading.Thread(target=f)
>>> thread.start()
>>> thread.join()
>>> log
[[], 11]
@end example

we get different data.  Furthermore, changes made in the other thread
don’t affect data seen in this thread:

@example
>>> mydata.number
42
@end example

Of course, values you get from a @ref{1862,,local} object, including their
@ref{77c,,__dict__} attribute, are for whatever thread was current
at the time the attribute was read.  For that reason, you generally
don’t want to save these values across threads, as they apply only to
the thread they came from.

You can create custom @ref{1862,,local} objects by subclassing the
@code{local} class:

@example
>>> class MyLocal(local):
...     number = 2
...     def __init__(self, /, **kw):
...         self.__dict__.update(kw)
...     def squared(self):
...         return self.number ** 2
@end example

This can be useful to support default values, methods and
initialization.  Note that if you define an @ref{8be,,__init__()}
method, it will be called each time the @ref{1862,,local} object is used
in a separate thread.  This is necessary to initialize each thread’s
dictionary.

Now if we create a @ref{1862,,local} object:

@example
>>> mydata = MyLocal(color='red')
@end example

we have a default number:

@example
>>> mydata.number
2
@end example

an initial color:

@example
>>> mydata.color
'red'
>>> del mydata.color
@end example

And a method that operates on the data:

@example
>>> mydata.squared()
4
@end example

As before, we can access the data in a separate thread:

@example
>>> log = []
>>> thread = threading.Thread(target=f)
>>> thread.start()
>>> thread.join()
>>> log
[[('color', 'red')], 11]
@end example

without affecting this thread’s data:

@example
>>> mydata.number
2
>>> mydata.color
Traceback (most recent call last):
...
AttributeError: 'MyLocal' object has no attribute 'color'
@end example

Note that subclasses can define @ref{7f6,,__slots__}, but they are not
thread local. They are shared across threads:

@example
>>> class MyLocal(local):
...     __slots__ = 'number'

>>> mydata = MyLocal()
>>> mydata.number = 42
>>> mydata.color = 'red'
@end example

So, the separate thread:

@example
>>> thread = threading.Thread(target=f)
>>> thread.start()
>>> thread.join()
@end example

affects what we see:

@example
>>> mydata.number
11
@end example

@geindex local (threading 클래스)
@anchor{library/threading threading local}@anchor{1862}
@deffn {클래스} threading.local

스레드 로컬 데이터를 나타내는 클래스.
@end deffn

@node Thread objects,Lock objects,Thread-local data,Reference<2>
@anchor{library/threading id1}@anchor{364d}@anchor{library/threading thread-objects}@anchor{364e}
@subsubsection Thread objects


@ref{176,,Thread} 클래스는 별도의 제어 스레드에서 실행되는 활동을 나타냅니다. 활동을 지정하는 두 가지 방법이 있습니다: 콜러블 객체를 생성자에 전달하거나, 서브 클래스에서 @ref{c30,,run()} 메서드를 재정의합니다. 서브 클래스에서는 다른 메서드(생성자를 제외하고)를 재정의해서는 안 됩니다. 즉, `오직' 이 클래스의 @code{__init__()}와 @code{run()} 메서드만 재정의합니다.

일단 스레드 객체가 만들어지면, 스레드의 @ref{178,,start()} 메서드를 호출하여 활동을 시작해야 합니다. 이것은 별도의 제어 스레드에서 @ref{c30,,run()} 메서드를 호출합니다.

일단 스레드의 활동이 시작되면, 스레드는 ‘살아있는(alive)’ 것으로 간주합니다. @ref{c30,,run()} 메서드가 정상적으로 혹은 처리되지 않은 예외를 발생시켜서 종료할 때 살아있음을 멈춥니다. @ref{b46,,is_alive()} 메서드는 스레드가 살아있는지 검사합니다.

다른 스레드는 스레드의 @ref{13e9,,join()} 메서드를 호출할 수 있습니다. 이것은 @code{join()} 메서드가 호출된 스레드가 종료될 때까지 호출하는 스레드를 블록 합니다.

스레드에는 이름이 있습니다. 이름은 생성자에 전달되고, @ref{2a0,,name} 어트리뷰트를 통해 읽거나 변경할 수 있습니다.

@ref{c30,,run()} 메서드에서 예외가 발생하면, 이를 처리하기 위해 @ref{a4b,,threading.excepthook()}이 호출됩니다. 기본적으로, @code{threading.excepthook()}은 @ref{f3b,,SystemExit}를 조용히 무시합니다.

스레드는 “데몬 스레드”로 플래그 할 수 있습니다. 이 플래그의 의미는 오직 데몬 스레드만 남았을 때 전체 파이썬 프로그램이 종료된다는 것입니다. 초깃값은 만드는 스레드에서 상속됩니다. 플래그는 @ref{35c,,daemon} 프로퍼티나 `daemon' 생성자 인자를 통해 설정할 수 있습니다.

@cartouche
@quotation 참고 
종료 시 데몬 스레드는 갑자기 중지됩니다. 그들의 자원(가령 열린 파일, 데이터베이스 트랜잭션 등)은 제대로 해제되지 않을 수 있습니다. 스레드가 우아하게 중지되도록 하려면, 스레드를 데몬이 아니도록 만들고 @ref{135d,,Event}와 같은 적절한 신호 메커니즘을 사용하십시오.
@end quotation
@end cartouche

“메인 스레드” 객체가 있습니다; 이것은 파이썬 프로그램의 초기 제어 스레드에 해당합니다. 이것은 데몬 스레드가 아닙니다.

“더미 스레드 객체”가 만들어질 수 있습니다. 이들은 “외부 스레드”에 해당하는 스레드 객체로, C 코드에서 직접 만든 것처럼 threading 모듈 외부에서 시작된 제어 스레드입니다. 더미 스레드 객체는 기능이 제한적입니다; 항상 살아 있고 데몬으로 간주하며, @ref{364f,,조인}할 수 없습니다. 외부 스레드의 종료를 감지하는 것이 불가능하므로 삭제되지 않습니다.

@geindex Thread (threading 클래스)
@anchor{library/threading threading Thread}@anchor{176}
@deffn {클래스} threading.Thread (group=None, target=None, name=None, args=(), kwargs=@{@}, *, daemon=None, context=None)

이 생성자는 항상 키워드 인자로 호출해야 합니다. 인자는 다음과 같습니다:

`group'은 @code{None}이어야 합니다; @code{ThreadGroup} 클래스가 구현될 때 향후 확장을 위해 예약되어 있습니다.

`target'은 @ref{c30,,run()} 메서드에 의해 호출될 콜러블 객체입니다. 기본값은 @code{None}이며, 아무것도 호출되지 않습니다.

`name'은 스레드 이름입니다. 기본적으로, 고유한 이름이 “Thread-`N'” 형식으로 구성되는데, 여기서 `N'은 작은 십진수입니다. 혹은 `target' 인자가 지정되면, “Thread-`N' (target)” 형식인데, 여기서 “target”은 @code{target.__name__}입니다.

`args'는 target 호출을 위한 인자의 리스트나 튜플입니다. 기본값은 @code{()}입니다.

`kwargs'는 target 호출을 위한 키워드 인자의 딕셔너리입니다. 기본값은 @code{@{@}}입니다.

@code{None}이 아니면, `daemon'은 스레드가 데몬인지를 명시적으로 설정합니다. @code{None}(기본값)이면, 데몬 속성은 현재 스레드에서 상속됩니다.

`context' is the @ref{177,,Context} value to use when starting
the thread.  The default value is @code{None} which indicates that the
@ref{175,,sys.flags.thread_inherit_context} flag controls the behaviour.  If
the flag is true, threads will start with a copy of the context of the
caller of @ref{178,,start()}.  If false, they will start with an empty
context.  To explicitly start with an empty context, pass a new instance of
@ref{177,,Context()}.  To explicitly start with a copy of the
current context, pass the value from @ref{3650,,copy_context()}. The
flag defaults true on free-threaded builds and false otherwise.

서브 클래스가 생성자를 재정의하면, 스레드에 다른 작업을 수행하기 전에 베이스 클래스 생성자(@code{Thread.__init__()})를 호출해야 합니다.


버전 3.3에서 변경: `daemon' 매개 변수를 추가했습니다.



버전 3.10에서 변경: Use the `target' name if `name' argument is omitted.



버전 3.14에서 변경: Added the `context' parameter.


@geindex start() (threading.Thread 메서드)
@anchor{library/threading threading Thread start}@anchor{178}
@deffn {메서드} start ()

스레드 활동을 시작합니다.

스레드 객체 당 최대 한 번 호출되어야 합니다. 객체의 @ref{c30,,run()} 메서드가 별도의 제어 스레드에서 호출되도록 배치합니다.

이 메서드는 같은 스레드 객체에서 두 번 이상 호출되면, @ref{244,,RuntimeError}를 발생시킵니다.

If supported, set the operating system thread name to
@ref{2a0,,threading.Thread.name}. The name can be truncated depending on the
operating system thread name limits.


버전 3.14에서 변경: Set the operating system thread name.

@end deffn

@geindex run() (threading.Thread 메서드)
@anchor{library/threading threading Thread run}@anchor{c30}
@deffn {메서드} run ()

스레드의 활동을 표현하는 메서드.

서브 클래스에서 이 메서드를 재정의할 수 있습니다. 표준 @ref{c30,,run()} 메서드는 `target' 인자로 객체의 생성자에 전달된 콜러블 객체를 호출합니다, 있다면 `args'와 `kwargs' 인자에서 각각 취한 위치와 키워드 인자로 호출합니다.

Using list or tuple as the `args' argument which passed to the @code{Thread}
could achieve the same effect.

예제:

@example
>>> from threading import Thread
>>> t = Thread(target=print, args=[1])
>>> t.run()
1
>>> t = Thread(target=print, args=(1,))
>>> t.run()
1
@end example
@end deffn

@geindex join() (threading.Thread 메서드)
@anchor{library/threading meth-thread-join}@anchor{364f}@anchor{library/threading threading Thread join}@anchor{13e9}
@deffn {메서드} join (timeout=None)

스레드가 종료할 때까지 기다립니다. @ref{13e9,,join()} 메서드가 호출된 스레드가 정상적으로 혹은 처리되지 않은 예외를 통해 종료하거나 선택적 시간제한 초과가 발생할 때까지 호출하는 스레드를 블록 합니다.

`timeout' 인자가 있고 @code{None}이 아니면, 작업의 시간제한을 초(또는 부분 초)로 지정하는 부동 소수점 숫자여야 합니다. @ref{13e9,,join()}은 항상 @code{None}을 반환하므로, @code{join()} 이후에 @ref{b46,,is_alive()}를 호출하여 시간제한 초과가 발생했는지 판단해야 합니다 – 스레드가 아직 살아있다면, @code{join()} 호출이 시간제한을 초과한 것입니다.

`timeout' 인자가 없거나 @code{None}이면, 스레드가 종료될 때까지 작업이 블록 됩니다.

스레드는 여러 번 조인될 수 있습니다.

교착 상태를 유발할 수 있어서 현재 스레드를 조인하려고 시도하면 @ref{13e9,,join()}은 @ref{244,,RuntimeError}를 발생시킵니다. 스레드가 시작되기 전에 @code{join()} 하는 것도 에러이고 같은 예외가 발생합니다.

If an attempt is made to join a running daemonic thread in late stages
of @ref{47a,,Python finalization} @code{join()}
raises a @ref{479,,PythonFinalizationError}.


버전 3.14에서 변경: May raise @ref{479,,PythonFinalizationError}.

@end deffn

@geindex name (threading.Thread의 속성)
@anchor{library/threading threading Thread name}@anchor{2a0}
@deffn {속성} name

식별 목적으로만 사용되는 문자열. 의미는 없습니다. 여러 스레드에 같은 이름을 지정할 수 있습니다. 초기 이름은 생성자가 설정합니다.

On some platforms, the thread name is set at the operating system level
when the thread starts, so that it is visible in task managers.
This name may be truncated to fit in a system-specific limit (for example,
15 bytes on Linux or 63 bytes on macOS).

Changes to `name' are only reflected at the OS level when the currently
running thread is renamed. (Setting the `name' attribute of a
different thread only updates the Python Thread object.)
@end deffn

@geindex getName() (threading.Thread 메서드)
@geindex setName() (threading.Thread 메서드)
@anchor{library/threading threading Thread getName}@anchor{3651}
@deffn {메서드} getName ()
@anchor{library/threading threading Thread setName}@anchor{35d}
@deffnx {메서드} setName ()

@ref{2a0,,name}을 위한 폐지된 getter/setter API; 대신 프로퍼티로 직접 사용하십시오.


버전 3.10부터 폐지됨.

@end deffn

@geindex ident (threading.Thread의 속성)
@anchor{library/threading threading Thread ident}@anchor{315e}
@deffn {속성} ident

이 스레드의 ‘스레드 식별자’ 또는 스레드가 시작되지 않았으면 @code{None}. 이것은 0이 아닌 정수입니다. @ref{135f,,get_ident()} 함수를 참조하십시오. 스레드 식별자는 스레드가 종료되고 다른 스레드가 만들어질 때 재활용될 수 있습니다. 스레드가 종료된 후에도 식별자를 사용할 수 있습니다.
@end deffn

@geindex native_id (threading.Thread의 속성)
@anchor{library/threading threading Thread native_id}@anchor{c32}
@deffn {속성} native_id

OS(커널)에서 할당된, 이 스레드의 스레드 ID (@code{TID}). 음수가 아닌 정수, 또는 스레드가 시작되지 않았으면 @code{None}입니다. @ref{c31,,get_native_id()} 함수를 참조하십시오. 이 값은 시스템 전체에서 이 특정 스레드를 고유하게 식별하는 데 사용될 수 있습니다 (스레드가 종료될 때까지, OS가 값을 재활용 할 수 있습니다).

@cartouche
@quotation 참고 
프로세스 ID 와 유사하게, 스레드 ID는 스레드가 만들어진 시점부터 스레드가 종료될 때까지만 유효(시스템 전체에서 고유함이 보장)합니다.
@end quotation
@end cartouche

@ref{213c,,가용성}: Windows, FreeBSD, Linux, macOS, OpenBSD, NetBSD, AIX, DragonFlyBSD.


Added in version 3.8.

@end deffn

@geindex is_alive() (threading.Thread 메서드)
@anchor{library/threading threading Thread is_alive}@anchor{b46}
@deffn {메서드} is_alive ()

스레드가 살아있는지를 반환합니다.

이 메서드는 @ref{c30,,run()} 메서드가 시작되기 직전부터 @code{run()} 메서드가 종료된 직후까지 @code{True}를 반환합니다. 모듈 함수 @ref{1c58,,enumerate()}는 모든 살아있는 스레드 리스트를 반환합니다.
@end deffn

@geindex daemon (threading.Thread의 속성)
@anchor{library/threading threading Thread daemon}@anchor{35c}
@deffn {속성} daemon

이 스레드가 데몬 스레드인지(@code{True}) 아닌지(@code{False})를 나타내는 불리언 값. @ref{178,,start()}가 호출되기 전에 설정되어야 합니다, 그렇지 않으면 @ref{244,,RuntimeError}가 발생합니다. 초깃값은 만드는 스레드에서 상속됩니다; 메인 스레드는 데몬 스레드가 아니므로 메인 스레드에서 만드는 모든 스레드의 기본값은 @ref{35c,,daemon} = @code{False}입니다.

살아있는 데몬이 아닌 스레드가 남아 있지 않으면 전체 파이썬 프로그램이 종료됩니다.
@end deffn

@geindex isDaemon() (threading.Thread 메서드)
@geindex setDaemon() (threading.Thread 메서드)
@anchor{library/threading threading Thread isDaemon}@anchor{3652}
@deffn {메서드} isDaemon ()
@anchor{library/threading threading Thread setDaemon}@anchor{35b}
@deffnx {메서드} setDaemon ()

@ref{35c,,daemon}을 위한 폐지된 getter/setter API; 대신 프로퍼티로 직접 사용하십시오.


버전 3.10부터 폐지됨.

@end deffn
@end deffn

@node Lock objects,RLock objects,Thread objects,Reference<2>
@anchor{library/threading id2}@anchor{3653}@anchor{library/threading lock-objects}@anchor{3654}
@subsubsection Lock objects


프리미티브 록(primitive lock)은 잠겨있을 때 특정 스레드가 소유하지 않는 동기화 프리미티브입니다. 파이썬에서는 현재 @ref{2,,_thread} 확장 모듈에 의해 직접 구현되는 가장 낮은 수준의 동기화 프리미티브입니다.

프리미티브 록은 두 상태 중 하나입니다, “잠금(locked)”이나 “잠금 해제(unlocked)”. 잠금 해제 상태로 만들어집니다. 두 가지 기본 메서드가 있습니다, @ref{8a6,,acquire()}와 @ref{14c7,,release()}. 상태가 잠금 해제일 때, @code{acquire()}는 상태를 잠금으로 변경하고 즉시 반환합니다. 상태가 잠금일 때, @code{acquire()}는 다른 스레드에서의 @code{release()}에 호출이 잠금 해제로 변경할 때까지 블록 된 후, @code{acquire()} 호출이 이를 잠금으로 재설정하고 반환합니다. @code{release()} 메서드는 잠금 상태에서만 호출해야 합니다; 상태를 잠금 해제로 변경하고 즉시 반환합니다. 잠금 해제된 록을 해제하려고 하면, @ref{244,,RuntimeError}가 발생합니다.

록은 @ref{3655,,컨텍스트 관리자 프로토콜}도 지원합니다.

둘 이상의 스레드가 @ref{8a6,,acquire()}에서 블록 되어 상태가 잠금 해제가 되기를 기다릴 때, @ref{14c7,,release()} 호출이 상태를 잠금 해제로 재설정하면 하나의 스레드만 진행됩니다; 대기 중인 스레드 중 어느 것이 진행하는지는 정의되지 않았으며, 구현에 따라 다를 수 있습니다.

모든 메서드는 원자 적으로 실행됩니다.

@geindex Lock (threading 클래스)
@anchor{library/threading threading Lock}@anchor{19f4}
@deffn {클래스} threading.Lock

프리미티브 록 객체를 구현하는 클래스. 일단 스레드가 록을 획득하면, 이후에 해당 록을 확보하려고 시도하면 해제될 때까지 블록 합니다; 모든 스레드가 해제할 수 있습니다.


버전 3.13에서 변경: @code{Lock} is now a class. In earlier Pythons, @code{Lock} was a factory
function which returned an instance of the underlying private lock
type.


@geindex acquire() (threading.Lock 메서드)
@anchor{library/threading threading Lock acquire}@anchor{8a6}
@deffn {메서드} acquire (blocking=True, timeout=-1)

블로킹이거나 비 블로킹으로, 록을 획득합니다.

`blocking' 인자를 @code{True}(기본값)로 설정하여 호출하면, 록이 잠금 해제될 때까지 블록 한 다음, 잠금으로 설정하고 @code{True}를 반환합니다.

`blocking' 인자를 @code{False}로 설정하여 호출하면, 블록 하지 않습니다. `blocking'이 @code{True}로 설정된 호출이 블록 될 것이라면, 즉시 @code{False}를 반환합니다; 그렇지 않으면, 록을 잠금으로 설정하고 @code{True}를 반환합니다.

양수 값으로 설정된 부동 소수점 `timeout' 인자로 호출하면, 록을 획득할 수 없는 한 최대 `timeout'에 지정된 초 동안 블록 합니다. @code{-1}의 `timeout' 인자는 제한 없는 대기를 지정합니다. `blocking'이 @code{False}일 때 `timeout'을 지정하는 것은 금지되어 있습니다.

록이 성공적으로 획득되면 반환 값은 @code{True}이고, 그렇지 않으면  (예를 들어 `timeout'이 만료되면) @code{False}입니다.


버전 3.2에서 변경: `timeout' 매개 변수가 추가되었습니다.



버전 3.2에서 변경: 하부 스레딩 구현이 지원한다면 POSIX에서 시그널로 록 획득을 중단할 수 있습니다.



버전 3.14에서 변경: Lock acquisition can now be interrupted by signals on Windows.

@end deffn

@geindex release() (threading.Lock 메서드)
@anchor{library/threading threading Lock release}@anchor{14c7}
@deffn {메서드} release ()

록을 해제합니다. 록을 획득한 스레드뿐만 아니라 모든 스레드에서 호출할 수 있습니다.

록이 잠금일 때, 잠금 해제로 재설정하고 반환합니다. 록이 잠금 해제될 때까지 다른 스레드가 블록 되어 기다리고 있으면, 그들 중 정확히 하나의 스레드가 진행되도록 합니다.

잠금 해제된 록에서 호출되면, @ref{244,,RuntimeError}가 발생합니다.

반환 값이 없습니다.
@end deffn

@geindex locked() (threading.Lock 메서드)
@anchor{library/threading threading Lock locked}@anchor{3656}
@deffn {메서드} locked ()

록이 획득되면 @code{True}를 반환합니다.
@end deffn
@end deffn

@node RLock objects,Condition objects,Lock objects,Reference<2>
@anchor{library/threading id3}@anchor{3657}@anchor{library/threading rlock-objects}@anchor{3658}
@subsubsection RLock objects


재진입 록(reentrant lock)은 같은 스레드에 의해 여러 번 획득될 수 있는 동기화 프리미티브입니다. 내부적으로, 프리미티브 록에서 사용하는 잠금/잠금 해제 상태에 더해 “소유하는 스레드(owning thread)”와 “재귀 수준(recursion level)” 개념을 사용합니다. 잠금 상태에서는, 어떤 스레드가 록을 소유합니다; 잠금 해제 상태에서는 아무런 스레드도 록을 소유하지 않습니다.

Threads call a lock’s @ref{107a,,acquire()} method to lock it,
and its @ref{14c7,,release()} method to unlock it.

@cartouche
@quotation 참고 
Reentrant locks support the @ref{3655,,context management protocol},
so it is recommended to use @ref{186,,with} instead of manually calling
@ref{107a,,acquire()} and @ref{3659,,release()}
to handle acquiring and releasing the lock for a block of code.
@end quotation
@end cartouche

RLock의 @ref{107a,,acquire()}/@ref{3659,,release()} 호출 쌍은 Lock의 @ref{8a6,,acquire()}/@ref{14c7,,release()}와 달리 중첩될 수 있습니다. 오직 마지막 @code{release()}(가장 바깥쪽 쌍의 @code{release()})만 록을 잠금 해제 상태로 재설정하고 @code{acquire()}에서 블록 된 다른 스레드가 진행하도록 할 수 있습니다.

@ref{107a,,acquire()}/@ref{3659,,release()} must be used in pairs: each acquire
must have a release in the thread that has acquired the lock. Failing to
call release as many times the lock has been acquired can lead to deadlock.

@geindex RLock (threading 클래스)
@anchor{library/threading threading RLock}@anchor{32e}
@deffn {클래스} threading.RLock

이 클래스는 재진입 록 객체를 구현합니다. 재진입 록은 획득한 스레드에서 해제해야 합니다. 일단 스레드가 재진입 록을 획득하면, 같은 스레드는 블록 하지 않고 다시 스레드를 획득할 수 있습니다; 스레드는 획득할 때마다 한 번씩 해제해야 합니다.

@code{RLock}은 실제로는 플랫폼에서 지원하는 가장 효율적인 버전의 구상 RLock 클래스 인스턴스를 반환하는 팩토리 함수임에 유의하십시오.

@geindex acquire() (threading.RLock 메서드)
@anchor{library/threading threading RLock acquire}@anchor{107a}
@deffn {메서드} acquire (blocking=True, timeout=-1)

블로킹이거나 비 블로킹으로, 록을 획득합니다.


@subsubheading 더 보기



@table @asis

@item @ref{3655,,Using RLock as a context manager}

Recommended over manual @code{acquire()} and @ref{3659,,release()} calls
whenever practical.
@end table


`blocking' 인자를 @code{True}(기본값)로 설정하여 호출할 때:

@quotation


@itemize *

@item 
If no thread owns the lock, acquire the lock and return immediately.

@item 
If another thread owns the lock, block until we are able to acquire
lock, or `timeout', if set to a positive float value.

@item 
If the same thread owns the lock, acquire the lock again, and
return immediately. This is the difference between @ref{19f4,,Lock} and
@code{RLock}; @code{Lock} handles this case the same as the previous,
blocking until the lock can be acquired.
@end itemize
@end quotation

`blocking' 인자를 @code{False}로 설정하여 호출할 때:

@quotation


@itemize *

@item 
If no thread owns the lock, acquire the lock and return immediately.

@item 
If another thread owns the lock, return immediately.

@item 
If the same thread owns the lock, acquire the lock again and return
immediately.
@end itemize
@end quotation

In all cases, if the thread was able to acquire the lock, return @code{True}.
If the thread was unable to acquire the lock (i.e. if not blocking or
the timeout was reached) return @code{False}.

If called multiple times, failing to call @ref{3659,,release()} as many times
may lead to deadlock. Consider using @code{RLock} as a context manager rather than
calling acquire/release directly.


버전 3.2에서 변경: `timeout' 매개 변수가 추가되었습니다.

@end deffn

@geindex release() (threading.RLock 메서드)
@anchor{library/threading threading RLock release}@anchor{3659}
@deffn {메서드} release ()

재귀 수준을 낮추면서, 잠금을 해제합니다. 감소 후에 0이 되면, 록을 잠금 해제로 (아무런 스레드도 소유하지 않은) 재설정하고, 록이 잠금 해제되도록 기다리면서 블록 된 다른 스레드가 있으면, 그중 정확히 하나가 진행되도록 합니다. 감소 후에 재귀 수준이 여전히 0이 아니면, 록은 잠금이고, 호출하는 스레드에 의해 소유된 채로 유지됩니다.

호출하는 스레드가 록을 소유했을 때만 이 메서드를 호출하십시오. 록을 획득하지 않았을 때 이 메서드가 호출되면 @ref{244,,RuntimeError}가 발생합니다.

반환 값이 없습니다.
@end deffn

@geindex locked() (threading.RLock 메서드)
@anchor{library/threading threading RLock locked}@anchor{183e}
@deffn {메서드} locked ()

Return a boolean indicating whether this object is locked right now.


Added in version 3.14.

@end deffn
@end deffn

@node Condition objects,Semaphore objects,RLock objects,Reference<2>
@anchor{library/threading condition-objects}@anchor{365a}@anchor{library/threading id4}@anchor{365b}
@subsubsection Condition objects


조건 변수(condition variable)는 항상 어떤 종류의 록과 연관됩니다; 이것은 전달되거나 기본적으로 만들어집니다. 전달하는 것은 여러 조건 변수가 같은 록을 공유해야 할 때 유용합니다. 록은 조건 객체의 일부입니다: 별도로 추적할 필요가 없습니다.

조건 변수는 @ref{3655,,컨텍스트 관리자 프로토콜}을 준수합니다: @code{with} 문을 사용해서 감싼 블록의 지속 시간 동안 연관된 록을 획득합니다. @ref{365c,,acquire()}와 @ref{365d,,release()} 메서드도 연관된 록의 해당 메서드를 호출합니다.

다른 메서드들은 연관된 록을 잡은 상태에서 호출해야 합니다. @ref{1c64,,wait()} 메서드는 록을 해제한 다음, 다른 스레드가 @ref{1b64,,notify()}나 @ref{359,,notify_all()}을 호출하여 록을 해제할 때까지 블록 합니다. 일단 깨어나면, @code{wait()}는 록을 다시 획득하고 반환합니다. 시간제한을 지정할 수도 있습니다.

@ref{1b64,,notify()} 메서드는 있다면 조건 변수를 기다리는 스레드 중 하나를 깨웁니다. @ref{359,,notify_all()} 메서드는 조건 변수를 기다리는 모든 스레드를 깨웁니다.

참고: @ref{1b64,,notify()}와 @ref{359,,notify_all()} 메서드는 록을 해제하지 않습니다; 이것은 깨어난 스레드나 스레드들이 @ref{1c64,,wait()} 호출에서 즉시 반환되지 않지만, @code{notify()}나 @code{notify_all()}을 호출한 스레드가 최종적으로 록 소유권을 포기할 때만 반환됨을 의미합니다.

조건 변수를 사용하는 일반적인 프로그래밍 스타일은 록을 사용하여 어떤 공유 상태에 대한 액세스를 동기화합니다; 특정 상태 변경에 관심 있는 스레드는 원하는 상태를 볼 때까지 @ref{1c64,,wait()}를 반복적으로 호출하는 반면, 상태를 변경하는 스레드는 대기자 중 하나가 원하는 상태일 수 있도록 상태를 변경할 때 @ref{1b64,,notify()}나 @ref{359,,notify_all()}을 호출합니다. 예를 들어, 다음 코드는 무제한 버퍼 용량의 일반적인 생산자-소비자 상황입니다:

@example
# 한 항목을 소비합니다
with cv:
    while not an_item_is_available():
        cv.wait()
    get_an_available_item()

# 한 항목을 생산합니다
with cv:
    make_an_item_available()
    cv.notify()
@end example

@ref{1c64,,wait()}가 임의의 긴 시간 후에 반환될 수 있고, @ref{1b64,,notify()} 호출을 유발한 조건이 더는 참이 아닐 수 있기 때문에, 응용 프로그램의 조건에 대한 @code{while} 루프 검사가 필요합니다. 이것은 다중 스레드 프로그래밍에 본질적으로 수반됩니다. @ref{365e,,wait_for()} 메서드를 사용하면 조건 검사를 자동화하고 시간제한 계산을 쉽게 수행할 수 있습니다:

@example
# 한 항목을 소비합니다
with cv:
    cv.wait_for(an_item_is_available)
    get_an_available_item()
@end example

@ref{1b64,,notify()}와 @ref{359,,notify_all()} 중에서 선택하려면, 하나의 상태 변경에 흥미 있는 대기 중인 스레드가 하나일지 여러 개일지를 고려하십시오. 예를 들어 일반적인 생산자-소비자 상황에서, 하나의 항목을 버퍼에 추가하면 오직 하나의 소비자 스레드만 깨울 필요가 있습니다.

@geindex Condition (threading 클래스)
@anchor{library/threading threading Condition}@anchor{135a}
@deffn {클래스} threading.Condition (lock=None)

이 클래스는 조건 변수 객체를 구현합니다. 조건 변수를 사용하면 하나 이상의 스레드가 다른 스레드에 의해 통지될 때까지 기다릴 수 있습니다.

`lock' 인자가 제공되고 @code{None}이 아니면, @ref{19f4,,Lock}이나 @ref{32e,,RLock} 객체여야 하며, 하부 록으로 사용됩니다. 그렇지 않으면, 새 @code{RLock} 객체가 만들어지고 하부 록으로 사용됩니다.


버전 3.3에서 변경: 팩토리 함수에서 클래스로 변경되었습니다.


@geindex acquire() (threading.Condition 메서드)
@anchor{library/threading threading Condition acquire}@anchor{365c}
@deffn {메서드} acquire (*args)

하부 록을 획득합니다. 이 메서드는 하부 록에서 해당 메서드를 호출합니다; 반환 값은 그 메서드가 반환하는 것입니다.
@end deffn

@geindex release() (threading.Condition 메서드)
@anchor{library/threading threading Condition release}@anchor{365d}
@deffn {메서드} release ()

하부 록을 해제합니다. 이 메서드는 하부 록에서 해당 메서드를 호출합니다; 반환 값이 없습니다.
@end deffn

@geindex locked() (threading.Condition 메서드)
@anchor{library/threading threading Condition locked}@anchor{365f}
@deffn {메서드} locked ()

Return a boolean indicating whether this object is locked right now.


Added in version 3.14.

@end deffn

@geindex wait() (threading.Condition 메서드)
@anchor{library/threading threading Condition wait}@anchor{1c64}
@deffn {메서드} wait (timeout=None)

통지되거나 시간제한이 만료될 때까지 기다립니다. 이 메서드가 호출될 때 호출하는 스레드가 록을 획득하지 않았으면, @ref{244,,RuntimeError}가 발생합니다.

이 메서드는 하부 록을 해제한 다음, 같은 조건 변수에 대한 다른 스레드에서의 @ref{1b64,,notify()}나 @ref{359,,notify_all()} 호출에 의해 깨어날 때까지 또는 선택적 시간제한 만료가 발생할 때까지 블록 합니다. 일단 깨어나거나 시간제한이 만료되면, 록을 다시 획득하고 반환합니다.

`timeout' 인자가 있고 @code{None}이 아니면, 작업의 시간제한을 초(또는 부분 초)로 지정하는 부동 소수점 숫자여야 합니다.

하부 록이 @ref{32e,,RLock}일 때, 록이 여러 번 재귀적으로 획득되었을 때 록을 실제로 잠금 해제하지 못할 수 있기 때문에, @ref{365d,,release()} 메서드를 사용하여 록을 해제하지 않습니다. 대신, @code{RLock} 클래스의 내부 인터페이스가 사용되어, 재귀적으로 여러 번 획득한 경우에도 실제로 록을 잠금 해제합니다. 그런 다음 다른 내부 인터페이스를 사용하여 록을 다시 획득할 때 재귀 수준을 복원합니다.

주어진 `timeout'이 만료되지 않는 한 반환 값은 @code{True}이며, 만료되면 @code{False}입니다.


버전 3.2에서 변경: 이전에는, 메서드가 항상 @code{None}을 반환했습니다.

@end deffn

@geindex wait_for() (threading.Condition 메서드)
@anchor{library/threading threading Condition wait_for}@anchor{365e}
@deffn {메서드} wait_for (predicate, timeout=None)

조건이 참으로 평가될 때까지 기다립니다. `predicate'는 불리언 값으로 해석될 결과를 반환하는 콜러블 이어야 합니다. 최대 대기 시간을 주는 `timeout'이 제공될 수 있습니다.

이 유틸리티 메서드는 술어(predicate)가 충족될 때까지, 또는 시간제한 만료가 발생할 때까지 @ref{1c64,,wait()}를 반복적으로 호출할 수 있습니다. 반환 값은 predicate의 마지막 반환 값이며 메서드가 시간제한 만료되면 @code{False}로 평가됩니다.

시간제한 기능을 무시할 때, 이 메서드를 호출하는 것은 대략 다음과 같이 작성하는 것과 동등합니다:

@example
while not predicate():
    cv.wait()
@end example

따라서, @ref{1c64,,wait()}와 같은 규칙이 적용됩니다: 호출될 때 록을 잡고 있어야 하며 반환할 때 다시 확보됩니다. predicate는 록을 잡고 있는 상태로 평가됩니다.


Added in version 3.2.

@end deffn

@geindex notify() (threading.Condition 메서드)
@anchor{library/threading threading Condition notify}@anchor{1b64}
@deffn {메서드} notify (n=1)

기본적으로, (있다면) 이 조건에서 대기 중인 하나의 스레드를 깨웁니다. 이 메서드가 호출될 때 호출하는 스레드가 잠금을 획득하지 않았으면 @ref{244,,RuntimeError}가 발생합니다.

이 메서드는 조건 변수를 기다리는 스레드를 최대 `n' 개 깨웁니다; 기다리는 스레드가 없으면 아무런 일도 하지 않습니다.

적어도 `n' 스레드가 대기 중이면, 현재 구현은 정확히 `n' 스레드를 깨웁니다. 그러나, 이 동작에 의존하는 것은 안전하지 않습니다. 미래에는, 최적화된 구현이 때때로 `n' 스레드보다 많이 깨울 수 있습니다.

참고: 깨어난 스레드는 록을 다시 획득할 때까지 @ref{1c64,,wait()} 호출에서 실제로 반환하지 않습니다. @ref{1b64,,notify()}가 록을 해제하지 않기 때문에, 호출자가 해제해야 합니다.
@end deffn

@geindex notify_all() (threading.Condition 메서드)
@anchor{library/threading threading Condition notify_all}@anchor{359}
@deffn {메서드} notify_all ()

이 조건에서 대기 중인 모든 스레드를 깨웁니다. 이 메서드는 @ref{1b64,,notify()}처럼 작동하지만, 하나 대신에 대기 중인 모든 스레드를 깨웁니다. 이 메서드가 호출될 때 호출하는 스레드가 잠금을 획득하지 않았으면 @ref{244,,RuntimeError}가 발생합니다.

The method @code{notifyAll} is a deprecated alias for this method.
@end deffn
@end deffn

@node Semaphore objects,Semaphore example,Condition objects,Reference<2>
@anchor{library/threading id5}@anchor{3660}@anchor{library/threading semaphore-objects}@anchor{3661}
@subsubsection Semaphore objects


이것은 일찌감치 네덜란드 컴퓨터 과학자 Edsger W. Dijkstra가 발명한, 컴퓨터 과학 역사상 가장 오래된 동기화 프리미티브 중 하나입니다 (그는 @ref{1458,,acquire()}와 @ref{3662,,release()} 대신 @code{P()}와 @code{V()}라는 이름을 사용했습니다).

세마포어는 각 @ref{1458,,acquire()} 호출에 의해 감소하고 각 @ref{3662,,release()} 호출에 의해 증가하는 내부 카운터를 관리합니다. 카운터는 절대 0 밑으로 떨어질 수 없습니다; @code{acquire()}가 0임을 발견하면, 다른 스레드가 @code{release()}를 호출할 때까지 대기하면서 블록 합니다.

세마포어도 @ref{3655,,컨텍스트 관리자 프로토콜}을 지원합니다.

@geindex Semaphore (threading 클래스)
@anchor{library/threading threading Semaphore}@anchor{135b}
@deffn {클래스} threading.Semaphore (value=1)

이 클래스는 세마포어 객체를 구현합니다. 세마포어는 @ref{3662,,release()} 호출 수에서 @ref{1458,,acquire()} 호출 수를 빼고, 초깃값을 더한 원자 적 카운터를 관리합니다. @code{acquire()} 메서드는 카운터를 음수로 만들지 않고 반환할 수 있을 때까지 필요하면 블록 합니다. 지정하지 않으면, `value'의 기본값은 1입니다.

선택적 인자는 내부 카운터의 초깃 `값(value)'을 제공합니다; 기본값은 @code{1}입니다. 주어진 `value'가 0보다 작으면 @ref{2ec,,ValueError}가 발생합니다.


버전 3.3에서 변경: 팩토리 함수에서 클래스로 변경되었습니다.


@geindex acquire() (threading.Semaphore 메서드)
@anchor{library/threading threading Semaphore acquire}@anchor{1458}
@deffn {메서드} acquire (blocking=True, timeout=None)

세마포어를 획득합니다.

인자 없이 호출될 때:


@itemize *

@item 
진입 시 내부 카운터가 0보다 크면, 1 감소시키고 즉시 @code{True}를 반환합니다.

@item 
진입 시 내부 카운터가 0이면, @ref{3662,,release()}를 호출하여 깨울 때까지 블록 합니다. 일단 깨어나면 (그리고 카운터가 0보다 크면), 카운터를 1줄이고 @code{True}를 반환합니다. @code{release()}를 호출할 때마다 정확히 하나의 스레드가 깨어납니다. 스레드가 깨어나는 순서에 의존해서는 안 됩니다.
@end itemize

@code{False}로 설정한 `blocking'으로 호출하면 블록 하지 않습니다. 인자가 없는 호출이 블록 할 것이라면, 즉시 @code{False}를 반환합니다; 그렇지 않으면, 인자 없이 호출할 때와 같은 작업을 수행하고, @code{True}를 반환합니다.

@code{None} 이외의 `timeout'으로 호출하면, 최대 `timeout' 초 동안 블록 합니다. 그 기간 획득이 완료되지 않으면, @code{False}를 반환합니다. 그렇지 않으면 @code{True}를 반환합니다.


버전 3.2에서 변경: `timeout' 매개 변수가 추가되었습니다.

@end deffn

@geindex release() (threading.Semaphore 메서드)
@anchor{library/threading threading Semaphore release}@anchor{3662}
@deffn {메서드} release (n=1)

내부 카운터를 `n' 증가시키면서 세마포어를 해제합니다. 진입 시 0이고 다른 스레드가 다시 0보다 커지기를 기다리고 있으면, 해당 스레드를 `n'개 깨웁니다.


버전 3.9에서 변경: 여러 대기 스레드를 한 번에 해제하기 위해 `n' 매개 변수를 추가했습니다.

@end deffn
@end deffn

@geindex BoundedSemaphore (threading 클래스)
@anchor{library/threading threading BoundedSemaphore}@anchor{135c}
@deffn {클래스} threading.BoundedSemaphore (value=1)

경계 세마포어 객체를 구현하는 클래스. 경계 세마포어는 현재 값이 초깃값을 초과하지 않는지 확인합니다. 그렇다면, @ref{2ec,,ValueError}가 발생합니다. 대부분은 세마포어는 제한된 용량의 자원을 보호하는 데 사용됩니다. 세마포어가 너무 여러 번 해제되면 버그의 징조입니다. 지정하지 않으면, `value'의 기본값은 1입니다.


버전 3.3에서 변경: 팩토리 함수에서 클래스로 변경되었습니다.

@end deffn

@node Semaphore example,Event objects,Semaphore objects,Reference<2>
@anchor{library/threading semaphore-example}@anchor{3663}@anchor{library/threading semaphore-examples}@anchor{3664}
@subsubsection @code{Semaphore} example


세마포어는 예를 들어 데이터베이스 서버와 같이 제한된 용량의 자원을 보호하는 데 종종 사용됩니다. 자원의 크기가 고정된 상황에서는, 경계 세마포어를 사용해야 합니다. 작업자 스레드를 만들기 전에, 메인 스레드가 세마포어를 초기화합니다:

@example
maxconnections = 5
# ...
pool_sema = BoundedSemaphore(value=maxconnections)
@end example

일단 만들어지면, 작업자 스레드는 서버에 연결해야 할 때 세마포어의 acquire 및 release 메서드를 호출합니다:

@example
with pool_sema:
    conn = connectdb()
    try:
        # ... 연결을 사용합니다 ...
    finally:
        conn.close()
@end example

경계 세마포어를 사용하면 세마포어가 획득한 것보다 더 많이 해제되는 프로그래밍 에러가 감지되지 않을 가능성이 줄어듭니다.

@node Event objects,Timer objects,Semaphore example,Reference<2>
@anchor{library/threading event-objects}@anchor{3665}@anchor{library/threading id6}@anchor{3666}
@subsubsection Event objects


이것은 스레드 간 통신을 위한 가장 간단한 메커니즘 중 하나입니다: 하나의 스레드는 이벤트를 알리고 다른 스레드는 이를 기다립니다.

이벤트 객체는 @ref{3667,,set()} 메서드를 사용하여 참으로 설정하고 @ref{3668,,clear()} 메서드를 사용하여 거짓으로 재설정 할 수 있는 내부 플래그를 관리합니다. @ref{152b,,wait()} 메서드는 플래그가 참이 될 때까지 블록 합니다.

@geindex Event (threading 클래스)
@anchor{library/threading threading Event}@anchor{135d}
@deffn {클래스} threading.Event

이벤트 객체를 구현하는 클래스. 이벤트는 @ref{3667,,set()} 메서드로 참으로 설정하고 @ref{3668,,clear()} 메서드로 거짓으로 재설정 할 수 있는 플래그를 관리합니다. @ref{152b,,wait()} 메서드는 플래그가 참이 될 때까지 블록 합니다. 플래그는 처음에는 거짓입니다.


버전 3.3에서 변경: 팩토리 함수에서 클래스로 변경되었습니다.


@geindex is_set() (threading.Event 메서드)
@anchor{library/threading threading Event is_set}@anchor{35a}
@deffn {메서드} is_set ()

내부 플래그가 참이면 그리고 오직 그때만 @code{True}를 반환합니다.

The method @code{isSet} is a deprecated alias for this method.
@end deffn

@geindex set() (threading.Event 메서드)
@anchor{library/threading threading Event set}@anchor{3667}
@deffn {메서드} set ()

내부 플래그를 참으로 설정합니다. 이것이 참이 되기를 기다리는 모든 스레드가 깨어납니다. 일단 플래그가 참이면 @ref{152b,,wait()}를 호출하는 스레드는 전혀 블록 하지 않습니다.
@end deffn

@geindex clear() (threading.Event 메서드)
@anchor{library/threading threading Event clear}@anchor{3668}
@deffn {메서드} clear ()

내부 플래그를 거짓으로 재설정합니다. 이후 @ref{152b,,wait()}를 호출하는 스레드는 내부 플래그를 다시 참으로 설정하기 위해 @ref{3667,,set()}을 호출할 때까지 블록 합니다.
@end deffn

@geindex wait() (threading.Event 메서드)
@anchor{library/threading threading Event wait}@anchor{152b}
@deffn {메서드} wait (timeout=None)

Block as long as the internal flag is false and the timeout, if given,
has not expired. The return value represents the
reason that this blocking method returned; @code{True} if returning because
the internal flag is set to true, or @code{False} if a timeout is given and
the internal flag did not become true within the given wait time.

timeout 인자가 있고 @code{None}이 아니면, 작업의 시간제한을 초 또는 부분 초로 지정하는 부동 소수점 숫자여야 합니다.


버전 3.1에서 변경: 이전에는, 메서드가 항상 @code{None}을 반환했습니다.

@end deffn
@end deffn

@node Timer objects,Barrier objects,Event objects,Reference<2>
@anchor{library/threading id7}@anchor{3669}@anchor{library/threading timer-objects}@anchor{366a}
@subsubsection Timer objects


이 클래스는 특정 시간이 지난 후에만 실행되어야 하는 조치를 나타냅니다 – 타이머. @ref{135e,,Timer}는 @ref{176,,Thread}의 서브 클래스이며 사용자 정의 스레드를 만드는 예제로도 기능합니다.

타이머는 스레드와 마찬가지로, @ref{178,,Timer.start} 메서드를 호출하여 시작됩니다. @ref{366b,,cancel()} 메서드를 호출하여 (조치를 시작하기 전에) 타이머를 중지할 수 있습니다. 조치를 실행하기 전에 타이머가 대기하는 간격은 사용자가 지정한 간격과 정확히 같지 않을 수 있습니다.

예를 들면:

@example
def hello():
    print("hello, world")

t = Timer(30.0, hello)
t.start()  # 30초 후에, "hello, world" 가 인쇄됩니다
@end example

@geindex Timer (threading 클래스)
@anchor{library/threading threading Timer}@anchor{135e}
@deffn {클래스} threading.Timer (interval, function, args=None, kwargs=None)

`interval' 초가 지난 후 `args' 인자와 `kwargs' 키워드 인자로 `function'을 실행하는 타이머를 만듭니다. `args'가 @code{None}(기본값)이면 빈 리스트가 사용됩니다. `kwargs'가 @code{None}(기본값)이면 빈 딕셔너리가 사용됩니다.


버전 3.3에서 변경: 팩토리 함수에서 클래스로 변경되었습니다.


@geindex cancel() (threading.Timer 메서드)
@anchor{library/threading threading Timer cancel}@anchor{366b}
@deffn {메서드} cancel ()

타이머를 중지하고, 타이머 조치의 실행을 취소합니다. 타이머가 아직 대기 상태에 있을 때만 작동합니다.
@end deffn
@end deffn

@node Barrier objects,,Timer objects,Reference<2>
@anchor{library/threading barrier-objects}@anchor{366c}
@subsubsection Barrier objects



Added in version 3.2.


이 클래스는 서로를 기다려야 하는 고정된 수의 스레드에서 사용할 수 있는 간단한 동기화 프리미티브를 제공합니다. 각 스레드는 @ref{366d,,wait()} 메서드를 호출하여 장벽(barrier)을 통과하려고 시도하고 모든 스레드가 @code{wait()} 호출을 수행할 때까지 블록 합니다. 이 시점에서, 스레드가 동시에 해제됩니다.

장벽은 같은 수의 스레드에 대해 여러 번 재사용 할 수 있습니다.

예를 들어, 다음은 클라이언트와 서버 스레드를 동기화하는 간단한 방법입니다:

@example
b = Barrier(2, timeout=5)

def server():
    start_server()
    b.wait()
    while True:
        connection = accept_connection()
        process_server_connection(connection)

def client():
    b.wait()
    while True:
        connection = make_connection()
        process_client_connection(connection)
@end example

@geindex Barrier (threading 클래스)
@anchor{library/threading threading Barrier}@anchor{13e8}
@deffn {클래스} threading.Barrier (parties, action=None, timeout=None)

`parties' 수의 스레드에 대한 장벽 객체를 만듭니다. 제공되면, `action'은 해제될 때 스레드 중 하나가 호출할 콜러블입니다. `timeout'은 @ref{366d,,wait()} 메서드에 대해 지정되지 않을 때 사용될 기본 시간제한 값입니다.

@geindex wait() (threading.Barrier 메서드)
@anchor{library/threading threading Barrier wait}@anchor{366d}
@deffn {메서드} wait (timeout=None)

장벽을 통과합니다. 장벽에 속한 모든 스레드가 이 함수를 호출할 때, 모두 동시에 해제됩니다. `timeout'이 제공되면, 클래스 생성자에 제공된 것보다 우선하여 사용됩니다.

반환 값은 0에서 `parties' - 1 범위의 정수이며, 스레드마다 다릅니다. 이것은 특별한 하우스키핑을 수행할 스레드를 선택하는데 사용될 수 있습니다, 예를 들어:

@example
i = barrier.wait()
if i == 0:
    # 오직 한 스레드만 이것을 인쇄하면 됩니다
    print("passed the barrier")
@end example

생성자에 `action'이 제공되면, 스레드 중 하나가 해제되기 전에 호출합니다. 이 호출로 에러가 발생하면, 장벽은 망가진 상태가 됩니다.

호출 시간제한이 만료되면, 장벽은 망가진 상태가 됩니다.

스레드가 기다리는 동안 장벽이 망가지거나 재설정되면 이 메서드는 @ref{13ea,,BrokenBarrierError} 예외를 발생시킬 수 있습니다.
@end deffn

@geindex reset() (threading.Barrier 메서드)
@anchor{library/threading threading Barrier reset}@anchor{366e}
@deffn {메서드} reset ()

장벽을 기본의 빈 상태로 되돌립니다. 대기 중인 모든 스레드는 @ref{13ea,,BrokenBarrierError} 예외를 수신합니다.

상태를 알 수 없는 다른 스레드가 있을 때 이 함수를 사용하려면 외부 동기화가 필요할 수 있습니다. 장벽이 망가지면 그냥 두고 새 장벽을 만드는 것이 좋습니다.
@end deffn

@geindex abort() (threading.Barrier 메서드)
@anchor{library/threading threading Barrier abort}@anchor{366f}
@deffn {메서드} abort ()

장벽을 망가진 상태로 보냅니다. 이로 인해 @ref{366d,,wait()}에 대한 활성 또는 미래의 호출이 @ref{13ea,,BrokenBarrierError}로 실패합니다. 예를 들어 응용 프로그램의 교착 상태를 피하고자 스레드 중 하나를 중단해야 할 때 이를 사용하십시오.

스레드 중 하나가 잘못되는 것을 막기 위해 단순히 적절한 `timeout' 값으로 장벽을 만드는 것이 바람직 할 수 있습니다.
@end deffn

@geindex parties (threading.Barrier의 속성)
@anchor{library/threading threading Barrier parties}@anchor{3670}
@deffn {속성} parties

장벽을 통과하는 데 필요한 스레드 수.
@end deffn

@geindex n_waiting (threading.Barrier의 속성)
@anchor{library/threading threading Barrier n_waiting}@anchor{3671}
@deffn {속성} n_waiting

현재 장벽에서 대기 중인 스레드 수.
@end deffn

@geindex broken (threading.Barrier의 속성)
@anchor{library/threading threading Barrier broken}@anchor{3672}
@deffn {속성} broken

장벽이 망가진 상태이면 @code{True}인 불리언.
@end deffn
@end deffn

@geindex BrokenBarrierError
@anchor{library/threading threading BrokenBarrierError}@anchor{13ea}
@deffn {예외} threading.BrokenBarrierError

@ref{244,,RuntimeError}의 서브 클래스인, 이 예외는 @ref{13e8,,Barrier} 객체가 재설정되거나 망가질 때 발생합니다.
@end deffn

@node with 문으로 록 조건 및 세마포어 사용하기,,Reference<2>,threading — 스레드 기반 병렬 처리
@anchor{library/threading using-locks-conditions-and-semaphores-in-the-with-statement}@anchor{3673}@anchor{library/threading with-locks}@anchor{3655}
@subsubsection @code{with} 문으로 록, 조건 및 세마포어 사용하기


이 모듈에서 제공하는 @code{acquire}와 @code{release} 메서드가 있는 모든 객체는 @ref{186,,with} 문의 컨텍스트 관리자로 사용될 수 있습니다. 블록에 진입할 때 @code{acquire} 메서드가 호출되고, 블록을 벗어날 때 @code{release}가 호출됩니다. 따라서, 다음 코드 조각은:

@example
with some_lock:
    # 뭔가 합니다...
@end example

다음과 동등합니다:

@example
some_lock.acquire()
try:
    # 뭔가 합니다...
finally:
    some_lock.release()
@end example

현재 @ref{19f4,,Lock}, @ref{32e,,RLock}, @ref{135a,,Condition}, @ref{135b,,Semaphore} 및 @ref{135c,,BoundedSemaphore} 객체는 @ref{186,,with} 문 컨텍스트 관리자로 사용될 수 있습니다.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node multiprocessing — Process-based parallelism,multiprocessing shared_memory — 프로세스 간 직접 액세스를 위한 공유 메모리,threading — 스레드 기반 병렬 처리,동시 실행
@anchor{library/multiprocessing doc}@anchor{3674}@anchor{library/multiprocessing module-multiprocessing}@anchor{98}@anchor{library/multiprocessing multiprocessing-process-based-parallelism}@anchor{3675}@anchor{library/multiprocessing translation-repo}@anchor{3676}
@subsection @code{multiprocessing} — Process-based parallelism


@geindex module; multiprocessing

`소스 코드:' Lib/multiprocessing/@footnote{https://github.com/python/cpython/tree/3.14/Lib/multiprocessing/}


__________________________________________________________________


@c include for modules that don't work on WASM or mobile platforms

@ref{213c,,가용성}: not Android, not iOS, not WASI.

이 모듈은 @ref{2259,,모바일 플랫폼}이나 @ref{1b68,,웹어셈블리 플랫폼}에서 지원되지 않습니다.

@menu
* 소개: 소개<3>. 
* 레퍼런스:: 
* 프로그래밍 지침:: 
* 예제: 예제<12>. 

@end menu

@node 소개<3>,레퍼런스,,multiprocessing — Process-based parallelism
@anchor{library/multiprocessing introduction}@anchor{3677}
@subsubsection 소개


@code{multiprocessing} is a package that supports spawning processes using an
API similar to the @ref{f3,,threading} module.  The @code{multiprocessing} package
offers both local and remote concurrency, effectively side-stepping the
@ref{474,,Global Interpreter Lock} by using
subprocesses instead of threads.  Due
to this, the @code{multiprocessing} module allows the programmer to fully
leverage multiple processors on a given machine.  It runs on both POSIX and
Windows.

The @code{multiprocessing} module also introduces the
@ref{116a,,Pool} object which offers a convenient means of
parallelizing the execution of a function across multiple input values,
distributing the input data across processes (data parallelism).  The following
example demonstrates the common practice of defining such functions in a module
so that child processes can successfully import that module.  This basic example
of data parallelism using @code{Pool},

@example
from multiprocessing import Pool

def f(x):
    return x*x

if __name__ == '__main__':
    with Pool(5) as p:
        print(p.map(f, [1, 2, 3]))
@end example

표준 출력으로 다음과 같은 것을 인쇄합니다

@example
[1, 4, 9]
@end example

The @code{multiprocessing} module also introduces APIs which do not have
analogs in the @ref{f3,,threading} module, like the ability to @ref{185a,,terminate}, @ref{251,,interrupt} or @ref{d4e,,kill} a running process.


@subsubheading 더 보기


@ref{1d6,,concurrent.futures.ProcessPoolExecutor} offers a higher level interface
to push tasks to a background process without blocking execution of the
calling process. Compared to using the @ref{116a,,Pool}
interface directly, the @ref{24,,concurrent.futures} API more readily allows
the submission of work to the underlying process pool to be separated from
waiting for the results.


@menu
* Process 클래스:: 
* 컨텍스트 및 시작 방법:: 
* 프로세스 간 객체 교환:: 
* 프로세스 간 동기화:: 
* 프로세스 간 상태 공유:: 
* 작업자 풀 사용:: 

@end menu

@node Process 클래스,컨텍스트 및 시작 방법,,소개<3>
@anchor{library/multiprocessing the-process-class}@anchor{3678}
@subsubsection @code{Process} 클래스


In @code{multiprocessing}, processes are spawned by creating a @ref{252,,Process}
object and then calling its @ref{1596,,start()} method.  @code{Process}
follows the API of @ref{176,,threading.Thread}.  A trivial example of a
multiprocess program is

@example
from multiprocessing import Process

def f(name):
    print('hello', name)

if __name__ == '__main__':
    p = Process(target=f, args=('bob',))
    p.start()
    p.join()
@end example

이 과정에 참여하는 개별 프로세스의 ID를 보기 위해, 이렇게 예제를 확장합니다:

@example
from multiprocessing import Process
import os

def info(title):
    print(title)
    print('module name:', __name__)
    print('parent process:', os.getppid())
    print('process id:', os.getpid())

def f(name):
    info('function f')
    print('hello', name)

if __name__ == '__main__':
    info('main line')
    p = Process(target=f, args=('bob',))
    p.start()
    p.join()
@end example

@code{if __name__ == '__main__'} 부분이 필요한 이유에 대한 설명은 @ref{3679,,프로그래밍 지침}을 보십시오.

The arguments to @ref{252,,Process} usually need to be unpickleable from within
the child process. If you tried typing the above example directly into a REPL it
could lead to an @ref{5ee,,AttributeError} in the child process trying to locate the
`f' function in the @code{__main__} module.

@node 컨텍스트 및 시작 방법,프로세스 간 객체 교환,Process 클래스,소개<3>
@anchor{library/multiprocessing contexts-and-start-methods}@anchor{367a}@anchor{library/multiprocessing multiprocessing-start-methods}@anchor{1d5}
@subsubsection 컨텍스트 및 시작 방법


Depending on the platform, @code{multiprocessing} supports three ways
to start a process.  These `start methods' are

@quotation
@anchor{library/multiprocessing multiprocessing-start-method-spawn}@anchor{1d8}

@table @asis

@item `spawn'

The parent process starts a fresh Python interpreter process.  The
child process will only inherit those resources necessary to run
the process object’s @ref{367b,,run()} method.  In particular,
unnecessary file descriptors and handles from the parent process
will not be inherited.  Starting a process using this method is
rather slow compared to using `fork' or `forkserver'.

Available on POSIX and Windows platforms.  The default on Windows and macOS.
@end table
@anchor{library/multiprocessing multiprocessing-start-method-fork}@anchor{1d7}

@table @asis

@item `fork'

부모 프로세스는 @ref{4b6,,os.fork()} 를 사용하여 파이썬 인터프리터를 포크 합니다. 자식 프로세스는, 시작될 때, 부모 프로세스와 실질적으로 같습니다. 부모의 모든 자원이 자식 프로세스에 의해 상속됩니다. 다중 스레드 프로세스를 안전하게 포크 하기 어렵다는 점에 주의하십시오.

Available on POSIX systems.


버전 3.14에서 변경: This is no longer the default start method on any platform.
Code that requires `fork' must explicitly specify that via
@ref{24a,,get_context()} or @ref{24b,,set_start_method()}.



버전 3.12에서 변경: If Python is able to detect that your process has multiple threads, the
@ref{4b6,,os.fork()} function that this start method calls internally will
raise a @ref{1a3,,DeprecationWarning}. Use a different start method.
See the @code{os.fork()} documentation for further explanation.

@end table
@anchor{library/multiprocessing multiprocessing-start-method-forkserver}@anchor{1d4}

@table @asis

@item `forkserver'

When the program starts and selects the `forkserver' start method,
a server process is spawned.  From then on, whenever a new process
is needed, the parent process connects to the server and requests
that it fork a new process.  The fork server process is single threaded
unless system libraries or preloaded imports spawn threads as a
side-effect so it is generally safe for it to use @ref{4b6,,os.fork()}.
No unnecessary resources are inherited.

Available on POSIX platforms which support passing file descriptors over
Unix pipes such as Linux.  The default on those.


버전 3.14에서 변경: This became the default start method on POSIX platforms.

@end table
@end quotation


버전 3.4에서 변경: `spawn' added on all POSIX platforms, and `forkserver' added for
some POSIX platforms.
Child processes no longer inherit all of the parents inheritable
handles on Windows.



버전 3.8에서 변경: On macOS, the `spawn' start method is now the default.  The `fork' start
method should be considered unsafe as it can lead to crashes of the
subprocess as macOS system libraries may start threads. See bpo-33725@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33725}.



버전 3.14에서 변경: On POSIX platforms the default start method was changed from `fork' to
`forkserver' to retain the performance but avoid common multithreaded
process incompatibilities. See gh-84559@footnote{https://github.com/python/cpython/issues/84559}.


On POSIX using the `spawn' or `forkserver' start methods will also
start a `resource tracker' process which tracks the unlinked named
system resources (such as named semaphores or
@ref{19d8,,SharedMemory} objects) created
by processes of the program.  When all processes
have exited the resource tracker unlinks any remaining tracked object.
Usually there should be none, but if a process was killed by a signal
there may be some “leaked” resources.  (Neither leaked semaphores nor shared
memory segments will be automatically unlinked until the next reboot. This is
problematic for both objects because the system allows only a limited number of
named semaphores, and shared memory segments occupy some space in the main
memory.)

시작 방법을 선택하려면 메인 모듈의 @code{if __name__ == '__main__'} 절에서 @ref{24b,,set_start_method()}를 사용하십시오. 예를 들면:

@example
import multiprocessing as mp

def foo(q):
    q.put('hello')

if __name__ == '__main__':
    mp.set_start_method('spawn')
    q = mp.Queue()
    p = mp.Process(target=foo, args=(q,))
    p.start()
    print(q.get())
    p.join()
@end example

@ref{24b,,set_start_method()} 는 프로그램에서 한 번만 사용되어야 합니다.

또는, @ref{24a,,get_context()}를 사용하여 컨텍스트 객체를 얻을 수 있습니다. 컨텍스트 객체는 multiprocessing 모듈과 같은 API를 제공하므로 한 프로그램에서 여러 시작 방법을 사용할 수 있습니다.

@example
import multiprocessing as mp

def foo(q):
    q.put('hello')

if __name__ == '__main__':
    ctx = mp.get_context('spawn')
    q = ctx.Queue()
    p = ctx.Process(target=foo, args=(q,))
    p.start()
    print(q.get())
    p.join()
@end example

한 컨텍스트와 관련된 객체는 다른 컨텍스트의 프로세스와 호환되지 않을 수 있음에 주의하십시오. 특히 `fork' 컨텍스트를 사용하여 생성된 록은 `spawn' 또는 `forkserver' 시작 방법을 사용하여 시작된 프로세스로 전달될 수 없습니다.

Libraries using @code{multiprocessing} or
@ref{1d6,,ProcessPoolExecutor} should be designed to allow
their users to provide their own multiprocessing context.  Using a specific
context of your own within a library can lead to incompatibilities with the
rest of the library user’s application.  Always document if your library
requires a specific start method.

@cartouche
@quotation 경고 
The @code{'spawn'} and @code{'forkserver'} start methods generally cannot
be used with “frozen” executables (i.e., binaries produced by
packages like `PyInstaller' and `cx_Freeze') on POSIX systems.
The @code{'fork'} start method may work if code does not use threads.
@end quotation
@end cartouche

@node 프로세스 간 객체 교환,프로세스 간 동기화,컨텍스트 및 시작 방법,소개<3>
@anchor{library/multiprocessing exchanging-objects-between-processes}@anchor{367c}
@subsubsection 프로세스 간 객체 교환


@code{multiprocessing} supports two types of communication channel between
processes:

`큐'

@quotation

@ref{1b87,,Queue} 클래스는 @ref{1599,,queue.Queue} 의 클론에 가깝습니다. 예를 들면:

@example
from multiprocessing import Process, Queue

def f(q):
    q.put([42, None, 'hello'])

if __name__ == '__main__':
    q = Queue()
    p = Process(target=f, args=(q,))
    p.start()
    print(q.get())    # prints "[42, None, 'hello']"
    p.join()
@end example

Queues are thread and process safe.
Any object put into a @code{multiprocessing} queue will be serialized.
@end quotation

`파이프'

@quotation

@ref{367d,,Pipe()} 함수는 파이프로 연결된 한 쌍의 연결 객체를 돌려주는데 기본적으로 양방향(duplex)입니다. 예를 들면:

@example
from multiprocessing import Process, Pipe

def f(conn):
    conn.send([42, None, 'hello'])
    conn.close()

if __name__ == '__main__':
    parent_conn, child_conn = Pipe()
    p = Process(target=f, args=(child_conn,))
    p.start()
    print(parent_conn.recv())   # prints "[42, None, 'hello']"
    p.join()
@end example

@ref{367d,,Pipe()} 가 반환하는 두 개의 연결 객체는 파이프의 두 끝을 나타냅니다. 각 연결 객체에는 (다른 것도 있지만) @code{send()} 및 @code{recv()} 메서드가 있습니다. 두 프로세스 (또는 스레드)가 파이프의 `같은' 끝에서 동시에 읽거나 쓰려고 하면 파이프의 데이터가 손상될 수 있습니다. 물론 파이프의 다른 끝을 동시에 사용하는 프로세스로 인해 손상될 위험은 없습니다.

The @code{send()} method serializes the object and
@code{recv()} re-creates the object.
@end quotation

@node 프로세스 간 동기화,프로세스 간 상태 공유,프로세스 간 객체 교환,소개<3>
@anchor{library/multiprocessing synchronization-between-processes}@anchor{367e}
@subsubsection 프로세스 간 동기화


@code{multiprocessing} contains equivalents of all the synchronization
primitives from @ref{f3,,threading}.  For instance one can use a lock to ensure
that only one process prints to standard output at a time:

@example
from multiprocessing import Process, Lock

def f(l, i):
    l.acquire()
    try:
        print('hello world', i)
    finally:
        l.release()

if __name__ == '__main__':
    lock = Lock()

    for num in range(10):
        Process(target=f, args=(lock, num)).start()
@end example

록을 사용하지 않으면 다른 프로세스의 출력들이 모두 섞일 수 있습니다.

@node 프로세스 간 상태 공유,작업자 풀 사용,프로세스 간 동기화,소개<3>
@anchor{library/multiprocessing sharing-state-between-processes}@anchor{367f}
@subsubsection 프로세스 간 상태 공유


위에서 언급했듯이, 동시성 프로그래밍을 할 때 보통 가능한 한 공유된 상태를 사용하지 않는 것이 최선입니다. 여러 프로세스를 사용할 때 특히 그렇습니다.

However, if you really do need to use some shared data then
@code{multiprocessing} provides a couple of ways of doing so.

`공유 메모리'

@quotation

데이터는 @ref{3680,,Value} 또는 @ref{3681,,Array}를 사용하여 공유 메모리 맵에 저장 될 수 있습니다. 예를 들어, 다음 코드는

@example
from multiprocessing import Process, Value, Array

def f(n, a):
    n.value = 3.1415927
    for i in range(len(a)):
        a[i] = -a[i]

if __name__ == '__main__':
    num = Value('d', 0.0)
    arr = Array('i', range(10))

    p = Process(target=f, args=(num, arr))
    p.start()
    p.join()

    print(num.value)
    print(arr[:])
@end example

를 인쇄할 것입니다

@example
3.1415927
[0, -1, -2, -3, -4, -5, -6, -7, -8, -9]
@end example

@code{num} 과 @code{arr} 을 만들 때 사용되는 @code{'d'} 와 @code{'i'} 인자는 @ref{8,,array} 모듈에서 사용되는 종류의 타입 코드입니다: @code{'d'} 는 배정밀도 부동 소수점을 나타내고, @code{'i'} 는 부호 있는 정수를 나타냅니다. 이러한 공유 객체는 프로세스 및 스레드에 안전합니다.

공유 메모리를 더 유연하게 사용하려면, 공유 메모리에 할당된 임의의 ctypes 객체 생성을 지원하는 @ref{9e,,multiprocessing.sharedctypes} 모듈을 사용할 수 있습니다.
@end quotation

`서버 프로세스'

@quotation

@ref{250,,Manager()} 가 반환한 관리자 객체는 파이썬 객체를 유지하고 다른 프로세스가 프락시를 사용하여 이 객체를 조작할 수 있게 하는 서버 프로세스를 제어합니다.

A manager returned by @ref{250,,Manager()} will support types
@ref{24d,,list}, @ref{183,,dict}, @ref{184,,set}, @ref{3682,,Namespace}, @ref{1856,,Lock},
@ref{1857,,RLock}, @ref{3683,,Semaphore}, @ref{3684,,BoundedSemaphore},
@ref{3685,,Condition}, @ref{1c04,,Event}, @ref{3686,,Barrier},
@ref{1b87,,Queue}, @ref{3680,,Value} and @ref{3681,,Array}.  For example,

@example
from multiprocessing import Process, Manager

def f(d, l, s):
    d[1] = '1'
    d['2'] = 2
    d[0.25] = None
    l.reverse()
    s.add('a')
    s.add('b')

if __name__ == '__main__':
    with Manager() as manager:
        d = manager.dict()
        l = manager.list(range(10))
        s = manager.set()

        p = Process(target=f, args=(d, l, s))
        p.start()
        p.join()

        print(d)
        print(l)
        print(s)
@end example

를 인쇄할 것입니다

@example
@{0.25: None, 1: '1', '2': 2@}
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
@{'a', 'b'@}
@end example

서버 프로세스 관리자는 임의의 객체 형을 지원하도록 만들 수 있으므로 공유 메모리 객체를 사용하는 것보다 융통성이 있습니다. 또한, 단일 관리자를 네트워크를 통해 서로 다른 컴퓨터의 프로세스에서 공유 할 수 있습니다. 그러나 공유 메모리를 사용할 때보다 느립니다.
@end quotation

@node 작업자 풀 사용,,프로세스 간 상태 공유,소개<3>
@anchor{library/multiprocessing using-a-pool-of-workers}@anchor{3687}
@subsubsection 작업자 풀 사용


@ref{116a,,Pool} 클래스는 작업자 프로세스 풀을 나타냅니다. 여기에는 몇 가지 다른 방법으로 작업을 작업자 프로세스로 넘길 수 있는 메서드가 있습니다.

예를 들면:

@example
from multiprocessing import Pool, TimeoutError
import time
import os

def f(x):
    return x*x

if __name__ == '__main__':
    # start 4 worker processes
    with Pool(processes=4) as pool:

        # print "[0, 1, 4,..., 81]"
        print(pool.map(f, range(10)))

        # print same numbers in arbitrary order
        for i in pool.imap_unordered(f, range(10)):
            print(i)

        # evaluate "f(20)" asynchronously
        res = pool.apply_async(f, (20,))      # runs in *only* one process
        print(res.get(timeout=1))             # prints "400"

        # evaluate "os.getpid()" asynchronously
        res = pool.apply_async(os.getpid, ()) # runs in *only* one process
        print(res.get(timeout=1))             # prints the PID of that process

        # launching multiple evaluations asynchronously *may* use more processes
        multiple_results = [pool.apply_async(os.getpid, ()) for i in range(4)]
        print([res.get(timeout=1) for res in multiple_results])

        # make a single worker sleep for 10 seconds
        res = pool.apply_async(time.sleep, (10,))
        try:
            print(res.get(timeout=1))
        except TimeoutError:
            print("We lacked patience and got a multiprocessing.TimeoutError")

        print("For the moment, the pool remains available for more work")

    # exiting the 'with'-block has stopped the pool
    print("Now the pool is closed and no longer available")
@end example

풀의 메서드는 풀을 만든 프로세스에서만 사용되어야 함에 유의하세요.

@cartouche
@quotation 참고 
이 패키지 내의 기능을 사용하려면 @code{__main__} 모듈을 자식이 임포트 할 수 있어야 합니다. 이것은 @ref{3679,,프로그래밍 지침}에서 다루지만, 여기에서 지적할 가치가 있습니다. 이것은 몇몇 예제, 가령 @ref{116a,,multiprocessing.pool.Pool} 예제가 대화형 인터프리터에서 동작하지 않음을 의미합니다. 예를 들면:

@example
>>> from multiprocessing import Pool
>>> p = Pool(5)
>>> def f(x):
...     return x*x
...
>>> with p:
...     p.map(f, [1,2,3])
Process PoolWorker-1:
Process PoolWorker-2:
Process PoolWorker-3:
Traceback (most recent call last):
Traceback (most recent call last):
Traceback (most recent call last):
AttributeError: Can't get attribute 'f' on <module '__main__' (<class '_frozen_importlib.BuiltinImporter'>)>
AttributeError: Can't get attribute 'f' on <module '__main__' (<class '_frozen_importlib.BuiltinImporter'>)>
AttributeError: Can't get attribute 'f' on <module '__main__' (<class '_frozen_importlib.BuiltinImporter'>)>
@end example

(이것을 시도해 보면 실제로 세 개의 전체 트레이스백이 어느 정도 임의로 번갈아 출력됩니다. 그런 다음 부모 프로세스를 중지시켜야 할 수도 있습니다.)
@end quotation
@end cartouche

@node 레퍼런스,프로그래밍 지침,소개<3>,multiprocessing — Process-based parallelism
@anchor{library/multiprocessing reference}@anchor{3688}
@subsubsection 레퍼런스


The @code{multiprocessing} package mostly replicates the API of the
@ref{f3,,threading} module.

@menu
* Global start method:: 
* Process와 예외:: 
* 파이프와 큐:: 
* 잡동사니: 잡동사니<3>. 
* Connection 객체:: 
* 동기화 프리미티브:: 
* 공유 ctypes 객체:: 
* 관리자:: 
* 프락시 객체:: 
* 프로세스 풀:: 
* 리스너와 클라이언트:: 
* 인증 키:: 
* 로깅: 로깅<2>. 
* The multiprocessing.dummy module: The multiprocessing dummy module. 

@end menu

@node Global start method,Process와 예외,,레퍼런스
@anchor{library/multiprocessing global-start-method}@anchor{3689}@anchor{library/multiprocessing id1}@anchor{368a}
@subsubsection Global start method


Python supports several ways to create and initialize a process.
The global start method sets the default mechanism for creating a process.

Several multiprocessing functions and methods that may also instantiate
certain objects will implicitly set the global start method to the system’s default,
if it hasn’t been set already. The global start method can only be set once.
If you need to change the start method from the system default, you must
proactively set the global start method before calling functions or methods,
or creating these objects.

@node Process와 예외,파이프와 큐,Global start method,레퍼런스
@anchor{library/multiprocessing process-and-exceptions}@anchor{368b}
@subsubsection @code{Process}와 예외


@geindex Process (multiprocessing 클래스)
@anchor{library/multiprocessing multiprocessing Process}@anchor{252}
@deffn {클래스} multiprocessing.Process (group=None, target=None, name=None, args=(), kwargs=@{@}, *, daemon=None)

프로세스 객체는 별도의 프로세스에서 실행되는 작업을 나타냅니다. @ref{252,,Process} 클래스는 @ref{176,,threading.Thread} 의 모든 메서드와 같은 메서드를 갖습니다.

The constructor should always be called with keyword arguments. `group'
should always be @code{None}; it exists solely for compatibility with
@ref{176,,threading.Thread}.  `target' is the callable object to be invoked by
the @ref{367b,,run()} method.  It defaults to @code{None}, meaning nothing is
called. `name' is the process name (see @ref{368c,,name} for more details).
`args' is the argument tuple for the target invocation.  `kwargs' is a
dictionary of keyword arguments for the target invocation.  If provided,
the keyword-only `daemon' argument sets the process @ref{368d,,daemon} flag
to @code{True} or @code{False}.  If @code{None} (the default), this flag will be
inherited from the creating process.

By default, no arguments are passed to `target'. The `args' argument,
which defaults to @code{()}, can be used to specify a list or tuple of the arguments
to pass to `target'.

If a subclass overrides the constructor, it must make sure it invokes the
base class constructor (@code{super().__init__()}) before doing anything else
to the process.

@cartouche
@quotation 참고 
In general, all arguments to @code{Process} must be picklable.  This is
frequently observed when trying to create a @code{Process} or use a
@ref{1d6,,concurrent.futures.ProcessPoolExecutor} from a REPL with a
locally defined `target' function.

Passing a callable object defined in the current REPL session causes the
child process to die via an uncaught @ref{5ee,,AttributeError} exception when
starting as `target' must have been defined within an importable module
in order to be loaded during unpickling.

Example of this uncatchable error from the child:

@example
>>> import multiprocessing as mp
>>> def knigit():
...     print("Ni!")
...
>>> process = mp.Process(target=knigit)
>>> process.start()
>>> Traceback (most recent call last):
  File ".../multiprocessing/spawn.py", line ..., in spawn_main
  File ".../multiprocessing/spawn.py", line ..., in _main
AttributeError: module '__main__' has no attribute 'knigit'
>>> process
<SpawnProcess name='SpawnProcess-1' pid=379473 parent=378707 stopped exitcode=1>
@end example

See @ref{368e,,spawn 과 forkserver 시작 방법}.  While this restriction is
not true if using the @code{"fork"} start method, as of Python @code{3.14} that
is no longer the default on any platform.  See
@ref{1d5,,컨텍스트 및 시작 방법}.
See also gh-132898@footnote{https://github.com/python/cpython/issues/132898}.
@end quotation
@end cartouche


버전 3.3에서 변경: Added the `daemon' parameter.


@geindex run() (multiprocessing.Process 메서드)
@anchor{library/multiprocessing multiprocessing Process run}@anchor{367b}
@deffn {메서드} run ()

프로세스의 활동을 나타내는 메서드.

서브 클래스에서 이 메서드를 재정의할 수 있습니다. 표준 @ref{367b,,run()} 메서드는 객체의 생성자에 target 인자로 전달된 콜러블 객체를 호출하는데 (있다면) `args' 와 `kwargs' 인자를 각각 위치 인자와 키워드 인자로 사용합니다.

Using a list or tuple as the `args' argument passed to @code{Process}
achieves the same effect.

Example:

@example
>>> from multiprocessing import Process
>>> p = Process(target=print, args=[1])
>>> p.run()
1
>>> p = Process(target=print, args=(1,))
>>> p.run()
1
@end example
@end deffn

@geindex start() (multiprocessing.Process 메서드)
@anchor{library/multiprocessing multiprocessing Process start}@anchor{1596}
@deffn {메서드} start ()

프로세스의 활동을 시작합니다.

이것은 프로세스 객체 당 최대 한 번 호출되어야 합니다. 객체의 @ref{367b,,run()} 메서드가 별도의 프로세스에서 호출되도록 합니다.
@end deffn

@geindex join() (multiprocessing.Process 메서드)
@anchor{library/multiprocessing multiprocessing Process join}@anchor{1598}
@deffn {메서드} join ([timeout])

선택적 인자 `timeout' 이 @code{None} (기본값) 인 경우, 메서드는 @ref{1598,,join()} 메서드가 호출된 프로세스가 종료될 때까지 블록 됩니다. `timeout' 이 양수면 최대 `timeout' 초 동안 블록 됩니다. 이 메서드는 프로세스가 종료되거나 메서드가 시간 초과 되면 @code{None} 을 돌려줌에 주의해야 합니다. 프로세스의 @ref{368f,,exitcode} 를 검사하여 종료되었는지 확인하십시오.

프로세스는 여러 번 조인할 수 있습니다.

교착 상태를 유발할 수 있으므로 프로세스는 자신을 조인할 수 없습니다. 프로세스가 시작되기 전에 프로세스에 조인하려고 하면 에러가 발생합니다.
@end deffn

@geindex name (multiprocessing.Process의 속성)
@anchor{library/multiprocessing multiprocessing Process name}@anchor{368c}
@deffn {속성} name

프로세스의 이름. 이름은 식별 목적으로만 사용되는 문자열입니다. 다른 의미는 없습니다. 여러 프로세스에 같은 이름이 주어질 수 있습니다.

초기 이름은 생성자에 의해 설정됩니다. 명시적 이름이 생성자에 제공되지 않으면, ‘Process-N@w{[1]}:N@w{[2]}:…:N@w{[k]}’ 형식의 이름이 만들어지는데, 각각의 N@w{[k]} 는 부모의 N 번째 자식입니다.
@end deffn

@geindex is_alive() (multiprocessing.Process 메서드)
@anchor{library/multiprocessing multiprocessing Process is_alive}@anchor{1597}
@deffn {메서드} is_alive ()

프로세스가 살아있는지 아닌지를 반환합니다.

대략, 프로세스 객체는 @ref{1596,,start()} 메서드가 반환하는 순간부터 자식 프로세스가 종료될 때까지 살아있습니다.
@end deffn

@geindex daemon (multiprocessing.Process의 속성)
@anchor{library/multiprocessing multiprocessing Process daemon}@anchor{368d}
@deffn {속성} daemon

프로세스의 데몬 플래그, 논리값. @ref{1596,,start()} 가 호출되기 전에 설정되어야 합니다.

초깃값은 생성 프로세스에서 상속됩니다.

프로세스가 종료할 때, 모든 데몬 자식 프로세스를 강제 종료시키려고(terminate) 시도합니다.

데몬 프로세스는 하위 프로세스를 만들 수 없음에 유의하십시오. 그렇지 않으면 부모 프로세스가 종료될 때 데몬 프로세스가 강제 종료되어, 데몬 프로세스가 자식 프로세스를 고아로 남기게 됩니다. 또한, 이들은 유닉스 데몬이나 서비스가 `아닙니다', 데몬이 아닌 프로세스들이 종료되면 강제 종료되는 (그리고 조인되지 않는) 일반 프로세스입니다.
@end deffn

@ref{176,,threading.Thread} API 외에도 @ref{252,,Process} 객체는 다음 어트리뷰트와 메서드도 지원합니다 :

@geindex pid (multiprocessing.Process의 속성)
@anchor{library/multiprocessing multiprocessing Process pid}@anchor{3690}
@deffn {속성} pid

프로세스 ID를 돌려줍니다. 프로세스가 스폰 되기 전에는 @code{None} 입니다.
@end deffn

@geindex exitcode (multiprocessing.Process의 속성)
@anchor{library/multiprocessing multiprocessing Process exitcode}@anchor{368f}
@deffn {속성} exitcode

The child’s exit code.  This will be @code{None} if the process has not yet
terminated.

If the child’s @ref{367b,,run()} method returned normally, the exit code
will be 0.  If it terminated via @ref{277,,sys.exit()} with an integer
argument `N', the exit code will be `N'.

If the child terminated due to an exception not caught within
@ref{367b,,run()}, the exit code will be 1.  If it was terminated by
signal `N', the exit code will be the negative value `-N'.
@end deffn

@geindex authkey (multiprocessing.Process의 속성)
@anchor{library/multiprocessing multiprocessing Process authkey}@anchor{3691}
@deffn {속성} authkey

프로세스의 인증 키 (바이트열) 입니다.

When @code{multiprocessing} is initialized the main process is assigned a
random string using @ref{745,,os.urandom()}.

@ref{252,,Process} 객체가 생성될 때, 부모 프로세스의 인증 키를 상속받습니다. @ref{3691,,authkey} 를 다른 바이트열로 설정하여 변경할 수 있습니다.

@ref{3692,,인증 키}를 참조하세요.
@end deffn

@geindex sentinel (multiprocessing.Process의 속성)
@anchor{library/multiprocessing multiprocessing Process sentinel}@anchor{12e6}
@deffn {속성} sentinel

프로세스가 끝나면 “준비(ready)” 될 시스템 객체의 숫자 핸들.

You can use this value if you want to wait on several events at
once using @ref{12e4,,multiprocessing.connection.wait()}.  Otherwise
calling @ref{1598,,join()} is simpler.

On Windows, this is an OS handle usable with the @code{WaitForSingleObject}
and @code{WaitForMultipleObjects} family of API calls.  On POSIX, this is
a file descriptor usable with primitives from the @ref{c6,,select} module.


Added in version 3.3.

@end deffn

@geindex interrupt() (multiprocessing.Process 메서드)
@anchor{library/multiprocessing multiprocessing Process interrupt}@anchor{251}
@deffn {메서드} interrupt ()

Terminate the process. Works on POSIX using the @ref{253,,SIGINT} signal.
Behavior on Windows is undefined.

By default, this terminates the child process by raising @ref{bc4,,KeyboardInterrupt}.
This behavior can be altered by setting the respective signal handler in the child
process @ref{1339,,signal.signal()} for @ref{253,,SIGINT}.

Note: if the child process catches and discards @ref{bc4,,KeyboardInterrupt}, the
process will not be terminated.

Note: the default behavior will also set @ref{368f,,exitcode} to @code{1} as if an
uncaught exception was raised in the child process. To have a different
@code{exitcode} you may simply catch @ref{bc4,,KeyboardInterrupt} and call
@code{exit(your_code)}.


Added in version 3.14.

@end deffn

@geindex terminate() (multiprocessing.Process 메서드)
@anchor{library/multiprocessing multiprocessing Process terminate}@anchor{185a}
@deffn {메서드} terminate ()

Terminate the process.  On POSIX this is done using the @ref{15e4,,SIGTERM} signal;
on Windows @code{TerminateProcess()} is used.  Note that exit handlers and
finally clauses, etc., will not be executed.

프로세스의 자손 프로세스들은 강제 종료되지 `않을' 것입니다 – 단순히 고아가 될 것입니다.

@cartouche
@quotation 경고 
연결된 프로세스가 파이프 또는 큐를 사용할 때 이 메서드를 사용하면, 파이프 또는 큐가 손상되어 다른 프로세스에서 사용할 수 없게 될 수 있습니다. 마찬가지로, 프로세스가 록이나 세마포어 등을 획득한 경우 강제 종료하면 다른 프로세스가 교착 상태가 될 수 있습니다.
@end quotation
@end cartouche
@end deffn

@geindex kill() (multiprocessing.Process 메서드)
@anchor{library/multiprocessing multiprocessing Process kill}@anchor{d4e}
@deffn {메서드} kill ()

Same as @ref{185a,,terminate()} but using the @code{SIGKILL} signal on POSIX.


Added in version 3.7.

@end deffn

@geindex close() (multiprocessing.Process 메서드)
@anchor{library/multiprocessing multiprocessing Process close}@anchor{d4d}
@deffn {메서드} close ()

@ref{252,,Process} 객체를 닫아, 그것과 관련된 모든 자원을 해제합니다. 하부 프로세스가 여전히 실행 중이면 @ref{2ec,,ValueError} 가 발생합니다. 일단 @ref{d4d,,close()} 가 성공적으로 반환되면, @code{Process} 객체의 다른 대부분의 메서드와 어트리뷰트는 @code{ValueError} 를 발생시킵니다.


Added in version 3.7.

@end deffn

@ref{1596,,start()}, @ref{1598,,join()}, @ref{1597,,is_alive()}, @ref{185a,,terminate()} 및 @ref{368f,,exitcode} 메서드는 프로세스 객체를 생성한 프로세스에 의해서만 호출되어야 합니다.

@ref{252,,Process} 의 몇몇 메서드를 사용하는 예제:

@example
>>> import multiprocessing, time, signal
>>> mp_context = multiprocessing.get_context('spawn')
>>> p = mp_context.Process(target=time.sleep, args=(1000,))
>>> print(p, p.is_alive())
<...Process ... initial> False
>>> p.start()
>>> print(p, p.is_alive())
<...Process ... started> True
>>> p.terminate()
>>> time.sleep(0.1)
>>> print(p, p.is_alive())
<...Process ... stopped exitcode=-SIGTERM> False
>>> p.exitcode == -signal.SIGTERM
True
@end example
@end deffn

@geindex ProcessError
@anchor{library/multiprocessing multiprocessing ProcessError}@anchor{3693}
@deffn {예외} multiprocessing.ProcessError

The base class of all @code{multiprocessing} exceptions.
@end deffn

@geindex BufferTooShort
@anchor{library/multiprocessing multiprocessing BufferTooShort}@anchor{3694}
@deffn {예외} multiprocessing.BufferTooShort

Exception raised by @code{Connection.recv_bytes_into()} when the supplied
buffer object is too small for the message read.

@code{e} 가 @ref{3694,,BufferTooShort} 의 인스턴스라면, @code{e.args[0]} 는 메시지를 바이트열로 줍니다.
@end deffn

@geindex AuthenticationError
@anchor{library/multiprocessing multiprocessing AuthenticationError}@anchor{3695}
@deffn {예외} multiprocessing.AuthenticationError

인증 에러가 일어날 때 발생합니다.
@end deffn

@geindex TimeoutError
@anchor{library/multiprocessing multiprocessing TimeoutError}@anchor{3696}
@deffn {예외} multiprocessing.TimeoutError

시간제한이 초과하였을 때 시간제한을 건 메서드에 의해 발생합니다.
@end deffn

@node 파이프와 큐,잡동사니<3>,Process와 예외,레퍼런스
@anchor{library/multiprocessing pipes-and-queues}@anchor{3697}
@subsubsection 파이프와 큐


여러 프로세스를 사용할 때, 일반적으로 프로세스 간 통신을 위해 메시지 전달을 사용하고 록과 같은 동기화 프리미티브 사용을 피합니다.

메시지를 전달하기 위해 @ref{367d,,Pipe()} (두 프로세스 간의 연결) 또는 큐(여러 생산자와 소비자를 허용합니다)를 사용할 수 있습니다.

@ref{1b87,,Queue}, @ref{b10,,SimpleQueue} 그리고 @ref{3698,,JoinableQueue} 형은, 표준 라이브러리의 @ref{1599,,queue.Queue} 클래스에 따라 모델링 된, 다중 생산자, 다중 소비자 @abbr{FIFO} 큐입니다. 이것들은 파이썬 2.5의 @code{queue.Queue} 클래스에서 도입된 @ref{3699,,task_done()}과 @ref{369a,,join()} 메서드가 @code{Queue} 에 없다는 점에서 다릅니다.

@ref{3698,,JoinableQueue}를 사용하면, 큐에서 제거된 작업마다 @ref{369b,,JoinableQueue.task_done()}을 호출해야 합니다. 그렇지 않으면 완료되지 않은 작업의 수를 세는 데 사용되는 세마포어가 결국 오버플로 되어 예외를 일으킵니다.

One difference from other Python queue implementations, is that @code{multiprocessing}
queues serializes all objects that are put into them using @ref{ab,,pickle}.
The object returned by the get method is a re-created object that does not share
memory with the original object.

관리자 객체를 사용하여 공유 큐를 생성할 수도 있습니다 – @ref{369c,,관리자}를 보세요.

@cartouche
@quotation 참고 
@code{multiprocessing} uses the usual @ref{369d,,queue.Empty} and
@ref{369e,,queue.Full} exceptions to signal a timeout.  They are not available in
the @code{multiprocessing} namespace so you need to import them from
@ref{bb,,queue}.
@end quotation
@end cartouche

@cartouche
@quotation 참고 
객체를 큐에 넣으면, 객체는 피클 되고 배경 스레드가 나중에 피클 된 데이터를 하부 파이프로 플러시 합니다. 이것은 다소 의외의 결과로 이어지지만, 실제적인 어려움을 일으키지는 않아야 합니다 – 이것이 여러분을 정말로 신경 쓰이게 한다면, 대신 @ref{369c,,관리자} 로 만든 큐를 사용할 수 있습니다.


@enumerate 

@item 
빈 큐에 객체를 넣은 후에, @ref{1969,,empty()} 메서드가 @ref{d2a,,False}를 반환하고 @ref{369f,,get_nowait()}가 @ref{369d,,queue.Empty} 를 일으키지 않고 반환할 수 있기 전까지 극히 작은 지연이 있을 수 있습니다.

@item 
여러 프로세스가 객체를 큐에 넣는 경우, 반대편에서 객체가 다른 순서로 수신될 수 있습니다. 그러나, 같은 프로세스에 의해 큐에 들어간 객체들은 항상 상대적인 순서가 유지됩니다.
@end enumerate
@end quotation
@end cartouche

@cartouche
@quotation 경고 
@ref{1b87,,Queue}를 사용하려고 하는 동안 @ref{185a,,Process.terminate()} 또는 @ref{156c,,os.kill()} 을 사용하여 프로세스를 죽이면, 큐의 데이터가 손상될 수 있습니다. 이로 인해 나중에 다른 프로세스가 큐를 사용하려고 할 때 예외가 발생할 수 있습니다.
@end quotation
@end cartouche

@cartouche
@quotation 경고 
위에서 언급했듯이, 자식 프로세스가 항목을 큐에 넣었을 때 (그리고 @ref{36a0,,JoinableQueue.cancel_join_thread} 를 사용하지 않았다면), 버퍼링 된 모든 항목이 파이프로 플러시 될 때까지 해당 프로세스가 종료되지 않습니다.

이것은, 여러분이 그 자식 프로세스를 조인하려고 하면, 큐에 넣은 모든 항목을 소진하지 않는 한 교착 상태가 발생할 수 있다는 뜻입니다. 마찬가지로, 그 자식 프로세스가 데몬이 아니면 부모 프로세스가 종료 시점에 데몬이 아닌 모든 자식을 조인하려고 할 때 정지될 수 있습니다.

관리자를 사용하여 생성된 큐에는 이 문제가 없습니다. @ref{3679,,프로그래밍 지침}을 참조하세요.
@end quotation
@end cartouche

프로세스 간 통신을 위해 큐를 사용하는 예는 @ref{36a1,,예제}을 참조하십시오.

@geindex Pipe() (multiprocessing 모듈)
@anchor{library/multiprocessing multiprocessing Pipe}@anchor{367d}
@deffn {함수} multiprocessing.Pipe (duplex=True)

파이프의 끝을 나타내는 @ref{12e5,,Connection} 객체 쌍 @code{(conn1, conn2)} 를 반환합니다.

`duplex' 가 @code{True} (기본값) 면 파이프는 양방향입니다. `duplex' 가 @code{False} 인 경우 파이프는 단방향입니다: @code{conn1} 은 메시지를 받는 데에만 사용할 수 있고, @code{conn2} 는 메시지를 보낼 때만 사용할 수 있습니다.

The @code{send()} method serializes the object using
@ref{ab,,pickle} and the @code{recv()} re-creates the object.
@end deffn

@geindex Queue (multiprocessing 클래스)
@anchor{library/multiprocessing multiprocessing Queue}@anchor{1b87}
@deffn {클래스} multiprocessing.Queue ([maxsize])

파이프와 몇 개의 록/세마포어를 사용하여 구현된 프로세스 공유 큐를 반환합니다. 프로세스가 처음으로 항목을 큐에 넣으면 버퍼에서 파이프로 객체를 전송하는 피더 스레드가 시작됩니다.

Instantiating this class may set the global start method. See
@ref{3689,,Global start method} for more details.

제한 시간 초과를 알리기 위해 표준 라이브러리의 @ref{bb,,queue} 모듈에서 정의되는 @ref{369d,,queue.Empty} 와 @ref{369e,,queue.Full} 예외를 일으킵니다.

@ref{1b87,,Queue} 는 @ref{3699,,task_done()}과 @ref{369a,,join()} 을 제외한 @ref{1599,,queue.Queue} 의 모든 메서드를 구현합니다.

@geindex qsize() (multiprocessing.Queue 메서드)
@anchor{library/multiprocessing multiprocessing Queue qsize}@anchor{36a2}
@deffn {메서드} qsize ()

큐의 대략의 크기를 돌려줍니다. 다중 스레딩/다중 프로세싱 특성을 타기 때문에 이 숫자는 신뢰할 수 없습니다.

Note that this may raise @ref{36b,,NotImplementedError} on platforms like
macOS where @code{sem_getvalue()} is not implemented.
@end deffn

@geindex empty() (multiprocessing.Queue 메서드)
@anchor{library/multiprocessing multiprocessing Queue empty}@anchor{1969}
@deffn {메서드} empty ()

큐가 비어 있다면 @code{True} 를, 그렇지 않으면 @code{False} 를 반환합니다. 다중 스레딩/다중 프로세싱 특성을 타기 때문에 신뢰할 수 없습니다.

May raise an @ref{2c0,,OSError} on closed queues. (not guaranteed)
@end deffn

@geindex full() (multiprocessing.Queue 메서드)
@anchor{library/multiprocessing multiprocessing Queue full}@anchor{36a3}
@deffn {메서드} full ()

큐가 가득 차면 @code{True} 를, 그렇지 않으면 @code{False} 를 반환합니다. 다중 스레딩/다중 프로세싱 특성을 타기 때문에 신뢰할 수 없습니다.
@end deffn

@geindex put() (multiprocessing.Queue 메서드)
@anchor{library/multiprocessing multiprocessing Queue put}@anchor{1e19}
@deffn {메서드} put (obj[, block[, timeout]])

obj를 큐에 넣습니다. 선택적 인자 `block' 이 @code{True} (기본값)이고 `timeout' 이 @code{None} (기본값) 이면, 빈 슬롯이 생길 때까지 필요한 경우 블록합니다. `timeout' 이 양수인 경우, 최대 `timeout' 초만큼 블록하고 그 시간 내에 사용 가능 슬롯이 생기지 않으면 @ref{369e,,queue.Full} 예외를 발생시킵니다. 그렇지 않으면 (`block' 이 @code{False}) 빈 슬롯을 즉시 사용할 수 있으면 큐에 항목을 넣고, 그렇지 않으면 @code{queue.Full} 예외를 발생시킵니다 (이 경우 `timeout' 은 무시됩니다).


버전 3.8에서 변경: 큐가 닫혔으면, @ref{8b7,,AssertionError} 대신 @ref{2ec,,ValueError}가 발생합니다.

@end deffn

@geindex put_nowait() (multiprocessing.Queue 메서드)
@anchor{library/multiprocessing multiprocessing Queue put_nowait}@anchor{36a4}
@deffn {메서드} put_nowait (obj)

@code{put(obj, False)} 와 같습니다.
@end deffn

@geindex get() (multiprocessing.Queue 메서드)
@anchor{library/multiprocessing multiprocessing Queue get}@anchor{1e1a}
@deffn {메서드} get ([block[, timeout]])

큐에서 항목을 제거하고 반환합니다. 선택적 인자 `block' 이 @code{True} (기본값)이고 `timeout' 이 @code{None} (기본값) 이면, 항목이 들어올 때까지 필요한 경우 블록합니다. `timeout' 이 양수인 경우, 최대 `timeout' 초만큼 블록하고 그 시간 내에 항목이 들어오지 않으면 @ref{369d,,queue.Empty} 예외를 발생시킵니다. 그렇지 않으면 (block이 @code{False}) 즉시 사용할 수 있는 항목이 있으면 반환하고, 그렇지 않으면 @code{queue.Empty} 예외를 발생시킵니다 (이 경우 `timeout' 은 무시됩니다).


버전 3.8에서 변경: 큐가 닫혔으면, @ref{2c0,,OSError} 대신 @ref{2ec,,ValueError}가 발생합니다.

@end deffn

@geindex get_nowait() (multiprocessing.Queue 메서드)
@anchor{library/multiprocessing multiprocessing Queue get_nowait}@anchor{369f}
@deffn {메서드} get_nowait ()

@code{get(False)} 와 같습니다.
@end deffn

@ref{1b87,,multiprocessing.Queue} 에는 @ref{1599,,queue.Queue} 에서 찾을 수 없는 몇 가지 추가 메서드가 있습니다. 일반적으로 이러한 메서드는 대부분 코드에서 필요하지 않습니다:

@geindex close() (multiprocessing.Queue 메서드)
@anchor{library/multiprocessing multiprocessing Queue close}@anchor{1b88}
@deffn {메서드} close ()

큐를 닫습니다: 내부 자원을 해제합니다.

A queue must not be used anymore after it is closed. For example,
@ref{1e1a,,get()}, @ref{1e19,,put()} and @ref{1969,,empty()}
methods must no longer be called.

The background thread will quit once it has flushed all buffered
data to the pipe.  This is called automatically when the queue is garbage
collected.
@end deffn

@geindex join_thread() (multiprocessing.Queue 메서드)
@anchor{library/multiprocessing multiprocessing Queue join_thread}@anchor{36a5}
@deffn {메서드} join_thread ()

배경 스레드에 조인합니다. @ref{1b88,,close()} 가 호출된 후에만 사용할 수 있습니다. 배경 스레드가 종료될 때까지 블록해서 버퍼의 모든 데이터가 파이프로 플러시 되었음을 보증합니다.

기본적으로 프로세스가 큐를 만든 주체가 아니면 종료할 때 큐의 배경 스레드를 조인하려고 합니다. 프로세스는 @ref{36a0,,cancel_join_thread()}를 호출하여 @ref{36a5,,join_thread()} 가 아무것도 하지 않게 할 수 있습니다.
@end deffn

@geindex cancel_join_thread() (multiprocessing.Queue 메서드)
@anchor{library/multiprocessing multiprocessing Queue cancel_join_thread}@anchor{36a0}
@deffn {메서드} cancel_join_thread ()

@ref{36a5,,join_thread()} 의 블록을 방지합니다. 특히, 프로세스가 종료할 때 배경 스레드를 자동으로 조인하는 것을 막습니다 – @code{join_thread()}를 보십시오.

A better name for this method might be
@code{allow_exit_without_flush()}.  It is likely to cause enqueued
data to be lost, and you almost certainly will not need to use it.
It is really only there if you need the current process to exit
immediately without waiting to flush enqueued data to the
underlying pipe, and you don’t care about lost data.
@end deffn

@cartouche
@quotation 참고 
이 클래스의 기능은 호스트 운영 체제의 작동하는 공유 세마포어 구현을 요구합니다. 그런 것이 없으면, 클래스의 기능이 비활성화되고, @ref{1b87,,Queue} 의 인스턴스를 만들려고 하면 @ref{659,,ImportError} 를 일으킵니다. 자세한 내용은 bpo-3770@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=3770}을 참조하십시오. 아래에 나열된 특수 큐 형들도 마찬가지입니다.
@end quotation
@end cartouche
@end deffn

@geindex SimpleQueue (multiprocessing 클래스)
@anchor{library/multiprocessing multiprocessing SimpleQueue}@anchor{b10}
@deffn {클래스} multiprocessing.SimpleQueue

이것은 단순화된 @ref{1b87,,Queue} 형으로, 록이 걸린 @ref{367d,,Pipe} 에 매우 가깝습니다.

Instantiating this class may set the global start method. See
@ref{3689,,Global start method} for more details.

@geindex close() (multiprocessing.SimpleQueue 메서드)
@anchor{library/multiprocessing multiprocessing SimpleQueue close}@anchor{b11}
@deffn {메서드} close ()

큐를 닫습니다: 내부 자원을 해제합니다.

큐를 닫은 후에는 더는 사용해서는 안 됩니다. 예를 들어, @ref{36a6,,get()}, @ref{36a7,,put()} 및 @ref{196a,,empty()} 메서드가 더는 호출되지 않아야 합니다.


Added in version 3.9.

@end deffn

@geindex empty() (multiprocessing.SimpleQueue 메서드)
@anchor{library/multiprocessing multiprocessing SimpleQueue empty}@anchor{196a}
@deffn {메서드} empty ()

큐가 비어 있다면 @code{True} 를, 그렇지 않으면 @code{False} 를 반환합니다.

Always raises an @ref{2c0,,OSError} if the SimpleQueue is closed.
@end deffn

@geindex get() (multiprocessing.SimpleQueue 메서드)
@anchor{library/multiprocessing multiprocessing SimpleQueue get}@anchor{36a6}
@deffn {메서드} get ()

큐에서 항목을 제거하고 반환합니다.
@end deffn

@geindex put() (multiprocessing.SimpleQueue 메서드)
@anchor{library/multiprocessing multiprocessing SimpleQueue put}@anchor{36a7}
@deffn {메서드} put (item)

`item' 을 큐에 넣습니다.
@end deffn
@end deffn

@geindex JoinableQueue (multiprocessing 클래스)
@anchor{library/multiprocessing multiprocessing JoinableQueue}@anchor{3698}
@deffn {클래스} multiprocessing.JoinableQueue ([maxsize])

@ref{1b87,,Queue} 서브 클래스 @ref{3698,,JoinableQueue} 는 추가로 @ref{369b,,task_done()}과 @ref{36a8,,join()} 메서드를 가진 큐입니다.

Instantiating this class may set the global start method. See
@ref{3689,,Global start method} for more details.

@geindex task_done() (multiprocessing.JoinableQueue 메서드)
@anchor{library/multiprocessing multiprocessing JoinableQueue task_done}@anchor{369b}
@deffn {메서드} task_done ()

앞서 큐에 넣은 작업이 완료되었음을 나타냅니다. 큐 소비자가 사용합니다. 작업을 가져오는데 사용된 각 @ref{1e1a,,get()} 마다, 뒤따르는 @ref{369b,,task_done()} 호출은 작업에 대한 처리가 완료되었음을 큐에 알립니다.

만약 @ref{369a,,join()} 이 현재 블록하고 있다면, 모든 항목이 처리될 때 재개될 것입니다 (@ref{1e19,,put()} 으로 큐에 넣은 모든 항목에 대해 @ref{369b,,task_done()} 호출을 수신했다는 뜻입니다).

큐에 있는 항목보다 많이 호출되면 @ref{2ec,,ValueError} 를 발생시킵니다.
@end deffn

@geindex join() (multiprocessing.JoinableQueue 메서드)
@anchor{library/multiprocessing multiprocessing JoinableQueue join}@anchor{36a8}
@deffn {메서드} join ()

큐의 모든 항목을 가져가서 처리할 때까지 블록합니다.

항목이 큐에 추가될 때마다 완료되지 않은 작업의 수는 올라갑니다. 소비자가 그 항목을 꺼냈고 그에 대한 모든 작업을 완료했음을 알리기 위해 @ref{369b,,task_done()}을 호출할 때마다 숫자는 줄어듭니다. 완료되지 않은 작업의 수가 0으로 떨어지면 @ref{369a,,join()} 이 블록으로부터 풀려납니다.
@end deffn
@end deffn

@node 잡동사니<3>,Connection 객체,파이프와 큐,레퍼런스
@anchor{library/multiprocessing miscellaneous}@anchor{36a9}
@subsubsection 잡동사니


@geindex active_children() (multiprocessing 모듈)
@anchor{library/multiprocessing multiprocessing active_children}@anchor{36aa}
@deffn {함수} multiprocessing.active_children ()

현재 프로세스의 모든 살아있는 자식 리스트를 반환합니다.

이것을 호출하면 이미 완료된 프로세스에 “조인” 하는 부작용이 있습니다.
@end deffn

@geindex cpu_count() (multiprocessing 모듈)
@anchor{library/multiprocessing multiprocessing cpu_count}@anchor{116e}
@deffn {함수} multiprocessing.cpu_count ()

시스템의 CPU 수를 반환합니다.

This number is not equivalent to the number of CPUs the current process can
use.  The number of usable CPUs can be obtained with
@ref{51d,,os.process_cpu_count()} (or @code{len(os.sched_getaffinity(0))}).

When the number of CPUs cannot be determined a @ref{36b,,NotImplementedError}
is raised.


@subsubheading 더 보기


@ref{4db,,os.cpu_count()}
@ref{51d,,os.process_cpu_count()}



버전 3.13에서 변경: The return value can also be overridden using the
@ref{16f,,-X cpu_count} flag or 
@geindex PYTHON_CPU_COUNT
@geindex 환경 변수; PYTHON_CPU_COUNT
@ref{51e,,PYTHON_CPU_COUNT} as this is
merely a wrapper around the @ref{a5,,os} cpu count APIs.

@end deffn

@geindex current_process() (multiprocessing 모듈)
@anchor{library/multiprocessing multiprocessing current_process}@anchor{36ab}
@deffn {함수} multiprocessing.current_process ()

현재 프로세스에 해당하는 @ref{252,,Process} 객체를 반환합니다.

@ref{35e,,threading.current_thread()}와 유사한 기능을 제공합니다.
@end deffn

@geindex parent_process() (multiprocessing 모듈)
@anchor{library/multiprocessing multiprocessing parent_process}@anchor{36ac}
@deffn {함수} multiprocessing.parent_process ()

@ref{36ab,,current_process()}의 부모 프로세스에 해당하는 @ref{252,,Process} 객체를 반환합니다. 메인 프로세스에서, @code{parent_process}는 @code{None}입니다.


Added in version 3.8.

@end deffn

@geindex freeze_support() (multiprocessing 모듈)
@anchor{library/multiprocessing multiprocessing freeze_support}@anchor{1768}
@deffn {함수} multiprocessing.freeze_support ()

Add support for when a program which uses @code{multiprocessing} has been
frozen to produce an executable.  (Has been tested with `py2exe',
`PyInstaller' and `cx_Freeze'.)

메인 모듈의 @code{if __name__ == '__main__'} 줄 바로 뒤에서 이 함수를 호출해야 합니다. 예를 들면:

@example
from multiprocessing import Process, freeze_support

def f():
    print('hello world!')

if __name__ == '__main__':
    freeze_support()
    Process(target=f).start()
@end example

@code{freeze_support()} 줄이 생략된 경우 고정된 실행 파일을 실행하려고 하면 @ref{244,,RuntimeError} 가 발생합니다.

Calling @code{freeze_support()} has no effect when the start method is not
`spawn'. In addition, if the module is being run normally by the Python
interpreter (the program has not been frozen), then @code{freeze_support()}
has no effect.
@end deffn

@geindex get_all_start_methods() (multiprocessing 모듈)
@anchor{library/multiprocessing multiprocessing get_all_start_methods}@anchor{1168}
@deffn {함수} multiprocessing.get_all_start_methods ()

Returns a list of the supported start methods, the first of which
is the default.  The possible start methods are @code{'fork'},
@code{'spawn'} and @code{'forkserver'}.  Not all platforms support all
methods.  See @ref{1d5,,컨텍스트 및 시작 방법}.


Added in version 3.4.

@end deffn

@geindex get_context() (multiprocessing 모듈)
@anchor{library/multiprocessing multiprocessing get_context}@anchor{24a}
@deffn {함수} multiprocessing.get_context (method=None)

Return a context object which has the same attributes as the
@code{multiprocessing} module.

If `method' is @code{None} then the default context is returned. Note that if
the global start method has not been set, this will set it to the system default
See @ref{3689,,Global start method} for more details.
Otherwise `method' should be @code{'fork'}, @code{'spawn'},
@code{'forkserver'}.  @ref{2ec,,ValueError} is raised if the specified
start method is not available.  See @ref{1d5,,컨텍스트 및 시작 방법}.


Added in version 3.4.

@end deffn

@geindex get_start_method() (multiprocessing 모듈)
@anchor{library/multiprocessing multiprocessing get_start_method}@anchor{1169}
@deffn {함수} multiprocessing.get_start_method (allow_none=False)

프로세스를 기동하기 위해서 사용되는 시작 방법의 이름을 돌려줍니다.

If the global start method is not set and `allow_none' is @code{False}, the global start
method is set to the default, and its name is returned. See
@ref{3689,,Global start method} for more details.

The return value can be @code{'fork'}, @code{'spawn'}, @code{'forkserver'}
or @code{None}.  See @ref{1d5,,컨텍스트 및 시작 방법}.


Added in version 3.4.



버전 3.8에서 변경: macOS에서, `spawn' 시작 방법이 이제 기본값입니다. `fork' 시작 방법은 서브 프로세스의 충돌로 이어질 수 있기 때문에, 안전하지 않은 것으로 간주해야 합니다. bpo-33725@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33725}를 참조하십시오.

@end deffn

@geindex set_executable() (multiprocessing 모듈)
@anchor{library/multiprocessing multiprocessing set_executable}@anchor{1b8e}
@deffn {함수} multiprocessing.set_executable (executable)

Set the path of the Python interpreter to use when starting a child process.
(By default @ref{3ed,,sys.executable} is used).  Embedders will probably need to
do something like

@example
set_executable(os.path.join(sys.exec_prefix, 'pythonw.exe'))
@end example

자식 프로세스를 만들기 전에 해야 합니다.


버전 3.4에서 변경: Now supported on POSIX when the @code{'spawn'} start method is used.



버전 3.11에서 변경: Accepts a @ref{5a0,,path-like object}.

@end deffn

@geindex set_forkserver_preload() (multiprocessing 모듈)
@anchor{library/multiprocessing multiprocessing set_forkserver_preload}@anchor{1909}
@deffn {함수} multiprocessing.set_forkserver_preload (module_names)

Set a list of module names for the forkserver main process to attempt to
import so that their already imported state is inherited by forked
processes. Any @ref{659,,ImportError} when doing so is silently ignored.
This can be used as a performance enhancement to avoid repeated work
in every process.

For this to work, it must be called before the forkserver process has been
launched (before creating a @code{Pool} or starting a @ref{252,,Process}).

Only meaningful when using the @code{'forkserver'} start method.
See @ref{1d5,,컨텍스트 및 시작 방법}.


Added in version 3.4.

@end deffn

@geindex set_start_method() (multiprocessing 모듈)
@anchor{library/multiprocessing multiprocessing set_start_method}@anchor{24b}
@deffn {함수} multiprocessing.set_start_method (method, force=False)

Set the method which should be used to start child processes.
The `method' argument can be @code{'fork'}, @code{'spawn'} or @code{'forkserver'}.
Raises @ref{244,,RuntimeError} if the start method has already been set and `force'
is not @code{True}.  If `method' is @code{None} and `force' is @code{True} then the start
method is set to @code{None}.  If `method' is @code{None} and `force' is @code{False}
then the context is set to the default context.

이것은 한 번만 호출해야 하며, 메인 모듈의 @code{if __name__ == '__main__'} 절 내에서 보호되어야 합니다.

See @ref{1d5,,컨텍스트 및 시작 방법}.


Added in version 3.4.

@end deffn

@cartouche
@quotation 참고 
@code{multiprocessing} contains no analogues of
@ref{35f,,threading.active_count()}, @ref{1c58,,threading.enumerate()},
@ref{a48,,threading.settrace()}, @ref{a49,,threading.setprofile()},
@ref{135e,,threading.Timer}, or @ref{1862,,threading.local}.
@end quotation
@end cartouche

@node Connection 객체,동기화 프리미티브,잡동사니<3>,레퍼런스
@anchor{library/multiprocessing connection-objects}@anchor{36ad}
@subsubsection Connection 객체


연결 객체를 사용하면 피클 가능한 객체나 문자열을 보내고 받을 수 있습니다. 메시지 지향 연결된 소켓으로 생각할 수 있습니다.

연결 객체는 보통 @ref{367d,,Pipe} 를 사용해서 만들어집니다 – @ref{36ae,,리스너와 클라이언트} 도 참고하세요.

@geindex Connection (multiprocessing.connection 클래스)
@anchor{library/multiprocessing multiprocessing connection Connection}@anchor{12e5}
@deffn {클래스} multiprocessing.connection.Connection

@geindex send() (multiprocessing.connection.Connection 메서드)
@anchor{library/multiprocessing multiprocessing connection Connection send}@anchor{36af}
@deffn {메서드} send (obj)

연결의 반대편 끝에서 @ref{36b0,,recv()}를 사용하여 읽을 객체를 보냅니다.

객체는 피클 가능해야 합니다. 매우 큰 피클(약 32 MiB+, OS에 따라 다릅니다)은 @ref{2ec,,ValueError} 예외를 발생시킬 수 있습니다.
@end deffn

@geindex recv() (multiprocessing.connection.Connection 메서드)
@anchor{library/multiprocessing multiprocessing connection Connection recv}@anchor{36b0}
@deffn {메서드} recv ()

연결의 반대편 끝에서 @ref{36af,,send()}로 보낸 객체를 반환합니다. 뭔가 수신할 때까지 블록합니다. 수신할 내용이 없고 반대편 끝이 닫혔으면 @ref{14de,,EOFError}를 발생시킵니다.
@end deffn

@geindex fileno() (multiprocessing.connection.Connection 메서드)
@anchor{library/multiprocessing multiprocessing connection Connection fileno}@anchor{36b1}
@deffn {메서드} fileno ()

연결이 사용하는 파일 기술자나 핸들을 돌려줍니다.
@end deffn

@geindex close() (multiprocessing.connection.Connection 메서드)
@anchor{library/multiprocessing multiprocessing connection Connection close}@anchor{36b2}
@deffn {메서드} close ()

연결을 닫습니다.

연결이 가비지 수집될 때 자동으로 호출됩니다.
@end deffn

@geindex poll() (multiprocessing.connection.Connection 메서드)
@anchor{library/multiprocessing multiprocessing connection Connection poll}@anchor{36b3}
@deffn {메서드} poll ([timeout])

읽어 들일 데이터가 있는지를 돌려줍니다.

`timeout' 을 지정하지 않으면 즉시 반환됩니다. `timeout' 이 숫자면 블록할 최대 시간(초)을 지정합니다. `timeout' 이 @code{None} 이면 시간제한이 없습니다.

여러 개의 연결 객체를 @ref{12e4,,multiprocessing.connection.wait()} 을 사용하여 한 번에 폴링 할 수 있습니다.
@end deffn

@geindex send_bytes() (multiprocessing.connection.Connection 메서드)
@anchor{library/multiprocessing multiprocessing connection Connection send_bytes}@anchor{36b4}
@deffn {메서드} send_bytes (buffer[, offset[, size]])

@ref{193,,바이트열류 객체} 의 바이트 데이터를 하나의 완전한 메시지로 보냅니다.

`offset' 이 주어지면 `buffer' 의 해당 위치부터 데이터를 읽습니다. `size' 가 주어지면 그만큼의 바이트를 버퍼에서 읽습니다. 매우 큰 버퍼(약 32 MiB+, OS에 따라 다릅니다)는 @ref{2ec,,ValueError} 예외를 발생시킬 수 있습니다
@end deffn

@geindex recv_bytes() (multiprocessing.connection.Connection 메서드)
@anchor{library/multiprocessing multiprocessing connection Connection recv_bytes}@anchor{36b5}
@deffn {메서드} recv_bytes ([maxlength])

접속의 반대편 끝에서 송신된 바이트 데이터의 완전한 메시지를 문자열로 돌려줍니다. 뭔가 수신할 때까지 블록합니다. 수신할 내용이 없고 반대편 끝이 닫혔으면 @ref{14de,,EOFError}를 발생시킵니다.

`maxlength' 가 지정되고 메시지가 `maxlength' 보다 길면 @ref{2c0,,OSError} 가 발생하고 연결은 더는 읽을 수 없게 됩니다.


버전 3.3에서 변경: 이 함수는 @ref{1252,,IOError} 를 발생시켜왔는데, 이제는 @ref{2c0,,OSError} 의 별칭입니다.

@end deffn

@geindex recv_bytes_into() (multiprocessing.connection.Connection 메서드)
@anchor{library/multiprocessing multiprocessing connection Connection recv_bytes_into}@anchor{36b6}
@deffn {메서드} recv_bytes_into (buffer[, offset])

연결의 반대편 끝에서 보낸 바이트 데이터의 전체 메시지를 `buffer' 로 읽어 들이고, 메시지의 바이트 수를 반환합니다. 뭔가 수신할 때까지 블록합니다. 수신할 내용이 없고 반대편 끝이 닫혔으면 @ref{14de,,EOFError}를 발생시킵니다.

`buffer' 는 쓰기 가능한 @ref{193,,바이트열류 객체} 여야 합니다. `offset' 이 지정되면, 버퍼의 그 위치로부터 메시지를 씁니다. offset은 `buffer' 길이보다 작은 음수가 아닌 정수여야 합니다 (바이트 단위).

버퍼가 너무 작으면 @code{BufferTooShort} 예외가 발생하고, 완전한 메시지는 @code{e.args[0]} 으로 제공되는데, 여기서 @code{e} 는 예외 인스턴스입니다.
@end deffn


버전 3.3에서 변경: 이제 연결 객체 자체를 @ref{36af,,Connection.send()} 와 @ref{36b0,,Connection.recv()} 를 사용하여 프로세스 간에 전송할 수 있습니다.

Connection objects also now support the context management protocol – see
@ref{240c,,컨텍스트 관리자 형}.  @ref{26ae,,__enter__()} returns the
connection object, and @ref{26af,,__exit__()} calls @ref{36b2,,close()}.

@end deffn

예를 들어:

@example
>>> from multiprocessing import Pipe
>>> a, b = Pipe()
>>> a.send([1, 'hello', None])
>>> b.recv()
[1, 'hello', None]
>>> b.send_bytes(b'thank you')
>>> a.recv_bytes()
b'thank you'
>>> import array
>>> arr1 = array.array('i', range(5))
>>> arr2 = array.array('i', [0] * 10)
>>> a.send_bytes(arr1)
>>> count = b.recv_bytes_into(arr2)
>>> assert count == len(arr1) * arr1.itemsize
>>> arr2
array('i', [0, 1, 2, 3, 4, 0, 0, 0, 0, 0])
@end example
@anchor{library/multiprocessing multiprocessing-recv-pickle-security}@anchor{36b7}
@cartouche
@quotation 경고 
@ref{36b0,,Connection.recv()} 메서드는 수신한 데이터를 자동으로 언 피클 합니다. 메시지를 보낸 프로세스를 신뢰할 수 없다면 보안상 위험 할 수 있습니다.

따라서, 연결 객체가 @code{Pipe()}를 사용하여 생성되지 않았다면, 일종의 인증을 수행한 후에만 @ref{36b0,,recv()} 및 @ref{36af,,send()} 메서드를 사용해야 합니다. @ref{3692,,인증 키}를 참조하세요.
@end quotation
@end cartouche

@cartouche
@quotation 경고 
프로세스가 파이프에 읽거나 쓰려고 할 때 죽으면, 파이프의 데이터가 손상될 가능성이 있습니다. 메시지 경계가 어디에 있는지 확신할 수 없는 상태가 될 가능성이 있기 때문입니다.
@end quotation
@end cartouche

@node 동기화 프리미티브,공유 ctypes 객체,Connection 객체,레퍼런스
@anchor{library/multiprocessing synchronization-primitives}@anchor{36b8}
@subsubsection 동기화 프리미티브


일반적으로 다중 프로세스 프로그램에서는 동기화 프리미티브가 다중 스레드 프로그램에서만큼 필요하지는 않습니다. @ref{f3,,threading} 모듈에 대한 설명서를 참조하십시오.

관리자 객체를 사용하여 동기화 프리미티브를 생성할 수도 있습니다 – @ref{369c,,관리자}를 참조하세요.

@geindex Barrier (multiprocessing 클래스)
@anchor{library/multiprocessing multiprocessing Barrier}@anchor{3686}
@deffn {클래스} multiprocessing.Barrier (parties[, action[, timeout]])

배리어(barrier) 객체: @ref{13e8,,threading.Barrier} 의 복제본.

Instantiating this class may set the global start method. See
@ref{3689,,Global start method} for more details.


Added in version 3.3.

@end deffn

@geindex BoundedSemaphore (multiprocessing 클래스)
@anchor{library/multiprocessing multiprocessing BoundedSemaphore}@anchor{3684}
@deffn {클래스} multiprocessing.BoundedSemaphore ([value])

제한된 세마포어 객체: @ref{135c,,threading.BoundedSemaphore} 과 유사한 대응 물.

Instantiating this class may set the global start method. See
@ref{3689,,Global start method} for more details.

대응 물과 한 가지 차이가 있습니다: @code{acquire} 메서드의 첫 번째 인자에 `block' 이라는 이름을 사용해서 @ref{36b9,,Lock.acquire()} 와의 일관성을 유지합니다.

@geindex locked() (multiprocessing.BoundedSemaphore 메서드)
@anchor{library/multiprocessing multiprocessing BoundedSemaphore locked}@anchor{36ba}
@deffn {메서드} locked ()

Return a boolean indicating whether this object is locked right now.


Added in version 3.14.

@end deffn

@cartouche
@quotation 참고 
On macOS, this is indistinguishable from @ref{3683,,Semaphore} because
@code{sem_getvalue()} is not implemented on that platform.
@end quotation
@end cartouche
@end deffn

@geindex Condition (multiprocessing 클래스)
@anchor{library/multiprocessing multiprocessing Condition}@anchor{3685}
@deffn {클래스} multiprocessing.Condition ([lock])

조건 변수: @ref{135a,,threading.Condition} 의 별칭.

If `lock' is specified then it should be a @ref{1856,,Lock} or @ref{1857,,RLock}
object from @code{multiprocessing}.

Instantiating this class may set the global start method. See
@ref{3689,,Global start method} for more details.


버전 3.3에서 변경: @ref{365e,,wait_for()} 메서드가 추가되었습니다.

@end deffn

@geindex Event (multiprocessing 클래스)
@anchor{library/multiprocessing multiprocessing Event}@anchor{1c04}
@deffn {클래스} multiprocessing.Event

@ref{135d,,threading.Event} 의 복제본.

Instantiating this class may set the global start method. See
@ref{3689,,Global start method} for more details.
@end deffn

@geindex Lock (multiprocessing 클래스)
@anchor{library/multiprocessing multiprocessing Lock}@anchor{1856}
@deffn {클래스} multiprocessing.Lock

비 재귀적 록 객체: @ref{19f4,,threading.Lock} 과 유사한 대응 물. 일단 프로세스 또는 스레드가 록을 획득하면, 프로세스 또는 스레드에서 록을 획득하려는 후속 시도는 록이 해제될 때까지 블록 됩니다; 모든 프로세스 또는 스레드가 이를 해제할 수 있습니다. 스레드에 적용되는 @code{threading.Lock} 의 개념과 동작은, 명시된 경우를 제외하고, @ref{1856,,multiprocessing.Lock} 를 통해 프로세스나 스레드에 그대로 적용됩니다.

@ref{1856,,Lock} 은 실제로 기본 컨텍스트로 초기화된 @code{multiprocessing.synchronize.Lock} 의 인스턴스를 반환하는 팩토리 함수입니다.

Instantiating this class may set the global start method. See
@ref{3689,,Global start method} for more details.

@ref{1856,,Lock} 은 @ref{1e1,,컨텍스트 관리자} 프로토콜을 지원하므로 @ref{186,,with} 문에서 사용될 수 있습니다.

@geindex acquire() (multiprocessing.Lock 메서드)
@anchor{library/multiprocessing multiprocessing Lock acquire}@anchor{36b9}
@deffn {메서드} acquire (block=True, timeout=None)

블록하거나 블록하지 않는 방식으로 록을 획득합니다.

`block' 인자가 @code{True} (기본값) 로 설정되면, 메서드 호출은 록이 해제 상태가 될 때까지 블록 한 다음, 잠금 상태로 만들고 @code{True} 를 반환합니다. 이 첫 번째 인자의 이름은 @ref{8a6,,threading.Lock.acquire()} 와 다르다는 것에 유의하세요.

`block' 인자가 @code{False} 로 설정되면, 메서드 호출은 블록 되지 않습니다. 록이 현재 잠금 상태면 @code{False} 를 반환합니다. 그렇지 않으면 록을 잠금 상태로 설정하고 @code{True} 를 반환합니다.

`timeout' 에 대해 양의 부동 소수점 값을 사용하여 호출하는 경우, 록을 얻을 수 없는 한 최대 `timeout' 으로 지정된 시간(초) 동안 블록합니다. `timeout' 을 음수 값으로 호출하는 것은 `timeout' 에 0을 주는 것과 같습니다. `timeout' 값이 @code{None} (기본값) 인 호출은 제한 시간을 무한대로 설정합니다. `timeout' 에 대한 음수와 @code{None} 값의 처리는 @ref{8a6,,threading.Lock.acquire()} 에서 구현된 동작과 다르다는 것에 주의하십시오. `timeout' 인자는 `block' 인자가 @code{False} 로 설정되면 실제적인 의미는 없고 무시됩니다. 록이 획득되면 @code{True} 를 돌려주고, 제한 시간 초과가 발생하면 @code{False} 를 돌려줍니다.
@end deffn

@geindex release() (multiprocessing.Lock 메서드)
@anchor{library/multiprocessing multiprocessing Lock release}@anchor{36bb}
@deffn {메서드} release ()

록을 해제합니다. 이것은 원래 록을 획득한 프로세스나 스레드뿐만 아니라 모든 프로세스나 스레드에서 호출 할 수 있습니다.

동작은 @ref{14c7,,threading.Lock.release()} 와 같지만, 해제된 록에서 호출될 때 @ref{2ec,,ValueError} 가 발생한다는 점만 다릅니다.
@end deffn

@geindex locked() (multiprocessing.Lock 메서드)
@anchor{library/multiprocessing multiprocessing Lock locked}@anchor{187a}
@deffn {메서드} locked ()

Return a boolean indicating whether this object is locked right now.


Added in version 3.14.

@end deffn
@end deffn

@geindex RLock (multiprocessing 클래스)
@anchor{library/multiprocessing multiprocessing RLock}@anchor{1857}
@deffn {클래스} multiprocessing.RLock

재귀적 록 객체: @ref{32e,,threading.RLock} 과 유사한 대응 물. 재귀적 록은 획득한 프로세스 또는 스레드에 의해 해제되어야 합니다. 일단 프로세스나 스레드가 재귀적 록을 획득하면, 같은 프로세스나 스레드가 블록 없이 다시 획득할 수 있습니다; 해당 프로세스나 스레드는 획득할 때마다 한 번 해제해야 합니다.

@ref{1857,,RLock} 은 실제로 기본 컨텍스트로 초기화된 @code{multiprocessing.synchronize.RLock} 의 인스턴스를 반환하는 팩토리 함수입니다.

Instantiating this class may set the global start method. See
@ref{3689,,Global start method} for more details.

@ref{1857,,RLock} 은 @ref{1e1,,컨텍스트 관리자} 프로토콜을 지원하므로 @ref{186,,with} 문에서 사용될 수 있습니다.

@geindex acquire() (multiprocessing.RLock 메서드)
@anchor{library/multiprocessing multiprocessing RLock acquire}@anchor{36bc}
@deffn {메서드} acquire (block=True, timeout=None)

블록하거나 블록하지 않는 방식으로 록을 획득합니다.

`block' 인자를 @code{True} 로 설정해서 호출하면, 록이 현재 프로세스나 스레드가 이미 획득한 상태가 아니면 록이 (어떤 프로세스나 스레드도 획득하지 않은) 록 해제 상태가 될 때까지 블록합니다. 이후에 현재 프로세스나 스레드가 (소유권이 아직 없는 경우) 록 소유권을 얻게 되며 록 내 재귀 수준이 1 증가하고 @code{True} 를 반환합니다. 이 첫 번째 인자의 동작에는, 인자의 이름부터 시작해서 @ref{107a,,threading.RLock.acquire()} 구현과 비교되는 몇 가지 차이점이 있습니다.

`block' 인자를 @code{False} 로 설정해서 호출하면 블록하지 않습니다. 록이 이미 다른 프로세스나 스레드에 의해 획득되었으면 (그래서 소유하고 있으면), 현재 프로세스나 스레드는 소유권을 갖지 않으며 록 내 재귀 수준은 변경되지 않고 @code{False} 를 반환합니다. 록이 해제 상태에 있으면, 현재 프로세스 또는 스레드가 소유권을 가져오며 재귀 수준이 증가하고 @code{True} 를 반환합니다.

`timeout' 인자의 사용법과 동작은 @ref{36b9,,Lock.acquire()} 와 같습니다. `timeout' 의 이러한 동작 중 일부는 @ref{107a,,threading.RLock.acquire()} 에서 구현된 동작과 다르다는 것에 주의하십시오.
@end deffn

@geindex release() (multiprocessing.RLock 메서드)
@anchor{library/multiprocessing multiprocessing RLock release}@anchor{36bd}
@deffn {메서드} release ()

재귀 수준을 감소시키면서 록을 해제합니다. 감소 후에 재귀 수준이 0이면, 록을 해제 상태(어떤 프로세스나 스레드에도 소유되지 않음)로 재설정하고, 다른 프로세스나 스레드가 록이 해제될 때까지 기다리며 블록하고 있는 경우 해당 프로세스나 스레드 중 정확히 하나가 계속 진행하도록 허용합니다. 감소 후에 재귀 수준이 여전히 0이 아닌 경우, 록은 획득된 상태로 남고 호출한 프로세스나 스레드에 의해 소유됩니다.

호출한 프로세스나 스레드가 록을 소유하고 있을 때만 이 메서드를 호출하십시오. 이 메서드가 소유자가 아닌 프로세스나 스레드에 의해 호출되거나, 록이 해제 (소유되지 않은) 상태면 @ref{8b7,,AssertionError} 가 발생합니다. 이 상황에서 발생하는 예외 형은 @ref{3659,,threading.RLock.release()} 에서 구현된 동작과 다릅니다.
@end deffn

@geindex locked() (multiprocessing.RLock 메서드)
@anchor{library/multiprocessing multiprocessing RLock locked}@anchor{187b}
@deffn {메서드} locked ()

Return a boolean indicating whether this object is locked right now.


Added in version 3.14.

@end deffn
@end deffn

@geindex Semaphore (multiprocessing 클래스)
@anchor{library/multiprocessing multiprocessing Semaphore}@anchor{3683}
@deffn {클래스} multiprocessing.Semaphore ([value])

세마포어 객체: @ref{135b,,threading.Semaphore} 와 유사한 대응 물.

Instantiating this class may set the global start method. See
@ref{3689,,Global start method} for more details.

대응 물과 한 가지 차이가 있습니다: @code{acquire} 메서드의 첫 번째 인자에 `block' 이라는 이름을 사용해서 @ref{36b9,,Lock.acquire()} 와의 일관성을 유지합니다.

@geindex get_value() (multiprocessing.Semaphore 메서드)
@anchor{library/multiprocessing multiprocessing Semaphore get_value}@anchor{36be}
@deffn {메서드} get_value ()

Return the current value of semaphore.

Note that this may raise @ref{36b,,NotImplementedError} on platforms like
macOS where @code{sem_getvalue()} is not implemented.
@end deffn

@geindex locked() (multiprocessing.Semaphore 메서드)
@anchor{library/multiprocessing multiprocessing Semaphore locked}@anchor{36bf}
@deffn {메서드} locked ()

Return a boolean indicating whether this object is locked right now.


Added in version 3.14.

@end deffn
@end deffn

@cartouche
@quotation 참고 
On macOS, @code{sem_timedwait} is unsupported, so calling @code{acquire()} with
a timeout will emulate that function’s behavior using a sleeping loop.
@end quotation
@end cartouche

@cartouche
@quotation 참고 
이 패키지의 기능 중 일부는 호스트 운영 체제의 작동하는 공유 세마포어 구현을 요구합니다. 그런 것이 없으면, @code{multiprocessing.synchronize} 모듈이 비활성화되고, 임포트하려고 하면 @ref{659,,ImportError} 를 일으킵니다. 자세한 내용은 bpo-3770@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=3770}을 참조하십시오.
@end quotation
@end cartouche

@node 공유 ctypes 객체,관리자,동기화 프리미티브,레퍼런스
@anchor{library/multiprocessing shared-ctypes-objects}@anchor{36c0}
@subsubsection 공유 @code{ctypes} 객체


자식 프로세스가 상속할 수 있는 공유 메모리를 사용하여 공유 객체를 만들 수 있습니다.

@geindex Value() (multiprocessing 모듈)
@anchor{library/multiprocessing multiprocessing Value}@anchor{3680}
@deffn {함수} multiprocessing.Value (typecode_or_type, *args, lock=True)

공유 메모리에 할당된 @ref{2e,,ctypes} 객체를 반환합니다. 기본적으로 반환 값은, 사실 객체에 대한 동기화 된 래퍼입니다. 객체 자체는 @ref{3680,,Value} 의 `value' 어트리뷰트를 통해 접근 할 수 있습니다.

`typecode_or_type' 은 반환된 객체의 형을 결정합니다: ctypes 형이거나 @ref{8,,array} 모듈에 의해 사용되는 종류의 한 문자 typecode입니다. `*args' 는 형의 생성자로 전달됩니다.

`lock' 이 @code{True} (기본값) 면 값에 대한 액세스를 동기화하기 위해 새 재귀적 록 객체가 생성됩니다. `lock' 이 @ref{1856,,Lock} 또는 @ref{1857,,RLock} 객체인 경우, 이 값이 값에 대한 액세스를 동기화하는 데 사용됩니다. `lock' 이 @code{False} 면, 반환된 객체에 대한 액세스는 록에 의해 자동으로 보호되지 않으므로 “프로세스 안전” 하지 않습니다.

읽기와 쓰기를 포함하는 @code{+=} 와 같은 연산은 원자 적(atomic)이지 않습니다. 따라서, 예를 들어, 공유 값을 원자 적으로 증가시키려면, 다음과 같이 하는 것으로는 충분하지 않습니다:

@example
counter.value += 1
@end example

연관된 록이 재귀적이라고 가정하면 (기본적으로 그렇습니다), 대신 다음과 같이 할 수 있습니다

@example
with counter.get_lock():
    counter.value += 1
@end example

`lock' 은 키워드 전용 인자입니다.
@end deffn

@geindex Array() (multiprocessing 모듈)
@anchor{library/multiprocessing multiprocessing Array}@anchor{3681}
@deffn {함수} multiprocessing.Array (typecode_or_type, size_or_initializer, *, lock=True)

공유 메모리에서 할당된 ctypes 배열을 반환합니다. 기본적으로 반환 값은, 사실 배열에 대한 동기화 된 래퍼입니다.

`typecode_or_type' determines the type of the elements of the returned array:
it is either a @ref{283f,,ctypes type} or a one
character typecode of the kind used by the @ref{8,,array} module with the
exception of @code{'w'}, which is not supported.  In addition, the @code{'c'}
typecode is an alias for @ref{3306,,ctypes.c_char}.  If `size_or_initializer'
is an integer, then it determines the length of the array, and the array
will be initially zeroed. Otherwise, `size_or_initializer' is a sequence
which is used to initialize the array and whose length determines the length
of the array.

`lock' 이 @code{True} (기본값) 면 값에 대한 액세스를 동기화하기 위해 새 록 객체가 생성됩니다. `lock' 이 @ref{1856,,Lock} 또는 @ref{1857,,RLock} 객체인 경우, 이 값이 값에 대한 액세스를 동기화하는 데 사용됩니다. `lock' 이 @code{False} 면, 반환된 객체에 대한 액세스는 록에 의해 자동으로 보호되지 않으므로 “프로세스 안전” 하지 않습니다.

`lock' 은 키워드 전용 인자입니다.

@ref{3306,,ctypes.c_char} 의 배열은 `value' 와 `raw' 어트리뷰트를 가지고 있습니다. 이 어트리뷰트를 사용하여 문자열을 저장하고 꺼낼 수 있습니다.
@end deffn

@menu
* The multiprocessing.sharedctypes module: The multiprocessing sharedctypes module. 

@end menu

@node The multiprocessing sharedctypes module,,,공유 ctypes 객체
@anchor{library/multiprocessing module-multiprocessing sharedctypes}@anchor{9e}@anchor{library/multiprocessing the-multiprocessing-sharedctypes-module}@anchor{36c1}
@subsubsection The @code{multiprocessing.sharedctypes} module


@geindex module; multiprocessing.sharedctypes

The @code{multiprocessing.sharedctypes} module provides functions for allocating
@ref{2e,,ctypes} objects from shared memory which can be inherited by child
processes.

@cartouche
@quotation 참고 
공유 메모리에 포인터를 저장할 수는 있지만, 특정 프로세스의 주소 공간에 있는 위치를 참조하게 됩니다. 그러나 포인터는 두 번째 프로세스의 컨텍스트에서는 유효하지 않을 가능성이 커서, 두 번째 프로세스에서 포인터를 역 참조하려고 하면 충돌이 일어날 수 있습니다.
@end quotation
@end cartouche

@geindex RawArray() (multiprocessing.sharedctypes 모듈)
@anchor{library/multiprocessing multiprocessing sharedctypes RawArray}@anchor{36c2}
@deffn {함수} multiprocessing.sharedctypes.RawArray (typecode_or_type, size_or_initializer)

공유 메모리에 할당된 ctypes 배열을 반환합니다.

`typecode_or_type' 은 반환된 배열의 요소의 형을 결정합니다: ctypes 형이거나 @ref{8,,array} 모듈에 의해 사용되는 종류의 한 문자 typecode입니다. `size_or_initializer' 가 정수면, 배열의 길이를 결정하고 배열은 0으로 초기화됩니다. 그렇지 않으면, `size_or_initializer' 는 배열을 초기화하는 데 사용되는 시퀀스고, 길이는 배열의 길이를 결정합니다.

요소를 쓰고 읽는 것은 잠재적으로 원자 적이지 않습니다 – 액세스가 록을 사용하여 자동으로 동기화되기 원하면 @ref{36c3,,Array()}를 대신 사용하세요.
@end deffn

@geindex RawValue() (multiprocessing.sharedctypes 모듈)
@anchor{library/multiprocessing multiprocessing sharedctypes RawValue}@anchor{36c4}
@deffn {함수} multiprocessing.sharedctypes.RawValue (typecode_or_type, *args)

공유 메모리에 할당된 ctypes 객체를 반환합니다.

`typecode_or_type' 은 반환된 객체의 형을 결정합니다: ctypes 형이거나 @ref{8,,array} 모듈에 의해 사용되는 종류의 한 문자 typecode입니다. `*args' 는 형의 생성자로 전달됩니다.

값을 쓰고 읽는 것은 잠재적으로 원자 적이지 않습니다 – 액세스가 록을 사용하여 자동으로 동기화되기 원하면 @ref{36c5,,Value()}를 대신 사용하세요.

@ref{3306,,ctypes.c_char} 의 배열은 `value' 와 `raw' 어트리뷰트를 가지고 있습니다. 이 어트리뷰트를 사용하여 문자열을 저장하고 꺼낼 수 있습니다 – @ref{2e,,ctypes} 설명서를 보십시오.
@end deffn

@geindex Array() (multiprocessing.sharedctypes 모듈)
@anchor{library/multiprocessing multiprocessing sharedctypes Array}@anchor{36c3}
@deffn {함수} multiprocessing.sharedctypes.Array (typecode_or_type, size_or_initializer, *, lock=True, ctx=None)

`lock' 값에 따라, 날 ctypes 배열 대신 프로세스 안전한 동기화 래퍼가 반환될 수 있다는 것을 제외하고는 @ref{36c2,,RawArray()} 와 같습니다.

`lock' 이 @code{True} (기본값) 면 값에 대한 액세스를 동기화하기 위해 새 록 객체가 생성됩니다. `lock' 이 @ref{1856,,Lock} 또는 @ref{1857,,RLock} 객체인 경우, 이 값이 값에 대한 액세스를 동기화하는 데 사용됩니다. `lock' 이 @code{False} 면, 반환된 객체에 대한 액세스는 록에 의해 자동으로 보호되지 않으므로 “프로세스 안전” 하지 않습니다.

`ctx' is a context object, or @code{None} (use the current context). If @code{None},
calling this may set the global start method. See
@ref{3689,,Global start method} for more details.

Note that `lock' and `ctx' are keyword-only parameters.
@end deffn

@geindex Value() (multiprocessing.sharedctypes 모듈)
@anchor{library/multiprocessing multiprocessing sharedctypes Value}@anchor{36c5}
@deffn {함수} multiprocessing.sharedctypes.Value (typecode_or_type, *args, lock=True, ctx=None)

`lock' 값에 따라, 날 ctypes 객체 대신 프로세스 안전한 동기화 래퍼가 반환될 수 있다는 것을 제외하고는 @ref{36c4,,RawValue()} 와 같습니다.

`lock' 이 @code{True} (기본값) 면 값에 대한 액세스를 동기화하기 위해 새 록 객체가 생성됩니다. `lock' 이 @ref{1856,,Lock} 또는 @ref{1857,,RLock} 객체인 경우, 이 값이 값에 대한 액세스를 동기화하는 데 사용됩니다. `lock' 이 @code{False} 면, 반환된 객체에 대한 액세스는 록에 의해 자동으로 보호되지 않으므로 “프로세스 안전” 하지 않습니다.

`ctx' is a context object, or @code{None} (use the current context). If @code{None},
calling this may set the global start method. See
@ref{3689,,Global start method} for more details.

Note that `lock' and `ctx' are keyword-only parameters.
@end deffn

@geindex copy() (multiprocessing.sharedctypes 모듈)
@anchor{library/multiprocessing multiprocessing sharedctypes copy}@anchor{36c6}
@deffn {함수} multiprocessing.sharedctypes.copy (obj)

공유 메모리에서 할당된 ctypes 객체를 반환합니다. 이 객체는 ctypes 객체 `obj' 의 복사본입니다.
@end deffn

@geindex synchronized() (multiprocessing.sharedctypes 모듈)
@anchor{library/multiprocessing multiprocessing sharedctypes synchronized}@anchor{1030}
@deffn {함수} multiprocessing.sharedctypes.synchronized (obj, lock=None, ctx=None)

`lock' 을 사용하여 액세스를 동기화하는 ctypes 객체에 대한 프로세스 안전한 래퍼 객체를 반환합니다. `lock' 이 @code{None} (기본값)이면 @ref{1857,,multiprocessing.RLock} 객체가 자동으로 생성됩니다.

`ctx' is a context object, or @code{None} (use the current context). If @code{None},
calling this may set the global start method. See
@ref{3689,,Global start method} for more details.

동기화 래퍼는 래핑 된 객체의 메서드 외에도 두 개의 메서드를 더 갖습니다: @code{get_obj()} 는 래핑 된 객체를 반환하고, @code{get_lock()} 은 동기화에 사용되는 록 객체를 반환합니다.

래퍼를 통해 ctypes 객체에 액세스하는 것은, 날 ctypes 객체에 액세스하는 것보다 훨씬 느릴 수 있습니다.


버전 3.5에서 변경: 동기화된 객체는 @ref{1e1,,컨텍스트 관리자} 프로토콜을 지원합니다.

@end deffn

아래 표는 공유 메모리에 공유 ctypes 객체를 만드는 문법과 일반적인 ctypes 문법을 비교합니다. (표에서 @code{MyStruct} 는 @ref{1e5,,ctypes.Structure} 의 서브 클래스입니다.)


@multitable {xxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

ctypes

@tab

type을 사용하는 공유 ctypes

@tab

typecode를 사용하는 공유 ctypes

@item

c_double(2.4)

@tab

RawValue(c_double, 2.4)

@tab

RawValue(‘d’, 2.4)

@item

MyStruct(4, 6)

@tab

RawValue(MyStruct, 4, 6)

@tab

@item

(c_short * 7)()

@tab

RawArray(c_short, 7)

@tab

RawArray(‘h’, 7)

@item

(c_int * 3)(9, 2, 8)

@tab

RawArray(c_int, (9, 2, 8))

@tab

RawArray(‘i’, (9, 2, 8))

@end multitable


다음은 자식 프로세스가 여러 ctypes 객체를 수정하는 예입니다:

@example
from multiprocessing import Process, Lock
from multiprocessing.sharedctypes import Value, Array
from ctypes import Structure, c_double

class Point(Structure):
    _fields_ = [('x', c_double), ('y', c_double)]

def modify(n, x, s, A):
    n.value **= 2
    x.value **= 2
    s.value = s.value.upper()
    for a in A:
        a.x **= 2
        a.y **= 2

if __name__ == '__main__':
    lock = Lock()

    n = Value('i', 7)
    x = Value(c_double, 1.0/3.0, lock=False)
    s = Array('c', b'hello world', lock=lock)
    A = Array(Point, [(1.875,-6.25), (-5.75,2.0), (2.375,9.5)], lock=lock)

    p = Process(target=modify, args=(n, x, s, A))
    p.start()
    p.join()

    print(n.value)
    print(x.value)
    print(s.value)
    print([(a.x, a.y) for a in A])
@end example

인쇄되는 결과는 이렇습니다

@example
49
0.1111111111111111
HELLO WORLD
[(3.515625, 39.0625), (33.0625, 4.0), (5.640625, 90.25)]
@end example

@node 관리자,프락시 객체,공유 ctypes 객체,레퍼런스
@anchor{library/multiprocessing managers}@anchor{36c7}@anchor{library/multiprocessing multiprocessing-managers}@anchor{369c}
@subsubsection 관리자


관리자는 서로 다른 컴퓨터에서 실행되는 프로세스 간에 네트워크를 통해 공유하는 것을 포함하여 서로 다른 프로세스 간에 공유할 수 있는 데이터를 만드는 방법을 제공합니다. 관리자 객체는 `공유 객체' 를 관리하는 서버 프로세스를 제어합니다. 다른 프로세스는 프락시를 사용하여 공유 객체에 액세스 할 수 있습니다.

@geindex built-in function; multiprocessing.Manager()
@anchor{library/multiprocessing multiprocessing Manager}@anchor{250}
@deffn {함수} multiprocessing.Manager ()

프로세스 간에 객체를 공유하는 데 사용할 수 있는 시작된 @ref{1896,,SyncManager} 객체를 반환합니다. 반환된 관리자 객체는 생성된 자식 프로세스에 해당하며 공유 객체를 만들고 해당 프락시를 반환하는 메서드가 있습니다.
@end deffn

@geindex module; multiprocessing.managers
@anchor{library/multiprocessing module-multiprocessing managers}@anchor{9b}
관리자 프로세스는 가비지 수집되거나 상위 프로세스가 종료되자마자 종료됩니다. 관리자 클래스는 @ref{9b,,multiprocessing.managers} 모듈에 정의되어 있습니다 :

@geindex BaseManager (multiprocessing.managers 클래스)
@anchor{library/multiprocessing multiprocessing managers BaseManager}@anchor{36c8}
@deffn {클래스} multiprocessing.managers.BaseManager (address=None, authkey=None, serializer='pickle', ctx=None, *, shutdown_timeout=1.0)

BaseManager 객체를 만듭니다.

일단 생성되면 관리자 객체가 시작된 관리자 프로세스를 참조하게 하려고 @ref{36c9,,start()} 또는 @code{get_server().serve_forever()} 를 호출해야 합니다.

`address' 는 관리자 프로세스가 새 연결을 리슨하는 주소입니다. `address' 가 @code{None} 이면 임의의 것이 선택됩니다.

`authkey' 는 서버 프로세스로 들어오는 연결의 유효성을 검사하는 데 사용되는 인증 키입니다. `authkey' 가 @code{None} 이면 @code{current_process().authkey} 가 사용됩니다. 그렇지 않으면 `authkey' 가 사용되며 바이트열이어야 합니다.

`serializer' must be @code{'pickle'} (use @ref{ab,,pickle} serialization) or
@code{'xmlrpclib'} (use @ref{134,,xmlrpc.client} serialization).

`ctx' is a context object, or @code{None} (use the current context). If @code{None},
calling this may set the global start method. See
@ref{3689,,Global start method} for more details.

`shutdown_timeout' is a timeout in seconds used to wait until the process
used by the manager completes in the @ref{36ca,,shutdown()} method. If the
shutdown times out, the process is terminated. If terminating the process
also times out, the process is killed.


버전 3.11에서 변경: Added the `shutdown_timeout' parameter.


@geindex start() (multiprocessing.managers.BaseManager 메서드)
@anchor{library/multiprocessing multiprocessing managers BaseManager start}@anchor{36c9}
@deffn {메서드} start ([initializer[, initargs]])

관리자를 시작시키기 위해 서브 프로세스를 시작합니다. `initializer' 가 @code{None} 이 아닌 경우, 서브 프로세스는 시작할 때 @code{initializer(*initargs)} 를 호출합니다.
@end deffn

@geindex get_server() (multiprocessing.managers.BaseManager 메서드)
@anchor{library/multiprocessing multiprocessing managers BaseManager get_server}@anchor{36cb}
@deffn {메서드} get_server ()

Manager의 제어를 받는 실제 서버를 나타내는 @code{Server} 객체를 반환합니다. @code{Server} 객체는 @code{serve_forever()} 메서드를 지원합니다:

@example
>>> from multiprocessing.managers import BaseManager
>>> manager = BaseManager(address=('@w{'}, 50000), authkey=b'abc')
>>> server = manager.get_server()
>>> server.serve_forever()
@end example

@code{Server} 는 추가로 @ref{36cc,,address} 어트리뷰트를 가지고 있습니다.
@end deffn

@geindex connect() (multiprocessing.managers.BaseManager 메서드)
@anchor{library/multiprocessing multiprocessing managers BaseManager connect}@anchor{36cd}
@deffn {메서드} connect ()

지역 관리자 객체를 원격 관리자 프로세스에 연결합니다:

@example
>>> from multiprocessing.managers import BaseManager
>>> m = BaseManager(address=('127.0.0.1', 50000), authkey=b'abc')
>>> m.connect()
@end example
@end deffn

@geindex shutdown() (multiprocessing.managers.BaseManager 메서드)
@anchor{library/multiprocessing multiprocessing managers BaseManager shutdown}@anchor{36ca}
@deffn {메서드} shutdown ()

관리자가 사용하는 프로세스를 중지합니다. @ref{36c9,,start()}를 사용하여 서버 프로세스를 시작한 경우에만 사용할 수 있습니다.

여러 번 호출 될 수 있습니다.
@end deffn

@geindex register() (multiprocessing.managers.BaseManager 메서드)
@anchor{library/multiprocessing multiprocessing managers BaseManager register}@anchor{36ce}
@deffn {메서드} register (typeid[, callable[, proxytype[, exposed[, method_to_typeid[, create_method]]]]])

관리자 클래스에 형이나 콜러블을 등록하는데 사용할 수 있는 클래스 메서드.

`typeid' 는 특정 형의 공유 객체를 식별하는 데 사용되는 “형 식별자” 입니다. 문자열이어야 합니다.

`callable' 은 이 형 식별자에 대한 객체를 만드는 데 사용되는 콜러블 객체입니다. 관리자 인스턴스가 @ref{36cd,,connect()} 메서드를 사용하여 서버에 연결되거나, `create_method' 인자가 @code{False} 면 @code{None} 으로 남겨 둘 수 있습니다.

`proxytype' 은, 이 `typeid' 의 공유 객체의 프락시를 만드는 데 사용되는 @ref{36cf,,BaseProxy} 의 서브 클래스입니다. @code{None} 이면 프락시 클래스가 자동으로 생성됩니다.

`exposed' 는 이 typeid에 대한 프락시가 @ref{36d0,,BaseProxy._callmethod()} 를 사용하여 액세스 할 수 있도록 허용해야 하는 메서드 이름의 시퀀스를 지정하는 데 사용됩니다. (만약 `exposed' 가 @code{None} 이면, 존재하는 경우, @code{proxytype._exposed_} 가 대신 사용됩니다.) exposed 리스트가 지정되지 않은 경우, 공유 객체의 모든 “공용 메서드” 에 액세스 할 수 있습니다. (여기서 “공용 메서드” 는 @ref{779,,__call__()} 메서드가 있고 그 이름이 @code{'_'} 로 시작하지 않는 어트리뷰트를 의미합니다.)

`method_to_typeid' 는 프락시를 반환해야 하는 노출된 메서드의 반환형을 지정하는 데 사용되는 매핑입니다. 메서드 이름을 typeid 문자열로 매핑합니다. (만일 `method_to_typeid' 가 @code{None} 이면, 존재한다면, @code{proxytype._method_to_typeid_} 가 대신 사용됩니다.) 메서드의 이름이 이 매핑의 키가 아니거나 매핑이 @code{None} 이면, 메서드에 의해 반환된 객체는 값으로 복사됩니다.

`create_method' 는 이름이 `typeid' 인 메서드를 만들어야 하는지를 결정합니다. 이 메서드는 서버 프로세스에 새 공유 객체를 만들고 프락시를 반환하도록 지시하는 데 사용될 수 있습니다. 기본적으로 @code{True} 입니다.
@end deffn

@ref{36c8,,BaseManager} 인스턴스는 읽기 전용 프로퍼티를 하나 가지고 있습니다:

@geindex address (multiprocessing.managers.BaseManager의 속성)
@anchor{library/multiprocessing multiprocessing managers BaseManager address}@anchor{36cc}
@deffn {속성} address

관리자가 사용하는 주소.
@end deffn


버전 3.3에서 변경: 관리자 객체는 컨텍스트 관리 프로토콜을 지원합니다 – @ref{240c,,컨텍스트 관리자 형}를 보세요. @ref{26ae,,__enter__()} 는 서버 프로세스를 시작하고 (아직 시작하지 않았다면), 관리자 객체를 반환합니다. @ref{26af,,__exit__()} 는 @ref{36ca,,shutdown()}을 호출합니다.

이전 버전에서 @ref{26ae,,__enter__()} 는 관리자의 서버 프로세스가 아직 시작되지 않았을 때 시작시키지 않았습니다.

@end deffn

@geindex SyncManager (multiprocessing.managers 클래스)
@anchor{library/multiprocessing multiprocessing managers SyncManager}@anchor{1896}
@deffn {클래스} multiprocessing.managers.SyncManager

프로세스의 동기화에 사용할 수 있는 @ref{36c8,,BaseManager} 의 서브 클래스입니다. 이 형의 객체는 @ref{250,,multiprocessing.Manager()} 에 의해 반환됩니다.

이 클래스의 메서드는 여러 프로세스에서 동기화 할 수 있도록 일반적으로 사용되는 많은 데이터형을 생성하고 @ref{24c,,프락시 객체}를 반환합니다. 특히 공유 리스트와 딕셔너리가 포함됩니다.

@geindex Barrier() (multiprocessing.managers.SyncManager 메서드)
@anchor{library/multiprocessing multiprocessing managers SyncManager Barrier}@anchor{36d1}
@deffn {메서드} Barrier (parties[, action[, timeout]])

공유 @ref{13e8,,threading.Barrier} 객체를 생성하고 프락시를 반환합니다.


Added in version 3.3.

@end deffn

@geindex BoundedSemaphore() (multiprocessing.managers.SyncManager 메서드)
@anchor{library/multiprocessing multiprocessing managers SyncManager BoundedSemaphore}@anchor{36d2}
@deffn {메서드} BoundedSemaphore ([value])

공유 @ref{135c,,threading.BoundedSemaphore} 객체를 생성하고 프락시를 반환합니다.
@end deffn

@geindex Condition() (multiprocessing.managers.SyncManager 메서드)
@anchor{library/multiprocessing multiprocessing managers SyncManager Condition}@anchor{36d3}
@deffn {메서드} Condition ([lock])

공유 @ref{135a,,threading.Condition} 객체를 생성하고 프락시를 반환합니다.

`lock' 이 제공되면 @ref{19f4,,threading.Lock} 또는 @ref{32e,,threading.RLock} 객체에 대한 프락시여야 합니다.


버전 3.3에서 변경: @ref{365e,,wait_for()} 메서드가 추가되었습니다.

@end deffn

@geindex Event() (multiprocessing.managers.SyncManager 메서드)
@anchor{library/multiprocessing multiprocessing managers SyncManager Event}@anchor{36d4}
@deffn {메서드} Event ()

공유 @ref{135d,,threading.Event} 객체를 생성하고 프락시를 반환합니다.
@end deffn

@geindex Lock() (multiprocessing.managers.SyncManager 메서드)
@anchor{library/multiprocessing multiprocessing managers SyncManager Lock}@anchor{159c}
@deffn {메서드} Lock ()

공유 @ref{19f4,,threading.Lock} 객체를 생성하고 프락시를 반환합니다.
@end deffn

@geindex Namespace() (multiprocessing.managers.SyncManager 메서드)
@anchor{library/multiprocessing multiprocessing managers SyncManager Namespace}@anchor{36d5}
@deffn {메서드} Namespace ()

공유 @ref{3682,,Namespace} 객체를 생성하고 프락시를 반환합니다.
@end deffn

@geindex Queue() (multiprocessing.managers.SyncManager 메서드)
@anchor{library/multiprocessing multiprocessing managers SyncManager Queue}@anchor{31ec}
@deffn {메서드} Queue ([maxsize])

공유 @ref{1599,,queue.Queue} 객체를 생성하고 프락시를 반환합니다.
@end deffn

@geindex RLock() (multiprocessing.managers.SyncManager 메서드)
@anchor{library/multiprocessing multiprocessing managers SyncManager RLock}@anchor{159d}
@deffn {메서드} RLock ()

공유 @ref{32e,,threading.RLock} 객체를 생성하고 프락시를 반환합니다.
@end deffn

@geindex Semaphore() (multiprocessing.managers.SyncManager 메서드)
@anchor{library/multiprocessing multiprocessing managers SyncManager Semaphore}@anchor{159e}
@deffn {메서드} Semaphore ([value])

공유 @ref{135b,,threading.Semaphore} 객체를 생성하고 프락시를 반환합니다.
@end deffn

@geindex Array() (multiprocessing.managers.SyncManager 메서드)
@anchor{library/multiprocessing multiprocessing managers SyncManager Array}@anchor{36d6}
@deffn {메서드} Array (typecode, sequence)

배열을 만들고 프락시를 반환합니다.
@end deffn

@geindex Value() (multiprocessing.managers.SyncManager 메서드)
@anchor{library/multiprocessing multiprocessing managers SyncManager Value}@anchor{36d7}
@deffn {메서드} Value (typecode, value)

쓰기 가능한 @code{value} 어트리뷰트를 가진 객체를 생성하고 프락시를 반환합니다.
@end deffn

@geindex dict() (multiprocessing.managers.SyncManager 메서드)
@anchor{library/multiprocessing multiprocessing managers SyncManager dict}@anchor{36d8}
@deffn {메서드} dict ()

@deffnx {메서드} dict (mapping)

@deffnx {메서드} dict (sequence)

공유 @ref{183,,dict} 객체를 생성하고 프락시를 반환합니다.
@end deffn

@geindex list() (multiprocessing.managers.SyncManager 메서드)
@anchor{library/multiprocessing multiprocessing managers SyncManager list}@anchor{36d9}
@deffn {메서드} list ()

@deffnx {메서드} list (sequence)

공유 @ref{24d,,list} 객체를 생성하고 프락시를 반환합니다.
@end deffn

@geindex set() (multiprocessing.managers.SyncManager 메서드)
@anchor{library/multiprocessing multiprocessing managers SyncManager set}@anchor{24f}
@deffn {메서드} set ()

@deffnx {메서드} set (sequence)

@deffnx {메서드} set (mapping)

Create a shared @ref{184,,set} object and return a proxy for it.


Added in version 3.14: @ref{184,,set} support was added.

@end deffn


버전 3.6에서 변경: 공유 객체는 중첩될 수 있습니다. 예를 들어, 공유 리스트와 같은 공유 컨테이너 객체는, @ref{1896,,SyncManager} 에 의해 모두 관리되고 동기화되는 다른 공유 객체를 포함 할 수 있습니다.

@end deffn

@geindex Namespace (multiprocessing.managers 클래스)
@anchor{library/multiprocessing multiprocessing managers Namespace}@anchor{3682}
@deffn {클래스} multiprocessing.managers.Namespace

@ref{1896,,SyncManager} 로 등록 할 수 있는 형입니다.

이름 공간 객체에는 공용 메서드가 없지만, 쓰기 가능한 어트리뷰트가 있습니다. repr 은 그것의 어트리뷰트 값을 보여줍니다.

그러나, 이름 공간 객체의 프락시를 사용할 때, @code{'_'} 로 시작하는 어트리뷰트는 프락시의 어트리뷰트가 되며 참조 대상의 어트리뷰트가 아닙니다:

@example
>>> mp_context = multiprocessing.get_context('spawn')
>>> manager = mp_context.Manager()
>>> Global = manager.Namespace()
>>> Global.x = 10
>>> Global.y = 'hello'
>>> Global._z = 12.3    # this is an attribute of the proxy
>>> print(Global)
Namespace(x=10, y='hello')
@end example
@end deffn

@menu
* 사용자 정의 관리자:: 
* 원격 관리자 사용하기:: 

@end menu

@node 사용자 정의 관리자,원격 관리자 사용하기,,관리자
@anchor{library/multiprocessing customized-managers}@anchor{36da}
@subsubsection 사용자 정의 관리자


자신만의 관리자를 만들려면, @ref{36c8,,BaseManager} 의 서브 클래스를 만들고 @ref{36ce,,register()} 클래스 메서드를 사용하여 새로운 형이나 콜러블을 관리자 클래스에 등록합니다. 예를 들면:

@example
from multiprocessing.managers import BaseManager

class MathsClass:
    def add(self, x, y):
        return x + y
    def mul(self, x, y):
        return x * y

class MyManager(BaseManager):
    pass

MyManager.register('Maths', MathsClass)

if __name__ == '__main__':
    with MyManager() as manager:
        maths = manager.Maths()
        print(maths.add(4, 3))         # prints 7
        print(maths.mul(7, 8))         # prints 56
@end example

@node 원격 관리자 사용하기,,사용자 정의 관리자,관리자
@anchor{library/multiprocessing using-a-remote-manager}@anchor{36db}
@subsubsection 원격 관리자 사용하기


한 기계에서 관리자 서버를 실행하고 다른 기계의 클라이언트가 관리자 서버를 사용하도록 할 수 있습니다 (관련된 방화벽이 허용한다고 가정합니다).

다음 명령을 실행하면 원격 클라이언트가 액세스 할 수 있는 단일 공유 큐를 위한 서버가 만들어집니다:

@example
>>> from multiprocessing.managers import BaseManager
>>> from queue import Queue
>>> queue = Queue()
>>> class QueueManager(BaseManager): pass
>>> QueueManager.register('get_queue', callable=lambda:queue)
>>> m = QueueManager(address=('@w{'}, 50000), authkey=b'abracadabra')
>>> s = m.get_server()
>>> s.serve_forever()
@end example

한 클라이언트는 다음과 같이 서버에 액세스 할 수 있습니다:

@example
>>> from multiprocessing.managers import BaseManager
>>> class QueueManager(BaseManager): pass
>>> QueueManager.register('get_queue')
>>> m = QueueManager(address=('foo.bar.org', 50000), authkey=b'abracadabra')
>>> m.connect()
>>> queue = m.get_queue()
>>> queue.put('hello')
@end example

또 다른 클라이언트도 사용할 수 있습니다:

@example
>>> from multiprocessing.managers import BaseManager
>>> class QueueManager(BaseManager): pass
>>> QueueManager.register('get_queue')
>>> m = QueueManager(address=('foo.bar.org', 50000), authkey=b'abracadabra')
>>> m.connect()
>>> queue = m.get_queue()
>>> queue.get()
'hello'
@end example

지역 프로세스 역시, 위의 클라이언트가 원격으로 액세스하는 코드를 사용하여 같은 큐에 액세스 할 수 있습니다:

@example
>>> from multiprocessing import Process, Queue
>>> from multiprocessing.managers import BaseManager
>>> class Worker(Process):
...     def __init__(self, q):
...         self.q = q
...         super().__init__()
...     def run(self):
...         self.q.put('local hello')
...
>>> queue = Queue()
>>> w = Worker(queue)
>>> w.start()
>>> class QueueManager(BaseManager): pass
...
>>> QueueManager.register('get_queue', callable=lambda: queue)
>>> m = QueueManager(address=('@w{'}, 50000), authkey=b'abracadabra')
>>> s = m.get_server()
>>> s.serve_forever()
@end example

@node 프락시 객체,프로세스 풀,관리자,레퍼런스
@anchor{library/multiprocessing multiprocessing-proxy-objects}@anchor{24c}@anchor{library/multiprocessing proxy-objects}@anchor{36dc}
@subsubsection 프락시 객체


프락시는 (아마도) 다른 프로세스에 있는 공유 객체를 `가리키는' 객체입니다. 공유 객체는 프락시의 `지시 대상' 이라고 합니다. 여러 프락시 객체는 같은 지시 대상을 가질 수 있습니다.

프락시 객체에는 지시 대상의 해당 메서드를 호출하는 메서드가 있습니다 (그러나 지시 대상의 모든 메서드가 반드시 프락시를 통해 사용할 수 있는 것은 아닙니다). 이런 식으로, 프락시는 지시 대상처럼 사용될 수 있습니다:

@example
>>> mp_context = multiprocessing.get_context('spawn')
>>> manager = mp_context.Manager()
>>> l = manager.list([i*i for i in range(10)])
>>> print(l)
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> print(repr(l))
<ListProxy object, typeid 'list' at 0x...>
>>> l[4]
16
>>> l[2:5]
[4, 9, 16]
@end example

프락시에 @ref{169,,str()} 을 적용하면 지시 대상의 표현이 반환되는 반면, @ref{1c1,,repr()} 을 적용하면 프락시의 표현이 반환됩니다.

프락시 객체의 중요한 특징은, 피클 가능해서 프로세스 간에 전달될 수 있다는 것입니다. 지시 대상은 @ref{24c,,프락시 객체}를 포함 할 수 있습니다. 이것은 관리된 리스트, 딕셔너리 및 다른 @ref{24c,,프락시 객체} 의 중첩을 허용합니다:

@example
>>> a = manager.list()
>>> b = manager.list()
>>> a.append(b)         # referent of a now contains referent of b
>>> print(a, b)
[<ListProxy object, typeid 'list' at ...>] []
>>> b.append('hello')
>>> print(a[0], b)
['hello'] ['hello']
@end example

비슷하게, 딕셔너리와 리스트 프락시는 서로 중첩될 수 있습니다:

@example
>>> l_outer = manager.list([ manager.dict() for i in range(2) ])
>>> d_first_inner = l_outer[0]
>>> d_first_inner['a'] = 1
>>> d_first_inner['b'] = 2
>>> l_outer[1]['c'] = 3
>>> l_outer[1]['z'] = 26
>>> print(l_outer[0])
@{'a': 1, 'b': 2@}
>>> print(l_outer[1])
@{'c': 3, 'z': 26@}
@end example

(프락시가 아닌) 표준 @ref{24d,,list} 또는 @ref{183,,dict} 객체가 지시 대상에 포함되어있는 경우, 이 가변 값들에 대한 수정은 관리자를 통해 전파되지 않습니다. 포함된 값이 언제 수정되는지 프락시가 알 방법이 없기 때문입니다. 그러나 컨테이너 프락시에 값을 저장하는 것(프락시 객체의 @code{__setitem__} 을 호출합니다)은 관리자를 통해 전파되므로, 그 항목을 효과적으로 수정하기 위해, 수정된 값을 컨테이너 프락시에 다시 대입할 수 있습니다:

@example
# create a list proxy and append a mutable object (a dictionary)
lproxy = manager.list()
lproxy.append(@{@})
# now mutate the dictionary
d = lproxy[0]
d['a'] = 1
d['b'] = 2
# at this point, the changes to d are not yet synced, but by
# updating the dictionary, the proxy is notified of the change
lproxy[0] = d
@end example

이 접근법은 아마도 대부분의 사용 사례에서 중첩된 @ref{24c,,프락시 객체}를 사용하는 것보다 불편하지만, 동기화에 대한 제어 수준을 보여줍니다.

@cartouche
@quotation 참고 
The proxy types in @code{multiprocessing} do nothing to support comparisons
by value.  So, for instance, we have:

@example
>>> manager.list([1,2,3]) == [1,2,3]
False
@end example

비교할 때는 지시 대상의 사본을 대신 사용해야 합니다.
@end quotation
@end cartouche

@geindex BaseProxy (multiprocessing.managers 클래스)
@anchor{library/multiprocessing multiprocessing managers BaseProxy}@anchor{36cf}
@deffn {클래스} multiprocessing.managers.BaseProxy

프락시 객체는 @ref{36cf,,BaseProxy} 의 서브 클래스의 인스턴스입니다.

@geindex _callmethod() (multiprocessing.managers.BaseProxy 메서드)
@anchor{library/multiprocessing multiprocessing managers BaseProxy _callmethod}@anchor{36d0}
@deffn {메서드} _callmethod (methodname[, args[, kwds]])

프락시의 지시 대상 메서드를 호출하고 결과를 반환합니다.

@code{proxy} 가 프락시이고, 그 지시 대상이 @code{obj} 면, 표현식

@example
proxy._callmethod(methodname, args, kwds)
@end example

은 표현식

@example
getattr(obj, methodname)(*args, **kwds)
@end example

을 관리자 프로세스에서 평가합니다.

반환된 값은 호출 결과의 복사본이거나 새 공유 객체에 대한 프락시입니다 – @ref{36ce,,BaseManager.register()} 의 `method_to_typeid' 인자에 대한 설명서를 보십시오.

호출 때문에 예외가 발생하면, @ref{36d0,,_callmethod()} 가 다시 일으킵니다. 관리자 프로세스에서 다른 예외가 발생하면 @code{RemoteError} 예외로 변환되어 @code{_callmethod()} 가 일으킵니다.

특히, `methodname' 이 `노출되지' 않았으면 예외가 발생합니다.

@ref{36d0,,_callmethod()} 사용법의 예:

@example
>>> l = manager.list(range(10))
>>> l._callmethod('__len__')
10
>>> l._callmethod('__getitem__', (slice(2, 7),)) # equivalent to l[2:7]
[2, 3, 4, 5, 6]
>>> l._callmethod('__getitem__', (20,))          # equivalent to l[20]
Traceback (most recent call last):
...
IndexError: list index out of range
@end example
@end deffn

@geindex _getvalue() (multiprocessing.managers.BaseProxy 메서드)
@anchor{library/multiprocessing multiprocessing managers BaseProxy _getvalue}@anchor{36dd}
@deffn {메서드} _getvalue ()

지시 대상의 복사본을 반환합니다.

지시 대상이 피클 가능하지 않으면 예외가 발생합니다.
@end deffn

@geindex __repr__() (multiprocessing.managers.BaseProxy 메서드)
@anchor{library/multiprocessing multiprocessing managers BaseProxy __repr__}@anchor{36de}
@deffn {메서드} __repr__ ()

프락시 객체의 표현을 반환합니다.
@end deffn

@geindex __str__() (multiprocessing.managers.BaseProxy 메서드)
@anchor{library/multiprocessing multiprocessing managers BaseProxy __str__}@anchor{36df}
@deffn {메서드} __str__ ()

지시 대상의 표현을 반환합니다.
@end deffn
@end deffn

@menu
* 정리: 정리<2>. 

@end menu

@node 정리<2>,,,프락시 객체
@anchor{library/multiprocessing cleanup}@anchor{36e0}
@subsubsection 정리


프락시 객체는 weakref 콜백을 사용해서 가비지 수집 시 자신의 지시 대상을 소유한 관리자에서 자신을 등록 취소합니다.

더는 참조하는 프락시가 없는 경우 공유 객체는 관리자 프로세스에서 삭제됩니다.

@node 프로세스 풀,리스너와 클라이언트,프락시 객체,레퍼런스
@anchor{library/multiprocessing module-multiprocessing pool}@anchor{9c}@anchor{library/multiprocessing process-pools}@anchor{36e1}
@subsubsection 프로세스 풀


@geindex module; multiprocessing.pool

@ref{116a,,Pool} 클래스를 사용하여, 제출된 작업을 수행할 프로세스 풀을 만들 수 있습니다.

@geindex Pool (multiprocessing.pool 클래스)
@anchor{library/multiprocessing multiprocessing pool Pool}@anchor{116a}
@deffn {클래스} multiprocessing.pool.Pool ([processes[, initializer[, initargs[, maxtasksperchild[, context]]]]])

작업을 제출할 수 있는 작업자 프로세스 풀을 제어하는 프로세스 풀 객체. 제한 시간과 콜백을 사용하는 비동기 결과를 지원하고 병렬 map 구현을 제공합니다.

`processes' is the number of worker processes to use.  If `processes' is
@code{None} then the number returned by @ref{51d,,os.process_cpu_count()} is used.

`initializer' 가 @code{None} 이 아니면, 각 작업자 프로세스는 시작할 때 @code{initializer(*initargs)} 를 호출합니다.

`maxtasksperchild' 는, 사용되지 않는 자원을 해제할 수 있도록, 작업 프로세스가 종료되고 새 작업 프로세스로 교체되기 전에 완료할 수 있는 작업 수입니다. 기본 `maxtasksperchild' 는 @code{None} 입니다. 이는 작업자 프로세스가 풀만큼 오래감을 의미합니다.

`context' can be used to specify the context used for starting
the worker processes.  Usually a pool is created using the
function @code{multiprocessing.Pool()} or the @ref{116a,,Pool()} method
of a context object.  In both cases `context' is set
appropriately. If @code{None}, calling this function will have the side effect
of setting the current global start method if it has not been set already.
See the @code{get_context()} function.

풀 객체의 메서드는 풀을 생성한 프로세스에 의해서만 호출되어야 합니다.

@cartouche
@quotation 경고 
@ref{9c,,multiprocessing.pool} 객체에는 풀을 컨텍스트 관리자로 사용하거나 @ref{36e2,,close()}와 @ref{36e3,,terminate()}를 수동으로 호출하여 (다른 자원과 마찬가지로) 올바르게 관리해야 하는 내부 자원이 있습니다. 이를 수행하지 않으면 파이널리제이션 때 프로세스가 멈출 수 있습니다.

Note that it is `not correct' to rely on the garbage collector to destroy the pool
as CPython does not assure that the finalizer of the pool will be called
(see @ref{11fc,,object.__del__()} for more information).
@end quotation
@end cartouche


버전 3.2에서 변경: Added the `maxtasksperchild' parameter.



버전 3.4에서 변경: Added the `context' parameter.



버전 3.13에서 변경: `processes' uses @ref{51d,,os.process_cpu_count()} by default, instead of
@ref{4db,,os.cpu_count()}.


@cartouche
@quotation 참고 
Worker processes within a @ref{116a,,Pool} typically live for the complete
duration of the Pool’s work queue. A frequent pattern found in other
systems (such as Apache, mod_wsgi, etc) to free resources held by
workers is to allow a worker within a pool to complete only a set
amount of work before exiting, being cleaned up and a new
process spawned to replace the old one. The `maxtasksperchild'
argument to the @code{Pool} exposes this ability to the end user.
@end quotation
@end cartouche

@geindex apply() (multiprocessing.pool.Pool 메서드)
@anchor{library/multiprocessing multiprocessing pool Pool apply}@anchor{159a}
@deffn {메서드} apply (func[, args[, kwds]])

인자 `args' 및 키워드 인자 `kwds' 를 사용하여 `func' 를 호출합니다. 결과가 준비될 때까지 블록 됩니다. 이 블록 때문에, @ref{159b,,apply_async()} 가 병렬로 작업을 수행하는 데 더 적합합니다. 또한 `func' 는 풀의 작업자 중 하나에서만 실행됩니다.
@end deffn

@geindex apply_async() (multiprocessing.pool.Pool 메서드)
@anchor{library/multiprocessing multiprocessing pool Pool apply_async}@anchor{159b}
@deffn {메서드} apply_async (func[, args[, kwds[, callback[, error_callback]]]])

@ref{36e4,,AsyncResult} 객체를 반환하는 @ref{159a,,apply()} 메서드의 변형입니다.

`callback' 이 지정되면 단일 인자를 받아들이는 콜러블이어야 합니다. 결과가 준비되면 `callback' 을 이 결과를 인자로 호출합니다. 실패한 결과면 `error_callback' 이 대신 적용됩니다.

`error_callback' 이 지정되면 단일 인자를 허용하는 콜러블이어야 합니다. 대상 함수가 실패하면, `error_callback' 이 예외 인스턴스를 인자로 호출됩니다.

콜백은 즉시 완료되어야 합니다. 그렇지 않으면 결과를 처리하는 스레드가 블록 됩니다.
@end deffn

@geindex map() (multiprocessing.pool.Pool 메서드)
@anchor{library/multiprocessing multiprocessing pool Pool map}@anchor{12ea}
@deffn {메서드} map (func, iterable[, chunksize])

@ref{19f,,map()} 내장 함수의 병렬 버전입니다 (하지만 하나의 `iterable' 인자만 지원합니다, 여러 이터러블에 대해서는 @ref{12e7,,starmap()}을 참조하십시오). 결과가 준비될 때까지 블록 됩니다.

이 메서드는 iterable을 여러 묶음으로 잘라서 별도의 작업으로 프로세스 풀에 제출합니다. 이러한 묶음의 (대략적인) 크기는 `chunksize' 를 양의 정수로 설정하여 지정할 수 있습니다.

매우 긴 이터러블은 높은 메모리 사용을 유발할 수 있습니다. 더 나은 효율성을 위해, 명시적인 `chunksize' 옵션으로 @ref{36e5,,imap()}이나 @ref{36e6,,imap_unordered()}를 사용하는 것을 고려하십시오.
@end deffn

@geindex map_async() (multiprocessing.pool.Pool 메서드)
@anchor{library/multiprocessing multiprocessing pool Pool map_async}@anchor{12eb}
@deffn {메서드} map_async (func, iterable[, chunksize[, callback[, error_callback]]])

@ref{36e4,,AsyncResult} 객체를 반환하는 @ref{12ea,,map()} 메서드의 변형입니다.

`callback' 이 지정되면 단일 인자를 받아들이는 콜러블이어야 합니다. 결과가 준비되면 `callback' 을 이 결과를 인자로 호출합니다. 실패한 결과면 `error_callback' 이 대신 적용됩니다.

`error_callback' 이 지정되면 단일 인자를 허용하는 콜러블이어야 합니다. 대상 함수가 실패하면, `error_callback' 이 예외 인스턴스를 인자로 호출됩니다.

콜백은 즉시 완료되어야 합니다. 그렇지 않으면 결과를 처리하는 스레드가 블록 됩니다.
@end deffn

@geindex imap() (multiprocessing.pool.Pool 메서드)
@anchor{library/multiprocessing multiprocessing pool Pool imap}@anchor{36e5}
@deffn {메서드} imap (func, iterable[, chunksize])

@ref{12ea,,map()} 의 느긋한 버전.

`chunksize' 인자는 @ref{12ea,,map()} 메서드에서 사용된 인자와 같습니다. 매우 긴 iterable의 경우 `chunksize' 에 큰 값을 사용하면 기본값 @code{1} 을 사용하는 것보다 작업을 `많이' 빠르게 완료 할 수 있습니다.

또한 `chunksize' 가 @code{1} 이면 @ref{36e5,,imap()} 메서드에 의해 반환된 이터레이터의 @code{next()} 메서드는 선택적 `timeout' 매개 변수를 가집니다: @code{next(timeout)} 은 결과가 `timeout' 초 내에 반환될 수 없는 경우 @ref{3696,,multiprocessing.TimeoutError} 를 발생시킵니다.
@end deffn

@geindex imap_unordered() (multiprocessing.pool.Pool 메서드)
@anchor{library/multiprocessing multiprocessing pool Pool imap_unordered}@anchor{36e6}
@deffn {메서드} imap_unordered (func, iterable[, chunksize])

@ref{36e5,,imap()}과 같지만, 반환된 이터레이터가 제공하는 결과의 순서가 임의적인 것으로 간주하여야 합니다. (단 하나의 작업자 프로세스가 있는 경우에만 순서가 “올바름” 이 보장됩니다.
@end deffn

@geindex starmap() (multiprocessing.pool.Pool 메서드)
@anchor{library/multiprocessing multiprocessing pool Pool starmap}@anchor{12e7}
@deffn {메서드} starmap (func, iterable[, chunksize])

Like @ref{12ea,,map()} except that the
elements of the `iterable' are expected to be iterables that are
unpacked as arguments.

따라서 `iterable' 이 @code{[(1,2), (3, 4)]} 미면 결과는 @code{[func(1,2), func(3,4)]} 가 됩니다.


Added in version 3.3.

@end deffn

@geindex starmap_async() (multiprocessing.pool.Pool 메서드)
@anchor{library/multiprocessing multiprocessing pool Pool starmap_async}@anchor{12e8}
@deffn {메서드} starmap_async (func, iterable[, chunksize[, callback[, error_callback]]])

@ref{12e7,,starmap()} 과 @ref{12eb,,map_async()} 의 조합으로 이터러블의 `iterable' 을 이터레이트하고 이터러블을 언팩해서 `func' 를 호출합니다. 결과 객체를 반환합니다.


Added in version 3.3.

@end deffn

@geindex close() (multiprocessing.pool.Pool 메서드)
@anchor{library/multiprocessing multiprocessing pool Pool close}@anchor{36e2}
@deffn {메서드} close ()

더는 작업이 풀에 제출되지 않도록 합니다. 모든 작업이 완료되면 작업자 프로세스가 종료됩니다.
@end deffn

@geindex terminate() (multiprocessing.pool.Pool 메서드)
@anchor{library/multiprocessing multiprocessing pool Pool terminate}@anchor{36e3}
@deffn {메서드} terminate ()

계류 중인 작업을 완료하지 않고 즉시 작업자 프로세스를 중지합니다. 풀 객체가 가비지 수집될 때 @ref{36e3,,terminate()} 가 즉시 호출됩니다.
@end deffn

@geindex join() (multiprocessing.pool.Pool 메서드)
@anchor{library/multiprocessing multiprocessing pool Pool join}@anchor{36e7}
@deffn {메서드} join ()

작업자 프로세스가 종료될 때까지 기다립니다. @ref{36e7,,join()} 호출 전에 반드시 @ref{36e2,,close()} 나 @ref{36e3,,terminate()}를 호출해야합니다 .
@end deffn


버전 3.3에서 변경: 풀 객체는 이제 컨텍스트 관리 프로토콜을 지원합니다 – @ref{240c,,컨텍스트 관리자 형}를 보십시오. @ref{26ae,,__enter__()} 는 풀 객체를 반환하고, @ref{26af,,__exit__()} 는 @ref{36e3,,terminate()}를 호출합니다.

@end deffn

@geindex AsyncResult (multiprocessing.pool 클래스)
@anchor{library/multiprocessing multiprocessing pool AsyncResult}@anchor{36e4}
@deffn {클래스} multiprocessing.pool.AsyncResult

@ref{159b,,Pool.apply_async()}와 @ref{12eb,,Pool.map_async()} 에 의해 반환되는 결과의 클래스.

@geindex get() (multiprocessing.pool.AsyncResult 메서드)
@anchor{library/multiprocessing multiprocessing pool AsyncResult get}@anchor{36e8}
@deffn {메서드} get ([timeout])

결과가 도착할 때 반환합니다. `timeout' 이 @code{None} 이 아니고 결과가 `timeout' 초 내에 도착하지 않으면 @ref{3696,,multiprocessing.TimeoutError} 가 발생합니다. 원격 호출이 예외를 발생시키는 경우 해당 예외는 @ref{36e8,,get()} 에 의해 다시 발생합니다.
@end deffn

@geindex wait() (multiprocessing.pool.AsyncResult 메서드)
@anchor{library/multiprocessing multiprocessing pool AsyncResult wait}@anchor{36e9}
@deffn {메서드} wait ([timeout])

결과가 사용 가능할 때까지 또는 `timeout' 초가 지날 때까지 기다립니다.
@end deffn

@geindex ready() (multiprocessing.pool.AsyncResult 메서드)
@anchor{library/multiprocessing multiprocessing pool AsyncResult ready}@anchor{36ea}
@deffn {메서드} ready ()

호출이 완료했는지를 돌려줍니다.
@end deffn

@geindex successful() (multiprocessing.pool.AsyncResult 메서드)
@anchor{library/multiprocessing multiprocessing pool AsyncResult successful}@anchor{36eb}
@deffn {메서드} successful ()

예외를 발생시키지 않고 호출이 완료되었는지를 돌려줍니다. 결과가 준비되지 않았으면 @ref{2ec,,ValueError} 를 발생시킵니다.


버전 3.7에서 변경: 결과가 준비되지 않았으면, @ref{8b7,,AssertionError} 대신 @ref{2ec,,ValueError}가 발생합니다.

@end deffn
@end deffn

다음 예제는 풀 사용 방법을 보여줍니다.:

@example
from multiprocessing import Pool
import time

def f(x):
    return x*x

if __name__ == '__main__':
    with Pool(processes=4) as pool:         # start 4 worker processes
        result = pool.apply_async(f, (10,)) # evaluate "f(10)" asynchronously in a single process
        print(result.get(timeout=1))        # prints "100" unless your computer is *very* slow

        print(pool.map(f, range(10)))       # prints "[0, 1, 4,..., 81]"

        it = pool.imap(f, range(10))
        print(next(it))                     # prints "0"
        print(next(it))                     # prints "1"
        print(it.next(timeout=1))           # prints "4" unless your computer is *very* slow

        result = pool.apply_async(time.sleep, (10,))
        print(result.get(timeout=1))        # raises multiprocessing.TimeoutError
@end example

@node 리스너와 클라이언트,인증 키,프로세스 풀,레퍼런스
@anchor{library/multiprocessing listeners-and-clients}@anchor{36ec}@anchor{library/multiprocessing module-multiprocessing connection}@anchor{99}@anchor{library/multiprocessing multiprocessing-listeners-clients}@anchor{36ae}
@subsubsection 리스너와 클라이언트


@geindex module; multiprocessing.connection

보통 프로세스 간 메시지 전달은 큐를 사용하거나 @ref{367d,,Pipe()} 가 반환하는 @ref{12e5,,Connection} 객체를 사용하여 수행됩니다.

However, the @code{multiprocessing.connection} module allows some extra
flexibility.  It basically gives a high level message oriented API for dealing
with sockets or Windows named pipes.  It also has support for `digest
authentication' using the @ref{6e,,hmac} module, and for polling
multiple connections at the same time.

@geindex deliver_challenge() (multiprocessing.connection 모듈)
@anchor{library/multiprocessing multiprocessing connection deliver_challenge}@anchor{36ed}
@deffn {함수} multiprocessing.connection.deliver_challenge (connection, authkey)

무작위로 생성된 메시지를 연결의 다른 쪽 끝으로 보내고 응답을 기다립니다.

응답이 `authkey' 를 키로 사용하는 메시지의 다이제스트와 일치하면 환영 메시지가 연결의 다른 끝으로 전송됩니다. 그렇지 않으면 @ref{3695,,AuthenticationError} 가 발생합니다.
@end deffn

@geindex answer_challenge() (multiprocessing.connection 모듈)
@anchor{library/multiprocessing multiprocessing connection answer_challenge}@anchor{36ee}
@deffn {함수} multiprocessing.connection.answer_challenge (connection, authkey)

메시지를 수신하고, `authkey' 를 키로 사용하여 메시지의 다이제스트를 계산한 다음, 다이제스트를 다시 보냅니다.

환영 메시지가 수신되지 않으면, @ref{3695,,AuthenticationError} 가 발생합니다.
@end deffn

@geindex Client() (multiprocessing.connection 모듈)
@anchor{library/multiprocessing multiprocessing connection Client}@anchor{36ef}
@deffn {함수} multiprocessing.connection.Client (address[, family[, authkey]])

주소 `address' 를 사용하는 리스너에 대한 연결을 설정하려고 시도하고, @ref{12e5,,Connection}을 반환합니다.

연결 유형은 `family' 인자에 의해 결정되지만, 일반적으로 `address' 형식에서 유추 할 수 있으므로 일반적으로 생략 할 수 있습니다. (@ref{36f0,,주소 형식}를 참조하세요)

If `authkey' is given and not @code{None}, it should be a byte string and will be
used as the secret key for an HMAC-based authentication challenge. No
authentication is done if `authkey' is @code{None}.
@ref{3695,,AuthenticationError} is raised if authentication fails.
See @ref{3692,,인증 키}.
@end deffn

@geindex Listener (multiprocessing.connection 클래스)
@anchor{library/multiprocessing multiprocessing connection Listener}@anchor{1a23}
@deffn {클래스} multiprocessing.connection.Listener ([address[, family[, backlog[, authkey]]]])

연결을 ‘리스닝’ 하는 바인드된 소켓이나 윈도우의 이름있는 파이프에 대한 래퍼입니다.

`address' 는 리스너 객체의 바인드된 소켓이나 이름있는 파이프가 사용할 주소입니다.

@cartouche
@quotation 참고 
주소가 ‘0.0.0.0’ 인 경우, 주소는 윈도우에서 연결 가능한 끝점이 아닙니다. 연결할 수 있는 끝점이 필요한 경우, ‘127.0.0.1’을 사용해야 합니다.
@end quotation
@end cartouche

`family' 는 사용할 소켓(또는 이름있는 파이프)의 유형입니다. 문자열 @code{'AF_INET'} (TCP 소켓), @code{'AF_UNIX'} (유닉스 도메인 소켓), @code{'AF_PIPE'} (윈도우 이름있는 파이프) 중 하나일 수 있습니다. 이 중 오직 첫 번째 것만 항상 사용할 수 있음이 보장됩니다. `family' 가 @code{None} 이면, `address' 의 형식으로부터 유추됩니다. `address' 역시 @code{None} 이면, 기본값이 선택됩니다. 이 기본값은 사용 가능한 것 중 가장 빠른 것으로 기대되는 것입니다. @ref{36f0,,주소 형식}를 참조하세요. `family' 가 @code{'AF_UNIX'} 이고 주소가 @code{None} 이면, 소켓은 @ref{2cf1,,tempfile.mkstemp()} 를 사용하여 만들어진 비공개 임시 디렉터리에 생성됩니다.

리스너 객체가 소켓을 사용하면, `backlog' (기본적으로 1) 는 소켓이 바인드되면 소켓의 @ref{105d,,listen()} 메서드에 전달됩니다.

If `authkey' is given and not @code{None}, it should be a byte string and will be
used as the secret key for an HMAC-based authentication challenge. No
authentication is done if `authkey' is @code{None}.
@ref{3695,,AuthenticationError} is raised if authentication fails.
See @ref{3692,,인증 키}.

@geindex accept() (multiprocessing.connection.Listener 메서드)
@anchor{library/multiprocessing multiprocessing connection Listener accept}@anchor{19df}
@deffn {메서드} accept ()

리스너 객체의 바인드된 소켓 또는 이름있는 파이프에 대한 연결을 수락하고 @ref{12e5,,Connection} 객체를 반환합니다. 인증이 시도되고 실패하면 @ref{3695,,AuthenticationError} 가 발생합니다.
@end deffn

@geindex close() (multiprocessing.connection.Listener 메서드)
@anchor{library/multiprocessing multiprocessing connection Listener close}@anchor{36f1}
@deffn {메서드} close ()

리스너 객체의 바운드된 소켓 또는 이름있는 파이프를 닫습니다. 리스너가 가비지 수집될 때 자동으로 호출됩니다. 그러나 명시적으로 호출하는 것이 좋습니다.
@end deffn

리스너 객체는 다음과 같은 읽기 전용 프로퍼티를 가집니다:

@geindex address (multiprocessing.connection.Listener의 속성)
@anchor{library/multiprocessing multiprocessing connection Listener address}@anchor{36f2}
@deffn {속성} address

리스너 객체에서 사용 중인 주소.
@end deffn

@geindex last_accepted (multiprocessing.connection.Listener의 속성)
@anchor{library/multiprocessing multiprocessing connection Listener last_accepted}@anchor{36f3}
@deffn {속성} last_accepted

마지막으로 수락한 연결이 온 주소. 없으면 @code{None} 입니다.
@end deffn


버전 3.3에서 변경: 리스너 객체는 컨텍스트 관리 프로토콜을 지원합니다 – @ref{240c,,컨텍스트 관리자 형}를 보세요. @ref{26ae,,__enter__()} 는 리스너 객체를 반환하고, @ref{26af,,__exit__()} 는 @ref{36f1,,close()}를 호출합니다.

@end deffn

@geindex wait() (multiprocessing.connection 모듈)
@anchor{library/multiprocessing multiprocessing connection wait}@anchor{12e4}
@deffn {함수} multiprocessing.connection.wait (object_list, timeout=None)

`object_list' 에 있는 객체가 준비될 때까지 기다립니다. `object_list' 에 있는 객체 중 준비된 것들의 리스트를 반환합니다. `timeout' 이 float면, 호출이 최대 지정된 초만큼 블록 됩니다. `timeout' 이 @code{None} 이면, 시간제한 없이 블록 됩니다. 음수 timeout은 0과 같습니다.

For both POSIX and Windows, an object can appear in `object_list' if
it is


@itemize *

@item 
읽기 가능한 @ref{12e5,,Connection} 객체;

@item 
연결되고 읽기 가능한 @ref{fa0,,socket.socket} 객체; 또는

@item 
@ref{252,,Process} 객체의 @ref{12e6,,sentinel} 어트리뷰트.
@end itemize

연결이나 소켓 객체는 읽을 수 있는 데이터가 있거나 반대편 끝이 닫히면 준비가 됩니다.

`POSIX': @code{wait(object_list, timeout)} almost equivalent
@code{select.select(object_list, [], [], timeout)}.  The difference is
that, if @ref{f9f,,select.select()} is interrupted by a signal, it can
raise @ref{2c0,,OSError} with an error number of @code{EINTR}, whereas
@code{wait()} will not.

`Windows': An item in `object_list' must either be an integer
handle which is waitable (according to the definition used by the
documentation of the Win32 function @code{WaitForMultipleObjects()})
or it can be an object with a @ref{17b4,,fileno()} method which returns a
socket handle or pipe handle.  (Note that pipe handles and socket
handles are `not' waitable handles.)


Added in version 3.3.

@end deffn

`예제'

다음 서버 코드는 인증 키로 @code{'secret password'} 를 사용하는 리스너를 만듭니다. 그런 다음 연결을 기다리고 어떤 데이터를 클라이언트로 보냅니다.:

@example
from multiprocessing.connection import Listener
from array import array

address = ('localhost', 6000)     # family is deduced to be 'AF_INET'

with Listener(address, authkey=b'secret password') as listener:
    with listener.accept() as conn:
        print('connection accepted from', listener.last_accepted)

        conn.send([2.25, None, 'junk', float])

        conn.send_bytes(b'hello')

        conn.send_bytes(array('i', [42, 1729]))
@end example

다음 코드는 서버에 연결하고 서버로부터 어떤 데이터를 받습니다:

@example
from multiprocessing.connection import Client
from array import array

address = ('localhost', 6000)

with Client(address, authkey=b'secret password') as conn:
    print(conn.recv())                  # => [2.25, None, 'junk', float]

    print(conn.recv_bytes())            # => 'hello'

    arr = array('i', [0, 0, 0, 0, 0])
    print(conn.recv_bytes_into(arr))    # => 8
    print(arr)                          # => array('i', [42, 1729, 0, 0, 0])
@end example

다음 코드는 @ref{12e4,,wait()} 을 사용하여 여러 프로세스로부터 오는 메시지를 한 번에 기다립니다:

@example
from multiprocessing import Process, Pipe, current_process
from multiprocessing.connection import wait

def foo(w):
    for i in range(10):
        w.send((i, current_process().name))
    w.close()

if __name__ == '__main__':
    readers = []

    for i in range(4):
        r, w = Pipe(duplex=False)
        readers.append(r)
        p = Process(target=foo, args=(w,))
        p.start()
        # We close the writable end of the pipe now to be sure that
        # p is the only process which owns a handle for it.  This
        # ensures that when p closes its handle for the writable end,
        # wait() will promptly report the readable end as being ready.
        w.close()

    while readers:
        for r in wait(readers):
            try:
                msg = r.recv()
            except EOFError:
                readers.remove(r)
            else:
                print(msg)
@end example

@menu
* 주소 형식:: 

@end menu

@node 주소 형식,,,리스너와 클라이언트
@anchor{library/multiprocessing address-formats}@anchor{36f4}@anchor{library/multiprocessing multiprocessing-address-formats}@anchor{36f0}
@subsubsection 주소 형식



@itemize *

@item 
@code{'AF_INET'} 주소는 @code{(hostname, port)} 형식의 튜플입니다. `hostname' 은 문자열이고, `port' 는 정수입니다.

@item 
@code{'AF_UNIX'} 주소는 파일 시스템의 파일 이름을 나타내는 문자열입니다.

@item 
An @code{'AF_PIPE'} address is a string of the form
@code{r'\\.\pipe\@var{PipeName}'}.  To use @ref{36ef,,Client()} to connect to a named
pipe on a remote computer called `ServerName' one should use an address of the
form @code{r'\\@var{ServerName}\pipe\@var{PipeName}'} instead.
@end itemize

두 개의 역 슬래시로 시작하는 문자열은 기본적으로 @code{'AF_UNIX'} 주소가 아니라 @code{'AF_PIPE'} 주소로 간주합니다.

@node 인증 키,로깅<2>,리스너와 클라이언트,레퍼런스
@anchor{library/multiprocessing authentication-keys}@anchor{36f5}@anchor{library/multiprocessing multiprocessing-auth-keys}@anchor{3692}
@subsubsection 인증 키


@ref{36b0,,Connection.recv} 를 사용할 때, 수신된 데이터는 자동으로 언 피클 됩니다. 안타깝게도, 신뢰할 수 없는 출처의 데이터를 언 피클 하는 것은 보안상의 위험입니다. 때문에 @ref{1a23,,Listener}와 @ref{36ef,,Client()} 는 @ref{6e,,hmac} 모듈을 사용하여 다이제스트 인증을 제공합니다.

인증 키는 암호로 여겨질 수 있는 바이트열입니다: 일단 연결이 이루어지면 양 끝은 다른 쪽이 인증 키를 알고 있음을 증명하도록 요구합니다. (양쪽 끝이 같은 키를 사용하고 있음을 증명하는 데는 연결을 통해 키를 보내는 것을 수반하지 `않습니다'.)

인증이 요청되었지만 인증 키가 지정되지 않으면, @code{current_process().authkey} 의 반환 값이 사용됩니다 (@ref{252,,Process} 를 보세요). 이 값은 현재 프로세스가 생성하는 @code{Process} 객체에 의해 자동으로 상속됩니다. 이것은 다중 프로세스 프로그램의 모든 프로세스는 (기본적으로) 자신들 간의 연결을 설정할 때 사용할 수 있는 하나의 인증 키를 공유한다는 것을 뜻합니다.

적절한 인증 키는 @ref{745,,os.urandom()} 을 사용하여 생성할 수도 있습니다.

@node 로깅<2>,The multiprocessing dummy module,인증 키,레퍼런스
@anchor{library/multiprocessing logging}@anchor{36f6}
@subsubsection 로깅


로깅에 대한 일부 지원이 제공됩니다. 그러나, @ref{8b,,logging} 패키지는 프로세스 공유 록을 사용하지 않으므로 (처리기형에 따라) 다른 프로세스의 메시지가 뒤섞일 가능성이 있습니다.

@geindex get_logger() (multiprocessing 모듈)
@anchor{library/multiprocessing multiprocessing get_logger}@anchor{3247}
@deffn {함수} multiprocessing.get_logger ()

Returns the logger used by @code{multiprocessing}.  If necessary, a new one
will be created.

When first created the logger has level @ref{3181,,logging.NOTSET} and no
default handler. Messages sent to this logger will not by default propagate
to the root logger.

윈도우에서 자식 프로세스는 부모 프로세스의 로거의 수준만 상속받습니다 – 그 밖의 다른 로거 사용자 지정은 상속되지 않습니다.
@end deffn

@geindex log_to_stderr() (multiprocessing 모듈)
@anchor{library/multiprocessing multiprocessing log_to_stderr}@anchor{36f7}
@deffn {함수} multiprocessing.log_to_stderr (level=None)

This function performs a call to @ref{3247,,get_logger()} but in addition to
returning the logger created by get_logger, it adds a handler which sends
output to @ref{b33,,sys.stderr} using format
@code{'[%(levelname)s/%(processName)s] %(message)s'}.
You can modify @code{levelname} of the logger by passing a @code{level} argument.
@end deffn

다음은 로깅이 켜져 있는 예제 세션입니다:

@example
>>> import multiprocessing, logging
>>> logger = multiprocessing.log_to_stderr()
>>> logger.setLevel(logging.INFO)
>>> logger.warning('doomed')
[WARNING/MainProcess] doomed
>>> m = multiprocessing.Manager()
[INFO/SyncManager-...] child process calling self.run()
[INFO/SyncManager-...] created temp directory /.../pymp-...
[INFO/SyncManager-...] manager serving at '/.../listener-...'
>>> del m
[INFO/MainProcess] sending shutdown message to manager
[INFO/SyncManager-...] manager exiting with exitcode 0
@end example

로깅 수준의 전체 표는 @ref{8b,,logging} 모듈을 참조하십시오.

@node The multiprocessing dummy module,,로깅<2>,레퍼런스
@anchor{library/multiprocessing module-multiprocessing dummy}@anchor{9a}@anchor{library/multiprocessing the-multiprocessing-dummy-module}@anchor{36f8}
@subsubsection The @code{multiprocessing.dummy} module


@geindex module; multiprocessing.dummy

@code{multiprocessing.dummy} replicates the API of @code{multiprocessing} but is
no more than a wrapper around the @ref{f3,,threading} module.

In particular, the @code{Pool} function provided by @code{multiprocessing.dummy}
returns an instance of @ref{1cd1,,ThreadPool}, which is a subclass of
@ref{116a,,Pool} that supports all the same method calls but uses a pool of
worker threads rather than worker processes.

@geindex ThreadPool (multiprocessing.pool 클래스)
@anchor{library/multiprocessing multiprocessing pool ThreadPool}@anchor{1cd1}
@deffn {클래스} multiprocessing.pool.ThreadPool ([processes[, initializer[, initargs]]])

작업을 제출할 수 있는 작업자 스레드 풀을 제어하는 스레드 풀 객체. @ref{1cd1,,ThreadPool} 인스턴스는 @ref{116a,,Pool} 인스턴스와 완전히 호환되며, 해당 리소스는 컨텍스트 관리자로 풀을 사용하거나 @ref{36e2,,close()}와 @ref{36e3,,terminate()}를 수동으로 호출하여 적절하게 관리해야 합니다.

`processes' is the number of worker threads to use.  If `processes' is
@code{None} then the number returned by @ref{51d,,os.process_cpu_count()} is used.

`initializer' 가 @code{None} 이 아니면, 각 작업자 프로세스는 시작할 때 @code{initializer(*initargs)} 를 호출합니다.

@ref{116a,,Pool}과 달리, `maxtasksperchild'와 `context'는 제공할 수 없습니다.

@cartouche
@quotation 참고 
@ref{1cd1,,ThreadPool}은 프로세스 풀을 중심으로 설계되고 @ref{24,,concurrent.futures} 모듈 도입 이전에 설계된 @ref{116a,,Pool}과 같은 인터페이스를 공유합니다. 따라서, 스레드가 지원하는 풀에 적합하지 않은 일부 연산을 상속하고, 비동기 작업의 상태를 나타내는 자체 형 @ref{36e4,,AsyncResult}를 가지고 있는데 다른 라이브러리에서는 이해하지 못합니다.

사용자는 일반적으로 처음부터 스레드를 중심으로 설계되고 @ref{b,,asyncio}를 포함한 다른 많은 라이브러리와 호환되는 @ref{13b7,,concurrent.futures.Future} 인스턴스를 반환하는 더 간단한 인터페이스를 가진 @ref{948,,concurrent.futures.ThreadPoolExecutor}를 사용하는 것을 선호해야 합니다.
@end quotation
@end cartouche
@end deffn

@node 프로그래밍 지침,예제<12>,레퍼런스,multiprocessing — Process-based parallelism
@anchor{library/multiprocessing multiprocessing-programming}@anchor{3679}@anchor{library/multiprocessing programming-guidelines}@anchor{36f9}
@subsubsection 프로그래밍 지침


There are certain guidelines and idioms which should be adhered to when using
@code{multiprocessing}.

@menu
* 모든 시작 방법:: 
* spawn 과 forkserver 시작 방법:: 

@end menu

@node 모든 시작 방법,spawn 과 forkserver 시작 방법,,프로그래밍 지침
@anchor{library/multiprocessing all-start-methods}@anchor{36fa}
@subsubsection 모든 시작 방법


다음은 모든 시작 방법에 적용됩니다.

공유 상태를 피하세요

@quotation

가능한 한 프로세스 간에 많은 양의 데이터가 이동하지 않도록 해야 합니다.

저수준 동기화 프리미티브를 사용하기보다, 프로세스 간 통신을 위해 큐나 파이프를 사용하는 것이 아마도 최선입니다.
@end quotation

피클 가능성

@quotation

프락시 메서드에 대한 인자가 피클 가능한지 확인하십시오.
@end quotation

프락시의 스레드 안전성

@quotation

록으로 보호하지 않는 한 둘 이상의 스레드에서 프락시 객체를 사용하지 마십시오.

(여러 프로세스가 `같은' 프락시를 사용하는 문제는 존재하지 않습니다.)
@end quotation

좀비 프로세스 조인하기

@quotation

On POSIX when a process finishes but has not been joined it becomes a zombie.
There should never be very many because each time a new process starts (or
@ref{36aa,,active_children()} is called) all completed processes
which have not yet been joined will be joined.  Also calling a finished
process’s @ref{1597,,Process.is_alive} will
join the process.  Even so it is probably good
practice to explicitly join all the processes that you start.
@end quotation

피클/언 피클보다 상속하는 것이 더 좋습니다.

@quotation

When using the `spawn' or `forkserver' start methods many types
from @code{multiprocessing} need to be picklable so that child
processes can use them.  However, one should generally avoid
sending shared objects to other processes using pipes or queues.
Instead you should arrange the program so that a process which
needs access to a shared resource created elsewhere can inherit it
from an ancestor process.
@end quotation

프로세스 강제 종료를 피하세요

@quotation

@ref{185a,,Process.terminate} 메서드를 사용해서 프로세스를 정지시키는 것은, 그 프로세스가 현재 사용하고 있는 공유 자원(가령 록, 세마포어, 파이프, 큐)을 손상하거나 다른 프로세스에서 사용할 수 없게 만들 수 있습니다.

따라서, 아마도 어떤 공유 자원도 사용하지 않는 프로세스에만 @ref{185a,,Process.terminate} 사용을 고려하는 것이 최선일 겁니다.
@end quotation

큐를 사용하는 프로세스 조인하기

@quotation

큐에 항목을 넣은 프로세스는 종료되기 전에 버퍼링 된 모든 항목이 “피더” 스레드에 의해 하부 파이프로 공급될 때까지 대기합니다. (자식 프로세스는 @ref{36a0,,Queue.cancel_join_thread} 메서드를 호출해서 이 동작을 회피할 수 있습니다.)

이것은, 큐를 사용할 때마다 큐에 넣은 모든 항목이 결국 프로세스가 조인되기 전에 제거되도록 해야 함을 의미합니다. 그렇지 않으면 큐에 항목을 넣은 프로세스가 종료되리라고 보장할 수 없습니다. 데몬이 아닌 프로세스가 자동으로 조인된다는 것도 기억하세요.

교착 상태에 빠지는 예는 다음과 같습니다:

@example
from multiprocessing import Process, Queue

def f(q):
    q.put('X' * 1000000)

if __name__ == '__main__':
    queue = Queue()
    p = Process(target=f, args=(queue,))
    p.start()
    p.join()                    # this deadlocks
    obj = queue.get()
@end example

이 문제를 고치는 방법은 마지막 두 줄의 순서를 바꾸는 것입니다 (또는 간단히 @code{p.join()} 줄을 지우는 것입니다).
@end quotation

자식 프로세스에 자원을 명시적으로 전달하세요.

@quotation

On POSIX using the `fork' start method, a child process can make
use of a shared resource created in a parent process using a
global resource.  However, it is better to pass the object as an
argument to the constructor for the child process.

윈도우 및 다른 시작 방법과 (잠재적으로) 호환될 수 있는 코드를 만드는 것 외에도, 이것은 자식 프로세스가 아직 살아있는 동안 객체가 부모 프로세스에서 가비지 수집되지 않음을 보장합니다. 부모 프로세스에서 그 객체가 가비지 수집될 때 일부 자원이 해제되면 이것이 중요 할 수 있습니다.

그래서 예를 들면

@example
from multiprocessing import Process, Lock

def f():
    ... do something using "lock" ...

if __name__ == '__main__':
    lock = Lock()
    for i in range(10):
        Process(target=f).start()
@end example

는 다음과 같이 다시 써야 합니다

@example
from multiprocessing import Process, Lock

def f(l):
    ... do something using "l" ...

if __name__ == '__main__':
    lock = Lock()
    for i in range(10):
        Process(target=f, args=(lock,)).start()
@end example
@end quotation

@ref{75e,,sys.stdin} 을 “파일류 객체”로 교체할 때 조심하세요

@quotation

@code{multiprocessing} originally unconditionally called:

@example
os.close(sys.stdin.fileno())
@end example

@code{multiprocessing.Process._bootstrap()} 메서드에서 하는 작업입니다 — 이것은 손자 프로세스와 관련된 문제로 이어졌습니다. 이것은 다음과 같이 변경되었습니다:

@example
sys.stdin.close()
sys.stdin = open(os.open(os.devnull, os.O_RDONLY), closefd=False)
@end example

Which solves the fundamental issue of processes colliding with each other
resulting in a bad file descriptor error, but introduces a potential danger
to applications which replace @ref{75e,,sys.stdin()} with a “file-like object”
with output buffering.  This danger is that if multiple processes call
@ref{505,,close()} on this file-like object, it could result in the same
data being flushed to the object multiple times, resulting in corruption.

파일류 객체를 작성하고 여러분 자신의 캐싱을 구현하면, 캐시에 추가할 때마다 pid를 저장하고, pid가 변경되면 캐시를 버려서 포크에 안전하게 만들 수 있습니다. 예를 들면:

@example
@@property
def cache(self):
    pid = os.getpid()
    if pid != self._pid:
        self._pid = pid
        self._cache = []
    return self._cache
@end example

자세한 내용은 bpo-5155@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5155}, bpo-5313@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5313} 및 bpo-5331@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=5331}을 참조하십시오.
@end quotation
@anchor{library/multiprocessing multiprocessing-programming-spawn}@anchor{368e}
@node spawn 과 forkserver 시작 방법,,모든 시작 방법,프로그래밍 지침
@anchor{library/multiprocessing multiprocessing-programming-forkserver}@anchor{1d9}@anchor{library/multiprocessing the-spawn-and-forkserver-start-methods}@anchor{36fb}
@subsubsection `spawn' 과 `forkserver' 시작 방법


There are a few extra restrictions which don’t apply to the `fork'
start method.

더 높은 피클 가능성

@quotation

Ensure that all arguments to @ref{252,,Process} are
picklable.  Also, if you subclass @code{Process.__init__}, you must make sure
that instances will be picklable when the
@ref{1596,,Process.start} method is called.
@end quotation

전역 변수

@quotation

자식 프로세스에서 실행되는 코드가 전역 변수에 접근하려고 시도하면, 그 값은 (있는 경우) @ref{1596,,Process.start} 가 호출되는 시점의 부모 프로세스의 값과 같지 않을 수 있습니다.

하지만, 모듈 수준의 상수인 전역 변수는 문제가 되지 않습니다.
@end quotation
@anchor{library/multiprocessing multiprocessing-safe-main-import}@anchor{36fc}
메인 모듈의 안전한 임포트

@quotation

Make sure that the main module can be safely imported by a new Python
interpreter without causing unintended side effects (such as starting a new
process).

예를 들어, `spawn' 또는 `forkserver' 시작 방법을 사용해서 다음 모듈을 실행하면 @ref{244,,RuntimeError} 로 실패합니다:

@example
from multiprocessing import Process

def foo():
    print('hello')

p = Process(target=foo)
p.start()
@end example

대신 다음과 같이 @code{if __name__ == '__main__':} 을 사용하여 프로그램의 “진입 지점”을 보호해야 합니다:

@example
from multiprocessing import Process, freeze_support, set_start_method

def foo():
    print('hello')

if __name__ == '__main__':
    freeze_support()
    set_start_method('spawn')
    p = Process(target=foo)
    p.start()
@end example

(@code{freeze_support()} 줄은 프로그램이 프로즌 되지 않고 정상적으로 실행될 경우 생략될 수 있습니다.)

이것은 새로 스폰 된 파이썬 인터프리터가 모듈을 안전하게 임포트 한 다음 모듈의 @code{foo()} 함수를 실행할 수 있게 해줍니다.

메인 모듈에서 풀이나 관리자를 만들면 비슷한 제한이 적용됩니다.
@end quotation

@node 예제<12>,,프로그래밍 지침,multiprocessing — Process-based parallelism
@anchor{library/multiprocessing examples}@anchor{36fd}@anchor{library/multiprocessing multiprocessing-examples}@anchor{36a1}
@subsubsection 예제


사용자 정의된 관리자와 프락시를 만들고 사용하는 방법에 대한 시연:

@example
from multiprocessing import freeze_support
from multiprocessing.managers import BaseManager, BaseProxy
import operator

##

class Foo:
    def f(self):
        print('you called Foo.f()')
    def g(self):
        print('you called Foo.g()')
    def _h(self):
        print('you called Foo._h()')

# A simple generator function
def baz():
    for i in range(10):
        yield i*i

# Proxy type for generator objects
class GeneratorProxy(BaseProxy):
    _exposed_ = ['__next__']
    def __iter__(self):
        return self
    def __next__(self):
        return self._callmethod('__next__')

# Function to return the operator module
def get_operator_module():
    return operator

##

class MyManager(BaseManager):
    pass

# register the Foo class; make `f()` and `g()` accessible via proxy
MyManager.register('Foo1', Foo)

# register the Foo class; make `g()` and `_h()` accessible via proxy
MyManager.register('Foo2', Foo, exposed=('g', '_h'))

# register the generator function baz; use `GeneratorProxy` to make proxies
MyManager.register('baz', baz, proxytype=GeneratorProxy)

# register get_operator_module(); make public functions accessible via proxy
MyManager.register('operator', get_operator_module)

##

def test():
    manager = MyManager()
    manager.start()

    print('-' * 20)

    f1 = manager.Foo1()
    f1.f()
    f1.g()
    assert not hasattr(f1, '_h')
    assert sorted(f1._exposed_) == sorted(['f', 'g'])

    print('-' * 20)

    f2 = manager.Foo2()
    f2.g()
    f2._h()
    assert not hasattr(f2, 'f')
    assert sorted(f2._exposed_) == sorted(['g', '_h'])

    print('-' * 20)

    it = manager.baz()
    for i in it:
        print('<%d>' % i, end=' ')
    print()

    print('-' * 20)

    op = manager.operator()
    print('op.add(23, 45) =', op.add(23, 45))
    print('op.pow(2, 94) =', op.pow(2, 94))
    print('op._exposed_ =', op._exposed_)

##

if __name__ == '__main__':
    freeze_support()
    test()
@end example

@ref{116a,,Pool} 사용하기:

@example
import multiprocessing
import time
import random
import sys

#
# Functions used by test code
#

def calculate(func, args):
    result = func(*args)
    return '%s says that %s%s = %s' % (
        multiprocessing.current_process().name,
        func.__name__, args, result
        )

def calculatestar(args):
    return calculate(*args)

def mul(a, b):
    time.sleep(0.5 * random.random())
    return a * b

def plus(a, b):
    time.sleep(0.5 * random.random())
    return a + b

def f(x):
    return 1.0 / (x - 5.0)

def pow3(x):
    return x ** 3

def noop(x):
    pass

#
# Test code
#

def test():
    PROCESSES = 4
    print('Creating pool with %d processes\n' % PROCESSES)

    with multiprocessing.Pool(PROCESSES) as pool:
        #
        # Tests
        #

        TASKS = [(mul, (i, 7)) for i in range(10)] + \
                [(plus, (i, 8)) for i in range(10)]

        results = [pool.apply_async(calculate, t) for t in TASKS]
        imap_it = pool.imap(calculatestar, TASKS)
        imap_unordered_it = pool.imap_unordered(calculatestar, TASKS)

        print('Ordered results using pool.apply_async():')
        for r in results:
            print('\t', r.get())
        print()

        print('Ordered results using pool.imap():')
        for x in imap_it:
            print('\t', x)
        print()

        print('Unordered results using pool.imap_unordered():')
        for x in imap_unordered_it:
            print('\t', x)
        print()

        print('Ordered results using pool.map() --- will block till complete:')
        for x in pool.map(calculatestar, TASKS):
            print('\t', x)
        print()

        #
        # Test error handling
        #

        print('Testing error handling:')

        try:
            print(pool.apply(f, (5,)))
        except ZeroDivisionError:
            print('\tGot ZeroDivisionError as expected from pool.apply()')
        else:
            raise AssertionError('expected ZeroDivisionError')

        try:
            print(pool.map(f, list(range(10))))
        except ZeroDivisionError:
            print('\tGot ZeroDivisionError as expected from pool.map()')
        else:
            raise AssertionError('expected ZeroDivisionError')

        try:
            print(list(pool.imap(f, list(range(10)))))
        except ZeroDivisionError:
            print('\tGot ZeroDivisionError as expected from list(pool.imap())')
        else:
            raise AssertionError('expected ZeroDivisionError')

        it = pool.imap(f, list(range(10)))
        for i in range(10):
            try:
                x = next(it)
            except ZeroDivisionError:
                if i == 5:
                    pass
            except StopIteration:
                break
            else:
                if i == 5:
                    raise AssertionError('expected ZeroDivisionError')

        assert i == 9
        print('\tGot ZeroDivisionError as expected from IMapIterator.next()')
        print()

        #
        # Testing timeouts
        #

        print('Testing ApplyResult.get() with timeout:', end=' ')
        res = pool.apply_async(calculate, TASKS[0])
        while 1:
            sys.stdout.flush()
            try:
                sys.stdout.write('\n\t%s' % res.get(0.02))
                break
            except multiprocessing.TimeoutError:
                sys.stdout.write('.')
        print()
        print()

        print('Testing IMapIterator.next() with timeout:', end=' ')
        it = pool.imap(calculatestar, TASKS)
        while 1:
            sys.stdout.flush()
            try:
                sys.stdout.write('\n\t%s' % it.next(0.02))
            except StopIteration:
                break
            except multiprocessing.TimeoutError:
                sys.stdout.write('.')
        print()
        print()


if __name__ == '__main__':
    multiprocessing.freeze_support()
    test()
@end example

큐를 사용하여 작업을 작업자 프로세스 집단에 제공하고 결과를 수집하는 방법을 보여주는 예:

@example
import time
import random

from multiprocessing import Process, Queue, current_process, freeze_support

#
# Function run by worker processes
#

def worker(input, output):
    for func, args in iter(input.get, 'STOP'):
        result = calculate(func, args)
        output.put(result)

#
# Function used to calculate result
#

def calculate(func, args):
    result = func(*args)
    return '%s says that %s%s = %s' % \
        (current_process().name, func.__name__, args, result)

#
# Functions referenced by tasks
#

def mul(a, b):
    time.sleep(0.5*random.random())
    return a * b

def plus(a, b):
    time.sleep(0.5*random.random())
    return a + b

#
#
#

def test():
    NUMBER_OF_PROCESSES = 4
    TASKS1 = [(mul, (i, 7)) for i in range(20)]
    TASKS2 = [(plus, (i, 8)) for i in range(10)]

    # Create queues
    task_queue = Queue()
    done_queue = Queue()

    # Submit tasks
    for task in TASKS1:
        task_queue.put(task)

    # Start worker processes
    for i in range(NUMBER_OF_PROCESSES):
        Process(target=worker, args=(task_queue, done_queue)).start()

    # Get and print results
    print('Unordered results:')
    for i in range(len(TASKS1)):
        print('\t', done_queue.get())

    # Add more tasks using `put()`
    for task in TASKS2:
        task_queue.put(task)

    # Get and print some more results
    for i in range(len(TASKS2)):
        print('\t', done_queue.get())

    # Tell child processes to stop
    for i in range(NUMBER_OF_PROCESSES):
        task_queue.put('STOP')


if __name__ == '__main__':
    freeze_support()
    test()
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node multiprocessing shared_memory — 프로세스 간 직접 액세스를 위한 공유 메모리,concurrent 패키지,multiprocessing — Process-based parallelism,동시 실행
@anchor{library/multiprocessing shared_memory doc}@anchor{36fe}@anchor{library/multiprocessing shared_memory module-multiprocessing shared_memory}@anchor{9d}@anchor{library/multiprocessing shared_memory multiprocessing-shared-memory-shared-memory-for-direct-access-across-processes}@anchor{36ff}@anchor{library/multiprocessing shared_memory translation-repo}@anchor{3700}
@subsection @code{multiprocessing.shared_memory} — 프로세스 간 직접 액세스를 위한 공유 메모리


@geindex module; multiprocessing.shared_memory

`소스 코드:' Lib/multiprocessing/shared_memory.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/multiprocessing/shared_memory.py}


Added in version 3.8.


@geindex 공유 메모리
@geindex POSIX 공유 메모리
@geindex 이름 지정 공유 메모리


__________________________________________________________________


이 모듈은 멀티 코어나 대칭 멀티 프로세서 (SMP) 기계에서 하나 이상의 프로세스가 액세스할 공유 메모리의 할당과 관리를 위한 클래스 @ref{19d8,,SharedMemory}를 제공합니다. 특히 별개의 프로세스에 걸친 공유 메모리의 수명 주기 관리를 지원하기 위해, @ref{36c8,,BaseManager} 서브 클래스인 @ref{3701,,SharedMemoryManager}도 @ref{9b,,multiprocessing.managers} 모듈에서 제공됩니다.

이 모듈에서, 공유 메모리는 “POSIX 스타일” 공유 메모리 블록을 가리키며 (꼭 그런 식으로 구현돼야 할 필요는 없습니다), “분산 공유 메모리”를 가리키지는 않습니다. 이 스타일의 공유 메모리는 개별 프로세스가 잠재적으로 휘발성 메모리의 공통 (또는 공유) 영역을 읽고 쓸 수 있게 합니다. 프로세스는 일반적으로 자체 프로세스 메모리 공간에만 액세스 할 수 있도록 제한되지만, 공유 메모리는 프로세스 간에 데이터를 공유 할 수 있도록 해서, 프로세스 간에 대신 해당 데이터가 포함된 메시지를 보낼 필요가 없도록 합니다. 메모리를 통해 직접 데이터를 공유하면 디스크나 소켓 또는 직렬화/역 직렬화와 데이터의 복사를 요구하는 다른 통신과 비교하여 상당한 성능상의 이점을 얻을 수 있습니다.

@geindex SharedMemory (multiprocessing.shared_memory 클래스)
@anchor{library/multiprocessing shared_memory multiprocessing shared_memory SharedMemory}@anchor{19d8}
@deffn {클래스} multiprocessing.shared_memory.SharedMemory (name=None, create=False, size=0, *, track=True)

새 공유 메모리 블록을 만들거나 기존 공유 메모리 블록에 연결하기 위해 @code{SharedMemory} 클래스의 인스턴스를 만듭니다. 각 공유 메모리 블록에는 고유한 이름이 지정됩니다. 이런 식으로, 하나의 프로세스가 특정 이름을 가진 공유 메모리 블록을 생성 할 수 있으며, 다른 프로세스가 같은 이름을 사용하여 같은 공유 메모리 블록에 연결할 수 있습니다.

프로세스 간에 데이터를 공유하기 위한 자원으로서, 공유 메모리 블록은 생성한 원래 프로세스보다 오래갈 수 있습니다. 한 프로세스가 더는 다른 프로세스가 필요로 할 수도 있는 공유 메모리 블록에 대한 액세스를 필요로하지 않으면 @ref{3702,,close()} 메서드를 호출해야 합니다. 어떤 프로세스에서도 공유 메모리 블록이 더는 필요하지 않으면, 적절한 정리를 위해 @ref{3703,,unlink()} 메서드를 호출해야 합니다.

@*매개변수: 

@itemize *

@item 
@code{name} (@ref{169,,str}@code{ | }@code{None}) – 문자열로 지정된, 요청된 공유 메모리의 고유한 이름. 새 공유 메모리 블록을 만들 때, 이름에 @code{None}(기본값)이 제공되면, 새로운 이름이 생성됩니다.

@item 
@code{create} (@ref{3c3,,bool}) – 새 공유 메모리 블록을 만들지(@code{True}), 또는 기존 공유 메모리 블록을 연결할지(@code{False})를 제어합니다.

@item 
@code{size} (@ref{19b,,int}) – 새 공유 메모리 블록을 만들 때 요청된 바이트 수. 일부 플랫폼은 해당 플랫폼의 메모리 페이지 크기를 기반으로 메모리 덩어리를 할당하기 때문에, 공유 메모리 블록의 정확한 크기는 요청한 크기보다 크거나 같을 수 있습니다. 기존 공유 메모리 블록에 연결할 때는, `size' 매개 변수가 무시됩니다.

@item 
@code{track} (@ref{3c3,,bool}) – When @code{True}, register the shared memory block with a resource
tracker process on platforms where the OS does not do this automatically.
The resource tracker ensures proper cleanup of the shared memory even
if all other processes with access to the memory exit without doing so.
Python processes created from a common ancestor using @ref{98,,multiprocessing}
facilities share a single resource tracker process, and the lifetime of
shared memory segments is handled automatically among these processes.
Python processes created in any other way will receive their own
resource tracker when accessing shared memory with `track' enabled.
This will cause the shared memory to be deleted by the resource tracker
of the first process that terminates.
To avoid this issue, users of @ref{dc,,subprocess} or standalone Python
processes should set `track' to @code{False} when there is already another
process in place that does the bookkeeping.
`track' is ignored on Windows, which has its own tracking and
automatically deletes shared memory when all handles to it have been closed.
@end itemize



버전 3.13에서 변경: Added the `track' parameter.


@geindex close() (multiprocessing.shared_memory.SharedMemory 메서드)
@anchor{library/multiprocessing shared_memory multiprocessing shared_memory SharedMemory close}@anchor{3702}
@deffn {메서드} close ()

Close the file descriptor/handle to the shared memory from this
instance.  @code{close()} should be called once access to the shared
memory block from this instance is no longer needed.  Depending
on operating system, the underlying memory may or may not be freed
even if all handles to it have been closed.  To ensure proper cleanup,
use the @ref{3703,,unlink()} method.
@end deffn

@geindex unlink() (multiprocessing.shared_memory.SharedMemory 메서드)
@anchor{library/multiprocessing shared_memory multiprocessing shared_memory SharedMemory unlink}@anchor{3703}
@deffn {메서드} unlink ()

Delete the underlying shared memory block.  This should be called only
once per shared memory block regardless of the number of handles to it,
even in other processes.
@code{unlink()} and @ref{3702,,close()} can be called in any order, but
trying to access data inside a shared memory block after @code{unlink()}
may result in memory access errors, depending on platform.

This method has no effect on Windows, where the only way to delete a
shared memory block is to close all handles.
@end deffn

@geindex buf (multiprocessing.shared_memory.SharedMemory의 속성)
@anchor{library/multiprocessing shared_memory multiprocessing shared_memory SharedMemory buf}@anchor{3704}
@deffn {속성} buf

공유 메모리 블록의 내용에 대한 메모리 뷰.
@end deffn

@geindex name (multiprocessing.shared_memory.SharedMemory의 속성)
@anchor{library/multiprocessing shared_memory multiprocessing shared_memory SharedMemory name}@anchor{3705}
@deffn {속성} name

공유 메모리 블록의 고유한 이름에 대한 읽기 전용 액세스.
@end deffn

@geindex size (multiprocessing.shared_memory.SharedMemory의 속성)
@anchor{library/multiprocessing shared_memory multiprocessing shared_memory SharedMemory size}@anchor{3706}
@deffn {속성} size

공유 메모리 블록의 크기(바이트)에 대한 읽기 전용 액세스.
@end deffn
@end deffn

다음 예제는 @ref{19d8,,SharedMemory} 인스턴스의 저수준 사용을 보여줍니다:

@example
>>> from multiprocessing import shared_memory
>>> shm_a = shared_memory.SharedMemory(create=True, size=10)
>>> type(shm_a.buf)
<class 'memoryview'>
>>> buffer = shm_a.buf
>>> len(buffer)
10
>>> buffer[:4] = bytearray([22, 33, 44, 55])  # 여러 바이트를 한 번에 수정합니다
>>> buffer[4] = 100                           # 한 번에 한 바이트씩 수정합니다
>>> # 기존 공유 메모리 블록에 연결합니다
>>> shm_b = shared_memory.SharedMemory(shm_a.name)
>>> import array
>>> array.array('b', shm_b.buf[:5])  # 새 array.array로 데이터를 복사합니다
array('b', [22, 33, 44, 55, 100])
>>> shm_b.buf[:5] = b'howdy'  # shm_b를 통해 bytes를 사용해서 수정합니다
>>> bytes(shm_a.buf[:5])      # shm_a를 통해 액세스합니다
b'howdy'
>>> shm_b.close()   # 각 SharedMemory 인스턴스를 닫습니다
>>> shm_a.close()
>>> shm_a.unlink()  # 공유 메모리를 해제하기 위해 오직 한 번만 unlink를 호출합니다
@end example

다음 예제는 두 개의 다른 파이썬 셸에서 같은 @code{numpy.ndarray}에 액세스하는, NumPy 배열@footnote{https://numpy.org/}과 함께 @ref{19d8,,SharedMemory} 클래스를 사용하는 실용적인 방법을 보여줍니다:

@example
>>> # 첫 번째 파이썬 대화형 셸에서
>>> import numpy as np
>>> a = np.array([1, 1, 2, 3, 5, 8])  # 기존 NumPy 배열로 시작합니다
>>> from multiprocessing import shared_memory
>>> shm = shared_memory.SharedMemory(create=True, size=a.nbytes)
>>> # 이제 공유 메모리에 NumPy 배열을 만듭니다
>>> b = np.ndarray(a.shape, dtype=a.dtype, buffer=shm.buf)
>>> b[:] = a[:]  # 원래 데이터를 공유 메모리로 복사합니다
>>> b
array([1, 1, 2, 3, 5, 8])
>>> type(b)
<class 'numpy.ndarray'>
>>> type(a)
<class 'numpy.ndarray'>
>>> shm.name  # 이름을 지정하지 않았으므로, 우리를 위해 이름이 선택되었습니다
'psm_21467_46075'

>>> # 같은 셸이나 같은 기계 상의 새로운 파이썬 셀에서
>>> import numpy as np
>>> from multiprocessing import shared_memory
>>> # 기존 공유 메모리 블록에 연결합니다
>>> existing_shm = shared_memory.SharedMemory(name='psm_21467_46075')
>>> # 이 예제에서 a.shape은 (6,)이고 a.dtype은 np.int64 입니다
>>> c = np.ndarray((6,), dtype=np.int64, buffer=existing_shm.buf)
>>> c
array([1, 1, 2, 3, 5, 8])
>>> c[-1] = 888
>>> c
array([  1,   1,   2,   3,   5, 888])

>>> # 첫 번째 파이썬 대화형 셸로 돌아가면, b가 이 변경을 반영합니다
>>> b
array([  1,   1,   2,   3,   5, 888])

>>> # 두 번째 파이썬 셀 내에서 정리합니다
>>> del c  # 필요 없습니다; 단순히 배열이 더는 사용되지 않는다는 것을 강조하기 위함입니다
>>> existing_shm.close()

>>> # 첫 번째 파이썬 셀 내에서 정리합니다
>>> del b  # 필요 없습니다; 단순히 배열이 더는 사용되지 않는다는 것을 강조하기 위함입니다
>>> shm.close()
>>> shm.unlink()  # 제일 끝에서 공유 메모리 블록을 해제하고 반납합니다
@end example

@geindex SharedMemoryManager (multiprocessing.managers 클래스)
@anchor{library/multiprocessing shared_memory multiprocessing managers SharedMemoryManager}@anchor{3701}
@deffn {클래스} multiprocessing.managers.SharedMemoryManager ([address[, authkey]])

프로세스 간 공유 메모리 블록을 관리하는 데 사용할 수 있는 @ref{36c8,,multiprocessing.managers.BaseManager}의 서브 클래스.

@code{SharedMemoryManager} 인스턴스에서 @ref{36c9,,start()}를 호출하면 새 프로세스가 시작됩니다. 이 새로운 프로세스의 유일한 목적은 이를 통해 생성된 모든 공유 메모리 블록의 수명 주기를 관리하는 것입니다. 해당 프로세스가 관리하는 모든 공유 메모리 블록의 해제를 시작시키려면, 해당 인스턴스에서 @ref{36ca,,shutdown()}을 호출하십시오. 그러면 이 프로세스에 의해 관리되는 모든 @ref{3707,,SharedMemory} 객체에 대해 @ref{3703,,unlink()} 호출을 일으키고, 그런 다음 프로세스 자체를 중지합니다. @code{SharedMemoryManager}를 통해 @code{SharedMemory} 인스턴스를 생성함으로써, 공유 메모리 자원을 수동으로 추적하여 해제할 필요가 없습니다.

이 클래스는 @ref{3707,,SharedMemory} 인스턴스를 만들고 반환하는 메서드와, 공유 메모리로 지원되는 리스트류 객체(@ref{3708,,ShareableList})를 만드는 메서드를 제공합니다.

상속된 `address'와 `authkey' 선택적 입력 인자에 대한 설명과 이 인자를 사용하여 다른 프로세스의 기존 @code{SharedMemoryManager} 서비스에 연결하는 방법에 대해서는 @ref{36c8,,BaseManager}를 참조하십시오.

@geindex SharedMemory() (multiprocessing.managers.SharedMemoryManager 메서드)
@anchor{library/multiprocessing shared_memory multiprocessing managers SharedMemoryManager SharedMemory}@anchor{3707}
@deffn {메서드} SharedMemory (size)

바이트로 지정된 `size' 크기의 새로운 @ref{3707,,SharedMemory} 객체를 만들고 반환합니다.
@end deffn

@geindex ShareableList() (multiprocessing.managers.SharedMemoryManager 메서드)
@anchor{library/multiprocessing shared_memory multiprocessing managers SharedMemoryManager ShareableList}@anchor{3708}
@deffn {메서드} ShareableList (sequence)

입력 `sequence'의 값으로 초기화된, 새 @ref{3708,,ShareableList} 객체를 만들고 반환합니다.
@end deffn
@end deffn

다음 예제는 @ref{3701,,SharedMemoryManager}의 기본 메커니즘을 보여줍니다:

@example
>>> from multiprocessing.managers import SharedMemoryManager
>>> smm = SharedMemoryManager()
>>> smm.start()  # 공유 메모리 블록을 관리하는 프로세스를 시작합니다
>>> sl = smm.ShareableList(range(4))
>>> sl
ShareableList([0, 1, 2, 3], name='psm_6572_7512')
>>> raw_shm = smm.SharedMemory(size=128)
>>> another_sl = smm.ShareableList('alpha')
>>> another_sl
ShareableList(['a', 'l', 'p', 'h', 'a'], name='psm_6572_12221')
>>> smm.shutdown()  # sl, raw_shm, 및 another_sl 에 대해 unlink()를 호출합니다
@end example

다음 예제는 @ref{186,,with} 문을 통해 @ref{3701,,SharedMemoryManager} 객체를 사용하여 더는 필요하지 않은 모든 공유 메모리 블록이 해제되도록 하는, 잠재적으로 더 편리한 패턴을 보여줍니다:

@example
>>> with SharedMemoryManager() as smm:
...     sl = smm.ShareableList(range(2000))
...     # 작업을 두 프로세스로 나누고, 부분적인 결과를 sl에 저장합니다
...     p1 = Process(target=do_work, args=(sl, 0, 1000))
...     p2 = Process(target=do_work, args=(sl, 1000, 2000))
...     p1.start()
...     p2.start()  # multiprocessing.Pool이 더 효율적일 수 있습니다
...     p1.join()
...     p2.join()   # 두 프로세스가 모두 작업을 끝낼 때까지 기다립니다
...     total_result = sum(sl)  # 이제 sl에 있는 부분 결과들을 통합합니다
@end example

@ref{186,,with} 문에서 @ref{3701,,SharedMemoryManager}를 사용할 때, @code{with} 문의 코드 블록 실행이 완료되면 해당 관리자를 사용하여 만들어진 공유 메모리 블록이 모두 해제됩니다.

@geindex ShareableList (multiprocessing.shared_memory 클래스)
@anchor{library/multiprocessing shared_memory multiprocessing shared_memory ShareableList}@anchor{1d55}
@deffn {클래스} multiprocessing.shared_memory.ShareableList (sequence=None, *, name=None)

Provide a mutable list-like object where all values stored within are
stored in a shared memory block.
This constrains storable values to the following built-in data types:


@itemize *

@item 
@ref{19b,,int} (부호있는 64-비트)

@item 
@ref{196,,float}

@item 
@ref{3c3,,bool}

@item 
@ref{169,,str} (less than 10M bytes each when encoded as UTF-8)

@item 
@ref{192,,bytes} (less than 10M bytes each)

@item 
@code{None}
@end itemize

It also notably differs from the built-in @ref{24d,,list} type
in that these lists can not change their overall length
(i.e. no @code{append()}, @code{insert()}, etc.) and do not
support the dynamic creation of new @code{ShareableList} instances
via slicing.

`sequence'는 새로운 @code{ShareableList}를 값으로 가득 채우는 데 사용됩니다. 고유한 공유 메모리 이름으로 이미 존재하는 @code{ShareableList}에 대신 연결하려면 @code{None}으로 설정하십시오.

`name'은 @ref{19d8,,SharedMemory}에 대한 정의에서 설명한 대로, 요청된 공유 메모리의 고유한 이름입니다. 기존 @code{ShareableList}에 연결할 때, `sequence'를 @code{None}으로 설정하고 공유 메모리 블록의 고유한 이름을 지정하십시오.

@cartouche
@quotation 참고 
A known issue exists for @ref{192,,bytes} and @ref{169,,str} values.
If they end with @code{\x00} nul bytes or characters, those may be
`silently stripped' when fetching them by index from the
@code{ShareableList}. This @code{.rstrip(b'\x00')} behavior is
considered a bug and may go away in the future. See gh-106939@footnote{https://github.com/python/cpython/issues/106939}.
@end quotation
@end cartouche

For applications where rstripping of trailing nulls is a problem,
work around it by always unconditionally appending an extra non-0
byte to the end of such values when storing and unconditionally
removing it when fetching:

@example
>>> from multiprocessing import shared_memory
>>> nul_bug_demo = shared_memory.ShareableList(['?\x00', b'\x03\x02\x01\x00\x00\x00'])
>>> nul_bug_demo[0]
'?'
>>> nul_bug_demo[1]
b'\x03\x02\x01'
>>> nul_bug_demo.shm.unlink()
>>> padded = shared_memory.ShareableList(['?\x00\x07', b'\x03\x02\x01\x00\x00\x00\x07'])
>>> padded[0][:-1]
'?\x00'
>>> padded[1][:-1]
b'\x03\x02\x01\x00\x00\x00'
>>> padded.shm.unlink()
@end example

@geindex count() (multiprocessing.shared_memory.ShareableList 메서드)
@anchor{library/multiprocessing shared_memory multiprocessing shared_memory ShareableList count}@anchor{3709}
@deffn {메서드} count (value)

`value'의 발생 횟수를 반환합니다.
@end deffn

@geindex index() (multiprocessing.shared_memory.ShareableList 메서드)
@anchor{library/multiprocessing shared_memory multiprocessing shared_memory ShareableList index}@anchor{370a}
@deffn {메서드} index (value)

`value'의 첫 번째 인덱스 위치를 반환합니다. `value'가 없으면 @ref{2ec,,ValueError}를 발생시킵니다.
@end deffn

@geindex format (multiprocessing.shared_memory.ShareableList의 속성)
@anchor{library/multiprocessing shared_memory multiprocessing shared_memory ShareableList format}@anchor{370b}
@deffn {속성} format

현재 저장된 모든 값이 사용하는 @ref{db,,struct} 패킹 형식을 포함하는 읽기 전용 어트리뷰트.
@end deffn

@geindex shm (multiprocessing.shared_memory.ShareableList의 속성)
@anchor{library/multiprocessing shared_memory multiprocessing shared_memory ShareableList shm}@anchor{370c}
@deffn {속성} shm

값이 저장되는 @ref{19d8,,SharedMemory} 인스턴스.
@end deffn
@end deffn

다음 예제는 @ref{1d55,,ShareableList} 인스턴스의 기본 사용을 보여줍니다.:

@example
>>> from multiprocessing import shared_memory
>>> a = shared_memory.ShareableList(['howdy', b'HoWdY', -273.154, 100, None, True, 42])
>>> [ type(entry) for entry in a ]
[<class 'str'>, <class 'bytes'>, <class 'float'>, <class 'int'>, <class 'NoneType'>, <class 'bool'>, <class 'int'>]
>>> a[2]
-273.154
>>> a[2] = -78.5
>>> a[2]
-78.5
>>> a[2] = 'dry ice'  # Changing data types is supported as well
>>> a[2]
'dry ice'
>>> a[2] = 'larger than previously allocated storage space'
Traceback (most recent call last):
  ...
ValueError: exceeds available storage for existing str
>>> a[2]
'dry ice'
>>> len(a)
7
>>> a.index(42)
6
>>> a.count(b'howdy')
0
>>> a.count(b'HoWdY')
1
>>> a.shm.close()
>>> a.shm.unlink()
>>> del a  # Use of a ShareableList after call to unlink() is unsupported
@end example

다음 예는 하나, 둘 또는 여러 프로세스가 그 뒤에 있는 공유 메모리 블록의 이름을 제공하여 같은 @ref{1d55,,ShareableList}에 액세스하는 방법을 보여줍니다:

@example
>>> b = shared_memory.ShareableList(range(5))         # In a first process
>>> c = shared_memory.ShareableList(name=b.shm.name)  # In a second process
>>> c
ShareableList([0, 1, 2, 3, 4], name='...')
>>> c[-1] = -999
>>> b[-1]
-999
>>> b.shm.close()
>>> c.shm.close()
>>> c.shm.unlink()
@end example

The following examples demonstrates that @ref{1d55,,ShareableList}
(and underlying @ref{19d8,,SharedMemory}) objects
can be pickled and unpickled if needed.
Note, that it will still be the same shared object.
This happens, because the deserialized object has
the same unique name and is just attached to an existing
object with the same name (if the object is still alive):

@example
>>> import pickle
>>> from multiprocessing import shared_memory
>>> sl = shared_memory.ShareableList(range(10))
>>> list(sl)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
@end example

@example
>>> deserialized_sl = pickle.loads(pickle.dumps(sl))
>>> list(deserialized_sl)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
@end example

@example
>>> sl[0] = -1
>>> deserialized_sl[1] = -2
>>> list(sl)
[-1, -2, 2, 3, 4, 5, 6, 7, 8, 9]
>>> list(deserialized_sl)
[-1, -2, 2, 3, 4, 5, 6, 7, 8, 9]
@end example

@example
>>> sl.shm.close()
>>> sl.shm.unlink()
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node concurrent 패키지,concurrent futures — 병렬 작업 실행하기,multiprocessing shared_memory — 프로세스 간 직접 액세스를 위한 공유 메모리,동시 실행
@anchor{library/concurrent doc}@anchor{370d}@anchor{library/concurrent the-concurrent-package}@anchor{370e}@anchor{library/concurrent translation-repo}@anchor{370f}
@subsection @code{concurrent} 패키지


This package contains the following modules:


@itemize *

@item 
@ref{24,,concurrent.futures} – 병렬 작업 시작하기

@item 
@ref{25,,concurrent.interpreters} – Multiple interpreters in the same process
@end itemize

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node concurrent futures — 병렬 작업 실행하기,concurrent interpreters — Multiple interpreters in the same process,concurrent 패키지,동시 실행
@anchor{library/concurrent futures doc}@anchor{3710}@anchor{library/concurrent futures concurrent-futures-launching-parallel-tasks}@anchor{3711}@anchor{library/concurrent futures module-concurrent futures}@anchor{24}@anchor{library/concurrent futures translation-repo}@anchor{3712}
@subsection @code{concurrent.futures} — 병렬 작업 실행하기


@geindex module; concurrent.futures


Added in version 3.2.


`Source code:' Lib/concurrent/futures/thread.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/concurrent/futures/thread.py},
Lib/concurrent/futures/process.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/concurrent/futures/process.py},
and Lib/concurrent/futures/interpreter.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/concurrent/futures/interpreter.py}


__________________________________________________________________


The @code{concurrent.futures} module provides a high-level interface for
asynchronously executing callables.

The asynchronous execution can be performed with threads, using
@ref{948,,ThreadPoolExecutor} or @ref{1d2,,InterpreterPoolExecutor},
or separate processes, using @ref{1d6,,ProcessPoolExecutor}.
Each implements the same interface, which is defined
by the abstract @ref{3713,,Executor} class.

@ref{13b7,,concurrent.futures.Future} must not be confused with
@ref{dc5,,asyncio.Future}, which is designed for use with @ref{b,,asyncio}
tasks and coroutines. See the @ref{3714,,asyncio’s Future}
documentation for a detailed comparison of the two.

@c include for modules that don't work on WASM

@ref{213c,,가용성}: not WASI.

이 모듈은 웹어셈블리에서 작동하지 않거나 제공되지 않습니다. 자세한 내용은 @ref{1b68,,웹어셈블리 플랫폼}을 참조하세요.

@menu
* Executor 객체:: 
* ThreadPoolExecutor:: 
* InterpreterPoolExecutor:: 
* ProcessPoolExecutor:: 
* Future 객체:: 
* 모듈 함수:: 
* 예외 클래스:: 

@end menu

@node Executor 객체,ThreadPoolExecutor,,concurrent futures — 병렬 작업 실행하기
@anchor{library/concurrent futures executor-objects}@anchor{3715}
@subsubsection Executor 객체


@geindex Executor (concurrent.futures 클래스)
@anchor{library/concurrent futures concurrent futures Executor}@anchor{3713}
@deffn {클래스} concurrent.futures.Executor

비동기적으로 호출을 실행하는 메서드를 제공하는 추상 클래스입니다. 직접 사용해서는 안 되며, 구체적인 하위 클래스를 통해 사용해야 합니다.

@geindex submit() (concurrent.futures.Executor 메서드)
@anchor{library/concurrent futures concurrent futures Executor submit}@anchor{c74}
@deffn {메서드} submit (fn, /, *args, **kwargs)

콜러블 `fn' 이 @code{fn(*args, **kwargs)} 처럼 실행되도록 예약하고, 콜러블 객체의 실행을 나타내는 @ref{13b7,,Future} 객체를 반환합니다.

@example
with ThreadPoolExecutor(max_workers=1) as executor:
    future = executor.submit(pow, 323, 1235)
    print(future.result())
@end example
@end deffn

@geindex map() (concurrent.futures.Executor 메서드)
@anchor{library/concurrent futures concurrent futures Executor map}@anchor{1dc}
@deffn {메서드} map (fn, *iterables, timeout=None, chunksize=1, buffersize=None)

@ref{19f,,map(fn@comma{} *iterables)} 과 비슷하지만, 다음과 같은 차이가 있습니다:


@itemize *

@item 
The `iterables' are collected immediately rather than lazily, unless a
`buffersize' is specified to limit the number of submitted tasks whose
results have not yet been yielded. If the buffer is full, iteration over
the `iterables' pauses until a result is yielded from the buffer.

@item 
`fn' 는 비동기적으로 실행되며 `fn' 에 대한 여러 호출이 동시에 이루어질 수 있습니다.
@end itemize

반환된 이터레이터는 @ref{14d2,,__next__()} 가 호출되었을 때, @ref{1dc,,Executor.map()} 에 대한 최초 호출에서 `timeout' 초 후에도 결과를 사용할 수 없는 경우 @ref{a36,,TimeoutError} 를 발생시킵니다. `timeout' 은 int 또는 float가 될 수 있습니다. `timeout' 이 지정되지 않았거나 @code{None} 인 경우, 대기 시간에는 제한이 없습니다.

`fn' 호출이 예외를 일으키면, 값을 이터레이터에서 꺼낼 때 해당 예외가 발생합니다.

When using @ref{1d6,,ProcessPoolExecutor}, this method chops `iterables'
into a number of chunks which it submits to the pool as separate
tasks.  The (approximate) size of these chunks can be specified by
setting `chunksize' to a positive integer.  For very long iterables,
using a large value for `chunksize' can significantly improve
performance compared to the default size of 1.  With
@ref{948,,ThreadPoolExecutor} and @ref{1d2,,InterpreterPoolExecutor},
`chunksize' has no effect.


버전 3.5에서 변경: Added the `chunksize' parameter.



버전 3.14에서 변경: Added the `buffersize' parameter.

@end deffn

@geindex shutdown() (concurrent.futures.Executor 메서드)
@anchor{library/concurrent futures concurrent futures Executor shutdown}@anchor{aea}
@deffn {메서드} shutdown (wait=True, *, cancel_futures=False)

현재 계류 중인 퓨처가 실행 완료될 때, 사용 중인 모든 자원을 해제해야 한다는 것을 실행기에 알립니다. 종료(shutdown) 후에 이루어지는 @ref{c74,,Executor.submit()} 과 @ref{1dc,,Executor.map()} 호출은 @ref{244,,RuntimeError} 를 발생시킵니다.

`wait' 가 @code{True} 면, 계류 중인 모든 퓨처가 실행을 마치고 실행기와 관련된 자원이 해제될 때까지 이 메서드는 돌아오지 않습니다. `wait' 가 @code{False} 면, 이 메서드는 즉시 돌아오고 실행기와 연관된 자원은 계류 중인 모든 퓨처가 실행을 마칠 때 해제됩니다. `wait' 의 값과 관계없이, 모든 계류 중인 퓨처가 실행을 마칠 때까지 전체 파이썬 프로그램이 종료되지 않습니다.

`cancel_futures'가 @code{True}이면, 이 메서드는 실행기가 실행을 시작시키지 않은 계류 중인 모든 퓨처를 취소합니다. `cancel_futures'의 값과 관계없이 완료되었거나 실행 중인 퓨처는 취소되지 않습니다.

`cancel_futures'와 `wait'가 모두 @code{True}이면, 이 메서드가 반환하기 전에 실행기가 실행을 시작한 모든 퓨처가 완료됩니다. 나머지 퓨처는 취소됩니다.

You can avoid having to call this method explicitly if you use the executor
as a @ref{1e1,,context manager} via the  @ref{186,,with} statement, which
will shutdown the @code{Executor} (waiting as if @code{Executor.shutdown()}
were called with `wait' set to @code{True}):

@example
import shutil
with ThreadPoolExecutor(max_workers=4) as e:
    e.submit(shutil.copy, 'src1.txt', 'dest1.txt')
    e.submit(shutil.copy, 'src2.txt', 'dest2.txt')
    e.submit(shutil.copy, 'src3.txt', 'dest3.txt')
    e.submit(shutil.copy, 'src4.txt', 'dest4.txt')
@end example


버전 3.9에서 변경: `cancel_futures'를 추가했습니다.

@end deffn
@end deffn

@node ThreadPoolExecutor,InterpreterPoolExecutor,Executor 객체,concurrent futures — 병렬 작업 실행하기
@anchor{library/concurrent futures threadpoolexecutor}@anchor{3716}
@subsubsection ThreadPoolExecutor


@ref{948,,ThreadPoolExecutor} 는 스레드 풀을 사용하여 호출을 비동기적으로 실행하는 @ref{3713,,Executor} 서브 클래스입니다.

@ref{13b7,,Future}와 관련된 콜러블 객체가 다른 @code{Future} 의 결과를 기다릴 때 교착 상태가 발생할 수 있습니다. 예를 들면:

@example
import time
def wait_on_b():
    time.sleep(5)
    print(b.result())  # b 는 a 를 기다리기 때문에 완료되지 않습니다.
    return 5

def wait_on_a():
    time.sleep(5)
    print(a.result())  # a 는 b 를 기다리기 때문에 완료되지 않습니다.
    return 6


executor = ThreadPoolExecutor(max_workers=2)
a = executor.submit(wait_on_b)
b = executor.submit(wait_on_a)
@end example

그리고:

@example
def wait_on_future():
    f = executor.submit(pow, 5, 2)
    # This will never complete because there is only one worker thread and
    # it is executing this function.
    print(f.result())

executor = ThreadPoolExecutor(max_workers=1)
future = executor.submit(wait_on_future)
# Note: calling future.result() would also cause a deadlock because
# the single worker thread is already waiting for wait_on_future().
@end example

@geindex ThreadPoolExecutor (concurrent.futures 클래스)
@anchor{library/concurrent futures concurrent futures ThreadPoolExecutor}@anchor{948}
@deffn {클래스} concurrent.futures.ThreadPoolExecutor (max_workers=None, thread_name_prefix='@w{'}, initializer=None, initargs=())

최대 `max_workers' 스레드의 풀을 사용하여 호출을 비동기적으로 실행하는 @ref{3713,,Executor} 서브 클래스.

All threads enqueued to @code{ThreadPoolExecutor} will be joined before the
interpreter can exit. Note that the exit handler which does this is
executed `before' any exit handlers added using @code{atexit}. This means
exceptions in the main thread must be caught and handled in order to
signal threads to exit gracefully. For this reason, it is recommended
that @code{ThreadPoolExecutor} not be used for long-running tasks.

`initializer' 는 각 작업자 스레드의 시작 부분에서 호출되는 선택적 콜러블입니다; `initargs' 는 initializer에 전달되는 인자들의 튜플입니다. `initializer' 가 예외를 발생시키는 경우, 현재 계류 중인 모든 작업과 풀에 추가로 작업을 제출하려는 시도는 @ref{3717,,BrokenThreadPool} 을 발생시킵니다.


버전 3.5에서 변경: `max_workers' 가 @code{None} 이거나 주어지지 않았다면, 기본값으로 기계의 프로세서 수에 @code{5} 를 곱한 값을 사용합니다. @ref{948,,ThreadPoolExecutor} 가 CPU 작업보다는 I/O를 동시에 진행하는데 자주 쓰이고, 작업자의 수가 @ref{1d6,,ProcessPoolExecutor} 보다 많아야 한다고 가정하고 있습니다.



버전 3.6에서 변경: 디버깅 편의를 위해 사용자가 풀이 만드는 작업자 스레드의 @ref{176,,threading.Thread} 이름을 제어 할 수 있도록, `thread_name_prefix' 매개 변수를 추가했습니다.



버전 3.7에서 변경: `initializer' 및 `initargs' 인자가 추가되었습니다.



버전 3.8에서 변경: `max_workers'의 기본값은 @code{min(32, os.cpu_count() + 4)}로 변경됩니다. 이 기본값은 I/O 병목 작업을 위해 최소 5개의 작업자를 유지합니다. GIL을 반납하는 CPU 병목 작업을 위해 최대 32개의 CPU 코어를 사용합니다. 또한 많은 코어를 가진 시스템에서 매우 큰 자원을 묵시적으로 사용하는 것을 방지합니다.

ThreadPoolExecutor는 이제 `max_workers' 작업자 스레드를 시작하기 전에 유휴 작업자 스레드를 재사용합니다.



버전 3.13에서 변경: Default value of `max_workers' is changed to
@code{min(32, (os.process_cpu_count() or 1) + 4)}.

@end deffn

@menu
* ThreadPoolExecutor 예제:: 

@end menu

@node ThreadPoolExecutor 예제,,,ThreadPoolExecutor
@anchor{library/concurrent futures id1}@anchor{3718}@anchor{library/concurrent futures threadpoolexecutor-example}@anchor{13b8}
@subsubsection ThreadPoolExecutor 예제


@example
import concurrent.futures
import urllib.request

URLS = ['http://www.foxnews.com/',
        'http://www.cnn.com/',
        'http://europe.wsj.com/',
        'http://www.bbc.co.uk/',
        'http://nonexistent-subdomain.python.org/']

# 페이지 하나를 가져오고 URL 과 내용을 보고합니다
def load_url(url, timeout):
    with urllib.request.urlopen(url, timeout=timeout) as conn:
        return conn.read()

# with 문을 사용하여 스레드가 즉시 정리되도록 할 수 있습니다
with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
    # 로드 작업을 시작하고 각 퓨처의 해당 URL을 기록합니다
    future_to_url = @{executor.submit(load_url, url, 60): url for url in URLS@}
    for future in concurrent.futures.as_completed(future_to_url):
        url = future_to_url[future]
        try:
            data = future.result()
        except Exception as exc:
            print('%r generated an exception: %s' % (url, exc))
        else:
            print('%r page is %d bytes' % (url, len(data)))
@end example

@node InterpreterPoolExecutor,ProcessPoolExecutor,ThreadPoolExecutor,concurrent futures — 병렬 작업 실행하기
@anchor{library/concurrent futures interpreterpoolexecutor}@anchor{3719}
@subsubsection InterpreterPoolExecutor



Added in version 3.14.


The @ref{1d2,,InterpreterPoolExecutor} class uses a pool of interpreters
to execute calls asynchronously.  It is a @ref{948,,ThreadPoolExecutor}
subclass, which means each worker is running in its own thread.
The difference here is that each worker has its own interpreter,
and runs each task using that interpreter.

The biggest benefit to using interpreters instead of only threads
is true multi-core parallelism.  Each interpreter has its own
@ref{474,,Global Interpreter Lock}, so code
running in one interpreter can run on one CPU core, while code in
another interpreter runs unblocked on a different core.

The tradeoff is that writing concurrent code for use with multiple
interpreters can take extra effort.  However, this is because it
forces you to be deliberate about how and when interpreters interact,
and to be explicit about what data is shared between interpreters.
This results in several benefits that help balance the extra effort,
including true multi-core parallelism,  For example, code written
this way can make it easier to reason about concurrency.  Another
major benefit is that you don’t have to deal with several of the
big pain points of using threads, like race conditions.

Each worker’s interpreter is isolated from all the other interpreters.
“Isolated” means each interpreter has its own runtime state and
operates completely independently.  For example, if you redirect
@ref{ccc,,sys.stdout} in one interpreter, it will not be automatically
redirected to any other interpreter.  If you import a module in one
interpreter, it is not automatically imported in any other.  You
would need to import the module separately in interpreter where
you need it.  In fact, each module imported in an interpreter is
a completely separate object from the same module in a different
interpreter, including @ref{df,,sys}, @ref{13,,builtins},
and even @code{__main__}.

Isolation means a mutable object, or other data, cannot be used
by more than one interpreter at the same time.  That effectively means
interpreters cannot actually share such objects or data.  Instead,
each interpreter must have its own copy, and you will have to
synchronize any changes between the copies manually.  Immutable
objects and data, like the builtin singletons, strings, and tuples
of immutable objects, don’t have these limitations.

Communicating and synchronizing between interpreters is most effectively
done using dedicated tools, like those proposed in 
@geindex Python 향상 제안; PEP 734
PEP 734@footnote{https://peps.python.org/pep-0734/}.  One less
efficient alternative is to serialize with @ref{ab,,pickle} and then send
the bytes over a shared @ref{d1,,socket} or
@ref{1b62,,pipe}.

@geindex InterpreterPoolExecutor (concurrent.futures 클래스)
@anchor{library/concurrent futures concurrent futures InterpreterPoolExecutor}@anchor{1d2}
@deffn {클래스} concurrent.futures.InterpreterPoolExecutor (max_workers=None, thread_name_prefix='@w{'}, initializer=None, initargs=())

A @ref{948,,ThreadPoolExecutor} subclass that executes calls asynchronously
using a pool of at most `max_workers' threads.  Each thread runs
tasks in its own interpreter.  The worker interpreters are isolated
from each other, which means each has its own runtime state and that
they can’t share any mutable objects or other data.  Each interpreter
has its own @ref{474,,Global Interpreter Lock},
which means code run with this executor has true multi-core parallelism.

The optional `initializer' and `initargs' arguments have the same
meaning as for @code{ThreadPoolExecutor}: the initializer is run
when each worker is created, though in this case it is run in
the worker’s interpreter.  The executor serializes the `initializer'
and `initargs' using @ref{ab,,pickle} when sending them to the worker’s
interpreter.

@cartouche
@quotation 참고 
The executor may replace uncaught exceptions from `initializer'
with @ref{371a,,ExecutionFailed}.
@end quotation
@end cartouche

Other caveats from parent @ref{948,,ThreadPoolExecutor} apply here.
@end deffn

@ref{c74,,submit()} and @ref{1dc,,map()} work like normal,
except the worker serializes the callable and arguments using
@ref{ab,,pickle} when sending them to its interpreter.  The worker
likewise serializes the return value when sending it back.

When a worker’s current task raises an uncaught exception, the worker
always tries to preserve the exception as-is.  If that is successful
then it also sets the @code{__cause__} to a corresponding
@ref{371a,,ExecutionFailed}
instance, which contains a summary of the original exception.
In the uncommon case that the worker is not able to preserve the
original as-is then it directly preserves the corresponding
@code{ExecutionFailed}
instance instead.

@node ProcessPoolExecutor,Future 객체,InterpreterPoolExecutor,concurrent futures — 병렬 작업 실행하기
@anchor{library/concurrent futures processpoolexecutor}@anchor{371b}
@subsubsection ProcessPoolExecutor


@ref{1d6,,ProcessPoolExecutor} 클래스는 프로세스 풀을 사용하여 호출을 비동기적으로 실행하는 @ref{3713,,Executor} 서브 클래스입니다. @code{ProcessPoolExecutor} 는 @ref{98,,multiprocessing} 모듈을 사용합니다. @ref{474,,전역 인터프리터 록} 을 피할 수 있도록 하지만, 오직 피클 가능한 객체만 실행되고 반환될 수 있음을 의미합니다.

@code{__main__} 모듈은 작업자 서브 프로세스가 임포트 할 수 있어야 합니다. 즉, @ref{1d6,,ProcessPoolExecutor} 는 대화형 인터프리터에서 작동하지 않습니다.

@ref{1d6,,ProcessPoolExecutor} 에 제출된 콜러블에서 @ref{3713,,Executor} 나 @ref{13b7,,Future} 메서드를 호출하면 교착 상태가 발생합니다.

Note that the restrictions on functions and arguments needing to picklable as
per @ref{252,,multiprocessing.Process} apply when using @ref{c74,,submit()}
and @ref{1dc,,map()} on a @ref{1d6,,ProcessPoolExecutor}. A function defined
in a REPL or a lambda should not be expected to work.

@geindex ProcessPoolExecutor (concurrent.futures 클래스)
@anchor{library/concurrent futures concurrent futures ProcessPoolExecutor}@anchor{1d6}
@deffn {클래스} concurrent.futures.ProcessPoolExecutor (max_workers=None, mp_context=None, initializer=None, initargs=(), max_tasks_per_child=None)

최대 `max_workers' 프로세스의 풀을 사용하여 호출을 비동기적으로 실행하는 @ref{3713,,Executor} 서브 클래스. `max_workers' 가 @code{None} 이거나 주어지지 않았다면, @ref{51d,,os.process_cpu_count()}를 기본값으로 사용합니다. `max_workers' 가 @code{0} 보다 작거나 같으면 @ref{2ec,,ValueError} 가 발생합니다. 윈도우에서, `max_workers'는 @code{61}보다 작거나 같아야 합니다. 그렇지 않으면 @code{ValueError}가 발생합니다. `max_workers'가 @code{None} 이면, 더 많은 프로세서를 사용할 수 있다 할지라도 선택된 기본값은 최대 @code{61}이 될 것입니다. `mp_context' 는 @ref{98,,multiprocessing} 컨텍스트이거나 @code{None}일 수 있습니다. 작업자들을 만드는데 사용될 것입니다. `mp_context' 가 @code{None} 이거나 주어지지 않으면 기본 @code{multiprocessing} 컨텍스트가 사용됩니다. @ref{1d5,,컨텍스트 및 시작 방법}을 참조하세요.

`initializer' 는 각 작업자 프로세스의 시작 부분에서 호출되는 선택적 콜러블입니다; `initargs' 는 initializer에 전달되는 인자들의 튜플입니다. `initializer' 가 예외를 발생시키는 경우, 현재 계류 중인 모든 작업과 풀에 추가로 작업을 제출하려는 시도는 @ref{371c,,BrokenProcessPool} 을 발생시킵니다.

`max_tasks_per_child' is an optional argument that specifies the maximum
number of tasks a single process can execute before it will exit and be
replaced with a fresh worker process. By default `max_tasks_per_child' is
@code{None} which means worker processes will live as long as the pool. When
a max is specified, the “spawn” multiprocessing start method will be used by
default in absence of a `mp_context' parameter. This feature is incompatible
with the “fork” start method.

@cartouche
@quotation 참고 
Bugs have been reported when using the `max_tasks_per_child' feature that
can result in the @code{ProcessPoolExecutor} hanging in some
circumstances. Follow its eventual resolution in gh-115634@footnote{https://github.com/python/cpython/issues/115634}.
@end quotation
@end cartouche


버전 3.3에서 변경: 작업자 프로세스 중 하나가 갑자기 종료되면, @ref{371c,,BrokenProcessPool} 오류가 발생합니다. 이전에는, 동작이 정의되지 않았지만, 실행기나 그 퓨처에 대한 연산이 종종 멈추거나 교착 상태에 빠졌습니다.



버전 3.7에서 변경: `mp_context' 인자가 추가되어 사용자가 풀에서 만드는 작업자 프로세스의 시작 방법을 제어 할 수 있습니다.

`initializer' 및 `initargs' 인자가 추가되었습니다.



버전 3.11에서 변경: `max_tasks_per_child' 인자가 추가되어 사용자가 풀에 있는 작업자의 수명을 제어 할 수 있습니다.



버전 3.12에서 변경: On POSIX systems, if your application has multiple threads and the
@ref{98,,multiprocessing} context uses the @code{"fork"} start method:
The @ref{4b6,,os.fork()} function called internally to spawn workers may raise a
@ref{1a3,,DeprecationWarning}. Pass a `mp_context' configured to use a
different start method. See the @code{os.fork()} documentation for
further explanation.



버전 3.13에서 변경: `max_workers' uses @ref{51d,,os.process_cpu_count()} by default, instead of
@ref{4db,,os.cpu_count()}.



버전 3.14에서 변경: The default process start method (see
@ref{1d5,,컨텍스트 및 시작 방법}) changed away from `fork'. If you
require the `fork' start method for @code{ProcessPoolExecutor} you must
explicitly pass @code{mp_context=multiprocessing.get_context("fork")}.


@geindex terminate_workers() (concurrent.futures.ProcessPoolExecutor 메서드)
@anchor{library/concurrent futures concurrent futures ProcessPoolExecutor terminate_workers}@anchor{1da}
@deffn {메서드} terminate_workers ()

Attempt to terminate all living worker processes immediately by calling
@ref{185a,,Process.terminate} on each of them.
Internally, it will also call @ref{aea,,Executor.shutdown()} to ensure that all
other resources associated with the executor are freed.

After calling this method the caller should no longer submit tasks to the
executor.


Added in version 3.14.

@end deffn

@geindex kill_workers() (concurrent.futures.ProcessPoolExecutor 메서드)
@anchor{library/concurrent futures concurrent futures ProcessPoolExecutor kill_workers}@anchor{1db}
@deffn {메서드} kill_workers ()

Attempt to kill all living worker processes immediately by calling
@ref{d4e,,Process.kill} on each of them.
Internally, it will also call @ref{aea,,Executor.shutdown()} to ensure that all
other resources associated with the executor are freed.

After calling this method the caller should no longer submit tasks to the
executor.


Added in version 3.14.

@end deffn
@end deffn

@menu
* ProcessPoolExecutor 예제:: 

@end menu

@node ProcessPoolExecutor 예제,,,ProcessPoolExecutor
@anchor{library/concurrent futures id2}@anchor{371d}@anchor{library/concurrent futures processpoolexecutor-example}@anchor{13b9}
@subsubsection ProcessPoolExecutor 예제


@example
import concurrent.futures
import math

PRIMES = [
    112272535095293,
    112582705942171,
    112272535095293,
    115280095190773,
    115797848077099,
    1099726899285419]

def is_prime(n):
    if n < 2:
        return False
    if n == 2:
        return True
    if n % 2 == 0:
        return False

    sqrt_n = int(math.floor(math.sqrt(n)))
    for i in range(3, sqrt_n + 1, 2):
        if n % i == 0:
            return False
    return True

def main():
    with concurrent.futures.ProcessPoolExecutor() as executor:
        for number, prime in zip(PRIMES, executor.map(is_prime, PRIMES)):
            print('%d is prime: %s' % (number, prime))

if __name__ == '__main__':
    main()
@end example

@node Future 객체,모듈 함수,ProcessPoolExecutor,concurrent futures — 병렬 작업 실행하기
@anchor{library/concurrent futures future-objects}@anchor{371e}
@subsubsection Future 객체


@ref{13b7,,Future} 클래스는 콜러블 객체의 비동기 실행을 캡슐화합니다. @code{Future} 인스턴스는 @ref{c74,,Executor.submit()} 에 의해 생성됩니다.

@geindex Future (concurrent.futures 클래스)
@anchor{library/concurrent futures concurrent futures Future}@anchor{13b7}
@deffn {클래스} concurrent.futures.Future

콜러블 객체의 비동기 실행을 캡슐화합니다. @ref{13b7,,Future} 인스턴스는 @ref{c74,,Executor.submit()} 에 의해 생성되며 테스트를 제외하고는 직접 생성되어서는 안 됩니다.

@geindex cancel() (concurrent.futures.Future 메서드)
@anchor{library/concurrent futures concurrent futures Future cancel}@anchor{371f}
@deffn {메서드} cancel ()

호출을 취소하려고 시도합니다. 호출이 현재 실행 중이거나 실행 종료했고 취소할 수 없는 경우 메서드는 @code{False} 를 반환하고, 그렇지 않으면 호출이 취소되고 메서드는 @code{True} 를 반환합니다.
@end deffn

@geindex cancelled() (concurrent.futures.Future 메서드)
@anchor{library/concurrent futures concurrent futures Future cancelled}@anchor{3720}
@deffn {메서드} cancelled ()

호출이 성공적으로 취소되었으면 @code{True} 를 반환합니다.
@end deffn

@geindex running() (concurrent.futures.Future 메서드)
@anchor{library/concurrent futures concurrent futures Future running}@anchor{3721}
@deffn {메서드} running ()

호출이 현재 실행 중이고 취소할 수 없는 경우 @code{True} 를 반환합니다.
@end deffn

@geindex done() (concurrent.futures.Future 메서드)
@anchor{library/concurrent futures concurrent futures Future done}@anchor{3722}
@deffn {메서드} done ()

호출이 성공적으로 취소되었거나 실행이 완료되었으면 @code{True} 를 반환합니다.
@end deffn

@geindex result() (concurrent.futures.Future 메서드)
@anchor{library/concurrent futures concurrent futures Future result}@anchor{3723}
@deffn {메서드} result (timeout=None)

호출이 반환한 값을 돌려줍니다. 호출이 아직 완료되지 않는 경우, 이 메서드는 `timeout' 초까지 대기합니다. `timeout' 초 내에 호출이 완료되지 않으면 @ref{a36,,TimeoutError} 가 발생합니다. `timeout' 은 int 또는 float가 될 수 있습니다. `timeout' 이 지정되지 않았거나 @code{None} 인 경우, 대기 시간에는 제한이 없습니다.

완료하기 전에 퓨처가 취소되면 @ref{bcd,,CancelledError} 가 발생합니다.

호출이 예외를 일으키는 경우, 이 메서드는 같은 예외를 발생시킵니다.
@end deffn

@geindex exception() (concurrent.futures.Future 메서드)
@anchor{library/concurrent futures concurrent futures Future exception}@anchor{3724}
@deffn {메서드} exception (timeout=None)

호출이 일으킨 예외를 돌려줍니다. 호출이 아직 완료되지 않는 경우, 이 메서드는 `timeout' 초까지 대기합니다. `timeout' 초 내에 호출이 완료되지 않으면 @ref{a36,,TimeoutError} 가 발생합니다. `timeout' 은 int 또는 float가 될 수 있습니다. `timeout' 이 지정되지 않았거나 @code{None} 인 경우, 대기 시간에는 제한이 없습니다.

완료하기 전에 퓨처가 취소되면 @ref{bcd,,CancelledError} 가 발생합니다.

호출이 예외 없이 완료되면, @code{None} 이 반환됩니다.
@end deffn

@geindex add_done_callback() (concurrent.futures.Future 메서드)
@anchor{library/concurrent futures concurrent futures Future add_done_callback}@anchor{3725}
@deffn {메서드} add_done_callback (fn)

콜러블 `fn' 을 퓨처에 연결합니다. `fn' 은 퓨처가 취소되거나 실행이 종료될 때 퓨처를 유일한 인자로 호출됩니다.

추가된 콜러블은 추가된 순서대로 호출되며, 항상 콜러블을 추가한 프로세스에 속하는 스레드에서 호출됩니다. 콜러블이 @ref{bcc,,Exception} 서브 클래스를 발생시키면, 로그 되고 무시됩니다. 콜러블이 @ref{7d6,,BaseException} 서브 클래스를 발생시키면, 동작은 정의되지 않습니다.

퓨처가 이미 완료되었거나 취소된 경우 `fn' 이 즉시 호출됩니다.
@end deffn

다음 @ref{13b7,,Future} 메서드는 단위 테스트와 @ref{3713,,Executor} 의 구현을 위한 것입니다.

@geindex set_running_or_notify_cancel() (concurrent.futures.Future 메서드)
@anchor{library/concurrent futures concurrent futures Future set_running_or_notify_cancel}@anchor{3726}
@deffn {메서드} set_running_or_notify_cancel ()

이 메서드는 @ref{13b7,,Future}와 관련된 작업을 실행하기 전에 @ref{3713,,Executor} 구현에 의해서만 호출되거나 단위 테스트에서만 호출되어야 합니다.

메서드가 @code{False} 를 반환하면, @ref{13b7,,Future} 가 취소된 것입니다. 즉 @ref{371f,,Future.cancel()} 이 호출되었고 @code{True}를 반환했습니다. @code{Future} 완료를 기다리는 (즉, @ref{19c7,,as_completed()} 또는 @ref{1c03,,wait()}를 통해) 모든 스레드는 깨어납니다.

메서드가 @code{True} 를 반환하면, @ref{13b7,,Future} 가 취소되지 않았고 실행 상태로 진입했습니다. 즉 @ref{3721,,Future.running()} 을 호출하면 @code{True} 가 반환됩니다.

이 메서드는 한 번만 호출 할 수 있으며, @ref{3727,,Future.set_result()} 또는 @ref{3728,,Future.set_exception()} 이 호출 된 후에는 호출할 수 없습니다.
@end deffn

@geindex set_result() (concurrent.futures.Future 메서드)
@anchor{library/concurrent futures concurrent futures Future set_result}@anchor{3727}
@deffn {메서드} set_result (result)

@ref{13b7,,Future}와 관련된 작업 결과를 `result' 로 설정합니다.

이 메서드는 @ref{3713,,Executor} 구현과 단위 테스트에서만 사용해야 합니다.


버전 3.8에서 변경: 이 메서드는 @ref{13b7,,Future}가 이미 완료되었으면 @ref{1952,,concurrent.futures.InvalidStateError}를 발생시킵니다.

@end deffn

@geindex set_exception() (concurrent.futures.Future 메서드)
@anchor{library/concurrent futures concurrent futures Future set_exception}@anchor{3728}
@deffn {메서드} set_exception (exception)

@ref{13b7,,Future}와 관련된 작업 결과를 @ref{bcc,,Exception} `exception' 으로 설정합니다.

이 메서드는 @ref{3713,,Executor} 구현과 단위 테스트에서만 사용해야 합니다.


버전 3.8에서 변경: 이 메서드는 @ref{13b7,,Future}가 이미 완료되었으면 @ref{1952,,concurrent.futures.InvalidStateError}를 발생시킵니다.

@end deffn
@end deffn

@node 모듈 함수,예외 클래스,Future 객체,concurrent futures — 병렬 작업 실행하기
@anchor{library/concurrent futures module-functions}@anchor{3729}
@subsubsection 모듈 함수


@geindex wait() (concurrent.futures 모듈)
@anchor{library/concurrent futures concurrent futures wait}@anchor{1c03}
@deffn {함수} concurrent.futures.wait (fs, timeout=None, return_when=ALL_COMPLETED)

`fs' 로 주어진 여러 (서로 다른 @ref{3713,,Executor} 인스턴스가 만든 것들도 가능합니다) @ref{13b7,,Future} 인스턴스들이 완료할 때까지 기다립니다. `fs' 로 주어진 중복 퓨처는 제거되고 한 번만 반환됩니다. 집합들의 이름있는 2-튜플을 돌려줍니다. @code{done} 이라는 이름의 첫 번째 집합은 대기가 끝나기 전에 완료된 (끝났거나 취소된) 퓨처를 담고 있습니다. @code{not_done} 이라는 이름의 두 번째 집합은 완료되지 않은 (계류 중이거나 실행 중인) 퓨처를 담고 있습니다.

`timeout' 은 반환하기 전에 대기 할 최대 시간(초)을 제어하는 데 사용할 수 있습니다. `timeout' 은 int 또는 float가 될 수 있습니다. `timeout' 이 지정되지 않았거나 @code{None} 인 경우, 대기 시간에는 제한이 없습니다.

`return_when' 은, 이 함수가 언제 반환되어야 하는지를 나타냅니다. 다음 상수 중 하나여야 합니다:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

상수

@tab

설명

@item

@geindex FIRST_COMPLETED (concurrent.futures 모듈)
@anchor{library/concurrent futures concurrent futures FIRST_COMPLETED}@anchor{372a}
@deffn {데이터} concurrent.futures.FIRST_COMPLETED
@end deffn

@tab

퓨처가 어느 하나라도 끝나거나 취소될 때 함수가 반환됩니다.

@item

@geindex FIRST_EXCEPTION (concurrent.futures 모듈)
@anchor{library/concurrent futures concurrent futures FIRST_EXCEPTION}@anchor{372b}
@deffn {데이터} concurrent.futures.FIRST_EXCEPTION
@end deffn

@tab

어느 한 퓨처가 예외를 일으켜 완료하면 함수가 반환됩니다. 어떤 퓨처도 예외를 발생시키지 않으면 @ref{372c,,ALL_COMPLETED}와 같습니다.

@item

@geindex ALL_COMPLETED (concurrent.futures 모듈)
@anchor{library/concurrent futures concurrent futures ALL_COMPLETED}@anchor{372c}
@deffn {데이터} concurrent.futures.ALL_COMPLETED
@end deffn

@tab

모든 퓨처가 끝나거나 취소되면 함수가 반환됩니다.

@end multitable

@end deffn

@geindex as_completed() (concurrent.futures 모듈)
@anchor{library/concurrent futures concurrent futures as_completed}@anchor{19c7}
@deffn {함수} concurrent.futures.as_completed (fs, timeout=None)

`fs' 로 주어진 여러 (서로 다른 @ref{3713,,Executor} 인스턴스가 만든 것들도 가능합니다) 퓨처들이 완료되는 대로 (끝났거나 취소된 퓨처) 일드 하는 @ref{13b7,,Future} 인스턴스의 이터레이터를 반환합니다. `fs' 에 중복된 퓨처가 들어있으면 한 번만 반환됩니다. @ref{19c7,,as_completed()} 가 호출되기 전에 완료한 모든 퓨처들이 먼저 일드 됩니다. 반환된 이터레이터는, @ref{14d2,,__next__()} 가 호출되고, @code{as_completed()} 호출 시점으로부터 `timeout' 초 후에 결과를 얻을 수 없는 경우 @ref{a36,,TimeoutError} 를 발생시킵니다. `timeout' 은 int 또는 float가 될 수 있습니다. `timeout' 이 지정되지 않았거나 @code{None} 인 경우, 대기 시간에는 제한이 없습니다.
@end deffn


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 3148

@item PEP 3148@footnote{https://peps.python.org/pep-3148/} – 퓨처 - 계산을 비동기적으로 실행

파이썬 표준 라이브러리에 포함하기 위해, 이 기능을 설명한 제안.
@end table


@node 예외 클래스,,모듈 함수,concurrent futures — 병렬 작업 실행하기
@anchor{library/concurrent futures exception-classes}@anchor{372d}
@subsubsection 예외 클래스


@geindex CancelledError
@anchor{library/concurrent futures concurrent futures CancelledError}@anchor{bcd}
@deffn {예외} concurrent.futures.CancelledError

퓨처가 취소될 때 발생합니다.
@end deffn

@geindex TimeoutError
@anchor{library/concurrent futures concurrent futures TimeoutError}@anchor{372e}
@deffn {예외} concurrent.futures.TimeoutError

@ref{a36,,TimeoutError}의 폐지된 별칭, 퓨처 연산이 지정된 시간제한을 초과할 때 발생합니다.


버전 3.11에서 변경: This class was made an alias of @code{TimeoutError}.

@end deffn

@geindex BrokenExecutor
@anchor{library/concurrent futures concurrent futures BrokenExecutor}@anchor{372f}
@deffn {예외} concurrent.futures.BrokenExecutor

@ref{244,,RuntimeError} 에서 파생됩니다, 이 예외 클래스는 어떤 이유로 실행기가 망가져서 새 작업을 제출하거나 실행할 수 없을 때 발생합니다.


Added in version 3.7.

@end deffn

@geindex InvalidStateError
@anchor{library/concurrent futures concurrent futures InvalidStateError}@anchor{1952}
@deffn {예외} concurrent.futures.InvalidStateError

퓨처에 현재 상태에서 허용되지 않는 연산이 수행될 때 발생합니다.


Added in version 3.8.

@end deffn

@geindex BrokenThreadPool
@anchor{library/concurrent futures concurrent futures thread BrokenThreadPool}@anchor{3717}
@deffn {예외} concurrent.futures.thread.BrokenThreadPool

@ref{372f,,BrokenExecutor} 에서 파생됩니다, 이 예외 클래스는 @ref{948,,ThreadPoolExecutor} 의 작업자 중 하나가 초기화에 실패했을 때 발생합니다.


Added in version 3.7.

@end deffn

@geindex BrokenInterpreterPool
@anchor{library/concurrent futures concurrent futures interpreter BrokenInterpreterPool}@anchor{3730}
@deffn {예외} concurrent.futures.interpreter.BrokenInterpreterPool

Derived from @ref{3717,,BrokenThreadPool},
this exception class is raised when one of the workers
of a @ref{1d2,,InterpreterPoolExecutor}
has failed initializing.


Added in version 3.14.

@end deffn

@geindex BrokenProcessPool
@anchor{library/concurrent futures concurrent futures process BrokenProcessPool}@anchor{371c}
@deffn {예외} concurrent.futures.process.BrokenProcessPool

@ref{372f,,BrokenExecutor} 에서 파생됩니다 (예전에는 @ref{244,,RuntimeError}), 이 예외 클래스는 @ref{1d6,,ProcessPoolExecutor} 의 작업자 중 하나가 깨끗하지 못한 방식으로 (예를 들어, 외부에서 강제 종료된 경우) 종료되었을 때 발생합니다.


Added in version 3.3.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node concurrent interpreters — Multiple interpreters in the same process,subprocess — 서브 프로세스 관리,concurrent futures — 병렬 작업 실행하기,동시 실행
@anchor{library/concurrent interpreters doc}@anchor{3731}@anchor{library/concurrent interpreters concurrent-interpreters-multiple-interpreters-in-the-same-process}@anchor{3732}@anchor{library/concurrent interpreters module-concurrent interpreters}@anchor{25}@anchor{library/concurrent interpreters translation-repo}@anchor{3733}
@subsection @code{concurrent.interpreters} — Multiple interpreters in the same process


@geindex module; concurrent.interpreters


Added in version 3.14.


`Source code:' Lib/concurrent/interpreters@footnote{https://github.com/python/cpython/tree/3.14/Lib/concurrent/interpreters}


__________________________________________________________________


The @code{concurrent.interpreters} module constructs higher-level
interfaces on top of the lower level @code{_interpreters} module.

The module is primarily meant to provide a basic API for managing
interpreters (AKA “subinterpreters”) and running things in them.
Running mostly involves switching to an interpreter (in the current
thread) and calling a function in that execution context.

For concurrency, interpreters themselves (and this module) don’t
provide much more than isolation, which on its own isn’t useful.
Actual concurrency is available separately through
@ref{f3,,threads}  See @ref{3734,,below}@anchor{library/concurrent interpreters interp-concurrency}@anchor{3734}


@subsubheading 더 보기



@table @asis

@item @ref{1d2,,InterpreterPoolExecutor}

Combines threads with interpreters in a familiar interface.
@end table

@c XXX Add references to the upcoming HOWTO docs in the seealso block.


@table @asis

@item @ref{166,,Isolating Extension Modules}

How to update an extension module to support multiple interpreters.
@end table

@geindex Python 향상 제안; PEP 554
PEP 554@footnote{https://peps.python.org/pep-0554/}

@geindex Python 향상 제안; PEP 734
PEP 734@footnote{https://peps.python.org/pep-0734/}

@geindex Python 향상 제안; PEP 684
PEP 684@footnote{https://peps.python.org/pep-0684/}


@c XXX Why do we disallow multiple interpreters on WASM?

@c include for modules that don't work on WASM

@ref{213c,,가용성}: not WASI.

This module does not work or is not available on WebAssembly. See
@ref{1b68,,웹어셈블리 플랫폼} for more information.

@menu
* Key details:: 
* Introduction: Introduction<6>. 
* Reference: Reference<3>. 
* Basic usage:: 

@end menu

@node Key details,Introduction<6>,,concurrent interpreters — Multiple interpreters in the same process
@anchor{library/concurrent interpreters key-details}@anchor{3735}
@subsubsection Key details


Before we dive in further, there are a small number of details
to keep in mind about using multiple interpreters:


@itemize *

@item 
@ref{3736,,isolated}@anchor{library/concurrent interpreters interp-isolation}@anchor{3736}, by default

@item 
no implicit threads

@item 
not all PyPI packages support use in multiple interpreters yet
@end itemize

@c XXX Are there other relevant details to list?

@node Introduction<6>,Reference<3>,Key details,concurrent interpreters — Multiple interpreters in the same process
@anchor{library/concurrent interpreters interpreters-intro}@anchor{3737}@anchor{library/concurrent interpreters introduction}@anchor{3738}
@subsubsection Introduction


An “interpreter” is effectively the execution context of the Python
runtime.  It contains all of the state the runtime needs to execute
a program.  This includes things like the import state and builtins.
(Each thread, even if there’s only the main thread, has some extra
runtime state, in addition to the current interpreter, related to
the current exception and the bytecode eval loop.)

The concept and functionality of the interpreter have been a part of
Python since version 2.2, but the feature was only available through
the C-API and not well known, and the @ref{3736,,isolation}
was relatively incomplete until version 3.12.

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

@end menu

@node Multiple Interpreters and Isolation,Running in an Interpreter,,Introduction<6>
@anchor{library/concurrent interpreters multiple-interpreters-and-isolation}@anchor{3739}
@subsubsection Multiple Interpreters and Isolation


A Python implementation may support using multiple interpreters in the
same process.  CPython has this support.  Each interpreter is
effectively isolated from the others (with a limited number of
carefully managed process-global exceptions to the rule).

That isolation is primarily useful as a strong separation between
distinct logical components of a program, where you want to have
careful control of how those components interact.

@cartouche
@quotation 참고 
Interpreters in the same process can technically never be strictly
isolated from one another since there are few restrictions on memory
access within the same process.  The Python runtime makes a best
effort at isolation but extension modules may easily violate that.
Therefore, do not use multiple interpreters in security-sensitive
situations, where they shouldn’t have access to each other’s data.
@end quotation
@end cartouche

@node Running in an Interpreter,Concurrency and Parallelism,Multiple Interpreters and Isolation,Introduction<6>
@anchor{library/concurrent interpreters running-in-an-interpreter}@anchor{373a}
@subsubsection Running in an Interpreter


Running in a different interpreter involves switching to it in the
current thread and then calling some function.  The runtime will
execute the function using the current interpreter’s state.  The
@code{concurrent.interpreters} module provides a basic API for
creating and managing interpreters, as well as the switch-and-call
operation.

No other threads are automatically started for the operation.
There is @ref{373b,,a helper}@anchor{library/concurrent interpreters interp-call-in-thread}@anchor{373b} for that though.
There is another dedicated helper for calling the builtin
@ref{4a3,,exec()} in an interpreter.

When @ref{4a3,,exec()} (or @ref{4a4,,eval()}) are called in an interpreter,
they run using the interpreter’s @code{__main__} module as the
“globals” namespace.  The same is true for functions that aren’t
associated with any module.  This is the same as how scripts invoked
from the command-line run in the @code{__main__} module.

@node Concurrency and Parallelism,Communication Between Interpreters,Running in an Interpreter,Introduction<6>
@anchor{library/concurrent interpreters concurrency-and-parallelism}@anchor{373c}
@subsubsection Concurrency and Parallelism


As noted earlier, interpreters do not provide any concurrency
on their own.  They strictly represent the isolated execution
context the runtime will use `in the current thread'.  That isolation
makes them similar to processes, but they still enjoy in-process
efficiency, like threads.

All that said, interpreters do naturally support certain flavors of
concurrency.
There’s a powerful side effect of that isolation.  It enables a
different approach to concurrency than you can take with async or
threads.  It’s a similar concurrency model to CSP or the actor model,
a model which is relatively easy to reason about.

You can take advantage of that concurrency model in a single thread,
switching back and forth between interpreters, Stackless-style.
However, this model is more useful when you combine interpreters
with multiple threads.  This mostly involves starting a new thread,
where you switch to another interpreter and run what you want there.

Each actual thread in Python, even if you’re only running in the main
thread, has its own `current' execution context.  Multiple threads can
use the same interpreter or different ones.

At a high level, you can think of the combination of threads and
interpreters as threads with opt-in sharing.

As a significant bonus, interpreters are sufficiently isolated that
they do not share the @ref{164,,GIL}, which means combining threads with
multiple interpreters enables full multi-core parallelism.
(This has been the case since Python 3.12.)

@node Communication Between Interpreters,“Sharing” Objects,Concurrency and Parallelism,Introduction<6>
@anchor{library/concurrent interpreters communication-between-interpreters}@anchor{373d}
@subsubsection Communication Between Interpreters


In practice, multiple interpreters are useful only if we have a way
to communicate between them.  This usually involves some form of
message passing, but can even mean sharing data in some carefully
managed way.

With this in mind, the @code{concurrent.interpreters} module provides
a @ref{1599,,queue.Queue} implementation, available through
@ref{373e,,create_queue()}.

@node “Sharing” Objects,,Communication Between Interpreters,Introduction<6>
@anchor{library/concurrent interpreters interp-object-sharing}@anchor{373f}@anchor{library/concurrent interpreters sharing-objects}@anchor{3740}
@subsubsection “Sharing” Objects


Any data actually shared between interpreters loses the thread-safety
provided by the @ref{164,,GIL}.  There are various options for dealing with
this in extension modules.  However, from Python code the lack of
thread-safety means objects can’t actually be shared, with a few
exceptions.  Instead, a copy must be created, which means mutable
objects won’t stay in sync.

By default, most objects are copied with @ref{ab,,pickle} when they are
passed to another interpreter.  Nearly all of the immutable builtin
objects are either directly shared or copied efficiently.  For example:


@itemize *

@item 
@ref{884,,None}

@item 
@ref{3c3,,bool} (@ref{e06,,True} and @ref{d2a,,False})

@item 
@ref{192,,bytes}

@item 
@ref{169,,str}

@item 
@ref{19b,,int}

@item 
@ref{196,,float}

@item 
@ref{610,,tuple} (of similarly supported objects)
@end itemize

There is a small number of Python types that actually share mutable
data between interpreters:


@itemize *

@item 
@ref{165,,memoryview}

@item 
@ref{3741,,Queue}
@end itemize

@node Reference<3>,Basic usage,Introduction<6>,concurrent interpreters — Multiple interpreters in the same process
@anchor{library/concurrent interpreters reference}@anchor{3742}
@subsubsection Reference


This module defines the following functions:

@geindex list_all() (concurrent.interpreters 모듈)
@anchor{library/concurrent interpreters concurrent interpreters list_all}@anchor{3743}
@deffn {함수} concurrent.interpreters.list_all ()

Return a @ref{24d,,list} of @ref{3744,,Interpreter} objects,
one for each existing interpreter.
@end deffn

@geindex get_current() (concurrent.interpreters 모듈)
@anchor{library/concurrent interpreters concurrent interpreters get_current}@anchor{3745}
@deffn {함수} concurrent.interpreters.get_current ()

Return an @ref{3744,,Interpreter} object for the currently running
interpreter.
@end deffn

@geindex get_main() (concurrent.interpreters 모듈)
@anchor{library/concurrent interpreters concurrent interpreters get_main}@anchor{3746}
@deffn {함수} concurrent.interpreters.get_main ()

Return an @ref{3744,,Interpreter} object for the main interpreter.
This is the interpreter the runtime created to run the @ref{492,,REPL}
or the script given at the command-line.  It is usually the only one.
@end deffn

@geindex create() (concurrent.interpreters 모듈)
@anchor{library/concurrent interpreters concurrent interpreters create}@anchor{17c2}
@deffn {함수} concurrent.interpreters.create ()

Initialize a new (idle) Python interpreter
and return a @ref{3744,,Interpreter} object for it.
@end deffn

@geindex create_queue() (concurrent.interpreters 모듈)
@anchor{library/concurrent interpreters concurrent interpreters create_queue}@anchor{373e}
@deffn {함수} concurrent.interpreters.create_queue ()

Initialize a new cross-interpreter queue and return a @ref{3741,,Queue}
object for it.
@end deffn

@menu
* Interpreter objects:: 
* Exceptions: Exceptions<6>. 
* Communicating Between Interpreters:: 

@end menu

@node Interpreter objects,Exceptions<6>,,Reference<3>
@anchor{library/concurrent interpreters interpreter-objects}@anchor{3747}
@subsubsection Interpreter objects


@geindex Interpreter (concurrent.interpreters 클래스)
@anchor{library/concurrent interpreters concurrent interpreters Interpreter}@anchor{3744}
@deffn {클래스} concurrent.interpreters.Interpreter (id)

A single interpreter in the current process.

Generally, @code{Interpreter} shouldn’t be called directly.
Instead, use @ref{17c2,,create()} or one of the other module functions.

@geindex id (concurrent.interpreters.Interpreter의 속성)
@anchor{library/concurrent interpreters concurrent interpreters Interpreter id}@anchor{3748}
@deffn {속성} id

(read-only)

The underlying interpreter’s ID.
@end deffn

@geindex whence (concurrent.interpreters.Interpreter의 속성)
@anchor{library/concurrent interpreters concurrent interpreters Interpreter whence}@anchor{3749}
@deffn {속성} whence

(read-only)

A string describing where the interpreter came from.
@end deffn

@geindex is_running() (concurrent.interpreters.Interpreter 메서드)
@anchor{library/concurrent interpreters concurrent interpreters Interpreter is_running}@anchor{374a}
@deffn {메서드} is_running ()

Return @code{True} if the interpreter is currently executing code
in its @code{__main__} module and @code{False} otherwise.
@end deffn

@geindex close() (concurrent.interpreters.Interpreter 메서드)
@anchor{library/concurrent interpreters concurrent interpreters Interpreter close}@anchor{17d7}
@deffn {메서드} close ()

Finalize and destroy the interpreter.
@end deffn

@geindex prepare_main() (concurrent.interpreters.Interpreter 메서드)
@anchor{library/concurrent interpreters concurrent interpreters Interpreter prepare_main}@anchor{374b}
@deffn {메서드} prepare_main (ns=None, **kwargs)

Bind objects in the interpreter’s @code{__main__} module.

Some objects are actually shared and some are copied efficiently,
but most are copied via @ref{ab,,pickle}.  See @ref{373f,,“Sharing” Objects}.
@end deffn

@geindex exec() (concurrent.interpreters.Interpreter 메서드)
@anchor{library/concurrent interpreters concurrent interpreters Interpreter exec}@anchor{374c}
@deffn {메서드} exec (code, /, dedent=True)

Run the given source code in the interpreter (in the current thread).
@end deffn

@geindex call() (concurrent.interpreters.Interpreter 메서드)
@anchor{library/concurrent interpreters concurrent interpreters Interpreter call}@anchor{374d}
@deffn {메서드} call (callable, /, *args, **kwargs)

Return the result of calling running the given function in the
interpreter (in the current thread).
@end deffn

@geindex call_in_thread() (concurrent.interpreters.Interpreter 메서드)
@anchor{library/concurrent interpreters concurrent interpreters Interpreter call_in_thread}@anchor{374e}
@deffn {메서드} call_in_thread (callable, /, *args, **kwargs)

Run the given function in the interpreter (in a new thread).
@end deffn
@end deffn

@node Exceptions<6>,Communicating Between Interpreters,Interpreter objects,Reference<3>
@anchor{library/concurrent interpreters exceptions}@anchor{374f}
@subsubsection Exceptions


@geindex InterpreterError
@anchor{library/concurrent interpreters concurrent interpreters InterpreterError}@anchor{3750}
@deffn {예외} concurrent.interpreters.InterpreterError

This exception, a subclass of @ref{bcc,,Exception}, is raised when
an interpreter-related error happens.
@end deffn

@geindex InterpreterNotFoundError
@anchor{library/concurrent interpreters concurrent interpreters InterpreterNotFoundError}@anchor{3751}
@deffn {예외} concurrent.interpreters.InterpreterNotFoundError

This exception, a subclass of @ref{3750,,InterpreterError}, is raised when
the targeted interpreter no longer exists.
@end deffn

@geindex ExecutionFailed
@anchor{library/concurrent interpreters concurrent interpreters ExecutionFailed}@anchor{371a}
@deffn {예외} concurrent.interpreters.ExecutionFailed

This exception, a subclass of @ref{3750,,InterpreterError}, is raised when
the running code raised an uncaught exception.

@geindex excinfo (concurrent.interpreters.ExecutionFailed의 속성)
@anchor{library/concurrent interpreters concurrent interpreters ExecutionFailed excinfo}@anchor{3752}
@deffn {속성} excinfo

A basic snapshot of the exception raised in the other interpreter.
@end deffn
@end deffn

@c XXX Document the excinfoattrs?

@geindex NotShareableError
@anchor{library/concurrent interpreters concurrent interpreters NotShareableError}@anchor{3753}
@deffn {예외} concurrent.interpreters.NotShareableError

This exception, a subclass of @ref{198,,TypeError}, is raised when
an object cannot be sent to another interpreter.
@end deffn

@node Communicating Between Interpreters,,Exceptions<6>,Reference<3>
@anchor{library/concurrent interpreters communicating-between-interpreters}@anchor{3754}
@subsubsection Communicating Between Interpreters


@geindex Queue (concurrent.interpreters 클래스)
@anchor{library/concurrent interpreters concurrent interpreters Queue}@anchor{3741}
@deffn {클래스} concurrent.interpreters.Queue (id)

A wrapper around a low-level, cross-interpreter queue, which
implements the @ref{1599,,queue.Queue} interface.  The underlying queue
can only be created through @ref{373e,,create_queue()}.

Some objects are actually shared and some are copied efficiently,
but most are copied via @ref{ab,,pickle}.  See @ref{373f,,“Sharing” Objects}.

@geindex id (concurrent.interpreters.Queue의 속성)
@anchor{library/concurrent interpreters concurrent interpreters Queue id}@anchor{3755}
@deffn {속성} id

(read-only)

The queue’s ID.
@end deffn
@end deffn

@geindex QueueEmptyError
@anchor{library/concurrent interpreters concurrent interpreters QueueEmptyError}@anchor{3756}
@deffn {예외} concurrent.interpreters.QueueEmptyError

This exception, a subclass of @ref{369d,,queue.Empty}, is raised from
@code{Queue.get()} and @code{Queue.get_nowait()} when the queue
is empty.
@end deffn

@geindex QueueFullError
@anchor{library/concurrent interpreters concurrent interpreters QueueFullError}@anchor{3757}
@deffn {예외} concurrent.interpreters.QueueFullError

This exception, a subclass of @ref{369e,,queue.Full}, is raised from
@code{Queue.put()} and @code{Queue.put_nowait()} when the queue
is full.
@end deffn

@node Basic usage,,Reference<3>,concurrent interpreters — Multiple interpreters in the same process
@anchor{library/concurrent interpreters basic-usage}@anchor{3758}
@subsubsection Basic usage


Creating an interpreter and running code in it:

@example
from concurrent import interpreters

interp = interpreters.create()

# Run in the current OS thread.

interp.exec('print("spam!")')

interp.exec("""if True:
    print('spam!')
    """)

from textwrap import dedent
interp.exec(dedent("""
    print('spam!')
    """))

def run(arg):
    return arg

res = interp.call(run, 'spam!')
print(res)

def run():
    print('spam!')

interp.call(run)

# Run in new OS thread.

t = interp.call_in_thread(run)
t.join()
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node subprocess — 서브 프로세스 관리,sched — 이벤트 스케줄러,concurrent interpreters — Multiple interpreters in the same process,동시 실행
@anchor{library/subprocess doc}@anchor{3759}@anchor{library/subprocess module-subprocess}@anchor{dc}@anchor{library/subprocess subprocess-subprocess-management}@anchor{375a}@anchor{library/subprocess translation-repo}@anchor{375b}
@subsection @code{subprocess} — 서브 프로세스 관리


@geindex module; subprocess

`소스 코드:' Lib/subprocess.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/subprocess.py}


__________________________________________________________________


The @code{subprocess} module allows you to spawn new processes, connect to their
input/output/error pipes, and obtain their return codes.  This module intends to
replace several older modules and functions:

@example
os.system
os.spawn*
@end example

Information about how the @code{subprocess} module can be used to replace these
modules and functions can be found in the following sections.


@subsubheading 더 보기


@geindex Python 향상 제안; PEP 324
PEP 324@footnote{https://peps.python.org/pep-0324/} – subprocess 모듈을 제안하는 PEP


@c include for modules that don't work on WASM or mobile platforms

@ref{213c,,가용성}: not Android, not iOS, not WASI.

이 모듈은 @ref{2259,,모바일 플랫폼}이나 @ref{1b68,,웹어셈블리 플랫폼}에서 지원되지 않습니다.

@menu
* Using the subprocess Module:: 
* 보안 고려 사항: 보안 고려 사항<2>. 
* Popen 객체:: 
* 윈도우 Popen 도우미:: 
* 오래된 고수준 API:: 
* Replacing Older Functions with the subprocess Module:: 
* 레거시 셸 호출 함수:: 
* 노트:: 

@end menu

@node Using the subprocess Module,보안 고려 사항<2>,,subprocess — 서브 프로세스 관리
@anchor{library/subprocess using-the-subprocess-module}@anchor{375c}
@subsubsection Using the @code{subprocess} Module


서브 프로세스 호출에 권장되는 접근법은 처리할 수 있는 모든 사용 사례에 @ref{d7e,,run()} 함수를 사용하는 것입니다. 고급 사용 사례의 경우, 하부 @ref{4b8,,Popen} 인터페이스를 직접 사용할 수 있습니다.

@geindex run() (subprocess 모듈)
@anchor{library/subprocess subprocess run}@anchor{d7e}
@deffn {함수} subprocess.run (args, *, stdin=None, input=None, stdout=None, stderr=None, capture_output=False, shell=False, cwd=None, timeout=None, check=False, encoding=None, errors=None, text=None, env=None, universal_newlines=None, **other_popen_kwargs)

`args'가 기술하는 명령을 실행합니다. 명령이 완료될 때까지 기다린 다음, @ref{1072,,CompletedProcess} 인스턴스를 반환합니다.

위에 표시된 인자는 가장 일반적인 인자로, 아래 @ref{375d,,자주 사용되는 인자}에서 설명됩니다 (따라서 약식 서명에 키워드 전용 표기법을 사용합니다). 전체 함수 서명은 @ref{4b8,,Popen} 생성자와 거의 같습니다 - 이 함수에 대한 대부분의 인자는 해당 인터페이스로 전달됩니다. (`timeout', `input', `check' 및 `capture_output'은 아닙니다.)

`capture_output'이 참이면, 표준 출력(stdout)과 표준 에러(stderr)가 캡처됩니다. 사용되면, 내부 @ref{4b8,,Popen} 객체는 자동으로 `stdout'과 `stderr'이 모두 @ref{d7f,,PIPE}로 설정되어 만들어집니다. `stdout'과 `stderr' 인자는 `capture_output'과 동시에 제공되지 않을 수 있습니다. 두 스트림을 모두 캡처하여 하나로 결합하려면, `capture_output'을 사용하는 대신, `stdout'을 @code{PIPE}로 `stderr'을 @ref{375e,,STDOUT}으로 설정하십시오.

`timeout'은 초 단위로 지정될 수 있으며, 내부적으로 @ref{17b1,,Popen.communicate()}로 전달됩니다. 시간제한이 만료되면, 자식 프로세스를 죽이고 기다립니다. 자식 프로세스가 종료된 후 @ref{17b2,,TimeoutExpired} 예외가 다시 발생합니다. 많은 플랫폼 API에서 초기 프로세스 생성 자체는 중단될 수 없기 때문에, 프로세스 생성에 소요되는 시간이 지나기 전에 시간제한 예외를 본다는 보장이 없습니다.

`input' 인자는 @ref{17b1,,Popen.communicate()}로 전달되고, 그래서 서브 프로세스의 표준 입력으로 전달됩니다. 사용된다면 바이트 시퀀스이거나, `encoding'이나 `errors'가 지정되었거나 `text'가 참이면 문자열이어야 합니다. 사용하면, 내부 @ref{4b8,,Popen} 객체가 자동으로 `stdin'을 @ref{d7f,,PIPE}로 설정하여 만들어지고 `stdin' 인자는 사용되지 않을 수 있습니다.

`check'가 참이고, 프로세스가 0이 아닌 종료 코드로 종료되면, @ref{1529,,CalledProcessError} 예외가 발생합니다. 해당 예외의 어트리뷰트가 인자 및 종료 코드와 캡처되었다면 stdout과 stderr을 담습니다.

`encoding'이나 `errors'가 지정되거나, `text'가 참이면, stdin, stdout 및 stderr의 파일 객체는 지정된 `encoding'과 `errors' 또는 @ref{9be,,io.TextIOWrapper} 기본값을 사용하여 텍스트 모드로 열립니다. `universal_newlines' 인자는 `text'와 동등하고 이전 버전과의 호환성을 위해 제공됩니다. 기본적으로, 파일 객체는 바이너리 모드로 열립니다.

`env'가 @code{None}이 아니면, 새 프로세스의 환경 변수를 정의하는 매핑이어야 합니다; 이것은 현재 프로세스의 환경을 상속하는 기본 동작 대신 사용됩니다. @ref{4b8,,Popen}으로 직접 전달됩니다. 이 매핑은 모든 플랫폼에서 문자열에서 문자열로, POSIX 플랫폼에서는 바이트열에서 바이트열로 일 수 있으며, 이는 @ref{259,,os.environ}이나 @ref{25a,,os.environb}와 유사합니다.

예:

@example
>>> subprocess.run(["ls", "-l"])  # 출력을 캡처하지 않습니다
CompletedProcess(args=['ls', '-l'], returncode=0)

>>> subprocess.run("exit 1", shell=True, check=True)
Traceback (most recent call last):
  ...
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1

>>> subprocess.run(["ls", "-l", "/dev/null"], capture_output=True)
CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n', stderr=b'@w{'})
@end example


Added in version 3.5.



버전 3.6에서 변경: `encoding'과 `errors' 매개 변수를 추가했습니다



버전 3.7에서 변경: `universal_newlines'의 더 이해하기 쉬운 별칭으로 `text' 매개 변수를 추가했습니다. `capture_output' 매개 변수를 추가했습니다.



버전 3.12에서 변경: Changed Windows shell search order for @code{shell=True}. The current
directory and @code{%PATH%} are replaced with @code{%COMSPEC%} and
@code{%SystemRoot%\System32\cmd.exe}. As a result, dropping a
malicious program named @code{cmd.exe} into a current directory no
longer works.

@end deffn

@geindex CompletedProcess (subprocess 클래스)
@anchor{library/subprocess subprocess CompletedProcess}@anchor{1072}
@deffn {클래스} subprocess.CompletedProcess

완료된 프로세스를 나타내는, @ref{d7e,,run()}의 반환 값.

@geindex args (subprocess.CompletedProcess의 속성)
@anchor{library/subprocess subprocess CompletedProcess args}@anchor{375f}
@deffn {속성} args

프로세스를 시작하는 데 사용된 인자. 리스트나 문자열일 수 있습니다.
@end deffn

@geindex returncode (subprocess.CompletedProcess의 속성)
@anchor{library/subprocess subprocess CompletedProcess returncode}@anchor{3760}
@deffn {속성} returncode

자식 프로세스의 종료 상태. 일반적으로, 종료 상태 0은 성공적으로 실행되었음을 나타냅니다.

음수 값 @code{-N}은 자식이 시그널 @code{N}에 의해 종료되었음을 나타냅니다 (POSIX 전용).
@end deffn

@geindex stdout (subprocess.CompletedProcess의 속성)
@anchor{library/subprocess subprocess CompletedProcess stdout}@anchor{3761}
@deffn {속성} stdout

자식 프로세스에서 캡처된 stdout. 바이트 시퀀스, 또는 @ref{d7e,,run()}이 encoding, errors, 또는 text=True로 호출되었으면 문자열. stdout이 캡처되지 않았으면 @code{None}.

@code{stderr=subprocess.STDOUT}으로 프로세스를 실행했으면, stdout과 stderr이 이 어트리뷰트에 결합하고, @ref{3762,,stderr}은 @code{None}이 됩니다.
@end deffn

@geindex stderr (subprocess.CompletedProcess의 속성)
@anchor{library/subprocess subprocess CompletedProcess stderr}@anchor{3762}
@deffn {속성} stderr

자식 프로세스에서 캡처된 stderr. 바이트 시퀀스, 또는 @ref{d7e,,run()}이 encoding, errors, 또는 text=True로 호출되었으면 문자열. stderr이 캡처되지 않았으면 @code{None}.
@end deffn

@geindex check_returncode() (subprocess.CompletedProcess 메서드)
@anchor{library/subprocess subprocess CompletedProcess check_returncode}@anchor{3763}
@deffn {메서드} check_returncode ()

@ref{3760,,returncode}가 0이 아니면, @ref{1529,,CalledProcessError}를 발생시킵니다.
@end deffn


Added in version 3.5.

@end deffn

@geindex DEVNULL (subprocess 모듈)
@anchor{library/subprocess subprocess DEVNULL}@anchor{1353}
@deffn {데이터} subprocess.DEVNULL

@ref{4b8,,Popen}의 `stdin', `stdout' 또는 `stderr' 인자로 사용할 수 있고 특수 파일 @ref{1e10,,os.devnull}이 사용될 것임을 나타내는 특수 값.


Added in version 3.3.

@end deffn

@geindex PIPE (subprocess 모듈)
@anchor{library/subprocess subprocess PIPE}@anchor{d7f}
@deffn {데이터} subprocess.PIPE

@ref{4b8,,Popen}의 `stdin', `stdout' 또는 `stderr' 인자로 사용할 수 있고 표준 스트림에 대한 파이프를 열어야 함을 나타내는 특수 값. @ref{17b1,,Popen.communicate()}에서 가장 유용합니다.
@end deffn

@geindex STDOUT (subprocess 모듈)
@anchor{library/subprocess subprocess STDOUT}@anchor{375e}
@deffn {데이터} subprocess.STDOUT

@ref{4b8,,Popen}의 `stderr' 인자로 사용할 수 있고 표준 에러가 표준 출력과 같은 핸들로 가야 함을 나타내는 특수 값.
@end deffn

@geindex SubprocessError
@anchor{library/subprocess subprocess SubprocessError}@anchor{3764}
@deffn {예외} subprocess.SubprocessError

이 모듈의 다른 모든 예외에 대한 베이스 클래스.


Added in version 3.3.

@end deffn

@geindex TimeoutExpired
@anchor{library/subprocess subprocess TimeoutExpired}@anchor{17b2}
@deffn {예외} subprocess.TimeoutExpired

자식 프로세스를 기다리는 동안 시간제한이 만료될 때 발생하는 @ref{3764,,SubprocessError}의 서브 클래스.

@geindex cmd (subprocess.TimeoutExpired의 속성)
@anchor{library/subprocess subprocess TimeoutExpired cmd}@anchor{3765}
@deffn {속성} cmd

자식 프로세스를 생성하는 데 사용된 명령.
@end deffn

@geindex timeout (subprocess.TimeoutExpired의 속성)
@anchor{library/subprocess subprocess TimeoutExpired timeout}@anchor{3766}
@deffn {속성} timeout

초 단위의 시간제한.
@end deffn

@geindex output (subprocess.TimeoutExpired의 속성)
@anchor{library/subprocess subprocess TimeoutExpired output}@anchor{3767}
@deffn {속성} output

Output of the child process if it was captured by @ref{d7e,,run()} or
@ref{11c1,,check_output()}.  Otherwise, @code{None}.  This is always
@ref{192,,bytes} when any output was captured regardless of the
@code{text=True} setting.  It may remain @code{None} instead of @code{b'@w{'}}
when no output was observed.
@end deffn

@geindex stdout (subprocess.TimeoutExpired의 속성)
@anchor{library/subprocess subprocess TimeoutExpired stdout}@anchor{3768}
@deffn {속성} stdout

output의 별칭, @ref{3769,,stderr}과의 대칭을 위한 것입니다.
@end deffn

@geindex stderr (subprocess.TimeoutExpired의 속성)
@anchor{library/subprocess subprocess TimeoutExpired stderr}@anchor{3769}
@deffn {속성} stderr

Stderr output of the child process if it was captured by @ref{d7e,,run()}.
Otherwise, @code{None}.  This is always @ref{192,,bytes} when stderr output
was captured regardless of the @code{text=True} setting.  It may remain
@code{None} instead of @code{b'@w{'}} when no stderr output was observed.
@end deffn


Added in version 3.3.



버전 3.5에서 변경: `stdout'과 `stderr' 어트리뷰트가 추가되었습니다

@end deffn

@geindex CalledProcessError
@anchor{library/subprocess subprocess CalledProcessError}@anchor{1529}
@deffn {예외} subprocess.CalledProcessError

@ref{376a,,check_call()}, @ref{11c1,,check_output()} 또는 @ref{d7e,,run()} (@code{check=True}와 함께) 에 의해 실행되는 프로세스가 0이 아닌 종료 상태를 반환할 때 발생하는 @ref{3764,,SubprocessError} 의 서브 클래스.

@geindex returncode (subprocess.CalledProcessError의 속성)
@anchor{library/subprocess subprocess CalledProcessError returncode}@anchor{376b}
@deffn {속성} returncode

자식 프로세스의 종료 상태. 시그널로 인해 프로세스가 종료되었으면, 음의 시그널 번호가 됩니다.
@end deffn

@geindex cmd (subprocess.CalledProcessError의 속성)
@anchor{library/subprocess subprocess CalledProcessError cmd}@anchor{376c}
@deffn {속성} cmd

자식 프로세스를 생성하는 데 사용된 명령.
@end deffn

@geindex output (subprocess.CalledProcessError의 속성)
@anchor{library/subprocess subprocess CalledProcessError output}@anchor{376d}
@deffn {속성} output

@ref{d7e,,run()}이나 @ref{11c1,,check_output()}에 의해 캡처되었다면 자식 프로세스의 출력. 그렇지 않으면, @code{None}.
@end deffn

@geindex stdout (subprocess.CalledProcessError의 속성)
@anchor{library/subprocess subprocess CalledProcessError stdout}@anchor{376e}
@deffn {속성} stdout

output의 별칭, @ref{376f,,stderr}과의 대칭을 위한 것입니다.
@end deffn

@geindex stderr (subprocess.CalledProcessError의 속성)
@anchor{library/subprocess subprocess CalledProcessError stderr}@anchor{376f}
@deffn {속성} stderr

@ref{d7e,,run()}에 의해 캡처되었다면 자식 프로세스의 stderr 출력. 그렇지 않으면, @code{None}.
@end deffn


버전 3.5에서 변경: `stdout'과 `stderr' 어트리뷰트가 추가되었습니다

@end deffn

@menu
* 자주 사용되는 인자:: 
* Popen 생성자:: 
* 예외: 예외<8>. 

@end menu

@node 자주 사용되는 인자,Popen 생성자,,Using the subprocess Module
@anchor{library/subprocess frequently-used-arguments}@anchor{375d}@anchor{library/subprocess id1}@anchor{3770}
@subsubsection 자주 사용되는 인자


다양한 사용 사례를 지원하기 위해, @ref{4b8,,Popen} 생성자(및 편의 함수)는 많은 선택적 인자를 받아들입니다. 가장 일반적인 사용 사례에서, 이러한 인자 중 많은 부분을 기본값으로 안전하게 남겨둘 수 있습니다. 가장 흔히 필요한 인자는 다음과 같습니다:

@quotation

`args'는 모든 호출에 필요하며 문자열 또는 프로그램 인자의 시퀀스여야 합니다. 인자의 시퀀스를 제공하는 것이 일반적으로 선호되는데, 모듈이 필요한 인자의 이스케이프와 인용을 처리하도록 하기 때문입니다 (예를 들어 파일 이름에 공백을 허용하도록). 단일 문자열을 전달하면, `shell'이 @ref{e06,,True}(아래를 참조하십시오)이거나, 그렇지 않으면 문자열은 단순히 인자를 지정하지 않고 실행할 프로그램의 이름이어야 합니다.

`stdin', `stdout' 및 `stderr'은 각각 실행된 프로그램의 표준 입력, 표준 출력 및 표준 에러 파일 핸들을 지정합니다. 유효한 값은 @code{None}, @ref{d7f,,PIPE}, @ref{1353,,DEVNULL}, 기존 파일 기술자 (양의 정수) 및 유효한 파일 기술자를 가진 기존 @ref{13c8,,파일 객체}입니다. 기본 설정 @code{None}으로는, 리디렉션은 발생하지 않습니다. @code{PIPE}는 자식에 대한 새 파이프를 만들어야 함을 나타냅니다. @code{DEVNULL}은 특수 파일 @ref{1e10,,os.devnull}이 사용될 것임을 나타냅니다. 또한, `stderr'은 @ref{375e,,STDOUT}일 수 있으며, 이는 자식 프로세스의 stderr 데이터가 `stdout'과 같은 파일 핸들로 캡처되어야 함을 나타냅니다.

@geindex 유니버설 줄 넘김;;mod;`subprocess` 모듈

`encoding'이나 `errors'가 지정되거나, `text'(`universal_newlines'라고도 합니다)가 참이면, 파일 객체 `stdin', `stdout' 및 `stderr'은 호출에 지정된 `encoding'과 `errors' 또는 @ref{9be,,io.TextIOWrapper}의 기본값을 사용하여 텍스트 모드로 열립니다.

`stdin'의 경우, 입력의 줄 종료 문자 @code{'\n'}이 기본 줄 구분자 @ref{25dc,,os.linesep}으로 변환됩니다. `stdout'과 `stderr'의 경우, 출력의 모든 줄 종료가 @code{'\n'}으로 변환됩니다. 자세한 정보는 생성자에 대한 `newline' 인자가 @code{None}일 때에 관한 @ref{9be,,io.TextIOWrapper} 클래스의 설명서를 참조하십시오.

텍스트 모드를 사용하지 않으면, `stdin', `stdout' 및 `stderr'이 바이너리 스트림으로 열립니다. 인코딩이나 줄 종료 변환이 수행되지 않습니다.


버전 3.6에서 변경: `encoding'과 `errors' 매개 변수를 추가했습니다.



버전 3.7에서 변경: `text' 매개 변수를 `universal_newlines'의 별칭으로 추가했습니다.


@cartouche
@quotation 참고 
파일 객체 @ref{3771,,Popen.stdin}, @ref{3772,,Popen.stdout} 및 @ref{3773,,Popen.stderr}의 newlines 어트리뷰트는 @ref{17b1,,Popen.communicate()} 메서드에 의해 갱신되지 않습니다.
@end quotation
@end cartouche

`shell'이 @code{True}이면, 지정된 명령이 셸을 통해 실행됩니다. 이것은 대부분의 시스템 셸에서 제공하는 것보다 향상된 제어 흐름을 위해 파이썬을 주로 사용하면서, 여전히 셸 파이프, 파일명 와일드카드, 환경 변수 확장 및 사용자 홈 디렉터리로의 @code{~} 확장과 같은 다른 셸 기능에 대한 편리한 액세스를 원할 때 유용할 수 있습니다. 그러나, 파이썬 자체가 많은 셸과 유사한 기능의 구현을 제공함에 유의하십시오 (특히, @ref{68,,glob}, @ref{60,,fnmatch}, @ref{6cf,,os.walk()}, @ref{15de,,os.path.expandvars()}, @ref{c08,,os.path.expanduser()} 및 @ref{ca,,shutil}).


버전 3.3에서 변경: `universal_newlines'가 @code{True}일 때, 클래스는 @code{locale.getpreferredencoding()} 대신 인코딩 @ref{75b,,locale.getpreferredencoding(False)}를 사용합니다. 이 변경에 대한 자세한 내용은 @ref{9be,,io.TextIOWrapper} 클래스를 참조하십시오.


@cartouche
@quotation 참고 
@code{shell=True}를 사용하기 전에 @ref{3774,,보안 고려 사항} 섹션을 읽으십시오.
@end quotation
@end cartouche
@end quotation

이러한 옵션들은, 다른 모든 옵션과 함께, @ref{4b8,,Popen} 생성자 설명서에 더 자세히 설명되어 있습니다.

@node Popen 생성자,예외<8>,자주 사용되는 인자,Using the subprocess Module
@anchor{library/subprocess popen-constructor}@anchor{3775}
@subsubsection Popen 생성자


이 모듈에서 하부 프로세스 생성과 관리는 @ref{4b8,,Popen} 클래스에 의해 처리됩니다. 개발자가 편의 함수가 다루지 않는 덜 일반적인 사례를 처리할 수 있도록 큰 유연성을 제공합니다.

@geindex Popen (subprocess 클래스)
@anchor{library/subprocess subprocess Popen}@anchor{4b8}
@deffn {클래스} subprocess.Popen (args, bufsize=-1, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=True, shell=False, cwd=None, env=None, universal_newlines=None, startupinfo=None, creationflags=0, restore_signals=True, start_new_session=False, pass_fds=(), *, group=None, extra_groups=None, user=None, umask=-1, encoding=None, errors=None, text=None, pipesize=-1, process_group=None)

새 프로세스에서 자식 프로그램을 실행합니다. POSIX에서, 클래스는 자식 프로그램을 실행하는 데 @ref{30e1,,os.execvpe()}와 유사한 동작을 사용합니다. 윈도우에서 클래스는 윈도우 @code{CreateProcess()} 함수를 사용합니다. @ref{4b8,,Popen}에 대한 인자는 다음과 같습니다.

`args'는 프로그램 인자의 시퀀스이거나 그렇지 않으면 단일한 문자열이나 @ref{5a0,,경로류 객체}여야 합니다. 기본적으로, `args'가 시퀀스이면 실행할 프로그램은 `args'의 첫 번째 항목입니다. `args'가 문자열이면, 해석은 플랫폼에 따라 다르며 아래에 설명되어 있습니다. 기본 동작과의 추가 차이점에 관해서는 `shell'과 `executable' 인자를 참조하십시오. 별도의 언급이 없는 한, `args'를 시퀀스로 전달하는 것이 좋습니다.

@cartouche
@quotation 경고 
For maximum reliability, use a fully qualified path for the executable.
To search for an unqualified name on 
@geindex PATH
@geindex 환경 변수; PATH
@code{PATH}, use
@ref{6da,,shutil.which()}. On all platforms, passing @ref{3ed,,sys.executable}
is the recommended way to launch the current Python interpreter again,
and use the @code{-m} command-line format to launch an installed module.

Resolving the path of `executable' (or the first item of `args') is
platform dependent. For POSIX, see @ref{30e1,,os.execvpe()}, and note that
when resolving or searching for the executable path, `cwd' overrides the
current working directory and `env' can override the @code{PATH}
environment variable. For Windows, see the documentation of the
@code{lpApplicationName} and @code{lpCommandLine} parameters of WinAPI
@code{CreateProcess}, and note that when resolving or searching for the
executable path with @code{shell=False}, `cwd' does not override the
current working directory and `env' cannot override the @code{PATH}
environment variable. Using a full path avoids all of these variations.
@end quotation
@end cartouche

시퀀스로 외부 프로그램에 어떤 인자를 전달하는 예는 다음과 같습니다:

@example
Popen(["/usr/bin/git", "commit", "-m", "Fixes a bug."])
@end example

POSIX에서, `args'가 문자열이면, 문자열은 실행할 프로그램의 이름이나 경로로 해석됩니다. 그러나, 이것은 프로그램에 인자를 전달하지 않을 때만 수행할 수 있습니다.

@cartouche
@quotation 참고 
특히 복잡한 경우에, 셸 명령을 인자의 시퀀스로 나누는 방법이 명확하지 않을 수 있습니다. @ref{75d,,shlex.split()}는 `args'의 올바른 토큰화를 결정하는 방법을 보여줄 수 있습니다:

@example
>>> import shlex, subprocess
>>> command_line = input()
/bin/vikings -input eggs.txt -output "spam spam.txt" -cmd "echo '$MONEY'"
>>> args = shlex.split(command_line)
>>> print(args)
['/bin/vikings', '-input', 'eggs.txt', '-output', 'spam spam.txt', '-cmd', "echo '$MONEY'"]
>>> p = subprocess.Popen(args) # 성공!
@end example

특히 셸에서 공백으로 구분된 옵션(가령 `-input')과 인자(가령 `eggs.txt')는 별도의 리스트 요소로 들어가지만, 셸에서 사용될 때 인용(quoting)이나 역 슬래시 이스케이프가 필요한 인자(가령 스페이스가 포함된 파일명이나 위에 표시된 `echo' 명령)는 단일 리스트 요소임에 유의하십시오.
@end quotation
@end cartouche

윈도우에서, `args'가 시퀀스이면, @ref{3776,,윈도우에서 인자 시퀀스를 문자열로 변환하기}에 설명된 방식으로 문자열로 변환됩니다. 하부 @code{CreateProcess()}가 문자열에서 작동하기 때문입니다.


버전 3.6에서 변경: POSIX에서, `args' 매개 변수는 `shell'이 @code{False}이면 @ref{5a0,,경로류 객체}나 경로류 객체를 포함하는 시퀀스를 받아들입니다.



버전 3.8에서 변경: 윈도우에서, `args' 매개 변수는 `shell'이 @code{False}이면 @ref{5a0,,경로류 객체}나 바이트열과 경로류 객체를 포함하는 시퀀스를 받아들입니다.


`shell' 인자(기본값은 @code{False})는 셸을 실행할 프로그램으로 사용할지를 지정합니다. `shell'이 @code{True}이면, `args'를 시퀀스가 아닌 문자열로 전달하는 것이 좋습니다.

POSIX에서 @code{shell=True}일 때, 셸의 기본값은 @code{/bin/sh}입니다. `args'가 문자열이면, 문자열은 셸을 통해 실행할 명령을 지정합니다. 이것은 문자열이 프롬프트에서 입력할 때와 똑같이 포맷되어야 한다는 것을 의미합니다. 예를 들어, 스페이스가 포함된 파일명을 인용하거나 역 슬래시 이스케이핑 하는 것을 포함합니다. `args'가 시퀀스이면, 첫 번째 항목이 명령 문자열을 지정하고, 추가 항목은 셸 자체에 대한 추가 인자로 처리됩니다. 즉, @ref{4b8,,Popen}은 다음과 동등한 것을 수행합니다:

@example
Popen(['/bin/sh', '-c', args[0], args[1], ...])
@end example

윈도우에서 @code{shell=True}일 때, 
@geindex COMSPEC
@geindex 환경 변수; COMSPEC
@code{COMSPEC} 환경 변수는 기본 셸을 지정합니다. 윈도우에서 @code{shell=True}를 지정해야 하는 유일한 경우는 실행하려는 명령이 셸에 내장되었을 때입니다 (예를 들어 @code{dir}이나 @code{copy}). 배치 파일이나 콘솔 기반 실행 파일을 실행하기 위해 @code{shell=True}가 필요하지 않습니다.

@cartouche
@quotation 참고 
@code{shell=True}를 사용하기 전에 @ref{3774,,보안 고려 사항} 섹션을 읽으십시오.
@end quotation
@end cartouche

`bufsize'는 stdin/stdout/stderr 파이프 파일 객체를 만들 때 @ref{316,,open()} 함수에 해당 인자로 제공됩니다:


@itemize -

@item 
@code{0}은 버퍼링 되지 않음을 의미합니다 (읽기와 쓰기는 한 번의 시스템 호출이며 짧게 반환할 수 있습니다)

@item 
@code{1}은 줄 버퍼링을 의미합니다 (@code{text=True}이거나 @code{universal_newlines=True}인 경우만 사용할 수 있습니다)

@item 
다른 양수 값은 대략 그 크기의 버퍼를 사용함을 의미합니다.

@item 
음의 bufsize(기본값)는 시스템 기본값 io.DEFAULT_BUFFER_SIZE가 사용됨을 의미합니다.
@end itemize


버전 3.3.1에서 변경: `bufsize'의 기본값은 이제 -1이 되어 대부분의 코드가 기대하는 동작과 일치하도록 기본적으로 버퍼링을 활성화합니다. 파이썬 3.2.4와 3.3.1 이전 버전에서는 버퍼링 되지 않고 짧은 읽기를 허용하는 @code{0}으로 기본값이 잘못 설정되었습니다. 이것은 의도하지 않은 것이며 대부분의 코드가 기대하는 파이썬 2의 동작과 일치하지 않았습니다.


`executable' 인자는 실행할 대체 프로그램을 지정합니다. 거의 필요하지 않습니다. @code{shell=False}일 때, `executable'은 `args'에 의해 지정된 프로그램을 대체합니다. 그러나, 원래 `args'는 여전히 프로그램으로 전달됩니다. 대부분의 프로그램은 `args'에 의해 지정된 프로그램을 명령 이름으로 취급합니다, 그래서 실제로 실행되는 프로그램과 다를 수 있습니다. POSIX에서, `args' 이름은 @code{ps}와 같은 유틸리티에서 실행 파일의 표시 이름이 됩니다. @code{shell=True}이면, POSIX에서 `executable' 인자는 기본 @code{/bin/sh}의 대체 셸을 지정합니다.


버전 3.6에서 변경: POSIX에서 `executable' 매개 변수는 @ref{5a0,,경로류 객체}를 받아들입니다.



버전 3.8에서 변경: 윈도우에서 `executable' 매개 변수는 바이트열과 @ref{5a0,,경로류 객체}를 받아들입니다.



버전 3.12에서 변경: Changed Windows shell search order for @code{shell=True}. The current
directory and @code{%PATH%} are replaced with @code{%COMSPEC%} and
@code{%SystemRoot%\System32\cmd.exe}. As a result, dropping a
malicious program named @code{cmd.exe} into a current directory no
longer works.


`stdin', `stdout' 및 `stderr'은 각각 실행된 프로그램의 표준 입력, 표준 출력 및 표준 에러 파일 핸들을 지정합니다. 유효한 값은 @code{None}, @ref{d7f,,PIPE}, @ref{1353,,DEVNULL}, 기존 파일 기술자 (양의 정수) 및 유효한 파일 기술자를 가진 기존 @ref{13c8,,파일 객체}입니다. 기본 설정 @code{None}으로는, 리디렉션은 발생하지 않습니다. @code{PIPE}는 자식에 대한 새 파이프를 만들어야 함을 나타냅니다. @code{DEVNULL}은 특수 파일 @ref{1e10,,os.devnull}이 사용될 것임을 나타냅니다. 또한, `stderr'은 @ref{375e,,STDOUT}일 수 있으며, 이는 응용 프로그램의 stderr 데이터가 `stdout'과 같은 파일 핸들로 캡처되어야 함을 나타냅니다.

`preexec_fn'이 콜러블 객체로 설정되면, 이 객체는 자식 프로세스가 실행되기 직전에 자식 프로세스에서 호출됩니다. (POSIX 전용)

@cartouche
@quotation 경고 
`preexec_fn' 매개 변수는 응용 프로그램에 스레드가 있을 때 사용하기에 안전하지 않습니다. exec가 호출되기 전에 자식 프로세스가 교착 상태에 빠질 수 있습니다.
@end quotation
@end cartouche

@cartouche
@quotation 참고 
자식의 환경을 수정해야 하면 `preexec_fn'에서 하지 말고 `env' 매개 변수를 사용하십시오. `start_new_session'과 `process_group' 매개 변수는 자식에서 @ref{1db7,,os.setsid()}나 @ref{3046,,os.setpgid()}를 호출하려고 `preexec_fn'을 사용하는 코드를 대체해야 합니다.
@end quotation
@end cartouche


버전 3.8에서 변경: 서브 인터프리터에서 `preexec_fn' 매개 변수가 더는 지원되지 않습니다. 서브 인터프리터에서 매개 변수를 사용하면 @ref{244,,RuntimeError}가 발생합니다. 새로운 제약 사항은 mod_wsgi, uWSGI 및 기타 내장(embedded) 환경에 배치된 응용 프로그램에 영향을 줄 수 있습니다.


`close_fds'가 참이면, @code{0}, @code{1} 및 @code{2}를 제외한 모든 파일 기술자가 자식 프로세스가 실행되기 전에 닫힙니다. 그렇지 않고 `close_fds'가 거짓이면, 파일 기술자는 @ref{10fb,,파일 기술자의 상속}에 설명된 대로 상속 가능 플래그를 따릅니다.

윈도우에서, `close_fds'가 참이면 @ref{e07,,STARTUPINFO.lpAttributeList}의 @code{handle_list} 요소에 명시적으로 전달되거나 표준 핸들 리디렉션에 의하지 않는 한 자식 프로세스가 핸들을 상속하지 않습니다.


버전 3.2에서 변경: `close_fds'의 기본값은 @ref{d2a,,False}에서 위에서 설명한 것으로 변경되었습니다.



버전 3.7에서 변경: 윈도우에서 표준 핸들을 리디렉션 할 때 `close_fds'의 기본값이 @ref{d2a,,False}에서 @ref{e06,,True}로 변경되었습니다. 이제 표준 핸들을 리디렉션 할 때 `close_fds'를 @code{True}로 설정할 수 있습니다.


`pass_fds'는 부모와 자식 사이에 열려있는 파일 기술자의 선택적 시퀀스입니다. `pass_fds'를 제공하면 `close_fds'가 @ref{e06,,True}가 됩니다. (POSIX 전용)


버전 3.2에서 변경: `pass_fds' 매개 변수가 추가되었습니다.


`cwd'가 @code{None}이 아니면, 함수는 자식을 실행하기 전에 작업 디렉터리를 `cwd'로 변경합니다. `cwd'는 문자열, 바이트열 또는 @ref{5a0,,경로류} 객체일 수 있습니다. POSIX 에서, 함수는 실행 파일 경로가 상대 경로이면 `cwd'를 기준으로 `executable'(또는 `args'의 첫 번째 항목)을 찾습니다.


버전 3.6에서 변경: POSIX에서 `cwd' 매개 변수는 @ref{5a0,,경로류 객체}를 받아들입니다.



버전 3.7에서 변경: 윈도우에서 `cwd' 매개 변수는 @ref{5a0,,경로류 객체}를 받아들입니다.



버전 3.8에서 변경: 윈도우에서 `cwd' 매개 변수는 바이트열 객체를 받아들입니다.


`restore_signals'가 참(기본값)이면 파이썬이 SIG_IGN으로 설정한 모든 시그널은 실행 전에 자식 프로세스에서 SIG_DFL로 복원됩니다. 현재 여기에는 SIGPIPE, SIGXFZ 및 SIGXFSZ 시그널이 포함됩니다. (POSIX 전용)


버전 3.2에서 변경: `restore_signals'가 추가되었습니다.


`start_new_session'이 참이면 서브 프로세스를 실행하기 전에 자식 프로세스에서 @code{setsid()} 시스템 호출이 수행됩니다.

@ref{213c,,가용성}: POSIX


버전 3.2에서 변경: `start_new_session'이 추가되었습니다.


`process_group'이 음이 아닌 정수면, 서브 프로세스를 실행하기 전에 자식 프로세스에서 @code{setpgid(0, value)} 시스템 호출이 수행됩니다.

@ref{213c,,가용성}: POSIX


버전 3.11에서 변경: `process_group'이 추가되었습니다.


`group'이 @code{None}이 아니면, 서브 프로세스를 실행하기 전에 자식 프로세스에서 setregid() 시스템 호출이 수행됩니다. 제공된 값이 문자열이면, @ref{3777,,grp.getgrnam()}을 통해 조회되고 @code{gr_gid}의 값이 사용됩니다. 값이 정수이면, 그대로 전달됩니다. (POSIX 전용)

@ref{213c,,가용성}: POSIX


Added in version 3.9.


`extra_groups'가 @code{None}이 아니면, 서브 프로세스를 실행하기 전에 자식 프로세스에서 setgroups() 시스템 호출이 수행됩니다. `extra_groups'에 제공된 문자열은 @ref{3777,,grp.getgrnam()}을 통해 조회되며 @code{gr_gid}의 값이 사용됩니다. 정숫값은 그대로 전달됩니다. (POSIX 전용)

@ref{213c,,가용성}: POSIX


Added in version 3.9.


`user'가 @code{None}이 아니면, 서브 프로세스를 실행하기 전에 자식 프로세스에서 setreuid() 시스템 호출이 수행됩니다. 제공된 값이 문자열이면, @ref{3778,,pwd.getpwnam()}을 통해 조회되고 @code{pw_uid}의 값이 사용됩니다. 값이 정수이면, 그대로 전달됩니다. (POSIX 전용)

@ref{213c,,가용성}: POSIX


Added in version 3.9.


`umask'가 음이 아니면, 서브 프로세스를 실행하기 전에 자식 프로세스에서 umask() 시스템 호출이 수행됩니다.

@ref{213c,,가용성}: POSIX


Added in version 3.9.


`env'가 @code{None}이 아니면, 새 프로세스의 환경 변수를 정의하는 매핑이어야 합니다; 이것은 현재 프로세스의 환경을 상속하는 기본 동작 대신 사용됩니다. 이 매핑은 모든 플랫폼에서 문자열에서 문자열로, POSIX 플랫폼에서는 바이트열에서 바이트열로 일 수 있으며, 이는 @ref{259,,os.environ}이나 @ref{25a,,os.environb}와 유사합니다.

@cartouche
@quotation 참고 
If specified, `env' must provide any variables required for the program to
execute.  On Windows, in order to run a side-by-side assembly@footnote{https://en.wikipedia.org/wiki/Side-by-Side_Assembly} the
specified `env' `must' include a valid @code{%SystemRoot%}.
@end quotation
@end cartouche

`encoding'이나 `errors'가 지정되거나, `text'가 참이면, 파일 객체 `stdin', `stdout' 및 `stderr'은 위의 @ref{375d,,자주 사용되는 인자}에서 설명한 대로 지정된 `encoding'과 `errors'로 텍스트 모드로 열립니다. `universal_newlines' 인자는 `text'와 동등하며 이전 버전과의 호환성을 위해 제공됩니다. 기본적으로, 파일 객체는 바이너리 모드로 열립니다.


Added in version 3.6: `encoding'과 `errors'가 추가되었습니다.



Added in version 3.7: `text'가 `universal_newlines'의 더 가독성 있는 별칭으로 추가되었습니다.


주어지면, `startupinfo'는 @ref{3779,,STARTUPINFO} 객체가 되며, 하부 @code{CreateProcess} 함수로 전달됩니다.

주어지면, `creationflags'는 다음 플래그 중 하나 이상일 수 있습니다:


@itemize *

@item 
@ref{377a,,CREATE_NEW_CONSOLE}

@item 
@ref{377b,,CREATE_NEW_PROCESS_GROUP}

@item 
@ref{377c,,ABOVE_NORMAL_PRIORITY_CLASS}

@item 
@ref{377d,,BELOW_NORMAL_PRIORITY_CLASS}

@item 
@ref{377e,,HIGH_PRIORITY_CLASS}

@item 
@ref{377f,,IDLE_PRIORITY_CLASS}

@item 
@ref{3780,,NORMAL_PRIORITY_CLASS}

@item 
@ref{3781,,REALTIME_PRIORITY_CLASS}

@item 
@ref{3782,,CREATE_NO_WINDOW}

@item 
@ref{3783,,DETACHED_PROCESS}

@item 
@ref{3784,,CREATE_DEFAULT_ERROR_MODE}

@item 
@ref{3785,,CREATE_BREAKAWAY_FROM_JOB}
@end itemize

`pipesize' can be used to change the size of the pipe when
@ref{d7f,,PIPE} is used for `stdin', `stdout' or `stderr'. The size of the pipe
is only changed on platforms that support this (only Linux at this time of
writing). Other platforms will ignore this parameter.


버전 3.10에서 변경: `pipesize' 매개 변수를 추가했습니다.


Popen 객체는 @ref{186,,with} 문을 통해 컨텍스트 관리자로 지원됩니다; 빠져나갈 때, 표준 파일 기술자가 닫히고 프로세스를 기다립니다.

@example
with Popen(["ifconfig"], stdout=PIPE) as proc:
    log.write(proc.stdout.read())
@end example

Popen과 이 모듈에서 이를 사용하는 다른 함수는 인자 @code{executable}, @code{args}, @code{cwd} 및 @code{env}로 @ref{1c6c,,감사 이벤트} @code{subprocess.Popen}을 발생시킵니다. @code{args}의 값은 플랫폼에 따라 단일 문자열이나 문자열 리스트일 수 있습니다.


버전 3.2에서 변경: 컨텍스트 관리자 지원이 추가되었습니다.



버전 3.6에서 변경: 자식 프로세스가 여전히 실행 중이면 이제 Popen 파괴자(destructor)가 @ref{54e,,ResourceWarning} 경고를 발생시킵니다.



버전 3.8에서 변경: Popen은 성능 향상을 위해 때에 따라 @ref{52e,,os.posix_spawn()}을 사용할 수 있습니다. 리눅스용 윈도우 서브 시스템(Windows Subsystem for Linux)과 QEMU 사용자 에뮬레이션(QEMU User Emulation)에서, @code{os.posix_spawn()}을 사용하는 Popen 생성자는 더는 프로그램 누락과 같은 에러에 대한 예외를 발생시키지 않지만, 자식 프로세스는 0이 아닌 @ref{c82,,returncode}로 실패합니다.

@end deffn

@node 예외<8>,,Popen 생성자,Using the subprocess Module
@anchor{library/subprocess exceptions}@anchor{3786}
@subsubsection 예외


새 프로그램이 실행을 시작하기 전에 자식 프로세스에서 발생한 예외는 부모에서 다시 발생합니다.

The most common exception raised is @ref{2c0,,OSError}.  This occurs, for example,
when trying to execute a non-existent file.  Applications should prepare for
@code{OSError} exceptions. Note that, when @code{shell=True}, @code{OSError}
will be raised by the child only if the selected shell itself was not found.
To determine if the shell failed to find the requested application, it is
necessary to check the return code or output from the subprocess.

@ref{4b8,,Popen}이 유효하지 않은 인자로 호출되면 @ref{2ec,,ValueError}가 발생합니다.

호출된 프로세스가 0이 아닌 반환 코드를 반환하면 @ref{376a,,check_call()}과 @ref{11c1,,check_output()}은 @ref{1529,,CalledProcessError}를 발생시킵니다.

@ref{d7e,,run()}과 @ref{17b1,,Popen.communicate()}와 같은 `timeout' 매개 변수를 받아들이는 모든 함수와 메서드는 프로세스가 종료되기 전에 시간제한이 만료되면 @ref{17b2,,TimeoutExpired}를 발생시킵니다.

이 모듈에 정의된 예외는 모두 @ref{3764,,SubprocessError}를 상속합니다.


Added in version 3.3: @ref{3764,,SubprocessError} 베이스 클래스가 추가되었습니다.


@node 보안 고려 사항<2>,Popen 객체,Using the subprocess Module,subprocess — 서브 프로세스 관리
@anchor{library/subprocess security-considerations}@anchor{3774}@anchor{library/subprocess subprocess-security}@anchor{3787}
@subsubsection 보안 고려 사항


다른 popen 함수와 달리, 이 라이브러리는 시스템 셸을 호출하도록 묵시적으로 선택하지 않습니다. 이는 셸 메타 문자를 포함한 모든 문자를 자식 프로세스로 안전하게 전달할 수 있음을 의미합니다. @code{shell=True}를 통해 셸을 명시적으로 호출하면, 셸 주입@footnote{https://en.wikipedia.org/wiki/Shell_injection#Shell_injection} 취약점을 피하고자 모든 공백과 메타 문자를 적절하게 인용하는 것은 응용 프로그램의 책임입니다. @ref{3788,,일부 플랫폼}에서, 이 이스케이핑을 위해 @ref{581,,shlex.quote()}를 사용할 수 있습니다.

On Windows, batch files (@code{*.bat} or @code{*.cmd}) may be launched by the
operating system in a system shell regardless of the arguments passed to this
library. This could result in arguments being parsed according to shell rules,
but without any escaping added by Python. If you are intentionally launching a
batch file with arguments from untrusted sources, consider passing
@code{shell=True} to allow Python to escape special characters. See gh-114539@footnote{https://github.com/python/cpython/issues/114539}
for additional discussion.

@node Popen 객체,윈도우 Popen 도우미,보안 고려 사항<2>,subprocess — 서브 프로세스 관리
@anchor{library/subprocess popen-objects}@anchor{3789}
@subsubsection Popen 객체


@ref{4b8,,Popen} 클래스의 인스턴스에는 다음과 같은 메서드가 있습니다:

@geindex poll() (subprocess.Popen 메서드)
@anchor{library/subprocess subprocess Popen poll}@anchor{378a}
@deffn {메서드} Popen.poll ()

자식 프로세스가 종료되었는지 확인합니다. @ref{c82,,returncode} 어트리뷰트를 설정하고 반환합니다. 그렇지 않으면, @code{None}을 반환합니다.
@end deffn

@geindex wait() (subprocess.Popen 메서드)
@anchor{library/subprocess subprocess Popen wait}@anchor{edf}
@deffn {메서드} Popen.wait (timeout=None)

자식 프로세스가 종료될 때까지 기다립니다. @ref{c82,,returncode} 어트리뷰트를 설정하고 반환합니다.

`timeout' 초 후에 프로세스가 종료되지 않으면, @ref{17b2,,TimeoutExpired} 예외를 발생시킵니다. 이 예외를 잡고 다시 기다리는 것은 안전합니다.

@cartouche
@quotation 참고 
이는 @code{stdout=PIPE}나 @code{stderr=PIPE}를 사용하고 자식 프로세스가 파이프에 너무 많은 출력을 보내서 OS 파이프 버퍼가 더 많은 데이터를 받아들일 때까지 기다리느라 블록하면 교착 상태에 빠집니다. 파이프를 사용할 때 이를 피하려면 @ref{17b1,,Popen.communicate()}를 사용하십시오.
@end quotation
@end cartouche

@cartouche
@quotation 참고 
@code{timeout} 매개 변수가 @code{None}이 아닐 때, (POSIX 에서) 이 함수는 비지 루프(비 블로킹 호출과 짧은 잠자기)를 사용하여 구현됩니다. 비동기 대기에는 @ref{b,,asyncio} 모듈을 사용하십시오: @ref{c6a,,asyncio.create_subprocess_exec}를 참조하십시오.
@end quotation
@end cartouche


버전 3.3에서 변경: `timeout'이 추가되었습니다.

@end deffn

@geindex communicate() (subprocess.Popen 메서드)
@anchor{library/subprocess subprocess Popen communicate}@anchor{17b1}
@deffn {메서드} Popen.communicate (input=None, timeout=None)

프로세스와 상호 작용합니다: stdin에 데이터를 보냅니다. 파일 끝에 도달할 때까지 stdout과 stderr에서 데이터를 읽습니다. 프로세스가 종료될 때까지 기다리고, @ref{c82,,returncode} 어트리뷰트를 설정합니다. 선택적 `input' 인자는 자식 프로세스로 전송될 데이터이거나, 자식으로 데이터를 보내지 않으면 @code{None}이어야 합니다. 스트림이 텍스트 모드로 열렸으면, `input'은 문자열이어야 합니다. 그렇지 않으면, 바이트열이어야 합니다.

@ref{17b1,,communicate()}는 튜플 @code{(stdout_data, stderr_data)}를 반환합니다. 스트림이 텍스트 모드로 열렸으면 데이터는 문자열이 됩니다. 그렇지 않으면 바이트열입니다.

프로세스의 stdin으로 데이터를 보내려면, @code{stdin=PIPE}를 사용하여 Popen 객체를 만들어야 함에 유의하십시오. 마찬가지로, 결과 튜플에서 @code{None} 이외의 것을 얻으려면, @code{stdout=PIPE} 및/또는 @code{stderr=PIPE}도 제공해야 합니다.

If the process does not terminate after `timeout' seconds, a
@ref{17b2,,TimeoutExpired} exception will be raised.  Catching this exception and
retrying communication will not lose any output.  Supplying `input' to a
subsequent post-timeout @code{communicate()} call is in undefined behavior
and may become an error in the future.

시간제한이 만료되면 자식 프로세스를 죽이지 않습니다, 올바르게 정리하려면 제대로 작동하는 응용 프로그램은 자식 프로세스를 죽이고 통신을 완료해야 합니다:

@example
proc = subprocess.Popen(...)
try:
    outs, errs = proc.communicate(timeout=15)
except TimeoutExpired:
    proc.kill()
    outs, errs = proc.communicate()
@end example

After a call to @code{communicate()} raises @ref{17b2,,TimeoutExpired}, do
not call @ref{edf,,wait()}. Use an additional @code{communicate()}
call to finish handling pipes and populate the @ref{c82,,returncode}
attribute.

@cartouche
@quotation 참고 
읽은 데이터는 메모리에 버퍼링 되므로, 데이터 크기가 크거나 무제한이면 이 메서드를 사용하지 마십시오.
@end quotation
@end cartouche


버전 3.3에서 변경: `timeout'이 추가되었습니다.

@end deffn

@geindex send_signal() (subprocess.Popen 메서드)
@anchor{library/subprocess subprocess Popen send_signal}@anchor{15e3}
@deffn {메서드} Popen.send_signal (signal)

시그널 `signal'을 자식에게 보냅니다.

프로세스가 완료되었으면 아무것도 하지 않습니다.

@cartouche
@quotation 참고 
윈도우에서, SIGTERM은 @ref{15e1,,terminate()}의 별칭입니다. CTRL_C_EVENT와 CTRL_BREAK_EVENT는 @code{CREATE_NEW_PROCESS_GROUP}을 포함하는 `creationflags' 매개 변수로 시작된 프로세스로 보낼 수 있습니다.
@end quotation
@end cartouche
@end deffn

@geindex terminate() (subprocess.Popen 메서드)
@anchor{library/subprocess subprocess Popen terminate}@anchor{15e1}
@deffn {메서드} Popen.terminate ()

자식을 멈춥니다. POSIX OS에서 이 메서드는 @ref{15e4,,SIGTERM}을 자식에게 보냅니다. 윈도우에서는 자식을 중지하기 위해 Win32 API 함수 @code{TerminateProcess()}가 호출됩니다.
@end deffn

@geindex kill() (subprocess.Popen 메서드)
@anchor{library/subprocess subprocess Popen kill}@anchor{15e2}
@deffn {메서드} Popen.kill ()

자식을 죽입니다. POSIX OS에서 이 함수는 SIGKILL을 자식에게 보냅니다. 윈도우에서 @ref{15e2,,kill()}은 @ref{15e1,,terminate()}의 별칭입니다.
@end deffn

The following attributes are also set by the class for you to access.
Reassigning them to new values is unsupported:

@geindex args (subprocess.Popen의 속성)
@anchor{library/subprocess subprocess Popen args}@anchor{378b}
@deffn {속성} Popen.args

@ref{4b8,,Popen}으로 전달된 `args' 인자 – 프로그램 인자의 시퀀스거나 단일 문자열.


Added in version 3.3.

@end deffn

@geindex stdin (subprocess.Popen의 속성)
@anchor{library/subprocess subprocess Popen stdin}@anchor{3771}
@deffn {속성} Popen.stdin

`stdin' 인자가 @ref{d7f,,PIPE}이면, 이 어트리뷰트는 @ref{316,,open()}이 반환한 쓰기 가능한 스트림 객체입니다. `encoding'이나 `errors' 인자가 지정되었거나 `text'나 `universal_newlines' 인자가 @code{True}이면, 스트림은 텍스트 스트림이고, 그렇지 않으면 바이트 스트림입니다. `stdin' 인자가 @code{PIPE}가 아니면, 이 어트리뷰트는 @code{None}입니다.
@end deffn

@geindex stdout (subprocess.Popen의 속성)
@anchor{library/subprocess subprocess Popen stdout}@anchor{3772}
@deffn {속성} Popen.stdout

`stdout' 인자가 @ref{d7f,,PIPE}이면, 이 어트리뷰트는 @ref{316,,open()}이 반환한 읽기 가능한 스트림 객체입니다. 스트림에서 읽으면 자식 프로세스의 출력을 제공합니다. `encoding'이나 `errors' 인자가 지정되었거나 `text'나 `universal_newlines' 인자가 @code{True}이면, 스트림은 텍스트 스트림이고, 그렇지 않으면 바이트 스트림입니다. `stdout' 인자가 @code{PIPE}가 아니면, 이 어트리뷰트는 @code{None}입니다.
@end deffn

@geindex stderr (subprocess.Popen의 속성)
@anchor{library/subprocess subprocess Popen stderr}@anchor{3773}
@deffn {속성} Popen.stderr

`stderr' 인자가 @ref{d7f,,PIPE}이면, 이 어트리뷰트는 @ref{316,,open()}이 반환한 읽기 가능한 스트림 객체입니다. 스트림에서 읽으면 자식 프로세스의 에러 출력을 제공합니다. `encoding'이나 `errors' 인자가 지정되었거나 `text'나 `universal_newlines' 인자가 @code{True}이면, 스트림은 텍스트 스트림이고, 그렇지 않으면 바이트 스트림입니다. `stderr' 인자가 @code{PIPE}가 아니면, 어트리뷰트는 @code{None}입니다.
@end deffn

@cartouche
@quotation 경고 
다른 OS 파이프 버퍼가 차고 자식 프로세스를 블로킹하는 것으로 인한 교착 상태를 피하려면 @ref{3771,,.stdin.write}, @ref{3772,,.stdout.read} 또는 @ref{3773,,.stderr.read} 대신 @ref{17b1,,communicate()}를 사용하십시오.
@end quotation
@end cartouche

@geindex pid (subprocess.Popen의 속성)
@anchor{library/subprocess subprocess Popen pid}@anchor{378c}
@deffn {속성} Popen.pid

자식 프로세스의 프로세스 ID

`shell' 인자를 @code{True}로 설정하면, 이것은 생성된 셸의 프로세스 ID입니다.
@end deffn

@geindex returncode (subprocess.Popen의 속성)
@anchor{library/subprocess subprocess Popen returncode}@anchor{c82}
@deffn {속성} Popen.returncode

자식 반환 코드. 초기값은 @code{None}이며, @ref{c82,,returncode}는 @ref{378a,,poll()}, @ref{edf,,wait()} 또는 @ref{17b1,,communicate()} 메서드가 프로세스가 종료되었음을 감지하면 설정합니다.

A @code{None} value indicates that the process hadn’t yet terminated at the
time of the last method call.

음수 값 @code{-N}은 자식이 시그널 @code{N}에 의해 종료되었음을 나타냅니다 (POSIX 전용).

When @code{shell=True}, the return code reflects the exit status of the shell
itself (e.g. @code{/bin/sh}), which may map signals to codes such as
@code{128+N}. See the documentation of the shell (for example, the Bash
manual’s Exit Status) for details.
@end deffn

@node 윈도우 Popen 도우미,오래된 고수준 API,Popen 객체,subprocess — 서브 프로세스 관리
@anchor{library/subprocess windows-popen-helpers}@anchor{378d}
@subsubsection 윈도우 Popen 도우미


@ref{3779,,STARTUPINFO} 클래스와 다음 상수는 윈도우에서만 사용 가능합니다.

@geindex STARTUPINFO (subprocess 클래스)
@anchor{library/subprocess subprocess STARTUPINFO}@anchor{3779}
@deffn {클래스} subprocess.STARTUPINFO (*, dwFlags=0, hStdInput=None, hStdOutput=None, hStdError=None, wShowWindow=0, lpAttributeList=None)

윈도우 STARTUPINFO@footnote{https://msdn.microsoft.com/en-us/library/ms686331(v=vs.85).aspx} 구조체의 부분적인 지원이 @ref{4b8,,Popen} 생성에 사용됩니다. 다음 어트리뷰트는 키워드 전용 인자로 전달하여 설정할 수 있습니다.


버전 3.7에서 변경: 키워드 전용 인자 지원이 추가되었습니다.


@geindex dwFlags (subprocess.STARTUPINFO의 속성)
@anchor{library/subprocess subprocess STARTUPINFO dwFlags}@anchor{378e}
@deffn {속성} dwFlags

프로세스가 창을 만들 때 특정 @ref{3779,,STARTUPINFO} 어트리뷰트가 사용되는지를 결정하는 비트 필드.

@example
si = subprocess.STARTUPINFO()
si.dwFlags = subprocess.STARTF_USESTDHANDLES | subprocess.STARTF_USESHOWWINDOW
@end example
@end deffn

@geindex hStdInput (subprocess.STARTUPINFO의 속성)
@anchor{library/subprocess subprocess STARTUPINFO hStdInput}@anchor{378f}
@deffn {속성} hStdInput

@ref{378e,,dwFlags}가 @ref{3790,,STARTF_USESTDHANDLES}를 지정하면, 이 어트리뷰트는 프로세스의 표준 입력 핸들입니다. @code{STARTF_USESTDHANDLES}가 지정되지 않으면, 표준 입력의 기본값은 키보드 버퍼입니다.
@end deffn

@geindex hStdOutput (subprocess.STARTUPINFO의 속성)
@anchor{library/subprocess subprocess STARTUPINFO hStdOutput}@anchor{3791}
@deffn {속성} hStdOutput

@ref{378e,,dwFlags}가 @ref{3790,,STARTF_USESTDHANDLES}를 지정하면, 이 어트리뷰트는 프로세스의 표준 출력 핸들입니다. 그렇지 않으면, 이 어트리뷰트가 무시되고 표준 출력의 기본값은 콘솔 창의 버퍼입니다.
@end deffn

@geindex hStdError (subprocess.STARTUPINFO의 속성)
@anchor{library/subprocess subprocess STARTUPINFO hStdError}@anchor{3792}
@deffn {속성} hStdError

@ref{378e,,dwFlags}가 @ref{3790,,STARTF_USESTDHANDLES}를 지정하면, 이 어트리뷰트는 프로세스의 표준 에러 핸들입니다. 그렇지 않으면, 이 어트리뷰트는 무시되고 표준 에러의 기본값은 콘솔 창의 버퍼입니다.
@end deffn

@geindex wShowWindow (subprocess.STARTUPINFO의 속성)
@anchor{library/subprocess subprocess STARTUPINFO wShowWindow}@anchor{3793}
@deffn {속성} wShowWindow

@ref{378e,,dwFlags}가 @ref{3794,,STARTF_USESHOWWINDOW}를 지정하면, 이 어트리뷰트는 @code{SW_SHOWDEFAULT}를 제외하고 ShowWindow@footnote{https://msdn.microsoft.com/en-us/library/ms633548(v=vs.85).aspx} 함수의 @code{nCmdShow} 매개 변수에 지정할 수 있는 값 중 어느 것이건 될 수 있습니다. 그렇지 않으면, 이 어트리뷰트는 무시됩니다.

이 어트리뷰트에 @ref{3795,,SW_HIDE}가 제공됩니다. @ref{4b8,,Popen}이 @code{shell=True}와 함께 호출될 때 사용됩니다.
@end deffn

@geindex lpAttributeList (subprocess.STARTUPINFO의 속성)
@anchor{library/subprocess subprocess STARTUPINFO lpAttributeList}@anchor{e07}
@deffn {속성} lpAttributeList

@code{STARTUPINFOEX}에 제공된 대로 프로세스 생성을 위한 추가 어트리뷰트 딕셔너리, UpdateProcThreadAttribute@footnote{https://msdn.microsoft.com/en-us/library/windows/desktop/ms686880(v=vs.85).aspx}를 참조하십시오.

지원되는 어트리뷰트:


@table @asis

@item `handle_list'

상속될 핸들의 시퀀스. 비어 있지 않으면 `close_fds'는 참이어야 합니다.

@ref{4b8,,Popen} 생성자에 전달될 때 @ref{10ff,,os.set_handle_inheritable()}로 핸들을 일시적으로 상속할 수 있도록 만들어야 합니다, 그렇지 않으면 윈도우 에러 @code{ERROR_INVALID_PARAMETER} (87) 로 @ref{2c0,,OSError}가 발생합니다.

@cartouche
@quotation 경고 
다중 스레드 프로세스에서, 이 기능을 @ref{1662,,os.system()}과 같은 모든 핸들을 상속하는 다른 프로세스 생성 함수에 대한 동시 호출과 결합할 때 상속 가능으로 표시된 핸들의 누수를 피하도록 주의하십시오. 이것은 일시적으로 상속 가능한 핸들을 만드는 표준 핸들 리디렉션에도 적용됩니다.
@end quotation
@end cartouche
@end table


Added in version 3.7.

@end deffn
@end deffn

@menu
* 윈도우 상수:: 

@end menu

@node 윈도우 상수,,,윈도우 Popen 도우미
@anchor{library/subprocess windows-constants}@anchor{3796}
@subsubsection 윈도우 상수


The @code{subprocess} module exposes the following constants.

@geindex STD_INPUT_HANDLE (subprocess 모듈)
@anchor{library/subprocess subprocess STD_INPUT_HANDLE}@anchor{3797}
@deffn {데이터} subprocess.STD_INPUT_HANDLE

표준 입력 장치. 처음에는, 콘솔 입력 버퍼입니다, @code{CONIN$}.
@end deffn

@geindex STD_OUTPUT_HANDLE (subprocess 모듈)
@anchor{library/subprocess subprocess STD_OUTPUT_HANDLE}@anchor{3798}
@deffn {데이터} subprocess.STD_OUTPUT_HANDLE

표준 출력 장치. 처음에는, 활성 콘솔 화면 버퍼입니다, @code{CONOUT$}.
@end deffn

@geindex STD_ERROR_HANDLE (subprocess 모듈)
@anchor{library/subprocess subprocess STD_ERROR_HANDLE}@anchor{3799}
@deffn {데이터} subprocess.STD_ERROR_HANDLE

표준 에러 장치. 처음에는, 활성 콘솔 화면 버퍼입니다, @code{CONOUT$}.
@end deffn

@geindex SW_HIDE (subprocess 모듈)
@anchor{library/subprocess subprocess SW_HIDE}@anchor{3795}
@deffn {데이터} subprocess.SW_HIDE

창을 숨깁니다. 다른 창이 활성화됩니다.
@end deffn

@geindex STARTF_USESTDHANDLES (subprocess 모듈)
@anchor{library/subprocess subprocess STARTF_USESTDHANDLES}@anchor{3790}
@deffn {데이터} subprocess.STARTF_USESTDHANDLES

@ref{378f,,STARTUPINFO.hStdInput}, @ref{3791,,STARTUPINFO.hStdOutput} 및 @ref{3792,,STARTUPINFO.hStdError} 어트리뷰트에 추가 정보가 포함되었음을 지정합니다.
@end deffn

@geindex STARTF_USESHOWWINDOW (subprocess 모듈)
@anchor{library/subprocess subprocess STARTF_USESHOWWINDOW}@anchor{3794}
@deffn {데이터} subprocess.STARTF_USESHOWWINDOW

@ref{3793,,STARTUPINFO.wShowWindow} 어트리뷰트에 추가 정보가 포함되었음을 지정합니다.
@end deffn

@geindex STARTF_FORCEONFEEDBACK (subprocess 모듈)
@anchor{library/subprocess subprocess STARTF_FORCEONFEEDBACK}@anchor{379a}
@deffn {데이터} subprocess.STARTF_FORCEONFEEDBACK

A @ref{378e,,STARTUPINFO.dwFlags} parameter to specify that the
`Working in Background' mouse cursor will be displayed while a
process is launching. This is the default behavior for GUI
processes.


Added in version 3.13.

@end deffn

@geindex STARTF_FORCEOFFFEEDBACK (subprocess 모듈)
@anchor{library/subprocess subprocess STARTF_FORCEOFFFEEDBACK}@anchor{379b}
@deffn {데이터} subprocess.STARTF_FORCEOFFFEEDBACK

A @ref{378e,,STARTUPINFO.dwFlags} parameter to specify that the mouse
cursor will not be changed when launching a process.


Added in version 3.13.

@end deffn

@geindex CREATE_NEW_CONSOLE (subprocess 모듈)
@anchor{library/subprocess subprocess CREATE_NEW_CONSOLE}@anchor{377a}
@deffn {데이터} subprocess.CREATE_NEW_CONSOLE

새로운 프로세스는 부모의 콘솔을 상속(기본값)하는 대신 새로운 콘솔을 갖습니다.
@end deffn

@geindex CREATE_NEW_PROCESS_GROUP (subprocess 모듈)
@anchor{library/subprocess subprocess CREATE_NEW_PROCESS_GROUP}@anchor{377b}
@deffn {데이터} subprocess.CREATE_NEW_PROCESS_GROUP

새 프로세스 그룹이 만들어지도록 지정하는 @ref{4b8,,Popen} @code{creationflags} 매개 변수. 이 플래그는 서브 프로세스에 @ref{156c,,os.kill()}을 사용하기 위해 필요합니다.

@ref{377a,,CREATE_NEW_CONSOLE}이 지정되면 이 플래그는 무시됩니다.
@end deffn

@geindex ABOVE_NORMAL_PRIORITY_CLASS (subprocess 모듈)
@anchor{library/subprocess subprocess ABOVE_NORMAL_PRIORITY_CLASS}@anchor{377c}
@deffn {데이터} subprocess.ABOVE_NORMAL_PRIORITY_CLASS

새 프로세스가 평균 우선순위를 초과하도록 지정하는 @ref{4b8,,Popen} @code{creationflags} 매개 변수.


Added in version 3.7.

@end deffn

@geindex BELOW_NORMAL_PRIORITY_CLASS (subprocess 모듈)
@anchor{library/subprocess subprocess BELOW_NORMAL_PRIORITY_CLASS}@anchor{377d}
@deffn {데이터} subprocess.BELOW_NORMAL_PRIORITY_CLASS

새 프로세스가 평균 우선순위보다 낮도록 지정하는 @ref{4b8,,Popen} @code{creationflags} 매개 변수.


Added in version 3.7.

@end deffn

@geindex HIGH_PRIORITY_CLASS (subprocess 모듈)
@anchor{library/subprocess subprocess HIGH_PRIORITY_CLASS}@anchor{377e}
@deffn {데이터} subprocess.HIGH_PRIORITY_CLASS

새 프로세스가 높은 우선순위를 갖도록 지정하는 @ref{4b8,,Popen} @code{creationflags} 매개 변수입니다.


Added in version 3.7.

@end deffn

@geindex IDLE_PRIORITY_CLASS (subprocess 모듈)
@anchor{library/subprocess subprocess IDLE_PRIORITY_CLASS}@anchor{377f}
@deffn {데이터} subprocess.IDLE_PRIORITY_CLASS

새 프로세스가 유휴 (가장 낮은) 우선순위를 갖도록 지정하는 @ref{4b8,,Popen} @code{creationflags} 매개 변수.


Added in version 3.7.

@end deffn

@geindex NORMAL_PRIORITY_CLASS (subprocess 모듈)
@anchor{library/subprocess subprocess NORMAL_PRIORITY_CLASS}@anchor{3780}
@deffn {데이터} subprocess.NORMAL_PRIORITY_CLASS

새 프로세스가 보통 우선순위를 갖도록 지정하는 @ref{4b8,,Popen} @code{creationflags} 매개 변수. (기본값)


Added in version 3.7.

@end deffn

@geindex REALTIME_PRIORITY_CLASS (subprocess 모듈)
@anchor{library/subprocess subprocess REALTIME_PRIORITY_CLASS}@anchor{3781}
@deffn {데이터} subprocess.REALTIME_PRIORITY_CLASS

새 프로세스가 실시간 우선순위를 갖도록 지정하는 @ref{4b8,,Popen} @code{creationflags} 매개 변수. REALTIME_PRIORITY_CLASS를 사용하면 마우스 입력, 키보드 입력 및 백그라운드 디스크 플러시를 관리하는 시스템 스레드가 중단되므로 거의 사용하지 않아야 합니다. 이 클래스는 하드웨어와 직접 “대화”하거나 중단이 제한되어야 하는 짧은 작업을 수행하는 응용 프로그램에 적합할 수 있습니다.


Added in version 3.7.

@end deffn

@geindex CREATE_NO_WINDOW (subprocess 모듈)
@anchor{library/subprocess subprocess CREATE_NO_WINDOW}@anchor{3782}
@deffn {데이터} subprocess.CREATE_NO_WINDOW

새 프로세스가 창을 만들지 않도록 지정하는 @ref{4b8,,Popen} @code{creationflags} 매개 변수.


Added in version 3.7.

@end deffn

@geindex DETACHED_PROCESS (subprocess 모듈)
@anchor{library/subprocess subprocess DETACHED_PROCESS}@anchor{3783}
@deffn {데이터} subprocess.DETACHED_PROCESS

새 프로세스가 부모의 콘솔을 상속하지 않도록 지정하는 @ref{4b8,,Popen} @code{creationflags} 매개 변수. 이 값은 CREATE_NEW_CONSOLE과 함께 사용할 수 없습니다.


Added in version 3.7.

@end deffn

@geindex CREATE_DEFAULT_ERROR_MODE (subprocess 모듈)
@anchor{library/subprocess subprocess CREATE_DEFAULT_ERROR_MODE}@anchor{3784}
@deffn {데이터} subprocess.CREATE_DEFAULT_ERROR_MODE

새 프로세스가 호출하는 프로세스의 에러 모드를 상속하지 않도록 지정하는 @ref{4b8,,Popen} @code{creationflags} 매개 변수. 대신, 새 프로세스는 기본 에러 모드를 갖습니다. 이 기능은 하드(hard) 에러가 비활성화된 상태로 실행되는 다중 스레드 셸 응용 프로그램에 특히 유용합니다.


Added in version 3.7.

@end deffn

@geindex CREATE_BREAKAWAY_FROM_JOB (subprocess 모듈)
@anchor{library/subprocess subprocess CREATE_BREAKAWAY_FROM_JOB}@anchor{3785}
@deffn {데이터} subprocess.CREATE_BREAKAWAY_FROM_JOB

새 프로세스가 잡(job)과 연관되지 않도록 지정하는 @ref{4b8,,Popen} @code{creationflags} 매개 변수.


Added in version 3.7.

@end deffn

@node 오래된 고수준 API,Replacing Older Functions with the subprocess Module,윈도우 Popen 도우미,subprocess — 서브 프로세스 관리
@anchor{library/subprocess call-function-trio}@anchor{379c}@anchor{library/subprocess older-high-level-api}@anchor{379d}
@subsubsection 오래된 고수준 API


파이썬 3.5 이전에는, 이 세 가지 함수가 subprocess에 대한 고수준 API로 구성되었습니다. 이제 많은 경우에 @ref{d7e,,run()}을 사용할 수 있지만, 많은 기존 코드가 이러한 함수를 호출합니다.

@geindex call() (subprocess 모듈)
@anchor{library/subprocess subprocess call}@anchor{d80}
@deffn {함수} subprocess.call (args, *, stdin=None, stdout=None, stderr=None, shell=False, cwd=None, timeout=None, **other_popen_kwargs)

`args'로 기술된 명령을 실행합니다. 명령이 완료될 때까지 기다린 후 @ref{c82,,returncode} 어트리뷰트를 반환합니다.

stdout이나 stderr을 캡처해야 하는 코드는 대신 @ref{d7e,,run()}을 사용해야 합니다:

@example
run(...).returncode
@end example

stdout이나 stderr을 억제하려면, @ref{1353,,DEVNULL} 값을 제공하십시오.

위에 표시된 인자는 단지 몇 가지 일반적인 인자입니다. 전체 함수 서명은 @ref{4b8,,Popen} 생성자의 서명과 같습니다 - 이 함수는 `timeout' 이외의 모든 제공된 인자를 해당 인터페이스로 직접 전달합니다.

@cartouche
@quotation 참고 
이 함수에 @code{stdout=PIPE}나 @code{stderr=PIPE}를 사용하지 마십시오. 파이프를 읽지 않기 때문에 자식 프로세스가 OS 파이프 버퍼를 가득 채우기 충분한 출력을 생성하면 자식 프로세스가 블록 됩니다.
@end quotation
@end cartouche


버전 3.3에서 변경: `timeout'이 추가되었습니다.



버전 3.12에서 변경: Changed Windows shell search order for @code{shell=True}. The current
directory and @code{%PATH%} are replaced with @code{%COMSPEC%} and
@code{%SystemRoot%\System32\cmd.exe}. As a result, dropping a
malicious program named @code{cmd.exe} into a current directory no
longer works.

@end deffn

@geindex check_call() (subprocess 모듈)
@anchor{library/subprocess subprocess check_call}@anchor{376a}
@deffn {함수} subprocess.check_call (args, *, stdin=None, stdout=None, stderr=None, shell=False, cwd=None, timeout=None, **other_popen_kwargs)

인자로 명령을 실행합니다. 명령이 완료될 때까지 기다립니다. 반환 코드가 0이면 반환합니다, 그렇지 않으면 @ref{1529,,CalledProcessError}를 발생시킵니다. @code{CalledProcessError} 객체는 @ref{376b,,returncode} 어트리뷰트에 반환 코드를 갖습니다. @ref{376a,,check_call()}이 프로세스를 시작하지 못하면 발생된 예외를 확산합니다.

stdout이나 stderr을 캡처해야 하는 코드는 대신 @ref{d7e,,run()}을 사용해야 합니다:

@example
run(..., check=True)
@end example

stdout이나 stderr을 억제하려면, @ref{1353,,DEVNULL} 값을 제공하십시오.

위에 표시된 인자는 단지 몇 가지 일반적인 인자입니다. 전체 함수 서명은 @ref{4b8,,Popen} 생성자의 서명과 같습니다 - 이 함수는 `timeout' 이외의 모든 제공된 인자를 해당 인터페이스로 직접 전달합니다.

@cartouche
@quotation 참고 
이 함수에 @code{stdout=PIPE}나 @code{stderr=PIPE}를 사용하지 마십시오. 파이프를 읽지 않기 때문에 자식 프로세스가 OS 파이프 버퍼를 가득 채우기 충분한 출력을 생성하면 자식 프로세스가 블록 됩니다.
@end quotation
@end cartouche


버전 3.3에서 변경: `timeout'이 추가되었습니다.



버전 3.12에서 변경: Changed Windows shell search order for @code{shell=True}. The current
directory and @code{%PATH%} are replaced with @code{%COMSPEC%} and
@code{%SystemRoot%\System32\cmd.exe}. As a result, dropping a
malicious program named @code{cmd.exe} into a current directory no
longer works.

@end deffn

@geindex check_output() (subprocess 모듈)
@anchor{library/subprocess subprocess check_output}@anchor{11c1}
@deffn {함수} subprocess.check_output (args, *, stdin=None, stderr=None, shell=False, cwd=None, encoding=None, errors=None, universal_newlines=None, timeout=None, text=None, **other_popen_kwargs)

인자로 명령을 실행하고 출력을 반환합니다.

반환 코드가 0이 아니면 @ref{1529,,CalledProcessError} 가 발생합니다. @code{CalledProcessError} 객체는 @ref{376b,,returncode} 어트리뷰트에 반환 코드가 있고 @ref{376d,,output} 어트리뷰트에 출력이 있습니다.

이것은 다음과 동등합니다:

@example
run(..., check=True, stdout=PIPE).stdout
@end example

위에 표시된 인자는 단지 몇 가지 일반적인 인자입니다. 전체 함수 서명은 @ref{d7e,,run()}의 서명과 거의 같습니다 - 대부분의 인자는 해당 인터페이스로 직접 전달됩니다. @code{run()} 동작과 비교할 때 한가지 API 편차가 있습니다: @code{input=None}을 전달하면 부모의 표준 입력 파일 핸들을 사용하는 대신 @code{input=b'@w{'}} (또는 다른 인자에 따라 @code{input='@w{'}}) 와 같게 동작합니다.

기본적으로, 이 함수는 데이터를 인코딩된 바이트열로 반환합니다. 출력 데이터의 실제 인코딩은 호출되는 명령에 따라 달라질 수 있어서, 텍스트로의 디코딩은 종종 응용 프로그램 수준에서 처리해야 합니다.

@ref{375d,,자주 사용되는 인자}와 @ref{d7e,,run()}에 설명된 대로 `text', `encoding', `errors' 또는 `universal_newlines'를 @code{True}로 설정하면 이 동작을 재정의할 수 있습니다.

결과에서 표준 에러도 캡처하려면 @code{stderr=subprocess.STDOUT}을 사용하십시오:

@example
>>> subprocess.check_output(
...     "ls non_existent_file; exit 0",
...     stderr=subprocess.STDOUT,
...     shell=True)
'ls: non_existent_file: No such file or directory\n'
@end example


Added in version 3.1.



버전 3.3에서 변경: `timeout'이 추가되었습니다.



버전 3.4에서 변경: `input' 키워드 인자에 대한 지원이 추가되었습니다.



버전 3.6에서 변경: `encoding'과 `errors'가 추가되었습니다. 자세한 내용은 @ref{d7e,,run()}을 참조하십시오.



Added in version 3.7: `text'가 `universal_newlines'의 더 가독성 있는 별칭으로 추가되었습니다.



버전 3.12에서 변경: Changed Windows shell search order for @code{shell=True}. The current
directory and @code{%PATH%} are replaced with @code{%COMSPEC%} and
@code{%SystemRoot%\System32\cmd.exe}. As a result, dropping a
malicious program named @code{cmd.exe} into a current directory no
longer works.

@end deffn

@node Replacing Older Functions with the subprocess Module,레거시 셸 호출 함수,오래된 고수준 API,subprocess — 서브 프로세스 관리
@anchor{library/subprocess replacing-older-functions-with-the-subprocess-module}@anchor{379e}@anchor{library/subprocess subprocess-replacements}@anchor{138d}
@subsubsection Replacing Older Functions with the @code{subprocess} Module


이 섹션에서, “a는 b가 됩니다”는 b가 a의 대체로 사용될 수 있음을 의미합니다.

@cartouche
@quotation 참고 
이 섹션의 모든 “a” 함수는 실행되는 프로그램을 찾을 수 없으면 (다소간) 조용히 실패합니다; “b” 대체는 대신 @ref{2c0,,OSError}를 발생시킵니다.

또한, 요청된 연산이 0이 아닌 반환 코드를 생성하면 @ref{11c1,,check_output()}을 사용한 대체는 @ref{1529,,CalledProcessError}로 실패합니다. 출력은 여전히 발생한 예외의 @ref{376d,,output} 어트리뷰트로 사용 가능합니다.
@end quotation
@end cartouche

In the following examples, we assume that the relevant functions have already
been imported from the @code{subprocess} module.

@menu
* /bin/sh 셸 명령 치환 교체하기:: 
* 셸 파이프라인 교체하기:: 
* os.system() 교체하기: os system 교체하기. 
* os.spawn 패밀리 교체하기: os spawn 패밀리 교체하기. 
* Replacing os.popen(): Replacing os popen. 

@end menu

@node /bin/sh 셸 명령 치환 교체하기,셸 파이프라인 교체하기,,Replacing Older Functions with the subprocess Module
@anchor{library/subprocess replacing-bin-sh-shell-command-substitution}@anchor{379f}
@subsubsection @code{/bin/sh} 셸 명령 치환 교체하기


@example
output=$(mycmd myarg)
@end example

는 다음처럼 됩니다:

@example
output = check_output(["mycmd", "myarg"])
@end example

@node 셸 파이프라인 교체하기,os system 교체하기,/bin/sh 셸 명령 치환 교체하기,Replacing Older Functions with the subprocess Module
@anchor{library/subprocess replacing-shell-pipeline}@anchor{37a0}
@subsubsection 셸 파이프라인 교체하기


@example
output=$(dmesg | grep hda)
@end example

는 다음처럼 됩니다:

@example
p1 = Popen(["dmesg"], stdout=PIPE)
p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)
p1.stdout.close()  # p2가 종료되면 p1이 SIGPIPE를 수신하도록 허용합니다.
output = p2.communicate()[0]
@end example

p2가 p1보다 먼저 종료될 때 p1이 SIGPIPE를 수신하려면 p2를 시작한 후 @code{p1.stdout.close()} 호출이 중요합니다.

또는, 신뢰할 수 있는 입력의 경우, 셸의 자체 파이프라인 지원을 계속 사용할 수 있습니다:

@example
output=$(dmesg | grep hda)
@end example

는 다음처럼 됩니다:

@example
output = check_output("dmesg | grep hda", shell=True)
@end example

@node os system 교체하기,os spawn 패밀리 교체하기,셸 파이프라인 교체하기,Replacing Older Functions with the subprocess Module
@anchor{library/subprocess replacing-os-system}@anchor{37a1}
@subsubsection @code{os.system()} 교체하기


@example
sts = os.system("mycmd" + " myarg")
# 는 다음처럼 됩니다
retcode = call("mycmd" + " myarg", shell=True)
@end example

노트:


@itemize *

@item 
보통 셸을 통해 프로그램을 호출할 필요는 없습니다.

@item 
The @ref{d80,,call()} return value is encoded differently to that of
@ref{1662,,os.system()}.

@item 
The @ref{1662,,os.system()} function ignores SIGINT and SIGQUIT signals while
the command is running, but the caller must do this separately when
using the @code{subprocess} module.
@end itemize

더욱 현실적인 예는 다음과 같습니다:

@example
try:
    retcode = call("mycmd" + " myarg", shell=True)
    if retcode < 0:
        print("Child was terminated by signal", -retcode, file=sys.stderr)
    else:
        print("Child returned", retcode, file=sys.stderr)
except OSError as e:
    print("Execution failed:", e, file=sys.stderr)
@end example

@node os spawn 패밀리 교체하기,Replacing os popen,os system 교체하기,Replacing Older Functions with the subprocess Module
@anchor{library/subprocess replacing-the-os-spawn-family}@anchor{37a2}
@subsubsection @code{os.spawn} 패밀리 교체하기


P_NOWAIT 예:

@example
pid = os.spawnlp(os.P_NOWAIT, "/bin/mycmd", "mycmd", "myarg")
==>
pid = Popen(["/bin/mycmd", "myarg"]).pid
@end example

P_WAIT 예:

@example
retcode = os.spawnlp(os.P_WAIT, "/bin/mycmd", "mycmd", "myarg")
==>
retcode = call(["/bin/mycmd", "myarg"])
@end example

벡터 예:

@example
os.spawnvp(os.P_NOWAIT, path, args)
==>
Popen([path] + args[1:])
@end example

환경 예:

@example
os.spawnlpe(os.P_NOWAIT, "/bin/mycmd", "mycmd", "myarg", env)
==>
Popen(["/bin/mycmd", "myarg"], env=@{"PATH": "/usr/bin"@})
@end example

@node Replacing os popen,,os spawn 패밀리 교체하기,Replacing Older Functions with the subprocess Module
@anchor{library/subprocess replacing-os-popen}@anchor{37a3}
@subsubsection Replacing @code{os.popen()}


반환 코드 처리는 다음과 같이 번역됩니다:

@example
pipe = os.popen(cmd, 'w')
...
rc = pipe.close()
if rc is not None and rc >> 8:
    print("There were some errors")
==>
process = Popen(cmd, stdin=PIPE)
...
process.stdin.close()
if process.wait() != 0:
    print("There were some errors")
@end example

@node 레거시 셸 호출 함수,노트,Replacing Older Functions with the subprocess Module,subprocess — 서브 프로세스 관리
@anchor{library/subprocess legacy-shell-invocation-functions}@anchor{37a4}
@subsubsection 레거시 셸 호출 함수


이 모듈은 2.x @code{commands} 모듈의 다음과 같은 레거시 함수도 제공합니다. 이러한 연산은 시스템 셸을 묵시적으로 호출하고 보안과 예외 처리 일관성과 관련하여 위에서 설명한 보증 중 어느 것도 이러한 함수에 유효하지 않습니다.

@geindex getstatusoutput() (subprocess 모듈)
@anchor{library/subprocess subprocess getstatusoutput}@anchor{11c3}
@deffn {함수} subprocess.getstatusoutput (cmd, *, encoding=None, errors=None)

셸에서 `cmd'를 실행한 후 @code{(exitcode, output)}을 반환합니다.

Execute the string `cmd' in a shell with @ref{11c1,,check_output()} and
return a 2-tuple @code{(exitcode, output)}.
`encoding' and `errors' are used to decode output;
see the notes on @ref{375d,,자주 사용되는 인자} for more details.

후행 줄 바꿈이 출력에서 제거됩니다. 명령의 종료 코드는 서브 프로세스의 반환 코드로 해석될 수 있습니다. 예:

@example
>>> subprocess.getstatusoutput('ls /bin/ls')
(0, '/bin/ls')
>>> subprocess.getstatusoutput('cat /bin/junk')
(1, 'cat: /bin/junk: No such file or directory')
>>> subprocess.getstatusoutput('/bin/junk')
(127, 'sh: /bin/junk: not found')
>>> subprocess.getstatusoutput('/bin/kill $$')
(-15, '@w{'})
@end example

@ref{213c,,가용성}: Unix, Windows.


버전 3.3.4에서 변경: 윈도우 지원이 추가되었습니다.

이 함수는 이제 파이썬 3.3.3과 이전 버전에서와같이 (status, output) 대신 (exitcode, output) 을 반환합니다. exitcode는 @ref{c82,,returncode}와 같은 값을 갖습니다.



버전 3.11에서 변경: `encoding'과 `errors' 매개 변수를 추가했습니다.

@end deffn

@geindex getoutput() (subprocess 모듈)
@anchor{library/subprocess subprocess getoutput}@anchor{11c2}
@deffn {함수} subprocess.getoutput (cmd, *, encoding=None, errors=None)

셸에서 `cmd'를 실행한 출력(stdout과 stderr)을 반환합니다.

종료 코드를 무시하고 반환 값은 명령의 출력을 포함하는 문자열인 것을 제외하고, @ref{11c3,,getstatusoutput()} 과 유사합니다. 예:

@example
>>> subprocess.getoutput('ls /bin/ls')
'/bin/ls'
@end example

@ref{213c,,가용성}: Unix, Windows.


버전 3.3.4에서 변경: 윈도우 지원이 추가되었습니다



버전 3.11에서 변경: `encoding'과 `errors' 매개 변수를 추가했습니다.

@end deffn

@node 노트,,레거시 셸 호출 함수,subprocess — 서브 프로세스 관리
@anchor{library/subprocess notes}@anchor{37a5}
@subsubsection 노트


@menu
* Timeout Behavior:: 
* 윈도우에서 인자 시퀀스를 문자열로 변환하기:: 
* Disable use of posix_spawn(): Disable use of posix_spawn. 

@end menu

@node Timeout Behavior,윈도우에서 인자 시퀀스를 문자열로 변환하기,,노트
@anchor{library/subprocess subprocess-timeout-behavior}@anchor{37a6}@anchor{library/subprocess timeout-behavior}@anchor{37a7}
@subsubsection Timeout Behavior


When using the @code{timeout} parameter in functions like @ref{d7e,,run()},
@ref{edf,,Popen.wait()}, or @ref{17b1,,Popen.communicate()},
users should be aware of the following behaviors:


@enumerate 

@item 
`Process Creation Delay': The initial process creation itself cannot be interrupted
on many platform APIs. This means that even when specifying a timeout, you are not
guaranteed to see a timeout exception until at least after however long process
creation takes.

@item 
`Extremely Small Timeout Values': Setting very small timeout values (such as a few
milliseconds) may result in almost immediate @ref{17b2,,TimeoutExpired} exceptions because
process creation and system scheduling inherently require time.
@end enumerate

@node 윈도우에서 인자 시퀀스를 문자열로 변환하기,Disable use of posix_spawn,Timeout Behavior,노트
@anchor{library/subprocess converting-an-argument-sequence-to-a-string-on-windows}@anchor{37a8}@anchor{library/subprocess converting-argument-sequence}@anchor{3776}
@subsubsection 윈도우에서 인자 시퀀스를 문자열로 변환하기


윈도우에서, `args' 시퀀스는 다음 규칙을 사용하여 구문 분석할 수 있는 문자열로 변환됩니다 (MS C 런타임에서 사용하는 규칙에 해당합니다):


@enumerate 

@item 
인자는 스페이스나 탭인 공백으로 구분됩니다.

@item 
큰따옴표로 묶인 문자열은 포함된 공백과 관계없이 단일 인자로 해석됩니다. 인용된 문자열을 인자에 포함할 수 있습니다.

@item 
백 슬래시가 앞에 붙는 큰따옴표는 리터럴 큰따옴표로 해석됩니다.

@item 
역 슬래시는 큰따옴표 바로 앞에 오지 않는 한 문자 그대로 해석됩니다.

@item 
역 슬래시가 큰따옴표 바로 앞에 있으면, 모든 역 슬래시 쌍은 리터럴 역 슬래시로 해석됩니다. 역 슬래시 수가 홀수이면, 규칙 3에 설명된 대로 마지막 역 슬래시는 다음 큰따옴표를 이스케이프 합니다.
@end enumerate


@subsubheading 더 보기



@table @asis

@item @ref{c9,,shlex}

명령 줄을 구문 분석하고 이스케이프 하는 함수를 제공하는 모듈.
@end table


@node Disable use of posix_spawn,,윈도우에서 인자 시퀀스를 문자열로 변환하기,노트
@anchor{library/subprocess disable-posix-spawn}@anchor{37a9}@anchor{library/subprocess disable-use-of-posix-spawn}@anchor{37aa}
@subsubsection Disable use of @code{posix_spawn()}


On Linux, @code{subprocess} defaults to using the @code{vfork()} system call
internally when it is safe to do so rather than @code{fork()}. This greatly
improves performance.

@example
subprocess._USE_POSIX_SPAWN = False  # See CPython issue gh-NNNNNN.
@end example

It is safe to set this to false on any Python version. It will have no
effect on older or newer versions where unsupported. Do not assume the attribute
is available to read. Despite the name, a true value does not indicate the
corresponding function will be used, only that it may be.

Please file issues any time you have to use these private knobs with a way to
reproduce the issue you were seeing. Link to that issue from a comment in your
code.


Added in version 3.8: @code{_USE_POSIX_SPAWN}


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node sched — 이벤트 스케줄러,queue — 동기화된 큐 클래스,subprocess — 서브 프로세스 관리,동시 실행
@anchor{library/sched doc}@anchor{37ab}@anchor{library/sched module-sched}@anchor{c4}@anchor{library/sched sched-event-scheduler}@anchor{37ac}@anchor{library/sched translation-repo}@anchor{37ad}
@subsection @code{sched} — 이벤트 스케줄러


@geindex module; sched

`소스 코드:' Lib/sched.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/sched.py}

@geindex 이벤트 스케줄링


__________________________________________________________________


The @code{sched} module defines a class which implements a general purpose event
scheduler:

@geindex scheduler (sched 클래스)
@anchor{library/sched sched scheduler}@anchor{132c}
@deffn {클래스} sched.scheduler (timefunc=time.monotonic, delayfunc=time.sleep)

@ref{132c,,scheduler} 클래스는 이벤트 스케줄링을 위한 일반적인 인터페이스를 정의합니다. “외부 세계”를 실제로 다루기 위해 두 개의 함수를 요구합니다 — `timefunc'는 인자 없이 호출할 수 있어야 하고, 숫자(단위가 무엇이든, “시간”)를 반환합니다. `delayfunc' 함수는 하나의 인자로 호출 가능해야 하며, `timefunc'의 출력과 호환되어야 하고, 그 시간 동안 지연시켜야 합니다. `delayfunc'는 다중 스레드 응용 프로그램에서 다른 스레드가 실행할 기회를 주기 위해 각 이벤트가 실행된 후 @code{0} 인자로 호출되기도 합니다.


버전 3.3에서 변경: `timefunc' 와 `delayfunc' 매개 변수는 선택적입니다.



버전 3.3에서 변경: @ref{132c,,scheduler} 클래스는 다중 스레드 환경에서 안전하게 사용할 수 있습니다.

@end deffn

예제:

@example
>>> import sched, time
>>> s = sched.scheduler(time.time, time.sleep)
>>> def print_time(a='default'):
...     print("From print_time", time.time(), a)
...
>>> def print_some_times():
...     print(time.time())
...     s.enter(10, 1, print_time)
...     s.enter(5, 2, print_time, argument=('positional',))
...     # 우선순위가 더 높음에도 불구하고, enter() 가 상대적이라서 'keyword' 는 'positional' 다음에 실행됩니다
...     s.enter(5, 1, print_time, kwargs=@{'a': 'keyword'@})
...     s.enterabs(1_650_000_000, 10, print_time, argument=("first enterabs",))
...     s.enterabs(1_650_000_000, 5, print_time, argument=("second enterabs",))
...     s.run()
...     print(time.time())
...
>>> print_some_times()
1652342830.3640375
From print_time 1652342830.3642538 second enterabs
From print_time 1652342830.3643398 first enterabs
From print_time 1652342835.3694863 positional
From print_time 1652342835.3696074 keyword
From print_time 1652342840.369612 default
1652342840.3697174
@end example

@menu
* 스케줄러 객체:: 

@end menu

@node 스케줄러 객체,,,sched — 이벤트 스케줄러
@anchor{library/sched id1}@anchor{37ae}@anchor{library/sched scheduler-objects}@anchor{37af}
@subsubsection 스케줄러 객체


@ref{132c,,scheduler} 인스턴스에는 다음과 같은 메서드와 어트리뷰트가 있습니다:

@geindex enterabs() (sched.scheduler 메서드)
@anchor{library/sched sched scheduler enterabs}@anchor{132e}
@deffn {메서드} scheduler.enterabs (time, priority, action, argument=(), kwargs=@{@})

새 이벤트를 예약합니다. `time' 인자는 생성자에 전달된 `timefunc' 함수의 반환 값과 호환되는 숫자 형이어야 합니다. 같은 `time'으로 예약된 이벤트는 `priority' 순으로 실행됩니다. 낮은 숫자는 높은 우선순위를 나타냅니다.

이벤트를 실행하는 것은 @code{action(*argument, **kwargs)}를 실행하는 것을 의미합니다. `argument'는 `action'에 대한 위치 인자가 들어있는 시퀀스입니다. `kwargs'는 `action'에 대한 키워드 인자가 들어있는 딕셔너리입니다.

반환 값은 나중에 이벤트를 취소하는 데 사용할 수 있는 이벤트입니다 (@ref{1cf8,,cancel()} 참조).


버전 3.3에서 변경: `argument' 매개 변수는 선택적입니다.



버전 3.3에서 변경: `kwargs' 매개 변수가 추가되었습니다.

@end deffn

@geindex enter() (sched.scheduler 메서드)
@anchor{library/sched sched scheduler enter}@anchor{132d}
@deffn {메서드} scheduler.enter (delay, priority, action, argument=(), kwargs=@{@})

`delay' 시간 단위 후로 이벤트를 예약합니다. 상대 시간 이외의 다른 인자, 효과 및 반환 값은 @ref{132e,,enterabs()}와 같습니다.


버전 3.3에서 변경: `argument' 매개 변수는 선택적입니다.



버전 3.3에서 변경: `kwargs' 매개 변수가 추가되었습니다.

@end deffn

@geindex cancel() (sched.scheduler 메서드)
@anchor{library/sched sched scheduler cancel}@anchor{1cf8}
@deffn {메서드} scheduler.cancel (event)

큐에서 이벤트를 제거합니다. `event'가 현재 큐에 없으면, 이 메서드는 @ref{2ec,,ValueError}를 발생시킵니다.
@end deffn

@geindex empty() (sched.scheduler 메서드)
@anchor{library/sched sched scheduler empty}@anchor{37b0}
@deffn {메서드} scheduler.empty ()

이벤트 큐가 비어있으면 @code{True}를 반환합니다.
@end deffn

@geindex run() (sched.scheduler 메서드)
@anchor{library/sched sched scheduler run}@anchor{132b}
@deffn {메서드} scheduler.run (blocking=True)

모든 예약된 이벤트를 실행합니다. 이 메서드는 다음 이벤트를 (생성자에 전달된 `delayfunc' 함수를 사용하여) 기다린 다음 예약된 이벤트가 소진될 때까지 계속 실행합니다.

`blocking'이 거짓이면 시간이 도래한 (있다면) 예약된 이벤트를 모두 실행한 다음, 스케줄러에서 다음 예약된 호출까지의 (있다면) 대기시간을 반환합니다 .

`action' 이나 `delayfunc'는 예외를 발생시킬 수 있습니다. 두 경우 모두, 스케줄러는 일관된 상태를 유지하고 예외를 전파합니다. `action'에 의해 예외가 발생하면, 이후에 @ref{132b,,run()}을 호출할 때 이벤트를 실행하려고 하지 않습니다.

일련의 이벤트가 다음 이벤트 이전에 사용 가능한 시간보다 실행하는 데 더 오래 걸리면, 스케줄러는 단순히 지연됩니다. 어떤 이벤트도 삭제되지 않습니다; 더는 적절하지 않은 이벤트를 취소할 책임은 호출 코드에 있습니다.


버전 3.3에서 변경: `blocking' 매개 변수가 추가되었습니다.

@end deffn

@geindex queue (sched.scheduler의 속성)
@anchor{library/sched sched scheduler queue}@anchor{37b1}
@deffn {속성} scheduler.queue

남은 이벤트의 리스트를 실행될 순서대로 반환하는 읽기 전용 어트리뷰트입니다. 각 이벤트는 다음과 같은 필드를 갖는 @ref{85d,,네임드 튜플}로 표시됩니다: time, priority, action, argument, kwargs.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node queue — 동기화된 큐 클래스,contextvars — 컨텍스트 변수,sched — 이벤트 스케줄러,동시 실행
@anchor{library/queue doc}@anchor{37b2}@anchor{library/queue module-queue}@anchor{bb}@anchor{library/queue queue-a-synchronized-queue-class}@anchor{37b3}@anchor{library/queue translation-repo}@anchor{37b4}
@subsection @code{queue} — 동기화된 큐 클래스


@geindex module; queue

`소스 코드:' Lib/queue.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/queue.py}


__________________________________________________________________


The @code{queue} module implements multi-producer, multi-consumer queues.
It is especially useful in threaded programming when information must be
exchanged safely between multiple threads.  The @ref{1599,,Queue} class in this
module implements all the required locking semantics.

모듈은 항목을 꺼내는 순서 만 다른 3가지 유형의 큐를 구현합니다. @abbr{FIFO} 큐에서는, 추가된 첫 번째 작업이 처음으로 꺼내지는 작업입니다. @abbr{LIFO} 큐에서는, 가장 최근에 추가된 항목이 처음으로 꺼내지는 항목입니다 (스택처럼 작동합니다). 우선순위(priority) 큐에서는, 항목이 정렬된 상태로 유지되고 (@ref{6d,,heapq} 모듈을 사용합니다) 가장 낮은 값을 갖는 항목이 먼저 꺼내집니다.

내부적으로, 이러한 3가지 유형의 큐는 록을 사용하여 경쟁 스레드를 일시적으로 블록합니다; 그러나, 스레드 내에서의 재진입을 처리하도록 설계되지는 않았습니다.

또한, 이 모듈은 “간단한” @abbr{FIFO} 큐 유형인 @ref{d60,,SimpleQueue}를 구현합니다. 이 특정 구현은 작은 기능을 포기하는 대신 추가 보장을 제공합니다.

The @code{queue} module defines the following classes and exceptions:

@geindex Queue (queue 클래스)
@anchor{library/queue queue Queue}@anchor{1599}
@deffn {클래스} queue.Queue (maxsize=0)

@abbr{FIFO} 큐의 생성자. `maxsize'는 큐에 배치할 수 있는 항목 수에 대한 상한을 설정하는 정수입니다. 일단, 이 크기에 도달하면, 큐 항목이 소비될 때까지 삽입이 블록 됩니다. `maxsize'가 0보다 작거나 같으면, 큐 크기는 무한합니다.
@end deffn

@geindex LifoQueue (queue 클래스)
@anchor{library/queue queue LifoQueue}@anchor{26bc}
@deffn {클래스} queue.LifoQueue (maxsize=0)

@abbr{LIFO} 큐의 생성자. `maxsize'는 큐에 배치할 수 있는 항목 수에 대한 상한을 설정하는 정수입니다. 일단, 이 크기에 도달하면, 큐 항목이 소비될 때까지 삽입이 블록 됩니다. `maxsize'가 0보다 작거나 같으면, 큐 크기는 무한합니다.
@end deffn

@geindex PriorityQueue (queue 클래스)
@anchor{library/queue queue PriorityQueue}@anchor{26bd}
@deffn {클래스} queue.PriorityQueue (maxsize=0)

우선순위 큐의 생성자. `maxsize'는 큐에 배치할 수 있는 항목 수에 대한 상한을 설정하는 정수입니다. 일단, 이 크기에 도달하면, 큐 항목이 소비될 때까지 삽입이 블록 됩니다. `maxsize'가 0보다 작거나 같으면, 큐 크기는 무한합니다.

가장 낮은 값을 갖는 항목이 먼저 꺼내집니다 (가장 낮은 값을 갖는 항목은 @code{min(entries)} 에 의해 반환될 항목입니다). 항목의 전형적인 패턴은 @code{(priority_number, data)} 형식의 튜플입니다.

`data' 요소를 비교할 수 없으면, 데이터는 데이터 항목을 무시하고 우선순위 숫자만 비교하는 클래스로 감쌀 수 있습니다:

@example
from dataclasses import dataclass, field
from typing import Any

@@dataclass(order=True)
class PrioritizedItem:
    priority: int
    item: Any=field(compare=False)
@end example
@end deffn

@geindex SimpleQueue (queue 클래스)
@anchor{library/queue queue SimpleQueue}@anchor{d60}
@deffn {클래스} queue.SimpleQueue

상한 없는 @abbr{FIFO} 큐의 생성자. 단순 큐에는 작업 추적과 같은 고급 기능이 없습니다.


Added in version 3.7.

@end deffn

@geindex Empty
@anchor{library/queue queue Empty}@anchor{369d}
@deffn {예외} queue.Empty

비 블로킹 @ref{31eb,,get()}(또는 @ref{37b5,,get_nowait()})이 비어있는 @ref{1599,,Queue} 객체에 호출될 때 발생하는 예외.
@end deffn

@geindex Full
@anchor{library/queue queue Full}@anchor{369e}
@deffn {예외} queue.Full

비 블로킹 @ref{37b6,,put()}(또는 @ref{31ea,,put_nowait()})이 가득 찬 @ref{1599,,Queue} 객체에 호출될 때 발생하는 예외.
@end deffn

@geindex ShutDown
@anchor{library/queue queue ShutDown}@anchor{543}
@deffn {예외} queue.ShutDown

@ref{37b6,,put()}(또는 @code{put()})이 종료된 @ref{1599,,Queue} 객체에 호출될 때 발생하는 예외.


Added in version 3.13.

@end deffn

@menu
* 큐 객체:: 
* SimpleQueue 객체:: 

@end menu

@node 큐 객체,SimpleQueue 객체,,queue — 동기화된 큐 클래스
@anchor{library/queue queue-objects}@anchor{37b7}@anchor{library/queue queueobjects}@anchor{37b8}
@subsubsection 큐 객체


큐 객체(@ref{1599,,Queue}, @ref{26bc,,LifoQueue} 또는 @ref{26bd,,PriorityQueue})는 아래에 설명된 공용 메서드를 제공합니다.

@geindex qsize() (queue.Queue 메서드)
@anchor{library/queue queue Queue qsize}@anchor{37b9}
@deffn {메서드} Queue.qsize ()

큐의 대략의 크기를 돌려줍니다. 주의하십시오, qsize() > 0 은 후속 get()이 블록 되지 않는다는 것을 보장하지 않으며, qsize() < maxsize 도 put()이 블록 되지 않는다고 보장하지 않습니다.
@end deffn

@geindex empty() (queue.Queue 메서드)
@anchor{library/queue queue Queue empty}@anchor{37ba}
@deffn {메서드} Queue.empty ()

큐가 비어 있으면 @code{True}를, 그렇지 않으면 @code{False}를 반환합니다. empty()가 @code{True}를 반환하면, put()에 대한 후속 호출이 블록 되지 않는다고 보장하는 것은 아닙니다. 마찬가지로 empty()가 @code{False}를 반환하면, get()에 대한 후속 호출이 블록 되지 않는다고 보장하는 것은 아닙니다.
@end deffn

@geindex full() (queue.Queue 메서드)
@anchor{library/queue queue Queue full}@anchor{37bb}
@deffn {메서드} Queue.full ()

큐가 가득 차면 @code{True}를, 그렇지 않으면 @code{False}를 반환합니다. full()이 @code{True}를 반환하면, get()에 대한 후속 호출이 블록 되지 않는다고 보장하는 것은 아닙니다. 마찬가지로 full()이 @code{False}를 반환하면, put()에 대한 후속 호출이 블록 되지 않는다고 보장하는 것은 아닙니다.
@end deffn

@geindex put() (queue.Queue 메서드)
@anchor{library/queue queue Queue put}@anchor{37b6}
@deffn {메서드} Queue.put (item, block=True, timeout=None)

큐에 `item'을 넣습니다. 선택적 인자 `block'이 참이고 `timeout'이 @code{None}(기본값)이면, 사용 가능한 슬롯이 확보될 때까지 필요하면 블록합니다. `timeout'이 양수면, 최대 `timeout' 초 동안 블록하고 그 시간 내에 사용 가능한 슬롯이 없으면 @ref{369e,,Full} 예외가 발생합니다. 그렇지 않으면 (`block'이 거짓), 빈 슬롯이 즉시 사용할 수 있으면 큐에 항목을 넣고, 그렇지 않으면 @code{Full} 예외를 발생시킵니다 (이때 `timeout'은 무시됩니다).

Raises @ref{543,,ShutDown} if the queue has been shut down.
@end deffn

@geindex put_nowait() (queue.Queue 메서드)
@anchor{library/queue queue Queue put_nowait}@anchor{31ea}
@deffn {메서드} Queue.put_nowait (item)

@code{put(item, block=False)}와 동등합니다.
@end deffn

@geindex get() (queue.Queue 메서드)
@anchor{library/queue queue Queue get}@anchor{31eb}
@deffn {메서드} Queue.get (block=True, timeout=None)

큐에서 항목을 제거하고 반환합니다. 선택적 인자 `block'이 참이고 `timeout'이 @code{None}(기본값)이면, 항목이 사용 가능할 때까지 필요하면 블록합니다. `timeout'이 양수면, 최대 `timeout' 초 동안 블록하고 그 시간 내에 사용 가능한 항목이 없으면 @ref{369d,,Empty} 예외가 발생합니다. 그렇지 않으면 (`block'이 거짓), 즉시 사용할 수 있는 항목이 있으면 반환하고, 그렇지 않으면 @code{Empty} 예외를 발생시킵니다 (이때 `timeout'은 무시됩니다).

POSIX 시스템에서 3.0 이전에서, 윈도우의 모든 버전에서, `block'이 참이고 `timeout'이 @code{None}이면, 이 연산은 하부 록에 대한 중단되지 않는(uninterruptible) 대기로 들어갑니다. 이는 어떤 예외도 발생할 수 없음을 뜻하고, 특히 SIGINT가 @ref{bc4,,KeyboardInterrupt}를 일으키지 않습니다.

Raises @ref{543,,ShutDown} if the queue has been shut down and is empty, or if
the queue has been shut down immediately.
@end deffn

@geindex get_nowait() (queue.Queue 메서드)
@anchor{library/queue queue Queue get_nowait}@anchor{37b5}
@deffn {메서드} Queue.get_nowait ()

@code{get(False)}와 동등합니다.
@end deffn

큐에 넣은 작업이 데몬 소비자 스레드에 의해 완전히 처리되었는지를 추적하는 것을 지원하는 두 가지 메서드가 제공됩니다.

@geindex task_done() (queue.Queue 메서드)
@anchor{library/queue queue Queue task_done}@anchor{3699}
@deffn {메서드} Queue.task_done ()

앞서 큐에 넣은 작업이 완료되었음을 나타냅니다. 큐 소비자 스레드에서 사용됩니다. 작업을 꺼내는 데 사용되는 @ref{31eb,,get()}마다, 후속 @ref{3699,,task_done()} 호출은 작업에 대한 처리가 완료되었음을 큐에 알려줍니다.

@ref{369a,,join()}이 현재 블로킹 중이면, 모든 항목이 처리되면 (큐로 @ref{37b6,,put()} 된 모든 항목에 대해 @ref{3699,,task_done()} 호출이 수신되었음을 뜻합니다) 재개됩니다.

큐에 있는 항목보다 더 많이 호출되면 @ref{2ec,,ValueError}를 발생시킵니다.
@end deffn

@geindex join() (queue.Queue 메서드)
@anchor{library/queue queue Queue join}@anchor{369a}
@deffn {메서드} Queue.join ()

큐의 모든 항목을 꺼내서 처리할 때까지 블록합니다.

완료되지 않은 작업 카운트는 항목이 큐에 추가될 때마다 올라갑니다. 소비자 스레드가 @ref{3699,,task_done()}을 호출해서 항목을 꺼내고 작업이 모두 완료되었음을 나타낼 때마다 카운트가 내려갑니다. 완료되지 않은 작업 카운트가 0으로 떨어지면, @ref{369a,,join()}이 블록 해제됩니다.
@end deffn

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

@end menu

@node Waiting for task completion,Terminating queues,,큐 객체
@anchor{library/queue waiting-for-task-completion}@anchor{37bc}
@subsubsection Waiting for task completion


큐에 포함된 작업이 완료될 때까지 대기하는 방법의 예:

@example
import threading
import queue

q = queue.Queue()

def worker():
    while True:
        item = q.get()
        print(f'Working on @{item@}')
        print(f'Finished @{item@}')
        q.task_done()

# 작업자 스레드를 켭니다.
threading.Thread(target=worker, daemon=True).start()

# 작업자에게 30개의 작업 요청을 보냅니다.
for item in range(30):
    q.put(item)

# 모든 작업이 완료될 때까지 블록합니다.
q.join()
print('All work completed')
@end example

@node Terminating queues,,Waiting for task completion,큐 객체
@anchor{library/queue terminating-queues}@anchor{37bd}
@subsubsection Terminating queues


When no longer needed, @ref{1599,,Queue} objects can be wound down
until empty or terminated immediately with a hard shutdown.

@geindex shutdown() (queue.Queue 메서드)
@anchor{library/queue queue Queue shutdown}@anchor{542}
@deffn {메서드} Queue.shutdown (immediate=False)

Put a @ref{1599,,Queue} instance into a shutdown mode.

The queue can no longer grow.
Future calls to @ref{37b6,,put()} raise @ref{543,,ShutDown}.
Currently blocked callers of @code{put()} will be unblocked
and will raise @code{ShutDown} in the formerly blocked thread.

If `immediate' is false (the default), the queue can be wound
down normally with @ref{31eb,,get()} calls to extract tasks
that have already been loaded.

And if @ref{3699,,task_done()} is called for each remaining task, a
pending @ref{369a,,join()} will be unblocked normally.

Once the queue is empty, future calls to @ref{31eb,,get()} will
raise @ref{543,,ShutDown}.

If `immediate' is true, the queue is terminated immediately.
The queue is drained to be completely empty and the count
of unfinished tasks is reduced by the number of tasks drained.
If unfinished tasks is zero, callers of @ref{369a,,join()}
are unblocked.  Also, blocked callers of @ref{31eb,,get()}
are unblocked and will raise @ref{543,,ShutDown} because the
queue is empty.

Use caution when using @ref{369a,,join()} with `immediate' set
to true. This unblocks the join even when no work has been done
on the tasks, violating the usual invariant for joining a queue.


Added in version 3.13.

@end deffn

@node SimpleQueue 객체,,큐 객체,queue — 동기화된 큐 클래스
@anchor{library/queue simplequeue-objects}@anchor{37be}
@subsubsection SimpleQueue 객체


@ref{d60,,SimpleQueue} 객체는 아래에서 설명하는 공용 메서드를 제공합니다.

@geindex qsize() (queue.SimpleQueue 메서드)
@anchor{library/queue queue SimpleQueue qsize}@anchor{37bf}
@deffn {메서드} SimpleQueue.qsize ()

큐의 대략의 크기를 돌려줍니다.  주의하십시오, qsize() > 0 은 후속 get()이 블록 되지 않는다는 것을 보장하지 않습니다.
@end deffn

@geindex empty() (queue.SimpleQueue 메서드)
@anchor{library/queue queue SimpleQueue empty}@anchor{37c0}
@deffn {메서드} SimpleQueue.empty ()

큐가 비어 있으면 @code{True}를, 그렇지 않으면 @code{False}를 반환합니다. empty()가 @code{False}를 반환하면, get()에 대한 후속 호출이 블록 되지 않는다는 것을 보장하지는 않습니다.
@end deffn

@geindex put() (queue.SimpleQueue 메서드)
@anchor{library/queue queue SimpleQueue put}@anchor{37c1}
@deffn {메서드} SimpleQueue.put (item, block=True, timeout=None)

`item'을 큐에 넣습니다. 이 메서드는 결코 블록하지 않고 항상 성공합니다 (메모리 할당 실패와 같은 잠재적 저수준 에러 제외). 선택적 인자 `block'과 `timeout'은 무시되고 @ref{37b6,,Queue.put()}과의 호환성을 위해서만 제공됩니다.

`CPython 구현 상세:' This method has a C implementation which is reentrant.  That is, a
@code{put()} or @code{get()} call can be interrupted by another @code{put()}
call in the same thread without deadlocking or corrupting internal
state inside the queue.  This makes it appropriate for use in
destructors such as @code{__del__} methods or @ref{11a,,weakref} callbacks.
@end deffn

@geindex put_nowait() (queue.SimpleQueue 메서드)
@anchor{library/queue queue SimpleQueue put_nowait}@anchor{37c2}
@deffn {메서드} SimpleQueue.put_nowait (item)

@code{put(item, block=False)}과 동등합니다, @ref{31ea,,Queue.put_nowait()}와의 호환성을 위해 제공됩니다.
@end deffn

@geindex get() (queue.SimpleQueue 메서드)
@anchor{library/queue queue SimpleQueue get}@anchor{37c3}
@deffn {메서드} SimpleQueue.get (block=True, timeout=None)

큐에서 항목을 제거하고 반환합니다. 선택적 인자 `block'이 참이고 `timeout'이 @code{None}(기본값)이면, 항목이 사용 가능할 때까지 필요하면 블록합니다. `timeout'이 양수면, 최대 `timeout' 초 동안 블록하고 그 시간 내에 사용 가능한 항목이 없으면 @ref{369d,,Empty} 예외가 발생합니다. 그렇지 않으면 (`block'이 거짓), 즉시 사용할 수 있는 항목이 있으면 반환하고, 그렇지 않으면 @code{Empty} 예외를 발생시킵니다 (이때 `timeout'은 무시됩니다).
@end deffn

@geindex get_nowait() (queue.SimpleQueue 메서드)
@anchor{library/queue queue SimpleQueue get_nowait}@anchor{37c4}
@deffn {메서드} SimpleQueue.get_nowait ()

@code{get(False)}와 동등합니다.
@end deffn


@subsubheading 더 보기



@table @asis

@item @ref{1b87,,multiprocessing.Queue} 클래스

(다중 스레드 대신) 다중 프로세스 문맥에서 사용하기 위한 큐 클래스.
@end table

@ref{7f3,,collections.deque}는 록을 필요로하지 않고 인덱싱을 지원하는 빠른 원자적 @ref{299f,,append()}와 @ref{29a5,,popleft()} 연산을 제공하는 크기 제한 없는 큐의 대체 구현입니다.


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node contextvars — 컨텍스트 변수,_thread — 저수준 스레드 API,queue — 동기화된 큐 클래스,동시 실행
@anchor{library/contextvars doc}@anchor{37c5}@anchor{library/contextvars contextvars-context-variables}@anchor{37c6}@anchor{library/contextvars module-contextvars}@anchor{28}@anchor{library/contextvars translation-repo}@anchor{37c7}
@subsection @code{contextvars} — 컨텍스트 변수


@geindex module; contextvars


__________________________________________________________________


이 모듈은 컨텍스트-로컬 상태를 관리, 저장, 액세스하기 위한 API를 제공합니다. @ref{1878,,ContextVar} 클래스는 `컨텍스트 변수' 를 선언하고 사용하는 데 쓰입니다. @ref{3650,,copy_context()} 함수와 @ref{177,,Context} 클래스는 비동기 프레임워크에서 현재 컨텍스트를 관리하는 데 사용해야 합니다.

상태가 있는 컨텍스트 관리자는 동시성 코드에서 상태가 예기치 않게 다른 코드로 유출되는 것을 방지하기 위해 @ref{1862,,threading.local()} 대신 컨텍스트 변수를 사용해야 합니다.

자세한 내용은 
@geindex Python 향상 제안; PEP 567
PEP 567@footnote{https://peps.python.org/pep-0567/}을 참조하십시오.


Added in version 3.7.


@menu
* 컨텍스트 변수:: 
* 수동 컨텍스트 관리:: 
* asyncio 지원:: 

@end menu

@node 컨텍스트 변수,수동 컨텍스트 관리,,contextvars — 컨텍스트 변수
@anchor{library/contextvars context-variables}@anchor{37c8}
@subsubsection 컨텍스트 변수


@geindex ContextVar (contextvars 클래스)
@anchor{library/contextvars contextvars ContextVar}@anchor{1878}
@deffn {클래스} contextvars.ContextVar (name[, *, default])

이 클래스는 새로운 컨텍스트 변수를 선언하는 데 사용됩니다. 예:

@example
var: ContextVar[int] = ContextVar('var', default=42)
@end example

필수 `name' 매개 변수는 인트로스팩션 및 디버그 목적으로 사용됩니다.

선택적 키워드 전용 `default' 매개 변수는 변수에 대한 값이 현재 컨텍스트에서 발견되지 않으면 @ref{37c9,,ContextVar.get()} 에 의해 반환됩니다.

`중요:' 컨텍스트 변수는 최상위 모듈 수준에서 만들어져야 하고 클로저에서 만들어져서는 안 됩니다. @ref{177,,Context} 객체는 컨텍스트 변수에 대해 강한 참조를 유지해서 컨텍스트 변수가 제대로 가비지 수집되지 못하게 합니다.

@geindex name (contextvars.ContextVar의 속성)
@anchor{library/contextvars contextvars ContextVar name}@anchor{37ca}
@deffn {속성} name

변수의 이름. 읽기 전용 프로퍼티입니다.


Added in version 3.7.1.

@end deffn

@geindex get() (contextvars.ContextVar 메서드)
@anchor{library/contextvars contextvars ContextVar get}@anchor{37c9}
@deffn {메서드} get ([default])

현재 컨텍스트의 컨텍스트 변수에 대한 값을 반환합니다.

현재 컨텍스트에서 변수에 대한 값이 없는 경우 메서드는:


@itemize *

@item 
제공된 경우 메서드의 `default' 인자 값을 반환합니다; 또는

@item 
생성 시에 제공된 경우, 컨텍스트 변수의 기본값을 반환합니다; 또는

@item 
@ref{23e5,,LookupError} 를 발생시킵니다.
@end itemize
@end deffn

@geindex set() (contextvars.ContextVar 메서드)
@anchor{library/contextvars contextvars ContextVar set}@anchor{179a}
@deffn {메서드} set (value)

현재 컨텍스트에서 컨텍스트 변수의 새 값을 설정하려면 호출합니다.

필수 `value' 인자는 컨텍스트 변수의 새 값입니다.

@ref{37cb,,ContextVar.reset()} 메서드를 통해 변수를 이전 값으로 복원하는 데 사용할 수 있는 @ref{1e2,,Token} 객체를 반환합니다.

For convenience, the token object can be used as a context manager
to avoid calling @ref{37cb,,ContextVar.reset()} manually:

@example
var = ContextVar('var', default='default value')

with var.set('new value'):
    assert var.get() == 'new value'

assert var.get() == 'default value'
@end example

It is a shorthand for:

@example
var = ContextVar('var', default='default value')

token = var.set('new value')
try:
    assert var.get() == 'new value'
finally:
    var.reset(token)

assert var.get() == 'default value'
@end example


Added in version 3.14: Added support for using tokens as context managers.

@end deffn

@geindex reset() (contextvars.ContextVar 메서드)
@anchor{library/contextvars contextvars ContextVar reset}@anchor{37cb}
@deffn {메서드} reset (token)

`token' 을 생성 한 @ref{179a,,ContextVar.set()} 이 사용되기 전의 값으로 컨텍스트 변수를 재설정합니다.

예를 들면:

@example
var = ContextVar('var')

token = var.set('new value')
# 'var'를 사용하는 코드; var.get() 은 'new value'를 반환합니다.
var.reset(token)

# reset 호출 후에 var에는 값이 다시 없으므로, var.get() 은
# LookupError를 발생시킵니다.
@end example

The same `token' cannot be used twice.
@end deffn
@end deffn

@geindex Token (contextvars 클래스)
@anchor{library/contextvars contextvars Token}@anchor{1e2}
@deffn {클래스} contextvars.Token

`Token' objects are returned by the @ref{179a,,ContextVar.set()} method.
They can be passed to the @ref{37cb,,ContextVar.reset()} method to revert
the value of the variable to what it was before the corresponding
`set'. A single token cannot reset a context variable more than once.

Tokens support the @ref{237e,,context manager protocol}
to automatically reset context variables. See @ref{179a,,ContextVar.set()}.


Added in version 3.14: Added support for usage as a context manager.


@geindex var (contextvars.Token의 속성)
@anchor{library/contextvars contextvars Token var}@anchor{37cc}
@deffn {속성} var

읽기 전용 프로퍼티. 토큰을 생성 한 @ref{1878,,ContextVar} 객체를 가리 킵니다.
@end deffn

@geindex old_value (contextvars.Token의 속성)
@anchor{library/contextvars contextvars Token old_value}@anchor{37cd}
@deffn {속성} old_value

읽기 전용 프로퍼티. 토큰을 생성 한 @ref{179a,,ContextVar.set()} 메서드 호출 전 변수의 값으로 설정됩니다. 호출 전에 변수가 설정되지 않았으면 @ref{17fc,,Token.MISSING}을 가리킵니다.
@end deffn

@geindex MISSING (contextvars.Token의 속성)
@anchor{library/contextvars contextvars Token MISSING}@anchor{17fc}
@deffn {속성} MISSING

@ref{37cd,,Token.old_value} 에 의해 사용되는 표지 객체.
@end deffn
@end deffn

@node 수동 컨텍스트 관리,asyncio 지원,컨텍스트 변수,contextvars — 컨텍스트 변수
@anchor{library/contextvars manual-context-management}@anchor{37ce}
@subsubsection 수동 컨텍스트 관리


@geindex copy_context() (contextvars 모듈)
@anchor{library/contextvars contextvars copy_context}@anchor{3650}
@deffn {함수} contextvars.copy_context ()

현재 @ref{177,,Context} 객체의 복사본을 반환합니다.

다음 코드 조각은 현재 컨텍스트의 복사본을 가져와서 모든 변수와 그 변수에 설정된 값을 출력합니다:

@example
ctx: Context = copy_context()
print(list(ctx.items()))
@end example

이 함수는 `O'(1) 복잡도를 갖고 있습니다. 즉, 몇 가지 컨텍스트 변수가 있는 컨텍스트와 컨텍스트 변수가 잔뜩 있는 컨텍스트에 대해 똑같이 빠르게 작동합니다.
@end deffn

@geindex Context (contextvars 클래스)
@anchor{library/contextvars contextvars Context}@anchor{177}
@deffn {클래스} contextvars.Context

@ref{1878,,ContextVars} 에서 그 값으로의 매핑.

@code{Context()} 는 값이 없는 빈 컨텍스트를 만듭니다. 현재 컨텍스트의 복사본을 얻으려면 @ref{3650,,copy_context()} 함수를 사용하십시오.

Each thread has its own effective stack of @code{Context} objects.  The
@ref{1965,,current context} is the @code{Context} object at the top of the
current thread’s stack.  All @code{Context} objects in the stacks are
considered to be `entered'.

`Entering' a context, which can be done by calling its @ref{194c,,run()}
method, makes the context the current context by pushing it onto the top of
the current thread’s context stack.

`Exiting' from the current context, which can be done by returning from the
callback passed to the @ref{194c,,run()} method, restores the current
context to what it was before the context was entered by popping the context
off the top of the context stack.

Since each thread has its own context stack, @ref{1878,,ContextVar} objects
behave in a similar fashion to @ref{1862,,threading.local()} when values are
assigned in different threads.

Attempting to enter an already entered context, including contexts entered in
other threads, raises a @ref{244,,RuntimeError}.

After exiting a context, it can later be re-entered (from any thread).

Any changes to @ref{1878,,ContextVar} values via the @ref{179a,,ContextVar.set()}
method are recorded in the current context.  The @ref{37c9,,ContextVar.get()}
method returns the value associated with the current context.  Exiting a
context effectively reverts any changes made to context variables while the
context was entered (if needed, the values can be restored by re-entering the
context).

Context는 @ref{ac7,,collections.abc.Mapping} 인터페이스를 구현합니다.

@geindex run() (contextvars.Context 메서드)
@anchor{library/contextvars contextvars Context run}@anchor{194c}
@deffn {메서드} run (callable, *args, **kwargs)

컨텍스트에 진입하고, @code{callable(*args, **kwargs)}를 실행한 다음, 컨텍스트에서 빠져나옵니다. `callable'의 반환값을 반환하거나, 예외가 발생하면 예외를 전파합니다.

예제:

@example
import contextvars

var = contextvars.ContextVar('var')
var.set('spam')
print(var.get())  # 'spam'

ctx = contextvars.copy_context()

def main():
    # 'var' 는 'copy_context()' 와 'ctx.run(main)' 을
    # 호출하기 전에 'spam' 으로 설정되었습니다. 그래서:
    print(var.get())  # 'spam'
    print(ctx[var])  # 'spam'

    var.set('ham')

    # 이제, 'var' 를 'ham' 으로 설정한 후에:
    print(var.get())  # 'ham'
    print(ctx[var])  # 'ham'

# 'main' 함수가 'var' 에 적용한 모든 변경은 'ctx' 에 포함됩니다.
ctx.run(main)

# 'main()' 함수는 'ctx' 컨텍스트에서 실행되었으므로,
# 'var' 에 대한 변경은 'ctx' 에 포함되어 있습니다:
print(ctx[var])  # 'ham'

# 그러나, 'ctx' 외부에서, 'var' 는 여전히 'spam' 으로 설정되어있습니다:
print(var.get())  # 'spam'
@end example

@c spam
@c spam
@c spam
@c ham
@c ham
@c ham
@c spam
@end deffn

@geindex copy() (contextvars.Context 메서드)
@anchor{library/contextvars contextvars Context copy}@anchor{37cf}
@deffn {메서드} copy ()

컨텍스트 객체의 얕은 복사본을 반환합니다.
@end deffn


@deffn {Describe} var in context

`context' 에 `var' 의 값이 설정되었으면 @code{True} 를, 그렇지 않으면 @cite{False}를 반환합니다.
@end deffn


@deffn {Describe} context[var]

`var' @ref{1878,,ContextVar} 변수의 값을 돌려줍니다. 컨텍스트 객체에 변수가 설정되어 있지 않으면 @ref{5e5,,KeyError} 가 발생합니다.
@end deffn

@geindex get() (contextvars.Context 메서드)
@anchor{library/contextvars contextvars Context get}@anchor{37d0}
@deffn {메서드} get (var[, default])

컨텍스트 객체에 `var' 의 값이 있으면, `var' 의 값을 돌려줍니다. 그렇지 않으면 `default' 를 반환합니다. `default' 가 주어지지 않으면 @code{None} 을 반환합니다.
@end deffn


@deffn {Describe} iter(context)

컨텍스트 객체에 저장된 변수에 대한 이터레이터를 반환합니다.
@end deffn


@deffn {Describe} len(proxy)

컨텍스트 객체에 설정된 변수의 개수를 반환합니다.
@end deffn

@geindex keys() (contextvars.Context 메서드)
@anchor{library/contextvars contextvars Context keys}@anchor{37d1}
@deffn {메서드} keys ()

컨텍스트 객체의 모든 변수 목록을 반환합니다.
@end deffn

@geindex values() (contextvars.Context 메서드)
@anchor{library/contextvars contextvars Context values}@anchor{37d2}
@deffn {메서드} values ()

컨텍스트 객체의 모든 변수의 값 목록을 반환합니다.
@end deffn

@geindex items() (contextvars.Context 메서드)
@anchor{library/contextvars contextvars Context items}@anchor{37d3}
@deffn {메서드} items ()

컨텍스트 객체에서 모든 변수와 해당 값을 포함하는 2-튜플의 목록을 반환합니다.
@end deffn
@end deffn

@node asyncio 지원,,수동 컨텍스트 관리,contextvars — 컨텍스트 변수
@anchor{library/contextvars asyncio-support}@anchor{37d4}
@subsubsection asyncio 지원


컨텍스트 변수는 @ref{b,,asyncio} 에서 기본적으로 지원되며 추가 구성없이 사용할 수 있습니다. 예를 들어, 이것은 컨텍스트 변수를 사용하여, 원격 클라이언트의 주소를 해당 클라이언트를 처리하는 Task에서 사용할 수 있도록 하는 간단한 메아리 서버입니다:

@example
import asyncio
import contextvars

client_addr_var = contextvars.ContextVar('client_addr')

def render_goodbye():
    # 현재 처리중인 클라이언트의 주소를 이 함수에 명시 적으로 전달하지 않고도
    # 액세스 할 수 있습니다.

    client_addr = client_addr_var.get()
    return f'Good bye, client @@ @{client_addr@}\r\n'.encode()

async def handle_request(reader, writer):
    addr = writer.transport.get_extra_info('socket').getpeername()
    client_addr_var.set(addr)

    # 우리가 호출하는 모든 코드에서 이제 'client_addr_var.get()' 을
    # 호출하여 클라이언트의 주소를 가져올 수 있습니다.

    while True:
        line = await reader.readline()
        print(line)
        if not line.strip():
            break

    writer.write(b'HTTP/1.1 200 OK\r\n')  # status line
    writer.write(b'\r\n')  # headers
    writer.write(render_goodbye())  # body
    writer.close()

async def main():
    srv = await asyncio.start_server(
        handle_request, '127.0.0.1', 8081)

    async with srv:
        await srv.serve_forever()

asyncio.run(main())

# 테스트하려면 telnet이나 curl을 사용할 수 있습니다:
#     telnet 127.0.0.1 8081
#     curl 127.0.0.1:8081
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

다음은 위 서비스 중 일부에 대한 지원 모듈입니다:

@node _thread — 저수준 스레드 API,,contextvars — 컨텍스트 변수,동시 실행
@anchor{library/_thread doc}@anchor{37d5}@anchor{library/_thread module-_thread}@anchor{2}@anchor{library/_thread thread-low-level-threading-api}@anchor{37d6}@anchor{library/_thread translation-repo}@anchor{37d7}
@subsection @code{_thread} — 저수준 스레드 API


@geindex module; _thread

@geindex 경량 프로세스
@geindex 프로세스@comma{} 경량
@geindex 이진 세마포어
@geindex 세마포어@comma{} 이진


__________________________________________________________________


이 모듈은 다중 스레드(`경량 프로세스 (light-weight processes)' 나 `태스크 (tasks)'라고도 합니다)로 작업하는데 필요한 저수준 기본 요소를 제공합니다 — 전역 데이터 공간을 공유하는 여러 개의 제어 스레드를 뜻합니다. 동기화를 위해서, 간단한 록(`뮤텍스 (mutexes)'나 `이진 세마포어 (binary semaphores)'라고도 합니다)이 제공됩니다. @ref{f3,,threading} 모듈은 이 모듈 위에 구축되어 사용하기 쉬운 고수준의 스레딩 API를 제공합니다.

@geindex pthreads
@geindex 스레드;POSIX


버전 3.7에서 변경: 이 모듈은 선택 사항이었지만, 이제는 항상 사용할 수 있습니다.


이 모듈은 다음 상수와 함수를 정의합니다:

@geindex error
@anchor{library/_thread thread error}@anchor{37d8}
@deffn {예외} _thread.error

스레드 특정 에러에서 발생합니다.


버전 3.3에서 변경: 이것은 이제 내장 @ref{244,,RuntimeError}의 동의어입니다.

@end deffn

@geindex LockType (_thread 모듈)
@anchor{library/_thread thread LockType}@anchor{37d9}
@deffn {데이터} _thread.LockType

이것은 록 객체의 형입니다.
@end deffn

@geindex start_new_thread() (_thread 모듈)
@anchor{library/_thread thread start_new_thread}@anchor{4b5}
@deffn {함수} _thread.start_new_thread (function, args[, kwargs])

새 스레드를 시작하고 식별자를 반환합니다. 스레드는 인자 목록 `args'(튜플이어야 합니다)로 함수 `function'을 실행합니다. 선택적 `kwargs' 인자는 키워드 인자 딕셔너리를 지정합니다.

함수가 반환되면, 스레드는 조용히 종료합니다.

함수가 처리되지 않은 예외로 종료되면, 예외를 처리하기 위해 @ref{506,,sys.unraisablehook()}이 호출됩니다. 훅 인자의 `object' 어트리뷰트는 `function'입니다. 기본적으로, 스택 트레이스가 인쇄된 다음 스레드가 종료합니다 (하지만 다른 스레드는 계속 실행됩니다).

함수가 @ref{f3b,,SystemExit} 예외를 발생시키면, 조용히 무시됩니다.

Raises an @ref{1c6c,,auditing event} @code{_thread.start_new_thread} with arguments @code{function}, @code{args}, @code{kwargs}.


버전 3.8에서 변경: @ref{506,,sys.unraisablehook()}은 이제 처리되지 않은 예외를 처리하는 데 사용됩니다.

@end deffn

@geindex interrupt_main() (_thread 모듈)
@anchor{library/_thread thread interrupt_main}@anchor{a44}
@deffn {함수} _thread.interrupt_main (signum=signal.SIGINT, /)

메인 스레드에 도달한 시그널의 효과를 시뮬레이트합니다. 스레드는 이 함수를 사용하여 메인 스레드를 인터럽트 할 수 있지만, 중단이 즉시 일어난다는 보장은 없습니다.

If given, `signum' is the number of the signal to simulate.
If `signum' is not given, @ref{253,,signal.SIGINT} is simulated.

주어진 시그널이 파이썬에 의해 처리되지 않으면 (@ref{1bb0,,signal.SIG_DFL}이나 @ref{1baf,,signal.SIG_IGN}으로 설정됩니다), 이 함수는 아무것도 하지 않습니다.


버전 3.10에서 변경: The `signum' argument is added to customize the signal number.


@cartouche
@quotation 참고 
This does not emit the corresponding signal but schedules a call to
the associated handler (if it exists).
If you want to truly emit the signal, use @ref{1b8d,,signal.raise_signal()}.
@end quotation
@end cartouche
@end deffn

@geindex exit() (_thread 모듈)
@anchor{library/_thread thread exit}@anchor{37da}
@deffn {함수} _thread.exit ()

@ref{f3b,,SystemExit} 예외를 발생시킵니다. 잡히지 않으면, 스레드가 조용히 종료되도록 합니다.
@end deffn

@c function:: exit_prog(status)
@c 
@c    Exit all threads and report the value of the integer argument
@c    *status* as the exit status of the entire program.
@c    **Caveat:** code in pending :keyword:`finally` clauses, in this thread
@c    or in other threads, is not executed.

@geindex allocate_lock() (_thread 모듈)
@anchor{library/_thread thread allocate_lock}@anchor{37db}
@deffn {함수} _thread.allocate_lock ()

새로운 록 객체를 반환합니다. 록의 메서드는 아래에 설명되어 있습니다. 록은 초기에 잠금 해제되어 있습니다.
@end deffn

@geindex get_ident() (_thread 모듈)
@anchor{library/_thread thread get_ident}@anchor{37dc}
@deffn {함수} _thread.get_ident ()

현재 스레드의 ‘스레드 식별자(thread identifier)’를 반환합니다. 이것은 0이 아닌 정수입니다. 그 값은 직접적인 의미가 없습니다; 이것은 예를 들어 스레드 특정 데이터의 딕셔너리를 인덱싱하는 데 사용되는 매직 쿠키로 사용하려는 의도입니다. 스레드 식별자는 스레드가 종료되고 다른 스레드가 만들어질 때 재활용될 수 있습니다.
@end deffn

@geindex get_native_id() (_thread 모듈)
@anchor{library/_thread thread get_native_id}@anchor{37dd}
@deffn {함수} _thread.get_native_id ()

커널에 의해 할당된 현재 스레드의 네이티브 정수 스레드 ID를 반환합니다. 이것은 음수가 아닌 정수입니다. 이 값은 시스템 전반에 걸쳐 이 특정 스레드를 고유하게 식별하는 데 사용될 수 있습니다 (스레드가 종료될 때까지, 그 후에는 값이 OS에 의해 재활용될 수 있습니다).

@ref{213c,,가용성}: Windows, FreeBSD, Linux, macOS, OpenBSD, NetBSD, AIX, DragonFlyBSD, GNU/kFreeBSD.


Added in version 3.8.



버전 3.13에서 변경: Added support for GNU/kFreeBSD.

@end deffn

@geindex stack_size() (_thread 모듈)
@anchor{library/_thread thread stack_size}@anchor{1780}
@deffn {함수} _thread.stack_size ([size])

새로운 스레드를 만들 때 사용된 스레드의 스택 크기를 반환합니다. 선택적 `size' 인자는 이후에 만들어지는 스레드에 사용할 스택 크기를 지정하며, 0(플랫폼 또는 구성된 기본값을 사용합니다)이나 최소 32,768(32 KiB)의 양의 정숫값이어야 합니다. `size'를 지정하지 않으면 0이 사용됩니다. 스레드 스택 크기 변경이 지원되지 않으면, @ref{244,,RuntimeError}가 발생합니다. 지정된 스택 크기가 유효하지 않으면, @ref{2ec,,ValueError}가 발생하고, 스택 크기는 변경되지 않습니다. 32 KiB는 현재 인터프리터 자체에 충분한 스택 공간을 보장하기 위해 지원되는 최소 스택 크기 값입니다. 일부 플랫폼에서는 스택 크기 값에 특별한 제한이 있을 수 있습니다, 가령 최소 스택 크기 > 32KB를 요구하거나 시스템 메모리 페이지 크기의 배수로 할당하는 것을 요구할 수 있습니다 - 자세한 내용은 플랫폼 설명서를 참조하십시오 (4 KiB 페이지가 일반적입니다; 더 구체적인 정보가 없으면 스택 크기로 4096의 배수를 사용하는 것이 제안된 방법입니다).

@ref{213c,,가용성}: Windows, pthreads.

Unix platforms with POSIX threads support.
@end deffn

@geindex TIMEOUT_MAX (_thread 모듈)
@anchor{library/_thread thread TIMEOUT_MAX}@anchor{37de}
@deffn {데이터} _thread.TIMEOUT_MAX

@ref{8a6,,Lock.acquire}의 `timeout' 매개 변수에 허용되는 최댓값. 이 값보다 큰 timeout을 지정하면 @ref{a81,,OverflowError}가 발생합니다.


Added in version 3.2.

@end deffn

록 객체에는 다음과 같은 메서드가 있습니다:

@geindex acquire() (_thread.lock 메서드)
@anchor{library/_thread thread lock acquire}@anchor{37df}
@deffn {메서드} lock.acquire (blocking=True, timeout=-1)

선택적 인자가 아무것도 없으면, 이 메서드는 조건 없이 록을 획득합니다, 필요하면 다른 스레드가 록을 해제할 때까지 대기합니다 (한 번에 하나의 스레드만 록을 획득할 수 있습니다 — 이것이 록의 존재 이유입니다).

`blocking' 인자가 있으면, 행동은 그 값에 따라 다릅니다: 거짓이면 대기하지 않고 즉시 획득할 수 있을 때만 록이 획득되고, 참이면 위와 같이 록이 조건 없이 획득됩니다.

부동 소수점 `timeout' 인자가 있고 양수이면, 반환하기 전에 대기할 최대 시간을 초로 지정합니다. 음의 `timeout' 인자는 제한 없는 대기를 지정합니다. `blocking'이 거짓이면 `timeout'을 지정할 수 없습니다.

록이 성공적으로 획득되면 반환 값은 @code{True}이고, 그렇지 않으면 @code{False}입니다.


버전 3.2에서 변경: `timeout' 매개 변수가 추가되었습니다.



버전 3.2에서 변경: 록 획득은 이제 POSIX의 시그널에 의해 중단될 수 있습니다.



버전 3.14에서 변경: Lock acquires can now be interrupted by signals on Windows.

@end deffn

@geindex release() (_thread.lock 메서드)
@anchor{library/_thread thread lock release}@anchor{37e0}
@deffn {메서드} lock.release ()

록을 해제합니다. 록은 반드시 이전에 획득된 것이어야 하지만, 반드시 같은 스레드에 의해 획득된 것일 필요는 없습니다.
@end deffn

@geindex locked() (_thread.lock 메서드)
@anchor{library/_thread thread lock locked}@anchor{37e1}
@deffn {메서드} lock.locked ()

록의 상태를 반환합니다: 어떤 스레드에 의해 획득되었으면 @code{True}, 그렇지 않으면 @code{False}를 반환합니다.
@end deffn

이러한 메서드 외에도, @ref{186,,with} 문을 통해 록 객체를 사용할 수도 있습니다, 예를 들어:

@example
import _thread

a_lock = _thread.allocate_lock()

with a_lock:
    print("a_lock is locked while this executes")
@end example

`주의 사항:'

@geindex 모듈;시그널


@itemize *

@item 
Interrupts always go to the main thread (the @ref{bc4,,KeyboardInterrupt}
exception will be received by that thread.)

@item 
@ref{277,,sys.exit()}를 호출하거나 @ref{f3b,,SystemExit} 예외를 발생시키는 것은 @ref{37da,,_thread.exit()}를 호출하는 것과 동등합니다.

@item 
메인 스레드가 종료할 때, 다른 스레드가 살아남는지는 시스템이 정의합니다. 대부분 시스템에서, @ref{8f7,,try} … @ref{1b0,,finally} 절을 실행하거나 객체 파괴자(destructor)를 실행하지 않고 강제 종료됩니다.
@end itemize

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 네트워킹과 프로세스 간 통신,인터넷 데이터 처리,동시 실행,파이썬 표준 라이브러리
@anchor{library/ipc doc}@anchor{37e2}@anchor{library/ipc ipc}@anchor{37e3}@anchor{library/ipc networking-and-interprocess-communication}@anchor{37e4}@anchor{library/ipc translation-repo}@anchor{37e5}
@section 네트워킹과 프로세스 간 통신


이 장에서 설명하는 모듈은 네트워킹과 프로세스 간 통신을 위한 메커니즘을 제공합니다.

어떤 모듈은 같은 기계에 있는 두 개의 프로세스에서만 작동합니다 (예를 들어, @ref{cb,,signal}과 @ref{94,,mmap}). 다른 모듈은 두 개 이상의 프로세스가 여러 기계에서 통신하는 데 사용할 수 있는 네트워킹 프로토콜을 지원합니다.

이 장에서 설명하는 모듈 목록은 다음과 같습니다:

@menu
* asyncio — 비동기 I/O:: 
* socket — Low-level networking interface:: 
* ssl — TLS/SSL wrapper for socket objects:: 
* select — I/O 완료 대기:: 
* selectors — 고수준 I/O 다중화:: 
* signal — 비동기 이벤트에 대한 처리기 설정:: 
* mmap — 메모리 맵 파일 지원:: 

@end menu

@node asyncio — 비동기 I/O,socket — Low-level networking interface,,네트워킹과 프로세스 간 통신
@anchor{library/asyncio doc}@anchor{37e6}@anchor{library/asyncio asyncio-asynchronous-i-o}@anchor{37e7}@anchor{library/asyncio module-asyncio}@anchor{b}
@subsection @code{asyncio} — 비동기 I/O


@geindex module; asyncio


__________________________________________________________________


@subsubheading Hello World!



@example
import asyncio

async def main():
    print('Hello ...')
    await asyncio.sleep(1)
    print('... World!')

asyncio.run(main())
@end example

asyncio는 `async/await' 구문을 사용하여 `동시성' 코드를 작성하는 라이브러리입니다.

asyncio는 고성능 네트워크 및 웹 서버, 데이터베이스 연결 라이브러리, 분산 작업 큐 등을 제공하는 여러 파이썬 비동기 프레임워크의 기반으로 사용됩니다.

asyncio는 종종 IO 병목이면서 고수준의 `구조화된' 네트워크 코드에 가장 적합합니다.


@subsubheading 더 보기



@table @asis

@item @ref{37e8,,A Conceptual Overview of asyncio}

Explanation of the fundamentals of asyncio.
@end table


asyncio는 다음과 같은 작업을 위한 `고수준' API 집합을 제공합니다:


@itemize *

@item 
@ref{37e9,,파이썬 코루틴들}을 동시에 실행하고 실행을 완전히 제어할 수 있습니다.

@item 
@ref{37ea,,네트워크 IO와 IPC}를 수행합니다;

@item 
@ref{37eb,,자식 프로세스}를 제어합니다;

@item 
@ref{37ec,,큐}를 통해 작업을 분산합니다;

@item 
동시성 코드를 @ref{37ed,,동기화}합니다;
@end itemize

또한, `라이브러리와 프레임워크 개발자'가 다음과 같은 작업을 할 수 있도록 하는 `저수준' API가 있습니다:


@itemize *

@item 
@ref{37ee,,네트워킹}, @ref{37ef,,자식 프로세스} 실행, @ref{37f0,,OS 시그널} 처리 등의 비동기 API를 제공하는 @ref{f75,,이벤트 루프}를 만들고 관리합니다.

@item 
@ref{37f1,,트랜스포트}를 사용하여 효율적인 프로토콜을 구현합니다.

@item 
콜백 기반 라이브러리와 async/await 구문을 사용한 코드 간에 @ref{37f2,,다리를 놓습니다}.
@end itemize

@c include for modules that don't work on WASM

@ref{213c,,가용성}: not WASI.

이 모듈은 웹어셈블리에서 작동하지 않거나 제공되지 않습니다. 자세한 내용은 @ref{1b68,,웹어셈블리 플랫폼}을 참조하세요.
@anchor{library/asyncio asyncio-cli}@anchor{37f3}
@subsubheading asyncio REPL


You can experiment with an @code{asyncio} concurrent context in the @ref{492,,REPL}:

@example
$ python -m asyncio
asyncio REPL ...
Use "await" directly instead of "asyncio.run()".
Type "help", "copyright", "credits" or "license" for more information.
>>> import asyncio
>>> await asyncio.sleep(10, result='hello')
'hello'
@end example

This REPL provides limited compatibility with 
@geindex PYTHON_BASIC_REPL
@geindex 환경 변수; PYTHON_BASIC_REPL
@ref{1b6,,PYTHON_BASIC_REPL}.
It is recommended that the default REPL is used
for full functionality and the latest features.

Raises an @ref{1c6c,,auditing event} @code{cpython.run_stdin} with no arguments.


버전 3.12.5에서 변경: (also 3.11.10, 3.10.15, 3.9.20, and 3.8.20)
Emits audit events.



버전 3.13에서 변경: Uses PyREPL if possible, in which case 
@geindex PYTHONSTARTUP
@geindex 환경 변수; PYTHONSTARTUP
@ref{1b8,,PYTHONSTARTUP} is
also executed. Emits audit events.


@c We use the "rubric" directive here to avoid creating
@c the "Reference" subsection in the TOC.

@subsubheading 레퍼런스


@menu
* Runners:: 
* Coroutines and tasks:: 
* 스트림:: 
* 동기화 프리미티브: 동기화 프리미티브<2>. 
* 서브 프로세스:: 
* 큐:: 
* 예외: 예외<10>. 
* Call Graph Introspection:: 
* Event loop:: 
* 퓨처:: 
* 트랜스포트와 프로토콜:: 
* 정책:: 
* 플랫폼 지원:: 
* Extending:: 
* 고수준 API 색인:: 
* 저수준 API 색인:: 
* asyncio로 개발하기:: 

@end menu

@node Runners,Coroutines and tasks,,asyncio — 비동기 I/O
@anchor{library/asyncio-runner doc}@anchor{37f4}@anchor{library/asyncio-runner runners}@anchor{37f5}
@subsubsection Runners


`Source code:' Lib/asyncio/runners.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/asyncio/runners.py}

This section outlines high-level asyncio primitives to run asyncio code.

They are built on top of an @ref{f75,,event loop} with the aim
to simplify async code usage for common wide-spread scenarios.

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

@end menu

@node Running an asyncio Program,Runner context manager,,Runners
@anchor{library/asyncio-runner running-an-asyncio-program}@anchor{37f6}
@subsubsection Running an asyncio Program


@geindex run() (asyncio 모듈)
@anchor{library/asyncio-runner asyncio run}@anchor{2f3}
@deffn {함수} asyncio.run (coro, *, debug=None, loop_factory=None)

Execute `coro' in an asyncio event loop and return the result.

The argument can be any awaitable object.

This function runs the awaitable, taking care of managing the
asyncio event loop, `finalizing asynchronous generators', and
closing the executor.

This function cannot be called when another asyncio event loop is
running in the same thread.

If `debug' is @code{True}, the event loop will be run in debug mode. @code{False} disables
debug mode explicitly. @code{None} is used to respect the global
@ref{2137,,디버그 모드} settings.

If `loop_factory' is not @code{None}, it is used to create a new event loop;
otherwise @ref{37f7,,asyncio.new_event_loop()} is used. The loop is closed at the end.
This function should be used as a main entry point for asyncio programs,
and should ideally only be called once. It is recommended to use
`loop_factory' to configure the event loop instead of policies.
Passing @ref{1a67,,asyncio.EventLoop} allows running asyncio without the
policy system.

The executor is given a timeout duration of 5 minutes to shutdown.
If the executor hasn’t finished within that duration, a warning is
emitted and the executor is closed.

Example:

@example
async def main():
    await asyncio.sleep(1)
    print('hello')

asyncio.run(main())
@end example


Added in version 3.7.



버전 3.9에서 변경: Updated to use @ref{ae4,,loop.shutdown_default_executor()}.



버전 3.10에서 변경: `debug' is @code{None} by default to respect the global debug mode settings.



버전 3.12에서 변경: Added `loop_factory' parameter.



버전 3.14에서 변경: `coro' can be any awaitable object.


@cartouche
@quotation 참고 
The @code{asyncio} policy system is deprecated and will be removed
in Python 3.16; from there on, an explicit `loop_factory' is needed
to configure the event loop.
@end quotation
@end cartouche
@end deffn

@node Runner context manager,Handling Keyboard Interruption,Running an asyncio Program,Runners
@anchor{library/asyncio-runner runner-context-manager}@anchor{37f8}
@subsubsection Runner context manager


@geindex Runner (asyncio 클래스)
@anchor{library/asyncio-runner asyncio Runner}@anchor{2f5}
@deffn {클래스} asyncio.Runner (*, debug=None, loop_factory=None)

A context manager that simplifies `multiple' async function calls in the same
context.

Sometimes several top-level async functions should be called in the same @ref{f75,,event loop} and @ref{177,,contextvars.Context}.

If `debug' is @code{True}, the event loop will be run in debug mode. @code{False} disables
debug mode explicitly. @code{None} is used to respect the global
@ref{2137,,디버그 모드} settings.

`loop_factory' could be used for overriding the loop creation.
It is the responsibility of the `loop_factory' to set the created loop as the
current one. By default @ref{37f7,,asyncio.new_event_loop()} is used and set as
current event loop with @ref{1b53,,asyncio.set_event_loop()} if `loop_factory' is @code{None}.

Basically, @ref{2f3,,asyncio.run()} example can be rewritten with the runner usage:

@example
async def main():
    await asyncio.sleep(1)
    print('hello')

with asyncio.Runner() as runner:
    runner.run(main())
@end example


Added in version 3.11.


@geindex run() (asyncio.Runner 메서드)
@anchor{library/asyncio-runner asyncio Runner run}@anchor{194e}
@deffn {메서드} run (coro, *, context=None)

Execute `coro' in the embedded event loop.

The argument can be any awaitable object.

If the argument is a coroutine, it is wrapped in a Task.

An optional keyword-only `context' argument allows specifying a
custom @ref{177,,contextvars.Context} for the code to run in.
The runner’s default context is used if context is @code{None}.

Returns the awaitable’s result or raises an exception.

This function cannot be called when another asyncio event loop is
running in the same thread.


버전 3.14에서 변경: `coro' can be any awaitable object.

@end deffn

@geindex close() (asyncio.Runner 메서드)
@anchor{library/asyncio-runner asyncio Runner close}@anchor{37f9}
@deffn {메서드} close ()

Close the runner.

Finalize asynchronous generators, shutdown default executor, close the event loop
and release embedded @ref{177,,contextvars.Context}.
@end deffn

@geindex get_loop() (asyncio.Runner 메서드)
@anchor{library/asyncio-runner asyncio Runner get_loop}@anchor{37fa}
@deffn {메서드} get_loop ()

Return the event loop associated with the runner instance.
@end deffn

@cartouche
@quotation 참고 
@code{Runner} uses the lazy initialization strategy, its constructor doesn’t
initialize underlying low-level structures.

Embedded `loop' and `context' are created at the @ref{186,,with} body entering
or the first call of @ref{2f3,,run()} or @ref{37fa,,get_loop()}.
@end quotation
@end cartouche
@end deffn

@node Handling Keyboard Interruption,,Runner context manager,Runners
@anchor{library/asyncio-runner handling-keyboard-interruption}@anchor{37fb}
@subsubsection Handling Keyboard Interruption



Added in version 3.11.


When @ref{253,,signal.SIGINT} is raised by @code{Ctrl}-@code{C}, @ref{bc4,,KeyboardInterrupt}
exception is raised in the main thread by default. However this doesn’t work with
@ref{b,,asyncio} because it can interrupt asyncio internals and can hang the program from
exiting.

To mitigate this issue, @ref{b,,asyncio} handles @ref{253,,signal.SIGINT} as follows:


@enumerate 

@item 
@ref{194e,,asyncio.Runner.run()} installs a custom @ref{253,,signal.SIGINT} handler before
any user code is executed and removes it when exiting from the function.

@item 
The @ref{2f5,,Runner} creates the main task for the passed coroutine for its
execution.

@item 
When @ref{253,,signal.SIGINT} is raised by @code{Ctrl}-@code{C}, the custom signal handler
cancels the main task by calling @ref{4d4,,asyncio.Task.cancel()} which raises
@ref{4d5,,asyncio.CancelledError} inside the main task.  This causes the Python stack
to unwind, @code{try/except} and @code{try/finally} blocks can be used for resource
cleanup.  After the main task is cancelled, @ref{194e,,asyncio.Runner.run()} raises
@ref{bc4,,KeyboardInterrupt}.

@item 
A user could write a tight loop which cannot be interrupted by
@ref{4d4,,asyncio.Task.cancel()}, in which case the second following @code{Ctrl}-@code{C}
immediately raises the @ref{bc4,,KeyboardInterrupt} without cancelling the main task.
@end enumerate

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Coroutines and tasks,스트림,Runners,asyncio — 비동기 I/O
@anchor{library/asyncio-task doc}@anchor{37fc}@anchor{library/asyncio-task coroutines-and-tasks}@anchor{37fd}@anchor{library/asyncio-task translation-repo}@anchor{37fe}
@subsubsection Coroutines and tasks


이 절에서는 코루틴과 태스크로 작업하기 위한 고급 asyncio API에 관해 설명합니다.

@menu
* 코루틴: 코루틴<2>. 
* 어웨이터블:: 
* Creating tasks:: 
* Task cancellation:: 
* Task groups:: 
* 잠자기:: 
* Running tasks concurrently:: 
* Eager task factory:: 
* Shielding from cancellation:: 
* 시간제한:: 
* Waiting primitives:: 
* Running in threads:: 
* Scheduling from other threads:: 
* 인트로스펙션:: 
* Task object:: 

@end menu

@node 코루틴<2>,어웨이터블,,Coroutines and tasks
@anchor{library/asyncio-task coroutine}@anchor{37e9}@anchor{library/asyncio-task coroutines}@anchor{37ff}
@subsubsection 코루틴


`소스 코드:' Lib/asyncio/coroutines.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/asyncio/coroutines.py}


__________________________________________________________________


async/await 문법으로 선언된 @ref{6b8,,코루틴}은 asyncio 응용 프로그램을 작성하는 기본 방법입니다. 예를 들어, 다음 코드 조각은 “hello”를 인쇄하고, 1초 동안 기다린 다음, “world”를 인쇄합니다:

@example
>>> import asyncio

>>> async def main():
...     print('hello')
...     await asyncio.sleep(1)
...     print('world')

>>> asyncio.run(main())
hello
world
@end example

단지 코루틴을 호출하는 것으로 실행되도록 예약하는 것은 아닙니다:

@example
>>> main()
<coroutine object main at 0x1053bb7c8>
@end example

코루틴을 실제로 실행하기 위해, asyncio가 다음과 같은 메커니즘을 제공합니다:


@itemize *

@item 
최상위 진입점 “main()” 함수를 실행하는 @ref{2f3,,asyncio.run()} 함수 (위의 예를 보세요.)

@item 
코루틴을 기다리기. 다음 코드 조각은 1초를 기다린 후 “hello”를 인쇄한 다음 `또' 2초를 기다린 후 “world”를 인쇄합니다:

@example
import asyncio
import time

async def say_after(delay, what):
    await asyncio.sleep(delay)
    print(what)

async def main():
    print(f"started at @{time.strftime('%X')@}")

    await say_after(1, 'hello')
    await say_after(2, 'world')

    print(f"finished at @{time.strftime('%X')@}")

asyncio.run(main())
@end example

예상 출력:

@example
started at 17:13:52
hello
world
finished at 17:13:55
@end example

@item 
코루틴을 asyncio @ref{1c7,,태스크}로 동시에 실행하는 @ref{1c9,,asyncio.create_task()} 함수.

위의 예를 수정해서 두 개의 @code{say_after} 코루틴을 `동시에' 실행해 봅시다:

@example
async def main():
    task1 = asyncio.create_task(
        say_after(1, 'hello'))

    task2 = asyncio.create_task(
        say_after(2, 'world'))

    print(f"started at @{time.strftime('%X')@}")

    # 두 태스크가 모두 완료할 때까지 기다립니다 (2초 정도
    # 걸려야 합니다.)
    await task1
    await task2

    print(f"finished at @{time.strftime('%X')@}")
@end example

예상 출력은 이제 코드 조각이 이전보다 1초 빠르게 실행되었음을 보여줍니다:

@example
started at 17:14:32
hello
world
finished at 17:14:34
@end example

@item 
The @ref{4d2,,asyncio.TaskGroup} class provides a more modern
alternative to @ref{1c9,,create_task()}.
Using this API, the last example becomes:

@example
async def main():
    async with asyncio.TaskGroup() as tg:
        task1 = tg.create_task(
            say_after(1, 'hello'))

        task2 = tg.create_task(
            say_after(2, 'world'))

        print(f"started at @{time.strftime('%X')@}")

    # 컨텍스트 매니저를 빠져나갈 때 어웨이트는 묵시적입니다.

    print(f"finished at @{time.strftime('%X')@}")
@end example

The timing and output should be the same as for the previous version.


Added in version 3.11: @ref{4d2,,asyncio.TaskGroup}.

@end itemize

@node 어웨이터블,Creating tasks,코루틴<2>,Coroutines and tasks
@anchor{library/asyncio-task asyncio-awaitables}@anchor{3800}@anchor{library/asyncio-task awaitables}@anchor{3801}
@subsubsection 어웨이터블


우리는 객체가 @ref{18d,,await} 표현식에서 사용될 수 있을 때 `어웨이터블' 객체라고 말합니다. 많은 asyncio API는 어웨이터블을 받아들이도록 설계되었습니다.

`어웨이터블' 객체에는 세 가지 주요 유형이 있습니다: `코루틴', `태스크' 및 `퓨처'.

@subsubheading 코루틴


파이썬 코루틴은 `어웨이터블'이므로 다른 코루틴에서 기다릴 수 있습니다:

@example
import asyncio

async def nested():
    return 42

async def main():
    # 단지 "nested()" 를 호출하면 아무 일도 일어나지 않습니다.
    # 코루틴 객체가 생성되었지만 기다리지 않았습니다.
    # 따라서 *전혀 실행되지 않습니다*.
    nested()  # will raise a "RuntimeWarning".

    # 이제 다른 식으로 해봅시다, 기다립니다:
    print(await nested())  # "42" 를 인쇄합니다.

asyncio.run(main())
@end example

@cartouche
@quotation 중요 
이 설명서에서 “코루틴” 이라는 용어는 두 가지 밀접한 관련 개념에 사용될 수 있습니다:


@itemize *

@item 
`코루틴 함수': @ref{7ec,,async def} 함수;

@item 
`코루틴 객체': `코루틴 함수'를 호출하여 반환된 객체.
@end itemize
@end quotation
@end cartouche

@subsubheading 태스크


`태스크'는 코루틴을 `동시에' 예약하는 데 사용됩니다.

코루틴이 @ref{1c9,,asyncio.create_task()}와 같은 함수를 사용하여 `태스크'로 싸일 때 코루틴은 곧 실행되도록 자동으로 예약됩니다:

@example
import asyncio

async def nested():
    return 42

async def main():
    # nested()가 곧 "main()" 과 동시에 실행되도록
    # 예약합니다.
    task = asyncio.create_task(nested())

    # "task" 는 이제 "nested()" 를 취소하는 데 사용하거나,
    # 단순히 완료할 때까지 기다릴 수 있습니다:
    await task

asyncio.run(main())
@end example

@subsubheading 퓨처


@ref{dc5,,Future}는 비동기 연산의 `최종 결과'를 나타내는 특별한 `저수준' 어웨이터블 객체입니다.

Future 객체를 `기다릴' 때, 그것은 코루틴이 Future가 다른 곳에서 해결될 때까지 기다릴 것을 뜻합니다.

콜백 기반 코드를 async/await와 함께 사용하려면 asyncio의 Future 객체가 필요합니다.

일반적으로 응용 프로그램 수준 코드에서 Future 객체를 만들 `필요는 없습니다'.

때때로 라이브러리와 일부 asyncio API에 의해 노출되는 Future 객체를 기다릴 수 있습니다:

@example
async def main():
    await function_that_returns_a_future_object()

    # 이것도 유효합니다:
    await asyncio.gather(
        function_that_returns_a_future_object(),
        some_python_coroutine()
    )
@end example

Future 객체를 반환하는 저수준 함수의 좋은 예는 @ref{ae6,,loop.run_in_executor()}입니다.

@node Creating tasks,Task cancellation,어웨이터블,Coroutines and tasks
@anchor{library/asyncio-task creating-tasks}@anchor{3802}
@subsubsection Creating tasks


`소스 코드:' Lib/asyncio/tasks.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/asyncio/tasks.py}


__________________________________________________________________


@geindex create_task() (asyncio 모듈)
@anchor{library/asyncio-task asyncio create_task}@anchor{1c9}
@deffn {함수} asyncio.create_task (coro, *, name=None, context=None, eager_start=None, **kwargs)

`coro' @ref{37e9,,코루틴}을 @ref{1c7,,Task}로 감싸고 실행을 예약합니다. Task 객체를 반환합니다.

The full function signature is largely the same as that of the
@ref{1c7,,Task} constructor (or factory) - all of the keyword arguments to
this function are passed through to that interface.

An optional keyword-only `context' argument allows specifying a
custom @ref{177,,contextvars.Context} for the `coro' to run in.
The current context copy is created when no `context' is provided.

An optional keyword-only `eager_start' argument allows specifying
if the task should execute eagerly during the call to create_task,
or be scheduled later. If `eager_start' is not passed the mode set
by @ref{1c8,,loop.set_task_factory()} will be used.

@ref{d00,,get_running_loop()}에 의해 반환된 루프에서 태스크가 실행되고, 현재 스레드에 실행 중인 루프가 없으면 @ref{244,,RuntimeError}가 발생합니다.

@cartouche
@quotation 참고 
@ref{1cb,,asyncio.TaskGroup.create_task()} is a new alternative
leveraging structural concurrency; it allows for waiting
for a group of related tasks with strong safety guarantees.
@end quotation
@end cartouche

@cartouche
@quotation 중요 
Save a reference to the result of this function, to avoid
a task disappearing mid-execution. The event loop only keeps
weak references to tasks. A task that isn’t referenced elsewhere
may get garbage collected at any time, even before it’s done.
For reliable “fire-and-forget” background tasks, gather them in
a collection:

@example
background_tasks = set()

for i in range(10):
    task = asyncio.create_task(some_coro(param=i))

    # 태스크를 집합에 추가합니다. 이는 강한 참조를 만듭니다.
    background_tasks.add(task)

    # 완료된 태스크에 대한 참조를 영원히 유지하지 않도록 하려면,
    # 각 태스크가 완료 후에 집합에서 자신의 참조를 제거하도록
    # 하십시오:
    task.add_done_callback(background_tasks.discard)
@end example
@end quotation
@end cartouche


Added in version 3.7.



버전 3.8에서 변경: `name' 매개 변수가 추가되었습니다.



버전 3.11에서 변경: `context' 매개 변수가 추가되었습니다.



버전 3.14에서 변경: Added the `eager_start' parameter by passing on all `kwargs'.

@end deffn

@node Task cancellation,Task groups,Creating tasks,Coroutines and tasks
@anchor{library/asyncio-task task-cancellation}@anchor{3803}
@subsubsection Task cancellation


Tasks can easily and safely be cancelled.
When a task is cancelled, @ref{4d5,,asyncio.CancelledError} will be raised
in the task at the next opportunity.

It is recommended that coroutines use @code{try/finally} blocks to robustly
perform clean-up logic. In case @ref{4d5,,asyncio.CancelledError}
is explicitly caught, it should generally be propagated when
clean-up is complete. @code{asyncio.CancelledError} directly subclasses
@ref{7d6,,BaseException} so most code will not need to be aware of it.

The asyncio components that enable structured concurrency, like
@ref{4d2,,asyncio.TaskGroup} and @ref{813,,asyncio.timeout()},
are implemented using cancellation internally and might misbehave if
a coroutine swallows @ref{4d5,,asyncio.CancelledError}. Similarly, user code
should not generally call @ref{4d7,,uncancel}.
However, in cases when suppressing @code{asyncio.CancelledError} is
truly desired, it is necessary to also call @code{uncancel()} to completely
remove the cancellation state.

@node Task groups,잠자기,Task cancellation,Coroutines and tasks
@anchor{library/asyncio-task task-groups}@anchor{3804}@anchor{library/asyncio-task taskgroups}@anchor{3805}
@subsubsection Task groups


Task groups combine a task creation API with a convenient
and reliable way to wait for all tasks in the group to finish.

@geindex TaskGroup (asyncio 클래스)
@anchor{library/asyncio-task asyncio TaskGroup}@anchor{4d2}
@deffn {클래스} asyncio.TaskGroup

An @ref{811,,asynchronous context manager}
holding a group of tasks.
Tasks can be added to the group using @ref{1c9,,create_task()}.
All tasks are awaited when the context manager exits.


Added in version 3.11.


@geindex create_task() (asyncio.TaskGroup 메서드)
@anchor{library/asyncio-task asyncio TaskGroup create_task}@anchor{1cb}
@deffn {메서드} create_task (coro, *, name=None, context=None, eager_start=None, **kwargs)

Create a task in this task group.
The signature matches that of @ref{1c9,,asyncio.create_task()}.
If the task group is inactive (e.g. not yet entered,
already finished, or in the process of shutting down),
we will close the given @code{coro}.


버전 3.13에서 변경: Close the given coroutine if the task group is not active.



버전 3.14에서 변경: Passes on all `kwargs' to @ref{1ca,,loop.create_task()}

@end deffn
@end deffn

예:

@example
async def main():
    async with asyncio.TaskGroup() as tg:
        task1 = tg.create_task(some_coro(...))
        task2 = tg.create_task(another_coro(...))
    print(f"Both tasks have completed now: @{task1.result()@}, @{task2.result()@}")
@end example

The @code{async with} statement will wait for all tasks in the group to finish.
While waiting, new tasks may still be added to the group
(for example, by passing @code{tg} into one of the coroutines
and calling @code{tg.create_task()} in that coroutine).
Once the last task has finished and the @code{async with} block is exited,
no new tasks may be added to the group.

The first time any of the tasks belonging to the group fails
with an exception other than @ref{4d5,,asyncio.CancelledError},
the remaining tasks in the group are cancelled.
No further tasks can then be added to the group.
At this point, if the body of the @code{async with} statement is still active
(i.e., @ref{19a2,,__aexit__()} hasn’t been called yet),
the task directly containing the @code{async with} statement is also cancelled.
The resulting @code{asyncio.CancelledError} will interrupt an @code{await},
but it will not bubble out of the containing @code{async with} statement.

Once all tasks have finished, if any tasks have failed
with an exception other than @ref{4d5,,asyncio.CancelledError},
those exceptions are combined in an
@ref{4d3,,ExceptionGroup} or @ref{564,,BaseExceptionGroup}
(as appropriate; see their documentation)
which is then raised.

Two base exceptions are treated specially:
If any task fails with @ref{bc4,,KeyboardInterrupt} or @ref{f3b,,SystemExit},
the task group still cancels the remaining tasks and waits for them,
but then the initial @code{KeyboardInterrupt} or @code{SystemExit}
is re-raised instead of @ref{4d3,,ExceptionGroup} or @ref{564,,BaseExceptionGroup}.

If the body of the @code{async with} statement exits with an exception
(so @ref{19a2,,__aexit__()} is called with an exception set),
this is treated the same as if one of the tasks failed:
the remaining tasks are cancelled and then waited for,
and non-cancellation exceptions are grouped into an
exception group and raised.
The exception passed into @code{__aexit__()},
unless it is @ref{4d5,,asyncio.CancelledError},
is also included in the exception group.
The same special case is made for
@ref{bc4,,KeyboardInterrupt} and @ref{f3b,,SystemExit} as in the previous paragraph.

Task groups are careful not to mix up the internal cancellation used to
“wake up” their @ref{19a2,,__aexit__()} with cancellation requests
for the task in which they are running made by other parties.
In particular, when one task group is syntactically nested in another,
and both experience an exception in one of their child tasks simultaneously,
the inner task group will process its exceptions, and then the outer task group
will receive another cancellation and process its own exceptions.

In the case where a task group is cancelled externally and also must
raise an @ref{4d3,,ExceptionGroup}, it will call the parent task’s
@ref{4d4,,cancel()} method. This ensures that a
@ref{4d5,,asyncio.CancelledError} will be raised at the next
@ref{18d,,await}, so the cancellation is not lost.

Task groups preserve the cancellation count
reported by @ref{4d6,,asyncio.Task.cancelling()}.


버전 3.13에서 변경: Improved handling of simultaneous internal and external cancellations
and correct preservation of cancellation counts.


@menu
* Terminating a task group:: 

@end menu

@node Terminating a task group,,,Task groups
@anchor{library/asyncio-task terminating-a-task-group}@anchor{3806}
@subsubsection Terminating a task group


While terminating a task group is not natively supported by the standard
library, termination can be achieved by adding an exception-raising task
to the task group and ignoring the raised exception:

@example
import asyncio
from asyncio import TaskGroup

class TerminateTaskGroup(Exception):
    """태스크 그룹 종료하려고 발생시키는 예외."""

async def force_terminate_task_group():
    """태스크 그룹의 강제 종료에 사용됩니다."""
    raise TerminateTaskGroup()

async def job(task_id, sleep_time):
    print(f'Task @{task_id@}: start')
    await asyncio.sleep(sleep_time)
    print(f'Task @{task_id@}: done')

async def main():
    try:
        async with TaskGroup() as group:
            # 태스크를 몇 개 만듭니다
            group.create_task(job(1, 0.5))
            group.create_task(job(2, 1.5))
            # 1초 동안 잠잡니다
            await asyncio.sleep(1)
            # 그룹을 강제 종료하기 위해 예외를 일으키는 태스크를 추가합니다
            group.create_task(force_terminate_task_group())
    except* TerminateTaskGroup:
        pass

asyncio.run(main())
@end example

예상 출력:

@example
Task 1: start
Task 2: start
Task 1: done
@end example

@node 잠자기,Running tasks concurrently,Task groups,Coroutines and tasks
@anchor{library/asyncio-task sleeping}@anchor{3807}
@subsubsection 잠자기


@geindex sleep() (asyncio 모듈)
@anchor{library/asyncio-task asyncio sleep}@anchor{c63}
@deffn {함수} async asyncio.sleep (delay, result=None)

`delay' 초 동안 블록합니다.

`result'가 제공되면, 코루틴이 완료될 때 호출자에게 반환됩니다.

@code{sleep()}은 항상 현재 태스크를 일시 중단해서 다른 태스크를 실행할 수 있도록 합니다.

Setting the delay to 0 provides an optimized path to allow other
tasks to run. This can be used by long-running functions to avoid
blocking the event loop for the full duration of the function call.
@anchor{library/asyncio-task asyncio-example-sleep}@anchor{3808}
5초 동안 현재 날짜를 매초 표시하는 코루틴의 예:

@example
import asyncio
import datetime as dt

async def display_date():
    loop = asyncio.get_running_loop()
    end_time = loop.time() + 5.0
    while True:
        print(dt.datetime.now())
        if (loop.time() + 1.0) >= end_time:
            break
        await asyncio.sleep(1)

asyncio.run(display_date())
@end example


버전 3.10에서 변경: `loop' 매개 변수를 제거했습니다.



버전 3.13에서 변경: Raises @ref{2ec,,ValueError} if `delay' is @ref{872,,nan}.

@end deffn

@node Running tasks concurrently,Eager task factory,잠자기,Coroutines and tasks
@anchor{library/asyncio-task running-tasks-concurrently}@anchor{3809}
@subsubsection Running tasks concurrently


@geindex gather() (asyncio 모듈)
@anchor{library/asyncio-task asyncio gather}@anchor{812}
@deffn {함수} awaitable asyncio.gather (*aws, return_exceptions=False)

`aws' 시퀀스에 있는 @ref{3800,,어웨이터블 객체}를 `동시에' 실행합니다.

`aws'에 있는 어웨이터블이 코루틴이면 자동으로 태스크로 예약됩니다.

모든 어웨이터블이 성공적으로 완료되면, 결과는 반환된 값들이 합쳐진 리스트입니다. 결괏값의 순서는 `aws'에 있는 어웨이터블의 순서와 일치합니다.

`return_exceptions'가 @code{False}(기본값)면, 첫 번째 발생한 예외가 @code{gather()}를 기다리는 태스크로 즉시 전파됩니다. `aws' 시퀀스의 다른 어웨이터블은 `취소되지 않고' 계속 실행됩니다.

`return_exceptions'가 @code{True}면, 예외는 성공적인 결과처럼 처리되고, 결과 리스트에 집계됩니다.

@code{gather()}가 `취소되면', 모든 제출된 (아직 완료되지 않은) 어웨이터블도 `취소됩니다'.

`aws' 시퀀스의 Task나 Future가 `취소되면', 그것이 @ref{4d5,,CancelledError}를 일으킨 것처럼 처리됩니다 – 이때 @code{gather()} 호출은 취소되지 `않습니다'. 이것은 제출된 태스크/퓨처 하나를 취소하는 것이 다른 태스크/퓨처를 취소하게 되는 것을 막기 위한 것입니다.

@cartouche
@quotation 참고 
A new alternative to create and run tasks concurrently and
wait for their completion is @ref{4d2,,asyncio.TaskGroup}. `TaskGroup'
provides stronger safety guarantees than `gather' for scheduling a nesting of subtasks:
if a task (or a subtask, a task scheduled by a task)
raises an exception, `TaskGroup' will, while `gather' will not,
cancel the remaining scheduled tasks.
@end quotation
@end cartouche
@anchor{library/asyncio-task asyncio-example-gather}@anchor{380a}
예:

@example
import asyncio

async def factorial(name, number):
    f = 1
    for i in range(2, number + 1):
        print(f"Task @{name@}: Compute factorial(@{number@}), currently i=@{i@}...")
        await asyncio.sleep(1)
        f *= i
    print(f"Task @{name@}: factorial(@{number@}) = @{f@}")
    return f

async def main():
    # 3개의 호출을 *동시에* 예약합니다:
    L = await asyncio.gather(
        factorial("A", 2),
        factorial("B", 3),
        factorial("C", 4),
    )
    print(L)

asyncio.run(main())

# 예상 출력:
#
#     Task A: Compute factorial(2), currently i=2...
#     Task B: Compute factorial(3), currently i=2...
#     Task C: Compute factorial(4), currently i=2...
#     Task A: factorial(2) = 2
#     Task B: Compute factorial(3), currently i=3...
#     Task C: Compute factorial(4), currently i=3...
#     Task B: factorial(3) = 6
#     Task C: Compute factorial(4), currently i=4...
#     Task C: factorial(4) = 24
#     [2, 6, 24]
@end example

@cartouche
@quotation 참고 
`return_exceptions'가 거짓이면, 완료로 표시된 후 gather()를 취소하는 것은 제출된 어웨이터블을 취소하지 않습니다. 예를 들어, 예외를 호출자에게 전파한 후 gather가 완료된 것으로 표시될 수 있습니다, 따라서 gather에서 (어웨이터블 중 하나에 의해 발생한) 예외를 포착한 후 @code{gather.cancel()}을 호출하는 것은 다른 어웨이터블을 취소하지 않습니다.
@end quotation
@end cartouche


버전 3.7에서 변경: `gather' 자체가 취소되면, `return_exceptions'와 관계없이 취소가 전파됩니다.



버전 3.10에서 변경: `loop' 매개 변수를 제거했습니다.



버전 3.10부터 폐지됨: Deprecation warning is emitted if no positional arguments are provided
or not all positional arguments are Future-like objects
and there is no running event loop.

@end deffn

@node Eager task factory,Shielding from cancellation,Running tasks concurrently,Coroutines and tasks
@anchor{library/asyncio-task eager-task-factory}@anchor{380b}@anchor{library/asyncio-task id2}@anchor{380c}
@subsubsection Eager task factory


@geindex eager_task_factory() (asyncio 모듈)
@anchor{library/asyncio-task asyncio eager_task_factory}@anchor{6a1}
@deffn {함수} asyncio.eager_task_factory (loop, coro, *, name=None, context=None)

A task factory for eager task execution.

When using this factory (via @ref{1c8,,loop.set_task_factory(asyncio.eager_task_factory)}),
coroutines begin execution synchronously during @ref{1c7,,Task} construction.
Tasks are only scheduled on the event loop if they block.
This can be a performance improvement as the overhead of loop scheduling
is avoided for coroutines that complete synchronously.

A common example where this is beneficial is coroutines which employ
caching or memoization to avoid actual I/O when possible.

@cartouche
@quotation 참고 
Immediate execution of the coroutine is a semantic change.
If the coroutine returns or raises, the task is never scheduled
to the event loop. If the coroutine execution blocks, the task is
scheduled to the event loop. This change may introduce behavior
changes to existing applications. For example,
the application’s task execution order is likely to change.
@end quotation
@end cartouche


Added in version 3.12.

@end deffn

@geindex create_eager_task_factory() (asyncio 모듈)
@anchor{library/asyncio-task asyncio create_eager_task_factory}@anchor{6a2}
@deffn {함수} asyncio.create_eager_task_factory (custom_task_constructor)

Create an eager task factory, similar to @ref{6a1,,eager_task_factory()},
using the provided `custom_task_constructor' when creating a new task instead
of the default @ref{1c7,,Task}.

`custom_task_constructor' must be a `callable' with the signature matching
the signature of @ref{1c7,,Task.__init__}.
The callable must return a @ref{1c7,,asyncio.Task}-compatible object.

This function returns a `callable' intended to be used as a task factory of an
event loop via @ref{1c8,,loop.set_task_factory(factory)}).


Added in version 3.12.

@end deffn

@node Shielding from cancellation,시간제한,Eager task factory,Coroutines and tasks
@anchor{library/asyncio-task shielding-from-cancellation}@anchor{380d}
@subsubsection Shielding from cancellation


@geindex shield() (asyncio 모듈)
@anchor{library/asyncio-task asyncio shield}@anchor{c64}
@deffn {함수} awaitable asyncio.shield (aw)

@ref{3800,,어웨이터블 객체}를 @ref{4d4,,취소}로부터 보호합니다.

`aw'가 코루틴이면 자동으로 태스크로 예약됩니다.

다음 문장:

@example
task = asyncio.create_task(something())
res = await shield(task)
@end example

은 다음과 동등합니다:

@example
res = await something()
@end example

`단', 그것을 포함하는 코루틴이 취소되면, @code{something()}에서 실행 중인 태스크는 취소되지 않는다는 것만 예외입니다. @code{something()}의 관점에서는, 취소가 일어나지 않았습니다. 호출자는 여전히 취소되었고, “await” 표현식은 여전히 @ref{4d5,,CancelledError}를 발생시킵니다.

@code{something()}가 다른 수단(즉, 그 안에서 스스로)에 의해 취소되면, @code{shield()}도 취소됩니다.

취소를 완전히 무시하려면(권장되지 않습니다), 다음과 같이 @code{shield()} 함수를 try/except 절과 결합해야 합니다:

@example
task = asyncio.create_task(something())
try:
    res = await shield(task)
except CancelledError:
    res = None
@end example

@cartouche
@quotation 중요 
Save a reference to tasks passed to this function, to avoid
a task disappearing mid-execution. The event loop only keeps
weak references to tasks. A task that isn’t referenced elsewhere
may get garbage collected at any time, even before it’s done.
@end quotation
@end cartouche


버전 3.10에서 변경: `loop' 매개 변수를 제거했습니다.



버전 3.10부터 폐지됨: Deprecation warning is emitted if `aw' is not Future-like object
and there is no running event loop.

@end deffn

@node 시간제한,Waiting primitives,Shielding from cancellation,Coroutines and tasks
@anchor{library/asyncio-task timeouts}@anchor{380e}
@subsubsection 시간제한


@geindex timeout() (asyncio 모듈)
@anchor{library/asyncio-task asyncio timeout}@anchor{813}
@deffn {함수} asyncio.timeout (delay)

Return an @ref{811,,asynchronous context manager}
that can be used to limit the amount of time spent waiting on
something.

`delay'는 @code{None} 또는 대기할 float/int 초 수입니다. `delay'가 @code{None}이면, 시간 제한이 적용되지 않습니다; 컨텍스트 관리자가 만들어질 때 지연 시간이 아려지지 않은 경우 유용할 수 있습니다.

In either case, the context manager can be rescheduled after
creation using @ref{380f,,Timeout.reschedule()}.

예:

@example
async def main():
    async with asyncio.timeout(10):
        await long_running_task()
@end example

If @code{long_running_task} takes more than 10 seconds to complete,
the context manager will cancel the current task and handle
the resulting @ref{4d5,,asyncio.CancelledError} internally, transforming it
into a @ref{a36,,TimeoutError} which can be caught and handled.

@cartouche
@quotation 참고 
The @ref{813,,asyncio.timeout()} context manager is what transforms
the @ref{4d5,,asyncio.CancelledError} into a @ref{a36,,TimeoutError},
which means the @code{TimeoutError} can only be caught
`outside' of the context manager.
@end quotation
@end cartouche

Example of catching @ref{a36,,TimeoutError}:

@example
async def main():
    try:
        async with asyncio.timeout(10):
            await long_running_task()
    except TimeoutError:
        print("The long operation timed out, but we've handled it.")

    print("This statement will run regardless.")
@end example

The context manager produced by @ref{813,,asyncio.timeout()} can be
rescheduled to a different deadline and inspected.

@geindex Timeout (asyncio 클래스)
@anchor{library/asyncio-task asyncio Timeout}@anchor{1a40}
@deffn {클래스} asyncio.Timeout (when)

An @ref{811,,asynchronous context manager}
for cancelling overdue coroutines.

Prefer using @ref{813,,asyncio.timeout()} or @ref{1bb1,,asyncio.timeout_at()}
rather than instantiating @code{Timeout} directly.

@code{when} should be an absolute time at which the context should time out,
as measured by the event loop’s clock:


@itemize -

@item 
If @code{when} is @code{None}, the timeout will never trigger.

@item 
If @code{when < loop.time()}, the timeout will trigger on the next
iteration of the event loop.
@end itemize

@quotation

@geindex when() (asyncio.Timeout 메서드)
@anchor{library/asyncio-task asyncio Timeout when}@anchor{3810}
@deffn {메서드} when () -> float | None

Return the current deadline, or @code{None} if the current
deadline is not set.
@end deffn

@geindex reschedule() (asyncio.Timeout 메서드)
@anchor{library/asyncio-task asyncio Timeout reschedule}@anchor{380f}
@deffn {메서드} reschedule (when: float | None)

Reschedule the timeout.
@end deffn

@geindex expired() (asyncio.Timeout 메서드)
@anchor{library/asyncio-task asyncio Timeout expired}@anchor{3811}
@deffn {메서드} expired () -> bool

Return whether the context manager has exceeded its deadline
(expired).
@end deffn
@end quotation
@end deffn

예:

@example
async def main():
    try:
        # 시작 시 시간 제한을 알 수 없어서 `@w{`}None`@w{`} 을 전달합니다.
        async with asyncio.timeout(None) as cm:
            # 이제 시간 제한을 알게되어, 재조정합니다.
            new_deadline = get_running_loop().time() + 10
            cm.reschedule(new_deadline)

            await long_running_task()
    except TimeoutError:
        pass

    if cm.expired():
        print("Looks like we haven't finished on time.")
@end example

Timeout context managers can be safely nested.


Added in version 3.11.

@end deffn

@geindex timeout_at() (asyncio 모듈)
@anchor{library/asyncio-task asyncio timeout_at}@anchor{1bb1}
@deffn {함수} asyncio.timeout_at (when)

Similar to @ref{813,,asyncio.timeout()}, except `when' is the absolute time
to stop waiting, or @code{None}.

예:

@example
async def main():
    loop = get_running_loop()
    deadline = loop.time() + 20
    try:
        async with asyncio.timeout_at(deadline):
            await long_running_task()
    except TimeoutError:
        print("The long operation timed out, but we've handled it.")

    print("This statement will run regardless.")
@end example


Added in version 3.11.

@end deffn

@geindex wait_for() (asyncio 모듈)
@anchor{library/asyncio-task asyncio wait_for}@anchor{814}
@deffn {함수} async asyncio.wait_for (aw, timeout)

`aw' @ref{3800,,어웨이터블}이 제한된 시간 내에 완료될 때까지 기다립니다.

`aw'가 코루틴이면 자동으로 태스크로 예약됩니다.

`timeout'은 @code{None} 또는 대기할 float 나 int 초 수입니다. `timeout'이 @code{None}이면 퓨처가 완료될 때까지 블록합니다.

시간 초과가 발생하면, 태스크를 취소하고 @ref{a36,,TimeoutError}를 발생시킵니다.

태스크 @ref{4d4,,취소}를 피하려면, @ref{c64,,shield()}로 감싸십시오.

이 함수는 퓨처가 실제로 취소될 때까지 대기하므로, 총 대기 시간이 `timeout'을 초과할 수 있습니다. 취소하는 동안 예외가 발생하면, 전파됩니다.

대기가 취소되면, 퓨처 `aw'도 취소됩니다.
@anchor{library/asyncio-task asyncio-example-waitfor}@anchor{3812}
예:

@example
async def eternity():
    # 1시간 동안 잠잡니다
    await asyncio.sleep(3600)
    print('yay!')

async def main():
    # 최대 1초간 대기합니다
    try:
        await asyncio.wait_for(eternity(), timeout=1.0)
    except TimeoutError:
        print('timeout!')

asyncio.run(main())

# 예상 출력:
#
#     timeout!
@end example


버전 3.7에서 변경: 시간 초과로 인해 `aw'가 취소되면, @code{wait_for}는 `aw'가 취소될 때까지 대기합니다. 이전에는 @ref{a36,,TimeoutError}가 즉시 발생했습니다.



버전 3.10에서 변경: `loop' 매개 변수를 제거했습니다.



버전 3.11에서 변경: Raises @ref{a36,,TimeoutError} instead of @ref{1ab4,,asyncio.TimeoutError}.

@end deffn

@node Waiting primitives,Running in threads,시간제한,Coroutines and tasks
@anchor{library/asyncio-task waiting-primitives}@anchor{3813}
@subsubsection Waiting primitives


@geindex wait() (asyncio 모듈)
@anchor{library/asyncio-task asyncio wait}@anchor{6a6}
@deffn {함수} async asyncio.wait (aws, *, timeout=None, return_when=ALL_COMPLETED)

`aws' 이터러블에 있는 @ref{dc5,,Future}와 @ref{1c7,,Task} 인스턴스를 동시에 실행하고, `return_when'에 의해 지정된 조건을 만족할 때까지 블록합니다.

`aws' 이터러블은 비어있을 수 없습니다.

두 집합의 태스크/퓨처를 반환합니다: @code{(done, pending)}.

사용법:

@example
done, pending = await asyncio.wait(aws)
@end example

`timeout'(float나 int)을 지정하면, 반환하기 전에 대기할 최대 시간(초)을 제어할 수 있습니다.

이 함수는 @ref{a36,,TimeoutError}를 발생시키지 않음에 유의하십시오. 시간 초과가 발생할 때 완료되지 않은 퓨처나 태스크는 단순히 두 번째 집합으로 반환됩니다.

`return_when'는 이 함수가 언제 반환해야 하는지 나타냅니다. 다음 상수 중 하나여야 합니다:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

상수

@tab

설명

@item

@geindex FIRST_COMPLETED (asyncio 모듈)
@anchor{library/asyncio-task asyncio FIRST_COMPLETED}@anchor{3814}
@deffn {데이터} asyncio.FIRST_COMPLETED
@end deffn

@tab

퓨처가 하나라도 끝나거나 취소될 때 함수가 반환됩니다.

@item

@geindex FIRST_EXCEPTION (asyncio 모듈)
@anchor{library/asyncio-task asyncio FIRST_EXCEPTION}@anchor{3815}
@deffn {데이터} asyncio.FIRST_EXCEPTION
@end deffn

@tab

퓨처가 하나라도 예외를 일으켜 끝나면 함수가 반환됩니다. 어떤 퓨처도 예외를 일으키지 않으면 @ref{3816,,ALL_COMPLETED}와 같습니다.

@item

@geindex ALL_COMPLETED (asyncio 모듈)
@anchor{library/asyncio-task asyncio ALL_COMPLETED}@anchor{3816}
@deffn {데이터} asyncio.ALL_COMPLETED
@end deffn

@tab

모든 퓨처가 끝나거나 취소되면 함수가 반환됩니다.

@end multitable


@ref{814,,wait_for()}와 달리, @code{wait()}는 시간 초과가 발생할 때 퓨처를 취소하지 않습니다.


버전 3.10에서 변경: `loop' 매개 변수를 제거했습니다.



버전 3.11에서 변경: 코루틴 객체를 @code{wait()}로 직접 전달하는 것은 금지됩니다.



버전 3.12에서 변경: Added support for generators yielding tasks.

@end deffn

@geindex as_completed() (asyncio 모듈)
@anchor{library/asyncio-task asyncio as_completed}@anchor{4c7}
@deffn {함수} asyncio.as_completed (aws, *, timeout=None)

`aws' 이터러블에 있는 @ref{3800,,어웨이터블 객체}를 동시에 실행합니다. 코루틴의 이터레이터를 반환합니다. 반환된 객체는 어웨이터블이 완료될 때마다 그 결과를 얻기 위해 이터레이트 할 수 있습니다.

The object returned by @code{as_completed()} can be iterated as an
@ref{4c8,,asynchronous iterator} or a plain @ref{4ca,,iterator}. When asynchronous
iteration is used, the originally-supplied awaitables are yielded if they
are tasks or futures. This makes it easy to correlate previously-scheduled
tasks with their results. Example:

@example
ipv4_connect = create_task(open_connection("127.0.0.1", 80))
ipv6_connect = create_task(open_connection("::1", 80))
tasks = [ipv4_connect, ipv6_connect]

async for earliest_connect in as_completed(tasks):
    # earliest_connect 가 완료했습니다. 결과는 어웨이트하거나
    # earliest_connect.result() 를 호출해서 얻을 수 있습니다.
    reader, writer = await earliest_connect

    if earliest_connect is ipv6_connect:
        print("IPv6 connection established.")
    else:
        print("IPv4 connection established.")
@end example

During asynchronous iteration, implicitly-created tasks will be yielded for
supplied awaitables that aren’t tasks or futures.

When used as a plain iterator, each iteration yields a new coroutine that
returns the result or raises the exception of the next completed awaitable.
This pattern is compatible with Python versions older than 3.13:

@example
ipv4_connect = create_task(open_connection("127.0.0.1", 80))
ipv6_connect = create_task(open_connection("::1", 80))
tasks = [ipv4_connect, ipv6_connect]

for next_connect in as_completed(tasks):
    # next_connect 는 원래 태스크 객체 중 하나가 아닙니다.
    # 결과 값을 얻거나 다음에 완료되는 어웨이터블의 예외를 발생시키려면
    # 반드시 어웨이트해야 합니다.
    reader, writer = await next_connect
@end example

A @ref{a36,,TimeoutError} is raised if the timeout occurs before all awaitables
are done. This is raised by the @code{async for} loop during asynchronous
iteration or by the coroutines yielded during plain iteration.


버전 3.10에서 변경: `loop' 매개 변수를 제거했습니다.



버전 3.10부터 폐지됨: Deprecation warning is emitted if not all awaitable objects in the `aws'
iterable are Future-like objects and there is no running event loop.



버전 3.12에서 변경: Added support for generators yielding tasks.



버전 3.13에서 변경: The result can now be used as either an @ref{4c8,,asynchronous iterator}
or as a plain @ref{4ca,,iterator} (previously it was only a plain iterator).

@end deffn

@node Running in threads,Scheduling from other threads,Waiting primitives,Coroutines and tasks
@anchor{library/asyncio-task running-in-threads}@anchor{3817}
@subsubsection Running in threads


@geindex to_thread() (asyncio 모듈)
@anchor{library/asyncio-task asyncio to_thread}@anchor{ae5}
@deffn {함수} async asyncio.to_thread (func, /, *args, **kwargs)

별도의 스레드에서 `func' 함수를 비동기적으로 실행합니다.

이 함수에 제공된 모든 *args 와 **kwargs 는 `func'로 직접 전달됩니다. 또한, 현재 @ref{177,,contextvars.Context}가 전파되어, 이벤트 루프 스레드의 컨텍스트 변수가 별도의 스레드에서 액세스 될 수 있습니다.

`func'의 최종 결과를 얻기 위해 어웨이트 할 수 있는 코루틴을 반환합니다.

이 코루틴 함수는 메인 스레드에서 실행된다면 이벤트 루프를 블록할 IO 병목 함수/메서드를 실행하는 데 주로 사용됩니다. 예를 들면:

@example
def blocking_io():
    print(f"start blocking_io at @{time.strftime('%X')@}")
    # time.sleep()은 파일 연산과 같은 임의의 블로킹 IO 병목 연산으로 대체될
    # 수 있음에 유의하십시오.
    time.sleep(1)
    print(f"blocking_io complete at @{time.strftime('%X')@}")

async def main():
    print(f"started main at @{time.strftime('%X')@}")

    await asyncio.gather(
        asyncio.to_thread(blocking_io),
        asyncio.sleep(1))

    print(f"finished main at @{time.strftime('%X')@}")


asyncio.run(main())

# 예상 출력:
#
# started main at 19:50:53
# start blocking_io at 19:50:53
# blocking_io complete at 19:50:54
# finished main at 19:50:54
@end example

코루틴에서 @code{blocking_io()}를 직접 호출하면 그동안 이벤트 루프가 블록 되어 추가 1초의 실행 시간이 발생합니다. 대신, @code{asyncio.to_thread()}를 사용하면, 이벤트 루프를 블록하지 않고 별도의 스레드에서 실행할 수 있습니다.

@cartouche
@quotation 참고 
@ref{164,,GIL}로 인해, @code{asyncio.to_thread()}는 일반적으로 IO 병목 함수를 비 블로킹으로 만드는 데만 사용할 수 있습니다. 그러나, GIL을 반납하는 확장 모듈이나 GIL이 없는 대체 파이썬 구현의 경우, @code{asyncio.to_thread()}를 CPU 병목 함수에도 사용할 수 있습니다.
@end quotation
@end cartouche


Added in version 3.9.

@end deffn

@node Scheduling from other threads,인트로스펙션,Running in threads,Coroutines and tasks
@anchor{library/asyncio-task scheduling-from-other-threads}@anchor{3818}
@subsubsection Scheduling from other threads


@geindex run_coroutine_threadsafe() (asyncio 모듈)
@anchor{library/asyncio-task asyncio run_coroutine_threadsafe}@anchor{a82}
@deffn {함수} asyncio.run_coroutine_threadsafe (coro, loop)

주어진 이벤트 루프에 코루틴을 제출합니다. 스레드 안전합니다.

다른 OS 스레드에서 결과를 기다리는 @ref{13b7,,concurrent.futures.Future}를 반환합니다.

이 함수는 이벤트 루프가 실행 중인 스레드가 아닌, 다른 OS 스레드에서 호출하기 위한 것입니다. 예:

@example
def in_thread(loop: asyncio.AbstractEventLoop) -> None:
    # Run some blocking IO
    pathlib.Path("example.txt").write_text("hello world", encoding="utf8")

    # Create a coroutine
    coro = asyncio.sleep(1, result=3)

    # Submit the coroutine to a given loop
    future = asyncio.run_coroutine_threadsafe(coro, loop)

    # Wait for the result with an optional timeout argument
    assert future.result(timeout=2) == 3

async def amain() -> None:
    # Get the running loop
    loop = asyncio.get_running_loop()

    # Run something in a thread
    await asyncio.to_thread(in_thread, loop)
@end example

It’s also possible to run the other way around.  Example:

@example
@@contextlib.contextmanager
def loop_in_thread() -> Generator[asyncio.AbstractEventLoop]:
    loop_fut = concurrent.futures.Future[asyncio.AbstractEventLoop]()
    stop_event = asyncio.Event()

    async def main() -> None:
        loop_fut.set_result(asyncio.get_running_loop())
        await stop_event.wait()

    with concurrent.futures.ThreadPoolExecutor(1) as tpe:
        complete_fut = tpe.submit(asyncio.run, main())
        for fut in concurrent.futures.as_completed((loop_fut, complete_fut)):
            if fut is loop_fut:
                loop = loop_fut.result()
                try:
                    yield loop
                finally:
                    loop.call_soon_threadsafe(stop_event.set)
            else:
                fut.result()

# Create a loop in another thread
with loop_in_thread() as loop:
    # Create a coroutine
    coro = asyncio.sleep(1, result=3)

    # Submit the coroutine to a given loop
    future = asyncio.run_coroutine_threadsafe(coro, loop)

    # Wait for the result with an optional timeout argument
    assert future.result(timeout=2) == 3
@end example

코루틴에서 예외가 발생하면, 반환된 Future에 통지됩니다. 또한, 이벤트 루프에서 태스크를 취소하는 데 사용할 수 있습니다:

@example
try:
    result = future.result(timeout)
except TimeoutError:
    print('The coroutine took too long, cancelling the task...')
    future.cancel()
except Exception as exc:
    print(f'The coroutine raised an exception: @{exc!r@}')
else:
    print(f'The coroutine returned: @{result!r@}')
@end example

설명서의 @ref{3819,,동시성과 다중 스레드} 절을 참조하십시오.

다른 asyncio 함수와 달리, 이 함수는 `loop' 인자가 명시적으로 전달되어야 합니다.


Added in version 3.5.1.

@end deffn

@node 인트로스펙션,Task object,Scheduling from other threads,Coroutines and tasks
@anchor{library/asyncio-task introspection}@anchor{381a}
@subsubsection 인트로스펙션


@geindex current_task() (asyncio 모듈)
@anchor{library/asyncio-task asyncio current_task}@anchor{6a4}
@deffn {함수} asyncio.current_task (loop=None)

현재 실행 중인 @ref{1c7,,Task} 인스턴스를 반환하거나 태스크가 실행되고 있지 않으면 @code{None}을 반환합니다.

`loop'가 @code{None}이면, 현재 루프를 가져오는 데 @ref{d00,,get_running_loop()}가 사용됩니다.


Added in version 3.7.

@end deffn

@geindex all_tasks() (asyncio 모듈)
@anchor{library/asyncio-task asyncio all_tasks}@anchor{b4f}
@deffn {함수} asyncio.all_tasks (loop=None)

루프에 의해 실행되는 아직 완료되지 않은 @ref{1c7,,Task} 객체 집합을 반환합니다.

`loop'가 @code{None}이면, 현재 루프를 가져오는 데 @ref{d00,,get_running_loop()}가 사용됩니다.


Added in version 3.7.

@end deffn

@geindex iscoroutine() (asyncio 모듈)
@anchor{library/asyncio-task asyncio iscoroutine}@anchor{6a5}
@deffn {함수} asyncio.iscoroutine (obj)

`obj'가 코루틴 객체면 @code{True}를 반환합니다.


Added in version 3.4.

@end deffn

@node Task object,,인트로스펙션,Coroutines and tasks
@anchor{library/asyncio-task asyncio-task-obj}@anchor{381b}@anchor{library/asyncio-task task-object}@anchor{381c}
@subsubsection Task object


@geindex Task (asyncio 클래스)
@anchor{library/asyncio-task asyncio Task}@anchor{1c7}
@deffn {클래스} asyncio.Task (coro, *, loop=None, name=None, context=None, eager_start=False)

파이썬 @ref{37e9,,코루틴}을 실행하는 @ref{dc5,,퓨처류} 객체입니다. 스레드 안전하지 않습니다.

태스크는 이벤트 루프에서 코루틴을 실행하는 데 사용됩니다. 만약 코루틴이 Future를 기다리고 있다면, 태스크는 코루틴의 실행을 일시 중지하고 Future의 완료를 기다립니다. 퓨처가 `완료'되면, 감싸진 코루틴의 실행이 다시 시작됩니다.

이벤트 루프는 협업 스케줄링을 사용합니다: 이벤트 루프는 한 번에 하나의 Task를 실행합니다. Task가 Future의 완료를 기다리는 동안, 이벤트 루프는 다른 태스크, 콜백을 실행하거나 IO 연산을 수행합니다.

테스크를 만들려면 고수준 @ref{1c9,,asyncio.create_task()} 함수를 사용하거나, 저수준 @ref{1ca,,loop.create_task()} 나 @ref{e70,,ensure_future()} 함수를 사용하십시오. 태스크의 인스턴스를 직접 만드는 것은 권장되지 않습니다.

실행 중인 Task를 취소하려면 @ref{4d4,,cancel()} 메서드를 사용하십시오. 이를 호출하면 태스크가 감싼 코루틴으로 @ref{4d5,,CancelledError} 예외를 던집니다. 코루틴이 취소 중에 Future 객체를 기다리고 있으면, Future 객체가 취소됩니다.

@ref{381d,,cancelled()}는 태스크가 취소되었는지 확인하는 데 사용할 수 있습니다. 이 메서드는 감싼 코루틴이 @ref{4d5,,CancelledError} 예외를 억제하지 않고 실제로 취소되었으면 @code{True}를 반환합니다.

@ref{1c7,,asyncio.Task}는 @ref{381e,,Future.set_result()}와 @ref{e77,,Future.set_exception()}을 제외한 모든 API를 @ref{dc5,,Future}에서 상속받습니다.

An optional keyword-only `context' argument allows specifying a
custom @ref{177,,contextvars.Context} for the `coro' to run in.
If no `context' is provided, the Task copies the current context
and later runs its coroutine in the copied context.

An optional keyword-only `eager_start' argument allows eagerly starting
the execution of the @ref{1c7,,asyncio.Task} at task creation time.
If set to @code{True} and the event loop is running, the task will start
executing the coroutine immediately, until the first time the coroutine
blocks. If the coroutine returns or raises without blocking, the task
will be finished eagerly and will skip scheduling to the event loop.


버전 3.7에서 변경: @ref{28,,contextvars} 모듈에 대한 지원이 추가되었습니다.



버전 3.8에서 변경: `name' 매개 변수가 추가되었습니다.



버전 3.10부터 폐지됨: Deprecation warning is emitted if `loop' is not specified
and there is no running event loop.



버전 3.11에서 변경: `context' 매개 변수가 추가되었습니다.



버전 3.12에서 변경: `eager_start' 매개 변수가 추가되었습니다.


@geindex done() (asyncio.Task 메서드)
@anchor{library/asyncio-task asyncio Task done}@anchor{381f}
@deffn {메서드} done ()

Task가 `완료(done)'되었으면 @code{True}를 반환합니다.

감싼 코루틴이 값을 반환하거나 예외를 일으키거나, Task가 취소되면 Task는 `완료(done)'됩니다.
@end deffn

@geindex result() (asyncio.Task 메서드)
@anchor{library/asyncio-task asyncio Task result}@anchor{3820}
@deffn {메서드} result ()

Task의 결과를 반환합니다.

Task가 `완료(done)'되었으면 감싼 코루틴의 결과가 반환됩니다 (또는 코루틴이 예외를 발생시켰으면 해당 예외가 다시 발생합니다).

태스크가 `취소(cancelled)'되었으면, 이 메서드는 @ref{4d5,,CancelledError} 예외를 발생시킵니다.

태스크 결과를 아직 사용할 수 없으면, 이 메서드는 @ref{3821,,InvalidStateError} 예외를 발생시킵니다.
@end deffn

@geindex exception() (asyncio.Task 메서드)
@anchor{library/asyncio-task asyncio Task exception}@anchor{3822}
@deffn {메서드} exception ()

Task의 예외를 반환합니다.

감싼 코루틴이 예외를 발생시키면, 그 예외가 반환됩니다. 감싼 코루틴이 정상적으로 반환되면, 이 메서드는 @code{None}을 반환합니다.

태스크가 `취소(cancelled)'되었으면, 이 메서드는 @ref{4d5,,CancelledError} 예외를 발생시킵니다.

태스크가 아직 `완료(done)'되지 않았으면, 이 메서드는 @ref{3821,,InvalidStateError} 예외를 발생시킵니다.
@end deffn

@geindex add_done_callback() (asyncio.Task 메서드)
@anchor{library/asyncio-task asyncio Task add_done_callback}@anchor{3823}
@deffn {메서드} add_done_callback (callback, *, context=None)

태스크가 `완료(done)'될 때 실행할 콜백을 추가합니다.

이 메서드는 저수준 콜백 기반 코드에서만 사용해야 합니다.

자세한 내용은 @ref{cfd,,Future.add_done_callback()} 설명서를 참조하십시오.
@end deffn

@geindex remove_done_callback() (asyncio.Task 메서드)
@anchor{library/asyncio-task asyncio Task remove_done_callback}@anchor{3824}
@deffn {메서드} remove_done_callback (callback)

콜백 목록에서 `callback'을 제거합니다.

이 메서드는 저수준 콜백 기반 코드에서만 사용해야 합니다.

자세한 내용은 @ref{1912,,Future.remove_done_callback()} 설명서를 참조하십시오.
@end deffn

@geindex get_stack() (asyncio.Task 메서드)
@anchor{library/asyncio-task asyncio Task get_stack}@anchor{3825}
@deffn {메서드} get_stack (*, limit=None)

이 Task의 스택 프레임 리스트를 돌려줍니다.

감싼 코루틴이 완료되지 않았으면, 일시 정지된 곳의 스택을 반환합니다. 코루틴이 성공적으로 완료되었거나 취소되었으면 빈 리스트가 반환됩니다. 코루틴이 예외로 종료되었으면, 이것은 트레이스백 프레임의 리스트를 반환합니다.

프레임은 항상 가장 오래된 것부터 순서대로 정렬됩니다.

일시 정지된 코루틴에서는 하나의 스택 프레임만 반환됩니다.

선택적 `limit' 인자는 반환할 최대 프레임 수를 설정합니다; 기본적으로 사용 가능한 모든 프레임이 반환됩니다. 반환되는 리스트의 순서는 스택과 트레이스백 중 어느 것이 반환되는지에 따라 다릅니다: 스택은 최신 프레임이 반환되지만, 트레이스백은 가장 오래된 프레임이 반환됩니다. (이는 traceback 모듈의 동작과 일치합니다.)
@end deffn

@geindex print_stack() (asyncio.Task 메서드)
@anchor{library/asyncio-task asyncio Task print_stack}@anchor{1ace}
@deffn {메서드} print_stack (*, limit=None, file=None)

이 Task의 스택이나 트레이스백을 인쇄합니다.

이것은 @ref{3825,,get_stack()}으로 얻은 프레임에 대해 traceback 모듈과 유사한 출력을 생성합니다.

`limit' 인자는 @ref{3825,,get_stack()}에 직접 전달됩니다.

`file' 인자는 출력이 기록되는 I/O 스트림입니다; 기본적으로 출력은 @ref{ccc,,sys.stdout}에 기록됩니다.
@end deffn

@geindex get_coro() (asyncio.Task 메서드)
@anchor{library/asyncio-task asyncio Task get_coro}@anchor{bce}
@deffn {메서드} get_coro ()

@ref{1c7,,Task}로 싸인 코루틴 객체를 반환합니다.

@cartouche
@quotation 참고 
This will return @code{None} for Tasks which have already
completed eagerly. See the @ref{380b,,Eager Task Factory}.
@end quotation
@end cartouche


Added in version 3.8.



버전 3.12에서 변경: Newly added eager task execution means result may be @code{None}.

@end deffn

@geindex get_context() (asyncio.Task 메서드)
@anchor{library/asyncio-task asyncio Task get_context}@anchor{3826}
@deffn {메서드} get_context ()

Return the @ref{177,,contextvars.Context} object
associated with the task.


Added in version 3.12.

@end deffn

@geindex get_name() (asyncio.Task 메서드)
@anchor{library/asyncio-task asyncio Task get_name}@anchor{bd0}
@deffn {메서드} get_name ()

Task의 이름을 반환합니다.

Task에 명시적으로 이름이 지정되지 않으면, 기본 asyncio Task 구현은 인스턴스화 중에 기본 이름을 생성합니다.


Added in version 3.8.

@end deffn

@geindex set_name() (asyncio.Task 메서드)
@anchor{library/asyncio-task asyncio Task set_name}@anchor{bcf}
@deffn {메서드} set_name (value)

Task의 이름을 설정합니다.

`value' 인자는 모든 객체가 될 수 있으며, 문자열로 변환됩니다.

기본 Task 구현에서, 이름은 태스크 객체의 @ref{1c1,,repr()} 출력에 표시됩니다.


Added in version 3.8.

@end deffn

@geindex cancel() (asyncio.Task 메서드)
@anchor{library/asyncio-task asyncio Task cancel}@anchor{4d4}
@deffn {메서드} cancel (msg=None)

Task 취소를 요청합니다.

If the Task is already `done' or `cancelled', return @code{False},
otherwise, return @code{True}.

이 메서드는 이벤트 루프의 다음 사이클에서 감싼 코루틴으로 @ref{4d5,,CancelledError} 예외를 던져넣도록 합니다.

그러면 코루틴은 @ref{8f7,,try} … … @code{except CancelledError} … @ref{1b0,,finally} 블록으로 정리하거나 예외를 억제하여 요청을 거부할 수 있습니다. 따라서, @ref{1ba7,,Future.cancel()}와 달리 @ref{4d4,,Task.cancel()}은 Task가 취소됨을 보장하지는 않습니다. 하지만 취소를 완전히 억제하는 것은 일반적이지 않고, 그렇게 하지 말도록 적극적으로 권합니다. 그럼에도 불구하고 코루틴이 취소를 억제하기로 결정한 경우, 예외를 잡는 것 외에 @ref{4d7,,Task.uncancel()} 호출도 해야 합니다.


버전 3.9에서 변경: `msg' 매개 변수가 추가되었습니다.



버전 3.11에서 변경: The @code{msg} parameter is propagated from cancelled task to its awaiter.

@anchor{library/asyncio-task asyncio-example-task-cancel}@anchor{3827}
다음 예는 코루틴이 취소 요청을 가로채는 방법을 보여줍니다:

@example
async def cancel_me():
    print('cancel_me(): before sleep')

    try:
        # 1시간 동안 기다립니다
        await asyncio.sleep(3600)
    except asyncio.CancelledError:
        print('cancel_me(): cancel sleep')
        raise
    finally:
        print('cancel_me(): after sleep')

async def main():
    # "cancel_me" Task를 만듭니다
    task = asyncio.create_task(cancel_me())

    # 1초 동안 기다립니다
    await asyncio.sleep(1)

    task.cancel()
    try:
        await task
    except asyncio.CancelledError:
        print("main(): cancel_me is cancelled now")

asyncio.run(main())

# 예상 출력:
#
#     cancel_me(): before sleep
#     cancel_me(): cancel sleep
#     cancel_me(): after sleep
#     main(): cancel_me is cancelled now
@end example
@end deffn

@geindex cancelled() (asyncio.Task 메서드)
@anchor{library/asyncio-task asyncio Task cancelled}@anchor{381d}
@deffn {메서드} cancelled ()

Task가 `취소(cancelled)'되었으면 @code{True}를 반환합니다.

Task는 @ref{4d4,,cancel()}로 취소가 요청되고 감싼 코루틴이 자신에게 전달된 @ref{4d5,,CancelledError} 예외를 확산할 때 `최소(cancelled)'됩니다.
@end deffn

@geindex uncancel() (asyncio.Task 메서드)
@anchor{library/asyncio-task asyncio Task uncancel}@anchor{4d7}
@deffn {메서드} uncancel ()

Decrement the count of cancellation requests to this Task.

Returns the remaining number of cancellation requests.

Note that once execution of a cancelled task completed, further
calls to @code{uncancel()} are ineffective.


Added in version 3.11.


This method is used by asyncio’s internals and isn’t expected to be
used by end-user code.  In particular, if a Task gets successfully
uncancelled, this allows for elements of structured concurrency like
@ref{3805,,Task groups} and @ref{813,,asyncio.timeout()} to continue running,
isolating cancellation to the respective structured block.
For example:

@example
async def make_request_with_timeout():
    try:
        async with asyncio.timeout(1):
            # 시간 제한의 영향을 받는 구조화된 블록:
            await make_request()
            await make_another_request()
    except TimeoutError:
        log("There was a timeout")
    # 시간 제한의 영향을 받지 않는 바깥 코드:
    await unrelated_code()
@end example

While the block with @code{make_request()} and @code{make_another_request()}
might get cancelled due to the timeout, @code{unrelated_code()} should
continue running even in case of the timeout.  This is implemented
with @code{uncancel()}.  @ref{4d2,,TaskGroup} context managers use
@ref{4d7,,uncancel()} in a similar fashion.

If end-user code is, for some reason, suppressing cancellation by
catching @ref{4d5,,CancelledError}, it needs to call this method to remove
the cancellation state.

When this method decrements the cancellation count to zero,
the method checks if a previous @ref{4d4,,cancel()} call had arranged
for @ref{4d5,,CancelledError} to be thrown into the task.
If it hasn’t been thrown yet, that arrangement will be
rescinded (by resetting the internal @code{_must_cancel} flag).
@end deffn


버전 3.13에서 변경: Changed to rescind pending cancellation requests upon reaching zero.


@geindex cancelling() (asyncio.Task 메서드)
@anchor{library/asyncio-task asyncio Task cancelling}@anchor{4d6}
@deffn {메서드} cancelling ()

Return the number of pending cancellation requests to this Task, i.e.,
the number of calls to @ref{4d4,,cancel()} less the number of
@ref{4d7,,uncancel()} calls.

Note that if this number is greater than zero but the Task is
still executing, @ref{381d,,cancelled()} will still return @code{False}.
This is because this number can be lowered by calling @ref{4d7,,uncancel()},
which can lead to the task not being cancelled after all if the
cancellation requests go down to zero.

This method is used by asyncio’s internals and isn’t expected to be
used by end-user code.  See @ref{4d7,,uncancel()} for more details.


Added in version 3.11.

@end deffn
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 스트림,동기화 프리미티브<2>,Coroutines and tasks,asyncio — 비동기 I/O
@anchor{library/asyncio-stream doc}@anchor{3828}@anchor{library/asyncio-stream asyncio-streams}@anchor{37ea}@anchor{library/asyncio-stream streams}@anchor{3829}@anchor{library/asyncio-stream translation-repo}@anchor{382a}
@subsubsection 스트림


`소스 코드:' Lib/asyncio/streams.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/asyncio/streams.py}


__________________________________________________________________


스트림은 네트워크 연결로 작업하기 위해, async/await에서 사용할 수 있는 고수준 프리미티브입니다. 스트림은 콜백이나 저수준 프로토콜과 트랜스포트를 사용하지 않고 데이터를 송수신할 수 있게 합니다.
@anchor{library/asyncio-stream asyncio-example-stream}@anchor{382b}
다음은 asyncio 스트림을 사용하여 작성된 TCP 메아리 클라이언트의 예입니다:

@example
import asyncio

async def tcp_echo_client(message):
    reader, writer = await asyncio.open_connection(
        '127.0.0.1', 8888)

    print(f'Send: @{message!r@}')
    writer.write(message.encode())
    await writer.drain()

    data = await reader.read(100)
    print(f'Received: @{data.decode()!r@}')

    print('Close the connection')
    writer.close()
    await writer.wait_closed()

asyncio.run(tcp_echo_client('Hello World!'))
@end example

아래의 @ref{382c,,예제} 절도 참조하십시오.

@subsubheading 스트림 함수


다음 최상위 asyncio 함수를 사용하여 스트림을 만들고 작업할 수 있습니다.:

@geindex open_connection() (asyncio 모듈)
@anchor{library/asyncio-stream asyncio open_connection}@anchor{d0d}
@deffn {함수} async asyncio.open_connection (host=None, port=None, *, limit=None, ssl=None, family=0, proto=0, flags=0, sock=None, local_addr=None, server_hostname=None, ssl_handshake_timeout=None, ssl_shutdown_timeout=None, happy_eyeballs_delay=None, interleave=None)

네트워크 연결을 만들고 @code{(reader, writer)} 객체 쌍을 반환합니다.

반환된 `reader' 와 `writer' 객체는 @ref{176b,,StreamReader} 와 @ref{1a70,,StreamWriter} 클래스의 인스턴스입니다.

`limit'는 반환된 @ref{176b,,StreamReader} 인스턴스가 사용하는 버퍼 크기 한계를 결정합니다. 기본적으로 `limit'는 64KiB로 설정됩니다.

나머지 인자는 @ref{817,,loop.create_connection()}로 직접 전달됩니다.

@cartouche
@quotation 참고 
The `sock' argument transfers ownership of the socket to the
@ref{1a70,,StreamWriter} created. To close the socket, call its
@ref{382d,,close()} method.
@end quotation
@end cartouche


버전 3.7에서 변경: `ssl_handshake_timeout' 매개 변수를 추가했습니다.



버전 3.8에서 변경: Added the `happy_eyeballs_delay' and `interleave' parameters.



버전 3.10에서 변경: Removed the `loop' parameter.



버전 3.11에서 변경: `ssl_shutdown_timeout' 매개 변수를 추가했습니다.

@end deffn

@geindex start_server() (asyncio 모듈)
@anchor{library/asyncio-stream asyncio start_server}@anchor{d0e}
@deffn {함수} async asyncio.start_server (client_connected_cb, host=None, port=None, *, limit=None, family=socket.AF_UNSPEC, flags=socket.AI_PASSIVE, sock=None, backlog=100, ssl=None, reuse_address=None, reuse_port=None, keep_alive=None, ssl_handshake_timeout=None, ssl_shutdown_timeout=None, start_serving=True)

소켓 서버를 시작합니다.

새 클라이언트 연결이 만들어질 때마다 `client_connected_cb' 콜백이 호출됩니다. 이 콜백은 두 개의 인자로 @code{(reader, writer)} 쌍을 받는데, @ref{176b,,StreamReader} 와 @ref{1a70,,StreamWriter} 클래스의 인스턴스입니다.

`client_connected_cb'는 일반 콜러블이나 @ref{37e9,,코루틴 함수} 일 수 있습니다; 코루틴 함수면, 자동으로 @ref{1c7,,Task}로 예약됩니다.

`limit'는 반환된 @ref{176b,,StreamReader} 인스턴스가 사용하는 버퍼 크기 한계를 결정합니다. 기본적으로 `limit'는 64KiB로 설정됩니다.

나머지 인자는 @ref{d08,,loop.create_server()}로 직접 전달됩니다.

@cartouche
@quotation 참고 
The `sock' argument transfers ownership of the socket to the
server created. To close the socket, call the server’s
@ref{382e,,close()} method.
@end quotation
@end cartouche


버전 3.7에서 변경: `ssl_handshake_timeout' 와 `start_serving' 매개 변수를 추가했습니다.



버전 3.10에서 변경: Removed the `loop' parameter.



버전 3.11에서 변경: `ssl_shutdown_timeout' 매개 변수를 추가했습니다.



버전 3.13에서 변경: `keep_alive' 매개 변수를 추가했습니다.

@end deffn

@subsubheading 유닉스 소켓


@geindex open_unix_connection() (asyncio 모듈)
@anchor{library/asyncio-stream asyncio open_unix_connection}@anchor{382f}
@deffn {함수} async asyncio.open_unix_connection (path=None, *, limit=None, ssl=None, sock=None, server_hostname=None, ssl_handshake_timeout=None, ssl_shutdown_timeout=None)

유닉스 소켓 연결을 만들고 @code{(reader, writer)} 쌍을 반환합니다.

@ref{d0d,,open_connection()}과 비슷하지만, 유닉스 소켓에서 작동합니다.

@ref{3830,,loop.create_unix_connection()}의 설명서도 참조하십시오.

@cartouche
@quotation 참고 
The `sock' argument transfers ownership of the socket to the
@ref{1a70,,StreamWriter} created. To close the socket, call its
@ref{382d,,close()} method.
@end quotation
@end cartouche

@ref{213c,,가용성}: Unix.


버전 3.7에서 변경: `ssl_handshake_timeout' 매개 변수를 추가했습니다. `path' 매개 변수는 이제 @ref{5a0,,경로류 객체}가 될 수 있습니다.



버전 3.10에서 변경: Removed the `loop' parameter.



버전 3.11에서 변경: `ssl_shutdown_timeout' 매개 변수를 추가했습니다.

@end deffn

@geindex start_unix_server() (asyncio 모듈)
@anchor{library/asyncio-stream asyncio start_unix_server}@anchor{3831}
@deffn {함수} async asyncio.start_unix_server (client_connected_cb, path=None, *, limit=None, sock=None, backlog=100, ssl=None, ssl_handshake_timeout=None, ssl_shutdown_timeout=None, start_serving=True, cleanup_socket=True)

유닉스 소켓 서버를 시작합니다.

@ref{d0e,,start_server()}와 비슷하지만, 유닉스 소켓에서 작동합니다.

If `cleanup_socket' is true then the Unix socket will automatically
be removed from the filesystem when the server is closed, unless the
socket has been replaced after the server has been created.

@ref{4cb,,loop.create_unix_server()}의 설명서도 참조하십시오.

@cartouche
@quotation 참고 
The `sock' argument transfers ownership of the socket to the
server created. To close the socket, call the server’s
@ref{382e,,close()} method.
@end quotation
@end cartouche

@ref{213c,,가용성}: Unix.


버전 3.7에서 변경: `ssl_handshake_timeout' 와 `start_serving' 매개 변수를 추가했습니다. `path' 매개 변수는 이제 @ref{5a0,,경로류 객체}가 될 수 있습니다.



버전 3.10에서 변경: Removed the `loop' parameter.



버전 3.11에서 변경: `ssl_shutdown_timeout' 매개 변수를 추가했습니다.



버전 3.13에서 변경: Added the `cleanup_socket' parameter.

@end deffn

@menu
* StreamReader:: 
* StreamWriter:: 
* 예제: 예제<13>. 

@end menu

@node StreamReader,StreamWriter,,스트림
@anchor{library/asyncio-stream streamreader}@anchor{3832}
@subsubsection StreamReader


@geindex StreamReader (asyncio 클래스)
@anchor{library/asyncio-stream asyncio StreamReader}@anchor{176b}
@deffn {클래스} asyncio.StreamReader

IO 스트림에서 데이터를 읽는 API를 제공하는 판독기(reader) 객체를 나타냅니다. @ref{f73,,비동기 이터러블}로서, 객체는 @ref{c9f,,async for} 문을 지원합니다.

`StreamReader' 객체를 직접 인스턴스로 만드는 것은 권장되지 않습니다. 대신 @ref{d0d,,open_connection()}과 @ref{d0e,,start_server()}를 사용하십시오.

@geindex feed_eof() (asyncio.StreamReader 메서드)
@anchor{library/asyncio-stream asyncio StreamReader feed_eof}@anchor{3833}
@deffn {메서드} feed_eof ()

Acknowledge the EOF.
@end deffn

@geindex read() (asyncio.StreamReader 메서드)
@anchor{library/asyncio-stream asyncio StreamReader read}@anchor{3834}
@deffn {메서드} async read (n=-1)

Read up to `n' bytes from the stream.

`n'이 제공되지 않거나 @code{-1}로 설정되면, EOF까지 읽은 다음, 모든 읽어들인 @ref{192,,bytes}를 반환합니다. EOF를 수신했고 내부 버퍼가 비어 있으면, 빈 @code{bytes} 객체를 반환합니다.

If `n' is @code{0}, return an empty @code{bytes} object immediately.

If `n' is positive, return at most `n' available @code{bytes}
as soon as at least 1 byte is available in the internal buffer.
If EOF is received before any byte is read, return an empty
@code{bytes} object.
@end deffn

@geindex readline() (asyncio.StreamReader 메서드)
@anchor{library/asyncio-stream asyncio StreamReader readline}@anchor{3835}
@deffn {메서드} async readline ()

한 줄을 읽습니다. 여기서 “줄”은 @code{\n}로 끝나는 바이트의 시퀀스입니다.

EOF를 수신했고, @code{\n}를 찾을 수 없으면, 이 메서드는 부분적으로 읽은 데이터를 반환합니다.

EOF를 수신했고, 내부 버퍼가 비어 있으면 빈 @code{bytes} 객체를 반환합니다.
@end deffn

@geindex readexactly() (asyncio.StreamReader 메서드)
@anchor{library/asyncio-stream asyncio StreamReader readexactly}@anchor{e75}
@deffn {메서드} async readexactly (n)

정확히 `n' 바이트를 읽습니다.

`n' 바이트를 읽기 전에 EOF에 도달하면, @ref{1ce5,,IncompleteReadError}를 일으킵니다. 부분적으로 읽은 데이터를 가져오려면 @ref{3836,,IncompleteReadError.partial} 어트리뷰트를 사용하십시오.
@end deffn

@geindex readuntil() (asyncio.StreamReader 메서드)
@anchor{library/asyncio-stream asyncio StreamReader readuntil}@anchor{4d1}
@deffn {메서드} async readuntil (separator=b'\n')

`separator'가 발견될 때까지 스트림에서 데이터를 읽습니다.

성공하면, 데이터와 separator가 내부 버퍼에서 제거됩니다 (소비됩니다). 반환된 데이터에는 끝에 separator가 포함됩니다.

읽은 데이터의 양이 구성된 스트림 제한을 초과하면 @ref{3837,,LimitOverrunError} 예외가 발생하고, 데이터는 내부 버퍼에 그대로 남아 있으며 다시 읽을 수 있습니다.

완전한 separator가 발견되기 전에 EOF에 도달하면 @ref{1ce5,,IncompleteReadError} 예외가 발생하고, 내부 버퍼가 재설정됩니다. @ref{3836,,IncompleteReadError.partial} 어트리뷰트에는 separator 일부가 포함될 수 있습니다.

The `separator' may also be a tuple of separators. In this
case the return value will be the shortest possible that has any
separator as the suffix. For the purposes of @ref{3837,,LimitOverrunError},
the shortest possible separator is considered to be the one that
matched.


Added in version 3.5.2.



버전 3.13에서 변경: `separator' 매개 변수는 이제 구분자들의 @ref{610,,tuple}일 수 있습니다.

@end deffn

@geindex at_eof() (asyncio.StreamReader 메서드)
@anchor{library/asyncio-stream asyncio StreamReader at_eof}@anchor{3838}
@deffn {메서드} at_eof ()

버퍼가 비어 있고 @ref{3833,,feed_eof()}가 호출되었으면 @code{True}를 반환합니다.
@end deffn
@end deffn

@node StreamWriter,예제<13>,StreamReader,스트림
@anchor{library/asyncio-stream streamwriter}@anchor{3839}
@subsubsection StreamWriter


@geindex StreamWriter (asyncio 클래스)
@anchor{library/asyncio-stream asyncio StreamWriter}@anchor{1a70}
@deffn {클래스} asyncio.StreamWriter

IO 스트림에 데이터를 쓰는 API를 제공하는 기록기(writer) 객체를 나타냅니다.

`StreamWriter' 객체를 직접 인스턴스로 만드는 것은 권장되지 않습니다. 대신 @ref{d0d,,open_connection()}과 @ref{d0e,,start_server()}를 사용하십시오.

@geindex write() (asyncio.StreamWriter 메서드)
@anchor{library/asyncio-stream asyncio StreamWriter write}@anchor{383a}
@deffn {메서드} write (data)

이 메서드는 하부 소켓에 `data'를 즉시 기록하려고 시도합니다. 실패하면, data는 보낼 수 있을 때까지 내부 쓰기 버퍼에 계류됩니다.

The `data' buffer should be a bytes, bytearray, or C-contiguous one-dimensional
memoryview object.

이 메서드는 @code{drain()} 메서드와 함께 사용해야 합니다:

@example
stream.write(data)
await stream.drain()
@end example
@end deffn

@geindex writelines() (asyncio.StreamWriter 메서드)
@anchor{library/asyncio-stream asyncio StreamWriter writelines}@anchor{383b}
@deffn {메서드} writelines (data)

이 메서드는 하부 소켓에 바이트열의 리스트(또는 임의의 이터러블)를 즉시 기록합니다. 실패하면, data는 보낼 수 있을 때까지 내부 쓰기 버퍼에 계류됩니다.

이 메서드는 @code{drain()} 메서드와 함께 사용해야 합니다:

@example
stream.writelines(lines)
await stream.drain()
@end example
@end deffn

@geindex close() (asyncio.StreamWriter 메서드)
@anchor{library/asyncio-stream asyncio StreamWriter close}@anchor{382d}
@deffn {메서드} close ()

이 메서드는 스트림과 하부 소켓을 닫습니다.

이 메서드는 필수는 아니지만 @code{wait_closed()} 메서드와 함께 사용해야 합니다:

@example
stream.close()
await stream.wait_closed()
@end example
@end deffn

@geindex can_write_eof() (asyncio.StreamWriter 메서드)
@anchor{library/asyncio-stream asyncio StreamWriter can_write_eof}@anchor{383c}
@deffn {메서드} can_write_eof ()

하부 트랜스포트가 @ref{383d,,write_eof()} 메서드를 지원하면 @code{True}를 반환하고, 그렇지 않으면 @code{False}를 반환합니다.
@end deffn

@geindex write_eof() (asyncio.StreamWriter 메서드)
@anchor{library/asyncio-stream asyncio StreamWriter write_eof}@anchor{383d}
@deffn {메서드} write_eof ()

버퍼링 된 쓰기 데이터가 플러시 된 후에 스트림의 쓰기 끝을 닫습니다.
@end deffn

@geindex transport (asyncio.StreamWriter의 속성)
@anchor{library/asyncio-stream asyncio StreamWriter transport}@anchor{383e}
@deffn {속성} transport

하부 asyncio 트랜스포트를 돌려줍니다.
@end deffn

@geindex get_extra_info() (asyncio.StreamWriter 메서드)
@anchor{library/asyncio-stream asyncio StreamWriter get_extra_info}@anchor{383f}
@deffn {메서드} get_extra_info (name, default=None)

선택적 트랜스포트 정보에 액세스합니다; 자세한 내용은 @ref{c92,,BaseTransport.get_extra_info()}를 참조하십시오.
@end deffn

@geindex drain() (asyncio.StreamWriter 메서드)
@anchor{library/asyncio-stream asyncio StreamWriter drain}@anchor{1b27}
@deffn {메서드} async drain ()

스트림에 기록을 다시 시작하는 것이 적절할 때까지 기다립니다. 예:

@example
writer.write(data)
await writer.drain()
@end example

이것은 하부 IO 쓰기 버퍼와 상호 작용하는 흐름 제어 메서드입니다. 버퍼의 크기가 높은 수위에 도달하면, 버퍼 크기가 낮은 수위까지 내려가서 쓰기가 다시 시작될 수 있을 때까지 `drain()'은 블록합니다. 기다릴 것이 없으면, @ref{1b27,,drain()}은 즉시 반환합니다.
@end deffn

@geindex start_tls() (asyncio.StreamWriter 메서드)
@anchor{library/asyncio-stream asyncio StreamWriter start_tls}@anchor{818}
@deffn {메서드} async start_tls (sslcontext, *, server_hostname=None, ssl_handshake_timeout=None, ssl_shutdown_timeout=None)

Upgrade an existing stream-based connection to TLS.

Parameters:


@itemize *

@item 
`sslcontext': a configured instance of @ref{357,,SSLContext}.

@item 
`server_hostname': sets or overrides the host name that the target
server’s certificate will be matched against.

@item 
`ssl_handshake_timeout' is the time in seconds to wait for the TLS
handshake to complete before aborting the connection.  @code{60.0} seconds
if @code{None} (default).

@item 
`ssl_shutdown_timeout' is the time in seconds to wait for the SSL shutdown
to complete before aborting the connection. @code{30.0} seconds if @code{None}
(default).
@end itemize


Added in version 3.11.



버전 3.12에서 변경: `ssl_shutdown_timeout' 매개 변수를 추가했습니다.

@end deffn

@geindex is_closing() (asyncio.StreamWriter 메서드)
@anchor{library/asyncio-stream asyncio StreamWriter is_closing}@anchor{d02}
@deffn {메서드} is_closing ()

스트림이 닫혔거나 닫히고 있으면 @code{True}를 반환합니다.


Added in version 3.7.

@end deffn

@geindex wait_closed() (asyncio.StreamWriter 메서드)
@anchor{library/asyncio-stream asyncio StreamWriter wait_closed}@anchor{d01}
@deffn {메서드} async wait_closed ()

스트림이 닫힐 때까지 기다립니다.

가령 프로그램 종료 전에 모든 데이터가 플러시되었음을 확인하기위해, 하부 연결이 닫힐 때까지 기다리려면 @ref{382d,,close()} 뒤에 호출해야 합니다.


Added in version 3.7.

@end deffn
@end deffn

@node 예제<13>,,StreamWriter,스트림
@anchor{library/asyncio-stream examples}@anchor{382c}
@subsubsection 예제


@menu
* 스트림을 사용하는 TCP 메아리 클라이언트:: 
* 스트림을 사용하는 TCP 메아리 서버:: 
* HTTP 헤더 가져오기:: 
* 스트림을 사용하여 데이터를 기다리는 열린 소켓 등록:: 

@end menu

@node 스트림을 사용하는 TCP 메아리 클라이언트,스트림을 사용하는 TCP 메아리 서버,,예제<13>
@anchor{library/asyncio-stream asyncio-tcp-echo-client-streams}@anchor{3840}@anchor{library/asyncio-stream tcp-echo-client-using-streams}@anchor{3841}
@subsubsection 스트림을 사용하는 TCP 메아리 클라이언트


@ref{d0d,,asyncio.open_connection()} 함수를 사용하는 TCP 메아리 클라이언트:

@example
import asyncio

async def tcp_echo_client(message):
    reader, writer = await asyncio.open_connection(
        '127.0.0.1', 8888)

    print(f'Send: @{message!r@}')
    writer.write(message.encode())
    await writer.drain()

    data = await reader.read(100)
    print(f'Received: @{data.decode()!r@}')

    print('Close the connection')
    writer.close()
    await writer.wait_closed()

asyncio.run(tcp_echo_client('Hello World!'))
@end example


@subsubheading 더 보기


@ref{3842,,TCP 메아리 클라이언트 프로토콜} 예제는 저수준 @ref{817,,loop.create_connection()} 메서드를 사용합니다.


@node 스트림을 사용하는 TCP 메아리 서버,HTTP 헤더 가져오기,스트림을 사용하는 TCP 메아리 클라이언트,예제<13>
@anchor{library/asyncio-stream asyncio-tcp-echo-server-streams}@anchor{3843}@anchor{library/asyncio-stream tcp-echo-server-using-streams}@anchor{3844}
@subsubsection 스트림을 사용하는 TCP 메아리 서버


@ref{d0e,,asyncio.start_server()} 함수를 사용하는 TCP 메아리 서버:

@example
import asyncio

async def handle_echo(reader, writer):
    data = await reader.read(100)
    message = data.decode()
    addr = writer.get_extra_info('peername')

    print(f"Received @{message!r@} from @{addr!r@}")

    print(f"Send: @{message!r@}")
    writer.write(data)
    await writer.drain()

    print("Close the connection")
    writer.close()
    await writer.wait_closed()

async def main():
    server = await asyncio.start_server(
        handle_echo, '127.0.0.1', 8888)

    addrs = ', '.join(str(sock.getsockname()) for sock in server.sockets)
    print(f'Serving on @{addrs@}')

    async with server:
        await server.serve_forever()

asyncio.run(main())
@end example


@subsubheading 더 보기


@ref{3845,,TCP 메아리 서버 프로토콜} 예제는 @ref{d08,,loop.create_server()} 메서드를 사용합니다.


@node HTTP 헤더 가져오기,스트림을 사용하여 데이터를 기다리는 열린 소켓 등록,스트림을 사용하는 TCP 메아리 서버,예제<13>
@anchor{library/asyncio-stream get-http-headers}@anchor{3846}
@subsubsection HTTP 헤더 가져오기


명령 줄로 전달된 URL의 HTTP 헤더를 조회하는 간단한 예제:

@example
import asyncio
import urllib.parse
import sys

async def print_http_headers(url):
    url = urllib.parse.urlsplit(url)
    if url.scheme == 'https':
        reader, writer = await asyncio.open_connection(
            url.hostname, 443, ssl=True)
    else:
        reader, writer = await asyncio.open_connection(
            url.hostname, 80)

    query = (
        f"HEAD @{url.path or '/'@} HTTP/1.0\r\n"
        f"Host: @{url.hostname@}\r\n"
        f"\r\n"
    )

    writer.write(query.encode('latin-1'))
    while True:
        line = await reader.readline()
        if not line:
            break

        line = line.decode('latin1').rstrip()
        if line:
            print(f'HTTP header> @{line@}')

    # 바디를 무시하고, 소켓을 닫습니다
    writer.close()
    await writer.wait_closed()

url = sys.argv[1]
asyncio.run(print_http_headers(url))
@end example

사용법:

@example
python example.py http://example.com/path/page.html
@end example

또는 HTTPS를 사용하면:

@example
python example.py https://example.com/path/page.html
@end example

@node 스트림을 사용하여 데이터를 기다리는 열린 소켓 등록,,HTTP 헤더 가져오기,예제<13>
@anchor{library/asyncio-stream asyncio-example-create-connection-streams}@anchor{3847}@anchor{library/asyncio-stream register-an-open-socket-to-wait-for-data-using-streams}@anchor{3848}
@subsubsection 스트림을 사용하여 데이터를 기다리는 열린 소켓 등록


@ref{d0d,,open_connection()} 함수를 사용하여 소켓이 데이터를 수신할 때까지 기다리는 코루틴:

@example
import asyncio
import socket

async def wait_for_data():
    # 저수준 API에 액세스하기 위해 현재 이벤트 루프에 대한 참조를 가져옵니다.
    loop = asyncio.get_running_loop()

    # 연결된 소켓 쌍을 만듭니다.
    rsock, wsock = socket.socketpair()

    # 데이터를 기다리는 열린 소켓을 등록합니다.
    reader, writer = await asyncio.open_connection(sock=rsock)

    # 네트워크로부터의 데이터 수신을 시뮬레이션합니다
    loop.call_soon(wsock.send, 'abc'.encode())

    # 데이터를 기다립니다
    data = await reader.read(100)

    # 데이터를 받았습니다, 할 일을 마쳤습니다: 소켓을 닫습니다.
    print("Received:", data.decode())
    writer.close()
    await writer.wait_closed()

    # 두 번째 소켓을 닫습니다
    wsock.close()

asyncio.run(wait_for_data())
@end example


@subsubheading 더 보기


@ref{3849,,프로토콜을 사용하여 데이터를 기다리는 열린 소켓 등록} 예제는 저수준 프로토콜과 @ref{817,,loop.create_connection()} 메서드를 사용합니다.

@ref{384a,,파일 기술자에서 읽기 이벤트를 관찰하기} 예제는 저수준 @ref{384b,,loop.add_reader()} 메서드를 사용하여 파일 기술자를 관찰합니다.


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 동기화 프리미티브<2>,서브 프로세스,스트림,asyncio — 비동기 I/O
@anchor{library/asyncio-sync doc}@anchor{384c}@anchor{library/asyncio-sync asyncio-sync}@anchor{37ed}@anchor{library/asyncio-sync synchronization-primitives}@anchor{384d}@anchor{library/asyncio-sync translation-repo}@anchor{384e}
@subsubsection 동기화 프리미티브


`소스 코드:' Lib/asyncio/locks.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/asyncio/locks.py}


__________________________________________________________________


asyncio 동기화 프리미티브는 @ref{f3,,threading} 모듈의 것과 유사하도록 설계되었습니다만 두 가지 중요한 주의 사항이 있습니다:


@itemize *

@item 
asyncio 프리미티브는 스레드 안전하지 않으므로, OS 스레드 동기화(이를 위해서는 @ref{f3,,threading}을 사용하십시오)에 사용하면 안 됩니다.

@item 
이러한 동기화 프리미티브의 메서드는 `timeout' 인자를 받아들이지 않습니다; @ref{814,,asyncio.wait_for()} 함수를 사용하여 시간제한이 있는 연산을 수행하십시오.
@end itemize

asyncio에는 다음과 같은 기본 동기화 프리미티브가 있습니다:


@itemize *

@item 
@ref{c65,,Lock}

@item 
@ref{2f4,,Event}

@item 
@ref{c66,,Condition}

@item 
@ref{c67,,Semaphore}

@item 
@ref{c68,,BoundedSemaphore}

@item 
@ref{815,,Barrier}
@end itemize


__________________________________________________________________


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

@end menu

@node Lock,Event,,동기화 프리미티브<2>
@anchor{library/asyncio-sync lock}@anchor{384f}
@subsubsection Lock


@geindex Lock (asyncio 클래스)
@anchor{library/asyncio-sync asyncio Lock}@anchor{c65}
@deffn {클래스} asyncio.Lock

asyncio 태스크를 위한 뮤텍스 록을 구현합니다. 스레드 안전하지 않습니다.

asyncio 록은 공유 자원에 대한 독점 액세스를 보장하는 데 사용될 수 있습니다.

Lock을 사용하는 가장 좋은 방법은 @ref{185,,async with} 문입니다:

@example
lock = asyncio.Lock()

# ... 나중에
async with lock:
    # 공유 상태를 액세스합니다
@end example

이는 다음과 동등합니다:

@example
lock = asyncio.Lock()

# ... 나중에
await lock.acquire()
try:
    # 공유 상태를 액세스합니다
finally:
    lock.release()
@end example


버전 3.10에서 변경: `loop' 매개 변수를 제거했습니다.


@geindex acquire() (asyncio.Lock 메서드)
@anchor{library/asyncio-sync asyncio Lock acquire}@anchor{3850}
@deffn {메서드} async acquire ()

록을 얻습니다.

이 메서드는 록이 `풀림(unlocked)'이 될 때까지 기다리고, `잠김(locked)'으로 설정한 다음 @code{True}를 반환합니다.

잠금이 해제되기를 기다리는 @ref{3850,,acquire()}에서 둘 이상의 코루틴 블록 될 때, 결국 한 개의 코루틴만 진행됩니다.

록을 얻는 것은 `공평(fair)'합니다: 진행할 코루틴은 록을 기다리기 시작한 첫 번째 코루틴이 됩니다.
@end deffn

@geindex release() (asyncio.Lock 메서드)
@anchor{library/asyncio-sync asyncio Lock release}@anchor{3851}
@deffn {메서드} release ()

록을 반납합니다.

록이 `잠김(locked)'이면 `풀림(unlocked)'으로 재설정하고 돌아옵니다.

록이 `풀림(unlocked)'이면 @ref{244,,RuntimeError}가 발생합니다.
@end deffn

@geindex locked() (asyncio.Lock 메서드)
@anchor{library/asyncio-sync asyncio Lock locked}@anchor{3852}
@deffn {메서드} locked ()

록이 `잠김(locked)'이면 @code{True}를 반환합니다.
@end deffn
@end deffn

@node Event,Condition,Lock,동기화 프리미티브<2>
@anchor{library/asyncio-sync event}@anchor{3853}
@subsubsection Event


@geindex Event (asyncio 클래스)
@anchor{library/asyncio-sync asyncio Event}@anchor{2f4}
@deffn {클래스} asyncio.Event

이벤트 객체. 스레드 안전하지 않습니다.

asyncio 이벤트는 어떤 이벤트가 발생했음을 여러 asyncio 태스크에 알리는 데 사용할 수 있습니다.

Event 객체는 @ref{3854,,set()} 메서드로 `참'으로 설정하고 @ref{3855,,clear()} 메서드로 `거짓'으로 재설정할 수 있는 내부 플래그를 관리합니다. @ref{3856,,wait()} 메서드는 플래그가 `참'으로 설정될 때까지 블록합니다. 플래그는 초기에 `거짓'으로 설정됩니다.


버전 3.10에서 변경: `loop' 매개 변수를 제거했습니다.

@anchor{library/asyncio-sync asyncio-example-sync-event}@anchor{3857}
예:

@example
async def waiter(event):
    print('waiting for it ...')
    await event.wait()
    print('... got it!')

async def main():
    # Event 객체를 만듭니다.
    event = asyncio.Event()

    # 'event'가 설정될 때까지 대기 할 Task를 만듭니다.
    waiter_task = asyncio.create_task(waiter(event))

    # 1초 동안 잠잔 후에 event를 설정합니다.
    await asyncio.sleep(1)
    event.set()

    # waiter 태스크가 끝날 때까지 기다립니다.
    await waiter_task

asyncio.run(main())
@end example

@geindex wait() (asyncio.Event 메서드)
@anchor{library/asyncio-sync asyncio Event wait}@anchor{3856}
@deffn {메서드} async wait ()

이벤트가 설정될 때까지 기다립니다.

이벤트가 설정되었으면 @code{True}를 즉시 반환합니다. 그렇지 않으면 다른 태스크가 @ref{3854,,set()}을 호출할 때까지 블록합니다.
@end deffn

@geindex set() (asyncio.Event 메서드)
@anchor{library/asyncio-sync asyncio Event set}@anchor{3854}
@deffn {메서드} set ()

이벤트를 설정합니다.

이벤트가 설정되기를 기다리는 모든 태스크는 즉시 깨어납니다.
@end deffn

@geindex clear() (asyncio.Event 메서드)
@anchor{library/asyncio-sync asyncio Event clear}@anchor{3855}
@deffn {메서드} clear ()

이벤트를 지웁니다 (재설정).

Subsequent tasks awaiting on @ref{3856,,wait()} will now block until the
@ref{3854,,set()} method is called again.
@end deffn

@geindex is_set() (asyncio.Event 메서드)
@anchor{library/asyncio-sync asyncio Event is_set}@anchor{3858}
@deffn {메서드} is_set ()

이벤트가 설정되면 @code{True}를 반환합니다.
@end deffn
@end deffn

@node Condition,Semaphore,Event,동기화 프리미티브<2>
@anchor{library/asyncio-sync condition}@anchor{3859}
@subsubsection Condition


@geindex Condition (asyncio 클래스)
@anchor{library/asyncio-sync asyncio Condition}@anchor{c66}
@deffn {클래스} asyncio.Condition (lock=None)

Condition 객체. 스레드 안전하지 않습니다.

asyncio 조건 프리미티브는 태스크가 어떤 이벤트가 발생하기를 기다린 다음 공유 자원에 독점적으로 액세스하는데 사용할 수 있습니다.

본질에서, Condition 객체는 @ref{2f4,,Event}와 @ref{c65,,Lock}의 기능을 결합합니다. 여러 개의 Condition 객체가 하나의 Lock을 공유할 수 있으므로, 공유 자원의 특정 상태에 관심이 있는 다른 태스크 간에 공유 자원에 대한 독점적 액세스를 조정할 수 있습니다.

선택적 `lock' 인자는 @ref{c65,,Lock} 객체나 @code{None} 이어야 합니다. 후자의 경우 새로운 Lock 객체가 자동으로 만들어집니다.


버전 3.10에서 변경: `loop' 매개 변수를 제거했습니다.


Condition을 사용하는 가장 좋은 방법은 @ref{185,,async with} 문입니다:

@example
cond = asyncio.Condition()

# ... 나중에
async with cond:
    await cond.wait()
@end example

이는 다음과 동등합니다:

@example
cond = asyncio.Condition()

# ... 나중에
await cond.acquire()
try:
    await cond.wait()
finally:
    cond.release()
@end example

@geindex acquire() (asyncio.Condition 메서드)
@anchor{library/asyncio-sync asyncio Condition acquire}@anchor{385a}
@deffn {메서드} async acquire ()

하부 록을 얻습니다.

이 메서드는 하부 록이 `풀림(unlocked)'이 될 때까지 대기하고, `잠김(locked)'으로 설정한 다음 @code{True}를 반환합니다.
@end deffn

@geindex notify() (asyncio.Condition 메서드)
@anchor{library/asyncio-sync asyncio Condition notify}@anchor{19f7}
@deffn {메서드} notify (n=1)

이 조건을 기다리는 `n' 태스크(기본적으로 1개)를 깨웁니다. 대기 중인 태스크가 `n' 개 보다 작으면 모두 깨어납니다.

이 메서드를 호출하기 전에 록을 얻어야 하고, 호출 직후에 반납해야 합니다. `풀린(unlocked)' 록으로 호출하면 @ref{244,,RuntimeError} 에러가 발생합니다.
@end deffn

@geindex locked() (asyncio.Condition 메서드)
@anchor{library/asyncio-sync asyncio Condition locked}@anchor{385b}
@deffn {메서드} locked ()

하부 록을 얻었으면 @code{True}를 돌려줍니다.
@end deffn

@geindex notify_all() (asyncio.Condition 메서드)
@anchor{library/asyncio-sync asyncio Condition notify_all}@anchor{385c}
@deffn {메서드} notify_all ()

이 조건에 대기 중인 모든 태스크를 깨웁니다.

이 메서드는 @ref{19f7,,notify()}처럼 작동하지만, 대기 중인 모든 태스크를 깨웁니다.

이 메서드를 호출하기 전에 록을 얻어야 하고, 호출 직후에 반납해야 합니다. `풀린(unlocked)' 록으로 호출하면 @ref{244,,RuntimeError} 에러가 발생합니다.
@end deffn

@geindex release() (asyncio.Condition 메서드)
@anchor{library/asyncio-sync asyncio Condition release}@anchor{385d}
@deffn {메서드} release ()

하부 록을 반납합니다.

풀린 록으로 호출하면, @ref{244,,RuntimeError}가 발생합니다.
@end deffn

@geindex wait() (asyncio.Condition 메서드)
@anchor{library/asyncio-sync asyncio Condition wait}@anchor{1a20}
@deffn {메서드} async wait ()

알릴 때까지 기다립니다.

이 메서드가 호출될 때 호출하는 태스크가 록을 얻지 않았으면 @ref{244,,RuntimeError}가 발생합니다.

이 메서드는 하부 잠금을 반납한 다음, @ref{19f7,,notify()} 나 @ref{385c,,notify_all()} 호출 때문에 깨어날 때까지 블록합니다. 일단 깨어나면, Condition은 록을 다시 얻고, 이 메서드는 @code{True}를 돌려줍니다.

Note that a task `may' return from this call spuriously,
which is why the caller should always re-check the state
and be prepared to @code{wait()} again. For this reason, you may
prefer to use @ref{385e,,wait_for()} instead.
@end deffn

@geindex wait_for() (asyncio.Condition 메서드)
@anchor{library/asyncio-sync asyncio Condition wait_for}@anchor{385e}
@deffn {메서드} async wait_for (predicate)

predicate가 `참'이 될 때까지 기다립니다.

predicate는 논릿값으로 해석될 결과를 돌려주는 콜러블이어야 합니다. 메서드는 predicate가 `참'으로 평가될 때까지 반복적으로 @ref{1a20,,wait()}합니다. 최종값이 반환 값입니다.
@end deffn
@end deffn

@node Semaphore,BoundedSemaphore,Condition,동기화 프리미티브<2>
@anchor{library/asyncio-sync semaphore}@anchor{385f}
@subsubsection Semaphore


@geindex Semaphore (asyncio 클래스)
@anchor{library/asyncio-sync asyncio Semaphore}@anchor{c67}
@deffn {클래스} asyncio.Semaphore (value=1)

Semaphore 객체. 스레드 안전하지 않습니다.

세마포어는 각 @ref{1a21,,acquire()} 호출로 감소하고, 각 @ref{3860,,release()} 호출로 증가하는 내부 카운터를 관리합니다. 카운터는 절대로 0 밑으로 내려갈 수 없습니다; @code{acquire()}가 0을 만나면, @code{release()}를 호출할 때까지 기다리면서 블록합니다.

선택적 `value' 인자는 내부 카운터의 초깃값을 제공합니다 (기본적으로 @code{1}). 지정된 값이 @code{0}보다 작으면 @ref{2ec,,ValueError}가 발생합니다.


버전 3.10에서 변경: `loop' 매개 변수를 제거했습니다.


Semaphore를 사용하는 가장 좋은 방법은 @ref{185,,async with} 문입니다:

@example
sem = asyncio.Semaphore(10)

# ... 나중에
async with sem:
    # 공유 자원으로 작업합니다
@end example

이는 다음과 동등합니다:

@example
sem = asyncio.Semaphore(10)

# ... 나중에
await sem.acquire()
try:
    # 공유 자원으로 작업합니다
finally:
    sem.release()
@end example

@geindex acquire() (asyncio.Semaphore 메서드)
@anchor{library/asyncio-sync asyncio Semaphore acquire}@anchor{1a21}
@deffn {메서드} async acquire ()

세마포어를 얻습니다.

내부 카운터가 0보다 크면, 1 감소시키고 @code{True}를 즉시 반환합니다. 0이면, @ref{3860,,release()}가 호출될 때까지 기다린 다음 @code{True}를 반환합니다.
@end deffn

@geindex locked() (asyncio.Semaphore 메서드)
@anchor{library/asyncio-sync asyncio Semaphore locked}@anchor{3861}
@deffn {메서드} locked ()

세마포어를 즉시 얻을 수 없으면 @code{True}를 반환합니다.
@end deffn

@geindex release() (asyncio.Semaphore 메서드)
@anchor{library/asyncio-sync asyncio Semaphore release}@anchor{3860}
@deffn {메서드} release ()

세마포어를 반납하고 내부 카운터를 1 증가시킵니다. 세마포어를 얻기 위해 대기하는 태스크를 깨울 수 있습니다.

@ref{c68,,BoundedSemaphore}와 달리, @ref{c67,,Semaphore}는 @code{acquire()} 호출보다 더 많은 @code{release()} 호출을 허용합니다.
@end deffn
@end deffn

@node BoundedSemaphore,Barrier,Semaphore,동기화 프리미티브<2>
@anchor{library/asyncio-sync boundedsemaphore}@anchor{3862}
@subsubsection BoundedSemaphore


@geindex BoundedSemaphore (asyncio 클래스)
@anchor{library/asyncio-sync asyncio BoundedSemaphore}@anchor{c68}
@deffn {클래스} asyncio.BoundedSemaphore (value=1)

제한된 세마포어 객체. 스레드 안전하지 않습니다.

제한된 세마포어는 초기 `value' 위로 내부 카운터를 증가시키면 @ref{3860,,release()}에서 @ref{2ec,,ValueError}를 발생시키는 @ref{c67,,Semaphore} 버전입니다.


버전 3.10에서 변경: `loop' 매개 변수를 제거했습니다.

@end deffn

@node Barrier,,BoundedSemaphore,동기화 프리미티브<2>
@anchor{library/asyncio-sync barrier}@anchor{3863}
@subsubsection Barrier


@geindex Barrier (asyncio 클래스)
@anchor{library/asyncio-sync asyncio Barrier}@anchor{815}
@deffn {클래스} asyncio.Barrier (parties)

장벽 객체. 스레드 안전하지 않습니다.

A barrier is a simple synchronization primitive that allows to block until
`parties' number of tasks are waiting on it.
Tasks can wait on the @ref{3864,,wait()} method and would be blocked until
the specified number of tasks end up waiting on @code{wait()}.
At that point all of the waiting tasks would unblock simultaneously.

@ref{185,,async with} can be used as an alternative to awaiting on
@ref{3864,,wait()}.

The barrier can be reused any number of times.
@anchor{library/asyncio-sync asyncio-example-barrier}@anchor{3865}
예:

@example
async def example_barrier():
   # 3자 간 장벽
   b = asyncio.Barrier(3)

   # 기다리는 태스크를 2개 만듭니다
   asyncio.create_task(b.wait())
   asyncio.create_task(b.wait())

   await asyncio.sleep(0)
   print(b)

   # 세 번째 .wait() 호출은 장벽을 통과합니다
   await b.wait()
   print(b)
   print("barrier passed")

   await asyncio.sleep(0)
   print(b)

asyncio.run(example_barrier())
@end example

Result of this example is:

@example
<asyncio.locks.Barrier object at 0x... [filling, waiters:2/3]>
<asyncio.locks.Barrier object at 0x... [draining, waiters:0/3]>
barrier passed
<asyncio.locks.Barrier object at 0x... [filling, waiters:0/3]>
@end example


Added in version 3.11.


@geindex wait() (asyncio.Barrier 메서드)
@anchor{library/asyncio-sync asyncio Barrier wait}@anchor{3864}
@deffn {메서드} async wait ()

Pass the barrier. When all the tasks party to the barrier have called
this function, they are all unblocked simultaneously.

When a waiting or blocked task in the barrier is cancelled,
this task exits the barrier which stays in the same state.
If the state of the barrier is “filling”, the number of waiting task
decreases by 1.

The return value is an integer in the range of 0 to @code{parties-1}, different
for each task. This can be used to select a task to do some special
housekeeping, e.g.:

@example
...
async with barrier as position:
   if position == 0:
      # 오직 한 태스크만 이것을 인쇄합니다
      print('End of *draining phase*')
@end example

This method may raise a @ref{816,,BrokenBarrierError} exception if the
barrier is broken or reset while a task is waiting.
It could raise a @ref{4d5,,CancelledError} if a task is cancelled.
@end deffn

@geindex reset() (asyncio.Barrier 메서드)
@anchor{library/asyncio-sync asyncio Barrier reset}@anchor{3866}
@deffn {메서드} async reset ()

Return the barrier to the default, empty state.  Any tasks waiting on it
will receive the @ref{816,,BrokenBarrierError} exception.

If a barrier is broken it may be better to just leave it and create a new one.
@end deffn

@geindex abort() (asyncio.Barrier 메서드)
@anchor{library/asyncio-sync asyncio Barrier abort}@anchor{3867}
@deffn {메서드} async abort ()

Put the barrier into a broken state.  This causes any active or future
calls to @ref{3864,,wait()} to fail with the @ref{816,,BrokenBarrierError}.
Use this for example if one of the tasks needs to abort, to avoid infinite
waiting tasks.
@end deffn

@geindex parties (asyncio.Barrier의 속성)
@anchor{library/asyncio-sync asyncio Barrier parties}@anchor{3868}
@deffn {속성} parties

The number of tasks required to pass the barrier.
@end deffn

@geindex n_waiting (asyncio.Barrier의 속성)
@anchor{library/asyncio-sync asyncio Barrier n_waiting}@anchor{3869}
@deffn {속성} n_waiting

The number of tasks currently waiting in the barrier while filling.
@end deffn

@geindex broken (asyncio.Barrier의 속성)
@anchor{library/asyncio-sync asyncio Barrier broken}@anchor{386a}
@deffn {속성} broken

A boolean that is @code{True} if the barrier is in the broken state.
@end deffn
@end deffn

@geindex BrokenBarrierError
@anchor{library/asyncio-sync asyncio BrokenBarrierError}@anchor{816}
@deffn {예외} asyncio.BrokenBarrierError

This exception, a subclass of @ref{244,,RuntimeError}, is raised when the
@ref{815,,Barrier} object is reset or broken.
@end deffn


__________________________________________________________________



버전 3.9에서 변경: @code{await lock} 이나 @code{yield from lock} 및/또는 @ref{186,,with} 문(@code{with await lock}, @code{with (yield from lock)})을 사용하여 록을 얻는 것은 제거되었습니다. 대신 @code{async with lock}을 사용하십시오.


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 서브 프로세스,큐,동기화 프리미티브<2>,asyncio — 비동기 I/O
@anchor{library/asyncio-subprocess doc}@anchor{386b}@anchor{library/asyncio-subprocess asyncio-subprocess}@anchor{37eb}@anchor{library/asyncio-subprocess subprocesses}@anchor{386c}@anchor{library/asyncio-subprocess translation-repo}@anchor{386d}
@subsubsection 서브 프로세스


`소스 코드:' Lib/asyncio/subprocess.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/asyncio/subprocess.py}, Lib/asyncio/base_subprocess.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/asyncio/base_subprocess.py}


__________________________________________________________________


이 절에서는 서브 프로세스를 만들고 관리하기 위한 고수준 async/await asyncio API에 관해 설명합니다.
@anchor{library/asyncio-subprocess asyncio-example-subprocess-shell}@anchor{386e}
다음은 asyncio가 셸 명령을 실행하고 결과를 얻는 방법의 예입니다:

@example
import asyncio

async def run(cmd):
    proc = await asyncio.create_subprocess_shell(
        cmd,
        stdout=asyncio.subprocess.PIPE,
        stderr=asyncio.subprocess.PIPE)

    stdout, stderr = await proc.communicate()

    print(f'[@{cmd!r@} exited with @{proc.returncode@}]')
    if stdout:
        print(f'[stdout]\n@{stdout.decode()@}')
    if stderr:
        print(f'[stderr]\n@{stderr.decode()@}')

asyncio.run(run('ls /zzz'))
@end example

는 다음과 같이 인쇄할 것입니다:

@example
['ls /zzz' exited with 1]
[stderr]
ls: /zzz: No such file or directory
@end example

모든 asyncio 서브 프로세스 함수는 비동기이고, asyncio가 이러한 함수로 작업 할 수 있는 많은 도구를 제공하기 때문에, 여러 서브 프로세스를 병렬로 실행하고 감시하기가 쉽습니다. 여러 명령을 동시에 실행하도록 위 예제를 수정하는 것은 아주 간단합니다:

@example
async def main():
    await asyncio.gather(
        run('ls /zzz'),
        run('sleep 1; echo "hello"'))

asyncio.run(main())
@end example

@ref{386f,,예제} 하위 절도 참조하십시오.

@menu
* 서브 프로세스 만들기:: 
* 상수: 상수<7>. 
* 서브 프로세스와 상호 작용하기:: 

@end menu

@node 서브 프로세스 만들기,상수<7>,,서브 프로세스
@anchor{library/asyncio-subprocess creating-subprocesses}@anchor{3870}
@subsubsection 서브 프로세스 만들기


@geindex create_subprocess_exec() (asyncio 모듈)
@anchor{library/asyncio-subprocess asyncio create_subprocess_exec}@anchor{c6a}
@deffn {함수} async asyncio.create_subprocess_exec (program, *args, stdin=None, stdout=None, stderr=None, limit=None, **kwds)

서브 프로세스를 만듭니다.

`limit' 인자는 @ref{3871,,stdout} 과 @ref{3872,,stderr}에 대한 @ref{176b,,StreamReader} 래퍼의 버퍼 한계를 설정합니다 (@ref{d7f,,subprocess.PIPE}가 `stdout' 및 `stderr' 인자에 전달되었을 때).

@ref{3873,,Process} 인스턴스를 반환합니다.

다른 매개 변수에 관해서는 @ref{3874,,loop.subprocess_exec()}의 설명서를 참조하십시오.

If the process object is garbage collected while the process is still
running, the child process will be killed.


버전 3.10에서 변경: `loop' 매개 변수를 제거했습니다.

@end deffn

@geindex create_subprocess_shell() (asyncio 모듈)
@anchor{library/asyncio-subprocess asyncio create_subprocess_shell}@anchor{c6b}
@deffn {함수} async asyncio.create_subprocess_shell (cmd, stdin=None, stdout=None, stderr=None, limit=None, **kwds)

`cmd' 셸 명령을 실행합니다.

`limit' 인자는 @ref{3871,,stdout} 과 @ref{3872,,stderr}에 대한 @ref{176b,,StreamReader} 래퍼의 버퍼 한계를 설정합니다 (@ref{d7f,,subprocess.PIPE}가 `stdout' 및 `stderr' 인자에 전달되었을 때).

@ref{3873,,Process} 인스턴스를 반환합니다.

다른 매개 변수에 관해서는 @ref{3875,,loop.subprocess_shell()}의 설명서를 참조하십시오.

If the process object is garbage collected while the process is still
running, the child process will be killed.

@cartouche
@quotation 중요 
셸 주입@footnote{https://en.wikipedia.org/wiki/Shell_injection#Shell_injection} 취약점을 피하고자 모든 공백과 특수 문자를 적절하게 따옴표로 감싸는 것은 응용 프로그램의 책임입니다. @ref{581,,shlex.quote()} 함수는 셸 명령을 구성하는 데 사용될 문자열의 공백 문자와 특수 셸 문자를 올바르게 이스케이프 하는 데 사용할 수 있습니다.
@end quotation
@end cartouche


버전 3.10에서 변경: `loop' 매개 변수를 제거했습니다.

@end deffn

@cartouche
@quotation 참고 
@ref{81c,,ProactorEventLoop}를 쓰면 윈도우에서 서브 프로세스를 사용할 수 있습니다. 자세한 내용은 @ref{3876,,윈도우에서의 서브 프로세스 지원}을 참조하십시오.
@end quotation
@end cartouche


@subsubheading 더 보기


또한, asyncio에는 서브 프로세스와 함께 작동하는 다음과 같은 `저수준' API가 있습니다: @ref{3877,,서브 프로세스 트랜스포트} 와 @ref{3878,,서브 프로세스 프로토콜} 뿐만 아니라 @ref{3874,,loop.subprocess_exec()}, @ref{3875,,loop.subprocess_shell()}, @ref{3879,,loop.connect_read_pipe()}, @ref{387a,,loop.connect_write_pipe()}.


@node 상수<7>,서브 프로세스와 상호 작용하기,서브 프로세스 만들기,서브 프로세스
@anchor{library/asyncio-subprocess constants}@anchor{387b}
@subsubsection 상수


@geindex asyncio.subprocess.PIPE (내장 변수)
@anchor{library/asyncio-subprocess asyncio subprocess PIPE}@anchor{387c}
@deffn {데이터} asyncio.subprocess.PIPE

`stdin', `stdout' 또는 `stderr' 매개 변수로 전달될 수 있습니다.

`PIPE'가 `stdin' 인자로 전달되면, @ref{387d,,Process.stdin} 어트리뷰트는 @ref{1a70,,StreamWriter} 인스턴스를 가리킵니다.

`PIPE'가 `stdout' 이나 `stderr' 인자로 전달되면, @ref{3871,,Process.stdout} 과 @ref{3872,,Process.stderr} 어트리뷰트는 @ref{176b,,StreamReader} 인스턴스를 가리 킵니다.
@end deffn

@geindex asyncio.subprocess.STDOUT (내장 변수)
@anchor{library/asyncio-subprocess asyncio subprocess STDOUT}@anchor{387e}
@deffn {데이터} asyncio.subprocess.STDOUT

`stderr' 인자로 사용할 수 있는 특수 값이며, 표준 에러를 표준 출력으로 리디렉션해야 함을 나타냅니다.
@end deffn

@geindex asyncio.subprocess.DEVNULL (내장 변수)
@anchor{library/asyncio-subprocess asyncio subprocess DEVNULL}@anchor{387f}
@deffn {데이터} asyncio.subprocess.DEVNULL

프로세스 생성 함수의 `stdin', `stdout' 또는 `stderr' 인자로 사용할 수 있는 특수 값입니다. 특수 파일 @ref{1e10,,os.devnull}이 해당 서브 프로세스 스트림에 사용됨을 나타냅니다.
@end deffn

@node 서브 프로세스와 상호 작용하기,,상수<7>,서브 프로세스
@anchor{library/asyncio-subprocess interacting-with-subprocesses}@anchor{3880}
@subsubsection 서브 프로세스와 상호 작용하기


@ref{c6a,,create_subprocess_exec()} 와 @ref{c6b,,create_subprocess_shell()} 함수는 모두 `Process' 클래스의 인스턴스를 반환합니다. `Process'는 서브 프로세스와 통신하고 완료를 관찰할 수 있는 고수준 래퍼입니다.

@geindex asyncio.subprocess.Process (내장 클래스)
@anchor{library/asyncio-subprocess asyncio subprocess Process}@anchor{3873}
@deffn {클래스} asyncio.subprocess.Process

@ref{c6a,,create_subprocess_exec()} 와 @ref{c6b,,create_subprocess_shell()} 함수로 만들어진 OS 프로세스를 감싸는 객체.

이 클래스는 @ref{4b8,,subprocess.Popen} 클래스와 비슷한 API를 갖도록 설계되었지만, 주목할만한 차이점이 있습니다:


@itemize *

@item 
Popen과 달리, Process 인스턴스에는 @ref{378a,,poll()} 메서드와 동등한 것이 없습니다;

@item 
@ref{1a9e,,communicate()} 와 @ref{3881,,wait()} 메서드에는 `timeout' 매개 변수가 없습니다: @ref{814,,wait_for()} 함수를 사용하십시오;

@item 
@ref{3881,,Process.wait()} 메서드는 비동기이지만, @ref{edf,,subprocess.Popen.wait()} 메서드는 블로킹 비지 루프(blocking busy loop)로 구현됩니다;

@item 
`universal_newlines' 매개 변수는 지원되지 않습니다.
@end itemize

이 클래스는 @ref{3819,,스레드 안전하지 않습니다}.

@ref{3882,,서브 프로세스와 스레드} 절도 참조하십시오.

@geindex wait() (asyncio.subprocess.Process 메서드)
@anchor{library/asyncio-subprocess asyncio subprocess Process wait}@anchor{3881}
@deffn {메서드} async wait ()

자식 프로세스가 종료할 때까지 기다립니다.

@ref{3883,,returncode} 어트리뷰트를 설정하고 반환합니다.

@cartouche
@quotation 참고 
이 메서드는 @code{stdout=PIPE} 나 @code{stderr=PIPE}를 사용하고 자식 프로세스가 너무 많은 출력을 만들면 교착 상태가 될 수 있습니다. 자식 프로세스는 OS 파이프 버퍼가 더 많은 데이터를 받아들이도록 기다리면서 블록 됩니다. 이 조건을 피하고자, 파이프를 사용할 때는 @ref{1a9e,,communicate()} 메서드를 사용하십시오.
@end quotation
@end cartouche
@end deffn

@geindex communicate() (asyncio.subprocess.Process 메서드)
@anchor{library/asyncio-subprocess asyncio subprocess Process communicate}@anchor{1a9e}
@deffn {메서드} async communicate (input=None)

프로세스와 상호 작용합니다:


@enumerate 

@item 
데이터를 `stdin'으로 보냅니다 (`input'이 @code{None}이 아니면);

@item 
`stdin'을 닫습니다;

@item 
EOF에 도달할 때까지 `stdout' 과 `stderr'에서 데이터를 읽습니다;

@item 
프로세스가 종료할 때까지 기다립니다.
@end enumerate

선택적 `input' 인자는 자식 프로세스로 전송될 데이터(@ref{192,,bytes} 객체)입니다.

튜플 @code{(stdout_data, stderr_data)}를 반환합니다.

`input'을 `stdin'에 쓸 때 @ref{125b,,BrokenPipeError} 나 @ref{125e,,ConnectionResetError} 예외가 발생하면, 예외를 무시합니다. 이 조건은 모든 데이터가 `stdin'에 기록되기 전에 프로세스가 종료할 때 발생합니다.

프로세스의 ‘`stdin'으로 데이터를 보내려면, 프로세스를 @code{stdin=PIPE}로 만들어야 합니다. 마찬가지로, 결과 튜플에서 @code{None} 이외의 것을 얻으려면, @code{stdout=PIPE} 와/나 @code{stderr=PIPE} 인자를 사용하여 프로세스를 만들어야 합니다.

데이터가 메모리에 버퍼링 되므로, 데이터 크기가 크거나 무제한이면 이 메서드를 사용하지 마십시오.


버전 3.12에서 변경: @code{input=None}일 때도 `stdin'이 닫힙니다.

@end deffn

@geindex send_signal() (asyncio.subprocess.Process 메서드)
@anchor{library/asyncio-subprocess asyncio subprocess Process send_signal}@anchor{194b}
@deffn {메서드} send_signal (signal)

시그널 `signal'를 자식 프로세스로 보냅니다.

@cartouche
@quotation 참고 
윈도우에서, @ref{15e4,,SIGTERM}은 @ref{3884,,terminate()}의 별칭입니다. @code{CTRL_C_EVENT} 와 @code{CTRL_BREAK_EVENT}는 @code{CREATE_NEW_PROCESS_GROUP}을 포함하는 `creationflags' 매개 변수로 시작된 프로세스로 전송될 수 있습니다.
@end quotation
@end cartouche
@end deffn

@geindex terminate() (asyncio.subprocess.Process 메서드)
@anchor{library/asyncio-subprocess asyncio subprocess Process terminate}@anchor{3884}
@deffn {메서드} terminate ()

자식 프로세스를 중지합니다.

POSIX 시스템에서 이 메서드는 @ref{15e4,,SIGTERM}를 자식 프로세스로 보냅니다.

윈도우에서는 Win32 API 함수 @code{TerminateProcess()}가 호출되어 자식 프로세스를 중지합니다.
@end deffn

@geindex kill() (asyncio.subprocess.Process 메서드)
@anchor{library/asyncio-subprocess asyncio subprocess Process kill}@anchor{3885}
@deffn {메서드} kill ()

자식 프로세스를 죽입니다.

POSIX 시스템에서 이 메서드는 @ref{d4f,,SIGKILL}를 자식 프로세스로 보냅니다.

윈도우에서 이 메서드는 @ref{3884,,terminate()}의 별칭입니다.
@end deffn

@geindex stdin (asyncio.subprocess.Process의 속성)
@anchor{library/asyncio-subprocess asyncio subprocess Process stdin}@anchor{387d}
@deffn {속성} stdin

표준 입력 스트림(@ref{1a70,,StreamWriter}) 또는 프로세스가 @code{stdin=None}으로 만들어졌으면 @code{None}.
@end deffn

@geindex stdout (asyncio.subprocess.Process의 속성)
@anchor{library/asyncio-subprocess asyncio subprocess Process stdout}@anchor{3871}
@deffn {속성} stdout

표준 출력 스트림(@ref{176b,,StreamReader}) 또는 프로세스가 @code{stdout=None}으로 만들어졌으면 @code{None}.
@end deffn

@geindex stderr (asyncio.subprocess.Process의 속성)
@anchor{library/asyncio-subprocess asyncio subprocess Process stderr}@anchor{3872}
@deffn {속성} stderr

표준 에러 스트림(@ref{176b,,StreamReader}) 또는 프로세스가 @code{stderr=None}으로 만들어졌으면 @code{None}.
@end deffn

@cartouche
@quotation 경고 
@ref{387d,,process.stdin.write()}, @ref{3871,,await process.stdout.read()} 또는 @ref{3872,,await process.stderr.read()} 대신 @ref{1a9e,,communicate()} 메서드를 사용하십시오. 이렇게 하면 스트림이 읽기나 쓰기를 일시 중지하고 자식 프로세스를 블록하는 것으로 인한 교착 상태가 발생하지 않습니다.
@end quotation
@end cartouche

@geindex pid (asyncio.subprocess.Process의 속성)
@anchor{library/asyncio-subprocess asyncio subprocess Process pid}@anchor{3886}
@deffn {속성} pid

프로세스 식별 번호 (PID).

@ref{c6b,,create_subprocess_shell()} 함수로 만들어진 프로세스의 경우, 이 어트리뷰트는 생성된 셸의 PID입니다.
@end deffn

@geindex returncode (asyncio.subprocess.Process의 속성)
@anchor{library/asyncio-subprocess asyncio subprocess Process returncode}@anchor{3883}
@deffn {속성} returncode

프로세스가 종료할 때의 반환 코드.

@code{None} 값은 프로세스가 아직 종료하지 않았음을 나타냅니다.

For processes created with @ref{c6a,,create_subprocess_exec()}, a negative
value @code{-N} indicates that the child was terminated by signal @code{N}
(POSIX only).

For processes created with @ref{c6b,,create_subprocess_shell()}, the
return code reflects the exit status of the shell itself (e.g. @code{/bin/sh}),
which may map signals to codes such as @code{128+N}. See the
documentation of the shell (for example, the Bash manual’s Exit Status)
for details.
@end deffn
@end deffn

@menu
* 서브 프로세스와 스레드:: 
* 예제: 예제<14>. 

@end menu

@node 서브 프로세스와 스레드,예제<14>,,서브 프로세스와 상호 작용하기
@anchor{library/asyncio-subprocess asyncio-subprocess-threads}@anchor{3882}@anchor{library/asyncio-subprocess subprocess-and-threads}@anchor{3887}
@subsubsection 서브 프로세스와 스레드


표준 asyncio 이벤트 루프는 기본적으로 다른 스레드에서 서브 프로세스를 실행하는 것을 지원합니다.

윈도우에서 서브 프로세스는 @ref{81c,,ProactorEventLoop}(기본값)에서만 제공되며, @ref{314,,SelectorEventLoop}에는 서브 프로세스 지원이 없습니다.

대체 이벤트 루프 구현에는 나름의 제한 사항이 있을 수 있습니다; 해당 설명서를 참조하십시오.


@subsubheading 더 보기


@ref{3819,,asyncio의 동시성과 다중 스레드} 절.


@node 예제<14>,,서브 프로세스와 스레드,서브 프로세스와 상호 작용하기
@anchor{library/asyncio-subprocess examples}@anchor{386f}
@subsubsection 예제


@ref{3873,,Process} 클래스를 사용하여 서브 프로세스를 제어하고 @ref{176b,,StreamReader} 클래스를 사용하여 표준 출력을 읽는 예제.
@anchor{library/asyncio-subprocess asyncio-example-create-subprocess-exec}@anchor{3888}
서브 프로세스는 @ref{c6a,,create_subprocess_exec()} 함수로 만듭니다:

@example
import asyncio
import sys

async def get_date():
    code = 'import datetime as dt; print(dt.datetime.now())'

    # Create the subprocess; redirect the standard output
    # into a pipe.
    proc = await asyncio.create_subprocess_exec(
        sys.executable, '-c', code,
        stdout=asyncio.subprocess.PIPE)

    # Read one line of output.
    data = await proc.stdout.readline()
    line = data.decode('ascii').rstrip()

    # Wait for the subprocess exit.
    await proc.wait()
    return line

date = asyncio.run(get_date())
print(f"Current date: @{date@}")
@end example

저수준 API를 사용하여 작성된 @ref{3889,,같은 예제}도 참조하십시오.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 큐,예외<10>,서브 프로세스,asyncio — 비동기 I/O
@anchor{library/asyncio-queue doc}@anchor{388a}@anchor{library/asyncio-queue asyncio-queues}@anchor{37ec}@anchor{library/asyncio-queue queues}@anchor{388b}@anchor{library/asyncio-queue translation-repo}@anchor{388c}
@subsubsection 큐


`소스 코드:' Lib/asyncio/queues.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/asyncio/queues.py}


__________________________________________________________________


asyncio 큐는 @ref{bb,,queue} 모듈의 클래스와 유사하도록 설계되었습니다. asyncio 큐는 스레드 안전하지 않지만, async/await 코드에서 사용되도록 설계되었습니다.

asyncio 큐의 메서드에는 `timeout' 매개 변수가 없습니다; 시간제한이 있는 큐 연산을 하려면 @ref{814,,asyncio.wait_for()} 함수를 사용하십시오.

아래의 @ref{388d,,예제} 절도 참조하십시오.

@menu
* Queue:: 
* 우선순위 큐:: 
* LIFO 큐:: 
* 예외: 예외<9>. 
* 예제: 예제<15>. 

@end menu

@node Queue,우선순위 큐,,큐
@anchor{library/asyncio-queue queue}@anchor{388e}
@subsubsection Queue


@geindex Queue (asyncio 클래스)
@anchor{library/asyncio-queue asyncio Queue}@anchor{c69}
@deffn {클래스} asyncio.Queue (maxsize=0)

선입 선출 (FIFO) 큐.

`maxsize'가 0보다 작거나 같으면 큐 크기는 무한합니다. @code{0}보다 큰 정수면, 큐가 `maxsize'에 도달했을 때 @ref{388f,,get()}이 항목을 제거할 때까지 @code{await put()}이 블록합니다.

표준 라이브러리의 스레드를 쓰는 @ref{bb,,queue}와는 달리, 큐의 크기는 항상 알려져 있으며 @ref{3890,,qsize()} 메서드를 호출하여 얻을 수 있습니다.


버전 3.10에서 변경: `loop' 매개 변수를 제거했습니다.


이 클래스는 @ref{3819,,스레드 안전하지 않습니다}.

@geindex maxsize (asyncio.Queue의 속성)
@anchor{library/asyncio-queue asyncio Queue maxsize}@anchor{3891}
@deffn {속성} maxsize

큐에 허용되는 항목 수.
@end deffn

@geindex empty() (asyncio.Queue 메서드)
@anchor{library/asyncio-queue asyncio Queue empty}@anchor{3892}
@deffn {메서드} empty ()

큐가 비어 있으면 @code{True}를 반환하고, 그렇지 않으면 @code{False}를 반환합니다.
@end deffn

@geindex full() (asyncio.Queue 메서드)
@anchor{library/asyncio-queue asyncio Queue full}@anchor{3893}
@deffn {메서드} full ()

큐에 @ref{3891,,maxsize} 항목이 있으면 @code{True}를 반환합니다.

큐가 @code{maxsize=0} (기본값)으로 초기화되었으면, @ref{3893,,full()}은 절대 @code{True}를 반환하지 않습니다.
@end deffn

@geindex get() (asyncio.Queue 메서드)
@anchor{library/asyncio-queue asyncio Queue get}@anchor{388f}
@deffn {메서드} async get ()

큐에서 항목을 제거하고 반환합니다. 큐가 비어 있으면, 항목이 들어올 때까지 기다립니다.

Raises @ref{4ce,,QueueShutDown} if the queue has been shut down and
is empty, or if the queue has been shut down immediately.
@end deffn

@geindex get_nowait() (asyncio.Queue 메서드)
@anchor{library/asyncio-queue asyncio Queue get_nowait}@anchor{3894}
@deffn {메서드} get_nowait ()

항목을 즉시 사용할 수 있으면 항목을 반환하고, 그렇지 않으면 @ref{3895,,QueueEmpty}를 발생시킵니다.
@end deffn

@geindex join() (asyncio.Queue 메서드)
@anchor{library/asyncio-queue asyncio Queue join}@anchor{fc5}
@deffn {메서드} async join ()

큐의 모든 항목을 수신하여 처리할 때까지 블록합니다.

완료되지 않은 작업 수는 항목이 큐에 추가될 때마다 증가합니다. 이 수는 소비자 코루틴이 항목을 수신했고 그 항목에 관한 작업이 모두 완료되었음을 나타내는 @ref{fc6,,task_done()}를 호출할 때마다 감소합니다. 완료되지 않은 작업 수가 0으로 떨어지면 @ref{fc5,,join()}가 블록 해제됩니다.
@end deffn

@geindex put() (asyncio.Queue 메서드)
@anchor{library/asyncio-queue asyncio Queue put}@anchor{3896}
@deffn {메서드} async put (item)

큐에 항목을 넣습니다. 큐가 가득 차면, 항목을 추가할 빈자리가 생길 때까지 기다립니다.

Raises @ref{4ce,,QueueShutDown} if the queue has been shut down.
@end deffn

@geindex put_nowait() (asyncio.Queue 메서드)
@anchor{library/asyncio-queue asyncio Queue put_nowait}@anchor{3897}
@deffn {메서드} put_nowait (item)

블록하지 않고 항목을 큐에 넣습니다.

자리가 즉시 나지 않으면, @ref{3898,,QueueFull}를 일으킵니다.
@end deffn

@geindex qsize() (asyncio.Queue 메서드)
@anchor{library/asyncio-queue asyncio Queue qsize}@anchor{3890}
@deffn {메서드} qsize ()

큐에 있는 항목 수를 돌려줍니다.
@end deffn

@geindex shutdown() (asyncio.Queue 메서드)
@anchor{library/asyncio-queue asyncio Queue shutdown}@anchor{4cd}
@deffn {메서드} shutdown (immediate=False)

Put a @ref{c69,,Queue} instance into a shutdown mode.

The queue can no longer grow.
Future calls to @ref{3896,,put()} raise @ref{4ce,,QueueShutDown}.
Currently blocked callers of @code{put()} will be unblocked
and will raise @code{QueueShutDown} in the formerly awaiting task.

If `immediate' is false (the default), the queue can be wound
down normally with @ref{388f,,get()} calls to extract tasks
that have already been loaded.

And if @ref{fc6,,task_done()} is called for each remaining task, a
pending @ref{fc5,,join()} will be unblocked normally.

Once the queue is empty, future calls to @ref{388f,,get()} will
raise @ref{4ce,,QueueShutDown}.

If `immediate' is true, the queue is terminated immediately.
The queue is drained to be completely empty and the count
of unfinished tasks is reduced by the number of tasks drained.
If unfinished tasks is zero, callers of @ref{fc5,,join()}
are unblocked.  Also, blocked callers of @ref{388f,,get()}
are unblocked and will raise @ref{4ce,,QueueShutDown} because the
queue is empty.

Use caution when using @ref{fc5,,join()} with `immediate' set
to true. This unblocks the join even when no work has been done
on the tasks, violating the usual invariant for joining a queue.


Added in version 3.13.

@end deffn

@geindex task_done() (asyncio.Queue 메서드)
@anchor{library/asyncio-queue asyncio Queue task_done}@anchor{fc6}
@deffn {메서드} task_done ()

이전에 큐에 넣은 작업 항목이 완료되었음을 나타냅니다.

큐 소비자가 사용합니다. 작업 항목을 꺼내는 데 사용된 @ref{388f,,get()} 마다, 뒤따르는 @ref{fc6,,task_done()} 호출은 작업 항목에 관한 처리가 완료되었음을 큐에 알려줍니다.

@ref{fc5,,join()}이 현재 블록 중이면, 모든 항목이 처리될 때 다시 시작됩니다 (큐에 @ref{3896,,put()}한 모든 항목에 대해 @ref{fc6,,task_done()} 호출이 수신되었음을 뜻합니다).

큐에 넣은 항목보다 더 많이 호출되면 @ref{2ec,,ValueError}를 발생시킵니다.
@end deffn
@end deffn

@node 우선순위 큐,LIFO 큐,Queue,큐
@anchor{library/asyncio-queue priority-queue}@anchor{3899}
@subsubsection 우선순위 큐


@geindex PriorityQueue (asyncio 클래스)
@anchor{library/asyncio-queue asyncio PriorityQueue}@anchor{389a}
@deffn {클래스} asyncio.PriorityQueue

@ref{c69,,Queue}의 변형; 우선순위 순서로 항목을 꺼냅니다 (가장 낮은 우선순위가 처음입니다).

엔트리는 일반적으로 @code{(priority_number, data)} 형식의 튜플입니다.
@end deffn

@node LIFO 큐,예외<9>,우선순위 큐,큐
@anchor{library/asyncio-queue lifo-queue}@anchor{389b}
@subsubsection LIFO 큐


@geindex LifoQueue (asyncio 클래스)
@anchor{library/asyncio-queue asyncio LifoQueue}@anchor{389c}
@deffn {클래스} asyncio.LifoQueue

가장 최근에 추가된 항목을 먼저 꺼내는 @ref{c69,,Queue}의 변형 (후입 선출).
@end deffn

@node 예외<9>,예제<15>,LIFO 큐,큐
@anchor{library/asyncio-queue exceptions}@anchor{389d}
@subsubsection 예외


@geindex QueueEmpty
@anchor{library/asyncio-queue asyncio QueueEmpty}@anchor{3895}
@deffn {예외} asyncio.QueueEmpty

이 예외는 @ref{3894,,get_nowait()} 메서드가 빈 큐에 호출될 때 발생합니다.
@end deffn

@geindex QueueFull
@anchor{library/asyncio-queue asyncio QueueFull}@anchor{3898}
@deffn {예외} asyncio.QueueFull

@ref{3897,,put_nowait()} 메서드가 `maxsize'에 도달한 큐에 호출될 때 발생하는 예외입니다.
@end deffn

@geindex QueueShutDown
@anchor{library/asyncio-queue asyncio QueueShutDown}@anchor{4ce}
@deffn {예외} asyncio.QueueShutDown

@ref{3896,,put()} 이나 @ref{388f,,get()} 메서드가 종료된 큐에 호출될 때 발생하는 예외입니다.


Added in version 3.13.

@end deffn

@node 예제<15>,,예외<9>,큐
@anchor{library/asyncio-queue examples}@anchor{388d}
@subsubsection 예제

@anchor{library/asyncio-queue asyncio-example-queue-dist}@anchor{389e}
큐를 사용하여 여러 동시 태스크로 작업 부하를 분산시킬 수 있습니다:

@example
import asyncio
import random
import time


async def worker(name, queue):
    while True:
        # 큐에서 "작업 항목"을 가져옵니다.
        sleep_for = await queue.get()

        # "sleep_for" 초 동안 잡니다.
        await asyncio.sleep(sleep_for)

        # 큐에 "작업 항목"이 처리되었음을 알립니다.
        queue.task_done()

        print(f'@{name@} has slept for @{sleep_for:.2f@} seconds')


async def main():
    # "작업 부하"를 저장하는 데 사용할 큐를 만듭니다.
    queue = asyncio.Queue()

    # 무작위 대기 시간을 만들어서 큐에 넣습니다.
    total_sleep_time = 0
    for _ in range(20):
        sleep_for = random.uniform(0.05, 1.0)
        total_sleep_time += sleep_for
        queue.put_nowait(sleep_for)

    # 큐를 동시에 처리할 세 개의 worker 태스크를 만듭니다.
    tasks = []
    for i in range(3):
        task = asyncio.create_task(worker(f'worker-@{i@}', queue))
        tasks.append(task)

    # 큐가 완전히 처리될 때까지 기다립니다.
    started_at = time.monotonic()
    await queue.join()
    total_slept_for = time.monotonic() - started_at

    # worker 태스크를 취소합니다.
    for task in tasks:
        task.cancel()
    # 모든 worker 태스크가 취소될 때까지 기다립니다.
    await asyncio.gather(*tasks, return_exceptions=True)

    print('====')
    print(f'3 workers slept in parallel for @{total_slept_for:.2f@} seconds')
    print(f'total expected sleep time: @{total_sleep_time:.2f@} seconds')


asyncio.run(main())
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 예외<10>,Call Graph Introspection,큐,asyncio — 비동기 I/O
@anchor{library/asyncio-exceptions doc}@anchor{389f}@anchor{library/asyncio-exceptions asyncio-exceptions}@anchor{38a0}@anchor{library/asyncio-exceptions exceptions}@anchor{38a1}@anchor{library/asyncio-exceptions translation-repo}@anchor{38a2}
@subsubsection 예외


`소스 코드:' Lib/asyncio/exceptions.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/asyncio/exceptions.py}


__________________________________________________________________


@geindex TimeoutError
@anchor{library/asyncio-exceptions asyncio TimeoutError}@anchor{1ab4}
@deffn {예외} asyncio.TimeoutError

@ref{a36,,TimeoutError}의 폐지된 별칭입니다. 작업이 주어진 마감 시간을 초과했을 때 발생합니다.


버전 3.11에서 변경: 이 클래스를 @ref{a36,,TimeoutError}의 별칭으로 만들었습니다.

@end deffn

@geindex CancelledError
@anchor{library/asyncio-exceptions asyncio CancelledError}@anchor{4d5}
@deffn {예외} asyncio.CancelledError

작업이 취소되었습니다.

이 예외는 asyncio 태스크가 취소될 때 사용자 정의 작업을 수행하기 위해 잡을 수 있습니다. 거의 모든 상황에서 예외를 다시 일으켜야 합니다.


버전 3.8에서 변경: @ref{4d5,,CancelledError}는 이제 @ref{bcc,,Exception}가 아니라 @ref{7d6,,BaseException}의 서브 클래스입니다.

@end deffn

@geindex InvalidStateError
@anchor{library/asyncio-exceptions asyncio InvalidStateError}@anchor{3821}
@deffn {예외} asyncio.InvalidStateError

@ref{1c7,,Task} 나 @ref{dc5,,Future}의 내부 상태가 잘못되었습니다.

이미 결괏값이 설정된 `Future' 객체에 대해 결괏값을 설정하는 것과 같은 상황에서 발생할 수 있습니다.
@end deffn

@geindex SendfileNotAvailableError
@anchor{library/asyncio-exceptions asyncio SendfileNotAvailableError}@anchor{38a3}
@deffn {예외} asyncio.SendfileNotAvailableError

주어진 소켓이나 파일 유형에서는 “sendfile” 시스템 호출을 사용할 수 없습니다.

@ref{244,,RuntimeError}의 서브 클래스입니다.
@end deffn

@geindex IncompleteReadError
@anchor{library/asyncio-exceptions asyncio IncompleteReadError}@anchor{1ce5}
@deffn {예외} asyncio.IncompleteReadError

요청한 읽기 작업이 완전히 완료되지 않았습니다.

@ref{37ea,,asyncio 스트림 API}가 일으킵니다.

이 예외는 @ref{14de,,EOFError}의 서브 클래스입니다.

@geindex expected (asyncio.IncompleteReadError의 속성)
@anchor{library/asyncio-exceptions asyncio IncompleteReadError expected}@anchor{38a4}
@deffn {속성} expected

기대하는 바이트의 총수 (@ref{19b,,int}).
@end deffn

@geindex partial (asyncio.IncompleteReadError의 속성)
@anchor{library/asyncio-exceptions asyncio IncompleteReadError partial}@anchor{3836}
@deffn {속성} partial

스트림이 끝나기 전에 읽은 @ref{192,,bytes} 문자열.
@end deffn
@end deffn

@geindex LimitOverrunError
@anchor{library/asyncio-exceptions asyncio LimitOverrunError}@anchor{3837}
@deffn {예외} asyncio.LimitOverrunError

구분 기호를 찾는 동안 버퍼 크기 제한에 도달했습니다.

@ref{37ea,,asyncio 스트림 API}가 일으킵니다.

@geindex consumed (asyncio.LimitOverrunError의 속성)
@anchor{library/asyncio-exceptions asyncio LimitOverrunError consumed}@anchor{38a5}
@deffn {속성} consumed

소비된 바이트의 총수.
@end deffn
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Call Graph Introspection,Event loop,예외<10>,asyncio — 비동기 I/O
@anchor{library/asyncio-graph doc}@anchor{38a6}@anchor{library/asyncio-graph asyncio-graph}@anchor{38a7}@anchor{library/asyncio-graph call-graph-introspection}@anchor{38a8}@anchor{library/asyncio-graph translation-repo}@anchor{38a9}
@subsubsection Call Graph Introspection


`Source code:' Lib/asyncio/graph.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/asyncio/graph.py}


__________________________________________________________________


asyncio has powerful runtime call graph introspection utilities
to trace the entire call graph of a running `coroutine' or `task', or
a suspended `future'.  These utilities and the underlying machinery
can be used from within a Python program or by external profilers
and debuggers.


Added in version 3.14.


@geindex print_call_graph() (asyncio 모듈)
@anchor{library/asyncio-graph asyncio print_call_graph}@anchor{1cd}
@deffn {함수} asyncio.print_call_graph (future=None, /, *, file=None, depth=1, limit=None)

Print the async call graph for the current task or the provided
@ref{1c7,,Task} or @ref{dc5,,Future}.

This function prints entries starting from the top frame and going
down towards the invocation point.

The function receives an optional `future' argument.
If not passed, the current running task will be used.

If the function is called on `the current task', the optional
keyword-only `depth' argument can be used to skip the specified
number of frames from top of the stack.

If the optional keyword-only `limit' argument is provided, each call stack
in the resulting graph is truncated to include at most @code{abs(limit)}
entries. If `limit' is positive, the entries left are the closest to
the invocation point. If `limit' is negative, the topmost entries are
left. If `limit' is omitted or @code{None}, all entries are present.
If `limit' is @code{0}, the call stack is not printed at all, only
“awaited by” information is printed.

If `file' is omitted or @code{None}, the function will print
to @ref{ccc,,sys.stdout}.

`Example:'

The following Python code:

@example
import asyncio

async def test():
    asyncio.print_call_graph()

async def main():
    async with asyncio.TaskGroup() as g:
        g.create_task(test(), name='test')

asyncio.run(main())
@end example

will print:

@example
* Task(name='test', id=0x1039f0fe0)
+ Call stack:
|   File 't2.py', line 4, in async test()
+ Awaited by:
   * Task(name='Task-1', id=0x103a5e060)
      + Call stack:
      |   File 'taskgroups.py', line 107, in async TaskGroup.__aexit__()
      |   File 't2.py', line 7, in async main()
@end example
@end deffn

@geindex format_call_graph() (asyncio 모듈)
@anchor{library/asyncio-graph asyncio format_call_graph}@anchor{38aa}
@deffn {함수} asyncio.format_call_graph (future=None, /, *, depth=1, limit=None)

Like @ref{1cd,,print_call_graph()}, but returns a string.
If `future' is @code{None} and there’s no current task,
the function returns an empty string.
@end deffn

@geindex capture_call_graph() (asyncio 모듈)
@anchor{library/asyncio-graph asyncio capture_call_graph}@anchor{1cc}
@deffn {함수} asyncio.capture_call_graph (future=None, /, *, depth=1, limit=None)

Capture the async call graph for the current task or the provided
@ref{1c7,,Task} or @ref{dc5,,Future}.

The function receives an optional `future' argument.
If not passed, the current running task will be used. If there’s no
current task, the function returns @code{None}.

If the function is called on `the current task', the optional
keyword-only `depth' argument can be used to skip the specified
number of frames from top of the stack.

Returns a @code{FutureCallGraph} data class object:


@itemize *

@item 
@code{FutureCallGraph(future, call_stack, awaited_by)}

@quotation

Where `future' is a reference to a @ref{dc5,,Future} or
a @ref{1c7,,Task} (or their subclasses.)

@code{call_stack} is a tuple of @code{FrameCallGraphEntry} objects.

@code{awaited_by} is a tuple of @code{FutureCallGraph} objects.
@end quotation

@item 
@code{FrameCallGraphEntry(frame)}

@quotation

Where `frame' is a frame object of a regular Python function
in the call stack.
@end quotation
@end itemize
@end deffn

@menu
* Low level utility functions:: 

@end menu

@node Low level utility functions,,,Call Graph Introspection
@anchor{library/asyncio-graph low-level-utility-functions}@anchor{38ab}
@subsubsection Low level utility functions


To introspect an async call graph asyncio requires cooperation from
control flow structures, such as @ref{c64,,shield()} or @ref{4d2,,TaskGroup}.
Any time an intermediate @ref{dc5,,Future} object with low-level APIs like
@ref{cfd,,Future.add_done_callback()} is
involved, the following two functions should be used to inform asyncio
about how exactly such intermediate future objects are connected with
the tasks they wrap or control.

@geindex future_add_to_awaited_by() (asyncio 모듈)
@anchor{library/asyncio-graph asyncio future_add_to_awaited_by}@anchor{38ac}
@deffn {함수} asyncio.future_add_to_awaited_by (future, waiter, /)

Record that `future' is awaited on by `waiter'.

Both `future' and `waiter' must be instances of
@ref{dc5,,Future} or @ref{1c7,,Task} or their subclasses,
otherwise the call would have no effect.

A call to @code{future_add_to_awaited_by()} must be followed by an
eventual call to the @ref{38ad,,future_discard_from_awaited_by()} function
with the same arguments.
@end deffn

@geindex future_discard_from_awaited_by() (asyncio 모듈)
@anchor{library/asyncio-graph asyncio future_discard_from_awaited_by}@anchor{38ad}
@deffn {함수} asyncio.future_discard_from_awaited_by (future, waiter, /)

Record that `future' is no longer awaited on by `waiter'.

Both `future' and `waiter' must be instances of
@ref{dc5,,Future} or @ref{1c7,,Task} or their subclasses, otherwise
the call would have no effect.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Event loop,퓨처,Call Graph Introspection,asyncio — 비동기 I/O
@anchor{library/asyncio-eventloop doc}@anchor{38ae}@anchor{library/asyncio-eventloop asyncio-event-loop}@anchor{f75}@anchor{library/asyncio-eventloop event-loop}@anchor{38af}@anchor{library/asyncio-eventloop translation-repo}@anchor{38b0}
@subsubsection Event loop


`소스 코드:' Lib/asyncio/events.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/asyncio/events.py}, Lib/asyncio/base_events.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/asyncio/base_events.py}


__________________________________________________________________


@subsubheading 머리말


이벤트 루프는 모든 asyncio 응용 프로그램의 핵심입니다. 이벤트 루프는 비동기 태스크 및 콜백을 실행하고 네트워크 IO 연산을 수행하며 자식 프로세스를 실행합니다.

응용 프로그램 개발자는 일반적으로 @ref{2f3,,asyncio.run()}과 같은 고수준의 asyncio 함수를 사용해야 하며, 루프 객체를 참조하거나 메서드를 호출할 필요가 거의 없습니다. 이 절은 주로 이벤트 루프 동작을 세부적으로 제어해야 하는 저수준 코드, 라이브러리 및 프레임워크의 작성자를 대상으로 합니다.

@subsubheading 이벤트 루프 얻기


다음 저수준 함수를 사용하여 이벤트 루프를 가져오거나 설정하거나 만들 수 있습니다.:

@geindex get_running_loop() (asyncio 모듈)
@anchor{library/asyncio-eventloop asyncio get_running_loop}@anchor{d00}
@deffn {함수} asyncio.get_running_loop ()

현재 OS 스레드에서 실행 중인 이벤트 루프를 반환합니다.

실행 중인 이벤트 루프가 없으면 @ref{244,,RuntimeError}를 발생시킵니다.

이 함수는 코루틴이나 콜백에서만 호출할 수 있습니다.


Added in version 3.7.

@end deffn

@geindex get_event_loop() (asyncio 모듈)
@anchor{library/asyncio-eventloop asyncio get_event_loop}@anchor{2f2}
@deffn {함수} asyncio.get_event_loop ()

현재의 이벤트 루프를 가져옵니다.

When called from a coroutine or a callback (e.g. scheduled with
call_soon or similar API), this function will always return the
running event loop.

If there is no running event loop set, the function will return
the result of the @code{get_event_loop_policy().get_event_loop()} call.

이 함수는 (특히 사용자 정의 이벤트 루프 정책을 사용할 때) 다소 복잡한 동작을 하므로, 코루틴과 콜백에서 @ref{2f2,,get_event_loop()}보다 @ref{d00,,get_running_loop()} 함수를 사용하는 것이 좋습니다.

위에서 언급된 바와 같이, 이 저수준 함수를 사용하여 수동으로 이벤트 루프를 만들고 닫는 대신, 고수준 @ref{2f3,,asyncio.run()} 함수를 사용하는 것을 고려하십시오.


버전 3.14에서 변경: Raises a @ref{244,,RuntimeError} if there is no current event loop.


@cartouche
@quotation 참고 
The @code{asyncio} policy system is deprecated and will be removed
in Python 3.16; from there on, this function will return the current
running event loop if present else it will return the
loop set by @ref{1b53,,set_event_loop()}.
@end quotation
@end cartouche
@end deffn

@geindex set_event_loop() (asyncio 모듈)
@anchor{library/asyncio-eventloop asyncio set_event_loop}@anchor{1b53}
@deffn {함수} asyncio.set_event_loop (loop)

`loop'를 현재 OS 스레드의 현재 이벤트 루프로 설정합니다.
@end deffn

@geindex new_event_loop() (asyncio 모듈)
@anchor{library/asyncio-eventloop asyncio new_event_loop}@anchor{37f7}
@deffn {함수} asyncio.new_event_loop ()

새 이벤트 루프 객체를 만들고 반환합니다.
@end deffn

@ref{2f2,,get_event_loop()}, @ref{1b53,,set_event_loop()} 및 @ref{37f7,,new_event_loop()} 함수의 동작은 @ref{38b1,,사용자 정의 이벤트 루프 정책 설정}에 의해 변경될 수 있음에 유의하십시오.

@subsubheading 목차


이 설명서 페이지는 다음과 같은 절로 구성됩니다:


@itemize *

@item 
@ref{38b2,,이벤트 루프 메서드} 절은 이벤트 루프 API의 레퍼런스 설명서입니다.

@item 
@ref{38b3,,콜백 핸들} 절은 @ref{cf9,,loop.call_soon()} 및 @ref{cfb,,loop.call_later()}와 같은 예약 메서드에서 반환된 @ref{1e80,,Handle} 및 @ref{1adb,,TimerHandle} 인스턴스를 설명합니다.

@item 
@ref{38b4,,서버 객체} 절은 @ref{d08,,loop.create_server()}와 같은 이벤트 루프 메서드에서 반환되는 형을 설명합니다.

@item 
@ref{38b5,,이벤트 루프 구현} 절은 @ref{314,,SelectorEventLoop} 및 @ref{81c,,ProactorEventLoop} 클래스를 설명합니다.

@item 
@ref{38b6,,예제} 절에서는 일부 이벤트 루프 API로 작업하는 방법을 보여줍니다.
@end itemize

@menu
* Event loop methods:: 
* Callback handles:: 
* Server objects:: 
* Event loop implementations:: 
* 예제: 예제<16>. 

@end menu

@node Event loop methods,Callback handles,,Event loop
@anchor{library/asyncio-eventloop asyncio-event-loop-methods}@anchor{38b7}@anchor{library/asyncio-eventloop event-loop-methods}@anchor{38b2}
@subsubsection Event loop methods


이벤트 루프에는 다음과 같은 `저수준' API가 있습니다:

@menu
* 루프 실행 및 중지:: 
* 콜백 예약하기:: 
* 지연된 콜백 예약:: 
* Creating futures and tasks:: 
* 네트워크 연결 열기:: 
* 네트워크 서버 만들기:: 
* 파일 전송:: 
* TLS upgrade:: 
* 파일 기술자 관찰하기:: 
* 소켓 객체로 직접 작업하기:: 
* DNS:: 
* 파이프로 작업하기:: 
* 유닉스 시그널:: 
* 스레드 또는 프로세스 풀에서 코드를 실행하기:: 
* Error handling API:: 
* 디버그 모드 활성화:: 
* Running subprocesses:: 

@end menu

@node 루프 실행 및 중지,콜백 예약하기,,Event loop methods
@anchor{library/asyncio-eventloop running-and-stopping-the-loop}@anchor{38b8}
@subsubsection 루프 실행 및 중지


@geindex run_until_complete() (asyncio.loop 메서드)
@anchor{library/asyncio-eventloop asyncio loop run_until_complete}@anchor{e71}
@deffn {메서드} loop.run_until_complete (future)

`future'(@ref{dc5,,Future}의 인스턴스)가 완료할 때까지 실행합니다.

인자가 @ref{37e9,,코루틴 객체} 면, @ref{1c7,,asyncio.Task}로 실행되도록 묵시적으로 예약 됩니다.

퓨처의 결과를 반환하거나 퓨처의 예외를 일으킵니다.
@end deffn

@geindex run_forever() (asyncio.loop 메서드)
@anchor{library/asyncio-eventloop asyncio loop run_forever}@anchor{38b9}
@deffn {메서드} loop.run_forever ()

@ref{e76,,stop()}가 호출될 때까지 이벤트 루프를 실행합니다.

@ref{38b9,,run_forever()} 가 호출되기 전에 @ref{e76,,stop()} 이 호출되었으면, 루프는 시간제한 0으로 I/O 셀렉터를 한 번 폴링하고, I/O 이벤트에 따라 예약된 모든 콜백(과 이미 예약된 것들)을 실행한 다음 종료합니다.

만약 @ref{e76,,stop()} 이 @ref{38b9,,run_forever()} 가 실행 중일 때 호출되면, 루프는 현재 걸려있는 콜백들을 실행한 다음 종료합니다. 콜백에 의해 예약되는 새 콜백은 이 경우 실행되지 않습니다; 대신 그것들은 다음에 @code{run_forever()}나 @ref{e71,,run_until_complete()}가 호출될 때 실행됩니다.
@end deffn

@geindex stop() (asyncio.loop 메서드)
@anchor{library/asyncio-eventloop asyncio loop stop}@anchor{e76}
@deffn {메서드} loop.stop ()

이벤트 루프를 중지합니다.
@end deffn

@geindex is_running() (asyncio.loop 메서드)
@anchor{library/asyncio-eventloop asyncio loop is_running}@anchor{38ba}
@deffn {메서드} loop.is_running ()

이벤트 루프가 현재 실행 중이면 @code{True} 를 반환합니다.
@end deffn

@geindex is_closed() (asyncio.loop 메서드)
@anchor{library/asyncio-eventloop asyncio loop is_closed}@anchor{fc2}
@deffn {메서드} loop.is_closed ()

이벤트 루프가 닫혔으면 @code{True} 를 반환합니다.
@end deffn

@geindex close() (asyncio.loop 메서드)
@anchor{library/asyncio-eventloop asyncio loop close}@anchor{38bb}
@deffn {메서드} loop.close ()

이벤트 루프를 닫습니다.

이 함수를 호출할 때 루프는 반드시 실행 중이지 않아야 합니다. 계류 중인 모든 콜백을 버립니다.

이 메서드는 모든 큐를 비우고 실행기를 종료하지만, 실행기가 완료할 때까지 기다리지 않습니다.

이 메서드는 멱등적(itempotent)이고 되돌릴 수 없습니다. 이벤트 루프가 닫힌 후에 다른 메서드를 호출해서는 안 됩니다.
@end deffn

@geindex shutdown_asyncgens() (asyncio.loop 메서드)
@anchor{library/asyncio-eventloop asyncio loop shutdown_asyncgens}@anchor{e78}
@deffn {메서드} async loop.shutdown_asyncgens ()

현재 열려있는 @ref{249b,,비동기 제너레이터} 객체를 모두 @ref{ad5,,aclose()} 호출로 닫도록 예약 합니다. 이 메서드를 호출한 후에는, 새 비동기 생성기가 이터레이트 되면 이벤트 루프에서 경고를 보냅니다. 예약된 모든 비동기 제너레이터를 신뢰성 있게 종료하는 데 사용해야 합니다.

@ref{2f3,,asyncio.run()}가 사용될 때 이 함수를 호출할 필요는 없다는 점에 유의하세요.

예:

@example
try:
    loop.run_forever()
finally:
    loop.run_until_complete(loop.shutdown_asyncgens())
    loop.close()
@end example


Added in version 3.6.

@end deffn

@geindex shutdown_default_executor() (asyncio.loop 메서드)
@anchor{library/asyncio-eventloop asyncio loop shutdown_default_executor}@anchor{ae4}
@deffn {메서드} async loop.shutdown_default_executor (timeout=None)

기본 실행기의 닫힘을 예약하고 @ref{948,,ThreadPoolExecutor}의 모든 스레드가 조인(join)될 때까지 기다립니다. 이 메서드가 호출된 후, @ref{ae6,,loop.run_in_executor()}로 기본 실행기를 사용하면 @ref{244,,RuntimeError}가 발생합니다.

The `timeout' parameter specifies the amount of time
(in @ref{196,,float} seconds) the executor will be given to finish joining.
With the default, @code{None},
the executor is allowed an unlimited amount of time.

If the `timeout' is reached, a @ref{4d8,,RuntimeWarning} is emitted
and the default executor is terminated
without waiting for its threads to finish joining.

@cartouche
@quotation 참고 
Do not call this method when using @ref{2f3,,asyncio.run()},
as the latter handles default executor shutdown automatically.
@end quotation
@end cartouche


Added in version 3.9.



버전 3.12에서 변경: `timeout' 매개 변수가 추가되었습니다.

@end deffn

@node 콜백 예약하기,지연된 콜백 예약,루프 실행 및 중지,Event loop methods
@anchor{library/asyncio-eventloop scheduling-callbacks}@anchor{38bc}
@subsubsection 콜백 예약하기


@geindex call_soon() (asyncio.loop 메서드)
@anchor{library/asyncio-eventloop asyncio loop call_soon}@anchor{cf9}
@deffn {메서드} loop.call_soon (callback, *args, context=None)

이벤트 루프의 다음 이터레이션 때 `args' 인자로 호출할 `callback' @ref{2dc3,,콜백}을 예약합니다.

@ref{1e80,,asyncio.Handle} 인스턴스를 반환하는데, 나중에 콜백을 취소하는 데 사용할 수 있습니다.

콜백은 등록된 순서대로 호출됩니다. 각 콜백은 정확히 한 번 호출됩니다.

선택적인 키워드 전용 `context' 인자는 `callback' 을 실행할 사용자 정의 @ref{177,,contextvars.Context} 를 지정합니다. `context' 가 제공되지 않을 때, 콜백은 현재 컨텍스트를 사용합니다.

@ref{cfa,,call_soon_threadsafe()}와 달리, 이 메서드는 스레드 안전하지 않습니다.
@end deffn

@geindex call_soon_threadsafe() (asyncio.loop 메서드)
@anchor{library/asyncio-eventloop asyncio loop call_soon_threadsafe}@anchor{cfa}
@deffn {메서드} loop.call_soon_threadsafe (callback, *args, context=None)

스레드 안전한 @ref{cf9,,call_soon()} 변형입니다. @code{call_soon()}은 스레드 안전하지 않기 때문에, 다른 스레드에서 콜백을 예약할 때, `반드시' 이 함수를 사용해야 합니다.

This function is safe to be called from a reentrant context or signal handler,
however, it is not safe or fruitful to use the returned handle in such contexts.

Raises @ref{244,,RuntimeError} if called on a loop that’s been closed.
This can happen on a secondary thread when the main application is
shutting down.

설명서의 @ref{3819,,동시성과 다중 스레딩} 절을 참고하십시오.


버전 3.7에서 변경: `context' 키워드 전용 매개 변수가 추가되었습니다. 자세한 정보는 
@geindex Python 향상 제안; PEP 567
PEP 567@footnote{https://peps.python.org/pep-0567/}을 보십시오.

@end deffn
@anchor{library/asyncio-eventloop asyncio-pass-keywords}@anchor{38bd}
@cartouche
@quotation 참고 
대부분 @ref{b,,asyncio} 예약 함수는 키워드 인자 전달을 허용하지 않습니다. 그렇게 하려면 @ref{217,,functools.partial()}을 사용하십시오:

@example
# "print("Hello", flush=True)" 를 예약합니다
loop.call_soon(
    functools.partial(print, "Hello", flush=True))
@end example

asyncio는 디버그 및 오류 메시지에서 partial 객체를 더욱 잘 표시할 수 있으므로, partial 객체를 사용하는 것이 람다를 사용하는 것보다 편리합니다.
@end quotation
@end cartouche

@node 지연된 콜백 예약,Creating futures and tasks,콜백 예약하기,Event loop methods
@anchor{library/asyncio-eventloop asyncio-delayed-calls}@anchor{38be}@anchor{library/asyncio-eventloop scheduling-delayed-callbacks}@anchor{38bf}
@subsubsection 지연된 콜백 예약


이벤트 루프는 콜백 함수가 미래의 어떤 시점에서 호출되도록 예약하는 메커니즘을 제공합니다. 이벤트 루프는 단조 시계를 사용하여 시간을 추적합니다.

@geindex call_later() (asyncio.loop 메서드)
@anchor{library/asyncio-eventloop asyncio loop call_later}@anchor{cfb}
@deffn {메서드} loop.call_later (delay, callback, *args, context=None)

지정된 `delay' 초 (int 또는 float) 뒤에 `callback' 이 호출되도록 예약합니다.

@ref{1adb,,asyncio.TimerHandle} 의 인스턴스가 반환되는데, 콜백을 취소하는 데 사용할 수 있습니다.

`callback' 은 정확히 한번 호출됩니다. 두 콜백이 정확히 같은 시간에 예약되면, 어떤 것이 먼저 호출되는지는 정의되지 않습니다.

The optional positional `args' will be passed to the callback when
it is called. Use @ref{217,,functools.partial()}
@ref{38bd,,to pass keyword arguments} to
`callback'.

선택적인 키워드 전용 `context' 인자는 `callback' 을 실행할 사용자 정의 @ref{177,,contextvars.Context} 를 지정할 수 있게 합니다. `context' 가 제공되지 않을 때는 현재 컨텍스트가 사용됩니다.

@cartouche
@quotation 참고 
For performance, callbacks scheduled with @code{loop.call_later()}
may run up to one clock-resolution early (see
@code{time.get_clock_info('monotonic').resolution}).
@end quotation
@end cartouche


버전 3.7에서 변경: `context' 키워드 전용 매개 변수가 추가되었습니다. 자세한 정보는 
@geindex Python 향상 제안; PEP 567
PEP 567@footnote{https://peps.python.org/pep-0567/}을 보십시오.



버전 3.8에서 변경: 파이썬 3.7 및 이전 버전에서 기본 이벤트 루프 구현을 사용할 때, `delay'는 하루를 초과할 수 없었습니다. 이 문제는 파이썬 3.8에서 수정되었습니다.

@end deffn

@geindex call_at() (asyncio.loop 메서드)
@anchor{library/asyncio-eventloop asyncio loop call_at}@anchor{cfc}
@deffn {메서드} loop.call_at (when, callback, *args, context=None)

지정된 절대 타임스탬프 `when'(int 또는 float)에 `callback' 이 호출되도록 예약합니다. @ref{38c0,,loop.time()} 과 같은 시간 참조를 사용하십시오.

이 메서드의 동작은 @ref{cfb,,call_later()}와 같습니다.

@ref{1adb,,asyncio.TimerHandle} 의 인스턴스가 반환되는데, 콜백을 취소하는 데 사용할 수 있습니다.

@cartouche
@quotation 참고 
For performance, callbacks scheduled with @code{loop.call_at()}
may run up to one clock-resolution early (see
@code{time.get_clock_info('monotonic').resolution}).
@end quotation
@end cartouche


버전 3.7에서 변경: `context' 키워드 전용 매개 변수가 추가되었습니다. 자세한 정보는 
@geindex Python 향상 제안; PEP 567
PEP 567@footnote{https://peps.python.org/pep-0567/}을 보십시오.



버전 3.8에서 변경: 파이썬 3.7 및 이전 버전에서 기본 이벤트 루프 구현을 사용할 때, `when'와 현재 시각의 차이는 하루를 초과할 수 없었습니다. 이 문제는 파이썬 3.8에서 수정되었습니다.

@end deffn

@geindex time() (asyncio.loop 메서드)
@anchor{library/asyncio-eventloop asyncio loop time}@anchor{38c0}
@deffn {메서드} loop.time ()

이벤트 루프의 내부 단조 시계에 따라, @ref{196,,float} 값으로 현재 시각을 반환합니다.
@end deffn

@cartouche
@quotation 참고 

버전 3.8에서 변경: 파이썬 3.7 및 이전 버전에서 제한 시간(상대적인 `delay' 나 절대적인 `when')은 1일을 초과하지 않아야 했습니다. 이 문제는 파이썬 3.8에서 수정되었습니다.

@end quotation
@end cartouche


@subsubheading 더 보기


@ref{c63,,asyncio.sleep()} 함수.


@node Creating futures and tasks,네트워크 연결 열기,지연된 콜백 예약,Event loop methods
@anchor{library/asyncio-eventloop creating-futures-and-tasks}@anchor{38c1}
@subsubsection Creating futures and tasks


@geindex create_future() (asyncio.loop 메서드)
@anchor{library/asyncio-eventloop asyncio loop create_future}@anchor{e73}
@deffn {메서드} loop.create_future ()

이벤트 루프에 연결된 @ref{dc5,,asyncio.Future} 객체를 만듭니다.

이것이 asyncio에서 퓨처를 만드는 데 선호되는 방법입니다. 이렇게 하면 제삼자 이벤트 루프가 Future 객체의 다른 구현(더 나은 성능이나 계측(instrumentation))을 제공할 수 있습니다


Added in version 3.5.2.

@end deffn

@geindex create_task() (asyncio.loop 메서드)
@anchor{library/asyncio-eventloop asyncio loop create_task}@anchor{1ca}
@deffn {메서드} loop.create_task (coro, *, name=None, context=None, eager_start=None, **kwargs)

@ref{37e9,,코루틴} `coro'의 실행을 예약합니다. @ref{1c7,,Task} 객체를 반환합니다.

제삼자 이벤트 루프는 상호 운용성을 위해 자신만의 @ref{1c7,,Task} 의 서브 클래스를 사용할 수 있습니다. 이 경우, 결과 형은 @code{Task} 의 서브 클래스입니다.

The full function signature is largely the same as that of the
@ref{1c7,,Task} constructor (or factory) - all of the keyword arguments to
this function are passed through to that interface.

`name' 인자가 제공되고 @code{None}이 아니면, @ref{bcf,,Task.set_name()}을 사용하여 태스크의 이름으로 설정됩니다.

선택적인 키워드 전용 `context' 인자는 `coro' 를 실행할 사용자 정의 @ref{177,,contextvars.Context} 를 지정할 수 있게 합니다. `context' 가 제공되지 않을 때는 현재 컨텍스트 사본이 만들어집니다.

An optional keyword-only `eager_start' argument allows specifying
if the task should execute eagerly during the call to create_task,
or be scheduled later. If `eager_start' is not passed the mode set
by @ref{1c8,,loop.set_task_factory()} will be used.


버전 3.8에서 변경: `name' 매개 변수가 추가되었습니다.



버전 3.11에서 변경: `context' 매개 변수가 추가되었습니다.



버전 3.13.3에서 변경: Added @code{kwargs} which passes on arbitrary extra parameters, including  @code{name} and @code{context}.



버전 3.13.4에서 변경: Rolled back the change that passes on `name' and `context' (if it is None),
while still passing on other arbitrary keyword arguments (to avoid breaking backwards compatibility with 3.13.3).



버전 3.14에서 변경: All `kwargs' are now passed on. The `eager_start' parameter works with eager task factories.

@end deffn

@geindex set_task_factory() (asyncio.loop 메서드)
@anchor{library/asyncio-eventloop asyncio loop set_task_factory}@anchor{1c8}
@deffn {메서드} loop.set_task_factory (factory)

@ref{1ca,,loop.create_task()} 에 의해 사용되는 태스크 팩토리를 설정합니다.

`factory' 가 @code{None} 이면 기본 태스크 팩토리가 설정됩니다. 그렇지 않으면, `factory' 는 반드시 `콜러블' 이어야 하고, @code{(loop, coro, **kwargs)} 과 일치하는 서명을 가져야 합니다. 여기서 `loop' 는 활성 이벤트 루프에 대한 참조가 되고, `coro' 는 코루틴 객체가 됩니다. 콜러블은 모든 `kwargs' 를 전달해야 하며, @ref{1c7,,asyncio.Task} 호환 객체를 반환해야 합니다.


버전 3.13.3에서 변경: Required that all `kwargs' are passed on to @ref{1c7,,asyncio.Task}.



버전 3.13.4에서 변경: `name' is no longer passed to task factories. `context' is no longer passed
to task factories if it is @code{None}.


버전 3.14에서 변경: `name' and `context' are now unconditionally passed on to task factories again.


@end deffn

@geindex get_task_factory() (asyncio.loop 메서드)
@anchor{library/asyncio-eventloop asyncio loop get_task_factory}@anchor{fc4}
@deffn {메서드} loop.get_task_factory ()

태스크 팩토리를 반환하거나, 기본값이 사용 중이면 @code{None} 을 반환합니다.
@end deffn

@node 네트워크 연결 열기,네트워크 서버 만들기,Creating futures and tasks,Event loop methods
@anchor{library/asyncio-eventloop opening-network-connections}@anchor{38c2}
@subsubsection 네트워크 연결 열기


@geindex create_connection() (asyncio.loop 메서드)
@anchor{library/asyncio-eventloop asyncio loop create_connection}@anchor{817}
@deffn {메서드} async loop.create_connection (protocol_factory, host=None, port=None, *, ssl=None, family=0, proto=0, flags=0, sock=None, local_addr=None, server_hostname=None, ssl_handshake_timeout=None, ssl_shutdown_timeout=None, happy_eyeballs_delay=None, interleave=None, all_errors=False)

주어진 `host' 와 `port'로 지정된 주소로의 스트리밍 트랜스포트 연결을 엽니다.

소켓 패밀리는 `host'(또는 지정된 경우 `family')에 따라 @ref{1bab,,AF_INET} 또는 @ref{1bac,,AF_INET6}일 수 있습니다.

소켓 유형은 @ref{14f8,,SOCK_STREAM}이 됩니다.

`protocol_factory' 는 반드시 @ref{38c3,,asyncio 프로토콜} 구현을 반환하는 콜러블이어야 합니다.

이 메서드는 백그라운드에서 연결을 맺으려고 시도합니다. 성공하면, @code{(transport, protocol)} 쌍을 반환합니다.

하부 연산의 시간순 개요는 다음과 같습니다:


@enumerate 

@item 
연결이 맺어지고, 이를 위한 @ref{38c4,,트랜스포트(transport)} 가 만들어집니다.

@item 
`protocol_factory' 가 인자 없이 호출되고, @ref{38c3,,프로토콜(protocol)} 인스턴스를 반환할 것으로 기대됩니다.

@item 
프로토콜 인스턴스는 @code{connection_made()} 메서드를 호출함으로써 트랜스포트와 연결됩니다.

@item 
성공하면 @code{(transport, protocol)} 튜플이 반환됩니다.
@end enumerate

만들어진 트랜스포트는 구현 의존적인 양방향 스트림입니다.

다른 인자들:


@itemize *

@item 
`ssl': 주어지고 거짓이 아니면, SSL/TLS 트랜스포트가 만들어집니다 (기본적으로는 평범한 TCP 트랜스포트가 만들어집니다). `ssl' 이 @ref{357,,ssl.SSLContext} 객체면, 트랜스포트를 만들 때 이 컨텍스트가 사용됩니다; `ssl' 이 @ref{e06,,True} 면, @ref{480,,ssl.create_default_context()} 가 반환하는 기본 컨텍스트가 사용됩니다.


@subsubheading 더 보기


@ref{38c5,,SSL/TLS 보안 고려 사항}


@item 
`server_hostname'는 대상 서버의 인증서가 일치될 호스트 이름을 설정하거나 대체합니다. `ssl'이 @code{None}이 아닐 때만 전달되어야 합니다. 기본적으로 `host' 인자의 값이 사용됩니다. `host' 가 비어 있으면, 기본값이 없고 `server_hostname' 값을 전달해야 합니다. `server_hostname' 이 빈 문자열이면, 호스트 이름 일치가 비활성화됩니다 (이것은 심각한 보안 위험으로, 잠재적인 중간자 공격을 허용하게 됩니다).

@item 
`family', `proto', `flags' 는 `host' 결정을 위해 getaddrinfo() 에 전달할 선택적 주소 패밀리, 프로토콜, 플래그입니다. 주어지면, 이것들은 모두 해당하는 @ref{d1,,socket} 모듈 상수에 대응하는 정수여야 합니다.

@item 
주어지면, `happy_eyeballs_delay'는 이 연결에 대해 Happy Eyeballs를 활성화합니다. 다음 시도를 병렬로 시작하기 전에, 연결 시도가 완료되기를 기다리는 시간(초)을 나타내는 부동 소수점 숫자여야 합니다. 이것은 
@geindex RFC; RFC 8305
RFC 8305@footnote{https://datatracker.ietf.org/doc/html/rfc8305.html}에 정의된 “연결 시도 지연(Connection Attempt Delay)” 입니다. RFC에서 권장하는 적절한 기본값은 @code{0.25}(250밀리 초)입니다.

@item 
`interleave'는 호스트 이름이 여러 IP 주소로 해석될 때 주소 재정렬을 제어합니다. @code{0}이거나 지정되지 않으면, 재정렬이 수행되지 않고, 주소는 @ref{e0d,,getaddrinfo()}에 의해 반환된 순서대로 시도됩니다. 양의 정수가 지정되면, 주소는 주소 패밀리에 의해 인터리브 되고, 주어진 정수는 
@geindex RFC; RFC 8305
RFC 8305@footnote{https://datatracker.ietf.org/doc/html/rfc8305.html}에 정의된 대로 “첫 번째 주소 패밀리 수(First Address Family Count)”로 해석됩니다. 기본값은 `happy_eyeballs_delay'가 지정되지 않으면 @code{0}이고, 지정되면 @code{1}입니다.

@item 
`sock' 이 주어지면, 트랜스포트가 사용할, 기존의 이미 연결된 @ref{fa0,,socket.socket} 객체여야 합니다. `sock' 이 주어지면, `host', `port', `family', `proto', `flags', `happy_eyeballs_delay', `interleave', `local_addr' 를 지정해서는 안 됩니다.

@cartouche
@quotation 참고 
The `sock' argument transfers ownership of the socket to the
transport created. To close the socket, call the transport’s
@ref{38c6,,close()} method.
@end quotation
@end cartouche

@item 
`local_addr' 이 주어지면, 소켓을 로컬에 바인드 하는데 사용되는 @code{(local_host, local_port)} 튜플이어야 합니다. `local_host' 와 `local_port' 는 `host' 및 `port' 와 유사하게 @code{getaddrinfo()} 를 사용하여 조회됩니다.

@item 
`ssl_handshake_timeout' 은 (TLS 연결의 경우) 연결을 중단하기 전에 TLS 핸드 셰이크가 완료될 때까지 대기하는 시간(초)입니다. @code{None} (기본값) 이면 @code{60.0} 초가 사용됩니다.

@item 
`ssl_shutdown_timeout' 은 연결을 중단하기 전에 SSL 종료가 완료될 때까지 대기하는 시간(초)입니다. @code{None} (기본값) 이면 @code{30.0} 초가 사용됩니다.

@item 
`all_errors' determines what exceptions are raised when a connection cannot
be created. By default, only a single @code{Exception} is raised: the first
exception if there is only one or all errors have same message, or a single
@code{OSError} with the error messages combined. When @code{all_errors} is @code{True},
an @code{ExceptionGroup} will be raised containing all exceptions (even if there
is only one).
@end itemize


버전 3.5에서 변경: @ref{81c,,ProactorEventLoop}에 SSL/TLS에 대한 지원이 추가되었습니다.



버전 3.6에서 변경: 소켓 옵션 @ref{d6b,,socket.TCP_NODELAY}는 기본적으로 모든 TCP 연결에 대해 설정됩니다.



버전 3.7에서 변경: `ssl_handshake_timeout' 매개 변수를 추가했습니다.



버전 3.8에서 변경: `happy_eyeballs_delay'와 `interleave' 매개 변수가 추가되었습니다.

Happy Eyeballs 알고리즘: 듀얼 스택 호스트의 성공. 서버의 IPv4 경로와 프로토콜이 작동하지만, 서버의 IPv6 경로와 프로토콜은 작동하지 않을 때, 이중 스택 클라이언트 응용 프로그램은 IPv4 전용 클라이언트와 비교하여 상당한 연결 지연이 발생합니다. 이중 스택 클라이언트의 사용자 환경이 더 나빠지기 때문에 바람직하지 않습니다. 이 문서는 이런 사용자가 볼 수 있는 지연을 줄이고 알고리즘에 대한 요구 사항을 지정하고 알고리즘을 제공합니다.

자세한 정보: @indicateurl{https://datatracker.ietf.org/doc/html/rfc6555}



버전 3.11에서 변경: `ssl_shutdown_timeout' 매개 변수를 추가했습니다.



버전 3.12에서 변경: `all_errors' was added.



@subsubheading 더 보기


@ref{d0d,,open_connection()} 함수는 고수준 대안 API입니다. async/await 코드에서 직접 사용할 수 있는 (@ref{176b,,StreamReader}, @ref{1a70,,StreamWriter}) 쌍을 반환합니다.

@end deffn

@geindex create_datagram_endpoint() (asyncio.loop 메서드)
@anchor{library/asyncio-eventloop asyncio loop create_datagram_endpoint}@anchor{93b}
@deffn {메서드} async loop.create_datagram_endpoint (protocol_factory, local_addr=None, remote_addr=None, *, family=0, proto=0, flags=0, reuse_port=None, allow_broadcast=None, sock=None)

데이터 그램 연결을 만듭니다.

소켓 패밀리는 `host'(또는 주어지면 `family')에 따라 @ref{1bab,,AF_INET}, @ref{1bac,,AF_INET6} 또는 @ref{1bae,,AF_UNIX}일 수 있습니다.

소켓 유형은 @ref{14f7,,SOCK_DGRAM}이 됩니다.

`protocol_factory' 는 반드시 @ref{38c3,,프로토콜} 구현을 반환하는 콜러블이어야 합니다.

성공하면 @code{(transport, protocol)} 튜플이 반환됩니다.

다른 인자들:


@itemize *

@item 
`local_addr' 이 주어지면, 소켓을 로컬에 바인드 하는 데 사용되는 @code{(local_host, local_port)} 튜플입니다. `local_host' 와 `local_port' 는 @ref{e0d,,getaddrinfo()}를 사용하여 조회됩니다.

@cartouche
@quotation 참고 
On Windows, when using the proactor event loop with @code{local_addr=None},
an @ref{2c0,,OSError} with @code{errno.WSAEINVAL} will be raised
when running it.
@end quotation
@end cartouche

@item 
`remote_addr' 이 주어지면, 소켓을 원격 주소에 연결하는 데 사용되는 @code{(remote_host, remote_port)} 튜플입니다. `remote_host' 와 `remote_port' 는 @ref{e0d,,getaddrinfo()}를 사용하여 조회됩니다.

@item 
`family', `proto', `flags' 는 `host' 결정을 위해 @ref{e0d,,getaddrinfo()} 에 전달할 선택적 주소 패밀리, 프로토콜, 플래그입니다. 주어지면, 이것들은 모두 해당하는 @ref{d1,,socket} 모듈 상수에 대응하는 정수여야 합니다.

@item 
`reuse_port' 는 모두 만들 때 이 플래그를 설정하는 한, 이 말단이 다른 기존 말단이 바인드 된 것과 같은 포트에 바인드 되도록 허용하도록 커널에 알려줍니다. 이 옵션은 윈도우나 일부 유닉스에서는 지원되지 않습니다. @ref{d6b,,socket.SO_REUSEPORT} 상수가 정의되어 있지 않으면, 이 기능은 지원되지 않는 것입니다.

@item 
`allow_broadcast' 는 이 말단이 브로드캐스트 주소로 메시지를 보낼 수 있도록 커널에 알립니다.

@item 
`sock' 은 트랜스포트가 사용할 소켓 객체로, 기존의 이미 연결된 @ref{fa0,,socket.socket} 객체를 사용하기 위해 선택적으로 지정할 수 있습니다. 지정되면 `local_addr' 과 `remote_addr' 를 생략해야 합니다 (반드시 @ref{884,,None} 이어야 합니다).

@cartouche
@quotation 참고 
The `sock' argument transfers ownership of the socket to the
transport created. To close the socket, call the transport’s
@ref{38c6,,close()} method.
@end quotation
@end cartouche
@end itemize

@ref{38c7,,UDP 메아리 클라이언트 프로토콜} 과 @ref{38c8,,UDP 메아리 서버 프로토콜} 예제를 참고하세요.


버전 3.4.4에서 변경: `family', `proto', `flags', `reuse_address', `reuse_port', `allow_broadcast', `sock' 매개 변수가 추가되었습니다.



버전 3.8에서 변경: 윈도우에 대한 지원이 추가되었습니다.



버전 3.8.1에서 변경: `reuse_address' 매개 변수는 더는 지원되지 않습니다, @ref{d6b,,socket.SO_REUSEADDR}를 사용하면 UDP에서 심각한 보안 문제가 발생하기 때문입니다. @code{reuse_address=True}를 명시적으로 전달하면 예외가 발생합니다.

UID가 다른 여러 프로세스가 @code{SO_REUSEADDR}를 사용하여 소켓을 같은 UDP 소켓 주소에 할당하면, 들어오는 패킷이 소켓 간에 무작위로 분산될 수 있습니다.

지원되는 플랫폼의 경우, `reuse_port'를 유사한 기능의 대체품으로 사용할 수 있습니다. `reuse_port'에서는 @ref{d6b,,socket.SO_REUSEPORT}가 대신 사용되는데, 다른 UID를 가진 프로세스가 같은 소켓 주소에 소켓을 할당하지 못하게 구체적으로 막습니다.



버전 3.11에서 변경: The `reuse_address' parameter, disabled since Python 3.8.1,
3.7.6 and 3.6.10, has been entirely removed.

@end deffn

@geindex create_unix_connection() (asyncio.loop 메서드)
@anchor{library/asyncio-eventloop asyncio loop create_unix_connection}@anchor{3830}
@deffn {메서드} async loop.create_unix_connection (protocol_factory, path=None, *, ssl=None, sock=None, server_hostname=None, ssl_handshake_timeout=None, ssl_shutdown_timeout=None)

유닉스 연결을 만듭니다.

소켓 패밀리는 @ref{1bae,,AF_UNIX}가 됩니다; 소켓 유형은 @ref{14f8,,SOCK_STREAM}이 됩니다.

성공하면 @code{(transport, protocol)} 튜플이 반환됩니다.

`path' 는 유닉스 도메인 소켓의 이름이며, `sock' 매개 변수가 지정되지 않으면 필수입니다. 추상 유닉스 소켓, @ref{169,,str}, @ref{192,,bytes}, @ref{266,,Path} 경로가 지원됩니다.

이 메서드의 인자에 관한 정보는 @ref{817,,loop.create_connection()} 메서드의 설명서를 참조하십시오.

@ref{213c,,가용성}: Unix.


버전 3.7에서 변경: `ssl_handshake_timeout' 매개 변수를 추가했습니다. `path' 매개 변수는 이제 @ref{5a0,,경로류 객체} 가 될 수 있습니다.



버전 3.11에서 변경: `ssl_shutdown_timeout' 매개 변수를 추가했습니다.

@end deffn

@node 네트워크 서버 만들기,파일 전송,네트워크 연결 열기,Event loop methods
@anchor{library/asyncio-eventloop creating-network-servers}@anchor{38c9}
@subsubsection 네트워크 서버 만들기


@geindex create_server() (asyncio.loop 메서드)
@anchor{library/asyncio-eventloop loop-create-server}@anchor{37ee}@anchor{library/asyncio-eventloop asyncio loop create_server}@anchor{d08}
@deffn {메서드} async loop.create_server (protocol_factory, host=None, port=None, *, family=socket.AF_UNSPEC, flags=socket.AI_PASSIVE, sock=None, backlog=100, ssl=None, reuse_address=None, reuse_port=None, keep_alive=None, ssl_handshake_timeout=None, ssl_shutdown_timeout=None, start_serving=True)

`host' 주소의 `port' 에서 리스닝하는 TCP 서버(소켓 유형 @ref{14f8,,SOCK_STREAM})를 만듭니다.

@ref{d07,,Server} 객체를 반환합니다.

인자:


@itemize *

@item 
`protocol_factory' 는 반드시 @ref{38c3,,프로토콜} 구현을 반환하는 콜러블이어야 합니다.

@item 
`host' 매개 변수는 서버가 리스닝할 위치를 결정하는 여러 형으로 설정할 수 있습니다.:


@itemize -

@item 
`host'가 문자열이면, TCP 서버는 `host'로 지정된 단일 네트워크 인터페이스에 바인딩 됩니다.

@item 
`host'가 문자열의 시퀀스면, TCP 서버는 시퀀스로 지정된 모든 네트워크 인터페이스에 바인딩 됩니다.

@item 
`host'가 빈 문자열이거나 @code{None}이면, 모든 인터페이스가 사용되는 것으로 가정하고, 여러 소켓의 리스트가 반환됩니다 (대체로 IPv4 하나와 IPv6 하나).
@end itemize

@item 
The `port' parameter can be set to specify which port the server should
listen on. If @code{0} or @code{None} (the default), a random unused port will
be selected (note that if `host' resolves to multiple network interfaces,
a different random port will be selected for each interface).

@item 
`family' 는 @ref{1bab,,socket.AF_INET} 또는 @ref{1bac,,AF_INET6} 중 하나로 설정되어, 소켓이 IPv4 또는 IPv6을 사용하게 할 수 있습니다. 설정되지 않으면, `family' 는 호스트 이름에 의해 결정됩니다(기본값 @ref{38ca,,AF_UNSPEC}).

@item 
`flags' 은 @ref{e0d,,getaddrinfo()}를 위한 비트 마스크입니다.

@item 
`sock' 은 기존 소켓 객체를 사용하기 위해 선택적으로 지정할 수 있습니다. 지정되면, `host' 및 `port' 는 지정할 수 없습니다.

@cartouche
@quotation 참고 
The `sock' argument transfers ownership of the socket to the
server created. To close the socket, call the server’s
@ref{382e,,close()} method.
@end quotation
@end cartouche

@item 
`backlog' 는 @ref{105d,,listen()} 으로 전달되는 최대 대기 연결 수 입니다 (기본값은 100).

@item 
`ssl' 을 @ref{357,,SSLContext} 인스턴스로 설정하면, 들어오는 연결에 TLS를 사용합니다.

@item 
`reuse_address' 는, 일반적인 시간제한이 만료될 때까지 기다리지 않고, @code{TIME_WAIT} 상태의 로컬 소켓을 재사용하도록 커널에 알려줍니다. 지정하지 않으면 유닉스에서 자동으로 @code{True} 로 설정됩니다.

@item 
`reuse_port' 는 모두 만들 때 이 플래그를 설정하는 한, 이 말단이 다른 기존 말단이 바인드 된 것과 같은 포트에 바인드 되도록 허용하도록 커널에 알려줍니다. 이 옵션은 윈도우에서 지원되지 않습니다.

@item 
`keep_alive' set to @code{True} keeps connections active by enabling the
periodic transmission of messages.
@end itemize


버전 3.13에서 변경: `keep_alive' 매개 변수가 추가되었습니다.



@itemize *

@item 
`ssl_handshake_timeout' 은 (TLS 서버의 경우) 연결을 중단하기 전에 TLS 핸드 셰이크가 완료될 때까지 대기하는 시간(초)입니다. @code{None} (기본값) 이면 @code{60.0} 초가 사용됩니다.

@item 
`ssl_shutdown_timeout' 은 연결을 중단하기 전에 SSL 종료가 완료될 때까지 대기하는 시간(초)입니다. @code{None} (기본값) 이면 @code{30.0} 초가 사용됩니다.

@item 
`start_serving' 을 @code{True} (기본값) 로 설정하면, 생성된 서버가 즉시 연결을 받아들입니다. @code{False} 로 설정되면, 사용자는 서버가 연결을 받기 시작하도록 @ref{d09,,Server.start_serving()} 이나 @ref{d0a,,Server.serve_forever()}를 await 해야 합니다.
@end itemize


버전 3.5에서 변경: @ref{81c,,ProactorEventLoop}에 SSL/TLS에 대한 지원이 추가되었습니다.



버전 3.5.1에서 변경: `host' 매개 변수는 문자열의 시퀀스가 될 수 있습니다.



버전 3.6에서 변경: `ssl_handshake_timeout' 과 `start_serving' 매개 변수를 추가했습니다. 소켓 옵션 @ref{d6b,,socket.TCP_NODELAY}는 기본적으로 모든 TCP 연결에 대해 설정됩니다.



버전 3.11에서 변경: `ssl_shutdown_timeout' 매개 변수를 추가했습니다.



@subsubheading 더 보기


@ref{d0e,,start_server()} 함수는 async/await 코드에서 사용할 수 있는 @ref{176b,,StreamReader} 및 @ref{1a70,,StreamWriter} 쌍을 반환하는 고수준의 대체 API입니다.

@end deffn

@geindex create_unix_server() (asyncio.loop 메서드)
@anchor{library/asyncio-eventloop asyncio loop create_unix_server}@anchor{4cb}
@deffn {메서드} async loop.create_unix_server (protocol_factory, path=None, *, sock=None, backlog=100, ssl=None, ssl_handshake_timeout=None, ssl_shutdown_timeout=None, start_serving=True, cleanup_socket=True)

@ref{d08,,loop.create_server()}와 유사하지만, 소켓 패밀리 @ref{1bae,,AF_UNIX} 용입니다.

`path' 는 유닉스 도메인 소켓의 이름이며, `sock' 매개 변수가 제공되지 않으면 필수입니다. 추상 유닉스 소켓, @ref{169,,str}, @ref{192,,bytes}, @ref{266,,Path} 경로가 지원됩니다.

If `cleanup_socket' is true then the Unix socket will automatically
be removed from the filesystem when the server is closed, unless the
socket has been replaced after the server has been created.

이 메서드의 인자에 대한 정보는 @ref{d08,,loop.create_server()} 메서드의 설명서를 참조하십시오.

@ref{213c,,가용성}: Unix.


버전 3.7에서 변경: `ssl_handshake_timeout' 과 `start_serving' 매개 변수를 추가했습니다. `path' 매개 변수는 이제 @ref{266,,Path} 객체일 수 있습니다.



버전 3.11에서 변경: `ssl_shutdown_timeout' 매개 변수를 추가했습니다.



버전 3.13에서 변경: `cleanup_socket' 매개 변수가 추가되었습니다.

@end deffn

@geindex connect_accepted_socket() (asyncio.loop 메서드)
@anchor{library/asyncio-eventloop asyncio loop connect_accepted_socket}@anchor{9de}
@deffn {메서드} async loop.connect_accepted_socket (protocol_factory, sock, *, ssl=None, ssl_handshake_timeout=None, ssl_shutdown_timeout=None)

이미 받아들인 연결을 트랜스포트/프로토콜 쌍으로 래핑합니다.

이 메서드는 asyncio 밖에서 연결을 받아들이지만, 그 연결을 처리하는데 asyncio 를 사용하는 서버에서 사용됩니다.

매개 변수:


@itemize *

@item 
`protocol_factory' 는 반드시 @ref{38c3,,프로토콜} 구현을 반환하는 콜러블이어야 합니다.

@item 
`sock' 은 @ref{fa1,,socket.accept} 가 반환한 기존 소켓 객체입니다.

@cartouche
@quotation 참고 
The `sock' argument transfers ownership of the socket to the
transport created. To close the socket, call the transport’s
@ref{38c6,,close()} method.
@end quotation
@end cartouche

@item 
`ssl' 을 @ref{357,,SSLContext} 로 설정하면, 들어오는 연결에 SSL을 사용합니다.

@item 
`ssl_handshake_timeout' 은 (SSL 연결의 경우) 연결을 중단하기 전에 SSL 핸드 셰이크가 완료될 때까지 대기하는 시간(초)입니다. @code{None} (기본값) 이면 @code{60.0} 초가 사용됩니다.

@item 
`ssl_shutdown_timeout' 은 연결을 중단하기 전에 SSL 종료가 완료될 때까지 대기하는 시간(초)입니다. @code{None} (기본값) 이면 @code{30.0} 초가 사용됩니다.
@end itemize

@code{(transport, protocol)} 쌍을 반환합니다.


Added in version 3.5.3.



버전 3.7에서 변경: `ssl_handshake_timeout' 매개 변수를 추가했습니다.



버전 3.11에서 변경: `ssl_shutdown_timeout' 매개 변수를 추가했습니다.

@end deffn

@node 파일 전송,TLS upgrade,네트워크 서버 만들기,Event loop methods
@anchor{library/asyncio-eventloop transferring-files}@anchor{38cb}
@subsubsection 파일 전송


@geindex sendfile() (asyncio.loop 메서드)
@anchor{library/asyncio-eventloop asyncio loop sendfile}@anchor{38cc}
@deffn {메서드} async loop.sendfile (transport, file, offset=0, count=None, *, fallback=True)

`file' 을 `transport' 로 보냅니다. 전송된 총 바이트 수를 반환합니다.

이 메서드는 가능한 경우 고성능 @ref{d04,,os.sendfile()} 을 사용합니다.

`file' 는 바이너리 모드로 열린 일반 파일 객체여야 합니다.

`offset' 은 파일 읽기 시작할 위치를 알려줍니다. `count' 를 제공하면, EOF에 도달할 때까지 파일을 보내는 대신, 전송할 총 바이트 수를 지정합니다. 파일의 위치가 갱신됩니다, 이 메서드가 에러를 일으킬 때조차. 그리고, @ref{15b1,,file.tell()} 는 실제 전송된 바이트 수를 얻는 데 사용될 수 있습니다.

`fallback' 을 @code{True} 로 설정하면, 플랫폼이 sendfile 시스템 호출을 지원하지 않을 때 (가령 유닉스에서 SSL 소켓을 사용하거나 윈도우인 경우), asyncio 가 파일을 수동으로 읽고 보내도록 합니다.

시스템이 `sendfile' 시스템 호출을 지원하지 않고 `fallback' 이 @code{False} 면 @ref{38a3,,SendfileNotAvailableError} 를 발생시킵니다.


Added in version 3.7.

@end deffn

@node TLS upgrade,파일 기술자 관찰하기,파일 전송,Event loop methods
@anchor{library/asyncio-eventloop tls-upgrade}@anchor{38cd}
@subsubsection TLS upgrade


@geindex start_tls() (asyncio.loop 메서드)
@anchor{library/asyncio-eventloop asyncio loop start_tls}@anchor{cfe}
@deffn {메서드} async loop.start_tls (transport, protocol, sslcontext, *, server_side=False, server_hostname=None, ssl_handshake_timeout=None, ssl_shutdown_timeout=None)

기존 트랜스포트 기반 연결을 TLS로 업그레이드합니다.

Create a TLS coder/decoder instance and insert it between the `transport'
and the `protocol'. The coder/decoder implements both `transport'-facing
protocol and `protocol'-facing transport.

Return the created two-interface instance. After `await', the `protocol'
must stop using the original `transport' and communicate with the returned
object only because the coder caches `protocol'-side data and sporadically
exchanges extra TLS session packets with `transport'.

In some situations (e.g. when the passed transport is already closing) this
may return @code{None}.

매개 변수:


@itemize *

@item 
@ref{d08,,create_server()}와 @ref{817,,create_connection()} 같은 메서드가 반환하는 `transport' 와 `protocol' 인스턴스.

@item 
`sslcontext': 구성된 @ref{357,,SSLContext} 의 인스턴스.

@item 
(@ref{d08,,create_server()} 에 의해 생성된 것과 같은) 서버 측 연결이 업그레이드될 때 `server_side' 에 @code{True} 를 전달합니다.

@item 
`server_hostname': 대상 서버의 인증서가 일치될 호스트 이름을 설정하거나 대체합니다.

@item 
`ssl_handshake_timeout' 은 (TLS 연결의 경우) 연결을 중단하기 전에 TLS 핸드 셰이크가 완료될 때까지 대기하는 시간(초)입니다. @code{None} (기본값) 이면 @code{60.0} 초가 사용됩니다.

@item 
`ssl_shutdown_timeout' 은 연결을 중단하기 전에 SSL 종료가 완료될 때까지 대기하는 시간(초)입니다. @code{None} (기본값) 이면 @code{30.0} 초가 사용됩니다.
@end itemize


Added in version 3.7.



버전 3.11에서 변경: `ssl_shutdown_timeout' 매개 변수를 추가했습니다.

@end deffn

@node 파일 기술자 관찰하기,소켓 객체로 직접 작업하기,TLS upgrade,Event loop methods
@anchor{library/asyncio-eventloop watching-file-descriptors}@anchor{38ce}
@subsubsection 파일 기술자 관찰하기


@geindex add_reader() (asyncio.loop 메서드)
@anchor{library/asyncio-eventloop asyncio loop add_reader}@anchor{384b}
@deffn {메서드} loop.add_reader (fd, callback, *args)

`fd' 파일 기술자가 읽기 가능한지 관찰하기 시작하고, 일단 `fd'가 읽기 가능해지면 지정한 인자로 `callback' 을 호출합니다.

Any preexisting callback registered for `fd' is cancelled and replaced by
`callback'.
@end deffn

@geindex remove_reader() (asyncio.loop 메서드)
@anchor{library/asyncio-eventloop asyncio loop remove_reader}@anchor{38cf}
@deffn {메서드} loop.remove_reader (fd)

`fd' 파일 기술자가 읽기 가능한지 관찰하는 것을 중단합니다. `fd'가 이전에 읽기에 대해 관찰 중이었으면 @code{True}를 반환합니다.
@end deffn

@geindex add_writer() (asyncio.loop 메서드)
@anchor{library/asyncio-eventloop asyncio loop add_writer}@anchor{38d0}
@deffn {메서드} loop.add_writer (fd, callback, *args)

Start monitoring the `fd' file descriptor for write availability and
invoke `callback' with the specified arguments `args' once `fd' is
available for writing.

Any preexisting callback registered for `fd' is cancelled and replaced by
`callback'.

`callback' 에 @ref{38bd,,키워드 인자를 전달하려면} @ref{217,,functools.partial()}를 사용하십시오.
@end deffn

@geindex remove_writer() (asyncio.loop 메서드)
@anchor{library/asyncio-eventloop asyncio loop remove_writer}@anchor{38d1}
@deffn {메서드} loop.remove_writer (fd)

`fd' 파일 기술자가 쓰기 가능한지 관찰하는 것을 중단합니다. `fd'가 이전에 쓰기에 대해 관찰 중이었으면 @code{True}를 반환합니다.
@end deffn

이 메서드의 일부 제한 사항은 @ref{38d2,,플랫폼 지원} 절을 참조하십시오.

@node 소켓 객체로 직접 작업하기,DNS,파일 기술자 관찰하기,Event loop methods
@anchor{library/asyncio-eventloop working-with-socket-objects-directly}@anchor{38d3}
@subsubsection 소켓 객체로 직접 작업하기


일반적으로 @ref{817,,loop.create_connection()} 및 @ref{d08,,loop.create_server()}와 같은 트랜스포트 기반 API를 사용하는 프로토콜 구현은 소켓을 직접 사용하는 구현보다 빠릅니다. 그러나, 성능이 결정적이지 않고 @ref{fa0,,socket} 객체로 직접 작업하는 것이 더 편리한 사용 사례가 있습니다.

@geindex sock_recv() (asyncio.loop 메서드)
@anchor{library/asyncio-eventloop asyncio loop sock_recv}@anchor{e0a}
@deffn {메서드} async loop.sock_recv (sock, nbytes)

`sock' 에서 최대 `nbytes' 를 수신합니다. @ref{fa3,,socket.recv()} 의 비동기 버전.

수신한 데이터를 바이트열 객체로 반환합니다.

`sock' 은 반드시 비 블로킹 소켓이어야 합니다.


버전 3.7에서 변경: 이 메서드가 항상 코루틴 메서드라고 설명되어왔지만, 파이썬 3.7 이전에는 @ref{dc5,,Future}를 반환했습니다. 파이썬 3.7부터, 이것은 @code{async def} 메서드입니다.

@end deffn

@geindex sock_recv_into() (asyncio.loop 메서드)
@anchor{library/asyncio-eventloop asyncio loop sock_recv_into}@anchor{cff}
@deffn {메서드} async loop.sock_recv_into (sock, buf)

`sock' 에서 `buf' 버퍼로 데이터를 수신합니다. 블로킹 @ref{1522,,socket.recv_into()} 메서드를 따라 만들어졌습니다.

버퍼에 기록된 바이트 수를 돌려줍니다.

`sock' 은 반드시 비 블로킹 소켓이어야 합니다.


Added in version 3.7.

@end deffn

@geindex sock_recvfrom() (asyncio.loop 메서드)
@anchor{library/asyncio-eventloop asyncio loop sock_recvfrom}@anchor{81a}
@deffn {메서드} async loop.sock_recvfrom (sock, bufsize)

`sock' 에서 최대 `bufsize' 크기의 데이터그램을 수신합니다. @ref{fa4,,socket.recvfrom()} 의 비동기 버전.

(수신된 데이터, 원격 주소) 튜플을 반환합니다.

`sock' 은 반드시 비 블로킹 소켓이어야 합니다.


Added in version 3.11.

@end deffn

@geindex sock_recvfrom_into() (asyncio.loop 메서드)
@anchor{library/asyncio-eventloop asyncio loop sock_recvfrom_into}@anchor{81b}
@deffn {메서드} async loop.sock_recvfrom_into (sock, buf, nbytes=0)

`sock' 에서 최대 `nbytes' 크기의 데이터그램을 `buf'로 수신합니다. @ref{1523,,socket.recvfrom_into()} 의 비동기 버전.

(수신된 바이트 수, 원격 주소) 튜플을 반환합니다.

`sock' 은 반드시 비 블로킹 소켓이어야 합니다.


Added in version 3.11.

@end deffn

@geindex sock_sendall() (asyncio.loop 메서드)
@anchor{library/asyncio-eventloop asyncio loop sock_sendall}@anchor{e0b}
@deffn {메서드} async loop.sock_sendall (sock, data)

`data' 를 `sock' 소켓으로 보냅니다. @ref{fa7,,socket.sendall()} 의 비동기 버전.

이 메서드는 `data' 의 모든 데이터가 송신되거나 에러가 발생할 때까지 소켓으로 계속 송신합니다. 성공하면 @code{None} 이 반환됩니다. 에러가 발생하면 예외가 발생합니다. 또한, 연결의 수신 단에서 성공적으로 처리한 (있기는 하다면) 데이터의 크기를 확인하는 방법은 없습니다.

`sock' 은 반드시 비 블로킹 소켓이어야 합니다.


버전 3.7에서 변경: 이 메서드가 항상 코루틴 메서드라고 설명되어왔지만, 파이썬 3.7 이전에는 @ref{dc5,,Future}를 반환했습니다. 파이썬 3.7부터, 이것은 @code{async def} 메서드입니다.

@end deffn

@geindex sock_sendto() (asyncio.loop 메서드)
@anchor{library/asyncio-eventloop asyncio loop sock_sendto}@anchor{819}
@deffn {메서드} async loop.sock_sendto (sock, data, address)

`sock' 에서 데이터그램을 `address'로 보냅니다. @ref{fa8,,socket.sendto()} 의 비동기 버전.

보낸 바이트 수를 돌려줍니다.

`sock' 은 반드시 비 블로킹 소켓이어야 합니다.


Added in version 3.11.

@end deffn

@geindex sock_connect() (asyncio.loop 메서드)
@anchor{library/asyncio-eventloop asyncio loop sock_connect}@anchor{fc7}
@deffn {메서드} async loop.sock_connect (sock, address)

`sock'을 `address'에 있는 원격 소켓에 연결합니다.

@ref{fa2,,socket.connect()} 의 비동기 버전.

`sock' 은 반드시 비 블로킹 소켓이어야 합니다.


버전 3.5.2에서 변경: @code{address} 는 더는 결정될 필요가 없습니다. @code{sock_connect} 는 @ref{b5b,,socket.inet_pton()}을 호출하여 `address' 가 이미 결정되었는지를 검사합니다. 그렇지 않으면, @ref{e0d,,loop.getaddrinfo()} 가 `address' 를 결정하는 데 사용됩니다.



@subsubheading 더 보기


@ref{817,,loop.create_connection()}과 @ref{d0d,,asyncio.open_connection()}.

@end deffn

@geindex sock_accept() (asyncio.loop 메서드)
@anchor{library/asyncio-eventloop asyncio loop sock_accept}@anchor{e0c}
@deffn {메서드} async loop.sock_accept (sock)

연결을 받아들입니다. 블로킹 @ref{fa1,,socket.accept()} 메서드를 따라 만들어졌습니다.

소켓은 주소에 바인드 되어 연결을 리스닝해야 합니다. 반환 값은 @code{(conn, address)} 쌍인데, `conn' 은 연결로 데이터를 주고받을 수 있는 `새' 소켓 객체이고, `address' 는 연결의 반대편 끝의 소켓에 바인드 된 주소입니다.

`sock' 은 반드시 비 블로킹 소켓이어야 합니다.


버전 3.7에서 변경: 이 메서드가 항상 코루틴 메서드라고 설명되어왔지만, 파이썬 3.7 이전에는 @ref{dc5,,Future}를 반환했습니다. 파이썬 3.7부터, 이것은 @code{async def} 메서드입니다.



@subsubheading 더 보기


@ref{d08,,loop.create_server()}와 @ref{d0e,,start_server()}.

@end deffn

@geindex sock_sendfile() (asyncio.loop 메서드)
@anchor{library/asyncio-eventloop asyncio loop sock_sendfile}@anchor{d03}
@deffn {메서드} async loop.sock_sendfile (sock, file, offset=0, count=None, *, fallback=True)

가능하면 고성능 @ref{d04,,os.sendfile} 을 사용하여 파일을 보냅니다. 전송된 총 바이트 수를 반환합니다.

@ref{105c,,socket.sendfile()}의 비동기 버전.

`sock' 은 반드시 비 블로킹 @ref{14f8,,socket.SOCK_STREAM} @ref{fa0,,socket} 이어야 합니다.

`file' 는 바이너리 모드로 열린 일반 파일 객체여야 합니다.

`offset' 은 파일 읽기 시작할 위치를 알려줍니다. `count' 를 제공하면, EOF에 도달할 때까지 파일을 보내는 대신, 전송할 총 바이트 수를 지정합니다. 파일의 위치가 갱신됩니다, 이 메서드가 에러를 일으킬 때조차. 그리고, @ref{15b1,,file.tell()} 는 실제 전송된 바이트 수를 얻는 데 사용될 수 있습니다.

`fallback' 을 @code{True} 로 설정하면, 플랫폼이 sendfile 시스템 호출을 지원하지 않을 때 (가령 유닉스에서 SSL 소켓을 사용하거나 윈도우인 경우), asyncio 가 파일을 수동으로 읽고 보내도록 합니다.

시스템이 `sendfile' 시스템 호출을 지원하지 않고 `fallback' 이 @code{False} 면 @ref{38a3,,SendfileNotAvailableError} 를 발생시킵니다.

`sock' 은 반드시 비 블로킹 소켓이어야 합니다.


Added in version 3.7.

@end deffn

@node DNS,파이프로 작업하기,소켓 객체로 직접 작업하기,Event loop methods
@anchor{library/asyncio-eventloop dns}@anchor{38d4}
@subsubsection DNS


@geindex getaddrinfo() (asyncio.loop 메서드)
@anchor{library/asyncio-eventloop asyncio loop getaddrinfo}@anchor{e0d}
@deffn {메서드} async loop.getaddrinfo (host, port, *, family=0, type=0, proto=0, flags=0)

@ref{176f,,socket.getaddrinfo()} 의 비동기 버전.
@end deffn

@geindex getnameinfo() (asyncio.loop 메서드)
@anchor{library/asyncio-eventloop asyncio loop getnameinfo}@anchor{e0e}
@deffn {메서드} async loop.getnameinfo (sockaddr, flags=0)

@ref{1a3b,,socket.getnameinfo()} 의 비동기 버전.
@end deffn

@cartouche
@quotation 참고 
Both `getaddrinfo' and `getnameinfo' internally utilize their synchronous
versions through the loop’s default thread pool executor.
When this executor is saturated, these methods may experience delays,
which higher-level networking libraries may report as increased timeouts.
To mitigate this, consider using a custom executor for other user tasks,
or setting a default executor with a larger number of workers.
@end quotation
@end cartouche


버전 3.7에서 변경: `getaddrinfo' 와 `getnameinfo' 메서드는 모두 코루틴 메서드라고 설명되어왔지만, 파이썬 3.7 이전에 실제로는 @ref{dc5,,asyncio.Future} 객체를 반환했습니다. 파이썬 3.7부터 두 가지 메서드 모두 코루틴입니다.


@node 파이프로 작업하기,유닉스 시그널,DNS,Event loop methods
@anchor{library/asyncio-eventloop working-with-pipes}@anchor{38d5}
@subsubsection 파이프로 작업하기


@geindex connect_read_pipe() (asyncio.loop 메서드)
@anchor{library/asyncio-eventloop asyncio loop connect_read_pipe}@anchor{3879}
@deffn {메서드} async loop.connect_read_pipe (protocol_factory, pipe)

이벤트 루프에 `pipe'의 읽기용 끝을 등록합니다.

`protocol_factory' 는 반드시 @ref{38c3,,asyncio 프로토콜} 구현을 반환하는 콜러블이어야 합니다.

`pipe'는 @ref{13c8,,파일류 객체}입니다.

쌍 @code{(transport, protocol)}를 반환합니다. 여기서 `transport'는 @ref{38d6,,ReadTransport} 인터페이스를 지원하고, `protocol'은 `protocol_factory'에 의해 인스턴스로 만들어진 객체입니다.

@ref{314,,SelectorEventLoop} 이벤트 루프를 사용하면, `pipe' 는 비 블로킹 모드로 설정됩니다.
@end deffn

@geindex connect_write_pipe() (asyncio.loop 메서드)
@anchor{library/asyncio-eventloop asyncio loop connect_write_pipe}@anchor{387a}
@deffn {메서드} async loop.connect_write_pipe (protocol_factory, pipe)

이벤트 루프에 `pipe'의 쓰기용 끝을 등록합니다.

`protocol_factory' 는 반드시 @ref{38c3,,asyncio 프로토콜} 구현을 반환하는 콜러블이어야 합니다.

`pipe'는 @ref{13c8,,파일류 객체}입니다.

쌍 @code{(transport, protocol)}를 반환합니다. 여기서 `transport'는 @ref{38d7,,WriteTransport} 인터페이스를 지원하고, `protocol'은 `protocol_factory'에 의해 인스턴스로 만들어진 객체입니다.

@ref{314,,SelectorEventLoop} 이벤트 루프를 사용하면, `pipe' 는 비 블로킹 모드로 설정됩니다.
@end deffn

@cartouche
@quotation 참고 
윈도우에서 @ref{314,,SelectorEventLoop}는 위의 메서드들을 지원하지 않습니다. 윈도우에서는 대신 @ref{81c,,ProactorEventLoop}를 사용하십시오.
@end quotation
@end cartouche


@subsubheading 더 보기


@ref{3874,,loop.subprocess_exec()} 와 @ref{3875,,loop.subprocess_shell()} 메서드.


@node 유닉스 시그널,스레드 또는 프로세스 풀에서 코드를 실행하기,파이프로 작업하기,Event loop methods
@anchor{library/asyncio-eventloop unix-signals}@anchor{38d8}
@subsubsection 유닉스 시그널


@geindex add_signal_handler() (asyncio.loop 메서드)
@anchor{library/asyncio-eventloop loop-add-signal-handler}@anchor{37f0}@anchor{library/asyncio-eventloop asyncio loop add_signal_handler}@anchor{38d9}
@deffn {메서드} loop.add_signal_handler (signum, callback, *args)

Set `callback' as the handler for the `signum' signal,
passing `args' as positional arguments.

콜백은 다른 대기 중인 콜백과 해당 이벤트 루프의 실행 가능한 코루틴과 함께 `loop'에 의해 호출됩니다. @ref{1339,,signal.signal()}을 사용하여 등록된 시그널 처리기와 달리, 이 함수로 등록된 콜백은 이벤트 루프와 상호 작용할 수 있습니다.

시그널 번호가 유효하지 않거나 잡을 수 없으면 @ref{2ec,,ValueError} 를 발생시킵니다. 처리기를 설정하는 데 문제가 있는 경우 @ref{244,,RuntimeError} 를 발생시킵니다.

`callback' 에 @ref{38bd,,키워드 인자를 전달하려면} @ref{217,,functools.partial()}를 사용하십시오.

@ref{1339,,signal.signal()}와 마찬가지로, 이 함수는 메인 스레드에서 호출되어야 합니다.
@end deffn

@geindex remove_signal_handler() (asyncio.loop 메서드)
@anchor{library/asyncio-eventloop asyncio loop remove_signal_handler}@anchor{38da}
@deffn {메서드} loop.remove_signal_handler (sig)

`sig' 시그널의 처리기를 제거합니다.

시그널 처리기가 제거되면 @code{True} 를, 주어진 시그널에 처리기가 설정되지 않았으면 @code{False} 를 반환합니다.

@ref{213c,,가용성}: Unix.
@end deffn


@subsubheading 더 보기


@ref{cb,,signal} 모듈.


@node 스레드 또는 프로세스 풀에서 코드를 실행하기,Error handling API,유닉스 시그널,Event loop methods
@anchor{library/asyncio-eventloop executing-code-in-thread-or-process-pools}@anchor{38db}
@subsubsection 스레드 또는 프로세스 풀에서 코드를 실행하기


@geindex run_in_executor() (asyncio.loop 메서드)
@anchor{library/asyncio-eventloop asyncio loop run_in_executor}@anchor{ae6}
@deffn {메서드} awaitable loop.run_in_executor (executor, func, *args)

Arrange for `func' to be called in the specified executor
passing `args' as positional arguments.

The `executor' argument should be an @ref{3713,,concurrent.futures.Executor}
instance. The default executor is used if `executor' is @code{None}.
The default executor can be set by @ref{949,,loop.set_default_executor()},
otherwise, a @ref{948,,concurrent.futures.ThreadPoolExecutor} will be
lazy-initialized and used by @ref{ae6,,run_in_executor()} if needed.

예:

@example
import asyncio
import concurrent.futures

def blocking_io():
    # File operations (such as logging) can block the
    # event loop: run them in a thread pool.
    with open('/dev/urandom', 'rb') as f:
        return f.read(100)

def cpu_bound():
    # CPU-bound operations will block the event loop:
    # in general it is preferable to run them in a
    # process pool.
    return sum(i * i for i in range(10 ** 7))

async def main():
    loop = asyncio.get_running_loop()

    ## Options:

    # 1. Run in the default loop's executor:
    result = await loop.run_in_executor(
        None, blocking_io)
    print('default thread pool', result)

    # 2. Run in a custom thread pool:
    with concurrent.futures.ThreadPoolExecutor() as pool:
        result = await loop.run_in_executor(
            pool, blocking_io)
        print('custom thread pool', result)

    # 3. Run in a custom process pool:
    with concurrent.futures.ProcessPoolExecutor() as pool:
        result = await loop.run_in_executor(
            pool, cpu_bound)
        print('custom process pool', result)

    # 4. Run in a custom interpreter pool:
    with concurrent.futures.InterpreterPoolExecutor() as pool:
        result = await loop.run_in_executor(
            pool, cpu_bound)
        print('custom interpreter pool', result)

if __name__ == '__main__':
    asyncio.run(main())
@end example

Note that the entry point guard (@code{if __name__ == '__main__'})
is required for option 3 due to the peculiarities of @ref{98,,multiprocessing},
which is used by @ref{1d6,,ProcessPoolExecutor}.
See @ref{36fc,,Safe importing of main module}.

이 메서드는 @ref{dc5,,asyncio.Future} 객체를 반환합니다.

`func' 에 @ref{38bd,,키워드 인자를 전달하려면} @ref{217,,functools.partial()}를 사용하십시오.


버전 3.5.3에서 변경: @ref{ae6,,loop.run_in_executor()} 는 더는 자신이 만드는 스레드 풀 실행기의 @code{max_workers} 를 설정하지 않습니다. 대신 스레드 풀 실행기(@ref{948,,ThreadPoolExecutor})가 스스로 기본값을 설정하도록 합니다.

@end deffn

@geindex set_default_executor() (asyncio.loop 메서드)
@anchor{library/asyncio-eventloop asyncio loop set_default_executor}@anchor{949}
@deffn {메서드} loop.set_default_executor (executor)

Set `executor' as the default executor used by @ref{ae6,,run_in_executor()}.
`executor' must be an instance of
@ref{948,,ThreadPoolExecutor}, which includes
@ref{1d2,,InterpreterPoolExecutor}.


버전 3.11에서 변경: `executor'는 반드시 @ref{948,,ThreadPoolExecutor}의 인스턴스여야 합니다.

@end deffn

@node Error handling API,디버그 모드 활성화,스레드 또는 프로세스 풀에서 코드를 실행하기,Event loop methods
@anchor{library/asyncio-eventloop error-handling-api}@anchor{38dc}
@subsubsection Error handling API


이벤트 루프에서 예외를 처리하는 방법을 사용자 정의 할 수 있습니다.

@geindex set_exception_handler() (asyncio.loop 메서드)
@anchor{library/asyncio-eventloop asyncio loop set_exception_handler}@anchor{38dd}
@deffn {메서드} loop.set_exception_handler (handler)

`handler' 를 새 이벤트 루프 예외 처리기로 설정합니다.

`handler'가 @code{None} 이면, 기본 예외 처리기가 설정됩니다. 그렇지 않으면, `handler'는 반드시 @code{(loop, context)} 와 일치하는 서명을 가진 콜러블이어야 합니다. 여기서 @code{loop}는 활성 이벤트 루프에 대한 참조가 될 것이고, @code{context} 는 예외에 관한 세부 정보를 담고 있는 @code{dict} 객체가 됩니다 (context에 대한 자세한 내용은 @ref{38de,,call_exception_handler()} 문서를 참조하십시오).

If the handler is called on behalf of a @ref{1c7,,Task} or
@ref{1e80,,Handle}, it is run in the
@ref{177,,contextvars.Context} of that task or callback handle.


버전 3.12에서 변경: The handler may be called in the @ref{177,,Context}
of the task or handle where the exception originated.

@end deffn

@geindex get_exception_handler() (asyncio.loop 메서드)
@anchor{library/asyncio-eventloop asyncio loop get_exception_handler}@anchor{e74}
@deffn {메서드} loop.get_exception_handler ()

현재 예외 처리기를 반환하거나, 사용자 정의 예외 처리기가 설정되지 않았으면 @code{None} 을 반환합니다.


Added in version 3.5.2.

@end deffn

@geindex default_exception_handler() (asyncio.loop 메서드)
@anchor{library/asyncio-eventloop asyncio loop default_exception_handler}@anchor{38df}
@deffn {메서드} loop.default_exception_handler (context)

기본 예외 처리기.

예외가 발생하고 예외 처리기가 설정되지 않았을 때 호출됩니다. 기본 동작으로 위임하려는 사용자 정의 예외 처리기가 호출할 수 있습니다.

`context' 매개 변수는 @ref{38de,,call_exception_handler()} 에서와 같은 의미입니다.
@end deffn

@geindex call_exception_handler() (asyncio.loop 메서드)
@anchor{library/asyncio-eventloop asyncio loop call_exception_handler}@anchor{38de}
@deffn {메서드} loop.call_exception_handler (context)

현재 이벤트 루프 예외 처리기를 호출합니다.

`context' 는 다음 키를 포함하는 @code{dict} 객체입니다 (새 키가 미래의 파이썬 버전에서 추가될 수 있습니다):


@itemize *

@item 
‘message’: 에러 메시지;

@item 
‘exception’ (선택적): 예외 객체;

@item 
‘future’ (선택적): @ref{dc5,,asyncio.Future} 인스턴스;

@item 
‘task’ (선택적): @ref{1c7,,asyncio.Task} 인스턴스;

@item 
‘handle’ (선택적): @ref{1e80,,asyncio.Handle} 인스턴스;

@item 
‘protocol’ (선택적): @ref{38c3,,프로토콜} 인스턴스;

@item 
‘transport’ (선택적): @ref{38c4,,트랜스포트} 인스턴스;

@item 
‘socket’ (선택적): @ref{fa0,,socket.socket} 인스턴스;

@item 
‘source_traceback’ (optional): Traceback of the source;

@item 
‘handle_traceback’ (optional): Traceback of the handle;

@item 

@table @asis

@item ‘asyncgen’ (optional): Asynchronous generator that caused

예외.
@end table
@end itemize

@cartouche
@quotation 참고 
이 메서드는 서브 클래스 된 이벤트 루프에서 재정의되지 않아야 합니다. 사용자 정의 예외 처리를 위해서는 @ref{38dd,,set_exception_handler()} 메서드를 사용하십시오.
@end quotation
@end cartouche
@end deffn

@node 디버그 모드 활성화,Running subprocesses,Error handling API,Event loop methods
@anchor{library/asyncio-eventloop enabling-debug-mode}@anchor{38e0}
@subsubsection 디버그 모드 활성화


@geindex get_debug() (asyncio.loop 메서드)
@anchor{library/asyncio-eventloop asyncio loop get_debug}@anchor{fc1}
@deffn {메서드} loop.get_debug ()

이벤트 루프의 디버그 모드(@ref{3c3,,bool})를 가져옵니다.

기본값은 환경 변수 
@geindex PYTHONASYNCIODEBUG
@geindex 환경 변수; PYTHONASYNCIODEBUG
@ref{2136,,PYTHONASYNCIODEBUG} 가 비어 있지 않은 문자열로 설정되면 @code{True} 이고, 그렇지 않으면 @code{False} 입니다.
@end deffn

@geindex set_debug() (asyncio.loop 메서드)
@anchor{library/asyncio-eventloop asyncio loop set_debug}@anchor{fc0}
@deffn {메서드} loop.set_debug (enabled: bool)

이벤트 루프의 디버그 모드를 설정합니다.


버전 3.7에서 변경: 이제 새로운 @ref{507,,파이썬 개발 모드}를 사용하여 디버그 모드를 활성화할 수도 있습니다.

@end deffn

@geindex slow_callback_duration (asyncio.loop의 속성)
@anchor{library/asyncio-eventloop asyncio loop slow_callback_duration}@anchor{38e1}
@deffn {속성} loop.slow_callback_duration

This attribute can be used to set the
minimum execution duration in seconds that is considered “slow”.
When debug mode is enabled, “slow” callbacks are logged.

Default value is 100 milliseconds.
@end deffn


@subsubheading 더 보기


@ref{2137,,asyncio의 디버그 모드}.


@node Running subprocesses,,디버그 모드 활성화,Event loop methods
@anchor{library/asyncio-eventloop running-subprocesses}@anchor{38e2}
@subsubsection Running subprocesses


이 하위 절에서 설명하는 메서드는 저수준입니다. 일반적인 async/await 코드에서는 대신 고수준의 @ref{c6b,,asyncio.create_subprocess_shell()} 및 @ref{c6a,,asyncio.create_subprocess_exec()} 편리 함수를 사용하는 것을 고려하십시오.

@cartouche
@quotation 참고 
윈도우에서, 기본 이벤트 루프 @ref{81c,,ProactorEventLoop}는 자식 프로세스를 지원합니다, 반면에 @ref{314,,SelectorEventLoop}는 지원하지 않습니다. 자세한 내용은 @ref{3876,,윈도우에서의 자식 프로세스 지원}을 참조하십시오.
@end quotation
@end cartouche

@geindex subprocess_exec() (asyncio.loop 메서드)
@anchor{library/asyncio-eventloop loop-subprocess-exec}@anchor{37ef}@anchor{library/asyncio-eventloop asyncio loop subprocess_exec}@anchor{3874}
@deffn {메서드} async loop.subprocess_exec (protocol_factory, *args, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, **kwargs)

`args'로 지정된 하나 이상의 문자열 인자로 서브 프로세스를 만듭니다.

`args'는 반드시 다음과 같은 것으로 표현되는 문자열의 목록이어야 합니다:


@itemize *

@item 
@ref{169,,str};

@item 
또는 @ref{2c5c,,파일 시스템 인코딩}으로로 인코딩된 @ref{192,,bytes}.
@end itemize

첫 번째 문자열은 프로그램 실행 파일을 지정하고, 나머지 문자열은 인자를 지정합니다. 함께, 문자열 인자들은 프로그램의 @code{argv}를 구성합니다.

이것은 @code{shell=False}와 문자열의 목록을 첫 번째 인자로 호출된 표준 라이브러리 @ref{4b8,,subprocess.Popen} 클래스와 유사합니다. 그러나 @code{Popen}이 문자열 목록인 단일 인자를 받아들이지만, `subprocess_exec'는 여러 문자열 인자를 받아들입니다.

`protocol_factory'는 반드시 @ref{38e3,,asyncio.SubprocessProtocol} 클래스의 서브 클래스를 반환하는 콜러블이어야 합니다.

다른 매개 변수:


@itemize *

@item 
`stdin'은 다음 중 하나일 수 있습니다:


@itemize *

@item 
a file-like object

@item 
an existing file descriptor (a positive integer), for example those created with @ref{1b62,,os.pipe()}

@item 
@ref{d7f,,subprocess.PIPE} 상수 (기본값), 새 파이프를 만들고 연결합니다,

@item 
서브 프로세스가 이 프로세스의 파일 기술자를 상속하게 하는 값 @code{None}

@item 
특수 @ref{1e10,,os.devnull} 파일이 사용될 것임을 나타내는 @ref{1353,,subprocess.DEVNULL} 상수
@end itemize

@item 
`stdout'은 다음 중 하나일 수 있습니다:


@itemize *

@item 
a file-like object

@item 
@ref{d7f,,subprocess.PIPE} 상수 (기본값), 새 파이프를 만들고 연결합니다,

@item 
서브 프로세스가 이 프로세스의 파일 기술자를 상속하게 하는 값 @code{None}

@item 
특수 @ref{1e10,,os.devnull} 파일이 사용될 것임을 나타내는 @ref{1353,,subprocess.DEVNULL} 상수
@end itemize

@item 
`stderr'은 다음 중 하나일 수 있습니다:


@itemize *

@item 
a file-like object

@item 
@ref{d7f,,subprocess.PIPE} 상수 (기본값), 새 파이프를 만들고 연결합니다,

@item 
서브 프로세스가 이 프로세스의 파일 기술자를 상속하게 하는 값 @code{None}

@item 
특수 @ref{1e10,,os.devnull} 파일이 사용될 것임을 나타내는 @ref{1353,,subprocess.DEVNULL} 상수

@item 
@ref{375e,,subprocess.STDOUT} 상수, 표준 에러 스트림을 프로세스의 표준 출력 스트림에 연결합니다
@end itemize

@item 
다른 모든 키워드 인자는 해석 없이 @ref{4b8,,subprocess.Popen}로 전달됩니다. 다만, `bufsize', `universal_newlines', `shell', `text', `encoding' 및 `errors'는 예외인데, 이것들은 지정되지 않아야 합니다.

@code{asyncio} 서브 프로세스 API는 스트림을 텍스트로 디코딩하는 것을 지원하지 않습니다. @ref{ad3,,bytes.decode()}는 스트림에서 반환된 바이트열을 텍스트로 변환하는 데 사용될 수 있습니다.
@end itemize

If a file-like object passed as `stdin', `stdout' or `stderr' represents a
pipe, then the other side of this pipe should be registered with
@ref{387a,,connect_write_pipe()} or @ref{3879,,connect_read_pipe()} for use
with the event loop.

다른 인자에 관한 설명은 @ref{4b8,,subprocess.Popen} 클래스의 생성자를 참조하십시오.

@code{(transport, protocol)} 쌍을 반환합니다. 여기에서 `transport'는 @ref{38e4,,asyncio.SubprocessTransport} 베이스 클래스를 따르고, `protocol'은 `protocol_factory'에 의해 인스턴스로 만들어진 객체입니다.

If the transport is closed or is garbage collected, the child process
is killed if it is still running.
@end deffn

@geindex subprocess_shell() (asyncio.loop 메서드)
@anchor{library/asyncio-eventloop asyncio loop subprocess_shell}@anchor{3875}
@deffn {메서드} async loop.subprocess_shell (protocol_factory, cmd, *, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, **kwargs)

플랫폼의 “셸” 구문을 사용하는 `cmd'로 자식 프로세스를 만듭니다. `cmd'는 @ref{169,,str}이나 @ref{2c5c,,파일 시스템 인코딩}으로 인코딩된 @ref{192,,bytes} 일 수 있습니다.

이것은 @code{shell=True}로 호출된 표준 라이브러리 @ref{4b8,,subprocess.Popen} 클래스와 유사합니다.

`protocol_factory'는 반드시 @ref{38e3,,SubprocessProtocol} 클래스의 서브 클래스를 반환하는 콜러블이어야 합니다.

나머지 인자에 관한 자세한 내용은 @ref{3874,,subprocess_exec()}를 참조하십시오.

@code{(transport, protocol)} 쌍을 반환합니다. 여기서 `transport'는 @ref{38e4,,SubprocessTransport} 베이스 클래스를 따르고, `protocol'은 `protocol_factory'에 의해 인스턴스로 만들어진 객체입니다.

If the transport is closed or is garbage collected, the child process
is killed if it is still running.
@end deffn

@cartouche
@quotation 참고 
셸 주입@footnote{https://en.wikipedia.org/wiki/Shell_injection#Shell_injection} 취약점을 피하고자 모든 공백과 특수 문자를 적절하게 따옴표 처리하는 것은 응용 프로그램의 책임입니다. @ref{581,,shlex.quote()} 함수를 사용하여 셸 명령을 구성하는 데 사용될 문자열에 있는 공백 및 특수 문자를 올바르게 이스케이프 할 수 있습니다.
@end quotation
@end cartouche

@node Callback handles,Server objects,Event loop methods,Event loop
@anchor{library/asyncio-eventloop callback-handles}@anchor{38b3}
@subsubsection Callback handles


@geindex Handle (asyncio 클래스)
@anchor{library/asyncio-eventloop asyncio Handle}@anchor{1e80}
@deffn {클래스} asyncio.Handle

@ref{cf9,,loop.call_soon()}, @ref{cfa,,loop.call_soon_threadsafe()} 에 의해 반환되는 콜백 래퍼 객체.

@geindex get_context() (asyncio.Handle 메서드)
@anchor{library/asyncio-eventloop asyncio Handle get_context}@anchor{38e5}
@deffn {메서드} get_context ()

Return the @ref{177,,contextvars.Context} object
associated with the handle.


Added in version 3.12.

@end deffn

@geindex cancel() (asyncio.Handle 메서드)
@anchor{library/asyncio-eventloop asyncio Handle cancel}@anchor{38e6}
@deffn {메서드} cancel ()

콜백을 취소합니다. 콜백이 이미 취소되었거나 실행되었다면 이 메서드는 아무 효과가 없습니다.
@end deffn

@geindex cancelled() (asyncio.Handle 메서드)
@anchor{library/asyncio-eventloop asyncio Handle cancelled}@anchor{d0f}
@deffn {메서드} cancelled ()

콜백이 취소되었으면 @code{True} 을 반환합니다.


Added in version 3.7.

@end deffn
@end deffn

@geindex TimerHandle (asyncio 클래스)
@anchor{library/asyncio-eventloop asyncio TimerHandle}@anchor{1adb}
@deffn {클래스} asyncio.TimerHandle

@ref{cfb,,loop.call_later()} 및 @ref{cfc,,loop.call_at()} 에 의해 반환되는 콜백 래퍼 객체.

이 클래스는 @ref{1e80,,Handle}의 서브 클래스입니다.

@geindex when() (asyncio.TimerHandle 메서드)
@anchor{library/asyncio-eventloop asyncio TimerHandle when}@anchor{d0c}
@deffn {메서드} when ()

예약된 콜백 시간을 @ref{196,,float} 초로 반환합니다.

시간은 절대 타임스탬프입니다. @ref{38c0,,loop.time()} 과 같은 시간 참조를 사용합니다.


Added in version 3.7.

@end deffn
@end deffn

@node Server objects,Event loop implementations,Callback handles,Event loop
@anchor{library/asyncio-eventloop server-objects}@anchor{38b4}
@subsubsection Server objects


Server 객체는 @ref{d08,,loop.create_server()}, @ref{4cb,,loop.create_unix_server()}, @ref{d0e,,start_server()}, @ref{3831,,start_unix_server()}로 만듭니다.

@ref{d07,,Server} 클래스의 인스턴스를 직접 만들지 마십시오.

@geindex Server (asyncio 클래스)
@anchor{library/asyncio-eventloop asyncio Server}@anchor{d07}
@deffn {클래스} asyncio.Server

`Server' 객체는 비동기 컨텍스트 관리자입니다. @code{async with} 문에서 사용될 때, @code{async with} 문이 완료되면 서버 객체가 닫혀 있고 새 연결을 받아들이지 않는다는 것이 보장됩니다:

@example
srv = await loop.create_server(...)

async with srv:
    # 코드

# 이 지점에서, srv 는 닫혔고 더는 새 연결을 받아들이지 않습니다.
@end example


버전 3.7에서 변경: Server 객체는 파이썬 3.7부터 비동기 컨텍스트 관리자입니다.



버전 3.11에서 변경: This class was exposed publicly as @code{asyncio.Server} in Python 3.9.11, 3.10.3 and 3.11.


@geindex close() (asyncio.Server 메서드)
@anchor{library/asyncio-eventloop asyncio Server close}@anchor{382e}
@deffn {메서드} close ()

서버를 중지합니다: 리스닝 소켓을 닫고 @ref{e0f,,sockets} 어트리뷰트를 @code{None} 으로 설정합니다.

이미 받아들여진 클라이언트 연결을 나타내는 소켓은 열린 채로 있습니다.

서버는 비동기적으로 닫힙니다; 서버가 닫힐 때까지 (그리고 더는 활성 연결이 남아있지 않을 때까지) 대기하려면 @ref{1a3f,,wait_closed()} 코루틴을 사용하십시오.
@end deffn

@geindex close_clients() (asyncio.Server 메서드)
@anchor{library/asyncio-eventloop asyncio Server close_clients}@anchor{4cf}
@deffn {메서드} close_clients ()

모든 이미 받아들여진 클라이언트 연결을 답습니다.

Calls @ref{38c6,,close()} on all associated
transports.

@ref{382e,,close()} should be called before @code{close_clients()} when
closing the server to avoid races with new clients connecting.


Added in version 3.13.

@end deffn

@geindex abort_clients() (asyncio.Server 메서드)
@anchor{library/asyncio-eventloop asyncio Server abort_clients}@anchor{4d0}
@deffn {메서드} abort_clients ()

Close all existing incoming client connections immediately,
without waiting for pending operations to complete.

Calls @ref{38e7,,abort()} on all associated
transports.

@ref{382e,,close()} should be called before @code{abort_clients()} when
closing the server to avoid races with new clients connecting.


Added in version 3.13.

@end deffn

@geindex get_loop() (asyncio.Server 메서드)
@anchor{library/asyncio-eventloop asyncio Server get_loop}@anchor{d06}
@deffn {메서드} get_loop ()

서버 객체와 연관된 이벤트 루프를 반환합니다.


Added in version 3.7.

@end deffn

@geindex start_serving() (asyncio.Server 메서드)
@anchor{library/asyncio-eventloop asyncio Server start_serving}@anchor{d09}
@deffn {메서드} async start_serving ()

연결을 받아들이기 시작합니다.

이 메서드는 멱등적이라서, 서버가 이미 시작되었을 때도 호출 할 수 있습니다.

@ref{d08,,loop.create_server()}와 @ref{d0e,,asyncio.start_server()} 의 `start_serving' 키워드 전용 매개 변수는 즉시 연결을 받아들이지 않는 서버 객체를 만들 수 있도록 합니다. 이 경우 @code{Server.start_serving()}, 또는 @ref{d0a,,Server.serve_forever()}를 사용하여 Server가 연결을 받아들이기 시작하도록 할 수 있습니다.


Added in version 3.7.

@end deffn

@geindex serve_forever() (asyncio.Server 메서드)
@anchor{library/asyncio-eventloop asyncio Server serve_forever}@anchor{d0a}
@deffn {메서드} async serve_forever ()

코루틴이 취소될 때까지 연결을 받아들이기 시작합니다. @code{serve_forever} 태스크를 취소하면 서버가 닫힙니다.

이 메서드는 서버가 이미 연결을 받아들이고 있어도 호출 할 수 있습니다. 하나의 `Server' 객체 당 하나의 @code{serve_forever} 태스크만 존재할 수 있습니다.

예:

@example
async def client_connected(reader, writer):
    # reader/writer 스트림으로 클라이언트와
    # 통신합니다. 예를 들어:
    await reader.readline()

async def main(host, port):
    srv = await asyncio.start_server(
        client_connected, host, port)
    await srv.serve_forever()

asyncio.run(main('127.0.0.1', 0))
@end example


Added in version 3.7.

@end deffn

@geindex is_serving() (asyncio.Server 메서드)
@anchor{library/asyncio-eventloop asyncio Server is_serving}@anchor{d0b}
@deffn {메서드} is_serving ()

서버가 새 연결을 받아들이고 있으면 @code{True} 를 반환합니다.


Added in version 3.7.

@end deffn

@geindex wait_closed() (asyncio.Server 메서드)
@anchor{library/asyncio-eventloop asyncio Server wait_closed}@anchor{1a3f}
@deffn {메서드} async wait_closed ()

@ref{382e,,close()} 메서드가 완료되고 모든 활성 연결이 종료될 때까지 기다립니다.
@end deffn

@geindex sockets (asyncio.Server의 속성)
@anchor{library/asyncio-eventloop asyncio Server sockets}@anchor{e0f}
@deffn {속성} sockets

서버가 리스닝하고 있는 소켓류 객체 @code{asyncio.trsock.TransportSocket}의 리스트.


버전 3.7에서 변경: 파이썬 3.7 이전에는 @code{Server.sockets} 가 서버 소켓의 내부 리스트를 직접 반환했습니다. 3.7에서는 그 리스트의 복사본이 반환됩니다.

@end deffn
@end deffn
@anchor{library/asyncio-eventloop asyncio-event-loops}@anchor{38e8}
@node Event loop implementations,예제<16>,Server objects,Event loop
@anchor{library/asyncio-eventloop asyncio-event-loop-implementations}@anchor{38e9}@anchor{library/asyncio-eventloop event-loop-implementations}@anchor{38b5}
@subsubsection Event loop implementations


asyncio에는 두 가지 이벤트 루프 구현이 함께 제공됩니다: @ref{314,,SelectorEventLoop} 및 @ref{81c,,ProactorEventLoop}.

기본적으로 asyncio는 @ref{1a67,,EventLoop}를 사용하도록 구성됩니다.

@geindex SelectorEventLoop (asyncio 클래스)
@anchor{library/asyncio-eventloop asyncio SelectorEventLoop}@anchor{314}
@deffn {클래스} asyncio.SelectorEventLoop

@ref{c7,,selectors} 모듈을 기반으로 하는 @ref{b58,,AbstractEventLoop} 의 서브 클래스.

주어진 플랫폼에서 사용할 수 있는 가장 효율적인 `selector'를 사용합니다. 정확한 셀렉터 구현을 수동으로 구성하여 사용할 수도 있습니다.:

@example
import asyncio
import selectors

async def main():
   ...

loop_factory = lambda: asyncio.SelectorEventLoop(selectors.SelectSelector())
asyncio.run(main(), loop_factory=loop_factory)
@end example

@ref{213c,,가용성}: Unix, Windows.
@end deffn

@geindex ProactorEventLoop (asyncio 클래스)
@anchor{library/asyncio-eventloop asyncio ProactorEventLoop}@anchor{81c}
@deffn {클래스} asyncio.ProactorEventLoop

“I/O 완료 포트”(IOCP)를 사용하는 윈도우용 @ref{b58,,AbstractEventLoop}의 서브 클래스.

@ref{213c,,가용성}: Windows.


@subsubheading 더 보기


I/O 완료 포트에 관한 MSDN 설명서@footnote{https://learn.microsoft.com/windows/win32/fileio/i-o-completion-ports}.

@end deffn

@geindex EventLoop (asyncio 클래스)
@anchor{library/asyncio-eventloop asyncio EventLoop}@anchor{1a67}
@deffn {클래스} asyncio.EventLoop

@quotation

An alias to the most efficient available subclass of @ref{b58,,AbstractEventLoop} for the given
platform.

유닉스에서는 @ref{314,,SelectorEventLoop}의, 윈도우에서는 @ref{81c,,ProactorEventLoop}의 별칭입니다.
@end quotation


Added in version 3.13.

@end deffn

@geindex AbstractEventLoop (asyncio 클래스)
@anchor{library/asyncio-eventloop asyncio AbstractEventLoop}@anchor{b58}
@deffn {클래스} asyncio.AbstractEventLoop

asyncio 호환 이벤트 루프의 추상 베이스 클래스.

@ref{38b7,,Event loop methods} 절은 @code{AbstractEventLoop}의 다른 구현이 정의해야 하는 모든 메서드를 나열합니다.
@end deffn

@node 예제<16>,,Event loop implementations,Event loop
@anchor{library/asyncio-eventloop examples}@anchor{38b6}
@subsubsection 예제


이 절의 모든 예는 `의도적으로' @ref{38b9,,loop.run_forever()} 및 @ref{cf9,,loop.call_soon()}와 같은 저수준 이벤트 루프 API를 사용하는 방법을 보여줍니다. 현대 asyncio 응용 프로그램은 거의 이런 식으로 작성할 필요가 없습니다; @ref{2f3,,asyncio.run()}과 같은 고수준 함수를 사용하는 것을 고려하십시오.

@menu
* call_soon()을 사용하는 Hello World: call_soon 을 사용하는 Hello World. 
* call_later()로 현재 날짜를 표시합니다.: call_later 로 현재 날짜를 표시합니다. 
* 파일 기술자에서 읽기 이벤트를 관찰하기:: 
* SIGINT 및 SIGTERM에 대한 시그널 처리기 설정:: 

@end menu

@node call_soon 을 사용하는 Hello World,call_later 로 현재 날짜를 표시합니다,,예제<16>
@anchor{library/asyncio-eventloop asyncio-example-lowlevel-helloworld}@anchor{38ea}@anchor{library/asyncio-eventloop hello-world-with-call-soon}@anchor{38eb}
@subsubsection call_soon()을 사용하는 Hello World


콜백을 예약하기 위해 @ref{cf9,,loop.call_soon()} 메서드를 사용하는 예제. 콜백은 @code{"Hello World"} 를 표시한 다음 이벤트 루프를 중지합니다:

@example
import asyncio

def hello_world(loop):
    """A callback to print 'Hello World' and stop the event loop"""
    print('Hello World')
    loop.stop()

loop = asyncio.new_event_loop()

# hello_world() 호출을 예약합니다
loop.call_soon(hello_world, loop)

# 블로킹 호출이 loop.stop() 에 의해 중단됩니다
try:
    loop.run_forever()
finally:
    loop.close()
@end example


@subsubheading 더 보기


코루틴과 @ref{2f3,,run()} 함수로 작성된 유사한 @ref{37e9,,Hello World} 예제.


@node call_later 로 현재 날짜를 표시합니다,파일 기술자에서 읽기 이벤트를 관찰하기,call_soon 을 사용하는 Hello World,예제<16>
@anchor{library/asyncio-eventloop asyncio-example-call-later}@anchor{38ec}@anchor{library/asyncio-eventloop display-the-current-date-with-call-later}@anchor{38ed}
@subsubsection call_later()로 현재 날짜를 표시합니다.


초마다 현재 날짜를 표시하는 콜백의 예입니다. 콜백은 @ref{cfb,,loop.call_later()} 메서드를 사용하여 5초 동안 자신을 다시 예약한 다음 이벤트 루프를 중지합니다:

@example
import asyncio
import datetime as dt

def display_date(end_time, loop):
    print(dt.datetime.now())
    if (loop.time() + 1.0) < end_time:
        loop.call_later(1, display_date, end_time, loop)
    else:
        loop.stop()

loop = asyncio.new_event_loop()

# Schedule the first call to display_date()
end_time = loop.time() + 5.0
loop.call_soon(display_date, end_time, loop)

# Blocking call interrupted by loop.stop()
try:
    loop.run_forever()
finally:
    loop.close()
@end example


@subsubheading 더 보기


코루틴과 @ref{2f3,,run()} 함수로 작성된 유사한 @ref{3808,,현재 날짜} 예제.


@node 파일 기술자에서 읽기 이벤트를 관찰하기,SIGINT 및 SIGTERM에 대한 시그널 처리기 설정,call_later 로 현재 날짜를 표시합니다,예제<16>
@anchor{library/asyncio-eventloop asyncio-example-watch-fd}@anchor{384a}@anchor{library/asyncio-eventloop watch-a-file-descriptor-for-read-events}@anchor{38ee}
@subsubsection 파일 기술자에서 읽기 이벤트를 관찰하기


@ref{384b,,loop.add_reader()} 메서드를 사용하여 파일 기술자가 데이터를 수신할 때까지 기다렸다가 이벤트 루프를 닫습니다:

@example
import asyncio
from socket import socketpair

# 연결된 파일 기술자 쌍을 만듭니다
rsock, wsock = socketpair()

loop = asyncio.new_event_loop()

def reader():
    data = rsock.recv(100)
    print("Received:", data.decode())

    # 할 일을 끝냈습니다: 파일 기술자를 등록 취소합니다
    loop.remove_reader(rsock)

    # 이벤트 루프를 중지합니다
    loop.stop()

# 읽기 이벤트를 위해 파일 기술자를 등록합니다
loop.add_reader(rsock, reader)

# 네트웍으로 부터의 데이터 수신을 흉내냅니다
loop.call_soon(wsock.send, 'abc'.encode())

try:
    # 이벤트 루프를 실행합니다
    loop.run_forever()
finally:
    # 할 일을 끝냈습니다, 소켓과 이벤트 루프를 닫습니다
    rsock.close()
    wsock.close()
    loop.close()
@end example


@subsubheading 더 보기



@itemize *

@item 
트랜스포트, 프로토콜, @ref{817,,loop.create_connection()} 메서드를 사용한 유사한 @ref{3849,,예제}.

@item 
고수준의 @ref{d0d,,asyncio.open_connection()} 함수와 스트림을 사용하는 또 다른 유사한 @ref{3847,,예제}.
@end itemize


@node SIGINT 및 SIGTERM에 대한 시그널 처리기 설정,,파일 기술자에서 읽기 이벤트를 관찰하기,예제<16>
@anchor{library/asyncio-eventloop asyncio-example-unix-signals}@anchor{38ef}@anchor{library/asyncio-eventloop set-signal-handlers-for-sigint-and-sigterm}@anchor{38f0}
@subsubsection SIGINT 및 SIGTERM에 대한 시그널 처리기 설정


(이 @code{signals} 예제는 유닉스에서만 작동합니다.)

@ref{38d9,,loop.add_signal_handler()} 메서드를 사용하여 @ref{253,,SIGINT}와 @ref{15e4,,SIGTERM} 시그널을 위한 처리기를 등록합니다:

@example
import asyncio
import functools
import os
import signal

def ask_exit(signame, loop):
    print("got signal %s: exit" % signame)
    loop.stop()

async def main():
    loop = asyncio.get_running_loop()

    for signame in @{'SIGINT', 'SIGTERM'@}:
        loop.add_signal_handler(
            getattr(signal, signame),
            functools.partial(ask_exit, signame, loop))

    await asyncio.sleep(3600)

print("Event loop running for 1 hour, press Ctrl+C to interrupt.")
print(f"pid @{os.getpid()@}: send SIGINT or SIGTERM to exit.")

asyncio.run(main())
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 퓨처,트랜스포트와 프로토콜,Event loop,asyncio — 비동기 I/O
@anchor{library/asyncio-future doc}@anchor{3714}@anchor{library/asyncio-future asyncio-futures}@anchor{37f2}@anchor{library/asyncio-future futures}@anchor{38f1}@anchor{library/asyncio-future translation-repo}@anchor{38f2}
@subsubsection 퓨처


`소스 코드:' Lib/asyncio/futures.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/asyncio/futures.py}, Lib/asyncio/base_futures.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/asyncio/base_futures.py}


__________________________________________________________________


`Future' 객체는 `저수준 콜백 기반 코드'와 고수준 async/await 코드 간에 다리를 놓는 데 사용됩니다.

@menu
* 퓨처 함수:: 
* Future 객체: Future 객체<2>. 

@end menu

@node 퓨처 함수,Future 객체<2>,,퓨처
@anchor{library/asyncio-future future-functions}@anchor{38f3}
@subsubsection 퓨처 함수


@geindex isfuture() (asyncio 모듈)
@anchor{library/asyncio-future asyncio isfuture}@anchor{38f4}
@deffn {함수} asyncio.isfuture (obj)

`obj'가 다음 중 하나면 @code{True}를 반환합니다:


@itemize *

@item 
@ref{dc5,,asyncio.Future}의 인스턴스,

@item 
@ref{1c7,,asyncio.Task}의 인스턴스,

@item 
@code{_asyncio_future_blocking} 어트리뷰트를 가진 퓨처류 객체.
@end itemize


Added in version 3.5.

@end deffn

@geindex ensure_future() (asyncio 모듈)
@anchor{library/asyncio-future asyncio ensure_future}@anchor{e70}
@deffn {함수} asyncio.ensure_future (obj, *, loop=None)

다음을 반환합니다:


@itemize *

@item 
`obj'가 @ref{dc5,,Future}, @ref{1c7,,Task} 또는 퓨처류 객체면, `obj' 인자를 있는 그대로 (@ref{38f4,,isfuture()}로 검사합니다.)

@item 
`obj'가 코루틴이면, `obj'를 감싸는 @ref{1c7,,Task} 객체 (@ref{6a5,,iscoroutine()}로 검사합니다); 이 경우 코루틴은 @code{ensure_future()}로 예약됩니다.

@item 
`obj'가 어웨이터블이면, `obj'를 기다릴 @ref{1c7,,Task} 객체 (@ref{1017,,inspect.isawaitable()}로 검사합니다.)
@end itemize

`obj'가 이 중 어느 것도 아니면, @ref{198,,TypeError}가 발생합니다.

@cartouche
@quotation 중요 
Save a reference to the result of this function, to avoid
a task disappearing mid-execution.

See also the @ref{1c9,,create_task()} function which is the
preferred way for creating new tasks or use @ref{4d2,,asyncio.TaskGroup}
which keeps reference to the task internally.
@end quotation
@end cartouche


버전 3.5.1에서 변경: 함수는 모든 @ref{4c9,,어웨이터블} 객체를 받아들입니다.



버전 3.10부터 폐지됨: Deprecation warning is emitted if `obj' is not a Future-like object
and `loop' is not specified and there is no running event loop.

@end deffn

@geindex wrap_future() (asyncio 모듈)
@anchor{library/asyncio-future asyncio wrap_future}@anchor{1c7a}
@deffn {함수} asyncio.wrap_future (future, *, loop=None)

@ref{13b7,,concurrent.futures.Future} 객체를 @ref{dc5,,asyncio.Future} 객체로 감쌉니다.


버전 3.10부터 폐지됨: Deprecation warning is emitted if `future' is not a Future-like object
and `loop' is not specified and there is no running event loop.

@end deffn

@node Future 객체<2>,,퓨처 함수,퓨처
@anchor{library/asyncio-future asyncio-future-obj}@anchor{38f5}@anchor{library/asyncio-future future-object}@anchor{38f6}
@subsubsection Future 객체


@geindex Future (asyncio 클래스)
@anchor{library/asyncio-future asyncio Future}@anchor{dc5}
@deffn {클래스} asyncio.Future (*, loop=None)

Future는 비동기 연산의 최종 결과를 나타냅니다. 스레드 안전하지 않습니다.

Future는 @ref{4c9,,어웨이터블} 객체입니다. 코루틴은 결과나 예외가 설정되거나 취소될 때까지 Future 객체를 기다릴 수 있습니다. Future는 여러번 어웨이트할 수 있으며 결과는 같습니다.

일반적으로 퓨처는 저수준 콜백 기반 코드(예를 들어, asyncio @ref{37f1,,트랜스포트}를 사용하여 구현된 프로토콜에서)가 고수준 async/await 코드와 상호 운용되도록 하는 데 사용됩니다.

간단한 규칙은 사용자가 만나는 API에서 Future 객체를 절대 노출하지 않는 것이며, Future 객체를 만드는 권장 방법은 @ref{e73,,loop.create_future()}를 호출하는 것입니다. 이런 식으로 대체 이벤트 루프 구현이 자신의 최적화된 Future 객체 구현을 주입할 수 있습니다.


버전 3.7에서 변경: @ref{28,,contextvars} 모듈에 대한 지원이 추가되었습니다.



버전 3.10부터 폐지됨: Deprecation warning is emitted if `loop' is not specified
and there is no running event loop.


@geindex result() (asyncio.Future 메서드)
@anchor{library/asyncio-future asyncio Future result}@anchor{38f7}
@deffn {메서드} result ()

Future의 결과를 반환합니다.

Future가 `완료(done)'했고 @ref{381e,,set_result()} 메서드로 결과가 설정되었으면, 결괏값이 반환됩니다.

Future가 `완료(done)'했고 @ref{e77,,set_exception()} 메서드로 예외가 설정되었으면, 이 메서드는 예외를 발생시킵니다.

Future가 `취소(cancelled)'되었으면, 이 메서드는 @ref{4d5,,CancelledError} 예외를 발생시킵니다.

Future의 결과를 아직 사용할 수 없으면, 이 메서드는 @ref{3821,,InvalidStateError} 예외를 발생시킵니다.
@end deffn

@geindex set_result() (asyncio.Future 메서드)
@anchor{library/asyncio-future asyncio Future set_result}@anchor{381e}
@deffn {메서드} set_result (result)

Future를 `완료(done)'로 표시하고, 그 결과를 설정합니다.

Future가 이미 `완료(done)'했으면, @ref{3821,,InvalidStateError} 에러를 발생시킵니다.
@end deffn

@geindex set_exception() (asyncio.Future 메서드)
@anchor{library/asyncio-future asyncio Future set_exception}@anchor{e77}
@deffn {메서드} set_exception (exception)

Future를 `완료(done)'로 표시하고, 예외를 설정합니다.

Future가 이미 `완료(done)'했으면, @ref{3821,,InvalidStateError} 에러를 발생시킵니다.
@end deffn

@geindex done() (asyncio.Future 메서드)
@anchor{library/asyncio-future asyncio Future done}@anchor{38f8}
@deffn {메서드} done ()

Future가 `완료(done)'했으면 @code{True}를 반환합니다.

Future는 `취소(cancelled)'되었거나 @ref{381e,,set_result()} 나 @ref{e77,,set_exception()} 호출로 결과나 예외가 설정되면 `완료(done)'됩니다.
@end deffn

@geindex cancelled() (asyncio.Future 메서드)
@anchor{library/asyncio-future asyncio Future cancelled}@anchor{38f9}
@deffn {메서드} cancelled ()

Future가 `최소(cancelled)'되었으면, @code{True}를 반환합니다.

이 메서드는 대개 결과나 예외를 설정하기 전에 Future가 `취소(cancelled)'되었는지 확인하는 데 사용됩니다:

@example
if not fut.cancelled():
    fut.set_result(42)
@end example
@end deffn

@geindex add_done_callback() (asyncio.Future 메서드)
@anchor{library/asyncio-future asyncio Future add_done_callback}@anchor{cfd}
@deffn {메서드} add_done_callback (callback, *, context=None)

Future가 `완료(done)'될 때 실행할 콜백을 추가합니다.

`callback'는 유일한 인자인 Future 객체로 호출됩니다.

이 메서드가 호출될 때 Future가 이미 `완료(done)'되었으면, 콜백이 @ref{cf9,,loop.call_soon()}으로 예약됩니다.

선택적 키워드 전용 `context' 인자는 `callback'이 실행될 사용자 정의 @ref{177,,contextvars.Context}를 지정할 수 있도록 합니다. `context'가 제공되지 않으면 현재 컨텍스트가 사용됩니다.

@ref{217,,functools.partial()}을 사용하여 매개 변수를 callback에 전달할 수 있습니다, 예를 들어:

@example
# "fut"가 완료되면 'print("Future:", fut)'를 호출합니다.
fut.add_done_callback(
    functools.partial(print, "Future:"))
@end example


버전 3.7에서 변경: `context' 키워드 전용 매개 변수가 추가되었습니다. 자세한 내용은 
@geindex Python 향상 제안; PEP 567
PEP 567@footnote{https://peps.python.org/pep-0567/}을 참조하십시오.

@end deffn

@geindex remove_done_callback() (asyncio.Future 메서드)
@anchor{library/asyncio-future asyncio Future remove_done_callback}@anchor{1912}
@deffn {메서드} remove_done_callback (callback)

콜백 목록에서 `callback'을 제거합니다.

제거된 콜백 수를 반환합니다. 콜백이 두 번 이상 추가되지 않는 한 일반적으로 1입니다.
@end deffn

@geindex cancel() (asyncio.Future 메서드)
@anchor{library/asyncio-future asyncio Future cancel}@anchor{1ba7}
@deffn {메서드} cancel (msg=None)

Future를 취소하고 콜백을 예약합니다.

Future가 이미 `완료(done)'했거나 `취소(cancelled)'되었으면, @code{False}를 반환합니다. 그렇지 않으면 Future의 상태를 `취소(cancelled)'로 변경하고, 콜백을 예약한 다음 @code{True}를 반환합니다.


버전 3.9에서 변경: `msg' 매개 변수를 추가했습니다.

@end deffn

@geindex exception() (asyncio.Future 메서드)
@anchor{library/asyncio-future asyncio Future exception}@anchor{38fa}
@deffn {메서드} exception ()

이 Future에 설정된 예외를 반환합니다.

Future가 `완료(done)'했을 때만 예외(또는 예외가 설정되지 않았으면 @code{None})가 반환됩니다.

Future가 `취소(cancelled)'되었으면, 이 메서드는 @ref{4d5,,CancelledError} 예외를 발생시킵니다.

Future가 아직 `완료(done)'하지 않았으면, 이 메서드는 @ref{3821,,InvalidStateError} 예외를 발생시킵니다.
@end deffn

@geindex get_loop() (asyncio.Future 메서드)
@anchor{library/asyncio-future asyncio Future get_loop}@anchor{d05}
@deffn {메서드} get_loop ()

Future 객체가 연결된 이벤트 루프를 반환합니다.


Added in version 3.7.

@end deffn
@end deffn
@anchor{library/asyncio-future asyncio-example-future}@anchor{38fb}
이 예제는 Future 객체를 만들고, Future에 결과를 설정하는 비동기 Task를 만들고 예약하며, Future가 결과를 얻을 때까지 기다립니다:

@example
async def set_after(fut, delay, value):
    # *delay* 초 동안 잠잡니다.
    await asyncio.sleep(delay)

    # *fut* 퓨처의 결과로 *value* 를 설정합니다.
    fut.set_result(value)

async def main():
    # 현재 이벤트 루프를 얻습니다.
    loop = asyncio.get_running_loop()

    # 새로운 Future 객체를 만듭니다.
    fut = loop.create_future()

    # 병렬 태스크로 "set_after()" 코루틴을 실행합니다.
    # 이벤트 루프에 대한 참조를 이미 가지고 있으므로, 여기서는 저수준 "loop.create_task()"
    # API를 사용하고 있습니다.
    # 그렇지 않다면 그저 "asyncio.create_task()" 를 사용할 수 있었습니다.
    loop.create_task(
        set_after(fut, 1, '... world'))

    print('hello ...')

    # *fut* 에 결과가 올 때까지 기다렸다가 (1초) 그것을 인쇄합니다.
    print(await fut)

asyncio.run(main())
@end example

@cartouche
@quotation 중요 
Future 객체는 @ref{13b7,,concurrent.futures.Future}를 흉내 내도록 설계되었습니다. 주요 차이점은 다음과 같습니다:


@itemize -

@item 
asyncio 퓨처와는 달리, @ref{13b7,,concurrent.futures.Future} 인스턴스는 await 할 수 없습니다.

@item 
@ref{38f7,,asyncio.Future.result()} 와 @ref{38fa,,asyncio.Future.exception()}은 `timeout' 인자를 받아들이지 않습니다.

@item 
@ref{38f7,,asyncio.Future.result()} 와 @ref{38fa,,asyncio.Future.exception()}는 Future가 `완료(done)'하지 않았을 때 @ref{3821,,InvalidStateError} 예외를 발생시킵니다.

@item 
@ref{cfd,,asyncio.Future.add_done_callback()}으로 등록된 콜백은 즉시 호출되지 않습니다. 대신 @ref{cf9,,loop.call_soon()}로 예약됩니다.

@item 
asyncio Future는 @ref{1c03,,concurrent.futures.wait()} 와 @ref{19c7,,concurrent.futures.as_completed()} 함수와 호환되지 않습니다.

@item 
@ref{1ba7,,asyncio.Future.cancel()}은 선택적 @code{msg} 인자를 받아들이지만, @ref{371f,,concurrent.futures.Future.cancel()}은 받아들이지 않습니다.
@end itemize
@end quotation
@end cartouche

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 트랜스포트와 프로토콜,정책,퓨처,asyncio — 비동기 I/O
@anchor{library/asyncio-protocol doc}@anchor{38fc}@anchor{library/asyncio-protocol asyncio-transports-protocols}@anchor{37f1}@anchor{library/asyncio-protocol translation-repo}@anchor{38fd}@anchor{library/asyncio-protocol transports-and-protocols}@anchor{38fe}
@subsubsection 트랜스포트와 프로토콜


@subsubheading 머리말


트랜스포트와 프로토콜은 @ref{817,,loop.create_connection()}와 같은 `저수준' 이벤트 루프 API에서 사용됩니다. 그들은 콜백 기반 프로그래밍 스타일을 사용하고 네트워크 나 IPC 프로토콜(예를 들어 HTTP)의 고성능 구현을 가능하게 합니다.

본질에서 트랜스포트와 프로토콜은 라이브러리와 프레임워크에서만 사용되어야 하며 고수준 asyncio 응용 프로그램에서는 사용되지 않아야 합니다.

이 문서 페이지는 @ref{38ff,,트랜스포트}와 @ref{3900,,프로토콜}을 모두 다룹니다.

@subsubheading 소개


최상위 수준에서, 트랜스포트는 `어떻게(how)' 바이트를 전송할지를 다루지만, 프로토콜은 `어떤(which)' 바이트를 전송할지를 결정합니다 (그리고 어느 정도는 언제(when)도).

같은 것을 다른 식으로 말하면: 트랜스포트는 소켓(또는 유사한 I/O 엔드포인트)의 추상화지만, 프로토콜은 트랜스포트의 관점에서 응용 프로그램의 추상화입니다.

또 다른 시각은 트랜스포트와 프로토콜 인터페이스가 함께 네트워크 I/O와 프로세스 간 I/O를 사용하기 위한 추상 인터페이스를 정의한다는 것입니다.

트랜스포트 객체와 프로토콜 객체 간에는 항상 1:1 관계가 있습니다: 프로토콜은 트랜스포트 메서드를 호출하여 데이터를 보내지만, 트랜스포트는 프로토콜 메서드를 호출하여 받은 데이터를 전달합니다.

대부분의 연결 지향 이벤트 루프 메서드(가령 @ref{817,,loop.create_connection()})는 `Transport' 객체로 표현되는 받아들인 연결을 위한 `Protocol' 객체를 만드는 데 사용되는 `protocol_factory' 인자를 받아들입니다. 이러한 메서드는 대개 @code{(transport, protocol)}의 튜플을 반환합니다.

@subsubheading 목차


이 설명서 페이지는 다음 절로 구성됩니다:


@itemize *

@item 
@ref{38ff,,트랜스포트} 절은 asyncio @ref{3901,,BaseTransport}, @ref{38d6,,ReadTransport}, @ref{38d7,,WriteTransport}, @ref{3902,,Transport}, @ref{1b25,,DatagramTransport} 및 @ref{38e4,,SubprocessTransport} 클래스를 설명합니다.

@item 
@ref{3900,,프로토콜} 절은 asyncio @ref{3903,,BaseProtocol}, @ref{3904,,Protocol}, @ref{c93,,BufferedProtocol}, @ref{8dd,,DatagramProtocol} 및 @ref{38e3,,SubprocessProtocol} 클래스를 설명합니다.

@item 
@ref{3905,,예제} 절은 트랜스포트, 프로토콜 및 저수준 이벤트 루프 API를 사용하는 방법을 보여줍니다.
@end itemize

@menu
* 트랜스포트:: 
* 프로토콜:: 
* 예제: 예제<17>. 

@end menu

@node 트랜스포트,프로토콜,,트랜스포트와 프로토콜
@anchor{library/asyncio-protocol asyncio-transport}@anchor{38c4}@anchor{library/asyncio-protocol transports}@anchor{38ff}
@subsubsection 트랜스포트


`소스 코드:' Lib/asyncio/transports.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/asyncio/transports.py}


__________________________________________________________________


트랜스포트는 다양한 종류의 통신 채널을 추상화하기 위해 @ref{b,,asyncio}에서 제공하는 클래스입니다.

트랜스포트 객체는 항상 @ref{f75,,asyncio 이벤트 루프}에 의해 인스턴스로 만들어집니다.

asyncio는 TCP, UDP, SSL 및 서브 프로세스 파이프를 위한 트랜스포트를 구현합니다. 트랜스포트에서 사용할 수 있는 메서드는 트랜스포트의 종류에 따라 다릅니다.

트랜스포트 클래스는 @ref{3819,,스레드 안전하지 않습니다}.

@menu
* 트랜스포트 계층 구조:: 
* 베이스 트랜스포트:: 
* 읽기 전용 트랜스포트:: 
* 쓰기 전용 트랜스포트:: 
* 데이터 그램 트랜스포트:: 
* 서브 프로세스 트랜스포트:: 

@end menu

@node 트랜스포트 계층 구조,베이스 트랜스포트,,트랜스포트
@anchor{library/asyncio-protocol transports-hierarchy}@anchor{3906}
@subsubsection 트랜스포트 계층 구조


@geindex BaseTransport (asyncio 클래스)
@anchor{library/asyncio-protocol asyncio BaseTransport}@anchor{3901}
@deffn {클래스} asyncio.BaseTransport

모든 트랜스포트의 베이스 클래스. 모든 asyncio 트랜스포트가 공유하는 메서드를 포함합니다.
@end deffn

@geindex WriteTransport (asyncio 클래스)
@anchor{library/asyncio-protocol asyncio WriteTransport}@anchor{38d7}
@deffn {클래스} asyncio.WriteTransport (BaseTransport)

쓰기 전용 연결을 위한 베이스 트랜스포트

`WriteTransport' 클래스의 인스턴스는 @ref{387a,,loop.connect_write_pipe()} 이벤트 루프 메서드에서 반환되며 @ref{3874,,loop.subprocess_exec()}와 같은 서브 프로세스 관련 메서드에서도 사용됩니다.
@end deffn

@geindex ReadTransport (asyncio 클래스)
@anchor{library/asyncio-protocol asyncio ReadTransport}@anchor{38d6}
@deffn {클래스} asyncio.ReadTransport (BaseTransport)

읽기 전용 연결을 위한 베이스 트랜스포트

`ReadTransport' 클래스의 인스턴스는 @ref{3879,,loop.connect_read_pipe()} 이벤트 루프 메서드에서 반환되며 @ref{3874,,loop.subprocess_exec()}와 같은 서브 프로세스 관련 메서드에서도 사용됩니다.
@end deffn

@geindex Transport (asyncio 클래스)
@anchor{library/asyncio-protocol asyncio Transport}@anchor{3902}
@deffn {클래스} asyncio.Transport (WriteTransport, ReadTransport)

TCP 연결과 같은 양방향 트랜스포트를 나타내는 인터페이스.

사용자는 트랜스포트를 직접 인스턴스로 만들지 않습니다; 유틸리티 함수를 호출하고, 프로토콜 팩토리와 트랜스포트와 프로토콜을 만드는 데 필요한 기타 정보를 전달합니다.

`Transport' 클래스의 인스턴스는 @ref{817,,loop.create_connection()}, @ref{3830,,loop.create_unix_connection()}, @ref{d08,,loop.create_server()}, @ref{38cc,,loop.sendfile()} 등과 같은 이벤트 루프 메서드에서 반환되거나 사용됩니다.
@end deffn

@geindex DatagramTransport (asyncio 클래스)
@anchor{library/asyncio-protocol asyncio DatagramTransport}@anchor{1b25}
@deffn {클래스} asyncio.DatagramTransport (BaseTransport)

데이터 그램 (UDP) 연결을 위한 트랜스포트.

`DatagramTransport' 클래스의 인스턴스는 @ref{93b,,loop.create_datagram_endpoint()} 이벤트 루프 메서드에서 반환됩니다.
@end deffn

@geindex SubprocessTransport (asyncio 클래스)
@anchor{library/asyncio-protocol asyncio SubprocessTransport}@anchor{38e4}
@deffn {클래스} asyncio.SubprocessTransport (BaseTransport)

부모와 그 자식 OS 프로세스 간의 연결을 나타내는 추상화.

`SubprocessTransport' 클래스의 인스턴스는 이벤트 루프 메서드 @ref{3875,,loop.subprocess_shell()}과 @ref{3874,,loop.subprocess_exec()}에서 반환됩니다.
@end deffn

@node 베이스 트랜스포트,읽기 전용 트랜스포트,트랜스포트 계층 구조,트랜스포트
@anchor{library/asyncio-protocol base-transport}@anchor{3907}
@subsubsection 베이스 트랜스포트


@geindex close() (asyncio.BaseTransport 메서드)
@anchor{library/asyncio-protocol asyncio BaseTransport close}@anchor{38c6}
@deffn {메서드} BaseTransport.close ()

트랜스포트를 닫습니다.

트랜스포트에 송신 데이터용 버퍼가 있으면, 버퍼 된 데이터는 비동기적으로 플러시 됩니다. 더는 데이터가 수신되지 않습니다. 버퍼 된 모든 데이터가 플러시 된 후, 프로토콜의 @ref{3908,,protocol.connection_lost()} 메서드가 @ref{884,,None}을 인자로 사용하여 호출됩니다. 트랜스포트가 닫힌 후에는 사용해서는 안 됩니다.
@end deffn

@geindex is_closing() (asyncio.BaseTransport 메서드)
@anchor{library/asyncio-protocol asyncio BaseTransport is_closing}@anchor{e72}
@deffn {메서드} BaseTransport.is_closing ()

트랜스포트가 닫히는 중이거나 닫혔으면 @code{True}를 반환합니다.
@end deffn

@geindex get_extra_info() (asyncio.BaseTransport 메서드)
@anchor{library/asyncio-protocol asyncio BaseTransport get_extra_info}@anchor{c92}
@deffn {메서드} BaseTransport.get_extra_info (name, default=None)

트랜스포트나 그것이 사용하는 하부 자원에 대한 정보를 반환합니다.

`name'은 얻고자 하는 트랜스포트 특정 정보의 조각을 나타내는 문자열입니다.

`default'는 정보가 없거나 트랜스포트가 제삼자 이벤트 루프 구현이나 현재 플랫폼에서 조회를 지원하지 않을 때 반환 할 값입니다.

예를 들어, 다음 코드는 트랜스포트의 하부 소켓 객체를 가져오려고 시도합니다:

@example
sock = transport.get_extra_info('socket')
if sock is not None:
    print(sock.getsockopt(...))
@end example

일부 트랜스포트에서 조회할 수 있는 정보의 범주:


@itemize *

@item 
소켓:


@itemize -

@item 
@code{'peername'}: 소켓이 연결된 원격 주소, @ref{3909,,socket.socket.getpeername()}의 결과 (에러 시 @code{None})

@item 
@code{'socket'}: @ref{fa0,,socket.socket} 인스턴스

@item 
@code{'sockname'}: 소켓 자체 주소, @ref{284,,socket.socket.getsockname()}의 결과
@end itemize

@item 
SSL 소켓:


@itemize -

@item 
@code{'compression'}: 문자열로 표현된 사용된 압축 알고리즘, 또는 연결이 압축되지 않았으면 @code{None}; @ref{134a,,ssl.SSLSocket.compression()}의 결과

@item 
@code{'cipher'}: 사용되는 암호 체계의 이름, 이의 사용을 정의하는 SSL 프로토콜의 버전 및 사용되는 비밀 비트의 수를 포함하는 3-튜플; @ref{390a,,ssl.SSLSocket.cipher()}의 결과

@item 
@code{'peercert'}: 피어 인증서; @ref{11b7,,ssl.SSLSocket.getpeercert()}의 결과

@item 
@code{'sslcontext'}: @ref{357,,ssl.SSLContext} 인스턴스

@item 
@code{'ssl_object'}: @ref{d79,,ssl.SSLObject} 나 @ref{ae7,,ssl.SSLSocket} 인스턴스
@end itemize

@item 
파이프:


@itemize -

@item 
@code{'pipe'}: 파이프 객체
@end itemize

@item 
서브 프로세스:


@itemize -

@item 
@code{'subprocess'}: @ref{4b8,,subprocess.Popen} 인스턴스
@end itemize
@end itemize
@end deffn

@geindex set_protocol() (asyncio.BaseTransport 메서드)
@anchor{library/asyncio-protocol asyncio BaseTransport set_protocol}@anchor{390b}
@deffn {메서드} BaseTransport.set_protocol (protocol)

새 프로토콜을 설정합니다.

프로토콜의 교환은 두 프로토콜이 교환을 지원한다고 문서화 되었을 때만 수행되어야 합니다.
@end deffn

@geindex get_protocol() (asyncio.BaseTransport 메서드)
@anchor{library/asyncio-protocol asyncio BaseTransport get_protocol}@anchor{390c}
@deffn {메서드} BaseTransport.get_protocol ()

현재 프로토콜을 반환합니다.
@end deffn

@node 읽기 전용 트랜스포트,쓰기 전용 트랜스포트,베이스 트랜스포트,트랜스포트
@anchor{library/asyncio-protocol read-only-transports}@anchor{390d}
@subsubsection 읽기 전용 트랜스포트


@geindex is_reading() (asyncio.ReadTransport 메서드)
@anchor{library/asyncio-protocol asyncio ReadTransport is_reading}@anchor{d10}
@deffn {메서드} ReadTransport.is_reading ()

트랜스 포트가 새로운 데이터를 받고 있으면 @code{True}를 반환합니다.


Added in version 3.7.

@end deffn

@geindex pause_reading() (asyncio.ReadTransport 메서드)
@anchor{library/asyncio-protocol asyncio ReadTransport pause_reading}@anchor{d12}
@deffn {메서드} ReadTransport.pause_reading ()

트랜스포트의 수신 끝을 일시 중지합니다. @ref{d11,,resume_reading()}이 호출 될 때까지 프로토콜의 @ref{1b00,,protocol.data_received()} 메서드에 데이터가 전달되지 않습니다.


버전 3.7에서 변경: 이 메서드는 멱등적(idempotent)입니다. 즉, 트랜스포트가 이미 일시 중지되거나 닫혔을 때도 호출할 수 있습니다.

@end deffn

@geindex resume_reading() (asyncio.ReadTransport 메서드)
@anchor{library/asyncio-protocol asyncio ReadTransport resume_reading}@anchor{d11}
@deffn {메서드} ReadTransport.resume_reading ()

수신 끝을 재개합니다. 읽을 수 있는 데이터가 있다면 프로토콜의 @ref{1b00,,protocol.data_received()} 메서드가 다시 한번 호출됩니다.


버전 3.7에서 변경: 이 메서드는 멱등적(idempotent)입니다. 즉, 트랜스포트가 이미 읽고 있을 때도 호출할 수 있습니다.

@end deffn

@node 쓰기 전용 트랜스포트,데이터 그램 트랜스포트,읽기 전용 트랜스포트,트랜스포트
@anchor{library/asyncio-protocol write-only-transports}@anchor{390e}
@subsubsection 쓰기 전용 트랜스포트


@geindex abort() (asyncio.WriteTransport 메서드)
@anchor{library/asyncio-protocol asyncio WriteTransport abort}@anchor{38e7}
@deffn {메서드} WriteTransport.abort ()

계류 중인 작업이 완료될 때까지 기다리지 않고, 즉시 트랜스포트를 닫습니다. 버퍼 된 데이터는 손실됩니다. 더는 데이터가 수신되지 않습니다. 프로토콜의 @ref{3908,,protocol.connection_lost()} 메서드는 결국 @ref{884,,None}을 인자로 사용하여 호출됩니다.
@end deffn

@geindex can_write_eof() (asyncio.WriteTransport 메서드)
@anchor{library/asyncio-protocol asyncio WriteTransport can_write_eof}@anchor{390f}
@deffn {메서드} WriteTransport.can_write_eof ()

트랜스포트가 @ref{3910,,write_eof()}를 지원하면 @ref{e06,,True}를 반환하고, 그렇지 않으면 @ref{d2a,,False}를 반환합니다.
@end deffn

@geindex get_write_buffer_size() (asyncio.WriteTransport 메서드)
@anchor{library/asyncio-protocol asyncio WriteTransport get_write_buffer_size}@anchor{3911}
@deffn {메서드} WriteTransport.get_write_buffer_size ()

트랜스포트가 사용하는 출력 버퍼의 현재 크기를 반환합니다.
@end deffn

@geindex get_write_buffer_limits() (asyncio.WriteTransport 메서드)
@anchor{library/asyncio-protocol asyncio WriteTransport get_write_buffer_limits}@anchor{fc3}
@deffn {메서드} WriteTransport.get_write_buffer_limits ()

쓰기 흐름 제어를 위한 `high' 와 `low' 수위(watermark)를 가져옵니다. 튜플 @code{(low, high)}를 반환합니다. 여기서 `low' 와 `high'는 양의 바이트 수입니다.

제한을 설정하려면 @ref{3912,,set_write_buffer_limits()}를 사용하십시오.


Added in version 3.4.2.

@end deffn

@geindex set_write_buffer_limits() (asyncio.WriteTransport 메서드)
@anchor{library/asyncio-protocol asyncio WriteTransport set_write_buffer_limits}@anchor{3912}
@deffn {메서드} WriteTransport.set_write_buffer_limits (high=None, low=None)

쓰기 흐름 제어를 위한 `high' 와 `low' 수위(watermark)를 설정합니다.

이 두 값(바이트 수로 측정)은 프로토콜의 @ref{3913,,protocol.pause_writing()} 과 @ref{3914,,protocol.resume_writing()} 메서드가 언제 호출될지를 제어합니다. 지정하면, low 수위는 high 수위보다 작거나 같아야 합니다. `high' 와 `low'는 음수가 될 수 없습니다.

버퍼 크기가 `high' 값보다 크거나 같아질 때 @ref{3913,,pause_writing()}가 호출됩니다. 쓰기가 일시 중지되면, 버퍼 크기가 `low' 값보다 작거나 같아질 때 @ref{3914,,resume_writing()}이 호출됩니다.

기본값은 구현에 따라 다릅니다. high 수위만 주어지면, low 수위는 high 수위보다 작거나 같은 구현 특정 기본값이 사용됩니다. `high'를 0으로 설정하면, `low'도 0으로 설정되고, 버퍼가 비어있지 않게 될 때마다 @ref{3913,,pause_writing()}가 호출되도록 합니다. `low'를 0으로 설정하면 버퍼가 빌 때만 @ref{3914,,resume_writing()}이 호출됩니다. 두 제한 중 하나에 0을 사용하는 것은 I/O와 계산을 동시에 수행할 기회를 줄이기 때문에 일반적으로 최선이 아닙니다.

제한을 가져오려면 @ref{fc3,,get_write_buffer_limits()}를 사용하십시오.
@end deffn

@geindex write() (asyncio.WriteTransport 메서드)
@anchor{library/asyncio-protocol asyncio WriteTransport write}@anchor{17d0}
@deffn {메서드} WriteTransport.write (data)

어떤 `data' 바이트열을 트랜스포트에 기록합니다.

이 메서드는 블록하지 않습니다; 데이터를 버퍼하고 비동기적으로 전송되도록 배치합니다.
@end deffn

@geindex writelines() (asyncio.WriteTransport 메서드)
@anchor{library/asyncio-protocol asyncio WriteTransport writelines}@anchor{17cf}
@deffn {메서드} WriteTransport.writelines (list_of_data)

트랜스포트에 데이터 바이트열 리스트(또는 임의의 이터러블)를 기록합니다. 이것은 이터러블이 산출하는 각 요소에 대해 @ref{17d0,,write()}를 호출하는 것과 기능 면에서 동등하지만, 더 효율적으로 구현될 수 있습니다.
@end deffn

@geindex write_eof() (asyncio.WriteTransport 메서드)
@anchor{library/asyncio-protocol asyncio WriteTransport write_eof}@anchor{3910}
@deffn {메서드} WriteTransport.write_eof ()

버퍼 된 모든 데이터를 플러시 한 후 트랜스포트의 쓰기 끝을 닫습니다. 데이터가 여전히 수신될 수 있습니다.

이 메서드는 트랜스포트(예를 들어 SSL)가 반만 닫힌 연결을 지원하지 않으면 @ref{36b,,NotImplementedError}를 발생시킬 수 있습니다.
@end deffn

@node 데이터 그램 트랜스포트,서브 프로세스 트랜스포트,쓰기 전용 트랜스포트,트랜스포트
@anchor{library/asyncio-protocol datagram-transports}@anchor{3915}
@subsubsection 데이터 그램 트랜스포트


@geindex sendto() (asyncio.DatagramTransport 메서드)
@anchor{library/asyncio-protocol asyncio DatagramTransport sendto}@anchor{4cc}
@deffn {메서드} DatagramTransport.sendto (data, addr=None)

`addr'(트랜스포트 종속적인 대상 주소)에 의해 주어진 원격 피어로 `data' 바이트열을 보냅니다. `addr'가 @ref{884,,None}이면, 트랜스포트를 만들 때 지정된 대상 주소로 data가 전송됩니다.

이 메서드는 블록하지 않습니다; 데이터를 버퍼하고 비동기적으로 전송되도록 배치합니다.


버전 3.13에서 변경: This method can be called with an empty bytes object to send a
zero-length datagram. The buffer size calculation used for flow
control is also updated to account for the datagram header.

@end deffn

@geindex abort() (asyncio.DatagramTransport 메서드)
@anchor{library/asyncio-protocol asyncio DatagramTransport abort}@anchor{3916}
@deffn {메서드} DatagramTransport.abort ()

계류 중인 작업이 완료될 때까지 기다리지 않고, 즉시 트랜스포트를 닫습니다. 버퍼 된 데이터는 손실됩니다. 더는 데이터가 수신되지 않습니다. 프로토콜의 @ref{3908,,protocol.connection_lost()} 메서드는 결국 @ref{884,,None}을 인자로 사용하여 호출됩니다.
@end deffn

@node 서브 프로세스 트랜스포트,,데이터 그램 트랜스포트,트랜스포트
@anchor{library/asyncio-protocol asyncio-subprocess-transports}@anchor{3877}@anchor{library/asyncio-protocol subprocess-transports}@anchor{3917}
@subsubsection 서브 프로세스 트랜스포트


@geindex get_pid() (asyncio.SubprocessTransport 메서드)
@anchor{library/asyncio-protocol asyncio SubprocessTransport get_pid}@anchor{3918}
@deffn {메서드} SubprocessTransport.get_pid ()

서브 프로세스 ID를 정수로 반환합니다.
@end deffn

@geindex get_pipe_transport() (asyncio.SubprocessTransport 메서드)
@anchor{library/asyncio-protocol asyncio SubprocessTransport get_pipe_transport}@anchor{3919}
@deffn {메서드} SubprocessTransport.get_pipe_transport (fd)

정수 파일 기술자 `fd'에 대응하는 통신 파이프의 트랜스포트를 돌려줍니다:


@itemize *

@item 
@code{0}: writable streaming transport of the standard input (`stdin'),
or @ref{884,,None} if the subprocess was not created with @code{stdin=PIPE}

@item 
@code{1}: readable streaming transport of the standard output (`stdout'),
or @ref{884,,None} if the subprocess was not created with @code{stdout=PIPE}

@item 
@code{2}: readable streaming transport of the standard error (`stderr'),
or @ref{884,,None} if the subprocess was not created with @code{stderr=PIPE}

@item 
다른 `fd': @ref{884,,None}
@end itemize
@end deffn

@geindex get_returncode() (asyncio.SubprocessTransport 메서드)
@anchor{library/asyncio-protocol asyncio SubprocessTransport get_returncode}@anchor{391a}
@deffn {메서드} SubprocessTransport.get_returncode ()

서브 프로세스 반환 값을 정수로, 혹은 반환되지 않았으면 @ref{884,,None}을 반환합니다. @ref{c82,,subprocess.Popen.returncode} 어트리뷰트와 유사합니다.
@end deffn

@geindex kill() (asyncio.SubprocessTransport 메서드)
@anchor{library/asyncio-protocol asyncio SubprocessTransport kill}@anchor{391b}
@deffn {메서드} SubprocessTransport.kill ()

서브 프로세스를 죽입니다.

POSIX 시스템에서, 이 함수는 SIGKILL을 서브 프로세스로 보냅니다. 윈도우에서, 이 메서드는 @ref{391c,,terminate()}의 별칭입니다.

@ref{15e2,,subprocess.Popen.kill()}도 참조하십시오.
@end deffn

@geindex send_signal() (asyncio.SubprocessTransport 메서드)
@anchor{library/asyncio-protocol asyncio SubprocessTransport send_signal}@anchor{391d}
@deffn {메서드} SubprocessTransport.send_signal (signal)

@ref{15e3,,subprocess.Popen.send_signal()}와 마찬가지로 `signal' 번호를 서브 프로세스로 보냅니다.
@end deffn

@geindex terminate() (asyncio.SubprocessTransport 메서드)
@anchor{library/asyncio-protocol asyncio SubprocessTransport terminate}@anchor{391c}
@deffn {메서드} SubprocessTransport.terminate ()

서브 프로세스를 중지합니다.

POSIX 시스템에서, 이 메서드는 @ref{15e4,,SIGTERM}을 서브 프로세스로 보냅니다. 윈도에서, 서브 프로세스를 중지하기 위해 윈도우 API 함수 @code{TerminateProcess()}가 호출됩니다.

@ref{15e1,,subprocess.Popen.terminate()}도 참조하십시오.
@end deffn

@geindex close() (asyncio.SubprocessTransport 메서드)
@anchor{library/asyncio-protocol asyncio SubprocessTransport close}@anchor{391e}
@deffn {메서드} SubprocessTransport.close ()

@ref{391b,,kill()} 메서드를 호출하여 서브 프로세스를 죽입니다.

서브 프로세스가 아직 반환하지 않았으면, `stdin', `stdout' 및 `stderr' 파이프의 트랜스포트를 닫습니다.
@end deffn

@node 프로토콜,예제<17>,트랜스포트,트랜스포트와 프로토콜
@anchor{library/asyncio-protocol asyncio-protocol}@anchor{38c3}@anchor{library/asyncio-protocol protocols}@anchor{3900}
@subsubsection 프로토콜


`소스 코드:' Lib/asyncio/protocols.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/asyncio/protocols.py}


__________________________________________________________________


asyncio는 네트워크 프로토콜을 구현하는 데 사용해야 하는 추상 베이스 클래스 집합을 제공합니다. 이러한 클래스는 @ref{38c4,,트랜스포트}와 함께 사용해야 합니다.

추상 베이스 프로토콜 클래스의 서브 클래스는 일부 또는 모든 메서드를 구현할 수 있습니다. 이 모든 메서드는 콜백입니다: 이것들은 특정 이벤트에서 트랜스포트에 의해 호출됩니다, 예를 들어 어떤 데이터가 수신될 때. 베이스 프로토콜 메서드는 해당 트랜스포트에 의해 호출되어야 합니다.

@menu
* 베이스 프로토콜:: 
* 베이스 프로토콜: 베이스 프로토콜<2>. 
* 스트리밍 프로토콜:: 
* 버퍼 된 스트리밍 프로토콜:: 
* 데이터 그램 프로토콜:: 
* 서브 프로세스 프로토콜:: 

@end menu

@node 베이스 프로토콜,베이스 프로토콜<2>,,프로토콜
@anchor{library/asyncio-protocol base-protocols}@anchor{391f}
@subsubsection 베이스 프로토콜


@geindex BaseProtocol (asyncio 클래스)
@anchor{library/asyncio-protocol asyncio BaseProtocol}@anchor{3903}
@deffn {클래스} asyncio.BaseProtocol

모든 프로토콜이 공유하는 메서드를 가진 베이스 프로토콜.
@end deffn

@geindex Protocol (asyncio 클래스)
@anchor{library/asyncio-protocol asyncio Protocol}@anchor{3904}
@deffn {클래스} asyncio.Protocol (BaseProtocol)

스트리밍 프로토콜(TCP, 유닉스 소켓 등)을 구현하기 위한 베이스 클래스.
@end deffn

@geindex BufferedProtocol (asyncio 클래스)
@anchor{library/asyncio-protocol asyncio BufferedProtocol}@anchor{c93}
@deffn {클래스} asyncio.BufferedProtocol (BaseProtocol)

수신 버퍼의 수동 제어로 스트리밍 프로토콜을 구현하기 위한 베이스 클래스.
@end deffn

@geindex DatagramProtocol (asyncio 클래스)
@anchor{library/asyncio-protocol asyncio DatagramProtocol}@anchor{8dd}
@deffn {클래스} asyncio.DatagramProtocol (BaseProtocol)

데이터 그램 (UDP) 프로토콜을 구현하기 위한 베이스 클래스.
@end deffn

@geindex SubprocessProtocol (asyncio 클래스)
@anchor{library/asyncio-protocol asyncio SubprocessProtocol}@anchor{38e3}
@deffn {클래스} asyncio.SubprocessProtocol (BaseProtocol)

자식 프로세스와 통신하는 (단방향 파이프) 프로토콜을 구현하기 위한 베이스 클래스.
@end deffn

@node 베이스 프로토콜<2>,스트리밍 프로토콜,베이스 프로토콜,프로토콜
@anchor{library/asyncio-protocol base-protocol}@anchor{3920}
@subsubsection 베이스 프로토콜


모든 asyncio 프로토콜은 베이스 프로토콜 콜백을 구현할 수 있습니다.

@subsubheading 연결 콜백


연결 콜백은 모든 프로토콜에서 성공적으로 연결될 때마다 정확히 한 번 호출됩니다. 다른 모든 프로토콜 콜백은 이 두 메서드 사이에서만 호출될 수 있습니다.

@geindex connection_made() (asyncio.BaseProtocol 메서드)
@anchor{library/asyncio-protocol asyncio BaseProtocol connection_made}@anchor{3921}
@deffn {메서드} BaseProtocol.connection_made (transport)

연결이 이루어질 때 호출됩니다.

`transport' 인자는 연결을 나타내는 트랜스포트입니다. 트랜스포트에 대한 참조를 저장하는 것은 프로토콜의 책임입니다.
@end deffn

@geindex connection_lost() (asyncio.BaseProtocol 메서드)
@anchor{library/asyncio-protocol asyncio BaseProtocol connection_lost}@anchor{3908}
@deffn {메서드} BaseProtocol.connection_lost (exc)

연결이 끊어지거나 닫힐 때 호출됩니다.

인자는 예외 객체나 @ref{884,,None}입니다. 후자는 정상적인 EOF가 수신되었거나, 연결의 이쪽에서 연결이 중단(abort)되거나 닫혔다는 것을 의미합니다.
@end deffn

@subsubheading 흐름 제어 콜백


흐름 제어 콜백은 프로토콜에 의해 수행되는 쓰기를 일시 중지하거나 다시 시작하도록 트랜스포트에 의해 호출될 수 있습니다.

자세한 내용은 @ref{3912,,set_write_buffer_limits()} 메서드 설명서를 참조하십시오.

@geindex pause_writing() (asyncio.BaseProtocol 메서드)
@anchor{library/asyncio-protocol asyncio BaseProtocol pause_writing}@anchor{3913}
@deffn {메서드} BaseProtocol.pause_writing ()

트랜스포트 버퍼가 높은 수위를 넘을 때 호출됩니다.
@end deffn

@geindex resume_writing() (asyncio.BaseProtocol 메서드)
@anchor{library/asyncio-protocol asyncio BaseProtocol resume_writing}@anchor{3914}
@deffn {메서드} BaseProtocol.resume_writing ()

트랜스포트 버퍼가 낮은 수위 아래로 내려갈 때 호출됩니다.
@end deffn

버퍼 크기가 높은 수위와 같으면, @ref{3913,,pause_writing()}이 호출되지 않습니다: 버퍼 크기는 엄격하게 초과해야 합니다.

반대로, @ref{3914,,resume_writing()}은 버퍼 크기가 낮은 수위와 같거나 낮을 때 호출됩니다. 이러한 종료 조건은 수위가 0일 때 예상대로 진행되게 하려면 중요합니다.

@node 스트리밍 프로토콜,버퍼 된 스트리밍 프로토콜,베이스 프로토콜<2>,프로토콜
@anchor{library/asyncio-protocol streaming-protocols}@anchor{3922}
@subsubsection 스트리밍 프로토콜


@ref{d08,,loop.create_server()}, @ref{4cb,,loop.create_unix_server()}, @ref{817,,loop.create_connection()}, @ref{3830,,loop.create_unix_connection()}, @ref{9de,,loop.connect_accepted_socket()}, @ref{3879,,loop.connect_read_pipe()} 및 @ref{387a,,loop.connect_write_pipe()}와 같은 이벤트 메서드는 스트리밍 프로토콜을 반환하는 팩토리를 받아들입니다.

@geindex data_received() (asyncio.Protocol 메서드)
@anchor{library/asyncio-protocol asyncio Protocol data_received}@anchor{1b00}
@deffn {메서드} Protocol.data_received (data)

어떤 데이터가 수신될 때 호출됩니다. `data'는 수신 데이터가 들어있는 비어 있지 않은 바이트열 객체입니다.

데이터가 버퍼 되고, 조각으로 나뉘고, 재조립되는지는 트랜스포트에 달려있습니다. 일반적으로, 특정 의미에 의존해서는 안 되며, 구문 분석을 일반적이고 유연하게 만들어야 합니다. 그러나, 데이터는 항상 올바른 순서로 수신됩니다.

이 메서드는 연결이 열려있는 동안 임의의 횟수만큼 호출될 수 있습니다.

그러나, @ref{3923,,protocol.eof_received()}는 최대한 한 번만 호출됩니다. 일단 @code{eof_received()}가 호출되면, @code{data_received()}는 더는 호출되지 않습니다.
@end deffn

@geindex eof_received() (asyncio.Protocol 메서드)
@anchor{library/asyncio-protocol asyncio Protocol eof_received}@anchor{3923}
@deffn {메서드} Protocol.eof_received ()

다른 쪽 끝이 더는 데이터를 보내지 않을 것이라는 신호를 보낼 때 호출됩니다 (예를 들어, 다른 쪽 끝도 asyncio를 사용하면, @ref{3910,,transport.write_eof()}를 호출하여).

이 메서드는 거짓 값(@code{None} 포함)을 반환할 수 있으며, 이때 트랜스포트는 스스로 닫힙니다. 반대로, 이 메서드가 참값을 반환하면, 사용된 프로토콜이 트랜스포트를 닫을지를 결정합니다. 기본 구현이 @code{None}을 반환하기 때문에, 묵시적으로 연결을 닫습니다.

SSL을 포함한 일부 트랜스포트는, 반만 닫힌 연결을 지원하지 않습니다. 이때, 이 메서드에서 참을 반환하면 연결이 닫힙니다.
@end deffn

상태 기계:

@example
start -> connection_made
    [-> data_received]*
    [-> eof_received]?
-> connection_lost -> end
@end example

@node 버퍼 된 스트리밍 프로토콜,데이터 그램 프로토콜,스트리밍 프로토콜,프로토콜
@anchor{library/asyncio-protocol buffered-streaming-protocols}@anchor{3924}
@subsubsection 버퍼 된 스트리밍 프로토콜



Added in version 3.7.


버퍼 된 프로토콜은 @ref{3922,,스트리밍 프로토콜}을 지원하는 모든 이벤트 루프 메서드와 함께 사용할 수 있습니다.

@code{BufferedProtocol} 구현은 수신 버퍼의 명시적 수동 할당과 제어를 허용합니다. 이벤트 루프는 프로토콜에서 제공하는 버퍼를 사용하여 불필요한 데이터 복사를 피할 수 있습니다. 이로 인해 대량의 데이터를 수신하는 프로토콜의 성능이 크게 향상될 수 있습니다. 정교한 프로토콜 구현은 버퍼 할당 수를 크게 줄일 수 있습니다.

다음 콜백은 @ref{c93,,BufferedProtocol} 인스턴스에 호출됩니다.:

@geindex get_buffer() (asyncio.BufferedProtocol 메서드)
@anchor{library/asyncio-protocol asyncio BufferedProtocol get_buffer}@anchor{3925}
@deffn {메서드} BufferedProtocol.get_buffer (sizehint)

새로운 수신 버퍼를 할당하기 위해서 호출됩니다.

`sizehint'는 반환되는 버퍼에 대해 권장되는 최소 크기입니다. `sizehint'가 제안하는 것보다 더 작거나 큰 버퍼를 반환하는 것이 허용됩니다. -1로 설정하면 버퍼 크기는 임의적일 수 있습니다. 크기가 0인 버퍼를 반환하는 것은 에러입니다.

@code{get_buffer()}는 @ref{260,,버퍼 프로토콜}을 구현하는 객체를 반환해야 합니다.
@end deffn

@geindex buffer_updated() (asyncio.BufferedProtocol 메서드)
@anchor{library/asyncio-protocol asyncio BufferedProtocol buffer_updated}@anchor{3926}
@deffn {메서드} BufferedProtocol.buffer_updated (nbytes)

수신된 데이터로 버퍼가 갱신될 때 호출됩니다.

`nbytes'는 버퍼에 기록된 총 바이트 수입니다.
@end deffn

@geindex eof_received() (asyncio.BufferedProtocol 메서드)
@anchor{library/asyncio-protocol asyncio BufferedProtocol eof_received}@anchor{3927}
@deffn {메서드} BufferedProtocol.eof_received ()

@ref{3923,,protocol.eof_received()} 메서드의 설명서를 참조하십시오.
@end deffn

@ref{3925,,get_buffer()}는 연결 중에 임의의 횟수만큼 호출될 수 있습니다. 그러나, @ref{3923,,protocol.eof_received()}는 최대한 한 번만 호출되며, 호출되면 @code{get_buffer()}와 @ref{3926,,buffer_updated()}는 그 이후로 호출되지 않습니다.

상태 기계:

@example
start -> connection_made
    [-> get_buffer
        [-> buffer_updated]?
    ]*
    [-> eof_received]?
-> connection_lost -> end
@end example

@node 데이터 그램 프로토콜,서브 프로세스 프로토콜,버퍼 된 스트리밍 프로토콜,프로토콜
@anchor{library/asyncio-protocol datagram-protocols}@anchor{3928}
@subsubsection 데이터 그램 프로토콜


데이터 그램 프로토콜 인스턴스는 @ref{93b,,loop.create_datagram_endpoint()} 메서드에 전달된 프로토콜 팩토리에 의해 만들어져야 합니다.

@geindex datagram_received() (asyncio.DatagramProtocol 메서드)
@anchor{library/asyncio-protocol asyncio DatagramProtocol datagram_received}@anchor{3929}
@deffn {메서드} DatagramProtocol.datagram_received (data, addr)

데이터 그램이 수신될 때 호출됩니다. `data'는 수신 데이터를 포함하는 바이트열 객체입니다. `addr'는 데이터를 보내는 피어의 주소입니다; 정확한 형식은 트랜스포트에 따라 다릅니다.
@end deffn

@geindex error_received() (asyncio.DatagramProtocol 메서드)
@anchor{library/asyncio-protocol asyncio DatagramProtocol error_received}@anchor{392a}
@deffn {메서드} DatagramProtocol.error_received (exc)

이전의 송신이나 수신 연산이 @ref{2c0,,OSError}를 일으킬 때 호출됩니다. `exc'는 @code{OSError} 인스턴스입니다.

이 메서드는 드문 조건에서 호출됩니다, 트랜스포트(예를 들어 UDP)가 데이터 그램을 수신자에게 전달할 수 없음을 감지했을 때입니다. 하지만 대부분 전달할 수 없는 데이터 그램은 조용히 삭제됩니다.
@end deffn

@cartouche
@quotation 참고 
BSD 시스템(macOS, FreeBSD 등)에서는, 너무 많은 패킷을 쓰는 것으로 인한 전송 실패를 감지하는 신뢰성 있는 방법이 없으므로 데이터 그램 프로토콜에 대한 흐름 제어가 지원되지 않습니다.

소켓은 항상 ‘ready’로 나타나고 여분의 패킷은 삭제됩니다. @code{errno}가 @ref{1b6f,,errno.ENOBUFS}로 설정된 @ref{2c0,,OSError}가 발생할 수도 그렇지 않을 수도 있습니다; 발생하면, @ref{392a,,DatagramProtocol.error_received()}에게 보고되지만 그렇지 않으면 무시됩니다.
@end quotation
@end cartouche

@node 서브 프로세스 프로토콜,,데이터 그램 프로토콜,프로토콜
@anchor{library/asyncio-protocol asyncio-subprocess-protocols}@anchor{3878}@anchor{library/asyncio-protocol subprocess-protocols}@anchor{392b}
@subsubsection 서브 프로세스 프로토콜


서브 프로세스 프로토콜 인스턴스는 @ref{3874,,loop.subprocess_exec()} 와 @ref{3875,,loop.subprocess_shell()} 메서드에 전달된 프로토콜 팩토리에 의해 만들어져야 합니다.

@geindex pipe_data_received() (asyncio.SubprocessProtocol 메서드)
@anchor{library/asyncio-protocol asyncio SubprocessProtocol pipe_data_received}@anchor{1b4e}
@deffn {메서드} SubprocessProtocol.pipe_data_received (fd, data)

자식 프로세스가 stdout 이나 stderr 파이프에 데이터를 쓸 때 호출됩니다.

`fd'는 파이프의 정수 파일 기술자입니다.

`data'는 수신 된 데이터를 포함하는 비어 있지 않은 바이트열 객체입니다.
@end deffn

@geindex pipe_connection_lost() (asyncio.SubprocessProtocol 메서드)
@anchor{library/asyncio-protocol asyncio SubprocessProtocol pipe_connection_lost}@anchor{392c}
@deffn {메서드} SubprocessProtocol.pipe_connection_lost (fd, exc)

자식 프로세스와 통신하는 파이프 중 하나가 닫히면 호출됩니다.

`fd'는 닫힌 정수 파일 기술자입니다.
@end deffn

@geindex process_exited() (asyncio.SubprocessProtocol 메서드)
@anchor{library/asyncio-protocol asyncio SubprocessProtocol process_exited}@anchor{1b4d}
@deffn {메서드} SubprocessProtocol.process_exited ()

자식 프로세스가 종료할 때 호출됩니다.

It can be called before @ref{1b4e,,pipe_data_received()} and
@ref{392c,,pipe_connection_lost()} methods.
@end deffn

@node 예제<17>,,프로토콜,트랜스포트와 프로토콜
@anchor{library/asyncio-protocol examples}@anchor{3905}
@subsubsection 예제


@menu
* TCP 메아리 서버:: 
* TCP 메아리 클라이언트:: 
* UDP 메아리 서버:: 
* UDP 메아리 클라이언트:: 
* 기존 소켓 연결하기:: 
* loop.subprocess_exec() 와 SubprocessProtocol: loop subprocess_exec 와 SubprocessProtocol. 

@end menu

@node TCP 메아리 서버,TCP 메아리 클라이언트,,예제<17>
@anchor{library/asyncio-protocol asyncio-example-tcp-echo-server-protocol}@anchor{3845}@anchor{library/asyncio-protocol tcp-echo-server}@anchor{392d}
@subsubsection TCP 메아리 서버


@ref{d08,,loop.create_server()} 메서드를 사용하여 TCP 메아리 서버를 만들고, 받은 데이터를 다시 보내고, 연결을 닫습니다:

@example
import asyncio


class EchoServerProtocol(asyncio.Protocol):
    def connection_made(self, transport):
        peername = transport.get_extra_info('peername')
        print('Connection from @{@}'.format(peername))
        self.transport = transport

    def data_received(self, data):
        message = data.decode()
        print('Data received: @{!r@}'.format(message))

        print('Send: @{!r@}'.format(message))
        self.transport.write(data)

        print('Close the client socket')
        self.transport.close()


async def main():
    # 저수준 API를 사용할 계획이므로
    # 이벤트 루프에 대한 참조를 얻습니다.
    loop = asyncio.get_running_loop()

    server = await loop.create_server(
        EchoServerProtocol,
        '127.0.0.1', 8888)

    async with server:
        await server.serve_forever()


asyncio.run(main())
@end example


@subsubheading 더 보기


@ref{3843,,스트림을 사용하는 TCP 메아리 서버} 예제는 고수준 @ref{d0e,,asyncio.start_server()} 함수를 사용합니다.


@node TCP 메아리 클라이언트,UDP 메아리 서버,TCP 메아리 서버,예제<17>
@anchor{library/asyncio-protocol asyncio-example-tcp-echo-client-protocol}@anchor{3842}@anchor{library/asyncio-protocol tcp-echo-client}@anchor{392e}
@subsubsection TCP 메아리 클라이언트


@ref{817,,loop.create_connection()} 메서드를 사용하는 TCP 메아리 클라이언트, 데이터를 보내고 연결이 닫힐 때까지 기다립니다:

@example
import asyncio


class EchoClientProtocol(asyncio.Protocol):
    def __init__(self, message, on_con_lost):
        self.message = message
        self.on_con_lost = on_con_lost

    def connection_made(self, transport):
        transport.write(self.message.encode())
        print('Data sent: @{!r@}'.format(self.message))

    def data_received(self, data):
        print('Data received: @{!r@}'.format(data.decode()))

    def connection_lost(self, exc):
        print('The server closed the connection')
        self.on_con_lost.set_result(True)


async def main():
    # 저수준 API를 사용할 계획이므로
    # 이벤트 루프에 대한 참조를 얻습니다.
    loop = asyncio.get_running_loop()

    on_con_lost = loop.create_future()
    message = 'Hello World!'

    transport, protocol = await loop.create_connection(
        lambda: EchoClientProtocol(message, on_con_lost),
        '127.0.0.1', 8888)

    # 프로토콜이 연결이 끊어졌음을 알릴 때까지 기다리고
    # 트랜스포트를 닫습니다.
    try:
        await on_con_lost
    finally:
        transport.close()


asyncio.run(main())
@end example


@subsubheading 더 보기


@ref{3840,,스트림을 사용하는 TCP 메아리 클라이언트} 예제는 고수준 @ref{d0d,,asyncio.open_connection()} 함수를 사용합니다.


@node UDP 메아리 서버,UDP 메아리 클라이언트,TCP 메아리 클라이언트,예제<17>
@anchor{library/asyncio-protocol asyncio-udp-echo-server-protocol}@anchor{38c8}@anchor{library/asyncio-protocol udp-echo-server}@anchor{392f}
@subsubsection UDP 메아리 서버


@ref{93b,,loop.create_datagram_endpoint()} 메서드를 사용하는 UDP 메아리 서버, 수신된 데이터를 다시 보냅니다:

@example
import asyncio


class EchoServerProtocol:
    def connection_made(self, transport):
        self.transport = transport

    def datagram_received(self, data, addr):
        message = data.decode()
        print('Received %r from %s' % (message, addr))
        print('Send %r to %s' % (message, addr))
        self.transport.sendto(data, addr)


async def main():
    print("Starting UDP server")

    # 저수준 API를 사용할 계획이므로
    # 이벤트 루프에 대한 참조를 얻습니다.
    loop = asyncio.get_running_loop()

    # 모든 클라이언트 요청을 처리할
    # 하나의 프로토콜 인스턴스가 만들어집니다.
    transport, protocol = await loop.create_datagram_endpoint(
        EchoServerProtocol,
        local_addr=('127.0.0.1', 9999))

    try:
        await asyncio.sleep(3600)  # 1시간 동안 서비스합니다.
    finally:
        transport.close()


asyncio.run(main())
@end example

@node UDP 메아리 클라이언트,기존 소켓 연결하기,UDP 메아리 서버,예제<17>
@anchor{library/asyncio-protocol asyncio-udp-echo-client-protocol}@anchor{38c7}@anchor{library/asyncio-protocol udp-echo-client}@anchor{3930}
@subsubsection UDP 메아리 클라이언트


@ref{93b,,loop.create_datagram_endpoint()} 메서드를 사용하는 UDP 메아리 클라이언트, 데이터를 보내고 응답을 받으면 트랜스포트를 닫습니다:

@example
import asyncio


class EchoClientProtocol:
    def __init__(self, message, on_con_lost):
        self.message = message
        self.on_con_lost = on_con_lost
        self.transport = None

    def connection_made(self, transport):
        self.transport = transport
        print('Send:', self.message)
        self.transport.sendto(self.message.encode())

    def datagram_received(self, data, addr):
        print("Received:", data.decode())

        print("Close the socket")
        self.transport.close()

    def error_received(self, exc):
        print('Error received:', exc)

    def connection_lost(self, exc):
        print("Connection closed")
        self.on_con_lost.set_result(True)


async def main():
    # 저수준 API를 사용할 계획이므로
    # 이벤트 루프에 대한 참조를 얻습니다.
    loop = asyncio.get_running_loop()

    on_con_lost = loop.create_future()
    message = "Hello World!"

    transport, protocol = await loop.create_datagram_endpoint(
        lambda: EchoClientProtocol(message, on_con_lost),
        remote_addr=('127.0.0.1', 9999))

    try:
        await on_con_lost
    finally:
        transport.close()


asyncio.run(main())
@end example

@node 기존 소켓 연결하기,loop subprocess_exec 와 SubprocessProtocol,UDP 메아리 클라이언트,예제<17>
@anchor{library/asyncio-protocol asyncio-example-create-connection}@anchor{3849}@anchor{library/asyncio-protocol connecting-existing-sockets}@anchor{3931}
@subsubsection 기존 소켓 연결하기


프로토콜과 함께 @ref{817,,loop.create_connection()} 메서드를 사용하여 소켓이 데이터를 수신할 때까지 기다립니다:

@example
import asyncio
import socket


class MyProtocol(asyncio.Protocol):

    def __init__(self, on_con_lost):
        self.transport = None
        self.on_con_lost = on_con_lost

    def connection_made(self, transport):
        self.transport = transport

    def data_received(self, data):
        print("Received:", data.decode())

        # 작업을 완료했습니다: 트랜스포트를 닫습니다;
        # connection_lost()가 자동으로 호출됩니다.
        self.transport.close()

    def connection_lost(self, exc):
        # 소켓이 닫혔습니다
        self.on_con_lost.set_result(True)


async def main():
    # 저수준 API를 사용할 계획이므로
    # 이벤트 루프에 대한 참조를 얻습니다.
    loop = asyncio.get_running_loop()
    on_con_lost = loop.create_future()

    # 연결된 소켓 쌍을 만듭니다
    rsock, wsock = socket.socketpair()

    # 데이터를 기다릴 소켓을 등록합니다.
    transport, protocol = await loop.create_connection(
        lambda: MyProtocol(on_con_lost), sock=rsock)

    # 네트워크로부터의 데이터 수신을 흉내 냅니다.
    loop.call_soon(wsock.send, 'abc'.encode())

    try:
        await protocol.on_con_lost
    finally:
        transport.close()
        wsock.close()

asyncio.run(main())
@end example


@subsubheading 더 보기


@ref{384a,,파일 기술자에서 읽기 이벤트를 관찰하기} 예제는 저수준의 @ref{384b,,loop.add_reader()} 메서드를 사용하여 FD를 등록합니다.

@ref{3847,,스트림을 사용하여 데이터를 기다리는 열린 소켓 등록} 예제는 코루틴에서 @ref{d0d,,open_connection()} 함수에 의해 생성된 고수준 스트림을 사용합니다.


@node loop subprocess_exec 와 SubprocessProtocol,,기존 소켓 연결하기,예제<17>
@anchor{library/asyncio-protocol asyncio-example-subprocess-proto}@anchor{3889}@anchor{library/asyncio-protocol loop-subprocess-exec-and-subprocessprotocol}@anchor{3932}
@subsubsection loop.subprocess_exec() 와 SubprocessProtocol


서브 프로세스의 출력을 가져오고 서브 프로세스가 끝날 때까지 대기하는 데 사용되는 서브 프로세스 프로토콜의 예.

서브 프로세스는 @ref{3874,,loop.subprocess_exec()} 메서드에 의해 만들어집니다:

@example
import asyncio
import sys

class DateProtocol(asyncio.SubprocessProtocol):
    def __init__(self, exit_future):
        self.exit_future = exit_future
        self.output = bytearray()
        self.pipe_closed = False
        self.exited = False

    def pipe_connection_lost(self, fd, exc):
        self.pipe_closed = True
        self.check_for_exit()

    def pipe_data_received(self, fd, data):
        self.output.extend(data)

    def process_exited(self):
        self.exited = True
        # process_exited() method can be called before
        # pipe_connection_lost() method: wait until both methods are
        # called.
        self.check_for_exit()

    def check_for_exit(self):
        if self.pipe_closed and self.exited:
            self.exit_future.set_result(True)

async def get_date():
    # Get a reference to the event loop as we plan to use
    # low-level APIs.
    loop = asyncio.get_running_loop()

    code = 'import datetime as dt; print(dt.datetime.now())'
    exit_future = asyncio.Future(loop=loop)

    # Create the subprocess controlled by DateProtocol;
    # redirect the standard output into a pipe.
    transport, protocol = await loop.subprocess_exec(
        lambda: DateProtocol(exit_future),
        sys.executable, '-c', code,
        stdin=None, stderr=None)

    # Wait for the subprocess exit using the process_exited()
    # method of the protocol.
    await exit_future

    # Close the stdout pipe.
    transport.close()

    # Read the output which was collected by the
    # pipe_data_received() method of the protocol.
    data = bytes(protocol.output)
    return data.decode('ascii').rstrip()

date = asyncio.run(get_date())
print(f"Current date: @{date@}")
@end example

고수준 API를 사용하여 작성된 @ref{3888,,같은 예제}도 참조하십시오.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 정책,플랫폼 지원,트랜스포트와 프로토콜,asyncio — 비동기 I/O
@anchor{library/asyncio-policy doc}@anchor{3933}@anchor{library/asyncio-policy asyncio-policies}@anchor{38b1}@anchor{library/asyncio-policy policies}@anchor{3934}@anchor{library/asyncio-policy translation-repo}@anchor{3935}
@subsubsection 정책


@cartouche
@quotation 경고 
Policies are deprecated and will be removed in Python 3.16.
Users are encouraged to use the @ref{2f3,,asyncio.run()} function
or the @ref{2f5,,asyncio.Runner} with `loop_factory' to use
the desired loop implementation.
@end quotation
@end cartouche

An event loop policy is a global object
used to get and set the current @ref{f75,,event loop},
as well as create new event loops.
The default policy can be @ref{3936,,replaced} with
@ref{3937,,built-in alternatives}
to use different event loop implementations,
or substituted by a @ref{3938,,custom policy}
that can override these behaviors.

The @ref{3939,,policy object}
gets and sets a separate event loop per `context'.
This is per-thread by default,
though custom policies could define `context' differently.

사용자 정의 이벤트 루프 정책은 @ref{2f2,,get_event_loop()}, @ref{1b53,,set_event_loop()} 및 @ref{37f7,,new_event_loop()}의 동작을 제어할 수 있습니다.

정책 객체는 @ref{30e,,AbstractEventLoopPolicy} 추상 베이스 클래스에 정의된 API를 구현해야 합니다.

@menu
* 정책을 얻고 설정하기:: 
* 정책 객체:: 
* 사용자 정의 정책:: 

@end menu

@node 정책을 얻고 설정하기,정책 객체,,정책
@anchor{library/asyncio-policy asyncio-policy-get-set}@anchor{3936}@anchor{library/asyncio-policy getting-and-setting-the-policy}@anchor{393a}
@subsubsection 정책을 얻고 설정하기


다음 함수는 현재 프로세스의 정책을 가져오고 설정하는 데 사용할 수 있습니다:

@geindex get_event_loop_policy() (asyncio 모듈)
@anchor{library/asyncio-policy asyncio get_event_loop_policy}@anchor{312}
@deffn {함수} asyncio.get_event_loop_policy ()

현재의 프로세스 전반의 정책을 돌려줍니다.


버전 3.14부터 폐지됨: The @code{get_event_loop_policy()} function is deprecated and
will be removed in Python 3.16.

@end deffn

@geindex set_event_loop_policy() (asyncio 모듈)
@anchor{library/asyncio-policy asyncio set_event_loop_policy}@anchor{313}
@deffn {함수} asyncio.set_event_loop_policy (policy)

현재 프로세스 전반의 정책을 `policy'로 설정합니다.

`policy'를 @code{None}으로 설정하면, 기본 정책이 복원됩니다.


버전 3.14부터 폐지됨: The @code{set_event_loop_policy()} function is deprecated and
will be removed in Python 3.16.

@end deffn

@node 정책 객체,사용자 정의 정책,정책을 얻고 설정하기,정책
@anchor{library/asyncio-policy asyncio-policy-objects}@anchor{3939}@anchor{library/asyncio-policy policy-objects}@anchor{393b}
@subsubsection 정책 객체


추상 이벤트 루프 정책 베이스 클래스는 다음과 같이 정의됩니다:

@geindex AbstractEventLoopPolicy (asyncio 클래스)
@anchor{library/asyncio-policy asyncio AbstractEventLoopPolicy}@anchor{30e}
@deffn {클래스} asyncio.AbstractEventLoopPolicy

asyncio 정책의 추상 베이스 클래스.

@geindex get_event_loop() (asyncio.AbstractEventLoopPolicy 메서드)
@anchor{library/asyncio-policy asyncio AbstractEventLoopPolicy get_event_loop}@anchor{393c}
@deffn {메서드} get_event_loop ()

현재 컨텍스트의 이벤트 루프를 가져옵니다.

@ref{b58,,AbstractEventLoop} 인터페이스를 구현하는 이벤트 루프 객체를 반환합니다.

이 메서드는 절대 @code{None}을 반환해서는 안 됩니다.


버전 3.6에서 변경.

@end deffn

@geindex set_event_loop() (asyncio.AbstractEventLoopPolicy 메서드)
@anchor{library/asyncio-policy asyncio AbstractEventLoopPolicy set_event_loop}@anchor{393d}
@deffn {메서드} set_event_loop (loop)

현재 컨텍스트에 대한 이벤트 루프를 `loop'로 설정합니다.
@end deffn

@geindex new_event_loop() (asyncio.AbstractEventLoopPolicy 메서드)
@anchor{library/asyncio-policy asyncio AbstractEventLoopPolicy new_event_loop}@anchor{393e}
@deffn {메서드} new_event_loop ()

새 이벤트 루프 객체를 만들고 반환합니다.

이 메서드는 절대 @code{None}을 반환해서는 안 됩니다.
@end deffn


버전 3.14부터 폐지됨: The @code{AbstractEventLoopPolicy} class is deprecated and
will be removed in Python 3.16.

@end deffn
@anchor{library/asyncio-policy asyncio-policy-builtin}@anchor{3937}
asyncio에는 다음과 같은 내장 정책이 제공됩니다:

@geindex DefaultEventLoopPolicy (asyncio 클래스)
@anchor{library/asyncio-policy asyncio DefaultEventLoopPolicy}@anchor{30f}
@deffn {클래스} asyncio.DefaultEventLoopPolicy

기본 asyncio 정책. 유닉스에서는 @ref{314,,SelectorEventLoop}를, 윈도우에서는 @ref{81c,,ProactorEventLoop}를 사용합니다.

수동으로 기본 정책을 설치할 필요는 없습니다. asyncio는 기본 정책을 자동으로 사용하도록 구성됩니다.


버전 3.8에서 변경: 윈도우에서, 이제 기본적으로 @ref{81c,,ProactorEventLoop}가 사용됩니다.



버전 3.14에서 변경: The @ref{2f2,,get_event_loop()} method of the default asyncio policy now
raises a @ref{244,,RuntimeError} if there is no set event loop.



버전 3.14부터 폐지됨: The @code{DefaultEventLoopPolicy} class is deprecated and
will be removed in Python 3.16.

@end deffn

@geindex WindowsSelectorEventLoopPolicy (asyncio 클래스)
@anchor{library/asyncio-policy asyncio WindowsSelectorEventLoopPolicy}@anchor{310}
@deffn {클래스} asyncio.WindowsSelectorEventLoopPolicy

@ref{314,,SelectorEventLoop} 이벤트 루프 구현을 사용하는 대안 이벤트 루프 정책.

@ref{213c,,가용성}: Windows.


버전 3.14부터 폐지됨: The @code{WindowsSelectorEventLoopPolicy} class is deprecated and
will be removed in Python 3.16.

@end deffn

@geindex WindowsProactorEventLoopPolicy (asyncio 클래스)
@anchor{library/asyncio-policy asyncio WindowsProactorEventLoopPolicy}@anchor{311}
@deffn {클래스} asyncio.WindowsProactorEventLoopPolicy

@ref{81c,,ProactorEventLoop} 이벤트 루프 구현을 사용하는 대안 이벤트 루프 정책.

@ref{213c,,가용성}: Windows.


버전 3.14부터 폐지됨: The @code{WindowsProactorEventLoopPolicy} class is deprecated and
will be removed in Python 3.16.

@end deffn

@node 사용자 정의 정책,,정책 객체,정책
@anchor{library/asyncio-policy asyncio-custom-policies}@anchor{3938}@anchor{library/asyncio-policy custom-policies}@anchor{393f}
@subsubsection 사용자 정의 정책


새로운 이벤트 루프 정책을 구현하려면, @ref{30f,,DefaultEventLoopPolicy}의 서브 클래스를 만들고 사용자 정의 동작이 필요한 메서드를 재정의하는 것이 좋습니다, 예를 들어:

@example
class MyEventLoopPolicy(asyncio.DefaultEventLoopPolicy):

    def get_event_loop(self):
        """이벤트 루프를 가져옵니다.

        None이거나 EventLoop의 인스턴스일 수 있습니다.
        """
        loop = super().get_event_loop()
        # loop로 무언가를 합니다 ...
        return loop

asyncio.set_event_loop_policy(MyEventLoopPolicy())
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 플랫폼 지원,Extending,정책,asyncio — 비동기 I/O
@anchor{library/asyncio-platforms doc}@anchor{3940}@anchor{library/asyncio-platforms asyncio-platform-support}@anchor{38d2}@anchor{library/asyncio-platforms platform-support}@anchor{3941}@anchor{library/asyncio-platforms translation-repo}@anchor{3942}
@subsubsection 플랫폼 지원


@ref{b,,asyncio} 모듈은 이식성이 있도록 설계되었지만, 플랫폼의 하부 아키텍처와 기능으로 인해 일부 플랫폼에는 미묘한 차이점과 제약이 있습니다.

@menu
* 모든 플랫폼:: 
* 윈도우:: 
* macOS: macOS<52>. 

@end menu

@node 모든 플랫폼,윈도우,,플랫폼 지원
@anchor{library/asyncio-platforms all-platforms}@anchor{3943}
@subsubsection 모든 플랫폼



@itemize *

@item 
@ref{384b,,loop.add_reader()}와 @ref{38d0,,loop.add_writer()}는 파일 I/O를 감시하는데 사용할 수 없습니다.
@end itemize

@node 윈도우,macOS<52>,모든 플랫폼,플랫폼 지원
@anchor{library/asyncio-platforms windows}@anchor{3944}
@subsubsection 윈도우


`소스 코드:' Lib/asyncio/proactor_events.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/asyncio/proactor_events.py}, Lib/asyncio/windows_events.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/asyncio/windows_events.py}, Lib/asyncio/windows_utils.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/asyncio/windows_utils.py}


__________________________________________________________________



버전 3.8에서 변경: 윈도우에서, @ref{81c,,ProactorEventLoop}는 이제 기본 이벤트 루프입니다.


윈도우의 모든 이벤트 루프는 다음 메서드를 지원하지 않습니다:


@itemize *

@item 
@ref{3830,,loop.create_unix_connection()} 와 @ref{4cb,,loop.create_unix_server()}는 지원되지 않습니다. @ref{1bae,,socket.AF_UNIX} 소켓 패밀리는 유닉스에만 적용됩니다.

@item 
@ref{38d9,,loop.add_signal_handler()}와 @ref{38da,,loop.remove_signal_handler()}는 지원되지 않습니다.
@end itemize

@ref{314,,SelectorEventLoop}에는 다음과 같은 제약이 있습니다:


@itemize *

@item 
@ref{3945,,SelectSelector}는 소켓 이벤트를 기다리는 데 사용됩니다: 소켓을 지원하며 512개의 소켓으로 제한됩니다.

@item 
@ref{384b,,loop.add_reader()}와 @ref{38d0,,loop.add_writer()}는 소켓 핸들만 받아들입니다 (예를 들어, 파이프 파일 기술자는 지원되지 않습니다).

@item 
파이프는 지원되지 않으므로, @ref{3879,,loop.connect_read_pipe()}와 @ref{387a,,loop.connect_write_pipe()} 메서드는 구현되지 않습니다.

@item 
@ref{37eb,,서브 프로세스}는 지원되지 않습니다, 즉, @ref{3874,,loop.subprocess_exec()} 와 @ref{3875,,loop.subprocess_shell()} 메서드가 구현되지 않습니다.
@end itemize

@ref{81c,,ProactorEventLoop}에는 다음과 같은 제약이 있습니다:


@itemize *

@item 
@ref{384b,,loop.add_reader()}와 @ref{38d0,,loop.add_writer()} 메서드는 지원되지 않습니다.
@end itemize

윈도우에서 단조 시계의 해상도는 대개 15.6 밀리초 근처입니다. 최상의 해상도는 0.5 밀리초입니다. 해상도는 하드웨어(HPET@footnote{https://en.wikipedia.org/wiki/High_Precision_Event_Timer}이 사용 가능한지)와 윈도우 구성에 따라 다릅니다.

@menu
* 윈도우에서의 서브 프로세스 지원:: 

@end menu

@node 윈도우에서의 서브 프로세스 지원,,,윈도우
@anchor{library/asyncio-platforms asyncio-windows-subprocess}@anchor{3876}@anchor{library/asyncio-platforms subprocess-support-on-windows}@anchor{3946}
@subsubsection 윈도우에서의 서브 프로세스 지원


윈도우에서, 기본 이벤트 루프 @ref{81c,,ProactorEventLoop}는 서브 프로세스를 지원하지만, @ref{314,,SelectorEventLoop}는 그렇지 않습니다.

@node macOS<52>,,윈도우,플랫폼 지원
@anchor{library/asyncio-platforms macos}@anchor{3947}
@subsubsection macOS


최신 macOS 버전은 완전하게 지원됩니다.

@subsubheading macOS <= 10.8


macOS 10.6, 10.7 및 10.8에서, 기본 이벤트 루프는 @ref{3948,,selectors.KqueueSelector}를 사용하는데, 이 버전에서는 문자 장치를 지원하지 않습니다. 이러한 이전 버전의 macOS에서 문자 장치를 지원하려면, @ref{314,,SelectorEventLoop}가 @ref{3945,,SelectSelector} 나 @ref{dcf,,PollSelector}를 사용하도록 수동으로 구성할 수 있습니다. 예:

@example
import asyncio
import selectors

selector = selectors.SelectSelector()
loop = asyncio.SelectorEventLoop(selector)
asyncio.set_event_loop(loop)
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Extending,고수준 API 색인,플랫폼 지원,asyncio — 비동기 I/O
@anchor{library/asyncio-extending doc}@anchor{3949}@anchor{library/asyncio-extending extending}@anchor{394a}@anchor{library/asyncio-extending translation-repo}@anchor{394b}
@subsubsection Extending


The main direction for @ref{b,,asyncio} extending is writing custom `event loop'
classes. Asyncio has helpers that could be used to simplify this task.

@cartouche
@quotation 참고 
Third-parties should reuse existing asyncio code with caution,
a new Python version is free to break backward compatibility
in `internal' part of API.
@end quotation
@end cartouche

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

@end menu

@node Writing a Custom Event Loop,Future and Task private constructors,,Extending
@anchor{library/asyncio-extending writing-a-custom-event-loop}@anchor{394c}
@subsubsection Writing a Custom Event Loop


@ref{b58,,asyncio.AbstractEventLoop} declares very many methods.  Implementing all them
from scratch is a tedious job.

A loop can get many common methods implementation for free by inheriting from
@code{asyncio.BaseEventLoop}.

In turn, the successor should implement a bunch of `private' methods declared but not
implemented in @code{asyncio.BaseEventLoop}.

For example, @code{loop.create_connection()} checks arguments, resolves DNS addresses, and
calls @code{loop._make_socket_transport()} that should be implemented by inherited class.
The @code{_make_socket_transport()} method is not documented and is considered as an
`internal' API.

@node Future and Task private constructors,Task lifetime support,Writing a Custom Event Loop,Extending
@anchor{library/asyncio-extending future-and-task-private-constructors}@anchor{394d}
@subsubsection Future and Task private constructors


@ref{dc5,,asyncio.Future} and @ref{1c7,,asyncio.Task} should be never created directly,
please use corresponding @ref{e73,,loop.create_future()} and @ref{1ca,,loop.create_task()},
or @ref{1c9,,asyncio.create_task()} factories instead.

However, third-party `event loops' may `reuse' built-in future and task implementations
for the sake of getting a complex and highly optimized code for free.

For this purpose the following, `private' constructors are listed:

@geindex __init__() (asyncio.Future 메서드)
@anchor{library/asyncio-extending asyncio Future __init__}@anchor{394e}
@deffn {메서드} Future.__init__ (*, loop=None)

Create a built-in future instance.

`loop' is an optional event loop instance.
@end deffn

@geindex __init__() (asyncio.Task 메서드)
@anchor{library/asyncio-extending asyncio Task __init__}@anchor{394f}
@deffn {메서드} Task.__init__ (coro, *, loop=None, name=None, context=None)

Create a built-in task instance.

`loop' is an optional event loop instance. The rest of arguments are described in
@ref{1ca,,loop.create_task()} description.


버전 3.11에서 변경: `context' argument is added.

@end deffn

@node Task lifetime support,,Future and Task private constructors,Extending
@anchor{library/asyncio-extending task-lifetime-support}@anchor{3950}
@subsubsection Task lifetime support


A third party task implementation should call the following functions to keep a task
visible by @ref{b4f,,asyncio.all_tasks()} and @ref{6a4,,asyncio.current_task()}:

@geindex _register_task() (asyncio 모듈)
@anchor{library/asyncio-extending asyncio _register_task}@anchor{3951}
@deffn {함수} asyncio._register_task (task)

Register a new `task' as managed by `asyncio'.

Call the function from a task constructor.
@end deffn

@geindex _unregister_task() (asyncio 모듈)
@anchor{library/asyncio-extending asyncio _unregister_task}@anchor{3952}
@deffn {함수} asyncio._unregister_task (task)

Unregister a `task' from `asyncio' internal structures.

The function should be called when a task is about to finish.
@end deffn

@geindex _enter_task() (asyncio 모듈)
@anchor{library/asyncio-extending asyncio _enter_task}@anchor{3953}
@deffn {함수} asyncio._enter_task (loop, task)

Switch the current task to the `task' argument.

Call the function just before executing a portion of embedded `coroutine'
(@ref{2419,,coroutine.send()} or @ref{71a,,coroutine.throw()}).
@end deffn

@geindex _leave_task() (asyncio 모듈)
@anchor{library/asyncio-extending asyncio _leave_task}@anchor{3954}
@deffn {함수} asyncio._leave_task (loop, task)

Switch the current task back from `task' to @code{None}.

Call the function just after @ref{2419,,coroutine.send()} or @ref{71a,,coroutine.throw()}
execution.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 고수준 API 색인,저수준 API 색인,Extending,asyncio — 비동기 I/O
@anchor{library/asyncio-api-index doc}@anchor{a79}@anchor{library/asyncio-api-index high-level-api-index}@anchor{3955}@anchor{library/asyncio-api-index translation-repo}@anchor{3956}
@subsubsection 고수준 API 색인


이 페이지에는 모든 고수준의 async/await 활성화된 asyncio API가 나열됩니다.

@menu
* 태스크:: 
* 큐: 큐<2>. 
* 서브 프로세스: 서브 프로세스<2>. 
* 스트림: 스트림<2>. 
* 동기화:: 
* 예외: 예외<11>. 

@end menu

@node 태스크,큐<2>,,고수준 API 색인
@anchor{library/asyncio-api-index tasks}@anchor{3957}
@subsubsection 태스크


asyncio 프로그램을 실행하고, 태스크를 만들고, 시간제한 있게 여러 가지를 기다리는 유틸리티.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

@ref{2f3,,run()}

@tab

이벤트 루프를 만들고, 코루틴을 실행하고, 루프를 닫습니다.

@item

@ref{2f5,,Runner}

@tab

A context manager that simplifies multiple async function calls.

@item

@ref{1c7,,Task}

@tab

Task 객체.

@item

@ref{4d2,,TaskGroup}

@tab

A context manager that holds a group of tasks. Provides
a convenient and reliable way to wait for all tasks in the group to
finish.

@item

@ref{1c9,,create_task()}

@tab

asyncio Task를 시작한 후 반환합니다.

@item

@ref{6a4,,current_task()}

@tab

현재 Task를 돌려줍니다.

@item

@ref{b4f,,all_tasks()}

@tab

이벤트 루프의 아직 종료하지 않은 모든 태스크를 반환합니다.

@item

@code{await} @ref{c63,,sleep()}

@tab

몇 초 동안 잠잡니다.

@item

@code{await} @ref{812,,gather()}

@tab

여러 가지를 동시에 예약하고 기다립니다.

@item

@code{await} @ref{814,,wait_for()}

@tab

시간제한 있게 실행합니다.

@item

@code{await} @ref{c64,,shield()}

@tab

취소로부터 보호합니다.

@item

@code{await} @ref{6a6,,wait()}

@tab

완료를 감시합니다.

@item

@ref{813,,timeout()}

@tab

Run with a timeout. Useful in cases when @code{wait_for} is not suitable.

@item

@ref{ae5,,to_thread()}

@tab

별도의 OS 스레드에서 함수를 비동기적으로 실행합니다.

@item

@ref{a82,,run_coroutine_threadsafe()}

@tab

다른 OS 스레드에서 코루틴을 예약합니다.

@item

@code{for in} @ref{4c7,,as_completed()}

@tab

@code{for} 루프로 완료를 감시합니다.

@end multitable


@subsubheading 예제



@itemize *

@item 
@ref{380a,,여러 가지를 병렬로 실행하기 위해 asyncio.gather() 사용하기}.

@item 
@ref{3812,,시간제한을 주기 위해 asyncio.wait_for() 사용하기}.

@item 
@ref{3827,,취소}.

@item 
@ref{3808,,asyncio.sleep() 사용하기}.

@item 
주 @ref{37e9,,태스크 설명서 페이지}를 참조하십시오.
@end itemize

@node 큐<2>,서브 프로세스<2>,태스크,고수준 API 색인
@anchor{library/asyncio-api-index queues}@anchor{3958}
@subsubsection 큐


큐는 여러 asyncio 태스크 간에 작업을 분산하고, 연결 풀과 pub/sub 패턴을 구현하는 데 사용해야 합니다.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

@ref{c69,,Queue}

@tab

FIFO 큐.

@item

@ref{389a,,PriorityQueue}

@tab

우선순위 큐.

@item

@ref{389c,,LifoQueue}

@tab

LIFO 큐.

@end multitable


@subsubheading 예제



@itemize *

@item 
@ref{389e,,여러 태스크로 작업부하를 분산하는데 asyncio.Queue 사용하기}.

@item 
@ref{37ec,,큐 설명서 페이지}도 참조하십시오.
@end itemize

@node 서브 프로세스<2>,스트림<2>,큐<2>,고수준 API 색인
@anchor{library/asyncio-api-index subprocesses}@anchor{3959}
@subsubsection 서브 프로세스


서브 프로세스를 생성하고 셸 명령을 실행하는 유틸리티.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

@code{await} @ref{c6a,,create_subprocess_exec()}

@tab

서브 프로세스를 만듭니다.

@item

@code{await} @ref{c6b,,create_subprocess_shell()}

@tab

셸 명령을 실행합니다.

@end multitable


@subsubheading 예제



@itemize *

@item 
@ref{386e,,셸 명령 실행하기}.

@item 
@ref{37eb,,서브 프로세스 API} 설명서도 참조하십시오.
@end itemize

@node 스트림<2>,동기화,서브 프로세스<2>,고수준 API 색인
@anchor{library/asyncio-api-index streams}@anchor{395a}
@subsubsection 스트림


네트워크 IO로 작업하는 고수준 API


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

@code{await} @ref{d0d,,open_connection()}

@tab

TCP 연결을 만듭니다.

@item

@code{await} @ref{382f,,open_unix_connection()}

@tab

유닉스 소켓 연결을 만듭니다.

@item

@code{await} @ref{d0e,,start_server()}

@tab

TCP 서버를 시작합니다.

@item

@code{await} @ref{3831,,start_unix_server()}

@tab

유닉스 소켓 서버를 시작합니다.

@item

@ref{176b,,StreamReader}

@tab

네트워크 데이터를 수신하는 고수준 async/await 객체.

@item

@ref{1a70,,StreamWriter}

@tab

네트워크 데이터를 보내는 고수준 async/await 객체.

@end multitable


@subsubheading 예제



@itemize *

@item 
@ref{382b,,예제 TCP 클라이언트}.

@item 
@ref{37ea,,스트림 API} 설명서도 참조하십시오.
@end itemize

@node 동기화,예외<11>,스트림<2>,고수준 API 색인
@anchor{library/asyncio-api-index synchronization}@anchor{395b}
@subsubsection 동기화


태스크에 쓸 수 있는 threading과 유사한 동기화 프리미티브.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

@ref{c65,,Lock}

@tab

뮤텍스 록.

@item

@ref{2f4,,Event}

@tab

이벤트 객체.

@item

@ref{c66,,Condition}

@tab

조건 객체.

@item

@ref{c67,,Semaphore}

@tab

세마포어.

@item

@ref{c68,,BoundedSemaphore}

@tab

제한된 세마포어.

@item

@ref{815,,Barrier}

@tab

장벽 객체.

@end multitable


@subsubheading 예제



@itemize *

@item 
@ref{3857,,asyncio.Event 사용하기}.

@item 
@ref{3865,,asyncio.Barrier 사용하기}.

@item 
asyncio @ref{37ed,,동기화 프리미티브}의 설명서도 참조하십시오.
@end itemize

@node 예외<11>,,동기화,고수준 API 색인
@anchor{library/asyncio-api-index exceptions}@anchor{395c}
@subsubsection 예외



@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

@ref{4d5,,asyncio.CancelledError}

@tab

Task가 취소될 때 발생합니다. @ref{4d4,,Task.cancel()}도 참조하십시오.

@item

@ref{816,,asyncio.BrokenBarrierError}

@tab

Barrier 가 깨질 때 발생합니다. @ref{3864,,Barrier.wait()}도 참조하십시오.

@end multitable


@subsubheading 예제



@itemize *

@item 
@ref{3827,,취소 요청 시에 코드를 실행하기 위해 CancelledError 처리하기}.

@item 
@ref{38a0,,asyncio 전용 예외}의 전체 목록도 참조하십시오.
@end itemize

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 저수준 API 색인,asyncio로 개발하기,고수준 API 색인,asyncio — 비동기 I/O
@anchor{library/asyncio-llapi-index doc}@anchor{395d}@anchor{library/asyncio-llapi-index low-level-api-index}@anchor{395e}@anchor{library/asyncio-llapi-index translation-repo}@anchor{395f}
@subsubsection 저수준 API 색인


이 페이지는 모든 저수준 asyncio API를 나열합니다.

@menu
* 이벤트 루프 얻기:: 
* 이벤트 루프 메서드:: 
* 트랜스포트: 트랜스포트<2>. 
* 프로토콜: 프로토콜<2>. 
* 이벤트 루프 정책:: 

@end menu

@node 이벤트 루프 얻기,이벤트 루프 메서드,,저수준 API 색인
@anchor{library/asyncio-llapi-index obtaining-the-event-loop}@anchor{3960}
@subsubsection 이벤트 루프 얻기



@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

@ref{d00,,asyncio.get_running_loop()}

@tab

실행 중인 이벤트 루프를 가져오는 데 `선호되는' 함수.

@item

@ref{2f2,,asyncio.get_event_loop()}

@tab

이벤트 루프 인스턴스를 가져옵니다 (실행 중이거나 현재 정책을 통해 현재).

@item

@ref{1b53,,asyncio.set_event_loop()}

@tab

현재 정책을 통해 현재 이벤트 루프를 설정합니다.

@item

@ref{37f7,,asyncio.new_event_loop()}

@tab

새 이벤트 루프를 만듭니다.

@end multitable


@subsubheading 예제



@itemize *

@item 
@ref{38fb,,asyncio.get_running_loop() 사용하기}.
@end itemize

@node 이벤트 루프 메서드,트랜스포트<2>,이벤트 루프 얻기,저수준 API 색인
@anchor{library/asyncio-llapi-index event-loop-methods}@anchor{3961}
@subsubsection 이벤트 루프 메서드


@ref{38b7,,Event loop methods}에 관한 주 설명서 절도 참조하십시오.

@subsubheading 수명주기



@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

@ref{e71,,loop.run_until_complete()}

@tab

완료할 때까지 퓨처/태스크/어웨이터블을 실행합니다.

@item

@ref{38b9,,loop.run_forever()}

@tab

이벤트 루프를 영원히 실행합니다.

@item

@ref{e76,,loop.stop()}

@tab

이벤트 루프를 중지합니다.

@item

@ref{38bb,,loop.close()}

@tab

이벤트 루프를 닫습니다.

@item

@ref{38ba,,loop.is_running()}

@tab

이벤트 루프가 실행 중이면 @code{True}를 반환합니다.

@item

@ref{fc2,,loop.is_closed()}

@tab

이벤트 루프가 닫혔으면 @code{True}를 반환합니다.

@item

@code{await} @ref{e78,,loop.shutdown_asyncgens()}

@tab

비동기 제너레이터를 닫습니다.

@end multitable


@subsubheading 디버깅



@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

@ref{fc0,,loop.set_debug()}

@tab

디버그 모드를 활성화 또는 비활성화합니다.

@item

@ref{fc1,,loop.get_debug()}

@tab

현재의 디버그 모드를 얻습니다.

@end multitable


@subsubheading 콜백 예약하기



@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

@ref{cf9,,loop.call_soon()}

@tab

콜백을 곧 호출합니다.

@item

@ref{cfa,,loop.call_soon_threadsafe()}

@tab

스레드 안전한 @ref{cf9,,loop.call_soon()}의 변형입니다.

@item

@ref{cfb,,loop.call_later()}

@tab

주어진 시간 `후'에 콜백을 호출합니다.

@item

@ref{cfc,,loop.call_at()}

@tab

주어진 시간 `에' 콜백을 호출합니다.

@end multitable


@subsubheading Thread/Interpreter/Process Pool



@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

@code{await} @ref{ae6,,loop.run_in_executor()}

@tab

@ref{24,,concurrent.futures} 실행기에서 CPU-병목이나 다른 블로킹 함수를 실행합니다.

@item

@ref{949,,loop.set_default_executor()}

@tab

@ref{ae6,,loop.run_in_executor()}의 기본 실행기를 설정합니다.

@end multitable


@subsubheading 태스크와 퓨처



@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

@ref{e73,,loop.create_future()}

@tab

@ref{dc5,,Future} 객체를 만듭니다.

@item

@ref{1ca,,loop.create_task()}

@tab

코루틴을 @ref{1c7,,Task}로 예약합니다.

@item

@ref{1c8,,loop.set_task_factory()}

@tab

@ref{1ca,,loop.create_task()}가 @ref{1c7,,태스크}를 만드는데 사용하는 팩토리를 설정합니다.

@item

@ref{fc4,,loop.get_task_factory()}

@tab

@ref{1ca,,loop.create_task()}가 @ref{1c7,,태스크}를 만드는데 사용하는 팩토리를 얻습니다.

@end multitable


@subsubheading DNS



@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

@code{await} @ref{e0d,,loop.getaddrinfo()}

@tab

@ref{176f,,socket.getaddrinfo()}의 비동기 버전.

@item

@code{await} @ref{e0e,,loop.getnameinfo()}

@tab

@ref{1a3b,,socket.getnameinfo()}의 비동기 버전.

@end multitable


@subsubheading 네트워킹과 IPC



@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

@code{await} @ref{817,,loop.create_connection()}

@tab

TCP 연결을 엽니다.

@item

@code{await} @ref{d08,,loop.create_server()}

@tab

TCP 서버를 만듭니다.

@item

@code{await} @ref{3830,,loop.create_unix_connection()}

@tab

유닉스 소켓 연결을 엽니다.

@item

@code{await} @ref{4cb,,loop.create_unix_server()}

@tab

Unix 소켓 서버를 만듭니다.

@item

@code{await} @ref{9de,,loop.connect_accepted_socket()}

@tab

@ref{fa0,,socket}을 @code{(transport, protocol)} 쌍으로 감쌉니다.

@item

@code{await} @ref{93b,,loop.create_datagram_endpoint()}

@tab

데이터 그램 (UDP) 연결을 엽니다.

@item

@code{await} @ref{38cc,,loop.sendfile()}

@tab

트랜스포트를 통해 파일을 보냅니다.

@item

@code{await} @ref{cfe,,loop.start_tls()}

@tab

기존 연결을 TLS로 업그레이드합니다.

@item

@code{await} @ref{3879,,loop.connect_read_pipe()}

@tab

파이프의 읽기 끝을 @code{(transport, protocol)} 쌍으로 감쌉니다.

@item

@code{await} @ref{387a,,loop.connect_write_pipe()}

@tab

파이프의 쓰기 끝을 @code{(transport, protocol)} 쌍으로 감쌉니다.

@end multitable


@subsubheading 소켓



@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

@code{await} @ref{e0a,,loop.sock_recv()}

@tab

@ref{fa0,,socket}에서 데이터를 수신합니다.

@item

@code{await} @ref{cff,,loop.sock_recv_into()}

@tab

@ref{fa0,,socket}에서 데이터를 버퍼로 수신합니다.

@item

@code{await} @ref{81a,,loop.sock_recvfrom()}

@tab

@ref{fa0,,socket}에서 데이터 그램을 수신합니다.

@item

@code{await} @ref{81b,,loop.sock_recvfrom_into()}

@tab

@ref{fa0,,socket}에서 데이터 그램을 버퍼로 수신합니다.

@item

@code{await} @ref{e0b,,loop.sock_sendall()}

@tab

데이터를 @ref{fa0,,socket}으로 보냅니다.

@item

@code{await} @ref{819,,loop.sock_sendto()}

@tab

데이터 그램을 @ref{fa0,,socket}을 통해 주어진 주소로 보냅니다.

@item

@code{await} @ref{fc7,,loop.sock_connect()}

@tab

@ref{fa0,,socket}을 연결합니다.

@item

@code{await} @ref{e0c,,loop.sock_accept()}

@tab

@ref{fa0,,socket} 연결을 수락합니다.

@item

@code{await} @ref{d03,,loop.sock_sendfile()}

@tab

@ref{fa0,,socket}를 통해 파일을 보냅니다.

@item

@ref{384b,,loop.add_reader()}

@tab

파일 기술자가 읽기 가능한지 관찰하기 시작합니다.

@item

@ref{38cf,,loop.remove_reader()}

@tab

파일 기술자가 읽기 가능한지 관찰하는 것을 중단합니다.

@item

@ref{38d0,,loop.add_writer()}

@tab

파일 기술자가 쓰기 가능한지 관찰하기 시작합니다.

@item

@ref{38d1,,loop.remove_writer()}

@tab

파일 기술자가 쓰기 가능한지 관찰하는 것을 중단합니다.

@end multitable


@subsubheading 유닉스 시그널



@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

@ref{38d9,,loop.add_signal_handler()}

@tab

@ref{cb,,signal}에 대한 처리기를 추가합니다.

@item

@ref{38da,,loop.remove_signal_handler()}

@tab

@ref{cb,,signal}에 대한 처리기를 제거합니다.

@end multitable


@subsubheading 서브 프로세스



@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

@ref{3874,,loop.subprocess_exec()}

@tab

서브 프로세스를 스폰합니다.

@item

@ref{3875,,loop.subprocess_shell()}

@tab

셸 명령으로 서브 프로세스를 스폰합니다.

@end multitable


@subsubheading 에러 처리



@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

@ref{38de,,loop.call_exception_handler()}

@tab

예외 처리기를 호출합니다.

@item

@ref{38dd,,loop.set_exception_handler()}

@tab

새로운 예외 처리기를 설정합니다.

@item

@ref{e74,,loop.get_exception_handler()}

@tab

현재 예외 처리기를 가져옵니다.

@item

@ref{38df,,loop.default_exception_handler()}

@tab

기본 예외 처리기 구현.

@end multitable


@subsubheading 예제



@itemize *

@item 
@ref{38ea,,asyncio.new_event_loop() 와 loop.run_forever() 사용하기}.

@item 
@ref{38ec,,loop.call_later() 사용하기}.

@item 
@code{loop.create_connection()}을 사용하여 @ref{3842,,메아리 클라이언트} 구현하기.

@item 
@code{loop.create_connection()}을 사용하여 @ref{3849,,소켓 연결하기}.

@item 
@ref{384a,,add_reader()를 사용하여 FD에서 읽기 이벤트 관찰하기}.

@item 
@ref{38ef,,loop.add_signal_handler() 사용하기}.

@item 
@ref{3889,,loop.subprocess_exec() 사용하기}.
@end itemize

@node 트랜스포트<2>,프로토콜<2>,이벤트 루프 메서드,저수준 API 색인
@anchor{library/asyncio-llapi-index transports}@anchor{3962}
@subsubsection 트랜스포트


모든 트랜스포트는 다음과 같은 메서드를 구현합니다:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

@ref{38c6,,transport.close()}

@tab

트랜스포트를 닫습니다.

@item

@ref{e72,,transport.is_closing()}

@tab

트랜스포트가 닫히고 있거나 닫혔으면 @code{True}를 반환합니다.

@item

@ref{c92,,transport.get_extra_info()}

@tab

트랜스포트에 대한 정보를 요청합니다.

@item

@ref{390b,,transport.set_protocol()}

@tab

새 프로토콜을 설정합니다.

@item

@ref{390c,,transport.get_protocol()}

@tab

현재 프로토콜을 돌려줍니다.

@end multitable


데이터를 받을 수 있는 트랜스포트 (TCP 및 유닉스 연결, 파이프 등). @ref{817,,loop.create_connection()}, @ref{3830,,loop.create_unix_connection()}, @ref{3879,,loop.connect_read_pipe()} 등의 메서드에서 반환됩니다:

@subsubheading 트랜스포트 읽기



@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

@ref{d10,,transport.is_reading()}

@tab

트랜스포트가 수신 중이면 @code{True}를 반환합니다.

@item

@ref{d12,,transport.pause_reading()}

@tab

수신을 일시 정지합니다.

@item

@ref{d11,,transport.resume_reading()}

@tab

수신을 재개합니다.

@end multitable


데이터를 전송할 수 있는 트랜스포트 (TCP와 유닉스 연결, 파이프 등). @ref{817,,loop.create_connection()}, @ref{3830,,loop.create_unix_connection()}, @ref{387a,,loop.connect_write_pipe()} 등의 메서드에서 반환됩니다:

@subsubheading 트랜스포트 쓰기



@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

@ref{17d0,,transport.write()}

@tab

데이터를 트랜스포트에 씁니다.

@item

@ref{17cf,,transport.writelines()}

@tab

버퍼들을 트랜스포트에 씁니다.

@item

@ref{390f,,transport.can_write_eof()}

@tab

트랜스포트가 EOF 전송을 지원하면 @ref{e06,,True}를 반환합니다.

@item

@ref{3910,,transport.write_eof()}

@tab

버퍼 된 데이터를 플러시 한 후 닫고 EOF를 보냅니다.

@item

@ref{38e7,,transport.abort()}

@tab

즉시 트랜스포트를 닫습니다.

@item

@ref{3911,,transport.get_write_buffer_size()}

@tab

출력 버퍼의 현재 크기를 돌려줍니다.

@item

@ref{fc3,,transport.get_write_buffer_limits()}

@tab

쓰기 흐름 제어를 위한 높은 수위와 낮은 수위를 반환합니다.

@item

@ref{3912,,transport.set_write_buffer_limits()}

@tab

쓰기 흐름 제어를 위한 새로운 높은 수위와 낮은 수위를 설정합니다.

@end multitable


@ref{93b,,loop.create_datagram_endpoint()}에서 반환된 트랜스포트:

@subsubheading 데이터 그램 트랜스포트



@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

@ref{4cc,,transport.sendto()}

@tab

데이터를 원격 피어로 보냅니다.

@item

@ref{3916,,transport.abort()}

@tab

즉시 트랜스포트를 닫습니다.

@end multitable


서브 프로세스에 대한 저수준 트랜스포트 추상화. @ref{3874,,loop.subprocess_exec()} 와 @ref{3875,,loop.subprocess_shell()}가 반환합니다:

@subsubheading 서브 프로세스 트랜스포트



@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

@ref{3918,,transport.get_pid()}

@tab

서브 프로세스의 프로세스 ID를 돌려줍니다.

@item

@ref{3919,,transport.get_pipe_transport()}

@tab

요청한 통신 파이프 (`stdin', `stdout' 또는 `stderr')에 대한 트랜스포트를 반환합니다.

@item

@ref{391a,,transport.get_returncode()}

@tab

서브 프로세스 반환 코드를 돌려줍니다.

@item

@ref{391b,,transport.kill()}

@tab

서브 프로세스를 죽입니다.

@item

@ref{391d,,transport.send_signal()}

@tab

서브 프로세스에 시그널을 보냅니다.

@item

@ref{391c,,transport.terminate()}

@tab

서브 프로세스를 중지합니다.

@item

@ref{391e,,transport.close()}

@tab

서브 프로세스를 죽이고 모든 파이프를 닫습니다.

@end multitable


@node 프로토콜<2>,이벤트 루프 정책,트랜스포트<2>,저수준 API 색인
@anchor{library/asyncio-llapi-index protocols}@anchor{3963}
@subsubsection 프로토콜


프로토콜 클래스는 다음 `콜백 메서드를' 구현할 수 있습니다:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

@code{callback} @ref{3921,,connection_made()}

@tab

연결이 이루어질 때 호출됩니다.

@item

@code{callback} @ref{3908,,connection_lost()}

@tab

연결이 끊어지거나 닫힐 때 호출됩니다.

@item

@code{callback} @ref{3913,,pause_writing()}

@tab

트랜스포트 버퍼가 높은 수위를 초과할 때 호출됩니다.

@item

@code{callback} @ref{3914,,resume_writing()}

@tab

트랜스포트 버퍼가 낮은 수위 아래로 내려갈 때 호출됩니다.

@end multitable


@subsubheading 스트리밍 프로토콜 (TCP, 유닉스 소켓, 파이프)



@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

@code{callback} @ref{1b00,,data_received()}

@tab

어떤 데이터가 수신될 때 호출됩니다.

@item

@code{callback} @ref{3923,,eof_received()}

@tab

EOF가 수신될 때 호출됩니다.

@end multitable


@subsubheading 버퍼 된 스트리밍 프로토콜



@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

@code{callback} @ref{3925,,get_buffer()}

@tab

새로운 수신 버퍼를 할당하기 위해서 호출됩니다.

@item

@code{callback} @ref{3926,,buffer_updated()}

@tab

수신된 데이터로 버퍼가 갱신될 때 호출됩니다.

@item

@code{callback} @ref{3927,,eof_received()}

@tab

EOF가 수신될 때 호출됩니다.

@end multitable


@subsubheading 데이터 그램 프로토콜



@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

@code{callback} @ref{3929,,datagram_received()}

@tab

데이터 그램이 수신될 때 호출됩니다.

@item

@code{callback} @ref{392a,,error_received()}

@tab

이전의 송신이나 수신 연산이 @ref{2c0,,OSError}를 일으킬 때 호출됩니다.

@end multitable


@subsubheading 서브 프로세스 프로토콜



@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

@code{callback} @ref{1b4e,,pipe_data_received()}

@tab

자식 프로세스가 `stdout' 이나 `stderr' 파이프에 데이터를 쓸 때 호출됩니다.

@item

@code{callback} @ref{392c,,pipe_connection_lost()}

@tab

자식 프로세스와 통신하는 파이프 중 하나가 닫힐 때 호출됩니다.

@item

@code{callback} @ref{1b4d,,process_exited()}

@tab

자식 프로세스가 종료할 때 호출됩니다. @ref{1b4e,,pipe_data_received()} 와 @ref{392c,,pipe_connection_lost()} 메서드 전에 호출될 수 있습니다.

@end multitable


@node 이벤트 루프 정책,,프로토콜<2>,저수준 API 색인
@anchor{library/asyncio-llapi-index event-loop-policies}@anchor{3964}
@subsubsection 이벤트 루프 정책


정책은 @ref{2f2,,asyncio.get_event_loop()}와 같은 함수의 동작을 변경하는 저수준 메커니즘입니다. 자세한 내용은 주 @ref{38b1,,정책 절}을 참조하십시오.

@subsubheading 정책 액세스하기



@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

@ref{312,,asyncio.get_event_loop_policy()}

@tab

현재 프로세스 전반의 정책을 돌려줍니다.

@item

@ref{313,,asyncio.set_event_loop_policy()}

@tab

새로운 프로세스 전반의 정책을 설정합니다.

@item

@ref{30e,,AbstractEventLoopPolicy}

@tab

정책 객체의 베이스 클래스.

@end multitable


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node asyncio로 개발하기,,저수준 API 색인,asyncio — 비동기 I/O
@anchor{library/asyncio-dev doc}@anchor{3965}@anchor{library/asyncio-dev asyncio-dev}@anchor{3966}@anchor{library/asyncio-dev developing-with-asyncio}@anchor{3967}@anchor{library/asyncio-dev translation-repo}@anchor{3968}
@subsubsection asyncio로 개발하기


비동기 프로그래밍은 고전적인 “순차적” 프로그래밍과 다릅니다.

이 페이지는 흔한 실수와 함정을 나열하고, 이를 피하는 방법을 설명합니다.

@menu
* 디버그 모드:: 
* 동시성과 다중 스레드:: 
* 블로킹 코드 실행하기:: 
* 로깅: 로깅<3>. 
* await 하지 않은 코루틴 감지:: 
* 전달되지 않은 예외 감지:: 
* Asynchronous generators best practices:: 

@end menu

@node 디버그 모드,동시성과 다중 스레드,,asyncio로 개발하기
@anchor{library/asyncio-dev asyncio-debug-mode}@anchor{2137}@anchor{library/asyncio-dev debug-mode}@anchor{3969}
@subsubsection 디버그 모드


기본적으로 asyncio는 프로덕션 모드로 실행됩니다. 개발을 쉽게 하려고 asyncio에는 `디버그 모드'를 제공합니다.

여러 가지 방법으로 asyncio 디버그 모드를 활성화할 수 있습니다:


@itemize *

@item 
@geindex PYTHONASYNCIODEBUG
@geindex 환경 변수; PYTHONASYNCIODEBUG
@ref{2136,,PYTHONASYNCIODEBUG} 환경 변수를 @code{1}로 설정.

@item 
@ref{507,,파이썬 개발 모드} 사용.

@item 
@code{debug=True}를 @ref{2f3,,asyncio.run()}로 전달.

@item 
@ref{fc0,,loop.set_debug()}를 호출.
@end itemize

디버그 모드를 활성화하는 것 외에도, 다음을 고려하십시오:


@itemize *

@item 
@ref{396a,,asyncio 로거}의 로그 수준을 @ref{20db,,logging.DEBUG}로 설정, 예를 들어 응용 프로그램 시작 시 다음 코드 조각을 실행할 수 있습니다:

@example
logging.basicConfig(level=logging.DEBUG)
@end example

@item 
@ref{54e,,ResourceWarning} 경고를 표시하도록 @ref{118,,warnings} 모듈을 구성. 이렇게 하는 한 가지 방법은 @ref{ac5,,-W} @code{default} 명령 줄 옵션을 사용하는 것입니다.
@end itemize

디버그 모드가 활성화되면:


@itemize *

@item 
많은 스레드 안전하지 않은 asyncio API(@ref{cf9,,loop.call_soon()}과 @ref{cfc,,loop.call_at()} 메서드와 같은)가 잘못된 스레드에서 호출될 때 예외를 발생시킵니다.

@item 
I/O 선택기의 실행 시간은 I/O 연산 수행에 너무 오래 걸리면 로그 됩니다.

@item 
100 밀리 초 보다 오래 걸리는 콜백이 로그 됩니다. @ref{38e1,,loop.slow_callback_duration} 어트리뷰트는 “느린” 것으로 간주할 최소 실행 시간(초)을 설정하는 데 사용될 수 있습니다.
@end itemize

@node 동시성과 다중 스레드,블로킹 코드 실행하기,디버그 모드,asyncio로 개발하기
@anchor{library/asyncio-dev asyncio-multithreading}@anchor{3819}@anchor{library/asyncio-dev concurrency-and-multithreading}@anchor{396b}
@subsubsection 동시성과 다중 스레드


이벤트 루프는 스레드(일반적으로 주 스레드)에서 실행되며 그 스레드에서 모든 콜백과 태스크를 실행합니다. 태스크가 이벤트 루프에서 실행되는 동안, 다른 태스크는 같은 스레드에서 실행될 수 없습니다. 태스크가 @code{await} 표현식을 실행하면, 실행 중인 태스크가 일시 중지되고 이벤트 루프는 다음 태스크를 실행합니다.

다른 OS 스레드에서 @ref{2dc3,,콜백}을 예약하려면, @ref{cfa,,loop.call_soon_threadsafe()} 메서드를 사용해야 합니다. 예:

@example
loop.call_soon_threadsafe(callback, *args)
@end example

거의 모든 asyncio 객체는 스레드 안전하지 않습니다. 태스크나 콜백 외부에서 작동하는 코드가 없으면 일반적으로 문제가 되지 않습니다. 그러한 코드가 저수준 asyncio API를 호출해야 하면, @ref{cfa,,loop.call_soon_threadsafe()} 메서드를 사용해야 합니다, 예를 들어:

@example
loop.call_soon_threadsafe(fut.cancel)
@end example

다른 OS 스레드에서 코루틴 객체를 예약하려면, @ref{a82,,run_coroutine_threadsafe()} 함수를 사용해야 합니다. 결과에 액세스할 수 있도록 @ref{13b7,,concurrent.futures.Future}를 반환합니다:

@example
async def coro_func():
     return await asyncio.sleep(1, 42)

# 나중에 다른 OS 스레드에서:

future = asyncio.run_coroutine_threadsafe(coro_func(), loop)
# 결과를 기다립니다:
result = future.result()
@end example

시그널을 처리하려면, 이벤트 루프를 메인 스레드에서 실행해야 합니다.

The @ref{ae6,,loop.run_in_executor()} method can be used with a
@ref{948,,concurrent.futures.ThreadPoolExecutor} or
@ref{1d2,,InterpreterPoolExecutor} to execute
blocking code in a different OS thread without blocking the OS thread
that the event loop runs in.

현재 다른 프로세스(가령 @ref{98,,multiprocessing}으로 시작된 프로세스)에서 직접 코루틴이나 콜백을 예약할 방법은 없습니다. @ref{38b7,,Event loop methods} 섹션은 이벤트 루프를 블록하지 않고 파이프를 읽고 파일 기술자를 감시할 수 있는 API를 나열합니다. 또한 asyncio의 @ref{37eb,,서브 프로세스} API는 프로세스를 시작하고 이벤트 루프에서 프로세스와 통신하는 방법을 제공합니다. 마지막으로, 앞서 언급한 @ref{ae6,,loop.run_in_executor()} 메서드를 @ref{1d6,,concurrent.futures.ProcessPoolExecutor}와 함께 사용하여 다른 프로세스에서 코드를 실행할 수도 있습니다.

@node 블로킹 코드 실행하기,로깅<3>,동시성과 다중 스레드,asyncio로 개발하기
@anchor{library/asyncio-dev asyncio-handle-blocking}@anchor{396c}@anchor{library/asyncio-dev running-blocking-code}@anchor{396d}
@subsubsection 블로킹 코드 실행하기


블로킹 (CPU 병목) 코드는 직접 호출하면 안 됩니다. 예를 들어, 함수가 CPU 집약적인 계산을 1초 동안 수행하면, 모든 동시 asyncio 태스크와 IO 연산이 1초 지연됩니다.

An executor can be used to run a task in a different thread,
including in a different interpreter, or even in
a different process to avoid blocking the OS thread with the
event loop.  See the @ref{ae6,,loop.run_in_executor()} method for more
details.

@node 로깅<3>,await 하지 않은 코루틴 감지,블로킹 코드 실행하기,asyncio로 개발하기
@anchor{library/asyncio-dev asyncio-logger}@anchor{396a}@anchor{library/asyncio-dev logging}@anchor{396e}
@subsubsection 로깅


asyncio는 @ref{8b,,logging} 모듈을 사용하고, 모든 로깅은 @code{"asyncio"} 로거를 통해 수행됩니다.

기본 로그 수준은 @ref{20dc,,logging.INFO}며, 쉽게 조정할 수 있습니다:

@example
logging.getLogger("asyncio").setLevel(logging.WARNING)
@end example

Network logging can block the event loop. It is recommended to use
a separate thread for handling logs or use non-blocking IO. For example,
see @ref{396f,,블록 하는 처리기 다루기}.

@node await 하지 않은 코루틴 감지,전달되지 않은 예외 감지,로깅<3>,asyncio로 개발하기
@anchor{library/asyncio-dev asyncio-coroutine-not-scheduled}@anchor{3970}@anchor{library/asyncio-dev detect-never-awaited-coroutines}@anchor{3971}
@subsubsection await 하지 않은 코루틴 감지


코루틴 함수가 호출되었지만 기다리지 않을 때(예를 들어, @code{await coro()} 대신 @code{coro()})나 코루틴이 @ref{1c9,,asyncio.create_task()}로 예약되지 않으면 asyncio가 @ref{4d8,,RuntimeWarning}을 방출합니다:

@example
import asyncio

async def test():
    print("never scheduled")

async def main():
    test()

asyncio.run(main())
@end example

출력:

@example
test.py:7: RuntimeWarning: coroutine 'test' was never awaited
  test()
@end example

디버그 모드에서의 출력:

@example
test.py:7: RuntimeWarning: coroutine 'test' was never awaited
Coroutine created at (most recent call last)
  File "../t.py", line 9, in <module>
    asyncio.run(main(), debug=True)

  < .. >

  File "../t.py", line 7, in main
    test()
  test()
@end example

일반적인 수정법은 코루틴을 await 하거나 @ref{1c9,,asyncio.create_task()} 함수를 호출하는 것입니다:

@example
async def main():
    await test()
@end example

@node 전달되지 않은 예외 감지,Asynchronous generators best practices,await 하지 않은 코루틴 감지,asyncio로 개발하기
@anchor{library/asyncio-dev detect-never-retrieved-exceptions}@anchor{3972}
@subsubsection 전달되지 않은 예외 감지


@ref{e77,,Future.set_exception()}가 호출되었지만, Future 객체가 await 되지 않으면, 예외는 절대로 사용자 코드로 전파되지 않습니다. 이럴 때, Future 객체가 가비지 수집될 때 asyncio가 로그 메시지를 출력합니다.

처리되지 않은 예외의 예:

@example
import asyncio

async def bug():
    raise Exception("not consumed")

async def main():
    asyncio.create_task(bug())

asyncio.run(main())
@end example

출력:

@example
Task exception was never retrieved
future: <Task finished coro=<bug() done, defined at test.py:3>
  exception=Exception('not consumed')>

Traceback (most recent call last):
  File "test.py", line 4, in bug
    raise Exception("not consumed")
Exception: not consumed
@end example

태스크가 만들어진 곳의 트레이스백을 얻으려면 @ref{2137,,디버그 모드를 활성화하세요}:

@example
asyncio.run(main(), debug=True)
@end example

디버그 모드에서의 출력:

@example
Task exception was never retrieved
future: <Task finished coro=<bug() done, defined at test.py:3>
    exception=Exception('not consumed') created at asyncio/tasks.py:321>

source_traceback: Object created at (most recent call last):
  File "../t.py", line 9, in <module>
    asyncio.run(main(), debug=True)

< .. >

Traceback (most recent call last):
  File "../t.py", line 4, in bug
    raise Exception("not consumed")
Exception: not consumed
@end example

@node Asynchronous generators best practices,,전달되지 않은 예외 감지,asyncio로 개발하기
@anchor{library/asyncio-dev asynchronous-generators-best-practices}@anchor{3973}
@subsubsection Asynchronous generators best practices


Writing correct and efficient asyncio code requires awareness of certain pitfalls.
This section outlines essential best practices that can save you hours of debugging.

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

@end menu

@node Close asynchronous generators explicitly,Create asynchronous generators only when the event loop is running,,Asynchronous generators best practices
@anchor{library/asyncio-dev close-asynchronous-generators-explicitly}@anchor{3974}
@subsubsection Close asynchronous generators explicitly


It is recommended to manually close the
@ref{3975,,asynchronous generator}. If a generator
exits early - for example, due to an exception raised in the body of
an @code{async for} loop - its asynchronous cleanup code may run in an
unexpected context. This can occur after the tasks it depends on have completed,
or during the event loop shutdown when the async-generator’s garbage collection
hook is called.

To avoid this, explicitly close the generator by calling its
@ref{ad5,,aclose()} method, or use the @ref{9ee,,contextlib.aclosing()}
context manager:

@example
import asyncio
import contextlib

async def gen():
  yield 1
  yield 2

async def func():
  async with contextlib.aclosing(gen()) as g:
    async for x in g:
      break  # Don't iterate until the end

asyncio.run(func())
@end example

As noted above, the cleanup code for these asynchronous generators is deferred.
The following example demonstrates that the finalization of an asynchronous
generator can occur in an unexpected order:

@example
import asyncio
work_done = False

async def cursor():
    try:
        yield 1
    finally:
        assert work_done

async def rows():
    global work_done
    try:
        yield 2
    finally:
        await asyncio.sleep(0.1) # immitate some async work
        work_done = True


async def main():
    async for c in cursor():
        async for r in rows():
            break
        break

asyncio.run(main())
@end example

For this example, we get the following output:

@example
unhandled exception during asyncio.run() shutdown
task: <Task finished name='Task-3' coro=<<async_generator_athrow without __name__>()> exception=AssertionError()>
Traceback (most recent call last):
  File "example.py", line 6, in cursor
    yield 1
asyncio.exceptions.CancelledError

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "example.py", line 8, in cursor
    assert work_done
           ^^^^^^^^^
AssertionError
@end example

The @code{cursor()} asynchronous generator was finalized before the @code{rows}
generator - an unexpected behavior.

The example can be fixed by explicitly closing the
@code{cursor} and @code{rows} async-generators:

@example
async def main():
    async with contextlib.aclosing(cursor()) as cursor_gen:
        async for c in cursor_gen:
            async with contextlib.aclosing(rows()) as rows_gen:
                async for r in rows_gen:
                    break
            break
@end example

@node Create asynchronous generators only when the event loop is running,Avoid concurrent iteration and closure of the same generator,Close asynchronous generators explicitly,Asynchronous generators best practices
@anchor{library/asyncio-dev create-asynchronous-generators-only-when-the-event-loop-is-running}@anchor{3976}
@subsubsection Create asynchronous generators only when the event loop is running


It is recommended to create
@ref{3975,,asynchronous generators} only after
the event loop has been created.

To ensure that asynchronous generators close reliably, the event loop uses the
@ref{199e,,sys.set_asyncgen_hooks()} function to register callback functions. These
callbacks update the list of running asynchronous generators to keep it in a
consistent state.

When the @ref{e78,,loop.shutdown_asyncgens()}
function is called, the running generators are stopped gracefully and the
list is cleared.

The asynchronous generator invokes the corresponding system hook during its
first iteration. At the same time, the generator records that the hook has
been called and does not call it again.

Therefore, if iteration begins before the event loop is created,
the event loop will not be able to add the generator to its list of active
generators because the hooks are set after the generator attempts to call them.
Consequently, the event loop will not be able to terminate the generator
if necessary.

Consider the following example:

@example
import asyncio

async def agenfn():
    try:
        yield 10
    finally:
        await asyncio.sleep(0)


with asyncio.Runner() as runner:
    agen = agenfn()
    print(runner.run(anext(agen)))
    del agen
@end example

출력:

@example
10
Exception ignored while closing generator <async_generator object agenfn at 0x000002F71CD10D70>:
Traceback (most recent call last):
  File "example.py", line 13, in <module>
    del agen
        ^^^^
RuntimeError: async generator ignored GeneratorExit
@end example

This example can be fixed as follows:

@example
import asyncio

async def agenfn():
    try:
        yield 10
    finally:
        await asyncio.sleep(0)

async def main():
    agen = agenfn()
    print(await anext(agen))
    del agen

asyncio.run(main())
@end example

@node Avoid concurrent iteration and closure of the same generator,,Create asynchronous generators only when the event loop is running,Asynchronous generators best practices
@anchor{library/asyncio-dev avoid-concurrent-iteration-and-closure-of-the-same-generator}@anchor{3977}
@subsubsection Avoid concurrent iteration and closure of the same generator


Async generators may be reentered while another
@ref{24a0,,__anext__()} / @ref{71c,,athrow()} / @ref{ad5,,aclose()} call is in
progress. This may lead to an inconsistent state of the async generator and can
cause errors.

Let’s consider the following example:

@example
import asyncio

async def consumer():
    for idx in range(100):
        await asyncio.sleep(0)
        message = yield idx
        print('received', message)

async def amain():
    agenerator = consumer()
    await agenerator.asend(None)

    fa = asyncio.create_task(agenerator.asend('A'))
    fb = asyncio.create_task(agenerator.asend('B'))
    await fa
    await fb

asyncio.run(amain())
@end example

출력:

@example
received A
Traceback (most recent call last):
  File "test.py", line 38, in <module>
    asyncio.run(amain())
    ~~~~~~~~~~~^^^^^^^^^
  File "Lib/asyncio/runners.py", line 204, in run
    return runner.run(main)
           ~~~~~~~~~~^^^^^^
  File "Lib/asyncio/runners.py", line 127, in run
    return self._loop.run_until_complete(task)
           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^
  File "Lib/asyncio/base_events.py", line 719, in run_until_complete
    return future.result()
           ~~~~~~~~~~~~~^^
  File "test.py", line 36, in amain
    await fb
RuntimeError: anext(): asynchronous generator is already running
@end example

Therefore, it is recommended to avoid using asynchronous generators in parallel
tasks or across multiple event loops.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@cartouche
@quotation 참고 
asyncio의 소스 코드는 Lib/asyncio/@footnote{https://github.com/python/cpython/tree/3.14/Lib/asyncio/}에서 찾을 수 있습니다.
@end quotation
@end cartouche

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node socket — Low-level networking interface,ssl — TLS/SSL wrapper for socket objects,asyncio — 비동기 I/O,네트워킹과 프로세스 간 통신
@anchor{library/socket doc}@anchor{3978}@anchor{library/socket module-socket}@anchor{d1}@anchor{library/socket socket-low-level-networking-interface}@anchor{3979}@anchor{library/socket translation-repo}@anchor{397a}
@subsection @code{socket} — Low-level networking interface


@geindex module; socket

`소스 코드:' Lib/socket.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/socket.py}


__________________________________________________________________


이 모듈은 BSD `socket' 인터페이스에 대한 액세스를 제공합니다. 모든 현대 유닉스 시스템, 윈도우, MacOS, 그리고 아마 추가 플랫폼에서 사용할 수 있습니다.

@cartouche
@quotation 참고 
호출이 운영 체제 소켓 API로 이루어지기 때문에, 일부 동작은 플랫폼에 따라 다를 수 있습니다.
@end quotation
@end cartouche

@c include for modules that don't work on WASM

@ref{213c,,가용성}: not WASI.

이 모듈은 웹어셈블리에서 작동하지 않거나 제공되지 않습니다. 자세한 내용은 @ref{1b68,,웹어셈블리 플랫폼}을 참조하세요.

@geindex object;socket

The Python interface is a straightforward transliteration of the Unix system
call and library interface for sockets to Python’s object-oriented style: the
@ref{fa0,,socket()} function returns a `socket object' whose methods implement
the various socket system calls.  Parameter types are somewhat higher-level than
in the C interface: as with @code{read()} and @code{write()} operations on Python
files, buffer allocation on receive operations is automatic, and buffer length
is implicit on send operations.


@subsubheading 더 보기



@table @asis

@item 모듈 @ref{d2,,socketserver}

네트워크 서버 작성을 단순화하는 클래스.

@item 모듈 @ref{d5,,ssl}

소켓 객체용 TLS/SSL 래퍼.
@end table


@menu
* 소켓 패밀리:: 
* 모듈 내용: 모듈 내용<3>. 
* 소켓 객체:: 
* 소켓 시간제한에 대한 참고 사항:: 
* 예제: 예제<18>. 

@end menu

@node 소켓 패밀리,모듈 내용<3>,,socket — Low-level networking interface
@anchor{library/socket socket-addresses}@anchor{397b}@anchor{library/socket socket-families}@anchor{397c}
@subsubsection 소켓 패밀리


시스템과 빌드 옵션에 따라, 다양한 소켓 패밀리가 이 모듈에서 지원됩니다.

특정 소켓 객체가 요구하는 주소 형식은 소켓 객체를 만들 때 지정된 주소 패밀리에 따라 자동으로 선택됩니다. 소켓 주소는 다음과 같이 표현됩니다:


@itemize -

@item 
파일 시스템 노드에 바인드 된 @ref{1bae,,AF_UNIX} 소켓의 주소는 파일 시스템 인코딩과 @code{'surrogateescape'} 에러 처리기(
@geindex Python 향상 제안; PEP 383
PEP 383@footnote{https://peps.python.org/pep-0383/}을 참조하세요)를 사용하는 문자열로 표현됩니다. 리눅스의 추상 이름 공간(abstract namespace)에 있는 주소는 처음에 널 바이트가 있는 @ref{193,,바이트열류 객체}로 반환됩니다; 이 이름 공간의 소켓은 일반 파일 시스템 소켓과 통신 할 수 있으므로, 리눅스에서 실행하려는 프로그램은 두 가지 유형의 주소를 모두 다뤄야 할 수도 있습니다. 문자열이나 바이트열류 객체는 인자로 전달할 때 두 가지 유형의 주소에 모두 사용할 수 있습니다.


버전 3.3에서 변경: 이전에는, @ref{1bae,,AF_UNIX} 소켓 경로가 UTF-8 인코딩을 사용한다고 가정했습니다.



버전 3.5에서 변경: 이제 쓰기 가능한 @ref{193,,바이트열류 객체}를 받아들입니다.

@end itemize
@anchor{library/socket host-port}@anchor{397d}

@itemize -

@item 
A pair @code{(host, port)} is used for the @ref{1bab,,AF_INET} address family,
where `host' is a string representing either a hostname in internet domain
notation like @code{'daring.cwi.nl'} or an IPv4 address like @code{'100.50.200.5'},
and `port' is an integer.


@itemize -

@item 
IPv4 주소의 경우, 호스트 주소 대신 두 개의 특수 형식이 허용됩니다: @code{'@w{'}}는 모든 인터페이스에 바인딩하는 데 사용되는 @code{INADDR_ANY}를 나타내며 @code{'<broadcast>'} 문자열은 @code{INADDR_BROADCAST}를 나타냅니다. 이 동작은 IPv6와 호환되지 않으므로, 여러분의 파이썬 프로그램에서 IPv6를 지원하려는 경우에는 이것들을 사용하지 않을 수 있습니다.
@end itemize

@item 
For @ref{1bac,,AF_INET6} address family, a four-tuple @code{(host, port, flowinfo,
scope_id)} is used, where `flowinfo' and `scope_id' represent the @code{sin6_flowinfo}
and @code{sin6_scope_id} members in @code{struct sockaddr_in6} in C.  For
@code{socket} module methods, `flowinfo' and `scope_id' can be omitted just for
backward compatibility.  Note, however, omission of `scope_id' can cause problems
in manipulating scoped IPv6 addresses.


버전 3.7에서 변경: 멀티캐스트 주소(의미 있는 `scope_id'를 가진)의 경우, `address'에는 @code{%scope_id} (또는 @code{zone id}) 부분이 포함될 수 없습니다. 이 정보는 불필요하므로 안전하게 생략할 수 있습니다 (권장 사항).


@item 
@code{AF_NETLINK} 소켓은 @code{(pid, groups)} 쌍으로 표현됩니다.

@item 
TIPC에 대한 리눅스 전용 지원은 @code{AF_TIPC} 주소 패밀리를 사용하여 사용할 수 있습니다. TIPC는 클러스터 된 컴퓨터 환경에서 사용하도록 설계된 개방형 비 IP 기반 네트워크 프로토콜입니다. 주소는 튜플로 표현되며 필드는 주소 유형에 따라 다릅니다. 일반적인 튜플 형식은 @code{(addr_type, v1, v2, v3 [, scope])}입니다. 이때:


@itemize -

@item 
`addr_type'은 @code{TIPC_ADDR_NAMESEQ}, @code{TIPC_ADDR_NAME} 또는 @code{TIPC_ADDR_ID} 중 하나입니다.

@item 
`scope'는 @code{TIPC_ZONE_SCOPE}, @code{TIPC_CLUSTER_SCOPE} 또는 @code{TIPC_NODE_SCOPE} 중 하나입니다.

@item 
`addr_type'이 @code{TIPC_ADDR_NAME}이면, `v1'은 서버 유형이고, `v2'는 포트 식별자이며, `v3'은 0이어야 합니다.

`addr_type'이 @code{TIPC_ADDR_NAMESEQ}면, `v1'은 서버 유형이고, `v2'는 하위 포트 번호이며, `v3'는 상위 포트 번호입니다.

`addr_type'이 @code{TIPC_ADDR_ID}면, `v1'은 노드이고, `v2'는 참조이며, `v3'는 0으로 설정되어야 합니다.
@end itemize

@item 
튜플 @code{(interface, )}가 @ref{397e,,AF_CAN} 주소 패밀리에 사용됩니다. 여기서 `interface'는 @code{'can0'}과 같은 네트워크 인터페이스 이름을 나타내는 문자열입니다. 네트워크 인터페이스 이름 @code{'@w{'}}는 이 패밀리의 모든 네트워크 인터페이스에서 패킷을 수신하는 데 사용할 수 있습니다.


@itemize -

@item 
@ref{397f,,CAN_ISOTP} protocol requires a tuple @code{(interface, rx_addr, tx_addr)}
where both additional parameters are unsigned long integer that represent a
CAN identifier (standard or extended).

@item 
@ref{b2c,,CAN_J1939} protocol requires a tuple @code{(interface, name, pgn, addr)}
where additional parameters are 64-bit unsigned integer representing the
ECU name, a 32-bit unsigned integer representing the Parameter Group Number
(PGN), and an 8-bit integer representing the address.
@end itemize

@item 
A string or a tuple @code{(id, unit)} is used for the @code{SYSPROTO_CONTROL}
protocol of the @code{PF_SYSTEM} family. The string is the name of a
kernel control using a dynamically assigned ID. The tuple can be used if ID
and unit number of the kernel control are known or if a registered ID is
used.


Added in version 3.3.


@item 
@ref{1bad,,AF_BLUETOOTH}는 다음 프로토콜 및 주소 형식을 지원합니다:


@itemize -

@item 
@ref{283,,BTPROTO_L2CAP} accepts a tuple
@code{(bdaddr, psm[, cid[, bdaddr_type]])} where:


@itemize -

@item 
@code{bdaddr} is a string specifying the Bluetooth address.

@item 
@code{psm} is an integer specifying the Protocol/Service Multiplexer.

@item 
@code{cid} is an optional integer specifying the Channel Identifier.
If not given, defaults to zero.

@item 
@code{bdaddr_type} is an optional integer specifying the address type;
one of @ref{3980,,BDADDR_BREDR} (default), @ref{3981,,BDADDR_LE_PUBLIC},
@ref{3982,,BDADDR_LE_RANDOM}.
@end itemize


버전 3.14에서 변경: Added @code{cid} and @code{bdaddr_type} fields.


@item 
@ref{3983,,BTPROTO_RFCOMM}은 @code{(bdaddr, channel)}를 받아들입니다. 여기서 @code{bdaddr}은 문자열 블루투스 주소이고 @code{channel}은 정수입니다.

@item 
@ref{281,,BTPROTO_HCI} accepts a format that depends on your OS.


@itemize -

@item 
On Linux it accepts an integer @code{device_id} or a tuple
@code{(device_id, [channel])} where @code{device_id}
specifies the number of the Bluetooth device,
and @code{channel} is an optional integer specifying the HCI channel
(@ref{3984,,HCI_CHANNEL_RAW} by default).

@item 
On FreeBSD, NetBSD and DragonFly BSD it accepts @code{bdaddr}
where @code{bdaddr} is the Bluetooth address as a string.
@end itemize


버전 3.2에서 변경: NetBSD 및 DragonFlyBSD 지원이 추가되었습니다.



버전 3.13.3에서 변경: FreeBSD support added.



버전 3.14에서 변경: Added @code{channel} field.
@code{device_id} not packed in a tuple is now accepted.


@item 
@ref{282,,BTPROTO_SCO} accepts @code{bdaddr} where @code{bdaddr} is
the Bluetooth address as a string or a @ref{192,,bytes} object.
(ex. @code{'12:23:34:45:56:67'} or @code{b'12:23:34:45:56:67'})


버전 3.14에서 변경: FreeBSD support added.

@end itemize

@item 
@ref{ed1,,AF_ALG}는 커널 암호 인터페이스에 기반한 리눅스 전용 소켓입니다. 알고리즘 소켓은 2~4개의 요소를 갖는 @code{(type, name [, feat [, mask]])} 튜플로 구성됩니다. 여기서:


@itemize -

@item 
`type'은 문자열의 알고리즘 유형입니다, 예를 들어, @code{aead}, @code{hash}, @code{skcipher} 또는 @code{rng}.

@item 
`name'은 알고리즘 이름과 연산 모드 문자열입니다, 예를 들어, @code{sha256}, @code{hmac(sha256)}, @code{cbc(aes)} 또는 @code{drbg_nopr_ctr_aes256}.

@item 
`feat' 과 `mask'는 부호 없는 32비트 정수입니다.
@end itemize

@ref{213c,,가용성}: Linux >= 2.6.38.

Some algorithm types require more recent Kernels.


Added in version 3.6.


@item 
@ref{d6c,,AF_VSOCK}은 가상 기계와 호스트가 통신할 수 있게 합니다. 소켓은 @code{(CID, port)} 튜플로 표현되는데, 컨텍스트 ID 또는 CID와 port는 정수입니다.

@ref{213c,,가용성}: Linux >= 3.9

See @code{vsock(7)@footnote{https://manpages.debian.org/vsock(7)}}


Added in version 3.7.


@item 
@ref{3985,,AF_PACKET} is a low-level interface directly to network devices.
The addresses are represented by the tuple
@code{(ifname, proto[, pkttype[, hatype[, addr]]])} where:


@itemize -

@item 
`ifname' - 장치 이름을 지정하는 문자열

@item 
`proto' - The Ethernet protocol number.
May be @ref{1b21,,ETH_P_ALL} to capture all protocols,
one of the @ref{1b22,,ETHERTYPE_* constants}
or any other Ethernet protocol number.

@item 
`pkttype' - 패킷 유형을 지정하는 선택적 정수.:


@itemize -

@item 
@code{PACKET_HOST} (기본값) - 로컬 호스트로 향하는 패킷.

@item 
@code{PACKET_BROADCAST} - 물리 계층 브로드캐스트 패킷.

@item 
@code{PACKET_MULTICAST} - Packet sent to a physical-layer multicast address.

@item 
@code{PACKET_OTHERHOST} - 무차별 모드의 장치 관리자에 의해 포착된 다른 호스트로 향하는 패킷.

@item 
@code{PACKET_OUTGOING} - 패킷 소켓으로 루프 백 된 로컬 호스트에서 시작된 패킷.
@end itemize

@item 
`hatype' - ARP 하드웨어 주소 유형을 지정하는 선택적 정수.

@item 
`addr' - 하드웨어 물리 주소를 지정하는 선택적 바이트열류 객체, 해석은 장치에 따라 다릅니다.
@end itemize

@ref{213c,,가용성}: Linux >= 2.2.

@item 
@ref{3986,,AF_QIPCRTR}는 Qualcomm 플랫폼의 코 프로세서에서 실행되는 서비스와 통신하기 위한 리눅스 전용 소켓 기반 인터페이스입니다. 주소 패밀리는 @code{(node, port)} 튜플로 표현되는데, `node'와 `port'는 음수가 아닌 정수입니다.

@ref{213c,,가용성}: Linux >= 4.7.


Added in version 3.8.


@item 
@code{IPPROTO_UDPLITE}는 UDP의 변형으로, 체크섬으로 커버되는 패킷 부분을 지정할 수 있습니다. 변경할 수 있는 두 개의 소켓 옵션이 추가되었습니다. @code{self.setsockopt(IPPROTO_UDPLITE, UDPLITE_SEND_CSCOV, length)}는 체크섬으로 커버되는 나가는 패킷 부분을 변경하고 @code{self.setsockopt(IPPROTO_UDPLITE, UDPLITE_RECV_CSCOV, length)}는 너무 적은 데이터를 커버하는 패킷을 걸러냅니다. 두 경우 모두 @code{length}는 @code{range(8, 2**16, 8)}에 있어야합니다.

이러한 소켓은 IPv4의 경우 @code{socket(AF_INET, SOCK_DGRAM, IPPROTO_UDPLITE)} 또는 IPv6의 경우 @code{socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDPLITE)}로 구성되어야 합니다.

@ref{213c,,가용성}: Linux >= 2.6.20, FreeBSD >= 10.1


Added in version 3.9.


@item 
@ref{3987,,AF_HYPERV} is a Windows-only socket based interface for communicating
with Hyper-V hosts and guests. The address family is represented as a
@code{(vm_id, service_id)} tuple where the @code{vm_id} and @code{service_id} are
UUID strings.

The @code{vm_id} is the virtual machine identifier or a set of known VMID values
if the target is not a specific virtual machine. Known VMID constants
defined on @code{socket} are:


@itemize -

@item 
@code{HV_GUID_ZERO}

@item 
@code{HV_GUID_BROADCAST}

@item 
@code{HV_GUID_WILDCARD} - Used to bind on itself and accept connections from
all partitions.

@item 
@code{HV_GUID_CHILDREN} - Used to bind on itself and accept connection from
child partitions.

@item 
@code{HV_GUID_LOOPBACK} - Used as a target to itself.

@item 
@code{HV_GUID_PARENT} - When used as a bind accepts connection from the parent
partition. When used as an address target it will connect to the parent partition.
@end itemize

The @code{service_id} is the service identifier of the registered service.


Added in version 3.12.

@end itemize

IPv4/v6 소켓 주소의 `host' 부분에 호스트 명을 사용하면, 파이썬이 DNS 결정에서 반환된 첫 번째 주소를 사용하기 때문에, 프로그램은 비결정적인 동작을 보일 수 있습니다. 소켓 주소는 DNS 결정 결과 및/또는 호스트 구성에 따라 실제 IPv4/v6 주소로 다르게 결정됩니다. 결정론적 동작을 위해서는 `host' 부분에 숫자 주소를 사용하십시오.

All errors raise exceptions.  The normal exceptions for invalid argument types
and out-of-memory conditions can be raised. Errors
related to socket or address semantics raise @ref{2c0,,OSError} or one of its
subclasses.

비 블로킹 모드는 @ref{3063,,setblocking()}을 통해 지원됩니다. 시간제한을 기반으로 하는 일반화는 @ref{3988,,settimeout()}을 통해 지원됩니다.

@node 모듈 내용<3>,소켓 객체,소켓 패밀리,socket — Low-level networking interface
@anchor{library/socket module-contents}@anchor{3989}
@subsubsection 모듈 내용


The module @code{socket} exports the following elements.

@menu
* 예외: 예외<12>. 
* 상수: 상수<8>. 
* 함수: 함수<7>. 

@end menu

@node 예외<12>,상수<8>,,모듈 내용<3>
@anchor{library/socket exceptions}@anchor{398a}
@subsubsection 예외


@geindex error
@anchor{library/socket socket error}@anchor{1255}
@deffn {예외} socket.error

@ref{2c0,,OSError}의 폐지된 별칭.


버전 3.3에서 변경: 
@geindex Python 향상 제안; PEP 3151
PEP 3151@footnote{https://peps.python.org/pep-3151/}을 따라, 이 클래스는 @ref{2c0,,OSError}의 별칭이 되었습니다.

@end deffn

@geindex herror
@anchor{library/socket socket herror}@anchor{398b}
@deffn {예외} socket.herror

@ref{2c0,,OSError}의 서브 클래스, 이 예외는 주소 관련 에러에서 발생합니다. 즉 @ref{1c82,,gethostbyname_ex()}와 @ref{1c81,,gethostbyaddr()}를 포함하는 POSIX C API의 `h_errno'를 사용하는 함수들. 수반되는 값은 라이브러리 호출이 반환한 에러를 나타내는 @code{(h_errno, string)} 쌍입니다. `h_errno'는 숫자 값이고, `string'은 @code{hstrerror()} C 함수에 의해 반환된 `h_errno'의 설명을 나타냅니다.


버전 3.3에서 변경: 이 클래스는 @ref{2c0,,OSError}의 서브 클래스가 되었습니다.

@end deffn

@geindex gaierror
@anchor{library/socket socket gaierror}@anchor{1ac2}
@deffn {예외} socket.gaierror

A subclass of @ref{2c0,,OSError}, this exception is raised for
address-related errors by @ref{176f,,getaddrinfo()} and @ref{1a3b,,getnameinfo()}.
The accompanying value is a pair @code{(error, string)} representing an error
returned by a library call.  `string' represents the description of
`error', as returned by the @code{gai_strerror()} C function.  The
numeric `error' value will match one of the @code{EAI_*} constants
defined in this module.


버전 3.3에서 변경: 이 클래스는 @ref{2c0,,OSError}의 서브 클래스가 되었습니다.

@end deffn

@geindex timeout
@anchor{library/socket socket timeout}@anchor{a35}
@deffn {예외} socket.timeout

A deprecated alias of @ref{a36,,TimeoutError}.

@ref{2c0,,OSError}의 서브 클래스, 이 예외는 앞서 @ref{3988,,settimeout()} 호출을 통해 (또는 묵시적으로 @ref{398c,,setdefaulttimeout()}를 통해) 시간제한이 활성화된 소켓에서 시간 초과가 일어날 때 발생합니다. 수반되는 값은 현재는 항상 “timed out” 값을 갖는 문자열입니다.


버전 3.3에서 변경: 이 클래스는 @ref{2c0,,OSError}의 서브 클래스가 되었습니다.



버전 3.10에서 변경: This class was made an alias of @ref{a36,,TimeoutError}.

@end deffn

@node 상수<8>,함수<7>,예외<12>,모듈 내용<3>
@anchor{library/socket constants}@anchor{398d}
@subsubsection 상수


AF_* 와 SOCK_* 상수는 이제 @code{AddressFamily} 와 @code{SocketKind} @ref{eda,,IntEnum} 컬렉션입니다.


Added in version 3.4.


@geindex AF_UNIX (socket 모듈)
@geindex AF_INET (socket 모듈)
@geindex AF_INET6 (socket 모듈)
@anchor{library/socket socket AF_UNIX}@anchor{1bae}
@deffn {데이터} socket.AF_UNIX
@anchor{library/socket socket AF_INET}@anchor{1bab}
@deffnx {데이터} socket.AF_INET
@anchor{library/socket socket AF_INET6}@anchor{1bac}
@deffnx {데이터} socket.AF_INET6

These constants represent the address (and protocol) families, used for the
first argument to @ref{fa0,,socket()}.  If the @ref{1bae,,AF_UNIX} constant is not
defined then this protocol is unsupported.  More constants may be available
depending on the system.
@end deffn

@geindex AF_UNSPEC (socket 모듈)
@anchor{library/socket socket AF_UNSPEC}@anchor{38ca}
@deffn {데이터} socket.AF_UNSPEC

@ref{38ca,,AF_UNSPEC} means that
@ref{176f,,getaddrinfo()} should return socket addresses for any
address family (either IPv4, IPv6, or any other) that can be used.
@end deffn

@geindex SOCK_STREAM (socket 모듈)
@geindex SOCK_DGRAM (socket 모듈)
@geindex SOCK_RAW (socket 모듈)
@geindex SOCK_RDM (socket 모듈)
@geindex SOCK_SEQPACKET (socket 모듈)
@anchor{library/socket socket SOCK_STREAM}@anchor{14f8}
@deffn {데이터} socket.SOCK_STREAM
@anchor{library/socket socket SOCK_DGRAM}@anchor{14f7}
@deffnx {데이터} socket.SOCK_DGRAM
@anchor{library/socket socket SOCK_RAW}@anchor{398e}
@deffnx {데이터} socket.SOCK_RAW
@anchor{library/socket socket SOCK_RDM}@anchor{398f}
@deffnx {데이터} socket.SOCK_RDM
@anchor{library/socket socket SOCK_SEQPACKET}@anchor{3990}
@deffnx {데이터} socket.SOCK_SEQPACKET

These constants represent the socket types, used for the second argument to
@ref{fa0,,socket()}.  More constants may be available depending on the system.
(Only @ref{14f8,,SOCK_STREAM} and @ref{14f7,,SOCK_DGRAM} appear to be generally
useful.)
@end deffn

@geindex SOCK_CLOEXEC (socket 모듈)
@geindex SOCK_NONBLOCK (socket 모듈)
@anchor{library/socket socket SOCK_CLOEXEC}@anchor{e04}
@deffn {데이터} socket.SOCK_CLOEXEC
@anchor{library/socket socket SOCK_NONBLOCK}@anchor{e03}
@deffnx {데이터} socket.SOCK_NONBLOCK

이 두 상수는, 정의되었다면, 소켓 유형과 결합하여 일부 플래그를 원자 적으로 설정할 수 있도록 합니다 (따라서 경쟁 조건의 가능성과 별도 호출의 필요성을 피할 수 있습니다).


@subsubheading 더 보기


Secure File Descriptor Handling@footnote{https://udrepper.livejournal.com/20407.html}
for a more thorough explanation.


@ref{213c,,가용성}: Linux >= 2.6.27.


Added in version 3.2.

@end deffn

@geindex SOMAXCONN (socket 모듈)
@anchor{library/socket socket-unix-constants}@anchor{d6b}
@deffn {데이터} SO_*
@anchor{library/socket socket SOMAXCONN}@anchor{105e}
@deffnx {데이터} socket.SOMAXCONN

@deffnx {데이터} MSG_*

@deffnx {데이터} SOL_*

@deffnx {데이터} SCM_*

@deffnx {데이터} IPPROTO_*

@deffnx {데이터} IPPORT_*

@deffnx {데이터} INADDR_*

@deffnx {데이터} IP_*

@deffnx {데이터} IPV6_*

@deffnx {데이터} EAI_*

@deffnx {데이터} AI_*

@deffnx {데이터} NI_*

@deffnx {데이터} TCP_*

Many constants of these forms, documented in the Unix documentation on sockets
and/or the IP protocol, are also defined in the socket module. They are
generally used in arguments to the @ref{ed0,,setsockopt()} and @ref{ecf,,getsockopt()}
methods of socket objects.  In most cases, only those symbols that are defined
in the Unix header files are defined; for a few symbols, default values are
provided.


버전 3.6에서 변경: @code{SO_DOMAIN}, @code{SO_PROTOCOL}, @code{SO_PEERSEC}, @code{SO_PASSSEC}, @code{TCP_USER_TIMEOUT}, @code{TCP_CONGESTION}가 추가되었습니다.



버전 3.6.5에서 변경: Added support for @code{TCP_FASTOPEN}, @code{TCP_KEEPCNT} on Windows platforms
when available.



버전 3.7에서 변경: @code{TCP_NOTSENT_LOWAT}가 추가되었습니다.

Added support for @code{TCP_KEEPIDLE}, @code{TCP_KEEPINTVL} on Windows platforms
when available.



버전 3.10에서 변경: @code{IP_RECVTOS} was added.
 Added @code{TCP_KEEPALIVE}. On MacOS this constant can be used in the same
 way that @code{TCP_KEEPIDLE} is used on Linux.



버전 3.11에서 변경: Added @code{TCP_CONNECTION_INFO}. On MacOS this constant can be used in the
same way that @code{TCP_INFO} is used on Linux and BSD.



버전 3.12에서 변경: Added @code{SO_RTABLE} and @code{SO_USER_COOKIE}. On OpenBSD
and FreeBSD respectively those constants can be used in the same way that
@code{SO_MARK} is used on Linux. Also added missing TCP socket options from
Linux: @code{TCP_MD5SIG}, @code{TCP_THIN_LINEAR_TIMEOUTS}, @code{TCP_THIN_DUPACK},
@code{TCP_REPAIR}, @code{TCP_REPAIR_QUEUE}, @code{TCP_QUEUE_SEQ},
@code{TCP_REPAIR_OPTIONS}, @code{TCP_TIMESTAMP}, @code{TCP_CC_INFO},
@code{TCP_SAVE_SYN}, @code{TCP_SAVED_SYN}, @code{TCP_REPAIR_WINDOW},
@code{TCP_FASTOPEN_CONNECT}, @code{TCP_ULP}, @code{TCP_MD5SIG_EXT},
@code{TCP_FASTOPEN_KEY}, @code{TCP_FASTOPEN_NO_COOKIE},
@code{TCP_ZEROCOPY_RECEIVE}, @code{TCP_INQ}, @code{TCP_TX_DELAY}.
Added @code{IP_PKTINFO}, @code{IP_UNBLOCK_SOURCE}, @code{IP_BLOCK_SOURCE},
@code{IP_ADD_SOURCE_MEMBERSHIP}, @code{IP_DROP_SOURCE_MEMBERSHIP}.



버전 3.13에서 변경: Added @code{SO_BINDTOIFINDEX}. On Linux this constant can be used in the
same way that @code{SO_BINDTODEVICE} is used, but with the index of a
network interface instead of its name.



버전 3.14에서 변경: Added missing @code{IP_FREEBIND}, @code{IP_RECVERR}, @code{IPV6_RECVERR},
@code{IP_RECVTTL}, and @code{IP_RECVORIGDSTADDR} on Linux.



버전 3.14에서 변경: Added support for @code{TCP_QUICKACK} on Windows platforms when available.

@end deffn

@geindex AF_CAN (socket 모듈)
@geindex PF_CAN (socket 모듈)
@anchor{library/socket socket AF_CAN}@anchor{397e}
@deffn {데이터} socket.AF_CAN
@anchor{library/socket socket PF_CAN}@anchor{3991}
@deffnx {데이터} socket.PF_CAN

@deffnx {데이터} SOL_CAN_*

@deffnx {데이터} CAN_*

리눅스 설명서에 설명되어있는 이 형식의 많은 상수는 소켓 모듈에도 정의되어 있습니다.

@ref{213c,,가용성}: Linux >= 2.6.25, NetBSD >= 8.


Added in version 3.3.



버전 3.11에서 변경: NetBSD support was added.



버전 3.14에서 변경: Restored missing @code{CAN_RAW_ERR_FILTER} on Linux.

@end deffn

@geindex CAN_BCM (socket 모듈)
@anchor{library/socket socket CAN_BCM}@anchor{11a2}
@deffn {데이터} socket.CAN_BCM

@deffnx {데이터} CAN_BCM_*

CAN 프로토콜 패밀리에서 CAN_BCM은 브로드캐스트 관리자 (Broadcast Manager, BCM) 프로토콜입니다. 리눅스 설명서에서 설명된 브로드캐스트 관리자 상수도 소켓 모듈에 정의되어 있습니다.

@ref{213c,,가용성}: Linux >= 2.6.25.

@cartouche
@quotation 참고 
@code{CAN_BCM_CAN_FD_FRAME} 플래그는 리눅스 >= 4.8 에서만 사용 가능합니다.
@end quotation
@end cartouche


Added in version 3.4.

@end deffn

@geindex CAN_RAW_FD_FRAMES (socket 모듈)
@anchor{library/socket socket CAN_RAW_FD_FRAMES}@anchor{10c9}
@deffn {데이터} socket.CAN_RAW_FD_FRAMES

CAN_RAW 소켓에서 CAN FD 지원을 활성화합니다. 기본적으로 비활성화되어 있습니다. 여러분의 응용 프로그램이 CAN과 CAN FD 프레임을 모두 보낼 수 있도록 합니다; 그러나 소켓에서 읽을 때 CAN과 CAN FD 프레임을 모두 받아들여야 합니다.

이 상수는 리눅스 설명서에 설명되어 있습니다.

@ref{213c,,가용성}: Linux >= 3.6.


Added in version 3.5.

@end deffn

@geindex CAN_RAW_JOIN_FILTERS (socket 모듈)
@anchor{library/socket socket CAN_RAW_JOIN_FILTERS}@anchor{b2b}
@deffn {데이터} socket.CAN_RAW_JOIN_FILTERS

주어진 모든 CAN 필터와 일치하는 CAN 프레임 만 사용자 공간으로 전달되도록 적용된 CAN 필터를 결합합니다.

이 상수는 리눅스 설명서에 설명되어 있습니다.

@ref{213c,,가용성}: Linux >= 4.1.


Added in version 3.9.

@end deffn

@geindex CAN_ISOTP (socket 모듈)
@anchor{library/socket socket CAN_ISOTP}@anchor{397f}
@deffn {데이터} socket.CAN_ISOTP

CAN 프로토콜 패밀리의 CAN_ISOTP는 ISO-TP (ISO 15765-2) 프로토콜입니다. ISO-TP 상수는 리눅스 설명서에 설명되어 있습니다.

@ref{213c,,가용성}: Linux >= 2.6.25.


Added in version 3.7.

@end deffn

@geindex CAN_J1939 (socket 모듈)
@anchor{library/socket socket CAN_J1939}@anchor{b2c}
@deffn {데이터} socket.CAN_J1939

CAN 프로토콜 패밀리의 CAN_J1939는 SAE J1939 프로토콜입니다. J1939 상수는 리눅스 설명서에 설명되어 있습니다.

@ref{213c,,가용성}: Linux >= 5.4.


Added in version 3.9.

@end deffn

@geindex AF_DIVERT (socket 모듈)
@geindex PF_DIVERT (socket 모듈)
@anchor{library/socket socket AF_DIVERT}@anchor{3992}
@deffn {데이터} socket.AF_DIVERT
@anchor{library/socket socket PF_DIVERT}@anchor{3993}
@deffnx {데이터} socket.PF_DIVERT

These two constants, documented in the FreeBSD divert(4) manual page, are
also defined in the socket module.

@ref{213c,,가용성}: FreeBSD >= 14.0.


Added in version 3.12.

@end deffn

@geindex AF_PACKET (socket 모듈)
@geindex PF_PACKET (socket 모듈)
@anchor{library/socket socket AF_PACKET}@anchor{3985}
@deffn {데이터} socket.AF_PACKET
@anchor{library/socket socket PF_PACKET}@anchor{3994}
@deffnx {데이터} socket.PF_PACKET

@deffnx {데이터} PACKET_*

리눅스 설명서에 설명되어있는 이 형식의 많은 상수는 소켓 모듈에도 정의되어 있습니다.

@ref{213c,,가용성}: Linux >= 2.2.
@end deffn

@geindex ETH_P_ALL (socket 모듈)
@anchor{library/socket socket ETH_P_ALL}@anchor{1b21}
@deffn {데이터} socket.ETH_P_ALL

@code{ETH_P_ALL} can be used in the @ref{fa0,,socket}
constructor as `proto' for the @ref{3985,,AF_PACKET} family in order to
capture every packet, regardless of protocol.

For more information, see the @code{packet(7)@footnote{https://manpages.debian.org/packet(7)}} manpage.

@ref{213c,,가용성}: Linux.


Added in version 3.12.

@end deffn

@geindex AF_RDS (socket 모듈)
@geindex PF_RDS (socket 모듈)
@geindex SOL_RDS (socket 모듈)
@anchor{library/socket socket AF_RDS}@anchor{3995}
@deffn {데이터} socket.AF_RDS
@anchor{library/socket socket PF_RDS}@anchor{3996}
@deffnx {데이터} socket.PF_RDS
@anchor{library/socket socket SOL_RDS}@anchor{3997}
@deffnx {데이터} socket.SOL_RDS

@deffnx {데이터} RDS_*

리눅스 설명서에 설명되어있는 이 형식의 많은 상수는 소켓 모듈에도 정의되어 있습니다.

@ref{213c,,가용성}: Linux >= 2.6.30.


Added in version 3.3.

@end deffn

@geindex SIO_RCVALL (socket 모듈)
@geindex SIO_KEEPALIVE_VALS (socket 모듈)
@geindex SIO_LOOPBACK_FAST_PATH (socket 모듈)
@anchor{library/socket socket SIO_RCVALL}@anchor{3998}
@deffn {데이터} socket.SIO_RCVALL
@anchor{library/socket socket SIO_KEEPALIVE_VALS}@anchor{3999}
@deffnx {데이터} socket.SIO_KEEPALIVE_VALS
@anchor{library/socket socket SIO_LOOPBACK_FAST_PATH}@anchor{ece}
@deffnx {데이터} socket.SIO_LOOPBACK_FAST_PATH

@deffnx {데이터} RCVALL_*

윈도우 WSAIoctl()용 상수. 이 상수는 소켓 객체의 @ref{ecd,,ioctl()} 메서드에 대한 인자로 사용됩니다.


버전 3.6에서 변경: @code{SIO_LOOPBACK_FAST_PATH}가 추가되었습니다.

@end deffn


@deffn {데이터} TIPC_*

TIPC 관련 상수. C 소켓 API에서 내보낸 것과 일치합니다. 자세한 정보는 TIPC 설명서를 참조하십시오.
@end deffn

@geindex AF_ALG (socket 모듈)
@geindex SOL_ALG (socket 모듈)
@anchor{library/socket socket AF_ALG}@anchor{ed1}
@deffn {데이터} socket.AF_ALG
@anchor{library/socket socket SOL_ALG}@anchor{399a}
@deffnx {데이터} socket.SOL_ALG

@deffnx {데이터} ALG_*

리눅스 커널 암호화용 상수.

@ref{213c,,가용성}: Linux >= 2.6.38.


Added in version 3.6.

@end deffn

@geindex AF_VSOCK (socket 모듈)
@geindex IOCTL_VM_SOCKETS_GET_LOCAL_CID (socket 모듈)
@anchor{library/socket socket AF_VSOCK}@anchor{d6c}
@deffn {데이터} socket.AF_VSOCK
@anchor{library/socket socket IOCTL_VM_SOCKETS_GET_LOCAL_CID}@anchor{399b}
@deffnx {데이터} socket.IOCTL_VM_SOCKETS_GET_LOCAL_CID

@deffnx {데이터} VMADDR*

@deffnx {데이터} SO_VM*

리눅스 호스트/게스트 통신용 상수.

@ref{213c,,가용성}: Linux >= 4.8.


Added in version 3.7.

@end deffn

@geindex AF_LINK (socket 모듈)
@anchor{library/socket socket AF_LINK}@anchor{11a3}
@deffn {데이터} socket.AF_LINK

@ref{213c,,가용성}: BSD, macOS.


Added in version 3.4.

@end deffn

@geindex has_ipv6 (socket 모듈)
@anchor{library/socket socket has_ipv6}@anchor{399c}
@deffn {데이터} socket.has_ipv6

이 상수는 이 플랫폼에서 IPv6가 지원되는지를 나타내는 논릿값을 포함합니다.
@end deffn

@geindex AF_BLUETOOTH (socket 모듈)
@geindex BTPROTO_L2CAP (socket 모듈)
@geindex BTPROTO_RFCOMM (socket 모듈)
@geindex BTPROTO_HCI (socket 모듈)
@geindex BTPROTO_SCO (socket 모듈)
@anchor{library/socket socket AF_BLUETOOTH}@anchor{1bad}
@deffn {데이터} socket.AF_BLUETOOTH
@anchor{library/socket socket BTPROTO_L2CAP}@anchor{283}
@deffnx {데이터} socket.BTPROTO_L2CAP
@anchor{library/socket socket BTPROTO_RFCOMM}@anchor{3983}
@deffnx {데이터} socket.BTPROTO_RFCOMM
@anchor{library/socket socket BTPROTO_HCI}@anchor{281}
@deffnx {데이터} socket.BTPROTO_HCI
@anchor{library/socket socket BTPROTO_SCO}@anchor{282}
@deffnx {데이터} socket.BTPROTO_SCO

Integer constants for use with Bluetooth addresses.
@end deffn

@geindex BDADDR_ANY (socket 모듈)
@geindex BDADDR_LOCAL (socket 모듈)
@anchor{library/socket socket BDADDR_ANY}@anchor{399d}
@deffn {데이터} socket.BDADDR_ANY
@anchor{library/socket socket BDADDR_LOCAL}@anchor{399e}
@deffnx {데이터} socket.BDADDR_LOCAL

이들은 특수한 의미를 지닌 블루투스 주소를 포함하는 문자열 상수입니다. 예를 들어, @ref{399d,,BDADDR_ANY}는 바인딩 소켓을 @ref{3983,,BTPROTO_RFCOMM}로 지정할 때 임의의(any) 주소를 나타내는 데 사용할 수 있습니다.
@end deffn

@geindex BDADDR_BREDR (socket 모듈)
@geindex BDADDR_LE_PUBLIC (socket 모듈)
@geindex BDADDR_LE_RANDOM (socket 모듈)
@anchor{library/socket socket BDADDR_BREDR}@anchor{3980}
@deffn {데이터} socket.BDADDR_BREDR
@anchor{library/socket socket BDADDR_LE_PUBLIC}@anchor{3981}
@deffnx {데이터} socket.BDADDR_LE_PUBLIC
@anchor{library/socket socket BDADDR_LE_RANDOM}@anchor{3982}
@deffnx {데이터} socket.BDADDR_LE_RANDOM

These constants describe the Bluetooth address type when binding or
connecting a @ref{283,,BTPROTO_L2CAP} socket.

@ref{213c,,가용성}: Linux, FreeBSD


Added in version 3.14.

@end deffn

@geindex SOL_RFCOMM (socket 모듈)
@geindex SOL_L2CAP (socket 모듈)
@geindex SOL_HCI (socket 모듈)
@geindex SOL_SCO (socket 모듈)
@geindex SOL_BLUETOOTH (socket 모듈)
@anchor{library/socket socket SOL_RFCOMM}@anchor{399f}
@deffn {데이터} socket.SOL_RFCOMM
@anchor{library/socket socket SOL_L2CAP}@anchor{39a0}
@deffnx {데이터} socket.SOL_L2CAP
@anchor{library/socket socket SOL_HCI}@anchor{39a1}
@deffnx {데이터} socket.SOL_HCI
@anchor{library/socket socket SOL_SCO}@anchor{39a2}
@deffnx {데이터} socket.SOL_SCO
@anchor{library/socket socket SOL_BLUETOOTH}@anchor{39a3}
@deffnx {데이터} socket.SOL_BLUETOOTH

Used in the level argument to the @ref{ed0,,setsockopt()} and
@ref{ecf,,getsockopt()} methods of Bluetooth socket objects.

@ref{39a3,,SOL_BLUETOOTH} is only available on Linux. Other constants
are available if the corresponding protocol is supported.
@end deffn

@geindex L2CAP_LM (socket 모듈)

@deffn {데이터} SO_L2CAP_*
@anchor{library/socket socket L2CAP_LM}@anchor{39a4}
@deffnx {데이터} socket.L2CAP_LM

@deffnx {데이터} L2CAP_LM_*

@deffnx {데이터} SO_RFCOMM_*

@deffnx {데이터} RFCOMM_LM_*

@deffnx {데이터} SO_SCO_*

@deffnx {데이터} SO_BTH_*

@deffnx {데이터} BT_*

Used in the option name and value argument to the @ref{ed0,,setsockopt()}
and @ref{ecf,,getsockopt()} methods of Bluetooth socket objects.

@code{BT_*} and @ref{39a4,,L2CAP_LM} are only available on Linux.
@code{SO_BTH_*} are only available on Windows.
Other constants may be available on Linux and various BSD platforms.


Added in version 3.14.

@end deffn

@geindex HCI_FILTER (socket 모듈)
@geindex HCI_TIME_STAMP (socket 모듈)
@geindex HCI_DATA_DIR (socket 모듈)
@geindex SO_HCI_EVT_FILTER (socket 모듈)
@geindex SO_HCI_PKT_FILTER (socket 모듈)
@anchor{library/socket socket HCI_FILTER}@anchor{39a5}
@deffn {데이터} socket.HCI_FILTER
@anchor{library/socket socket HCI_TIME_STAMP}@anchor{39a6}
@deffnx {데이터} socket.HCI_TIME_STAMP
@anchor{library/socket socket HCI_DATA_DIR}@anchor{39a7}
@deffnx {데이터} socket.HCI_DATA_DIR
@anchor{library/socket socket SO_HCI_EVT_FILTER}@anchor{39a8}
@deffnx {데이터} socket.SO_HCI_EVT_FILTER
@anchor{library/socket socket SO_HCI_PKT_FILTER}@anchor{39a9}
@deffnx {데이터} socket.SO_HCI_PKT_FILTER

Option names for use with @ref{281,,BTPROTO_HCI}.
Availability and format of the option values depend on platform.


버전 3.14에서 변경: Added @code{SO_HCI_EVT_FILTER} and @code{SO_HCI_PKT_FILTER}
on NetBSD and DragonFly BSD.
Added @code{HCI_DATA_DIR} on FreeBSD, NetBSD and DragonFly BSD.

@end deffn

@geindex HCI_DEV_NONE (socket 모듈)
@anchor{library/socket socket HCI_DEV_NONE}@anchor{39aa}
@deffn {데이터} socket.HCI_DEV_NONE

The @code{device_id} value used to create an HCI socket that isn’t specific
to a single Bluetooth adapter.

@ref{213c,,가용성}: Linux


Added in version 3.14.

@end deffn

@geindex HCI_CHANNEL_RAW (socket 모듈)
@geindex HCI_CHANNEL_USER (socket 모듈)
@geindex HCI_CHANNEL_MONITOR (socket 모듈)
@geindex HCI_CHANNEL_CONTROL (socket 모듈)
@geindex HCI_CHANNEL_LOGGING (socket 모듈)
@anchor{library/socket socket HCI_CHANNEL_RAW}@anchor{3984}
@deffn {데이터} socket.HCI_CHANNEL_RAW
@anchor{library/socket socket HCI_CHANNEL_USER}@anchor{39ab}
@deffnx {데이터} socket.HCI_CHANNEL_USER
@anchor{library/socket socket HCI_CHANNEL_MONITOR}@anchor{39ac}
@deffnx {데이터} socket.HCI_CHANNEL_MONITOR
@anchor{library/socket socket HCI_CHANNEL_CONTROL}@anchor{39ad}
@deffnx {데이터} socket.HCI_CHANNEL_CONTROL
@anchor{library/socket socket HCI_CHANNEL_LOGGING}@anchor{39ae}
@deffnx {데이터} socket.HCI_CHANNEL_LOGGING

Possible values for @code{channel} field in the @ref{281,,BTPROTO_HCI} address.

@ref{213c,,가용성}: Linux


Added in version 3.14.

@end deffn

@geindex AF_QIPCRTR (socket 모듈)
@anchor{library/socket socket AF_QIPCRTR}@anchor{3986}
@deffn {데이터} socket.AF_QIPCRTR

원격 프로세서를 제공하는 서비스와 통신하는 데 사용되는 Qualcomm의 IPC 라우터 프로토콜용 상수.

@ref{213c,,가용성}: Linux >= 4.7.
@end deffn

@geindex SCM_CREDS2 (socket 모듈)
@geindex LOCAL_CREDS (socket 모듈)
@geindex LOCAL_CREDS_PERSISTENT (socket 모듈)
@anchor{library/socket socket SCM_CREDS2}@anchor{39af}
@deffn {데이터} socket.SCM_CREDS2
@anchor{library/socket socket LOCAL_CREDS}@anchor{39b0}
@deffnx {데이터} socket.LOCAL_CREDS
@anchor{library/socket socket LOCAL_CREDS_PERSISTENT}@anchor{39b1}
@deffnx {데이터} socket.LOCAL_CREDS_PERSISTENT

LOCAL_CREDS and LOCAL_CREDS_PERSISTENT can be used
with SOCK_DGRAM, SOCK_STREAM sockets, equivalent to
Linux/DragonFlyBSD SO_PASSCRED, while LOCAL_CREDS
sends the credentials at first read, LOCAL_CREDS_PERSISTENT
sends for each read, SCM_CREDS2 must be then used for
the latter for the message type.


Added in version 3.11.


@ref{213c,,가용성}: FreeBSD.
@end deffn

@geindex SO_INCOMING_CPU (socket 모듈)
@anchor{library/socket socket SO_INCOMING_CPU}@anchor{39b2}
@deffn {데이터} socket.SO_INCOMING_CPU

Constant to optimize CPU locality, to be used in conjunction with
@code{SO_REUSEPORT}.


Added in version 3.11.


@ref{213c,,가용성}: Linux >= 3.9
@end deffn

@geindex SO_REUSEPORT_LB (socket 모듈)
@anchor{library/socket socket SO_REUSEPORT_LB}@anchor{18d5}
@deffn {데이터} socket.SO_REUSEPORT_LB

@quotation

Constant to enable duplicate address and port bindings with load balancing.
@end quotation


Added in version 3.14.


@ref{213c,,가용성}: FreeBSD >= 12.0
@end deffn

@geindex AF_HYPERV (socket 모듈)
@geindex HV_PROTOCOL_RAW (socket 모듈)
@geindex HVSOCKET_CONNECT_TIMEOUT (socket 모듈)
@geindex HVSOCKET_CONNECT_TIMEOUT_MAX (socket 모듈)
@geindex HVSOCKET_CONNECTED_SUSPEND (socket 모듈)
@geindex HVSOCKET_ADDRESS_FLAG_PASSTHRU (socket 모듈)
@geindex HV_GUID_ZERO (socket 모듈)
@geindex HV_GUID_WILDCARD (socket 모듈)
@geindex HV_GUID_BROADCAST (socket 모듈)
@geindex HV_GUID_CHILDREN (socket 모듈)
@geindex HV_GUID_LOOPBACK (socket 모듈)
@geindex HV_GUID_PARENT (socket 모듈)
@anchor{library/socket socket AF_HYPERV}@anchor{3987}
@deffn {데이터} socket.AF_HYPERV
@anchor{library/socket socket HV_PROTOCOL_RAW}@anchor{39b3}
@deffnx {데이터} socket.HV_PROTOCOL_RAW
@anchor{library/socket socket HVSOCKET_CONNECT_TIMEOUT}@anchor{39b4}
@deffnx {데이터} socket.HVSOCKET_CONNECT_TIMEOUT
@anchor{library/socket socket HVSOCKET_CONNECT_TIMEOUT_MAX}@anchor{39b5}
@deffnx {데이터} socket.HVSOCKET_CONNECT_TIMEOUT_MAX
@anchor{library/socket socket HVSOCKET_CONNECTED_SUSPEND}@anchor{39b6}
@deffnx {데이터} socket.HVSOCKET_CONNECTED_SUSPEND
@anchor{library/socket socket HVSOCKET_ADDRESS_FLAG_PASSTHRU}@anchor{39b7}
@deffnx {데이터} socket.HVSOCKET_ADDRESS_FLAG_PASSTHRU
@anchor{library/socket socket HV_GUID_ZERO}@anchor{39b8}
@deffnx {데이터} socket.HV_GUID_ZERO
@anchor{library/socket socket HV_GUID_WILDCARD}@anchor{39b9}
@deffnx {데이터} socket.HV_GUID_WILDCARD
@anchor{library/socket socket HV_GUID_BROADCAST}@anchor{39ba}
@deffnx {데이터} socket.HV_GUID_BROADCAST
@anchor{library/socket socket HV_GUID_CHILDREN}@anchor{39bb}
@deffnx {데이터} socket.HV_GUID_CHILDREN
@anchor{library/socket socket HV_GUID_LOOPBACK}@anchor{39bc}
@deffnx {데이터} socket.HV_GUID_LOOPBACK
@anchor{library/socket socket HV_GUID_PARENT}@anchor{39bd}
@deffnx {데이터} socket.HV_GUID_PARENT

Constants for Windows Hyper-V sockets for host/guest communications.

@ref{213c,,가용성}: Windows.


Added in version 3.12.

@end deffn

@geindex ETHERTYPE_ARP (socket 모듈)
@geindex ETHERTYPE_IP (socket 모듈)
@geindex ETHERTYPE_IPV6 (socket 모듈)
@geindex ETHERTYPE_VLAN (socket 모듈)
@anchor{library/socket socket-ethernet-types}@anchor{1b22}@anchor{library/socket socket ETHERTYPE_ARP}@anchor{39be}
@deffn {데이터} socket.ETHERTYPE_ARP
@anchor{library/socket socket ETHERTYPE_IP}@anchor{39bf}
@deffnx {데이터} socket.ETHERTYPE_IP
@anchor{library/socket socket ETHERTYPE_IPV6}@anchor{39c0}
@deffnx {데이터} socket.ETHERTYPE_IPV6
@anchor{library/socket socket ETHERTYPE_VLAN}@anchor{39c1}
@deffnx {데이터} socket.ETHERTYPE_VLAN

IEEE 802.3 protocol number@footnote{https://www.iana.org/assignments/ieee-802-numbers/ieee-802-numbers.txt}.
constants.

@ref{213c,,가용성}: Linux, FreeBSD, macOS.


Added in version 3.12.

@end deffn

@geindex SHUT_RD (socket 모듈)
@geindex SHUT_WR (socket 모듈)
@geindex SHUT_RDWR (socket 모듈)
@anchor{library/socket socket SHUT_RD}@anchor{39c2}
@deffn {데이터} socket.SHUT_RD
@anchor{library/socket socket SHUT_WR}@anchor{39c3}
@deffnx {데이터} socket.SHUT_WR
@anchor{library/socket socket SHUT_RDWR}@anchor{39c4}
@deffnx {데이터} socket.SHUT_RDWR

These constants are used by the @ref{39c5,,shutdown()} method of socket objects.

@ref{213c,,가용성}: not WASI.
@end deffn

@node 함수<7>,,상수<8>,모듈 내용<3>
@anchor{library/socket functions}@anchor{39c6}
@subsubsection 함수


@menu
* 소켓 만들기:: 
* 기타 함수: 기타 함수<2>. 

@end menu

@node 소켓 만들기,기타 함수<2>,,함수<7>
@anchor{library/socket creating-sockets}@anchor{39c7}
@subsubsection 소켓 만들기


다음 함수는 모두 @ref{39c8,,소켓 객체}를 만듭니다.

@geindex socket (socket 클래스)
@anchor{library/socket socket socket}@anchor{fa0}
@deffn {클래스} socket.socket (family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None)

지정된 주소 패밀리, 소켓 유형, 및 프로토콜 번호를 사용하여 새로운 소켓을 만듭니다. 주소 패밀리는 @ref{1bab,,AF_INET} (기본값), @ref{1bac,,AF_INET6}, @ref{1bae,,AF_UNIX}, @ref{397e,,AF_CAN}, @ref{3985,,AF_PACKET} 또는 @ref{3995,,AF_RDS} 여야 합니다. 소켓 유형은 @ref{14f8,,SOCK_STREAM} (기본값), @ref{14f7,,SOCK_DGRAM}, @ref{398e,,SOCK_RAW} 또는 기타 @code{SOCK_} 상수 중 하나여야 합니다. 프로토콜 번호는 일반적으로 0이며 생략될 수도 있고, 주소 패밀리가 @code{AF_CAN} 일 때 프로토콜은 @code{CAN_RAW}, @ref{11a2,,CAN_BCM}, @ref{397f,,CAN_ISOTP} 또는 @ref{b2c,,CAN_J1939} 중 하나여야 합니다.

If `fileno' is specified, the values for `family', `type', and `proto' are
auto-detected from the specified file descriptor.  Auto-detection can be
overruled by calling the function with explicit `family', `type', or `proto'
arguments.  This only affects how Python represents e.g. the return value
of @ref{3909,,socket.getpeername()} but not the actual OS resource.  Unlike
@ref{39c9,,socket.fromfd()}, `fileno' will return the same socket and not a
duplicate. This may help close a detached socket using
@ref{d69,,socket.close()}.

새로 만들어진 소켓은 @ref{10fb,,상속 불가능}합니다.

@code{self}, @code{family}, @code{type}, @code{protocol}를 인자로 @ref{1c6c,,감사 이벤트(auditing event)} @code{socket.__new__}를 발생시킵니다.


버전 3.3에서 변경: AF_CAN 패밀리가 추가되었습니다. AF_RDS 패밀리가 추가되었습니다.



버전 3.4에서 변경: CAN_BCM 프로토콜이 추가되었습니다.



버전 3.4에서 변경: 반환된 소켓은 이제 상속 불가능합니다.



버전 3.7에서 변경: CAN_ISOTP 프로토콜이 추가되었습니다.



버전 3.7에서 변경: When @ref{e03,,SOCK_NONBLOCK} or @ref{e04,,SOCK_CLOEXEC}
bit flags are applied to `type' they are cleared, and
@ref{e05,,socket.type} will not reflect them.  They are still passed
to the underlying system @code{socket()} call.  Therefore,

@example
sock = socket.socket(
    socket.AF_INET,
    socket.SOCK_STREAM | socket.SOCK_NONBLOCK)
@end example

는 여전히 @code{SOCK_NONBLOCK}를 지원하는 OS에서 비 블로킹 소켓을 만들지만, @code{sock.type}은 @code{socket.SOCK_STREAM}로 설정됩니다.



버전 3.9에서 변경: CAN_J1939 프로토콜이 추가되었습니다.



버전 3.10에서 변경: The IPPROTO_MPTCP protocol was added.

@end deffn

@geindex socketpair() (socket 모듈)
@anchor{library/socket socket socketpair}@anchor{def}
@deffn {함수} socket.socketpair ([family[, type[, proto]]])

Build a pair of connected socket objects using the given address family, socket
type, and protocol number.  Address family, socket type, and protocol number are
as for the @ref{fa0,,socket()} function. The default family is @ref{1bae,,AF_UNIX}
if defined on the platform; otherwise, the default is @ref{1bab,,AF_INET}.

새로 만들어진 소켓은 @ref{10fb,,상속 불가능}합니다.


버전 3.2에서 변경: 반환된 소켓 객체는 이제 부분 집합이 아닌 전체 소켓 API를 지원합니다.



버전 3.4에서 변경: 반환된 소켓은 이제 상속 불가능합니다.



버전 3.5에서 변경: 윈도우 지원이 추가되었습니다.

@end deffn

@geindex create_connection() (socket 모듈)
@anchor{library/socket socket create_connection}@anchor{881}
@deffn {함수} socket.create_connection (address, timeout=GLOBAL_DEFAULT, source_address=None, *, all_errors=False)

Connect to a TCP service listening on the internet `address' (a 2-tuple
@code{(host, port)}), and return the socket object.  This is a higher-level
function than @ref{fa2,,socket.connect()}: if `host' is a non-numeric hostname,
it will try to resolve it for both @ref{1bab,,AF_INET} and @ref{1bac,,AF_INET6},
and then try to connect to all possible addresses in turn until a
connection succeeds.  This makes it easy to write clients that are
compatible to both IPv4 and IPv6.

선택적 `timeout' 매개 변수를 전달하면 연결을 시도하기 전에 소켓 인스턴스의 시간제한을 설정합니다. `timeout'이 제공되지 않으면, @ref{39ca,,getdefaulttimeout()}에 의해 반환된 전역 기본 시간제한 설정이 사용됩니다.

제공되면, `source_address'는 연결하기 전에 소켓이 소스 주소로 바인드 할 2-튜플 @code{(host, port)} 여야 합니다. 호스트나 포트가 각각 ‘’ 나 0이면 OS 기본 동작이 사용됩니다.

When a connection cannot be created, an exception is raised. By default,
it is the exception from the last address in the list. If `all_errors'
is @code{True}, it is an @ref{4d3,,ExceptionGroup} containing the errors of all
attempts.


버전 3.2에서 변경: `source_address'가 추가되었습니다.



버전 3.11에서 변경: `all_errors' was added.

@end deffn

@geindex create_server() (socket 모듈)
@anchor{library/socket socket create_server}@anchor{c1f}
@deffn {함수} socket.create_server (address, *, family=AF_INET, backlog=None, reuse_port=False, dualstack_ipv6=False)

Convenience function which creates a TCP socket bound to `address' (a 2-tuple
@code{(host, port)}) and returns the socket object.

`family' should be either @ref{1bab,,AF_INET} or @ref{1bac,,AF_INET6}.
`backlog' is the queue size passed to @ref{105d,,socket.listen()}; if not specified
, a default reasonable value is chosen.
`reuse_port' dictates whether to set the @code{SO_REUSEPORT} socket option.

If `dualstack_ipv6' is true, `family' is @ref{1bac,,AF_INET6} and the platform
supports it the socket will be able to accept both IPv4 and IPv6 connections,
else it will raise @ref{2ec,,ValueError}. Most POSIX platforms and Windows are
supposed to support this functionality.
When this functionality is enabled the address returned by
@ref{3909,,socket.getpeername()} when an IPv4 connection occurs will be an IPv6
address represented as an IPv4-mapped IPv6 address.
If `dualstack_ipv6' is false it will explicitly disable this functionality
on platforms that enable it by default (e.g. Linux).
This parameter can be used in conjunction with @ref{c20,,has_dualstack_ipv6()}:

@example
import socket

addr = ("", 8080)  # all interfaces, port 8080
if socket.has_dualstack_ipv6():
    s = socket.create_server(addr, family=socket.AF_INET6, dualstack_ipv6=True)
else:
    s = socket.create_server(addr)
@end example

@cartouche
@quotation 참고 
POSIX 플랫폼에서 @code{SO_REUSEADDR} 소켓 옵션은 같은 `address'에 바인드 되었고 TIME_WAIT 상태로 남아 있던 이전 소켓을 즉시 재사용하기 위해 설정됩니다.
@end quotation
@end cartouche


Added in version 3.8.

@end deffn

@geindex has_dualstack_ipv6() (socket 모듈)
@anchor{library/socket socket has_dualstack_ipv6}@anchor{c20}
@deffn {함수} socket.has_dualstack_ipv6 ()

플랫폼이 IPv4와 IPv6 연결을 모두 처리할 수 있는 TCP 소켓을 만드는 것을 지원하면 @code{True}를 반환합니다.


Added in version 3.8.

@end deffn

@geindex fromfd() (socket 모듈)
@anchor{library/socket socket fromfd}@anchor{39c9}
@deffn {함수} socket.fromfd (fd, family, type, proto=0)

Duplicate the file descriptor `fd' (an integer as returned by a file object’s
@ref{17b4,,fileno()} method) and build a socket object from the result.  Address
family, socket type and protocol number are as for the @ref{fa0,,socket()} function.
The file descriptor should refer to a socket, but this is not checked —
subsequent operations on the object may fail if the file descriptor is invalid.
This function is rarely needed, but can be used to get or set socket options on
a socket passed to a program as standard input or output (such as a server
started by the Unix inet daemon).  The socket is assumed to be in blocking mode.

새로 만들어진 소켓은 @ref{10fb,,상속 불가능}합니다.


버전 3.4에서 변경: 반환된 소켓은 이제 상속 불가능합니다.

@end deffn

@geindex fromshare() (socket 모듈)
@anchor{library/socket socket fromshare}@anchor{e01}
@deffn {함수} socket.fromshare (data)

@ref{e00,,socket.share()} 메서드에서 얻은 데이터로 소켓의 인스턴스를 만듭니다. 소켓은 블로킹 모드로 간주합니다.

@ref{213c,,가용성}: Windows.


Added in version 3.3.

@end deffn

@geindex SocketType (socket 모듈)
@anchor{library/socket socket SocketType}@anchor{39cb}
@deffn {데이터} socket.SocketType

이것은 소켓 객체 형을 나타내는 파이썬 형 객체입니다. @code{type(socket(...))}과 같습니다.
@end deffn

@node 기타 함수<2>,,소켓 만들기,함수<7>
@anchor{library/socket other-functions}@anchor{39cc}
@subsubsection 기타 함수


The @code{socket} module also offers various network-related services:

@geindex close() (socket 모듈)
@anchor{library/socket socket close}@anchor{d69}
@deffn {함수} socket.close (fd)

Close a socket file descriptor. This is like @ref{d6a,,os.close()}, but for
sockets. On some platforms (most notably Windows) @code{os.close()}
does not work for socket file descriptors.


Added in version 3.7.

@end deffn

@geindex getaddrinfo() (socket 모듈)
@anchor{library/socket socket getaddrinfo}@anchor{176f}
@deffn {함수} socket.getaddrinfo (host, port, family=AF_UNSPEC, type=0, proto=0, flags=0)

This function wraps the C function @code{getaddrinfo} of the underlying system.

`host'/`port' 인자를 해당 서비스에 연결된 소켓을 만드는 데 필요한 모든 인자가 들어있는 5-튜플의 시퀀스로 변환합니다. `host'는 도메인 이름, IPv4/v6 주소의 문자열 표현 또는 @code{None}입니다. `port'는 @code{'http'}와 같은 문자열 서비스 이름, 숫자 포트 번호 또는 @code{None}입니다. @code{None}을 `host' 와 `port'의 값으로 전달해서, @code{NULL}을 하부 C API에 전달할 수 있습니다.

The `family', `type' and `proto' arguments can be optionally specified
in order to provide options and limit the list of addresses returned.
Pass their default values (@ref{38ca,,AF_UNSPEC}, 0, and 0, respectively)
to not limit the results. See the note below for details.

The `flags' argument can be one or several of the @code{AI_*} constants,
and will influence how results are computed and returned.
For example, @code{AI_NUMERICHOST} will disable domain name resolution
and will raise an error if `host' is a domain name.

이 함수는 다음과 같은 구조의 5-튜플의 리스트를 반환합니다:

@code{(family, type, proto, canonname, sockaddr)}

In these tuples, `family', `type', `proto' are all integers and are
meant to be passed to the @ref{fa0,,socket()} function.  `canonname' will be
a string representing the canonical name of the `host' if
@code{AI_CANONNAME} is part of the `flags' argument; else `canonname'
will be empty.  `sockaddr' is a tuple describing a socket address, whose
format depends on the returned `family' (a @code{(address, port)} 2-tuple for
@ref{1bab,,AF_INET}, a @code{(address, port, flowinfo, scope_id)} 4-tuple for
@ref{1bac,,AF_INET6}), and is meant to be passed to the @ref{fa2,,socket.connect()}
method.

@cartouche
@quotation 참고 
If you intend to use results from @code{getaddrinfo()} to create a socket
(rather than, for example, retrieve `canonname'),
consider limiting the results by `type' (e.g. @ref{14f8,,SOCK_STREAM} or
@ref{14f7,,SOCK_DGRAM}) and/or `proto' (e.g. @code{IPPROTO_TCP} or
@code{IPPROTO_UDP}) that your application can handle.

The behavior with default values of `family', `type', `proto'
and `flags' is system-specific.

Many systems (for example, most Linux configurations) will return a sorted
list of all matching addresses.
These addresses should generally be tried in order until a connection succeeds
(possibly tried in parallel, for example, using a Happy Eyeballs@footnote{https://en.wikipedia.org/wiki/Happy_Eyeballs} algorithm).
In these cases, limiting the `type' and/or `proto' can help eliminate
unsuccessful or unusable connection attempts.

Some systems will, however, only return a single address.
(For example, this was reported on Solaris and AIX configurations.)
On these systems, limiting the `type' and/or `proto' helps ensure that
this address is usable.
@end quotation
@end cartouche

@code{host}, @code{port}, @code{family}, @code{type}, @code{protocol}을 인자로 @ref{1c6c,,감사 이벤트(auditing event)} @code{socket.getaddrinfo}를 발생시킵니다.

다음 예제는 @code{example.org}의 포트 80으로 가는 가상의 TCP 연결에 대한 주소 정보를 가져옵니다 (IPv6가 활성화되지 않았으면 여러분의 시스템에서는 결과가 다를 수 있습니다):

@example
>>> socket.getaddrinfo("example.org", 80, proto=socket.IPPROTO_TCP)
[(socket.AF_INET6, socket.SOCK_STREAM,
 6, '@w{'}, ('2606:2800:220:1:248:1893:25c8:1946', 80, 0, 0)),
 (socket.AF_INET, socket.SOCK_STREAM,
 6, '@w{'}, ('93.184.216.34', 80))]
@end example


버전 3.2에서 변경: 매개 변수는 이제 키워드 인자를 사용하여 전달할 수 있습니다.



버전 3.7에서 변경: IPv6 멀티캐스트 주소의 경우, 주소를 나타내는 문자열에는 @code{%scope_id} 부분이 포함되지 않습니다.

@end deffn

@geindex getfqdn() (socket 모듈)
@anchor{library/socket socket getfqdn}@anchor{1aeb}
@deffn {함수} socket.getfqdn ([name])

Return a fully qualified domain name for `name'. If `name' is omitted or empty,
it is interpreted as the local host.  To find the fully qualified name, the
hostname returned by @ref{1c81,,gethostbyaddr()} is checked, followed by aliases for the
host, if available.  The first name which includes a period is selected.  In
case no fully qualified domain name is available and `name' was provided,
it is returned unchanged.  If `name' was empty or equal to @code{'0.0.0.0'},
the hostname from @ref{304d,,gethostname()} is returned.
@end deffn

@geindex gethostbyname() (socket 모듈)
@anchor{library/socket socket gethostbyname}@anchor{39cd}
@deffn {함수} socket.gethostbyname (hostname)

호스트 이름을 IPv4 주소 형식으로 변환합니다. IPv4 주소는 @code{'100.50.200.5'}와 같은 문자열로 반환됩니다. 호스트 이름이 IPv4 주소면 변경되지 않고 반환됩니다. 더욱 완전한 인터페이스는 @ref{1c82,,gethostbyname_ex()}를 참조하십시오. @ref{39cd,,gethostbyname()}는 IPv6 이름 결정을 지원하지 않으며, IPv4/v6 이중 스택 지원을 위해서는 대신 @ref{176f,,getaddrinfo()}를 사용해야 합니다.

@code{hostname}을 인자로 @ref{1c6c,,감사 이벤트(auditing event)} @code{socket.gethostbyname}을 발생시킵니다.

@ref{213c,,가용성}: not WASI.
@end deffn

@geindex gethostbyname_ex() (socket 모듈)
@anchor{library/socket socket gethostbyname_ex}@anchor{1c82}
@deffn {함수} socket.gethostbyname_ex (hostname)

Translate a host name to IPv4 address format, extended interface. Return a
3-tuple @code{(hostname, aliaslist, ipaddrlist)} where `hostname' is the host’s
primary host name, `aliaslist' is a (possibly
empty) list of alternative host names for the same address, and `ipaddrlist' is
a list of IPv4 addresses for the same interface on the same host (often but not
always a single address). @code{gethostbyname_ex()} does not support IPv6 name
resolution, and @ref{176f,,getaddrinfo()} should be used instead for IPv4/v6 dual
stack support.

@code{hostname}을 인자로 @ref{1c6c,,감사 이벤트(auditing event)} @code{socket.gethostbyname}을 발생시킵니다.

@ref{213c,,가용성}: not WASI.
@end deffn

@geindex gethostname() (socket 모듈)
@anchor{library/socket socket gethostname}@anchor{304d}
@deffn {함수} socket.gethostname ()

파이썬 인터프리터가 현재 실행 중인 기계의 호스트 명을 포함한 문자열을 반환합니다.

인자 없이 @ref{1c6c,,감사 이벤트(auditing event)} @code{socket.gethostname}을 발생시킵니다.

참고: @ref{304d,,gethostname()}은 항상 완전히 정규화된 도메인 이름을 반환하지는 않습니다; 원한다면 @ref{1aeb,,getfqdn()}을 사용하십시오.

@ref{213c,,가용성}: not WASI.
@end deffn

@geindex gethostbyaddr() (socket 모듈)
@anchor{library/socket socket gethostbyaddr}@anchor{1c81}
@deffn {함수} socket.gethostbyaddr (ip_address)

Return a 3-tuple @code{(hostname, aliaslist, ipaddrlist)} where `hostname' is the
primary host name responding to the given `ip_address', `aliaslist' is a
(possibly empty) list of alternative host names for the same address, and
`ipaddrlist' is a list of IPv4/v6 addresses for the same interface on the same
host (most likely containing only a single address). To find the fully qualified
domain name, use the function @ref{1aeb,,getfqdn()}. @code{gethostbyaddr()} supports
both IPv4 and IPv6.

@code{ip_address}를 인자로 @ref{1c6c,,감사 이벤트(auditing event)} @code{socket.gethostbyaddr}을 발생시킵니다.

@ref{213c,,가용성}: not WASI.
@end deffn

@geindex getnameinfo() (socket 모듈)
@anchor{library/socket socket getnameinfo}@anchor{1a3b}
@deffn {함수} socket.getnameinfo (sockaddr, flags)

Translate a socket address `sockaddr' into a 2-tuple @code{(host, port)}. Depending
on the settings of `flags', the result can contain a fully qualified domain name
or numeric address representation in `host'.  Similarly, `port' can contain a
string port name or a numeric port number.

IPv6 주소의 경우, `sockaddr'에 의미 있는 `scope_id'가 있으면 @code{%scope_id}를 host 부분에 덧붙입니다. 보통 이것은 멀티캐스트 주소에서 일어납니다.

`flags'에 대한 자세한 내용은 @code{getnameinfo(3)@footnote{https://manpages.debian.org/getnameinfo(3)}}을 참조하십시오.

@code{sockaddr}을 인자로 @ref{1c6c,,감사 이벤트(auditing event)} @code{socket.getnameinfo}를 발생시킵니다.

@ref{213c,,가용성}: not WASI.
@end deffn

@geindex getprotobyname() (socket 모듈)
@anchor{library/socket socket getprotobyname}@anchor{39ce}
@deffn {함수} socket.getprotobyname (protocolname)

Translate an internet protocol name (for example, @code{'icmp'}) to a constant
suitable for passing as the (optional) third argument to the @ref{fa0,,socket()}
function.  This is usually only needed for sockets opened in “raw” mode
(@ref{398e,,SOCK_RAW}); for the normal socket modes, the correct protocol is chosen
automatically if the protocol is omitted or zero.

@ref{213c,,가용성}: not WASI.
@end deffn

@geindex getservbyname() (socket 모듈)
@anchor{library/socket socket getservbyname}@anchor{39cf}
@deffn {함수} socket.getservbyname (servicename[, protocolname])

Translate an internet service name and protocol name to a port number for that
service.  The optional protocol name, if given, should be @code{'tcp'} or
@code{'udp'}, otherwise any protocol will match.

@code{servicename}, @code{protocolname}을 인자로 @ref{1c6c,,감사 이벤트(auditing event)} @code{socket.getservbyname}을 발생시킵니다.

@ref{213c,,가용성}: not WASI.
@end deffn

@geindex getservbyport() (socket 모듈)
@anchor{library/socket socket getservbyport}@anchor{39d0}
@deffn {함수} socket.getservbyport (port[, protocolname])

Translate an internet port number and protocol name to a service name for that
service.  The optional protocol name, if given, should be @code{'tcp'} or
@code{'udp'}, otherwise any protocol will match.

@code{port}, @code{protocolname}을 인자로 @ref{1c6c,,감사 이벤트(auditing event)} @code{socket.getservbyport}를 발생시킵니다.

@ref{213c,,가용성}: not WASI.
@end deffn

@geindex ntohl() (socket 모듈)
@anchor{library/socket socket ntohl}@anchor{39d1}
@deffn {함수} socket.ntohl (x)

32비트 양의 정수를 네트워크 바이트 순서에서 호스트 바이트 순서로 변환합니다. 호스트 바이트 순서가 네트워크 바이트 순서와 같은 시스템에서, 이것은 아무 일도 하지 않습니다; 그렇지 않으면, 4바이트 스와프 연산을 수행합니다.
@end deffn

@geindex ntohs() (socket 모듈)
@anchor{library/socket socket ntohs}@anchor{a80}
@deffn {함수} socket.ntohs (x)

16비트 양의 정수를 네트워크 바이트 순서에서 호스트 바이트 순서로 변환합니다. 호스트 바이트 순서가 네트워크 바이트 순서와 같은 시스템에서, 이것은 아무 일도 하지 않습니다; 그렇지 않으면, 2바이트 스와프 연산을 수행합니다.


버전 3.10에서 변경: Raises @ref{a81,,OverflowError} if `x' does not fit in a 16-bit unsigned
integer.

@end deffn

@geindex htonl() (socket 모듈)
@anchor{library/socket socket htonl}@anchor{39d2}
@deffn {함수} socket.htonl (x)

32비트 양의 정수를 호스트 바이트 순서에서 네트워크 바이트 순서로 변환합니다. 호스트 바이트 순서가 네트워크 바이트 순서와 같은 시스템에서, 이것은 아무 일도 하지 않습니다; 그렇지 않으면, 4바이트 스와프 연산을 수행합니다.
@end deffn

@geindex htons() (socket 모듈)
@anchor{library/socket socket htons}@anchor{a7f}
@deffn {함수} socket.htons (x)

16비트 양의 정수를 호스트 바이트 순서에서 네트워크 바이트 순서로 변환합니다. 호스트 바이트 순서가 네트워크 바이트 순서와 같은 시스템에서, 이것은 아무 일도 하지 않습니다; 그렇지 않으면, 2바이트 스와프 연산을 수행합니다.


버전 3.10에서 변경: Raises @ref{a81,,OverflowError} if `x' does not fit in a 16-bit unsigned
integer.

@end deffn

@geindex inet_aton() (socket 모듈)
@anchor{library/socket socket inet_aton}@anchor{b5a}
@deffn {함수} socket.inet_aton (ip_string)

Convert an IPv4 address from dotted-quad string format (for example,
‘123.45.67.89’) to 32-bit packed binary format, as a bytes object four characters in
length.  This is useful when conversing with a program that uses the standard C
library and needs objects of type @code{in_addr}, which is the C type
for the 32-bit packed binary this function returns.

@ref{b5a,,inet_aton()}는 3점 미만의 문자열도 허용합니다; 자세한 내용은 유닉스 매뉴얼 페이지 @code{inet(3)@footnote{https://manpages.debian.org/inet(3)}}을 참조하십시오.

이 함수에 전달된 IPv4 주소 문자열이 유효하지 않으면, @ref{2c0,,OSError}가 발생합니다. 정확히 무엇이 유효한지는 @code{inet_aton()}의 하부 C 구현에 따라 달라짐에 유의하십시오.

@ref{b5a,,inet_aton()}은 IPv6를 지원하지 않으며, IPv4/v6 이중 스택 지원을 위해서는 대신 @ref{b5b,,inet_pton()}를 사용해야 합니다.
@end deffn

@geindex inet_ntoa() (socket 모듈)
@anchor{library/socket socket inet_ntoa}@anchor{39d3}
@deffn {함수} socket.inet_ntoa (packed_ip)

Convert a 32-bit packed IPv4 address (a @ref{193,,bytes-like object} four
bytes in length) to its standard dotted-quad string representation (for example,
‘123.45.67.89’).  This is useful when conversing with a program that uses the
standard C library and needs objects of type @code{in_addr}, which
is the C type for the 32-bit packed binary data this function takes as an
argument.

이 함수에 전달된 바이트 시퀀스가 정확히 4바이트 길이가 아니면, @ref{2c0,,OSError}가 발생합니다. @ref{39d3,,inet_ntoa()}는 IPv6를 지원하지 않으며, IPv4/v6 이중 스택 지원을 위해서는 대신 @ref{11a4,,inet_ntop()}를 사용해야 합니다.


버전 3.5에서 변경: 이제 쓰기 가능한 @ref{193,,바이트열류 객체}를 받아들입니다.

@end deffn

@geindex inet_pton() (socket 모듈)
@anchor{library/socket socket inet_pton}@anchor{b5b}
@deffn {함수} socket.inet_pton (address_family, ip_string)

Convert an IP address from its family-specific string format to a packed,
binary format. @code{inet_pton()} is useful when a library or network protocol
calls for an object of type @code{in_addr} (similar to
@ref{b5a,,inet_aton()}) or @code{in6_addr}.

`address_family'에 대해 지원되는 값은 현재 @ref{1bab,,AF_INET}과 @ref{1bac,,AF_INET6}입니다. IP 주소 문자열 `ip_string'가 유효하지 않으면, @ref{2c0,,OSError}가 발생합니다. 정확히 무엇이 유효한지는 `address_family'의 값과 @code{inet_pton()}의 하부 구현에 따라 달라집니다.

@ref{213c,,가용성}: Unix, Windows.


버전 3.4에서 변경: 윈도우 지원이 추가되었습니다

@end deffn

@geindex inet_ntop() (socket 모듈)
@anchor{library/socket socket inet_ntop}@anchor{11a4}
@deffn {함수} socket.inet_ntop (address_family, packed_ip)

Convert a packed IP address (a @ref{193,,bytes-like object} of some number of
bytes) to its standard, family-specific string representation (for
example, @code{'7.10.0.5'} or @code{'5aef:2b::8'}).
@ref{11a4,,inet_ntop()} is useful when a library or network protocol returns an
object of type @code{in_addr} (similar to @ref{39d3,,inet_ntoa()}) or
@code{in6_addr}.

`address_family'에 대해 지원되는 값은 현재 @ref{1bab,,AF_INET}과 @ref{1bac,,AF_INET6}입니다. 바이트열 객체 `packed_ip'가 지정된 주소 패밀리의 올바른 길이가 아니면, @ref{2ec,,ValueError}가 발생합니다. @ref{11a4,,inet_ntop()} 호출로 인한 에러에는 @ref{2c0,,OSError}가 발생합니다.

@ref{213c,,가용성}: Unix, Windows.


버전 3.4에서 변경: 윈도우 지원이 추가되었습니다



버전 3.5에서 변경: 이제 쓰기 가능한 @ref{193,,바이트열류 객체}를 받아들입니다.

@end deffn

@c XXX: Are sendmsg(), recvmsg() and CMSG_*() available on any
@c non-Unix platforms?  The old (obsolete?) 4.2BSD form of the
@c interface, in which struct msghdr has no msg_control or
@c msg_controllen members, is not currently supported.

@geindex CMSG_LEN() (socket 모듈)
@anchor{library/socket socket CMSG_LEN}@anchor{1e14}
@deffn {함수} socket.CMSG_LEN (length)

주어진 `length'의 연관된 데이터가 있는 보조(ancillary) 데이터 항목의 (후행 패딩을 제외한) 총 길이를 반환합니다. 이 값은 @ref{fa5,,recvmsg()}가 보조 데이터의 단일 항목을 수신하기 위한 버퍼 크기로 종종 사용될 수 있지만, 
@geindex RFC; RFC 3542
RFC 3542@footnote{https://datatracker.ietf.org/doc/html/rfc3542.html}는 이식성 있는 응용 프로그램에서 @ref{1e13,,CMSG_SPACE()}를 사용하도록 요구하는데, 항목이 버퍼의 마지막 부분일 때도 패딩을 위한 공간을 포함합니다. `length'가 허용되는 값 범위를 벗어나면 @ref{a81,,OverflowError}를 발생시킵니다.

@ref{213c,,가용성}: Unix, not WASI.

Most Unix platforms.


Added in version 3.3.

@end deffn

@geindex CMSG_SPACE() (socket 모듈)
@anchor{library/socket socket CMSG_SPACE}@anchor{1e13}
@deffn {함수} socket.CMSG_SPACE (length)

주어진 `length'의 연관된 데이터가 있는 보조(ancillary) 데이터 항목을 수신하기 위해 @ref{fa5,,recvmsg()}에 필요한 버퍼 크기를 반환하는데, 후행 패딩을 포함합니다. 여러 항목을 수신하는 데 필요한 버퍼 공간은 연관된 데이터 길이에 대한 @ref{1e13,,CMSG_SPACE()} 값의 합입니다. `length'가 허용되는 값 범위를 벗어나면 @ref{a81,,OverflowError}를 발생시킵니다.

일부 시스템에서는 이 함수를 제공하지 않으면서 보조(ancillary) 데이터를 지원할 수 있음에 유의하십시오. 또한, 이 함수의 결과를 사용하여 버퍼 크기를 설정하면 수신할 수 있는 보조 데이터의 양이 정확하게 제한되지 않을 수 있음에도 유의하십시오. 추가 데이터가 패딩 영역에 들어갈 수 있기 때문입니다.

@ref{213c,,가용성}: Unix, not WASI.

most Unix platforms.


Added in version 3.3.

@end deffn

@geindex getdefaulttimeout() (socket 모듈)
@anchor{library/socket socket getdefaulttimeout}@anchor{39ca}
@deffn {함수} socket.getdefaulttimeout ()

새로운 소켓 객체의 기본 시간제한을 초 단위로 (float) 반환합니다. @code{None} 값은 새 소켓 객체가 시간제한이 없음을 나타냅니다. 소켓 모듈을 처음 임포트 할 때 기본값은 @code{None}입니다.
@end deffn

@geindex setdefaulttimeout() (socket 모듈)
@anchor{library/socket socket setdefaulttimeout}@anchor{398c}
@deffn {함수} socket.setdefaulttimeout (timeout)

새 소켓 객체의 기본 시간제한을 초 단위로 (float) 설정합니다. 소켓 모듈을 처음 임포트 할 때 기본값은 @code{None}입니다. 가능한 값과 해당 의미는 @ref{3988,,settimeout()}을 참조하십시오.
@end deffn

@geindex sethostname() (socket 모듈)
@anchor{library/socket socket sethostname}@anchor{1340}
@deffn {함수} socket.sethostname (name)

기계의 호스트 명을 `name'으로 설정합니다. 충분한 권한이 없으면 @ref{2c0,,OSError}가 발생합니다.

@code{name}을 인자로 @ref{1c6c,,감사 이벤트(auditing event)} @code{socket.sethostname}을 발생시킵니다.

@ref{213c,,가용성}: Unix, not Android.


Added in version 3.3.

@end deffn

@geindex if_nameindex() (socket 모듈)
@anchor{library/socket socket if_nameindex}@anchor{c21}
@deffn {함수} socket.if_nameindex ()

네트워크 인터페이스 정보 (인덱스 정수, 이름 문자열) 튜플의 리스트를 반환합니다. 시스템 호출이 실패하면 @ref{2c0,,OSError}.

@ref{213c,,가용성}: Unix, Windows, not WASI.


Added in version 3.3.



버전 3.8에서 변경: 윈도우 지원이 추가되었습니다.


@cartouche
@quotation 참고 
윈도우에서 네트워크 인터페이스는 다른 문맥에서 다른 이름을 갖습니다 (모든 이름은 예입니다):


@itemize *

@item 
UUID: @code{@{FB605B73-AAC2-49A6-9A2F-25416AEA0573@}}

@item 
이름: @code{ethernet_32770}

@item 
친숙한 이름: @code{vEthernet (nat)}

@item 
설명: @code{Hyper-V Virtual Ethernet Adapter}
@end itemize

이 함수는 목록에서 두 번째 형식의 이름을 반환합니다, 이 예의 경우 @code{ethernet_32770}.
@end quotation
@end cartouche
@end deffn

@geindex if_nametoindex() (socket 모듈)
@anchor{library/socket socket if_nametoindex}@anchor{c22}
@deffn {함수} socket.if_nametoindex (if_name)

인터페이스 이름에 대응하는 네트워크 인터페이스 인덱스 번호를 반환합니다. 주어진 이름을 가진 인터페이스가 없으면 @ref{2c0,,OSError}.

@ref{213c,,가용성}: Unix, Windows, not WASI.


Added in version 3.3.



버전 3.8에서 변경: 윈도우 지원이 추가되었습니다.



@subsubheading 더 보기


“인터페이스 이름”은 @ref{c21,,if_nameindex()}에 설명된 이름입니다.

@end deffn

@geindex if_indextoname() (socket 모듈)
@anchor{library/socket socket if_indextoname}@anchor{c23}
@deffn {함수} socket.if_indextoname (if_index)

인터페이스 인덱스 번호에 해당하는 네트워크 인터페이스 이름을 반환합니다. 지정된 인덱스의 인터페이스가 없으면 @ref{2c0,,OSError}.

@ref{213c,,가용성}: Unix, Windows, not WASI.


Added in version 3.3.



버전 3.8에서 변경: 윈도우 지원이 추가되었습니다.



@subsubheading 더 보기


“인터페이스 이름”은 @ref{c21,,if_nameindex()}에 설명된 이름입니다.

@end deffn

@geindex send_fds() (socket 모듈)
@anchor{library/socket socket send_fds}@anchor{b2d}
@deffn {함수} socket.send_fds (sock, buffers, fds[, flags[, address]])

Send the list of file descriptors `fds' over an @ref{1bae,,AF_UNIX} socket `sock'.
The `fds' parameter is a sequence of file descriptors.
Consult @ref{6a0,,sendmsg()} for the documentation of these parameters.

@ref{213c,,가용성}: Unix, not WASI.

Unix platforms supporting @ref{6a0,,sendmsg()}
and @code{SCM_RIGHTS} mechanism.


Added in version 3.9.

@end deffn

@geindex recv_fds() (socket 모듈)
@anchor{library/socket socket recv_fds}@anchor{b2e}
@deffn {함수} socket.recv_fds (sock, bufsize, maxfds[, flags])

Receive up to `maxfds' file descriptors from an @ref{1bae,,AF_UNIX} socket `sock'.
Return @code{(msg, list(fds), flags, addr)}.
Consult @ref{fa5,,recvmsg()} for the documentation of these parameters.

@ref{213c,,가용성}: Unix, not WASI.

Unix platforms supporting @ref{fa5,,recvmsg()}
and @code{SCM_RIGHTS} mechanism.


Added in version 3.9.


@cartouche
@quotation 참고 
파일 기술자 리스트 끝에 있는 모든 잘린 정수.
@end quotation
@end cartouche
@end deffn

@node 소켓 객체,소켓 시간제한에 대한 참고 사항,모듈 내용<3>,socket — Low-level networking interface
@anchor{library/socket id1}@anchor{39d4}@anchor{library/socket socket-objects}@anchor{39c8}
@subsubsection 소켓 객체


소켓 객체에는 다음과 같은 메서드가 있습니다. @ref{13a4,,makefile()}를 제외하고, 이것들은 소켓에 적용할 수 있는 유닉스 시스템 호출에 해당합니다.


버전 3.2에서 변경: @ref{1e1,,컨텍스트 관리자} 프로토콜 지원이 추가되었습니다. 컨텍스트 관리자를 빠져나가는 것은 @ref{d69,,close()}를 호출하는 것과 동등합니다.


@geindex accept() (socket.socket 메서드)
@anchor{library/socket socket socket accept}@anchor{fa1}
@deffn {메서드} socket.accept ()

연결을 받아들입니다. 소켓은 주소에 바인드되어 연결을 리스닝하고 있어야 합니다. 반환 값은 @code{(conn, address)} 쌍입니다. 여기서 `conn'는 연결에서 데이터를 보내고 받을 수 있는 `새로운' 소켓 객체이고, `address'는 연결의 다른 끝에 있는 소켓에 바인드 된 주소입니다.

새로 만들어진 소켓은 @ref{10fb,,상속 불가능}합니다.


버전 3.4에서 변경: 소켓은 이제 상속 불가능합니다.



버전 3.5에서 변경: 시스템 호출이 인터럽트 되고 시그널 처리기가 예외를 발생시키지 않으면, 메서드는 이제 @ref{f87,,InterruptedError} 예외를 발생시키는 대신 시스템 호출을 재시도합니다 (이유는 
@geindex Python 향상 제안; PEP 475
PEP 475@footnote{https://peps.python.org/pep-0475/}를 참조하십시오).

@end deffn

@geindex bind() (socket.socket 메서드)
@anchor{library/socket socket socket bind}@anchor{173f}
@deffn {메서드} socket.bind (address)

Bind the socket to `address'.  The socket must not already be bound. The format
of `address' depends on the address family — see @ref{397b,,소켓 패밀리}.

@code{self}, @code{address}을 인자로 @ref{1c6c,,감사 이벤트(auditing event)} @code{socket.bind}를 발생시킵니다.

@ref{213c,,가용성}: not WASI.
@end deffn

@geindex close() (socket.socket 메서드)
@anchor{library/socket socket socket close}@anchor{f3e}
@deffn {메서드} socket.close ()

Mark the socket closed.  The underlying system resource (e.g. a file
descriptor) is also closed when all file objects from @ref{13a4,,makefile()}
are closed.  Once that happens, all future operations on the socket
object will fail. The remote end will receive no more data (after
queued data is flushed).

소켓은 가비지 수집될 때 자동으로 닫히지만, 명시적으로 @ref{d69,,close()}하거나 @ref{186,,with} 문을 사용하는 것이 좋습니다.


버전 3.6에서 변경: 하부 @code{close()} 호출이 수행될 때 에러가 발생하면 이제 @ref{2c0,,OSError}가 발생합니다.


@cartouche
@quotation 참고 
@code{close()} releases the resource associated with a connection but
does not necessarily close the connection immediately.  If you want
to close the connection in a timely fashion, call @ref{39c5,,shutdown()}
before @code{close()}.
@end quotation
@end cartouche
@end deffn

@geindex connect() (socket.socket 메서드)
@anchor{library/socket socket socket connect}@anchor{fa2}
@deffn {메서드} socket.connect (address)

Connect to a remote socket at `address'. The format of `address' depends on the
address family — see @ref{397b,,소켓 패밀리}.

If the connection is interrupted by a signal, the method waits until the
connection completes, or raises a @ref{a36,,TimeoutError} on timeout, if the
signal handler doesn’t raise an exception and the socket is blocking or has
a timeout. For non-blocking sockets, the method raises an
@ref{f87,,InterruptedError} exception if the connection is interrupted by a
signal (or the exception raised by the signal handler).

@code{self}, @code{address}를 인자로 @ref{1c6c,,감사 이벤트(auditing event)} @code{socket.connect}를 발생시킵니다.


버전 3.5에서 변경: 연결이 시그널에 의해 인터럽트 되고, 시그널 처리기가 예외를 발생시키지 않고, 소켓이 블로킹하거나 시간제한을 가지면, 이 메서드는 이제 @ref{f87,,InterruptedError} 예외를 발생시키는 대신 연결이 완료될 때까지 대기합니다 (이유는 
@geindex Python 향상 제안; PEP 475
PEP 475@footnote{https://peps.python.org/pep-0475/}를 참조하십시오).


@ref{213c,,가용성}: not WASI.
@end deffn

@geindex connect_ex() (socket.socket 메서드)
@anchor{library/socket socket socket connect_ex}@anchor{173e}
@deffn {메서드} socket.connect_ex (address)

@code{connect(address)}와 비슷하지만, C 수준의 @code{connect()} 호출로 반환된 에러에 대한 예외를 발생시키는 대신 에러 표시기를 반환합니다 (“호스트를 찾을 수 없음”과 같은 다른 문제는 여전히 예외를 발생시킬 수 있습니다). 연산이 성공하면 에러 표시기는 @code{0}이고, 그렇지 않으면 @code{errno} 변수의 값입니다. 예를 들어 비동기 연결을 지원하는 데 유용합니다.

@code{self}, @code{address}를 인자로 @ref{1c6c,,감사 이벤트(auditing event)} @code{socket.connect}를 발생시킵니다.

@ref{213c,,가용성}: not WASI.
@end deffn

@geindex detach() (socket.socket 메서드)
@anchor{library/socket socket socket detach}@anchor{1421}
@deffn {메서드} socket.detach ()

하부 파일 기술자를 실제로 닫지 않으면서 소켓 객체를 닫힌 상태로 만듭니다. 파일 기술자가 반환되고, 다른 용도로 재사용 될 수 있습니다.


Added in version 3.2.

@end deffn

@geindex dup() (socket.socket 메서드)
@anchor{library/socket socket socket dup}@anchor{39d5}
@deffn {메서드} socket.dup ()

소켓을 복제합니다.

새로 만들어진 소켓은 @ref{10fb,,상속 불가능}합니다.


버전 3.4에서 변경: 소켓은 이제 상속 불가능합니다.


@ref{213c,,가용성}: not WASI.
@end deffn

@geindex fileno() (socket.socket 메서드)
@anchor{library/socket socket socket fileno}@anchor{39d6}
@deffn {메서드} socket.fileno ()

소켓의 파일 기술자(작은 정수)를 반환하거나, 실패하면 -1을 반환합니다. 이것은 @ref{f9f,,select.select()}에서 유용합니다.

윈도우에서, 이 메서드가 돌려주는 작은 정수는 파일 기술자를 사용할 수 있는 곳(가령 @ref{237d,,os.fdopen()})에 사용할 수 없습니다. 유닉스에는 이러한 제한이 없습니다.
@end deffn

@geindex get_inheritable() (socket.socket 메서드)
@anchor{library/socket socket socket get_inheritable}@anchor{1100}
@deffn {메서드} socket.get_inheritable ()

소켓의 파일 기술자나 소켓 핸들의 @ref{10fb,,상속 가능 플래그}를 가져옵니다: 소켓이 자식 프로세스에서 상속될 수 있으면 @code{True}, 그렇지 않으면 @code{False}.


Added in version 3.4.

@end deffn

@geindex getpeername() (socket.socket 메서드)
@anchor{library/socket socket socket getpeername}@anchor{3909}
@deffn {메서드} socket.getpeername ()

Return the remote address to which the socket is connected.  This is useful to
find out the port number of a remote IPv4/v6 socket, for instance. The format
of the address returned depends on the address family — see @ref{397b,,소켓 패밀리}.
On some systems this function is not supported.
@end deffn

@geindex getsockname() (socket.socket 메서드)
@anchor{library/socket socket socket getsockname}@anchor{284}
@deffn {메서드} socket.getsockname ()

Return the socket’s own address.  This is useful to find out the port number of
an IPv4/v6 socket, for instance. The format of the address returned depends on
the address family — see @ref{397b,,소켓 패밀리}.
@end deffn

@geindex getsockopt() (socket.socket 메서드)
@anchor{library/socket socket socket getsockopt}@anchor{ecf}
@deffn {메서드} socket.getsockopt (level, optname[, buflen])

Return the value of the given socket option (see the Unix man page
@code{getsockopt(2)@footnote{https://manpages.debian.org/getsockopt(2)}}).  The needed symbolic constants (@ref{d6b,,SO_* etc.})
are defined in this module.  If `buflen' is absent, an integer option is assumed
and its integer value is returned by the function.  If `buflen' is present, it
specifies the maximum length of the buffer used to receive the option in, and
this buffer is returned as a bytes object.  It is up to the caller to decode the
contents of the buffer (see the optional built-in module @ref{db,,struct} for a way
to decode C structures encoded as byte strings).

@ref{213c,,가용성}: not WASI.
@end deffn

@geindex getblocking() (socket.socket 메서드)
@anchor{library/socket socket socket getblocking}@anchor{d68}
@deffn {메서드} socket.getblocking ()

소켓이 블로킹 모드면 @code{True}를 반환하고, 비 블로킹이면 @code{False}를 반환합니다.

This is equivalent to checking @code{socket.gettimeout() != 0}.


Added in version 3.7.

@end deffn

@geindex gettimeout() (socket.socket 메서드)
@anchor{library/socket socket socket gettimeout}@anchor{39d7}
@deffn {메서드} socket.gettimeout ()

소켓 연산에 관련한 시간제한을 초(float)로 돌려줍니다. 시간제한이 설정되어 있지 않으면 @code{None}를 돌려줍니다. 이것은 @ref{3063,,setblocking()} 이나 @ref{3988,,settimeout()}에 대한 마지막 호출을 반영합니다.
@end deffn

@geindex ioctl() (socket.socket 메서드)
@anchor{library/socket socket socket ioctl}@anchor{ecd}
@deffn {메서드} socket.ioctl (control, option)

@ref{ecd,,ioctl()} 메서드는 WSAIoctl 시스템 인터페이스에 대한 제한된 인터페이스입니다. 자세한 내용은 Win32 설명서@footnote{https://msdn.microsoft.com/en-us/library/ms741621%28VS.85%29.aspx}를 참조하십시오.

다른 플랫폼에서는, 범용 @ref{1854,,fcntl.fcntl()} 과 @ref{1680,,fcntl.ioctl()} 함수를 사용할 수 있습니다; 첫 번째 인자로 소켓 객체를 받아들입니다.

현재 다음 제어 코드만 지원됩니다: @code{SIO_RCVALL}, @code{SIO_KEEPALIVE_VALS} 및 @code{SIO_LOOPBACK_FAST_PATH}.

@ref{213c,,가용성}: Windows


버전 3.6에서 변경: @code{SIO_LOOPBACK_FAST_PATH}가 추가되었습니다.

@end deffn

@geindex listen() (socket.socket 메서드)
@anchor{library/socket socket socket listen}@anchor{105d}
@deffn {메서드} socket.listen ([backlog])

서버가 연결을 수락하도록 합니다. `backlog'가 지정되면, 0 이상이어야 합니다 (더 낮으면 0으로 설정됩니다); 새로운 연결을 거부하기 전에 시스템이 허락할 수락되지 않은 연결 수를 지정합니다. 지정하지 않으면, 기본값으로 적당한 값이 선택됩니다.

@ref{213c,,가용성}: not WASI.


버전 3.5에서 변경: 이제 `backlog' 매개 변수가 선택적입니다.

@end deffn

@geindex makefile() (socket.socket 메서드)
@anchor{library/socket socket socket makefile}@anchor{13a4}
@deffn {메서드} socket.makefile (mode='r', buffering=None, *, encoding=None, errors=None, newline=None)

@geindex I/O control;buffering

Return a @ref{13c8,,file object} associated with the socket.  The exact returned
type depends on the arguments given to @ref{13a4,,makefile()}.  These arguments are
interpreted the same way as by the built-in @ref{316,,open()} function, except
the only supported `mode' values are @code{'r'} (default), @code{'w'}, @code{'b'}, or
a combination of those.

소켓은 블로킹 모드 여야 합니다; 시간제한을 가질 수 있지만, 시간 초과가 발생하면 파일 객체의 내부 버퍼가 일관성없는 상태로 끝날 수 있습니다.

@ref{13a4,,makefile()}에 의해 반환된 파일 객체를 닫는 것은, 다른 모든 파일 객체가 닫혔고 소켓 객체에서 @ref{d69,,socket.close()}가 호출되었지 않은 한 원래 소켓을 닫지는 않습니다.

@cartouche
@quotation 참고 
윈도우에서, @ref{13a4,,makefile()}로 만든 파일류 객체는 파일 기술자가 있는 파일 객체가 필요한 곳에서는 사용할 수 없습니다, 가령 @ref{4b8,,subprocess.Popen()}의 stream 인자.
@end quotation
@end cartouche
@end deffn

@geindex recv() (socket.socket 메서드)
@anchor{library/socket socket socket recv}@anchor{fa3}
@deffn {메서드} socket.recv (bufsize[, flags])

Receive data from the socket.  The return value is a bytes object representing the
data received.  The maximum amount of data to be received at once is specified
by `bufsize'. A returned empty bytes object indicates that the client has disconnected.
See the Unix manual page @code{recv(2)@footnote{https://manpages.debian.org/recv(2)}} for the meaning of the optional argument
`flags'; it defaults to zero.


버전 3.5에서 변경: 시스템 호출이 인터럽트 되고 시그널 처리기가 예외를 발생시키지 않으면, 메서드는 이제 @ref{f87,,InterruptedError} 예외를 발생시키는 대신 시스템 호출을 재시도합니다 (이유는 
@geindex Python 향상 제안; PEP 475
PEP 475@footnote{https://peps.python.org/pep-0475/}를 참조하십시오).

@end deffn

@geindex recvfrom() (socket.socket 메서드)
@anchor{library/socket socket socket recvfrom}@anchor{fa4}
@deffn {메서드} socket.recvfrom (bufsize[, flags])

Receive data from the socket.  The return value is a pair @code{(bytes, address)}
where `bytes' is a bytes object representing the data received and `address' is the
address of the socket sending the data.  See the Unix manual page
@code{recv(2)@footnote{https://manpages.debian.org/recv(2)}} for the meaning of the optional argument `flags'; it defaults
to zero. The format of `address' depends on the address family — see
@ref{397b,,소켓 패밀리}.


버전 3.5에서 변경: 시스템 호출이 인터럽트 되고 시그널 처리기가 예외를 발생시키지 않으면, 메서드는 이제 @ref{f87,,InterruptedError} 예외를 발생시키는 대신 시스템 호출을 재시도합니다 (이유는 
@geindex Python 향상 제안; PEP 475
PEP 475@footnote{https://peps.python.org/pep-0475/}를 참조하십시오).



버전 3.7에서 변경: 멀티캐스트 IPv6 주소의 경우, `address'의 첫 번째 항목에는 @code{%scope_id} 부분이 더는 포함되지 않습니다. 전체 IPv6 주소를 얻으려면 @ref{1a3b,,getnameinfo()}를 사용하십시오.

@end deffn

@geindex recvmsg() (socket.socket 메서드)
@anchor{library/socket socket socket recvmsg}@anchor{fa5}
@deffn {메서드} socket.recvmsg (bufsize[, ancbufsize[, flags]])

일반 데이터(최대 `bufsize' 바이트)와 보조(ancillary) 데이터를 소켓에서 수신합니다. `ancbufsize' 인자는 보조 데이터 수신에 사용되는 내부 버퍼의 크기를 바이트 단위로 설정합니다; 기본값은 0이며 보조 데이터가 수신되지 않는다는 뜻입니다. 보조 데이터를 위한 적절한 버퍼 크기는 @ref{1e13,,CMSG_SPACE()} 나 @ref{1e14,,CMSG_LEN()}를 사용하여 계산할 수 있으며, 버퍼에 들어가지 않는 항목은 잘리거나 삭제될 수 있습니다. `flags' 인자의 기본값은 0이고 @ref{fa3,,recv()}와 같은 의미입니다.

반환 값은 4-튜플입니다: @code{(data, ancdata, msg_flags, address)}. `data' 항목은 일반 데이터를 담은 @ref{192,,bytes} 객체입니다. `ancdata' 항목은 수신된 보조 데이터(제어 메시지)를 나타내는 0개 이상의 튜플 @code{(cmsg_level, cmsg_type, cmsg_data)}의 리스트입니다: `cmsg_level' 와 `cmsg_type'는 각각 프로토콜 수준과 프로토콜 특정 형을 지정하는 정수이고, `cmsg_data'는 연결된 데이터를 담은 @code{bytes} 객체입니다. `msg_flags' 항목은 수신된 메시지의 조건을 나타내는 다양한 플래그의 비트별 OR입니다; 자세한 내용은 시스템 설명서를 참조하십시오. 수신 소켓이 연결되어있지 않으면, `address'는 송신 소켓의 주소입니다, (사용 가능하다면); 그렇지 않으면 값은 지정되지 않습니다.

On some systems, @ref{6a0,,sendmsg()} and @ref{fa5,,recvmsg()} can be used to
pass file descriptors between processes over an @ref{1bae,,AF_UNIX}
socket.  When this facility is used (it is often restricted to
@ref{14f8,,SOCK_STREAM} sockets), @code{recvmsg()} will return, in its
ancillary data, items of the form @code{(socket.SOL_SOCKET,
socket.SCM_RIGHTS, fds)}, where `fds' is a @ref{192,,bytes} object
representing the new file descriptors as a binary array of the
native C int type.  If @code{recvmsg()} raises an
exception after the system call returns, it will first attempt to
close any file descriptors received via this mechanism.

일부 시스템은 부분적으로만 수신된 보조 데이터 항목의 절단 길이를 나타내지 않습니다. 항목이 버퍼의 끝을 넘어 확장된 것처럼 보이면, @ref{fa5,,recvmsg()}는 @ref{4d8,,RuntimeWarning}를 발생시키고, 관련 데이터의 시작 전에 절단되지 않은 버퍼 내에 있는 부분을 반환합니다.

@code{SCM_RIGHTS} 메커니즘을 지원하는 시스템에서, 다음 함수는 최대 `maxfds' 파일 기술자를 수신하여, 메시지 데이터와 기술자를 담은 리스트를 반환합니다 (관련 없는 수신되는 제어 메시지와 같은 예기치 않은 조건은 무시하면서). @ref{6a0,,sendmsg()}를 참조하십시오.

@example
import socket, array

def recv_fds(sock, msglen, maxfds):
    fds = array.array("i")   # Array of ints
    msg, ancdata, flags, addr = sock.recvmsg(msglen, socket.CMSG_LEN(maxfds * fds.itemsize))
    for cmsg_level, cmsg_type, cmsg_data in ancdata:
        if cmsg_level == socket.SOL_SOCKET and cmsg_type == socket.SCM_RIGHTS:
            # Append data, ignoring any truncated integers at the end.
            fds.frombytes(cmsg_data[:len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
    return msg, list(fds)
@end example

@ref{213c,,가용성}: Unix.

Most Unix platforms.


Added in version 3.3.



버전 3.5에서 변경: 시스템 호출이 인터럽트 되고 시그널 처리기가 예외를 발생시키지 않으면, 메서드는 이제 @ref{f87,,InterruptedError} 예외를 발생시키는 대신 시스템 호출을 재시도합니다 (이유는 
@geindex Python 향상 제안; PEP 475
PEP 475@footnote{https://peps.python.org/pep-0475/}를 참조하십시오).

@end deffn

@geindex recvmsg_into() (socket.socket 메서드)
@anchor{library/socket socket socket recvmsg_into}@anchor{133f}
@deffn {메서드} socket.recvmsg_into (buffers[, ancbufsize[, flags]])

@ref{fa5,,recvmsg()}처럼 동작해서, 일반 데이터와 보조 데이터를 소켓에서 수신하지만, 새로운 바이트열 객체를 반환하는 대신 일반 데이터를 일련의 버퍼로 분산시킵니다. `buffers' 인자는 쓰기 가능한 버퍼(예를 들어, @ref{344,,bytearray} 객체)를 내보내는 객체의 이터러블이어야 합니다; 이것들은 모두 기록되었거나 버퍼가 더는 없을 때까지 일반 데이터의 연속적인 덩어리로 채워질 것입니다. 운영 체제는 사용할 수 있는 버퍼 수에 제한(@ref{18ee,,sysconf()} 값 @code{SC_IOV_MAX})을 설정할 수 있습니다. `ancbufsize' 와 `flags' 인자는 @code{recvmsg()}와 같은 의미가 있습니다.

반환 값은 4-튜플입니다: @code{(nbytes, ancdata, msg_flags, address)}. 여기서 `nbytes'는 버퍼에 기록된 일반 데이터의 총 바이트 수이며, `ancdata', `msg_flags' 및 `address'는 @ref{fa5,,recvmsg()}와 같습니다.

예제:

@example
>>> import socket
>>> s1, s2 = socket.socketpair()
>>> b1 = bytearray(b'----')
>>> b2 = bytearray(b'0123456789')
>>> b3 = bytearray(b'--------------')
>>> s1.send(b'Mary had a little lamb')
22
>>> s2.recvmsg_into([b1, memoryview(b2)[2:9], b3])
(22, [], 0, None)
>>> [b1, b2, b3]
[bytearray(b'Mary'), bytearray(b'01 had a 9'), bytearray(b'little lamb---')]
@end example

@ref{213c,,가용성}: Unix.

Most Unix platforms.


Added in version 3.3.

@end deffn

@geindex recvfrom_into() (socket.socket 메서드)
@anchor{library/socket socket socket recvfrom_into}@anchor{1523}
@deffn {메서드} socket.recvfrom_into (buffer[, nbytes[, flags]])

Receive data from the socket, writing it into `buffer' instead of creating a
new bytestring.  The return value is a pair @code{(nbytes, address)} where `nbytes' is
the number of bytes received and `address' is the address of the socket sending
the data.  See the Unix manual page @code{recv(2)@footnote{https://manpages.debian.org/recv(2)}} for the meaning of the
optional argument `flags'; it defaults to zero. The format of `address'
depends on the address family — see @ref{397b,,소켓 패밀리}.
@end deffn

@geindex recv_into() (socket.socket 메서드)
@anchor{library/socket socket socket recv_into}@anchor{1522}
@deffn {메서드} socket.recv_into (buffer[, nbytes[, flags]])

소켓에서 최대 `nbytes' 바이트까지 수신하는데, 새 바이트열을 만드는 대신 데이터를 버퍼에 저장합니다. `nbytes'가 지정되지 않으면 (또는 0), 지정된 버퍼에서 사용 가능한 크기까지 수신합니다. 수신 한 바이트 수를 반환합니다. 선택적 인자 `flags'의 의미에 대해서는 유닉스 매뉴얼 페이지 @code{recv(2)@footnote{https://manpages.debian.org/recv(2)}}를 보십시오; 기본값은 0입니다.
@end deffn

@geindex send() (socket.socket 메서드)
@anchor{library/socket socket socket send}@anchor{fa6}
@deffn {메서드} socket.send (bytes[, flags])

Send data to the socket.  The socket must be connected to a remote socket.  The
optional `flags' argument has the same meaning as for @ref{fa3,,recv()}.
Returns the number of bytes sent. Applications are responsible for checking that
all data has been sent; if only some of the data was transmitted, the
application needs to attempt delivery of the remaining data. For further
information on this topic, consult the @ref{39d8,,소켓 프로그래밍 HOWTO}.


버전 3.5에서 변경: 시스템 호출이 인터럽트 되고 시그널 처리기가 예외를 발생시키지 않으면, 메서드는 이제 @ref{f87,,InterruptedError} 예외를 발생시키는 대신 시스템 호출을 재시도합니다 (이유는 
@geindex Python 향상 제안; PEP 475
PEP 475@footnote{https://peps.python.org/pep-0475/}를 참조하십시오).

@end deffn

@geindex sendall() (socket.socket 메서드)
@anchor{library/socket socket socket sendall}@anchor{fa7}
@deffn {메서드} socket.sendall (bytes[, flags])

Send data to the socket.  The socket must be connected to a remote socket.  The
optional `flags' argument has the same meaning as for @ref{fa3,,recv()}.
Unlike @ref{fa6,,send()}, this method continues to send data from `bytes' until
either all data has been sent or an error occurs.  @code{None} is returned on
success.  On error, an exception is raised, and there is no way to determine how
much data, if any, was successfully sent.


버전 3.5에서 변경: The socket timeout is no longer reset each time data is sent successfully.
The socket timeout is now the maximum total duration to send all data.



버전 3.5에서 변경: 시스템 호출이 인터럽트 되고 시그널 처리기가 예외를 발생시키지 않으면, 메서드는 이제 @ref{f87,,InterruptedError} 예외를 발생시키는 대신 시스템 호출을 재시도합니다 (이유는 
@geindex Python 향상 제안; PEP 475
PEP 475@footnote{https://peps.python.org/pep-0475/}를 참조하십시오).

@end deffn

@geindex sendto() (socket.socket 메서드)
@anchor{library/socket socket socket sendto}@anchor{fa8}
@deffn {메서드} socket.sendto (bytes, address)

@deffnx {메서드} socket.sendto (bytes, flags, address)

Send data to the socket.  The socket should not be connected to a remote socket,
since the destination socket is specified by `address'.  The optional `flags'
argument has the same meaning as for @ref{fa3,,recv()}.  Return the number of
bytes sent. The format of `address' depends on the address family — see
@ref{397b,,소켓 패밀리}.

@code{self}, @code{address}를 인자로 @ref{1c6c,,감사 이벤트(auditing event)} @code{socket.sendto}를 발생시킵니다.


버전 3.5에서 변경: 시스템 호출이 인터럽트 되고 시그널 처리기가 예외를 발생시키지 않으면, 메서드는 이제 @ref{f87,,InterruptedError} 예외를 발생시키는 대신 시스템 호출을 재시도합니다 (이유는 
@geindex Python 향상 제안; PEP 475
PEP 475@footnote{https://peps.python.org/pep-0475/}를 참조하십시오).

@end deffn

@geindex sendmsg() (socket.socket 메서드)
@anchor{library/socket socket socket sendmsg}@anchor{6a0}
@deffn {메서드} socket.sendmsg (buffers[, ancdata[, flags[, address]]])

소켓에 일반과 보조 데이터를 보는데, 일련의 버퍼에서 일반 데이터를 모아서 단일 메시지로 연결합니다. `buffers' 인자는 일반 데이터를 @ref{193,,바이트열류 객체}의 이터러블로 지정합니다 (예를 들어, @ref{192,,bytes} 객체); 운영 체제는 사용할 수 있는 버퍼 수에 제한(@ref{18ee,,sysconf()} 값 @code{SC_IOV_MAX})을 설정할 수 있습니다. `ancdata' 인자는 보조 데이터 (제어 메시지)를 0개 이상의 튜플 @code{(cmsg_level, cmsg_type, cmsg_data)}의 이터러블로 지정합니다. 여기서 `cmsg_level' 와 `cmsg_type'는 각각 프로토콜 수준과 프로토콜 특정 형을 지정하는 정수이고, `cmsg_data'는 연결된 데이터를 담은 바이트열류 객체입니다. 일부 시스템(특히, @ref{1e13,,CMSG_SPACE()}가 없는 시스템)은 호출 당 하나의 제어 메시지를 송신하는 것만 지원할 수 있습니다. `flags' 인자의 기본값은 0이고 @ref{fa6,,send()}와 같은 의미입니다. `address'가 제공되고 @code{None}이 아니면, 메시지의 대상 주소를 설정합니다. 반환 값은 전송된 일반 데이터의 바이트 수입니다.

다음 함수는 @code{SCM_RIGHTS} 메커니즘을 지원하는 시스템에서, @ref{1bae,,AF_UNIX} 소켓을 통해 파일 기술자 리스트 `fds'를 보냅니다. @ref{fa5,,recvmsg()}도 참조하세요.

@example
import socket, array

def send_fds(sock, msg, fds):
    return sock.sendmsg([msg], [(socket.SOL_SOCKET, socket.SCM_RIGHTS, array.array("i", fds))])
@end example

@ref{213c,,가용성}: Unix, not WASI.

Most Unix platforms.

@code{self}, @code{address}를 인자로 @ref{1c6c,,감사 이벤트(auditing event)} @code{socket.sendmsg}를 발생시킵니다.


Added in version 3.3.



버전 3.5에서 변경: 시스템 호출이 인터럽트 되고 시그널 처리기가 예외를 발생시키지 않으면, 메서드는 이제 @ref{f87,,InterruptedError} 예외를 발생시키는 대신 시스템 호출을 재시도합니다 (이유는 
@geindex Python 향상 제안; PEP 475
PEP 475@footnote{https://peps.python.org/pep-0475/}를 참조하십시오).

@end deffn

@geindex sendmsg_afalg() (socket.socket 메서드)
@anchor{library/socket socket socket sendmsg_afalg}@anchor{ed2}
@deffn {메서드} socket.sendmsg_afalg ([msg], *, op[, iv[, assoclen[, flags]]])

@ref{ed1,,AF_ALG} 소켓용, @ref{6a0,,sendmsg()}의 특수한 버전. @code{AF_ALG} 소켓에 대한 모드, IV, AEAD 관련 데이터 길이 및 플래그를 설정합니다.

@ref{213c,,가용성}: Linux >= 2.6.38.


Added in version 3.6.

@end deffn

@geindex sendfile() (socket.socket 메서드)
@anchor{library/socket socket socket sendfile}@anchor{105c}
@deffn {메서드} socket.sendfile (file, offset=0, count=None)

고성능 @ref{d04,,os.sendfile}을 사용하여 EOF에 도달할 때까지 파일을 보내고, 보낸 총 바이트 수를 반환합니다. `file'은 바이너리 모드로 열린 일반 파일 객체여야 합니다. @code{os.sendfile}을 사용할 수 없거나 (예를 들어, 윈도우) `file'가 일반 파일이 아니면, @ref{fa6,,send()}가 대신 사용됩니다. `offset'은 파일 읽기 시작할 위치를 알려줍니다. 지정되면, `count'는 EOF에 도달할 때까지 파일을 전송하는 대신 전송할 총 바이트 수입니다. 파일 위치는 반환하거나 에러가 발생했을 때 갱신됩니다. 이때 @ref{15b1,,file.tell()}을 사용하여 전송된 바이트 수를 계산할 수 있습니다. 소켓은 @ref{14f8,,SOCK_STREAM} 유형이어야 합니다. 비 블로킹 소켓은 지원되지 않습니다.


Added in version 3.5.

@end deffn

@geindex set_inheritable() (socket.socket 메서드)
@anchor{library/socket socket socket set_inheritable}@anchor{1101}
@deffn {메서드} socket.set_inheritable (inheritable)

소켓의 파일 기술자나 소켓 핸들의 @ref{10fb,,상속 가능 플래그}를 설정합니다.


Added in version 3.4.

@end deffn

@geindex setblocking() (socket.socket 메서드)
@anchor{library/socket socket socket setblocking}@anchor{3063}
@deffn {메서드} socket.setblocking (flag)

소켓의 블로킹이나 비 블로킹 모드를 설정합니다. `flag'가 거짓이면, 소켓은 비 블로킹으로 설정되고, 그렇지 않으면 블로킹 모드로 설정됩니다.

이 메서드는 특정 @ref{3988,,settimeout()} 호출의 줄인 표현입니다:


@itemize *

@item 
@code{sock.setblocking(True)}는 @code{sock.settimeout(None)}와 동등합니다

@item 
@code{sock.setblocking(False)}는 @code{sock.settimeout(0.0)}와 동등합니다
@end itemize


버전 3.7에서 변경: 이 메서드는 더는 @ref{e05,,socket.type}에 @ref{e03,,SOCK_NONBLOCK} 플래그를 적용하지 않습니다.

@end deffn

@geindex settimeout() (socket.socket 메서드)
@anchor{library/socket socket socket settimeout}@anchor{3988}
@deffn {메서드} socket.settimeout (value)

Set a timeout on blocking socket operations.  The `value' argument can be a
nonnegative floating-point number expressing seconds, or @code{None}.
If a non-zero value is given, subsequent socket operations will raise a
@ref{a35,,timeout} exception if the timeout period `value' has elapsed before
the operation has completed.  If zero is given, the socket is put in
non-blocking mode. If @code{None} is given, the socket is put in blocking mode.

자세한 내용은, @ref{39d9,,소켓 시간제한에 대한 참고 사항}을 보십시오.


버전 3.7에서 변경: 이 메서드는 더는 @ref{e05,,socket.type}의 @ref{e03,,SOCK_NONBLOCK} 플래그를 토글하지 않습니다.

@end deffn

@geindex setsockopt() (socket.socket 메서드)
@anchor{library/socket socket socket setsockopt}@anchor{ed0}
@deffn {메서드} socket.setsockopt (level, optname, value: int | Buffer)

@deffnx {메서드} socket.setsockopt (level, optname, None, optlen: int)

@geindex module;struct

Set the value of the given socket option (see the Unix manual page
@code{setsockopt(2)@footnote{https://manpages.debian.org/setsockopt(2)}}).  The needed symbolic constants are defined in this
module (SO_* etc. <socket-unix-constants>).  The value can be an integer,
@code{None} or a @ref{193,,bytes-like object} representing a buffer. In the latter
case it is up to the caller to ensure that the bytestring contains the
proper bits (see the optional built-in module @ref{db,,struct} for a way to
encode C structures as bytestrings). When `value' is set to @code{None},
`optlen' argument is required. It’s equivalent to calling @code{setsockopt()} C
function with @code{optval=NULL} and @code{optlen=optlen}.


버전 3.5에서 변경: 이제 쓰기 가능한 @ref{193,,바이트열류 객체}를 받아들입니다.



버전 3.6에서 변경: setsockopt(level, optname, None, optlen: int) 형식이 추가되었습니다.


@ref{213c,,가용성}: not WASI.
@end deffn

@geindex shutdown() (socket.socket 메서드)
@anchor{library/socket socket socket shutdown}@anchor{39c5}
@deffn {메서드} socket.shutdown (how)

연결의 한쪽 또는 양쪽 절반을 닫습니다. `how'가 @ref{39c2,,SHUT_RD}면, 추가 수신이 허용되지 않습니다. `how'가 @ref{39c3,,SHUT_WR}이면, 추가 전송이 허용되지 않습니다. `how'가 @ref{39c4,,SHUT_RDWR}이면, 추가 송수신이 허용되지 않습니다.

@ref{213c,,가용성}: not WASI.
@end deffn

@geindex share() (socket.socket 메서드)
@anchor{library/socket socket socket share}@anchor{e00}
@deffn {메서드} socket.share (process_id)

소켓을 복제하고 대상 프로세스와 공유할 수 있도록 준비합니다. 대상 프로세스는 `process_id'로 제공되어야 합니다. 결과 바이트열 객체는 어떤 프로세스 간 통신의 형태를 사용하여 대상 프로세스로 전달될 수 있으며 그곳에서 @ref{e01,,fromshare()}를 사용하여 소켓을 다시 만들 수 있습니다. 일단, 이 메서드가 호출되면, 운영 체제가 이미 대상 프로세스를 위해 이를 복제 했으므로 소켓을 닫아도 안전합니다.

@ref{213c,,가용성}: Windows.


Added in version 3.3.

@end deffn

메서드 @code{read()} 나 @code{write()}가 없다는 점에 유의하십시오; 대신 @ref{fa3,,recv()} 와 @ref{fa6,,send()}를 `flags' 인자 없이 사용하십시오.

소켓 객체는 또한 @ref{fa0,,socket} 생성자에 지정된 값에 대응하는 다음과 같은 (읽기 전용) 어트리뷰트를 가집니다.

@geindex family (socket.socket의 속성)
@anchor{library/socket socket socket family}@anchor{39da}
@deffn {속성} socket.family

소켓 패밀리.
@end deffn

@geindex type (socket.socket의 속성)
@anchor{library/socket socket socket type}@anchor{e05}
@deffn {속성} socket.type

소켓 유형.
@end deffn

@geindex proto (socket.socket의 속성)
@anchor{library/socket socket socket proto}@anchor{39db}
@deffn {속성} socket.proto

소켓 프로토콜.
@end deffn

@node 소켓 시간제한에 대한 참고 사항,예제<18>,소켓 객체,socket — Low-level networking interface
@anchor{library/socket notes-on-socket-timeouts}@anchor{39dc}@anchor{library/socket socket-timeouts}@anchor{39d9}
@subsubsection 소켓 시간제한에 대한 참고 사항


소켓 객체는 세 가지 모드 중 하나일 수 있습니다: 블로킹, 비 블로킹, 또는 시간제한. 소켓은 기본적으로 항상 블로킹 모드로 생성되지만, 이는 @ref{398c,,setdefaulttimeout()}를 호출하여 변경할 수 있습니다.


@itemize *

@item 
`블로킹 모드'에서, 연산은 완료되거나 시스템에서 에러(가령 연결 시간 초과)를 반환할 때까지 블록합니다.

@item 
In `non-blocking mode', operations fail (with an error that is unfortunately
system-dependent) if they cannot be completed immediately: functions from the
@ref{c6,,select} module can be used to know when and whether a socket is available
for reading or writing.

@item 
`시간제한 모드'에서, 연산은 소켓에 대해 지정된 제한 시간 내에 완료할 수 없거나 (@ref{a35,,timeout} 예외 발생), 시스템이 에러를 반환하면 실패합니다.
@end itemize

@cartouche
@quotation 참고 
At the operating system level, sockets in `timeout mode' are internally set
in non-blocking mode.  Also, the blocking and timeout modes are shared between
file descriptors and socket objects that refer to the same network endpoint.
This implementation detail can have visible consequences if e.g. you decide
to use the @ref{39d6,,fileno()} of a socket.
@end quotation
@end cartouche

@menu
* 시간제한과 connect 메서드:: 
* 시간제한과 accept 메서드:: 

@end menu

@node 시간제한과 connect 메서드,시간제한과 accept 메서드,,소켓 시간제한에 대한 참고 사항
@anchor{library/socket timeouts-and-the-connect-method}@anchor{39dd}
@subsubsection 시간제한과 @code{connect} 메서드


@ref{fa2,,connect()} 연산도 시간제한 설정의 영향을 받으며, 일반적으로 @code{connect()}를 호출하기 전에 @ref{3988,,settimeout()}를 호출하거나 @ref{881,,create_connection()}에 timeout 매개 변수를 전달하는 것이 좋습니다. 그러나, 시스템 네트워크 스택은 파이썬 소켓 시간제한 설정과 관계없이 자체의 연결 시간제한 에러를 반환할 수 있습니다.

@node 시간제한과 accept 메서드,,시간제한과 connect 메서드,소켓 시간제한에 대한 참고 사항
@anchor{library/socket timeouts-and-the-accept-method}@anchor{39de}
@subsubsection 시간제한과 @code{accept} 메서드


@ref{39ca,,getdefaulttimeout()}가 @ref{884,,None}이 아니면, @ref{fa1,,accept()} 메서드에서 반환된 소켓은 그 시간제한을 상속합니다. 그렇지 않으면, 동작은 리스닝 소켓의 설정에 따라 다릅니다:


@itemize *

@item 
리스닝 소켓이 `블로킹 모드' 나 `시간제한 모드'에 있으면, @ref{fa1,,accept()}에 의해 반환된 소켓은 `블로킹 모드'에 있습니다.

@item 
리스닝 소켓이 `비 블로킹 모드'에 있으면, @ref{fa1,,accept()}에 의해 반환된 소켓이 블로킹 모드인지 비 블로킹 모드인지는 운영 체제에 따라 다릅니다. 플랫폼 간 동작을 보장하려면, 이 설정을 직접 재정의하는 것이 좋습니다.
@end itemize

@node 예제<18>,,소켓 시간제한에 대한 참고 사항,socket — Low-level networking interface
@anchor{library/socket example}@anchor{39df}@anchor{library/socket socket-example}@anchor{39e0}
@subsubsection 예제


Here are four minimal example programs using the TCP/IP protocol: a server that
echoes all data that it receives back (servicing only one client), and a client
using it.  Note that a server must perform the sequence @ref{fa0,,socket()},
@ref{173f,,bind()}, @ref{105d,,listen()}, @ref{fa1,,accept()} (possibly
repeating the @code{accept()} to service more than one client), while a
client only needs the sequence @code{socket()}, @ref{fa2,,connect()}.  Also
note that the server does not @ref{fa7,,sendall()}/@ref{fa3,,recv()} on
the socket it is listening on but on the new socket returned by
@code{accept()}.

처음 두 예제는 IPv4만 지원합니다.

@example
# Echo server program
import socket

HOST = '@w{'}                 # Symbolic name meaning all available interfaces
PORT = 50007              # Arbitrary non-privileged port
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.bind((HOST, PORT))
    s.listen(1)
    conn, addr = s.accept()
    with conn:
        print('Connected by', addr)
        while True:
            data = conn.recv(1024)
            if not data: break
            conn.sendall(data)
@end example

@example
# Echo client program
import socket

HOST = 'daring.cwi.nl'    # The remote host
PORT = 50007              # The same port as used by the server
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.connect((HOST, PORT))
    s.sendall(b'Hello, world')
    data = s.recv(1024)
print('Received', repr(data))
@end example

The next two examples are identical to the above two, but support both IPv4 and
IPv6. The server side will listen to the first address family available (it
should listen to both instead). On most of IPv6-ready systems, IPv6 will take
precedence and the server may not accept IPv4 traffic. The client side will try
to connect to all the addresses returned as a result of the name resolution, and
sends traffic to the first one connected successfully.

@example
# Echo server program
import socket
import sys

HOST = None               # Symbolic name meaning all available interfaces
PORT = 50007              # Arbitrary non-privileged port
s = None
for res in socket.getaddrinfo(HOST, PORT, socket.AF_UNSPEC,
                              socket.SOCK_STREAM, 0, socket.AI_PASSIVE):
    af, socktype, proto, canonname, sa = res
    try:
        s = socket.socket(af, socktype, proto)
    except OSError as msg:
        s = None
        continue
    try:
        s.bind(sa)
        s.listen(1)
    except OSError as msg:
        s.close()
        s = None
        continue
    break
if s is None:
    print('could not open socket')
    sys.exit(1)
conn, addr = s.accept()
with conn:
    print('Connected by', addr)
    while True:
        data = conn.recv(1024)
        if not data: break
        conn.send(data)
@end example

@example
# Echo client program
import socket
import sys

HOST = 'daring.cwi.nl'    # The remote host
PORT = 50007              # The same port as used by the server
s = None
for res in socket.getaddrinfo(HOST, PORT, socket.AF_UNSPEC, socket.SOCK_STREAM):
    af, socktype, proto, canonname, sa = res
    try:
        s = socket.socket(af, socktype, proto)
    except OSError as msg:
        s = None
        continue
    try:
        s.connect(sa)
    except OSError as msg:
        s.close()
        s = None
        continue
    break
if s is None:
    print('could not open socket')
    sys.exit(1)
with s:
    s.sendall(b'Hello, world')
    data = s.recv(1024)
print('Received', repr(data))
@end example

다음 예제는 윈도우에서 원시(raw) 소켓으로 매우 간단한 네트워크 스니퍼를 작성하는 방법을 보여줍니다. 이 예제는 인터페이스를 수정하기 위해 관리자 권한이 필요합니다:

@example
import socket

# the public network interface
HOST = socket.gethostbyname(socket.gethostname())

# create a raw socket and bind it to the public interface
s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_IP)
s.bind((HOST, 0))

# Include IP headers
s.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)

# receive all packets
s.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON)

# receive a packet
print(s.recvfrom(65565))

# disabled promiscuous mode
s.ioctl(socket.SIO_RCVALL, socket.RCVALL_OFF)
@end example

다음 예제는 원시(raw) 소켓 프로토콜을 사용하여, 소켓 인터페이스를 사용하여 CAN 네트워크와 통신하는 방법을 보여줍니다. 대신 브로드캐스트 관리자 프로토콜로 CAN을 사용하려면, 소켓을 이렇게 여십시오:

@example
socket.socket(socket.AF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM)
@end example

After binding (@code{CAN_RAW}) or connecting (@ref{11a2,,CAN_BCM}) the socket, you
can use the @ref{fa6,,socket.send()} and @ref{fa3,,socket.recv()} operations (and
their counterparts) on the socket object as usual.

이 마지막 예제는 특별한 권한이 필요할 수 있습니다:

@example
import socket
import struct


# CAN frame packing/unpacking (see 'struct can_frame' in <linux/can.h>)

can_frame_fmt = "=IB3x8s"
can_frame_size = struct.calcsize(can_frame_fmt)

def build_can_frame(can_id, data):
    can_dlc = len(data)
    data = data.ljust(8, b'\x00')
    return struct.pack(can_frame_fmt, can_id, can_dlc, data)

def dissect_can_frame(frame):
    can_id, can_dlc, data = struct.unpack(can_frame_fmt, frame)
    return (can_id, can_dlc, data[:can_dlc])


# create a raw socket and bind it to the 'vcan0' interface
s = socket.socket(socket.AF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
s.bind(('vcan0',))

while True:
    cf, addr = s.recvfrom(can_frame_size)

    print('Received: can_id=%x, can_dlc=%x, data=%s' % dissect_can_frame(cf))

    try:
        s.send(cf)
    except OSError:
        print('Error sending CAN frame')

    try:
        s.send(build_can_frame(0x01, b'\x01\x02\x03'))
    except OSError:
        print('Error sending CAN frame')
@end example

실행 간격이 너무 짧게 여러 번 예제를 실행하면 이 에러가 발생할 수 있습니다:

@example
OSError: [Errno 98] Address already in use
@end example

이것은 이전 실행이 소켓을 @code{TIME_WAIT} 상태로 남겨 두었고, 즉시 재사용할 수 없기 때문입니다.

There is a @code{socket} flag to set, in order to prevent this,
@code{socket.SO_REUSEADDR}:

@example
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((HOST, PORT))
@end example

@code{SO_REUSEADDR} 플래그는 자연스러운 시간제한이 만료되기를 기다리지 않고 @code{TIME_WAIT} 상태의 지역 소켓을 재사용하도록 커널에 알립니다.


@subsubheading 더 보기


(C로 하는) 소켓 프로그래밍에 대한 소개는 다음 논문을 참조하십시오:


@itemize -

@item 
`An Introductory 4.3BSD Interprocess Communication Tutorial', Stuart Sechrest 저

@item 
`An Advanced 4.3BSD Interprocess Communication Tutorial', Samuel J. Leffler 외 저,
@end itemize

둘 다 유닉스 프로그래머 매뉴얼, 보충 문서 1 (섹션 PS1:7과 PS1:8)에 있습니다. 다양한 소켓 관련 시스템 호출에 대한 플랫폼별 레퍼런스 자료는 소켓 의미의 세부 정보에 대한 중요한 소스입니다. 유닉스에서는 매뉴얼 페이지를 참조하십시오; 윈도우에서는, WinSock (또는 Winsock 2) 명세를 참조하십시오. IPv6 지원 API의 경우, 독자는 Basic Socket Interface Extensions for IPv6라는 제목의 
@geindex RFC; RFC 3493
RFC 3493@footnote{https://datatracker.ietf.org/doc/html/rfc3493.html}를 참조하고 싶을 겁니다.


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node ssl — TLS/SSL wrapper for socket objects,select — I/O 완료 대기,socket — Low-level networking interface,네트워킹과 프로세스 간 통신
@anchor{library/ssl doc}@anchor{39e1}@anchor{library/ssl module-ssl}@anchor{d5}@anchor{library/ssl ssl-tls-ssl-wrapper-for-socket-objects}@anchor{39e2}@anchor{library/ssl translation-repo}@anchor{39e3}
@subsection @code{ssl} — TLS/SSL wrapper for socket objects


@geindex module; ssl

`소스 코드:' Lib/ssl.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/ssl.py}

@geindex OpenSSL;(use in module ssl)

@geindex TLS
@geindex SSL
@geindex Transport Layer Security
@geindex Secure Sockets Layer


__________________________________________________________________


This module provides access to Transport Layer Security (often known as “Secure
Sockets Layer”) encryption and peer authentication facilities for network
sockets, both client-side and server-side.  This module uses the OpenSSL
library.

This is an @ref{2157,,optional module}.
If it is missing from your copy of CPython,
look for documentation from your distributor (that is,
whoever provided Python to you).
If you are the distributor, see @ref{2155,,Requirements for optional modules}.

@c Similar notes appear in the docs of the modules:
@c - zipfile
@c - tarfile

@cartouche
@quotation 참고 
Some behavior may be platform dependent, since calls are made to the
operating system socket APIs.  The installed version of OpenSSL may also
cause variations in behavior. For example, TLSv1.3 comes with OpenSSL version
1.1.1.
@end quotation
@end cartouche

@cartouche
@quotation 경고 
@ref{38c5,,보안 고려 사항}을 읽지 않고 이 모듈을 사용하지 마십시오. 그렇게 하면 ssl 모듈의 기본 설정이 반드시 여러분의 응용 프로그램에 적합하지는 않으므로 잘못된 보안 인식으로 이어질 수 있습니다.
@end quotation
@end cartouche

@c include for modules that don't work on WASM

@ref{213c,,가용성}: not WASI.

이 모듈은 웹어셈블리에서 작동하지 않거나 제공되지 않습니다. 자세한 내용은 @ref{1b68,,웹어셈블리 플랫폼}을 참조하세요.

이 절에서는 @code{ssl} 모듈의 객체와 함수를 설명합니다; TLS, SSL 및 인증서에 대한보다 일반적인 정보는, 하단의 “더 보기” 절에 있는 문서를 참조하십시오.

This module provides a class, @ref{ae7,,ssl.SSLSocket}, which is derived from the
@ref{fa0,,socket.socket} type, and provides a socket-like wrapper that also
encrypts and decrypts the data going over the socket with SSL.  It supports
additional methods such as @code{getpeercert()}, which retrieves the
certificate of the other side of the connection, @code{cipher()}, which
retrieves the cipher being used for the secure connection or
@code{get_verified_chain()}, @code{get_unverified_chain()} which retrieves
certificate chain.

더욱 정교한 응용 프로그램의 경우, @ref{357,,ssl.SSLContext} 클래스는 설정과 인증서를 관리하는 데 도움이 되며, @ref{747,,SSLContext.wrap_socket()} 메서드를 통해 만들어진 SSL 소켓이 상속할 수 있습니다.


버전 3.5.3에서 변경: OpenSSL 1.1.0과의 링크를 지원하도록 갱신되었습니다



버전 3.6에서 변경: OpenSSL 0.9.8, 1.0.0 및 1.0.1은 폐지되었으며 더는 지원되지 않습니다. 미래에는 ssl 모듈이 최소한 OpenSSL 1.0.2 나 1.1.0을 요구할 것입니다.



버전 3.10에서 변경: 
@geindex Python 향상 제안; PEP 644
PEP 644@footnote{https://peps.python.org/pep-0644/} has been implemented. The ssl module requires OpenSSL 1.1.1
or newer.

Use of deprecated constants and functions result in deprecation warnings.


@menu
* Functions@comma{} constants@comma{} and exceptions: Functions constants and exceptions. 
* SSL sockets:: 
* SSL contexts:: 
* 인증서:: 
* 예제: 예제<19>. 
* 비 블로킹 소켓에 대한 참고 사항:: 
* Memory BIO support:: 
* SSL 세션:: 
* 보안 고려 사항: 보안 고려 사항<3>. 
* TLS 1.3: TLS 1 3. 

@end menu

@node Functions constants and exceptions,SSL sockets,,ssl — TLS/SSL wrapper for socket objects
@anchor{library/ssl functions-constants-and-exceptions}@anchor{39e4}
@subsubsection Functions, constants, and exceptions


@menu
* 소켓 생성:: 
* 컨텍스트 생성:: 
* 예외: 예외<13>. 
* 난수 생성:: 
* 인증서 처리:: 
* 상수: 상수<9>. 

@end menu

@node 소켓 생성,컨텍스트 생성,,Functions constants and exceptions
@anchor{library/ssl socket-creation}@anchor{39e5}
@subsubsection 소켓 생성


Instances of @ref{ae7,,SSLSocket} must be created using the
@ref{747,,SSLContext.wrap_socket()} method. The helper function
@ref{480,,create_default_context()} returns a new context with secure default
settings.

기본 컨텍스트와 IPv4/IPv6 이중 스택을 사용하는 클라이언트 소켓 예제:

@example
import socket
import ssl

hostname = 'www.python.org'
context = ssl.create_default_context()

with socket.create_connection((hostname, 443)) as sock:
    with context.wrap_socket(sock, server_hostname=hostname) as ssock:
        print(ssock.version())
@end example

사용자 정의 컨텍스트와 IPv4를 사용하는 클라이언트 소켓 예제:

@example
hostname = 'www.python.org'
# PROTOCOL_TLS_CLIENT requires valid cert chain and hostname
context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
context.load_verify_locations('path/to/cabundle.pem')

with socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0) as sock:
    with context.wrap_socket(sock, server_hostname=hostname) as ssock:
        print(ssock.version())
@end example

localhost IPv4에서 리스닝하는 서버 소켓 예제:

@example
context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
context.load_cert_chain('/path/to/certchain.pem', '/path/to/private.key')

with socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0) as sock:
    sock.bind(('127.0.0.1', 8443))
    sock.listen(5)
    with context.wrap_socket(sock, server_side=True) as ssock:
        conn, addr = ssock.accept()
        ...
@end example

@node 컨텍스트 생성,예외<13>,소켓 생성,Functions constants and exceptions
@anchor{library/ssl context-creation}@anchor{39e6}
@subsubsection 컨텍스트 생성


편리 함수는 공통 목적을 위한 @ref{357,,SSLContext} 객체를 만드는 데 도움이 됩니다.

@geindex create_default_context() (ssl 모듈)
@anchor{library/ssl ssl create_default_context}@anchor{480}
@deffn {함수} ssl.create_default_context (purpose=Purpose.SERVER_AUTH, *, cafile=None, capath=None, cadata=None)

Return a new @ref{357,,SSLContext} object with default settings for
the given `purpose'.  The settings are chosen by the @code{ssl} module,
and usually represent a higher security level than when calling the
@code{SSLContext} constructor directly.

`cafile', `capath', `cadata'는, @ref{10ed,,SSLContext.load_verify_locations()}에서와 같이, 인증서 확인을 위해 신뢰할 수 있는 선택적 CA 인증서를 나타냅니다. 세 개 모두가 @ref{884,,None}이면, 이 함수는 대신 시스템의 기본 CA 인증서를 신뢰하도록 선택할 수 있습니다.

The settings are: @ref{a72,,PROTOCOL_TLS_CLIENT} or
@ref{a73,,PROTOCOL_TLS_SERVER}, @ref{a3a,,OP_NO_SSLv2}, and @ref{a3b,,OP_NO_SSLv3}
with high encryption cipher suites without RC4 and
without unauthenticated cipher suites. Passing @ref{11b2,,SERVER_AUTH}
as `purpose' sets @ref{39e7,,verify_mode} to @ref{39e8,,CERT_REQUIRED}
and either loads CA certificates (when at least one of `cafile', `capath' or
`cadata' is given) or uses @ref{11b1,,SSLContext.load_default_certs()} to load
default CA certificates.

@ref{39e9,,keylog_filename}이 지원되고 환경 변수 
@geindex SSLKEYLOGFILE
@geindex 환경 변수; SSLKEYLOGFILE
@code{SSLKEYLOGFILE}이 설정될 때, @ref{480,,create_default_context()}는 키 로깅을 활성화합니다.

The default settings for this context include
@ref{481,,VERIFY_X509_PARTIAL_CHAIN} and @ref{482,,VERIFY_X509_STRICT}.
These make the underlying OpenSSL implementation behave more like
a conforming implementation of 
@geindex RFC; RFC 5280
RFC 5280@footnote{https://datatracker.ietf.org/doc/html/rfc5280.html}, in exchange for a small
amount of incompatibility with older X.509 certificates.

@cartouche
@quotation 참고 
프로토콜, 옵션, 사이퍼 및 기타 설정은 사전 폐지 없이 언제든지 더욱 제한적인 값으로 변경될 수 있습니다. 이 값은 호환성과 보안 간의 적절한 균형을 나타냅니다.

응용 프로그램에 특정 설정이 필요하면, @ref{357,,SSLContext}를 만들어 설정을 직접 적용해야 합니다.
@end quotation
@end cartouche

@cartouche
@quotation 참고 
특정 이전 클라이언트나 서버가 이 함수로 만든 @ref{357,,SSLContext}로 연결을 시도할 때 “Protocol or cipher suite mismatch”라는 에러가 발생하면, 이 함수가 @ref{a3b,,OP_NO_SSLv3}를 사용해서 제외하는 SSL3.0만 지원하는 것일 수 있습니다. SSL3.0은 완전히 망가진@footnote{https://en.wikipedia.org/wiki/POODLE}것으로 널리 인식되고 있습니다. 이 함수를 계속 사용하면서 SSL 3.0 연결을 계속 허용하려면 다음과 같이 다시 활성화할 수 있습니다:

@example
ctx = ssl.create_default_context(Purpose.CLIENT_AUTH)
ctx.options &= ~ssl.OP_NO_SSLv3
@end example
@end quotation
@end cartouche

@cartouche
@quotation 참고 
This context enables @ref{482,,VERIFY_X509_STRICT} by default, which
may reject pre-
@geindex RFC; RFC 5280
RFC 5280@footnote{https://datatracker.ietf.org/doc/html/rfc5280.html} or malformed certificates that the
underlying OpenSSL implementation otherwise would accept. While disabling
this is not recommended, you can do so using:

@example
ctx = ssl.create_default_context()
ctx.verify_flags &= ~ssl.VERIFY_X509_STRICT
@end example
@end quotation
@end cartouche


Added in version 3.4.



버전 3.4.4에서 변경: RC4는 기본 사이퍼 문자열에서 삭제되었습니다.



버전 3.6에서 변경: ChaCha20/Poly1305가 기본 사이퍼 문자열에 추가되었습니다.

3DES가 기본 사이퍼 문자열에서 삭제되었습니다.



버전 3.8에서 변경: 
@geindex SSLKEYLOGFILE
@geindex 환경 변수; SSLKEYLOGFILE
@code{SSLKEYLOGFILE}에 대한 키 로깅 지원이 추가되었습니다.



버전 3.10에서 변경: The context now uses @ref{a72,,PROTOCOL_TLS_CLIENT} or
@ref{a73,,PROTOCOL_TLS_SERVER} protocol instead of generic
@ref{39ea,,PROTOCOL_TLS}.



버전 3.13에서 변경: The context now uses @ref{481,,VERIFY_X509_PARTIAL_CHAIN} and
@ref{482,,VERIFY_X509_STRICT} in its default verify flags.

@end deffn

@node 예외<13>,난수 생성,컨텍스트 생성,Functions constants and exceptions
@anchor{library/ssl exceptions}@anchor{39eb}
@subsubsection 예외


@geindex SSLError
@anchor{library/ssl ssl SSLError}@anchor{147e}
@deffn {예외} ssl.SSLError

하부 SSL 구현(현재 OpenSSL 라이브러리에서 제공)으로부터의 에러를 알리기 위해 발생합니다. 이는 하부 네트워크 연결에 겹쳐진 상위 수준의 암호화와 인증 계층에서 문제가 있음을 나타냅니다. 이 에러는 @ref{2c0,,OSError}의 서브 형입니다. @ref{147e,,SSLError} 인스턴스의 에러 코드와 메시지는 OpenSSL 라이브러리에 의해 제공됩니다.


버전 3.3에서 변경: @ref{147e,,SSLError}는 @ref{1255,,socket.error}의 서브 형이었습니다.


@geindex library (ssl.SSLError의 속성)
@anchor{library/ssl ssl SSLError library}@anchor{134c}
@deffn {속성} library

@code{SSL}, @code{PEM} 또는 @code{X509}와 같이, 에러가 발생한 OpenSSL 하위 모듈을 지정하는 문자열 기호입니다. 가능한 값의 범위는 OpenSSL 버전에 따라 다릅니다.


Added in version 3.3.

@end deffn

@geindex reason (ssl.SSLError의 속성)
@anchor{library/ssl ssl SSLError reason}@anchor{134d}
@deffn {속성} reason

이 에러가 발생한 이유를 나타내는 문자열 기호, 예를 들어, @code{CERTIFICATE_VERIFY_FAILED}. 가능한 값의 범위는 OpenSSL 버전에 따라 다릅니다.


Added in version 3.3.

@end deffn
@end deffn

@geindex SSLZeroReturnError
@anchor{library/ssl ssl SSLZeroReturnError}@anchor{39ec}
@deffn {예외} ssl.SSLZeroReturnError

읽기나 쓰기를 시도하고 SSL 연결이 정상적으로 닫혔을 때 발생하는 @ref{147e,,SSLError}의 서브 클래스. 이것이 하부 트랜스포트(TCP 읽기)가 닫혔음을 뜻하지는 않습니다.


Added in version 3.3.

@end deffn

@geindex SSLWantReadError
@anchor{library/ssl ssl SSLWantReadError}@anchor{1068}
@deffn {예외} ssl.SSLWantReadError

데이터를 읽거나 쓰려고 하지만, 요청을 만족하려면 하부 TCP 트랜스포트에서 데이터를 더 수신해야 할 때, @ref{39ed,,비 블로킹 SSL 소켓}에 의해 발생하는 @ref{147e,,SSLError}의 서브 클래스.


Added in version 3.3.

@end deffn

@geindex SSLWantWriteError
@anchor{library/ssl ssl SSLWantWriteError}@anchor{1069}
@deffn {예외} ssl.SSLWantWriteError

데이터를 읽거나 쓰려고 하지만, 요청을 만족하려면 하부 TCP 트랜스포트로 데이터를 더 보내야 할 때, @ref{39ed,,비 블로킹 SSL 소켓}에 의해 발생하는 @ref{147e,,SSLError}의 서브 클래스.


Added in version 3.3.

@end deffn

@geindex SSLSyscallError
@anchor{library/ssl ssl SSLSyscallError}@anchor{39ee}
@deffn {예외} ssl.SSLSyscallError

SSL 소켓에서 작업을 수행하는 동안 시스템 에러를 만났을 때 발생하는 @ref{147e,,SSLError}의 서브 클래스. 불행히도 원래의 errno 번호를 검사하는 쉬운 방법은 없습니다.


Added in version 3.3.

@end deffn

@geindex SSLEOFError
@anchor{library/ssl ssl SSLEOFError}@anchor{1ab7}
@deffn {예외} ssl.SSLEOFError

SSL 연결이 갑자기 종료되었을 때 발생하는 @ref{147e,,SSLError}의 서브 클래스. 일반적으로, 이 에러가 발생하면 하부 트랜스포트를 다시 사용하지 않아야 합니다.


Added in version 3.3.

@end deffn

@geindex SSLCertVerificationError
@anchor{library/ssl ssl SSLCertVerificationError}@anchor{d74}
@deffn {예외} ssl.SSLCertVerificationError

인증서 유효성 검사가 실패했을 때 발생하는 @ref{147e,,SSLError}의 서브 클래스.


Added in version 3.7.


@geindex verify_code (ssl.SSLCertVerificationError의 속성)
@anchor{library/ssl ssl SSLCertVerificationError verify_code}@anchor{39ef}
@deffn {속성} verify_code

유효성 검사 에러를 나타내는 숫자 에러 번호.
@end deffn

@geindex verify_message (ssl.SSLCertVerificationError의 속성)
@anchor{library/ssl ssl SSLCertVerificationError verify_message}@anchor{39f0}
@deffn {속성} verify_message

사람이 읽을 수 있는 유효성 검사 에러 문자열.
@end deffn
@end deffn

@geindex CertificateError
@anchor{library/ssl ssl CertificateError}@anchor{39f1}
@deffn {예외} ssl.CertificateError

@ref{d74,,SSLCertVerificationError}의 별칭.


버전 3.7에서 변경: 예외는 이제 @ref{d74,,SSLCertVerificationError}의 별칭입니다.

@end deffn

@node 난수 생성,인증서 처리,예외<13>,Functions constants and exceptions
@anchor{library/ssl random-generation}@anchor{39f2}
@subsubsection 난수 생성


@geindex RAND_bytes() (ssl 모듈)
@anchor{library/ssl ssl RAND_bytes}@anchor{746}
@deffn {함수} ssl.RAND_bytes (num, /)

길이 `num'의 암호학적으로 강한 의사 난수 바이트열을 반환합니다. PRNG에 충분한 데이터가 시드(seed) 되지 않았거나 현재 RAND 메서드에서 지원되지 않는 연산이면 @ref{147e,,SSLError}를 발생시킵니다. @ref{1c7b,,RAND_status()}를 PRNG의 상태를 확인하는 데 사용할 수 있으며 @ref{39f3,,RAND_add()}는 PRNG를 시드 하는 데 사용할 수 있습니다.

거의 모든 응용 프로그램에서 @ref{745,,os.urandom()}을 선호합니다.

암호학적으로 강한 생성기의 요구 사항을 얻으려면 위키피디아 기사 Cryptographically secure pseudorandom number generator (CSPRNG)@footnote{https://en.wikipedia.org/wiki/Cryptographically_secure_pseudorandom_number_generator}를 읽으십시오.


Added in version 3.3.

@end deffn

@geindex RAND_status() (ssl 모듈)
@anchor{library/ssl ssl RAND_status}@anchor{1c7b}
@deffn {함수} ssl.RAND_status ()

SSL 의사 난수 생성기에 ‘충분한’ 임의성이 시드 되었으면 @code{True}를 반환하고, 그렇지 않으면 @code{False}를 반환합니다. @code{ssl.RAND_egd()}와 @ref{39f3,,ssl.RAND_add()}를 사용하여 의사 난수 생성기의 임의성을 높일 수 있습니다.
@end deffn

@geindex RAND_add() (ssl 모듈)
@anchor{library/ssl ssl RAND_add}@anchor{39f3}
@deffn {함수} ssl.RAND_add (bytes, entropy, /)

Mix the given `bytes' into the SSL pseudo-random number generator.  The
parameter `entropy' (a float) is a lower bound on the entropy contained in
string (so you can always use @code{0.0}).  See 
@geindex RFC; RFC 1750
RFC 1750@footnote{https://datatracker.ietf.org/doc/html/rfc1750.html} for more
information on sources of entropy.


버전 3.5에서 변경: 이제 쓰기 가능한 @ref{193,,바이트열류 객체}를 받아들입니다.

@end deffn

@node 인증서 처리,상수<9>,난수 생성,Functions constants and exceptions
@anchor{library/ssl certificate-handling}@anchor{39f4}
@subsubsection 인증서 처리


@c import ssl

@geindex cert_time_to_seconds() (ssl 모듈)
@anchor{library/ssl ssl cert_time_to_seconds}@anchor{106a}
@deffn {함수} ssl.cert_time_to_seconds (cert_time)

Return the time in seconds since the epoch, given the @code{cert_time}
string representing the “notBefore” or “notAfter” date from a
certificate in @code{"%b %d %H:%M:%S %Y %Z"} strptime format (C
locale).

여기 예제가 있습니다:

@example
>>> import ssl
>>> import datetime as dt
>>> timestamp = ssl.cert_time_to_seconds("Jan  5 09:34:43 2018 GMT")
>>> timestamp
1515144883
>>> print(dt.datetime.fromtimestamp(timestamp, dt.UTC))
2018-01-05 09:34:43+00:00
@end example

“notBefore” 나 “notAfter” 날짜는 GMT(
@geindex RFC; RFC 5280
RFC 5280@footnote{https://datatracker.ietf.org/doc/html/rfc5280.html})를 사용해야 합니다.


버전 3.5에서 변경: 입력된 시간을 입력 문자열의 ‘GMT’ 시간대로 지정된 UTC 시간으로 해석합니다. 이전에는 지역 시간대가 사용되었습니다. 정수를 반환합니다 (입력 형식에는 부분 초가 없습니다).

@end deffn

@geindex get_server_certificate() (ssl 모듈)
@anchor{library/ssl ssl get_server_certificate}@anchor{a3d}
@deffn {함수} ssl.get_server_certificate (addr, ssl_version=PROTOCOL_TLS_CLIENT, ca_certs=None[, timeout])

Given the address @code{addr} of an SSL-protected server, as a (`hostname',
`port-number') pair, fetches the server’s certificate, and returns it as a
PEM-encoded string.  If @code{ssl_version} is specified, uses that version of
the SSL protocol to attempt to connect to the server.  If `ca_certs' is
specified, it should be a file containing a list of root certificates, the
same format as used for the `cafile' parameter in
@ref{10ed,,SSLContext.load_verify_locations()}.  The call will attempt to validate the
server certificate against that set of root certificates, and will fail
if the validation attempt fails.  A timeout can be specified with the
@code{timeout} parameter.


버전 3.3에서 변경: 이 함수는 이제 IPv6와 호환됩니다.



버전 3.5에서 변경: 최신 서버와의 호환성을 최대화하기 위해 기본 `ssl_version'이 @ref{39f5,,PROTOCOL_SSLv3}에서 @ref{39ea,,PROTOCOL_TLS}로 변경되었습니다.



버전 3.10에서 변경: The `timeout' parameter was added.

@end deffn

@geindex DER_cert_to_PEM_cert() (ssl 모듈)
@anchor{library/ssl ssl DER_cert_to_PEM_cert}@anchor{39f6}
@deffn {함수} ssl.DER_cert_to_PEM_cert (der_cert_bytes)

인증서가 DER-인코딩된 바이트열로 주어지면, 같은 인증서의 PEM-인코딩된 문자열 버전을 반환합니다.
@end deffn

@geindex PEM_cert_to_DER_cert() (ssl 모듈)
@anchor{library/ssl ssl PEM_cert_to_DER_cert}@anchor{39f7}
@deffn {함수} ssl.PEM_cert_to_DER_cert (pem_cert_string)

인증서가 ASCII PEM 문자열로 주어지면, 같은 인증서의 DER-인코딩된 바이트열 시퀀스를 반환합니다.
@end deffn

@geindex get_default_verify_paths() (ssl 모듈)
@anchor{library/ssl ssl get_default_verify_paths}@anchor{11a9}
@deffn {함수} ssl.get_default_verify_paths ()

OpenSSL의 기본 cafile 및 capath에 대한 경로가 있는 네임드 튜플을 반환합니다. 경로는 @ref{11aa,,SSLContext.set_default_verify_paths()}에서 사용하는 경로와 같습니다. 반환 값은 @ref{85d,,네임드 튜플} @code{DefaultVerifyPaths}입니다.:


@itemize *

@item 
@code{cafile} - cafile에 대한 확인된 경로나 파일이 존재하지 않으면 @code{None},

@item 
@code{capath} - capath에 대한 확인된 경로나 디렉터리가 존재하지 않으면 @code{None},

@item 
@code{openssl_cafile_env} - cafile을 가리키는 OpenSSL의 환경 키,

@item 
@code{openssl_cafile} - cafile에 대한 하드 코딩된 경로,

@item 
@code{openssl_capath_env} - capath를 가리키는 OpenSSL의 환경 키,

@item 
@code{openssl_capath} - capath 디렉터리에 대한 하드 코딩된 경로
@end itemize


Added in version 3.4.

@end deffn

@geindex enum_certificates() (ssl 모듈)
@anchor{library/ssl ssl enum_certificates}@anchor{11b4}
@deffn {함수} ssl.enum_certificates (store_name)

윈도우의 시스템 인증서 저장소에서 인증서를 꺼냅니다. `store_name'은 @code{CA}, @code{ROOT} 또는 @code{MY} 중 하나일 수 있습니다. 윈도우가 추가 인증서 저장소를 제공 할 수도 있습니다.

이 함수는 (cert_bytes, encoding_type, trust) 튜플의 리스트를 반환합니다. encoding_type은 cert_bytes의 인코딩을 지정합니다. X.509 ASN.1 데이터를 위한 @code{x509_asn}이거나 PKCS#7 ASN.1 데이터를 위한 @code{pkcs_7_asn}입니다. Trust는 인증서의 목적을 OIDS 집합으로 지정하거나, 인증서가 모든 목적에 대해 신뢰할 수 있으면 정확히 @code{True}입니다.

예제:

@example
>>> ssl.enum_certificates("CA")
[(b'data...', 'x509_asn', @{'1.3.6.1.5.5.7.3.1', '1.3.6.1.5.5.7.3.2'@}),
 (b'data...', 'x509_asn', True)]
@end example

@ref{213c,,가용성}: Windows.


Added in version 3.4.

@end deffn

@geindex enum_crls() (ssl 모듈)
@anchor{library/ssl ssl enum_crls}@anchor{11b5}
@deffn {함수} ssl.enum_crls (store_name)

윈도우의 시스템 인증서 저장소에서 CRL을 꺼냅니다. `store_name'는 @code{CA}, @code{ROOT} 또는 @code{MY} 중 하나일 수 있습니다. 윈도우가 추가 인증서 저장소를 제공 할 수도 있습니다.

이 함수는 (cert_bytes, encoding_type, trust) 튜플의 리스트를 반환합니다. encoding_type은 cert_bytes의 인코딩을 지정합니다. X.509 ASN.1 데이터를 위한 @code{x509_asn}이거나 PKCS#7 ASN.1 데이터를 위한 @code{pkcs_7_asn}입니다.

@ref{213c,,가용성}: Windows.


Added in version 3.4.

@end deffn

@node 상수<9>,,인증서 처리,Functions constants and exceptions
@anchor{library/ssl constants}@anchor{39f8}
@subsubsection 상수


@quotation

모든 상수는 이제 @ref{eda,,enum.IntEnum} 이나 @ref{e99,,enum.IntFlag} 컬렉션입니다.


Added in version 3.6.

@end quotation

@geindex CERT_NONE (ssl 모듈)
@anchor{library/ssl ssl CERT_NONE}@anchor{39f9}
@deffn {데이터} ssl.CERT_NONE

Possible value for @ref{39e7,,SSLContext.verify_mode}.
Except for @ref{a72,,PROTOCOL_TLS_CLIENT},
it is the default mode.  With client-side sockets, just about any
cert is accepted.  Validation errors, such as untrusted or expired cert,
are ignored and do not abort the TLS/SSL handshake.

서버 모드에서는, 클라이언트에서 인증서를 요청하지 않으므로 클라이언트는 클라이언트 인증서 인증을 위해 인증서를 보내지 않습니다.

아래의 @ref{38c5,,보안 고려 사항}의 논의를 참조하십시오.
@end deffn

@geindex CERT_OPTIONAL (ssl 모듈)
@anchor{library/ssl ssl CERT_OPTIONAL}@anchor{39fa}
@deffn {데이터} ssl.CERT_OPTIONAL

Possible value for @ref{39e7,,SSLContext.verify_mode}.
In client mode, @ref{39fa,,CERT_OPTIONAL}
has the same meaning as @ref{39e8,,CERT_REQUIRED}. It is recommended to
use @code{CERT_REQUIRED} for client-side sockets instead.

서버 모드에서는, 클라이언트 인증서 요청이 클라이언트로 전송됩니다. 클라이언트는 요청을 무시하거나 TLS 클라이언트 인증서 인증을 수행하기 위해 인증서를 보낼 수 있습니다. 클라이언트가 인증서를 보내기로 선택하면, 인증서가 유효성 검사됩니다. 모든 유효성 검사 에러는, TLS 핸드 셰이크를 즉시 중단합니다.

Use of this setting requires a valid set of CA certificates to
be passed to @ref{10ed,,SSLContext.load_verify_locations()}.
@end deffn

@geindex CERT_REQUIRED (ssl 모듈)
@anchor{library/ssl ssl CERT_REQUIRED}@anchor{39e8}
@deffn {데이터} ssl.CERT_REQUIRED

Possible value for @ref{39e7,,SSLContext.verify_mode}.
In this mode, certificates are
required from the other side of the socket connection; an @ref{147e,,SSLError}
will be raised if no certificate is provided, or if its validation fails.
This mode is `not' sufficient to verify a certificate in client mode as
it does not match hostnames.  @ref{39fb,,check_hostname} must be
enabled as well to verify the authenticity of a cert.
@ref{a72,,PROTOCOL_TLS_CLIENT} uses @ref{39e8,,CERT_REQUIRED} and
enables @code{check_hostname} by default.

서버 소켓에서, 이 모드는 필수 TLS 클라이언트 인증서 인증을 제공합니다. 클라이언트 인증서 요청이 클라이언트에 보내지고 클라이언트는 유효하고 신뢰할 수 있는 인증서를 제공해야 합니다.

Use of this setting requires a valid set of CA certificates to
be passed to @ref{10ed,,SSLContext.load_verify_locations()}.
@end deffn

@geindex VerifyMode (ssl 클래스)
@anchor{library/ssl ssl VerifyMode}@anchor{39fc}
@deffn {클래스} ssl.VerifyMode

CERT_* 상수의 @ref{eda,,enum.IntEnum} 컬렉션.


Added in version 3.6.

@end deffn

@geindex VERIFY_DEFAULT (ssl 모듈)
@anchor{library/ssl ssl VERIFY_DEFAULT}@anchor{11ae}
@deffn {데이터} ssl.VERIFY_DEFAULT

@ref{11ad,,SSLContext.verify_flags}의 가능한 값. 이 모드에서는 인증서 해지 목록(CRL)을 검사하지 않습니다. 기본적으로 OpenSSL은 CRL을 요구하지도 검사하지도 않습니다.


Added in version 3.4.

@end deffn

@geindex VERIFY_CRL_CHECK_LEAF (ssl 모듈)
@anchor{library/ssl ssl VERIFY_CRL_CHECK_LEAF}@anchor{11af}
@deffn {데이터} ssl.VERIFY_CRL_CHECK_LEAF

@ref{11ad,,SSLContext.verify_flags}의 가능한 값. 이 모드에서는, 피어 인증서만 확인할 뿐 중간 CA 인증서는 확인하지 않습니다. 이 모드는 피어 인증서의 발급자(그것의 직계 조상 CA)가 서명한 유효한 CRL을 요구합니다. 적절한 CRL이 @ref{10ed,,SSLContext.load_verify_locations}로 로드되지 않았으면 유효성 검사가 실패합니다.


Added in version 3.4.

@end deffn

@geindex VERIFY_CRL_CHECK_CHAIN (ssl 모듈)
@anchor{library/ssl ssl VERIFY_CRL_CHECK_CHAIN}@anchor{11b0}
@deffn {데이터} ssl.VERIFY_CRL_CHECK_CHAIN

@ref{11ad,,SSLContext.verify_flags}의 가능한 값. 이 모드에서는, 피어 인증서 체인의 모든 인증서에 대한 CRL이 확인됩니다.


Added in version 3.4.

@end deffn

@geindex VERIFY_X509_STRICT (ssl 모듈)
@anchor{library/ssl ssl VERIFY_X509_STRICT}@anchor{482}
@deffn {데이터} ssl.VERIFY_X509_STRICT

망가진 X.509 인증서에 대한 우회를 사용하지 못하도록 하는 @ref{11ad,,SSLContext.verify_flags}의 가능한 값.


Added in version 3.4.

@end deffn

@geindex VERIFY_ALLOW_PROXY_CERTS (ssl 모듈)
@anchor{library/ssl ssl VERIFY_ALLOW_PROXY_CERTS}@anchor{1c92}
@deffn {데이터} ssl.VERIFY_ALLOW_PROXY_CERTS

Possible value for @ref{11ad,,SSLContext.verify_flags} to enables proxy
certificate verification.


Added in version 3.10.

@end deffn

@geindex VERIFY_X509_TRUSTED_FIRST (ssl 모듈)
@anchor{library/ssl ssl VERIFY_X509_TRUSTED_FIRST}@anchor{39fd}
@deffn {데이터} ssl.VERIFY_X509_TRUSTED_FIRST

@ref{11ad,,SSLContext.verify_flags}의 가능한 값. OpenSSL이 인증서의 유효성을 검사하기 위해 트러스트 체인을 구축할 때 신뢰할 수 있는 인증서를 선호하도록 지시합니다. 이 플래그는 기본적으로 활성화됩니다.


Added in version 3.4.4.

@end deffn

@geindex VERIFY_X509_PARTIAL_CHAIN (ssl 모듈)
@anchor{library/ssl ssl VERIFY_X509_PARTIAL_CHAIN}@anchor{481}
@deffn {데이터} ssl.VERIFY_X509_PARTIAL_CHAIN

Possible value for @ref{11ad,,SSLContext.verify_flags}. It instructs OpenSSL to
accept intermediate CAs in the trust store to be treated as trust-anchors,
in the same way as the self-signed root CA certificates. This makes it
possible to trust certificates issued by an intermediate CA without having
to trust its ancestor root CA.


Added in version 3.10.

@end deffn

@geindex VerifyFlags (ssl 클래스)
@anchor{library/ssl ssl VerifyFlags}@anchor{39fe}
@deffn {클래스} ssl.VerifyFlags

VERIFY_* 상수의 @ref{e99,,enum.IntFlag} 컬렉션.


Added in version 3.6.

@end deffn

@geindex PROTOCOL_TLS (ssl 모듈)
@anchor{library/ssl ssl PROTOCOL_TLS}@anchor{39ea}
@deffn {데이터} ssl.PROTOCOL_TLS

클라이언트와 서버가 모두 지원하는 가장 높은 프로토콜 버전을 선택합니다. 이름에도 불구하고, 이 옵션은 “SSL” 과 “TLS” 프로토콜을 모두 선택할 수 있습니다.


Added in version 3.6.



버전 3.10부터 폐지됨: TLS clients and servers require different default settings for secure
communication. The generic TLS protocol constant is deprecated in
favor of @ref{a72,,PROTOCOL_TLS_CLIENT} and @ref{a73,,PROTOCOL_TLS_SERVER}.

@end deffn

@geindex PROTOCOL_TLS_CLIENT (ssl 모듈)
@anchor{library/ssl ssl PROTOCOL_TLS_CLIENT}@anchor{a72}
@deffn {데이터} ssl.PROTOCOL_TLS_CLIENT

Auto-negotiate the highest protocol version that both the client and
server support, and configure the context client-side connections. The
protocol enables @ref{39e8,,CERT_REQUIRED} and
@ref{39fb,,check_hostname} by default.


Added in version 3.6.

@end deffn

@geindex PROTOCOL_TLS_SERVER (ssl 모듈)
@anchor{library/ssl ssl PROTOCOL_TLS_SERVER}@anchor{a73}
@deffn {데이터} ssl.PROTOCOL_TLS_SERVER

Auto-negotiate the highest protocol version that both the client and
server support, and configure the context server-side connections.


Added in version 3.6.

@end deffn

@geindex PROTOCOL_SSLv23 (ssl 모듈)
@anchor{library/ssl ssl PROTOCOL_SSLv23}@anchor{39ff}
@deffn {데이터} ssl.PROTOCOL_SSLv23

@ref{39ea,,PROTOCOL_TLS}의 별칭.


버전 3.6부터 폐지됨: 대신 @ref{39ea,,PROTOCOL_TLS}를 사용하십시오.

@end deffn

@geindex PROTOCOL_SSLv3 (ssl 모듈)
@anchor{library/ssl ssl PROTOCOL_SSLv3}@anchor{39f5}
@deffn {데이터} ssl.PROTOCOL_SSLv3

채널 암호화 프로토콜로 SSL 버전 3을 선택합니다.

This protocol is not available if OpenSSL is compiled with the
@code{no-ssl3} option.

@cartouche
@quotation 경고 
SSL 버전 3은 안전하지 않습니다. 사용하지 말도록 강력히 권고합니다.
@end quotation
@end cartouche


버전 3.6부터 폐지됨: OpenSSL has deprecated all version specific protocols. Use the default
protocol @ref{a73,,PROTOCOL_TLS_SERVER} or @ref{a72,,PROTOCOL_TLS_CLIENT}
with @ref{a70,,SSLContext.minimum_version} and
@ref{a71,,SSLContext.maximum_version} instead.

@end deffn

@geindex PROTOCOL_TLSv1 (ssl 모듈)
@anchor{library/ssl ssl PROTOCOL_TLSv1}@anchor{3a00}
@deffn {데이터} ssl.PROTOCOL_TLSv1

채널 암호화 프로토콜로 TLS 버전 1.0을 선택합니다.


버전 3.6부터 폐지됨: OpenSSL has deprecated all version specific protocols.

@end deffn

@geindex PROTOCOL_TLSv1_1 (ssl 모듈)
@anchor{library/ssl ssl PROTOCOL_TLSv1_1}@anchor{11a7}
@deffn {데이터} ssl.PROTOCOL_TLSv1_1

채널 암호화 프로토콜로 TLS 버전 1.1을 선택합니다. openssl 버전 1.0.1+ 에서만 사용할 수 있습니다.


Added in version 3.4.



버전 3.6부터 폐지됨: OpenSSL has deprecated all version specific protocols.

@end deffn

@geindex PROTOCOL_TLSv1_2 (ssl 모듈)
@anchor{library/ssl ssl PROTOCOL_TLSv1_2}@anchor{11a8}
@deffn {데이터} ssl.PROTOCOL_TLSv1_2

Selects TLS version 1.2 as the channel encryption protocol.
Available only with openssl version 1.0.1+.


Added in version 3.4.



버전 3.6부터 폐지됨: OpenSSL has deprecated all version specific protocols.

@end deffn

@geindex OP_ALL (ssl 모듈)
@anchor{library/ssl ssl OP_ALL}@anchor{3a01}
@deffn {데이터} ssl.OP_ALL

다른 SSL 구현에 있는 다양한 버그에 대한 해결 방법을 활성화합니다. 이 옵션은 기본적으로 설정됩니다. 반드시 OpenSSL의 @code{SSL_OP_ALL} 상수와 같은 플래그를 설정할 필요는 없습니다.


Added in version 3.2.

@end deffn

@geindex OP_NO_SSLv2 (ssl 모듈)
@anchor{library/ssl ssl OP_NO_SSLv2}@anchor{a3a}
@deffn {데이터} ssl.OP_NO_SSLv2

SSLv2 연결을 방지합니다. 이 옵션은 @ref{39ea,,PROTOCOL_TLS}와 결합해서만 적용할 수 있습니다. 피어가 SSLv2를 프로토콜 버전으로 선택하지 못하도록 합니다.


Added in version 3.2.



버전 3.6부터 폐지됨: SSLv2는 폐지되었습니다.

@end deffn

@geindex OP_NO_SSLv3 (ssl 모듈)
@anchor{library/ssl ssl OP_NO_SSLv3}@anchor{a3b}
@deffn {데이터} ssl.OP_NO_SSLv3

SSLv3 연결을 방지합니다. 이 옵션은 @ref{39ea,,PROTOCOL_TLS}와 결합해서만 적용할 수 있습니다. 피어가 프로토콜 버전으로 SSLv3을 선택하지 못하게 합니다.


Added in version 3.2.



버전 3.6부터 폐지됨: SSLv3은 폐지되었습니다.

@end deffn

@geindex OP_NO_TLSv1 (ssl 모듈)
@anchor{library/ssl ssl OP_NO_TLSv1}@anchor{3a02}
@deffn {데이터} ssl.OP_NO_TLSv1

TLSv1 연결을 금지합니다. 이 옵션은 @ref{39ea,,PROTOCOL_TLS}와 결합해서만 적용할 수 있습니다. 피어가 TLSv1을 프로토콜 버전으로 선택하지 못하게 합니다.


Added in version 3.2.



버전 3.7부터 폐지됨: 이 옵션은 OpenSSL 1.1.0부터 폐지되었습니다, 새로운 @ref{a70,,SSLContext.minimum_version}과 @ref{a71,,SSLContext.maximum_version}을 대신 사용하십시오.

@end deffn

@geindex OP_NO_TLSv1_1 (ssl 모듈)
@anchor{library/ssl ssl OP_NO_TLSv1_1}@anchor{3a03}
@deffn {데이터} ssl.OP_NO_TLSv1_1

TLSv1.1 연결을 금지합니다. 이 옵션은 @ref{39ea,,PROTOCOL_TLS}와 결합해서만 적용할 수 있습니다. 피어가 TLSv1.1을 프로토콜 버전으로 선택하지 못하게 합니다. openssl 버전 1.0.1+ 에서만 사용할 수 있습니다.


Added in version 3.4.



버전 3.7부터 폐지됨: 이 옵션은 OpenSSL 1.1.0부터 폐지되었습니다.

@end deffn

@geindex OP_NO_TLSv1_2 (ssl 모듈)
@anchor{library/ssl ssl OP_NO_TLSv1_2}@anchor{3a04}
@deffn {데이터} ssl.OP_NO_TLSv1_2

TLSv1.2 연결을 방지합니다. 이 옵션은 @ref{39ea,,PROTOCOL_TLS}와 결합해서만 적용할 수 있습니다. 피어가 프로토콜 버전으로 TLSv1.2를 선택하지 못하게 합니다. openssl 버전 1.0.1+ 에서만 사용할 수 있습니다.


Added in version 3.4.



버전 3.7부터 폐지됨: 이 옵션은 OpenSSL 1.1.0부터 폐지되었습니다.

@end deffn

@geindex OP_NO_TLSv1_3 (ssl 모듈)
@anchor{library/ssl ssl OP_NO_TLSv1_3}@anchor{1c59}
@deffn {데이터} ssl.OP_NO_TLSv1_3

TLSv1.3 연결을 방지합니다. 이 옵션은 @ref{39ea,,PROTOCOL_TLS}와 결합해서만 적용할 수 있습니다. 피어가 프로토콜 버전으로 TLSv1.3을 선택하지 못하게 합니다. TLS 1.3은 OpenSSL 1.1.1 이상에서 사용할 수 있습니다. 파이썬이 OpenSSL의 이전 버전에 대해 컴파일되면, 플래그의 기본값은 `0'입니다.


Added in version 3.6.3.



버전 3.7부터 폐지됨: The option is deprecated since OpenSSL 1.1.0. It was added to 2.7.15 and
3.6.3 for backwards compatibility with OpenSSL 1.0.2.

@end deffn

@geindex OP_NO_RENEGOTIATION (ssl 모듈)
@anchor{library/ssl ssl OP_NO_RENEGOTIATION}@anchor{3a05}
@deffn {데이터} ssl.OP_NO_RENEGOTIATION

TLSv1.2와 그 이전 버전에서 모든 재협상을 비활성화합니다. HelloRequest 메시지를 보내지 않고, ClientHello를 통한 재협상 요청을 무시합니다.

이 옵션은 OpenSSL 1.1.0h 이상에서만 사용할 수 있습니다.


Added in version 3.7.

@end deffn

@geindex OP_CIPHER_SERVER_PREFERENCE (ssl 모듈)
@anchor{library/ssl ssl OP_CIPHER_SERVER_PREFERENCE}@anchor{134e}
@deffn {데이터} ssl.OP_CIPHER_SERVER_PREFERENCE

클라이언트보다는 서버의 사이퍼 순서 선호를 사용합니다. 이 옵션은 클라이언트 소켓과 SSLv2 서버 소켓에는 영향을 미치지 않습니다.


Added in version 3.3.

@end deffn

@geindex OP_SINGLE_DH_USE (ssl 모듈)
@anchor{library/ssl ssl OP_SINGLE_DH_USE}@anchor{3a06}
@deffn {데이터} ssl.OP_SINGLE_DH_USE

Prevents reuse of the same DH key for distinct SSL sessions.  This
improves forward secrecy but requires more computational resources.
This option only applies to server sockets.


Added in version 3.3.

@end deffn

@geindex OP_SINGLE_ECDH_USE (ssl 모듈)
@anchor{library/ssl ssl OP_SINGLE_ECDH_USE}@anchor{3a07}
@deffn {데이터} ssl.OP_SINGLE_ECDH_USE

Prevents reuse of the same ECDH key for distinct SSL sessions.  This
improves forward secrecy but requires more computational resources.
This option only applies to server sockets.


Added in version 3.3.

@end deffn

@geindex OP_ENABLE_MIDDLEBOX_COMPAT (ssl 모듈)
@anchor{library/ssl ssl OP_ENABLE_MIDDLEBOX_COMPAT}@anchor{3a08}
@deffn {데이터} ssl.OP_ENABLE_MIDDLEBOX_COMPAT

TLS 1.3 연결을 더 TLS 1.2 연결처럼 보이게 하려고 TLS 1.3 핸드 셰이크에서 더미 암호 변경 사양(CCS - Change Cipher Spec) 메시지를 보냅니다.

이 옵션은 OpenSSL 1.1.1 이상에서만 사용할 수 있습니다.


Added in version 3.8.

@end deffn

@geindex OP_NO_COMPRESSION (ssl 모듈)
@anchor{library/ssl ssl OP_NO_COMPRESSION}@anchor{134b}
@deffn {데이터} ssl.OP_NO_COMPRESSION

SSL 채널에서 압축을 사용하지 않습니다. 응용 프로그램 프로토콜이 자체 압축 방법을 지원할 때 유용합니다.


Added in version 3.3.

@end deffn

@geindex Options (ssl 클래스)
@anchor{library/ssl ssl Options}@anchor{3a09}
@deffn {클래스} ssl.Options

OP_* 상수의 @ref{e99,,enum.IntFlag} 컬렉션.
@end deffn

@geindex OP_NO_TICKET (ssl 모듈)
@anchor{library/ssl ssl OP_NO_TICKET}@anchor{3a0a}
@deffn {데이터} ssl.OP_NO_TICKET

클라이언트 측에서 세션 티켓을 요청하지 못하게 합니다.


Added in version 3.6.

@end deffn

@geindex OP_IGNORE_UNEXPECTED_EOF (ssl 모듈)
@anchor{library/ssl ssl OP_IGNORE_UNEXPECTED_EOF}@anchor{a38}
@deffn {데이터} ssl.OP_IGNORE_UNEXPECTED_EOF

Ignore unexpected shutdown of TLS connections.

This option is only available with OpenSSL 3.0.0 and later.


Added in version 3.10.

@end deffn

@geindex OP_ENABLE_KTLS (ssl 모듈)
@anchor{library/ssl ssl OP_ENABLE_KTLS}@anchor{1b0d}
@deffn {데이터} ssl.OP_ENABLE_KTLS

Enable the use of the kernel TLS. To benefit from the feature, OpenSSL must
have been compiled with support for it, and the negotiated cipher suites and
extensions must be supported by it (a list of supported ones may vary by
platform and kernel version).

Note that with enabled kernel TLS some cryptographic operations are
performed by the kernel directly and not via any available OpenSSL
Providers. This might be undesirable if, for example, the application
requires all cryptographic operations to be performed by the FIPS provider.

This option is only available with OpenSSL 3.0.0 and later.


Added in version 3.12.

@end deffn

@geindex OP_LEGACY_SERVER_CONNECT (ssl 모듈)
@anchor{library/ssl ssl OP_LEGACY_SERVER_CONNECT}@anchor{1aef}
@deffn {데이터} ssl.OP_LEGACY_SERVER_CONNECT

Allow legacy insecure renegotiation between OpenSSL and unpatched servers
only.


Added in version 3.12.

@end deffn

@geindex HAS_ALPN (ssl 모듈)
@anchor{library/ssl ssl HAS_ALPN}@anchor{1065}
@deffn {데이터} ssl.HAS_ALPN

OpenSSL 라이브러리가 
@geindex RFC; RFC 7301
RFC 7301@footnote{https://datatracker.ietf.org/doc/html/rfc7301.html}에서 설명한 대로 `응용 계층 프로토콜 협상(Application-Layer Protocol Negotiation)' TLS 확장에 대한 지원을 기본 제공하는지 여부


Added in version 3.5.

@end deffn

@geindex HAS_NEVER_CHECK_COMMON_NAME (ssl 모듈)
@anchor{library/ssl ssl HAS_NEVER_CHECK_COMMON_NAME}@anchor{3a0b}
@deffn {데이터} ssl.HAS_NEVER_CHECK_COMMON_NAME

OpenSSL 라이브러리가 SCN(subject common name)을 검사하지 않는 지원을 기본 제공하고 @ref{d75,,SSLContext.hostname_checks_common_name}가 쓰기 가능한지 아닌지.


Added in version 3.7.

@end deffn

@geindex HAS_ECDH (ssl 모듈)
@anchor{library/ssl ssl HAS_ECDH}@anchor{3a0c}
@deffn {데이터} ssl.HAS_ECDH

OpenSSL 라이브러리가 타원 곡선(Elliptic Curve) 기반 Diffie-Hellman 키 교환 지원을 기본 제공하는지 여부. 기능이 배포자에 의해 명시적으로 비활성화되어 있지 않은 한, 참이어야 합니다.


Added in version 3.3.

@end deffn

@geindex HAS_SNI (ssl 모듈)
@anchor{library/ssl ssl HAS_SNI}@anchor{3a0d}
@deffn {데이터} ssl.HAS_SNI

OpenSSL 라이브러리가 `서버 이름 표시(Server Name Indication)' 확장(
@geindex RFC; RFC 6066
RFC 6066@footnote{https://datatracker.ietf.org/doc/html/rfc6066.html}에 정의된 대로)에 대한 지원을 기본 제공하는지 여부.


Added in version 3.2.

@end deffn

@geindex HAS_NPN (ssl 모듈)
@anchor{library/ssl ssl HAS_NPN}@anchor{3a0e}
@deffn {데이터} ssl.HAS_NPN

OpenSSL 라이브러리가 Application Layer Protocol Negotiation@footnote{https://en.wikipedia.org/wiki/Application-Layer_Protocol_Negotiation}에 설명된 대로 `NPN(Next Protocol Negotiation)'에 대한 지원을 기본 제공하는지 여부. 참이면 @ref{358,,SSLContext.set_npn_protocols()} 메서드를 사용하여 지원할 프로토콜을 알릴 수 있습니다.


Added in version 3.3.

@end deffn

@geindex HAS_SSLv2 (ssl 모듈)
@anchor{library/ssl ssl HAS_SSLv2}@anchor{3a0f}
@deffn {데이터} ssl.HAS_SSLv2

OpenSSL 라이브러리가 SSL 2.0 프로토콜 지원을 기본 제공하는지 여부


Added in version 3.7.

@end deffn

@geindex HAS_SSLv3 (ssl 모듈)
@anchor{library/ssl ssl HAS_SSLv3}@anchor{3a10}
@deffn {데이터} ssl.HAS_SSLv3

OpenSSL 라이브러리가 SSL 3.0 프로토콜 지원을 기본 제공하는지 여부


Added in version 3.7.

@end deffn

@geindex HAS_TLSv1 (ssl 모듈)
@anchor{library/ssl ssl HAS_TLSv1}@anchor{3a11}
@deffn {데이터} ssl.HAS_TLSv1

OpenSSL 라이브러리가 TLS 1.0 프로토콜 지원을 기본 제공하는지 여부


Added in version 3.7.

@end deffn

@geindex HAS_TLSv1_1 (ssl 모듈)
@anchor{library/ssl ssl HAS_TLSv1_1}@anchor{d7b}
@deffn {데이터} ssl.HAS_TLSv1_1

OpenSSL 라이브러리가 TLS 1.1 프로토콜 지원을 기본 제공하는지 여부


Added in version 3.7.

@end deffn

@geindex HAS_TLSv1_2 (ssl 모듈)
@anchor{library/ssl ssl HAS_TLSv1_2}@anchor{3a12}
@deffn {데이터} ssl.HAS_TLSv1_2

OpenSSL 라이브러리가 TLS 1.2 프로토콜 지원을 기본 제공하는지 여부


Added in version 3.7.

@end deffn

@geindex HAS_TLSv1_3 (ssl 모듈)
@anchor{library/ssl ssl HAS_TLSv1_3}@anchor{3a13}
@deffn {데이터} ssl.HAS_TLSv1_3

OpenSSL 라이브러리가 TLS 1.3 프로토콜 지원을 기본 제공하는지 여부


Added in version 3.7.

@end deffn

@geindex HAS_PSK (ssl 모듈)
@anchor{library/ssl ssl HAS_PSK}@anchor{3a14}
@deffn {데이터} ssl.HAS_PSK

Whether the OpenSSL library has built-in support for TLS-PSK.


Added in version 3.13.

@end deffn

@geindex HAS_PHA (ssl 모듈)
@anchor{library/ssl ssl HAS_PHA}@anchor{286}
@deffn {데이터} ssl.HAS_PHA

Whether the OpenSSL library has built-in support for TLS-PHA.


Added in version 3.14.

@end deffn

@geindex CHANNEL_BINDING_TYPES (ssl 모듈)
@anchor{library/ssl ssl CHANNEL_BINDING_TYPES}@anchor{3a15}
@deffn {데이터} ssl.CHANNEL_BINDING_TYPES

지원되는 TLS 채널 바인딩 유형의 리스트. 이 리스트의 문자열은 @ref{1349,,SSLSocket.get_channel_binding()}에 대한 인자로 사용될 수 있습니다.


Added in version 3.3.

@end deffn

@geindex OPENSSL_VERSION (ssl 모듈)
@anchor{library/ssl ssl OPENSSL_VERSION}@anchor{1423}
@deffn {데이터} ssl.OPENSSL_VERSION

인터프리터에 의해 로드된 OpenSSL 라이브러리의 버전 문자열:

@example
>>> ssl.OPENSSL_VERSION
'OpenSSL 1.0.2k  26 Jan 2017'
@end example


Added in version 3.2.

@end deffn

@geindex OPENSSL_VERSION_INFO (ssl 모듈)
@anchor{library/ssl ssl OPENSSL_VERSION_INFO}@anchor{1424}
@deffn {데이터} ssl.OPENSSL_VERSION_INFO

OpenSSL 라이브러리에 대한 버전 정보를 나타내는 5개의 정수 튜플:

@example
>>> ssl.OPENSSL_VERSION_INFO
(1, 0, 2, 11, 15)
@end example


Added in version 3.2.

@end deffn

@geindex OPENSSL_VERSION_NUMBER (ssl 모듈)
@anchor{library/ssl ssl OPENSSL_VERSION_NUMBER}@anchor{1425}
@deffn {데이터} ssl.OPENSSL_VERSION_NUMBER

단일 정수로 표현되는, OpenSSL 라이브러리의 원시 버전 번호:

@example
>>> ssl.OPENSSL_VERSION_NUMBER
268443839
>>> hex(ssl.OPENSSL_VERSION_NUMBER)
'0x100020bf'
@end example


Added in version 3.2.

@end deffn

@geindex ALERT_DESCRIPTION_HANDSHAKE_FAILURE (ssl 모듈)
@geindex ALERT_DESCRIPTION_INTERNAL_ERROR (ssl 모듈)
@anchor{library/ssl ssl ALERT_DESCRIPTION_HANDSHAKE_FAILURE}@anchor{3a16}
@deffn {데이터} ssl.ALERT_DESCRIPTION_HANDSHAKE_FAILURE
@anchor{library/ssl ssl ALERT_DESCRIPTION_INTERNAL_ERROR}@anchor{3a17}
@deffnx {데이터} ssl.ALERT_DESCRIPTION_INTERNAL_ERROR

@deffnx {데이터} ALERT_DESCRIPTION_*

@geindex RFC; RFC 5246
RFC 5246@footnote{https://datatracker.ietf.org/doc/html/rfc5246.html} 및 기타의 경고 설명. IANA TLS Alert Registry@footnote{https://www.iana.org/assignments/tls-parameters/tls-parameters.xml#tls-parameters-6}에는 이 목록과 그 의미가 정의된 RFC에 대한 참조가 들어 있습니다.

@ref{11b6,,SSLContext.set_servername_callback()}에서 콜백 함수의 반환 값으로 사용됩니다.


Added in version 3.4.

@end deffn

@geindex AlertDescription (ssl 클래스)
@anchor{library/ssl ssl AlertDescription}@anchor{3a18}
@deffn {클래스} ssl.AlertDescription

ALERT_DESCRIPTION_* 상수의 @ref{eda,,enum.IntEnum} 컬렉션.


Added in version 3.6.

@end deffn

@geindex Purpose.SERVER_AUTH (ssl 모듈)
@anchor{library/ssl ssl Purpose SERVER_AUTH}@anchor{11b2}
@deffn {데이터} Purpose.SERVER_AUTH

Option for @ref{480,,create_default_context()} and
@ref{11b1,,SSLContext.load_default_certs()}.  This value indicates that the
context may be used to authenticate web servers (therefore, it will
be used to create client-side sockets).


Added in version 3.4.

@end deffn

@geindex Purpose.CLIENT_AUTH (ssl 모듈)
@anchor{library/ssl ssl Purpose CLIENT_AUTH}@anchor{11b3}
@deffn {데이터} Purpose.CLIENT_AUTH

Option for @ref{480,,create_default_context()} and
@ref{11b1,,SSLContext.load_default_certs()}.  This value indicates that the
context may be used to authenticate web clients (therefore, it will
be used to create server-side sockets).


Added in version 3.4.

@end deffn

@geindex SSLErrorNumber (ssl 클래스)
@anchor{library/ssl ssl SSLErrorNumber}@anchor{3a19}
@deffn {클래스} ssl.SSLErrorNumber

SSL_ERROR_* 상수의 @ref{eda,,enum.IntEnum} 컬렉션.


Added in version 3.6.

@end deffn

@geindex TLSVersion (ssl 클래스)
@anchor{library/ssl ssl TLSVersion}@anchor{3a1a}
@deffn {클래스} ssl.TLSVersion

@ref{a71,,SSLContext.maximum_version}과 @ref{a70,,SSLContext.minimum_version} 용 SSL과 TLS 버전의 @ref{eda,,enum.IntEnum} 컬렉션.


Added in version 3.7.

@end deffn

@geindex MINIMUM_SUPPORTED (ssl.TLSVersion의 속성)
@anchor{library/ssl ssl TLSVersion MINIMUM_SUPPORTED}@anchor{3a1b}
@deffn {속성} TLSVersion.MINIMUM_SUPPORTED
@end deffn

@geindex MAXIMUM_SUPPORTED (ssl.TLSVersion의 속성)
@anchor{library/ssl ssl TLSVersion MAXIMUM_SUPPORTED}@anchor{3a1c}
@deffn {속성} TLSVersion.MAXIMUM_SUPPORTED

지원되는 SSL 또는 TLS 버전의 최소 또는 최대. 이것들은 마법 상수(magic constant)입니다. 이들의 값은 사용 가능한 가장 낮거나 높은 TLS/SSL 버전을 반영하지 않습니다.
@end deffn

@geindex SSLv3 (ssl.TLSVersion의 속성)
@anchor{library/ssl ssl TLSVersion SSLv3}@anchor{3a1d}
@deffn {속성} TLSVersion.SSLv3
@end deffn

@geindex TLSv1 (ssl.TLSVersion의 속성)
@anchor{library/ssl ssl TLSVersion TLSv1}@anchor{3a1e}
@deffn {속성} TLSVersion.TLSv1
@end deffn

@geindex TLSv1_1 (ssl.TLSVersion의 속성)
@anchor{library/ssl ssl TLSVersion TLSv1_1}@anchor{3a1f}
@deffn {속성} TLSVersion.TLSv1_1
@end deffn

@geindex TLSv1_2 (ssl.TLSVersion의 속성)
@anchor{library/ssl ssl TLSVersion TLSv1_2}@anchor{3a20}
@deffn {속성} TLSVersion.TLSv1_2
@end deffn

@geindex TLSv1_3 (ssl.TLSVersion의 속성)
@anchor{library/ssl ssl TLSVersion TLSv1_3}@anchor{3a21}
@deffn {속성} TLSVersion.TLSv1_3

SSL 3.0 에서 TLS 1.3.


버전 3.10부터 폐지됨: All @ref{3a1a,,TLSVersion} members except @ref{3a20,,TLSVersion.TLSv1_2} and
@code{TLSVersion.TLSv1_3} are deprecated.

@end deffn

@node SSL sockets,SSL contexts,Functions constants and exceptions,ssl — TLS/SSL wrapper for socket objects
@anchor{library/ssl ssl-sockets}@anchor{3a22}
@subsubsection SSL sockets


@geindex SSLSocket (ssl 클래스)
@anchor{library/ssl ssl SSLSocket}@anchor{ae7}
@deffn {클래스} ssl.SSLSocket (socket.socket)

SSL 소켓은 다음과 같은 @ref{39c8,,소켓 객체} 메서드를 제공합니다:


@itemize -

@item 
@ref{fa1,,accept()}

@item 
@ref{173f,,bind()}

@item 
@ref{f3e,,close()}

@item 
@ref{fa2,,connect()}

@item 
@ref{1421,,detach()}

@item 
@ref{39d6,,fileno()}

@item 
@ref{3909,,getpeername()}, @ref{284,,getsockname()}

@item 
@ref{ecf,,getsockopt()}, @ref{ed0,,setsockopt()}

@item 
@ref{39d7,,gettimeout()}, @ref{3988,,settimeout()},
@ref{3063,,setblocking()}

@item 
@ref{105d,,listen()}

@item 
@ref{13a4,,makefile()}

@item 
@ref{fa3,,recv()}, @ref{1522,,recv_into()}
(but passing a non-zero @code{flags} argument is not allowed)

@item 
@ref{fa6,,send()}, @ref{fa7,,sendall()} (with
the same limitation)

@item 
@ref{105c,,sendfile()} (but @ref{d04,,os.sendfile} will be used
for plain-text sockets only, else @ref{fa6,,send()} will be used)

@item 
@ref{39c5,,shutdown()}
@end itemize

그러나 SSL (및 TLS) 프로토콜은 TCP 위에 자체 프레임을 가지고 있으므로, SSL 소켓 추상화는 특정 측면에서 정상적인 OS 수준 소켓의 사양에서 벗어날 수 있습니다. 특히 @ref{39ed,,비 블로킹 소켓에 대한 참고 사항}을 보십시오.

@ref{ae7,,SSLSocket}의 인스턴스는 @ref{747,,SSLContext.wrap_socket()} 메서드를 사용하여 민들어야 합니다.


버전 3.5에서 변경: @code{sendfile()} 메서드가 추가되었습니다.



버전 3.5에서 변경: The @code{shutdown()} does not reset the socket timeout each time bytes
are received or sent. The socket timeout is now the maximum total duration
of the shutdown.



버전 3.6부터 폐지됨: @ref{ae7,,SSLSocket} 인스턴스를 직접 만드는 것은 폐지되었습니다, @ref{747,,SSLContext.wrap_socket()}를 사용하여 소켓을 감싸십시오.



버전 3.7에서 변경: @ref{ae7,,SSLSocket} 인스턴스는 @ref{747,,wrap_socket()}로 만들어야 합니다. 이전 버전에서는 직접 인스턴스를 만들 수 있었습니다. 이것은 문서로 만들어지거나 공식적으로 지원된 적이 없습니다.



버전 3.10에서 변경: Python now uses @code{SSL_read_ex} and @code{SSL_write_ex} internally. The
functions support reading and writing of data larger than 2 GB. Writing
zero-length data no longer fails with a protocol violation error.

@end deffn

SSL 소켓에는 다음과 같은 추가 메서드와 어트리뷰트도 있습니다:

@geindex read() (ssl.SSLSocket 메서드)
@anchor{library/ssl ssl SSLSocket read}@anchor{106d}
@deffn {메서드} SSLSocket.read (len=1024, buffer=None)

SSL 소켓에서 최대 `len' 바이트의 데이터를 읽고 그 결과를 @code{bytes} 인스턴스로 반환합니다. `buffer'가 지정되면, 대신 버퍼로 읽어 들이고, 읽은 바이트 수를 반환합니다.

소켓이 @ref{39ed,,비 블로킹}이고 읽기가 블록 되려고 하면 @ref{1068,,SSLWantReadError} 나 @ref{1069,,SSLWantWriteError}를 발생시킵니다.

언제나 재협상이 가능하므로, @ref{106d,,read()}를 호출해도 쓰기 연산이 발생할 수 있습니다.


버전 3.5에서 변경: The socket timeout is no longer reset each time bytes are received or sent.
The socket timeout is now the maximum total duration to read up to `len'
bytes.



버전 3.6부터 폐지됨: @ref{106d,,read()} 대신 @code{recv()}를 사용하십시오.

@end deffn

@geindex write() (ssl.SSLSocket 메서드)
@anchor{library/ssl ssl SSLSocket write}@anchor{106e}
@deffn {메서드} SSLSocket.write (data)

Write `data' to the SSL socket and return the number of bytes written. The
`data' argument must be an object supporting the buffer interface.

소켓이 @ref{39ed,,비 블로킹}이고, 쓰기가 블록 하려고 하면 @ref{1068,,SSLWantReadError} 나 @ref{1069,,SSLWantWriteError}를 발생시킵니다.

언제나 재협상이 가능하므로, @ref{106e,,write()}를 호출해도 읽기 연산이 발생할 수 있습니다.


버전 3.5에서 변경: The socket timeout is no longer reset each time bytes are received or sent.
The socket timeout is now the maximum total duration to write `data'.



버전 3.6부터 폐지됨: @ref{106e,,write()} 대신 @code{send()}를 사용하십시오.

@end deffn

@cartouche
@quotation 참고 
@ref{106d,,read()} 과 @ref{106e,,write()} 메서드는 암호화되지 않은 응용 프로그램 수준 데이터를 읽고 쓰고 그것을 암호화되고 와이어 수준(wire-level) 데이터로 복호화/암호화하는 저수준 메서드입니다. 이 메서드는 활성화된 SSL 연결, 즉, 핸드 셰이크가 완료되고, @ref{3a23,,SSLSocket.unwrap()}가 호출되지 않은 것이 필요합니다.

일반적으로 이러한 메서드 대신 @ref{fa3,,recv()} 와 @ref{fa6,,send()}와 같은 소켓 API 메서드를 사용해야합니다.
@end quotation
@end cartouche

@geindex do_handshake() (ssl.SSLSocket 메서드)
@anchor{library/ssl ssl SSLSocket do_handshake}@anchor{106c}
@deffn {메서드} SSLSocket.do_handshake (block=False)

SSL 설정 핸드 셰이크를 수행합니다.

If `block' is true and the timeout obtained by @ref{39d7,,gettimeout()}
is zero, the socket is set in blocking mode until the handshake is performed.


버전 3.4에서 변경: The handshake method also performs @code{match_hostname()} when the
@ref{39fb,,check_hostname} attribute of the socket’s
@ref{3a24,,context} is true.



버전 3.5에서 변경: The socket timeout is no longer reset each time bytes are received or sent.
The socket timeout is now the maximum total duration of the handshake.



버전 3.7에서 변경: Hostname or IP address is matched by OpenSSL during handshake. The
function @code{match_hostname()} is no longer used. In case OpenSSL
refuses a hostname or IP address, the handshake is aborted early and
a TLS alert message is sent to the peer.

@end deffn

@geindex getpeercert() (ssl.SSLSocket 메서드)
@anchor{library/ssl ssl SSLSocket getpeercert}@anchor{11b7}
@deffn {메서드} SSLSocket.getpeercert (binary_form=False)

연결의 다른 끝의 피어에 대한 인증서가 없으면 @code{None}을 반환합니다. SSL 핸드 셰이크가 아직 수행되지 않았으면, @ref{2ec,,ValueError}를 발생시킵니다.

@code{binary_form} 매개 변수가 @ref{d2a,,False}이고, 피어에서 인증서를 받았으면, 이 메서드는 @ref{183,,dict} 인스턴스를 반환합니다. 인증서의 유효성을 검사하지 않았으면, 딕셔너리는 비어 있습니다. 인증서의 유효성을 검사했으면 @code{subject}(인증서가 발행된 주체)와 @code{issuer}(인증서를 발급한 주체)와 같은 몇 가지 키가 있는 dict를 반환합니다. 인증서가 `SAN(Subject Alternative Name)' 확장(
@geindex RFC; RFC 3280
RFC 3280@footnote{https://datatracker.ietf.org/doc/html/rfc3280.html} 참조)의 인스턴스를 포함하면 딕셔너리에 @code{subjectAltName} 키도 있습니다.

@code{subject} 와 @code{issuer} 필드는 각 필드에 대한 인증서의 데이터 구조에 제공된 RDN(relative distinguished name)의 시퀀스를 포함하는 튜플이며, 각 RDN은 이름-값 쌍의 시퀀스입니다. 실제 예를 들어 보겠습니다:

@example
@{'issuer': ((('countryName', 'IL'),),
            (('organizationName', 'StartCom Ltd.'),),
            (('organizationalUnitName',
              'Secure Digital Certificate Signing'),),
            (('commonName',
              'StartCom Class 2 Primary Intermediate Server CA'),)),
 'notAfter': 'Nov 22 08:15:19 2013 GMT',
 'notBefore': 'Nov 21 03:09:52 2011 GMT',
 'serialNumber': '95F0',
 'subject': ((('description', '571208-SLe257oHY9fVQ07Z'),),
             (('countryName', 'US'),),
             (('stateOrProvinceName', 'California'),),
             (('localityName', 'San Francisco'),),
             (('organizationName', 'Electronic Frontier Foundation, Inc.'),),
             (('commonName', '*.eff.org'),),
             (('emailAddress', 'hostmaster@@eff.org'),)),
 'subjectAltName': (('DNS', '*.eff.org'), ('DNS', 'eff.org')),
 'version': 3@}
@end example

@code{binary_form} 매개 변수가 @ref{e06,,True}이고, 인증서가 제공되었으면, 이 메서드는 전체 인증서의 DER-인코딩 형식을 바이트 시퀀스로 반환하고, 피어가 인증서를 제공하지 않았으면 @ref{884,,None}을 반환합니다. 피어가 인증서를 제공하는지는 SSL 소켓의 역할에 따라 다릅니다:


@itemize *

@item 
클라이언트 SSL 소켓의 경우, 서버는 유효성 검사가 필요한지에 관계없이 항상 인증서를 제공합니다.

@item 
서버 SSL 소켓의 경우, 클라이언트는 서버가 요청할 때만 인증서를 제공합니다; 따라서 @ref{39f9,,CERT_NONE}(@ref{39fa,,CERT_OPTIONAL} 나 @ref{39e8,,CERT_REQUIRED} 대신)을 사용하면 @ref{11b7,,getpeercert()}는 @ref{884,,None}을 반환합니다.
@end itemize

See also @ref{39fb,,SSLContext.check_hostname}.


버전 3.2에서 변경: 반환된 딕셔너리에는 @code{issuer} 와 @code{notBefore}와 같은 추가 항목이 포함됩니다.



버전 3.4에서 변경: 핸드 셰이크가 완료되지 않았으면 @ref{2ec,,ValueError}가 발생합니다. 반환된 딕셔너리에는 @code{crlDistributionPoints}, @code{caIssuers} 및 @code{OCSP} URI와 같은 추가 X509v3 확장 항목이 포함됩니다.



버전 3.9에서 변경: IPv6 주소 문자열에는 더는 후행 줄 바꿈이 없습니다.

@end deffn

@geindex get_verified_chain() (ssl.SSLSocket 메서드)
@anchor{library/ssl ssl SSLSocket get_verified_chain}@anchor{195d}
@deffn {메서드} SSLSocket.get_verified_chain ()

Returns verified certificate chain provided by the other
end of the SSL channel as a list of DER-encoded bytes.
If certificate verification was disabled method acts the same as
@ref{195e,,get_unverified_chain()}.


Added in version 3.13.

@end deffn

@geindex get_unverified_chain() (ssl.SSLSocket 메서드)
@anchor{library/ssl ssl SSLSocket get_unverified_chain}@anchor{195e}
@deffn {메서드} SSLSocket.get_unverified_chain ()

Returns raw certificate chain provided by the other
end of the SSL channel as a list of DER-encoded bytes.


Added in version 3.13.

@end deffn

@geindex cipher() (ssl.SSLSocket 메서드)
@anchor{library/ssl ssl SSLSocket cipher}@anchor{390a}
@deffn {메서드} SSLSocket.cipher ()

사용되는 사이퍼의 이름, 그것의 사용을 정의하는 SSL 프로토콜의 버전 및 사용되는 비밀 비트의 수를 포함하는 3-튜플을 반환합니다. 연결이 이루어지지 않았으면 @code{None}을 반환합니다.
@end deffn

@geindex shared_ciphers() (ssl.SSLSocket 메서드)
@anchor{library/ssl ssl SSLSocket shared_ciphers}@anchor{106b}
@deffn {메서드} SSLSocket.shared_ciphers ()

Return the list of ciphers available in both the client and server.  Each
entry of the returned list is a three-value tuple containing the name of the
cipher, the version of the SSL protocol that defines its use, and the number
of secret bits the cipher uses.  @code{shared_ciphers()} returns
@code{None} if no connection has been established or the socket is a client
socket.


Added in version 3.5.

@end deffn

@geindex compression() (ssl.SSLSocket 메서드)
@anchor{library/ssl ssl SSLSocket compression}@anchor{134a}
@deffn {메서드} SSLSocket.compression ()

사용되는 압축 알고리즘을 문자열로 반환하거나, 연결이 압축되지 않으면 @code{None}을 반환합니다.

상위-수준 프로토콜이 자체 압축 메커니즘을 지원하면, @ref{134b,,OP_NO_COMPRESSION}을 사용하여 SSL-수준 압축을 비활성화할 수 있습니다.


Added in version 3.3.

@end deffn

@geindex get_channel_binding() (ssl.SSLSocket 메서드)
@anchor{library/ssl ssl SSLSocket get_channel_binding}@anchor{1349}
@deffn {메서드} SSLSocket.get_channel_binding (cb_type='tls-unique')

현재 연결에 대한 채널 바인딩 데이터를 바이트열 객체로 가져옵니다. 연결되어 있지 않거나 핸드 셰이크가 완료되지 않았으면 @code{None}을 반환합니다.

`cb_type' 매개 변수를 사용하여 원하는 채널 바인딩 유형을 선택할 수 있습니다. 유효한 채널 바인딩 유형은 @ref{3a15,,CHANNEL_BINDING_TYPES} 리스트에 나열됩니다. 현재는 
@geindex RFC; RFC 5929
RFC 5929@footnote{https://datatracker.ietf.org/doc/html/rfc5929.html}가 정의한 ‘tls-unique’ 채널 바인딩만 지원됩니다. 지원되지 않는 채널 바인딩 유형이 요청되면 @ref{2ec,,ValueError}가 발생합니다.


Added in version 3.3.

@end deffn

@geindex selected_alpn_protocol() (ssl.SSLSocket 메서드)
@anchor{library/ssl ssl SSLSocket selected_alpn_protocol}@anchor{1064}
@deffn {메서드} SSLSocket.selected_alpn_protocol ()

TLS 핸드 셰이크 중에 선택된 프로토콜을 반환합니다. @ref{1063,,SSLContext.set_alpn_protocols()}가 호출되지 않았거나, 상대방이 ALPN을 지원하지 않거나, 이 소켓이 클라이언트가 제안한 프로토콜 중 어떤 것도 지원하지 않거나, 핸드 셰이크가 아직 발생하지 않았으면 @code{None}이 반환됩니다.


Added in version 3.5.

@end deffn

@geindex selected_npn_protocol() (ssl.SSLSocket 메서드)
@anchor{library/ssl ssl SSLSocket selected_npn_protocol}@anchor{a74}
@deffn {메서드} SSLSocket.selected_npn_protocol ()

TLS/SSL 핸드 셰이크 중에 선택된 상위-수준의 프로토콜을 반환합니다. @ref{358,,SSLContext.set_npn_protocols()}가 호출되지 않았거나, 상대방이 NPN을 지원하지 않거나, 핸드 셰이크가 아직 발생하지 않았으면 @code{None}을 반환합니다.


Added in version 3.3.



버전 3.10부터 폐지됨: NPN has been superseded by ALPN

@end deffn

@geindex unwrap() (ssl.SSLSocket 메서드)
@anchor{library/ssl ssl SSLSocket unwrap}@anchor{3a23}
@deffn {메서드} SSLSocket.unwrap ()

SSL 종료 핸드 셰이크를 수행해서 하부 소켓에서 TLS 계층을 제거하고, 하부 소켓 객체를 반환합니다. 이것은 연결을 통한 암호화된 연산에서 암호화되지 않은 것으로 이동하는 데 사용할 수 있습니다. 원래 소켓이 아닌 반환된 소켓을 연결의 다른 쪽과 계속 통신하기 위해 항상 사용해야 합니다.
@end deffn

@geindex verify_client_post_handshake() (ssl.SSLSocket 메서드)
@anchor{library/ssl ssl SSLSocket verify_client_post_handshake}@anchor{c26}
@deffn {메서드} SSLSocket.verify_client_post_handshake ()

TLS 1.3 클라이언트로부터 PHA(post-handshake authentication)를 요청합니다. PHA는 양쪽에서 PHA가 활성화된 초기 TLS 핸드 셰이크 후에 서버 측 소켓에서 TLS 1.3 연결에 대해서만 시작할 수 있습니다, @ref{c25,,SSLContext.post_handshake_auth}를 참조하세요.

이 메서드는 즉시 인증서 교환을 수행하지 않습니다. 서버 측은 다음 쓰기 이벤트 중에 CertificateRequest를 보내고 클라이언트가 다음 읽기 이벤트에서 인증서로 응답할 것으로 기대합니다.

사전 조건이 모두 충족되지 않으면 (예를 들어, TLS 1.3이 아니거나 PHA가 활성화되지 않았을 때), @ref{147e,,SSLError}가 발생합니다.

@cartouche
@quotation 참고 
OpenSSL 1.1.1과 TLS 1.3이 활성화된 경우에만 사용할 수 있습니다. TLS 1.3 지원이 없으면, 이 메서드는 @ref{36b,,NotImplementedError}를 발생시킵니다.
@end quotation
@end cartouche


Added in version 3.8.

@end deffn

@geindex version() (ssl.SSLSocket 메서드)
@anchor{library/ssl ssl SSLSocket version}@anchor{1067}
@deffn {메서드} SSLSocket.version ()

Return the actual SSL protocol version negotiated by the connection
as a string, or @code{None} if no secure connection is established.
As of this writing, possible return values include @code{"SSLv2"},
@code{"SSLv3"}, @code{"TLSv1"}, @code{"TLSv1.1"} and @code{"TLSv1.2"}.
Recent OpenSSL versions may define more return values.


Added in version 3.5.

@end deffn

@geindex pending() (ssl.SSLSocket 메서드)
@anchor{library/ssl ssl SSLSocket pending}@anchor{3a25}
@deffn {메서드} SSLSocket.pending ()

접속에 계류 중인, 읽기용으로 이미 복호화된 바이트의 수를 돌려줍니다.
@end deffn

@geindex context (ssl.SSLSocket의 속성)
@anchor{library/ssl ssl SSLSocket context}@anchor{3a24}
@deffn {속성} SSLSocket.context

The @ref{357,,SSLContext} object this SSL socket is tied to.


Added in version 3.2.

@end deffn

@geindex server_side (ssl.SSLSocket의 속성)
@anchor{library/ssl ssl SSLSocket server_side}@anchor{3a26}
@deffn {속성} SSLSocket.server_side

서버 측 소켓에서는 @code{True}이고 클라이언트 측 소켓에서는 @code{False} 인 논릿값.


Added in version 3.2.

@end deffn

@geindex server_hostname (ssl.SSLSocket의 속성)
@anchor{library/ssl ssl SSLSocket server_hostname}@anchor{d77}
@deffn {속성} SSLSocket.server_hostname

서버의 호스트 이름: @ref{169,,str} 형, 또는 서버 측 소켓이거나 호스트 이름이 생성자에 지정되지 않았으면 @code{None}.


Added in version 3.2.



버전 3.7에서 변경: 어트리뷰트는 이제 항상 ASCII 텍스트입니다. @code{server_hostname}이 국제화 된 도메인 이름(IDN)일 때, 이 어트리뷰트는 이제 U-레이블 형식(@code{"pythön.org"}) 대신 A-레이블 형식(@code{"xn--pythn-mua.org"})을 저장합니다.

@end deffn

@geindex session (ssl.SSLSocket의 속성)
@anchor{library/ssl ssl SSLSocket session}@anchor{193e}
@deffn {속성} SSLSocket.session

이 SSL 연결을 위한 @ref{ed8,,SSLSession}. 이 세션은 TLS 핸드 셰이크가 수행된 후 클라이언트와 서버 측 소켓에서 사용할 수 있습니다. 클라이언트 소켓의 경우 세션을 다시 사용하기 위해 @ref{106c,,do_handshake()}가 호출되기 전에 세션을 설정할 수 있습니다.


Added in version 3.6.

@end deffn

@geindex session_reused (ssl.SSLSocket의 속성)
@anchor{library/ssl ssl SSLSocket session_reused}@anchor{3a27}
@deffn {속성} SSLSocket.session_reused


Added in version 3.6.

@end deffn

@node SSL contexts,인증서,SSL sockets,ssl — TLS/SSL wrapper for socket objects
@anchor{library/ssl ssl-contexts}@anchor{3a28}
@subsubsection SSL contexts



Added in version 3.2.


SSL 컨텍스트는 SSL 구성 옵션, 인증서 및 개인 키와 같이 단일 SSL 연결보다 수명이 긴 다양한 데이터를 보관합니다. 또한, 같은 클라이언트의 반복된 연결 속도를 높이기 위해 서버 측 소켓에 대한 SSL 세션 캐시를 관리합니다.

@geindex SSLContext (ssl 클래스)
@anchor{library/ssl ssl SSLContext}@anchor{357}
@deffn {클래스} ssl.SSLContext (protocol=None)

새 SSL 컨텍스트를 만듭니다. `protocol'를 전달할 수 있는데, 이 모듈에 정의된 @code{PROTOCOL_*} 상수 중 하나여야 합니다. 매개 변수는 사용할 SSL 프로토콜의 버전을 지정합니다. 일반적으로 서버는 특정 프로토콜 버전을 선택하고, 클라이언트는 서버의 선택에 적응해야 합니다. 대부분의 버전은 다른 버전과 상호 운용할 수 없습니다. 지정하지 않으면, 기본값은 @ref{39ea,,PROTOCOL_TLS}입니다; 다른 버전과의 호환성이 가장 뛰어납니다.

다음은 클라이언트의 어느 버전(행)이 서버의 어떤 버전(열)에 연결할 수 있는지 보여주는 표입니다:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxx} {xxxxxxxxxxxxxx} {xxxxxxxxxxxxxxx} {xxxxxxxxxxx} {xxxxxxxxxxxxx} {xxxxxxxxxxxxx} 
@item

`클라이언트' / `서버'

@tab

`SSLv2'

@tab

`SSLv3'

@tab

`TLS' @footnote{
TLS 1.3 프로토콜은 OpenSSL >= 1.1.1에서 @ref{39ea,,PROTOCOL_TLS}로 사용할 수 있습니다. TLS 1.3만을 위한 전용 PROTOCOL 상수는 없습니다.
}

@tab

`TLSv1'

@tab

`TLSv1.1'

@tab

`TLSv1.2'

@item

`SSLv2'

@tab

yes

@tab

no

@tab

no @footnote{
@ref{357,,SSLContext}는 기본적으로 @ref{a3a,,OP_NO_SSLv2}로 SSLv2를 비활성화합니다.
}

@tab

no

@tab

no

@tab

no

@item

`SSLv3'

@tab

no

@tab

yes

@tab

no @footnote{
@ref{357,,SSLContext}는 기본적으로 @ref{a3b,,OP_NO_SSLv3}으로 SSLv3을 비활성화합니다.
}

@tab

no

@tab

no

@tab

no

@item

`TLS' (`SSLv23') @footnote{
TLS 1.3 프로토콜은 OpenSSL >= 1.1.1에서 @ref{39ea,,PROTOCOL_TLS}로 사용할 수 있습니다. TLS 1.3만을 위한 전용 PROTOCOL 상수는 없습니다.
}

@tab

no @footnote{
@ref{357,,SSLContext}는 기본적으로 @ref{a3a,,OP_NO_SSLv2}로 SSLv2를 비활성화합니다.
}

@tab

no @footnote{
@ref{357,,SSLContext}는 기본적으로 @ref{a3b,,OP_NO_SSLv3}으로 SSLv3을 비활성화합니다.
}

@tab

yes

@tab

yes

@tab

yes

@tab

yes

@item

`TLSv1'

@tab

no

@tab

no

@tab

yes

@tab

yes

@tab

no

@tab

no

@item

`TLSv1.1'

@tab

no

@tab

no

@tab

yes

@tab

no

@tab

yes

@tab

no

@item

`TLSv1.2'

@tab

no

@tab

no

@tab

yes

@tab

no

@tab

no

@tab

yes

@end multitable



@subsubheading 더 보기


@ref{480,,create_default_context()} lets the @code{ssl} module choose
security settings for a given purpose.



버전 3.6에서 변경: The context is created with secure default values. The options
@ref{134b,,OP_NO_COMPRESSION}, @ref{134e,,OP_CIPHER_SERVER_PREFERENCE},
@ref{3a06,,OP_SINGLE_DH_USE}, @ref{3a07,,OP_SINGLE_ECDH_USE},
@ref{a3a,,OP_NO_SSLv2},
and @ref{a3b,,OP_NO_SSLv3} (except for @ref{39f5,,PROTOCOL_SSLv3}) are
set by default. The initial cipher suite list contains only @code{HIGH}
ciphers, no @code{NULL} ciphers and no @code{MD5} ciphers.



버전 3.10부터 폐지됨: @code{SSLContext} without protocol argument is deprecated. The
context class will either require @ref{a72,,PROTOCOL_TLS_CLIENT} or
@ref{a73,,PROTOCOL_TLS_SERVER} protocol in the future.



버전 3.10에서 변경: The default cipher suites now include only secure AES and ChaCha20
ciphers with forward secrecy and security level 2. RSA and DH keys with
less than 2048 bits and ECC keys with less than 224 bits are prohibited.
@ref{39ea,,PROTOCOL_TLS}, @ref{a72,,PROTOCOL_TLS_CLIENT}, and
@ref{a73,,PROTOCOL_TLS_SERVER} use TLS 1.2 as minimum TLS version.


@cartouche
@quotation 참고 
@code{SSLContext} only supports limited mutation once it has been used
by a connection. Adding new certificates to the internal trust store is
allowed, but changing ciphers, verification settings, or mTLS
certificates may result in surprising behavior.
@end quotation
@end cartouche

@cartouche
@quotation 참고 
@code{SSLContext} is designed to be shared and used by multiple
connections.
Thus, it is thread-safe as long as it is not reconfigured after being
used by a connection.
@end quotation
@end cartouche
@end deffn

@ref{357,,SSLContext} 객체에는 다음과 같은 메서드와 어트리뷰트가 있습니다:

@geindex cert_store_stats() (ssl.SSLContext 메서드)
@anchor{library/ssl ssl SSLContext cert_store_stats}@anchor{11ab}
@deffn {메서드} SSLContext.cert_store_stats ()

로드된 X.509 인증서 수량, CA 인증서로 표시된 X.509 인증서 및 인증서 취소 목록(CRL)의 수에 대한 통계를 딕셔너리로 가져옵니다.

하나의 CA 인증서와 다른 인증서 하나를 가진 컨텍스트 예:

@example
>>> context.cert_store_stats()
@{'crl': 0, 'x509_ca': 1, 'x509': 2@}
@end example


Added in version 3.4.

@end deffn

@geindex load_cert_chain() (ssl.SSLContext 메서드)
@anchor{library/ssl ssl SSLContext load_cert_chain}@anchor{597}
@deffn {메서드} SSLContext.load_cert_chain (certfile, keyfile=None, password=None)

Load a private key and the corresponding certificate.  The `certfile'
string must be the path to a single file in PEM format containing the
certificate as well as any number of CA certificates needed to establish
the certificate’s authenticity.  The `keyfile' string, if present, must
point to a file containing the private key.  Otherwise the private
key will be taken from `certfile' as well.  See the discussion of
@ref{3a29,,인증서} for more information on how the certificate
is stored in the `certfile'.

`password' 인자는 개인 키의 복호화를 위한 암호를 얻기 위해 호출하는 함수가 될 수 있습니다. 개인 키가 암호화되어있고 암호가 필요한 경우에만 호출됩니다. 인자 없이 호출되며, 문자열, 바이트열 또는 bytearray를 반환해야 합니다. 반환 값이 문자열이면 키를 해독하기 전에 UTF-8로 인코딩됩니다. 또는 문자열, 바이트열 또는 bytearray 값을 `password' 인자로 직접 제공할 수 있습니다. 개인 키가 암호화되지 않고 암호가 필요 없으면 무시됩니다.

`password' 인자가 지정되지 않고 암호가 필요하면, OpenSSL의 기본 암호 프롬프트 메커니즘을 사용하여 대화식으로 사용자에게 암호를 묻습니다.

개인 키가 인증서와 일치하지 않으면 @ref{147e,,SSLError}가 발생합니다.


버전 3.3에서 변경: 새로운 선택적 인자 `password'.

@end deffn

@geindex load_default_certs() (ssl.SSLContext 메서드)
@anchor{library/ssl ssl SSLContext load_default_certs}@anchor{11b1}
@deffn {메서드} SSLContext.load_default_certs (purpose=Purpose.SERVER_AUTH)

Load a set of default “certification authority” (CA) certificates from
default locations. On Windows it loads CA certs from the @code{CA} and
@code{ROOT} system stores. On all systems it calls
@ref{11aa,,SSLContext.set_default_verify_paths()}. In the future the method may
load CA certificates from other locations, too.

The `purpose' flag specifies what kind of CA certificates are loaded. The
default settings @ref{11b2,,Purpose.SERVER_AUTH} loads certificates, that are
flagged and trusted for TLS web server authentication (client side
sockets). @ref{11b3,,Purpose.CLIENT_AUTH} loads CA certificates for client
certificate verification on the server side.


Added in version 3.4.

@end deffn

@geindex load_verify_locations() (ssl.SSLContext 메서드)
@anchor{library/ssl ssl SSLContext load_verify_locations}@anchor{10ed}
@deffn {메서드} SSLContext.load_verify_locations (cafile=None, capath=None, cadata=None)

@ref{39e7,,verify_mode}가 @ref{39f9,,CERT_NONE}가 아닐 때, 다른 피어의 인증서를 확인하는 데 사용되는 “인증 기관” (CA) 인증서 집합을 로드합니다. `cafile' 나 `capath' 중 적어도 하나는 지정해야 합니다.

이 메서드는 PEM 이나 DER 형식으로 인증서 해지 목록(CRL)을 로드할 수도 있습니다. CRL을 사용하려면 @ref{11ad,,SSLContext.verify_flags}를 올바르게 구성해야 합니다.

`cafile' 문자열이 있으면 이어붙인 PEM 형식의 CA 인증서 파일 경로입니다. 이 파일에 인증서를 정렬하는 방법에 대한 자세한 내용은 @ref{3a29,,인증서}의 논의를 참조하십시오.

The `capath' string, if present, is
the path to a directory containing several CA certificates in PEM format,
following an OpenSSL specific layout@footnote{https://docs.openssl.org/master/man3/SSL_CTX_load_verify_locations/}.

`cadata' 객체가 있으면, 하나 이상의 PEM-인코딩된 인증서의 ASCII 문자열이거나 DER-인코딩된 인증서의 @ref{193,,바이트열류 객체}입니다. `capath'와 마찬가지로 PEM-인코딩된 인증서 주위에 추가한 줄은 무시되지만 적어도 하나의 인증서가 있어야 합니다.


버전 3.4에서 변경: 새로운 선택적 인자 `cadata'

@end deffn

@geindex get_ca_certs() (ssl.SSLContext 메서드)
@anchor{library/ssl ssl SSLContext get_ca_certs}@anchor{11ac}
@deffn {메서드} SSLContext.get_ca_certs (binary_form=False)

로드된 “인증 기관” (CA) 인증서 목록을 가져옵니다. @code{binary_form} 매개 변수가 @ref{d2a,,False}면 각 리스트 항목은 @ref{11b7,,SSLSocket.getpeercert()}의 출력과 같은 딕셔너리입니다. 그렇지 않으면, 이 메서드는 DER-인코딩된 인증서의 리스트를 반환합니다. 반환된 리스트에는 인증서가 SSL 연결이 요청하고 로드되지 않는 한 `capath'의 인증서가 포함되어 있지 않습니다.

@cartouche
@quotation 참고 
capath 디렉터리의 인증서는 적어도 한 번 이상 사용하지 않으면 로드되지 않습니다.
@end quotation
@end cartouche


Added in version 3.4.

@end deffn

@geindex get_ciphers() (ssl.SSLContext 메서드)
@anchor{library/ssl ssl SSLContext get_ciphers}@anchor{ed9}
@deffn {메서드} SSLContext.get_ciphers ()

활성화된 사이퍼의 리스트를 가져옵니다. 리스트는 사이퍼 우선순위 순입니다. @ref{3a2a,,SSLContext.set_ciphers()}를 참조하십시오.

예제:

@example
>>> ctx = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
>>> ctx.set_ciphers('ECDHE+AESGCM:!ECDSA')
>>> ctx.get_ciphers()
[@{'aead': True,
  'alg_bits': 256,
  'auth': 'auth-rsa',
  'description': 'ECDHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH     Au=RSA  '
                 'Enc=AESGCM(256) Mac=AEAD',
  'digest': None,
  'id': 50380848,
  'kea': 'kx-ecdhe',
  'name': 'ECDHE-RSA-AES256-GCM-SHA384',
  'protocol': 'TLSv1.2',
  'strength_bits': 256,
  'symmetric': 'aes-256-gcm'@},
 @{'aead': True,
  'alg_bits': 128,
  'auth': 'auth-rsa',
  'description': 'ECDHE-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH     Au=RSA  '
                 'Enc=AESGCM(128) Mac=AEAD',
  'digest': None,
  'id': 50380847,
  'kea': 'kx-ecdhe',
  'name': 'ECDHE-RSA-AES128-GCM-SHA256',
  'protocol': 'TLSv1.2',
  'strength_bits': 128,
  'symmetric': 'aes-128-gcm'@}]
@end example


Added in version 3.6.

@end deffn

@geindex set_default_verify_paths() (ssl.SSLContext 메서드)
@anchor{library/ssl ssl SSLContext set_default_verify_paths}@anchor{11aa}
@deffn {메서드} SSLContext.set_default_verify_paths ()

OpenSSL 라이브러리를 빌드할 때 정의된 파일 시스템 경로에서 기본 “인증 기관” (CA) 인증서 집합을 로드합니다. 불행히도, 이 메서드가 성공하는지를 쉽게 알 방법이 없습니다: 인증서를 찾을 수 없어도 에러가 반환되지 않습니다. 하지만 OpenSSL 라이브러리가 운영 체제 일부로 제공되면 올바르게 구성되었을 가능성이 큽니다.
@end deffn

@geindex set_ciphers() (ssl.SSLContext 메서드)
@anchor{library/ssl ssl SSLContext set_ciphers}@anchor{3a2a}
@deffn {메서드} SSLContext.set_ciphers (ciphers, /)

Set the available ciphers for sockets created with this context.
It should be a string in the OpenSSL cipher list format@footnote{https://docs.openssl.org/master/man1/ciphers/}.
If no cipher can be selected (because compile-time options or other
configuration forbids use of all the specified ciphers), an
@ref{147e,,SSLError} will be raised.

@cartouche
@quotation 참고 
연결될 때, SSL 소켓의 @ref{390a,,SSLSocket.cipher()} 메서드가 현재 선택된 사이퍼를 제공합니다.

TLS 1.3 cipher suites cannot be disabled with
@code{set_ciphers()}.
@end quotation
@end cartouche
@end deffn

@geindex set_alpn_protocols() (ssl.SSLContext 메서드)
@anchor{library/ssl ssl SSLContext set_alpn_protocols}@anchor{1063}
@deffn {메서드} SSLContext.set_alpn_protocols (alpn_protocols)

SSL/TLS 핸드 셰이크 중에 소켓이 알려야 하는 프로토콜을 지정합니다. 우선순위에 따라 정렬된 @code{['http/1.1', 'spdy/2']}와 같은 ASCII 문자열 리스트여야 합니다. 프로토콜 선택은 핸드 셰이크 중에 발생하며, 
@geindex RFC; RFC 7301
RFC 7301@footnote{https://datatracker.ietf.org/doc/html/rfc7301.html}에 따라 처리됩니다. 성공적인 핸드 셰이크가 끝나면, @ref{1064,,SSLSocket.selected_alpn_protocol()} 메서드는 합의된 프로토콜을 반환합니다.

@ref{3a0e,,HAS_NPN}이 @code{False}면, 이 메서드는 @ref{36b,,NotImplementedError}를 발생시킵니다.


Added in version 3.5.

@end deffn

@geindex set_npn_protocols() (ssl.SSLContext 메서드)
@anchor{library/ssl ssl SSLContext set_npn_protocols}@anchor{358}
@deffn {메서드} SSLContext.set_npn_protocols (npn_protocols)

SSL/TLS 핸드 셰이크 중에 소켓이 알려야 하는 프로토콜을 지정합니다. 우선순위에 따라 정렬된 @code{['http/1.1', 'spdy/2']}와 같은 문자열 리스트여야 합니다. 프로토콜 선택은 핸드 셰이크 중에 발생하며, Application Layer Protocol Negotiation@footnote{https://en.wikipedia.org/wiki/Application-Layer_Protocol_Negotiation}에 따라 처리됩니다. 성공적인 핸드 셰이크가 끝나면, @ref{a74,,SSLSocket.selected_npn_protocol()} 메서드는 합의된 프로토콜을 반환합니다.

@ref{3a0e,,HAS_NPN}이 @code{False}면, 이 메서드는 @ref{36b,,NotImplementedError}를 발생시킵니다.


Added in version 3.3.



버전 3.10부터 폐지됨: NPN has been superseded by ALPN

@end deffn

@geindex sni_callback (ssl.SSLContext의 속성)
@anchor{library/ssl ssl SSLContext sni_callback}@anchor{1c8c}
@deffn {속성} SSLContext.sni_callback

TLS 클라이언트가 서버 이름 표시를 지정할 때 SSL/TLS 서버에서 TLS 클라이언트 Hello 핸드 셰이크 메시지를 받은 후 호출될 콜백 함수를 등록합니다. 서버 이름 표시 메커니즘은 
@geindex RFC; RFC 6066
RFC 6066@footnote{https://datatracker.ietf.org/doc/html/rfc6066.html} section 3 - Server Name Indication에서 지정됩니다.

@code{SSLContext} 당 하나의 콜백 만 설정할 수 있습니다. `sni_callback'이 @code{None}으로 설정되면 콜백이 비활성화됩니다. 이 함수를 호출하면 이전에 등록된 콜백이 비활성화됩니다.

콜백 함수는 세 개의 인자로 호출됩니다. 첫 번째는 @ref{ae7,,ssl.SSLSocket}이고, 두 번째는 클라이언트가 통신하려는 서버 이름을 나타내는 문자열(또는 TLS 클라이언트 Hello에 서버 이름이 없으면 @ref{884,,None})이며, 세 번째 인자는 원래 @ref{357,,SSLContext}입니다. 서버 이름 인자는 텍스트입니다. 국제화된 도메인 이름의 경우, 서버 이름은 IDN A-레이블(@code{"xn--pythn-mua.org"})입니다.

이 콜백은 일반적으로 @ref{ae7,,ssl.SSLSocket}의 @ref{3a24,,SSLSocket.context} 어트리뷰트를 서버 이름과 일치하는 인증서 체인을 나타내는 @ref{357,,SSLContext} 형의 새 객체로 변경하는 데 사용됩니다.

Due to the early negotiation phase of the TLS connection, only limited
methods and attributes are usable like
@ref{1064,,SSLSocket.selected_alpn_protocol()} and @ref{3a24,,SSLSocket.context}.
The @ref{11b7,,SSLSocket.getpeercert()}, @ref{195d,,SSLSocket.get_verified_chain()},
@ref{195e,,SSLSocket.get_unverified_chain()} @ref{390a,,SSLSocket.cipher()}
and @ref{134a,,SSLSocket.compression()} methods require that
the TLS connection has progressed beyond the TLS Client Hello and therefore
will not return meaningful values nor can they be called safely.

TLS 협상을 계속하려면 `sni_callback' 함수가 @code{None}을 반환해야 합니다. TLS 실패가 필요하면, 상수 @ref{3a17,,ALERT_DESCRIPTION_*}를 반환할 수 있습니다. 다른 반환 값은 @code{ALERT_DESCRIPTION_INTERNAL_ERROR}로 TLS 치명적인 에러를 발생시킵니다.

`sni_callback' 함수에서 예외가 발생하면, TLS 연결이 치명적인 TLS 경고 메시지 @ref{3a16,,ALERT_DESCRIPTION_HANDSHAKE_FAILURE}로 종료됩니다.

이 메서드는 OpenSSL 라이브러리가 빌드될 때 OPENSSL_NO_TLSEXT가 정의되었으면 @ref{36b,,NotImplementedError}를 발생시킵니다.


Added in version 3.7.

@end deffn

@geindex set_servername_callback() (ssl.SSLContext 메서드)
@anchor{library/ssl ssl SSLContext set_servername_callback}@anchor{11b6}
@deffn {메서드} SSLContext.set_servername_callback (server_name_callback)

이전 버전과의 호환성을 위해 유지되는 기존 API입니다. 가능하면, 대신 @ref{1c8c,,sni_callback}을 사용해야 합니다. 주어진 `server_name_callback'은 `sni_callback'과 비슷하지만, 서버 호스트 이름이 IDN-인코딩된 국제화된 도메인 이름일 때 `server_name_callback'은 디코딩된 U-레이블(@code{"pythön.org"})을 받습니다.

If there is a decoding error on the server name, the TLS connection will
terminate with an @ref{3a17,,ALERT_DESCRIPTION_INTERNAL_ERROR} fatal TLS
alert message to the client.


Added in version 3.4.

@end deffn

@geindex load_dh_params() (ssl.SSLContext 메서드)
@anchor{library/ssl ssl SSLContext load_dh_params}@anchor{1347}
@deffn {메서드} SSLContext.load_dh_params (dhfile, /)

Diffie-Hellman (DH) 키 교환을 위한 키 생성 매개 변수를 로드합니다. DH 키 교환을 사용하면 계산 자원(서버와 클라이언트 모두)을 희생하여 FS(forward secrecy)를 향상합니다. `dhfile' 매개 변수는 PEM 형식의 DH 매개 변수를 포함하는 파일의 경로여야 합니다.

이 설정은 클라이언트 소켓에는 적용되지 않습니다. @ref{3a06,,OP_SINGLE_DH_USE} 옵션을 사용하여 보안을 더 향상할 수도 있습니다.


Added in version 3.3.

@end deffn

@geindex set_ecdh_curve() (ssl.SSLContext 메서드)
@anchor{library/ssl ssl SSLContext set_ecdh_curve}@anchor{1348}
@deffn {메서드} SSLContext.set_ecdh_curve (curve_name, /)

타원 곡선(Elliptic Curve) 기반 Diffie-Hellman (ECDH) 키 교환을 위한 곡선 이름을 설정합니다. 보안성에 대한 논란의 여지는 있지만 ECDH는 일반 DH보다 상당히 빠릅니다. `curve_name' 매개 변수는 잘 알려진 타원 곡선을 설명하는 문자열이어야 합니다, 예를 들어, 널리 지원되는 곡선인 @code{prime256v1}.

이 설정은 클라이언트 소켓에는 적용되지 않습니다. @ref{3a07,,OP_SINGLE_ECDH_USE} 옵션을 사용하여 보안을 더 향상할 수도 있습니다.

@ref{3a0c,,HAS_ECDH}가 @code{False}면 이 메서드를 사용할 수 없습니다.


Added in version 3.3.



@subsubheading 더 보기



@table @asis

@item SSL/TLS & Perfect Forward Secrecy@footnote{https://vincent.bernat.ch/en/blog/2011-ssl-perfect-forward-secrecy}

Vincent Bernat.
@end table

@end deffn

@geindex wrap_socket() (ssl.SSLContext 메서드)
@anchor{library/ssl ssl SSLContext wrap_socket}@anchor{747}
@deffn {메서드} SSLContext.wrap_socket (sock, server_side=False, do_handshake_on_connect=True, suppress_ragged_eofs=True, server_hostname=None, session=None)

Wrap an existing Python socket `sock' and return an instance of
@ref{3a2b,,SSLContext.sslsocket_class} (default @ref{ae7,,SSLSocket}). The
returned SSL socket is tied to the context, its settings and certificates.
`sock' must be a @ref{14f8,,SOCK_STREAM} socket; other
socket types are unsupported.

매개 변수 @code{server_side}는 서버 측과 클라이언트 측 동작 중 어느 것이 소켓에서 필요한지를 식별하는 논릿값입니다.

클라이언트 측 소켓의 경우, 컨텍스트 구성이 지연됩니다; 하부 소켓이 아직 연결되어 있지 않으면, @code{connect()}가 소켓에서 호출된 후 컨텍스트 생성이 수행됩니다. 서버 측 소켓의 경우, 소켓에 원격 피어가 없으면, 리스닝 소켓이라고 가정하고, 서버 측 SSL 감싸기는 @code{accept()} 메서드를 통해 받아들인 클라이언트 연결에 대해 자동으로 수행됩니다. 메서드는 @ref{147e,,SSLError}를 발생시킬 수 있습니다.

클라이언트 연결에서, 선택적 매개 변수 `server_hostname'는 연결하려는 서비스의 호스트 이름을 지정합니다. 이를 통해 단일 서버는 HTTP 가상 호스트와 매우 흡사하게 서로 다른 인증서로 여러 SSL 기반 서비스를 호스팅 할 수 있습니다. `server_side'가 참일 때 `server_hostname'를 지정하면 @ref{2ec,,ValueError}가 발생합니다.

매개 변수 @code{do_handshake_on_connect}는 @code{socket.connect()}를 수행한 후 SSL 핸드 셰이크를 자동으로 수행할지, 또는 응용 프로그램이 @ref{106c,,SSLSocket.do_handshake()} 메서드를 호출하여 명시적으로 호출할지를 지정합니다. @code{SSLSocket.do_handshake()}를 명시적으로 호출하면, 핸드 셰이크에 수반되는 소켓 I/O의 블로킹 동작을 프로그램에서 제어할 수 있습니다.

매개 변수 @code{suppress_ragged_eofs}는 @code{SSLSocket.recv()} 메서드가 연결의 다른 끝으로부터의 예기치 않은 EOF를 알리는 방법을 지정합니다. @ref{e06,,True}(기본값)로 지정되면, 하부 소켓에서 발생한 예기치 않은 EOF 에러에 대한 응답으로 정상 EOF(빈 바이트열 객체)를 반환합니다. @ref{d2a,,False}면 예외를 호출자에게 다시 발생시킵니다.

`session', @ref{193e,,session}을 참조하십시오.

To wrap an @ref{ae7,,SSLSocket} in another @code{SSLSocket}, use
@ref{d7a,,SSLContext.wrap_bio()}.


버전 3.5에서 변경: OpenSSL에 SNI가 없더라도 항상 server_hostname을 전달할 수 있습니다.



버전 3.6에서 변경: `session' 인자가 추가되었습니다.



버전 3.7에서 변경: The method returns an instance of @ref{3a2b,,SSLContext.sslsocket_class}
instead of hard-coded @ref{ae7,,SSLSocket}.

@end deffn

@geindex sslsocket_class (ssl.SSLContext의 속성)
@anchor{library/ssl ssl SSLContext sslsocket_class}@anchor{3a2b}
@deffn {속성} SSLContext.sslsocket_class

The return type of @ref{747,,SSLContext.wrap_socket()}, defaults to
@ref{ae7,,SSLSocket}. The attribute can be assigned to on instances of
@ref{357,,SSLContext} in order to return a custom subclass of
@code{SSLSocket}.


Added in version 3.7.

@end deffn

@geindex wrap_bio() (ssl.SSLContext 메서드)
@anchor{library/ssl ssl SSLContext wrap_bio}@anchor{d7a}
@deffn {메서드} SSLContext.wrap_bio (incoming, outgoing, server_side=False, server_hostname=None, session=None)

BIO 객체 `incoming' 과 `outgoing'을 감싸고 @ref{3a2c,,SSLContext.sslobject_class}(기본값 @ref{d79,,SSLObject})의 인스턴스를 반환합니다. SSL 루틴은 incoming BIO에서 입력 데이터를 읽고 outgoing BIO에 데이터를 씁니다.

`server_side', `server_hostname' 및 `session' 매개 변수는 @ref{747,,SSLContext.wrap_socket()}에서와 같은 의미입니다.


버전 3.6에서 변경: `session' 인자가 추가되었습니다.



버전 3.7에서 변경: The method returns an instance of @ref{3a2c,,SSLContext.sslobject_class}
instead of hard-coded @ref{d79,,SSLObject}.

@end deffn

@geindex sslobject_class (ssl.SSLContext의 속성)
@anchor{library/ssl ssl SSLContext sslobject_class}@anchor{3a2c}
@deffn {속성} SSLContext.sslobject_class

@ref{d7a,,SSLContext.wrap_bio()}의 반환형, 기본값은 @ref{d79,,SSLObject}입니다. 이 어트리뷰트는 @code{SSLObject}의 사용자 정의 서브 클래스를 반환하기 위해 클래스의 인스턴스에서 재정의될 수 있습니다.


Added in version 3.7.

@end deffn

@geindex session_stats() (ssl.SSLContext 메서드)
@anchor{library/ssl ssl SSLContext session_stats}@anchor{3a2d}
@deffn {메서드} SSLContext.session_stats ()

Get statistics about the SSL sessions created or managed by this context.
A dictionary is returned which maps the names of each piece of information@footnote{https://docs.openssl.org/1.1.1/man3/SSL_CTX_sess_number/} to their
numeric values.  For example, here is the total number of hits and misses
in the session cache since the context was created:

@example
>>> stats = context.session_stats()
>>> stats['hits'], stats['misses']
(0, 0)
@end example
@end deffn

@geindex check_hostname (ssl.SSLContext의 속성)
@anchor{library/ssl ssl SSLContext check_hostname}@anchor{39fb}
@deffn {속성} SSLContext.check_hostname

@ref{106c,,SSLSocket.do_handshake()}에서 피어 인증서의 호스트 이름을 일치시킬지 여부. 컨텍스트의 @ref{39e7,,verify_mode}는 @ref{39fa,,CERT_OPTIONAL}나 @ref{39e8,,CERT_REQUIRED}로 설정되어야 하며, 호스트 이름을 일치시키려면 `server_hostname'을 @ref{747,,wrap_socket()}로 전달해야 합니다. 호스트 이름 확인을 활성화하면 @code{verify_mode}가 @ref{39f9,,CERT_NONE}에서 @code{CERT_REQUIRED}로 자동 설정됩니다. 호스트 이름 검사가 활성화되어 있으면 @code{CERT_NONE}로 다시 설정할 수 없습니다. @ref{a72,,PROTOCOL_TLS_CLIENT} 프로토콜은 기본적으로 호스트 이름 확인을 활성화합니다. 다른 프로토콜의 경우, 호스트 이름 확인을 명시적으로 활성화해야 합니다.

예제:

@example
import socket, ssl

context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
context.verify_mode = ssl.CERT_REQUIRED
context.check_hostname = True
context.load_default_certs()

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
ssl_sock = context.wrap_socket(s, server_hostname='www.verisign.com')
ssl_sock.connect(('www.verisign.com', 443))
@end example


Added in version 3.4.



버전 3.7에서 변경: 호스트 이름 검사가 활성화되고 @ref{39e7,,verify_mode}가 @ref{39f9,,CERT_NONE}이면 이제 @code{verify_mode}가 @ref{39e8,,CERT_REQUIRED}로 자동 변경됩니다. 이전에는 같은 작업이 @ref{2ec,,ValueError}로 실패했을 것입니다.

@end deffn

@geindex keylog_filename (ssl.SSLContext의 속성)
@anchor{library/ssl ssl SSLContext keylog_filename}@anchor{39e9}
@deffn {속성} SSLContext.keylog_filename

키 자료가 생성되거나 수신될 때마다, TLS 키를 키로그(keylog) 파일에 기록합니다. 키로그 파일은 디버깅 목적으로만 설계되었습니다. 파일 형식은 NSS에 의해 지정되었고 Wireshark과 같은 많은 트래픽 분석기에서 사용됩니다. 로그 파일은 덧붙이기 전용 모드로 열립니다. 쓰기는 스레드 간에 동기화되지만, 프로세스 간에는 동기화되지 않습니다.


Added in version 3.8.

@end deffn

@geindex maximum_version (ssl.SSLContext의 속성)
@anchor{library/ssl ssl SSLContext maximum_version}@anchor{a71}
@deffn {속성} SSLContext.maximum_version

A @ref{3a1a,,TLSVersion} enum member representing the highest supported
TLS version. The value defaults to @ref{3a1c,,TLSVersion.MAXIMUM_SUPPORTED}.
The attribute is read-only for protocols other than @ref{39ea,,PROTOCOL_TLS},
@ref{a72,,PROTOCOL_TLS_CLIENT}, and @ref{a73,,PROTOCOL_TLS_SERVER}.

어트리뷰트 @ref{a71,,maximum_version}, @ref{a70,,minimum_version} 및 @ref{a39,,SSLContext.options}는 모두 컨텍스트의 지원되는 SSL과 TLS 버전에 영향을 줍니다. 구현은 부적합한 조합을 방지하지 못합니다. 예를 들어, @code{options}에 @ref{3a04,,OP_NO_TLSv1_2}가 있고 @code{maximum_version}이 @ref{3a20,,TLSVersion.TLSv1_2}로 설정된 컨텍스트는 TLS 1.2 연결을 이룰 수 없습니다.


Added in version 3.7.

@end deffn

@geindex minimum_version (ssl.SSLContext의 속성)
@anchor{library/ssl ssl SSLContext minimum_version}@anchor{a70}
@deffn {속성} SSLContext.minimum_version

가장 낮은 지원 버전 또는 @ref{3a1b,,TLSVersion.MINIMUM_SUPPORTED}이라는 것만 제외하면 @ref{a71,,SSLContext.maximum_version}과 같습니다.


Added in version 3.7.

@end deffn

@geindex num_tickets (ssl.SSLContext의 속성)
@anchor{library/ssl ssl SSLContext num_tickets}@anchor{3a2e}
@deffn {속성} SSLContext.num_tickets

Control the number of TLS 1.3 session tickets of a
@ref{a73,,PROTOCOL_TLS_SERVER} context. The setting has no impact on TLS
1.0 to 1.2 connections.


Added in version 3.8.

@end deffn

@geindex options (ssl.SSLContext의 속성)
@anchor{library/ssl ssl SSLContext options}@anchor{a39}
@deffn {속성} SSLContext.options

이 컨텍스트에서 활성화된 SSL 옵션 집합을 나타내는 정수. 기본값은 @ref{3a01,,OP_ALL}이지만, @ref{a3a,,OP_NO_SSLv2}와 같은 다른 옵션을 함께 OR로 연결하여 지정할 수 있습니다.


버전 3.6에서 변경: @ref{a39,,SSLContext.options}는 @ref{3a09,,Options} 플래그를 반환합니다.:

@example
>>> ssl.create_default_context().options
<Options.OP_ALL|OP_NO_SSLv3|OP_NO_SSLv2|OP_NO_COMPRESSION: 2197947391>
@end example



버전 3.7부터 폐지됨: All @code{OP_NO_SSL*} and @code{OP_NO_TLS*} options have been deprecated since
Python 3.7. Use @ref{a70,,SSLContext.minimum_version} and
@ref{a71,,SSLContext.maximum_version} instead.

@end deffn

@geindex post_handshake_auth (ssl.SSLContext의 속성)
@anchor{library/ssl ssl SSLContext post_handshake_auth}@anchor{c25}
@deffn {속성} SSLContext.post_handshake_auth

TLS 1.3 포스트 핸드 셰이크 클라이언트 인증을 사용합니다. 포스트 핸드 셰이크 인증은 기본적으로 사용되지 않으며 서버는 초기 핸드 셰이크 중에 TLS 클라이언트 인증서만 요청할 수 있습니다. 활성화되면, 서버는 핸드 셰이크 후에 언제든지 TLS 클라이언트 인증서를 요청할 수 있습니다.

클라이언트 측 소켓에서 활성화될 때, 클라이언트는 포스트 핸드 셰이크 인증을 지원하는 서버에 신호를 보냅니다.

서버 측 소켓에서 활성화될 때, @ref{39e7,,SSLContext.verify_mode}도 @ref{39fa,,CERT_OPTIONAL}이나 @ref{39e8,,CERT_REQUIRED}로 설정해야 합니다. 실제 클라이언트 인증서 교환은 @ref{c26,,SSLSocket.verify_client_post_handshake()}가 호출되고 일부 I/O가 수행될 때까지 지연됩니다.


Added in version 3.8.

@end deffn

@geindex protocol (ssl.SSLContext의 속성)
@anchor{library/ssl ssl SSLContext protocol}@anchor{3a2f}
@deffn {속성} SSLContext.protocol

컨텍스트를 구성할 때 선택한 프로토콜 버전. 이 어트리뷰트는 읽기 전용입니다.
@end deffn

@geindex hostname_checks_common_name (ssl.SSLContext의 속성)
@anchor{library/ssl ssl SSLContext hostname_checks_common_name}@anchor{d75}
@deffn {속성} SSLContext.hostname_checks_common_name

@ref{39fb,,check_hostname}가 SAN(subject alternative name) 확장이 없을 때 인증서의 SCN(subject common name)을 유효성 검사하는 것으로 폴백 할지 아닐지 (기본값: 참)


Added in version 3.7.



버전 3.10에서 변경: The flag had no effect with OpenSSL before version 1.1.1l. Python 3.8.9,
3.9.3, and 3.10 include workarounds for previous versions.

@end deffn

@geindex security_level (ssl.SSLContext의 속성)
@anchor{library/ssl ssl SSLContext security_level}@anchor{3a30}
@deffn {속성} SSLContext.security_level

An integer representing the security level@footnote{https://docs.openssl.org/master/man3/SSL_CTX_get_security_level/}
for the context. This attribute is read-only.


Added in version 3.10.

@end deffn

@geindex verify_flags (ssl.SSLContext의 속성)
@anchor{library/ssl ssl SSLContext verify_flags}@anchor{11ad}
@deffn {속성} SSLContext.verify_flags

The flags for certificate verification operations. You can set flags like
@ref{11af,,VERIFY_CRL_CHECK_LEAF} by ORing them together. By default OpenSSL
does neither require nor verify certificate revocation lists (CRLs).


Added in version 3.4.



버전 3.6에서 변경: @ref{11ad,,SSLContext.verify_flags}는 @ref{39fe,,VerifyFlags} 플래그를 반환합니다.:

@example
>>> ssl.create_default_context().verify_flags
<VerifyFlags.VERIFY_X509_TRUSTED_FIRST: 32768>
@end example

@end deffn

@geindex verify_mode (ssl.SSLContext의 속성)
@anchor{library/ssl ssl SSLContext verify_mode}@anchor{39e7}
@deffn {속성} SSLContext.verify_mode

다른 피어의 인증서를 확인할지와 확인이 실패할 때 어떻게 해야 하는지를 나타냅니다. 이 어트리뷰트는 @ref{39f9,,CERT_NONE}, @ref{39fa,,CERT_OPTIONAL} 또는 @ref{39e8,,CERT_REQUIRED} 중 하나여야 합니다.


버전 3.6에서 변경: @ref{39e7,,SSLContext.verify_mode}는 @ref{39fc,,VerifyMode} 열거형을 반환합니다.:

@example
>>> ssl.create_default_context().verify_mode
<VerifyMode.CERT_REQUIRED: 2>
@end example

@end deffn

@geindex set_psk_client_callback() (ssl.SSLContext 메서드)
@anchor{library/ssl ssl SSLContext set_psk_client_callback}@anchor{3a31}
@deffn {메서드} SSLContext.set_psk_client_callback (callback)

Enables TLS-PSK (pre-shared key) authentication on a client-side connection.

In general, certificate based authentication should be preferred over this method.

The parameter @code{callback} is a callable object with the signature:
@code{def callback(hint: str | None) -> tuple[str | None, bytes]}.
The @code{hint} parameter is an optional identity hint sent by the server.
The return value is a tuple in the form (client-identity, psk).
Client-identity is an optional string which may be used by the server to
select a corresponding PSK for the client. The string must be less than or
equal to @code{256} octets when UTF-8 encoded. PSK is a
@ref{193,,bytes-like object} representing the pre-shared key. Return a zero
length PSK to reject the connection.

Setting @code{callback} to @ref{884,,None} removes any existing callback.

@cartouche
@quotation 참고 
When using TLS 1.3:


@itemize -

@item 
the @code{hint} parameter is always @ref{884,,None}.

@item 
client-identity must be a non-empty string.
@end itemize
@end quotation
@end cartouche

Example usage:

@example
context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
context.check_hostname = False
context.verify_mode = ssl.CERT_NONE
context.maximum_version = ssl.TLSVersion.TLSv1_2
context.set_ciphers('PSK')

# A simple lambda:
psk = bytes.fromhex('c0ffee')
context.set_psk_client_callback(lambda hint: (None, psk))

# A table using the hint from the server:
psk_table = @{ 'ServerId_1': bytes.fromhex('c0ffee'),
              'ServerId_2': bytes.fromhex('facade')
@}
def callback(hint):
    return 'ClientId_1', psk_table.get(hint, b'@w{'})
context.set_psk_client_callback(callback)
@end example

This method will raise @ref{36b,,NotImplementedError} if @ref{3a14,,HAS_PSK} is
@code{False}.


Added in version 3.13.

@end deffn

@geindex set_psk_server_callback() (ssl.SSLContext 메서드)
@anchor{library/ssl ssl SSLContext set_psk_server_callback}@anchor{3a32}
@deffn {메서드} SSLContext.set_psk_server_callback (callback, identity_hint=None)

Enables TLS-PSK (pre-shared key) authentication on a server-side connection.

In general, certificate based authentication should be preferred over this method.

The parameter @code{callback} is a callable object with the signature:
@code{def callback(identity: str | None) -> bytes}.
The @code{identity} parameter is an optional identity sent by the client which can
be used to select a corresponding PSK.
The return value is a @ref{193,,bytes-like object} representing the pre-shared key.
Return a zero length PSK to reject the connection.

Setting @code{callback} to @ref{884,,None} removes any existing callback.

The parameter @code{identity_hint} is an optional identity hint string sent to
the client. The string must be less than or equal to @code{256} octets when
UTF-8 encoded.

@cartouche
@quotation 참고 
When using TLS 1.3 the @code{identity_hint} parameter is not sent to the client.
@end quotation
@end cartouche

Example usage:

@example
context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
context.maximum_version = ssl.TLSVersion.TLSv1_2
context.set_ciphers('PSK')

# A simple lambda:
psk = bytes.fromhex('c0ffee')
context.set_psk_server_callback(lambda identity: psk)

# A table using the identity of the client:
psk_table = @{ 'ClientId_1': bytes.fromhex('c0ffee'),
              'ClientId_2': bytes.fromhex('facade')
@}
def callback(identity):
    return psk_table.get(identity, b'@w{'})
context.set_psk_server_callback(callback, 'ServerId_1')
@end example

This method will raise @ref{36b,,NotImplementedError} if @ref{3a14,,HAS_PSK} is
@code{False}.


Added in version 3.13.

@end deffn

@geindex certificates

@geindex X509 certificate

@node 인증서,예제<19>,SSL contexts,ssl — TLS/SSL wrapper for socket objects
@anchor{library/ssl certificates}@anchor{3a33}@anchor{library/ssl ssl-certificates}@anchor{3a29}
@subsubsection 인증서


인증서는 일반적으로 공개키/개인키 시스템 일부입니다. 이 시스템에서, 각 `주체(principal)'(시스템, 사람 또는 조직일 수 있습니다)에게는 고유한 두 부분으로 된 암호화 키가 지정됩니다. 열쇠의 한 부분은 공개(public)며, `공개키(public key)'라고 불립니다; 다른 부분은 비밀로 유지되며, `개인키(private key)'라고 합니다. 두 부분은 관련이 있습니다. 두 부분 중 하나를 사용하여 메시지를 암호화하면, 다른 부분으로 해독할 수 있고, `오직' 다른 부분으로만 해독할 수 있습니다.

인증서에는 두 주체에 대한 정보가 들어 있습니다. `주체(subject)'의 이름과 주체의 공개키가 들어 있습니다. 또한 `발행자(issuer)'라는 두 번째 주체의 진술을 포함하는데, 해당 주체(subject)는 자신이 주장하는 존재며, 실제로 공개키 또한 주체(subject)의 것이 맞는다는 내용입니다. 발행자의 진술은 발행자만이 알고 있는 발행자의 개인키로 서명됩니다. 그러나 누구든지 발행자의 공개키를 찾고 이를 사용하여 진술을 해독하고 인증서의 다른 정보와 비교함으로써 발행자의 진술을 확인할 수 있습니다. 또한, 인증서에는 유효 기간에 대한 정보가 들어 있습니다. 이것은 “notBefore”와 “notAfter”라고 하는 두 개의 필드로 표현됩니다.

파이썬에서 인증서를 사용할 때, 클라이언트나 서버는 인증서를 사용하여 자신이 누구인지 증명할 수 있습니다. 네트워크 연결의 다른 쪽은 인증서 생성을 요구받을 수도 있으며, 해당 인증서는 이러한 유효성 검사가 필요한 클라이언트나 서버를 만족하도록 유효성을 검사할 수 있습니다. 유효성 검증이 실패하면 연결 시도가 예외를 발생시키도록 설정할 수 있습니다. 유효성 검사는 하부 OpenSSL 프레임워크에 의해 자동으로 수행됩니다; 응용 프로그램은 그 메커니즘에 관심을 두지 않아도 됩니다. 그러나 응용 프로그램은 일반적으로 이 절차를 수행할 수 있도록 인증서 집합을 제공해야 합니다.

파이썬은 인증서를 포함하기 위해 파일을 사용합니다. 그들은 “PEM”(
@geindex RFC; RFC 1422
RFC 1422@footnote{https://datatracker.ietf.org/doc/html/rfc1422.html}를 참조하세요)으로 포맷해야 합니다. 머릿줄과 꼬리 줄로 감싼 base-64 로 인코딩된 형식입니다:

@example
-----BEGIN CERTIFICATE-----
... (certificate in base64 PEM encoding) ...
-----END CERTIFICATE-----
@end example

@menu
* 인증서 체인:: 
* CA 인증서:: 
* 결합한 키와 인증서:: 
* 자체 서명 인증서:: 

@end menu

@node 인증서 체인,CA 인증서,,인증서
@anchor{library/ssl certificate-chains}@anchor{3a34}
@subsubsection 인증서 체인


인증서를 포함하는 파이썬 파일에는 인증서 시퀀스가 포함될 수 있는데, 때로 `인증서 체인(*certificate chain)'이라고 부릅니다. 이 체인은 클라이언트 또는 서버 “당사자” 주체에 대한 특정 인증서로 시작해야 하며, 그다음에 그 인증서의 발행자에 대한 인증서가 오고, 그다음에 `직전' 인증서 발행자에 대한 인증서가 오는 식으로 이어지다가, 결국에는 `자체 서명(self-signed)' 인증서를 얻게 되는데, 주체와 발행자가 같은 인증서로 때로 `루트 인증서'라고도 부릅니다. 인증서는 인증서 파일에 함께 이어붙여야 합니다. 예를 들어, 서버 인증서에서 서버 인증서에 서명한 인증 기관의 인증서를 거쳐 인증 기관의 인증서를 발행한 기관의 루트 인증서에 이르는 세 개의 인증서 체인이 있다고 가정합시다:

@example
-----BEGIN CERTIFICATE-----
... (certificate for your server)...
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
... (the certificate for the CA)...
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
... (the root certificate for the CA's issuer)...
-----END CERTIFICATE-----
@end example

@node CA 인증서,결합한 키와 인증서,인증서 체인,인증서
@anchor{library/ssl ca-certificates}@anchor{3a35}
@subsubsection CA 인증서


연결의 반대편의 인증서의 유효성 검사가 필요하면, 신뢰할 수 있는 각 발행자의 인증서 체인으로 채워진 “CA 인증서” 파일을 제공해야 합니다. 다시 말하지만, 이 파일은 단지 이러한 체인들을 함께 이어붙인 것입니다. 유효성 검사를 위해, 파이썬은 일치하는 파일에서 찾은 첫 번째 체인을 사용합니다. 플랫폼의 인증서 파일은 @ref{11b1,,SSLContext.load_default_certs()}를 호출하여 사용할 수 있습니다, 이는 @ref{480,,create_default_context()}로 자동으로 수행됩니다.

@node 결합한 키와 인증서,자체 서명 인증서,CA 인증서,인증서
@anchor{library/ssl combined-key-and-certificate}@anchor{3a36}
@subsubsection 결합한 키와 인증서


Often the private key is stored in the same file as the certificate; in this
case, only the @code{certfile} parameter to @ref{597,,SSLContext.load_cert_chain()}
needs to be passed.  If the private key is stored
with the certificate, it should come before the first certificate in
the certificate chain:

@example
-----BEGIN RSA PRIVATE KEY-----
... (private key in base64 encoding) ...
-----END RSA PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
... (certificate in base64 PEM encoding) ...
-----END CERTIFICATE-----
@end example

@node 자체 서명 인증서,,결합한 키와 인증서,인증서
@anchor{library/ssl self-signed-certificates}@anchor{3a37}
@subsubsection 자체 서명 인증서


SSL-암호화된 연결 서비스를 제공하는 서버를 만들려면, 해당 서비스에 대한 인증서를 얻어야 합니다. 인증 기관에서 사는 등 다양한 방법으로 적절한 인증서를 얻을 수 있습니다. 또 다른 일반적인 관행은 자체 서명 인증서를 생성하는 것입니다. 이렇게 하는 가장 간단한 방법은 OpenSSL 패키지에서 다음과 같은 방법을 사용하는 것입니다:

@example
% openssl req -new -x509 -days 365 -nodes -out cert.pem -keyout cert.pem
Generating a 1024 bit RSA private key
.......++++++
.............................++++++
writing new private key to 'cert.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:US
State or Province Name (full name) [Some-State]:MyState
Locality Name (eg, city) []:Some City
Organization Name (eg, company) [Internet Widgits Pty Ltd]:My Organization, Inc.
Organizational Unit Name (eg, section) []:My Group
Common Name (eg, YOUR name) []:myserver.mygroup.myorganization.com
Email Address []:ops@@myserver.mygroup.myorganization.com
%
@end example

자체 서명 인증서의 단점은 그 자신이 루트 인증서이고, 아무도 그들의 알려진(그리고 신뢰할 수 있는) 루트 인증서의 캐시에 이 인증서를 갖고 있지 않다는 것입니다.

@node 예제<19>,비 블로킹 소켓에 대한 참고 사항,인증서,ssl — TLS/SSL wrapper for socket objects
@anchor{library/ssl examples}@anchor{3a38}
@subsubsection 예제


@menu
* SSL 지원 검사하기:: 
* 클라이언트 측 연산:: 
* 서버 측 연산:: 

@end menu

@node SSL 지원 검사하기,클라이언트 측 연산,,예제<19>
@anchor{library/ssl testing-for-ssl-support}@anchor{3a39}
@subsubsection SSL 지원 검사하기


파이썬 설치에 SSL 지원이 있는지를 검사하려면, 사용자 코드는 다음과 같은 관용구를 사용해야 합니다:

@example
try:
    import ssl
except ImportError:
    pass
else:
    ...  # do something that requires SSL support
@end example

@node 클라이언트 측 연산,서버 측 연산,SSL 지원 검사하기,예제<19>
@anchor{library/ssl client-side-operation}@anchor{3a3a}
@subsubsection 클라이언트 측 연산


이 예제는 자동 인증서 확인을 포함하여 클라이언트 소켓에 대해 권장되는 보안 설정을 사용하여 SSL 컨텍스트를 만듭니다:

@example
>>> context = ssl.create_default_context()
@end example

보안 설정을 직접 조정하려면, 처음부터 컨텍스트를 만들 수 있습니다 (그러나 올바른 설정을 얻지 못할 수도 있습니다):

@example
>>> context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
>>> context.load_verify_locations("/etc/ssl/certs/ca-bundle.crt")
@end example

(이 코드 조각은 운영 체제가 모든 CA 인증서 번들을 @code{/etc/ssl/certs/ca-bundle.crt}에 배치한다고 가정합니다; 그렇지 않으면, 에러가 발생하고 위치를 조정해야 합니다)

@ref{a72,,PROTOCOL_TLS_CLIENT} 프로토콜은 인증서 유효성 검사와 호스트 이름 확인을 위한 컨텍스트를 구성합니다. @ref{39e7,,verify_mode}는 @ref{39e8,,CERT_REQUIRED}로 설정되고 @ref{39fb,,check_hostname}는 @code{True}로 설정됩니다. 다른 모든 프로토콜은 안전하지 않은 기본값으로 SSL 컨텍스트를 만듭니다.

컨텍스트를 사용하여 서버에 연결할 때, @ref{39e8,,CERT_REQUIRED}와 @ref{39fb,,check_hostname}은 서버 인증서의 유효성을 검사합니다: 서버 인증서가 CA 인증서 중 하나를 사용하여 서명되었는지 확인하고, 서명의 정확성을 검사하고, 호스트 이름의 유효성과 아이덴티티와 같은 다른 속성을 확인합니다:

@example
>>> conn = context.wrap_socket(socket.socket(socket.AF_INET),
...                            server_hostname="www.python.org")
>>> conn.connect(("www.python.org", 443))
@end example

그런 다음 인증서를 가져올 수 있습니다:

@example
>>> cert = conn.getpeercert()
@end example

시각적인 검사는 인증서가 원하는 서비스(즉, HTTPS 호스트 @code{www.python.org})를 식별함을 보여줍니다:

@example
>>> pprint.pprint(cert)
@{'OCSP': ('http://ocsp.digicert.com',),
 'caIssuers': ('http://cacerts.digicert.com/DigiCertSHA2ExtendedValidationServerCA.crt',),
 'crlDistributionPoints': ('http://crl3.digicert.com/sha2-ev-server-g1.crl',
                           'http://crl4.digicert.com/sha2-ev-server-g1.crl'),
 'issuer': ((('countryName', 'US'),),
            (('organizationName', 'DigiCert Inc'),),
            (('organizationalUnitName', 'www.digicert.com'),),
            (('commonName', 'DigiCert SHA2 Extended Validation Server CA'),)),
 'notAfter': 'Sep  9 12:00:00 2016 GMT',
 'notBefore': 'Sep  5 00:00:00 2014 GMT',
 'serialNumber': '01BB6F00122B177F36CAB49CEA8B6B26',
 'subject': ((('businessCategory', 'Private Organization'),),
             (('1.3.6.1.4.1.311.60.2.1.3', 'US'),),
             (('1.3.6.1.4.1.311.60.2.1.2', 'Delaware'),),
             (('serialNumber', '3359300'),),
             (('streetAddress', '16 Allen Rd'),),
             (('postalCode', '03894-4801'),),
             (('countryName', 'US'),),
             (('stateOrProvinceName', 'NH'),),
             (('localityName', 'Wolfeboro'),),
             (('organizationName', 'Python Software Foundation'),),
             (('commonName', 'www.python.org'),)),
 'subjectAltName': (('DNS', 'www.python.org'),
                    ('DNS', 'python.org'),
                    ('DNS', 'pypi.org'),
                    ('DNS', 'docs.python.org'),
                    ('DNS', 'testpypi.org'),
                    ('DNS', 'bugs.python.org'),
                    ('DNS', 'wiki.python.org'),
                    ('DNS', 'hg.python.org'),
                    ('DNS', 'mail.python.org'),
                    ('DNS', 'packaging.python.org'),
                    ('DNS', 'pythonhosted.org'),
                    ('DNS', 'www.pythonhosted.org'),
                    ('DNS', 'test.pythonhosted.org'),
                    ('DNS', 'us.pycon.org'),
                    ('DNS', 'id.python.org')),
 'version': 3@}
@end example

이제 SSL 채널이 설정되고 인증서가 확인되었습니다, 서버와 대화할 수 있습니다:

@example
>>> conn.sendall(b"HEAD / HTTP/1.0\r\nHost: linuxfr.org\r\n\r\n")
>>> pprint.pprint(conn.recv(1024).split(b"\r\n"))
[b'HTTP/1.1 200 OK',
 b'Date: Sat, 18 Oct 2014 18:27:20 GMT',
 b'Server: nginx',
 b'Content-Type: text/html; charset=utf-8',
 b'X-Frame-Options: SAMEORIGIN',
 b'Content-Length: 45679',
 b'Accept-Ranges: bytes',
 b'Via: 1.1 varnish',
 b'Age: 2188',
 b'X-Served-By: cache-lcy1134-LCY',
 b'X-Cache: HIT',
 b'X-Cache-Hits: 11',
 b'Vary: Cookie',
 b'Strict-Transport-Security: max-age=63072000; includeSubDomains',
 b'Connection: close',
 b'@w{'},
 b'@w{'}]
@end example

아래의 @ref{38c5,,보안 고려 사항}의 논의를 참조하십시오.

@node 서버 측 연산,,클라이언트 측 연산,예제<19>
@anchor{library/ssl server-side-operation}@anchor{3a3b}
@subsubsection 서버 측 연산


서버 연산의 경우, 일반적으로 서버 인증서와 개인 키가 각각 파일에 있어야 합니다. 먼저 클라이언트가 여러분의 신원을 확인할 수 있도록 키와 인증서가 있는 컨텍스트를 만듭니다. 그런 다음 소켓을 열고, 포트에 바인드 하고, @code{listen()}을 호출한 다음 클라이언트가 연결하기를 기다립니다:

@example
import socket, ssl

context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)
context.load_cert_chain(certfile="mycertfile", keyfile="mykeyfile")

bindsocket = socket.socket()
bindsocket.bind(('myaddr.example.com', 10023))
bindsocket.listen(5)
@end example

클라이언트가 연결하면, 소켓에서 @code{accept()}를 호출하여 다른 쪽 끝과 연결된 새 소켓을 얻고, 컨텍스트의 @ref{747,,SSLContext.wrap_socket()} 메서드를 사용하여 연결을 위한 서버 측 SSL 소켓을 만듭니다.:

@example
while True:
    newsocket, fromaddr = bindsocket.accept()
    connstream = context.wrap_socket(newsocket, server_side=True)
    try:
        deal_with_client(connstream)
    finally:
        connstream.shutdown(socket.SHUT_RDWR)
        connstream.close()
@end example

그런 다음 @code{connstream}에서 데이터를 읽고 클라이언트와 작업을 마칠 때까지 (또는 클라이언트가 마칠 때까지) 뭔가 합니다:

@example
def deal_with_client(connstream):
    data = connstream.recv(1024)
    # empty data means the client is finished with us
    while data:
        if not do_something(connstream, data):
            # we'll assume do_something returns False
            # when we're finished with client
            break
        data = connstream.recv(1024)
    # finished with client
@end example

그리고는 새로운 클라이언트 연결을 리스닝하는 것으로 돌아갑니다 (물론, 실제 서버는 별도의 스레드에서 각 클라이언트 연결을 처리하거나 소켓을 @ref{39ed,,비 블로킹 모드}로 만들고 이벤트 루프를 사용합니다).

@node 비 블로킹 소켓에 대한 참고 사항,Memory BIO support,예제<19>,ssl — TLS/SSL wrapper for socket objects
@anchor{library/ssl notes-on-non-blocking-sockets}@anchor{3a3c}@anchor{library/ssl ssl-nonblocking}@anchor{39ed}
@subsubsection 비 블로킹 소켓에 대한 참고 사항


SSL 소켓은 비 블로킹 모드에서 일반 소켓과 약간 다르게 작동합니다. 비 블로킹 소켓으로 작업할 때 주의해야 할 몇 가지 사항이 있습니다:


@itemize -

@item 
대부분 @ref{ae7,,SSLSocket} 메서드는 I/O 연산이 블록하려고 할 때 @ref{235,,BlockingIOError} 대신 @ref{1069,,SSLWantWriteError} 나 @ref{1068,,SSLWantReadError}를 발생시킵니다. 하부 소켓에서의 읽기 연산이 필요하면 @code{SSLWantReadError}가 발생하고, 하부 소켓에서의 쓰기 연산이 필요하면 @code{SSLWantWriteError}가 발생합니다. SSL 소켓에 대한 `쓰기' 시도는 우선 하부 소켓에서 `읽기'가 필요할 수 있으며, SSL 소켓에서 `읽기'를 시도하면 하부 소켓에서 선행 `쓰기'가 필요할 수 있습니다.


버전 3.5에서 변경: 이전 파이썬 버전에서는, @code{SSLSocket.send()} 메서드가 @ref{1069,,SSLWantWriteError} 나 @ref{1068,,SSLWantReadError}를 발생시키는 대신 0을 반환했습니다.


@item 
@ref{f9f,,select()}를 호출하면 OS-수준 소켓을 읽을 수 있음을 (또는 쓸 수 있음을) 알려줄 수 있습니다만, 이것이 상위 SSL 계층에 충분한 데이터가 있음을 의미하지는 않습니다. 예를 들어, SSL 프레임의 일부만 도착했을 수 있습니다. 따라서, @code{SSLSocket.recv()} 와 @code{SSLSocket.send()} 실패를 처리할 준비가 되어 있어야 하며, @code{select()}를 다시 호출한 후 재시도해야 합니다.

@item 
반대로, SSL 계층에는 자체 프레임이 있으므로, SSL 소켓에는 @ref{f9f,,select()}가 인식하지 못하더라도 읽을 수 있는 데이터가 있을 수 있습니다. 따라서, 먼저 @code{SSLSocket.recv()}를 호출하여 잠재적으로 사용 가능한 모든 데이터를 꺼낸 다음, 여전히 필요할 때만 @code{select()} 호출에 블록해야 합니다.

(물론, @ref{30d0,,poll()} 이나 @ref{c7,,selectors} 모듈에 있는 것과 같은 다른 프리미티브를 사용할 때도 비슷한 조항이 적용됩니다)

@item 
SSL 핸드 셰이크 자체는 비 블로킹입니다: @ref{106c,,SSLSocket.do_handshake()} 메서드는 성공적으로 반환될 때까지 재시도해야 합니다. 다음은 @ref{f9f,,select()}를 사용하여 소켓의 준비 상태를 기다리는 개요입니다:

@example
while True:
    try:
        sock.do_handshake()
        break
    except ssl.SSLWantReadError:
        select.select([sock], [], [])
    except ssl.SSLWantWriteError:
        select.select([], [sock], [])
@end example
@end itemize


@subsubheading 더 보기


The @ref{b,,asyncio} module supports @ref{39ed,,non-blocking SSL sockets} and provides a higher level @ref{37ea,,Streams API}.
It polls for events using the @ref{c7,,selectors} module and
handles @ref{1069,,SSLWantWriteError}, @ref{1068,,SSLWantReadError} and
@ref{235,,BlockingIOError} exceptions. It runs the SSL handshake asynchronously
as well.


@node Memory BIO support,SSL 세션,비 블로킹 소켓에 대한 참고 사항,ssl — TLS/SSL wrapper for socket objects
@anchor{library/ssl memory-bio-support}@anchor{3a3d}
@subsubsection Memory BIO support



Added in version 3.5.


SSL 모듈이 파이썬 2.6에서 소개된 이래로, @ref{ae7,,SSLSocket} 클래스는 관련성이 있지만, 별개의 두 기능 영역을 제공했습니다:


@itemize -

@item 
SSL 프로토콜 처리

@item 
네트워크 IO
@end itemize

네트워크 IO API는 @ref{fa0,,socket.socket}가 제공하는 것과 같으며, @ref{ae7,,SSLSocket}는 그 것을 상속합니다. 이렇게해서 SSL 소켓을 일반 소켓의 드롭 인 대체품으로 사용할 수 있으므로, 기존 응용 프로그램에 SSL 지원을 쉽게 추가 할 수 있습니다.

SSL 프로토콜 처리와 네트워크 IO의 결합은 일반적으로 잘 작동하지만, 그렇지 않은 경우도 있습니다. @ref{fa0,,socket.socket} 과 내부 OpenSSL 소켓 IO 루틴이 가정하는 “파일 기술자에 대한 select/poll” (준비 상태 기반) 모델과 다른 IO 멀티플렉싱 모델을 사용하려는 비동기 IO 프레임워크가 그 예입니다. 이것은 주로 이 모델이 효율적이지 않은 윈도우와 같은 플랫폼과 관련이 있습니다. 이를 위해, @ref{d79,,SSLObject}라는 @ref{ae7,,SSLSocket}의 축소된 범위 변형이 제공됩니다.

@geindex SSLObject (ssl 클래스)
@anchor{library/ssl ssl SSLObject}@anchor{d79}
@deffn {클래스} ssl.SSLObject

네트워크 IO 메서드를 포함하지 않는 SSL 프로토콜 인스턴스를 나타내는 @ref{ae7,,SSLSocket}의 축소 범위 변형입니다. 이 클래스는 일반적으로 메모리 버퍼를 통해 SSL 용 비동기 IO를 구현하려는 프레임워크 작성자가 사용합니다.

이 클래스는 OpenSSL에 의해 구현된 저수준 SSL 객체 위에 인터페이스를 구현합니다. 이 객체는 SSL 연결의 상태를 캡처하지만, 네트워크 IO 자체를 제공하지는 않습니다. IO는 OpenSSL의 IO 추상화 계층인 별도의 “BIO” 객체를 통해 수행되어야 합니다.

이 클래스에는 공개된 생성자가 없습니다. @ref{d79,,SSLObject} 인스턴스는 @ref{d7a,,wrap_bio()} 메서드를 사용해서 만들어야 합니다. 이 메서드는 @code{SSLObject} 인스턴스를 생성하고 BIO 쌍에 연결합니다. `incoming' BIO는 파이썬에서 SSL 프로토콜 인스턴스로 데이터를 전달하는 데 사용되는 반면, `outgoing' BIO는 반대 방향으로 데이터를 전달하는 데 사용됩니다.

다음 메서드를 사용할 수 있습니다:


@itemize -

@item 
@ref{3a24,,context}

@item 
@ref{3a26,,server_side}

@item 
@ref{d77,,server_hostname}

@item 
@ref{193e,,session}

@item 
@ref{3a27,,session_reused}

@item 
@ref{106d,,read()}

@item 
@ref{106e,,write()}

@item 
@ref{11b7,,getpeercert()}

@item 
@ref{195d,,get_verified_chain()}

@item 
@ref{195e,,get_unverified_chain()}

@item 
@ref{1064,,selected_alpn_protocol()}

@item 
@ref{a74,,selected_npn_protocol()}

@item 
@ref{390a,,cipher()}

@item 
@ref{106b,,shared_ciphers()}

@item 
@ref{134a,,compression()}

@item 
@ref{3a25,,pending()}

@item 
@ref{106c,,do_handshake()}

@item 
@ref{c26,,verify_client_post_handshake()}

@item 
@ref{3a23,,unwrap()}

@item 
@ref{1349,,get_channel_binding()}

@item 
@ref{1067,,version()}
@end itemize

@ref{ae7,,SSLSocket}와 비교할 때, 이 객체에는 다음과 같은 기능이 없습니다:


@itemize -

@item 
모든 형태의 네트워크 IO; @code{recv()} 와 @code{send()}는 하부 @ref{1061,,MemoryBIO} 버퍼만 읽고 씁니다.

@item 
`do_handshake_on_connect' 기작이 없습니다. 핸드 셰이크를 시작하려면 항상 @ref{106c,,do_handshake()}를 수동으로 호출해야 합니다.

@item 
`suppress_ragged_eofs'는 처리되지 않습니다. 프로토콜을 위반하는 모든 파일 끝(end-of-file) 조건은 @ref{1ab7,,SSLEOFError} 예외를 통해 보고됩니다.

@item 
메서드 @ref{3a23,,unwrap()} 호출은 하부 소켓을 반환하는 SSL 소켓과 달리 아무것도 반환하지 않습니다.

@item 
@ref{11b6,,SSLContext.set_servername_callback()}에 전달된 `server_name_callback' 콜백은 첫 번째 매개 변수로 @ref{ae7,,SSLSocket} 인스턴스 대신 @ref{d79,,SSLObject} 인스턴스를 받습니다.
@end itemize

@ref{d79,,SSLObject} 사용과 관련된 몇 가지 참고 사항:


@itemize -

@item 
@ref{d79,,SSLObject}의 모든 IO는 @ref{39ed,,비 블로킹}입니다. 이것은 예를 들어 @ref{106d,,read()}는 incoming BIO에 있는 것보다 많은 데이터가 필요하면 @ref{1068,,SSLWantReadError}를 발생시킨다는 것을 의미합니다.
@end itemize


버전 3.7에서 변경: @code{SSLObject} instances must be created with
@ref{d7a,,wrap_bio()}. In earlier versions, it was possible to
create instances directly. This was never documented or officially
supported.

@end deffn

SSLObject는 메모리 버퍼를 사용하여 바깥세상과 통신합니다. @ref{1061,,MemoryBIO} 클래스는 이 목적으로 사용할 수 있는 메모리 버퍼를 제공합니다. OpenSSL 메모리 BIO (Basic IO) 객체를 감쌉니다:

@geindex MemoryBIO (ssl 클래스)
@anchor{library/ssl ssl MemoryBIO}@anchor{1061}
@deffn {클래스} ssl.MemoryBIO

파이썬과 SSL 프로토콜 인스턴스 간에 데이터를 전달하는 데 사용할 수 있는 메모리 버퍼.

@geindex pending (ssl.MemoryBIO의 속성)
@anchor{library/ssl ssl MemoryBIO pending}@anchor{3a3e}
@deffn {속성} pending

현재 메모리 버퍼에 있는 바이트의 수를 반환합니다.
@end deffn

@geindex eof (ssl.MemoryBIO의 속성)
@anchor{library/ssl ssl MemoryBIO eof}@anchor{3a3f}
@deffn {속성} eof

메모리 BIO가 현재 EOF(end-of-file) 위치에 있는지를 나타내는 논릿값입니다.
@end deffn

@geindex read() (ssl.MemoryBIO 메서드)
@anchor{library/ssl ssl MemoryBIO read}@anchor{3a40}
@deffn {메서드} read (n=-1, /)

메모리 버퍼에서 최대 `n' 바이트를 읽습니다. `n'이 지정되지 않았거나 음수면, 모든 바이트가 반환됩니다.
@end deffn

@geindex write() (ssl.MemoryBIO 메서드)
@anchor{library/ssl ssl MemoryBIO write}@anchor{3a41}
@deffn {메서드} write (buf, /)

`buf'의 바이트를 메모리 BIO에 씁니다. `buf' 인자는 버퍼 프로토콜을 지원하는 객체여야 합니다.

반환 값은 기록된 바이트 수인데, 항상 `buf'의 길이와 같습니다.
@end deffn

@geindex write_eof() (ssl.MemoryBIO 메서드)
@anchor{library/ssl ssl MemoryBIO write_eof}@anchor{3a42}
@deffn {메서드} write_eof ()

EOF 마커를 메모리 BIO에 씁니다. 이 메서드가 호출된 후, @ref{3a41,,write()}를 호출하는 것은 불법입니다. @ref{3a3f,,eof} 어트리뷰트는 현재 버퍼에 있는 모든 데이터를 읽은 후에 참이 됩니다.
@end deffn
@end deffn

@node SSL 세션,보안 고려 사항<3>,Memory BIO support,ssl — TLS/SSL wrapper for socket objects
@anchor{library/ssl ssl-session}@anchor{3a43}
@subsubsection SSL 세션



Added in version 3.6.


@geindex SSLSession (ssl 클래스)
@anchor{library/ssl ssl SSLSession}@anchor{ed8}
@deffn {클래스} ssl.SSLSession

@ref{193e,,session}에서 사용되는 세션 객체.

@geindex id (ssl.SSLSession의 속성)
@anchor{library/ssl ssl SSLSession id}@anchor{3a44}
@deffn {속성} id
@end deffn

@geindex time (ssl.SSLSession의 속성)
@anchor{library/ssl ssl SSLSession time}@anchor{3a45}
@deffn {속성} time
@end deffn

@geindex timeout (ssl.SSLSession의 속성)
@anchor{library/ssl ssl SSLSession timeout}@anchor{3a46}
@deffn {속성} timeout
@end deffn

@geindex ticket_lifetime_hint (ssl.SSLSession의 속성)
@anchor{library/ssl ssl SSLSession ticket_lifetime_hint}@anchor{3a47}
@deffn {속성} ticket_lifetime_hint
@end deffn

@geindex has_ticket (ssl.SSLSession의 속성)
@anchor{library/ssl ssl SSLSession has_ticket}@anchor{3a48}
@deffn {속성} has_ticket
@end deffn
@end deffn

@node 보안 고려 사항<3>,TLS 1 3,SSL 세션,ssl — TLS/SSL wrapper for socket objects
@anchor{library/ssl security-considerations}@anchor{3a49}@anchor{library/ssl ssl-security}@anchor{38c5}
@subsubsection 보안 고려 사항


@menu
* 가장 좋은 기본값:: 
* 수동 설정:: 
* 다중 프로세싱:: 

@end menu

@node 가장 좋은 기본값,수동 설정,,보안 고려 사항<3>
@anchor{library/ssl best-defaults}@anchor{3a4a}
@subsubsection 가장 좋은 기본값


`클라이언트'의 경우, 보안 정책에 대한 특별한 요구 사항이 없으면, @ref{480,,create_default_context()} 함수를 사용하여 SSL 컨텍스트를 만드는 것이 좋습니다. 시스템의 신뢰할 수 있는 CA 인증서를 로드하고, 인증서 유효성 검사와 호스트 이름 검사를 활성화하고, 합리적으로 안전한 프로토콜과 사이퍼 설정을 선택합니다.

예를 들어, 다음은 @ref{b27,,smtplib.SMTP} 클래스를 사용하여 SMTP 서버에 대한 신뢰할 수 있고 안전한 연결을 만드는 방법입니다:

@example
>>> import ssl, smtplib
>>> smtp = smtplib.SMTP("mail.python.org", port=587)
>>> context = ssl.create_default_context()
>>> smtp.starttls(context=context)
(220, b'2.0.0 Ready to start TLS')
@end example

연결에 클라이언트 인증서가 필요하면, @ref{597,,SSLContext.load_cert_chain()}으로 추가할 수 있습니다.

대조적으로, @ref{357,,SSLContext} 생성자를 직접 호출하여 SSL 컨텍스트를 만들면, 기본적으로 인증서 유효성 검사나 호스트 이름 확인이 활성화되지 않습니다. 그렇게 하면, 아래 단락을 읽고 적절한 보안 수준을 달성하십시오.

@node 수동 설정,다중 프로세싱,가장 좋은 기본값,보안 고려 사항<3>
@anchor{library/ssl manual-settings}@anchor{3a4b}
@subsubsection 수동 설정


@menu
* 인증서 확인:: 
* 프로토콜 버전:: 
* 사이퍼 선택:: 

@end menu

@node 인증서 확인,프로토콜 버전,,수동 설정
@anchor{library/ssl verifying-certificates}@anchor{3a4c}
@subsubsection 인증서 확인


When calling the @ref{357,,SSLContext} constructor directly,
@ref{39f9,,CERT_NONE} is the default.  Since it does not authenticate the other
peer, it can be insecure, especially in client mode where most of the time you
would like to ensure the authenticity of the server you’re talking to.
Therefore, when in client mode, it is highly recommended to use
@ref{39e8,,CERT_REQUIRED}.  However, it is in itself not sufficient; you also
have to check that the server certificate, which can be obtained by calling
@ref{11b7,,SSLSocket.getpeercert()}, matches the desired service.  For many
protocols and applications, the service can be identified by the hostname.
This common check is automatically performed when
@ref{39fb,,SSLContext.check_hostname} is enabled.


버전 3.7에서 변경: Hostname matchings is now performed by OpenSSL. Python no longer uses
@code{match_hostname()}.


서버 모드에서, (고수준 인증 메커니즘을 사용하는 대신) SSL 계층을 사용하여 클라이언트를 인증하려면, @ref{39e8,,CERT_REQUIRED}를 지정하고 클라이언트 인증서도 비슷하게 확인해야 합니다.

@node 프로토콜 버전,사이퍼 선택,인증서 확인,수동 설정
@anchor{library/ssl protocol-versions}@anchor{3a4d}
@subsubsection 프로토콜 버전


SSL 버전 2와 3은 안전하지 않은 것으로 간주하므로 사용하기에 위험합니다. 클라이언트와 서버 간에 최대한의 호환성을 원하면 프로토콜 버전으로 @ref{a72,,PROTOCOL_TLS_CLIENT} 나 @ref{a73,,PROTOCOL_TLS_SERVER}를 사용하는 것이 좋습니다. SSLv2 및 SSLv3은 기본적으로 비활성화되어 있습니다.

@example
>>> client_context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
>>> client_context.minimum_version = ssl.TLSVersion.TLSv1_3
>>> client_context.maximum_version = ssl.TLSVersion.TLSv1_3
@end example

The SSL context created above will only allow TLSv1.3 and later (if
supported by your system) connections to a server. @ref{a72,,PROTOCOL_TLS_CLIENT}
implies certificate validation and hostname checks by default. You have to
load certificates into the context.

@node 사이퍼 선택,,프로토콜 버전,수동 설정
@anchor{library/ssl cipher-selection}@anchor{3a4e}
@subsubsection 사이퍼 선택


If you have advanced security requirements, fine-tuning of the ciphers
enabled when negotiating a SSL session is possible through the
@ref{3a2a,,SSLContext.set_ciphers()} method.  Starting from Python 3.2.3, the
ssl module disables certain weak ciphers by default, but you may want
to further restrict the cipher choice. Be sure to read OpenSSL’s documentation
about the cipher list format@footnote{https://docs.openssl.org/1.1.1/man1/ciphers/#cipher-list-format}.
If you want to check which ciphers are enabled by a given cipher list, use
@ref{ed9,,SSLContext.get_ciphers()} or the @code{openssl ciphers} command on your
system.

@node 다중 프로세싱,,수동 설정,보안 고려 사항<3>
@anchor{library/ssl multi-processing}@anchor{3a4f}
@subsubsection 다중 프로세싱


If using this module as part of a multi-processed application (using,
for example the @ref{98,,multiprocessing} or @ref{24,,concurrent.futures} modules),
be aware that OpenSSL’s internal random number generator does not properly
handle forked processes.  Applications must change the PRNG state of the
parent process if they use any SSL feature with @ref{4b6,,os.fork()}.  Any
successful call of @ref{39f3,,RAND_add()} or @ref{746,,RAND_bytes()} is
sufficient.

@node TLS 1 3,,보안 고려 사항<3>,ssl — TLS/SSL wrapper for socket objects
@anchor{library/ssl ssl-tlsv1-3}@anchor{d78}@anchor{library/ssl tls-1-3}@anchor{3a50}
@subsubsection TLS 1.3



Added in version 3.7.


The TLS 1.3 protocol behaves slightly differently than previous version
of TLS/SSL. Some new TLS 1.3 features are not yet available.


@itemize -

@item 
TLS 1.3은 분리된 사이퍼 스위트 집합을 사용합니다. 모든 AES-GCM과 ChaCha20 사이퍼 스위트는 기본적으로 활성화되어 있습니다. @ref{3a2a,,SSLContext.set_ciphers()} 메서드는 아직 TLS 1.3 사이퍼를 활성화하거나 비활성화할 수 없지만, @ref{ed9,,SSLContext.get_ciphers()}는 이들을 반환합니다.

@item 
세션 티켓은 더는 초기 핸드 셰이크의 일부로 전송되지 않고 다르게 처리됩니다. @ref{193e,,SSLSocket.session} 과 @ref{ed8,,SSLSession}은 TLS 1.3과 호환되지 않습니다.

@item 
클라이언트 측 인증서도 더는 초기 핸드 셰이크 중에 검증되지 않습니다. 서버는 언제든지 인증서를 요청할 수 있습니다. 클라이언트는 서버와 응용 프로그램 데이터를 주고받는 동안 인증서 요청을 처리합니다.

@item 
초기 데이터(early data), 지연된 TLS 클라이언트 인증서 요청, 서명 알고리즘 구성 및 rekeying과 같은 TLS 1.3 기능은 아직 지원되지 않습니다.
@end itemize


@subsubheading 더 보기



@table @asis

@item @ref{fa0,,socket.socket} 클래스

하부 @ref{d1,,socket} 클래스의 설명서

@item SSL/TLS Strong Encryption: An Introduction@footnote{https://httpd.apache.org/docs/trunk/en/ssl/ssl_intro.html}

Apache HTTP 서버 설명서의 개요

@geindex RFC; RFC 1422

@item RFC 1422: Privacy Enhancement for Internet Electronic Mail: Part II: Certificate-Based Key Management@footnote{https://datatracker.ietf.org/doc/html/rfc1422.html}

Steve Kent

@geindex RFC; RFC 4086

@item RFC 4086: Randomness Requirements for Security@footnote{https://datatracker.ietf.org/doc/html/rfc4086.html}

Donald E. Eastlake, Jeffrey I. Schiller, Steve Crocker

@geindex RFC; RFC 5280

@item RFC 5280: Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile@footnote{https://datatracker.ietf.org/doc/html/rfc5280.html}

David Cooper et al.

@geindex RFC; RFC 5246

@item RFC 5246: The Transport Layer Security (TLS) Protocol Version 1.2@footnote{https://datatracker.ietf.org/doc/html/rfc5246.html}

Tim Dierks and Eric Rescorla.

@geindex RFC; RFC 6066

@item RFC 6066: Transport Layer Security (TLS) Extensions@footnote{https://datatracker.ietf.org/doc/html/rfc6066.html}

Donald E. Eastlake

@item IANA TLS: Transport Layer Security (TLS) Parameters@footnote{https://www.iana.org/assignments/tls-parameters/tls-parameters.xml}

IANA

@geindex RFC; RFC 7525

@item RFC 7525: Recommendations for Secure Use of Transport Layer Security (TLS) and Datagram Transport Layer Security (DTLS)@footnote{https://datatracker.ietf.org/doc/html/rfc7525.html}

IETF

@item 모질라의 서버 측 TLS 추천@footnote{https://wiki.mozilla.org/Security/Server_Side_TLS}

Mozilla
@end table


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node select — I/O 완료 대기,selectors — 고수준 I/O 다중화,ssl — TLS/SSL wrapper for socket objects,네트워킹과 프로세스 간 통신
@anchor{library/select doc}@anchor{3a51}@anchor{library/select module-select}@anchor{c6}@anchor{library/select select-waiting-for-i-o-completion}@anchor{3a52}@anchor{library/select translation-repo}@anchor{3a53}
@subsection @code{select} — I/O 완료 대기


@geindex module; select


__________________________________________________________________


이 모듈은 대부분의 운영 체제에서 사용 가능한 @code{select()}와 @code{poll()} 함수, Solaris와 파생 제품에서 사용 가능한 @code{devpoll()}, 리눅스 2.5+ 에서 사용 가능한 @code{epoll()} 및 대부분의 BSD에서 사용 가능한 @code{kqueue()}에 대한 액세스를 제공합니다. 윈도우에서는 소켓에서만 작동함에 유의하십시오; 다른 운영 체제에서는, 다른 파일 유형에서도 작동합니다 (특히, 유닉스에서는 파이프에서도 작동합니다). 일반 파일에서 파일을 마지막으로 읽은 이후에 파일이 커졌는지를 판별하기 위해 사용할 수는 없습니다.

@cartouche
@quotation 참고 
The @ref{c7,,selectors} module allows high-level and efficient I/O
multiplexing, built upon the @code{select} module primitives. Users are
encouraged to use the @code{selectors} module instead, unless they want
precise control over the OS-level primitives used.
@end quotation
@end cartouche

@c include for modules that don't work on WASM

@ref{213c,,가용성}: not WASI.

이 모듈은 웹어셈블리에서 작동하지 않거나 제공되지 않습니다. 자세한 내용은 @ref{1b68,,웹어셈블리 플랫폼}을 참조하세요.

모듈은 다음을 정의합니다:

@geindex error
@anchor{library/select select error}@anchor{1256}
@deffn {예외} select.error

@ref{2c0,,OSError}의 폐지된 별칭.


버전 3.3에서 변경: 
@geindex Python 향상 제안; PEP 3151
PEP 3151@footnote{https://peps.python.org/pep-3151/}에 따라, 이 클래스는 @ref{2c0,,OSError}의 별칭이 되었습니다.

@end deffn

@geindex devpoll() (select 모듈)
@anchor{library/select select devpoll}@anchor{1195}
@deffn {함수} select.devpoll ()

(Solaris와 파생 제품에서만 지원됩니다.) @code{/dev/poll} 폴링(polling) 객체를 반환합니다; devpoll 객체가 지원하는 메서드에 대해서는 아래의 @ref{3a54,,/dev/poll 폴링 객체} 섹션을 참조하십시오.

@code{devpoll()} 객체는 인스턴스 화 시점에 허용되는 파일 기술자 수에 연결됩니다. 프로그램이 이 값을 줄이면, @code{devpoll()}이 실패합니다. 프로그램이 이 값을 늘리면, @code{devpoll()}은 불완전한 활성 파일 기술자 리스트를 반환할 수 있습니다.

새 파일 기술자는 @ref{10fb,,상속 불가능}합니다.


Added in version 3.3.



버전 3.4에서 변경: 새 파일 기술자는 이제 상속 불가능합니다.

@end deffn

@geindex epoll() (select 모듈)
@anchor{library/select select epoll}@anchor{1193}
@deffn {함수} select.epoll (sizehint=-1, flags=0)

(리눅스 2.5.44 이상에서만 지원됩니다.) I/O 이벤트를 위한 에지(Edge)나 레벨(Level) 트리거 되는 인터페이스로 사용할 수 있는 에지 폴링 객체를 반환합니다.

`sizehint'는 epoll에 등록될 예상 이벤트 수를 알려줍니다. 양수이거나, 기본값을 사용하려면 @code{-1}이어야 합니다. @code{epoll_create1()}을 사용할 수 없는 구형 시스템에서만 사용됩니다; 그렇지 않으면 효과가 없습니다 (값을 여전히 확인하기는 합니다).

`flags'는 폐지되었고 완전히 무시됩니다. 그러나, 제공되면, 값은 @code{0}이나 @code{select.EPOLL_CLOEXEC}여야 합니다. 그렇지 않으면 @code{OSError}가 발생합니다.

epolling 객체가 지원하는 메서드는 아래의 @ref{3a55,,에지와 레벨 트리거 폴링 (epoll) 객체} 섹션을 참조하십시오.

@code{epoll} 객체는 컨텍스트 관리자 프로토콜을 지원합니다: @ref{186,,with} 문에서 사용될 때, 새 파일 기술자는 블록 끝에서 자동으로 닫힙니다.

새 파일 기술자는 @ref{10fb,,상속 불가능}합니다.


버전 3.3에서 변경: `flags' 매개 변수를 추가했습니다.



버전 3.4에서 변경: @ref{186,,with} 문에 대한 지원이 추가되었습니다. 새로운 파일 기술자는 이제 상속 불가능합니다.



버전 3.4부터 폐지됨: `flags' 매개 변수. 이제 기본적으로 @code{select.EPOLL_CLOEXEC}가 사용됩니다. 파일 기술자를 상속 가능하게 하려면 @ref{10fd,,os.set_inheritable()}을 사용하십시오.

@end deffn

@geindex poll() (select 모듈)
@anchor{library/select select poll}@anchor{30d0}
@deffn {함수} select.poll ()

(모든 운영 체제에서 지원되는 것은 아닙니다.) 파일 기술자 등록과 등록 해지를 지원하고 그런 다음 I/O 이벤트에 대해 폴링하는 폴링 객체를 반환합니다; 폴링 객체가 지원하는 메서드에 대해서는 아래의 @ref{3a56,,폴링 객체} 섹션을 참조하십시오.
@end deffn

@geindex kqueue() (select 모듈)
@anchor{library/select select kqueue}@anchor{1a43}
@deffn {함수} select.kqueue ()

(BSD에서만 지원됩니다.) 커널 큐 객체를 반환합니다; kqueue 객체가 지원하는 메서드에 대해서는 아래의 @ref{3a57,,Kqueue 객체} 섹션을 참조하십시오.

새 파일 기술자는 @ref{10fb,,상속 불가능}합니다.


버전 3.4에서 변경: 새 파일 기술자는 이제 상속 불가능합니다.

@end deffn

@geindex kevent() (select 모듈)
@anchor{library/select select kevent}@anchor{3a58}
@deffn {함수} select.kevent (ident, filter=KQ_FILTER_READ, flags=KQ_EV_ADD, fflags=0, data=0, udata=0)

(BSD에서만 지원됩니다.) 커널 이벤트 객체를 반환합니다. kevent 객체가 지원하는 메서드에 대해서는 아래의 @ref{3a59,,Kevent 객체} 섹션을 참조하십시오.
@end deffn

@geindex select() (select 모듈)
@anchor{library/select select select}@anchor{f9f}
@deffn {함수} select.select (rlist, wlist, xlist, timeout=None)

이것은 유닉스 @code{select()} 시스템 호출에 대한 간단한 인터페이스입니다. 처음 세 개의 인자는 ‘대기 가능한 객체(waitable objects)’의 이터러블입니다: 대기 가능한 객체는 파일 기술자를 나타내는 정수나 그런 정수를 반환하는 @ref{17b4,,fileno()}라는 매개 변수 없는 메서드를 가진 객체입니다:


@itemize *

@item 
`rlist': 읽을 준비가 될 때까지 기다립니다

@item 
`wlist': 쓰기 준비가 될 때까지 기다립니다

@item 
`xlist': “예외 조건”을 기다립니다 (시스템에서 어떤 것들을 이러한 조건으로 간주하는지는 매뉴얼 페이지를 참조하십시오)
@end itemize

Empty iterables are allowed, but acceptance of three empty iterables is
platform-dependent. (It is known to work on Unix but not on Windows.)  The
optional `timeout' argument specifies a time-out as a floating-point number
in seconds.
When the `timeout' argument is omitted or @code{None}, the function blocks until
at least one file descriptor is ready.  A time-out value of zero specifies a
poll and never blocks.

반환 값은 준비된 객체의 리스트 3개입니다: 처음 세 인자의 부분 집합입니다. 파일 기술자가 준비되지 않고 시간제한에 도달하면, 세 개의 빈 리스트가 반환됩니다.

@geindex socket() (socket 모듈)
@geindex popen() (os 모듈)

이터러블에서 허용되는 객체 형에는 파이썬 @ref{13c8,,파일 객체} (예를 들어 @code{sys.stdin}, 또는 @ref{316,,open()}이나 @ref{31a,,os.popen()}에서 반환된 객체), @ref{fa0,,socket.socket()}에서 반환된 소켓 객체가 있습니다. 적절한 (단지 임의의 정수가 아니라 실제 파일 기술자를 반환하는) @ref{17b4,,fileno()} 메서드가 있는 한, `래퍼 (wrapper)' 클래스를 직접 정의할 수도 있습니다.

@cartouche
@quotation 참고 
@geindex WinSock

윈도우에서 파일 객체는 허용되지 않지만, 소켓은 허용됩니다. 윈도우에서, 하부 @code{select()} 함수는 WinSock 라이브러리에서 제공되며, WinSock에서 생성되지 않은 파일 기술자를 처리하지 않습니다.
@end quotation
@end cartouche


버전 3.5에서 변경: 시그널 처리기가 @ref{f87,,InterruptedError}를 발생시키는 대신 예외를 발생시키는 경우(이유는 
@geindex Python 향상 제안; PEP 475
PEP 475@footnote{https://peps.python.org/pep-0475/}를 참조하십시오)를 제외하고, 시그널에 의해 인터럽트 될 때 다시 계산된 시간제한으로 함수가 다시 시도됩니다.

@end deffn

@geindex PIPE_BUF (select 모듈)
@anchor{library/select select PIPE_BUF}@anchor{140f}
@deffn {데이터} select.PIPE_BUF

The minimum number of bytes which can be written without blocking to a pipe
when the pipe has been reported as ready for writing by @ref{f9f,,select()},
@code{poll()} or another interface in this module.  This doesn’t apply
to other kinds of file-like objects such as sockets.

이 값은 POSIX에서 512 이상이 되도록 보장합니다.

@ref{213c,,가용성}: Unix


Added in version 3.2.

@end deffn

@menu
* /dev/poll 폴링 객체:: 
* 에지와 레벨 트리거 폴링 (epoll) 객체: 에지와 레벨 트리거 폴링 epoll 객체. 
* 폴링 객체:: 
* Kqueue 객체:: 
* Kevent 객체:: 

@end menu

@node /dev/poll 폴링 객체,에지와 레벨 트리거 폴링 epoll 객체,,select — I/O 완료 대기
@anchor{library/select dev-poll-polling-objects}@anchor{3a5a}@anchor{library/select devpoll-objects}@anchor{3a54}
@subsubsection @code{/dev/poll} 폴링 객체


Solaris와 파생 제품에는 @code{/dev/poll}이 있습니다. @code{select()}는 `O'(`가장 높은 파일 기술자')이고 @code{poll()}은 `O'(`파일 기술자 수')이지만 @code{/dev/poll}은 `O'(`활성 파일 기술자')입니다.

@code{/dev/poll} 동작은 표준 @code{poll()} 객체에 매우 가깝습니다.

@geindex close() (select.devpoll 메서드)
@anchor{library/select select devpoll close}@anchor{1197}
@deffn {메서드} devpoll.close ()

폴링 객체의 파일 기술자를 닫습니다.


Added in version 3.4.

@end deffn

@geindex closed (select.devpoll의 속성)
@anchor{library/select select devpoll closed}@anchor{1198}
@deffn {속성} devpoll.closed

폴링 객체가 닫혔으면 @code{True}.


Added in version 3.4.

@end deffn

@geindex fileno() (select.devpoll 메서드)
@anchor{library/select select devpoll fileno}@anchor{1196}
@deffn {메서드} devpoll.fileno ()

폴링 객체의 파일 기술자 번호를 반환합니다.


Added in version 3.4.

@end deffn

@geindex register() (select.devpoll 메서드)
@anchor{library/select select devpoll register}@anchor{3a5b}
@deffn {메서드} devpoll.register (fd[, eventmask])

폴링 객체에 파일 기술자를 등록합니다. 이후 @ref{30d0,,poll()} 메서드에 대한 호출은 파일 기술자에 계류 중인 I/O 이벤트가 있는지 확인합니다. `fd'는 정수이거나, 정수를 반환하는 @ref{17b4,,fileno()} 메서드가 있는 객체일 수 있습니다. 파일 객체는 @code{fileno()}를 구현하므로, 인자로도 사용할 수 있습니다.

`eventmask' is an optional bitmask describing the type of events you want to
check for. The constants are the same as with @code{poll()}
object. The default value is a combination of the constants @code{POLLIN},
@code{POLLPRI}, and @code{POLLOUT}.

@cartouche
@quotation 경고 
이미 등록된 파일 기술자를 등록하는 것은 에러가 아니지만, 결과는 정의되지 않습니다. 적절한 액션은 먼저 unregister 하거나 modify 하는 것입니다. 이것은 @code{poll()}과 비교하여 중요한 차이점입니다.
@end quotation
@end cartouche
@end deffn

@geindex modify() (select.devpoll 메서드)
@anchor{library/select select devpoll modify}@anchor{3a5c}
@deffn {메서드} devpoll.modify (fd[, eventmask])

This method does an @ref{3a5d,,unregister()} followed by a
@ref{3a5b,,register()}. It is (a bit) more efficient than doing the same
explicitly.
@end deffn

@geindex unregister() (select.devpoll 메서드)
@anchor{library/select select devpoll unregister}@anchor{3a5d}
@deffn {메서드} devpoll.unregister (fd)

폴링 객체가 추적하는 파일 기술자를 제거합니다. @ref{3a5b,,register()} 메서드와 마찬가지로, `fd'는 정수이거나 정수를 반환하는 @ref{17b4,,fileno()} 메서드가 있는 객체일 수 있습니다.

등록되지 않은 파일 기술자를 제거하려고 하면 안전하게 무시됩니다.
@end deffn

@geindex poll() (select.devpoll 메서드)
@anchor{library/select select devpoll poll}@anchor{f9b}
@deffn {메서드} devpoll.poll ([timeout])

등록된 파일 기술자 집합을 폴링하고, 보고할 이벤트나 에러가 있는 기술자에 대한 @code{(fd, event)} 2-튜플이 포함된 비어있을 수 있는 리스트를 반환합니다. `fd'는 파일 기술자이고, `event'는 해당 기술자에 대해 보고된 이벤트에 대해 설정된 비트가 있는 비트 마스크입니다 — 대기 중인 입력은 @code{POLLIN}, 기술자에 쓸 수 있음을 나타내는 데는 @code{POLLOUT}, 등등. 빈 리스트는 시간제한을 초과하였고 보고할 이벤트가 있는 파일 기술자가 없음을 나타냅니다. `timeout'이 제공되면, 시스템이 반환하기 전에 이벤트를 기다리는 시간을 밀리초로 지정합니다. `timeout'을 생략하거나 -1이거나 @ref{884,,None}이면, 이 폴링 객체에 대한 이벤트가 있을 때까지 호출이 블록 됩니다.


버전 3.5에서 변경: 시그널 처리기가 @ref{f87,,InterruptedError}를 발생시키는 대신 예외를 발생시키는 경우(이유는 
@geindex Python 향상 제안; PEP 475
PEP 475@footnote{https://peps.python.org/pep-0475/}를 참조하십시오)를 제외하고, 시그널에 의해 인터럽트 될 때 다시 계산된 시간제한으로 함수가 다시 시도됩니다.

@end deffn

@node 에지와 레벨 트리거 폴링 epoll 객체,폴링 객체,/dev/poll 폴링 객체,select — I/O 완료 대기
@anchor{library/select edge-and-level-trigger-polling-epoll-objects}@anchor{3a5e}@anchor{library/select epoll-objects}@anchor{3a55}
@subsubsection 에지와 레벨 트리거 폴링 (epoll) 객체


@quotation

@indicateurl{https://linux.die.net/man/4/epoll}

`eventmask'


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

상수

@tab

의미

@item

@code{EPOLLIN}

@tab

읽기 가능

@item

@code{EPOLLOUT}

@tab

쓰기 가능

@item

@code{EPOLLPRI}

@tab

읽을 긴급 데이터

@item

@code{EPOLLERR}

@tab

연관된 fd에서 에러 조건이 발생했습니다

@item

@code{EPOLLHUP}

@tab

연관된 fd에서 끊어짐(hang up)이 발생했습니다

@item

@code{EPOLLET}

@tab

에지 트리거 동작을 설정합니다, 기본값은 레벨 트리거 동작입니다

@item

@code{EPOLLONESHOT}

@tab

원샷(one-shot) 동작을 설정합니다. 하나의 이벤트를 꺼낸 후에, fd는 내부적으로 비활성화됩니다.

@item

@code{EPOLLEXCLUSIVE}

@tab

연관된 fd에 이벤트가 있을 때 하나의 epoll 객체만 깨웁니다. 기본값(이 플래그가 설정되지 않으면)은 fd를 폴링하는 모든 epoll 객체를 깨우는 것입니다.

@item

@code{EPOLLRDHUP}

@tab

스트림 소켓 반대편이 연결을 닫았거나 연결의 쓰기 절반을 종료했습니다.

@item

@code{EPOLLRDNORM}

@tab

@code{EPOLLIN}과 동등합니다

@item

@code{EPOLLRDBAND}

@tab

우선순위가 높은 데이터 대역을 읽을 수 있습니다.

@item

@code{EPOLLWRNORM}

@tab

@code{EPOLLOUT}과 동등합니다

@item

@code{EPOLLWRBAND}

@tab

우선순위가 높은 데이터를 쓸 수 있습니다.

@item

@code{EPOLLMSG}

@tab

무시됩니다.

@item

@code{EPOLLWAKEUP}

@tab

Prevents sleep during event waiting.

@end multitable



Added in version 3.6: @code{EPOLLEXCLUSIVE}가 추가되었습니다. 리눅스 커널 4.5 이상에서만 지원됩니다.



Added in version 3.14: @code{EPOLLWAKEUP} was added. It’s only supported by Linux Kernel 3.5
or later.

@end quotation

@geindex close() (select.epoll 메서드)
@anchor{library/select select epoll close}@anchor{1194}
@deffn {메서드} epoll.close ()

epoll 객체의 제어 파일 기술자를 닫습니다.
@end deffn

@geindex closed (select.epoll의 속성)
@anchor{library/select select epoll closed}@anchor{3a5f}
@deffn {속성} epoll.closed

epoll 객체가 닫혔으면 @code{True}.
@end deffn

@geindex fileno() (select.epoll 메서드)
@anchor{library/select select epoll fileno}@anchor{3a60}
@deffn {메서드} epoll.fileno ()

제어 fd의 파일 기술자 번호를 반환합니다.
@end deffn

@geindex fromfd() (select.epoll 메서드)
@anchor{library/select select epoll fromfd}@anchor{3a61}
@deffn {메서드} epoll.fromfd (fd)

주어진 파일 기술자에서 epoll 객체를 만듭니다.
@end deffn

@geindex register() (select.epoll 메서드)
@anchor{library/select select epoll register}@anchor{3a62}
@deffn {메서드} epoll.register (fd[, eventmask])

epoll 객체에 fd 기술자를 등록합니다.
@end deffn

@geindex modify() (select.epoll 메서드)
@anchor{library/select select epoll modify}@anchor{3a63}
@deffn {메서드} epoll.modify (fd, eventmask)

등록된 파일 기술자를 수정합니다.
@end deffn

@geindex unregister() (select.epoll 메서드)
@anchor{library/select select epoll unregister}@anchor{b53}
@deffn {메서드} epoll.unregister (fd)

epoll 객체에서 등록된 파일 기술자를 제거합니다.


버전 3.9에서 변경: 이 메서드는 더는 @ref{b54,,EBADF} 에러를 무시하지 않습니다.

@end deffn

@geindex poll() (select.epoll 메서드)
@anchor{library/select select epoll poll}@anchor{f9c}
@deffn {메서드} epoll.poll (timeout=None, maxevents=-1)

이벤트를 기다립니다. 시간제한은 초 단위입니다 (float)


버전 3.5에서 변경: 시그널 처리기가 @ref{f87,,InterruptedError}를 발생시키는 대신 예외를 발생시키는 경우(이유는 
@geindex Python 향상 제안; PEP 475
PEP 475@footnote{https://peps.python.org/pep-0475/}를 참조하십시오)를 제외하고, 시그널에 의해 인터럽트 될 때 다시 계산된 시간제한으로 함수가 다시 시도됩니다.

@end deffn

@node 폴링 객체,Kqueue 객체,에지와 레벨 트리거 폴링 epoll 객체,select — I/O 완료 대기
@anchor{library/select poll-objects}@anchor{3a56}@anchor{library/select polling-objects}@anchor{3a64}
@subsubsection 폴링 객체


대부분의 유닉스 시스템에서 지원되는 @code{poll()} 시스템 호출은 동시에 많은 클라이언트에게 서비스를 제공하는 네트워크 서버에 더 나은 확장성을 제공합니다. @code{select()}는 비트맵을 빌드하고, 관심 있는 fd에 대한 비트를 켠 후, 전체 비트 맵을 다시 선형으로 스캔해야 하지만, 이 시스템 호출은 관심 있는 파일 기술자만 나열하면 되기 때문에 @code{poll()}은 더 잘 확장됩니다. @code{select()}는 `O'(`가장 높은 파일 기술자')이고 @code{poll()}은 `O'(`파일 기술자 수')입니다.

@geindex register() (select.poll 메서드)
@anchor{library/select select poll register}@anchor{3a65}
@deffn {메서드} poll.register (fd[, eventmask])

폴링 객체에 파일 기술자를 등록합니다. 이후 @ref{30d0,,poll()} 메서드에 대한 호출은 파일 기술자에 계류 중인 I/O 이벤트가 있는지 확인합니다. `fd'는 정수이거나, 정수를 반환하는 @ref{17b4,,fileno()} 메서드가 있는 객체일 수 있습니다. 파일 객체는 @code{fileno()}를 구현하므로, 인자로도 사용할 수 있습니다.

`eventmask'는 확인할 이벤트 유형을 설명하는 선택적 비트 마스크이고, 아래 표에 설명된 상수 @code{POLLIN}, @code{POLLPRI} 및 @code{POLLOUT}의 조합일 수 있습니다. 지정하지 않으면, 사용되는 기본값은 3가지 유형의 이벤트를 모두 확인합니다.


@multitable {xxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

상수

@tab

의미

@item

@code{POLLIN}

@tab

읽을 데이터가 있습니다

@item

@code{POLLPRI}

@tab

읽을 긴급한 데이터가 있습니다

@item

@code{POLLOUT}

@tab

출력 준비: 쓰기가 블록 되지 않을 것입니다

@item

@code{POLLERR}

@tab

어떤 종류의 에러 조건

@item

@code{POLLHUP}

@tab

끊어졌습니다(Hung up)

@item

@code{POLLRDHUP}

@tab

스트림 소켓 반대편이 연결을 닫았거나, 연결의 쓰기 절반을 종료했습니다

@item

@code{POLLNVAL}

@tab

잘못된 요청: 기술자가 열리지 않았습니다

@end multitable


이미 등록된 파일 기술자를 등록하는 것은 에러가 아니며, 기술자를 정확히 한 번 등록하는 것과 같은 효과가 있습니다.
@end deffn

@geindex modify() (select.poll 메서드)
@anchor{library/select select poll modify}@anchor{3a66}
@deffn {메서드} poll.modify (fd, eventmask)

이미 등록된 fd를 수정합니다. 이것은 @code{register(fd, eventmask)}와 같은 효과가 있습니다. 등록되지 않은 파일 기술자를 수정하려고 하면 errno @code{ENOENT}로 @ref{2c0,,OSError} 예외가 발생합니다.
@end deffn

@geindex unregister() (select.poll 메서드)
@anchor{library/select select poll unregister}@anchor{3a67}
@deffn {메서드} poll.unregister (fd)

폴링 객체가 추적하는 파일 기술자를 제거합니다. @ref{3a65,,register()} 메서드와 마찬가지로, `fd'는 정수이거나 정수를 반환하는 @ref{17b4,,fileno()} 메서드가 있는 객체일 수 있습니다.

등록되지 않은 파일 기술자를 제거하려고 하면 @ref{5e5,,KeyError} 예외가 발생합니다.
@end deffn

@geindex poll() (select.poll 메서드)
@anchor{library/select select poll poll}@anchor{f9e}
@deffn {메서드} poll.poll ([timeout])

등록된 파일 기술자 집합을 폴링하고, 보고할 이벤트나 에러가 있는 기술자에 대한 @code{(fd, event)} 2-튜플이 포함된 비어있을 수 있는 리스트를 반환합니다. `fd'는 파일 기술자이고, `event'는 해당 기술자에 대해 보고된 이벤트에 대해 설정된 비트가 있는 비트 마스크입니다 — 대기 중인 입력은 @code{POLLIN}, 기술자에 쓸 수 있음을 나타내는 데는 @code{POLLOUT}, 등등. 빈 리스트는 시간제한을 초과하였고 보고할 이벤트가 있는 파일 기술자가 없음을 나타냅니다. `timeout'이 제공되면, 시스템이 반환하기 전에 이벤트를 기다리는 시간을 밀리초로 지정합니다. `timeout'을 생략하거나 음수이거나 @ref{884,,None}이면, 이 폴링 객체에 대한 이벤트가 있을 때까지 호출이 블록 됩니다.


버전 3.5에서 변경: 시그널 처리기가 @ref{f87,,InterruptedError}를 발생시키는 대신 예외를 발생시키는 경우(이유는 
@geindex Python 향상 제안; PEP 475
PEP 475@footnote{https://peps.python.org/pep-0475/}를 참조하십시오)를 제외하고, 시그널에 의해 인터럽트 될 때 다시 계산된 시간제한으로 함수가 다시 시도됩니다.

@end deffn

@node Kqueue 객체,Kevent 객체,폴링 객체,select — I/O 완료 대기
@anchor{library/select id1}@anchor{3a68}@anchor{library/select kqueue-objects}@anchor{3a57}
@subsubsection Kqueue 객체


@geindex close() (select.kqueue 메서드)
@anchor{library/select select kqueue close}@anchor{3a69}
@deffn {메서드} kqueue.close ()

kqueue 객체의 제어 파일 기술자를 닫습니다.
@end deffn

@geindex closed (select.kqueue의 속성)
@anchor{library/select select kqueue closed}@anchor{3a6a}
@deffn {속성} kqueue.closed

kqueue 객체가 닫혔으면 @code{True}.
@end deffn

@geindex fileno() (select.kqueue 메서드)
@anchor{library/select select kqueue fileno}@anchor{3a6b}
@deffn {메서드} kqueue.fileno ()

제어 fd의 파일 기술자 번호를 반환합니다.
@end deffn

@geindex fromfd() (select.kqueue 메서드)
@anchor{library/select select kqueue fromfd}@anchor{3a6c}
@deffn {메서드} kqueue.fromfd (fd)

주어진 파일 기술자에서 kqueue 객체를 만듭니다.
@end deffn

@geindex control() (select.kqueue 메서드)
@anchor{library/select select kqueue control}@anchor{f9d}
@deffn {메서드} kqueue.control (changelist, max_events[, timeout]) -> eventlist

kevent에 대한 저수준 인터페이스


@itemize -

@item 
changelist는 kevent 객체의 이터러블 이거나 @code{None}이어야 합니다

@item 
max_events는 0이거나 양의 정수여야 합니다.

@item 
timeout은 초 단위 (float 가능); 기본값은 @code{None}이고 무한히 대기합니다
@end itemize


버전 3.5에서 변경: 시그널 처리기가 @ref{f87,,InterruptedError}를 발생시키는 대신 예외를 발생시키는 경우(이유는 
@geindex Python 향상 제안; PEP 475
PEP 475@footnote{https://peps.python.org/pep-0475/}를 참조하십시오)를 제외하고, 시그널에 의해 인터럽트 될 때 다시 계산된 시간제한으로 함수가 다시 시도됩니다.

@end deffn

@node Kevent 객체,,Kqueue 객체,select — I/O 완료 대기
@anchor{library/select id2}@anchor{3a6d}@anchor{library/select kevent-objects}@anchor{3a59}
@subsubsection Kevent 객체


@indicateurl{https://man.freebsd.org/cgi/man.cgi?query=kqueue&sektion=2}

@geindex ident (select.kevent의 속성)
@anchor{library/select select kevent ident}@anchor{3a6e}
@deffn {속성} kevent.ident

이벤트를 식별하는 데 사용되는 값. 해석은 필터에 따라 다르지만, 일반적으로 파일 기술자입니다. 생성자에서 ident 는 정수이거나 @ref{17b4,,fileno()} 메서드가 있는 객체일 수 있습니다. kevent는 내부적으로 정수를 저장합니다.
@end deffn

@geindex filter (select.kevent의 속성)
@anchor{library/select select kevent filter}@anchor{3a6f}
@deffn {속성} kevent.filter

커널 필터의 이름.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

상수

@tab

의미

@item

@code{KQ_FILTER_READ}

@tab

기술자를 취하고 읽을 수 있는 데이터가 있을 때마다 반환합니다

@item

@code{KQ_FILTER_WRITE}

@tab

기술자를 취하고 쓸 수 있는 데이터가 있을 때마다 반환합니다

@item

@code{KQ_FILTER_AIO}

@tab

AIO 요청

@item

@code{KQ_FILTER_VNODE}

@tab

`fflag'에서 감시 중인 요청된 이벤트 중 하나 이상이 발생할 때 반환합니다

@item

@code{KQ_FILTER_PROC}

@tab

프로세스 id에서 이벤트를 감시합니다

@item

@code{KQ_FILTER_NETDEV}

@tab

네트워크 장치에서 이벤트를 감시합니다 [맥 OS에서는 사용할 수 없습니다]

@item

@code{KQ_FILTER_SIGNAL}

@tab

감시하는 시그널이 프로세스에 전달될 때마다 반환합니다

@item

@code{KQ_FILTER_TIMER}

@tab

임의의 타이머를 설정합니다

@end multitable

@end deffn

@geindex flags (select.kevent의 속성)
@anchor{library/select select kevent flags}@anchor{3a70}
@deffn {속성} kevent.flags

필터 액션.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

상수

@tab

의미

@item

@code{KQ_EV_ADD}

@tab

이벤트를 추가하거나 수정합니다

@item

@code{KQ_EV_DELETE}

@tab

큐에서 이벤트를 제거합니다

@item

@code{KQ_EV_ENABLE}

@tab

Permits control() to return the event

@item

@code{KQ_EV_DISABLE}

@tab

Disables event

@item

@code{KQ_EV_ONESHOT}

@tab

처음 발생한 후 이벤트를 제거합니다

@item

@code{KQ_EV_CLEAR}

@tab

이벤트를 꺼낸 후 상태를 재설정합니다

@item

@code{KQ_EV_SYSFLAGS}

@tab

내부 이벤트

@item

@code{KQ_EV_FLAG1}

@tab

내부 이벤트

@item

@code{KQ_EV_EOF}

@tab

필터 특정 EOF 조건

@item

@code{KQ_EV_ERROR}

@tab

반환 값을 봅니다

@end multitable

@end deffn

@geindex fflags (select.kevent의 속성)
@anchor{library/select select kevent fflags}@anchor{3a71}
@deffn {속성} kevent.fflags

필터 특정 플래그.

@code{KQ_FILTER_READ}와 @code{KQ_FILTER_WRITE} 필터 플래그:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

상수

@tab

의미

@item

@code{KQ_NOTE_LOWAT}

@tab

소켓 버퍼의 낮은 수위(low water mark)

@end multitable


@code{KQ_FILTER_VNODE} 필터 플래그:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

상수

@tab

의미

@item

@code{KQ_NOTE_DELETE}

@tab

`unlink()'가 호출되었습니다

@item

@code{KQ_NOTE_WRITE}

@tab

쓰기가 발생했습니다

@item

@code{KQ_NOTE_EXTEND}

@tab

파일이 확장되었습니다

@item

@code{KQ_NOTE_ATTRIB}

@tab

속성이 변경되었습니다

@item

@code{KQ_NOTE_LINK}

@tab

링크 수가 변경되었습니다

@item

@code{KQ_NOTE_RENAME}

@tab

파일 이름이 변경되었습니다

@item

@code{KQ_NOTE_REVOKE}

@tab

파일에 대한 액세스가 취소되었습니다

@end multitable


@code{KQ_FILTER_PROC} 필터 플래그:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

상수

@tab

의미

@item

@code{KQ_NOTE_EXIT}

@tab

프로세스가 종료되었습니다

@item

@code{KQ_NOTE_FORK}

@tab

프로세스가 `fork()'를 호출했습니다

@item

@code{KQ_NOTE_EXEC}

@tab

프로세스가 새로운 프로세스를 실행했습니다

@item

@code{KQ_NOTE_PCTRLMASK}

@tab

내부 필터 플래그

@item

@code{KQ_NOTE_PDATAMASK}

@tab

내부 필터 플래그

@item

@code{KQ_NOTE_TRACK}

@tab

`fork()'를 가로질러 프로세스를 추적합니다

@item

@code{KQ_NOTE_CHILD}

@tab

`NOTE_TRACK'의 경우 자식 프로세스에서 반환됩니다

@item

@code{KQ_NOTE_TRACKERR}

@tab

자식에게 연결할 수 없습니다

@end multitable


@code{KQ_FILTER_NETDEV} 필터 플래그 (맥 OS에서는 사용할 수 없습니다):


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

상수

@tab

의미

@item

@code{KQ_NOTE_LINKUP}

@tab

링크가 올라갔습니다

@item

@code{KQ_NOTE_LINKDOWN}

@tab

링크가 내려갔습니다

@item

@code{KQ_NOTE_LINKINV}

@tab

링크 상태가 유효하지 않습니다

@end multitable

@end deffn

@geindex data (select.kevent의 속성)
@anchor{library/select select kevent data}@anchor{3a72}
@deffn {속성} kevent.data

필터 특정 데이터.
@end deffn

@geindex udata (select.kevent의 속성)
@anchor{library/select select kevent udata}@anchor{3a73}
@deffn {속성} kevent.udata

사용자 정의 값.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node selectors — 고수준 I/O 다중화,signal — 비동기 이벤트에 대한 처리기 설정,select — I/O 완료 대기,네트워킹과 프로세스 간 통신
@anchor{library/selectors doc}@anchor{3a74}@anchor{library/selectors module-selectors}@anchor{c7}@anchor{library/selectors selectors-high-level-i-o-multiplexing}@anchor{3a75}@anchor{library/selectors translation-repo}@anchor{3a76}
@subsection @code{selectors} — 고수준 I/O 다중화


@geindex module; selectors


Added in version 3.4.


`소스 코드:' Lib/selectors.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/selectors.py}


__________________________________________________________________


@menu
* 소개: 소개<4>. 
* 클래스: 클래스<3>. 
* 예제: 예제<20>. 

@end menu

@node 소개<4>,클래스<3>,,selectors — 고수준 I/O 다중화
@anchor{library/selectors introduction}@anchor{3a77}
@subsubsection 소개


이 모듈은 @ref{c6,,select} 모듈 프리미티브에 기반하여 고수준의 효율적인 I/O 다중화를 가능하게 합니다. 사용되는 OS 수준 프리미티브를 정확하게 제어하고 싶지 않으면, 사용자는 이 모듈을 대신 사용하는 것이 좋습니다.

여러 파일 객체에 대한 I/O 준비 알림을 기다리는 데 사용할 수 있는 몇 가지 구체적인 구현 (@ref{3948,,KqueueSelector}, @ref{dce,,EpollSelector}…)과 함께 @ref{3a78,,BaseSelector} 추상 베이스 클래스를 정의합니다. 다음에서 “파일 객체”는 @ref{17b4,,fileno()} 메서드가 있는 모든 객체나 날 파일 기술자를 가리킵니다. @ref{13c8,,파일 객체}를 참조하십시오.

@ref{3a79,,DefaultSelector}는 현재 플랫폼에서 사용할 수 있는 가장 효율적인 구현의 별칭입니다: 대부분 사용자는 기본적으로 이것을 선택해야 합니다.

@cartouche
@quotation 참고 
지원되는 파일 객체의 유형은 플랫폼에 따라 다릅니다: 윈도우에서는 소켓은 지원되지만, 파이프는 지원되지 않습니다. 반면에, 유닉스에서는 둘 다 지원됩니다 (fifo나 특수 파일 장치와 같은 다른 유형도 지원될 수 있습니다).
@end quotation
@end cartouche


@subsubheading 더 보기



@table @asis

@item @ref{c6,,select}

저수준 I/O 다중화 모듈.
@end table


@c include for modules that don't work on WASM

@ref{213c,,가용성}: not WASI.

이 모듈은 웹어셈블리에서 작동하지 않거나 제공되지 않습니다. 자세한 내용은 @ref{1b68,,웹어셈블리 플랫폼}을 참조하세요.

@node 클래스<3>,예제<20>,소개<4>,selectors — 고수준 I/O 다중화
@anchor{library/selectors classes}@anchor{3a7a}
@subsubsection 클래스


클래스 계층 구조:

@example
BaseSelector
+-- SelectSelector
+-- PollSelector
+-- EpollSelector
+-- DevpollSelector
+-- KqueueSelector
@end example

In the following, `events' is a bitwise mask indicating which I/O events should
be waited for on a given file object. It can be a combination of the module’s
constants below:

@quotation


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

상수

@tab

의미

@item

@geindex EVENT_READ (selectors 모듈)
@anchor{library/selectors selectors EVENT_READ}@anchor{3a7b}
@deffn {데이터} selectors.EVENT_READ
@end deffn

@tab

읽기 가능

@item

@geindex EVENT_WRITE (selectors 모듈)
@anchor{library/selectors selectors EVENT_WRITE}@anchor{3a7c}
@deffn {데이터} selectors.EVENT_WRITE
@end deffn

@tab

쓰기 가능

@end multitable

@end quotation

@geindex SelectorKey (selectors 클래스)
@anchor{library/selectors selectors SelectorKey}@anchor{3a7d}
@deffn {클래스} selectors.SelectorKey

@ref{3a7d,,SelectorKey}는 파일 객체에 그것의 하부 파일 기술자, 선택한 이벤트 마스크 및 첨부된 데이터를 연결하는 데 사용되는 @ref{4e0,,namedtuple}입니다. 여러 @ref{3a78,,BaseSelector} 메서드에 의해 반환됩니다.

@geindex fileobj (selectors.SelectorKey의 속성)
@anchor{library/selectors selectors SelectorKey fileobj}@anchor{3a7e}
@deffn {속성} fileobj

등록된 파일 객체.
@end deffn

@geindex fd (selectors.SelectorKey의 속성)
@anchor{library/selectors selectors SelectorKey fd}@anchor{3a7f}
@deffn {속성} fd

하부 파일 기술자.
@end deffn

@geindex events (selectors.SelectorKey의 속성)
@anchor{library/selectors selectors SelectorKey events}@anchor{3a80}
@deffn {속성} events

이 파일 객체에서 기다려야 하는 이벤트.
@end deffn

@geindex data (selectors.SelectorKey의 속성)
@anchor{library/selectors selectors SelectorKey data}@anchor{3a81}
@deffn {속성} data

이 파일 객체에 연결된 선택적인 불투명한 데이터: 예를 들어, 이것은 클라이언트별 세션 ID를 저장하는 데 사용될 수 있습니다.
@end deffn
@end deffn

@geindex BaseSelector (selectors 클래스)
@anchor{library/selectors selectors BaseSelector}@anchor{3a78}
@deffn {클래스} selectors.BaseSelector

@ref{3a78,,BaseSelector}는 여러 파일 객체에 대한 I/O 이벤트 준비를 기다리는 데 사용됩니다. 파일 스트림 등록, 등록 취소 및 선택적 제한 시간과 함께 해당 스트림에서 I/O 이벤트를 기다리는 메서드를 지원합니다. 추상 베이스 클래스이므로, 인스턴스를 만들 수 없습니다. @ref{3a79,,DefaultSelector}를 대신 사용하거나, 특정 구현을 사용하고 싶고, 플랫폼에서 지원한다면 @ref{3945,,SelectSelector}, @ref{3948,,KqueueSelector} 등을 사용하십시오. @code{BaseSelector}와 그것의 구상 구현은 @ref{1e1,,컨텍스트 관리자} 프로토콜을 지원합니다.

@geindex register() (selectors.BaseSelector 메서드)
@anchor{library/selectors selectors BaseSelector register}@anchor{3a82}
@deffn {메서드} abstractmethod register (fileobj, events, data=None)

I/O 이벤트를 셀렉트하고 감시하기 위한 파일 객체를 등록합니다.

`fileobj'는 감시할 파일 객체입니다. 정수 파일 기술자이거나 @code{fileno()} 메서드를 가진 객체일 수 있습니다. `events'는 감시할 이벤트의 비트 마스크입니다. `data'는 불투명한 객체입니다.

새로운 @ref{3a7d,,SelectorKey} 인스턴스를 반환하거나, 유효하지 않은 이벤트 마스크나 파일 기술자의 경우 @ref{2ec,,ValueError}를, 파일 객체가 이미 등록된 경우 @ref{5e5,,KeyError}를 발생시킵니다.
@end deffn

@geindex unregister() (selectors.BaseSelector 메서드)
@anchor{library/selectors selectors BaseSelector unregister}@anchor{3a83}
@deffn {메서드} abstractmethod unregister (fileobj)

셀렉트로부터 파일 객체를 등록 해지하고, 감시에서 삭제합니다. 파일 객체는 닫히기 전에 등록 해지되어야 합니다.

`fileobj'는 이전에 등록된 파일 객체여야 합니다.

연결된 @ref{3a7d,,SelectorKey} 인스턴스를 반환하거나, `fileobj'가 등록되어 있지 않으면 @ref{5e5,,KeyError}를 발생시킵니다. `fileobj'가 유효하지 않으면 (예를 들어, @code{fileno()} 메서드가 없거나 @code{fileno()} 메서드가 유효하지 않은 반환 값을 가지면) @ref{2ec,,ValueError}가 발생합니다.
@end deffn

@geindex modify() (selectors.BaseSelector 메서드)
@anchor{library/selectors selectors BaseSelector modify}@anchor{dd1}
@deffn {메서드} modify (fileobj, events, data=None)

등록된 파일 객체의 감시되는 이벤트나 첨부된 데이터를 변경합니다.

이것은 더 효율적으로 구현될 수 있다는 점을 제외하면, @code{BaseSelector.unregister(fileobj)} 다음에 @code{BaseSelector.register(fileobj, events, data)}하는 것과 동등합니다.

새로운 @ref{3a7d,,SelectorKey} 인스턴스를 반환하거나, 유효하지 않은 이벤트 마스크나 파일 기술자의 경우 @ref{2ec,,ValueError}를, 파일 객체가 등록되지 않았으면 @ref{5e5,,KeyError}를 발생시킵니다.
@end deffn

@geindex select() (selectors.BaseSelector 메서드)
@anchor{library/selectors selectors BaseSelector select}@anchor{3a84}
@deffn {메서드} abstractmethod select (timeout=None)

등록된 파일 객체의 일부가 준비될 때까지 기다리거나, 제한 시간이 만료됩니다.

@code{timeout > 0} 이면, 최대 대기 시간을 초로 지정합니다. @code{timeout <= 0}이면, 호출은 블록하지 않고, 현재 준비된 파일 객체를 보고합니다. `timeout'이 @code{None}이면, 감시되는 파일 객체가 준비될 때까지 호출이 블록 됩니다.

각 준비된 파일 객체마다 하나씩, @code{(key, events)} 튜플의 리스트를 반환합니다.

`key'는 준비된 파일 객체에 해당하는 @ref{3a7d,,SelectorKey} 인스턴스입니다. `events'는 이 파일 객체에서 준비된 이벤트의 비트 마스크입니다.

@cartouche
@quotation 참고 
현재 프로세스가 시그널을 받으면, 이 메서드는 파일 객체가 준비되거나 제한 시간이 지나기 전에 반환할 수 있습니다: 이때는 빈 리스트가 반환됩니다.
@end quotation
@end cartouche


버전 3.5에서 변경: 시그널에 의해 인터럽트 되었을 때, 셀렉터는 이제 시그널 처리기가 예외를 발생시키지 않으면, 제한 시간 이전에 빈 이벤트 리스트를 반환하는 대신, 재계산 된 제한 시간으로 재 시도됩니다 (근거는 
@geindex Python 향상 제안; PEP 475
PEP 475@footnote{https://peps.python.org/pep-0475/}를 참조하세요).

@end deffn

@geindex close() (selectors.BaseSelector 메서드)
@anchor{library/selectors selectors BaseSelector close}@anchor{3a85}
@deffn {메서드} close ()

셀렉터를 닫습니다.

모든 하부 자원을 해제하기 위해 이 메서드를 호출해야 합니다. 일단 닫은 후에는 셀렉터를 더는 사용하지 않아야 합니다.
@end deffn

@geindex get_key() (selectors.BaseSelector 메서드)
@anchor{library/selectors selectors BaseSelector get_key}@anchor{3a86}
@deffn {메서드} get_key (fileobj)

등록된 파일 객체에 연결된 키를 반환합니다.

이 파일 객체에 연결된 @ref{3a7d,,SelectorKey} 인스턴스를 반환하거나, 파일 객체가 등록되지 않았으면 @ref{5e5,,KeyError}를 발생시킵니다.
@end deffn

@geindex get_map() (selectors.BaseSelector 메서드)
@anchor{library/selectors selectors BaseSelector get_map}@anchor{3a87}
@deffn {메서드} abstractmethod get_map ()

파일 객체에서 셀렉터로의 매핑을 반환합니다.

등록된 파일 객체를 연결된 @ref{3a7d,,SelectorKey} 인스턴스로 매핑하는 @ref{ac7,,Mapping} 인스턴스를 반환합니다.
@end deffn
@end deffn

@geindex DefaultSelector (selectors 클래스)
@anchor{library/selectors selectors DefaultSelector}@anchor{3a79}
@deffn {클래스} selectors.DefaultSelector

현재의 플랫폼에서 사용할 수 있는 가장 효율적인 구현을 사용하는 기본 셀렉터 클래스입니다. 대부분 사용자는 기본적으로 이것을 선택해야 합니다.
@end deffn

@geindex SelectSelector (selectors 클래스)
@anchor{library/selectors selectors SelectSelector}@anchor{3945}
@deffn {클래스} selectors.SelectSelector

@ref{f9f,,select.select()} 기반 셀렉터.
@end deffn

@geindex PollSelector (selectors 클래스)
@anchor{library/selectors selectors PollSelector}@anchor{dcf}
@deffn {클래스} selectors.PollSelector

@ref{30d0,,select.poll()} 기반 셀렉터.
@end deffn

@geindex EpollSelector (selectors 클래스)
@anchor{library/selectors selectors EpollSelector}@anchor{dce}
@deffn {클래스} selectors.EpollSelector

@ref{1193,,select.epoll()} 기반 셀렉터.

@geindex fileno() (selectors.EpollSelector 메서드)
@anchor{library/selectors selectors EpollSelector fileno}@anchor{3a88}
@deffn {메서드} fileno ()

하부 @ref{1193,,select.epoll()} 객체에서 사용하는 파일 기술자를 반환합니다.
@end deffn
@end deffn

@geindex DevpollSelector (selectors 클래스)
@anchor{library/selectors selectors DevpollSelector}@anchor{dd0}
@deffn {클래스} selectors.DevpollSelector

@ref{1195,,select.devpoll()} 기반 셀렉터.

@geindex fileno() (selectors.DevpollSelector 메서드)
@anchor{library/selectors selectors DevpollSelector fileno}@anchor{3a89}
@deffn {메서드} fileno ()

하부 @ref{1195,,select.devpoll()} 객체에서 사용하는 파일 기술자를 반환합니다.
@end deffn


Added in version 3.5.

@end deffn

@geindex KqueueSelector (selectors 클래스)
@anchor{library/selectors selectors KqueueSelector}@anchor{3948}
@deffn {클래스} selectors.KqueueSelector

@ref{1a43,,select.kqueue()} 기반 셀렉터.

@geindex fileno() (selectors.KqueueSelector 메서드)
@anchor{library/selectors selectors KqueueSelector fileno}@anchor{3a8a}
@deffn {메서드} fileno ()

하부 @ref{1a43,,select.kqueue()} 객체에서 사용하는 파일 기술자를 반환합니다.
@end deffn
@end deffn

@node 예제<20>,,클래스<3>,selectors — 고수준 I/O 다중화
@anchor{library/selectors examples}@anchor{3a8b}
@subsubsection 예제


다음은 간단한 메아리 서버 구현입니다:

@example
import selectors
import socket

sel = selectors.DefaultSelector()

def accept(sock, mask):
    conn, addr = sock.accept()  # 준비돼 있어야 합니다
    print('accepted', conn, 'from', addr)
    conn.setblocking(False)
    sel.register(conn, selectors.EVENT_READ, read)

def read(conn, mask):
    data = conn.recv(1000)  # 준비돼 있어야 합니다
    if data:
        print('echoing', repr(data), 'to', conn)
        conn.send(data)  # 블록하지 않기를 바랍니다
    else:
        print('closing', conn)
        sel.unregister(conn)
        conn.close()

sock = socket.socket()
sock.bind(('localhost', 1234))
sock.listen(100)
sock.setblocking(False)
sel.register(sock, selectors.EVENT_READ, accept)

while True:
    events = sel.select()
    for key, mask in events:
        callback = key.data
        callback(key.fileobj, mask)
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node signal — 비동기 이벤트에 대한 처리기 설정,mmap — 메모리 맵 파일 지원,selectors — 고수준 I/O 다중화,네트워킹과 프로세스 간 통신
@anchor{library/signal doc}@anchor{3a8c}@anchor{library/signal module-signal}@anchor{cb}@anchor{library/signal signal-set-handlers-for-asynchronous-events}@anchor{3a8d}@anchor{library/signal translation-repo}@anchor{3a8e}
@subsection @code{signal} — 비동기 이벤트에 대한 처리기 설정


@geindex module; signal

`소스 코드:' Lib/signal.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/signal.py}


__________________________________________________________________


이 모듈은 파이썬에서 시그널 처리기를 사용하는 메커니즘을 제공합니다.

@menu
* 일반 규칙:: 
* 모듈 내용: 모듈 내용<4>. 
* 예제: 예제<21>. 
* SIGPIPE에 대한 참고 사항:: 
* 신호 처리기와 예외에 대한 참고 사항:: 

@end menu

@node 일반 규칙,모듈 내용<4>,,signal — 비동기 이벤트에 대한 처리기 설정
@anchor{library/signal general-rules}@anchor{3a8f}
@subsubsection 일반 규칙


@ref{1339,,signal.signal()} 함수는 시그널이 수신될 때 실행될 사용자 정의 처리기를 정의하도록 합니다. 소수의 기본 처리기가 설치됩니다: @ref{3a90,,SIGPIPE}는 무시되고 (그래서 파이프와 소켓에 대한 쓰기 에러는 일반 파이썬 예외로 보고될 수 있습니다) @ref{253,,SIGINT}는 부모 프로세스가 변경하지 않았다면 @ref{bc4,,KeyboardInterrupt} 예외로 번역됩니다.

일단 설정되면, 특정 시그널에 대한 처리기는 명시적으로 재설정 될 때까지 (파이썬은 하부 구현과 관계없이 BSD 스타일 인터페이스를 흉내 냅니다) 설치된 상태로 유지됩니다. @ref{310b,,SIGCHLD}에 대한 처리기는 예외인데, 하부 구현을 따릅니다.

On WebAssembly platforms, signals are emulated and therefore behave
differently. Several functions and signals are not available on these
platforms.

@menu
* 파이썬 시그널 처리기의 실행:: 
* 시그널과 스레드:: 

@end menu

@node 파이썬 시그널 처리기의 실행,시그널과 스레드,,일반 규칙
@anchor{library/signal execution-of-python-signal-handlers}@anchor{3a91}
@subsubsection 파이썬 시그널 처리기의 실행


A Python signal handler does not get executed inside the low-level (C) signal
handler.  Instead, the low-level signal handler sets a flag which tells the
@ref{3a92,,virtual machine} to execute the corresponding Python signal handler
at a later point (for example, at the next @ref{4ab,,bytecode} instruction).
This has consequences:


@itemize *

@item 
C 코드에서의 유효하지 않은 연산으로 인해 발생하는 @ref{1280,,SIGFPE}나 @ref{127f,,SIGSEGV}와 같은 동기 에러를 잡는 것은 그리 의미가 없습니다. 파이썬은 시그널 처리기에서 C 코드로 돌아오는데, 같은 시그널을 다시 발생시켜서, 파이썬이 멈출 것입니다. 파이썬 3.3부터는, @ref{5c,,faulthandler} 모듈을 사용하여 동기 에러를 보고할 수 있습니다.

@item 
C로만 구현된 오래 실행되는 계산(가령 커다란 텍스트 본문에 대한 정규식 일치)은 수신된 시그널에 상관없이 임의의 시간 동안 중단없이 실행될 수 있습니다. 계산이 끝나면 파이썬 시그널 처리기가 호출됩니다.

@item 
If the handler raises an exception, it will be raised “out of thin air” in
the main thread. See the @ref{26f2,,note below} for a
discussion.
@end itemize

@node 시그널과 스레드,,파이썬 시그널 처리기의 실행,일반 규칙
@anchor{library/signal id1}@anchor{3a93}@anchor{library/signal signals-and-threads}@anchor{3a94}
@subsubsection 시그널과 스레드


파이썬 시그널 처리기는 시그널이 다른 스레드에서 수신될 때도 항상 메인 인터프리터의 메인 파이썬 스레드에서 실행됩니다. 이는 시그널을 스레드 간 통신 수단으로 사용할 수 없음을 의미합니다. 대신 @ref{f3,,threading} 모듈의 동기화 프리미티브를 사용할 수 있습니다.

게다가, 메인 인터프리터의 메인 스레드만 새로운 시그널 처리기를 설정할 수 있습니다.

@cartouche
@quotation 경고 
Synchronization primitives such as @ref{19f4,,threading.Lock} should not be used
within signal handlers.  Doing so can lead to unexpected deadlocks.
@end quotation
@end cartouche

@node 모듈 내용<4>,예제<21>,일반 규칙,signal — 비동기 이벤트에 대한 처리기 설정
@anchor{library/signal module-contents}@anchor{3a95}
@subsubsection 모듈 내용



버전 3.5에서 변경: 이하에 열거된 시그널 (SIG*), 처리기 (@ref{1bb0,,SIG_DFL}, @ref{1baf,,SIG_IGN}) 및 sigmask (@ref{3a96,,SIG_BLOCK}, @ref{3a97,,SIG_UNBLOCK}, @ref{3a98,,SIG_SETMASK}) 관련 상수는 @ref{eda,,열거형}으로 바뀌었습니다 (각각 @ref{3a99,,Signals}, @ref{3a9a,,Handlers} 및 @ref{3a9b,,Sigmasks}). @ref{1a25,,getsignal()}, @ref{1335,,pthread_sigmask()}, @ref{1337,,sigpending()} 및 @ref{1338,,sigwait()} 함수는 사람이 읽을 수 있는 @code{열거형}을 @code{Signals} 객체로 반환합니다.


signal 모듈은 세개의 열거형을 정의합니다:

@geindex Signals (signal 클래스)
@anchor{library/signal signal Signals}@anchor{3a99}
@deffn {클래스} signal.Signals

@ref{eda,,enum.IntEnum} collection of SIG* constants and the CTRL_* constants.


Added in version 3.5.

@end deffn

@geindex Handlers (signal 클래스)
@anchor{library/signal signal Handlers}@anchor{3a9a}
@deffn {클래스} signal.Handlers

@ref{eda,,enum.IntEnum} collection of the constants @ref{1bb0,,SIG_DFL} and @ref{1baf,,SIG_IGN}.


Added in version 3.5.

@end deffn

@geindex Sigmasks (signal 클래스)
@anchor{library/signal signal Sigmasks}@anchor{3a9b}
@deffn {클래스} signal.Sigmasks

@ref{eda,,enum.IntEnum} collection of the constants @ref{3a96,,SIG_BLOCK}, @ref{3a97,,SIG_UNBLOCK} and @ref{3a98,,SIG_SETMASK}.

@ref{213c,,가용성}: Unix.

자세한 내용은 매뉴얼 페이지 @code{sigprocmask(2)@footnote{https://manpages.debian.org/sigprocmask(2)}}과 @code{pthread_sigmask(3)@footnote{https://manpages.debian.org/pthread_sigmask(3)}}을 참조하십시오.


Added in version 3.5.

@end deffn

The variables defined in the @code{signal} module are:

@geindex SIG_DFL (signal 모듈)
@anchor{library/signal signal SIG_DFL}@anchor{1bb0}
@deffn {데이터} signal.SIG_DFL

이것은 두 가지 표준 시그널 처리 옵션 중 하나입니다; 단순히 시그널의 기본 기능을 수행합니다. 예를 들어, 대부분의 시스템에서 @ref{3a9c,,SIGQUIT}의 기본 동작은 코어를 덤프하고 종료하는 것이지만, @ref{310b,,SIGCHLD}의 기본 동작은 단순히 무시하는 것입니다.
@end deffn

@geindex SIG_IGN (signal 모듈)
@anchor{library/signal signal SIG_IGN}@anchor{1baf}
@deffn {데이터} signal.SIG_IGN

이것은 주어진 시그널을 무시하는 또 다른 표준 시그널 처리기입니다.
@end deffn

@geindex SIGABRT (signal 모듈)
@anchor{library/signal signal SIGABRT}@anchor{1281}
@deffn {데이터} signal.SIGABRT

@code{abort(3)@footnote{https://manpages.debian.org/abort(3)}}로 부터의 중단 시그널.
@end deffn

@geindex SIGALRM (signal 모듈)
@anchor{library/signal signal SIGALRM}@anchor{3a9d}
@deffn {데이터} signal.SIGALRM

@code{alarm(2)@footnote{https://manpages.debian.org/alarm(2)}}로 부터의 타이머 시그널.

@ref{213c,,가용성}: Unix.
@end deffn

@geindex SIGBREAK (signal 모듈)
@anchor{library/signal signal SIGBREAK}@anchor{3a9e}
@deffn {데이터} signal.SIGBREAK

키보드 인터럽트 (CTRL + BREAK).

@ref{213c,,가용성}: Windows.
@end deffn

@geindex SIGBUS (signal 모듈)
@anchor{library/signal signal SIGBUS}@anchor{1282}
@deffn {데이터} signal.SIGBUS

버스 에러 (메모리 액세스 불량).

@ref{213c,,가용성}: Unix.
@end deffn

@geindex SIGCHLD (signal 모듈)
@anchor{library/signal signal SIGCHLD}@anchor{310b}
@deffn {데이터} signal.SIGCHLD

자식 프로세스가 중지되었거나 종료되었습니다.

@ref{213c,,가용성}: Unix.
@end deffn

@geindex SIGCLD (signal 모듈)
@anchor{library/signal signal SIGCLD}@anchor{3a9f}
@deffn {데이터} signal.SIGCLD

@ref{310b,,SIGCHLD}에 대한 별칭.

@ref{213c,,가용성}: not macOS.
@end deffn

@geindex SIGCONT (signal 모듈)
@anchor{library/signal signal SIGCONT}@anchor{3119}
@deffn {데이터} signal.SIGCONT

현재 중지되었으면 프로세스를 재개합니다.

@ref{213c,,가용성}: Unix.
@end deffn

@geindex SIGFPE (signal 모듈)
@anchor{library/signal signal SIGFPE}@anchor{1280}
@deffn {데이터} signal.SIGFPE

부동 소수점 예외. 예를 들어, 0으로 나누기.


@subsubheading 더 보기


나누기나 모듈로 연산의 두 번째 인자가 0이면 @ref{b3f,,ZeroDivisionError}가 발생합니다.

@end deffn

@geindex SIGHUP (signal 모듈)
@anchor{library/signal signal SIGHUP}@anchor{3aa0}
@deffn {데이터} signal.SIGHUP

제어 터미널이 끊어졌거나 제어 프로세스가 죽었습니다.

@ref{213c,,가용성}: Unix.
@end deffn

@geindex SIGILL (signal 모듈)
@anchor{library/signal signal SIGILL}@anchor{1283}
@deffn {데이터} signal.SIGILL

잘못된 명령어.
@end deffn

@geindex SIGINT (signal 모듈)
@anchor{library/signal signal SIGINT}@anchor{253}
@deffn {데이터} signal.SIGINT

키보드 인터럽트 (CTRL + C).

기본 액션은 @ref{bc4,,KeyboardInterrupt}를 발생시키는 것입니다.
@end deffn

@geindex SIGKILL (signal 모듈)
@anchor{library/signal signal SIGKILL}@anchor{d4f}
@deffn {데이터} signal.SIGKILL

킬 시그널.

잡거나, 차단하거나, 무시할 수 없습니다.

@ref{213c,,가용성}: Unix.
@end deffn

@geindex SIGPIPE (signal 모듈)
@anchor{library/signal signal SIGPIPE}@anchor{3a90}
@deffn {데이터} signal.SIGPIPE

끊어진 파이프: 판독기가 없는 파이프에 쓰기.

기본 동작은 시그널을 무시하는 것입니다.

@ref{213c,,가용성}: Unix.
@end deffn

@geindex SIGPROF (signal 모듈)
@anchor{library/signal signal SIGPROF}@anchor{3aa1}
@deffn {데이터} signal.SIGPROF

Profiling timer expired.

@ref{213c,,가용성}: Unix.
@end deffn

@geindex SIGQUIT (signal 모듈)
@anchor{library/signal signal SIGQUIT}@anchor{3a9c}
@deffn {데이터} signal.SIGQUIT

Terminal quit signal.

@ref{213c,,가용성}: Unix.
@end deffn

@geindex SIGSEGV (signal 모듈)
@anchor{library/signal signal SIGSEGV}@anchor{127f}
@deffn {데이터} signal.SIGSEGV

세그먼테이션 오류: 유효하지 않은 메모리 참조.
@end deffn

@geindex SIGSTOP (signal 모듈)
@anchor{library/signal signal SIGSTOP}@anchor{3aa2}
@deffn {데이터} signal.SIGSTOP

Stop executing (cannot be caught or ignored).

@ref{213c,,가용성}: Unix.
@end deffn

@geindex SIGSTKFLT (signal 모듈)
@anchor{library/signal signal SIGSTKFLT}@anchor{1c05}
@deffn {데이터} signal.SIGSTKFLT

Stack fault on coprocessor. The Linux kernel does not raise this signal: it
can only be raised in user space.

@ref{213c,,가용성}: Linux.

시그널을 사용할 수 있는 아키텍처에서. 자세한 내용은 매뉴얼 페이지 @code{signal(7)@footnote{https://manpages.debian.org/signal(7)}}를 참조하십시오.


Added in version 3.11.

@end deffn

@geindex SIGTERM (signal 모듈)
@anchor{library/signal signal SIGTERM}@anchor{15e4}
@deffn {데이터} signal.SIGTERM

종료 시그널.
@end deffn

@geindex SIGUSR1 (signal 모듈)
@anchor{library/signal signal SIGUSR1}@anchor{3aa3}
@deffn {데이터} signal.SIGUSR1

사용자 정의 시그널 1.

@ref{213c,,가용성}: Unix.
@end deffn

@geindex SIGUSR2 (signal 모듈)
@anchor{library/signal signal SIGUSR2}@anchor{3aa4}
@deffn {데이터} signal.SIGUSR2

사용자 정의 시그널 2.

@ref{213c,,가용성}: Unix.
@end deffn

@geindex SIGVTALRM (signal 모듈)
@anchor{library/signal signal SIGVTALRM}@anchor{3aa5}
@deffn {데이터} signal.SIGVTALRM

Virtual timer expired.

@ref{213c,,가용성}: Unix.
@end deffn

@geindex SIGWINCH (signal 모듈)
@anchor{library/signal signal SIGWINCH}@anchor{3aa6}
@deffn {데이터} signal.SIGWINCH

창 크기 조정 시그널.

@ref{213c,,가용성}: Unix.
@end deffn

@geindex SIGXCPU (signal 모듈)
@anchor{library/signal signal SIGXCPU}@anchor{3aa7}
@deffn {데이터} signal.SIGXCPU

CPU time limit exceeded.

@ref{213c,,가용성}: Unix.
@end deffn


@deffn {데이터} SIG*

All the signal numbers are defined symbolically.  For example, the hangup signal
is defined as @ref{3aa0,,signal.SIGHUP}; the variable names are identical to the
names used in C programs, as found in @code{<signal.h>}.  The Unix man page for
‘@code{signal}’ lists the existing signals (on some systems this is
@code{signal(2)@footnote{https://manpages.debian.org/signal(2)}}, on others the list is in @code{signal(7)@footnote{https://manpages.debian.org/signal(7)}}). Note that
not all systems define the same set of signal names; only those names defined by
the system are defined by this module.
@end deffn

@geindex CTRL_C_EVENT (signal 모듈)
@anchor{library/signal signal CTRL_C_EVENT}@anchor{156d}
@deffn {데이터} signal.CTRL_C_EVENT

@code{Ctrl}+@code{C} 키 입력 이벤트에 해당하는 시그널. 이 시그널은 @ref{156c,,os.kill()}에서만 사용할 수 있습니다.

@ref{213c,,가용성}: Windows.


Added in version 3.2.

@end deffn

@geindex CTRL_BREAK_EVENT (signal 모듈)
@anchor{library/signal signal CTRL_BREAK_EVENT}@anchor{156e}
@deffn {데이터} signal.CTRL_BREAK_EVENT

@code{Ctrl}+@code{Break} 키 입력 이벤트에 해당하는 시그널. 이 시그널은 @ref{156c,,os.kill()}에서만 사용할 수 있습니다.

@ref{213c,,가용성}: Windows.


Added in version 3.2.

@end deffn

@geindex NSIG (signal 모듈)
@anchor{library/signal signal NSIG}@anchor{1b89}
@deffn {데이터} signal.NSIG

가장 높은 시그널 번호보다 하나 큰 값. 유효한 시그널 번호를 얻으려면 @ref{3aa8,,valid_signals()}를 사용하십시오.
@end deffn

@geindex ITIMER_REAL (signal 모듈)
@anchor{library/signal signal ITIMER_REAL}@anchor{3aa9}
@deffn {데이터} signal.ITIMER_REAL

간격 타이머(interval timer)를 실시간으로 감소시키고, 만료 시 @ref{3a9d,,SIGALRM}을 전달합니다.
@end deffn

@geindex ITIMER_VIRTUAL (signal 모듈)
@anchor{library/signal signal ITIMER_VIRTUAL}@anchor{3aaa}
@deffn {데이터} signal.ITIMER_VIRTUAL

프로세스가 실행 중일 때만 간격 타이머(interval timer)를 감소시키고, 만료 시 SIGVTALRM을 전달합니다.
@end deffn

@geindex ITIMER_PROF (signal 모듈)
@anchor{library/signal signal ITIMER_PROF}@anchor{3aab}
@deffn {데이터} signal.ITIMER_PROF

프로세스가 실행될 때와 시스템이 프로세스를 대신하여 실행될 때 간격 타이머(interval timer)를 감소시킵니다. ITIMER_VIRTUAL과 함께 사용되어, 이 타이머는 일반적으로 사용자와 커널 공간에서 응용 프로그램이 소비한 시간을 프로파일링하는 데 사용됩니다. 만료 시 SIGPROF를 전달합니다.
@end deffn

@geindex SIG_BLOCK (signal 모듈)
@anchor{library/signal signal SIG_BLOCK}@anchor{3a96}
@deffn {데이터} signal.SIG_BLOCK

@ref{1335,,pthread_sigmask()}의 `how' 매개 변수에 가능한 값으로 시그널이 차단됨을 나타냅니다.


Added in version 3.3.

@end deffn

@geindex SIG_UNBLOCK (signal 모듈)
@anchor{library/signal signal SIG_UNBLOCK}@anchor{3a97}
@deffn {데이터} signal.SIG_UNBLOCK

@ref{1335,,pthread_sigmask()}의 `how' 매개 변수에 가능한 값으로 시그널이 차단 해제됨을 나타냅니다.


Added in version 3.3.

@end deffn

@geindex SIG_SETMASK (signal 모듈)
@anchor{library/signal signal SIG_SETMASK}@anchor{3a98}
@deffn {데이터} signal.SIG_SETMASK

@ref{1335,,pthread_sigmask()}의 `how' 매개 변수에 가능한 값으로 시그널 마스크가 교체됨을 나타냅니다.


Added in version 3.3.

@end deffn

The @code{signal} module defines one exception:

@geindex ItimerError
@anchor{library/signal signal ItimerError}@anchor{3aac}
@deffn {예외} signal.ItimerError

하부 @ref{3aad,,setitimer()}나 @ref{3aae,,getitimer()} 구현으로부터의 에러를 알리기 위해 발생합니다. 유효하지 않은 간격 타이머나 음의 시간이 @code{setitimer()}에 전달되면 이 에러가 예상됩니다. 이 에러는 @ref{2c0,,OSError}의 서브 형입니다.


Added in version 3.3: 이 에러는 @ref{1252,,IOError}의 서브 형이었습니다, 이제는 @ref{2c0,,OSError}의 별칭입니다.

@end deffn

The @code{signal} module defines the following functions:

@geindex alarm() (signal 모듈)
@anchor{library/signal signal alarm}@anchor{3aaf}
@deffn {함수} signal.alarm (time)

`time'이 0이 아니면, 이 함수는 @ref{3a9d,,SIGALRM} 시그널이 `time' 초 내에 프로세스로 전송되도록 요청합니다. 이전에 예약된 알람은 취소됩니다 (임의의 시간에 오직 하나의 알람만 예약될 수 있습니다). 반환된 값은 이전에 설정된 알람이 전달되기까지 남은 초(seconds)입니다. `time'이 0이면, 알람이 예약되지 않고, 예약된 알람이 취소됩니다. 반환 값이 0이면, 현재 예약된 알람이 없습니다.

@ref{213c,,가용성}: Unix.

자세한 내용은 매뉴얼 페이지 @code{alarm(2)@footnote{https://manpages.debian.org/alarm(2)}}를 참조하십시오.
@end deffn

@geindex getsignal() (signal 모듈)
@anchor{library/signal signal getsignal}@anchor{1a25}
@deffn {함수} signal.getsignal (signalnum)

시그널 `signalnum'에 대한 현재 시그널 처리기를 반환합니다. 반환된 값은 콜러블 파이썬 객체이거나, 특수 값 @ref{1baf,,signal.SIG_IGN}, @ref{1bb0,,signal.SIG_DFL} 중 하나이거나 @ref{884,,None}일 수 있습니다. 여기서 @code{signal.SIG_IGN}은 시그널이 이전에 무시되었음을 의미하고, @code{signal.SIG_DFL}은 시그널을 처리하는 기본 방법이 이전에 사용 중임을 의미하고, @code{None}은 이전 시그널 처리기가 파이썬에서 설치되지 않았음을 의미합니다.
@end deffn

@geindex strsignal() (signal 모듈)
@anchor{library/signal signal strsignal}@anchor{1e1b}
@deffn {함수} signal.strsignal (signalnum)

시그널 `signalnum'의 설명을 반환합니다, 가령 @ref{253,,SIGINT}의 경우 “Interrupt”. `signalnum' 에 설명이 없으면 @ref{884,,None}을 반환합니다. `signalnum'이 유효하지 않으면 @ref{2ec,,ValueError}를 발생시킵니다.


Added in version 3.8.

@end deffn

@geindex valid_signals() (signal 모듈)
@anchor{library/signal signal valid_signals}@anchor{3aa8}
@deffn {함수} signal.valid_signals ()

이 플랫폼에서 유효한 시그널 번호 집합을 반환합니다. 일부 시그널이 시스템에서 내부 용으로 예약되었으면 @code{range(1, NSIG)}보다 작을 수 있습니다.


Added in version 3.8.

@end deffn

@geindex pause() (signal 모듈)
@anchor{library/signal signal pause}@anchor{3ab0}
@deffn {함수} signal.pause ()

시그널이 수신될 때까지 프로세스를 휴면 상태로 만듭니다; 그런 다음 적절한 처리기가 호출됩니다. 아무것도 반환하지 않습니다.

@ref{213c,,가용성}: Unix.

자세한 내용은 매뉴얼 페이지 @code{signal(2)@footnote{https://manpages.debian.org/signal(2)}}를 참조하십시오.

@ref{1338,,sigwait()}, @ref{faa,,sigwaitinfo()}, @ref{fa9,,sigtimedwait()} 및 @ref{1337,,sigpending()}도 참조하십시오.
@end deffn

@geindex raise_signal() (signal 모듈)
@anchor{library/signal signal raise_signal}@anchor{1b8d}
@deffn {함수} signal.raise_signal (signum)

호출하는 프로세스에 시그널을 보냅니다. 아무것도 반환하지 않습니다.


Added in version 3.8.

@end deffn

@geindex pidfd_send_signal() (signal 모듈)
@anchor{library/signal signal pidfd_send_signal}@anchor{b25}
@deffn {함수} signal.pidfd_send_signal (pidfd, sig, siginfo=None, flags=0)

파일 기술자 `pidfd'가 참조하는 프로세스로 시그널 `sig'를 보냅니다. 파이썬은 현재 `siginfo' 매개 변수를 지원하지 않습니다; @code{None}이어야 합니다. `flags' 인자는 향후 확장을 위해 제공됩니다; 현재는 플래그 값이 정의되어 있지 않습니다.

자세한 내용은 @code{pidfd_send_signal(2)@footnote{https://manpages.debian.org/pidfd_send_signal(2)}} 매뉴얼 페이지를 참조하십시오.

@ref{213c,,가용성}: Linux >= 5.1, Android >= @ref{d82,,build-time} API level 31


Added in version 3.9.

@end deffn

@geindex pthread_kill() (signal 모듈)
@anchor{library/signal signal pthread_kill}@anchor{1336}
@deffn {함수} signal.pthread_kill (thread_id, signalnum)

시그널 `signalnum'을 호출자와 같은 프로세스의 다른 스레드인 스레드 `thread_id'로 보냅니다. 대상 스레드는 임의의 (파이썬이거나 아닌) 코드를 실행 중일 수 있습니다. 그러나, 대상 스레드가 파이썬 인터프리터를 실행 중이면, 파이썬 시그널 처리기는 @ref{3a94,,메인 인터프리터의 메인 스레드에서 실행}됩니다. 따라서, 특정 파이썬 스레드에 시그널을 보내는 것의 유일한 용도는 실행 중인 시스템 호출이 @ref{f87,,InterruptedError}로 실패하도록 하는 것입니다.

`thread_id'에 적합한 값을 얻으려면 @ref{135f,,threading.get_ident()} 나 @ref{176,,threading.Thread} 객체의 @ref{315e,,ident} 어트리뷰트를 사용하십시오.

`signalnum'이 0이면, 시그널이 전송되지 않지만, 여전히 에러 검사가 수행됩니다; 대상 스레드가 여전히 실행 중인지 확인하는 데 사용할 수 있습니다.

인자 @code{thread_id}, @code{signalnum}으로 @ref{1c6c,,감사 이벤트} @code{signal.pthread_kill}을 발생시킵니다.

@ref{213c,,가용성}: Unix.

자세한 내용은 매뉴얼 페이지 @code{pthread_kill(3)@footnote{https://manpages.debian.org/pthread_kill(3)}}을 참조하십시오.

@ref{156c,,os.kill()}도 참조하십시오.


Added in version 3.3.

@end deffn

@geindex pthread_sigmask() (signal 모듈)
@anchor{library/signal signal pthread_sigmask}@anchor{1335}
@deffn {함수} signal.pthread_sigmask (how, mask)

호출하는 스레드의 시그널 마스크를 가져오거나 변경하거나 가져오면서 변경합니다. 시그널 마스크는 호출자에게 현재 배달이 차단된 시그널 집합입니다. 이전 시그널 마스크를 시그널 집합으로 반환합니다.

호출의 동작은 다음과 같이 `how' 값에 따라 다릅니다.


@itemize *

@item 
@ref{3a96,,SIG_BLOCK}: 차단된 시그널 집합은 현재 집합과 `mask' 인자의 합집합입니다.

@item 
@ref{3a97,,SIG_UNBLOCK}: `mask'에 있는 시그널이 차단된 시그널의 현재 집합에서 제거됩니다. 차단되지 않은 시그널을 차단 해제하려고 시도할 수 있습니다.

@item 
@ref{3a98,,SIG_SETMASK}: 차단된 시그널 집합이 `mask' 인자로 설정됩니다.
@end itemize

`mask'는 시그널 번호 집합입니다 (예를 들어 @{@ref{253,,signal.SIGINT}, @ref{15e4,,signal.SIGTERM}@}). 모든 시그널을 포함한 전체 마스크를 얻으려면 @ref{3aa8,,valid_signals()}를 사용하십시오.

예를 들어, @code{signal.pthread_sigmask(signal.SIG_BLOCK, [])}은 호출하는 스레드의 시그널 마스크를 읽습니다.

@ref{d4f,,SIGKILL}과 @ref{3aa2,,SIGSTOP}은 차단할 수 없습니다.

@ref{213c,,가용성}: Unix.

자세한 내용은 매뉴얼 페이지 @code{sigprocmask(2)@footnote{https://manpages.debian.org/sigprocmask(2)}}과 @code{pthread_sigmask(3)@footnote{https://manpages.debian.org/pthread_sigmask(3)}}을 참조하십시오.

@ref{3ab0,,pause()}, @ref{1337,,sigpending()} 및 @ref{1338,,sigwait()}도 참조하십시오.


Added in version 3.3.

@end deffn

@geindex setitimer() (signal 모듈)
@anchor{library/signal signal setitimer}@anchor{3aad}
@deffn {함수} signal.setitimer (which, seconds, interval=0.0)

`seconds'(@ref{3aaf,,alarm()}과 달리 float가 허용됩니다) 이후에 그리고 (`interval'이 0이 아니면) 그 후로 `interval' 초마다 발사(fire)하도록 `which'로 지정된 간격 타이머(@ref{3aa9,,signal.ITIMER_REAL}, @ref{3aaa,,signal.ITIMER_VIRTUAL} 또는 @ref{3aab,,signal.ITIMER_PROF} 중 하나)를 설정합니다. `which'로 지정된 간격 타이머는 `seconds'를 0으로 설정하여 지울 수 있습니다.

간격 타이머가 발사(fire)하면, 시그널이 프로세스로 전송됩니다. 전송된 시그널은 사용 중인 타이머에 따라 다릅니다; @ref{3aa9,,signal.ITIMER_REAL}은 @ref{3a9d,,SIGALRM}을, @ref{3aaa,,signal.ITIMER_VIRTUAL}은 @ref{3aa5,,SIGVTALRM}을, @ref{3aab,,signal.ITIMER_PROF}는 @ref{3aa1,,SIGPROF}를 전달합니다.

이전 값은 튜플로 반환됩니다: (지연, 간격).

유효하지 않은 간격 타이머를 전달하려고 하면 @ref{3aac,,ItimerError}가 발생합니다.

@ref{213c,,가용성}: Unix.
@end deffn

@geindex getitimer() (signal 모듈)
@anchor{library/signal signal getitimer}@anchor{3aae}
@deffn {함수} signal.getitimer (which)

`which'로 지정된 주어진 간격 타이머의 현재 값을 반환합니다.

@ref{213c,,가용성}: Unix.
@end deffn

@geindex set_wakeup_fd() (signal 모듈)
@anchor{library/signal signal set_wakeup_fd}@anchor{d66}
@deffn {함수} signal.set_wakeup_fd (fd, *, warn_on_full_buffer=True)

웨이크업 파일 기술자를 `fd'로 설정합니다. 프로그램에서 시그널 처리기를 등록한 시그널이 수신되면, 시그널 번호는 단일 바이트로 fd에 기록됩니다. 관심 있는 시그널에 대한 시그널 처리기를 등록하지 않았으면, 웨이크업 fd에 아무 것도 기록되지 않습니다. 라이브러리에서 poll이나 select 호출을 깨워서, 시그널을 완전히 처리하는 데 사용될 수 있습니다.

이전 웨이크업 fd가 반환됩니다 (또는 파일 기술자 웨이크업이 활성화되지 않았으면 -1). `fd'가 -1이면, 파일 기술자 웨이크업이 비활성화됩니다. -1이 아니면, `fd'는 비 블로킹이어야 합니다. poll이나 select를 다시 호출하기 전에 `fd'에서 바이트를 제거하는 것은 라이브러리의 책임입니다.

스레드가 활성화되었을 때, 이 함수는 @ref{3a94,,메인 인터프리터의 메인 스레드}에서만 호출할 수 있습니다; 다른 스레드에서 호출하려고 하면 @ref{2ec,,ValueError} 예외가 발생합니다.

이 함수를 사용하는 일반적인 두 가지 방법이 있습니다. 두 방법 모두, 시그널이 도착할 때 깨어나기 위해 fd를 사용하지만, `어떤' 시그널이나 시그널들이 도착했는지 판단하는 방법이 다릅니다.

첫 번째 방법에서는, fd의 버퍼에서 데이터를 읽고, 바이트 값이 시그널 번호를 제공합니다. 이것은 간단합니다만, 드물게 문제가 될 수 있습니다: 일반적으로 fd에는 제한된 버퍼 공간이 있으며, 너무 많은 시그널이 너무 빨리 도착하면, 버퍼가 가득 차고, 일부 시그널이 손실될 수 있습니다. 이 방법을 사용하면, 시그널이 손실될 때 최소한 stderr에 경고가 인쇄되도록 @code{warn_on_full_buffer=True}를 설정해야 합니다.

두 번째 방법에서는, 오직 웨이크업만을 위해 웨이크업 fd를 사용하고, 실제 바이트 값은 무시합니다. 이 경우, 우리가 신경 쓰는 것은 fd의 버퍼가 비어 있는지 비어 있지 않은지 입니다; 가득 찬 버퍼는 전혀 문제를 가리키지 않습니다. 이 방법을 사용하면, 사용자가 가짜 경고 메시지로 혼동되지 않도록 @code{warn_on_full_buffer=False}를 설정해야 합니다.


버전 3.5에서 변경: 윈도우에서, 이 함수는 이제 소켓 핸들도 지원합니다.



버전 3.7에서 변경: @code{warn_on_full_buffer} 매개 변수를 추가했습니다.

@end deffn

@geindex siginterrupt() (signal 모듈)
@anchor{library/signal signal siginterrupt}@anchor{133a}
@deffn {함수} signal.siginterrupt (signalnum, flag)

시스템 호출 재시작 동작을 변경합니다: `flag'가 @ref{d2a,,False}이면, 시그널 `signalnum'에 의해 인터럽트 될 때 시스템 호출이 다시 시작되고, 그렇지 않으면 시스템 호출이 중단됩니다. 아무것도 반환하지 않습니다.

@ref{213c,,가용성}: Unix.

자세한 내용은 매뉴얼 페이지 @code{siginterrupt(3)@footnote{https://manpages.debian.org/siginterrupt(3)}}을 참조하십시오.

@ref{cb,,signal()}로 시그널 처리기를 설치하면 주어진 시그널에 대해 `flag' 값을 참으로 @code{siginterrupt()}를 묵시적으로 호출하여 재시작 동작을 인터럽트 가능으로 재설정합니다.
@end deffn

@geindex signal() (signal 모듈)
@anchor{library/signal signal signal}@anchor{1339}
@deffn {함수} signal.signal (signalnum, handler)

시그널 `signalnum'의 처리기를 함수 `handler'로 설정합니다. `handler'는 두 개의 인자(아래를 참조하십시오)를  취하는 콜러블 파이썬 객체, 또는 특수 값 @ref{1baf,,signal.SIG_IGN}이나 @ref{1bb0,,signal.SIG_DFL} 중 하나일 수 있습니다. 이전 시그널 처리기가 반환됩니다 (위의 @ref{1a25,,getsignal()} 설명을 참조하십시오). (자세한 내용은 유닉스 매뉴얼 페이지 @code{signal(2)@footnote{https://manpages.debian.org/signal(2)}}를 참조하십시오.)

스레드가 활성화되었을 때, 이 함수는 @ref{3a94,,메인 인터프리터의 메인 스레드}에서만 호출할 수 있습니다; 다른 스레드에서 호출하려고 하면 @ref{2ec,,ValueError} 예외가 발생합니다.

`handler'는 두 개의 인자로 호출됩니다: 시그널 번호와 현재 스택 프레임 (@code{None}이나 프레임 객체; 프레임 객체에 대한 설명은, @ref{8ee,,형 계층에 있는 설명}을 참조하거나 @ref{82,,inspect} 모듈의 어트리뷰트 설명을 참조하십시오).

윈도우에서, @ref{cb,,signal()}은 @ref{1281,,SIGABRT}, @ref{1280,,SIGFPE}, @ref{1283,,SIGILL}, @ref{253,,SIGINT}, @ref{127f,,SIGSEGV}, @ref{15e4,,SIGTERM} 또는 @ref{3a9e,,SIGBREAK}로만 호출 할 수 있습니다. 다른 경우에는 @ref{2ec,,ValueError}가 발생합니다. 모든 시스템이 같은 시그널 이름 집합을 정의하는 것은 아님에 유의하십시오; 시그널 이름이 @code{SIG*} 모듈 수준 상수로 정의되지 않으면 @ref{5ee,,AttributeError}가 발생합니다.
@end deffn

@geindex sigpending() (signal 모듈)
@anchor{library/signal signal sigpending}@anchor{1337}
@deffn {함수} signal.sigpending ()

호출하는 스레드로 전달 계류 중인 시그널 집합을 검사합니다 (즉, 차단된 동안 발생한 시그널). 계류 중인 시그널 집합을 반환합니다.

@ref{213c,,가용성}: Unix.

자세한 내용은 매뉴얼 페이지 @code{sigpending(2)@footnote{https://manpages.debian.org/sigpending(2)}}를 참조하십시오.

@ref{3ab0,,pause()}, @ref{1335,,pthread_sigmask()} 및 @ref{1338,,sigwait()}도 참조하십시오.


Added in version 3.3.

@end deffn

@geindex sigwait() (signal 모듈)
@anchor{library/signal signal sigwait}@anchor{1338}
@deffn {함수} signal.sigwait (sigset)

시그널 집합 `sigset'에 지정된 시그널 중 하나가 전달될 때까지 호출하는 스레드의 실행을 일시 중단합니다. 이 함수는 시그널을 받아들이고 (계류 중인 시그널 목록에서 제거합니다), 시그널 번호를 반환합니다.

@ref{213c,,가용성}: Unix.

자세한 내용은 매뉴얼 페이지 @code{sigwait(3)@footnote{https://manpages.debian.org/sigwait(3)}}을 참조하십시오.

@ref{3ab0,,pause()}, @ref{1335,,pthread_sigmask()}, @ref{1337,,sigpending()}, @ref{faa,,sigwaitinfo()} 및 @ref{fa9,,sigtimedwait()}도 참조하십시오.


Added in version 3.3.

@end deffn

@geindex sigwaitinfo() (signal 모듈)
@anchor{library/signal signal sigwaitinfo}@anchor{faa}
@deffn {함수} signal.sigwaitinfo (sigset)

시그널 집합 `sigset'에 지정된 시그널 중 하나가 전달될 때까지 호출하는 스레드의 실행을 일시 중단합니다. 이 함수는 시그널을 받아들이고 계류 중인 시그널 목록에서 제거합니다. `sigset'의 시그널 중 하나가 이미 호출하는 스레드에 대해 계류 중이면, 함수는 해당 시그널에 대한 정보와 함께 즉시 반환합니다. 전달된 시그널에 대해 시그널 처리기가 호출되지 않습니다. 이 함수는 `sigset'에 없는 시그널에 의해 중단되면 @ref{f87,,InterruptedError}를 발생시킵니다.

The return value is an object representing the data contained in the
@code{siginfo_t} structure, namely: @code{si_signo}, @code{si_code},
@code{si_errno}, @code{si_pid}, @code{si_uid}, @code{si_status}, @code{si_band}.

@ref{213c,,가용성}: Unix.

자세한 내용은 매뉴얼 페이지 @code{sigwaitinfo(2)@footnote{https://manpages.debian.org/sigwaitinfo(2)}}를 참조하십시오.

@ref{3ab0,,pause()}, @ref{1338,,sigwait()} 및 @ref{fa9,,sigtimedwait()}도 참조하십시오.


Added in version 3.3.



버전 3.5에서 변경: 이 함수는 이제 `sigset'에 없는 시그널에 의해 중단되고 시그널 처리기가 예외를 발생시키지 않으면 재시도됩니다 (이유는 
@geindex Python 향상 제안; PEP 475
PEP 475@footnote{https://peps.python.org/pep-0475/}를 참조하십시오).

@end deffn

@geindex sigtimedwait() (signal 모듈)
@anchor{library/signal signal sigtimedwait}@anchor{fa9}
@deffn {함수} signal.sigtimedwait (sigset, timeout)

@ref{faa,,sigwaitinfo()}와 유사하지만, 시간제한을 지정하는 추가 `timeout' 인자를 취합니다. `timeout'이 @code{0}으로 지정되면, 폴링이 수행됩니다. 시간제한 초과가 발생하면 @ref{884,,None}을 반환합니다.

@ref{213c,,가용성}: Unix.

자세한 내용은 매뉴얼 페이지 @code{sigtimedwait(2)@footnote{https://manpages.debian.org/sigtimedwait(2)}}를 참조하십시오.

@ref{3ab0,,pause()}, @ref{1338,,sigwait()} 및 @ref{faa,,sigwaitinfo()}도 참조하십시오.


Added in version 3.3.



버전 3.5에서 변경: 이 함수는 이제 `sigset'에 없는 시그널에 의해 중단되고 시그널 처리기가 예외를 발생시키지 않으면 다시 계산된 `timeout'으로 재시도됩니다 (이유는 
@geindex Python 향상 제안; PEP 475
PEP 475@footnote{https://peps.python.org/pep-0475/}를 참조하십시오).

@end deffn

@node 예제<21>,SIGPIPE에 대한 참고 사항,모듈 내용<4>,signal — 비동기 이벤트에 대한 처리기 설정
@anchor{library/signal examples}@anchor{3ab1}@anchor{library/signal signal-example}@anchor{3ab2}
@subsubsection 예제


다음은 최소한의 예제 프로그램입니다. @ref{3aaf,,alarm()} 함수를 사용하여 파일을 여는 데 대기하는 시간을 제한합니다; 이것은 파일이 켜져 있지 않을 수 있는 직렬 장치를 위한 파일일 때 유용하며, 일반적으로 @ref{f91,,os.open()}이 무기한 정지됩니다. 해결책은 파일을 열기 전에 5초 알람을 설정하는 것입니다; 작업이 너무 오래 걸리면, 알람 시그널이 전송되고, 처리기가 예외를 발생시킵니다.

@example
import signal, os

def handler(signum, frame):
    signame = signal.Signals(signum).name
    print(f'Signal handler called with signal @{signame@} (@{signum@})')
    raise OSError("Couldn't open device!")

# 시그널 처리기와 5초 알람을 설정합니다
signal.signal(signal.SIGALRM, handler)
signal.alarm(5)

# 이 open()은 무기한 멈출 수 있습니다
fd = os.open('/dev/ttyS0', os.O_RDWR)

signal.alarm(0)          # 알람을 비활성화합니다
@end example

@node SIGPIPE에 대한 참고 사항,신호 처리기와 예외에 대한 참고 사항,예제<21>,signal — 비동기 이벤트에 대한 처리기 설정
@anchor{library/signal note-on-sigpipe}@anchor{3ab3}
@subsubsection SIGPIPE에 대한 참고 사항


프로그램의 출력을 @code{head(1)@footnote{https://manpages.debian.org/head(1)}}와 같은 도구로 파이핑 하면 표준 출력의 수신기가 일찍 닫힐 때 여러분의 프로세스로 @ref{3a90,,SIGPIPE} 시그널이 전송됩니다. 이것은 @code{BrokenPipeError: [Errno 32] Broken pipe}와 같은 예외를 일으킵니다. 이 경우를 처리하려면, 다음과 같이 이 예외를 포착하도록 진입점을 감싸십시오:

@example
import os
import sys

def main():
    try:
        # 큰 출력을 시뮬레이션합니다 (여러분의 코드가 이 루프를 대체합니다)
        for x in range(10000):
            print("y")
        # 이 try 블록 내부에 있는 동안 SIGPIPE를 강제로 트리거 하기 위해
        # 여기에서 출력을 플러시 합니다.
        sys.stdout.flush()
    except BrokenPipeError:
        # 파이썬은 종료 시 표준 스트림을 플러시 합니다; 종료 시 또 다른 BrokenPipeError를
        # 피하고자 나머지 출력을 devnull 로 리디렉션 합니다
        devnull = os.open(os.devnull, os.O_WRONLY)
        os.dup2(devnull, sys.stdout.fileno())
        sys.exit(1)  # EPIPE에 대해 파이썬은 에러 코드 1로 종료합니다

if __name__ == '__main__':
    main()
@end example

@ref{125b,,BrokenPipeError}를 피하고자 @ref{3a90,,SIGPIPE}의 배치를 @ref{1bb0,,SIG_DFL}로 설정하지 마십시오. 그렇게 하면 프로그램이 여전히 쓰고 있는 동안 소켓 연결이 중단될 때마다 프로그램이 예기치 않게 종료되도록 합니다.

@node 신호 처리기와 예외에 대한 참고 사항,,SIGPIPE에 대한 참고 사항,signal — 비동기 이벤트에 대한 처리기 설정
@anchor{library/signal handlers-and-exceptions}@anchor{26f2}@anchor{library/signal note-on-signal-handlers-and-exceptions}@anchor{3ab4}
@subsubsection 신호 처리기와 예외에 대한 참고 사항


If a signal handler raises an exception, the exception will be propagated to
the main thread and may be raised after any @ref{4ab,,bytecode} instruction. Most
notably, a @ref{bc4,,KeyboardInterrupt} may appear at any point during execution.
Most Python code, including the standard library, cannot be made robust against
this, and so a @code{KeyboardInterrupt} (or any other exception resulting from
a signal handler) may on rare occasions put the program in an unexpected state.

To illustrate this issue, consider the following code:

@example
class SpamContext:
    def __init__(self):
        self.lock = threading.Lock()

    def __enter__(self):
        # 여기에서 KeyboardInterrupt 가 발생하면, 괜찮습니다
        self.lock.acquire()
        # 여기에서 KeyboardInterrupt 가 발생하면, __exit__ 가 호출되지 않습니다
        ...
        # KeyboardInterrupt 는 함수 반환 직전에 발생할 수 있습니다

    def __exit__(self, exc_type, exc_val, exc_tb):
        ...
        self.lock.release()
@end example

For many programs, especially those that merely want to exit on
@ref{bc4,,KeyboardInterrupt}, this is not a problem, but applications that are
complex or require high reliability should avoid raising exceptions from signal
handlers. They should also avoid catching @code{KeyboardInterrupt} as a means
of gracefully shutting down.  Instead, they should install their own
@ref{253,,SIGINT} handler. Below is an example of an HTTP server that avoids
@code{KeyboardInterrupt}:

@example
import signal
import socket
from selectors import DefaultSelector, EVENT_READ
from http.server import HTTPServer, SimpleHTTPRequestHandler

interrupt_read, interrupt_write = socket.socketpair()

def handler(signum, frame):
    print('Signal handler called with signal', signum)
    interrupt_write.send(b'\0')
signal.signal(signal.SIGINT, handler)

def serve_forever(httpd):
    sel = DefaultSelector()
    sel.register(interrupt_read, EVENT_READ)
    sel.register(httpd, EVENT_READ)

    while True:
        for key, _ in sel.select():
            if key.fileobj == interrupt_read:
                interrupt_read.recv(1)
                return
            if key.fileobj == httpd:
                httpd.handle_request()

print("Serving on port 8000")
httpd = HTTPServer(('@w{'}, 8000), SimpleHTTPRequestHandler)
serve_forever(httpd)
print("Shutdown...")
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node mmap — 메모리 맵 파일 지원,,signal — 비동기 이벤트에 대한 처리기 설정,네트워킹과 프로세스 간 통신
@anchor{library/mmap doc}@anchor{3ab5}@anchor{library/mmap mmap-memory-mapped-file-support}@anchor{3ab6}@anchor{library/mmap module-mmap}@anchor{94}@anchor{library/mmap translation-repo}@anchor{3ab7}
@subsection @code{mmap} — 메모리 맵 파일 지원


@geindex module; mmap


__________________________________________________________________


@c include for modules that don't work on WASM

@ref{213c,,가용성}: not WASI.

이 모듈은 웹어셈블리에서 작동하지 않거나 제공되지 않습니다. 자세한 내용은 @ref{1b68,,웹어셈블리 플랫폼}을 참조하세요.

메모리 맵 파일 객체는 동시에 @ref{344,,bytearray} 와 @ref{13c8,,파일 객체}처럼 작동합니다. @code{bytearray}를 기대하는 대부분 장소에서 mmap 객체를 사용할 수 있습니다. 예를 들어, @ref{be,,re} 모듈을 사용하여 메모리 맵 파일을 검색할 수 있습니다. @code{obj[index] = 97}를 사용해서 한 바이트를 변경하거나, 슬라이스에 대입하여 서브 시퀀스를 변경할 수도 있습니다: @code{obj[i1:i2] = b'...'}. 또한 현재 파일 위치에서 시작하여 데이터를 읽고 쓸 수 있고, 다른 위치로 파일을 @code{seek()} 할 수 있습니다.

메모리 맵 파일은 @ref{518,,mmap} 생성자로 만드는데, 유닉스와 윈도우에서 다릅니다. 두 경우 모두 갱신을 위해 열린 파일에 대한 파일 기술자를 제공해야 합니다. 기존 파이썬 파일 객체를 매핑하려면, @ref{17b4,,fileno()} 메서드를 사용하여 `fileno' 매개 변수에 대한 올바른 값을 가져오십시오. 그렇지 않으면, 파일 기술자를 직접 반환하는 @ref{f91,,os.open()} 함수를 사용하여 파일을 열 수 있습니다 (완료되면 파일을 닫아야 합니다).

@cartouche
@quotation 참고 
쓰기 가능하고 버퍼링 되는 파일에 대한 메모리 맵을 만들려면, 먼저 파일을 @ref{2d0d,,flush()}해야 합니다. 버퍼에 대한 지역 변경 사항이 실제로 매핑에 반영되게 하는 데 필요합니다.
@end quotation
@end cartouche

유닉스와 윈도우 버전의 생성자 모두에서, `access'는 선택적 키워드 매개 변수로 지정될 수 있습니다. `access'는 @code{ACCESS_READ}, @code{ACCESS_WRITE} 또는 @code{ACCESS_COPY} 중 하나의 값을 받아, 읽기 전용, 동시 기록(write-through) 또는 쓸 때 복사(copy-on-write) 메모리를 각각 지정하거나, @code{ACCESS_DEFAULT}를 사용하여 `prot'로 위임합니다. `access'는 유닉스와 윈도우에서 모두 사용할 수 있습니다. `access'를 지정하지 않으면, 윈도우 mmap은 동시 기록(write-through) 매핑을 반환합니다. 세 가지 액세스 유형 모두에서 초기 메모리값은 지정된 파일에서 가져옵니다. @code{ACCESS_READ} 메모리 맵에 대입하면 @ref{198,,TypeError} 예외가 발생합니다. @code{ACCESS_WRITE} 메모리 맵에 대입하면 메모리와 하부 파일에 모두 영향을 줍니다. @code{ACCESS_COPY} 메모리 맵에 대입하면 메모리에는 영향을 미치지만, 하부 파일은 변경되지 않습니다.


버전 3.7에서 변경: @code{ACCESS_DEFAULT} 상수가 추가되었습니다.


익명 메모리를 매핑하려면, length와 함께 -1을 fileno로 전달해야 합니다.

@geindex mmap (mmap 클래스)
@anchor{library/mmap mmap mmap}@anchor{518}
@deffn {클래스} mmap.mmap (fileno, length, tagname=None, access=ACCESS_DEFAULT, offset=0)

`(윈도우 버전)' 파일 핸들 `fileno'로 지정된 파일의 `length' 바이트를 매핑하고, mmap 객체를 만듭니다. `length'가 파일의 현재 크기보다 크면, 파일은 `length' 바이트를 포함하도록 확장됩니다. `length'가 @code{0} 이면, 맵의 최대 길이는 파일의 현재 길이입니다. 단, 파일이 비어 있으면 윈도우에서 예외가 발생합니다 (윈도우에는 빈 매핑을 만들 수 없습니다).

`tagname'가 지정되고 @code{None}이 아니면, 매핑의 태그 이름을 제공하는 문자열입니다. 윈도우에서는 같은 파일에 대해 여러 가지 다른 매핑을 사용할 수 있게 합니다. 기존 태그의 이름을 지정하면, 해당 태그가 열리고, 그렇지 않으면 이 이름의 새 태그가 만들어집니다. 이 매개 변수가 생략되거나 @code{None} 이면, 매핑은 이름 없이 만들어집니다. `tagname' 매개 변수의 사용을 피하면 코드를 유닉스와 윈도우 사이에서 이식성 있게 유지할 수 있습니다.

`offset'은 음이 아닌 정수 오프셋으로 지정할 수 있습니다. mmap 참조는 파일 시작 부분으로부터의 오프셋에 상대적입니다. `offset'의 기본값은 0입니다. `offset'은 @code{ALLOCATIONGRANULARITY}의 배수여야 합니다.

인자 @code{fileno}, @code{length}, @code{access}, @code{offset}로 @ref{1c6c,,감사 이벤트(auditing event)} @code{mmap.__new__}를 발생시킵니다.
@end deffn


@deffn {클래스} mmap.mmap (fileno, length, flags=MAP_SHARED, prot=PROT_WRITE | PROT_READ, access=ACCESS_DEFAULT, offset=0, *, trackfd=True)

`(유닉스 버전)' 파일 기술자 `fileno'로 지정된 파일의 `length' 바이트를 매핑하고, mmap 객체를 반환합니다. `length'가 @code{0} 이면, 맵의 최대 길이는 @ref{518,,mmap}가 호출될 때 파일의 현재 길이입니다.

`flags'는 매핑의 특성을 지정합니다. @ref{3ab8,,MAP_PRIVATE}는 비공개 쓸 때 복사 (copy-on-write) 매핑을 생성하므로, mmap 객체의 내용에 대한 변경 사항은 이 프로세스에만 적용되고, @ref{3ab9,,MAP_SHARED}는 파일의 같은 영역을 매핑하는 다른 모든 프로세스와 공유되는 매핑을 만듭니다. 기본값은 @code{MAP_SHARED}입니다. 일부 시스템에는 @ref{3aba,,MAP_* 상수}에 지정된 전체 목록과 함께 추가적으로 가능한 플래그가 있습니다.

`prot'가 지정되면 원하는 메모리 보호를 제공합니다; 가장 유용한 두 값은 페이지를 읽거나 쓰도록 지정할 수 있는 @code{PROT_READ}와 @code{PROT_WRITE}입니다. `prot'의 기본값은 @code{PROT_READ | PROT_WRITE}입니다.

`access'는 선택적 키워드 매개 변수로 `flags' 와 `prot' 대신 지정 될 수 있습니다. `flags', `prot' 와 `access'를 모두 지정하는 것은 에러입니다. 이 매개 변수를 사용하는 방법에 대한 정보는 위의 `access' 설명을 참조하십시오.

`offset'은 음이 아닌 정수 오프셋으로 지정할 수 있습니다. mmap 참조는 파일 시작 부분으로부터의 오프셋에 상대적입니다. `offset'의 기본값은 0입니다. `offset'은 유닉스 시스템에서 @code{PAGESIZE}와 같은 @code{ALLOCATIONGRANULARITY}의 배수여야 합니다.

If `trackfd' is @code{False}, the file descriptor specified by `fileno' will
not be duplicated, and the resulting @code{mmap} object will not
be associated with the map’s underlying file.
This means that the @ref{3abb,,size()} and @ref{3abc,,resize()}
methods will fail.
This mode is useful to limit the number of open file descriptors.

생성된 메모리 매핑의 유효성을 보장하기 위해, 기술자 `fileno'로 지정된 파일은 맥 OS에서 물리적 저장 장치와 내부적으로 자동 동기화됩니다.


버전 3.13에서 변경: `trackfd' 매개 변수를 추가했습니다.


이 예제는 @ref{518,,mmap}을 사용하는 간단한 방법을 보여줍니다:

@example
import mmap

# 간단한 예제 파일을 작성합니다
with open("hello.txt", "wb") as f:
    f.write(b"Hello Python!\n")

with open("hello.txt", "r+b") as f:
    # 파일을 메모리 맵 합니다, 크기 0은 전체 파일을 뜻합니다.
    mm = mmap.mmap(f.fileno(), 0)
    # 표준 파일 메서드로 내용을 읽습니다
    print(mm.readline())  # b"Hello Python!\n" 를 인쇄합니다
    # 슬라이스 표기법으로 내용을 읽습니다
    print(mm[:5])  # b"Hello" 를 인쇄합니다
    # 슬라이스 표기법을 사용하여 내용을 갱신합니다;
    # 새 내용의 크기가 같아야 합니다
    mm[6:] = b" world!\n"
    # ... 표준 파일 메서드로 다시 읽습니다
    mm.seek(0)
    print(mm.readline())  # b"Hello  world!\n" 를 인쇄합니다
    # 맵을 닫습니다
    mm.close()
@end example

@ref{518,,mmap}은 @ref{186,,with} 문에서 컨텍스트 관리자로 사용할 수도 있습니다:

@example
import mmap

with mmap.mmap(-1, 13) as mm:
    mm.write(b"Hello world!")
@end example


Added in version 3.2: 컨텍스트 관리자 지원.


다음 예제는 익명 맵을 만들고 부모와 자식 프로세스 간에 데이터를 교환하는 방법을 보여줍니다:

@example
import mmap
import os

mm = mmap.mmap(-1, 13)
mm.write(b"Hello world!")

pid = os.fork()

if pid == 0:  # 자식 프로세스에서
    mm.seek(0)
    print(mm.readline())

    mm.close()
@end example

인자 @code{fileno}, @code{length}, @code{access}, @code{offset}로 @ref{1c6c,,감사 이벤트(auditing event)} @code{mmap.__new__}를 발생시킵니다.

메모리 맵 파일 객체는 다음 메서드를 지원합니다:

@geindex close() (mmap.mmap 메서드)
@anchor{library/mmap mmap mmap close}@anchor{3abd}
@deffn {메서드} close ()

mmap를 닫습니다. 이후에 객체의 다른 메서드를 호출하면 ValueError 예외가 발생합니다. 열려있는 파일을 닫지 않습니다.
@end deffn

@geindex closed (mmap.mmap의 속성)
@anchor{library/mmap mmap mmap closed}@anchor{3abe}
@deffn {속성} closed

파일이 닫혔으면 @code{True}입니다.


Added in version 3.2.

@end deffn

@geindex find() (mmap.mmap 메서드)
@anchor{library/mmap mmap mmap find}@anchor{3abf}
@deffn {메서드} find (sub[, start[, end]])

서브 시퀀스 `sub'가 발견되는 객체에서 가장 낮은 인덱스를 반환합니다. `sub'는 [`start', `end'] 범위에 포함되어야 합니다. 선택적 인자 `start' 와 `end'는 슬라이스 표기법처럼 해석됩니다. 실패하면 @code{-1}를 반환합니다.


버전 3.5에서 변경: 이제 쓰기 가능한 @ref{193,,바이트열류 객체}를 받아들입니다.

@end deffn

@geindex flush() (mmap.mmap 메서드)
@anchor{library/mmap mmap mmap flush}@anchor{c8e}
@deffn {메서드} flush ()

@deffnx {메서드} flush (offset, size, /)

파일의 메모리 내 복사본에 대한 변경 사항을 디스크로 플러시 합니다. 이 호출을 사용하지 않으면, 객체가 파괴되기 전에 변경 내용이 기록된다고 보장할 수 없습니다. `offset'과 `size'가 지정되면, 지정된 바이트 범위의 변경 사항만 디스크로 플러시 됩니다; 그렇지 않으면, 매핑의 전체 범위가 플러시 됩니다. `offset'은 @code{PAGESIZE} 나 @code{ALLOCATIONGRANULARITY}의 배수여야 합니다.

성공을 나타내기 위해 @code{None}이 반환됩니다. 호출이 실패하면 예외가 발생합니다.


버전 3.8에서 변경: 이전에는, 성공 시 0이 아닌 값이 반환되었습니다; 윈도우에서 에러 시 0이 반환되었습니다. 성공 시 0 값이 반환되었습니다; 유닉스에서 에러 시 예외가 발생했습니다.

@end deffn

@geindex madvise() (mmap.mmap 메서드)
@anchor{library/mmap mmap mmap madvise}@anchor{bfa}
@deffn {메서드} madvise (option[, start[, length]])

`start'에서 시작하고 `length' 바이트만큼 확장하는 메모리 영역에 대해 커널에 조언 `option'을 보냅니다. `option'은 시스템에서 사용할 수 있는 @ref{3ac0,,MADV_* 상수} 중 하나여야 합니다. `start'와 `length'가 생략되면, 전체 매핑으로 확장됩니다. 일부 시스템(리눅스 포함)에서, `start'는 @code{PAGESIZE}의 배수여야 합니다.

가용성: @code{madvise()} 시스템 호출이 있는 시스템.


Added in version 3.8.

@end deffn

@geindex move() (mmap.mmap 메서드)
@anchor{library/mmap mmap mmap move}@anchor{3ac1}
@deffn {메서드} move (dest, src, count)

오프셋 `src'에서 시작하는 `count' 바이트를 대상 인덱스 `dest'로 복사합니다. mmap이 @code{ACCESS_READ}로 만들어졌으면, move를 호출하면 @ref{198,,TypeError} 예외가 발생합니다.
@end deffn

@geindex read() (mmap.mmap 메서드)
@anchor{library/mmap mmap mmap read}@anchor{12e2}
@deffn {메서드} read ([n])

현재의 파일 위치로부터 최대 `n' 바이트를 포함하는 @ref{192,,bytes}를 반환합니다. 인자가 생략되거나 @code{None} 이거나 음수면, 현재 파일 위치에서 매핑의 끝까지 모든 바이트를 반환합니다. 파일 위치는 반환된 바이트의 뒤를 가리키도록 갱신됩니다.


버전 3.3에서 변경: 인자는 생략되거나 @code{None} 일 수 있습니다.

@end deffn

@geindex read_byte() (mmap.mmap 메서드)
@anchor{library/mmap mmap mmap read_byte}@anchor{3ac2}
@deffn {메서드} read_byte ()

현재 파일 위치의 한 바이트를 정수로 반환하고, 파일 위치를 1 증가시킵니다.
@end deffn

@geindex readline() (mmap.mmap 메서드)
@anchor{library/mmap mmap mmap readline}@anchor{3ac3}
@deffn {메서드} readline ()

현재 파일 위치에서 시작하여 다음 줄 바꿈까지 한 줄을 반환합니다. 반환된 바이트 뒤를 가리키도록 파일 위치가 갱신됩니다.
@end deffn

@geindex resize() (mmap.mmap 메서드)
@anchor{library/mmap mmap mmap resize}@anchor{3abc}
@deffn {메서드} resize (newsize)

Resizes the map and the underlying file, if any.

Resizing a map created with `access' of @code{ACCESS_READ} or
@code{ACCESS_COPY}, will raise a @ref{198,,TypeError} exception.
Resizing a map created with `trackfd' set to @code{False},
will raise a @ref{2ec,,ValueError} exception.

`On Windows': Resizing the map will raise an @ref{2c0,,OSError} if there are other
maps against the same named file. Resizing an anonymous map (ie against the
pagefile) will silently create a new map with the original data copied over
up to the length of the new size.


버전 3.11에서 변경: Correctly fails if attempting to resize when another map is held
Allows resize against an anonymous map on Windows

@end deffn

@geindex rfind() (mmap.mmap 메서드)
@anchor{library/mmap mmap mmap rfind}@anchor{3ac4}
@deffn {메서드} rfind (sub[, start[, end]])

서브 시퀀스 `sub'가 발견되는 객체에서 가장 높은 인덱스를 반환합니다. `sub'는 [`start', `end'] 범위에 포함되어야 합니다. 선택적 인자 `start' 와 `end'는 슬라이스 표기법처럼 해석됩니다. 실패하면 @code{-1}를 반환합니다.


버전 3.5에서 변경: 이제 쓰기 가능한 @ref{193,,바이트열류 객체}를 받아들입니다.

@end deffn

@geindex seek() (mmap.mmap 메서드)
@anchor{library/mmap mmap mmap seek}@anchor{51a}
@deffn {메서드} seek (pos[, whence])

파일의 현재 위치를 설정합니다. `whence' 인자는 선택적이며 기본값은 @code{os.SEEK_SET} 또는 @code{0} (절대 파일 위치)입니다; 다른 값은 @code{os.SEEK_CUR} 또는 @code{1} (현재 위치를 기준으로 seek)과 @code{os.SEEK_END} 또는 @code{2} (파일의 끝을 기준으로 seek)입니다.


버전 3.13에서 변경: Return the new absolute position instead of @code{None}.

@end deffn

@geindex seekable() (mmap.mmap 메서드)
@anchor{library/mmap mmap mmap seekable}@anchor{519}
@deffn {메서드} seekable ()

Return whether the file supports seeking, and the return value is always @code{True}.


Added in version 3.13.

@end deffn

@geindex size() (mmap.mmap 메서드)
@anchor{library/mmap mmap mmap size}@anchor{3abb}
@deffn {메서드} size ()

파일의 길이를 반환합니다. 메모리 매핑된 영역의 크기보다 클 수 있습니다.
@end deffn

@geindex tell() (mmap.mmap 메서드)
@anchor{library/mmap mmap mmap tell}@anchor{3ac5}
@deffn {메서드} tell ()

파일 포인터의 현재 위치를 반환합니다.
@end deffn

@geindex write() (mmap.mmap 메서드)
@anchor{library/mmap mmap mmap write}@anchor{f45}
@deffn {메서드} write (bytes)

`bytes'의 바이트를 파일 포인터의 현재 위치에 있는 메모리에 기록하고 기록된 바이트 수를 반환합니다 (쓰기가 실패하면 @ref{2ec,,ValueError}가 발생하기 때문에 결코 @code{len(bytes)}보다 작지 않습니다). 파일 위치는 기록된 바이트 뒤를 가리 키도록 갱신됩니다. mmap이 @code{ACCESS_READ}로 만들어졌으면, 기록할 때 @ref{198,,TypeError} 예외가 발생합니다.


버전 3.5에서 변경: 이제 쓰기 가능한 @ref{193,,바이트열류 객체}를 받아들입니다.



버전 3.6에서 변경: 이제 기록한 바이트 수가 반환됩니다.

@end deffn

@geindex write_byte() (mmap.mmap 메서드)
@anchor{library/mmap mmap mmap write_byte}@anchor{3ac6}
@deffn {메서드} write_byte (byte)

정수 `byte'를 파일 포인터의 현재 위치에 있는 메모리에 기록합니다; 파일 위치가 @code{1} 증가합니다. mmap이 @code{ACCESS_READ}로 만들어졌으면, 기록할 때 @ref{198,,TypeError} 예외가 발생합니다.
@end deffn
@end deffn

@menu
* MADV_* 상수:: 
* MAP_* 상수:: 

@end menu

@node MADV_* 상수,MAP_* 상수,,mmap — 메모리 맵 파일 지원
@anchor{library/mmap madv-constants}@anchor{3ac7}@anchor{library/mmap madvise-constants}@anchor{3ac0}
@subsubsection MADV_* 상수


@geindex MADV_NORMAL (mmap 모듈)
@geindex MADV_RANDOM (mmap 모듈)
@geindex MADV_SEQUENTIAL (mmap 모듈)
@geindex MADV_WILLNEED (mmap 모듈)
@geindex MADV_DONTNEED (mmap 모듈)
@geindex MADV_REMOVE (mmap 모듈)
@geindex MADV_DONTFORK (mmap 모듈)
@geindex MADV_DOFORK (mmap 모듈)
@geindex MADV_HWPOISON (mmap 모듈)
@geindex MADV_MERGEABLE (mmap 모듈)
@geindex MADV_UNMERGEABLE (mmap 모듈)
@geindex MADV_SOFT_OFFLINE (mmap 모듈)
@geindex MADV_HUGEPAGE (mmap 모듈)
@geindex MADV_NOHUGEPAGE (mmap 모듈)
@geindex MADV_DONTDUMP (mmap 모듈)
@geindex MADV_DODUMP (mmap 모듈)
@geindex MADV_FREE (mmap 모듈)
@geindex MADV_NOSYNC (mmap 모듈)
@geindex MADV_AUTOSYNC (mmap 모듈)
@geindex MADV_NOCORE (mmap 모듈)
@geindex MADV_CORE (mmap 모듈)
@geindex MADV_PROTECT (mmap 모듈)
@geindex MADV_FREE_REUSABLE (mmap 모듈)
@geindex MADV_FREE_REUSE (mmap 모듈)
@anchor{library/mmap mmap MADV_NORMAL}@anchor{3ac8}
@deffn {데이터} mmap.MADV_NORMAL
@anchor{library/mmap mmap MADV_RANDOM}@anchor{3ac9}
@deffnx {데이터} mmap.MADV_RANDOM
@anchor{library/mmap mmap MADV_SEQUENTIAL}@anchor{3aca}
@deffnx {데이터} mmap.MADV_SEQUENTIAL
@anchor{library/mmap mmap MADV_WILLNEED}@anchor{3acb}
@deffnx {데이터} mmap.MADV_WILLNEED
@anchor{library/mmap mmap MADV_DONTNEED}@anchor{3acc}
@deffnx {데이터} mmap.MADV_DONTNEED
@anchor{library/mmap mmap MADV_REMOVE}@anchor{3acd}
@deffnx {데이터} mmap.MADV_REMOVE
@anchor{library/mmap mmap MADV_DONTFORK}@anchor{3ace}
@deffnx {데이터} mmap.MADV_DONTFORK
@anchor{library/mmap mmap MADV_DOFORK}@anchor{3acf}
@deffnx {데이터} mmap.MADV_DOFORK
@anchor{library/mmap mmap MADV_HWPOISON}@anchor{3ad0}
@deffnx {데이터} mmap.MADV_HWPOISON
@anchor{library/mmap mmap MADV_MERGEABLE}@anchor{3ad1}
@deffnx {데이터} mmap.MADV_MERGEABLE
@anchor{library/mmap mmap MADV_UNMERGEABLE}@anchor{3ad2}
@deffnx {데이터} mmap.MADV_UNMERGEABLE
@anchor{library/mmap mmap MADV_SOFT_OFFLINE}@anchor{3ad3}
@deffnx {데이터} mmap.MADV_SOFT_OFFLINE
@anchor{library/mmap mmap MADV_HUGEPAGE}@anchor{3ad4}
@deffnx {데이터} mmap.MADV_HUGEPAGE
@anchor{library/mmap mmap MADV_NOHUGEPAGE}@anchor{3ad5}
@deffnx {데이터} mmap.MADV_NOHUGEPAGE
@anchor{library/mmap mmap MADV_DONTDUMP}@anchor{3ad6}
@deffnx {데이터} mmap.MADV_DONTDUMP
@anchor{library/mmap mmap MADV_DODUMP}@anchor{3ad7}
@deffnx {데이터} mmap.MADV_DODUMP
@anchor{library/mmap mmap MADV_FREE}@anchor{3ad8}
@deffnx {데이터} mmap.MADV_FREE
@anchor{library/mmap mmap MADV_NOSYNC}@anchor{3ad9}
@deffnx {데이터} mmap.MADV_NOSYNC
@anchor{library/mmap mmap MADV_AUTOSYNC}@anchor{3ada}
@deffnx {데이터} mmap.MADV_AUTOSYNC
@anchor{library/mmap mmap MADV_NOCORE}@anchor{3adb}
@deffnx {데이터} mmap.MADV_NOCORE
@anchor{library/mmap mmap MADV_CORE}@anchor{3adc}
@deffnx {데이터} mmap.MADV_CORE
@anchor{library/mmap mmap MADV_PROTECT}@anchor{3add}
@deffnx {데이터} mmap.MADV_PROTECT
@anchor{library/mmap mmap MADV_FREE_REUSABLE}@anchor{3ade}
@deffnx {데이터} mmap.MADV_FREE_REUSABLE
@anchor{library/mmap mmap MADV_FREE_REUSE}@anchor{3adf}
@deffnx {데이터} mmap.MADV_FREE_REUSE

이 옵션은 @ref{bfa,,mmap.madvise()}로 전달될 수 있습니다. 모든 시스템에서 모든 옵션이 제공되는 것은 아닙니다.

가용성: madvise() 시스템 호출이 있는 시스템.


Added in version 3.8.

@end deffn

@node MAP_* 상수,,MADV_* 상수,mmap — 메모리 맵 파일 지원
@anchor{library/mmap id1}@anchor{3ae0}@anchor{library/mmap map-constants}@anchor{3aba}
@subsubsection MAP_* 상수


@geindex MAP_SHARED (mmap 모듈)
@geindex MAP_PRIVATE (mmap 모듈)
@geindex MAP_32BIT (mmap 모듈)
@geindex MAP_ALIGNED_SUPER (mmap 모듈)
@geindex MAP_ANON (mmap 모듈)
@geindex MAP_ANONYMOUS (mmap 모듈)
@geindex MAP_CONCEAL (mmap 모듈)
@geindex MAP_DENYWRITE (mmap 모듈)
@geindex MAP_EXECUTABLE (mmap 모듈)
@geindex MAP_HASSEMAPHORE (mmap 모듈)
@geindex MAP_JIT (mmap 모듈)
@geindex MAP_NOCACHE (mmap 모듈)
@geindex MAP_NOEXTEND (mmap 모듈)
@geindex MAP_NORESERVE (mmap 모듈)
@geindex MAP_POPULATE (mmap 모듈)
@geindex MAP_RESILIENT_CODESIGN (mmap 모듈)
@geindex MAP_RESILIENT_MEDIA (mmap 모듈)
@geindex MAP_STACK (mmap 모듈)
@geindex MAP_TPRO (mmap 모듈)
@geindex MAP_TRANSLATED_ALLOW_EXECUTE (mmap 모듈)
@geindex MAP_UNIX03 (mmap 모듈)
@anchor{library/mmap mmap MAP_SHARED}@anchor{3ab9}
@deffn {데이터} mmap.MAP_SHARED
@anchor{library/mmap mmap MAP_PRIVATE}@anchor{3ab8}
@deffnx {데이터} mmap.MAP_PRIVATE
@anchor{library/mmap mmap MAP_32BIT}@anchor{1a1c}
@deffnx {데이터} mmap.MAP_32BIT
@anchor{library/mmap mmap MAP_ALIGNED_SUPER}@anchor{1ac5}
@deffnx {데이터} mmap.MAP_ALIGNED_SUPER
@anchor{library/mmap mmap MAP_ANON}@anchor{3ae1}
@deffnx {데이터} mmap.MAP_ANON
@anchor{library/mmap mmap MAP_ANONYMOUS}@anchor{3ae2}
@deffnx {데이터} mmap.MAP_ANONYMOUS
@anchor{library/mmap mmap MAP_CONCEAL}@anchor{1ac6}
@deffnx {데이터} mmap.MAP_CONCEAL
@anchor{library/mmap mmap MAP_DENYWRITE}@anchor{3ae3}
@deffnx {데이터} mmap.MAP_DENYWRITE
@anchor{library/mmap mmap MAP_EXECUTABLE}@anchor{3ae4}
@deffnx {데이터} mmap.MAP_EXECUTABLE
@anchor{library/mmap mmap MAP_HASSEMAPHORE}@anchor{1a17}
@deffnx {데이터} mmap.MAP_HASSEMAPHORE
@anchor{library/mmap mmap MAP_JIT}@anchor{1a19}
@deffnx {데이터} mmap.MAP_JIT
@anchor{library/mmap mmap MAP_NOCACHE}@anchor{1a18}
@deffnx {데이터} mmap.MAP_NOCACHE
@anchor{library/mmap mmap MAP_NOEXTEND}@anchor{1a16}
@deffnx {데이터} mmap.MAP_NOEXTEND
@anchor{library/mmap mmap MAP_NORESERVE}@anchor{1a15}
@deffnx {데이터} mmap.MAP_NORESERVE
@anchor{library/mmap mmap MAP_POPULATE}@anchor{1d2c}
@deffnx {데이터} mmap.MAP_POPULATE
@anchor{library/mmap mmap MAP_RESILIENT_CODESIGN}@anchor{1a1a}
@deffnx {데이터} mmap.MAP_RESILIENT_CODESIGN
@anchor{library/mmap mmap MAP_RESILIENT_MEDIA}@anchor{1a1b}
@deffnx {데이터} mmap.MAP_RESILIENT_MEDIA
@anchor{library/mmap mmap MAP_STACK}@anchor{3ae5}
@deffnx {데이터} mmap.MAP_STACK
@anchor{library/mmap mmap MAP_TPRO}@anchor{1a1f}
@deffnx {데이터} mmap.MAP_TPRO
@anchor{library/mmap mmap MAP_TRANSLATED_ALLOW_EXECUTE}@anchor{1a1d}
@deffnx {데이터} mmap.MAP_TRANSLATED_ALLOW_EXECUTE
@anchor{library/mmap mmap MAP_UNIX03}@anchor{1a1e}
@deffnx {데이터} mmap.MAP_UNIX03

These are the various flags that can be passed to @ref{518,,mmap.mmap()}.  @ref{1ac5,,MAP_ALIGNED_SUPER}
is only available at FreeBSD and @ref{1ac6,,MAP_CONCEAL} is only available at OpenBSD.  Note
that some options might not be present on some systems.


버전 3.10에서 변경: @ref{1d2c,,MAP_POPULATE} 상수가 추가되었습니다.



Added in version 3.11: @ref{3ae5,,MAP_STACK} 상수가 추가되었습니다.



Added in version 3.12: @ref{1ac5,,MAP_ALIGNED_SUPER} 와 @ref{1ac6,,MAP_CONCEAL} 상수를 추가했습니다.



Added in version 3.13: @ref{1a1c,,MAP_32BIT}, @ref{1a17,,MAP_HASSEMAPHORE}, @ref{1a19,,MAP_JIT}, @ref{1a18,,MAP_NOCACHE}, @ref{1a16,,MAP_NOEXTEND}, @ref{1a15,,MAP_NORESERVE}, @ref{1a1a,,MAP_RESILIENT_CODESIGN}, @ref{1a1b,,MAP_RESILIENT_MEDIA}, @ref{1a1f,,MAP_TPRO}, @ref{1a1d,,MAP_TRANSLATED_ALLOW_EXECUTE} 및 @ref{1a1e,,MAP_UNIX03} 상수를 추가했습니다.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 인터넷 데이터 처리,구조화된 마크업 처리 도구,네트워킹과 프로세스 간 통신,파이썬 표준 라이브러리
@anchor{library/netdata doc}@anchor{3ae6}@anchor{library/netdata internet-data-handling}@anchor{3ae7}@anchor{library/netdata netdata}@anchor{3ae8}@anchor{library/netdata translation-repo}@anchor{3ae9}
@section 인터넷 데이터 처리


이 장에서는 인터넷에서 일반적으로 사용되는 데이터 형식 처리를 지원하는 모듈에 관해 설명합니다.

@menu
* email — 전자 메일과 MIME 처리 패키지:: 
* json — JSON 인코더와 디코더:: 
* mailbox — 다양한 형식의 사서함 조작하기:: 
* mimetypes — 파일명을 MIME 유형에 매핑:: 
* base64 — Base16@comma{} Base32@comma{} Base64@comma{} Base85 데이터 인코딩: base64 — Base16 Base32 Base64 Base85 데이터 인코딩. 
* binascii — 바이너리와 ASCII 간의 변환:: 
* quopri — MIME quoted-printable 데이터 인코딩과 디코딩:: 

@end menu

@node email — 전자 메일과 MIME 처리 패키지,json — JSON 인코더와 디코더,,인터넷 데이터 처리
@anchor{library/email doc}@anchor{3aea}@anchor{library/email email-an-email-and-mime-handling-package}@anchor{3aeb}@anchor{library/email module-email}@anchor{3f}
@subsection @code{email} — 전자 메일과 MIME 처리 패키지


@geindex module; email

`소스 코드:' Lib/email/__init__.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/email/__init__.py}


__________________________________________________________________


The @code{email} package is a library for managing email messages.  It is
specifically `not' designed to do any sending of email messages to SMTP
(
@geindex RFC; RFC 2821
RFC 2821@footnote{https://datatracker.ietf.org/doc/html/rfc2821.html}), NNTP, or other servers; those are functions of modules such as
@ref{cf,,smtplib}.  The @code{email} package attempts to be as
RFC-compliant as possible, supporting 
@geindex RFC; RFC 5322
RFC 5322@footnote{https://datatracker.ietf.org/doc/html/rfc5322.html} and 
@geindex RFC; RFC 6532
RFC 6532@footnote{https://datatracker.ietf.org/doc/html/rfc6532.html}, as well as
such MIME-related RFCs as 
@geindex RFC; RFC 2045
RFC 2045@footnote{https://datatracker.ietf.org/doc/html/rfc2045.html}, 
@geindex RFC; RFC 2046
RFC 2046@footnote{https://datatracker.ietf.org/doc/html/rfc2046.html}, 
@geindex RFC; RFC 2047
RFC 2047@footnote{https://datatracker.ietf.org/doc/html/rfc2047.html}, 
@geindex RFC; RFC 2183
RFC 2183@footnote{https://datatracker.ietf.org/doc/html/rfc2183.html},
and 
@geindex RFC; RFC 2231
RFC 2231@footnote{https://datatracker.ietf.org/doc/html/rfc2231.html}.

email 패키지의 전체 구조는 세 가지 주요 구성 요소와 다른 구성 요소의 동작을 제어하는 네 번째 구성 요소로 나눌 수 있습니다.

패키지의 중심 구성 요소는 전자 메일 메시지를 나타내는 “객체 모델”입니다. 응용 프로그램은 주로 @ref{48,,message} 서브 모듈에 정의된 객체 모델 인터페이스를 통해 패키지와 상호 작용합니다. 응용 프로그램은 이 API를 사용하여 기존 전자 메일에 대해 질문을 하거나, 새 전자 메일을 작성하거나, 같은 객체 모델 인터페이스를 사용하는 전자 메일 하위 구성 요소를 추가하거나 제거할 수 있습니다. 즉, 전자 메일 메시지와 MIME 하위 구성 요소의 특성에 따라, 전자 메일 객체 모델은 모두 @ref{57f,,EmailMessage} API를 제공하는 객체의 트리 구조입니다.

패키지의 다른 두 가지 주요 구성 요소는 @ref{52,,parser}와 @ref{44,,generator}입니다. 구문 분석기(parser)는 직렬화된 전자 메일 메시지(바이트 스트림)를 가져와 @ref{57f,,EmailMessage} 객체의 트리로 변환합니다. 생성기(generator)는 @code{EmailMessage}를 받아서 직렬화된 바이트 스트림으로 다시 변환합니다. (구문 분석기와 생성기는 텍스트 문자의 스트림도 처리하지만, 이 사용법은 유효하지 않은 메시지로 끝나기 쉬우므로 사용하지 않는 것이 좋습니다.)

제어 구성 요소는 @ref{53,,policy} 모듈입니다. 모든 @ref{57f,,EmailMessage}, 모든 @ref{44,,generator} 및 모든 @ref{52,,parser}에는 그것의 동작을 제어하는 연관된 @code{policy} 객체가 있습니다. 일반적으로 응용 프로그램은 @code{EmailMessage}가 만들어질 때 정책을 지정하기만 하면 되는데, @code{EmailMessage}를 직접 인스턴스로 만들어서 새 전자 메일을 만들거나, @code{parser}를 사용하여 입력 스트림을 구문 분석할 때입니다. 그러나 메시지가 @code{generator}를 사용하여 직렬화될 때 정책을 변경할 수 있습니다. 이것은, 예를 들어, 범용 전자 메일 메시지를 디스크에서 구분 분석하지만, 전자 메일 서버로 보낼 때 표준 SMTP 설정을 사용하여 직렬화할 수 있도록 합니다.

email 패키지는 응용 프로그램으로부터 각종 관리적인 RFC의 세부 사항을 숨기기 위해 최선을 다합니다. 개념적으로 응용 프로그램은 전자 메일 메시지를 유니코드 텍스트와 바이너리 첨부 파일의 구조화 된 트리로 처리할 수 있어야 하며, 직렬화될 때 이것들이 어떻게 표시되는지 걱정할 필요가 없어야 합니다. 하지만, 실제로는, MIME 메시지와 그 구조, 특히 MIME “콘텐츠 형식(content type)”의 이름과 특성, 그리고 다중 부분 문서를 식별하는 방법을 관리하는 규칙 중 적어도 일부를 신경 쓸 필요가 종종 있습니다. 대부분, 이 지식은 더욱 복잡한 응용 프로그램에만 필요하며, 그럴 때도 그 구조가 어떻게 표현되는지에 대한 세부 사항이 아닌, 문제가 되는 고수준 구조에 관한 것이어야 합니다. MIME 콘텐츠 유형은 최신 인터넷 소프트웨어(전자 메일뿐만 아니라)에서 널리 사용되므로, 많은 프로그래머에게 익숙한 개념입니다.

The following sections describe the functionality of the @code{email} package.
We start with the @ref{48,,message} object model, which is the primary
interface an application will use, and follow that with the
@ref{52,,parser} and @ref{44,,generator} components.  Then we cover the
@ref{53,,policy} controls, which completes the treatment of the main
components of the library.

다음 세 절에서는 패키지에서 발생할 수 있는 예외와 @ref{52,,parser}가 감지할 수 있는 결함(RFC를 준수하지 않는)에 관해 설명합니다. 그런 다음 @ref{46,,headerregistry}와 @ref{41,,contentmanager} 하위 구성 요소를 다룹니다. 이것들은 각각 헤더와 페이로드를 보다 자세하게 조작할 수 있는 도구를 제공합니다. 이 두 구성 요소는 모두 단순하지 않은 메시지를 소비하고 생성하는 것과 관련된 기능을 포함하지만, 고급 응용 프로그램이 관심을 가질 확장 API를 설명하기도 합니다.

그다음은 이전 절에서 다룬 API의 기본 부분들을 사용하는 일련의 예제입니다.

앞의 내용은 email 패키지의 최신(유니코드 친화적인) API를 나타냅니다. @ref{580,,Message} 클래스로 시작하는 나머지 절에서는 전자 메일 메시지가 표현되는 방법에 대한 세부 사항을 훨씬 직접 다루는 레거시 @ref{e96,,compat32} API를 다룹니다. @code{compat32} API는 응용 프로그램으로부터 RFC 세부 사항을 숨기지 `않습니다'만, 그 수준에서 작동해야 하는 응용 프로그램에는 유용한 도구가 될 수 있습니다. 이 설명서는 과거 호환성을 위해 여전히 @ref{e96,,compat32} API를 사용하는 응용 프로그램과도 관련이 있습니다.


버전 3.6에서 변경: 새로운 @ref{57f,,EmailMessage}/@ref{12bc,,EmailPolicy} API를 홍보하기 위해 설명서가 재구성되고 다시 작성되었습니다.


Contents of the @code{email} package documentation:

@menu
* email.message; 전자 메일 메시지 표현: email message 전자 메일 메시지 표현. 
* email.parser; 전자 메일 메시지 구문 분석: email parser 전자 메일 메시지 구문 분석. 
* email.generator; MIME 문서 생성: email generator MIME 문서 생성. 
* email.policy; 정책 객체: email policy 정책 객체. 
* email.errors; 예외와 결함 클래스: email errors 예외와 결함 클래스. 
* email.headerregistry; 사용자 정의 헤더 객체: email headerregistry 사용자 정의 헤더 객체. 
* email.contentmanager; MIME 콘텐츠 관리: email contentmanager MIME 콘텐츠 관리. 
* email; 예제: email 예제. 
* email.message.Message; compat32 API를 사용하여 이메일 메시지 표현하기: email message Message compat32 API를 사용하여 이메일 메시지 표현하기. 
* email.mime; 처음부터 이메일과 MIME 객체 만들기: email mime 처음부터 이메일과 MIME 객체 만들기. 
* email.header; 국제화된 헤더: email header 국제화된 헤더. 
* email.charset; 문자 집합 표현: email charset 문자 집합 표현. 
* email.encoders; 인코더: email encoders 인코더. 
* email.utils; 기타 유틸리티: email utils 기타 유틸리티. 
* email.iterators; 이터레이터: email iterators 이터레이터. 

@end menu

@node email message 전자 메일 메시지 표현,email parser 전자 메일 메시지 구문 분석,,email — 전자 메일과 MIME 처리 패키지
@anchor{library/email message doc}@anchor{3aec}@anchor{library/email message email-message-representing-an-email-message}@anchor{3aed}@anchor{library/email message module-email message}@anchor{48}
@subsubsection @code{email.message}: 전자 메일 메시지 표현


@geindex module; email.message

`소스 코드:' Lib/email/message.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/email/message.py}


__________________________________________________________________



Added in version 3.6: @footnote{
원래 3.4에서 @ref{1241,,잠정 모듈}로 추가되었습니다. 레거시 메시지 클래스를 위한 설명서는 @ref{3aee,,email.message.Message; compat32 API를 사용하여 이메일 메시지 표현하기}로 옮겼습니다.
}


The central class in the @ref{3f,,email} package is the @ref{57f,,EmailMessage}
class, imported from the @code{email.message} module.  It is the base class for
the @code{email} object model.  @code{EmailMessage} provides the core
functionality for setting and querying header fields, for accessing message
bodies, and for creating or modifying structured messages.

전자 메일 메시지는 `헤더(headers)'와 `페이 로드(payload)'(`내용(content)'이라고도 합니다)로 구성됩니다. 헤더는 
@geindex RFC; RFC 5322
RFC 5322@footnote{https://datatracker.ietf.org/doc/html/rfc5322.html}나 
@geindex RFC; RFC 6532
RFC 6532@footnote{https://datatracker.ietf.org/doc/html/rfc6532.html} 스타일 필드 이름과 값이며, 필드 이름과 값은 콜론으로 구분됩니다. 콜론은 필드 이름이나 필드 값의 일부가 아닙니다. 페이 로드는 간단한 텍스트 메시지, 바이너리 객체 또는 각각 자신만의 헤더 집합과 자신만의 페이 로드를 갖는 서브 메시지들의 구조화된 시퀀스일 수 있습니다. 마지막 유형의 페이 로드는 @code{multipart/*}나 @code{message/rfc822}와 같은 MIME 유형을 가진 메시지로 표시됩니다.

@ref{57f,,EmailMessage} 객체가 제공하는 개념적 모델은 메시지의 
@geindex RFC; RFC 5322
RFC 5322@footnote{https://datatracker.ietf.org/doc/html/rfc5322.html} 본문을 나타내는 `payload'와 결합 된 헤더들의 순서 있는 딕셔너리이며, 본문은 서브-@code{EmailMessage} 객체의 리스트일 수 있습니다. 헤더 이름과 값에 액세스하기 위한 일반적인 딕셔너리 메서드 외에도, 헤더에서 특수 정보(예를 들어 MIME 콘텐츠 유형)에 액세스하고, 페이 로드를 다루고, 메시지의 직렬화된 버전을 생성하고, 객체 트리를 재귀적으로 탐색하는 메서드가 있습니다.

@ref{57f,,EmailMessage} 딕셔너리류 인터페이스는 ASCII 값이어야 하는 헤더 이름으로 인덱싱됩니다. 딕셔너리의 값은 몇 가지 추가 메서드가 있는 문자열입니다. 헤더는 대소 문자를 유지하면서 저장되고 반환되지만, 필드 이름은 대소 문자를 구분하지 않고 일치합니다. 키 순서가 있습니다. 하지만 실제 딕셔너리와 달리 중복된 키를 가질 수 있습니다. 중복 키가 있는 헤더로 작업하기 위한 추가 메서드가 제공됩니다.

`페이 로드'는 간단한 메시지 객체의 경우 문자열이나 바이트열 객체이고, @code{multipart/*}와 @code{message/rfc822} 메시지 객체와 같은 MIME 컨테이너 문서에서는 @ref{57f,,EmailMessage} 객체의 리스트입니다.

@geindex EmailMessage (email.message 클래스)
@anchor{library/email message email message EmailMessage}@anchor{57f}
@deffn {클래스} email.message.EmailMessage (policy=default)

If `policy' is specified use the rules it specifies to update and serialize
the representation of the message.  If `policy' is not set, use the
@ref{178d,,default} policy, which follows the rules of the email
RFCs except for line endings (instead of the RFC mandated @code{\r\n}, it uses
the Python standard @code{\n} line endings).  For more information see the
@ref{53,,policy} documentation. @footnote{
The @ref{57f,,EmailMessage} class requires a policy that provides a
@code{content_manager} attribute for content management methods like
@code{set_content()} and @code{get_content()} to work. The legacy
@ref{e96,,compat32} policy does not support these methods
and should not be used with @code{EmailMessage}.
}

@geindex as_string() (email.message.EmailMessage 메서드)
@anchor{library/email message email message EmailMessage as_string}@anchor{3aef}
@deffn {메서드} as_string (unixfrom=False, maxheaderlen=None, policy=None)

전체 메시지를 평평하게 만든 문자열을 반환합니다. 선택적 `unixfrom'이 참이면, 봉투 헤더(envelope header)가 반환된 문자열에 포함됩니다. `unixfrom'의 기본값은 @code{False}입니다. 베이스 @ref{580,,Message} 클래스와의 과거 호환성을 위해 `maxheaderlen'이 허용되지만, 기본값은 @code{None}이고, 이는 기본적으로 줄 길이가 정책의 @ref{3af0,,max_line_length}에 의해 제어됨을 의미합니다. `policy' 인자는 메시지 인스턴스에서 얻은 기본 정책을 대체하는 데 사용될 수 있습니다. 지정된 `policy'가 @ref{13d3,,Generator}로 전달되기 때문에, 메서드가 생성하는 포매팅의 일부를 제어하는 데 사용할 수 있습니다.

문자열로의 변환을 완료하기 위해 기본값을 채워야 하면 메시지를 평평하게 만들 때 @ref{57f,,EmailMessage}에 대한 변경이 발생할 수 있습니다 (예를 들어, MIME 경계(boundaries)가 생성되거나 수정될 수 있습니다).

이 메서드는 편의상 제공되며, 응용 프로그램에서 메시지를 직렬화하는 가장 유용한 방법은 아닐 수 있습니다, 특히 여러 메시지를 다룬다면 그렇습니다. 메시지 직렬화를 위한 더 유연한 API는 @ref{13d3,,email.generator.Generator}를 참조하십시오. 또한 이 메서드는 @ref{ff8,,utf8}가 @code{False}(기본값)일 때 “7비트 클린”으로 직렬화된 메시지를 생성하는 것으로 제한됩니다.


버전 3.6에서 변경: `maxheaderlen'이 지정되지 않았을 때의 기본 동작은 기본값을 0으로 하는 것에서 정책(policy)의 `max_line_length' 값을 기본값으로 사용하는 것으로 변경되었습니다.

@end deffn

@geindex __str__() (email.message.EmailMessage 메서드)
@anchor{library/email message email message EmailMessage __str__}@anchor{3af1}
@deffn {메서드} __str__ ()

@code{as_string(policy=self.policy.clone(utf8=True))}와 동등합니다. @code{str(msg)}가 직렬화된 메시지를 포함하는 문자열을 읽을 수 있는 형식으로 생성할 수 있도록 합니다.


버전 3.4에서 변경: 이 메서드는 @code{utf8=True}를 사용하도록 변경되어, @ref{3aef,,as_string()}의 직접적인 별칭인 대신, 
@geindex RFC; RFC 6531
RFC 6531@footnote{https://datatracker.ietf.org/doc/html/rfc6531.html}과 유사한 메시지 표현을 생성합니다.

@end deffn

@geindex as_bytes() (email.message.EmailMessage 메서드)
@anchor{library/email message email message EmailMessage as_bytes}@anchor{3af2}
@deffn {메서드} as_bytes (unixfrom=False, policy=None)

전체 메시지를 평평하게 만든 바이트열 객체를 반환합니다. 선택적 `unixfrom'이 참이면, 봉투 헤더(envelope header)가 반환된 문자열에 포함됩니다. `unixfrom'의 기본값은 @code{False}입니다. `policy' 인자는 메시지 인스턴스에서 얻은 기본 정책을 대체하는 데 사용될 수 있습니다. 지정된 `policy'가 @ref{13d4,,BytesGenerator}로 전달되기 때문에, 메서드가 생성하는 포매팅의 일부를 제어하는 데 사용할 수 있습니다.

문자열로의 변환을 완료하기 위해 기본값을 채워야 하면 메시지를 평평하게 만들 때 @ref{57f,,EmailMessage}에 대한 변경이 발생할 수 있습니다 (예를 들어, MIME 경계(boundaries)가 생성되거나 수정될 수 있습니다).

이 메서드는 편의상 제공되며, 응용 프로그램에서 메시지를 직렬화하는 가장 유용한 방법은 아닐 수 있습니다, 특히 여러 메시지를 다룬다면 그렇습니다. 메시지 직렬화를 위한 더 유연한 API는 @ref{13d4,,email.generator.BytesGenerator}를 참조하십시오.
@end deffn

@geindex __bytes__() (email.message.EmailMessage 메서드)
@anchor{library/email message email message EmailMessage __bytes__}@anchor{3af3}
@deffn {메서드} __bytes__ ()

@ref{3af2,,as_bytes()}와 동등합니다. @code{bytes(msg)}가 직렬화된 메시지를 포함하는 바이트열 객체를 생성할 수 있도록 합니다.
@end deffn

@geindex is_multipart() (email.message.EmailMessage 메서드)
@anchor{library/email message email message EmailMessage is_multipart}@anchor{3af4}
@deffn {메서드} is_multipart ()

메시지의 페이 로드가 서브-@ref{57f,,EmailMessage} 객체의 리스트면 @code{True}를, 그렇지 않으면 @code{False}를 반환합니다. @ref{3af4,,is_multipart()}가 @code{False}를 반환할 때, 페이 로드는 문자열 객체(CTE 인코딩된 바이너리 페이 로드일 수 있습니다)여야 합니다. @code{True}를 반환하는 @code{is_multipart()}가 반드시 “msg.get_content_maintype() == ‘multipart‘“가 @code{True}를 반환한다는 것을 의미하지는 않습니다. 예를 들어, @code{EmailMessage}가 @code{message/rfc822} 유형일 때 @code{is_multipart}는 @code{True}를 반환합니다.
@end deffn

@geindex set_unixfrom() (email.message.EmailMessage 메서드)
@anchor{library/email message email message EmailMessage set_unixfrom}@anchor{3af5}
@deffn {메서드} set_unixfrom (unixfrom)

메시지의 봉투 헤더(envelope header)를 문자열이어야 하는 `unixfrom'으로 설정합니다. (이 헤더에 대한 간단한 설명은 @ref{3af6,,mboxMessage}를 참조하십시오.)
@end deffn

@geindex get_unixfrom() (email.message.EmailMessage 메서드)
@anchor{library/email message email message EmailMessage get_unixfrom}@anchor{3af7}
@deffn {메서드} get_unixfrom ()

메시지의 봉투 헤더(envelope header)를 반환합니다. 봉투 헤더가 설정되지 않았으면 기본값은 @code{None}입니다.
@end deffn

다음 메서드는 메시지 헤더에 액세스하기 위한 매핑류 인터페이스를 구현합니다. 이 메서드들과 일반 매핑(즉, 딕셔너리) 인터페이스 사이에는 의미상 차이가 있습니다. 예를 들어, 딕셔너리에는 중복 키가 없지만, 여기서는 중복 메시지 헤더가 있을 수 있습니다. 또한 딕셔너리에서는 @ref{3af8,,keys()}가 반환한 키의 순서가 보장되지 않지만, @ref{57f,,EmailMessage} 객체에서는 헤더가 항상 원래 메시지에 나타난 순서대로, 또는 나중에 메시지에 추가된 순서대로 반환됩니다. 삭제한 후 다시 추가된 헤더는 항상 헤더 리스트의 끝에 추가됩니다.

이러한 의미적 차이는 의도적이며 가장 흔한 사용 사례에서의 편의를 추구하는 쪽으로 기울어져 있습니다.

모든 경우에, 메시지에 존재하는 봉투 헤더는 매핑 인터페이스에 포함되지 않습니다.

@geindex __len__() (email.message.EmailMessage 메서드)
@anchor{library/email message email message EmailMessage __len__}@anchor{3af9}
@deffn {메서드} __len__ ()

중복을 포함하여, 총 헤더 수를 반환합니다.
@end deffn

@geindex __contains__() (email.message.EmailMessage 메서드)
@anchor{library/email message email message EmailMessage __contains__}@anchor{3afa}
@deffn {메서드} __contains__ (name)

메시지 객체에 `name'이라는 필드가 있으면 @code{True}를 반환합니다. 대소 문자를 구분하지 않고 일치하며, `name'은 후행 콜론을 포함하지 않습니다. @code{in} 연산자에 사용됩니다. 예를 들면:

@example
if 'message-id' in myMessage:
   print('Message-ID:', myMessage['message-id'])
@end example
@end deffn

@geindex __getitem__() (email.message.EmailMessage 메서드)
@anchor{library/email message email message EmailMessage __getitem__}@anchor{3afb}
@deffn {메서드} __getitem__ (name)

이름으로 지정된 헤더 필드의 값을 반환합니다. `name'은 콜론 필드 구분자를 포함하지 않습니다. 헤더가 없으면 @code{None}이 반환됩니다; @ref{5e5,,KeyError}가 발생하지 않습니다.

이름이 지정된 필드가 메시지 헤더에 두 번 이상 나타나면, 해당 필드 값 중 정확히 어떤 필드 값이 반환되는지 정의되지 않습니다. @ref{3afc,,get_all()} 메서드를 사용하여 `name'으로 이름이 지정된 모든 기존 헤더의 값을 가져오십시오.

표준 (@code{compat32}가 아닌) 정책을 사용하여, 반환된 값은 @ref{3afd,,email.headerregistry.BaseHeader}의 서브 클래스 인스턴스입니다.
@end deffn

@geindex __setitem__() (email.message.EmailMessage 메서드)
@anchor{library/email message email message EmailMessage __setitem__}@anchor{3afe}
@deffn {메서드} __setitem__ (name, val)

필드 이름이 `name'이고 값이 `val'인 헤더를 메시지에 추가합니다. 필드는 메시지의 기존 헤더들 끝에 추가됩니다.

같은 이름을 가진 기존 헤더를 덮어쓰거나 삭제하지 `않습니다'. 새 헤더가 메시지에서 필드 이름이 `name'인 유일한 것이 되도록 하려면, 먼저 필드를 삭제하십시오. 예를 들어:

@example
del msg['subject']
msg['subject'] = 'Python roolz!'
@end example

@ref{53,,정책}이 (표준 정책에서처럼) 특정 헤더를 고유한(unique) 것으로 정의하면, 이 메서드는 헤더가 이미 존재할 때 해당 헤더에 값을 할당하려고 시도하면 @ref{2ec,,ValueError}를 발생시킬 수 있습니다. 이 동작은 일관성을 위해 의도적이지만, 향후 이러한 대입이 기존 헤더를 자동으로 삭제하도록 선택할 수 있기 때문에, 이것에 의존하지 마십시오.
@end deffn

@geindex __delitem__() (email.message.EmailMessage 메서드)
@anchor{library/email message email message EmailMessage __delitem__}@anchor{3aff}
@deffn {메서드} __delitem__ (name)

메시지 헤더에서 이름이 `name'인 모든 필드를 삭제합니다. 해당 이름의 필드가 헤더에 없어도 예외가 발생하지 않습니다.
@end deffn

@geindex keys() (email.message.EmailMessage 메서드)
@anchor{library/email message email message EmailMessage keys}@anchor{3af8}
@deffn {메서드} keys ()

메시지의 모든 헤더 필드 이름의 리스트를 반환합니다.
@end deffn

@geindex values() (email.message.EmailMessage 메서드)
@anchor{library/email message email message EmailMessage values}@anchor{3b00}
@deffn {메서드} values ()

메시지의 모든 필드 값의 리스트를 반환합니다.
@end deffn

@geindex items() (email.message.EmailMessage 메서드)
@anchor{library/email message email message EmailMessage items}@anchor{3b01}
@deffn {메서드} items ()

메시지의 모든 필드 헤더와 값을 담은 2-튜플의 리스트를 반환합니다.
@end deffn

@geindex get() (email.message.EmailMessage 메서드)
@anchor{library/email message email message EmailMessage get}@anchor{3b02}
@deffn {메서드} get (name, failobj=None)

명명된 헤더 필드의 값을 반환합니다. 명명된 헤더가 없을 때 선택적 `failobj'가 반환된다는 점을 제외하면 @ref{588,,__getitem__()}와 같습니다 (`failobj'의 기본값은 @code{None}).
@end deffn

추가적인 유용한 헤더 관련 메서드는 다음과 같습니다:

@geindex get_all() (email.message.EmailMessage 메서드)
@anchor{library/email message email message EmailMessage get_all}@anchor{3afc}
@deffn {메서드} get_all (name, failobj=None)

`name'으로 명명된 필드의 모든 값의 리스트를 반환합니다. 메시지에 그런 이름의 헤더가 없으면 `failobj'가 반환됩니다 (기본값은 @code{None}).
@end deffn

@geindex add_header() (email.message.EmailMessage 메서드)
@anchor{library/email message email message EmailMessage add_header}@anchor{3b03}
@deffn {메서드} add_header (_name, _value, **_params)

확장된 헤더 설정. 이 메서드는 추가 헤더 파라미터가 키워드 인자로 제공될 수 있다는 점을 제외하고는 @ref{3afe,,__setitem__()}과 유사합니다. `_name'은 추가할 헤더 필드이고 `_value'는 헤더의 `기본(primary)'값입니다.

키워드 인자 딕셔너리 `_params'의 각 항목에 대해, 키는 파라미터 이름으로 사용되며 밑줄은 대시로 변환됩니다 (대시는 파이썬 식별자에서 유효하지 않기 때문입니다). 일반적으로, 값이 @code{None}이 아니면 파라미터가 @code{key="value"}로 추가되며, None이면 키만 추가됩니다.

값에 ASCII가 아닌 문자가 포함되면, 값을 @code{(CHARSET, LANGUAGE, VALUE)} 형식의 3-튜플로 지정하여 문자 집합과 언어를 명시적으로 제어 할 수 있습니다. 여기서 @code{CHARSET}은 값을 인코딩하는 데 사용할 문자 집합의 이름을 지정하는 문자열이고, @code{LANGUAGE}는 보통 @code{None}이나 빈 문자열(다른 가능성은 
@geindex RFC; RFC 2231
RFC 2231@footnote{https://datatracker.ietf.org/doc/html/rfc2231.html}을 참조하십시오)로 설정되고, @code{VALUE}는 비 ASCII 코드 포인트를 포함하는 문자열 값입니다. 3-튜플이 전달되지 않고 값에 ASCII가 아닌 문자가 포함되면, @code{CHARSET}으로 @code{utf-8}, @code{LANGUAGE}로 @code{None}을 사용하여 
@geindex RFC; RFC 2231
RFC 2231@footnote{https://datatracker.ietf.org/doc/html/rfc2231.html} 형식으로 자동 인코딩됩니다.

예를 들면 다음과 같습니다:

@example
msg.add_header('Content-Disposition', 'attachment', filename='bud.gif')
@end example

이것은 다음과 같은 헤더를 추가합니다

@example
Content-Disposition: attachment; filename="bud.gif"
@end example

비 ASCII 문자가 있는 확장 인터페이스의 예:

@example
msg.add_header('Content-Disposition', 'attachment',
               filename=('iso-8859-1', '@w{'}, 'Fußballer.ppt'))
@end example
@end deffn

@geindex replace_header() (email.message.EmailMessage 메서드)
@anchor{library/email message email message EmailMessage replace_header}@anchor{3b04}
@deffn {메서드} replace_header (_name, _value)

헤더를 교체합니다. 메시지에서 발견된 `_name'과 일치하는 첫 번째 헤더를 교체하고, 원래 헤더의 헤더 순서와 필드 이름 케이스(case)를 유지합니다. 일치하는 헤더가 없으면 @ref{5e5,,KeyError}를 발생시킵니다.
@end deffn

@geindex get_content_type() (email.message.EmailMessage 메서드)
@anchor{library/email message email message EmailMessage get_content_type}@anchor{3b05}
@deffn {메서드} get_content_type ()

@code{maintype/subtype} 형식의 소문자로 강제 변환된 메시지의 콘텐츠 유형을 반환합니다. 메시지에 @code{Content-Type} 헤더가 없으면 @ref{3b06,,get_default_type()}이 반환하는 값을 반환합니다. @code{Content-Type} 헤더가 유효하지 않으면 @code{text/plain}을 반환합니다.

(
@geindex RFC; RFC 2045
RFC 2045@footnote{https://datatracker.ietf.org/doc/html/rfc2045.html}에 따라, 메시지는 항상 기본 유형을 가지며, @ref{3b05,,get_content_type()}은 항상 값을 반환합니다. 
@geindex RFC; RFC 2045
RFC 2045@footnote{https://datatracker.ietf.org/doc/html/rfc2045.html}는 @code{multipart/digest} 컨테이너 내에 등장하면 기본 유형이 @code{message/rfc822}이고, 그렇지 않으면 기본 유형을 @code{text/plain}으로 정의합니다. @code{Content-Type} 헤더가 유효하지 않은 유형 지정이면, 
@geindex RFC; RFC 2045
RFC 2045@footnote{https://datatracker.ietf.org/doc/html/rfc2045.html}는 기본 유형을 @code{text/plain}으로 강제합니다.)
@end deffn

@geindex get_content_maintype() (email.message.EmailMessage 메서드)
@anchor{library/email message email message EmailMessage get_content_maintype}@anchor{3b07}
@deffn {메서드} get_content_maintype ()

메시지의 메인 콘텐츠 유형을 반환합니다. 이것은 @ref{3b05,,get_content_type()}이 반환한 문자열의 @code{maintype} 부분입니다.
@end deffn

@geindex get_content_subtype() (email.message.EmailMessage 메서드)
@anchor{library/email message email message EmailMessage get_content_subtype}@anchor{3b08}
@deffn {메서드} get_content_subtype ()

메시지의 서브 콘텐츠 유형을 반환합니다. 이것은 @ref{3b05,,get_content_type()}이 반환한 문자열의 @code{subtype} 부분입니다.
@end deffn

@geindex get_default_type() (email.message.EmailMessage 메서드)
@anchor{library/email message email message EmailMessage get_default_type}@anchor{3b06}
@deffn {메서드} get_default_type ()

기본 콘텐츠 유형을 반환합니다. @code{multipart/digest} 컨테이너의 서브 파트인 메시지를 제외하고 대부분의 메시지는 기본 콘텐츠 유형이 @code{text/plain}입니다. 이러한 서브 파트는 기본 콘텐츠 유형이 @code{message/rfc822}입니다.
@end deffn

@geindex set_default_type() (email.message.EmailMessage 메서드)
@anchor{library/email message email message EmailMessage set_default_type}@anchor{3b09}
@deffn {메서드} set_default_type (ctype)

기본 콘텐츠 유형을 설정합니다. `ctype'은 @code{text/plain}이나 @code{message/rfc822}여야 하지만, 이것을 강제하지는 않습니다. 기본 콘텐츠 유형은 @code{Content-Type} 헤더에 저장되지 않기 때문에, 메시지에 @code{Content-Type} 헤더가 없을 때 @code{get_content_type} 메서드의 반환 값에만 영향을 줍니다.
@end deffn

@geindex set_param() (email.message.EmailMessage 메서드)
@anchor{library/email message email message EmailMessage set_param}@anchor{3b0a}
@deffn {메서드} set_param (param, value, header='Content-Type', requote=True, charset=None, language='@w{'}, replace=False)

@code{Content-Type} 헤더에 파라미터를 설정합니다. 파라미터가 이미 헤더에 존재하면, 해당 값을 `value'로 바꿉니다. `header'가 @code{Content-Type}(기본값)이고 헤더가 메시지에 아직 없으면, 헤더를 추가하고 값을 @code{text/plain}으로 설정한 다음 새 파라미터 값을 추가합니다. 선택적 `header'는 @code{Content-Type}의 대체 헤더를 지정합니다.

값에 ASCII가 아닌 문자가 포함되면, 선택적 `charset'과 `language' 매개 변수를 사용하여 문자 집합과 언어를 명시적으로 지정할 수 있습니다. 선택적 `language'는 
@geindex RFC; RFC 2231
RFC 2231@footnote{https://datatracker.ietf.org/doc/html/rfc2231.html} 언어를 지정하며, 기본값은 빈 문자열입니다. `charset'과 `language'는 모두 문자열이어야 합니다. 기본값은 @code{utf8} `charset'과 @code{None} `language'를 사용하는 것입니다.

`replace'가 @code{False}(기본값)이면 헤더는 헤더 리스트의 끝으로 이동합니다. `replace'가 @code{True}이면, 헤더는 제자리에서 갱신됩니다.

@ref{57f,,EmailMessage} 객체에 `requote' 매개 변수를 사용하는 것은 폐지되었습니다.

헤더의 기존 파라미터값은 헤더 값의 @ref{3b0b,,params} 어트리뷰트를 통해 액세스 할 수 있음에 유의하십시오 (예를 들어, @code{msg['Content-Type'].params['charset']}).


버전 3.4에서 변경: @code{replace} 키워드가 추가되었습니다.

@end deffn

@geindex del_param() (email.message.EmailMessage 메서드)
@anchor{library/email message email message EmailMessage del_param}@anchor{3b0c}
@deffn {메서드} del_param (param, header='content-type', requote=True)

@code{Content-Type} 헤더에서 지정된 파라미터를 완전히 제거합니다. 헤더는 해당 파라미터나 그 값 없이 제자리에서 다시 작성됩니다. 선택적 `header'는 @code{Content-Type}의 대체 헤더를 지정합니다.

@ref{57f,,EmailMessage} 객체에 `requote' 매개 변수를 사용하는 것은 폐지되었습니다.
@end deffn

@geindex get_filename() (email.message.EmailMessage 메서드)
@anchor{library/email message email message EmailMessage get_filename}@anchor{3b0d}
@deffn {메서드} get_filename (failobj=None)

메시지의 @code{Content-Disposition} 헤더의 @code{filename} 파라미터값을 반환합니다. 헤더에 @code{filename} 파라미터가 없으면, 이 메서드는 @code{Content-Type} 헤더에서 @code{name} 파라미터를 찾는 것으로 폴백(fallback)합니다. 둘 다 없거나 헤더가 없으면, `failobj'가 반환됩니다. 반환된 문자열은 항상 @ref{3b0e,,email.utils.unquote()}에 따라 unquote 됩니다.
@end deffn

@geindex get_boundary() (email.message.EmailMessage 메서드)
@anchor{library/email message email message EmailMessage get_boundary}@anchor{3b0f}
@deffn {메서드} get_boundary (failobj=None)

메시지의 @code{Content-Type} 헤더의 @code{boundary} 파라미터값, 또는 헤더가 없거나 @code{boundary} 파라미터가 없으면 `failobj'를 반환합니다. 반환된 문자열은 항상 @ref{3b0e,,email.utils.unquote()}에 따라 unquote 됩니다.
@end deffn

@geindex set_boundary() (email.message.EmailMessage 메서드)
@anchor{library/email message email message EmailMessage set_boundary}@anchor{3b10}
@deffn {메서드} set_boundary (boundary)

@code{Content-Type} 헤더의 @code{boundary} 파라미터를 `boundary'로 설정합니다. 필요하면 @ref{3b10,,set_boundary()}는 항상 `boundary'를 quote 합니다. 메시지 객체에 @code{Content-Type} 헤더가 없으면 @ref{3b11,,HeaderParseError}가 발생합니다.

@ref{3b10,,set_boundary()}가 헤더 리스트에서 @code{Content-Type} 헤더의 순서를 유지하기 때문에, 이 메서드를 사용하는 것은 이전 @code{Content-Type} 헤더를 삭제하고 @ref{3b03,,add_header()}를 통해 새 boundary로 새 헤더를 추가하는 것과는 미묘한 차이가 있음에 유의하십시오.
@end deffn

@geindex get_content_charset() (email.message.EmailMessage 메서드)
@anchor{library/email message email message EmailMessage get_content_charset}@anchor{3b12}
@deffn {메서드} get_content_charset (failobj=None)

@code{Content-Type} 헤더의 @code{charset} 파라미터를 소문자로 강제 변환하여 반환합니다. @code{Content-Type} 헤더가 없거나 헤더에 @code{charset} 파라미터가 없으면 `failobj'가 반환됩니다.
@end deffn

@geindex get_charsets() (email.message.EmailMessage 메서드)
@anchor{library/email message email message EmailMessage get_charsets}@anchor{3b13}
@deffn {메서드} get_charsets (failobj=None)

메시지 내의 문자 집합 이름들을 포함하는 리스트를 반환합니다. 메시지가 @code{multipart}이면, 리스트는 페이 로드의 각 서브 파트마다 하나의 요소를 포함하며, 그렇지 않으면 길이 1인 리스트가 됩니다.

리스트의 각 항목은 표현된 서브 파트에 대한 @code{Content-Type} 헤더의 @code{charset} 파라미터의 값인 문자열입니다. 서브 파트에 @code{Content-Type} 헤더가 없거나, @code{charset} 파라미터가 없거나, @code{text} 메인 MIME 유형이 아니면, 반환된 리스트의 해당 항목은 `failobj'입니다.
@end deffn

@geindex is_attachment() (email.message.EmailMessage 메서드)
@anchor{library/email message email message EmailMessage is_attachment}@anchor{3b14}
@deffn {메서드} is_attachment ()

@code{Content-Disposition} 헤더가 있고 (대소 문자를 구분하지 않는) 값이 @code{attachment}이면 @code{True}를, 그렇지 않으면 @code{False}를 반환합니다.


버전 3.4.2에서 변경: @ref{3b15,,is_multipart()}와 일관성을 유지하기 위해, is_attachment는 이제 프로퍼티 대신 메서드입니다.

@end deffn

@geindex get_content_disposition() (email.message.EmailMessage 메서드)
@anchor{library/email message email message EmailMessage get_content_disposition}@anchor{3b16}
@deffn {메서드} get_content_disposition ()

메시지의 @code{Content-Disposition} 헤더가 있으면 소문자로 변환된 (파라미터 없는) 값을, 그렇지 않으면 @code{None}을 반환합니다. 메시지가 
@geindex RFC; RFC 2183
RFC 2183@footnote{https://datatracker.ietf.org/doc/html/rfc2183.html}을 따르면, 이 메서드의 가능한 값은 `inline', `attachment' 또는 @code{None}입니다.


Added in version 3.5.

@end deffn

다음 메서드는 메시지의 내용(페이 로드)을 조사하고 조작하는 것과 관련이 있습니다.

@geindex walk() (email.message.EmailMessage 메서드)
@anchor{library/email message email message EmailMessage walk}@anchor{3b17}
@deffn {메서드} walk ()

@ref{3b17,,walk()} 메서드는 메시지 객체 트리의 모든 파트와 서브 파트를 깊이 우선 탐색 순서로 이터레이트 하는 데 사용할 수 있는 범용 제너레이터입니다. 일반적으로 @code{walk()}를 @code{for} 루프에서 이터레이터로 사용합니다; 각 이터레이션은 다음 서브 파트를 반환합니다.

다음은 멀티 파트 메시지 구조의 모든 파트의 MIME 유형을 인쇄하는 예입니다:

@c from email import message_from_binary_file
@c with open('../Lib/test/test_email/data/msg_16.txt', 'rb') as f:
@c     msg = message_from_binary_file(f)

@example
>>> for part in msg.walk():
...     print(part.get_content_type())
multipart/report
text/plain
message/delivery-status
text/plain
text/plain
message/rfc822
text/plain
@end example

@code{msg.get_content_maintype() == 'multipart'}가 @code{False}를 반환하더라도, @code{walk}는 @ref{3af4,,is_multipart()}가 @code{True}를 반환하는 모든 파트의 서브 파트를 이터레이트 합니다. @code{_structure} 디버그 도우미 함수를 사용하여 예제에서 이를 확인할 수 있습니다:

@example
>>> from email.iterators import _structure
>>> for part in msg.walk():
...     print(part.get_content_maintype() == 'multipart',
...           part.is_multipart())
True True
False False
False True
False False
False False
False True
False False
>>> _structure(msg)
multipart/report
    text/plain
    message/delivery-status
        text/plain
        text/plain
    message/rfc822
        text/plain
@end example

여기서 @code{message} 파트는 @code{multiparts}는 아니지만, 서브 파트를 포함합니다. @code{is_multipart()}는 @code{True}를 반환하고 @code{walk}는 서브 파트로 내려갑니다.
@end deffn

@geindex get_body() (email.message.EmailMessage 메서드)
@anchor{library/email message email message EmailMessage get_body}@anchor{3b18}
@deffn {메서드} get_body (preferencelist=('related', 'html', 'plain'))

메시지의 “본문”이 될 수 있는 가장 적합한 후보인 MIME 파트를 반환합니다.

`preferencelist'는 @code{related}, @code{html} 및 @code{plain} 집합의 문자열 시퀀스이어야 하며, 반환된 파트의 콘텐츠 유형에 대한 선호 순서를 나타냅니다.

@code{get_body} 메서드가 호출된 객체와 일치하는 후보를 찾기 시작합니다.

@code{related}가 `preferencelist'에 포함되지 않으면, (서브) 파트가 선호와 일치하면 후보로 만난 모든 관련(related)의 루트 파트(또는 루트 파트의 서브 파트)를 고려합니다.

@code{multipart/related}와 만날 때, @code{start} 파라미터를 확인하고 일치하는 @code{Content-ID}가 있는 파트를 발견하면, 일치하는 후보를 찾을 때만 고려합니다. 그렇지 않으면 @code{multipart/related}의 첫 번째 (기본 루트) 파트만 고려합니다.

파트에 @code{Content-Disposition} 헤더가 있으면, 헤더 값이 @code{inline}일 때만 해당 파트를 후보로 간주합니다.

`preferencelist'의 선호 어느 것과도 일치하는 후보가 없으면, @code{None}을 반환합니다.

참고: (1) 대부분의 응용 프로그램에서 실제로 의미가 있는 `preferencelist' 조합은 @code{('plain',)}, @code{('html', 'plain')} 및 기본 @code{('related', 'html', 'plain')}뿐입니다. (2) @code{get_body}가 호출되는 객체에서 일치가 시작되므로, `preferencelist'가 기본값이면 @code{multipart/related}에서 @code{get_body}를 호출하면 객체 자신을 반환합니다. (3) @code{Content-Type}을 지정하지 않거나 @code{Content-Type} 헤더가 유효하지 않은 메시지(또는 메시지 파트)는 마치 @code{text/plain} 유형인 것처럼 처리되어, 간혹 @code{get_body}가 예기치 않은 결과를 반환하도록 합니다.
@end deffn

@geindex iter_attachments() (email.message.EmailMessage 메서드)
@anchor{library/email message email message EmailMessage iter_attachments}@anchor{3b19}
@deffn {메서드} iter_attachments ()

“본문” 파트 후보가 아닌 메시지의 모든 직접적인 서브 파트에 대한 이터레이터를 반환합니다. 즉, @code{text/plain}, @code{text/html}, @code{multipart/related} 또는 @code{multipart/alternative} 각각의 첫 번째 등장을 건너뛰고 (@code{Content-Disposition: attachment}를 통해 첨부 파일로 명시적으로 표시되지 않은 한), 나머지 모든 파트를 반환합니다. @code{multipart/related}에 직접 적용될 때, 루트 파트(즉: @code{start} 파라미터가 가리키는 파트나 @code{start} 파라미터가 없거나 @code{start} 파라미터가 파트들의 @code{Content-ID}와 일치하지 않으면 첫 번째 파트)를 제외한 모든 관련 파트에 대한 이터레이터를 반환합니다. @code{multipart/alternative} 또는 비-@code{multipart}에 직접 적용되면 빈 이터레이터를 반환합니다.
@end deffn

@geindex iter_parts() (email.message.EmailMessage 메서드)
@anchor{library/email message email message EmailMessage iter_parts}@anchor{3b1a}
@deffn {메서드} iter_parts ()

메시지의 모든 직계 서브 파트에 대한 이터레이터를 반환합니다. @code{multipart}가 아니면 비어있게 됩니다. (@ref{3b17,,walk()}도 참조하십시오.)
@end deffn

@geindex get_content() (email.message.EmailMessage 메서드)
@anchor{library/email message email message EmailMessage get_content}@anchor{3b1b}
@deffn {메서드} get_content (*args, content_manager=None, **kw)

`content_manager'의 @ref{3b1c,,get_content()} 메서드를 호출합니다. 추가 인자로 제공되는 인자나 키워드와 함께 self를 메시지 객체로 전달합니다. `content_manager'가 지정되지 않으면, 현재 @ref{53,,policy}가 지정하는 @code{content_manager}를 사용합니다.
@end deffn

@geindex set_content() (email.message.EmailMessage 메서드)
@anchor{library/email message email message EmailMessage set_content}@anchor{1c5b}
@deffn {메서드} set_content (*args, content_manager=None, **kw)

`content_manager'의 @ref{3b1d,,set_content()} 메서드를 호출합니다. 추가 인자로 제공되는 인자나 키워드와 함께 self를 메시지 객체로 전달합니다. `content_manager'가 지정되지 않으면, 현재 @ref{53,,policy}가 지정하는 @code{content_manager}를 사용합니다.
@end deffn

@geindex make_related() (email.message.EmailMessage 메서드)
@anchor{library/email message email message EmailMessage make_related}@anchor{3b1e}
@deffn {메서드} make_related (boundary=None)

비 @code{multipart} 메시지를 @code{multipart/related} 메시지로 변환합니다. 기존 @code{Content-} 헤더와 페이 로드를 @code{multipart}의 (새로운) 첫 파트로 옮깁니다. `boundary'가 지정되면, multipart에서 경계 문자열로 사용하고, 그렇지 않으면 필요할 때 (예를 들어, 메시지가 직렬화될 때) 경계가 자동으로 만들어지도록 둡니다.
@end deffn

@geindex make_alternative() (email.message.EmailMessage 메서드)
@anchor{library/email message email message EmailMessage make_alternative}@anchor{3b1f}
@deffn {메서드} make_alternative (boundary=None)

비 @code{multipart}나 @code{multipart/related}를 @code{multipart/alternative}로 변환합니다. 기존 @code{Content-} 헤더와 페이 로드를 @code{multipart}의 (새로운) 첫 파트로 옮깁니다. `boundary'가 지정되면, multipart에서 경계 문자열로 사용하고, 그렇지 않으면 필요할 때 (예를 들어, 메시지가 직렬화될 때) 경계가 자동으로 만들어지도록 둡니다.
@end deffn

@geindex make_mixed() (email.message.EmailMessage 메서드)
@anchor{library/email message email message EmailMessage make_mixed}@anchor{3b20}
@deffn {메서드} make_mixed (boundary=None)

비 @code{multipart}, @code{multipart/related} 또는 @code{multipart-alternative}를 @code{multipart/mixed}로 변환합니다. 기존 @code{Content-} 헤더와 페이 로드를 @code{multipart}의 (새로운) 첫 파트로 옮깁니다. `boundary'가 지정되면, multipart에서 경계 문자열로 사용하고, 그렇지 않으면 필요할 때 (예를 들어, 메시지가 직렬화될 때) 경계가 자동으로 만들어지도록 둡니다.
@end deffn

@geindex add_related() (email.message.EmailMessage 메서드)
@anchor{library/email message email message EmailMessage add_related}@anchor{3b21}
@deffn {메서드} add_related (*args, content_manager=None, **kw)

메시지가 @code{multipart/related}이면, 새 메시지 객체를 만들고, 모든 인자를 그것의 @ref{1c5b,,set_content()} 메서드에 전달하고, 그것을 @code{multipart}에 @ref{3b22,,attach()}합니다. 메시지가 @code{multipart}가 아니면, @ref{3b1e,,make_related()}를 호출한 다음 위에서처럼 진행합니다. 메시지가 다른 유형의 @code{multipart}이면, @ref{198,,TypeError}를 발생시킵니다. `content_manager'가 지정되지 않으면, 현재 @ref{53,,policy}가 지정하는 @code{content_manager}를 사용합니다. 추가된 파트에 @code{Content-Disposition} 헤더가 없으면, 값 @code{inline}으로 추가합니다.
@end deffn

@geindex add_alternative() (email.message.EmailMessage 메서드)
@anchor{library/email message email message EmailMessage add_alternative}@anchor{3b23}
@deffn {메서드} add_alternative (*args, content_manager=None, **kw)

메시지가 @code{multipart/alternative}이면, 새 메시지 객체를 만들고, 모든 인자를 그것의 @ref{1c5b,,set_content()} 메서드에 전달하고, 그것을 @code{multipart}에 @ref{3b22,,attach()}합니다. 메시지가 @code{multipart}가 아니거나 @code{multipart/related}이면, @ref{3b1f,,make_alternative()}를 호출한 다음 위에서처럼 진행합니다. 메시지가 다른 유형의 @code{multipart}이면, @ref{198,,TypeError}를 발생시킵니다. `content_manager'가 지정되지 않으면, 현재 @ref{53,,policy}가 지정하는 @code{content_manager}를 사용합니다.
@end deffn

@geindex add_attachment() (email.message.EmailMessage 메서드)
@anchor{library/email message email message EmailMessage add_attachment}@anchor{3b24}
@deffn {메서드} add_attachment (*args, content_manager=None, **kw)

메시지가 @code{multipart/mixed}이면, 새 메시지 객체를 만들고, 모든 인자를 그것의 @ref{1c5b,,set_content()} 메서드에 전달하고, 그것을 @code{multipart}에 @ref{3b22,,attach()}합니다. 메시지가 @code{multipart}가 아니거나, @code{multipart/related}나 @code{multipart/alternative}이면, @ref{3b20,,make_mixed()}를 호출한 다음 위에서처럼 진행합니다. `content_manager'가 지정되지 않으면, 현재 @ref{53,,policy}가 지정하는 @code{content_manager}를 사용합니다. 추가된 파트에 @code{Content-Disposition} 헤더가 없으면, 값 @code{attachment}로 추가합니다. 이 메서드는 @code{content_manager}에 적절한 옵션을 전달하여 명시적 첨부(@code{Content-Disposition: attachment})와 @code{inline} 첨부(@code{Content-Disposition: inline})에 모두 사용할 수 있습니다.
@end deffn

@geindex clear() (email.message.EmailMessage 메서드)
@anchor{library/email message email message EmailMessage clear}@anchor{3b25}
@deffn {메서드} clear ()

페이 로드와 모든 헤더를 제거합니다.
@end deffn

@geindex clear_content() (email.message.EmailMessage 메서드)
@anchor{library/email message email message EmailMessage clear_content}@anchor{3b26}
@deffn {메서드} clear_content ()

페이 로드와 모든 @code{!Content-} 헤더를 제거하고, 다른 모든 헤더는 원래 순서대로 그대로 둡니다.
@end deffn

@ref{57f,,EmailMessage} 객체에는 다음과 같은 인스턴스 어트리뷰트가 있습니다:

@geindex preamble (email.message.EmailMessage의 속성)
@anchor{library/email message email message EmailMessage preamble}@anchor{3b27}
@deffn {속성} preamble

MIME 문서의 형식은 헤더 다음의 빈 줄과 첫 번째 멀티 파트 경계 문자열 사이에 어떤 텍스트를 허용합니다. 일반적으로 이 텍스트는 표준 MIME 방어구를 벗어나기 때문에 MIME을 인식하는 메일 리더에서 보이지 않습니다. 그러나, 메시지의 원시 텍스트를 보거나, MIME을 인식하지 않는 리더에서 메시지를 볼 때 이 텍스트가 나타날 수 있습니다.

`preamble' 어트리뷰트는 MIME 문서에 있는 이 선행 방어구 밖 텍스트를 포함합니다. @ref{13a2,,Parser}가 헤더 다음이지만 첫 번째 경계 문자열 이전에 있는 어떤 텍스트를 발견하면, 이 텍스트를 메시지의 `preamble' 어트리뷰트에 대입합니다. @ref{13d3,,Generator}가 MIME 메시지의 일반 텍스트(plain text) 표현을 기록할 때, 메시지가 `preamble' 어트리뷰트를 가진 것을 발견하면, 헤더와 첫 번째 경계 사이의 영역에 이 텍스트를 씁니다. 자세한 내용은 @ref{52,,email.parser}와 @ref{44,,email.generator}를 참조하십시오.

메시지 객체에 preamble이 없으면, `preamble' 어트리뷰트는 @code{None}입니다.
@end deffn

@geindex epilogue (email.message.EmailMessage의 속성)
@anchor{library/email message email message EmailMessage epilogue}@anchor{3b28}
@deffn {속성} epilogue

`epilogue' 어트리뷰트는 메시지의 마지막 경계와 끝 사이에 나타나는 텍스트를 포함한다는 점을 제외하고 `preamble' 어트리뷰트와 같은 방식으로 작동합니다. @ref{3b27,,preamble}과 마찬가지로 epilog 텍스트가 없으면, 이 어트리뷰트는 @code{None}입니다.
@end deffn

@geindex defects (email.message.EmailMessage의 속성)
@anchor{library/email message email message EmailMessage defects}@anchor{3b29}
@deffn {속성} defects

`defects' 어트리뷰트는 이 메시지를 구문 분석할 때 발견된 모든 문제점의 리스트를 포함합니다. 가능한 구문 분석 결함에 대한 자세한 설명은 @ref{43,,email.errors}를 참조하십시오.
@end deffn
@end deffn

@geindex MIMEPart (email.message 클래스)
@anchor{library/email message email message MIMEPart}@anchor{1139}
@deffn {클래스} email.message.MIMEPart (policy=default)

이 클래스는 MIME 메시지의 서브 파트를 나타냅니다. 서브 파트에는 자체 @code{MIME-Version} 헤더가 필요하지 않아서, @ref{1c5b,,set_content()}를 호출할 때 @code{MIME-Version} 헤더가 추가되지 않는다는 점을 제외하면 @ref{57f,,EmailMessage}와 같습니다.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node email parser 전자 메일 메시지 구문 분석,email generator MIME 문서 생성,email message 전자 메일 메시지 표현,email — 전자 메일과 MIME 처리 패키지
@anchor{library/email parser doc}@anchor{3b2a}@anchor{library/email parser email-parser-parsing-email-messages}@anchor{3b2b}@anchor{library/email parser module-email parser}@anchor{52}@anchor{library/email parser translation-repo}@anchor{3b2c}
@subsubsection @code{email.parser}: 전자 메일 메시지 구문 분석


@geindex module; email.parser

`소스 코드:' Lib/email/parser.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/email/parser.py}


__________________________________________________________________


메시지 객체 구조는 두 가지 방법으로 만들 수 있습니다: @ref{57f,,EmailMessage} 객체를 만들고, 딕셔너리 인터페이스를 사용하여 헤더를 추가하고, @ref{1c5b,,set_content()}와 관련 메서드를 사용하여 페이 로드를 추가하여 아예 새로 만들 수 있습니다. 또는 전자 메일 메시지의 직렬화된 표현을 구문 분석해서 만들 수 있습니다.

@ref{3f,,email} 패키지는 MIME 문서를 포함한 대부분의 전자 우편 문서 구조를 이해하는 표준 구문 분석기를 제공합니다. 구문 분석기에 바이트열, 문자열 또는 파일 객체를 전달하면 구문 분석기가 객체 구조의 루트 @ref{57f,,EmailMessage} 인스턴스를 반환합니다. MIME이 아닌 간단한 메시지의 경우 이 루트 객체의 페이 로드는 메시지의 텍스트를 포함하는 문자열일 수 있습니다. MIME 메시지의 경우 루트 객체는 @ref{3af4,,is_multipart()} 메서드가 @code{True}를 반환하고, @ref{3b18,,get_body()}, @ref{3b1a,,iter_parts()} 및 @ref{3b17,,walk()}와 같은 페이 로드 조작 메서드를 통해 서브 파트에 액세스 할 수 있습니다.

실제로 사용 가능한 두 가지 구문 분석기 인터페이스가 있습니다, @ref{13a2,,Parser} API와 증분 @ref{178c,,FeedParser} API. @code{Parser} API는 메시지의 전체 텍스트가 메모리에 있거나 전체 메시지가 파일 시스템의 파일에 있을 때 가장 유용합니다. 더 많은 입력을 기다리기 위해 블록할 수 있는 스트림에서 메시지를 읽을 때는 @code{FeedParser}가 더 적합합니다 (가령 소켓에서 전자 메일 메시지를 읽을 때). @code{FeedParser}는 메시지를 증분 적으로 소비하고 구문 분석 할 수 있으며, 구문 분석기를 닫을 때만 루트 객체를 반환합니다.

구문 분석기는 제한적인 방식으로 확장될 수 있음에 유의하십시오. 물론 구문 분석기는 처음부터 새로 구현할 수 있습니다. @ref{3f,,email} 패키지에 포함된 구문 분석기와 @ref{57f,,EmailMessage} 클래스를 연결하는 모든 로직은 @ref{12b8,,Policy} 클래스에 내장되므로, 사용자 정의 구문 분석기는 적절한 @code{Policy} 메서드의 사용자 정의 버전을 구현하여 필요한 방식으로 메시지 객체 트리를 만들 수 있습니다.

@menu
* FeedParser API:: 
* Parser API:: 
* 추가 사항:: 

@end menu

@node FeedParser API,Parser API,,email parser 전자 메일 메시지 구문 분석
@anchor{library/email parser feedparser-api}@anchor{3b2d}
@subsubsection FeedParser API


@code{email.feedparser} 모듈에서 임포트 한 @ref{13d0,,BytesFeedParser}는 전자 메일 메시지의 증분 구문 분석에 도움이 되는 API를 제공합니다. 블록할 수 있는 소스(가령 소켓)에서 전자 메일 메시지의 텍스트를 읽을 때 필요합니다. 물론 @code{BytesFeedParser}는 @ref{193,,바이트열류 객체}, 문자열 또는 파일에 완전히 포함된 전자 메일 메시지를 구문 분석하는 데 사용될 수 있지만, @ref{13d1,,BytesParser} API가 이러한 사용 사례에서는 더 편리 할 수 있습니다. 두 구문 분석기 API의 의미와 결과는 같습니다.

@ref{13d0,,BytesFeedParser}의 API는 간단합니다; 인스턴스를 만들고, 더는 공급할 것이 없을 때까지 바이트열을 공급한 다음 구문 분석기를 닫아 루트 메시지 객체를 얻습니다. @code{BytesFeedParser}는 표준 호환 메시지를 구문 분석할 때 매우 정확하고, 미준수 메시지를 구문 분석하는 데 매우 효과적이며 메시지를 어떻게 손상되었다고 간주하는지에 대한 정보를 제공합니다. 메시지에서 발견된 문제점 리스트로 메시지 객체의 @ref{3b29,,defects} 어트리뷰트를 채웁니다. 찾을 수 있는 결함 목록은 @ref{43,,email.errors} 모듈을 참조하십시오.

@ref{13d0,,BytesFeedParser} API는 다음과 같습니다:

@geindex BytesFeedParser (email.parser 클래스)
@anchor{library/email parser email parser BytesFeedParser}@anchor{13d0}
@deffn {클래스} email.parser.BytesFeedParser (_factory=None, *, policy=policy.compat32)

@ref{13d0,,BytesFeedParser} 인스턴스를 만듭니다. 선택적 `_factory'는 인자 없는 콜러블입니다; 지정되지 않으면 `policy'의 @ref{e95,,message_factory}를 사용합니다. 새로운 메시지 객체가 필요할 때마다 `_factory'를 호출합니다.

`policy'가 지정되면, 그것이 지정하는 규칙을 사용하여 메시지 표시를 갱신합니다. `policy'가 설정되지 않으면, @ref{12b9,,compat32} 정책을 사용합니다. 이 정책은 파이썬 3.2 버전의 email 패키지와의 호환성을 유지하고 @ref{580,,Message}를 기본 팩토리로 제공합니다. 다른 모든 정책은 @ref{57f,,EmailMessage}를 기본 `_factory'로 제공합니다. `policy'가 제어하는 다른 기능에 대한 자세한 내용은 @ref{53,,policy} 설명서를 참조하십시오.

참고: `policy 키워드는 항상 지정해야 합니다'; 이후 버전의 파이썬에서는 기본값이 @ref{178d,,email.policy.default}로 변경됩니다.


Added in version 3.2.



버전 3.3에서 변경: `policy' 키워드를 추가했습니다.



버전 3.6에서 변경: `_factory'는 기본적으로 정책 @code{message_factory}입니다.


@geindex feed() (email.parser.BytesFeedParser 메서드)
@anchor{library/email parser email parser BytesFeedParser feed}@anchor{3b2e}
@deffn {메서드} feed (data)

구문 분석기에 데이터를 더 공급합니다. `data'는 하나 이상의 줄을 포함하는 @ref{193,,바이트열류 객체}여야 합니다. 줄은 부분적일 수 있고 구문 분석기는 그러한 부분적인 줄을 올바르게 이어붙입니다. 줄은 세 가지 일반 줄 종료 중 어느 것이라도 될 수 있습니다: 캐리지 리턴(carriage return), 줄 바꿈(newline) 또는 캐리지 리턴과 줄 바꿈 (이것들을 혼합할 수도 있습니다).
@end deffn

@geindex close() (email.parser.BytesFeedParser 메서드)
@anchor{library/email parser email parser BytesFeedParser close}@anchor{3b2f}
@deffn {메서드} close ()

이전에 제공된 모든 데이터의 구문 분석을 완료하고 루트 메시지 객체를 반환합니다. 이 메서드가 호출된 후 @ref{3b2e,,feed()}가 호출되면 어떻게 되는지는 정의되지 않습니다.
@end deffn
@end deffn

@geindex FeedParser (email.parser 클래스)
@anchor{library/email parser email parser FeedParser}@anchor{178c}
@deffn {클래스} email.parser.FeedParser (_factory=None, *, policy=policy.compat32)

Works like @ref{13d0,,BytesFeedParser} except that the input to the
@ref{3b2e,,feed()} method must be a string.  This is of limited
utility, since the only way for such a message to be valid is for it to
contain only ASCII text or, if @ref{ff8,,utf8} is
@code{True}, no binary attachments.


버전 3.3에서 변경: `policy' 키워드를 추가했습니다.

@end deffn

@node Parser API,추가 사항,FeedParser API,email parser 전자 메일 메시지 구문 분석
@anchor{library/email parser parser-api}@anchor{3b30}
@subsubsection Parser API


The @ref{13d1,,BytesParser} class, imported from the @code{email.parser} module,
provides an API that can be used to parse a message when the complete contents
of the message are available in a @ref{193,,bytes-like object} or file.  The
@code{email.parser} module also provides @ref{13a2,,Parser} for parsing strings,
and header-only parsers, @ref{12c0,,BytesHeaderParser} and
@ref{12c1,,HeaderParser}, which can be used if you’re only interested in the
headers of the message.  @code{BytesHeaderParser} and @code{HeaderParser}
can be much faster in these situations, since they do not attempt to parse the
message body, instead setting the payload to the raw body.

@geindex BytesParser (email.parser 클래스)
@anchor{library/email parser email parser BytesParser}@anchor{13d1}
@deffn {클래스} email.parser.BytesParser (_class=None, *, policy=policy.compat32)

@ref{13d1,,BytesParser} 인스턴스를 만듭니다. `_class'와 `policy' 인자는 @ref{13d0,,BytesFeedParser} 의 `_factory'와 `policy' 인자와 같은 의미입니다.

참고: `policy 키워드는 항상 지정해야 합니다'; 이후 버전의 파이썬에서는 기본값이 @ref{178d,,email.policy.default}로 변경됩니다.


버전 3.3에서 변경: 2.4에서 폐지된 `strict' 인자를 제거했습니다. `policy' 키워드를 추가했습니다.



버전 3.6에서 변경: `_class'는 기본적으로 정책 @code{message_factory}입니다.


@geindex parse() (email.parser.BytesParser 메서드)
@anchor{library/email parser email parser BytesParser parse}@anchor{3b31}
@deffn {메서드} parse (fp, headersonly=False)

Read all the data from the binary file-like object `fp', parse the
resulting bytes, and return the message object.  `fp' must support
both the @ref{152e,,readline()} and the @ref{152d,,read()}
methods.

The bytes contained in `fp' must be formatted as a block of 
@geindex RFC; RFC 5322
RFC 5322@footnote{https://datatracker.ietf.org/doc/html/rfc5322.html}
(or, if @ref{ff8,,utf8} is @code{True}, 
@geindex RFC; RFC 6532
RFC 6532@footnote{https://datatracker.ietf.org/doc/html/rfc6532.html})
style headers and header continuation lines, optionally preceded by an
envelope header.  The header block is terminated either by the end of the
data or by a blank line.  Following the header block is the body of the
message (which may contain MIME-encoded subparts, including subparts
with a @code{Content-Transfer-Encoding} of @code{8bit}).

선택적 `headersonly'는 헤더를 읽은 후에 구문 분석을 중지할지를 지정하는 플래그입니다. 기본값은 @code{False}이며 파일의 전체 내용을 구문 분석합니다.
@end deffn

@geindex parsebytes() (email.parser.BytesParser 메서드)
@anchor{library/email parser email parser BytesParser parsebytes}@anchor{3b32}
@deffn {메서드} parsebytes (bytes, headersonly=False)

파일류 객체 대신 @ref{193,,바이트열류 객체}를 취한다는 점을 제외하고는 @ref{3b31,,parse()} 메서드와 유사합니다. 바이트열류 객체로 이 메서드를 호출하는 것은 @ref{10a3,,BytesIO} 인스턴스로 `bytes'를 먼저 감싸고 @code{parse()}를 호출하는 것과 동등합니다.

선택적 `headersonly'는 @ref{3b31,,parse()} 메서드와 같습니다.
@end deffn


Added in version 3.2.

@end deffn

@geindex BytesHeaderParser (email.parser 클래스)
@anchor{library/email parser email parser BytesHeaderParser}@anchor{12c0}
@deffn {클래스} email.parser.BytesHeaderParser (_class=None, *, policy=policy.compat32)

`headersonly'의 기본값이 @code{True}라는 점을 제외하고는 @ref{13d1,,BytesParser}와 정확히 같습니다.


Added in version 3.3.

@end deffn

@geindex Parser (email.parser 클래스)
@anchor{library/email parser email parser Parser}@anchor{13a2}
@deffn {클래스} email.parser.Parser (_class=None, *, policy=policy.compat32)

이 클래스는 @ref{13d1,,BytesParser}와 유사하지만, 문자열 입력을 처리합니다.


버전 3.3에서 변경: `strict' 인자를 제거했습니다. `policy' 키워드를 추가했습니다.



버전 3.6에서 변경: `_class'는 기본적으로 정책 @code{message_factory}입니다.


@geindex parse() (email.parser.Parser 메서드)
@anchor{library/email parser email parser Parser parse}@anchor{3b33}
@deffn {메서드} parse (fp, headersonly=False)

텍스트 모드 파일류 객체 `fp'에서 모든 데이터를 읽고, 결과 텍스트를 구문 분석한 후, 루트 메시지 객체를 반환합니다. `fp'는 파일류 객체의 @ref{20a4,,readline()}과 @ref{206a,,read()} 메서드를 모두 지원해야 합니다.

텍스트 모드 요구 사항 외에, 이 메서드는 @ref{3b31,,BytesParser.parse()}처럼 작동합니다.
@end deffn

@geindex parsestr() (email.parser.Parser 메서드)
@anchor{library/email parser email parser Parser parsestr}@anchor{3b34}
@deffn {메서드} parsestr (text, headersonly=False)

파일류 객체 대신 문자열 객체를 취한다는 점을 제외하고는 @ref{3b33,,parse()} 메서드와 유사합니다. 문자열로 이 메서드를 호출하는 것은 @ref{1128,,StringIO} 인스턴스로 `text'를 먼저 감싸고 @code{parse()}를 호출하는 것과 동등합니다.

선택적 `headersonly'는 @ref{3b33,,parse()} 메서드와 같습니다.
@end deffn
@end deffn

@geindex HeaderParser (email.parser 클래스)
@anchor{library/email parser email parser HeaderParser}@anchor{12c1}
@deffn {클래스} email.parser.HeaderParser (_class=None, *, policy=policy.compat32)

`headersonly'의 기본값이 @code{True}라는 점을 제외하고는 @ref{13a2,,Parser}와 정확히 같습니다.
@end deffn

문자열이나 파일 객체로부터 메시지 객체 구조를 만드는 것이 일반적인 작업이기 때문에, 편의상 4가지 함수가 제공됩니다. 최상위 @ref{3f,,email} 패키지 이름 공간에 있습니다.

@geindex message_from_bytes() (email 모듈)
@anchor{library/email parser email message_from_bytes}@anchor{13ce}
@deffn {함수} email.message_from_bytes (s, _class=None, *, policy=policy.compat32)

@ref{193,,바이트열류 객체}로부터 메시지 객체 구조를 반환합니다. 이것은 @code{BytesParser().parsebytes(s)}와 동등합니다. 선택적 `_class'와 `policy'는 @ref{13d1,,BytesParser} 클래스 생성자에서처럼 해석됩니다.


Added in version 3.2.



버전 3.3에서 변경: `strict' 인자를 제거했습니다. `policy' 키워드를 추가했습니다.

@end deffn

@geindex message_from_binary_file() (email 모듈)
@anchor{library/email parser email message_from_binary_file}@anchor{13cf}
@deffn {함수} email.message_from_binary_file (fp, _class=None, *, policy=policy.compat32)

열린 바이너리 @ref{13c8,,파일 객체}로부터 메시지 객체 구조 트리를 반환합니다. 이것은 @code{BytesParser().parse(fp)}와 동등합니다. `_class'와 `policy'는 @ref{13d1,,BytesParser} 클래스 생성자에서처럼 해석됩니다.


Added in version 3.2.



버전 3.3에서 변경: `strict' 인자를 제거했습니다. `policy' 키워드를 추가했습니다.

@end deffn

@geindex message_from_string() (email 모듈)
@anchor{library/email parser email message_from_string}@anchor{3b35}
@deffn {함수} email.message_from_string (s, _class=None, *, policy=policy.compat32)

문자열로부터 메시지 객체 구조 트리를 반환합니다. 이것은 @code{Parser().parsestr(s)}와 동등합니다. `_class'와 `policy'는 @ref{13a2,,Parser} 클래스 생성자에서처럼 해석됩니다.


버전 3.3에서 변경: `strict' 인자를 제거했습니다. `policy' 키워드를 추가했습니다.

@end deffn

@geindex message_from_file() (email 모듈)
@anchor{library/email parser email message_from_file}@anchor{3b36}
@deffn {함수} email.message_from_file (fp, _class=None, *, policy=policy.compat32)

열린 @ref{13c8,,파일 객체}로부터 메시지 객체 구조 트리를 반환합니다. 이것은 @code{Parser().parse(fp)}와 동등합니다. `_class'와 `policy'는 @ref{13a2,,Parser} 클래스 생성자에서처럼 해석됩니다.


버전 3.3에서 변경: `strict' 인자를 제거했습니다. `policy' 키워드를 추가했습니다.



버전 3.6에서 변경: `_class'는 기본적으로 정책 @code{message_factory}입니다.

@end deffn

대화식 파이썬 프롬프트에서 @ref{13ce,,message_from_bytes()}를 사용하는 방법의 예는 다음과 같습니다:

@example
>>> import email
>>> msg = email.message_from_bytes(myBytes)
@end example

@node 추가 사항,,Parser API,email parser 전자 메일 메시지 구문 분석
@anchor{library/email parser additional-notes}@anchor{3b37}
@subsubsection 추가 사항


구문 분석 의미에 대한 참고 사항은 다음과 같습니다:


@itemize *

@item 
대부분의 @code{multipart}가 아닌 유형의 메시지는 문자열 페이 로드가 있는 단일 메시지 객체로 구문 분석됩니다. 이 객체는 @ref{3af4,,is_multipart()}가 @code{False}를 반환하고 @ref{3b1a,,iter_parts()}는 빈 목록을 산출합니다.

@item 
모든 @code{multipart} 유형 메시지는 서브 메시지 객체 리스트 페이 로드가 있는 컨테이너 메시지 객체로 구문 분석됩니다. 바깥 컨테이너 메시지는 @ref{3af4,,is_multipart()}가 @code{True}를 반환하고 @ref{3b1a,,iter_parts()}는 서브 파트 목록을 산출합니다.

@item 
콘텐츠 유형이 @code{message/*}(가령 @code{message/delivery-status}와 @code{message/rfc822})인 대부분의 메시지는 길이가 1인 리스트 페이 로드를 포함하는 컨테이너 객체로 구문 분석됩니다. @ref{3af4,,is_multipart()} 메서드는 @code{True}를 반환합니다. @ref{3b1a,,iter_parts()}가 산출하는 단일 요소가 서브 메시지 객체입니다.

@item 
일부 표준을 준수하지 않는 메시지는 @code{multipart} 처리에 대해 내부적으로 일관성이 없을 수 있습니다. 이러한 메시지는 @code{multipart} 유형의 @code{Content-Type} 헤더를 가지면서도 @ref{3af4,,is_multipart()} 메서드가 @code{False}를 반환할 수 있습니다. 이러한 메시지가 @ref{178c,,FeedParser}로 구문 분석되었다면, `defects' 어트리뷰트 리스트에 @ref{3b38,,MultipartInvariantViolationDefect} 클래스의 인스턴스가 있습니다. 자세한 내용은 @ref{43,,email.errors}를 참조하십시오.
@end itemize

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node email generator MIME 문서 생성,email policy 정책 객체,email parser 전자 메일 메시지 구문 분석,email — 전자 메일과 MIME 처리 패키지
@anchor{library/email generator doc}@anchor{3b39}@anchor{library/email generator email-generator-generating-mime-documents}@anchor{3b3a}@anchor{library/email generator module-email generator}@anchor{44}@anchor{library/email generator translation-repo}@anchor{3b3b}
@subsubsection @code{email.generator}: MIME 문서 생성


@geindex module; email.generator

`소스 코드:' Lib/email/generator.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/email/generator.py}


__________________________________________________________________


가장 일반적인 작업 중 하나는 메시지 객체 구조로 표현되는 전자 우편 메시지의 평평한 (직렬화된) 버전을 생성하는 것입니다. @ref{1058,,smtplib.SMTP.sendmail()}을 통해 메시지를 보내거나 콘솔에서 메시지를 인쇄하려면 이 작업을 수행해야 합니다. 메시지 객체 구조를 취하고 직렬화된 표현을 생성하는 것은 제너레이터 클래스의 작업입니다.

@ref{52,,email.parser} 모듈과 마찬가지로 번들 제너레이터의 기능으로 제한되지 않습니다; 처음부터 직접 작성할 수 있습니다. 그러나 번들 제너레이터는 표준 호환 방식으로 대부분 전자 우편을 생성하는 방법을 알고 있고, MIME과 비 MIME 전자 우편 메시지를 잘 처리하며, 변환 없는 같은 @ref{53,,policy}가 사용된다고 가정할 때 바이트열 지향 구문 분석과 생성 연산이 역이 되도록 설계되었습니다. 즉, @ref{13d1,,BytesParser} 클래스로 직렬화된 바이트 스트림을 구문 분석한 다음, @ref{13d4,,BytesGenerator}를 사용하여 직렬화된 바이트 스트림을 재생성하면 입력과 동일한 출력이 생성됩니다 @footnote{
이 문장은 @code{unixfrom}에 적절한 설정을 사용하고, 자동 조정을 요구하는 @ref{53,,email.policy} 설정이 없다고 가정합니다 (예를 들어, @ref{3b3c,,refold_source}는 @code{none}이어야 하며, 이는 기본값이 `아닙'니다). 메시지가 RFC 표준을 준수하지 않으면 때때로 구문 분석 에러 복구 중에 정확한 원본 텍스트에 대한 정보가 손실되므로 100% 사실이 아니기도 합니다. 가능하다면 이 후자의 경계 사례를 해결하는 것이 목표입니다.
}. (반면에, 프로그램에서 구축한 @ref{57f,,EmailMessage}에 제너레이터를 사용하면 기본값이 채워지기 때문에 @code{EmailMessage} 객체가 변경될 수 있습니다.)

@ref{13d3,,Generator} 클래스를 사용하면 메시지를 (바이너리가 아닌) 텍스트 직렬화 표현으로 펼칠 수 있지만, 유니코드는 바이너리 데이터를 직접 표현할 수 없기 때문에, “8비트 클린”하지 않은 채널을 통한 전송을 위한 전자 우편 메시지를 인코딩하기 위한 표준 전자 우편 RFC 콘텐츠 전송 인코딩(Content Transfer Encoding) 기술을 사용하여 메시지를 ASCII 문자만 포함된 것으로 변환해야 합니다.

SMIME 서명된 메시지의 재현성 있는 처리를 위해 @ref{13d3,,Generator}는 @code{multipart/signed} 유형의 메시지 파트와 모든 서브 부분에 대해 헤더 접기를 비활성화합니다.

@geindex BytesGenerator (email.generator 클래스)
@anchor{library/email generator email generator BytesGenerator}@anchor{13d4}
@deffn {클래스} email.generator.BytesGenerator (outfp, mangle_from_=None, maxheaderlen=None, *, policy=None)

@ref{3b3d,,flatten()} 메서드에 제공된 모든 메시지나 @ref{3b3e,,write()} 메서드에 제공된 모든 서로게이트 이스케이프 인코딩된 텍스트를 @ref{17b3,,파일류 객체} `outfp'에 쓰는 @ref{13d4,,BytesGenerator} 객체를 반환합니다. `outfp'는 바이너리 데이터를 받아들이는 @code{write} 메서드를 지원해야 합니다.

선택적인 `mangle_from_'이 @code{True}인 경우, 정확한 문자열 @code{"From "}으로 시작하는(즉 줄의 시작에 @code{From}이 오고 스페이스가 뒤따르는) 본문의 모든 줄 앞에 @code{>} 문자를 넣습니다. `mangle_from_'의 기본값은 `policy'의 @ref{ff6,,mangle_from_} 설정값입니다 (@ref{e96,,compat32} 정책의 경우 @code{True}, 다른 모든 경우 @code{False}입니다). `mangle_from_'은 메시지가 유닉스 mbox 형식으로 저장될 때 사용하기 위한 것입니다 (@ref{8f,,mailbox}와 WHY THE CONTENT-LENGTH FORMAT IS BAD@footnote{https://www.jwz.org/doc/content-length.html}를 참조하십시오).

`maxheaderlen'이 @code{None}이 아니면, `maxheaderlen'보다 긴 헤더 줄을 다시 접거나, @code{0}이면 헤더를 다시 접지 않습니다. `manheaderlen'이 @code{None}(기본값)이면, `policy' 설정에 따라 헤더와 기타 메시지 줄을 줄 바꿈 합니다.

`policy'가 지정되면, 해당 정책을 사용하여 메시지 생성을 제어합니다. `policy'가 @code{None}(기본값)이면 @code{flatten}에 전달된 @ref{580,,Message}나 @ref{57f,,EmailMessage} 객체와 연관된 정책을 사용하여 메시지 생성을 제어합니다. `policy'가 제어하는 것에 대한 자세한 내용은 @ref{53,,email.policy}를 참조하십시오.


Added in version 3.2.



버전 3.3에서 변경: `policy' 키워드를 추가했습니다.



버전 3.6에서 변경: `mangle_from_'과 `maxheaderlen' 매개 변수의 기본 동작은 정책을 따르는 것입니다.


@geindex flatten() (email.generator.BytesGenerator 메서드)
@anchor{library/email generator email generator BytesGenerator flatten}@anchor{3b3d}
@deffn {메서드} flatten (msg, unixfrom=False, linesep=None)

`msg'를 루트로 하는 메시지 객체 구조의 텍스트 표현을 @ref{13d4,,BytesGenerator} 인스턴스가 만들어질 때 지정된 출력 파일에 인쇄합니다.

@ref{53,,policy} 옵션 @ref{3b3f,,cte_type}이 @code{8bit}(기본값)이면, 하이 비트가 설정된 바이트들이 원본에서와같이 재생성되도록 출력이 수정되지 않은 원본 구문 분석된 메시지의 헤더를 복사하고, 비 ASCII @code{Content-Transfer-Encoding}을 이것을 갖는 모든 본문 파트에서 보존합니다. @code{cte_type}이 @code{7bit}이면, 하이 비트가 설정된 바이트들을 ASCII 호환 @code{Content-Transfer-Encoding}을 사용하여 필요에 따라 변환합니다. 즉, 비 ASCII @code{Content-Transfer-Encoding}(@code{Content-Transfer-Encoding: 8bit})을 갖는 파트를 ASCII 호환 @code{Content-Transfer-Encoding}으로 변환하고, 헤더에 있는 RFC 유효하지 않은 비 ASCII 바이트를 MIME @code{unknown-8bit} 문자 집합을 사용하여 인코딩하여, RFC 호환되게 만듭니다.

@c XXX: There should be an option that just does the RFC
@c compliance transformation on headers but leaves CTE 8bit parts alone.

`unixfrom'이 @code{True}이면, 루트 메시지 객체의 첫 번째 
@geindex RFC; RFC 5322
RFC 5322@footnote{https://datatracker.ietf.org/doc/html/rfc5322.html} 헤더 앞에 유닉스 mailbox 형식(@ref{8f,,mailbox}를 참조하십시오)에서 사용되는 봉투 헤더 구분자를 인쇄합니다. 루트 객체에 봉투 헤더가 없으면, 표준 헤더를 만듭니다. 기본값은 @code{False}입니다. 서브 파트의 경우 봉투 헤더가 인쇄되지 않음에 유의하십시오.

`linesep'이 @code{None}이 아니면, 펼쳐진 메시지의 모든 줄 사이의 구분자 문자로 사용합니다. `linesep'이 @code{None}(기본값)이면, `policy'에 지정된 값을 사용합니다.

@c XXX: flatten should take a *policy* keyword.
@end deffn

@geindex clone() (email.generator.BytesGenerator 메서드)
@anchor{library/email generator email generator BytesGenerator clone}@anchor{3b40}
@deffn {메서드} clone (fp)

정확히 같은 옵션 설정이고 `fp'를 새 `outfp'로 사용하는, 이 @ref{13d4,,BytesGenerator} 인스턴스의 독립 클론을 반환합니다.
@end deffn

@geindex write() (email.generator.BytesGenerator 메서드)
@anchor{library/email generator email generator BytesGenerator write}@anchor{3b3e}
@deffn {메서드} write (s)

@code{ASCII} 코덱과 @code{surrogateescape} 에러 처리기를 사용하여 `s'를 인코딩하고, @ref{13d4,,BytesGenerator}의 생성자에 전달된 `outfp'의 `write' 메서드로 전달합니다.
@end deffn
@end deffn

편의상, @ref{57f,,EmailMessage}는 @ref{3af2,,as_bytes()} 메서드와 @code{bytes(aMessage)}(일명 @ref{3af3,,__bytes__()})를 제공하여 메시지 객체의 직렬화된 바이너리 표현 생성을 단순화합니다. 자세한 내용은 @ref{48,,email.message}를 참조하십시오.

문자열은 바이너리 데이터를 나타낼 수 없어서, @ref{13d3,,Generator} 클래스는 펼쳐지는 모든 메시지의 바이너리 데이터를 ASCII 호환 @code{Content-Transfer_Encoding}으로 변환하여 ASCII 호환 형식으로 변환해야 합니다. 전자 우편 RFC의 용어를 사용하면, 이를 “8비트 클린”이 아닌 I/O 스트림으로 직렬화하는 @code{Generator}로 생각할 수 있습니다. 즉, 대부분 응용 프로그램은 @code{Generator}가 아닌 @ref{13d4,,BytesGenerator}를 사용하려고 합니다.

@geindex Generator (email.generator 클래스)
@anchor{library/email generator email generator Generator}@anchor{13d3}
@deffn {클래스} email.generator.Generator (outfp, mangle_from_=None, maxheaderlen=None, *, policy=None)

@ref{3b41,,flatten()} 메서드에 제공된 모든 메시지나 @ref{3b42,,write()} 메서드에 제공된 텍스트를 @ref{17b3,,파일류 객체} `outfp'에 쓰는 @ref{13d3,,Generator} 객체를 반환합니다. `outfp'는 문자열 데이터를 받아들이는 @code{write} 메서드를 지원해야 합니다.

선택적인 `mangle_from_'이 @code{True}인 경우, 정확한 문자열 @code{"From "}으로 시작하는(즉 줄의 시작에 @code{From}이 오고 스페이스가 뒤따르는) 본문의 모든 줄 앞에 @code{>} 문자를 넣습니다. `mangle_from_'의 기본값은 `policy'의 @ref{ff6,,mangle_from_} 설정값입니다 (@ref{e96,,compat32} 정책의 경우 @code{True}, 다른 모든 경우 @code{False}입니다). `mangle_from_'은 메시지가 유닉스 mbox 형식으로 저장될 때 사용하기 위한 것입니다 (@ref{8f,,mailbox}와 WHY THE CONTENT-LENGTH FORMAT IS BAD@footnote{https://www.jwz.org/doc/content-length.html}를 참조하십시오).

`maxheaderlen'이 @code{None}이 아니면, `maxheaderlen'보다 긴 헤더 줄을 다시 접거나, @code{0}이면 헤더를 다시 접지 않습니다. `manheaderlen'이 @code{None}(기본값)이면, `policy' 설정에 따라 헤더와 기타 메시지 줄을 줄 바꿈 합니다.

`policy'가 지정되면, 해당 정책을 사용하여 메시지 생성을 제어합니다. `policy'가 @code{None}(기본값)이면 @code{flatten}에 전달된 @ref{580,,Message}나 @ref{57f,,EmailMessage} 객체와 연관된 정책을 사용하여 메시지 생성을 제어합니다. `policy'가 제어하는 것에 대한 자세한 내용은 @ref{53,,email.policy}를 참조하십시오.


버전 3.3에서 변경: `policy' 키워드를 추가했습니다.



버전 3.6에서 변경: `mangle_from_'과 `maxheaderlen' 매개 변수의 기본 동작은 정책을 따르는 것입니다.


@geindex flatten() (email.generator.Generator 메서드)
@anchor{library/email generator email generator Generator flatten}@anchor{3b41}
@deffn {메서드} flatten (msg, unixfrom=False, linesep=None)

`msg'를 루트로 하는 메시지 객체 구조의 텍스트 표현을 @ref{13d3,,Generator} 인스턴스가 만들어질 때 지정된 출력 파일에 인쇄합니다.

@ref{53,,policy} 옵션 @ref{3b3f,,cte_type}이 @code{8bit}이면, 옵션이 @code{7bit}로 설정된 것처럼 메시지를 생성합니다. (문자열은 비 ASCII 바이트를 나타낼 수 없기 때문에 필요합니다.) 하이 비트가 설정된 모든 바이트를 ASCII 호환 @code{Content-Transfer-Encoding}을 사용하여 필요에 따라 변환합니다. 즉, 비 ASCII @code{Content-Transfer-Encoding}(@code{Content-Transfer-Encoding: 8bit})을 갖는 파트를 ASCII 호환 @code{Content-Transfer-Encoding}으로 변환하고, 헤더에 있는 RFC 유효하지 않은 비 ASCII 바이트를 MIME @code{unknown-8bit} 문자 집합을 사용하여 인코딩하여, RFC 호환되게 만듭니다.

`unixfrom'이 @code{True}이면, 루트 메시지 객체의 첫 번째 
@geindex RFC; RFC 5322
RFC 5322@footnote{https://datatracker.ietf.org/doc/html/rfc5322.html} 헤더 앞에 유닉스 mailbox 형식(@ref{8f,,mailbox}를 참조하십시오)에서 사용되는 봉투 헤더 구분자를 인쇄합니다. 루트 객체에 봉투 헤더가 없으면, 표준 헤더를 만듭니다. 기본값은 @code{False}입니다. 서브 파트의 경우 봉투 헤더가 인쇄되지 않음에 유의하십시오.

`linesep'이 @code{None}이 아니면, 펼쳐진 메시지의 모든 줄 사이의 구분자 문자로 사용합니다. `linesep'이 @code{None}(기본값)이면, `policy'에 지정된 값을 사용합니다.

@c XXX: flatten should take a *policy* keyword.


버전 3.2에서 변경: @code{8bit} 메시지 본문을 다시 인코딩하기 위한 지원과 `linesep' 인자가 추가되었습니다.

@end deffn

@geindex clone() (email.generator.Generator 메서드)
@anchor{library/email generator email generator Generator clone}@anchor{3b43}
@deffn {메서드} clone (fp)

정확히 같은 옵션을 갖고 `fp'를 새 `outfp'로 사용하는, 이 @ref{13d3,,Generator} 인스턴스의 독립 클론을 반환합니다.
@end deffn

@geindex write() (email.generator.Generator 메서드)
@anchor{library/email generator email generator Generator write}@anchor{3b42}
@deffn {메서드} write (s)

@ref{13d3,,Generator}의 생성자에 전달된 `outfp'의 `write' 메서드로 `s'를 씁니다. 이것은 @ref{1174,,print()} 함수에서 사용될 @code{Generator} 인스턴스를 위해 딱 필요한 만큼의 파일류 API를 제공합니다.
@end deffn
@end deffn

편의상, @ref{57f,,EmailMessage}는 @ref{3aef,,as_string()} 메서드와 @code{str(aMessage)}(일명 @ref{3af1,,__str__()})를 제공하여 메시지 객체의 포맷된 문자열 표현 생성을 단순화합니다. 자세한 내용은 @ref{48,,email.message}를 참조하십시오.

The @code{email.generator} module also provides a derived class,
@ref{e94,,DecodedGenerator}, which is like the @ref{13d3,,Generator} base class,
except that non-@code{text} parts are not serialized, but are instead
represented in the output stream by a string derived from a template filled
in with information about the part.

@geindex DecodedGenerator (email.generator 클래스)
@anchor{library/email generator email generator DecodedGenerator}@anchor{e94}
@deffn {클래스} email.generator.DecodedGenerator (outfp, mangle_from_=None, maxheaderlen=None, fmt=None, *, policy=None)

@ref{13d3,,Generator}와 같이 작동하지만, @ref{3b41,,Generator.flatten()}에 전달된 메시지의 서브 파트에 대해, 서브 파트가 메인 유형이 @code{text}이면, 서브 파트의 디코딩된 페이 로드를 인쇄하고, 메인 유형이 @code{text}가 아니면, 그것을 인쇄하지 않고 파트 정보를 사용하여 문자열 `fmt'를 채운 후에 그 문자열을 인쇄합니다.

`fmt'를 채우기 위해, @code{fmt % part_info}를 실행하는데, 여기서 @code{part_info}는 다음 키와 값으로 구성된 딕셔너리입니다:


@itemize *

@item 
@code{type} – @code{text}가 아닌 파트의 전체 MIME 유형

@item 
@code{maintype} – @code{text}가 아닌 파트의 메인 MIME 유형

@item 
@code{subtype} – @code{text}가 아닌 파트의 서브 MIME 유형

@item 
@code{filename} – @code{text}가 아닌 파트의 파일명

@item 
@code{description} – @code{text}가 아닌 파트와 관련된 설명

@item 
@code{encoding} – @code{text}가 아닌 파트의 콘텐츠 전송 인코딩(Content transfer encoding)
@end itemize

`fmt'가 @code{None}이면, 다음 기본 `fmt'를 사용합니다:

@quotation

“[Non-text (%(type)s) part of message omitted, filename %(filename)s]”
@end quotation

선택적 `_mangle_from_' 및 `maxheaderlen'은 @ref{13d3,,Generator} 베이스 클래스와 같습니다.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node email policy 정책 객체,email errors 예외와 결함 클래스,email generator MIME 문서 생성,email — 전자 메일과 MIME 처리 패키지
@anchor{library/email policy doc}@anchor{3b44}@anchor{library/email policy email-policy-policy-objects}@anchor{3b45}@anchor{library/email policy module-email policy}@anchor{53}@anchor{library/email policy translation-repo}@anchor{3b46}
@subsubsection @code{email.policy}: 정책 객체


@geindex module; email.policy


Added in version 3.3.


`소스 코드:' Lib/email/policy.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/email/policy.py}


__________________________________________________________________


@ref{3f,,email} 패키지의 주요 초점은 다양한 전자 우편과 MIME RFC에 설명된 대로 전자 우편 메시지를 처리하는 것입니다. 그러나 전자 우편 메시지의 일반적인 형식(각각 이름, 콜론, 값 순으로 구성된 헤더 필드의 블록, 빈 줄과 임의의 ‘본문’ 이 뒤따르는 전체 블록)은 전자 우편 영역 밖에서도 용도가 발견되는 형식입니다. 이러한 용도 중 일부는 메인 전자 우편 RFC와 상당히 유사하지만, 일부는 그렇지 않습니다. 전자 우편으로 작업할 때에도, RFC의 엄격한 준수를 위반하는 것이 바람직할 때가 있습니다. 가령 표준을 따르지 않는 전자 우편 서버와 상호 운영되거나 표준을 위반하는 방식으로 사용하기 원하는 확장을 구현하는 전자 우편을 생성하는 경우가 그렇습니다.

정책 객체는 email 패키지에 이러한 개별 사용 사례를 모두 처리 할 수 있는 유연성을 제공합니다.

@ref{12b8,,Policy} 객체는 사용 중에 email 패키지의 다양한 구성 요소 동작을 제어하는 일련의 어트리뷰트와 메서드를 캡슐화합니다. @code{Policy} 인스턴스는 email 패키지의 다양한 클래스와 메서드로 전달되어 기본 동작을 변경할 수 있습니다. 설정 가능한 값과 기본값은 아래에 설명되어 있습니다.

email 패키지의 모든 클래스에서 사용되는 기본 정책이 있습니다. 모든 @ref{52,,parser} 클래스와 관련 편의 함수 및 @ref{580,,Message} 클래스의 경우, 이것은 사전 정의된 인스턴스 @ref{e96,,compat32}를 통한 @ref{12b9,,Compat32} 정책입니다. 이 정책은 파이썬 3.3 이전 버전의 email 패키지와 완전한 과거 호환성(어떤 경우에는, 버그 호환성을 포함합니다)을 제공합니다.

@ref{57f,,EmailMessage}에 대한 `policy' 키워드의 기본값은 사전 정의된 인스턴스 @ref{178d,,default}를 통한 @ref{12bc,,EmailPolicy} 정책입니다.

@ref{580,,Message}나 @ref{57f,,EmailMessage} 객체가 만들어질 때, 정책을 획득합니다. 메시지가 @ref{52,,parser}로 만들어지면, 구문 분석기에 전달된 정책이 만들어지는 메시지가 사용하는 정책이 됩니다. 프로그램이 메시지를 만들면, 만들 때 정책을 지정할 수 있습니다. 메시지가 @ref{44,,generator}에 전달될 때, 제너레이터는 기본적으로 메시지의 정책을 사용하지만, 특정 정책을 제너레이터에 전달하여 메시지 객체에 저장된 정책을 재정의할 수도 있습니다.

@ref{52,,email.parser} 클래스와 구문 분석기 편의 함수에 대한 `policy' 키워드의 기본값은 이후 버전의 파이썬에서 `변경될 예정'입니다. 따라서 @code{parser} 모듈에서 설명된 클래스와 함수를 호출할 때는 `항상 사용할 정책을 명시적으로 지정'해야 합니다.

이 설명서의 첫 부분은 @ref{e96,,compat32}를 포함한 모든 정책 객체에 공통적인 기능을 정의하는 @ref{13bb,,추상 베이스 클래스} 인 @ref{12b8,,Policy}의 기능을 다룹니다. 여기에는 email 패키지에 의해 내부적으로 호출되는 특정 훅 메서드가 포함되며, 사용자 정의 정책은 다른 동작을 얻기 위해 재정의할 수 있습니다. 두 번째 부분에서는 표준 동작과 이전 버전과 호환되는 동작과 기능을 각각 제공하는 훅을 구현하는 구상 클래스 @ref{12bc,,EmailPolicy}와 @ref{12b9,,Compat32}를 설명합니다.

@ref{12b8,,Policy} 인스턴스는 불변이지만, 복제할 수 있는데, 클래스 생성자와 같은 키워드 인자를 받아들이고 원본의 사본이지만 지정된 어트리뷰트 값이 변경된 새 @code{Policy} 인스턴스를 반환합니다.

예를 들어, 다음 코드를 사용하여 디스크의 파일에서 전자 우편 메시지를 읽고 유닉스 시스템의 시스템 @code{sendmail} 프로그램으로 전달할 수 있습니다:

@c from unittest import mock
@c mocker = mock.patch('subprocess.Popen')
@c m = mocker.start()
@c proc = mock.MagicMock()
@c m.return_value = proc
@c proc.stdin.close.return_value = None
@c mymsg = open('mymsg.txt', 'w')
@c mymsg.write('To: abc@xyz.com\n\n')
@c mymsg.flush()

@example
>>> from email import message_from_binary_file
>>> from email.generator import BytesGenerator
>>> from email import policy
>>> from subprocess import Popen, PIPE
>>> with open('mymsg.txt', 'rb') as f:
...     msg = message_from_binary_file(f, policy=policy.default)
...
>>> p = Popen(['sendmail', msg['To'].addresses[0]], stdin=PIPE)
>>> g = BytesGenerator(p.stdin, policy=msg.policy.clone(linesep='\r\n'))
>>> g.flatten(msg)
>>> p.stdin.close()
>>> rc = p.wait()
@end example

@c mymsg.close()
@c mocker.stop()
@c import os
@c os.remove('mymsg.txt')

여기서 우리는 @ref{13d4,,BytesGenerator}에게 @code{sendmail}의 @code{stdin}으로 공급할 바이너리 문자열을 만들 때 RFC 올바른 줄 구분자 문자를 사용하도록 지시합니다. 기본 정책은 @code{\n} 줄 구분자를 사용합니다.

일부 email 패키지 메서드는 `policy' 키워드 인자를 받아들여, 해당 메서드에 대한 정책을 대체 할 수 있도록 합니다. 예를 들어, 다음 코드는 이전 예제의 `msg' 객체의 @ref{1136,,as_bytes()} 메서드를 사용하고 실행 중인 플랫폼의 기본 줄 구분자를 사용하여 메시지를 파일에 씁니다:

@example
>>> import os
>>> with open('converted.txt', 'wb') as f:
...     f.write(msg.as_bytes(policy=msg.policy.clone(linesep=os.linesep)))
17
@end example

더하기 연산자를 사용하여 정책 객체를 결합하여, 기본값이 아닌 설정이 합쳐진 조합으로 설정된 정책 객체를 생성할 수도 있습니다:

@example
>>> compat_SMTP = policy.compat32.clone(linesep='\r\n')
>>> compat_strict = policy.compat32.clone(raise_on_defect=True)
>>> compat_strict_SMTP = compat_SMTP + compat_strict
@end example

이 연산은 교환적(commutative)이지 않습니다; 즉, 객체가 더해지는 순서가 중요합니다. 예시하면 이렇습니다:

@example
>>> policy100 = policy.compat32.clone(max_line_length=100)
>>> policy80 = policy.compat32.clone(max_line_length=80)
>>> apolicy = policy100 + policy80
>>> apolicy.max_line_length
80
>>> apolicy = policy80 + policy100
>>> apolicy.max_line_length
100
@end example

@geindex Policy (email.policy 클래스)
@anchor{library/email policy email policy Policy}@anchor{12b8}
@deffn {클래스} email.policy.Policy (**kw)

모든 정책 클래스의 @ref{13bb,,추상 베이스 클래스}입니다. 불변 속성, @ref{12ba,,clone()} 메서드 및 생성자 시맨틱의 구현뿐만 아니라 몇 가지 간단한 메서드에 대한 기본 구현을 제공합니다.

정책 클래스의 생성자에는 다양한 키워드 인자가 전달될 수 있습니다. 지정할 수 있는 인자는 이 클래스의 메서드 이외의 프로퍼티, 그리고 구상 클래스의 메서드 이외의 프로퍼티입니다. 생성자에 지정된 값은 해당 어트리뷰트의 기본값을 재정의합니다.

이 클래스는 다음 프로퍼티를 정의합니다. 따라서, 모든 정책 클래스의 생성자에 다음에 대한 값이 전달될 수 있습니다:

@geindex max_line_length (email.policy.Policy의 속성)
@anchor{library/email policy email policy Policy max_line_length}@anchor{3af0}
@deffn {속성} max_line_length

줄 종료 문자를 포함하지 않고, 직렬화된 출력에서 줄의 최대 길이. 
@geindex RFC; RFC 5322
RFC 5322@footnote{https://datatracker.ietf.org/doc/html/rfc5322.html}에 따라 기본값은 78입니다. @code{0}이나 @ref{884,,None} 값은 줄 바꿈을 전혀 수행하지 않아야 함을 나타냅니다.
@end deffn

@geindex linesep (email.policy.Policy의 속성)
@anchor{library/email policy email policy Policy linesep}@anchor{3b47}
@deffn {속성} linesep

직렬화된 출력에서 줄을 종료하는 데 사용되는 문자열입니다. RFC는 @code{\r\n}을 요구하지만, 기본값은 파이썬에서 사용하는 내부 줄 종료 규칙을 따라 @code{\n}입니다.
@end deffn

@geindex cte_type (email.policy.Policy의 속성)
@anchor{library/email policy email policy Policy cte_type}@anchor{3b3f}
@deffn {속성} cte_type

사용해야 하는 콘텐츠 전송 인코딩(Content Transfer Encoding) 유형을 제어합니다. 가능한 값은 다음과 같습니다:


@multitable {xxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

@code{7bit}

@tab

모든 데이터는 “7비트 클린”(ASCII 전용)이어야 합니다. 즉, 필요하면 quoted-printable이나 base64 인코딩을 사용하여 데이터를 인코딩합니다.

@item

@code{8bit}

@tab

데이터는 7비트 클린으로 제한되지 않습니다. 헤더의 데이터는 여전히 ASCII 전용이어야 하므로 인코딩되지만 (예외는 아래 @ref{3b48,,fold_binary()}와 @ref{ff8,,utf8}을 참조하십시오), 본문 부분은 @code{8bit} CTE를 사용할 수 있습니다.

@end multitable


@code{8bit} @code{cte_type} 값은 문자열이 바이너리 데이터를 포함할 수 없어서 @code{Generator}가 아닌 @code{BytesGenerator}에서만 작동합니다. @code{Generator}가 @code{cte_type=8bit}를 지정하는 정책에 따라 작동하면, @code{cte_type}이 @code{7bit}인 것처럼 동작합니다.
@end deffn

@geindex raise_on_defect (email.policy.Policy의 속성)
@anchor{library/email policy email policy Policy raise_on_defect}@anchor{3b49}
@deffn {속성} raise_on_defect

@ref{e06,,True}이면, 만나는 모든 결함을 에러로 발생시킵니다. @ref{d2a,,False}(기본값)이면, 결함은 @ref{3b4a,,register_defect()} 메서드로 전달됩니다.
@end deffn

@geindex mangle_from_ (email.policy.Policy의 속성)
@anchor{library/email policy email policy Policy mangle_from_}@anchor{ff6}
@deffn {속성} mangle_from_

@ref{e06,,True}이면, 본문에서 `“From “'으로 시작하는 줄은 @code{>}를 앞에 배치하여 이스케이프 됩니다. 이 매개 변수는 제너레이터가 메시지를 직렬화할 때 사용됩니다. 기본값: @ref{d2a,,False}.


Added in version 3.5.

@end deffn

@geindex message_factory (email.policy.Policy의 속성)
@anchor{library/email policy email policy Policy message_factory}@anchor{e95}
@deffn {속성} message_factory

새로운 빈 메시지 객체를 생성하기 위한 팩토리 함수. 메시지를 구축할 때 구분 분석기가 사용합니다. 기본값은 @code{None}이며, 이때 @ref{580,,Message}가 사용됩니다.


Added in version 3.6.

@end deffn

@geindex verify_generated_headers (email.policy.Policy의 속성)
@anchor{library/email policy email policy Policy verify_generated_headers}@anchor{4f2}
@deffn {속성} verify_generated_headers

If @code{True} (the default), the generator will raise
@ref{3b4b,,HeaderWriteError} instead of writing a header
that is improperly folded or delimited, such that it would
be parsed as multiple headers or joined with adjacent data.
Such headers can be generated by custom header classes or bugs
in the @code{email} module.

As it’s a security feature, this defaults to @code{True} even in the
@ref{12b9,,Compat32} policy.
For backwards compatible, but unsafe, behavior, it must be set to
@code{False} explicitly.


Added in version 3.13.

@end deffn

다음 @ref{12b8,,Policy} 메서드는 email 라이브러리를 사용하여 사용자 정의 설정으로 정책 인스턴스를 만드는 코드가 호출하기 위한 것입니다:

@geindex clone() (email.policy.Policy 메서드)
@anchor{library/email policy email policy Policy clone}@anchor{12ba}
@deffn {메서드} clone (**kw)

키워드 인자로 새로운 값이 부여되는 어트리뷰트를 제외하고, 어트리뷰트가 현재 인스턴스와 같은 값을 갖는 새로운 @ref{12b8,,Policy} 인스턴스를 반환합니다.
@end deffn

나머지 @ref{12b8,,Policy} 메서드는 email 패키지 코드에 의해 호출되며, email 패키지를 사용하는 응용 프로그램에 의해 호출되는 용도가 아닙니다. 사용자 정의 정책은 이 모든 메서드를 구현해야 합니다.

@geindex handle_defect() (email.policy.Policy 메서드)
@anchor{library/email policy email policy Policy handle_defect}@anchor{3b4c}
@deffn {메서드} handle_defect (obj, defect)

`obj'에서 찾은 `defect'를 처리합니다. email 패키지가 이 메서드를 호출할 때, `defect'는 항상 @ref{3b4d,,MessageDefect}의 서브 클래스입니다.

기본 구현은 @ref{3b49,,raise_on_defect} 플래그를 확인합니다. @code{True}이면, `defect'가 예외로 발생합니다. @code{False}(기본값)이면 `obj'와 `defect'가 @ref{3b4a,,register_defect()}로 전달됩니다.
@end deffn

@geindex register_defect() (email.policy.Policy 메서드)
@anchor{library/email policy email policy Policy register_defect}@anchor{3b4a}
@deffn {메서드} register_defect (obj, defect)

`obj'에 `defect'를 등록합니다. email 패키지에서, `defect'는 항상 @ref{3b4d,,MessageDefect}의 서브 클래스입니다.

기본 구현은 `obj'의 @code{defects} 어트리뷰트의 @code{append} 메서드를 호출합니다. email 패키지가 @ref{3b4c,,handle_defect}를 호출할 때, `obj'는 일반적으로 @code{append} 메서드가 있는 @code{defects} 어트리뷰트가 있습니다. email 패키지와 함께 사용되는 사용자 정의 객체 형(예를 들어, 사용자 정의 @code{Message} 객체)도 이러한 어트리뷰트를 제공해야 합니다, 그렇지 않으면 구문 분석된 메시지의 결함이 예기치 않은 에러를 발생시킵니다.
@end deffn

@geindex header_max_count() (email.policy.Policy 메서드)
@anchor{library/email policy email policy Policy header_max_count}@anchor{3b4e}
@deffn {메서드} header_max_count (name)

`name'이라는 헤더의 최대 허용 개수를 반환합니다.

헤더가 @ref{57f,,EmailMessage}나 @ref{580,,Message} 객체에 추가될 때 호출됩니다. 반환 값이 @code{0}이나 @code{None}이 아니고, 반환 값보다 크거나 같은 수의 이름이 `name'인 헤더가 이미 있으면 @ref{2ec,,ValueError}가 발생합니다.

@code{Message.__setitem__}의 기본 동작은 값을 헤더 리스트에 추가하는 것이므로, 깨닫지 못하는 사이에 중복 헤더를 만들기 쉽습니다. 이 메서드는 특정 헤더를 @code{Message}에 프로그래밍 방식으로 추가할 수 있는 인스턴스의 수를 제한할 수 있도록 합니다. (이 제약은 구문 분석기가 보지 않습니다, 구문 분석기는 구문 분석 중인 메시지에 존재하는 수 만큼 헤더를 충실하게 생성합니다.)

기본 구현은 모든 헤더 이름에 대해 @code{None}을 반환합니다.
@end deffn

@geindex header_source_parse() (email.policy.Policy 메서드)
@anchor{library/email policy email policy Policy header_source_parse}@anchor{3b4f}
@deffn {메서드} header_source_parse (sourcelines)

email 패키지는 문자열 리스트로 이 메서드를 호출하며, 각 문자열은 구문 분석 중인 소스에서 발견된 줄 구분 문자로 끝납니다. 첫 번째 줄에는 필드 헤더 이름과 구분자가 포함됩니다. 소스의 모든 공백이 유지됩니다. 이 메서드는 구문 분석된 헤더를 나타내기 위해 @code{Message}에 저장될 @code{(name, value)} 튜플을 반환해야 합니다.

구현이 기존 email 패키지 정책과의 호환성을 유지하기 원한다면, `name'은 대소 문자를 유지한 이름( ‘@code{:}’ 구분자까지의 모든 문자)이어야 하지만, `value'는 선행 공백이 제거되고 펼쳐진(unfolded) 값(모든 줄 구분자 문자는 제거하지만, 공백은 그대로 유지한)이어야 합니다.

`sourcelines'는 서로게이트 이스케이프 된 바이너리 데이터를 포함할 수 있습니다.

기본 구현이 없습니다
@end deffn

@geindex header_store_parse() (email.policy.Policy 메서드)
@anchor{library/email policy email policy Policy header_store_parse}@anchor{3b50}
@deffn {메서드} header_store_parse (name, value)

email 패키지는 (구문 분석기가 만든 @code{Message}가 아니라) 응용 프로그램이 @code{Message}를 프로그래밍 방식으로 수정할 때, 응용 프로그램이 제공한 name과 value로 이 메서드를 호출합니다. 이 메서드는 헤더를 나타내기 위해 @code{Message}에 저장될 @code{(name, value)} 튜플을 반환해야 합니다.

구현이 기존 email 패키지 정책과의 호환성을 유지하기 원한다면, `name'과 `value'는 전달된 인자의 내용을 변경하지 않는 문자열이나 문자열의 서브 클래스여야 합니다.

기본 구현이 없습니다
@end deffn

@geindex header_fetch_parse() (email.policy.Policy 메서드)
@anchor{library/email policy email policy Policy header_fetch_parse}@anchor{3b51}
@deffn {메서드} header_fetch_parse (name, value)

email 패키지는 응용 프로그램이 해당 헤더를 요청할 때 @code{Message}에 현재 저장된 `name'과 `value'로 이 메서드를 호출하며, 메서드가 반환하는 것은 꺼내는 헤더의 값으로 응용 프로그램에 다시 전달됩니다. @code{Message}에 같은 이름을 가진 헤더가 두 개 이상 있을 수 있음에 유의하십시오; 이 메서드로는 응용 프로그램으로 반환될 헤더의 특정 이름과 값이 전달됩니다.

`value'는 서로게이트 이스케이프 된 바이너리 데이터를 포함할 수 있습니다. 이 메서드가 반환하는 값에는 서로게이트 이스케이프 된 바이너리 데이터가 없어야 합니다.

기본 구현이 없습니다
@end deffn

@geindex fold() (email.policy.Policy 메서드)
@anchor{library/email policy email policy Policy fold}@anchor{3b52}
@deffn {메서드} fold (name, value)

email 패키지는 지정된 헤더에 대해 @code{Message}에 현재 저장된 `name'과 `value'로 이 메서드를 호출합니다. 이 메서드는 `name'을 `value'와 합치고 적절한 위치에 @ref{3b47,,linesep} 문자를 삽입하여 (정책 설정에 따라) 올바르게 “접힌(folded)” 헤더를 나타내는 문자열을 반환해야 합니다. 전자 우편 헤더 접기 규칙에 대한 설명은 
@geindex RFC; RFC 5322
RFC 5322@footnote{https://datatracker.ietf.org/doc/html/rfc5322.html}를 참조하십시오.

`value'는 서로게이트 이스케이프 된 바이너리 데이터를 포함할 수 있습니다. 메서드가 반환한 문자열에는 서로게이트 이스케이프 된 바이너리 데이터가 없어야 합니다.
@end deffn

@geindex fold_binary() (email.policy.Policy 메서드)
@anchor{library/email policy email policy Policy fold_binary}@anchor{3b48}
@deffn {메서드} fold_binary (name, value)

반환 값이 문자열이 아니라 바이트열 객체여야 한다는 점을 제외하고는 @ref{3b52,,fold()}와 같습니다.

`value'는 서로게이트 이스케이프 된 바이너리 데이터를 포함할 수 있습니다. 이들은 반환된 바이트열 객체에서 바이너리 데이터로 다시 변환될 수 있습니다.
@end deffn
@end deffn

@geindex EmailPolicy (email.policy 클래스)
@anchor{library/email policy email policy EmailPolicy}@anchor{12bc}
@deffn {클래스} email.policy.EmailPolicy (**kw)

이 구상 @ref{12b8,,Policy}는 현재 전자 우편 RFC를 완전히 준수하기 위한 동작을 제공합니다. 여기에는 
@geindex RFC; RFC 5322
RFC 5322@footnote{https://datatracker.ietf.org/doc/html/rfc5322.html}, 
@geindex RFC; RFC 2047
RFC 2047@footnote{https://datatracker.ietf.org/doc/html/rfc2047.html} 및 현재 MIME RFC가 포함되지만 이에 국한되지는 않습니다.

이 정책은 새로운 헤더 구문 분석과 접기(folding) 알고리즘을 추가합니다. 단순한 문자열 대신, 헤더는 필드 유형에 따라 달라지는 어트리뷰트를 가진 @code{str} 서브 클래스입니다. 구문 분석과 접기 알고리즘은 
@geindex RFC; RFC 2047
RFC 2047@footnote{https://datatracker.ietf.org/doc/html/rfc2047.html}과 
@geindex RFC; RFC 5322
RFC 5322@footnote{https://datatracker.ietf.org/doc/html/rfc5322.html}를 완전히 구현합니다.

@ref{e95,,message_factory} 어트리뷰트의 기본값은 @ref{57f,,EmailMessage}입니다.

모든 정책에 적용되는 위에 나열된 설정 가능 어트리뷰트 외에도, 이 정책은 다음과 같은 어트리뷰트를 추가합니다:


Added in version 3.6: @footnote{
원래 3.3에 @ref{1241,,잠정적 기능}으로 추가되었습니다.
}


@geindex utf8 (email.policy.EmailPolicy의 속성)
@anchor{library/email policy email policy EmailPolicy utf8}@anchor{ff8}
@deffn {속성} utf8

@code{False}이면, 
@geindex RFC; RFC 5322
RFC 5322@footnote{https://datatracker.ietf.org/doc/html/rfc5322.html}를 따르고 헤더에서 ASCII가 아닌 문자를 “인코딩된 단어”로 인코딩하여 지원합니다. @code{True}이면, 
@geindex RFC; RFC 6532
RFC 6532@footnote{https://datatracker.ietf.org/doc/html/rfc6532.html}를 따르고 헤더에 @code{utf-8} 인코딩을 사용합니다. 이러한 방식으로 포맷된 메시지는 @code{SMTPUTF8} 확장(
@geindex RFC; RFC 6531
RFC 6531@footnote{https://datatracker.ietf.org/doc/html/rfc6531.html})을 지원하는 SMTP 서버로 전달될 수 있습니다.
@end deffn

@geindex refold_source (email.policy.EmailPolicy의 속성)
@anchor{library/email policy email policy EmailPolicy refold_source}@anchor{3b3c}
@deffn {속성} refold_source

@code{Message} 객체의 헤더 값이 (프로그램이 설정하는 것과 대조적으로) @ref{52,,parser}에서 온 것이면, 이 어트리뷰트는 메시지를 직렬화된 형식으로 다시 변환할 때 제너레이터가 그 값을 다시 접어야 하는지를 나타냅니다. 가능한 값은 다음과 같습니다:


@multitable {xxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

@code{none}

@tab

모든 소스 값은 원래 접기를 사용합니다

@item

@code{long}

@tab

@code{max_line_length}보다 긴 줄이 있는 소스 값은 다시 접힙니다.

@item

@code{all}

@tab

모든 값이 다시 접힙니다.

@end multitable


기본값은 @code{long}입니다.
@end deffn

@geindex header_factory (email.policy.EmailPolicy의 속성)
@anchor{library/email policy email policy EmailPolicy header_factory}@anchor{3b53}
@deffn {속성} header_factory

@code{name}과 @code{value} 두 개의 인자를 취하는 콜러블. 여기서 @code{name}은 헤더 필드 이름이고 @code{value}는 펼쳐진 헤더 필드 값이며 해당 헤더를 나타내는 문자열 서브 클래스를 반환합니다. 다양한 주소와 날짜 
@geindex RFC; RFC 5322
RFC 5322@footnote{https://datatracker.ietf.org/doc/html/rfc5322.html} 헤더 필드 유형과 주요 MIME 헤더 필드 유형에 대한 사용자 정의 구문 분석을 지원하는 기본 @code{header_factory}(@ref{46,,headerregistry}를 참조하십시오)가 제공됩니다. 향후 추가 사용자 정의 구문 분석에 대한 지원이 추가될 것입니다.
@end deffn

@geindex content_manager (email.policy.EmailPolicy의 속성)
@anchor{library/email policy email policy EmailPolicy content_manager}@anchor{113a}
@deffn {속성} content_manager

적어도 두 개의 메서드가 있는 객체: get_content와 set_content. @ref{57f,,EmailMessage} 객체의 @ref{3b1b,,get_content()}나 @ref{1c5b,,set_content()} 메서드가 호출될 때, 이 객체의 해당 메서드를 호출하는데, 메시지 객체를 첫 번째 인자로 전달하고 전달된 다른 인자와 키워드를 추가 인자로 전달합니다. 기본적으로 @code{content_manager}는 @ref{3b54,,raw_data_manager}로 설정됩니다.


Added in version 3.4.

@end deffn

이 클래스는 다음과 같은 @ref{12b8,,Policy}의 추상 메서드의 구상 구현을 제공합니다:

@geindex header_max_count() (email.policy.EmailPolicy 메서드)
@anchor{library/email policy email policy EmailPolicy header_max_count}@anchor{3b55}
@deffn {메서드} header_max_count (name)

지정된 이름의 헤더를 나타내는 데 사용되는 특수화된 클래스의 @ref{3b56,,max_count} 어트리뷰트 값을 반환합니다.
@end deffn

@geindex header_source_parse() (email.policy.EmailPolicy 메서드)
@anchor{library/email policy email policy EmailPolicy header_source_parse}@anchor{1913}
@deffn {메서드} header_source_parse (sourcelines)

이름은 ‘@code{:}'까지의 모든 것으로 구문 분석되고 수정되지 않은 상태로 반환됩니다. 값은 첫 번째 줄의 나머지 부분에서 선행 공백을 제거한 후에 모든 후속 줄을 이어붙이고 후행 캐리지 리턴이나 줄 바꿈 문자를 제거하여 결정됩니다.
@end deffn

@geindex header_store_parse() (email.policy.EmailPolicy 메서드)
@anchor{library/email policy email policy EmailPolicy header_store_parse}@anchor{3b57}
@deffn {메서드} header_store_parse (name, value)

이름은 변경되지 않고 반환됩니다. 입력값에 @code{name} 어트리뷰트가 있고 대소 문자를 무시하고 `name'과 일치하면, 값은 변경되지 않고 반환됩니다. 그렇지 않으면 `name'과 `value'는 @code{header_factory}로 전달되고, 결과 헤더 객체가 값으로 반환됩니다. 이 경우 입력값에 CR이나 LF 문자가 포함되어 있으면 @code{ValueError}가 발생합니다.
@end deffn

@geindex header_fetch_parse() (email.policy.EmailPolicy 메서드)
@anchor{library/email policy email policy EmailPolicy header_fetch_parse}@anchor{3b58}
@deffn {메서드} header_fetch_parse (name, value)

값에 @code{name} 어트리뷰트가 있으면, 수정되지 않은 상태로 반환됩니다. 그렇지 않으면 `name'과 CR이나 LF 문자가 제거된 `value'가 @code{header_factory}로 전달되고, 결과 헤더 객체가 반환됩니다. 서로게이트 이스케이프 된 바이트열은 유니코드 알 수 없는 문자 글리프(unknown-character glyph)로 바뀝니다.
@end deffn

@geindex fold() (email.policy.EmailPolicy 메서드)
@anchor{library/email policy email policy EmailPolicy fold}@anchor{19f2}
@deffn {메서드} fold (name, value)

헤더 접기는 @ref{3b3c,,refold_source} 정책 설정에 의해 제어됩니다. 값은 @code{name} 어트리뷰트가 없을 때, 그리고 그때만 ‘소스값’으로 간주합니다 (@code{name} 어트리뷰트가 있다는 것은 헤더 객체나 그 일종이라는 뜻입니다). 정책에 따라 소스값을 다시 접어야 할 필요가 있으면, @code{header_factory}에 `name'과 CR과 LF 문자가 제거된 `value'를 전달하여 헤더 객체로 변환됩니다. 헤더 객체의 접기는 현재 정책으로 @code{fold} 메서드를 호출하여 수행됩니다.

소스값은 @ref{145b,,splitlines()}를 사용하여 줄로 분할됩니다. 값을 다시 접지 않으면, 정책의 @code{linesep}을 사용하여 줄을 다시 이어붙인 후에 반환합니다. ASCII가 아닌 바이너리 데이터가 포함된 줄은 예외입니다. 이 경우 @code{refold_source} 설정과 관계없이 값이 다시 접히는데, @code{unknown-8bit} 문자 집합을 사용하여 바이너리 데이터가 CTE로 인코딩됩니다.
@end deffn

@geindex fold_binary() (email.policy.EmailPolicy 메서드)
@anchor{library/email policy email policy EmailPolicy fold_binary}@anchor{3b59}
@deffn {메서드} fold_binary (name, value)

@ref{3b3f,,cte_type}이 @code{7bit}이면, 반환된 값이 바이트열인 것을 제외하고 @ref{19f2,,fold()}와 같습니다.

@ref{3b3f,,cte_type}이 @code{8bit}이면, ASCII가 아닌 바이너리 데이터는 다시 바이트열로 변환됩니다. 바이너리 데이터가 단일 바이트 문자와 멀티 바이트 문자 중 어는 것으로 구성되어 있는지 알 방법이 없어서, @code{refold_header} 설정과 관계없이 바이너리 데이터가 있는 헤더는 다시 접히지 않습니다.
@end deffn
@end deffn

다음 @ref{12bc,,EmailPolicy} 인스턴스는 특정 응용 프로그램 도메인에 적합한 기본값을 제공합니다. 향후 이러한 인스턴스들(특히 @code{HTTP} 인스턴스)의 동작은 그 들의 도메인과 관련된 RFC에 훨씬 더 가깝게 조정될 수 있음에 유의하십시오.

@geindex default (email.policy 모듈)
@anchor{library/email policy email policy default}@anchor{178d}
@deffn {데이터} email.policy.default

모든 기본값이 변경되지 않은 @code{EmailPolicy} 인스턴스. 이 정책은 RFC 올바른 @code{\r\n}이 아닌 표준 파이썬 @code{\n} 줄 종료를 사용합니다.
@end deffn

@geindex SMTP (email.policy 모듈)
@anchor{library/email policy email policy SMTP}@anchor{3b5a}
@deffn {데이터} email.policy.SMTP

전자 우편 RFC를 준수하도록 메시지를 직렬화하는 데 적합합니다. @code{default}와 유사하지만, @code{linesep}이 @code{\r\n}으로 설정되어 RFC를 준수합니다.
@end deffn

@geindex SMTPUTF8 (email.policy 모듈)
@anchor{library/email policy email policy SMTPUTF8}@anchor{3b5b}
@deffn {데이터} email.policy.SMTPUTF8

@ref{ff8,,utf8}가 @code{True}라는 점을 제외하고, @code{SMTP}와 같습니다. 헤더에 인코딩된 단어를 사용하지 않고 메시지를 메시지 저장소로 직렬화하는 데 유용합니다. SMTP 전송에는 발신자나 수신자 주소에 ASCII가 아닌 문자가 있을 때만 사용해야 합니다 (@ref{1059,,smtplib.SMTP.send_message()} 메서드는 이를 자동으로 처리합니다).
@end deffn

@geindex HTTP (email.policy 모듈)
@anchor{library/email policy email policy HTTP}@anchor{3b5c}
@deffn {데이터} email.policy.HTTP

HTTP 트래픽에 사용하기 위해 헤더를 직렬화하는 데 적합합니다. @code{max_line_length}가 @code{None}(무제한)으로 설정된 것을 제외하고, @code{SMTP}와 유사합니다.
@end deffn

@geindex strict (email.policy 모듈)
@anchor{library/email policy email policy strict}@anchor{3b5d}
@deffn {데이터} email.policy.strict

편의 인스턴스. @code{raise_on_defect}가 @code{True}로 설정된 것을 제외하고, @code{default}와 같습니다. 다음과 같이 작성하여 모든 정책을 엄격하게 만들 수 있도록 합니다:

@example
somepolicy + policy.strict
@end example
@end deffn

이러한 모든 @ref{12bc,,EmailPolicy}를 통해, email 패키지의 효과적인 API가 다음과 같은 방식으로 파이썬 3.2 API에서 변경됩니다:


@itemize *

@item 
@ref{580,,Message}에서 헤더를 설정하면 해당 헤더가 구문 분석되고 헤더 객체가 만들어집니다.

@item 
@ref{580,,Message}에서 헤더 값을 가져오면 해당 헤더가 구문 분석되고 헤더 객체가 만들어져 반환됩니다.

@item 
모든 헤더 객체나 정책 설정으로 인해 다시 접힌 모든 헤더는 인코딩된 단어가 필요한 위치와 허용되는 위치를 포함하여 RFC 접기 알고리즘을 완전히 구현하는 알고리즘을 사용하여 접힙니다.
@end itemize

응용 프로그램의 시각에서, 이것은 @ref{57f,,EmailMessage}를 통해 얻은 모든 헤더가 추가 어트리뷰트가 있는 헤더 객체이며, 그것의 문자열 값은 헤더의 완전히 디코딩된 유니코드 값이 됨을 뜻합니다. 마찬가지로, 유니코드 문자열을 사용하여 헤더에 새 값이나 새로 만들어진 헤더를 대입할 수 있으며, 정책은 유니코드 문자열을 올바른 RFC 인코딩 형식으로 변환합니다.

헤더 객체와 그들의 어트리뷰트는 @ref{46,,headerregistry}에 설명되어 있습니다.

@geindex Compat32 (email.policy 클래스)
@anchor{library/email policy email policy Compat32}@anchor{12b9}
@deffn {클래스} email.policy.Compat32 (**kw)

This concrete @ref{12b8,,Policy} is the backward compatibility policy.  It
replicates the behavior of the email package in Python 3.2.  The
@code{policy} module also defines an instance of this class,
@ref{e96,,compat32}, that is used as the default policy.  Thus the default
behavior of the email package is to maintain compatibility with Python 3.2.

다음 어트리뷰트는 @ref{12b8,,Policy} 기본값과 다른 값을 갖습니다:

@geindex mangle_from_ (email.policy.Compat32의 속성)
@anchor{library/email policy email policy Compat32 mangle_from_}@anchor{3b5e}
@deffn {속성} mangle_from_

기본값은 @code{True}입니다.
@end deffn

이 클래스는 다음과 같은 @ref{12b8,,Policy}의 추상 메서드의 구상 구현을 제공합니다:

@geindex header_source_parse() (email.policy.Compat32 메서드)
@anchor{library/email policy email policy Compat32 header_source_parse}@anchor{1914}
@deffn {메서드} header_source_parse (sourcelines)

이름은 ‘@code{:}'까지의 모든 것으로 구문 분석되고 수정되지 않은 상태로 반환됩니다. 값은 첫 번째 줄의 나머지 부분에서 선행 공백을 제거한 후에 모든 후속 줄을 이어붙이고 후행 캐리지 리턴이나 줄 바꿈 문자를 제거하여 결정됩니다.
@end deffn

@geindex header_store_parse() (email.policy.Compat32 메서드)
@anchor{library/email policy email policy Compat32 header_store_parse}@anchor{3b5f}
@deffn {메서드} header_store_parse (name, value)

이름과 값은 수정되지 않은 상태로 반환됩니다.
@end deffn

@geindex header_fetch_parse() (email.policy.Compat32 메서드)
@anchor{library/email policy email policy Compat32 header_fetch_parse}@anchor{3b60}
@deffn {메서드} header_fetch_parse (name, value)

값에 바이너리 데이터가 포함되어 있으면, @code{unknown-8bit} 문자 집합을 사용하여 @ref{1c5c,,Header} 객체로 변환됩니다. 그렇지 않으면 수정되지 않은 상태로 반환됩니다.
@end deffn

@geindex fold() (email.policy.Compat32 메서드)
@anchor{library/email policy email policy Compat32 fold}@anchor{3b61}
@deffn {메서드} fold (name, value)

@ref{1c5c,,Header} 접기 알고리즘을 사용하여 헤더를 접습니다. 이 알고리즘은 값의 기존 줄 바꿈을 유지하고, 각 결과 줄을 @code{max_line_length}로 줄 넘김 합니다. ASCII가 아닌 바이너리 데이터는 @code{unknown-8bit} 문자 집합을 사용하여 CTE 인코딩됩니다.
@end deffn

@geindex fold_binary() (email.policy.Compat32 메서드)
@anchor{library/email policy email policy Compat32 fold_binary}@anchor{3b62}
@deffn {메서드} fold_binary (name, value)

@ref{1c5c,,Header} 접기 알고리즘을 사용하여 헤더를 접습니다. 이 알고리즘은 값의 기존 줄 바꿈을 유지하고, 각 결과 줄을 @code{max_line_length}로 줄 넘김 합니다. @code{cte_type}이 @code{7bit}이면, ASCII가 아닌 바이너리 데이터는 @code{unknown-8bit} 문자 집합을 사용하여 CTE 인코딩됩니다. 그렇지 않으면 원본 소스 헤더가 사용되는데, 기존 줄 바꿈과 임의의 (RFC 유효하지 않은) 바이너리 데이터가 포함될 수 있습니다.
@end deffn
@end deffn

@geindex compat32 (email.policy 모듈)
@anchor{library/email policy email policy compat32}@anchor{e96}
@deffn {데이터} email.policy.compat32

파이썬 3.2 email 패키지 동작과의 호환성을 제공하는 @ref{12b9,,Compat32}의 인스턴스.

@cartouche
@quotation 참고 
The @ref{e96,,compat32} policy should not be used as a policy for
@ref{57f,,EmailMessage} objects, and should only be used
to serialize messages that were created using the @code{compat32}
policy.
@end quotation
@end cartouche
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node email errors 예외와 결함 클래스,email headerregistry 사용자 정의 헤더 객체,email policy 정책 객체,email — 전자 메일과 MIME 처리 패키지
@anchor{library/email errors doc}@anchor{3b63}@anchor{library/email errors email-errors-exception-and-defect-classes}@anchor{3b64}@anchor{library/email errors module-email errors}@anchor{43}@anchor{library/email errors translation-repo}@anchor{3b65}
@subsubsection @code{email.errors}: 예외와 결함 클래스


@geindex module; email.errors

`소스 코드:' Lib/email/errors.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/email/errors.py}


__________________________________________________________________


The following exception classes are defined in the @code{email.errors} module:

@geindex MessageError
@anchor{library/email errors email errors MessageError}@anchor{3b66}
@deffn {예외} email.errors.MessageError

이것은 @ref{3f,,email} 패키지가 발생시킬 수 있는 모든 예외의 베이스 클래스입니다. 표준 @ref{bcc,,Exception} 클래스에서 파생되며 추가 메서드를 정의하지 않습니다.
@end deffn

@geindex MessageParseError
@anchor{library/email errors email errors MessageParseError}@anchor{3b67}
@deffn {예외} email.errors.MessageParseError

이것은 @ref{13a2,,Parser} 클래스에서 발생하는 예외의 베이스 클래스입니다. @ref{3b66,,MessageError}에서 파생됩니다. 이 클래스는 @ref{46,,headerregistry}에서 사용하는 구문 분석기에서도 내부적으로 사용됩니다.
@end deffn

@geindex HeaderParseError
@anchor{library/email errors email errors HeaderParseError}@anchor{3b11}
@deffn {예외} email.errors.HeaderParseError

메시지의 
@geindex RFC; RFC 5322
RFC 5322@footnote{https://datatracker.ietf.org/doc/html/rfc5322.html} 헤더를 구문 분석할 때 일부 에러 조건에서 발생합니다. 이 클래스는 @ref{3b67,,MessageParseError}에서 파생됩니다. 메서드가 호출될 때 콘텐츠 유형을 알 수 없으면, @ref{3b10,,set_boundary()} 메서드는 이 에러를 발생시킵니다. @ref{1c5c,,Header}는 특정 base64 디코딩 에러와 내장된 헤더를 포함하는 것으로 보이는 헤더를 만들려고 할 때 (즉, 연장 줄(continuation line)이어야 할 곳에 선행 공백이 없고 헤더처럼 보이는 것이 있을 때) 이 에러를 발생시킬 수 있습니다.
@end deffn

@geindex BoundaryError
@anchor{library/email errors email errors BoundaryError}@anchor{3b68}
@deffn {예외} email.errors.BoundaryError

폐지되었고 더는 사용되지 않습니다.
@end deffn

@geindex MultipartConversionError
@anchor{library/email errors email errors MultipartConversionError}@anchor{3b69}
@deffn {예외} email.errors.MultipartConversionError

@ref{3b6a,,MIMENonMultipart}에서 파생된 클래스(가령 @ref{3b6b,,MIMEImage})의 인스턴스에서 @ref{3b22,,attach()} 메서드를 호출할 때 발생합니다. @ref{3b69,,MultipartConversionError}는 @ref{3b66,,MessageError}와 내장 @ref{198,,TypeError}에서 다중 상속됩니다.
@end deffn

@geindex HeaderWriteError
@anchor{library/email errors email errors HeaderWriteError}@anchor{3b4b}
@deffn {예외} email.errors.HeaderWriteError

Raised when an error occurs when the @ref{44,,generator} outputs
headers.
@end deffn

@geindex MessageDefect
@anchor{library/email errors email errors MessageDefect}@anchor{3b4d}
@deffn {예외} email.errors.MessageDefect

이메일 메시지를 구문 분석할 때 발견되는 모든 결함에 대한 베이스 클래스입니다. @ref{2ec,,ValueError}에서 파생됩니다.
@end deffn

@geindex HeaderDefect
@anchor{library/email errors email errors HeaderDefect}@anchor{3b6c}
@deffn {예외} email.errors.HeaderDefect

이메일 헤더를 구문 분석할 때 발견되는 모든 결함에 대한 베이스 클래스입니다. @ref{3b4d,,MessageDefect}에서 파생됩니다.
@end deffn

다음은 메시지를 구문 분석하는 동안 @ref{178c,,FeedParser}가 찾을 수 있는 결함 목록입니다. 문제가 발견된 메시지에 결함이 추가됨에 유의하십시오. 그래서, 예를 들어, @code{multipart/alternative} 내에 중첩된 메시지에 잘못된 헤더가 있으면, 해당 중첩 메시지 객체가 결함을 갖게 되지만 포함하는 메시지는 그렇지 않습니다.

모든 결함 클래스는 @ref{3b4d,,email.errors.MessageDefect}의 서브 클래스입니다.

@geindex NoBoundaryInMultipartDefect
@anchor{library/email errors email errors NoBoundaryInMultipartDefect}@anchor{3b6d}
@deffn {예외} email.errors.NoBoundaryInMultipartDefect

메시지가 멀티 파트라고 주장했지만, @code{boundary} 파라미터가 없습니다.
@end deffn

@geindex StartBoundaryNotFoundDefect
@anchor{library/email errors email errors StartBoundaryNotFoundDefect}@anchor{3b6e}
@deffn {예외} email.errors.StartBoundaryNotFoundDefect

@code{Content-Type} 헤더에서 주장하는 시작 경계를 찾지 못했습니다.
@end deffn

@geindex CloseBoundaryNotFoundDefect
@anchor{library/email errors email errors CloseBoundaryNotFoundDefect}@anchor{3b6f}
@deffn {예외} email.errors.CloseBoundaryNotFoundDefect

시작 경계가 발견되었지만, 해당하는 종료 경계가 발견되지 않았습니다.


Added in version 3.3.

@end deffn

@geindex FirstHeaderLineIsContinuationDefect
@anchor{library/email errors email errors FirstHeaderLineIsContinuationDefect}@anchor{3b70}
@deffn {예외} email.errors.FirstHeaderLineIsContinuationDefect

메시지의 첫 번째 헤더 줄에 연장 줄(continuation line)이 있습니다.
@end deffn

@geindex MisplacedEnvelopeHeaderDefect
@anchor{library/email errors email errors MisplacedEnvelopeHeaderDefect}@anchor{3b71}
@deffn {예외} email.errors.MisplacedEnvelopeHeaderDefect

헤더 블록 중간에 “Unix From” 헤더가 있습니다.
@end deffn

@geindex MissingHeaderBodySeparatorDefect
@anchor{library/email errors email errors MissingHeaderBodySeparatorDefect}@anchor{3b72}
@deffn {예외} email.errors.MissingHeaderBodySeparatorDefect

헤더를 구문 분석하는 중에 선행 공백이 없지만 ‘:’ 가 포함되지 않은 줄이 발견되었습니다. 그 줄이 본문의 첫 번째 줄을 나타내는 것으로 가정하여 구문 분석이 계속됩니다.


Added in version 3.3.

@end deffn

@geindex MalformedHeaderDefect
@anchor{library/email errors email errors MalformedHeaderDefect}@anchor{3b73}
@deffn {예외} email.errors.MalformedHeaderDefect

콜론이 없거나 다른 식으로 잘못된 헤더가 발견되었습니다.


버전 3.3부터 폐지됨: 이 결함은 여러 파이썬 버전에서 사용되지 않았습니다.

@end deffn

@geindex MultipartInvariantViolationDefect
@anchor{library/email errors email errors MultipartInvariantViolationDefect}@anchor{3b38}
@deffn {예외} email.errors.MultipartInvariantViolationDefect

메시지가 @code{multipart}라고 주장했지만, 서브 파트가 없습니다. 메시지에 이 결함이 있으면, 콘텐츠 유형이 @code{multipart}라고 주장하더라도 @ref{3b15,,is_multipart()} 메서드는 @code{False}를 반환할 수 있음에 유의하십시오.
@end deffn

@geindex InvalidBase64PaddingDefect
@anchor{library/email errors email errors InvalidBase64PaddingDefect}@anchor{3b74}
@deffn {예외} email.errors.InvalidBase64PaddingDefect

base64로 인코딩된 바이트열 블록을 디코딩할 때, 패딩이 올바르지 않습니다. 디코딩을 수행하기 위해 충분한 패딩이 추가되지만, 바이트열을 디코딩한 결과는 유효하지 않을 수 있습니다.
@end deffn

@geindex InvalidBase64CharactersDefect
@anchor{library/email errors email errors InvalidBase64CharactersDefect}@anchor{3b75}
@deffn {예외} email.errors.InvalidBase64CharactersDefect

base64로 인코딩된 바이트열 블록을 디코딩할 때, base64 알파벳 이외의 문자가 발견되었습니다. 문자는 무시되지만, 바이트열을 디코딩한 결과는 유효하지 않을 수 있습니다.
@end deffn

@geindex InvalidBase64LengthDefect
@anchor{library/email errors email errors InvalidBase64LengthDefect}@anchor{3b76}
@deffn {예외} email.errors.InvalidBase64LengthDefect

base64로 인코딩된 바이트열 블록을 디코딩할 때, 비 패딩 base64 문자 수가 유효하지 않습니다 (4의 배수보다 1이 큽니다). 인코딩된 블록은 그대로 유지됩니다.
@end deffn

@geindex InvalidDateDefect
@anchor{library/email errors email errors InvalidDateDefect}@anchor{3b77}
@deffn {예외} email.errors.InvalidDateDefect

When decoding an invalid or unparsable date field.  The original value is
kept as-is.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node email headerregistry 사용자 정의 헤더 객체,email contentmanager MIME 콘텐츠 관리,email errors 예외와 결함 클래스,email — 전자 메일과 MIME 처리 패키지
@anchor{library/email headerregistry doc}@anchor{3b78}@anchor{library/email headerregistry email-headerregistry-custom-header-objects}@anchor{3b79}@anchor{library/email headerregistry module-email headerregistry}@anchor{46}@anchor{library/email headerregistry translation-repo}@anchor{3b7a}
@subsubsection @code{email.headerregistry}: 사용자 정의 헤더 객체


@geindex module; email.headerregistry

`소스 코드:' Lib/email/headerregistry.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/email/headerregistry.py}


__________________________________________________________________



Added in version 3.6: @footnote{
원래 3.3에서 @ref{1241,,잠정적 모듈}로 추가되었습니다.
}


헤더는 @ref{169,,str}의 사용자 정의된 서브 클래스로 표현됩니다. 주어진 헤더를 표현하는 데 사용되는 특정 클래스는 헤더가 만들어질 때 @ref{53,,policy}의 @ref{3b53,,header_factory}에 의해 결정됩니다. 이 섹션에서는 
@geindex RFC; RFC 5322
RFC 5322@footnote{https://datatracker.ietf.org/doc/html/rfc5322.html} 호환 전자 우편 메시지를 처리하기 위해 email 패키지가 구현한 특정 @code{header_factory}에 관해 설명합니다. 다양한 헤더 유형에 대해 사용자 정의된 헤더 객체를 제공할 뿐만 아니라, 응용 프로그램에서 고유한 사용자 정의 헤더 유형을 추가할 수 있는 확장 메커니즘을 제공합니다.

@ref{12bc,,EmailPolicy}에서 파생된 정책 객체를 사용할 때, 모든 헤더는 @ref{3b7b,,HeaderRegistry}가 생성하며 마지막 베이스 클래스로 @ref{3afd,,BaseHeader}를 갖습니다. 각 헤더 클래스에는 헤더 유형에 따라 결정되는 추가 베이스 클래스가 있습니다. 예를 들어, 많은 헤더에는 다른 베이스 클래스로 @ref{3b7c,,UnstructuredHeader} 클래스를 갖습니다. 헤더의 특수화된 두 번째 클래스는 @code{HeaderRegistry}에 저장된 검색 테이블을 사용하여 헤더의 이름으로 결정됩니다. 이 모든 것은 일반적인 응용 프로그램에 대해 투명하게 관리되지만, 더욱 복잡한 응용 프로그램에서 사용할 수 있도록 기본 동작을 수정하기 위한 인터페이스가 제공됩니다.

아래 섹션은 먼저 헤더 베이스 클래스와 그들의 어트리뷰트를, 그다음으로 @ref{3b7b,,HeaderRegistry}의 동작을 수정하기 위한 API를, 그리고 마지막으로 구조화된 헤더에서 구문 분석된 데이터를 나타내는 데 사용되는 지원 클래스에를 설명합니다.

@geindex BaseHeader (email.headerregistry 클래스)
@anchor{library/email headerregistry email headerregistry BaseHeader}@anchor{3afd}
@deffn {클래스} email.headerregistry.BaseHeader (name, value)

`name'과 `value'는 @ref{3b53,,header_factory} 호출에서 @code{BaseHeader}로 전달됩니다. 헤더 객체의 문자열 값은 유니코드로 완전히 디코딩된 `value'입니다.

이 베이스 클래스는 다음과 같은 읽기 전용 프로퍼티를 정의합니다:

@geindex name (email.headerregistry.BaseHeader의 속성)
@anchor{library/email headerregistry email headerregistry BaseHeader name}@anchor{3b7d}
@deffn {속성} name

헤더 이름(‘:’ 앞의 필드 부분). 이것은 정확히 @ref{3b53,,header_factory} 호출에 전달된 `name'에 대한 값입니다; 즉, 대소 문자가 유지됩니다.
@end deffn

@geindex defects (email.headerregistry.BaseHeader의 속성)
@anchor{library/email headerregistry email headerregistry BaseHeader defects}@anchor{3b7e}
@deffn {속성} defects

구문 분석 중 발견된 RFC 준수 문제를 보고하는 @ref{3b6c,,HeaderDefect} 인스턴스 튜플. email 패키지는 규정 준수 문제 감지에 대해 완전해지려고 합니다. 보고될 수 있는 결함 유형에 대한 설명은 @ref{43,,errors} 모듈을 참조하십시오.
@end deffn

@geindex max_count (email.headerregistry.BaseHeader의 속성)
@anchor{library/email headerregistry email headerregistry BaseHeader max_count}@anchor{3b56}
@deffn {속성} max_count

같은 @code{name}을 가질 수 있는 이 유형의 최대 헤더 수. @code{None} 값은 무제한을 의미합니다. 이 어트리뷰트의 @code{BaseHeader} 값은 @code{None}입니다; 특수화된 헤더 클래스가 필요할 때 이 값을 재정의할 것으로 기대됩니다.
@end deffn

@code{BaseHeader}는 또한 email 라이브러리 코드에 의해 호출되고 일반적으로 응용 프로그램이 호출해서는 안 되는 다음 메서드를 제공합니다:

@geindex fold() (email.headerregistry.BaseHeader 메서드)
@anchor{library/email headerregistry email headerregistry BaseHeader fold}@anchor{3b7f}
@deffn {메서드} fold (*, policy)

`policy'에 따라 헤더를 올바르게 접는 데 필요한 @ref{3b47,,linesep} 문자를 포함하는 문자열을 반환합니다. 헤더는 임의의 바이너리 데이터를 포함할 수 없어서, @code{8bit}의 @ref{3b3f,,cte_type}은 마치 @code{7bit}인 것처럼 처리됩니다. @ref{ff8,,utf8}이 @code{False}이면, 비 ASCII 데이터는 
@geindex RFC; RFC 2047
RFC 2047@footnote{https://datatracker.ietf.org/doc/html/rfc2047.html}로 인코딩됩니다.
@end deffn

@code{BaseHeader} 자체는 헤더 객체를 만드는 데 사용할 수 없습니다. 헤더 객체를 생성하기 위해 각 특수화된 헤더가 협력하는 프로토콜을 정의합니다. 특히 @code{BaseHeader}는 특수화된 클래스가 @code{parse}라는 @ref{48f,,classmethod()}를 제공할 것을 요구합니다. 이 메서드는 다음과 같이 호출됩니다:

@example
parse(string, kwds)
@end example

@code{kwds}는 하나의 미리 초기화된 키 @code{defects}를 포함하는 딕셔너리입니다. @code{defects}는 빈 리스트입니다. parse 메서드는 감지된 결함을 이 리스트에 추가해야 합니다. 반환될 때, @code{kwds} 딕셔너리는 `반드시' 적어도 키 @code{decoded}와 @code{defects}에 대한 값을 포함해야 합니다. @code{decoded}는 헤더의 문자열 값이어야 합니다 (즉, 유니코드로 완전히 디코딩된 헤더 값). parse 메서드는 `string'이 콘텐츠 전송 인코딩된 파트를 포함할 수 있다고 가정해야 하지만, 인코딩되지 않은 헤더 값을 구문 분석할 수 있도록 모든 유효한 유니코드 문자도 올바르게 처리해야 합니다.

@code{BaseHeader}의 @code{__new__}는 헤더 인스턴스를 만들고, @code{init} 메서드를 호출합니다. 특수화된 클래스가 @code{BaseHeader} 자체에서 제공하는 것 이상의 추가 어트리뷰트를 설정하려면 @code{init} 메서드 만 제공하면 됩니다. 이러한 @code{init} 메서드는 다음과 같아야 합니다:

@example
def init(self, /, *args, **kw):
    self._myattr = kw.pop('myattr')
    super().init(*args, **kw)
@end example

즉, 특수화된 클래스가 @code{kwds} 딕셔너리에 추가하는 것은 제거해야 하고 처리해야 하며, @code{kw}(및 @code{args})의 나머지 내용은 @code{BaseHeader} @code{init} 메서드로 전달됩니다.
@end deffn

@geindex UnstructuredHeader (email.headerregistry 클래스)
@anchor{library/email headerregistry email headerregistry UnstructuredHeader}@anchor{3b7c}
@deffn {클래스} email.headerregistry.UnstructuredHeader

“구조화되지 않은” 헤더는 
@geindex RFC; RFC 5322
RFC 5322@footnote{https://datatracker.ietf.org/doc/html/rfc5322.html}의 기본 헤더 유형입니다. 지정된 문법이 없는 헤더는 구조화되지 않은 것으로 취급됩니다. 구조화되지 않은 헤더의 전형적인 예는 @code{Subject} 헤더입니다.

@geindex RFC; RFC 5322
RFC 5322@footnote{https://datatracker.ietf.org/doc/html/rfc5322.html}에서, 구조화되지 않은 헤더는 ASCII 문자 집합에서 임의의 텍스트를 나열합니다. 그러나 
@geindex RFC; RFC 2047
RFC 2047@footnote{https://datatracker.ietf.org/doc/html/rfc2047.html}은 비 ASCII 텍스트를 헤더 값 내에서 ASCII 문자로 인코딩하기 위한 
@geindex RFC; RFC 5322
RFC 5322@footnote{https://datatracker.ietf.org/doc/html/rfc5322.html} 호환 메커니즘을 가지고 있습니다. 인코딩된 단어를 포함하는 `value'가 생성자에 전달되면, @code{UnstructuredHeader} 구문 분석기는 구조화되지 않은 텍스트의 
@geindex RFC; RFC 2047
RFC 2047@footnote{https://datatracker.ietf.org/doc/html/rfc2047.html} 규칙에 따라 인코딩된 단어를 유니코드로 변환합니다. 구문 분석기는 휴리스틱을 사용하여 특정 비 호환 인코딩된 단어를 디코딩하려고 시도합니다. 인코딩된 단어나 인코딩되지 않는 텍스트 내의 유효하지 않은 문자와 같은 문제에 대한 결함뿐만 아니라 이럴 때 결함을 등록합니다.

이 헤더 유형은 추가 어트리뷰트를 제공하지 않습니다.
@end deffn

@geindex DateHeader (email.headerregistry 클래스)
@anchor{library/email headerregistry email headerregistry DateHeader}@anchor{3b80}
@deffn {클래스} email.headerregistry.DateHeader

@geindex RFC; RFC 5322
RFC 5322@footnote{https://datatracker.ietf.org/doc/html/rfc5322.html}는 전자 우편 헤더 내의 날짜에 대해 매우 구체적인 형식을 지정합니다. @code{DateHeader} 구문 분석기는 이 날짜 형식을 인식할 뿐만 아니라, “야생”에서 발견되는 다양한 변종 형식을 인식합니다.

이 헤더 유형은 다음과 같은 추가 어트리뷰트를 제공합니다:

@geindex datetime (email.headerregistry.DateHeader의 속성)
@anchor{library/email headerregistry email headerregistry DateHeader datetime}@anchor{3b81}
@deffn {속성} datetime

헤더 값이 한 양식이나 다른 양식의 유효한 날짜로 인식될 수 있으면, 이 어트리뷰트는 해당 날짜를 나타내는 @ref{4e2,,datetime} 인스턴스가 포함됩니다. 입력 날짜의 시간대가 @code{-0000}으로 지정되면 (UTC이지만 소스 시간대에 대한 정보는 포함하지 않음을 나타냅니다), @ref{3b81,,datetime}은 나이브 @code{datetime}이 됩니다. 특정 시간대 오프셋이 발견되면 (@code{+0000}을 포함합니다), @code{datetime}에는 @ref{12c4,,datetime.timezone}을 사용하여 시간대 오프셋을 기록하는 어웨어 @code{datetime}이 포함됩니다.
@end deffn

헤더의 @code{decoded} 값은 
@geindex RFC; RFC 5322
RFC 5322@footnote{https://datatracker.ietf.org/doc/html/rfc5322.html} 규칙에 따라 @code{datetime}을 포매팅해서 결정됩니다; 즉, 다음과 같이 설정됩니다:

@example
email.utils.format_datetime(self.datetime)
@end example

@code{DateHeader}를 만들 때, `value'는 @ref{4e2,,datetime} 인스턴스일 수 있습니다. 이것은, 예를 들어, 다음 코드가 유효하고 기대하는 것을 수행함을 뜻합니다:

@example
msg['Date'] = datetime(2011, 7, 15, 21)
@end example

이것은 나이브 @code{datetime}이므로 UTC 타임스탬프로 해석되며 결괏값의 시간대는 @code{-0000}입니다. @ref{54,,utils} 모듈의 @ref{2f7,,localtime()} 함수를 사용하는 것이 훨씬 더 유용합니다:

@example
msg['Date'] = utils.localtime()
@end example

이 예에서는 현재 시간대 오프셋을 사용하여 날짜 헤더를 현재 시간과 날짜로 설정합니다.
@end deffn

@geindex AddressHeader (email.headerregistry 클래스)
@anchor{library/email headerregistry email headerregistry AddressHeader}@anchor{3b82}
@deffn {클래스} email.headerregistry.AddressHeader

주소 헤더는 가장 복잡한 구조화된 헤더 유형 중 하나입니다. @code{AddressHeader} 클래스는 모든 주소 헤더에 대한 범용 인터페이스를 제공합니다.

이 헤더 유형은 다음과 같은 추가 어트리뷰트를 제공합니다:

@geindex groups (email.headerregistry.AddressHeader의 속성)
@anchor{library/email headerregistry email headerregistry AddressHeader groups}@anchor{3b83}
@deffn {속성} groups

헤더 값에서 찾은 주소와 그룹을 인코딩하는 @ref{3b84,,Group} 객체의 튜플. 그룹 일부가 아닌 주소는 이 목록에서 @ref{3b85,,display_name}이 @code{None}인 단일 주소 @code{Groups}로 표현됩니다.
@end deffn

@geindex addresses (email.headerregistry.AddressHeader의 속성)
@anchor{library/email headerregistry email headerregistry AddressHeader addresses}@anchor{3b86}
@deffn {속성} addresses

헤더 값의 모든 개별 주소를 인코딩하는 @ref{3b87,,Address} 객체의 튜플. 헤더 값이 그룹을 포함하면, 그룹의 개별 주소가 값에서 그룹이 발생하는 지점에서 목록에 포함됩니다 (즉, 주소 목록은 1차원 목록으로 “평평하게” 만들어집니다).
@end deffn

헤더의 @code{decoded} 값에서는 모든 인코딩된 단어가 유니코드로 디코딩됩니다. @ref{56,,idna}로 인코딩된 도메인 이름도 유니코드로 디코딩됩니다. @code{decoded} 값은 @code{groups} 어트리뷰트 요소의 @ref{169,,str} 값을 @code{', '}로 @ref{2651,,이어 붙여} 설정됩니다.

@ref{3b87,,Address}와 @ref{3b84,,Group} 객체의 목록을 임의 조합한 목록을 주소 헤더의 값을 설정하는 데 사용할 수 있습니다. @code{display_name}이 @code{None}인 @code{Group} 객체는 단일 주소로 해석되므로, 소스 헤더의 @code{groups} 어트리뷰트에서 얻은 목록을 사용하여 주소 목록을 그룹과 함께 그대로 복사할 수 있습니다.
@end deffn

@geindex SingleAddressHeader (email.headerregistry 클래스)
@anchor{library/email headerregistry email headerregistry SingleAddressHeader}@anchor{3b88}
@deffn {클래스} email.headerregistry.SingleAddressHeader

하나의 추가 어트리뷰트를 추가하는 @ref{3b82,,AddressHeader}의 서브 클래스:

@geindex address (email.headerregistry.SingleAddressHeader의 속성)
@anchor{library/email headerregistry email headerregistry SingleAddressHeader address}@anchor{3b89}
@deffn {속성} address

헤더 값으로 인코딩된 단일 주소. 헤더 값에 실제로 둘 이상의 주소가 포함될 때 (기본 @ref{53,,policy}에서 RFC 위반입니다), 이 어트리뷰트에 액세스하면 @ref{2ec,,ValueError}가 발생합니다.
@end deffn
@end deffn

위의 많은 클래스에는 @code{Unique} 변형도 있습니다 (예를 들어, @code{UniqueUnstructuredHeader}). 유일한 차이점은 @code{Unique} 변형에서 @ref{3b56,,max_count}가 1로 설정되어 있다는 것입니다.

@geindex MIMEVersionHeader (email.headerregistry 클래스)
@anchor{library/email headerregistry email headerregistry MIMEVersionHeader}@anchor{3b8a}
@deffn {클래스} email.headerregistry.MIMEVersionHeader

@code{MIME-Version} 헤더에는 실제로 하나의 유효한 값만 있으며, 이는 @code{1.0}입니다. 미래에 안전하기 위해, 이 헤더 클래스는 다른 유효한 버전 번호를 지원합니다. 버전 번호가 
@geindex RFC; RFC 2045
RFC 2045@footnote{https://datatracker.ietf.org/doc/html/rfc2045.html}에 따라 유효한 값을 가지면, 헤더 객체는 다음 어트리뷰트에 @code{None}이 아닌 값을 갖습니다:

@geindex version (email.headerregistry.MIMEVersionHeader의 속성)
@anchor{library/email headerregistry email headerregistry MIMEVersionHeader version}@anchor{3b8b}
@deffn {속성} version

공백 및/또는 주석이 제거된 문자열 버전 번호.
@end deffn

@geindex major (email.headerregistry.MIMEVersionHeader의 속성)
@anchor{library/email headerregistry email headerregistry MIMEVersionHeader major}@anchor{3b8c}
@deffn {속성} major

정수 주 버전 번호
@end deffn

@geindex minor (email.headerregistry.MIMEVersionHeader의 속성)
@anchor{library/email headerregistry email headerregistry MIMEVersionHeader minor}@anchor{3b8d}
@deffn {속성} minor

정수 부 버전 번호
@end deffn
@end deffn

@geindex ParameterizedMIMEHeader (email.headerregistry 클래스)
@anchor{library/email headerregistry email headerregistry ParameterizedMIMEHeader}@anchor{3b8e}
@deffn {클래스} email.headerregistry.ParameterizedMIMEHeader

MIME 헤더는 모두 접두사 ‘Content-‘로 시작합니다. 각 특정 헤더에는 해당 헤더의 클래스에 설명된 특정 값이 있습니다. 일부는 공통 형식을 가진 보조 파라미터 목록을 취할 수도 있습니다. 이 클래스는 파라미터를 취하는 모든 MIME 헤더의 베이스로 사용됩니다.

@geindex params (email.headerregistry.ParameterizedMIMEHeader의 속성)
@anchor{library/email headerregistry email headerregistry ParameterizedMIMEHeader params}@anchor{3b0b}
@deffn {속성} params

파라미터 이름을 파라미터값으로 매핑하는 딕셔너리.
@end deffn
@end deffn

@geindex ContentTypeHeader (email.headerregistry 클래스)
@anchor{library/email headerregistry email headerregistry ContentTypeHeader}@anchor{3b8f}
@deffn {클래스} email.headerregistry.ContentTypeHeader

@code{Content-Type} 헤더를 처리하는 @ref{3b8e,,ParameterizedMIMEHeader} 클래스.

@geindex content_type (email.headerregistry.ContentTypeHeader의 속성)
@anchor{library/email headerregistry email headerregistry ContentTypeHeader content_type}@anchor{3b90}
@deffn {속성} content_type

@code{maintype/subtype} 형식의 콘텐츠 유형 문자열.
@end deffn

@geindex maintype (email.headerregistry.ContentTypeHeader의 속성)
@anchor{library/email headerregistry email headerregistry ContentTypeHeader maintype}@anchor{3b91}
@deffn {속성} maintype
@end deffn

@geindex subtype (email.headerregistry.ContentTypeHeader의 속성)
@anchor{library/email headerregistry email headerregistry ContentTypeHeader subtype}@anchor{3b92}
@deffn {속성} subtype
@end deffn
@end deffn

@geindex ContentDispositionHeader (email.headerregistry 클래스)
@anchor{library/email headerregistry email headerregistry ContentDispositionHeader}@anchor{3b93}
@deffn {클래스} email.headerregistry.ContentDispositionHeader

@code{Content-Disposition} 헤더를 처리하는 @ref{3b8e,,ParameterizedMIMEHeader} 클래스.

@geindex content_disposition (email.headerregistry.ContentDispositionHeader의 속성)
@anchor{library/email headerregistry email headerregistry ContentDispositionHeader content_disposition}@anchor{3b94}
@deffn {속성} content_disposition

@code{inline}과 @code{attachment}가 일반적으로 사용되는 유일하게 유효한 값입니다.
@end deffn
@end deffn

@geindex ContentTransferEncodingHeader (email.headerregistry 클래스)
@anchor{library/email headerregistry email headerregistry ContentTransferEncodingHeader}@anchor{3b95}
@deffn {클래스} email.headerregistry.ContentTransferEncodingHeader

@code{Content-Transfer-Encoding} 헤더를 처리합니다.

@geindex cte (email.headerregistry.ContentTransferEncodingHeader의 속성)
@anchor{library/email headerregistry email headerregistry ContentTransferEncodingHeader cte}@anchor{3b96}
@deffn {속성} cte

유효한 값은 @code{7bit}, @code{8bit}, @code{base64} 및 @code{quoted-printable}입니다. 자세한 정보는 
@geindex RFC; RFC 2045
RFC 2045@footnote{https://datatracker.ietf.org/doc/html/rfc2045.html}를 참조하십시오.
@end deffn
@end deffn

@geindex HeaderRegistry (email.headerregistry 클래스)
@anchor{library/email headerregistry email headerregistry HeaderRegistry}@anchor{3b7b}
@deffn {클래스} email.headerregistry.HeaderRegistry (base_class=BaseHeader, default_class=UnstructuredHeader, use_default_map=True)

기본적으로 @ref{12bc,,EmailPolicy}에서 사용되는 팩토리입니다. @code{HeaderRegistry}는 `base_class'와 보유한 등록소에서 꺼낸 특수화된 클래스를 사용하여 헤더 인스턴스를 동적으로 만드는 데 사용되는 클래스를 구축합니다. 지정된 헤더 이름이 등록소에 나타나지 않으면, `default_class'에 의해 지정된 클래스가 특수화된 클래스로 사용됩니다. `use_default_map'이 @code{True}(기본값)이면, 헤더 이름에서 클래스로의 표준 매핑이 초기화 중에 등록소에 복사됩니다. `base_class'는 항상 생성된 클래스의 @ref{16b1,,__bases__} 목록에서 마지막 클래스입니다.

기본 매핑은 다음과 같습니다:

@quotation

@*subject: 
UniqueUnstructuredHeader


@*date: 
UniqueDateHeader


@*resent-date: 
DateHeader


@*orig-date: 
UniqueDateHeader


@*sender: 
UniqueSingleAddressHeader


@*resent-sender: 
SingleAddressHeader


@*to: 
UniqueAddressHeader


@*resent-to: 
AddressHeader


@*cc: 
UniqueAddressHeader


@*resent-cc: 
AddressHeader


@*bcc: 
UniqueAddressHeader


@*resent-bcc: 
AddressHeader


@*from: 
UniqueAddressHeader


@*resent-from: 
AddressHeader


@*reply-to: 
UniqueAddressHeader


@*mime-version: 
MIMEVersionHeader


@*content-type: 
ContentTypeHeader


@*content-disposition: 
ContentDispositionHeader


@*content-transfer-encoding: 
ContentTransferEncodingHeader


@*message-id: 
MessageIDHeader

@end quotation

@code{HeaderRegistry}에는 다음과 같은 메서드가 있습니다:

@geindex map_to_type() (email.headerregistry.HeaderRegistry 메서드)
@anchor{library/email headerregistry email headerregistry HeaderRegistry map_to_type}@anchor{3b97}
@deffn {메서드} map_to_type (self, name, cls)

`name'은 매핑할 헤더의 이름입니다. 등록소에서 소문자로 변환됩니다. `cls'는 `name'과 일치하는 헤더를 인스턴스 화하는 데 사용되는 클래스를 만들기 위해 `base_class'와 함께 사용되는 특수 클래스입니다.
@end deffn

@geindex __getitem__() (email.headerregistry.HeaderRegistry 메서드)
@anchor{library/email headerregistry email headerregistry HeaderRegistry __getitem__}@anchor{3b98}
@deffn {메서드} __getitem__ (name)

`name' 헤더 생성을 처리할 클래스를 구성하고 반환합니다.
@end deffn

@geindex __call__() (email.headerregistry.HeaderRegistry 메서드)
@anchor{library/email headerregistry email headerregistry HeaderRegistry __call__}@anchor{3b99}
@deffn {메서드} __call__ (name, value)

등록소에서 `name'과 연관된 특수화된 헤더를 꺼내고 (등록소에 `name'이 없으면 `default_class'를 사용해서), `base_class'와 결합하여 클래스를 생성하고, 생성된 클래스의 생성자를 같은 인자 목록을 전달해서 호출한 후, 마지막으로 이렇게 만들어진 클래스 인스턴스를 반환합니다.
@end deffn
@end deffn

다음 클래스는 구조화된 헤더에서 구문 분석된 데이터를 나타내는 데 사용되는 클래스이며 일반적으로 응용 프로그램에서 특정 헤더에 지정할 구조화된 값을 대입하는 데 사용할 수 있습니다.

@geindex Address (email.headerregistry 클래스)
@anchor{library/email headerregistry email headerregistry Address}@anchor{3b87}
@deffn {클래스} email.headerregistry.Address (display_name='@w{'}, username='@w{'}, domain='@w{'}, addr_spec=None)

전자 우편 주소를 나타내는 데 사용되는 클래스. 주소의 일반적인 형식은 다음과 같습니다:

@example
[display_name] <username@@domain>
@end example

또는:

@example
username@@domain
@end example

여기서 각 부분은 
@geindex RFC; RFC 5322
RFC 5322@footnote{https://datatracker.ietf.org/doc/html/rfc5322.html}에 명시된 특정 문법 규칙을 준수해야 합니다.

편의상 `username'과 `domain' 대신 `addr_spec'을 지정할 수 있으며, 이 경우 `addr_spec'에서 `username'과 `domain'이 구문 분석됩니다. `addr_spec'은 올바르게 RFC 인용된 문자열(quoted string)이어야 합니다; 그렇지 않으면 @code{Address}는 에러를 발생시킵니다. 유니코드 문자는 허용되며 직렬화될 때 적절하게 인코딩됩니다. 그러나, RFC에 따라, 주소의 사용자 이름 부분에는 유니코드가 허용되지 `않습니다'.

@geindex display_name (email.headerregistry.Address의 속성)
@anchor{library/email headerregistry email headerregistry Address display_name}@anchor{3b9a}
@deffn {속성} display_name

모든 인용(quoting)이 제거된 주소의 표시 이름 부분 (있다면). 주소에 표시 이름이 없으면, 이 어트리뷰트는 빈 문자열입니다.
@end deffn

@geindex username (email.headerregistry.Address의 속성)
@anchor{library/email headerregistry email headerregistry Address username}@anchor{3b9b}
@deffn {속성} username

모든 인용(quoting)이 제거된 주소의 @code{username} 부분.
@end deffn

@geindex domain (email.headerregistry.Address의 속성)
@anchor{library/email headerregistry email headerregistry Address domain}@anchor{3b9c}
@deffn {속성} domain

주소의 @code{domain} 부분.
@end deffn

@geindex addr_spec (email.headerregistry.Address의 속성)
@anchor{library/email headerregistry email headerregistry Address addr_spec}@anchor{3b9d}
@deffn {속성} addr_spec

주소의 @code{username@@domain} 부분, 단순 주소(위의 두 번째 형식)로 사용하기 위해 올바르게 인용(quoted)됩니다. 이 어트리뷰트는 불변입니다.
@end deffn

@geindex __str__() (email.headerregistry.Address 메서드)
@anchor{library/email headerregistry email headerregistry Address __str__}@anchor{3b9e}
@deffn {메서드} __str__ ()

객체의 @code{str} 값은 
@geindex RFC; RFC 5322
RFC 5322@footnote{https://datatracker.ietf.org/doc/html/rfc5322.html} 규칙에 따라 인용된(quoted) 주소이지만, ASCII가 아닌 문자의 콘텐츠 전송 인코딩(Content Transfer Encoding)은 없습니다.
@end deffn

SMTP(
@geindex RFC; RFC 5321
RFC 5321@footnote{https://datatracker.ietf.org/doc/html/rfc5321.html})를 지원하기 위해, @code{Address}는 한가지 특별한 경우를 처리합니다: @code{username}과 @code{domain}이 모두 빈 문자열(또는 @code{None})이면, @code{Address}의 문자열 값은 @code{<>}입니다.
@end deffn

@geindex Group (email.headerregistry 클래스)
@anchor{library/email headerregistry email headerregistry Group}@anchor{3b84}
@deffn {클래스} email.headerregistry.Group (display_name=None, addresses=None)

주소 그룹을 표현하는 데 사용되는 클래스. 주소 그룹의 일반적인 형식은 다음과 같습니다:

@example
display_name: [address-list];
@end example

그룹과 단일 주소의 혼합으로 구성된 주소 목록 처리의 편의를 위해, `display_name'을 @code{None}으로 설정하고 단일 주소 목록을 `addresses'로 제공하여, @code{Group}을 그룹의 일부가 아닌 단일 주소를 나타내는 데 사용할 수도 있습니다.

@geindex display_name (email.headerregistry.Group의 속성)
@anchor{library/email headerregistry email headerregistry Group display_name}@anchor{3b85}
@deffn {속성} display_name

그룹의 @code{display_name}. @code{None}이고 @code{addresses}에 정확히 하나의 @code{Address}가 있으면, @code{Group}은 그룹에 속하지 않은 단일 주소를 나타냅니다.
@end deffn

@geindex addresses (email.headerregistry.Group의 속성)
@anchor{library/email headerregistry email headerregistry Group addresses}@anchor{3b9f}
@deffn {속성} addresses

그룹에 있는 주소를 나타내는 @ref{3b87,,Address} 객체의 비어있을 수 있는 튜플.
@end deffn

@geindex __str__() (email.headerregistry.Group 메서드)
@anchor{library/email headerregistry email headerregistry Group __str__}@anchor{3ba0}
@deffn {메서드} __str__ ()

@code{Group}의 @code{str} 값은 
@geindex RFC; RFC 5322
RFC 5322@footnote{https://datatracker.ietf.org/doc/html/rfc5322.html}에 따라 포맷되지만, ASCII가 아닌 문자의 콘텐츠 전송 인코딩(Content Transfer Encoding)은 없습니다. @code{display_name}이 None이고 @code{addresses} 목록에 단일 @code{Address}가 있으면 @code{str} 값은 해당 단일 @code{Address}의 @code{str}과 같습니다.
@end deffn
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node email contentmanager MIME 콘텐츠 관리,email 예제,email headerregistry 사용자 정의 헤더 객체,email — 전자 메일과 MIME 처리 패키지
@anchor{library/email contentmanager doc}@anchor{3ba1}@anchor{library/email contentmanager email-contentmanager-managing-mime-content}@anchor{3ba2}@anchor{library/email contentmanager module-email contentmanager}@anchor{41}@anchor{library/email contentmanager translation-repo}@anchor{3ba3}
@subsubsection @code{email.contentmanager}: MIME 콘텐츠 관리


@geindex module; email.contentmanager

`소스 코드:' Lib/email/contentmanager.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/email/contentmanager.py}


__________________________________________________________________



Added in version 3.6: @footnote{
원래 3.4에서 @ref{1241,,잠정적 모듈}로 추가되었습니다.
}


@geindex ContentManager (email.contentmanager 클래스)
@anchor{library/email contentmanager email contentmanager ContentManager}@anchor{3ba4}
@deffn {클래스} email.contentmanager.ContentManager

콘텐츠 관리자를 위한 베이스 클래스. @code{get_content}와 @code{set_content} 디스패치 메서드뿐만 아니라 MIME 콘텐츠와 다른 표현 간의 변환기를 등록하는 표준 등록소 메커니즘을 제공합니다.

@geindex get_content() (email.contentmanager.ContentManager 메서드)
@anchor{library/email contentmanager email contentmanager ContentManager get_content}@anchor{3b1c}
@deffn {메서드} get_content (msg, *args, **kw)

`msg'의 @code{mimetype}을 기반으로 처리기 함수를 찾고 (다음 단락을 참조하십시오), 모든 인자를 전달하여 그것을 호출하고, 이 호출의 결과를 반환합니다. 처리기가 `msg'에서 페이 로드를 추출하고 추출된 데이터에 대한 정보를 인코딩하는 객체를 반환할 것으로 기대합니다.

처리기를 찾으려면, 등록소에서 다음 키를 찾는데, 처음 발견되는 것에서 멈춥니다:


@itemize *

@item 
전체 MIME 유형을 나타내는 문자열 (@code{maintype/subtype})

@item 
@code{maintype}을 나타내는 문자열

@item 
빈 문자열
@end itemize

이러한 키 중 아무것도 이러한 처리기를 생성하지 않으면, 전체 MIME 유형에 대해 @ref{5e5,,KeyError}를 발생시킵니다.
@end deffn

@geindex set_content() (email.contentmanager.ContentManager 메서드)
@anchor{library/email contentmanager email contentmanager ContentManager set_content}@anchor{3b1d}
@deffn {메서드} set_content (msg, obj, *args, **kw)

@code{maintype}이 @code{multipart}이면, @ref{198,,TypeError}를 발생시킵니다; 그렇지 않으면 `obj'의 형을 기반으로 처리기 함수를 찾고 (다음 단락을 참조하십시오), `msg'에서 @ref{3b26,,clear_content()}를 호출한 다음, 모든 인자를 전달해서 처리기 함수를 호출합니다. 처리기가 `obj'를 `msg'로 변환하고 저장할 것으로 기대하는데, 저장된 데이터를 해석하는 데 필요한 정보를 인코딩하기 위해 다양한 MIME 헤더를 추가하는 등 `msg'에 다른 변경을 가할 수 있습니다.

처리기를 찾으려면, `obj'의 형을 얻고 (@code{typ = type(obj)}), 등록소에서 다음 키를 찾는데 처음 발견되는 것에서 멈춥니다:


@itemize *

@item 
형 자체 (@code{typ})

@item 
형의 완전히 정규화된 이름 (@code{typ.__module__ + '.' + typ.__qualname__}).

@item 
형의 @ref{2370,,qualname} (@code{typ.__qualname__})

@item 
형의 @ref{16b0,,이름} (@code{typ.__name__}).
@end itemize

이 중 아무것도 일치하지 않으면, @ref{18de,,MRO} (@ref{2374,,typ.__mro__})의 각 형에 대해 위의 모든 검사를 반복합니다. 마지막으로, 다른 키가 처리기를 생성하지 않으면, @code{None} 키의 처리기를 확인합니다. @code{None}에 대한 처리기가 없으면, 형의 완전히 정규화된 이름으로 @ref{5e5,,KeyError}를 발생시킵니다.

@code{MIME-Version} 헤더가 없으면 추가합니다 (@ref{1139,,MIMEPart}를 참조하십시오).
@end deffn

@geindex add_get_handler() (email.contentmanager.ContentManager 메서드)
@anchor{library/email contentmanager email contentmanager ContentManager add_get_handler}@anchor{3ba5}
@deffn {메서드} add_get_handler (key, handler)

함수 `handler'를 `key'의 처리기로 기록합니다. 가능한 `key' 값은 @ref{3ba6,,get_content()}를 참조하십시오.
@end deffn

@geindex add_set_handler() (email.contentmanager.ContentManager 메서드)
@anchor{library/email contentmanager email contentmanager ContentManager add_set_handler}@anchor{3ba7}
@deffn {메서드} add_set_handler (typekey, handler)

`typekey'와 일치하는 형의 객체가 @ref{3ba8,,set_content()}에 전달될 때 호출할 함수로 `handler'를 기록합니다. 가능한 `typekey' 값은 @code{set_content()}를 참조하십시오.
@end deffn
@end deffn

@menu
* 콘텐츠 관리자 인스턴스:: 

@end menu

@node 콘텐츠 관리자 인스턴스,,,email contentmanager MIME 콘텐츠 관리
@anchor{library/email contentmanager content-manager-instances}@anchor{3ba9}
@subsubsection 콘텐츠 관리자 인스턴스


현재 email 패키지는 하나의 구상 콘텐츠 관리자 @ref{3b54,,raw_data_manager}만 제공하지만, 향후에는 더 추가될 수 있습니다. @code{raw_data_manager}는 @ref{12bc,,EmailPolicy}와 그 파생물에 의해 제공되는 @ref{113a,,content_manager}입니다.

@geindex raw_data_manager (email.contentmanager 모듈)
@anchor{library/email contentmanager email contentmanager raw_data_manager}@anchor{3b54}
@deffn {데이터} email.contentmanager.raw_data_manager

이 콘텐츠 관리자는 @ref{580,,Message} 자체에서 제공하는 것 외에는 최소 인터페이스 만 제공합니다: 텍스트, 날 바이트열 및 @code{Message} 객체만 다룹니다. 그런데도 기본 API와 비교할 때 상당한 이점을 제공합니다: 텍스트 파트에 대한 @code{get_content}는 응용 프로그램이 수동으로 디코딩할 필요 없이 유니코드 문자열을 반환하고, @code{set_content}는 파트에 추가된 헤더를 제어하고 콘텐츠 전송 인코딩을 제어하기 위한 다양한 옵션을 제공하고, 다양한 @code{add_} 메서드를 사용할 수 있도록 해서, 멀티 파트 메시지 작성을 단순화합니다.

@geindex get_content() (email.contentmanager 모듈)
@anchor{library/email contentmanager email contentmanager get_content}@anchor{3ba6}
@deffn {메서드} email.contentmanager.get_content (msg, errors='replace')

파트의 페이 로드를 문자열(@code{text} 파트의 경우), @ref{57f,,EmailMessage} 객체 (@code{message/rfc822} 파트의 경우) 또는 @code{bytes} 객체 (다른 모든 비 멀티 파트 유형의 경우)로 반환합니다. @code{multipart}에서 호출되면 @ref{5e5,,KeyError}를 발생시킵니다. 파트가 @code{text} 파트이고 `errors'가 지정되면, 페이 로드를 유니코드로 디코딩할 때 에러 처리기로 사용합니다. 기본 에러 처리기는 @code{replace}입니다.
@end deffn

@geindex set_content() (email.contentmanager 모듈)
@anchor{library/email contentmanager email contentmanager set_content}@anchor{3ba8}
@deffn {메서드} email.contentmanager.set_content (msg, <'str'>, subtype="plain", charset='utf-8', cte=None, disposition=None, filename=None, cid=None, params=None, headers=None)

@deffnx {메서드} email.contentmanager.set_content (msg, <'bytes'>, maintype, subtype, cte="base64", disposition=None, filename=None, cid=None, params=None, headers=None)

@deffnx {메서드} email.contentmanager.set_content (msg, <'EmailMessage'>, cte=None, disposition=None, filename=None, cid=None, params=None, headers=None)

`msg'에 헤더와 페이 로드를 추가합니다:

@code{maintype/subtype} 값으로 @code{Content-Type} 헤더를 추가합니다.


@itemize *

@item 
@code{str}의 경우, MIME @code{maintype}을 @code{text}로 설정하고, 서브 유형은 지정되었으면 `subtype'으로 설정하고, 지정되지 않았으면 @code{plain}으로 설정합니다.

@item 
@code{bytes}의 경우, 지정된 `maintype'과 `subtype'을 사용하거나, 지정되지 않았으면 @ref{198,,TypeError}를 발생시킵니다.

@item 
@ref{57f,,EmailMessage} 객체의 경우, 메인 유형을 @code{message}로 설정하고, 서브 유형은 지정되었으면 `subtype'으로 설정하고, 지정되지 않았으면 @code{rfc822}로 설정합니다. `subtype'이 @code{partial}이면 에러를 발생시킵니다 (@code{bytes} 객체를 사용하여 @code{message/partial} 파트를 구성해야 합니다).
@end itemize

`charset'이 제공되면 (@code{str}에만 유효합니다), 지정된 문자 집합을 사용하여 문자열을 바이트열로 인코딩합니다. 기본값은 @code{utf-8}입니다. 지정된 `charset'이 표준 MIME 문자 집합 이름의 알려진 별칭이면, 표준 문자 집합을 대신 사용합니다.

`cte'가 설정되면, 지정된 콘텐츠 전송 인코딩을 사용하여 페이 로드를 인코딩하고, @code{Content-Transfer-Encoding} 헤더를 해당 값으로 설정합니다. `cte'의 가능한 값은 @code{quoted-printable}, @code{base64}, @code{7bit}, @code{8bit} 및 @code{binary}입니다. 지정된 인코딩으로 입력을 인코딩할 수 없으면 (예를 들어, 비 ASCII 값을 포함하는 입력에 대해 `cte'를 @code{7bit}로 지정합니다), @ref{2ec,,ValueError}를 발생시킵니다.


@itemize *

@item 
@code{str} 객체의 경우, `cte'가 설정되지 않으면 휴리스틱을 사용하여 가장 간결한 인코딩을 결정합니다. 인코딩하기 전에, 모든 줄 경계를 정규화하기 위해 @ref{145b,,str.splitlines()}를 사용하여, 페이 로드의 각 줄이 현재 정책의 @ref{3b47,,linesep} 프로퍼티로 끝나도록 합니다 (원래 문자열이 뭔가로 끝나지 않아도 마찬가지).

@item 
For @code{bytes} objects, `cte' is taken to be base64 if not set,
and the aforementioned newline translation is not performed.

@item 
@ref{57f,,EmailMessage}의 경우, 
@geindex RFC; RFC 2046
RFC 2046@footnote{https://datatracker.ietf.org/doc/html/rfc2046.html}에 따라, `subtype' @code{rfc822}에 대해 @code{quoted-printable}이나 @code{base64}의 `cte'가 요청되거나, `subtype' @code{external-body}에 대해 @code{7bit} 이외의 `cte'에 대해 에러를 발생시킵니다. @code{message/rfc822}의 경우, `cte'가 지정되지 않으면 @code{8bit}를 사용합니다. `subtype'의 다른 모든 값에는 @code{7bit}를 사용합니다.
@end itemize

@cartouche
@quotation 참고 
@code{binary}의 `cte'는 실제로 아직 제대로 작동하지 않습니다. @code{set_content}에 의해 수정된 @code{EmailMessage} 객체는 올바르지만, @ref{13d4,,BytesGenerator}는 이것을 올바르게 직렬화하지 않습니다.
@end quotation
@end cartouche

`disposition'이 설정되면, 이를 @code{Content-Disposition} 헤더의 값으로 사용합니다. 지정되지 않고 `filename'이 지정되면, 값이 @code{attachment}인 헤더를 추가합니다. `disposition'이 지정되지 않고 `filename'도 지정되지 않으면, 헤더를 추가하지 않습니다. `disposition'에 유효한 값은 @code{attachment}와 @code{inline}뿐 입니다.

`filename'이 지정되면, 이를 @code{Content-Disposition} 헤더의 @code{filename} 파라미터의 값으로 사용합니다.

`cid'가 지정되면, `cid'를 값으로 사용하여 @code{Content-ID} 헤더를 추가합니다.

`params'가 지정되면, 그것의 @code{items} 메서드를 이터레이트하고 결과 @code{(key, value)} 쌍을 사용하여 @code{Content-Type} 헤더에 추가 파라미터를 설정합니다.

`headers'가 지정되고 @code{headername: headervalue} 형식의 문자열 리스트나 @code{header} 객체  (@code{name} 어트리뷰트를 가진 것으로 문자열과 구별됩니다) 리스트면, 헤더를 `msg'에 추가합니다.
@end deffn
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node email 예제,email message Message compat32 API를 사용하여 이메일 메시지 표현하기,email contentmanager MIME 콘텐츠 관리,email — 전자 메일과 MIME 처리 패키지
@anchor{library/email examples doc}@anchor{3baa}@anchor{library/email examples email-examples}@anchor{113b}@anchor{library/email examples id1}@anchor{3bab}@anchor{library/email examples translation-repo}@anchor{3bac}
@subsubsection @code{email}: 예제


다음은 @ref{3f,,email} 패키지를 사용하여 간단한 전자 우편 메시지뿐만 아니라 더 복잡한 MIME 메시지를 읽고 쓰고 보내는 방법에 대한 몇 가지 예입니다.

먼저 간단한 텍스트 메시지를 만들고 보내는 방법을 살펴보겠습니다 (텍스트 내용과 주소에 유니코드 문자가 포함될 수 있습니다):

@example
# 실제 전송 기능을 위해 smtplib를 임포트 합니다
import smtplib

# 필요한 email 모듈을 임포트 합니다
from email.message import EmailMessage

# textfile에 있는 이름의 텍스트 파일을 읽기 위해 엽니다.
with open(textfile) as fp:
    # Create a text/plain message
    msg = EmailMessage()
    msg.set_content(fp.read())

# me == 발신자의 전자 우편 주소
# you == 수신자의 전자 우편 주소
msg['Subject'] = f'The contents of @{textfile@}'
msg['From'] = me
msg['To'] = you

# 자체 SMTP 서버를 통해 메시지를 보냅니다.
s = smtplib.SMTP('localhost')
s.send_message(msg)
s.quit()
@end example

@ref{52,,parser} 모듈의 클래스를 사용하여 
@geindex RFC; RFC 822
RFC 822@footnote{https://datatracker.ietf.org/doc/html/rfc822.html} 헤더를 쉽게 구문 분석할 수 있습니다:

@example
# 필요한 email 모듈을 임포트 합니다
#from email.parser import BytesParser
from email.parser import Parser
from email.policy import default

# 전자 우편 헤더가 파일에 있으면, 이 두 줄의 주석 처리를 제거하십시오:
# with open(messagefile, 'rb') as fp:
#     headers = BytesParser(policy=default).parse(fp)

#  또는 문자열에서 헤더를 구문 분석하려면 (이는 드문 작업입니다), 다음을 사용하십시오:
headers = Parser(policy=default).parsestr(
        'From: Foo Bar <user@@example.com>\n'
        'To: <someone_else@@example.com>\n'
        'Subject: Test message\n'
        '\n'
        'Body would go here\n')

#  이제 헤더 항목을 딕셔너리로 액세스 할 수 있습니다:
print('To: @{@}'.format(headers['to']))
print('From: @{@}'.format(headers['from']))
print('Subject: @{@}'.format(headers['subject']))

# 또한 주소의 일부에 액세스 할 수 있습니다:
print('Recipient username: @{@}'.format(headers['to'].addresses[0].username))
print('Sender name: @{@}'.format(headers['from'].addresses[0].display_name))
@end example

다음은 디렉터리에 있을 수 있는 가족사진을 포함하는 MIME 메시지를 보내는 방법의 예입니다:

@example
# 실제 전송 기능을 위해 smtplib를 임포트 합니다.
import smtplib

# 다음은 필요한 email 패키지입니다.
from email.message import EmailMessage

# 컨테이너 전자 우편 메시지를 만듭니다.
msg = EmailMessage()
msg['Subject'] = 'Our family reunion'
# me == 발신자의 전자 우편 주소
# family = 모든 수신자의 전자 우편 주소 목록
msg['From'] = me
msg['To'] = ', '.join(family)
msg.preamble = 'You will not see this in a MIME-aware mail reader.\n'

# 바이너리 모드로 파일을 엽니다. MIMEImage 가 추측하길 원하면
# subtype 을 생략할 수도 있습니다.
for file in pngfiles:
    with open(file, 'rb') as fp:
        img_data = fp.read()
    msg.add_attachment(img_data, maintype='image',
                                 subtype='png')

# 자체 SMTP 서버를 통해 전자 우편을 보냅니다.
with smtplib.SMTP('localhost') as s:
    s.send_message(msg)
@end example

다음은 디렉터리의 전체 내용을 전자 우편 메시지로 보내는 방법의 예입니다: @footnote{
영감과 예를 주신 Matthew Dixon Cowles에게 감사드립니다.
}

@example
#!/usr/bin/env python3

"""디렉터리의 내용을 MIME 메시지로 보냅니다."""

import os
import smtplib
# 파일 이름 확장자를 기반으로 MIME 유형을 추측하기 위해
import mimetypes

from argparse import ArgumentParser

from email.message import EmailMessage
from email.policy import SMTP


def main():
    parser = ArgumentParser(description="""\
Send the contents of a directory as a MIME message.
Unless the -o option is given, the email is sent by forwarding to your local
SMTP server, which then does the normal delivery process.  Your local machine
must be running an SMTP server.
""")
    parser.add_argument('-d', '--directory',
                        help="""Mail the contents of the specified directory,
                        otherwise use the current directory.  Only the regular
                        files in the directory are sent, and we don't recurse to
                        subdirectories.""")
    parser.add_argument('-o', '--output',
                        metavar='FILE',
                        help="""Print the composed message to FILE instead of
                        sending the message to the SMTP server.""")
    parser.add_argument('-s', '--sender', required=True,
                        help='The value of the From: header (required)')
    parser.add_argument('-r', '--recipient', required=True,
                        action='append', metavar='RECIPIENT',
                        default=[], dest='recipients',
                        help='A To: header value (at least one required)')
    args = parser.parse_args()
    directory = args.directory
    if not directory:
        directory = '.'
    # 메시지를 만듭니다
    msg = EmailMessage()
    msg['Subject'] = f'Contents of directory @{os.path.abspath(directory)@}'
    msg['To'] = ', '.join(args.recipients)
    msg['From'] = args.sender
    msg.preamble = 'You will not see this in a MIME-aware mail reader.\n'

    for filename in os.listdir(directory):
        path = os.path.join(directory, filename)
        if not os.path.isfile(path):
            continue
        # 파일 확장자를 기준으로 콘텐츠 유형을 추측합니다.
        # gzip 되었거나 압축된 파일과 같은 간단한 사항을
        # 확인해야 하지만, 인코딩은 무시됩니다.
        ctype, encoding = mimetypes.guess_file_type(path)
        if ctype is None or encoding is not None:
            # 추측할 수 없거나 파일이 인코딩(압축)되었기 때문에,
            # 일반적인 비트 덩어리 유형을 사용합니다.
            ctype = 'application/octet-stream'
        maintype, subtype = ctype.split('/', 1)
        with open(path, 'rb') as fp:
            msg.add_attachment(fp.read(),
                               maintype=maintype,
                               subtype=subtype,
                               filename=filename)
    # 이제 메시지를 보내거나 저장합니다
    if args.output:
        with open(args.output, 'wb') as fp:
            fp.write(msg.as_bytes(policy=SMTP))
    else:
        with smtplib.SMTP('localhost') as s:
            s.send_message(msg)


if __name__ == '__main__':
    main()
@end example

다음은 위와 같은 MIME 메시지를 디렉터리로 푸는 방법의 예입니다:

@example
#!/usr/bin/env python3

"""MIME 메시지를 디렉터리에 풉니다."""

import os
import email
import mimetypes

from email.policy import default

from argparse import ArgumentParser


def main():
    parser = ArgumentParser(description="""\
Unpack a MIME message into a directory of files.
""")
    parser.add_argument('-d', '--directory', required=True,
                        help="""Unpack the MIME message into the named
                        directory, which will be created if it doesn't already
                        exist.""")
    parser.add_argument('msgfile')
    args = parser.parse_args()

    with open(args.msgfile, 'rb') as fp:
        msg = email.message_from_binary_file(fp, policy=default)

    try:
        os.mkdir(args.directory)
    except FileExistsError:
        pass

    counter = 1
    for part in msg.walk():
        # multipart/* 는 단지 컨테이너입니다
        if part.get_content_maintype() == 'multipart':
            continue
        # 전자 우편 메시지를 사용하여 중요한 파일을 덮어쓸 수 없도록 응용 프로그램은
        # 주어진 파일명을 청소해야 합니다.
        filename = part.get_filename()
        if not filename:
            ext = mimetypes.guess_extension(part.get_content_type())
            if not ext:
                # 일반적인 비트 덩어리 확장자를 사용합니다
                ext = '.bin'
            filename = f'part-@{counter:03d@}@{ext@}'
        counter += 1
        with open(os.path.join(args.directory, filename), 'wb') as fp:
            fp.write(part.get_payload(decode=True))


if __name__ == '__main__':
    main()
@end example

다음은 대체 일반 텍스트 버전으로 HTML 메시지를 만드는 방법의 예입니다. 좀 더 흥미롭게 하기 위해, html 부분에 관련 이미지를 포함하고, 보낼 뿐만 아니라, 보낼 것의 사본을 디스크에 저장합니다.

@example
#!/usr/bin/env python3

import smtplib

from email.message import EmailMessage
from email.headerregistry import Address
from email.utils import make_msgid

# 기본 텍스트 메시지를 만듭니다.
msg = EmailMessage()
msg['Subject'] = "Pourquoi pas des asperges pour ce midi ?"
msg['From'] = Address("Pepé Le Pew", "pepe", "example.com")
msg['To'] = (Address("Penelope Pussycat", "penelope", "example.com"),
             Address("Fabrette Pussycat", "fabrette", "example.com"))
msg.set_content("""\
Salut!

Cette recette [1] sera sûrement un très bon repas.

[1] http://www.yummly.com/recipe/Roasted-Asparagus-Epicurious-203718

--Pepé
""")

# html 버전을 추가합니다. 그러면 메시지가 원본 텍스트 메시지가
# 첫 번째 부분이고 새 html 메시지가 두 번째 부분인
# multipart/alternative 컨테이너로 변환됩니다.
asparagus_cid = make_msgid()
msg.add_alternative("""\
<html>
  <head></head>
  <body>
    <p>Salut!</p>
    <p>Cette
        <a href="http://www.yummly.com/recipe/Roasted-Asparagus-Epicurious-203718">
            recette
        </a> sera sûrement un très bon repas.
    </p>
    <img src="cid:@{asparagus_cid@}">
  </body>
</html>
""".format(asparagus_cid=asparagus_cid[1:-1]), subtype='html')
# html에서 사용하기 위해 msgid에서 <>를 벗겨야 했습니다.

# 이제 관련 이미지를 html 부분에 추가합니다.
with open("roasted-asparagus.jpg", 'rb') as img:
    msg.get_payload()[1].add_related(img.read(), 'image', 'jpeg',
                                     cid=asparagus_cid)

# 보낼 것의 지역 사본을 만듭니다.
with open('outgoing.msg', 'wb') as f:
    f.write(bytes(msg))

# 지역 SMTP 서버를 통해 메시지를 보냅니다.
with smtplib.SMTP('localhost') as s:
    s.send_message(msg)
@end example

마지막 예에서 메시지를 보냈다면, 다음은 그것을 처리하는 한 가지 방법입니다:

@example
import os
import sys
import tempfile
import mimetypes
import webbrowser

# 필요한 email 모듈을 임포트 합니다
from email import policy
from email.parser import BytesParser


def magic_html_parser(html_text, partfiles):
    """partfiles 에 링크된 안전 위생 처리된 html 을 반환합니다.

    partfiles의 파일명을 가리키도록 href="cid:...." 어트리뷰트를 다시 씁니다.
    사소하지는 않지만, html.parser 를 사용하면 가능합니다.
    """
    raise NotImplementedError("Add the magic needed")


# 실제 프로그램에서는 인자에서 파일명을 얻습니다.
with open('outgoing.msg', 'rb') as fp:
    msg = BytesParser(policy=policy.default).parse(fp)

# 이제 헤더 항목을 딕셔너리로 액세스할 수 있으며, 비 ASCII는
# 유니코드로 변환됩니다:
print('To:', msg['to'])
print('From:', msg['from'])
print('Subject:', msg['subject'])

# 메시지 내용의 미리 보기를 인쇄하려면, 가장 덜 포맷된 형식의
# 페이 로드를 추출하고 처음 세 줄을 인쇄합니다. 물론, 메시지에
# 일반 텍스트 부분이 없을 때, html의 처음 세 줄을 인쇄하는 것은
# 쓸모가 없지만, 이것은 단지 개념적인 예일 뿐입니다.
simplest = msg.get_body(preferencelist=('plain', 'html'))
print()
print('@w{'}.join(simplest.get_content().splitlines(keepends=True)[:3]))

ans = input("View full message?")
if ans.lower()[0] == 'n':
    sys.exit()

# 표시하기 위해 가장 풍부한 대안을 추출할 수 있습니다:
richest = msg.get_body()
partfiles = @{@}
if richest['content-type'].maintype == 'text':
    if richest['content-type'].subtype == 'plain':
        for line in richest.get_content().splitlines():
            print(line)
        sys.exit()
    elif richest['content-type'].subtype == 'html':
        body = richest
    else:
        print("Don't know how to display @{@}".format(richest.get_content_type()))
        sys.exit()
elif richest['content-type'].content_type == 'multipart/related':
    body = richest.get_body(preferencelist=('html'))
    for part in richest.iter_attachments():
        fn = part.get_filename()
        if fn:
            extension = os.path.splitext(part.get_filename())[1]
        else:
            extension = mimetypes.guess_extension(part.get_content_type())
        with tempfile.NamedTemporaryFile(suffix=extension, delete=False) as f:
            f.write(part.get_content())
            # cid의 전자 우편 형식에서 html 형식으로 가기 위해 <>을 다시 제거합니다.
            partfiles[part['content-id'][1:-1]] = f.name
else:
    print("Don't know how to display @{@}".format(richest.get_content_type()))
    sys.exit()
with tempfile.NamedTemporaryFile(mode='w', delete=False) as f:
    f.write(magic_html_parser(body.get_content(), partfiles))
webbrowser.open(f.name)
os.remove(f.name)
for fn in partfiles.values():
    os.remove(fn)

# 물론, 이 간단한 프로그램을 망칠 수 있는 많은 전자 우편
# 메시지가 있지만, 가장 흔한 것을 처리합니다.
@end example

프롬프트까지, 위의 출력은 다음과 같습니다:

@example
To: Penelope Pussycat <penelope@@example.com>, Fabrette Pussycat <fabrette@@example.com>
From: Pepé Le Pew <pepe@@example.com>
Subject: Pourquoi pas des asperges pour ce midi ?

Salut!

Cette recette [1] sera sûrement un très bon repas.
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

레거시 API:

@node email message Message compat32 API를 사용하여 이메일 메시지 표현하기,email mime 처음부터 이메일과 MIME 객체 만들기,email 예제,email — 전자 메일과 MIME 처리 패키지
@anchor{library/email compat32-message doc}@anchor{3bad}@anchor{library/email compat32-message compat32-message}@anchor{3aee}@anchor{library/email compat32-message email-message-message-representing-an-email-message-using-the-compat32-api}@anchor{3bae}@anchor{library/email compat32-message translation-repo}@anchor{3baf}
@subsubsection @code{email.message.Message}: @code{compat32} API를 사용하여 이메일 메시지 표현하기


@ref{580,,Message} 클래스는 @ref{57f,,EmailMessage} 클래스와 매우 유사지만, 이 클래스에 의해 추가된 메서드가 없고, 다른 특정 메서드의 기본 동작이 약간 다릅니다. 또한 @code{EmailMessage} 클래스에서 지원하지만, 레거시 코드를 다루지 않는 한 권장되지 않는 일부 메서드도 여기에서 설명합니다.

두 클래스의 철학과 구조는 그 외에는 같습니다.

이 문서는 기본 (@ref{580,,Message}의 경우) 정책 @ref{12b9,,Compat32}의 동작을 설명합니다. 다른 정책을 사용하려면, @ref{57f,,EmailMessage} 클래스를 대신 사용해야 합니다.

이메일 메시지는 `헤더(headers)'와 `페이 로드(payload)'로 구성됩니다. 헤더는 
@geindex RFC; RFC 5322
RFC 5322@footnote{https://datatracker.ietf.org/doc/html/rfc5322.html} 스타일 이름과 값이어야 하며, 필드 이름과 값은 콜론으로 구분됩니다. 콜론은 필드 이름이나 필드 값의 일부가 아닙니다. 페이 로드는 간단한 텍스트 메시지, 바이너리 객체 또는 각각 자체 헤더 집합과 자체 페이 로드가 있는 서브 메시지의 구조화된 시퀀스일 수 있습니다. 후자의 페이 로드 유형은 @code{multipart/*}나 @code{message/rfc822}와 같은 MIME 유형을 가진 메시지로 표시됩니다.

@ref{580,,Message} 객체가 제공하는 개념 모델은 헤더의 순서 있는 딕셔너리이면서, 헤더의 특수 정보에 액세스하고, 페이 로드에 액세스하고, 메시지의 직렬화된 버전을 생성하고, 객체 트리를 재귀적으로 탐색하기 위한 추가 메서드가 제공되는 것입니다. 중복 헤더가 지원되지만, 특수한 메서드를 사용하여 액세스해야 함에 유의하십시오.

@ref{580,,Message} 의사 딕셔너리는 헤더 이름으로 인덱싱되며, ASCII 값이어야 합니다. 딕셔너리의 값은 ASCII 문자만 포함해야 하는 문자열입니다; 비 ASCII 입력에 대한 특수 처리가 있지만, 항상 올바른 결과를 생성하지는 않습니다. 헤더는 대소 문자를 유지하면서 저장되고 반환되지만, 필드 이름은 대소 문자를 구분하지 않고 일치합니다. `Unix-From' 헤더나 @code{From_} 헤더라고도 하는 단일 봉투 헤더가 있을 수도 있습니다. `페이 로드(payload)'는 단순 메시지 객체의 경우는 문자열이나 바이트열이고, MIME 컨테이너 문서(예를 들어 @code{multipart/*}와 @code{message/rfc822})의 경우는 @code{Message} 객체의 리스트입니다.

@ref{580,,Message} 클래스의 메서드는 다음과 같습니다:

@geindex Message (email.message 클래스)
@anchor{library/email compat32-message email message Message}@anchor{580}
@deffn {클래스} email.message.Message (policy=compat32)

`policy'가 지정되면 (@ref{53,,policy} 클래스의 인스턴스여야 합니다) 메시지 표현을 갱신하고 직렬화하기 위해 지정된 규칙을 사용합니다. `policy'가 설정되지 않으면, @ref{12b9,,compat32} 정책을 사용하는데, 파이썬 3.2 버전의 email 패키지와의 과거 호환성을 유지합니다. 자세한 내용은 @code{policy} 설명서를 참조하십시오.


버전 3.3에서 변경: `policy' 키워드 인자가 추가되었습니다.


@geindex as_string() (email.message.Message 메서드)
@anchor{library/email compat32-message email message Message as_string}@anchor{1135}
@deffn {메서드} as_string (unixfrom=False, maxheaderlen=0, policy=None)

평활화된 전체 메시지를 문자열로 반환합니다. 선택적 `unixfrom'이 참이면, 봉투 헤더가 반환된 문자열에 포함됩니다. `unixfrom'의 기본값은 @code{False}입니다. 이전 버전과의 호환성을 위해, `maxheaderlen'의 기본값이 @code{0}이라서 다른 값을 원하면 명시적으로 재정의해야 합니다 (정책에서 `max_line_length'에 지정된 값은 이 메서드가 무시합니다). `policy' 인자는 메시지 인스턴스에서 얻은 기본 정책을 대체하는 데 사용될 수 있습니다. 지정된 `policy'가 @code{Generator}로 전달되므로, 메서드에서 생성된 일부 포매팅을 제어하는 데 사용할 수 있습니다.

문자열로의 변환을 완료하기 위해 기본값을 채워야 하면 메시지 평활화는 @ref{580,,Message}에 대한 변경을 유발할 수 있습니다 (예를 들어, MIME 경계가 생성되거나 수정될 수 있습니다).

이 메서드는 편의상 제공되며 원하는 방식으로 메시지를 항상 포맷하지는 않음에 유의하십시오. 예를 들어, 기본적으로 유닉스 mbox 형식에 필요한 @code{From}으로 시작하는 줄을 맹글링(mangling)하지 않습니다. 유연성을 높이려면, @ref{13d3,,Generator} 인스턴스를 인스턴스 화하고 그것의 @ref{3b41,,flatten()} 메서드를 직접 사용하십시오. 예를 들면:

@example
from io import StringIO
from email.generator import Generator
fp = StringIO()
g = Generator(fp, mangle_from_=True, maxheaderlen=60)
g.flatten(msg)
text = fp.getvalue()
@end example

메시지 객체가 RFC 표준에 따라 인코딩되지 않은 바이너리 데이터를 포함하면, 비 호환 데이터는 유니코드 “unknown character” 코드 포인트로 대체됩니다. (@ref{1136,,as_bytes()}와 @ref{13d4,,BytesGenerator}도 참조하십시오.)


버전 3.4에서 변경: `policy' 키워드 인자가 추가되었습니다.

@end deffn

@geindex __str__() (email.message.Message 메서드)
@anchor{library/email compat32-message email message Message __str__}@anchor{3bb0}
@deffn {메서드} __str__ ()

@ref{1135,,as_string()}과 동등합니다. @code{str(msg)}가 포맷된 메시지를 포함하는 문자열을 생성할 수 있도록 합니다.
@end deffn

@geindex as_bytes() (email.message.Message 메서드)
@anchor{library/email compat32-message email message Message as_bytes}@anchor{1136}
@deffn {메서드} as_bytes (unixfrom=False, policy=None)

평활화된 전체 메시지를 바이트열 객체로 반환합니다. 선택적 `unixfrom'이 참이면, 봉투 헤더가 반환된 문자열에 포함됩니다. `unixfrom'의 기본값은 @code{False}입니다. `policy' 인자는 메시지 인스턴스에서 얻은 기본 정책을 대체하는 데 사용될 수 있습니다. 지정된 `policy'가 @code{BytesGenerator}로 전달되므로, 메서드에서 생성된 일부 포매팅을 제어하는 데 사용할 수 있습니다.

문자열로의 변환을 완료하기 위해 기본값을 채워야 하면 메시지 평활화는 @ref{580,,Message}에 대한 변경을 유발할 수 있습니다 (예를 들어, MIME 경계가 생성되거나 수정될 수 있습니다).

이 메서드는 편의상 제공되며 원하는 방식으로 메시지를 항상 포맷하지는 않음에 유의하십시오. 예를 들어, 기본적으로 유닉스 mbox 형식에 필요한 @code{From}으로 시작하는 줄을 맹글링(mangling)하지 않습니다. 유연성을 높이려면, @ref{13d4,,BytesGenerator} 인스턴스를 인스턴스 화하고 그것의 @ref{3b3d,,flatten()} 메서드를 직접 사용하십시오. 예를 들면:

@example
from io import BytesIO
from email.generator import BytesGenerator
fp = BytesIO()
g = BytesGenerator(fp, mangle_from_=True, maxheaderlen=60)
g.flatten(msg)
text = fp.getvalue()
@end example


Added in version 3.4.

@end deffn

@geindex __bytes__() (email.message.Message 메서드)
@anchor{library/email compat32-message email message Message __bytes__}@anchor{1137}
@deffn {메서드} __bytes__ ()

@ref{1136,,as_bytes()}와 동등합니다. @code{bytes(msg)}가 포맷된 메시지를 포함하는 바이트열 객체를 생성할 수 있도록 합니다.


Added in version 3.4.

@end deffn

@geindex is_multipart() (email.message.Message 메서드)
@anchor{library/email compat32-message email message Message is_multipart}@anchor{3b15}
@deffn {메서드} is_multipart ()

메시지의 페이 로드가 서브-@ref{580,,Message} 객체의 리스트이면 @code{True}를, 그렇지 않으면 @code{False}를 반환합니다. @ref{3b15,,is_multipart()}가 @code{False}를 반환할 때, 페이 로드는 문자열 객체(CTE로 인코딩된 바이너리 페이 로드일 수 있습니다)여야 합니다. (@code{True}를 반환하는 @code{is_multipart()}가 반드시 “msg.get_content_maintype() == ‘multipart’” 가 @code{True}를 반환한다는 것을 의미하지는 않습니다. 예를 들어, @code{Message}가 @code{message/rfc822} 유형일 때, @code{is_multipart}는 @code{True}를 반환합니다.
@end deffn

@geindex set_unixfrom() (email.message.Message 메서드)
@anchor{library/email compat32-message email message Message set_unixfrom}@anchor{3bb1}
@deffn {메서드} set_unixfrom (unixfrom)

메시지의 봉투 헤더를 (문자열이어야 하는) `unixfrom'으로 설정합니다.
@end deffn

@geindex get_unixfrom() (email.message.Message 메서드)
@anchor{library/email compat32-message email message Message get_unixfrom}@anchor{3bb2}
@deffn {메서드} get_unixfrom ()

메시지의 봉투 헤더를 반환합니다. 봉투 헤더가 설정되지 않았으면 기본값은 @code{None}입니다.
@end deffn

@geindex attach() (email.message.Message 메서드)
@anchor{library/email compat32-message email message Message attach}@anchor{3b22}
@deffn {메서드} attach (payload)

지정된 `payload'를 현재 페이 로드에 추가합니다. 호출 전에는 페이 로드가 @code{None}이나 @ref{580,,Message} 객체의 리스트여야 합니다. 호출 후에는 페이 로드가 항상 @code{Message} 객체의 리스트입니다. 페이 로드를 스칼라 객체(예를 들어 문자열)로 설정하려면, @ref{3bb3,,set_payload()}를 대신 사용하십시오.

This is a legacy method.  On the
@ref{57f,,EmailMessage} class its functionality is
replaced by @ref{1c5b,,set_content()} and the
related @code{make} and @code{add} methods.
@end deffn

@geindex get_payload() (email.message.Message 메서드)
@anchor{library/email compat32-message email message Message get_payload}@anchor{13d2}
@deffn {메서드} get_payload (i=None, decode=False)

현재 페이 로드를 반환합니다. @ref{3b15,,is_multipart()}가 @code{True}이면 @ref{580,,Message} 객체의 리스트이고, @code{is_multipart()}가 @code{False}이면 문자열입니다. 페이 로드가 리스트이고 리스트 객체를 변경하면, 메시지의 페이 로드를 제자리에서 수정하는 것입니다.

선택적 인자 `i'를 사용하면, @ref{13d2,,get_payload()}는 @ref{3b15,,is_multipart()}가 @code{True}일 때, 페이 로드의 `i' 번째 요소를 0부터 세어 반환합니다. `i'가 0보다 작거나 페이 로드의 항목 수보다 크거나 같으면 @ref{173a,,IndexError}가 발생합니다. 페이 로드가 문자열이고 (즉 @code{is_multipart()}가 @code{False}) `i'가 제공되면, @ref{198,,TypeError}가 발생합니다.

선택적 `decode'는 @code{Content-Transfer-Encoding} 헤더에 따라 페이 로드를 디코딩해야 하는지를 나타내는 플래그입니다. @code{True}이고 메시지가 멀티 파트가 아닐 때, 이 헤더 값이 @code{quoted-printable}이나 @code{base64}이면 페이 로드가 디코딩됩니다. 다른 인코딩이 사용되거나 @code{Content-Transfer-Encoding} 헤더가 누락되면, 페이 로드는 그대로 (디코딩되지 않고) 반환됩니다. 모든 경우에 반환된 값은 바이너리 데이터입니다. 메시지가 멀티 파트이고 `decode' 플래그가 @code{True}이면, @code{None}이 반환됩니다. 페이 로드가 base64이고 완벽하게 구성되지 않았으면 (패딩 누락, base64 알파벳 이외의 문자), 메시지의 결함 프로퍼티에 적절한 결함이 추가됩니다 (각각 @ref{3b74,,InvalidBase64PaddingDefect}나 @ref{3b75,,InvalidBase64CharactersDefect}).

`decode'가 @code{False}(기본값)일 때 본문은 @code{Content-Transfer-Encoding}을 디코딩하지 않고 문자열로 반환됩니다. 그러나, @code{Content-Transfer-Encoding}이 8비트인 경우, @code{replace} 에러 처리기로, @code{Content-Type} 헤더에 지정된 @code{charset}을 사용하여 원래 바이트를 디코딩하려고 시도합니다. @code{charset}이 지정되지 않았거나 email 패키지가 @code{charset}을 인식하지 못하면, 본문은 기본 ASCII 문자 집합을 사용하여 디코딩됩니다.

This is a legacy method.  On the
@ref{57f,,EmailMessage} class its functionality is
replaced by @ref{3b1b,,get_content()} and
@ref{3b1a,,iter_parts()}.
@end deffn

@geindex set_payload() (email.message.Message 메서드)
@anchor{library/email compat32-message email message Message set_payload}@anchor{3bb3}
@deffn {메서드} set_payload (payload, charset=None)

전체 메시지 객체의 페이 로드를 `payload'로 설정합니다. 페이 로드 불변량(invariants)을 보장하는 것은 고객의 책임입니다. 선택적 `charset'은 메시지의 기본 문자 집합을 설정합니다; 자세한 내용은 @ref{3bb4,,set_charset()}을 참조하십시오.

This is a legacy method.  On the
@ref{57f,,EmailMessage} class its functionality is
replaced by @ref{1c5b,,set_content()}.
@end deffn

@geindex set_charset() (email.message.Message 메서드)
@anchor{library/email compat32-message email message Message set_charset}@anchor{3bb4}
@deffn {메서드} set_charset (charset)

페이 로드의 문자 집합을 `charset'으로 설정합니다. 이는 @ref{ffa,,Charset} 인스턴스 (@ref{40,,email.charset}을 참조하십시오), 문자 집합의 이름을 지정하는 문자열 또는 @code{None}일 수 있습니다. 문자열이면, @code{Charset} 인스턴스로 변환됩니다. `charset'이 @code{None}이면, @code{charset} 매개 변수가 @code{Content-Type} 헤더에서 제거됩니다 (그렇지 않으면 메시지가 수정되지 않습니다). 그 외의 경우는 @ref{198,,TypeError}를 생성합니다.

기존 @code{MIME-Version} 헤더가 없으면 추가됩니다. 기존 @code{Content-Type} 헤더가 없으면, @code{text/plain} 값으로 추가됩니다. @code{Content-Type} 헤더가 존재하는지와 관계없이, @code{charset} 매개 변수는 `charset.output_charset'으로 설정됩니다. `charset.input_charset'과 `charset.output_charset'이 다르면, 페이 로드가 `output_charset'으로 다시 인코딩됩니다. 기존 @code{Content-Transfer-Encoding} 헤더가 없으면, 필요하면 지정된 @ref{ffa,,Charset}을 사용하여 페이 로드가 전송 인코딩되고(transfer-encoded), 적절한 값을 가진 헤더가 추가됩니다. @code{Content-Transfer-Encoding} 헤더가 이미 존재하면, 페이 로드는 해당 @code{Content-Transfer-Encoding}을 사용하여 이미 올바르게 인코딩된 것으로 가정하며 수정하지 않습니다.

This is a legacy method.  On the
@ref{57f,,EmailMessage} class its functionality is
replaced by the `charset' parameter of the
@ref{1c5b,,email.message.EmailMessage.set_content()} method.
@end deffn

@geindex get_charset() (email.message.Message 메서드)
@anchor{library/email compat32-message email message Message get_charset}@anchor{3bb5}
@deffn {메서드} get_charset ()

메시지 페이 로드와 연관된 @ref{ffa,,Charset} 인스턴스를 반환합니다.

This is a legacy method.  On the
@ref{57f,,EmailMessage} class it always returns
@code{None}.
@end deffn

다음 메서드는 메시지의 
@geindex RFC; RFC 2822
RFC 2822@footnote{https://datatracker.ietf.org/doc/html/rfc2822.html} 헤더에 액세스하기 위한 매핑과 유사한 인터페이스를 구현합니다. 이 메서드들과 일반적인 매핑 (즉, 딕셔너리) 인터페이스 사이에는 의미상 차이가 있습니다. 예를 들어, 딕셔너리에는 중복 키가 없지만, 여기에는 중복 메시지 헤더가 있을 수 있습니다. 또한, 딕셔너리에서는 @ref{3bb6,,keys()}가 반환하는 키의 순서가 보장되지 않지만, @ref{580,,Message} 객체에서는 헤더가 항상 원래 메시지에 나타나거나 나중에 메시지에 추가된 순서대로 반환됩니다. 삭제한 후 다시 추가된 헤더는 항상 헤더 리스트의 끝에 추가됩니다.

이러한 의미상 차이는 의도적이며 최대한의 편의를 위해 편향되어 있습니다.

모든 경우에, 메시지에 존재하는 봉투 헤더는 매핑 인터페이스에 포함되지 않습니다.

바이트열에서 생성된 모델에서, (RFC에 반하여) 비 ASCII 바이트를 포함하는 헤더 값은, 이 인터페이스를 통해 꺼낼 때, 문자 집합이 @code{unknown-8bit}인 @ref{1c5c,,Header} 객체로 표시됩니다.

@geindex __len__() (email.message.Message 메서드)
@anchor{library/email compat32-message email message Message __len__}@anchor{3bb7}
@deffn {메서드} __len__ ()

중복을 포함하여, 총 헤더 수를 반환합니다.
@end deffn

@geindex __contains__() (email.message.Message 메서드)
@anchor{library/email compat32-message email message Message __contains__}@anchor{1af2}
@deffn {메서드} __contains__ (name)

메시지 객체에 `name'이라는 이름의 필드가 있으면 @code{True}를 반환합니다. 대소 문자를 구분하지 않고 일치하며 `name'은 후행 콜론을 포함하지 않아야 합니다. @code{in} 연산자에 사용됩니다, 예를 들어:

@example
if 'message-id' in myMessage:
   print('Message-ID:', myMessage['message-id'])
@end example
@end deffn

@geindex __getitem__() (email.message.Message 메서드)
@anchor{library/email compat32-message email message Message __getitem__}@anchor{3bb8}
@deffn {메서드} __getitem__ (name)

명명된 헤더 필드의 값을 반환합니다. `name'은 콜론 필드 구분자를 포함하지 않아야 합니다. 헤더가 없으면, @code{None}이 반환됩니다; @ref{5e5,,KeyError}는 절대 발생하지 않습니다.

이름이 지정된 필드가 메시지 헤더에 두 번 이상 나타나면, 해당 필드 값 중 정확히 어떤 필드 값이 반환되는지 정의되지 않습니다. 기존의 모든 명명된 헤더의 값을 가져오려면 @ref{3bb9,,get_all()} 메서드를 사용하십시오.
@end deffn

@geindex __setitem__() (email.message.Message 메서드)
@anchor{library/email compat32-message email message Message __setitem__}@anchor{1880}
@deffn {메서드} __setitem__ (name, val)

메시지에 필드 이름이 `name'이고 값이 `val'인 헤더를 추가합니다. 필드는 메시지의 기존 필드 끝에 추가됩니다.

이것이 같은 이름을 가진 기존 헤더를 덮어쓰거나 삭제하지 `않음에' 유의하십시오. 새 헤더가 메시지에 필드 이름이 `name'인 유일한 헤더가 되도록 하려면, 먼저 필드를 삭제하십시오. 예를 들어:

@example
del msg['subject']
msg['subject'] = 'Python roolz!'
@end example
@end deffn

@geindex __delitem__() (email.message.Message 메서드)
@anchor{library/email compat32-message email message Message __delitem__}@anchor{3bba}
@deffn {메서드} __delitem__ (name)

메시지 헤더에서 이름이 `name'인 모든 필드를 삭제합니다. 명명된 필드가 헤더에 없어도 예외가 발생하지 않습니다.
@end deffn

@geindex keys() (email.message.Message 메서드)
@anchor{library/email compat32-message email message Message keys}@anchor{3bb6}
@deffn {메서드} keys ()

메시지 헤더의 모든 필드 이름의 리스트를 반환합니다.
@end deffn

@geindex values() (email.message.Message 메서드)
@anchor{library/email compat32-message email message Message values}@anchor{3bbb}
@deffn {메서드} values ()

메시지의 모든 필드 값의 리스트를 반환합니다.
@end deffn

@geindex items() (email.message.Message 메서드)
@anchor{library/email compat32-message email message Message items}@anchor{3bbc}
@deffn {메서드} items ()

메시지의 모든 필드 헤더와 값을 포함하는 2-튜플의 리스트를 반환합니다.
@end deffn

@geindex get() (email.message.Message 메서드)
@anchor{library/email compat32-message email message Message get}@anchor{3bbd}
@deffn {메서드} get (name, failobj=None)

명명된 헤더 필드의 값을 반환합니다. 명명된 헤더가 없으면 선택적 `failobj'가 반환된다는 점을 제외하고는 @ref{588,,__getitem__()}과 동일합니다 (기본값은 @code{None}입니다).
@end deffn

몇 가지 유용한 추가 메서드가 있습니다:

@geindex get_all() (email.message.Message 메서드)
@anchor{library/email compat32-message email message Message get_all}@anchor{3bb9}
@deffn {메서드} get_all (name, failobj=None)

`name'이라는 필드의 모든 값 리스트를 반환합니다. 메시지에 이런 이름의 헤더가 없으면, `failobj'가 반환됩니다 (기본값은 @code{None}입니다).
@end deffn

@geindex add_header() (email.message.Message 메서드)
@anchor{library/email compat32-message email message Message add_header}@anchor{1881}
@deffn {메서드} add_header (_name, _value, **_params)

확장된 헤더 설정. 이 메서드는 추가 헤더 매개 변수가 키워드 인자로 제공될 수 있다는 점을 제외하고는 @ref{1880,,__setitem__()}과 유사합니다. `_name'은 추가할 헤더 필드이고 `_value'는 헤더의 `기본(primary)'값입니다.

키워드 인자 딕셔너리 `_params'의 각 항목에 대해, 키는 매개 변수 이름으로 사용되며, 밑줄은 대시로 변환됩니다 (대시는 파이썬 식별자로 유효하지 않기 때문입니다). 일반적으로, 값이 @code{None}이 아니면 매개 변수가 @code{key="value"}로 추가되며, @code{None}이면 키만 추가됩니다. 값에 ASCII가 아닌 문자가 포함되면, @code{(CHARSET, LANGUAGE, VALUE)} 형식으로 3-튜플로 지정할 수 있습니다. 여기서 @code{CHARSET}은 값을 인코딩하는 데 사용할 문자 집합의 이름을 지정하는 문자열이고, @code{LANGUAGE}는 일반적으로 @code{None}이나 빈 문자열(다른 가능성에 대해서는 
@geindex RFC; RFC 2231
RFC 2231@footnote{https://datatracker.ietf.org/doc/html/rfc2231.html}을 참조하십시오)로 설정될 수 있고, @code{VALUE}는 비 ASCII 코드 포인트를 포함하는 문자열 값입니다. 3-튜플이 전달되지 않고 값에 ASCII가 아닌 문자가 포함되면, @code{CHARSET}으로 @code{utf-8}을 @code{LANGUAGE}로 @code{None}을 사용하여 
@geindex RFC; RFC 2231
RFC 2231@footnote{https://datatracker.ietf.org/doc/html/rfc2231.html} 형식으로 자동 인코딩됩니다.

예를 들면 다음과 같습니다:

@example
msg.add_header('Content-Disposition', 'attachment', filename='bud.gif')
@end example

이것은 다음과 같은 헤더를 추가합니다

@example
Content-Disposition: attachment; filename="bud.gif"
@end example

비 ASCII 문자의 예:

@example
msg.add_header('Content-Disposition', 'attachment',
               filename=('iso-8859-1', '@w{'}, 'Fußballer.ppt'))
@end example

이것은 다음을 생성합니다

@example
Content-Disposition: attachment; filename*="iso-8859-1'@w{'}Fu%DFballer.ppt"
@end example
@end deffn

@geindex replace_header() (email.message.Message 메서드)
@anchor{library/email compat32-message email message Message replace_header}@anchor{3bbe}
@deffn {메서드} replace_header (_name, _value)

헤더를 교체합니다. 헤더 순서와 필드 이름 대소 문자를 유지하면서, 메시지에서 `_name'과 일치하는 첫 번째로 발견된 헤더를 교체합니다. 일치하는 헤더가 없으면, @ref{5e5,,KeyError}가 발생합니다.
@end deffn

@geindex get_content_type() (email.message.Message 메서드)
@anchor{library/email compat32-message email message Message get_content_type}@anchor{3bbf}
@deffn {메서드} get_content_type ()

메시지의 콘텐츠 유형을 반환합니다. 반환된 문자열은 @code{maintype/subtype} 형식의 소문자로 강제 변환됩니다. 메시지에 @code{Content-Type} 헤더가 없으면 @ref{3bc0,,get_default_type()}에서 제공하는 기본 유형이 반환됩니다. 
@geindex RFC; RFC 2045
RFC 2045@footnote{https://datatracker.ietf.org/doc/html/rfc2045.html}에 따르면, 메시지는 항상 기본 유형을 가지므로, @ref{3bbf,,get_content_type()}은 항상 값을 반환합니다.

@geindex RFC; RFC 2045
RFC 2045@footnote{https://datatracker.ietf.org/doc/html/rfc2045.html}는 메시지가 @code{multipart/digest} 컨테이너 안에 등장(이 경우 기본 유형은 @code{message/rfc822}가 됩니다)하지 않는 한 기본 유형을 @code{text/plain}으로 정의합니다. @code{Content-Type} 헤더에 유효하지 않은 유형 명세가 있으면, 
@geindex RFC; RFC 2045
RFC 2045@footnote{https://datatracker.ietf.org/doc/html/rfc2045.html}는 기본 유형이 @code{text/plain}으로 지정합니다.
@end deffn

@geindex get_content_maintype() (email.message.Message 메서드)
@anchor{library/email compat32-message email message Message get_content_maintype}@anchor{3bc1}
@deffn {메서드} get_content_maintype ()

메시지의 주 콘텐츠 유형을 반환합니다. 이것은 @ref{3bbf,,get_content_type()}이 반환하는 문자열의 @code{maintype} 부분입니다.
@end deffn

@geindex get_content_subtype() (email.message.Message 메서드)
@anchor{library/email compat32-message email message Message get_content_subtype}@anchor{3bc2}
@deffn {메서드} get_content_subtype ()

메시지의 부 콘텐츠 유형을 반환합니다. 이것은 @ref{3bbf,,get_content_type()}이 반환하는 문자열의 @code{subtype} 부분입니다.
@end deffn

@geindex get_default_type() (email.message.Message 메서드)
@anchor{library/email compat32-message email message Message get_default_type}@anchor{3bc0}
@deffn {메서드} get_default_type ()

기본 콘텐츠 유형을 반환합니다. @code{multipart/digest} 컨테이너의 서브 파트인 메시지를 제외하고, 대부분의 메시지는 기본 콘텐츠 유형이 @code{text/plain}입니다. 이러한 서브 파트는 기본 콘텐츠 유형이 @code{message/rfc822}입니다.
@end deffn

@geindex set_default_type() (email.message.Message 메서드)
@anchor{library/email compat32-message email message Message set_default_type}@anchor{3bc3}
@deffn {메서드} set_default_type (ctype)

기본 콘텐츠 유형을 설정합니다. `ctype'은 @code{text/plain}이나 @code{message/rfc822}여야 하지만 강제하지는 않습니다. 기본 콘텐츠 유형은 @code{Content-Type} 헤더에 저장되지 않습니다.
@end deffn

@geindex get_params() (email.message.Message 메서드)
@anchor{library/email compat32-message email message Message get_params}@anchor{3bc4}
@deffn {메서드} get_params (failobj=None, header='content-type', unquote=True)

메시지의 @code{Content-Type} 매개 변수를 리스트로 반환합니다. 반환된 리스트의 요소는 @code{'='} 부호로 분할된 키/값 쌍의 2-튜플입니다. @code{'='}의 왼쪽은 키이고 오른쪽은 값입니다. 매개 변수에 @code{'='} 부호가 없으면 값은 빈 문자열이고, 그렇지 않으면 값은 @ref{3bc5,,get_param()}에 설명된대로이며 선택적 `unquote'가 @code{True}(기본값)이면 인용되지 않습니다.

선택적 `failobj'는 @code{Content-Type} 헤더가 없을 때 반환할 객체입니다. 선택적 `header'는 @code{Content-Type} 대신 검색할 헤더입니다.

This is a legacy method.  On the
@ref{57f,,EmailMessage} class its functionality is
replaced by the `params' property of the individual header objects
returned by the header access methods.
@end deffn

@geindex get_param() (email.message.Message 메서드)
@anchor{library/email compat32-message email message Message get_param}@anchor{3bc5}
@deffn {메서드} get_param (param, failobj=None, header='content-type', unquote=True)

@code{Content-Type} 헤더의 매개 변수 `param'의 값을 문자열로 반환합니다. 메시지에 @code{Content-Type} 헤더가 없거나 그러한 매개 변수가 없으면, `failobj'가 반환됩니다 (기본값은 @code{None}입니다).

선택적 `header'가 제공되면, @code{Content-Type} 대신 사용할 메시지 헤더를 지정합니다.

매개 변수 키는 항상 대소 문자를 구분하지 않고 비교됩니다. 반환 값은 문자열이거나, 매개 변수가 
@geindex RFC; RFC 2231
RFC 2231@footnote{https://datatracker.ietf.org/doc/html/rfc2231.html}로 인코딩되었으면 3-튜플일 수 있습니다. 3-튜플일 때, 값의 요소는 @code{(CHARSET, LANGUAGE, VALUE)} 형식입니다. @code{CHARSET}과 @code{LANGUAGE}는 모두 @code{None}일 수 있으며, 이 경우 @code{VALUE}가 @code{us-ascii} 문자 집합으로 인코딩된 것으로 간주해야 함에 유의하십시오. 일반적으로 @code{LANGUAGE}를 무시할 수 있습니다.

응용 프로그램이 
@geindex RFC; RFC 2231
RFC 2231@footnote{https://datatracker.ietf.org/doc/html/rfc2231.html}로 매개 변수가 인코딩되었는지를 신경 쓰지 않으면, @ref{3bc6,,email.utils.collapse_rfc2231_value()}를 호출하면서 @ref{3bc5,,get_param()}의 반환 값을 전달하여 매개 변숫값을 축소할 수 있습니다. 이것은 값이 튜플이면 적절하게 디코딩된 유니코드 문자열을 반환하고, 그렇지 않으면 원래 문자열을 인용 없이 반환합니다. 예를 들면:

@example
rawparam = msg.get_param('foo')
param = email.utils.collapse_rfc2231_value(rawparam)
@end example

모든 경우에, `unquote'가 @code{False}로 설정되어 있지 않으면, 매개 변숫값(반환된 문자열이나 3-튜플의 @code{VALUE} 항목)은 항상 인용되지 않습니다.

This is a legacy method.  On the
@ref{57f,,EmailMessage} class its functionality is
replaced by the `params' property of the individual header objects
returned by the header access methods.
@end deffn

@geindex set_param() (email.message.Message 메서드)
@anchor{library/email compat32-message email message Message set_param}@anchor{1138}
@deffn {메서드} set_param (param, value, header='Content-Type', requote=True, charset=None, language='@w{'}, replace=False)

@code{Content-Type} 헤더에서 매개 변수를 설정합니다. 매개 변수가 이미 헤더에 존재하면, 해당 값은 `value'로 대체됩니다. 이 메시지에 대해 @code{Content-Type} 헤더가 아직 정의되지 않았으면, @code{text/plain}으로 설정되고 
@geindex RFC; RFC 2045
RFC 2045@footnote{https://datatracker.ietf.org/doc/html/rfc2045.html}에 따라 새 매개 변숫값이 추가됩니다.

선택적 `header'는 @code{Content-Type}의 대체 헤더를 지정하며, 선택적 `requote'가 @code{False}(기본값은 @code{True})가 아닌 한 모든 매개 변수가 필요에 따라 인용됩니다.

선택적 `charset'이 지정되면, 매개 변수는 
@geindex RFC; RFC 2231
RFC 2231@footnote{https://datatracker.ietf.org/doc/html/rfc2231.html}에 따라 인코딩됩니다. 선택적 `language'는 RFC 2231 언어를 지정하며, 기본값은 빈 문자열입니다. `charset'과 `language'는 모두 문자열이어야 합니다.

`replace'가 @code{False}(기본값)이면 헤더가 헤더 리스트의 끝으로 이동합니다. `replace'가 @code{True}이면, 헤더는 제자리에서 갱신됩니다.


버전 3.4에서 변경: @code{replace} 키워드가 추가되었습니다.

@end deffn

@geindex del_param() (email.message.Message 메서드)
@anchor{library/email compat32-message email message Message del_param}@anchor{3bc7}
@deffn {메서드} del_param (param, header='content-type', requote=True)

@code{Content-Type} 헤더에서 지정된 매개 변수를 완전히 제거합니다. 매개 변수나 그 값 없이 헤더가 다시 작성됩니다. `requote'가 @code{False}(기본값은 @code{True})가 아닌 한 모든 값이 필요에 따라 인용됩니다. 선택적 `header'는 @code{Content-Type}의 대체 헤더를 지정합니다.
@end deffn

@geindex set_type() (email.message.Message 메서드)
@anchor{library/email compat32-message email message Message set_type}@anchor{3bc8}
@deffn {메서드} set_type (type, header='Content-Type', requote=True)

@code{Content-Type} 헤더의 주 유형과 부 유형을 설정합니다. `type'은 @code{maintype/subtype} 형식의 문자열이어야 합니다, 그렇지 않으면 @ref{2ec,,ValueError}가 발생합니다.

이 메서드는 모든 매개 변수를 그대로 유지하면서 @code{Content-Type} 헤더를 대체합니다. `requote'가 @code{False}이면, 기존 헤더의 인용을 그대로 두고, 그렇지 않으면 매개 변수가 인용됩니다 (기본값).

`header' 인자에 대체 헤더를 지정할 수 있습니다. @code{Content-Type} 헤더가 설정될 때 @code{MIME-Version} 헤더도 추가됩니다.

This is a legacy method.  On the
@ref{57f,,EmailMessage} class its functionality is
replaced by the @code{make_} and @code{add_} methods.
@end deffn

@geindex get_filename() (email.message.Message 메서드)
@anchor{library/email compat32-message email message Message get_filename}@anchor{3bc9}
@deffn {메서드} get_filename (failobj=None)

메시지의 @code{Content-Disposition} 헤더의 @code{filename} 매개 변숫값을 반환합니다. 헤더에 @code{filename} 매개 변수가 없으면, 이 메서드는 @code{Content-Type} 헤더에서 @code{name} 매개 변수를 찾는 것으로 폴 백합니다. 둘 다 없거나, 헤더가 없으면, `failobj'가 반환됩니다. 반환된 문자열은 항상 @ref{3b0e,,email.utils.unquote()}로 인용 해제됩니다.
@end deffn

@geindex get_boundary() (email.message.Message 메서드)
@anchor{library/email compat32-message email message Message get_boundary}@anchor{3bca}
@deffn {메서드} get_boundary (failobj=None)

메시지의 @code{Content-Type} 헤더의 @code{boundary} 매개 변숫값이나, 헤더가 없거나 @code{boundary} 매개 변수가 없으면 `failobj'를 반환합니다. 반환된 문자열은 항상 @ref{3b0e,,email.utils.unquote()}로 인용 해제됩니다.
@end deffn

@geindex set_boundary() (email.message.Message 메서드)
@anchor{library/email compat32-message email message Message set_boundary}@anchor{3bcb}
@deffn {메서드} set_boundary (boundary)

@code{Content-Type} 헤더의 @code{boundary} 매개 변수를 `boundary'로 설정합니다. 필요하면 @ref{3bcb,,set_boundary()}는 항상 `boundary'를 인용합니다. 메시지 객체에 @code{Content-Type} 헤더가 없으면 @ref{3b11,,HeaderParseError} 가 발생합니다.

@ref{3bcb,,set_boundary()}는 헤더 리스트에서 @code{Content-Type} 헤더의 순서를 유지하므로, 이 메서드를 사용하는 것은 이전 @code{Content-Type} 헤더를 삭제하고 @ref{1881,,add_header()}를 통해 새 경계를 가진 새 헤더를 추가하는 것과 미묘하게 다름에 유의하십시오. 그러나 원래 @code{Content-Type} 헤더에 있을 수 있는 이어지는 줄(continuation lines)을 유지하지 `않습니다'.
@end deffn

@geindex get_content_charset() (email.message.Message 메서드)
@anchor{library/email compat32-message email message Message get_content_charset}@anchor{3bcc}
@deffn {메서드} get_content_charset (failobj=None)

@code{Content-Type} 헤더의 @code{charset} 매개 변수를 소문자로 강제 변환하여 반환합니다. @code{Content-Type} 헤더가 없거나, 해당 헤더에 @code{charset} 매개 변수가 없으면 `failobj'가 반환됩니다.

이 메서드는 메시지 본문의 기본 인코딩에 대한 @ref{ffa,,Charset} 인스턴스를 반환하는 @ref{3bb5,,get_charset()}과 다름에 유의하십시오.
@end deffn

@geindex get_charsets() (email.message.Message 메서드)
@anchor{library/email compat32-message email message Message get_charsets}@anchor{3bcd}
@deffn {메서드} get_charsets (failobj=None)

메시지 내의 문자 집합 이름을 포함하는 리스트를 반환합니다. 메시지가 @code{multipart}이면, 리스트에 페이 로드의 각 서브 파트마다 하나의 요소가 포함되며, 그렇지 않으면 길이 1인 리스트가 됩니다.

리스트의 각 항목은 표현된 서브 파트에 대한 @code{Content-Type} 헤더의 @code{charset} 매개 변숫값인 문자열입니다. 그러나, 서브 파트에 @code{Content-Type} 헤더가 없거나, @code{charset} 매개 변수가 없거나, @code{text} 주 MIME 유형이 아니면, 반환된 목록의 해당 항목은 `failobj'가 됩니다.
@end deffn

@geindex get_content_disposition() (email.message.Message 메서드)
@anchor{library/email compat32-message email message Message get_content_disposition}@anchor{ff7}
@deffn {메서드} get_content_disposition ()

있다면 메시지의 @code{Content-Disposition} 헤더의 (매개 변수가 없는) 소문자 값을, 그렇지 않으면 @code{None}을 반환합니다. 메시지가 
@geindex RFC; RFC 2183
RFC 2183@footnote{https://datatracker.ietf.org/doc/html/rfc2183.html}을 따른다면 이 메서드의 가능한 값은 `inline', `attachment' 또는 @code{None}입니다.


Added in version 3.5.

@end deffn

@geindex walk() (email.message.Message 메서드)
@anchor{library/email compat32-message email message Message walk}@anchor{3bce}
@deffn {메서드} walk ()

@ref{3bce,,walk()} 메서드는 메시지 객체 트리의 모든 파트와 서브 파트를 깊이 우선 탐색 순서로 이터레이트 하는 데 사용할 수 있는 범용 제너레이터입니다. 일반적으로 @code{walk()}를 @code{for} 루프에서 이터레이터로 사용합니다; 각 이터레이션은 다음 서브 파트를 반환합니다.

다음은 멀티 파트 메시지 구조의 모든 파트에 대한 MIME 유형을 인쇄하는 예입니다:

@c import email
@c from email import message_from_binary_file
@c from os.path import join, dirname
@c lib_dir = dirname(dirname(email.__file__))
@c file_path = join(lib_dir, 'test/test_email/data/msg_16.txt')
@c with open(file_path, 'rb') as f:
@c     msg = message_from_binary_file(f)
@c from email.iterators import _structure

@example
>>> for part in msg.walk():
...     print(part.get_content_type())
multipart/report
text/plain
message/delivery-status
text/plain
text/plain
message/rfc822
text/plain
@end example

@code{msg.get_content_maintype() == 'multipart'}가 @code{False}를 반환하더라도, @code{walk}는 @ref{3b15,,is_multipart()}가 @code{True}를 반환하는 모든 파트의 서브 파트를 이터레이트 합니다. @code{_structure} 디버그 도우미 함수를 사용하여 예제에서 이를 확인할 수 있습니다:

@example
>>> for part in msg.walk():
...     print(part.get_content_maintype() == 'multipart',
...           part.is_multipart())
True True
False False
False True
False False
False False
False True
False False
>>> _structure(msg)
multipart/report
    text/plain
    message/delivery-status
        text/plain
        text/plain
    message/rfc822
        text/plain
@end example

여기서 @code{message} 파트는 @code{multiparts}가 아니지만, 서브 파트를 포함합니다. @code{is_multipart()}는 @code{True}를 반환하고 @code{walk}는 서브 파트로 내려갑니다.
@end deffn

@ref{580,,Message} 객체는 MIME 메시지의 단순 텍스트를 생성할 때 사용할 수 있는 두 개의 인스턴스 어트리뷰트를 선택적으로 포함할 수 있습니다.

@geindex preamble (email.message.Message의 속성)
@anchor{library/email compat32-message email message Message preamble}@anchor{3bcf}
@deffn {속성} preamble

MIME 문서의 형식은 헤더 다음의 빈 줄과 첫 번째 멀티 파트 경계 문자열 사이에 일부 텍스트를 허용합니다. 일반적으로, 이 텍스트는 표준 MIME 장비를 벗어나기 때문에 MIME 인식 메일 리더에서 볼 수 없습니다. 그러나, 메시지의 원시 텍스트를 보거나, MIME을 인식하지 않는 리더에서 메시지를 볼 때, 이 텍스트가 보일 수 있습니다.

`preamble' 어트리뷰트에는 MIME 문서에 대한 이 선행 추가 텍스트가 포함됩니다. @ref{13a2,,Parser}가 헤더 다음이지만 첫 번째 경계 문자열 이전에 어떤 텍스트를 감지하면, 이 텍스트를 메시지의 `preamble' 어트리뷰트에 대입합니다. @ref{13d3,,Generator}가 MIME 메시지의 단순 텍스트 표현을 기록할 때, 메시지에 `preamble' 어트리뷰트가 있는 것을 발견하면, 헤더와 첫 번째 경계 사이의 영역에 이 텍스트를 기록합니다. 자세한 내용은 @ref{52,,email.parser}와 @ref{44,,email.generator}를 참조하십시오.

메시지 객체에 프리앰블이 없으면, `preamble' 어트리뷰트는 @code{None}이 됨에 유의하십시오.
@end deffn

@geindex epilogue (email.message.Message의 속성)
@anchor{library/email compat32-message email message Message epilogue}@anchor{3bd0}
@deffn {속성} epilogue

`epilogue' 어트리뷰트는 메시지의 마지막 경계와 끝 사이에 나타나는 텍스트를 포함한다는 점을 제외하고, `preamble' 어트리뷰트와 같은 방식으로 작동합니다.

@ref{13d3,,Generator}가 파일 끝에서 줄 넘김을 인쇄하도록 하기 위해 에필로그를 빈 문자열로 설정할 필요는 없습니다.
@end deffn

@geindex defects (email.message.Message의 속성)
@anchor{library/email compat32-message email message Message defects}@anchor{3bd1}
@deffn {속성} defects

`defects' 어트리뷰트는 이 메시지를 구문 분석할 때 발견된 모든 결함의 리스트를 포함합니다. 가능한 구문 분석 결함에 대한 자세한 설명은 @ref{43,,email.errors}를 참조하십시오.
@end deffn
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node email mime 처음부터 이메일과 MIME 객체 만들기,email header 국제화된 헤더,email message Message compat32 API를 사용하여 이메일 메시지 표현하기,email — 전자 메일과 MIME 처리 패키지
@anchor{library/email mime doc}@anchor{3bd2}@anchor{library/email mime email-mime-creating-email-and-mime-objects-from-scratch}@anchor{3bd3}@anchor{library/email mime module-email mime}@anchor{49}@anchor{library/email mime translation-repo}@anchor{3bd4}
@subsubsection @code{email.mime}: 처음부터 이메일과 MIME 객체 만들기


@geindex module; email.mime

`소스 코드:' Lib/email/mime/@footnote{https://github.com/python/cpython/tree/3.14/Lib/email/mime/}


__________________________________________________________________


이 모듈은 레거시 (@code{Compat32}) 이메일 API의 일부입니다. 새로운 API에서는 기능이 @ref{41,,contentmanager}로 부분적으로 대체되지만, 특정 응용 프로그램에서는 이 클래스들이 레거시 코드가 아닌 곳에서도 여전히 유용할 수 있습니다.

일반적으로, 파일이나 일부 텍스트를, 텍스트를 구문 분석하고 루트 메시지 객체를 반환하는 구문 분석기에 전달하여 메시지 객체 구조를 얻습니다. 그러나 처음부터 완전한 메시지 구조를 만들거나, 개별 @ref{580,,Message} 객체를 직접 만들 수도 있습니다. 실제로, 기존 구조를 가져와서 새로운 @code{Message} 객체를 추가하거나 이동시킬 수도 있습니다. 이렇게 하면 MIME 메시지를 잘게 자르고 재배치하는 매우 편리한 인터페이스가 만들어집니다.

@ref{580,,Message} 인스턴스를 만들고 첨부 파일과 모든 적절한 헤더를 수동으로 추가하여 새 객체 구조를 만들 수 있습니다. 그러나 MIME 메시지의 경우, @ref{3f,,email} 패키지는 작업을 쉽게 하기 위해 편리한 서브 클래스를 제공합니다.

클래스는 다음과 같습니다:

@geindex module; email.mime.base

@geindex MIMEBase (email.mime.base 클래스)
@anchor{library/email mime module-email mime base}@anchor{4c}@anchor{library/email mime email mime base MIMEBase}@anchor{3bd5}
@deffn {클래스} email.mime.base.MIMEBase (_maintype, _subtype, *, policy=compat32, **_params)

모듈: @ref{4c,,email.mime.base}

이것은 @ref{580,,Message}의 모든 MIME 특정 서브 클래스의 베이스 클래스입니다. 일반적으로, 할 수는 있지만, @ref{3bd5,,MIMEBase}의 인스턴스를 만들지는 않습니다. @code{MIMEBase}는 주로 더 구체적인 MIME 인식 서브 클래스를 위한 편리한 베이스 클래스로 제공됩니다.

`_maintype'은 @code{Content-Type} 주 유형(예를 들어 @code{text}나 @code{image})이고, `_subtype'은 @code{Content-Type} 부 유형(예를 들어 @code{plain}이나 @code{gif})입니다. `_params'는 매개 변수 키/값 딕셔너리이며 @ref{1881,,Message.add_header}로 직접 전달됩니다.

`policy'가 지정되면 (기본값은 @ref{12b9,,compat32} 정책입니다), @ref{580,,Message}로 전달됩니다.

@ref{3bd5,,MIMEBase} 클래스는 항상 (`_maintype', `_subtype' 및 `_params'에 기반하는) @code{Content-Type} 헤더와 (항상 @code{1.0}으로 설정되는) @code{MIME-Version} 헤더를 추가합니다.


버전 3.6에서 변경: `policy' 키워드 전용 매개 변수를 추가했습니다.

@end deffn

@geindex module; email.mime.nonmultipart

@geindex MIMENonMultipart (email.mime.nonmultipart 클래스)
@anchor{library/email mime module-email mime nonmultipart}@anchor{50}@anchor{library/email mime email mime nonmultipart MIMENonMultipart}@anchor{3b6a}
@deffn {클래스} email.mime.nonmultipart.MIMENonMultipart

모듈: @ref{50,,email.mime.nonmultipart}

@ref{3bd5,,MIMEBase}의 서브 클래스, @code{multipart} 가 아닌 MIME 메시지의 중간 베이스 클래스입니다. 이 클래스의 기본 목적은 @code{multipart} 메시지에만 적합한 @ref{3b22,,attach()} 메서드 사용을 방지하는 것입니다. @code{attach()}가 호출되면 @ref{3b69,,MultipartConversionError} 예외가 발생합니다.
@end deffn

@geindex module; email.mime.multipart

@geindex MIMEMultipart (email.mime.multipart 클래스)
@anchor{library/email mime module-email mime multipart}@anchor{4f}@anchor{library/email mime email mime multipart MIMEMultipart}@anchor{3bd6}
@deffn {클래스} email.mime.multipart.MIMEMultipart (_subtype='mixed', boundary=None, _subparts=None, *, policy=compat32, **_params)

모듈: @ref{4f,,email.mime.multipart}

@ref{3bd5,,MIMEBase}의 서브 클래스, @code{multipart} 인 MIME 메시지의 중간 베이스 클래스입니다. 선택적 `_subtype'의 기본값은 @code{mixed}이지만, 메시지의 부 유형을 지정하는 데 사용할 수 있습니다. @code{multipart/_subtype}의 @code{Content-Type} 헤더가 메시지 객체에 추가됩니다. @code{MIME-Version} 헤더도 추가됩니다.

선택적 `boundary'는 멀티 파트 경계 문자열입니다. @code{None}(기본값)이면, 경계는 필요할 때 (예를 들어 메시지가 직렬화될 때) 계산됩니다.

`_subparts'는 페이 로드의 초기 서브 파트 시퀀스입니다. 이 시퀀스를 리스트로 변환할 수 있어야 합니다. @ref{3b22,,Message.attach} 메서드를 사용하여 항상 메시지에 새 서브 파트를 첨부할 수 있습니다.

선택적 `policy' 인자의 기본값은 @ref{12b9,,compat32}입니다.

@code{Content-Type} 헤더에 대한 추가 매개 변수는 키워드 인자에서 취하거나, 키워드 딕셔너리인 `_params' 인자로 전달됩니다.


버전 3.6에서 변경: `policy' 키워드 전용 매개 변수를 추가했습니다.

@end deffn

@geindex module; email.mime.application

@geindex MIMEApplication (email.mime.application 클래스)
@anchor{library/email mime module-email mime application}@anchor{4a}@anchor{library/email mime email mime application MIMEApplication}@anchor{3bd7}
@deffn {클래스} email.mime.application.MIMEApplication (_data, _subtype='octet-stream', _encoder=email.encoders.encode_base64, *, policy=compat32, **_params)

모듈: @ref{4a,,email.mime.application}

@ref{3b6a,,MIMENonMultipart} 의 서브 클래스, @ref{3bd7,,MIMEApplication} 클래스는 주 유형 @code{application}의 MIME 메시지 객체를 나타내는 데 사용됩니다. `_data'는 원시 애플리케이션 데이터의 바이트 열을 포함합니다. 선택적 `_subtype'은 MIME 부 유형을 지정하고 기본값은 @code{octet-stream}입니다.

선택적 `_encoder'는 전송을 위해 데이터의 실제 인코딩을 수행할 콜러블(즉, 함수)입니다. 이 콜러블은 @ref{3bd7,,MIMEApplication} 인스턴스인 하나의 인자를 취합니다. 페이 로드를 인코딩된 형식으로 변경하려면 @ref{13d2,,get_payload()}와 @ref{3bb3,,set_payload()}를 사용해야 합니다. 또한, 필요에 따라 @code{Content-Transfer-Encoding}이나 기타 헤더를 메시지 객체에 추가해야 합니다. 기본 인코딩은 base64입니다. 내장 인코더의 목록은 @ref{42,,email.encoders} 모듈을 참조하십시오.

선택적 `policy' 인자의 기본값은 @ref{12b9,,compat32}입니다.

`_params'는 베이스 클래스 생성자로 바로 전달됩니다.


버전 3.6에서 변경: `policy' 키워드 전용 매개 변수를 추가했습니다.

@end deffn

@geindex module; email.mime.audio

@geindex MIMEAudio (email.mime.audio 클래스)
@anchor{library/email mime module-email mime audio}@anchor{4b}@anchor{library/email mime email mime audio MIMEAudio}@anchor{3bd8}
@deffn {클래스} email.mime.audio.MIMEAudio (_audiodata, _subtype=None, _encoder=email.encoders.encode_base64, *, policy=compat32, **_params)

모듈: @ref{4b,,email.mime.audio}

@ref{3b6a,,MIMENonMultipart} 의 서브 클래스, @ref{3bd8,,MIMEAudio} 클래스는 주 유형 @code{audio}의 MIME 메시지 객체를 만드는 데 사용됩니다. `_audiodata'는 원시 오디오 데이터의 바이트 열을 포함합니다. 이 데이터를 au, wav, aiff 또는 aifc로 디코딩 할 수 있으면, 부 유형이 @code{Content-Type} 헤더에 자동으로 포함됩니다. 그렇지 않으면 `_subtype' 인자를 통해 audio 부 유형을 명시적으로 지정할 수 있습니다. 부 유형을 추측할 수 없고 `_subtype'이 제공되지 않으면, @ref{198,,TypeError}가 발생합니다.

선택적 `_encoder'는 전송을 위해 오디오 데이터의 실제 인코딩을 수행할 콜러블(즉, 함수)입니다. 이 콜러블은 @ref{3bd8,,MIMEAudio} 인스턴스인 하나의 인자를 취합니다. 페이 로드를 인코딩된 형식으로 변경하려면 @ref{13d2,,get_payload()}와 @ref{3bb3,,set_payload()}를 사용해야 합니다. 또한 필요에 따라 @code{Content-Transfer-Encoding}이나 기타 헤더를 메시지 객체에 추가해야 합니다. 기본 인코딩은 base64입니다. 내장 인코더의 목록은 @ref{42,,email.encoders} 모듈을 참조하십시오.

선택적 `policy' 인자의 기본값은 @ref{12b9,,compat32}입니다.

`_params'는 베이스 클래스 생성자로 바로 전달됩니다.


버전 3.6에서 변경: `policy' 키워드 전용 매개 변수를 추가했습니다.

@end deffn

@geindex module; email.mime.image

@geindex MIMEImage (email.mime.image 클래스)
@anchor{library/email mime module-email mime image}@anchor{4d}@anchor{library/email mime email mime image MIMEImage}@anchor{3b6b}
@deffn {클래스} email.mime.image.MIMEImage (_imagedata, _subtype=None, _encoder=email.encoders.encode_base64, *, policy=compat32, **_params)

모듈: @ref{4d,,email.mime.image}

@ref{3b6a,,MIMENonMultipart} 의 서브 클래스, @ref{3b6b,,MIMEImage} 클래스는 주 유형 @code{image}의 MIME 메시지 객체를 만드는 데 사용됩니다. `_imagedata'는 원시 이미지 데이터의 바이트 열을 포함합니다. 이 데이터 형이 감지된다면 (jpeg, png, gif, tiff, rgb, pbm, pgm, ppm, rast, xbm, bmp, webp 과 exr 을 시도합니다), 부 유형이 @code{Content-Type} 헤더에 자동으로 포함됩니다. 그렇지 않으면 `_subtype' 인자를 통해 image 부 유형을 명시적으로 지정할 수 있습니다. 부 유형을 추측할 수 없고 `_subtype'이 제공되지 않으면, @ref{198,,TypeError}가 발생합니다.

선택적 `_encoder'는 전송을 위해 이미지 데이터의 실제 인코딩을 수행할 콜러블(즉, 함수)입니다. 이 콜러블은 @ref{3b6b,,MIMEImage} 인스턴스인 하나의 인자를 취합니다. 페이 로드를 인코딩된 형식으로 변경하려면 @ref{13d2,,get_payload()}와 @ref{3bb3,,set_payload()}를 사용해야 합니다. 또한 필요에 따라 @code{Content-Transfer-Encoding}이나 기타 헤더를 메시지 객체에 추가해야 합니다. 기본 인코딩은 base64입니다. 내장 인코더의 목록은 @ref{42,,email.encoders} 모듈을 참조하십시오.

선택적 `policy' 인자의 기본값은 @ref{12b9,,compat32}입니다.

`_params'는 @ref{3bd5,,MIMEBase} 생성자로 바로 전달됩니다.


버전 3.6에서 변경: `policy' 키워드 전용 매개 변수를 추가했습니다.

@end deffn

@geindex module; email.mime.message

@geindex MIMEMessage (email.mime.message 클래스)
@anchor{library/email mime module-email mime message}@anchor{4e}@anchor{library/email mime email mime message MIMEMessage}@anchor{3bd9}
@deffn {클래스} email.mime.message.MIMEMessage (_msg, _subtype='rfc822', *, policy=compat32)

모듈: @ref{4e,,email.mime.message}

@ref{3b6a,,MIMENonMultipart} 의 서브 클래스, @ref{3bd9,,MIMEMessage} 클래스는 주 유형 @code{message}의 MIME 객체를 만드는 데 사용됩니다. `_msg'는 페이 로드로 사용되며, @ref{580,,Message} 클래스(또는 그 서브 클래스)의 인스턴스여야 합니다, 그렇지 않으면 @ref{198,,TypeError}가 발생합니다.

선택적 `_subtype'은 메시지의 부 유형을 설정합니다; 기본값은 @code{rfc822}입니다.

선택적 `policy' 인자의 기본값은 @ref{12b9,,compat32}입니다.


버전 3.6에서 변경: `policy' 키워드 전용 매개 변수를 추가했습니다.

@end deffn

@geindex module; email.mime.text

@geindex MIMEText (email.mime.text 클래스)
@anchor{library/email mime module-email mime text}@anchor{51}@anchor{library/email mime email mime text MIMEText}@anchor{ff9}
@deffn {클래스} email.mime.text.MIMEText (_text, _subtype='plain', _charset=None, *, policy=compat32)

모듈: @ref{51,,email.mime.text}

@ref{3b6a,,MIMENonMultipart} 의 서브 클래스, @ref{ff9,,MIMEText} 클래스는 주 유형 @code{text}의 MIME 객체를 만드는 데 사용됩니다. `_text'는 페이 로드의 문자열입니다. `_subtype'은 부 유형이며 기본값은 @code{plain}입니다. `_charset'은 텍스트의 문자 집합이며 @code{MIMENonMultipart} 생성자에 인자로 전달됩니다; 기본값은 문자열에 @code{ascii} 코드 포인트만 포함되어 있으면 @code{us-ascii}이고, 그렇지 않으면 @code{utf-8}입니다. `_charset' 매개 변수는 문자열이나 @ref{ffa,,Charset} 인스턴스를 받아들입니다.

`_charset' 인자가 명시적으로 @code{None}으로 설정되어 있지 않은 한, 만들어진 MIMEText 객체에는 @code{charset} 매개 변수가 있는 @code{Content-Type} 헤더와 @code{Content-Transfer-Encoding} 헤더가 모두 있습니다. 이는 charset이 @code{set_payload} 명령으로 전달되더라도, 후속 @code{set_payload} 호출이 인코딩된 페이 로드를 만들지 않음을 의미합니다. @code{Content-Transfer-Encoding} 헤더를 삭제하여 이 동작을 “재설정”할 수 있으며, 그 후에 @code{set_payload} 호출은 자동으로 새 페이 로드를 인코딩합니다 (그리고 새 @code{Content-Transfer-Encoding} 헤더를 추가합니다).

선택적 `policy' 인자의 기본값은 @ref{12b9,,compat32}입니다.


버전 3.5에서 변경: `_charset'은 @ref{ffa,,Charset} 인스턴스도 받아들입니다.



버전 3.6에서 변경: `policy' 키워드 전용 매개 변수를 추가했습니다.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node email header 국제화된 헤더,email charset 문자 집합 표현,email mime 처음부터 이메일과 MIME 객체 만들기,email — 전자 메일과 MIME 처리 패키지
@anchor{library/email header doc}@anchor{3bda}@anchor{library/email header email-header-internationalized-headers}@anchor{3bdb}@anchor{library/email header module-email header}@anchor{45}@anchor{library/email header translation-repo}@anchor{3bdc}
@subsubsection @code{email.header}: 국제화된 헤더


@geindex module; email.header

`소스 코드:' Lib/email/header.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/email/header.py}


__________________________________________________________________


이 모듈은 레거시 (@code{Compat32}) 이메일 API의 일부입니다. 현재 API에서 헤더의 인코딩과 디코딩은 @ref{57f,,EmailMessage} 클래스의 딕셔너리와 유사한 API에 의해 투명하게 처리됩니다. 레거시 코드에서 사용하는 것 외에도, 이 모듈은 헤더를 인코딩할 때 사용되는 문자 집합을 완전히 제어해야 하는 응용 프로그램에서 유용할 수 있습니다.

이 섹션의 나머지 텍스트는 모듈의 원본 설명서입니다.

@geindex RFC; RFC 2822
RFC 2822@footnote{https://datatracker.ietf.org/doc/html/rfc2822.html}는 이메일 메시지 형식을 기술하는 기본 표준입니다. 대부분의 이메일이 ASCII 문자로만 구성된 당시에 널리 사용된 이전 
@geindex RFC; RFC 822
RFC 822@footnote{https://datatracker.ietf.org/doc/html/rfc822.html} 표준에서 파생됩니다. 
@geindex RFC; RFC 2822
RFC 2822@footnote{https://datatracker.ietf.org/doc/html/rfc2822.html}는 이메일에 7비트 ASCII 문자만 포함되어 있다고 가정한 명세입니다.

Of course, as email has been deployed worldwide, it has become
internationalized, such that language specific character sets can now be used in
email messages.  The base standard still requires email messages to be
transferred using only 7-bit ASCII characters, so a slew of RFCs have been
written describing how to encode email containing non-ASCII characters into
@geindex RFC; RFC 2822
RFC 2822@footnote{https://datatracker.ietf.org/doc/html/rfc2822.html}-compliant format. These RFCs include 
@geindex RFC; RFC 2045
RFC 2045@footnote{https://datatracker.ietf.org/doc/html/rfc2045.html}, 
@geindex RFC; RFC 2046
RFC 2046@footnote{https://datatracker.ietf.org/doc/html/rfc2046.html},
@geindex RFC; RFC 2047
RFC 2047@footnote{https://datatracker.ietf.org/doc/html/rfc2047.html}, and 
@geindex RFC; RFC 2231
RFC 2231@footnote{https://datatracker.ietf.org/doc/html/rfc2231.html}. The @ref{3f,,email} package supports these standards
in its @code{email.header} and @ref{40,,email.charset} modules.

If you want to include non-ASCII characters in your email headers, say in the
@code{Subject} or @code{To} fields, you should use the
@ref{1c5c,,Header} class and assign the field in the @ref{580,,Message}
object to an instance of @code{Header} instead of using a string for the header
value.  Import the @code{Header} class from the @code{email.header} module.
For example:

@example
>>> from email.message import Message
>>> from email.header import Header
>>> msg = Message()
>>> h = Header('p\xf6stal', 'iso-8859-1')
>>> msg['Subject'] = h
>>> msg.as_string()
'Subject: =?iso-8859-1?q?p=F6stal?=\n\n'
@end example

@code{Subject} 필드에 비 ASCII 문자를 포함하기 위해 어떻게 했는지 아시겠습니까? 우리는 @ref{1c5c,,Header} 인스턴스를 만들고 바이트 문자열이 인코딩된 문자 집합을 전달하여 이를 수행했습니다. 뒤에 @ref{580,,Message} 인스턴스가 평탄화될 때, @code{Subject} 필드는 올바르게 
@geindex RFC; RFC 2047
RFC 2047@footnote{https://datatracker.ietf.org/doc/html/rfc2047.html} 인코딩되었습니다. MIME 인식 메일 리더는 내장된 ISO-8859-1 문자를 사용하여 이 헤더를 표시하게 됩니다.

@ref{1c5c,,Header} 클래스 설명은 다음과 같습니다:

@geindex Header (email.header 클래스)
@anchor{library/email header email header Header}@anchor{1c5c}
@deffn {클래스} email.header.Header (s=None, charset=None, maxlinelen=None, header_name=None, continuation_ws=' ', errors='strict')

다른 문자 집합의 문자열을 포함할 수 있는 MIME 호환 헤더를 만듭니다.

선택적 `s'는 초기 헤더 값입니다. @code{None}(기본값)이면, 초기 헤더 값이 설정되지 않습니다. 나중에 @ref{3bdd,,append()} 메서드 호출로 헤더에 추가할 수 있습니다. `s'는 @ref{192,,bytes}나 @ref{169,,str}의 인스턴스일 수 있지만, 의미에 대해서는 @code{append()} 설명서를 참조하십시오.

선택적 `charset'은 두 가지 용도로 사용됩니다: @ref{3bdd,,append()} 메서드에 대한 `charset' 인자와 같은 의미입니다. 또한, `charset' 인자를 생략하는 모든 후속 @code{append()} 호출에 대한 기본 문자 집합을 설정합니다. `charset'이 생성자에 제공되지 않으면 (기본값), @code{us-ascii} 문자 집합이 `s'의 초기 문자 집합과 후속 @code{append()} 호출의 기본값으로 사용됩니다.

최대 줄 길이는 `maxlinelen'을 통해 명시적으로 지정할 수 있습니다. (`s'에 포함되지 않은 필드 헤더를 고려하기 위해, 예를 들어 @code{Subject}) 첫 번째 줄을 더 짧은 값으로 분할하려면 `header_name'에 필드 이름을 전달하십시오. 기본 `maxlinelen'은 78이고, `header_name'의 기본값은 @code{None}입니다, 이는 긴 분할 헤더의 첫 번째 줄을 고려하지 않음을 의미합니다.

선택적인 `continuation_ws'는 
@geindex RFC; RFC 2822
RFC 2822@footnote{https://datatracker.ietf.org/doc/html/rfc2822.html} 호환 접는 공백(folding whitespace)이어야하며, 일반적으로 스페이스나 하드 탭 문자입니다. 이 문자는 연속 줄 앞에 추가됩니다. `continuation_ws'는 기본적으로 단일 스페이스 문자입니다.

선택적 `errors'는 @ref{3bdd,,append()} 메서드로 바로 전달됩니다.

@geindex append() (email.header.Header 메서드)
@anchor{library/email header email header Header append}@anchor{3bdd}
@deffn {메서드} append (s, charset=None, errors='strict')

문자열 `s'를 MIME 헤더에 추가합니다.

선택적인 `charset'(제공되면)은 @ref{ffa,,Charset} 인스턴스(@ref{40,,email.charset}을 참조하십시오)나 문자 집합의 이름이어야 하며, 이는 @code{Charset} 인스턴스로 변환됩니다. @code{None}(기본값) 값은 생성자에 지정된 `charset'이 사용됨을 의미합니다.

`s'는 @ref{192,,bytes}나 @ref{169,,str}의 인스턴스일 수 있습니다. @code{bytes}의 인스턴스이면, `charset'은 해당 바이트 문자열의 인코딩이며, 문자열을 해당 문자 집합으로 디코딩할 수 없으면 @ref{462,,UnicodeError}가 발생합니다.

`s'가 @ref{169,,str}의 인스턴스이면, `charset'은 문자열에 있는 문자의 문자 집합을 지정하는 힌트입니다.

두 경우 모두, 
@geindex RFC; RFC 2047
RFC 2047@footnote{https://datatracker.ietf.org/doc/html/rfc2047.html} 규칙을 사용하여 
@geindex RFC; RFC 2822
RFC 2822@footnote{https://datatracker.ietf.org/doc/html/rfc2822.html} 호환 헤더를 생성할 때, 문자열은 charset의 출력 코덱을 사용하여 인코딩됩니다. 출력 코덱을 사용하여 문자열을 인코딩할 수 없으면 UnicodeError가 발생합니다.

선택적 `errors'는 `s'가 바이트 문자열일 때 decode 호출에 errors 인자로 전달됩니다.
@end deffn

@geindex encode() (email.header.Header 메서드)
@anchor{library/email header email header Header encode}@anchor{3bde}
@deffn {메서드} encode (splitchars=';, \t', maxlinelen=None, linesep='\n')

메시지 헤더를 RFC 호환 형식으로 인코딩합니다. 긴 줄을 래핑하고 비 ASCII 부분을 base64나 quoted-printable 인코딩으로 캡슐화할 수 있습니다.

선택적 `splitchars'는 일반 헤더 래핑 중 분할 알고리즘에 의해 추가 가중치를 받아야 하는 문자를 포함하는 문자열입니다. 이것은 
@geindex RFC; RFC 2822
RFC 2822@footnote{https://datatracker.ietf.org/doc/html/rfc2822.html}의 ‘높은 수준의 구문 분할’을 아주 거칠게 지원합니다: 분할 문자 뒤에 오는 분리 점이 줄 분할 중에 선호되며, 문자열에 나타나는 순서대로 문자가 선호됩니다. 스페이스와 탭이 문자열에 포함되어 다른 분할 문자가 분할되는 줄에 나타나지 않을 때 분할 지점으로 어느 것을 선호해야 하는지를 나타낼 수 있습니다. Splitchars는 
@geindex RFC; RFC 2047
RFC 2047@footnote{https://datatracker.ietf.org/doc/html/rfc2047.html} 인코딩 된 줄에 영향을 미치지 않습니다.

주어지면, `maxlinelen'은 최대 줄 길이에 대한 인스턴스의 값을 대체합니다.

`linesep'은 접힌 헤더의 줄을 구분하는 데 사용되는 문자를 지정합니다. 기본적으로 파이썬 응용 프로그램 코드에 가장 유용한 값이지만 (@code{\n}), RFC 호환 줄 구분자로 헤더를 생성하기 위해 @code{\r\n}을 지정할 수 있습니다.


버전 3.2에서 변경: `linesep' 인자를 추가했습니다.

@end deffn

@ref{1c5c,,Header} 클래스는 표준 연산자와 내장 함수를 지원하기 위한 많은 메서드도 제공합니다.

@geindex __str__() (email.header.Header 메서드)
@anchor{library/email header email header Header __str__}@anchor{3bdf}
@deffn {메서드} __str__ ()

무제한 줄 길이를 사용하여, @ref{1c5c,,Header}의 근삿값을 문자열로 반환합니다. 모든 조각은 지정된 인코딩을 사용하여 유니코드로 변환되고 적절하게 결합합니다. 문자 집합이 @code{'unknown-8bit'} 인 조각은 @code{'replace'} 에러 처리기를 사용하여 ASCII로 디코딩됩니다.


버전 3.2에서 변경: @code{'unknown-8bit'} 문자 집합에 대한 처리가 추가되었습니다.

@end deffn

@geindex __eq__() (email.header.Header 메서드)
@anchor{library/email header email header Header __eq__}@anchor{3be0}
@deffn {메서드} __eq__ (other)

이 메서드를 사용하면 두 개의 @ref{1c5c,,Header} 인스턴스가 같은지 비교할 수 있습니다.
@end deffn

@geindex __ne__() (email.header.Header 메서드)
@anchor{library/email header email header Header __ne__}@anchor{3be1}
@deffn {메서드} __ne__ (other)

이 메서드를 사용하면 두 @ref{1c5c,,Header} 인스턴스가 다른지 비교할 수 있습니다.
@end deffn
@end deffn

The @code{email.header} module also provides the following convenient functions.

@geindex decode_header() (email.header 모듈)
@anchor{library/email header email header decode_header}@anchor{12bd}
@deffn {함수} email.header.decode_header (header)

문자 집합을 변환하지 않고 메시지 헤더 값을 디코딩합니다. 헤더 값은 `header'에 있습니다.

For historical reasons, this function may return either:


@enumerate 

@item 
A list of pairs containing each of the decoded parts of the header,
@code{(decoded_bytes, charset)}, where `decoded_bytes' is always an instance of
@ref{192,,bytes}, and `charset' is either:

@quotation


@itemize -

@item 
A lower case string containing the name of the character set specified.

@item 
@code{None} for non-encoded parts of the header.
@end itemize
@end quotation

@item 
A list of length 1 containing a pair @code{(string, None)}, where
`string' is always an instance of @ref{169,,str}.
@end enumerate

An @ref{3b11,,email.errors.HeaderParseError} may be raised when certain decoding
errors occur (e.g. a base64 decoding exception).

Here are examples:

@example
>>> from email.header import decode_header
>>> decode_header('=?iso-8859-1?q?p=F6stal?=')
[(b'p\xf6stal', 'iso-8859-1')]
>>> decode_header('unencoded_string')
[('unencoded_string', None)]
>>> decode_header('bar =?utf-8?B?ZsOzbw==?=')
[(b'bar ', None), (b'f\xc3\xb3o', 'utf-8')]
@end example

@cartouche
@quotation 참고 
This function exists for backwards compatibility only. For
new code, we recommend using @ref{3b7b,,email.headerregistry.HeaderRegistry}.
@end quotation
@end cartouche
@end deffn

@geindex make_header() (email.header 모듈)
@anchor{library/email header email header make_header}@anchor{12be}
@deffn {함수} email.header.make_header (decoded_seq, maxlinelen=None, header_name=None, continuation_ws=' ')

@ref{12bd,,decode_header()}에 의해 반환된 것과 같은 쌍의 시퀀스로부터 @ref{1c5c,,Header} 인스턴스를 만듭니다.

@ref{12bd,,decode_header()}는 헤더 값 문자열을 취하고 @code{(decoded_string, charset)} 형식의 쌍의 시퀀스를 반환합니다. 여기서 `charset'은 문자 집합의 이름입니다.

이 함수는 해당 쌍의 시퀀스 중 하나를 취해서 @ref{1c5c,,Header} 인스턴스를 반환합니다. 선택적 `maxlinelen', `header_name' 및 `continuation_ws'는 @code{Header} 생성자에서와 같습니다.

@cartouche
@quotation 참고 
This function exists for backwards compatibility only, and is
not recommended for use in new code.
@end quotation
@end cartouche
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node email charset 문자 집합 표현,email encoders 인코더,email header 국제화된 헤더,email — 전자 메일과 MIME 처리 패키지
@anchor{library/email charset doc}@anchor{3be2}@anchor{library/email charset email-charset-representing-character-sets}@anchor{3be3}@anchor{library/email charset module-email charset}@anchor{40}@anchor{library/email charset translation-repo}@anchor{3be4}
@subsubsection @code{email.charset}: 문자 집합 표현


@geindex module; email.charset

`소스 코드:' Lib/email/charset.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/email/charset.py}


__________________________________________________________________


이 모듈은 레거시 (@code{Compat32}) 이메일 API의 일부입니다. 새 API에서는 별칭 표만 사용됩니다.

이 섹션의 나머지 텍스트는 모듈의 원본 설명서입니다.

이 모듈은 문자 집합 레지스트리와 이 레지스트리를 조작하기 위한 몇 가지 편의 메서드뿐만 아니라, 이메일 메시지의 문자 집합과 문자 집합 변환을 나타내는 @ref{ffa,,Charset} 클래스를 제공합니다. @code{Charset} 인스턴스는 @ref{3f,,email} 패키지 내의 다른 여러 모듈에서 사용됩니다.

Import this class from the @code{email.charset} module.

@geindex Charset (email.charset 클래스)
@anchor{library/email charset email charset Charset}@anchor{ffa}
@deffn {클래스} email.charset.Charset (input_charset=DEFAULT_CHARSET)

문자 집합을 이메일 속성으로 매핑합니다.

이 클래스는 특정 문자 집합에 대해 이메일에 요구되는 요구 사항에 대한 정보를 제공합니다. 또한 해당 코덱을 사용할 수 있으면, 문자 집합 간 변환을 위한 편의 루틴을 제공합니다. 문자 집합이 주어지면, RFC 호환 방식으로 이메일 메시지에서 해당 문자 집합을 사용하는 방법에 대한 정보를 제공하는 데 최선을 다합니다.

이메일 헤더나 본문에 사용될 때 특정 문자 집합은 quoted-printable이나 base64로 인코딩해야 합니다. 특정 문자 집합은 완전히 변환해야 하며, 이메일에서는 허용되지 않습니다.

선택적 `input_charset'은 아래에 설명된 것과 같습니다; 항상 소문자로 강제 변환됩니다. 별칭이 정규화된 후에는 문자 집합 레지스트리에서 조회로 사용되어 문자 집합을 위해 사용할 헤더 인코딩, 본문 인코딩 및 출력 변환 코덱을 찾습니다. 예를 들어, `input_charset'이 @code{iso-8859-1}이면, 헤더와 본문은 quoted-printable을 사용하여 인코딩되며 출력 변환 코덱은 필요하지 않습니다. `input_charset'이 @code{euc-jp}면, 헤더는 base64로 인코딩되고, 본문은 인코딩되지 않지만, 출력 텍스트는 @code{euc-jp} 문자 집합에서 @code{iso-2022-jp} 문자 집합으로 변환됩니다.

@ref{ffa,,Charset} 인스턴스에는 다음과 같은 데이터 어트리뷰트가 있습니다:

@geindex input_charset (email.charset.Charset의 속성)
@anchor{library/email charset email charset Charset input_charset}@anchor{3be5}
@deffn {속성} input_charset

지정된 초기 문자 집합. 일반적인 별칭은 `공식' 이메일 이름으로 변환됩니다 (예를 들어 @code{latin_1}은 @code{iso-8859-1}로 변환됩니다). 기본값은 7비트 @code{us-ascii}입니다.
@end deffn

@geindex header_encoding (email.charset.Charset의 속성)
@anchor{library/email charset email charset Charset header_encoding}@anchor{3be6}
@deffn {속성} header_encoding

문자 집합을 이메일 헤더에서 사용하기 전에 인코딩해야 하면, 이 어트리뷰트는 @code{charset.QP} (quoted-printable), @code{charset.BASE64} (base64 인코딩) 또는 QP나 BASE64 인코딩 중 가장 짧은 것을 뜻하는 @code{charset.SHORTEST}로 설정됩니다. 그렇지 않으면, @code{None}이 됩니다.
@end deffn

@geindex body_encoding (email.charset.Charset의 속성)
@anchor{library/email charset email charset Charset body_encoding}@anchor{3be7}
@deffn {속성} body_encoding

`header_encoding'과 같지만, 메일 메시지 본문의 인코딩을 기술합니다. 헤더 인코딩과 다를 수 있습니다. `body_encoding'에는 @code{charset.SHORTEST}가 허용되지 않습니다.
@end deffn

@geindex output_charset (email.charset.Charset의 속성)
@anchor{library/email charset email charset Charset output_charset}@anchor{3be8}
@deffn {속성} output_charset

일부 문자 집합은 이메일 헤더나 본문에 사용하기 전에 변환해야 합니다. `input_charset'이 그중 하나이면, 이 어트리뷰트에는 출력이 변환될 문자 집합의 이름이 포함됩니다. 그렇지 않으면 @code{None}이 됩니다.
@end deffn

@geindex input_codec (email.charset.Charset의 속성)
@anchor{library/email charset email charset Charset input_codec}@anchor{3be9}
@deffn {속성} input_codec

`input_charset'을 유니코드로 변환하는 데 사용되는 파이썬 코덱의 이름. 변환 코덱이 필요하지 않으면, 이 어트리뷰트는 @code{None}입니다.
@end deffn

@geindex output_codec (email.charset.Charset의 속성)
@anchor{library/email charset email charset Charset output_codec}@anchor{3bea}
@deffn {속성} output_codec

유니코드를 `output_charset'으로 변환하는 데 사용되는 파이썬 코덱의 이름. 변환 코덱이 필요하지 않으면, 이 어트리뷰트의 값은 `input_codec'과 같습니다.
@end deffn

@ref{ffa,,Charset} 인스턴스에는 다음과 같은 메서드도 있습니다:

@geindex get_body_encoding() (email.charset.Charset 메서드)
@anchor{library/email charset email charset Charset get_body_encoding}@anchor{3beb}
@deffn {메서드} get_body_encoding ()

본문 인코딩에 사용된 콘텐츠 전송 인코딩(content transfer encoding)을 반환합니다.

사용된 인코딩에 따라 문자열 @code{quoted-printable}이나 @code{base64}입니다. 또는 함수일 수 있는데, 이때는 인코딩되는 Message 객체를 단일 인자로 함수를 호출해야 합니다. 그러면 함수는 @code{Content-Transfer-Encoding} 헤더 자체를 적절한 것으로 설정해야 합니다.

`body_encoding'이 @code{QP}이면 문자열 @code{quoted-printable}을 반환하고, `body_encoding'이 @code{BASE64}이면 문자열 @code{base64}를 반환하고, 그렇지 않으면 문자열 @code{7bit}를 반환합니다.
@end deffn

@geindex get_output_charset() (email.charset.Charset 메서드)
@anchor{library/email charset email charset Charset get_output_charset}@anchor{3bec}
@deffn {메서드} get_output_charset ()

출력 문자 집합을 반환합니다.

@code{None}이 아니라면 `output_charset' 어트리뷰트이고, 그렇지 않으면 `input_charset'입니다.
@end deffn

@geindex header_encode() (email.charset.Charset 메서드)
@anchor{library/email charset email charset Charset header_encode}@anchor{3bed}
@deffn {메서드} header_encode (string)

문자열 `string'을 헤더 인코딩합니다.

인코딩 유형(base64나 quoted-printable)은 `header_encoding' 어트리뷰트를 기반으로 합니다.
@end deffn

@geindex header_encode_lines() (email.charset.Charset 메서드)
@anchor{library/email charset email charset Charset header_encode_lines}@anchor{3bee}
@deffn {메서드} header_encode_lines (string, maxlengths)

`string'을 먼저 바이트열로 변환하여 헤더 인코딩합니다.

이는 문자열이 인자 `maxlengths'에 의해 주어진 최대 줄 길이에 맞춰진다는 점을 제외하고는 @ref{3bed,,header_encode()}와 유사합니다. `maxlengths'는 이터레이터여야 합니다: 이 이터레이터에서 반환된 각 요소는 다음 최대 줄 길이를 제공합니다.
@end deffn

@geindex body_encode() (email.charset.Charset 메서드)
@anchor{library/email charset email charset Charset body_encode}@anchor{3bef}
@deffn {메서드} body_encode (string)

문자열 `string'을 본문 인코딩합니다.

인코딩 유형(base64나 quoted-printable)은 `body_encoding' 어트리뷰트를 기반으로 합니다.
@end deffn

@ref{ffa,,Charset} 클래스는 표준 연산과 내장 함수를 지원하는 여러 가지 메서드도 제공합니다.

@geindex __str__() (email.charset.Charset 메서드)
@anchor{library/email charset email charset Charset __str__}@anchor{3bf0}
@deffn {메서드} __str__ ()

`input_charset'을 소문자로 강제 변환된 문자열로 반환합니다. @code{__repr__()}은 @code{__str__()}의 별칭입니다.
@end deffn

@geindex __eq__() (email.charset.Charset 메서드)
@anchor{library/email charset email charset Charset __eq__}@anchor{3bf1}
@deffn {메서드} __eq__ (other)

이 메서드를 사용하면 두 개의 @ref{ffa,,Charset} 인스턴스가 같은지 비교할 수 있습니다.
@end deffn

@geindex __ne__() (email.charset.Charset 메서드)
@anchor{library/email charset email charset Charset __ne__}@anchor{3bf2}
@deffn {메서드} __ne__ (other)

이 메서드를 사용하면 두 @ref{ffa,,Charset} 인스턴스가 다른지 비교할 수 있습니다.
@end deffn
@end deffn

The @code{email.charset} module also provides the following functions for adding
new entries to the global character set, alias, and codec registries:

@geindex add_charset() (email.charset 모듈)
@anchor{library/email charset email charset add_charset}@anchor{3bf3}
@deffn {함수} email.charset.add_charset (charset, header_enc=None, body_enc=None, output_charset=None)

전역 레지스트리에 문자 속성을 추가합니다.

`charset'은 입력 문자 집합이며, 문자 집합의 규범적 이름이어야 합니다.

선택적 `header_enc'와 `body_enc'는 quoted-printable의 경우 @code{charset.QP}, base64 인코딩의 경우 @code{charset.BASE64}, quoted-printable이나 base64 인코딩 중 가장 짧은 것의 경우 @code{charset.SHORTEST}, 또는 인코딩이 없으면 @code{None}입니다. @code{SHORTEST}는 `header_enc'에만 유효합니다. 인코딩이 없으면 기본값은 @code{None}입니다.

선택적 `output_charset'은 출력에 적용되어야 하는 문자 집합입니다. @code{Charset.convert()} 메서드가 호출될 때 입력 문자 집합에서 유니코드로, 다시 출력 문자 집합으로 변환이 진행됩니다. 기본값은 입력과 같은 문자 집합으로 출력하는 것입니다.

`input_charset'과 `output_charset'은 모두 모듈의 문자 집합에서 코덱으로의 매핑에 유니코드 코덱 항목이 있어야 합니다; @ref{3bf4,,add_codec()}을 사용하여 모듈이 모르는 코덱을 추가하십시오. 자세한 내용은 @ref{1c,,codecs} 모듈 설명서를 참조하십시오.

전역 문자 집합 레지스트리는 모듈 전역 딕셔너리 @code{CHARSETS}에 유지됩니다.
@end deffn

@geindex add_alias() (email.charset 모듈)
@anchor{library/email charset email charset add_alias}@anchor{3bf5}
@deffn {함수} email.charset.add_alias (alias, canonical)

문자 집합 별칭을 추가합니다. `alias'는 별칭 이름입니다, 예를 들어 @code{latin-1}. `canonical'은 문자 집합의 규범적 이름입니다, 예를 들어 @code{iso-8859-1}.

전역 문자 집합 별칭 레지스트리는 모듈 전역 딕셔너리 @code{ALIASES}에 유지됩니다.
@end deffn

@geindex add_codec() (email.charset 모듈)
@anchor{library/email charset email charset add_codec}@anchor{3bf4}
@deffn {함수} email.charset.add_codec (charset, codecname)

주어진 문자 집합의 문자를 유니코드와 매핑하는 코덱을 추가합니다.

`charset'은 문자 집합의 규범적 이름입니다. `codecname'은 @ref{169,,str}의 @ref{ad2,,encode()} 메서드의 두 번째 인자에 적합한 파이썬 코덱의 이름입니다.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node email encoders 인코더,email utils 기타 유틸리티,email charset 문자 집합 표현,email — 전자 메일과 MIME 처리 패키지
@anchor{library/email encoders doc}@anchor{3bf6}@anchor{library/email encoders email-encoders-encoders}@anchor{3bf7}@anchor{library/email encoders module-email encoders}@anchor{42}@anchor{library/email encoders translation-repo}@anchor{3bf8}
@subsubsection @code{email.encoders}: 인코더


@geindex module; email.encoders

`소스 코드:' Lib/email/encoders.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/email/encoders.py}


__________________________________________________________________


이 모듈은 레거시(@code{Compat32}) 이메일 API의 일부입니다. 새로운 API에서 기능은 @ref{1c5b,,set_content()} 메서드의 `cte' 매개 변수에 의해 제공됩니다.

이 모듈은 파이썬 3에서 폐지되었습니다. @ref{ff9,,MIMEText} 클래스는 인스턴스 화 중에 전달된 `_subtype'과 `_charset' 값을 사용하여 콘텐츠 유형과 CTE 헤더를 설정하므로 여기에 제공된 함수를 명시적으로 호출하면 안 됩니다.

이 섹션의 나머지 텍스트는 모듈의 원본 설명서입니다.

@ref{580,,Message} 객체를 처음부터 만들 때, 종종 호환 메일 서버를 통한 전송을 위해 페이 로드를 인코딩해야 합니다. 바이너리 데이터가 포함된 @code{image/*}와 @code{text/*} 유형 메시지의 경우 특히 그렇습니다.

The @ref{3f,,email} package provides some convenient encoders in its
@code{encoders} module.  These encoders are actually used by the
@ref{3bd8,,MIMEAudio} and @ref{3b6b,,MIMEImage}
class constructors to provide default encodings.  All encoder functions take
exactly one argument, the message object to encode.  They usually extract the
payload, encode it, and reset the payload to this newly encoded value.  They
should also set the @code{Content-Transfer-Encoding} header as appropriate.

이러한 함수는 멀티 파트 메시지에는 의미가 없음에 유의하십시오. 대신 개별 서브 파트에 적용해야 하며, 유형이 멀티 파트인 메시지를 전달하면 @ref{198,,TypeError}가 발생합니다.

제공되는 인코딩 함수는 다음과 같습니다:

@geindex encode_quopri() (email.encoders 모듈)
@anchor{library/email encoders email encoders encode_quopri}@anchor{3bf9}
@deffn {함수} email.encoders.encode_quopri (msg)

페이 로드를 인용 quoted-printable 형식으로 인코딩하고 @code{Content-Transfer-Encoding} 헤더를 @code{quoted-printable}로 설정합니다 @footnote{
@ref{3bf9,,encode_quopri()}로 인코딩하면 데이터의 모든 탭과 공백 문자도 인코딩됨에 유의하십시오.
}. 이것은 대부분의 페이 로드가 인쇄 가능한 일반 데이터이지만, 인쇄할 수 없는 문자가 몇 개 있을 때 사용하기에 적합한 인코딩입니다.
@end deffn

@geindex encode_base64() (email.encoders 모듈)
@anchor{library/email encoders email encoders encode_base64}@anchor{3bfa}
@deffn {함수} email.encoders.encode_base64 (msg)

페이 로드를 base64 형식으로 인코딩하고 @code{Content-Transfer-Encoding} 헤더를 @code{base64}로 설정합니다. 이것은 페이 로드가 대부분 인쇄할 수 없는 데이터일 때 사용하기에 좋은 인코딩입니다. quoted-printable보다 더 압축된 형식이기 때문입니다. base64 인코딩의 단점은 텍스트를 사람이 읽을 수 없도록 만든다는 것입니다.
@end deffn

@geindex encode_7or8bit() (email.encoders 모듈)
@anchor{library/email encoders email encoders encode_7or8bit}@anchor{3bfb}
@deffn {함수} email.encoders.encode_7or8bit (msg)

이것은 실제로 메시지의 페이 로드를 수정하지는 않지만, 페이 로드 데이터를 기반으로, @code{Content-Transfer-Encoding} 헤더를 적절하게 @code{7bit}나 @code{8bit}로 설정합니다.
@end deffn

@geindex encode_noop() (email.encoders 모듈)
@anchor{library/email encoders email encoders encode_noop}@anchor{3bfc}
@deffn {함수} email.encoders.encode_noop (msg)

이것은 아무것도 하지 않습니다. 심지어 @code{Content-Transfer-Encoding} 헤더도 설정하지 않습니다.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node email utils 기타 유틸리티,email iterators 이터레이터,email encoders 인코더,email — 전자 메일과 MIME 처리 패키지
@anchor{library/email utils doc}@anchor{3bfd}@anchor{library/email utils email-utils-miscellaneous-utilities}@anchor{3bfe}@anchor{library/email utils module-email utils}@anchor{54}@anchor{library/email utils translation-repo}@anchor{3bff}
@subsubsection @code{email.utils}: 기타 유틸리티


@geindex module; email.utils

`소스 코드:' Lib/email/utils.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/email/utils.py}


__________________________________________________________________


There are a couple of useful utilities provided in the @code{email.utils}
module:

@geindex localtime() (email.utils 모듈)
@anchor{library/email utils email utils localtime}@anchor{2f7}
@deffn {함수} email.utils.localtime (dt=None)

Return local time as an aware datetime object.  If called without
arguments, return current time.  Otherwise `dt' argument should be a
@ref{4e2,,datetime} instance, and it is converted to the local time
zone according to the system time zone database.  If `dt' is naive (that
is, @code{dt.tzinfo} is @code{None}), it is assumed to be in local time.


Added in version 3.3.



Deprecated since version 3.12, removed in version 3.14: `isdst' 매개 변수.

@end deffn

@geindex make_msgid() (email.utils 모듈)
@anchor{library/email utils email utils make_msgid}@anchor{3c00}
@deffn {함수} email.utils.make_msgid (idstring=None, domain=None)

@geindex RFC; RFC 2822
RFC 2822@footnote{https://datatracker.ietf.org/doc/html/rfc2822.html}-준수 @code{Message-ID} 헤더에 적합한 문자열을 반환합니다. 선택적인 `idstring'이 주어지면, 메시지 id의 고유성을 강화하는 데 사용되는 문자열입니다. 선택적인 `domain'이 주어지면, msgid의 ‘@@’ 다음 부분을 제공합니다. 기본값은 로컬 호스트 명입니다. 일반적으로 이 기본값을 재정의할 필요는 없지만, 여러 호스트에 걸쳐 일관된 도메인 이름을 사용하는 분산 시스템을 구성하는 경우와 같이 특정 경우에 유용할 수 있습니다.


버전 3.2에서 변경: `domain' 키워드가 추가되었습니다.

@end deffn

나머지 함수는 레거시 (@code{Compat32}) email API의 일부입니다. 이것들이 제공하는 구문 분석과 포매팅은 새 API의 헤더 구문 분석 장치가 자동으로 수행하므로, 새 API에서 이것들을 직접 사용할 필요는 없습니다.

@geindex quote() (email.utils 모듈)
@anchor{library/email utils email utils quote}@anchor{3c01}
@deffn {함수} email.utils.quote (str)

`str'에 있는 역 슬래시를 두 개의 역 슬래시로 대체하고, 큰따옴표는 역 슬래시-큰따옴표로 대체한 새 문자열을 반환합니다.
@end deffn

@geindex unquote() (email.utils 모듈)
@anchor{library/email utils email utils unquote}@anchor{3b0e}
@deffn {함수} email.utils.unquote (str)

`str'의 `unquote 된' 버전인 새 문자열을 반환합니다. `str'가 큰따옴표로 끝나고 시작하면, 큰따옴표가 제거됩니다. 마찬가지로 `str'이 화살괄호(angle brackets)로 끝나고 시작하면, 제거됩니다.
@end deffn

@geindex parseaddr() (email.utils 모듈)
@anchor{library/email utils email utils parseaddr}@anchor{4f4}
@deffn {함수} email.utils.parseaddr (address, *, strict=True)

address(@code{To}나 @code{Cc}와 같은 주소를 포함하는 필드의 값이어야 합니다)를 `realname'과 `email 주소' 구성 요소로 구문 분석합니다. 구문 분석에 실패하지 않는 한 해당 정보의 튜플을 반환합니다. 실패하면 @code{('@w{'}, '@w{'})}의 2-튜플이 반환됩니다.

If `strict' is true, use a strict parser which rejects malformed inputs.


버전 3.13에서 변경: Add `strict' optional parameter and reject malformed inputs by default.

@end deffn

@geindex formataddr() (email.utils 모듈)
@anchor{library/email utils email utils formataddr}@anchor{139f}
@deffn {함수} email.utils.formataddr (pair, charset='utf-8')

@ref{4f4,,parseaddr()}의 역, @code{(realname, email_address)} 형식의 2-튜플을 취해 @code{To}나 @code{Cc} 헤더에 적합한 문자열 값을 반환합니다. `pair'의 첫 번째 요소가 거짓이면, 두 번째 요소는 수정되지 않은 채 반환됩니다.

선택적 `charset'은 @code{realname}에 비 ASCII 문자가 포함되어있을 때 @code{realname}의 
@geindex RFC; RFC 2047
RFC 2047@footnote{https://datatracker.ietf.org/doc/html/rfc2047.html} 인코딩에 사용될 문자 집합입니다. @ref{169,,str}이나 @ref{ffa,,Charset}의 인스턴스가 될 수 있습니다. 기본값은 @code{utf-8}입니다.


버전 3.3에서 변경: `charset' 옵션이 추가되었습니다.

@end deffn

@geindex getaddresses() (email.utils 모듈)
@anchor{library/email utils email utils getaddresses}@anchor{4f3}
@deffn {함수} email.utils.getaddresses (fieldvalues, *, strict=True)

이 메서드는 @code{parseaddr()}에 의해 반환된 형식의 2-튜플 리스트를 반환합니다. `fieldvalues'는 @ref{3bb9,,Message.get_all}에 의해 반환될 수 있는 헤더 필드 값의 시퀀스입니다.

If `strict' is true, use a strict parser which rejects malformed inputs.

Here’s a simple example that gets all the recipients of a message:

@example
from email.utils import getaddresses

tos = msg.get_all('to', [])
ccs = msg.get_all('cc', [])
resent_tos = msg.get_all('resent-to', [])
resent_ccs = msg.get_all('resent-cc', [])
all_recipients = getaddresses(tos + ccs + resent_tos + resent_ccs)
@end example


버전 3.13에서 변경: Add `strict' optional parameter and reject malformed inputs by default.

@end deffn

@geindex parsedate() (email.utils 모듈)
@anchor{library/email utils email utils parsedate}@anchor{3c02}
@deffn {함수} email.utils.parsedate (date)

@geindex RFC; RFC 2822
RFC 2822@footnote{https://datatracker.ietf.org/doc/html/rfc2822.html}의 규칙에 따라 날짜를 구문 분석하려고 시도합니다. 그러나, 일부 메일러는 지정된 대로 이 형식을 따르지 않으므로 @ref{3c02,,parsedate()}는 이러한 경우에 올바르게 추측하려고 합니다. `date'는 
@geindex RFC; RFC 2822
RFC 2822@footnote{https://datatracker.ietf.org/doc/html/rfc2822.html} 날짜를 포함하는 문자열입니다 (가령 @code{"Mon, 20 Nov 1995 19:12:08 -0500"}). 날짜 구문 분석에 성공하면, @code{parsedate()}는 @ref{13ed,,time.mktime()}에 직접 전달할 수 있는 9-튜플을 반환합니다; 그렇지 않으면, @code{None}을 반환합니다. 결과 튜플의 인덱스 6, 7 및 8은 사용할 수 없음에 유의하십시오.
@end deffn

@geindex parsedate_tz() (email.utils 모듈)
@anchor{library/email utils email utils parsedate_tz}@anchor{1c21}
@deffn {함수} email.utils.parsedate_tz (date)

@ref{3c02,,parsedate()}와 같은 기능을 수행하지만, @code{None}이나 10-튜플을 반환합니다; 앞의 9개 요소는 @ref{13ed,,time.mktime()}에 직접 전달할 수 있는 튜플을 구성하고, 열 번째 요소는 UTC(그리니치 표준 시의 공식 용어)로부터의 날짜의 시간대 오프셋입니다 @footnote{
시간대 오프셋의 부호는 같은 시간대에 대한 @code{time.timezone} 변수의 부호와 반대임에 유의하십시오; 이 모듈이 
@geindex RFC; RFC 2822
@uref{https://datatracker.ietf.org/doc/html/rfc2822.html,RFC 2822}를 따르지만, 후자의 변수는 POSIX 표준을 따릅니다.
}. 입력 문자열에 시간대가 없으면, 반환되는 튜플의 마지막 요소는 @code{0}입니다, UTC를 나타냅니다. 결과 튜플의 인덱스 6, 7 및 8은 사용할 수 없음에 유의하십시오.
@end deffn

@geindex parsedate_to_datetime() (email.utils 모듈)
@anchor{library/email utils email utils parsedate_to_datetime}@anchor{12c3}
@deffn {함수} email.utils.parsedate_to_datetime (date)

@ref{12c2,,format_datetime()}의 역. @ref{3c02,,parsedate()}와 같은 기능을 수행하지만, 성공 시에 @ref{4e2,,datetime}을 반환합니다; 그렇지 않으면, 23보다 큰 시간이나 -24 와 24 시간 사이에 있지 않은 시간대와 같이 `date' 가 잘못된 값을 가질 때 @code{ValueError}가 발생합니다. 입력 date의 시간대가 @code{-0000}이면, @code{datetime}은 나이브 @code{datetime}이 되고, date가 RFC를 준수하면 UTC로 시간이 표시되지만, date가 온 메시지의 실제 소스 시간대는 표시되지 않습니다. 입력 date에 다른 유효한 시간대 오프셋이 있으면, @code{datetime}은 해당 @ref{12c4,,timezone} @ref{7f5,,tzinfo}가 있는 어웨어 @code{datetime}이 됩니다.


Added in version 3.3.

@end deffn

@geindex mktime_tz() (email.utils 모듈)
@anchor{library/email utils email utils mktime_tz}@anchor{3c03}
@deffn {함수} email.utils.mktime_tz (tuple)

@ref{1c21,,parsedate_tz()}에 의해 반환된 10-튜플을 UTC 타임스탬프(Epoch 이후 초)로 바꿉니다. 튜플의 시간대 항목이 @code{None}이면, 지역 시간으로 간주합니다.
@end deffn

@geindex formatdate() (email.utils 모듈)
@anchor{library/email utils email utils formatdate}@anchor{166f}
@deffn {함수} email.utils.formatdate (timeval=None, localtime=False, usegmt=False)

@geindex RFC; RFC 2822
RFC 2822@footnote{https://datatracker.ietf.org/doc/html/rfc2822.html}에 따르는 날짜 문자열을 반환합니다, 예를 들어:

@example
Fri, 09 Nov 2001 01:08:47 -0000
@end example

선택적 `timeval'이 주어지면 @ref{13c5,,time.gmtime()}과 @ref{16fe,,time.localtime()}이 받아들이는 부동 소수점 시간 값입니다, 그렇지 않으면 현재 시각이 사용됩니다.

선택적 `localtime' 은, @code{True}일 때, `timeval'을 해석하고, UTC 대신 일광 절약 시간을 적절히 고려하는 지역 시간대에 상대적인 날짜를 반환토록 하는 플래그입니다. 기본값은 UTC가 사용된다는 뜻인 @code{False}입니다.

선택적 `usegmt'는, @code{True}일 때, 날짜 문자열의 시간대를 숫자 @code{-0000} 대신 ASCII 문자열 @code{GMT}로 출력하도록 하는 플래그입니다. 일부 프로토콜(가령 HTTP)에 필요합니다. 이것은 `localtime' 이 @code{False}일 때만 적용됩니다. 기본값은 @code{False}입니다.
@end deffn

@geindex format_datetime() (email.utils 모듈)
@anchor{library/email utils email utils format_datetime}@anchor{12c2}
@deffn {함수} email.utils.format_datetime (dt, usegmt=False)

@code{formatdate}와 같지만, 입력이 @ref{34,,datetime} 인스턴스입니다. 나이브 datetime이면, “소스 시간대에 대한 정보가 없는 UTC”로 간주하며, 관습적으로 @code{-0000}이 시간대로 사용됩니다. 어웨어 @code{datetime}이면, 숫자 시간대 오프셋이 사용됩니다. 오프셋이 0인 어웨어 시간대면, `usegmt'를 @code{True}로 설정해서 @code{GMT} 문자열을 숫자 시간대 오프셋 대신 사용할 수 있습니다. 이것은 표준을 준수하는 HTTP date 헤더를 생성하는 방법을 제공합니다.


Added in version 3.3.

@end deffn

@geindex decode_rfc2231() (email.utils 모듈)
@anchor{library/email utils email utils decode_rfc2231}@anchor{3c04}
@deffn {함수} email.utils.decode_rfc2231 (s)

@geindex RFC; RFC 2231
RFC 2231@footnote{https://datatracker.ietf.org/doc/html/rfc2231.html}에 따라 `s' 문자열을 디코드합니다.
@end deffn

@geindex encode_rfc2231() (email.utils 모듈)
@anchor{library/email utils email utils encode_rfc2231}@anchor{3c05}
@deffn {함수} email.utils.encode_rfc2231 (s, charset=None, language=None)

@geindex RFC; RFC 2231
RFC 2231@footnote{https://datatracker.ietf.org/doc/html/rfc2231.html}에 따라 `s' 문자열을 인코드합니다. 선택적인 `charset'과 `language'가 주어지면, 사용할 문자 집합 이름과 언어 이름입니다. 둘 다 지정되지 않으면, `s'가 그대로 반환됩니다. `charset'이 주어졌지만, `language'가 지정되지 않으면, 문자열은 `language'에 대해 빈 문자열을 사용하여 인코딩됩니다.
@end deffn

@geindex collapse_rfc2231_value() (email.utils 모듈)
@anchor{library/email utils email utils collapse_rfc2231_value}@anchor{3bc6}
@deffn {함수} email.utils.collapse_rfc2231_value (value, errors='replace', fallback_charset='us-ascii')

header 매개 변수가 
@geindex RFC; RFC 2231
RFC 2231@footnote{https://datatracker.ietf.org/doc/html/rfc2231.html}로 인코딩되었을 때, @ref{3bc5,,Message.get_param}은 문자 집합, 언어 및 값이 포함된 3-튜플을 반환할 수 있습니다. @ref{3bc6,,collapse_rfc2231_value()}는 이것을 유니코드 문자열로 변환합니다. 선택적 `errors'는 @ref{169,,str}의 @ref{ad2,,encode()} 메서드의 `errors' 인자로 전달됩니다; 기본값은 @code{'replace'}입니다. 선택적 `fallback_charset'은 
@geindex RFC; RFC 2231
RFC 2231@footnote{https://datatracker.ietf.org/doc/html/rfc2231.html} 헤더에 있는 것이 파이썬에 알려지지 않았을 때 사용할 문자 집합을 지정합니다; 기본값은 @code{'us-ascii'}입니다.

편의상, @ref{3bc6,,collapse_rfc2231_value()}에 전달된 `value'가 튜플이 아니면, 문자열이어야 하고 unquote 되어 반환됩니다.
@end deffn

@geindex decode_params() (email.utils 모듈)
@anchor{library/email utils email utils decode_params}@anchor{1827}
@deffn {함수} email.utils.decode_params (params)

@geindex RFC; RFC 2231
RFC 2231@footnote{https://datatracker.ietf.org/doc/html/rfc2231.html}에 따라 매개 변수 리스트를 디코드합니다. `params'는 @code{(content-type, string-value)} 형식의 요소를 포함하는 2-튜플의 시퀀스입니다.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node email iterators 이터레이터,,email utils 기타 유틸리티,email — 전자 메일과 MIME 처리 패키지
@anchor{library/email iterators doc}@anchor{3c06}@anchor{library/email iterators email-iterators-iterators}@anchor{3c07}@anchor{library/email iterators module-email iterators}@anchor{47}@anchor{library/email iterators translation-repo}@anchor{3c08}
@subsubsection @code{email.iterators}: 이터레이터


@geindex module; email.iterators

`소스 코드:' Lib/email/iterators.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/email/iterators.py}


__________________________________________________________________


Iterating over a message object tree is fairly easy with the
@ref{3bce,,Message.walk} method.  The
@code{email.iterators} module provides some useful higher level iterations over
message object trees.

@geindex body_line_iterator() (email.iterators 모듈)
@anchor{library/email iterators email iterators body_line_iterator}@anchor{3c09}
@deffn {함수} email.iterators.body_line_iterator (msg, decode=False)

`msg'의 모든 서브 파트에 있는 모든 페이 로드를 이터레이트 하여, 문자열 페이 로드를 한 줄씩 반환합니다. 모든 서브 파트 헤더를 건너뛰고, 파이썬 문자열이 아닌 페이 로드가 있는 서브 파트를 건너뜁니다. 이는 @ref{20a4,,readline()}을 사용하여 파일에서 메시지의 평평한(flat) 텍스트 표현을 읽는 것과 다소 유사하며, 모든 중간 헤더를 건너뜁니다.

선택적 `decode'는 @ref{13d2,,Message.get_payload}로 전달됩니다.
@end deffn

@geindex typed_subpart_iterator() (email.iterators 모듈)
@anchor{library/email iterators email iterators typed_subpart_iterator}@anchor{3c0a}
@deffn {함수} email.iterators.typed_subpart_iterator (msg, maintype='text', subtype=None)

`msg'의 모든 서브 파트를 이터레이트 하여, `maintype'과 `subtype'으로 지정된 MIME 유형과 일치하는 서브 파트만 반환합니다.

`subtype'은 선택적임에 유의하십시오; 생략하면, 서브 파트 MIME 형식 일치는 메인 형식으로만 수행됩니다. `maintype'도 선택적입니다; 기본값은 @code{text}입니다.

따라서, 기본적으로 @ref{3c0a,,typed_subpart_iterator()}는 MIME 유형이 @code{text/*} 인 각 서브 파트를 반환합니다.
@end deffn

유용한 디버깅 도구로 다음 함수가 추가되었습니다. 이것은 패키지에서 지원되는 공용 인터페이스의 일부로 간주하지 `않아야' 합니다.

@geindex _structure() (email.iterators 모듈)
@anchor{library/email iterators email iterators _structure}@anchor{3c0b}
@deffn {함수} email.iterators._structure (msg, fp=None, level=0, include_default=False)

메시지 객체 구조의 콘텐츠 유형을 들여쓰기하여 인쇄합니다. 예를 들면:

@c import email
@c from email.iterators import _structure
@c somefile = open('../Lib/test/test_email/data/msg_02.txt')

@example
>>> msg = email.message_from_file(somefile)
>>> _structure(msg)
multipart/mixed
    text/plain
    text/plain
    multipart/digest
        message/rfc822
            text/plain
        message/rfc822
            text/plain
        message/rfc822
            text/plain
        message/rfc822
            text/plain
        message/rfc822
            text/plain
    text/plain
@end example

@c somefile.close()

선택적 `fp'는 출력을 인쇄할 파일류 객체입니다. 파이썬의 @ref{1174,,print()} 함수에 적합해야 합니다. `level'은 내부적으로 사용됩니다. `include_default'가 참이면, 기본 유형도 인쇄합니다.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)


@subsubheading 더 보기



@table @asis

@item 모듈 @ref{cf,,smtplib}

SMTP (Simple Mail Transport Protocol) 클라이언트

@item 모듈 @ref{b1,,poplib}

POP (Post Office Protocol) 클라이언트

@item 모듈 @ref{78,,imaplib}

IMAP (Internet Message Access Protocol) 클라이언트

@item 모듈 @ref{8f,,mailbox}

다양한 표준 형식을 사용하여 디스크에 메시지 모음을 만들고, 읽고, 관리하는 도구.
@end table


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node json — JSON 인코더와 디코더,mailbox — 다양한 형식의 사서함 조작하기,email — 전자 메일과 MIME 처리 패키지,인터넷 데이터 처리
@anchor{library/json doc}@anchor{3c0c}@anchor{library/json json-json-encoder-and-decoder}@anchor{3c0d}@anchor{library/json module-json}@anchor{86}@anchor{library/json translation-repo}@anchor{3c0e}
@subsection @code{json} — JSON 인코더와 디코더


@geindex module; json

`소스 코드:' Lib/json/__init__.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/json/__init__.py}


__________________________________________________________________


@geindex RFC; RFC 7159
RFC 7159@footnote{https://datatracker.ietf.org/doc/html/rfc7159.html}(
@geindex RFC; RFC 4627
RFC 4627@footnote{https://datatracker.ietf.org/doc/html/rfc4627.html}을 대체합니다)와 ECMA-404@footnote{https://ecma-international.org/publications-and-standards/standards/ecma-404/}로 규정되는 JSON (JavaScript Object Notation)@footnote{https://json.org}은 JavaScript@footnote{https://en.wikipedia.org/wiki/JavaScript} 객체 리터럴 문법에서 영감을 얻은 경량 데이터 교환 형식입니다 (JavaScript @footnote{
@uref{https://www.rfc-editor.org/errata_search.php?rfc=7159,the errata for RFC 7159}에서 언급했듯이, JSON은 문자열에 U+2028(LINE SEPARATOR)과 U+2029(PARAGRAPH SEPARATOR) 문자를 허용하지만, JavaScript(ECMAScript Edition 5.1 기준)는 허용하지 않습니다.
}의 엄격한 부분집합은 아닙니다).

@cartouche
@quotation 참고 
The term “object” in the context of JSON processing in Python can be
ambiguous. All values in Python are objects. In JSON, an object refers to
any data wrapped in curly braces, similar to a Python dictionary.
@end quotation
@end cartouche

@cartouche
@quotation 경고 
Be cautious when parsing JSON data from untrusted sources. A malicious
JSON string may cause the decoder to consume considerable CPU and memory
resources. Limiting the size of data to be parsed is recommended.
@end quotation
@end cartouche

This module exposes an API familiar to users of the standard library
@ref{91,,marshal} and @ref{ab,,pickle} modules.

기본 파이썬 객체 계층 구조 인코딩:

@example
>>> import json
>>> json.dumps(['foo', @{'bar': ('baz', None, 1.0, 2)@}])
'["foo", @{"bar": ["baz", null, 1.0, 2]@}]'
>>> print(json.dumps("\"foo\bar"))
"\"foo\bar"
>>> print(json.dumps('\u1234'))
"\u1234"
>>> print(json.dumps('\\'))
"\\"
>>> print(json.dumps(@{"c": 0, "b": 0, "a": 0@}, sort_keys=True))
@{"a": 0, "b": 0, "c": 0@}
>>> from io import StringIO
>>> io = StringIO()
>>> json.dump(['streaming API'], io)
>>> io.getvalue()
'["streaming API"]'
@end example

간결한 인코딩:

@example
>>> import json
>>> json.dumps([1, 2, 3, @{'4': 5, '6': 7@}], separators=(',', ':'))
'[1,2,3,@{"4":5,"6":7@}]'
@end example

예쁜 인쇄:

@example
>>> import json
>>> print(json.dumps(@{'6': 7, '4': 5@}, sort_keys=True, indent=4))
@{
    "4": 5,
    "6": 7
@}
@end example

Customizing JSON object encoding:

@example
>>> import json
>>> def custom_json(obj):
...     if isinstance(obj, complex):
...         return @{'__complex__': True, 'real': obj.real, 'imag': obj.imag@}
...     raise TypeError(f'Cannot serialize object of @{type(obj)@}')
...
>>> json.dumps(1 + 2j, default=custom_json)
'@{"__complex__": true, "real": 1.0, "imag": 2.0@}'
@end example

JSON 디코딩:

@example
>>> import json
>>> json.loads('["foo", @{"bar":["baz", null, 1.0, 2]@}]')
['foo', @{'bar': ['baz', None, 1.0, 2]@}]
>>> json.loads('"\\"foo\\bar"')
'"foo\x08ar'
>>> from io import StringIO
>>> io = StringIO('["streaming API"]')
>>> json.load(io)
['streaming API']
@end example

Customizing JSON object decoding:

@example
>>> import json
>>> def as_complex(dct):
...     if '__complex__' in dct:
...         return complex(dct['real'], dct['imag'])
...     return dct
...
>>> json.loads('@{"__complex__": true, "real": 1, "imag": 2@}',
...     object_hook=as_complex)
(1+2j)
>>> import decimal
>>> json.loads('1.1', parse_float=decimal.Decimal)
Decimal('1.1')
@end example

@ref{f41,,JSONEncoder} 확장하기:

@example
>>> import json
>>> class ComplexEncoder(json.JSONEncoder):
...     def default(self, obj):
...         if isinstance(obj, complex):
...             return [obj.real, obj.imag]
...         # 베이스 클래스의 default 메서드가 TypeError를 발생 시키도록 합니다
...         return super().default(obj)
...
>>> json.dumps(2 + 1j, cls=ComplexEncoder)
'[2.0, 1.0]'
>>> ComplexEncoder().encode(2 + 1j)
'[2.0, 1.0]'
>>> list(ComplexEncoder().iterencode(2 + 1j))
['[2.0', ', 1.0', ']']
@end example

Using @code{json} from the shell to validate and pretty-print:

@example
$ echo '@{"json":"obj"@}' | python -m json
@{
    "json": "obj"
@}
$ echo '@{1.2:3.4@}' | python -m json
Expecting property name enclosed in double quotes: line 1 column 2 (char 1)
@end example

자세한 설명은 @ref{23e,,Command-line interface}를 참조하십시오.

@cartouche
@quotation 참고 
JSON은 YAML@footnote{https://yaml.org/} 1.2의 부분 집합입니다. 이 모듈의 기본 설정(특히 기본 `separators' 값)으로 생성된 JSON은 YAML 1.0과 1.1의 부분 집합이기도 합니다. 따라서 이 모듈을 YAML 직렬화기로 사용할 수도 있습니다.
@end quotation
@end cartouche

@cartouche
@quotation 참고 
이 모듈의 인코더와 디코더는 기본적으로 입력과 출력 순서를 유지합니다. 하부 컨테이너에 순서가 없을 때만 순서가 손실됩니다.
@end quotation
@end cartouche

@menu
* 기본 사용법:: 
* 인코더와 디코더:: 
* 예외: 예외<14>. 
* 표준 준수와 상호 운용성:: 
* Command-line interface: Command-line interface<5>. 

@end menu

@node 기본 사용법,인코더와 디코더,,json — JSON 인코더와 디코더
@anchor{library/json basic-usage}@anchor{3c0f}
@subsubsection 기본 사용법


@geindex dump() (json 모듈)
@anchor{library/json json dump}@anchor{f3f}
@deffn {함수} json.dump (obj, fp, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)

이 @ref{3c10,,파이썬-to-JSON 변환표}를 사용하여 `obj'를 JSON 형식 스트림으로 `fp'(@code{.write()}를 지원하는 @ref{17b3,,파일류 객체})로 직렬화합니다.

@cartouche
@quotation 참고 
@ref{ab,,pickle}과 @ref{91,,marshal}과 달리, JSON은 프레임 프로토콜이 아니므로 같은 `fp'를 사용하여 @ref{f3f,,dump()}를 반복 호출하여 여러 객체를 직렬화하려고 하면 잘못된 JSON 파일이 생성됩니다.
@end quotation
@end cartouche

@*매개변수: 

@itemize *

@item 
@code{obj} (@ref{c7d,,object}) – 직렬화될 파이썬 객체.

@item 
@code{fp} (@ref{17b3,,file-like object}) – `obj'가 직렬화될 파일류 객체. @code{json} 모듈은 항상 @ref{192,,bytes} 객체가 아니라 @ref{169,,str} 객체를 생성합니다, 따라서 @code{fp.write()}는 @code{str} 입력을 지원해야 합니다.

@item 
@code{skipkeys} (@ref{3c3,,bool}) – @code{True}면, 기본형(@ref{169,,str}, @ref{19b,,int}, @ref{196,,float}, @code{bool}, @code{None})이 아닌 키는 @ref{198,,TypeError}를 발생시키는 대신 건너뜁니다. 기본값 @code{False}.

@item 
@code{ensure_ascii} (@ref{3c3,,bool}) – If @code{True} (the default), the output is guaranteed to
have all incoming non-ASCII and non-printable characters escaped.
If @code{False}, all characters will be outputted as-is, except for
the characters that must be escaped: quotation mark, reverse solidus,
and the control characters U+0000 through U+001F.

@item 
@code{check_circular} (@ref{3c3,,bool}) – @code{False}면, 컨테이너형에 대한 순환 참조 검사를 건너뛰고 순환 참조는 @ref{f67,,RecursionError}를 일으키게 됩니다 (또는 더 나빠질 수 있습니다). 기본값 @code{True}.

@item 
@code{allow_nan} (@ref{3c3,,bool}) – @code{False}면, JSON 사양을 엄격히 준수하여, 범위를 벗어난 @ref{196,,float} 값(@code{nan}, @code{inf}, @code{-inf})을 직렬화하면 @ref{2ec,,ValueError}를 일으킵니다. `allow_nan'이 @code{True}(기본값)면, JavaScript의 대응 물(@code{NaN}, @code{Infinity}, @code{-Infinity})이 사용됩니다.

@item 
@code{cls} (a @ref{f41,,JSONEncoder} subclass) – If set, a custom JSON encoder with the
@ref{3c11,,default()} method overridden,
for serializing into custom datatypes.
If @code{None} (the default), @code{JSONEncoder} is used.

@item 
@code{indent} (@ref{19b,,int}@code{ | }@ref{169,,str}@code{ | }@code{None}) – If a positive integer or string, JSON array elements and
object members will be pretty-printed with that indent level.
A positive integer indents that many spaces per level;
a string (such as @code{"\t"}) is used to indent each level.
If zero, negative, or @code{""} (the empty string),
only newlines are inserted.
If @code{None} (the default), the most compact representation is used.

@item 
@code{separators} (@ref{610,,tuple}@code{ | }@code{None}) – 2-튜플: @code{(item_separator, key_separator)}. @code{None} (기본값) 이면, `separators'의 기본값은 `indent'가 @code{None}이면 @code{(', ', ': ')}이고, 그렇지 않으면 @code{(',', ': ')}입니다. 가장 간결한 JSON 을 얻으려면, @code{(',', ':')}를 지정하여 공백을 제거해야 합니다.

@item 
@code{default} (@ref{2da2,,callable} | None) – 달리 직렬화할 수 없는 객체에 대해 호출되는 함수. 객체의 JSON 인코딩 가능한 버전을 반환하거나 @ref{198,,TypeError}를 발생시켜야 합니다. @code{None}(기본값)이면, @code{TypeError}가 발생합니다.

@item 
@code{sort_keys} (@ref{3c3,,bool}) – If @code{True}, dictionaries will be outputted sorted by key.
Default @code{False}.
@end itemize



버전 3.2에서 변경: `indent'에 정수뿐만 아니라 문자열을 허용합니다.



버전 3.4에서 변경: `indent'가 @code{None}이 아니면, @code{(',', ': ')}를 기본값으로 사용합니다.



버전 3.6에서 변경: 모든 선택적 매개 변수는 이제 @ref{5a4,,키워드-전용}입니다.

@end deffn

@geindex dumps() (json 모듈)
@anchor{library/json json dumps}@anchor{f40}
@deffn {함수} json.dumps (obj, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)

이 @ref{3c10,,변환표}를 사용하여 `obj'를 JSON 형식의 @ref{169,,str}로 직렬화합니다. 인자는 @ref{f3f,,dump()}에서와 같은 의미입니다.

@cartouche
@quotation 참고 
JSON의 키/값 쌍에 있는 키는 항상 @ref{169,,str} 형입니다. 딕셔너리를 JSON으로 변환하면, 딕셔너리의 모든 키가 문자열로 강제 변환됩니다. 이것의 결과로, 딕셔너리를 JSON으로 변환한 다음 다시 딕셔너리로 변환하면, 딕셔너리가 원래의 것과 같지 않을 수 있습니다. 즉, x에 비 문자열 키가 있으면 @code{loads(dumps(x)) != x}입니다.
@end quotation
@end cartouche
@end deffn

@geindex load() (json 모듈)
@anchor{library/json json load}@anchor{eb1}
@deffn {함수} json.load (fp, *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)

@ref{3c12,,JSON-to-파이썬 변환표}를 사용하여 `fp'를 파이썬 객체로 역 직렬화합니다.

@*매개변수: 

@itemize *

@item 
@code{fp} (@ref{17b3,,file-like object}) – 역 직렬화될 JSON 문서를 포함하는 @code{.read()}를 지원하는 @ref{206b,,텍스트 파일}이나 @ref{206c,,바이너리 파일}.

@item 
@code{cls} (a @ref{f42,,JSONDecoder} subclass) – If set, a custom JSON decoder.
Additional keyword arguments to @code{load()}
will be passed to the constructor of `cls'.
If @code{None} (the default), @code{JSONDecoder} is used.

@item 
@code{object_hook} (@ref{2da2,,callable} | None) – If set, a function that is called with the result of
any JSON object literal decoded (a @ref{183,,dict}).
The return value of this function will be used
instead of the @code{dict}.
This feature can be used to implement custom decoders,
for example JSON-RPC@footnote{https://www.jsonrpc.org} class hinting.
Default @code{None}.

@item 
@code{object_pairs_hook} (@ref{2da2,,callable} | None) – If set, a function that is called with the result of
any JSON object literal decoded with an ordered list of pairs.
The return value of this function will be used
instead of the @ref{183,,dict}.
This feature can be used to implement custom decoders.
If `object_hook' is also set, `object_pairs_hook' takes priority.
Default @code{None}.

@item 
@code{parse_float} (@ref{2da2,,callable} | None) – 설정되면, 디코딩될 모든 JSON float의 문자열로 호출되는 함수. @code{None}(기본값)이면, 이것은 @code{float(num_str)}와 동등합니다. JSON float를 사용자 정의 데이터형으로 구문 분석하는 데 사용될 수 있습니다, 예를 들어 @ref{1fe,,decimal.Decimal}.

@item 
@code{parse_int} (@ref{2da2,,callable} | None) – 설정되면, 디코딩될 모든 JSON int의 문자열로 호출되는 함수. @code{None}(기본값)이면, 이것은 @code{int(num_str)}와 동등합니다. JSON 정수를 사용자 정의 데이터형으로 구문 분석하는 데 사용될 수 있습니다, 예를 들어 @ref{196,,float}.

@item 
@code{parse_constant} (@ref{2da2,,callable} | None) – 설정되면, 다음과 같은 문자열 중 하나로 호출되는 함수: @code{'-Infinity'}, @code{'Infinity'} 또는 @code{'NaN'}. 잘못된 JSON 숫자를 만날 때 예외를 발생시키는 데 사용할 수 있습니다. 기본값 @code{None}.
@end itemize


@*예외 발생: 

@itemize *

@item 
@ref{1021,,JSONDecodeError} – 역 직렬화되는 데이터가 유효한 JSON 문서가 아닐 때.

@item 
@ref{c07,,UnicodeDecodeError} – When the data being deserialized does not contain
UTF-8, UTF-16 or UTF-32 encoded data.
@end itemize



버전 3.1에서 변경: 


@itemize *

@item 
선택적 `object_pairs_hook' 매개 변수가 추가되었습니다.

@item 
`parse_constant'는 더는 ‘null’, ‘true’, ‘false’에 대해 호출되지 않습니다.
@end itemize



버전 3.6에서 변경: 


@itemize *

@item 
모든 선택적 매개 변수는 이제 @ref{5a4,,키워드-전용}입니다.

@item 
`fp'는 이제 @ref{206c,,바이너리 파일}이 될 수 있습니다. 입력 인코딩은 UTF-8, UTF-16 또는 UTF-32 여야 합니다.
@end itemize



버전 3.11에서 변경: The default `parse_int' of @ref{19b,,int()} now limits the maximum length of
the integer string via the interpreter’s @ref{80a,,integer string conversion length limitation} to help avoid denial
of service attacks.

@end deffn

@geindex loads() (json 모듈)
@anchor{library/json json loads}@anchor{b4e}
@deffn {함수} json.loads (s, *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)

@ref{eb1,,load()}와 동일하지만, 파일류 객체를 역 질렬화하는 대신, 이 @ref{3c12,,변환표}를 사용하여 `s'(JSON 문서를 포함하는 @ref{169,,str}, @ref{192,,bytes} 또는 @ref{344,,bytearray} 인스턴스)를 파이썬 객체로 역 직렬화합니다.


버전 3.6에서 변경: `s'는 이제 @ref{192,,bytes}나 @ref{344,,bytearray} 형일 수 있습니다. 입력 인코딩은 UTF-8, UTF-16 또는 UTF-32 여야 합니다.



버전 3.9에서 변경: 키워드 인자 `encoding'이 제거되었습니다.

@end deffn

@node 인코더와 디코더,예외<14>,기본 사용법,json — JSON 인코더와 디코더
@anchor{library/json encoders-and-decoders}@anchor{3c13}
@subsubsection 인코더와 디코더


@geindex JSONDecoder (json 클래스)
@anchor{library/json json JSONDecoder}@anchor{f42}
@deffn {클래스} json.JSONDecoder (*, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, strict=True, object_pairs_hook=None)

간단한 JSON 디코더.

기본적으로 디코딩할 때 다음과 같은 변환을 수행합니다:
@anchor{library/json json-to-py-table}@anchor{3c12}

@multitable {xxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxx} 
@headitem

JSON

@tab

파이썬

@item

오브젝트(object)

@tab

dict

@item

배열(array)

@tab

list

@item

문자열(string)

@tab

str

@item

숫자 (정수)

@tab

int

@item

숫자 (실수)

@tab

float

@item

true

@tab

True

@item

false

@tab

False

@item

null

@tab

None

@end multitable


또한, @code{NaN}, @code{Infinity} 및 @code{-Infinity}를 해당 @code{float} 값으로 이해합니다. 이 값은 JSON 명세에 속하지 않습니다.

`object_hook'은 지정되면, 모든 JSON 오브젝트의 디코딩된 결과로 호출될 선택적 함수이고, 반환 값을 주어진 @ref{183,,dict} 대신 사용합니다. 사용자 정의 역 직렬화를 제공하는 데 사용할 수 있습니다 (예를 들어, JSON-RPC@footnote{https://www.jsonrpc.org} 클래스 힌팅을 지원하기 위해).

`object_pairs_hook'은 모든 JSON 오브젝트가 쌍의 순서 있는 목록으로 디코딩된 결과로 호출될 선택적 함수입니다. @ref{183,,dict} 대신 `object_pairs_hook'의 반환 값이 사용됩니다. 이 기능은 사용자 정의 디코더를 구현하는 데 사용할 수 있습니다. `object_hook'도 정의되어 있으면, `object_pairs_hook'이 우선순위를 갖습니다.


버전 3.1에서 변경: `object_pairs_hook'에 대한 지원이 추가되었습니다.


`parse_float'는 디코딩될 모든 JSON float의 문자열로 호출될 선택적 함수입니다. 기본적으로, 이것은 @code{float(num_str)}와 동등합니다. JSON float에 대해 다른 데이터형이나 구문 분석기를 사용하고자 할 때 사용될 수 있습니다 (예를 들어, @ref{1fe,,decimal.Decimal}).

`parse_int'는 디코딩될 모든 JSON int의 문자열로 호출될 선택적 함수입니다. 기본적으로 이것은 @code{int(num_str)}와 동등합니다. JSON 정수에 대해 다른 데이터형이나 구문 분석기를 사용하고자 할 때 사용될 수 있습니다 (예를 들어 @ref{196,,float}).

`parse_constant'는 다음과 같은 문자열 중 하나로 호출될 선택적 함수입니다: @code{'-Infinity'}, @code{'Infinity'}, @code{'NaN'}. 잘못된 JSON 숫자를 만날 때 예외를 발생시키는 데 사용할 수 있습니다.

`strict'가 거짓이면 (@code{True}가 기본값입니다), 문자열 안에 제어 문자가 허용됩니다. 이 문맥에서 제어 문자는 0–31 범위의 문자 코드를 가진 것들인데, @code{'\t'} (탭), @code{'\n'}, @code{'\r'} 및 @code{'\0'}을 포함합니다.

역 직렬화되는 데이터가 유효한 JSON 문서가 아니면, @ref{1021,,JSONDecodeError}가 발생합니다.


버전 3.6에서 변경: 모든 매개 변수가 이제 @ref{5a4,,키워드-전용}입니다.


@geindex decode() (json.JSONDecoder 메서드)
@anchor{library/json json JSONDecoder decode}@anchor{3c14}
@deffn {메서드} decode (s)

`s'(JSON 문서가 포함된 @ref{169,,str} 인스턴스)의 파이썬 표현을 반환합니다.

주어진 JSON 문서가 유효하지 않으면 @ref{1021,,JSONDecodeError}가 발생합니다.
@end deffn

@geindex raw_decode() (json.JSONDecoder 메서드)
@anchor{library/json json JSONDecoder raw_decode}@anchor{3c15}
@deffn {메서드} raw_decode (s)

`s'(JSON 문서로 시작하는 @ref{169,,str})에서 JSON 문서를 디코딩하고, 파이썬 표현과 문서가 끝난 `s'에서의 인덱스로 구성된 2-튜플을 반환합니다.

끝에 여분의 데이터가 있을 수 있는 문자열에서 JSON 문서를 디코딩하는 데 사용할 수 있습니다.
@end deffn
@end deffn

@geindex JSONEncoder (json 클래스)
@anchor{library/json json JSONEncoder}@anchor{f41}
@deffn {클래스} json.JSONEncoder (*, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, sort_keys=False, indent=None, separators=None, default=None)

파이썬 데이터 구조를 위한 확장 가능한 JSON 인코더

기본적으로 다음 객체와 형을 지원합니다.:
@anchor{library/json py-to-json-table}@anchor{3c10}

@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxx} 
@headitem

파이썬

@tab

JSON

@item

dict

@tab

오브젝트(object)

@item

list, tuple

@tab

배열(array)

@item

str

@tab

문자열(string)

@item

int, float, int와 float에서 파생된 열거형

@tab

숫자(number)

@item

True

@tab

true

@item

False

@tab

false

@item

None

@tab

null

@end multitable



버전 3.4에서 변경: int와 float 파생 Enum 클래스에 대한 지원이 추가되었습니다.


다른 객체를 인식하도록 확장하려면, 서브 클래스를 만들고, 가능하면 @code{o}에 대한 직렬화 가능 객체를 반환하고, 그렇지 않으면 (@ref{198,,TypeError}를 발생시키기 위해) 슈퍼 클래스 구현을 호출하는 다른 메서드로 @ref{3c11,,default()} 메서드를 구현합니다.

`skipkeys'가 거짓(기본값)이면, @ref{169,,str}, @ref{19b,,int}, @ref{196,,float}, @ref{3c3,,bool} 또는 @code{None}이 아닌 키를 인코딩하려고 시도할 때 @ref{198,,TypeError}가 발생합니다. `skipkeys'가 참이면 이러한 항목은 단순히 건너뜁니다.

If `ensure_ascii' is true (the default), the output is guaranteed to
have all incoming non-ASCII and non-printable characters escaped.
If `ensure_ascii' is false, all characters will be output as-is, except for
the characters that must be escaped: quotation mark, reverse solidus,
and the control characters U+0000 through U+001F.

`check_circular'가 참(기본값)이면, 리스트, 딕셔너리 및 사용자 정의 객체는 무한 재귀 (@ref{f67,,RecursionError}를 유발할 수 있습니다)를 방지하기 위해 인코딩 중에 순환 참조를 검사합니다. 그렇지 않으면, 그러한 검사가 수행되지 않습니다.

`allow_nan'이 참(기본값)이면, @code{NaN}, @code{Infinity} 및 @code{-Infinity}는 그 자체로 인코딩됩니다. 이 동작은 JSON 사양을 따르지 않지만, 대부분의 JavaScript 기반 인코더 및 디코더와 일치합니다. 그렇지 않으면, 그러한 float를 인코딩하는 것은 @ref{2ec,,ValueError}가 됩니다.

`sort_keys'가 참(기본값: @code{False})이면, 딕셔너리의 출력이 키로 정렬됩니다; JSON 직렬화를 이전과 비교할 수 있도록 해서 회귀 테스트에 유용합니다.

`indent'가 음이 아닌 정수나 문자열이면, JSON 배열 요소와 오브젝트 멤버가 해당 들여쓰기 수준으로 예쁘게 인쇄됩니다. 0, 음수 또는 @code{""}의 들여쓰기 수준은 줄 넘김만 삽입합니다. @code{None}(기본값)은 가장 간결한(compact) 표현을 선택합니다. 양의 정수 indent를 사용하면, 수준 당 그만큼의 스페이스로 들여쓰기합니다. `indent'가 문자열이면 (가령 @code{"\t"}), 각 수준을 들려 쓰는 데 그 문자열을 사용합니다.


버전 3.2에서 변경: `indent'에 정수뿐만 아니라 문자열을 허용합니다.


지정되면, `separators'는 @code{(item_separator, key_separator)} 튜플이어야 합니다. 기본값은 `indent'가 @code{None}이면 @code{(', ', ': ')}이고, 그렇지 않으면 @code{(',', ': ')}입니다. 가장 간결한 JSON 표현을 얻으려면, @code{(',', ':')}를 지정하여 공백을 제거해야 합니다.


버전 3.4에서 변경: `indent'가 @code{None}이 아니면, @code{(',', ': ')}를 기본값으로 사용합니다.


지정되면, `default'는 달리 직렬화할 수 없는 객체에 대해 호출되는 함수여야 합니다. 객체의 JSON 인코딩 가능한 버전을 반환하거나 @ref{198,,TypeError}를 발생시켜야 합니다. 지정하지 않으면, @code{TypeError}가 발생합니다.


버전 3.6에서 변경: 모든 매개 변수가 이제 @ref{5a4,,키워드-전용}입니다.


@geindex default() (json.JSONEncoder 메서드)
@anchor{library/json json JSONEncoder default}@anchor{3c11}
@deffn {메서드} default (o)

`o'의 직렬화 가능 객체를 반환하거나 (@ref{198,,TypeError}를 발생시키기 위해서) 베이스 구현을 호출하도록 서브 클래스에 이 메서드를 구현하십시오.

예를 들어, 임의의 이터레이터를 지원하려면, 다음과 같이 @ref{3c11,,default()}를 구현할 수 있습니다:

@example
def default(self, o):
   try:
       iterable = iter(o)
   except TypeError:
       pass
   else:
       return list(iterable)
   # 베이스 클래스의 default 메서드가 TypeError를 발생시키도록 합시다
   return super().default(o)
@end example
@end deffn

@geindex encode() (json.JSONEncoder 메서드)
@anchor{library/json json JSONEncoder encode}@anchor{3c16}
@deffn {메서드} encode (o)

파이썬 데이터 구조 `o'의 JSON 문자열 표현을 반환합니다. 예를 들면:

@example
>>> json.JSONEncoder().encode(@{"foo": ["bar", "baz"]@})
'@{"foo": ["bar", "baz"]@}'
@end example
@end deffn

@geindex iterencode() (json.JSONEncoder 메서드)
@anchor{library/json json JSONEncoder iterencode}@anchor{3c17}
@deffn {메서드} iterencode (o)

주어진 객체 `o'를 인코딩하고, 준비될 때마다 각 문자열 표현을 산출(yield)합니다. 예를 들면:

@example
for chunk in json.JSONEncoder().iterencode(bigobject):
    mysocket.write(chunk)
@end example
@end deffn
@end deffn

@node 예외<14>,표준 준수와 상호 운용성,인코더와 디코더,json — JSON 인코더와 디코더
@anchor{library/json exceptions}@anchor{3c18}
@subsubsection 예외


@geindex JSONDecodeError
@anchor{library/json json JSONDecodeError}@anchor{1021}
@deffn {예외} json.JSONDecodeError (msg, doc, pos)

다음 추가 어트리뷰트가 있는 @ref{2ec,,ValueError}의 서브 클래스:

@geindex msg (json.JSONDecodeError의 속성)
@anchor{library/json json JSONDecodeError msg}@anchor{3c19}
@deffn {속성} msg

형식 없는 에러 메시지.
@end deffn

@geindex doc (json.JSONDecodeError의 속성)
@anchor{library/json json JSONDecodeError doc}@anchor{3c1a}
@deffn {속성} doc

구문 분석 중인 JSON 문서.
@end deffn

@geindex pos (json.JSONDecodeError의 속성)
@anchor{library/json json JSONDecodeError pos}@anchor{3c1b}
@deffn {속성} pos

구문 분석에 실패한 위치의 시작 부분을 나타내는 `doc'의 인덱스.
@end deffn

@geindex lineno (json.JSONDecodeError의 속성)
@anchor{library/json json JSONDecodeError lineno}@anchor{3c1c}
@deffn {속성} lineno

`pos'에 해당하는 줄.
@end deffn

@geindex colno (json.JSONDecodeError의 속성)
@anchor{library/json json JSONDecodeError colno}@anchor{3c1d}
@deffn {속성} colno

`pos'에 해당하는 열.
@end deffn


Added in version 3.5.

@end deffn

@node 표준 준수와 상호 운용성,Command-line interface<5>,예외<14>,json — JSON 인코더와 디코더
@anchor{library/json standard-compliance-and-interoperability}@anchor{3c1e}
@subsubsection 표준 준수와 상호 운용성


JSON 형식은 
@geindex RFC; RFC 7159
RFC 7159@footnote{https://datatracker.ietf.org/doc/html/rfc7159.html}와 ECMA-404@footnote{https://ecma-international.org/publications-and-standards/standards/ecma-404/}에 의해 지정됩니다. 이 절에서는 이 모듈의 RFC 준수 수준에 대해 자세히 설명합니다. 단순화를 위해, @ref{f41,,JSONEncoder} 및 @ref{f42,,JSONDecoder} 서브 클래스와 명시적으로 언급되지 않은 매개 변수는 고려되지 않습니다.

유효한 JavaScript이지만 유효한 JSON이 아닌 확장을 구현함으로써, 이 모듈은 엄격한 방식으로 RFC를 준수하지는 않습니다. 특히:


@itemize -

@item 
무한대와 NaN 숫자 값이 받아들여지고 출력됩니다;

@item 
오브젝트 내에서 반복되는 이름이 허용되고, 마지막 이름-값 쌍의 값만 사용됩니다.
@end itemize

RFC가 RFC를 준수하는 구문 분석기가 RFC를 준수하지 않는 입력 텍스트를 받아들이도록 허용하기 때문에, 이 모듈의 역 직렬화기는 기본 설정에서 기술적으로 RFC를 준수합니다.

@menu
* 문자 인코딩:: 
* 무한대와 NaN 숫자 값:: 
* 오브젝트 내에서 반복된 이름:: 
* 오브젝트나 배열이 아닌 최상윗값:: 
* 구현 제약 사항:: 

@end menu

@node 문자 인코딩,무한대와 NaN 숫자 값,,표준 준수와 상호 운용성
@anchor{library/json character-encodings}@anchor{3c1f}
@subsubsection 문자 인코딩


RFC는 UTF-8, UTF-16 또는 UTF-32를 사용하여 JSON을 표현할 것을 요구하고, 최대 상호 운용성을 위해 권장되는 기본값은 UTF-8입니다.

As permitted, though not required, by the RFC, this module’s serializer sets
`ensure_ascii=True' by default, thus escaping the output so that the resulting
strings only contain printable ASCII characters.

`ensure_ascii' 매개 변수 외에도, 이 모듈은 파이썬 객체와 @ref{169,,유니코드 문자열} 사이의 변환으로 엄격하게 정의되어 있으므로, 문자 인코딩 문제를 직접 다루지 않습니다.

RFC는 JSON 텍스트의 시작 부분에 바이트 순서 표시(BOM)를 추가하는 것을 금지하고 있으며, 이 모듈의 직렬화기는 BOM을 출력에 추가하지 않습니다. RFC는 JSON 역 직렬화기가 입력에서 초기 BOM을 무시하는 것을 허용하지만 요구하지는 않습니다. 이 모듈의 역 직렬화기는 초기 BOM이 있을 때 @ref{2ec,,ValueError}를 발생시킵니다.

RFC는 유효한 유니코드 문자에 해당하지 않는 바이트 시퀀스(예를 들어, 쌍을 이루지 않은 UTF-16 대리 코드(unpaired UTF-16 surrogates))가 포함된 JSON 문자열을 명시적으로 금지하지 않지만, 상호 운용성 문제를 일으킬 수 있다고 지적하고 있습니다. 기본적으로, 이 모듈은 이러한 시퀀스의 코드 포인트를 받아들이고 (원래 @ref{169,,str}에 있을 때) 출력합니다.

@node 무한대와 NaN 숫자 값,오브젝트 내에서 반복된 이름,문자 인코딩,표준 준수와 상호 운용성
@anchor{library/json infinite-and-nan-number-values}@anchor{3c20}
@subsubsection 무한대와 NaN 숫자 값


RFC는 무한대나 NaN 숫자 값의 표현을 허용하지 않습니다. 그런데도, 기본적으로, 이 모듈은 유효한 JSON 숫자 리터럴 값인 것처럼 @code{Infinity}, @code{-Infinity} 및 @code{NaN}을 받아들이고 출력합니다:

@example
>>> # 이 호출 중 어느 것도 예외를 발생시키지 않지만, 결과는 유효한 JSON이 아닙니다
>>> json.dumps(float('-inf'))
'-Infinity'
>>> json.dumps(float('nan'))
'NaN'
>>> # 역 직렬화 때도 마찬가지입니다
>>> json.loads('-Infinity')
-inf
>>> json.loads('NaN')
nan
@end example

직렬화기에서, `allow_nan' 매개 변수를 사용하여 이 동작을 변경할 수 있습니다. 역 직렬화기에서, `parse_constant' 매개 변수를 사용하여 이 동작을 변경할 수 있습니다.

@node 오브젝트 내에서 반복된 이름,오브젝트나 배열이 아닌 최상윗값,무한대와 NaN 숫자 값,표준 준수와 상호 운용성
@anchor{library/json repeated-names-within-an-object}@anchor{3c21}
@subsubsection 오브젝트 내에서 반복된 이름


RFC는 JSON 오브젝트 내에서 이름이 고유해야 한다고 지정하지만, JSON 오브젝트 내에서 반복되는 이름을 처리하는 방법을 지정하지는 않습니다. 기본적으로, 이 모듈은 예외를 발생시키지 않습니다; 대신, 주어진 이름에 대한 마지막 이름-값 쌍을 제외한 모든 것을 무시합니다:

@example
>>> weird_json = '@{"x": 1, "x": 2, "x": 3@}'
>>> json.loads(weird_json)
@{'x': 3@}
@end example

`object_pairs_hook' 매개 변수는 이 동작을 변경하는 데 사용할 수 있습니다.

@node 오브젝트나 배열이 아닌 최상윗값,구현 제약 사항,오브젝트 내에서 반복된 이름,표준 준수와 상호 운용성
@anchor{library/json top-level-non-object-non-array-values}@anchor{3c22}
@subsubsection 오브젝트나 배열이 아닌 최상윗값


폐지된 
@geindex RFC; RFC 4627
RFC 4627@footnote{https://datatracker.ietf.org/doc/html/rfc4627.html}에 의해 지정된 이전 버전의 JSON은 JSON 텍스트의 최상윗값이 JSON 오브젝트나 배열(파이썬 @ref{183,,dict}나 @ref{24d,,list})이어야 하고, JSON null, 불리언, 숫자 또는 문자열 값이 될 수 없다고 요구합니다. 
@geindex RFC; RFC 7159
RFC 7159@footnote{https://datatracker.ietf.org/doc/html/rfc7159.html}는 그 제한을 제거했으며, 이 모듈은 직렬화기와 역 직렬화기에서 이러한 제한을 구현하지 않으며, 그런 적도 없습니다.

이와 관계없이, 최대한의 상호 운용성을 위해, 여러분은 자발적으로 제한을 준수하기를 원할 수 있습니다.

@node 구현 제약 사항,,오브젝트나 배열이 아닌 최상윗값,표준 준수와 상호 운용성
@anchor{library/json implementation-limitations}@anchor{3c23}
@subsubsection 구현 제약 사항


일부 JSON 역 직렬화기 구현은 다음과 같은 것들에 대한 제한을 설정할 수 있습니다:


@itemize *

@item 
받아들인 JSON 텍스트의 크기

@item 
JSON 오브젝트와 배열의 최대 중첩 수준

@item 
JSON 숫자의 범위와 정밀도

@item 
JSON 문자열의 내용과 최대 길이
@end itemize

이 모듈은 관련 파이썬 데이터형 자체나 파이썬 인터프리터 자체의 한계 외에는 어떤 제한도 가하지 않습니다.

JSON으로 직렬화할 때, 여러분의 JSON을 사용할 응용 프로그램에 있는 이러한 제한 사항에 주의하십시오. 특히, JSON 숫자가 IEEE 754 배정도 숫자로 역 직렬화되는 것이 일반적이고, 그래서 그 표현의 범위와 정밀도 제한이 적용됩니다. 이것은 매우 큰 규모의 파이썬 @ref{19b,,int} 값을 직렬화하거나, @ref{1fe,,decimal.Decimal}과 같은 “색다른” 숫자 형의 인스턴스를 직렬화할 때 특히 중요합니다.

@node Command-line interface<5>,,표준 준수와 상호 운용성,json — JSON 인코더와 디코더
@anchor{library/json command-line-interface}@anchor{3c24}@anchor{library/json json-commandline}@anchor{23e}@anchor{library/json module-json tool}@anchor{87}
@subsubsection Command-line interface


@geindex module; json.tool

`소스 코드:' Lib/json/tool.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/json/tool.py}


__________________________________________________________________


The @code{json} module can be invoked as a script via @code{python -m json}
to validate and pretty-print JSON objects. The @code{json.tool} submodule
implements this interface.

선택적 @code{infile}과 @code{outfile} 인자가 지정되지 않으면, 각각 @ref{75e,,sys.stdin}과 @ref{ccc,,sys.stdout}이 사용됩니다:

@example
$ echo '@{"json": "obj"@}' | python -m json
@{
    "json": "obj"
@}
$ echo '@{1.2:3.4@}' | python -m json
Expecting property name enclosed in double quotes: line 1 column 2 (char 1)
@end example


버전 3.5에서 변경: 출력은 이제 입력과 같은 순서입니다. 딕셔너리의 출력을 키에 대해 알파벳 순으로 정렬하려면 @ref{3c25,,--sort-keys} 옵션을 사용하십시오.



버전 3.14에서 변경: The @code{json} module may now be directly executed as
@code{python -m json}. For backwards compatibility, invoking
the CLI as @code{python -m json.tool} remains supported.


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

@end menu

@node Command-line options<2>,,,Command-line interface<5>
@anchor{library/json command-line-options}@anchor{3c26}
@subsubsection Command-line options


@geindex json 명령줄 옵션; infile
@anchor{library/json cmdoption-json-arg-infile}@anchor{3c27}
@deffn {Option} infile

유효성을 검사하거나 예쁘게 인쇄할 JSON 파일:

@example
$ python -m json mp_films.json
[
    @{
        "title": "And Now for Something Completely Different",
        "year": 1971
    @},
    @{
        "title": "Monty Python and the Holy Grail",
        "year": 1975
    @}
]
@end example

`infile'이 지정되지 않으면, @ref{75e,,sys.stdin}에서 읽습니다.
@end deffn

@geindex json 명령줄 옵션; outfile
@anchor{library/json cmdoption-json-arg-outfile}@anchor{3c28}
@deffn {Option} outfile

`infile'의 출력을 지정된 `outfile'에 씁니다. 그렇지 않으면, @ref{ccc,,sys.stdout}에 씁니다.
@end deffn

@geindex json 명령줄 옵션; --sort-keys
@anchor{library/json cmdoption-json-sort-keys}@anchor{3c25}
@deffn {Option} @w{-}@w{-}sort@w{-}keys

딕셔너리의 출력을 키에 대해 알파벳 순으로 정렬합니다.


Added in version 3.5.

@end deffn

@geindex json 명령줄 옵션; --no-ensure-ascii
@anchor{library/json cmdoption-json-no-ensure-ascii}@anchor{3c29}
@deffn {Option} @w{-}@w{-}no@w{-}ensure@w{-}ascii

비 ASCII 문자의 이스케이프를 비활성화합니다. 자세한 내용은 @ref{f40,,json.dumps()}를 참조하십시오.


Added in version 3.9.

@end deffn

@geindex json 명령줄 옵션; --json-lines
@anchor{library/json cmdoption-json-json-lines}@anchor{3c2a}
@deffn {Option} @w{-}@w{-}json@w{-}lines

모든 입력 행을 별도의 JSON 객체로 구문 분석합니다.


Added in version 3.8.

@end deffn

@geindex json 명령줄 옵션; --indent
@geindex json 명령줄 옵션; --tab
@geindex json 명령줄 옵션; --no-indent
@geindex json 명령줄 옵션; --compact
@anchor{library/json cmdoption-json-indent}@anchor{3c2b}@anchor{library/json cmdoption-json-tab}@anchor{3c2c}@anchor{library/json cmdoption-json-no-indent}@anchor{3c2d}@anchor{library/json cmdoption-json-compact}@anchor{3c2e}
@deffn {Option} @w{-}@w{-}indent, @w{-}@w{-}tab, @w{-}@w{-}no@w{-}indent, @w{-}@w{-}compact

공백 제어를 위한 상호 배타적 옵션.


Added in version 3.9.

@end deffn

@geindex json 명령줄 옵션; -h
@geindex json 명령줄 옵션; --help
@anchor{library/json cmdoption-json-h}@anchor{3c2f}@anchor{library/json cmdoption-json-help}@anchor{3c30}
@deffn {Option} @w{-}h, @w{-}@w{-}help

도움말 메시지를 표시합니다.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node mailbox — 다양한 형식의 사서함 조작하기,mimetypes — 파일명을 MIME 유형에 매핑,json — JSON 인코더와 디코더,인터넷 데이터 처리
@anchor{library/mailbox doc}@anchor{3c31}@anchor{library/mailbox mailbox-manipulate-mailboxes-in-various-formats}@anchor{3c32}@anchor{library/mailbox module-mailbox}@anchor{8f}@anchor{library/mailbox translation-repo}@anchor{3c33}
@subsection @code{mailbox} — 다양한 형식의 사서함 조작하기


@geindex module; mailbox

`소스 코드:' Lib/mailbox.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/mailbox.py}


__________________________________________________________________


이 모듈은 디스크 상의 사서함과 여기에 포함된 메시지에 액세스하고 조작하기 위한 @ref{1451,,Mailbox}와 @ref{1455,,Message}라는 두 개의 클래스를 정의합니다. @code{Mailbox}는 키에서 메시지로의 딕셔너리와 유사한 매핑을 제공합니다. @code{Message}는 형식별 상태와 동작으로 @ref{48,,email.message} 모듈의 @ref{580,,Message} 클래스를 확장합니다. 지원되는 사서함 형식은 Maildir, mbox, MH, Babyl 및 MMDF입니다.


@subsubheading 더 보기



@table @asis

@item 모듈 @ref{3f,,email}

메시지를 표현하고 조작합니다.
@end table


@menu
* Mailbox 객체:: 
* Message 객체:: 
* 예외: 예외<15>. 
* 예: 예<7>. 

@end menu

@node Mailbox 객체,Message 객체,,mailbox — 다양한 형식의 사서함 조작하기
@anchor{library/mailbox id1}@anchor{3c34}@anchor{library/mailbox mailbox-objects}@anchor{3c35}
@subsubsection @code{Mailbox} 객체


@geindex Mailbox (mailbox 클래스)
@anchor{library/mailbox mailbox Mailbox}@anchor{1451}
@deffn {클래스} mailbox.Mailbox

검사하고 수정할 수 있는 사서함.

@code{Mailbox} 클래스는 인터페이스를 정의하고 인스턴스 화하려는 것은 아닙니다. 대신 형식별 서브 클래스는 @code{Mailbox}를 상속해야 하며 코드는 특정 서브 클래스를 인스턴스 화해야 합니다.

@code{Mailbox} 인터페이스는 메시지에 해당하는 작은 키가 있는 딕셔너리와 유사합니다. 키는 사용되는 @code{Mailbox} 인스턴스에 의해 발급되며 해당 @code{Mailbox} 인스턴스에만 의미가 있습니다. 키는 메시지를 다른 메시지로 바꾸는 등 해당 메시지가 수정되어도 메시지를 계속 식별합니다.

집합과 유사한 메서드 @ref{1450,,add()}를 사용하여 @code{Mailbox} 인스턴스에 메시지를 추가하고 @code{del} 문이나 집합과 유사한 메서드 @ref{3c36,,remove()}와 @ref{3c37,,discard()}를 사용하여 제거할 수 있습니다.

@code{Mailbox} 인터페이스의 의미는 몇 가지 주목할만한 면에서 딕셔너리와 다릅니다. 메시지가 요청될 때마다, 새 표현(보통 @ref{1455,,Message} 인스턴스)이 사서함의 현재 상태를 기반으로 생성됩니다. 마찬가지로, @code{Mailbox} 인스턴스에 메시지가 추가되면, 제공된 메시지 표현의 내용이 복사됩니다. 두 경우 모두 메시지 표현의 참조는 @code{Mailbox} 인스턴스가 유지하는 것이 아닙니다.

기본 @code{Mailbox} @ref{4ca,,이터레이터}는 기본 @ref{183,,딕셔너리} 이터레이터가 수행하는 것처럼 키가 아니라 메시지 표현을 이터레이트 합니다. 또한, 이터레이션 중 사서함 수정은 안전하고 잘 정의되어 있습니다. 이터레이터가 만들어진 후 사서함에 추가된 메시지는 이터레이터가 볼 수 없습니다. 이터레이터가 산출하기 전에 사서함에서 제거된 메시지는 자동으로 건너뛰지만, 이터레이터의 키를 사용하면 해당 메시지가 직후에 제거되는 경우 @ref{5e5,,KeyError} 예외가 발생할 수 있습니다.

@cartouche
@quotation 경고 
다른 프로세스에 의해 동시에 변경될 수 있는 사서함을 수정할 때는 매우 주의하십시오. 이러한 작업에 사용할 가장 안전한 사서함 형식은 @ref{65c,,Maildir}입니다; 동시 쓰기를 위해서는 @ref{19fb,,mbox}와 같은 단일 파일 형식을 사용하지 마십시오. 사서함을 수정하는 경우, 파일의 메시지를 읽거나 메시지를 추가하거나 삭제하여 변경하기 `전에' @ref{3c38,,lock()}과 @ref{3c39,,unlock()} 메서드를 호출하여 사서함을 `반드시' 잠가야 합니다. 사서함을 잠그는 데 실패하면 메시지가 손실되거나 전체 사서함이 손상될 위험이 있습니다.
@end quotation
@end cartouche

@code{Mailbox} 인스턴스에는 다음 메서드가 있습니다:

@geindex add() (mailbox.Mailbox 메서드)
@anchor{library/mailbox mailbox Mailbox add}@anchor{1450}
@deffn {메서드} add (message)

사서함에 `message'를 추가하고 할당된 키를 반환합니다.

매개 변수 `message'는 @ref{1455,,Message} 인스턴스, @ref{580,,email.message.Message} 인스턴스, 문자열, 바이트 문자열 또는 파일류 객체(바이너리 모드로 열어야 합니다)일 수 있습니다. `message'가 적절한 형식별 @code{Message} 서브 클래스의 인스턴스이면 (예를 들어, 이것이 @ref{19fb,,mbox} 인스턴스일 때 @ref{3af6,,mboxMessage} 인스턴스이면), 형식별 정보가 사용됩니다. 그렇지 않으면, 형식별 정보에 대한 적절한 기본값이 사용됩니다.


버전 3.2에서 변경: 바이너리 입력에 대한 지원이 추가되었습니다.

@end deffn

@geindex remove() (mailbox.Mailbox 메서드)
@geindex __delitem__() (mailbox.Mailbox 메서드)
@geindex discard() (mailbox.Mailbox 메서드)
@anchor{library/mailbox mailbox Mailbox remove}@anchor{3c36}
@deffn {메서드} remove (key)
@anchor{library/mailbox mailbox Mailbox __delitem__}@anchor{3c3a}
@deffnx {메서드} __delitem__ (key)
@anchor{library/mailbox mailbox Mailbox discard}@anchor{3c37}
@deffnx {메서드} discard (key)

사서함에서 `key'에 해당하는 메시지를 삭제합니다.

그러한 메시지가 없으면, 메서드가 @ref{3c36,,remove()}나 @ref{3c3a,,__delitem__()}으로 호출되면 @ref{5e5,,KeyError} 예외가 발생하지만, @ref{3c37,,discard()}로 호출되면 예외가 발생하지 않습니다. 하부 사서함 형식이 다른 프로세스에 의한 동시 수정을 지원하면 @code{discard()}의 동작을 선호할 수 있습니다.
@end deffn

@geindex __setitem__() (mailbox.Mailbox 메서드)
@anchor{library/mailbox mailbox Mailbox __setitem__}@anchor{3c3b}
@deffn {메서드} __setitem__ (key, message)

`key'에 해당하는 메시지를 `message'로 바꿉니다. `key'에 해당하는 메시지가 없으면 @ref{5e5,,KeyError} 예외를 발생시킵니다.

@ref{1450,,add()}와 마찬가지로, `message' 매개 변수는 @ref{1455,,Message} 인스턴스, @ref{580,,email.message.Message} 인스턴스, 문자열, 바이트 문자열 또는 파일류 객체(바이너리 모드로 열어야 합니다)일 수 있습니다. `message'가 적절한 형식별 @code{Message} 서브 클래스의 인스턴스이면 (예를 들어, 이것이 @ref{19fb,,mbox} 인스턴스일 때 @ref{3af6,,mboxMessage} 인스턴스이면), 형식별 정보가 사용됩니다. 그렇지 않으면, 현재 `key'에 해당하는 메시지의 형식별 정보가 변경되지 않습니다.
@end deffn

@geindex iterkeys() (mailbox.Mailbox 메서드)
@anchor{library/mailbox mailbox Mailbox iterkeys}@anchor{3c3c}
@deffn {메서드} iterkeys ()

Return an @ref{4ca,,iterator} over all keys
@end deffn

@geindex keys() (mailbox.Mailbox 메서드)
@anchor{library/mailbox mailbox Mailbox keys}@anchor{3c3d}
@deffn {메서드} keys ()

The same as @ref{3c3c,,iterkeys()}, except that a @ref{24d,,list} is returned
rather than an @ref{4ca,,iterator}
@end deffn

@geindex itervalues() (mailbox.Mailbox 메서드)
@geindex __iter__() (mailbox.Mailbox 메서드)
@anchor{library/mailbox mailbox Mailbox itervalues}@anchor{3c3e}
@deffn {메서드} itervalues ()
@anchor{library/mailbox mailbox Mailbox __iter__}@anchor{3c3f}
@deffnx {메서드} __iter__ ()

모든 메시지의 표현에 대한 @ref{4ca,,이터레이터}를 반환합니다. @code{Mailbox} 인스턴스가 초기화될 때 사용자 정의 메시지 팩토리가 지정되지 않는 한, 메시지는 적절한 형식별 @ref{1455,,Message} 서브 클래스의 인스턴스로 표현됩니다.

@cartouche
@quotation 참고 
@ref{3c3f,,__iter__()}의 동작은 키를 이터레이트 하는 딕셔너리의 동작과 다릅니다.
@end quotation
@end cartouche
@end deffn

@geindex values() (mailbox.Mailbox 메서드)
@anchor{library/mailbox mailbox Mailbox values}@anchor{3c40}
@deffn {메서드} values ()

The same as @ref{3c3e,,itervalues()}, except that a @ref{24d,,list} is returned
rather than an @ref{4ca,,iterator}
@end deffn

@geindex iteritems() (mailbox.Mailbox 메서드)
@anchor{library/mailbox mailbox Mailbox iteritems}@anchor{3c41}
@deffn {메서드} iteritems ()

(`key', `message') 쌍에 대한 @ref{4ca,,이터레이터}를 반환합니다. 여기서 `key'는 키이고 `message'는 메시지 표현입니다. @code{Mailbox} 인스턴스가 초기화될 때 사용자 정의 메시지 팩토리가 지정되지 않는 한 메시지는 적절한 형식별 @ref{1455,,Message} 서브 클래스의 인스턴스로 표시됩니다.
@end deffn

@geindex items() (mailbox.Mailbox 메서드)
@anchor{library/mailbox mailbox Mailbox items}@anchor{3c42}
@deffn {메서드} items ()

The same as @ref{3c41,,iteritems()}, except that a @ref{24d,,list} of pairs is
returned rather than an @ref{4ca,,iterator} of pairs.
@end deffn

@geindex get() (mailbox.Mailbox 메서드)
@geindex __getitem__() (mailbox.Mailbox 메서드)
@anchor{library/mailbox mailbox Mailbox get}@anchor{3c43}
@deffn {메서드} get (key, default=None)
@anchor{library/mailbox mailbox Mailbox __getitem__}@anchor{3c44}
@deffnx {메서드} __getitem__ (key)

`key'에 해당하는 메시지 표현을 반환합니다. 이러한 메시지가 없으면, 메서드가 @ref{3c43,,get()}으로 호출되면 `default'가 반환되고 메서드가 @code{__getitem__()}으로 호출되면 @ref{5e5,,KeyError} 예외가 발생합니다. @code{Mailbox} 인스턴스가 초기화될 때 사용자 정의 메시지 팩토리가 지정되지 않는 한 메시지는 적절한 형식별 @ref{1455,,Message} 서브 클래스의 인스턴스로 표시됩니다.
@end deffn

@geindex get_message() (mailbox.Mailbox 메서드)
@anchor{library/mailbox mailbox Mailbox get_message}@anchor{3c45}
@deffn {메서드} get_message (key)

`key'에 해당하는 메시지의 표현을 적절한 형식별 @ref{1455,,Message} 서브 클래스의 인스턴스로 반환하거나, 그러한 메시지가 없으면 @ref{5e5,,KeyError} 예외를 발생시킵니다.
@end deffn

@geindex get_bytes() (mailbox.Mailbox 메서드)
@anchor{library/mailbox mailbox Mailbox get_bytes}@anchor{1453}
@deffn {메서드} get_bytes (key)

`key'에 해당하는 메시지의 바이트 표현을 반환하거나, 그러한 메시지가 없으면 @ref{5e5,,KeyError} 예외를 발생시킵니다.


Added in version 3.2.

@end deffn

@geindex get_string() (mailbox.Mailbox 메서드)
@anchor{library/mailbox mailbox Mailbox get_string}@anchor{1454}
@deffn {메서드} get_string (key)

`key'에 해당하는 메시지의 문자열 표현을 반환하거나 그러한 메시지가 없으면 @ref{5e5,,KeyError} 예외를 발생시킵니다. 메시지는 @ref{580,,email.message.Message}를 통해 처리되어 7비트(7bit clean) 표현으로 변환됩니다.
@end deffn

@geindex get_file() (mailbox.Mailbox 메서드)
@anchor{library/mailbox mailbox Mailbox get_file}@anchor{1452}
@deffn {메서드} get_file (key)

`key'에 해당하는 메시지의 @ref{17b3,,파일류} 표현을 반환하거나, 그러한 메시지가 없으면 @ref{5e5,,KeyError} 예외를 발생시킵니다. 파일류 객체는 바이너리 모드로 열린 것처럼 작동합니다. 이 파일이 더는 필요하지 않으면 닫아야 합니다.


버전 3.2에서 변경: 파일 객체는 실제로 @ref{206c,,바이너리 파일}입니다; 이전에는 텍스트 모드로 잘못 반환되었습니다. 또한, @ref{17b3,,파일류 객체}는 이제 @ref{1e1,,컨텍스트 관리자} 프로토콜을 지원합니다: @ref{186,,with} 문을 사용하여 자동으로 닫을 수 있습니다.


@cartouche
@quotation 참고 
메시지의 다른 표현과 달리, @ref{17b3,,파일류} 표현은 메시지를 만든 @code{Mailbox} 인스턴스나 하부 사서함과 반드시 독립적인 것은 아닙니다. 더욱 자세한 설명서는 각 서브 클래스에서 제공합니다.
@end quotation
@end cartouche
@end deffn

@geindex __contains__() (mailbox.Mailbox 메서드)
@anchor{library/mailbox mailbox Mailbox __contains__}@anchor{3c46}
@deffn {메서드} __contains__ (key)

`key'가 메시지에 해당하면 @code{True}를 반환하고, 그렇지 않으면 @code{False}를 반환합니다.
@end deffn

@geindex __len__() (mailbox.Mailbox 메서드)
@anchor{library/mailbox mailbox Mailbox __len__}@anchor{3c47}
@deffn {메서드} __len__ ()

사서함에 있는 메시지 수를 반환합니다.
@end deffn

@geindex clear() (mailbox.Mailbox 메서드)
@anchor{library/mailbox mailbox Mailbox clear}@anchor{3c48}
@deffn {메서드} clear ()

사서함에서 모든 메시지를 삭제합니다.
@end deffn

@geindex pop() (mailbox.Mailbox 메서드)
@anchor{library/mailbox mailbox Mailbox pop}@anchor{3c49}
@deffn {메서드} pop (key, default=None)

`key'에 해당하는 메시지 표현을 반환하고 메시지를 삭제합니다. 이러한 메시지가 없으면, `default'를 반환합니다. @code{Mailbox} 인스턴스가 초기화될 때 사용자 정의 메시지 팩토리가 지정되지 않는 한 메시지는 적절한 형식별 @ref{1455,,Message} 서브 클래스의 인스턴스로 표시됩니다.
@end deffn

@geindex popitem() (mailbox.Mailbox 메서드)
@anchor{library/mailbox mailbox Mailbox popitem}@anchor{3c4a}
@deffn {메서드} popitem ()

임의의 (`key', `message') 쌍을 반환하고, 여기서 `key'는 키이고 `message'는 메시지 표현입니다, 해당 메시지를 삭제합니다. 사서함이 비어 있으면, @ref{5e5,,KeyError} 예외를 발생시킵니다. @code{Mailbox} 인스턴스가 초기화될 때 사용자 정의 메시지 팩토리가 지정되지 않는 한 메시지는 적절한 형식별 @ref{1455,,Message} 서브 클래스의 인스턴스로 표시됩니다.
@end deffn

@geindex update() (mailbox.Mailbox 메서드)
@anchor{library/mailbox mailbox Mailbox update}@anchor{3c4b}
@deffn {메서드} update (arg)

매개 변수 `arg'는 `key'에서 `message'로의 매핑이거나 (`key', `message') 쌍의 이터러블 이어야 합니다. 주어진 `key'와 `message'에 대해 @ref{3c3b,,__setitem__()}을 사용하는 것처럼 `key'에 해당하는 메시지가 `message'로 설정되도록 사서함을 갱신합니다. @code{__setitem__()}과 마찬가지로, 각 `key'는 이미 사서함의 메시지에 해당해야 합니다, 그렇지 않으면 @ref{5e5,,KeyError} 예외가 발생하므로, 일반적으로 `arg'가 @code{Mailbox} 인스턴스가 되는 것은 올바르지 않습니다.

@cartouche
@quotation 참고 
딕셔너리와 달리 키워드 인자는 지원되지 않습니다.
@end quotation
@end cartouche
@end deffn

@geindex flush() (mailbox.Mailbox 메서드)
@anchor{library/mailbox mailbox Mailbox flush}@anchor{19c1}
@deffn {메서드} flush ()

계류 중인 변경 사항을 파일 시스템에 기록합니다. 일부 @ref{1451,,Mailbox} 서브 클래스의 경우, 변경 사항이 항상 즉시 기록되고 @code{flush()}는 아무 작업도 하지 않지만, 이 메서드를 호출하는 습관을 만들어야 합니다.
@end deffn

@geindex lock() (mailbox.Mailbox 메서드)
@anchor{library/mailbox mailbox Mailbox lock}@anchor{3c38}
@deffn {메서드} lock ()

다른 프로세스가 수정하지 않아야 한다는 것을 알 수 있도록 사서함에 대한 배타적 권고 잠금(exclusive advisory lock)을 획득합니다. 잠금을 사용할 수 없으면 @ref{3c4c,,ExternalClashError} 가 발생합니다. 사용되는 특정 잠금 메커니즘은 사서함 형식에 따라 다릅니다. 내용을 수정하기 전에 사서함을 `항상' 잠가야 합니다.
@end deffn

@geindex unlock() (mailbox.Mailbox 메서드)
@anchor{library/mailbox mailbox Mailbox unlock}@anchor{3c39}
@deffn {메서드} unlock ()

사서함의 잠금을 해제합니다 (있다면).
@end deffn

@geindex close() (mailbox.Mailbox 메서드)
@anchor{library/mailbox mailbox Mailbox close}@anchor{3c4d}
@deffn {메서드} close ()

사서함을 플러시하고, 필요하면 잠금을 해제한 다음, 열려있는 모든 파일을 닫습니다. 일부 @code{Mailbox} 서브 클래스의 경우, 이 메서드는 아무 작업도 수행하지 않습니다.
@end deffn
@end deffn

@menu
* Maildir 객체:: 
* mbox 객체:: 
* MH 객체:: 
* Babyl 객체:: 
* MMDF 객체:: 

@end menu

@node Maildir 객체,mbox 객체,,Mailbox 객체
@anchor{library/mailbox mailbox-maildir}@anchor{3c4e}@anchor{library/mailbox maildir-objects}@anchor{3c4f}
@subsubsection @code{Maildir} 객체


@geindex Maildir (mailbox 클래스)
@anchor{library/mailbox mailbox Maildir}@anchor{65c}
@deffn {클래스} mailbox.Maildir (dirname, factory=None, create=True)

Maildir 형식의 사서함에 대한 @ref{1451,,Mailbox}의 서브 클래스. 매개 변수 `factory'는 파일류 메시지 표현(바이너리 모드에서 열린 것처럼 동작합니다)을 받아들이고 사용자 정의 표현을 반환하는 콜러블 객체입니다. `factory'가 @code{None}이면, @ref{3c50,,MaildirMessage} 가 기본 메시지 표현으로 사용됩니다. `create'가 @code{True}이면, 사서함이 없으면 만들어집니다.

`create'가 @code{True}이고 `dirname' 경로가 존재하면, 디렉터리 레이아웃을 확인하지 않고 기존 maildir로 처리됩니다.

역사적인 이유로 `path'가 아니라 `dirname'이라고 이름 붙였습니다.

Maildir은 qmail 메일 전송 에이전트를 위해 고안된 디렉터리 기반 사서함 형식이며 현재 다른 프로그램에서 널리 지원됩니다. Maildir 사서함의 메시지는 공통 디렉터리 구조 내에서 별도의 파일에 저장됩니다. 이 설계를 사용하면 데이터 손상 없이 여러 관련 없는 프로그램에서 Maildir 사서함에 액세스하고 수정할 수 있어서 파일 잠금이 필요하지 않습니다.

Maildir 사서함에는 세 개의 하위 디렉터리가 있습니다, 이름하여 @code{tmp}, @code{new} 및 @code{cur}. 메시지는 일시적으로 @code{tmp} 하위 디렉터리에 만들어진 다음 @code{new} 하위 디렉터리로 이동하여 전달을 완료합니다. 메일 사용자 에이전트는 이후에 메시지를 @code{cur} 하위 디렉터리로 이동하고 파일 이름에 추가된 특수 “info” 섹션에 메시지 상태에 대한 정보를 저장할 수 있습니다.

Courier 메일 전송 에이전트가 도입한 스타일의 폴더도 지원됩니다. @code{'.'}가 이름의 첫 번째 문자인 경우 주 사서함의 모든 하위 디렉터리는 폴더로 간주합니다. 폴더 이름은 앞의 @code{'.'}없이 @code{Maildir}로 표시됩니다. 각 폴더는 그 자체가 Maildir 사서함이지만 다른 폴더를 포함해서는 안 됩니다. 대신, 수준을 구분하기 위해 @code{'.'}을 사용하여 논리적 중첩이 표시됩니다, 예를 들어, “Archived.2005.07”.

@geindex colon (mailbox.Maildir의 속성)
@anchor{library/mailbox mailbox Maildir colon}@anchor{3c51}
@deffn {속성} colon

Maildir 명세에서는 특정 메시지 파일 이름에 콜론(@code{':'})을 사용하도록 요구합니다. 그러나 일부 운영 체제에서는 파일 이름에 이 문자를 허용하지 않습니다. 이러한 운영 체제에서 Maildir과 유사한 형식을 사용하려면, 대신 사용할 다른 문자를 지정해야 합니다. 느낌표(@code{'!'})는 인기 있는 선택입니다. 예를 들면:

@example
import mailbox
mailbox.Maildir.colon = '!'
@end example

@code{colon} 어트리뷰트는 인스턴스별로 설정할 수도 있습니다.
@end deffn


버전 3.13에서 변경: @code{Maildir} now ignores files with a leading dot.


@code{Maildir} 인스턴스에는 @ref{1451,,Mailbox}의 모든 메서드 외에도 다름과 같은 메서드가 있습니다:

@geindex list_folders() (mailbox.Maildir 메서드)
@anchor{library/mailbox mailbox Maildir list_folders}@anchor{3c52}
@deffn {메서드} list_folders ()

모든 폴더의 이름 리스트를 반환합니다.
@end deffn

@geindex get_folder() (mailbox.Maildir 메서드)
@anchor{library/mailbox mailbox Maildir get_folder}@anchor{3c53}
@deffn {메서드} get_folder (folder)

이름이 `folder'인 폴더를 나타내는 @code{Maildir} 인스턴스를 반환합니다. 폴더가 없으면 @ref{3c54,,NoSuchMailboxError} 예외가 발생합니다.
@end deffn

@geindex add_folder() (mailbox.Maildir 메서드)
@anchor{library/mailbox mailbox Maildir add_folder}@anchor{3c55}
@deffn {메서드} add_folder (folder)

이름이 `folder'인 폴더를 만들고 이를 나타내는 @code{Maildir} 인스턴스를 반환합니다.
@end deffn

@geindex remove_folder() (mailbox.Maildir 메서드)
@anchor{library/mailbox mailbox Maildir remove_folder}@anchor{3c56}
@deffn {메서드} remove_folder (folder)

이름이 `folder'인 폴더를 삭제합니다. 폴더에 메시지가 포함되었으면, @ref{3c57,,NotEmptyError} 예외가 발생하고 폴더가 삭제되지 않습니다.
@end deffn

@geindex clean() (mailbox.Maildir 메서드)
@anchor{library/mailbox mailbox Maildir clean}@anchor{3c58}
@deffn {메서드} clean ()

지난 36시간 동안 액세스하지 않은 사서함에서 임시 파일을 삭제합니다. Maildir 명세는 메일을 읽는 프로그램이 이 작업을 가끔 수행해야 한다고 말합니다.
@end deffn

@geindex get_flags() (mailbox.Maildir 메서드)
@anchor{library/mailbox mailbox Maildir get_flags}@anchor{1a46}
@deffn {메서드} get_flags (key)

Return as a string the flags that are set on the message
corresponding to `key'.
This is the same as @code{get_message(key).get_flags()} but much
faster, because it does not open the message file.
Use this method when iterating over the keys to determine which
messages are interesting to get.

If you do have a @ref{3c50,,MaildirMessage} object, use
its @ref{3c59,,get_flags()} method instead, because
changes made by the message’s @ref{3c5a,,set_flags()},
@ref{3c5b,,add_flag()} and @ref{3c5c,,remove_flag()}
methods are not reflected here until the mailbox’s
@ref{3c5d,,__setitem__()} method is called.


Added in version 3.13.

@end deffn

@geindex set_flags() (mailbox.Maildir 메서드)
@anchor{library/mailbox mailbox Maildir set_flags}@anchor{1a47}
@deffn {메서드} set_flags (key, flags)

On the message corresponding to `key', set the flags specified
by `flags' and unset all others.
Calling @code{some_mailbox.set_flags(key, flags)} is similar to

@example
one_message = some_mailbox.get_message(key)
one_message.set_flags(flags)
some_mailbox[key] = one_message
@end example

but faster, because it does not open the message file.

If you do have a @ref{3c50,,MaildirMessage} object, use
its @ref{3c5a,,set_flags()} method instead, because
changes made with this mailbox method will not be visible to the
message object’s method, @ref{3c59,,get_flags()}.


Added in version 3.13.

@end deffn

@geindex add_flag() (mailbox.Maildir 메서드)
@anchor{library/mailbox mailbox Maildir add_flag}@anchor{1a48}
@deffn {메서드} add_flag (key, flag)

`key'에 해당하는 메시지에 대해, 다른 플래그를 변경하지 않고 `flag'로 지정된 플래그를 설정합니다. 한 번에 둘 이상의 플래그를 추가하기 위해, `flag'가 둘 이상의 문자로 구성된 문자열일 수 있습니다.

Considerations for using this method versus the message object’s
@ref{3c5b,,add_flag()} method are similar to
those for @ref{1a47,,set_flags()}; see the discussion there.


Added in version 3.13.

@end deffn

@geindex remove_flag() (mailbox.Maildir 메서드)
@anchor{library/mailbox mailbox Maildir remove_flag}@anchor{1a49}
@deffn {메서드} remove_flag (key, flag)

`key'에 해당하는 메시지에 대해, 다른 플래그를 변경하지 않고 `flag'에 의해 지정된 플래그를 설정 해제합니다. 한 번에 둘 이상의 플래그를 제거하기 위해, `flag'는 둘 이상의 문자로 구성된 문자열일 수 있습니다.

Considerations for using this method versus the message object’s
@ref{3c5c,,remove_flag()} method are similar to
those for @ref{1a47,,set_flags()}; see the discussion there.


Added in version 3.13.

@end deffn

@geindex get_info() (mailbox.Maildir 메서드)
@anchor{library/mailbox mailbox Maildir get_info}@anchor{1a44}
@deffn {메서드} get_info (key)

Return a string containing the info for the message
corresponding to `key'.
This is the same as @code{get_message(key).get_info()} but much
faster, because it does not open the message file.
Use this method when iterating over the keys to determine which
messages are interesting to get.

If you do have a @ref{3c50,,MaildirMessage} object, use
its @ref{3c5e,,get_info()} method instead, because
changes made by the message’s @ref{3c5f,,set_info()} method
are not reflected here until the mailbox’s @ref{3c5d,,__setitem__()} method
is called.


Added in version 3.13.

@end deffn

@geindex set_info() (mailbox.Maildir 메서드)
@anchor{library/mailbox mailbox Maildir set_info}@anchor{1a45}
@deffn {메서드} set_info (key, info)

Set the info of the message corresponding to `key' to `info'.
Calling @code{some_mailbox.set_info(key, flags)} is similar to

@example
one_message = some_mailbox.get_message(key)
one_message.set_info(info)
some_mailbox[key] = one_message
@end example

but faster, because it does not open the message file.

If you do have a @ref{3c50,,MaildirMessage} object, use
its @ref{3c5f,,set_info()} method instead, because
changes made with this mailbox method will not be visible to the
message object’s method, @ref{3c5e,,get_info()}.


Added in version 3.13.

@end deffn

@code{Maildir}에 의해 구현된 일부 @ref{1451,,Mailbox} 메서드는 특별한 주의가 필요합니다:

@geindex add() (mailbox.Maildir 메서드)
@geindex __setitem__() (mailbox.Maildir 메서드)
@geindex update() (mailbox.Maildir 메서드)
@anchor{library/mailbox mailbox Maildir add}@anchor{3c60}
@deffn {메서드} add (message)
@anchor{library/mailbox mailbox Maildir __setitem__}@anchor{3c5d}
@deffnx {메서드} __setitem__ (key, message)
@anchor{library/mailbox mailbox Maildir update}@anchor{3c61}
@deffnx {메서드} update (arg)

@cartouche
@quotation 경고 
이 메서드들은 현재 프로세스 ID를 기반으로 고유한 파일 이름을 생성합니다. 다중 스레드를 사용할 때, 이러한 메서드를 사용하여 같은 사서함을 동시에 조작하지 않도록 스레드를 조정하지 않으면 감지되지 않은 이름 충돌이 발생하여 사서함이 손상될 수 있습니다.
@end quotation
@end cartouche
@end deffn

@geindex flush() (mailbox.Maildir 메서드)
@anchor{library/mailbox mailbox Maildir flush}@anchor{3c62}
@deffn {메서드} flush ()

Maildir 사서함에 대한 모든 변경 사항은 즉시 적용되므로, 이 메서드는 아무 작업도 수행하지 않습니다.
@end deffn

@geindex lock() (mailbox.Maildir 메서드)
@geindex unlock() (mailbox.Maildir 메서드)
@anchor{library/mailbox mailbox Maildir lock}@anchor{3c63}
@deffn {메서드} lock ()
@anchor{library/mailbox mailbox Maildir unlock}@anchor{3c64}
@deffnx {메서드} unlock ()

Maildir 사서함은 잠금을 지원(또는 필요로)하지 않아서, 이 메서드들은 아무 작업도 수행하지 않습니다.
@end deffn

@geindex close() (mailbox.Maildir 메서드)
@anchor{library/mailbox mailbox Maildir close}@anchor{3c65}
@deffn {메서드} close ()

@code{Maildir} 인스턴스는 아무런 열린 파일도 유지하지 않으며 하부 사서함은 잠금을 지원하지 않아서, 이 메서드는 아무 작업도 수행하지 않습니다.
@end deffn

@geindex get_file() (mailbox.Maildir 메서드)
@anchor{library/mailbox mailbox Maildir get_file}@anchor{3c66}
@deffn {메서드} get_file (key)

호스트 플랫폼에 따라, 반환된 파일이 열려있는 동안 하부 메시지를 수정하거나 제거하지 못할 수 있습니다.
@end deffn
@end deffn


@subsubheading 더 보기



@table @asis

@item Courier의 maildir 매뉴얼 페이지@footnote{https://www.courier-mta.org/maildir.html}

형식의 명세. 지원 폴더에 대한 공통 확장을 설명합니다.

@item Using maildir format@footnote{https://cr.yp.to/proto/maildir.html}

발명가의 Maildir에 대한 노트. 개정된 이름 생성 체계와 “info” 의미론에 대한 세부 정보를 포함합니다.
@end table


@node mbox 객체,MH 객체,Maildir 객체,Mailbox 객체
@anchor{library/mailbox mailbox-mbox}@anchor{3c67}@anchor{library/mailbox mbox-objects}@anchor{3c68}
@subsubsection @code{mbox} 객체


@geindex mbox (mailbox 클래스)
@anchor{library/mailbox mailbox mbox}@anchor{19fb}
@deffn {클래스} mailbox.mbox (path, factory=None, create=True)

mbox 형식의 사서함에 대한 @ref{1451,,Mailbox}의 서브 클래스. 매개 변수 `factory'는 파일류 메시지 표현(바이너리 모드에서 열린 것처럼 동작합니다)을 받아들이고 사용자 정의 표현을 반환하는 콜러블 객체입니다. `factory'가 @code{None}이면, @ref{3af6,,mboxMessage}가 기본 메시지 표현으로 사용됩니다. `create'가 @code{True}이면, 사서함이 없으면 만들어집니다.

mbox 형식은 유닉스 시스템에서 메일을 저장하기 위한 고전적인 형식입니다. mbox 사서함의 모든 메시지는 처음 5개의 문자가 “From “인 줄로 표시되는 각 메시지의 시작 부분과 함께 단일 파일에 저장됩니다.

원래 형식에서 인식된 단점을 해결하기 위해 mbox 형식의 여러 변형이 존재합니다. 호환성을 위해, @code{mbox}는 `mboxo'라고도 하는 원래 형식을 구현합니다. 즉, @code{Content-Length} 헤더(있다면)는 무시되고 메시지 본문의 줄 시작 부분에 있는 “From “은 메시지를 저장할 때 “>From “으로 변환됩니다, 하지만 메시지를 읽을 때 “>From “은 “From “으로 변환되지 않습니다.

@code{mbox}에 의해 구현된 일부 @ref{1451,,Mailbox} 메서드는 특별한 주의가 필요합니다:

@geindex get_bytes() (mailbox.mbox 메서드)
@anchor{library/mailbox mailbox mbox get_bytes}@anchor{3c69}
@deffn {메서드} get_bytes (key, from_=False)

Note: This method has an extra parameter (`from_') compared with other classes.
The first line of an mbox file entry is the Unix “From “ line.
If `from_' is False, the first line of the file is dropped.
@end deffn

@geindex get_file() (mailbox.mbox 메서드)
@anchor{library/mailbox mailbox mbox get_file}@anchor{3c6a}
@deffn {메서드} get_file (key, from_=False)

@code{mbox} 인스턴스에서 @ref{19c1,,flush()}나 @ref{3c4d,,close()}를 호출한 후 파일을 사용하면 예기치 않은 결과가 발생하거나 예외가 발생할 수 있습니다.

Note: This method has an extra parameter (`from_') compared with other classes.
The first line of an mbox file entry is the Unix “From “ line.
If `from_' is False, the first line of the file is dropped.
@end deffn

@geindex get_string() (mailbox.mbox 메서드)
@anchor{library/mailbox mailbox mbox get_string}@anchor{3c6b}
@deffn {메서드} get_string (key, from_=False)

Note: This method has an extra parameter (`from_') compared with other classes.
The first line of an mbox file entry is the Unix “From “ line.
If `from_' is False, the first line of the file is dropped.
@end deffn

@geindex lock() (mailbox.mbox 메서드)
@geindex unlock() (mailbox.mbox 메서드)
@anchor{library/mailbox mailbox mbox lock}@anchor{3c6c}
@deffn {메서드} lock ()
@anchor{library/mailbox mailbox mbox unlock}@anchor{3c6d}
@deffnx {메서드} unlock ()

세 가지 잠금 메커니즘이 사용됩니다—점 잠금(dot locking)과, 사용할 수 있다면, @code{flock()}과 @code{lockf()} 시스템 호출.
@end deffn
@end deffn


@subsubheading 더 보기



@table @asis

@item tin의 mbox 매뉴얼 페이지@footnote{http://www.tin.org/bin/man.cgi?section=5&topic=mbox}

형식의 명세, 잠금에 대한 세부 정보가 있습니다.

@item 유닉스에서 Netscape Mail 구성하기: 왜 Content-Length 형식이 나쁜가@footnote{https://www.jwz.org/doc/content-length.html}

변형이 아닌 원래 mbox 형식을 사용하는 것에 대한 논의.

@item "mbox"는 서로 호환되지 않는 여러 사서함 형식의 집합입니다@footnote{https://www.loc.gov/preservation/digital/formats/fdd/fdd000383.shtml}

mbox 변형의 역사.
@end table


@node MH 객체,Babyl 객체,mbox 객체,Mailbox 객체
@anchor{library/mailbox mailbox-mh}@anchor{3c6e}@anchor{library/mailbox mh-objects}@anchor{3c6f}
@subsubsection @code{MH} 객체


@geindex MH (mailbox 클래스)
@anchor{library/mailbox mailbox MH}@anchor{1a2d}
@deffn {클래스} mailbox.MH (path, factory=None, create=True)

MH 형식의 사서함에 대한 @ref{1451,,Mailbox}의 서브 클래스. 매개 변수 `factory'는 파일류 메시지 표현(바이너리 모드에서 열린 것처럼 동작합니다)을 받아들이고 사용자 정의 표현을 반환하는 콜러블 객체입니다. `factory'가 @code{None}이면, @ref{3c70,,MHMessage}가 기본 메시지 표현으로 사용됩니다. `create'가 @code{True}이면, 사서함이 없으면 만들어집니다.

MH는 메일 사용자 에이전트인 MH 메시지 처리 시스템(MH Message Handling System)을 위해 개발된 디렉터리 기반 사서함 형식입니다. MH 사서함의 각 메시지는 각자의 파일에 있습니다. MH 사서함에는 메시지 외에 다른 MH 사서함(`폴더(folders)'라고 합니다)이 포함될 수 있습니다. 폴더는 무제한 중첩될 수 있습니다. MH 사서함은 또한 메시지를 서브 폴더로 이동하지 않고 논리적으로 그룹화하는 데 사용되는 명명된 목록인 `시퀀스(sequences)'를 지원합니다. 시퀀스는 각 폴더의 @code{.mh_sequences}라는 파일에 정의됩니다.

@code{MH} 클래스는 MH 사서함을 조작하지만, @code{mh}의 모든 동작을 모사하려고 시도하지는 않습니다. 특히, @code{mh}가 상태와 구성을 저장하는 데 사용하는 @code{context}나 @code{.mh_profile} 파일을 수정하지 않고 영향받지 않습니다.

@code{MH} 인스턴스에는 @ref{1451,,Mailbox}의 모든 메서드 외에도 다음 메서드가 있습니다:


버전 3.13에서 변경: Supported folders that don’t contain a @code{.mh_sequences} file.


@geindex list_folders() (mailbox.MH 메서드)
@anchor{library/mailbox mailbox MH list_folders}@anchor{3c71}
@deffn {메서드} list_folders ()

모든 폴더의 이름 리스트를 반환합니다.
@end deffn

@geindex get_folder() (mailbox.MH 메서드)
@anchor{library/mailbox mailbox MH get_folder}@anchor{3c72}
@deffn {메서드} get_folder (folder)

이름이 `folder'인 폴더를 나타내는 @code{MH} 인스턴스를 반환합니다. 폴더가 없으면 @ref{3c54,,NoSuchMailboxError} 예외가 발생합니다.
@end deffn

@geindex add_folder() (mailbox.MH 메서드)
@anchor{library/mailbox mailbox MH add_folder}@anchor{3c73}
@deffn {메서드} add_folder (folder)

이름이 `folder'인 폴더를 만들고 이를 나타내는 @code{MH} 인스턴스를 반환합니다.
@end deffn

@geindex remove_folder() (mailbox.MH 메서드)
@anchor{library/mailbox mailbox MH remove_folder}@anchor{3c74}
@deffn {메서드} remove_folder (folder)

이름이 `folder'인 폴더를 삭제합니다. 폴더에 메시지가 포함되었으면, @ref{3c57,,NotEmptyError} 예외가 발생하고 폴더가 삭제되지 않습니다.
@end deffn

@geindex get_sequences() (mailbox.MH 메서드)
@anchor{library/mailbox mailbox MH get_sequences}@anchor{3c75}
@deffn {메서드} get_sequences ()

키 리스트에 매핑된 시퀀스 이름의 딕셔너리를 반환합니다. 시퀀스가 없으면, 빈 딕셔너리가 반환됩니다.
@end deffn

@geindex set_sequences() (mailbox.MH 메서드)
@anchor{library/mailbox mailbox MH set_sequences}@anchor{3c76}
@deffn {메서드} set_sequences (sequences)

@ref{3c75,,get_sequences()}에서 반환하는 것과 같이, 키 리스트에 매핑된 이름의 딕셔너리인, `sequences'를 기반으로 사서함에 존재하는 시퀀스를 다시 정의합니다.
@end deffn

@geindex pack() (mailbox.MH 메서드)
@anchor{library/mailbox mailbox MH pack}@anchor{3c77}
@deffn {메서드} pack ()

번호 매기기의 간격을 없애기 위해 필요에 따라 사서함의 메시지 이름을 변경합니다. 시퀀스 리스트의 항목이 그에 따라 갱신됩니다.

@cartouche
@quotation 참고 
이미 발급된 키는 이 작업에 의해 무효가 되며 이후에 사용해서는 안 됩니다.
@end quotation
@end cartouche
@end deffn

@code{MH}에 의해 구현된 일부 @ref{1451,,Mailbox} 메서드는 특별한 주의가 필요합니다:

@geindex remove() (mailbox.MH 메서드)
@geindex __delitem__() (mailbox.MH 메서드)
@geindex discard() (mailbox.MH 메서드)
@anchor{library/mailbox mailbox MH remove}@anchor{3c78}
@deffn {메서드} remove (key)
@anchor{library/mailbox mailbox MH __delitem__}@anchor{3c79}
@deffnx {메서드} __delitem__ (key)
@anchor{library/mailbox mailbox MH discard}@anchor{3c7a}
@deffnx {메서드} discard (key)

이 메서드들은 메시지를 즉시 삭제합니다. 이름 앞에 쉼표를 추가하여 메시지를 삭제하도록 표시하는 MH 규칙은 사용되지 않습니다.
@end deffn

@geindex lock() (mailbox.MH 메서드)
@geindex unlock() (mailbox.MH 메서드)
@anchor{library/mailbox mailbox MH lock}@anchor{3c7b}
@deffn {메서드} lock ()
@anchor{library/mailbox mailbox MH unlock}@anchor{3c7c}
@deffnx {메서드} unlock ()

세 가지 잠금 메커니즘이 사용됩니다—점 잠금(dot locking)과, 사용할 수 있다면, @code{flock()}과 @code{lockf()} 시스템 호출. MH 사서함의 경우, 사서함을 잠그는 것은 @code{.mh_sequences} 파일을 잠그는 것을 의미하며, 해당 파일에 영향을 주는 작업 기간에만 개별 메시지 파일을 잠급니다.
@end deffn

@geindex get_file() (mailbox.MH 메서드)
@anchor{library/mailbox mailbox MH get_file}@anchor{3c7d}
@deffn {메서드} get_file (key)

호스트 플랫폼에 따라, 반환된 파일이 열려있는 동안 하부 메시지를 제거하지 못할 수도 있습니다.
@end deffn

@geindex flush() (mailbox.MH 메서드)
@anchor{library/mailbox mailbox MH flush}@anchor{3c7e}
@deffn {메서드} flush ()

MH 사서함에 대한 모든 변경 사항이 즉시 적용되므로, 이 메서드는 아무 작업도 수행하지 않습니다.
@end deffn

@geindex close() (mailbox.MH 메서드)
@anchor{library/mailbox mailbox MH close}@anchor{3c7f}
@deffn {메서드} close ()

@code{MH} 인스턴스는 열린 파일을 유지하지 않아서, 이 메서드는 @ref{3c7c,,unlock()}과 동등합니다.
@end deffn
@end deffn


@subsubheading 더 보기



@table @asis

@item nmh - 메시지 처리 시스템@footnote{https://www.nongnu.org/nmh/}

@code{nmh}의 홈페이지, 원래 @code{mh}의 갱신된 버전.

@item MH & nmh: 사용자와 프로그래머를 위한 이메일@footnote{https://rand-mh.sourceforge.io/book/}

@code{mh}와 @code{nmh}에 대한 GPL 라이선스 책, 사서함 형식에 대한 정보가 있습니다.
@end table


@node Babyl 객체,MMDF 객체,MH 객체,Mailbox 객체
@anchor{library/mailbox babyl-objects}@anchor{3c80}@anchor{library/mailbox mailbox-babyl}@anchor{3c81}
@subsubsection @code{Babyl} 객체


@geindex Babyl (mailbox 클래스)
@anchor{library/mailbox mailbox Babyl}@anchor{3c82}
@deffn {클래스} mailbox.Babyl (path, factory=None, create=True)

Babyl 형식의 사서함에 대한 @ref{1451,,Mailbox}의 서브 클래스. 매개 변수 `factory'는 파일류 메시지 표현(바이너리 모드에서 열린 것처럼 동작합니다)을 받아들이고 사용자 정의 표현을 반환하는 콜러블 객체입니다. `factory'가 @code{None}이면, @ref{3c83,,BabylMessage}가 기본 메시지 표현으로 사용됩니다. `create'가 @code{True}이면, 사서함이 없으면 만들어집니다.

Babyl은 Emacs에 포함된 Rmail 메일 사용자 에이전트에서 사용하는 단일 파일 사서함 형식입니다. 메시지의 시작 부분은 Control-Underscore(@code{'\037'})와 Control-L(@code{'\014'}) 두 문자가 포함된 줄로 표시됩니다. 메시지의 끝은 다음 메시지의 시작이나, 마지막 메시지의 경우 Control-Underscore(@code{'\037'}) 문자가 포함된 줄로 표시됩니다.

Babyl 사서함의 메시지는 두 집합의 헤더가 있습니다, 원래 헤더와 소위 가시적(visible) 헤더가 있습니다. 가시적 헤더는 일반적으로 더 매력적으로 다시 포맷되거나 요약된 원래 헤더의 부분 집합입니다. Babyl 사서함의 각 메시지에는 `레이블(labels)' 리스트, 또는 메시지에 대한 추가 정보를 기록하는 짧은 문자열이 있으며, 사서함에 있는 모든 사용자 정의 레이블 목록은 Babyl 옵션 섹션에 보관됩니다.

@code{Babyl} 인스턴스에는 @ref{1451,,Mailbox}의 모든 메서드 외에도 다음과 같은 메서드가 있습니다:

@geindex get_labels() (mailbox.Babyl 메서드)
@anchor{library/mailbox mailbox Babyl get_labels}@anchor{3c84}
@deffn {메서드} get_labels ()

사서함에 사용된 모든 사용자 정의 레이블의 이름 리스트를 반환합니다.

@cartouche
@quotation 참고 
Babyl 옵션 섹션의 레이블 목록을 참조하지 않고 사서함에 있는 레이블을 확인하기 위해 실제 메시지를 검사하지만, 사서함이 수정될 때마다 Babyl 섹션이 갱신됩니다.
@end quotation
@end cartouche
@end deffn

@code{Babyl}에 의해 구현된 일부 @ref{1451,,Mailbox} 메서드는 특별한 주의가 필요합니다:

@geindex get_file() (mailbox.Babyl 메서드)
@anchor{library/mailbox mailbox Babyl get_file}@anchor{3c85}
@deffn {메서드} get_file (key)

Babyl 사서함에서, 메시지 헤더는 메시지 본문과 연속적으로 저장되지 않습니다. 파일류 표현을 생성하기 위해, 헤더와 본문이 파일과 동일한 API를 가진 @ref{10a3,,io.BytesIO} 인스턴스에 함께 복사됩니다. 결과적으로, 파일류 객체는 하부 사서함과는 진짜로 독립적이지만 문자열 표현보다 메모리를 절약하지 않습니다.
@end deffn

@geindex lock() (mailbox.Babyl 메서드)
@geindex unlock() (mailbox.Babyl 메서드)
@anchor{library/mailbox mailbox Babyl lock}@anchor{3c86}
@deffn {메서드} lock ()
@anchor{library/mailbox mailbox Babyl unlock}@anchor{3c87}
@deffnx {메서드} unlock ()

세 가지 잠금 메커니즘이 사용됩니다—점 잠금(dot locking)과, 사용할 수 있다면, @code{flock()}과 @code{lockf()} 시스템 호출.
@end deffn
@end deffn


@subsubheading 더 보기



@table @asis

@item Format of Version 5 Babyl Files@footnote{https://quimby.gnus.org/notes/BABYL}

Babyl 형식의 명세.

@item Rmail로 메일 읽기@footnote{https://www.gnu.org/software/emacs/manual/html_node/emacs/Rmail.html}

Rmail 매뉴얼, Babyl 의미론에 대한 정보가 있습니다.
@end table


@node MMDF 객체,,Babyl 객체,Mailbox 객체
@anchor{library/mailbox mailbox-mmdf}@anchor{3c88}@anchor{library/mailbox mmdf-objects}@anchor{3c89}
@subsubsection @code{MMDF} 객체


@geindex MMDF (mailbox 클래스)
@anchor{library/mailbox mailbox MMDF}@anchor{19fc}
@deffn {클래스} mailbox.MMDF (path, factory=None, create=True)

MMDF 형식의 사서함에 대한 @ref{1451,,Mailbox}의 서브 클래스. 매개 변수 `factory'는 파일류 메시지 표현(바이너리 모드에서 열린 것처럼 동작합니다)을 받아들이고 사용자 정의 표현을 반환하는 콜러블 객체입니다. `factory'가 @code{None}이면, @ref{3c8a,,MMDFMessage}가 기본 메시지 표현으로 사용됩니다. `create'가 @code{True}이면, 사서함이 없으면 만들어집니다.

MMDF는 메일 전송 에이전트인 Multichannel Memorandum Distribution Facility를 위해 개발된 단일 파일 사서함 형식입니다. 각 메시지는 mbox 메시지와 같은 형식이지만 4개의 Control-A (@code{'\001'}) 문자를 포함하는 줄로 앞뒤로 둘러쌉니다. mbox 형식과 마찬가지로, 각 메시지의 시작 부분은 처음 5개의 문자가 “From “인 줄로 표시되지만, 메시지를 저장할 때 추가로 등장하는 “From “을 “>From “으로 변환하지 않습니다, 메시지를 구분하는 추가적인 줄로 인해 후속 메시지의 시작으로 착각할 우려가 없기 때문입니다.

@code{MMDF}에 의해 구현된 일부 @ref{1451,,Mailbox} 메서드는 특별한 주의가 필요합니다:

@geindex get_bytes() (mailbox.MMDF 메서드)
@anchor{library/mailbox mailbox MMDF get_bytes}@anchor{3c8b}
@deffn {메서드} get_bytes (key, from_=False)

Note: This method has an extra parameter (`from_') compared with other classes.
The first line of an mbox file entry is the Unix “From “ line.
If `from_' is False, the first line of the file is dropped.
@end deffn

@geindex get_file() (mailbox.MMDF 메서드)
@anchor{library/mailbox mailbox MMDF get_file}@anchor{3c8c}
@deffn {메서드} get_file (key, from_=False)

@code{MMDF} 인스턴스에서 @ref{19c1,,flush()}나 @ref{3c4d,,close()}를 호출한 후 파일을 사용하면 예기치 않은 결과가 발생하거나 예외가 발생할 수 있습니다.

Note: This method has an extra parameter (`from_') compared with other classes.
The first line of an mbox file entry is the Unix “From “ line.
If `from_' is False, the first line of the file is dropped.
@end deffn

@geindex lock() (mailbox.MMDF 메서드)
@geindex unlock() (mailbox.MMDF 메서드)
@anchor{library/mailbox mailbox MMDF lock}@anchor{3c8d}
@deffn {메서드} lock ()
@anchor{library/mailbox mailbox MMDF unlock}@anchor{3c8e}
@deffnx {메서드} unlock ()

세 가지 잠금 메커니즘이 사용됩니다—점 잠금(dot locking)과, 사용할 수 있다면, @code{flock()}과 @code{lockf()} 시스템 호출.
@end deffn
@end deffn


@subsubheading 더 보기



@table @asis

@item tin의 mmdf 매뉴얼 페이지@footnote{http://www.tin.org/bin/man.cgi?section=5&topic=mmdf}

뉴스 리더인 tin의 설명서에 있는 MMDF 형식의 명세.

@item MMDF@footnote{https://en.wikipedia.org/wiki/MMDF}

Multichannel Memorandum Distribution Facility를 설명하는 위키피디아 기사.
@end table


@node Message 객체,예외<15>,Mailbox 객체,mailbox — 다양한 형식의 사서함 조작하기
@anchor{library/mailbox mailbox-message-objects}@anchor{3c8f}@anchor{library/mailbox message-objects}@anchor{3c90}
@subsubsection @code{Message} 객체


@geindex Message (mailbox 클래스)
@anchor{library/mailbox mailbox Message}@anchor{1455}
@deffn {클래스} mailbox.Message (message=None)

@ref{48,,email.message} 모듈 @ref{580,,Message}의 서브 클래스. @code{mailbox.Message}의 서브 클래스는 사서함 형식별 상태와 동작을 추가합니다.

If `message' is omitted, the new instance is created in a default, empty state.
If `message' is an @ref{580,,email.message.Message} instance, its contents are
copied; furthermore, any format-specific information is converted insofar as
possible if `message' is a @code{Message} instance. If `message' is a string,
a byte string,
or a file, it should contain an 
@geindex RFC; RFC 5322
RFC 5322@footnote{https://datatracker.ietf.org/doc/html/rfc5322.html}-compliant message, which is read
and parsed.  Files should be open in binary mode, but text mode files
are accepted for backward compatibility.

서브 클래스에서 제공하는 형식별 상태와 동작은 다양하지만, 일반적으로 지원되는 특정 사서함에만 고유하지는 않은 속성입니다 (아마도 속성은 특정 사서함 형식에 고유합니다). 예를 들어, 단일 파일 사서함 형식에 대한 파일 오프셋과 디렉터리 기반 사서함 형식에 대한 파일 이름은 유지되지 않는데, 원래 사서함에만 적용되기 때문입니다. 그러나 사용자가 메시지를 읽었는지나 중요하다고 표시되었는지와 같은 상태는 메시지 자체에 적용되므로 유지됩니다.

@ref{1451,,Mailbox} 인스턴스를 사용하여 꺼낸 메시지를 나타내는 데 @code{Message} 인스턴스를 사용할 필요는 없습니다. 때에 따라, @code{Message} 표현을 생성하는 데 필요한 시간과 메모리가 허용되지 않을 수 있습니다. 이러한 상황에서, @code{Mailbox} 인스턴스는 문자열과 파일류 표현도 제공하며, @code{Mailbox} 인스턴스가 초기화될 때 사용자 정의 메시지 팩토리를 지정할 수 있습니다.
@end deffn

@menu
* MaildirMessage 객체:: 
* mboxMessage 객체:: 
* MHMessage 객체:: 
* BabylMessage 객체:: 
* MMDFMessage 객체:: 

@end menu

@node MaildirMessage 객체,mboxMessage 객체,,Message 객체
@anchor{library/mailbox mailbox-maildirmessage}@anchor{3c91}@anchor{library/mailbox maildirmessage-objects}@anchor{3c92}
@subsubsection @code{MaildirMessage} 객체


@geindex MaildirMessage (mailbox 클래스)
@anchor{library/mailbox mailbox MaildirMessage}@anchor{3c50}
@deffn {클래스} mailbox.MaildirMessage (message=None)

Maildir 특정 동작을 갖는 메시지. 매개 변수 `message'는 @ref{1455,,Message} 생성자와 같은 의미입니다.

일반적으로, 메일 사용자 에이전트 응용 프로그램은 사용자가 사서함을 처음 열고 닫은 후 @code{new} 하위 디렉터리의 모든 메시지를 @code{cur} 하위 디렉터리로 이동하여, 메시지가 실제로 읽혔는지에 관계없이 오래되었음을 기록합니다. @code{cur}의 각 메시지에는 상태에 대한 정보를 저장하기 위해 파일 이름에 추가된 “info” 섹션이 있습니다. (일부 메일 리더는 @code{new}의 메시지에 “info” 섹션을 추가할 수도 있습니다.) “info” 섹션은 두 가지 형식 중 하나를 취할 수 있습니다: “2,”와 그 뒤로 표준화된 플래그 목록이 오거나 (예를 들어, “2,FR”), “1,”과 그 뒤로 소위 실험적 정보를 포함할 수 있습니다. Maildir 메시지의 표준 플래그는 다음과 같습니다:


@multitable {xxxxxxxx} {xxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

플래그

@tab

의미

@tab

설명

@item

D

@tab

초안

@tab

작성 중

@item

F

@tab

깃발 표시

@tab

중요하다고 표시됨

@item

P

@tab

전달됨

@tab

전달, 재전송 또는 반송됨

@item

R

@tab

답장함

@tab

답장함

@item

S

@tab

보았음

@tab

읽었음

@item

T

@tab

휴지통

@tab

후에 삭제하기 위해 표시함

@end multitable


@code{MaildirMessage} 인스턴스는 다음 메서드를 제공합니다:

@geindex get_subdir() (mailbox.MaildirMessage 메서드)
@anchor{library/mailbox mailbox MaildirMessage get_subdir}@anchor{3c93}
@deffn {메서드} get_subdir ()

“new”(메시지가 @code{new} 하위 디렉터리에 저장되어야 하면)나 “cur”(메시지가 @code{cur} 하위 디렉터리에 저장되어야 하면)를 반환합니다.

@cartouche
@quotation 참고 
메시지를 읽었는지에 관계없이, 일반적으로 사서함에 액세스한 후 메시지는 @code{new}에서 @code{cur}로 이동됩니다. @code{"S" in msg.get_flags()}가 @code{True}이면 메시지 @code{msg}를 읽은 것입니다.
@end quotation
@end cartouche
@end deffn

@geindex set_subdir() (mailbox.MaildirMessage 메서드)
@anchor{library/mailbox mailbox MaildirMessage set_subdir}@anchor{3c94}
@deffn {메서드} set_subdir (subdir)

메시지를 저장할 하위 디렉터리를 설정합니다. 매개 변수 `subdir'은 “new”나 “cur”여야 합니다.
@end deffn

@geindex get_flags() (mailbox.MaildirMessage 메서드)
@anchor{library/mailbox mailbox MaildirMessage get_flags}@anchor{3c59}
@deffn {메서드} get_flags ()

현재 설정된 플래그를 지정하는 문자열을 반환합니다. 메시지가 표준 Maildir 형식을 준수하면, 결과는 @code{'D'}, @code{'F'}, @code{'P'}, @code{'R'}, @code{'S'} 및 @code{'T'}의 각 항목이  알파벳 순서로 0이나 1개 등장하는 이어붙이기입니다. 플래그가 설정되지 않았거나 “info”에 실험적 의미가 포함되어 있으면 빈 문자열이 반환됩니다.
@end deffn

@geindex set_flags() (mailbox.MaildirMessage 메서드)
@anchor{library/mailbox mailbox MaildirMessage set_flags}@anchor{3c5a}
@deffn {메서드} set_flags (flags)

`flags'로 지정된 플래그를 설정하고 다른 모든 플래그를 설정 해제합니다.
@end deffn

@geindex add_flag() (mailbox.MaildirMessage 메서드)
@anchor{library/mailbox mailbox MaildirMessage add_flag}@anchor{3c5b}
@deffn {메서드} add_flag (flag)

다른 플래그를 변경하지 않고 `flag'로 지정된 플래그를 설정합니다. 한 번에 둘 이상의 플래그를 추가하기 위해, `flag'가 둘 이상의 문자로 구성된 문자열일 수 있습니다. 플래그 대신 실험적 정보를 포함하는지와 관계없이 현재 “info”를 덮어씁니다.
@end deffn

@geindex remove_flag() (mailbox.MaildirMessage 메서드)
@anchor{library/mailbox mailbox MaildirMessage remove_flag}@anchor{3c5c}
@deffn {메서드} remove_flag (flag)

Unset the flag(s) specified by `flag' without changing other flags. To
remove more than one flag at a time, `flag' may be a string of more than
one character.  If “info” contains experimental information rather than
flags, the current “info” is not modified.
@end deffn

@geindex get_date() (mailbox.MaildirMessage 메서드)
@anchor{library/mailbox mailbox MaildirMessage get_date}@anchor{3c95}
@deffn {메서드} get_date ()

메시지의 배달 날짜를 에포크(Epoch) 이후 초를 나타내는 부동 소수점 숫자로 반환합니다.
@end deffn

@geindex set_date() (mailbox.MaildirMessage 메서드)
@anchor{library/mailbox mailbox MaildirMessage set_date}@anchor{3c96}
@deffn {메서드} set_date (date)

메시지의 배달 날짜를 `date'로 설정합니다. 이는 에포크(Epoch) 이후 초를 나타내는 부동 소수점 숫자입니다.
@end deffn

@geindex get_info() (mailbox.MaildirMessage 메서드)
@anchor{library/mailbox mailbox MaildirMessage get_info}@anchor{3c5e}
@deffn {메서드} get_info ()

메시지에 대한 “info”를 포함하는 문자열을 반환합니다. 이것은 실험적인 (즉, 플래그 목록이 아닌) “info”를 액세스하고 수정하는 데 유용합니다.
@end deffn

@geindex set_info() (mailbox.MaildirMessage 메서드)
@anchor{library/mailbox mailbox MaildirMessage set_info}@anchor{3c5f}
@deffn {메서드} set_info (info)

“info”를 문자열이어야 하는 `info'로 설정합니다.
@end deffn
@end deffn

@ref{3af6,,mboxMessage}나 @ref{3c8a,,MMDFMessage} 인스턴스를 기반으로 @code{MaildirMessage} 인스턴스가 만들어질 때, @code{Status}와 @code{X-Status} 헤더가 생략되고 다음 변환이 발생합니다:


@multitable {xxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

결과 상태

@tab

@ref{3af6,,mboxMessage}나 @ref{3c8a,,MMDFMessage} 상태

@item

“cur” 하위 디렉터리

@tab

O 플래그

@item

F 플래그

@tab

F 플래그

@item

R 플래그

@tab

A 플래그

@item

S 플래그

@tab

R 플래그

@item

T 플래그

@tab

D 플래그

@end multitable


@ref{3c70,,MHMessage} 인스턴스를 기반으로 @code{MaildirMessage} 인스턴스가 만들어지면, 다음 변환이 발생합니다:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

결과 상태

@tab

@ref{3c70,,MHMessage} 상태

@item

“cur” 하위 디렉터리

@tab

“unseen” 시퀀스

@item

“cur” 하위 디렉터리와 S 플래그

@tab

“unseen” 시퀀스 없음

@item

F 플래그

@tab

“flagged” 시퀀스

@item

R 플래그

@tab

“replied” 시퀀스

@end multitable


@ref{3c83,,BabylMessage} 인스턴스를 기반으로 @code{MaildirMessage} 인스턴스가 만들어지면 다음 변환이 발생합니다:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

결과 상태

@tab

@ref{3c83,,BabylMessage} 상태

@item

“cur” 하위 디렉터리

@tab

“unseen” 레이블

@item

“cur” 하위 디렉터리와 S 플래그

@tab

“unseen” 레이블 없음

@item

P 플래그

@tab

“forwarded”나 “resent” 레이블

@item

R 플래그

@tab

“answered” 레이블

@item

T 플래그

@tab

“deleted” 레이블

@end multitable


@node mboxMessage 객체,MHMessage 객체,MaildirMessage 객체,Message 객체
@anchor{library/mailbox mailbox-mboxmessage}@anchor{3c97}@anchor{library/mailbox mboxmessage-objects}@anchor{3c98}
@subsubsection @code{mboxMessage} 객체


@geindex mboxMessage (mailbox 클래스)
@anchor{library/mailbox mailbox mboxMessage}@anchor{3af6}
@deffn {클래스} mailbox.mboxMessage (message=None)

mbox 특정 동작을 갖는 메시지. 매개 변수 `message'는 @ref{1455,,Message} 생성자와 같은 의미입니다.

mbox 사서함의 메시지는 단일 파일에 함께 저장됩니다. 보낸 사람의 봉투 주소(envelope address)와 배달 시간은 일반적으로 메시지의 시작을 나타내는 데 사용되는 “From “으로 시작하는 줄에 저장되지만, mbox 구현 간에 이 데이터의 정확한 형식에는 상당한 차이가 있습니다. 읽었는지나 중요하다고 표시되었는지와 같은 메시지 상태를 나타내는 플래그는 일반적으로 @code{Status}와 @code{X-Status} 헤더에 저장됩니다.

mbox 메시지의 전통적인 플래그는 다음과 같습니다:


@multitable {xxxxxxxx} {xxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

플래그

@tab

의미

@tab

설명

@item

R

@tab

읽었음

@tab

읽었음

@item

O

@tab

오래되었음

@tab

전에 MUA에서 감지됨

@item

D

@tab

삭제됨

@tab

후에 삭제하기 위해 표시함

@item

F

@tab

깃발 표시

@tab

중요하다고 표시됨

@item

A

@tab

답변함

@tab

답장함

@end multitable


“R”과 “O” 플래그는 @code{Status} 헤더에 저장되고, “D”, “F” 및 “A” 플래그는 @code{X-Status} 헤더에 저장됩니다. 플래그와 헤더는 일반적으로 언급된 순서대로 나타납니다.

@code{mboxMessage} 인스턴스는 다음 메서드를 제공합니다:

@geindex get_from() (mailbox.mboxMessage 메서드)
@anchor{library/mailbox mailbox mboxMessage get_from}@anchor{3c99}
@deffn {메서드} get_from ()

mbox 사서함에서 메시지의 시작을 표시하는 “From “ 줄을 나타내는 문자열을 반환합니다. 선행 “From “과 후행 줄넘김은 제외됩니다.
@end deffn

@geindex set_from() (mailbox.mboxMessage 메서드)
@anchor{library/mailbox mailbox mboxMessage set_from}@anchor{3c9a}
@deffn {메서드} set_from (from_, time_=None)

“From “ 줄을 `from_'으로 설정합니다. `from_'은 선행 “From “이나 후행 줄넘김 없이 지정되어야 합니다. 편의를 위해, `time_'을 지정할 수 있으며 적절하게 포맷해서 `from_'에 추가합니다. `time_'이 지정되면, @ref{ee5,,time.struct_time} 인스턴스, @ref{13ee,,time.strftime()}로 전달하기에 적합한 튜플 또는 @code{True}(@ref{13c5,,time.gmtime()} 사용)여야 합니다.
@end deffn

@geindex get_flags() (mailbox.mboxMessage 메서드)
@anchor{library/mailbox mailbox mboxMessage get_flags}@anchor{3c9b}
@deffn {메서드} get_flags ()

현재 설정된 플래그를 지정하는 문자열을 반환합니다. 메시지가 전통적인 형식을 준수하면, 결과는 @code{'R'}, @code{'O'}, @code{'D'}, @code{'F'} 및 @code{'A'} 각각이 이 순서로 0이나 1회 등장하도록 이어붙인 것입니다.
@end deffn

@geindex set_flags() (mailbox.mboxMessage 메서드)
@anchor{library/mailbox mailbox mboxMessage set_flags}@anchor{3c9c}
@deffn {메서드} set_flags (flags)

`flags'에서 지정한 플래그를 설정하고 다른 모든 플래그를 설정 해제합니다. 매개 변수 `flags'는 @code{'R'}, @code{'O'}, @code{'D'}, @code{'F'} 및 @code{'A'} 각각이 0개 이상 등장하도록 임의의 순서로 이어붙인 것이어야 합니다.
@end deffn

@geindex add_flag() (mailbox.mboxMessage 메서드)
@anchor{library/mailbox mailbox mboxMessage add_flag}@anchor{3c9d}
@deffn {메서드} add_flag (flag)

다른 플래그를 변경하지 않고 `flag'로 지정된 플래그를 설정합니다. 한 번에 둘 이상의 플래그를 추가하기 위해, `flag'가 둘 이상의 문자로 구성된 문자열일 수 있습니다.
@end deffn

@geindex remove_flag() (mailbox.mboxMessage 메서드)
@anchor{library/mailbox mailbox mboxMessage remove_flag}@anchor{3c9e}
@deffn {메서드} remove_flag (flag)

Unset the flag(s) specified by `flag' without changing other flags. To
remove more than one flag at a time, `flag' may be a string of more than
one character.
@end deffn
@end deffn

@ref{3c50,,MaildirMessage} 인스턴스를 기반으로 @code{mboxMessage} 인스턴스가 만들어지면, @code{MaildirMessage} 인스턴스의 배달 날짜를 기반으로 “From “ 줄이 생성되고, 다음과 같은 변환이 발생합니다:


@multitable {xxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

결과 상태

@tab

@ref{3c50,,MaildirMessage} 상태

@item

R 플래그

@tab

S 플래그

@item

O 플래그

@tab

“cur” 하위 디렉터리

@item

D 플래그

@tab

T 플래그

@item

F 플래그

@tab

F 플래그

@item

A 플래그

@tab

R 플래그

@end multitable


@ref{3c70,,MHMessage} 인스턴스를 기반으로 @code{mboxMessage} 인스턴스가 만들어지면, 다음과 같은 변환이 발생합니다:


@multitable {xxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

결과 상태

@tab

@ref{3c70,,MHMessage} 상태

@item

R 플래그와 O 플래그

@tab

“unseen” 시퀀스 없음

@item

O 플래그

@tab

“unseen” 시퀀스

@item

F 플래그

@tab

“flagged” 시퀀스

@item

A 플래그

@tab

“replied” 시퀀스

@end multitable


@ref{3c83,,BabylMessage} 인스턴스를 기반으로 @code{mboxMessage} 인스턴스가 만들어지면, 다음과 같은 변환이 발생합니다:


@multitable {xxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

결과 상태

@tab

@ref{3c83,,BabylMessage} 상태

@item

R 플래그와 O 플래그

@tab

“unseen” 레이블 없음

@item

O 플래그

@tab

“unseen” 레이블

@item

D 플래그

@tab

“deleted” 레이블

@item

A 플래그

@tab

“answered” 레이블

@end multitable


@ref{3c8a,,MMDFMessage} 인스턴스를 기반으로 @code{mboxMessage} 인스턴스가 만들어지면, “From “ 줄이 복사되고 모든 플래그가 직접 대응됩니다:


@multitable {xxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

결과 상태

@tab

@ref{3c8a,,MMDFMessage} 상태

@item

R 플래그

@tab

R 플래그

@item

O 플래그

@tab

O 플래그

@item

D 플래그

@tab

D 플래그

@item

F 플래그

@tab

F 플래그

@item

A 플래그

@tab

A 플래그

@end multitable


@node MHMessage 객체,BabylMessage 객체,mboxMessage 객체,Message 객체
@anchor{library/mailbox mailbox-mhmessage}@anchor{3c9f}@anchor{library/mailbox mhmessage-objects}@anchor{3ca0}
@subsubsection @code{MHMessage} 객체


@geindex MHMessage (mailbox 클래스)
@anchor{library/mailbox mailbox MHMessage}@anchor{3c70}
@deffn {클래스} mailbox.MHMessage (message=None)

MH 특정 동작을 갖는 메시지. 매개 변수 `message'는 @ref{1455,,Message} 생성자와 같은 의미입니다.

MH 메시지는 전통적인 의미에서 마크나 플래그를 지원하지 않지만, 임의 메시지의 논리적 그룹인 시퀀스를 지원합니다. 일부 메일 읽기 프로그램(표준 @code{mh}와 @code{nmh}는 아니지만)은 다음과 같이 다른 형식에서 플래그를 사용하는 것과 거의 같은 방식으로 시퀀스를 사용합니다:


@multitable {xxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

시퀀스

@tab

설명

@item

unseen

@tab

읽지 않았지만, 이전에 MUA에서 감지했습니다.

@item

replied

@tab

답장함

@item

flagged

@tab

중요하다고 표시됨

@end multitable


@code{MHMessage} 인스턴스는 다음 메서드를 제공합니다:

@geindex get_sequences() (mailbox.MHMessage 메서드)
@anchor{library/mailbox mailbox MHMessage get_sequences}@anchor{3ca1}
@deffn {메서드} get_sequences ()

이 메시지를 포함하는 시퀀스의 이름 리스트를 반환합니다.
@end deffn

@geindex set_sequences() (mailbox.MHMessage 메서드)
@anchor{library/mailbox mailbox MHMessage set_sequences}@anchor{3ca2}
@deffn {메서드} set_sequences (sequences)

이 메시지를 포함하는 시퀀스의 리스트를 설정합니다.
@end deffn

@geindex add_sequence() (mailbox.MHMessage 메서드)
@anchor{library/mailbox mailbox MHMessage add_sequence}@anchor{3ca3}
@deffn {메서드} add_sequence (sequence)

이 메시지를 포함하는 시퀀스의 리스트에 `sequence'를 추가합니다.
@end deffn

@geindex remove_sequence() (mailbox.MHMessage 메서드)
@anchor{library/mailbox mailbox MHMessage remove_sequence}@anchor{3ca4}
@deffn {메서드} remove_sequence (sequence)

이 메시지를 포함하는 시퀀스의 리스트에서 `sequence'를 제거합니다.
@end deffn
@end deffn

@ref{3c50,,MaildirMessage} 인스턴스를 기반으로 @code{MHMessage} 인스턴스가 만들어지면, 다음과 같은 변환이 발생합니다:


@multitable {xxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

결과 상태

@tab

@ref{3c50,,MaildirMessage} 상태

@item

“unseen” 시퀀스

@tab

S 플래그 없음

@item

“replied” 시퀀스

@tab

R 플래그

@item

“flagged” 시퀀스

@tab

F 플래그

@end multitable


@ref{3af6,,mboxMessage}나 @ref{3c8a,,MMDFMessage} 인스턴스를 기반으로 @code{MHMessage} 인스턴스가 만들어지면, @code{Status}와 @code{X-Status} 헤더가 생략되고 다음과 같은 변환이 발생합니다:


@multitable {xxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

결과 상태

@tab

@ref{3af6,,mboxMessage}나 @ref{3c8a,,MMDFMessage} 상태

@item

“unseen” 시퀀스

@tab

R 플래그 없음

@item

“replied” 시퀀스

@tab

A 플래그

@item

“flagged” 시퀀스

@tab

F 플래그

@end multitable


@ref{3c83,,BabylMessage} 인스턴스를 기반으로 @code{MHMessage} 인스턴스가 만들어지면, 다음과 같은 변환이 발생합니다:


@multitable {xxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

결과 상태

@tab

@ref{3c83,,BabylMessage} 상태

@item

“unseen” 시퀀스

@tab

“unseen” 레이블

@item

“replied” 시퀀스

@tab

“answered” 레이블

@end multitable


@node BabylMessage 객체,MMDFMessage 객체,MHMessage 객체,Message 객체
@anchor{library/mailbox babylmessage-objects}@anchor{3ca5}@anchor{library/mailbox mailbox-babylmessage}@anchor{3ca6}
@subsubsection @code{BabylMessage} 객체


@geindex BabylMessage (mailbox 클래스)
@anchor{library/mailbox mailbox BabylMessage}@anchor{3c83}
@deffn {클래스} mailbox.BabylMessage (message=None)

Babyl 특정 동작을 갖는 메시지. 매개 변수 `message'는 @ref{1455,,Message} 생성자와 같은 의미입니다.

`어트리뷰트(attributes)'라고 부르는 특정 메시지 레이블은 관례에 따라 특별한 의미를 갖도록 정의됩니다. 어트리뷰트는 다음과 같습니다:


@multitable {xxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

레이블

@tab

설명

@item

unseen

@tab

읽지 않았지만, 이전에 MUA에서 감지했습니다.

@item

deleted

@tab

후에 삭제하기 위해 표시함

@item

filed

@tab

다른 파일이나 사서함에 복사됨

@item

answered

@tab

답장함

@item

forwarded

@tab

전달됨

@item

edited

@tab

사용자가 수정했음

@item

resent

@tab

다시 보냈음

@end multitable


기본적으로, Rmail은 가시적 헤더만 표시합니다. 그러나 @code{BabylMessage} 클래스는 더 완전하기 때문에 원래 헤더를 사용합니다. 원하면 가시적 헤더에 명시적으로 액세스 할 수 있습니다.

@code{BabylMessage} 인스턴스는 다음 메서드를 제공합니다:

@geindex get_labels() (mailbox.BabylMessage 메서드)
@anchor{library/mailbox mailbox BabylMessage get_labels}@anchor{3ca7}
@deffn {메서드} get_labels ()

메시지의 레이블 리스트를 반환합니다.
@end deffn

@geindex set_labels() (mailbox.BabylMessage 메서드)
@anchor{library/mailbox mailbox BabylMessage set_labels}@anchor{3ca8}
@deffn {메서드} set_labels (labels)

메시지의 레이블 리스트를 `labels'로 설정합니다.
@end deffn

@geindex add_label() (mailbox.BabylMessage 메서드)
@anchor{library/mailbox mailbox BabylMessage add_label}@anchor{3ca9}
@deffn {메서드} add_label (label)

메시지의 레이블 리스트에 `label'을 추가합니다.
@end deffn

@geindex remove_label() (mailbox.BabylMessage 메서드)
@anchor{library/mailbox mailbox BabylMessage remove_label}@anchor{3caa}
@deffn {메서드} remove_label (label)

메시지의 레이블 리스트에서 `label'을 제거합니다.
@end deffn

@geindex get_visible() (mailbox.BabylMessage 메서드)
@anchor{library/mailbox mailbox BabylMessage get_visible}@anchor{3cab}
@deffn {메서드} get_visible ()

헤더가 메시지의 가시적 헤더이고 본문이 비어있는 @ref{1455,,Message} 인스턴스를 반환합니다.
@end deffn

@geindex set_visible() (mailbox.BabylMessage 메서드)
@anchor{library/mailbox mailbox BabylMessage set_visible}@anchor{3cac}
@deffn {메서드} set_visible (visible)

메시지의 가시적 헤더를 `message'의 헤더와 같게 설정합니다. 매개 변수 `visible'은 @ref{1455,,Message} 인스턴스, @ref{580,,email.message.Message} 인스턴스, 문자열 또는 파일류 객체(텍스트 모드로 열어야 합니다)여야 합니다.
@end deffn

@geindex update_visible() (mailbox.BabylMessage 메서드)
@anchor{library/mailbox mailbox BabylMessage update_visible}@anchor{3cad}
@deffn {메서드} update_visible ()

@code{BabylMessage} 인스턴스의 원래 헤더가 수정될 때, 가시적 헤더는 일치하도록 자동으로 수정되지 않습니다. 이 메서드는 다음과 같이 가시적 헤더를 갱신합니다: 해당 원본 헤더가 있는 각 가시적 헤더는 원래 헤더의 값으로 설정되고, 해당 원본 헤더가 없는 각 가시적 헤더는 제거되며 원래 헤더에는 있지만, 가시적 헤더에는 없는 @code{Date}, @code{From}, @code{Reply-To}, @code{To}, @code{CC} 및 @code{Subject}는 모두 가시적 헤더에 추가됩니다.
@end deffn
@end deffn

@ref{3c50,,MaildirMessage} 인스턴스를 기반으로 @code{BabylMessage} 인스턴스가 만들어지면, 다음과 같은 변환이 발생합니다:


@multitable {xxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

결과 상태

@tab

@ref{3c50,,MaildirMessage} 상태

@item

“unseen” 레이블

@tab

S 플래그 없음

@item

“deleted” 레이블

@tab

T 플래그

@item

“answered” 레이블

@tab

R 플래그

@item

“forwarded” 레이블

@tab

P 플래그

@end multitable


@ref{3af6,,mboxMessage}나 @ref{3c8a,,MMDFMessage} 인스턴스를 기반으로 @code{BabylMessage} 인스턴스가 만들어지면, @code{Status}와 @code{X-Status} 헤더가 생략되고 다음과 같은 변환이 발생합니다:


@multitable {xxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

결과 상태

@tab

@ref{3af6,,mboxMessage}나 @ref{3c8a,,MMDFMessage} 상태

@item

“unseen” 레이블

@tab

R 플래그 없음

@item

“deleted” 레이블

@tab

D 플래그

@item

“answered” 레이블

@tab

A 플래그

@end multitable


@ref{3c70,,MHMessage} 인스턴스를 기반으로 @code{BabylMessage} 인스턴스가 만들어지면, 다음과 같은 변환이 발생합니다:


@multitable {xxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

결과 상태

@tab

@ref{3c70,,MHMessage} 상태

@item

“unseen” 레이블

@tab

“unseen” 시퀀스

@item

“answered” 레이블

@tab

“replied” 시퀀스

@end multitable


@node MMDFMessage 객체,,BabylMessage 객체,Message 객체
@anchor{library/mailbox mailbox-mmdfmessage}@anchor{3cae}@anchor{library/mailbox mmdfmessage-objects}@anchor{3caf}
@subsubsection @code{MMDFMessage} 객체


@geindex MMDFMessage (mailbox 클래스)
@anchor{library/mailbox mailbox MMDFMessage}@anchor{3c8a}
@deffn {클래스} mailbox.MMDFMessage (message=None)

MMDF 특정 동작을 갖는 메시지. 매개 변수 `message'는 @ref{1455,,Message} 생성자와 같은 의미입니다.

mbox 사서함의 메시지와 마찬가지로, MMDF 메시지는 보낸 사람의 주소와 배달 날짜가 “From “으로 시작하는 첫 줄에 저장됩니다. 마찬가지로, 메시지의 상태를 나타내는 플래그는 일반적으로 @code{Status}와 @code{X-Status} 헤더에 저장됩니다.

MMDF 메시지의 전통적인 플래그는 mbox 메시지의 플래그와 동일하며 다음과 같습니다:


@multitable {xxxxxxxx} {xxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

플래그

@tab

의미

@tab

설명

@item

R

@tab

읽었음

@tab

읽었음

@item

O

@tab

오래되었음

@tab

전에 MUA에서 감지됨

@item

D

@tab

삭제됨

@tab

후에 삭제하기 위해 표시함

@item

F

@tab

깃발 표시

@tab

중요하다고 표시됨

@item

A

@tab

답변함

@tab

답장함

@end multitable


“R”과 “O” 플래그는 @code{Status} 헤더에 저장되고, “D”, “F” 및 “A” 플래그는 @code{X-Status} 헤더에 저장됩니다. 플래그와 헤더는 일반적으로 언급된 순서대로 나타납니다.

@code{MMDFMessage} 인스턴스는 @ref{3af6,,mboxMessage}에서 제공하는 것과 동일한 다음 메서드를 제공합니다:

@geindex get_from() (mailbox.MMDFMessage 메서드)
@anchor{library/mailbox mailbox MMDFMessage get_from}@anchor{3cb0}
@deffn {메서드} get_from ()

mbox 사서함에서 메시지의 시작을 표시하는 “From “ 줄을 나타내는 문자열을 반환합니다. 선행 “From “과 후행 줄넘김은 제외됩니다.
@end deffn

@geindex set_from() (mailbox.MMDFMessage 메서드)
@anchor{library/mailbox mailbox MMDFMessage set_from}@anchor{3cb1}
@deffn {메서드} set_from (from_, time_=None)

“From “ 줄을 `from_'으로 설정합니다. `from_'은 선행 “From “이나 후행 줄넘김 없이 지정되어야 합니다. 편의를 위해, `time_'을 지정할 수 있으며 적절하게 포맷해서 `from_'에 추가합니다. `time_'이 지정되면, @ref{ee5,,time.struct_time} 인스턴스, @ref{13ee,,time.strftime()}로 전달하기에 적합한 튜플 또는 @code{True}(@ref{13c5,,time.gmtime()} 사용)여야 합니다.
@end deffn

@geindex get_flags() (mailbox.MMDFMessage 메서드)
@anchor{library/mailbox mailbox MMDFMessage get_flags}@anchor{3cb2}
@deffn {메서드} get_flags ()

현재 설정된 플래그를 지정하는 문자열을 반환합니다. 메시지가 전통적인 형식을 준수하면, 결과는 @code{'R'}, @code{'O'}, @code{'D'}, @code{'F'} 및 @code{'A'} 각각이 이 순서로 0이나 1회 등장하도록 이어붙인 것입니다.
@end deffn

@geindex set_flags() (mailbox.MMDFMessage 메서드)
@anchor{library/mailbox mailbox MMDFMessage set_flags}@anchor{3cb3}
@deffn {메서드} set_flags (flags)

`flags'에서 지정한 플래그를 설정하고 다른 모든 플래그를 설정 해제합니다. 매개 변수 `flags'는 @code{'R'}, @code{'O'}, @code{'D'}, @code{'F'} 및 @code{'A'} 각각이 0개 이상 등장하도록 임의의 순서로 이어붙인 것이어야 합니다.
@end deffn

@geindex add_flag() (mailbox.MMDFMessage 메서드)
@anchor{library/mailbox mailbox MMDFMessage add_flag}@anchor{3cb4}
@deffn {메서드} add_flag (flag)

다른 플래그를 변경하지 않고 `flag'로 지정된 플래그를 설정합니다. 한 번에 둘 이상의 플래그를 추가하기 위해, `flag'가 둘 이상의 문자로 구성된 문자열일 수 있습니다.
@end deffn

@geindex remove_flag() (mailbox.MMDFMessage 메서드)
@anchor{library/mailbox mailbox MMDFMessage remove_flag}@anchor{3cb5}
@deffn {메서드} remove_flag (flag)

Unset the flag(s) specified by `flag' without changing other flags. To
remove more than one flag at a time, `flag' may be a string of more than
one character.
@end deffn
@end deffn

@ref{3c50,,MaildirMessage} 인스턴스를 기반으로 @code{MMDFMessage} 인스턴스가 만들어지면, @code{MaildirMessage} 인스턴스의 배달 날짜를 기반으로 “From “ 줄이 생성되고, 다음과 같은 변환이 발생합니다:


@multitable {xxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

결과 상태

@tab

@ref{3c50,,MaildirMessage} 상태

@item

R 플래그

@tab

S 플래그

@item

O 플래그

@tab

“cur” 하위 디렉터리

@item

D 플래그

@tab

T 플래그

@item

F 플래그

@tab

F 플래그

@item

A 플래그

@tab

R 플래그

@end multitable


@ref{3c70,,MHMessage} 인스턴스를 기반으로 @code{MMDFMessage} 인스턴스가 만들어지면, 다음과 같은 변환이 발생합니다:


@multitable {xxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

결과 상태

@tab

@ref{3c70,,MHMessage} 상태

@item

R 플래그와 O 플래그

@tab

“unseen” 시퀀스 없음

@item

O 플래그

@tab

“unseen” 시퀀스

@item

F 플래그

@tab

“flagged” 시퀀스

@item

A 플래그

@tab

“replied” 시퀀스

@end multitable


@ref{3c83,,BabylMessage} 인스턴스를 기반으로 @code{MMDFMessage} 인스턴스가 만들어지면, 다음과 같은 변환이 발생합니다:


@multitable {xxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

결과 상태

@tab

@ref{3c83,,BabylMessage} 상태

@item

R 플래그와 O 플래그

@tab

“unseen” 레이블 없음

@item

O 플래그

@tab

“unseen” 레이블

@item

D 플래그

@tab

“deleted” 레이블

@item

A 플래그

@tab

“answered” 레이블

@end multitable


@ref{3af6,,mboxMessage} 인스턴스를 기반으로 @code{MMDFMessage} 인스턴스가 만들어지면, “From “ 줄이 복사되고 모든 플래그가 직접 대응됩니다:


@multitable {xxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

결과 상태

@tab

@ref{3af6,,mboxMessage} 상태

@item

R 플래그

@tab

R 플래그

@item

O 플래그

@tab

O 플래그

@item

D 플래그

@tab

D 플래그

@item

F 플래그

@tab

F 플래그

@item

A 플래그

@tab

A 플래그

@end multitable


@node 예외<15>,예<7>,Message 객체,mailbox — 다양한 형식의 사서함 조작하기
@anchor{library/mailbox exceptions}@anchor{3cb6}
@subsubsection 예외


다음 예외 클래스가 @code{mailbox} 모듈에 정의되어 있습니다:

@geindex Error
@anchor{library/mailbox mailbox Error}@anchor{3cb7}
@deffn {예외} mailbox.Error

The base class for all other module-specific exceptions.
@end deffn

@geindex NoSuchMailboxError
@anchor{library/mailbox mailbox NoSuchMailboxError}@anchor{3c54}
@deffn {예외} mailbox.NoSuchMailboxError

사서함이 기대되지만 찾을 수 없을 때 발생합니다, 가령 존재하지 않는 경로로 (그리고 @code{False}로 설정된 `create' 매개 변수를 사용하여) @ref{1451,,Mailbox} 서브 클래스를 인스턴스 화하거나, 존재하지 않는 폴더를 열 때.
@end deffn

@geindex NotEmptyError
@anchor{library/mailbox mailbox NotEmptyError}@anchor{3c57}
@deffn {예외} mailbox.NotEmptyError

사서함이 비어 있지 않지만 비어있을 것으로 기대될 때 발생합니다, 가령 메시지가 포함된 폴더를 삭제할 때.
@end deffn

@geindex ExternalClashError
@anchor{library/mailbox mailbox ExternalClashError}@anchor{3c4c}
@deffn {예외} mailbox.ExternalClashError

Raised when some mailbox-related condition beyond the control of the program
causes it to be unable to proceed, such as when failing to acquire a lock that
another program already holds, or when a uniquely generated file name
already exists.
@end deffn

@geindex FormatError
@anchor{library/mailbox mailbox FormatError}@anchor{3cb8}
@deffn {예외} mailbox.FormatError

파일의 데이터를 구문 분석할 수 없을 때 발생합니다, 가령 @ref{1a2d,,MH} 인스턴스가 손상된 @code{.mh_sequences} 파일을 읽으려고 할 때.
@end deffn

@node 예<7>,,예외<15>,mailbox — 다양한 형식의 사서함 조작하기
@anchor{library/mailbox examples}@anchor{3cb9}@anchor{library/mailbox mailbox-examples}@anchor{3cba}
@subsubsection 예


사서함에 있는 모든 흥미롭게 보이는 메시지의 제목을 인쇄하는 간단한 예:

@example
import mailbox
for message in mailbox.mbox('~/mbox'):
    subject = message['subject']       # None일 수 있습니다.
    if subject and 'python' in subject.lower():
        print(subject)
@end example

변환할 수 있는 모든 형식별 정보를 변환하면서, Babyl 사서함에서 MH 사서함으로 모든 메일을 복사하려면:

@example
import mailbox
destination = mailbox.MH('~/Mail')
destination.lock()
for message in mailbox.Babyl('~/RMAIL'):
    destination.add(mailbox.MHMessage(message))
destination.flush()
destination.unlock()
@end example

이 예에서는 여러 메일링 리스트로부터의 메일을 다른 사서함으로 정렬하여 넣고, 다른 프로그램에 의한 동시 수정으로 인한 메일 손상, 프로그램 중단으로 인한 메일 손실 또는 사서함에 있는 잘못된 메시지로 인한 조기 종료를 방지하도록 주의합니다:

@example
import mailbox
import email.errors

list_names = ('python-list', 'python-dev', 'python-bugs')

boxes = @{name: mailbox.mbox('~/email/%s' % name) for name in list_names@}
inbox = mailbox.Maildir('~/Maildir', factory=None)

for key in inbox.iterkeys():
    try:
        message = inbox[key]
    except email.errors.MessageParseError:
        continue                # 메시지가 잘못되었습니다. 그냥 둡니다.

    for name in list_names:
        list_id = message['list-id']
        if list_id and name in list_id:
            # 사용할 사서함을 얻습니다
            box = boxes[name]

            # 원본을 제거하기 전에 사본을 디스크에 기록합니다.
            # 충돌이 있으면, 메시지가 중복될 수 있지만, 메시지를 완전히 잃어버리는
            # 것보다는 낫습니다.
            box.lock()
            box.add(message)
            box.flush()
            box.unlock()

            # 원본 메시지 제거
            inbox.lock()
            inbox.discard(key)
            inbox.flush()
            inbox.unlock()
            break               # 목적지를 찾았으니, 그만 찾습니다.

for box in boxes.itervalues():
    box.close()
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node mimetypes — 파일명을 MIME 유형에 매핑,base64 — Base16 Base32 Base64 Base85 데이터 인코딩,mailbox — 다양한 형식의 사서함 조작하기,인터넷 데이터 처리
@anchor{library/mimetypes doc}@anchor{3cbb}@anchor{library/mimetypes mimetypes-map-filenames-to-mime-types}@anchor{3cbc}@anchor{library/mimetypes module-mimetypes}@anchor{93}@anchor{library/mimetypes translation-repo}@anchor{3cbd}
@subsection @code{mimetypes} — 파일명을 MIME 유형에 매핑


@geindex module; mimetypes

`소스 코드:' Lib/mimetypes.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/mimetypes.py}

@geindex MIME;콘텐츠 유형


__________________________________________________________________


The @code{mimetypes} module converts between a filename or URL and the MIME type
associated with the filename extension.  Conversions are provided from filename
to MIME type and from MIME type to filename extension; encodings are not
supported for the latter conversion.

이 모듈은 하나의 클래스와 여러 편리 함수를 제공합니다. 함수가 이 모듈에 대한 일반 인터페이스이지만, 일부 응용 프로그램은 클래스에도 관심이 있을 수 있습니다.

아래에 설명된 함수는 이 모듈의 기본 인터페이스를 제공합니다. 모듈이 초기화되지 않았으면, 함수가 @ref{3cbe,,init()}가 설정하는 정보에 의존하면 @code{init()}를 호출합니다.

@geindex guess_type() (mimetypes 모듈)
@anchor{library/mimetypes mimetypes guess_type}@anchor{516}
@deffn {함수} mimetypes.guess_type (url, strict=True)

@geindex MIME;헤더

`url'로 주어진 파일명, 경로 또는 URL에 기반한 파일의 유형을 추측합니다. URL은 문자열이나 @ref{5a0,,경로류 객체}일 수 있습니다.

반환 값은 튜플 @code{(type, encoding)}인데, `type'은 MIME @code{content-type} 헤더에 사용할 수 있는 @code{'type/subtype'} 형식의 문자열이거나, 유형을 추측할 수 없으면 (없거나 알려지지 않은 확장자) @code{None}입니다.

`encoding'은 인코딩에 사용된 프로그램의 이름(예를 들어, @code{compress}나 @code{gzip})이거나, 인코딩이 없으면 @code{None}입니다. 인코딩은 @code{Content-Encoding} 헤더로 사용하기에 적합합니다, @code{Content-Transfer-Encoding} 헤더가 `아닙니다'. 매핑은 테이블 기반입니다. 인코딩 접미사는 대소 문자를 구분합니다; 유형 접미사는 먼저 대소 문자를 구분해서 시도한 후에, 대소 문자를 구분하지 않고 시도합니다.

The optional `strict' argument is a flag specifying whether the list of known MIME types
is limited to only the official types registered with IANA@footnote{https://www.iana.org/assignments/media-types/media-types.xhtml}.
However, the behavior of this module also depends on the underlying operating
system. Only file types recognized by the OS or explicitly registered with
Python’s internal database can be identified. When `strict' is @code{True} (the
default), only the IANA types are supported; when `strict' is @code{False}, some
additional non-standard but commonly used MIME types are also recognized.


버전 3.8에서 변경: @ref{5a0,,경로류 객체} `url'에 대한 지원이 추가되었습니다.



버전 3.13부터 폐지됨: Passing a file path instead of URL is @ref{23d,,soft deprecated}.
Use @ref{515,,guess_file_type()} for this.

@end deffn

@geindex guess_file_type() (mimetypes 모듈)
@anchor{library/mimetypes mimetypes guess_file_type}@anchor{515}
@deffn {함수} mimetypes.guess_file_type (path, *, strict=True)

@geindex MIME;헤더

`path'로 주어진 경로에 기반하여 파일의 유형을 추측합니다. @ref{516,,guess_type()} 함수와 유사하지만, URL 대신 경로를 받습니다. 경로는 문자열, 바이트열 객체 혹은 @ref{5a0,,경로류 객체}일 수 있습니다.


Added in version 3.13.

@end deffn

@geindex guess_all_extensions() (mimetypes 모듈)
@anchor{library/mimetypes mimetypes guess_all_extensions}@anchor{1c48}
@deffn {함수} mimetypes.guess_all_extensions (type, strict=True)

`type'으로 주어진 MIME 유형을 기반으로 파일의 확장자를 추측합니다. 반환 값은 가능한 모든 파일명 확장자를 제공하는 문자열 리스트인데, 선행 점(@code{'.'})을 포함합니다. 확장자는 특정 데이터 스트림과 연관되었음이 보장되지는 않지만, @ref{516,,guess_type()}과 @ref{515,,guess_file_type()}에 의해 MIME 유형 `type'으로 매핑됩니다.

선택적 `strict' 인자는 @ref{516,,guess_type()} 함수에서와 같은 의미를 가집니다.
@end deffn

@geindex guess_extension() (mimetypes 모듈)
@anchor{library/mimetypes mimetypes guess_extension}@anchor{3cbf}
@deffn {함수} mimetypes.guess_extension (type, strict=True)

`type'으로 주어진 MIME 유형을 기반으로 파일의 확장자를 추측합니다. 반환 값은 파일명 확장자를 제공하는 문자열인데, 선행 점(@code{'.'})을 포함합니다. 확장자는 특정 데이터 스트림과 연관되었음이 보장되지는 않지만, @ref{516,,guess_type()}과 @ref{515,,guess_file_type()}에 의해 MIME 유형 `type'으로 매핑됩니다. `type'에 대해 추측할 수 있는 확장이 없으면, @code{None}이 반환됩니다.

선택적 `strict' 인자는 @ref{516,,guess_type()} 함수에서와 같은 의미를 가집니다.
@end deffn

일부 추가 함수와 데이터 항목은 모듈의 동작을 제어하는 데 사용할 수 있습니다.

@geindex init() (mimetypes 모듈)
@anchor{library/mimetypes mimetypes init}@anchor{3cbe}
@deffn {함수} mimetypes.init (files=None)

내부 데이터 구조를 초기화합니다. 주어지면, `files'는 기본 유형 맵을 보강하는 데 사용해야 하는 파일 이름의 시퀀스여야 합니다. 생략하면, 사용할 파일 이름은 @ref{3cc0,,knownfiles}에서 가져옵니다; 윈도우에서는, 현재 레지스트리 설정이 로드됩니다. `files'나 @code{knownfiles}에서 명명된 각 파일은 그 앞에서 명명된 파일보다 우선합니다. 반복적으로 @ref{3cbe,,init()}를 호출할 수 있습니다.

`files'에 빈 리스트를 지정하면 시스템 기본값이 적용되지 않습니다: 내장 리스트로부터 온 잘 알려진 값만 나타납니다.

`files'가 @code{None}이면 내부 데이터 구조가 초기 기본값으로 완전히 다시 만들어집니다. 이것은 안정적인 연산이며 여러 번 호출 될 때 같은 결과를 생성합니다.


버전 3.2에서 변경: 이전에는, 윈도우 레지스트리 설정이 무시되었습니다.

@end deffn

@geindex read_mime_types() (mimetypes 모듈)
@anchor{library/mimetypes mimetypes read_mime_types}@anchor{1d27}
@deffn {함수} mimetypes.read_mime_types (filename)

`filename' 파일이 있으면, 그 파일에 주어진 유형 맵을 로드합니다. 유형 맵은 선행 점(@code{'.'})을 포함하는 파일명 확장자를 @code{'type/subtype'} 형식의 문자열로 매핑하는 딕셔너리로 반환됩니다. `filename' 파일이 없거나 읽을 수 없으면 @code{None}이 반환됩니다.
@end deffn

@geindex add_type() (mimetypes 모듈)
@anchor{library/mimetypes mimetypes add_type}@anchor{3cc1}
@deffn {함수} mimetypes.add_type (type, ext, strict=True)

MIME 유형 `type'에서 확장자 `ext'로의 매핑을 추가합니다. 확장자가 이미 알려져 있으면, 새 유형이 이전 유형을 대체합니다. 유형이 이미 알려져 있으면, 확장이 알려진 확장 리스트에 추가됩니다.

`strict'가 @code{True}(기본값)이면, 매핑이 공식 MIME 유형에 추가되고, 그렇지 않으면 비표준 MIME 유형에 추가됩니다.
@end deffn

@geindex inited (mimetypes 모듈)
@anchor{library/mimetypes mimetypes inited}@anchor{3cc2}
@deffn {데이터} mimetypes.inited

전역 데이터 구조가 초기화되었는지를 나타내는 플래그. 이것은 @ref{3cbe,,init()}에 의해 @code{True}로 설정됩니다.
@end deffn

@geindex knownfiles (mimetypes 모듈)
@anchor{library/mimetypes mimetypes knownfiles}@anchor{3cc0}
@deffn {데이터} mimetypes.knownfiles

@geindex 파일;mime.types

일반적으로 설치된 유형 맵 파일 이름의 리스트입니다. 이 파일들은 일반적으로 @code{mime.types}로 명명되며 패키지별로 다른 위치에 설치됩니다.
@end deffn

@geindex suffix_map (mimetypes 모듈)
@anchor{library/mimetypes mimetypes suffix_map}@anchor{3cc3}
@deffn {데이터} mimetypes.suffix_map

접미사를 접미사에 매핑하는 딕셔너리. 인코딩과 유형이 같은 확장자로 표시되는 인코딩된 파일을 인식하도록 하는 데 사용됩니다. 예를 들어, @code{.tgz} 확장자는 인코딩과 유형을 별도로 인식 할 수 있도록, @code{.tar.gz}에 매핑됩니다.
@end deffn

@geindex encodings_map (mimetypes 모듈)
@anchor{library/mimetypes mimetypes encodings_map}@anchor{3cc4}
@deffn {데이터} mimetypes.encodings_map

파일명 확장자를 인코딩 유형에 매핑하는 딕셔너리.
@end deffn

@geindex types_map (mimetypes 모듈)
@anchor{library/mimetypes mimetypes types_map}@anchor{3cc5}
@deffn {데이터} mimetypes.types_map

파일명 확장자를 MIME 유형에 매핑하는 딕셔너리.
@end deffn

@geindex common_types (mimetypes 모듈)
@anchor{library/mimetypes mimetypes common_types}@anchor{3cc6}
@deffn {데이터} mimetypes.common_types

파일명 확장자를 비표준이지만 일반적으로 발견되는 MIME 유형에 매핑하는 딕셔너리.
@end deffn

모듈의 사용 예:

@example
>>> import mimetypes
>>> mimetypes.init()
>>> mimetypes.knownfiles
['/etc/mime.types', '/etc/httpd/mime.types', ... ]
>>> mimetypes.suffix_map['.tgz']
'.tar.gz'
>>> mimetypes.encodings_map['.gz']
'gzip'
>>> mimetypes.types_map['.tgz']
'application/x-tar-gz'
@end example

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

@end menu

@node MimeTypes objects,Command-line usage<4>,,mimetypes — 파일명을 MIME 유형에 매핑
@anchor{library/mimetypes id1}@anchor{3cc7}@anchor{library/mimetypes mimetypes-objects}@anchor{3cc8}
@subsubsection MimeTypes objects


The @ref{1700,,MimeTypes} class may be useful for applications which may want more
than one MIME-type database; it provides an interface similar to the one of the
@code{mimetypes} module.

@geindex MimeTypes (mimetypes 클래스)
@anchor{library/mimetypes mimetypes MimeTypes}@anchor{1700}
@deffn {클래스} mimetypes.MimeTypes (filenames=(), strict=True)

이 클래스는 MIME 유형 데이터베이스를 나타냅니다. 기본적으로, 이 모듈의 나머지 부분과 같은 데이터베이스에 대한 액세스를 제공합니다. 초기 데이터베이스는 모듈이 제공하는 것의 사본이며, @ref{3cc9,,read()}나 @ref{3cca,,readfp()} 메서드를 사용하여 추가 @code{mime.types}-스타일 파일을 데이터베이스에 로드하여 확장할 수 있습니다. 기본 데이터가 필요하지 않으면, 추가 데이터를 로드하기 전에 매핑 딕셔너리를 지울 수도 있습니다.

선택적 `filenames' 매개 변수는 기본 데이터베이스의 “위”에 추가 파일을 로드하게 하는 데 사용할 수 있습니다.

@geindex suffix_map (mimetypes.MimeTypes의 속성)
@anchor{library/mimetypes mimetypes MimeTypes suffix_map}@anchor{3ccb}
@deffn {속성} suffix_map

접미사를 접미사에 매핑하는 딕셔너리. 인코딩과 유형이 같은 확장자로 표시되는 인코딩된 파일을 인식하도록 하는 데 사용됩니다. 예를 들어, @code{.tgz} 확장자는 인코딩과 유형을 별도로 인식 할 수 있도록, @code{.tar.gz}에 매핑됩니다. 이것은 초기에는 모듈에 정의된 전역 @ref{3cc3,,suffix_map}의 사본입니다.
@end deffn

@geindex encodings_map (mimetypes.MimeTypes의 속성)
@anchor{library/mimetypes mimetypes MimeTypes encodings_map}@anchor{3ccc}
@deffn {속성} encodings_map

파일명 확장자를 인코딩 유형에 매핑하는 딕셔너리. 이것은 초기에는 모듈에 정의된 전역 @ref{3cc4,,encodings_map}의 사본입니다.
@end deffn

@geindex types_map (mimetypes.MimeTypes의 속성)
@anchor{library/mimetypes mimetypes MimeTypes types_map}@anchor{3ccd}
@deffn {속성} types_map

파일명 확장자를 MIME 유형으로 매핑하는 두 개의 딕셔너리를 포함하는 튜플: 첫 번째 딕셔너리는 비표준 유형 용이고 두 번째는 표준 유형 용입니다. @ref{3cc6,,common_types}와 @ref{3cc5,,types_map}으로 초기화됩니다.
@end deffn

@geindex types_map_inv (mimetypes.MimeTypes의 속성)
@anchor{library/mimetypes mimetypes MimeTypes types_map_inv}@anchor{3cce}
@deffn {속성} types_map_inv

MIME 타입을 파일명 확장자 리스트로 매핑하는 두 개의 딕셔너리를 포함하는 튜플: 첫 번째 딕셔너리는 비표준 유형 용이고 두 번째는 표준 유형 용입니다. @ref{3cc6,,common_types}와 @ref{3cc5,,types_map}으로 초기화됩니다.
@end deffn

@geindex guess_extension() (mimetypes.MimeTypes 메서드)
@anchor{library/mimetypes mimetypes MimeTypes guess_extension}@anchor{3ccf}
@deffn {메서드} guess_extension (type, strict=True)

@ref{3cbf,,guess_extension()} 함수와 유사하고, 객체의 일부로 저장된 테이블을 사용합니다.
@end deffn

@geindex guess_type() (mimetypes.MimeTypes 메서드)
@anchor{library/mimetypes mimetypes MimeTypes guess_type}@anchor{1e15}
@deffn {메서드} guess_type (url, strict=True)

@ref{516,,guess_type()} 함수와 유사하고, 객체의 일부로 저장된 테이블을 사용합니다.
@end deffn

@geindex guess_file_type() (mimetypes.MimeTypes 메서드)
@anchor{library/mimetypes mimetypes MimeTypes guess_file_type}@anchor{3cd0}
@deffn {메서드} guess_file_type (path, *, strict=True)

@ref{515,,guess_file_type()} 함수와 유사하고, 객체의 일부로 저장된 테이블을 사용합니다.


Added in version 3.13.

@end deffn

@geindex guess_all_extensions() (mimetypes.MimeTypes 메서드)
@anchor{library/mimetypes mimetypes MimeTypes guess_all_extensions}@anchor{3cd1}
@deffn {메서드} guess_all_extensions (type, strict=True)

@ref{1c48,,guess_all_extensions()} 함수와 유사하고, 객체의 일부로 저장된 테이블을 사용합니다.
@end deffn

@geindex read() (mimetypes.MimeTypes 메서드)
@anchor{library/mimetypes mimetypes MimeTypes read}@anchor{3cc9}
@deffn {메서드} read (filename, strict=True)

`filename'이라는 이름의 파일에서 MIME 정보를 로드합니다. @ref{3cca,,readfp()}를 사용하여 파일을 구문 분석합니다.

`strict'가 @code{True}이면, 정보는 표준 유형 리스트에 추가되고, 그렇지 않으면 비표준 유형 리스트에 추가됩니다.
@end deffn

@geindex readfp() (mimetypes.MimeTypes 메서드)
@anchor{library/mimetypes mimetypes MimeTypes readfp}@anchor{3cca}
@deffn {메서드} readfp (fp, strict=True)

열린 파일 `fp'에서 MIME 유형 정보를 로드합니다. 파일은 표준 @code{mime.types} 파일의 형식이어야 합니다.

`strict'가 @code{True}이면, 정보는 표준 유형 리스트에 추가되고, 그렇지 않으면 비표준 유형 리스트에 추가됩니다.
@end deffn

@geindex read_windows_registry() (mimetypes.MimeTypes 메서드)
@anchor{library/mimetypes mimetypes MimeTypes read_windows_registry}@anchor{3cd2}
@deffn {메서드} read_windows_registry (strict=True)

윈도우 레지스트리에서 MIME 유형 정보를 로드합니다.

@ref{213c,,가용성}: Windows.

`strict'가 @code{True}이면, 정보는 표준 유형 리스트에 추가되고, 그렇지 않으면 비표준 유형 리스트에 추가됩니다.


Added in version 3.2.

@end deffn

@geindex add_type() (mimetypes.MimeTypes 메서드)
@anchor{library/mimetypes mimetypes MimeTypes add_type}@anchor{319}
@deffn {메서드} add_type (type, ext, strict=True)

Add a mapping from the MIME type `type' to the extension `ext'.
Valid extensions start with a ‘.’ or are empty. When the
extension is already known, the new type will replace the old one. When the type
is already known the extension will be added to the list of known extensions.

`strict'가 @code{True}(기본값)이면, 매핑이 공식 MIME 유형에 추가되고, 그렇지 않으면 비표준 MIME 유형에 추가됩니다.


Deprecated since version 3.14, will be removed in version 3.16: Invalid, undotted extensions will raise a
@ref{2ec,,ValueError} in Python 3.16.

@end deffn
@end deffn

@node Command-line usage<4>,Command-line example<2>,MimeTypes objects,mimetypes — 파일명을 MIME 유형에 매핑
@anchor{library/mimetypes command-line-usage}@anchor{3cd3}@anchor{library/mimetypes mimetypes-cli}@anchor{247}
@subsubsection Command-line usage


The @code{mimetypes} module can be executed as a script from the command line.

@example
python -m mimetypes [-h] [-e] [-l] type [type ...]
@end example

The following options are accepted:

@geindex mimetypes 명령줄 옵션; -h
@geindex mimetypes 명령줄 옵션; --help
@anchor{library/mimetypes cmdoption-mimetypes-h}@anchor{3cd4}
@deffn {프로그램 옵션} @w{-}h
@anchor{library/mimetypes cmdoption-mimetypes-help}@anchor{3cd5}
@deffnx {프로그램 옵션} @w{-}@w{-}help

Show the help message and exit.
@end deffn

@geindex mimetypes 명령줄 옵션; -e
@geindex mimetypes 명령줄 옵션; --extension
@anchor{library/mimetypes cmdoption-mimetypes-e}@anchor{3cd6}
@deffn {프로그램 옵션} @w{-}e
@anchor{library/mimetypes cmdoption-mimetypes-extension}@anchor{3cd7}
@deffnx {프로그램 옵션} @w{-}@w{-}extension

Guess extension instead of type.
@end deffn

@geindex mimetypes 명령줄 옵션; -l
@geindex mimetypes 명령줄 옵션; --lenient
@anchor{library/mimetypes cmdoption-mimetypes-l}@anchor{3cd8}
@deffn {프로그램 옵션} @w{-}l
@anchor{library/mimetypes cmdoption-mimetypes-lenient}@anchor{3cd9}
@deffnx {프로그램 옵션} @w{-}@w{-}lenient

Additionally search for some common, but non-standard types.
@end deffn

By default the script converts MIME types to file extensions.
However, if @code{--extension} is specified,
it converts file extensions to MIME types.

For each @code{type} entry, the script writes a line into the standard output
stream. If an unknown type occurs, it writes an error message into the
standard error stream and exits with the return code @code{1}.

@c mimetypes-cli-example:

@node Command-line example<2>,,Command-line usage<4>,mimetypes — 파일명을 MIME 유형에 매핑
@anchor{library/mimetypes command-line-example}@anchor{3cda}
@subsubsection Command-line example


Here are some examples of typical usage of the @code{mimetypes} command-line
interface:

@example
$ # get a MIME type by a file name
$ python -m mimetypes filename.png
type: image/png encoding: None

$ # get a MIME type by a URL
$ python -m mimetypes https://example.com/filename.txt
type: text/plain encoding: None

$ # get a complex MIME type
$ python -m mimetypes filename.tar.gz
type: application/x-tar encoding: gzip

$ # get a MIME type for a rare file extension
$ python -m mimetypes filename.pict
error: unknown extension of filename.pict

$ # now look in the extended database built into Python
$ python -m mimetypes --lenient filename.pict
type: image/pict encoding: None

$ # get a file extension by a MIME type
$ python -m mimetypes --extension text/javascript
.js

$ # get a file extension by a rare MIME type
$ python -m mimetypes --extension text/xul
error: unknown type text/xul

$ # now look in the extended database again
$ python -m mimetypes --extension --lenient text/xul
.xul

$ # try to feed an unknown file extension
$ python -m mimetypes filename.sh filename.nc filename.xxx filename.txt
type: application/x-sh encoding: None
type: application/x-netcdf encoding: None
error: unknown extension of filename.xxx

$ # try to feed an unknown MIME type
$ python -m mimetypes --extension audio/aac audio/opus audio/future audio/x-wav
.aac
.opus
error: unknown type audio/future
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node base64 — Base16 Base32 Base64 Base85 데이터 인코딩,binascii — 바이너리와 ASCII 간의 변환,mimetypes — 파일명을 MIME 유형에 매핑,인터넷 데이터 처리
@anchor{library/base64 doc}@anchor{3cdb}@anchor{library/base64 base64-base16-base32-base64-base85-data-encodings}@anchor{3cdc}@anchor{library/base64 module-base64}@anchor{f}@anchor{library/base64 translation-repo}@anchor{3cdd}
@subsection @code{base64} — Base16, Base32, Base64, Base85 데이터 인코딩


@geindex module; base64

`소스 코드:' Lib/base64.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/base64.py}

@geindex base64;인코딩
@geindex MIME;base64 인코딩


__________________________________________________________________


This module provides functions for encoding binary data to printable
ASCII characters and decoding such encodings back to binary data.
This includes the @ref{3cde,,encodings specified in}
@geindex RFC; RFC 4648
RFC 4648@footnote{https://datatracker.ietf.org/doc/html/rfc4648.html} (Base64, Base32 and Base16)
and the non-standard @ref{3cdf,,Base85 encodings}.

이 모듈은 두 개의 인터페이스를 제공합니다. 최신 인터페이스는 @ref{193,,바이트열류 객체}를 ASCII @ref{192,,bytes}로 인코딩하고, 바이트열류 객체나 ASCII를 포함하는 문자열을 @code{bytes}로 디코딩하는 것을 지원합니다. 
@geindex RFC; RFC 4648
RFC 4648@footnote{https://datatracker.ietf.org/doc/html/rfc4648.html}에 정의된 두 가지(일반, 그리고 URL과 파일 시스템에서 안전한) base-64 알파벳이 모두 지원됩니다.

The @ref{3ce0,,legacy interface} does not support decoding from strings, but it does
provide functions for encoding and decoding to and from @ref{13c8,,file objects}.  It only supports the Base64 standard alphabet, and it adds
newlines every 76 characters as per 
@geindex RFC; RFC 2045
RFC 2045@footnote{https://datatracker.ietf.org/doc/html/rfc2045.html}.  Note that if you are looking
for 
@geindex RFC; RFC 2045
RFC 2045@footnote{https://datatracker.ietf.org/doc/html/rfc2045.html} support you probably want to be looking at the @ref{3f,,email}
package instead.


버전 3.3에서 변경: ASCII 전용 유니코드 문자열은 이제 최신 인터페이스의 디코딩 함수가 받아들입니다.



버전 3.4에서 변경: 모든 @ref{193,,바이트열류 객체}는 이제 이 모듈의 모든 인코딩과 디코딩 함수가 받아들입니다. Ascii85/Base85 지원이 추가되었습니다.


@menu
* RFC 4648 Encodings:: 
* Base85 Encodings:: 
* Legacy Interface:: 
* Security Considerations:: 

@end menu

@node RFC 4648 Encodings,Base85 Encodings,,base64 — Base16 Base32 Base64 Base85 데이터 인코딩
@anchor{library/base64 base64-rfc-4648}@anchor{3cde}@anchor{library/base64 rfc-4648-encodings}@anchor{3ce1}
@subsubsection RFC 4648 Encodings


The 
@geindex RFC; RFC 4648
RFC 4648@footnote{https://datatracker.ietf.org/doc/html/rfc4648.html} encodings are suitable for encoding binary data so that it can be
safely sent by email, used as parts of URLs, or included as part of an HTTP
POST request.

@geindex b64encode() (base64 모듈)
@anchor{library/base64 base64 b64encode}@anchor{3ce2}
@deffn {함수} base64.b64encode (s, altchars=None)

Base64를 사용하여 @ref{193,,바이트열류 객체} `s'를 인코딩하고 인코딩된 @ref{192,,bytes}를 반환합니다.

선택적 `altchars'는 @code{+}와 @code{/} 문자의 대체 알파벳을 지정하는 길이 2의 @ref{193,,바이트열류 객체}여야 합니다. 이를 통해 응용 프로그램은 URL이나 파일 시스템에서 안전한 Base64 문자열을 생성할 수 있습니다. 기본값은 @code{None}이며, 표준 Base64 알파벳이 사용됩니다.

May assert or raise a @ref{2ec,,ValueError} if the length of `altchars' is not 2.  Raises a
@ref{198,,TypeError} if `altchars' is not a @ref{193,,bytes-like object}.
@end deffn

@geindex b64decode() (base64 모듈)
@anchor{library/base64 base64 b64decode}@anchor{1763}
@deffn {함수} base64.b64decode (s, altchars=None, validate=False)

Base64로 인코딩된 @ref{193,,바이트열류 객체}나 ASCII 문자열 `s'를 디코딩하고 디코딩된 @ref{192,,bytes}를 반환합니다.

선택적 `altchars'는 @code{+}와 @code{/} 문자 대신에 사용되는 대체 알파벳을 지정하는 길이 2의 @ref{193,,바이트열류 객체}나 ASCII 문자열이어야 합니다.

`s'가 잘못 채워지면(padded) @ref{1225,,binascii.Error} 예외가 발생합니다.

`validate'가 @code{False}(기본값)면, 일반 base-64 알파벳도 대체 알파벳도 아닌 문자는 채우기(padding) 검사 전에 버려집니다. `validate'가 @code{True}면, 입력에 이 알파벳이 아닌 문자가 있으면 @ref{1225,,binascii.Error}가 발생합니다.

For more information about the strict base64 check, see @ref{1762,,binascii.a2b_base64()}

May assert or raise a @ref{2ec,,ValueError} if the length of `altchars' is not 2.
@end deffn

@geindex standard_b64encode() (base64 모듈)
@anchor{library/base64 base64 standard_b64encode}@anchor{3ce3}
@deffn {함수} base64.standard_b64encode (s)

표준 Base64 알파벳을 사용하여 @ref{193,,바이트열류 객체} `s'를 인코딩하고 인코딩된 @ref{192,,bytes}를 반환합니다.
@end deffn

@geindex standard_b64decode() (base64 모듈)
@anchor{library/base64 base64 standard_b64decode}@anchor{3ce4}
@deffn {함수} base64.standard_b64decode (s)

표준 Base64 알파벳을 사용하여 @ref{193,,바이트열류 객체}나 ASCII 문자열 `s'를 디코딩하고 디코딩된 @ref{192,,bytes}를 반환합니다.
@end deffn

@geindex urlsafe_b64encode() (base64 모듈)
@anchor{library/base64 base64 urlsafe_b64encode}@anchor{3ce5}
@deffn {함수} base64.urlsafe_b64encode (s)

표준 Base64 알파벳에서 @code{+} 대신 @code{-}를, @code{/} 대신 @code{_}를 사용하도록 대체한 URL과 파일 시스템에서 안전한 알파벳을 사용하여 @ref{193,,바이트열류 객체} `s'를 인코딩하고, 인코딩된 @ref{192,,bytes}를 반환합니다. 결과에는 여전히 @code{=}가 포함될 수 있습니다.
@end deffn

@geindex urlsafe_b64decode() (base64 모듈)
@anchor{library/base64 base64 urlsafe_b64decode}@anchor{3ce6}
@deffn {함수} base64.urlsafe_b64decode (s)

표준 Base64 알파벳에서 @code{+} 대신 @code{-}를, @code{/} 대신 @code{_}를 사용하도록 대체한 URL과 파일 시스템에서 안전한 알파벳을 사용하여 @ref{193,,바이트열류 객체}나 ASCII 문자열 `s'를 디코딩하고, 디코딩된 @ref{192,,bytes}를 반환합니다.
@end deffn

@geindex b32encode() (base64 모듈)
@anchor{library/base64 base64 b32encode}@anchor{3ce7}
@deffn {함수} base64.b32encode (s)

Base32를 사용하여 @ref{193,,바이트열류 객체} `s'를 인코딩하고 인코딩된 @ref{192,,bytes}를 반환합니다.
@end deffn

@geindex b32decode() (base64 모듈)
@anchor{library/base64 base64 b32decode}@anchor{1224}
@deffn {함수} base64.b32decode (s, casefold=False, map01=None)

Base32로 인코딩된 @ref{193,,바이트열류 객체}나 ASCII 문자열 `s'를 디코딩하고 디코딩된 @ref{192,,bytes}를 반환합니다.

선택적 `casefold'는 소문자 알파벳을 입력으로 사용할 수 있는지를 지정하는 플래그입니다. 보안을 위해, 기본값은 @code{False}입니다.

@geindex RFC; RFC 4648
RFC 4648@footnote{https://datatracker.ietf.org/doc/html/rfc4648.html}은 숫자 0(영)을 글자 O(오)로 선택적으로 매핑하고, 숫자 1(일)을 글자 I(아이)나 글자 L(엘)로 선택적으로 매핑할 수 있게 합니다. 선택적 인자 `map01'이 @code{None}이 아니면, 숫자 1이 매핑되어야 하는 글자를 지정합니다 (`map01'이 @code{None}이 아닐 때, 숫자 0은 항상 글자 O로 매핑됩니다). 보안상의 이유로 기본값은 @code{None}이고, 0과 1은 입력에 허용되지 않습니다.

`s'가 잘못 채워졌거나(padded) 입력에 알파벳이 아닌 문자가 있으면 @ref{1225,,binascii.Error}가 발생합니다.
@end deffn

@geindex b32hexencode() (base64 모듈)
@anchor{library/base64 base64 b32hexencode}@anchor{9e4}
@deffn {함수} base64.b32hexencode (s)

Similar to @ref{3ce7,,b32encode()} but uses the Extended Hex Alphabet, as defined in
@geindex RFC; RFC 4648
RFC 4648@footnote{https://datatracker.ietf.org/doc/html/rfc4648.html}.


Added in version 3.10.

@end deffn

@geindex b32hexdecode() (base64 모듈)
@anchor{library/base64 base64 b32hexdecode}@anchor{9e5}
@deffn {함수} base64.b32hexdecode (s, casefold=False)

Similar to @ref{1224,,b32decode()} but uses the Extended Hex Alphabet, as defined in
@geindex RFC; RFC 4648
RFC 4648@footnote{https://datatracker.ietf.org/doc/html/rfc4648.html}.

This version does not allow the digit 0 (zero) to the letter O (oh) and digit
1 (one) to either the letter I (eye) or letter L (el) mappings, all these
characters are included in the Extended Hex Alphabet and are not
interchangeable.


Added in version 3.10.

@end deffn

@geindex b16encode() (base64 모듈)
@anchor{library/base64 base64 b16encode}@anchor{3ce8}
@deffn {함수} base64.b16encode (s)

Base16을 사용하여 @ref{193,,바이트열류 객체} `s'를 인코딩하고 인코딩된 @ref{192,,bytes}를 반환합니다.
@end deffn

@geindex b16decode() (base64 모듈)
@anchor{library/base64 base64 b16decode}@anchor{2d3}
@deffn {함수} base64.b16decode (s, casefold=False)

Base16으로 인코딩된 @ref{193,,바이트열류 객체}나 ASCII 문자열 `s'를 디코딩하고 디코딩된 @ref{192,,bytes}를 반환합니다.

선택적 `casefold'는 소문자 알파벳을 입력으로 사용할 수 있는지를 지정하는 플래그입니다. 보안을 위해, 기본값은 @code{False}입니다.

`s'가 잘못 채워졌거나(padded) 입력에 알파벳이 아닌 문자가 있으면 @ref{1225,,binascii.Error}가 발생합니다.
@end deffn

@node Base85 Encodings,Legacy Interface,RFC 4648 Encodings,base64 — Base16 Base32 Base64 Base85 데이터 인코딩
@anchor{library/base64 base64-base-85}@anchor{3cdf}@anchor{library/base64 base85-encodings}@anchor{3ce9}
@subsubsection Base85 Encodings


Base85 encoding is not formally specified but rather a de facto standard,
thus different systems perform the encoding differently.

The @ref{111f,,a85encode()} and @ref{1121,,b85encode()} functions in this module are two implementations of
the de facto standard. You should call the function with the Base85
implementation used by the software you intend to work with.

The two functions present in this module differ in how they handle the following:


@itemize *

@item 
Whether to include enclosing @code{<~} and @code{~>} markers

@item 
Whether to include newline characters

@item 
The set of ASCII characters used for encoding

@item 
Handling of null bytes
@end itemize

Refer to the documentation of the individual functions for more information.

@geindex a85encode() (base64 모듈)
@anchor{library/base64 base64 a85encode}@anchor{111f}
@deffn {함수} base64.a85encode (b, *, foldspaces=False, wrapcol=0, pad=False, adobe=False)

Ascii85를 사용하여 @ref{193,,바이트열류 객체} `b'를 인코딩하고 인코딩된 @ref{192,,bytes}를 반환합니다.

`foldspaces'는 ‘btoa’ 가 지원하듯이 4개의 연속된 스페이스 (ASCII 0x20) 대신 특수한 짧은 시퀀스 ‘y’ 를 사용하는 선택적 플래그입니다. 이 기능은 “표준” Ascii85 인코딩에서 지원되지 않습니다.

`wrapcol'은 출력에 줄 바꿈 (@code{b'\n'}) 문자가 추가되어야 하는지를 제어합니다. 이것이 0이 아니면, 각 출력 줄의 길이는 후행 줄 바꿈을 제외하고 이 문자 수를 넘지 않습니다.

`pad'는 인코딩하기 전에 입력이 4의 배수로 채워졌는지를 제어합니다. @code{btoa} 구현은 항상 채운다는 것에 유의하십시오.

`adobe'는 인코딩된 바이트 시퀀스가 Adobe 구현에서 사용되는 @code{<~}와 @code{~>}로 프레임화되는지를 제어합니다.


Added in version 3.4.

@end deffn

@geindex a85decode() (base64 모듈)
@anchor{library/base64 base64 a85decode}@anchor{1120}
@deffn {함수} base64.a85decode (b, *, foldspaces=False, adobe=False, ignorechars=b' \t\n\r\x0b')

Ascii85로 인코딩된 @ref{193,,바이트열류 객체}나 ASCII 문자열 `b'를 디코딩하고 디코딩된 @ref{192,,bytes}를 반환합니다.

`foldspaces'는 짧은 시퀀스 ‘y’ 를 4개의 연속 된 스페이스(ASCII 0x20)에 대한 축약으로 받아들여야 하는지를 지정하는 플래그입니다. 이 기능은 “표준” Ascii85 인코딩에서 지원되지 않습니다.

`adobe'는 입력 시퀀스가 Adobe Ascii85 형식인지(즉 <~ 와 ~> 로 프레임화되었는지)를 제어합니다.

`ignorechars' should be a byte string containing characters to ignore
from the input. This should only contain whitespace characters, and by
default contains all whitespace characters in ASCII.


Added in version 3.4.

@end deffn

@geindex b85encode() (base64 모듈)
@anchor{library/base64 base64 b85encode}@anchor{1121}
@deffn {함수} base64.b85encode (b, pad=False)

base85를 사용하여 @ref{193,,바이트열류 객체} `b'를 인코딩하고 (예를 들어 git 스타일 바이너리 diff에서 사용되는 것처럼), 인코딩된 @ref{192,,bytes}를 반환합니다.

`pad'가 참이면, 입력은 @code{b'\0'}으로 채워져서 길이는 인코딩 전에 4바이트의 배수가 됩니다.


Added in version 3.4.

@end deffn

@geindex b85decode() (base64 모듈)
@anchor{library/base64 base64 b85decode}@anchor{1122}
@deffn {함수} base64.b85decode (b)

base85로 인코딩된 @ref{193,,바이트열류 객체}나 ASCII 문자열 `b'를 디코딩하고 디코딩된 @ref{192,,bytes}를 반환합니다. 필요하면, 채우기는 묵시적으로 제거됩니다.


Added in version 3.4.

@end deffn

@geindex z85encode() (base64 모듈)
@anchor{library/base64 base64 z85encode}@anchor{47b}
@deffn {함수} base64.z85encode (s)

(ZeroMQ 에서 사용된) Z85를 사용하여 @ref{193,,바이트열류 객체} `s'를 인코딩하고, 인코딩된 @ref{192,,bytes}를 반환합니다. 더 자세한 내용은 Z85 명세@footnote{https://rfc.zeromq.org/spec/32/}를 참조하세요.


Added in version 3.13.

@end deffn

@geindex z85decode() (base64 모듈)
@anchor{library/base64 base64 z85decode}@anchor{47c}
@deffn {함수} base64.z85decode (s)

Z85로 인코딩된 @ref{193,,바이트열류 객체}나 ASCII 문자열 `s'를 디코딩하고 디코딩된 @ref{192,,bytes}를 반환합니다. 더 자세한 내용은 Z85 명세@footnote{https://rfc.zeromq.org/spec/32/}를 참조하세요.


Added in version 3.13.

@end deffn

@node Legacy Interface,Security Considerations,Base85 Encodings,base64 — Base16 Base32 Base64 Base85 데이터 인코딩
@anchor{library/base64 base64-legacy}@anchor{3ce0}@anchor{library/base64 legacy-interface}@anchor{3cea}
@subsubsection Legacy Interface


@geindex decode() (base64 모듈)
@anchor{library/base64 base64 decode}@anchor{3ceb}
@deffn {함수} base64.decode (input, output)

바이너리 `input' 파일의 내용을 디코딩하고 결과 바이너리 데이터를 `output' 파일에 씁니다. `input'과 `output'은 @ref{13c8,,파일 객체}여야 합니다. `input'은 @code{input.readline()}이 빈 바이트열 객체를 반환할 때까지 읽힙니다.
@end deffn

@geindex decodebytes() (base64 모듈)
@anchor{library/base64 base64 decodebytes}@anchor{b4d}
@deffn {함수} base64.decodebytes (s)

하나 이상의 base64 인코딩된 데이터 줄을 포함해야 하는 @ref{193,,바이트열류 객체} `s'를 디코딩하고 디코딩된 @ref{192,,bytes}를 반환합니다.


Added in version 3.1.

@end deffn

@geindex encode() (base64 모듈)
@anchor{library/base64 base64 encode}@anchor{3cec}
@deffn {함수} base64.encode (input, output)

바이너리 `input' 파일의 내용을 인코딩하고 base64로 인코딩된 결과 데이터를 `output' 파일에 씁니다. `input'과 `output'은 @ref{13c8,,파일 객체}여야 합니다. `input'은 @code{input.read()}이 빈 바이트열 객체를 반환할 때까지 읽힙니다. @ref{3cec,,encode()}는 
@geindex RFC; RFC 2045
RFC 2045@footnote{https://datatracker.ietf.org/doc/html/rfc2045.html}(MIME)에 따라 출력의 76바이트마다 개행 문자(@code{b'\n'})를 삽입할 뿐만 아니라, 항상 출력이 개행 문자로 끝나도록 합니다.
@end deffn

@geindex encodebytes() (base64 모듈)
@anchor{library/base64 base64 encodebytes}@anchor{b4c}
@deffn {함수} base64.encodebytes (s)

임의의 바이너리 데이터를 포함할 수 있는 @ref{193,,바이트열류 객체} `s'를 인코딩하고, 
@geindex RFC; RFC 2045
RFC 2045@footnote{https://datatracker.ietf.org/doc/html/rfc2045.html} (MIME)에 따라 76바이트의 출력마다 개행(@code{b'\n'})이 삽입되고, 후행 개행이 붙은 base64 인코딩된 데이터를 포함하는 @ref{192,,bytes}를 반환합니다.


Added in version 3.1.

@end deffn

모듈 사용 예:

@example
>>> import base64
>>> encoded = base64.b64encode(b'data to be encoded')
>>> encoded
b'ZGF0YSB0byBiZSBlbmNvZGVk'
>>> data = base64.b64decode(encoded)
>>> data
b'data to be encoded'
@end example

@node Security Considerations,,Legacy Interface,base64 — Base16 Base32 Base64 Base85 데이터 인코딩
@anchor{library/base64 base64-security}@anchor{3ced}@anchor{library/base64 security-considerations}@anchor{3cee}
@subsubsection Security Considerations


A new security considerations section was added to 
@geindex RFC; RFC 4648
RFC 4648@footnote{https://datatracker.ietf.org/doc/html/rfc4648.html} (section 12); it’s
recommended to review the security section for any code deployed to production.


@subsubheading 더 보기



@table @asis

@item 모듈 @ref{11,,binascii}

ASCII에서 바이너리로, 바이너리에서 ASCII로의 변환이 포함된 지원 모듈.

@geindex RFC; RFC 1521

@item RFC 1521@footnote{https://datatracker.ietf.org/doc/html/rfc1521.html} - MIME (Multipurpose Internet Mail Extensions) Part One: Mechanisms for Specifying and Describing the Format of Internet Message Bodies

5.2 절, “Base64 Content-Transfer-Encoding” 은 base64 인코딩의 정의를 제공합니다.
@end table


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node binascii — 바이너리와 ASCII 간의 변환,quopri — MIME quoted-printable 데이터 인코딩과 디코딩,base64 — Base16 Base32 Base64 Base85 데이터 인코딩,인터넷 데이터 처리
@anchor{library/binascii doc}@anchor{3cef}@anchor{library/binascii binascii-convert-between-binary-and-ascii}@anchor{3cf0}@anchor{library/binascii module-binascii}@anchor{11}@anchor{library/binascii translation-repo}@anchor{3cf1}
@subsection @code{binascii} — 바이너리와 ASCII 간의 변환


@geindex module; binascii

@geindex 모듈;base64


__________________________________________________________________


The @code{binascii} module contains a number of methods to convert between
binary and various ASCII-encoded binary representations. Normally, you will not
use these functions directly but use wrapper modules like
@ref{f,,base64} instead. The @code{binascii} module contains
low-level functions written in C for greater speed that are used by the
higher-level modules.

@cartouche
@quotation 참고 
@code{a2b_*} 함수는 ASCII 문자만 포함하는 유니코드 문자열을 받아들입니다. 다른 함수는 @ref{193,,바이트열류 객체}(가령 @ref{192,,bytes}, @ref{344,,bytearray} 및 버퍼 프로토콜을 지원하는 다른 객체)만 받아들입니다.


버전 3.3에서 변경: ASCII로만 이루어진 유니코드 문자열은 이제 @code{a2b_*} 함수에서 허용됩니다.

@end quotation
@end cartouche

The @code{binascii} module defines the following functions:

@geindex a2b_uu() (binascii 모듈)
@anchor{library/binascii binascii a2b_uu}@anchor{3cf2}
@deffn {함수} binascii.a2b_uu (string)

한 줄의 UU 인코딩된 데이터 string을 바이너리로 역변환하고 바이너리 데이터를 반환합니다. 마지막 줄을 제외하고는, 줄은 보통 45 (바이너리) 바이트를 포함합니다. 줄 데이터 뒤에는 공백 문자가 올 수 있습니다.
@end deffn

@geindex b2a_uu() (binascii 모듈)
@anchor{library/binascii binascii b2a_uu}@anchor{d15}
@deffn {함수} binascii.b2a_uu (data, *, backtick=False)

바이너리 data를 ASCII 문자의 줄로 변환합니다, 반환 값은 개행 문자를 포함하는 변환 된 줄입니다. `data'의 길이는 최대 45이어야 합니다. `backtick'가 참이면, 0은 스페이스 대신 @code{'`'}으로 표현됩니다.


버전 3.7에서 변경: `backtick' 매개 변수가 추가되었습니다.

@end deffn

@geindex a2b_base64() (binascii 모듈)
@anchor{library/binascii binascii a2b_base64}@anchor{1762}
@deffn {함수} binascii.a2b_base64 (string, /, *, strict_mode=False)

base64 데이터 블록을 바이너리로 역변환하고 바이너리 데이터를 반환합니다. 한 번에 한 줄 이상을 전달할 수 있습니다.

If `strict_mode' is true, only valid base64 data will be converted. Invalid base64
data will raise @ref{1225,,binascii.Error}.

Valid base64:


@itemize *

@item 
Conforms to 
@geindex RFC; RFC 3548
RFC 3548@footnote{https://datatracker.ietf.org/doc/html/rfc3548.html}.

@item 
Contains only characters from the base64 alphabet.

@item 
Contains no excess data after padding (including excess padding, newlines, etc.).

@item 
Does not start with a padding.
@end itemize


버전 3.11에서 변경: `strict_mode' 매개 변수가 추가되었습니다.

@end deffn

@geindex b2a_base64() (binascii 모듈)
@anchor{library/binascii binascii b2a_base64}@anchor{e7a}
@deffn {함수} binascii.b2a_base64 (data, *, newline=True)

바이너리 data를 base64 코딩으로 ASCII 문자의 줄로 변환합니다. 반환 값은 변환된 줄인데, `newline'이 참이면, 개행 문자를 포함합니다. 이 함수의 출력은 
@geindex RFC; RFC 3548
RFC 3548@footnote{https://datatracker.ietf.org/doc/html/rfc3548.html}을 따릅니다.


버전 3.6에서 변경: `newline' 매개 변수가 추가되었습니다.

@end deffn

@geindex a2b_qp() (binascii 모듈)
@anchor{library/binascii binascii a2b_qp}@anchor{3cf3}
@deffn {함수} binascii.a2b_qp (data, header=False)

quoted-printable data 블록을 바이너리로 역변환하고 바이너리 데이터를 반환합니다. 한 번에 한 줄 이상을 전달할 수 있습니다. 선택적 인자 `header'가 있고 참이면, 밑줄(underscore)은 스페이스로 디코딩됩니다.
@end deffn

@geindex b2a_qp() (binascii 모듈)
@anchor{library/binascii binascii b2a_qp}@anchor{3cf4}
@deffn {함수} binascii.b2a_qp (data, quotetabs=False, istext=True, header=False)

바이너리 data를 quoted-printable 인코딩으로 ASCII 문자의 줄로 변환합니다. 반환 값은 변환된 줄입니다. 선택적 인자 `quotetabs'가 있고 참이면, 모든 탭과 스페이스가 인코딩됩니다. 선택적 인자 `istext'가 있고 참이면, 개행 문자는 인코딩되지 않지만, 후행 공백은 인코딩됩니다. 선택적 인자 `header'가 있고 참이면, 스페이스는 
@geindex RFC; RFC 1522
RFC 1522@footnote{https://datatracker.ietf.org/doc/html/rfc1522.html}에 따라 밑줄로 인코딩됩니다. 선택적 인자 `header'가 있고 거짓이면, 개행 문자도 함께 인코딩됩니다; 그렇지 않으면 라인 피드(linefeed) 변환이 바이너리 데이터 스트림을 손상할 수 있습니다.
@end deffn

@geindex crc_hqx() (binascii 모듈)
@anchor{library/binascii binascii crc_hqx}@anchor{93c}
@deffn {함수} binascii.crc_hqx (data, value)

초기 CRC `value'로 시작하는, `data'의 16비트 CRC 값을 계산하고 결과를 반환합니다. 종종 0x1021로 표시되는, CRC-CCITT 다항식 `x'@w{^16} + `x'@w{^12} + `x'@w{^5} + 1을 사용합니다. 이 CRC는 binhex4 형식에서 사용됩니다.
@end deffn

@geindex crc32() (binascii 모듈)
@anchor{library/binascii binascii crc32}@anchor{1a11}
@deffn {함수} binascii.crc32 (data[, value])

초기 CRC `value'로 시작하는, `data'의 부호 없는 32비트 체크섬인 CRC-32를 계산합니다. 기본 초기 CRC는 0입니다. 이 알고리즘은 ZIP 파일 체크섬과 일치합니다. 이 알고리즘은 체크섬 알고리즘으로 사용하도록 설계되었으므로, 일반 해시 알고리즘으로 사용하기에 적합하지 않습니다. 다음과 같이 사용하십시오:

@example
print(binascii.crc32(b"hello world"))
# 또는, 두 조각으로:
crc = binascii.crc32(b"hello")
crc = binascii.crc32(b" world", crc)
print('crc32 = @{:#010x@}'.format(crc))
@end example


버전 3.0에서 변경: The result is always unsigned.

@end deffn

@geindex b2a_hex() (binascii 모듈)
@geindex hexlify() (binascii 모듈)
@anchor{library/binascii binascii b2a_hex}@anchor{28a3}
@deffn {함수} binascii.b2a_hex (data[, sep[, bytes_per_sep=1]])
@anchor{library/binascii binascii hexlify}@anchor{3cf5}
@deffnx {함수} binascii.hexlify (data[, sep[, bytes_per_sep=1]])

바이너리 `data'의 16진수 표현을 반환합니다. `data'의 모든 바이트는 해당 2자리 16진수 표현으로 변환됩니다. 따라서 반환된 바이트열 객체의 길이는 `data' 의 두 배입니다.

비슷한 기능(하지만 텍스트 문자열을 반환하는)을 @ref{f64,,bytes.hex()} 메서드를 사용하여 편리하게 액세스할 수도 있습니다.

`sep'이 지정되면, 단일 문자 문자열이나 바이트열 객체여야 합니다. `bytes_per_sep' 입력 바이트마다 출력에 삽입됩니다. 구분자 배치는 기본적으로 출력의 오른쪽 끝에서부터 계산됩니다. 왼쪽부터 계산하려면, 음수의 `bytes_per_sep' 값을 제공하십시오.

@example
>>> import binascii
>>> binascii.b2a_hex(b'\xb9\x01\xef')
b'b901ef'
>>> binascii.hexlify(b'\xb9\x01\xef', '-')
b'b9-01-ef'
>>> binascii.b2a_hex(b'\xb9\x01\xef', b'_', 2)
b'b9_01ef'
>>> binascii.b2a_hex(b'\xb9\x01\xef', b' ', -2)
b'b901 ef'
@end example


버전 3.8에서 변경: `sep'과 `bytes_per_sep' 매개 변수가 추가되었습니다.

@end deffn

@geindex a2b_hex() (binascii 모듈)
@geindex unhexlify() (binascii 모듈)
@anchor{library/binascii binascii a2b_hex}@anchor{28a4}
@deffn {함수} binascii.a2b_hex (hexstr)
@anchor{library/binascii binascii unhexlify}@anchor{1e22}
@deffnx {함수} binascii.unhexlify (hexstr)

16진수 문자열 `hexstr'로 표현된 바이너리 데이터를 반환합니다. 이 함수는 @ref{28a3,,b2a_hex()}의 역함수입니다. `hexstr'는 짝수개의 16진수(대소문자 모두 가능합니다)를 포함해야 하며, 그렇지 않으면 @ref{1225,,Error} 예외가 발생합니다.

비슷한 기능(텍스트 문자열 인자만 받아들이지만, 공백에 대해 더 느슨한)을 @ref{190,,bytes.fromhex()} 클래스 메서드를 사용하여 액세스할 수도 있습니다.
@end deffn

@geindex Error
@anchor{library/binascii binascii Error}@anchor{1225}
@deffn {예외} binascii.Error

에러 시 발생하는 예외. 이들은 대개 프로그래밍 에러입니다.
@end deffn

@geindex Incomplete
@anchor{library/binascii binascii Incomplete}@anchor{3cf6}
@deffn {예외} binascii.Incomplete

불완전한 데이터에서 발생하는 예외. 이들은 일반적으로 프로그래밍 에러가 아니지만, 조금 더 많은 데이터를 읽고 다시 시도하면 처리될 수 있습니다.
@end deffn


@subsubheading 더 보기



@table @asis

@item 모듈 @ref{f,,base64}

RFC 호환 base64 스타일 인코딩으로, 베이스 16, 32, 64 및 85를 지원합니다.

@item 모듈 @ref{bc,,quopri}

MIME 전자 우편 메시지에 사용되는 quoted-printable 인코딩 지원.
@end table


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node quopri — MIME quoted-printable 데이터 인코딩과 디코딩,,binascii — 바이너리와 ASCII 간의 변환,인터넷 데이터 처리
@anchor{library/quopri doc}@anchor{3cf7}@anchor{library/quopri module-quopri}@anchor{bc}@anchor{library/quopri quopri-encode-and-decode-mime-quoted-printable-data}@anchor{3cf8}@anchor{library/quopri translation-repo}@anchor{3cf9}
@subsection @code{quopri} — MIME quoted-printable 데이터 인코딩과 디코딩


@geindex module; quopri

`소스 코드:' Lib/quopri.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/quopri.py}

@geindex quoted-printable;인코딩
@geindex MIME;quoted-printable 인코딩


__________________________________________________________________


이 모듈은 
@geindex RFC; RFC 1521
RFC 1521@footnote{https://datatracker.ietf.org/doc/html/rfc1521.html}: “MIME (Multipurpose Internet Mail Extensions) 1부: 인터넷 메시지 본문의 형식을 지정하고 설명하기 위한 메커니즘”에 정의된 대로, quoted-printable 전송 인코딩과 디코딩을 수행합니다. quoted-printable 인코딩은 인쇄할 수 없는 문자가 비교적 적은 데이터를 위해 설계되었습니다; @ref{f,,base64} 모듈을 통해 사용할 수 있는 base64 인코딩 체계는 그래픽 파일을 보낼 때와 같이 그런 문자가 많은 경우 더 압축적입니다.

@geindex decode() (quopri 모듈)
@anchor{library/quopri quopri decode}@anchor{28a6}
@deffn {함수} quopri.decode (input, output, header=False)

`input' 파일의 내용을 디코딩하고 결과로 디코딩된 바이너리 데이터를 `output' 파일에 씁니다. `input' 과 `output'는 @ref{13c8,,바이너리 파일 객체} 여야 합니다. 선택적 인자 `header'가 있고 참이면, 밑줄은 스페이스로 디코딩됩니다. 이것은 
@geindex RFC; RFC 1522
RFC 1522@footnote{https://datatracker.ietf.org/doc/html/rfc1522.html}: “MIME (Multipurpose Internet Mail Extensions) 2부: 비 ASCII 텍스트를 위한 메시지 헤더 확장”에서 설명한 대로 “Q”-인코딩된 헤더를 디코딩하는 데 사용됩니다.
@end deffn

@geindex encode() (quopri 모듈)
@anchor{library/quopri quopri encode}@anchor{28a5}
@deffn {함수} quopri.encode (input, output, quotetabs, header=False)

`input' 파일의 내용을 인코딩하고 결과 quoted-printable 데이터를 `output' 파일에 씁니다. `input' 과 `output'은 @ref{13c8,,바이너리 파일 객체} 여야 합니다. `quotetabs'는 포함 된 스페이스와 탭을 인코딩할지를 제어하는 비 선택적 플래그입니다; 참이면 그러한 공백 문자를 인코드하고, 거짓이면 인코드하지 않고 남겨둡니다. 줄 끝에 나타나는 공백과 탭은 
@geindex RFC; RFC 1521
RFC 1521@footnote{https://datatracker.ietf.org/doc/html/rfc1521.html}에 따라 항상 인코딩됨에 유의하십시오. `header'는 스페이스를 
@geindex RFC; RFC 1522
RFC 1522@footnote{https://datatracker.ietf.org/doc/html/rfc1522.html}에 따라 밑줄로 인코딩할지를 제어하는 플래그입니다.
@end deffn

@geindex decodestring() (quopri 모듈)
@anchor{library/quopri quopri decodestring}@anchor{3cfa}
@deffn {함수} quopri.decodestring (s, header=False)

@ref{28a6,,decode()}와 비슷하지만, 소스 @ref{192,,bytes}를 받아들이고 해독된 해당 @code{bytes}를 반환합니다.
@end deffn

@geindex encodestring() (quopri 모듈)
@anchor{library/quopri quopri encodestring}@anchor{3cfb}
@deffn {함수} quopri.encodestring (s, quotetabs=False, header=False)

@ref{28a5,,encode()}와 비슷하지만, 소스 @ref{192,,bytes}를 받아들이고 인코딩된 해당 @code{bytes}를 반환합니다. 기본적으로 @code{encode()} 함수의 `quotetabs' 매개 변수에 @code{False} 값을 보냅니다.
@end deffn


@subsubheading 더 보기



@table @asis

@item 모듈 @ref{f,,base64}

MIME base64 데이터 인코딩과 디코딩
@end table


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 구조화된 마크업 처리 도구,인터넷 프로토콜과 지원,인터넷 데이터 처리,파이썬 표준 라이브러리
@anchor{library/markup doc}@anchor{3cfc}@anchor{library/markup markup}@anchor{3cfd}@anchor{library/markup structured-markup-processing-tools}@anchor{3cfe}@anchor{library/markup translation-repo}@anchor{3cff}
@section 구조화된 마크업 처리 도구


파이썬은 다양한 형태의 구조화된 데이터 마크업을 다루는 다양한 모듈을 지원합니다. 여기에는 SGML (Standard Generalized Markup Language) 및 HTML (Hypertext Markup Language) 을 다루는 모듈과 XML (Extensible Markup Language) 작업을 위한 여러 인터페이스가 포함됩니다.

@menu
* html — 하이퍼텍스트 마크업 언어 지원:: 
* html.parser — 간단한 HTML과 XHTML 구문 분석기: html parser — 간단한 HTML과 XHTML 구문 분석기. 
* html.entities — HTML 일반 엔티티의 정의: html entities — HTML 일반 엔티티의 정의. 
* XML 처리 모듈:: 
* xml.etree.ElementTree — ElementTree XML API: xml etree ElementTree — ElementTree XML API. 
* xml.dom — 문서 객체 모델 API: xml dom — 문서 객체 모델 API. 
* xml.dom.minidom — 최소 DOM 구현: xml dom minidom — 최소 DOM 구현. 
* xml.dom.pulldom — 부분 DOM 트리 구축 지원: xml dom pulldom — 부분 DOM 트리 구축 지원. 
* xml.sax — SAX2 구문 분석기 지원: xml sax — SAX2 구문 분석기 지원. 
* xml.sax.handler — SAX 처리기의 베이스 클래스: xml sax handler — SAX 처리기의 베이스 클래스. 
* xml.sax.saxutils — SAX 유틸리티: xml sax saxutils — SAX 유틸리티. 
* xml.sax.xmlreader — XML 구문 분석기 인터페이스: xml sax xmlreader — XML 구문 분석기 인터페이스. 
* xml.parsers.expat — Expat을 사용한 빠른 XML 구문 분석: xml parsers expat — Expat을 사용한 빠른 XML 구문 분석. 

@end menu

@node html — 하이퍼텍스트 마크업 언어 지원,html parser — 간단한 HTML과 XHTML 구문 분석기,,구조화된 마크업 처리 도구
@anchor{library/html doc}@anchor{3d00}@anchor{library/html html-hypertext-markup-language-support}@anchor{3d01}@anchor{library/html module-html}@anchor{6f}
@subsection @code{html} — 하이퍼텍스트 마크업 언어 지원


@geindex module; html

`소스 코드:' Lib/html/__init__.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/html/__init__.py}


__________________________________________________________________


이 모듈은 HTML을 조작하는 유틸리티를 정의합니다.

@geindex escape() (html 모듈)
@anchor{library/html html escape}@anchor{120d}
@deffn {함수} html.escape (s, quote=True)

Convert the characters @code{&}, @code{<} and @code{>} in string `s' to HTML-safe
sequences.  Use this if you need to display text that might contain such
characters in HTML.  If the optional flag `quote' is true (the default), the
characters (@code{"}) and (@code{'}) are also translated; this helps for inclusion
in an HTML attribute value delimited by quotes, as in @code{<a href="...">}.
If `quote' is set to false, the characters (@code{"}) and (@code{'}) are not
translated.


Added in version 3.2.

@end deffn

@geindex unescape() (html 모듈)
@anchor{library/html html unescape}@anchor{b50}
@deffn {함수} html.unescape (s)

문자열 `s'의 모든 이름과 숫자 문자 참조(예를 들어, @code{&gt;}, @code{&#62;}, @code{&#x3e;})를 해당 유니코드 문자로 변환합니다. 이 함수는 유효하거나 유효하지 않은 문자 참조 모두에 대해 HTML 5 표준에 정의된 규칙과 @ref{12d7,,HTML 5 이름 문자 참조 목록}을 사용합니다.


Added in version 3.4.

@end deffn


__________________________________________________________________


@code{html} 패키지의 서브 모듈은 다음과 같습니다:


@itemize *

@item 
@ref{71,,html.parser} – 관대한 구문 분석 모드가 있는 HTML/XHTML 구문 분석기

@item 
@ref{70,,html.entities} – HTML 엔티티 정의
@end itemize

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node html parser — 간단한 HTML과 XHTML 구문 분석기,html entities — HTML 일반 엔티티의 정의,html — 하이퍼텍스트 마크업 언어 지원,구조화된 마크업 처리 도구
@anchor{library/html parser doc}@anchor{3d02}@anchor{library/html parser html-parser-simple-html-and-xhtml-parser}@anchor{3d03}@anchor{library/html parser module-html parser}@anchor{71}@anchor{library/html parser translation-repo}@anchor{3d04}
@subsection @code{html.parser} — 간단한 HTML과 XHTML 구문 분석기


@geindex module; html.parser

`소스 코드:' Lib/html/parser.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/html/parser.py}

@geindex HTML
@geindex XHTML


__________________________________________________________________


이 모듈은 HTML(HyperText Mark-up Language)와 XHTML 형식의 텍스트 파일을 구문 분석하기 위한 기초로 사용되는 클래스 @ref{a77,,HTMLParser}를 정의합니다.

@geindex HTMLParser (html.parser 클래스)
@anchor{library/html parser html parser HTMLParser}@anchor{a77}
@deffn {클래스} html.parser.HTMLParser (*, convert_charrefs=True, scripting=False)

잘못된 마크업을 구문 분석할 수 있는 구문 분석기 인스턴스를 만듭니다.

If `convert_charrefs' is true (the default), all character
references (except the ones in elements like @code{script} and @code{style}) are
automatically converted to the corresponding Unicode characters.

If `scripting' is false (the default), the content of the @code{noscript}
element is parsed normally; if it’s true, it’s returned as is without
being parsed.

@ref{a77,,HTMLParser} 인스턴스는 HTML 데이터를 받아서 시작 태그, 종료 태그, 텍스트, 주석 및 기타 마크업 요소를 만날 때마다 처리기 메서드를 호출합니다. 사용자는 원하는 동작을 구현하기 위해 @code{HTMLParser}의 서브 클래스를 만들고 해당 메서드를 재정의해야 합니다.

이 구문 분석기는 종료 태그가 시작 태그와 일치하는지 검사하거나, 바깥(outer) 요소를 닫음으로써 묵시적으로 닫힌 요소에 대해 종료 태그 처리기를 호출하지 않습니다.


버전 3.4에서 변경: `convert_charrefs' 키워드 인자가 추가되었습니다.



버전 3.5에서 변경: 인자 `convert_charrefs'의 기본값은 이제 @code{True}입니다.



버전 3.14.1에서 변경: Added the `scripting' parameter.

@end deffn

@menu
* HTML 구문 분석기 응용 프로그램 예제:: 
* HTMLParser 메서드:: 
* 예제: 예제<22>. 

@end menu

@node HTML 구문 분석기 응용 프로그램 예제,HTMLParser 메서드,,html parser — 간단한 HTML과 XHTML 구문 분석기
@anchor{library/html parser example-html-parser-application}@anchor{3d05}
@subsubsection HTML 구문 분석기 응용 프로그램 예제


As a basic example, below is a simple HTML parser that uses the
@ref{a77,,HTMLParser} class to print out start tags, end tags, and data
as they are encountered:

@example
from html.parser import HTMLParser

class MyHTMLParser(HTMLParser):
    def handle_starttag(self, tag, attrs):
        print("Encountered a start tag:", tag)

    def handle_endtag(self, tag):
        print("Encountered an end tag :", tag)

    def handle_data(self, data):
        print("Encountered some data  :", data)

parser = MyHTMLParser()
parser.feed('<html><head><title>Test</title></head>'
            '<body><h1>Parse me!</h1></body></html>')
@end example

출력은 다음과 같습니다:

@example
Encountered a start tag: html
Encountered a start tag: head
Encountered a start tag: title
Encountered some data  : Test
Encountered an end tag : title
Encountered an end tag : head
Encountered a start tag: body
Encountered a start tag: h1
Encountered some data  : Parse me!
Encountered an end tag : h1
Encountered an end tag : body
Encountered an end tag : html
@end example

@node HTMLParser 메서드,예제<22>,HTML 구문 분석기 응용 프로그램 예제,html parser — 간단한 HTML과 XHTML 구문 분석기
@anchor{library/html parser htmlparser-methods}@anchor{3d06}
@subsubsection @code{HTMLParser} 메서드


@ref{a77,,HTMLParser} 인스턴스에는 다음과 같은 메서드가 있습니다:

@geindex feed() (html.parser.HTMLParser 메서드)
@anchor{library/html parser html parser HTMLParser feed}@anchor{3d07}
@deffn {메서드} HTMLParser.feed (data)

구문 분석기에 텍스트를 입력합니다. 완전한 요소로 구성되어있는 부분까지 처리됩니다; 불완전한 데이터는 더 많은 데이터가 공급되거나 @ref{1843,,close()}가 호출될 때까지 버퍼링 됩니다. `data'는 @ref{169,,str}이어야 합니다.
@end deffn

@geindex close() (html.parser.HTMLParser 메서드)
@anchor{library/html parser html parser HTMLParser close}@anchor{1843}
@deffn {메서드} HTMLParser.close ()

버퍼링 된 모든 데이터를 마치 파일 끝(end-of-file) 표시가 붙은 것처럼 처리합니다. 이 메서드는 파생 클래스에 의해 입력 끝에서의 추가 처리를 정의하기 위해 재정의될 수 있지만, 재정의된 버전에서는 항상 @ref{a77,,HTMLParser} 베이스 클래스 메서드인 @ref{1843,,close()}를 호출해야 합니다.
@end deffn

@geindex reset() (html.parser.HTMLParser 메서드)
@anchor{library/html parser html parser HTMLParser reset}@anchor{3d08}
@deffn {메서드} HTMLParser.reset ()

인스턴스를 재설정합니다. 처리되지 않은 모든 데이터를 잃습니다. 이것은 인스턴스 생성 시에 묵시적으로 호출됩니다.
@end deffn

@geindex getpos() (html.parser.HTMLParser 메서드)
@anchor{library/html parser html parser HTMLParser getpos}@anchor{3d09}
@deffn {메서드} HTMLParser.getpos ()

현재의 줄 번호와 오프셋(offset)을 반환합니다.
@end deffn

@geindex get_starttag_text() (html.parser.HTMLParser 메서드)
@anchor{library/html parser html parser HTMLParser get_starttag_text}@anchor{3d0a}
@deffn {메서드} HTMLParser.get_starttag_text ()

가장 최근에 열렸던 시작 태그의 텍스트를 반환합니다. 이것은 일반적으로 구조화된 처리에 필요하지 않지만, “배치된 대로(as deployed)” HTML을 다루거나 최소한의 변경(어트리뷰트 사이의 공백을 보존할 수 있음, 등등)으로 입력을 다시 생성하는 데 유용할 수 있습니다.
@end deffn

다음 메서드는 데이터나 마크업 요소를 만날 때 호출되며 서브 클래스에서 재정의하려는 용도입니다. 베이스 클래스 구현은 아무 일도 하지 않습니다 (@ref{3d0b,,handle_startendtag()}는 예외입니다).:

@geindex handle_starttag() (html.parser.HTMLParser 메서드)
@anchor{library/html parser html parser HTMLParser handle_starttag}@anchor{3d0c}
@deffn {메서드} HTMLParser.handle_starttag (tag, attrs)

이 메서드는 엘리먼트의 시작 태그(예를 들어, @code{<div id="main">})를 처리하기 위해 호출됩니다.

`tag' 인자는 소문자로 변환된 태그의 이름입니다. `attrs' 인자는 태그의 @code{<>} 화살괄호 안에 있는 어트리뷰트를 포함하는 @code{(name, value)} 쌍의 리스트입니다. `name'은 소문자로 변환되고, `value'의 따옴표는 제거되고, 문자와 엔티티 참조는 치환됩니다.

예를 들어, 태그 @code{<A HREF="https://www.cwi.nl/">}의 경우, 이 메서드는 @code{handle_starttag('a', [('href', 'https://www.cwi.nl/')])}로 호출됩니다.

@ref{70,,html.entities}의 모든 엔티티 참조가 어트리뷰트 값에서 치환됩니다.
@end deffn

@geindex handle_endtag() (html.parser.HTMLParser 메서드)
@anchor{library/html parser html parser HTMLParser handle_endtag}@anchor{3d0d}
@deffn {메서드} HTMLParser.handle_endtag (tag)

이 메서드는 요소의 종료 태그(예를 들어, @code{</div>})를 처리하기 위해 호출됩니다.

`tag' 인자는 소문자로 변환된 태그의 이름입니다.
@end deffn

@geindex handle_startendtag() (html.parser.HTMLParser 메서드)
@anchor{library/html parser html parser HTMLParser handle_startendtag}@anchor{3d0b}
@deffn {메서드} HTMLParser.handle_startendtag (tag, attrs)

@ref{3d0c,,handle_starttag()}와 비슷하지만, 구문 분석기가 XHTML 스타일의 빈 태그(@code{<img ... />})를 만날 때 호출됩니다. 이 메서드는 이 특정의 어휘 정보(lexical information)가 필요한 서브 클래스에 의해 재정의될 수 있습니다; 기본 구현은 단순히 @code{handle_starttag()}와 @ref{3d0d,,handle_endtag()}를 호출합니다.
@end deffn

@geindex handle_data() (html.parser.HTMLParser 메서드)
@anchor{library/html parser html parser HTMLParser handle_data}@anchor{3d0e}
@deffn {메서드} HTMLParser.handle_data (data)

This method is called to process arbitrary data (e.g. text nodes and the
content of elements like @code{script} and @code{style}).
@end deffn

@geindex handle_entityref() (html.parser.HTMLParser 메서드)
@anchor{library/html parser html parser HTMLParser handle_entityref}@anchor{3d0f}
@deffn {메서드} HTMLParser.handle_entityref (name)

This method is called to process a named character reference of the form
@code{&name;} (e.g. @code{&gt;}), where `name' is a general entity reference
(e.g. @code{'gt'}).
This method is only called if `convert_charrefs' is false.
@end deffn

@geindex handle_charref() (html.parser.HTMLParser 메서드)
@anchor{library/html parser html parser HTMLParser handle_charref}@anchor{3d10}
@deffn {메서드} HTMLParser.handle_charref (name)

This method is called to process decimal and hexadecimal numeric character
references of the form @code{&#@var{NNN};} and @code{&#x@var{NNN};}.  For example, the decimal
equivalent for @code{&gt;} is @code{&#62;}, whereas the hexadecimal is @code{&#x3E;};
in this case the method will receive @code{'62'} or @code{'x3E'}.
This method is only called if `convert_charrefs' is false.
@end deffn

@geindex handle_comment() (html.parser.HTMLParser 메서드)
@anchor{library/html parser html parser HTMLParser handle_comment}@anchor{3d11}
@deffn {메서드} HTMLParser.handle_comment (data)

이 메서드는 주석을 만날 때 호출됩니다 (예를 들어, @code{<!--comment-->}).

예를 들어, 주석 @code{<!-- comment -->}는 이 메서드가 인자 @code{' comment '}로 호출되도록 합니다.

Internet Explorer 조건부 주석(condcoms)의 내용도 이 메서드로 보내지므로, @code{<!--[if IE 9]>IE9-specific content<![endif]-->}의 경우, 이 메서드는 @code{'[if IE 9]>IE9-specific content<![endif]'}를 받습니다.
@end deffn

@geindex handle_decl() (html.parser.HTMLParser 메서드)
@anchor{library/html parser html parser HTMLParser handle_decl}@anchor{3d12}
@deffn {메서드} HTMLParser.handle_decl (decl)

이 메서드는 HTML doctype 선언(예를 들어, @code{<!DOCTYPE html>})을 처리하기 위해 호출됩니다.

`decl' 매개 변수는 @code{<!...>} 마크업 내의 선언 전체 내용입니다 (예를 들어, @code{'DOCTYPE html'}).
@end deffn

@geindex handle_pi() (html.parser.HTMLParser 메서드)
@anchor{library/html parser html parser HTMLParser handle_pi}@anchor{3d13}
@deffn {메서드} HTMLParser.handle_pi (data)

처리 명령(processing instruction)을 만날 때 호출되는 메서드. `data' 매개 변수에는 전체 처리 명령이 포함됩니다. 예를 들어, 처리 명령 @code{<?proc color='red'>}의 경우, 이 메서드는 @code{handle_pi("proc color='red'")}로 호출됩니다. 파생 클래스에 의해 재정의되려는 목적입니다; 베이스 클래스 구현은 아무것도 수행하지 않습니다.

@cartouche
@quotation 참고 
@ref{a77,,HTMLParser} 클래스는 처리 명령에 대해 SGML 구문 규칙을 사용합니다. 후행 @code{'?'}를 사용하는 XHTML 처리 명령은 @code{'?'}가 `data'에 포함되도록 합니다.
@end quotation
@end cartouche
@end deffn

@geindex unknown_decl() (html.parser.HTMLParser 메서드)
@anchor{library/html parser html parser HTMLParser unknown_decl}@anchor{3d14}
@deffn {메서드} HTMLParser.unknown_decl (data)

이 메서드는 구문 분석기가 인식할 수 없는 선언을 읽었을 때 호출됩니다.

`data' 매개 변수는 @code{<![...]>} 마크업 안에 있는 선언의 전체 내용입니다. 파생 클래스가 재정의하는 것이 때때로 유용합니다. 베이스 클래스 구현은 아무것도 수행하지 않습니다.
@end deffn

@node 예제<22>,,HTMLParser 메서드,html parser — 간단한 HTML과 XHTML 구문 분석기
@anchor{library/html parser examples}@anchor{3d15}@anchor{library/html parser htmlparser-examples}@anchor{3d16}
@subsubsection 예제


The following class implements a parser that will be used to illustrate more
examples:

@example
from html.parser import HTMLParser
from html.entities import name2codepoint

class MyHTMLParser(HTMLParser):
    def handle_starttag(self, tag, attrs):
        print("Start tag:", tag)
        for attr in attrs:
            print("     attr:", attr)

    def handle_endtag(self, tag):
        print("End tag  :", tag)

    def handle_data(self, data):
        print("Data     :", data)

    def handle_comment(self, data):
        print("Comment  :", data)

    def handle_entityref(self, name):
        c = chr(name2codepoint[name])
        print("Named ent:", c)

    def handle_charref(self, name):
        if name.startswith('x'):
            c = chr(int(name[1:], 16))
        else:
            c = chr(int(name))
        print("Num ent  :", c)

    def handle_decl(self, data):
        print("Decl     :", data)

parser = MyHTMLParser()
@end example

Parsing a doctype:

@example
>>> parser.feed('<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" '
...             '"http://www.w3.org/TR/html4/strict.dtd">')
Decl     : DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"
@end example

Parsing an element with a few attributes and a title:

@example
>>> parser.feed('<img src="python-logo.png" alt="The Python logo">')
Start tag: img
     attr: ('src', 'python-logo.png')
     attr: ('alt', 'The Python logo')
>>>
>>> parser.feed('<h1>Python</h1>')
Start tag: h1
Data     : Python
End tag  : h1
@end example

The content of elements like @code{script} and @code{style} is returned as is,
without further parsing:

@example
>>> parser.feed('<style type="text/css">#python @{ color: green @}</style>')
Start tag: style
     attr: ('type', 'text/css')
Data     : #python @{ color: green @}
End tag  : style

>>> parser.feed('<script type="text/javascript">'
...             'alert("<strong>hello! &#9786;</strong>");</script>')
Start tag: script
     attr: ('type', 'text/javascript')
Data     : alert("<strong>hello! &#9786;</strong>");
End tag  : script
@end example

Parsing comments:

@example
>>> parser.feed('<!--a comment-->'
...             '<!--[if IE 9]>IE-specific content<![endif]-->')
Comment  : a comment
Comment  : [if IE 9]>IE-specific content<![endif]
@end example

Parsing named and numeric character references and converting them to the
correct char (note: these 3 references are all equivalent to @code{'>'}):

@example
>>> parser = MyHTMLParser()
>>> parser.feed('&gt;&#62;&#x3E;')
Data     : >>>

>>> parser = MyHTMLParser(convert_charrefs=False)
>>> parser.feed('&gt;&#62;&#x3E;')
Named ent: >
Num ent  : >
Num ent  : >
@end example

Feeding incomplete chunks to @ref{3d07,,feed()} works, but
@ref{3d0e,,handle_data()} might be called more than once
if `convert_charrefs' is false:

@example
>>> for chunk in ['<sp', 'an>buff', 'ered', ' text</s', 'pan>']:
...     parser.feed(chunk)
...
Start tag: span
Data     : buff
Data     : ered
Data     :  text
End tag  : span
@end example

Parsing invalid HTML (e.g. unquoted attributes) also works:

@example
>>> parser.feed('<p><a class=link href=#main>tag soup</p ></a>')
Start tag: p
Start tag: a
     attr: ('class', 'link')
     attr: ('href', '#main')
Data     : tag soup
End tag  : p
End tag  : a
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node html entities — HTML 일반 엔티티의 정의,XML 처리 모듈,html parser — 간단한 HTML과 XHTML 구문 분석기,구조화된 마크업 처리 도구
@anchor{library/html entities doc}@anchor{3d17}@anchor{library/html entities html-entities-definitions-of-html-general-entities}@anchor{3d18}@anchor{library/html entities module-html entities}@anchor{70}@anchor{library/html entities translation-repo}@anchor{3d19}
@subsection @code{html.entities} — HTML 일반 엔티티의 정의


@geindex module; html.entities

`소스 코드:' Lib/html/entities.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/html/entities.py}


__________________________________________________________________


이 모듈은 네 가지 딕셔너리 @ref{12d7,,html5}, @ref{3d1a,,name2codepoint}, @ref{3d1b,,codepoint2name} 와 @ref{3d1c,,entitydefs}를 정의합니다.

@geindex html5 (html.entities 모듈)
@anchor{library/html entities html entities html5}@anchor{12d7}
@deffn {데이터} html.entities.html5

HTML5 이름 문자 참조 @footnote{
@indicateurl{https://html.spec.whatwg.org/multipage/named-characters.html#named-character-references} 를 참조하십시오.
} 를 해당 유니코드 문자에 매핑하는 딕셔너리, 예를 들어 @code{html5['gt;'] == '>'}. 후미 세미콜론이 이름에 포함됨에 유의하십시오 (예를 들어 @code{'gt;'}). 하지만 일부 이름은 세미콜론 없이도 표준에서 허용됩니다: 이럴 때 이름은 @code{';'}가 있거나 없는 형태가 모두 포함됩니다. @ref{b50,,html.unescape()}도 참조하십시오.


Added in version 3.3.

@end deffn

@geindex entitydefs (html.entities 모듈)
@anchor{library/html entities html entities entitydefs}@anchor{3d1c}
@deffn {데이터} html.entities.entitydefs

XHTML 1.0 엔티티 정의를 ISO Latin-1의 치환 텍스트에 매핑하는 딕셔너리.
@end deffn

@geindex name2codepoint (html.entities 모듈)
@anchor{library/html entities html entities name2codepoint}@anchor{3d1a}
@deffn {데이터} html.entities.name2codepoint

HTML4 엔티티 이름을 유니코드 코드 포인트에 매핑하는 딕셔너리.
@end deffn

@geindex codepoint2name (html.entities 모듈)
@anchor{library/html entities html entities codepoint2name}@anchor{3d1b}
@deffn {데이터} html.entities.codepoint2name

유니코드 코드 포인트를 HTML4 엔티티 이름에 매핑하는 딕셔너리.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node XML 처리 모듈,xml etree ElementTree — ElementTree XML API,html entities — HTML 일반 엔티티의 정의,구조화된 마크업 처리 도구
@anchor{library/xml doc}@anchor{3d1d}@anchor{library/xml module-xml}@anchor{126}@anchor{library/xml translation-repo}@anchor{3d1e}@anchor{library/xml xml}@anchor{3d1f}@anchor{library/xml xml-processing-modules}@anchor{3d20}
@subsection XML 처리 모듈


@geindex module; xml

`소스 코드:' Lib/xml/@footnote{https://github.com/python/cpython/tree/3.14/Lib/xml/}


__________________________________________________________________


XML 처리를 위한 파이썬의 인터페이스는 @code{xml} 패키지로 묶여있습니다.

@cartouche
@quotation 참고 
If you need to parse untrusted or unauthenticated data, see
@ref{3d21,,XML security}.
@end quotation
@end cartouche

It is important to note that modules in the @code{xml} package require that
there be at least one SAX-compliant XML parser available. The Expat parser is
included with Python, so the @ref{12c,,xml.parsers.expat} module will always be
available.

@ref{127,,xml.dom} 과 @ref{12f,,xml.sax} 패키지에 대한 설명서는 DOM과 SAX 인터페이스에 대한 파이썬 바인딩의 정의입니다.

XML 처리 서브 모듈은 다음과 같습니다:


@itemize *

@item 
@ref{12b,,xml.etree.ElementTree}: ElementTree API, 간단하고 가벼운 XML 프로세서
@end itemize



@itemize *

@item 
@ref{127,,xml.dom}: DOM API 정의

@item 
@ref{128,,xml.dom.minidom}: 최소 DOM 구현

@item 
@ref{129,,xml.dom.pulldom}: 부분 DOM 트리 구축 지원
@end itemize



@itemize *

@item 
@ref{12f,,xml.sax}: SAX2 베이스 클래스와 편리 함수

@item 
@ref{12c,,xml.parsers.expat}: Expat 구문 분석기 바인딩
@end itemize
@anchor{library/xml xml-security}@anchor{3d21}
@menu
* XML security:: 

@end menu

@node XML security,,,XML 처리 모듈
@anchor{library/xml id1}@anchor{3d22}@anchor{library/xml xml-vulnerabilities}@anchor{3d23}
@subsubsection XML security


An attacker can abuse XML features to carry out denial of service attacks,
access local files, generate network connections to other machines, or
circumvent firewalls when attacker-controlled XML is being parsed,
in Python or elsewhere.

The built-in XML parsers of Python rely on the library libexpat@footnote{https://github.com/libexpat/libexpat}, commonly
called Expat, for parsing XML.

By default, Expat itself does not access local files or create network
connections.

Expat versions lower than 2.7.2 may be vulnerable to the “billion laughs”,
“quadratic blowup” and “large tokens” vulnerabilities, or to disproportional
use of dynamic memory.
Python bundles a copy of Expat, and whether Python uses the bundled or a
system-wide Expat, depends on how the Python interpreter
@ref{1b2b,,has been configured} in your environment.
Python may be vulnerable if it uses such older versions of Expat.
Check @code{pyexpat.EXPAT_VERSION}.

@ref{133,,xmlrpc} is `vulnerable' to the “decompression bomb” attack.


@table @asis

@item billion laughs(억만 웃음) / exponential entity expansion(지수적 엔티티 확장)

지수적 엔티티 확장으로도 알려진, Billion Laughs@footnote{https://en.wikipedia.org/wiki/Billion_laughs} 공격은 여러 수준의 중첩된 엔티티를 사용합니다. 각 엔티티는 다른 엔티티를 여러 번 참조하며, 최종 엔티티 정의에는 작은 문자열이 포함됩니다. 지수적인 확장으로 수 기가바이트의 텍스트가 생성되고 많은 메모리와 CPU 시간이 소모됩니다.

@item quadratic blowup entity expansion(이차 폭발 엔티티 확장)

이차 폭발 공격은 Billion Laughs@footnote{https://en.wikipedia.org/wiki/Billion_laughs} 공격과 유사합니다; 이 역시 엔티티 확장을 남용합니다. 중첩된 엔티티 대신 2천 개 이상의 문자를 갖는 커다란 엔티티 하나를 계속 반복합니다. 공격은 지수적인 경우만큼 효율적이지 않지만 깊이 중첩된 엔티티를 금지하는 구문 분석기 대응책을 우회합니다.

@item decompression bomb(압축해제 폭탄)

압축 해제 폭탄(일명 ZIP bomb@footnote{https://en.wikipedia.org/wiki/Zip_bomb})은 gzip 압축된 HTTP 스트림이나 LZMA 압축 파일과 같은, 압축된 XML 스트림을 구문 분석할 수 있는 모든 XML 라이브러리에 적용됩니다. 공격자는 전송된 데이터의 양을 3배 이상 줄일 수 있습니다.

@item large tokens(대형 토큰)

Expat needs to re-parse unfinished tokens; without the protection
introduced in Expat 2.6.0, this can lead to quadratic runtime that can
be used to cause denial of service in the application parsing XML.
The issue is known as 
@geindex Common Vulnerabilities and Exposures; CVE 2023-52425
CVE 2023-52425@footnote{https://www.cve.org/CVERecord?id=CVE-2023-52425}.
@end table

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node xml etree ElementTree — ElementTree XML API,xml dom — 문서 객체 모델 API,XML 처리 모듈,구조화된 마크업 처리 도구
@anchor{library/xml etree elementtree doc}@anchor{3d24}@anchor{library/xml etree elementtree module-xml etree ElementTree}@anchor{12b}@anchor{library/xml etree elementtree translation-repo}@anchor{3d25}@anchor{library/xml etree elementtree xml-etree-elementtree-the-elementtree-xml-api}@anchor{3d26}
@subsection @code{xml.etree.ElementTree} — ElementTree XML API


@geindex module; xml.etree.ElementTree

`소스 코드:' Lib/xml/etree/ElementTree.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/xml/etree/ElementTree.py}


__________________________________________________________________


The @code{xml.etree.ElementTree} module implements a simple and efficient API
for parsing and creating XML data.


버전 3.3에서 변경: 이 모듈은 가능할 때마다 빠른 구현을 사용합니다.



버전 3.3부터 폐지됨: @code{xml.etree.cElementTree} 모듈은 폐지되었습니다.


@cartouche
@quotation 참고 
If you need to parse untrusted or unauthenticated data, see
@ref{3d21,,XML security}.
@end quotation
@end cartouche

@menu
* 자습서: 자습서<2>. 
* XPath 지원:: 
* 레퍼런스: 레퍼런스<2>. 
* XInclude 지원:: 
* 레퍼런스: 레퍼런스<3>. 

@end menu

@node 자습서<2>,XPath 지원,,xml etree ElementTree — ElementTree XML API
@anchor{library/xml etree elementtree tutorial}@anchor{3d27}
@subsubsection 자습서


This is a short tutorial for using @code{xml.etree.ElementTree} (@code{ET} in
short).  The goal is to demonstrate some of the building blocks and basic
concepts of the module.

@menu
* XML 트리와 엘리먼트:: 
* XML 구문 분석하기:: 
* 비 블로킹 구문 분석을 위한 풀(pull) API: 비 블로킹 구문 분석을 위한 풀 pull API. 
* 흥미로운 엘리먼트 찾기:: 
* XML 파일 수정하기:: 
* XML 문서 구축하기:: 
* 이름 공간이 있는 XML 구문 분석하기:: 

@end menu

@node XML 트리와 엘리먼트,XML 구문 분석하기,,자습서<2>
@anchor{library/xml etree elementtree xml-tree-and-elements}@anchor{3d28}
@subsubsection XML 트리와 엘리먼트


XML은 본질적으로 위계적(hierarchical) 데이터 형식이며, 이를 나타내는 가장 자연스러운 방법은 트리를 사용하는 것입니다. @code{ET}에는 이 목적을 위한 두 가지 클래스가 있습니다 - @ref{b47,,ElementTree}는 전체 XML 문서를 트리로 나타내고, @ref{363,,Element}는 이 트리에 있는 단일 노드를 나타냅니다. 전체 문서와의 상호 작용(파일 읽기와 쓰기)은 일반적으로 @code{ElementTree} 수준에서 수행됩니다. 단일 XML 엘리먼트와 해당 서브 엘리먼트와의 상호 작용은 @code{Element} 수준에서 수행됩니다.

@node XML 구문 분석하기,비 블로킹 구문 분석을 위한 풀 pull API,XML 트리와 엘리먼트,자습서<2>
@anchor{library/xml etree elementtree elementtree-parsing-xml}@anchor{3d29}@anchor{library/xml etree elementtree parsing-xml}@anchor{3d2a}
@subsubsection XML 구문 분석하기


이 섹션의 샘플 데이터로 가상의 @code{country_data.xml} XML 문서를 사용합니다:

@example
<?xml version="1.0"?>
<data>
    <country name="Liechtenstein">
        <rank>1</rank>
        <year>2008</year>
        <gdppc>141100</gdppc>
        <neighbor name="Austria" direction="E"/>
        <neighbor name="Switzerland" direction="W"/>
    </country>
    <country name="Singapore">
        <rank>4</rank>
        <year>2011</year>
        <gdppc>59900</gdppc>
        <neighbor name="Malaysia" direction="N"/>
    </country>
    <country name="Panama">
        <rank>68</rank>
        <year>2011</year>
        <gdppc>13600</gdppc>
        <neighbor name="Costa Rica" direction="W"/>
        <neighbor name="Colombia" direction="E"/>
    </country>
</data>
@end example

파일을 읽어서 이 데이터를 가져올 수 있습니다:

@example
import xml.etree.ElementTree as ET
tree = ET.parse('country_data.xml')
root = tree.getroot()
@end example

또는 문자열에서 직접:

@example
root = ET.fromstring(country_data_as_string)
@end example

@ref{3d2b,,fromstring()}은 문자열에서 @ref{363,,Element}로 XML을 직접 구문 분석하는데, 구문 분석된 트리의 루트 엘리먼트입니다. 다른 구문 분석 함수는 @ref{b47,,ElementTree}를 만들 수 있습니다. 설명서를 확인하십시오.

@ref{363,,Element}로서, @code{root}에는 태그(tag)와 어트리뷰트 딕셔너리가 있습니다:

@example
>>> root.tag
'data'
>>> root.attrib
@{@}
@end example

또한 우리가 이터레이트 할 수 있는 자식 노드가 있습니다:

@example
>>> for child in root:
...     print(child.tag, child.attrib)
...
country @{'name': 'Liechtenstein'@}
country @{'name': 'Singapore'@}
country @{'name': 'Panama'@}
@end example

자식은 중첩되며, 인덱스로 특정 자식 노드에 액세스 할 수 있습니다:

@example
>>> root[0][1].text
'2008'
@end example

@cartouche
@quotation 참고 
XML 입력의 모든 엘리먼트가 구문 분석된 트리의 엘리먼트가 되는 것은 아닙니다. 현재, 이 모듈은 입력에서 XML 주석, 처리 명령(processing instructions) 및 문서 형 선언(document type declarations)을 건너뜁니다. 그런데도, XML 텍스트를 구문 분석하는 대신 이 모듈의 API를 사용하여 만들어진 트리에는 주석과 처리 명령이 있을 수 있습니다; 이들은 XML 출력을 생성할 때 포함됩니다. 사용자 정의 @ref{c49,,TreeBuilder} 인스턴스를 @ref{c48,,XMLParser} 생성자에 전달하여 문서 형 선언에 액세스 할 수 있습니다.
@end quotation
@end cartouche

@node 비 블로킹 구문 분석을 위한 풀 pull API,흥미로운 엘리먼트 찾기,XML 구문 분석하기,자습서<2>
@anchor{library/xml etree elementtree elementtree-pull-parsing}@anchor{11f3}@anchor{library/xml etree elementtree pull-api-for-non-blocking-parsing}@anchor{3d2c}
@subsubsection 비 블로킹 구문 분석을 위한 풀(pull) API


이 모듈이 제공하는 대부분의 구문 분석 함수는 결과를 반환하기 전에 전체 문서를 한 번에 읽도록 요구합니다. @ref{c48,,XMLParser}를 사용하고 점진적으로 데이터를 공급하는 것이 가능하지만, 콜백 대상에 메서드를 호출하는 푸시(push) API로, 대부분의 경우 너무 저 수준이고 불편합니다. 때로 사용자가 실제로 원하는 것은 완전히 구성된 @ref{363,,Element} 객체의 편리함을 즐기면서 연산을 블로킹하지 않고 XML을 점진적으로 구문 분석할 수 있는 것입니다.

이를 위한 가장 강력한 도구는 @ref{11f2,,XMLPullParser} 입니다. XML 데이터를 얻기 위해 블로킹 읽기가 필요하지 않으며, 대신 @ref{3d2d,,XMLPullParser.feed()} 호출을 통해 점진적으로 데이터가 제공됩니다. 구문 분석된 XML 엘리먼트를 얻으려면, @ref{3d2e,,XMLPullParser.read_events()}를 호출하십시오. 예를 들면 다음과 같습니다:

@example
>>> parser = ET.XMLPullParser(['start', 'end'])
>>> parser.feed('<mytag>sometext')
>>> list(parser.read_events())
[('start', <Element 'mytag' at 0x7fa66db2be58>)]
>>> parser.feed(' more text</mytag>')
>>> for event, elem in parser.read_events():
...     print(event)
...     print(elem.tag, 'text=', elem.text)
...
end
mytag text= sometext more text
@end example

명백한 사용 사례는 XML 데이터가 소켓에서 수신되거나 일부 저장 장치에서 점진적으로 읽히는 비 블로킹 방식으로 작동하는 응용 프로그램입니다. 이럴 때, 블로킹 읽기는 허용되지 않습니다.

@ref{11f2,,XMLPullParser}는 매우 유연하기 때문에 더 단순한 사용 사례에 사용하기 불편할 수 있습니다. 응용 프로그램이 XML 데이터 읽기를 블로킹해도 상관없지만, 여전히 점진적인 구문 분석 기능이 필요하면, @ref{579,,iterparse()}를 살펴보십시오. 큰 XML 문서를 읽을 때 메모리에 전체를 저장하지 않으려는 경우 유용할 수 있습니다.

Where `immediate' feedback through events is wanted, calling method
@ref{576,,XMLPullParser.flush()} can help reduce delay;
please make sure to study the related security notes.

@node 흥미로운 엘리먼트 찾기,XML 파일 수정하기,비 블로킹 구문 분석을 위한 풀 pull API,자습서<2>
@anchor{library/xml etree elementtree finding-interesting-elements}@anchor{3d2f}
@subsubsection 흥미로운 엘리먼트 찾기


@ref{363,,Element}에는 그 아래의 모든 서브 트리(자식, 자식의 자식 등)를 재귀적으로 이터레이트 하는 데 도움을 주는 유용한 메서드가 있습니다. 예를 들어, @ref{1553,,Element.iter()}:

@example
>>> for neighbor in root.iter('neighbor'):
...     print(neighbor.attrib)
...
@{'name': 'Austria', 'direction': 'E'@}
@{'name': 'Switzerland', 'direction': 'W'@}
@{'name': 'Malaysia', 'direction': 'N'@}
@{'name': 'Costa Rica', 'direction': 'W'@}
@{'name': 'Colombia', 'direction': 'E'@}
@end example

@ref{187f,,Element.findall()}은 현재 엘리먼트의 직접적인 자식인 태그가 있는 엘리먼트만 찾습니다. @ref{187d,,Element.find()}는 특정 태그가 있는 `첫 번째' 자식을 찾고, @ref{3d30,,Element.text}는 엘리먼트의 텍스트 내용에 액세스합니다. @ref{3d31,,Element.get()}은 엘리먼트의 어트리뷰트에 액세스합니다:

@example
>>> for country in root.findall('country'):
...     rank = country.find('rank').text
...     name = country.get('name')
...     print(name, rank)
...
Liechtenstein 1
Singapore 4
Panama 68
@end example

@ref{da5,,XPath}를 사용하면 찾을 엘리먼트를 더 정교하게 지정할 수 있습니다.

@node XML 파일 수정하기,XML 문서 구축하기,흥미로운 엘리먼트 찾기,자습서<2>
@anchor{library/xml etree elementtree modifying-an-xml-file}@anchor{3d32}
@subsubsection XML 파일 수정하기


@ref{b47,,ElementTree}는 XML 문서를 구축하고 파일에 쓰는 간단한 방법을 제공합니다. @ref{c8b,,ElementTree.write()} 메서드가 이 용도입니다.

일단 만들어지면, @ref{363,,Element} 객체는 필드(가령 @ref{3d30,,Element.text})를 직접 변경하고, 어트리뷰트를 추가하고 수정(@ref{3d33,,Element.set()} 메서드)하는 것뿐만 아니라 새로운 자식을 추가하여 (예를 들어 @ref{3d34,,Element.append()}) 조작 할 수 있습니다.

각각의 국가(country)의 순위(rank)에 1을 더하고, rank 엘리먼트에 @code{updated} 어트리뷰트를 추가하고 싶다고 합시다:

@example
>>> for rank in root.iter('rank'):
...     new_rank = int(rank.text) + 1
...     rank.text = str(new_rank)
...     rank.set('updated', 'yes')
...
>>> tree.write('output.xml')
@end example

우리의 XML은 이제 다음과 같습니다:

@example
<?xml version="1.0"?>
<data>
    <country name="Liechtenstein">
        <rank updated="yes">2</rank>
        <year>2008</year>
        <gdppc>141100</gdppc>
        <neighbor name="Austria" direction="E"/>
        <neighbor name="Switzerland" direction="W"/>
    </country>
    <country name="Singapore">
        <rank updated="yes">5</rank>
        <year>2011</year>
        <gdppc>59900</gdppc>
        <neighbor name="Malaysia" direction="N"/>
    </country>
    <country name="Panama">
        <rank updated="yes">69</rank>
        <year>2011</year>
        <gdppc>13600</gdppc>
        <neighbor name="Costa Rica" direction="W"/>
        <neighbor name="Colombia" direction="E"/>
    </country>
</data>
@end example

@ref{1879,,Element.remove()}를 사용하여 엘리먼트를 제거할 수 있습니다. rank가 50보다 큰 모든 국가를 제거하려고 한다고 합시다:

@example
>>> for country in root.findall('country'):
...     # root.findall() 를 사용하여 순회 중 제거를 피합니다
...     rank = int(country.find('rank').text)
...     if rank > 50:
...         root.remove(country)
...
>>> tree.write('output.xml')
@end example

이터레이션 하는 동안 동시 수정은 파이썬 리스트나 딕셔너리를 이터레이션 할 때와 마찬가지로 문제를 유발할 수 있음에 유의하십시오. 따라서, 이 예제에서는 먼저 @code{root.findall()}로 일치하는 모든 엘리먼트를 수집한 다음, 일치 항목 리스트를 이터레이트 합니다.

우리의 XML은 이제 다음과 같습니다:

@example
<?xml version="1.0"?>
<data>
    <country name="Liechtenstein">
        <rank updated="yes">2</rank>
        <year>2008</year>
        <gdppc>141100</gdppc>
        <neighbor name="Austria" direction="E"/>
        <neighbor name="Switzerland" direction="W"/>
    </country>
    <country name="Singapore">
        <rank updated="yes">5</rank>
        <year>2011</year>
        <gdppc>59900</gdppc>
        <neighbor name="Malaysia" direction="N"/>
    </country>
</data>
@end example

@node XML 문서 구축하기,이름 공간이 있는 XML 구문 분석하기,XML 파일 수정하기,자습서<2>
@anchor{library/xml etree elementtree building-xml-documents}@anchor{3d35}
@subsubsection XML 문서 구축하기


@ref{3d36,,SubElement()} 함수는 주어진 엘리먼트에 대해 새로운 서브 엘리먼트를 만드는 편리한 방법을 제공합니다:

@example
>>> a = ET.Element('a')
>>> b = ET.SubElement(a, 'b')
>>> c = ET.SubElement(a, 'c')
>>> d = ET.SubElement(c, 'd')
>>> ET.dump(a)
<a><b /><c><d /></c></a>
@end example

@node 이름 공간이 있는 XML 구문 분석하기,,XML 문서 구축하기,자습서<2>
@anchor{library/xml etree elementtree parsing-xml-with-namespaces}@anchor{3d37}
@subsubsection 이름 공간이 있는 XML 구문 분석하기


XML 입력에 이름 공간(namespaces)@footnote{https://en.wikipedia.org/wiki/XML_namespace}이 있으면, @code{prefix:sometag} 형식의 접두사가 있는 태그와 어트리뷰트는 @code{@{uri@}sometag}로 확장되는데, 여기서 `prefix'는 전체 `URI'로 대체됩니다. 또한 기본 이름 공간(default namespace)@footnote{https://www.w3.org/TR/xml-names/#defaulting}이 있으면, 그 전체 URI가 접두사가 없는 모든 태그 앞에 추가됩니다.

다음은 두 개의 이름 공간을 통합한 XML 예제입니다, 하나는 접두사가 “fictional”이고 다른 하나는 기본 이름 공간으로 사용됩니다:

@example
<?xml version="1.0"?>
<actors xmlns:fictional="http://characters.example.com"
        xmlns="http://people.example.com">
    <actor>
        <name>John Cleese</name>
        <fictional:character>Lancelot</fictional:character>
        <fictional:character>Archie Leach</fictional:character>
    </actor>
    <actor>
        <name>Eric Idle</name>
        <fictional:character>Sir Robin</fictional:character>
        <fictional:character>Gunther</fictional:character>
        <fictional:character>Commander Clement</fictional:character>
    </actor>
</actors>
@end example

이 XML 예제를 검색하고 탐색하는 한 가지 방법은 @ref{187d,,find()}나 @ref{187f,,findall()}의 xpath에 있는 모든 태그나 어트리뷰트에 URI를 수동으로 추가하는 것입니다:

@example
root = fromstring(xml_text)
for actor in root.findall('@{http://people.example.com@}actor'):
    name = actor.find('@{http://people.example.com@}name')
    print(name.text)
    for char in actor.findall('@{http://characters.example.com@}character'):
        print(' |-->', char.text)
@end example

이름 공간이 있는 XML 예제를 검색하는 더 좋은 방법은 여러분 자신의 접두사가 담긴 딕셔너리를 만들고 검색 함수에서 사용하는 것입니다:

@example
ns = @{'real_person': 'http://people.example.com',
      'role': 'http://characters.example.com'@}

for actor in root.findall('real_person:actor', ns):
    name = actor.find('real_person:name', ns)
    print(name.text)
    for char in actor.findall('role:character', ns):
        print(' |-->', char.text)
@end example

이 두 가지 방법 모두 다음과 같이 출력합니다:

@example
John Cleese
 |--> Lancelot
 |--> Archie Leach
Eric Idle
 |--> Sir Robin
 |--> Gunther
 |--> Commander Clement
@end example

@node XPath 지원,레퍼런스<2>,자습서<2>,xml etree ElementTree — ElementTree XML API
@anchor{library/xml etree elementtree elementtree-xpath}@anchor{da5}@anchor{library/xml etree elementtree xpath-support}@anchor{3d38}
@subsubsection XPath 지원


이 모듈은 트리에서 엘리먼트를 찾기 위해 XPath 표현식@footnote{https://www.w3.org/TR/xpath}을 제한적으로 지원합니다. 목표는 축약된 문법의 작은 부분 집합을 지원하는 것입니다; 완전한 XPath 엔진은 이 모듈의 범위를 벗어납니다.

@menu
* 예: 예<8>. 
* 지원되는 XPath 문법:: 

@end menu

@node 예<8>,지원되는 XPath 문법,,XPath 지원
@anchor{library/xml etree elementtree example}@anchor{3d39}
@subsubsection 예


다음은 모듈의 일부 XPath 기능을 보여주는 예입니다. @ref{3d29,,XML 구문 분석하기} 섹션의 @code{countrydata} XML 문서를 사용할 것입니다:

@example
import xml.etree.ElementTree as ET

root = ET.fromstring(countrydata)

# 최상위 엘리먼트
root.findall(".")

# 최상위 엘리먼트의 모든 'country' 자식의 'neighbor' 손자
root.findall("./country/neighbor")

# 'year' 자식이 있고 name='Singapore'인 노드
root.findall(".//year/..[@@name='Singapore']")

# name='Singapore'인 노드의 자식인 'year' 노드
root.findall(".//*[@@name='Singapore']/year")

# 부모의 두 번째 자식인 모든 'neighbor' 노드
root.findall(".//neighbor[2]")
@end example

이름 공간이 있는 XML의 경우, 일반적인 정규화된 @code{@{namespace@}tag} 표기법을 사용하십시오:

@example
# 문서의 모든 더블린 코어(dublin-core) "title" 태그
root.findall(".//@{http://purl.org/dc/elements/1.1/@}title")
@end example

@node 지원되는 XPath 문법,,예<8>,XPath 지원
@anchor{library/xml etree elementtree supported-xpath-syntax}@anchor{3d3a}
@subsubsection 지원되는 XPath 문법



@multitable {xxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

문법

@tab

의미

@item

@code{tag}

@tab

주어진 태그를 가진 모든 자식 엘리먼트를 선택합니다. 예를 들어, @code{spam}은 @code{spam}이라는 모든 자식 엘리먼트를 선택하고, @code{spam/egg}는 @code{spam}이라는 모든 자식의 @code{egg}라는 모든 손자를 선택합니다. @code{@{namespace@}*}는 지정된 이름 공간의 모든 태그를 선택하고, @code{@{*@}spam}은 모든 이름 공간의 (또는 이름 공간이 없는) @code{spam}이라는 태그를 선택하고, @code{@{@}*}은 이름 공간이 없는 태그만 선택합니다.


버전 3.8에서 변경: 애스터리스크 와일드카드 지원이 추가되었습니다.


@item

@code{*}

@tab

주석과 처리 명령을 포함한 모든 자식 엘리먼트를 선택합니다. 예를 들어, @code{*/egg}는 @code{egg}라는 모든 손자를 선택합니다.

@item

@code{.}

@tab

현재 노드를 선택합니다. 상대 경로임을 나타내기 위해 경로의 시작 부분에서 주로 유용합니다.

@item

@code{//}

@tab

현재 엘리먼트 아래의 모든 수준에서 모든 서브 엘리먼트를 선택합니다. 예를 들어, @code{.//egg}는 전체 트리에서 모든 @code{egg} 엘리먼트를 선택합니다.

@item

@code{..}

@tab

부모 엘리먼트를 선택합니다. 경로가 (엘리먼트 @code{find}가 호출된) 시작 엘리먼트의 조상에 도달하려고 하면 @code{None}을 반환합니다.

@item

@code{[@@attrib]}

@tab

주어진 어트리뷰트를 가진 모든 엘리먼트를 선택합니다.

@item

@code{[@@attrib='value']}

@tab

주어진 어트리뷰트가 주어진 값을 갖는 모든 엘리먼트를 선택합니다. 값은 따옴표를 포함할 수 없습니다.

@item

@code{[@@attrib!='value']}

@tab

주어진 어트리뷰트가 주어진 값을 갖지 않는 모든 엘리먼트를 선택합니다. 값은 따옴표를 포함할 수 없습니다.


Added in version 3.10.


@item

@code{[tag]}

@tab

@code{tag}라는 자식이 있는 모든 엘리먼트를 선택합니다. 직계 자식만 지원됩니다.

@item

@code{[.='text']}

@tab

자손을 포함한 전체 텍스트 내용이 주어진 @code{text}와 같은 모든 엘리먼트를 선택합니다.


Added in version 3.7.


@item

@code{[.!='text']}

@tab

자손을 포함한 전체 텍스트 내용이 주어진 @code{text}와 다른 모든 엘리먼트를 선택합니다.


Added in version 3.10.


@item

@code{[tag='text']}

@tab

자손을 포함한 전체 텍스트 내용이 지정된 @code{text}와 같은 이름이 @code{tag}인 자식이 있는 모든 엘리먼트를 선택합니다.

@item

@code{[tag!='text']}

@tab

자손을 포함한 전체 텍스트 내용이 지정된 @code{text}와 다른 이름이 @code{tag}인 자식이 있는 모든 엘리먼트를 선택합니다.


Added in version 3.10.


@item

@code{[position]}

@tab

주어진 위치(position)에 있는 모든 엘리먼트를 선택합니다. 위치(position)는 정수(1이 첫 번째 위치입니다), 표현식 @code{last()} (마지막 위치) 또는 마지막 위치에 상대적인 위치(예를 들어 @code{last()-1})일 수 있습니다.

@end multitable


술어 (대괄호 안에 있는 표현식) 앞에는 태그 이름, 애스터리스크 또는 다른 술어가 와야 합니다. @code{position} 술어 앞에는 태그 이름이 와야 합니다.

@node 레퍼런스<2>,XInclude 지원,XPath 지원,xml etree ElementTree — ElementTree XML API
@anchor{library/xml etree elementtree reference}@anchor{3d3b}
@subsubsection 레퍼런스


@menu
* 함수: 함수<8>. 

@end menu

@node 함수<8>,,,레퍼런스<2>
@anchor{library/xml etree elementtree elementtree-functions}@anchor{3d3c}@anchor{library/xml etree elementtree functions}@anchor{3d3d}
@subsubsection 함수


@geindex canonicalize() (xml.etree.ElementTree 모듈)
@anchor{library/xml etree elementtree xml etree ElementTree canonicalize}@anchor{c47}
@deffn {함수} xml.etree.ElementTree.canonicalize (xml_data=None, *, out=None, from_file=None, **options)

C14N 2.0@footnote{https://www.w3.org/TR/xml-c14n2/} 변환 함수.

규범화(canonicalization)는 바이트 단위 비교와 디지털 서명을 허용하는 방식으로 XML 출력을 정규화하는 방법입니다. XML 직렬화기가 갖는 자유도를 줄이고 대신 더 제한된 XML 표현을 생성합니다. 주요 제한 사항은 이름 공간 선언의 배치, 어트리뷰트의 순서 및 무시할 수 있는 공백입니다.

이 함수는 XML 데이터 문자열(`xml_data')이나 파일 경로 또는 파일류 객체(`from_file')를 입력으로 받아서, 규범적 형식으로 변환한 후, 제공된다면 `out' 파일(류) 객체를 사용하여 기록하고, 그렇지 않으면 텍스트 문자열로 반환합니다. 출력 파일은 바이트열이 아닌 텍스트를 받습니다. 따라서 @code{utf-8} 인코딩을 사용하여 텍스트 모드로 열어야 합니다.

일반적인 사용:

@example
xml_data = "<root>...</root>"
print(canonicalize(xml_data))

with open("c14n_output.xml", mode='w', encoding='utf-8') as out_file:
    canonicalize(xml_data, out=out_file)

with open("c14n_output.xml", mode='w', encoding='utf-8') as out_file:
    canonicalize(from_file="inputfile.xml", out=out_file)
@end example

구성 `options'는 다음과 같습니다:


@itemize -

@item 
`with_comments': 주석을 포함하려면 참으로 설정합니다 (기본값: 거짓).

@item 

@table @asis

@item `strip_text': 텍스트 내용 전후의 공백을 제거하려면 참으로 설정합니다

(기본값: 거짓)
@end table

@item 

@table @asis

@item `rewrite_prefixes': 이름 공간 접두사를 “n@{number@}” 로 바꾸려면 참으로 설정합니다

(기본값: 거짓)
@end table

@item 

@table @asis

@item `qname_aware_tags': 텍스트 내용에서 접두사를 대체해야 하는 qname 인식 태그 이름 집합

(기본값: 비어 있음)
@end table

@item 

@table @asis

@item `qname_aware_attrs': 텍스트 내용에서 접두사를 대체해야 하는 qname 인식 어트리뷰트 이름 집합

(기본값: 비어 있음)
@end table

@item 
`exclude_attrs': 직렬화하면 안 되는 어트리뷰트 이름 집합

@item 
`exclude_tags': 직렬화하면 안 되는 태그 이름 집합
@end itemize

위의 옵션 목록에서, “집합”은 문자열의 모든 컬렉션이나 이터러블을 가리키며, 순서는 고려하지 않습니다.


Added in version 3.8.

@end deffn

@geindex Comment() (xml.etree.ElementTree 모듈)
@anchor{library/xml etree elementtree xml etree ElementTree Comment}@anchor{3d3e}
@deffn {함수} xml.etree.ElementTree.Comment (text=None)

주석 엘리먼트 팩토리. 이 팩토리 함수는 표준 직렬화기가 XML 주석으로 직렬화할 특수 엘리먼트를 만듭니다. 주석 문자열은 바이트 문자열이나 유니코드 문자열일 수 있습니다. `text'는 주석 문자열이 포함된 문자열입니다. 주석을 나타내는 엘리먼트 인스턴스를 반환합니다.

@ref{c48,,XMLParser}는 주석 객체를 만드는 대신 입력에서 주석을 건너뜀에 유의하십시오. @ref{b47,,ElementTree}는 @ref{363,,Element} 메서드 중 하나를 사용하여 트리에 삽입된 주석 노드만 포함합니다.
@end deffn

@geindex dump() (xml.etree.ElementTree 모듈)
@anchor{library/xml etree elementtree xml etree ElementTree dump}@anchor{3d3f}
@deffn {함수} xml.etree.ElementTree.dump (elem)

엘리먼트 트리나 엘리먼트 구조를 sys.stdout에 씁니다. 이 함수는 디버깅에만 사용해야 합니다.

정확한 출력 형식은 구현에 따라 다릅니다. 이 버전에서는, 일반 XML 파일로 기록됩니다.

`elem'은 엘리먼트 트리나 개별 엘리먼트입니다.


버전 3.8에서 변경: @ref{3d3f,,dump()} 함수는 이제 사용자가 지정한 어트리뷰트 순서를 유지합니다.

@end deffn

@geindex fromstring() (xml.etree.ElementTree 모듈)
@anchor{library/xml etree elementtree xml etree ElementTree fromstring}@anchor{3d2b}
@deffn {함수} xml.etree.ElementTree.fromstring (text, parser=None)

문자열 상수에서 XML 섹션을 구문 분석합니다. @ref{3d40,,XML()}과 같습니다. `text'는 XML 데이터를 포함하는 문자열입니다. `parser'는 선택적 구문 분석기 인스턴스입니다. 지정하지 않으면, 표준 @ref{c48,,XMLParser} 구문 분석기가 사용됩니다. @ref{363,,Element} 인스턴스를 반환합니다.
@end deffn

@geindex fromstringlist() (xml.etree.ElementTree 모듈)
@anchor{library/xml etree elementtree xml etree ElementTree fromstringlist}@anchor{13d6}
@deffn {함수} xml.etree.ElementTree.fromstringlist (sequence, parser=None)

문자열 조각의 시퀀스에서 XML 문서를 구문 분석합니다. `sequence'는 XML 데이터 조각을 포함하는 리스트나 다른 시퀀스입니다. `parser'는 선택적 구문 분석기 인스턴스입니다. 지정하지 않으면 표준 @ref{c48,,XMLParser} 구문 분석기가 사용됩니다. @ref{363,,Element} 인스턴스를 반환합니다.


Added in version 3.2.

@end deffn

@geindex indent() (xml.etree.ElementTree 모듈)
@anchor{library/xml etree elementtree xml etree ElementTree indent}@anchor{3d41}
@deffn {함수} xml.etree.ElementTree.indent (tree, space='  ', level=0)

트리를 시각적으로 들여쓰기하기 위해 서브 트리에 공백을 추가합니다. 이것은 예쁘게 인쇄된 XML 출력을 생성하는 데 사용될 수 있습니다. `tree'는 Element나 ElementTree 일 수 있습니다. `space'는 각 들여쓰기 수준에 삽입되는 공백 문자열이며 기본적으로 두 개의 스페이스 문자입니다. 이미 들여쓰기 된 트리 내부에서 부분 서브 트리를 들여 쓰려면, 초기 들여쓰기 수준을 `level'로 전달하십시오.


Added in version 3.9.

@end deffn

@geindex iselement() (xml.etree.ElementTree 모듈)
@anchor{library/xml etree elementtree xml etree ElementTree iselement}@anchor{3d42}
@deffn {함수} xml.etree.ElementTree.iselement (element)

객체가 유효한 엘리먼트 객체로 보이는지 확인합니다. `element'는 엘리먼트 인스턴스입니다. 이것이 엘리먼트 객체이면 @code{True}를 반환합니다.
@end deffn

@geindex iterparse() (xml.etree.ElementTree 모듈)
@anchor{library/xml etree elementtree xml etree ElementTree iterparse}@anchor{579}
@deffn {함수} xml.etree.ElementTree.iterparse (source, events=None, parser=None)

XML 섹션을 엘리먼트 트리로 점진적으로 구문 분석하고, 사용자에게 진행 중인 작업을 보고합니다. `source'는 파일명이나 XML 데이터를 포함하는 @ref{13c8,,파일 객체}입니다. `events'는 보고할 이벤트의 시퀀스입니다. 지원되는 이벤트는 문자열 @code{"start"}, @code{"end"}, @code{"comment"}, @code{"pi"}, @code{"start-ns"} 및 @code{"end-ns"}입니다 (“ns” 이벤트는 자세한 이름 공간 정보를 얻는 데 사용됩니다). `events'를 생략하면, @code{"end"} 이벤트만 보고됩니다. `parser'는 선택적 구문 분석기 인스턴스입니다. 지정하지 않으면 표준 @ref{c48,,XMLParser} 구문 분석기가 사용됩니다. `parser'는 @code{XMLParser}의 서브 클래스여야 하며 기본 @ref{c49,,TreeBuilder} 만 대상으로 사용할 수 있습니다. @code{(event, elem)} 쌍을 제공하는 @ref{4ca,,이터레이터}를 반환합니다; `source'가 완전히 읽힌 후 결과 XML 트리의 루트 엘리먼트를 참조하는 @code{root} 어트리뷰트가 있습니다. 이터레이터는 `source'가 파일명일 때, 내부 파일 객체를 닫는 @code{close()} 메서드를 제공합니다.

@ref{579,,iterparse()}는 점진적으로 트리를 구축하지만, `source'(또는 그 이름의 파일)에 대한 블로킹 읽기를 유발함에 유의하십시오. 따라서, 블로킹 읽기를 할 수 없는 응용 프로그램에는 적합하지 않습니다. 완전한 비 블로킹 구문 분석에 대해서는 @ref{11f2,,XMLPullParser}를 참조하십시오.

@cartouche
@quotation 참고 
@ref{579,,iterparse()}는 “start” 이벤트를 방출할 때 시작 태그의 “>” 문자를 보았다는 것만 보장해서, 어트리뷰트는 정의되지만, 텍스트의 내용과 테일(tail) 어트리뷰트는 그 시점에 정의되지 않습니다. 자식 엘리먼트에도 마찬가지로 적용됩니다; 그들은 존재할 수도 그렇지 않을 수도 있습니다.

완전히 채워진 엘리먼트가 필요하면, 대신 “end” 이벤트를 찾으십시오.
@end quotation
@end cartouche


버전 3.4부터 폐지됨: `parser' 인자.



버전 3.8에서 변경: @code{comment}와 @code{pi} 이벤트가 추가되었습니다.



버전 3.13에서 변경: Added the @code{close()} method.

@end deffn

@geindex parse() (xml.etree.ElementTree 모듈)
@anchor{library/xml etree elementtree xml etree ElementTree parse}@anchor{3d43}
@deffn {함수} xml.etree.ElementTree.parse (source, parser=None)

XML 섹션을 엘리먼트 트리로 구문 분석합니다. `source'는 XML 데이터를 포함하는 파일명이나 파일 객체입니다. `parser'는 선택적 구문 분석기 인스턴스입니다. 지정하지 않으면 표준 @ref{c48,,XMLParser} 구문 분석기가 사용됩니다. @ref{b47,,ElementTree} 인스턴스를 반환합니다.
@end deffn

@geindex ProcessingInstruction() (xml.etree.ElementTree 모듈)
@anchor{library/xml etree elementtree xml etree ElementTree ProcessingInstruction}@anchor{3d44}
@deffn {함수} xml.etree.ElementTree.ProcessingInstruction (target, text=None)

PI 엘리먼트 팩토리. 이 팩토리 함수는 XML 처리 명령으로 직렬화될 특수 엘리먼트를 만듭니다. `target'은 PI 대상을 포함하는 문자열입니다. 주어지면, `text'는 PI 내용을 포함하는 문자열입니다. 처리 명령을 나타내는 엘리먼트 인스턴스를 반환합니다.

@ref{c48,,XMLParser}는 PI 객체를 작성하는 대신 입력에서 처리 명령을 건너뜀에 유의하십시오. @ref{b47,,ElementTree}는 @ref{363,,Element} 메서드 중 하나를 사용하여 트리에 삽입된 처리 명령 노드만 포함합니다.
@end deffn

@geindex register_namespace() (xml.etree.ElementTree 모듈)
@anchor{library/xml etree elementtree xml etree ElementTree register_namespace}@anchor{13d7}
@deffn {함수} xml.etree.ElementTree.register_namespace (prefix, uri)

이름 공간 접두사를 등록합니다. 레지스트리는 전역적이며, 지정된 접두사나 이름 공간 URI에 대한 기존 매핑이 제거됩니다. `prefix'는 이름 공간 접두사입니다. `uri'는 이름 공간 URI입니다. 이 이름 공간의 태그와 어트리뷰트는 가능하다면 주어진 접두사로 직렬화됩니다.


Added in version 3.2.

@end deffn

@geindex SubElement() (xml.etree.ElementTree 모듈)
@anchor{library/xml etree elementtree xml etree ElementTree SubElement}@anchor{3d36}
@deffn {함수} xml.etree.ElementTree.SubElement (parent, tag, attrib=@{@}, **extra)

서브 엘리먼트 팩토리. 이 함수는 엘리먼트 인스턴스를 만들어 기존 엘리먼트에 추가합니다.

엘리먼트 이름, 어트리뷰트 이름 및 어트리뷰트 값은 바이트 문자열이나 유니코드 문자열일 수 있습니다. `parent'는 부모 엘리먼트입니다. `tag'는 서브 엘리먼트 이름입니다. `attrib'는 엘리먼트 어트리뷰트를 포함하는 선택적 딕셔너리입니다. `extra'에는 키워드 인자로 지정된 추가 어트리뷰트가 포함됩니다. 엘리먼트 인스턴스를 반환합니다.
@end deffn

@geindex tostring() (xml.etree.ElementTree 모듈)
@anchor{library/xml etree elementtree xml etree ElementTree tostring}@anchor{11f4}
@deffn {함수} xml.etree.ElementTree.tostring (element, encoding='us-ascii', method='xml', *, xml_declaration=None, default_namespace=None, short_empty_elements=True)

모든 서브 엘리먼트를 포함하는, XML 엘리먼트의 문자열 표현을 생성합니다. `element'는 @ref{363,,Element} 인스턴스입니다. `encoding' @footnote{
XML 출력에 포함된 인코딩 문자열은 적절한 표준을 준수해야 합니다. 예를 들어, “UTF-8”은 유효하지만, “UTF8”은 유효하지 않습니다. @indicateurl{https://www.w3.org/TR/2006/REC-xml11-20060816/#NT-EncodingDecl} and @indicateurl{https://www.iana.org/assignments/character-sets/character-sets.xhtml} 을 참조하십시오.
} 은 출력 인코딩입니다 (기본값은 US-ASCII입니다). @code{encoding="unicode"}를 사용하여 유니코드 문자열을 생성하십시오 (그렇지 않으면 바이트 문자열이 생성됩니다). `method'는 @code{"xml"}, @code{"html"} 또는 @code{"text"}입니다 (기본값은 @code{"xml"}입니다). `xml_declaration', `default_namespace' 및 `short_empty_elements'는 @ref{c8b,,ElementTree.write()}에서와 같은 의미입니다. XML 데이터를 포함하는 (선택적으로) 인코딩된 문자열을 반환합니다.


버전 3.4에서 변경: `short_empty_elements' 매개 변수를 추가했습니다.



버전 3.8에서 변경: `xml_declaration'과 `default_namespace' 매개 변수를 추가했습니다.



버전 3.8에서 변경: @ref{11f4,,tostring()} 함수는 이제 사용자가 지정한 어트리뷰트 순서를 유지합니다.

@end deffn

@geindex tostringlist() (xml.etree.ElementTree 모듈)
@anchor{library/xml etree elementtree xml etree ElementTree tostringlist}@anchor{11f5}
@deffn {함수} xml.etree.ElementTree.tostringlist (element, encoding='us-ascii', method='xml', *, xml_declaration=None, default_namespace=None, short_empty_elements=True)

모든 서브 엘리먼트를 포함하는, XML 엘리먼트의 문자열 표현을 생성합니다. `element'는 @ref{363,,Element} 인스턴스입니다. `encoding' @footnote{
XML 출력에 포함된 인코딩 문자열은 적절한 표준을 준수해야 합니다. 예를 들어, “UTF-8”은 유효하지만, “UTF8”은 유효하지 않습니다. @indicateurl{https://www.w3.org/TR/2006/REC-xml11-20060816/#NT-EncodingDecl} and @indicateurl{https://www.iana.org/assignments/character-sets/character-sets.xhtml} 을 참조하십시오.
} 은 출력 인코딩입니다 (기본값은 US-ASCII입니다). @code{encoding="unicode"}를 사용하여 유니코드 문자열을 생성하십시오 (그렇지 않으면 바이트 문자열이 생성됩니다). `method'는 @code{"xml"}, @code{"html"} 또는 @code{"text"}입니다 (기본값은 @code{"xml"}입니다). `xml_declaration', `default_namespace' 및 `short_empty_elements'는 @ref{c8b,,ElementTree.write()}에서와 같은 의미입니다. XML 데이터가 포함된 (선택적으로) 인코딩된 문자열의 리스트를 반환합니다. @code{b"".join(tostringlist(element)) == tostring(element)}라는 사실을 제외하고는, 특정 시퀀스를 보장하지는 않습니다.


Added in version 3.2.



버전 3.4에서 변경: `short_empty_elements' 매개 변수를 추가했습니다.



버전 3.8에서 변경: `xml_declaration'과 `default_namespace' 매개 변수를 추가했습니다.



버전 3.8에서 변경: @ref{11f5,,tostringlist()} 함수는 이제 사용자가 지정한 어트리뷰트 순서를 유지합니다.

@end deffn

@geindex XML() (xml.etree.ElementTree 모듈)
@anchor{library/xml etree elementtree xml etree ElementTree XML}@anchor{3d40}
@deffn {함수} xml.etree.ElementTree.XML (text, parser=None)

문자열 상수에서 XML 섹션을 구문 분석합니다. 이 함수는 “XML 리터럴”을 파이썬 코드에 내장시키는 데 사용할 수 있습니다. `text'는 XML 데이터를 포함하는 문자열입니다. `parser'는 선택적 구문 분석기 인스턴스입니다. 지정하지 않으면 표준 @ref{c48,,XMLParser} 구문 분석기가 사용됩니다. @ref{363,,Element} 인스턴스를 반환합니다.
@end deffn

@geindex XMLID() (xml.etree.ElementTree 모듈)
@anchor{library/xml etree elementtree xml etree ElementTree XMLID}@anchor{3d45}
@deffn {함수} xml.etree.ElementTree.XMLID (text, parser=None)

문자열 상수에서 XML 섹션을 구문 분석하고, 엘리먼트 id:s 를 엘리먼트로 매핑하는 딕셔너리도 반환합니다. `text'는 XML 데이터를 포함하는 문자열입니다. `parser'는 선택적 구문 분석기 인스턴스입니다. 지정하지 않으면 표준 @ref{c48,,XMLParser} 구문 분석기가 사용됩니다. @ref{363,,Element} 인스턴스와 딕셔너리를 포함하는 튜플을 반환합니다.
@end deffn

@node XInclude 지원,레퍼런스<3>,레퍼런스<2>,xml etree ElementTree — ElementTree XML API
@anchor{library/xml etree elementtree elementtree-xinclude}@anchor{3d46}@anchor{library/xml etree elementtree xinclude-support}@anchor{3d47}
@subsubsection XInclude 지원


이 모듈은 @ref{12a,,xml.etree.ElementInclude} 도우미 모듈을 통해 XInclude 지시어@footnote{https://www.w3.org/TR/xinclude/}를 제한적으로 지원합니다. 이 모듈은 트리의 정보를 기반으로, 서브 트리와 텍스트 문자열을 엘리먼트 트리에 삽입하는 데 사용할 수 있습니다.

@menu
* 예: 예<9>. 

@end menu

@node 예<9>,,,XInclude 지원
@anchor{library/xml etree elementtree id3}@anchor{3d48}
@subsubsection 예


다음은 XInclude 모듈의 사용법을 보여주는 예입니다. 현재 문서에 XML 문서를 포함 시키려면, @code{@{http://www.w3.org/2001/XInclude@}include} 엘리먼트를 사용하고 `parse' 어트리뷰트를 @code{"xml"}로 설정하고, `href' 어트리뷰트를 사용하여 포함할 문서를 지정하십시오.

@example
<?xml version="1.0"?>
<document xmlns:xi="http://www.w3.org/2001/XInclude">
  <xi:include href="source.xml" parse="xml" />
</document>
@end example

기본적으로, `href' 어트리뷰트는 파일 이름으로 취급됩니다. 사용자 정의 로더를 사용하여 이 동작을 대체 할 수 있습니다. 또한 표준 도우미는 XPointer 문법을 지원하지 않음에 유의하십시오.

To process this file, load it as usual, and pass the root element to the @code{xml.etree.ElementTree} module:

@example
from xml.etree import ElementTree, ElementInclude

tree = ElementTree.parse("document.xml")
root = tree.getroot()

ElementInclude.include(root)
@end example

ElementInclude 모듈은 @code{@{http://www.w3.org/2001/XInclude@}include} 엘리먼트를 `source.xml' 문서의 루트 엘리먼트로 바꿉니다. 결과는 다음과 같습니다:

@example
<document xmlns:xi="http://www.w3.org/2001/XInclude">
  <para>This is a paragraph.</para>
</document>
@end example

`parse' 어트리뷰트가 생략되면, 기본값은 “xml”입니다. href 어트리뷰트는 필수입니다.

텍스트 문서를 포함 시키려면, @code{@{http://www.w3.org/2001/XInclude@}include} 엘리먼트를 사용하고, `parse' 어트리뷰트를 “text”로 설정하십시오:

@example
<?xml version="1.0"?>
<document xmlns:xi="http://www.w3.org/2001/XInclude">
  Copyright (c) <xi:include href="year.txt" parse="text" />.
</document>
@end example

결과는 다음과 같습니다:

@example
<document xmlns:xi="http://www.w3.org/2001/XInclude">
  Copyright (c) 2003.
</document>
@end example

@node 레퍼런스<3>,,XInclude 지원,xml etree ElementTree — ElementTree XML API
@anchor{library/xml etree elementtree id4}@anchor{3d49}
@subsubsection 레퍼런스


@menu
* 함수: 함수<9>. 
* Element 객체:: 
* ElementTree 객체:: 
* QName 객체:: 
* TreeBuilder 객체:: 
* XMLParser 객체:: 
* XMLPullParser 객체:: 
* 예외: 예외<16>. 

@end menu

@node 함수<9>,Element 객체,,레퍼런스<3>
@anchor{library/xml etree elementtree elementinclude-functions}@anchor{3d4a}@anchor{library/xml etree elementtree id5}@anchor{3d4b}
@subsubsection 함수


@geindex module; xml.etree.ElementInclude

@geindex default_loader() (xml.etree.ElementInclude 모듈)
@anchor{library/xml etree elementtree module-xml etree ElementInclude}@anchor{12a}@anchor{library/xml etree elementtree xml etree ElementInclude default_loader}@anchor{3d4c}
@deffn {함수} xml.etree.ElementInclude.default_loader (href, parse, encoding=None)

기본 로더. 이 기본 로더는 디스크에서 포함되는 리소스를 읽습니다. `href'는 URL입니다. `parse'는 구문 분석 모드로 “xml” 이나 “text”입니다. `encoding'은 선택적 텍스트 인코딩입니다. 지정하지 않으면, 인코딩은 @code{utf-8}입니다. 확장된 리소스를 반환합니다. 구문 분석 모드가 @code{"xml"}이면, @ref{363,,Element} 인스턴스입니다. 구문 분석 모드가 @code{"text"}이면, 문자열입니다. 로더가 실패하면, @code{None}을 반환하거나 예외를 발생시킬 수 있습니다.
@end deffn

@geindex include() (xml.etree.ElementInclude 모듈)
@anchor{library/xml etree elementtree xml etree ElementInclude include}@anchor{3d4d}
@deffn {함수} xml.etree.ElementInclude.include (elem, loader=None, base_url=None, max_depth=6)

이 함수는 `elem'이 가리키는 트리 내에서 XInclude 지시어를 제자리에서(in-place) 확장합니다. `elem'은 루트 @ref{363,,Element}이거나 그런 엘리먼트를 찾기 위한 @ref{b47,,ElementTree} 인스턴스입니다. `loader'는 선택적 리소스 로더입니다. 생략하면, 기본값은 @ref{3d4c,,default_loader()}입니다. 주어지면, @code{default_loader()}와 같은 인터페이스를 구현하는 콜러블 이어야 합니다. `base_url'은 상대적인 포함 파일 참조를 결정하기 위한 원본 파일의 베이스 URL입니다. `max_depth'는 최대 재귀 포함 수입니다. 악의적인 내용 폭발의 위험을 줄이도록 제한되었습니다. 제한을 비활성화하려면 @code{None}을 전달하십시오.


버전 3.9에서 변경: `base_url'과 `max_depth' 매개 변수를 추가했습니다.

@end deffn

@node Element 객체,ElementTree 객체,함수<9>,레퍼런스<3>
@anchor{library/xml etree elementtree element-objects}@anchor{3d4e}@anchor{library/xml etree elementtree elementtree-element-objects}@anchor{3d4f}
@subsubsection Element 객체


@geindex Element (xml.etree.ElementTree 클래스)
@anchor{library/xml etree elementtree xml etree ElementTree Element}@anchor{363}
@deffn {클래스} xml.etree.ElementTree.Element (tag, attrib=@{@}, **extra)

Element 클래스. 이 클래스는 Element 인터페이스를 정의하고, 이 인터페이스의 참조 구현을 제공합니다.

엘리먼트 이름, 어트리뷰트 이름 및 어트리뷰트 값은 바이트 문자열이나 유니코드 문자열일 수 있습니다. `tag'는 엘리먼트 이름입니다. `attrib'는 엘리먼트 어트리뷰트를 포함하는 선택적 딕셔너리입니다. `extra'에는 키워드 인자로 지정된 추가 어트리뷰트가 포함되어 있습니다.

@geindex tag (xml.etree.ElementTree.Element의 속성)
@anchor{library/xml etree elementtree xml etree ElementTree Element tag}@anchor{1552}
@deffn {속성} tag

이 엘리먼트가 나타내는 데이터 종류(즉, 엘리먼트 유형)를 식별하는 문자열.
@end deffn

@geindex text (xml.etree.ElementTree.Element의 속성)
@geindex tail (xml.etree.ElementTree.Element의 속성)
@anchor{library/xml etree elementtree xml etree ElementTree Element text}@anchor{3d30}
@deffn {속성} text
@anchor{library/xml etree elementtree xml etree ElementTree Element tail}@anchor{3d50}
@deffnx {속성} tail

이 어트리뷰트는 엘리먼트와 연관된 추가 데이터를 담는 데 사용될 수 있습니다. 해당 값은 일반적으로 문자열이지만 임의의 응용 프로그램별 객체일 수 있습니다. 엘리먼트가 XML 파일에서 만들어지면, `text' 어트리뷰트는 엘리먼트의 시작 태그와 첫 번째 자식이나 종료 태그 사이의 텍스트를 담거나 @code{None}이고, `tail' 어트리뷰트는 엘리먼트의 종료 태그와 다음 태그 사이의 텍스트를 담거나 @code{None}입니다. 다음과 같은 XML 데이터의 경우

@example
<a><b>1<c>2<d/>3</c></b>4</a>
@end example

`a' 엘리먼트는 `text'와 `tail' 어트리뷰트 모두에 대해 @code{None}을 갖고, `b' 엘리먼트는 `text' @code{"1"}과 `tail' @code{"4"}를 갖고, `c' 엘리먼트는 `text' @code{"2"}와 `tail' @code{None}을 갖고, `d' 엘리먼트는 `text' @code{None}과 `tail' @code{"3"}을 갖습니다.

엘리먼트의 내부 텍스트를 수집하려면, @ref{13da,,itertext()}를 참조하십시오, 예를 들어 @code{"".join(element.itertext())}.

응용 프로그램은 이 어트리뷰트들에 임의의 객체를 저장할 수 있습니다.
@end deffn

@geindex attrib (xml.etree.ElementTree.Element의 속성)
@anchor{library/xml etree elementtree xml etree ElementTree Element attrib}@anchor{3d51}
@deffn {속성} attrib

엘리먼트의 어트리뷰트를 포함하는 딕셔너리. `attrib' 값은 항상 진짜 가변 파이썬 딕셔너리이지만, ElementTree 구현은 다른 내부 표현을 사용하도록 선택하고, 누군가가 요청할 때만 딕셔너리를 만들 수 있습니다. 이러한 구현의 이점을 활용하려면, 가능한 한 아래의 딕셔너리 메서드를 사용하십시오.
@end deffn

다음과 같은 딕셔너리와 유사한 메서드가 엘리먼트 어트리뷰트에서 작동합니다.

@geindex clear() (xml.etree.ElementTree.Element 메서드)
@anchor{library/xml etree elementtree xml etree ElementTree Element clear}@anchor{3d52}
@deffn {메서드} clear ()

엘리먼트를 재설정합니다. 이 함수는 모든 서브 엘리먼트를 제거하고, 모든 어트리뷰트를 지우고, text 및 tail 어트리뷰트를 @code{None}으로 설정합니다.
@end deffn

@geindex get() (xml.etree.ElementTree.Element 메서드)
@anchor{library/xml etree elementtree xml etree ElementTree Element get}@anchor{3d31}
@deffn {메서드} get (key, default=None)

`key'라는 이름의 엘리먼트 어트리뷰트를 가져옵니다.

어트리뷰트 값을 반환하거나, 어트리뷰트를 찾을 수 없으면 `default'를 반환합니다.
@end deffn

@geindex items() (xml.etree.ElementTree.Element 메서드)
@anchor{library/xml etree elementtree xml etree ElementTree Element items}@anchor{3d53}
@deffn {메서드} items ()

엘리먼트 어트리뷰트를 (이름, 값) 쌍의 시퀀스로 반환합니다. 어트리뷰트는 임의의 순서로 반환됩니다.
@end deffn

@geindex keys() (xml.etree.ElementTree.Element 메서드)
@anchor{library/xml etree elementtree xml etree ElementTree Element keys}@anchor{3d54}
@deffn {메서드} keys ()

엘리먼트 어트리뷰트 이름을 리스트로 반환합니다. 이름은 임의의 순서로 반환됩니다.
@end deffn

@geindex set() (xml.etree.ElementTree.Element 메서드)
@anchor{library/xml etree elementtree xml etree ElementTree Element set}@anchor{3d33}
@deffn {메서드} set (key, value)

엘리먼트의 `key' 어트리뷰트를 `value'로 설정합니다.
@end deffn

다음 메서드는 엘리먼트의 자식(서브 엘리먼트)에서 작동합니다.

@geindex append() (xml.etree.ElementTree.Element 메서드)
@anchor{library/xml etree elementtree xml etree ElementTree Element append}@anchor{3d34}
@deffn {메서드} append (subelement)

이 엘리먼트의 내부 서브 엘리먼트 리스트 끝에 엘리먼트 `subelement'를 추가합니다. `subelement'가 @ref{363,,Element}가 아니면 @ref{198,,TypeError}를 발생시킵니다.
@end deffn

@geindex extend() (xml.etree.ElementTree.Element 메서드)
@anchor{library/xml etree elementtree xml etree ElementTree Element extend}@anchor{13d8}
@deffn {메서드} extend (subelements)

엘리먼트의 이터러블에서 `subelements'를 추가합니다. 서브 엘리먼트가 @ref{363,,Element}가 아니면 @ref{198,,TypeError}를 발생시킵니다.


Added in version 3.2.

@end deffn

@geindex find() (xml.etree.ElementTree.Element 메서드)
@anchor{library/xml etree elementtree xml etree ElementTree Element find}@anchor{187d}
@deffn {메서드} find (match, namespaces=None)

`match'와 일치하는 첫 번째 서브 엘리먼트를 찾습니다. `match'는 태그 이름이나 @ref{da5,,경로}일 수 있습니다. 엘리먼트 인스턴스나 @code{None}을 반환합니다. `namespaces'는 이름 공간 접두사에서 전체 이름으로의 선택적 매핑입니다. 표현식에서 접두사가 없는 모든 태그 이름을 지정된 이름 공간으로 이동하려면 @code{'@w{'}}를 접두사로 전달하십시오.
@end deffn

@geindex findall() (xml.etree.ElementTree.Element 메서드)
@anchor{library/xml etree elementtree xml etree ElementTree Element findall}@anchor{187f}
@deffn {메서드} findall (match, namespaces=None)

태그 이름이나 @ref{da5,,경로}로 일치하는 모든 서브 엘리먼트를 찾습니다. 일치하는 모든 엘리먼트가 문서 순서로 포함된 리스트를 반환합니다. `namespaces'는 이름 공간 접두사에서 전체 이름으로의 선택적 매핑입니다. 표현식에서 접두사가 없는 모든 태그 이름을 지정된 이름 공간으로 이동하려면 @code{'@w{'}}를 접두사로 전달하십시오.
@end deffn

@geindex findtext() (xml.etree.ElementTree.Element 메서드)
@anchor{library/xml etree elementtree xml etree ElementTree Element findtext}@anchor{187e}
@deffn {메서드} findtext (match, default=None, namespaces=None)

`match'와 일치하는 첫 번째 서브 엘리먼트의 텍스트를 찾습니다. `match'는 태그 이름이나 @ref{da5,,경로}일 수 있습니다. 일치하는 첫 번째 엘리먼트의 텍스트 내용을 반환하거나, 엘리먼트가 없으면 `default'를 반환합니다. 일치하는 엘리먼트에 텍스트 내용이 없으면 빈 문자열이 반환됨에 유의하십시오. `namespaces'는 이름 공간 접두사에서 전체 이름으로의 선택적 매핑입니다. 표현식에서 접두사가 없는 모든 태그 이름을 지정된 이름 공간으로 이동하려면 @code{'@w{'}}를 접두사로 전달하십시오.
@end deffn

@geindex insert() (xml.etree.ElementTree.Element 메서드)
@anchor{library/xml etree elementtree xml etree ElementTree Element insert}@anchor{3d55}
@deffn {메서드} insert (index, subelement)

이 엘리먼트의 지정된 위치에 `subelement'를 삽입합니다. `subelement'가 @ref{363,,Element}가 아니면 @ref{198,,TypeError}를 발생시킵니다.
@end deffn

@geindex iter() (xml.etree.ElementTree.Element 메서드)
@anchor{library/xml etree elementtree xml etree ElementTree Element iter}@anchor{1553}
@deffn {메서드} iter (tag=None)

현재 엘리먼트를 루트로 하여 트리 @ref{4ca,,이터레이터}를 만듭니다. 이터레이터는 이 엘리먼트와 그 아래의 모든 엘리먼트를 문서 순서로 (깊이 우선) 이터레이트 합니다. `tag'가 @code{None}이나 @code{'*'}가 아니면, 태그가 `tag'와 같은 엘리먼트만 이터레이터에서 반환됩니다. 이터레이션 중에 트리 구조가 수정되면, 결과는 정의되지 않습니다.


Added in version 3.2.

@end deffn

@geindex iterfind() (xml.etree.ElementTree.Element 메서드)
@anchor{library/xml etree elementtree xml etree ElementTree Element iterfind}@anchor{13d9}
@deffn {메서드} iterfind (match, namespaces=None)

태그 이름이나 @ref{da5,,경로}로 일치하는 모든 서브 엘리먼트를 찾습니다. 일치하는 모든 엘리먼트를 문서 순서로 산출하는 이터러블을 반환합니다. `namespaces'는 이름 공간 접두사에서 전체 이름으로의 선택적 매핑입니다.


Added in version 3.2.

@end deffn

@geindex itertext() (xml.etree.ElementTree.Element 메서드)
@anchor{library/xml etree elementtree xml etree ElementTree Element itertext}@anchor{13da}
@deffn {메서드} itertext ()

텍스트 이터레이터를 만듭니다. 이터레이터는 이 엘리먼트와 모든 서브 엘리먼트를 문서 순서대로 루핑하고, 모든 내부 텍스트를 반환합니다.


Added in version 3.2.

@end deffn

@geindex makeelement() (xml.etree.ElementTree.Element 메서드)
@anchor{library/xml etree elementtree xml etree ElementTree Element makeelement}@anchor{3d56}
@deffn {메서드} makeelement (tag, attrib)

이 엘리먼트와 같은 유형의 새 엘리먼트 객체를 만듭니다. 이 메서드를 호출하지 말고, 대신 @ref{3d36,,SubElement()} 팩토리 함수를 사용하십시오.
@end deffn

@geindex remove() (xml.etree.ElementTree.Element 메서드)
@anchor{library/xml etree elementtree xml etree ElementTree Element remove}@anchor{1879}
@deffn {메서드} remove (subelement)

엘리먼트에서 `subelement'를 제거합니다. find* 메서드와 달리 이 메서드는 태그값이나 내용이 아닌 인스턴스 아이덴티티를 기준으로 엘리먼트를 비교합니다.
@end deffn

@ref{363,,Element} 객체는 서브 엘리먼트 작업을 위한 @ref{14d1,,__delitem__()}, @ref{588,,__getitem__()}, @ref{14d0,,__setitem__()}, @ref{1797,,__len__()} 시퀀스 형 메서드도 지원합니다.

주의: 서브 엘리먼트가 없는 엘리먼트는 @code{False}로 테스트 됩니다. 미래에 출시되는 파이썬에서, 모든 엘리먼트는 서브 엘리먼트가 존재하든 안 하든 관계없이 @code{True}로 테스트될 것입니다. 대신, 명시적인 @code{len(elem)}이나 @code{elem is not None} 테스트를 사용하십시오.:

@example
element = root.find('foo')

if not element:  # 주의!
    print("element not found, or element has no subelements")

if element is None:
    print("element not found")
@end example


버전 3.12에서 변경: Testing the truth value of an Element emits @ref{1a3,,DeprecationWarning}.


파이썬 3.8 이전에는, 어트리뷰트를 이름으로 정렬하여 엘리먼트의 XML 어트리뷰트의 직렬화 순서를 인위적으로 예측할 수 있도록 했습니다. 이제 보장되는 딕셔너리 순서를 기반으로, 이 임의 재정렬은 파이썬 3.8에서 제거되어 어트리뷰트가 원래 구문 분석되거나 사용자 코드에 의해 만들어진 순서를 유지합니다.

일반적으로, 사용자 코드는 XML Information Set@footnote{https://www.w3.org/TR/xml-infoset/}이 정보 전달에서 어트리뷰트 순서를 명시적으로 제외한다는 점에서 구체적인 어트리뷰트 순서에 의존하지 않아야 합니다. 입력의 모든 순서를 다룰 수 있도록 코드를 준비해야 합니다. 예를 들어 암호화 서명이나 테스트 데이터 집합과 같이 결정론적 XML 출력이 필요한 경우, @ref{c47,,canonicalize()} 함수로 규범적 직렬화를 사용할 수 있습니다.

규범적 출력이 적용되지는 않지만, 출력에서 특정 어트리뷰트 순서가 여전히 필요하면, 코드는 코드를 읽는 사람의 지각 불일치를 피하고자, 원하는 순서로 어트리뷰트를 직접 만드는 것을 목표로 해야 합니다. 이를 달성하기 어려운 경우, Element 생성과 독립적으로 순서를 강제하기 위해 직렬화 전에 다음과 같은 조리법을 적용 할 수 있습니다:

@example
def reorder_attributes(root):
    for el in root.iter():
        attrib = el.attrib
        if len(attrib) > 1:
            # 어트리뷰트 순서를 조정합니다, 예를 들어 정렬로
            attribs = sorted(attrib.items())
            attrib.clear()
            attrib.update(attribs)
@end example
@end deffn

@node ElementTree 객체,QName 객체,Element 객체,레퍼런스<3>
@anchor{library/xml etree elementtree elementtree-elementtree-objects}@anchor{3d57}@anchor{library/xml etree elementtree elementtree-objects}@anchor{3d58}
@subsubsection ElementTree 객체


@geindex ElementTree (xml.etree.ElementTree 클래스)
@anchor{library/xml etree elementtree xml etree ElementTree ElementTree}@anchor{b47}
@deffn {클래스} xml.etree.ElementTree.ElementTree (element=None, file=None)

ElementTree 래퍼 클래스. 이 클래스는 전체 엘리먼트 위계를 나타내며, 표준 XML과의 직렬화에 대한 추가 지원을 추가합니다.

`element'는 루트 엘리먼트입니다. 주어지면 XML `file'의 내용으로 트리가 초기화됩니다.

@geindex _setroot() (xml.etree.ElementTree.ElementTree 메서드)
@anchor{library/xml etree elementtree xml etree ElementTree ElementTree _setroot}@anchor{3d59}
@deffn {메서드} _setroot (element)

이 트리의 루트 엘리먼트를 교체합니다. 이것은 트리의 현재 내용을 버리고, 주어진 엘리먼트로 대체합니다. 주의해서 사용하십시오. `element'는 엘리먼트 인스턴스입니다.
@end deffn

@geindex find() (xml.etree.ElementTree.ElementTree 메서드)
@anchor{library/xml etree elementtree xml etree ElementTree ElementTree find}@anchor{3d5a}
@deffn {메서드} find (match, namespaces=None)

@ref{187d,,Element.find()}와 같습니다, 트리의 루트에서 시작합니다.
@end deffn

@geindex findall() (xml.etree.ElementTree.ElementTree 메서드)
@anchor{library/xml etree elementtree xml etree ElementTree ElementTree findall}@anchor{3d5b}
@deffn {메서드} findall (match, namespaces=None)

@ref{187f,,Element.findall()}과 같습니다, 트리의 루트에서 시작합니다.
@end deffn

@geindex findtext() (xml.etree.ElementTree.ElementTree 메서드)
@anchor{library/xml etree elementtree xml etree ElementTree ElementTree findtext}@anchor{3d5c}
@deffn {메서드} findtext (match, default=None, namespaces=None)

@ref{187e,,Element.findtext()}와 같습니다, 트리의 루트에서 시작합니다.
@end deffn

@geindex getroot() (xml.etree.ElementTree.ElementTree 메서드)
@anchor{library/xml etree elementtree xml etree ElementTree ElementTree getroot}@anchor{3d5d}
@deffn {메서드} getroot ()

이 트리의 루트 엘리먼트를 반환합니다.
@end deffn

@geindex iter() (xml.etree.ElementTree.ElementTree 메서드)
@anchor{library/xml etree elementtree xml etree ElementTree ElementTree iter}@anchor{3d5e}
@deffn {메서드} iter (tag=None)

루트 엘리먼트에 대한 트리 이터레이터를 만들고 반환합니다. 이터레이터는 이 트리의 모든 엘리먼트를 섹션 순서대로 루핑합니다. `tag'는 찾을 태그입니다 (기본값은 모든 엘리먼트를 반환하는 것입니다).
@end deffn

@geindex iterfind() (xml.etree.ElementTree.ElementTree 메서드)
@anchor{library/xml etree elementtree xml etree ElementTree ElementTree iterfind}@anchor{3d5f}
@deffn {메서드} iterfind (match, namespaces=None)

@ref{13d9,,Element.iterfind()}와 같습니다, 트리의 루트에서 시작합니다.


Added in version 3.2.

@end deffn

@geindex parse() (xml.etree.ElementTree.ElementTree 메서드)
@anchor{library/xml etree elementtree xml etree ElementTree ElementTree parse}@anchor{3d60}
@deffn {메서드} parse (source, parser=None)

이 엘리먼트 트리에 외부 XML 섹션을 로드합니다. `source'는 파일 이름이나 @ref{13c8,,파일 객체}입니다. `parser'는 선택적 구문 분석기 인스턴스입니다. 지정하지 않으면 표준 @ref{c48,,XMLParser} 구문 분석기가 사용됩니다. 섹션 루트 엘리먼트를 반환합니다.
@end deffn

@geindex write() (xml.etree.ElementTree.ElementTree 메서드)
@anchor{library/xml etree elementtree xml etree ElementTree ElementTree write}@anchor{c8b}
@deffn {메서드} write (file, encoding='us-ascii', xml_declaration=None, default_namespace=None, method='xml', *, short_empty_elements=True)

엘리먼트 트리를 XML로 파일에 씁니다. `file'은 파일 이름이거나 쓰기 위해 열린 @ref{13c8,,파일 객체}입니다. `encoding' @footnote{
XML 출력에 포함된 인코딩 문자열은 적절한 표준을 준수해야 합니다. 예를 들어, “UTF-8”은 유효하지만, “UTF8”은 유효하지 않습니다. @indicateurl{https://www.w3.org/TR/2006/REC-xml11-20060816/#NT-EncodingDecl} and @indicateurl{https://www.iana.org/assignments/character-sets/character-sets.xhtml} 을 참조하십시오.
} 은 출력 인코딩입니다 (기본값은 US-ASCII입니다). `xml_declaration'은 파일에 XML 선언을 추가해야 하는지를 제어합니다. 추가하지 말아야 하면 @code{False}, 항상 추가하면 @code{True}, US-ASCII나 UTF-8이나 유니코드가 아닐 때만 추가하면 @code{None}을 사용하십시오 (기본값은 @code{None}입니다). `default_namespace'는 기본 XML 이름 공간을 설정합니다 (“xmlns”). `method'는 @code{"xml"}, @code{"html"} 또는 @code{"text"}입니다 (기본값은 @code{"xml"}입니다). 키워드 전용 `short_empty_elements' 매개 변수는 내용이 없는 엘리먼트의 포매팅을 제어합니다. @code{True}(기본값)이면, 단일 스스로 닫힌 태그로 방출되고, 그렇지 않으면 한 쌍의 시작/종료 태그로 방출됩니다.

출력은 문자열(@ref{169,,str})이나 바이너리(@ref{192,,bytes})입니다. 이것은 `encoding' 인자에 의해 제어됩니다. `encoding'이 @code{"unicode"}이면, 출력은 문자열입니다; 그렇지 않으면 바이너리입니다. `file'이 열린 @ref{13c8,,파일 객체}이면 `file'의 유형과 충돌할 수 있음에 유의하십시오; 문자열을 바이너리 스트림에 쓰거나 그 반대로 하지 않도록 하십시오.


버전 3.4에서 변경: `short_empty_elements' 매개 변수를 추가했습니다.



버전 3.8에서 변경: @ref{c8b,,write()} 메서드는 이제 사용자가 지정한 어트리뷰트 순서를 유지합니다.

@end deffn
@end deffn

이것은 조작될 XML 파일입니다:

@example
<html>
    <head>
        <title>Example page</title>
    </head>
    <body>
        <p>Moved to <a href="http://example.org/">example.org</a>
        or <a href="http://example.com/">example.com</a>.</p>
    </body>
</html>
@end example

첫 번째 문단에 있는 모든 링크의 어트리뷰트 “target”을 변경하는 예:

@example
>>> from xml.etree.ElementTree import ElementTree
>>> tree = ElementTree()
>>> tree.parse("index.xhtml")
<Element 'html' at 0xb77e6fac>
>>> p = tree.find("body/p")     # body에서 처음 등장하는 태그 p를 찾습니다
>>> p
<Element 'p' at 0xb77ec26c>
>>> links = list(p.iter("a"))   # 모든 링크의 리스트를 반환합니다
>>> links
[<Element 'a' at 0xb77ec2ac>, <Element 'a' at 0xb77ec1cc>]
>>> for i in links:             # 발견된 모든 링크를 이터레이트 합니다
...     i.attrib["target"] = "blank"
...
>>> tree.write("output.xhtml")
@end example

@node QName 객체,TreeBuilder 객체,ElementTree 객체,레퍼런스<3>
@anchor{library/xml etree elementtree elementtree-qname-objects}@anchor{3d61}@anchor{library/xml etree elementtree qname-objects}@anchor{3d62}
@subsubsection QName 객체


@geindex QName (xml.etree.ElementTree 클래스)
@anchor{library/xml etree elementtree xml etree ElementTree QName}@anchor{3d63}
@deffn {클래스} xml.etree.ElementTree.QName (text_or_uri, tag=None)

QName 래퍼. 출력에서 이름 공간을 올바르게 처리하기 위해, QName 어트리뷰트 값을 래핑하는 데 사용할 수 있습니다. `text_or_uri'는 @{uri@}local 형식으로 QName 값을 포함하는 문자열이거나, tag 인자가 제공되면 QName의 URI 부분입니다. `tag'가 제공되면, 첫 번째 인자는 URI로 해석되고, 이 인자는 로컬 이름으로 해석됩니다. @ref{3d63,,QName} 인스턴스는 불투명합니다.
@end deffn

@node TreeBuilder 객체,XMLParser 객체,QName 객체,레퍼런스<3>
@anchor{library/xml etree elementtree elementtree-treebuilder-objects}@anchor{3d64}@anchor{library/xml etree elementtree treebuilder-objects}@anchor{3d65}
@subsubsection TreeBuilder 객체


@geindex TreeBuilder (xml.etree.ElementTree 클래스)
@anchor{library/xml etree elementtree xml etree ElementTree TreeBuilder}@anchor{c49}
@deffn {클래스} xml.etree.ElementTree.TreeBuilder (element_factory=None, *, comment_factory=None, pi_factory=None, insert_comments=False, insert_pis=False)

일반 엘리먼트 구조 빌더. 이 빌더는 일련의 start, data, end, comment 및 pi 메서드 호출을 올바른 형식의 엘리먼트 구조로 변환합니다. 이 클래스를 사용하여 사용자 정의 XML 구문 분석기를 사용하거나 다른 XML 형식의 구문 분석기를 사용하는 엘리먼트 구조를 구축할 수 있습니다.

주어지면 `element_factory'는 두 개의 위치 인자를 받아들이는 콜러블 이어야 합니다: 태그와 어트리뷰트 딕셔너리. 새로운 엘리먼트 인스턴스를 반환할 것으로 기대합니다.

주어지면, `comment_factory'와 `pi_factory' 함수는 주석과 처리 명령을 만들기 위해 @ref{3d3e,,Comment()}와 @ref{3d44,,ProcessingInstruction()} 함수처럼 동작해야 합니다. 지정하지 않으면, 기본 팩토리가 사용됩니다. `insert_comments' 및/또는 `insert_pis'가 참이면, 주석/처리 명령이 루트 엘리먼트 내에 있으면 (하지만 외부에 있지 않으면) 트리에 삽입됩니다.

@geindex close() (xml.etree.ElementTree.TreeBuilder 메서드)
@anchor{library/xml etree elementtree xml etree ElementTree TreeBuilder close}@anchor{3d66}
@deffn {메서드} close ()

빌더 버퍼를 플러시하고, 최상위 문서 엘리먼트를 반환합니다. @ref{363,,Element} 인스턴스를 반환합니다.
@end deffn

@geindex data() (xml.etree.ElementTree.TreeBuilder 메서드)
@anchor{library/xml etree elementtree xml etree ElementTree TreeBuilder data}@anchor{3d67}
@deffn {메서드} data (data)

현재 엘리먼트에 텍스트를 추가합니다. `data'는 문자열입니다. 바이트 문자열이거나 유니코드 문자열이어야 합니다.
@end deffn

@geindex end() (xml.etree.ElementTree.TreeBuilder 메서드)
@anchor{library/xml etree elementtree xml etree ElementTree TreeBuilder end}@anchor{13db}
@deffn {메서드} end (tag)

현재 엘리먼트를 닫습니다. `tag'는 엘리먼트 이름입니다. 닫힌 엘리먼트를 반환합니다.
@end deffn

@geindex start() (xml.etree.ElementTree.TreeBuilder 메서드)
@anchor{library/xml etree elementtree xml etree ElementTree TreeBuilder start}@anchor{1d69}
@deffn {메서드} start (tag, attrs)

새로운 엘리먼트를 엽니다. `tag'는 엘리먼트 이름입니다. `attrs'는 엘리먼트 어트리뷰트를 포함하는 딕셔너리입니다. 열린 엘리먼트를 반환합니다.
@end deffn

@geindex comment() (xml.etree.ElementTree.TreeBuilder 메서드)
@anchor{library/xml etree elementtree xml etree ElementTree TreeBuilder comment}@anchor{3d68}
@deffn {메서드} comment (text)

주어진 `text'로 주석을 만듭니다. @code{insert_comments}가 참이면, 트리에 추가합니다.


Added in version 3.8.

@end deffn

@geindex pi() (xml.etree.ElementTree.TreeBuilder 메서드)
@anchor{library/xml etree elementtree xml etree ElementTree TreeBuilder pi}@anchor{3d69}
@deffn {메서드} pi (target, text)

주어진 `target' 이름과 `text'로 처리 명령을 만듭니다. @code{insert_pis}가 참이면, 트리에 추가합니다.


Added in version 3.8.

@end deffn

또한, 사용자 정의 @ref{c49,,TreeBuilder} 객체는 다음 메서드를 제공할 수 있습니다:

@geindex doctype() (xml.etree.ElementTree.TreeBuilder 메서드)
@anchor{library/xml etree elementtree xml etree ElementTree TreeBuilder doctype}@anchor{c8d}
@deffn {메서드} doctype (name, pubid, system)

doctype 선언을 처리합니다. `name'은 doctype 이름입니다. `pubid'는 공개 식별자입니다. `system'은 시스템 식별자입니다. 이 메서드는 기본 @ref{c49,,TreeBuilder} 클래스에 없습니다.


Added in version 3.2.

@end deffn

@geindex start_ns() (xml.etree.ElementTree.TreeBuilder 메서드)
@anchor{library/xml etree elementtree xml etree ElementTree TreeBuilder start_ns}@anchor{3d6a}
@deffn {메서드} start_ns (prefix, uri)

구문 분석기가 새 이름 공간 선언을 발견할 때마다 이를 정의하는 여는 엘리먼트에 대한 @code{start()} 콜백 전에 호출됩니다. `prefix'는 기본 이름 공간의 경우 @code{'@w{'}}이고, 그렇지 않으면 선언된 이름 공간 접두사 이름입니다. `uri'는 이름 공간 URI입니다.


Added in version 3.8.

@end deffn

@geindex end_ns() (xml.etree.ElementTree.TreeBuilder 메서드)
@anchor{library/xml etree elementtree xml etree ElementTree TreeBuilder end_ns}@anchor{3d6b}
@deffn {메서드} end_ns (prefix)

이름 공간 접두사 매핑을 선언한 엘리먼트의 @code{end()} 콜백 후에, 스코프를 벗어난 `prefix'의 이름으로 호출됩니다.


Added in version 3.8.

@end deffn
@end deffn

@geindex C14NWriterTarget (xml.etree.ElementTree 클래스)
@anchor{library/xml etree elementtree xml etree ElementTree C14NWriterTarget}@anchor{3d6c}
@deffn {클래스} 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)

C14N 2.0@footnote{https://www.w3.org/TR/xml-c14n2/} 기록기. 인자는 @ref{c47,,canonicalize()} 함수와 같습니다. 이 클래스는 트리를 구축하지 않지만, `write' 함수를 사용하여 콜백 이벤트를 직렬화된 형식으로 직접 변환합니다.


Added in version 3.8.

@end deffn

@node XMLParser 객체,XMLPullParser 객체,TreeBuilder 객체,레퍼런스<3>
@anchor{library/xml etree elementtree elementtree-xmlparser-objects}@anchor{3d6d}@anchor{library/xml etree elementtree xmlparser-objects}@anchor{3d6e}
@subsubsection XMLParser 객체


@geindex XMLParser (xml.etree.ElementTree 클래스)
@anchor{library/xml etree elementtree xml etree ElementTree XMLParser}@anchor{c48}
@deffn {클래스} xml.etree.ElementTree.XMLParser (*, target=None, encoding=None)

이 클래스는 모듈의 저수준 빌딩 블록입니다. 효율적인 이벤트 기반 XML 구문 분석을 위해 @ref{12c,,xml.parsers.expat}을 사용합니다. @ref{3d6f,,feed()} 메서드를 사용하여 XML 데이터를 점진적으로 공급할 수 있으며, 구문 분석 이벤트는 `target' 객체에서 콜백을 호출하여 푸시 API로 변환됩니다. `target'을 생략하면, 표준 @ref{c49,,TreeBuilder}가 사용됩니다. `encoding' @footnote{
XML 출력에 포함된 인코딩 문자열은 적절한 표준을 준수해야 합니다. 예를 들어, “UTF-8”은 유효하지만, “UTF8”은 유효하지 않습니다. @indicateurl{https://www.w3.org/TR/2006/REC-xml11-20060816/#NT-EncodingDecl} and @indicateurl{https://www.iana.org/assignments/character-sets/character-sets.xhtml} 을 참조하십시오.
} 이 제공되면, 값이 XML 파일에 지정된 인코딩을 대체합니다.


버전 3.8에서 변경: 매개 변수는 이제 @ref{5a4,,키워드-전용}입니다. `html' 인자는 더는 지원되지 않습니다.


@geindex close() (xml.etree.ElementTree.XMLParser 메서드)
@anchor{library/xml etree elementtree xml etree ElementTree XMLParser close}@anchor{3d70}
@deffn {메서드} close ()

구문 분석기로의 데이터 공급을 완료합니다. 생성 중에 전달된 `target'의 @code{close()} 메서드를 호출한 결과를 반환합니다; 기본적으로, 최상위 문서 엘리먼트입니다.
@end deffn

@geindex feed() (xml.etree.ElementTree.XMLParser 메서드)
@anchor{library/xml etree elementtree xml etree ElementTree XMLParser feed}@anchor{3d6f}
@deffn {메서드} feed (data)

구문 분석기에 데이터를 공급합니다. `data'는 인코딩된 데이터입니다.
@end deffn

@geindex flush() (xml.etree.ElementTree.XMLParser 메서드)
@anchor{library/xml etree elementtree xml etree ElementTree XMLParser flush}@anchor{575}
@deffn {메서드} flush ()

Triggers parsing of any previously fed unparsed data, which can be
used to ensure more immediate feedback, in particular with Expat >=2.6.0.
The implementation of @code{flush()} temporarily disables reparse deferral
with Expat (if currently enabled) and triggers a reparse.
Disabling reparse deferral has security consequences; please see
@ref{578,,xml.parsers.expat.xmlparser.SetReparseDeferralEnabled()} for details.

Note that @code{flush()} has been backported to some prior releases of
CPython as a security fix.  Check for availability of @code{flush()}
using @ref{6f8,,hasattr()} if used in code running across a variety of Python
versions.


Added in version 3.13.

@end deffn

@ref{3d6f,,XMLParser.feed()}는 각 여는 태그마다 `target'의 @code{start(tag, attrs_dict)} 메서드를 호출하고, 닫는 태그마다 @code{end(tag)} 메서드를 호출하며, 데이터는 메서드 @code{data(data)}로 처리됩니다. 추가로 지원되는 콜백 메서드는, @ref{c49,,TreeBuilder} 클래스를 참조하십시오. @ref{3d70,,XMLParser.close()}는 `target'의 메서드 @code{close()}를 호출합니다. @ref{c48,,XMLParser}는 트리 구조 구축에만 사용할 수 있는 것은 아닙니다. 다음은 XML 파일의 최대 깊이를 계산하는 예입니다:

@example
>>> from xml.etree.ElementTree import XMLParser
>>> class MaxDepth:                     # 구문 분석기의 대상 객체
...     maxDepth = 0
...     depth = 0
...     def start(self, tag, attrib):   # 여는 태그마다 호출됩니다.
...         self.depth += 1
...         if self.depth > self.maxDepth:
...             self.maxDepth = self.depth
...     def end(self, tag):             # 닫는 태그마다 호출됩니다.
...         self.depth -= 1
...     def data(self, data):
...         pass            # 우리는 데이터로 아무것도 할 필요가 없습니다.
...     def close(self):    # 모든 데이터가 구문 분석되었을 때 호출됩니다.
...         return self.maxDepth
...
>>> target = MaxDepth()
>>> parser = XMLParser(target=target)
>>> exampleXml = """
... <a>
...   <b>
...   </b>
...   <b>
...     <c>
...       <d>
...       </d>
...     </c>
...   </b>
... </a>"""
>>> parser.feed(exampleXml)
>>> parser.close()
4
@end example
@end deffn

@node XMLPullParser 객체,예외<16>,XMLParser 객체,레퍼런스<3>
@anchor{library/xml etree elementtree elementtree-xmlpullparser-objects}@anchor{3d71}@anchor{library/xml etree elementtree xmlpullparser-objects}@anchor{3d72}
@subsubsection XMLPullParser 객체


@geindex XMLPullParser (xml.etree.ElementTree 클래스)
@anchor{library/xml etree elementtree xml etree ElementTree XMLPullParser}@anchor{11f2}
@deffn {클래스} xml.etree.ElementTree.XMLPullParser (events=None)

비 블로킹 응용 프로그램에 적합한 풀 구문 분석기. 입력 측 API는 @ref{c48,,XMLParser}의 것과 유사하지만, 콜백 대상으로 호출을 푸시하는 대신, @ref{11f2,,XMLPullParser}는 내부 구문 분석 이벤트 리스트를 수집하여 사용자가 여기서 읽을 수 있도록 합니다. `events'는 보고할 이벤트의 시퀀스입니다. 지원되는 이벤트는 문자열 @code{"start"}, @code{"end"}, @code{"comment"}, @code{"pi"}, @code{"start-ns"} 및 @code{"end-ns"}입니다 (“ns” 이벤트는 자세한 이름 공간 정보를 얻는 데 사용됩니다). `events'를 생략하면, @code{"end"} 이벤트만 보고됩니다.

@geindex feed() (xml.etree.ElementTree.XMLPullParser 메서드)
@anchor{library/xml etree elementtree xml etree ElementTree XMLPullParser feed}@anchor{3d2d}
@deffn {메서드} feed (data)

주어진 바이트열 데이터를 구문 분석기에 공급합니다.
@end deffn

@geindex flush() (xml.etree.ElementTree.XMLPullParser 메서드)
@anchor{library/xml etree elementtree xml etree ElementTree XMLPullParser flush}@anchor{576}
@deffn {메서드} flush ()

Triggers parsing of any previously fed unparsed data, which can be
used to ensure more immediate feedback, in particular with Expat >=2.6.0.
The implementation of @code{flush()} temporarily disables reparse deferral
with Expat (if currently enabled) and triggers a reparse.
Disabling reparse deferral has security consequences; please see
@ref{578,,xml.parsers.expat.xmlparser.SetReparseDeferralEnabled()} for details.

Note that @code{flush()} has been backported to some prior releases of
CPython as a security fix.  Check for availability of @code{flush()}
using @ref{6f8,,hasattr()} if used in code running across a variety of Python
versions.


Added in version 3.13.

@end deffn

@geindex close() (xml.etree.ElementTree.XMLPullParser 메서드)
@anchor{library/xml etree elementtree xml etree ElementTree XMLPullParser close}@anchor{3d73}
@deffn {메서드} close ()

구문 분석기에 데이터 스트림이 종료되었음을 알립니다. @ref{3d70,,XMLParser.close()}와 달리, 이 메서드는 항상 @ref{884,,None}을 반환합니다. 구문 분석기가 닫힐 때 아직 꺼내지 않은 이벤트는 @ref{3d2e,,read_events()}로 계속 읽을 수 있습니다.
@end deffn

@geindex read_events() (xml.etree.ElementTree.XMLPullParser 메서드)
@anchor{library/xml etree elementtree xml etree ElementTree XMLPullParser read_events}@anchor{3d2e}
@deffn {메서드} read_events ()

구문 분석기에 공급된 데이터에서 발생한 이벤트에 대한 이터레이터를 반환합니다. 이터레이터는 @code{(event, elem)} 쌍을 산출합니다, 여기서 `event'는 이벤트 유형을 나타내는 문자열(예를 들어 @code{"end"})이고 `elem'은 발견된 @ref{363,,Element} 객체나, 다음과 같은 기타 문맥 값입니다.


@itemize *

@item 
@code{start}, @code{end}: 현재 엘리먼트.

@item 
@code{comment}, @code{pi}: 현재 주석 / 처리 명령

@item 
@code{start-ns}: 선언된 이름 공간 매핑을 명명하는 튜플 @code{(prefix, uri)}

@item 
@code{end-ns}: @ref{884,,None} (향후 버전에서 변경될 수 있습니다)
@end itemize

@ref{3d2e,,read_events()}에 대한 이전 호출에서 제공된 이벤트는 다시 산출되지 않습니다. 이벤트는 이터레이터에서 꺼낼 때만 내부 큐에서 소비되므로, @code{read_events()}에서 얻은 이터레이터에 대해 병렬로 이터레이션 하는 여러 판독기는 예측할 수 없는 결과를 얻게 됩니다.
@end deffn

@cartouche
@quotation 참고 
@ref{11f2,,XMLPullParser} 는 “start” 이벤트를 방출할 때 시작 태그의 “>” 문자를 보았다는 것만 보장해서, 어트리뷰트는 정의되지만, 텍스트의 내용과 테일(tail) 어트리뷰트는 그 시점에 정의되지 않습니다. 자식 엘리먼트에도 마찬가지로 적용됩니다; 그들은 존재할 수도 그렇지 않을 수도 있습니다.

완전히 채워진 엘리먼트가 필요하면, 대신 “end” 이벤트를 찾으십시오.
@end quotation
@end cartouche


Added in version 3.4.



버전 3.8에서 변경: @code{comment}와 @code{pi} 이벤트가 추가되었습니다.

@end deffn

@node 예외<16>,,XMLPullParser 객체,레퍼런스<3>
@anchor{library/xml etree elementtree exceptions}@anchor{3d74}
@subsubsection 예외


@geindex ParseError (xml.etree.ElementTree 클래스)
@anchor{library/xml etree elementtree xml etree ElementTree ParseError}@anchor{147c}
@deffn {클래스} xml.etree.ElementTree.ParseError

XML 구문 분석 에러, 이 모듈의 다양한 구문 분석 메서드가 구문 분석이 실패할 때 발생시킵니다. 이 예외 인스턴스의 문자열 표현에는 사용자 친화적인 에러 메시지가 포함됩니다. 또한, 다음과 같은 어트리뷰트를 사용할 수 있습니다:

@geindex code (xml.etree.ElementTree.ParseError의 속성)
@anchor{library/xml etree elementtree xml etree ElementTree ParseError code}@anchor{3d75}
@deffn {속성} code

expat 구문 분석기의 숫자 에러 코드. 에러 코드와 의미의 목록은 @ref{12c,,xml.parsers.expat} 설명서를 참조하십시오.
@end deffn

@geindex position (xml.etree.ElementTree.ParseError의 속성)
@anchor{library/xml etree elementtree xml etree ElementTree ParseError position}@anchor{3d76}
@deffn {속성} position

에러가 발생한 위치를 지정하는, `line', `column' 숫자의 튜플.
@end deffn
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node xml dom — 문서 객체 모델 API,xml dom minidom — 최소 DOM 구현,xml etree ElementTree — ElementTree XML API,구조화된 마크업 처리 도구
@anchor{library/xml dom doc}@anchor{3d77}@anchor{library/xml dom module-xml dom}@anchor{127}@anchor{library/xml dom translation-repo}@anchor{3d78}@anchor{library/xml dom xml-dom-the-document-object-model-api}@anchor{3d79}
@subsection @code{xml.dom} — 문서 객체 모델 API


@geindex module; xml.dom

`소스 코드:' Lib/xml/dom/__init__.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/xml/dom/__init__.py}


__________________________________________________________________


문서 객체 모델(Document Object Model), 또는 “DOM”은 XML 문서를 액세스하고 수정하기 위한 W3C(World Wide Web Consortium)의 교차 언어 API입니다. DOM 구현은 XML 문서를 트리 구조로 나타내거나, 클라이언트 코드가 이러한 구조를 처음부터 구축 할 수 있도록 합니다. 그런 다음 잘 알려진 인터페이스를 제공하는 객체 집합을 통해 구조에 액세스 할 수 있습니다.

DOM은 무작위 액세스 응용 프로그램에 매우 유용합니다. SAX에서는 한 번에 한 조각의 문서만 볼 수 있습니다. 하나의 SAX 요소를 보고 있는 동안, 다른 SAX 요소에 액세스할 수 없습니다. 텍스트 노드를 보고 있으면, 이것을 포함하는 요소에 액세스할 수 없습니다. SAX 응용 프로그램을 작성할 때는, 문서에서의 프로그램의 위치를 자신의 코드 어딘가에서 추적해야 합니다. SAX는 여러분을 위해 대신해주지 않습니다. 또한, XML 문서를 미리 보아야 한다면, 운이 다했다고 보아야 합니다.

트리에 액세스할 수 없는 이벤트 중심 모델에서는 일부 응용 프로그램이 불가능합니다. 물론 SAX 이벤트에서 트리를 직접 만들 수는 있지만, DOM을 사용하면 그런 코드를 작성하지 않아도 됩니다. DOM은 XML 데이터의 표준 트리 표현입니다.

문서 객체 모델은 W3C에 의해 단계적으로 또는 그들의 용어로는 “수준”으로 정의됩니다. API의 파이썬 매핑은 실질적으로 DOM 수준 2 권장 사항을 기반으로 합니다.

@c What if your needs are somewhere between SAX and the DOM?  Perhaps
@c you cannot afford to load the entire tree in memory but you find the
@c SAX model somewhat cumbersome and low-level.  There is also a module
@c called xml.dom.pulldom that allows you to build trees of only the
@c parts of a document that you need structured access to.  It also has
@c features that allow you to find your way around the DOM.
@c See http://www.prescod.net/python/pulldom

DOM 응용 프로그램은 일반적으로 일부 XML을 DOM으로 구문 분석하는 것으로 시작합니다. 이것을 달성하는 방법은 DOM 수준 1은 전혀 다루지 않으며, 수준 2는 제한된 개선만을 제공합니다: @code{Document} 생성 메서드에 대한 액세스를 제공하는 @code{DOMImplementation} 객체 클래스가 있습니다만, 구현에 독립적인 방법으로 XML 판독기(reader)/기록기(writer)/Document 구축기(builder)를 액세스하는 방법이 없습니다. 기존 @code{Document} 객체 없이 이러한 메서드에 액세스할 수 있는 잘 정의된 방법도 없습니다. 파이썬에서, 각 DOM 구현은 @ref{3d7a,,getDOMImplementation()} 함수를 제공합니다. DOM 수준 3은 판독기(reader)에 대한 인터페이스를 정의하는 로드/저장 명세를 추가하지만, 아직 파이썬 표준 라이브러리에서는 사용할 수 없습니다.

일단 DOM 문서 객체가 있으면, 프로퍼티와 메서드를 통해 XML 문서의 일부에 액세스 할 수 있습니다. 이러한 프로퍼티는 DOM 명세에 정의되어 있습니다; 레퍼런스 설명서의 이 부분은 파이썬이 명세를 해석하는 방법을 설명합니다.

W3C에서 제공하는 명세는 Java, ECMAScript 및 OMG IDL 용 DOM API를 정의합니다. 여기에 정의된 파이썬 매핑은 대부분 명세의 IDL 버전을 기반으로 하지만, 엄격한 준수는 필요하지 않습니다 (구현은 IDL의 엄격한 매핑을 자유롭게 지원할 수 있습니다). 매핑 요구 사항에 대한 자세한 내용은 @ref{3d7b,,규격 준수} 절을 참조하십시오.


@subsubheading 더 보기



@table @asis

@item Document Object Model (DOM) Level 2 Specification@footnote{https://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/}

파이썬 DOM API의 기반이 되는 W3C 권장 사항.

@item Document Object Model (DOM) Level 1 Specification@footnote{https://www.w3.org/TR/REC-DOM-Level-1/}

@ref{128,,xml.dom.minidom}이 지원하는 DOM에 대한 W3C 권장 사항.

@item Python Language Mapping Specification@footnote{https://www.omg.org/spec/PYTH/1.2/PDF}

OMG IDL에서 파이썬으로의 매핑을 지정합니다.
@end table


@menu
* 모듈 내용: 모듈 내용<5>. 
* DOM의 객체:: 
* 규격 준수:: 

@end menu

@node 모듈 내용<5>,DOM의 객체,,xml dom — 문서 객체 모델 API
@anchor{library/xml dom module-contents}@anchor{3d7c}
@subsubsection 모듈 내용


The @code{xml.dom} contains the following functions:

@geindex registerDOMImplementation() (xml.dom 모듈)
@anchor{library/xml dom xml dom registerDOMImplementation}@anchor{3d7d}
@deffn {함수} xml.dom.registerDOMImplementation (name, factory)

`factory' 함수를 `name'이라는 이름으로 등록합니다. 팩토리(factory) 함수는 @code{DOMImplementation} 인터페이스를 구현하는 객체를 반환해야 합니다. 팩토리 함수는 호출 때마다 같은 객체를 반환하거나 특정 구현에 적합하다면 새 객체를 반환할 수 있습니다 (예를 들어, 해당 구현이 일부 사용자 정의를 지원하는 경우).
@end deffn

@geindex getDOMImplementation() (xml.dom 모듈)
@anchor{library/xml dom xml dom getDOMImplementation}@anchor{3d7a}
@deffn {함수} xml.dom.getDOMImplementation (name=None, features=())

적절한 DOM 구현을 반환합니다. `name'은 잘 알려진 DOM 구현의 모듈 이름이거나, @code{None}입니다. @code{None}이 아니면, 해당 모듈을 임포트하고 성공하면 @code{DOMImplementation} 객체를 반환합니다. 이름이 지정되지 않고, 환경 변수 
@geindex PYTHON_DOM
@geindex 환경 변수; PYTHON_DOM
@code{PYTHON_DOM}이 설정되면, 이 변수를 구현을 찾는 데 사용합니다.

이름을 지정하지 않으면, 사용 가능한 구현을 검사하여 필요한 기능 집합이 있는 구현을 찾습니다. 구현을 찾을 수 없으면, @ref{659,,ImportError}를 발생시킵니다. 기능 목록은 사용 가능한 @code{DOMImplementation} 객체의 @code{hasFeature()} 메서드로 전달되는 @code{(feature, version)} 쌍의 시퀀스여야 합니다.
@end deffn

몇 가지 편의 상수도 제공됩니다:

@geindex EMPTY_NAMESPACE (xml.dom 모듈)
@anchor{library/xml dom xml dom EMPTY_NAMESPACE}@anchor{3d7e}
@deffn {데이터} xml.dom.EMPTY_NAMESPACE

이름 공간이 DOM의 노드와 연결되어 있지 않음을 나타내는 데 사용되는 값. 이것은 일반적으로 노드의 @code{namespaceURI}에서 발견되거나, 이름 공간별 메서드에 대한 `namespaceURI' 매개 변수로 사용됩니다.
@end deffn

@geindex XML_NAMESPACE (xml.dom 모듈)
@anchor{library/xml dom xml dom XML_NAMESPACE}@anchor{3d7f}
@deffn {데이터} xml.dom.XML_NAMESPACE

예약된 접두어 @code{xml}과 연관된 이름 공간 URI, Namespaces in XML@footnote{https://www.w3.org/TR/REC-xml-names/}에서 정의됩니다 (4절).
@end deffn

@geindex XMLNS_NAMESPACE (xml.dom 모듈)
@anchor{library/xml dom xml dom XMLNS_NAMESPACE}@anchor{3d80}
@deffn {데이터} xml.dom.XMLNS_NAMESPACE

이름 공간 선언의 이름 공간 URI, Document Object Model (DOM) Level 2 Core Specification@footnote{https://www.w3.org/TR/DOM-Level-2-Core/core.html}에서 정의됩니다 (1.1.8 절).
@end deffn

@geindex XHTML_NAMESPACE (xml.dom 모듈)
@anchor{library/xml dom xml dom XHTML_NAMESPACE}@anchor{3d81}
@deffn {데이터} xml.dom.XHTML_NAMESPACE

XHTML 이름 공간의 URI, XHTML 1.0: The Extensible HyperText Markup Language@footnote{https://www.w3.org/TR/xhtml1/}에서 정의됩니다 (3.1.1 절).
@end deffn

In addition, @code{xml.dom} contains a base @code{Node} class and the DOM
exception classes.  The @code{Node} class provided by this module does not
implement any of the methods or attributes defined by the DOM specification;
concrete DOM implementations must provide those.  The @code{Node} class
provided as part of this module does provide the constants used for the
@code{nodeType} attribute on concrete @code{Node} objects; they are located
within the class rather than at the module level to conform with the DOM
specifications.

@c Should the Node documentation go here?

@node DOM의 객체,규격 준수,모듈 내용<5>,xml dom — 문서 객체 모델 API
@anchor{library/xml dom dom-objects}@anchor{3d82}@anchor{library/xml dom objects-in-the-dom}@anchor{3d83}
@subsubsection DOM의 객체


DOM에 대한 결정적인 문서는 W3C의 DOM 명세입니다.

DOM 어트리뷰트는 간단한 문자열 대신 노드로 조작될 수도 있음에 유의하십시오. 하지만 그렇게 해야만 하는 경우는 매우 드물어서, 이 사용법은 아직 문서화되지 않았습니다.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

인터페이스

@tab

절

@tab

목적

@item

@code{DOMImplementation}

@tab

@ref{3d84,,DOMImplementation 객체}

@tab

하부 구현에 대한 인터페이스.

@item

@code{Node}

@tab

@ref{3d85,,Node 객체}

@tab

문서에 있는 대부분 객체에 대한 베이스 인터페이스.

@item

@code{NodeList}

@tab

@ref{23ab,,NodeList 객체}

@tab

노드의 시퀀스를 위한 인터페이스.

@item

@code{DocumentType}

@tab

@ref{3d86,,DocumentType 객체}

@tab

문서를 처리하는 데 필요한 선언에 대한 정보.

@item

@code{Document}

@tab

@ref{3d87,,Document 객체}

@tab

전체 문서를 나타내는 객체.

@item

@code{Element}

@tab

@ref{3d88,,Element 객체}

@tab

문서 계층의 엘리먼트 노드.

@item

@code{Attr}

@tab

@ref{3d89,,Attr 객체}

@tab

엘리먼트 노드의 어트리뷰트 값 노드

@item

@code{Comment}

@tab

@ref{3d8a,,Comment 객체}

@tab

소스 문서에 있는 주석의 표현.

@item

@code{Text}

@tab

@ref{3d8b,,Text와 CDATASection 객체}

@tab

문서의 텍스트 내용을 포함하는 노드.

@item

@code{ProcessingInstruction}

@tab

@ref{3d8c,,ProcessingInstruction 객체}

@tab

처리 명령어 표현.

@end multitable


추가 절에서 파이썬에서 DOM 작업을 위해 정의된 예외에 관해 설명합니다.

@menu
* DOMImplementation 객체:: 
* Node 객체:: 
* NodeList 객체:: 
* DocumentType 객체:: 
* Document 객체:: 
* Element 객체: Element 객체<2>. 
* Attr 객체:: 
* NamedNodeMap 객체:: 
* Comment 객체:: 
* Text와 CDATASection 객체:: 
* ProcessingInstruction 객체:: 
* 예외: 예외<17>. 

@end menu

@node DOMImplementation 객체,Node 객체,,DOM의 객체
@anchor{library/xml dom dom-implementation-objects}@anchor{3d84}@anchor{library/xml dom domimplementation-objects}@anchor{3d8d}
@subsubsection DOMImplementation 객체


@code{DOMImplementation} 인터페이스는 응용 프로그램이 사용 중인 DOM에서 특정 기능의 가용성을 판별할 방법을 제공합니다. DOM 수준 2는 @code{DOMImplementation}을 사용하여 새로운 @code{Document}와 @code{DocumentType} 객체를 만드는 기능을 추가했습니다.

@geindex hasFeature() (xml.dom.DOMImplementation 메서드)
@anchor{library/xml dom xml dom DOMImplementation hasFeature}@anchor{3d8e}
@deffn {메서드} DOMImplementation.hasFeature (feature, version)

문자열 `feature'와 `version' 쌍으로 식별되는 기능이 구현되었으면 @code{True}를 반환합니다.
@end deffn

@geindex createDocument() (xml.dom.DOMImplementation 메서드)
@anchor{library/xml dom xml dom DOMImplementation createDocument}@anchor{3d8f}
@deffn {메서드} DOMImplementation.createDocument (namespaceUri, qualifiedName, doctype)

지정된 `namespaceUri'와 `qualifiedName'을 가진 자식 @code{Element} 객체를 포함하는 새 @code{Document} 객체(DOM의 루트)를 반환합니다. `doctype'은 @ref{3d90,,createDocumentType()}으로 만든 @code{DocumentType} 객체거나 @code{None}이어야 합니다. 파이썬 DOM API에서, @code{Element} 자식이 만들어지지 않음을 표시하기 위해 처음 두 인자는 @code{None}일 수 있습니다.
@end deffn

@geindex createDocumentType() (xml.dom.DOMImplementation 메서드)
@anchor{library/xml dom xml dom DOMImplementation createDocumentType}@anchor{3d90}
@deffn {메서드} DOMImplementation.createDocumentType (qualifiedName, publicId, systemId)

XML 문서 형 선언에 포함된 정보를 나타내는, 지정된 `qualifiedName', `publicId' 및 `systemId' 문자열을 캡슐화하는 새 @code{DocumentType} 객체를 반환합니다.
@end deffn

@node Node 객체,NodeList 객체,DOMImplementation 객체,DOM의 객체
@anchor{library/xml dom dom-node-objects}@anchor{3d85}@anchor{library/xml dom node-objects}@anchor{3d91}
@subsubsection Node 객체


XML 문서의 모든 구성 요소는 @code{Node}의 서브 클래스입니다.

@geindex nodeType (xml.dom.Node의 속성)
@anchor{library/xml dom xml dom Node nodeType}@anchor{3d92}
@deffn {속성} Node.nodeType

노드 형을 나타내는 정수. 형의 기호 상수는 @code{Node} 객체에 있습니다: @code{ELEMENT_NODE}, @code{ATTRIBUTE_NODE}, @code{TEXT_NODE}, @code{CDATA_SECTION_NODE}, @code{ENTITY_NODE}, @code{PROCESSING_INSTRUCTION_NODE}, @code{COMMENT_NODE}, @code{DOCUMENT_NODE}, @code{DOCUMENT_TYPE_NODE}, @code{NOTATION_NODE}. 이것은 읽기 전용 어트리뷰트입니다.
@end deffn

@geindex parentNode (xml.dom.Node의 속성)
@anchor{library/xml dom xml dom Node parentNode}@anchor{3d93}
@deffn {속성} Node.parentNode

현재 노드의 부모, 또는 문서 노드의 경우 @code{None}. 값은 항상 @code{Node} 객체나 @code{None}입니다. @code{Element} 노드의 경우, 이것은 부모 엘리먼트가 되는데, 루트 엘리먼트는 예외로, 이때는 @code{Document} 객체가 됩니다. @code{Attr} 노드의 경우, 항상 @code{None}입니다. 이것은 읽기 전용 어트리뷰트입니다.
@end deffn

@geindex attributes (xml.dom.Node의 속성)
@anchor{library/xml dom xml dom Node attributes}@anchor{3d94}
@deffn {속성} Node.attributes

어트리뷰트 객체의 @code{NamedNodeMap}. 엘리먼트에만 실제 값이 있습니다; 다른 것은 이 어트리뷰트에서 @code{None}을 제공합니다. 이것은 읽기 전용 어트리뷰트입니다.
@end deffn

@geindex previousSibling (xml.dom.Node의 속성)
@anchor{library/xml dom xml dom Node previousSibling}@anchor{3d95}
@deffn {속성} Node.previousSibling

같은 부모를 갖고 이 노드 바로 앞에 있는 노드. 예를 들어 `self' 엘리먼트의 시작 태그 바로 앞에 오는 종료 태그의 엘리먼트. 물론, XML 문서는 단순히 엘리먼트만으로 구성되지 않기 때문에, 이전 형제(previous sibling)는 텍스트, 주석 또는 뭔가 다른 것이 될 수 있습니다. 이 노드가 부모의 첫 번째 자식이면, 이 어트리뷰트는 @code{None}입니다. 이것은 읽기 전용 어트리뷰트입니다.
@end deffn

@geindex nextSibling (xml.dom.Node의 속성)
@anchor{library/xml dom xml dom Node nextSibling}@anchor{3d96}
@deffn {속성} Node.nextSibling

같은 부모를 갖고 이 노드 바로 뒤에 나오는 노드. @ref{3d95,,previousSibling}도 참조하십시오. 이것이 부모의 마지막 자식이면, 이 어트리뷰트는 @code{None}입니다. 이것은 읽기 전용 어트리뷰트입니다.
@end deffn

@geindex childNodes (xml.dom.Node의 속성)
@anchor{library/xml dom xml dom Node childNodes}@anchor{3d97}
@deffn {속성} Node.childNodes

이 노드에 포함된 노드의 리스트. 이것은 읽기 전용 어트리뷰트입니다.
@end deffn

@geindex firstChild (xml.dom.Node의 속성)
@anchor{library/xml dom xml dom Node firstChild}@anchor{3d98}
@deffn {속성} Node.firstChild

노드의 첫 번째 자식 (있다면), 또는 @code{None}. 이것은 읽기 전용 어트리뷰트입니다.
@end deffn

@geindex lastChild (xml.dom.Node의 속성)
@anchor{library/xml dom xml dom Node lastChild}@anchor{3d99}
@deffn {속성} Node.lastChild

노드의 마지막 자식 (있다면), 또는 @code{None}. 이것은 읽기 전용 어트리뷰트입니다.
@end deffn

@geindex localName (xml.dom.Node의 속성)
@anchor{library/xml dom xml dom Node localName}@anchor{3d9a}
@deffn {속성} Node.localName

콜론이 있으면 그 뒤에 오는 @code{tagName}의 부분, 그렇지 않으면 전체 @code{tagName}. 값은 문자열입니다.
@end deffn

@geindex prefix (xml.dom.Node의 속성)
@anchor{library/xml dom xml dom Node prefix}@anchor{3d9b}
@deffn {속성} Node.prefix

콜론이 있으면 그 앞에 오는 @code{tagName}의 부분, 그렇지 않으면 빈 문자열. 값은 문자열이나 @code{None}입니다.
@end deffn

@geindex namespaceURI (xml.dom.Node의 속성)
@anchor{library/xml dom xml dom Node namespaceURI}@anchor{3d9c}
@deffn {속성} Node.namespaceURI

엘리먼트 이름과 연관된 이름 공간. 이것은 문자열이나 @code{None}입니다. 이것은 읽기 전용 어트리뷰트입니다.
@end deffn

@geindex nodeName (xml.dom.Node의 속성)
@anchor{library/xml dom xml dom Node nodeName}@anchor{3d9d}
@deffn {속성} Node.nodeName

이는 각 노드 형마다 다른 의미입니다; 자세한 내용은 DOM 명세를 참조하십시오. 여기서 얻는 정보를 항상 다른 프로퍼티에서 얻을 수 있습니다, 가령 엘리먼트의 @code{tagName} 프로퍼티나 어트리뷰트의 @code{name} 프로퍼티. 모든 노드 형에서, 이 어트리뷰트의 값은 문자열이나 @code{None}입니다. 이것은 읽기 전용 어트리뷰트입니다.
@end deffn

@geindex nodeValue (xml.dom.Node의 속성)
@anchor{library/xml dom xml dom Node nodeValue}@anchor{3d9e}
@deffn {속성} Node.nodeValue

이는 각 노드 형마다 다른 의미입니다; 자세한 내용은 DOM 명세를 참조하십시오. 상황은 @ref{3d9d,,nodeName}과 유사합니다. 값은 문자열이나 @code{None}입니다.
@end deffn

@geindex hasAttributes() (xml.dom.Node 메서드)
@anchor{library/xml dom xml dom Node hasAttributes}@anchor{3d9f}
@deffn {메서드} Node.hasAttributes ()

노드에 어트리뷰트가 있으면 @code{True}를 반환합니다.
@end deffn

@geindex hasChildNodes() (xml.dom.Node 메서드)
@anchor{library/xml dom xml dom Node hasChildNodes}@anchor{3da0}
@deffn {메서드} Node.hasChildNodes ()

노드에 자식 노드가 있으면 @code{True}를 반환합니다.
@end deffn

@geindex isSameNode() (xml.dom.Node 메서드)
@anchor{library/xml dom xml dom Node isSameNode}@anchor{3da1}
@deffn {메서드} Node.isSameNode (other)

`other'가 이 노드와 같은 노드를 가리키면 @code{True}를 반환합니다. 이것은 모든 종류의 프락시 구조를 사용하는 DOM 구현에서 특히 유용합니다 (여러 객체가 같은 노드를 가리킬 수 있기 때문입니다).

@cartouche
@quotation 참고 
이것은 여전히 “작업 초안” 단계에 있는 제안된 DOM 수준 3 API를 기반으로 하지만, 이 특정 인터페이스는 논란의 여지가 없는 것으로 보입니다. W3C의 변경 사항이 파이썬 DOM 인터페이스에서 이 메서드에 반드시 영향을 미치는 것은 아닙니다 (이를 위한 새 W3C API도 지원되기는 하겠지만).
@end quotation
@end cartouche
@end deffn

@geindex appendChild() (xml.dom.Node 메서드)
@anchor{library/xml dom xml dom Node appendChild}@anchor{3da2}
@deffn {메서드} Node.appendChild (newChild)

자식 리스트의 끝에 이 노드의 새 자식 노드를 추가하고, `newChild'를 반환합니다. 노드가 이미 트리에 있으면, 먼저 제거됩니다.
@end deffn

@geindex insertBefore() (xml.dom.Node 메서드)
@anchor{library/xml dom xml dom Node insertBefore}@anchor{3da3}
@deffn {메서드} Node.insertBefore (newChild, refChild)

기존 자식 앞에 새 자식 노드를 삽입합니다. `refChild'가 이 노드의 자식이어야 합니다; 그렇지 않으면 @ref{2ec,,ValueError}가 발생합니다. `newChild'가 반환됩니다. `refChild'가 @code{None}이면, 자식 리스트의 끝에 `newChild'를 삽입합니다.
@end deffn

@geindex removeChild() (xml.dom.Node 메서드)
@anchor{library/xml dom xml dom Node removeChild}@anchor{3da4}
@deffn {메서드} Node.removeChild (oldChild)

자식 노드를 제거합니다. `oldChild'는 이 노드의 자식이어야 합니다; 그렇지 않으면, @ref{2ec,,ValueError}가 발생합니다. 성공하면 `oldChild'가 반환됩니다. `oldChild'가 더는 사용되지 않으면, 그것의 @code{unlink()} 메서드를 호출해야 합니다.
@end deffn

@geindex replaceChild() (xml.dom.Node 메서드)
@anchor{library/xml dom xml dom Node replaceChild}@anchor{3da5}
@deffn {메서드} Node.replaceChild (newChild, oldChild)

기존 노드를 새 노드로 교체합니다. `oldChild'는 이 노드의 자식이어야 합니다. 그렇지 않으면, @ref{2ec,,ValueError}가 발생합니다.
@end deffn

@geindex normalize() (xml.dom.Node 메서드)
@anchor{library/xml dom xml dom Node normalize}@anchor{3da6}
@deffn {메서드} Node.normalize ()

모든 텍스트 스트레치(stretch)가 단일 @code{Text} 인스턴스로 저장되도록, 인접한 텍스트 노드를 결합합니다. 이는 많은 응용 프로그램에서 DOM 트리의 텍스트 처리를 단순화합니다.
@end deffn

@geindex cloneNode() (xml.dom.Node 메서드)
@anchor{library/xml dom xml dom Node cloneNode}@anchor{3da7}
@deffn {메서드} Node.cloneNode (deep)

이 노드를 복제합니다. `deep'을 설정하면 모든 자식 노드도 복제됩니다. 복제를 반환합니다.
@end deffn

@node NodeList 객체,DocumentType 객체,Node 객체,DOM의 객체
@anchor{library/xml dom dom-nodelist-objects}@anchor{23ab}@anchor{library/xml dom nodelist-objects}@anchor{3da8}
@subsubsection NodeList 객체


@code{NodeList}는 노드의 시퀀스를 나타냅니다. 이러한 객체는 DOM Core 권장 사항에서 두 가지 방식으로 사용됩니다: @code{Element} 객체는 자식 노드의 리스트를 제공하고, @code{Node}의 @code{getElementsByTagName()}과 @code{getElementsByTagNameNS()} 메서드는 이 인터페이스를 사용하여 조회 결과를 나타냅니다.

DOM 수준 2 권장 사항은 이러한 객체에 대해 하나의 메서드와 하나의 어트리뷰트를 정의합니다:

@geindex item() (xml.dom.NodeList 메서드)
@anchor{library/xml dom xml dom NodeList item}@anchor{3da9}
@deffn {메서드} NodeList.item (i)

시퀀스의 `i' 번째 항목(있다면)이나 @code{None}을 반환합니다. 인덱스 `i'는 0보다 작거나 시퀀스의 길이보다 크거나 같을 수 없습니다.
@end deffn

@geindex length (xml.dom.NodeList의 속성)
@anchor{library/xml dom xml dom NodeList length}@anchor{3daa}
@deffn {속성} NodeList.length

시퀀스의 노드 수.
@end deffn

또한, 파이썬 DOM 인터페이스는 @code{NodeList} 객체를 파이썬 시퀀스로 사용할 수 있도록 몇 가지 추가 지원을 요구합니다. 모든 @code{NodeList} 구현에는 @ref{1797,,__len__()}과 @ref{588,,__getitem__()}에 대한 지원이 포함되어야 합니다; 이를 통해 @ref{34a,,for} 문에서 @code{NodeList}를 이터레이트할 수 있고, @ref{83f,,len()} 내장 함수를 적절히 지원할 수 있습니다.

DOM 구현이 문서 수정을 지원하면, @code{NodeList} 구현은 @ref{14d0,,__setitem__()}과 @ref{14d1,,__delitem__()} 메서드도 지원해야 합니다.

@node DocumentType 객체,Document 객체,NodeList 객체,DOM의 객체
@anchor{library/xml dom documenttype-objects}@anchor{3dab}@anchor{library/xml dom dom-documenttype-objects}@anchor{3d86}
@subsubsection DocumentType 객체


문서에 의해 선언된 표기법과 엔티티에 대한 정보(구문 분석기가 사용하고 정보를 제공할 수 있으면 외부 부분 집합(external subset)을 포함하는)는 @code{DocumentType} 객체에서 사용 가능합니다. 문서의 @code{DocumentType}은 @code{Document} 객체의 @code{doctype} 어트리뷰트에서 사용 가능합니다; 문서에 @code{DOCTYPE} 선언이 없으면, 문서의 @code{doctype} 어트리뷰트는 이 인터페이스의 인스턴스 대신 @code{None}으로 설정됩니다.

@code{DocumentType}은 @code{Node}의 특수화(specialization)이고 다음 어트리뷰트를 추가합니다:

@geindex publicId (xml.dom.DocumentType의 속성)
@anchor{library/xml dom xml dom DocumentType publicId}@anchor{3dac}
@deffn {속성} DocumentType.publicId

문서 형 정의의 외부 부분 집합(external subset)에 대한 공용 식별자. 문자열이나 @code{None}입니다.
@end deffn

@geindex systemId (xml.dom.DocumentType의 속성)
@anchor{library/xml dom xml dom DocumentType systemId}@anchor{3dad}
@deffn {속성} DocumentType.systemId

문서 형 정의의 외부 부분 집합(external subset)에 대한 시스템 식별자. 문자열로 표현된 URI이거나 @code{None}입니다.
@end deffn

@geindex internalSubset (xml.dom.DocumentType의 속성)
@anchor{library/xml dom xml dom DocumentType internalSubset}@anchor{3dae}
@deffn {속성} DocumentType.internalSubset

문서에서 완전한 내부 부분 집합(internal subset)을 제공하는 문자열. 부분 집합을 묶는 대괄호는 포함되지 않습니다. 문서에 내부 부분 집합이 없으면 @code{None}이어야 합니다.
@end deffn

@geindex name (xml.dom.DocumentType의 속성)
@anchor{library/xml dom xml dom DocumentType name}@anchor{3daf}
@deffn {속성} DocumentType.name

@code{DOCTYPE} 선언에 제공된 루트 엘리먼트의 이름 (있다면).
@end deffn

@geindex entities (xml.dom.DocumentType의 속성)
@anchor{library/xml dom xml dom DocumentType entities}@anchor{3db0}
@deffn {속성} DocumentType.entities

외부 엔티티의 정의를 제공하는 @code{NamedNodeMap}입니다. 엔티티 이름이 두 번 이상 정의되면, 첫 번째 정의 만 제공됩니다 (XML 권장 사항에 따라 다른 정의는 무시됩니다). 구문 분석기가 정보를 제공하지 않거나 정의된 엔티티가 없으면 @code{None}일 수 있습니다.
@end deffn

@geindex notations (xml.dom.DocumentType의 속성)
@anchor{library/xml dom xml dom DocumentType notations}@anchor{3db1}
@deffn {속성} DocumentType.notations

표기법의 정의를 제공하는 @code{NamedNodeMap}입니다. 표기법 이름이 두 번 이상 정의되면, 첫 번째 정의 만 제공됩니다 (XML 권장 사항에 따라 다른 정의는 무시됩니다). 구문 분석기가 정보를 제공하지 않거나 정의된 표기법이 없으면 @code{None}일 수 있습니다.
@end deffn

@node Document 객체,Element 객체<2>,DocumentType 객체,DOM의 객체
@anchor{library/xml dom document-objects}@anchor{3db2}@anchor{library/xml dom dom-document-objects}@anchor{3d87}
@subsubsection Document 객체


@code{Document}는 구성 엘리먼트, 어트리뷰트, 처리 명령어, 주석 등을 포함한 전체 XML 문서를 나타냅니다. @code{Node}의 프로퍼티를 상속한다는 점을 기억하십시오.

@geindex documentElement (xml.dom.Document의 속성)
@anchor{library/xml dom xml dom Document documentElement}@anchor{1787}
@deffn {속성} Document.documentElement

문서의 유일한 루트 엘리먼트.
@end deffn

@geindex createElement() (xml.dom.Document 메서드)
@anchor{library/xml dom xml dom Document createElement}@anchor{3db3}
@deffn {메서드} Document.createElement (tagName)

새 엘리먼트 노드를 만들고 반환합니다. 엘리먼트는 만들어질 때 문서에 삽입되지 않습니다. @code{insertBefore()}나 @code{appendChild()}와 같은 다른 메서드 중 하나를 사용하여 명시적으로 삽입해야 합니다.
@end deffn

@geindex createElementNS() (xml.dom.Document 메서드)
@anchor{library/xml dom xml dom Document createElementNS}@anchor{3db4}
@deffn {메서드} Document.createElementNS (namespaceURI, tagName)

이름 공간을 사용하여 새 엘리먼트를 만들고 반환합니다. `tagName'은 접두사를 가질 수 있습니다. 엘리먼트는 만들어질 때 문서에 삽입되지 않습니다. @code{insertBefore()}나 @code{appendChild()}와 같은 다른 메서드 중 하나를 사용하여 명시적으로 삽입해야 합니다.
@end deffn

@geindex createTextNode() (xml.dom.Document 메서드)
@anchor{library/xml dom xml dom Document createTextNode}@anchor{3db5}
@deffn {메서드} Document.createTextNode (data)

매개 변수로 전달된 data를 포함하는 텍스트 노드를 만들고 반환합니다. 다른 생성 메서드와 마찬가지로 이 메서드는 노드를 트리에 삽입하지 않습니다.
@end deffn

@geindex createComment() (xml.dom.Document 메서드)
@anchor{library/xml dom xml dom Document createComment}@anchor{3db6}
@deffn {메서드} Document.createComment (data)

매개 변수로 전달된 data를 포함하는 주석 노드를 만들고 반환합니다. 다른 생성 메서드와 마찬가지로 이 메서드는 노드를 트리에 삽입하지 않습니다.
@end deffn

@geindex createProcessingInstruction() (xml.dom.Document 메서드)
@anchor{library/xml dom xml dom Document createProcessingInstruction}@anchor{3db7}
@deffn {메서드} Document.createProcessingInstruction (target, data)

매개 변수로 전달된 `target'과 `data'를 포함하는 처리 명령어 노드를 만들고 반환합니다. 다른 생성 메서드와 마찬가지로 이 메서드는 노드를 트리에 삽입하지 않습니다.
@end deffn

@geindex createAttribute() (xml.dom.Document 메서드)
@anchor{library/xml dom xml dom Document createAttribute}@anchor{3db8}
@deffn {메서드} Document.createAttribute (name)

어트리뷰트 노드를 만들고 반환합니다. 이 메서드는 어트리뷰틀 노드를 특정 엘리먼트와 연관시키지 않습니다. 새로 만들어진 어트리뷰트 인스턴스를 사용하려면 적절한 @code{Element} 객체에서 @code{setAttributeNode()}를 사용해야 합니다.
@end deffn

@geindex createAttributeNS() (xml.dom.Document 메서드)
@anchor{library/xml dom xml dom Document createAttributeNS}@anchor{3db9}
@deffn {메서드} Document.createAttributeNS (namespaceURI, qualifiedName)

이름 공간을 사용하여 어트리뷰트 노드를 만들고 반환합니다. `tagName'은 접두사를 가질 수 있습니다. 이 메서드는 어트리뷰트 노드를 특정 엘리먼트와 연관시키지 않습니다. 새로 만들어진 어트리뷰트 인스턴스를 사용하려면 적절한 @code{Element} 객체에서 @code{setAttributeNode()}를 사용해야합니다.
@end deffn

@geindex getElementsByTagName() (xml.dom.Document 메서드)
@anchor{library/xml dom xml dom Document getElementsByTagName}@anchor{3dba}
@deffn {메서드} Document.getElementsByTagName (tagName)

특정 엘리먼트 형 이름을 가진 모든 자손(직계 자식, 자식의 자식 등)을 검색합니다.
@end deffn

@geindex getElementsByTagNameNS() (xml.dom.Document 메서드)
@anchor{library/xml dom xml dom Document getElementsByTagNameNS}@anchor{3dbb}
@deffn {메서드} Document.getElementsByTagNameNS (namespaceURI, localName)

특정 이름 공간 URI와 지역 이름(localname)을 사용하여 모든 자손(직계 자식, 자식의 자식 등)을 검색합니다. 지역 이름은 접두사 다음에 나오는 이름 공간의 일부입니다.
@end deffn

@node Element 객체<2>,Attr 객체,Document 객체,DOM의 객체
@anchor{library/xml dom dom-element-objects}@anchor{3d88}@anchor{library/xml dom element-objects}@anchor{3dbc}
@subsubsection Element 객체


@code{Element}는 @code{Node}의 서브 클래스이므로, 모든 어트리뷰트를 상속합니다.

@geindex tagName (xml.dom.Element의 속성)
@anchor{library/xml dom xml dom Element tagName}@anchor{3dbd}
@deffn {속성} Element.tagName

엘리먼트 형 이름. 이름 공간을 사용하는 문서에서는 콜론을 포함할 수 있습니다. 값은 문자열입니다.
@end deffn

@geindex getElementsByTagName() (xml.dom.Element 메서드)
@anchor{library/xml dom xml dom Element getElementsByTagName}@anchor{3dbe}
@deffn {메서드} Element.getElementsByTagName (tagName)

@code{Document} 클래스의 동등한 메서드와 같습니다.
@end deffn

@geindex getElementsByTagNameNS() (xml.dom.Element 메서드)
@anchor{library/xml dom xml dom Element getElementsByTagNameNS}@anchor{3dbf}
@deffn {메서드} Element.getElementsByTagNameNS (namespaceURI, localName)

@code{Document} 클래스의 동등한 메서드와 같습니다.
@end deffn

@geindex hasAttribute() (xml.dom.Element 메서드)
@anchor{library/xml dom xml dom Element hasAttribute}@anchor{3dc0}
@deffn {메서드} Element.hasAttribute (name)

엘리먼트에 `name'이라는 이름의 어트리뷰트가 있으면 @code{True}를 반환합니다.
@end deffn

@geindex hasAttributeNS() (xml.dom.Element 메서드)
@anchor{library/xml dom xml dom Element hasAttributeNS}@anchor{3dc1}
@deffn {메서드} Element.hasAttributeNS (namespaceURI, localName)

엘리먼트에 `namespaceURI'와 `localName'으로 이름이 지정된 어트리뷰트가 있으면 @code{True}를 반환합니다.
@end deffn

@geindex getAttribute() (xml.dom.Element 메서드)
@anchor{library/xml dom xml dom Element getAttribute}@anchor{3dc2}
@deffn {메서드} Element.getAttribute (name)

`name'이라는 이름의 어트리뷰트의 값을 문자열로 반환합니다. 그러한 어트리뷰트가 없으면, 어트리뷰트에 값이 없는 것처럼 빈 문자열이 반환됩니다.
@end deffn

@geindex getAttributeNode() (xml.dom.Element 메서드)
@anchor{library/xml dom xml dom Element getAttributeNode}@anchor{3dc3}
@deffn {메서드} Element.getAttributeNode (attrname)

`attrname'이라는 이름의 어트리뷰트에 대한 @code{Attr} 노드를 반환합니다.
@end deffn

@geindex getAttributeNS() (xml.dom.Element 메서드)
@anchor{library/xml dom xml dom Element getAttributeNS}@anchor{3dc4}
@deffn {메서드} Element.getAttributeNS (namespaceURI, localName)

`namespaceURI'와 `localName'으로 이름이 지정된 어트리뷰트의 값을 문자열로 반환합니다. 그러한 어트리뷰트가 없으면, 어트리뷰트에 값이 없는 것처럼 빈 문자열이 반환됩니다.
@end deffn

@geindex getAttributeNodeNS() (xml.dom.Element 메서드)
@anchor{library/xml dom xml dom Element getAttributeNodeNS}@anchor{3dc5}
@deffn {메서드} Element.getAttributeNodeNS (namespaceURI, localName)

`namespaceURI'와 `localName'으로 주어진 어트리뷰트의 값을 노드로 반환합니다.
@end deffn

@geindex removeAttribute() (xml.dom.Element 메서드)
@anchor{library/xml dom xml dom Element removeAttribute}@anchor{3dc6}
@deffn {메서드} Element.removeAttribute (name)

이름(name)으로 어트리뷰트를 제거합니다. 일치하는 어트리뷰트가 없으면 @ref{3dc7,,NotFoundErr}가 발생합니다.
@end deffn

@geindex removeAttributeNode() (xml.dom.Element 메서드)
@anchor{library/xml dom xml dom Element removeAttributeNode}@anchor{3dc8}
@deffn {메서드} Element.removeAttributeNode (oldAttr)

존재하면, 어트리뷰트 목록에서 `oldAttr'를 제거하고 반환합니다. `oldAttr'가 없으면 @ref{3dc7,,NotFoundErr}가 발생합니다.
@end deffn

@geindex removeAttributeNS() (xml.dom.Element 메서드)
@anchor{library/xml dom xml dom Element removeAttributeNS}@anchor{3dc9}
@deffn {메서드} Element.removeAttributeNS (namespaceURI, localName)

이름으로 어트리뷰트를 제거합니다. qname이 아닌 localName을 사용함에 유의하십시오. 일치하는 어트리뷰트가 없어도 예외가 발생하지 않습니다.
@end deffn

@geindex setAttribute() (xml.dom.Element 메서드)
@anchor{library/xml dom xml dom Element setAttribute}@anchor{3dca}
@deffn {메서드} Element.setAttribute (name, value)

문자열로 어트리뷰트 값을 설정합니다.
@end deffn

@geindex setAttributeNode() (xml.dom.Element 메서드)
@anchor{library/xml dom xml dom Element setAttributeNode}@anchor{3dcb}
@deffn {메서드} Element.setAttributeNode (newAttr)

엘리먼트에 새 어트리뷰트 노드를 추가합니다. @code{name} 어트리뷰트가 일치할 때 필요하면 기존 어트리뷰트를 대체합니다. 대체가 발생하면, 이전 어트리뷰트 노드가 반환됩니다. `newAttr'가 이미 사용 중이면 @ref{3dcc,,InuseAttributeErr}가 발생합니다.
@end deffn

@geindex setAttributeNodeNS() (xml.dom.Element 메서드)
@anchor{library/xml dom xml dom Element setAttributeNodeNS}@anchor{3dcd}
@deffn {메서드} Element.setAttributeNodeNS (newAttr)

엘리먼트에 새 어트리뷰트 노드를 추가합니다. @code{namespaceURI}와 @code{localName} 어트리뷰트가 일치할 때 필요하면 기존 어트리뷰트를 대체합니다. 대체가 발생하면 이전 어트리뷰트 노드가 반환됩니다. `newAttr'가 이미 사용 중이면 @ref{3dcc,,InuseAttributeErr}가 발생합니다.
@end deffn

@geindex setAttributeNS() (xml.dom.Element 메서드)
@anchor{library/xml dom xml dom Element setAttributeNS}@anchor{3dce}
@deffn {메서드} Element.setAttributeNS (namespaceURI, qname, value)

문자열로 `namespaceURI'와 `qname'으로 지정된 어트리뷰트 값을 설정합니다. qname은 전체 어트리뷰트 이름임에 유의하십시오. 이것은 위와 다릅니다.
@end deffn

@node Attr 객체,NamedNodeMap 객체,Element 객체<2>,DOM의 객체
@anchor{library/xml dom attr-objects}@anchor{3dcf}@anchor{library/xml dom dom-attr-objects}@anchor{3d89}
@subsubsection Attr 객체


@code{Attr}은 @code{Node}를 상속하므로, 모든 어트리뷰트를 상속합니다.

@geindex name (xml.dom.Attr의 속성)
@anchor{library/xml dom xml dom Attr name}@anchor{3dd0}
@deffn {속성} Attr.name

어트리뷰트 이름. 이름 공간을 사용하는 문서에서는 콜론을 포함할 수 있습니다.
@end deffn

@geindex localName (xml.dom.Attr의 속성)
@anchor{library/xml dom xml dom Attr localName}@anchor{3dd1}
@deffn {속성} Attr.localName

콜론이 있으면 그 뒤에 오는 이름의 일부, 그렇지 않으면 전체 이름. 이것은 읽기 전용 어트리뷰트입니다.
@end deffn

@geindex prefix (xml.dom.Attr의 속성)
@anchor{library/xml dom xml dom Attr prefix}@anchor{3dd2}
@deffn {속성} Attr.prefix

콜론이 있으면 그 앞에 오는 이름의 일부, 그렇지 않으면 빈 문자열.
@end deffn

@geindex value (xml.dom.Attr의 속성)
@anchor{library/xml dom xml dom Attr value}@anchor{3dd3}
@deffn {속성} Attr.value

어트리뷰트의 텍스트 값. 이것은 @code{nodeValue} 어트리뷰트의 동의어입니다.
@end deffn

@node NamedNodeMap 객체,Comment 객체,Attr 객체,DOM의 객체
@anchor{library/xml dom dom-attributelist-objects}@anchor{3dd4}@anchor{library/xml dom namednodemap-objects}@anchor{3dd5}
@subsubsection NamedNodeMap 객체


@code{NamedNodeMap}은 @code{Node}를 상속하지 `않습니다'.

@geindex length (xml.dom.NamedNodeMap의 속성)
@anchor{library/xml dom xml dom NamedNodeMap length}@anchor{3dd6}
@deffn {속성} NamedNodeMap.length

어트리뷰트 목록의 길이입니다.
@end deffn

@geindex item() (xml.dom.NamedNodeMap 메서드)
@anchor{library/xml dom xml dom NamedNodeMap item}@anchor{3dd7}
@deffn {메서드} NamedNodeMap.item (index)

특정 인덱스에 있는 어트리뷰트를 반환합니다. 어트리뷰트를 얻는 순서는 임의적이지만 DOM 수명 동안 일관적입니다. 각 항목은 어트리뷰트 노드입니다. @code{value} 어트리뷰트로 값을 얻으십시오.
@end deffn

이 클래스에 더 많은 매핑 동작을 제공하는 실험적인 메서드도 있습니다. 이를 사용하거나 @code{Element} 객체에서 표준화된 @code{getAttribute*()} 메서드 집합을 사용할 수 있습니다.

@node Comment 객체,Text와 CDATASection 객체,NamedNodeMap 객체,DOM의 객체
@anchor{library/xml dom comment-objects}@anchor{3dd8}@anchor{library/xml dom dom-comment-objects}@anchor{3d8a}
@subsubsection Comment 객체


@code{Comment}는 XML 문서의 주석을 나타냅니다. @code{Node}의 서브 클래스이지만, 자식 노드를 가질 수 없습니다.

@geindex data (xml.dom.Comment의 속성)
@anchor{library/xml dom xml dom Comment data}@anchor{3dd9}
@deffn {속성} Comment.data

주석의 내용을 제공하는 문자열. 이 어트리뷰트는 선행 @code{<!-}@code{-}와 후행 @code{-}@code{->} 사이의 모든 문자를 포함하지만, 이들을 포함하지는 않습니다.
@end deffn

@node Text와 CDATASection 객체,ProcessingInstruction 객체,Comment 객체,DOM의 객체
@anchor{library/xml dom dom-text-objects}@anchor{3d8b}@anchor{library/xml dom text-and-cdatasection-objects}@anchor{3dda}
@subsubsection Text와 CDATASection 객체


@code{Text} 인터페이스는 XML 문서의 텍스트를 나타냅니다. 구문 분석기와 DOM 구현이 DOM의 XML 확장을 지원하면, CDATA로 표시된 섹션으로 묶인 텍스트 부분은 @code{CDATASection} 객체에 저장됩니다. 이 두 인터페이스는 같지만, @code{nodeType} 어트리뷰트에서 다른 값을 제공합니다.

이 인터페이스는 @code{Node} 인터페이스를 확장합니다. 자식 노드를 가질 수 없습니다.

@geindex data (xml.dom.Text의 속성)
@anchor{library/xml dom xml dom Text data}@anchor{3ddb}
@deffn {속성} Text.data

문자열로 표현된 텍스트 노드의 내용.
@end deffn

@cartouche
@quotation 참고 
@code{CDATASection} 노드의 사용이 그 노드가 완전한 CDATA 표시 섹션을 표현한다고 나타내는 것은 아닙니다, 단지 노드의 내용이 CDATA 섹션의 일부임을 나타낼 뿐입니다. 단일 CDATA 섹션은 문서 트리에서 둘 이상의 노드로 표현될 수 있습니다. 인접한 두 개의 @code{CDATASection} 노드가 다른 CDATA 표시 섹션을 나타내는지를 확인할 방법은 없습니다.
@end quotation
@end cartouche

@node ProcessingInstruction 객체,예외<17>,Text와 CDATASection 객체,DOM의 객체
@anchor{library/xml dom dom-pi-objects}@anchor{3d8c}@anchor{library/xml dom processinginstruction-objects}@anchor{3ddc}
@subsubsection ProcessingInstruction 객체


XML 문서의 처리 명령어를 나타냅니다; 이것은 @code{Node} 인터페이스를 상속하며 자식 노드를 가질 수 없습니다.

@geindex target (xml.dom.ProcessingInstruction의 속성)
@anchor{library/xml dom xml dom ProcessingInstruction target}@anchor{3ddd}
@deffn {속성} ProcessingInstruction.target

첫 번째 공백 문자까지의 처리 명령어의 내용. 이것은 읽기 전용 어트리뷰트입니다.
@end deffn

@geindex data (xml.dom.ProcessingInstruction의 속성)
@anchor{library/xml dom xml dom ProcessingInstruction data}@anchor{3dde}
@deffn {속성} ProcessingInstruction.data

첫 번째 공백 문자 다음에 오는 처리 명령어의 내용.
@end deffn

@node 예외<17>,,ProcessingInstruction 객체,DOM의 객체
@anchor{library/xml dom dom-exceptions}@anchor{3ddf}@anchor{library/xml dom exceptions}@anchor{3de0}
@subsubsection 예외


DOM 수준 2 권장 사항은 단일 예외 @ref{3de1,,DOMException}과 응용 프로그램이 어떤 종류의 에러가 발생했는지 판별하도록 하는 여러 상수를 정의합니다. @code{DOMException} 인스턴스에는 구체적인 예외에 적절한 값을 제공하는 @ref{1b,,code} 어트리뷰트가 있습니다.

파이썬 DOM 인터페이스는 상수를 제공하지만, 동시에 예외 집합을 확장하여 DOM에 의해 정의된 각 예외 코드마다 구체적인 예외가 존재하도록 합니다. 구현 시 적절한 구체적인 예외를 발생시켜야 하며, 각 예외는 @ref{1b,,code} 속성으로 적절한 값을 제공합니다.

@geindex DOMException
@anchor{library/xml dom xml dom DOMException}@anchor{3de1}
@deffn {예외} xml.dom.DOMException

모든 구체적인 DOM 예외에 사용되는 베이스 예외 클래스. 이 예외 클래스는 직접 인스턴스 화할 수 없습니다.
@end deffn

@geindex DomstringSizeErr
@anchor{library/xml dom xml dom DomstringSizeErr}@anchor{3de2}
@deffn {예외} xml.dom.DomstringSizeErr

지정된 텍스트 범위가 문자열에 맞지 않을 때 발생합니다. 이것은 파이썬 DOM 구현에서 사용되는 것으로 알려지지 않았지만, 파이썬으로 작성되지 않은 DOM 구현에서 수신될 수 있습니다.
@end deffn

@geindex HierarchyRequestErr
@anchor{library/xml dom xml dom HierarchyRequestErr}@anchor{3de3}
@deffn {예외} xml.dom.HierarchyRequestErr

노드 형이 허용하지 않는 곳에 노드를 삽입하려고 할 때 발생합니다.
@end deffn

@geindex IndexSizeErr
@anchor{library/xml dom xml dom IndexSizeErr}@anchor{3de4}
@deffn {예외} xml.dom.IndexSizeErr

메서드의 인덱스(index)나 크기(size) 매개 변수가 음수이거나 허용된 값을 초과할 때 발생합니다.
@end deffn

@geindex InuseAttributeErr
@anchor{library/xml dom xml dom InuseAttributeErr}@anchor{3dcc}
@deffn {예외} xml.dom.InuseAttributeErr

문서의 다른 곳에 이미 존재하는 @code{Attr} 노드를 삽입하려고 할 때 발생합니다.
@end deffn

@geindex InvalidAccessErr
@anchor{library/xml dom xml dom InvalidAccessErr}@anchor{3de5}
@deffn {예외} xml.dom.InvalidAccessErr

하부 객체에서 매개 변수나 연산이 지원되지 않으면 발생합니다.
@end deffn

@geindex InvalidCharacterErr
@anchor{library/xml dom xml dom InvalidCharacterErr}@anchor{3de6}
@deffn {예외} xml.dom.InvalidCharacterErr

이 예외는 문자열 매개 변수에 XML 1.0 권장 사항에서 사용 중인 컨텍스트에서 허용되지 않는 문자가 포함될 때 발생합니다. 예를 들어, 엘리먼트 형 이름에 스페이스가 있는 @code{Element} 노드를 만들려고 하면 이 에러가 발생합니다.
@end deffn

@geindex InvalidModificationErr
@anchor{library/xml dom xml dom InvalidModificationErr}@anchor{3de7}
@deffn {예외} xml.dom.InvalidModificationErr

노드 형을 수정하려고 할 때 발생합니다.
@end deffn

@geindex InvalidStateErr
@anchor{library/xml dom xml dom InvalidStateErr}@anchor{3de8}
@deffn {예외} xml.dom.InvalidStateErr

정의되지 않았거나 더는 사용할 수 없는 객체를 사용하려고 할 때 발생합니다.
@end deffn

@geindex NamespaceErr
@anchor{library/xml dom xml dom NamespaceErr}@anchor{3de9}
@deffn {예외} xml.dom.NamespaceErr

Namespaces in XML@footnote{https://www.w3.org/TR/REC-xml-names/} 권장 사항에서 허용되지 않는 방식으로 객체를 변경하려고 시도하면 이 예외가 발생합니다.
@end deffn

@geindex NotFoundErr
@anchor{library/xml dom xml dom NotFoundErr}@anchor{3dc7}
@deffn {예외} xml.dom.NotFoundErr

참조된 컨텍스트에 노드가 존재하지 않을 때 발생하는 예외. 예를 들어, @code{NamedNodeMap.removeNamedItem()}은 전달된 노드가 맵에 존재하지 않으면 이것을 발생시킵니다.
@end deffn

@geindex NotSupportedErr
@anchor{library/xml dom xml dom NotSupportedErr}@anchor{3dea}
@deffn {예외} xml.dom.NotSupportedErr

구현이 요청된 형의 객체나 연산을 지원하지 않을 때 발생합니다.
@end deffn

@geindex NoDataAllowedErr
@anchor{library/xml dom xml dom NoDataAllowedErr}@anchor{3deb}
@deffn {예외} xml.dom.NoDataAllowedErr

데이터를 지원하지 않는 노드에 데이터가 지정되면 발생합니다.

@c XXX  a better explanation is needed!
@end deffn

@geindex NoModificationAllowedErr
@anchor{library/xml dom xml dom NoModificationAllowedErr}@anchor{3dec}
@deffn {예외} xml.dom.NoModificationAllowedErr

수정이 허용되지 않는 객체(가령 읽기 전용 노드)를 수정하려고 하면 발생합니다.
@end deffn

@geindex SyntaxErr
@anchor{library/xml dom xml dom SyntaxErr}@anchor{3ded}
@deffn {예외} xml.dom.SyntaxErr

유효하지 않거나 잘못된 문자열이 지정될 때 발생합니다.

@c XXX  how is this different from InvalidCharacterErr?
@end deffn

@geindex WrongDocumentErr
@anchor{library/xml dom xml dom WrongDocumentErr}@anchor{3dee}
@deffn {예외} xml.dom.WrongDocumentErr

노드가 현재 속한 것과 다른 문서에 삽입되고 구현이 한 문서에서 다른 문서로 노드 이전을 지원하지 않을 때 발생합니다.
@end deffn

DOM 권장 사항에 정의된 예외 코드는 이 테이블에 따라 위에서 설명한 예외에 매핑됩니다:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

상수

@tab

예외

@item

@code{DOMSTRING_SIZE_ERR}

@tab

@ref{3de2,,DomstringSizeErr}

@item

@code{HIERARCHY_REQUEST_ERR}

@tab

@ref{3de3,,HierarchyRequestErr}

@item

@code{INDEX_SIZE_ERR}

@tab

@ref{3de4,,IndexSizeErr}

@item

@code{INUSE_ATTRIBUTE_ERR}

@tab

@ref{3dcc,,InuseAttributeErr}

@item

@code{INVALID_ACCESS_ERR}

@tab

@ref{3de5,,InvalidAccessErr}

@item

@code{INVALID_CHARACTER_ERR}

@tab

@ref{3de6,,InvalidCharacterErr}

@item

@code{INVALID_MODIFICATION_ERR}

@tab

@ref{3de7,,InvalidModificationErr}

@item

@code{INVALID_STATE_ERR}

@tab

@ref{3de8,,InvalidStateErr}

@item

@code{NAMESPACE_ERR}

@tab

@ref{3de9,,NamespaceErr}

@item

@code{NOT_FOUND_ERR}

@tab

@ref{3dc7,,NotFoundErr}

@item

@code{NOT_SUPPORTED_ERR}

@tab

@ref{3dea,,NotSupportedErr}

@item

@code{NO_DATA_ALLOWED_ERR}

@tab

@ref{3deb,,NoDataAllowedErr}

@item

@code{NO_MODIFICATION_ALLOWED_ERR}

@tab

@ref{3dec,,NoModificationAllowedErr}

@item

@code{SYNTAX_ERR}

@tab

@ref{3ded,,SyntaxErr}

@item

@code{WRONG_DOCUMENT_ERR}

@tab

@ref{3dee,,WrongDocumentErr}

@end multitable


@node 규격 준수,,DOM의 객체,xml dom — 문서 객체 모델 API
@anchor{library/xml dom conformance}@anchor{3def}@anchor{library/xml dom dom-conformance}@anchor{3d7b}
@subsubsection 규격 준수


이 섹션에서는 규격 준수 요구 사항과 파이썬 DOM API, W3C DOM 권장 사항 및 파이썬의 OMG IDL 매핑 간의 관계에 관해 설명합니다.

@menu
* 형 매핑:: 
* 접근자 메서드:: 

@end menu

@node 형 매핑,접근자 메서드,,규격 준수
@anchor{library/xml dom dom-type-mapping}@anchor{3df0}@anchor{library/xml dom type-mapping}@anchor{3df1}
@subsubsection 형 매핑


DOM 명세에 사용된 IDL 형은 다음 표에 따라 파이썬 형에 매핑됩니다.


@multitable {xxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

IDL 형

@tab

파이썬 형

@item

@code{boolean}

@tab

@code{bool} 또는 @code{int}

@item

@code{int}

@tab

@code{int}

@item

@code{long int}

@tab

@code{int}

@item

@code{unsigned int}

@tab

@code{int}

@item

@code{DOMString}

@tab

@code{str} 또는 @code{bytes}

@item

@code{null}

@tab

@code{None}

@end multitable


@node 접근자 메서드,,형 매핑,규격 준수
@anchor{library/xml dom accessor-methods}@anchor{3df2}@anchor{library/xml dom dom-accessor-methods}@anchor{3df3}
@subsubsection 접근자 메서드


OMG IDL에서 파이썬으로의 매핑은 Java 매핑과 거의 같은 방식으로 IDL @code{attribute} 선언에 대한 접근자 함수를 정의합니다. 다음과 같은 IDL 선언 매핑은:

@example
readonly attribute string someValue;
         attribute string anotherValue;
@end example

세 개의 접근자 함수를 산출합니다: @code{someValue}를 위한 “get” 메서드(@code{_get_someValue()})와 @code{anotherValue}를 위한 “get”과 “set” 메서드(@code{_get_anotherValue()}와 @code{_set_anotherValue()}). 특히, 매핑은 IDL 어트리뷰트가 일반 파이썬 어트리뷰트로 액세스할 수 있도록 요구하지 않습니다: @code{object.someValue}는 작동할 필요 `없으며', @ref{5ee,,AttributeError}를 발생시킬 수 있습니다.

그러나, 파이썬 DOM API는 일반 어트리뷰트 액세스가 동작하도록 `요구합니다'. 이것은 파이썬 IDL 컴파일러에 의해 생성된 일반적인 서로게이트가 작동하지 않을 수 있으며, DOM 객체가 CORBA를 통해 액세스되는 경우 래퍼 객체가 클라이언트에 필요할 수 있음을 의미합니다. CORBA DOM 클라이언트에 대해 추가적인 고려가 필요하지만, 파이썬에서 CORBA를 통해 DOM을 사용한 경험이 있는 구현자들은 이것을 문제라고 보지 않습니다. @code{readonly}로 선언된 어트리뷰트는 모든 DOM 구현에서 쓰기 액세스를 제한하지 않을 수 있습니다.

파이썬 DOM API에서는, 접근자 함수가 필요하지 않습니다. 제공되면, 파이썬 IDL 매핑으로 정의된 형식을 취해야 하지만, 어트리뷰트를 파이썬에서 직접 액세스할 수 있어서 이러한 메서드들은 불필요한 것으로 간주합니다. @code{readonly} 어트리뷰트에 “set” 접근자를 제공해서는 안 됩니다.

IDL 정의는 W3C DOM API의 요구 사항을 완전히 담지 않습니다. 가령 @code{getElementsByTagName()}의 반환 값과 같은 특정 객체가 “살아있다(live)”는 개념과 같은 것을 표현하지 못합니다. 파이썬 DOM API는 구현이 이러한 요구 사항을 강제하도록 요구하지 않습니다.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node xml dom minidom — 최소 DOM 구현,xml dom pulldom — 부분 DOM 트리 구축 지원,xml dom — 문서 객체 모델 API,구조화된 마크업 처리 도구
@anchor{library/xml dom minidom doc}@anchor{3df4}@anchor{library/xml dom minidom module-xml dom minidom}@anchor{128}@anchor{library/xml dom minidom translation-repo}@anchor{3df5}@anchor{library/xml dom minidom xml-dom-minidom-minimal-dom-implementation}@anchor{3df6}
@subsection @code{xml.dom.minidom} — 최소 DOM 구현


@geindex module; xml.dom.minidom

`소스 코드:' Lib/xml/dom/minidom.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/xml/dom/minidom.py}


__________________________________________________________________


@code{xml.dom.minidom} is a minimal implementation of the Document Object
Model interface, with an API similar to that in other languages.  It is intended
to be simpler than the full DOM and also significantly smaller.  Users who are
not already proficient with the DOM should consider using the
@ref{12b,,xml.etree.ElementTree} module for their XML processing instead.

@cartouche
@quotation 참고 
If you need to parse untrusted or unauthenticated data, see
@ref{3d21,,XML security}.
@end quotation
@end cartouche

DOM applications typically start by parsing some XML into a DOM.  With
@code{xml.dom.minidom}, this is done through the parse functions:

@example
from xml.dom.minidom import parse, parseString

dom1 = parse('c:\\temp\\mydata.xml')  # 파일명으로 XML 파일을 구문 분석합니다

datasource = open('c:\\temp\\mydata.xml')
dom2 = parse(datasource)  # 열린 파일을 구문 분석합니다

dom3 = parseString('<myxml>Some data<empty/> some more data</myxml>')
@end example

@ref{3df7,,parse()} 함수는 파일명이나 열린 파일 객체를 취할 수 있습니다.

@geindex parse() (xml.dom.minidom 모듈)
@anchor{library/xml dom minidom xml dom minidom parse}@anchor{3df7}
@deffn {함수} xml.dom.minidom.parse (filename_or_file, parser=None, bufsize=None)

주어진 입력에서 @code{Document}를 반환합니다. `filename_or_file'은 파일명이나 파일류 객체일 수 있습니다. 제공되면, `parser'는 SAX2 구문 분석기 객체여야 합니다. 이 함수는 구문 분석기의 문서 처리기를 변경하고 이름 공간 지원을 활성화합니다; 다른 구문 분석기 구성(엔티티 해석기 설정과 같은)은 미리 수행되어 있어야 합니다.
@end deffn

문자열로 XML을 갖고 있다면, @ref{3df8,,parseString()} 함수를 대신 사용할 수 있습니다:

@geindex parseString() (xml.dom.minidom 모듈)
@anchor{library/xml dom minidom xml dom minidom parseString}@anchor{3df8}
@deffn {함수} xml.dom.minidom.parseString (string, parser=None)

`string'을 표현하는 @code{Document}를 반환합니다. 이 메서드는 문자열에 대한 @ref{1128,,io.StringIO} 객체를 만들고 이를 @ref{3df7,,parse()}에 전달합니다.
@end deffn

두 함수 모두 문서의 내용을 표현하는 @code{Document} 객체를 반환합니다.

What the @ref{3df7,,parse()} and @ref{3df8,,parseString()} functions do is connect an XML
parser with a “DOM builder” that can accept parse events from any SAX parser and
convert them into a DOM tree.  The names of the functions are perhaps misleading,
but are easy to grasp when learning the interfaces.  The parsing of the document
will be completed before these functions return; it’s simply that these
functions do not provide a parser implementation themselves.

You can also create a @code{Document} by calling a method on a “DOM
Implementation” object.  You can get this object either by calling the
@code{getDOMImplementation()} function in the @ref{127,,xml.dom} package or the
@code{xml.dom.minidom} module.  Once you have a @code{Document}, you
can add child nodes to it to populate the DOM:

@example
from xml.dom.minidom import getDOMImplementation

impl = getDOMImplementation()

newdoc = impl.createDocument(None, "some_tag", None)
top_element = newdoc.documentElement
text = newdoc.createTextNode('Some textual content.')
top_element.appendChild(text)
@end example

일단 DOM 문서 객체를 얻으면, 프로퍼티와 메서드를 통해 XML 문서의 일부에 액세스 할 수 있습니다. 이러한 프로퍼티들은 DOM 명세에 정의되어 있습니다. 문서 객체의 주 프로퍼티는 @code{documentElement} 프로퍼티입니다. XML 문서의 메인 엘리먼트를 제공합니다: 모든 다른 것들을 담는 것. 예제 프로그램은 다음과 같습니다:

@example
dom3 = parseString("<myxml>Some data</myxml>")
assert dom3.documentElement.tagName == "myxml"
@end example

When you are finished with a DOM tree, you may optionally call the
@code{unlink()} method to encourage early cleanup of the now-unneeded
objects.  @code{unlink()} is an @code{xml.dom.minidom}-specific
extension to the DOM API that renders the node and its descendants
essentially useless.  Otherwise, Python’s garbage collector will
eventually take care of the objects in the tree.


@subsubheading 더 보기



@table @asis

@item Document Object Model (DOM) Level 1 Specification@footnote{https://www.w3.org/TR/REC-DOM-Level-1/}

The W3C recommendation for the DOM supported by @code{xml.dom.minidom}.
@end table


@menu
* DOM 객체:: 
* DOM 예제:: 
* minidom과 DOM 표준:: 

@end menu

@node DOM 객체,DOM 예제,,xml dom minidom — 최소 DOM 구현
@anchor{library/xml dom minidom dom-objects}@anchor{3df9}@anchor{library/xml dom minidom minidom-objects}@anchor{3dfa}
@subsubsection DOM 객체


The definition of the DOM API for Python is given as part of the @ref{127,,xml.dom}
module documentation.  This section lists the differences between the API and
@code{xml.dom.minidom}.

@geindex unlink() (xml.dom.minidom.Node 메서드)
@anchor{library/xml dom minidom xml dom minidom Node unlink}@anchor{3dfb}
@deffn {메서드} Node.unlink ()

순환 GC가 없는 파이썬 버전에서 가비지 수집되도록 DOM 내의 내부 참조를 끊습니다. 순환 GC를 사용할 수 있더라도, 이를 사용하면 대량의 메모리를 더 빨리 사용할 수 있도록 하므로, 더 필요 없게 되는 즉시 DOM 객체에 대해 이를 호출하는 것이 좋습니다. @code{Document} 객체에서만 호출하면 되지만, 해당 노드의 자식을 삭제하기 위해 자식 노드에서 호출할 수 있습니다.

@ref{186,,with} 문을 사용하면 이 메서드를 명시적으로 호출하지 않아도 됩니다. 다음 코드는 @code{with} 블록이 종료될 때 `dom'을 자동으로 unlink 합니다:

@example
with xml.dom.minidom.parse(datasource) as dom:
    ... # dom으로 작업합니다.
@end example
@end deffn

@geindex writexml() (xml.dom.minidom.Node 메서드)
@anchor{library/xml dom minidom xml dom minidom Node writexml}@anchor{c88}
@deffn {메서드} Node.writexml (writer, indent='@w{'}, addindent='@w{'}, newl='@w{'}, encoding=None, standalone=None)

기록기(writer) 객체에 XML을 씁니다. 기록기는 입력으로 텍스트를 받지만 바이트열은 받지 않습니다, 파일 객체 인터페이스와 일치하는 @code{write()} 메서드를 가져야 합니다. `indent' 매개 변수는 현재 노드의 들여쓰기입니다. `addindent' 매개 변수는 현재 노드의 서브 노드에 사용할 증분(incremental) 들여쓰기입니다. `newl' 매개 변수는 개행을 끝내는 데 사용할 문자열을 지정합니다.

@code{Document} 노드의 경우, 추가 키워드 인자 `encoding'을 사용하여 XML 헤더의 인코딩 필드를 지정할 수 있습니다.

유사하게, `standalone' 인자를 명시적으로 지정하면 standalone 문서 선언이 XML 문서의 프롤로그에 추가됩니다. 값이 @code{True}로 설정되면 @code{standalone="yes"}가 추가되고, 그렇지 않으면 @code{"no"}로 설정됩니다. 인자를 명시하지 않으면 문서에서 선언을 생략합니다.


버전 3.8에서 변경: @ref{c88,,writexml()} 메서드는 이제 사용자가 지정한 어트리뷰트 순서를 유지합니다.



버전 3.9에서 변경: `standalone' 매개 변수를 추가했습니다.

@end deffn

@geindex toxml() (xml.dom.minidom.Node 메서드)
@anchor{library/xml dom minidom xml dom minidom Node toxml}@anchor{c89}
@deffn {메서드} Node.toxml (encoding=None, standalone=None)

DOM 노드가 나타내는 XML이 포함된 문자열이나 바이트열을 반환합니다.

명시적인 `encoding' @footnote{
XML 출력에 포함된 인코딩 이름은 적절한 표준을 준수해야 합니다. 예를 들어, XML 문서의 선언에서 “UTF-8”은 유효하지만, “UTF8”은 파이썬이 이를 인코딩 이름으로 받아들이더라도 유효하지 않습니다. @indicateurl{https://www.w3.org/TR/2006/REC-xml11-20060816/#NT-EncodingDecl} 과 @indicateurl{https://www.iana.org/assignments/character-sets/character-sets.xhtml} 을 참조하십시오.
} 인자를 사용하면, 결과는 지정된 인코딩의 바이트열 입니다. `encoding' 인자가 없으면, 결과는 유니코드 문자열이며, 결과 문자열의 XML 선언은 인코딩을 지정하지 않습니다. UTF-8이 XML의 기본 인코딩이기 때문에, UTF-8 이외의 인코딩으로 이 문자열을 인코딩하는 것은 올바르지 않습니다.

`standalone' 인자는 @ref{c88,,writexml()}에서와 동일하게 동작합니다.


버전 3.8에서 변경: @ref{c89,,toxml()} 메서드는 이제 사용자가 지정한 어트리뷰트 순서를 유지합니다.



버전 3.9에서 변경: `standalone' 매개 변수를 추가했습니다.

@end deffn

@geindex toprettyxml() (xml.dom.minidom.Node 메서드)
@anchor{library/xml dom minidom xml dom minidom Node toprettyxml}@anchor{c8a}
@deffn {메서드} Node.toprettyxml (indent='\t', newl='\n', encoding=None, standalone=None)

문서의 예쁘게 인쇄된 버전을 반환합니다. `indent'는 들여쓰기 문자열을 지정하고 기본값은 탭입니다; `newl'은 각 줄의 끝에서 방출되는 문자열을 지정하고 기본값은 @code{\n}입니다.

`encoding' 인자는 @ref{c89,,toxml()}의 해당 인자처럼 동작합니다.

`standalone' 인자는 @ref{c88,,writexml()}에서와 동일하게 동작합니다.


버전 3.8에서 변경: @ref{c8a,,toprettyxml()} 메서드는 이제 사용자가 지정한 어트리뷰트 순서를 유지합니다.



버전 3.9에서 변경: `standalone' 매개 변수를 추가했습니다.

@end deffn

@node DOM 예제,minidom과 DOM 표준,DOM 객체,xml dom minidom — 최소 DOM 구현
@anchor{library/xml dom minidom dom-example}@anchor{3dfc}@anchor{library/xml dom minidom id2}@anchor{3dfd}
@subsubsection DOM 예제


이 예제 프로그램은 간단한 프로그램의 상당히 현실적인 예입니다. 이 특별한 경우에, 우리는 DOM의 유연성을 크게 활용하지 않습니다.

@example
import xml.dom.minidom

document = """\
<slideshow>
<title>Demo slideshow</title>
<slide><title>Slide title</title>
<point>This is a demo</point>
<point>Of a program for processing slides</point>
</slide>

<slide><title>Another demo slide</title>
<point>It is important</point>
<point>To have more than</point>
<point>one slide</point>
</slide>
</slideshow>
"""

dom = xml.dom.minidom.parseString(document)

def getText(nodelist):
    rc = []
    for node in nodelist:
        if node.nodeType == node.TEXT_NODE:
            rc.append(node.data)
    return '@w{'}.join(rc)

def handleSlideshow(slideshow):
    print("<html>")
    handleSlideshowTitle(slideshow.getElementsByTagName("title")[0])
    slides = slideshow.getElementsByTagName("slide")
    handleToc(slides)
    handleSlides(slides)
    print("</html>")

def handleSlides(slides):
    for slide in slides:
        handleSlide(slide)

def handleSlide(slide):
    handleSlideTitle(slide.getElementsByTagName("title")[0])
    handlePoints(slide.getElementsByTagName("point"))

def handleSlideshowTitle(title):
    print(f"<title>@{getText(title.childNodes)@}</title>")

def handleSlideTitle(title):
    print(f"<h2>@{getText(title.childNodes)@}</h2>")

def handlePoints(points):
    print("<ul>")
    for point in points:
        handlePoint(point)
    print("</ul>")

def handlePoint(point):
    print(f"<li>@{getText(point.childNodes)@}</li>")

def handleToc(slides):
    for slide in slides:
        title = slide.getElementsByTagName("title")[0]
        print(f"<p>@{getText(title.childNodes)@}</p>")

handleSlideshow(dom)
@end example

@node minidom과 DOM 표준,,DOM 예제,xml dom minidom — 최소 DOM 구현
@anchor{library/xml dom minidom minidom-and-dom}@anchor{3dfe}@anchor{library/xml dom minidom minidom-and-the-dom-standard}@anchor{3dff}
@subsubsection minidom과 DOM 표준


The @code{xml.dom.minidom} module is essentially a DOM 1.0-compatible DOM with
some DOM 2 features (primarily namespace features).

파이썬에서 DOM 인터페이스의 사용법은 간단합니다. 다음과 같은 매핑 규칙이 적용됩니다:


@itemize *

@item 
인터페이스는 인스턴스 객체를 통해 액세스 됩니다. 응용 프로그램은 클래스를 직접 인스턴스로 만들어서는 안 됩니다; @code{Document} 객체에서 제공되는 생성자 함수를 사용해야 합니다. 파생 인터페이스는 베이스 인터페이스의 모든 연산(및 어트리뷰트)과 새로운 연산을 지원합니다.

@item 
연산은 메서드로 사용됩니다. DOM은 @ref{34b,,in} 매개 변수만 사용하므로, 인자는 정상적인 순서(왼쪽에서 오른쪽으로)로 전달됩니다. 선택적 인자가 없습니다. @code{void} 연산은 @code{None}을 반환합니다.

@item 
IDL 어트리뷰트는 인스턴스 어트리뷰트에 매핑됩니다. 파이썬 용 OMG IDL 언어 매핑과의 호환성을 위해, 접근자 메서드 @code{_get_foo()}와 @code{_set_foo()}를 통해 어트리뷰트 @code{foo}에 액세스할 수도 있습니다. @code{readonly} 어트리뷰트는 변경하지 않아야 합니다; 실행 시간에 강제되지는 않습니다.

@item 
@code{short int}, @code{unsigned int}, @code{unsigned long long} 및 @code{boolean} 형은 모두 파이썬 정수 객체에 매핑됩니다.

@item 
The type @code{DOMString} maps to Python strings. @code{xml.dom.minidom} supports
either bytes or strings, but will normally produce strings.
Values of type @code{DOMString} may also be @code{None} where allowed to have the IDL
@code{null} value by the DOM specification from the W3C.

@item 
@code{const} 선언은 해당 스코프에 있는 변수에 매핑됩니다 (예를 들어 @code{xml.dom.minidom.Node.PROCESSING_INSTRUCTION_NODE}); 변경되지 않아야 합니다.

@item 
@code{DOMException} is currently not supported in @code{xml.dom.minidom}.
Instead, @code{xml.dom.minidom} uses standard Python exceptions such as
@ref{198,,TypeError} and @ref{5ee,,AttributeError}.

@item 
@code{NodeList} 객체는 파이썬의 내장 리스트 형을 사용하여 구현됩니다. 이러한 객체는 DOM 명세에 정의된 인터페이스를 제공하지만, 이전 버전의 파이썬에서는 공식 API를 지원하지 않습니다. 그러나 W3C 권장 사항에 정의된 인터페이스보다 훨씬 “파이썬답습니다”.
@end itemize

The following interfaces have no implementation in @code{xml.dom.minidom}:


@itemize *

@item 
@code{DOMTimeStamp}

@item 
@code{EntityReference}
@end itemize

이들 대부분은 대부분의 DOM 사용자에게 일반적인 쓸모를 제공하지 않는 XML 문서의 정보를 반영합니다.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node xml dom pulldom — 부분 DOM 트리 구축 지원,xml sax — SAX2 구문 분석기 지원,xml dom minidom — 최소 DOM 구현,구조화된 마크업 처리 도구
@anchor{library/xml dom pulldom doc}@anchor{3e00}@anchor{library/xml dom pulldom module-xml dom pulldom}@anchor{129}@anchor{library/xml dom pulldom translation-repo}@anchor{3e01}@anchor{library/xml dom pulldom xml-dom-pulldom-support-for-building-partial-dom-trees}@anchor{3e02}
@subsection @code{xml.dom.pulldom} — 부분 DOM 트리 구축 지원


@geindex module; xml.dom.pulldom

`소스 코드:' Lib/xml/dom/pulldom.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/xml/dom/pulldom.py}


__________________________________________________________________


The @code{xml.dom.pulldom} module provides a “pull parser” which can also be
asked to produce DOM-accessible fragments of the document where necessary. The
basic concept involves pulling “events” from a stream of incoming XML and
processing them. In contrast to SAX which also employs an event-driven
processing model together with callbacks, the user of a pull parser is
responsible for explicitly pulling events from the stream, looping over those
events until either processing is finished or an error condition occurs.

@cartouche
@quotation 참고 
If you need to parse untrusted or unauthenticated data, see
@ref{3d21,,XML security}.
@end quotation
@end cartouche


버전 3.7.1에서 변경: SAX 구문 분석기는 보안을 강화하기 위해 더는 일반 외부 엔티티를 처리하지 않습니다. 외부 엔티티를 처리를 활성화하려면, 사용자 정의 구문 분석기 인스턴스를 전달하십시오:

@example
from xml.dom.pulldom import parse
from xml.sax import make_parser
from xml.sax.handler import feature_external_ges

parser = make_parser()
parser.setFeature(feature_external_ges, True)
parse(filename, parser=parser)
@end example


예:

@example
from xml.dom import pulldom

doc = pulldom.parse('sales_items.xml')
for event, node in doc:
    if event == pulldom.START_ELEMENT and node.tagName == 'item':
        if int(node.getAttribute('price')) > 50:
            doc.expandNode(node)
            print(node.toxml())
@end example

@code{event}는 상수이며 다음 중 하나일 수 있습니다:


@itemize *

@item 
@code{START_ELEMENT}

@item 
@code{END_ELEMENT}

@item 
@code{COMMENT}

@item 
@code{START_DOCUMENT}

@item 
@code{END_DOCUMENT}

@item 
@code{CHARACTERS}

@item 
@code{PROCESSING_INSTRUCTION}

@item 
@code{IGNORABLE_WHITESPACE}
@end itemize

@code{node}는 @code{xml.dom.minidom.Document}, @code{xml.dom.minidom.Element} 또는 @code{xml.dom.minidom.Text} 형의 객체입니다.

문서는 “평평한(flat)” 이벤트 스트림으로 취급되므로, 문서 “트리”는 묵시적으로 탐색 되며 트리에서의 깊이와 관계없이 원하는 요소를 찾습니다. 다시 말해, 문서 노드의 재귀적 검색과 같은 계층적 문제를 고려할 필요는 없습니다. 하지만, 엘리먼트의 문맥이 중요하다면, 문맥과 관련된 상태를 유지하거나 (즉, 주어진 지점에서 문서의 어느 위치에 있는지 기억함으로써),  @ref{3e03,,DOMEventStream.expandNode()} 메서드를 사용하고 DOM 관련 처리로 전환해야 합니다.

@geindex PullDOM (xml.dom.pulldom 클래스)
@anchor{library/xml dom pulldom xml dom pulldom PullDOM}@anchor{3e04}
@deffn {클래스} xml.dom.pulldom.PullDOM (documentFactory=None)

@ref{3e05,,xml.sax.handler.ContentHandler}의 서브 클래스.
@end deffn

@geindex SAX2DOM (xml.dom.pulldom 클래스)
@anchor{library/xml dom pulldom xml dom pulldom SAX2DOM}@anchor{3e06}
@deffn {클래스} xml.dom.pulldom.SAX2DOM (documentFactory=None)

@ref{3e05,,xml.sax.handler.ContentHandler}의 서브 클래스.
@end deffn

@geindex parse() (xml.dom.pulldom 모듈)
@anchor{library/xml dom pulldom xml dom pulldom parse}@anchor{3e07}
@deffn {함수} xml.dom.pulldom.parse (stream_or_string, parser=None, bufsize=None)

주어진 입력으로부터 @ref{93d,,DOMEventStream}을 반환합니다. `stream_or_string'은 파일 이름이거나 파일류 객체일 수 있습니다. 주어질 때, `parser'는 @ref{3e08,,XMLReader} 객체여야 합니다. 이 함수는 구문 분석기의 문서 처리기를 변경하고 이름 공간 지원을 활성화합니다; 다른 구문 분석기 구성(엔티티 해석기 설정과 같은)은 미리 수행되어 있어야 합니다.
@end deffn

문자열로 XML을 갖고 있다면, @ref{3e09,,parseString()} 함수를 대신 사용할 수 있습니다:

@geindex parseString() (xml.dom.pulldom 모듈)
@anchor{library/xml dom pulldom xml dom pulldom parseString}@anchor{3e09}
@deffn {함수} xml.dom.pulldom.parseString (string, parser=None)

(유니코드) `string'을 표현하는 @ref{93d,,DOMEventStream}을 반환합니다.
@end deffn

@geindex default_bufsize (xml.dom.pulldom 모듈)
@anchor{library/xml dom pulldom xml dom pulldom default_bufsize}@anchor{3e0a}
@deffn {데이터} xml.dom.pulldom.default_bufsize

@ref{3e07,,parse()}의 `bufsize' 매개 변수의 기본값.

이 변수의 값은 @ref{3e07,,parse()}를 호출하기 전에 변경될 수 있으며 새 값이 적용됩니다.
@end deffn

@menu
* DOMEventStream 객체:: 

@end menu

@node DOMEventStream 객체,,,xml dom pulldom — 부분 DOM 트리 구축 지원
@anchor{library/xml dom pulldom domeventstream-objects}@anchor{3e0b}@anchor{library/xml dom pulldom id1}@anchor{3e0c}
@subsubsection DOMEventStream 객체


@geindex DOMEventStream (xml.dom.pulldom 클래스)
@anchor{library/xml dom pulldom xml dom pulldom DOMEventStream}@anchor{93d}
@deffn {클래스} xml.dom.pulldom.DOMEventStream (stream, parser, bufsize)


버전 3.11에서 변경: @ref{588,,__getitem__()} 메서드 지원은 제거했습니다.


@geindex getEvent() (xml.dom.pulldom.DOMEventStream 메서드)
@anchor{library/xml dom pulldom xml dom pulldom DOMEventStream getEvent}@anchor{3e0d}
@deffn {메서드} getEvent ()

`event'와 현재 `node'를 포함하는 튜플을 반환합니다. 노드는 이벤트가 @code{START_DOCUMENT}와 같으면 @code{xml.dom.minidom.Document}, 이벤트가 @code{START_ELEMENT}나 @code{END_ELEMENT}와 같으면 @code{xml.dom.minidom.Element}, 이벤트가 @code{CHARACTERS}와 같으면 @code{xml.dom.minidom.Text} 입니다. @ref{3e03,,expandNode()}가 호출되지 않는 한 현재 노드에는 자식에 대한 정보가 없습니다.
@end deffn

@geindex expandNode() (xml.dom.pulldom.DOMEventStream 메서드)
@anchor{library/xml dom pulldom xml dom pulldom DOMEventStream expandNode}@anchor{3e03}
@deffn {메서드} expandNode (node)

`node'의 모든 자식을 `node'로 확장합니다. 예:

@example
from xml.dom import pulldom

xml = '<html><title>Foo</title> <p>Some text <div>and more</div></p> </html>'
doc = pulldom.parseString(xml)
for event, node in doc:
    if event == pulldom.START_ELEMENT and node.tagName == 'p':
        # 다음 문장은 '<p/>' 만 인쇄합니다
        print(node.toxml())
        doc.expandNode(node)
        # 다음 문장은 노드와 모든 자식을 인쇄합니다 '<p>Some text <div>and more</div></p>'
        print(node.toxml())
@end example
@end deffn

@geindex reset() (xml.dom.pulldom.DOMEventStream 메서드)
@anchor{library/xml dom pulldom xml dom pulldom DOMEventStream reset}@anchor{3e0e}
@deffn {메서드} reset ()
@end deffn
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node xml sax — SAX2 구문 분석기 지원,xml sax handler — SAX 처리기의 베이스 클래스,xml dom pulldom — 부분 DOM 트리 구축 지원,구조화된 마크업 처리 도구
@anchor{library/xml sax doc}@anchor{3e0f}@anchor{library/xml sax module-xml sax}@anchor{12f}@anchor{library/xml sax translation-repo}@anchor{3e10}@anchor{library/xml sax xml-sax-support-for-sax2-parsers}@anchor{3e11}
@subsection @code{xml.sax} — SAX2 구문 분석기 지원


@geindex module; xml.sax

`소스 코드:' Lib/xml/sax/__init__.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/xml/sax/__init__.py}


__________________________________________________________________


The @code{xml.sax} package provides a number of modules which implement the
Simple API for XML (SAX) interface for Python.  The package itself provides the
SAX exceptions and the convenience functions which will be most used by users of
the SAX API.

@cartouche
@quotation 참고 
If you need to parse untrusted or unauthenticated data, see
@ref{3d21,,XML security}.
@end quotation
@end cartouche


버전 3.7.1에서 변경: SAX 구문 분석기는 보안을 강화하기 위해 더는 일반 외부 엔티티를 처리하지 않습니다. 이전에는, 구문 분석기가 DTD와 엔티티에 대해 네트워크 연결을 만들어 원격 파일을 가져오거나 파일 시스템에서 로컬 파일을 로드했습니다. 이 기능은 구문 분석기 객체에 대해 인자 @ref{17d3,,feature_external_ges}로 메서드 @ref{3e12,,setFeature()}를 사용하여 다시 활성화할 수 있습니다.


편리 함수는 다음과 같습니다:

@geindex make_parser() (xml.sax 모듈)
@anchor{library/xml sax xml sax make_parser}@anchor{1e18}
@deffn {함수} xml.sax.make_parser (parser_list=[])

SAX @ref{3e08,,XMLReader} 객체를 만들고 반환합니다. 발견된 첫 번째 구문 분석기가 사용됩니다. `parser_list'가 제공되면, @code{create_parser()}라는 함수가 있는 모듈의 이름을 나타내는 문자열의 이터러블이어야 합니다. `parser_list'에 나열된 모듈은 기본 구문 분석기 목록에 있는 모듈보다 먼저 사용됩니다.


버전 3.8에서 변경: `parser_list' 인자는 리스트뿐만 아니라 임의의 이터러블일 수 있습니다.

@end deffn

@geindex parse() (xml.sax 모듈)
@anchor{library/xml sax xml sax parse}@anchor{1de3}
@deffn {함수} xml.sax.parse (filename_or_stream, handler, error_handler=handler.ErrorHandler())

SAX 구문 분석기를 만들어 문서 구문 분석에 사용합니다. `filename_or_stream'으로 전달된 문서는 파일명이나 파일 객체일 수 있습니다. `handler' 매개 변수는 SAX @ref{3e05,,ContentHandler} 인스턴스여야 합니다. `error_handler'가 주어지면, SAX @ref{3e13,,ErrorHandler} 인스턴스여야 합니다; 생략하면, 모든 에러에서 @ref{3e14,,SAXParseException}이 발생합니다. 반환 값은 없습니다; 모든 작업은 전달된 `handler'가 처리해야 합니다.
@end deffn

@geindex parseString() (xml.sax 모듈)
@anchor{library/xml sax xml sax parseString}@anchor{109b}
@deffn {함수} xml.sax.parseString (string, handler, error_handler=handler.ErrorHandler())

@ref{1de3,,parse()}와 비슷하지만, 매개 변수로 받은 버퍼 `string'에서 구문 분석합니다. `string'은 @ref{169,,str} 인스턴스나 @ref{193,,바이트열류 객체}여야 합니다.


버전 3.5에서 변경: @ref{169,,str} 인스턴스에 대한 지원이 추가되었습니다.

@end deffn

전형적인 SAX 응용 프로그램은 입력기(reader), 처리기(handler) 및 입력 소스(input source)의 세 가지 종류의 객체를 사용합니다: 이 문맥에서 “입력기(Reader)”는 구문 분석기에 대한 또 다른 용어입니다, 즉, 입력 소스에서 바이트나 문자를 읽고, 이벤트 시퀀스를 생성하는 코드 조각입니다. 그런 다음 이벤트는 처리기 객체로 배포됩니다, 즉 입력기가 처리기의 메서드를 호출합니다. 따라서 SAX 응용 프로그램은 입력기 객체를 얻고, 입력 소스를 만들거나 열고, 처리기를 만들고, 이 객체들을 모두 연결해야 합니다. 준비의 마지막 단계로, 입력기가 입력을 구문 분석하도록 호출됩니다. 구문 분석하는 동안, 처리기 객체의 메서드는 입력 데이터로부터 온 구조적 및 구문적 이벤트를 기반으로 호출됩니다.

For these objects, only the interfaces are relevant; they are normally not
instantiated by the application itself.  Since Python does not have an explicit
notion of interface, they are formally introduced as classes, but applications
may use implementations which do not inherit from the provided classes.  The
@ref{109a,,InputSource}, @ref{3e15,,Locator},
@code{Attributes}, @code{AttributesNS},
and @ref{3e08,,XMLReader} interfaces are defined in the
module @ref{132,,xml.sax.xmlreader}.  The handler interfaces are defined in
@ref{130,,xml.sax.handler}.  For convenience,
@code{InputSource} (which is often
instantiated directly) and the handler classes are also available from
@code{xml.sax}.  These interfaces are described below.

In addition to these classes, @code{xml.sax} provides the following exception
classes.

@geindex SAXException
@anchor{library/xml sax xml sax SAXException}@anchor{3e16}
@deffn {예외} xml.sax.SAXException (msg, exception=None)

XML 에러나 경고를 캡슐화합니다. 이 클래스에는 XML 구문 분석기나 응용 프로그램의 기본 에러나 경고 정보가 포함될 수 있습니다: 추가 기능을 제공하거나 지역화를 추가하기 위해 서브 클래싱 될 수 있습니다. @ref{3e13,,ErrorHandler} 인터페이스에 정의된 처리기가 이 예외의 인스턴스를 수신하지만, 예외를 실제로 발생시킬 필요는 없음에 유의하십시오 — 정보를 담는 컨테이너로도 유용합니다.

인스턴스로 만들어질 때, `msg'는 사람이 읽을 수 있는 에러에 관한 설명이어야 합니다. 선택적 `exception' 매개 변수를 주면, @code{None}이거나 구문 분석 코드에 의해 잡힌 예외여야 하고, 정보로 함께 전달됩니다.

이것은 다른 SAX 예외 클래스의 베이스 클래스입니다.
@end deffn

@geindex SAXParseException
@anchor{library/xml sax xml sax SAXParseException}@anchor{3e14}
@deffn {예외} xml.sax.SAXParseException (msg, exception, locator)

구문 분석 에러 시 발생하는 @ref{3e16,,SAXException}의 서브 클래스. 이 클래스의 인스턴스는 SAX @ref{3e13,,ErrorHandler} 인터페이스의 메서드에 전달되어 구문 분석 에러에 대한 정보를 제공합니다. 이 클래스는 @ref{3e16,,SAXException} 인터페이스뿐만 아니라 SAX @ref{3e15,,Locator} 인터페이스를 지원합니다.
@end deffn

@geindex SAXNotRecognizedException
@anchor{library/xml sax xml sax SAXNotRecognizedException}@anchor{3e17}
@deffn {예외} xml.sax.SAXNotRecognizedException (msg, exception=None)

SAX @ref{3e08,,XMLReader}가 인식할 수 없는 기능이나 속성을 만날 때 발생하는 @ref{3e16,,SAXException}의 서브 클래스. SAX 응용 프로그램과 확장은 유사한 목적으로 이 클래스를 사용할 수 있습니다.
@end deffn

@geindex SAXNotSupportedException
@anchor{library/xml sax xml sax SAXNotSupportedException}@anchor{3e18}
@deffn {예외} xml.sax.SAXNotSupportedException (msg, exception=None)

SAX @ref{3e08,,XMLReader}가 지원되지 않는 기능을 활성화하거나 구현에서 지원하지 않는 값으로 속성을 설정하도록 요청될 때 발생하는 @ref{3e16,,SAXException}의 서브 클래스. SAX 응용 프로그램과 확장은 유사한 목적으로 이 클래스를 사용할 수 있습니다.
@end deffn


@subsubheading 더 보기



@table @asis

@item SAX: The Simple API for XML@footnote{http://www.saxproject.org/}

이 사이트는 SAX API의 정의가 집중되는 곳입니다. Java 구현과 온라인 설명서를 제공합니다. 구현과 역사적 정보에 대한 링크도 있습니다.

@item 모듈 @ref{130,,xml.sax.handler}

응용 프로그램이 제공하는 객체에 대한 인터페이스의 정의.

@item 모듈 @ref{131,,xml.sax.saxutils}

SAX 응용 프로그램에서 사용하기 위한 편리 함수.

@item 모듈 @ref{132,,xml.sax.xmlreader}

구문 분석기가 제공하는 객체에 대한 인터페이스의 정의.
@end table


@menu
* SAXException 객체:: 

@end menu

@node SAXException 객체,,,xml sax — SAX2 구문 분석기 지원
@anchor{library/xml sax sax-exception-objects}@anchor{3e19}@anchor{library/xml sax saxexception-objects}@anchor{3e1a}
@subsubsection SAXException 객체


@ref{3e16,,SAXException} 예외 클래스는 다음 메서드를 지원합니다:

@geindex getMessage() (xml.sax.SAXException 메서드)
@anchor{library/xml sax xml sax SAXException getMessage}@anchor{3e1b}
@deffn {메서드} SAXException.getMessage ()

에러 상태를 설명하는 사람이 읽을 수 있는 메시지를 반환합니다.
@end deffn

@geindex getException() (xml.sax.SAXException 메서드)
@anchor{library/xml sax xml sax SAXException getException}@anchor{3e1c}
@deffn {메서드} SAXException.getException ()

캡슐화된 예외 객체나 @code{None}을 반환합니다.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node xml sax handler — SAX 처리기의 베이스 클래스,xml sax saxutils — SAX 유틸리티,xml sax — SAX2 구문 분석기 지원,구조화된 마크업 처리 도구
@anchor{library/xml sax handler doc}@anchor{3e1d}@anchor{library/xml sax handler module-xml sax handler}@anchor{130}@anchor{library/xml sax handler translation-repo}@anchor{3e1e}@anchor{library/xml sax handler xml-sax-handler-base-classes-for-sax-handlers}@anchor{3e1f}
@subsection @code{xml.sax.handler} — SAX 처리기의 베이스 클래스


@geindex module; xml.sax.handler

`소스 코드:' Lib/xml/sax/handler.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/xml/sax/handler.py}


__________________________________________________________________


The SAX API defines five kinds of handlers: content handlers, DTD handlers,
error handlers, entity resolvers and lexical handlers. Applications normally
only need to implement those interfaces whose events they are interested in;
they can implement the interfaces in a single object or in multiple objects.
Handler implementations should inherit from the base classes provided in the
module @code{xml.sax.handler}, so that all methods get default implementations.

@geindex ContentHandler (xml.sax.handler 클래스)
@anchor{library/xml sax handler xml sax handler ContentHandler}@anchor{3e05}
@deffn {클래스} xml.sax.handler.ContentHandler

이것은 SAX의 주 콜백 인터페이스이며, 응용 프로그램에 가장 중요한 인터페이스입니다. 이 인터페이스의 이벤트 순서는 문서에서의 정보 순서를 반영합니다.
@end deffn

@geindex DTDHandler (xml.sax.handler 클래스)
@anchor{library/xml sax handler xml sax handler DTDHandler}@anchor{3e20}
@deffn {클래스} xml.sax.handler.DTDHandler

DTD 이벤트를 처리합니다.

이 인터페이스는 기본 구문 분석에 필요한 DTD 이벤트만 지정합니다 (구문 분석되지 않은 엔티티와 어트리뷰트).
@end deffn

@geindex EntityResolver (xml.sax.handler 클래스)
@anchor{library/xml sax handler xml sax handler EntityResolver}@anchor{3e21}
@deffn {클래스} xml.sax.handler.EntityResolver

엔티티 해석을 위한 기본 인터페이스. 이 인터페이스를 구현하는 객체를 만든 후 구문 분석기에 객체를 등록하면, 구문 분석기는 객체의 메서드를 호출하여 모든 외부 엔티티를 해석합니다.
@end deffn

@geindex ErrorHandler (xml.sax.handler 클래스)
@anchor{library/xml sax handler xml sax handler ErrorHandler}@anchor{3e13}
@deffn {클래스} xml.sax.handler.ErrorHandler

응용 프로그램에 에러와 경고 메시지를 표시하기 위해 구문 분석기에서 사용하는 인터페이스. 이 객체의 메서드는 에러가 즉시 예외로 변환되는지 또는 다른 방식으로 처리되는지를 제어합니다.
@end deffn

@geindex LexicalHandler (xml.sax.handler 클래스)
@anchor{library/xml sax handler xml sax handler LexicalHandler}@anchor{a5c}
@deffn {클래스} xml.sax.handler.LexicalHandler

Interface used by the parser to represent low frequency events which may not
be of interest to many applications.
@end deffn

In addition to these classes, @code{xml.sax.handler} provides symbolic constants
for the feature and property names.

@geindex feature_namespaces (xml.sax.handler 모듈)
@anchor{library/xml sax handler xml sax handler feature_namespaces}@anchor{3e22}
@deffn {데이터} xml.sax.handler.feature_namespaces


@display
값: @code{"http://xml.org/sax/features/namespaces"}@w{ }
참: 이름 공간 처리를 수행합니다.@w{ }
거짓: 선택적으로 이름 공간 처리를 수행하지 않습니다 (namespace-prefixes를 암시합니다; 기본값).@w{ }
액세스: (구문 분석) 읽기 전용; (구문 분석하지 않음) 읽기/쓰기@w{ }
@end display


@end deffn

@geindex feature_namespace_prefixes (xml.sax.handler 모듈)
@anchor{library/xml sax handler xml sax handler feature_namespace_prefixes}@anchor{3e23}
@deffn {데이터} xml.sax.handler.feature_namespace_prefixes


@display
값: @code{"http://xml.org/sax/features/namespace-prefixes"}@w{ }
참: 이름 공간 선언에 사용된 원래 접두사 이름과 어트리뷰트를 보고합니다.@w{ }
거짓: 이름 공간 선언에 사용된 어트리뷰트를 보고하지 않고, 선택적으로 원래 접두사 이름을 보고하지 않습니다 (기본값).@w{ }
액세스: (구문 분석) 읽기 전용; (구문 분석하지 않음) 읽기/쓰기@w{ }
@end display


@end deffn

@geindex feature_string_interning (xml.sax.handler 모듈)
@anchor{library/xml sax handler xml sax handler feature_string_interning}@anchor{3e24}
@deffn {데이터} xml.sax.handler.feature_string_interning


@display
값: @code{"http://xml.org/sax/features/string-interning"}@w{ }
참: 모든 엘리먼트 이름, 접두사, 어트리뷰트 이름, 이름 공간 URI 및 지역 이름은 내장 intern 함수를 사용하여 인턴 됩니다.@w{ }
거짓: 그럴 수 있지만, 이름이 반드시 인턴 될 필요는 없습니다 (기본값).@w{ }
액세스: (구문 분석) 읽기 전용; (구문 분석하지 않음) 읽기/쓰기@w{ }
@end display


@end deffn

@geindex feature_validation (xml.sax.handler 모듈)
@anchor{library/xml sax handler xml sax handler feature_validation}@anchor{3e25}
@deffn {데이터} xml.sax.handler.feature_validation


@display
값: @code{"http://xml.org/sax/features/validation"}@w{ }
참: 모든 유효성 검사 에러를 보고합니다 (external-general-entities와 external-parameter-entities를 암시합니다).@w{ }
거짓: 유효성 검사 에러를 보고하지 않습니다.@w{ }
액세스: (구문 분석) 읽기 전용; (구문 분석하지 않음) 읽기/쓰기@w{ }
@end display


@end deffn

@geindex feature_external_ges (xml.sax.handler 모듈)
@anchor{library/xml sax handler xml sax handler feature_external_ges}@anchor{17d3}
@deffn {데이터} xml.sax.handler.feature_external_ges

@cartouche
@quotation 경고 
Enabling opens a vulnerability to
external entity attacks@footnote{https://en.wikipedia.org/wiki/XML_external_entity_attack}
if the parser is used with user-provided XML content.
Please reflect on your threat model@footnote{https://en.wikipedia.org/wiki/Threat_model}
before enabling this feature.
@end quotation
@end cartouche


@display
값: @code{"http://xml.org/sax/features/external-general-entities"}@w{ }
참: 모든 외부 일반 (텍스트) 엔티티를 포함합니다.@w{ }
거짓: 외부 일반 엔티티를 포함하지 않습니다.@w{ }
액세스: (구문 분석) 읽기 전용; (구문 분석하지 않음) 읽기/쓰기@w{ }
@end display


@end deffn

@geindex feature_external_pes (xml.sax.handler 모듈)
@anchor{library/xml sax handler xml sax handler feature_external_pes}@anchor{3e26}
@deffn {데이터} xml.sax.handler.feature_external_pes


@display
값: @code{"http://xml.org/sax/features/external-parameter-entities"}@w{ }
참: 외부 DTD 서브 세트를 포함하여, 모든 외부 파라미터 엔티티를 포함합니다.@w{ }
거짓: 외부 DTD 서브 세트를 포함하여, 어떤 외부 파라미터 엔티티도 포함하지 않습니다.@w{ }
액세스: (구문 분석) 읽기 전용; (구문 분석하지 않음) 읽기/쓰기@w{ }
@end display


@end deffn

@geindex all_features (xml.sax.handler 모듈)
@anchor{library/xml sax handler xml sax handler all_features}@anchor{3e27}
@deffn {데이터} xml.sax.handler.all_features

모든 기능 리스트.
@end deffn

@geindex property_lexical_handler (xml.sax.handler 모듈)
@anchor{library/xml sax handler xml sax handler property_lexical_handler}@anchor{3e28}
@deffn {데이터} xml.sax.handler.property_lexical_handler


@display
값: @code{"http://xml.org/sax/properties/lexical-handler"}@w{ }
데이터형: xml.sax.handler.LexicalHandler (파이썬 2에서는 지원되지 않습니다)@w{ }
설명: 주석과 같은 어휘 이벤트에 대한 선택적 확장 처리기.@w{ }
액세스: 읽기/쓰기@w{ }
@end display


@end deffn

@geindex property_declaration_handler (xml.sax.handler 모듈)
@anchor{library/xml sax handler xml sax handler property_declaration_handler}@anchor{3e29}
@deffn {데이터} xml.sax.handler.property_declaration_handler


@display
값: @code{"http://xml.org/sax/properties/declaration-handler"}@w{ }
데이터형: xml.sax.sax2lib.DeclHandler (파이썬 2에서는 지원되지 않습니다)@w{ }
설명: 표기법과 구문 분석되지 않은 엔티티 이외의 DTD 관련 이벤트에 대한 선택적 확장 처리기.@w{ }
액세스: 읽기/쓰기@w{ }
@end display


@end deffn

@geindex property_dom_node (xml.sax.handler 모듈)
@anchor{library/xml sax handler xml sax handler property_dom_node}@anchor{3e2a}
@deffn {데이터} xml.sax.handler.property_dom_node


@display
값: @code{"http://xml.org/sax/properties/dom-node"}@w{ }
데이터형: org.w3c.dom.Node (파이썬 2에서는 지원되지 않습니다)@w{ }
설명: 구문 분석할 때, 이것이 DOM 이터레이터이면 방문 중인 현재 DOM 노드; 구문 분석하지 않을 때, 이터레이션을 위한 루트 DOM 노드.@w{ }
액세스: (구문 분석) 읽기 전용; (구문 분석하지 않음) 읽기/쓰기@w{ }
@end display


@end deffn

@geindex property_xml_string (xml.sax.handler 모듈)
@anchor{library/xml sax handler xml sax handler property_xml_string}@anchor{3e2b}
@deffn {데이터} xml.sax.handler.property_xml_string


@display
값: @code{"http://xml.org/sax/properties/xml-string"}@w{ }
데이터형: 바이트열@w{ }
설명: 현재 이벤트의 소스인 리터럴 문자열.@w{ }
액세스: 읽기 전용@w{ }
@end display


@end deffn

@geindex all_properties (xml.sax.handler 모듈)
@anchor{library/xml sax handler xml sax handler all_properties}@anchor{3e2c}
@deffn {데이터} xml.sax.handler.all_properties

알려진 모든 속성 이름 리스트
@end deffn

@menu
* ContentHandler 객체:: 
* DTDHandler 객체:: 
* EntityResolver 객체:: 
* ErrorHandler 객체:: 
* LexicalHandler 객체:: 

@end menu

@node ContentHandler 객체,DTDHandler 객체,,xml sax handler — SAX 처리기의 베이스 클래스
@anchor{library/xml sax handler content-handler-objects}@anchor{3e2d}@anchor{library/xml sax handler contenthandler-objects}@anchor{3e2e}
@subsubsection ContentHandler 객체


사용자는 자신의 응용 프로그램을 지원하기 위해 @ref{3e05,,ContentHandler}를 서브 클래싱 할 것으로 기대됩니다. 입력 문서에서 적절한 이벤트에 대해 구문 분석기가 다음 메서드를 호출합니다:

@geindex setDocumentLocator() (xml.sax.handler.ContentHandler 메서드)
@anchor{library/xml sax handler xml sax handler ContentHandler setDocumentLocator}@anchor{3e2f}
@deffn {메서드} ContentHandler.setDocumentLocator (locator)

응용 프로그램에 문서 이벤트의 출처를 찾기 위한 로케이터(locator)를 제공하기 위해 구문 분석기가 호출합니다.

SAX 구문 분석기가 (절대적으로 필요한 것은 아니지만) 로케이터를 제공할 것을 강력히 권장합니다: 그렇게 한다면, DocumentHandler 인터페이스의 다른 메서드를 호출하기 전에 이 메서드를 호출하여 로케이터를 응용 프로그램에 제공해야 합니다.

로케이터를 사용하면 구문 분석기가 에러를 보고하지 않더라도 응용 프로그램이 문서 관련 이벤트의 종료 위치를 판별할 수 있습니다. 일반적으로, 응용 프로그램은 이 정보를 사용하여 자체 에러(가령 응용 프로그램의 비즈니스 규칙과 일치하지 않는 문자 내용)를 보고합니다. 로케이터가 반환한 정보는 아마도 검색 엔진에 사용하기에는 충분하지 않을 것입니다.

로케이터는 이 인터페이스에서 이벤트를 호출하는 동안에만 올바른 정보를 반환함에 유의하십시오. 응용 프로그램은 다른 시간에 사용하려고 시도해서는 안 됩니다.
@end deffn

@geindex startDocument() (xml.sax.handler.ContentHandler 메서드)
@anchor{library/xml sax handler xml sax handler ContentHandler startDocument}@anchor{3e30}
@deffn {메서드} ContentHandler.startDocument ()

문서 시작 알림을 받습니다.

SAX 구문 분석기는 이 인터페이스나 DTDHandler의 다른 모든 메서드(@ref{3e2f,,setDocumentLocator()} 제외) 전에 이 메서드를 한 번만 호출합니다.
@end deffn

@geindex endDocument() (xml.sax.handler.ContentHandler 메서드)
@anchor{library/xml sax handler xml sax handler ContentHandler endDocument}@anchor{3e31}
@deffn {메서드} ContentHandler.endDocument ()

문서 끝 알림을 받습니다.

SAX 구문 분석기는 이 메서드를 한 번만 호출하며, 그것이 구문 분석 중에 마지막으로 호출된 메서드가 됩니다. 구문 분석기는 (복구할 수 없는 에러로 인해) 구문 분석을 포기했거나 입력 끝에 도달할 때까지 이 메서드를 호출하지 않아야 합니다.
@end deffn

@geindex startPrefixMapping() (xml.sax.handler.ContentHandler 메서드)
@anchor{library/xml sax handler xml sax handler ContentHandler startPrefixMapping}@anchor{3e32}
@deffn {메서드} ContentHandler.startPrefixMapping (prefix, uri)

접두사 URI 이름 공간 매핑의 스코프를 시작합니다.

이 이벤트의 정보는 일반적인 이름 공간 처리에 필요하지 않습니다: SAX XML 판독기는 @code{feature_namespaces} 기능이 활성화되면 (기본값) 엘리먼트와 어트리뷰트 이름의 접두사를 자동으로 대체합니다.

그러나, 응용 프로그램이 문자 데이터나 어트리뷰트 값에 접두사를 사용해야 할 때 자동으로 안전하게 확장할 수 없는 경우가 있습니다; @ref{3e32,,startPrefixMapping()} 과 @ref{3e33,,endPrefixMapping()} 이벤트는 필요한 경우 해당 컨텍스트에서 스스로 접두사를 확장하도록 정보를 응용 프로그램에 제공합니다.

@c XXX This is not really the default, is it? MvL

@ref{3e32,,startPrefixMapping()} 과 @ref{3e33,,endPrefixMapping()} 이벤트는 서로에 대해 올바르게 중첩된다고 보장되지 않음에 유의하십시오: 모든 @code{startPrefixMapping()} 이벤트는 해당 @ref{1748,,startElement()} 이벤트 전에 발생하고, 모든 @code{endPrefixMapping()} 이벤트는 해당 @ref{1749,,endElement()} 이벤트 후에 발생하지만, 그들 간의 순서는 보장되지 않습니다.
@end deffn

@geindex endPrefixMapping() (xml.sax.handler.ContentHandler 메서드)
@anchor{library/xml sax handler xml sax handler ContentHandler endPrefixMapping}@anchor{3e33}
@deffn {메서드} ContentHandler.endPrefixMapping (prefix)

접두사 URI 매핑 스코프를 끝냅니다.

자세한 내용은 @ref{3e32,,startPrefixMapping()} 을 참조하십시오. 이 이벤트는 항상 해당 @ref{1749,,endElement()} 이벤트 이후에 발생하지만, @ref{3e33,,endPrefixMapping()} 이벤트의 순서는 이 이상으로는 보장되지 않습니다.
@end deffn

@geindex startElement() (xml.sax.handler.ContentHandler 메서드)
@anchor{library/xml sax handler xml sax handler ContentHandler startElement}@anchor{1748}
@deffn {메서드} ContentHandler.startElement (name, attrs)

이름 공간이 아닌 모드에서 엘리먼트의 시작을 알립니다.

The `name' parameter contains the raw XML 1.0 name of the element type as a
string and the `attrs' parameter holds an object of the
@ref{3e34,,Attributes} interface containing the attributes of
the element.  The object passed as `attrs' may be re-used by the parser; holding
on to a reference to it is not a reliable way to keep a copy of the attributes.
To keep a copy of the attributes, use the @ref{29,,copy()} method of the `attrs'
object.
@end deffn

@geindex endElement() (xml.sax.handler.ContentHandler 메서드)
@anchor{library/xml sax handler xml sax handler ContentHandler endElement}@anchor{1749}
@deffn {메서드} ContentHandler.endElement (name)

이름 공간이 아닌 모드에서 엘리먼트의 끝을 알립니다.

`name' 매개 변수는 @ref{1748,,startElement()} 이벤트와 마찬가지로 엘리먼트 유형의 이름을 포함합니다.
@end deffn

@geindex startElementNS() (xml.sax.handler.ContentHandler 메서드)
@anchor{library/xml sax handler xml sax handler ContentHandler startElementNS}@anchor{3e35}
@deffn {메서드} ContentHandler.startElementNS (name, qname, attrs)

이름 공간 모드에서 엘리먼트의 시작을 알립니다.

The `name' parameter contains the name of the element type as a @code{(uri,
localname)} tuple, the `qname' parameter contains the raw XML 1.0 name used in
the source document, and the `attrs' parameter holds an instance of the
@ref{3e36,,AttributesNS} interface
containing the attributes of the element.  If no namespace is associated with
the element, the `uri' component of `name' will be @code{None}.  The object passed
as `attrs' may be re-used by the parser; holding on to a reference to it is not
a reliable way to keep a copy of the attributes.  To keep a copy of the
attributes, use the @ref{29,,copy()} method of the `attrs' object.

@code{feature_namespace_prefixes} 기능이 활성화되지 않는 한, 구문 분석기는 `qname' 매개 변수를 @code{None}으로 설정할 수 있습니다.
@end deffn

@geindex endElementNS() (xml.sax.handler.ContentHandler 메서드)
@anchor{library/xml sax handler xml sax handler ContentHandler endElementNS}@anchor{3e37}
@deffn {메서드} ContentHandler.endElementNS (name, qname)

이름 공간 모드에서 엘리먼트의 끝을 알립니다.

`name' 매개 변수는 @ref{3e35,,startElementNS()} 메서드와 마찬가지로 `qname' 매개 변수처럼 엘리먼트 유형의 이름을 포함합니다.
@end deffn

@geindex characters() (xml.sax.handler.ContentHandler 메서드)
@anchor{library/xml sax handler xml sax handler ContentHandler characters}@anchor{174a}
@deffn {메서드} ContentHandler.characters (content)

문자 데이터의 알림을 받습니다.

구문 분석기는 이 메서드를 호출하여 각 문자 데이터 청크를 보고합니다. SAX 구문 분석기는 연속된 모든 문자 데이터를 단일 청크로 반환하거나 여러 청크로 분할할 수 있습니다; 그러나, 로케이터가 유용한 정보를 제공할 수 있도록, 단일 이벤트의 모든 문자는 같은 외부 엔티티에서 온 것이어야 합니다.

`content'는 문자열이나 바이트열 인스턴스일 수 있습니다; @code{expat} 판독기 모듈은 항상 문자열을 생성합니다.

@cartouche
@quotation 참고 
Python XML Special Interest Group에서 제공된 이전 SAX 1 인터페이스는 이 메서드에 더 Java와 유사한 인터페이스를 사용했습니다. 파이썬에서 사용되는 대부분의 구문 분석기가 구식 인터페이스의 장점을 취하지 않았기 때문에, 더 간단한 서명으로 변경했습니다. 이전 코드를 새 인터페이스로 변환하려면, 이전 `offset'과 `length' 매개 변수로 콘텐츠를 슬라이싱하는 대신 `content'를 사용하십시오.
@end quotation
@end cartouche
@end deffn

@geindex ignorableWhitespace() (xml.sax.handler.ContentHandler 메서드)
@anchor{library/xml sax handler xml sax handler ContentHandler ignorableWhitespace}@anchor{3e38}
@deffn {메서드} ContentHandler.ignorableWhitespace (whitespace)

엘리먼트 내용에서 무시할 수 있는 공백에 대한 알림을 받습니다.

유효성 검사 구문 분석기는 무시할 수 있는 공백의 각 청크를 보고하기 위해 이 메서드를 사용해야 합니다 (W3C XML 1.0 권장 사항, 섹션 2.10을 참조하십시오).

SAX 구문 분석기는 모든 연속적인 공백을 단일 청크로 반환하거나 여러 청크로 나눌 수 있습니다; 그러나 로케이터가 유용한 정보를 제공할 수 있도록, 단일 이벤트의 모든 문자는 같은 외부 엔티티에서 온 것이어야 합니다.
@end deffn

@geindex processingInstruction() (xml.sax.handler.ContentHandler 메서드)
@anchor{library/xml sax handler xml sax handler ContentHandler processingInstruction}@anchor{3e39}
@deffn {메서드} ContentHandler.processingInstruction (target, data)

처리 명령의 알림을 받습니다.

구문 분석기는 발견된 각 처리 명령에 대해 이 메서드를 한 번 호출합니다: 처리 명령은 메인 문서 엘리먼트 전후에 발생할 수 있음에 유의하십시오.

SAX 구문 분석기는 이 메서드를 사용하여 XML 선언(XML 1.0, 섹션 2.8)이나 텍스트 선언(XML 1.0, 섹션 4.3.1)을 보고해서는 안 됩니다.
@end deffn

@geindex skippedEntity() (xml.sax.handler.ContentHandler 메서드)
@anchor{library/xml sax handler xml sax handler ContentHandler skippedEntity}@anchor{3e3a}
@deffn {메서드} ContentHandler.skippedEntity (name)

건너뛴 엔티티의 알림을 받습니다.

구문 분석기는 각 엔티티를 건너뛸 때마다 이 메서드를 한 번 호출합니다. 유효성을 검사하지 않는 프로세서는 선언을 보지 않으면 엔티티를 건너뛸 수 있습니다 (예를 들어 엔티티가 외부 DTD 서브 세트에서 선언되었기 때문에). @code{feature_external_ges}와 @code{feature_external_pes} 속성의 값에 따라, 모든 프로세서가 외부 엔티티를 건너뛸 수 있습니다.
@end deffn

@node DTDHandler 객체,EntityResolver 객체,ContentHandler 객체,xml sax handler — SAX 처리기의 베이스 클래스
@anchor{library/xml sax handler dtd-handler-objects}@anchor{3e3b}@anchor{library/xml sax handler dtdhandler-objects}@anchor{3e3c}
@subsubsection DTDHandler 객체


@ref{3e20,,DTDHandler} 인스턴스는 다음 메서드를 제공합니다:

@geindex notationDecl() (xml.sax.handler.DTDHandler 메서드)
@anchor{library/xml sax handler xml sax handler DTDHandler notationDecl}@anchor{3e3d}
@deffn {메서드} DTDHandler.notationDecl (name, publicId, systemId)

표기법 선언 이벤트를 처리합니다.
@end deffn

@geindex unparsedEntityDecl() (xml.sax.handler.DTDHandler 메서드)
@anchor{library/xml sax handler xml sax handler DTDHandler unparsedEntityDecl}@anchor{3e3e}
@deffn {메서드} DTDHandler.unparsedEntityDecl (name, publicId, systemId, ndata)

구문 분석되지 않은 엔티티 선언 이벤트를 처리합니다.
@end deffn

@node EntityResolver 객체,ErrorHandler 객체,DTDHandler 객체,xml sax handler — SAX 처리기의 베이스 클래스
@anchor{library/xml sax handler entity-resolver-objects}@anchor{3e3f}@anchor{library/xml sax handler entityresolver-objects}@anchor{3e40}
@subsubsection EntityResolver 객체


@geindex resolveEntity() (xml.sax.handler.EntityResolver 메서드)
@anchor{library/xml sax handler xml sax handler EntityResolver resolveEntity}@anchor{3e41}
@deffn {메서드} EntityResolver.resolveEntity (publicId, systemId)

엔티티의 시스템 식별자를 해석하고 읽을 시스템 식별자를 문자열로 반환하거나, 읽을 InputSource를 반환합니다. 기본 구현은 `systemId'를 반환합니다.
@end deffn

@node ErrorHandler 객체,LexicalHandler 객체,EntityResolver 객체,xml sax handler — SAX 처리기의 베이스 클래스
@anchor{library/xml sax handler errorhandler-objects}@anchor{3e42}@anchor{library/xml sax handler sax-error-handler}@anchor{3e43}
@subsubsection ErrorHandler 객체


이 인터페이스를 갖는 객체는 @ref{3e08,,XMLReader}에서 에러와 경고 정보를 받는 데 사용됩니다. 이 인터페이스를 구현하는 객체를 만든 다음 @code{XMLReader}에 객체를 등록하면, 구문 분석기는 객체의 메서드를 호출하여 모든 경고와 에러를 보고합니다. 세 가지 수준의 에러가 있습니다: 경고, (어쩌면) 복구 가능한 에러 및 복구 불가능한 에러. 모든 메서드는 @ref{3e14,,SAXParseException}를 유일한 매개 변수로 취합니다. 전달된 예외 객체를 발생 시켜 에러와 경고를 예외로 변환할 수 있습니다.

@geindex error() (xml.sax.handler.ErrorHandler 메서드)
@anchor{library/xml sax handler xml sax handler ErrorHandler error}@anchor{3e44}
@deffn {메서드} ErrorHandler.error (exception)

구문 분석기가 복구 가능한 에러를 만나면 호출됩니다. 이 메서드가 예외를 발생시키지 않으면, 구문 분석이 계속될 수 있지만, 응용 프로그램에서 추가 문서 정보를 기대하지 않아야 합니다. 구문 분석기가 계속되도록 허용하면 입력 문서에서 추가 에러가 발견될 수 있습니다.
@end deffn

@geindex fatalError() (xml.sax.handler.ErrorHandler 메서드)
@anchor{library/xml sax handler xml sax handler ErrorHandler fatalError}@anchor{3e45}
@deffn {메서드} ErrorHandler.fatalError (exception)

구문 분석기가 복구 불가능한 에러를 만나면 호출됩니다; 이 메서드가 반환될 때 구문 분석이 종료될 것으로 기대합니다.
@end deffn

@geindex warning() (xml.sax.handler.ErrorHandler 메서드)
@anchor{library/xml sax handler xml sax handler ErrorHandler warning}@anchor{3e46}
@deffn {메서드} ErrorHandler.warning (exception)

구문 분석기가 응용 프로그램에 경미한 경고 정보를 제공할 때 호출됩니다. 이 메서드가 반환될 때 구문 분석이 계속될 것으로 기대되며, 문서 정보는 계속 응용 프로그램에 전달됩니다. 이 메서드에서 예외를 발생시키면 구문 분석이 종료됩니다.
@end deffn

@node LexicalHandler 객체,,ErrorHandler 객체,xml sax handler — SAX 처리기의 베이스 클래스
@anchor{library/xml sax handler lexical-handler-objects}@anchor{3e47}@anchor{library/xml sax handler lexicalhandler-objects}@anchor{3e48}
@subsubsection LexicalHandler 객체


어휘 이벤트에 대한 선택적 SAX2 처리기.

This handler is used to obtain lexical information about an XML
document. Lexical information includes information describing the
document encoding used and XML comments embedded in the document, as
well as section boundaries for the DTD and for any CDATA sections.
The lexical handlers are used in the same manner as content handlers.

Set the LexicalHandler of an XMLReader by using the setProperty method
with the property identifier
@code{'http://xml.org/sax/properties/lexical-handler'}.

@geindex comment() (xml.sax.handler.LexicalHandler 메서드)
@anchor{library/xml sax handler xml sax handler LexicalHandler comment}@anchor{3e49}
@deffn {메서드} LexicalHandler.comment (content)

Reports a comment anywhere in the document (including the DTD and
outside the document element).
@end deffn

@geindex startDTD() (xml.sax.handler.LexicalHandler 메서드)
@anchor{library/xml sax handler xml sax handler LexicalHandler startDTD}@anchor{3e4a}
@deffn {메서드} LexicalHandler.startDTD (name, public_id, system_id)

Reports the start of the DTD declarations if the document has an
associated DTD.
@end deffn

@geindex endDTD() (xml.sax.handler.LexicalHandler 메서드)
@anchor{library/xml sax handler xml sax handler LexicalHandler endDTD}@anchor{3e4b}
@deffn {메서드} LexicalHandler.endDTD ()

Reports the end of DTD declaration.
@end deffn

@geindex startCDATA() (xml.sax.handler.LexicalHandler 메서드)
@anchor{library/xml sax handler xml sax handler LexicalHandler startCDATA}@anchor{3e4c}
@deffn {메서드} LexicalHandler.startCDATA ()

Reports the start of a CDATA marked section.

The contents of the CDATA marked section will be reported through
the characters handler.
@end deffn

@geindex endCDATA() (xml.sax.handler.LexicalHandler 메서드)
@anchor{library/xml sax handler xml sax handler LexicalHandler endCDATA}@anchor{3e4d}
@deffn {메서드} LexicalHandler.endCDATA ()

Reports the end of a CDATA marked section.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node xml sax saxutils — SAX 유틸리티,xml sax xmlreader — XML 구문 분석기 인터페이스,xml sax handler — SAX 처리기의 베이스 클래스,구조화된 마크업 처리 도구
@anchor{library/xml sax utils doc}@anchor{3e4e}@anchor{library/xml sax utils module-xml sax saxutils}@anchor{131}@anchor{library/xml sax utils translation-repo}@anchor{3e4f}@anchor{library/xml sax utils xml-sax-saxutils-sax-utilities}@anchor{3e50}
@subsection @code{xml.sax.saxutils} — SAX 유틸리티


@geindex module; xml.sax.saxutils

`소스 코드:' Lib/xml/sax/saxutils.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/xml/sax/saxutils.py}


__________________________________________________________________


The module @code{xml.sax.saxutils} contains a number of classes and functions
that are commonly useful when creating SAX applications, either in direct use,
or as base classes.

@geindex escape() (xml.sax.saxutils 모듈)
@anchor{library/xml sax utils xml sax saxutils escape}@anchor{3e51}
@deffn {함수} xml.sax.saxutils.escape (data, entities=@{@})

data 문자열에 있는 @code{'&'}, @code{'<'} 및 @code{'>'}를 이스케이프 합니다.

딕셔너리를 선택적 `entities' 매개 변수로 전달하여 data의 다른 문자열을 이스케이프 할 수 있습니다. 키와 값은 모두 문자열이어야 합니다; 각 키는 해당 값으로 치환되게 됩니다. 문자 @code{'&'}, @code{'<'} 및 @code{'>'}는 `entities'가 제공되더라도 항상 이스케이프 됩니다.

@cartouche
@quotation 참고 
This function should only be used to escape characters that
can’t be used directly in XML. Do not use this function as a general
string translation function.
@end quotation
@end cartouche
@end deffn

@geindex unescape() (xml.sax.saxutils 모듈)
@anchor{library/xml sax utils xml sax saxutils unescape}@anchor{3e52}
@deffn {함수} xml.sax.saxutils.unescape (data, entities=@{@})

data 문자열에 있는 @code{'&amp;'}, @code{'&lt;'} 및 @code{'&gt;'}를 역 이스케이프 합니다.

You can unescape other strings of data by passing a dictionary as the optional
`entities' parameter.  The keys and values must all be strings; each key will be
replaced with its corresponding value.  @code{'&amp;'}, @code{'&lt;'}, and @code{'&gt;'}
are always unescaped, even if `entities' is provided.
@end deffn

@geindex quoteattr() (xml.sax.saxutils 모듈)
@anchor{library/xml sax utils xml sax saxutils quoteattr}@anchor{3e53}
@deffn {함수} xml.sax.saxutils.quoteattr (data, entities=@{@})

@ref{3e51,,escape()}와 비슷하지만, `data'가 어트리뷰트 값으로 사용되도록 준비합니다. 반환 값은 추가로 필요한 치환이 적용된 `data'의 따옴표 붙은 버전입니다. @ref{3e53,,quoteattr()}는 `data'의 내용에 따라 인용 부호 문자를 선택하여 가능하면 문자열의 인용 부호 문자를 인코딩하지 않습니다. 작은따옴표와 큰따옴표가 모두 `data'에 이미 있으면, 큰따옴표 문자가 인코딩되고, `data'는 큰따옴표로 묶입니다. 결과 문자열은 어트리뷰트 값으로 직접 사용할 수 있습니다:

@example
>>> print("<element attr=%s>" % quoteattr("ab ' cd \" ef"))
<element attr="ab ' cd &quot; ef">
@end example

이 함수는 참조 구상 문법(reference concrete syntax)을 사용하여 HTML이나 모든 SGML을 위한 어트리뷰트 값을 생성할 때 유용합니다.
@end deffn

@geindex XMLGenerator (xml.sax.saxutils 클래스)
@anchor{library/xml sax utils xml sax saxutils XMLGenerator}@anchor{3e54}
@deffn {클래스} xml.sax.saxutils.XMLGenerator (out=None, encoding='iso-8859-1', short_empty_elements=False)

이 클래스는 SAX 이벤트를 다시 XML 문서에 쓰는 방식으로 @ref{3e05,,ContentHandler} 인터페이스를 구현합니다. 다시 말해, @ref{3e54,,XMLGenerator}를 내용 처리기로 사용하면 구문 분석 중인 원본 문서를 재생산합니다. `out'은 파일류 객체 여야하고, 기본값은 `sys.stdout'입니다. `encoding'은 출력 스트림의 인코딩이고, 기본값은 @code{'iso-8859-1'}입니다. `short_empty_elements'는 내용이 없는 엘리먼트의 형식을 제어합니다: @code{False}(기본값)는 시작/끝 태그 쌍으로 출력하고, @code{True}로 설정하면 하나의 스스로 닫힌 태그를 출력합니다.


버전 3.2에서 변경: `short_empty_elements' 매개 변수를 추가했습니다.

@end deffn

@geindex XMLFilterBase (xml.sax.saxutils 클래스)
@anchor{library/xml sax utils xml sax saxutils XMLFilterBase}@anchor{3e55}
@deffn {클래스} xml.sax.saxutils.XMLFilterBase (base)

이 클래스는 @ref{3e08,,XMLReader}와 클라이언트 응용 프로그램의 이벤트 처리기 사이에 위치하도록 설계되었습니다. 기본적으로, 이것은 요청을 입력기에 전달하고 이벤트를 변경 없이 처리기에 전달할 뿐 아무것도 하지 않지만, 서브 클래스는 특정 메서드를 재정의하여 이벤트 스트림이나 구성 요청이 지나갈 때 수정할 수 있습니다.
@end deffn

@geindex prepare_input_source() (xml.sax.saxutils 모듈)
@anchor{library/xml sax utils xml sax saxutils prepare_input_source}@anchor{3e56}
@deffn {함수} xml.sax.saxutils.prepare_input_source (source, base='@w{'})

이 함수는 입력 소스와 선택적인 베이스 URL을 받아들이고 완전히 결정되고 읽을 준비가 된 @ref{109a,,InputSource} 객체를 반환합니다. 입력 소스는 문자열, 파일류 객체 또는 @code{InputSource} 객체로 지정할 수 있습니다; 구문 분석기는 @ref{3e57,,parse()} 메서드에 대한 다형적인 `source' 인자를 구현하는 데 이 함수를 사용할 수 있습니다.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node xml sax xmlreader — XML 구문 분석기 인터페이스,xml parsers expat — Expat을 사용한 빠른 XML 구문 분석,xml sax saxutils — SAX 유틸리티,구조화된 마크업 처리 도구
@anchor{library/xml sax reader doc}@anchor{3e58}@anchor{library/xml sax reader module-xml sax xmlreader}@anchor{132}@anchor{library/xml sax reader translation-repo}@anchor{3e59}@anchor{library/xml sax reader xml-sax-xmlreader-interface-for-xml-parsers}@anchor{3e5a}
@subsection @code{xml.sax.xmlreader} — XML 구문 분석기 인터페이스


@geindex module; xml.sax.xmlreader

`소스 코드:' Lib/xml/sax/xmlreader.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/xml/sax/xmlreader.py}


__________________________________________________________________


SAX 구문 분석기는 @ref{3e08,,XMLReader} 인터페이스를 구현합니다. 이들은 함수 @code{create_parser()}를 제공해야 하는 파이썬 모듈로 구현됩니다. 이 함수는 새로운 구문 분석기 객체를 만들기 위해 인자 없이 @ref{1e18,,xml.sax.make_parser()}에 의해 호출됩니다.

@geindex XMLReader (xml.sax.xmlreader 클래스)
@anchor{library/xml sax reader xml sax xmlreader XMLReader}@anchor{3e08}
@deffn {클래스} xml.sax.xmlreader.XMLReader

SAX 구문 분석기가 상속할 수 있는 베이스 클래스.
@end deffn

@geindex IncrementalParser (xml.sax.xmlreader 클래스)
@anchor{library/xml sax reader xml sax xmlreader IncrementalParser}@anchor{3e5b}
@deffn {클래스} xml.sax.xmlreader.IncrementalParser

때에 따라 입력 소스를 한 번에 구문 분석하지 않고 문서를 사용 가능할 때마다 청크로 공급하는 것이 바람직합니다. 입력기(reader)는 일반적으로 전체 파일을 읽지 않고 덩어리로 읽습니다; 여전히 전체 문서가 처리될 때까지 @code{parse()}는 반환하지 않습니다. 따라서 @code{parse()}의 블로킹 동작이 바람직하지 않을 때 이 인터페이스를 사용해야 합니다.

구문 분석기가 인스턴스화 되면 즉시 feed 메서드에서 데이터를 받아들일 수 있습니다. 구문 분석이 close 호출로 완료된 후, 구문 분석기가 feed나 parse 메서드를 사용하여 새 데이터를 받아들일 준비가 되도록 하려면 reset 메서드를 호출해야 합니다.

이러한 메서드들은 구문 분석 중, 즉 parse가 호출된 후 반환하기 전에 호출하지 `않아야' 합니다.

기본적으로, 이 클래스는 SAX 2.0 드라이버 작성자의 편의를 위해 IncrementalParser 인터페이스의 feed, close 및 reset 메서드를 사용하여 XMLReader 인터페이스의 parse 메서드를 구현합니다.
@end deffn

@geindex Locator (xml.sax.xmlreader 클래스)
@anchor{library/xml sax reader xml sax xmlreader Locator}@anchor{3e15}
@deffn {클래스} xml.sax.xmlreader.Locator

SAX 이벤트를 문서 위치에 관련시키기 위한 인터페이스. 로케이터 객체는 DocumentHandler 메서드들을 호출하는 동안에만 유효한 결과를 반환합니다; 다른 때에는 결과를 예측할 수 없습니다. 정보가 없으면, 메서드는 @code{None}을 반환할 수 있습니다.
@end deffn

@geindex InputSource (xml.sax.xmlreader 클래스)
@anchor{library/xml sax reader xml sax xmlreader InputSource}@anchor{109a}
@deffn {클래스} xml.sax.xmlreader.InputSource (system_id=None)

엔티티를 읽기 위해 @ref{3e08,,XMLReader}에 필요한 정보의 캡슐화.

이 클래스는 공개 식별자, 시스템 식별자, 바이트 스트림 (문자 인코딩 정보도 포함할 수 있습니다) 및/또는 엔티티의 문자 스트림에 대한 정보를 포함할 수 있습니다.

응용 프로그램은 @ref{3e57,,XMLReader.parse()} 메서드에서 사용하고 EntityResolver.resolveEntity에서 반환하기 위해 이 클래스의 객체를 만듭니다.

@ref{109a,,InputSource}는 응용 프로그램에 속하며, @ref{3e08,,XMLReader}는 응용 프로그램에서 전달된 @code{InputSource} 객체를 수정할 수는 없지만, 복사하여 수정할 수는 있습니다.
@end deffn

@geindex AttributesImpl (xml.sax.xmlreader 클래스)
@anchor{library/xml sax reader xml sax xmlreader AttributesImpl}@anchor{3e5c}
@deffn {클래스} xml.sax.xmlreader.AttributesImpl (attrs)

이것은 @code{Attributes} 인터페이스의 구현입니다 (@ref{3e34,,Attributes 인터페이스} 절을 참조하십시오). 이것은 @code{startElement()} 호출에서 요소 어트리뷰트를 나타내는 딕셔너리류 객체입니다. 가장 유용한 딕셔너리 연산 외에도, 인터페이스에서 설명하는 여러 가지 메서드를 지원합니다. 이 클래스의 객체는 입력기(reader)가 인스턴스화 해야 합니다; `attrs'는 어트리뷰트 이름에서 어트리뷰트 값으로의 매핑을 포함하는 딕셔너리류 객체여야 합니다.
@end deffn

@geindex AttributesNSImpl (xml.sax.xmlreader 클래스)
@anchor{library/xml sax reader xml sax xmlreader AttributesNSImpl}@anchor{3e5d}
@deffn {클래스} xml.sax.xmlreader.AttributesNSImpl (attrs, qnames)

@code{startElementNS()}에 전달될 @ref{3e5c,,AttributesImpl}의 이름 공간(namespace) 인식 변형입니다. @code{AttributesImpl}에서 파생되었지만, `namespaceURI'와 `localname'의 2-튜플로 구성된 어트리뷰트 이름을 이해합니다. 또한, 원본 문서에 나타나는 정규화 된 이름을 기대하는 여러 가지 메서드를 제공합니다. 이 클래스는 @code{AttributesNS} 인터페이스를 구현합니다 (@ref{3e36,,AttributesNS 인터페이스} 절을 참조하십시오).
@end deffn

@menu
* XMLReader 객체:: 
* IncrementalParser 객체:: 
* Locator 객체:: 
* InputSource 객체:: 
* Attributes 인터페이스:: 
* AttributesNS 인터페이스:: 

@end menu

@node XMLReader 객체,IncrementalParser 객체,,xml sax xmlreader — XML 구문 분석기 인터페이스
@anchor{library/xml sax reader id1}@anchor{3e5e}@anchor{library/xml sax reader xmlreader-objects}@anchor{3e5f}
@subsubsection XMLReader 객체


@ref{3e08,,XMLReader} 인터페이스는 다음과 같은 메서드를 지원합니다:

@geindex parse() (xml.sax.xmlreader.XMLReader 메서드)
@anchor{library/xml sax reader xml sax xmlreader XMLReader parse}@anchor{3e57}
@deffn {메서드} XMLReader.parse (source)

SAX 이벤트를 생성하면서 입력 소스를 처리합니다. `source' 객체는 시스템 식별자 (입력 소스를 식별하는 문자열 – 보통 파일 이름이나 URL), @ref{266,,pathlib.Path}, @ref{5a0,,경로류} 객체 또는 @ref{109a,,InputSource} 객체일 수 있습니다. @ref{3e57,,parse()}가 반환되면, 입력이 완전히 처리된 것이고 구문 분석기 객체를 파기하거나 재설정(reset)할 수 있습니다.


버전 3.5에서 변경: 문자 스트림 지원이 추가되었습니다.



버전 3.8에서 변경: 경로류 객체에 대한 지원이 추가되었습니다.

@end deffn

@geindex getContentHandler() (xml.sax.xmlreader.XMLReader 메서드)
@anchor{library/xml sax reader xml sax xmlreader XMLReader getContentHandler}@anchor{3e60}
@deffn {메서드} XMLReader.getContentHandler ()

현재 @ref{3e05,,ContentHandler}를 반환합니다.
@end deffn

@geindex setContentHandler() (xml.sax.xmlreader.XMLReader 메서드)
@anchor{library/xml sax reader xml sax xmlreader XMLReader setContentHandler}@anchor{3e61}
@deffn {메서드} XMLReader.setContentHandler (handler)

현재 @ref{3e05,,ContentHandler}를 설정합니다. @code{ContentHandler}가 설정되지 않으면, 내용 이벤트가 버려집니다.
@end deffn

@geindex getDTDHandler() (xml.sax.xmlreader.XMLReader 메서드)
@anchor{library/xml sax reader xml sax xmlreader XMLReader getDTDHandler}@anchor{3e62}
@deffn {메서드} XMLReader.getDTDHandler ()

현재 @ref{3e20,,DTDHandler}를 반환합니다.
@end deffn

@geindex setDTDHandler() (xml.sax.xmlreader.XMLReader 메서드)
@anchor{library/xml sax reader xml sax xmlreader XMLReader setDTDHandler}@anchor{3e63}
@deffn {메서드} XMLReader.setDTDHandler (handler)

현재 @ref{3e20,,DTDHandler}를 설정합니다. @code{DTDHandler}가 설정되지 않으면, DTD 이벤트가 버려집니다.
@end deffn

@geindex getEntityResolver() (xml.sax.xmlreader.XMLReader 메서드)
@anchor{library/xml sax reader xml sax xmlreader XMLReader getEntityResolver}@anchor{3e64}
@deffn {메서드} XMLReader.getEntityResolver ()

현재 @ref{3e21,,EntityResolver}를 반환합니다.
@end deffn

@geindex setEntityResolver() (xml.sax.xmlreader.XMLReader 메서드)
@anchor{library/xml sax reader xml sax xmlreader XMLReader setEntityResolver}@anchor{3e65}
@deffn {메서드} XMLReader.setEntityResolver (handler)

현재 @ref{3e21,,EntityResolver}를 설정합니다. @code{EntityResolver}가 설정되지 않으면, 외부 엔티티를 결정하려고 할 때 엔티티에 대한 시스템 식별자가 열리게 되고, 사용할 수 없으면 실패합니다.
@end deffn

@geindex getErrorHandler() (xml.sax.xmlreader.XMLReader 메서드)
@anchor{library/xml sax reader xml sax xmlreader XMLReader getErrorHandler}@anchor{3e66}
@deffn {메서드} XMLReader.getErrorHandler ()

현재 @ref{3e13,,ErrorHandler}를 반환합니다.
@end deffn

@geindex setErrorHandler() (xml.sax.xmlreader.XMLReader 메서드)
@anchor{library/xml sax reader xml sax xmlreader XMLReader setErrorHandler}@anchor{3e67}
@deffn {메서드} XMLReader.setErrorHandler (handler)

현재 에러 처리기를 설정합니다. @ref{3e13,,ErrorHandler}가 설정되지 않으면, 에러는 예외를 발생시키고, 경고는 인쇄됩니다.
@end deffn

@geindex setLocale() (xml.sax.xmlreader.XMLReader 메서드)
@anchor{library/xml sax reader xml sax xmlreader XMLReader setLocale}@anchor{3e68}
@deffn {메서드} XMLReader.setLocale (locale)

응용 프로그램이 에러와 경고에 대한 로케일을 설정하도록 합니다.

SAX 구문 분석기는 에러와 경고에 대한 지역화를 제공하지 않아도 됩니다; 그러나, 요청된 로케일을 지원할 수 없으면 SAX 예외를 발생시켜야 합니다. 응용 프로그램은 구문 분석 중에 로케일 변경을 요청할 수 있습니다.
@end deffn

@geindex getFeature() (xml.sax.xmlreader.XMLReader 메서드)
@anchor{library/xml sax reader xml sax xmlreader XMLReader getFeature}@anchor{3e69}
@deffn {메서드} XMLReader.getFeature (featurename)

기능 `featurename'의 현재 설정을 반환합니다. 기능이 인식되지 않으면, @code{SAXNotRecognizedException}이 발생합니다. 잘 알려진 기능 이름(featurename)은 모듈 @ref{130,,xml.sax.handler}에 나열되어 있습니다.
@end deffn

@geindex setFeature() (xml.sax.xmlreader.XMLReader 메서드)
@anchor{library/xml sax reader xml sax xmlreader XMLReader setFeature}@anchor{3e12}
@deffn {메서드} XMLReader.setFeature (featurename, value)

`featurename'을 `value'로 설정합니다. 기능이 인식되지 않으면, @code{SAXNotRecognizedException}가 발생합니다. 구문 분석기가 기능이나 해당 설정을 지원하지 않으면 `SAXNotSupportedException'이 발생합니다.
@end deffn

@geindex getProperty() (xml.sax.xmlreader.XMLReader 메서드)
@anchor{library/xml sax reader xml sax xmlreader XMLReader getProperty}@anchor{3e6a}
@deffn {메서드} XMLReader.getProperty (propertyname)

속성 `propertyname'의 현재 설정을 반환합니다. 속성이 인식되지 않으면 @code{SAXNotRecognizedException}이 발생합니다. 잘 알려진 속성 이름은 모듈 @ref{130,,xml.sax.handler}에 나열되어 있습니다.
@end deffn

@geindex setProperty() (xml.sax.xmlreader.XMLReader 메서드)
@anchor{library/xml sax reader xml sax xmlreader XMLReader setProperty}@anchor{3e6b}
@deffn {메서드} XMLReader.setProperty (propertyname, value)

`propertyname'을 `value'로 설정합니다. 속성이 인식되지 않으면 @code{SAXNotRecognizedException}이 발생합니다. 구문 분석기가 속성이나 해당 설정을 지원하지 않으면 `SAXNotSupportedException'이 발생합니다.
@end deffn

@node IncrementalParser 객체,Locator 객체,XMLReader 객체,xml sax xmlreader — XML 구문 분석기 인터페이스
@anchor{library/xml sax reader incremental-parser-objects}@anchor{3e6c}@anchor{library/xml sax reader incrementalparser-objects}@anchor{3e6d}
@subsubsection IncrementalParser 객체


@ref{3e5b,,IncrementalParser} 인스턴스는 다음과 같은 추가 메서드를 제공합니다:

@geindex feed() (xml.sax.xmlreader.IncrementalParser 메서드)
@anchor{library/xml sax reader xml sax xmlreader IncrementalParser feed}@anchor{3e6e}
@deffn {메서드} IncrementalParser.feed (data)

`data' 청크를 처리합니다.
@end deffn

@geindex close() (xml.sax.xmlreader.IncrementalParser 메서드)
@anchor{library/xml sax reader xml sax xmlreader IncrementalParser close}@anchor{3e6f}
@deffn {메서드} IncrementalParser.close ()

문서의 끝을 가정합니다. 끝에서만 확인할 수 있는 올바른 구성(well-formedness) 조건을 확인하고, 처리기를 호출하며 구문 분석 중에 할당된 자원을 정리할 수 있습니다.
@end deffn

@geindex reset() (xml.sax.xmlreader.IncrementalParser 메서드)
@anchor{library/xml sax reader xml sax xmlreader IncrementalParser reset}@anchor{3e70}
@deffn {메서드} IncrementalParser.reset ()

이 메서드는 close가 호출된 후에 호출되어 새 문서를 구문 분석할 수 있도록 구문 분석기를 재설정합니다. reset을 호출하지 않고, close 후에 parse나 feed를 호출한 결과는 정의되지 않습니다.
@end deffn

@node Locator 객체,InputSource 객체,IncrementalParser 객체,xml sax xmlreader — XML 구문 분석기 인터페이스
@anchor{library/xml sax reader id2}@anchor{3e71}@anchor{library/xml sax reader locator-objects}@anchor{3e72}
@subsubsection Locator 객체


@ref{3e15,,Locator} 인스턴스는 다음 메서드를 제공합니다:

@geindex getColumnNumber() (xml.sax.xmlreader.Locator 메서드)
@anchor{library/xml sax reader xml sax xmlreader Locator getColumnNumber}@anchor{3e73}
@deffn {메서드} Locator.getColumnNumber ()

현재 이벤트가 시작되는 열 번호를 반환합니다.
@end deffn

@geindex getLineNumber() (xml.sax.xmlreader.Locator 메서드)
@anchor{library/xml sax reader xml sax xmlreader Locator getLineNumber}@anchor{3e74}
@deffn {메서드} Locator.getLineNumber ()

현재 이벤트가 시작되는 줄 번호를 반환합니다.
@end deffn

@geindex getPublicId() (xml.sax.xmlreader.Locator 메서드)
@anchor{library/xml sax reader xml sax xmlreader Locator getPublicId}@anchor{3e75}
@deffn {메서드} Locator.getPublicId ()

현재 이벤트의 공개 식별자를 반환합니다.
@end deffn

@geindex getSystemId() (xml.sax.xmlreader.Locator 메서드)
@anchor{library/xml sax reader xml sax xmlreader Locator getSystemId}@anchor{3e76}
@deffn {메서드} Locator.getSystemId ()

현재 이벤트의 시스템 식별자를 반환합니다.
@end deffn

@node InputSource 객체,Attributes 인터페이스,Locator 객체,xml sax xmlreader — XML 구문 분석기 인터페이스
@anchor{library/xml sax reader input-source-objects}@anchor{3e77}@anchor{library/xml sax reader inputsource-objects}@anchor{3e78}
@subsubsection InputSource 객체


@geindex setPublicId() (xml.sax.xmlreader.InputSource 메서드)
@anchor{library/xml sax reader xml sax xmlreader InputSource setPublicId}@anchor{3e79}
@deffn {메서드} InputSource.setPublicId (id)

이 @ref{109a,,InputSource}의 공개 식별자를 설정합니다.
@end deffn

@geindex getPublicId() (xml.sax.xmlreader.InputSource 메서드)
@anchor{library/xml sax reader xml sax xmlreader InputSource getPublicId}@anchor{3e7a}
@deffn {메서드} InputSource.getPublicId ()

이 @ref{109a,,InputSource}의 공개 식별자를 반환합니다.
@end deffn

@geindex setSystemId() (xml.sax.xmlreader.InputSource 메서드)
@anchor{library/xml sax reader xml sax xmlreader InputSource setSystemId}@anchor{3e7b}
@deffn {메서드} InputSource.setSystemId (id)

이 @ref{109a,,InputSource}의 시스템 식별자를 설정합니다.
@end deffn

@geindex getSystemId() (xml.sax.xmlreader.InputSource 메서드)
@anchor{library/xml sax reader xml sax xmlreader InputSource getSystemId}@anchor{3e7c}
@deffn {메서드} InputSource.getSystemId ()

이 @ref{109a,,InputSource}의 시스템 식별자를 반환합니다.
@end deffn

@geindex setEncoding() (xml.sax.xmlreader.InputSource 메서드)
@anchor{library/xml sax reader xml sax xmlreader InputSource setEncoding}@anchor{3e7d}
@deffn {메서드} InputSource.setEncoding (encoding)

이 @ref{109a,,InputSource}의 문자 인코딩을 설정합니다.

인코딩은 XML 인코딩 선언에 허용되는 문자열이어야 합니다 (XML 권장 사항의 4.3.3 절을 참조하십시오).

@ref{109a,,InputSource}에 문자 스트림도 포함되어 있으면 @code{InputSource}의 인코딩 어트리뷰트는 무시됩니다.
@end deffn

@geindex getEncoding() (xml.sax.xmlreader.InputSource 메서드)
@anchor{library/xml sax reader xml sax xmlreader InputSource getEncoding}@anchor{3e7e}
@deffn {메서드} InputSource.getEncoding ()

이 InputSource의 문자 인코딩을 가져옵니다.
@end deffn

@geindex setByteStream() (xml.sax.xmlreader.InputSource 메서드)
@anchor{library/xml sax reader xml sax xmlreader InputSource setByteStream}@anchor{3e7f}
@deffn {메서드} InputSource.setByteStream (bytefile)

이 입력 소스의 바이트 스트림(@ref{206c,,바이너리 파일})을 설정합니다.

문자 스트림도 지정되어 있으면 SAX 구문 분석기는 이것을 무시하지만, URI 연결 자체를 여는 것보다 바이트 스트림을 먼저 사용합니다.

응용 프로그램이 바이트 스트림의 문자 인코딩을 알고 있으면, setEncoding 메서드로 설정해야 합니다.
@end deffn

@geindex getByteStream() (xml.sax.xmlreader.InputSource 메서드)
@anchor{library/xml sax reader xml sax xmlreader InputSource getByteStream}@anchor{3e80}
@deffn {메서드} InputSource.getByteStream ()

이 입력 소스의 바이트 스트림을 가져옵니다.

getEncoding 메서드는 이 바이트 스트림의 문자 인코딩을 반환하거나, 알 수 없으면 @code{None}을 반환합니다.
@end deffn

@geindex setCharacterStream() (xml.sax.xmlreader.InputSource 메서드)
@anchor{library/xml sax reader xml sax xmlreader InputSource setCharacterStream}@anchor{3e81}
@deffn {메서드} InputSource.setCharacterStream (charfile)

이 입력 소스에 대한 문자 스트림(@ref{206b,,텍스트 파일})을 설정합니다.

문자 스트림이 지정되면 SAX 구문 분석기는 모든 바이트 스트림을 무시하고 시스템 식별자에 대한 URI 연결을 열려고 시도하지 않습니다.
@end deffn

@geindex getCharacterStream() (xml.sax.xmlreader.InputSource 메서드)
@anchor{library/xml sax reader xml sax xmlreader InputSource getCharacterStream}@anchor{3e82}
@deffn {메서드} InputSource.getCharacterStream ()

이 입력 소스의 문자 스트림을 가져옵니다.
@end deffn

@node Attributes 인터페이스,AttributesNS 인터페이스,InputSource 객체,xml sax xmlreader — XML 구문 분석기 인터페이스
@anchor{library/xml sax reader attributes-objects}@anchor{3e34}@anchor{library/xml sax reader the-attributes-interface}@anchor{3e83}
@subsubsection @code{Attributes} 인터페이스


@code{Attributes} 객체는 메서드 @code{copy()}, @code{get()}, @ref{15be,,__contains__()}, @code{items()}, @code{keys()} 및 @code{values()}를 포함하는 @ref{13c0,,매핑 프로토콜}의 일부를 구현합니다. 다음과 같은 메서드도 제공됩니다:

@geindex getLength() (xml.sax.xmlreader.Attributes 메서드)
@anchor{library/xml sax reader xml sax xmlreader Attributes getLength}@anchor{3e84}
@deffn {메서드} Attributes.getLength ()

어트리뷰트 수를 반환합니다.
@end deffn

@geindex getNames() (xml.sax.xmlreader.Attributes 메서드)
@anchor{library/xml sax reader xml sax xmlreader Attributes getNames}@anchor{3e85}
@deffn {메서드} Attributes.getNames ()

어트리뷰트의 이름을 반환합니다.
@end deffn

@geindex getType() (xml.sax.xmlreader.Attributes 메서드)
@anchor{library/xml sax reader xml sax xmlreader Attributes getType}@anchor{3e86}
@deffn {메서드} Attributes.getType (name)

어트리뷰트 `name'의 유형을 반환합니다. 일반적으로 @code{'CDATA'}입니다.
@end deffn

@geindex getValue() (xml.sax.xmlreader.Attributes 메서드)
@anchor{library/xml sax reader xml sax xmlreader Attributes getValue}@anchor{3e87}
@deffn {메서드} Attributes.getValue (name)

어트리뷰트 `name'의 값을 반환합니다.
@end deffn

@c getValueByQName, getNameByQName, getQNameByName, getQNames available

@c here already, but documented only for derived class.

@node AttributesNS 인터페이스,,Attributes 인터페이스,xml sax xmlreader — XML 구문 분석기 인터페이스
@anchor{library/xml sax reader attributes-ns-objects}@anchor{3e36}@anchor{library/xml sax reader the-attributesns-interface}@anchor{3e88}
@subsubsection @code{AttributesNS} 인터페이스


이 인터페이스는 @code{Attributes} 인터페이스의 서브 형입니다 (@ref{3e34,,Attributes 인터페이스} 절을 참조하십시오). 그 인터페이스에서 지원하는 모든 메서드는 @code{AttributesNS} 객체에서도 사용 가능합니다.

다음과 같은 메서드도 제공됩니다:

@geindex getValueByQName() (xml.sax.xmlreader.AttributesNS 메서드)
@anchor{library/xml sax reader xml sax xmlreader AttributesNS getValueByQName}@anchor{3e89}
@deffn {메서드} AttributesNS.getValueByQName (name)

정규화된 이름(qualified name)의 값을 반환합니다.
@end deffn

@geindex getNameByQName() (xml.sax.xmlreader.AttributesNS 메서드)
@anchor{library/xml sax reader xml sax xmlreader AttributesNS getNameByQName}@anchor{3e8a}
@deffn {메서드} AttributesNS.getNameByQName (name)

정규화된 `name'에 대한 @code{(namespace, localname)} 쌍을 반환합니다.
@end deffn

@geindex getQNameByName() (xml.sax.xmlreader.AttributesNS 메서드)
@anchor{library/xml sax reader xml sax xmlreader AttributesNS getQNameByName}@anchor{3e8b}
@deffn {메서드} AttributesNS.getQNameByName (name)

@code{(namespace, localname)} 쌍에 대한 정규화된 이름을 반환합니다.
@end deffn

@geindex getQNames() (xml.sax.xmlreader.AttributesNS 메서드)
@anchor{library/xml sax reader xml sax xmlreader AttributesNS getQNames}@anchor{3e8c}
@deffn {메서드} AttributesNS.getQNames ()

모든 어트리뷰트의 정규화된 이름을 반환합니다.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node xml parsers expat — Expat을 사용한 빠른 XML 구문 분석,,xml sax xmlreader — XML 구문 분석기 인터페이스,구조화된 마크업 처리 도구
@anchor{library/pyexpat doc}@anchor{3e8d}@anchor{library/pyexpat module-xml parsers expat}@anchor{12c}@anchor{library/pyexpat translation-repo}@anchor{3e8e}@anchor{library/pyexpat xml-parsers-expat-fast-xml-parsing-using-expat}@anchor{3e8f}
@subsection @code{xml.parsers.expat} — Expat을 사용한 빠른 XML 구문 분석


@geindex module; xml.parsers.expat


__________________________________________________________________


@c Markup notes:
@c 
@c Many of the attributes of the XMLParser objects are callbacks.  Since
@c signature information must be presented, these are described using the method
@c directive.  Since they are attributes which are set by client code, in-text
@c references to these attributes should be marked using the :member: role.

@cartouche
@quotation 참고 
If you need to parse untrusted or unauthenticated data, see
@ref{3d21,,XML security}.
@end quotation
@end cartouche

@geindex Expat

The @code{xml.parsers.expat} module is a Python interface to the Expat
non-validating XML parser. The module provides a single extension type,
@code{xmlparser}, that represents the current state of an XML parser.  After
an @code{xmlparser} object has been created, various attributes of the object
can be set to handler functions.  When an XML document is then fed to the
parser, the handler functions are called for the character data and markup in
the XML document.

@geindex 모듈;pyexpat

이 모듈은 @code{pyexpat} 모듈을 사용하여 Expat 구문 분석기에 대한 액세스를 제공합니다. @code{pyexpat} 모듈의 직접적인 사용은 폐지되었습니다.

이 모듈은 하나의 예외와 하나의 형 객체를 제공합니다:

@geindex ExpatError
@anchor{library/pyexpat xml parsers expat ExpatError}@anchor{147d}
@deffn {예외} xml.parsers.expat.ExpatError

Expat이 에러를 보고할 때 발생하는 예외. Expat 에러 해석에 대한 자세한 정보는 섹션 @ref{3e90,,ExpatError 예외}를 참조하십시오.
@end deffn

@geindex error
@anchor{library/pyexpat xml parsers expat error}@anchor{3e91}
@deffn {예외} xml.parsers.expat.error

@ref{147d,,ExpatError}의 별칭.
@end deffn

@geindex XMLParserType (xml.parsers.expat 모듈)
@anchor{library/pyexpat xml parsers expat XMLParserType}@anchor{3e92}
@deffn {데이터} xml.parsers.expat.XMLParserType

@ref{3e93,,ParserCreate()} 함수의 반환 값의 형.
@end deffn

The @code{xml.parsers.expat} module contains two functions:

@geindex ErrorString() (xml.parsers.expat 모듈)
@anchor{library/pyexpat xml parsers expat ErrorString}@anchor{3e94}
@deffn {함수} xml.parsers.expat.ErrorString (errno)

주어진 에러 번호 `errno'에 대한 설명 문자열을 반환합니다.
@end deffn

@geindex ParserCreate() (xml.parsers.expat 모듈)
@anchor{library/pyexpat xml parsers expat ParserCreate}@anchor{3e93}
@deffn {함수} xml.parsers.expat.ParserCreate (encoding=None, namespace_separator=None)

새로운 @code{xmlparser} 객체를 만들고 반환합니다. 지정되면, `encoding'은 XML 데이터가 사용하는 인코딩의 이름을 지정하는 문자열이어야 합니다. Expat은 파이썬만큼 많은 인코딩을 지원하지 않으며, 인코딩 레퍼토리를 확장할 수 없습니다; UTF-8, UTF-16, ISO-8859-1 (Latin1) 및 ASCII를 지원합니다. `encoding' @footnote{
XML 출력에 포함된 인코딩 문자열은 적절한 표준을 준수해야 합니다. 예를 들어, “UTF-8”은 유효하지만, “UTF8”은 유효하지 않습니다. @indicateurl{https://www.w3.org/TR/2006/REC-xml11-20060816/#NT-EncodingDecl} 과 @indicateurl{https://www.iana.org/assignments/character-sets/character-sets.xhtml} 을 참조하십시오.
} 이 제공되면 문서의 묵시적이나 명시적 인코딩을 대체합니다.
@anchor{library/pyexpat xmlparser-non-root}@anchor{3e95}
Parsers created through @code{ParserCreate()} are called “root” parsers,
in the sense that they do not have any parent parser attached. Non-root
parsers are created by @ref{1764,,parser.ExternalEntityParserCreate}.

Expat은 XML 이름 공간 처리를 선택적으로 수행할 수 있는데, `namespace_separator'에 값을 제공하는 것으로 활성화됩니다. 값은 한 문자 문자열이어야 합니다; 문자열의 길이가 잘못되면 @ref{2ec,,ValueError}가 발생합니다 (@code{None}은 생략과 같은 것으로 간주합니다). 이름 공간 처리가 활성화되면, 이름 공간에 속하는 엘리먼트 형 이름과 어트리뷰트 이름이 확장됩니다. 엘리먼트 처리기 @code{StartElementHandler}와 @code{EndElementHandler} 에 전달된 엘리먼트 이름은 이름 공간 URI, 이름 공간 구분 문자 및 이름의 로컬 부분의 이어붙이기입니다. 이름 공간 구분자가 0바이트(@code{chr(0)})이면 이름 공간 URI와 로컬 부분이 구분자 없이 연결됩니다.

예를 들어, `namespace_separator'가 스페이스 문자(@code{' '})로 설정되고 다음 문서가 구문 분석되면:

@example
<?xml version="1.0"?>
<root xmlns    = "http://default-namespace.org/"
      xmlns:py = "http://www.python.org/ns/">
  <py:elem1 />
  <elem2 xmlns="" />
</root>
@end example

@code{StartElementHandler}는 각 엘리먼트에 대해 다음 문자열을 수신합니다:

@example
http://default-namespace.org/ root
http://www.python.org/ns/ elem1
elem2
@end example

@code{pyexpat}에서 사용하는 @code{Expat} 라이브러리의 제한으로 인해, 반환된 @code{xmlparser} 인스턴스는 단일 XML 문서를 구문 분석하는 데만 사용할 수 있습니다. 고유한 구문 분석기 인스턴스를 제공하려면 문서마다 @code{ParserCreate}를 호출하십시오.
@end deffn


@subsubheading 더 보기



@table @asis

@item Expat XML 구문 분석기@footnote{http://www.libexpat.org/}

Expat 프로젝트의 홈페이지.
@end table


@menu
* XMLParser 객체: XMLParser 객체<2>. 
* ExpatError 예외:: 
* 예: 예<10>. 
* 콘텐츠 모델 기술:: 
* Expat 에러 상수:: 

@end menu

@node XMLParser 객체<2>,ExpatError 예외,,xml parsers expat — Expat을 사용한 빠른 XML 구문 분석
@anchor{library/pyexpat id2}@anchor{3e96}@anchor{library/pyexpat xmlparser-objects}@anchor{17c1}
@subsubsection XMLParser 객체


@code{xmlparser} 객체에는 다음과 같은 메서드가 있습니다:

@geindex Parse() (xml.parsers.expat.xmlparser 메서드)
@anchor{library/pyexpat xml parsers expat xmlparser Parse}@anchor{3e97}
@deffn {메서드} xmlparser.Parse (data[, isfinal])

문자열 `data'의 내용을 구문 분석하고, 구문 분석된 데이터를 처리하기 위해 적절한 처리기 함수를 호출합니다. 이 메서드에 대한 최종 호출에서 `isfinal'은 참이어야 합니다; 여러 파일을 제출하는 것이 아니라, 단일 파일을 여러 조각으로 나누어 구문 분석 할 수 있도록 합니다. `data'는 언제든지 빈 문자열이 될 수 있습니다.
@end deffn

@geindex ParseFile() (xml.parsers.expat.xmlparser 메서드)
@anchor{library/pyexpat xml parsers expat xmlparser ParseFile}@anchor{3e98}
@deffn {메서드} xmlparser.ParseFile (file)

`file' 객체에서 읽은 XML 데이터를 구문 분석합니다. `file'은 더는 데이터가 없을 때 빈 문자열을 반환하는 @code{read(nbytes)} 메서드만 제공하면 됩니다.
@end deffn

@geindex SetBase() (xml.parsers.expat.xmlparser 메서드)
@anchor{library/pyexpat xml parsers expat xmlparser SetBase}@anchor{3e99}
@deffn {메서드} xmlparser.SetBase (base)

선언에서 시스템 식별자에 있는 상대 URI를 결정하는 데 사용할 베이스를 설정합니다. 상대 식별자 결정은 응용 프로그램에 맡겨집니다: 이 값은 `base' 인자로 @ref{3e9a,,ExternalEntityRefHandler()}, @ref{3e9b,,NotationDeclHandler()} 및 @ref{3e9c,,UnparsedEntityDeclHandler()} 함수에 전달됩니다.
@end deffn

@geindex GetBase() (xml.parsers.expat.xmlparser 메서드)
@anchor{library/pyexpat xml parsers expat xmlparser GetBase}@anchor{3e9d}
@deffn {메서드} xmlparser.GetBase ()

@ref{3e99,,SetBase()}에 대한 이전 호출에 의해 설정된 베이스를 포함하는 문자열을 반환하거나, @code{SetBase()}가 호출되지 않았으면 @code{None}을 반환합니다.
@end deffn

@geindex GetInputContext() (xml.parsers.expat.xmlparser 메서드)
@anchor{library/pyexpat xml parsers expat xmlparser GetInputContext}@anchor{3e9e}
@deffn {메서드} xmlparser.GetInputContext ()

현재 이벤트를 생성한 입력 데이터를 문자열로 반환합니다. 데이터는 텍스트를 포함하는 엔티티의 인코딩을 따릅니다. 이벤트 처리기가 활성화되지 않은 상태에서 호출될 때, 반환 값은 @code{None}입니다.
@end deffn

@geindex ExternalEntityParserCreate() (xml.parsers.expat.xmlparser 메서드)
@anchor{library/pyexpat xml parsers expat xmlparser ExternalEntityParserCreate}@anchor{1764}
@deffn {메서드} xmlparser.ExternalEntityParserCreate (context[, encoding])

부모 구문 분석기가 구문 분석한 내용이 참조하는 외부 구문 분석된 엔티티를 구문 분석하는 데 사용할 수 있는 “자식” 구문 분석기를 만듭니다. `context' 매개 변수는 아래 설명된 @ref{3e9a,,ExternalEntityRefHandler()} 처리기 함수에 전달된 문자열이어야 합니다. 자식 구문 분석기는 @ref{3e9f,,ordered_attributes}와 @ref{3ea0,,specified_attributes}가 이 구문 분석기의 값으로 설정된 상태로 만들어집니다.
@end deffn

@geindex SetParamEntityParsing() (xml.parsers.expat.xmlparser 메서드)
@anchor{library/pyexpat xml parsers expat xmlparser SetParamEntityParsing}@anchor{3ea1}
@deffn {메서드} xmlparser.SetParamEntityParsing (flag)

매개 변수 엔티티(외부 DTD 부분 집합을 포함합니다)의 구문 분석을 제어합니다. 가능한 `flag' 값은 @code{XML_PARAM_ENTITY_PARSING_NEVER}, @code{XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE} 및 @code{XML_PARAM_ENTITY_PARSING_ALWAYS}입니다. 플래그 설정에 성공하면 참을 반환합니다.
@end deffn

@geindex UseForeignDTD() (xml.parsers.expat.xmlparser 메서드)
@anchor{library/pyexpat xml parsers expat xmlparser UseForeignDTD}@anchor{3ea2}
@deffn {메서드} xmlparser.UseForeignDTD ([flag])

`flag'에 대해 참값(기본값)으로 이를 호출하면 Expat이 대체 DTD를 로드할 수 있도록 모든 인자를 @ref{884,,None}으로 @ref{3e9a,,ExternalEntityRefHandler}를 호출하도록 합니다. 문서에 문서 형 선언이 포함되어 있지 않으면, @code{ExternalEntityRefHandler}는 여전히 호출되지만, @ref{3ea3,,StartDoctypeDeclHandler}와 @ref{3ea4,,EndDoctypeDeclHandler}는 호출되지 않습니다.

`flag'에 대해 거짓 값을 전달하면 참값을 전달한 이전 호출이 취소되지만, 그렇지 않으면 효과가 없습니다.

이 메서드는 @ref{3e97,,Parse()}나 @ref{3e98,,ParseFile()} 메서드가 호출되기 전에만 호출 할 수 있습니다; 이들 중 어느 것이라도 호출된 후에 호출하면 @ref{1b,,code} 어트리뷰트가 @code{errors.codes[errors.XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING]}로 설정된 @ref{147d,,ExpatError}가 발생합니다.
@end deffn

@geindex SetReparseDeferralEnabled() (xml.parsers.expat.xmlparser 메서드)
@anchor{library/pyexpat xml parsers expat xmlparser SetReparseDeferralEnabled}@anchor{578}
@deffn {메서드} xmlparser.SetReparseDeferralEnabled (enabled)

@cartouche
@quotation 경고 
Calling @code{SetReparseDeferralEnabled(False)} has security implications,
as detailed below; please make sure to understand these consequences
prior to using the @code{SetReparseDeferralEnabled} method.
@end quotation
@end cartouche

Expat 2.6.0 introduced a security mechanism called “reparse deferral”
where instead of causing denial of service through quadratic runtime
from reparsing large tokens, reparsing of unfinished tokens is now delayed
by default until a sufficient amount of input is reached.
Due to this delay, registered handlers may — depending of the sizing of
input chunks pushed to Expat — no longer be called right after pushing new
input to the parser.  Where immediate feedback and taking over responsibility
of protecting against denial of service from large tokens are both wanted,
calling @code{SetReparseDeferralEnabled(False)} disables reparse deferral
for the current Expat parser instance, temporarily or altogether.
Calling @code{SetReparseDeferralEnabled(True)} allows re-enabling reparse
deferral.

Note that @code{SetReparseDeferralEnabled()} has been backported to some
prior releases of CPython as a security fix.  Check for availability of
@code{SetReparseDeferralEnabled()} using @ref{6f8,,hasattr()} if used in code
running across a variety of Python versions.


Added in version 3.13.

@end deffn

@geindex GetReparseDeferralEnabled() (xml.parsers.expat.xmlparser 메서드)
@anchor{library/pyexpat xml parsers expat xmlparser GetReparseDeferralEnabled}@anchor{577}
@deffn {메서드} xmlparser.GetReparseDeferralEnabled ()

Returns whether reparse deferral is currently enabled for the given
Expat parser instance.


Added in version 3.13.

@end deffn

@code{xmlparser} objects have the following methods to mitigate some
common XML vulnerabilities.

@geindex SetAllocTrackerActivationThreshold() (xml.parsers.expat.xmlparser 메서드)
@anchor{library/pyexpat xml parsers expat xmlparser SetAllocTrackerActivationThreshold}@anchor{17bf}
@deffn {메서드} xmlparser.SetAllocTrackerActivationThreshold (threshold, /)

Sets the number of allocated bytes of dynamic memory needed to activate
protection against disproportionate use of RAM.

By default, parser objects have an allocation activation threshold of 64 MiB,
or equivalently 67,108,864 bytes.

An @ref{147d,,ExpatError} is raised if this method is called on a
@ref{3e95,,non-root} parser.
The corresponding @ref{3ea5,,lineno} and @ref{3ea6,,offset}
should not be used as they may have no special meaning.


Added in version 3.14.1.

@end deffn

@geindex SetAllocTrackerMaximumAmplification() (xml.parsers.expat.xmlparser 메서드)
@anchor{library/pyexpat xml parsers expat xmlparser SetAllocTrackerMaximumAmplification}@anchor{17c0}
@deffn {메서드} xmlparser.SetAllocTrackerMaximumAmplification (max_factor, /)

Sets the maximum amplification factor between direct input and bytes
of dynamic memory allocated.

The amplification factor is calculated as @code{allocated / direct}
while parsing, where @code{direct} is the number of bytes read from
the primary document in parsing and @code{allocated} is the number
of bytes of dynamic memory allocated in the parser hierarchy.

The `max_factor' value must be a non-NaN @ref{196,,float} value greater than
or equal to 1.0. Amplification factors greater than 100.0 can be observed
near the start of parsing even with benign files in practice. In particular,
the activation threshold should be carefully chosen to avoid false positives.

By default, parser objects have a maximum amplification factor of 100.0.

An @ref{147d,,ExpatError} is raised if this method is called on a
@ref{3e95,,non-root} parser or if `max_factor' is outside the valid range.
The corresponding @ref{3ea5,,lineno} and @ref{3ea6,,offset}
should not be used as they may have no special meaning.

@cartouche
@quotation 참고 
The maximum amplification factor is only considered if the threshold
that can be adjusted by @ref{17bf,,SetAllocTrackerActivationThreshold()}
is exceeded.
@end quotation
@end cartouche


Added in version 3.14.1.

@end deffn

@code{xmlparser} 객체에는 다음과 같은 어트리뷰트가 있습니다:

@geindex buffer_size (xml.parsers.expat.xmlparser의 속성)
@anchor{library/pyexpat xml parsers expat xmlparser buffer_size}@anchor{3ea7}
@deffn {속성} xmlparser.buffer_size

@ref{16c7,,buffer_text}가 참일 때 사용되는 버퍼의 크기. 이 어트리뷰트에 새로운 정숫값을 대입하여 새로운 버퍼 크기를 설정할 수 있습니다. 크기가 변경되면 버퍼가 플러시 됩니다.
@end deffn

@geindex buffer_text (xml.parsers.expat.xmlparser의 속성)
@anchor{library/pyexpat xml parsers expat xmlparser buffer_text}@anchor{16c7}
@deffn {속성} xmlparser.buffer_text

이 값을 참으로 설정하면 @code{xmlparser} 객체가 Expat에서 반환한 텍스트 내용을 버퍼링하여 가능할 때마다 @ref{3ea8,,CharacterDataHandler()} 콜백을 여러 번 호출하지 않도록 합니다. Expat은 일반적으로 모든 줄 끝에서 문자 데이터를 덩어리로 나누기 때문에 성능을 크게 향상할 수 있습니다. 이 어트리뷰트는 기본적으로 거짓이며, 언제든지 변경될 수 있습니다. 거짓일 때, 줄 넘김이 없는 데이터도 덩어리노 나뉠 수 있음에 유의하십시오.
@end deffn

@geindex buffer_used (xml.parsers.expat.xmlparser의 속성)
@anchor{library/pyexpat xml parsers expat xmlparser buffer_used}@anchor{3ea9}
@deffn {속성} xmlparser.buffer_used

@ref{16c7,,buffer_text}가 활성화되면, 버퍼에 저장된 바이트 수. 이 바이트열은 UTF-8로 인코딩된 텍스트를 나타냅니다. @code{buffer_text}가 거짓이면 이 어트리뷰트는 의미가 없습니다.
@end deffn

@geindex ordered_attributes (xml.parsers.expat.xmlparser의 속성)
@anchor{library/pyexpat xml parsers expat xmlparser ordered_attributes}@anchor{3e9f}
@deffn {속성} xmlparser.ordered_attributes

이 어트리뷰트를 0이 아닌 정수로 설정하면 어트리뷰트가 딕셔너리가 아닌 리스트로 보고됩니다. 어트리뷰트는 문서 텍스트에서 발견된 순서대로 표시됩니다. 각 어트리뷰트에 대해, 두 가지 리스트 항목이 표시됩니다: 어트리뷰트 이름과 어트리뷰트 값. (이 모듈의 이전 버전도 이 형식을 사용했습니다.) 기본적으로, 이 어트리뷰트는 거짓입니다; 언제든지 변경될 수 있습니다.
@end deffn

@geindex specified_attributes (xml.parsers.expat.xmlparser의 속성)
@anchor{library/pyexpat xml parsers expat xmlparser specified_attributes}@anchor{3ea0}
@deffn {속성} xmlparser.specified_attributes

0이 아닌 정수로 설정되면, 구문 분석기는 문서 인스턴스에 지정된 어트리뷰트만 보고하고 어트리뷰트 선언에서 파생된 어트리뷰트는 보고하지 않습니다. 이를 설정한 응용 프로그램은 XML 프로세서의 동작에 대한 표준을 준수하기 위해 선언에서 사용 가능한 추가 정보를 사용할 때 특히 주의해야 합니다. 기본적으로, 이 어트리뷰트는 거짓입니다; 언제든지 변경될 수 있습니다.
@end deffn

다음 어트리뷰트는 @code{xmlparser} 객체가 만난 가장 최근 에러와 관련된 값을 포함하며, 일단 @code{Parse()}나 @code{ParseFile()}에 대한 호출이 @ref{147d,,xml.parsers.expat.ExpatError} 예외를 발생시켰을 때만 올바른 값을 갖습니다.

@geindex ErrorByteIndex (xml.parsers.expat.xmlparser의 속성)
@anchor{library/pyexpat xml parsers expat xmlparser ErrorByteIndex}@anchor{3eaa}
@deffn {속성} xmlparser.ErrorByteIndex

에러가 발생한 바이트 인덱스.
@end deffn

@geindex ErrorCode (xml.parsers.expat.xmlparser의 속성)
@anchor{library/pyexpat xml parsers expat xmlparser ErrorCode}@anchor{3eab}
@deffn {속성} xmlparser.ErrorCode

문제를 지정하는 숫자 코드. 이 값은 @ref{3e94,,ErrorString()} 함수에 전달되거나, @code{errors} 객체에 정의된 상수 중 하나와 비교될 수 있습니다.
@end deffn

@geindex ErrorColumnNumber (xml.parsers.expat.xmlparser의 속성)
@anchor{library/pyexpat xml parsers expat xmlparser ErrorColumnNumber}@anchor{3eac}
@deffn {속성} xmlparser.ErrorColumnNumber

에러가 발생한 열 번호.
@end deffn

@geindex ErrorLineNumber (xml.parsers.expat.xmlparser의 속성)
@anchor{library/pyexpat xml parsers expat xmlparser ErrorLineNumber}@anchor{3ead}
@deffn {속성} xmlparser.ErrorLineNumber

에러가 발생한 줄 번호.
@end deffn

다음 어트리뷰트는 @code{xmlparser} 객체의 현재 구문 분석 위치와 관련된 값을 포함합니다. 구문 분석 이벤트를 보고하는 콜백 중에, 이들은 이벤트를 생성한 첫 번째 문자 시퀀스의 위치를 나타냅니다. 콜백 외부에서 호출되면, 표시된 위치는 마지막 구문 분석 이벤트 바로 다음입니다 (관련 콜백이 있는지에 관계없이).

@geindex CurrentByteIndex (xml.parsers.expat.xmlparser의 속성)
@anchor{library/pyexpat xml parsers expat xmlparser CurrentByteIndex}@anchor{3eae}
@deffn {속성} xmlparser.CurrentByteIndex

구문 분석기 입력의 현재 바이트 인덱스.
@end deffn

@geindex CurrentColumnNumber (xml.parsers.expat.xmlparser의 속성)
@anchor{library/pyexpat xml parsers expat xmlparser CurrentColumnNumber}@anchor{3eaf}
@deffn {속성} xmlparser.CurrentColumnNumber

구문 분석기 입력의 현재 열 번호.
@end deffn

@geindex CurrentLineNumber (xml.parsers.expat.xmlparser의 속성)
@anchor{library/pyexpat xml parsers expat xmlparser CurrentLineNumber}@anchor{3eb0}
@deffn {속성} xmlparser.CurrentLineNumber

구문 분석기 입력의 현재 줄 번호.
@end deffn

설정할 수 있는 처리기 목록은 다음과 같습니다. @code{xmlparser} 객체 `o'에 처리기를 설정하려면, @code{o.handlername = func}를 사용하십시오. `handlername'은 다음 목록에서 취해야 하며, `func'는 올바른 수의 인자를 받아들이는 콜러블 객체여야 합니다. 달리 명시되지 않는 한, 인자는 모두 문자열입니다.

@geindex XmlDeclHandler() (xml.parsers.expat.xmlparser 메서드)
@anchor{library/pyexpat xml parsers expat xmlparser XmlDeclHandler}@anchor{3eb1}
@deffn {메서드} xmlparser.XmlDeclHandler (version, encoding, standalone)

XML 선언이 구문 분석될 때 호출됩니다. XML 선언은 XML 권장 사항의 해당 버전에 대한 (선택적) 선언, 문서 텍스트의 인코딩 및 선택적 “독립형(standalone)” 선언입니다. `version'과 `encoding'은 문자열이며, `standalone'은 문서가 독립형으로 선언되면 @code{1}이 되고, 독립형이 아닌 것으로 선언되면 @code{0}이 됩니다, 또는 독립형 절이 생략되면 @code{-1}입니다. Expat 버전 1.95.0 이상에서만 사용할 수 있습니다.
@end deffn

@geindex StartDoctypeDeclHandler() (xml.parsers.expat.xmlparser 메서드)
@anchor{library/pyexpat xml parsers expat xmlparser StartDoctypeDeclHandler}@anchor{3ea3}
@deffn {메서드} xmlparser.StartDoctypeDeclHandler (doctypeName, systemId, publicId, has_internal_subset)

Called when Expat begins parsing the document type declaration (@code{<!DOCTYPE
...}).  The `doctypeName' is provided exactly as presented.  The `systemId' and
`publicId' parameters give the system and public identifiers if specified, or
@code{None} if omitted.  `has_internal_subset' will be true if the document
contains an internal document declaration subset. This requires Expat version
1.2 or newer.
@end deffn

@geindex EndDoctypeDeclHandler() (xml.parsers.expat.xmlparser 메서드)
@anchor{library/pyexpat xml parsers expat xmlparser EndDoctypeDeclHandler}@anchor{3ea4}
@deffn {메서드} xmlparser.EndDoctypeDeclHandler ()

Expat이 문서 형 선언 구문 분석을 완료할 때 호출됩니다. Expat 버전 1.2 이상이 필요합니다.
@end deffn

@geindex ElementDeclHandler() (xml.parsers.expat.xmlparser 메서드)
@anchor{library/pyexpat xml parsers expat xmlparser ElementDeclHandler}@anchor{175a}
@deffn {메서드} xmlparser.ElementDeclHandler (name, model)

각 엘리먼트 형 선언마다 한 번씩 호출됩니다. `name'은 엘리먼트 형의 이름이고, `model'은 콘텐츠 모델의 표현입니다.
@end deffn

@geindex AttlistDeclHandler() (xml.parsers.expat.xmlparser 메서드)
@anchor{library/pyexpat xml parsers expat xmlparser AttlistDeclHandler}@anchor{3eb2}
@deffn {메서드} xmlparser.AttlistDeclHandler (elname, attname, type, default, required)

엘리먼트 형에 대해 선언된 어트리뷰트마다 호출됩니다. 어트리뷰트 리스트 선언이 세 개의 어트리뷰트를 선언하면 이 처리기는 어트리뷰트마다 한 번씩 세 번 호출됩니다. `elname'은 선언이 적용되는 엘리먼트의 이름이고 `attname'은 선언된 어트리뷰트의 이름입니다. 어트리뷰트 형은 `type'으로 전달된 문자열입니다; 가능한 값은 @code{'CDATA'}, @code{'ID'}, @code{'IDREF'}, … 입니다. `default'는 어트리뷰트가 문서 인스턴스에 의해 지정되지 않을 때 사용되는 어트리뷰트의 기본값을 제공하거나, 기본값이 없으면 @code{None}입니다 (@code{#IMPLIED} 값). 문서 인스턴스에서 어트리뷰트가 필수면, `required'는 참입니다. Expat 버전 1.95.0 이상이 필요합니다.
@end deffn

@geindex StartElementHandler() (xml.parsers.expat.xmlparser 메서드)
@anchor{library/pyexpat xml parsers expat xmlparser StartElementHandler}@anchor{3eb3}
@deffn {메서드} xmlparser.StartElementHandler (name, attributes)

모든 엘리먼트의 시작에서 호출됩니다. `name'은 엘리먼트 이름을 포함하는 문자열이고, `attributes'는 엘리먼트 어트리뷰트입니다. @ref{3e9f,,ordered_attributes}가 참이면, 이것은 리스트입니다 (자세한 설명은 @code{ordered_attributes}를 참조하십시오). 그렇지 않으면 이름을 값으로 매핑하는 딕셔너리입니다.
@end deffn

@geindex EndElementHandler() (xml.parsers.expat.xmlparser 메서드)
@anchor{library/pyexpat xml parsers expat xmlparser EndElementHandler}@anchor{3eb4}
@deffn {메서드} xmlparser.EndElementHandler (name)

모든 엘리먼트의 끝에서 호출됩니다.
@end deffn

@geindex ProcessingInstructionHandler() (xml.parsers.expat.xmlparser 메서드)
@anchor{library/pyexpat xml parsers expat xmlparser ProcessingInstructionHandler}@anchor{3eb5}
@deffn {메서드} xmlparser.ProcessingInstructionHandler (target, data)

모든 처리 명령어(processing instruction)에서 호출됩니다.
@end deffn

@geindex CharacterDataHandler() (xml.parsers.expat.xmlparser 메서드)
@anchor{library/pyexpat xml parsers expat xmlparser CharacterDataHandler}@anchor{3ea8}
@deffn {메서드} xmlparser.CharacterDataHandler (data)

문자 데이터에 대해 호출됩니다. 일반 문자 데이터, CDATA 표시 내용 및 무시할 수 있는 공백에 대해 호출됩니다. 이들을 구별해야 하는 응용 프로그램은 @ref{3eb6,,StartCdataSectionHandler}, @ref{3eb7,,EndCdataSectionHandler} 및 @ref{175a,,ElementDeclHandler} 콜백을 사용하여 필요한 정보를 수집할 수 있습니다. 문자 데이터는 짧더라도 덩어리로 묶일 수 있어서 @ref{3ea8,,CharacterDataHandler()}에 대한 호출을 여러 번 받을 수 있음에 유의하십시오. 이를 피하려면 @ref{16c7,,buffer_text} 인스턴스 어프리뷰트를 @code{True}로 설정하십시오.
@end deffn

@geindex UnparsedEntityDeclHandler() (xml.parsers.expat.xmlparser 메서드)
@anchor{library/pyexpat xml parsers expat xmlparser UnparsedEntityDeclHandler}@anchor{3e9c}
@deffn {메서드} xmlparser.UnparsedEntityDeclHandler (entityName, base, systemId, publicId, notationName)

구문 분석되지 않은 (NDATA) 엔티티 선언에 대해 호출됩니다. 이것은 Expat 라이브러리 1.2 버전에만 존재합니다; 최신 버전의 경우 @ref{3eb8,,EntityDeclHandler}를 대신 사용하십시오. (Expat 라이브러리의 하부 함수는 더는 사용되지 않는 것으로 선언되었습니다.)
@end deffn

@geindex EntityDeclHandler() (xml.parsers.expat.xmlparser 메서드)
@anchor{library/pyexpat xml parsers expat xmlparser EntityDeclHandler}@anchor{3eb8}
@deffn {메서드} xmlparser.EntityDeclHandler (entityName, is_parameter_entity, value, base, systemId, publicId, notationName)

모든 엔티티 선언에 대해 호출됩니다. 파라미터와 내부 엔티티의 경우, `value'는 엔티티의 선언된 내용을 제공하는 문자열입니다; 외부 엔티티의 경우 @code{None}이 됩니다. `notationName' 매개 변수는 구문 분석된 엔티티의 경우 @code{None}이고, 구문 분석되지 않은 엔티티의 경우는 표기법 이름입니다. 엔티티가 파라미터 엔티티인 경우 `is_parameter_entity'는 참이고, 일반 엔티티의 경우 거짓입니다 (대부분 응용 프로그램은 일반 엔티티만 고려하면 됩니다). Expat 라이브러리 버전 1.95.0부터 사용 가능합니다.
@end deffn

@geindex NotationDeclHandler() (xml.parsers.expat.xmlparser 메서드)
@anchor{library/pyexpat xml parsers expat xmlparser NotationDeclHandler}@anchor{3e9b}
@deffn {메서드} xmlparser.NotationDeclHandler (notationName, base, systemId, publicId)

표기법 선언에 대해 호출됩니다. `notationName', `base', `systemId' 및 `publicId'는 주어지면 문자열입니다. 공용 식별자를 생략하면, `publicId'는 @code{None}이 됩니다.
@end deffn

@geindex StartNamespaceDeclHandler() (xml.parsers.expat.xmlparser 메서드)
@anchor{library/pyexpat xml parsers expat xmlparser StartNamespaceDeclHandler}@anchor{3eb9}
@deffn {메서드} xmlparser.StartNamespaceDeclHandler (prefix, uri)

엘리먼트에 이름 공간 선언이 포함되어 있으면 호출됩니다. 이름 공간 선언은 선언이 배치된 엘리먼트에 대한 @ref{3eb3,,StartElementHandler} 가 호출되기 전에 처리됩니다.
@end deffn

@geindex EndNamespaceDeclHandler() (xml.parsers.expat.xmlparser 메서드)
@anchor{library/pyexpat xml parsers expat xmlparser EndNamespaceDeclHandler}@anchor{3eba}
@deffn {메서드} xmlparser.EndNamespaceDeclHandler (prefix)

이름 공간 선언이 포함된 엘리먼트에 대해 닫기 태그에 도달하면 호출됩니다. 이는 각 이름 공간 선언 스코프의 시작을 나타내기 위해 @ref{3eb9,,StartNamespaceDeclHandler} 가 호출된 순서와 반대로 엘리먼트의 각 이름 공간 선언에 대해 한 번씩 호출됩니다. 이 처리기에 대한 호출은 엘리먼트의 끝을 위한 해당 @ref{3eb4,,EndElementHandler} 이후에 수행됩니다.
@end deffn

@geindex CommentHandler() (xml.parsers.expat.xmlparser 메서드)
@anchor{library/pyexpat xml parsers expat xmlparser CommentHandler}@anchor{3ebb}
@deffn {메서드} xmlparser.CommentHandler (data)

주석에 대해 호출됩니다. `data'는 주석의 텍스트이며, 선행 @code{'<!-}@code{-'}와 후행 @code{'-}@code{->'}를 제외합니다.
@end deffn

@geindex StartCdataSectionHandler() (xml.parsers.expat.xmlparser 메서드)
@anchor{library/pyexpat xml parsers expat xmlparser StartCdataSectionHandler}@anchor{3eb6}
@deffn {메서드} xmlparser.StartCdataSectionHandler ()

CDATA 섹션의 시작에서 호출됩니다. CDATA 섹션의 구문적 시작과 종료를 식별할 수 있으려면 이것과 @ref{3eb7,,EndCdataSectionHandler} 가 필요합니다.
@end deffn

@geindex EndCdataSectionHandler() (xml.parsers.expat.xmlparser 메서드)
@anchor{library/pyexpat xml parsers expat xmlparser EndCdataSectionHandler}@anchor{3eb7}
@deffn {메서드} xmlparser.EndCdataSectionHandler ()

CDATA 섹션의 끝에서 호출됩니다.
@end deffn

@geindex DefaultHandler() (xml.parsers.expat.xmlparser 메서드)
@anchor{library/pyexpat xml parsers expat xmlparser DefaultHandler}@anchor{3ebc}
@deffn {메서드} xmlparser.DefaultHandler (data)

적용 가능한 처리기가 지정되지 않은 XML 문서의 모든 문자에 대해 호출됩니다. 이것은 보고될 수 있지만, 처리기가 제공되지 않은 구성의 일부인 문자를 의미합니다.
@end deffn

@geindex DefaultHandlerExpand() (xml.parsers.expat.xmlparser 메서드)
@anchor{library/pyexpat xml parsers expat xmlparser DefaultHandlerExpand}@anchor{3ebd}
@deffn {메서드} xmlparser.DefaultHandlerExpand (data)

이것은 @ref{3ebc,,DefaultHandler()}와 같지만, 내부 엔티티의 확장을 막지 않습니다. 엔티티 참조는 기본 처리기로 전달되지 않습니다.
@end deffn

@geindex NotStandaloneHandler() (xml.parsers.expat.xmlparser 메서드)
@anchor{library/pyexpat xml parsers expat xmlparser NotStandaloneHandler}@anchor{3ebe}
@deffn {메서드} xmlparser.NotStandaloneHandler ()

XML 문서가 독립형 문서로 선언되지 않은 경우 호출됩니다. 외부 부분 집합이나 파라미터 엔티티에 대한 참조가 있지만, XML 선언에서 XML 선언이 standalone을 @code{yes}로 설정하지 않은 경우에 발생합니다. 이 처리기가 @code{0}을 반환하면, 구문 분석기는 @code{XML_ERROR_NOT_STANDALONE} 에러를 발생시킵니다. 이 처리기가 설정되지 않으면, 이 조건에 대해 구문 분석기가 예외를 발생시키지 않습니다.
@end deffn

@geindex ExternalEntityRefHandler() (xml.parsers.expat.xmlparser 메서드)
@anchor{library/pyexpat xml parsers expat xmlparser ExternalEntityRefHandler}@anchor{3e9a}
@deffn {메서드} xmlparser.ExternalEntityRefHandler (context, base, systemId, publicId)

@cartouche
@quotation 경고 
Implementing a handler that accesses local files and/or the network
may create a vulnerability to
external entity attacks@footnote{https://en.wikipedia.org/wiki/XML_external_entity_attack}
if @code{xmlparser} is used with user-provided XML content.
Please reflect on your threat model@footnote{https://en.wikipedia.org/wiki/Threat_model}
before implementing this handler.
@end quotation
@end cartouche

외부 엔티티에 대한 참조에 대해 호출됩니다. `base'는 @ref{3e99,,SetBase()}에 대한 이전 호출에서 설정한 현재 베이스입니다. 공용과 시스템 식별자, `systemId' 및 `publicId'는 지정되면 문자열입니다; 공용 식별자가 제공되지 않으면 `publicId'는 @code{None}이 됩니다. `context' 값은 불투명하며 아래 설명된 대로만 사용해야 합니다.

외부 엔티티를 구문 분석하려면, 이 처리기를 구현해야 합니다. @code{ExternalEntityParserCreate(context)}를 사용하여 서브 구문 분석기를 만들고, 적절한 콜백으로 초기화하고, 엔티티를 구문 분석해야 합니다. 이 처리기는 정수를 반환해야 합니다; @code{0}을 반환하면, 구문 분석기는 @code{XML_ERROR_EXTERNAL_ENTITY_HANDLING} 에러를 발생시키고, 그렇지 않으면 구문 분석이 계속됩니다.

이 처리기가 제공되지 않으면, 외부 엔티티는 제공된다면 @ref{3ebc,,DefaultHandler} 콜백에 의해 보고됩니다.
@end deffn

@node ExpatError 예외,예<10>,XMLParser 객체<2>,xml parsers expat — Expat을 사용한 빠른 XML 구문 분석
@anchor{library/pyexpat expaterror-exceptions}@anchor{3ebf}@anchor{library/pyexpat expaterror-objects}@anchor{3e90}
@subsubsection ExpatError 예외


@ref{147d,,ExpatError} 예외에는 여러 가지 흥미로운 어트리뷰트가 있습니다:

@geindex code (xml.parsers.expat.ExpatError의 속성)
@anchor{library/pyexpat xml parsers expat ExpatError code}@anchor{3ec0}
@deffn {속성} ExpatError.code

특정 에러에 대한 Expat의 내부 에러 번호. @ref{3ec1,,errors.messages} 딕셔너리는 이러한 에러 번호를 Expat의 에러 메시지에 매핑합니다. 예를 들면:

@example
from xml.parsers.expat import ParserCreate, ExpatError, errors

p = ParserCreate()
try:
    p.Parse(some_xml_document)
except ExpatError as err:
    print("Error:", errors.messages[err.code])
@end example

@ref{12d,,errors} 모듈은 에러 메시지 상수와 이러한 메시지를 에러 코드로 역 매핑하는 딕셔너리 @ref{3ec2,,codes}도 제공합니다, 아래를 참조하십시오.
@end deffn

@geindex lineno (xml.parsers.expat.ExpatError의 속성)
@anchor{library/pyexpat xml parsers expat ExpatError lineno}@anchor{3ea5}
@deffn {속성} ExpatError.lineno

에러가 감지된 줄 번호. 첫 번째 줄은 @code{1}로 번호가 매겨집니다.
@end deffn

@geindex offset (xml.parsers.expat.ExpatError의 속성)
@anchor{library/pyexpat xml parsers expat ExpatError offset}@anchor{3ea6}
@deffn {속성} ExpatError.offset

에러가 발생한 줄에서의 문자 오프셋. 첫 번째 열의 번호는 @code{0}입니다.
@end deffn

@node 예<10>,콘텐츠 모델 기술,ExpatError 예외,xml parsers expat — Expat을 사용한 빠른 XML 구문 분석
@anchor{library/pyexpat example}@anchor{3ec3}@anchor{library/pyexpat expat-example}@anchor{3ec4}
@subsubsection 예


다음 프로그램은 인자를 출력하기만 하는 세 개의 처리기를 정의합니다.

@example
import xml.parsers.expat

# 3개의 처리기 함수
def start_element(name, attrs):
    print('Start element:', name, attrs)
def end_element(name):
    print('End element:', name)
def char_data(data):
    print('Character data:', repr(data))

p = xml.parsers.expat.ParserCreate()

p.StartElementHandler = start_element
p.EndElementHandler = end_element
p.CharacterDataHandler = char_data

p.Parse("""<?xml version="1.0"?>
<parent id="top"><child1 name="paul">Text goes here</child1>
<child2 name="fred">More text</child2>
</parent>""", 1)
@end example

이 프로그램의 출력은 다음과 같습니다:

@example
Start element: parent @{'id': 'top'@}
Start element: child1 @{'name': 'paul'@}
Character data: 'Text goes here'
End element: child1
Character data: '\n'
Start element: child2 @{'name': 'fred'@}
Character data: 'More text'
End element: child2
Character data: '\n'
End element: parent
@end example

@node 콘텐츠 모델 기술,Expat 에러 상수,예<10>,xml parsers expat — Expat을 사용한 빠른 XML 구문 분석
@anchor{library/pyexpat content-model-descriptions}@anchor{3ec5}@anchor{library/pyexpat expat-content-models}@anchor{3ec6}@anchor{library/pyexpat module-xml parsers expat model}@anchor{12e}
@subsubsection 콘텐츠 모델 기술


@geindex module; xml.parsers.expat.model

콘텐츠 모델은 중첩된 튜플을 사용하여 기술됩니다. 각 튜플에는 네 가지 값이 있습니다: 형, 수량 지정자(quantifier), 이름 및 자식 튜플. 자식은 단순히 추가의 콘텐츠 모델 기술입니다.

The values of the first two fields are constants defined in the
@code{xml.parsers.expat.model} module.  These constants can be collected in two
groups: the model type group and the quantifier group.

모델 형 그룹의 상수는 다음과 같습니다:


@deffn {데이터} xml.parsers.expat.model.XML_CTYPE_ANY

모델 이름으로 명명된 엘리먼트가 콘텐츠 모델 @code{ANY}를 갖도록 선언되었습니다.
@end deffn


@deffn {데이터} xml.parsers.expat.model.XML_CTYPE_CHOICE

명명된 엘리먼트가 여러 옵션 중에서 선택할 수 있도록 합니다; 이것은 @code{(A | B | C)}와 같은 콘텐츠 모델에 사용됩니다.
@end deffn


@deffn {데이터} xml.parsers.expat.model.XML_CTYPE_EMPTY

@code{EMPTY}로 선언된 엘리먼트는 이 모델 형을 갖습니다.
@end deffn


@deffn {데이터} xml.parsers.expat.model.XML_CTYPE_MIXED
@end deffn


@deffn {데이터} xml.parsers.expat.model.XML_CTYPE_NAME
@end deffn


@deffn {데이터} xml.parsers.expat.model.XML_CTYPE_SEQ

일련의 모델이 차례로 나타나는 모델은 이 모델 형으로 표시됩니다. @code{(A, B, C)}와 같은 모델에 사용됩니다.
@end deffn

수량 지정자 그룹의 상수는 다음과 같습니다:


@deffn {데이터} xml.parsers.expat.model.XML_CQUANT_NONE

수정자가 제공되지 않아서, @code{A}와 같이, 정확히 한 번만 나타날 수 있습니다.
@end deffn


@deffn {데이터} xml.parsers.expat.model.XML_CQUANT_OPT

모델은 선택적입니다: @code{A?} 와 같이, 한 번만 나타나거나 전혀 나타나지 않을 수 있습니다.
@end deffn


@deffn {데이터} xml.parsers.expat.model.XML_CQUANT_PLUS

모델은 한 번 이상 발생해야 합니다 (@code{A+}처럼).
@end deffn


@deffn {데이터} xml.parsers.expat.model.XML_CQUANT_REP

@code{A*}와 같이, 모델은 0번 이상 나타나야 합니다.
@end deffn

@node Expat 에러 상수,,콘텐츠 모델 기술,xml parsers expat — Expat을 사용한 빠른 XML 구문 분석
@anchor{library/pyexpat expat-error-constants}@anchor{3ec7}@anchor{library/pyexpat expat-errors}@anchor{3ec8}@anchor{library/pyexpat module-xml parsers expat errors}@anchor{12d}
@subsubsection Expat 에러 상수


@geindex module; xml.parsers.expat.errors

The following constants are provided in the @code{xml.parsers.expat.errors}
module.  These constants are useful in interpreting some of the attributes of
the @code{ExpatError} exception objects raised when an error has occurred.
Since for backwards compatibility reasons, the constants’ value is the error
`message' and not the numeric error `code', you do this by comparing its
@ref{1b,,code} attribute with
@code{errors.codes[errors.XML_ERROR_@var{CONSTANT_NAME}]}.

@code{errors} 모듈에는 다음과 같은 어트리뷰트가 있습니다:

@geindex codes (xml.parsers.expat.errors 모듈)
@anchor{library/pyexpat xml parsers expat errors codes}@anchor{3ec2}
@deffn {데이터} xml.parsers.expat.errors.codes

문자열 설명을 에러 코드에 매핑하는 딕셔너리.


Added in version 3.2.

@end deffn

@geindex messages (xml.parsers.expat.errors 모듈)
@anchor{library/pyexpat xml parsers expat errors messages}@anchor{3ec1}
@deffn {데이터} xml.parsers.expat.errors.messages

숫자 에러 코드를 문자열 설명에 매핑하는 딕셔너리.


Added in version 3.2.

@end deffn

@geindex XML_ERROR_ASYNC_ENTITY (xml.parsers.expat.errors 모듈)
@anchor{library/pyexpat xml parsers expat errors XML_ERROR_ASYNC_ENTITY}@anchor{3ec9}
@deffn {데이터} xml.parsers.expat.errors.XML_ERROR_ASYNC_ENTITY
@end deffn

@geindex XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF (xml.parsers.expat.errors 모듈)
@anchor{library/pyexpat xml parsers expat errors XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF}@anchor{3eca}
@deffn {데이터} xml.parsers.expat.errors.XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF

어트리뷰트 값의 엔티티 참조가 내부 엔티티 대신 외부 엔티티를 참조합니다.
@end deffn

@geindex XML_ERROR_BAD_CHAR_REF (xml.parsers.expat.errors 모듈)
@anchor{library/pyexpat xml parsers expat errors XML_ERROR_BAD_CHAR_REF}@anchor{3ecb}
@deffn {데이터} xml.parsers.expat.errors.XML_ERROR_BAD_CHAR_REF

문자 참조가 XML에서 잘못된 문자를 가리킵니다 (예를 들어, 문자 @code{0} 또는 ‘@code{&#0;}’).
@end deffn

@geindex XML_ERROR_BINARY_ENTITY_REF (xml.parsers.expat.errors 모듈)
@anchor{library/pyexpat xml parsers expat errors XML_ERROR_BINARY_ENTITY_REF}@anchor{3ecc}
@deffn {데이터} xml.parsers.expat.errors.XML_ERROR_BINARY_ENTITY_REF

엔티티 참조가 표기법으로 선언된 엔티티를 참조해서, 구문 분석할 수 없습니다.
@end deffn

@geindex XML_ERROR_DUPLICATE_ATTRIBUTE (xml.parsers.expat.errors 모듈)
@anchor{library/pyexpat xml parsers expat errors XML_ERROR_DUPLICATE_ATTRIBUTE}@anchor{3ecd}
@deffn {데이터} xml.parsers.expat.errors.XML_ERROR_DUPLICATE_ATTRIBUTE

시작 태그에서 어트리뷰트가 두 번 이상 사용되었습니다.
@end deffn

@geindex XML_ERROR_INCORRECT_ENCODING (xml.parsers.expat.errors 모듈)
@anchor{library/pyexpat xml parsers expat errors XML_ERROR_INCORRECT_ENCODING}@anchor{3ece}
@deffn {데이터} xml.parsers.expat.errors.XML_ERROR_INCORRECT_ENCODING
@end deffn

@geindex XML_ERROR_INVALID_TOKEN (xml.parsers.expat.errors 모듈)
@anchor{library/pyexpat xml parsers expat errors XML_ERROR_INVALID_TOKEN}@anchor{3ecf}
@deffn {데이터} xml.parsers.expat.errors.XML_ERROR_INVALID_TOKEN

입력 바이트를 문자에 올바르게 대입할 수 없을 때 발생합니다; 예를 들어, UTF-8 입력 스트림의 NUL 바이트(값 @code{0}).
@end deffn

@geindex XML_ERROR_JUNK_AFTER_DOC_ELEMENT (xml.parsers.expat.errors 모듈)
@anchor{library/pyexpat xml parsers expat errors XML_ERROR_JUNK_AFTER_DOC_ELEMENT}@anchor{3ed0}
@deffn {데이터} xml.parsers.expat.errors.XML_ERROR_JUNK_AFTER_DOC_ELEMENT

문서 엘리먼트 다음에 공백 이외의 것이 나타났습니다.
@end deffn

@geindex XML_ERROR_MISPLACED_XML_PI (xml.parsers.expat.errors 모듈)
@anchor{library/pyexpat xml parsers expat errors XML_ERROR_MISPLACED_XML_PI}@anchor{3ed1}
@deffn {데이터} xml.parsers.expat.errors.XML_ERROR_MISPLACED_XML_PI

입력 데이터의 시작 이외의 곳에서 XML 선언이 발견되었습니다.
@end deffn

@geindex XML_ERROR_NO_ELEMENTS (xml.parsers.expat.errors 모듈)
@anchor{library/pyexpat xml parsers expat errors XML_ERROR_NO_ELEMENTS}@anchor{3ed2}
@deffn {데이터} xml.parsers.expat.errors.XML_ERROR_NO_ELEMENTS

문서에 엘리먼트가 없습니다 (XML은 모든 문서에 정확히 하나의 최상위 엘리먼트가 포함되어야 함을 요구합니다).
@end deffn

@geindex XML_ERROR_NO_MEMORY (xml.parsers.expat.errors 모듈)
@anchor{library/pyexpat xml parsers expat errors XML_ERROR_NO_MEMORY}@anchor{3ed3}
@deffn {데이터} xml.parsers.expat.errors.XML_ERROR_NO_MEMORY

Expat이 내부적으로 메모리를 할당하지 못했습니다.
@end deffn

@geindex XML_ERROR_PARAM_ENTITY_REF (xml.parsers.expat.errors 모듈)
@anchor{library/pyexpat xml parsers expat errors XML_ERROR_PARAM_ENTITY_REF}@anchor{3ed4}
@deffn {데이터} xml.parsers.expat.errors.XML_ERROR_PARAM_ENTITY_REF

파라미터 엔티티 참조가 허용되지 않는 위치에서 발견되었습니다.
@end deffn

@geindex XML_ERROR_PARTIAL_CHAR (xml.parsers.expat.errors 모듈)
@anchor{library/pyexpat xml parsers expat errors XML_ERROR_PARTIAL_CHAR}@anchor{3ed5}
@deffn {데이터} xml.parsers.expat.errors.XML_ERROR_PARTIAL_CHAR

입력에서 불완전한 문자가 발견되었습니다.
@end deffn

@geindex XML_ERROR_RECURSIVE_ENTITY_REF (xml.parsers.expat.errors 모듈)
@anchor{library/pyexpat xml parsers expat errors XML_ERROR_RECURSIVE_ENTITY_REF}@anchor{3ed6}
@deffn {데이터} xml.parsers.expat.errors.XML_ERROR_RECURSIVE_ENTITY_REF

엔티티 참조가 같은 엔티티에 대한 다른 참조를 포함합니다; 어쩌면 다른 이름을 통해서, 그리고 어쩌면 간접적으로.
@end deffn

@geindex XML_ERROR_SYNTAX (xml.parsers.expat.errors 모듈)
@anchor{library/pyexpat xml parsers expat errors XML_ERROR_SYNTAX}@anchor{3ed7}
@deffn {데이터} xml.parsers.expat.errors.XML_ERROR_SYNTAX

지정되지 않은 구문 에러를 만났습니다.
@end deffn

@geindex XML_ERROR_TAG_MISMATCH (xml.parsers.expat.errors 모듈)
@anchor{library/pyexpat xml parsers expat errors XML_ERROR_TAG_MISMATCH}@anchor{3ed8}
@deffn {데이터} xml.parsers.expat.errors.XML_ERROR_TAG_MISMATCH

종료 태그가 가장 안쪽에 있는 시작 태그와 일치하지 않습니다.
@end deffn

@geindex XML_ERROR_UNCLOSED_TOKEN (xml.parsers.expat.errors 모듈)
@anchor{library/pyexpat xml parsers expat errors XML_ERROR_UNCLOSED_TOKEN}@anchor{3ed9}
@deffn {데이터} xml.parsers.expat.errors.XML_ERROR_UNCLOSED_TOKEN

어떤 토큰이 (가령 시작 태그) 스트림이 끝나기 전에 닫히지 않았거나 다음 토큰을 만났습니다.
@end deffn

@geindex XML_ERROR_UNDEFINED_ENTITY (xml.parsers.expat.errors 모듈)
@anchor{library/pyexpat xml parsers expat errors XML_ERROR_UNDEFINED_ENTITY}@anchor{3eda}
@deffn {데이터} xml.parsers.expat.errors.XML_ERROR_UNDEFINED_ENTITY

정의되지 않은 엔티티를 참조했습니다.
@end deffn

@geindex XML_ERROR_UNKNOWN_ENCODING (xml.parsers.expat.errors 모듈)
@anchor{library/pyexpat xml parsers expat errors XML_ERROR_UNKNOWN_ENCODING}@anchor{3edb}
@deffn {데이터} xml.parsers.expat.errors.XML_ERROR_UNKNOWN_ENCODING

문서 인코딩을 Expat에서 지원하지 않습니다.
@end deffn

@geindex XML_ERROR_UNCLOSED_CDATA_SECTION (xml.parsers.expat.errors 모듈)
@anchor{library/pyexpat xml parsers expat errors XML_ERROR_UNCLOSED_CDATA_SECTION}@anchor{3edc}
@deffn {데이터} xml.parsers.expat.errors.XML_ERROR_UNCLOSED_CDATA_SECTION

CDATA 표시 섹션이 닫히지 않았습니다.
@end deffn

@geindex XML_ERROR_EXTERNAL_ENTITY_HANDLING (xml.parsers.expat.errors 모듈)
@anchor{library/pyexpat xml parsers expat errors XML_ERROR_EXTERNAL_ENTITY_HANDLING}@anchor{3edd}
@deffn {데이터} xml.parsers.expat.errors.XML_ERROR_EXTERNAL_ENTITY_HANDLING
@end deffn

@geindex XML_ERROR_NOT_STANDALONE (xml.parsers.expat.errors 모듈)
@anchor{library/pyexpat xml parsers expat errors XML_ERROR_NOT_STANDALONE}@anchor{3ede}
@deffn {데이터} xml.parsers.expat.errors.XML_ERROR_NOT_STANDALONE

문서가 XML 선언에서 자신을 “독립형”으로 선언했지만 구문 분석기가 독립형이 아니라고 결정했으며 @code{NotStandaloneHandler} 가 설정되고 @code{0}을 반환했습니다.
@end deffn

@geindex XML_ERROR_UNEXPECTED_STATE (xml.parsers.expat.errors 모듈)
@anchor{library/pyexpat xml parsers expat errors XML_ERROR_UNEXPECTED_STATE}@anchor{3edf}
@deffn {데이터} xml.parsers.expat.errors.XML_ERROR_UNEXPECTED_STATE
@end deffn

@geindex XML_ERROR_ENTITY_DECLARED_IN_PE (xml.parsers.expat.errors 모듈)
@anchor{library/pyexpat xml parsers expat errors XML_ERROR_ENTITY_DECLARED_IN_PE}@anchor{3ee0}
@deffn {데이터} xml.parsers.expat.errors.XML_ERROR_ENTITY_DECLARED_IN_PE
@end deffn

@geindex XML_ERROR_FEATURE_REQUIRES_XML_DTD (xml.parsers.expat.errors 모듈)
@anchor{library/pyexpat xml parsers expat errors XML_ERROR_FEATURE_REQUIRES_XML_DTD}@anchor{3ee1}
@deffn {데이터} xml.parsers.expat.errors.XML_ERROR_FEATURE_REQUIRES_XML_DTD

An operation was requested that requires DTD support to be compiled in, but
Expat was configured without DTD support.  This should never be reported by a
standard build of the @code{xml.parsers.expat} module.
@end deffn

@geindex XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING (xml.parsers.expat.errors 모듈)
@anchor{library/pyexpat xml parsers expat errors XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING}@anchor{3ee2}
@deffn {데이터} xml.parsers.expat.errors.XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING

구문 분석이 시작된 후에 구문 분석이 시작되기 전에만 변경할 수 있는 동작 변경이 요청되었습니다. 이것은 (현재) @code{UseForeignDTD()}에 의해서만 발생합니다.
@end deffn

@geindex XML_ERROR_UNBOUND_PREFIX (xml.parsers.expat.errors 모듈)
@anchor{library/pyexpat xml parsers expat errors XML_ERROR_UNBOUND_PREFIX}@anchor{3ee3}
@deffn {데이터} xml.parsers.expat.errors.XML_ERROR_UNBOUND_PREFIX

이름 공간 처리가 활성화되었을 때 선언되지 않은 접두사가 발견되었습니다.
@end deffn

@geindex XML_ERROR_UNDECLARING_PREFIX (xml.parsers.expat.errors 모듈)
@anchor{library/pyexpat xml parsers expat errors XML_ERROR_UNDECLARING_PREFIX}@anchor{3ee4}
@deffn {데이터} xml.parsers.expat.errors.XML_ERROR_UNDECLARING_PREFIX

문서가 접두사와 연관된 이름 공간 선언을 제거하려고 했습니다.
@end deffn

@geindex XML_ERROR_INCOMPLETE_PE (xml.parsers.expat.errors 모듈)
@anchor{library/pyexpat xml parsers expat errors XML_ERROR_INCOMPLETE_PE}@anchor{3ee5}
@deffn {데이터} xml.parsers.expat.errors.XML_ERROR_INCOMPLETE_PE

파라미터 엔티티에 불완전한 마크업이 포함되어 있습니다.
@end deffn

@geindex XML_ERROR_XML_DECL (xml.parsers.expat.errors 모듈)
@anchor{library/pyexpat xml parsers expat errors XML_ERROR_XML_DECL}@anchor{3ee6}
@deffn {데이터} xml.parsers.expat.errors.XML_ERROR_XML_DECL

문서에 문서 엘리먼트가 전혀 없습니다.
@end deffn

@geindex XML_ERROR_TEXT_DECL (xml.parsers.expat.errors 모듈)
@anchor{library/pyexpat xml parsers expat errors XML_ERROR_TEXT_DECL}@anchor{3ee7}
@deffn {데이터} xml.parsers.expat.errors.XML_ERROR_TEXT_DECL

외부 엔티티에 있는 텍스트 선언을 구문 분석하는 중 에러가 발생했습니다.
@end deffn

@geindex XML_ERROR_PUBLICID (xml.parsers.expat.errors 모듈)
@anchor{library/pyexpat xml parsers expat errors XML_ERROR_PUBLICID}@anchor{3ee8}
@deffn {데이터} xml.parsers.expat.errors.XML_ERROR_PUBLICID

허용되지 않는 문자가 공용 id에서 발견되었습니다.
@end deffn

@geindex XML_ERROR_SUSPENDED (xml.parsers.expat.errors 모듈)
@anchor{library/pyexpat xml parsers expat errors XML_ERROR_SUSPENDED}@anchor{3ee9}
@deffn {데이터} xml.parsers.expat.errors.XML_ERROR_SUSPENDED

일시 중지된 구문 분석기에 작업이 요청되었지만, 허용되지 않습니다. 여기에는 추가 입력을 제공하거나 구문 분석기를 중지하려는 시도가 포함됩니다.
@end deffn

@geindex XML_ERROR_NOT_SUSPENDED (xml.parsers.expat.errors 모듈)
@anchor{library/pyexpat xml parsers expat errors XML_ERROR_NOT_SUSPENDED}@anchor{3eea}
@deffn {데이터} xml.parsers.expat.errors.XML_ERROR_NOT_SUSPENDED

구문 분석기가 일시 중지되지 않았을 때 구문 분석기를 재개하려고 했습니다.
@end deffn

@geindex XML_ERROR_ABORTED (xml.parsers.expat.errors 모듈)
@anchor{library/pyexpat xml parsers expat errors XML_ERROR_ABORTED}@anchor{3eeb}
@deffn {데이터} xml.parsers.expat.errors.XML_ERROR_ABORTED

이것은 파이썬 응용 프로그램에 보고되어서는 안 됩니다.
@end deffn

@geindex XML_ERROR_FINISHED (xml.parsers.expat.errors 모듈)
@anchor{library/pyexpat xml parsers expat errors XML_ERROR_FINISHED}@anchor{3eec}
@deffn {데이터} xml.parsers.expat.errors.XML_ERROR_FINISHED

입력을 구문 분석하는 것을 종료한 구문 분석기에 작업을 요청했지만, 허용되지 않습니다. 여기에는 추가 입력을 제공하거나 구문 분석기를 중지하려는 시도가 포함됩니다.
@end deffn

@geindex XML_ERROR_SUSPEND_PE (xml.parsers.expat.errors 모듈)
@anchor{library/pyexpat xml parsers expat errors XML_ERROR_SUSPEND_PE}@anchor{3eed}
@deffn {데이터} xml.parsers.expat.errors.XML_ERROR_SUSPEND_PE
@end deffn

@geindex XML_ERROR_RESERVED_PREFIX_XML (xml.parsers.expat.errors 모듈)
@anchor{library/pyexpat xml parsers expat errors XML_ERROR_RESERVED_PREFIX_XML}@anchor{3eee}
@deffn {데이터} xml.parsers.expat.errors.XML_ERROR_RESERVED_PREFIX_XML

An attempt was made to
undeclare reserved namespace prefix @code{xml}
or to bind it to another namespace URI.
@end deffn

@geindex XML_ERROR_RESERVED_PREFIX_XMLNS (xml.parsers.expat.errors 모듈)
@anchor{library/pyexpat xml parsers expat errors XML_ERROR_RESERVED_PREFIX_XMLNS}@anchor{3eef}
@deffn {데이터} xml.parsers.expat.errors.XML_ERROR_RESERVED_PREFIX_XMLNS

An attempt was made to declare or undeclare reserved namespace prefix @code{xmlns}.
@end deffn

@geindex XML_ERROR_RESERVED_NAMESPACE_URI (xml.parsers.expat.errors 모듈)
@anchor{library/pyexpat xml parsers expat errors XML_ERROR_RESERVED_NAMESPACE_URI}@anchor{3ef0}
@deffn {데이터} xml.parsers.expat.errors.XML_ERROR_RESERVED_NAMESPACE_URI

An attempt was made to bind the URI of one the reserved namespace
prefixes @code{xml} and @code{xmlns} to another namespace prefix.
@end deffn

@geindex XML_ERROR_INVALID_ARGUMENT (xml.parsers.expat.errors 모듈)
@anchor{library/pyexpat xml parsers expat errors XML_ERROR_INVALID_ARGUMENT}@anchor{3ef1}
@deffn {데이터} xml.parsers.expat.errors.XML_ERROR_INVALID_ARGUMENT

이것은 파이썬 응용 프로그램에 보고되어서는 안 됩니다.
@end deffn

@geindex XML_ERROR_NO_BUFFER (xml.parsers.expat.errors 모듈)
@anchor{library/pyexpat xml parsers expat errors XML_ERROR_NO_BUFFER}@anchor{3ef2}
@deffn {데이터} xml.parsers.expat.errors.XML_ERROR_NO_BUFFER

이것은 파이썬 응용 프로그램에 보고되어서는 안 됩니다.
@end deffn

@geindex XML_ERROR_AMPLIFICATION_LIMIT_BREACH (xml.parsers.expat.errors 모듈)
@anchor{library/pyexpat xml parsers expat errors XML_ERROR_AMPLIFICATION_LIMIT_BREACH}@anchor{3ef3}
@deffn {데이터} xml.parsers.expat.errors.XML_ERROR_AMPLIFICATION_LIMIT_BREACH

The limit on input amplification factor (from DTD and entities)
has been breached.
@end deffn

@geindex XML_ERROR_NOT_STARTED (xml.parsers.expat.errors 모듈)
@anchor{library/pyexpat xml parsers expat errors XML_ERROR_NOT_STARTED}@anchor{18d4}
@deffn {데이터} xml.parsers.expat.errors.XML_ERROR_NOT_STARTED

The parser was tried to be stopped or suspended before it started.


Added in version 3.14.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 인터넷 프로토콜과 지원,멀티미디어 서비스,구조화된 마크업 처리 도구,파이썬 표준 라이브러리
@anchor{library/internet doc}@anchor{3ef4}@anchor{library/internet internet}@anchor{3ef5}@anchor{library/internet internet-protocols-and-support}@anchor{3ef6}@anchor{library/internet translation-repo}@anchor{3ef7}
@section 인터넷 프로토콜과 지원


@geindex WWW
@geindex 인터넷
@geindex 월드 와이드 웹

@geindex 모듈;소켓

이 장에서 설명하는 모듈은 인터넷 프로토콜을 구현하고 관련 기술을 지원합니다. 모두 파이썬으로 구현됩니다. 대부분 모듈은 시스템 의존적인 모듈 @ref{d1,,socket}을 요구하는데, 현재 대부분의 대중적인 플랫폼에서 지원됩니다. 다음은 개요입니다:

@menu
* webbrowser — 편리한 웹 브라우저 제어기:: 
* wsgiref — WSGI 유틸리티와 참조 구현:: 
* urllib — URL 처리 모듈:: 
* urllib.request — URL을 열기 위한 확장 가능한 라이브러리: urllib request — URL을 열기 위한 확장 가능한 라이브러리. 
* urllib.response — Response classes used by urllib: urllib response — Response classes used by urllib. 
* urllib.parse — URL을 구성 요소로 구문 분석: urllib parse — URL을 구성 요소로 구문 분석. 
* urllib.error — urllib.request에 의해 발생하는 예외 클래스: urllib error — urllib request에 의해 발생하는 예외 클래스. 
* urllib.robotparser — robots.txt 구문 분석기: urllib robotparser — robots txt 구문 분석기. 
* http — HTTP 모듈:: 
* http.client — HTTP 프로토콜 클라이언트: http client — HTTP 프로토콜 클라이언트. 
* ftplib — FTP 프로토콜 클라이언트:: 
* poplib — POP3 프로토콜 클라이언트:: 
* imaplib — IMAP4 프로토콜 클라이언트:: 
* smtplib — SMTP 프로토콜 클라이언트:: 
* uuid — UUID objects according to RFC 9562:: 
* socketserver — 네트워크 서버를 위한 프레임워크:: 
* http.server — HTTP 서버: http server — HTTP 서버. 
* http.cookies — HTTP 상태 관리: http cookies — HTTP 상태 관리. 
* http.cookiejar — HTTP 클라이언트를 위한 쿠키 처리: http cookiejar — HTTP 클라이언트를 위한 쿠키 처리. 
* xmlrpc — XMLRPC 서버와 클라이언트 모듈:: 
* xmlrpc.client — XML-RPC 클라이언트 액세스: xmlrpc client — XML-RPC 클라이언트 액세스. 
* xmlrpc.server — 기본 XML-RPC 서버: xmlrpc server — 기본 XML-RPC 서버. 
* ipaddress — IPv4/IPv6 조작 라이브러리:: 

@end menu

@node webbrowser — 편리한 웹 브라우저 제어기,wsgiref — WSGI 유틸리티와 참조 구현,,인터넷 프로토콜과 지원
@anchor{library/webbrowser doc}@anchor{3ef8}@anchor{library/webbrowser module-webbrowser}@anchor{11b}@anchor{library/webbrowser webbrowser-convenient-web-browser-controller}@anchor{3ef9}
@subsection @code{webbrowser} — 편리한 웹 브라우저 제어기


@geindex module; webbrowser

`소스 코드:' Lib/webbrowser.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/webbrowser.py}


__________________________________________________________________


The @code{webbrowser} module provides a high-level interface to allow displaying
web-based documents to users. Under most circumstances, simply calling the
@ref{175d,,open()} function from this module will do the right thing.

유닉스에서, X11에서는 그래픽 브라우저가 선호되지만, 그래픽 브라우저를 사용할 수 없거나 X11 디스플레이를 사용할 수 없으면 텍스트 모드 브라우저가 사용됩니다. 텍스트 모드 브라우저가 사용되면, 사용자가 브라우저를 종료할 때까지 호출하는 프로세스가 블록 됩니다.

If the environment variable 
@geindex BROWSER
@geindex 환경 변수; BROWSER
@code{BROWSER} exists, it is interpreted as the
@ref{2131,,os.pathsep}-separated list of browsers to try ahead of the platform
defaults.  When the value of a list part contains the string @code{%s}, then it is
interpreted as a literal browser command line to be used with the argument URL
substituted for @code{%s}; if the value is a single word that refers to one of the
already registered browsers this browser is added to the front of the search list;
if the part does not contain @code{%s}, it is simply interpreted as the name of the
browser to launch. @footnote{
전체 경로 없이 여기에서 명명된 실행 파일은 
@geindex PATH
@geindex 환경 변수; PATH
@code{PATH} 환경 변수에 지정된 디렉터리에서 검색됩니다.
}


버전 3.14에서 변경: The 
@geindex BROWSER
@geindex 환경 변수; BROWSER
@code{BROWSER} variable can now also be used to reorder the list of
platform defaults. This is particularly useful on macOS where the platform
defaults do not refer to command-line tools on 
@geindex PATH
@geindex 환경 변수; PATH
@code{PATH}.


유닉스가 아닌 플랫폼에서, 또는 유닉스에서 원격 브라우저를 사용할 수 있을 때, 제어하는 프로세스는 사용자가 브라우저를 완료할 때까지 기다리지 않고, 원격 브라우저가 디스플레이에 자체 창을 유지하도록 허용합니다. 유닉스에서 원격 브라우저를 사용할 수 없으면, 제어하는 프로세스가 새 브라우저를 시작하고 기다랍니다.

On iOS, the 
@geindex BROWSER
@geindex 환경 변수; BROWSER
@code{BROWSER} environment variable, as well as any arguments
controlling autoraise, browser preference, and new tab/window creation will be
ignored. Web pages will `always' be opened in the user’s preferred browser, in
a new tab, with the browser being brought to the foreground. The use of the
@code{webbrowser} module on iOS requires the @ref{2e,,ctypes} module. If
@code{ctypes} isn’t available, calls to @ref{175d,,open()} will fail.

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

@end menu

@node Command-line interface<6>,Browser controller objects,,webbrowser — 편리한 웹 브라우저 제어기
@anchor{library/webbrowser command-line-interface}@anchor{3efa}@anchor{library/webbrowser webbrowser-cli}@anchor{3efb}
@subsubsection Command-line interface


스크립트 @code{webbrowser}는 모듈의 명령 줄 인터페이스로 사용될 수 있습니다. 인자로 URL을 받아들입니다. 다음과 같은 선택적 매개 변수를 받아들입니다:

@geindex webbrowser 명령줄 옵션; -n
@geindex webbrowser 명령줄 옵션; --new-window
@anchor{library/webbrowser cmdoption-webbrowser-n}@anchor{3efc}@anchor{library/webbrowser cmdoption-webbrowser-new-window}@anchor{3efd}
@deffn {Option} @w{-}n, @w{-}@w{-}new@w{-}window

가능하다면 새 브라우저 창에서 URL을 엽니다.
@end deffn

@geindex webbrowser 명령줄 옵션; -t
@geindex webbrowser 명령줄 옵션; --new-tab
@anchor{library/webbrowser cmdoption-webbrowser-t}@anchor{3efe}@anchor{library/webbrowser cmdoption-webbrowser-new-tab}@anchor{3eff}
@deffn {Option} @w{-}t, @w{-}@w{-}new@w{-}tab

새 브라우저 탭에서 URL을 엽니다.
@end deffn

당연히, 이 옵션들은 상호 배타적입니다. 사용 예:

@example
python -m webbrowser -t "https://www.python.org"
@end example

@ref{213c,,가용성}: not WASI, not Android.

다음 예외가 정의됩니다:

@geindex Error
@anchor{library/webbrowser webbrowser Error}@anchor{3f00}
@deffn {예외} webbrowser.Error

브라우저 제어 에러가 일어날 때 발생하는 예외.
@end deffn

다음 함수가 정의됩니다:

@geindex open() (webbrowser 모듈)
@anchor{library/webbrowser webbrowser open}@anchor{175d}
@deffn {함수} webbrowser.open (url, new=0, autoraise=True)

기본 브라우저를 사용하여 `url'을 표시합니다. `new'가 0이면, 가능하다면 같은 브라우저 창에서 `url'이 열립니다. `new'가 1이면, 가능하다면 새 브라우저 창이 열립니다. `new'가 2이면, 가능하다면 새 브라우저 페이지(“탭”)가 열립니다. `autoraise'가 @code{True}이면, 가능하다면 창을 올립니다(raise) (이것은 많은 창 관리자에서 이 변수의 설정과 관계없이 일어납니다).

Returns @code{True} if a browser was successfully launched, @code{False} otherwise.

일부 플랫폼에서, 이 함수를 사용하여 파일명을 여는 것은 동작하고 운영 체제의 연결된 프로그램이 시작될 수 있습니다. 하지만, 이것은 지원되지도 이식성 있지도 않습니다.

인자 @code{url}로 @ref{1c6c,,감사 이벤트(auditing event)} @code{webbrowser.open}을 발생시킵니다.
@end deffn

@geindex open_new() (webbrowser 모듈)
@anchor{library/webbrowser webbrowser open_new}@anchor{3f01}
@deffn {함수} webbrowser.open_new (url)

가능하다면, 기본 브라우저의 새 창에서 `url'을 엽니다, 그렇지 않으면, 유일한 브라우저 창에서 `url'을 엽니다.

Returns @code{True} if a browser was successfully launched, @code{False} otherwise.
@end deffn

@geindex open_new_tab() (webbrowser 모듈)
@anchor{library/webbrowser webbrowser open_new_tab}@anchor{3f02}
@deffn {함수} webbrowser.open_new_tab (url)

가능하다면, 기본 브라우저의 새 페이지(“탭”)에서 `url'을 엽니다, 그렇지 않으면 @ref{3f01,,open_new()}와 동등합니다.

Returns @code{True} if a browser was successfully launched, @code{False} otherwise.
@end deffn

@geindex get() (webbrowser 모듈)
@anchor{library/webbrowser webbrowser get}@anchor{3f03}
@deffn {함수} webbrowser.get (using=None)

브라우저 유형 `using'에 대한 제어기 객체를 반환합니다. `using'이 @code{None}이면, 호출자의 환경에 적합한 기본 브라우저을 위한 제어기 객체를 반환합니다.
@end deffn

@geindex register() (webbrowser 모듈)
@anchor{library/webbrowser webbrowser register}@anchor{3f04}
@deffn {함수} webbrowser.register (name, constructor, instance=None, *, preferred=False)

브라우저 유형 `name'을 등록합니다. 일단 브라우저 유형이 등록되면, @ref{3f03,,get()} 함수는 해당 브라우저 유형에 대한 제어기를 반환할 수 있습니다. `instance'가 제공되지 않거나, @code{None}이면, 필요할 때 `constructor'가 매개 변수 없이 호출되어 인스턴스를 만듭니다. `instance'가 제공되면, `constructor'는 절대로 호출되지 않으며, @code{None}일 수 있습니다.

`preferred'를 @code{True}로 설정하면 이 브라우저를 인자 없이 @ref{3f03,,get()}을 호출할 때 선호되는 결과가 되도록 합니다. 그렇지 않으면, 이 엔트리 포인트는 
@geindex BROWSER
@geindex 환경 변수; BROWSER
@code{BROWSER} 변수를 설정하거나 선언한 처리기의 이름과 일치하는 비어 있지 않은 인자로 @code{get()}을 호출하려는 경우에만 유용합니다.


버전 3.7에서 변경: `preferred' 키워드 전용 매개 변수가 추가되었습니다.

@end deffn

여러 가지 브라우저 유형이 미리 정의되어 있습니다. 이 표는 @ref{3f03,,get()} 함수로 전달될 수 있는 유형 이름과 제어기 클래스의 해당 인스턴스 화를 제공합니다, 모두 이 모듈에서 정의됩니다.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxx} 
@headitem

유형 이름

@tab

클래스 이름

@tab

노트

@item

@code{'mozilla'}

@tab

@code{Mozilla('mozilla')}

@tab

@item

@code{'firefox'}

@tab

@code{Mozilla('mozilla')}

@tab

@item

@code{'epiphany'}

@tab

@code{Epiphany('epiphany')}

@tab

@item

@code{'kfmclient'}

@tab

@code{Konqueror()}

@tab

(1)

@item

@code{'konqueror'}

@tab

@code{Konqueror()}

@tab

(1)

@item

@code{'kfm'}

@tab

@code{Konqueror()}

@tab

(1)

@item

@code{'opera'}

@tab

@code{Opera()}

@tab

@item

@code{'links'}

@tab

@code{GenericBrowser('links')}

@tab

@item

@code{'elinks'}

@tab

@code{Elinks('elinks')}

@tab

@item

@code{'lynx'}

@tab

@code{GenericBrowser('lynx')}

@tab

@item

@code{'w3m'}

@tab

@code{GenericBrowser('w3m')}

@tab

@item

@code{'windows-default'}

@tab

@code{WindowsDefault}

@tab

(2)

@item

@code{'macosx'}

@tab

@code{MacOSXOSAScript('default')}

@tab

(3)

@item

@code{'safari'}

@tab

@code{MacOSXOSAScript('safari')}

@tab

(3)

@item

@code{'google-chrome'}

@tab

@code{Chrome('google-chrome')}

@tab

@item

@code{'chrome'}

@tab

@code{Chrome('chrome')}

@tab

@item

@code{'chromium'}

@tab

@code{Chromium('chromium')}

@tab

@item

@code{'chromium-browser'}

@tab

@code{Chromium('chromium-browser')}

@tab

@item

@code{'iosbrowser'}

@tab

@code{IOSBrowser}

@tab

(4)

@end multitable


노트:


@enumerate 

@item 
“Konqueror”는 유닉스용 KDE 데스크톱 환경의 파일 관리자이며, KDE가 실행 중일 때만 의미가 있습니다. 신뢰성 있게 KDE를 탐지하는 방법이 있다면 좋을 것입니다; @code{KDEDIR} 변수로는 충분하지 않습니다. KDE 2에서 @code{konqueror} 명령을 사용할 때조차도 “kfm”이라는 이름이 사용됨에 유의하십시오 — 구현이 Konqueror를 실행하기 위한 최상의 전략을 선택합니다.

@item 
윈도우 플랫폼에서만.

@item 
맥 OS 에서만.

@item 
iOS 에서만.
@end enumerate


Added in version 3.2: A new @code{MacOSXOSAScript} class has been added
and is used on Mac instead of the previous @code{MacOSX} class.
This adds support for opening browsers not currently set as the OS default.



Added in version 3.3: Chrome/Chromium에 대한 지원이 추가되었습니다.



버전 3.12에서 변경: Support for several obsolete browsers has been removed.
Removed browsers include Grail, Mosaic, Netscape, Galeon,
Skipstone, Iceape, and Firefox versions 35 and below.



버전 3.13에서 변경: iOS에 대한 지원이 추가되었습니다.


여기 몇 가지 간단한 예제가 있습니다:

@example
url = 'https://docs.python.org/'

# 브라우저 창이 이미 열려 있으면, 새 탭에 URL을 엽니다.
webbrowser.open_new_tab(url)

# 새 창에 URL을 엽니다, 가능하다면 창을 올립니다.
webbrowser.open_new(url)
@end example

@node Browser controller objects,,Command-line interface<6>,webbrowser — 편리한 웹 브라우저 제어기
@anchor{library/webbrowser browser-controller-objects}@anchor{3f05}@anchor{library/webbrowser browser-controllers}@anchor{3f06}
@subsubsection Browser controller objects


Browser controllers provide the @ref{599,,name} attribute,
and the following three methods which parallel module-level convenience functions:

@geindex name (webbrowser.controller의 속성)
@anchor{library/webbrowser webbrowser controller name}@anchor{599}
@deffn {속성} controller.name

System-dependent name for the browser.
@end deffn

@geindex open() (webbrowser.controller 메서드)
@anchor{library/webbrowser webbrowser controller open}@anchor{3f07}
@deffn {메서드} controller.open (url, new=0, autoraise=True)

이 제어기가 처리하는 브라우저를 사용하여 `url'을 표시합니다. `new'가 1이면, 가능하다면 새 브라우저 창이 열립니다. `new'가 2이면, 가능하다면 새 브라우저 페이지(“탭”)가 열립니다.
@end deffn

@geindex open_new() (webbrowser.controller 메서드)
@anchor{library/webbrowser webbrowser controller open_new}@anchor{3f08}
@deffn {메서드} controller.open_new (url)

가능하다면, 이 제어기가 처리하는 브라우저의 새 창에 `url'을 엽니다, 그렇지 않으면, 유일한 브라우저 창에 `url'을 엽니다. 별칭 @ref{3f01,,open_new()}.
@end deffn

@geindex open_new_tab() (webbrowser.controller 메서드)
@anchor{library/webbrowser webbrowser controller open_new_tab}@anchor{3f09}
@deffn {메서드} controller.open_new_tab (url)

가능하다면, 이 제어기가 처리하는 브라우저의 새 페이지(“탭”)에 `url'을 엽니다, 그렇지 않으면 @ref{3f01,,open_new()}와 동등합니다.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node wsgiref — WSGI 유틸리티와 참조 구현,urllib — URL 처리 모듈,webbrowser — 편리한 웹 브라우저 제어기,인터넷 프로토콜과 지원
@anchor{library/wsgiref doc}@anchor{3f0a}@anchor{library/wsgiref module-wsgiref}@anchor{11e}@anchor{library/wsgiref translation-repo}@anchor{3f0b}@anchor{library/wsgiref wsgiref-wsgi-utilities-and-reference-implementation}@anchor{3f0c}
@subsection @code{wsgiref} — WSGI 유틸리티와 참조 구현


@geindex module; wsgiref

`소스 코드:' Lib/wsgiref@footnote{https://github.com/python/cpython/tree/3.14/Lib/wsgiref}


__________________________________________________________________


@cartouche
@quotation 경고 
@code{wsgiref} is a reference implementation and is not recommended for
production. The module only implements basic security checks.
@end quotation
@end cartouche

WSGI(Web Server Gateway Interface)는 웹 서버 소프트웨어와 파이썬으로 작성된 웹 응용 프로그램 간의 표준 인터페이스입니다. 표준 인터페이스는 여러 웹 서버에서 WSGI를 지원하는 응용 프로그램을 쉽게 사용할 수 있도록 합니다.

웹 서버와 프로그래밍 프레임워크의 작성자만 WSGI 설계의 모든 세부 사항과 코너 케이스를 알 필요가 있습니다. 단지 WSGI 응용 프로그램을 설치하거나 기존 프레임워크를 사용하여 웹 응용 프로그램을 작성하기 위해, WSGI의 모든 세부 사항을 이해할 필요는 없습니다.

@code{wsgiref} is a reference implementation of the WSGI specification that can
be used to add WSGI support to a web server or framework.  It provides utilities
for manipulating WSGI environment variables and response headers, base classes
for implementing WSGI servers, a demo HTTP server that serves WSGI applications,
types for static type checking,
and a validation tool that checks WSGI servers and applications for conformance
to the WSGI specification (
@geindex Python 향상 제안; PEP 3333
PEP 3333@footnote{https://peps.python.org/pep-3333/}).

WSGI에 대한 더 자세한 정보 및 자습서와 기타 자원에 대한 링크는 wsgi.readthedocs.io@footnote{https://wsgi.readthedocs.io/}를 참조하십시오.

@c XXX If you're just trying to write a web application...

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

@end menu

@node wsgiref util – WSGI environment utilities,wsgiref headers – WSGI response header tools,,wsgiref — WSGI 유틸리티와 참조 구현
@anchor{library/wsgiref module-wsgiref util}@anchor{123}@anchor{library/wsgiref wsgiref-util-wsgi-environment-utilities}@anchor{3f0d}
@subsubsection @code{wsgiref.util} – WSGI environment utilities


@geindex module; wsgiref.util

이 모듈은 WSGI 환경으로 작업하기 위한 다양한 유틸리티 함수를 제공합니다. WSGI 환경은 
@geindex Python 향상 제안; PEP 3333
PEP 3333@footnote{https://peps.python.org/pep-3333/}에서 설명한 대로 HTTP 요청 변수를 포함하는 딕셔너리입니다. `environ' 매개 변수를 취하는 모든 함수는 WSGI 호환 딕셔너리가 제공될 것으로 기대합니다; 자세한 명세는 
@geindex Python 향상 제안; PEP 3333
PEP 3333@footnote{https://peps.python.org/pep-3333/}를 형 어노테이션에 사용할 수 있는 형 에일리어스는 @ref{3f0e,,WSGIEnvironment}를 참조하십시오.

@geindex guess_scheme() (wsgiref.util 모듈)
@anchor{library/wsgiref wsgiref util guess_scheme}@anchor{3f0f}
@deffn {함수} wsgiref.util.guess_scheme (environ)

`environ' 딕셔너리에서 @code{HTTPS} 환경 변수를 검사하여 @code{wsgi.url_scheme}이 “http”와 “https” 중 어느 것인지 추측합니다. 반환 값은 문자열입니다.

이 함수는 CGI 나 FastCGI와 같은 CGI와 유사한 프로토콜을 감싸는 게이트웨이를 만들 때 유용합니다. 일반적으로, 이러한 프로토콜을 제공하는 서버는 SSL을 통해 요청이 수신될 때 “1”, “yes” 또는 “on” 값을 갖는 @code{HTTPS} 변수를 포함합니다. 따라서, 이 함수는 그런 값을 발견하면 “https”를 반환하고, 그렇지 않으면 “http”를 반환합니다.
@end deffn

@geindex request_uri() (wsgiref.util 모듈)
@anchor{library/wsgiref wsgiref util request_uri}@anchor{3f10}
@deffn {함수} wsgiref.util.request_uri (environ, include_query=True)

@geindex Python 향상 제안; PEP 3333
PEP 3333@footnote{https://peps.python.org/pep-3333/}의 “URL 재구성” 절에 있는 알고리즘을 사용하여 전체 요청 URI를 반환합니다. 선택적으로 질의 문자열(query string)을 포함합니다. `include_query'가 거짓이면 질의 문자열은 결과 URI에 포함되지 않습니다.
@end deffn

@geindex application_uri() (wsgiref.util 모듈)
@anchor{library/wsgiref wsgiref util application_uri}@anchor{3f11}
@deffn {함수} wsgiref.util.application_uri (environ)

@code{PATH_INFO} 와 @code{QUERY_STRING} 변수가 무시된다는 점을 제외하면 @ref{3f10,,request_uri()}와 유사합니다. 결과는 요청이 가리키는 응용 프로그램 객체의 기본 URI입니다.
@end deffn

@geindex shift_path_info() (wsgiref.util 모듈)
@anchor{library/wsgiref wsgiref util shift_path_info}@anchor{3f12}
@deffn {함수} wsgiref.util.shift_path_info (environ)

단일 이름을 @code{PATH_INFO}에서 @code{SCRIPT_NAME}로 이동하고 이름을 반환합니다. `environ' 딕셔너리는 그 자리에서 `수정'됩니다; 원본 @code{PATH_INFO} 나 @code{SCRIPT_NAME}를 그대로 유지해야 하면 사본을 사용하십시오.

@code{PATH_INFO}에 남아있는 경로 세그먼트가 없으면, @code{None}이 반환됩니다.

일반적으로, 이 루틴은 요청 URI 경로의 각 부분을 처리하는 데 사용됩니다, 예를 들어 경로를 일련의 딕셔너리 키로 취급합니다. 이 루틴은 전달된 환경을 수정하여 대상 URI에 있는 다른 WSGI 응용 프로그램을 호출하는 데 적합하게 만듭니다. 예를 들어, @code{/foo}에 WSGI 응용 프로그램이 있고, 요청 URI 경로가 @code{/foo/bar/baz}이고, @code{/foo}의 WSGI 응용 프로그램이 @ref{3f12,,shift_path_info()}를 호출하면 “bar” 문자열을 수신하고 전달할 환경이 @code{/foo/bar}에 있는 WSGI 응용 프로그램에 전달하기 적합하도록 갱신됩니다. 즉, @code{SCRIPT_NAME}는 @code{/foo}에서 @code{/foo/bar}로 변경되고, @code{PATH_INFO}는 @code{/bar/baz}에서 @code{/baz}로 변경됩니다.

@code{PATH_INFO}가 단지 “/”일 때, 이 루틴은 빈 문자열을 반환하고 @code{SCRIPT_NAME}에 후행 슬래시를 추가합니다; 빈 경로 세그먼트는 일반적으로 무시되고, @code{SCRIPT_NAME}는 일반적으로 슬래시로 끝나지 않음에도 그렇게 합니다. 의도적인 동작입니다. 이 루틴을 사용하여 객체를 탐색할 때, 응용 프로그램이 @code{/x}로 끝나는 URI와 @code{/x/}로 끝나는 URI의 차이를 구별할 수 있도록 하기 위함입니다.
@end deffn

@geindex setup_testing_defaults() (wsgiref.util 모듈)
@anchor{library/wsgiref wsgiref util setup_testing_defaults}@anchor{3f13}
@deffn {함수} wsgiref.util.setup_testing_defaults (environ)

테스트 목적으로 `environ'를 뻔한 기본값으로 갱신합니다.

이 루틴은 @code{HTTP_HOST}, @code{SERVER_NAME}, @code{SERVER_PORT}, @code{REQUEST_METHOD}, @code{SCRIPT_NAME}, @code{PATH_INFO} 및 모든 
@geindex Python 향상 제안; PEP 3333
PEP 3333@footnote{https://peps.python.org/pep-3333/}에서 정의된 @code{wsgi.*} 변수를 포함하여 WSGI에 필요한 다양한 매개 변수를 추가합니다. 기본값만 제공하며, 이 변수들에 대한 기존 설정을 대체하지 않습니다.

이 루틴은 WSGI 서버와 응용 프로그램의 단위 테스트가 더미 환경을 쉽게 설정하도록 하기 위한 것입니다. 데이터가 가짜이므로, 실제 WSGI 서버나 응용 프로그램에서 사용해서는 안 됩니다!

Example usage (see also @ref{3f14,,demo_app()}
for another example):

@example
from wsgiref.util import setup_testing_defaults
from wsgiref.simple_server import make_server

# 상대적으로 간단한 WSGI 응용 프로그램. setup_testing_defaults로 갱신된 후에 환경
# 딕셔너리를 인쇄할 것입니다.
def simple_app(environ, start_response):
    setup_testing_defaults(environ)

    status = '200 OK'
    headers = [('Content-type', 'text/plain; charset=utf-8')]

    start_response(status, headers)

    ret = [("%s: %s\n" % (key, value)).encode("utf-8")
           for key, value in environ.items()]
    return ret

with make_server('@w{'}, 8000, simple_app) as httpd:
    print("Serving on port 8000...")
    httpd.serve_forever()
@end example
@end deffn

In addition to the environment functions above, the @code{wsgiref.util} module
also provides these miscellaneous utilities:

@geindex is_hop_by_hop() (wsgiref.util 모듈)
@anchor{library/wsgiref wsgiref util is_hop_by_hop}@anchor{1a3c}
@deffn {함수} wsgiref.util.is_hop_by_hop (header_name)

‘header_name’이 
@geindex RFC; RFC 2616
RFC 2616@footnote{https://datatracker.ietf.org/doc/html/rfc2616.html}가 정의하고 있는 HTTP/1.1 “Hop-by-Hop” 헤더면 @code{True}를 반환합니다.
@end deffn

@geindex FileWrapper (wsgiref.util 클래스)
@anchor{library/wsgiref wsgiref util FileWrapper}@anchor{93e}
@deffn {클래스} wsgiref.util.FileWrapper (filelike, blksize=8192)

파일류 객체를 @ref{4ca,,이터레이터}로 변환하는 데 사용되는 @ref{3f15,,wsgiref.types.FileWrapper} 프로토콜의 구체적 구현. 결과 객체는 @ref{142c,,이터러블}입니다. 객체가 이터레이트될 때, 선택적인 `blksize' 매개 변수는 산출할 바이트열을 얻기 위해 `filelike' 객체의 @code{read()} 메서드에 반복적으로 전달됩니다. @code{read()}가 빈 바이트열을 반환하면 이터레이션이 종료되고 다시 시작할 수 없습니다.

`filelike'에 @code{close()} 메서드가 있으면, 반환된 객체에도 @code{close()} 메서드가 있고, 호출될 때 `filelike' 객체의 @code{close()} 메서드를 호출합니다.

사용 예:

@example
from io import StringIO
from wsgiref.util import FileWrapper

# 파일류 객체로 StringIO 버퍼를 사용하고 있습니다
filelike = StringIO("This is an example file-like object"*10)
wrapper = FileWrapper(filelike, blksize=5)

for chunk in wrapper:
    print(chunk)
@end example


버전 3.11에서 변경: @ref{588,,__getitem__()} 메서드 지원은 제거되었습니다.

@end deffn

@node wsgiref headers – WSGI response header tools,wsgiref simple_server – a simple WSGI HTTP server,wsgiref util – WSGI environment utilities,wsgiref — WSGI 유틸리티와 참조 구현
@anchor{library/wsgiref module-wsgiref headers}@anchor{120}@anchor{library/wsgiref wsgiref-headers-wsgi-response-header-tools}@anchor{3f16}
@subsubsection @code{wsgiref.headers} – WSGI response header tools


@geindex module; wsgiref.headers

이 모듈은 매핑류 인터페이스를 사용하여 WSGI 응답 헤더를 편리하게 조작할 수 있는 클래스 @ref{1097,,Headers} 하나를 제공합니다.

@geindex Headers (wsgiref.headers 클래스)
@anchor{library/wsgiref wsgiref headers Headers}@anchor{1097}
@deffn {클래스} wsgiref.headers.Headers ([headers])

@geindex Python 향상 제안; PEP 3333
PEP 3333@footnote{https://peps.python.org/pep-3333/}에 설명된 것처럼 헤더 이름/값 튜플의 리스트이어야 하는 `headers'를 감싸는 매핑류 객체를 만듭니다. `headers'의 기본값은 빈 리스트입니다.

@ref{1097,,Headers} 객체는 @ref{588,,__getitem__()}, @ref{2032,,get()}, @ref{14d0,,__setitem__()}, @ref{1278,,setdefault()}, @ref{14d1,,__delitem__()} 및 @ref{15be,,__contains__()}를 포함한 일반적인 매핑 연산을 지원합니다. 이러한 각 메서드에 대해, 키는 헤더 이름(대소 문자를 구분하지 않습니다)이며, 값은 해당 헤더 이름과 연관된 첫 번째 값입니다. 헤더를 설정하면 해당 헤더의 기존 값이 삭제된 다음, 감싸진 헤러 리스트의 끝에 새 값이 추가됩니다. 헤더의 기존 순서는 일반적으로 유지되며, 감싸진 리스트의 끝에 새 헤더가 추가됩니다.

딕셔너리와 달리, @ref{1097,,Headers} 객체는 감싸진 헤더 리스트에 없는 키를 가져오거나 삭제하려고 하면 에러를 발생시키지 않습니다. 존재하지 않는 헤더를 가져오려고 하면 @code{None}을 반환하고, 존재하지 않는 헤더를 삭제하면 아무것도 하지 않습니다.

@ref{1097,,Headers} 객체는 @code{keys()}, @code{values()} 및 @code{items()} 메서드도 지원합니다. @code{keys()} 와 @code{items()}에 의해 반환된 리스트에는 다중-값 헤더가 있으면 같은 키가 두 번 이상 포함될 수 있습니다. @code{Headers} 객체의 @code{len()}는 @code{items()}의 길이와 같고, 이는 감싸진 헤더 리스트의 길이와 같습니다. 실제로, @code{items()} 메서드는 단지 감싸진 헤더 리스트의 복사본을 반환합니다.

@ref{1097,,Headers} 객체에서 @code{bytes()}를 호출하면 HTTP 응답 헤더로 전송하기에 적합한 포맷된 바이트열이 반환됩니다. 각 헤더는 콜론과 공백으로 구분된 값과 함께 줄에 들어갑니다. 각 줄은 캐리지 리턴과 줄넘김으로 끝나며, 바이트열은 빈 줄로 끝납니다.

@ref{1097,,Headers} 객체는 매핑 인터페이스와 포매팅 기능 외에도, 다중-값 헤더를 조회하거나 추가하고, MIME 파라미터가 있는 헤더를 추가하기 위해 다음과 같은 메서드를 제공합니다:

@geindex get_all() (wsgiref.headers.Headers 메서드)
@anchor{library/wsgiref wsgiref headers Headers get_all}@anchor{3f17}
@deffn {메서드} get_all (name)

주어진 이름의 헤더에 대한 모든 값의 리스트를 반환합니다.

반환된 리스트는 원래 헤더 리스트에 나타나거나 이 인스턴스에 추가된 순서대로 정렬되고, 중복을 포함할 수 있습니다. 삭제되고 다시 삽입된 필드는 항상 헤더 리스트의 끝에 추가됩니다. 주어진 이름의 필드가 존재하지 않으면, 빈 리스트를 반환합니다.
@end deffn

@geindex add_header() (wsgiref.headers.Headers 메서드)
@anchor{library/wsgiref wsgiref headers Headers add_header}@anchor{3f18}
@deffn {메서드} add_header (name, value, **_params)

키워드 인자로 지정되는 선택적 MIME 파라미터와 함께 헤더를 추가합니다 (다중-값 가능).

`name'은 추가할 헤더 필드입니다. 키워드 인자는 헤더 필드에 대한 MIME 파라미터를 설정하는 데 사용될 수 있습니다. 각 파라미터는 문자열이나 @code{None} 이어야 합니다. 파라미터 이름의 밑줄은 대시로 변환됩니다; 파이썬 식별자에서는 대시가 유효하지 않지만 많은 MIME 파라미터 이름에는 대시가 포함되기 때문입니다. 파라미터값이 문자열이면 @code{name="value"} 형식으로 헤더 값 파라미터에 추가됩니다. @code{None}이면 파라미터 이름 만 추가됩니다. (이것은 값이 없는 MIME 파라미터에 사용됩니다.) 사용 예:

@example
h.add_header('content-disposition', 'attachment', filename='bud.gif')
@end example

위의 코드는 다음과 같은 헤더를 추가합니다:

@example
Content-Disposition: attachment; filename="bud.gif"
@end example
@end deffn


버전 3.5에서 변경: `headers' 매개 변수는 선택적입니다.

@end deffn

@node wsgiref simple_server – a simple WSGI HTTP server,wsgiref validate — WSGI conformance checker,wsgiref headers – WSGI response header tools,wsgiref — WSGI 유틸리티와 참조 구현
@anchor{library/wsgiref module-wsgiref simple_server}@anchor{121}@anchor{library/wsgiref wsgiref-simple-server-a-simple-wsgi-http-server}@anchor{3f19}
@subsubsection @code{wsgiref.simple_server} – a simple WSGI HTTP server


@geindex module; wsgiref.simple_server

이 모듈은 WSGI 응용 프로그램을 서빙하는 간단한 HTTP 서버(@ref{76,,http.server} 기반)를 구현합니다. 각 서버 인스턴스는 주어진 호스트와 포트에서 단일 WSGI 응용 프로그램을 서빙합니다. 단일 호스트와 포트에서 여러 응용 프로그램을 서빙하려면, @code{PATH_INFO}를 구문 분석하여 각 요청에 대해 호출할 응용 프로그램을 선택하는 WSGI 응용 프로그램을 만들어야 합니다. (예를 들어, @ref{123,,wsgiref.util}의 @code{shift_path_info()} 함수를 사용해서.)

@geindex make_server() (wsgiref.simple_server 모듈)
@anchor{library/wsgiref wsgiref simple_server make_server}@anchor{3f1a}
@deffn {함수} wsgiref.simple_server.make_server (host, port, app, server_class=WSGIServer, handler_class=WSGIRequestHandler)

`host' 와 `port'에서 수신을 기다리고, `app'에 대한 연결을 수락하는 새 WSGI 서버를 만듭니다. 반환 값은 제공된 `server_class'의 인스턴스이며, 지정된 `handler_class'를 사용하여 요청을 처리합니다. `app'는 
@geindex Python 향상 제안; PEP 3333
PEP 3333@footnote{https://peps.python.org/pep-3333/}에 정의된 WSGI 응용 프로그램 객체여야 합니다.

사용 예:

@example
from wsgiref.simple_server import make_server, demo_app

with make_server('@w{'}, 8000, demo_app) as httpd:
    print("Serving HTTP on port 8000...")

    # 프로세스를 죽일 때까지 요청에 응답합니다
    httpd.serve_forever()

    # 대안: 하나의 요청을 처리한 다음 종료합니다
    httpd.handle_request()
@end example
@end deffn

@geindex demo_app() (wsgiref.simple_server 모듈)
@anchor{library/wsgiref wsgiref simple_server demo_app}@anchor{3f14}
@deffn {함수} wsgiref.simple_server.demo_app (environ, start_response)

This function is a small but complete WSGI application that returns a text page
containing the message “Hello world!” and a list of the key/value pairs provided
in the `environ' parameter.  It’s useful for verifying that a WSGI server (such
as @code{wsgiref.simple_server}) is able to run a simple WSGI application
correctly.

`start_response' 콜러블은 @ref{3f1b,,StartResponse} 프로토콜을 따라야 합니다.
@end deffn

@geindex WSGIServer (wsgiref.simple_server 클래스)
@anchor{library/wsgiref wsgiref simple_server WSGIServer}@anchor{3f1c}
@deffn {클래스} wsgiref.simple_server.WSGIServer (server_address, RequestHandlerClass)

@ref{3f1c,,WSGIServer} 인스턴스를 만듭니다. `server_address'는 @code{(host,port)} 튜플이어야 하며, `RequestHandlerClass'는 @ref{12d0,,http.server.BaseHTTPRequestHandler}의 서브 클래스여야 하는데, 요청을 처리하는 데 사용됩니다.

@ref{3f1a,,make_server()} 함수가 모든 세부 사항을 처리할 수 있으므로, 일반적으로 이 생성자를 호출할 필요가 없습니다.

@ref{3f1c,,WSGIServer}는 @ref{3f1d,,http.server.HTTPServer}의 서브 클래스이므로, 모든 메서드(가령 @code{serve_forever()}와 @code{handle_request()})를 사용할 수 있습니다. @code{WSGIServer}는 또한 다음과 같은 WSGI 전용 메서드를 제공합니다:

@geindex set_app() (wsgiref.simple_server.WSGIServer 메서드)
@anchor{library/wsgiref wsgiref simple_server WSGIServer set_app}@anchor{3f1e}
@deffn {메서드} set_app (application)

콜러블 `application'을 요청을 수신하는 WSGI 응용 프로그램으로 설정합니다.
@end deffn

@geindex get_app() (wsgiref.simple_server.WSGIServer 메서드)
@anchor{library/wsgiref wsgiref simple_server WSGIServer get_app}@anchor{3f1f}
@deffn {메서드} get_app ()

현재 설정되어있는 응용 프로그램 콜러블을 반환합니다.
@end deffn

그러나 일반적으로, 이러한 추가 메서드를 사용할 필요가 없는데, @ref{3f1e,,set_app()}는 일반적으로 @ref{3f1a,,make_server()}에서 호출되고, @ref{3f1f,,get_app()}은 주로 요청 처리기 인스턴스의 필요를 위해 존재하기 때문입니다
@end deffn

@geindex WSGIRequestHandler (wsgiref.simple_server 클래스)
@anchor{library/wsgiref wsgiref simple_server WSGIRequestHandler}@anchor{3f20}
@deffn {클래스} wsgiref.simple_server.WSGIRequestHandler (request, client_address, server)

지정된 `request' (즉, 소켓), `client_address' (@code{(host,port)} 튜플) 및 `server' (@ref{3f1c,,WSGIServer} 인스턴스)를 위한 HTTP 처리기를 만듭니다.

이 클래스의 인스턴스를 직접 만들 필요는 없습니다; @ref{3f1c,,WSGIServer} 객체가 필요에 따라 자동으로 만듭니다. 그러나, 이 클래스를 서브 클래싱하여 `handler_class'로 @ref{3f1a,,make_server()} 함수에 제공할 수 있습니다. 서브 클래스에서 재정의하는데 적합한 메서드들은 다음과 같습니다:

@geindex get_environ() (wsgiref.simple_server.WSGIRequestHandler 메서드)
@anchor{library/wsgiref wsgiref simple_server WSGIRequestHandler get_environ}@anchor{3f21}
@deffn {메서드} get_environ ()

요청에 대한 @ref{3f0e,,WSGIEnvironment} 딕셔너리를 반환합니다. 기본 구현은 @ref{3f1c,,WSGIServer} 객체의 @code{base_environ} 딕셔너리 어트리뷰트의 내용을 복사한 다음, HTTP 요청으로부터 온 다양한 헤더를 추가합니다. 이 메서드를 호출할 때마다 
@geindex Python 향상 제안; PEP 3333
PEP 3333@footnote{https://peps.python.org/pep-3333/}에 지정된 CGI 환경 변수를 모두 포함하는 새 딕셔너리를 반환해야 합니다.
@end deffn

@geindex get_stderr() (wsgiref.simple_server.WSGIRequestHandler 메서드)
@anchor{library/wsgiref wsgiref simple_server WSGIRequestHandler get_stderr}@anchor{3f22}
@deffn {메서드} get_stderr ()

@code{wsgi.errors} 스트림으로 사용해야 하는 객체를 반환합니다. 기본 구현은 단지 @code{sys.stderr}를 반환합니다.
@end deffn

@geindex handle() (wsgiref.simple_server.WSGIRequestHandler 메서드)
@anchor{library/wsgiref wsgiref simple_server WSGIRequestHandler handle}@anchor{3f23}
@deffn {메서드} handle ()

HTTP 요청을 처리합니다. 기본 구현은 @ref{11f,,wsgiref.handlers} 클래스를 사용하여 실제 WSGI 응용 프로그램 인터페이스를 구현하는 처리기 인스턴스를 만듭니다.
@end deffn
@end deffn

@node wsgiref validate — WSGI conformance checker,wsgiref handlers – server/gateway base classes,wsgiref simple_server – a simple WSGI HTTP server,wsgiref — WSGI 유틸리티와 참조 구현
@anchor{library/wsgiref module-wsgiref validate}@anchor{124}@anchor{library/wsgiref wsgiref-validate-wsgi-conformance-checker}@anchor{3f24}
@subsubsection @code{wsgiref.validate} — WSGI conformance checker


@geindex module; wsgiref.validate

When creating new WSGI application objects, frameworks, servers, or middleware,
it can be useful to validate the new code’s conformance using
@code{wsgiref.validate}.  This module provides a function that creates WSGI
application objects that validate communications between a WSGI server or
gateway and a WSGI application object, to check both sides for protocol
conformance.

이 유틸리티는 완전한 
@geindex Python 향상 제안; PEP 3333
PEP 3333@footnote{https://peps.python.org/pep-3333/} 적합성을 보장하지는 않습니다; 이 모듈에서 에러가 없다고 해서 에러가 존재하지 않는다는 것을 의미하지는 않습니다. 그러나, 이 모듈에서 오류가 발생하면, 서버나 응용 프로그램이 100% 적합하지 않다는 것은 사실상 확실합니다.

이 모듈은 Ian Bicking의 “Python Paste” 라이브러리의 @code{paste.lint} 모듈을 기반으로 합니다.

@geindex validator() (wsgiref.validate 모듈)
@anchor{library/wsgiref wsgiref validate validator}@anchor{3f25}
@deffn {함수} wsgiref.validate.validator (application)

`application' 감싸고 새 WSGI 응용 프로그램 객체를 반환합니다. 반환된 응용 프로그램은 모든 요청을 원래 `application'으로 전달하고, `application'과 이를 호출하는 서버가 모두 WSGI 명세와 
@geindex RFC; RFC 2616
RFC 2616@footnote{https://datatracker.ietf.org/doc/html/rfc2616.html}를 준수하는지 확인합니다.

탐지된 모든 부적합 결과는 @ref{8b7,,AssertionError}를 일으킵니다; 그러나 이러한 에러를 처리하는 방법은 서버에 따라 다릅니다. 예를 들어, @ref{121,,wsgiref.simple_server}와 @ref{11f,,wsgiref.handlers}를 기반으로 하는 다른 (에러 처리 메서드를 재정의해서 다른 작업을 수행하지 않는) 서버는 단순히 에러가 발생했다는 메시지를 출력하고 @code{sys.stderr} 나 기타 에러 스트림으로 트레이스백을 덤프합니다.

이 래퍼는 의심스럽기는 하지만 
@geindex Python 향상 제안; PEP 3333
PEP 3333@footnote{https://peps.python.org/pep-3333/}에서 실제로 금지되지 않을 수도 있는 동작을 나타내도록 @ref{118,,warnings} 모듈을 사용하여 출력을 생성할 수도 있습니다. 파이썬 명령 줄 옵션이나 @code{warnings} API를 사용해서 억제되지 않는 한, 그러한 경고는 @code{sys.stderr}(같은 객체가 아니라면 @code{wsgi.errors}가 `아닙니다')에 기록됩니다.

사용 예:

@example
from wsgiref.validate import validator
from wsgiref.simple_server import make_server

# 의도적으로 표준을 준수하지 않는 콜러블 객체이므로,
# 적합성 검사기가 중단됩니다
def simple_app(environ, start_response):
    status = '200 OK'  # HTTP Status
    headers = [('Content-type', 'text/plain')]  # HTTP Headers
    start_response(status, headers)

    # 이것은 중단하게 되는데, 목록을 반환해야 하기 때문입니다,
    # 적합성 검사기가 알려줄 것입니다
    return b"Hello World"

# 이것은 적합성 검사기로 감싼 응용 프로그램입니다
validator_app = validator(simple_app)

with make_server('@w{'}, 8000, validator_app) as httpd:
    print("Listening on port 8000....")
    httpd.serve_forever()
@end example
@end deffn

@node wsgiref handlers – server/gateway base classes,wsgiref types – WSGI types for static type checking,wsgiref validate — WSGI conformance checker,wsgiref — WSGI 유틸리티와 참조 구현
@anchor{library/wsgiref module-wsgiref handlers}@anchor{11f}@anchor{library/wsgiref wsgiref-handlers-server-gateway-base-classes}@anchor{3f26}
@subsubsection @code{wsgiref.handlers} – server/gateway base classes


@geindex module; wsgiref.handlers

이 모듈은 WSGI 서버와 게이트웨이를 구현하기 위한 베이스 처리기 클래스를 제공합니다. 이러한 베이스 클래스는 입력, 출력 및 에러 스트림과 함께 CGI와 유사한 환경이 제공되는 한, WSGI 응용 프로그램과 통신하는 대부분 작업을 처리합니다.

@geindex CGIHandler (wsgiref.handlers 클래스)
@anchor{library/wsgiref wsgiref handlers CGIHandler}@anchor{3f27}
@deffn {클래스} wsgiref.handlers.CGIHandler

@code{sys.stdin}, @code{sys.stdout}, @code{sys.stderr} 및 @code{os.environ}를 통한 CGI 기반 호출. 이것은 WSGI 응용 프로그램이 있고 CGI 스크립트로 실행하려고 할 때 유용합니다. @code{CGIHandler().run(app)}을 호출하기만 하면 됩니다. 여기서 @code{app}은 호출할 WSGI 응용 프로그램 객체입니다.

이 클래스는 @code{wsgi.run_once}를 참으로, @code{wsgi.multithread}를 거짓으로, @code{wsgi.multiprocess}를 참으로 설정하고, 필요한 CGI 스트림과 환경을 얻기 위해 항상 @ref{df,,sys}와 @ref{a5,,os}를 사용하는 @ref{3f28,,BaseCGIHandler}의 서브 클래스입니다.
@end deffn

@geindex IISCGIHandler (wsgiref.handlers 클래스)
@anchor{library/wsgiref wsgiref handlers IISCGIHandler}@anchor{3f29}
@deffn {클래스} wsgiref.handlers.IISCGIHandler

config allowPathInfo 옵션 (IIS>=7) 나 metabase allowPathInfoForScriptMappings (IIS<7)를 설정하지 않고도, Microsoft IIS 웹 서버에 배포할 때 사용할 수 있는 @ref{3f27,,CGIHandler}의 특수한 대안.

기본적으로, IIS는 앞에 @code{SCRIPT_NAME}이 중복된 @code{PATH_INFO}를 제공하므로, 라우팅을 구현하려는 WSGI 응용 프로그램에 문제가 발생합니다. 이 처리기는 중복된 경로를 제거합니다.

IIS가 올바른 @code{PATH_INFO}를 전달하도록 구성할 수 있지만, @code{PATH_TRANSLATED}가 잘못되는 다른 버그가 발생합니다. 다행히도 이 변수는 거의 사용되지 않으며 WSGI에서 보장하지 않습니다. 그러나 IIS<7에서는 설정이 가상 호스트 수준에서만 이루어지므로, 다른 모든 스크립트 매핑에 영향을 미치며, 그중 많은 것들이 @code{PATH_TRANSLATED} 버그에 노출되면 망가집니다. 이러한 이유로 IIS<7은 거의 수정해서 배포되지 않습니다 (아직도 UI가 없어서 IIS7 조차도 거의 사용하지 않습니다.).

CGI 코드가 옵션이 설정되었는지를 알 수 있는 방법이 없으므로, 별도의 처리기 클래스가 제공됩니다. @ref{3f27,,CGIHandler}와 같은 방식으로 사용됩니다. 즉, @code{IISCGIHandler().run(app)}을 호출합니다. 여기서 @code{app}은 호출할 WSGI 응용 프로그램 객체입니다.


Added in version 3.2.

@end deffn

@geindex BaseCGIHandler (wsgiref.handlers 클래스)
@anchor{library/wsgiref wsgiref handlers BaseCGIHandler}@anchor{3f28}
@deffn {클래스} wsgiref.handlers.BaseCGIHandler (stdin, stdout, stderr, environ, multithread=True, multiprocess=False)

@ref{3f27,,CGIHandler}와 유사하지만, @ref{df,,sys} 와 @ref{a5,,os} 모듈을 사용하는 대신, CGI 환경과 I/O 스트림이 명시적으로 지정됩니다. `multithread' 와 `multiprocess' 값은 처리기 인스턴스가 실행하는 모든 응용 프로그램에 대한 @code{wsgi.multithread} 와 @code{wsgi.multiprocess} 플래그를 설정하는 데 사용됩니다.

이 클래스는 HTTP “오리진 서버” 이외의 소프트웨어에서 사용하기 위한 @ref{3f2a,,SimpleHandler}의 서브 클래스입니다. HTTP 상태를 보내기 위해 @code{Status:} 헤더를 사용하는 게이트웨이 프로토콜 구현(가령 CGI, FastCGI, SCGI 등)을 작성하는 경우 @code{SimpleHandler} 대신 이것을 서브 클래싱하고 싶을 겁니다.
@end deffn

@geindex SimpleHandler (wsgiref.handlers 클래스)
@anchor{library/wsgiref wsgiref handlers SimpleHandler}@anchor{3f2a}
@deffn {클래스} wsgiref.handlers.SimpleHandler (stdin, stdout, stderr, environ, multithread=True, multiprocess=False)

@ref{3f28,,BaseCGIHandler}와 유사하지만, HTTP 오리진 서버에 사용하도록 설계되었습니다. HTTP 서버 구현을 작성하는 경우 @code{BaseCGIHandler} 대신 이것을 서브 클래싱하고 싶을 겁니다.

이 클래스는 @ref{1dd0,,BaseHandler}의 서브 클래스입니다. @code{__init__()}, @ref{3f2b,,get_stdin()}, @ref{3f2c,,get_stderr()}, @ref{3f2d,,add_cgi_vars()}, @ref{3f2e,,_write()} 및 @ref{3f2f,,_flush()} 메서드를 재정의하여 명시적으로 환경과 스트림을 생성자를 통해 설정하는 것을 지원합니다. 제공된 환경과 스트림은 @code{stdin}, @code{stdout}, @code{stderr} 및 @code{environ} 어트리뷰트에 저장됩니다.

`stdout'의 @ref{ed6,,write()} 메서드는 @ref{8a2,,io.BufferedIOBase}처럼 각 덩어리 전체를 기록해야 합니다.
@end deffn

@geindex BaseHandler (wsgiref.handlers 클래스)
@anchor{library/wsgiref wsgiref handlers BaseHandler}@anchor{1dd0}
@deffn {클래스} wsgiref.handlers.BaseHandler

이것은 WSGI 응용 프로그램을 실행하기 위한 추상 베이스 클래스입니다. 원칙적으로 여러 요청에 대해 재사용할 수 있는 서브 클래스를 만들 수 있지만, 각 인스턴스는 단일 HTTP 요청을 처리합니다.

@ref{1dd0,,BaseHandler} 인스턴스에는 외부 사용을 위한 하나의 메서드 만 있습니다:

@geindex run() (wsgiref.handlers.BaseHandler 메서드)
@anchor{library/wsgiref wsgiref handlers BaseHandler run}@anchor{3f30}
@deffn {메서드} run (app)

지정된 WSGI 응용 프로그램인 `app'을 실행합니다.
@end deffn

다른 모든 @ref{1dd0,,BaseHandler} 메서드는 응용 프로그램을 실행하는 과정에서 이 메서드에 의해 호출되므로, 주로 과정을 사용자 정의하기 위해 존재합니다.

다음 메서드는 서브 클래스에서 반드시 재정의되어야 합니다:

@geindex _write() (wsgiref.handlers.BaseHandler 메서드)
@anchor{library/wsgiref wsgiref handlers BaseHandler _write}@anchor{3f2e}
@deffn {메서드} _write (data)

클라이언트로의 전송을 위해 바이트열 `data'를 버퍼링합니다. 이 메서드가 실제로 데이터를 전송해도 상관없습니다; @ref{1dd0,,BaseHandler}는 쓰기와 플러시 연산을 분리하여 하부 시스템에 실제로 이러한 구분이 있을 때 효율성을 높입니다.
@end deffn

@geindex _flush() (wsgiref.handlers.BaseHandler 메서드)
@anchor{library/wsgiref wsgiref handlers BaseHandler _flush}@anchor{3f2f}
@deffn {메서드} _flush ()

버퍼링 된 데이터를 클라이언트로 전송하도록 강제합니다. 이 메서드가 아무 일도 하지 않아도 상관없습니다 (즉, @ref{3f2e,,_write()}가 실제로 데이터를 보낸다면).
@end deffn

@geindex get_stdin() (wsgiref.handlers.BaseHandler 메서드)
@anchor{library/wsgiref wsgiref handlers BaseHandler get_stdin}@anchor{3f2b}
@deffn {메서드} get_stdin ()

현재 처리 중인 요청의 @code{wsgi.input}으로 사용하기에 적합한 @ref{3f31,,InputStream} 과 호환되는 객체를 반환합니다.
@end deffn

@geindex get_stderr() (wsgiref.handlers.BaseHandler 메서드)
@anchor{library/wsgiref wsgiref handlers BaseHandler get_stderr}@anchor{3f2c}
@deffn {메서드} get_stderr ()

현재 처리 중인 요청의 @code{wsgi.errors}로 사용하기에 적합한 @ref{3f32,,ErrorStream} 과 호환되는 객체를 반환합니다.
@end deffn

@geindex add_cgi_vars() (wsgiref.handlers.BaseHandler 메서드)
@anchor{library/wsgiref wsgiref handlers BaseHandler add_cgi_vars}@anchor{3f2d}
@deffn {메서드} add_cgi_vars ()

현재 요청에 대한 CGI 변수를 @code{environ} 어트리뷰트에 삽입합니다.
@end deffn

재정의하고 싶을 수 있는 다른 메서드와 어트리뷰트는 다음과 같습니다. 그러나, 이 목록은 요약에 지나지 않고, 재정의할 수 있는 모든 메서드가 포함되어 있지 않습니다. 사용자 정의된 @ref{1dd0,,BaseHandler} 서브 클래스를 작성하기 전에 독스트링과 소스 코드를 참조하여 추가 정보를 얻어야 합니다.

WSGI 환경을 사용자 정의하기 위한 어트리뷰트와 메서드:

@geindex wsgi_multithread (wsgiref.handlers.BaseHandler의 속성)
@anchor{library/wsgiref wsgiref handlers BaseHandler wsgi_multithread}@anchor{3f33}
@deffn {속성} wsgi_multithread

@code{wsgi.multithread} 환경 변수에 사용될 값. @ref{1dd0,,BaseHandler}에서는 기본값이 참이지만, 다른 서브 클래스는 다른 기본값을 가질 수 있습니다 (또는 생성자에 의해 설정될 수 있습니다).
@end deffn

@geindex wsgi_multiprocess (wsgiref.handlers.BaseHandler의 속성)
@anchor{library/wsgiref wsgiref handlers BaseHandler wsgi_multiprocess}@anchor{3f34}
@deffn {속성} wsgi_multiprocess

@code{wsgi.multiprocess} 환경 변수에 사용될 값. @ref{1dd0,,BaseHandler}에서는 기본값이 참이지만, 다른 서브 클래스는 다른 기본값을 가질 수 있습니다 (또는 생성자에 의해 설정될 수 있습니다).
@end deffn

@geindex wsgi_run_once (wsgiref.handlers.BaseHandler의 속성)
@anchor{library/wsgiref wsgiref handlers BaseHandler wsgi_run_once}@anchor{3f35}
@deffn {속성} wsgi_run_once

@code{wsgi.run_once} 환경 변수에 사용될 값. @ref{1dd0,,BaseHandler}에서는 기본값이 거짓이지만, @ref{3f27,,CGIHandler}는 기본적으로 참으로 설정합니다.
@end deffn

@geindex os_environ (wsgiref.handlers.BaseHandler의 속성)
@anchor{library/wsgiref wsgiref handlers BaseHandler os_environ}@anchor{3f36}
@deffn {속성} os_environ

The default environment variables to be included in every request’s WSGI
environment.  By default, this is a copy of @code{os.environ} at the time that
@code{wsgiref.handlers} was imported, but subclasses can either create their own
at the class or instance level.  Note that the dictionary should be considered
read-only, since the default value is shared between multiple classes and
instances.
@end deffn

@geindex server_software (wsgiref.handlers.BaseHandler의 속성)
@anchor{library/wsgiref wsgiref handlers BaseHandler server_software}@anchor{3f37}
@deffn {속성} server_software

@ref{3f38,,origin_server} 어트리뷰트가 설정된 경우, 이 어트리뷰트의 값은 기본 @code{SERVER_SOFTWARE} WSGI 환경 변수를 설정하는 데 사용되고, HTTP 응답의 기본 @code{Server:} 헤더를 설정하는 데도 사용됩니다. HTTP 오리진 서버가 아닌 처리기(가령 @ref{3f28,,BaseCGIHandler} 와 @ref{3f27,,CGIHandler})에서는 무시됩니다.


버전 3.3에서 변경: “Python”이라는 용어는 “CPython”, “Jython” 등과 같은 구현 특정 용어로 대체됩니다.

@end deffn

@geindex get_scheme() (wsgiref.handlers.BaseHandler 메서드)
@anchor{library/wsgiref wsgiref handlers BaseHandler get_scheme}@anchor{3f39}
@deffn {메서드} get_scheme ()

현재의 요청에 사용되고 있는 URL 스킴을 반환합니다. 기본 구현은 @ref{123,,wsgiref.util}의 @code{guess_scheme()} 함수를 사용하여, 현재 요청의 @code{environ} 변수를 기반으로, 스킴이 “http”와 “https” 중 어느 것인지 추측합니다.
@end deffn

@geindex setup_environ() (wsgiref.handlers.BaseHandler 메서드)
@anchor{library/wsgiref wsgiref handlers BaseHandler setup_environ}@anchor{3f3a}
@deffn {메서드} setup_environ ()

@code{environ} 어트리뷰트를 완전히 채워진 WSGI 환경으로 설정합니다. 기본 구현에서는 위의 모든 메서드와 어트리뷰트에 더해 @ref{3f2b,,get_stdin()}, @ref{3f2c,,get_stderr()} 및 @ref{3f2d,,add_cgi_vars()} 메서드와 @ref{3f3b,,wsgi_file_wrapper} 어트리뷰트를 모두 사용합니다. @ref{3f38,,origin_server} 어트리뷰트가 참이고 @ref{3f37,,server_software} 어트리뷰트가 설정된 경우 @code{SERVER_SOFTWARE} 키가 없으면 삽입합니다.
@end deffn

예외 처리를 사용자 정의하기 위한 메서드와 어트리뷰트:

@geindex log_exception() (wsgiref.handlers.BaseHandler 메서드)
@anchor{library/wsgiref wsgiref handlers BaseHandler log_exception}@anchor{3f3c}
@deffn {메서드} log_exception (exc_info)

`exc_info' 튜플을 서버 로그에 기록합니다. `exc_info'는 @code{(type, value, traceback)} 튜플입니다. 기본 구현은 요청의 @code{wsgi.errors} 스트림에 트레이스백을 쓰고 플러시 합니다. 서브 클래스는 이 메서드를 재정의해서, 형식을 변경하거나 출력의 대상을 바꾸거나, 관리자에게 트레이스백을 메일로 보내거나, 적절한 것으로 생각되는 다른 액션을 수행할 수 있습니다.
@end deffn

@geindex traceback_limit (wsgiref.handlers.BaseHandler의 속성)
@anchor{library/wsgiref wsgiref handlers BaseHandler traceback_limit}@anchor{3f3d}
@deffn {속성} traceback_limit

기본 @ref{3f3c,,log_exception()} 메서드에 의해 출력되는 트레이스백에 포함하는 프레임의 최대 수. @code{None}이면, 모든 프레임이 포함됩니다.
@end deffn

@geindex error_output() (wsgiref.handlers.BaseHandler 메서드)
@anchor{library/wsgiref wsgiref handlers BaseHandler error_output}@anchor{3f3e}
@deffn {메서드} error_output (environ, start_response)

이 메서드는 사용자를 위한 에러 페이지를 생성하는 WSGI 응용 프로그램입니다. 헤더가 클라이언트에 전송되기 전에 오류가 발생할 때만 호출됩니다.

이 메서드는 @code{sys.exception()}을 사용하여 현재 에러에 액세스할 수 있으며, 호출할 때 해당 정보를 `start_response'로 전달해야 합니다 (
@geindex Python 향상 제안; PEP 3333
PEP 3333@footnote{https://peps.python.org/pep-3333/}의 “에러 처리” 절에서 설명하듯이). 특히, `start_response' 콜러블은 @ref{3f1b,,StartResponse} 프로토콜을 따라야 합니다.

기본 구현은 @ref{3f3f,,error_status}, @ref{3f40,,error_headers} 및 @ref{3f41,,error_body} 어트리뷰트를 사용하여 출력 페이지를 생성합니다. 서브 클래스는 이것을 재정의하여, 더욱 동적인 에러 출력을 생성할 수 있습니다.

그러나, 보안 관점에서 오래된 사용자에게는 진단을 내보내지 않는 것이 좋습니다; 이상적으로, 진단 출력을 활성화하기 위해서는 특별한 것을 해야 합니다. 이것이 기본 구현이 아무것도 포함하지 않는 이유입니다.
@end deffn

@geindex error_status (wsgiref.handlers.BaseHandler의 속성)
@anchor{library/wsgiref wsgiref handlers BaseHandler error_status}@anchor{3f3f}
@deffn {속성} error_status

에러 응답에 사용되는 HTTP 상태. 
@geindex Python 향상 제안; PEP 3333
PEP 3333@footnote{https://peps.python.org/pep-3333/}에 정의된 상태 문자열이어야 합니다; 기본값은 500 코드와 메시지입니다.
@end deffn

@geindex error_headers (wsgiref.handlers.BaseHandler의 속성)
@anchor{library/wsgiref wsgiref handlers BaseHandler error_headers}@anchor{3f40}
@deffn {속성} error_headers

에러 응답에 사용되는 HTTP 헤더. 이것은 
@geindex Python 향상 제안; PEP 3333
PEP 3333@footnote{https://peps.python.org/pep-3333/}에서 설명하는 WSGI 응답 헤더 (@code{(name, value)} 튜플)의 리스트여야 합니다. 기본 리스트는 단지 콘텐츠 형식을 @code{text/plain}으로 설정합니다.
@end deffn

@geindex error_body (wsgiref.handlers.BaseHandler의 속성)
@anchor{library/wsgiref wsgiref handlers BaseHandler error_body}@anchor{3f41}
@deffn {속성} error_body

에러 응답 바디. 이것은 HTTP 응답 바디 바이트열이어야 합니다. 기본적으로 “A server error occurred.  Please contact the administrator.” 라는 단순 텍스트입니다.
@end deffn

@geindex Python 향상 제안; PEP 3333
PEP 3333@footnote{https://peps.python.org/pep-3333/}의 “선택적 플랫폼 특정 파일 처리” 기능을 위한 메서드와 어트리뷰트:

@geindex wsgi_file_wrapper (wsgiref.handlers.BaseHandler의 속성)
@anchor{library/wsgiref wsgiref handlers BaseHandler wsgi_file_wrapper}@anchor{3f3b}
@deffn {속성} wsgi_file_wrapper

@ref{3f15,,wsgiref.types.FileWrapper} 와 호환되는 @code{wsgi.file_wrapper} 팩토리나 @code{None}. 이 어트리뷰트의 기본값은 @ref{93e,,wsgiref.util.FileWrapper} 클래스입니다.
@end deffn

@geindex sendfile() (wsgiref.handlers.BaseHandler 메서드)
@anchor{library/wsgiref wsgiref handlers BaseHandler sendfile}@anchor{3f42}
@deffn {메서드} sendfile ()

플랫폼 특정 파일 전송을 구현하기 위해 재정의합니다. 이 메서드는 응용 프로그램의 반환 값이 @ref{3f3b,,wsgi_file_wrapper} 어트리뷰트로 지정된 클래스의 인스턴스일 때만 호출됩니다. 파일을 성공적으로 전송할 수 있었으면 참값을 반환해야 합니다. 그러면 기본 전송 코드가 실행되지 않습니다. 이 메서드의 기본 구현은 단지 거짓 값을 반환합니다.
@end deffn

기타 메서드와 어트리뷰트:

@geindex origin_server (wsgiref.handlers.BaseHandler의 속성)
@anchor{library/wsgiref wsgiref handlers BaseHandler origin_server}@anchor{3f38}
@deffn {속성} origin_server

특별한 @code{Status:} 헤더를 통해 HTTP 상태를 원하는 CGI와 같은 게이트웨이 프로토콜을 통하는 것이 아니라, 처리기의 @ref{3f2e,,_write()}와 @ref{3f2f,,_flush()}가 클라이언트와 직접 통신하는 데 사용되는 경우 이 어트리뷰트를 참으로 설정해야 합니다.

@ref{1dd0,,BaseHandler}에서는 이 어트리뷰트의 기본값이 참이지만, @ref{3f28,,BaseCGIHandler}와 @ref{3f27,,CGIHandler}에서는 거짓입니다.
@end deffn

@geindex http_version (wsgiref.handlers.BaseHandler의 속성)
@anchor{library/wsgiref wsgiref handlers BaseHandler http_version}@anchor{3f43}
@deffn {속성} http_version

@ref{3f38,,origin_server}가 참이면, 이 문자열 어트리뷰트를 사용하여 클라이언트로 보내는 응답 집합의 HTTP 버전을 설정합니다. 기본값은 @code{"1.0"}입니다.
@end deffn
@end deffn

@geindex read_environ() (wsgiref.handlers 모듈)
@anchor{library/wsgiref wsgiref handlers read_environ}@anchor{13be}
@deffn {함수} wsgiref.handlers.read_environ ()

CGI 변수를 @code{os.environ}에서 
@geindex Python 향상 제안; PEP 3333
PEP 3333@footnote{https://peps.python.org/pep-3333/} “유니코드에 들어있는 바이트열” 문자열로 변환하여, 새 딕셔너리를 반환합니다. 이 함수는 @code{os.environ}을 직접 사용하는 대신 @ref{3f27,,CGIHandler}와 @ref{3f29,,IISCGIHandler}에서 사용됩니다. @code{os.environ}은 파이썬 3을 사용하는 모든 플랫폼과 웹 서버에서 WSGI를 준수한다는 보장이 없습니다 – 구체적으로, OS의 실제 환경이 유니코드인 곳(가령 윈도우)이나 환경은 바이트열이지만 파이썬이 디코딩하기 위해 사용하는 시스템 인코딩이 ISO-8859-1 이외의 것인 곳(예를 들어 UTF-8을 사용하는 유닉스 시스템).

여러분 자신의 CGI 기반 처리기를 구현한다면, @code{os.environ}에서 직접 값을 복사하는 대신 이 루틴을 사용하는 것이 좋습니다.


Added in version 3.2.

@end deffn

@node wsgiref types – WSGI types for static type checking,예제<23>,wsgiref handlers – server/gateway base classes,wsgiref — WSGI 유틸리티와 참조 구현
@anchor{library/wsgiref module-wsgiref types}@anchor{122}@anchor{library/wsgiref wsgiref-types-wsgi-types-for-static-type-checking}@anchor{3f44}
@subsubsection @code{wsgiref.types} – WSGI types for static type checking


@geindex module; wsgiref.types

This module provides various types for static type checking as described
in 
@geindex Python 향상 제안; PEP 3333
PEP 3333@footnote{https://peps.python.org/pep-3333/}.


Added in version 3.11.


@geindex StartResponse (wsgiref.types 클래스)
@anchor{library/wsgiref wsgiref types StartResponse}@anchor{3f1b}
@deffn {클래스} wsgiref.types.StartResponse

A @ref{569,,typing.Protocol} describing 
@geindex Python 향상 제안; PEP 3333#the-start-response-callable
start_response()@footnote{https://peps.python.org/pep-3333/#the-start-response-callable}
callables (
@geindex Python 향상 제안; PEP 3333
PEP 3333@footnote{https://peps.python.org/pep-3333/}).
@end deffn

@geindex WSGIEnvironment (wsgiref.types 모듈)
@anchor{library/wsgiref wsgiref types WSGIEnvironment}@anchor{3f0e}
@deffn {데이터} wsgiref.types.WSGIEnvironment

A type alias describing a WSGI environment dictionary.
@end deffn

@geindex WSGIApplication (wsgiref.types 모듈)
@anchor{library/wsgiref wsgiref types WSGIApplication}@anchor{3f45}
@deffn {데이터} wsgiref.types.WSGIApplication

WSGI 응용 프로그램 콜러블을 기술하는 형 에일리어스.
@end deffn

@geindex InputStream (wsgiref.types 클래스)
@anchor{library/wsgiref wsgiref types InputStream}@anchor{3f31}
@deffn {클래스} wsgiref.types.InputStream

A @ref{569,,typing.Protocol} describing a 
@geindex Python 향상 제안; PEP 3333#input-and-error-streams
WSGI Input Stream@footnote{https://peps.python.org/pep-3333/#input-and-error-streams}.
@end deffn

@geindex ErrorStream (wsgiref.types 클래스)
@anchor{library/wsgiref wsgiref types ErrorStream}@anchor{3f32}
@deffn {클래스} wsgiref.types.ErrorStream

A @ref{569,,typing.Protocol} describing a 
@geindex Python 향상 제안; PEP 3333#input-and-error-streams
WSGI Error Stream@footnote{https://peps.python.org/pep-3333/#input-and-error-streams}.
@end deffn

@geindex FileWrapper (wsgiref.types 클래스)
@anchor{library/wsgiref wsgiref types FileWrapper}@anchor{3f15}
@deffn {클래스} wsgiref.types.FileWrapper

A @ref{569,,typing.Protocol} describing a 
@geindex Python 향상 제안; PEP 3333#optional-platform-specific-file-handling
file wrapper@footnote{https://peps.python.org/pep-3333/#optional-platform-specific-file-handling}.
See @ref{93e,,wsgiref.util.FileWrapper} for a concrete implementation of this
protocol.
@end deffn

@node 예제<23>,,wsgiref types – WSGI types for static type checking,wsgiref — WSGI 유틸리티와 참조 구현
@anchor{library/wsgiref examples}@anchor{3f46}
@subsubsection 예제


이것은 작동하는 “Hello World” WSGI 응용 프로그램으로, `start_response' 콜러블은 @ref{3f1b,,StartResponse} 프로토콜을 따라야 합니다:

@example
"""
모든 WSGI 응용 프로그램은 응용 프로그램 객체를 가져야
합니다 - 두 개의 인자를 받아들이는 콜러블. 이를 위해,
함수를 사용하려고 합니다 (함수로 제한되지는 않습니다,
예를 들어 클래스를 사용할 수 있습니다). 함수에 전달되는
첫 번째 인자는 CGI 스타일 환경 변수를 포함하는 딕셔너리이고,
두 번째 변수는 콜러블 객체입니다.
"""
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 헤더
    start_response(status, headers)

    # 반환된 객체가 인쇄될 것입니다.
    return [b"Hello World"]

with make_server("", 8000, hello_world_app) as httpd:
    print("Serving on port 8000...")

    # 프로세스를 죽일 때까지 서빙합니다
    httpd.serve_forever()
@end example

현재 디렉터리를 제공하는 WSGI 응용 프로그램의 예, 명령 줄에서 선택적 디렉터리와 포트 번호(기본값: 8000)를 받아들입니다:

@example
"""
작은 wsgiref 기반 웹 서버. 서비스할 경로와 선택적
포트 번호(기본값 8000)를 취한 다음, 파일을 서비스하려고
시도합니다. 파일 이름에서 MIME 유형을 추측하고, 파일을
찾을 수 없으면 404 에러를 발생시킵니다.
"""
import mimetypes
import os
import sys
from wsgiref import simple_server, util


def app(environ, respond):
    # 파일 이름과 MIME 유형을 가져옵니다
    fn = os.path.join(path, environ["PATH_INFO"][1:])
    if "." not in fn.split(os.path.sep)[-1]:
        fn = os.path.join(fn, "index.html")
    mime_type = mimetypes.guess_file_type(fn)[0]

    # 파일이 존재하면 200 OK 를, 그렇지 않으면 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__":
    # 명령줄 인자에서 경로와 포트를 가져옵니다
    path = sys.argv[1] if len(sys.argv) > 1 else os.getcwd()
    port = int(sys.argv[2]) if len(sys.argv) > 2 else 8000

    # control-c 를 누를 때까지 서버를 만들고 시작합니다
    httpd = simple_server.make_server("", port, app)
    print(f"Serving @{path@} on port @{port@}, control-C to stop")
    try:
        httpd.serve_forever()
    except KeyboardInterrupt:
        print("Shutting down.")
        httpd.server_close()
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node urllib — URL 처리 모듈,urllib request — URL을 열기 위한 확장 가능한 라이브러리,wsgiref — WSGI 유틸리티와 참조 구현,인터넷 프로토콜과 지원
@anchor{library/urllib doc}@anchor{3f47}@anchor{library/urllib module-urllib}@anchor{10e}@anchor{library/urllib translation-repo}@anchor{3f48}@anchor{library/urllib urllib-url-handling-modules}@anchor{3f49}
@subsection @code{urllib} — URL 처리 모듈


@geindex module; urllib

`소스 코드:' Lib/urllib/@footnote{https://github.com/python/cpython/tree/3.14/Lib/urllib/}


__________________________________________________________________


@code{urllib}는 URL 작업을 위한 여러 모듈을 모은 패키지입니다.:


@itemize *

@item 
URL을 열고 읽기 위한 @ref{111,,urllib.request}

@item 
@ref{111,,urllib.request}에 의해 발생하는 예외를 포함하는 @ref{10f,,urllib.error}

@item 
URL 구문 분석을 위한 @ref{110,,urllib.parse}

@item 
@code{robots.txt} 파일을 구문 분석하기 위한 @ref{113,,urllib.robotparser}
@end itemize

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node urllib request — URL을 열기 위한 확장 가능한 라이브러리,urllib response — Response classes used by urllib,urllib — URL 처리 모듈,인터넷 프로토콜과 지원
@anchor{library/urllib request doc}@anchor{3f4a}@anchor{library/urllib request module-urllib request}@anchor{111}@anchor{library/urllib request translation-repo}@anchor{3f4b}@anchor{library/urllib request urllib-request-extensible-library-for-opening-urls}@anchor{3f4c}
@subsection @code{urllib.request} — URL을 열기 위한 확장 가능한 라이브러리


@geindex module; urllib.request

`소스 코드:' Lib/urllib/request.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/urllib/request.py}


__________________________________________________________________


The @code{urllib.request} module defines functions and classes which help in
opening URLs (mostly HTTP) in a complex world — basic and digest
authentication, redirections, cookies and more.


@subsubheading 더 보기


더 고수준 HTTP 클라이언트 인터페이스로 Requests 패키지@footnote{https://requests.readthedocs.io/en/master/}를 권장합니다.


@cartouche
@quotation 경고 
On macOS it is unsafe to use this module in programs using
@ref{4b6,,os.fork()} because the @ref{3f4d,,getproxies()} implementation for
macOS uses a higher-level system API. Set the environment variable
@code{no_proxy} to @code{*} to avoid this problem
(e.g. @code{os.environ["no_proxy"] = "*"}).
@end quotation
@end cartouche

@c include for modules that don't work on WASM

@ref{213c,,가용성}: not WASI.

이 모듈은 웹어셈블리에서 작동하지 않거나 제공되지 않습니다. 자세한 내용은 @ref{1b68,,웹어셈블리 플랫폼}을 참조하세요.

The @code{urllib.request} module defines the following functions:

@geindex urlopen() (urllib.request 모듈)
@anchor{library/urllib request urllib request urlopen}@anchor{307}
@deffn {함수} urllib.request.urlopen (url, data=None[, timeout], *, context=None)

유효하고, 올바르게 인코딩된 URL을 포함하는 문자열이나 @ref{11d7,,Request} 객체일 수 있는, `url'을 엽니다.

`data'는 서버로 전송할 추가 데이터를 지정하는 객체이거나, 그러한 데이터가 필요하지 않으면 @code{None}이어야 합니다. 자세한 내용은 @ref{11d7,,Request}를 참조하십시오.

urllib.request 모듈은 HTTP/1.1을 사용하고 HTTP 요청에 @code{Connection:close} 헤더를 포함합니다.

선택적 `timeout' 매개 변수는 연결 시도와 같은 연산을 블로킹하기 위한 시간제한을 초 단위로 지정합니다 (지정하지 않으면 전역 기본 시간제한 설정이 사용됩니다). 이것은 실제로는 HTTP, HTTPS 및 FTP 연결에서만 작동합니다.

`context'가 지정되면, 다양한 SSL 옵션을 기술하는 @ref{357,,ssl.SSLContext} 인스턴스이어야 합니다. 자세한 내용은 @ref{d35,,HTTPSConnection}을 참조하십시오.

이 함수는 항상 @ref{1e1,,컨텍스트 관리자}로 작동할 수 있고 `url', `headers' 및 `status' 프로퍼티를 가진 객체를 반환합니다. 이러한 프로퍼티에 대한 자세한 내용은 @ref{3f4e,,urllib.response.addinfourl}을 참조하십시오.

HTTP 및 HTTPS URL의 경우, 이 함수는 약간 수정된 @ref{12d3,,http.client.HTTPResponse} 객체를 반환합니다. 위의 세 가지 새로운 메서드 외에도, msg 어트리뷰트에는 @code{HTTPResponse} 설명서에 지정된 대로 응답 헤더 대신 @ref{3f4f,,reason} 어트리뷰트와 — 서버가 반환한 이유 문구 — 같은 정보가 포함됩니다.

For FTP, file, and data URLs, this function
returns a @ref{3f4e,,urllib.response.addinfourl} object.

프로토콜 에러 시 @ref{2be,,URLError}를 발생시킵니다.

아무런 처리기도 요청을 처리하지 않으면 @code{None}이 반환될 수 있습니다 (기본 설치된 전역 @ref{3f50,,OpenerDirector}는 @ref{3f51,,UnknownHandler}를 사용하여 이러한 상황이 발생하지 않도록 합니다).

또한, 프락시 설정이 감지되면 (예를 들어, @code{http_proxy}와 같은 @code{*_proxy} 환경 변수가 설정될 때), @ref{1db2,,ProxyHandler}가 기본적으로 설치되어 프락시를 통해 요청이 처리되도록 합니다.

파이썬 2.6 및 이전 버전의 레거시 @code{urllib.urlopen} 함수는 중단되었습니다; @ref{307,,urllib.request.urlopen()}는 이전 @code{urllib2.urlopen}에 해당합니다. 딕셔너리 매개 변수를 @code{urllib.urlopen}에 전달하여 수행되었던 프락시 처리는 @ref{1db2,,ProxyHandler} 객체를 사용하여 얻을 수 있습니다.

기본 오프너는 요청 객체에서 취한 인자 @code{fullurl}, @code{data}, @code{headers}, @code{method}로 @ref{1c6c,,감사 이벤트} @code{urllib.Request}를 발생시킵니다.


버전 3.2에서 변경: `cafile'과 `capath'가 추가되었습니다.

가능하다면 (즉, @ref{3a0d,,ssl.HAS_SNI}가 참이라면) HTTPS 가상 호스트가 지원됩니다.

`data'는 이터러블 객체일 수 있습니다.



버전 3.3에서 변경: `cadefault'가 추가되었습니다.



버전 3.4.3에서 변경: `context'가 추가되었습니다.



버전 3.10에서 변경: HTTPS connection now send an ALPN extension with protocol indicator
@code{http/1.1} when no `context' is given. Custom `context' should set
ALPN protocols with @ref{1063,,set_alpn_protocols()}.



버전 3.13에서 변경: Remove `cafile', `capath' and `cadefault' parameters: use the `context'
parameter instead.

@end deffn

@geindex install_opener() (urllib.request 모듈)
@anchor{library/urllib request urllib request install_opener}@anchor{3f52}
@deffn {함수} urllib.request.install_opener (opener)

@ref{3f50,,OpenerDirector} 인스턴스를 기본 전역 오프너로 설치합니다. 오프너 설치는 urlopen이 해당 오프너를 사용하도록 하려는 경우에만 필요합니다; 그렇지 않으면 단순히 @ref{307,,urlopen()} 대신 @ref{11db,,OpenerDirector.open()}을 호출하십시오. 코드는 실제 @code{OpenerDirector}를 확인하지 않으며, 적절한 인터페이스를 가진 클래스면 모두 작동합니다.
@end deffn

@geindex build_opener() (urllib.request 모듈)
@anchor{library/urllib request urllib request build_opener}@anchor{309}
@deffn {함수} urllib.request.build_opener ([handler, ...])

주어진 순서대로 처리기를 연결하는 @ref{3f50,,OpenerDirector} 인스턴스를 반환합니다. `handler'는 @ref{3f53,,BaseHandler}의 인스턴스이거나 @code{BaseHandler}의 서브 클래스(이 경우 매개 변수 없이 생성자를 호출할 수 있어야 합니다)일 수 있습니다. 다음과 같은 클래스들의 인스턴스는 `handler'에 그들, 그들의 인스턴스 또는 그들의 서브 클래스가 포함되지 않는 한 `handler' 앞에 있습니다: @ref{1db2,,ProxyHandler} (프락시 설정이 감지되는 경우), @ref{3f51,,UnknownHandler}, @ref{ef7,,HTTPHandler}, @ref{3f54,,HTTPDefaultErrorHandler}, @ref{3f55,,HTTPRedirectHandler}, @ref{3f56,,FTPHandler}, @ref{3f57,,FileHandler}, @ref{3f58,,HTTPErrorProcessor}.

파이썬 설치에 SSL 지원이 있으면 (즉, @ref{d5,,ssl} 모듈을 임포트 할 수 있으면) @ref{1428,,HTTPSHandler}도 추가됩니다.

@ref{3f53,,BaseHandler} 서브 클래스는 또한 @code{handler_order} 어트리뷰트를 변경하여 처리기 리스트에서 자신의 위치를 수정할 수 있습니다.
@end deffn

@geindex pathname2url() (urllib.request 모듈)
@anchor{library/urllib request urllib request pathname2url}@anchor{2bf}
@deffn {함수} urllib.request.pathname2url (path, *, add_scheme=False)

Convert the given local path to a @code{file:} URL. This function uses
@ref{d9b,,quote()} function to encode the path.

If `add_scheme' is false (the default), the return value omits the
@code{file:} scheme prefix. Set `add_scheme' to true to return a complete URL.

This example shows the function being used on Windows:

@example
>>> from urllib.request import pathname2url
>>> path = 'C:\\Program Files'
>>> pathname2url(path, add_scheme=True)
'file:///C:/Program%20Files'
@end example


버전 3.14에서 변경: Windows drive letters are no longer converted to uppercase, and @code{:}
characters not following a drive letter no longer cause an
@ref{2c0,,OSError} exception to be raised on Windows.



버전 3.14에서 변경: Paths beginning with a slash are converted to URLs with authority
sections. For example, the path @code{/etc/hosts} is converted to
the URL @code{///etc/hosts}.



버전 3.14에서 변경: The `add_scheme' parameter was added.

@end deffn

@geindex url2pathname() (urllib.request 모듈)
@anchor{library/urllib request urllib request url2pathname}@anchor{2bd}
@deffn {함수} urllib.request.url2pathname (url, *, require_scheme=False, resolve_host=False)

Convert the given @code{file:} URL to a local path. This function uses
@ref{1af9,,unquote()} to decode the URL.

If `require_scheme' is false (the default), the given value should omit a
@code{file:} scheme prefix. If `require_scheme' is set to true, the given
value should include the prefix; a @ref{2be,,URLError} is raised
if it doesn’t.

The URL authority is discarded if it is empty, @code{localhost}, or the local
hostname. Otherwise, if `resolve_host' is set to true, the authority is
resolved using @ref{39cd,,socket.gethostbyname()} and discarded if it matches a
local IP address (as per 
@geindex RFC; RFC 8089 Section 3
RFC 8089 §3@footnote{https://datatracker.ietf.org/doc/html/rfc8089.html#section-3}). If the
authority is still unhandled, then on Windows a UNC path is returned, and
on other platforms a @ref{2be,,URLError} is raised.

This example shows the function being used on Windows:

@example
>>> from urllib.request import url2pathname
>>> url = 'file:///C:/Program%20Files'
>>> url2pathname(url, require_scheme=True)
'C:\\Program Files'
@end example


버전 3.14에서 변경: Windows drive letters are no longer converted to uppercase, and @code{:}
characters not following a drive letter no longer cause an
@ref{2c0,,OSError} exception to be raised on Windows.



버전 3.14에서 변경: The URL authority is discarded if it matches the local hostname.
Otherwise, if the authority isn’t empty or @code{localhost}, then on
Windows a UNC path is returned (as before), and on other platforms a
@ref{2be,,URLError} is raised.



버전 3.14에서 변경: The URL query and fragment components are discarded if present.



버전 3.14에서 변경: The `require_scheme' and `resolve_host' parameters were added.

@end deffn

@geindex getproxies() (urllib.request 모듈)
@anchor{library/urllib request urllib request getproxies}@anchor{3f4d}
@deffn {함수} urllib.request.getproxies ()

이 도우미 함수는 스킴에서 프락시 서버 URL로 매핑하는 딕셔너리를 반환합니다. 먼저 모든 운영 체제에서 대소 문자를 구분하지 않는 방식으로 @code{<scheme>_proxy}라는 변수를 환경에서 스캔하고, 찾을 수 없으면 macOS의 시스템 구성과 윈도우의 윈도우 시스템 레지스트리에서 프락시 정보를 찾습니다. 소문자와 대문자 환경 변수가 모두 존재하면 (그리고 다른 값을 가지면), 소문자가 선호됩니다.

@cartouche
@quotation 참고 
일반적으로 스크립트가 CGI 환경에서 실행 중임을 나타내는 환경 변수 @code{REQUEST_METHOD}가 설정되면, 환경 변수 @code{HTTP_PROXY}(대문자 @code{_PROXY})는 무시됩니다. 이 변수는 “Proxy:” HTTP 헤더를 사용하여 클라이언트가 주입할 수 있기 때문입니다. CGI 환경에서 HTTP 프락시를 사용해야 하면, @code{ProxyHandler}를 명시적으로 사용하거나 변수 이름이 소문자(또는 적어도 @code{_proxy} 접미사)가 되도록 하십시오.
@end quotation
@end cartouche
@end deffn

다음과 같은 클래스가 제공됩니다:

@geindex Request (urllib.request 클래스)
@anchor{library/urllib request urllib request Request}@anchor{11d7}
@deffn {클래스} urllib.request.Request (url, data=None, headers=@{@}, origin_req_host=None, unverifiable=False, method=None)

이 클래스는 URL 요청의 추상화입니다.

`url'은 유효하고 올바르게 인코딩된 URL을 포함하는 문자열이어야 합니다.

`data'는 서버로 전송할 추가 데이터를 지정하는 객체이거나, 그러한 데이터가 필요하지 않으면 @code{None}이어야 합니다. 현재 HTTP 요청은 `data'를 사용하는 유일한 요청입니다. 지원되는 객체 형에는 바이트열, 파일류 객체 및 바이트열류 객체의 이터러블이 포함됩니다. @code{Content-Length}와 @code{Transfer-Encoding} 헤더 필드가 모두 제공되지 않으면, @ref{ef7,,HTTPHandler}는 `data'의 형에 따라 이러한 헤더를 설정합니다. @code{Content-Length}는 바이트열 객체를 보내는 데 사용되는 반면, 
@geindex RFC; RFC 7230
RFC 7230@footnote{https://datatracker.ietf.org/doc/html/rfc7230.html}, 섹션 3.3.1에 지정된 @code{Transfer-Encoding: chunked}는 파일과 다른 이터러블을 보내는 데 사용됩니다.

HTTP POST 요청 메서드의 경우, `data'는 표준 @code{application/x-www-form-urlencoded} 형식의 버퍼여야 합니다. @ref{1094,,urllib.parse.urlencode()} 함수는 매핑이나 2-튜플의 시퀀스를 취하고 이 형식의 ASCII 문자열을 반환합니다. `data' 매개 변수로 사용되기 전에 바이트열로 인코딩되어야 합니다.

`headers'는 딕셔너리이어야 하며, 각 키와 값을 인자로 사용하여 @ref{3f59,,add_header()}가 호출된 것처럼 처리됩니다. 이것은 종종 브라우저가 자신을 식별하는 데 사용하는 @code{User-Agent} 헤더 값을 “스푸핑” 하는 데 사용됩니다 – 일부 HTTP 서버는 스크립트가 아닌 일반 브라우저에서 오는 요청만 허용합니다. 예를 들어, Mozilla Firefox는 자신을 @code{"Mozilla/5.0 (X11; U; Linux i686) Gecko/20071127 Firefox/2.0.0.11"}로 식별하는 반면, @ref{10e,,urllib}의 기본 사용자 에이전트 문자열은 @code{"Python-urllib/2.6"} (파이썬 2.6에서) 입니다. 모든 헤더 키는 카멜 표기법(camel case)으로 전송됩니다.

`data' 인자가 있으면 적절한 @code{Content-Type} 헤더가 포함되어야 합니다. 이 헤더가 제공되지 않고 `data'가 @code{None}이 아니면, @code{Content-Type: application/x-www-form-urlencoded}가 기본값으로 추가됩니다.

다음 두 인자는 제삼자 HTTP 쿠키를 올바르게 처리하는 데에만 관심이 있습니다:

`origin_req_host'는 
@geindex RFC; RFC 2965
RFC 2965@footnote{https://datatracker.ietf.org/doc/html/rfc2965.html}에 의해 정의된 대로 오리진 트랜잭션의 요청 호스트여야 합니다. 기본값은 @code{http.cookiejar.request_host(self)}입니다. 이것은 사용자가 시작한 원래 요청의 호스트 이름이나 IP 주소입니다. 예를 들어, HTML 문서의 이미지에 대한 요청이면, 이미지가 포함된 페이지에 대한 요청의 요청 호스트여야 합니다.

`unverifiable'은 
@geindex RFC; RFC 2965
RFC 2965@footnote{https://datatracker.ietf.org/doc/html/rfc2965.html}에서 정의한 대로 요청을 확인할 수 없는지를 표시해야 합니다. 기본값은 @code{False}입니다. 확인할 수 없는 요청은 사용자에게 URL에 대한 승인 옵션이 없는 요청입니다. 예를 들어, HTML 문서의 이미지에 대한 요청이고, 사용자에게 이미지의 자동 가져오기를 승인할 수 있는 옵션이 없으면, 이것은 참이어야 합니다.

`method'는 사용될 HTTP 요청 메서드를 나타내는 문자열이어야 합니다 (예를 들어 @code{'HEAD'}). 제공되면, 해당 값은 @ref{11d8,,method} 어트리뷰트에 저장되고 @ref{136e,,get_method()}에서 사용됩니다. 기본값은 `data'가 @code{None}이면 @code{'GET'}이고, 그렇지 않으면 @code{'POST'}입니다. 서브 클래스는 클래스 자체에서 @code{method} 어트리뷰트를 설정하여 다른 기본 메서드를 나타낼 수 있습니다.

@cartouche
@quotation 참고 
data 객체가 콘텐츠를 두 번 이상 (예를 들어 콘텐츠를 한 번만 생성 할 수 있는 파일이나 이터러블) 전달할 수 없고 요청이 HTTP 리디렉션이나 인증을 위해 재시도되는 경우, 요청이 예상대로 작동하지 않습니다. `data'는 헤더 바로 다음에 HTTP 서버로 전송됩니다. 라이브러리에서 100-continue 예상(expectation)을 지원하지 않습니다.
@end quotation
@end cartouche


버전 3.3에서 변경: @ref{11d8,,Request.method} 인자가 Request 클래스에 추가됩니다.



버전 3.4에서 변경: 클래스 수준에서 기본 @ref{11d8,,Request.method}를 지정할 수 있습니다.



버전 3.6에서 변경: @code{Content-Length}가 제공되지 않고 `data'가 @code{None}이나 바이트열 객체가 아닐 때 에러를 발생시키지 앖습니다. 대신 청크 전송 인코딩(chunked transfer encoding)으로 폴백 합니다.

@end deffn

@geindex OpenerDirector (urllib.request 클래스)
@anchor{library/urllib request urllib request OpenerDirector}@anchor{3f50}
@deffn {클래스} urllib.request.OpenerDirector

@ref{3f50,,OpenerDirector} 클래스는 서로 연결된 @ref{3f53,,BaseHandler}들을 통해 URL을 엽니다. 처리기 연결과 에러 복구를 관리합니다.
@end deffn

@geindex BaseHandler (urllib.request 클래스)
@anchor{library/urllib request urllib request BaseHandler}@anchor{3f53}
@deffn {클래스} urllib.request.BaseHandler

이것은 등록된 모든 처리기의 베이스 클래스이며 — 간단한 등록 메커니즘만 처리합니다.
@end deffn

@geindex HTTPDefaultErrorHandler (urllib.request 클래스)
@anchor{library/urllib request urllib request HTTPDefaultErrorHandler}@anchor{3f54}
@deffn {클래스} urllib.request.HTTPDefaultErrorHandler

HTTP 에러 응답에 대한 기본 처리기를 정의하는 클래스; 모든 응답은 @ref{11dd,,HTTPError} 예외로 바뀝니다.
@end deffn

@geindex HTTPRedirectHandler (urllib.request 클래스)
@anchor{library/urllib request urllib request HTTPRedirectHandler}@anchor{3f55}
@deffn {클래스} urllib.request.HTTPRedirectHandler

리디렉션을 처리하는 클래스.
@end deffn

@geindex HTTPCookieProcessor (urllib.request 클래스)
@anchor{library/urllib request urllib request HTTPCookieProcessor}@anchor{3f5a}
@deffn {클래스} urllib.request.HTTPCookieProcessor (cookiejar=None)

HTTP 쿠키를 처리하는 클래스.
@end deffn

@geindex ProxyHandler (urllib.request 클래스)
@anchor{library/urllib request urllib request ProxyHandler}@anchor{1db2}
@deffn {클래스} urllib.request.ProxyHandler (proxies=None)

요청이 프락시를 거치게 합니다. `proxies'가 제공되면, 프로토콜 이름을 프락시 URL로 매핑하는 딕셔너리여야 합니다. 기본값은 환경 변수 @code{<protocol>_proxy}에서 프락시 목록을 읽는 것입니다. 프락시 환경 변수가 설정되어 있지 않으면, 윈도우 환경에서는 레지스트리의 인터넷 설정 섹션에서 프락시 설정을 가져오고, macOS 환경에서는 프락시 정보를 시스템 구성 프레임워크에서 가져옵니다.

자동 감지 프락시를 비활성화하려면 빈 딕셔너리를 전달하십시오.

@geindex no_proxy
@geindex 환경 변수; no_proxy
@code{no_proxy} 환경 변수를 사용하여 프락시를 통해 도달해서는 안 되는 호스트를 지정할 수 있습니다; 설정되면, 쉼표로 구분된 호스트 이름 접미사의 목록이어야 하며, 선택적으로 @code{:port}가 추가됩니다, 예를 들어 @code{cern.ch,ncsa.uiuc.edu,some.host:8080}.

@cartouche
@quotation 참고 
변수 @code{REQUEST_METHOD}가 설정되면 @code{HTTP_PROXY}는 무시됩니다; @ref{3f4d,,getproxies()}의 설명서를 참조하십시오.
@end quotation
@end cartouche
@end deffn

@geindex HTTPPasswordMgr (urllib.request 클래스)
@anchor{library/urllib request urllib request HTTPPasswordMgr}@anchor{3f5b}
@deffn {클래스} urllib.request.HTTPPasswordMgr

@code{(realm, uri) -> (user, password)} 매핑 데이터베이스를 유지합니다.
@end deffn

@geindex HTTPPasswordMgrWithDefaultRealm (urllib.request 클래스)
@anchor{library/urllib request urllib request HTTPPasswordMgrWithDefaultRealm}@anchor{3f5c}
@deffn {클래스} urllib.request.HTTPPasswordMgrWithDefaultRealm

@code{(realm, uri) -> (user, password)} 매핑 데이터베이스를 유지합니다. @code{None} realm은 포괄(catch-all) 영역으로 간주하며 다른 영역에 맞지 않으면 검색됩니다.
@end deffn

@geindex HTTPPasswordMgrWithPriorAuth (urllib.request 클래스)
@anchor{library/urllib request urllib request HTTPPasswordMgrWithPriorAuth}@anchor{1093}
@deffn {클래스} urllib.request.HTTPPasswordMgrWithPriorAuth

@code{uri -> is_authenticated} 매핑 데이터베이스도 포함하는 @ref{3f5c,,HTTPPasswordMgrWithDefaultRealm}의 변형. BasicAuth 처리기에서 @code{401} 응답을 먼저 기다리는 대신 인증 자격 증명을 언제 보낼 것인지 결정하는 데 사용할 수 있습니다.


Added in version 3.5.

@end deffn

@geindex AbstractBasicAuthHandler (urllib.request 클래스)
@anchor{library/urllib request urllib request AbstractBasicAuthHandler}@anchor{1c6d}
@deffn {클래스} urllib.request.AbstractBasicAuthHandler (password_mgr=None)

원격 호스트와 프락시 모두에서 HTTP 인증을 돕는 믹스인 클래스입니다. `password_mgr'이 주어지면 @ref{3f5b,,HTTPPasswordMgr} 과 호환되는 것이어야 합니다; 지원해야 하는 인터페이스에 대한 정보는 섹션 @ref{3f5d,,HTTPPasswordMgr 객체}를 참조하십시오. `passwd_mgr'이 @code{is_authenticated}와 @code{update_authenticated} 메서드도 제공하면 (@ref{3f5e,,HTTPPasswordMgrWithPriorAuth 객체}를 참조하십시오), 처리기는 지정된 URI에 대해 @code{is_authenticated} 결과를 사용하여 요청과 함께 인증 자격 증명을 보낼지를 판별합니다. @code{is_authenticated}가 URI에 대해 @code{True}를 반환하면, 자격 증명이 전송됩니다. @code{is_authenticated}가 @code{False}이면, 자격 증명이 전송되지 않으며, 그런 다음 @code{401} 응답이 수신되면 요청이 인증 자격 증명과 함께 다시 전송됩니다. 인증이 성공하면, 이 URI에 대해 @code{is_authenticated}를 @code{True}로 설정하기 위해 @code{update_authenticated}가 호출되어서, 이 URI나 모든 슈퍼 URI에 대한 후속 요청에 인증 자격 증명이 자동으로 포함됩니다.


Added in version 3.5: @code{is_authenticated} 지원이 추가되었습니다.

@end deffn

@geindex HTTPBasicAuthHandler (urllib.request 클래스)
@anchor{library/urllib request urllib request HTTPBasicAuthHandler}@anchor{3f5f}
@deffn {클래스} urllib.request.HTTPBasicAuthHandler (password_mgr=None)

원격 호스트와의 인증을 처리합니다. `password_mgr'이 주어지면 @ref{3f5b,,HTTPPasswordMgr} 과 호환되는 것이어야 합니다; 지원해야 하는 인터페이스에 대한 정보는 섹션 @ref{3f5d,,HTTPPasswordMgr 객체}를 참조하십시오. 잘못된 인증 스킴(Authentication scheme)을 제시하면 HTTPBasicAuthHandler 가 @ref{2ec,,ValueError}를 발생시킵니다.
@end deffn

@geindex ProxyBasicAuthHandler (urllib.request 클래스)
@anchor{library/urllib request urllib request ProxyBasicAuthHandler}@anchor{3f60}
@deffn {클래스} urllib.request.ProxyBasicAuthHandler (password_mgr=None)

프락시와의 인증을 처리합니다. `password_mgr'이 주어지면 @ref{3f5b,,HTTPPasswordMgr} 과 호환되는 것이어야 합니다; 지원해야 하는 인터페이스에 대한 정보는 섹션 @ref{3f5d,,HTTPPasswordMgr 객체}를 참조하십시오.
@end deffn

@geindex AbstractDigestAuthHandler (urllib.request 클래스)
@anchor{library/urllib request urllib request AbstractDigestAuthHandler}@anchor{1d68}
@deffn {클래스} urllib.request.AbstractDigestAuthHandler (password_mgr=None)

원격 호스트와 프락시 모두에서 HTTP 인증을 돕는 믹스인 클래스입니다. `password_mgr'이 주어지면 @ref{3f5b,,HTTPPasswordMgr} 과 호환되는 것이어야 합니다; 지원해야 하는 인터페이스에 대한 정보는 섹션 @ref{3f5d,,HTTPPasswordMgr 객체}를 참조하십시오.


버전 3.14에서 변경: Added support for HTTP digest authentication algorithm @code{SHA-256}.

@end deffn

@geindex HTTPDigestAuthHandler (urllib.request 클래스)
@anchor{library/urllib request urllib request HTTPDigestAuthHandler}@anchor{3f61}
@deffn {클래스} urllib.request.HTTPDigestAuthHandler (password_mgr=None)

원격 호스트와의 인증을 처리합니다. `password_mgr'이 주어지면 @ref{3f5b,,HTTPPasswordMgr} 과 호환되는 것이어야 합니다; 지원해야 하는 인터페이스에 대한 정보는 섹션 @ref{3f5d,,HTTPPasswordMgr 객체}를 참조하십시오. 다이제스트 인증 처리기와 기본 인증 처리기가 모두 추가되면, 다이제스트 인증이 항상 먼저 시도됩니다. 다이제스트 인증이 다시 40x 응답을 반환하면, 기본 인증 처리기로 보내 처리됩니다. 이 처리기 메서드는 Digest나 Basic 이외의 인증 스킴(authentication scheme)이 제공될 때 @ref{2ec,,ValueError}를 발생시킵니다.


버전 3.3에서 변경: 지원되지 않는 인증 스킴에 대해 @ref{2ec,,ValueError}를 발생시킵니다.

@end deffn

@geindex ProxyDigestAuthHandler (urllib.request 클래스)
@anchor{library/urllib request urllib request ProxyDigestAuthHandler}@anchor{3f62}
@deffn {클래스} urllib.request.ProxyDigestAuthHandler (password_mgr=None)

프락시와의 인증을 처리합니다. `password_mgr'이 주어지면 @ref{3f5b,,HTTPPasswordMgr} 과 호환되는 것이어야 합니다; 지원해야 하는 인터페이스에 대한 정보는 섹션 @ref{3f5d,,HTTPPasswordMgr 객체}를 참조하십시오.
@end deffn

@geindex HTTPHandler (urllib.request 클래스)
@anchor{library/urllib request urllib request HTTPHandler}@anchor{ef7}
@deffn {클래스} urllib.request.HTTPHandler

HTTP URL 열기를 처리하는 클래스.
@end deffn

@geindex HTTPSHandler (urllib.request 클래스)
@anchor{library/urllib request urllib request HTTPSHandler}@anchor{1428}
@deffn {클래스} urllib.request.HTTPSHandler (debuglevel=0, context=None, check_hostname=None)

HTTPS URL 열기를 처리하는 클래스. `context'와 `check_hostname'은 @ref{d35,,http.client.HTTPSConnection}과 같은 의미입니다.


버전 3.2에서 변경: `context'와 `check_hostname'이 추가되었습니다.

@end deffn

@geindex FileHandler (urllib.request 클래스)
@anchor{library/urllib request urllib request FileHandler}@anchor{3f57}
@deffn {클래스} urllib.request.FileHandler

로컬 파일을 엽니다.
@end deffn

@geindex DataHandler (urllib.request 클래스)
@anchor{library/urllib request urllib request DataHandler}@anchor{11d6}
@deffn {클래스} urllib.request.DataHandler

데이터 URL을 엽니다.


Added in version 3.4.

@end deffn

@geindex FTPHandler (urllib.request 클래스)
@anchor{library/urllib request urllib request FTPHandler}@anchor{3f56}
@deffn {클래스} urllib.request.FTPHandler

FTP URL을 엽니다.
@end deffn

@geindex CacheFTPHandler (urllib.request 클래스)
@anchor{library/urllib request urllib request CacheFTPHandler}@anchor{1a98}
@deffn {클래스} urllib.request.CacheFTPHandler

지연 시간을 최소화하기 위해 열린 FTP 연결의 캐시를 유지하면서, FTP URL을 엽니다.
@end deffn

@geindex UnknownHandler (urllib.request 클래스)
@anchor{library/urllib request urllib request UnknownHandler}@anchor{3f51}
@deffn {클래스} urllib.request.UnknownHandler

알 수 없는 URL을 처리하기 위한 포괄적인(catch-all) 클래스.
@end deffn

@geindex HTTPErrorProcessor (urllib.request 클래스)
@anchor{library/urllib request urllib request HTTPErrorProcessor}@anchor{3f58}
@deffn {클래스} urllib.request.HTTPErrorProcessor

HTTP 에러 응답을 처리합니다.
@end deffn

@menu
* Request 객체:: 
* OpenerDirector 객체:: 
* BaseHandler 객체:: 
* HTTPRedirectHandler 객체:: 
* HTTPCookieProcessor 객체:: 
* ProxyHandler 객체:: 
* HTTPPasswordMgr 객체:: 
* HTTPPasswordMgrWithPriorAuth 객체:: 
* AbstractBasicAuthHandler 객체:: 
* HTTPBasicAuthHandler 객체:: 
* ProxyBasicAuthHandler 객체:: 
* AbstractDigestAuthHandler 객체:: 
* HTTPDigestAuthHandler 객체:: 
* ProxyDigestAuthHandler 객체:: 
* HTTPHandler 객체:: 
* HTTPSHandler 객체:: 
* FileHandler 객체:: 
* DataHandler 객체:: 
* FTPHandler 객체:: 
* CacheFTPHandler 객체:: 
* UnknownHandler 객체:: 
* HTTPErrorProcessor 객체:: 
* 예: 예<11>. 
* 레거시 인터페이스:: 
* urllib.request Restrictions: urllib request Restrictions. 

@end menu

@node Request 객체,OpenerDirector 객체,,urllib request — URL을 열기 위한 확장 가능한 라이브러리
@anchor{library/urllib request id1}@anchor{3f63}@anchor{library/urllib request request-objects}@anchor{3f64}
@subsubsection Request 객체


다음 메서드는 @ref{11d7,,Request}의 공용 인터페이스를 설명하므로, 서브 클래스에서 모두 재정의될 수 있습니다. 또한 클라이언트가 구문 분석된 요청을 검사하는 데 사용할 수 있는 몇 가지 공용 어트리뷰트를 정의합니다.

@geindex full_url (urllib.request.Request의 속성)
@anchor{library/urllib request urllib request Request full_url}@anchor{11d9}
@deffn {속성} Request.full_url

생성자에 전달된 원래 URL.


버전 3.4에서 변경.


Request.full_url은 setter, getter 및 deleter가 있는 프로퍼티입니다. @ref{11d9,,full_url}을 읽으면 프래그먼트가 있는 원래 요청 URL을 반환합니다 (있다면).
@end deffn

@geindex type (urllib.request.Request의 속성)
@anchor{library/urllib request urllib request Request type}@anchor{3f65}
@deffn {속성} Request.type

URI 스킴.
@end deffn

@geindex host (urllib.request.Request의 속성)
@anchor{library/urllib request urllib request Request host}@anchor{3f66}
@deffn {속성} Request.host

URI 주체(authority), 일반적으로 호스트이지만 콜론으로 구분된 포트를 포함할 수도 있습니다.
@end deffn

@geindex origin_req_host (urllib.request.Request의 속성)
@anchor{library/urllib request urllib request Request origin_req_host}@anchor{3f67}
@deffn {속성} Request.origin_req_host

포트가 없는, 요청의 원래 호스트.
@end deffn

@geindex selector (urllib.request.Request의 속성)
@anchor{library/urllib request urllib request Request selector}@anchor{3f68}
@deffn {속성} Request.selector

URI 경로. @ref{11d7,,Request}가 프락시를 사용하면, selector는 프락시로 전달되는 전체 URL이 됩니다.
@end deffn

@geindex data (urllib.request.Request의 속성)
@anchor{library/urllib request urllib request Request data}@anchor{11da}
@deffn {속성} Request.data

요청의 엔티티 바디, 또는 지정되지 않으면 @code{None}.


버전 3.4에서 변경: @ref{11da,,Request.data}의 값을 변경하면 이제 “Content-Length” 헤더가 이전에 설정되거나 계산되었다면 삭제됩니다.

@end deffn

@geindex unverifiable (urllib.request.Request의 속성)
@anchor{library/urllib request urllib request Request unverifiable}@anchor{3f69}
@deffn {속성} Request.unverifiable

불리언, 
@geindex RFC; RFC 2965
RFC 2965@footnote{https://datatracker.ietf.org/doc/html/rfc2965.html}에서 정의한 대로 요청을 확인할 수 없는지를 나타냅니다.
@end deffn

@geindex method (urllib.request.Request의 속성)
@anchor{library/urllib request urllib request Request method}@anchor{11d8}
@deffn {속성} Request.method

사용할 HTTP 요청 메서드. 기본적으로 값은 @ref{884,,None}입니다. 이는 @ref{136e,,get_method()}가 사용될 메서드의 일반적인 계산을 수행함을 뜻합니다. @ref{11d7,,Request} 서브 클래스의 클래스 수준에서 값을 설정해서 기본값을 제공하거나, `method' 인자를 통해 @code{Request} 생성자에 값을 전달하여 값을 설정할 수 있습니다 (그래서 @code{get_method()}의 기본 계산을 무시합니다).


Added in version 3.3.



버전 3.4에서 변경: 서브 클래스에서 이제 기본값을 설정할 수 있습니다; 이전에는 생성자 인자를 통해서만 설정할 수 있었습니다.

@end deffn

@geindex get_method() (urllib.request.Request 메서드)
@anchor{library/urllib request urllib request Request get_method}@anchor{136e}
@deffn {메서드} Request.get_method ()

HTTP 요청 메서드를 나타내는 문자열을 반환합니다. @ref{11d8,,Request.method}가 @code{None}이 아니면, 그 값을 반환하고, 그렇지 않으면 @ref{11da,,Request.data}가 @code{None}이면 @code{'GET'}을 반환하거나 그렇지 않으면 @code{'POST'}를 반환합니다. 이것은 HTTP 요청에만 의미가 있습니다.


버전 3.3에서 변경: get_method는 이제 @ref{11d8,,Request.method}의 값을 조사합니다.

@end deffn

@geindex add_header() (urllib.request.Request 메서드)
@anchor{library/urllib request urllib request Request add_header}@anchor{3f59}
@deffn {메서드} Request.add_header (key, val)

요청에 다른 헤더를 추가합니다. 헤더는 현재 HTTP 처리기를 제외한 모든 처리기에서 무시되며, HTTP 처리기에서는 서버로 전송되는 헤더 리스트에 추가됩니다. 같은 이름을 가진 헤더를 두 개 이상 가질 수 없으며, `key'가 충돌하는 경우 후속 호출은 이전 호출을 덮어씁니다. 현재, 두 번 이상 사용될 때 의미가 있는 모든 헤더는 하나의 헤더만 사용하여 같은 기능을 얻는 (헤더 별) 방식을 가지므로 HTTP 기능의 손실은 없습니다. 이 메서드로 추가된 헤더는 리디렉션 된 요청에도 추가됨에 유의하십시오.
@end deffn

@geindex add_unredirected_header() (urllib.request.Request 메서드)
@anchor{library/urllib request urllib request Request add_unredirected_header}@anchor{3f6a}
@deffn {메서드} Request.add_unredirected_header (key, header)

리디렉션 된 요청에 추가되지 않을 헤더를 추가합니다.
@end deffn

@geindex has_header() (urllib.request.Request 메서드)
@anchor{library/urllib request urllib request Request has_header}@anchor{3f6b}
@deffn {메서드} Request.has_header (header)

인스턴스에 명명된 헤더가 있는지를 반환합니다 (일반과 리디렉션되지 않는 것을 모두 확인합니다).
@end deffn

@geindex remove_header() (urllib.request.Request 메서드)
@anchor{library/urllib request urllib request Request remove_header}@anchor{11dc}
@deffn {메서드} Request.remove_header (header)

요청 인스턴스에서 명명된 헤더를 제거합니다 (일반과 리디렉션되지 않은 헤더 모두).


Added in version 3.4.

@end deffn

@geindex get_full_url() (urllib.request.Request 메서드)
@anchor{library/urllib request urllib request Request get_full_url}@anchor{3f6c}
@deffn {메서드} Request.get_full_url ()

생성자에 제공된 URL을 반환합니다.


버전 3.4에서 변경.


@ref{11d9,,Request.full_url}을 반환합니다
@end deffn

@geindex set_proxy() (urllib.request.Request 메서드)
@anchor{library/urllib request urllib request Request set_proxy}@anchor{3f6d}
@deffn {메서드} Request.set_proxy (host, type)

프락시 서버에 연결하여 요청을 준비합니다. `host'와 `type'은 인스턴스의 것을 대체하고, 인스턴스의 selector는 생성자에 제공된 원래 URL이 됩니다.
@end deffn

@geindex get_header() (urllib.request.Request 메서드)
@anchor{library/urllib request urllib request Request get_header}@anchor{3f6e}
@deffn {메서드} Request.get_header (header_name, default=None)

지정된 헤더의 값을 반환합니다. 헤더가 없으면, default 값을 반환합니다.
@end deffn

@geindex header_items() (urllib.request.Request 메서드)
@anchor{library/urllib request urllib request Request header_items}@anchor{3f6f}
@deffn {메서드} Request.header_items ()

요청 헤더의 튜플 (header_name, header_value) 리스트를 반환합니다.
@end deffn


버전 3.4에서 변경: 3.3부터 폐지된 add_data, has_data, get_data, get_type, get_host, get_selector, get_origin_req_host 및 is_unverifiable 요청 메서드가 제거되었습니다.


@node OpenerDirector 객체,BaseHandler 객체,Request 객체,urllib request — URL을 열기 위한 확장 가능한 라이브러리
@anchor{library/urllib request opener-director-objects}@anchor{3f70}@anchor{library/urllib request openerdirector-objects}@anchor{3f71}
@subsubsection OpenerDirector 객체


@ref{3f50,,OpenerDirector} 인스턴스에는 다음과 같은 메서드가 있습니다:

@geindex add_handler() (urllib.request.OpenerDirector 메서드)
@anchor{library/urllib request urllib request OpenerDirector add_handler}@anchor{3f72}
@deffn {메서드} OpenerDirector.add_handler (handler)

`handler'는 @ref{3f53,,BaseHandler}의 인스턴스여야 합니다. 다음 메서드가 검색되어, 가능한 체인에 추가됩니다 (HTTP 에러는 특별한 경우임에 유의하십시오). 다음에서 `protocol'은 처리할 실제 프로토콜로 바꿔야 합니다, 예를 들어 @code{http_response()}는 HTTP 프로토콜 응답 처리기입니다. 또한 `type'은 실제 HTTP 코드로 대체해야 합니다, 예를 들어 @code{http_error_404()}는 HTTP 404 에러를 처리합니다.


@itemize *

@item 
@code{<protocol>_open()} — 처리기가 `protocol' URL을 여는 방법을 알고 있음을 알립니다.

자세한 정보는 @ref{3f73,,BaseHandler.<protocol>_open()}을 참조하십시오.

@item 
@code{http_error_<type>()} — 처리기가 HTTP 에러 코드 `type'을 갖는 HTTP 에러를 처리하는 방법을 알고 있음을 알립니다.

자세한 정보는 @ref{3f74,,BaseHandler.http_error_<nnn>()}을 참조하십시오.

@item 
@code{<protocol>_error()} — 처리기가 (@code{http}가 아닌) `protocol'의 에러를 처리하는 방법을 알고 있음을 알립니다.

@item 
@code{<protocol>_request()} — 처리기가 `protocol' 요청을 전처리(pre-process)하는 방법을 알고 있음을 알립니다.

자세한 정보는 @ref{3f75,,BaseHandler.<protocol>_request()}를 참조하십시오.

@item 
@code{<protocol>_response()} — 처리기가 `protocol' 응답을 후처리(post-process)하는 방법을 알고 있음을 알립니다.

자세한 정보는 @ref{3f76,,BaseHandler.<protocol>_response()}를 참조하십시오.
@end itemize
@end deffn

@geindex open() (urllib.request.OpenerDirector 메서드)
@anchor{library/urllib request urllib request OpenerDirector open}@anchor{11db}
@deffn {메서드} OpenerDirector.open (url, data=None[, timeout])

주어진 `url'(요청 객체나 문자열일 수 있습니다)을 열고, 선택적으로 주어진 `data'를 전달합니다. 인자, 반환 값 및 발생하는 예외는 @ref{307,,urlopen()}과 같습니다 (단순히 현재 설치된 전역 @ref{3f50,,OpenerDirector}의 @ref{316,,open()} 메서드를 호출합니다). 선택적 `timeout' 매개 변수는 연결 시도와 같은 연산을 블로킹하기 위한 시간제한을 초 단위로 지정합니다 (지정하지 않으면 전역 기본 시간제한 설정이 사용됩니다). 시간제한 기능은 실제로는 HTTP, HTTPS 및 FTP 연결에서만 작동합니다.
@end deffn

@geindex error() (urllib.request.OpenerDirector 메서드)
@anchor{library/urllib request urllib request OpenerDirector error}@anchor{3f77}
@deffn {메서드} OpenerDirector.error (proto, *args)

주어진 프로토콜의 에러를 처리합니다. 이것은 주어진 프로토콜에 대해 등록된 에러 처리기를 주어진 인자(프로토콜 특정입니다)로 호출합니다. HTTP 프로토콜은 HTTP 응답 코드를 사용하여 특정 에러 처리기를 결정하는 특수한 경우입니다; 처리기 클래스의 @code{http_error_<type>()} 메서드를 참조하십시오.

반환 값과 발생하는 예외는 @ref{307,,urlopen()}과 같습니다.
@end deffn

OpenerDirector 객체는 다음 3단계로 URL을 엽니다:

각 단계에서 이러한 메서드가 호출되는 순서는 처리기 인스턴스를 정렬하여 결정됩니다.


@enumerate 

@item 
@code{<protocol>_request()}와 같은 이름의 메서드를 가진 모든 처리기가 요청을 전처리하기 위해 해당 메서드가 호출됩니다.

@item 
@code{<protocol>_open()}과 같은 이름의 메서드를 가진 처리기가 요청을 처리하기 위해 호출됩니다. 이 단계는 처리기가 @ref{884,,None}이 아닌 값(즉, 응답)을 반환하거나, 예외(보통 @ref{2be,,URLError})를 발생시킬 때 종료됩니다. 예외 전파가 허용됩니다.

사실, 위의 알고리즘은 @ref{3f78,,default_open()}이라는 메서드를 먼저 시도됩니다. 이러한 모든 메서드가 @ref{884,,None}을 반환하면, 알고리즘은 @code{<protocol>_open()}과 같은 이름의 메서드에 대해 반복합니다. 이러한 모든 메서드가 @code{None}을 반환하면, 알고리즘은 @ref{3f79,,unknown_open()}이라는 메서드에 대해 반복합니다.

이러한 메서드의 구현은 부모 @ref{3f50,,OpenerDirector} 인스턴스의 @ref{11db,,open()}과 @ref{3f77,,error()} 메서드의 호출을 수반할 수 있음에 유의하십시오.

@item 
@code{<protocol>_response()}와 같은 이름의 메서드가 있는 모든 처리기는 응답을 후처리하기 위해 해당 메서드가 호출됩니다.
@end enumerate

@node BaseHandler 객체,HTTPRedirectHandler 객체,OpenerDirector 객체,urllib request — URL을 열기 위한 확장 가능한 라이브러리
@anchor{library/urllib request base-handler-objects}@anchor{3f7a}@anchor{library/urllib request basehandler-objects}@anchor{3f7b}
@subsubsection BaseHandler 객체


@ref{3f53,,BaseHandler} 객체는 직접적으로 유용한 몇 가지 메서드와 파생 클래스에서 사용하기 위한 다른 메서드를 제공합니다. 다음은 직접 사용하기 위한 것입니다:

@geindex add_parent() (urllib.request.BaseHandler 메서드)
@anchor{library/urllib request urllib request BaseHandler add_parent}@anchor{3f7c}
@deffn {메서드} BaseHandler.add_parent (director)

director를 부모로 추가합니다.
@end deffn

@geindex close() (urllib.request.BaseHandler 메서드)
@anchor{library/urllib request urllib request BaseHandler close}@anchor{3f7d}
@deffn {메서드} BaseHandler.close ()

모든 부모를 제거합니다.
@end deffn

다음 어트리뷰트와 메서드는 @ref{3f53,,BaseHandler}에서 파생된 클래스에서만 사용해야 합니다.

@cartouche
@quotation 참고 
@code{<protocol>_request()}나 @code{<protocol>_response()} 메서드를 정의하는 서브 클래스는 @code{*Processor}라고 이름 붙이는 규칙이 채택되었습니다; 다른 모든 것들의 이름은 @code{*Handler}입니다.
@end quotation
@end cartouche

@geindex parent (urllib.request.BaseHandler의 속성)
@anchor{library/urllib request urllib request BaseHandler parent}@anchor{3f7e}
@deffn {속성} BaseHandler.parent

다른 프로토콜을 사용하여 열거나 에러를 처리하는 데 사용할 수 있는 유효한 @ref{3f50,,OpenerDirector}.
@end deffn

@geindex default_open() (urllib.request.BaseHandler 메서드)
@anchor{library/urllib request urllib request BaseHandler default_open}@anchor{3f78}
@deffn {메서드} BaseHandler.default_open (req)

이 메서드는 @ref{3f53,,BaseHandler}에 정의되지 `않았지만', 서브 클래스가 모든 URL을 포착하려면 이를 정의해야 합니다.

구현되면 이 메서드는 부모 @ref{3f50,,OpenerDirector}에 의해 호출됩니다. @code{OpenerDirector}의 @ref{11db,,open()} 메서드의 반환 값에 설명된 대로 파일류 객체를 반환하거나 @code{None}을 반환해야 합니다. 진짜 예외적인 상황이 발생하지 않는 한  (예를 들어, @ref{175f,,MemoryError}는 @ref{2be,,URLError}로 매핑하지 않아야 합니다), @code{URLError}를 발생해야 합니다.

이 메서드는 프로토콜별 open 메서드보다 먼저 호출됩니다.
@end deffn

@anchor{library/urllib request protocol-open}@anchor{3f73}
@deffn {메서드} BaseHandler.<protocol>_open(req)

이 메서드는 @ref{3f53,,BaseHandler} 에 정의되지 `않았지만', 서브 클래스가 주어진 프로토콜로 URL을 처리하려면 이를 정의해야 합니다.

정의되면, 이 메서드는 부모 @ref{3f50,,OpenerDirector}에 의해 호출됩니다. 반환 값은 @ref{3f78,,default_open()}과 같아야 합니다.
@end deffn

@geindex unknown_open() (urllib.request.BaseHandler 메서드)
@anchor{library/urllib request urllib request BaseHandler unknown_open}@anchor{3f79}
@deffn {메서드} BaseHandler.unknown_open (req)

이 메서드는 @ref{3f53,,BaseHandler} 에 정의되지 `않았지만', 서브 클래스는 등록된 특정 처리기가 없는 모든 URL을 잡아서 열려면 이를 정의해야 합니다.

구현되면, 이 메서드는 @ref{3f7e,,parent} @ref{3f50,,OpenerDirector}에 의해 호출됩니다. 반환 값은 @ref{3f78,,default_open()}과 같아야 합니다.
@end deffn

@geindex http_error_default() (urllib.request.BaseHandler 메서드)
@anchor{library/urllib request urllib request BaseHandler http_error_default}@anchor{3f7f}
@deffn {메서드} BaseHandler.http_error_default (req, fp, code, msg, hdrs)

이 메서드는 @ref{3f53,,BaseHandler} 에 정의되지 `않았지만', 서브 클래스는 달리 처리되지 않은 HTTP 에러에 대해 포괄적인 처리를 제공하려면 이를 재정의해야 합니다. 에러가 발생하는 @ref{3f50,,OpenerDirector}에 의해 자동으로 호출되며, 다른 상황에서는 일반적으로 호출되지 않아야 합니다.

@ref{3f50,,OpenerDirector} will call this method with five positional arguments:


@enumerate 

@item 
a @ref{11d7,,Request} object,

@item 
a file-like object with the HTTP error body,

@item 
the three-digit code of the error, as a string,

@item 
the user-visible explanation of the code, as a string, and

@item 
the headers of the error, as a mapping object.
@end enumerate

반환 값과 발생하는 예외는 @ref{307,,urlopen()}의 것과 같아야 합니다.
@end deffn

@anchor{library/urllib request http-error-nnn}@anchor{3f74}
@deffn {메서드} BaseHandler.http_error_<nnn>(req, fp, code, msg, hdrs)

`nnn'은 3자리 HTTP 에러 코드여야 합니다. 이 메서드도 @ref{3f53,,BaseHandler} 에 정의되어 있지 않지만, 존재한다면 코드가 `nnn' 인 HTTP 에러가 발생할 때 서브 클래스의 인스턴스에 대해 호출됩니다.

특정 HTTP 에러를 처리하려면 서브 클래스가 이 메서드를 재정의해야 합니다.

인자, 반환 값 및 발생하는 예외는 @ref{3f7f,,http_error_default()}와 같아야 합니다.
@end deffn

@anchor{library/urllib request protocol-request}@anchor{3f75}
@deffn {메서드} BaseHandler.<protocol>_request(req)

이 메서드는 @ref{3f53,,BaseHandler} 에 정의되지 `않았지만', 서브 클래스는 주어진 프로토콜의 요청을 전처리하려면 이를 정의해야 합니다.

정의되면, 이 메서드는 부모 상위 @ref{3f50,,OpenerDirector}에 의해 호출됩니다. `req'는 @ref{11d7,,Request} 객체가 됩니다. 반환 값은 @code{Request} 객체여야 합니다.
@end deffn

@anchor{library/urllib request protocol-response}@anchor{3f76}
@deffn {메서드} BaseHandler.<protocol>_response(req, response)

이 메서드는 @ref{3f53,,BaseHandler} 에 정의되지 `않았지만', 서브 클래스는 주어진 프로토콜의 응답을 후처리하려면 이를 정의해야 합니다.

정의되면, 이 메서드는 부모 @ref{3f50,,OpenerDirector}에 의해 호출됩니다. `req'는 @ref{11d7,,Request} 객체가 됩니다. `response'는 @ref{307,,urlopen()}의 반환 값과 같은 인터페이스를 구현하는 객체가 됩니다. 반환 값은 @code{urlopen()}의 반환 값과 같은 인터페이스를 구현해야 합니다.
@end deffn

@node HTTPRedirectHandler 객체,HTTPCookieProcessor 객체,BaseHandler 객체,urllib request — URL을 열기 위한 확장 가능한 라이브러리
@anchor{library/urllib request http-redirect-handler}@anchor{3f80}@anchor{library/urllib request httpredirecthandler-objects}@anchor{3f81}
@subsubsection HTTPRedirectHandler 객체


@cartouche
@quotation 참고 
일부 HTTP 리디렉션은 이 모듈의 클라이언트 코드로부터의 액션을 요구합니다. 이 경우, @ref{11dd,,HTTPError}가 발생합니다. 다양한 리디렉션 코드의 정확한 의미에 대한 자세한 내용은 
@geindex RFC; RFC 2616
RFC 2616@footnote{https://datatracker.ietf.org/doc/html/rfc2616.html}을 참조하십시오.

HTTPRedirectHandler 에 HTTP, HTTPS 또는 FTP URL이 아닌 리디렉션 된 URL이 제공되면 보안을 고려하여 @ref{11dd,,HTTPError} 예외가 발생했습니다.
@end quotation
@end cartouche

@geindex redirect_request() (urllib.request.HTTPRedirectHandler 메서드)
@anchor{library/urllib request urllib request HTTPRedirectHandler redirect_request}@anchor{3f82}
@deffn {메서드} HTTPRedirectHandler.redirect_request (req, fp, code, msg, hdrs, newurl)

리디렉션에 대한 응답으로 @ref{11d7,,Request}나 @code{None}을 반환합니다. 이것은 서버로부터 리디렉션이 수신될 때 @code{http_error_30*()} 메서드의 기본 구현에 의해 호출됩니다. 리디렉션이 일어나야 하면, @code{http_error_30*()}이 `newurl'로 리디렉션을 수행할 수 있도록 새 @code{Request}를 반환합니다. 그렇지 않으면 다른 처리기가 이 URL을 처리하려고 시도하지 않아야 한다면 @ref{11dd,,HTTPError}를 발생시키고, 자신은 할 수 없지만 다른 처리기가 처리할 수 있다면 @code{None}을 반환합니다.

@cartouche
@quotation 참고 
이 메서드의 기본 구현은 
@geindex RFC; RFC 2616
RFC 2616@footnote{https://datatracker.ietf.org/doc/html/rfc2616.html}을 엄격하게 따르지 않습니다. 즉, @code{POST} 요청에 대한 301과 302 응답은 사용자의 확인 없이 자동으로 리디렉션 되지 않아야 합니다. 실제로는, 브라우저들이 POST를 @code{GET}으로 변경하여 이러한 응답의 자동 리디렉션을 허용하며, 기본 구현은 이 동작을 재현합니다.
@end quotation
@end cartouche
@end deffn

@geindex http_error_301() (urllib.request.HTTPRedirectHandler 메서드)
@anchor{library/urllib request urllib request HTTPRedirectHandler http_error_301}@anchor{3f83}
@deffn {메서드} HTTPRedirectHandler.http_error_301 (req, fp, code, msg, hdrs)

@code{Location:}이나 @code{URI:} URL로 리디렉션 합니다. 이 메서드는 HTTP ‘moved permanently(영구적으로 이전했음)’ 응답을 받을 때 부모 @ref{3f50,,OpenerDirector}에 의해 호출됩니다.
@end deffn

@geindex http_error_302() (urllib.request.HTTPRedirectHandler 메서드)
@anchor{library/urllib request urllib request HTTPRedirectHandler http_error_302}@anchor{3f84}
@deffn {메서드} HTTPRedirectHandler.http_error_302 (req, fp, code, msg, hdrs)

@ref{3f83,,http_error_301()}과 같지만, ‘found(발견됨)’ 응답에 대해 호출됩니다.
@end deffn

@geindex http_error_303() (urllib.request.HTTPRedirectHandler 메서드)
@anchor{library/urllib request urllib request HTTPRedirectHandler http_error_303}@anchor{3f85}
@deffn {메서드} HTTPRedirectHandler.http_error_303 (req, fp, code, msg, hdrs)

@ref{3f83,,http_error_301()}과 같지만, ‘see other(다른 곳을 보세요)’ 응답에 대해 호출됩니다.
@end deffn

@geindex http_error_307() (urllib.request.HTTPRedirectHandler 메서드)
@anchor{library/urllib request urllib request HTTPRedirectHandler http_error_307}@anchor{3f86}
@deffn {메서드} HTTPRedirectHandler.http_error_307 (req, fp, code, msg, hdrs)

@ref{3f83,,http_error_301()}과 같지만, ‘temporary redirect(임시 리디렉션)’ 응답에 대해 호출됩니다. 요청 메서드를 @code{POST}에서 @code{GET}으로 바꾸는 것을 허락하지 않습니다.
@end deffn

@geindex http_error_308() (urllib.request.HTTPRedirectHandler 메서드)
@anchor{library/urllib request urllib request HTTPRedirectHandler http_error_308}@anchor{3f87}
@deffn {메서드} HTTPRedirectHandler.http_error_308 (req, fp, code, msg, hdrs)

@ref{3f83,,http_error_301()}과 같지만, ‘permanent redirect(영구 리디렉션)’ 응답에 대해 호출됩니다. 요청 메서드를 @code{POST}에서 @code{GET}으로 바꾸는 것을 허락하지 않습니다.


Added in version 3.11.

@end deffn

@node HTTPCookieProcessor 객체,ProxyHandler 객체,HTTPRedirectHandler 객체,urllib request — URL을 열기 위한 확장 가능한 라이브러리
@anchor{library/urllib request http-cookie-processor}@anchor{3f88}@anchor{library/urllib request httpcookieprocessor-objects}@anchor{3f89}
@subsubsection HTTPCookieProcessor 객체


@ref{3f5a,,HTTPCookieProcessor} 인스턴스에는 하나의 어트리뷰트가 있습니다:

@geindex cookiejar (urllib.request.HTTPCookieProcessor의 속성)
@anchor{library/urllib request urllib request HTTPCookieProcessor cookiejar}@anchor{3f8a}
@deffn {속성} HTTPCookieProcessor.cookiejar

쿠키가 저장되는 @ref{3f8b,,http.cookiejar.CookieJar}.
@end deffn

@node ProxyHandler 객체,HTTPPasswordMgr 객체,HTTPCookieProcessor 객체,urllib request — URL을 열기 위한 확장 가능한 라이브러리
@anchor{library/urllib request proxy-handler}@anchor{3f8c}@anchor{library/urllib request proxyhandler-objects}@anchor{3f8d}
@subsubsection ProxyHandler 객체



@deffn {메서드} ProxyHandler.<protocol>_open(request)

@ref{1db2,,ProxyHandler}에는 생성자에 지정된 `proxies' 딕셔너리에 프락시가 있는 모든 `protocol'에 대해 @code{<protocol>_open()} 메서드가 있습니다. 이 메서드는 @code{request.set_proxy()}를 호출하여 요청이 프락시를 통과하도록 수정하고, 체인에 있는 다음 처리기를 호출하여 실제로 프로토콜을 실행합니다.
@end deffn

@node HTTPPasswordMgr 객체,HTTPPasswordMgrWithPriorAuth 객체,ProxyHandler 객체,urllib request — URL을 열기 위한 확장 가능한 라이브러리
@anchor{library/urllib request http-password-mgr}@anchor{3f5d}@anchor{library/urllib request httppasswordmgr-objects}@anchor{3f8e}
@subsubsection HTTPPasswordMgr 객체


이 메서드는 @ref{3f5b,,HTTPPasswordMgr} 과 @ref{3f5c,,HTTPPasswordMgrWithDefaultRealm} 객체에서 사용 가능합니다.

@geindex add_password() (urllib.request.HTTPPasswordMgr 메서드)
@anchor{library/urllib request urllib request HTTPPasswordMgr add_password}@anchor{3f8f}
@deffn {메서드} HTTPPasswordMgr.add_password (realm, uri, user, passwd)

`uri'는 단일 URI이거나 URI의 시퀀스일 수 있습니다. `realm', `user' 및 `passwd'는 문자열이어야 합니다. 이는 `realm'과 지정된 URI 중 어느 하나의 슈퍼 URI에 대한 인증이 주어질 때 @code{(user, passwd)}가 인증 토큰으로 사용되도록 합니다.
@end deffn

@geindex find_user_password() (urllib.request.HTTPPasswordMgr 메서드)
@anchor{library/urllib request urllib request HTTPPasswordMgr find_user_password}@anchor{1bd4}
@deffn {메서드} HTTPPasswordMgr.find_user_password (realm, authuri)

주어진 realm과 URI에 대한 사용자/암호를 (있다면) 가져옵니다. 일치하는 사용자/암호가 없으면 이 메서드는 @code{(None, None)}을 반환합니다.

@ref{3f5c,,HTTPPasswordMgrWithDefaultRealm} 객체의 경우, 주어진 `realm'에 일치하는 사용자/암호가 없으면 영역 @code{None}이 검색됩니다.
@end deffn

@node HTTPPasswordMgrWithPriorAuth 객체,AbstractBasicAuthHandler 객체,HTTPPasswordMgr 객체,urllib request — URL을 열기 위한 확장 가능한 라이브러리
@anchor{library/urllib request http-password-mgr-with-prior-auth}@anchor{3f5e}@anchor{library/urllib request httppasswordmgrwithpriorauth-objects}@anchor{3f90}
@subsubsection HTTPPasswordMgrWithPriorAuth 객체


이 암호 관리자는 @ref{3f5c,,HTTPPasswordMgrWithDefaultRealm}를 확장하여 인증 자격 증명을 항상 보내야 하는 URI를 추적하는 것을 지원합니다.

@geindex add_password() (urllib.request.HTTPPasswordMgrWithPriorAuth 메서드)
@anchor{library/urllib request urllib request HTTPPasswordMgrWithPriorAuth add_password}@anchor{3f91}
@deffn {메서드} HTTPPasswordMgrWithPriorAuth.add_password (realm, uri, user, passwd, is_authenticated=False)

`realm', `uri', `user', `passwd'는 @ref{3f8f,,HTTPPasswordMgr.add_password()}와 같습니다. `is_authenticated'는 주어진 URI나 URI 리스트에 대한 @code{is_authenticated} 플래그의 초깃값을 설정합니다. `is_authenticated'가 @code{True}로 지정되면, `realm'는 무시됩니다.
@end deffn

@geindex find_user_password() (urllib.request.HTTPPasswordMgrWithPriorAuth 메서드)
@anchor{library/urllib request urllib request HTTPPasswordMgrWithPriorAuth find_user_password}@anchor{3f92}
@deffn {메서드} HTTPPasswordMgrWithPriorAuth.find_user_password (realm, authuri)

@ref{3f5c,,HTTPPasswordMgrWithDefaultRealm} 객체와 같습니다
@end deffn

@geindex update_authenticated() (urllib.request.HTTPPasswordMgrWithPriorAuth 메서드)
@anchor{library/urllib request urllib request HTTPPasswordMgrWithPriorAuth update_authenticated}@anchor{3f93}
@deffn {메서드} HTTPPasswordMgrWithPriorAuth.update_authenticated (self, uri, is_authenticated=False)

주어진 `uri'나 URI 리스트에 대해 @code{is_authenticated} 플래그를 갱신합니다.
@end deffn

@geindex is_authenticated() (urllib.request.HTTPPasswordMgrWithPriorAuth 메서드)
@anchor{library/urllib request urllib request HTTPPasswordMgrWithPriorAuth is_authenticated}@anchor{1bd5}
@deffn {메서드} HTTPPasswordMgrWithPriorAuth.is_authenticated (self, authuri)

주어진 URI에 대한 @code{is_authenticated} 플래그의 현재 상태를 반환합니다.
@end deffn

@node AbstractBasicAuthHandler 객체,HTTPBasicAuthHandler 객체,HTTPPasswordMgrWithPriorAuth 객체,urllib request — URL을 열기 위한 확장 가능한 라이브러리
@anchor{library/urllib request abstract-basic-auth-handler}@anchor{3f94}@anchor{library/urllib request abstractbasicauthhandler-objects}@anchor{3f95}
@subsubsection AbstractBasicAuthHandler 객체


@geindex http_error_auth_reqed() (urllib.request.AbstractBasicAuthHandler 메서드)
@anchor{library/urllib request urllib request AbstractBasicAuthHandler http_error_auth_reqed}@anchor{3f96}
@deffn {메서드} AbstractBasicAuthHandler.http_error_auth_reqed (authreq, host, req, headers)

사용자/암호 쌍을 가져오고 요청을 다시 시도하여 인증 요청을 처리합니다. `authreq'는 영역(realm)에 대한 정보가 요청에 포함된 헤더의 이름이어야 하고, `host'는 인증할 URL과 경로를 지정하고, `req'는 (실패한) @ref{11d7,,Request} 객체여야 하며, `headers'는 에러 헤더여야 합니다.

`host'는 주체(예를 들어 @code{"python.org"})거나 주체 구성 요소를 포함하는 URL(예를 들어 @code{"http://python.org/"})입니다. 어느 경우이든, 주체는 userinfo 구성 요소를 포함하지 않아야 합니다 (따라서, @code{"python.org"}와 @code{"python.org:80"}은 좋지만, @code{"joe:password@@python.org"}는 유효하지 않습니다).
@end deffn

@node HTTPBasicAuthHandler 객체,ProxyBasicAuthHandler 객체,AbstractBasicAuthHandler 객체,urllib request — URL을 열기 위한 확장 가능한 라이브러리
@anchor{library/urllib request http-basic-auth-handler}@anchor{3f97}@anchor{library/urllib request httpbasicauthhandler-objects}@anchor{3f98}
@subsubsection HTTPBasicAuthHandler 객체


@geindex http_error_401() (urllib.request.HTTPBasicAuthHandler 메서드)
@anchor{library/urllib request urllib request HTTPBasicAuthHandler http_error_401}@anchor{3f99}
@deffn {메서드} HTTPBasicAuthHandler.http_error_401 (req, fp, code, msg, hdrs)

가능하다면 인증 정보로 요청을 재시도합니다.
@end deffn

@node ProxyBasicAuthHandler 객체,AbstractDigestAuthHandler 객체,HTTPBasicAuthHandler 객체,urllib request — URL을 열기 위한 확장 가능한 라이브러리
@anchor{library/urllib request proxy-basic-auth-handler}@anchor{3f9a}@anchor{library/urllib request proxybasicauthhandler-objects}@anchor{3f9b}
@subsubsection ProxyBasicAuthHandler 객체


@geindex http_error_407() (urllib.request.ProxyBasicAuthHandler 메서드)
@anchor{library/urllib request urllib request ProxyBasicAuthHandler http_error_407}@anchor{3f9c}
@deffn {메서드} ProxyBasicAuthHandler.http_error_407 (req, fp, code, msg, hdrs)

가능하다면 인증 정보로 요청을 재시도합니다.
@end deffn

@node AbstractDigestAuthHandler 객체,HTTPDigestAuthHandler 객체,ProxyBasicAuthHandler 객체,urllib request — URL을 열기 위한 확장 가능한 라이브러리
@anchor{library/urllib request abstract-digest-auth-handler}@anchor{3f9d}@anchor{library/urllib request abstractdigestauthhandler-objects}@anchor{3f9e}
@subsubsection AbstractDigestAuthHandler 객체


@geindex http_error_auth_reqed() (urllib.request.AbstractDigestAuthHandler 메서드)
@anchor{library/urllib request urllib request AbstractDigestAuthHandler http_error_auth_reqed}@anchor{3f9f}
@deffn {메서드} AbstractDigestAuthHandler.http_error_auth_reqed (authreq, host, req, headers)

`authreq'는 영역(realm)에 대한 정보가 요청에 포함된 헤더의 이름이어야 하고, `host'는 인증할 호스트여야 하고, `req'는 (실패한) @ref{11d7,,Request} 객체여야 하며, `headers'는 에러 헤더여야 합니다.
@end deffn

@node HTTPDigestAuthHandler 객체,ProxyDigestAuthHandler 객체,AbstractDigestAuthHandler 객체,urllib request — URL을 열기 위한 확장 가능한 라이브러리
@anchor{library/urllib request http-digest-auth-handler}@anchor{3fa0}@anchor{library/urllib request httpdigestauthhandler-objects}@anchor{3fa1}
@subsubsection HTTPDigestAuthHandler 객체


@geindex http_error_401() (urllib.request.HTTPDigestAuthHandler 메서드)
@anchor{library/urllib request urllib request HTTPDigestAuthHandler http_error_401}@anchor{3fa2}
@deffn {메서드} HTTPDigestAuthHandler.http_error_401 (req, fp, code, msg, hdrs)

가능하다면 인증 정보로 요청을 재시도합니다.
@end deffn

@node ProxyDigestAuthHandler 객체,HTTPHandler 객체,HTTPDigestAuthHandler 객체,urllib request — URL을 열기 위한 확장 가능한 라이브러리
@anchor{library/urllib request proxy-digest-auth-handler}@anchor{3fa3}@anchor{library/urllib request proxydigestauthhandler-objects}@anchor{3fa4}
@subsubsection ProxyDigestAuthHandler 객체


@geindex http_error_407() (urllib.request.ProxyDigestAuthHandler 메서드)
@anchor{library/urllib request urllib request ProxyDigestAuthHandler http_error_407}@anchor{3fa5}
@deffn {메서드} ProxyDigestAuthHandler.http_error_407 (req, fp, code, msg, hdrs)

가능하다면 인증 정보로 요청을 재시도합니다.
@end deffn

@node HTTPHandler 객체,HTTPSHandler 객체,ProxyDigestAuthHandler 객체,urllib request — URL을 열기 위한 확장 가능한 라이브러리
@anchor{library/urllib request http-handler-objects}@anchor{3fa6}@anchor{library/urllib request httphandler-objects}@anchor{3fa7}
@subsubsection HTTPHandler 객체


@geindex http_open() (urllib.request.HTTPHandler 메서드)
@anchor{library/urllib request urllib request HTTPHandler http_open}@anchor{3fa8}
@deffn {메서드} HTTPHandler.http_open (req)

Send an HTTP request, which can be either GET or POST, depending on
@code{req.data}.
@end deffn

@node HTTPSHandler 객체,FileHandler 객체,HTTPHandler 객체,urllib request — URL을 열기 위한 확장 가능한 라이브러리
@anchor{library/urllib request https-handler-objects}@anchor{3fa9}@anchor{library/urllib request httpshandler-objects}@anchor{3faa}
@subsubsection HTTPSHandler 객체


@geindex https_open() (urllib.request.HTTPSHandler 메서드)
@anchor{library/urllib request urllib request HTTPSHandler https_open}@anchor{3fab}
@deffn {메서드} HTTPSHandler.https_open (req)

Send an HTTPS request, which can be either GET or POST, depending on
@code{req.data}.
@end deffn

@node FileHandler 객체,DataHandler 객체,HTTPSHandler 객체,urllib request — URL을 열기 위한 확장 가능한 라이브러리
@anchor{library/urllib request file-handler-objects}@anchor{3fac}@anchor{library/urllib request filehandler-objects}@anchor{3fad}
@subsubsection FileHandler 객체


@geindex file_open() (urllib.request.FileHandler 메서드)
@anchor{library/urllib request urllib request FileHandler file_open}@anchor{3fae}
@deffn {메서드} FileHandler.file_open (req)

호스트 이름이 없거나, 호스트 이름이 @code{'localhost'}인 경우 파일을 로컬에서 엽니다.


버전 3.2에서 변경: 이 메서드는 로컬 호스트 명에만 적용할 수 있습니다. 원격 호스트 이름이 제공되면, @ref{2be,,URLError}가 발생합니다.

@end deffn

@node DataHandler 객체,FTPHandler 객체,FileHandler 객체,urllib request — URL을 열기 위한 확장 가능한 라이브러리
@anchor{library/urllib request data-handler-objects}@anchor{3faf}@anchor{library/urllib request datahandler-objects}@anchor{3fb0}
@subsubsection DataHandler 객체


@geindex data_open() (urllib.request.DataHandler 메서드)
@anchor{library/urllib request urllib request DataHandler data_open}@anchor{3fb1}
@deffn {메서드} DataHandler.data_open (req)

데이터 URL을 읽습니다. 이러한 종류의 URL에는 URL 자체에 인코딩된 콘텐츠가 포함됩니다. 데이터 URL 문법은 
@geindex RFC; RFC 2397
RFC 2397@footnote{https://datatracker.ietf.org/doc/html/rfc2397.html}에 지정되어 있습니다. 이 구현은 base64로 인코딩된 데이터 URL의 공백을 무시하기 때문에 URL은 소스 파일과 관계없이 줄 넘김 될 수 있습니다. 그러나 일부 브라우저가 base64로 인코딩된 데이터 URL 끝에 패딩이 누락된 것에 대해 신경 쓰지 않지만, 이 구현은 이 경우 @ref{2ec,,ValueError}를 발생시킵니다.
@end deffn

@node FTPHandler 객체,CacheFTPHandler 객체,DataHandler 객체,urllib request — URL을 열기 위한 확장 가능한 라이브러리
@anchor{library/urllib request ftp-handler-objects}@anchor{3fb2}@anchor{library/urllib request ftphandler-objects}@anchor{3fb3}
@subsubsection FTPHandler 객체


@geindex ftp_open() (urllib.request.FTPHandler 메서드)
@anchor{library/urllib request urllib request FTPHandler ftp_open}@anchor{3fb4}
@deffn {메서드} FTPHandler.ftp_open (req)

`req'로 표시된 FTP 파일을 엽니다. 로그인은 항상 빈 사용자 이름과 암호로 수행됩니다.
@end deffn

@node CacheFTPHandler 객체,UnknownHandler 객체,FTPHandler 객체,urllib request — URL을 열기 위한 확장 가능한 라이브러리
@anchor{library/urllib request cacheftp-handler-objects}@anchor{3fb5}@anchor{library/urllib request cacheftphandler-objects}@anchor{3fb6}
@subsubsection CacheFTPHandler 객체


@ref{1a98,,CacheFTPHandler} 객체는 다음과 같은 추가 메서드가 있는 @ref{3f56,,FTPHandler} 객체입니다:

@geindex setTimeout() (urllib.request.CacheFTPHandler 메서드)
@anchor{library/urllib request urllib request CacheFTPHandler setTimeout}@anchor{3fb7}
@deffn {메서드} CacheFTPHandler.setTimeout (t)

연결 시간제한을 `t' 초로 설정합니다.
@end deffn

@geindex setMaxConns() (urllib.request.CacheFTPHandler 메서드)
@anchor{library/urllib request urllib request CacheFTPHandler setMaxConns}@anchor{3fb8}
@deffn {메서드} CacheFTPHandler.setMaxConns (m)

캐시 된 최대 연결 수를 `m'으로 설정합니다.
@end deffn

@node UnknownHandler 객체,HTTPErrorProcessor 객체,CacheFTPHandler 객체,urllib request — URL을 열기 위한 확장 가능한 라이브러리
@anchor{library/urllib request unknown-handler-objects}@anchor{3fb9}@anchor{library/urllib request unknownhandler-objects}@anchor{3fba}
@subsubsection UnknownHandler 객체


@geindex unknown_open() (urllib.request.UnknownHandler 메서드)
@anchor{library/urllib request urllib request UnknownHandler unknown_open}@anchor{3fbb}
@deffn {메서드} UnknownHandler.unknown_open ()

@ref{2be,,URLError} 예외를 발생시킵니다.
@end deffn

@node HTTPErrorProcessor 객체,예<11>,UnknownHandler 객체,urllib request — URL을 열기 위한 확장 가능한 라이브러리
@anchor{library/urllib request http-error-processor-objects}@anchor{3fbc}@anchor{library/urllib request httperrorprocessor-objects}@anchor{3fbd}
@subsubsection HTTPErrorProcessor 객체


@geindex http_response() (urllib.request.HTTPErrorProcessor 메서드)
@anchor{library/urllib request urllib request HTTPErrorProcessor http_response}@anchor{3fbe}
@deffn {메서드} HTTPErrorProcessor.http_response (request, response)

HTTP 에러 응답을 처리합니다.

200 에러 코드의 경우, 응답 객체가 즉시 반환됩니다.

200이 아닌 에러 코드의 경우, @ref{3f77,,OpenerDirector.error()}를 통해 단순히 작업을 @code{http_error_<type>()} 처리기 메서드로 전달합니다. 결국, 다른 처리기가 에러를 처리하지 않으면 @ref{3f54,,HTTPDefaultErrorHandler}는 @ref{11dd,,HTTPError}를 발생시킵니다.
@end deffn

@geindex https_response() (urllib.request.HTTPErrorProcessor 메서드)
@anchor{library/urllib request urllib request HTTPErrorProcessor https_response}@anchor{3fbf}
@deffn {메서드} HTTPErrorProcessor.https_response (request, response)

HTTPS 에러 응답을 처리합니다.

동작은 @ref{3fbe,,http_response()}와 같습니다.
@end deffn

@node 예<11>,레거시 인터페이스,HTTPErrorProcessor 객체,urllib request — URL을 열기 위한 확장 가능한 라이브러리
@anchor{library/urllib request examples}@anchor{3fc0}@anchor{library/urllib request urllib-request-examples}@anchor{3fc1}
@subsubsection 예


아래 예 외에도 @ref{3fc2,,urllib 패키지를 사용하여 인터넷 리소스를 가져오는 방법}에는 더 많은 예가 나와 있습니다.

이 예제는 python.org 메인 페이지를 가져와서 첫 300바이트를 표시합니다:

@example
>>> import urllib.request
>>> with urllib.request.urlopen('http://www.python.org/') as f:
...     print(f.read(300))
...
b'<!doctype html>\n<!--[if lt IE 7]>   <html class="no-js ie6 lt-ie7 lt-ie8 lt-ie9">   <![endif]-->\n<!--[if IE 7]>      <html class="no-js ie7 lt-ie8 lt-ie9">          <![endif]-->\n<!--[if IE 8]>      <html class="no-js ie8 lt-ie9">
@end example

urlopen은 바이트열 객체를 반환함에 유의하십시오. 이는 urlopen이 HTTP 서버로부터 수신한 바이트 스트림의 인코딩을 자동으로 결정할 방법이 없기 때문입니다. 일반적으로, 프로그램은 일단 적절한 인코딩을 결정하거나 추측하면 반환된 바이트열 객체를 문자열로 디코딩합니다.

다음 HTML 명세 문서 @indicateurl{https://html.spec.whatwg.org/#charset} 은 HTML이나 XML 문서가 인코딩 정보를 지정할 수 있는 다양한 방법을 나열합니다.

For additional information, see the W3C document: @indicateurl{https://www.w3.org/International/questions/qa-html-encoding-declarations}.

python.org 웹 사이트는 메타 태그에 지정된 대로 `utf-8' 인코딩을 사용하므로, 바이트열 객체를 디코딩할 때도 이를 사용합니다:

@example
>>> with urllib.request.urlopen('http://www.python.org/') as f:
...     print(f.read(100).decode('utf-8'))
...
<!doctype html>
<!--[if lt IE 7]>   <html class="no-js ie6 lt-ie7 lt-ie8 lt-ie9">   <![endif]-->
<!-
@end example

@ref{1e1,,컨텍스트 관리자} 방식을 사용하지 않고도 같은 결과를 얻을 수 있습니다:

@example
>>> import urllib.request
>>> f = urllib.request.urlopen('http://www.python.org/')
>>> try:
...     print(f.read(100).decode('utf-8'))
... finally:
...     f.close()
...
<!doctype html>
<!--[if lt IE 7]>   <html class="no-js ie6 lt-ie7 lt-ie8 lt-ie9">   <![endif]-->
<!--
@end example

다음 예에서는, CGI의 표준 입력으로 데이터 스트림을 전송하고 반환되는 데이터를 읽습니다. 이 예제는 파이썬 설치가 SSL을 지원할 때만 작동함에 유의하십시오.

@example
>>> import urllib.request
>>> req = urllib.request.Request(url='https://localhost/cgi-bin/test.cgi',
...                       data=b'This data is passed to stdin of the CGI')
>>> with urllib.request.urlopen(req) as f:
...     print(f.read().decode('utf-8'))
...
Got Data: "This data is passed to stdin of the CGI"
@end example

위 예제에서 사용한 샘플 CGI의 코드는 다음과 같습니다:

@example
#!/usr/bin/env python
import sys
data = sys.stdin.read()
print('Content-type: text/plain\n\nGot Data: "%s"' % data)
@end example

다음은 @ref{11d7,,Request}를 사용하여 @code{PUT} 요청을 수행하는 예입니다:

@example
import urllib.request
DATA = b'some data'
req = urllib.request.Request(url='http://localhost:8080', data=DATA, method='PUT')
with urllib.request.urlopen(req) as f:
    pass
print(f.status)
print(f.reason)
@end example

기본 HTTP 인증 사용:

@example
import urllib.request
# 기본 HTTP 인증을 지원하는 OpenerDirector를 만듭니다...
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)
# ...그리고 urlopen과 함께 사용할 수 있도록 전역으로 설치합니다.
urllib.request.install_opener(opener)
with urllib.request.urlopen('http://www.example.com/login.html') as f:
    print(f.read().decode('utf-8'))
@end example

@ref{309,,build_opener()}는 기본적으로 @ref{1db2,,ProxyHandler}를 포함하여 많은 처리기를 제공합니다. 기본적으로, @code{ProxyHandler}는 @code{<scheme>_proxy}라는 이름의 환경 변수를 사용합니다, 여기서 @code{<scheme>}은 관련된 URL 스킴입니다. 예를 들어, HTTP 프락시의 URL을 얻기 위해 @code{http_proxy} 환경 변수를 읽습니다.

이 예는 기본 @ref{1db2,,ProxyHandler}를 프로그래밍 방식으로 제공되는 프락시 URL을 사용하는 것으로 대체하고, @ref{3f60,,ProxyBasicAuthHandler}로 프락시 인증 지원을 추가합니다.

@example
proxy_handler = urllib.request.ProxyHandler(@{'http': 'http://www.example.com:3128/'@})
proxy_auth_handler = urllib.request.ProxyBasicAuthHandler()
proxy_auth_handler.add_password('realm', 'host', 'username', 'password')

opener = urllib.request.build_opener(proxy_handler, proxy_auth_handler)
# 이번에는, OpenerDirector를 설치하지 않고 직접 사용합니다:
with opener.open('http://www.example.com/login.html') as f:
   print(f.read().decode('utf-8'))
@end example

HTTP 헤더 추가하기:

@ref{11d7,,Request} 생성자에 `headers' 인자를 사용하십시오, 또는:

@example
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: . . .)')
with urllib.request.urlopen(req) as f:
    print(f.read().decode('utf-8'))
@end example

@ref{3f50,,OpenerDirector}는 모든 @ref{11d7,,Request}에 @code{User-Agent} 헤더를 자동으로 추가합니다. 이것을 바꾸려면:

@example
import urllib.request
opener = urllib.request.build_opener()
opener.addheaders = [('User-agent', 'Mozilla/5.0')]
with opener.open('http://www.example.com/') as f:
   print(f.read().decode('utf-8'))
@end example

또한, @ref{11d7,,Request}가 @ref{307,,urlopen()}(또는 @ref{11db,,OpenerDirector.open()})으로 전달될 때 몇 가지 표준 헤더(@code{Content-Length}, @code{Content-Type} 및 @code{Host})가 추가됨을 기억하십시오.
@anchor{library/urllib request urllib-examples}@anchor{3fc3}
다음은 @code{GET} 메서드를 사용하여 파라미터가 포함된 URL을 가져오는 예제 세션입니다:

@example
>>> 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'))
...
@end example

다음 예제는 대신 @code{POST} 메서드를 사용합니다. urlencode의 파라미터 출력이 데이터로 urlopen에 보내기 전에 바이트열로 인코딩됨에 유의하십시오:

@example
>>> import urllib.request
>>> import urllib.parse
>>> data = urllib.parse.urlencode(@{'spam': 1, 'eggs': 2, 'bacon': 0@})
>>> data = data.encode('ascii')
>>> with urllib.request.urlopen("http://requestb.in/xrbl82xr", data) as f:
...     print(f.read().decode('utf-8'))
...
@end example

다음 예제는 명시적으로 지정된 HTTP 프락시를 사용하여 환경 설정을 대체합니다:

@example
>>> import urllib.request
>>> proxies = @{'http': 'http://proxy.example.com:8080/'@}
>>> opener = urllib.request.build_opener(urllib.request.ProxyHandler(proxies))
>>> with opener.open("http://www.python.org") as f:
...     f.read().decode('utf-8')
...
@end example

다음 예제는 프락시를 전혀 사용하지 않도록 환경 설정을 대체합니다:

@example
>>> import urllib.request
>>> opener = urllib.request.build_opener(urllib.request.ProxyHandler(@{@}@}))
>>> with opener.open("http://www.python.org/") as f:
...     f.read().decode('utf-8')
...
@end example

@node 레거시 인터페이스,urllib request Restrictions,예<11>,urllib request — URL을 열기 위한 확장 가능한 라이브러리
@anchor{library/urllib request legacy-interface}@anchor{3fc4}
@subsubsection 레거시 인터페이스


다음 함수와 클래스는 파이썬 2 모듈 @code{urllib}(@code{urllib2}가 아니라)에서 이식됩니다. 나중에 언젠가 폐지될 수 있습니다.

@geindex urlretrieve() (urllib.request 모듈)
@anchor{library/urllib request urllib request urlretrieve}@anchor{308}
@deffn {함수} urllib.request.urlretrieve (url, filename=None, reporthook=None, data=None)

URL로 표시된 네트워크 객체를 로컬 파일로 복사합니다. URL이 로컬 파일을 가리키면, 파일 이름을 제공하지 않는 한 객체가 복사되지 않습니다. 튜플 @code{(filename, headers)}를 반환합니다. 여기서 `filename'은 객체를 찾을 수 있는 로컬 파일 이름이며, `headers'는 (원격 객체에 대해) @ref{307,,urlopen()}이 반환한 객체의 @code{info()} 메서드가 반환한 것입니다. 예외는 @code{urlopen()}과 같습니다.

있다면, 두 번째 인자는 복사할 파일 위치를 지정합니다 (없으면, 위치는 생성된 이름을 가진 임시 파일이 됩니다). 있다면, 세 번째 인자는 네트워크 연결이 이루어질 때 한 번 호출되고 그 이후에 각 블록을 읽을 때마다 한 번씩 호출되는 콜러블입니다. 콜러블에는 세 개의 인자가 전달됩니다; 지금까지 전송된 블록 수, 바이트 단위의 블록 크기 및 파일의 전체 크기. 세 번째 인자는 가져오기 요청에 대한 응답으로 파일 크기를 반환하지 않는 구형 FTP 서버에서 @code{-1}일 수 있습니다.

다음 예는 가장 일반적인 사용 시나리오를 보여줍니다:

@example
>>> import urllib.request
>>> local_filename, headers = urllib.request.urlretrieve('http://python.org/')
>>> html = open(local_filename)
>>> html.close()
@end example

`url'이 @code{http:} 스킴 식별자를 사용하면, @code{POST} 요청을 지정하기 위해 선택적 `data' 인자가 제공될 수 있습니다 (일반적으로 요청형은 @code{GET}입니다). `data' 인자는 표준 @code{application/x-www-form-urlencoded} 형식의 바이트열 객체여야 합니다; @ref{1094,,urllib.parse.urlencode()} 함수를 참조하십시오.

@ref{308,,urlretrieve()}는 사용 가능한 데이터양이 예상 양(`Content-Length' 헤더에 의해 보고된 크기)보다 작은 것을 감지하면 @ref{3fc5,,ContentTooShortError}를 발생시킵니다. 예를 들어, 다운로드가 중단된 경우에 발생할 수 있습니다.

`Content-Length'는 하한값으로 취급됩니다: 읽을 데이터가 더 있으면, urlretrieve는 더 많은 데이터를 읽지만, 사용 가능한 데이터가 부족하면 예외가 발생합니다.

이 경우에도 다운로드된 데이터를 여전히 가져올 수 있으며, 예외 인스턴스의 @code{content} 어트리뷰트에 저장됩니다.

`Content-Length' 헤더가 제공되지 않으면, urlretrieve는 다운로드 한 데이터의 크기를 확인할 수 없고, 그냥 반환합니다. 이 경우 다운로드가 성공했다고 가정해야 합니다.
@end deffn

@geindex urlcleanup() (urllib.request 모듈)
@anchor{library/urllib request urllib request urlcleanup}@anchor{1db9}
@deffn {함수} urllib.request.urlcleanup ()

@ref{308,,urlretrieve()}에 대한 이전 호출로 남겨졌을 수 있는 임시 파일을 정리합니다.
@end deffn

@node urllib request Restrictions,,레거시 인터페이스,urllib request — URL을 열기 위한 확장 가능한 라이브러리
@anchor{library/urllib request urllib-request-restrictions}@anchor{3fc6}
@subsubsection @code{urllib.request} Restrictions


@geindex HTTP;프로토콜
@geindex FTP;프로토콜


@itemize *

@item 
현재, 다음과 같은 프로토콜만 지원됩니다: HTTP (버전 0.9와 1.0), FTP, 로컬 파일 및 데이터 URL.


버전 3.4에서 변경: 데이터 URL에 대한 지원이 추가되었습니다.


@item 
@ref{308,,urlretrieve()}의 캐싱 기능은 누군가가 만료 시간 헤더의 적절한 처리를 해킹할 시간을 찾을 때까지 비활성화되었습니다.

@item 
특정 URL이 캐시에 있는지를 조회하는 함수가 있어야 합니다.

@item 
이전 버전과의 호환성을 위해, URL이 로컬 파일을 가리키는 것으로 보이지만 파일을 열 수 없으면, FTP 프로토콜을 사용하여 URL을 다시 해석합니다. 이로 인해 때때로 혼란스러운 에러 메시지가 발생할 수 있습니다.

@item 
@ref{307,,urlopen()}과 @ref{308,,urlretrieve()} 함수는 네트워크 연결이 이루어지기를 기다리는 동안 임의의 긴 지연을 유발할 수 있습니다. 이는 스레드를 사용하지 않고 이러한 함수를 사용하여 대화식 웹 클라이언트를 구축하기 어렵다는 것을 뜻합니다.

@geindex HTML
@geindex HTTP;프로토콜

@item 
@ref{307,,urlopen()}이나 @ref{308,,urlretrieve()}가 반환한 데이터는 서버가 반환한 원시 데이터입니다. 바이너리 데이터 (가령 이미지), 평문 텍스트 또는 (예를 들어) HTML일 수 있습니다. HTTP 프로토콜은 응답 헤더에 유형 정보를 제공하는데, @code{Content-Type} 헤더를 통해 검사할 수 있습니다. 반환된 데이터가 HTML이면, @ref{71,,html.parser} 모듈을 사용하여 구문 분석할 수 있습니다.

@geindex FTP

@item 
The code handling the FTP protocol cannot differentiate between a file and a
directory.  This can lead to unexpected behavior when attempting to read a URL
that points to a file that is not accessible.  If the URL ends in a @code{/}, it is
assumed to refer to a directory and will be handled accordingly.  But if an
attempt to read a file leads to a 550 error (meaning the URL cannot be found or
is not accessible, often for permission reasons), then the path is treated as a
directory in order to handle the case when a directory is specified by a URL but
the trailing @code{/} has been left off.  This can cause misleading results when
you try to fetch a file whose read permissions make it inaccessible; the FTP
code will try to read it, fail with a 550 error, and then perform a directory
listing for the unreadable file. If fine-grained control is needed, consider
using the @ref{62,,ftplib} module.
@end itemize

@node urllib response — Response classes used by urllib,urllib parse — URL을 구성 요소로 구문 분석,urllib request — URL을 열기 위한 확장 가능한 라이브러리,인터넷 프로토콜과 지원
@anchor{library/urllib request module-urllib response}@anchor{112}@anchor{library/urllib request urllib-response-response-classes-used-by-urllib}@anchor{3fc7}
@subsection @code{urllib.response} — Response classes used by urllib


@geindex module; urllib.response

The @code{urllib.response} module defines functions and classes which define a
minimal file-like interface, including @code{read()} and @code{readline()}.
Functions defined by this module are used internally by the @code{urllib.request} module.
The typical response object is a @ref{3f4e,,urllib.response.addinfourl} instance:

@geindex addinfourl (urllib.response 클래스)
@anchor{library/urllib request urllib response addinfourl}@anchor{3f4e}
@deffn {클래스} urllib.response.addinfourl

@geindex url (urllib.response.addinfourl의 속성)
@anchor{library/urllib request urllib response addinfourl url}@anchor{18e9}
@deffn {속성} url

가져온 자원의 URL, 일반적으로 리디렉션을 따라갔는지 판별하는 데 사용됩니다.
@end deffn

@geindex headers (urllib.response.addinfourl의 속성)
@anchor{library/urllib request urllib response addinfourl headers}@anchor{3fc8}
@deffn {속성} headers

@ref{57f,,EmailMessage} 인스턴스 형식으로 응답의 헤더를 반환합니다.
@end deffn

@geindex status (urllib.response.addinfourl의 속성)
@anchor{library/urllib request urllib response addinfourl status}@anchor{3fc9}
@deffn {속성} status


Added in version 3.9.


서버가 반환한 상태 코드.
@end deffn

@geindex geturl() (urllib.response.addinfourl 메서드)
@anchor{library/urllib request urllib response addinfourl geturl}@anchor{3fca}
@deffn {메서드} geturl ()


버전 3.9부터 폐지됨: 폐지되었고 @ref{18e9,,url}로 대체되었습니다.

@end deffn

@geindex info() (urllib.response.addinfourl 메서드)
@anchor{library/urllib request urllib response addinfourl info}@anchor{3fcb}
@deffn {메서드} info ()


버전 3.9부터 폐지됨: 폐지되었고 @ref{3fc8,,headers}로 대체되었습니다.

@end deffn

@geindex code (urllib.response.addinfourl의 속성)
@anchor{library/urllib request urllib response addinfourl code}@anchor{3fcc}
@deffn {속성} code


버전 3.9부터 폐지됨: 폐지되었고 @ref{3fc9,,status}로 대체되었습니다.

@end deffn

@geindex getcode() (urllib.response.addinfourl 메서드)
@anchor{library/urllib request urllib response addinfourl getcode}@anchor{3fcd}
@deffn {메서드} getcode ()


버전 3.9부터 폐지됨: 폐지되었고 @ref{3fc9,,status}로 대체되었습니다.

@end deffn
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node urllib parse — URL을 구성 요소로 구문 분석,urllib error — urllib request에 의해 발생하는 예외 클래스,urllib response — Response classes used by urllib,인터넷 프로토콜과 지원
@anchor{library/urllib parse doc}@anchor{3fce}@anchor{library/urllib parse module-urllib parse}@anchor{110}@anchor{library/urllib parse translation-repo}@anchor{3fcf}@anchor{library/urllib parse urllib-parse-parse-urls-into-components}@anchor{3fd0}
@subsection @code{urllib.parse} — URL을 구성 요소로 구문 분석


@geindex module; urllib.parse

`소스 코드:' Lib/urllib/parse.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/urllib/parse.py}

@geindex WWW
@geindex 월드 와이드 웹
@geindex URL
@geindex URL;구문 분석
@geindex 상대적;URL


__________________________________________________________________


이 모듈은 URL(Uniform Resource Locator) 문자열을 구성 요소(주소 지정 체계, 네트워크 위치, 경로 등)로 분리하고, 구성 요소를 다시 URL 문자열로 결합하고, “상대 URL”을 주어진 “기본 URL”에 따라 절대 URL로 변환하는 표준 인터페이스를 정의합니다.

이 모듈은 상대 URL(Relative Uniform Resource Locators)의 인터넷 RFC와 일치하도록 설계되었습니다. 다음과 같은 URL 스킴을 지원합니다: @code{file}, @code{ftp}, @code{gopher}, @code{hdl}, @code{http}, @code{https}, @code{imap}, @code{itms-services}, @code{mailto}, @code{mms}, @code{news}, @code{nntp}, @code{prospero}, @code{rsync}, @code{rtsp}, @code{rtsps}, @code{rtspu}, @code{sftp}, @code{shttp}, @code{sip}, @code{sips}, @code{snews}, @code{svn}, @code{svn+ssh}, @code{telnet}, @code{wais}, @code{ws}, @code{wss}.

`CPython 구현 상세:' The inclusion of the @code{itms-services} URL scheme can prevent an app from
passing Apple’s App Store review process for the macOS and iOS App Stores.
Handling for the @code{itms-services} scheme is always removed on iOS; on
macOS, it `may' be removed if CPython has been built with the
@ref{1998,,--with-app-store-compliance} option.

The @code{urllib.parse} module defines functions that fall into two broad
categories: URL parsing and URL quoting. These are covered in detail in
the following sections.

This module’s functions use the deprecated term @code{netloc} (or @code{net_loc}),
which was introduced in 
@geindex RFC; RFC 1808
RFC 1808@footnote{https://datatracker.ietf.org/doc/html/rfc1808.html}. However, this term has been obsoleted by
@geindex RFC; RFC 3986
RFC 3986@footnote{https://datatracker.ietf.org/doc/html/rfc3986.html}, which introduced the term @code{authority} as its replacement.
The use of @code{netloc} is continued for backward compatibility.

@menu
* URL 구문 분석:: 
* URL 구문 분석 보안:: 
* ASCII로 인코딩된 바이트열 구문 분석:: 
* 구조화된 구문 분석 결과:: 
* URL 인용:: 

@end menu

@node URL 구문 분석,URL 구문 분석 보안,,urllib parse — URL을 구성 요소로 구문 분석
@anchor{library/urllib parse url-parsing}@anchor{3fd1}
@subsubsection URL 구문 분석


URL 구문 분석 함수는 URL 문자열을 구성 요소로 분할하거나 URL 구성 요소를 URL 문자열로 결합하는 데 중점을 둡니다.

@geindex urlsplit() (urllib.parse 모듈)
@anchor{library/urllib parse urllib parse urlsplit}@anchor{f39}
@deffn {함수} urllib.parse.urlsplit (urlstring, scheme=None, allow_fragments=True)

Parse a URL into five components, returning a 5-item @ref{85d,,named tuple}
@ref{3fd2,,SplitResult} or @ref{3fd3,,SplitResultBytes}.
This corresponds to the general structure of a URL:
@code{scheme://netloc/path?query#fragment}.
Each tuple item is a string, possibly empty. The components are not broken up
into smaller parts (for example, the network location is a single string), and %
escapes are not expanded. The delimiters as shown above are not part of the
result, except for a leading slash in the `path' component, which is retained if
present.  For example:

@example
>>> from urllib.parse import urlsplit
>>> urlsplit("scheme://netloc/path?query#fragment")
SplitResult(scheme='scheme', netloc='netloc', path='/path',
            query='query', fragment='fragment')
>>> o = urlsplit("http://docs.python.org:80/3/library/urllib.parse.html?"
...              "highlight=params#url-parsing")
>>> o
SplitResult(scheme='http', netloc='docs.python.org:80',
            path='/3/library/urllib.parse.html',
            query='highlight=params', fragment='url-parsing')
>>> o.scheme
'http'
>>> o.netloc
'docs.python.org:80'
>>> o.hostname
'docs.python.org'
>>> o.port
80
>>> o._replace(fragment="").geturl()
'http://docs.python.org:80/3/library/urllib.parse.html?highlight=params'
@end example

Following the syntax specifications in 
@geindex RFC; RFC 1808
RFC 1808@footnote{https://datatracker.ietf.org/doc/html/rfc1808.html}, @code{urlsplit()} recognizes
a netloc only if it is properly introduced by ‘//’.  Otherwise the
input is presumed to be a relative URL and thus to start with
a path component.

@example
>>> from urllib.parse import urlsplit
>>> urlsplit('//www.cwi.nl:80/%7Eguido/Python.html')
SplitResult(scheme='@w{'}, netloc='www.cwi.nl:80', path='/%7Eguido/Python.html',
            query='@w{'}, fragment='@w{'})
>>> urlsplit('www.cwi.nl/%7Eguido/Python.html')
SplitResult(scheme='@w{'}, netloc='@w{'}, path='www.cwi.nl/%7Eguido/Python.html',
            query='@w{'}, fragment='@w{'})
>>> urlsplit('help/Python.html')
SplitResult(scheme='@w{'}, netloc='@w{'}, path='help/Python.html',
            query='@w{'}, fragment='@w{'})
@end example

`scheme' 인자는 URL이 지정하지 않은 경우에만 사용될 기본 주소 지정 체계를 제공합니다. 기본값 @code{'@w{'}}가 항상 허용되고 필요하면 자동으로 @code{b'@w{'}}로 변환된다는 점을 제외하고, `urlstring'과 같은 형(텍스트나 바이트열)이어야 합니다.

`allow_fragments' 인자가 거짓이면, 프래그먼트 식별자는 인식되지 않습니다. 대신, path, parameters 또는 query 구성 요소의 일부로 구문 분석되고 @code{fragment}는 반환 값에서 빈 문자열로 설정됩니다.

반환 값은 @ref{85d,,네임드 튜플}입니다. 즉, 다음과 같은 인덱스나 이름있는 어트리뷰트로 해당 항목에 액세스 할 수 있습니다:


@multitable {xxxxxxxxxxxxxxxxxxxx} {xxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

어트리뷰트

@tab

인덱스

@tab

값

@tab

존재하지 않을 때의 값

@item

@code{scheme}

@tab

0

@tab

URL 스킴 지정자

@tab

`scheme' 매개 변수

@item

@code{netloc}

@tab

1

@tab

네트워크 위치 부분

@tab

빈 문자열

@item

@code{path}

@tab

2

@tab

계층적 경로

@tab

빈 문자열

@item

@code{query}

@tab

3

@tab

쿼리 구성 요소

@tab

빈 문자열

@item

@code{fragment}

@tab

4

@tab

프래그먼트 식별자

@tab

빈 문자열

@item

@code{username}

@tab

@tab

사용자 이름

@tab

@ref{884,,None}

@item

@code{password}

@tab

@tab

비밀번호

@tab

@ref{884,,None}

@item

@code{hostname}

@tab

@tab

호스트 이름 (소문자)

@tab

@ref{884,,None}

@item

@code{port}

@tab

@tab

존재하면, 정수로 표시되는 포트 번호

@tab

@ref{884,,None}

@end multitable


URL에 잘못된 포트가 지정된 경우 @code{port} 어트리뷰트를 읽으면 @ref{2ec,,ValueError}가 발생합니다. 결과 객체에 대한 자세한 내용은 @ref{3fd4,,구조화된 구문 분석 결과} 섹션을 참조하십시오.

@code{netloc} 어트리뷰트에서 대괄호(square brackets)가 일치하지 않으면 @ref{2ec,,ValueError}가 발생합니다.

(IDNA 인코딩에서 사용되는) NFKC 정규화에서 @code{/}, @code{?}, @code{#}, @code{@@} 또는 @code{:} 중 하나로 분해(decompose)되는 @code{netloc} 어트리뷰트의 문자는 @ref{2ec,,ValueError}를 발생시킵니다. 구문 분석하기 전에 URL이 분해(decompose)되면, 에러가 발생하지 않습니다.

Following some of the WHATWG spec@footnote{https://url.spec.whatwg.org/#concept-basic-url-parser} that updates 
@geindex RFC; RFC 3986
RFC 3986@footnote{https://datatracker.ietf.org/doc/html/rfc3986.html}, leading C0
control and space characters are stripped from the URL. @code{\n},
@code{\r} and tab @code{\t} characters are removed from the URL at any position.

As is the case with all named tuples, the subclass has a few additional methods
and attributes that are particularly useful. One such method is @code{_replace()}.
The @code{_replace()} method will return a new @ref{3fd2,,SplitResult} object
replacing specified fields with new values.

@example
>>> from urllib.parse import urlsplit
>>> u = urlsplit('//www.cwi.nl:80/%7Eguido/Python.html')
>>> u
SplitResult(scheme='@w{'}, netloc='www.cwi.nl:80', path='/%7Eguido/Python.html',
            query='@w{'}, fragment='@w{'})
>>> u._replace(scheme='http')
SplitResult(scheme='http', netloc='www.cwi.nl:80', path='/%7Eguido/Python.html',
            query='@w{'}, fragment='@w{'})
@end example

@cartouche
@quotation 경고 
@code{urlsplit()} does not perform validation.  See @ref{3fd5,,URL parsing security} for details.
@end quotation
@end cartouche


버전 3.2에서 변경: IPv6 URL 구문 분석 기능이 추가되었습니다.



버전 3.3에서 변경: 
@geindex RFC; RFC 3986
RFC 3986@footnote{https://datatracker.ietf.org/doc/html/rfc3986.html}에 따라, 프래그먼트는 이제 모든 URL 스킴에 대해 구문 분석됩니다 (`allow_fragments'가 거짓이 아니라면). 이전에는, 프래그먼트를 지원하는 스킴의 수락 목록이 있었습니다.



버전 3.6에서 변경: 범위를 벗어난 포트 번호는 이제 @ref{884,,None}을 반환하는 대신 @ref{2ec,,ValueError}를 발생시킵니다.



버전 3.8에서 변경: NFKC 정규화에서 netloc 구문 분석에 영향을 주는 문자는 이제 @ref{2ec,,ValueError}를 발생시킵니다.



버전 3.10에서 변경: ASCII newline and tab characters are stripped from the URL.



버전 3.12에서 변경: Leading WHATWG C0 control and space characters are stripped from the URL.

@end deffn

@geindex parse_qs() (urllib.parse 모듈)
@anchor{library/urllib parse urllib parse parse_qs}@anchor{31f}
@deffn {함수} urllib.parse.parse_qs (qs, keep_blank_values=False, strict_parsing=False, encoding='utf-8', errors='replace', max_num_fields=None, separator='&')

문자열 인자(@code{application/x-www-form-urlencoded} 유형의 데이터)로 제공된 쿼리 문자열을 구문 분석합니다. 데이터는 딕셔너리로 반환됩니다. 딕셔너리 키는 고유한 쿼리 변수 이름이고 값은 각 이름의 값 리스트입니다.

선택적 인자 `keep_blank_values'는 퍼센트 인코딩된 쿼리의 빈 값을 빈 문자열로 처리해야 하는지를 나타내는 플래그입니다. 참값은 빈 값을 빈 문자열로 유지해야 함을 나타냅니다. 기본 거짓 값은 빈 값이 무시되고 포함되지 않은 것처럼 처리됨을 나타냅니다.

선택적 인자 `strict_parsing'은 구문 분석 에러 시 수행할 작업을 나타내는 플래그입니다. 거짓(기본값)이면, 에러가 조용히 무시됩니다. 참이면, 에러는 @ref{2ec,,ValueError} 예외를 발생시킵니다.

선택적 `encoding'과 `errors' 매개 변수는 @ref{ad3,,bytes.decode()} 메서드에서 받아들이는 것처럼 퍼센트 인코딩된 시퀀스를 유니코드 문자로 디코딩하는 방법을 지정합니다.

선택적 인자 `max_num_fields'는 읽을 최대 필드 수입니다. 설정되면, `max_num_fields' 필드보다 많은 것을 읽을 때 @ref{2ec,,ValueError}가 발생합니다.

선택적 인자 `separator'는 쿼리 인자를 구분하는 데 사용할 기호입니다. 기본값은 @code{&}입니다.

이러한 딕셔너리를 쿼리 문자열로 변환하려면 @ref{1094,,urllib.parse.urlencode()} 함수를 (@code{doseq} 매개 변수를 @code{True}로 설정해서) 사용하십시오.


버전 3.2에서 변경: `encoding'과 `errors' 매개 변수를 추가합니다.



버전 3.8에서 변경: `max_num_fields' 매개 변수를 추가했습니다.



버전 3.10에서 변경: 기본값이 @code{&} 인 `separator' 매개 변수를 추가했습니다. 파이썬 3.10 이전의 파이썬 버전에서는 쿼리 매개 변수 구분 기호로 @code{;}와 @code{&}를 모두 사용할 수 있었습니다. @code{&}를 기본 구분자 기호로 사용하여, 단일 구분자 키만 허용하도록 변경되었습니다.



버전 3.14부터 폐지됨: Accepting objects with false values (like @code{0} and @code{[]}) except empty
strings and byte-like objects and @code{None} is now deprecated.

@end deffn

@geindex parse_qsl() (urllib.parse 모듈)
@anchor{library/urllib parse urllib parse parse_qsl}@anchor{31e}
@deffn {함수} urllib.parse.parse_qsl (qs, keep_blank_values=False, strict_parsing=False, encoding='utf-8', errors='replace', max_num_fields=None, separator='&')

문자열 인자(@code{application/x-www-form-urlencoded} 유형의 데이터)로 제공된 쿼리 문자열을 구문 분석합니다. 데이터는 이름, 값 쌍의 리스트로 반환됩니다.

선택적 인자 `keep_blank_values'는 퍼센트 인코딩된 쿼리의 빈 값을 빈 문자열로 처리해야 하는지를 나타내는 플래그입니다. 참값은 빈 값을 빈 문자열로 유지해야 함을 나타냅니다. 기본 거짓 값은 빈 값이 무시되고 포함되지 않은 것처럼 처리됨을 나타냅니다.

선택적 인자 `strict_parsing'은 구문 분석 에러 시 수행할 작업을 나타내는 플래그입니다. 거짓(기본값)이면, 에러가 조용히 무시됩니다. 참이면, 에러는 @ref{2ec,,ValueError} 예외를 발생시킵니다.

선택적 `encoding'과 `errors' 매개 변수는 @ref{ad3,,bytes.decode()} 메서드에서 받아들이는 것처럼 퍼센트 인코딩된 시퀀스를 유니코드 문자로 디코딩하는 방법을 지정합니다.

선택적 인자 `max_num_fields'는 읽을 최대 필드 수입니다. 설정되면, `max_num_fields' 필드보다 많은 것을 읽을 때 @ref{2ec,,ValueError}가 발생합니다.

선택적 인자 `separator'는 쿼리 인자를 구분하는 데 사용할 기호입니다. 기본값은 @code{&}입니다.

이러한 쌍의 리스트를 쿼리 문자열로 변환하려면 @ref{1094,,urllib.parse.urlencode()} 함수를 사용하십시오.


버전 3.2에서 변경: `encoding'과 `errors' 매개 변수를 추가합니다.



버전 3.8에서 변경: `max_num_fields' 매개 변수를 추가했습니다.



버전 3.10에서 변경: 기본값이 @code{&} 인 `separator' 매개 변수를 추가했습니다. 파이썬 3.10 이전의 파이썬 버전에서는 쿼리 매개 변수 구분 기호로 @code{;}와 @code{&}를 모두 사용할 수 있었습니다. @code{&}를 기본 구분자 기호로 사용하여, 단일 구분자 키만 허용하도록 변경되었습니다.

@end deffn

@geindex urlunsplit() (urllib.parse 모듈)
@anchor{library/urllib parse urllib parse urlunsplit}@anchor{193f}
@deffn {함수} urllib.parse.urlunsplit (parts)

Construct a URL from a tuple as returned by @code{urlsplit()}. The `parts'
argument can be any five-item iterable. This may result in a slightly
different, but equivalent URL, if the URL that was parsed originally had
unnecessary delimiters (for example, a @code{?} with an empty query; the RFC
states that these are equivalent).
@end deffn

@geindex urlparse() (urllib.parse 모듈)
@anchor{library/urllib parse urllib parse urlparse}@anchor{362}
@deffn {함수} urllib.parse.urlparse (urlstring, scheme=None, allow_fragments=True)

This is similar to @ref{f39,,urlsplit()}, but additionally splits the `path'
component on `path' and `params'.
This function returns a 6-item @ref{85d,,named tuple} @ref{3fd6,,ParseResult}
or @ref{3fd7,,ParseResultBytes}.
Its items are the same as for the @code{urlsplit()} result, except that
`params' is inserted at index 3, between `path' and `query'.

This function is based on obsoleted 
@geindex RFC; RFC 1738
RFC 1738@footnote{https://datatracker.ietf.org/doc/html/rfc1738.html} and 
@geindex RFC; RFC 1808
RFC 1808@footnote{https://datatracker.ietf.org/doc/html/rfc1808.html}, which
listed `params' as the main URL component.
The more recent URL syntax allows parameters to be applied to each segment
of the `path' portion of the URL (see 
@geindex RFC; RFC 3986
RFC 3986@footnote{https://datatracker.ietf.org/doc/html/rfc3986.html}).
@ref{f39,,urlsplit()} should generally be used instead of @code{urlparse()}.
A separate function is needed to separate the path segments and parameters.
@end deffn

@geindex urlunparse() (urllib.parse 모듈)
@anchor{library/urllib parse urllib parse urlunparse}@anchor{1940}
@deffn {함수} urllib.parse.urlunparse (parts)

Combine the elements of a tuple as returned by @ref{362,,urlparse()} into a
complete URL as a string. The `parts' argument can be any six-item
iterable. This may result in a slightly different, but equivalent URL, if the
URL that was parsed originally had unnecessary delimiters (for example, a ?
with an empty query; the RFC states that these are equivalent).
@end deffn

@geindex urljoin() (urllib.parse 모듈)
@anchor{library/urllib parse urllib parse urljoin}@anchor{1095}
@deffn {함수} urllib.parse.urljoin (base, url, allow_fragments=True)

“기본 URL”(`base')을 다른 URL(`url')과 결합하여 전체 (“절대”) URL을 구성합니다. 비형식적으로, 이것은 기본 URL의 구성 요소, 특히 주소 지정 체계, 네트워크 위치 및 경로(의 일부)를 사용하여 상대 URL에 누락된 구성 요소를 제공합니다. 예를 들면:

@example
>>> from urllib.parse import urljoin
>>> urljoin('http://www.cwi.nl/%7Eguido/Python.html', 'FAQ.html')
'http://www.cwi.nl/%7Eguido/FAQ.html'
@end example

The `allow_fragments' argument has the same meaning and default as for
@ref{f39,,urlsplit()}.

@cartouche
@quotation 참고 
`url'이 절대 URL이면 (즉, @code{//}나 @code{scheme://}로 시작하면), `url'의 호스트명 및/또는 스킴이 결과에 나타납니다. 예를 들면:

@example
>>> urljoin('http://www.cwi.nl/%7Eguido/Python.html',
...         '//www.python.org/%7Eguido')
'http://www.python.org/%7Eguido'
@end example

이런 동작을 원하지 않으면, `url'을 @ref{f39,,urlsplit()}과 @ref{193f,,urlunsplit()}으로 사전 처리하여 가능한 `scheme'과 `netloc' 부분을 제거하십시오.
@end quotation
@end cartouche

@cartouche
@quotation 경고 
Because an absolute URL may be passed as the @code{url} parameter, it is
generally `not secure' to use @code{urljoin} with an attacker-controlled
@code{url}. For example in,
@code{urljoin("https://website.com/users/", username)}, if @code{username} can
contain an absolute URL, the result of @code{urljoin} will be the absolute
URL.
@end quotation
@end cartouche


버전 3.5에서 변경: 
@geindex RFC; RFC 3986
RFC 3986@footnote{https://datatracker.ietf.org/doc/html/rfc3986.html}에 정의된 의미론과 일치하도록 동작이 갱신되었습니다.

@end deffn

@geindex urldefrag() (urllib.parse 모듈)
@anchor{library/urllib parse urllib parse urldefrag}@anchor{144c}
@deffn {함수} urllib.parse.urldefrag (url)

`url'에 프래그먼트 식별자가 포함되면, 프래그먼트 식별자 없는 `url'의 수정된 버전과 프래그먼트 식별자를 별도의 문자열로 반환합니다. `url'에 프래그먼트 식별자가 없으면, 수정되지 않은 `url'과 빈 문자열을 반환합니다.

반환 값은 @ref{85d,,네임드 튜플}입니다, 항목은 인덱스나 이름 붙은 어트리뷰트로 액세스 할 수 있습니다:


@multitable {xxxxxxxxxxxxxxxxxxxx} {xxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

어트리뷰트

@tab

인덱스

@tab

값

@tab

존재하지 않을 때의 값

@item

@code{url}

@tab

0

@tab

프래그먼트 없는 URL

@tab

빈 문자열

@item

@code{fragment}

@tab

1

@tab

프래그먼트 식별자

@tab

빈 문자열

@end multitable


결과 객체에 대한 자세한 정보는 섹션 @ref{3fd4,,구조화된 구문 분석 결과}를 참조하십시오.


버전 3.2에서 변경: 결과는 단순한 2-튜플이 아닌 구조화된 객체입니다.

@end deffn

@geindex unwrap() (urllib.parse 모듈)
@anchor{library/urllib parse urllib parse unwrap}@anchor{3fd8}
@deffn {함수} urllib.parse.unwrap (url)

래핑 된 URL(즉, @code{<URL:scheme://host/path>}, @code{<scheme://host/path>}, @code{URL:scheme://host/path} 또는 @code{scheme://host/path} 형식의 문자열)에서 URL을 추출합니다. `url'이 래핑 된 URL이 아니면, 변경 없이 반환됩니다.
@end deffn

@node URL 구문 분석 보안,ASCII로 인코딩된 바이트열 구문 분석,URL 구문 분석,urllib parse — URL을 구성 요소로 구문 분석
@anchor{library/urllib parse id1}@anchor{3fd9}@anchor{library/urllib parse url-parsing-security}@anchor{3fd5}
@subsubsection URL 구문 분석 보안


The @ref{f39,,urlsplit()} and @ref{362,,urlparse()} APIs do not perform `validation' of
inputs.  They may not raise errors on inputs that other applications consider
invalid.  They may also succeed on some inputs that might not be considered
URLs elsewhere.  Their purpose is for practical functionality rather than
purity.

Instead of raising an exception on unusual input, they may instead return some
component parts as empty strings. Or components may contain more than perhaps
they should.

We recommend that users of these APIs where the values may be used anywhere
with security implications code defensively. Do some verification within your
code before trusting a returned component part.  Does that @code{scheme} make
sense?  Is that a sensible @code{path}?  Is there anything strange about that
@code{hostname}?  etc.

What constitutes a URL is not universally well defined.  Different applications
have different needs and desired constraints.  For instance the living WHATWG spec@footnote{https://url.spec.whatwg.org/#concept-basic-url-parser} describes what user facing web clients such as a web browser require.
While 
@geindex RFC; RFC 3986
RFC 3986@footnote{https://datatracker.ietf.org/doc/html/rfc3986.html} is more general.  These functions incorporate some aspects of
both, but cannot be claimed compliant with either.  The APIs and existing user
code with expectations on specific behaviors predate both standards leading us
to be very cautious about making API behavior changes.

@node ASCII로 인코딩된 바이트열 구문 분석,구조화된 구문 분석 결과,URL 구문 분석 보안,urllib parse — URL을 구성 요소로 구문 분석
@anchor{library/urllib parse id2}@anchor{3fda}@anchor{library/urllib parse parsing-ascii-encoded-bytes}@anchor{144e}
@subsubsection ASCII로 인코딩된 바이트열 구문 분석


URL 구문 분석 함수는 원래 문자열에서만 작동하도록 설계되었습니다. 실제로는, 적절히 인용되고 인코딩된 URL을 ASCII 바이트 시퀀스로 조작할 수 있으면 유용합니다. 따라서, 이 모듈의 URL 구문 분석 함수는 모두 @ref{169,,str} 객체 외에 @ref{192,,bytes}와 @ref{344,,bytearray} 객체에서 작동합니다.

@ref{169,,str} 데이터가 전달되면, 결과에는 @code{str} 데이터만 포함됩니다. @ref{192,,bytes}나 @ref{344,,bytearray} 데이터가 전달되면, 결과에는 @code{bytes} 데이터만 포함됩니다.

단일 함수 호출에서 @ref{169,,str} 데이터를 @ref{192,,bytes}나 @ref{344,,bytearray}와 혼합하려고 시도하면 @ref{198,,TypeError}가 발생하는 반면, 비 ASCII 바이트 값을 전달하면 @ref{c07,,UnicodeDecodeError}가 트리거 됩니다.

@ref{169,,str}과 @ref{192,,bytes} 간에 결과 객체를 쉽게 변환 할 수 있도록, URL 구문 분석 함수의 모든 반환 값은 @code{encode()} 메서드(결과에 @code{str} 데이터가 포함될 때)나 @code{decode()} 메서드(결과에 @code{bytes} 데이터가 포함될 때)를 제공합니다. 이러한 메서드의 서명은 해당 @code{str}와 @code{bytes} 메서드의 서명과 일치합니다 (기본 인코딩이 @code{'utf-8'}가 아니라 @code{'ascii'}라는 점은 예외입니다). 각각은 @code{bytes} 데이터(@code{encode()} 메서드의 경우)나 @code{str} 데이터(@code{decode()} 메서드의 경우)를 포함하는 해당 형의 값을 생성합니다.

ASCII가 아닌 데이터를 포함할 수 있는 잘못 인용된 URL에서 작동할 가능성이 있는 응용 프로그램은 URL 구문 분석 메서드를 호출하기 전에 바이트열에서 문자로 자체 디코딩을 수행할 필요가 있습니다.

이 섹션에서 설명하는 동작은 URL 구문 분석 함수에만 적용됩니다. URL 인용 함수는 개별 URL 인용 함수의 설명서에 기술된 대로 바이트 시퀀스를 생성하거나 소비할 때 자체 규칙을 사용합니다.


버전 3.2에서 변경: URL 구문 분석 함수는 이제 ASCII 인코딩된 바이트 시퀀스를 받아들입니다.


@node 구조화된 구문 분석 결과,URL 인용,ASCII로 인코딩된 바이트열 구문 분석,urllib parse — URL을 구성 요소로 구문 분석
@anchor{library/urllib parse structured-parse-results}@anchor{3fdb}@anchor{library/urllib parse urlparse-result-object}@anchor{3fd4}
@subsubsection 구조화된 구문 분석 결과


The result objects from the @ref{f39,,urlsplit()}, @ref{362,,urlparse()}  and
@ref{144c,,urldefrag()} functions are subclasses of the @ref{610,,tuple} type.
These subclasses add the attributes listed in the documentation for
those functions, the encoding and decoding support described in the
previous section, as well as an additional method:

@geindex geturl() (urllib.parse.urllib.parse.SplitResult 메서드)
@anchor{library/urllib parse urllib parse urllib parse SplitResult geturl}@anchor{3fdc}
@deffn {메서드} urllib.parse.SplitResult.geturl ()

원래 URL의 재결합된 버전을 문자열로 반환합니다. 스킴이 소문자로 정규화되고 빈 구성 요소가 삭제될 수 있다는 점에서 원래 URL과 다를 수 있습니다. 특히, 빈 파라미터, 쿼리 및 프래그먼트 식별자가 제거됩니다.

@ref{144c,,urldefrag()} 결과의 경우, 빈 프래그먼트 식별자만 제거됩니다. @ref{f39,,urlsplit()}과 @ref{362,,urlparse()} 결과의 경우, 이 메서드가 반환한 URL에 대해 언급된 모든 변경 사항이 적용됩니다.

이 메서드의 결과는 원래 구문 분석 함수를 통해 다시 전달될 때 변경되지 않은 상태로 유지됩니다:

@example
>>> from urllib.parse import urlsplit
>>> url = 'HTTP://www.Python.org/doc/#'
>>> r1 = urlsplit(url)
>>> r1.geturl()
'http://www.Python.org/doc/'
>>> r2 = urlsplit(r1.geturl())
>>> r2.geturl()
'http://www.Python.org/doc/'
@end example
@end deffn

다음 클래스는 @ref{169,,str} 객체에서 작동할 때 구조화된 구문 분석 결과의 구현을 제공합니다:

@geindex DefragResult (urllib.parse 클래스)
@anchor{library/urllib parse urllib parse DefragResult}@anchor{3fdd}
@deffn {클래스} urllib.parse.DefragResult (url, fragment)

@ref{169,,str} 데이터를 포함하는 @ref{144c,,urldefrag()} 결과의 구상 클래스. @code{encode()} 메서드는 @ref{3fde,,DefragResultBytes} 인스턴스를 반환합니다.


Added in version 3.2.

@end deffn

@geindex ParseResult (urllib.parse 클래스)
@anchor{library/urllib parse urllib parse ParseResult}@anchor{3fd6}
@deffn {클래스} urllib.parse.ParseResult (scheme, netloc, path, params, query, fragment)

@ref{169,,str} 데이터를 포함하는 @ref{362,,urlparse()} 결과의 구상 클래스. @code{encode()} 메서드는 @ref{3fd7,,ParseResultBytes} 인스턴스를 반환합니다.
@end deffn

@geindex SplitResult (urllib.parse 클래스)
@anchor{library/urllib parse urllib parse SplitResult}@anchor{3fd2}
@deffn {클래스} urllib.parse.SplitResult (scheme, netloc, path, query, fragment)

@ref{169,,str} 데이터를 포함하는 @ref{f39,,urlsplit()} 결과의 구상 클래스. @code{encode()} 메서드는 @ref{3fd3,,SplitResultBytes} 인스턴스를 반환합니다.
@end deffn

다음 클래스는 @ref{192,,bytes}나 @ref{344,,bytearray} 객체에서 작동할 때 구문 분석 결과의 구현을 제공합니다:

@geindex DefragResultBytes (urllib.parse 클래스)
@anchor{library/urllib parse urllib parse DefragResultBytes}@anchor{3fde}
@deffn {클래스} urllib.parse.DefragResultBytes (url, fragment)

@ref{192,,bytes} 데이터를 포함하는 @ref{144c,,urldefrag()} 결과의 구상 클래스. @code{decode()} 메서드는 @ref{3fdd,,DefragResult} 인스턴스를 반환합니다.


Added in version 3.2.

@end deffn

@geindex ParseResultBytes (urllib.parse 클래스)
@anchor{library/urllib parse urllib parse ParseResultBytes}@anchor{3fd7}
@deffn {클래스} urllib.parse.ParseResultBytes (scheme, netloc, path, params, query, fragment)

@ref{192,,bytes} 데이터를 포함하는 @ref{362,,urlparse()} 결과의 구상 클래스. @code{decode()} 메서드는 @ref{3fd6,,ParseResult} 인스턴스를 반환합니다.


Added in version 3.2.

@end deffn

@geindex SplitResultBytes (urllib.parse 클래스)
@anchor{library/urllib parse urllib parse SplitResultBytes}@anchor{3fd3}
@deffn {클래스} urllib.parse.SplitResultBytes (scheme, netloc, path, query, fragment)

@ref{192,,bytes} 데이터를 포함하는 @ref{f39,,urlsplit()} 결과의 구상 클래스. @code{decode()} 메서드는 @ref{3fd2,,SplitResult} 인스턴스를 반환합니다.


Added in version 3.2.

@end deffn

@node URL 인용,,구조화된 구문 분석 결과,urllib parse — URL을 구성 요소로 구문 분석
@anchor{library/urllib parse url-quoting}@anchor{3fdf}
@subsubsection URL 인용


URL 인용(quoting) 함수는 특수 문자를 인용하고 비 ASCII 텍스트를 적절히 인코딩하여 프로그램 데이터를 취해서 URL 구성 요소로 안전하게 사용할 수 있도록 하는 데 중점을 둡니다. 또한 해당 작업이 위의 URL 구문 분석 함수로 처리되지 않는 경우 URL 구성 요소의 내용에서 원래 데이터를 다시 만들기 위해 이러한 작업을 뒤집는 것도 지원합니다.

@geindex quote() (urllib.parse 모듈)
@anchor{library/urllib parse urllib parse quote}@anchor{d9b}
@deffn {함수} urllib.parse.quote (string, safe='/', encoding=None, errors=None)

@code{%@var{xx}} 이스케이프를 사용하여 `string'의 특수 문자를 치환합니다. 글자, 숫자 및 문자 @code{'_.-~'}는 절대 인용되지 않습니다. 기본적으로, 이 함수는 URL의 경로 섹션을 인용하기 위한 것입니다. 선택적 `safe' 매개 변수는 인용해서는 안 되는 추가 ASCII 문자를 지정합니다 — 기본값은 @code{'/'}입니다.

`string'은 @ref{169,,str}이나 @ref{192,,bytes} 객체일 수 있습니다.


버전 3.7에서 변경: URL 문자열 인용을 
@geindex RFC; RFC 2396
RFC 2396@footnote{https://datatracker.ietf.org/doc/html/rfc2396.html}에서 
@geindex RFC; RFC 3986
RFC 3986@footnote{https://datatracker.ietf.org/doc/html/rfc3986.html}으로 옮겼습니다. “~”는 이제 예약되지 않은 문자 집합에 포함됩니다.


선택적 `encoding'과 `errors' 매개 변수는 @ref{ad2,,str.encode()} 메서드에서 받아들이는 것처럼 비 ASCII 문자를 처리하는 방법을 지정합니다. `encoding'의 기본값은 @code{'utf-8'}입니다. `errors'의 기본값은 @code{'strict'}로, 지원되지 않는 문자는 @ref{886,,UnicodeEncodeError}를 발생시킴을 의미합니다. `string'이 @ref{192,,bytes}이면 `encoding'과 `errors'를 제공해서는 안 됩니다, 그렇지 않으면 @ref{198,,TypeError}가 발생합니다.

@code{quote(string, safe, encoding, errors)}는 @code{quote_from_bytes(string.encode(encoding, errors), safe)}와 동등함에 유의하십시오.

예: @code{quote('/El Niño/')}는 @code{'/El%20Ni%C3%B1o/'}를 산출합니다.
@end deffn

@geindex quote_plus() (urllib.parse 모듈)
@anchor{library/urllib parse urllib parse quote_plus}@anchor{144d}
@deffn {함수} urllib.parse.quote_plus (string, safe='@w{'}, encoding=None, errors=None)

@ref{d9b,,quote()}와 유사하지만, URL로 이동하기 위한 쿼리 문자열을 만들 때 HTML 폼값을 인용하는 데 필요한 대로 스페이스를 더하기 부호로 치환하기도 합니다. `safe'에 포함되지 않으면 원래 문자열의 더하기 부호가 이스케이프 됩니다. 또한 `safe'의 기본값은 @code{'/'}가 아닙니다.

예: @code{quote_plus('/El Niño/')}는 @code{'%2FEl+Ni%C3%B1o%2F'}를 산출합니다.
@end deffn

@geindex quote_from_bytes() (urllib.parse 모듈)
@anchor{library/urllib parse urllib parse quote_from_bytes}@anchor{1b4f}
@deffn {함수} urllib.parse.quote_from_bytes (bytes, safe='/')

@ref{d9b,,quote()}와 유사하지만, @ref{169,,str} 대신 @ref{192,,bytes} 객체를 받아들이고, 문자열을 바이트열로 인코딩하지 않습니다.

예: @code{quote_from_bytes(b'a&\xef')}는 @code{'a%26%EF'}를 산출합니다.
@end deffn

@geindex unquote() (urllib.parse 모듈)
@anchor{library/urllib parse urllib parse unquote}@anchor{1af9}
@deffn {함수} urllib.parse.unquote (string, encoding='utf-8', errors='replace')

@code{%@var{xx}} 이스케이프를 동등한 단일 문자로 대체합니다. 선택적 `encoding'과 `errors' 매개 변수는 @ref{ad3,,bytes.decode()} 메서드에서 받아들이는 것처럼 퍼센트 인코딩된 시퀀스를 유니코드 문자로 디코딩하는 방법을 지정합니다.

`string'은 @ref{169,,str}이나 @ref{192,,bytes} 객체일 수 있습니다.

`encoding'의 기본값은 @code{'utf-8'}입니다. `errors'의 기본값은 @code{'replace'}로, 유효하지 않은 시퀀스는 자리 표시자 문자(placeholder character)로 대체됩니다.

예: @code{unquote('/El%20Ni%C3%B1o/')}는 @code{'/El Niño/'}를 산출합니다.


버전 3.9에서 변경: `string' 매개 변수는 바이트열과 문자열 객체를 지원합니다 (이전에는 문자열만 지원했습니다).

@end deffn

@geindex unquote_plus() (urllib.parse 모듈)
@anchor{library/urllib parse urllib parse unquote_plus}@anchor{3fe0}
@deffn {함수} urllib.parse.unquote_plus (string, encoding='utf-8', errors='replace')

@ref{1af9,,unquote()}와 유사하지만, HTML 폼값을 인용 해제할 때 요구되는 것처럼, 더하기 부호를 스페이스로 치환하기도 합니다.

`string'은 @ref{169,,str}이어야 합니다.

예: @code{unquote_plus('/El+Ni%C3%B1o/')}는 @code{'/El Niño/'}를 산출합니다.
@end deffn

@geindex unquote_to_bytes() (urllib.parse 모듈)
@anchor{library/urllib parse urllib parse unquote_to_bytes}@anchor{1afa}
@deffn {함수} urllib.parse.unquote_to_bytes (string)

@code{%@var{xx}} 이스케이프를 해당 단일 옥텟(octet)으로 대체하고, @ref{192,,bytes} 객체를 반환합니다.

`string'은 @ref{169,,str}이나 @ref{192,,bytes} 객체일 수 있습니다.

@ref{169,,str}이면, `string'의 이스케이프 되지 않은 비 ASCII 문자는 UTF-8 바이트열로 인코딩됩니다.

예: @code{unquote_to_bytes('a%26%EF')}는 @code{b'a&\xef'}를 산출합니다.
@end deffn

@geindex urlencode() (urllib.parse 모듈)
@anchor{library/urllib parse urllib parse urlencode}@anchor{1094}
@deffn {함수} urllib.parse.urlencode (query, doseq=False, safe='@w{'}, encoding=None, errors=None, quote_via=quote_plus)

@ref{169,,str}이나 @ref{192,,bytes} 객체를 포함할 수 있는 매핑 객체나 두 요소 튜플의 시퀀스를 퍼센트 인코딩된 ASCII 텍스트 문자열로 변환합니다. 결과 문자열을 @ref{307,,urlopen()} 함수를 사용하여 POST 연산을 위한 `data'로 사용하려면, 바이트열로 인코딩해야 합니다, 그렇지 않으면 @ref{198,,TypeError}가 발생합니다.

결과 문자열은 @code{'&'} 문자로 구분된 일련의 @code{key=value} 쌍이고, 여기서 `key'와 `value'는 `quote_via' 함수를 사용하여 인용됩니다. 기본적으로, @ref{144d,,quote_plus()}가 값을 인용하는 데 사용되는데, 스페이스는 @code{'+'} 문자로 인용되고 ‘/’ 문자는 @code{%2F}로 인코딩되어 GET 요청 표준(@code{application/x-www-form-urlencoded})을 따름을 뜻합니다. `quote_via'로 전달될 수 있는 대체 함수는 @ref{d9b,,quote()}이며, 스페이스를 @code{%20}로 인코딩하고 ‘/’ 문자를 인코딩하지 않습니다. 무엇을 인용할지를 최대한 제어하려면, @code{quote}를 사용하고 `safe'의 값을 지정하십시오.

`query' 인자에 두 요소 튜플의 시퀀스가 사용될 때, 각 튜플의 첫 번째 요소는 키이고 두 번째 요소는 값입니다. 값 요소 자체는 시퀀스일 수 있으며, 이 경우 선택적 매개 변수 `doseq'가 @code{True}로 평가되면, @code{'&'}로 구분된 개별 @code{key=value} 쌍이 키에 대한 값 시퀀스의 각 요소에 대해 생성됩니다. 인코딩된 문자열의 파라미터 순서는 시퀀스의 파라미터 튜플 순서와 일치합니다.

`safe', `encoding' 및 `errors' 매개 변수는 `quote_via'로 전달됩니다 (`encoding'과 `errors' 매개 변수는 쿼리 요소가 @ref{169,,str}일 때만 전달됩니다).

이 인코딩 프로세스를 뒤집기 위해, 쿼리 문자열을 파이썬 데이터 구조로 구문 분석하기 위해 이 모듈에서 @ref{31f,,parse_qs()}와 @ref{31e,,parse_qsl()}이 제공됩니다.

@ref{1094,,urllib.parse.urlencode()} 메서드를 사용하여 URL의 쿼리 문자열이나 POST 요청의 데이터를 생성하는 방법을 알아보려면 @ref{3fc3,,urllib 예제}를 참조하십시오.


버전 3.2에서 변경: `query' 매개 변수는 바이트열과 문자열 객체를 지원합니다.



버전 3.5에서 변경: `quote_via' 매개 변수를 추가했습니다.



버전 3.14부터 폐지됨: Accepting objects with false values (like @code{0} and @code{[]}) except empty
strings and byte-like objects and @code{None} is now deprecated.

@end deffn


@subsubheading 더 보기



@table @asis

@item WHATWG@footnote{https://url.spec.whatwg.org/} -  URL Living standard

Working Group for the URL Standard that defines URLs, domains, IP addresses, the
application/x-www-form-urlencoded format, and their API.

@geindex RFC; RFC 3986

@item RFC 3986@footnote{https://datatracker.ietf.org/doc/html/rfc3986.html} - Uniform Resource Identifiers

이것이 현재 표준입니다 (STD66). urllib.parse 모듈에 대한 모든 변경 사항은 이를 준수해야 합니다. 특정 편차가 관찰될 수 있는데, 이는 대부분 이전 버전과의 호환성과 주요 브라우저에서 일반적으로 관찰되는 사실상의 구문 분석 요구 사항을 위한 것입니다.

@geindex RFC; RFC 2732

@item RFC 2732@footnote{https://datatracker.ietf.org/doc/html/rfc2732.html} - Format for Literal IPv6 Addresses in URL’s.

IPv6 URL의 구문 분석 요구 사항을 지정합니다.

@geindex RFC; RFC 2396

@item RFC 2396@footnote{https://datatracker.ietf.org/doc/html/rfc2396.html} - Uniform Resource Identifiers (URI): Generic Syntax

URN(Uniform Resource Names)과 URL(Uniform Resource Locator)에 대한 일반적인 문법 요구 사항을 설명하는 문서.

@geindex RFC; RFC 2368

@item RFC 2368@footnote{https://datatracker.ietf.org/doc/html/rfc2368.html} - The mailto URL scheme.

mailto URL 스킴에 대한 구문 분석 요구 사항.

@geindex RFC; RFC 1808

@item RFC 1808@footnote{https://datatracker.ietf.org/doc/html/rfc1808.html} - Relative Uniform Resource Locators

이 RFC는 경계 사례의 처리를 정의하는 꽤 많은 수의 “비정상적인 예”를 포함하여, 절대와 상대 URL을 결합하는 규칙을 포함합니다.

@geindex RFC; RFC 1738

@item RFC 1738@footnote{https://datatracker.ietf.org/doc/html/rfc1738.html} - Uniform Resource Locators (URL)

절대 URL의 형식 문법과 의미를 지정합니다.
@end table


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node urllib error — urllib request에 의해 발생하는 예외 클래스,urllib robotparser — robots txt 구문 분석기,urllib parse — URL을 구성 요소로 구문 분석,인터넷 프로토콜과 지원
@anchor{library/urllib error doc}@anchor{3fe1}@anchor{library/urllib error module-urllib error}@anchor{10f}@anchor{library/urllib error translation-repo}@anchor{3fe2}@anchor{library/urllib error urllib-error-exception-classes-raised-by-urllib-request}@anchor{3fe3}
@subsection @code{urllib.error} — urllib.request에 의해 발생하는 예외 클래스


@geindex module; urllib.error

`소스 코드:' Lib/urllib/error.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/urllib/error.py}


__________________________________________________________________


The @code{urllib.error} module defines the exception classes for exceptions
raised by @ref{111,,urllib.request}.  The base exception class is @ref{2be,,URLError}.

The following exceptions are raised by @code{urllib.error} as appropriate:

@geindex URLError
@anchor{library/urllib error urllib error URLError}@anchor{2be}
@deffn {예외} urllib.error.URLError

처리기가 문제에 봉착하는 경우, 처리기는 해당 예외(또는 파생된 예외)를 발생시킵니다. 이 예외는 @ref{2c0,,OSError}의 서브 클래스입니다.

@geindex reason (urllib.error.URLError의 속성)
@anchor{library/urllib error urllib error URLError reason}@anchor{3fe4}
@deffn {속성} reason

이 에러가 발생한 원인입니다. 메시지 문자열이거나 다른 예외 인스턴스가 될 수 있습니다.
@end deffn


버전 3.3에서 변경: 이전에는 @ref{2be,,URLError}가 @ref{1252,,IOError}의 하위 형이었으나, 이제는 @ref{2c0,,OSError}의 별칭이 되었습니다.

@end deffn

@geindex HTTPError
@anchor{library/urllib error urllib error HTTPError}@anchor{11dd}
@deffn {예외} urllib.error.HTTPError (url, code, msg, hdrs, fp)

@ref{11dd,,HTTPError}는 @ref{2be,,URLError}의 서브 클래스로 예외 클래스이긴 하지만, 예외가 아닌 파일류 반환 값(@ref{307,,urlopen()}의 반환 값과 동일한 값)으로도 작동할 수 있습니다. 이 방법은 인증 요청 같은 독특한(exotic) HTTP 에러를 처리할 때 유용합니다.

@geindex url (urllib.error.HTTPError의 속성)
@anchor{library/urllib error urllib error HTTPError url}@anchor{3fe5}
@deffn {속성} url

Contains the request URL.
An alias for `filename' attribute.
@end deffn

@geindex code (urllib.error.HTTPError의 속성)
@anchor{library/urllib error urllib error HTTPError code}@anchor{3fe6}
@deffn {속성} code

@geindex RFC; RFC 2616
RFC 2616@footnote{https://datatracker.ietf.org/doc/html/rfc2616.html}에 정의된 HTTP 상태 코드입니다. 이 숫자 값은 @ref{3fe7,,http.server.BaseHTTPRequestHandler.responses}에서 찾을 수 있는 상태 코드 딕셔너리에 있는 값에 해당합니다.
@end deffn

@geindex reason (urllib.error.HTTPError의 속성)
@anchor{library/urllib error urllib error HTTPError reason}@anchor{3fe8}
@deffn {속성} reason

일반적으로 이 에러의 원인을 설명하는 문자열입니다. `msg' 어트리뷰트의 별칭.
@end deffn

@geindex headers (urllib.error.HTTPError의 속성)
@anchor{library/urllib error urllib error HTTPError headers}@anchor{11de}
@deffn {속성} headers

@ref{11dd,,HTTPError}를 발생시킨 HTTP 요청의 응답 헤더입니다. `hdrs' 어트리뷰트의 별칭.


Added in version 3.4.

@end deffn

@geindex fp (urllib.error.HTTPError의 속성)
@anchor{library/urllib error urllib error HTTPError fp}@anchor{3fe9}
@deffn {속성} fp

A file-like object where the HTTP error body can be read from.
@end deffn
@end deffn

@geindex ContentTooShortError
@anchor{library/urllib error urllib error ContentTooShortError}@anchor{3fc5}
@deffn {예외} urllib.error.ContentTooShortError (msg, content)

이 예외는 다운로드받은 데이터양이 `Content-Length' 헤더 값을 통해 예상한 양보다 적은 것을 @ref{308,,urlretrieve()}함수가 감지했을 때 발생합니다.

@geindex content (urllib.error.ContentTooShortError의 속성)
@anchor{library/urllib error urllib error ContentTooShortError content}@anchor{3fea}
@deffn {속성} content

다운로드받은 (그리고 아마도 잘린) 데이터.
@end deffn
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node urllib robotparser — robots txt 구문 분석기,http — HTTP 모듈,urllib error — urllib request에 의해 발생하는 예외 클래스,인터넷 프로토콜과 지원
@anchor{library/urllib robotparser doc}@anchor{3feb}@anchor{library/urllib robotparser module-urllib robotparser}@anchor{113}@anchor{library/urllib robotparser translation-repo}@anchor{3fec}@anchor{library/urllib robotparser urllib-robotparser-parser-for-robots-txt}@anchor{3fed}
@subsection @code{urllib.robotparser} — robots.txt 구문 분석기


@geindex module; urllib.robotparser

`소스 코드:' Lib/urllib/robotparser.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/urllib/robotparser.py}

@geindex WWW
@geindex 월드 와이드 웹
@geindex URL
@geindex robots.txt


__________________________________________________________________


This module provides a single class, @ref{ef9,,RobotFileParser}, which answers
questions about whether or not a particular user agent can fetch a URL on the
website that published the @code{robots.txt} file.  For more details on the
structure of @code{robots.txt} files, see @indicateurl{http://www.robotstxt.org/orig.html}.

@geindex RobotFileParser (urllib.robotparser 클래스)
@anchor{library/urllib robotparser urllib robotparser RobotFileParser}@anchor{ef9}
@deffn {클래스} urllib.robotparser.RobotFileParser (url='@w{'})

이 클래스는 `url'에 있는 @code{robots.txt} 파일을 읽고, 구문 분석하고, 그에 대한 질문에 대답하는 메서드를 제공합니다.

@geindex set_url() (urllib.robotparser.RobotFileParser 메서드)
@anchor{library/urllib robotparser urllib robotparser RobotFileParser set_url}@anchor{3fee}
@deffn {메서드} set_url (url)

@code{robots.txt} 파일을 가리키는 URL을 설정합니다.
@end deffn

@geindex read() (urllib.robotparser.RobotFileParser 메서드)
@anchor{library/urllib robotparser urllib robotparser RobotFileParser read}@anchor{18d2}
@deffn {메서드} read ()

@code{robots.txt} URL을 읽어서 구문 분석기에 넘깁니다.
@end deffn

@geindex parse() (urllib.robotparser.RobotFileParser 메서드)
@anchor{library/urllib robotparser urllib robotparser RobotFileParser parse}@anchor{1e7f}
@deffn {메서드} parse (lines)

lines 인자를 구문 분석합니다.
@end deffn

@geindex can_fetch() (urllib.robotparser.RobotFileParser 메서드)
@anchor{library/urllib robotparser urllib robotparser RobotFileParser can_fetch}@anchor{3fef}
@deffn {메서드} can_fetch (useragent, url)

구문 분석된 @code{robots.txt} 파일에 포함된 규칙에 따라, `useragent'가 `url'를 가져올 수 있으면 @code{True}를 반환합니다.
@end deffn

@geindex mtime() (urllib.robotparser.RobotFileParser 메서드)
@anchor{library/urllib robotparser urllib robotparser RobotFileParser mtime}@anchor{3ff0}
@deffn {메서드} mtime ()

@code{robots.txt} 파일을 마지막으로 가져온 시간을 반환합니다. 이것은 새 @code{robots.txt} 파일을 주기적으로 확인해야 하는 장기 실행 웹 스파이더에 유용합니다.
@end deffn

@geindex modified() (urllib.robotparser.RobotFileParser 메서드)
@anchor{library/urllib robotparser urllib robotparser RobotFileParser modified}@anchor{3ff1}
@deffn {메서드} modified ()

@code{robots.txt} 파일을 마지막으로 가져온 시간을 현재 시각으로 설정합니다.
@end deffn

@geindex crawl_delay() (urllib.robotparser.RobotFileParser 메서드)
@anchor{library/urllib robotparser urllib robotparser RobotFileParser crawl_delay}@anchor{3ff2}
@deffn {메서드} crawl_delay (useragent)

@code{robots.txt}에서 해당 `useragent'에 대한 @code{Crawl-delay} 파라미터의 값을 반환합니다. 해당 파라미터가 없거나, 지정된 `useragent'에 적용되지 않거나, 이 파라미터에 대한 @code{robots.txt} 항목이 잘못된 구문이면 @code{None}을 반환합니다.


Added in version 3.6.

@end deffn

@geindex request_rate() (urllib.robotparser.RobotFileParser 메서드)
@anchor{library/urllib robotparser urllib robotparser RobotFileParser request_rate}@anchor{3ff3}
@deffn {메서드} request_rate (useragent)

@code{robots.txt}에서 @code{Request-rate} 파라미터의 내용을 @ref{85d,,네임드 튜플} @code{RequestRate(requests, seconds)}로 반환합니다. 해당 파라미터가 없거나, 지정된 `useragent'에 적용되지 않거나, 이 파라미터에 대한 @code{robots.txt} 항목이 잘못된 구문이면 @code{None}을 반환합니다.


Added in version 3.6.

@end deffn

@geindex site_maps() (urllib.robotparser.RobotFileParser 메서드)
@anchor{library/urllib robotparser urllib robotparser RobotFileParser site_maps}@anchor{1e1e}
@deffn {메서드} site_maps ()

@code{robots.txt}에서 @code{Sitemap} 매개 변수의 내용을 @ref{24d,,list()} 형식으로 반환합니다. 해당 매개 변수가 없거나 @code{robots.txt}의 이 매개 변수 항목이 잘못된 문법이면 @code{None}을 반환합니다.


Added in version 3.8.

@end deffn
@end deffn

다음 예제는 @ref{ef9,,RobotFileParser} 클래스의 기본 사용을 보여줍니다:

@example
>>> import urllib.robotparser
>>> rp = urllib.robotparser.RobotFileParser()
>>> rp.set_url("http://www.pythontest.net/robots.txt")
>>> rp.read()
>>> rrate = rp.request_rate("*")
>>> rrate.requests
1
>>> rrate.seconds
1
>>> rp.crawl_delay("*")
6
>>> rp.can_fetch("*", "http://www.pythontest.net/")
True
>>> rp.can_fetch("*", "http://www.pythontest.net/no-robots-here/")
False
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node http — HTTP 모듈,http client — HTTP 프로토콜 클라이언트,urllib robotparser — robots txt 구문 분석기,인터넷 프로토콜과 지원
@anchor{library/http doc}@anchor{3ff4}@anchor{library/http http-http-modules}@anchor{3ff5}@anchor{library/http module-http}@anchor{72}@anchor{library/http translation-repo}@anchor{3ff6}
@subsection @code{http} — HTTP 모듈


@geindex module; http

`소스 코드:' Lib/http/__init__.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/http/__init__.py}

@geindex HTTP;프로토콜
@geindex HTTP;http (표준 모듈)


__________________________________________________________________


@code{http} is a package that collects several modules for working with the
HyperText Transfer Protocol:


@itemize *

@item 
@ref{73,,http.client}는 저수준 HTTP 프로토콜 클라이언트입니다. 고수준의 URL 열기는 @ref{111,,urllib.request}를 사용합니다

@item 
@ref{76,,http.server}는 @ref{d2,,socketserver}에 기반을 둔 기본적인 HTTP 서버 클래스를 포함합니다

@item 
@ref{75,,http.cookies}는 쿠키를 사용하여 상태 관리를 구현하는 유틸리티가 있습니다

@item 
@ref{74,,http.cookiejar}는 쿠키의 지속성을 제공합니다
@end itemize

The @code{http} module also defines the following enums that help you work with http related code:

@geindex HTTPStatus (http 클래스)
@anchor{library/http http HTTPStatus}@anchor{afc}
@deffn {클래스} http.HTTPStatus


Added in version 3.5.


HTTP 상태 코드, 이유 구문 그리고 긴 영문 설명의 집합을 정의하는 @ref{eda,,enum.IntEnum}의 서브 클래스입니다.

사용법:

@example
>>> from http import HTTPStatus
>>> HTTPStatus.OK
HTTPStatus.OK
>>> HTTPStatus.OK == 200
True
>>> HTTPStatus.OK.value
200
>>> HTTPStatus.OK.phrase
'OK'
>>> HTTPStatus.OK.description
'Request fulfilled, document follows'
>>> list(HTTPStatus)
[HTTPStatus.CONTINUE, HTTPStatus.SWITCHING_PROTOCOLS, ...]
@end example
@end deffn

@menu
* HTTP 상태 코드:: 
* HTTP 상태 범주:: 
* HTTP 메서드:: 

@end menu

@node HTTP 상태 코드,HTTP 상태 범주,,http — HTTP 모듈
@anchor{library/http http-status-codes}@anchor{3ff7}@anchor{library/http id1}@anchor{3ff8}
@subsubsection HTTP 상태 코드


@ref{afc,,http.HTTPStatus}에서 지원하는 IANA에 등록된 상태 코드@footnote{https://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml}는 다음과 같습니다:


@multitable {xxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

코드

@tab

열거 이름

@tab

세부 사항

@item

@code{100}

@tab

@code{CONTINUE}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, 섹션 15.2.1

@item

@code{101}

@tab

@code{SWITCHING_PROTOCOLS}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, 섹션 15.2.2

@item

@code{102}

@tab

@code{PROCESSING}

@tab

WebDAV 
@geindex RFC; RFC 2518
RFC 2518@footnote{https://datatracker.ietf.org/doc/html/rfc2518.html}, 섹션 10.1

@item

@code{103}

@tab

@code{EARLY_HINTS}

@tab

힌트를 나타내는 HTTP 상태 코드 
@geindex RFC; RFC 8297
RFC 8297@footnote{https://datatracker.ietf.org/doc/html/rfc8297.html}

@item

@code{200}

@tab

@code{OK}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, 섹션 15.3.1

@item

@code{201}

@tab

@code{CREATED}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, 섹션 15.3.2

@item

@code{202}

@tab

@code{ACCEPTED}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, 섹션 15.3.3

@item

@code{203}

@tab

@code{NON_AUTHORITATIVE_INFORMATION}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, 섹션 15.3.4

@item

@code{204}

@tab

@code{NO_CONTENT}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, 섹션 15.3.5

@item

@code{205}

@tab

@code{RESET_CONTENT}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, 섹션 15.3.6

@item

@code{206}

@tab

@code{PARTIAL_CONTENT}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, 섹션 15.3.7

@item

@code{207}

@tab

@code{MULTI_STATUS}

@tab

WebDAV 
@geindex RFC; RFC 4918
RFC 4918@footnote{https://datatracker.ietf.org/doc/html/rfc4918.html}, 섹션 11.1

@item

@code{208}

@tab

@code{ALREADY_REPORTED}

@tab

WebDAV 바인딩 확장 
@geindex RFC; RFC 5842
RFC 5842@footnote{https://datatracker.ietf.org/doc/html/rfc5842.html}, 섹션 7.1 (실험적)

@item

@code{226}

@tab

@code{IM_USED}

@tab

HTTP의 델타 인코딩 
@geindex RFC; RFC 3229
RFC 3229@footnote{https://datatracker.ietf.org/doc/html/rfc3229.html}, 섹션 10.4.1

@item

@code{300}

@tab

@code{MULTIPLE_CHOICES}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, 섹션 15.4.1

@item

@code{301}

@tab

@code{MOVED_PERMANENTLY}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, 섹션 15.4.2

@item

@code{302}

@tab

@code{FOUND}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, 섹션 15.4.3

@item

@code{303}

@tab

@code{SEE_OTHER}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, 섹션 15.4.4

@item

@code{304}

@tab

@code{NOT_MODIFIED}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, 섹션 15.4.5

@item

@code{305}

@tab

@code{USE_PROXY}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, 섹션 15.4.6

@item

@code{307}

@tab

@code{TEMPORARY_REDIRECT}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, 섹션 15.4.8

@item

@code{308}

@tab

@code{PERMANENT_REDIRECT}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, 섹션 15.4.9

@item

@code{400}

@tab

@code{BAD_REQUEST}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, 섹션 15.5.1

@item

@code{401}

@tab

@code{UNAUTHORIZED}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, 섹션 15.5.2

@item

@code{402}

@tab

@code{PAYMENT_REQUIRED}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, 섹션 15.5.3

@item

@code{403}

@tab

@code{FORBIDDEN}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, 섹션 15.5.4

@item

@code{404}

@tab

@code{NOT_FOUND}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, 섹션 15.5.5

@item

@code{405}

@tab

@code{METHOD_NOT_ALLOWED}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, 섹션 15.5.6

@item

@code{406}

@tab

@code{NOT_ACCEPTABLE}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, 섹션 15.5.7

@item

@code{407}

@tab

@code{PROXY_AUTHENTICATION_REQUIRED}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, 섹션 15.5.8

@item

@code{408}

@tab

@code{REQUEST_TIMEOUT}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, 섹션 15.5.9

@item

@code{409}

@tab

@code{CONFLICT}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, 섹션 15.5.10

@item

@code{410}

@tab

@code{GONE}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, 섹션 15.5.11

@item

@code{411}

@tab

@code{LENGTH_REQUIRED}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, 섹션 15.5.12

@item

@code{412}

@tab

@code{PRECONDITION_FAILED}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, 섹션 15.5.13

@item

@code{413}

@tab

@code{CONTENT_TOO_LARGE}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, 섹션 15.5.14

@item

@code{414}

@tab

@code{URI_TOO_LONG}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, 섹션 15.5.15

@item

@code{415}

@tab

@code{UNSUPPORTED_MEDIA_TYPE}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, 섹션 15.5.16

@item

@code{416}

@tab

@code{RANGE_NOT_SATISFIABLE}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, 섹션 15.5.17

@item

@code{417}

@tab

@code{EXPECTATION_FAILED}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, 섹션 15.5.18

@item

@code{418}

@tab

@code{IM_A_TEAPOT}

@tab

HTCPCP/1.0 
@geindex RFC; RFC 2324
RFC 2324@footnote{https://datatracker.ietf.org/doc/html/rfc2324.html}, 섹션 2.3.2

@item

@code{421}

@tab

@code{MISDIRECTED_REQUEST}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, 섹션 15.5.20

@item

@code{422}

@tab

@code{UNPROCESSABLE_CONTENT}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, 섹션 15.5.21

@item

@code{423}

@tab

@code{LOCKED}

@tab

WebDAV 
@geindex RFC; RFC 4918
RFC 4918@footnote{https://datatracker.ietf.org/doc/html/rfc4918.html}, 섹션 11.3

@item

@code{424}

@tab

@code{FAILED_DEPENDENCY}

@tab

WebDAV 
@geindex RFC; RFC 4918
RFC 4918@footnote{https://datatracker.ietf.org/doc/html/rfc4918.html}, 섹션 11.4

@item

@code{425}

@tab

@code{TOO_EARLY}

@tab

HTTP에서 초기 데이터(Early Data) 사용 
@geindex RFC; RFC 8470
RFC 8470@footnote{https://datatracker.ietf.org/doc/html/rfc8470.html}

@item

@code{426}

@tab

@code{UPGRADE_REQUIRED}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, 섹션 15.5.22

@item

@code{428}

@tab

@code{PRECONDITION_REQUIRED}

@tab

추가 HTTP 상태 코드 
@geindex RFC; RFC 6585
RFC 6585@footnote{https://datatracker.ietf.org/doc/html/rfc6585.html}

@item

@code{429}

@tab

@code{TOO_MANY_REQUESTS}

@tab

추가 HTTP 상태 코드 
@geindex RFC; RFC 6585
RFC 6585@footnote{https://datatracker.ietf.org/doc/html/rfc6585.html}

@item

@code{431}

@tab

@code{REQUEST_HEADER_FIELDS_TOO_LARGE}

@tab

추가 HTTP 상태 코드 
@geindex RFC; RFC 6585
RFC 6585@footnote{https://datatracker.ietf.org/doc/html/rfc6585.html}

@item

@code{451}

@tab

@code{UNAVAILABLE_FOR_LEGAL_REASONS}

@tab

법적 장애를 보고하는 HTTP 상태 코드 
@geindex RFC; RFC 7725
RFC 7725@footnote{https://datatracker.ietf.org/doc/html/rfc7725.html}

@item

@code{500}

@tab

@code{INTERNAL_SERVER_ERROR}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, 섹션 15.6.1

@item

@code{501}

@tab

@code{NOT_IMPLEMENTED}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, 섹션 15.6.2

@item

@code{502}

@tab

@code{BAD_GATEWAY}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, 섹션 15.6.3

@item

@code{503}

@tab

@code{SERVICE_UNAVAILABLE}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, 섹션 15.6.4

@item

@code{504}

@tab

@code{GATEWAY_TIMEOUT}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, 섹션 15.6.5

@item

@code{505}

@tab

@code{HTTP_VERSION_NOT_SUPPORTED}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, 섹션 15.6.6

@item

@code{506}

@tab

@code{VARIANT_ALSO_NEGOTIATES}

@tab

HTTP의 투명한 콘텐츠 협상 
@geindex RFC; RFC 2295
RFC 2295@footnote{https://datatracker.ietf.org/doc/html/rfc2295.html}, 섹션 8.1 (실험적)

@item

@code{507}

@tab

@code{INSUFFICIENT_STORAGE}

@tab

WebDAV 
@geindex RFC; RFC 4918
RFC 4918@footnote{https://datatracker.ietf.org/doc/html/rfc4918.html}, 섹션 11.5

@item

@code{508}

@tab

@code{LOOP_DETECTED}

@tab

WebDAV 바인딩 확장 
@geindex RFC; RFC 5842
RFC 5842@footnote{https://datatracker.ietf.org/doc/html/rfc5842.html}, 섹션 7.2 (실험적)

@item

@code{510}

@tab

@code{NOT_EXTENDED}

@tab

HTTP 확장 프레임워크 
@geindex RFC; RFC 2774
RFC 2774@footnote{https://datatracker.ietf.org/doc/html/rfc2774.html}, 섹션 7 (실험적)

@item

@code{511}

@tab

@code{NETWORK_AUTHENTICATION_REQUIRED}

@tab

추가 HTTP 상태 코드 
@geindex RFC; RFC 6585
RFC 6585@footnote{https://datatracker.ietf.org/doc/html/rfc6585.html}, 섹션 6

@end multitable


이전 버전과의 호환성을 유지하기 위해 열거값은 @ref{73,,http.client} 모듈에 상수 형태로도 있습니다. 열거명과 상수명은 동일합니다 (즉, @code{http.HTTPStatus.OK}는 @code{http.client.OK}로도 사용 가능합니다).


버전 3.7에서 변경: @code{421 MISDIRECTED_REQUEST} 상태 코드 추가.



Added in version 3.8: @code{451 UNAVAILABLE_FOR_LEGAL_REASONS} 상태 코드가 추가.



Added in version 3.9: @code{103 EARLY_HINTS}, @code{418 IM_A_TEAPOT} 및 @code{425 TOO_EARLY} 상태 코드가 추가되었습니다.



버전 3.13에서 변경: Implemented RFC9110 naming for status constants. Old constant names are preserved for
backwards compatibility: @code{413 REQUEST_ENTITY_TOO_LARGE}, @code{414 REQUEST_URI_TOO_LONG},
@code{416 REQUESTED_RANGE_NOT_SATISFIABLE} and @code{422 UNPROCESSABLE_ENTITY}.


@node HTTP 상태 범주,HTTP 메서드,HTTP 상태 코드,http — HTTP 모듈
@anchor{library/http http-status-category}@anchor{3ff9}
@subsubsection HTTP 상태 범주



Added in version 3.12.


The enum values have several properties to indicate the HTTP status category:


@multitable {xxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

프로퍼티

@tab

나타내는 것

@tab

세부 사항

@item

@code{is_informational}

@tab

@code{100 <= status <= 199}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, 섹션 15

@item

@code{is_success}

@tab

@code{200 <= status <= 299}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, 섹션 15

@item

@code{is_redirection}

@tab

@code{300 <= status <= 399}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, 섹션 15

@item

@code{is_client_error}

@tab

@code{400 <= status <= 499}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, 섹션 15

@item

@code{is_server_error}

@tab

@code{500 <= status <= 599}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, 섹션 15

@end multitable


@quotation

사용법:

@example
>>> from http import HTTPStatus
>>> HTTPStatus.OK.is_success
True
>>> HTTPStatus.OK.is_client_error
False
@end example
@end quotation

@geindex HTTPMethod (http 클래스)
@anchor{library/http http HTTPMethod}@anchor{3ffa}
@deffn {클래스} http.HTTPMethod


Added in version 3.11.


HTTP 메서드와 영문 설명의 집합을 정의하는 @ref{82c,,enum.StrEnum}의 서브 클래스입니다.

사용법:

@example
>>> from http import HTTPMethod
>>>
>>> HTTPMethod.GET
<HTTPMethod.GET>
>>> HTTPMethod.GET == 'GET'
True
>>> HTTPMethod.GET.value
'GET'
>>> HTTPMethod.GET.description
'Retrieve the target.'
>>> list(HTTPMethod)
[<HTTPMethod.CONNECT>,
 <HTTPMethod.DELETE>,
 <HTTPMethod.GET>,
 <HTTPMethod.HEAD>,
 <HTTPMethod.OPTIONS>,
 <HTTPMethod.PATCH>,
 <HTTPMethod.POST>,
 <HTTPMethod.PUT>,
 <HTTPMethod.TRACE>]
@end example
@end deffn

@node HTTP 메서드,,HTTP 상태 범주,http — HTTP 모듈
@anchor{library/http http-methods}@anchor{3ffb}@anchor{library/http id2}@anchor{3ffc}
@subsubsection HTTP 메서드


@ref{3ffa,,http.HTTPMethod}에서 지원하는 IANA에 등록된 메서드@footnote{https://www.iana.org/assignments/http-methods/http-methods.xhtml}는 다음과 같습니다:


@multitable {xxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

메서드

@tab

열거 이름

@tab

세부 사항

@item

@code{GET}

@tab

@code{GET}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, 섹션 9.3.1

@item

@code{HEAD}

@tab

@code{HEAD}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, 섹션 9.3.2

@item

@code{POST}

@tab

@code{POST}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, 섹션 9.3.3

@item

@code{PUT}

@tab

@code{PUT}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, 섹션 9.3.4

@item

@code{DELETE}

@tab

@code{DELETE}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, 섹션 9.3.5

@item

@code{CONNECT}

@tab

@code{CONNECT}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, 섹션 9.3.6

@item

@code{OPTIONS}

@tab

@code{OPTIONS}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, 섹션 9.3.7

@item

@code{TRACE}

@tab

@code{TRACE}

@tab

HTTP Semantics 
@geindex RFC; RFC 9110
RFC 9110@footnote{https://datatracker.ietf.org/doc/html/rfc9110.html}, 섹션 9.3.8

@item

@code{PATCH}

@tab

@code{PATCH}

@tab

HTTP/1.1 
@geindex RFC; RFC 5789
RFC 5789@footnote{https://datatracker.ietf.org/doc/html/rfc5789.html}

@end multitable


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node http client — HTTP 프로토콜 클라이언트,ftplib — FTP 프로토콜 클라이언트,http — HTTP 모듈,인터넷 프로토콜과 지원
@anchor{library/http client doc}@anchor{3ffd}@anchor{library/http client http-client-http-protocol-client}@anchor{3ffe}@anchor{library/http client module-http client}@anchor{73}@anchor{library/http client translation-repo}@anchor{3fff}
@subsection @code{http.client} — HTTP 프로토콜 클라이언트


@geindex module; http.client

`소스 코드:' Lib/http/client.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/http/client.py}

@geindex HTTP;프로토콜
@geindex HTTP;http.client (표준 모듈)

@geindex 모듈;urllib.request


__________________________________________________________________


이 모듈은 HTTP 및 HTTPS 프로토콜의 클라이언트 측을 구현하는 클래스를 정의합니다. 일반적으로 직접 사용되지 않습니다 — @ref{111,,urllib.request} 모듈은 이를 사용하여 HTTP와 HTTPS를 사용하는 URL을 처리합니다.


@subsubheading 더 보기


더 고수준 HTTP 클라이언트 인터페이스로 Requests 패키지@footnote{https://requests.readthedocs.io/en/latest/}를 권장합니다.


@cartouche
@quotation 참고 
HTTPS 지원은 파이썬이 SSL 지원으로 컴파일된 경우에만 사용 가능합니다 (@ref{d5,,ssl} 모듈을 통해).
@end quotation
@end cartouche

@c include for modules that don't work on WASM

@ref{213c,,가용성}: not WASI.

이 모듈은 웹어셈블리에서 작동하지 않거나 제공되지 않습니다. 자세한 내용은 @ref{1b68,,웹어셈블리 플랫폼}을 참조하세요.

이 모듈은 다음과 같은 클래스를 제공합니다:

@geindex HTTPConnection (http.client 클래스)
@anchor{library/http client http client HTTPConnection}@anchor{d34}
@deffn {클래스} http.client.HTTPConnection (host, port=None[, timeout], source_address=None, blocksize=8192)

@ref{d34,,HTTPConnection} 인스턴스는 HTTP 서버와의 하나의 트랜잭션을 나타냅니다. 호스트와 선택적 포트 번호를 전달하여 인스턴스화해야 합니다. 포트 번호가 전달되지 않으면, host 문자열이 @code{host:port} 형식이면 여기에서 포트가 추출됩니다, 그렇지 않으면 기본 HTTP 포트(80)가 사용됩니다. 선택적 `timeout' 매개 변수가 제공되면, 블로킹 연산(연결 시도와 같은)이 지정된 초 후에 시간제한으로 종료됩니다 (제공되지 않으면, 전역 기본 시간제한 설정이 사용됩니다). 선택적 `source_address' 매개 변수는 HTTP 연결의 소스 주소로 사용할 (호스트, 포트)의 튜플일 수 있습니다. 선택적 `blocksize' 매개 변수는 파일류 메시지 바디를 보내는 데 필요한 버퍼 크기를 바이트 단위로 설정합니다.

예를 들어, 다음 호출은 모두 같은 호스트와 포트에 있는 서버에 연결하는 인스턴스를 만듭니다:

@example
>>> h1 = http.client.HTTPConnection('www.python.org')
>>> h2 = http.client.HTTPConnection('www.python.org:80')
>>> h3 = http.client.HTTPConnection('www.python.org', 80)
>>> h4 = http.client.HTTPConnection('www.python.org', 80, timeout=10)
@end example


버전 3.2에서 변경: `source_address'가 추가되었습니다.



버전 3.4에서 변경: `strict' 매개 변수가 제거되었습니다. HTTP 0.9 스타일 “간단한 응답”은 더는 지원되지 않습니다.



버전 3.7에서 변경: `blocksize' 매개 변수가 추가되었습니다.

@end deffn

@geindex HTTPSConnection (http.client 클래스)
@anchor{library/http client http client HTTPSConnection}@anchor{d35}
@deffn {클래스} http.client.HTTPSConnection (host, port=None, *[, timeout], source_address=None, context=None, blocksize=8192)

보안 서버와의 통신에 SSL을 사용하는 @ref{d34,,HTTPConnection}의 서브 클래스. 기본 포트는 @code{443}입니다. `context'가 지정되면, 다양한 SSL 옵션을 기술하는 @ref{357,,ssl.SSLContext} 인스턴스여야 합니다.

모범 사례에 대한 자세한 내용은 @ref{38c5,,보안 고려 사항}을 참조하십시오.


버전 3.2에서 변경: `source_address', `context' 및 `check_hostname'이 추가되었습니다.



버전 3.2에서 변경: 이 클래스는 이제 가능하면 (즉, @ref{3a0d,,ssl.HAS_SNI}가 참이면) HTTPS 가상 호스트를 지원합니다.



버전 3.4에서 변경: `strict' 매개 변수가 제거되었습니다. HTTP 0.9 스타일 “간단한 응답”은 더는 지원되지 않습니다.



버전 3.4.3에서 변경: 이 클래스는 이제 기본적으로 필요한 모든 인증서와 호스트 이름 검사를 수행합니다. 이전의 검사하지 않는 동작으로 되돌리려면 @code{ssl._create_unverified_context()}를 `context' 매개 변수로 전달할 수 있습니다.



버전 3.8에서 변경: 이 클래스는 이제 기본 `context'나 `cert_file'이 사용자 정의 `context'와 함께 전달될 때 TLS 1.3 @ref{c25,,ssl.SSLContext.post_handshake_auth}를 활성화합니다.



버전 3.10에서 변경: This class now sends an ALPN extension with protocol indicator
@code{http/1.1} when no `context' is given. Custom `context' should set
ALPN protocols with @ref{1063,,set_alpn_protocols()}.



버전 3.12에서 변경: 폐지된 `key_file', `cert_file' 및 `check_hostname' 매개 변수를 제거했습니다.

@end deffn

@geindex HTTPResponse (http.client 클래스)
@anchor{library/http client http client HTTPResponse}@anchor{12d3}
@deffn {클래스} http.client.HTTPResponse (sock, debuglevel=0, method=None, url=None)

성공적으로 연결되면 반환되는 인스턴스의 클래스. 사용자가 직접 인스턴스화 하지 않습니다.


버전 3.4에서 변경: `strict' 매개 변수가 제거되었습니다. HTTP 0.9 스타일 “간단한 응답”은 더는 지원되지 않습니다.

@end deffn

이 모듈은 다음 함수를 제공합니다:

@geindex parse_headers() (http.client 모듈)
@anchor{library/http client http client parse_headers}@anchor{1e24}
@deffn {함수} http.client.parse_headers (fp)

Parse the headers from a file pointer `fp' representing a HTTP
request/response. The file has to be a @ref{8a2,,BufferedIOBase} reader
(i.e. not text) and must provide a valid 
@geindex RFC; RFC 5322
RFC 5322@footnote{https://datatracker.ietf.org/doc/html/rfc5322.html} style header.

이 함수는 헤더 필드를 담은 @ref{4000,,http.client.HTTPMessage} 인스턴스를 반환하지만, 페이 로드는 반환하지 않습니다 (@ref{4001,,HTTPResponse.msg}와 @ref{4002,,http.server.BaseHTTPRequestHandler.headers}와 같습니다). 반환 후, 파일 포인터 `fp'는 HTTP 바디를 읽을 준비가 되었습니다.

@cartouche
@quotation 참고 
@ref{1e24,,parse_headers()}는 HTTP 메시지의 시작 줄을 구문 분석하지 않습니다; @code{Name: value} 줄만 구문 분석합니다. 파일은 이러한 필드 줄을 읽을 준비가 되어 있어야 해서, 함수를 호출하기 전에 첫 번째 줄이 이미 소비되었어야 합니다.
@end quotation
@end cartouche
@end deffn

다음과 같은 예외가 적절하게 발생합니다:

@geindex HTTPException
@anchor{library/http client http client HTTPException}@anchor{4003}
@deffn {예외} http.client.HTTPException

이 모듈에 있는 다른 예외의 베이스 클래스입니다. @ref{bcc,,Exception}의 서브 클래스입니다.
@end deffn

@geindex NotConnected
@anchor{library/http client http client NotConnected}@anchor{4004}
@deffn {예외} http.client.NotConnected

@ref{4003,,HTTPException}의 서브 클래스.
@end deffn

@geindex InvalidURL
@anchor{library/http client http client InvalidURL}@anchor{4005}
@deffn {예외} http.client.InvalidURL

포트가 제공되고 숫자가 아니거나 비어있을 때 발생하는 @ref{4003,,HTTPException}의 서브 클래스.
@end deffn

@geindex UnknownProtocol
@anchor{library/http client http client UnknownProtocol}@anchor{4006}
@deffn {예외} http.client.UnknownProtocol

@ref{4003,,HTTPException}의 서브 클래스.
@end deffn

@geindex UnknownTransferEncoding
@anchor{library/http client http client UnknownTransferEncoding}@anchor{4007}
@deffn {예외} http.client.UnknownTransferEncoding

@ref{4003,,HTTPException}의 서브 클래스.
@end deffn

@geindex UnimplementedFileMode
@anchor{library/http client http client UnimplementedFileMode}@anchor{4008}
@deffn {예외} http.client.UnimplementedFileMode

@ref{4003,,HTTPException}의 서브 클래스.
@end deffn

@geindex IncompleteRead
@anchor{library/http client http client IncompleteRead}@anchor{4009}
@deffn {예외} http.client.IncompleteRead

@ref{4003,,HTTPException}의 서브 클래스.
@end deffn

@geindex ImproperConnectionState
@anchor{library/http client http client ImproperConnectionState}@anchor{400a}
@deffn {예외} http.client.ImproperConnectionState

@ref{4003,,HTTPException}의 서브 클래스.
@end deffn

@geindex CannotSendRequest
@anchor{library/http client http client CannotSendRequest}@anchor{400b}
@deffn {예외} http.client.CannotSendRequest

@ref{400a,,ImproperConnectionState}의 서브 클래스.
@end deffn

@geindex CannotSendHeader
@anchor{library/http client http client CannotSendHeader}@anchor{400c}
@deffn {예외} http.client.CannotSendHeader

@ref{400a,,ImproperConnectionState}의 서브 클래스.
@end deffn

@geindex ResponseNotReady
@anchor{library/http client http client ResponseNotReady}@anchor{400d}
@deffn {예외} http.client.ResponseNotReady

@ref{400a,,ImproperConnectionState}의 서브 클래스.
@end deffn

@geindex BadStatusLine
@anchor{library/http client http client BadStatusLine}@anchor{400e}
@deffn {예외} http.client.BadStatusLine

@ref{4003,,HTTPException}의 서브 클래스. 이해하지 못하는 HTTP 상태 코드로 서버가 응답하면 발생합니다.
@end deffn

@geindex LineTooLong
@anchor{library/http client http client LineTooLong}@anchor{400f}
@deffn {예외} http.client.LineTooLong

@ref{4003,,HTTPException}의 서브 클래스. 서버에서 HTTP 프로토콜로 너무 긴 줄이 수신되면 발생합니다.
@end deffn

@geindex RemoteDisconnected
@anchor{library/http client http client RemoteDisconnected}@anchor{1009}
@deffn {예외} http.client.RemoteDisconnected

@ref{125e,,ConnectionResetError}와 @ref{400e,,BadStatusLine}의 서브 클래스. @ref{1008,,HTTPConnection.getresponse()}가 응답을 읽으려고 시도할 때 연결에서 아무런 데이터를 읽지 못하여, 원격 끝이 연결을 닫았음을 표시하면 발생합니다.


Added in version 3.5: 이전에는, @ref{400e,,BadStatusLine}@code{('@w{'})}가 발생했습니다.

@end deffn

이 모듈에 정의된 상수는 다음과 같습니다:

@geindex HTTP_PORT (http.client 모듈)
@anchor{library/http client http client HTTP_PORT}@anchor{4010}
@deffn {데이터} http.client.HTTP_PORT

HTTP 프로토콜의 기본 포트 (항상 @code{80}).
@end deffn

@geindex HTTPS_PORT (http.client 모듈)
@anchor{library/http client http client HTTPS_PORT}@anchor{4011}
@deffn {데이터} http.client.HTTPS_PORT

HTTPS 프로토콜의 기본 포트 (항상 @code{443}).
@end deffn

@geindex responses (http.client 모듈)
@anchor{library/http client http client responses}@anchor{4012}
@deffn {데이터} http.client.responses

이 딕셔너리는 HTTP 1.1 상태 코드를 W3C 이름으로 매핑합니다.

예: @code{http.client.responses[http.client.NOT_FOUND]}는 @code{'Not Found'}입니다.
@end deffn

이 모듈에서 상수로 사용 가능한 HTTP 상태 코드 목록은 @ref{3ff7,,HTTP 상태 코드}를 참조하십시오.

@menu
* HTTPConnection 객체:: 
* HTTPResponse 객체:: 
* 예: 예<12>. 
* HTTPMessage 객체:: 

@end menu

@node HTTPConnection 객체,HTTPResponse 객체,,http client — HTTP 프로토콜 클라이언트
@anchor{library/http client httpconnection-objects}@anchor{4013}@anchor{library/http client id1}@anchor{4014}
@subsubsection HTTPConnection 객체


@ref{d34,,HTTPConnection} 인스턴스에는 다음과 같은 메서드가 있습니다:

@geindex request() (http.client.HTTPConnection 메서드)
@anchor{library/http client http client HTTPConnection request}@anchor{ea6}
@deffn {메서드} HTTPConnection.request (method, url, body=None, headers=@{@}, *, encode_chunked=False)

HTTP 요청 메서드 `method'와 요청 URI `url'을 사용하여 서버로 요청을 보냅니다. 제공된 `url'은 (HTTP 프록시 서버에 연결하거나 @code{OPTIONS}나 @code{CONNECT} 메서드를 사용하지 않는 한) 
@geindex RFC; RFC 2616 Section 5.1.2
RFC 2616 §5.1.2@footnote{https://datatracker.ietf.org/doc/html/rfc2616.html#section-5.1.2}를 준수하는 절대 경로여야 합니다.

`body'가 지정되면, 헤더가 완료된 후 지정된 데이터가 전송됩니다. @ref{169,,str}, @ref{193,,바이트열류 객체}, 열린 @ref{13c8,,파일 객체} 또는 @ref{192,,bytes}의 이터러블일 수 있습니다. `body'가 문자열이면, HTTP의 기본값인 ISO-8859-1로 인코딩됩니다. 바이트열류 객체이면, 바이트열은 그대로 전송됩니다. 파일 객체이면, 파일의 내용이 전송됩니다; 이 파일 객체는 최소한 @code{read()} 메서드를 지원해야 합니다. 파일 객체가 @ref{8a3,,io.TextIOBase}의 인스턴스이면, @code{read()} 메서드에서 반환된 데이터는 ISO-8859-1로 인코딩되고, 그렇지 않으면 @code{read()}에서 반환된 데이터가 그대로 전송됩니다. `body'가 이터러블이면, 이터러블이 소진될 때까지 이터러블의 요소가 그대로 전송됩니다.

`headers' 인자는 요청과 함께 보낼 추가 HTTP 헤더의 매핑이어야 합니다. (HTTP 프록시 서버에 연결하거나 @code{OPTIONS}나 @code{CONNECT} 메서드를 사용하지 않는 한) 
@geindex RFC; RFC 2616 Section 14.23
Host 헤더@footnote{https://datatracker.ietf.org/doc/html/rfc2616.html#section-14.23}는 
@geindex RFC; RFC 2616 Section 5.1.2
RFC 2616 §5.1.2@footnote{https://datatracker.ietf.org/doc/html/rfc2616.html#section-5.1.2}를 준수하도록 제공되어야 합니다.

`headers'에 Content-Length도 Transfer-Encoding도 없지만, 요청 바디가 있으면, 이 헤더 필드 중 하나가 자동으로 추가됩니다. `body'가 @code{None}이면, 바디를 기대하는 메서드(@code{PUT}, @code{POST} 및 @code{PATCH})의 경우 Content-Length 헤더가 @code{0}으로 설정됩니다. `body'가 문자열이거나 @ref{13c8,,파일}이 아닌 바이트열류 객체이면, Content-Length 헤더가 그것의 길이로 설정됩니다. 다른 모든 형의 `body'(파일과 이터러블 일반)는 청크 인코딩되며 Content-Length 대신 Transfer-Encoding 헤더가 자동으로 설정됩니다.

`encode_chunked' 인자는 Transfer-Encoding이 `headers'에 지정된 경우에만 유효합니다. `encode_chunked'가 @code{False}이면, HTTPConnection 객체는 모든 인코딩이 호출하는 코드에서 처리된다고 가정합니다. @code{True}이면, 바디가 청크 인코딩됩니다.

For example, to perform a @code{GET} request to @code{https://docs.python.org/3/}:

@example
>>> import http.client
>>> host = "docs.python.org"
>>> conn = http.client.HTTPSConnection(host)
>>> conn.request("GET", "/3/", headers=@{"Host": host@})
>>> response = conn.getresponse()
>>> print(response.status, response.reason)
200 OK
@end example

@cartouche
@quotation 참고 
청크 전송 인코딩은 HTTP 프로토콜 버전 1.1에 추가되었습니다. HTTP 서버가 HTTP 1.1을 처리하는 것으로 알려지지 않은 한, 호출자는 Content-Length를 지정하거나, 바디 표현으로 @ref{169,,str}이나 파일이 아닌 바이트열류 객체를 전달해야 합니다.
@end quotation
@end cartouche

@cartouche
@quotation 참고 
Note that you must have read the whole response or call @ref{4015,,close()}
if @ref{1008,,getresponse()} raised an non-@ref{100a,,ConnectionError} exception
before you can send a new request to the server.
@end quotation
@end cartouche


버전 3.2에서 변경: `body'는 이제 이터러블일 수 있습니다.



버전 3.6에서 변경: Content-Length도 Transfer-Encoding도 `headers'에 설정되지 않으면, 파일과 이터러블 `body' 객체는 이제 청크 인코딩됩니다. `encode_chunked' 인자가 추가되었습니다. 파일 객체의 Content-Length를 결정하려는 시도는 없습니다.

@end deffn

@geindex getresponse() (http.client.HTTPConnection 메서드)
@anchor{library/http client http client HTTPConnection getresponse}@anchor{1008}
@deffn {메서드} HTTPConnection.getresponse ()

요청을 보낸 후에 서버에서 응답을 받기 위해 호출해야 합니다. @ref{12d3,,HTTPResponse} 인스턴스를 반환합니다.


버전 3.5에서 변경: @ref{100a,,ConnectionError}나 서브 클래스가 발생하면, 새 요청이 전송될 때 @ref{d34,,HTTPConnection} 객체는 다시 연결할 준비가 됩니다.

Note that this does not apply to @ref{2c0,,OSError}s raised by the underlying
socket. Instead the caller is responsible to call @ref{4015,,close()} on the
existing connection.

@end deffn

@geindex set_debuglevel() (http.client.HTTPConnection 메서드)
@anchor{library/http client http client HTTPConnection set_debuglevel}@anchor{4016}
@deffn {메서드} HTTPConnection.set_debuglevel (level)

디버깅 수준을 설정합니다. 기본 디버그 수준은 @code{0}이며, 디버깅 출력이 인쇄되지 않음을 의미합니다. @code{0}보다 큰 값을 지정하면 현재 정의된 모든 디버그 출력이 표준 출력으로 인쇄됩니다. @code{debuglevel}은 만들어지는 모든 새로운 @ref{12d3,,HTTPResponse} 객체로 전달됩니다.


Added in version 3.1.

@end deffn

@geindex set_tunnel() (http.client.HTTPConnection 메서드)
@anchor{library/http client http client HTTPConnection set_tunnel}@anchor{142d}
@deffn {메서드} HTTPConnection.set_tunnel (host, port=None, headers=None)

HTTP Connect 터널링(tunnelling)을 위한 host와 및 port를 설정합니다. 프락시 서버를 통해 연결을 실행할 수 있도록 합니다.

`host'와 `port' 인자는 터널링 된 연결의 말단(즉 CONNECT 요청에 포함되는 주소, 프락시 서버의 주소가 `아닙니다')을 지정합니다.

`headers' 인자는 CONNECT 요청과 함께 보낼 추가 HTTP 헤더의 매핑이어야 합니다.

As HTTP/1.1 is used for HTTP CONNECT tunnelling request, as per the RFC@footnote{https://datatracker.ietf.org/doc/html/rfc7231#section-4.3.6}, a HTTP @code{Host:}
header must be provided, matching the authority-form of the request target
provided as the destination for the CONNECT request. If a HTTP @code{Host:}
header is not provided via the headers argument, one is generated and
transmitted automatically.

예를 들어, 포트 8080에서 로컬로 실행되는 HTTPS 프락시 서버를 통해 터널링 하려면, 프락시 주소를 @ref{d35,,HTTPSConnection} 생성자에 전달하고, 최종적으로 @ref{142d,,set_tunnel()} 메서드에 도달하려는 호스트 주소를 전달합니다:

@example
>>> import http.client
>>> conn = http.client.HTTPSConnection("localhost", 8080)
>>> conn.set_tunnel("www.python.org")
>>> conn.request("HEAD","/index.html")
@end example


Added in version 3.2.



버전 3.12에서 변경: HTTP CONNECT tunnelling requests use protocol HTTP/1.1, upgraded from
protocol HTTP/1.0. @code{Host:} HTTP headers are mandatory for HTTP/1.1, so
one will be automatically generated and transmitted if not provided in
the headers argument.

@end deffn

@geindex get_proxy_response_headers() (http.client.HTTPConnection 메서드)
@anchor{library/http client http client HTTPConnection get_proxy_response_headers}@anchor{1a73}
@deffn {메서드} HTTPConnection.get_proxy_response_headers ()

Returns a dictionary with the headers of the response received from
the proxy server to the CONNECT request.

If the CONNECT request was not sent, the method returns @code{None}.


Added in version 3.12.

@end deffn

@geindex connect() (http.client.HTTPConnection 메서드)
@anchor{library/http client http client HTTPConnection connect}@anchor{4017}
@deffn {메서드} HTTPConnection.connect ()

객체가 만들어질 때 지정된 서버에 연결합니다. 기본적으로, 클라이언트가 이미 연결되지 않았다면 요청 시 자동으로 호출됩니다.

Raises an @ref{1c6c,,auditing event} @code{http.client.connect} with arguments @code{self}, @code{host}, @code{port}.
@end deffn

@geindex close() (http.client.HTTPConnection 메서드)
@anchor{library/http client http client HTTPConnection close}@anchor{4015}
@deffn {메서드} HTTPConnection.close ()

서버로의 연결을 닫습니다.
@end deffn

@geindex blocksize (http.client.HTTPConnection의 속성)
@anchor{library/http client http client HTTPConnection blocksize}@anchor{4018}
@deffn {속성} HTTPConnection.blocksize

파일류 메시지 바디를 보내기 위한 바이트 단위의 버퍼 크기.


Added in version 3.7.

@end deffn

위에서 설명한 @ref{ea6,,request()} 메서드를 사용하는 대신, 아래 네 가지 함수를 사용하여 단계별로 요청을 보낼 수도 있습니다.

@geindex putrequest() (http.client.HTTPConnection 메서드)
@anchor{library/http client http client HTTPConnection putrequest}@anchor{4019}
@deffn {메서드} HTTPConnection.putrequest (method, url, skip_host=False, skip_accept_encoding=False)

서버에 연결한 후 첫 번째 호출이어야 합니다. `method' 문자열, `url' 문자열 및 HTTP 버전(@code{HTTP/1.1})으로 구성된 줄을 서버로 보냅니다. @code{Host:}나 @code{Accept-Encoding:} 헤더의 자동 전송을 비활성화하려면 (예를 들어 추가 콘텐츠 인코딩을 허용하려면), False가 아닌 값으로 `skip_host'나 `skip_accept_encoding'을 지정하십시오.
@end deffn

@geindex putheader() (http.client.HTTPConnection 메서드)
@anchor{library/http client http client HTTPConnection putheader}@anchor{401a}
@deffn {메서드} HTTPConnection.putheader (header, argument[, ...])

@geindex RFC; RFC 822
RFC 822@footnote{https://datatracker.ietf.org/doc/html/rfc822.html} 스타일 헤더를 서버에 보냅니다. header, 콜론과 공백 및 첫 번째 인자로 구성된 줄을 서버로 보냅니다. 더 많은 인자가 제공되면, 탭과 인자로 구성된 연속 줄(continuation lines)이 전송됩니다.
@end deffn

@geindex endheaders() (http.client.HTTPConnection 메서드)
@anchor{library/http client http client HTTPConnection endheaders}@anchor{ea7}
@deffn {메서드} HTTPConnection.endheaders (message_body=None, *, encode_chunked=False)

헤더의 끝을 알리는 빈 줄을 서버에 보냅니다. 선택적 `message_body' 인자를 사용하여 요청과 연관된 메시지 바디를 전달할 수 있습니다.

`encode_chunked'가 @code{True}이면, `message_body'의 각 이터레이션 결과는 
@geindex RFC; RFC 7230
RFC 7230@footnote{https://datatracker.ietf.org/doc/html/rfc7230.html}, 섹션 3.3.1에 지정된 대로 청크 인코딩됩니다. 데이터의 인코딩 방식은 `message_body'의 형에 따라 다릅니다. `message_body'가 @ref{260,,버퍼 인터페이스}를 구현하면, 인코딩은 단일 청크를 만듭니다. `message_body'가 @ref{26b4,,collections.abc.Iterable}이면, `message_body'의 각 이터레이션이 청크가 됩니다. `message_body'가 @ref{13c8,,파일 객체}이면, 각 @code{.read()} 호출마다 청크가 됩니다. 이 메서드는 `message_body' 직후에 청크 인코딩된 데이터의 끝을 자동으로 알립니다.

@cartouche
@quotation 참고 
청크 인코딩 명세로 인해, 이터레이터 바디에서 산출된 빈 청크는 청크 인코더에서 무시됩니다. 이는 형식이 잘못된 인코딩으로 인해 대상 서버의 요청 읽기가 조기에 종료되지 않도록 하려는 것입니다.
@end quotation
@end cartouche


버전 3.6에서 변경: 청크 인코딩 지원과 `encode_chunked' 매개 변수가 추가되었습니다.

@end deffn

@geindex send() (http.client.HTTPConnection 메서드)
@anchor{library/http client http client HTTPConnection send}@anchor{401b}
@deffn {메서드} HTTPConnection.send (data)

서버로 data를 보냅니다. 이것은 @ref{ea7,,endheaders()} 메서드가 호출된 후, 그리고 @ref{1008,,getresponse()}가 호출되기 전에만 직접 사용해야 합니다.

Raises an @ref{1c6c,,auditing event} @code{http.client.send} with arguments @code{self}, @code{data}.
@end deffn

@node HTTPResponse 객체,예<12>,HTTPConnection 객체,http client — HTTP 프로토콜 클라이언트
@anchor{library/http client httpresponse-objects}@anchor{401c}@anchor{library/http client id2}@anchor{401d}
@subsubsection HTTPResponse 객체


@ref{12d3,,HTTPResponse} 인스턴스는 서버의 HTTP 응답을 감쌉니다. 요청 헤더와 엔티티 바디에 대한 액세스를 제공합니다. 응답은 이터러블 객체이며 with 문에서 사용할 수 있습니다.


버전 3.5에서 변경: @ref{8a2,,io.BufferedIOBase} 인터페이스가 이제 구현되었으며 이것의 모든 판독기(reader) 연산이 지원됩니다.


@geindex read() (http.client.HTTPResponse 메서드)
@anchor{library/http client http client HTTPResponse read}@anchor{18b0}
@deffn {메서드} HTTPResponse.read ([amt])

응답 바디나 다음 최대 `amt' 바이트를 읽고 반환합니다.
@end deffn

@geindex readinto() (http.client.HTTPResponse 메서드)
@anchor{library/http client http client HTTPResponse readinto}@anchor{12d4}
@deffn {메서드} HTTPResponse.readinto (b)

응답 바디의 다음 최대 len(b) 바이트를 버퍼 `b'로 읽습니다. 읽은 바이트 수를 반환합니다.


Added in version 3.3.

@end deffn

@geindex getheader() (http.client.HTTPResponse 메서드)
@anchor{library/http client http client HTTPResponse getheader}@anchor{401e}
@deffn {메서드} HTTPResponse.getheader (name, default=None)

헤더 `name'의 값을 반환하거나, `name'과 일치하는 헤더가 없으면 `default'를 반환합니다. 이름이 `name'인 헤더가 둘 이상 있으면, ‘,’로 연결한 모든 값을 반환합니다. `default'가 단일 문자열 이외의 이터러블이면, 해당 요소들도 마찬가지로 쉼표로 연결되어 반환됩니다.
@end deffn

@geindex getheaders() (http.client.HTTPResponse 메서드)
@anchor{library/http client http client HTTPResponse getheaders}@anchor{401f}
@deffn {메서드} HTTPResponse.getheaders ()

(헤더, 값) 튜플의 리스트를 반환합니다.
@end deffn

@geindex fileno() (http.client.HTTPResponse 메서드)
@anchor{library/http client http client HTTPResponse fileno}@anchor{4020}
@deffn {메서드} HTTPResponse.fileno ()

하부 소켓의 @code{fileno}를 반환합니다.
@end deffn

@geindex msg (http.client.HTTPResponse의 속성)
@anchor{library/http client http client HTTPResponse msg}@anchor{4001}
@deffn {속성} HTTPResponse.msg

응답 헤더를 포함하는 @ref{4000,,http.client.HTTPMessage} 인스턴스. @code{http.client.HTTPMessage}는 @ref{580,,email.message.Message}의 서브 클래스입니다.
@end deffn

@geindex version (http.client.HTTPResponse의 속성)
@anchor{library/http client http client HTTPResponse version}@anchor{4021}
@deffn {속성} HTTPResponse.version

서버가 사용하는 HTTP 프로토콜 버전. HTTP/1.0의 경우 10, HTTP/1.1의 경우 11.
@end deffn

@geindex url (http.client.HTTPResponse의 속성)
@anchor{library/http client http client HTTPResponse url}@anchor{4022}
@deffn {속성} HTTPResponse.url

가져온 자원의 URL, 일반적으로 리디렉션을 따라갔는지 판별하는 데 사용됩니다.
@end deffn

@geindex headers (http.client.HTTPResponse의 속성)
@anchor{library/http client http client HTTPResponse headers}@anchor{4023}
@deffn {속성} HTTPResponse.headers

@ref{57f,,email.message.EmailMessage} 인스턴스 형식의 응답 헤더.
@end deffn

@geindex status (http.client.HTTPResponse의 속성)
@anchor{library/http client http client HTTPResponse status}@anchor{4024}
@deffn {속성} HTTPResponse.status

서버가 반환한 상태 코드.
@end deffn

@geindex reason (http.client.HTTPResponse의 속성)
@anchor{library/http client http client HTTPResponse reason}@anchor{3f4f}
@deffn {속성} HTTPResponse.reason

서버가 반환한 이유 문구.
@end deffn

@geindex debuglevel (http.client.HTTPResponse의 속성)
@anchor{library/http client http client HTTPResponse debuglevel}@anchor{4025}
@deffn {속성} HTTPResponse.debuglevel

디버깅 훅. @ref{4025,,debuglevel}이 0보다 크면, 응답을 읽고 구문 분석할 때 메시지가 표준 출력으로 인쇄됩니다.
@end deffn

@geindex closed (http.client.HTTPResponse의 속성)
@anchor{library/http client http client HTTPResponse closed}@anchor{4026}
@deffn {속성} HTTPResponse.closed

스트림이 닫혔으면 @code{True}입니다.
@end deffn

@geindex geturl() (http.client.HTTPResponse 메서드)
@anchor{library/http client http client HTTPResponse geturl}@anchor{4027}
@deffn {메서드} HTTPResponse.geturl ()


버전 3.9부터 폐지됨: 폐지되었고 @ref{4022,,url}로 대체되었습니다.

@end deffn

@geindex info() (http.client.HTTPResponse 메서드)
@anchor{library/http client http client HTTPResponse info}@anchor{4028}
@deffn {메서드} HTTPResponse.info ()


버전 3.9부터 폐지됨: 폐지되었고 @ref{4023,,headers}로 대체되었습니다.

@end deffn

@geindex getcode() (http.client.HTTPResponse 메서드)
@anchor{library/http client http client HTTPResponse getcode}@anchor{4029}
@deffn {메서드} HTTPResponse.getcode ()


버전 3.9부터 폐지됨: 폐지되었고 @ref{4024,,status}로 대체되었습니다.

@end deffn

@node 예<12>,HTTPMessage 객체,HTTPResponse 객체,http client — HTTP 프로토콜 클라이언트
@anchor{library/http client examples}@anchor{402a}
@subsubsection 예


@code{GET} 메서드를 사용하는 예제 세션은 다음과 같습니다:

@example
>>> import http.client
>>> conn = http.client.HTTPSConnection("www.python.org")
>>> conn.request("GET", "/")
>>> r1 = conn.getresponse()
>>> print(r1.status, r1.reason)
200 OK
>>> data1 = r1.read()  # 전체 내용을 반환합니다.
>>> # 다음 예제는 청크로 데이터를 읽는 방법을 보여줍니다.
>>> conn.request("GET", "/")
>>> r1 = conn.getresponse()
>>> while chunk := r1.read(200):
...     print(repr(chunk))
b'<!doctype html>\n<!--[if"...
...
>>> # 유효하지 않은 요청의 예
>>> conn = http.client.HTTPSConnection("docs.python.org")
>>> conn.request("GET", "/parrot.spam")
>>> r2 = conn.getresponse()
>>> print(r2.status, r2.reason)
404 Not Found
>>> data2 = r2.read()
>>> conn.close()
@end example

다음은 @code{HEAD} 메서드를 사용하는 예제 세션입니다. @code{HEAD} 메서드는 어떤 데이터도 반환하지 않음에 유의하십시오.

@example
>>> import http.client
>>> conn = http.client.HTTPSConnection("www.python.org")
>>> conn.request("HEAD", "/")
>>> res = conn.getresponse()
>>> print(res.status, res.reason)
200 OK
>>> data = res.read()
>>> print(len(data))
0
>>> data == b'@w{'}
True
@end example

@code{POST} 메서드를 사용하는 예제 세션은 다음과 같습니다:

@example
>>> import http.client, urllib.parse
>>> params = urllib.parse.urlencode(@{'@@number': 12524, '@@type': 'issue', '@@action': 'show'@})
>>> headers = @{"Content-type": "application/x-www-form-urlencoded",
...            "Accept": "text/plain"@}
>>> conn = http.client.HTTPConnection("bugs.python.org")
>>> conn.request("POST", "", params, headers)
>>> response = conn.getresponse()
>>> print(response.status, response.reason)
302 Found
>>> data = response.read()
>>> data
b'Redirecting to <a href="https://bugs.python.org/issue12524">https://bugs.python.org/issue12524</a>'
>>> conn.close()
@end example

클라이언트 측 HTTP @code{PUT} 요청은 @code{POST} 요청과 매우 유사합니다. 차이점은 HTTP 서버가 @code{PUT} 요청을 통해 리소스를 만들도록 허락하는 서버 측에만 있습니다. 사용자 정의 HTTP 메서드는 적절한 method 어트리뷰트를 설정함으로써 @ref{11d7,,urllib.request.Request}에서도 처리된다는 점에 주목해야 합니다. 다음은 @code{PUT} 메서드를 사용하는 예제 세션입니다:

@example
>>> # http://localhost:8080/file 리소스의 동봉된 표현으로
>>> # BODY의 내용이 포함된
>>> # HTTP 메시지를 만듭니다
...
>>> import http.client
>>> BODY = "***filecontents***"
>>> conn = http.client.HTTPConnection("localhost", 8080)
>>> conn.request("PUT", "/file", BODY)
>>> response = conn.getresponse()
>>> print(response.status, response.reason)
200, OK
@end example

@node HTTPMessage 객체,,예<12>,http client — HTTP 프로토콜 클라이언트
@anchor{library/http client httpmessage-objects}@anchor{402b}@anchor{library/http client id3}@anchor{402c}
@subsubsection HTTPMessage 객체


@geindex HTTPMessage (http.client 클래스)
@anchor{library/http client http client HTTPMessage}@anchor{4000}
@deffn {클래스} http.client.HTTPMessage (email.message.Message)
@end deffn

@ref{4000,,http.client.HTTPMessage} 인스턴스는 HTTP 응답의 헤더를 보유합니다. @ref{580,,email.message.Message} 클래스를 사용하여 구현됩니다.

@c XXX Define the methods that clients can depend upon between versions.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node ftplib — FTP 프로토콜 클라이언트,poplib — POP3 프로토콜 클라이언트,http client — HTTP 프로토콜 클라이언트,인터넷 프로토콜과 지원
@anchor{library/ftplib doc}@anchor{402d}@anchor{library/ftplib ftplib-ftp-protocol-client}@anchor{402e}@anchor{library/ftplib module-ftplib}@anchor{62}@anchor{library/ftplib translation-repo}@anchor{402f}
@subsection @code{ftplib} — FTP 프로토콜 클라이언트


@geindex module; ftplib

`소스 코드:' Lib/ftplib.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/ftplib.py}

@geindex FTP;프로토콜
@geindex FTP;ftplib (표준 모듈)


__________________________________________________________________


이 모듈은 @ref{af6,,FTP} 클래스와 몇 가지 관련 항목을 정의합니다. @code{FTP} 클래스는 FTP 프로토콜의 클라이언트 쪽을 구현합니다. 이것을 사용하여 다른 FTP 서버 미러링과 같은 다양한 자동화된 FTP 작업을 수행하는 파이썬 프로그램을 작성할 수 있습니다. 또한 @ref{111,,urllib.request} 모듈에서 FTP를 사용하는 URL을 처리하는 데 사용됩니다. FTP(File Transfer Protocol)에 대한 자세한 내용은 인터넷 
@geindex RFC; RFC 959
RFC 959@footnote{https://datatracker.ietf.org/doc/html/rfc959.html}를 참조하십시오.

@geindex RFC; RFC 2640
RFC 2640@footnote{https://datatracker.ietf.org/doc/html/rfc2640.html}에 따라, 기본 인코딩은 UTF-8입니다.

@c include for modules that don't work on WASM

@ref{213c,,가용성}: not WASI.

이 모듈은 웹어셈블리에서 작동하지 않거나 제공되지 않습니다. 자세한 내용은 @ref{1b68,,웹어셈블리 플랫폼}을 참조하세요.

Here’s a sample session using the @code{ftplib} module:

@example
>>> from ftplib import FTP
>>> ftp = FTP('ftp.us.debian.org')  # 기본 포트로 호스트에 연결합니다
>>> ftp.login()                     # user anonymous, passwd anonymous@@
'230 Login successful.'
>>> ftp.cwd('debian')               # "debian" 디렉터리로 변경합니다
'250 Directory successfully changed.'
>>> ftp.retrlines('LIST')           # 디렉터리 내용의 목록을 얻습니다
-rw-rw-r--    1 1176     1176         1063 Jun 15 10:18 README
...
drwxr-sr-x    5 1176     1176         4096 Dec 19  2000 pool
drwxr-sr-x    4 1176     1176         4096 Nov 17  2008 project
drwxr-xr-x    3 1176     1176         4096 Oct 10  2012 tools
'226 Directory send OK.'
>>> with open('README', 'wb') as fp:
>>>     ftp.retrbinary('RETR README', fp.write)
'226 Transfer complete.'
>>> ftp.quit()
'221 Goodbye.'
@end example

@menu
* 레퍼런스: 레퍼런스<4>. 

@end menu

@node 레퍼런스<4>,,,ftplib — FTP 프로토콜 클라이언트
@anchor{library/ftplib ftplib-reference}@anchor{4030}@anchor{library/ftplib reference}@anchor{4031}
@subsubsection 레퍼런스


@menu
* FTP 객체:: 
* FTP_TLS 객체:: 
* 모듈 변수:: 

@end menu

@node FTP 객체,FTP_TLS 객체,,레퍼런스<4>
@anchor{library/ftplib ftp-objects}@anchor{4032}@anchor{library/ftplib id1}@anchor{4033}
@subsubsection FTP 객체


@c Use substitutions for some param docs so we don't need to repeat them
@c in multiple places.

@c Ideally, we'd like to use the :rfc: directive, but Sphinx will not allow it.

@geindex FTP (ftplib 클래스)
@anchor{library/ftplib ftplib FTP}@anchor{af6}
@deffn {클래스} ftplib.FTP (host='@w{'}, user='@w{'}, passwd='@w{'}, acct='@w{'}, timeout=None, source_address=None, *, encoding='utf-8')

@ref{af6,,FTP} 클래스의 새 인스턴스를 반환합니다.

@*매개변수: 

@itemize *

@item 
@code{host} (@ref{169,,str}) – 연결할 호스트명. 주어지면, 생성자가 @code{connect(host)}를 묵시적으로 호출합니다.

@item 
@code{user} (@ref{169,,str}) – The username to log in with (default: @code{'anonymous'}). 주어지면, 생성자가 @code{login(host, passwd, acct)}를 묵시적으로 호출합니다.

@item 
@code{passwd} (@ref{169,,str}) – The password to use when logging in.
If not given, and if `passwd' is the empty string or @code{"-"},
a password will be automatically generated.

@item 
@code{acct} (@ref{169,,str}) – Account information to be used for the @code{ACCT} FTP command.
Few systems implement this.
See RFC-959@footnote{https://datatracker.ietf.org/doc/html/rfc959.html}
for more details.

@item 
@code{timeout} (@ref{196,,float}@code{ | }@code{None}) – @ref{4034,,connect()}와 같은 블로킹 연산에 대한 시간제한을 초로 지정 (기본값: 전역 기본 시간제한 설정).

@item 
@code{source_address} (@ref{610,,tuple}@code{ | }@code{None}) – A 2-tuple @code{(host, port)} for the socket to bind to as its
source address before connecting.

@item 
@code{encoding} (@ref{169,,str}) – The encoding for directories and filenames (default: @code{'utf-8'}).
@end itemize


@ref{af6,,FTP} 클래스는 @ref{186,,with} 문을 지원합니다, 예를 들어:

@example
>>> from ftplib import FTP
>>> with FTP("ftp1.at.proftpd.org") as ftp:
...     ftp.login()
...     ftp.dir()
...
'230 Anonymous login ok, restrictions apply.'
dr-xr-xr-x   9 ftp      ftp           154 May  6 10:43 .
dr-xr-xr-x   9 ftp      ftp           154 May  6 10:43 ..
dr-xr-xr-x   5 ftp      ftp          4096 May  6 10:43 CentOS
dr-xr-xr-x   3 ftp      ftp            18 Jul 10  2008 Fedora
>>>
@end example


버전 3.2에서 변경: @ref{186,,with} 문에 대한 지원이 추가되었습니다.



버전 3.3에서 변경: `source_address' 매개 변수가 추가되었습니다.



버전 3.9에서 변경: `timeout' 매개 변수가 0으로 설정되면, 비 블로킹 소켓이 만들어지지 않도록 @ref{2ec,,ValueError}를 발생시킵니다. `encoding' 매개 변수가 추가되었으며, 기본값은 Latin-1 에서 UTF-8로 변경되어 
@geindex RFC; RFC 2640
RFC 2640@footnote{https://datatracker.ietf.org/doc/html/rfc2640.html}을 따릅니다.


여러 @code{FTP} 메서드가 두 가지 스타일로 제공됩니다: 텍스트 파일을 처리하는 것과 바이너리 파일을 위한 것. 명령 뒤에 텍스트 버전의 경우 @code{lines}, 바이너리 버전의 경우 @code{binary}를 붙여서 이 메서드들의 이름을 지정했습니다.

@ref{af6,,FTP} 인스턴스에는 다음과 같은 메서드가 있습니다:

@geindex set_debuglevel() (ftplib.FTP 메서드)
@anchor{library/ftplib ftplib FTP set_debuglevel}@anchor{4035}
@deffn {메서드} set_debuglevel (level)

인스턴스의 디버깅 수준을 @ref{19b,,int}로 설정합니다. 인쇄되는 디버깅 출력의 양을 제어합니다. 디버깅 수준은 다음과 같습니다:


@itemize *

@item 
@code{0} (기본값): 디버깅 출력을 생성하지 않습니다.

@item 
@code{1}: 적당한 양의 디버깅 출력, 일반적으로 요청당 한 줄을 생성합니다.

@item 
@code{2} 이상: 제어 연결에서 보내고 받는 각 줄을 로깅하여 최대량의 디버깅 출력을 생성합니다.
@end itemize
@end deffn

@geindex connect() (ftplib.FTP 메서드)
@anchor{library/ftplib ftplib FTP connect}@anchor{4034}
@deffn {메서드} connect (host='@w{'}, port=0, timeout=None, source_address=None)

주어진 host와 port에 연결합니다. 이 함수는 각 인스턴스에 대해 한 번만 호출해야 합니다; @ref{af6,,FTP} 인스턴스를 만들 때 `host' 인자가 제공되었으면, 호출되지 않아야 합니다. 다른 모든 @code{FTP} 메서드는 연결이 성공적으로 이루어진 후에만 호출할 수 있습니다.

@*매개변수: 

@itemize *

@item 
@code{host} (@ref{169,,str}) – 연결할 호스트.

@item 
@code{port} (@ref{19b,,int}) – 연결할 TCP 포트 (기본값: @code{21}, FTP 프로토콜 명세에 지정된 대로). 다른 포트 번호를 지정할 필요는 거의 없습니다.

@item 
@code{timeout} (@ref{196,,float}@code{ | }@code{None}) – 연결 시도에 대한 시간제한 (기본값: 전역 기본 시간제한 설정).

@item 
@code{source_address} (@ref{610,,tuple}@code{ | }@code{None}) – A 2-tuple @code{(host, port)} for the socket to bind to as its
source address before connecting.
@end itemize


인자 @code{self}, @code{host}, @code{port}로 @ref{1c6c,,감사 이벤트} @code{ftplib.connect}를 발생시킵니다.


버전 3.3에서 변경: `source_address' 매개 변수가 추가되었습니다.

@end deffn

@geindex getwelcome() (ftplib.FTP 메서드)
@anchor{library/ftplib ftplib FTP getwelcome}@anchor{4036}
@deffn {메서드} getwelcome ()

초기 연결에 대한 응답으로 서버에서 보낸 환영 메시지를 반환합니다. (이 메시지에는 때때로 사용자와 관련될 수 있는 고지 사항이나 도움말 정보가 포함되어 있습니다.)
@end deffn

@geindex login() (ftplib.FTP 메서드)
@anchor{library/ftplib ftplib FTP login}@anchor{4037}
@deffn {메서드} login (user='anonymous', passwd='@w{'}, acct='@w{'})

연결된 FTP 서버로 로그인합니다. 이 함수는 연결이 설정된 후 각 인스턴스에 마다 한 번만 호출해야 합니다; @ref{af6,,FTP} 인스턴스가 만들어질 때 `host'와 `user' 인자가 제공되었으면 호출되지 않아야 합니다. 대부분의 FTP 명령은 클라이언트가 로그인한 후에만 허용됩니다.

@*매개변수: 

@itemize *

@item 
@code{user} (@ref{169,,str}) – The username to log in with (default: @code{'anonymous'}).

@item 
@code{passwd} (@ref{169,,str}) – The password to use when logging in.
If not given, and if `passwd' is the empty string or @code{"-"},
a password will be automatically generated.

@item 
@code{acct} (@ref{169,,str}) – Account information to be used for the @code{ACCT} FTP command.
Few systems implement this.
See RFC-959@footnote{https://datatracker.ietf.org/doc/html/rfc959.html}
for more details.
@end itemize

@end deffn

@geindex abort() (ftplib.FTP 메서드)
@anchor{library/ftplib ftplib FTP abort}@anchor{4038}
@deffn {메서드} abort ()

진행 중인 파일 전송을 중단합니다. 이것을 사용하는 것이 항상 동작하지는 않지만, 시도해 볼 가치가 있습니다.
@end deffn

@geindex sendcmd() (ftplib.FTP 메서드)
@anchor{library/ftplib ftplib FTP sendcmd}@anchor{4039}
@deffn {메서드} sendcmd (cmd)

간단한 명령 문자열을 서버로 보내고 응답 문자열을 반환합니다.

인자 @code{self}, @code{cmd}로 @ref{1c6c,,감사 이벤트} @code{ftplib.sendcmd}를 발생시킵니다.
@end deffn

@geindex voidcmd() (ftplib.FTP 메서드)
@anchor{library/ftplib ftplib FTP voidcmd}@anchor{403a}
@deffn {메서드} voidcmd (cmd)

간단한 명령 문자열을 서버로 보내고 응답을 처리합니다. 응답 코드가 성공(200–299 범위의 코드)에 해당하면 응답 문자열을 반환합니다. 그렇지 않으면 @ref{403b,,error_reply}를 발생시킵니다.

인자 @code{self}, @code{cmd}로 @ref{1c6c,,감사 이벤트} @code{ftplib.sendcmd}를 발생시킵니다.
@end deffn

@geindex retrbinary() (ftplib.FTP 메서드)
@anchor{library/ftplib ftplib FTP retrbinary}@anchor{403c}
@deffn {메서드} retrbinary (cmd, callback, blocksize=8192, rest=None)

바이너리 전송 모드로 파일을 가져옵니다.

@*매개변수: 

@itemize *

@item 
@code{cmd} (@ref{169,,str}) – 적절한 @code{RETR} 명령: @code{"RETR @var{filename}"}.

@item 
@code{callback} (@ref{2da2,,callable}) – 수신된 각 데이터 블록에 대해 호출되는 단일 매개 변수 콜러블로, 단일 인자는 @ref{192,,bytes} 형의 데이터입니다.

@item 
@code{blocksize} (@ref{19b,,int}) – 실제 전송을 수행하기 위해 만들어진 저수준 @ref{fa0,,socket} 객체에서 읽을 최대 청크 크기. `callback'에 전달되는 데이터의 최대 크기에 해당하기도 합니다. 기본값은 @code{8192}.

@item 
@code{rest} (@ref{19b,,int}) – 서버로 전송할 @code{REST} 명령. @ref{403d,,transfercmd()} 메서드의 `rest' 매개 변수에 대한 설명서를 참조하세요.
@end itemize

@end deffn

@geindex retrlines() (ftplib.FTP 메서드)
@anchor{library/ftplib ftplib FTP retrlines}@anchor{403e}
@deffn {메서드} retrlines (cmd, callback=None)

초기화 때 `encoding' 매개 변수로 지정된 인코딩으로 파일이나 디렉터리 목록을 가져옵니다. `cmd'는 적절한 @code{RETR} 명령(@ref{403c,,retrbinary()}를 참조하십시오)이거나 @code{LIST}나 @code{NLST}와 같은 명령(보통 단지 문자열 @code{'LIST'})이어야 합니다. @code{LIST}는 파일 목록과 해당 파일에 대한 정보를 가져옵니다. @code{NLST}는 파일 이름 목록을 가져옵니다. `callback' 함수는 각 줄에 대해 호출되며, 후행 CRLF가 제거된 줄을 포함하는 문자열을 인자로 제공합니다. 기본 `callback'은 줄을 @ref{ccc,,sys.stdout}으로 인쇄합니다.
@end deffn

@geindex set_pasv() (ftplib.FTP 메서드)
@anchor{library/ftplib ftplib FTP set_pasv}@anchor{403f}
@deffn {메서드} set_pasv (val)

`val'이 참이면 “수동(passive)” 모드를 활성화하고, 그렇지 않으면 수동 모드를 비활성화합니다. 수동 모드는 기본적으로 켜져 있습니다.
@end deffn

@geindex storbinary() (ftplib.FTP 메서드)
@anchor{library/ftplib ftplib FTP storbinary}@anchor{150e}
@deffn {메서드} storbinary (cmd, fp, blocksize=8192, callback=None, rest=None)

바이너리 전송 모드로 파일을 저장합니다.

@*매개변수: 

@itemize *

@item 
@code{cmd} (@ref{169,,str}) – 적절한 @code{STOR} 명령: @code{"STOR @var{filename}"}.

@item 
@code{fp} (@ref{13c8,,file object}) – (바이너리 모드로 열린) 파일 객체이며 저장될 데이터를 제공하기 위해 `blocksize' 크기의 블록으로 @code{read()} 메서드를 사용하여 EOF까지 읽힙니다.

@item 
@code{blocksize} (@ref{19b,,int}) – 읽기 블록 크기. 기본값은 @code{8192}.

@item 
@code{callback} (@ref{2da2,,callable}) – 전송된 각 데이터 블록에 대해 호출되는 단일 매개 변수 콜러블로, 단일 인자는 @ref{192,,bytes} 형의 데이터입니다.

@item 
@code{rest} (@ref{19b,,int}) – 서버로 전송할 @code{REST} 명령. @ref{403d,,transfercmd()} 메서드의 `rest' 매개 변수에 대한 설명서를 참조하세요.
@end itemize



버전 3.2에서 변경: `rest' 매개 변수가 추가되었습니다.

@end deffn

@geindex storlines() (ftplib.FTP 메서드)
@anchor{library/ftplib ftplib FTP storlines}@anchor{4040}
@deffn {메서드} storlines (cmd, fp, callback=None)

줄 모드로 파일을 저장합니다. `cmd'는 적절한 @code{STOR} 명령이어야 합니다 (@ref{150e,,storbinary()}를 참조하십시오). 저장될 데이터를 제공하기 위해 @ref{152e,,readline()} 메서드를 사용하여 (바이너리 모드로 열린) @ref{13c8,,파일 객체} `fp'에서 EOF까지 줄을 읽어 들입니다. `callback'은 줄마다 보내진 다음에 호출되는 선택적 단일 매개 변수 콜러블입니다.
@end deffn

@geindex transfercmd() (ftplib.FTP 메서드)
@anchor{library/ftplib ftplib FTP transfercmd}@anchor{403d}
@deffn {메서드} transfercmd (cmd, rest=None)

데이터 연결을 통해 전송을 시작합니다. 전송이 활성화되면, @code{EPRT}나 @code{PORT} 명령과 `cmd'로 지정한 전송 명령을 보내고 연결을 받아들입니다. 서버가 수동(passive)이면, @code{EPSV}나 @code{PASV} 명령을 전송하고, 서버에 연결한 다음 전송 명령을 시작합니다. 어느 쪽이든, 연결 소켓을 반환합니다.

선택적 `rest'가 제공되면, @code{REST} 명령이 서버로 전송되고 `rest'를 인자로 전달합니다. `rest'는 일반적으로 요청된 파일에 대한 바이트 오프셋으로, 요청된 오프셋에서 파일 바이트 전송을 다시 시작하고 초기 바이트를 건너뛰도록 서버에 지시합니다. 그러나 @ref{403d,,transfercmd()} 메서드는 초기화 때 지정된 `encoding' 매개 변수를 사용하여 `rest'를 문자열로 변환하지만, 문자열의 내용은 점검하지 않음에 유의하십시오. 서버가 @code{REST} 명령을 인식하지 못하면, @ref{403b,,error_reply} 예외가 발생합니다. 이 경우, 단순히 `rest' 인자 없이 @code{transfercmd()}를 호출하십시오.
@end deffn

@geindex ntransfercmd() (ftplib.FTP 메서드)
@anchor{library/ftplib ftplib FTP ntransfercmd}@anchor{4041}
@deffn {메서드} ntransfercmd (cmd, rest=None)

@ref{403d,,transfercmd()}와 비슷하지만, 데이터 연결과 데이터의 예상 크기의 튜플을 반환합니다. 예상 크기를 계산할 수 없으면, @code{None}이 예상 크기로 반환됩니다. `cmd'와 `rest'는 @code{transfercmd()}에서와 같은 의미입니다.
@end deffn

@geindex mlsd() (ftplib.FTP 메서드)
@anchor{library/ftplib ftplib FTP mlsd}@anchor{12c7}
@deffn {메서드} mlsd (path='@w{'}, facts=[])

@code{MLSD} 명령(
@geindex RFC; RFC 3659
RFC 3659@footnote{https://datatracker.ietf.org/doc/html/rfc3659.html})을 사용하여 표준화된 형식으로 디렉터리를 나열합니다. `path'가 생략되면 현재 디렉터리를 가정합니다. `facts'는 원하는 정보 유형을 나타내는 문자열의 리스트입니다 (예를 들어 @code{["type", "size", "perm"]}). 경로에서 발견된 모든 파일에 대해 두 요소의 튜플을 산출하는 제너레이터 객체를 반환합니다. 첫 번째 요소는 파일 이름이고, 두 번째 요소는 파일 이름에 대한 사실(facts)을 포함하는 딕셔너리입니다. 이 딕셔너리의 내용은 `facts' 인자에 의해 제한될 수 있지만, 서버가 요청된 모든 사실을 반환한다고 보장하지는 않습니다.


Added in version 3.3.

@end deffn

@geindex nlst() (ftplib.FTP 메서드)
@anchor{library/ftplib ftplib FTP nlst}@anchor{12c8}
@deffn {메서드} nlst (argument[, ...])

@code{NLST} 명령이 반환한 파일 이름 리스트를 반환합니다. 선택적 `argument'는 나열할 디렉터리입니다 (기본값은 현재 서버 디렉터리입니다). 비표준 옵션을 @code{NLST} 명령에 전달하기 위해 여러 인자를 사용할 수 있습니다.

@cartouche
@quotation 참고 
서버가 명령을 지원한다면, @ref{12c7,,mlsd()}가 더 나은 API를 제공합니다.
@end quotation
@end cartouche
@end deffn

@geindex dir() (ftplib.FTP 메서드)
@anchor{library/ftplib ftplib FTP dir}@anchor{12c9}
@deffn {메서드} dir (argument[, ...])

@code{LIST} 명령이 반환한 디렉터리 목록을 생성하여 표준 출력으로 인쇄합니다. 선택적 `argument'는 나열할 디렉터리입니다 (기본값은 현재 서버 디렉터리입니다). 비표준 옵션을 @code{LIST} 명령에 전달하기 위해 여러 인자를 사용할 수 있습니다. 마지막 인자가 함수면, @ref{403e,,retrlines()}와 같이 `callback' 함수로 사용됩니다; 기본값은 @ref{ccc,,sys.stdout}으로 인쇄합니다. 이 메서드는 @code{None}을 반환합니다.

@cartouche
@quotation 참고 
서버가 명령을 지원한다면, @ref{12c7,,mlsd()}가 더 나은 API를 제공합니다.
@end quotation
@end cartouche
@end deffn

@geindex rename() (ftplib.FTP 메서드)
@anchor{library/ftplib ftplib FTP rename}@anchor{4042}
@deffn {메서드} rename (fromname, toname)

서버의 파일 `fromname'을 `toname'으로 이름을 바꿉니다.
@end deffn

@geindex delete() (ftplib.FTP 메서드)
@anchor{library/ftplib ftplib FTP delete}@anchor{4043}
@deffn {메서드} delete (filename)

서버에서 `filename'이라는 파일을 제거합니다. 성공하면, 응답 텍스트를 반환하고, 그렇지 않으면 권한 에러면 @ref{4044,,error_perm}을, 다른 에러면 @ref{403b,,error_reply}를 발생시킵니다.
@end deffn

@geindex cwd() (ftplib.FTP 메서드)
@anchor{library/ftplib ftplib FTP cwd}@anchor{4045}
@deffn {메서드} cwd (pathname)

서버에서 현재 디렉터리를 설정합니다.
@end deffn

@geindex mkd() (ftplib.FTP 메서드)
@anchor{library/ftplib ftplib FTP mkd}@anchor{4046}
@deffn {메서드} mkd (pathname)

서버에서 새 디렉터리를 만듭니다.
@end deffn

@geindex pwd() (ftplib.FTP 메서드)
@anchor{library/ftplib ftplib FTP pwd}@anchor{4047}
@deffn {메서드} pwd ()

서버에서 현재 디렉터리의 경로명을 반환합니다.
@end deffn

@geindex rmd() (ftplib.FTP 메서드)
@anchor{library/ftplib ftplib FTP rmd}@anchor{4048}
@deffn {메서드} rmd (dirname)

서버에서 `dirname'이라는 디렉터리를 제거합니다.
@end deffn

@geindex size() (ftplib.FTP 메서드)
@anchor{library/ftplib ftplib FTP size}@anchor{4049}
@deffn {메서드} size (filename)

서버에서 `filename'이라는 파일의 크기를 요청합니다. 성공하면, 파일 크기가 정수로 반환되고, 그렇지 않으면 @code{None}이 반환됩니다. @code{SIZE} 명령은 표준화되어 있지 않지만, 많은 일반적인 서버 구현에서 지원됨에 유의하십시오.
@end deffn

@geindex quit() (ftplib.FTP 메서드)
@anchor{library/ftplib ftplib FTP quit}@anchor{404a}
@deffn {메서드} quit ()

@code{QUIT} 명령을 서버로 보내고 연결을 닫습니다. 이는 연결을 닫는 “정중한” 방법이지만, 서버가 @code{QUIT} 명령에 대해 에러로 응답하면 예외가 발생할 수 있습니다. 이것은 묵시적인 @ref{404b,,close()} 메서드 호출을 수반하며, 이는 후속 호출에 @ref{af6,,FTP} 인스턴스를 쓸모없게 만듭니다 (아래를 참조하십시오).
@end deffn

@geindex close() (ftplib.FTP 메서드)
@anchor{library/ftplib ftplib FTP close}@anchor{404b}
@deffn {메서드} close ()

일방적으로 연결을 닫습니다. 이것은 이미 닫힌 연결에는 적용되지 않아야 합니다, 가령 @ref{404a,,quit()}를 성공적으로 호출한 후에. 이 호출 후 @ref{af6,,FTP} 인스턴스를 더는 사용하지 않아야 합니다 (@ref{404b,,close()}나 @code{quit()} 호출 후 다른 @ref{4037,,login()} 메서드를 사용해서 연결을 다시 열 수 없습니다).
@end deffn
@end deffn

@node FTP_TLS 객체,모듈 변수,FTP 객체,레퍼런스<4>
@anchor{library/ftplib ftp-tls-objects}@anchor{404c}
@subsubsection FTP_TLS 객체


@geindex FTP_TLS (ftplib 클래스)
@anchor{library/ftplib ftplib FTP_TLS}@anchor{af7}
@deffn {클래스} ftplib.FTP_TLS (host='@w{'}, user='@w{'}, passwd='@w{'}, acct='@w{'}, *, context=None, timeout=None, source_address=None, encoding='utf-8')

@geindex RFC; RFC 4217
RFC 4217@footnote{https://datatracker.ietf.org/doc/html/rfc4217.html}에 설명된 대로 FTP에 TLS 지원을 추가하는 @ref{af6,,FTP} 서브 클래스. 인증하기 전에 FTP 제어 연결을 묵시적으로 보안을 유지하면서 포트 21에 연결합니다.

@cartouche
@quotation 참고 
사용자는 @ref{404d,,prot_p()} 메서드를 호출하여 데이터 연결을 명시적으로 보호해야 합니다.
@end quotation
@end cartouche

@*매개변수: 

@itemize *

@item 
@code{host} (@ref{169,,str}) – 연결할 호스트명. 주어지면, 생성자가 @code{connect(host)}를 묵시적으로 호출합니다.

@item 
@code{user} (@ref{169,,str}) – The username to log in with (default: @code{'anonymous'}). 주어지면, 생성자가 @code{login(host, passwd, acct)}를 묵시적으로 호출합니다.

@item 
@code{passwd} (@ref{169,,str}) – The password to use when logging in.
If not given, and if `passwd' is the empty string or @code{"-"},
a password will be automatically generated.

@item 
@code{acct} (@ref{169,,str}) – Account information to be used for the @code{ACCT} FTP command.
Few systems implement this.
See RFC-959@footnote{https://datatracker.ietf.org/doc/html/rfc959.html}
for more details.

@item 
@code{context} (@ref{357,,ssl.SSLContext}) – SSL 구성 옵션, 인증서 및 개인 키를 잠재적으로 오래 유지되는 단일 구조로 묶을 수 있는 SSL 컨텍스트 객체. 모범 사례를 보려면 @ref{38c5,,보안 고려 사항}을 읽으십시오.

@item 
@code{timeout} (@ref{196,,float}@code{ | }@code{None}) – @ref{4034,,connect()}와 같은 블로킹 연산에 대한 시간제한을 초로 지정 (기본값: 전역 기본 시간제한 설정)

@item 
@code{source_address} (@ref{610,,tuple}@code{ | }@code{None}) – A 2-tuple @code{(host, port)} for the socket to bind to as its
source address before connecting.

@item 
@code{encoding} (@ref{169,,str}) – The encoding for directories and filenames (default: @code{'utf-8'}).
@end itemize



Added in version 3.2.



버전 3.3에서 변경: `source_address' 매개 변수가 추가되었습니다.



버전 3.4에서 변경: 이 클래스는 이제 @ref{39fb,,ssl.SSLContext.check_hostname}과 `서버 이름 표시(Server Name Indication)'(@ref{3a0d,,ssl.HAS_SNI}를 참조하십시오)으로 호스트명 확인을 지원합니다.



버전 3.9에서 변경: `timeout' 매개 변수가 0으로 설정되면, 비 블로킹 소켓이 만들어지지 않도록 @ref{2ec,,ValueError}를 발생시킵니다. `encoding' 매개 변수가 추가되었으며, 기본값은 Latin-1 에서 UTF-8로 변경되어 
@geindex RFC; RFC 2640
RFC 2640@footnote{https://datatracker.ietf.org/doc/html/rfc2640.html}을 따릅니다.



버전 3.12에서 변경: 폐지된 `keyfile'와 `certfile' 매개 변수를 제거했습니다.


@ref{af7,,FTP_TLS} 클래스를 사용한 샘플 세션은 다음과 같습니다:

@example
>>> ftps = FTP_TLS('ftp.pureftpd.org')
>>> ftps.login()
'230 Anonymous user logged in'
>>> ftps.prot_p()
'200 Data protection level set to "private"'
>>> ftps.nlst()
['6jack', 'OpenBSD', 'antilink', 'blogbench', 'bsdcam', 'clockspeed', 'djbdns-jedi', 'docs', 'eaccelerator-jedi', 'favicon.ico', 'francotone', 'fugu', 'ignore', 'libpuzzle', 'metalog', 'minidentd', 'misc', 'mysql-udf-global-user-variables', 'php-jenkins-hash', 'php-skein-hash', 'php-webdav', 'phpaudit', 'phpbench', 'pincaster', 'ping', 'posto', 'pub', 'public', 'public_keys', 'pure-ftpd', 'qscan', 'qtc', 'sharedance', 'skycache', 'sound', 'tmp', 'ucarp']
@end example

@code{FTP_TLS} 클래스는 @ref{af6,,FTP}를 상속하여, 다음과 같은 추가 메서드와 어트리뷰트를 정의합니다:

@geindex ssl_version (ftplib.FTP_TLS의 속성)
@anchor{library/ftplib ftplib FTP_TLS ssl_version}@anchor{404e}
@deffn {속성} ssl_version

사용할 SSL 버전 (기본값은 @ref{39ff,,ssl.PROTOCOL_SSLv23}입니다).
@end deffn

@geindex auth() (ftplib.FTP_TLS 메서드)
@anchor{library/ftplib ftplib FTP_TLS auth}@anchor{404f}
@deffn {메서드} auth ()

@ref{404e,,ssl_version} 어트리뷰트에 지정된 내용에 따라, TLS나 SSL을 사용하여 보안 제어 연결을 설정합니다.


버전 3.4에서 변경: 이 메서드는 이제 @ref{39fb,,ssl.SSLContext.check_hostname}과 `서버 이름 표시(Server Name Indication)'로 호스트명 확인을 지원합니다 (@ref{3a0d,,ssl.HAS_SNI}를 참조하십시오).

@end deffn

@geindex ccc() (ftplib.FTP_TLS 메서드)
@anchor{library/ftplib ftplib FTP_TLS ccc}@anchor{12c6}
@deffn {메서드} ccc ()

제어 채널을 일반 텍스트로 되돌립니다. 고정 포트를 열지 않고 비보안 FTP로 NAT을 다루는 방법을 알고 있는 방화벽을 활용하는 데 유용할 수 있습니다.


Added in version 3.3.

@end deffn

@geindex prot_p() (ftplib.FTP_TLS 메서드)
@anchor{library/ftplib ftplib FTP_TLS prot_p}@anchor{404d}
@deffn {메서드} prot_p ()

보안 데이터 연결을 설정합니다.
@end deffn

@geindex prot_c() (ftplib.FTP_TLS 메서드)
@anchor{library/ftplib ftplib FTP_TLS prot_c}@anchor{4050}
@deffn {메서드} prot_c ()

일반 텍스트 데이터 연결을 설정합니다.
@end deffn
@end deffn

@node 모듈 변수,,FTP_TLS 객체,레퍼런스<4>
@anchor{library/ftplib module-variables}@anchor{4051}
@subsubsection 모듈 변수


@geindex error_reply
@anchor{library/ftplib ftplib error_reply}@anchor{403b}
@deffn {예외} ftplib.error_reply

서버에서 예기치 않은 응답이 수신될 때 발생하는 예외.
@end deffn

@geindex error_temp
@anchor{library/ftplib ftplib error_temp}@anchor{4052}
@deffn {예외} ftplib.error_temp

일시적 에러(400–499 범위의 응답 코드)를 나타내는 에러 코드가 수신될 때 발생하는 예외.
@end deffn

@geindex error_perm
@anchor{library/ftplib ftplib error_perm}@anchor{4044}
@deffn {예외} ftplib.error_perm

영구 에러(500–599 범위의 응답 코드)를 나타내는 에러 코드가 수신될 때 발생하는 예외.
@end deffn

@geindex error_proto
@anchor{library/ftplib ftplib error_proto}@anchor{4053}
@deffn {예외} ftplib.error_proto

서버로부터 FTP(File Transfer Protocol)의 응답 규격(즉, 1–5 범위의 숫자로 시작)에 맞지 않는 응답을 수신할 때 발생하는 예외.
@end deffn

@geindex all_errors (ftplib 모듈)
@anchor{library/ftplib ftplib all_errors}@anchor{4054}
@deffn {데이터} ftplib.all_errors

@ref{af6,,FTP} 인스턴스의 메서드가 (호출자로 인한 프로그래밍 에러가 아니라) FTP 연결 문제로 인해 발생시킬 수 있는 모든 예외의 집합 (튜플). 이 집합에는 위에 나열된 네 가지 예외뿐만 아니라 @ref{2c0,,OSError}와 @ref{14de,,EOFError}가 포함됩니다.
@end deffn


@subsubheading 더 보기



@table @asis

@item 모듈 @ref{9f,,netrc}

@code{.netrc} 파일 형식의 구문 분석기. @code{.netrc} 파일은 일반적으로 FTP 클라이언트가 사용자에게 프롬프트 하기 전에 사용자 인증 정보를 로드하는 데 사용됩니다.
@end table


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node poplib — POP3 프로토콜 클라이언트,imaplib — IMAP4 프로토콜 클라이언트,ftplib — FTP 프로토콜 클라이언트,인터넷 프로토콜과 지원
@anchor{library/poplib doc}@anchor{4055}@anchor{library/poplib module-poplib}@anchor{b1}@anchor{library/poplib poplib-pop3-protocol-client}@anchor{4056}@anchor{library/poplib translation-repo}@anchor{4057}
@subsection @code{poplib} — POP3 프로토콜 클라이언트


@geindex module; poplib

@c revised by ESR, January 2000

`소스 코드:' Lib/poplib.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/poplib.py}

@geindex POP3;프로토콜


__________________________________________________________________


이 모듈은 POP3 서버에 대한 연결을 캡슐화하고 
@geindex RFC; RFC 1939
RFC 1939@footnote{https://datatracker.ietf.org/doc/html/rfc1939.html}에 정의된 대로 프로토콜을 구현하는 클래스 @ref{b1d,,POP3}를 정의합니다. @code{POP3} 클래스는 
@geindex RFC; RFC 1939
RFC 1939@footnote{https://datatracker.ietf.org/doc/html/rfc1939.html}의 최소(minimal)와 선택적인(optional) 명령 집합을 모두 지원합니다. @code{POP3} 클래스는 이미 맺어진 연결에서 암호화된 통신을 활성화하기 위해 
@geindex RFC; RFC 2595
RFC 2595@footnote{https://datatracker.ietf.org/doc/html/rfc2595.html}에서 도입된 @code{STLS} 명령도 지원합니다.

또한, 이 모듈은 SSL을 하부 프로토콜 계층으로 사용하는 POP3 서버에 연결하기 위한 지원을 제공하는 클래스 @ref{b1e,,POP3_SSL}을 제공합니다.

POP3는 광범위하게 지원되지만 노후화되었음에 유의하십시오. POP3 서버의 구현 품질은 매우 다양하며, 그중 너무 많은 것들이 형편없습니다. 여러분의 메일 서버가 IMAP을 지원한다면, IMAP 서버가 더 잘 구현되는 경향이 있으므로 @ref{aff,,imaplib.IMAP4} 클래스를 사용하는 것이 좋습니다.

@c include for modules that don't work on WASM

@ref{213c,,가용성}: not WASI.

이 모듈은 웹어셈블리에서 작동하지 않거나 제공되지 않습니다. 자세한 내용은 @ref{1b68,,웹어셈블리 플랫폼}을 참조하세요.

The @code{poplib} module provides two classes:

@geindex POP3 (poplib 클래스)
@anchor{library/poplib poplib POP3}@anchor{b1d}
@deffn {클래스} poplib.POP3 (host, port=POP3_PORT[, timeout])

이 클래스는 실제 POP3 프로토콜을 구현합니다. 인스턴스가 초기화될 때 연결이 만들어집니다. `port'를 생략하면, 표준 POP3 포트(110)가 사용됩니다. 선택적 `timeout' 매개 변수는 연결 시도의 제한 시간을 초로 지정합니다 (지정하지 않으면, 전역 기본 제한 시간 설정이 사용됩니다).

@code{self}, @code{host}, @code{port}를 인자로 @ref{1c6c,,감사 이벤트(auditing event)} @code{poplib.connect}를 발생시킵니다.

모든 명령은 @code{self}와 @code{line}을 인자로 @ref{1c6c,,감사 이벤트(auditing event)} @code{poplib.putline}을 발생시킵니다. 여기서 @code{line}은 원격 호스트로 보낼 바이트열입니다.


버전 3.9에서 변경: `timeout' 매개 변수가 0으로 설정되면, 비 블로킹 소켓이 만들어지지 않도록 @ref{2ec,,ValueError}를 발생시킵니다.

@end deffn

@geindex POP3_SSL (poplib 클래스)
@anchor{library/poplib poplib POP3_SSL}@anchor{b1e}
@deffn {클래스} poplib.POP3_SSL (host, port=POP3_SSL_PORT, *, timeout=None, context=None)

SSL 암호화된 소켓을 통해 서버에 연결하는 @ref{b1d,,POP3}의 서브 클래스입니다. `port'가 지정되지 않으면, 표준 POP3-over-SSL 포트(995)가 사용됩니다. `timeout'은 @code{POP3} 생성자에서처럼 동작합니다. `context'는 선택적인 @ref{357,,ssl.SSLContext} 객체인데, SSL 구성 옵션, 인증서 및 개인 키를 단일 (잠재적으로 수명이 긴) 구조로 묶을 수 있도록 합니다. 모범 사례는 @ref{38c5,,보안 고려 사항}을 읽으십시오.

@code{self}, @code{host}, @code{port}를 인자로 @ref{1c6c,,감사 이벤트(auditing event)} @code{poplib.connect}를 발생시킵니다.

모든 명령은 @code{self}와 @code{line}을 인자로 @ref{1c6c,,감사 이벤트(auditing event)} @code{poplib.putline}을 발생시킵니다. 여기서 @code{line}은 원격 호스트로 보낼 바이트열입니다.


버전 3.2에서 변경: `context' 매개 변수가 추가되었습니다.



버전 3.4에서 변경: 클래스는 이제 @ref{39fb,,ssl.SSLContext.check_hostname}을 통한 호스트 이름 검사와 `서버 이름 표시(Server Name Indication)'를 지원합니다 (@ref{3a0d,,ssl.HAS_SNI}를 참조하십시오).



버전 3.9에서 변경: `timeout' 매개 변수가 0으로 설정되면, 비 블로킹 소켓이 만들어지지 않도록 @ref{2ec,,ValueError}를 발생시킵니다.



버전 3.12에서 변경: 폐지된 `keyfile' 과 `certfile' 매개 변수는 제거되었습니다.

@end deffn

One exception is defined as an attribute of the @code{poplib} module:

@geindex error_proto
@anchor{library/poplib poplib error_proto}@anchor{13a1}
@deffn {예외} poplib.error_proto

이 모듈로부터 비롯된 모든 에러에서 발생하는 예외 (@ref{d1,,socket} 모듈에서 비롯된 에러는 잡지 않습니다). 예외의 이유는 문자열로 생성자에 전달됩니다.
@end deffn


@subsubheading 더 보기



@table @asis

@item 모듈 @ref{78,,imaplib}

표준 파이썬 IMAP 모듈.

@item Frequently Asked Questions About Fetchmail@footnote{http://www.catb.org/~esr/fetchmail/fetchmail-FAQ.html}

@code{fetchmail} POP/IMAP 클라이언트에 대한 FAQ는 POP 프로토콜에 기반하는 응용 프로그램을 작성해야 할 때 유용할 수 있는 POP3 서버 다양성과 RFC 위반에 대한 정보를 수집합니다.
@end table


@menu
* POP3 객체:: 
* POP3 예제:: 

@end menu

@node POP3 객체,POP3 예제,,poplib — POP3 프로토콜 클라이언트
@anchor{library/poplib id1}@anchor{4058}@anchor{library/poplib pop3-objects}@anchor{4059}
@subsubsection POP3 객체


모든 POP3 명령은 소문자로 바뀐 같은 이름의 메서드로 표현됩니다; 대부분 서버에서 보낸 응답 텍스트를 반환합니다.

@ref{b1d,,POP3} 인스턴스에는 다음과 같은 메서드가 있습니다:

@geindex set_debuglevel() (poplib.POP3 메서드)
@anchor{library/poplib poplib POP3 set_debuglevel}@anchor{405a}
@deffn {메서드} POP3.set_debuglevel (level)

인스턴스의 디버깅 수준을 설정합니다. 이것은 인쇄되는 디버깅 출력의 양을 제어합니다. 기본값인 @code{0}은 디버깅 출력을 생성하지 않습니다. @code{1} 값은 적절한 양의 디버깅 출력을 생성하는데, 일반적으로 요청당 한 줄입니다. @code{2} 이상의 값은 제어 연결에서 보내고 받은 각 줄을 로깅 하여 최대량의 디버깅 출력을 생성합니다.
@end deffn

@geindex getwelcome() (poplib.POP3 메서드)
@anchor{library/poplib poplib POP3 getwelcome}@anchor{405b}
@deffn {메서드} POP3.getwelcome ()

POP3 서버가 보낸 인사말 문자열을 반환합니다.
@end deffn

@geindex capa() (poplib.POP3 메서드)
@anchor{library/poplib poplib POP3 capa}@anchor{117b}
@deffn {메서드} POP3.capa ()

@geindex RFC; RFC 2449
RFC 2449@footnote{https://datatracker.ietf.org/doc/html/rfc2449.html}에 지정된 대로 서버의 기능을 조회합니다. @code{@{'name': ['param'...]@}} 형식의 딕셔너리를 반환합니다.


Added in version 3.4.

@end deffn

@geindex user() (poplib.POP3 메서드)
@anchor{library/poplib poplib POP3 user}@anchor{405c}
@deffn {메서드} POP3.user (username)

user 명령을 보냅니다, 응답은 암호가 필요함을 가리켜야 합니다.
@end deffn

@geindex pass_() (poplib.POP3 메서드)
@anchor{library/poplib poplib POP3 pass_}@anchor{405d}
@deffn {메서드} POP3.pass_ (password)

암호를 보냅니다, 응답에는 메시지 수와 우편함 크기가 포함됩니다. 참고: @ref{13a0,,quit()}가 호출될 때까지 서버의 우편함은 잠깁니다.
@end deffn

@geindex apop() (poplib.POP3 메서드)
@anchor{library/poplib poplib POP3 apop}@anchor{405e}
@deffn {메서드} POP3.apop (user, secret)

POP3 서버에 로그인하기 위해 더 안전한 APOP 인증을 사용합니다.
@end deffn

@geindex rpop() (poplib.POP3 메서드)
@anchor{library/poplib poplib POP3 rpop}@anchor{405f}
@deffn {메서드} POP3.rpop (user)

POP3 서버에 로그인하기 위해 RPOP 인증(유닉스 r-명령과 유사합니다)을 사용합니다.
@end deffn

@geindex stat() (poplib.POP3 메서드)
@anchor{library/poplib poplib POP3 stat}@anchor{4060}
@deffn {메서드} POP3.stat ()

우편함 상태를 가져옵니다. 결과는 2개의 정수의 튜플입니다: @code{(message count, mailbox size)}.
@end deffn

@geindex list() (poplib.POP3 메서드)
@anchor{library/poplib poplib POP3 list}@anchor{4061}
@deffn {메서드} POP3.list ([which])

메시지 목록을 요청합니다, 결과는 @code{(response, ['mesg_num octets', ...], octets)} 형식입니다. `which'가 설정되면, 목록에 표시할 메시지입니다.
@end deffn

@geindex retr() (poplib.POP3 메서드)
@anchor{library/poplib poplib POP3 retr}@anchor{4062}
@deffn {메서드} POP3.retr (which)

전체 메시지 번호 `which'를 가져오고 읽었음을 알리는 플래그를 설정합니다. 결과는 @code{(response, ['line', ...], octets)} 형식입니다.
@end deffn

@geindex dele() (poplib.POP3 메서드)
@anchor{library/poplib poplib POP3 dele}@anchor{4063}
@deffn {메서드} POP3.dele (which)

메시지 번호 `which'를 삭제로 표시합니다. 대부분 서버에서 삭제는 실제로 QUIT 때까지 수행되지 않습니다 (주된 예외는 Eudora QPOP인데, 모든 연결 단절 시 계류 중인 삭제를 수행하여 의도적으로 RFC를 위반합니다).
@end deffn

@geindex rset() (poplib.POP3 메서드)
@anchor{library/poplib poplib POP3 rset}@anchor{4064}
@deffn {메서드} POP3.rset ()

우편함에 대한 모든 삭제 표시를 제거합니다.
@end deffn

@geindex noop() (poplib.POP3 메서드)
@anchor{library/poplib poplib POP3 noop}@anchor{4065}
@deffn {메서드} POP3.noop ()

아무것도 하지 않습니다. 연결 유지로 사용될 수 있습니다.
@end deffn

@geindex quit() (poplib.POP3 메서드)
@anchor{library/poplib poplib POP3 quit}@anchor{13a0}
@deffn {메서드} POP3.quit ()

로그아웃: 변경 내용 커밋, 우편함 잠금 해제, 연결 끊기.
@end deffn

@geindex top() (poplib.POP3 메서드)
@anchor{library/poplib poplib POP3 top}@anchor{4066}
@deffn {메서드} POP3.top (which, howmuch)

메시지 번호 `which'의 메시지 헤더와 메시지의 `howmuch' 개 줄을 가져옵니다. 결과는 @code{(response, ['line', ...], octets)} 형식입니다.

이 메서드가 사용하는 POP3 TOP 명령은, RETR 명령과 달리, 메시지의 읽었음을 알리는 플래그를 설정하지 않습니다; 불행히도, TOP은 RFC에서 부실하게 기술되어 있고 종종 유명하지 않은 서버에서 망가져 있습니다. 사용할 POP3 서버를 신뢰하기 전에 이 메서드를 수동으로 테스트하십시오.
@end deffn

@geindex uidl() (poplib.POP3 메서드)
@anchor{library/poplib poplib POP3 uidl}@anchor{4067}
@deffn {메서드} POP3.uidl (which=None)

메시지 다이제스트 (고유 ID) 목록을 반환합니다. `which'가 지정되면, 결과에는 해당 메시지의 고유 ID가 @code{'response mesgnum uid} 형식으로 포함됩니다. 그렇지 않으면, 결과는 목록 @code{(response, ['mesgnum uid', ...], octets)}입니다.
@end deffn

@geindex utf8() (poplib.POP3 메서드)
@anchor{library/poplib poplib POP3 utf8}@anchor{1048}
@deffn {메서드} POP3.utf8 ()

UTF-8 모드로의 전환을 시도합니다. 성공하면 서버 응답을 반환하고, 그렇지 않으면 @ref{13a1,,error_proto}를 발생시킵니다. 
@geindex RFC; RFC 6856
RFC 6856@footnote{https://datatracker.ietf.org/doc/html/rfc6856.html}에서 정의되었습니다.


Added in version 3.5.

@end deffn

@geindex stls() (poplib.POP3 메서드)
@anchor{library/poplib poplib POP3 stls}@anchor{117c}
@deffn {메서드} POP3.stls (context=None)

@geindex RFC; RFC 2595
RFC 2595@footnote{https://datatracker.ietf.org/doc/html/rfc2595.html}에 지정된 대로 활성 연결에서 TLS 세션을 시작합니다. 사용자 인증 전에만 허용됩니다.

`context' 매개 변수는 @ref{357,,ssl.SSLContext} 객체인데, SSL 구성 옵션, 인증서 및 개인 키를 단일 (잠재적으로 수명이 긴) 구조로 묶을 수 있도록 합니다. 모범 사례는 @ref{38c5,,보안 고려 사항}을 읽으십시오.

이 메서드는 @ref{39fb,,ssl.SSLContext.check_hostname}을 통한 호스트 이름 검사와 `서버 이름 표시(Server Name Indication)'를 지원합니다 (@ref{3a0d,,ssl.HAS_SNI}를 참조하십시오)


Added in version 3.4.

@end deffn

@ref{b1e,,POP3_SSL}의 인스턴스에는 추가 메서드가 없습니다. 이 서브 클래스의 인터페이스는 그 부모와 같습니다.

@node POP3 예제,,POP3 객체,poplib — POP3 프로토콜 클라이언트
@anchor{library/poplib id2}@anchor{4068}@anchor{library/poplib pop3-example}@anchor{4069}
@subsubsection POP3 예제


다음은 우편함을 열고 모든 메시지를 가져와서 인쇄하는 (에러 검사 없는) 최소한의 예입니다:

@example
import getpass, poplib

M = poplib.POP3('localhost')
M.user(getpass.getuser())
M.pass_(getpass.getpass())
numMessages = len(M.list()[1])
for i in range(numMessages):
    for j in M.retr(i+1)[1]:
        print(j)
@end example

모듈의 끝에는, 더욱 광범위한 사용 예제가 포함된 테스트 섹션이 있습니다.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node imaplib — IMAP4 프로토콜 클라이언트,smtplib — SMTP 프로토콜 클라이언트,poplib — POP3 프로토콜 클라이언트,인터넷 프로토콜과 지원
@anchor{library/imaplib doc}@anchor{406a}@anchor{library/imaplib imaplib-imap4-protocol-client}@anchor{406b}@anchor{library/imaplib module-imaplib}@anchor{78}@anchor{library/imaplib translation-repo}@anchor{406c}
@subsection @code{imaplib} — IMAP4 프로토콜 클라이언트


@geindex module; imaplib

@c revised by ESR, January 2000

@c changes for IMAP4_SSL by Tino Lange <Tino.Lange@isg.de>, March 2002

@c changes for IMAP4_stream by Piers Lauder <piers@communitysolutions.com.au>,
@c November 2002

@c changes for IMAP4 IDLE by Forest <forestix@nom.one>, August 2024

`소스 코드:' Lib/imaplib.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/imaplib.py}

@geindex IMAP4;프로토콜
@geindex IMAP4_SSL;프로토콜
@geindex IMAP4_stream;프로토콜


__________________________________________________________________


이 모듈은 @ref{aff,,IMAP4}, @ref{b00,,IMAP4_SSL} 및 @ref{b02,,IMAP4_stream}의 세 가지 클래스를 정의합니다. 이 클래스는 IMAP4 서버에 대한 연결을 캡슐화하고 
@geindex RFC; RFC 2060
RFC 2060@footnote{https://datatracker.ietf.org/doc/html/rfc2060.html}에 정의된 대로 IMAP4rev1 클라이언트 프로토콜의 큰 부분 집합을 구현합니다. IMAP4 (
@geindex RFC; RFC 1730
RFC 1730@footnote{https://datatracker.ietf.org/doc/html/rfc1730.html}) 서버와 하위 호환되지만, IMAP4에서는 @code{STATUS} 명령이 지원되지 않음에 유의하십시오.

@c include for modules that don't work on WASM

@ref{213c,,가용성}: not WASI.

이 모듈은 웹어셈블리에서 작동하지 않거나 제공되지 않습니다. 자세한 내용은 @ref{1b68,,웹어셈블리 플랫폼}을 참조하세요.

Three classes are provided by the @code{imaplib} module, @ref{aff,,IMAP4} is the
base class:

@geindex IMAP4 (imaplib 클래스)
@anchor{library/imaplib imaplib IMAP4}@anchor{aff}
@deffn {클래스} imaplib.IMAP4 (host='@w{'}, port=IMAP4_PORT, timeout=None)

이 클래스는 실제 IMAP4 프로토콜을 구현합니다. 연결이 만들어지고 인스턴스가 초기화될 때 프로토콜 버전(IMAP4 또는 IMAP4rev1)이 결정됩니다. `host'를 지정하지 않으면, @code{'@w{'}}(로컬 호스트)가 사용됩니다. `port'를 생략하면, 표준 IMAP4 포트(143)가 사용됩니다. 선택적 `timeout' 매개 변수는 연결 시도에 대한 시간제한을 초로 지정합니다. timeout이 제공되지 않거나 @code{None}이면, 전역 기본 소켓 시간제한이 사용됩니다.

@ref{aff,,IMAP4} 클래스는 @ref{186,,with} 문을 지원합니다. 이처럼 사용될 때, @code{with} 문을 빠져나갈 때 IMAP4 @code{LOGOUT} 명령이 자동으로 발행됩니다. 예를 들어:

@example
>>> from imaplib import IMAP4
>>> with IMAP4("domain.org") as M:
...     M.noop()
...
('OK', [b'Nothing Accomplished. d25if65hy903weo.87'])
@end example


버전 3.5에서 변경: @ref{186,,with} 문에 대한 지원이 추가되었습니다.



버전 3.9에서 변경: 선택적 `timeout' 매개 변수가 추가되었습니다.

@end deffn

세 가지 예외가 @ref{aff,,IMAP4} 클래스의 어트리뷰트로 정의됩니다:

@geindex IMAP4.error
@anchor{library/imaplib imaplib IMAP4 error}@anchor{17fa}
@deffn {예외} IMAP4.error

모든 에러에 대해 발생하는 예외. 예외의 이유는 문자열로 생성자에 전달됩니다.
@end deffn

@geindex IMAP4.abort
@anchor{library/imaplib imaplib IMAP4 abort}@anchor{406d}
@deffn {예외} IMAP4.abort

IMAP4 서버 에러는 이 예외를 발생시킵니다. 이것은 @ref{17fa,,IMAP4.error}의 서브 클래스입니다. 인스턴스를 닫고 새 인스턴스를 만들면 일반적으로 이 예외에서 복구할 수 있습니다.
@end deffn

@geindex IMAP4.readonly
@anchor{library/imaplib imaplib IMAP4 readonly}@anchor{406e}
@deffn {예외} IMAP4.readonly

쓰기 가능한 사서함(mailbox)의 상태가 서버에 의해 변경되면 이 예외가 발생합니다. 이것은 @ref{17fa,,IMAP4.error}의 서브 클래스입니다. 이제 일부 다른 클라이언트에는 쓰기 권한이 있으며, 쓰기 권한을 다시 얻으려면 사서함을 다시 열어야 합니다.
@end deffn

보안 연결을 위한 서브 클래스도 있습니다:

@geindex IMAP4_SSL (imaplib 클래스)
@anchor{library/imaplib imaplib IMAP4_SSL}@anchor{b00}
@deffn {클래스} imaplib.IMAP4_SSL (host='@w{'}, port=IMAP4_SSL_PORT, *, ssl_context=None, timeout=None)

SSL 암호화 소켓을 통해 연결되는 @ref{aff,,IMAP4}에서 파생된 서브 클래스입니다 (이 클래스를 사용하려면 SSL 지원과 함께 컴파일된 소켓 모듈이 필요합니다). `host'를 지정하지 않으면, @code{'@w{'}}(로컬 호스트)가 사용됩니다. `port'를 생략하면, 표준 IMAP4-over-SSL 포트(993)가 사용됩니다. `ssl_context'는 SSL 구성 옵션, 인증서 및 개인 키를 단일 (잠재적으로 오래가는) 구조로 번들링 할 수 있는 @ref{357,,ssl.SSLContext} 객체입니다. 모범 사례는 @ref{38c5,,보안 고려 사항}을 읽으십시오.

선택적 `timeout' 매개 변수는 연결 시도에 대한 시간제한을 초로 지정합니다. timeout이 제공되지 않거나 @code{None}이면, 전역 기본 소켓 시간제한이 사용됩니다.


버전 3.3에서 변경: `ssl_context' 매개 변수가 추가되었습니다.



버전 3.4에서 변경: 이 클래스는 이제 @ref{39fb,,ssl.SSLContext.check_hostname}과 `서버 이름 표시(Server Name Indication)'로 호스트명 확인을 지원합니다 (@ref{3a0d,,ssl.HAS_SNI}를 참조하십시오).



버전 3.9에서 변경: 선택적 `timeout' 매개 변수가 추가되었습니다.



버전 3.12에서 변경: 폐지된 `keyfile' 과 `certfile' 매개 변수를 제거했습니다.

@end deffn

두 번째 서브 클래스는 자식 프로세스가 만든 연결을 허용합니다:

@geindex IMAP4_stream (imaplib 클래스)
@anchor{library/imaplib imaplib IMAP4_stream}@anchor{b02}
@deffn {클래스} imaplib.IMAP4_stream (command)

이것은 `command'를 @code{subprocess.Popen()}에 전달하여 만들어진 @code{stdin/stdout} 파일 기술자에 연결하는 @ref{aff,,IMAP4}에서 파생된 서브 클래스입니다.
@end deffn

다음과 같은 유틸리티 함수가 정의됩니다:

@geindex Internaldate2tuple() (imaplib 모듈)
@anchor{library/imaplib imaplib Internaldate2tuple}@anchor{406f}
@deffn {함수} imaplib.Internaldate2tuple (datestr)

IMAP4 @code{INTERNALDATE} 문자열을 구문 분석하고 해당 지역 시간을 반환합니다. 반환 값은 @ref{ee5,,time.struct_time} 튜플이거나 문자열의 형식이 잘못되면 @code{None}입니다.
@end deffn

@geindex Int2AP() (imaplib 모듈)
@anchor{library/imaplib imaplib Int2AP}@anchor{4070}
@deffn {함수} imaplib.Int2AP (num)

집합 [@code{A} .. @code{P}]의 문자를 사용하여 정수를 바이트열 표현으로 변환합니다.
@end deffn

@geindex ParseFlags() (imaplib 모듈)
@anchor{library/imaplib imaplib ParseFlags}@anchor{4071}
@deffn {함수} imaplib.ParseFlags (flagstr)

IMAP4 @code{FLAGS} 응답을 개별 플래그의 튜플로 변환합니다.
@end deffn

@geindex Time2Internaldate() (imaplib 모듈)
@anchor{library/imaplib imaplib Time2Internaldate}@anchor{4072}
@deffn {함수} imaplib.Time2Internaldate (date_time)

`date_time'을 IMAP4 @code{INTERNALDATE} 표현으로 변환합니다. 반환 값은 다음과 같은 형식의 문자열입니다: @code{"DD-Mmm-YYYY HH:MM:SS +HHMM"} (큰따옴표를 포함합니다). `date_time' 인자는 에포크 이후의 초(@ref{55c,,time.time()}이 반환하는 것과 같습니다)를 나타내는 숫자 (int 또는 float), 지역 시간을 나타내는 9-튜플인 @ref{ee5,,time.struct_time}의 인스턴스 (@ref{16fe,,time.localtime()}이 반환하는 것과 같습니다), @ref{4e2,,datetime.datetime}의 어웨어(aware) 인스턴스 또는 큰따옴표로 인용된(double-quoted) 문자열일 수 있습니다. 마지막 경우에는, 이미 올바른 형식으로 되어 있다고 가정합니다.
@end deffn

사서함이 변경됨에 따라 IMAP4 메시지 번호가 변경됨에 유의하십시오. 특히, @code{EXPUNGE} 명령이 삭제를 수행한 후 나머지 메시지의 번호가 다시 매겨집니다. 따라서 UID 명령으로 UID를 대신 사용하는 것이 좋습니다.

모듈의 끝에는, 더 광범위한 사용 예제가 포함된 테스트 섹션이 있습니다.


@subsubheading 더 보기


워싱턴 대학의 IMAP Information Center의 프로토콜을 설명하는 문서와 이를 구현하는 서버의 소스는 모두 (`소스 코드') @indicateurl{https://github.com/uw-imap/imap} 에서 찾을 수 있습니다 (`유지 보수되지 않습니다').


@menu
* IMAP4 객체:: 
* IMAP4 예:: 

@end menu

@node IMAP4 객체,IMAP4 예,,imaplib — IMAP4 프로토콜 클라이언트
@anchor{library/imaplib id1}@anchor{4073}@anchor{library/imaplib imap4-objects}@anchor{4074}
@subsubsection IMAP4 객체


모든 IMAP4rev1 명령은 대문자나 소문자의 같은 이름의 메서드로 표현됩니다.

@code{AUTHENTICATE}와 IMAP4 리터럴로 전달되는 @code{APPEND}에 대한 마지막 인자를 제외하고, 명령에 대한 모든 인자는 문자열로 변환됩니다. 필요하면 (문자열에 IMAP4 프로토콜에 참여하는 문자가 포함되고 괄호나 큰따옴표로 묶이지 않았으면) 각 문자열이 인용됩니다. 그러나, @code{LOGIN} 명령에 대한 `password' 인자는 항상 인용됩니다. 인자 문자열이 인용되지 않도록 하려면 (예를 들어: @code{STORE}에 대한 `flags' 인자) 문자열을 괄호로 묶으십시오 (예를 들어: @code{r'(\Deleted)'}).

Most commands return a tuple: @code{(type, [data, ...])} where `type' is usually
@code{'OK'} or @code{'NO'}, and `data' is either the text from the command response,
or mandated results from the command. Each `data' is either a @code{bytes}, or a
tuple. If a tuple, then the first part is the header of the response, and the
second part contains the data (ie: ‘literal’ value).

아래 명령에 대한 `message_set' 옵션은 수행할 하나 이상의 대상 메시지를 지정하는 문자열입니다. 단순 메시지 번호 (@code{'1'}), 메시지 번호 범위 (@code{'2:4'}) 또는 쉼표로 구분된 불연속 범위 그룹(@code{'1:3,6:9'})일 수 있습니다. 범위에는 별표가 포함되어 무한 상한을 나타낼 수 있습니다 (@code{'3:*'}).

@ref{aff,,IMAP4} 인스턴스에는 다음과 같은 메서드가 있습니다:

@geindex append() (imaplib.IMAP4 메서드)
@anchor{library/imaplib imaplib IMAP4 append}@anchor{4075}
@deffn {메서드} IMAP4.append (mailbox, flags, date_time, message)

명명된 사서함(mailbox)에 `message'를 추가합니다.
@end deffn

@geindex authenticate() (imaplib.IMAP4 메서드)
@anchor{library/imaplib imaplib IMAP4 authenticate}@anchor{4076}
@deffn {메서드} IMAP4.authenticate (mechanism, authobject)

인증 명령 — 응답 처리가 필요합니다.

`mechanism'은 사용할 인증 메커니즘을 지정합니다 - 인스턴스 변수 @code{capabilities}에 @code{AUTH=mechanism} 형식으로 나타나야 합니다.

`authobject'는 콜러블 객체여야 합니다:

@example
data = authobject(response)
@end example

서버 계속(continuation) 응답을 처리하기 위해 호출됩니다; 전달된 `response' 인자는 @code{bytes}입니다. base64로 인코딩되어 서버로 전송되는 @code{bytes} `data'를 반환해야 합니다. 클라이언트 중단 응답 @code{*}를 대신 보내야 하면 @code{None}을 반환해야 합니다.


버전 3.5에서 변경: 문자열 사용자 이름과 비밀번호는 이제 ASCII로 제한되지 않고 @code{utf-8}로 인코딩됩니다.

@end deffn

@geindex check() (imaplib.IMAP4 메서드)
@anchor{library/imaplib imaplib IMAP4 check}@anchor{4077}
@deffn {메서드} IMAP4.check ()

서버의 사서함을 검사합니다.
@end deffn

@geindex close() (imaplib.IMAP4 메서드)
@anchor{library/imaplib imaplib IMAP4 close}@anchor{b04}
@deffn {메서드} IMAP4.close ()

현재 선택된 사서함을 닫습니다. 삭제된 메시지는 쓰기 가능한 사서함에서 제거됩니다. @code{LOGOUT} 이전의 권장 명령입니다.
@end deffn

@geindex copy() (imaplib.IMAP4 메서드)
@anchor{library/imaplib imaplib IMAP4 copy}@anchor{4078}
@deffn {메서드} IMAP4.copy (message_set, new_mailbox)

`message_set' 메시지를 `new_mailbox' 끝에 복사합니다.
@end deffn

@geindex create() (imaplib.IMAP4 메서드)
@anchor{library/imaplib imaplib IMAP4 create}@anchor{4079}
@deffn {메서드} IMAP4.create (mailbox)

`mailbox'라는 이름의 새 사서함을 만듭니다.
@end deffn

@geindex delete() (imaplib.IMAP4 메서드)
@anchor{library/imaplib imaplib IMAP4 delete}@anchor{407a}
@deffn {메서드} IMAP4.delete (mailbox)

`mailbox'라는 이름의 기존 사서함을 삭제합니다.
@end deffn

@geindex deleteacl() (imaplib.IMAP4 메서드)
@anchor{library/imaplib imaplib IMAP4 deleteacl}@anchor{407b}
@deffn {메서드} IMAP4.deleteacl (mailbox, who)

사서함(mailbox)의 사용자(who)에 대해 설정된 ACL을 삭제합니다 (모든 권한을 제거합니다).
@end deffn

@geindex enable() (imaplib.IMAP4 메서드)
@anchor{library/imaplib imaplib IMAP4 enable}@anchor{100d}
@deffn {메서드} IMAP4.enable (capability)

`capability'를 활성화합니다 (
@geindex RFC; RFC 5161
RFC 5161@footnote{https://datatracker.ietf.org/doc/html/rfc5161.html}을 참조하십시오). 대부분의 기능은 활성화할 필요 없습니다. 현재 @code{UTF8=ACCEPT} 기능만 지원됩니다 (
@geindex RFC; RFC 6855
RFC 6855@footnote{https://datatracker.ietf.org/doc/html/rfc6855.html}를 참조하십시오).


Added in version 3.5: @ref{100d,,enable()} 메서드 자체와 
@geindex RFC; RFC 6855
RFC 6855@footnote{https://datatracker.ietf.org/doc/html/rfc6855.html} 지원.

@end deffn

@geindex expunge() (imaplib.IMAP4 메서드)
@anchor{library/imaplib imaplib IMAP4 expunge}@anchor{407c}
@deffn {메서드} IMAP4.expunge ()

선택한 사서함에서 삭제된 항목을 영구적으로 제거합니다. 삭제된 각 메시지에 대해 @code{EXPUNGE} 응답을 생성합니다. 반환된 데이터에는 수신된 순서의 @code{EXPUNGE} 메시지 번호 리스트가 포함됩니다.
@end deffn

@geindex fetch() (imaplib.IMAP4 메서드)
@anchor{library/imaplib imaplib IMAP4 fetch}@anchor{407d}
@deffn {메서드} IMAP4.fetch (message_set, message_parts)

메시지(일부)를 가져옵니다. `message_parts'는 괄호로 묶인 메시지 부분 이름의 문자열이어야 합니다, 예를 들어: @code{"(UID BODY[TEXT])"}). 반환된 데이터는 메시지 부분 봉투와 데이터의 튜플입니다.
@end deffn

@geindex getacl() (imaplib.IMAP4 메서드)
@anchor{library/imaplib imaplib IMAP4 getacl}@anchor{407e}
@deffn {메서드} IMAP4.getacl (mailbox)

`mailbox'에 대한 @code{ACL}을 가져옵니다. 이 메서드는 비표준이지만, @code{Cyrus} 서버에서 지원됩니다.
@end deffn

@geindex getannotation() (imaplib.IMAP4 메서드)
@anchor{library/imaplib imaplib IMAP4 getannotation}@anchor{407f}
@deffn {메서드} IMAP4.getannotation (mailbox, entry, attribute)

`mailbox'에 대해 지정된 @code{ANNOTATION}을 가져옵니다. 이 메서드는 비표준이지만, @code{Cyrus} 서버에서 지원됩니다.
@end deffn

@geindex getquota() (imaplib.IMAP4 메서드)
@anchor{library/imaplib imaplib IMAP4 getquota}@anchor{4080}
@deffn {메서드} IMAP4.getquota (root)

@code{quota} `root'의 자원 사용량과 제한을 가져옵니다. 이 메서드는 rfc2087에 정의된 IMAP4 QUOTA 확장의 일부입니다.
@end deffn

@geindex getquotaroot() (imaplib.IMAP4 메서드)
@anchor{library/imaplib imaplib IMAP4 getquotaroot}@anchor{4081}
@deffn {메서드} IMAP4.getquotaroot (mailbox)

명명된 `mailbox'에 대한 @code{quota} @code{roots} 리스트를 가져옵니다. 이 메서드는 rfc2087에 정의된 IMAP4 QUOTA 확장의 일부입니다.
@end deffn

@geindex idle() (imaplib.IMAP4 메서드)
@anchor{library/imaplib imaplib IMAP4 idle}@anchor{22d}
@deffn {메서드} IMAP4.idle (duration=None)

Return an @code{Idler}: an iterable context manager implementing the
IMAP4 @code{IDLE} command as defined in 
@geindex RFC; RFC 2177
RFC 2177@footnote{https://datatracker.ietf.org/doc/html/rfc2177.html}.

The returned object sends the @code{IDLE} command when activated by the
@ref{186,,with} statement, produces IMAP untagged responses via the
@ref{4ca,,iterator} protocol, and sends @code{DONE} upon context exit.

All untagged responses that arrive after sending the @code{IDLE} command
(including any that arrive before the server acknowledges the command) will
be available via iteration. Any leftover responses (those not iterated in
the @ref{186,,with} context) can be retrieved in the usual way after
@code{IDLE} ends, using @ref{4082,,IMAP4.response()}.

Responses are represented as @code{(type, [data, ...])} tuples, as described
in @ref{4074,,IMAP4 Objects}.

The `duration' argument sets a maximum duration (in seconds) to keep idling,
after which any ongoing iteration will stop. It can be an @ref{19b,,int} or
@ref{196,,float}, or @code{None} for no time limit.
Callers wishing to avoid inactivity timeouts on servers that impose them
should keep this at most 29 minutes (1740 seconds).
Requires a socket connection; `duration' must be @code{None} on
@ref{b02,,IMAP4_stream} connections.

@example
>>> with M.idle(duration=29 * 60) as idler:
...     for typ, data in idler:
...         print(typ, data)
...
EXISTS [b'1']
RECENT [b'1']
@end example

@geindex burst() (imaplib.IMAP4.Idler 메서드)
@anchor{library/imaplib imaplib IMAP4 Idler burst}@anchor{4083}
@deffn {메서드} Idler.burst (interval=0.1)

Yield a burst of responses no more than `interval' seconds apart
(expressed as an @ref{19b,,int} or @ref{196,,float}).

This @ref{1260,,generator} is an alternative to iterating one response at a
time, intended to aid in efficient batch processing. It retrieves the
next response along with any immediately available subsequent responses.
(For example, a rapid series of @code{EXPUNGE} responses after a bulk
delete.)

Requires a socket connection; does not work on @ref{b02,,IMAP4_stream}
connections.

@example
>>> with M.idle() as idler:
...     # get a response and any others following by < 0.1 seconds
...     batch = list(idler.burst())
...     print(f'processing @{len(batch)@} responses...')
...     print(batch)
...
processing 3 responses...
[('EXPUNGE', [b'2']), ('EXPUNGE', [b'1']), ('RECENT', [b'0'])]
@end example

@cartouche
@quotation 팁 
The @code{IDLE} context’s maximum duration, as passed to
@code{IMAP4.idle()}, is respected when waiting for the first response
in a burst. Therefore, an expired @code{Idler} will cause this
generator to return immediately without producing anything. Callers
should consider this if using it in a loop.
@end quotation
@end cartouche
@end deffn

@cartouche
@quotation 참고 
The iterator returned by @code{IMAP4.idle()} is usable only within a
@ref{186,,with} statement. Before or after that context, unsolicited
responses are collected internally whenever a command finishes, and can
be retrieved with @ref{4082,,IMAP4.response()}.
@end quotation
@end cartouche

@cartouche
@quotation 참고 
The @code{Idler} class name and structure are internal interfaces,
subject to change. Calling code can rely on its context management,
iteration, and public method to remain stable, but should not subclass,
instantiate, compare, or otherwise directly reference the class.
@end quotation
@end cartouche


Added in version 3.14.

@end deffn

@geindex list() (imaplib.IMAP4 메서드)
@anchor{library/imaplib imaplib IMAP4 list}@anchor{4084}
@deffn {메서드} IMAP4.list ([directory[, pattern]])

`directory'에 있는 `pattern'과 일치하는 사서함 이름을 나열합니다. `directory'는 기본적으로 최상위 메일 폴더이며, `pattern'은 기본적으로 모든 것과 일치합니다. 반환된 데이터는 @code{LIST}의 리스트를 포함합니다.
@end deffn

@geindex login() (imaplib.IMAP4 메서드)
@anchor{library/imaplib imaplib IMAP4 login}@anchor{4085}
@deffn {메서드} IMAP4.login (user, password)

평문 비밀번호를 사용하여 클라이언트를 식별합니다. `password'는 인용됩니다.
@end deffn

@geindex login_cram_md5() (imaplib.IMAP4 메서드)
@anchor{library/imaplib imaplib IMAP4 login_cram_md5}@anchor{17f9}
@deffn {메서드} IMAP4.login_cram_md5 (user, password)

암호를 보호하기 위해 클라이언트를 식별할 때 @code{CRAM-MD5} 인증의 사용을 강제합니다. 서버 @code{CAPABILITY} 응답에 문구 @code{AUTH=CRAM-MD5}가 포함된 경우에만 작동합니다.


버전 3.14에서 변경: An @ref{17fa,,IMAP4.error} is raised if MD5 support is not available.

@end deffn

@geindex logout() (imaplib.IMAP4 메서드)
@anchor{library/imaplib imaplib IMAP4 logout}@anchor{c83}
@deffn {메서드} IMAP4.logout ()

서버에 대한 연결을 종료합니다. 서버 @code{BYE} 응답을 반환합니다.


버전 3.8에서 변경: 이 메서드는 더는 임의의 예외를 조용히 무시하지 않습니다.

@end deffn

@geindex lsub() (imaplib.IMAP4 메서드)
@anchor{library/imaplib imaplib IMAP4 lsub}@anchor{4086}
@deffn {메서드} IMAP4.lsub (directory='""', pattern='*')

directory에 있는 pattern과 일치하는 구독한(subscribed) 사서함 이름을 나열합니다. `directory'는 기본적으로 최상위 디렉터리이고 `pattern'은 기본적으로 모든 사서함과 일치합니다. 반환된 데이터는 메시지 부분 봉투와 데이터의 튜플입니다.
@end deffn

@geindex myrights() (imaplib.IMAP4 메서드)
@anchor{library/imaplib imaplib IMAP4 myrights}@anchor{4087}
@deffn {메서드} IMAP4.myrights (mailbox)

mailbox에 대한 현재 사용자의 ACL(즉, 사서함에 대해 가진 권한)을 표시합니다.
@end deffn

@geindex namespace() (imaplib.IMAP4 메서드)
@anchor{library/imaplib imaplib IMAP4 namespace}@anchor{4088}
@deffn {메서드} IMAP4.namespace ()

@geindex RFC; RFC 2342
RFC 2342@footnote{https://datatracker.ietf.org/doc/html/rfc2342.html}에 정의된 대로 IMAP 이름 공간을 반환합니다.
@end deffn

@geindex noop() (imaplib.IMAP4 메서드)
@anchor{library/imaplib imaplib IMAP4 noop}@anchor{4089}
@deffn {메서드} IMAP4.noop ()

서버에 @code{NOOP}을 보냅니다.
@end deffn

@geindex open() (imaplib.IMAP4 메서드)
@anchor{library/imaplib imaplib IMAP4 open}@anchor{b01}
@deffn {메서드} IMAP4.open (host, port, timeout=None)

`host'의 `port'로 소켓을 엽니다. 선택적 `timeout' 매개 변수는 연결 시도에 대한 시간제한을 초로 지정합니다. timeout이 제공되지 않거나 @code{None}이면, 전역 기본 소켓 시간제한이 사용됩니다. 또한 `timeout' 매개 변수가 0으로 설정되면, 비 블로킹 소켓을 만들지 못하도록 @ref{2ec,,ValueError}를 발생시킴에 유의하십시오. 이 메서드는 @ref{aff,,IMAP4} 생성자에 의해 묵시적으로 호출됩니다. 이 메서드로 맺어진 연결 객체는 @ref{408a,,IMAP4.read()}, @ref{408b,,IMAP4.readline()}, @ref{408c,,IMAP4.send()} 및 @ref{408d,,IMAP4.shutdown()} 메서드에서 사용됩니다. 이 메서드를 재정의할 수 있습니다.

인자 @code{self}, @code{host}, @code{port}로 @ref{1c6c,,감사 이벤트} @code{imaplib.open}을 발생시킵니다.


버전 3.9에서 변경: `timeout' 매개 변수가 추가되었습니다.

@end deffn

@geindex partial() (imaplib.IMAP4 메서드)
@anchor{library/imaplib imaplib IMAP4 partial}@anchor{408e}
@deffn {메서드} IMAP4.partial (message_num, message_part, start, length)

메시지의 잘린 부분을 가져옵니다. 반환된 데이터는 메시지 부분 봉투와 데이터의 튜플입니다.
@end deffn

@geindex proxyauth() (imaplib.IMAP4 메서드)
@anchor{library/imaplib imaplib IMAP4 proxyauth}@anchor{408f}
@deffn {메서드} IMAP4.proxyauth (user)

인증을 `user'로 가정합니다. 권한 있는 관리자가 모든 사용자의 사서함으로 프락시 하도록 합니다.
@end deffn

@geindex read() (imaplib.IMAP4 메서드)
@anchor{library/imaplib imaplib IMAP4 read}@anchor{408a}
@deffn {메서드} IMAP4.read (size)

원격 서버에서 `size' 바이트를 읽습니다. 이 메서드를 재정의할 수 있습니다.
@end deffn

@geindex readline() (imaplib.IMAP4 메서드)
@anchor{library/imaplib imaplib IMAP4 readline}@anchor{408b}
@deffn {메서드} IMAP4.readline ()

원격 서버에서 한 줄을 읽습니다. 이 메서드를 재정의할 수 있습니다.
@end deffn

@geindex recent() (imaplib.IMAP4 메서드)
@anchor{library/imaplib imaplib IMAP4 recent}@anchor{4090}
@deffn {메서드} IMAP4.recent ()

업데이트를 서버에 요청합니다. 새 메시지가 없으면 반환된 데이터는 @code{None}이고, 그렇지 않으면 @code{RECENT} 응답의 값입니다.
@end deffn

@geindex rename() (imaplib.IMAP4 메서드)
@anchor{library/imaplib imaplib IMAP4 rename}@anchor{4091}
@deffn {메서드} IMAP4.rename (oldmailbox, newmailbox)

이름이 `oldmailbox'인 사서함의 이름을 `newmailbox'로 바꿉니다.
@end deffn

@geindex response() (imaplib.IMAP4 메서드)
@anchor{library/imaplib imaplib IMAP4 response}@anchor{4082}
@deffn {메서드} IMAP4.response (code)

수신되었다면 응답 `code'에 대한 데이터를 반환합니다, 또는 @code{None}을 반환합니다. 일반적인 유형 대신, 지정된 코드를 반환합니다.
@end deffn

@geindex search() (imaplib.IMAP4 메서드)
@anchor{library/imaplib imaplib IMAP4 search}@anchor{4092}
@deffn {메서드} IMAP4.search (charset, criterion[, ...])

일치하는 메시지가 있는지 사서함을 검색합니다. `charset'은 @code{None}일 수 있으며, 이 경우 서버에 대한 요청에 @code{CHARSET}이 지정되지 않습니다. IMAP 프로토콜은 적어도 하나의 기준을 지정하도록 요구합니다; 서버가 에러를 반환하면 예외가 발생합니다. @ref{100d,,enable()} 명령을 사용하여 @code{UTF8=ACCEPT} 기능이 활성화되면 `charset'은 @code{None}이어야 합니다.

예:

@example
# M은 연결된 IMAP4 인스턴스입니다...
typ, msgnums = M.search(None, 'FROM', '"LDJ"')

# 또는:
typ, msgnums = M.search(None, '(FROM "LDJ")')
@end example
@end deffn

@geindex select() (imaplib.IMAP4 메서드)
@anchor{library/imaplib imaplib IMAP4 select}@anchor{4093}
@deffn {메서드} IMAP4.select (mailbox='INBOX', readonly=False)

사서함을 선택합니다. 반환된 데이터는 `mailbox'에 있는 메시지 수입니다 (@code{EXISTS} 응답). 기본 `mailbox'는 @code{'INBOX'}입니다. `readonly' 플래그가 설정되면, 사서함을 수정할 수 없습니다.
@end deffn

@geindex send() (imaplib.IMAP4 메서드)
@anchor{library/imaplib imaplib IMAP4 send}@anchor{408c}
@deffn {메서드} IMAP4.send (data)

@code{data}를 원격 서버로 보냅니다. 이 메서드를 재정의할 수 있습니다.

인자 @code{self}, @code{data}로 @ref{1c6c,,감사 이벤트} @code{imaplib.send}를 발생시킵니다.
@end deffn

@geindex setacl() (imaplib.IMAP4 메서드)
@anchor{library/imaplib imaplib IMAP4 setacl}@anchor{4094}
@deffn {메서드} IMAP4.setacl (mailbox, who, what)

`mailbox'에 대한 @code{ACL}을 설정합니다. 이 메서드는 비표준이지만, @code{Cyrus} 서버에서 지원됩니다.
@end deffn

@geindex setannotation() (imaplib.IMAP4 메서드)
@anchor{library/imaplib imaplib IMAP4 setannotation}@anchor{4095}
@deffn {메서드} IMAP4.setannotation (mailbox, entry, attribute[, ...])

`mailbox'에 대한 @code{ANNOTATION}을 설정합니다. 이 메서드는 비표준이지만, @code{Cyrus} 서버에서 지원됩니다.
@end deffn

@geindex setquota() (imaplib.IMAP4 메서드)
@anchor{library/imaplib imaplib IMAP4 setquota}@anchor{4096}
@deffn {메서드} IMAP4.setquota (root, limits)

@code{quota} `root'의 자원 `한도(limits)'를 설정합니다. 이 메서드는 rfc2087에 정의된 IMAP4 QUOTA 확장의 일부입니다.
@end deffn

@geindex shutdown() (imaplib.IMAP4 메서드)
@anchor{library/imaplib imaplib IMAP4 shutdown}@anchor{408d}
@deffn {메서드} IMAP4.shutdown ()

@code{open}에서 맺은 연결을 닫습니다. 이 메서드는 @ref{c83,,IMAP4.logout()}에 의해 묵시적으로 호출됩니다. 이 메서드를 재정의할 수 있습니다.
@end deffn

@geindex socket() (imaplib.IMAP4 메서드)
@anchor{library/imaplib imaplib IMAP4 socket}@anchor{4097}
@deffn {메서드} IMAP4.socket ()

서버에 연결하는 데 사용된 소켓 인스턴스를 반환합니다.
@end deffn

@geindex sort() (imaplib.IMAP4 메서드)
@anchor{library/imaplib imaplib IMAP4 sort}@anchor{4098}
@deffn {메서드} IMAP4.sort (sort_criteria, charset, search_criterion[, ...])

@code{sort} 명령은 결과에 대한 정렬이 추가된 @code{search}의 변형입니다. 반환된 데이터는 일치하는 메시지 번호의 공백으로 구분된 목록을 포함합니다.

sort에는 `search_criterion' 인자 앞에 두 개의 인자가 있습니다; `sort_criteria'의 괄호로 묶은 목록과 검색 `charset'. @code{search}와 달리, 검색 `charset' 인자는 필수임에 유의하십시오. @code{uid search}가 @code{search}에 해당하는 방식으로 @code{sort}에 해당하는 @code{uid sort} 명령도 있습니다. @code{sort} 명령은 먼저 검색 기준의 문자열 해석을 위해 charset 인자를 사용하여 주어진 검색 기준과 일치하는 메시지를 사서함에서 검색합니다. 그런 다음 일치하는 메시지 수를 반환합니다.

이것은 @code{IMAP4rev1} 확장 명령입니다.
@end deffn

@geindex starttls() (imaplib.IMAP4 메서드)
@anchor{library/imaplib imaplib IMAP4 starttls}@anchor{142a}
@deffn {메서드} IMAP4.starttls (ssl_context=None)

@code{STARTTLS} 명령을 보냅니다. `ssl_context' 인자는 선택적이며 @ref{357,,ssl.SSLContext} 객체여야 합니다. IMAP 연결의 암호화를 활성화합니다. 모범 사례는 @ref{38c5,,보안 고려 사항}을 읽으십시오.


Added in version 3.2.



버전 3.4에서 변경: 이 메서드는 이제 @ref{39fb,,ssl.SSLContext.check_hostname}과 `서버 이름 표시(Server Name Indication)'로 호스트명 확인을 지원합니다 (@ref{3a0d,,ssl.HAS_SNI}를 참조하십시오).

@end deffn

@geindex status() (imaplib.IMAP4 메서드)
@anchor{library/imaplib imaplib IMAP4 status}@anchor{4099}
@deffn {메서드} IMAP4.status (mailbox, names)

`mailbox'에 대한 명명된 상태 조건(status conditions)을 요청합니다.
@end deffn

@geindex store() (imaplib.IMAP4 메서드)
@anchor{library/imaplib imaplib IMAP4 store}@anchor{409a}
@deffn {메서드} IMAP4.store (message_set, command, flag_list)

사서함의 메시지에 대한 플래그 속성을 변경합니다. `command'는 
@geindex RFC; RFC 2060
RFC 2060@footnote{https://datatracker.ietf.org/doc/html/rfc2060.html}의 섹션 6.4.6에서 “FLAGS”, “+ FLAGS” 또는 “-FLAGS” 중 하나로 지정되고, 선택적으로 “.SILENT” 접미사를 갖습니다.

예를 들어, 모든 메시지에 삭제 플래그를 설정하려면 다음을 수행합니다:

@example
typ, data = M.search(None, 'ALL')
for num in data[0].split():
   M.store(num, '+FLAGS', '\\Deleted')
M.expunge()
@end example

@cartouche
@quotation 참고 
‘]’을 포함하는 플래그를 만드는 것은 (예를 들어: “[test]”) 
@geindex RFC; RFC 3501
RFC 3501@footnote{https://datatracker.ietf.org/doc/html/rfc3501.html}(IMAP 프로토콜)을 위반합니다. 그러나, imaplib는 역사적으로 이러한 태그를 만들 수 있도록 허락했고, Gmail과 같은 널리 사용되는 IMAP 서버는 이러한 플래그를 받아들이고 생성합니다. 역시 이러한 태그를 생성하는 비 파이썬 프로그램이 있습니다. RFC 위반이고 IMAP 클라이언트와 서버가 엄격해야 하기는 하지만, imaplib는 이전 버전과의 호환성을 위해 이러한 태그를 만들도록 계속 허락하며, 파이썬 3.6부터는 실제 호환성을 향상하기 때문에 서버에서 보낸다면 처리합니다.
@end quotation
@end cartouche
@end deffn

@geindex subscribe() (imaplib.IMAP4 메서드)
@anchor{library/imaplib imaplib IMAP4 subscribe}@anchor{409b}
@deffn {메서드} IMAP4.subscribe (mailbox)

새 사서함을 구독합니다.
@end deffn

@geindex thread() (imaplib.IMAP4 메서드)
@anchor{library/imaplib imaplib IMAP4 thread}@anchor{409c}
@deffn {메서드} IMAP4.thread (threading_algorithm, charset, search_criterion[, ...])

@code{thread} 명령은 결과에 대한 스레딩이 추가된 @code{search}의 변형입니다. 반환된 데이터는 스레드 구성원의 스페이스로 구분된 목록을 포함합니다.

스레드 구성원은 연속된 부모와 자식을 나타내는 스페이스로 구분된 0개 이상의 메시지 번호로 구성됩니다.

thread에는 `search_criterion' 인자 앞에 두 개의 인자가 있습니다; `threading_algorithm'과 검색 `charset'. @code{search}와 달리, 검색 `charset' 인자는 필수임에 유의하십시오. @code{uid search}가 @code{search}에 해당하는 방식으로 @code{thread}에 해당하는 @code{uid thread} 명령도 있습니다. @code{thread} 명령은 먼저 검색 기준의 문자열 해석을 위해 `charset' 인자를 사용하여 주어진 검색 기준과 일치하는 메시지를 사서함에서 검색합니다. 그런 다음 지정된 스레딩 알고리즘에 따라 스레드 된 일치 메시지들을 반환합니다.

이것은 @code{IMAP4rev1} 확장 명령입니다.
@end deffn

@geindex uid() (imaplib.IMAP4 메서드)
@anchor{library/imaplib imaplib IMAP4 uid}@anchor{409d}
@deffn {메서드} IMAP4.uid (command, arg[, ...])

메시지 번호가 아닌 UID로 식별된 메시지들로 명령 인자를 실행합니다. 명령에 적합한 응답을 반환합니다. 최소한 하나의 인자가 제공되어야 합니다; 아무것도 제공하지 않으면, 서버는 에러를 반환하고 예외가 발생합니다.
@end deffn

@geindex unsubscribe() (imaplib.IMAP4 메서드)
@anchor{library/imaplib imaplib IMAP4 unsubscribe}@anchor{409e}
@deffn {메서드} IMAP4.unsubscribe (mailbox)

기존 사서함에서 구독 취소합니다.
@end deffn

@geindex unselect() (imaplib.IMAP4 메서드)
@anchor{library/imaplib imaplib IMAP4 unselect}@anchor{b03}
@deffn {메서드} IMAP4.unselect ()

@ref{b03,,imaplib.IMAP4.unselect()}는 선택한 사서함과 관련된 서버 자원을 해제하고 서버를 인증된 상태로 되돌립니다. 이 명령은 현재 선택된 사서함에서 메시지가 영구적으로 제거되지 않는다는 점을 제외하고, @ref{b04,,imaplib.IMAP4.close()}와 같은 작업을 수행합니다.


Added in version 3.9.

@end deffn

@geindex xatom() (imaplib.IMAP4 메서드)
@anchor{library/imaplib imaplib IMAP4 xatom}@anchor{409f}
@deffn {메서드} IMAP4.xatom (name[, ...])

@code{CAPABILITY} 응답에서 서버가 통지한 간단한 확장 명령을 허용합니다.
@end deffn

@ref{aff,,IMAP4} 인스턴스에는 다음과 같은 어트리뷰트가 정의되어 있습니다:

@geindex PROTOCOL_VERSION (imaplib.IMAP4의 속성)
@anchor{library/imaplib imaplib IMAP4 PROTOCOL_VERSION}@anchor{40a0}
@deffn {속성} IMAP4.PROTOCOL_VERSION

서버의 @code{CAPABILITY} 응답에서 가장 최근에 지원되는 프로토콜.
@end deffn

@geindex debug (imaplib.IMAP4의 속성)
@anchor{library/imaplib imaplib IMAP4 debug}@anchor{40a1}
@deffn {속성} IMAP4.debug

디버깅 출력을 제어하기 위한 정숫값. 초기화 값은 모듈 변수 @code{Debug}에서 취합니다. 3보다 큰 값은 각 명령을 추적합니다.
@end deffn

@geindex utf8_enabled (imaplib.IMAP4의 속성)
@anchor{library/imaplib imaplib IMAP4 utf8_enabled}@anchor{100e}
@deffn {속성} IMAP4.utf8_enabled

일반적으로 @code{False}이지만, @code{UTF8=ACCEPT} 기능에 대해 @ref{100d,,enable()} 명령이 성공적으로 발행되면 @code{True}로 설정되는 불리언 값.


Added in version 3.5.

@end deffn

@node IMAP4 예,,IMAP4 객체,imaplib — IMAP4 프로토콜 클라이언트
@anchor{library/imaplib id2}@anchor{40a2}@anchor{library/imaplib imap4-example}@anchor{40a3}
@subsubsection IMAP4 예


다음은 사서함을 열고 모든 메시지를 가져오고 인쇄하는 최소한의 예(에러 검사는 없습니다)입니다:

@example
import getpass, imaplib

M = imaplib.IMAP4(host='example.org')
M.login(getpass.getuser(), getpass.getpass())
M.select()
typ, data = M.search(None, 'ALL')
for num in data[0].split():
    typ, data = M.fetch(num, '(RFC822)')
    print('Message %s\n%s\n' % (num, data[0][1]))
M.close()
M.logout()
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node smtplib — SMTP 프로토콜 클라이언트,uuid — UUID objects according to RFC 9562,imaplib — IMAP4 프로토콜 클라이언트,인터넷 프로토콜과 지원
@anchor{library/smtplib doc}@anchor{40a4}@anchor{library/smtplib module-smtplib}@anchor{cf}@anchor{library/smtplib smtplib-smtp-protocol-client}@anchor{40a5}@anchor{library/smtplib translation-repo}@anchor{40a6}
@subsection @code{smtplib} — SMTP 프로토콜 클라이언트


@geindex module; smtplib

`소스 코드:' Lib/smtplib.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/smtplib.py}

@geindex SMTP;프로토콜
@geindex Simple Mail Transfer Protocol


__________________________________________________________________


The @code{smtplib} module defines an SMTP client session object that can be used
to send mail to any internet machine with an SMTP or ESMTP listener daemon.  For
details of SMTP and ESMTP operation, consult 
@geindex RFC; RFC 821
RFC 821@footnote{https://datatracker.ietf.org/doc/html/rfc821.html} (Simple Mail Transfer
Protocol) and 
@geindex RFC; RFC 1869
RFC 1869@footnote{https://datatracker.ietf.org/doc/html/rfc1869.html} (SMTP Service Extensions).

@c include for modules that don't work on WASM

@ref{213c,,가용성}: not WASI.

이 모듈은 웹어셈블리에서 작동하지 않거나 제공되지 않습니다. 자세한 내용은 @ref{1b68,,웹어셈블리 플랫폼}을 참조하세요.

@geindex SMTP (smtplib 클래스)
@anchor{library/smtplib smtplib SMTP}@anchor{b27}
@deffn {클래스} smtplib.SMTP (host='@w{'}, port=0, local_hostname=None[, timeout], source_address=None)

@ref{b27,,SMTP} 인스턴스는 SMTP 연결을 캡슐화합니다. SMTP와 ESMTP 연산의 전체 레퍼토리를 지원하는 메서드가 있습니다. 선택적 `host'와 `port' 매개 변수가 제공되면, 초기화 중에 해당 매개 변수로 SMTP @ref{1dac,,connect()} 메서드가 호출됩니다. 지정되면, HELO/EHLO 명령에서 `local_hostname'이 로컬 호스트의 FQDN으로 사용됩니다. 그렇지 않으면 @ref{1aeb,,socket.getfqdn()}을 사용하여 로컬 호스트 이름을 찾습니다. @code{connect()} 호출이 성공 코드 이외의 것을 반환하면 @ref{40a7,,SMTPConnectError}가 발생합니다. 선택적 `timeout' 매개 변수는 연결 시도와 같은 블로킹 연산을 위한 시간제한을 초로 지정합니다 (지정하지 않으면, 전역 기본 시간제한 설정이 사용됩니다). 시간제한이 만료되면 @ref{a36,,TimeoutError}이 발생합니다. 선택적 `source_address' 매개 변수는 여러 네트워크 인터페이스가 있는 기계의 특정 소스 주소 그리고/또는 특정 소스 TCP 포트에 바인딩 할 수 있도록 합니다. 연결 전에 소켓이 소스 주소로 바인드 할 2-튜플 @code{(host, port)}를 취합니다. 생략되면 (또는 `host'나 `port'가 각각 @code{'@w{'}} 및/또는 @code{0}이면) OS 기본 동작이 사용됩니다.

일반적인 사용을 위해서는, 초기화/연결, @ref{1058,,sendmail()} 및 @ref{40a8,,SMTP.quit()} 메서드 만 필요합니다. 아래에 예가 포함되어 있습니다.

@ref{b27,,SMTP} 클래스는 @ref{186,,with} 문을 지원합니다. 이처럼 사용되면, @code{with} 문이 종료될 때 SMTP @code{QUIT} 명령이 자동으로 발행됩니다. 예를 들어:

@example
>>> from smtplib import SMTP
>>> with SMTP("domain.org") as smtp:
...     smtp.noop()
...
(250, b'Ok')
>>>
@end example

모든 명령은 인자 @code{self}와 @code{data}로 @ref{1c6c,,감사 이벤트} @code{smtplib.SMTP.send}를 발생시킵니다. 여기서 @code{data}는 원격 호스트로 전송될 바이트열입니다.


버전 3.3에서 변경: @ref{186,,with} 문에 대한 지원이 추가되었습니다.



버전 3.3에서 변경: `source_address' 인자가 추가되었습니다.



Added in version 3.5: SMTPUTF8 확장(
@geindex RFC; RFC 6531
RFC 6531@footnote{https://datatracker.ietf.org/doc/html/rfc6531.html})이 이제 지원됩니다.



버전 3.9에서 변경: `timeout' 매개 변수가 0으로 설정되면, 비 블로킹 소켓을 만드는 것을 막기 위해 @ref{2ec,,ValueError}가 발생합니다.

@end deffn

@geindex SMTP_SSL (smtplib 클래스)
@anchor{library/smtplib smtplib SMTP_SSL}@anchor{b28}
@deffn {클래스} smtplib.SMTP_SSL (host='@w{'}, port=0, local_hostname=None, *[, timeout], context=None, source_address=None)

An @code{SMTP_SSL} instance behaves exactly the same as instances of
@ref{b27,,SMTP}. @code{SMTP_SSL} should be used for situations where SSL is
required from the beginning of the connection and using @ref{133d,,starttls()}
is not appropriate. If `host' is not specified, the local host is used. If
`port' is zero, the standard SMTP-over-SSL port (465) is used.  The optional
arguments `local_hostname', `timeout' and `source_address' have the same
meaning as they do in the @code{SMTP} class.  `context', also optional,
can contain a @ref{357,,SSLContext} and allows configuring various
aspects of the secure connection.  Please read @ref{38c5,,보안 고려 사항} for
best practices.


버전 3.3에서 변경: `context'가 추가되었습니다.



버전 3.3에서 변경: `source_address' 인자가 추가되었습니다.



버전 3.4에서 변경: 이 클래스는 이제 @ref{39fb,,ssl.SSLContext.check_hostname}과 `서버 이름 표시(Server Name Indication)'로 호스트 이름 확인을 지원합니다 (@ref{3a0d,,ssl.HAS_SNI}를 참조하십시오).



버전 3.9에서 변경: `timeout' 매개 변수가 0으로 설정되면, 비 블로킹 소켓을 만드는 것을 막기 위해 @ref{2ec,,ValueError}가 발생합니다.



버전 3.12에서 변경: 폐지된 `keyfile' 과 `certfile' 매개 변수는 제거했습니다.

@end deffn

@geindex LMTP (smtplib 클래스)
@anchor{library/smtplib smtplib LMTP}@anchor{b29}
@deffn {클래스} smtplib.LMTP (host='@w{'}, port=LMTP_PORT, local_hostname=None, source_address=None[, timeout])

The LMTP protocol, which is very similar to ESMTP, is heavily based on the
standard SMTP client. It’s common to use Unix sockets for LMTP, so our
@ref{1dac,,connect()} method must support that as well as a regular host:port
server. The optional arguments `local_hostname' and `source_address' have the
same meaning as they do in the @ref{b27,,SMTP} class. To specify a Unix
socket, you must use an absolute path for `host', starting with a ‘/’.

일반 SMTP 메커니즘을 사용하여 인증이 지원됩니다. 유닉스 소켓을 사용할 때, LMTP는 일반적으로 인증을 지원하지 않거나 요구하지 않지만, 여러분의 상황에서는 다를 수 있습니다.


버전 3.9에서 변경: 선택적 `timeout' 매개 변수가 추가되었습니다.

@end deffn

훌륭한 예외 모음도 정의되어 있습니다:

@geindex SMTPException
@anchor{library/smtplib smtplib SMTPException}@anchor{11a0}
@deffn {예외} smtplib.SMTPException

이 모듈에서 제공하는 다른 모든 예외에 대한 베이스 예외 클래스인 @ref{2c0,,OSError}의 서브 클래스.


버전 3.4에서 변경: SMTPException이 @ref{2c0,,OSError}의 서브 클래스가 되었습니다.

@end deffn

@geindex SMTPServerDisconnected
@anchor{library/smtplib smtplib SMTPServerDisconnected}@anchor{40a9}
@deffn {예외} smtplib.SMTPServerDisconnected

이 예외는 예기치 않게 서버와의 연결이 끊어지거나, 서버에 연결하기 전에 @ref{b27,,SMTP} 인스턴스를 사용하려고 할 때 발생합니다.
@end deffn

@geindex SMTPResponseException
@anchor{library/smtplib smtplib SMTPResponseException}@anchor{40aa}
@deffn {예외} smtplib.SMTPResponseException

Base class for all exceptions that include an SMTP error code. These exceptions
are generated in some instances when the SMTP server returns an error code.

@geindex smtp_code (smtplib.SMTPResponseException의 속성)
@anchor{library/smtplib smtplib SMTPResponseException smtp_code}@anchor{40ab}
@deffn {속성} smtp_code

The error code.
@end deffn

@geindex smtp_error (smtplib.SMTPResponseException의 속성)
@anchor{library/smtplib smtplib SMTPResponseException smtp_error}@anchor{40ac}
@deffn {속성} smtp_error

The error message.
@end deffn
@end deffn

@geindex SMTPSenderRefused
@anchor{library/smtplib smtplib SMTPSenderRefused}@anchor{40ad}
@deffn {예외} smtplib.SMTPSenderRefused

발신자 주소가 거부되었습니다. 모든 @ref{40aa,,SMTPResponseException} 예외에 의해 설정된 어트리뷰트 외에도, 이것은 ‘sender’를 SMTP 서버가 거부한 문자열로 설정합니다.
@end deffn

@geindex SMTPRecipientsRefused
@anchor{library/smtplib smtplib SMTPRecipientsRefused}@anchor{40ae}
@deffn {예외} smtplib.SMTPRecipientsRefused

All recipient addresses refused.

@geindex recipients (smtplib.SMTPRecipientsRefused의 속성)
@anchor{library/smtplib smtplib SMTPRecipientsRefused recipients}@anchor{40af}
@deffn {속성} recipients

A dictionary of exactly the same sort as returned
by @ref{1058,,SMTP.sendmail()} containing the errors for
each recipient.
@end deffn
@end deffn

@geindex SMTPDataError
@anchor{library/smtplib smtplib SMTPDataError}@anchor{40b0}
@deffn {예외} smtplib.SMTPDataError

SMTP 서버가 메시지 데이터 수락을 거부했습니다.
@end deffn

@geindex SMTPConnectError
@anchor{library/smtplib smtplib SMTPConnectError}@anchor{40a7}
@deffn {예외} smtplib.SMTPConnectError

서버와의 연결을 설정하는 동안 에러가 발생했습니다.
@end deffn

@geindex SMTPHeloError
@anchor{library/smtplib smtplib SMTPHeloError}@anchor{40b1}
@deffn {예외} smtplib.SMTPHeloError

서버가 @code{HELO} 메시지를 거부했습니다.
@end deffn

@geindex SMTPNotSupportedError
@anchor{library/smtplib smtplib SMTPNotSupportedError}@anchor{1dab}
@deffn {예외} smtplib.SMTPNotSupportedError

시도한 명령이나 옵션이 서버에서 지원되지 않습니다.


Added in version 3.5.

@end deffn

@geindex SMTPAuthenticationError
@anchor{library/smtplib smtplib SMTPAuthenticationError}@anchor{40b2}
@deffn {예외} smtplib.SMTPAuthenticationError

SMTP 인증이 잘못되었습니다. 서버가 제공된 username/password 조합을 수락하지 않았을 가능성이 높습니다.
@end deffn


@subsubheading 더 보기



@table @asis

@geindex RFC; RFC 821

@item RFC 821@footnote{https://datatracker.ietf.org/doc/html/rfc821.html} - Simple Mail Transfer Protocol

SMTP의 프로토콜 정의. 이 문서는 SMTP의 모델, 운영 절차 및 프로토콜 세부 사항을 다룹니다.

@geindex RFC; RFC 1869

@item RFC 1869@footnote{https://datatracker.ietf.org/doc/html/rfc1869.html} - SMTP Service Extensions

SMTP를 위한 ESMTP 확장의 정의. 이 문서는 새로운 명령으로 SMTP를 확장하고 서버에서 제공하는 명령의 동적 발견을 지원하는 프레임워크에 관해 설명하고, 몇 가지 추가 명령을 정의합니다.
@end table


@menu
* SMTP 객체:: 
* SMTP 예:: 

@end menu

@node SMTP 객체,SMTP 예,,smtplib — SMTP 프로토콜 클라이언트
@anchor{library/smtplib id1}@anchor{40b3}@anchor{library/smtplib smtp-objects}@anchor{40b4}
@subsubsection SMTP 객체


@ref{b27,,SMTP} 인스턴스에는 다음과 같은 메서드가 있습니다:

@geindex set_debuglevel() (smtplib.SMTP 메서드)
@anchor{library/smtplib smtplib SMTP set_debuglevel}@anchor{1057}
@deffn {메서드} SMTP.set_debuglevel (level)

디버그 출력 수준을 설정합니다. `level'의 값이 1이나 @code{True}이면 연결과 서버와 주고받는 모든 메시지에 대한 디버그 메시지가 생성됩니다. `level'의 값이 2이면 이러한 메시지에 타임 스탬프가 추가됩니다.


버전 3.5에서 변경: 디버그 수준 2를 추가했습니다.

@end deffn

@geindex docmd() (smtplib.SMTP 메서드)
@anchor{library/smtplib smtplib SMTP docmd}@anchor{40b5}
@deffn {메서드} SMTP.docmd (cmd, args='@w{'})

서버에 `cmd' 명령을 전송합니다. 선택적 인자 `args'는 단순히 공백으로 구분하여 명령에 이어붙입니다.

숫자 응답 코드와 실제 응답 줄로 구성된 2-튜플을 반환합니다 (여러 줄 응답은 하나의 긴 줄로 결합합니다).

일반적인 작업에서 이 메서드를 명시적으로 호출할 필요는 없습니다. 다른 메서드를 구현하는 데 사용되며 개인적인 확장을 테스트하는 데 유용할 수 있습니다.

응답을 기다리는 동안 서버와의 연결이 끊어지면, @ref{40a9,,SMTPServerDisconnected} 가 발생합니다.
@end deffn

@geindex connect() (smtplib.SMTP 메서드)
@anchor{library/smtplib smtplib SMTP connect}@anchor{1dac}
@deffn {메서드} SMTP.connect (host='localhost', port=0)

지정된 포트(port)의 호스트(host)에 연결합니다. 기본값은 표준 SMTP 포트(25)로 로컬 호스트에 연결하는 것입니다. 호스트 이름이 콜론(@code{':'})으로 끝나고 그 뒤에 숫자가 오면 해당 접미사가 제거되고 숫자는 사용할 포트 번호로 해석됩니다. 이 메서드는 인스턴스 화 중에 호스트가 지정되면 생성자에 의해 자동으로 호출됩니다. 연결 응답에서 서버가 보낸 응답 코드와 메시지의 2-튜플을 반환합니다.

인자 @code{self}, @code{host}, @code{port}로 @ref{1c6c,,감사 이벤트} @code{smtplib.connect}를 발생시킵니다.
@end deffn

@geindex helo() (smtplib.SMTP 메서드)
@anchor{library/smtplib smtplib SMTP helo}@anchor{40b6}
@deffn {메서드} SMTP.helo (name='@w{'})

@code{HELO} 를 사용하여 SMTP 서버에 자신을 식별합니다. hostname 인자의 기본값은 로컬 호스트의 완전히 정규화된 도메인 이름(fully qualified domain name)입니다. 서버가 반환한 메시지는 객체의 @ref{40b7,,helo_resp} 어트리뷰트로 저장됩니다.

정상적인 작업에서는 이 메서드를 명시적으로 호출할 필요가 없습니다. 필요할 때 @ref{1058,,sendmail()}에 의해 묵시적으로 호출됩니다.
@end deffn

@geindex ehlo() (smtplib.SMTP 메서드)
@anchor{library/smtplib smtplib SMTP ehlo}@anchor{40b8}
@deffn {메서드} SMTP.ehlo (name='@w{'})

@code{EHLO}를 사용하여 ESMTP 서버에 자신을 식별합니다. hostname 인자의 기본값은 로컬 호스트의 완전히 정규화된 도메인 이름(fully qualified domain name)입니다. ESMTP 옵션에 대한 응답을 검사하고 @ref{40b9,,has_extn()}에서 사용할 수 있도록 저장합니다. 또한 여러 정보 어트리뷰트를 설정합니다: 서버가 반환한 메시지는 @ref{40ba,,ehlo_resp} 어트리뷰트로 저장되고, 서버가 ESMTP를 지원하는지에 따라 @ref{40bb,,does_esmtp}가 @code{True}나 @code{False}로 설정되며, @ref{40bc,,esmtp_features}는 이 서버가 지원하는 SMTP 서비스 확장의 이름과 그 매개 변수(있다면)를 포함하는 딕셔너리가 됩니다.

메일을 보내기 전에 @ref{40b9,,has_extn()}을 사용하고 싶지 않은 한, 이 메서드를 명시적으로 호출할 필요는 없습니다. 필요할 때 @ref{1058,,sendmail()}에 의해 묵시적으로 호출됩니다.
@end deffn

@geindex ehlo_or_helo_if_needed() (smtplib.SMTP 메서드)
@anchor{library/smtplib smtplib SMTP ehlo_or_helo_if_needed}@anchor{40bd}
@deffn {메서드} SMTP.ehlo_or_helo_if_needed ()

이 세션에서 앞선 @code{EHLO}나 @code{HELO} 명령이 없으면, 이 메서드는 @ref{40b8,,ehlo()} 및/또는 @ref{40b6,,helo()}를 호출합니다. ESMTP @code{EHLO}를 먼저 시도합니다.


@table @asis

@item @ref{40b1,,SMTPHeloError}

서버가 @code{HELO} 인사에 올바르게 응답하지 않았습니다.
@end table
@end deffn

@geindex has_extn() (smtplib.SMTP 메서드)
@anchor{library/smtplib smtplib SMTP has_extn}@anchor{40b9}
@deffn {메서드} SMTP.has_extn (name)

`name'이 서버가 반환한 SMTP 서비스 확장 집합에 있으면 @ref{e06,,True}를 반환하고, 그렇지 않으면 @ref{d2a,,False}를 반환합니다. 대소 문자는 무시됩니다.
@end deffn

@geindex verify() (smtplib.SMTP 메서드)
@anchor{library/smtplib smtplib SMTP verify}@anchor{40be}
@deffn {메서드} SMTP.verify (address)

SMTP @code{VRFY}를 사용하여 이 서버에서 주소의 유효성을 확인합니다. 사용자 주소가 유효하면 코드 250과 전체 
@geindex RFC; RFC 822
RFC 822@footnote{https://datatracker.ietf.org/doc/html/rfc822.html} 주소(사람 이름 포함)로 구성된 튜플을 반환합니다. 그렇지 않으면 400 이상의 SMTP 에러 코드와 에러 문자열을 반환합니다.

@cartouche
@quotation 참고 
많은 사이트에서 스패머를 제거하기 위해 SMTP @code{VRFY}를 비활성화합니다.
@end quotation
@end cartouche
@end deffn

@geindex login() (smtplib.SMTP 메서드)
@anchor{library/smtplib smtplib SMTP login}@anchor{40bf}
@deffn {메서드} SMTP.login (user, password, *, initial_response_ok=True)

인증이 필요한 SMTP 서버에 로그인합니다. 인자는 인증할 사용자 이름과 비밀번호입니다. 이 세션에 앞선 @code{EHLO}나 @code{HELO} 명령이 없었으면, 이 메서드는 ESMTP @code{EHLO}를 먼저 시도합니다. 인증에 성공하면 이 메서드는 정상적으로 반환하고, 그렇지 않으면 다음 예외를 발생시킬 수 있습니다:


@table @asis

@item @ref{40b1,,SMTPHeloError}

서버가 @code{HELO} 인사에 올바르게 응답하지 않았습니다.

@item @ref{40b2,,SMTPAuthenticationError}

서버가 사용자 이름/비밀번호 조합을 수락하지 않았습니다.

@item @ref{1dab,,SMTPNotSupportedError}

서버가 @code{AUTH} 명령을 지원하지 않습니다.

@item @ref{11a0,,SMTPException}

적합한 인증 메서드가 없습니다.
@end table

Each of the authentication methods supported by @code{smtplib} are tried in
turn if they are advertised as supported by the server.  See @ref{1056,,auth()}
for a list of supported authentication methods.  `initial_response_ok' is
passed through to @code{auth()}.

선택적 키워드 인자 `initial_response_ok'는, 이를 지원하는 인증 메서드의 경우, 챌린지/응답을 요구하지 않고 
@geindex RFC; RFC 4954
RFC 4954@footnote{https://datatracker.ietf.org/doc/html/rfc4954.html}에 지정된 “초기 응답(initial response)”을 @code{AUTH} 명령과 함께 보낼 수 있는지를 지정합니다.


버전 3.5에서 변경: @ref{1dab,,SMTPNotSupportedError} 가 발생할 수 있고, `initial_response_ok' 매개 변수가 추가되었습니다.

@end deffn

@geindex auth() (smtplib.SMTP 메서드)
@anchor{library/smtplib smtplib SMTP auth}@anchor{1056}
@deffn {메서드} SMTP.auth (mechanism, authobject, *, initial_response_ok=True)

지정된 인증 `메커니즘(mechanism)'으로 @code{SMTP} @code{AUTH} 명령을 발행하고, `authobject'를 통해 챌린지 응답을 처리합니다.

`mechanism'은 @code{AUTH} 명령의 인자로 사용할 인증 메커니즘을 지정합니다; 유효한 값은 @ref{40bc,,esmtp_features}의 @code{auth} 요소에 나열된 값입니다.

`authobject'는 선택적 단일 인자를 취하는 콜러블 객체여야 합니다:

@example
data = authobject(challenge=None)
@end example

선택적 키워드 인자 `initial_response_ok'가 참이면, 인자 없이 @code{authobject()}가 먼저 호출됩니다. 이것은 
@geindex RFC; RFC 4954
RFC 4954@footnote{https://datatracker.ietf.org/doc/html/rfc4954.html} “초기 응답(initial response)” ASCII @code{str}을 반환할 수 있으며, 이는 아래와 같이 @code{AUTH} 명령으로 인코딩되고 전송됩니다. @code{authobject()}가 초기 응답을 지원하지 않으면 (예를 들어 챌린지가 필요하기 때문에), @code{challenge=None}으로 호출될 때 @code{None}을 반환해야 합니다. `initial_response_ok'가 거짓이면, @code{authobject()}는 @code{None}으로 먼저 호출되지 않습니다.

초기 응답 확인이 @code{None}을 반환하거나, `initial_response_ok'가 거짓이면, 서버의 챌린지 응답을 처리하기 위해 @code{authobject()}가 호출됩니다; 전달된 `challenge' 인자는 @code{bytes}입니다. base64로 인코딩되어 서버로 전송될 ASCII @code{str} `data'를 반환해야 합니다.

@code{SMTP} 클래스는 @code{CRAM-MD5}, @code{PLAIN} 및 @code{LOGIN} 메커니즘을 위한 @code{authobjects}를 제공합니다. 그것들은 각각 @code{SMTP.auth_cram_md5}, @code{SMTP.auth_plain} 및 @code{SMTP.auth_login}으로 명명됩니다. 모두 @code{SMTP} 인스턴스의 @code{user}와 @code{password} 프로퍼티가 적절한 값으로 설정되어 있도록 요구합니다.

User code does not normally need to call @code{auth} directly, but can instead
call the @ref{40bf,,login()} method, which will try each of the above mechanisms
in turn, in the order listed.  @code{auth} is exposed to facilitate the
implementation of authentication methods not (or not yet) supported
directly by @code{smtplib}.


Added in version 3.5.

@end deffn

@geindex starttls() (smtplib.SMTP 메서드)
@anchor{library/smtplib smtplib SMTP starttls}@anchor{133d}
@deffn {메서드} SMTP.starttls (*, context=None)

SMTP 연결을 TLS (Transport Layer Security) 모드로 전환합니다. 뒤따르는 모든 SMTP 명령은 암호화됩니다. 그런 다음 @ref{40b8,,ehlo()}를 다시 호출해야 합니다.

`keyfile'과 `certfile'이 제공되면, @ref{357,,ssl.SSLContext}를 만드는 데 사용됩니다.

선택적 `context' 매개 변수는 @ref{357,,ssl.SSLContext} 객체입니다; 이것은 keyfile과 certfile대신 사용할 수 있으며 `keyfile'과 `certfile'이 모두 지정되면 @code{None}이어야 합니다.

이 세션에 앞선 @code{EHLO}나 @code{HELO} 명령이 없었으면, 이 메서드는 ESMTP @code{EHLO}를 먼저 시도합니다.


버전 3.12에서 변경: 폐지된 `keyfile' 과 `certfile' 매개 변수는 제거했습니다.



@table @asis

@item @ref{40b1,,SMTPHeloError}

서버가 @code{HELO} 인사에 올바르게 응답하지 않았습니다.

@item @ref{1dab,,SMTPNotSupportedError}

서버가 STARTTLS 확장을 지원하지 않습니다.

@item @ref{244,,RuntimeError}

파이썬 인터프리터가 SSL/TLS를 지원하지 않습니다.
@end table


버전 3.3에서 변경: `context'가 추가되었습니다.



버전 3.4에서 변경: The method now supports hostname check with
@ref{39fb,,ssl.SSLContext.check_hostname} and `Server Name Indicator' (see
@ref{3a0d,,HAS_SNI}).



버전 3.5에서 변경: STARTTLS 지원 부족으로 발생한 에러는 이제 베이스 @ref{11a0,,SMTPException} 대신 @ref{1dab,,SMTPNotSupportedError} 서브 클래스입니다.

@end deffn

@geindex sendmail() (smtplib.SMTP 메서드)
@anchor{library/smtplib smtplib SMTP sendmail}@anchor{1058}
@deffn {메서드} SMTP.sendmail (from_addr, to_addrs, msg, mail_options=(), rcpt_options=())

Send mail.  The required arguments are an 
@geindex RFC; RFC 822
RFC 822@footnote{https://datatracker.ietf.org/doc/html/rfc822.html} from-address string, a list
of 
@geindex RFC; RFC 822
RFC 822@footnote{https://datatracker.ietf.org/doc/html/rfc822.html} to-address strings (a bare string will be treated as a list with 1
address), and a message string.  The caller may pass a list of ESMTP options
(such as @code{"8bitmime"}) to be used in @code{MAIL FROM} commands as `mail_options'.
ESMTP options (such as @code{DSN} commands) that should be used with all @code{RCPT}
commands can be passed as `rcpt_options'. Each option should be passed as a string
containing the full text of the option, including any potential key
(for instance, @code{"NOTIFY=SUCCESS,FAILURE"}). (If you need to use different ESMTP
options to different recipients you have to use the low-level methods such as
@code{mail()}, @code{rcpt()} and @code{data()} to send the message.)

@cartouche
@quotation 참고 
`from_addr'과 `to_addrs' 매개 변수는 전송 에이전트가 사용하는 메시지 봉투(envelope)를 구성하는 데 사용됩니다. @code{sendmail}은 어떤 방식으로든 메시지 헤더를 수정하지 않습니다.
@end quotation
@end cartouche

`msg'는 ASCII 범위의 문자를 포함하는 문자열이거나, 바이트 문자열일 수 있습니다. 문자열은 ascii 코덱을 사용하여 바이트열로 인코딩되며, 독립된 @code{\r}과 @code{\n} 문자는 @code{\r\n} 문자로 변환됩니다. 바이트 문자열은 수정되지 않습니다.

이 세션에 앞선 @code{EHLO}나 @code{HELO} 명령이 없었으면, 이 메서드는 ESMTP @code{EHLO}를 먼저 시도합니다. 서버가 ESMTP를 지원하면, 메시지 크기와 지정된 각 옵션이 전달됩니다 (옵션이 서버가 광고한 기능 집합에 있다면). @code{EHLO}가 실패하면, @code{HELO}가 시도되고 ESMTP 옵션이 억제됩니다.

이 메서드는 적어도 한 명의 수신자에게 메일이 수락되면 정상적으로 반환됩니다. 그렇지 않으면 예외가 발생합니다. 즉, 이 메서드로 예외가 발생하지 않으면 누군가 메일을 받아야 합니다. 이 메서드에서 예외가 발생하지 않으면, 거부된 각 수신자에 대해 하나의 항목이 있는 딕셔너리를 반환합니다. 각 항목에는 서버에서 보낸 SMTP 에러 코드와 해당 에러 메시지의 튜플이 포함됩니다.

@code{SMTPUTF8}이 `mail_options'에 포함되어 있고, 서버가 이를 지원하면, `from_addr'과 `to_addrs'는 ASCII가 아닌 문자를 포함할 수 있습니다.

이 메서드는 다음과 같은 예외를 발생시킬 수 있습니다:


@table @asis

@item @ref{40ae,,SMTPRecipientsRefused}

All recipients were refused.  Nobody got the mail.

@item @ref{40b1,,SMTPHeloError}

서버가 @code{HELO} 인사에 올바르게 응답하지 않았습니다.

@item @ref{40ad,,SMTPSenderRefused}

서버가 `from_addr'을 수락하지 않았습니다.

@item @ref{40b0,,SMTPDataError}

서버가 예기치 않은 에러 코드(수신자 거부는 제외하고)로 응답했습니다.

@item @ref{1dab,,SMTPNotSupportedError}

@code{SMTPUTF8}이 `mail_options'에 제공되었지만, 서버에서 지원되지 않습니다.
@end table

달리 명시되지 않는 한, 예외가 발생한 후에도 연결은 열려있습니다.


버전 3.2에서 변경: `msg'는 바이트 문자열일 수 있습니다.



버전 3.5에서 변경: @code{SMTPUTF8} 지원이 추가되었으며, @code{SMTPUTF8}이 지정되었지만, 서버가 지원하지 않으면 @ref{1dab,,SMTPNotSupportedError} 가 발생할 수 있습니다.

@end deffn

@geindex send_message() (smtplib.SMTP 메서드)
@anchor{library/smtplib smtplib SMTP send_message}@anchor{1059}
@deffn {메서드} SMTP.send_message (msg, from_addr=None, to_addrs=None, mail_options=(), rcpt_options=())

이는 @ref{580,,email.message.Message} 객체로 표현되는 메시지로 @ref{1058,,sendmail()}을 호출하는 편의 메서드입니다. 인자는 `msg'가 @code{Message} 객체라는 점을 제외하고 @code{sendmail()}과 같은 의미입니다.

`from_addr'이 @code{None}이거나 `to_addrs'가 @code{None}이면, @code{send_message}는 
@geindex RFC; RFC 5322
RFC 5322@footnote{https://datatracker.ietf.org/doc/html/rfc5322.html} 에 지정된 대로 `msg'의 헤더에서 추출된 주소로 해당 인자를 채웁니다: `from_addr'은 @code{Sender} 필드가 있으면 이것으로 설정되고, 그렇지 않으면 @code{From} 필드로 설정됩니다. `to_addrs'는 (있다면) `msg'의 @code{To}, @code{Cc} 및 @code{Bcc} 필드 값을 결합합니다. 정확히 하나의 @code{Resent-*} 헤더 집합이 메시지에 등장하면, 일반 헤더는 무시되고 @code{Resent-*} 헤더가 대신 사용됩니다. 메시지에 둘 이상의 @code{Resent-*} 헤더 집합이 포함되면, 가장 최근의 @code{Resent-} 헤더 집합을 모호하지 않게 감지할 방법이 없어서 @ref{2ec,,ValueError}가 발생합니다.

@code{send_message}는 @code{\r\n}을 `linesep'으로 사용하여 @ref{13d4,,BytesGenerator}를 통해 `msg'를 직렬화하고, @ref{1058,,sendmail()}을 호출하여 결과 메시지를 전송합니다. `from_addr'과 `to_addrs'의 값과 관계없이 @code{send_message}는 `msg'에 나타날 수 있는 @code{Bcc}나 @code{Resent-Bcc} 헤더를 전송하지 않습니다. `from_addr'과 `to_addrs'의 주소 중 하나에 ASCII가 아닌 문자가 포함되어 있고 서버가 @code{SMTPUTF8} 지원을 광고하지 않으면, @ref{1dab,,SMTPNotSupportedError}가 발생합니다. 그렇지 않으면 @code{Message}는 @ref{ff8,,utf8} 어트리뷰트가 @code{True}로 설정된 자신의 @ref{53,,policy}의 복제본으로 직렬화되고, @code{SMTPUTF8} 과 @code{BODY=8BITMIME}이 `mail_options'에 추가됩니다.


Added in version 3.2.



Added in version 3.5: 국제화된 주소 (@code{SMTPUTF8}) 지원.

@end deffn

@geindex quit() (smtplib.SMTP 메서드)
@anchor{library/smtplib smtplib SMTP quit}@anchor{40a8}
@deffn {메서드} SMTP.quit ()

SMTP 세션을 종료하고 연결을 닫습니다. SMTP @code{QUIT} 명령의 결과를 반환합니다.
@end deffn

표준 SMTP/ESMTP 명령 @code{HELP}, @code{RSET}, @code{NOOP}, @code{MAIL}, @code{RCPT} 및 @code{DATA}에 해당하는 저수준 메서드도 지원됩니다. 일반적으로 이들은 직접 호출할 필요가 없어서, 여기에 설명되어 있지 않습니다. 자세한 내용은, 모듈 코드를 참조하십시오.

Additionally, an SMTP instance has the following attributes:

@geindex helo_resp (smtplib.SMTP의 속성)
@anchor{library/smtplib smtplib SMTP helo_resp}@anchor{40b7}
@deffn {속성} SMTP.helo_resp

The response to the @code{HELO} command, see @ref{40b6,,helo()}.
@end deffn

@geindex ehlo_resp (smtplib.SMTP의 속성)
@anchor{library/smtplib smtplib SMTP ehlo_resp}@anchor{40ba}
@deffn {속성} SMTP.ehlo_resp

The response to the @code{EHLO} command, see @ref{40b8,,ehlo()}.
@end deffn

@geindex does_esmtp (smtplib.SMTP의 속성)
@anchor{library/smtplib smtplib SMTP does_esmtp}@anchor{40bb}
@deffn {속성} SMTP.does_esmtp

A boolean value indicating whether the server supports ESMTP, see
@ref{40b8,,ehlo()}.
@end deffn

@geindex esmtp_features (smtplib.SMTP의 속성)
@anchor{library/smtplib smtplib SMTP esmtp_features}@anchor{40bc}
@deffn {속성} SMTP.esmtp_features

A dictionary of the names of SMTP service extensions supported by the server,
see @ref{40b8,,ehlo()}.
@end deffn

@node SMTP 예,,SMTP 객체,smtplib — SMTP 프로토콜 클라이언트
@anchor{library/smtplib id2}@anchor{40c0}@anchor{library/smtplib smtp-example}@anchor{40c1}
@subsubsection SMTP 예


이 예에서는 메시지 봉투(envelope)에 필요한 주소(‘To’와 ‘From’ 주소)와 전달할 메시지를 사용자에게 요구합니다. 메시지에 포함할 헤더는 입력한 대로 메시지에 포함됨에 유의하십시오; 이 예제는 
@geindex RFC; RFC 822
RFC 822@footnote{https://datatracker.ietf.org/doc/html/rfc822.html} 헤더를 처리하지 않습니다. 특히, ‘To’와 ‘From’ 주소는 메시지 헤더에 명시적으로 포함되어야 합니다:

@example
import smtplib

def prompt(title):
    return input(title).strip()

from_addr = prompt("From: ")
to_addrs  = prompt("To: ").split()
print("Enter message, end with ^D (Unix) or ^Z (Windows):")

# From: 과 To: 헤더를 시작에 넣습니다!
lines = [f"From: @{from_addr@}", f"To: @{', '.join(to_addrs)@}", ""]
while True:
    try:
        line = input()
    except EOFError:
        break
    else:
        lines.append(line)

msg = "\r\n".join(lines)
print("Message length is", len(msg))

server = smtplib.SMTP("localhost")
server.set_debuglevel(1)
server.sendmail(from_addr, to_addrs, msg)
server.quit()
@end example

@cartouche
@quotation 참고 
일반적으로, @ref{3f,,email} 패키지의 기능을 사용하여 전자 메일 메시지를 만들고자 할 것이고, 그런 다음 @ref{1059,,send_message()}를 통해 보낼 수 있습니다; @ref{113b,,email; 예제}를 참조하십시오.
@end quotation
@end cartouche

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node uuid — UUID objects according to RFC 9562,socketserver — 네트워크 서버를 위한 프레임워크,smtplib — SMTP 프로토콜 클라이언트,인터넷 프로토콜과 지원
@anchor{library/uuid doc}@anchor{40c2}@anchor{library/uuid module-uuid}@anchor{116}@anchor{library/uuid translation-repo}@anchor{40c3}@anchor{library/uuid uuid-uuid-objects-according-to-rfc-9562}@anchor{40c4}
@subsection @code{uuid} — UUID objects according to 
@geindex RFC; RFC 9562
`RFC 9562'


@geindex module; uuid

`소스 코드:' Lib/uuid.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/uuid.py}


__________________________________________________________________


This module provides immutable @ref{c55,,UUID} objects (the @code{UUID} class)
and @ref{40c5,,functions} for generating UUIDs corresponding
to a specific UUID version as specified in 
@geindex RFC; RFC 9562
RFC 9562@footnote{https://datatracker.ietf.org/doc/html/rfc9562.html} (which supersedes 
@geindex RFC; RFC 4122
RFC 4122@footnote{https://datatracker.ietf.org/doc/html/rfc4122.html}),
for example, @ref{da0,,uuid1()} for UUID version 1, @ref{2e5,,uuid3()} for UUID version 3, and so on.
Note that UUID version 2 is deliberately omitted as it is outside the scope of the RFC.

고유 ID만을 얻고자 한다면 @ref{da0,,uuid1()} 또는 @ref{2e7,,uuid4()}를 호출하는 것이 좋습니다. @code{uuid1()} 함수는 컴퓨터의 네트워크 주소를 포함하여 UUID를 생성하므로 개인정보가 노출될 수 있음을 명심해야 합니다. @code{uuid4()}는 무작위 UUID를 생성합니다.

기본 플랫폼의 지원 여부에 따라, @ref{da0,,uuid1()}은 “안전한” UUID를 반환하거나 그렇지 않을 수도 있습니다. 안전한 UUID는 두 프로세스가 같은 UUID를 얻지 못하게 하는 동기화 메서드에 의해 생성됩니다. @ref{c55,,UUID}의 모든 인스턴스는 UUID의 안정성에 대한 정보를 중계하는 @ref{d9e,,is_safe} 어트리뷰트가 있고, 다음의 열거체를 사용합니다.

@geindex SafeUUID (uuid 클래스)
@anchor{library/uuid uuid SafeUUID}@anchor{40c6}
@deffn {클래스} uuid.SafeUUID


Added in version 3.7.


@geindex safe (uuid.SafeUUID의 속성)
@anchor{library/uuid uuid SafeUUID safe}@anchor{40c7}
@deffn {속성} safe

플랫폼이 다중 프로세스에 안전한 방식으로 UUID를 생성합니다.
@end deffn

@geindex unsafe (uuid.SafeUUID의 속성)
@anchor{library/uuid uuid SafeUUID unsafe}@anchor{40c8}
@deffn {속성} unsafe

다중 프로세스에 안전한 방식으로 생성되지 않습니다.
@end deffn

@geindex unknown (uuid.SafeUUID의 속성)
@anchor{library/uuid uuid SafeUUID unknown}@anchor{40c9}
@deffn {속성} unknown

플랫폼이 UUID를 안전하게 생성하였는지에 대한 정보를 제공하지 않습니다.
@end deffn
@end deffn

@geindex UUID (uuid 클래스)
@anchor{library/uuid uuid UUID}@anchor{c55}
@deffn {클래스} uuid.UUID (hex=None, bytes=None, bytes_le=None, fields=None, int=None, version=None, *, is_safe=SafeUUID.unknown)

32자리 16진수 문자열, `bytes' 인자에 빅 엔디안 순서 16바이트열, `bytes_le' 인자에 리틀 엔디안 순서 16바이트열, `fields' 인자에 여섯 개의 정수로 이루어진 튜플(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'), `int' 인자에 단일 128bit 정수 중 하나를 이용하여 UUID를 만듭니다. 16진수 문자열로 주어졌을 경우 중괄호, 붙임표(hyphen), URN 접두어는 모두 선택사항입니다. 예를 들어, 아래 표현들은 모두 같은 UUID를 산출합니다:

@example
UUID('@{12345678-1234-5678-1234-567812345678@}')
UUID('12345678123456781234567812345678')
UUID('urn:uuid:12345678-1234-5678-1234-567812345678')
UUID(bytes=b'\x12\x34\x56\x78'*4)
UUID(bytes_le=b'\x78\x56\x34\x12\x34\x12\x78\x56' +
              b'\x12\x34\x56\x78\x12\x34\x56\x78')
UUID(fields=(0x12345678, 0x1234, 0x5678, 0x12, 0x34, 0x567812345678))
UUID(int=0x12345678123456781234567812345678)
@end example

Exactly one of `hex', `bytes', `bytes_le', `fields', or `int' must be given.
The `version' argument is optional; if given, the resulting UUID will have its
variant and version number set according to 
@geindex RFC; RFC 9562
RFC 9562@footnote{https://datatracker.ietf.org/doc/html/rfc9562.html}, overriding bits in the
given `hex', `bytes', `bytes_le', `fields', or `int'.

UUID 객체끼리 비교할 때 @ref{40ca,,UUID.int} 어트리뷰트를 비교하여 수행합니다. UUID가 아닌 객체와 비교하면 @ref{198,,TypeError}가 발생합니다.

@code{str(uuid)}는 @code{12345678-1234-5678-1234-567812345678}과같이 32자리 16진수 UUID로 표현합니다.
@end deffn

@ref{c55,,UUID} 객체는 다음과 같은 읽기 전용 어트리뷰트를 갖습니다.

@geindex bytes (uuid.UUID의 속성)
@anchor{library/uuid uuid UUID bytes}@anchor{40cb}
@deffn {속성} UUID.bytes

16바이트 문자열(여섯 개의 빅 엔디안 순서 정수 필드 포함)인 UUID
@end deffn

@geindex bytes_le (uuid.UUID의 속성)
@anchor{library/uuid uuid UUID bytes_le}@anchor{40cc}
@deffn {속성} UUID.bytes_le

16바이트 문자열(리틀 엔디안 순서 `time_low', `time_mid', `time_hi_version')인 UUID
@end deffn

@geindex fields (uuid.UUID의 속성)
@anchor{library/uuid uuid UUID fields}@anchor{40cd}
@deffn {속성} UUID.fields

UUID의 여섯 개의 정수 필드로 이루어진 튜플. 여섯 개의 개별 어트리뷰트와 두 개의 파생된 어트리뷰트도 사용 가능:
@end deffn


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

필드

@tab

의미

@item

@geindex time_low (uuid.UUID의 속성)
@anchor{library/uuid uuid UUID time_low}@anchor{40ce}
@deffn {속성} UUID.time_low
@end deffn

@tab

The first 32 bits of the UUID. Only relevant to version 1.

@item

@geindex time_mid (uuid.UUID의 속성)
@anchor{library/uuid uuid UUID time_mid}@anchor{40cf}
@deffn {속성} UUID.time_mid
@end deffn

@tab

The next 16 bits of the UUID. Only relevant to version 1.

@item

@geindex time_hi_version (uuid.UUID의 속성)
@anchor{library/uuid uuid UUID time_hi_version}@anchor{40d0}
@deffn {속성} UUID.time_hi_version
@end deffn

@tab

The next 16 bits of the UUID. Only relevant to version 1.

@item

@geindex clock_seq_hi_variant (uuid.UUID의 속성)
@anchor{library/uuid uuid UUID clock_seq_hi_variant}@anchor{40d1}
@deffn {속성} UUID.clock_seq_hi_variant
@end deffn

@tab

The next 8 bits of the UUID. Only relevant to versions 1 and 6.

@item

@geindex clock_seq_low (uuid.UUID의 속성)
@anchor{library/uuid uuid UUID clock_seq_low}@anchor{40d2}
@deffn {속성} UUID.clock_seq_low
@end deffn

@tab

The next 8 bits of the UUID. Only relevant to versions 1 and 6.

@item

@geindex node (uuid.UUID의 속성)
@anchor{library/uuid uuid UUID node}@anchor{40d3}
@deffn {속성} UUID.node
@end deffn

@tab

The last 48 bits of the UUID. Only relevant to version 1.

@item

@geindex time (uuid.UUID의 속성)
@anchor{library/uuid uuid UUID time}@anchor{40d4}
@deffn {속성} UUID.time
@end deffn

@tab

The 60-bit timestamp as a count of 100-nanosecond intervals since
Gregorian epoch (1582-10-15 00:00:00) for versions 1 and 6, or the
48-bit timestamp in milliseconds since Unix epoch (1970-01-01 00:00:00)
for version 7.

@item

@geindex clock_seq (uuid.UUID의 속성)
@anchor{library/uuid uuid UUID clock_seq}@anchor{40d5}
@deffn {속성} UUID.clock_seq
@end deffn

@tab

The 14-bit sequence number. Only relevant to versions 1 and 6.

@end multitable


@geindex hex (uuid.UUID의 속성)
@anchor{library/uuid uuid UUID hex}@anchor{1891}
@deffn {속성} UUID.hex

32자리 소문자 16진수 문자열 UUID.
@end deffn

@geindex int (uuid.UUID의 속성)
@anchor{library/uuid uuid UUID int}@anchor{40ca}
@deffn {속성} UUID.int

128bit 정수 UUID
@end deffn

@geindex urn (uuid.UUID의 속성)
@anchor{library/uuid uuid UUID urn}@anchor{40d6}
@deffn {속성} UUID.urn

The UUID as a URN as specified in 
@geindex RFC; RFC 9562
RFC 9562@footnote{https://datatracker.ietf.org/doc/html/rfc9562.html}.
@end deffn

@geindex variant (uuid.UUID의 속성)
@anchor{library/uuid uuid UUID variant}@anchor{40d7}
@deffn {속성} UUID.variant

UUID 변종은 UUID의 내부 레이아웃을 결정합니다. 이는 상수 @ref{40d8,,RESERVED_NCS}, @ref{40d9,,RFC_4122}, @ref{40da,,RESERVED_MICROSOFT}, 및 @ref{40db,,RESERVED_FUTURE} 중 하나입니다.
@end deffn

@geindex version (uuid.UUID의 속성)
@anchor{library/uuid uuid UUID version}@anchor{40dc}
@deffn {속성} UUID.version

The UUID version number (1 through 8, meaningful only when the variant is
@ref{40d9,,RFC_4122}).


버전 3.14에서 변경: Added UUID versions 6, 7 and 8.

@end deffn

@geindex is_safe (uuid.UUID의 속성)
@anchor{library/uuid uuid UUID is_safe}@anchor{d9e}
@deffn {속성} UUID.is_safe

플랫폼이 UUID를 다중 프로세스에 안전한 방식으로 생성했는지를 나타내는 @ref{40c6,,SafeUUID}의 열거체입니다.


Added in version 3.7.

@end deffn

The @code{uuid} module defines the following functions:

@geindex getnode() (uuid 모듈)
@anchor{library/uuid uuid getnode}@anchor{d9f}
@deffn {함수} uuid.getnode ()

하드웨어 주소를 48bit 양의 정수로 가져옵니다. 최초 실행 시 별도의 프로그램으로 실행될 수 있고, 매우 느려질 수 있습니다. 하드웨어 주소를 얻기 위한 시도가 모두 실패하면, 
@geindex RFC; RFC 4122
RFC 4122@footnote{https://datatracker.ietf.org/doc/html/rfc4122.html}가 권장하는 대로 멀티캐스트 비트(첫 옥텟의 최하위 비트)가 1로 설정된 무작위 48bit 숫자를 선택합니다. “하드웨어 주소”는 네트워크 인터페이스의 MAC 주소를 뜻합니다. 여러 네트워크 인터페이스를 가진 머신에서 보편적으로 관리하는 MAC 주소(즉, 첫 번째 옥텟의 두 번째 최하위 비트가 `unset'인 경우)는 로컬에서 관리하는 MAC 주소보다 우선하지만, 순서를 보장하지는 않습니다.


버전 3.7에서 변경: 보편적으로 관리하는 MAC 주소는 로컬로 관리하는 MAC 주소보다 우선합니다. 전자는 주소가 전 세계적으로 고유함을 보장하지만, 후자는 그렇지 않기 때문입니다.

@end deffn

@geindex uuid1() (uuid 모듈)
@anchor{library/uuid uuid-factory-functions}@anchor{40c5}@anchor{library/uuid uuid uuid1}@anchor{da0}
@deffn {함수} uuid.uuid1 (node=None, clock_seq=None)

Generate a UUID from a host ID, sequence number, and the current time
according to 
@geindex RFC; RFC 9562 Section 5.1
RFC 9562@comma{} §5.1@footnote{https://datatracker.ietf.org/doc/html/rfc9562.html#section-5.1}.

When `node' is not specified, @ref{d9f,,getnode()} is used to obtain the hardware
address as a 48-bit positive integer. When a sequence number `clock_seq' is
not specified, a pseudo-random 14-bit positive integer is generated.

If `node' or `clock_seq' exceed their expected bit count,
only their least significant bits are kept.
@end deffn

@geindex uuid3() (uuid 모듈)
@anchor{library/uuid uuid uuid3}@anchor{2e5}
@deffn {함수} uuid.uuid3 (namespace, name)

Generate a UUID based on the MD5 hash of a namespace identifier (which is a
UUID) and a name (which is a @ref{192,,bytes} object or a string
that will be encoded using UTF-8)
according to 
@geindex RFC; RFC 9562 Section 5.3
RFC 9562@comma{} §5.3@footnote{https://datatracker.ietf.org/doc/html/rfc9562.html#section-5.3}.
@end deffn

@geindex uuid4() (uuid 모듈)
@anchor{library/uuid uuid uuid4}@anchor{2e7}
@deffn {함수} uuid.uuid4 ()

Generate a random UUID in a cryptographically-secure method
according to 
@geindex RFC; RFC 9562 Section 5.4
RFC 9562@comma{} §5.4@footnote{https://datatracker.ietf.org/doc/html/rfc9562.html#section-5.4}.
@end deffn

@geindex uuid5() (uuid 모듈)
@anchor{library/uuid uuid uuid5}@anchor{2e6}
@deffn {함수} uuid.uuid5 (namespace, name)

Generate a UUID based on the SHA-1 hash of a namespace identifier (which is a
UUID) and a name (which is a @ref{192,,bytes} object or a string
that will be encoded using UTF-8)
according to 
@geindex RFC; RFC 9562 Section 5.5
RFC 9562@comma{} §5.5@footnote{https://datatracker.ietf.org/doc/html/rfc9562.html#section-5.5}.
@end deffn

@geindex uuid6() (uuid 모듈)
@anchor{library/uuid uuid uuid6}@anchor{2c2}
@deffn {함수} uuid.uuid6 (node=None, clock_seq=None)

Generate a UUID from a sequence number and the current time according to
@geindex RFC; RFC 9562 Section 5.6
RFC 9562@comma{} §5.6@footnote{https://datatracker.ietf.org/doc/html/rfc9562.html#section-5.6}.

This is an alternative to @ref{da0,,uuid1()} to improve database locality.

When `node' is not specified, @ref{d9f,,getnode()} is used to obtain the hardware
address as a 48-bit positive integer. When a sequence number `clock_seq' is
not specified, a pseudo-random 14-bit positive integer is generated.

If `node' or `clock_seq' exceed their expected bit count,
only their least significant bits are kept.


Added in version 3.14.

@end deffn

@geindex uuid7() (uuid 모듈)
@anchor{library/uuid uuid uuid7}@anchor{2c3}
@deffn {함수} uuid.uuid7 ()

Generate a time-based UUID according to
@geindex RFC; RFC 9562 Section 5.7
RFC 9562@comma{} §5.7@footnote{https://datatracker.ietf.org/doc/html/rfc9562.html#section-5.7}.

For portability across platforms lacking sub-millisecond precision, UUIDs
produced by this function embed a 48-bit timestamp and use a 42-bit counter
to guarantee monotonicity within a millisecond.


Added in version 3.14.

@end deffn

@geindex uuid8() (uuid 모듈)
@anchor{library/uuid uuid uuid8}@anchor{2c4}
@deffn {함수} uuid.uuid8 (a=None, b=None, c=None)

Generate a pseudo-random UUID according to
@geindex RFC; RFC 9562 Section 5.8
RFC 9562@comma{} §5.8@footnote{https://datatracker.ietf.org/doc/html/rfc9562.html#section-5.8}.

When specified, the parameters `a', `b' and `c' are expected to be
positive integers of 48, 12 and 62 bits respectively. If they exceed
their expected bit count, only their least significant bits are kept;
non-specified arguments are substituted for a pseudo-random integer of
appropriate size.

By default, `a', `b' and `c' are not generated by a cryptographically
secure pseudo-random number generator (CSPRNG). Use @ref{2e7,,uuid4()} when
a UUID needs to be used in a security-sensitive context.


Added in version 3.14.

@end deffn

The @code{uuid} module defines the following namespace identifiers for use with
@ref{2e5,,uuid3()} or @ref{2e6,,uuid5()}.

@geindex NAMESPACE_DNS (uuid 모듈)
@anchor{library/uuid uuid NAMESPACE_DNS}@anchor{40dd}
@deffn {데이터} uuid.NAMESPACE_DNS

이 이름 공간이 지정되면 `name' 문자열은 전체 도메인 이름(FQDN)입니다.
@end deffn

@geindex NAMESPACE_URL (uuid 모듈)
@anchor{library/uuid uuid NAMESPACE_URL}@anchor{40de}
@deffn {데이터} uuid.NAMESPACE_URL

이 이름 공간이 지정되면 `name' 문자열은 URL입니다.
@end deffn

@geindex NAMESPACE_OID (uuid 모듈)
@anchor{library/uuid uuid NAMESPACE_OID}@anchor{40df}
@deffn {데이터} uuid.NAMESPACE_OID

이 이름 공간이 지정되면 `name' 문자열은 ISO OID입니다.
@end deffn

@geindex NAMESPACE_X500 (uuid 모듈)
@anchor{library/uuid uuid NAMESPACE_X500}@anchor{40e0}
@deffn {데이터} uuid.NAMESPACE_X500

이 이름 공간이 지정되면 `name' 문자열은 DER이나 텍스트 출력 형식의 X.500 DN입니다.
@end deffn

The @code{uuid} module defines the following constants for the possible values
of the @ref{40d7,,variant} attribute:

@geindex RESERVED_NCS (uuid 모듈)
@anchor{library/uuid uuid RESERVED_NCS}@anchor{40d8}
@deffn {데이터} uuid.RESERVED_NCS

NCS 호환성을 위해 예약됨.
@end deffn

@geindex RFC_4122 (uuid 모듈)
@anchor{library/uuid uuid RFC_4122}@anchor{40d9}
@deffn {데이터} uuid.RFC_4122

Specifies the UUID layout given in 
@geindex RFC; RFC 4122
RFC 4122@footnote{https://datatracker.ietf.org/doc/html/rfc4122.html}. This constant is kept
for backward compatibility even though 
@geindex RFC; RFC 4122
RFC 4122@footnote{https://datatracker.ietf.org/doc/html/rfc4122.html} has been superseded
by 
@geindex RFC; RFC 9562
RFC 9562@footnote{https://datatracker.ietf.org/doc/html/rfc9562.html}.
@end deffn

@geindex RESERVED_MICROSOFT (uuid 모듈)
@anchor{library/uuid uuid RESERVED_MICROSOFT}@anchor{40da}
@deffn {데이터} uuid.RESERVED_MICROSOFT

마이크로소프트 호환성을 위해 예약됨.
@end deffn

@geindex RESERVED_FUTURE (uuid 모듈)
@anchor{library/uuid uuid RESERVED_FUTURE}@anchor{40db}
@deffn {데이터} uuid.RESERVED_FUTURE

추후 정의를 위해 예약됨.
@end deffn

The @code{uuid} module defines the special Nil and Max UUID values:

@geindex NIL (uuid 모듈)
@anchor{library/uuid uuid NIL}@anchor{2c5}
@deffn {데이터} uuid.NIL

A special form of UUID that is specified to have all 128 bits set to zero
according to 
@geindex RFC; RFC 9562 Section 5.9
RFC 9562@comma{} §5.9@footnote{https://datatracker.ietf.org/doc/html/rfc9562.html#section-5.9}.


Added in version 3.14.

@end deffn

@geindex MAX (uuid 모듈)
@anchor{library/uuid uuid MAX}@anchor{2c6}
@deffn {데이터} uuid.MAX

A special form of UUID that is specified to have all 128 bits set to one
according to 
@geindex RFC; RFC 9562 Section 5.10
RFC 9562@comma{} §5.10@footnote{https://datatracker.ietf.org/doc/html/rfc9562.html#section-5.10}.


Added in version 3.14.

@end deffn


@subsubheading 더 보기



@table @asis

@geindex RFC; RFC 9562

@item RFC 9562@footnote{https://datatracker.ietf.org/doc/html/rfc9562.html} - A Universally Unique IDentifier (UUID) URN Namespace

이 명세는 UUID를 위한 통합 자원 식별자 이름 공간, UUID의 내부 형식 및 UUID 생성 방법을 정의합니다.
@end table


@menu
* 명령줄 사용법:: 
* 예제: 예제<24>. 
* 명령줄 예제:: 

@end menu

@node 명령줄 사용법,예제<24>,,uuid — UUID objects according to RFC 9562
@anchor{library/uuid command-line-usage}@anchor{40e1}@anchor{library/uuid uuid-cli}@anchor{674}
@subsubsection 명령줄 사용법



Added in version 3.12.


The @code{uuid} module can be executed as a script from the command line.

@example
python -m uuid [-h] [-u @{uuid1,uuid3,uuid4,uuid5,uuid6,uuid7,uuid8@}] [-n NAMESPACE] [-N NAME]
@end example

The following options are accepted:

@geindex uuid 명령줄 옵션; -h
@geindex uuid 명령줄 옵션; --help
@anchor{library/uuid cmdoption-uuid-h}@anchor{40e2}@anchor{library/uuid cmdoption-uuid-help}@anchor{40e3}
@deffn {Option} @w{-}h, @w{-}@w{-}help

Show the help message and exit.
@end deffn

@geindex uuid 명령줄 옵션; -u
@geindex uuid 명령줄 옵션; --uuid
@anchor{library/uuid cmdoption-uuid-u}@anchor{40e4}
@deffn {Option} @w{-}u <uuid>
@anchor{library/uuid cmdoption-uuid-uuid}@anchor{40e5}
@deffnx {Option} @w{-}@w{-}uuid <uuid>

Specify the function name to use to generate the uuid. By default @ref{2e7,,uuid4()}
is used.


버전 3.14에서 변경: Allow generating UUID versions 6, 7 and 8.

@end deffn

@geindex uuid 명령줄 옵션; -n
@geindex uuid 명령줄 옵션; --namespace
@anchor{library/uuid cmdoption-uuid-n}@anchor{40e6}
@deffn {Option} @w{-}n <namespace>
@anchor{library/uuid cmdoption-uuid-namespace}@anchor{40e7}
@deffnx {Option} @w{-}@w{-}namespace <namespace>

The namespace is a @code{UUID}, or @code{@@ns} where @code{ns} is a well-known predefined UUID
addressed by namespace name. Such as @code{@@dns}, @code{@@url}, @code{@@oid}, and @code{@@x500}.
Only required for @ref{2e5,,uuid3()} / @ref{2e6,,uuid5()} functions.
@end deffn

@geindex uuid 명령줄 옵션; -N
@geindex uuid 명령줄 옵션; --name
@anchor{library/uuid cmdoption-uuid-N}@anchor{40e8}
@deffn {Option} @w{-}N <name>
@anchor{library/uuid cmdoption-uuid-name}@anchor{40e9}
@deffnx {Option} @w{-}@w{-}name <name>

The name used as part of generating the uuid. Only required for
@ref{2e5,,uuid3()} / @ref{2e6,,uuid5()} functions.
@end deffn

@geindex uuid 명령줄 옵션; -C
@geindex uuid 명령줄 옵션; --count
@anchor{library/uuid cmdoption-uuid-C}@anchor{40ea}
@deffn {Option} @w{-}C <num>
@anchor{library/uuid cmdoption-uuid-count}@anchor{2c7}
@deffnx {Option} @w{-}@w{-}count <num>

Generate `num' fresh UUIDs.


Added in version 3.14.

@end deffn

@node 예제<24>,명령줄 예제,명령줄 사용법,uuid — UUID objects according to RFC 9562
@anchor{library/uuid example}@anchor{40eb}@anchor{library/uuid uuid-example}@anchor{40ec}
@subsubsection 예제


Here are some examples of typical usage of the @code{uuid} module:

@example
>>> import uuid

>>> # make a UUID based on the host ID and current time
>>> uuid.uuid1()
UUID('a8098c1a-f86e-11da-bd1a-00112444be1e')

>>> # make a UUID using an MD5 hash of a namespace UUID and a name
>>> uuid.uuid3(uuid.NAMESPACE_DNS, 'python.org')
UUID('6fa459ea-ee8a-3ca4-894e-db77e160355e')

>>> # make a random UUID
>>> uuid.uuid4()
UUID('16fd2706-8baf-433b-82eb-8c7fada847da')

>>> # make a UUID using a SHA-1 hash of a namespace UUID and a name
>>> uuid.uuid5(uuid.NAMESPACE_DNS, 'python.org')
UUID('886313e1-3b8a-5372-9b90-0c9aee199e5d')

>>> # make a UUID from a string of hex digits (braces and hyphens ignored)
>>> x = uuid.UUID('@{00010203-0405-0607-0809-0a0b0c0d0e0f@}')

>>> # convert a UUID to a string of hex digits in standard form
>>> str(x)
'00010203-0405-0607-0809-0a0b0c0d0e0f'

>>> # get the raw 16 bytes of the UUID
>>> x.bytes
b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f'

>>> # make a UUID from a 16-byte string
>>> uuid.UUID(bytes=x.bytes)
UUID('00010203-0405-0607-0809-0a0b0c0d0e0f')

>>> # get the Nil UUID
>>> uuid.NIL
UUID('00000000-0000-0000-0000-000000000000')

>>> # get the Max UUID
>>> uuid.MAX
UUID('ffffffff-ffff-ffff-ffff-ffffffffffff')

>>> # same as UUIDv1 but with fields reordered to improve DB locality
>>> uuid.uuid6()
UUID('1f0799c0-98b9-62db-92c6-a0d365b91053')

>>> # get UUIDv7 creation (local) time as a timestamp in milliseconds
>>> u = uuid.uuid7()
>>> u.time
1743936859822

>>> # get UUIDv7 creation (local) time as a datetime object
>>> import datetime as dt
>>> dt.datetime.fromtimestamp(u.time / 1000)
datetime.datetime(...)

>>> # make a UUID with custom blocks
>>> uuid.uuid8(0x12345678, 0x9abcdef0, 0x11223344)
UUID('00001234-5678-8ef0-8000-000011223344')
@end example

@node 명령줄 예제,,예제<24>,uuid — UUID objects according to RFC 9562
@anchor{library/uuid command-line-example}@anchor{40ed}@anchor{library/uuid uuid-cli-example}@anchor{40ee}
@subsubsection 명령줄 예제


Here are some examples of typical usage of the @code{uuid} command-line interface:

@example
# generate a random UUID - by default uuid4() is used
$ python -m uuid

# generate a UUID using uuid1()
$ python -m uuid -u uuid1

# generate a UUID using uuid5
$ python -m uuid -u uuid5 -n @@url -N example.com

# generate 42 random UUIDs
$ python -m uuid -C 42
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node socketserver — 네트워크 서버를 위한 프레임워크,http server — HTTP 서버,uuid — UUID objects according to RFC 9562,인터넷 프로토콜과 지원
@anchor{library/socketserver doc}@anchor{40ef}@anchor{library/socketserver module-socketserver}@anchor{d2}@anchor{library/socketserver socketserver-a-framework-for-network-servers}@anchor{40f0}@anchor{library/socketserver translation-repo}@anchor{40f1}
@subsection @code{socketserver} — 네트워크 서버를 위한 프레임워크


@geindex module; socketserver

`소스 코드:' Lib/socketserver.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/socketserver.py}


__________________________________________________________________


The @code{socketserver} module simplifies the task of writing network servers.

@c include for modules that don't work on WASM

@ref{213c,,가용성}: not WASI.

이 모듈은 웹어셈블리에서 작동하지 않거나 제공되지 않습니다. 자세한 내용은 @ref{1b68,,웹어셈블리 플랫폼}을 참조하세요.

다음과 같은 네 가지 기본 구상 서버 클래스가 있습니다:

@geindex TCPServer (socketserver 클래스)
@anchor{library/socketserver socketserver TCPServer}@anchor{1524}
@deffn {클래스} socketserver.TCPServer (server_address, RequestHandlerClass, bind_and_activate=True)

클라이언트와 서버 간에 연속적인 데이터 스트림을 제공하는 인터넷 TCP 프로토콜을 사용합니다. `bind_and_activate'가 참이면, 생성자는 자동으로 @ref{40f2,,server_bind()}와 @ref{40f3,,server_activate()}를 호출하려고 시도합니다. 다른 매개 변수는 @ref{1342,,BaseServer} 베이스 클래스로 전달됩니다.
@end deffn

@geindex UDPServer (socketserver 클래스)
@anchor{library/socketserver socketserver UDPServer}@anchor{40f4}
@deffn {클래스} socketserver.UDPServer (server_address, RequestHandlerClass, bind_and_activate=True)

순서가 잘못되거나 전송 중 손실될 수 있는 이산적 정보 패킷인 데이터 그램을 사용합니다. 매개 변수는 @ref{1524,,TCPServer}와 같습니다.
@end deffn

@geindex UnixStreamServer (socketserver 클래스)
@geindex UnixDatagramServer (socketserver 클래스)
@anchor{library/socketserver socketserver UnixStreamServer}@anchor{40f5}
@deffn {클래스} socketserver.UnixStreamServer (server_address, RequestHandlerClass, bind_and_activate=True)
@anchor{library/socketserver socketserver UnixDatagramServer}@anchor{40f6}
@deffnx {클래스} socketserver.UnixDatagramServer (server_address, RequestHandlerClass, bind_and_activate=True)

TCP와 UDP 클래스와 비슷하지만, 유닉스 도메인 소켓을 사용하는 자주 사용되지 않는 클래스입니다; 유닉스 이외의 플랫폼에서는 사용할 수 없습니다. 매개 변수는 @ref{1524,,TCPServer}와 같습니다.
@end deffn

이 네 가지 클래스는 `동기적으로 (synchronously)' 요청을 처리합니다; 다음 요청을 시작하기 전에 각 요청을 완료해야 합니다. 계산이 많이 필요하거나 클라이언트가 처리하는 속도가 느리도록 데이터를 많이 반환하기 때문에 각 요청을 완료하는 데 시간이 오래 걸리면 적합하지 않습니다. 해결책은 각 요청을 처리하기 위해 별도의 프로세스나 스레드를 만드는 것입니다; @ref{d70,,ForkingMixIn}과 @ref{d39,,ThreadingMixIn} 믹스인 클래스를 사용하여 비동기 동작을 지원할 수 있습니다.

서버를 만들려면 몇 가지 단계가 필요합니다. 먼저, @ref{40f7,,BaseRequestHandler} 클래스를 서브 클래싱하고 @ref{40f8,,handle()} 메서드를 재정의하여 요청 처리기 클래스를 만들어야 합니다; 이 메서드는 들어오는 요청을 처리합니다. 둘째, 서버 주소와 요청 처리기 클래스를 전달하여 서버 클래스 중 하나를 인스턴스 화해야 합니다. @ref{186,,with} 문에서 서버를 사용하는 것이 좋습니다. 그런 다음 서버 객체의 @ref{1527,,handle_request()}나 @ref{1344,,serve_forever()} 메서드를 호출하여 하나 이상의 요청을 처리합니다. 마지막으로, (@code{with} 문을 사용하지 않았다면) @ref{d6e,,server_close()}를 호출하여 소켓을 닫습니다.

스레드 연결 동작을 위해 @ref{d39,,ThreadingMixIn}에서 상속할 때, 갑작스러운 종료 시 스레드 작동 방식을 명시적으로 선언해야 합니다. @code{ThreadingMixIn} 클래스는 서버가 스레드 종료를 기다려야 하는지를 가리키는 `daemon_threads' 어트리뷰트를 정의합니다. 스레드가 자율적으로 동작하게 하려면 플래그를 명시적으로 설정해야 합니다; 기본값은 @ref{d2a,,False}인데, @code{ThreadingMixIn}으로 만들어진 모든 스레드가 종료될 때까지 파이썬이 종료되지 않음을 뜻합니다.

서버 클래스는 사용하는 네트워크 프로토콜과 관계없이 같은 외부 메서드와 어트리뷰트를 갖습니다.

@menu
* 서버 생성 노트:: 
* 서버 객체:: 
* 요청 처리기 객체:: 
* 예: 예<13>. 

@end menu

@node 서버 생성 노트,서버 객체,,socketserver — 네트워크 서버를 위한 프레임워크
@anchor{library/socketserver server-creation-notes}@anchor{40f9}
@subsubsection 서버 생성 노트


상속 다이어그램에는 5개의 클래스가 있으며, 그중 4개는 4가지 유형의 동기 서버를 나타냅니다:

@example
+------------+
| BaseServer |
+------------+
      |
      v
+-----------+        +------------------+
| TCPServer |------->| UnixStreamServer |
+-----------+        +------------------+
      |
      v
+-----------+        +--------------------+
| UDPServer |------->| UnixDatagramServer |
+-----------+        +--------------------+
@end example

@ref{40f6,,UnixDatagramServer}는 @ref{40f5,,UnixStreamServer}가 아니라 @ref{40f4,,UDPServer}에서 파생됨에 유의하십시오 — IP와 유닉스 서버의 유일한 차이점은 주소 패밀리입니다.

@geindex ForkingMixIn (socketserver 클래스)
@geindex ThreadingMixIn (socketserver 클래스)
@anchor{library/socketserver socketserver ForkingMixIn}@anchor{d70}
@deffn {클래스} socketserver.ForkingMixIn
@anchor{library/socketserver socketserver ThreadingMixIn}@anchor{d39}
@deffnx {클래스} socketserver.ThreadingMixIn

이러한 믹스인 클래스를 사용하여 각 서버 유형의 포킹(forking)과 스레딩(threading) 버전을 만들 수 있습니다. 예를 들어, @ref{40fa,,ThreadingUDPServer}는 다음과 같이 만듭니다:

@example
class ThreadingUDPServer(ThreadingMixIn, UDPServer):
    pass
@end example

@ref{40f4,,UDPServer}에 정의된 메서드를 재정의하므로, 믹스인 클래스가 먼저 옵니다. 다양한 어트리뷰트를 설정하면 하부 서버 메커니즘의 동작도 변경됩니다.

아래 언급된 @ref{d70,,ForkingMixIn}과 Forking 클래스들은 @ref{4b6,,fork()}를 지원하는 POSIX 플랫폼에서만 사용할 수 있습니다.

@geindex block_on_close (socketserver.ThreadingMixIn의 속성)
@anchor{library/socketserver socketserver ThreadingMixIn block_on_close}@anchor{d6f}
@deffn {속성} block_on_close

@ref{d6e,,ForkingMixIn.server_close}는 @ref{d6f,,block_on_close} 어트리뷰트가 @code{False}인 경우를 제외하고 모든 자식 프로세스가 완료될 때까지 대기합니다.

@ref{d6e,,ThreadingMixIn.server_close}는 @ref{d6f,,block_on_close} 어트리뷰트가 @code{False}인 경우를 제외하고 모든 비 데몬 스레드가 완료될 때까지 대기합니다.
@end deffn

@geindex max_children (socketserver.ThreadingMixIn의 속성)
@anchor{library/socketserver socketserver ThreadingMixIn max_children}@anchor{40fb}
@deffn {속성} max_children

Specify how many child processes will exist to handle requests at a time
for @ref{d70,,ForkingMixIn}.  If the limit is reached,
new requests will wait until one child process has finished.
@end deffn

@geindex daemon_threads (socketserver.ThreadingMixIn의 속성)
@anchor{library/socketserver socketserver ThreadingMixIn daemon_threads}@anchor{40fc}
@deffn {속성} daemon_threads

For @ref{d39,,ThreadingMixIn} use daemonic threads by setting
@ref{40fc,,ThreadingMixIn.daemon_threads}
to @code{True} to not wait until threads complete.
@end deffn


버전 3.7에서 변경: @ref{d6e,,ForkingMixIn.server_close}와 @code{ThreadingMixIn.server_close}는 이제 모든 자식 프로세스와 비 데몬 스레드가 완료될 때까지 대기합니다. 3.7 이전의 동작을 옵트인 하기 위해 새 @ref{d6f,,ForkingMixIn.block_on_close} 클래스 어트리뷰트를 추가합니다.

@end deffn

@geindex ForkingTCPServer (socketserver 클래스)
@geindex ForkingUDPServer (socketserver 클래스)
@geindex ThreadingTCPServer (socketserver 클래스)
@geindex ThreadingUDPServer (socketserver 클래스)
@geindex ForkingUnixStreamServer (socketserver 클래스)
@geindex ForkingUnixDatagramServer (socketserver 클래스)
@geindex ThreadingUnixStreamServer (socketserver 클래스)
@geindex ThreadingUnixDatagramServer (socketserver 클래스)
@anchor{library/socketserver socketserver ForkingTCPServer}@anchor{40fd}
@deffn {클래스} socketserver.ForkingTCPServer
@anchor{library/socketserver socketserver ForkingUDPServer}@anchor{40fe}
@deffnx {클래스} socketserver.ForkingUDPServer
@anchor{library/socketserver socketserver ThreadingTCPServer}@anchor{40ff}
@deffnx {클래스} socketserver.ThreadingTCPServer
@anchor{library/socketserver socketserver ThreadingUDPServer}@anchor{40fa}
@deffnx {클래스} socketserver.ThreadingUDPServer
@anchor{library/socketserver socketserver ForkingUnixStreamServer}@anchor{4100}
@deffnx {클래스} socketserver.ForkingUnixStreamServer
@anchor{library/socketserver socketserver ForkingUnixDatagramServer}@anchor{4101}
@deffnx {클래스} socketserver.ForkingUnixDatagramServer
@anchor{library/socketserver socketserver ThreadingUnixStreamServer}@anchor{4102}
@deffnx {클래스} socketserver.ThreadingUnixStreamServer
@anchor{library/socketserver socketserver ThreadingUnixDatagramServer}@anchor{4103}
@deffnx {클래스} socketserver.ThreadingUnixDatagramServer

이 클래스들이 믹스인 클래스를 사용하여 미리 정의됩니다.
@end deffn


Added in version 3.12: The @code{ForkingUnixStreamServer} and @code{ForkingUnixDatagramServer} classes
were added.


서비스를 구현하려면, @ref{40f7,,BaseRequestHandler}에서 클래스를 파생시키고 @ref{40f8,,handle()} 메서드를 재정의해야 합니다. 그런 다음 서버 클래스 중 하나와 여러분의 요청 처리기 클래스를 결합하여 다양한 버전의 서비스를 실행할 수 있습니다. 요청 처리기 클래스는 데이터 그램과 스트림 서비스에서 달라야 합니다. 처리기 서브 클래스 @ref{ed5,,StreamRequestHandler} 나 @ref{4104,,DatagramRequestHandler}를 사용하여 이 차이를 숨길 수 있습니다.

물론, 여전히 머리를 사용해야 합니다! 예를 들어, 서비스가 다른 요청으로 수정될 수 있는 메모리상의 상태를 포함할 때 포킹 서버를 사용하는 것은 의미가 없습니다. 자식 프로세스에의 수정은 부모 프로세스에 유지된 초기 상태에 도달하여 각 자식에 전달되지 못하기 때문입니다. 이 경우, 스레딩 서버를 사용할 수 있지만, 아마도 공유 데이터의 무결성을 보호하기 위해 록을 사용해야 합니다.

반면, 모든 데이터가 외부(예를 들어, 파일 시스템)에 저장되는 HTTP 서버를 구축한다면, 동기 클래스는 하나의 요청이 처리되는 동안 실질적으로 서비스가 “듣지 못하게” 만듭니다 – 클라이언트가 요청한 모든 데이터를 받는 속도가 느리다면 매우 오랜 시간이 걸릴 수 있습니다. 이럴 때는 스레딩이나 포킹 서버가 적합합니다.

때에 따라, 요청의 일부를 동기적으로 처리하는 것이 좋지만, 요청 데이터에 따라 포크 된 자식에서 처리를 완료하는 것이 적절할 수 있습니다. 이는 동기 서버를 사용하고 요청 처리기 클래스 @ref{40f8,,handle()} 메서드에서 명시적 포크를 수행하여 구현할 수 있습니다.

스레드도 @ref{4b6,,fork()}도 지원하지 않는 (또는 이것들이 서비스에 너무 비싸거나 부적절한) 환경에서 여러 동시 요청을 처리하는 또 다른 방법은 부분적으로 완료된 요청의 명시적인 테이블을 유지하고 @ref{c7,,selectors}를 사용하여 다음에 작업할 요청을 (또는 새로 들어온 요청을 처리할지를) 결정하는 것입니다. 이는 (스레드나 서브 프로세스를 사용할 수 없다면) 각 클라이언트가 오랫동안 연결될 수 있는 스트림 서비스에 특히 중요합니다.

@c XXX should data and methods be intermingled, or separate?
@c how should the distinction between class and instance variables be drawn?

@node 서버 객체,요청 처리기 객체,서버 생성 노트,socketserver — 네트워크 서버를 위한 프레임워크
@anchor{library/socketserver server-objects}@anchor{4105}
@subsubsection 서버 객체


@geindex BaseServer (socketserver 클래스)
@anchor{library/socketserver socketserver BaseServer}@anchor{1342}
@deffn {클래스} socketserver.BaseServer (server_address, RequestHandlerClass)

이것은 모듈에 있는 모든 서버 객체의 슈퍼 클래스입니다. 아래에 주어진 인터페이스를 정의하지만, 대부분의 메서드를 구현하지 않고, 서브 클래스에서 구현됩니다. 두 개의 매개 변수는 각각 @ref{4106,,server_address}와 @ref{4107,,RequestHandlerClass} 어트리뷰트에 저장됩니다.

@geindex fileno() (socketserver.BaseServer 메서드)
@anchor{library/socketserver socketserver BaseServer fileno}@anchor{4108}
@deffn {메서드} fileno ()

서버가 리스닝 중인 소켓의 정수 파일 디스크립터를 반환합니다. 이 함수는 가장 일반적으로 같은 프로세스에서 여러 서버를 모니터링할 수 있도록 @ref{c7,,selectors}에 전달됩니다.
@end deffn

@geindex handle_request() (socketserver.BaseServer 메서드)
@anchor{library/socketserver socketserver BaseServer handle_request}@anchor{1527}
@deffn {메서드} handle_request ()

단일 요청을 처리합니다. 이 함수는 다음 메서드들을 차례로 호출합니다: @ref{4109,,get_request()}, @ref{410a,,verify_request()} 및 @ref{410b,,process_request()}. 처리기 클래스의 사용자 제공 @ref{40f8,,handle()} 메서드에서 예외가 발생하면, 서버의 @ref{f3c,,handle_error()} 메서드가 호출됩니다. @ref{1525,,timeout} 초 내에 요청이 수신되지 않으면, @ref{1526,,handle_timeout()}이 호출되고 @ref{1527,,handle_request()}는 반환합니다.
@end deffn

@geindex serve_forever() (socketserver.BaseServer 메서드)
@anchor{library/socketserver socketserver BaseServer serve_forever}@anchor{1344}
@deffn {메서드} serve_forever (poll_interval=0.5)

명시적인 @ref{1e12,,shutdown()} 요청이 있을 때까지 요청을 처리합니다. `poll_interval' 초마다 shutdown을 확인합니다. @ref{1525,,timeout} 어트리뷰트를 무시합니다. 또한 @ref{1343,,service_actions()}를 호출하는데, 서브 클래스나 믹스인이 주어진 서비스에 특정한 동작을 제공하기 위해 사용할 수 있습니다. 예를 들어, @ref{d70,,ForkingMixIn} 클래스는 @code{service_actions()}를 사용하여 좀비 자식 프로세스를 정리합니다.


버전 3.3에서 변경: @code{serve_forever} 메서드에 @code{service_actions} 호출을 추가했습니다.

@end deffn

@geindex service_actions() (socketserver.BaseServer 메서드)
@anchor{library/socketserver socketserver BaseServer service_actions}@anchor{1343}
@deffn {메서드} service_actions ()

@ref{1344,,serve_forever()} 루프에서 호출됩니다. 이 메서드는 서브 클래스나 믹스인 클래스에서 재정의되어 정리 조치와 같은 지정된 서비스에 특정한 조치를 수행할 수 있습니다.


Added in version 3.3.

@end deffn

@geindex shutdown() (socketserver.BaseServer 메서드)
@anchor{library/socketserver socketserver BaseServer shutdown}@anchor{1e12}
@deffn {메서드} shutdown ()

@ref{1344,,serve_forever()} 루프가 정지하도록 하고 정지할 때까지 기다립니다. @code{serve_forever()}가 다른 스레드에서 실행되는 동안 @ref{1e12,,shutdown()}을 호출해야 합니다. 그렇지 않으면 교착 상태가 됩니다.
@end deffn

@geindex server_close() (socketserver.BaseServer 메서드)
@anchor{library/socketserver socketserver BaseServer server_close}@anchor{d6e}
@deffn {메서드} server_close ()

서버를 정리합니다. 재정의될 수 있습니다.
@end deffn

@geindex address_family (socketserver.BaseServer의 속성)
@anchor{library/socketserver socketserver BaseServer address_family}@anchor{410c}
@deffn {속성} address_family

서버 소켓이 속한 프로토콜 패밀리. 일반적인 예는 @ref{1bab,,socket.AF_INET}, @ref{1bac,,socket.AF_INET6} 및 @ref{1bae,,socket.AF_UNIX}입니다. IPv6 서버 클래스를 원하면 클래스 어트리뷰트 @code{address_family = AF_INET6}을 설정하여 이 모듈의 TCP 나 UDP 서버 클래스의 서브클래스를 만드세요.
@end deffn

@geindex RequestHandlerClass (socketserver.BaseServer의 속성)
@anchor{library/socketserver socketserver BaseServer RequestHandlerClass}@anchor{4107}
@deffn {속성} RequestHandlerClass

사용자 제공 요청 처리기 클래스; 요청마다 이 클래스의 인스턴스가 만들어집니다.
@end deffn

@geindex server_address (socketserver.BaseServer의 속성)
@anchor{library/socketserver socketserver BaseServer server_address}@anchor{4106}
@deffn {속성} server_address

서버가 리스닝 중인 주소. 주소 형식은 프로토콜 패밀리에 따라 다릅니다; 자세한 내용은 @ref{d1,,socket} 모듈 설명서를 참조하십시오. 인터넷 프로토콜의 경우, 주소를 제공하는 문자열과 정수 포트 번호를 포함하는 튜플입니다: @code{('127.0.0.1', 80)}, 예를 들어.
@end deffn

@geindex socket (socketserver.BaseServer의 속성)
@anchor{library/socketserver socketserver BaseServer socket}@anchor{410d}
@deffn {속성} socket

서버가 들어오는 요청을 리스닝 할 소켓 객체.
@end deffn

서버 클래스는 다음 클래스 변수를 지원합니다:

@c XXX should class variables be covered before instance variables, or vice versa?

@geindex allow_reuse_address (socketserver.BaseServer의 속성)
@anchor{library/socketserver socketserver BaseServer allow_reuse_address}@anchor{410e}
@deffn {속성} allow_reuse_address

서버가 주소를 재사용하도록 허락하는지 여부. 기본값은 @ref{d2a,,False}이며, 정책을 변경하기 위해 서브 클래스에서 설정할 수 있습니다.
@end deffn

@geindex request_queue_size (socketserver.BaseServer의 속성)
@anchor{library/socketserver socketserver BaseServer request_queue_size}@anchor{410f}
@deffn {속성} request_queue_size

요청 큐의 크기. 단일 요청을 처리하는 데 시간이 오래 걸리면, 서버가 바쁠 때 도착한 요청은 최대 @ref{410f,,request_queue_size} 요청까지 큐에 배치됩니다. 큐가 가득 차면, 클라이언트의 추가 요청은 “연결 거부(Connection denied)” 에러를 받게 됩니다. 기본값은 일반적으로 5이지만, 서브 클래스가 재정의할 수 있습니다.
@end deffn

@geindex socket_type (socketserver.BaseServer의 속성)
@anchor{library/socketserver socketserver BaseServer socket_type}@anchor{4110}
@deffn {속성} socket_type

서버가 사용하는 소켓의 유형. @ref{14f8,,socket.SOCK_STREAM}과 @ref{14f7,,socket.SOCK_DGRAM}은 두 가지 흔한 값입니다.
@end deffn

@geindex timeout (socketserver.BaseServer의 속성)
@anchor{library/socketserver socketserver BaseServer timeout}@anchor{1525}
@deffn {속성} timeout

초 단위의 시간제한 기간, 또는 시간제한이 필요하지 않으면 @ref{884,,None}. @ref{1527,,handle_request()}가 timeout 기간 내에 들어오는 요청을 받지 못하면, @ref{1526,,handle_timeout()} 메서드가 호출됩니다.
@end deffn

@ref{1524,,TCPServer}와 같은 베이스 서버 클래스의 서브 클래스가 재정의할 수 있는 다양한 서버 메서드가 있습니다; 이러한 메서드는 서버 객체의 외부 사용자에게는 유용하지 않습니다.

@c XXX should the default implementations of these be documented, or should
@c it be assumed that the user will look at socketserver.py?

@geindex finish_request() (socketserver.BaseServer 메서드)
@anchor{library/socketserver socketserver BaseServer finish_request}@anchor{4111}
@deffn {메서드} finish_request (request, client_address)

@ref{4107,,RequestHandlerClass}를 인스턴스화하고 @ref{40f8,,handle()} 메서드를 호출하여 실제로 요청을 처리합니다.
@end deffn

@geindex get_request() (socketserver.BaseServer 메서드)
@anchor{library/socketserver socketserver BaseServer get_request}@anchor{4109}
@deffn {메서드} get_request ()

소켓으로부터의 요청을 받아들이고, 클라이언트와 통신하는 데 사용될 `새' 소켓 객체와 클라이언트 주소를 포함하는 2-튜플을 반환해야 합니다.
@end deffn

@geindex handle_error() (socketserver.BaseServer 메서드)
@anchor{library/socketserver socketserver BaseServer handle_error}@anchor{f3c}
@deffn {메서드} handle_error (request, client_address)

@ref{4107,,RequestHandlerClass} 인스턴스의 @ref{40f8,,handle()} 메서드에서 예외가 발생하면 이 함수가 호출됩니다. 기본 액션은 표준 에러로 트레이스백을 인쇄하고 추가 요청을 계속 처리하는 것입니다.


버전 3.6에서 변경: 이제 @ref{bcc,,Exception} 클래스에서 파생된 예외에 대해서만 호출됩니다.

@end deffn

@geindex handle_timeout() (socketserver.BaseServer 메서드)
@anchor{library/socketserver socketserver BaseServer handle_timeout}@anchor{1526}
@deffn {메서드} handle_timeout ()

이 함수는 @ref{1525,,timeout} 어트리뷰트가 @ref{884,,None} 이외의 값으로 설정되고 요청이 수신되지 않은 채로 시간제한 기간이 지나면 호출됩니다. 포킹 서버에서의 기본 액션은 종료한 모든 자식 프로세스의 상태를 수집하는 것이고, 반면에 스레딩 서버에서는 이 메서드가 아무 작업도 수행하지 않습니다.
@end deffn

@geindex process_request() (socketserver.BaseServer 메서드)
@anchor{library/socketserver socketserver BaseServer process_request}@anchor{410b}
@deffn {메서드} process_request (request, client_address)

@ref{4111,,finish_request()}를 호출하여 @ref{4107,,RequestHandlerClass} 의 인스턴스를 만듭니다. 원한다면, 이 함수는 요청을 처리하기 위해 새 프로세스나 스레드를 만들 수 있습니다; @ref{d70,,ForkingMixIn}과 @ref{d39,,ThreadingMixIn} 클래스가 그렇게 합니다.
@end deffn

@c Is there any point in documenting the following two functions?
@c What would the purpose of overriding them be: initializing server
@c instance variables, adding new network families?

@geindex server_activate() (socketserver.BaseServer 메서드)
@anchor{library/socketserver socketserver BaseServer server_activate}@anchor{40f3}
@deffn {메서드} server_activate ()

서버를 활성화하기 위해 서버의 생성자가 호출합니다. TCP 서버의 기본 동작은 단지 서버의 소켓에 대해 @ref{105d,,listen()}을 호출합니다. 재정의될 수 있습니다.
@end deffn

@geindex server_bind() (socketserver.BaseServer 메서드)
@anchor{library/socketserver socketserver BaseServer server_bind}@anchor{40f2}
@deffn {메서드} server_bind ()

소켓을 원하는 주소에 바인딩하기 위해 서버의 생성자가 호출합니다. 재정의될 수 있습니다.
@end deffn

@geindex verify_request() (socketserver.BaseServer 메서드)
@anchor{library/socketserver socketserver BaseServer verify_request}@anchor{410a}
@deffn {메서드} verify_request (request, client_address)

불리언 값을 반환해야 합니다; 값이 @ref{e06,,True}이면, 요청이 처리되고, @ref{d2a,,False}이면, 요청이 거부됩니다. 서버에 대한 액세스 제어를 구현하기 위해 이 함수를 재정의할 수 있습니다. 기본 구현은 항상 @code{True}를 반환합니다.
@end deffn


버전 3.6에서 변경: @ref{1e1,,컨텍스트 관리자} 프로토콜에 대한 지원이 추가되었습니다. 컨텍스트 관리자를 벗어나는 것은 @ref{d6e,,server_close()}를 호출하는 것과 동등합니다.

@end deffn

@node 요청 처리기 객체,예<13>,서버 객체,socketserver — 네트워크 서버를 위한 프레임워크
@anchor{library/socketserver request-handler-objects}@anchor{4112}
@subsubsection 요청 처리기 객체


@geindex BaseRequestHandler (socketserver 클래스)
@anchor{library/socketserver socketserver BaseRequestHandler}@anchor{40f7}
@deffn {클래스} socketserver.BaseRequestHandler

이것은 모든 요청 처리기 객체의 슈퍼 클래스입니다. 아래에 주어진 인터페이스를 정의합니다. 구상 요청 처리기 서브 클래스는 새 @ref{40f8,,handle()} 메서드를 정의해야 하며, 다른 메서드를 재정의할 수 있습니다. 각 요청에 대해 서브 클래스의 새 인스턴스가 만들어집니다.

@geindex setup() (socketserver.BaseRequestHandler 메서드)
@anchor{library/socketserver socketserver BaseRequestHandler setup}@anchor{4113}
@deffn {메서드} setup ()

필요한 초기화 액션을 수행하기 위해 @ref{40f8,,handle()} 메서드 전에 호출됩니다. 기본 구현은 아무것도 수행하지 않습니다.
@end deffn

@geindex handle() (socketserver.BaseRequestHandler 메서드)
@anchor{library/socketserver socketserver BaseRequestHandler handle}@anchor{40f8}
@deffn {메서드} handle ()

이 함수는 요청을 서비스하는 데 필요한 모든 작업을 수행해야 합니다. 기본 구현은 아무것도 수행하지 않습니다. 몇 가지 인스턴스 어트리뷰트를 사용할 수 있습니다; 요청은 @ref{4114,,request}로 제공됩니다; 클라이언트 주소는 @ref{4115,,client_address}로 제공됩니다; 서버별 정보에 액세스해야 하는 경우를 위해 서버 인스턴스는 @ref{4116,,server}로 제공됩니다.

@ref{4114,,request}의 형은 데이터 그램과 스트림 서비스에서 다릅니다. 스트림 서비스의 경우, @code{request}는 소켓 객체입니다; 데이터 그램 서비스의 경우, @code{request}는 문자열과 소켓 쌍입니다.
@end deffn

@geindex finish() (socketserver.BaseRequestHandler 메서드)
@anchor{library/socketserver socketserver BaseRequestHandler finish}@anchor{4117}
@deffn {메서드} finish ()

필요한 정리 액션을 수행하기 위해 @ref{40f8,,handle()} 메서드 이후에 호출됩니다. 기본 구현은 아무것도 수행하지 않습니다. @ref{4113,,setup()}에서 예외가 발생하면, 이 함수가 호출되지 않습니다.
@end deffn

@geindex request (socketserver.BaseRequestHandler의 속성)
@anchor{library/socketserver socketserver BaseRequestHandler request}@anchor{4114}
@deffn {속성} request

The `new' @ref{fa0,,socket.socket} object
to be used to communicate with the client.
@end deffn

@geindex client_address (socketserver.BaseRequestHandler의 속성)
@anchor{library/socketserver socketserver BaseRequestHandler client_address}@anchor{4115}
@deffn {속성} client_address

Client address returned by @ref{4109,,BaseServer.get_request()}.
@end deffn

@geindex server (socketserver.BaseRequestHandler의 속성)
@anchor{library/socketserver socketserver BaseRequestHandler server}@anchor{4116}
@deffn {속성} server

@ref{1342,,BaseServer} object used for handling the request.
@end deffn
@end deffn

@geindex StreamRequestHandler (socketserver 클래스)
@geindex DatagramRequestHandler (socketserver 클래스)
@anchor{library/socketserver socketserver StreamRequestHandler}@anchor{ed5}
@deffn {클래스} socketserver.StreamRequestHandler
@anchor{library/socketserver socketserver DatagramRequestHandler}@anchor{4104}
@deffnx {클래스} socketserver.DatagramRequestHandler

이 @ref{40f7,,BaseRequestHandler} 서브 클래스는 @ref{4113,,setup()}과 @ref{4117,,finish()} 메서드를 재정의하고, @ref{4118,,rfile}과 @ref{ed4,,wfile} 어트리뷰트를 제공합니다.

@geindex rfile (socketserver.DatagramRequestHandler의 속성)
@anchor{library/socketserver socketserver DatagramRequestHandler rfile}@anchor{4118}
@deffn {속성} rfile

읽어서 요청을 수신할 파일 객체. @ref{8a2,,io.BufferedIOBase} 읽기 가능 인터페이스를 지원합니다.
@end deffn

@geindex wfile (socketserver.DatagramRequestHandler의 속성)
@anchor{library/socketserver socketserver DatagramRequestHandler wfile}@anchor{ed4}
@deffn {속성} wfile

응답을 기록할 파일 객체. @ref{8a2,,io.BufferedIOBase} 쓰기 가능 인터페이스를 지원합니다.
@end deffn


버전 3.6에서 변경: @ref{ed4,,wfile} 도 @ref{8a2,,io.BufferedIOBase} 쓰기 가능 인터페이스를 지원합니다.

@end deffn

@node 예<13>,,요청 처리기 객체,socketserver — 네트워크 서버를 위한 프레임워크
@anchor{library/socketserver examples}@anchor{4119}
@subsubsection 예


@menu
* socketserver.TCPServer 예: socketserver TCPServer 예. 
* socketserver.UDPServer 예: socketserver UDPServer 예. 
* 비동기 믹스인:: 

@end menu

@node socketserver TCPServer 예,socketserver UDPServer 예,,예<13>
@anchor{library/socketserver socketserver-tcpserver-example}@anchor{411a}
@subsubsection @code{socketserver.TCPServer} 예


이것은 서버 쪽입니다:

@example
import socketserver

class MyTCPHandler(socketserver.BaseRequestHandler):
    """
    서버의 요청 처리기 클래스.

    서버 연결마다 한 번 인스턴스화되며, 클라이언트와의
    통신을 구현하기 위해 handle() 메서드를 재정의해야
    합니다.
    """

    def handle(self):
        # self.request는 클라이언트에 연결된 TCP 소켓입니다
        pieces = [b'@w{'}]
        total = 0
        while b'\n' not in pieces[-1] and total < 10_000:
            pieces.append(self.request.recv(2000))
            total += len(pieces[-1])
        self.data = b'@w{'}.join(pieces)
        print(f"Received from @{self.client_address[0]@}:")
        print(self.data.decode("utf-8"))
        # 단지 같은 데이터를 다시 보내지만, 대문자로 변환합니다
        self.request.sendall(self.data.upper())
        # 반환 후에, 소켓은 닫힙니다.

if __name__ == "__main__":
    HOST, PORT = "localhost", 9999

    # 포트 9999에서 localhost에 바인딩하여 서버를 만듭니다
    with socketserver.TCPServer((HOST, PORT), MyTCPHandler) as server:
        # 서버를 활성화합니다; Ctrl-C를 사용하여 프로그램을 중단할 때까지 계속
        # 실행됩니다.
        server.serve_forever()
@end example

스트림(표준 파일 인터페이스를 제공하여 통신을 단순화하는 파일류 객체)을 사용하는 대체 요청 처리기 클래스:

@example
class MyTCPHandler(socketserver.StreamRequestHandler):

    def handle(self):
        # self.rfile은 처리기에 의해 만들어진 파일류 객체입니다.
        # 이제 예를 들어 원시 recv() 호출 대신 readline()을 사용할 수 있습니다
        # 발신자의 악용을 방지하기 위해 10000 바이트로 제한합니다.
        self.data = self.rfile.readline(10000).rstrip()
        print(f"@{self.client_address[0]@} wrote:")
        print(self.data.decode("utf-8"))
        # 마찬가지로, self.wfile은 클라이언트로 다시 쓰는 데
        # 사용되는 파일류 객체입니다
        self.wfile.write(self.data.upper())
@end example

The difference is that the @code{readline()} call in the second handler will call
@code{recv()} multiple times until it encounters a newline character, while the
first handler had to use a @code{recv()} loop to accumulate data until a
newline itself.  If it had just used a single @code{recv()} without the loop it
would just have returned what has been received so far from the client.
TCP is stream based: data arrives in the order it was sent, but there is no
correlation between client @code{send()} or @code{sendall()} calls and the number
of @code{recv()} calls on the server required to receive it.

이것은 클라이언트 쪽입니다:

@example
import socket
import sys

HOST, PORT = "localhost", 9999
data = " ".join(sys.argv[1:])

# 소켓을 만듭니다 (SOCK_STREAM은 TCP 소켓을 의미합니다)
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
    # 서버에 연결하고 데이터를 전송합니다
    sock.connect((HOST, PORT))
    sock.sendall(bytes(data, "utf-8"))
    sock.sendall(b"\n")

    # 서버에서 데이터를 수신하고 종료합니다
    received = str(sock.recv(1024), "utf-8")

print("Sent:    ", data)
print("Received:", received)
@end example

예제의 결과는 다음과 같아야 합니다:

서버:

@example
$ python TCPServer.py
127.0.0.1 wrote:
b'hello world with TCP'
127.0.0.1 wrote:
b'python is nice'
@end example

클라이언트:

@example
$ python TCPClient.py hello world with TCP
Sent:     hello world with TCP
Received: HELLO WORLD WITH TCP
$ python TCPClient.py python is nice
Sent:     python is nice
Received: PYTHON IS NICE
@end example

@node socketserver UDPServer 예,비동기 믹스인,socketserver TCPServer 예,예<13>
@anchor{library/socketserver socketserver-udpserver-example}@anchor{411b}
@subsubsection @code{socketserver.UDPServer} 예


이것은 서버 쪽입니다:

@example
import socketserver

class MyUDPHandler(socketserver.BaseRequestHandler):
    """
    self.request가 데이터와 클라이언트 소켓의 쌍으로 구성되고 연결이
    없기 때문에 sendto()를 통해 데이터를 다시 보낼 때 클라이언트 주소를
    명시적으로 제공해야 한다는 점을 제외하면, 이 클래스는 TCP 처리기 클래스와
    유사하게 작동합니다.
    """

    def handle(self):
        data = self.request[0].strip()
        socket = self.request[1]
        print(f"@{self.client_address[0]@} wrote:")
        print(data)
        socket.sendto(data.upper(), self.client_address)

if __name__ == "__main__":
    HOST, PORT = "localhost", 9999
    with socketserver.UDPServer((HOST, PORT), MyUDPHandler) as server:
        server.serve_forever()
@end example

이것은 클라이언트 쪽입니다:

@example
import socket
import sys

HOST, PORT = "localhost", 9999
data = " ".join(sys.argv[1:])

# SOCK_DGRAM은 UDP 소켓으로 사용할 소켓 유형입니다
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# 보시다시피, connect() 호출은 없습니다; UDP는 연결이 없습니다.
# 대신, sendto()를 통해 데이터를 수신자에게 직접 보냅니다.
sock.sendto(bytes(data + "\n", "utf-8"), (HOST, PORT))
received = str(sock.recv(1024), "utf-8")

print("Sent:    ", data)
print("Received:", received)
@end example

예제의 출력은 TCP 서버 예제와 정확히 같아야 합니다.

@node 비동기 믹스인,,socketserver UDPServer 예,예<13>
@anchor{library/socketserver asynchronous-mixins}@anchor{411c}
@subsubsection 비동기 믹스인


비동기 처리기를 구축하려면, @ref{d39,,ThreadingMixIn} 과 @ref{d70,,ForkingMixIn} 클래스를 사용하십시오.

@ref{d39,,ThreadingMixIn} 클래스의 예:

@example
import socket
import threading
import socketserver

class ThreadedTCPRequestHandler(socketserver.BaseRequestHandler):

    def handle(self):
        data = str(self.request.recv(1024), 'ascii')
        cur_thread = threading.current_thread()
        response = bytes("@{@}: @{@}".format(cur_thread.name, data), 'ascii')
        self.request.sendall(response)

class ThreadedTCPServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
    pass

def client(ip, port, message):
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
        sock.connect((ip, port))
        sock.sendall(bytes(message, 'ascii'))
        response = str(sock.recv(1024), 'ascii')
        print("Received: @{@}".format(response))

if __name__ == "__main__":
    # 포트 0은 임의의 미사용 포트를 선택하는 것을 의미합니다
    HOST, PORT = "localhost", 0

    server = ThreadedTCPServer((HOST, PORT), ThreadedTCPRequestHandler)
    with server:
        ip, port = server.server_address

        # 서버로 스레드를 시작합니다 -- 그런 다음 그 스레드가 요청마다 스레드를 하나씩 더
        # 시작합니다
        server_thread = threading.Thread(target=server.serve_forever)
        # 메인 스레드가 종료할 때 서버 스레드를 종료합니다
        server_thread.daemon = True
        server_thread.start()
        print("Server loop running in thread:", server_thread.name)

        client(ip, port, "Hello World 1")
        client(ip, port, "Hello World 2")
        client(ip, port, "Hello World 3")

        server.shutdown()
@end example

예제의 결과는 다음과 같아야 합니다:

@example
$ python ThreadedTCPServer.py
Server loop running in thread: Thread-1
Received: Thread-2: Hello World 1
Received: Thread-3: Hello World 2
Received: Thread-4: Hello World 3
@end example

@ref{d70,,ForkingMixIn} 클래스는 서버가 요청마다 새 프로세스를 생성한다는 점을 제외하고 같은 방식으로 사용됩니다. @ref{4b6,,fork()}를 지원하는 POSIX 플랫폼에서만 사용 가능합니다.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node http server — HTTP 서버,http cookies — HTTP 상태 관리,socketserver — 네트워크 서버를 위한 프레임워크,인터넷 프로토콜과 지원
@anchor{library/http server doc}@anchor{411d}@anchor{library/http server http-server-http-servers}@anchor{411e}@anchor{library/http server module-http server}@anchor{76}@anchor{library/http server translation-repo}@anchor{411f}
@subsection @code{http.server} — HTTP 서버


@geindex module; http.server

`소스 코드:' Lib/http/server.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/http/server.py}

@geindex WWW;서버
@geindex HTTP;프로토콜
@geindex URL
@geindex httpd


__________________________________________________________________


이 모듈은 HTTP 서버를 구현하기 위한 클래스를 정의합니다.

@cartouche
@quotation 경고 
@code{http.server} is not recommended for production. It only implements
@ref{4120,,basic security checks}.
@end quotation
@end cartouche

@c include for modules that don't work on WASM

@ref{213c,,가용성}: not WASI.

이 모듈은 웹어셈블리에서 작동하지 않거나 제공되지 않습니다. 자세한 내용은 @ref{1b68,,웹어셈블리 플랫폼}을 참조하세요.

@ref{3f1d,,HTTPServer} 클래스는 @ref{1524,,socketserver.TCPServer} 서브 클래스입니다. HTTP 소켓을 만들고 리스닝하면서 요청을 처리기로 디스패치 합니다. 서버를 만들고 실행하는 코드는 다음과 같습니다:

@example
def run(server_class=HTTPServer, handler_class=BaseHTTPRequestHandler):
    server_address = ('@w{'}, 8000)
    httpd = server_class(server_address, handler_class)
    httpd.serve_forever()
@end example

@geindex HTTPServer (http.server 클래스)
@anchor{library/http server http server HTTPServer}@anchor{3f1d}
@deffn {클래스} http.server.HTTPServer (server_address, RequestHandlerClass)

이 클래스는 @ref{1524,,TCPServer} 클래스를 기반으로 하고, 서버 주소를 @code{server_name}과 @code{server_port}라는 인스턴스 변수로 저장합니다. 처리기는 일반적으로 처리기의 @code{server} 인스턴스 변수를 통해 서버에 액세스 할 수 있습니다.
@end deffn

@geindex ThreadingHTTPServer (http.server 클래스)
@anchor{library/http server http server ThreadingHTTPServer}@anchor{d38}
@deffn {클래스} http.server.ThreadingHTTPServer (server_address, RequestHandlerClass)

이 클래스는 HTTPServer와 동일하지만 @ref{d39,,ThreadingMixIn}을 사용하여 요청을 처리하는 데 스레드를 사용합니다. @ref{3f1d,,HTTPServer}가 무기한 대기하도록 만드는 소켓을 미리 여는 웹 브라우저를 처리하는 데 유용합니다.


Added in version 3.7.

@end deffn

@geindex HTTPSServer (http.server 클래스)
@anchor{library/http server http server HTTPSServer}@anchor{228}
@deffn {클래스} http.server.HTTPSServer (server_address, RequestHandlerClass, bind_and_activate=True, *, certfile, keyfile=None, password=None, alpn_protocols=None)

Subclass of @ref{3f1d,,HTTPServer} with a wrapped socket using the @ref{d5,,ssl} module.
If the @code{ssl} module is not available, instantiating a @code{HTTPSServer}
object fails with a @ref{244,,RuntimeError}.

The `certfile' argument is the path to the SSL certificate chain file,
and the `keyfile' is the path to file containing the private key.

A `password' can be specified for files protected and wrapped with PKCS#8,
but beware that this could possibly expose hardcoded passwords in clear.


@subsubheading 더 보기


See @ref{597,,ssl.SSLContext.load_cert_chain()} for additional
information on the accepted values for `certfile', `keyfile'
and `password'.


When specified, the `alpn_protocols' argument must be a sequence of strings
specifying the “Application-Layer Protocol Negotiation” (ALPN) protocols
supported by the server. ALPN allows the server and the client to negotiate
the application protocol during the TLS handshake.

By default, it is set to @code{["http/1.1"]}, meaning the server supports HTTP/1.1.


Added in version 3.14.

@end deffn

@geindex ThreadingHTTPSServer (http.server 클래스)
@anchor{library/http server http server ThreadingHTTPSServer}@anchor{4121}
@deffn {클래스} http.server.ThreadingHTTPSServer (server_address, RequestHandlerClass, bind_and_activate=True, *, certfile, keyfile=None, password=None, alpn_protocols=None)

This class is identical to @ref{228,,HTTPSServer} but uses threads to handle
requests by inheriting from @ref{d39,,ThreadingMixIn}. This is
analogous to @ref{d38,,ThreadingHTTPServer} only using @code{HTTPSServer}.


Added in version 3.14.

@end deffn

The @ref{3f1d,,HTTPServer}, @ref{d38,,ThreadingHTTPServer}, @ref{228,,HTTPSServer} and
@ref{4121,,ThreadingHTTPSServer} must be given a `RequestHandlerClass' on
instantiation, of which this module provides three different variants:

@geindex BaseHTTPRequestHandler (http.server 클래스)
@anchor{library/http server http server BaseHTTPRequestHandler}@anchor{12d0}
@deffn {클래스} http.server.BaseHTTPRequestHandler (request, client_address, server)

이 클래스는 서버에 도착하는 HTTP 요청을 처리하는 데 사용됩니다. 그 자체로는, 실제 HTTP 요청에 응답할 수 없습니다; 각 요청 메서드(예를 들어 GET이나 POST)를 처리하려면 서브 클래스를 만들어야 합니다. @ref{12d0,,BaseHTTPRequestHandler}는 많은 클래스 및 인스턴스 변수와 서브 클래스가 사용할 메서드를 제공합니다.

처리기는 요청과 헤더를 구문 분석한 다음, 요청 유형에 특정한 메서드를 호출합니다. 메서드 이름은 요청으로부터 구성됩니다. 예를 들어, 요청 메서드 @code{SPAM}의 경우, @code{do_SPAM()} 메서드가 인자 없이 호출됩니다. 모든 관련 정보는 처리기의 인스턴스 변수에 저장됩니다. 서브 클래스는 @code{__init__()} 메서드를 대체하거나 확장할 필요가 없습니다.

@ref{12d0,,BaseHTTPRequestHandler}에는 다음과 같은 인스턴스 변수가 있습니다:

@geindex client_address (http.server.BaseHTTPRequestHandler의 속성)
@anchor{library/http server http server BaseHTTPRequestHandler client_address}@anchor{4122}
@deffn {속성} client_address

클라이언트 주소를 나타내는 @code{(host, port)} 형식의 튜플을 포함합니다.
@end deffn

@geindex server (http.server.BaseHTTPRequestHandler의 속성)
@anchor{library/http server http server BaseHTTPRequestHandler server}@anchor{4123}
@deffn {속성} server

서버 인스턴스를 포함합니다.
@end deffn

@geindex close_connection (http.server.BaseHTTPRequestHandler의 속성)
@anchor{library/http server http server BaseHTTPRequestHandler close_connection}@anchor{4124}
@deffn {속성} close_connection

@ref{4125,,handle_one_request()}가 반환되기 전에 설정해야 하는 불리언으로, 다른 요청이 기대되는지, 또는 연결을 종료해야 하는지를 나타냅니다.
@end deffn

@geindex requestline (http.server.BaseHTTPRequestHandler의 속성)
@anchor{library/http server http server BaseHTTPRequestHandler requestline}@anchor{4126}
@deffn {속성} requestline

HTTP 요청 줄의 문자열 표현을 포함합니다. 종료 CRLF가 제거됩니다. 이 어트리뷰트는 @ref{4125,,handle_one_request()}에서 설정해야 합니다. 유효한 요청 줄이 처리되지 않았으면, 빈 문자열로 설정해야 합니다.
@end deffn

@geindex command (http.server.BaseHTTPRequestHandler의 속성)
@anchor{library/http server http server BaseHTTPRequestHandler command}@anchor{4127}
@deffn {속성} command

명령(요청 유형)을 포함합니다. 예를 들어, @code{'GET'}.
@end deffn

@geindex path (http.server.BaseHTTPRequestHandler의 속성)
@anchor{library/http server http server BaseHTTPRequestHandler path}@anchor{4128}
@deffn {속성} path

Contains the request path. If query component of the URL is present,
then @code{path} includes the query. Using the terminology of 
@geindex RFC; RFC 3986
RFC 3986@footnote{https://datatracker.ietf.org/doc/html/rfc3986.html},
@code{path} here includes @code{hier-part} and the @code{query}.
@end deffn

@geindex request_version (http.server.BaseHTTPRequestHandler의 속성)
@anchor{library/http server http server BaseHTTPRequestHandler request_version}@anchor{4129}
@deffn {속성} request_version

요청의 버전 문자열을 포함합니다. 예를 들어, @code{'HTTP/1.0'}.
@end deffn

@geindex headers (http.server.BaseHTTPRequestHandler의 속성)
@anchor{library/http server http server BaseHTTPRequestHandler headers}@anchor{4002}
@deffn {속성} headers

Holds an instance of the class specified by the @ref{412a,,MessageClass} class
variable. This instance parses and manages the headers in the HTTP
request. The @ref{1e24,,parse_headers()} function from
@ref{73,,http.client} is used to parse the headers and it requires that the
HTTP request provide a valid 
@geindex RFC; RFC 5322
RFC 5322@footnote{https://datatracker.ietf.org/doc/html/rfc5322.html} style header.
@end deffn

@geindex rfile (http.server.BaseHTTPRequestHandler의 속성)
@anchor{library/http server http server BaseHTTPRequestHandler rfile}@anchor{412b}
@deffn {속성} rfile

선택적 입력 데이터의 시작부터 읽을 준비가 된 @ref{8a2,,io.BufferedIOBase} 입력 스트림.
@end deffn

@geindex wfile (http.server.BaseHTTPRequestHandler의 속성)
@anchor{library/http server http server BaseHTTPRequestHandler wfile}@anchor{412c}
@deffn {속성} wfile

클라이언트로 돌려줄 응답을 쓰기 위한 출력 스트림을 포함합니다. HTTP 클라이언트와의 성공적인 상호 운용을 위해서 이 스트림에 쓸 때 HTTP 프로토콜을 올바르게 준수해야 합니다.


버전 3.6에서 변경: 이것은 @ref{8a2,,io.BufferedIOBase} 스트림입니다.

@end deffn

@ref{12d0,,BaseHTTPRequestHandler}에는 다음과 같은 어트리뷰트가 있습니다:

@geindex server_version (http.server.BaseHTTPRequestHandler의 속성)
@anchor{library/http server http server BaseHTTPRequestHandler server_version}@anchor{412d}
@deffn {속성} server_version

서버 소프트웨어 버전을 지정합니다. 이것을 재정의하고 싶을 수 있습니다. 형식은 여러 공백으로 구분된 문자열이며, 각 문자열은 name[/version] 형식입니다. 예를 들어, @code{'BaseHTTP/0.2'}.
@end deffn

@geindex sys_version (http.server.BaseHTTPRequestHandler의 속성)
@anchor{library/http server http server BaseHTTPRequestHandler sys_version}@anchor{412e}
@deffn {속성} sys_version

@ref{412f,,version_string} 메서드와 @ref{412d,,server_version} 클래스 변수에서 사용할 수 있는 형식으로 파이썬 시스템 버전을 포함합니다. 예를 들어, @code{'Python/1.4'}.
@end deffn

@geindex error_message_format (http.server.BaseHTTPRequestHandler의 속성)
@anchor{library/http server http server BaseHTTPRequestHandler error_message_format}@anchor{114f}
@deffn {속성} error_message_format

클라이언트에 대한 에러 응답을 빌드하기 위해 @ref{114e,,send_error()} 메서드에서 사용해야 하는 포맷 문자열을 지정합니다. 문자열은 기본적으로 @code{send_error()}에 전달된 상태 코드에 따라 @ref{3fe7,,responses}의 변수로 채워집니다.
@end deffn

@geindex error_content_type (http.server.BaseHTTPRequestHandler의 속성)
@anchor{library/http server http server BaseHTTPRequestHandler error_content_type}@anchor{4130}
@deffn {속성} error_content_type

클라이언트로 전송되는 에러 응답의 Content-Type HTTP 헤더를 지정합니다. 기본값은 @code{'text/html'}입니다.
@end deffn

@geindex protocol_version (http.server.BaseHTTPRequestHandler의 속성)
@anchor{library/http server http server BaseHTTPRequestHandler protocol_version}@anchor{4131}
@deffn {속성} protocol_version

서버가 준수하는 HTTP 버전을 지정합니다. 향후 요청에 대한 서버의 통신 기능을 클라이언트에게 알리기 위해 응답으로 전송됩니다. @code{'HTTP/1.1'}로 설정되면, 서버는 HTTP 지속적 연결(persistent connections)을 허용합니다; 그러나, 이때 서버는 `반드시' 클라이언트에 대한 모든 응답에 (@ref{4132,,send_header()}를 사용해서) 정확한 @code{Content-Length} 헤더를 포함해야 합니다. 이전 버전과의 호환성을 위해, 기본 설정은 @code{'HTTP/1.0'}입니다.
@end deffn

@geindex MessageClass (http.server.BaseHTTPRequestHandler의 속성)
@anchor{library/http server http server BaseHTTPRequestHandler MessageClass}@anchor{412a}
@deffn {속성} MessageClass

HTTP 헤더를 구문 분석할 @ref{580,,email.message.Message}와 유사한 클래스를 지정합니다. 일반적으로, 이는 재정의되지 않으며, 기본값은 @ref{4000,,http.client.HTTPMessage}입니다.
@end deffn

@geindex responses (http.server.BaseHTTPRequestHandler의 속성)
@anchor{library/http server http server BaseHTTPRequestHandler responses}@anchor{3fe7}
@deffn {속성} responses

이 어트리뷰트에는 에러 코드 정수에서 짧고 긴 메시지를 포함하는 두 요소 튜플로의 매핑이 포함됩니다. 예를 들어, @code{@{code: (shortmessage, longmessage)@}}. `shortmessage'는 일반적으로 에러 응답에서 `message' 키로 사용되고, `longmessage'는 `explain' 키로 사용됩니다. @ref{4133,,send_response_only()}와 @ref{114e,,send_error()} 메서드에서 사용됩니다.
@end deffn

@ref{12d0,,BaseHTTPRequestHandler} 인스턴스에는 다음과 같은 메서드가 있습니다:

@geindex handle() (http.server.BaseHTTPRequestHandler 메서드)
@anchor{library/http server http server BaseHTTPRequestHandler handle}@anchor{4134}
@deffn {메서드} handle ()

들어오는 HTTP 요청을 처리하기 위해 @ref{4125,,handle_one_request()}를 한 번 (또는, 지속적 연결이 활성화되었으면, 여러 번) 호출합니다. 재정의할 필요는 없습니다; 대신 적절한 @code{do_*()} 메서드를 구현하십시오.
@end deffn

@geindex handle_one_request() (http.server.BaseHTTPRequestHandler 메서드)
@anchor{library/http server http server BaseHTTPRequestHandler handle_one_request}@anchor{4125}
@deffn {메서드} handle_one_request ()

이 메서드는 요청을 구문 분석하여 적절한 @code{do_*()} 메서드로 디스패치 합니다. 재정의할 필요는 없습니다.
@end deffn

@geindex handle_expect_100() (http.server.BaseHTTPRequestHandler 메서드)
@anchor{library/http server http server BaseHTTPRequestHandler handle_expect_100}@anchor{4135}
@deffn {메서드} handle_expect_100 ()

HTTP/1.1 호환 서버가 @code{Expect: 100-continue} 요청 헤더를 수신하면 @code{100 Continue}로 응답한 후 @code{200 OK} 헤더가 뒤따릅니다. 클라이언트가 계속하는 것을 서버가 원하지 않으면 에러를 발생시키기 위해 이 메서드를 재정의할 수 있습니다. 예를 들어 서버는 @code{417 Expectation Failed}를 응답 헤더로 보내고 @code{return False} 할 수 있습니다.


Added in version 3.2.

@end deffn

@geindex send_error() (http.server.BaseHTTPRequestHandler 메서드)
@anchor{library/http server http server BaseHTTPRequestHandler send_error}@anchor{114e}
@deffn {메서드} send_error (code, message=None, explain=None)

클라이언트에게 완전한 에러 응답을 보내고 로깅 합니다. 숫자 `code'는 HTTP 에러 코드를 지정하며, `message'는 선택적인 사람이 읽을 수 있는 에러에 대한 간단한 설명입니다. `explain' 인자는 에러에 대한 자세한 정보를 제공하는 데 사용될 수 있습니다; @ref{114f,,error_message_format} 어트리뷰트를 사용하여 포맷되고 전체 헤더 집합 뒤에 응답 바디로 보냅니다. @ref{3fe7,,responses} 어트리뷰트는 값이 제공되지 않을 때 사용될 `message'와 `explain'의 기본값을 담고 있습니다; 알 수 없는 코드의 경우 둘 다 기본값은 문자열 @code{???}입니다. 메서드가 HEAD이거나 응답 코드가 @code{1@var{xx}}, @code{204 No Content}, @code{205 Reset Content}, @code{304 Not Modified} 중 하나면 바디는 비어 있게 됩니다.


버전 3.4에서 변경: 에러 응답에는 Content-Length 헤더가 포함됩니다. `explain' 인자를 추가했습니다.

@end deffn

@geindex send_response() (http.server.BaseHTTPRequestHandler 메서드)
@anchor{library/http server http server BaseHTTPRequestHandler send_response}@anchor{4136}
@deffn {메서드} send_response (code, message=None)

헤더 버퍼에 응답 헤더를 추가하고 받아들인 요청을 로깅 합니다. HTTP 응답 줄이 내부 버퍼에 기록되고, `Server'와 `Date' 헤더가 뒤따릅니다. 이 두 헤더의 값은 각각 @ref{412f,,version_string()}과 @ref{4137,,date_time_string()} 메서드에서 취합니다. 서버가 @ref{4132,,send_header()} 메서드를 사용하여 다른 헤더를 보내려고 하지 않는다면, @ref{4136,,send_response()} 다음에 @ref{12d1,,end_headers()} 호출이 있어야 합니다.


버전 3.3에서 변경: 헤더는 내부 버퍼에 저장되며 @ref{12d1,,end_headers()}를 명시적으로 호출해야 합니다.

@end deffn

@geindex send_header() (http.server.BaseHTTPRequestHandler 메서드)
@anchor{library/http server http server BaseHTTPRequestHandler send_header}@anchor{4132}
@deffn {메서드} send_header (keyword, value)

@ref{12d1,,end_headers()}나 @ref{12d2,,flush_headers()}가 호출될 때 출력 스트림에 기록될 내부 버퍼에 HTTP 헤더를 추가합니다. `keyword'는 헤더 키워드를 지정하고, `value'는 값을 지정해야 합니다. send_header 호출이 완료된 후, 작업을 완료하려면 반드시 @code{end_headers()}를 호출해야 함에 유의하십시오.


버전 3.2에서 변경: 헤더는 내부 버퍼에 저장됩니다.

@end deffn

@geindex send_response_only() (http.server.BaseHTTPRequestHandler 메서드)
@anchor{library/http server http server BaseHTTPRequestHandler send_response_only}@anchor{4133}
@deffn {메서드} send_response_only (code, message=None)

응답 헤더만 보내는데, 서버가 @code{100 Continue} 응답을 클라이언트로 전송할 목적으로 사용됩니다. 헤더는 버퍼링 되지 않고 출력 스트림으로 직접 전송합니다. `message'를 지정하지 않으면, 응답 `code'에 해당하는 HTTP 메시지가 전송됩니다.


Added in version 3.2.

@end deffn

@geindex end_headers() (http.server.BaseHTTPRequestHandler 메서드)
@anchor{library/http server http server BaseHTTPRequestHandler end_headers}@anchor{12d1}
@deffn {메서드} end_headers ()

(응답에서 HTTP 헤더의 끝을 나타내는) 빈 줄을 헤더 버퍼에 추가하고 @ref{12d2,,flush_headers()}를 호출합니다.


버전 3.2에서 변경: 버퍼링 된 헤더는 출력 스트림에 기록됩니다.

@end deffn

@geindex flush_headers() (http.server.BaseHTTPRequestHandler 메서드)
@anchor{library/http server http server BaseHTTPRequestHandler flush_headers}@anchor{12d2}
@deffn {메서드} flush_headers ()

마지막으로 헤더를 출력 스트림으로 보내고 내부 헤더 버퍼를 플러시 합니다.


Added in version 3.3.

@end deffn

@geindex log_request() (http.server.BaseHTTPRequestHandler 메서드)
@anchor{library/http server http server BaseHTTPRequestHandler log_request}@anchor{4138}
@deffn {메서드} log_request (code='-', size='-')

받아들인 (성공적인) 요청을 로깅 합니다. `code'는 응답과 관련된 숫자 HTTP 코드를 지정해야 합니다. 응답의 크기가 있으면, `size' 매개 변수로 전달되어야 합니다.
@end deffn

@geindex log_error() (http.server.BaseHTTPRequestHandler 메서드)
@anchor{library/http server http server BaseHTTPRequestHandler log_error}@anchor{4139}
@deffn {메서드} log_error (...)

요청을 이행할 수 없을 때 에러를 로깅 합니다. 기본적으로, 메시지를 @ref{413a,,log_message()}에 전달하므로, 같은 인자(`format'과 추가 값)를 취합니다.
@end deffn

@geindex log_message() (http.server.BaseHTTPRequestHandler 메서드)
@anchor{library/http server http server BaseHTTPRequestHandler log_message}@anchor{413a}
@deffn {메서드} log_message (format, ...)

@code{sys.stderr}에 임의의 메시지를 로깅 합니다. 이것은 일반적으로 사용자 지정 에러 로깅 메커니즘을 만들기 위해 재정의됩니다. `format' 인자는 표준 printf 스타일 포맷 문자열이며, @ref{413a,,log_message()}에 대한 추가 인자는 포매팅의 입력으로 적용됩니다. 클라이언트 ip 주소와 현재 날짜 및 시간은 로깅 되는 모든 메시지 앞에 붙습니다.
@end deffn

@geindex version_string() (http.server.BaseHTTPRequestHandler 메서드)
@anchor{library/http server http server BaseHTTPRequestHandler version_string}@anchor{412f}
@deffn {메서드} version_string ()

서버 소프트웨어의 버전 문자열을 반환합니다. 이것은 @ref{412d,,server_version}과 @ref{412e,,sys_version} 어트리뷰트의 조합입니다.
@end deffn

@geindex date_time_string() (http.server.BaseHTTPRequestHandler 메서드)
@anchor{library/http server http server BaseHTTPRequestHandler date_time_string}@anchor{4137}
@deffn {메서드} date_time_string (timestamp=None)

`timestamp'(@code{None}이거나 @ref{55c,,time.time()}이 반환한 형식이어야 합니다)로 지정된 날짜와 시간을 메시지 헤더용으로 포맷하여 반환합니다. `timestamp'를 생략하면, 현재 날짜와 시간이 사용됩니다.

결과는 @code{'Sun, 06 Nov 1994 08:49:37 GMT'}와 같은 모습입니다.
@end deffn

@geindex log_date_time_string() (http.server.BaseHTTPRequestHandler 메서드)
@anchor{library/http server http server BaseHTTPRequestHandler log_date_time_string}@anchor{413b}
@deffn {메서드} log_date_time_string ()

로깅용으로 포맷한 현재 날짜와 시간을 반환합니다.
@end deffn

@geindex address_string() (http.server.BaseHTTPRequestHandler 메서드)
@anchor{library/http server http server BaseHTTPRequestHandler address_string}@anchor{413c}
@deffn {메서드} address_string ()

클라이언트 주소를 반환합니다.


버전 3.3에서 변경: 이전에는, 이름 조회가 수행되었습니다. 이름 결정(name resolution) 지연을 피하고자, 이제 항상 IP 주소를 반환합니다.

@end deffn
@end deffn

@geindex SimpleHTTPRequestHandler (http.server 클래스)
@anchor{library/http server http server SimpleHTTPRequestHandler}@anchor{d37}
@deffn {클래스} http.server.SimpleHTTPRequestHandler (request, client_address, server, directory=None)

이 클래스는 디렉터리 구조를 HTTP 요청에 직접 매핑하여 디렉터리 `directory'와 그 이하의, 또는 `directory'가 제공되지 않으면 현재 디렉터리의 파일을 제공합니다.


버전 3.7에서 변경: Added the `directory' parameter.



버전 3.9에서 변경: `directory' 매개 변수는 @ref{5a0,,경로류 객체}를 받아들입니다.


요청 구문 분석과 같은 많은 작업이 베이스 클래스 @ref{12d0,,BaseHTTPRequestHandler} 에 의해 수행됩니다. 이 클래스는 @ref{413d,,do_GET()}과 @ref{413e,,do_HEAD()} 함수를 구현합니다.

다음은 @ref{d37,,SimpleHTTPRequestHandler} 의 클래스 수준 어트리뷰트로 정의됩니다:

@geindex server_version (http.server.SimpleHTTPRequestHandler의 속성)
@anchor{library/http server http server SimpleHTTPRequestHandler server_version}@anchor{413f}
@deffn {속성} server_version

이것은 @code{"SimpleHTTP/" + __version__}이며, 여기서 @code{__version__}은 모듈 수준에서 정의됩니다.
@end deffn

@geindex extensions_map (http.server.SimpleHTTPRequestHandler의 속성)
@anchor{library/http server http server SimpleHTTPRequestHandler extensions_map}@anchor{4140}
@deffn {속성} extensions_map

접미사를 MIME 형식으로 매핑하는 딕셔너리. 기본 시스템 매핑에 대한 사용자 정의 재정의를 포함합니다. 매핑은 대소 문자를 구분 없이 사용되므로, 소문자 키만 포함해야 합니다.


버전 3.9에서 변경: 이 딕셔너리는 더는 기본 시스템 매핑으로 채워지지 않고, 재정의 만 포함합니다.

@end deffn

@ref{d37,,SimpleHTTPRequestHandler} 클래스는 다음 메서드를 정의합니다:

@geindex do_HEAD() (http.server.SimpleHTTPRequestHandler 메서드)
@anchor{library/http server http server SimpleHTTPRequestHandler do_HEAD}@anchor{413e}
@deffn {메서드} do_HEAD ()

이 메서드는 @code{'HEAD'} 요청 유형을 제공합니다: 동등한 @code{GET} 요청에 대해 전송할 헤더를 전송합니다. 가능한 헤더에 대한 더 완전한 설명은 @ref{413d,,do_GET()} 메서드를 참조하십시오.
@end deffn

@geindex do_GET() (http.server.SimpleHTTPRequestHandler 메서드)
@anchor{library/http server http server SimpleHTTPRequestHandler do_GET}@anchor{413d}
@deffn {메서드} do_GET ()

요청을 현재 작업 디렉터리에 상대적인 경로로 해석하여 요청은 로컬 파일에 매핑됩니다.

요청이 디렉터리에 매핑되었으면, 디렉터리는 @code{index.html}이나 @code{index.htm} (이 순서대로) 파일을 검사합니다. 발견되면, 파일 내용이 반환됩니다; 그렇지 않으면 @code{list_directory()} 메서드를 호출하여 디렉터리 목록이 생성됩니다. 이 메서드는 @ref{12ff,,os.listdir()}을 사용하여 디렉터리를 스캔하고, @code{listdir()}이 실패하면 @code{404} 에러 응답을 반환합니다.

요청이 파일에 매핑되었으면, 파일을 엽니다. 요청된 파일을 열 때 발생하는 @ref{2c0,,OSError} 예외는 @code{404}, @code{'File not found'} 에러로 매핑됩니다. 요청에 @code{'If-Modified-Since'} 헤더가 있고, 이 시간 이후 파일이 수정되지 않았으면, @code{304}, @code{'Not Modified'} 응답이 전송됩니다. 그렇지 않으면, 콘텐츠 유형은 @code{guess_type()} 메서드를 호출하여 추측되며, 이 메서드는 `extensions_map' 변수를 사용합니다. 그런 다음 파일 내용이 반환됩니다.

추측된 콘텐츠 유형의 @code{'Content-type:'} 헤더가 출력되고, 파일 크기가 담긴 @code{'Content-Length:'} 헤더와 파일 수정 시간이 담긴 @code{'Last-Modified:'} 헤더가 뒤따릅니다.

Then follows a blank line signifying the end of the headers, and then the
contents of the file are output.

사용 예로는, Lib/http/server.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/http/server.py} 모듈에서 @code{test} 함수 구현을 참조하십시오.


버전 3.7에서 변경: @code{'If-Modified-Since'} 헤더 지원.

@end deffn
@end deffn

@ref{d37,,SimpleHTTPRequestHandler} 클래스는 현재 디렉터리를 기준으로 파일을 제공하는 매우 기본적인 웹 서버를 만들기 위해 다음과 같은 방식으로 사용될 수 있습니다:

@example
import http.server
import socketserver

PORT = 8000

Handler = http.server.SimpleHTTPRequestHandler

with socketserver.TCPServer(("", PORT), Handler) as httpd:
    print("serving at port", PORT)
    httpd.serve_forever()
@end example

@ref{d37,,SimpleHTTPRequestHandler} can also be subclassed to enhance behavior,
such as using different index file names by overriding the class attribute
@code{index_pages}.

@geindex CGIHTTPRequestHandler (http.server 클래스)
@anchor{library/http server http server CGIHTTPRequestHandler}@anchor{325}
@deffn {클래스} http.server.CGIHTTPRequestHandler (request, client_address, server)

이 클래스는 현재 디렉터리와 그 아래에 있는 파일이나 CGI 스크립트의 출력을 제공하는 데 사용됩니다. HTTP 계층 구조를 로컬 디렉터리 구조에 매핑하는 것은 @ref{d37,,SimpleHTTPRequestHandler}와 정확히 같음에 유의하십시오.

@cartouche
@quotation 참고 
@ref{325,,CGIHTTPRequestHandler} 클래스가 실행하는 CGI 스크립트는 리디렉션(HTTP 코드 302)을 실행할 수 없습니다, CGI 스크립트를 실행하기 전에 코드 200(스크립트 출력이 이어집니다)이 전송되기 때문입니다. 이것은 상태 코드를 선점합니다.
@end quotation
@end cartouche

클래스는 CGI 스크립트라고 생각되면 파일로 제공하는 대신 CGI 스크립트를 실행합니다. 디렉터리 기반 CGI만 사용됩니다 — 다른 일반적인 서버 구성은 특수한 확장자를 CGI 스크립트를 나타내는 것으로 취급하는 것입니다.

요청이 @code{cgi_directories} 경로 아래로 이어지면, 파일을 제공하는 대신 CGI 스크립트를 실행하고 출력을 제공하도록 @code{do_GET()}과 @code{do_HEAD()} 함수가 수정되었습니다.

@ref{325,,CGIHTTPRequestHandler}는 다음 데이터 멤버를 정의합니다:

@geindex cgi_directories (http.server.CGIHTTPRequestHandler의 속성)
@anchor{library/http server http server CGIHTTPRequestHandler cgi_directories}@anchor{4141}
@deffn {속성} cgi_directories

기본값은 @code{['/cgi-bin', '/htbin']}이며 CGI 스크립트를 포함하는 것으로 취급할 디렉터리를 기술합니다.
@end deffn

@ref{325,,CGIHTTPRequestHandler}는 다음 메서드를 정의합니다:

@geindex do_POST() (http.server.CGIHTTPRequestHandler 메서드)
@anchor{library/http server http server CGIHTTPRequestHandler do_POST}@anchor{4142}
@deffn {메서드} do_POST ()

이 메서드는 @code{'POST'} 요청 유형을 제공하며, CGI 스크립트에만 허용됩니다. CGI 이외의 url에 POST를 시도할 때 에러 501, “Can only POST to CGI scripts”가 출력됩니다.
@end deffn

보안상의 이유로, CGI 스크립트는 nobody 사용자의 UID로 실행됨에 유의하십시오. CGI 스크립트 문제는 에러 403으로 변환됩니다.


Deprecated since version 3.13, will be removed in version 3.15: @code{CGIHTTPRequestHandler} is being removed in 3.15.  CGI has not
been considered a good way to do things for well over a decade. This code
has been unmaintained for a while now and sees very little practical use.
Retaining it could lead to further @ref{4120,,security considerations}.

@end deffn

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

@end menu

@node Command-line interface<7>,Security considerations,,http server — HTTP 서버
@anchor{library/http server command-line-interface}@anchor{4143}@anchor{library/http server http-server-cli}@anchor{1150}
@subsubsection Command-line interface


@code{http.server} can also be invoked directly using the @ref{23c,,-m}
switch of the interpreter.  The following example illustrates how to serve
files relative to the current directory:

@example
python -m http.server [OPTIONS] [port]
@end example

The following options are accepted:

@geindex http.server 명령줄 옵션; port
@anchor{library/http server cmdoption-http server-arg-port}@anchor{4144}
@deffn {Option} port

The server listens to port 8000 by default. The default can be overridden
by passing the desired port number as an argument:

@example
python -m http.server 9000
@end example
@end deffn

@geindex http.server 명령줄 옵션; -b
@geindex http.server 명령줄 옵션; --bind
@anchor{library/http server cmdoption-http server-b}@anchor{4145}@anchor{library/http server cmdoption-http server-bind}@anchor{4146}
@deffn {Option} @w{-}b, @w{-}@w{-}bind <address>

바인딩할 특정 주소를 지정합니다. IPv4와 IPv6 주소가 모두 지원됩니다. 기본적으로, 서버는 모든 인터페이스에 자신을 바인드 합니다. 예를 들어, 다음 명령은 서버가 localhost에만 바인드 하도록 합니다:

@example
python -m http.server --bind 127.0.0.1
@end example


Added in version 3.4.



버전 3.8에서 변경: Support IPv6 in the @code{--bind} option.

@end deffn

@geindex http.server 명령줄 옵션; -d
@geindex http.server 명령줄 옵션; --directory
@anchor{library/http server cmdoption-http server-d}@anchor{1841}@anchor{library/http server cmdoption-http server-directory}@anchor{4147}
@deffn {Option} @w{-}d, @w{-}@w{-}directory <dir>

파일을 제공할 디렉터리를 지정합니다. 기본적으로 서버는 현재 디렉터리를 사용합니다. 예를 들어, 다음 명령은 특정 디렉터리를 사용합니다:

@example
python -m http.server --directory /tmp/
@end example


Added in version 3.7.

@end deffn

@geindex http.server 명령줄 옵션; -p
@geindex http.server 명령줄 옵션; --protocol
@anchor{library/http server cmdoption-http server-p}@anchor{4148}@anchor{library/http server cmdoption-http server-protocol}@anchor{4149}
@deffn {Option} @w{-}p, @w{-}@w{-}protocol <version>

Specifies the HTTP version to which the server is conformant. By default,
the server is conformant to HTTP/1.0. For example, the following command
runs an HTTP/1.1 conformant server:

@example
python -m http.server --protocol HTTP/1.1
@end example


Added in version 3.11.

@end deffn

@geindex http.server 명령줄 옵션; --cgi
@anchor{library/http server cmdoption-http server-cgi}@anchor{414a}
@deffn {Option} @w{-}@w{-}cgi

@code{--cgi} 옵션을 전달하여 명령 줄에서 @ref{325,,CGIHTTPRequestHandler}를 사용할 수 있습니다:

@example
python -m http.server --cgi
@end example


Deprecated since version 3.13, will be removed in version 3.15: @code{http.server} command line @code{--cgi} support is being removed
because @ref{325,,CGIHTTPRequestHandler} is being removed.

@end deffn

@cartouche
@quotation 경고 
@ref{325,,CGIHTTPRequestHandler} and the @code{--cgi} command-line option
are not intended for use by untrusted clients and may be vulnerable
to exploitation. Always use within a secure environment.
@end quotation
@end cartouche

@geindex http.server 명령줄 옵션; --tls-cert
@anchor{library/http server cmdoption-http server-tls-cert}@anchor{229}
@deffn {Option} @w{-}@w{-}tls@w{-}cert

Specifies a TLS certificate chain for HTTPS connections:

@example
python -m http.server --tls-cert fullchain.pem
@end example


Added in version 3.14.

@end deffn

@geindex http.server 명령줄 옵션; --tls-key
@anchor{library/http server cmdoption-http server-tls-key}@anchor{22a}
@deffn {Option} @w{-}@w{-}tls@w{-}key

Specifies a private key file for HTTPS connections.

This option requires @code{--tls-cert} to be specified.


Added in version 3.14.

@end deffn

@geindex http.server 명령줄 옵션; --tls-password-file
@anchor{library/http server cmdoption-http server-tls-password-file}@anchor{22b}
@deffn {Option} @w{-}@w{-}tls@w{-}password@w{-}file

Specifies the password file for password-protected private keys:

@example
python -m http.server \
       --tls-cert cert.pem \
       --tls-key key.pem \
       --tls-password-file password.txt
@end example

This option requires @cite{–tls-cert`} to be specified.


Added in version 3.14.

@end deffn

@node Security considerations,,Command-line interface<7>,http server — HTTP 서버
@anchor{library/http server http-server-security}@anchor{4120}@anchor{library/http server security-considerations}@anchor{414b}
@subsubsection Security considerations


@geindex http.server;보안

@ref{d37,,SimpleHTTPRequestHandler} will follow symbolic links when handling
requests, this makes it possible for files outside of the specified directory
to be served.

Earlier versions of Python did not scrub control characters from the
log messages emitted to stderr from @code{python -m http.server} or the
default @ref{12d0,,BaseHTTPRequestHandler} @code{.log_message}
implementation. This could allow remote clients connecting to your
server to send nefarious control codes to your terminal.


버전 3.12에서 변경: Control characters are scrubbed in stderr logs.


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node http cookies — HTTP 상태 관리,http cookiejar — HTTP 클라이언트를 위한 쿠키 처리,http server — HTTP 서버,인터넷 프로토콜과 지원
@anchor{library/http cookies doc}@anchor{414c}@anchor{library/http cookies http-cookies-http-state-management}@anchor{414d}@anchor{library/http cookies module-http cookies}@anchor{75}@anchor{library/http cookies translation-repo}@anchor{414e}
@subsection @code{http.cookies} — HTTP 상태 관리


@geindex module; http.cookies

`소스 코드:' Lib/http/cookies.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/http/cookies.py}


__________________________________________________________________


The @code{http.cookies} module defines classes for abstracting the concept of
cookies, an HTTP state management mechanism. It supports both simple string-only
cookies, and provides an abstraction for having any serializable data-type as
cookie value.

이 모듈은 예전에는 
@geindex RFC; RFC 2109
RFC 2109@footnote{https://datatracker.ietf.org/doc/html/rfc2109.html}와 
@geindex RFC; RFC 2068
RFC 2068@footnote{https://datatracker.ietf.org/doc/html/rfc2068.html} 명세에서 설명된 구문 분석 규칙을 엄격하게 적용했습니다. 그 이후로 MSIE 3.0x가 이 명세에 명시된 문자 규칙을 따르지 않았으며; 쿠키 처리와 관련하여 오늘날의 많은 브라우저와 서버 또한 구문 분석 규칙을 완화했다는 사실이 발견되었습니다. 결과적으로, 이제 이 모듈은 이전보다 약간 덜 엄격한 구문 분석 규칙을 사용합니다.

문자 집합, @ref{14c8,,string.ascii_letters}, @ref{2746,,string.digits} 및 @code{!#$%&'*+-.^_`|~:}는 이 모듈이 쿠키 이름(@ref{dfb,,key})에 허용한 유효한 문자 집합을 나타냅니다.


버전 3.3에서 변경: ‘:’를 유효한 쿠키 이름 문자로 허용합니다.


@cartouche
@quotation 참고 
잘못된 쿠키가 발견되면, @ref{414f,,CookieError}가 발생하므로, 쿠키 데이터가 브라우저에서 제공되면 항상 잘못된 데이터일 가능성에 대비하고 구문 분석할 때 @code{CookieError}를 잡아야 합니다.
@end quotation
@end cartouche

@geindex CookieError
@anchor{library/http cookies http cookies CookieError}@anchor{414f}
@deffn {예외} http.cookies.CookieError

@geindex RFC; RFC 2109
RFC 2109@footnote{https://datatracker.ietf.org/doc/html/rfc2109.html} 위반으로 인해 실패하는 예외: 잘못된 어트리뷰트, 잘못된 @code{Set-Cookie} 헤더 등
@end deffn

@geindex BaseCookie (http.cookies 클래스)
@anchor{library/http cookies http cookies BaseCookie}@anchor{4150}
@deffn {클래스} http.cookies.BaseCookie ([input])

이 클래스는 키가 문자열이고 값이 @ref{dfa,,Morsel} 인스턴스인 딕셔너리 형 객체입니다. 키에 값을 설정하면, 값이 먼저 키와 값이 포함된 @code{Morsel}로 변환됩니다.

`input'이 주어지면, @ref{4151,,load()} 메서드로 전달됩니다.
@end deffn

@geindex SimpleCookie (http.cookies 클래스)
@anchor{library/http cookies http cookies SimpleCookie}@anchor{1e20}
@deffn {클래스} http.cookies.SimpleCookie ([input])

이 클래스는 @ref{4150,,BaseCookie}에서 파생되며 @ref{4152,,value_decode()}와 @ref{4153,,value_encode()}를 재정의합니다. @code{SimpleCookie}는 문자열 쿠키값을 지원합니다. 값을 설정할 때, @code{SimpleCookie}는 내장 @ref{169,,str()}을 호출하여 값을 문자열로 변환합니다. HTTP에서 수신된 값은 문자열로 유지됩니다.
@end deffn


@subsubheading 더 보기



@table @asis

@item 모듈 @ref{74,,http.cookiejar}

HTTP cookie handling for web `clients'.  The @ref{74,,http.cookiejar} and
@code{http.cookies} modules do not depend on each other.

@geindex RFC; RFC 2109

@item RFC 2109@footnote{https://datatracker.ietf.org/doc/html/rfc2109.html} - HTTP State Management Mechanism (HTTP 상태 관리 메커니즘)

이것은 이 모듈이 구현한 상태 관리 명세입니다.
@end table


@menu
* 쿠키 객체:: 
* Morsel 객체:: 
* 예제: 예제<25>. 

@end menu

@node 쿠키 객체,Morsel 객체,,http cookies — HTTP 상태 관리
@anchor{library/http cookies cookie-objects}@anchor{4154}@anchor{library/http cookies id1}@anchor{4155}
@subsubsection 쿠키 객체


@geindex value_decode() (http.cookies.BaseCookie 메서드)
@anchor{library/http cookies http cookies BaseCookie value_decode}@anchor{4152}
@deffn {메서드} BaseCookie.value_decode (val)

문자열 표현으로부터 튜플 @code{(real_value, coded_value)}를 반환합니다. @code{real_value}는 모든 형이 될 수 있습니다. 이 메서드는 @ref{4150,,BaseCookie}에서는 아무런 디코딩을 하지 않습니다 — 재정의할 수 있도록 존재합니다.
@end deffn

@geindex value_encode() (http.cookies.BaseCookie 메서드)
@anchor{library/http cookies http cookies BaseCookie value_encode}@anchor{4153}
@deffn {메서드} BaseCookie.value_encode (val)

튜플 @code{(real_value, coded_value)}를 반환합니다. `val'은 모든 형이 될 수 있지만, @code{coded_value}는 항상 문자열로 변환됩니다. 이 메서드는 @ref{4150,,BaseCookie}에서는 아무런 인코딩을 하지 않습니다 — 재정의할 수 있도록 존재합니다.

일반적으로, @ref{4153,,value_encode()}와 @ref{4152,,value_decode()}는 `value_decode' 범위에서 역연산입니다.
@end deffn

@geindex output() (http.cookies.BaseCookie 메서드)
@anchor{library/http cookies http cookies BaseCookie output}@anchor{4156}
@deffn {메서드} BaseCookie.output (attrs=None, header='Set-Cookie:', sep='\r\n')

HTTP 헤더로서 송신하기 적절한 문자열 표현을 반환합니다. `attrs'와 `header'는 각 @ref{dfa,,Morsel}의 @ref{4157,,output()} 메서드로 전송됩니다. `sep'는 헤더를 함께 결합하는 데 사용되며, 기본적으로 @code{'\r\n'} (CRLF) 조합입니다.
@end deffn

@geindex js_output() (http.cookies.BaseCookie 메서드)
@anchor{library/http cookies http cookies BaseCookie js_output}@anchor{175b}
@deffn {메서드} BaseCookie.js_output (attrs=None)

자바스크립트를 지원하는 브라우저에서 실행될 때 HTTP 헤더가 전송된 것처럼 작동하는, 삽입 가능한 자바스크립트 코드 조각을 반환합니다.

`attrs'의 의미는 @ref{4156,,output()}과 같습니다.
@end deffn

@geindex load() (http.cookies.BaseCookie 메서드)
@anchor{library/http cookies http cookies BaseCookie load}@anchor{4151}
@deffn {메서드} BaseCookie.load (rawdata)

`rawdata'가 문자열이면, @code{HTTP_COOKIE}로 구문 분석하고 거기에 있는 값을 @ref{dfa,,Morsel}로 추가합니다. 딕셔너리면, 다음과 동등합니다:

@example
for k, v in rawdata.items():
    cookie[k] = v
@end example
@end deffn

@node Morsel 객체,예제<25>,쿠키 객체,http cookies — HTTP 상태 관리
@anchor{library/http cookies id2}@anchor{4158}@anchor{library/http cookies morsel-objects}@anchor{4159}
@subsubsection Morsel 객체


@geindex Morsel (http.cookies 클래스)
@anchor{library/http cookies http cookies Morsel}@anchor{dfa}
@deffn {클래스} http.cookies.Morsel

@geindex RFC; RFC 2109
RFC 2109@footnote{https://datatracker.ietf.org/doc/html/rfc2109.html} 어트리뷰트를 포함하는 키/값 쌍을 추상화합니다.

Morsel은 딕셔너리류 객체이며, 키의 집합은 상수입니다 — 다음과 같은 유효한 
@geindex RFC; RFC 2109
RFC 2109@footnote{https://datatracker.ietf.org/doc/html/rfc2109.html} 어트리뷰트입니다:

@quotation

@geindex expires (http.cookies.Morsel의 속성)
@geindex path (http.cookies.Morsel의 속성)
@geindex comment (http.cookies.Morsel의 속성)
@geindex domain (http.cookies.Morsel의 속성)
@geindex secure (http.cookies.Morsel의 속성)
@geindex version (http.cookies.Morsel의 속성)
@geindex httponly (http.cookies.Morsel의 속성)
@geindex samesite (http.cookies.Morsel의 속성)
@geindex partitioned (http.cookies.Morsel의 속성)
@anchor{library/http cookies http cookies Morsel expires}@anchor{415a}
@deffn {속성} expires
@anchor{library/http cookies http cookies Morsel path}@anchor{415b}
@deffnx {속성} path
@anchor{library/http cookies http cookies Morsel comment}@anchor{415c}
@deffnx {속성} comment
@anchor{library/http cookies http cookies Morsel domain}@anchor{415d}
@deffnx {속성} domain

@deffnx {속성} max@w{-}age
@anchor{library/http cookies http cookies Morsel secure}@anchor{415e}
@deffnx {속성} secure
@anchor{library/http cookies http cookies Morsel version}@anchor{415f}
@deffnx {속성} version
@anchor{library/http cookies http cookies Morsel httponly}@anchor{15d5}
@deffnx {속성} httponly
@anchor{library/http cookies http cookies Morsel samesite}@anchor{4160}
@deffnx {속성} samesite
@anchor{library/http cookies http cookies Morsel partitioned}@anchor{4161}
@deffnx {속성} partitioned
@end deffn
@end quotation

@ref{15d5,,httponly} 어트리뷰트는 쿠키가 HTTP 요청으로만 전송되고 자바스크립트를 통해 액세스할 수 없도록 지정합니다. 이것은 교차 사이트 스크립팅의 일부 형식을 방지하기 위한 것입니다.

The attribute @ref{4160,,samesite} controls when the browser sends the cookie with
cross-site requests. This helps to mitigate CSRF attacks. Valid values are
“Strict” (only sent with same-site requests), “Lax” (sent with same-site
requests and top-level navigations), and “None” (sent with same-site and
cross-site requests). When using “None”, the “secure” attribute must also
be set, as required by modern browsers.

The attribute @ref{4161,,partitioned} indicates to user agents that these
cross-site cookies `should' only be available in the same top-level context
that the cookie was first set in. For this to be accepted by the user agent,
you `must' also set @code{Secure}.

In addition, it is recommended to use the @code{__Host} prefix when setting
partitioned cookies to make them bound to the hostname and not the
registrable domain. Read
CHIPS (Cookies Having Independent Partitioned State)@footnote{https://github.com/privacycg/CHIPS/blob/main/README.md}
for full details and examples.

키는 대소 문자를 구분하지 않으며 기본값은 @code{'@w{'}}입니다.


버전 3.5에서 변경: @code{__eq__()}는 이제 @ref{dfb,,key}와 @ref{dfc,,value}를 고려합니다.



버전 3.7에서 변경: 어트리뷰트 @ref{dfb,,key}, @ref{dfc,,value} 및 @ref{dfd,,coded_value}는 읽기 전용입니다. 설정하려면 @ref{dfe,,set()}을 사용하십시오.



버전 3.8에서 변경: @ref{4160,,samesite} 어트리뷰트에 대한 지원이 추가되었습니다.



버전 3.14에서 변경: Added support for the @ref{4161,,partitioned} attribute.

@end deffn

@geindex value (http.cookies.Morsel의 속성)
@anchor{library/http cookies http cookies Morsel value}@anchor{dfc}
@deffn {속성} Morsel.value

쿠키의 값.
@end deffn

@geindex coded_value (http.cookies.Morsel의 속성)
@anchor{library/http cookies http cookies Morsel coded_value}@anchor{dfd}
@deffn {속성} Morsel.coded_value

쿠키의 인코딩된 값 — 이것을 전송해야 합니다.
@end deffn

@geindex key (http.cookies.Morsel의 속성)
@anchor{library/http cookies http cookies Morsel key}@anchor{dfb}
@deffn {속성} Morsel.key

쿠키의 이름.
@end deffn

@geindex set() (http.cookies.Morsel 메서드)
@anchor{library/http cookies http cookies Morsel set}@anchor{dfe}
@deffn {메서드} Morsel.set (key, value, coded_value)

`key', `value' 및 `coded_value' 어트리뷰트를 설정합니다.
@end deffn

@geindex isReservedKey() (http.cookies.Morsel 메서드)
@anchor{library/http cookies http cookies Morsel isReservedKey}@anchor{4162}
@deffn {메서드} Morsel.isReservedKey (K)

`K'가 @ref{dfa,,Morsel}의 키 집합의 구성원인지를 판단합니다.
@end deffn

@geindex output() (http.cookies.Morsel 메서드)
@anchor{library/http cookies http cookies Morsel output}@anchor{4157}
@deffn {메서드} Morsel.output (attrs=None, header='Set-Cookie:')

HTTP 헤더로 보내기에 적합한, Morsel의 문자열 표현을 반환합니다. 기본적으로, `attrs'가 주어지지 않는 한, 모든 어트리뷰트가 포함됩니다. 주어지면 사용할 어트리뷰트 리스트여야 합니다. `header'는 기본적으로 @code{"Set-Cookie:"}입니다.
@end deffn

@geindex js_output() (http.cookies.Morsel 메서드)
@anchor{library/http cookies http cookies Morsel js_output}@anchor{4163}
@deffn {메서드} Morsel.js_output (attrs=None)

자바스크립트를 지원하는 브라우저에서 실행될 때, HTTP 헤더가 전송된 것처럼 작동하는, 삽입 가능한 자바스크립트 코드 조각을 반환합니다.

`attrs'의 의미는 @ref{4157,,output()}과 같습니다.
@end deffn

@geindex OutputString() (http.cookies.Morsel 메서드)
@anchor{library/http cookies http cookies Morsel OutputString}@anchor{4164}
@deffn {메서드} Morsel.OutputString (attrs=None)

둘러싸는 HTTP나 자바스크립트 없이 Morsel을 표현하는 문자열을 반환합니다.

`attrs'의 의미는 @ref{4157,,output()}과 같습니다.
@end deffn

@geindex update() (http.cookies.Morsel 메서드)
@anchor{library/http cookies http cookies Morsel update}@anchor{10c8}
@deffn {메서드} Morsel.update (values)

Morsel 딕셔너리의 값을 닥셔너리 `values'의 값으로 갱신합니다. `values' 딕셔너리의 키 중 하나라도 유효한 
@geindex RFC; RFC 2109
RFC 2109@footnote{https://datatracker.ietf.org/doc/html/rfc2109.html} 어트리뷰트가 아니면 에러를 발생시킵니다.


버전 3.5에서 변경: 유효하지 않은 키에 대해서 에러가 발생합니다.

@end deffn

@geindex copy() (http.cookies.Morsel 메서드)
@anchor{library/http cookies http cookies Morsel copy}@anchor{10c7}
@deffn {메서드} Morsel.copy (value)

Morsel 객체의 얕은 복사본을 반환합니다.


버전 3.5에서 변경: 딕셔너리 대신 Morsel 객체를 반환합니다.

@end deffn

@geindex setdefault() (http.cookies.Morsel 메서드)
@anchor{library/http cookies http cookies Morsel setdefault}@anchor{4165}
@deffn {메서드} Morsel.setdefault (key, value=None)

key가 유효한 
@geindex RFC; RFC 2109
RFC 2109@footnote{https://datatracker.ietf.org/doc/html/rfc2109.html} 어트리뷰트가 아니면 에러를 발생시킵니다. 그렇지 않으면, @ref{1278,,dict.setdefault()}와 같이 동작합니다.
@end deffn

@node 예제<25>,,Morsel 객체,http cookies — HTTP 상태 관리
@anchor{library/http cookies cookie-example}@anchor{4166}@anchor{library/http cookies example}@anchor{4167}
@subsubsection 예제


The following example demonstrates how to use the @code{http.cookies} module.

@example
>>> from http import cookies
>>> C = cookies.SimpleCookie()
>>> C["fig"] = "newton"
>>> C["sugar"] = "wafer"
>>> print(C) # generate HTTP headers
Set-Cookie: fig=newton
Set-Cookie: sugar=wafer
>>> print(C.output()) # same thing
Set-Cookie: fig=newton
Set-Cookie: sugar=wafer
>>> C = cookies.SimpleCookie()
>>> C["rocky"] = "road"
>>> C["rocky"]["path"] = "/cookie"
>>> print(C.output(header="Cookie:"))
Cookie: rocky=road; Path=/cookie
>>> print(C.output(attrs=[], header="Cookie:"))
Cookie: rocky=road
>>> C = cookies.SimpleCookie()
>>> C.load("chips=ahoy; vienna=finger") # load from a string (HTTP header)
>>> print(C)
Set-Cookie: chips=ahoy
Set-Cookie: vienna=finger
>>> C = cookies.SimpleCookie()
>>> C.load('keebler="E=everybody; L=\\"Loves\\"; fudge=;";')
>>> print(C)
Set-Cookie: keebler="E=everybody; L=\"Loves\"; fudge=;"
>>> C = cookies.SimpleCookie()
>>> C["oreo"] = "doublestuff"
>>> C["oreo"]["path"] = "/"
>>> print(C)
Set-Cookie: oreo=doublestuff; Path=/
>>> C = cookies.SimpleCookie()
>>> C["twix"] = "none for you"
>>> C["twix"].value
'none for you'
>>> C = cookies.SimpleCookie()
>>> C["number"] = 7 # equivalent to C["number"] = str(7)
>>> C["string"] = "seven"
>>> C["number"].value
'7'
>>> C["string"].value
'seven'
>>> print(C)
Set-Cookie: number=7
Set-Cookie: string=seven
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node http cookiejar — HTTP 클라이언트를 위한 쿠키 처리,xmlrpc — XMLRPC 서버와 클라이언트 모듈,http cookies — HTTP 상태 관리,인터넷 프로토콜과 지원
@anchor{library/http cookiejar doc}@anchor{4168}@anchor{library/http cookiejar http-cookiejar-cookie-handling-for-http-clients}@anchor{4169}@anchor{library/http cookiejar module-http cookiejar}@anchor{74}@anchor{library/http cookiejar translation-repo}@anchor{416a}
@subsection @code{http.cookiejar} — HTTP 클라이언트를 위한 쿠키 처리


@geindex module; http.cookiejar

`소스 코드:' Lib/http/cookiejar.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/http/cookiejar.py}


__________________________________________________________________


The @code{http.cookiejar} module defines classes for automatic handling of HTTP
cookies.  It is useful for accessing websites that require small pieces of data
– `cookies' – to be set on the client machine by an HTTP response from a
web server, and then returned to the server in later HTTP requests.

Both the regular Netscape cookie protocol and the protocol defined by
@geindex RFC; RFC 2965
RFC 2965@footnote{https://datatracker.ietf.org/doc/html/rfc2965.html} are handled.  RFC 2965 handling is switched off by default.
@geindex RFC; RFC 2109
RFC 2109@footnote{https://datatracker.ietf.org/doc/html/rfc2109.html} cookies are parsed as Netscape cookies and subsequently treated
either as Netscape or RFC 2965 cookies according to the ‘policy’ in effect.
Note that the great majority of cookies on the internet are Netscape cookies.
@code{http.cookiejar} attempts to follow the de-facto Netscape cookie protocol (which
differs substantially from that set out in the original Netscape specification),
including taking note of the @code{max-age} and @code{port} cookie-attributes
introduced with RFC 2965.

@cartouche
@quotation 참고 
@code{Set-Cookie}와 @code{Set-Cookie2} 헤더에서 발견되는 다양한 이름 붙은 파라미터(예를 들어, @code{domain}과 @code{expires})는 통상적으로 `어트리뷰트(attributes)'로 지칭됩니다. 파이썬 어트리뷰트와 구별하기 위해, 이 모듈의 설명서는 `쿠키 어트리뷰트(cookie-attribute)'라는 용어를 대신 사용합니다.
@end quotation
@end cartouche

모듈은 다음 예외를 정의합니다:

@geindex LoadError
@anchor{library/http cookiejar http cookiejar LoadError}@anchor{416b}
@deffn {예외} http.cookiejar.LoadError

@ref{416c,,FileCookieJar} 인스턴스는 파일에서 쿠키를 로드하지 못하면 이 예외를 발생시킵니다. @ref{416b,,LoadError}는 @ref{2c0,,OSError}의 서브 클래스입니다.


버전 3.3에서 변경: 이전에는 @ref{416b,,LoadError}가 @ref{1252,,IOError}의 서브 형이었습니다. 이제는 @ref{2c0,,OSError}의 별칭입니다.

@end deffn

다음과 같은 클래스가 제공됩니다:

@geindex CookieJar (http.cookiejar 클래스)
@anchor{library/http cookiejar http cookiejar CookieJar}@anchor{3f8b}
@deffn {클래스} http.cookiejar.CookieJar (policy=None)

`policy'는 @ref{416d,,CookiePolicy} 인터페이스를 구현하는 객체입니다.

@ref{3f8b,,CookieJar} 클래스는 HTTP 쿠키를 저장합니다. HTTP 요청에서 쿠키를 추출하고, HTTP 응답으로 반환합니다. 필요하면 @code{CookieJar} 인스턴스는 포함된 쿠키를 자동으로 만료합니다. 서브 클래스는 파일이나 데이터베이스에서 쿠키를 저장하고 검색하는 역할도 합니다.
@end deffn

@geindex FileCookieJar (http.cookiejar 클래스)
@anchor{library/http cookiejar http cookiejar FileCookieJar}@anchor{416c}
@deffn {클래스} http.cookiejar.FileCookieJar (filename=None, delayload=None, policy=None)

`policy'는 @ref{416d,,CookiePolicy} 인터페이스를 구현하는 객체입니다. 다른 인자에 대해서는, 해당 어트리뷰트의 설명서를 참조하십시오.

디스크의 파일에서 쿠키를 로드하고 아마도 파일에 쿠키를 저장할 수 있는 @ref{3f8b,,CookieJar}. @ref{416e,,load()}나 @ref{416f,,revert()} 메서드가 호출될 때까지 이름이 지정된 파일에서 쿠키가 로드되지 `않습니다'. 이 클래스의 서브 클래스는 @ref{4170,,FileCookieJar 서브 클래스와 웹 브라우저와의 협력} 섹션에 설명되어 있습니다.

This should not be initialized directly – use its subclasses below instead.


버전 3.8에서 변경: filename 매개 변수는 @ref{5a0,,경로류 객체}를 지원합니다.

@end deffn

@geindex CookiePolicy (http.cookiejar 클래스)
@anchor{library/http cookiejar http cookiejar CookiePolicy}@anchor{416d}
@deffn {클래스} http.cookiejar.CookiePolicy

이 클래스는 각 쿠키가 서버에서 수락되고 서버로 반환되어야 하는지를 결정하는 역할을 맡습니다.
@end deffn

@geindex DefaultCookiePolicy (http.cookiejar 클래스)
@anchor{library/http cookiejar http cookiejar DefaultCookiePolicy}@anchor{1df1}
@deffn {클래스} 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'))

생성자 인자는 키워드 인자로만 전달해야 합니다. `blocked_domains'는 쿠키를 수락하지도 쿠키를 반환하지도 않을 도메인 이름의 시퀀스입니다. `allowed_domains'가 @ref{884,,None}이 아니면, 이것이 쿠키를 수락하고 반환하는 유일한 도메인의 시퀀스입니다. `secure_protocols'는 보안 쿠키를 추가 할 수 있는 프로토콜의 시퀀스입니다. 기본적으로 `https'와 `wss'(보안 웹 소켓)는 보안 프로토콜로 간주합니다. 다른 모든 인자는, @ref{416d,,CookiePolicy}와 @ref{1df1,,DefaultCookiePolicy} 객체에 대한 설명서를 참조하십시오.

@ref{1df1,,DefaultCookiePolicy}는 Netscape와 
@geindex RFC; RFC 2965
RFC 2965@footnote{https://datatracker.ietf.org/doc/html/rfc2965.html} 쿠키를 위한 표준 수락/거부 규칙을 구현합니다. 기본적으로, 
@geindex RFC; RFC 2109
RFC 2109@footnote{https://datatracker.ietf.org/doc/html/rfc2109.html} 쿠키(즉 version 쿠키 어트리뷰트가 1인 @code{Set-Cookie} 헤더로 수신된 쿠키)는 RFC 2965 규칙에 따라 처리됩니다. 그러나, RFC 2965 처리가 꺼져 있거나 @ref{4171,,rfc2109_as_netscape}가 @code{True}이면, @ref{4172,,Cookie} 인스턴스의 @code{version} 어트리뷰트를 0으로 설정하여, @ref{3f8b,,CookieJar} 인스턴스에서 RFC 2109 쿠키를 Netscape 쿠키로 ‘다운 그레이드’ 합니다. @code{DefaultCookiePolicy}는 정책을 미세 조정할 수 있는 매개 변수도 제공합니다.
@end deffn

@geindex Cookie (http.cookiejar 클래스)
@anchor{library/http cookiejar http cookiejar Cookie}@anchor{4172}
@deffn {클래스} http.cookiejar.Cookie

This class represents Netscape, 
@geindex RFC; RFC 2109
RFC 2109@footnote{https://datatracker.ietf.org/doc/html/rfc2109.html} and 
@geindex RFC; RFC 2965
RFC 2965@footnote{https://datatracker.ietf.org/doc/html/rfc2965.html} cookies.  It is not
expected that users of @code{http.cookiejar} construct their own @code{Cookie}
instances.  Instead, if necessary, call @code{make_cookies()} on a
@ref{3f8b,,CookieJar} instance.
@end deffn


@subsubheading 더 보기



@table @asis

@item 모듈 @ref{111,,urllib.request}

자동 쿠키 처리가 지원되는 URL 열기.

@item 모듈 @ref{75,,http.cookies}

HTTP cookie classes, principally useful for server-side code.  The
@code{http.cookiejar} and @ref{75,,http.cookies} modules do not depend on each
other.

@item @indicateurl{https://curl.se/rfc/cookie_spec.html}

The specification of the original Netscape cookie protocol.  Though this is
still the dominant protocol, the ‘Netscape cookie protocol’ implemented by all
the major browsers (and @code{http.cookiejar}) only bears a passing resemblance to
the one sketched out in @code{cookie_spec.html}.

@geindex RFC; RFC 2109

@item RFC 2109@footnote{https://datatracker.ietf.org/doc/html/rfc2109.html} - HTTP 상태 관리 메커니즘

@geindex RFC; RFC 2965
RFC 2965@footnote{https://datatracker.ietf.org/doc/html/rfc2965.html}로 개정되었습니다. version=1 인 @code{Set-Cookie}를 사용합니다.

@geindex RFC; RFC 2965

@item RFC 2965@footnote{https://datatracker.ietf.org/doc/html/rfc2965.html} - HTTP 상태 관리 메커니즘

버그가 수정된 Netscape 프로토콜. @code{Set-Cookie} 대신 @code{Set-Cookie2}를 사용합니다. 널리 사용되지 않습니다.

@item @indicateurl{https://kristol.org/cookie/errata.html}

완료되지 않은 
@geindex RFC; RFC 2965
RFC 2965@footnote{https://datatracker.ietf.org/doc/html/rfc2965.html}의 정오표.
@end table

@geindex RFC; RFC 2964
RFC 2964@footnote{https://datatracker.ietf.org/doc/html/rfc2964.html} - HTTP 상태 관리 사용


@menu
* CookieJar와 FileCookieJar 객체:: 
* FileCookieJar 서브 클래스와 웹 브라우저와의 협력:: 
* CookiePolicy 객체:: 
* DefaultCookiePolicy 객체:: 
* Cookie 객체:: 
* 예: 예<14>. 

@end menu

@node CookieJar와 FileCookieJar 객체,FileCookieJar 서브 클래스와 웹 브라우저와의 협력,,http cookiejar — HTTP 클라이언트를 위한 쿠키 처리
@anchor{library/http cookiejar cookie-jar-objects}@anchor{4173}@anchor{library/http cookiejar cookiejar-and-filecookiejar-objects}@anchor{4174}
@subsubsection CookieJar와 FileCookieJar 객체


@ref{3f8b,,CookieJar} 객체는 포함된 @ref{4172,,Cookie} 객체를 이터레이트 하기 위한 @ref{4ca,,이터레이터} 프로토콜을 지원합니다.

@ref{3f8b,,CookieJar}에는 다음과 같은 메서드가 있습니다:

@geindex add_cookie_header() (http.cookiejar.CookieJar 메서드)
@anchor{library/http cookiejar http cookiejar CookieJar add_cookie_header}@anchor{4175}
@deffn {메서드} CookieJar.add_cookie_header (request)

`request'에 올바른 @code{Cookie} 헤더를 추가합니다.

정책이 허용하면 (즉, @ref{3f8b,,CookieJar}의 @ref{416d,,CookiePolicy} 인스턴스의 @code{rfc2965}와 @code{hide_cookie2} 어트리뷰트가 각각 참과 거짓이면), @code{Cookie2} 헤더도 적절한 경우 추가됩니다.

`request' 객체(일반적으로 @ref{11d7,,urllib.request.Request} 인스턴스)는 @ref{111,,urllib.request}에 설명되어 있듯이 @code{get_full_url()}, @code{has_header()}, @code{get_header()}, @code{header_items()}, @code{add_unredirected_header()} 및 어트리뷰트 @code{host}, @code{type}, @code{unverifiable}, @code{origin_req_host}를 지원해야 합니다.


버전 3.3에서 변경: `request' 객체에는 @code{origin_req_host} 어트리뷰트가 필요합니다. 폐지된 메서드 @code{get_origin_req_host()}에 대한 의존성이 제거되었습니다.

@end deffn

@geindex extract_cookies() (http.cookiejar.CookieJar 메서드)
@anchor{library/http cookiejar http cookiejar CookieJar extract_cookies}@anchor{4176}
@deffn {메서드} CookieJar.extract_cookies (response, request)

HTTP `response'에서 쿠키를 추출하여 정책이 허용하면 @ref{3f8b,,CookieJar}에 저장합니다.

@ref{3f8b,,CookieJar}는 `response' 인자에서 수락할 수 있는 @code{Set-Cookie}와 @code{Set-Cookie2} 헤더를 찾고, 쿠키를 적절하게 저장합니다 (@ref{4177,,CookiePolicy.set_ok()} 메서드의 승인에 따라).

`response' 객체(일반적으로 @ref{307,,urllib.request.urlopen()} 호출의 결과, 또는 유사한 것)는 @ref{580,,email.message.Message} 인스턴스를 반환하는 @code{info()} 메서드를 지원해야 합니다.

`request' 객체(일반적으로 @ref{11d7,,urllib.request.Request} 인스턴스)는 @ref{111,,urllib.request}에 설명되어 있듯이 메서드 @code{get_full_url()} 과 어트리뷰트 @code{host}, @code{unverifiable} 및 @code{origin_req_host}를 지원해야 합니다. request는 쿠키를 설정할 수 있는지 확인하는 것뿐만 아니라 쿠키 어트리뷰트의 기본값을 설정하는 데 사용됩니다.


버전 3.3에서 변경: `request' 객체에는 @code{origin_req_host} 어트리뷰트가 필요합니다. 폐지된 메서드 @code{get_origin_req_host()}에 대한 의존성이 제거되었습니다.

@end deffn

@geindex set_policy() (http.cookiejar.CookieJar 메서드)
@anchor{library/http cookiejar http cookiejar CookieJar set_policy}@anchor{4178}
@deffn {메서드} CookieJar.set_policy (policy)

사용할 @ref{416d,,CookiePolicy} 인스턴스를 설정합니다.
@end deffn

@geindex make_cookies() (http.cookiejar.CookieJar 메서드)
@anchor{library/http cookiejar http cookiejar CookieJar make_cookies}@anchor{4179}
@deffn {메서드} CookieJar.make_cookies (response, request)

`response' 객체에서 추출한 @ref{4172,,Cookie} 객체의 시퀀스를 반환합니다.

`response'와 `request' 인자에 필요한 인터페이스는 @ref{4176,,extract_cookies()} 설명서를 참조하십시오.
@end deffn

@geindex set_cookie_if_ok() (http.cookiejar.CookieJar 메서드)
@anchor{library/http cookiejar http cookiejar CookieJar set_cookie_if_ok}@anchor{417a}
@deffn {메서드} CookieJar.set_cookie_if_ok (cookie, request)

정책이 그래도 좋다고 한다면 @ref{4172,,Cookie}를 설정합니다.
@end deffn

@geindex set_cookie() (http.cookiejar.CookieJar 메서드)
@anchor{library/http cookiejar http cookiejar CookieJar set_cookie}@anchor{417b}
@deffn {메서드} CookieJar.set_cookie (cookie)

설정할 수 있는지 정책을 확인하지 않고, @ref{4172,,Cookie}를 설정합니다.
@end deffn

@geindex clear() (http.cookiejar.CookieJar 메서드)
@anchor{library/http cookiejar http cookiejar CookieJar clear}@anchor{417c}
@deffn {메서드} CookieJar.clear ([domain[, path[, name]]])

일부 쿠키를 지웁니다.

인자 없이 호출되면, 모든 쿠키를 지웁니다. 단일 인자가 제공되면, 해당 `domain'에 속하는 쿠키만 제거됩니다. 두 개의 인자가 제공되면, 지정된 `domain'과 URL `path'에 속하는 쿠키가 제거됩니다. 세 개의 인자가 제공되면, 지정된 `domain', `path' 및 `name'을 갖는 쿠키가 제거됩니다.

일치하는 쿠키가 없으면 @ref{5e5,,KeyError}를 발생시킵니다.
@end deffn

@geindex clear_session_cookies() (http.cookiejar.CookieJar 메서드)
@anchor{library/http cookiejar http cookiejar CookieJar clear_session_cookies}@anchor{417d}
@deffn {메서드} CookieJar.clear_session_cookies ()

모든 세션 쿠키를 폐기합니다.

실제 @code{discard} 어트리뷰트를 갖는 모든 쿠키를 폐기합니다 (보통 @code{max-age}나 @code{expires} 쿠키 어트리뷰트가 없기 때문에, 혹은 명시적인 @code{discard} 쿠키 어트리뷰트). 대화식 브라우저의 경우, 세션의 끝은 일반적으로 브라우저 창을 닫는 것에 해당합니다.

@code{save()} 메서드는 참값의 `ignore_discard' 인자를 전달하여 다르게 요청하지 않는 한 세션 쿠키를 저장하지 않음에 유의하십시오.
@end deffn

@ref{416c,,FileCookieJar}는 다음과 같은 추가 메서드를 구현합니다:

@geindex save() (http.cookiejar.FileCookieJar 메서드)
@anchor{library/http cookiejar http cookiejar FileCookieJar save}@anchor{417e}
@deffn {메서드} FileCookieJar.save (filename=None, ignore_discard=False, ignore_expires=False)

쿠키를 파일에 저장합니다.

이 베이스 클래스는 @ref{36b,,NotImplementedError}를 발생시킵니다. 서브 클래스는 이 메서드를 구현하지 않은 채로 둘 수 있습니다.

`filename'은 쿠키를 저장할 파일의 이름입니다. `filename'을 지정하지 않으면, @code{self.filename}이 사용됩니다 (이것의 기본값은 생성자에게 전달된 값입니다, 있다면); @code{self.filename}이 @ref{884,,None}이면 @ref{2ec,,ValueError}가 발생합니다.

`ignore_discard': 폐기되는 것으로 설정된 쿠키도 저장합니다. `ignore_expires': 만료된 쿠키도 저장합니다

파일이 이미 존재하면, 파일을 덮어써서, 파일에 포함된 모든 쿠키를 지웁니다. 저장된 쿠키는 나중에 @ref{416e,,load()}나 @ref{416f,,revert()} 메서드를 사용하여 복원할 수 있습니다.
@end deffn

@geindex load() (http.cookiejar.FileCookieJar 메서드)
@anchor{library/http cookiejar http cookiejar FileCookieJar load}@anchor{416e}
@deffn {메서드} FileCookieJar.load (filename=None, ignore_discard=False, ignore_expires=False)

파일에서 쿠키를 로드합니다.

새로 로드한 쿠키가 덮어쓰지 않는 한 오래된 쿠키는 유지됩니다.

인자는 @ref{417e,,save()}와 같습니다.

명명된 파일은 클래스가 이해하는 형식이어야 하고, 그렇지 않으면 @ref{416b,,LoadError}가 발생합니다. 또한, 예를 들어 파일이 존재하지 않으면, @ref{2c0,,OSError}가 발생할 수 있습니다.


버전 3.3에서 변경: @ref{1252,,IOError}가 발생했었지만, 이제는 @ref{2c0,,OSError}의 별칭입니다.

@end deffn

@geindex revert() (http.cookiejar.FileCookieJar 메서드)
@anchor{library/http cookiejar http cookiejar FileCookieJar revert}@anchor{416f}
@deffn {메서드} FileCookieJar.revert (filename=None, ignore_discard=False, ignore_expires=False)

모든 쿠키를 지우고 저장된 파일에서 쿠키를 다시 로드합니다.

@ref{416f,,revert()}는 @ref{416e,,load()}와 같은 예외를 발생시킬 수 있습니다. 실패가 일어나면, 객체 상태는 변경되지 않습니다.
@end deffn

@ref{416c,,FileCookieJar} 인스턴스에는 다음과 같은 공용 어트리뷰트가 있습니다:

@geindex filename (http.cookiejar.FileCookieJar의 속성)
@anchor{library/http cookiejar http cookiejar FileCookieJar filename}@anchor{417f}
@deffn {속성} FileCookieJar.filename

쿠키를 보관할 기본 파일의 파일명. 이 어트리뷰트는 대입할 수 있습니다.
@end deffn

@geindex delayload (http.cookiejar.FileCookieJar의 속성)
@anchor{library/http cookiejar http cookiejar FileCookieJar delayload}@anchor{4180}
@deffn {속성} FileCookieJar.delayload

참이면, 디스크에서 쿠키를 천천히(lazily) 로드합니다. 이 어트리뷰트는 대입하지 않아야 합니다. (디스크의 쿠키가 변경되지 않는 한) 성능에만 영향을 미칠 뿐 동작을 바꾸지는 않기 때문에, 이것은 힌트일 뿐입니다. @ref{3f8b,,CookieJar} 객체는 이를 무시할 수 있습니다. 표준 라이브러리에 포함된 @ref{416c,,FileCookieJar} 클래스는 아무것도 쿠키를 천천히 로드하지 않습니다.
@end deffn

@node FileCookieJar 서브 클래스와 웹 브라우저와의 협력,CookiePolicy 객체,CookieJar와 FileCookieJar 객체,http cookiejar — HTTP 클라이언트를 위한 쿠키 처리
@anchor{library/http cookiejar file-cookie-jar-classes}@anchor{4170}@anchor{library/http cookiejar filecookiejar-subclasses-and-co-operation-with-web-browsers}@anchor{4181}
@subsubsection FileCookieJar 서브 클래스와 웹 브라우저와의 협력


다음 @ref{3f8b,,CookieJar} 서브 클래스는 읽기와 쓰기를 위해 제공됩니다.

@geindex MozillaCookieJar (http.cookiejar 클래스)
@anchor{library/http cookiejar http cookiejar MozillaCookieJar}@anchor{4182}
@deffn {클래스} http.cookiejar.MozillaCookieJar (filename=None, delayload=None, policy=None)

Mozilla @code{cookies.txt} 파일 형식(curl, Lynx 및 Netscape 브라우저에서도 사용됩니다)으로 디스크에서 쿠키를 로드하고 저장할 수 있는 @ref{416c,,FileCookieJar}.

@cartouche
@quotation 참고 
@geindex RFC; RFC 2965
RFC 2965@footnote{https://datatracker.ietf.org/doc/html/rfc2965.html} 쿠키에 대한 정보와, @code{port} 같은 최신이나 비표준 쿠키 어트리뷰트에 대한 정보가 손실됩니다.
@end quotation
@end cartouche

@cartouche
@quotation 경고 
손실/손상이 불편한 쿠키가 있다면 저장하기 전에 쿠키를 백업하십시오 (로드/저장 왕복으로 인해 파일이 약간 변경될 수 있는 미묘한 부분이 있습니다).
@end quotation
@end cartouche

또한 Mozilla가 실행되는 동안 저장된 쿠키는 Mozilla에 의해 방해를 받음에 유의하십시오.
@end deffn

@geindex LWPCookieJar (http.cookiejar 클래스)
@anchor{library/http cookiejar http cookiejar LWPCookieJar}@anchor{4183}
@deffn {클래스} http.cookiejar.LWPCookieJar (filename=None, delayload=None, policy=None)

libwww-perl 라이브러리의 @code{Set-Cookie3} 파일 형식과 호환되는 형식으로 쿠키를 디스크에서 로드하고 저장할 수 있는 @ref{416c,,FileCookieJar}. 사람이 읽을 수 있는 파일에 쿠키를 저장하려는 경우에 편리합니다.


버전 3.8에서 변경: filename 매개 변수는 @ref{5a0,,경로류 객체}를 지원합니다.

@end deffn

@node CookiePolicy 객체,DefaultCookiePolicy 객체,FileCookieJar 서브 클래스와 웹 브라우저와의 협력,http cookiejar — HTTP 클라이언트를 위한 쿠키 처리
@anchor{library/http cookiejar cookie-policy-objects}@anchor{4184}@anchor{library/http cookiejar cookiepolicy-objects}@anchor{4185}
@subsubsection CookiePolicy 객체


@ref{416d,,CookiePolicy} 인터페이스를 구현하는 객체에는 다음과 같은 메서드가 있습니다:

@geindex set_ok() (http.cookiejar.CookiePolicy 메서드)
@anchor{library/http cookiejar http cookiejar CookiePolicy set_ok}@anchor{4177}
@deffn {메서드} CookiePolicy.set_ok (cookie, request)

서버에서 쿠키를 수락해야 하는지를 나타내는 불리언 값을 반환합니다.

`cookie'는 @ref{4172,,Cookie} 인스턴스입니다. `request'는 @ref{4176,,CookieJar.extract_cookies()} 설명서에서 정의한 인터페이스를 구현하는 객체입니다.
@end deffn

@geindex return_ok() (http.cookiejar.CookiePolicy 메서드)
@anchor{library/http cookiejar http cookiejar CookiePolicy return_ok}@anchor{4186}
@deffn {메서드} CookiePolicy.return_ok (cookie, request)

쿠키를 서버로 반환해야 하는지를 나타내는 불리언 값을 반환합니다.

`cookie'는 @ref{4172,,Cookie} 인스턴스입니다. `request'는 @ref{4175,,CookieJar.add_cookie_header()} 설명서에서 정의한 인터페이스를 구현하는 객체입니다.
@end deffn

@geindex domain_return_ok() (http.cookiejar.CookiePolicy 메서드)
@anchor{library/http cookiejar http cookiejar CookiePolicy domain_return_ok}@anchor{4187}
@deffn {메서드} CookiePolicy.domain_return_ok (domain, request)

주어진 쿠키 도메인(domain)에서, 쿠키를 반환하지 않아야 하면 @code{False}를 반환합니다.

이 메서드는 최적화입니다. 특정 도메인을 가진 모든 쿠키를 검사할 필요(많은 파일을 읽는 것을 수반합니다)를 제거합니다. @ref{4187,,domain_return_ok()}와 @ref{4188,,path_return_ok()}에서 참을 반환하면 모든 작업이 @ref{4186,,return_ok()}로 넘어갑니다.

쿠키 도메인에 대해 @ref{4187,,domain_return_ok()}가 참을 반환하면, 쿠키 경로에 대해 @ref{4188,,path_return_ok()}가 호출됩니다. 그렇지 않으면, 해당 쿠키 도메인에 대해 @code{path_return_ok()}와 @ref{4186,,return_ok()}가 호출되지 않습니다. @code{path_return_ok()}가 참을 반환하면, @code{return_ok()}가 @ref{4172,,Cookie} 객체 자체로 호출되어 전체 검사를 수행합니다. 그렇지 않으면, 해당 쿠키 경로에 대해 @code{return_ok()}가 호출되지 않습니다.

@ref{4187,,domain_return_ok()}는 `request' 도메인뿐만 아니라 모든 `cookie' 도메인에 대해 호출됨에 유의하십시오. 예를 들어, 요청 도메인이 @code{"www.example.com"}이면 함수는 @code{".example.com"}과 @code{"www.example.com"} 모두에 대해 호출될 수 있습니다. @ref{4188,,path_return_ok()}도 마찬가지입니다.

`request' 인자는 @ref{4186,,return_ok()}에 대해 설명된 대로입니다.
@end deffn

@geindex path_return_ok() (http.cookiejar.CookiePolicy 메서드)
@anchor{library/http cookiejar http cookiejar CookiePolicy path_return_ok}@anchor{4188}
@deffn {메서드} CookiePolicy.path_return_ok (path, request)

주어진 쿠키 경로에 대해, 쿠키를 반환하지 않아야 하면 @code{False}를 반환합니다.

@ref{4187,,domain_return_ok()} 설명서를 참조하십시오.
@end deffn

위의 메서드를 구현하는 것 외에도, @ref{416d,,CookiePolicy} 인터페이스의 구현은 어떤 프로토콜을 어떻게 사용해야 하는지를 나타내는 다음 어트리뷰트도 제공해야 합니다. 이러한 모든 어트리뷰트는 대입할 수 있습니다.

@geindex netscape (http.cookiejar.CookiePolicy의 속성)
@anchor{library/http cookiejar http cookiejar CookiePolicy netscape}@anchor{4189}
@deffn {속성} CookiePolicy.netscape

Netscape 프로토콜을 구현합니다.
@end deffn

@geindex rfc2965 (http.cookiejar.CookiePolicy의 속성)
@anchor{library/http cookiejar http cookiejar CookiePolicy rfc2965}@anchor{418a}
@deffn {속성} CookiePolicy.rfc2965

@geindex RFC; RFC 2965
RFC 2965@footnote{https://datatracker.ietf.org/doc/html/rfc2965.html} 프로토콜을 구현합니다.
@end deffn

@geindex hide_cookie2 (http.cookiejar.CookiePolicy의 속성)
@anchor{library/http cookiejar http cookiejar CookiePolicy hide_cookie2}@anchor{418b}
@deffn {속성} CookiePolicy.hide_cookie2

요청에 @code{Cookie2} 헤더를 추가하지 않습니다 (이 헤더가 있으면 서버에게 우리가 
@geindex RFC; RFC 2965
RFC 2965@footnote{https://datatracker.ietf.org/doc/html/rfc2965.html} 쿠키를 이해하고 있음을 알립니다).
@end deffn

@ref{416d,,CookiePolicy} 클래스를 정의하는 가장 유용한 방법은 @ref{1df1,,DefaultCookiePolicy} 에서 서브 클래싱하고 위의 메서드 중 일부나 전부를 재정의하는 것입니다. @code{CookiePolicy} 자체는 모든 쿠키를 설정하고 수신하도록 허용하는 ‘널 정책’으로 사용될 수 있습니다 (이 정책이 그리 유용하지는 않을 것입니다).

@node DefaultCookiePolicy 객체,Cookie 객체,CookiePolicy 객체,http cookiejar — HTTP 클라이언트를 위한 쿠키 처리
@anchor{library/http cookiejar default-cookie-policy-objects}@anchor{418c}@anchor{library/http cookiejar defaultcookiepolicy-objects}@anchor{418d}
@subsubsection DefaultCookiePolicy 객체


쿠키 수락과 반환에 대한 표준 규칙을 구현합니다.

@geindex RFC; RFC 2965
RFC 2965@footnote{https://datatracker.ietf.org/doc/html/rfc2965.html}와 Netscape 쿠키를 모두 다룹니다. RFC 2965 처리는 기본적으로 꺼져있습니다.

자체 정책을 제공하는 가장 쉬운 방법은 이 클래스를 재정의하고 자체 검사를 추가하기 전에 재정의된 구현에서 해당 메서드를 호출하는 것입니다:

@example
import http.cookiejar
class MyCookiePolicy(http.cookiejar.DefaultCookiePolicy):
    def set_ok(self, cookie, request):
        if not http.cookiejar.DefaultCookiePolicy.set_ok(self, cookie, request):
            return False
        if i_dont_want_to_store_this_cookie(cookie):
            return False
        return True
@end example

@ref{416d,,CookiePolicy} 인터페이스를 구현하는 데 필요한 기능 외에도, 이 클래스를 사용하면 도메인이 쿠키를 설정하고 수신하는 것을 차단하고 허락할 수 있도록 합니다. 또한 다소 느슨한 Netscape 프로토콜 규칙을 약간 강화할 수 있는 몇 가지 엄격성 스위치가 있습니다 (일부 양성 쿠키를 차단하는 대가를 치르면서).

도메인 차단 목록과 수락 목록이 제공됩니다 (둘 다 기본적으로 꺼져있습니다). 차단 목록에 없고 수락 목록에 있는(수락 목록이 활성화되었다면) 도메인만 쿠키 설정과 반환에 참여합니다. `blocked_domains' 생성자 인자와 @code{blocked_domains()} 및 @code{set_blocked_domains()} 메서드 (그리고 `allowed_domains'를 위한 해당 인자와 메서드)를 사용하십시오. 수락 목록을 설정하면, @ref{884,,None}으로 설정하여 수락 목록을 다시 끌 수 있습니다.

점으로 시작하지 않는 차단 또는 수락 목록에 있는 도메인은 일치할 쿠키 도메인과 같아야 합니다. 예를 들어, @code{"example.com"}은 차단 목록 항목 @code{"example.com"}과 일치하지만, @code{"www.example.com"}은 일치하지 않습니다. 점으로 시작하는 도메인은 더 구체적인 도메인과도 일치합니다. 예를 들어, @code{"www.example.com"}과 @code{"www.coyote.example.com"}은 모두 @code{".example.com"}과 일치합니다 (하지만 @code{"example.com"} 자체는 일치하지 않습니다). IP 주소는 예외이며, 정확히 일치해야 합니다. 예를 들어, blocked_domains에 @code{"192.168.1.2"}와 @code{".168.1.2"}가 포함되어 있으면, 192.168.1.2는 차단되지만, 193.168.1.2는 차단되지 않습니다.

@ref{1df1,,DefaultCookiePolicy}는 다음과 같은 추가 메서드를 구현합니다:

@geindex blocked_domains() (http.cookiejar.DefaultCookiePolicy 메서드)
@anchor{library/http cookiejar http cookiejar DefaultCookiePolicy blocked_domains}@anchor{418e}
@deffn {메서드} DefaultCookiePolicy.blocked_domains ()

차단된 도메인 시퀀스를 반환합니다 (튜플로).
@end deffn

@geindex set_blocked_domains() (http.cookiejar.DefaultCookiePolicy 메서드)
@anchor{library/http cookiejar http cookiejar DefaultCookiePolicy set_blocked_domains}@anchor{418f}
@deffn {메서드} DefaultCookiePolicy.set_blocked_domains (blocked_domains)

차단된 도메인 시퀀스를 설정합니다.
@end deffn

@geindex is_blocked() (http.cookiejar.DefaultCookiePolicy 메서드)
@anchor{library/http cookiejar http cookiejar DefaultCookiePolicy is_blocked}@anchor{4190}
@deffn {메서드} DefaultCookiePolicy.is_blocked (domain)

`domain'이 쿠키 설정이나 수신에 대한 차단 목록에 있으면 @code{True}를 반환합니다.
@end deffn

@geindex allowed_domains() (http.cookiejar.DefaultCookiePolicy 메서드)
@anchor{library/http cookiejar http cookiejar DefaultCookiePolicy allowed_domains}@anchor{4191}
@deffn {메서드} DefaultCookiePolicy.allowed_domains ()

@ref{884,,None}, 또는 수락 도메인 시퀀스를 반환합니다 (튜플).
@end deffn

@geindex set_allowed_domains() (http.cookiejar.DefaultCookiePolicy 메서드)
@anchor{library/http cookiejar http cookiejar DefaultCookiePolicy set_allowed_domains}@anchor{4192}
@deffn {메서드} DefaultCookiePolicy.set_allowed_domains (allowed_domains)

수락 도메인 시퀀스, 또는 @ref{884,,None}을 설정합니다.
@end deffn

@geindex is_not_allowed() (http.cookiejar.DefaultCookiePolicy 메서드)
@anchor{library/http cookiejar http cookiejar DefaultCookiePolicy is_not_allowed}@anchor{4193}
@deffn {메서드} DefaultCookiePolicy.is_not_allowed (domain)

`domain'이 쿠키 설정이나 수신에 대한 수락 목록에 있으면 @code{True}를 반환합니다.
@end deffn

@ref{1df1,,DefaultCookiePolicy} 인스턴스에는 다음과 같은 어트리뷰트가 있습니다. 이 어트리뷰트들은 모두 같은 이름의 생성자 인자로 초기화되며, 모두 대입할 수 있습니다.

@geindex rfc2109_as_netscape (http.cookiejar.DefaultCookiePolicy의 속성)
@anchor{library/http cookiejar http cookiejar DefaultCookiePolicy rfc2109_as_netscape}@anchor{4171}
@deffn {속성} DefaultCookiePolicy.rfc2109_as_netscape

참이면, @ref{3f8b,,CookieJar} 인스턴스가 @ref{4172,,Cookie} 인스턴스의 version 쿠키 어트리뷰트를 0으로 설정하여 
@geindex RFC; RFC 2109
RFC 2109@footnote{https://datatracker.ietf.org/doc/html/rfc2109.html} 쿠키(즉, @code{Set-Cookie} 헤더에서 수신된 version 쿠키 어트리뷰트가 1인 쿠키)를 Netscape 쿠키로 다운 그레이드하도록 요청합니다. 기본값은 @ref{884,,None}입니다, 이 경우 
@geindex RFC; RFC 2965
RFC 2965@footnote{https://datatracker.ietf.org/doc/html/rfc2965.html} 처리가 꺼졌을 때만 RFC 2109 쿠키가 다운 그레이드됩니다. 따라서, RFC 2109 쿠키는 기본적으로 다운 그레이드됩니다.
@end deffn

일반 엄격성 스위치:

@geindex strict_domain (http.cookiejar.DefaultCookiePolicy의 속성)
@anchor{library/http cookiejar http cookiejar DefaultCookiePolicy strict_domain}@anchor{4194}
@deffn {속성} DefaultCookiePolicy.strict_domain

사이트가 @code{.co.uk}, @code{.gov.uk}, @code{.co.nz} 등의 국가 코드 최상위 도메인으로 2개의 구성 요소 도메인을 설정하는 것을 수락하지 않습니다. 이것은 완벽하지는 않으며 작동하지 않을 수도 있습니다!
@end deffn

@geindex RFC; RFC 2965
RFC 2965@footnote{https://datatracker.ietf.org/doc/html/rfc2965.html} 프로토콜 엄격성 스위치:

@geindex strict_rfc2965_unverifiable (http.cookiejar.DefaultCookiePolicy의 속성)
@anchor{library/http cookiejar http cookiejar DefaultCookiePolicy strict_rfc2965_unverifiable}@anchor{4195}
@deffn {속성} DefaultCookiePolicy.strict_rfc2965_unverifiable

확인할 수 없는 트랜잭션(unverifiable transactions)에 대한 
@geindex RFC; RFC 2965
RFC 2965@footnote{https://datatracker.ietf.org/doc/html/rfc2965.html} 규칙을 따릅니다 (일반적으로 확인할 수 없는 트랜잭션은 다른 사이트에서 호스팅 되는 이미지에 대한 리디렉션이나 요청으로 인한 결과입니다). 이것이 거짓이면, 확인 가능성에 기초하여 쿠키가 차단되지 `않습니다'.
@end deffn

넷스케이프 프로토콜 엄격성 스위치:

@geindex strict_ns_unverifiable (http.cookiejar.DefaultCookiePolicy의 속성)
@anchor{library/http cookiejar http cookiejar DefaultCookiePolicy strict_ns_unverifiable}@anchor{4196}
@deffn {속성} DefaultCookiePolicy.strict_ns_unverifiable

Netscape 쿠키에도 확인할 수 없는 트랜잭션에 대한 
@geindex RFC; RFC 2965
RFC 2965@footnote{https://datatracker.ietf.org/doc/html/rfc2965.html} 규칙을 적용합니다.
@end deffn

@geindex strict_ns_domain (http.cookiejar.DefaultCookiePolicy의 속성)
@anchor{library/http cookiejar http cookiejar DefaultCookiePolicy strict_ns_domain}@anchor{4197}
@deffn {속성} DefaultCookiePolicy.strict_ns_domain

Netscape 쿠키에 대한 도메인 일치 규칙이 얼마나 엄격한지를 나타내는 플래그. 허용 가능한 값은 아래를 참조하십시오.
@end deffn

@geindex strict_ns_set_initial_dollar (http.cookiejar.DefaultCookiePolicy의 속성)
@anchor{library/http cookiejar http cookiejar DefaultCookiePolicy strict_ns_set_initial_dollar}@anchor{4198}
@deffn {속성} DefaultCookiePolicy.strict_ns_set_initial_dollar

이름이 @code{'$'}로 시작하는 Set-Cookie: 헤더의 쿠키를 무시합니다.
@end deffn

@geindex strict_ns_set_path (http.cookiejar.DefaultCookiePolicy의 속성)
@anchor{library/http cookiejar http cookiejar DefaultCookiePolicy strict_ns_set_path}@anchor{4199}
@deffn {속성} DefaultCookiePolicy.strict_ns_set_path

경로가 요청 URI와 경로 일치하지 않는 쿠키 설정을 수락하지 않습니다.
@end deffn

@ref{4197,,strict_ns_domain} is a collection of flags.  Its value is constructed by
or-ing together (for example, @code{DomainStrictNoDots|DomainStrictNonDomain} means
both flags are set).

@geindex DomainStrictNoDots (http.cookiejar.DefaultCookiePolicy의 속성)
@anchor{library/http cookiejar http cookiejar DefaultCookiePolicy DomainStrictNoDots}@anchor{419a}
@deffn {속성} DefaultCookiePolicy.DomainStrictNoDots

쿠키를 설정할 때, ‘호스트 접두사’에는 점이 없어야 합니다 (예를 들어 @code{www.foo}에 점이 있어서, @code{www.foo.bar.com}이 @code{.bar.com}에 대한 쿠키를 설정할 수 없습니다).
@end deffn

@geindex DomainStrictNonDomain (http.cookiejar.DefaultCookiePolicy의 속성)
@anchor{library/http cookiejar http cookiejar DefaultCookiePolicy DomainStrictNonDomain}@anchor{419b}
@deffn {속성} DefaultCookiePolicy.DomainStrictNonDomain

@code{domain} 쿠키 어트리뷰트를 명시적으로 지정하지 않은 쿠키는 쿠키를 설정한 도메인과 같은 도메인으로만 반환될 수 있습니다 (예를 들어 @code{spam.example.com}으로는 @code{domain} 쿠키 어트리뷰트가 없는 @code{example.com}의 쿠키를 반환하지 않습니다).
@end deffn

@geindex DomainRFC2965Match (http.cookiejar.DefaultCookiePolicy의 속성)
@anchor{library/http cookiejar http cookiejar DefaultCookiePolicy DomainRFC2965Match}@anchor{419c}
@deffn {속성} DefaultCookiePolicy.DomainRFC2965Match

쿠키를 설정할 때, 전체 
@geindex RFC; RFC 2965
RFC 2965@footnote{https://datatracker.ietf.org/doc/html/rfc2965.html} 도메인 일치가 필요합니다.
@end deffn

편의를 위해 다음 어트리뷰트가 제공되며, 위 플래그의 가장 유용한 조합입니다:

@geindex DomainLiberal (http.cookiejar.DefaultCookiePolicy의 속성)
@anchor{library/http cookiejar http cookiejar DefaultCookiePolicy DomainLiberal}@anchor{419d}
@deffn {속성} DefaultCookiePolicy.DomainLiberal

0과 동등합니다 (즉, 위의 모든 Netscape 도메인 엄격성 플래그가 꺼집니다).
@end deffn

@geindex DomainStrict (http.cookiejar.DefaultCookiePolicy의 속성)
@anchor{library/http cookiejar http cookiejar DefaultCookiePolicy DomainStrict}@anchor{419e}
@deffn {속성} DefaultCookiePolicy.DomainStrict

@code{DomainStrictNoDots|DomainStrictNonDomain} 과 동등합니다.
@end deffn

@node Cookie 객체,예<14>,DefaultCookiePolicy 객체,http cookiejar — HTTP 클라이언트를 위한 쿠키 처리
@anchor{library/http cookiejar cookie-objects}@anchor{419f}
@subsubsection Cookie 객체


@ref{4172,,Cookie} instances have Python attributes roughly corresponding to the
standard cookie-attributes specified in the various cookie standards.  The
correspondence is not one-to-one, because there are complicated rules for
assigning default values, because the @code{max-age} and @code{expires}
cookie-attributes contain equivalent information, and because 
@geindex RFC; RFC 2109
RFC 2109@footnote{https://datatracker.ietf.org/doc/html/rfc2109.html} cookies
may be ‘downgraded’ by @code{http.cookiejar} from version 1 to version 0 (Netscape)
cookies.

@ref{416d,,CookiePolicy} 메서드에서의 드문 경우를 제외하고 이러한 어트리뷰트에 대입할 필요는 없습니다. 이 클래스는 내부 일관성을 강요하지 않기 때문에, 그렇게 한다면 무엇을 하고 있는지 알아야 합니다.

@geindex version (http.cookiejar.Cookie의 속성)
@anchor{library/http cookiejar http cookiejar Cookie version}@anchor{41a0}
@deffn {속성} Cookie.version

Integer or @ref{884,,None}.  Netscape cookies have @ref{41a0,,version} 0. 
@geindex RFC; RFC 2965
RFC 2965@footnote{https://datatracker.ietf.org/doc/html/rfc2965.html} and
@geindex RFC; RFC 2109
RFC 2109@footnote{https://datatracker.ietf.org/doc/html/rfc2109.html} cookies have a @code{version} cookie-attribute of 1.  However, note that
@code{http.cookiejar} may ‘downgrade’ RFC 2109 cookies to Netscape cookies, in which
case @code{version} is 0.
@end deffn

@geindex name (http.cookiejar.Cookie의 속성)
@anchor{library/http cookiejar http cookiejar Cookie name}@anchor{41a1}
@deffn {속성} Cookie.name

쿠키 이름 (문자열).
@end deffn

@geindex value (http.cookiejar.Cookie의 속성)
@anchor{library/http cookiejar http cookiejar Cookie value}@anchor{41a2}
@deffn {속성} Cookie.value

쿠키값 (문자열), 또는 @ref{884,,None}.
@end deffn

@geindex port (http.cookiejar.Cookie의 속성)
@anchor{library/http cookiejar http cookiejar Cookie port}@anchor{41a3}
@deffn {속성} Cookie.port

포트나 포트 집합을 나타내는 문자열 (예를 들어 ‘80’이나 ‘80,8080’), 또는 @ref{884,,None}.
@end deffn

@geindex domain (http.cookiejar.Cookie의 속성)
@anchor{library/http cookiejar http cookiejar Cookie domain}@anchor{41a4}
@deffn {속성} Cookie.domain

쿠키 도메인 (문자열).
@end deffn

@geindex path (http.cookiejar.Cookie의 속성)
@anchor{library/http cookiejar http cookiejar Cookie path}@anchor{41a5}
@deffn {속성} Cookie.path

쿠키 경로 (문자열, 예를 들어 @code{'/acme/rocket_launchers'}).
@end deffn

@geindex secure (http.cookiejar.Cookie의 속성)
@anchor{library/http cookiejar http cookiejar Cookie secure}@anchor{41a6}
@deffn {속성} Cookie.secure

쿠키가 보안 연결을 통해서만 반환되어야 하면 @code{True}.
@end deffn

@geindex expires (http.cookiejar.Cookie의 속성)
@anchor{library/http cookiejar http cookiejar Cookie expires}@anchor{41a7}
@deffn {속성} Cookie.expires

에포크 이후의 초 단위 정수 만료 날짜, 또는 @ref{884,,None}. @ref{41a8,,is_expired()} 메서드도 참조하십시오.
@end deffn

@geindex discard (http.cookiejar.Cookie의 속성)
@anchor{library/http cookiejar http cookiejar Cookie discard}@anchor{41a9}
@deffn {속성} Cookie.discard

세션 쿠키이면 @code{True}.
@end deffn

@geindex comment (http.cookiejar.Cookie의 속성)
@anchor{library/http cookiejar http cookiejar Cookie comment}@anchor{41aa}
@deffn {속성} Cookie.comment

이 쿠키의 기능을 설명하는 서버의 문자열 주석, 또는 @ref{884,,None}.
@end deffn

@geindex comment_url (http.cookiejar.Cookie의 속성)
@anchor{library/http cookiejar http cookiejar Cookie comment_url}@anchor{41ab}
@deffn {속성} Cookie.comment_url

이 쿠키의 기능을 설명하는 서버의 주석에 대한 URL 링크, 또는 @ref{884,,None}.
@end deffn

@geindex rfc2109 (http.cookiejar.Cookie의 속성)
@anchor{library/http cookiejar http cookiejar Cookie rfc2109}@anchor{41ac}
@deffn {속성} Cookie.rfc2109

@code{True} if this cookie was received as an 
@geindex RFC; RFC 2109
RFC 2109@footnote{https://datatracker.ietf.org/doc/html/rfc2109.html} cookie (ie. the cookie
arrived in a @code{Set-Cookie} header, and the value of the Version
cookie-attribute in that header was 1).  This attribute is provided because
@code{http.cookiejar} may ‘downgrade’ RFC 2109 cookies to Netscape cookies, in
which case @ref{41a0,,version} is 0.
@end deffn

@geindex port_specified (http.cookiejar.Cookie의 속성)
@anchor{library/http cookiejar http cookiejar Cookie port_specified}@anchor{41ad}
@deffn {속성} Cookie.port_specified

서버가 (@code{Set-Cookie} / @code{Set-Cookie2} 헤더에서) 포트나 포트 집합을 명시적으로 지정했으면 @code{True}.
@end deffn

@geindex domain_specified (http.cookiejar.Cookie의 속성)
@anchor{library/http cookiejar http cookiejar Cookie domain_specified}@anchor{41ae}
@deffn {속성} Cookie.domain_specified

서버가 도메인을 명시적으로 지정했으면 @code{True}.
@end deffn

@geindex domain_initial_dot (http.cookiejar.Cookie의 속성)
@anchor{library/http cookiejar http cookiejar Cookie domain_initial_dot}@anchor{41af}
@deffn {속성} Cookie.domain_initial_dot

서버에서 명시적으로 지정한 도메인이 점(@code{'.'})으로 시작하면 @code{True}.
@end deffn

쿠키에는 비표준 쿠키 어트리뷰트가 추가로 있을 수 있습니다. 다음 메서드를 사용하여 액세스 할 수 있습니다:

@geindex has_nonstandard_attr() (http.cookiejar.Cookie 메서드)
@anchor{library/http cookiejar http cookiejar Cookie has_nonstandard_attr}@anchor{41b0}
@deffn {메서드} Cookie.has_nonstandard_attr (name)

쿠키에 지정된 이름의 쿠키 어트리뷰트가 있으면 @code{True}를 반환합니다.
@end deffn

@geindex get_nonstandard_attr() (http.cookiejar.Cookie 메서드)
@anchor{library/http cookiejar http cookiejar Cookie get_nonstandard_attr}@anchor{41b1}
@deffn {메서드} Cookie.get_nonstandard_attr (name, default=None)

쿠키에 지정된 이름의 쿠키 어트리뷰트가 있으면, 그 값을 반환합니다. 그렇지 않으면 `default'를 반환합니다.
@end deffn

@geindex set_nonstandard_attr() (http.cookiejar.Cookie 메서드)
@anchor{library/http cookiejar http cookiejar Cookie set_nonstandard_attr}@anchor{41b2}
@deffn {메서드} Cookie.set_nonstandard_attr (name, value)

지정된 이름의 쿠키 어트리뷰트의 값을 설정합니다.
@end deffn

@ref{4172,,Cookie} 클래스는 다음 메서드도 정의합니다:

@geindex is_expired() (http.cookiejar.Cookie 메서드)
@anchor{library/http cookiejar http cookiejar Cookie is_expired}@anchor{41a8}
@deffn {메서드} Cookie.is_expired (now=None)

쿠키에 대해 서버가 만료해야 한다고 요청한 시간이 지났으면 @code{True}. `now'가 제공되면 (에포크 이후의 초로), 쿠키가 지정된 시간에 만료되는지를 반환합니다.
@end deffn

@node 예<14>,,Cookie 객체,http cookiejar — HTTP 클라이언트를 위한 쿠키 처리
@anchor{library/http cookiejar examples}@anchor{41b3}
@subsubsection 예


The first example shows the most common usage of @code{http.cookiejar}:

@example
import http.cookiejar, urllib.request
cj = http.cookiejar.CookieJar()
opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))
r = opener.open("http://example.com/")
@end example

이 예는 Netscape, Mozilla 또는 Lynx 쿠키를 사용하여 URL을 여는 방법을 보여줍니다 (쿠키 파일의 위치에 대해서는 유닉스/Netscape 규칙을 가정합니다):

@example
import os, http.cookiejar, urllib.request
cj = http.cookiejar.MozillaCookieJar()
cj.load(os.path.join(os.path.expanduser("~"), ".netscape", "cookies.txt"))
opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))
r = opener.open("http://example.com/")
@end example

다음 예는 @ref{1df1,,DefaultCookiePolicy} 의 사용법을 보여줍니다. 
@geindex RFC; RFC 2965
RFC 2965@footnote{https://datatracker.ietf.org/doc/html/rfc2965.html} 쿠키를 켜고, Netscape 쿠키를 설정하고 반환할 때 도메인에 대해 더욱 엄격하며, 일부 도메인이 쿠키를 설정하거나 쿠키를 반환하지 못하도록 차단합니다:

@example
import urllib.request
from http.cookiejar import CookieJar, DefaultCookiePolicy
policy = DefaultCookiePolicy(
    rfc2965=True, strict_ns_domain=Policy.DomainStrict,
    blocked_domains=["ads.net", ".ads.net"])
cj = CookieJar(policy)
opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))
r = opener.open("http://example.com/")
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node xmlrpc — XMLRPC 서버와 클라이언트 모듈,xmlrpc client — XML-RPC 클라이언트 액세스,http cookiejar — HTTP 클라이언트를 위한 쿠키 처리,인터넷 프로토콜과 지원
@anchor{library/xmlrpc doc}@anchor{41b4}@anchor{library/xmlrpc module-xmlrpc}@anchor{133}@anchor{library/xmlrpc translation-repo}@anchor{41b5}@anchor{library/xmlrpc xmlrpc-xmlrpc-server-and-client-modules}@anchor{41b6}
@subsection @code{xmlrpc} — XMLRPC 서버와 클라이언트 모듈


@geindex module; xmlrpc

XML-RPC는 HTTP를 트랜스포트로 사용해서 전달되는 XML을 사용하는 원격 프로시저 호출 방법입니다. 이를 통해, 클라이언트는 원격 서버(서버는 URI로 지정됩니다)의 매개 변수가 있는 메서드를 호출하고 구조화된 데이터를 받을 수 있습니다.

@code{xmlrpc}는 XML-RPC를 구현하는 서버와 클라이언트 모듈을 모아둔 패키지입니다. 모듈은 다음과 같습니다:


@itemize *

@item 
@ref{134,,xmlrpc.client}

@item 
@ref{135,,xmlrpc.server}
@end itemize

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node xmlrpc client — XML-RPC 클라이언트 액세스,xmlrpc server — 기본 XML-RPC 서버,xmlrpc — XMLRPC 서버와 클라이언트 모듈,인터넷 프로토콜과 지원
@anchor{library/xmlrpc client doc}@anchor{41b7}@anchor{library/xmlrpc client module-xmlrpc client}@anchor{134}@anchor{library/xmlrpc client translation-repo}@anchor{41b8}@anchor{library/xmlrpc client xmlrpc-client-xml-rpc-client-access}@anchor{41b9}
@subsection @code{xmlrpc.client} — XML-RPC 클라이언트 액세스


@geindex module; xmlrpc.client

`소스 코드:' Lib/xmlrpc/client.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/xmlrpc/client.py}

@c XXX Not everything is documented yet.  It might be good to describe
@c Marshaller, Unmarshaller, getparser and Transport.


__________________________________________________________________


XML-RPC는 HTTP(S)를 통해 전달된 XML을 트랜스포트로 사용하는 원격 프로시저 호출(Remote Procedure Call) 방법입니다. 이를 통해, 클라이언트는 원격 서버에서 매개 변수를 사용하여 메서드를 호출하고 (서버는 URI로 이름이 지정됩니다) 구조화된 데이터를 돌려받을 수 있습니다. 이 모듈은 XML-RPC 클라이언트 코드 작성을 지원합니다; 적합한 파이썬 객체와 전송 회선 상의 XML 간 변환의 모든 세부 사항을 처리합니다.

@cartouche
@quotation 경고 
The @code{xmlrpc.client} module is not secure against maliciously
constructed data.  If you need to parse untrusted or unauthenticated data,
see @ref{3d21,,XML security}.
@end quotation
@end cartouche


버전 3.5에서 변경: For HTTPS URIs, @code{xmlrpc.client} now performs all the necessary
certificate and hostname checks by default.


@c include for modules that don't work on WASM

@ref{213c,,가용성}: not WASI.

이 모듈은 웹어셈블리에서 작동하지 않거나 제공되지 않습니다. 자세한 내용은 @ref{1b68,,웹어셈블리 플랫폼}을 참조하세요.

@geindex ServerProxy (xmlrpc.client 클래스)
@anchor{library/xmlrpc client xmlrpc client ServerProxy}@anchor{c4b}
@deffn {클래스} xmlrpc.client.ServerProxy (uri, transport=None, encoding=None, verbose=False, allow_none=False, use_datetime=False, use_builtin_types=False, *, headers=(), context=None)

@ref{c4b,,ServerProxy} 인스턴스는 원격 XML-RPC 서버와의 통신을 관리하는 객체입니다. 필수적인 첫 번째 인자는 URI(Uniform Resource Indicator)이며 일반적으로 서버의 URL입니다. 선택적인 두 번째 인자는 트랜스포트 팩토리 인스턴스입니다; 기본적으로 https: URL의 경우는 내부 @code{SafeTransport} 인스턴스이고 그렇지 않으면 내부 HTTP @code{Transport} 인스턴스입니다. 선택적 세 번째 인자는 인코딩이며, 기본적으로 UTF-8입니다. 선택적 네 번째 인자는 디버깅 플래그입니다.

그 뒤에 오는 매개 변수들은 반환된 프락시 인스턴스 사용을 제어합니다. `allow_none'이 참이면, 파이썬 상수 @code{None}이 XML로 변환됩니다; 기본 동작은 @code{None}이 @ref{198,,TypeError}를 발생시키는 것입니다. 이것은 XML-RPC 명세에 일반적으로 사용되는 확장이지만, 모든 클라이언트와 서버에서 지원되는 것은 아닙니다; 설명은 http://ontosys.com/xml-rpc/extensions.php@footnote{https://web.archive.org/web/20130120074804/http://ontosys.com/xml-rpc/extensions.php}를 참조하십시오. `use_builtin_types' 플래그를 사용하여 날짜/시간 값을 @ref{4e2,,datetime.datetime} 객체로 표현하고 바이너리 데이터를 @ref{192,,bytes} 객체로 표현할 수 있습니다; 이 플래그는 기본적으로 거짓입니다. @code{datetime.datetime}, @code{bytes} 및 @ref{344,,bytearray} 객체는 호출로 전달될 수 있습니다. `headers' 매개 변수는 각 요청과 함께 보낼 선택적 HTTP 헤더의 시퀀스이며, 헤더 이름과 값을 나타내는 2-튜플의 시퀀스로 표현됩니다. (예를 들어 @code{[('Header-Name', 'value')]}). HTTPS URL이 제공되면, `context'는 @ref{357,,ssl.SSLContext}일 수 있으며, 하부 HTTPS 연결의 SSL 설정을 구성합니다. 사용되지 않는 `use_datetime' 플래그는 `use_builtin_types'와 유사하지만, 날짜/시간 값에만 적용됩니다.


버전 3.3에서 변경: `use_builtin_types' 플래그가 추가되었습니다.



버전 3.8에서 변경: `headers' 매개 변수가 추가되었습니다.


HTTP와 HTTPS 트랜스포트는 모두 HTTP 기본 인증(Basic Authentication)을 위한 URL 구문 확장을 지원합니다: @code{http://user:pass@@host:port/path}. @code{user:pass} 부분은 HTTP ‘Authorization’ 헤더로 base64 인코딩되고, XML-RPC 메서드를 호출할 때 연결 프로세스의 일부로 원격 서버로 전송됩니다. 원격 서버가 기본 인증 사용자와 비밀번호를 요구할 때만 이를 사용해야 합니다.

반환된 인스턴스는 원격 서버에서 해당 RPC 호출을 호출하는 데 사용할 수 있는 메서드가 있는 프락시 객체입니다. 원격 서버가 인트로스펙션(introspection) API를 지원하면, 프락시를 사용하여 원격 서버에서 지원하는 메서드를 조회하고 (서비스 검색, service discovery) 다른 서버 관련 메타 데이터를 가져올 수 있습니다.

적합한 형(예를 들어 XML을 통해 마샬링 할 수 있는 형)에는 다음이 포함됩니다 (별도로 표시된 경우를 제외하고는 같은 파이썬 형으로 역마샬링 됩니다):


@multitable {xxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

XML-RPC 형

@tab

파이썬 형

@item

@code{boolean}

@tab

@ref{3c3,,bool}

@item

@code{int}, @code{i1}, @code{i2}, @code{i4}, @code{i8} 또는 @code{biginteger}

@tab

-2147483648에서 2147483647 범위의 @ref{19b,,int}. 값은 @code{<int>} 태그를 얻습니다.

@item

@code{double}이나 @code{float}

@tab

@ref{196,,float}. 값은 @code{<double>} 태그를 얻습니다.

@item

@code{string}

@tab

@ref{169,,str}

@item

@code{array}

@tab

적합한 요소를 포함하는 @ref{24d,,list}나 @ref{610,,tuple}. 배열은 @code{리스트}로 반환됩니다.

@item

@code{struct}

@tab

@ref{183,,dict}. 키는 문자열이어야 하며, 값은 적합한 형일 수 있습니다. 사용자 정의 클래스의 객체를 전달할 수 있습니다; @ref{77c,,__dict__} 어트리뷰트만 전송됩니다.

@item

@code{dateTime.iso8601}

@tab

@ref{15e8,,DateTime}이나 @ref{4e2,,datetime.datetime}. 반환되는 형은 `use_builtin_types'와 `use_datetime' 플래그 값에 따라 다릅니다.

@item

@code{base64}

@tab

@ref{41ba,,Binary}, @ref{192,,bytes} 또는 @ref{344,,bytearray}. 반환되는 형은 `use_builtin_types' 플래그의 값에 따라 다릅니다.

@item

@code{nil}

@tab

@code{None} 상수. `allow_none'이 참일 때만 전달이 허용됩니다.

@item

@code{bigdecimal}

@tab

@ref{1fe,,decimal.Decimal}. 반환되는 형 전용.

@end multitable


이것이 XML-RPC가 지원하는 데이터형의 전체 집합입니다. 메서드 호출은 XML-RPC 서버 에러를 알리는 데 사용되는 특수 @ref{41bb,,Fault} 인스턴스나 HTTP/HTTPS 전송 계층의 에러를 알리는 데 사용되는 @ref{41bc,,ProtocolError}를 발생시킬 수도 있습니다. @code{Fault}와 @code{ProtocolError}는 모두 @code{Error}라는 베이스 클래스에서 파생됩니다. xmlrpc 클라이언트 모듈은 현재 내장형의 서브 클래스 인스턴스를 마샬링 하지 않음에 유의하십시오.

문자열을 전달할 때, @code{<}, @code{>} 및 @code{&}와 같은 XML에 특수한 문자는 자동으로 이스케이프 됩니다. 그러나, 0에서 31 사이의 ASCII 값을 가진 제어 문자(물론 탭, 줄 넘김 및 캐리지 리턴은 제외하고)와 같이 문자열에 XML에서 허용되지 않는 문자가 없도록 확인하는 것은 호출자의 책임입니다; 이렇게 하지 않으면 XML 형식이 잘못된 XML-RPC 요청이 발생합니다. XML-RPC를 통해 임의의 바이트열을 전달해야 하면, @ref{192,,bytes}나 @ref{344,,bytearray} 클래스 또는 아래 설명된 @ref{41ba,,Binary} 래퍼 클래스를 사용하십시오.

@code{Server}는 이전 버전과의 호환성을 위해 @ref{c4b,,ServerProxy}의 별칭으로 유지됩니다. 새 코드는 @code{ServerProxy}를 사용해야 합니다.


버전 3.5에서 변경: `context' 인자를 추가했습니다.



버전 3.6에서 변경: 접두사가 있는 형 태그 지원이 추가되었습니다 (예를 들어 @code{ex:nil}). 숫자를 위해 Apache XML-RPC 구현이 사용하는 추가 형의 역마샬링 지원이 추가되었습니다: @code{i1}, @code{i2}, @code{i8}, @code{biginteger}, @code{float} 및 @code{bigdecimal}. 설명은 @indicateurl{https://ws.apache.org/xmlrpc/types.html} 을 참조하십시오.

@end deffn


@subsubheading 더 보기



@table @asis

@item XML-RPC HOWTO@footnote{https://tldp.org/HOWTO/XML-RPC-HOWTO/index.html}

여러 언어로 된 XML-RPC 연산과 클라이언트 소프트웨어에 대한 훌륭한 설명. XML-RPC 클라이언트 개발자가 알아야 할 거의 모든 것이 포함되어 있습니다.

@item XML-RPC Introspection@footnote{https://xmlrpc-c.sourceforge.io/introspection.html}

인트로스펙션을 위한 XML-RPC 프로토콜 확장을 설명합니다.

@item XML-RPC Specification@footnote{http://xmlrpc.scripting.com/spec.html}

공식 명세.
@end table


@menu
* ServerProxy 객체:: 
* DateTime 객체:: 
* Binary 객체:: 
* Fault 객체:: 
* ProtocolError 객체:: 
* MultiCall 객체:: 
* 편의 함수:: 
* 클라이언트 사용 예:: 
* 클라이언트와 서버 사용 예:: 

@end menu

@node ServerProxy 객체,DateTime 객체,,xmlrpc client — XML-RPC 클라이언트 액세스
@anchor{library/xmlrpc client id1}@anchor{41bd}@anchor{library/xmlrpc client serverproxy-objects}@anchor{41be}
@subsubsection ServerProxy 객체


@ref{c4b,,ServerProxy} 인스턴스에는 XML-RPC 서버가 받아들이는 각 원격 프로시저 호출에 해당하는 메서드가 있습니다. 메서드를 호출하면 RPC를 수행하는데, 이름과 인자 서명 모두로 디스패치 됩니다 (예를 들어 같은 메서드 이름이 여러 인자 서명으로 오버로드 될 수 있습니다). RPC는 값을 반환하여 완료되는데, 값은 적합한 형으로 반환된 데이터이거나 에러를 나타내는 @ref{41bb,,Fault}나 @ref{41bc,,ProtocolError} 객체일 수 있습니다.

XML 인트로스팩션 API를 지원하는 서버는 예약된 @code{system} 어트리뷰트 밑에 그룹화된 몇 가지 공통 메서드를 지원합니다:

@geindex listMethods() (xmlrpc.client.ServerProxy.system 메서드)
@anchor{library/xmlrpc client xmlrpc client ServerProxy system listMethods}@anchor{41bf}
@deffn {메서드} ServerProxy.system.listMethods ()

이 메서드는 문자열 리스트를 반환하는데, XML-RPC 서버가 지원하는 각 (system이 아닌) 메서드마다 하나씩 제공됩니다.
@end deffn

@geindex methodSignature() (xmlrpc.client.ServerProxy.system 메서드)
@anchor{library/xmlrpc client xmlrpc client ServerProxy system methodSignature}@anchor{41c0}
@deffn {메서드} ServerProxy.system.methodSignature (name)

이 메서드는 하나의 매개 변수를 취하는데, XML-RPC 서버에 의해 구현된 메서드의 이름입니다. 이 메서드에 대해 가능한 서명의 배열을 반환합니다. 서명은 형의 배열입니다. 이 형 중 첫 번째는 메서드의 반환형이고 나머지는 매개 변수입니다.

다중 서명(즉 오버로딩)이 허용되므로, 이 메서드는 하나가 아닌 서명의 리스트를 반환합니다.

서명 자체는 메서드가 기대하는 최상위 매개 변수로 제한됩니다. 예를 들어, 메서드가 구조체 배열 하나를 매개 변수로 기대하고, 문자열을 반환하면, 서명은 단순히 “string, array”입니다. 세 개의 정수를 기대하고 문자열을 반환하면, 서명은 “string, int, int, int”입니다.

메서드에 서명이 정의되지 않으면, 배열이 아닌 값이 반환됩니다. 파이썬에서 이것은 반환된 값의 형이 리스트 이외의 어떤 것이 됨을 의미합니다.
@end deffn

@geindex methodHelp() (xmlrpc.client.ServerProxy.system 메서드)
@anchor{library/xmlrpc client xmlrpc client ServerProxy system methodHelp}@anchor{41c1}
@deffn {메서드} ServerProxy.system.methodHelp (name)

이 메서드는 하나의 매개 변수를 취하는데, XML-RPC 서버에 의해 구현된 메서드의 이름입니다. 해당 메서드의 사용법을 기술하는 설명서 문자열을 반환합니다. 이러한 문자열이 없으면, 빈 문자열이 반환됩니다. 설명서 문자열에 HTML 마크업이 포함될 수 있습니다.
@end deffn


버전 3.5에서 변경: @ref{c4b,,ServerProxy} 인스턴스는 하부 트랜스포트를 닫기 위한 @ref{1e1,,컨텍스트 관리자} 프로토콜을 지원합니다.


다음은 실제 예입니다. 서버 코드:

@example
from xmlrpc.server import SimpleXMLRPCServer

def is_even(n):
    return n % 2 == 0

server = SimpleXMLRPCServer(("localhost", 8000))
print("Listening on port 8000...")
server.register_function(is_even, "is_even")
server.serve_forever()
@end example

이전 서버에 대한 클라이언트 코드:

@example
import xmlrpc.client

with xmlrpc.client.ServerProxy("http://localhost:8000/") as proxy:
    print("3 is even: %s" % str(proxy.is_even(3)))
    print("100 is even: %s" % str(proxy.is_even(100)))
@end example

@node DateTime 객체,Binary 객체,ServerProxy 객체,xmlrpc client — XML-RPC 클라이언트 액세스
@anchor{library/xmlrpc client datetime-objects}@anchor{41c2}@anchor{library/xmlrpc client id2}@anchor{41c3}
@subsubsection DateTime 객체


@geindex DateTime (xmlrpc.client 클래스)
@anchor{library/xmlrpc client xmlrpc client DateTime}@anchor{15e8}
@deffn {클래스} xmlrpc.client.DateTime

이 클래스는 에포크(epoch) 이후의 초, 시간 튜플, ISO 8601 시간/날짜 문자열 또는 @ref{4e2,,datetime.datetime}으로 초기화될 수 있습니다. 주로 마샬링/역마샬링 코드 내부에서 사용하기 위해 지원되는, 다음과 같은 메서드가 있습니다:

@geindex decode() (xmlrpc.client.DateTime 메서드)
@anchor{library/xmlrpc client xmlrpc client DateTime decode}@anchor{41c4}
@deffn {메서드} decode (string)

인스턴스의 새 시간 값으로 문자열을 받아들입니다.
@end deffn

@geindex encode() (xmlrpc.client.DateTime 메서드)
@anchor{library/xmlrpc client xmlrpc client DateTime encode}@anchor{41c5}
@deffn {메서드} encode (out)

이 @ref{15e8,,DateTime} 항목의 XML-RPC 인코딩을 `out' 스트림 객체에 씁니다.
@end deffn

@ref{14a5,,풍부한 비교}와 @ref{82e,,__repr__()} 메서드를 통해 특정 파이썬 내장 연산자도 지원합니다.
@end deffn

다음은 실제 예입니다. 서버 코드:

@example
import datetime as dt
from xmlrpc.server import SimpleXMLRPCServer
import xmlrpc.client

def today():
    today = dt.datetime.today()
    return xmlrpc.client.DateTime(today)

server = SimpleXMLRPCServer(("localhost", 8000))
print("Listening on port 8000...")
server.register_function(today, "today")
server.serve_forever()
@end example

이전 서버에 대한 클라이언트 코드:

@example
import xmlrpc.client
import datetime as dt

proxy = xmlrpc.client.ServerProxy("http://localhost:8000/")

today = proxy.today()
# convert the ISO 8601 string to a datetime object
converted = dt.datetime.strptime(today.value, "%Y%m%dT%H:%M:%S")
print(f"Today: @{converted.strftime('%d.%m.%Y, %H:%M')@}")
@end example

@node Binary 객체,Fault 객체,DateTime 객체,xmlrpc client — XML-RPC 클라이언트 액세스
@anchor{library/xmlrpc client binary-objects}@anchor{41c6}@anchor{library/xmlrpc client id3}@anchor{41c7}
@subsubsection Binary 객체


@geindex Binary (xmlrpc.client 클래스)
@anchor{library/xmlrpc client xmlrpc client Binary}@anchor{41ba}
@deffn {클래스} xmlrpc.client.Binary

이 클래스는 바이트열 데이터(NUL을 포함할 수 있습니다)로 초기화될 수 있습니다. @ref{41ba,,Binary} 객체의 내용에 대한 기본 액세스는 어트리뷰트에 의해 제공됩니다:

@geindex data (xmlrpc.client.Binary의 속성)
@anchor{library/xmlrpc client xmlrpc client Binary data}@anchor{41c8}
@deffn {속성} data

@ref{41ba,,Binary} 인스턴스로 캡슐화된 바이너리 데이터. 데이터는 @ref{192,,bytes} 객체로 제공됩니다.
@end deffn

@ref{41ba,,Binary} 객체에는 주로 마샬링/역마샬링 코드 내부에서 사용하기 위해 지원되는 다음과 같은 메서드가 있습니다:

@geindex decode() (xmlrpc.client.Binary 메서드)
@anchor{library/xmlrpc client xmlrpc client Binary decode}@anchor{41c9}
@deffn {메서드} decode (bytes)

base64 @ref{192,,bytes} 객체를 받아들이고 인스턴스의 새 데이터로 디코딩합니다.
@end deffn

@geindex encode() (xmlrpc.client.Binary 메서드)
@anchor{library/xmlrpc client xmlrpc client Binary encode}@anchor{41ca}
@deffn {메서드} encode (out)

이 바이너리 항목의 XML-RPC base64 인코딩을 `out' 스트림 객체에 씁니다.

인코딩된 데이터에는 
@geindex RFC; RFC 2045 Section 6.8
RFC 2045 섹션 6.8@footnote{https://datatracker.ietf.org/doc/html/rfc2045.html#section-6.8}에 따라 76문자마다 줄 바꿈이 있는데, 이는 XML-RPC 명세가 작성될 때 사실상 표준 base64 명세였습니다.
@end deffn

@ref{cf1,,__eq__()}와 @ref{171c,,__ne__()} 메서드를 통해 특정 파이썬 내장 연산자도 지원합니다.
@end deffn

바이너리 객체의 사용 예. XMLRPC를 통해 이미지를 전송할 것입니다:

@example
from xmlrpc.server import SimpleXMLRPCServer
import xmlrpc.client

def python_logo():
    with open("python_logo.jpg", "rb") as handle:
        return xmlrpc.client.Binary(handle.read())

server = SimpleXMLRPCServer(("localhost", 8000))
print("Listening on port 8000...")
server.register_function(python_logo, 'python_logo')

server.serve_forever()
@end example

클라이언트는 이미지를 가져와서 파일에 저장합니다:

@example
import xmlrpc.client

proxy = xmlrpc.client.ServerProxy("http://localhost:8000/")
with open("fetched_python_logo.jpg", "wb") as handle:
    handle.write(proxy.python_logo().data)
@end example

@node Fault 객체,ProtocolError 객체,Binary 객체,xmlrpc client — XML-RPC 클라이언트 액세스
@anchor{library/xmlrpc client fault-objects}@anchor{41cb}@anchor{library/xmlrpc client id4}@anchor{41cc}
@subsubsection Fault 객체


@geindex Fault (xmlrpc.client 클래스)
@anchor{library/xmlrpc client xmlrpc client Fault}@anchor{41bb}
@deffn {클래스} xmlrpc.client.Fault

@ref{41bb,,Fault} 객체는 XML-RPC 결함 태그의 내용을 캡슐화합니다. Fault 객체에는 다음과 같은 어트리뷰트가 있습니다:

@geindex faultCode (xmlrpc.client.Fault의 속성)
@anchor{library/xmlrpc client xmlrpc client Fault faultCode}@anchor{41cd}
@deffn {속성} faultCode

결함 형을 나타내는 int.
@end deffn

@geindex faultString (xmlrpc.client.Fault의 속성)
@anchor{library/xmlrpc client xmlrpc client Fault faultString}@anchor{41ce}
@deffn {속성} faultString

결함과 연관된 진단 메시지가 포함된 문자열.
@end deffn
@end deffn

다음 예제에서는 복소수 형의 객체를 반환하여 의도적으로 @ref{41bb,,Fault}를 발생시킵니다. 서버 코드:

@example
from xmlrpc.server import SimpleXMLRPCServer

# 복소수를 반환하기 때문에 마샬링 에러가 발생합니다
def add(x, y):
    return x+y+0j

server = SimpleXMLRPCServer(("localhost", 8000))
print("Listening on port 8000...")
server.register_function(add, 'add')

server.serve_forever()
@end example

이전 서버에 대한 클라이언트 코드:

@example
import xmlrpc.client

proxy = xmlrpc.client.ServerProxy("http://localhost:8000/")
try:
    proxy.add(2, 5)
except xmlrpc.client.Fault as err:
    print("A fault occurred")
    print("Fault code: %d" % err.faultCode)
    print("Fault string: %s" % err.faultString)
@end example

@node ProtocolError 객체,MultiCall 객체,Fault 객체,xmlrpc client — XML-RPC 클라이언트 액세스
@anchor{library/xmlrpc client protocol-error-objects}@anchor{41cf}@anchor{library/xmlrpc client protocolerror-objects}@anchor{41d0}
@subsubsection ProtocolError 객체


@geindex ProtocolError (xmlrpc.client 클래스)
@anchor{library/xmlrpc client xmlrpc client ProtocolError}@anchor{41bc}
@deffn {클래스} xmlrpc.client.ProtocolError

@ref{41bc,,ProtocolError} 객체는 하부 전송 계층에서의 프로토콜 에러를 기술합니다 (가령 URI로 명명된 서버가 없을 때 404 ‘not found’ 에러). 다음과 같은 어트리뷰트가 있습니다:

@geindex url (xmlrpc.client.ProtocolError의 속성)
@anchor{library/xmlrpc client xmlrpc client ProtocolError url}@anchor{41d1}
@deffn {속성} url

에러를 일으킨 URI나 URL.
@end deffn

@geindex errcode (xmlrpc.client.ProtocolError의 속성)
@anchor{library/xmlrpc client xmlrpc client ProtocolError errcode}@anchor{41d2}
@deffn {속성} errcode

에러 코드.
@end deffn

@geindex errmsg (xmlrpc.client.ProtocolError의 속성)
@anchor{library/xmlrpc client xmlrpc client ProtocolError errmsg}@anchor{41d3}
@deffn {속성} errmsg

에러 메시지나 진단 문자열.
@end deffn

@geindex headers (xmlrpc.client.ProtocolError의 속성)
@anchor{library/xmlrpc client xmlrpc client ProtocolError headers}@anchor{41d4}
@deffn {속성} headers

에러를 일으킨 HTTP/HTTPS 요청의 헤더를 포함하는 딕셔너리.
@end deffn
@end deffn

다음 예에서는 잘못된 URI를 제공하여 의도적으로 @ref{41bc,,ProtocolError}를 발생시킵니다:

@example
import xmlrpc.client

# XMLRPC 요청에 응답하지 않는 URI로 ServerProxy를 만듭니다
proxy = xmlrpc.client.ServerProxy("http://google.com/")

try:
    proxy.some_method()
except xmlrpc.client.ProtocolError as err:
    print("A protocol error occurred")
    print("URL: %s" % err.url)
    print("HTTP/HTTPS headers: %s" % err.headers)
    print("Error code: %d" % err.errcode)
    print("Error message: %s" % err.errmsg)
@end example

@node MultiCall 객체,편의 함수,ProtocolError 객체,xmlrpc client — XML-RPC 클라이언트 액세스
@anchor{library/xmlrpc client multicall-objects}@anchor{41d5}
@subsubsection MultiCall 객체


@ref{41d6,,MultiCall} 객체는 원격 서버에 대한 여러 호출을 단일 요청으로 캡슐화하는 방법을 제공합니다 @footnote{
이 접근법은 @uref{https://web.archive.org/web/20060624230303/http://www.xmlrpc.com/discuss/msgReader$1208?mode=topic,xmlrpc.com에서의 토론}에서 처음 제시되었습니다.
}.

@geindex MultiCall (xmlrpc.client 클래스)
@anchor{library/xmlrpc client xmlrpc client MultiCall}@anchor{41d6}
@deffn {클래스} xmlrpc.client.MultiCall (server)

boxcar 메서드 호출에 사용되는 객체를 만듭니다. `server'는 최종 호출 대상입니다. 결과 객체를 호출할 수 있지만, 즉시 @code{None}을 반환하고, 호출 이름과 매개 변수를 @ref{41d6,,MultiCall} 객체에 저장하기만 합니다. 객체 자체를 호출하면 저장된 모든 호출이 단일 @code{system.multicall} 요청으로 전송됩니다. 이 호출의 결과는 @ref{1260,,제너레이터}입니다; 이 제너레이터를 이터레이트 하면 개별 결과를 산출합니다.
@end deffn

이 클래스의 사용 예는 다음과 같습니다. 서버 코드:

@example
from xmlrpc.server import SimpleXMLRPCServer

def add(x, y):
    return x + y

def subtract(x, y):
    return x - y

def multiply(x, y):
    return x * y

def divide(x, y):
    return x // y

# 간단한 산술 함수들이 있는 간단한 서버
server = SimpleXMLRPCServer(("localhost", 8000))
print("Listening on port 8000...")
server.register_multicall_functions()
server.register_function(add, 'add')
server.register_function(subtract, 'subtract')
server.register_function(multiply, 'multiply')
server.register_function(divide, 'divide')
server.serve_forever()
@end example

이전 서버에 대한 클라이언트 코드:

@example
import xmlrpc.client

proxy = xmlrpc.client.ServerProxy("http://localhost:8000/")
multicall = xmlrpc.client.MultiCall(proxy)
multicall.add(7, 3)
multicall.subtract(7, 3)
multicall.multiply(7, 3)
multicall.divide(7, 3)
result = multicall()

print("7+3=%d, 7-3=%d, 7*3=%d, 7//3=%d" % tuple(result))
@end example

@node 편의 함수,클라이언트 사용 예,MultiCall 객체,xmlrpc client — XML-RPC 클라이언트 액세스
@anchor{library/xmlrpc client convenience-functions}@anchor{41d7}
@subsubsection 편의 함수


@geindex dumps() (xmlrpc.client 모듈)
@anchor{library/xmlrpc client xmlrpc client dumps}@anchor{41d8}
@deffn {함수} xmlrpc.client.dumps (params, methodname=None, methodresponse=None, encoding=None, allow_none=False)

Convert `params' into an XML-RPC request, or into a response if `methodresponse'
is true. `params' can be either a tuple of arguments or an instance of the
@ref{41bb,,Fault} exception class.  If `methodresponse' is true, only a single value
can be returned, meaning that `params' must be of length 1. `encoding', if
supplied, is the encoding to use in the generated XML; the default is UTF-8.
Python’s @ref{884,,None} value cannot be used in standard XML-RPC; to allow using
it via an extension,  provide a true value for `allow_none'.
@end deffn

@geindex loads() (xmlrpc.client 모듈)
@anchor{library/xmlrpc client xmlrpc client loads}@anchor{163a}
@deffn {함수} xmlrpc.client.loads (data, use_datetime=False, use_builtin_types=False)

XML-RPC 요청이나 응답을 파이썬 객체 @code{(params, methodname)}로 변환합니다. `params'는 인자의 튜플입니다; `methodname'은 문자열이거나 패킷에 메서드 이름이 없으면 @code{None}입니다. XML-RPC 패킷이 결함 조건을 나타내면, 이 함수는 @ref{41bb,,Fault} 예외를 발생시킵니다. `use_builtin_types' 플래그를 사용하여 날짜/시간 값을 @ref{4e2,,datetime.datetime} 객체로 표현하고 바이너리 데이터를 @ref{192,,bytes} 객체로 표현할 수 있습니다; 이 플래그는 기본적으로 거짓입니다.

사용되지 않는 `use_datetime' 플래그는 `use_builtin_types'와 유사하지만, 날짜/시간 값에만 적용됩니다.


버전 3.3에서 변경: `use_builtin_types' 플래그가 추가되었습니다.

@end deffn

@node 클라이언트 사용 예,클라이언트와 서버 사용 예,편의 함수,xmlrpc client — XML-RPC 클라이언트 액세스
@anchor{library/xmlrpc client example-of-client-usage}@anchor{41d9}@anchor{library/xmlrpc client xmlrpc-client-example}@anchor{41da}
@subsubsection 클라이언트 사용 예


@example
# 간단한 테스트 프로그램 (XML-RPC 명세에서 인용)
from xmlrpc.client import ServerProxy, Error

# server = ServerProxy("http://localhost:8000") # 로컬 서버
with ServerProxy("http://betty.userland.com") as proxy:

    print(proxy)

    try:
        print(proxy.examples.getStateName(41))
    except Error as v:
        print("ERROR", v)
@end example

HTTP 프락시를 통해 XML-RPC 서버에 액세스하려면, 사용자 정의 트랜스포트를 정의해야 합니다. 다음 예제는 방법을 보여줍니다:

@example
import http.client
import xmlrpc.client

class ProxiedTransport(xmlrpc.client.Transport):

    def set_proxy(self, host, port=None, headers=None):
        self.proxy = host, port
        self.proxy_headers = headers

    def make_connection(self, host):
        connection = http.client.HTTPConnection(*self.proxy)
        connection.set_tunnel(host, headers=self.proxy_headers)
        self._connection = host, connection
        return connection

transport = ProxiedTransport()
transport.set_proxy('proxy-server', 8080)
server = xmlrpc.client.ServerProxy('http://betty.userland.com', transport=transport)
print(server.examples.getStateName(41))
@end example

@node 클라이언트와 서버 사용 예,,클라이언트 사용 예,xmlrpc client — XML-RPC 클라이언트 액세스
@anchor{library/xmlrpc client example-of-client-and-server-usage}@anchor{41db}
@subsubsection 클라이언트와 서버 사용 예


@ref{41dc,,SimpleXMLRPCServer example}를 참조하십시오.

@c the link now points to webarchive since the one at

@c http://www.xmlrpc.com/discuss/msgReader%241208 is broken (and webadmin

@c doesn't reply)

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node xmlrpc server — 기본 XML-RPC 서버,ipaddress — IPv4/IPv6 조작 라이브러리,xmlrpc client — XML-RPC 클라이언트 액세스,인터넷 프로토콜과 지원
@anchor{library/xmlrpc server doc}@anchor{41dd}@anchor{library/xmlrpc server module-xmlrpc server}@anchor{135}@anchor{library/xmlrpc server translation-repo}@anchor{41de}@anchor{library/xmlrpc server xmlrpc-server-basic-xml-rpc-servers}@anchor{41df}
@subsection @code{xmlrpc.server} — 기본 XML-RPC 서버


@geindex module; xmlrpc.server

`소스 코드:' Lib/xmlrpc/server.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/xmlrpc/server.py}


__________________________________________________________________


The @code{xmlrpc.server} module provides a basic server framework for XML-RPC
servers written in Python.  Servers can either be free standing, using
@ref{41e0,,SimpleXMLRPCServer}, or embedded in a CGI environment, using
@ref{41e1,,CGIXMLRPCRequestHandler}.

@cartouche
@quotation 경고 
The @code{xmlrpc.server} module is not secure against maliciously
constructed data.  If you need to parse untrusted or unauthenticated data,
see @ref{3d21,,XML security}.
@end quotation
@end cartouche

@c include for modules that don't work on WASM

@ref{213c,,가용성}: not WASI.

이 모듈은 웹어셈블리에서 작동하지 않거나 제공되지 않습니다. 자세한 내용은 @ref{1b68,,웹어셈블리 플랫폼}을 참조하세요.

@geindex SimpleXMLRPCServer (xmlrpc.server 클래스)
@anchor{library/xmlrpc server xmlrpc server SimpleXMLRPCServer}@anchor{41e0}
@deffn {클래스} xmlrpc.server.SimpleXMLRPCServer (addr, requestHandler=SimpleXMLRPCRequestHandler, logRequests=True, allow_none=False, encoding=None, bind_and_activate=True, use_builtin_types=False)

새 서버 인스턴스를 만듭니다. 이 클래스는 XML-RPC 프로토콜에 의해 호출될 수 있는 함수를 등록하는 메서드를 제공합니다. `requestHandler' 매개 변수는 요청 처리기 인스턴스의 팩토리여야 합니다; 기본값은 @ref{152c,,SimpleXMLRPCRequestHandler} 입니다. `addr'과 `requestHandler' 매개 변수는 @ref{1524,,socketserver.TCPServer} 생성자에 전달됩니다. `logRequests'가 참(기본값)이면, 요청이 로그 됩니다; 이 매개 변수를 거짓으로 설정하면 로깅이 해제됩니다. `allow_none'과 `encoding' 매개 변수는 @ref{134,,xmlrpc.client}로 전달되고 서버에서 반환될 XML-RPC 응답을 제어합니다. `bind_and_activate' 매개 변수는 생성자가 @code{server_bind()}와 @code{server_activate()}를 즉시 호출하는지를 제어합니다; 기본값은 참입니다. 이를 거짓으로 설정하면 코드가 주소가 바인드되기 전에 `allow_reuse_address' 클래스 변수를 조작할 수 있습니다. `use_builtin_types' 매개 변수는 @ref{163a,,loads()} 함수로 전달되며 날짜/시간 값이나 바이너리 데이터가 수신될 때 처리되는 형을 제어합니다; 기본값은 거짓입니다.


버전 3.3에서 변경: `use_builtin_types' 플래그가 추가되었습니다.

@end deffn

@geindex CGIXMLRPCRequestHandler (xmlrpc.server 클래스)
@anchor{library/xmlrpc server xmlrpc server CGIXMLRPCRequestHandler}@anchor{41e1}
@deffn {클래스} xmlrpc.server.CGIXMLRPCRequestHandler (allow_none=False, encoding=None, use_builtin_types=False)

CGI 환경에서 XML-RPC 요청을 처리할 새 인스턴스를 만듭니다. `allow_none'과 `encoding' 매개 변수는 @ref{134,,xmlrpc.client}로 전달되고 서버에서 반환될 XML-RPC 응답을 제어합니다. `use_builtin_types' 매개 변수는 @ref{163a,,loads()} 함수로 전달되며 날짜/시간 값이나 바이너리 데이터가 수신될 때 처리되는 형을 제어합니다; 기본값은 거짓입니다.


버전 3.3에서 변경: `use_builtin_types' 플래그가 추가되었습니다.

@end deffn

@geindex SimpleXMLRPCRequestHandler (xmlrpc.server 클래스)
@anchor{library/xmlrpc server xmlrpc server SimpleXMLRPCRequestHandler}@anchor{152c}
@deffn {클래스} xmlrpc.server.SimpleXMLRPCRequestHandler

새 요청 처리기 인스턴스를 만듭니다. 이 요청 처리기는 @code{POST} 요청을 지원하고 @ref{41e0,,SimpleXMLRPCServer} 생성자 매개 변수에 대한 `logRequests' 매개 변수가 적용되도록 로깅을 수정합니다.
@end deffn

@menu
* SimpleXMLRPCServer objects:: 
* CGIXMLRPCRequestHandler:: 
* XMLRPC 서버 문서화:: 
* DocXMLRPCServer objects:: 
* DocCGIXMLRPCRequestHandler:: 

@end menu

@node SimpleXMLRPCServer objects,CGIXMLRPCRequestHandler,,xmlrpc server — 기본 XML-RPC 서버
@anchor{library/xmlrpc server simple-xmlrpc-servers}@anchor{41e2}@anchor{library/xmlrpc server simplexmlrpcserver-objects}@anchor{41e3}
@subsubsection SimpleXMLRPCServer objects


@ref{41e0,,SimpleXMLRPCServer} 클래스는 @ref{1524,,socketserver.TCPServer}를 기반으로 하며 간단한 독립형 XML-RPC 서버를 작성하는 수단을 제공합니다.

@geindex register_function() (xmlrpc.server.SimpleXMLRPCServer 메서드)
@anchor{library/xmlrpc server xmlrpc server SimpleXMLRPCServer register_function}@anchor{41e4}
@deffn {메서드} SimpleXMLRPCServer.register_function (function=None, name=None)

XML-RPC 요청에 응답할 수 있는 함수를 등록합니다. `name'이 제공되면, `function'과 연결되는 메서드 이름이 되고, 그렇지 않으면 @ref{14d9,,function.__name__}이 사용됩니다. `name'은 문자열이며 마침표 문자를 포함하여 파이썬 식별자에서 유효하지 않은 문자를 포함할 수 있습니다.

이 메서드는 데코레이터로도 사용할 수 있습니다. 데코레이터로 사용될 때, `name'은 `function'을 `name'으로 등록하기 위해 키워드 인자로만 제공될 수 있습니다. `name'을 제공하지 않으면, @ref{14d9,,function.__name__}이 사용됩니다.


버전 3.7에서 변경: @ref{41e4,,register_function()}은 데코레이터로 사용할 수 있습니다.

@end deffn

@geindex register_instance() (xmlrpc.server.SimpleXMLRPCServer 메서드)
@anchor{library/xmlrpc server xmlrpc server SimpleXMLRPCServer register_instance}@anchor{41e5}
@deffn {메서드} SimpleXMLRPCServer.register_instance (instance, allow_dotted_names=False)

@ref{41e4,,register_function()}을 사용하여 등록되지 않은 메서드 이름을 노출하는데 사용되는 객체를 등록합니다. `instance'가 @code{_dispatch()} 메서드를 포함하면, 요청된 메서드 이름과 요청의 매개 변수로 호출됩니다. API는 @code{def _dispatch(self, method, params)}입니다 (`params'가 가변 인자 목록을 나타내지 않음에 유의하십시오). 이것이 작업을 수행하기 위해 하부 함수를 호출하면, 해당 함수를 매개 변수 리스트를 확장하여 @code{func(*params)}로 호출합니다. @code{_dispatch()}의 반환 값이 클라이언트에 결과로 반환됩니다. `instance'에 @code{_dispatch()} 메서드가 없으면, 요청된 메서드의 이름과 일치하는 어트리뷰트를 검색합니다.

선택적 `allow_dotted_names' 인자가 참이고 인스턴스에 @code{_dispatch()} 메서드가 없으면, 요청된 메서드 이름에 마침표가 포함될 때, 메서드 이름의 각 구성 요소가 개별적으로 검색되어, 간단한 계층 구조 검색이 수행되는 효과를 줍니다. 이 검색에서 찾은 값은 요청의 매개 변수로 호출되며 반환 값은 클라이언트로 다시 전달됩니다.

@cartouche
@quotation 경고 
`allow_dotted_names' 옵션을 활성화하면 침입자가 모듈의 전역 변수에 액세스할 수 있으며 침입자가 여러분의 기계에서 임의의 코드를 실행할 수 있습니다. 안전한 폐쇄 네트워크에서만 이 옵션을 사용하십시오.
@end quotation
@end cartouche
@end deffn

@geindex register_introspection_functions() (xmlrpc.server.SimpleXMLRPCServer 메서드)
@anchor{library/xmlrpc server xmlrpc server SimpleXMLRPCServer register_introspection_functions}@anchor{41e6}
@deffn {메서드} SimpleXMLRPCServer.register_introspection_functions ()

XML-RPC 내부 검사 함수 @code{system.listMethods}, @code{system.methodHelp} 및 @code{system.methodSignature}를 등록합니다.
@end deffn

@geindex register_multicall_functions() (xmlrpc.server.SimpleXMLRPCServer 메서드)
@anchor{library/xmlrpc server xmlrpc server SimpleXMLRPCServer register_multicall_functions}@anchor{41e7}
@deffn {메서드} SimpleXMLRPCServer.register_multicall_functions ()

XML-RPC 다중 호출(multicall) 함수 system.multicall을 등록합니다.
@end deffn

@geindex rpc_paths (xmlrpc.server.SimpleXMLRPCRequestHandler의 속성)
@anchor{library/xmlrpc server xmlrpc server SimpleXMLRPCRequestHandler rpc_paths}@anchor{41e8}
@deffn {속성} SimpleXMLRPCRequestHandler.rpc_paths

XML-RPC 요청을 수신하기 위한 URL의 유효한 경로 부분을 나열하는 튜플이어야 하는 어트리뷰트 값. 다른 경로로 들어오는 요청은 404 “no such page” HTTP 에러를 발생시킵니다. 이 튜플이 비어 있으면, 모든 경로를 유효한 것으로 간주합니다. 기본값은 @code{('/', '/RPC2')}입니다.
@end deffn

@menu
* SimpleXMLRPCServer example:: 

@end menu

@node SimpleXMLRPCServer example,,,SimpleXMLRPCServer objects
@anchor{library/xmlrpc server id1}@anchor{41e9}@anchor{library/xmlrpc server simplexmlrpcserver-example}@anchor{41dc}
@subsubsection SimpleXMLRPCServer example


서버 코드:

@example
from xmlrpc.server import SimpleXMLRPCServer
from xmlrpc.server import SimpleXMLRPCRequestHandler

# 특정 경로로 제한합니다.
class RequestHandler(SimpleXMLRPCRequestHandler):
    rpc_paths = ('/RPC2',)

# 서버를 만듭니다
with SimpleXMLRPCServer(('localhost', 8000),
                        requestHandler=RequestHandler) as server:
    server.register_introspection_functions()

    # pow() 함수를 등록합니다; pow.__name__ 값을 이름으로 사용하는데,
    # 그냥 'pow' 입니다.
    server.register_function(pow)

    # 함수를 다른 이름으로 등록합니다
    def adder_function(x, y):
        return x + y
    server.register_function(adder_function, 'add')

    # 인스턴스를 등록합니다; 인스턴스의 모든 메서드가 XML-RPC 메서드로 노출됩니다
    # (이 경우는 'mul' 뿐입니다).
    class MyFuncs:
        def mul(self, x, y):
            return x * y

    server.register_instance(MyFuncs())

    # 서버의 메인 루프를 실행합니다
    server.serve_forever()
@end example

다음 클라이언트 코드는 앞의 서버가 제공하는 메서드를 호출합니다:

@example
import xmlrpc.client

s = xmlrpc.client.ServerProxy('http://localhost:8000')
print(s.pow(2,3))  # 2**3 = 8 을 반환합니다
print(s.add(2,3))  # 5 를 반환합니다
print(s.mul(5,2))  # 5*2 = 10 을 반환합니다

# 사용할 수 있는 메서드의 목록을 인쇄합니다
print(s.system.listMethods())
@end example

@code{register_function()}은 데코레이터로도 사용할 수 있습니다. 앞의 서버 예제에서 데코레이터 방식으로 함수를 등록할 수 있습니다:

@example
from xmlrpc.server import SimpleXMLRPCServer
from xmlrpc.server import SimpleXMLRPCRequestHandler

class RequestHandler(SimpleXMLRPCRequestHandler):
    rpc_paths = ('/RPC2',)

with SimpleXMLRPCServer(('localhost', 8000),
                        requestHandler=RequestHandler) as server:
    server.register_introspection_functions()

    # pow() 함수를 등록합니다; pow.__name__ 값을 이름으로 사용하는데,
    # 그냥 'pow' 입니다.
    server.register_function(pow)

    # register_function을 데코레이터로 사용해서, 함수를 다른 이름으로 등록합니다.
    # *name* 은 키워드 인자로만 줄 수 있습니다.
    @@server.register_function(name='add')
    def adder_function(x, y):
        return x + y

    # 함수를 function.__name__ 으로 등록합니다.
    @@server.register_function
    def mul(x, y):
        return x * y

    server.serve_forever()
@end example

@code{Lib/xmlrpc/server.py} 모듈에 포함된 다음 예는 점으로 구분된 이름을 허용하고 다중 호출 함수를 등록하는 서버를 보여줍니다.

@cartouche
@quotation 경고 
Enabling the `allow_dotted_names' option allows intruders to access your
module’s global variables and may allow intruders to execute arbitrary code on
your machine.  Only use this example within a secure, closed network.
@end quotation
@end cartouche

@example
import datetime as dt

class ExampleService:
    def getData(self):
        return '42'

    class currentTime:
        @@staticmethod
        def getCurrentTime():
            return dt.datetime.now()

with SimpleXMLRPCServer(("localhost", 8000)) as server:
    server.register_function(pow)
    server.register_function(lambda x,y: x+y, 'add')
    server.register_instance(ExampleService(), allow_dotted_names=True)
    server.register_multicall_functions()
    print('Serving XML-RPC on localhost port 8000')
    try:
        server.serve_forever()
    except KeyboardInterrupt:
        print("\nKeyboard interrupt received, exiting.")
        sys.exit(0)
@end example

이 ExampleService 데모는 명령 줄에서 호출할 수 있습니다:

@example
python -m xmlrpc.server
@end example

위 서버와 상호 작용하는 클라이언트는 @code{Lib/xmlrpc/client.py}에 포함되어 있습니다:

@example
server = ServerProxy("http://localhost:8000")

try:
    print(server.currentTime.getCurrentTime())
except Error as v:
    print("ERROR", v)

multi = MultiCall(server)
multi.getData()
multi.pow(2,9)
multi.add(1,2)
try:
    for response in multi():
        print(response)
except Error as v:
    print("ERROR", v)
@end example

데모 XMLRPC 서버와 상호 작용하는 이 클라이언트는 다음과 같이 호출할 수 있습니다:

@example
python -m xmlrpc.client
@end example

@node CGIXMLRPCRequestHandler,XMLRPC 서버 문서화,SimpleXMLRPCServer objects,xmlrpc server — 기본 XML-RPC 서버
@anchor{library/xmlrpc server cgixmlrpcrequesthandler}@anchor{41ea}
@subsubsection CGIXMLRPCRequestHandler


@ref{41e1,,CGIXMLRPCRequestHandler} 클래스는 파이썬 CGI 스크립트로 전송된 XML-RPC 요청을 처리하는 데 사용할 수 있습니다.

@geindex register_function() (xmlrpc.server.CGIXMLRPCRequestHandler 메서드)
@anchor{library/xmlrpc server xmlrpc server CGIXMLRPCRequestHandler register_function}@anchor{41eb}
@deffn {메서드} CGIXMLRPCRequestHandler.register_function (function=None, name=None)

XML-RPC 요청에 응답할 수 있는 함수를 등록합니다. `name'이 제공되면, `function'과 연결되는 메서드 이름이 되고, 그렇지 않으면 @ref{14d9,,function.__name__}이 사용됩니다. `name'은 문자열이며 마침표 문자를 포함하여 파이썬 식별자에서 유효하지 않은 문자를 포함할 수 있습니다.

이 메서드는 데코레이터로도 사용할 수 있습니다. 데코레이터로 사용될 때, `name'은 `function'을 `name'으로 등록하기 위해 키워드 인자로만 제공될 수 있습니다. `name'을 제공하지 않으면, @ref{14d9,,function.__name__}이 사용됩니다.


버전 3.7에서 변경: @ref{41eb,,register_function()}은 데코레이터로 사용할 수 있습니다.

@end deffn

@geindex register_instance() (xmlrpc.server.CGIXMLRPCRequestHandler 메서드)
@anchor{library/xmlrpc server xmlrpc server CGIXMLRPCRequestHandler register_instance}@anchor{41ec}
@deffn {메서드} CGIXMLRPCRequestHandler.register_instance (instance)

@ref{41eb,,register_function()}을 사용하여 등록되지 않은 메서드 이름을 노출하는데 사용되는 객체를 등록합니다. instance가 @code{_dispatch()} 메서드를 포함하면, 요청된 메서드 이름과 요청의 매개 변수로 호출됩니다; 반환 값이 클라이언트에 결과로 반환됩니다. instance에 @code{_dispatch()} 메서드가 없으면, 요청된 메서드의 이름과 일치하는 어트리뷰트를 검색합니다; 요청된 메서드 이름에 마침표가 포함될 때, 메서드 이름의 각 구성 요소가 개별적으로 검색되어, 간단한 계층 구조 검색이 수행되는 효과를 줍니다. 이 검색에서 찾은 값은 요청의 매개 변수로 호출되며 반환 값은 클라이언트로 다시 전달됩니다.
@end deffn

@geindex register_introspection_functions() (xmlrpc.server.CGIXMLRPCRequestHandler 메서드)
@anchor{library/xmlrpc server xmlrpc server CGIXMLRPCRequestHandler register_introspection_functions}@anchor{41ed}
@deffn {메서드} CGIXMLRPCRequestHandler.register_introspection_functions ()

XML-RPC 내부 검사 함수 @code{system.listMethods}, @code{system.methodHelp} 및 @code{system.methodSignature}를 등록합니다.
@end deffn

@geindex register_multicall_functions() (xmlrpc.server.CGIXMLRPCRequestHandler 메서드)
@anchor{library/xmlrpc server xmlrpc server CGIXMLRPCRequestHandler register_multicall_functions}@anchor{41ee}
@deffn {메서드} CGIXMLRPCRequestHandler.register_multicall_functions ()

XML-RPC 다중 호출(multicall) 함수 @code{system.multicall}을 등록합니다.
@end deffn

@geindex handle_request() (xmlrpc.server.CGIXMLRPCRequestHandler 메서드)
@anchor{library/xmlrpc server xmlrpc server CGIXMLRPCRequestHandler handle_request}@anchor{41ef}
@deffn {메서드} CGIXMLRPCRequestHandler.handle_request (request_text=None)

XML-RPC 요청을 처리합니다. `request_text'가 제공되면, HTTP 서버가 제공한 POST 데이터여야 합니다, 그렇지 않으면 stdin의 내용이 사용됩니다.
@end deffn

예:

@example
class MyFuncs:
    def mul(self, x, y):
        return x * y


handler = CGIXMLRPCRequestHandler()
handler.register_function(pow)
handler.register_function(lambda x,y: x+y, 'add')
handler.register_introspection_functions()
handler.register_instance(MyFuncs())
handler.handle_request()
@end example

@node XMLRPC 서버 문서화,DocXMLRPCServer objects,CGIXMLRPCRequestHandler,xmlrpc server — 기본 XML-RPC 서버
@anchor{library/xmlrpc server documenting-xmlrpc-server}@anchor{41f0}
@subsubsection XMLRPC 서버 문서화


이 클래스들은 HTTP GET 요청에 대한 응답으로 HTML 설명서를 제공하기 위해 위의 클래스를 확장합니다. 서버는 @ref{1da3,,DocXMLRPCServer}를 사용하여 독립적이거나, @ref{41f1,,DocCGIXMLRPCRequestHandler}를 사용하여 CGI 환경에 내장될 수 있습니다.

@geindex DocXMLRPCServer (xmlrpc.server 클래스)
@anchor{library/xmlrpc server xmlrpc server DocXMLRPCServer}@anchor{1da3}
@deffn {클래스} xmlrpc.server.DocXMLRPCServer (addr, requestHandler=DocXMLRPCRequestHandler, logRequests=True, allow_none=False, encoding=None, bind_and_activate=True, use_builtin_types=True)

새 서버 인스턴스를 만듭니다. 모든 매개 변수는 @ref{41e0,,SimpleXMLRPCServer}와 같은 의미입니다; `requestHandler'의 기본값은 @ref{41f2,,DocXMLRPCRequestHandler} 입니다.


버전 3.3에서 변경: `use_builtin_types' 플래그가 추가되었습니다.

@end deffn

@geindex DocCGIXMLRPCRequestHandler (xmlrpc.server 클래스)
@anchor{library/xmlrpc server xmlrpc server DocCGIXMLRPCRequestHandler}@anchor{41f1}
@deffn {클래스} xmlrpc.server.DocCGIXMLRPCRequestHandler

CGI 환경에서 XML-RPC 요청을 처리할 새 인스턴스를 만듭니다.
@end deffn

@geindex DocXMLRPCRequestHandler (xmlrpc.server 클래스)
@anchor{library/xmlrpc server xmlrpc server DocXMLRPCRequestHandler}@anchor{41f2}
@deffn {클래스} xmlrpc.server.DocXMLRPCRequestHandler

새 요청 처리기 인스턴스를 만듭니다. 이 요청 처리기는 XML-RPC POST 요청과 설명서 GET 요청을 지원하고, @ref{1da3,,DocXMLRPCServer} 생성자 매개 변수에 대한 `logRequests' 매개 변수가 적용되도록 로깅을 수정합니다.
@end deffn

@node DocXMLRPCServer objects,DocCGIXMLRPCRequestHandler,XMLRPC 서버 문서화,xmlrpc server — 기본 XML-RPC 서버
@anchor{library/xmlrpc server doc-xmlrpc-servers}@anchor{41f3}@anchor{library/xmlrpc server docxmlrpcserver-objects}@anchor{41f4}
@subsubsection DocXMLRPCServer objects


@ref{1da3,,DocXMLRPCServer} 클래스는 @ref{41e0,,SimpleXMLRPCServer} 에서 파생되며 스스로 설명하는 독립형 XML-RPC 서버를 만드는 수단을 제공합니다. HTTP POST 요청은 XML-RPC 메서드 호출로 처리됩니다. HTTP GET 요청은 pydoc 스타일 HTML 문서를 생성하는 것으로 처리합니다. 이를 통해 서버는 자체 웹 기반 설명서를 제공할 수 있습니다.

@geindex set_server_title() (xmlrpc.server.DocXMLRPCServer 메서드)
@anchor{library/xmlrpc server xmlrpc server DocXMLRPCServer set_server_title}@anchor{41f5}
@deffn {메서드} DocXMLRPCServer.set_server_title (server_title)

생성된 HTML 설명서에 사용되는 제목을 설정합니다. 이 제목은 HTML “title” 요소 안에서 사용됩니다.
@end deffn

@geindex set_server_name() (xmlrpc.server.DocXMLRPCServer 메서드)
@anchor{library/xmlrpc server xmlrpc server DocXMLRPCServer set_server_name}@anchor{41f6}
@deffn {메서드} DocXMLRPCServer.set_server_name (server_name)

생성된 HTML 설명서에 사용되는 이름을 설정합니다. 이 이름은 설명서의 최상단의 “h1” 요소 안에 나타납니다.
@end deffn

@geindex set_server_documentation() (xmlrpc.server.DocXMLRPCServer 메서드)
@anchor{library/xmlrpc server xmlrpc server DocXMLRPCServer set_server_documentation}@anchor{41f7}
@deffn {메서드} DocXMLRPCServer.set_server_documentation (server_documentation)

생성된 HTML 설명서에 사용되는 설명을 설정합니다. 이 설명은 설명서에서 서버 이름 아래 단락으로 나타납니다.
@end deffn

@node DocCGIXMLRPCRequestHandler,,DocXMLRPCServer objects,xmlrpc server — 기본 XML-RPC 서버
@anchor{library/xmlrpc server doccgixmlrpcrequesthandler}@anchor{41f8}
@subsubsection DocCGIXMLRPCRequestHandler


@ref{41f1,,DocCGIXMLRPCRequestHandler} 클래스는 @ref{41e1,,CGIXMLRPCRequestHandler} 에서 파생되며 스스로 설명하는 XML-RPC CGI 스크립트를 만드는 수단을 제공합니다. HTTP POST 요청은 XML-RPC 메서드 호출로 처리됩니다. HTTP GET 요청은 pydoc 스타일 HTML 문서를 생성하는 것으로 처리합니다. 이를 통해 서버는 자체 웹 기반 설명서를 제공할 수 있습니다.

@geindex set_server_title() (xmlrpc.server.DocCGIXMLRPCRequestHandler 메서드)
@anchor{library/xmlrpc server xmlrpc server DocCGIXMLRPCRequestHandler set_server_title}@anchor{41f9}
@deffn {메서드} DocCGIXMLRPCRequestHandler.set_server_title (server_title)

생성된 HTML 설명서에 사용되는 제목을 설정합니다. 이 제목은 HTML “title” 요소 안에서 사용됩니다.
@end deffn

@geindex set_server_name() (xmlrpc.server.DocCGIXMLRPCRequestHandler 메서드)
@anchor{library/xmlrpc server xmlrpc server DocCGIXMLRPCRequestHandler set_server_name}@anchor{41fa}
@deffn {메서드} DocCGIXMLRPCRequestHandler.set_server_name (server_name)

생성된 HTML 설명서에 사용되는 이름을 설정합니다. 이 이름은 설명서의 최상단의 “h1” 요소 안에 나타납니다.
@end deffn

@geindex set_server_documentation() (xmlrpc.server.DocCGIXMLRPCRequestHandler 메서드)
@anchor{library/xmlrpc server xmlrpc server DocCGIXMLRPCRequestHandler set_server_documentation}@anchor{41fb}
@deffn {메서드} DocCGIXMLRPCRequestHandler.set_server_documentation (server_documentation)

생성된 HTML 설명서에 사용되는 설명을 설정합니다. 이 설명은 설명서에서 서버 이름 아래 단락으로 나타납니다.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node ipaddress — IPv4/IPv6 조작 라이브러리,,xmlrpc server — 기본 XML-RPC 서버,인터넷 프로토콜과 지원
@anchor{library/ipaddress doc}@anchor{41fc}@anchor{library/ipaddress ipaddress-ipv4-ipv6-manipulation-library}@anchor{41fd}@anchor{library/ipaddress module-ipaddress}@anchor{84}@anchor{library/ipaddress translation-repo}@anchor{41fe}
@subsection @code{ipaddress} — IPv4/IPv6 조작 라이브러리


@geindex module; ipaddress

`소스 코드:' Lib/ipaddress.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/ipaddress.py}


__________________________________________________________________


@code{ipaddress} provides the capabilities to create, manipulate and
operate on IPv4 and IPv6 addresses and networks.

이 모듈의 함수와 클래스를 사용하면 두 호스트가 같은 서브 네트에 있는지 확인하기, 특정 서브 네트의 모든 호스트를 이터레이트 하기, 문자열이 유효한 IP 주소나 네트워크를 나타내는지 검사하기 등 IP 주소와 관련된 다양한 작업을 간단하게 처리할 수 있습니다.

이것은 전체 모듈 API 레퍼런스입니다 - 개요와 소개는 @ref{41ff,,ipaddress 모듈에 대한 소개}를 참조하십시오.


Added in version 3.3.


@c import ipaddress
@c from ipaddress import (
@c     ip_network, IPv4Address, IPv4Interface, IPv4Network,
@c )

@menu
* 편의 팩토리 함수:: 
* IP 주소:: 
* IP 네트워크 정의:: 
* 인터페이스 객체:: 
* 다른 모듈 수준 함수:: 
* 맞춤 예외:: 

@end menu

@node 편의 팩토리 함수,IP 주소,,ipaddress — IPv4/IPv6 조작 라이브러리
@anchor{library/ipaddress convenience-factory-functions}@anchor{4200}
@subsubsection 편의 팩토리 함수


The @code{ipaddress} module provides factory functions to conveniently create
IP addresses, networks and interfaces:

@geindex ip_address() (ipaddress 모듈)
@anchor{library/ipaddress ipaddress ip_address}@anchor{4201}
@deffn {함수} ipaddress.ip_address (address)

인자로 전달된 IP 주소에 따라 @ref{50b,,IPv4Address} 나 @ref{50c,,IPv6Address} 객체를 반환합니다. IPv4나 IPv6 주소가 제공될 수 있습니다; @code{2**32} 보다 작은 정수는 기본적으로 IPv4로 간주합니다. `address'가 유효한 IPv4나 IPv6 주소를 나타내지 않으면 @ref{2ec,,ValueError}가 발생합니다.

@example
>>> ipaddress.ip_address('192.168.0.1')
IPv4Address('192.168.0.1')
>>> ipaddress.ip_address('2001:db8::')
IPv6Address('2001:db8::')
@end example
@end deffn

@geindex ip_network() (ipaddress 모듈)
@anchor{library/ipaddress ipaddress ip_network}@anchor{4202}
@deffn {함수} ipaddress.ip_network (address, strict=True)

인자로 전달된 IP 주소에 따라 @ref{50d,,IPv4Network} 나 @ref{50e,,IPv6Network} 객체를 반환합니다. `address'는 IP 네트워크를 나타내는 문자열이나 정수입니다. IPv4나 IPv6 네트워크가 제공될 수 있습니다; @code{2**32} 보다 작은 정수는 기본적으로 IPv4로 간주합니다. `strict'는 @code{IPv4Network} 나 @code{IPv6Network} 생성자로 전달됩니다. `address'가 유효한 IPv4나 IPv6 주소를 나타내지 않거나, 네트워크에 호스트 비트가 설정되어있으면 @ref{2ec,,ValueError}가 발생합니다.

@example
>>> ipaddress.ip_network('192.168.0.0/28')
IPv4Network('192.168.0.0/28')
@end example
@end deffn

@geindex ip_interface() (ipaddress 모듈)
@anchor{library/ipaddress ipaddress ip_interface}@anchor{4203}
@deffn {함수} ipaddress.ip_interface (address)

인자로 전달된 IP 주소에 따라 @ref{1b97,,IPv4Interface} 나 @ref{1b98,,IPv6Interface} 객체를 반환합니다. `address'는 IP 주소를 나타내는 문자열이나 정수입니다. IPv4나 IPv6 주소가 제공될 수 있습니다. @code{2**32} 보다 작은 정수는 기본적으로 IPv4로 간주합니다. `address'가 유효한 IPv4나 IPv6 주소를 나타내지 않으면 @ref{2ec,,ValueError}가 발생합니다.
@end deffn

이러한 편의 함수들의 한 가지 단점은 IPv4와 IPv6 형식을 모두 처리해야 한다는 것이, 함수가 IPv4나 IPv6 형식 중 어느 것을 의도하는지 알 수 없기 때문에, 에러 메시지가 정확한 에러에 대한 정보를 최소한으로만 제공한다는 것을 의미한다는 것입니다. 적절한 버전 별 클래스 생성자를 직접 호출하여 더 자세한 에러 보고를 얻을 수 있습니다.

@node IP 주소,IP 네트워크 정의,편의 팩토리 함수,ipaddress — IPv4/IPv6 조작 라이브러리
@anchor{library/ipaddress ip-addresses}@anchor{4204}
@subsubsection IP 주소


@menu
* 주소 객체:: 
* 문자열과 정수로의 변환:: 
* 연산자: 연산자<2>. 

@end menu

@node 주소 객체,문자열과 정수로의 변환,,IP 주소
@anchor{library/ipaddress address-objects}@anchor{4205}
@subsubsection 주소 객체


@ref{50b,,IPv4Address}와 @ref{50c,,IPv6Address} 객체는 많은 공통 어트리뷰트를 공유합니다. IPv6 주소에만 의미가 있는 일부 어트리뷰트는 두 IP 버전을 모두 올바르게 처리하는 코드를 더 쉽게 작성할 수 있도록 @code{IPv4Address} 객체에 의해 구현됩니다. 주소 객체는 @ref{823,,해시 가능}해서, 딕셔너리에서 키로 사용할 수 있습니다.

@geindex IPv4Address (ipaddress 클래스)
@anchor{library/ipaddress ipaddress IPv4Address}@anchor{50b}
@deffn {클래스} ipaddress.IPv4Address (address)

IPv4 주소를 구성합니다. `address'가 유효한 IPv4 주소가 아니면 @ref{4206,,AddressValueError} 가 발생합니다.

다음은 유효한 IPv4 주소를 구성합니다:


@enumerate 

@item 
점으로 구분된, 0–255 범위의 4개의 십진 정수로 구성되는 십진 점 표기법의 문자열 (예를 들어 @code{192.168.0.1}). 각 정수는 주소의 옥텟(바이트)을 나타냅니다. 8진수 표기법과의 혼동을 방지하기 위해 선행 0은 허용되지 않습니다.

@item 
32비트에 맞는 정수.

@item 
길이가 4인 @ref{192,,bytes} 객체에 채워진 정수 (가장 유효한 옥텟이 먼저 옵니다).
@end enumerate

@example
>>> ipaddress.IPv4Address('192.168.0.1')
IPv4Address('192.168.0.1')
>>> ipaddress.IPv4Address(3232235521)
IPv4Address('192.168.0.1')
>>> ipaddress.IPv4Address(b'\xC0\xA8\x00\x01')
IPv4Address('192.168.0.1')
@end example


버전 3.8에서 변경: Leading zeros are tolerated, even in ambiguous cases that look like
octal notation.



버전 3.9.5에서 변경: Leading zeros are no longer tolerated and are treated as an error.
IPv4 address strings are now parsed as strict as glibc
@ref{b5b,,inet_pton()}.


@geindex version (ipaddress.IPv4Address의 속성)
@anchor{library/ipaddress ipaddress IPv4Address version}@anchor{4207}
@deffn {속성} version

적절한 버전 번호: IPv4의 경우 @code{4}, IPv6의 경우 @code{6}.


버전 3.14에서 변경: Made available on the class.

@end deffn

@geindex max_prefixlen (ipaddress.IPv4Address의 속성)
@anchor{library/ipaddress ipaddress IPv4Address max_prefixlen}@anchor{4208}
@deffn {속성} max_prefixlen

이 버전에 대한 주소 표현의 총 비트 수: IPv4의 경우 @code{32}, IPv6의 경우 @code{128}.

접두사는 주소가 네트워크의 일부인지를 판별하기 위해 비교되는 주소의 선행 비트 수를 정의합니다.


버전 3.14에서 변경: Made available on the class.

@end deffn

@geindex compressed (ipaddress.IPv4Address의 속성)
@anchor{library/ipaddress ipaddress IPv4Address compressed}@anchor{4209}
@deffn {속성} compressed
@end deffn

@geindex exploded (ipaddress.IPv4Address의 속성)
@anchor{library/ipaddress ipaddress IPv4Address exploded}@anchor{420a}
@deffn {속성} exploded

점으로 구분된 십진 표기법의 문자열 표현. 선행 0은 표현에 포함되지 않습니다.

IPv4는 옥텟이 0으로 설정된 주소에 대한 약식 표기법을 정의하지 않기 때문에, 이 두 어트리뷰트는 IPv4 주소의 경우 항상 @code{str(addr)}과 같습니다. 이러한 어트리뷰트를 노출하면 IPv4와 IPv6 주소를 모두 처리할 수 있는 디스플레이 코드를 더 쉽게 작성할 수 있습니다.
@end deffn

@geindex packed (ipaddress.IPv4Address의 속성)
@anchor{library/ipaddress ipaddress IPv4Address packed}@anchor{420b}
@deffn {속성} packed

이 주소의 바이너리 표현 - 적절한 길이의 @ref{192,,bytes} 객체 (가장 유효한 옥텟이 먼저 옵니다). IPv4의 경우 4바이트, IPv6의 경우 16바이트입니다.
@end deffn

@geindex reverse_pointer (ipaddress.IPv4Address의 속성)
@anchor{library/ipaddress ipaddress IPv4Address reverse_pointer}@anchor{101f}
@deffn {속성} reverse_pointer

IP 주소에 대한 역 DNS PTR 레코드의 이름, 예를 들어:

@example
>>> ipaddress.ip_address("127.0.0.1").reverse_pointer
'1.0.0.127.in-addr.arpa'
>>> ipaddress.ip_address("2001:db8::1").reverse_pointer
'1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa'
@end example

이 이름은 결정된(resolved) 호스트명 자체가 아니라 PTR 조회를 수행하는 데 사용할 수 있는 이름입니다.


Added in version 3.5.

@end deffn

@geindex is_multicast (ipaddress.IPv4Address의 속성)
@anchor{library/ipaddress ipaddress IPv4Address is_multicast}@anchor{420c}
@deffn {속성} is_multicast

주소가 멀티캐스트용으로 예약되었으면 @code{True}. 
@geindex RFC; RFC 3171
RFC 3171@footnote{https://datatracker.ietf.org/doc/html/rfc3171.html}(IPv4의 경우)이나 
@geindex RFC; RFC 2373
RFC 2373@footnote{https://datatracker.ietf.org/doc/html/rfc2373.html}(IPv6의 경우)을 참조하십시오.
@end deffn

@geindex is_private (ipaddress.IPv4Address의 속성)
@anchor{library/ipaddress ipaddress IPv4Address is_private}@anchor{19c3}
@deffn {속성} is_private

다음을 제외하고 iana-ipv4-special-registry@footnote{https://www.iana.org/assignments/iana-ipv4-special-registry/iana-ipv4-special-registry.xhtml}(IPv4의 경우)나 iana-ipv6-special-registry@footnote{https://www.iana.org/assignments/iana-ipv6-special-registry/iana-ipv6-special-registry.xhtml}(IPv6의 경우)에 의해 주소가 전역적으로 도달할 수 없도록 정의되었으면 @code{True}:


@itemize *

@item 
@code{is_private} is @code{False} for the shared address space (@code{100.64.0.0/10})

@item 
For IPv4-mapped IPv6-addresses the @code{is_private} value is determined by the
semantics of the underlying IPv4 addresses and the following condition holds
(see @ref{420d,,IPv6Address.ipv4_mapped}):

@example
address.is_private == address.ipv4_mapped.is_private
@end example
@end itemize

@code{is_private} has value opposite to @ref{115e,,is_global}, except for the shared address space
(@code{100.64.0.0/10} range) where they are both @code{False}.


버전 3.13에서 변경: Fixed some false positives and false negatives.


@itemize *

@item 
@code{192.0.0.0/24} is considered private with the exception of @code{192.0.0.9/32} and
@code{192.0.0.10/32} (previously: only the @code{192.0.0.0/29} sub-range was considered private).

@item 
@code{64:ff9b:1::/48} is considered private.

@item 
@code{2002::/16} is considered private.

@item 
There are exceptions within @code{2001::/23} (otherwise considered private): @code{2001:1::1/128},
@code{2001:1::2/128}, @code{2001:3::/32}, @code{2001:4:112::/48}, @code{2001:20::/28}, @code{2001:30::/28}.
The exceptions are not considered private.
@end itemize

@end deffn

@geindex is_global (ipaddress.IPv4Address의 속성)
@anchor{library/ipaddress ipaddress IPv4Address is_global}@anchor{115e}
@deffn {속성} is_global

다음을 제외하고 iana-ipv4-special-registry@footnote{https://www.iana.org/assignments/iana-ipv4-special-registry/iana-ipv4-special-registry.xhtml}(IPv4의 경우)나 iana-ipv6-special-registry@footnote{https://www.iana.org/assignments/iana-ipv6-special-registry/iana-ipv6-special-registry.xhtml}(IPv6의 경우)에 의해 주소가 전역적으로 도달할 수 있도록 정의되었으면 @code{True}:

For IPv4-mapped IPv6-addresses the @code{is_private} value is determined by the
semantics of the underlying IPv4 addresses and the following condition holds
(see @ref{420d,,IPv6Address.ipv4_mapped}):

@example
address.is_global == address.ipv4_mapped.is_global
@end example

@code{is_global} has value opposite to @ref{19c3,,is_private}, except for the shared address space
(@code{100.64.0.0/10} range) where they are both @code{False}.


Added in version 3.4.



버전 3.13에서 변경: Fixed some false positives and false negatives, see @ref{19c3,,is_private} for details.

@end deffn

@geindex is_unspecified (ipaddress.IPv4Address의 속성)
@anchor{library/ipaddress ipaddress IPv4Address is_unspecified}@anchor{420e}
@deffn {속성} is_unspecified

주소가 지정되지 않았으면 @code{True}. 
@geindex RFC; RFC 5735
RFC 5735@footnote{https://datatracker.ietf.org/doc/html/rfc5735.html}(IPv4의 경우)나 
@geindex RFC; RFC 2373
RFC 2373@footnote{https://datatracker.ietf.org/doc/html/rfc2373.html}(IPv6의 경우)을 참조하십시오.
@end deffn

@geindex is_reserved (ipaddress.IPv4Address의 속성)
@anchor{library/ipaddress ipaddress IPv4Address is_reserved}@anchor{420f}
@deffn {속성} is_reserved

@code{True} if the address is noted as reserved by the IETF.
For IPv4, this is only @code{240.0.0.0/4}, the @code{Reserved} address block.
For IPv6, this is all addresses allocated@footnote{https://www.iana.org/assignments/ipv6-address-space/ipv6-address-space.xhtml} as
@code{Reserved by IETF} for future use.

@cartouche
@quotation 참고 
For IPv4, @code{is_reserved} is not related to the address block value of the
@code{Reserved-by-Protocol} column in iana-ipv4-special-registry@footnote{https://www.iana.org/assignments/iana-ipv4-special-registry/iana-ipv4-special-registry.xhtml}.
@end quotation
@end cartouche

@cartouche
@quotation 조심 
For IPv6, @code{fec0::/10} a former Site-Local scoped address prefix is
currently excluded from that list (see @ref{4210,,is_site_local} & 
@geindex RFC; RFC 3879
RFC 3879@footnote{https://datatracker.ietf.org/doc/html/rfc3879.html}).
@end quotation
@end cartouche
@end deffn

@geindex is_loopback (ipaddress.IPv4Address의 속성)
@anchor{library/ipaddress ipaddress IPv4Address is_loopback}@anchor{4211}
@deffn {속성} is_loopback

이것이 루프 백 주소이면 @code{True}. 
@geindex RFC; RFC 3330
RFC 3330@footnote{https://datatracker.ietf.org/doc/html/rfc3330.html}(IPv4의 경우)이나 
@geindex RFC; RFC 2373
RFC 2373@footnote{https://datatracker.ietf.org/doc/html/rfc2373.html}(IPv6의 경우)을 참조하십시오.
@end deffn

@geindex is_link_local (ipaddress.IPv4Address의 속성)
@anchor{library/ipaddress ipaddress IPv4Address is_link_local}@anchor{4212}
@deffn {속성} is_link_local

주소가 링크 로컬 사용을 위해 예약되었으면 @code{True}. 
@geindex RFC; RFC 3927
RFC 3927@footnote{https://datatracker.ietf.org/doc/html/rfc3927.html}을 참조하십시오.
@end deffn

@geindex ipv6_mapped (ipaddress.IPv4Address의 속성)
@anchor{library/ipaddress ipaddress IPv4Address ipv6_mapped}@anchor{50a}
@deffn {속성} ipv6_mapped

@code{IPv4Address} object representing the IPv4-mapped IPv6 address. See 
@geindex RFC; RFC 4291
RFC 4291@footnote{https://datatracker.ietf.org/doc/html/rfc4291.html}.


Added in version 3.13.

@end deffn
@end deffn

@geindex __format__() (ipaddress.IPv4Address 메서드)
@anchor{library/ipaddress ipaddress IPv4Address __format__}@anchor{4213}
@deffn {메서드} IPv4Address.__format__ (fmt)

명시적 포맷 문자열로 제어되는 IP 주소의 문자열 표현을 반환합니다. `fmt'는 다음 중 하나일 수 있습니다: @ref{169,,str()}과 동등한 기본 옵션인 @code{'s'}, 0으로 채워진 이진수 문자열을 위한 @code{'b'}, 대문자나 소문자 16진수 표현을 위한 @code{'X'}나 @code{'x'}, 또는 IPv4 주소의 경우 @code{'b'}와 IPv6의 경우 @code{'x'}와 동등한 @code{'n'}. 이진수와 16진수 표현의 경우, 형식 지정자 @code{'#'}과 그룹화 옵션 @code{'_'}를 사용할 수 있습니다. @code{__format__}은 @code{format}, @code{str.format} 및 f-문자열에서 사용됩니다.

@example
>>> format(ipaddress.IPv4Address('192.168.0.1'))
'192.168.0.1'
>>> '@{:#b@}'.format(ipaddress.IPv4Address('192.168.0.1'))
'0b11000000101010000000000000000001'
>>> f'@{ipaddress.IPv6Address("2001:db8::1000"):s@}'
'2001:db8::1000'
>>> format(ipaddress.IPv6Address('2001:db8::1000'), '_X')
'2001_0DB8_0000_0000_0000_0000_0000_1000'
>>> '@{:#_n@}'.format(ipaddress.IPv6Address('2001:db8::1000'))
'0x2001_0db8_0000_0000_0000_0000_0000_1000'
@end example


Added in version 3.9.

@end deffn

@geindex IPv6Address (ipaddress 클래스)
@anchor{library/ipaddress ipaddress IPv6Address}@anchor{50c}
@deffn {클래스} ipaddress.IPv6Address (address)

IPv6 주소를 구성합니다. `address'가 유효한 IPv6 주소가 아니면 @ref{4206,,AddressValueError} 가 발생합니다.

다음은 유효한 IPv6 주소를 구성합니다:


@enumerate 

@item 
4개의 16진수로 구성된 그룹 8개로 구성된 문자열, 각 그룹은 16비트를 나타냅니다. 그룹은 콜론으로 구분됩니다. 이것은 `펼쳐진(exploded)' (longhand) 표기법을 기술합니다. 문자열은 다양한 방법으로 `압축될(compressed)' (약식 표기법) 수도 있습니다. 자세한 내용은 
@geindex RFC; RFC 4291
RFC 4291@footnote{https://datatracker.ietf.org/doc/html/rfc4291.html}을 참조하십시오. 예를 들어, @code{"0000:0000:0000:0000:0000:0abc:0007:0def"}는 @code{"::abc:7:def"}로 압축될 수 있습니다.

선택적으로, 문자열은 접미사 @code{%scope_id}로 표시되는 스코프 존(scope zone) ID를 가질 수도 있습니다. 존재하면, 스코프 ID는 비어 있지 않아야 하며, @code{%}를 포함할 수 없습니다. 자세한 내용은 
@geindex RFC; RFC 4007
RFC 4007@footnote{https://datatracker.ietf.org/doc/html/rfc4007.html}을 참조하십시오. 예를 들어, @code{fe80::1234%1}는 노드의 첫 번째 링크에서 주소 @code{fe80::1234}를 식별할 수 있습니다.

@item 
128비트에 맞는 정수.

@item 
길이가 16인 @ref{192,,bytes} 객체에 채워진 정수, 빅 엔디안.
@end enumerate

@example
>>> ipaddress.IPv6Address('2001:db8::1000')
IPv6Address('2001:db8::1000')
>>> ipaddress.IPv6Address('ff02::5678%1')
IPv6Address('ff02::5678%1')
@end example

@geindex compressed (ipaddress.IPv6Address의 속성)
@anchor{library/ipaddress ipaddress IPv6Address compressed}@anchor{4214}
@deffn {속성} compressed
@end deffn

주소 표현의 짧은 형식, 그룹에서 선행 0을 생략하고 0으로만 구성된 그룹의 가장 긴 시퀀스를 하나의 빈 그룹으로 축소됩니다.

이것은 IPv6 주소에 대해 @code{str(addr)}가 반환하는 값이기도 합니다.

@geindex exploded (ipaddress.IPv6Address의 속성)
@anchor{library/ipaddress ipaddress IPv6Address exploded}@anchor{4215}
@deffn {속성} exploded
@end deffn

주소 표현의 긴 형식, 모든 선행 0과 완전히 0으로 구성된 그룹이 포함됩니다.

다음 어트리뷰트와 메서드에 대해서는, @ref{50b,,IPv4Address} 클래스의 해당 설명서를 참조하십시오:

@geindex packed (ipaddress.IPv6Address의 속성)
@anchor{library/ipaddress ipaddress IPv6Address packed}@anchor{4216}
@deffn {속성} packed
@end deffn

@geindex reverse_pointer (ipaddress.IPv6Address의 속성)
@anchor{library/ipaddress ipaddress IPv6Address reverse_pointer}@anchor{193b}
@deffn {속성} reverse_pointer
@end deffn

@geindex version (ipaddress.IPv6Address의 속성)
@anchor{library/ipaddress ipaddress IPv6Address version}@anchor{4217}
@deffn {속성} version
@end deffn

@geindex max_prefixlen (ipaddress.IPv6Address의 속성)
@anchor{library/ipaddress ipaddress IPv6Address max_prefixlen}@anchor{4218}
@deffn {속성} max_prefixlen
@end deffn

@geindex is_multicast (ipaddress.IPv6Address의 속성)
@anchor{library/ipaddress ipaddress IPv6Address is_multicast}@anchor{4219}
@deffn {속성} is_multicast
@end deffn

@geindex is_private (ipaddress.IPv6Address의 속성)
@anchor{library/ipaddress ipaddress IPv6Address is_private}@anchor{19c4}
@deffn {속성} is_private
@end deffn

@geindex is_global (ipaddress.IPv6Address의 속성)
@anchor{library/ipaddress ipaddress IPv6Address is_global}@anchor{19c5}
@deffn {속성} is_global


Added in version 3.4.

@end deffn

@geindex is_unspecified (ipaddress.IPv6Address의 속성)
@anchor{library/ipaddress ipaddress IPv6Address is_unspecified}@anchor{421a}
@deffn {속성} is_unspecified
@end deffn

@geindex is_reserved (ipaddress.IPv6Address의 속성)
@anchor{library/ipaddress ipaddress IPv6Address is_reserved}@anchor{421b}
@deffn {속성} is_reserved
@end deffn

@geindex is_loopback (ipaddress.IPv6Address의 속성)
@anchor{library/ipaddress ipaddress IPv6Address is_loopback}@anchor{19aa}
@deffn {속성} is_loopback
@end deffn

@geindex is_link_local (ipaddress.IPv6Address의 속성)
@anchor{library/ipaddress ipaddress IPv6Address is_link_local}@anchor{421c}
@deffn {속성} is_link_local
@end deffn

@geindex is_site_local (ipaddress.IPv6Address의 속성)
@anchor{library/ipaddress ipaddress IPv6Address is_site_local}@anchor{4210}
@deffn {속성} is_site_local

주소가 사이트 로컬 사용을 위해 예약되었으면 @code{True}. 사이트 로컬 주소 공간은 
@geindex RFC; RFC 3879
RFC 3879@footnote{https://datatracker.ietf.org/doc/html/rfc3879.html}에서 폐지되었음에 유의하십시오. @ref{19c3,,is_private}를 사용하여 이 주소가 
@geindex RFC; RFC 4193
RFC 4193@footnote{https://datatracker.ietf.org/doc/html/rfc4193.html}에 의해 정의된 고유한 로컬 주소 공간에 있는지 검사하십시오.
@end deffn

@geindex ipv4_mapped (ipaddress.IPv6Address의 속성)
@anchor{library/ipaddress ipaddress IPv6Address ipv4_mapped}@anchor{420d}
@deffn {속성} ipv4_mapped

IPv4에 매핑된 주소(@code{::FFFF/96}으로 시작합니다)로 표시되는 주소의 경우, 이 프로퍼티는 내장 IPv4 주소를 보고합니다. 다른 주소의 경우, 이 프로퍼티는 @code{None}이 됩니다.
@end deffn

@geindex scope_id (ipaddress.IPv6Address의 속성)
@anchor{library/ipaddress ipaddress IPv6Address scope_id}@anchor{b0a}
@deffn {속성} scope_id

@geindex RFC; RFC 4007
RFC 4007@footnote{https://datatracker.ietf.org/doc/html/rfc4007.html}에서 정의된 스코프 지정된 주소의 경우, 이 프로퍼티는 주소가 속한 주소 스코프의 특정 존(zone)을 문자열로 식별합니다. 스코프 존이 지정되지 않았으면, 이 프로퍼티는 @code{None}입니다.
@end deffn

@geindex sixtofour (ipaddress.IPv6Address의 속성)
@anchor{library/ipaddress ipaddress IPv6Address sixtofour}@anchor{421d}
@deffn {속성} sixtofour

@geindex RFC; RFC 3056
RFC 3056@footnote{https://datatracker.ietf.org/doc/html/rfc3056.html}에서 정의한 6to4 주소(@code{2002::/16}으로 시작합니다)인 것으로 보이는 주소의 경우, 이 프로퍼티는 내장 IPv4 주소를 보고합니다. 다른 주소의 경우, 이 프로퍼티는 @code{None}이 됩니다.
@end deffn

@geindex teredo (ipaddress.IPv6Address의 속성)
@anchor{library/ipaddress ipaddress IPv6Address teredo}@anchor{421e}
@deffn {속성} teredo

@geindex RFC; RFC 4380
RFC 4380@footnote{https://datatracker.ietf.org/doc/html/rfc4380.html}에서 정의한 Teredo 주소(@code{2001::/32}로 시작합니다)인 것으로 보이는 주소의 경우, 이 프로퍼티는 내장 @code{(server, client)} IP 주소 쌍을 보고합니다. 다른 주소의 경우, 이 프로퍼티는 @code{None}이 됩니다.
@end deffn
@end deffn

@geindex __format__() (ipaddress.IPv6Address 메서드)
@anchor{library/ipaddress ipaddress IPv6Address __format__}@anchor{421f}
@deffn {메서드} IPv6Address.__format__ (fmt)

@ref{50b,,IPv4Address} 의 해당 메서드 설명서를 참조하십시오.


Added in version 3.9.

@end deffn

@node 문자열과 정수로의 변환,연산자<2>,주소 객체,IP 주소
@anchor{library/ipaddress conversion-to-strings-and-integers}@anchor{4220}
@subsubsection 문자열과 정수로의 변환


socket 모듈과 같은 네트워킹 인터페이스와 상호 운용하려면, 주소를 문자열이나 정수로 변환해야 합니다. 이것은 @ref{169,,str()}과 @ref{19b,,int()} 내장 함수를 사용하여 처리됩니다:

@example
>>> str(ipaddress.IPv4Address('192.168.0.1'))
'192.168.0.1'
>>> int(ipaddress.IPv4Address('192.168.0.1'))
3232235521
>>> str(ipaddress.IPv6Address('::1'))
'::1'
>>> int(ipaddress.IPv6Address('::1'))
1
@end example

IPv6 스코프 지정된 주소는 스코프 존 ID 없이 정수로 변환됨에 유의하십시오.

@node 연산자<2>,,문자열과 정수로의 변환,IP 주소
@anchor{library/ipaddress operators}@anchor{4221}
@subsubsection 연산자


주소 객체는 일부 연산자를 지원합니다. 달리 명시하지 않는 한, 연산자는 호환 가능한 객체 간에만 적용할 수 있습니다 (즉 IPv4와 IPv4, IPv6와 IPv6).

@menu
* 비교 연산자:: 
* 산술 연산자:: 

@end menu

@node 비교 연산자,산술 연산자,,연산자<2>
@anchor{library/ipaddress comparison-operators}@anchor{4222}
@subsubsection 비교 연산자


주소 객체는 일반적인 비교 연산자 집합으로 비교할 수 있습니다. 다른 스코프 존(scope zone) ID를 가진 같은 IPv6 주소는 같지 않습니다. 몇 가지 예:

@example
>>> IPv4Address('127.0.0.2') > IPv4Address('127.0.0.1')
True
>>> IPv4Address('127.0.0.2') == IPv4Address('127.0.0.1')
False
>>> IPv4Address('127.0.0.2') != IPv4Address('127.0.0.1')
True
>>> IPv6Address('fe80::1234') == IPv6Address('fe80::1234%1')
False
>>> IPv6Address('fe80::1234%1') != IPv6Address('fe80::1234%2')
True
@end example

@node 산술 연산자,,비교 연산자,연산자<2>
@anchor{library/ipaddress arithmetic-operators}@anchor{4223}
@subsubsection 산술 연산자


주소 객체에 정수를 더하거나 뺄 수 있습니다. 몇 가지 예:

@example
>>> IPv4Address('127.0.0.2') + 3
IPv4Address('127.0.0.5')
>>> IPv4Address('127.0.0.2') - 3
IPv4Address('126.255.255.255')
>>> IPv4Address('255.255.255.255') + 1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ipaddress.AddressValueError: 4294967296 (>= 2**32) is not permitted as an IPv4 address
@end example

@node IP 네트워크 정의,인터페이스 객체,IP 주소,ipaddress — IPv4/IPv6 조작 라이브러리
@anchor{library/ipaddress ip-network-definitions}@anchor{4224}
@subsubsection IP 네트워크 정의


@ref{50d,,IPv4Network} 와 @ref{50e,,IPv6Network} 객체는 IP 네트워크 정의를 정의하고 검사하기 위한 메커니즘을 제공합니다. 네트워크 정의는 `마스크(mask)'와 `네트워크 주소(network address)'로 구성되며, 마스크로 마스크 (바이너리 AND) 될 때 네트워크 주소와 같은 IP 주소 범위를 정의합니다. 예를 들어,, 마스크 @code{255.255.255.0}과 네트워크 주소 @code{192.168.1.0}으로 구성된 네트워크 정의는 @code{192.168.1.0}에서 @code{192.168.1.255}까지의 IP 주소로 구성됩니다.

@menu
* 접두사@comma{} 네트 마스크 및 호스트 마스크: 접두사 네트 마스크 및 호스트 마스크. 
* 네트워크 객체:: 
* 연산자: 연산자<3>. 

@end menu

@node 접두사 네트 마스크 및 호스트 마스크,네트워크 객체,,IP 네트워크 정의
@anchor{library/ipaddress prefix-net-mask-and-host-mask}@anchor{4225}
@subsubsection 접두사, 네트 마스크 및 호스트 마스크


IP 네트워크 마스크를 지정하는 몇 가지 동등한 방법이 있습니다. `접두사(prefix)' @code{/<nbits>}는 네트워크 마스크에 설정된 상위 비트 수를 나타내는 표기법입니다. `네트 마스크(net mask)'는 몇 개의 상위 비트가 설정된 IP 주소입니다. 따라서 접두사 @code{/24}는 IPv4에서 네트 마스크 @code{255.255.255.0}, 또는 IPv6에서 @code{ffff:ff00::}와 동등합니다. 또한 `호스트 마스크(host mask)'는 `네트 마스크(net mask)'의 논리적 역전이며, 때로 네트워크 마스크를 나타내기 위해 (예를 들어 Cisco 접근 제어 목록에서) 사용됩니다. IPv4에서 @code{/24}에 해당하는 호스트 마스크는 @code{0.0.0.255}입니다.

@node 네트워크 객체,연산자<3>,접두사 네트 마스크 및 호스트 마스크,IP 네트워크 정의
@anchor{library/ipaddress network-objects}@anchor{4226}
@subsubsection 네트워크 객체


주소 객체가 구현하는 모든 어트리뷰트는 네트워크 객체도 구현합니다. 또한, 네트워크 객체는 추가 어트리뷰트를 구현합니다. 이 모든 것은 @ref{50d,,IPv4Network} 와 @ref{50e,,IPv6Network} 사이에서 공통이라서, 중복을 피하고자 @code{IPv4Network} 에 대해서만 설명됩니다. 네트워크 객체는 @ref{823,,해시 가능}해서 딕셔너리에서 키로 사용할 수 있습니다.

@geindex IPv4Network (ipaddress 클래스)
@anchor{library/ipaddress ipaddress IPv4Network}@anchor{50d}
@deffn {클래스} ipaddress.IPv4Network (address, strict=True)

IPv4 네트워크 정의를 구성합니다. `address'는 다음 중 하나일 수 있습니다:


@enumerate 

@item 
IP 주소와 선택적 마스크로 구성되고, 슬래시(@code{/})로 구분된 문자열. IP 주소는 네트워크 주소이며, 마스크는 `접두사'를 뜻하는 단일 숫자이거나 IPv4 주소의 문자열 표현일 수 있습니다. 후자의 경우, 마스크는 0이 아닌 필드로 시작하면 `네트 마스크'로, 또는 0으로 시작하면 `호스트 마스크'로 해석되는데, `네트 마스크'로 취급되는 모든 0인 마스크만 유일한 예외입니다. 마스크가 제공되지 않으면, @code{/32}로 간주합니다.

예를 들어, 다음 `address' 명세는 동등합니다: @code{192.168.1.0/24}, @code{192.168.1.0/255.255.255.0} 및 @code{192.168.1.0/0.0.0.255}.

@item 
32비트에 맞는 정수. 이는 네트워크 주소가 `address'이고 마스크가 @code{/32}인 단일 주소 네트워크와 동등합니다.

@item 
길이가 4인 @ref{192,,bytes} 객체에 채워진 정수, 빅 엔디안. 해석은 정수 `address'와 유사합니다.

@item 
A two-tuple of an address description and a netmask, where the address
description is either a string, a 32-bits integer, a 4-bytes packed
integer, or an existing @ref{50b,,IPv4Address} object; and the netmask is either
an integer representing the prefix length (e.g. @code{24}) or a string
representing the prefix mask (e.g. @code{255.255.255.0}).
@end enumerate

`address'가 유효한 IPv4 주소가 아니면 @ref{4206,,AddressValueError} 가 발생합니다. 마스크가 IPv4 주소에 유효하지 않으면 @ref{4227,,NetmaskValueError} 가 발생합니다.

`strict'가 @code{True}이고 제공된 address에 호스트 비트가 설정되면, @ref{2ec,,ValueError}가 발생합니다. 그렇지 않으면, 적절한 네트워크 주소를 결정하기 위해 호스트 비트가 마스크 되어 제거됩니다.

달리 명시되지 않는 한, 다른 네트워크/주소 객체를 받아들이는 모든 네트워크 메서드는 인자의 IP 버전이 @code{self}와 호환되지 않으면 @ref{198,,TypeError}를 발생시킵니다.


버전 3.5에서 변경: `address' 생성자 매개 변수에 대해 2-튜플 형식을 추가했습니다.


@geindex version (ipaddress.IPv4Network의 속성)
@anchor{library/ipaddress ipaddress IPv4Network version}@anchor{4228}
@deffn {속성} version
@end deffn

@geindex max_prefixlen (ipaddress.IPv4Network의 속성)
@anchor{library/ipaddress ipaddress IPv4Network max_prefixlen}@anchor{4229}
@deffn {속성} max_prefixlen

@ref{50b,,IPv4Address} 의 해당 어트리뷰트 설명서를 참조하십시오.
@end deffn

@geindex is_multicast (ipaddress.IPv4Network의 속성)
@anchor{library/ipaddress ipaddress IPv4Network is_multicast}@anchor{422a}
@deffn {속성} is_multicast
@end deffn

@geindex is_private (ipaddress.IPv4Network의 속성)
@anchor{library/ipaddress ipaddress IPv4Network is_private}@anchor{422b}
@deffn {속성} is_private
@end deffn

@geindex is_unspecified (ipaddress.IPv4Network의 속성)
@anchor{library/ipaddress ipaddress IPv4Network is_unspecified}@anchor{422c}
@deffn {속성} is_unspecified
@end deffn

@geindex is_reserved (ipaddress.IPv4Network의 속성)
@anchor{library/ipaddress ipaddress IPv4Network is_reserved}@anchor{422d}
@deffn {속성} is_reserved
@end deffn

@geindex is_loopback (ipaddress.IPv4Network의 속성)
@anchor{library/ipaddress ipaddress IPv4Network is_loopback}@anchor{422e}
@deffn {속성} is_loopback
@end deffn

@geindex is_link_local (ipaddress.IPv4Network의 속성)
@anchor{library/ipaddress ipaddress IPv4Network is_link_local}@anchor{422f}
@deffn {속성} is_link_local

이 어트리뷰트들은 네트워크 주소와 브로드 캐스트 주소 모두에 대해 참이면 네트워크 전체에 대해 참입니다.
@end deffn

@geindex network_address (ipaddress.IPv4Network의 속성)
@anchor{library/ipaddress ipaddress IPv4Network network_address}@anchor{4230}
@deffn {속성} network_address

네트워크의 네트워크 주소. 네트워크 주소와 접두사 길이는 네트워크를 고유하게 정의합니다.
@end deffn

@geindex broadcast_address (ipaddress.IPv4Network의 속성)
@anchor{library/ipaddress ipaddress IPv4Network broadcast_address}@anchor{4231}
@deffn {속성} broadcast_address

네트워크의 브로드 캐스트 주소. 브로드 캐스트 주소로 전송된 패킷은 네트워크의 모든 호스트가 수신해야 합니다.
@end deffn

@geindex hostmask (ipaddress.IPv4Network의 속성)
@anchor{library/ipaddress ipaddress IPv4Network hostmask}@anchor{4232}
@deffn {속성} hostmask

@ref{50b,,IPv4Address} 객체로 제공되는 호스트 마스크.
@end deffn

@geindex netmask (ipaddress.IPv4Network의 속성)
@anchor{library/ipaddress ipaddress IPv4Network netmask}@anchor{4233}
@deffn {속성} netmask

@ref{50b,,IPv4Address} 객체로 제공되는 네트 마스크.
@end deffn

@geindex with_prefixlen (ipaddress.IPv4Network의 속성)
@anchor{library/ipaddress ipaddress IPv4Network with_prefixlen}@anchor{4234}
@deffn {속성} with_prefixlen
@end deffn

@geindex compressed (ipaddress.IPv4Network의 속성)
@anchor{library/ipaddress ipaddress IPv4Network compressed}@anchor{4235}
@deffn {속성} compressed
@end deffn

@geindex exploded (ipaddress.IPv4Network의 속성)
@anchor{library/ipaddress ipaddress IPv4Network exploded}@anchor{4236}
@deffn {속성} exploded

접두사 표기법의 마스크를 갖는 네트워크의 문자열 표현.

@code{with_prefixlen}과 @code{compressed}는 항상 @code{str(network)}와 같습니다. @code{exploded}는 펼쳐진 형식의 네트워크 주소를 사용합니다.
@end deffn

@geindex with_netmask (ipaddress.IPv4Network의 속성)
@anchor{library/ipaddress ipaddress IPv4Network with_netmask}@anchor{4237}
@deffn {속성} with_netmask

네트 마스크 표기법의 마스크를 갖는 네트워크의 문자열 표현.
@end deffn

@geindex with_hostmask (ipaddress.IPv4Network의 속성)
@anchor{library/ipaddress ipaddress IPv4Network with_hostmask}@anchor{4238}
@deffn {속성} with_hostmask

호스트 마스크 표기법의 마스크를 갖는 네트워크의 문자열 표현.
@end deffn

@geindex num_addresses (ipaddress.IPv4Network의 속성)
@anchor{library/ipaddress ipaddress IPv4Network num_addresses}@anchor{4239}
@deffn {속성} num_addresses

네트워크의 총 주소 수.
@end deffn

@geindex prefixlen (ipaddress.IPv4Network의 속성)
@anchor{library/ipaddress ipaddress IPv4Network prefixlen}@anchor{423a}
@deffn {속성} prefixlen

네트워크 접두사 길이, 비트 단위.
@end deffn

@geindex hosts() (ipaddress.IPv4Network 메서드)
@anchor{library/ipaddress ipaddress IPv4Network hosts}@anchor{17b5}
@deffn {메서드} hosts ()

네트워크에서 사용 가능한 호스트에 대한 이터레이터를 반환합니다. 사용 가능한 호스트는 네트워크 주소 자체와 네트워크 브로드 캐스트 주소를 제외하고, 네트워크에 속하는 IP 주소입니다. 마스크 길이가 31인 네트워크의 경우, 네트워크 주소와 네트워크 브로드 캐스트 주소도 결과에 포함됩니다. 마스크가 32인 네트워크는 단일 호스트 주소가 포함된 리스트를 반환합니다.

@example
>>> list(ip_network('192.0.2.0/29').hosts())
[IPv4Address('192.0.2.1'), IPv4Address('192.0.2.2'),
 IPv4Address('192.0.2.3'), IPv4Address('192.0.2.4'),
 IPv4Address('192.0.2.5'), IPv4Address('192.0.2.6')]
>>> list(ip_network('192.0.2.0/31').hosts())
[IPv4Address('192.0.2.0'), IPv4Address('192.0.2.1')]
>>> list(ip_network('192.0.2.1/32').hosts())
[IPv4Address('192.0.2.1')]
@end example
@end deffn

@geindex overlaps() (ipaddress.IPv4Network 메서드)
@anchor{library/ipaddress ipaddress IPv4Network overlaps}@anchor{423b}
@deffn {메서드} overlaps (other)

이 네트워크가 `other'에 부분적으로나 전체적으로 포함되어 있거나 `other'가 이 네트워크에 완전히 포함되면 @code{True}.
@end deffn

@geindex address_exclude() (ipaddress.IPv4Network 메서드)
@anchor{library/ipaddress ipaddress IPv4Network address_exclude}@anchor{423c}
@deffn {메서드} address_exclude (network)

지정된 `network'를 이 네트워크에서 제거하여 만들어지는 네트워크 정의를 계산합니다. 네트워크 객체의 이터레이터를 반환합니다. 이 네트워크에 `network'가 완전히 포함되지 않으면 @ref{2ec,,ValueError}가 발생합니다.

@example
>>> n1 = ip_network('192.0.2.0/28')
>>> n2 = ip_network('192.0.2.1/32')
>>> list(n1.address_exclude(n2))
[IPv4Network('192.0.2.8/29'), IPv4Network('192.0.2.4/30'),
 IPv4Network('192.0.2.2/31'), IPv4Network('192.0.2.0/32')]
@end example
@end deffn

@geindex subnets() (ipaddress.IPv4Network 메서드)
@anchor{library/ipaddress ipaddress IPv4Network subnets}@anchor{109f}
@deffn {메서드} subnets (prefixlen_diff=1, new_prefix=None)

인자 값에 따라, 현재 네트워크 정의를 만들기 위해 참여하는 서브 네트들. `prefixlen_diff'는 우리의 접두사 길이를 늘여야 하는 양입니다. `new_prefix'는 서브 네트의 원하는 새 접두사입니다; 우리의 접두사보다 커야 합니다. `prefixlen_diff'와 `new_prefix' 중 하나만 설정해야 합니다. 네트워크 객체의 이터레이터를 반환합니다.

@example
>>> list(ip_network('192.0.2.0/24').subnets())
[IPv4Network('192.0.2.0/25'), IPv4Network('192.0.2.128/25')]
>>> list(ip_network('192.0.2.0/24').subnets(prefixlen_diff=2))
[IPv4Network('192.0.2.0/26'), IPv4Network('192.0.2.64/26'),
 IPv4Network('192.0.2.128/26'), IPv4Network('192.0.2.192/26')]
>>> list(ip_network('192.0.2.0/24').subnets(new_prefix=26))
[IPv4Network('192.0.2.0/26'), IPv4Network('192.0.2.64/26'),
 IPv4Network('192.0.2.128/26'), IPv4Network('192.0.2.192/26')]
>>> list(ip_network('192.0.2.0/24').subnets(new_prefix=23))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
    raise ValueError('new prefix must be longer')
ValueError: new prefix must be longer
>>> list(ip_network('192.0.2.0/24').subnets(new_prefix=25))
[IPv4Network('192.0.2.0/25'), IPv4Network('192.0.2.128/25')]
@end example
@end deffn

@geindex supernet() (ipaddress.IPv4Network 메서드)
@anchor{library/ipaddress ipaddress IPv4Network supernet}@anchor{10a0}
@deffn {메서드} supernet (prefixlen_diff=1, new_prefix=None)

인자 값에 따라, 이 네트워크 정의를 포함하는 슈퍼 네트. `prefixlen_diff'는 우리의 접두사 길이를 줄여야 하는 양입니다. `new_prefix'는 슈퍼 네트의 원하는 새 접두사입니다; 우리의 접두사보다 작아야 합니다. `prefixlen_diff'와 `new_prefix' 중 하나만 설정해야 합니다. 단일 네트워크 객체를 반환합니다.

@example
>>> ip_network('192.0.2.0/24').supernet()
IPv4Network('192.0.2.0/23')
>>> ip_network('192.0.2.0/24').supernet(prefixlen_diff=2)
IPv4Network('192.0.0.0/22')
>>> ip_network('192.0.2.0/24').supernet(new_prefix=20)
IPv4Network('192.0.0.0/20')
@end example
@end deffn

@geindex subnet_of() (ipaddress.IPv4Network 메서드)
@anchor{library/ipaddress ipaddress IPv4Network subnet_of}@anchor{423d}
@deffn {메서드} subnet_of (other)

이 네트워크가 `other'의 서브 네트이면 @code{True}를 반환합니다.

@example
>>> a = ip_network('192.168.1.0/24')
>>> b = ip_network('192.168.1.128/30')
>>> b.subnet_of(a)
True
@end example


Added in version 3.7.

@end deffn

@geindex supernet_of() (ipaddress.IPv4Network 메서드)
@anchor{library/ipaddress ipaddress IPv4Network supernet_of}@anchor{423e}
@deffn {메서드} supernet_of (other)

이 네트워크가 `other'의 슈퍼 네트이면 @code{True}를 반환합니다.

@example
>>> a = ip_network('192.168.1.0/24')
>>> b = ip_network('192.168.1.128/30')
>>> a.supernet_of(b)
True
@end example


Added in version 3.7.

@end deffn

@geindex compare_networks() (ipaddress.IPv4Network 메서드)
@anchor{library/ipaddress ipaddress IPv4Network compare_networks}@anchor{423f}
@deffn {메서드} compare_networks (other)

이 네트워크를 `other'와 비교합니다. 이 비교에서는 네트워크 주소 만 고려됩니다; 호스트 비트는 고려하지 않습니다. @code{-1}, @code{0} 또는 @code{1}을 반환합니다.

@example
>>> ip_network('192.0.2.1/32').compare_networks(ip_network('192.0.2.2/32'))
-1
>>> ip_network('192.0.2.1/32').compare_networks(ip_network('192.0.2.0/32'))
1
>>> ip_network('192.0.2.1/32').compare_networks(ip_network('192.0.2.1/32'))
0
@end example


버전 3.7부터 폐지됨: “<”, “==” 및 “>”와 같은 순서와 비교 알고리즘을 사용합니다.

@end deffn
@end deffn

@geindex IPv6Network (ipaddress 클래스)
@anchor{library/ipaddress ipaddress IPv6Network}@anchor{50e}
@deffn {클래스} ipaddress.IPv6Network (address, strict=True)

IPv6 네트워크 정의를 구성합니다. `address'는 다음 중 하나일 수 있습니다:


@enumerate 

@item 
IP 주소와 선택적 접두사 길이로 구성되고 슬래시(@code{/})로 구분된 문자열. IP 주소는 네트워크 주소이며, 접두사 길이는 단일 숫자인 `접두사'여야 합니다. 접두사 길이가 제공되지 않으면, @code{/128}로 간주합니다.

현재 확장된 네트 마스크는 지원되지 않음에 유의하십시오. @code{2001:db00::0/24}는 유효한 인자이지만 @code{2001:db00::0/ffff:ff00::}는 아니라는 뜻입니다.

@item 
128비트에 맞는 정수. 이는 네트워크 주소가 `address'이고 마스크가 @code{/128}인 단일 주소 네트워크와 동등합니다.

@item 
길이가 16인 @ref{192,,bytes} 객체에 채워진 정수, 빅 엔디안. 해석은 정수 `address'와 유사합니다.

@item 
A two-tuple of an address description and a netmask, where the address
description is either a string, a 128-bits integer, a 16-bytes packed
integer, or an existing @ref{50c,,IPv6Address} object; and the netmask is an
integer representing the prefix length.
@end enumerate

`address'가 유효한 IPv6 주소가 아니면 @ref{4206,,AddressValueError} 가 발생합니다. 마스크가 IPv6 주소에 유효하지 않으면 @ref{4227,,NetmaskValueError} 가 발생합니다.

`strict'가 @code{True}이고 제공된 address에 호스트 비트가 설정되면, @ref{2ec,,ValueError}가 발생합니다. 그렇지 않으면, 적절한 네트워크 주소를 결정하기 위해 호스트 비트가 마스크 되어 제거됩니다.


버전 3.5에서 변경: `address' 생성자 매개 변수에 대해 2-튜플 형식을 추가했습니다.


@geindex version (ipaddress.IPv6Network의 속성)
@anchor{library/ipaddress ipaddress IPv6Network version}@anchor{4240}
@deffn {속성} version
@end deffn

@geindex max_prefixlen (ipaddress.IPv6Network의 속성)
@anchor{library/ipaddress ipaddress IPv6Network max_prefixlen}@anchor{4241}
@deffn {속성} max_prefixlen
@end deffn

@geindex is_multicast (ipaddress.IPv6Network의 속성)
@anchor{library/ipaddress ipaddress IPv6Network is_multicast}@anchor{4242}
@deffn {속성} is_multicast
@end deffn

@geindex is_private (ipaddress.IPv6Network의 속성)
@anchor{library/ipaddress ipaddress IPv6Network is_private}@anchor{4243}
@deffn {속성} is_private
@end deffn

@geindex is_unspecified (ipaddress.IPv6Network의 속성)
@anchor{library/ipaddress ipaddress IPv6Network is_unspecified}@anchor{4244}
@deffn {속성} is_unspecified
@end deffn

@geindex is_reserved (ipaddress.IPv6Network의 속성)
@anchor{library/ipaddress ipaddress IPv6Network is_reserved}@anchor{4245}
@deffn {속성} is_reserved
@end deffn

@geindex is_loopback (ipaddress.IPv6Network의 속성)
@anchor{library/ipaddress ipaddress IPv6Network is_loopback}@anchor{4246}
@deffn {속성} is_loopback
@end deffn

@geindex is_link_local (ipaddress.IPv6Network의 속성)
@anchor{library/ipaddress ipaddress IPv6Network is_link_local}@anchor{4247}
@deffn {속성} is_link_local
@end deffn

@geindex network_address (ipaddress.IPv6Network의 속성)
@anchor{library/ipaddress ipaddress IPv6Network network_address}@anchor{4248}
@deffn {속성} network_address
@end deffn

@geindex broadcast_address (ipaddress.IPv6Network의 속성)
@anchor{library/ipaddress ipaddress IPv6Network broadcast_address}@anchor{4249}
@deffn {속성} broadcast_address
@end deffn

@geindex hostmask (ipaddress.IPv6Network의 속성)
@anchor{library/ipaddress ipaddress IPv6Network hostmask}@anchor{424a}
@deffn {속성} hostmask
@end deffn

@geindex netmask (ipaddress.IPv6Network의 속성)
@anchor{library/ipaddress ipaddress IPv6Network netmask}@anchor{424b}
@deffn {속성} netmask
@end deffn

@geindex with_prefixlen (ipaddress.IPv6Network의 속성)
@anchor{library/ipaddress ipaddress IPv6Network with_prefixlen}@anchor{424c}
@deffn {속성} with_prefixlen
@end deffn

@geindex compressed (ipaddress.IPv6Network의 속성)
@anchor{library/ipaddress ipaddress IPv6Network compressed}@anchor{424d}
@deffn {속성} compressed
@end deffn

@geindex exploded (ipaddress.IPv6Network의 속성)
@anchor{library/ipaddress ipaddress IPv6Network exploded}@anchor{424e}
@deffn {속성} exploded
@end deffn

@geindex with_netmask (ipaddress.IPv6Network의 속성)
@anchor{library/ipaddress ipaddress IPv6Network with_netmask}@anchor{424f}
@deffn {속성} with_netmask
@end deffn

@geindex with_hostmask (ipaddress.IPv6Network의 속성)
@anchor{library/ipaddress ipaddress IPv6Network with_hostmask}@anchor{4250}
@deffn {속성} with_hostmask
@end deffn

@geindex num_addresses (ipaddress.IPv6Network의 속성)
@anchor{library/ipaddress ipaddress IPv6Network num_addresses}@anchor{4251}
@deffn {속성} num_addresses
@end deffn

@geindex prefixlen (ipaddress.IPv6Network의 속성)
@anchor{library/ipaddress ipaddress IPv6Network prefixlen}@anchor{4252}
@deffn {속성} prefixlen
@end deffn

@geindex hosts() (ipaddress.IPv6Network 메서드)
@anchor{library/ipaddress ipaddress IPv6Network hosts}@anchor{17b6}
@deffn {메서드} hosts ()

네트워크에서 사용 가능한 호스트에 대한 이터레이터를 반환합니다. 사용 가능한 호스트는 서브 네트 라우터 애니 캐스트 주소를 제외하고 네트워크에 속하는 모든 IP 주소입니다. 마스크 길이가 127인 네트워크의 경우, 서브 네트 라우터 애니 캐스트 주소도 결과에 포함됩니다. 마스크가 128인 네트워크는 단일 호스트 주소가 포함된 리스트를 반환합니다.
@end deffn

@geindex overlaps() (ipaddress.IPv6Network 메서드)
@anchor{library/ipaddress ipaddress IPv6Network overlaps}@anchor{4253}
@deffn {메서드} overlaps (other)
@end deffn

@geindex address_exclude() (ipaddress.IPv6Network 메서드)
@anchor{library/ipaddress ipaddress IPv6Network address_exclude}@anchor{4254}
@deffn {메서드} address_exclude (network)
@end deffn

@geindex subnets() (ipaddress.IPv6Network 메서드)
@anchor{library/ipaddress ipaddress IPv6Network subnets}@anchor{4255}
@deffn {메서드} subnets (prefixlen_diff=1, new_prefix=None)
@end deffn

@geindex supernet() (ipaddress.IPv6Network 메서드)
@anchor{library/ipaddress ipaddress IPv6Network supernet}@anchor{4256}
@deffn {메서드} supernet (prefixlen_diff=1, new_prefix=None)
@end deffn

@geindex subnet_of() (ipaddress.IPv6Network 메서드)
@anchor{library/ipaddress ipaddress IPv6Network subnet_of}@anchor{4257}
@deffn {메서드} subnet_of (other)
@end deffn

@geindex supernet_of() (ipaddress.IPv6Network 메서드)
@anchor{library/ipaddress ipaddress IPv6Network supernet_of}@anchor{4258}
@deffn {메서드} supernet_of (other)
@end deffn

@geindex compare_networks() (ipaddress.IPv6Network 메서드)
@anchor{library/ipaddress ipaddress IPv6Network compare_networks}@anchor{4259}
@deffn {메서드} compare_networks (other)

@ref{50d,,IPv4Network} 의 해당 어트리뷰트 설명서를 참조하십시오.
@end deffn

@geindex is_site_local (ipaddress.IPv6Network의 속성)
@anchor{library/ipaddress ipaddress IPv6Network is_site_local}@anchor{425a}
@deffn {속성} is_site_local

This attribute is true for the network as a whole if it is true
for both the network address and the broadcast address.
@end deffn
@end deffn

@node 연산자<3>,,네트워크 객체,IP 네트워크 정의
@anchor{library/ipaddress id1}@anchor{425b}
@subsubsection 연산자


네트워크 객체는 일부 연산자를 지원합니다. 달리 명시하지 않는 한, 연산자는 호환 가능한 객체 간에만 적용할 수 있습니다 (즉 IPv4와 IPv4, IPv6와 IPv6).

@menu
* 논리 연산자:: 
* 이터레이션:: 
* 주소 컨테이너로서의 네트워크:: 

@end menu

@node 논리 연산자,이터레이션,,연산자<3>
@anchor{library/ipaddress logical-operators}@anchor{425c}
@subsubsection 논리 연산자


네트워크 객체는 일반적인 논리 연산자 집합으로 비교할 수 있습니다. 네트워크 객체는 먼저 네트워크 주소로 정렬된 다음, 네트 마스크로 정렬됩니다.

@node 이터레이션,주소 컨테이너로서의 네트워크,논리 연산자,연산자<3>
@anchor{library/ipaddress iteration}@anchor{425d}
@subsubsection 이터레이션


네트워크에 속하는 모든 주소를 나열하기 위해 네트워크 객체를 이터레이트 할 수 있습니다. 이터레이션의 경우, 사용 불가능한 호스트를 포함하여 `모든' 호스트가 반환됩니다 (사용 가능한 호스트의 경우는 @ref{17b5,,hosts()} 메서드를 사용하십시오). 예:

@example
>>> for addr in IPv4Network('192.0.2.0/28'):
...     addr
...
IPv4Address('192.0.2.0')
IPv4Address('192.0.2.1')
IPv4Address('192.0.2.2')
IPv4Address('192.0.2.3')
IPv4Address('192.0.2.4')
IPv4Address('192.0.2.5')
IPv4Address('192.0.2.6')
IPv4Address('192.0.2.7')
IPv4Address('192.0.2.8')
IPv4Address('192.0.2.9')
IPv4Address('192.0.2.10')
IPv4Address('192.0.2.11')
IPv4Address('192.0.2.12')
IPv4Address('192.0.2.13')
IPv4Address('192.0.2.14')
IPv4Address('192.0.2.15')
@end example

@node 주소 컨테이너로서의 네트워크,,이터레이션,연산자<3>
@anchor{library/ipaddress networks-as-containers-of-addresses}@anchor{425e}
@subsubsection 주소 컨테이너로서의 네트워크


네트워크 객체는 주소의 컨테이너 역할을 할 수 있습니다. 몇 가지 예:

@example
>>> IPv4Network('192.0.2.0/28')[0]
IPv4Address('192.0.2.0')
>>> IPv4Network('192.0.2.0/28')[15]
IPv4Address('192.0.2.15')
>>> IPv4Address('192.0.2.6') in IPv4Network('192.0.2.0/28')
True
>>> IPv4Address('192.0.3.6') in IPv4Network('192.0.2.0/28')
False
@end example

@node 인터페이스 객체,다른 모듈 수준 함수,IP 네트워크 정의,ipaddress — IPv4/IPv6 조작 라이브러리
@anchor{library/ipaddress interface-objects}@anchor{425f}
@subsubsection 인터페이스 객체


인터페이스 객체는 @ref{823,,해시 가능}해서 딕셔너리에서 키로 사용할 수 있습니다.

@geindex IPv4Interface (ipaddress 클래스)
@anchor{library/ipaddress ipaddress IPv4Interface}@anchor{1b97}
@deffn {클래스} ipaddress.IPv4Interface (address)

IPv4 인터페이스를 구성합니다. `address'의 의미는 임의의 호스트 주소가 항상 허용된다는 점을 제외하고는 @ref{50d,,IPv4Network} 의 생성자와 같습니다.

@ref{1b97,,IPv4Interface}는 @ref{50b,,IPv4Address} 의 서브 클래스이기 때문에, 그 클래스의 모든 어트리뷰트를 상속합니다. 또한, 다음과 같은 어트리뷰트를 사용할 수 있습니다:

@geindex ip (ipaddress.IPv4Interface의 속성)
@anchor{library/ipaddress ipaddress IPv4Interface ip}@anchor{4260}
@deffn {속성} ip

네트워크 정보가 없는 주소 (@ref{50b,,IPv4Address}).

@example
>>> interface = IPv4Interface('192.0.2.5/24')
>>> interface.ip
IPv4Address('192.0.2.5')
@end example
@end deffn

@geindex network (ipaddress.IPv4Interface의 속성)
@anchor{library/ipaddress ipaddress IPv4Interface network}@anchor{4261}
@deffn {속성} network

이 인터페이스가 속한 네트워크 (@ref{50d,,IPv4Network}).

@example
>>> interface = IPv4Interface('192.0.2.5/24')
>>> interface.network
IPv4Network('192.0.2.0/24')
@end example
@end deffn

@geindex with_prefixlen (ipaddress.IPv4Interface의 속성)
@anchor{library/ipaddress ipaddress IPv4Interface with_prefixlen}@anchor{4262}
@deffn {속성} with_prefixlen

접두사 표기법의 마스크를 갖는 인터페이스의 문자열 표현.

@example
>>> interface = IPv4Interface('192.0.2.5/24')
>>> interface.with_prefixlen
'192.0.2.5/24'
@end example
@end deffn

@geindex with_netmask (ipaddress.IPv4Interface의 속성)
@anchor{library/ipaddress ipaddress IPv4Interface with_netmask}@anchor{4263}
@deffn {속성} with_netmask

네트워크를 네트 마스크로 사용하는 인터페이스의 문자열 표현.

@example
>>> interface = IPv4Interface('192.0.2.5/24')
>>> interface.with_netmask
'192.0.2.5/255.255.255.0'
@end example
@end deffn

@geindex with_hostmask (ipaddress.IPv4Interface의 속성)
@anchor{library/ipaddress ipaddress IPv4Interface with_hostmask}@anchor{4264}
@deffn {속성} with_hostmask

네트워크를 호스트 마스크로 사용하는 인터페이스의 문자열 표현.

@example
>>> interface = IPv4Interface('192.0.2.5/24')
>>> interface.with_hostmask
'192.0.2.5/0.0.0.255'
@end example
@end deffn
@end deffn

@geindex IPv6Interface (ipaddress 클래스)
@anchor{library/ipaddress ipaddress IPv6Interface}@anchor{1b98}
@deffn {클래스} ipaddress.IPv6Interface (address)

IPv6 인터페이스를 구성합니다. `address'의 의미는 임의의 호스트 주소가 항상 허용된다는 점을 제외하고는 @ref{50e,,IPv6Network} 의 생성자와 같습니다.

@ref{1b98,,IPv6Interface}는 @ref{50c,,IPv6Address} 의 서브 클래스이기 때문에, 그 클래스의 모든 어트리뷰트를 상속합니다. 또한, 다음과 같은 어트리뷰트를 사용할 수 있습니다:

@geindex ip (ipaddress.IPv6Interface의 속성)
@anchor{library/ipaddress ipaddress IPv6Interface ip}@anchor{4265}
@deffn {속성} ip
@end deffn

@geindex network (ipaddress.IPv6Interface의 속성)
@anchor{library/ipaddress ipaddress IPv6Interface network}@anchor{4266}
@deffn {속성} network
@end deffn

@geindex with_prefixlen (ipaddress.IPv6Interface의 속성)
@anchor{library/ipaddress ipaddress IPv6Interface with_prefixlen}@anchor{4267}
@deffn {속성} with_prefixlen
@end deffn

@geindex with_netmask (ipaddress.IPv6Interface의 속성)
@anchor{library/ipaddress ipaddress IPv6Interface with_netmask}@anchor{4268}
@deffn {속성} with_netmask
@end deffn

@geindex with_hostmask (ipaddress.IPv6Interface의 속성)
@anchor{library/ipaddress ipaddress IPv6Interface with_hostmask}@anchor{4269}
@deffn {속성} with_hostmask

@ref{1b97,,IPv4Interface} 의 해당 어트리뷰트 설명서를 참조하십시오.
@end deffn
@end deffn

@menu
* 연산자: 연산자<4>. 

@end menu

@node 연산자<4>,,,인터페이스 객체
@anchor{library/ipaddress id2}@anchor{426a}
@subsubsection 연산자


인터페이스 객체는 일부 연산자를 지원합니다. 달리 명시하지 않는 한, 연산자는 호환 가능한 객체 간에만 적용할 수 있습니다 (즉 IPv4와 IPv4, IPv6와 IPv6).

@menu
* 논리 연산자: 논리 연산자<2>. 

@end menu

@node 논리 연산자<2>,,,연산자<4>
@anchor{library/ipaddress id3}@anchor{426b}
@subsubsection 논리 연산자


인터페이스 객체는 일반적인 논리 연산자 집합으로 비교할 수 있습니다.

동등 비교(@code{==}과 @code{!=})의 경우, 같다고 비교되려면 IP 주소와 네트워크가 같아야 합니다. 인터페이스는 주소나 네트워크 객체와 같다고 비교되지 않습니다.

순서(@code{<}, @code{>} 등)의 경우 규칙이 다릅니다. 같은 IP 버전의 인터페이스와 주소 객체를 비교할 수 있으며, 주소 객체는 항상 인터페이스 객체보다 앞에 정렬됩니다. 두 개의 인터페이스 객체는 먼저 네트워크로 비교되고, 같으면  IP 주소로 비교됩니다.

@node 다른 모듈 수준 함수,맞춤 예외,인터페이스 객체,ipaddress — IPv4/IPv6 조작 라이브러리
@anchor{library/ipaddress other-module-level-functions}@anchor{426c}
@subsubsection 다른 모듈 수준 함수


이 모듈은 다음과 같은 모듈 수준 함수도 제공합니다:

@geindex v4_int_to_packed() (ipaddress 모듈)
@anchor{library/ipaddress ipaddress v4_int_to_packed}@anchor{426d}
@deffn {함수} ipaddress.v4_int_to_packed (address)

네트워크 (빅 엔디안) 순서로 채워진 길이 4인 바이트열로 주소를 표현합니다. `address'는 IPv4 IP 주소의 정수 표현입니다. 정수가 음수이거나 너무 커서 IPv4 IP 주소가 될 수 없으면 @ref{2ec,,ValueError}가 발생합니다.

@example
>>> ipaddress.ip_address(3221225985)
IPv4Address('192.0.2.1')
>>> ipaddress.v4_int_to_packed(3221225985)
b'\xc0\x00\x02\x01'
@end example
@end deffn

@geindex v6_int_to_packed() (ipaddress 모듈)
@anchor{library/ipaddress ipaddress v6_int_to_packed}@anchor{426e}
@deffn {함수} ipaddress.v6_int_to_packed (address)

네트워크 (빅 엔디안) 순서로 채워진 길이 16인 바이트열로 주소를 나타냅니다. `address'는 IPv6 IP 주소의 정수 표현입니다. 정수가 음수이거나 너무 커서 IPv6 IP 주소가 될 수 없으면 @ref{2ec,,ValueError}가 발생합니다.
@end deffn

@geindex summarize_address_range() (ipaddress 모듈)
@anchor{library/ipaddress ipaddress summarize_address_range}@anchor{10a1}
@deffn {함수} ipaddress.summarize_address_range (first, last)

첫 번째와 마지막 IP 주소가 주어진 요약된 네트워크 범위의 이터레이터를 반환합니다. `first'는 범위의 첫 번째 @ref{50b,,IPv4Address} 나 @ref{50c,,IPv6Address} 이고 `last'는 범위의 마지막 @code{IPv4Address} 나 @code{IPv6Address}입니다. `first'나 `last'가 IP 주소가 아니거나, 같은 버전이 아니면 @ref{198,,TypeError}가 발생합니다. `last'가 `first'보다 크지 않거나 `first' 주소 버전이 4나 6이 아니면 @ref{2ec,,ValueError}가 발생합니다.

@example
>>> [ipaddr for ipaddr in ipaddress.summarize_address_range(
...    ipaddress.IPv4Address('192.0.2.0'),
...    ipaddress.IPv4Address('192.0.2.130'))]
[IPv4Network('192.0.2.0/25'), IPv4Network('192.0.2.128/31'), IPv4Network('192.0.2.130/32')]
@end example
@end deffn

@geindex collapse_addresses() (ipaddress 모듈)
@anchor{library/ipaddress ipaddress collapse_addresses}@anchor{10a2}
@deffn {함수} ipaddress.collapse_addresses (addresses)

축약된 @ref{50d,,IPv4Network} 나 @ref{50e,,IPv6Network} 객체의 이터레이터를 반환합니다. `addresses'는 @code{IPv4Network} 나 @code{IPv6Network} 객체의 @ref{142c,,이터러블}입니다. `addresses'에 혼합 버전 객체가 포함되어 있으면 @ref{198,,TypeError}가 발생합니다.

@example
>>> [ipaddr for ipaddr in
... ipaddress.collapse_addresses([ipaddress.IPv4Network('192.0.2.0/25'),
... ipaddress.IPv4Network('192.0.2.128/25')])]
[IPv4Network('192.0.2.0/24')]
@end example
@end deffn

@geindex get_mixed_type_key() (ipaddress 모듈)
@anchor{library/ipaddress ipaddress get_mixed_type_key}@anchor{426f}
@deffn {함수} ipaddress.get_mixed_type_key (obj)

네트워크와 주소를 정렬하기에 적합한 키를 반환합니다. 주소와 네트워크 객체는 기본적으로 정렬할 수 없습니다; 이들은 근본적으로 달라서, 다음과 같은 표현은:

@example
IPv4Address('192.0.2.0') <= IPv4Network('192.0.2.0/24')
@end example

doesn’t make sense.  There are some times however, where you may wish to
have @code{ipaddress} sort these anyway.  If you need to do this, you can use
this function as the `key' argument to @ref{dc6,,sorted()}.

`obj'는 네트워크나 주소 객체입니다.
@end deffn

@node 맞춤 예외,,다른 모듈 수준 함수,ipaddress — IPv4/IPv6 조작 라이브러리
@anchor{library/ipaddress custom-exceptions}@anchor{4270}
@subsubsection 맞춤 예외


클래스 생성자의 더욱 구체적인 에러 보고를 지원하기 위해, 모듈은 다음 예외를 정의합니다:

@geindex AddressValueError
@anchor{library/ipaddress ipaddress AddressValueError}@anchor{4206}
@deffn {예외} ipaddress.AddressValueError (ValueError)

주소와 관련된 모든 값 에러.
@end deffn

@geindex NetmaskValueError
@anchor{library/ipaddress ipaddress NetmaskValueError}@anchor{4227}
@deffn {예외} ipaddress.NetmaskValueError (ValueError)

네트 마스크와 관련된 모든 값 에러.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 멀티미디어 서비스,국제화,인터넷 프로토콜과 지원,파이썬 표준 라이브러리
@anchor{library/mm doc}@anchor{4271}@anchor{library/mm mmedia}@anchor{4272}@anchor{library/mm multimedia-services}@anchor{4273}@anchor{library/mm translation-repo}@anchor{4274}
@section 멀티미디어 서비스


이 장에서 설명하는 모듈은 주로 멀티미디어 응용 프로그램에 유용한 다양한 알고리즘 또는 인터페이스를 구현합니다. 가용성은 설치에 달려있습니다. 다음은 개요입니다:

@menu
* wave — WAV 파일 읽고 쓰기:: 
* colorsys — 색 체계 간의 변환:: 

@end menu

@node wave — WAV 파일 읽고 쓰기,colorsys — 색 체계 간의 변환,,멀티미디어 서비스
@anchor{library/wave doc}@anchor{4275}@anchor{library/wave module-wave}@anchor{119}@anchor{library/wave wave-read-and-write-wav-files}@anchor{4276}
@subsection @code{wave} — WAV 파일 읽고 쓰기


@geindex module; wave

@c Documentations stolen from comments in file.

`소스 코드:' Lib/wave.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/wave.py}


__________________________________________________________________


The @code{wave} module provides a convenient interface to the Waveform Audio
“WAVE” (or “WAV”) file format. Only uncompressed PCM encoded wave files are
supported.


버전 3.12에서 변경: Support for @code{WAVE_FORMAT_EXTENSIBLE} headers was added, provided that the
extended format is @code{KSDATAFORMAT_SUBTYPE_PCM}.


The @code{wave} module defines the following function and exception:

@geindex open() (wave 모듈)
@anchor{library/wave wave open}@anchor{b45}
@deffn {함수} wave.open (file, mode=None)

`file'이 문자열이면, 그 이름의 파일을 엽니다, 그렇지 않으면 파일류 객체로 처리합니다. `mode'는 다음 중 하나일 수 있습니다:


@table @asis

@item @code{'rb'}

읽기 전용 모드.

@item @code{'wb'}

쓰기 전용 모드.
@end table

WAV 파일의 읽기와 쓰기를 동시에 허락하지 않음에 유의하십시오.

@code{'rb'} `mode'는 @ref{336,,Wave_read} 객체를 반환하고, @code{'wb'} `mode'는 @ref{337,,Wave_write} 객체를 반환합니다. `mode'가 생략되고, 파일류 객체가 `file'로 전달되면, @code{file.mode}가 `mode'의 기본값으로 사용됩니다.

파일류 객체를 전달하면, @code{close()} 메서드가 호출될 때 wave 객체는 그 파일을 닫지 않습니다. 파일 객체를 닫는 것은 호출자의 책임입니다.

@ref{b45,,open()} 함수는 @ref{186,,with} 문과 함께 사용할 수 있습니다. @code{with} 블록이 완료될 때, @ref{4277,,Wave_read.close()}나 @ref{4278,,Wave_write.close()} 메서드가 호출됩니다.


버전 3.4에서 변경: 위치 변경할 수 없는(unseekable) 파일에 대한 지원이 추가되었습니다.

@end deffn

@geindex Error
@anchor{library/wave wave Error}@anchor{4279}
@deffn {예외} wave.Error

WAV 명세를 위반하거나 구현 결함으로 인해 무언가가 불가능할 때 발생하는 에러.
@end deffn

@menu
* Wave_read 객체:: 
* Wave_write 객체:: 

@end menu

@node Wave_read 객체,Wave_write 객체,,wave — WAV 파일 읽고 쓰기
@anchor{library/wave id1}@anchor{427a}@anchor{library/wave wave-read-objects}@anchor{427b}
@subsubsection Wave_read 객체


@geindex Wave_read (wave 클래스)
@anchor{library/wave wave Wave_read}@anchor{336}
@deffn {클래스} wave.Wave_read

WAV 파일을 읽습니다.

@ref{b45,,open()}이 반환하는, Wave_read 객체는 다음과 같은 메서드를 가지고 있습니다:

@geindex close() (wave.Wave_read 메서드)
@anchor{library/wave wave Wave_read close}@anchor{4277}
@deffn {메서드} close ()

Close the stream if it was opened by @code{wave}, and make the instance
unusable.  This is called automatically on object collection.
@end deffn

@geindex getnchannels() (wave.Wave_read 메서드)
@anchor{library/wave wave Wave_read getnchannels}@anchor{427c}
@deffn {메서드} getnchannels ()

오디오 채널 수를 반환합니다 (모노는 @code{1}, 스테레오는 @code{2}).
@end deffn

@geindex getsampwidth() (wave.Wave_read 메서드)
@anchor{library/wave wave Wave_read getsampwidth}@anchor{427d}
@deffn {메서드} getsampwidth ()

샘플 폭을 바이트 단위로 반환합니다.
@end deffn

@geindex getframerate() (wave.Wave_read 메서드)
@anchor{library/wave wave Wave_read getframerate}@anchor{427e}
@deffn {메서드} getframerate ()

샘플링 빈도를 반환합니다.
@end deffn

@geindex getnframes() (wave.Wave_read 메서드)
@anchor{library/wave wave Wave_read getnframes}@anchor{427f}
@deffn {메서드} getnframes ()

오디오 프레임의 수를 반환합니다.
@end deffn

@geindex getcomptype() (wave.Wave_read 메서드)
@anchor{library/wave wave Wave_read getcomptype}@anchor{4280}
@deffn {메서드} getcomptype ()

압축 유형을 반환합니다 (지원되는 유형은 @code{'NONE'} 뿐입니다).
@end deffn

@geindex getcompname() (wave.Wave_read 메서드)
@anchor{library/wave wave Wave_read getcompname}@anchor{4281}
@deffn {메서드} getcompname ()

@ref{4280,,getcomptype()}의 사람이 읽을 수 있는 버전. 보통 @code{'not compressed'}이 @code{'NONE'}에 해당합니다.
@end deffn

@geindex getparams() (wave.Wave_read 메서드)
@anchor{library/wave wave Wave_read getparams}@anchor{11e9}
@deffn {메서드} getparams ()

@code{get*()} 메서드의 결과와 동등한, @ref{4e0,,namedtuple()} @code{(nchannels, sampwidth, framerate, nframes, comptype, compname)}를 반환합니다.
@end deffn

@geindex readframes() (wave.Wave_read 메서드)
@anchor{library/wave wave Wave_read readframes}@anchor{4282}
@deffn {메서드} readframes (n)

최대 `n' 프레임의 오디오를 @ref{192,,bytes} 객체로 읽고 반환합니다.
@end deffn

@geindex rewind() (wave.Wave_read 메서드)
@anchor{library/wave wave Wave_read rewind}@anchor{4283}
@deffn {메서드} rewind ()

파일 포인터를 오디오 스트림의 시작 부분으로 되감습니다.
@end deffn

다음의 두 메서드는 이전 @code{aifc} 모듈과의 호환성을 위해 정의되었으며, 흥미로운 작업을 수행하지 않습니다.

@geindex getmarkers() (wave.Wave_read 메서드)
@anchor{library/wave wave Wave_read getmarkers}@anchor{335}
@deffn {메서드} getmarkers ()

@code{None}을 반환합니다.


Deprecated since version 3.13, will be removed in version 3.15: 이 메서드는 파이썬 3.13에서 게거된 @code{aifc} 모듈과의 호환성을 위해서만 존재했습니다.

@end deffn

@geindex getmark() (wave.Wave_read 메서드)
@anchor{library/wave wave Wave_read getmark}@anchor{334}
@deffn {메서드} getmark (id)

에러를 발생시킵니다.


Deprecated since version 3.13, will be removed in version 3.15: 이 메서드는 파이썬 3.13에서 게거된 @code{aifc} 모듈과의 호환성을 위해서만 존재했습니다.

@end deffn

다음의 두 메서드는 이들 사이에서 호환 가능한 용어 “위치(position)”를 정의하며, 그 외에는 구현에 따라 다릅니다.

@geindex setpos() (wave.Wave_read 메서드)
@anchor{library/wave wave Wave_read setpos}@anchor{4284}
@deffn {메서드} setpos (pos)

파일 포인터를 지정된 위치로 설정합니다.
@end deffn

@geindex tell() (wave.Wave_read 메서드)
@anchor{library/wave wave Wave_read tell}@anchor{4285}
@deffn {메서드} tell ()

현재 파일 포인터 위치를 반환합니다.
@end deffn
@end deffn

@node Wave_write 객체,,Wave_read 객체,wave — WAV 파일 읽고 쓰기
@anchor{library/wave id2}@anchor{4286}@anchor{library/wave wave-write-objects}@anchor{11ea}
@subsubsection Wave_write 객체


@geindex Wave_write (wave 클래스)
@anchor{library/wave wave Wave_write}@anchor{337}
@deffn {클래스} wave.Wave_write

WAV 파일을 기록합니다.

@ref{b45,,open()}에 의해 반환된 Wave_write 객체에.

위치 변경할 수 있는(seekable) 출력 스트림의 경우, 실제로 기록된 프레임 수를 반영하도록 @code{wave} 헤더가 자동으로 갱신됩니다. 위치 변경할 수 없는(unseekable) 스트림의 경우, 첫 번째 프레임 데이터를 쓸 때, `nframes' 값이 정확해야 합니다. 정확한 `nframes' 값을 실현하려면 @ref{4278,,close()}가 호출되기 전에 기록될 프레임 수로 @ref{4287,,setnframes()}나 @ref{4288,,setparams()}를 호출한 다음, @ref{11eb,,writeframesraw()}를 사용하여 프레임 데이터를 쓰거나, 기록할 모든 프레임 데이터로 @ref{11ec,,writeframes()}를 호출할 수 있습니다. 후자의 경우 @code{writeframes()}는 데이터의 프레임 수를 계산하고 프레임 데이터를 기록하기 전에 적절한 `nframes'를 설정합니다.


버전 3.4에서 변경: 위치 변경할 수 없는(unseekable) 파일에 대한 지원이 추가되었습니다.


Wave_write 객체에는 다음과 같은 메서드가 있습니다:

@geindex close() (wave.Wave_write 메서드)
@anchor{library/wave wave Wave_write close}@anchor{4278}
@deffn {메서드} close ()

Make sure `nframes' is correct, and close the file if it was opened by
@code{wave}.  This method is called upon object collection.  It will raise
an exception if the output stream is not seekable and `nframes' does not
match the number of frames actually written.
@end deffn

@geindex setnchannels() (wave.Wave_write 메서드)
@anchor{library/wave wave Wave_write setnchannels}@anchor{4289}
@deffn {메서드} setnchannels (n)

채널 수를 설정합니다.
@end deffn

@geindex getnchannels() (wave.Wave_write 메서드)
@anchor{library/wave wave Wave_write getnchannels}@anchor{428a}
@deffn {메서드} getnchannels ()

Return the number of channels.
@end deffn

@geindex setsampwidth() (wave.Wave_write 메서드)
@anchor{library/wave wave Wave_write setsampwidth}@anchor{428b}
@deffn {메서드} setsampwidth (n)

샘플 폭을 `n' 바이트로 설정합니다.
@end deffn

@geindex getsampwidth() (wave.Wave_write 메서드)
@anchor{library/wave wave Wave_write getsampwidth}@anchor{428c}
@deffn {메서드} getsampwidth ()

Return the sample width in bytes.
@end deffn

@geindex setframerate() (wave.Wave_write 메서드)
@anchor{library/wave wave Wave_write setframerate}@anchor{428d}
@deffn {메서드} setframerate (n)

프레임 속도를 `n'으로 설정합니다.


버전 3.2에서 변경: 이 메서드에 대한 비 정수 입력은 가장 가까운 정수로 자리 올림 됩니다.

@end deffn

@geindex getframerate() (wave.Wave_write 메서드)
@anchor{library/wave wave Wave_write getframerate}@anchor{428e}
@deffn {메서드} getframerate ()

Return the frame rate.
@end deffn

@geindex setnframes() (wave.Wave_write 메서드)
@anchor{library/wave wave Wave_write setnframes}@anchor{4287}
@deffn {메서드} setnframes (n)

프레임 수를 `n'으로 설정합니다. 실제로 쓴 프레임 수가 다르면 나중에 변경됩니다 (이 변경 시도는 출력 스트림이 위치 변경할 수 없으면 에러를 발생시킵니다).
@end deffn

@geindex getnframes() (wave.Wave_write 메서드)
@anchor{library/wave wave Wave_write getnframes}@anchor{428f}
@deffn {메서드} getnframes ()

Return the number of audio frames written so far.
@end deffn

@geindex setcomptype() (wave.Wave_write 메서드)
@anchor{library/wave wave Wave_write setcomptype}@anchor{4290}
@deffn {메서드} setcomptype (type, name)

압축 유형과 설명을 설정합니다. 현재, 압축 유형 @code{NONE} 만 지원됩니다. 즉, 압축하지 않습니다.
@end deffn

@geindex getcomptype() (wave.Wave_write 메서드)
@anchor{library/wave wave Wave_write getcomptype}@anchor{4291}
@deffn {메서드} getcomptype ()

Return the compression type (@code{'NONE'}).
@end deffn

@geindex getcompname() (wave.Wave_write 메서드)
@anchor{library/wave wave Wave_write getcompname}@anchor{4292}
@deffn {메서드} getcompname ()

Return the human-readable compression type name.
@end deffn

@geindex setparams() (wave.Wave_write 메서드)
@anchor{library/wave wave Wave_write setparams}@anchor{4288}
@deffn {메서드} setparams (tuple)

`tuple'은 @code{(nchannels, sampwidth, framerate, nframes, comptype, compname)}이어야 하며, @code{set*()} 메서드에 유효한 값이어야 합니다. 모든 파라미터를 설정합니다.
@end deffn

@geindex getparams() (wave.Wave_write 메서드)
@anchor{library/wave wave Wave_write getparams}@anchor{4293}
@deffn {메서드} getparams ()

Return a @ref{4e0,,namedtuple()}
@code{(nchannels, sampwidth, framerate, nframes, comptype, compname)}
containing the current output parameters.
@end deffn

@geindex tell() (wave.Wave_write 메서드)
@anchor{library/wave wave Wave_write tell}@anchor{4294}
@deffn {메서드} tell ()

파일의 현재 위치를 반환하는데, @ref{4285,,Wave_read.tell()} 과 @ref{4284,,Wave_read.setpos()} 메서드와 같은 면책 조항이 적용됩니다.
@end deffn

@geindex writeframesraw() (wave.Wave_write 메서드)
@anchor{library/wave wave Wave_write writeframesraw}@anchor{11eb}
@deffn {메서드} writeframesraw (data)

`nframes'를 수정하지 않고 오디오 프레임을 씁니다.


버전 3.4에서 변경: 이제 모든 @ref{193,,바이트열류 객체}가 허락됩니다.

@end deffn

@geindex writeframes() (wave.Wave_write 메서드)
@anchor{library/wave wave Wave_write writeframes}@anchor{11ec}
@deffn {메서드} writeframes (data)

오디오 프레임을 기록하고 `nframes'를 올바르게 만듭니다. 출력 스트림이 위치 변경할 수 없고 `data'를 기록한 후에 기록된 총 프레임 수가 `nframes'에 대해 이전에 설정된 값과 일치하지 않으면 에러가 발생시킵니다.


버전 3.4에서 변경: 이제 모든 @ref{193,,바이트열류 객체}가 허락됩니다.


@ref{11ec,,writeframes()}나 @ref{11eb,,writeframesraw()}를 호출한 후 파라미터를 설정하는 것이 유효하지 않고, 이를 시도하면 @ref{4279,,wave.Error}가 발생함에 유의하십시오.
@end deffn
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node colorsys — 색 체계 간의 변환,,wave — WAV 파일 읽고 쓰기,멀티미디어 서비스
@anchor{library/colorsys doc}@anchor{4295}@anchor{library/colorsys colorsys-conversions-between-color-systems}@anchor{4296}@anchor{library/colorsys module-colorsys}@anchor{20}@anchor{library/colorsys translation-repo}@anchor{4297}
@subsection @code{colorsys} — 색 체계 간의 변환


@geindex module; colorsys

`소스 코드:' Lib/colorsys.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/colorsys.py}


__________________________________________________________________


The @code{colorsys} module defines bidirectional conversions of color values
between colors expressed in the RGB (Red Green Blue) color space used in
computer monitors and three other coordinate systems: YIQ, HLS (Hue Lightness
Saturation) and HSV (Hue Saturation Value).  Coordinates in all of these color
spaces are floating-point values.  In the YIQ space, the Y coordinate is between
0 and 1, but the I and Q coordinates can be positive or negative.  In all other
spaces, the coordinates are all between 0 and 1.


@subsubheading 더 보기


색 공간에 대한 자세한 내용은 @indicateurl{https://poynton.ca/ColorFAQ.html} 와 @indicateurl{https://www.cambridgeincolour.com/tutorials/color-spaces.htm} 에서 확인할 수 있습니다.


The @code{colorsys} module defines the following functions:

@geindex rgb_to_yiq() (colorsys 모듈)
@anchor{library/colorsys colorsys rgb_to_yiq}@anchor{4298}
@deffn {함수} colorsys.rgb_to_yiq (r, g, b)

RGB 좌표에서 YIQ 좌표로 색을 변환합니다.
@end deffn

@geindex yiq_to_rgb() (colorsys 모듈)
@anchor{library/colorsys colorsys yiq_to_rgb}@anchor{4299}
@deffn {함수} colorsys.yiq_to_rgb (y, i, q)

YIQ 좌표에서 RGB 좌표로 색을 변환합니다.
@end deffn

@geindex rgb_to_hls() (colorsys 모듈)
@anchor{library/colorsys colorsys rgb_to_hls}@anchor{1a72}
@deffn {함수} colorsys.rgb_to_hls (r, g, b)

RGB 좌표에서 HLS 좌표로 색을 변환합니다.
@end deffn

@geindex hls_to_rgb() (colorsys 모듈)
@anchor{library/colorsys colorsys hls_to_rgb}@anchor{429a}
@deffn {함수} colorsys.hls_to_rgb (h, l, s)

HLS 좌표에서 RGB 좌표로 색을 변환합니다.
@end deffn

@geindex rgb_to_hsv() (colorsys 모듈)
@anchor{library/colorsys colorsys rgb_to_hsv}@anchor{429b}
@deffn {함수} colorsys.rgb_to_hsv (r, g, b)

RGB 좌표에서 HSV 좌표로 색을 변환합니다.
@end deffn

@geindex hsv_to_rgb() (colorsys 모듈)
@anchor{library/colorsys colorsys hsv_to_rgb}@anchor{429c}
@deffn {함수} colorsys.hsv_to_rgb (h, s, v)

HSV 좌표에서 RGB 좌표로 색을 변환합니다.
@end deffn

예:

@example
>>> import colorsys
>>> colorsys.rgb_to_hsv(0.2, 0.4, 0.4)
(0.5, 0.5, 0.4)
>>> colorsys.hsv_to_rgb(0.5, 0.5, 0.4)
(0.2, 0.4, 0.4)
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 국제화,Graphical user interfaces with Tk,멀티미디어 서비스,파이썬 표준 라이브러리
@anchor{library/i18n doc}@anchor{429d}@anchor{library/i18n i18n}@anchor{429e}@anchor{library/i18n internationalization}@anchor{429f}@anchor{library/i18n translation-repo}@anchor{42a0}
@section 국제화


이 장에서 설명하는 모듈은 프로그램 메시지에 사용할 언어를 선택하거나 현지 규칙에 맞게 출력을 조정할 수 있는 메커니즘을 제공하여 언어 및 로케일에 종속되지 않는 소프트웨어를 작성하는 데 도움이 됩니다.

이 장에서 설명하는 모듈 목록은 다음과 같습니다:

@menu
* gettext — 다국어 국제화 서비스:: 
* locale — 국제화 서비스:: 

@end menu

@node gettext — 다국어 국제화 서비스,locale — 국제화 서비스,,국제화
@anchor{library/gettext doc}@anchor{42a1}@anchor{library/gettext gettext-multilingual-internationalization-services}@anchor{42a2}@anchor{library/gettext module-gettext}@anchor{67}
@subsection @code{gettext} — 다국어 국제화 서비스


@geindex module; gettext

`소스 코드:' Lib/gettext.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/gettext.py}


__________________________________________________________________


The @code{gettext} module provides internationalization (I18N) and localization
(L10N) services for your Python modules and applications. It supports both the
GNU @code{gettext} message catalog API and a higher level, class-based API that may
be more appropriate for Python files.  The interface described below allows you
to write your module and application messages in one natural language, and
provide a catalog of translated messages for running under different natural
languages.

파이썬 모듈과 응용 프로그램을 현지화하는 데 대한 힌트도 제공됩니다.

@menu
* GNU gettext API:: 
* 클래스 기반 API:: 
* 프로그램과 모듈의 국제화:: 
* 감사의 말:: 

@end menu

@node GNU gettext API,클래스 기반 API,,gettext — 다국어 국제화 서비스
@anchor{library/gettext gnu-gettext-api}@anchor{42a3}
@subsubsection GNU @code{gettext} API


The @code{gettext} module defines the following API, which is very similar to
the GNU @code{gettext} API.  If you use this API you will affect the
translation of your entire application globally.  Often this is what you want if
your application is monolingual, with the choice of language dependent on the
locale of your user.  If you are localizing a Python module, or if your
application needs to switch languages on the fly, you probably want to use the
class-based API instead.

@geindex bindtextdomain() (gettext 모듈)
@anchor{library/gettext gettext bindtextdomain}@anchor{42a4}
@deffn {함수} gettext.bindtextdomain (domain, localedir=None)

Bind the `domain' to the locale directory `localedir'.  More concretely,
@code{gettext} will look for binary @code{.mo} files for the given domain using
the path (on Unix): @code{`localedir'/`language'/LC_MESSAGES/`domain'.mo}, where
`language' is searched for in the environment variables 
@geindex LANGUAGE
@geindex 환경 변수; LANGUAGE
@code{LANGUAGE},
@geindex LC_ALL
@geindex 환경 변수; LC_ALL
@code{LC_ALL}, 
@geindex LC_MESSAGES
@geindex 환경 변수; LC_MESSAGES
@code{LC_MESSAGES}, and 
@geindex LANG
@geindex 환경 변수; LANG
@code{LANG} respectively.

`localedir'이 생략되거나 @code{None}이면, `domain'에 대한 현재 바인딩이 반환됩니다. @footnote{
기본 로케일 디렉터리는 시스템에 따라 다릅니다; 예를 들어 Red Hat 리눅스에서는 @code{/usr/share/locale}이지만, Solaris에서는 @code{/usr/lib/locale}입니다. @code{gettext} 모듈은 이러한 시스템 종속 기본값을 지원하려고 하지 않습니다; 대신 기본값은 @code{`sys.base_prefix'/share/locale}입니다 (@ref{3e6,,sys.base_prefix}를 참조하십시오). 이런 이유로, 항상 응용 프로그램 시작 시 명시적 절대 경로를 사용하여 @ref{42a4,,bindtextdomain()}을 호출하는 것이 가장 좋습니다.
}
@end deffn

@geindex textdomain() (gettext 모듈)
@anchor{library/gettext gettext textdomain}@anchor{42a5}
@deffn {함수} gettext.textdomain (domain=None)

현재 전역 도메인을 변경하거나 조회합니다. `domain'이 @code{None}이면, 현재 전역 도메인이 반환되고, 그렇지 않으면 전역 도메인이 `domain'으로 설정되어 반환됩니다.
@end deffn

@geindex _ (언더스코어);gettext

@geindex gettext() (gettext 모듈)
@anchor{library/gettext gettext gettext}@anchor{166e}
@deffn {함수} gettext.gettext (message)

현재 전역 도메인, 언어 및 로케일 디렉터리를 기반으로, `message'의 현지화 된 번역을 반환합니다. 이 함수는 일반적으로 지역 이름 공간에서 @code{_()}로 별칭이 지정됩니다 (아래 예를 참조하십시오).
@end deffn

@geindex dgettext() (gettext 모듈)
@anchor{library/gettext gettext dgettext}@anchor{42a6}
@deffn {함수} gettext.dgettext (domain, message)

@ref{166e,,gettext()}와 비슷하지만, 지정된 `domain'에서 메시지를 찾습니다.
@end deffn

@geindex ngettext() (gettext 모듈)
@anchor{library/gettext gettext ngettext}@anchor{42a7}
@deffn {함수} gettext.ngettext (singular, plural, n)

@ref{166e,,gettext()}와 비슷하지만, 복수형(plural forms)을 고려합니다. 번역이 발견되면, 복수 공식을 `n'에 적용하고, 결과 메시지를 반환합니다 (일부 언어는 복수형이 두 개 이상입니다). 번역이 없으면, `n'이 1이면 `singular'를 반환합니다; 그렇지 않으면 `plural'을 반환합니다.

복수 공식은 카탈로그 헤더에서 취합니다. 자유 변수 `n'을 갖는 C나 파이썬 표현식입니다. 이 표현식은 카탈로그에서 복수의 인덱스로 평가됩니다. @code{.po} 파일에 사용되는 정확한 문법과 다양한 언어의 공식은 GNU gettext 설명서@footnote{https://www.gnu.org/software/gettext/manual/gettext.html}를 참조하십시오.
@end deffn

@geindex dngettext() (gettext 모듈)
@anchor{library/gettext gettext dngettext}@anchor{42a8}
@deffn {함수} gettext.dngettext (domain, singular, plural, n)

@ref{42a7,,ngettext()}와 비슷하지만, 지정된 `domain'에서 메시지를 찾습니다.
@end deffn

@geindex pgettext() (gettext 모듈)
@anchor{library/gettext gettext pgettext}@anchor{be7}
@deffn {함수} gettext.pgettext (context, message)
@end deffn

@geindex dpgettext() (gettext 모듈)
@anchor{library/gettext gettext dpgettext}@anchor{42a9}
@deffn {함수} gettext.dpgettext (domain, context, message)
@end deffn

@geindex npgettext() (gettext 모듈)
@anchor{library/gettext gettext npgettext}@anchor{42aa}
@deffn {함수} gettext.npgettext (context, singular, plural, n)
@end deffn

@geindex dnpgettext() (gettext 모듈)
@anchor{library/gettext gettext dnpgettext}@anchor{42ab}
@deffn {함수} gettext.dnpgettext (domain, context, singular, plural, n)

접두사에 @code{p}가 없는 해당 함수(즉, @ref{67,,gettext()}, @ref{42a6,,dgettext()}, @ref{42a7,,ngettext()}, @ref{42a8,,dngettext()})와 유사하지만, 번역은 지정된 메시지 `context'로 제한됩니다.


Added in version 3.8.

@end deffn

GNU @code{gettext}가 @code{dcgettext()} 메서드도 정의하지만, 이것을 유용하지 않은 것으로 간주해서 현재 구현되지 않았음에 유의하십시오.

이 API의 일반적인 사용 예는 다음과 같습니다:

@example
import gettext
gettext.bindtextdomain('myapplication', '/path/to/my/language/directory')
gettext.textdomain('myapplication')
_ = gettext.gettext
# ...
print(_('This is a translatable string.'))
@end example

@node 클래스 기반 API,프로그램과 모듈의 국제화,GNU gettext API,gettext — 다국어 국제화 서비스
@anchor{library/gettext class-based-api}@anchor{42ac}
@subsubsection 클래스 기반 API


The class-based API of the @code{gettext} module gives you more flexibility and
greater convenience than the GNU @code{gettext} API.  It is the recommended
way of localizing your Python applications and modules.  @code{gettext} defines
a @ref{42ad,,GNUTranslations} class which implements the parsing of GNU @code{.mo} format
files, and has methods for returning strings. Instances of this class can also
install themselves in the built-in namespace as the function @code{_()}.

@geindex find() (gettext 모듈)
@anchor{library/gettext gettext find}@anchor{42ae}
@deffn {함수} gettext.find (domain, localedir=None, languages=None, all=False)

이 함수는 표준 @code{.mo} 파일 검색 알고리즘을 구현합니다. @ref{42a5,,textdomain()}이 취하는 것과 동일한 `domain'을 취합니다. 선택적 `localedir'은 @ref{42a4,,bindtextdomain()}에서와 같습니다. 선택적 `languages'는 문자열 리스트이며, 각 문자열은 언어 코드입니다.

`localedir'이 제공되지 않으면, 기본 시스템 로케일 디렉터리가 사용됩니다. @footnote{
위의 @ref{42a4,,bindtextdomain()}에 대한 각주를 참조하십시오.
} `languages'가 제공되지 않으면, 다음과 같은 환경 변수가 검색됩니다: 
@geindex LANGUAGE
@geindex 환경 변수; LANGUAGE
@code{LANGUAGE}, 
@geindex LC_ALL
@geindex 환경 변수; LC_ALL
@code{LC_ALL}, 
@geindex LC_MESSAGES
@geindex 환경 변수; LC_MESSAGES
@code{LC_MESSAGES} 및 
@geindex LANG
@geindex 환경 변수; LANG
@code{LANG}. 비어 있지 않은 값을 반환하는 첫 번째 것이 `languages' 변수에 사용됩니다. 환경 변수는 콜론으로 구분된 언어 목록을 포함해야 하며, 콜론에서 분할되어 예상되는 언어 코드 문자열 리스트를 생성합니다.

그런 다음 @ref{42ae,,find()}는 언어를 확장하고 정규화한 다음, 다음 구성 요소로 구성된 기존 파일을 검색하면서, 이들을 이터레이트 합니다:

@code{`localedir'/`language'/LC_MESSAGES/`domain'.mo}

존재하는 첫 번째 파일 이름이 @ref{42ae,,find()}에 의해 반환됩니다. 그러한 파일이 없으면, @code{None}이 반환됩니다. `all'이 제공되면, 언어 리스트나 환경 변수에 나타나는 순서대로 모든 파일 이름의 리스트를 반환합니다.
@end deffn

@geindex translation() (gettext 모듈)
@anchor{library/gettext gettext translation}@anchor{c6c}
@deffn {함수} gettext.translation (domain, localedir=None, languages=None, class_=None, fallback=False)

`domain', `localedir' 및 `languages'를 기반으로 하는 @code{*Translations} 인스턴스를 반환합니다. 이 인스턴스는 연관된 @code{.mo} 파일 경로 리스트를 얻기 위해 먼저 @ref{42ae,,find()}로 전달됩니다. 동일한 @code{.mo} 파일 이름을 갖는 인스턴스는 캐시 됩니다. 인스턴스화되는 실제 클래스는 제공된다면 `class_'이고, 그렇지 않으면 @ref{42ad,,GNUTranslations}입니다. 클래스의 생성자는 단일 @ref{13c8,,파일 객체} 인자를 취해야 합니다.

여러 파일이 발견되면, 이후 파일은 이전 파일에 대한 폴 백으로 사용됩니다. 폴 백을 설정하는 것을 허락하기 위해, @ref{756,,copy.copy()}를 사용하여 캐시에서 각 번역 객체를 복제합니다; 실제 인스턴스 데이터는 여전히 캐시와 공유됩니다.

@code{.mo} 파일이 없으면, 이 함수는 `fallback'이 거짓(기본값)이면 @ref{2c0,,OSError}를 발생시키고, `fallback'이 참이면 @ref{42af,,NullTranslations} 인스턴스를 반환합니다.


버전 3.3에서 변경: 이전에는 @ref{1252,,IOError}가 발생했지만, 이제는 @ref{2c0,,OSError}의 별칭입니다.



버전 3.11에서 변경: `codeset' 매개 변수를 제거했습니다.

@end deffn

@geindex install() (gettext 모듈)
@anchor{library/gettext gettext install}@anchor{c6d}
@deffn {함수} gettext.install (domain, localedir=None, *, names=None)

@ref{c6c,,translation()}에 전달되는 `domain' 와 `localedir'을 기반으로, 파이썬의 내장 이름 공간에 @code{_()} 함수를 설치합니다.

`names' 매개 변수에 대해서는, 번역 객체의 @ref{42b0,,install()} 메서드에 대한 설명을 참조하십시오.

아래에서 볼 수 있듯이, 일반적으로 다음과 같이 @code{_()} 함수에 대한 호출로 래핑하여, 응용 프로그램에 있는 번역 후보 문자열을 표시합니다:

@example
print(_('This string will be translated.'))
@end example

편의상, @code{_()} 함수를 파이썬의 내장 이름 공간에 설치하여, 응용 프로그램의 모든 모듈에서 쉽게 액세스할 수 있도록 합니다.


버전 3.11에서 변경: `names'는 이제 키워드 전용 매개 변수입니다.

@end deffn

@menu
* NullTranslations 클래스:: 
* GNUTranslations 클래스:: 
* Solaris 메시지 카탈로그 지원:: 
* Catalog 생성자:: 

@end menu

@node NullTranslations 클래스,GNUTranslations 클래스,,클래스 기반 API
@anchor{library/gettext the-nulltranslations-class}@anchor{42b1}
@subsubsection @code{NullTranslations} 클래스


번역 클래스는 원본 소스 파일 메시지 문자열을 번역된 메시지 문자열로 실제로 구현합니다. 모든 번역 클래스에서 사용하는 베이스 클래스는 @ref{42af,,NullTranslations}입니다; 여러분 자신의 특수화된 번역 클래스를 작성하는 데 사용할 수 있는 기본 인터페이스를 제공합니다. @code{NullTranslations}의 메서드는 다음과 같습니다:

@geindex NullTranslations (gettext 클래스)
@anchor{library/gettext gettext NullTranslations}@anchor{42af}
@deffn {클래스} gettext.NullTranslations (fp=None)

베이스 클래스에서 무시되는, 선택적인 @ref{13c8,,파일 객체} `fp'를 취합니다. 파생 클래스에 의해 설정되는 “보호되는” 인스턴스 변수 `_info'와 `_charset' 뿐만 아니라 @ref{42b2,,add_fallback()}을 통해 설정되는 `_fallback'을 초기화합니다. 그런 다음 `fp'가 @code{None}이 아니면 @code{self._parse(fp)}를 호출합니다.

@geindex _parse() (gettext.NullTranslations 메서드)
@anchor{library/gettext gettext NullTranslations _parse}@anchor{42b3}
@deffn {메서드} _parse (fp)

베이스 클래스에서 아무런 일도 하지 않는 이 메서드는 파일 객체 `fp'를 취하고, 이 파일에서 데이터를 읽고, 메시지 카탈로그를 초기화합니다. 지원되지 않는 메시지 카탈로그 파일 형식이 있으면, 이 메서드를 재정의하여 형식을 구문 분석해야 합니다.
@end deffn

@geindex add_fallback() (gettext.NullTranslations 메서드)
@anchor{library/gettext gettext NullTranslations add_fallback}@anchor{42b2}
@deffn {메서드} add_fallback (fallback)

현재 번역 객체의 폴 백 객체로 `fallback'을 추가합니다. 주어진 메시지에 대한 번역을 제공할 수 없으면 번역 개체는 폴 백을 참조해야 합니다.
@end deffn

@geindex gettext() (gettext.NullTranslations 메서드)
@anchor{library/gettext gettext NullTranslations gettext}@anchor{42b4}
@deffn {메서드} gettext (message)

폴 백이 설정되었으면, @code{gettext()}를 폴 백으로 전달합니다. 그렇지 않으면, `message'를 반환합니다. 파생 클래스에서 재정의됩니다.
@end deffn

@geindex ngettext() (gettext.NullTranslations 메서드)
@anchor{library/gettext gettext NullTranslations ngettext}@anchor{42b5}
@deffn {메서드} ngettext (singular, plural, n)

폴 백이 설정되었으면, @code{ngettext()}를 폴 백으로 전달합니다. 그렇지 않으면, `n'이 1이면 `singular'를 반환합니다; 그렇지 않으면 `plural'을 반환합니다. 파생 클래스에서 재정의됩니다.
@end deffn

@geindex pgettext() (gettext.NullTranslations 메서드)
@anchor{library/gettext gettext NullTranslations pgettext}@anchor{42b6}
@deffn {메서드} pgettext (context, message)

폴 백이 설정되었으면, @ref{be7,,pgettext()}를 폴 백으로 전달합니다. 그렇지 않으면, 번역된 메시지를 반환합니다. 파생 클래스에서 재정의됩니다.


Added in version 3.8.

@end deffn

@geindex npgettext() (gettext.NullTranslations 메서드)
@anchor{library/gettext gettext NullTranslations npgettext}@anchor{42b7}
@deffn {메서드} npgettext (context, singular, plural, n)

폴 백이 설정되었으면, @ref{42aa,,npgettext()}를 폴 백으로 전달합니다. 그렇지 않으면, 번역된 메시지를 반환합니다. 파생 클래스에서 재정의됩니다.


Added in version 3.8.

@end deffn

@geindex info() (gettext.NullTranslations 메서드)
@anchor{library/gettext gettext NullTranslations info}@anchor{42b8}
@deffn {메서드} info ()

메시지 카탈로그 파일에서 발견된 메타 데이터를 포함하는 딕셔너리를 반환합니다.
@end deffn

@geindex charset() (gettext.NullTranslations 메서드)
@anchor{library/gettext gettext NullTranslations charset}@anchor{42b9}
@deffn {메서드} charset ()

메시지 카탈로그 파일의 인코딩을 반환합니다.
@end deffn

@geindex install() (gettext.NullTranslations 메서드)
@anchor{library/gettext gettext NullTranslations install}@anchor{42b0}
@deffn {메서드} install (names=None)

이 메서드는 @ref{42b4,,gettext()}를 내장 이름 공간에 설치하여, @code{_}에 연결합니다.

`names' 매개 변수가 제공되면, @code{_()}에 더해서 내장 이름 공간에 설치하려는 함수 이름이 포함된 시퀀스여야 합니다. 지원되는 이름은 @code{'gettext'}, @code{'ngettext'}, @code{'pgettext'} 및 @code{'npgettext'} 입니다.

이것은 @code{_()} 함수를 응용 프로그램에서 사용할 수 있게 하는 가장 편리한 방법이지만, 한 가지 방법일 뿐입니다. 전체 응용 프로그램, 특히 내장 이름 공간에 영향을 주기 때문에, 현지화된 모듈은 절대 @code{_()}를 설치하지 않아야 합니다. 대신, 다음과 같은 코드를 사용하여 @code{_()}를 모듈에서 사용할 수 있게 해야 합니다:

@example
import gettext
t = gettext.translation('mymodule', ...)
_ = t.gettext
@end example

이는 @code{_()}를 모듈의 전역 이름 공간에만 넣기 때문에 이 모듈 내에서의 호출에만 영향을 줍니다.


버전 3.8에서 변경: @code{'pgettext'}와 @code{'npgettext'}를 추가했습니다.

@end deffn
@end deffn

@node GNUTranslations 클래스,Solaris 메시지 카탈로그 지원,NullTranslations 클래스,클래스 기반 API
@anchor{library/gettext the-gnutranslations-class}@anchor{42ba}
@subsubsection @code{GNUTranslations} 클래스


@code{gettext} 모듈은 @ref{42af,,NullTranslations}에서 파생된 클래스를 하나 더 제공합니다: @ref{42ad,,GNUTranslations}. 이 클래스는 @code{_parse()}를 재정의하여 빅 엔디안과 리틀 엔디안 형식의 GNU @code{gettext} 형식 @code{.mo} 파일을 읽을 수 있도록 합니다.

@ref{42ad,,GNUTranslations}는 번역 카탈로그에서 선택적 메타 데이터를 구문 분석합니다. 빈 문자열의 번역으로 메타 데이터를 포함하는 것이 GNU @code{gettext}의 관례입니다. 이 메타 데이터는 
@geindex RFC; RFC 822
RFC 822@footnote{https://datatracker.ietf.org/doc/html/rfc822.html} 스타일 @code{key: value} 쌍이며, @code{Project-Id-Version} 키를 포함해야 합니다. 키 @code{Content-Type}이 발견되면, @code{charset} 프로퍼티를 사용하여 “보호된” @code{_charset} 인스턴스 변수를 초기화하고, 찾을 수 없으면 기본값은 @code{None}입니다. 문자 집합 인코딩이 지정되면, 카탈로그에서 읽은 모든 메시지 id와 메시지 문자열이 이 인코딩을 사용하여 유니코드로 변환되고, 그렇지 않으면 ASCII로 가정합니다.

메시지 id도 유니코드 문자열로 읽기 때문에, 모든 @code{*gettext()} 메서드는 메시지 id를 바이트 문자열이 아닌 유니코드 문자열로 가정합니다.

키/값 쌍의 전체 집합이 딕셔너리에 배치되고 “보호된” @code{_info} 인스턴스 변수로 설정됩니다.

@code{.mo} 파일의 매직 번호가 유효하지 않거나, 주 버전 번호가 예상치 못한 값이거나, 파일을 읽는 동안 다른 문제가 발생하면 @ref{42ad,,GNUTranslations} 클래스를 인스턴스 화할 때 @ref{2c0,,OSError}가 발생할 수 있습니다.

@geindex GNUTranslations (gettext 클래스)
@anchor{library/gettext gettext GNUTranslations}@anchor{42ad}
@deffn {클래스} gettext.GNUTranslations

베이스 클래스 구현에서 다음 메서드가 재정의되었습니다:

@geindex gettext() (gettext.GNUTranslations 메서드)
@anchor{library/gettext gettext GNUTranslations gettext}@anchor{42bb}
@deffn {메서드} gettext (message)

카탈로그에서 `message' id를 찾아 해당 메시지 문자열을 유니코드 문자열로 반환합니다. 카탈로그에 `message' id에 대한 항목이 없고, 폴 백이 설정되었으면, 조회는 폴 백의 @ref{42b4,,gettext()} 메서드로 전달됩니다. 그렇지 않으면, `message' id가 반환됩니다.
@end deffn

@geindex ngettext() (gettext.GNUTranslations 메서드)
@anchor{library/gettext gettext GNUTranslations ngettext}@anchor{42bc}
@deffn {메서드} ngettext (singular, plural, n)

메시지 id의 복수형 조회를 수행합니다. `singular'는 카탈로그에서 찾기 위해 메시지 id로 사용되는 반면, `n'은 사용할 복수형을 결정하는 데 사용됩니다. 반환된 메시지 문자열은 유니코드 문자열입니다.

카탈로그에서 메시지 id를 찾을 수 없고, 폴 백이 지정되었으면, 요청은 폴 백의 @ref{42b5,,ngettext()} 메서드로 전달됩니다. 그렇지 않으면, `n'이 1이면 `singular'가 반환되고, 다른 모든 경우에는 `plural'이 반환됩니다.

예를 들면 다음과 같습니다:

@example
n = len(os.listdir('.'))
cat = GNUTranslations(somefile)
message = cat.ngettext(
    'There is %(num)d file in this directory',
    'There are %(num)d files in this directory',
    n) % @{'num': n@}
@end example
@end deffn

@geindex pgettext() (gettext.GNUTranslations 메서드)
@anchor{library/gettext gettext GNUTranslations pgettext}@anchor{42bd}
@deffn {메서드} pgettext (context, message)

카탈로그에서 `context'와 `message' id를 찾아 해당 메시지 문자열을 유니코드 문자열로 반환합니다. 카탈로그에 `message' id와 `context'에 대한 항목이 없고, 폴 백이 설정되었으면, 조회는 폴 백의 @ref{be7,,pgettext()} 메서드로 전달됩니다. 그렇지 않으면, `message' id가 반환됩니다.


Added in version 3.8.

@end deffn

@geindex npgettext() (gettext.GNUTranslations 메서드)
@anchor{library/gettext gettext GNUTranslations npgettext}@anchor{42be}
@deffn {메서드} npgettext (context, singular, plural, n)

메시지 ID의 복수형 조회를 수행합니다. `singular'는 카탈로그에서 찾기 위해 메시지 id로 사용되는 반면, `n'은 사용할 복수형을 결정하는 데 사용됩니다.

`context'의 메시지 id가 카탈로그에 없고, 폴 백이 지정되었으면, 요청은 폴 백의 @ref{42aa,,npgettext()} 메서드로 전달됩니다. 그렇지 않으면, `n'이 1이면 `singular'가 반환되고, 다른 모든 경우에는 `plural'이 반환됩니다.


Added in version 3.8.

@end deffn
@end deffn

@node Solaris 메시지 카탈로그 지원,Catalog 생성자,GNUTranslations 클래스,클래스 기반 API
@anchor{library/gettext solaris-message-catalog-support}@anchor{42bf}
@subsubsection Solaris 메시지 카탈로그 지원


Solaris 운영 체제는 자체 바이너리 @code{.mo} 파일 형식을 정의하지만, 이 형식에 대한 설명서를 찾을 수 없어서, 현재 지원되지 않습니다.

@node Catalog 생성자,,Solaris 메시지 카탈로그 지원,클래스 기반 API
@anchor{library/gettext the-catalog-constructor}@anchor{42c0}
@subsubsection Catalog 생성자


@geindex GNOME

GNOME uses a version of the @code{gettext} module by James Henstridge, but this
version has a slightly different API.  Its documented usage was:

@example
import gettext
cat = gettext.Catalog(domain, localedir)
_ = cat.gettext
print(_('hello world'))
@end example

이 이전 모듈과의 호환성을 위해, 함수 @code{Catalog()}는 위에서 설명한 @ref{c6c,,translation()} 함수의 별칭입니다.

이 모듈과 Henstridge 버전의 한 가지 차이점: 그의 카탈로그 객체는 매핑 API를 통한 액세스를 지원했지만, 사용되지 않는 것으로 보여서 현재 지원되지 않습니다.

@node 프로그램과 모듈의 국제화,감사의 말,클래스 기반 API,gettext — 다국어 국제화 서비스
@anchor{library/gettext i18n-howto}@anchor{33fc}@anchor{library/gettext internationalizing-your-programs-and-modules}@anchor{42c1}
@subsubsection 프로그램과 모듈의 국제화


국제화(I18N)는 프로그램이 여러 언어를 인식하도록 하는 작업을 말합니다. 현지화(L10N)는 일단 국제화된 프로그램이 현지 언어와 문화적 습관에 적응하는 것을 말합니다. 파이썬 프로그램에 다국어 메시지를 제공하려면, 다음 단계를 수행해야 합니다:


@enumerate 

@item 
번역 가능한 문자열을 특별히 표시하여 프로그램이나 모듈을 준비합니다

@item 
표시된 파일에 대해 도구 모음을 실행하여 원시 메시지 카탈로그를 생성합니다

@item 
메시지 카탈로그의 언어별 번역을 만듭니다

@item 
use the @code{gettext} module so that message strings are properly translated
@end enumerate

I18N을 위해 여러분의 코드를 준비하려면, 파일의 모든 문자열을 확인해야 합니다. 번역해야 할 모든 문자열은 @code{_('...')}로 감싸서 표시해야 합니다 — 즉, 함수 @ref{67,,_}에 대한 호출. 예를 들면:

@example
filename = 'mylog.txt'
message = _('writing a log message')
with open(filename, 'w') as fp:
    fp.write(message)
@end example

이 예에서, 문자열 @code{'writing a log message'}는 번역 후보로 표시되지만, 문자열 @code{'mylog.txt'}와 @code{'w'}는 그렇지 않습니다.

번역을 위한 문자열을 추출하는 몇 가지 도구가 있습니다. 원래 GNU @code{gettext}는 C나 C++ 소스 코드만 지원했지만, 확장 버전 @code{xgettext}는 파이썬을 포함하여 여러 언어로 작성된 코드를 스캔하여 번역 가능으로 표시된 문자열을 찾습니다. Babel@footnote{https://babel.pocoo.org/}은 메시지 카탈로그를 추출하고 컴파일하는 @code{pybabel} 스크립트를 포함하는 파이썬 국제화 라이브러리입니다. @code{xpot}이라는 François Pinard의 프로그램도 비슷한 작업을 수행하며 그의 po-utils 패키지@footnote{https://github.com/pinard/po-utils}의 일부로 제공됩니다.

(파이썬에는 @code{pygettext.py}와 @code{msgfmt.py}라고 하는 이러한 프로그램의 순수 파이썬 버전도 포함되어 있습니다; 일부 파이썬 배포판은 이 프로그램들을 설치합니다. @code{pygettext.py}는 @code{xgettext}와 유사하지만, 파이썬 소스 코드만 이해하며 C나 C++ 와 같은 다른 프로그래밍 언어를 처리할 수 없습니다. @code{pygettext.py}는 @code{xgettext}와 유사한 명령 줄 인터페이스를 지원합니다; 사용에 대한 자세한 내용을 보려면, @code{pygettext.py --help}를 실행하십시오. @code{msgfmt.py}는 GNU @code{msgfmt}와 바이너리 호환됩니다. 이 두 프로그램을 사용하면, 파이썬 응용 프로그램을 국제화하기 위해 GNU @code{gettext} 패키지가 필요하지 않을 수 있습니다.)

@code{xgettext}, @code{pygettext} 및 유사한 도구는 메시지 카탈로그인 @code{.po} 파일을 생성합니다. 이 파일은 소스 코드에 표시된 모든 문자열과 이러한 문자열의 번역된 버전에 대한 자리를 포함하는 사람이 읽을 수 있는 파일입니다.

Copies of these @code{.po} files are then handed over to the
individual human translators who write translations for every
supported natural language.  They send back the completed
language-specific versions as a @code{<language-name>.po} file that’s
compiled into a machine-readable @code{.mo} binary catalog file using
the @code{msgfmt} program.  The @code{.mo} files are used by the
@code{gettext} module for the actual translation processing at
run-time.

How you use the @code{gettext} module in your code depends on whether you are
internationalizing a single module or your entire application. The next two
sections will discuss each case.

@menu
* 모듈 현지화:: 
* 응용 프로그램 현지화:: 
* 실행 중 언어 변경:: 
* 지연된 번역:: 

@end menu

@node 모듈 현지화,응용 프로그램 현지화,,프로그램과 모듈의 국제화
@anchor{library/gettext localizing-your-module}@anchor{42c2}
@subsubsection 모듈 현지화


모듈을 현지화한다면, 전역적인 변경을 가하지 않도록 주의해야 합니다, 예를 들어, 내장 이름 공간. GNU @code{gettext} API 대신 클래스 기반 API를 사용해야 합니다.

모듈이 “spam”이고 모듈의 다양한 자연어 번역 @code{.mo} 파일이 @code{/usr/share/locale}에 GNU @code{gettext} 형식으로 존재한다고 가정해 봅시다. 다음은 모듈 맨 위에 들어갈 내용입니다:

@example
import gettext
t = gettext.translation('spam', '/usr/share/locale')
_ = t.gettext
@end example

@node 응용 프로그램 현지화,실행 중 언어 변경,모듈 현지화,프로그램과 모듈의 국제화
@anchor{library/gettext localizing-your-application}@anchor{42c3}
@subsubsection 응용 프로그램 현지화


응용 프로그램을 현지화한다면, @code{_()} 함수를 전역적으로 내장 이름 공간에 설치할 수 있습니다, 일반적으로 응용 프로그램의 메인 드라이버 파일에서. 이렇게 하면 모든 응용 프로그램별 파일이 각 파일에 명시적으로 설치하지 않고도 @code{_('...')}를 사용할 수 있습니다.

간단한 경우에는, 응용 프로그램의 메인 드라이버 파일에 다음 코드만 추가하면 됩니다:

@example
import gettext
gettext.install('myapplication')
@end example

로케일 디렉터리를 설정해야 하면, @ref{c6d,,install()} 함수로 전달할 수 있습니다:

@example
import gettext
gettext.install('myapplication', '/usr/share/locale')
@end example

@node 실행 중 언어 변경,지연된 번역,응용 프로그램 현지화,프로그램과 모듈의 국제화
@anchor{library/gettext changing-languages-on-the-fly}@anchor{42c4}
@subsubsection 실행 중 언어 변경


프로그램에서 동시에 여러 언어를 지원해야 하면, 다음과 같은 식으로 여러 번역 인스턴스를 만든 다음 명시적으로 전환할 수 있습니다:

@example
import gettext

lang1 = gettext.translation('myapplication', languages=['en'])
lang2 = gettext.translation('myapplication', languages=['fr'])
lang3 = gettext.translation('myapplication', languages=['de'])

# 언어 1을 사용하는 것으로 시작합니다
lang1.install()

# ... 시간이 지난 후에, 사용자가 언어 2를 선택합니다
lang2.install()

# ... 시간이 더 흐른 후에, 사용자가 언어 3을 선택합니다
lang3.install()
@end example

@node 지연된 번역,,실행 중 언어 변경,프로그램과 모듈의 국제화
@anchor{library/gettext deferred-translations}@anchor{42c5}
@subsubsection 지연된 번역


대부분의 코딩 상황에서, 문자열은 코딩된 위치에서 번역됩니다. 그러나 때때로, 번역을 위해 문자열을 표시하지만, 실제 번역을 뒤로 연기할 필요가 있습니다. 전형적인 예는 다음과 같습니다:

@example
animals = ['mollusk',
           'albatross',
           'rat',
           'penguin',
           'python', ]
# ...
for a in animals:
    print(a)
@end example

여기서, @code{animals} 리스트의 문자열을 번역 가능한 것으로 표시하려고 하지만, 실제로 인쇄될 때까지 번역하고 싶지는 않습니다.

이 상황을 처리 할 수 있는 한 가지 방법은 다음과 같습니다:

@example
def _(message): return message

animals = [_('mollusk'),
           _('albatross'),
           _('rat'),
           _('penguin'),
           _('python'), ]

del _

# ...
for a in animals:
    print(_(a))
@end example

이것이 작동하는 이유는 @code{_()}의 더미 정의가 단순히 문자열을 변경하지 않고 반환하기 때문입니다. 그리고 이 더미 정의는 내장 이름 공간에서 @code{_()}의 정의를 일시적으로 재정의합니다 (@ref{1b1d,,del} 명령까지). 지역 이름 공간에 @code{_()}의 이전 정의가 있다면 주의하십시오.

@code{_()}의 두 번째 사용은 매개 변수가 문자열 리터럴이 아니기 때문에 @code{gettext} 프로그램이 “a”를 번역 가능하다고 식별하지 않음에 유의하십시오.

이를 처리하는 다른 방법은 다음 예제를 사용하는 것입니다:

@example
def N_(message): return message

animals = [N_('mollusk'),
           N_('albatross'),
           N_('rat'),
           N_('penguin'),
           N_('python'), ]

# ...
for a in animals:
    print(_(a))
@end example

이 경우, 번역 가능한 문자열을 @code{N_()} 함수로 표시하는데, @code{_()}의 정의와 충돌하지 않습니다. 그러나, @code{N_()}로 표시된 번역 가능한 문자열을 찾도록 메시지 추출 프로그램을 가르쳐야 할 필요가 있습니다. @code{xgettext}, @code{pygettext}, @code{pybabel extract} 및 @code{xpot}은 모두 @code{-k} 명령 줄 스위치를 사용하여 이를 지원합니다. 여기서 @code{N_()}의 선택은 완전히 임의적입니다; @code{MarkThisStringForTranslation()}처럼 무엇이든 될 수 있습니다.

@node 감사의 말,,프로그램과 모듈의 국제화,gettext — 다국어 국제화 서비스
@anchor{library/gettext acknowledgements}@anchor{42c6}
@subsubsection 감사의 말


다음 분들은 이 모듈을 만드는 데 코드, 피드백, 디자인 제안, 이전 구현 및 귀중한 경험을 제공했습니다:


@itemize *

@item 
Peter Funk

@item 
James Henstridge

@item 
Juan David Ibáñez Palomar

@item 
Marc-André Lemburg

@item 
Martin von Löwis

@item 
François Pinard

@item 
Barry Warsaw

@item 
Gustavo Niemeyer
@end itemize

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node locale — 국제화 서비스,,gettext — 다국어 국제화 서비스,국제화
@anchor{library/locale doc}@anchor{42c7}@anchor{library/locale locale-internationalization-services}@anchor{42c8}@anchor{library/locale module-locale}@anchor{8a}@anchor{library/locale translation-repo}@anchor{42c9}
@subsection @code{locale} — 국제화 서비스


@geindex module; locale

`소스 코드:' Lib/locale.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/locale.py}


__________________________________________________________________


The @code{locale} module opens access to the POSIX locale database and
functionality. The POSIX locale mechanism allows programmers to deal with
certain cultural issues in an application, without requiring the programmer to
know all the specifics of each country where the software is executed.

@geindex 모듈;_locale

The @code{locale} module is implemented on top of the @code{_locale} module,
which in turn uses an ANSI C locale implementation if available.

The @code{locale} module defines the following exception and functions:

@geindex Error
@anchor{library/locale locale Error}@anchor{42ca}
@deffn {예외} locale.Error

@ref{328,,setlocale()}에 전달된 로케일이 인식되지 않을 때 발생하는 예외.
@end deffn

@geindex setlocale() (locale 모듈)
@anchor{library/locale locale setlocale}@anchor{328}
@deffn {함수} locale.setlocale (category, locale=None)

If `locale' is given and not @code{None}, @ref{328,,setlocale()} modifies the locale
setting for the `category'. The available categories are listed in the data
description below. `locale' may be a @ref{42cb,,string}, or a pair,
language code and encoding. An empty string specifies the user’s
default settings. If the modification of the locale fails, the exception
@ref{42ca,,Error} is raised. If successful, the new locale setting is returned.

If `locale' is a pair, it is converted to a locale name using
the locale aliasing engine.
The language code has the same format as a @ref{42cb,,locale name},
but without encoding and @code{@@}-modifier.
The language code and encoding can be @code{None}.

`locale'이 생략되거나 @code{None}이면, `category'의 현재 설정이 반환됩니다.

예:

@example
>>> import locale
>>> loc = locale.setlocale(locale.LC_ALL)  # get current locale
# use German locale; name and availability varies with platform
>>> locale.setlocale(locale.LC_ALL, 'de_DE.UTF-8')
>>> locale.strcoll('f\xe4n', 'foo')  # compare a string containing an umlaut
>>> locale.setlocale(locale.LC_ALL, '@w{'})   # use user's preferred locale
>>> locale.setlocale(locale.LC_ALL, 'C')  # use default (C) locale
>>> locale.setlocale(locale.LC_ALL, loc)  # restore saved locale
@end example

@ref{328,,setlocale()} is not thread-safe on most systems. Applications typically
start with a call of:

@example
import locale
locale.setlocale(locale.LC_ALL, '@w{'})
@end example

이는 모든 범주의 로케일을 사용자의 기본 설정(보통 
@geindex LANG
@geindex 환경 변수; LANG
@code{LANG} 환경 변수에서 지정됩니다)으로 설정합니다. 그 후에 로케일을 변경하지 않으면, 다중 스레딩을 사용해도 문제가 발생하지 않습니다.
@end deffn

@geindex localeconv() (locale 모듈)
@anchor{library/locale locale localeconv}@anchor{df7}
@deffn {함수} locale.localeconv ()

현지 규칙의 데이터베이스를 딕셔너리로 반환합니다. 이 딕셔너리에는 키로 다음 문자열이 있습니다:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

범주

@tab

키

@tab

의미

@item

@ref{42cc,,LC_NUMERIC}

@tab

@code{'decimal_point'}

@tab

십진수 소수점 문자.

@item

@tab

@code{'grouping'}

@tab

@code{'thousands_sep'}가 예상되는 상대 위치를 지정하는 숫자의 시퀀스. 시퀀스가 @ref{42cd,,CHAR_MAX}로 종료되면, 더 이상의 그룹화가 수행되지 않습니다. 시퀀스가 @code{0}으로 종료되면, 마지막 그룹 크기가 반복적으로 사용됩니다.

@item

@tab

@code{'thousands_sep'}

@tab

그룹 간에 사용되는 문자.

@item

@ref{42ce,,LC_MONETARY}

@tab

@code{'int_curr_symbol'}

@tab

국제 통화 기호.

@item

@tab

@code{'currency_symbol'}

@tab

현지 통화 기호.

@item

@tab

@code{'p_cs_precedes/n_cs_precedes'}

@tab

통화 기호가 값 앞에 오는지 여부 (각각 양과 음의 값).

@item

@tab

@code{'p_sep_by_space/n_sep_by_space'}

@tab

통화 기호가 스페이스로 값과 구분되는지 여부 (각각 양과 음의 값).

@item

@tab

@code{'mon_decimal_point'}

@tab

화폐값에 사용되는 십진수 소수점.

@item

@tab

@code{'frac_digits'}

@tab

화폐값의 현지 형식에 사용되는 소수점 이하 자릿수.

@item

@tab

@code{'int_frac_digits'}

@tab

화폐값의 국제 형식에 사용되는 소수점 이하 자릿수.

@item

@tab

@code{'mon_thousands_sep'}

@tab

화폐값에 사용되는 그룹 구분자.

@item

@tab

@code{'mon_grouping'}

@tab

@code{'grouping'}과 동등합니다, 화폐값에 사용됩니다.

@item

@tab

@code{'positive_sign'}

@tab

양의 화폐값을 표현하는 데 사용되는 기호.

@item

@tab

@code{'negative_sign'}

@tab

음의 화폐값을 표현하는 데 사용되는 기호.

@item

@tab

@code{'p_sign_posn/n_sign_posn'}

@tab

부호의 위치 (각각 양과 음의 값), 아래를 참조하십시오.

@end multitable


모든 숫자 값은 이 로케일에서 아무런 값도 지정되지 않았음을 나타내는 @ref{42cd,,CHAR_MAX}로 설정할 수 있습니다.

@code{'p_sign_posn'}과 @code{'n_sign_posn'}에 가능한 값은 다음과 같습니다.


@multitable {xxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

값

@tab

설명

@item

@code{0}

@tab

통화와 값을 괄호로 묶습니다.

@item

@code{1}

@tab

부호는 값과 통화 기호 앞에 와야 합니다.

@item

@code{2}

@tab

부호는 값과 통화 기호 뒤에 와야 합니다.

@item

@code{3}

@tab

부호는 값 바로 앞에 와야 합니다.

@item

@code{4}

@tab

부호는 값 바로 뒤에 와야 합니다.

@item

@code{CHAR_MAX}

@tab

이 로케일에 지정된 것이 없습니다.

@end multitable


로케일이 다르고 숫자나 통화 문자열이 ASCII가 아니면, 함수는 일시적으로 @code{LC_CTYPE} 로케일을 @code{LC_NUMERIC} 로케일이나 @code{LC_MONETARY} 로케일로 설정합니다. 이 임시 변경은 다른 스레드에 영향을 줍니다.


버전 3.7에서 변경: 이 함수는 이제 어떤 경우에 @code{LC_CTYPE} 로케일을 @code{LC_NUMERIC} 로케일로 임시 설정합니다.

@end deffn

@geindex nl_langinfo() (locale 모듈)
@anchor{library/locale locale nl_langinfo}@anchor{454}
@deffn {함수} locale.nl_langinfo (option)

로케일 특정 정보를 문자열로 반환합니다. 이 함수를 모든 시스템에서 사용할 수 있는 것은 아니며, 가능한 옵션 집합은 플랫폼마다 다를 수 있습니다. 가능한 인자 값은 숫자이며, locale 모듈에 있는 기호 상수를 사용할 수 있습니다.

@ref{454,,nl_langinfo()} 함수는 다음 키 중 하나를 받아들입니다. 대부분의 설명은 GNU C 라이브러리의 해당 설명에서 가져옵니다.

@geindex CODESET (locale 모듈)
@anchor{library/locale locale CODESET}@anchor{42cf}
@deffn {데이터} locale.CODESET

선택한 로케일에 사용된 문자 인코딩의 이름으로 문자열을 가져옵니다.
@end deffn

@geindex D_T_FMT (locale 모듈)
@anchor{library/locale locale D_T_FMT}@anchor{42d0}
@deffn {데이터} locale.D_T_FMT

로케일 특정 방식으로 날짜와 시간을 표시하기 위해 @ref{13ee,,time.strftime()}의 포맷 문자열로 사용할 수 있는 문자열을 가져옵니다.
@end deffn

@geindex D_FMT (locale 모듈)
@anchor{library/locale locale D_FMT}@anchor{42d1}
@deffn {데이터} locale.D_FMT

로케일 특정 방식으로 날짜를 표시하기 위해 @ref{13ee,,time.strftime()}의 포맷 문자열로 사용할 수 있는 문자열을 가져옵니다.
@end deffn

@geindex T_FMT (locale 모듈)
@anchor{library/locale locale T_FMT}@anchor{42d2}
@deffn {데이터} locale.T_FMT

로케일 특정 방식으로 시간을 표시하기 위해 @ref{13ee,,time.strftime()}의 포맷 문자열로 사용할 수 있는 문자열을 가져옵니다.
@end deffn

@geindex T_FMT_AMPM (locale 모듈)
@anchor{library/locale locale T_FMT_AMPM}@anchor{42d3}
@deffn {데이터} locale.T_FMT_AMPM

am/pm 형식으로 시간을 나타내는 @ref{13ee,,time.strftime()}의 포맷 문자열을 가져옵니다.
@end deffn

@geindex DAY_1 (locale 모듈)
@geindex DAY_2 (locale 모듈)
@geindex DAY_3 (locale 모듈)
@geindex DAY_4 (locale 모듈)
@geindex DAY_5 (locale 모듈)
@geindex DAY_6 (locale 모듈)
@geindex DAY_7 (locale 모듈)
@anchor{library/locale locale DAY_1}@anchor{42d4}
@deffn {데이터} locale.DAY_1
@anchor{library/locale locale DAY_2}@anchor{42d5}
@deffnx {데이터} locale.DAY_2
@anchor{library/locale locale DAY_3}@anchor{42d6}
@deffnx {데이터} locale.DAY_3
@anchor{library/locale locale DAY_4}@anchor{42d7}
@deffnx {데이터} locale.DAY_4
@anchor{library/locale locale DAY_5}@anchor{42d8}
@deffnx {데이터} locale.DAY_5
@anchor{library/locale locale DAY_6}@anchor{42d9}
@deffnx {데이터} locale.DAY_6
@anchor{library/locale locale DAY_7}@anchor{42da}
@deffnx {데이터} locale.DAY_7

주의 n 번째 날의 이름을 가져옵니다.

@cartouche
@quotation 참고 
이것은 월요일이 주의 첫 번째 요일인 국제관례(ISO 8601)가 아니라, @ref{42d4,,DAY_1}이 일요일인 미국 관례를 따릅니다.
@end quotation
@end cartouche
@end deffn

@geindex ABDAY_1 (locale 모듈)
@geindex ABDAY_2 (locale 모듈)
@geindex ABDAY_3 (locale 모듈)
@geindex ABDAY_4 (locale 모듈)
@geindex ABDAY_5 (locale 모듈)
@geindex ABDAY_6 (locale 모듈)
@geindex ABDAY_7 (locale 모듈)
@anchor{library/locale locale ABDAY_1}@anchor{42db}
@deffn {데이터} locale.ABDAY_1
@anchor{library/locale locale ABDAY_2}@anchor{42dc}
@deffnx {데이터} locale.ABDAY_2
@anchor{library/locale locale ABDAY_3}@anchor{42dd}
@deffnx {데이터} locale.ABDAY_3
@anchor{library/locale locale ABDAY_4}@anchor{42de}
@deffnx {데이터} locale.ABDAY_4
@anchor{library/locale locale ABDAY_5}@anchor{42df}
@deffnx {데이터} locale.ABDAY_5
@anchor{library/locale locale ABDAY_6}@anchor{42e0}
@deffnx {데이터} locale.ABDAY_6
@anchor{library/locale locale ABDAY_7}@anchor{42e1}
@deffnx {데이터} locale.ABDAY_7

주의 n 번째 날의 줄인 이름을 가져옵니다.
@end deffn

@geindex MON_1 (locale 모듈)
@geindex MON_2 (locale 모듈)
@geindex MON_3 (locale 모듈)
@geindex MON_4 (locale 모듈)
@geindex MON_5 (locale 모듈)
@geindex MON_6 (locale 모듈)
@geindex MON_7 (locale 모듈)
@geindex MON_8 (locale 모듈)
@geindex MON_9 (locale 모듈)
@geindex MON_10 (locale 모듈)
@geindex MON_11 (locale 모듈)
@geindex MON_12 (locale 모듈)
@anchor{library/locale locale MON_1}@anchor{42e2}
@deffn {데이터} locale.MON_1
@anchor{library/locale locale MON_2}@anchor{42e3}
@deffnx {데이터} locale.MON_2
@anchor{library/locale locale MON_3}@anchor{42e4}
@deffnx {데이터} locale.MON_3
@anchor{library/locale locale MON_4}@anchor{42e5}
@deffnx {데이터} locale.MON_4
@anchor{library/locale locale MON_5}@anchor{42e6}
@deffnx {데이터} locale.MON_5
@anchor{library/locale locale MON_6}@anchor{42e7}
@deffnx {데이터} locale.MON_6
@anchor{library/locale locale MON_7}@anchor{42e8}
@deffnx {데이터} locale.MON_7
@anchor{library/locale locale MON_8}@anchor{42e9}
@deffnx {데이터} locale.MON_8
@anchor{library/locale locale MON_9}@anchor{42ea}
@deffnx {데이터} locale.MON_9
@anchor{library/locale locale MON_10}@anchor{42eb}
@deffnx {데이터} locale.MON_10
@anchor{library/locale locale MON_11}@anchor{42ec}
@deffnx {데이터} locale.MON_11
@anchor{library/locale locale MON_12}@anchor{42ed}
@deffnx {데이터} locale.MON_12

n 번째 달의 이름을 가져옵니다.
@end deffn

@geindex ABMON_1 (locale 모듈)
@geindex ABMON_2 (locale 모듈)
@geindex ABMON_3 (locale 모듈)
@geindex ABMON_4 (locale 모듈)
@geindex ABMON_5 (locale 모듈)
@geindex ABMON_6 (locale 모듈)
@geindex ABMON_7 (locale 모듈)
@geindex ABMON_8 (locale 모듈)
@geindex ABMON_9 (locale 모듈)
@geindex ABMON_10 (locale 모듈)
@geindex ABMON_11 (locale 모듈)
@geindex ABMON_12 (locale 모듈)
@anchor{library/locale locale ABMON_1}@anchor{42ee}
@deffn {데이터} locale.ABMON_1
@anchor{library/locale locale ABMON_2}@anchor{42ef}
@deffnx {데이터} locale.ABMON_2
@anchor{library/locale locale ABMON_3}@anchor{42f0}
@deffnx {데이터} locale.ABMON_3
@anchor{library/locale locale ABMON_4}@anchor{42f1}
@deffnx {데이터} locale.ABMON_4
@anchor{library/locale locale ABMON_5}@anchor{42f2}
@deffnx {데이터} locale.ABMON_5
@anchor{library/locale locale ABMON_6}@anchor{42f3}
@deffnx {데이터} locale.ABMON_6
@anchor{library/locale locale ABMON_7}@anchor{42f4}
@deffnx {데이터} locale.ABMON_7
@anchor{library/locale locale ABMON_8}@anchor{42f5}
@deffnx {데이터} locale.ABMON_8
@anchor{library/locale locale ABMON_9}@anchor{42f6}
@deffnx {데이터} locale.ABMON_9
@anchor{library/locale locale ABMON_10}@anchor{42f7}
@deffnx {데이터} locale.ABMON_10
@anchor{library/locale locale ABMON_11}@anchor{42f8}
@deffnx {데이터} locale.ABMON_11
@anchor{library/locale locale ABMON_12}@anchor{42f9}
@deffnx {데이터} locale.ABMON_12

n 번째 달의 줄인 이름을 가져옵니다.
@end deffn

@geindex RADIXCHAR (locale 모듈)
@anchor{library/locale locale RADIXCHAR}@anchor{42fa}
@deffn {데이터} locale.RADIXCHAR

기수 문자(십진수 점, 십진수 쉼표, 등)를 가져옵니다.
@end deffn

@geindex THOUSEP (locale 모듈)
@anchor{library/locale locale THOUSEP}@anchor{42fb}
@deffn {데이터} locale.THOUSEP

천 단위 (3자리 그룹) 구분자 문자를 가져옵니다.
@end deffn

@geindex YESEXPR (locale 모듈)
@anchor{library/locale locale YESEXPR}@anchor{42fc}
@deffn {데이터} locale.YESEXPR

예/아니요 질문에 대한 긍정적인 응답을 인식하기 위해 regex 함수에 사용할 수 있는 정규식을 가져옵니다.
@end deffn

@geindex NOEXPR (locale 모듈)
@anchor{library/locale locale NOEXPR}@anchor{42fd}
@deffn {데이터} locale.NOEXPR

예/아니요 질문에 대한 부정적인 응답을 인식하기 위해 @code{regex(3)} 함수에 사용할 수 있는 정규식을 가져옵니다.

@cartouche
@quotation 참고 
@ref{42fc,,YESEXPR}과 @ref{42fd,,NOEXPR}를 위한 정규식은 C 라이브러리의 @code{regex} 함수에 적합한 문법을 사용합니다, 이는 @ref{be,,re}에 사용되는 문법과 다를 수 있습니다.
@end quotation
@end cartouche
@end deffn

@geindex CRNCYSTR (locale 모듈)
@anchor{library/locale locale CRNCYSTR}@anchor{42fe}
@deffn {데이터} locale.CRNCYSTR

통화 기호를 가져옵니다. 기호가 값 앞에 나타나야 하면 “-”, 기호가 값 뒤에 나타나야 하면 “+”, 또는 기호가 기수 문자를 대체해야 하면 “.”가 앞에 나옵니다.
@end deffn

@geindex ERA (locale 모듈)
@anchor{library/locale locale ERA}@anchor{42ff}
@deffn {데이터} locale.ERA

로케일의 각 시대에 대해 연도를 계산하고 표시하는 방법을 설명하는 문자열을 가져옵니다.

대부분의 로케일은 이 값을 정의하지 않습니다. 이 값을 정의하는 로케일의 예는 일본입니다. 일본에서, 전통적인 날짜 표시에는 당시 군주의 통치에 해당하는 시대의 이름이 포함됩니다.

일반적으로 이 값을 직접 사용할 필요는 없습니다. 포맷 문자열에 @code{E} 수정자를 지정하면 @ref{13ee,,time.strftime()} 함수가 이 정보를 사용합니다. 반환된 문자열의 형식은 `The Open Group Base Specifications Issue 8', 문단 7.3.5.2 LC_TIME C-Language Access@footnote{https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/V1_chap07.html#tag_07_03_05_02}에서 지정합니다.
@end deffn

@geindex ERA_D_T_FMT (locale 모듈)
@anchor{library/locale locale ERA_D_T_FMT}@anchor{4300}
@deffn {데이터} locale.ERA_D_T_FMT

로케일 특정 시대 기반 방식으로 날짜와 시간을 나타내는 @ref{13ee,,time.strftime()}의 포맷 문자열을 가져옵니다.
@end deffn

@geindex ERA_D_FMT (locale 모듈)
@anchor{library/locale locale ERA_D_FMT}@anchor{4301}
@deffn {데이터} locale.ERA_D_FMT

로케일 특정 시대 기반 방식으로 날짜를 나타내는 @ref{13ee,,time.strftime()}의 포맷 문자열을 가져옵니다.
@end deffn

@geindex ERA_T_FMT (locale 모듈)
@anchor{library/locale locale ERA_T_FMT}@anchor{4302}
@deffn {데이터} locale.ERA_T_FMT

로케일 특정 시대 기반 방식으로 시간을 나타내는 @ref{13ee,,time.strftime()}의 포맷 문자열을 가져옵니다.
@end deffn

@geindex ALT_DIGITS (locale 모듈)
@anchor{library/locale locale ALT_DIGITS}@anchor{4303}
@deffn {데이터} locale.ALT_DIGITS

로케일별 방식으로 0에서 99까지의 값을 나타내는 데 사용되는 세미콜론으로 구분되된 최대 100개의 기호로 구성된 문자열을 가져옵니다. 대부분의 로케일에서 빈 문자열입니다.
@end deffn

The function temporarily sets the @code{LC_CTYPE} locale to the locale
of the category that determines the requested value (@code{LC_TIME},
@code{LC_NUMERIC}, @code{LC_MONETARY} or @code{LC_MESSAGES}) if locales are
different and the resulting string is non-ASCII.
This temporary change affects other threads.


버전 3.14에서 변경: The function now temporarily sets the @code{LC_CTYPE} locale in some cases.

@end deffn

@geindex getdefaultlocale() (locale 모듈)
@anchor{library/locale locale getdefaultlocale}@anchor{326}
@deffn {함수} locale.getdefaultlocale ([envvars])

기본 로케일 설정을 판별하려고 시도하고 @code{(language code, encoding)} 형식의 튜플로 반환합니다.

POSIX에 따르면, @code{setlocale(LC_ALL, '@w{'})}을 호출하지 않은 프로그램은 이식성 있는 @code{'C'} 로케일을 사용하여 실행됩니다. @code{setlocale(LC_ALL, '@w{'})}을 호출하면 
@geindex LANG
@geindex 환경 변수; LANG
@code{LANG} 변수로 정의된 기본 로케일을 사용하도록 합니다. 현재 로케일 설정을 방해하고 싶지 않기 때문에 위에서 설명한 방식으로 동작을 에뮬레이트 합니다.

다른 플랫폼과의 호환성을 유지하기 위해, 
@geindex LANG
@geindex 환경 변수; LANG
@code{LANG} 변수뿐만 아니라 envvars 매개 변수로 제공된 변수 리스트도 검사합니다. 가장 먼저 정의된 것으로 발견된 것이 사용됩니다. `envvars'는 GNU gettext에서 사용되는 검색 경로를 기본값으로 합니다; 항상 변수 이름 @code{'LANG'}을 포함해야 합니다. GNU gettext 검색 경로에는 @code{'LC_ALL'}, @code{'LC_CTYPE'}, @code{'LANG'} 및 @code{'LANGUAGE'}가 순서대로 포함됩니다.

The language code has the same format as a @ref{42cb,,locale name},
but without encoding and @code{@@}-modifier.
The language code and encoding may be @code{None} if their values cannot be
determined.
The “C” locale is represented as @code{(None, None)}.


Deprecated since version 3.11, will be removed in version 3.15.

@end deffn

@geindex getlocale() (locale 모듈)
@anchor{library/locale locale getlocale}@anchor{327}
@deffn {함수} locale.getlocale (category=LC_CTYPE)

Returns the current setting for the given locale category as a tuple containing
the language code and encoding. `category' may be one of the @code{LC_*}
values except @ref{4304,,LC_ALL}.  It defaults to @ref{4305,,LC_CTYPE}.

The language code has the same format as a @ref{42cb,,locale name},
but without encoding and @code{@@}-modifier.
The language code and encoding may be @code{None} if their values cannot be
determined.
The “C” locale is represented as @code{(None, None)}.
@end deffn

@geindex getpreferredencoding() (locale 모듈)
@anchor{library/locale locale getpreferredencoding}@anchor{75b}
@deffn {함수} locale.getpreferredencoding (do_setlocale=True)

사용자 설정(user preferences)에 따라, 텍스트 데이터에 사용된 @ref{54a,,로케일 인코딩}을 반환합니다. 사용자 설정은 시스템마다 다르게 표현되며, 일부 시스템에서는 프로그래밍 방식으로 제공되지 않을 수 있어서, 이 함수는 추측만 반환합니다.

일부 시스템에서는, 사용자 설정을 얻기 위해 @ref{328,,setlocale()}을 호출할 필요가 있어서, 이 함수는 스레드 안전하지 않습니다. setlocale을 호출할 필요가 없거나 원하지 않으면, `do_setlocale'을 @code{False}로 설정해야 합니다.

안드로이드에서 또는 @ref{865,,파이썬 UTF-8 모드}가 활성화되면, 항상 @code{'utf-8'}을 반환하고, @ref{54a,,로케일 인코딩}과 `do_setlocale' 인자는 무시됩니다.

The @ref{4306,,Python preinitialization} configures the LC_CTYPE
locale. See also the @ref{75c,,filesystem encoding and error handler}.


버전 3.7에서 변경: 이 함수는 이제 안드로이드에서 또는 @ref{865,,파이썬 UTF-8 모드}가 활성화되면 항상 @code{"utf-8"}을 반환합니다.

@end deffn

@geindex getencoding() (locale 모듈)
@anchor{library/locale locale getencoding}@anchor{329}
@deffn {함수} locale.getencoding ()

Get the current @ref{54a,,locale encoding}:


@itemize *

@item 
On Android and VxWorks, return @code{"utf-8"}.

@item 
On Unix, return the encoding of the current @ref{4305,,LC_CTYPE} locale.
Return @code{"utf-8"} if @code{nl_langinfo(CODESET)} returns an empty string:
for example, if the current LC_CTYPE locale is not supported.

@item 
On Windows, return the ANSI code page.
@end itemize

The @ref{4306,,Python preinitialization} configures the LC_CTYPE
locale. See also the @ref{75c,,filesystem encoding and error handler}.

This function is similar to
@ref{75b,,getpreferredencoding(False)} except this
function ignores the @ref{865,,Python UTF-8 Mode}.


Added in version 3.11.

@end deffn

@geindex normalize() (locale 모듈)
@anchor{library/locale locale normalize}@anchor{4307}
@deffn {함수} locale.normalize (localename)

주어진 로케일 이름에 대해 정규화된 로케일 코드를 반환합니다. 반환된 로케일 코드는 @ref{328,,setlocale()}에서 사용하도록 포맷됩니다. 정규화에 실패하면, 원래 이름이 변경되지 않은 상태로 반환됩니다.

주어진 인코딩이 알려지지 않았으면, 함수는 @ref{328,,setlocale()}처럼 로케일 코드의 기본 인코딩을 기본값으로 사용합니다.
@end deffn

@geindex strcoll() (locale 모듈)
@anchor{library/locale locale strcoll}@anchor{4308}
@deffn {함수} locale.strcoll (string1, string2)

현재 @ref{4309,,LC_COLLATE} 설정에 따라 두 문자열을 비교합니다. 다른 비교 함수처럼, `string1'이 `string2' 앞이니 뒤에 오는지 또는 같은지에 따라 음수나 양수 값 또는 @code{0}을 반환합니다.
@end deffn

@geindex strxfrm() (locale 모듈)
@anchor{library/locale locale strxfrm}@anchor{17c3}
@deffn {함수} locale.strxfrm (string)

문자열을 로케일을 고려한 비교에 사용할 수 있는 문자열로 변환합니다. 예를 들어, @code{strxfrm(s1) < strxfrm(s2)}는 @code{strcoll(s1, s2) < 0}과 동등합니다. 이 함수는 같은 문자열이 반복적으로 비교될 때, 예를 들어 문자열 시퀀스를 정렬할 때, 사용할 수 있습니다.
@end deffn

@geindex format_string() (locale 모듈)
@anchor{library/locale locale format_string}@anchor{741}
@deffn {함수} locale.format_string (format, val, grouping=False, monetary=False)

현재 @ref{42cc,,LC_NUMERIC} 설정에 따라 숫자 `val'을 포맷합니다. format은 @code{%} 연산자의 규칙을 따릅니다. 부동 소수점 값의 경우, 적절하다면 소수점이 수정됩니다. `grouping'이 @code{True}이면, 그룹화도 고려합니다.

`monetary'가 참이면, 변환은 화폐 천 단위 구분 기호와 그룹화 문자열을 사용합니다.

@code{format % val}에서처럼 포맷 지정자를 처리하지만, 현재 로케일 설정을 고려합니다.


버전 3.7에서 변경: `monetary' 키워드 매개 변수가 추가되었습니다.

@end deffn

@geindex currency() (locale 모듈)
@anchor{library/locale locale currency}@anchor{430a}
@deffn {함수} locale.currency (val, symbol=True, grouping=False, international=False)

현재 @ref{42ce,,LC_MONETARY} 설정에 따라 숫자 `val'을 포맷합니다.

`symbol'이 참이면 반환된 문자열에 통화 기호가 포함됩니다, 이것이 기본값입니다. `grouping'이 @code{True}이면 (기본값이 아닙니다), 값으로 그룹화가 수행됩니다. `international'이 @code{True}이면 (기본값이 아닙니다), 국제 통화 기호가 사용됩니다.

@cartouche
@quotation 참고 
이 함수는 ‘C’ 로케일에서 작동하지 않아서, 먼저 @ref{328,,setlocale()}을 통해 로케일을 설정해야 합니다.
@end quotation
@end cartouche
@end deffn

@geindex str() (locale 모듈)
@anchor{library/locale locale str}@anchor{430b}
@deffn {함수} locale.str (float)

내장 함수 @code{str(float)}와 같은 형식을 사용하여 부동 소수점 숫자를 포맷하지만, 십진수 소수점을 고려합니다.
@end deffn

@geindex delocalize() (locale 모듈)
@anchor{library/locale locale delocalize}@anchor{1025}
@deffn {함수} locale.delocalize (string)

@ref{42cc,,LC_NUMERIC} 설정에 따라, 문자열을 정규화된 숫자 문자열로 변환합니다.


Added in version 3.5.

@end deffn

@geindex localize() (locale 모듈)
@anchor{library/locale locale localize}@anchor{430c}
@deffn {함수} locale.localize (string, grouping=False, monetary=False)

@ref{42cc,,LC_NUMERIC} 설정에 따라 포맷되는 문자열로, 문자열을 정규화된 숫자 문자열로 변환합니다.


Added in version 3.10.

@end deffn

@geindex atof() (locale 모듈)
@anchor{library/locale locale atof}@anchor{430d}
@deffn {함수} locale.atof (string, func=float)

`string'에 @ref{1025,,delocalize()}를 호출한 결과에 `func'를 호출하여, @ref{42cc,,LC_NUMERIC} 설정에 따라, 문자열을 숫자로 변환합니다.
@end deffn

@geindex atoi() (locale 모듈)
@anchor{library/locale locale atoi}@anchor{430e}
@deffn {함수} locale.atoi (string)

@ref{42cc,,LC_NUMERIC} 규칙에 따라, 문자열을 정수로 변환합니다.
@end deffn

@geindex LC_CTYPE (locale 모듈)
@anchor{library/locale locale LC_CTYPE}@anchor{4305}
@deffn {데이터} locale.LC_CTYPE

Locale category for the character type functions.  Most importantly, this
category defines the text encoding, i.e. how bytes are interpreted as
Unicode codepoints.  See 
@geindex Python 향상 제안; PEP 538
PEP 538@footnote{https://peps.python.org/pep-0538/} and 
@geindex Python 향상 제안; PEP 540
PEP 540@footnote{https://peps.python.org/pep-0540/} for how this variable
might be automatically coerced to @code{C.UTF-8} to avoid issues created by
invalid settings in containers or incompatible settings passed over remote
SSH connections.

Python doesn’t internally use locale-dependent character transformation functions
from @code{ctype.h}. Instead, @code{pyctype.h} provides locale-independent
equivalents like @ref{155d,,Py_TOLOWER}.
@end deffn

@geindex LC_COLLATE (locale 모듈)
@anchor{library/locale locale LC_COLLATE}@anchor{4309}
@deffn {데이터} locale.LC_COLLATE

Locale category for sorting strings.  The functions @ref{4308,,strcoll()} and
@ref{17c3,,strxfrm()} of the @code{locale} module are affected.
@end deffn

@geindex LC_TIME (locale 모듈)
@anchor{library/locale locale LC_TIME}@anchor{430f}
@deffn {데이터} locale.LC_TIME

시간 포매팅을 위한 로케일 범주. @ref{13ee,,time.strftime()} 함수는 이러한 규칙을 따릅니다.
@end deffn

@geindex LC_MONETARY (locale 모듈)
@anchor{library/locale locale LC_MONETARY}@anchor{42ce}
@deffn {데이터} locale.LC_MONETARY

화폐값의 포매팅을 위한 로케일 범주. 사용 가능한 옵션은 @ref{df7,,localeconv()} 함수에서 제공됩니다.
@end deffn

@geindex LC_MESSAGES (locale 모듈)
@anchor{library/locale locale LC_MESSAGES}@anchor{4310}
@deffn {데이터} locale.LC_MESSAGES

메시지 표시를 위한 로케일 범주. 파이썬은 현재 응용 프로그램에 특정한 로케일을 고려한 메시지를 지원하지 않습니다. @ref{304b,,os.strerror()}에서 반환된 메시지처럼 운영 체제에서 표시되는 메시지는 이 범주의 영향을 받을 수 있습니다.

This value may not be available on operating systems not conforming to the
POSIX standard, most notably Windows.
@end deffn

@geindex LC_NUMERIC (locale 모듈)
@anchor{library/locale locale LC_NUMERIC}@anchor{42cc}
@deffn {데이터} locale.LC_NUMERIC

Locale category for formatting numbers.  The functions @ref{741,,format_string()},
@ref{430e,,atoi()}, @ref{430d,,atof()} and @ref{430b,,str()} of the @code{locale} module are
affected by that category.  All other numeric formatting operations are not
affected.
@end deffn

@geindex LC_ALL (locale 모듈)
@anchor{library/locale locale LC_ALL}@anchor{4304}
@deffn {데이터} locale.LC_ALL

모든 로케일 설정의 조합. 로케일을 변경할 때 이 플래그를 사용하면, 모든 범주에 대한 로케일 설정을 시도합니다. 어떤 범주에서 실패하면, 아무런 범주도 변경되지 않습니다. 이 플래그를 사용하여 로케일을 가져오면, 모든 범주의 설정을 나타내는 문자열이 반환됩니다. 이 문자열은 나중에 설정을 복원하는 데 사용할 수 있습니다.
@end deffn

@geindex CHAR_MAX (locale 모듈)
@anchor{library/locale locale CHAR_MAX}@anchor{42cd}
@deffn {데이터} locale.CHAR_MAX

이것은 @ref{df7,,localeconv()}가 반환한 다른 값에 사용되는 기호 상수입니다.
@end deffn

@menu
* 배경@comma{} 세부 사항@comma{} 힌트@comma{} 팁 및 경고: 배경 세부 사항 힌트 팁 및 경고. 
* Locale names:: 
* 확장 작성자와 파이썬을 내장하는 프로그램의 경우:: 
* 메시지 카탈로그에 액세스:: 

@end menu

@node 배경 세부 사항 힌트 팁 및 경고,Locale names,,locale — 국제화 서비스
@anchor{library/locale background-details-hints-tips-and-caveats}@anchor{4311}
@subsubsection 배경, 세부 사항, 힌트, 팁 및 경고


C 표준은 로케일을 변경하는 데 상대적으로 비용이 많이 드는 프로그램 전체 속성으로 정의합니다. 이 위에, 로케일을 자주 변경하면 코어 덤프가 발생할 수 있는 방식으로 일부 구현이 망가져 있습니다. 이것은 로케일을 올바르게 사용하는 것을 다소 고통스럽게 만듭니다.

처음에, 프로그램이 시작할 때, 사용자가 선호하는 로케일이 무엇이든 로케일은 @code{C} 로케일입니다. 한 가지 예외가 있습니다: @ref{4305,,LC_CTYPE} 범주는 시작 시 현재 로케일 인코딩을 사용자가 선호하는 로케일 인코딩으로 설정하도록 변경됩니다. 다른 범주에 대해서는 프로그램이 @code{setlocale(LC_ALL, '@w{'})}을 호출하여 사용자가 선호하는 로케일 설정을 원한다고 명시적으로 말해야 합니다.

일반적으로 어떤 라이브러리 루틴에서 @ref{328,,setlocale()}을 호출하는 것은 나쁜 생각입니다. 부작용으로 전체 프로그램에 영향을 미치기 때문입니다. 저장하고 복원하는 것도 거의 비슷하게 나쁩니다: 비용이 많이 들고 설정이 복원되기 전에 실행되는 다른 스레드에 영향을 줍니다.

일반적인 용도로 모듈을 코딩할 때, 로케일에 영향을 받는 로케일 독립적인 버전의 연산(가령 @ref{13ee,,time.strftime()}에 사용되는 특정 포맷)이 필요하면, 표준 라이브러리 루틴을 사용하지 않고 수행할 수 있는 방법을 찾아야 합니다. 로케일 설정을 사용하는 것이 좋다고 자신을 설득하는 것이 더 좋습니다. 최후의 수단으로만 모듈이 @code{C}가 아닌 로케일 설정과 호환되지 않는다는 것을 문서화해야 합니다.

로케일에 따라 숫자 연산을 수행하는 유일한 방법은 이 모듈이 정의한 특수 함수인 @ref{430d,,atof()}, @ref{430e,,atoi()}, @ref{741,,format_string()}, @ref{430b,,str()}을 사용하는 것입니다.

로케일에 따라 대소 문자 변환과 문자 분류를 수행할 방법이 없습니다. (유니코드) 텍스트 문자열의 경우 이것은 문자 값으로만 수행되는 반면, 바이트 문자열의 경우, 바이트의 ASCII 값에 따라 수행되고, 높은 비트가 설정된 바이트(즉, ASCII가 아닌 바이트)는 절대 변환되거나 글자나 공백과 같은 문자 클래스의 일부로 고려되지 않습니다.

@node Locale names,확장 작성자와 파이썬을 내장하는 프로그램의 경우,배경 세부 사항 힌트 팁 및 경고,locale — 국제화 서비스
@anchor{library/locale locale-name}@anchor{42cb}@anchor{library/locale locale-names}@anchor{4312}
@subsubsection Locale names


The format of the locale name is platform dependent, and the set of supported
locales can depend on the system configuration.

On Posix platforms, it usually has the format @footnote{
@uref{https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/V1_chap08.html#tag_08_02,IEEE Std 1003.1-2024; 8.2 Internationalization Variables}
}:

@example
  language ["_" territory] ["." charset] ["@@" modifier]
@end example

where `language' is a two- or three-letter language code from ISO 639@footnote{https://www.iso.org/iso-639-language-code},
`territory' is a two-letter country or region code from ISO 3166@footnote{https://www.iso.org/iso-3166-country-codes.html},
`charset' is a locale encoding, and `modifier' is a script name,
a language subtag, a sort order identifier, or other locale modifier
(for example, “latin”, “valencia”, “stroke” and “euro”).

On Windows, several formats are supported. @footnote{
@uref{https://learn.microsoft.com/en-us/cpp/c-runtime-library/locale-names-languages-and-country-region-strings,UCRT Locale names@comma{} Languages@comma{} and Country/Region strings}
} @footnote{
@uref{https://learn.microsoft.com/en-us/windows/win32/intl/locale-names,Locale Names}
}
A subset of IETF BCP 47@footnote{https://www.rfc-editor.org/info/bcp47} tags:

@example
  language ["-" script] ["-" territory] ["." charset]
  language ["-" script] "-" territory "-" modifier
@end example

where `language' and `territory' have the same meaning as in Posix,
`script' is a four-letter script code from ISO 15924@footnote{https://www.unicode.org/iso15924/},
and `modifier' is a language subtag, a sort order identifier
or custom modifier (for example, “valencia”, “stroke” or “x-python”).
Both hyphen (@code{'-'}) and underscore (@code{'_'}) separators are supported.
Only UTF-8 encoding is allowed for BCP 47 tags.

Windows also supports locale names in the format:

@example
  language ["_" territory] ["." charset]
@end example

where `language' and `territory' are full names, such as “English” and
“United States”, and `charset' is either a code page number (for example, “1252”)
or UTF-8.
Only the underscore separator is supported in this format.

The “C” locale is supported on all platforms.

@node 확장 작성자와 파이썬을 내장하는 프로그램의 경우,메시지 카탈로그에 액세스,Locale names,locale — 국제화 서비스
@anchor{library/locale embedding-locale}@anchor{4313}@anchor{library/locale for-extension-writers-and-programs-that-embed-python}@anchor{4314}
@subsubsection 확장 작성자와 파이썬을 내장하는 프로그램의 경우


확장 모듈은 현재 로케일이 무엇인지 찾는 것을 제외하고는 @ref{328,,setlocale()}을 호출해서는 안 됩니다. 그러나 반환 값은 이식성 있게 복원하는 데만 사용될 수 있기 때문에, 그다지 유용하지 않습니다 (아마도 로케일이 @code{C}인지 아닌지를 확인하는 것은 예외입니다).

When Python code uses the @code{locale} module to change the locale, this also
affects the embedding application.  If the embedding application doesn’t want
this to happen, it should remove the @code{_locale} extension module (which does
all the work) from the table of built-in modules in the @code{config.c} file,
and make sure that the @code{_locale} module is not accessible as a shared
library.

@node 메시지 카탈로그에 액세스,,확장 작성자와 파이썬을 내장하는 프로그램의 경우,locale — 국제화 서비스
@anchor{library/locale access-to-message-catalogs}@anchor{4315}@anchor{library/locale locale-gettext}@anchor{4316}
@subsubsection 메시지 카탈로그에 액세스


@geindex gettext() (locale 모듈)
@anchor{library/locale locale gettext}@anchor{4317}
@deffn {함수} locale.gettext (msg)
@end deffn

@geindex dgettext() (locale 모듈)
@anchor{library/locale locale dgettext}@anchor{4318}
@deffn {함수} locale.dgettext (domain, msg)
@end deffn

@geindex dcgettext() (locale 모듈)
@anchor{library/locale locale dcgettext}@anchor{4319}
@deffn {함수} locale.dcgettext (domain, msg, category)
@end deffn

@geindex textdomain() (locale 모듈)
@anchor{library/locale locale textdomain}@anchor{431a}
@deffn {함수} locale.textdomain (domain)
@end deffn

@geindex bindtextdomain() (locale 모듈)
@anchor{library/locale locale bindtextdomain}@anchor{431b}
@deffn {함수} locale.bindtextdomain (domain, dir)
@end deffn

@geindex bind_textdomain_codeset() (locale 모듈)
@anchor{library/locale locale bind_textdomain_codeset}@anchor{431c}
@deffn {함수} locale.bind_textdomain_codeset (domain, codeset)
@end deffn

locale 모듈은 이 인터페이스를 제공하는 시스템에서 C 라이브러리의 gettext 인터페이스를 제공합니다. @ref{67,,gettext()}, @ref{4318,,dgettext()}, @ref{4319,,dcgettext()}, @ref{431a,,textdomain()}, @ref{431b,,bindtextdomain()} 및 @ref{431c,,bind_textdomain_codeset()} 함수로 구성됩니다. 이는 @ref{67,,gettext} 모듈의 같은 함수와 유사하지만, 메시지 카탈로그에 C 라이브러리의 바이너리 형식을 사용하고, 메시지 카탈로그를 찾는 데 C 라이브러리의 검색 알고리즘을 사용합니다.

파이썬 응용 프로그램은 일반적으로 이러한 함수를 호출할 필요가 없으며, 대신 @ref{67,,gettext}를 사용해야 합니다. 이 규칙의 알려진 예외는 내부적으로 C 함수 @code{gettext}나 @code{dcgettext}를 호출하는 추가 C 라이브러리와 링크되는 응용 프로그램입니다. 이러한 응용 프로그램에서는, 라이브러리가 메시지 카탈로그를 올바르게 찾을 수 있도록 텍스트 도메인을 바인드해야 할 수도 있습니다.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Graphical user interfaces with Tk,개발 도구,국제화,파이썬 표준 라이브러리
@anchor{library/tk doc}@anchor{431d}@anchor{library/tk graphical-user-interfaces-with-tk}@anchor{431e}@anchor{library/tk tkinter}@anchor{431f}@anchor{library/tk translation-repo}@anchor{4320}
@section Graphical user interfaces with Tk


@geindex GUI
@geindex 그래픽 사용자 인터페이스
@geindex Tkinter
@geindex Tk

Tk/Tcl은 오랫동안 파이썬의 중요한 부분이었습니다. 견고하고 플랫폼 독립적인 윈도우 도구상자(파이썬 프로그래머는 @ref{f6,,tkinter} 패키지를 통해 사용할 수 있습니다)와 그 확장(@ref{ff,,tkinter.ttk} 모듈)을 제공합니다.

@ref{f6,,tkinter} 패키지는 Tcl/Tk 위에 올라가는 얇은 객체 지향 계층입니다. @code{tkinter}를 사용하기 위해 Tcl 코드를 작성할 필요는 없지만, Tk 문서와 때때로 Tcl 문서를 참고해야 합니다. @code{tkinter}는 Tk 위젯을 파이썬 클래스로 구현하는 래퍼 집합입니다.

@ref{f6,,tkinter}의 가장 큰 장점은 빠르고, 일반적으로 파이썬과 함께 제공된다는 것입니다. 표준 설명서가 약하긴 하지만 레퍼런스, 자습서, 서적 및 기타 자료와 같은 훌륭한 자료를 구할 수 있습니다. @code{tkinter}는 낡은 모양과 느낌으로도 유명합니다만, Tk 8.5에서 크게 개선되었습니다. 그렇지만, 여러분이 관심을 기울일 만한 다른 GUI 라이브러리가 많이 있습니다. 파이썬 위키는 몇 가지 대체 GUI 프레임워크 및 도구@footnote{https://wiki.python.org/moin/GuiProgramming}를 나열합니다.

@menu
* tkinter — Tcl/Tk 파이썬 인터페이스:: 
* tkinter.colorchooser — 색상 선택 대화 상자: tkinter colorchooser — 색상 선택 대화 상자. 
* tkinter.font — Tkinter 글꼴 래퍼: tkinter font — Tkinter 글꼴 래퍼. 
* Tkinter 대화 상자:: 
* tkinter.messagebox — Tkinter 메시지 프롬프트: tkinter messagebox — Tkinter 메시지 프롬프트. 
* tkinter.scrolledtext — 스크롤 되는 Text 위젯: tkinter scrolledtext — 스크롤 되는 Text 위젯. 
* tkinter.dnd — 드래그 앤드 드롭 지원: tkinter dnd — 드래그 앤드 드롭 지원. 
* tkinter.ttk — Tk 테마 위젯: tkinter ttk — Tk 테마 위젯. 
* IDLE — 파이썬 편집기와 셸:: 
* turtle — Turtle graphics:: 

@end menu

@node tkinter — Tcl/Tk 파이썬 인터페이스,tkinter colorchooser — 색상 선택 대화 상자,,Graphical user interfaces with Tk
@anchor{library/tkinter doc}@anchor{4321}@anchor{library/tkinter module-tkinter}@anchor{f6}@anchor{library/tkinter tkinter-python-interface-to-tcl-tk}@anchor{4322}
@subsection @code{tkinter} — Tcl/Tk 파이썬 인터페이스


@geindex module; tkinter

`소스 코드:' Lib/tkinter/__init__.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/tkinter/__init__.py}


__________________________________________________________________


The @code{tkinter} package (“Tk interface”) is the standard Python interface to
the Tcl/Tk GUI toolkit.  Both Tk and @code{tkinter} are available on most Unix
platforms, including macOS, as well as on Windows systems.

Running @code{python -m tkinter} from the command line should open a window
demonstrating a simple Tk interface, letting you know that @code{tkinter} is
properly installed on your system, and also showing what version of Tcl/Tk is
installed, so you can read the Tcl/Tk documentation specific to that version.

Tkinter supports a range of Tcl/Tk versions, built either with or
without thread support. The official Python binary release bundles Tcl/Tk 8.6
threaded. See the source code for the @ref{3,,_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.

@cartouche
@quotation 참고 
Tcl/Tk 8.5 (2007) introduced a modern set of themed user interface components
along with a new API to use them. Both old and new APIs are still available.
Most documentation you will find online still uses the old API and
can be woefully outdated.
@end quotation
@end cartouche

This is an @ref{2157,,optional module}.
If it is missing from your copy of CPython,
look for documentation from your distributor (that is,
whoever provided Python to you).
If you are the distributor, see @ref{2155,,Requirements for optional modules}.

@c Similar notes appear in the docs of the modules:
@c - zipfile
@c - tarfile


@subsubheading 더 보기



@itemize *

@item 

@table @asis

@item TkDocs@footnote{https://tkdocs.com/}

Extensive tutorial on creating user interfaces with Tkinter.  Explains key concepts,
and illustrates recommended approaches using the modern API.
@end table

@item 

@table @asis

@item Tkinter 8.5 reference: a GUI for Python@footnote{https://www.tkdocs.com/shipman/}

Reference documentation for Tkinter 8.5 detailing available classes, methods, and options.
@end table
@end itemize

Tcl/Tk Resources:


@itemize *

@item 

@table @asis

@item Tk commands@footnote{https://www.tcl.tk/man/tcl8.6/TkCmd/contents.htm}

Comprehensive reference to each of the underlying Tcl/Tk commands used by Tkinter.
@end table

@item 

@table @asis

@item Tcl/Tk 홈 페이지@footnote{https://www.tcl.tk}

Additional documentation, and links to Tcl/Tk core development.
@end table
@end itemize

Books:


@itemize *

@item 

@table @asis

@item Modern Tkinter for Busy Python Developers@footnote{https://tkdocs.com/book.html}

Mark Roseman 지음. (ISBN 978-1999149567)
@end table

@item 

@table @asis

@item Python GUI programming with Tkinter@footnote{https://www.packtpub.com/en-us/product/python-gui-programming-with-tkinter-9781788835886}

Alan D. Moore 지음. (ISBN 978-1788835886)
@end table

@item 

@table @asis

@item Programming Python@footnote{https://learning-python.com/about-pp4e.html}

Mark Lutz 지음; 탁월하게 Tkinter를 다루고 있습니다. (ISBN 978-0596158101)
@end table

@item 

@table @asis

@item Tcl and the Tk Toolkit (2nd edition)@footnote{https://www.amazon.com/exec/obidos/ASIN/032133633X}

By John Ousterhout, inventor of Tcl/Tk, and Ken Jones; does not cover Tkinter. (ISBN 978-0321336330)
@end table
@end itemize


@menu
* Architecture:: 
* Tkinter 모듈:: 
* Tkinter 구명조끼:: 
* Threading model:: 
* 간편한 레퍼런스:: 
* 파일 처리기:: 

@end menu

@node Architecture,Tkinter 모듈,,tkinter — Tcl/Tk 파이썬 인터페이스
@anchor{library/tkinter architecture}@anchor{4323}
@subsubsection Architecture


Tcl/Tk is not a single library but rather consists of a few distinct
modules, each with separate functionality and its own official
documentation. Python’s binary releases also ship an add-on module
together with it.


@table @asis

@item Tcl

Tcl is a dynamic interpreted programming language, just like Python. Though
it can be used on its own as a general-purpose programming language, it is
most commonly embedded into C applications as a scripting engine or an
interface to the Tk toolkit. The Tcl library has a C interface to
create and manage one or more instances of a Tcl interpreter, run Tcl
commands and scripts in those instances, and add custom commands
implemented in either Tcl or C. Each interpreter has an event queue,
and there are facilities to send events to it and process them.
Unlike Python, Tcl’s execution model is designed around cooperative
multitasking, and Tkinter bridges this difference
(see @ref{4324,,Threading model} for details).

@item Tk

Tk is a Tcl package@footnote{https://wiki.tcl-lang.org/37432} implemented in C
that adds custom commands to create and manipulate GUI widgets. Each
@ref{19ac,,Tk} object embeds its own Tcl interpreter instance with Tk loaded into
it. Tk’s widgets are very customizable, though at the cost of a dated appearance.
Tk uses Tcl’s event queue to generate and process GUI events.

@item Ttk

Themed Tk (Ttk) is a newer family of Tk widgets that provide a much better
appearance on different platforms than many of the classic Tk widgets.
Ttk is distributed as part of Tk, starting with Tk version 8.5. Python
bindings are provided in a separate module, @ref{ff,,tkinter.ttk}.
@end table

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 @code{tkinter} module first assembles a Tcl/Tk command string. It passes that
Tcl command string to an internal @ref{3,,_tkinter} binary module, which then
calls the Tcl interpreter to evaluate it. The Tcl interpreter will then call into the
Tk and/or Ttk packages, which will in turn make calls to Xlib, Cocoa, or GDI.

@node Tkinter 모듈,Tkinter 구명조끼,Architecture,tkinter — Tcl/Tk 파이썬 인터페이스
@anchor{library/tkinter tkinter-modules}@anchor{4325}
@subsubsection Tkinter 모듈


Support for Tkinter is spread across several modules. Most applications will need the
main @code{tkinter} module, as well as the @ref{ff,,tkinter.ttk} module, which provides
the modern themed widget set and API:

@example
from tkinter import *
from tkinter import ttk
@end example

@geindex Tk (tkinter 클래스)
@anchor{library/tkinter tkinter Tk}@anchor{19ac}
@deffn {클래스} tkinter.Tk (screenName=None, baseName=None, className='Tk', useTk=True, sync=False, use=None)

최상위 Tk 위젯을 만들고 이 위젯에 대한 Tcl 인터프리터를 초기화합니다. 이 위젯은 일반적으로 응용 프로그램의 메인 창입니다. 인스턴스마다 고유한 Tcl 인터프리터가 연결됩니다.

The @code{Tk} class is typically instantiated using all default values.
However, the following keyword arguments are currently recognized:


@table @asis

@item `screenName'

When given (as a string), sets the 
@geindex DISPLAY
@geindex 환경 변수; DISPLAY
@code{DISPLAY} environment
variable. (X11 only)

@item `baseName'

Name of the profile file.  By default, `baseName' is derived from the
program name (@code{sys.argv[0]}).

@item `className'

Name of the widget class.  Used as a profile file and also as the name
with which Tcl is invoked (`argv0' in `interp').

@item `useTk'

If @code{True}, initialize the Tk subsystem.  The @ref{4326,,tkinter.Tcl()}
function sets this to @code{False}.

@item `sync'

If @code{True}, execute all X server commands synchronously, so that errors
are reported immediately.  Can be used for debugging. (X11 only)

@item `use'

Specifies the `id' of the window in which to embed the application,
instead of it being created as an independent toplevel window. `id' must
be specified in the same way as the value for the -use option for
toplevel widgets (that is, it has a form like that returned by
@code{winfo_id()}).

Note that on some platforms this will only work correctly if `id' refers
to a Tk frame or toplevel that has its -container option enabled.
@end table

@code{Tk} reads and interprets profile files, named
@code{.`className'.tcl} and @code{.`baseName'.tcl}, into the Tcl
interpreter and calls @ref{4a3,,exec()} on the contents of
@code{.`className'.py} and @code{.`baseName'.py}.  The path for the
profile files is the 
@geindex HOME
@geindex 환경 변수; HOME
@code{HOME} environment variable or, if that
isn’t defined, then @ref{2c7e,,os.curdir}.

@geindex tk (tkinter.Tk의 속성)
@anchor{library/tkinter tkinter Tk tk}@anchor{4327}
@deffn {속성} tk

The Tk application object created by instantiating @code{Tk}.  This
provides access to the Tcl interpreter.  Each widget that is attached
the same instance of @code{Tk} has the same value for its @ref{4327,,tk}
attribute.
@end deffn

@geindex master (tkinter.Tk의 속성)
@anchor{library/tkinter tkinter Tk master}@anchor{4328}
@deffn {속성} master

The widget object that contains this widget.  For @code{Tk}, the
@code{master} is @ref{884,,None} because it is the main window.  The terms
`master' and `parent' are similar and sometimes used interchangeably
as argument names; however, calling @code{winfo_parent()} returns a
string of the widget name whereas @code{master} returns the object.
`parent'/`child' reflects the tree-like relationship while
`master' (or `container')/`content' reflects the container structure.
@end deffn

@geindex children (tkinter.Tk의 속성)
@anchor{library/tkinter tkinter Tk children}@anchor{4329}
@deffn {속성} children

The immediate descendants of this widget as a @ref{183,,dict} with the
child widget names as the keys and the child instance objects as the
values.
@end deffn
@end deffn

@geindex Tcl() (tkinter 모듈)
@anchor{library/tkinter tkinter Tcl}@anchor{4326}
@deffn {함수} tkinter.Tcl (screenName=None, baseName=None, className='Tk', useTk=False)

@ref{4326,,Tcl()} 함수는 Tk 서브 시스템을 초기화하지 않는다는 것을 제외하고는, @ref{19ac,,Tk} 클래스에 의해 만들어지는 것과 비슷한 객체를 만드는 팩토리 함수입니다. 불필요한 최상위 창을 만들고 싶지 않거나 만들 수 없는 (가령 X 서버가 없는 유닉스/리눅스 시스템) 환경에서 Tcl 인터프리터를 구동할 때 가장 유용합니다. @code{Tcl()} 객체에 의해 만들어진 객체는 @code{loadtk()} 메서드를 호출하여 만들어지는 최상위 창(과 초기화된 Tk 서브 시스템)을 가질 수 있습니다.
@end deffn

Tk 지원을 제공하는 모듈은 다음과 같습니다:


@table @asis

@item @code{tkinter}

주 Tkinter 모듈.

@item @ref{f7,,tkinter.colorchooser}

사용자가 색상을 선택할 수 있게 하는 대화 상자.

@item @ref{f8,,tkinter.commondialog}

여기에 나열된 다른 모듈에 정의된 대화 상자의 베이스 기본 클래스.

@item @ref{fa,,tkinter.filedialog}

사용자가 열거나 저장할 파일을 지정할 수 있도록 하는 일반 대화 상자입니다.

@item @ref{fb,,tkinter.font}

글꼴과 관련된 작업에 도움이 되는 유틸리티.

@item @ref{fc,,tkinter.messagebox}

표준 Tk 대화 상자에 액세스합니다.

@item @ref{fd,,tkinter.scrolledtext}

세로 스크롤 막대가 내장된 Text 위젯.

@item @ref{fe,,tkinter.simpledialog}

기본 대화 상자와 편리 함수.

@item @ref{ff,,tkinter.ttk}

Themed widget set introduced in Tk 8.5, providing modern alternatives
for many of the classic widgets in the main @code{tkinter} module.
@end table

추가 모듈:

@geindex module; _tkinter
@anchor{library/tkinter module-_tkinter}@anchor{3}

@table @asis

@item @ref{3,,_tkinter}

A binary module that contains the low-level interface to Tcl/Tk.
It is automatically imported by the main @code{tkinter} module,
and should never be used directly by application programmers.
It is usually a shared library (or DLL), but might in some cases be
statically linked with the Python interpreter.

@item @ref{77,,idlelib}

Python’s Integrated Development and Learning Environment (IDLE). Based
on @code{tkinter}.

@item @code{tkinter.constants}

Symbolic constants that can be used in place of strings when passing
various parameters to Tkinter calls. Automatically imported by the
main @code{tkinter} module.

@item @ref{f9,,tkinter.dnd}

(experimental) Drag-and-drop support for @code{tkinter}. This will
become deprecated when it is replaced with the Tk DND.

@item @ref{107,,turtle}

Tk 창에서의 터틀(turtle) 그래픽.
@end table

@node Tkinter 구명조끼,Threading model,Tkinter 모듈,tkinter — Tcl/Tk 파이썬 인터페이스
@anchor{library/tkinter tkinter-life-preserver}@anchor{432a}
@subsubsection Tkinter 구명조끼


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
* Hello World 프로그램:: 
* Important Tk Concepts:: 
* Understanding How Tkinter Wraps Tcl/Tk:: 
* How do I…? What option does…?:: 
* Navigating the Tcl/Tk Reference Manual:: 

@end menu

@node Hello World 프로그램,Important Tk Concepts,,Tkinter 구명조끼
@anchor{library/tkinter a-hello-world-program}@anchor{432b}
@subsubsection Hello World 프로그램


We’ll start by walking through a “Hello World” application in Tkinter. This
isn’t the smallest one we could write, but has enough to illustrate some
key concepts you’ll need to know.

@example
from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
@end example

After the imports, the next line creates an instance of the @code{Tk} class,
which initializes Tk and creates its associated Tcl interpreter. It also
creates a toplevel window, known as the root window, which serves as the main
window of the application.

The following line creates a frame widget, which in this case will contain
a label and a button we’ll create next. The frame is fit inside the root
window.

The next line creates a label widget holding a static text string. The
@code{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 @code{destroy()} method of the root window.

Finally, the @code{mainloop()} method puts everything on the display, and
responds to user input until the program terminates.

@node Important Tk Concepts,Understanding How Tkinter Wraps Tcl/Tk,Hello World 프로그램,Tkinter 구명조끼
@anchor{library/tkinter important-tk-concepts}@anchor{432c}
@subsubsection Important Tk Concepts


Even this simple program illustrates the following key Tk concepts:


@table @asis

@item 위젯

A Tkinter user interface is made up of individual `widgets'. Each widget is
represented as a Python object, instantiated from classes like
@code{ttk.Frame}, @code{ttk.Label}, and @code{ttk.Button}.

@item widget hierarchy

Widgets are arranged in a `hierarchy'. The label and button were contained
within a frame, which in turn was contained within the root window. When
creating each `child' widget, its `parent' widget is passed as the first
argument to the widget constructor.

@item 구성 옵션

Widgets have `configuration options', which modify their appearance and
behavior, such as the text to display in a label or button. Different
classes of widgets will have different sets of options.

@item geometry management

Widgets aren’t automatically added to the user interface when they are
created. A `geometry manager' like @code{grid} controls where in the
user interface they are placed.

@item event loop

Tkinter reacts to user input, changes from your program, and even refreshes
the display only when actively running an `event loop'. If your program
isn’t running the event loop, your user interface won’t update.
@end table

@node Understanding How Tkinter Wraps Tcl/Tk,How do I…? What option does…?,Important Tk Concepts,Tkinter 구명조끼
@anchor{library/tkinter understanding-how-tkinter-wraps-tcl-tk}@anchor{432d}
@subsubsection Understanding How Tkinter Wraps Tcl/Tk


When your application uses Tkinter’s classes and methods, internally Tkinter
is assembling strings representing Tcl/Tk commands, and executing those
commands in the Tcl interpreter attached to your application’s @code{Tk}
instance.

Whether it’s trying to navigate reference documentation, trying to find
the right method or option, adapting some existing code, or debugging your
Tkinter application, there are times that it will be useful to understand
what those underlying Tcl/Tk commands look like.

To illustrate, here is the Tcl/Tk equivalent of the main part of the Tkinter
script above.

@example
ttk::frame .frm -padding 10
grid .frm
grid [ttk::label .frm.lbl -text "Hello World!"] -column 0 -row 0
grid [ttk::button .frm.btn -text "Quit" -command "destroy ."] -column 1 -row 0
@end example

Tcl’s syntax is similar to many shell languages, where the first word is the
command to be executed, with arguments to that command following it, separated
by spaces. Without getting into too many details, notice the following:


@itemize *

@item 
The commands used to create widgets (like @code{ttk::frame}) correspond to
widget classes in Tkinter.

@item 
Tcl widget options (like @code{-text}) correspond to keyword arguments in
Tkinter.

@item 
Widgets are referred to by a `pathname' in Tcl (like @code{.frm.btn}),
whereas Tkinter doesn’t use names but object references.

@item 
A widget’s place in the widget hierarchy is encoded in its (hierarchical)
pathname, which uses a @code{.} (dot) as a path separator. The pathname for
the root window is just @code{.} (dot). In Tkinter, the hierarchy is defined
not by pathname but by specifying the parent widget when creating each
child widget.

@item 
Operations which are implemented as separate `commands' in Tcl (like
@code{grid} or @code{destroy}) are represented as `methods' on Tkinter widget
objects. As you’ll see shortly, at other times Tcl uses what appear to be
method calls on widget objects, which more closely mirror what is
used in Tkinter.
@end itemize

@node How do I…? What option does…?,Navigating the Tcl/Tk Reference Manual,Understanding How Tkinter Wraps Tcl/Tk,Tkinter 구명조끼
@anchor{library/tkinter how-do-i-what-option-does}@anchor{432e}
@subsubsection How do I…? What option does…?


If you’re not sure how to do something in Tkinter, and you can’t immediately
find it in the tutorial or reference documentation you’re using, there are a
few strategies that can be helpful.

First, remember that the details of how individual widgets work may vary
across different versions of both Tkinter and Tcl/Tk. If you’re searching
documentation, make sure it corresponds to the Python and Tcl/Tk versions
installed on your system.

When searching for how to use an API, it helps to know the exact name of the
class, option, or method that you’re using. Introspection, either in an
interactive Python shell or with @ref{1174,,print()}, can help you identify what
you need.

To find out what configuration options are available on any widget, call its
@code{configure()} method, which returns a dictionary containing a variety of
information about each object, including its default and current values. Use
@code{keys()} to get just the names of each option.

@example
btn = ttk.Button(frm, ...)
print(btn.configure().keys())
@end example

As most widgets have many configuration options in common, it can be useful
to find out which are specific to a particular widget class. Comparing the
list of options to that of a simpler widget, like a frame, is one way to
do that.

@example
print(set(btn.configure().keys()) - set(frm.configure().keys()))
@end example

Similarly, you can find the available methods for a widget object using the
standard @ref{843,,dir()} function. If you try it, you’ll see there are over 200
common widget methods, so again identifying those specific to a widget class
is helpful.

@example
print(dir(btn))
print(set(dir(btn)) - set(dir(frm)))
@end example

@node Navigating the Tcl/Tk Reference Manual,,How do I…? What option does…?,Tkinter 구명조끼
@anchor{library/tkinter navigating-the-tcl-tk-reference-manual}@anchor{432f}
@subsubsection Navigating the Tcl/Tk Reference Manual


As noted, the official Tk commands@footnote{https://www.tcl.tk/man/tcl8.6/TkCmd/contents.htm}
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.

@example
destroy .
grid .frm.btn -column 0 -row 0
@end example

Others, however, look more like methods called on a widget object (in fact,
when you create a widget in Tcl/Tk, it creates a Tcl command with the name
of the widget pathname, with the first parameter to that command being the
name of a method to call).

@example
.frm.btn invoke
.frm.lbl configure -text "Goodbye"
@end example

In the official Tcl/Tk reference documentation, you’ll find most operations
that look like method calls on the man page for a specific widget (e.g.,
you’ll find the @code{invoke()} method on the
ttk::button@footnote{https://www.tcl.tk/man/tcl8.6/TkCmd/ttk_button.htm}
man page), while functions that take a widget as a parameter often have
their own man page (e.g.,
grid@footnote{https://www.tcl.tk/man/tcl8.6/TkCmd/grid.htm}).

You’ll find many common options and methods in the
options@footnote{https://www.tcl.tk/man/tcl8.6/TkCmd/options.htm} or
ttk::widget@footnote{https://www.tcl.tk/man/tcl8.6/TkCmd/ttk_widget.htm} 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.,
@code{winfo_x()}, @code{winfo_height()}, @code{winfo_viewable()}. You’d find
documentation for all of these in the
winfo@footnote{https://www.tcl.tk/man/tcl8.6/TkCmd/winfo.htm} man page.

@cartouche
@quotation 참고 
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 @code{Widget} class that all Tkinter widgets
inherit from).
@end quotation
@end cartouche

@node Threading model,간편한 레퍼런스,Tkinter 구명조끼,tkinter — Tcl/Tk 파이썬 인터페이스
@anchor{library/tkinter threading-model}@anchor{4324}
@subsubsection Threading model


Python and Tcl/Tk have very different threading models, which @code{tkinter}
tries to bridge. If you use threads, you may need to be aware of this.

A Python interpreter may have many threads associated with it. In Tcl, multiple
threads can be created, but each thread has a separate Tcl interpreter instance
associated with it. Threads can also create more than one interpreter instance,
though each interpreter instance can be used only by the one thread that created it.

Each @code{Tk} object created by @code{tkinter} contains a Tcl interpreter.
It also keeps track of which thread created that interpreter. Calls to
@code{tkinter} can be made from any Python thread. Internally, if a call comes
from a thread other than the one that created the @code{Tk} object, an event
is posted to the interpreter’s event queue, and when executed, the result is
returned to the calling Python thread.

Tcl/Tk applications are normally event-driven, meaning that after initialization,
the interpreter runs an event loop (i.e. @code{Tk.mainloop()}) and responds to events.
Because it is single-threaded, event handlers must respond quickly, otherwise they
will block other events from being processed. To avoid this, any long-running
computations should not run in an event handler, but are either broken into smaller
pieces using timers, or run in another thread. This is different from many GUI
toolkits where the GUI runs in a completely separate thread from all application
code including event handlers.

If the Tcl interpreter is not running the event loop and processing events, any
@code{tkinter} calls made from threads other than the one running the Tcl
interpreter will fail.

A number of special cases exist:


@itemize *

@item 
Tcl/Tk libraries can be built so they are not thread-aware. In this case,
@code{tkinter} calls the library from the originating Python thread, even
if this is different than the thread that created the Tcl interpreter. A global
lock ensures only one call occurs at a time.

@item 
While @code{tkinter} allows you to create more than one instance of a @code{Tk}
object (with its own interpreter), all interpreters that are part of the same
thread share a common event queue, which gets ugly fast. In practice, don’t create
more than one instance of @code{Tk} at a time. Otherwise, it’s best to create
them in separate threads and ensure you’re running a thread-aware Tcl/Tk build.

@item 
Blocking event handlers are not the only way to prevent the Tcl interpreter from
reentering the event loop. It is even possible to run multiple nested event loops
or abandon the event loop entirely. If you’re doing anything tricky when it comes
to events or threads, be aware of these possibilities.

@item 
There are a few select @code{tkinter} functions that presently work only when
called from the thread that created the Tcl interpreter.
@end itemize

@node 간편한 레퍼런스,파일 처리기,Threading model,tkinter — Tcl/Tk 파이썬 인터페이스
@anchor{library/tkinter handy-reference}@anchor{4330}
@subsubsection 간편한 레퍼런스


@menu
* 옵션 설정:: 
* 패커:: 
* 패커 옵션:: 
* 위젯 변수 결합하기:: 
* 창 관리자:: 
* Tk 옵션 데이터형:: 
* 바인딩과 이벤트:: 
* index 매개 변수:: 
* 이미지:: 

@end menu

@node 옵션 설정,패커,,간편한 레퍼런스
@anchor{library/tkinter setting-options}@anchor{4331}@anchor{library/tkinter tkinter-setting-options}@anchor{4332}
@subsubsection 옵션 설정


옵션은 위젯의 색상과 테두리 너비와 같은 것을 제어합니다. 옵션은 세 가지 방법으로 설정할 수 있습니다:


@table @asis

@item 객체 생성 시, 키워드 인자 사용하기

@example
fred = Button(self, fg="red", bg="blue")
@end example

@item 객체 생성 후, 딕셔너리 인덱스처럼 옵션 이름을 다루기

@example
fred["fg"] = "red"
fred["bg"] = "blue"
@end example

@item config() 메서드를 사용하여 객체 생성 이후 여러 어트리뷰트를 갱신하기.

@example
fred.config(fg="red", bg="blue")
@end example
@end table

주어진 옵션과 그 동작에 대한 완전한 설명은, 해당 위젯의 Tk 매뉴얼 페이지를 참조하십시오.

매뉴얼 페이지는 각 위젯에 대해 “표준 옵션(STANDARD OPTIONS)”과 “위젯 특정 옵션(WIDGET SPECIFIC OPTIONS)”을 나열합니다. 전자는 많은 위젯에 공통적인 옵션 목록이며, 후자는 그 위젯에만 적용되는 옵션입니다. 표준 옵션은 @code{options(3)@footnote{https://manpages.debian.org/options(3)}} 매뉴얼 페이지에 설명되어 있습니다.

이 문서에서는 표준과 위젯 특정 옵션을 구분하지 않습니다. 일부 옵션은 일부 위젯에 적용되지 않습니다. 특정 위젯이 특정 옵션에 응답하는지는 위젯의 클래스에 따라 다릅니다; 버튼에는 @code{command} 옵션이 있는데, 레이블은 그렇지 않습니다.

주어진 위젯이 지원하는 옵션은 위젯의 매뉴얼 페이지에 나열되거나, 실행 시간에 인자 없이 @code{config()} 메서드를 호출하거나 해당 위젯에서 @code{keys()} 메서드를 호출하여 조회할 수 있습니다. 이러한 호출의 반환 값은 키가 옵션의 이름인 문자열(예를 들어, @code{'relief'})이고 값이 5-튜플인 딕셔너리입니다.

@code{bg}와 같은 일부 옵션은 긴 이름을 가진 공통 옵션의 동의어입니다 (@code{bg}는 “background”의 줄임말입니다). @code{config()} 메서드에 줄인 옵션을 전달하면 5-튜플이 아닌 2-튜플을 반환합니다. 전달된 2-튜플에는 동의어의 이름과 “실제” 옵션이 담겨있습니다 (가령 @code{('bg', 'background')}).


@multitable {xxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxx} 
@headitem

인덱스

@tab

의미

@tab

예

@item

0

@tab

옵션 이름

@tab

@code{'relief'}

@item

1

@tab

데이터베이스 조회를 위한 옵션 이름

@tab

@code{'relief'}

@item

2

@tab

데이터베이스 조회를 위한 옵션 클래스

@tab

@code{'Relief'}

@item

3

@tab

기본값

@tab

@code{'raised'}

@item

4

@tab

현재 값

@tab

@code{'groove'}

@end multitable


예:

@example
>>> print(fred.config())
@{'relief': ('relief', 'relief', 'Relief', 'raised', 'groove')@}
@end example

물론, 인쇄된 딕셔너리에는 사용 가능한 모든 옵션과 해당 값이 포함됩니다. 이것은 예시일뿐입니다.

@node 패커,패커 옵션,옵션 설정,간편한 레퍼런스
@anchor{library/tkinter the-packer}@anchor{4333}
@subsubsection 패커


@geindex 패킹 (위젯)

The packer is one of Tk’s geometry-management mechanisms.    Geometry managers
are used to specify the relative positioning of widgets within their container.
In contrast to the more cumbersome `placer' (which is
used less commonly, and we do not cover here), the packer takes qualitative
relationship specification - `above', `to the left of', `filling', etc - and
works everything out to determine the exact placement coordinates for you.

The size of any container widget is determined by the size of the “content widgets”
inside.  The packer is used to control where content widgets appear inside the
container into which they are packed.  You can pack widgets into frames, and frames
into other frames, in order to achieve the kind of layout you desire.
Additionally, the arrangement is dynamically adjusted to accommodate incremental
changes to the configuration, once it is packed.

위젯은 지오메트리 관리자로 지오메트리를 지정할 때까지 표시되지 않습니다. 지오메트리 명세를 빠뜨리는 것은 초기에 흔한 실수이고, 위젯을 만들었지만, 아무것도 나타나지 않을 때 놀라게 됩니다. 위젯은 예를 들어 패커의 @code{pack()} 메서드가 적용된 후에만 나타납니다.

pack() 메서드는 컨테이너 내에서 위젯이 표시되는 위치와 메인 응용 프로그램 윈도우의 크기가 조정될 때 어떻게 동작할지를 제어하는 키워드 옵션/값 쌍으로 호출할 수 있습니다. 여기 몇 가지 예가 있습니다:

@example
fred.pack()                     # 기본값은 side = "top"
fred.pack(side="left")
fred.pack(expand=1)
@end example

@node 패커 옵션,위젯 변수 결합하기,패커,간편한 레퍼런스
@anchor{library/tkinter packer-options}@anchor{4334}
@subsubsection 패커 옵션


패커와 그것이 받을 수 있는 옵션에 대한 더 자세한 정보는 매뉴얼 페이지와 John Ousterhout의 책의 183쪽을 참조하십시오.


@table @asis

@item anchor

Anchor type.  Denotes where the packer is to place each content in its parcel.

@item expand

불리언(boolean), @code{0} 또는 @code{1}.

@item fill

유효한 값: @code{'x'}, @code{'y'}, @code{'both'}, @code{'none'}.

@item ipadx와 ipady

A distance - designating internal padding on each side of the content.

@item padx와 pady

A distance - designating external padding on each side of the content.

@item side

유효한 값: @code{'left'}, @code{'right'}, @code{'top'}, @code{'bottom'}.
@end table

@node 위젯 변수 결합하기,창 관리자,패커 옵션,간편한 레퍼런스
@anchor{library/tkinter coupling-widget-variables}@anchor{4335}
@subsubsection 위젯 변수 결합하기


(텍스트 입력 위젯과 같은) 일부 위젯의 현재 값 설정은 특수 옵션을 사용하여 응용 프로그램 변수에 직접 연결할 수 있습니다. 이 옵션은 @code{variable}, @code{textvariable}, @code{onvalue}, @code{offvalue} 및 @code{value}입니다. 이 연결은 양방향으로 작동합니다: 어떤 이유로 든 변수가 변경되면, 연결된 위젯은 새 값을 반영하도록 갱신됩니다.

Unfortunately, in the current implementation of @code{tkinter} it is not
possible to hand over an arbitrary Python variable to a widget through a
@code{variable} or @code{textvariable} option.  The only kinds of variables for which
this works are variables that are subclassed from a class called Variable,
defined in @code{tkinter}.

이미 정의된 Variable의 유용한 서브 클래스가 많이 있습니다: @code{StringVar}, @code{IntVar}, @code{DoubleVar} 및 @code{BooleanVar}. 이러한 변수의 현재 값을 읽으려면 @code{get()} 메서드를 호출하고, 값을 바꾸려면 @code{set()} 메서드를 호출합니다. 이 프로토콜을 따르면, 여러분이 더는 개입하지 않더라도 위젯은 변수의 값을 항상 추적합니다.

예를 들면:

@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()

        # 여기에 응용 프로그램 변수를 만듭니다.
        self.contents = tk.StringVar()
        # 어떤 값으로 설정합니다
        self.contents.set("this is a variable")
        # Entry 위젯에 이 변수를 감시하도록 지시합니다.
        self.entrythingy["textvariable"] = self.contents

        # 사용자가 return 키를 눌렀을 때를 위한 콜백을 정의합니다.
        # 변수의 현재값을 인쇄합니다.
        self.entrythingy.bind('<Key-Return>',
                             self.print_contents)

    def print_contents(self, event):
        print("Hi. The current entry content is:",
              self.contents.get())

root = tk.Tk()
myapp = App(root)
myapp.mainloop()
@end example

@node 창 관리자,Tk 옵션 데이터형,위젯 변수 결합하기,간편한 레퍼런스
@anchor{library/tkinter the-window-manager}@anchor{4336}
@subsubsection 창 관리자


@geindex 창 관리자 (위젯)

In Tk, there is a utility command, @code{wm}, for interacting with the window
manager.  Options to the @code{wm} command allow you to control things like titles,
placement, icon bitmaps, and the like.  In @code{tkinter}, these commands have
been implemented as methods on the @code{Wm} class.  Toplevel widgets are
subclassed from the @code{Wm} class, and so can call the @code{Wm} methods
directly.

To get at the toplevel window that contains a given widget, you can often just
refer to the widget’s @code{master}.  Of course if the widget has been packed inside of
a frame, the @code{master} won’t represent a toplevel window.  To get at the toplevel
window that contains an arbitrary widget, you can call the @code{_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.

다음은 일반적인 사용 예입니다:

@example
import tkinter as tk

class App(tk.Frame):
    def __init__(self, master=None):
        super().__init__(master)
        self.pack()

# 응용 프로그램을 만듭니다
myapp = App()

#
# 이것들은 창 관리자 클래스에 대한 메서드 호출입니다
#
myapp.master.title("My Do-Nothing Application")
myapp.master.maxsize(1000, 400)

# 프로그램을 시작합니다
myapp.mainloop()
@end example

@node Tk 옵션 데이터형,바인딩과 이벤트,창 관리자,간편한 레퍼런스
@anchor{library/tkinter tk-option-data-types}@anchor{4337}
@subsubsection Tk 옵션 데이터형


@geindex Tk 옵션 데이터형


@table @asis

@item anchor

유효한 값은 나침반의 눈금입니다: @code{"n"}, @code{"ne"}, @code{"e"}, @code{"se"}, @code{"s"}, @code{"sw"}, @code{"w"}, @code{"nw"}, 그리고 @code{"center"}.

@item bitmap

8개의 내장된, 이름있는 비트맵이 있습니다: @code{'error'}, @code{'gray25'}, @code{'gray50'}, @code{'hourglass'}, @code{'info'}, @code{'questhead'}, @code{'question'}, @code{'warning'}. X 비트맵 파일명을 지정하려면 @code{"@@/usr/contrib/bitmap/gumby.bit"}처럼 @code{@@}를 앞에 붙인 파일의 전체 경로를 지정하십시오.

@item boolean

정수 0이나 1 또는 문자열 @code{"yes"}나 @code{"no"}를 전달할 수 있습니다.

@item callback

인자를 취하지 않는 파이썬 함수입니다. 예를 들면:

@example
def print_it():
    print("hi there")
fred["command"] = print_it
@end example

@item color

색상은 rgb.txt 파일에 있는 X 색상의 이름이나, RGB 값을 4비트: @code{"#RGB"}, 8비트: @code{"#RRGGBB"}, 12비트: @code{"#RRRGGGBBB"}, 또는 16비트: @code{"#RRRRGGGGBBBB"} 범위로 표현하는 문자열로 제공됩니다. 여기서 R, G, B는 유효한 임의의 16진수를 나타냅니다. 자세한 내용은 Ousterhout의 책 160쪽을 참조하십시오.

@item cursor

@code{XC_} 접두사 없이 @code{cursorfont.h}의 표준 X 커서 이름을 사용할 수 있습니다. 예를 들어, 손 모양 커서(@code{XC_hand2})를 얻으려면, @code{"hand2"} 문자열을 사용하십시오. 여러분 자신의 비트맵과 마스크 파일을 지정할 수도 있습니다. Ousterhout의 책 179쪽을 보십시오.

@item distance

화면 거리는 픽셀이나 절대 거리로 지정할 수 있습니다. 픽셀은 숫자로 절대 거리는 문자열로 지정되며, 끝에 붙는 문자는 단위를 나타냅니다: @code{c}는 센티미터, @code{i}는 인치, @code{m}은 밀리미터, @code{p}는 프린터의 포인트입니다. 예를 들어, 3.5 인치는 @code{"3.5i"}로 표현됩니다.

@item font

Tk는 @code{@{courier 10 bold@}}와 같은, 목록 글꼴 이름 형식을 사용합니다. 양수로 표현된 글꼴 크기는 포인트로 측정됩니다; 음수로 표현된 크기는 픽셀 단위로 측정됩니다.

@item geometry

이것은 @code{너비x높이} 형식의 문자열로, 대부분의 위젯에서 너비와 높이는 픽셀 단위로 측정됩니다 (텍스트를 표시하는 위젯에서는 문자 단위). 예를 들어: @code{fred["geometry"] = "200x100"}.

@item justify

Legal values are the strings: @code{"left"}, @code{"center"}, and @code{"right"}.

@item region

이것은 스페이스로 구분된 네 개의 요소가 있는 문자열이며, 각 요소는 유효한 거리(위를 참조하세요)입니다. 예를 들어: @code{"2 3 4 5"}와 @code{"3i 2i 4.5i 2i"}와 @code{"3c 2c 4c 10.43c"}는 모두 유효한 영역(region)입니다.

@item relief

위젯의 테두리 스타일을 결정합니다. 유효한 값은 다음과 같습니다: @code{"raised"}, @code{"sunken"}, @code{"flat"}, @code{"groove"} 및 @code{"ridge"}.

@item scrollcommand

이것은 거의 항상 어떤 스크롤 막대 위젯의 @code{set()} 메서드이지만, 단일 인자를 취하는 어떤 위젯 메서드도 가능합니다.

@item wrap

@code{"none"}, @code{"char"} 또는 @code{"word"} 중 하나여야 합니다.
@end table

@node 바인딩과 이벤트,index 매개 변수,Tk 옵션 데이터형,간편한 레퍼런스
@anchor{library/tkinter bindings-and-events}@anchor{4338}@anchor{library/tkinter id2}@anchor{4339}
@subsubsection 바인딩과 이벤트


@geindex bind (위젯)
@geindex 이벤트 (위젯)

위젯 명령의 bind 메서드를 사용하면 특정 이벤트를 감시하고 해당 이벤트 유형이 발생할 때 콜백 함수가 트리거 되도록 할 수 있습니다. bind 메서드의 형식은 다음과 같습니다:

@example
def bind(self, sequence, func, add='@w{'}):
@end example

여기에서:


@table @asis

@item sequence

는 대상 이벤트의 종류를 나타내는 문자열입니다. (자세한 내용은 @code{bind(3tk)@footnote{https://manpages.debian.org/bind(3tk)}} 매뉴얼 페이지와 John Ousterhout의 책 @cite{Tcl and the Tk Toolkit (2nd edition)}의 201쪽을 참조하십시오).

@item func

는 하나의 인자를 취하는 파이썬 함수로, 이벤트가 발생할 때 호출됩니다. 이벤트 인스턴스가 인자로 전달됩니다. (이런 식으로 설치되는 함수를 흔히 `콜백(callbacks)'이라고 합니다.)

@item add

는 선택적이고, @code{'@w{'}}나 @code{'+'}입니다. 빈 문자열을 전달하면 이 바인딩이 이 이벤트와 연관된 다른 바인딩을 대체 함을 나타냅니다. @code{'+'}를 전달하면 이 함수가 이 이벤트 유형에 바인딩 된 함수 목록에 추가됩니다.
@end table

예를 들면:

@example
def turn_red(self, event):
    event.widget["activeforeground"] = "red"

self.button.bind("<Enter>", self.turn_red)
@end example

이벤트의 widget 필드가 @code{turn_red()} 콜백에서 어떻게 액세스 되는지 주목하십시오. 이 필드는 X 이벤트를 포착한 위젯을 포함합니다. 다음 표에는 사용자가 액세스할 수 있는 다른 이벤트 필드와 Tk에서 이들을 표시하는 방법이 나열되어 있습니다. Tk 매뉴얼 페이지를 참조할 때 유용할 수 있습니다.


@multitable {xxxxxx} {xxxxxxxxxxxxxxxxxxxxxxx} {xxxxxx} {xxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Tk

@tab

Tkinter 이벤트 필드

@tab

Tk

@tab

Tkinter 이벤트 필드

@item

%f

@tab

focus

@tab

%A

@tab

char

@item

%h

@tab

height

@tab

%E

@tab

send_event

@item

%k

@tab

keycode

@tab

%K

@tab

keysym

@item

%s

@tab

state

@tab

%N

@tab

keysym_num

@item

%t

@tab

time

@tab

%T

@tab

type

@item

%w

@tab

width

@tab

%W

@tab

widget

@item

%x

@tab

x

@tab

%X

@tab

x_root

@item

%y

@tab

y

@tab

%Y

@tab

y_root

@end multitable


@node index 매개 변수,이미지,바인딩과 이벤트,간편한 레퍼런스
@anchor{library/tkinter the-index-parameter}@anchor{433a}
@subsubsection index 매개 변수


많은 위젯에는 “index” 매개 변수가 전달되어야 합니다. 이들은 Text 위젯의 특정 위치, Entry 위젯의 특정 문자 또는 Menu 위젯의 특정 메뉴 항목을 가리키는 데 사용됩니다.


@table @asis

@item Entry 위젯 인덱스 (인덱스, 뷰 인덱스 등)

Entry widgets have options that refer to character positions in the text being
displayed.  You can use these @code{tkinter} functions to access these special
points in text widgets:

@item Text 위젯 인덱스

Text 위젯의 인덱스 표기법은 매우 풍부하며 Tk 매뉴얼 페이지에 자세히 설명되어 있습니다.

@item 메뉴 인덱스 (menu.invoke(), menu.entryconfig() 등)

메뉴에 대한 일부 옵션 및 메서드는 특정 메뉴 항목을 조작합니다. 옵션이나 매개 변수에 메뉴 인덱스가 필요한 때는 언제든지 다음과 같이 전달할 수 있습니다:


@itemize *

@item 
위에서부터 세고, 0에서 시작하는, 위젯에서 항목의 숫자 위치를 나타내는 정수.

@item 
현재 커서 아래에 있는 메뉴 위치를 나타내는, 문자열 @code{"active"}.

@item 
마지막 메뉴 항목을 나타내는, 문자열 @code{"last"}.

@item 
@code{@@6}과 같이, @code{@@}이 앞에 오는 정수로, 정수는 메뉴의 좌표계에서 y 픽셀 좌표로 해석됩니다.

@item 
아무런 메뉴 항목을 가리키지 않는, 문자열 @code{"none"}은 menu.activate()와 함께 사용되어 모든 항목을 비활성화합니다, 마지막으로,

@item 
메뉴 맨 위에서 아래로 스캔할 때, 메뉴 항목의 레이블과 패턴 일치하는 텍스트 문자열. 이 인덱스 유형은 다른 모든 항목 다음에 고려되므로, @code{last}, @code{active} 또는 @code{none} 레이블이 붙은 메뉴 항목과의 일치가 대신 위의 리터럴로 해석될 수 있음을 의미합니다.
@end itemize
@end table

@node 이미지,,index 매개 변수,간편한 레퍼런스
@anchor{library/tkinter images}@anchor{433b}
@subsubsection 이미지


서로 다른 형식의 이미지를 @code{tkinter.Image}의 해당 서브 클래스를 통해 만들 수 있습니다:


@itemize *

@item 
XBM 형식의 이미지를 위한 @code{BitmapImage}.

@item 
PGM, PPM, GIF 및 PNG 형식의 이미지를 위한 @code{PhotoImage}. 후자는 Tk 8.6부터 지원됩니다.
@end itemize

두 가지 유형의 이미지는 @code{file} 또는 @code{data} 옵션을 통해 만들어집니다 (다른 옵션도 사용할 수 있습니다).


버전 3.13에서 변경: Added the @code{PhotoImage} method @code{copy_replace()} to copy a region
from one image to other image, possibly with pixel zooming and/or
subsampling.
Add `from_coords' parameter to @code{PhotoImage} methods @code{copy()},
@code{zoom()} and @code{subsample()}.
Add `zoom' and `subsample' parameters to @code{PhotoImage} method
@code{copy()}.


그런 다음 @code{image} 옵션이 일부 위젯(예를 들어, 레이블, 버튼, 메뉴)에서 지원되는 곳이면 어디든 이미지 객체를 사용할 수 있습니다. 이 경우, Tk는 이미지에 대한 참조를 유지하지 않습니다. 이미지 객체에 대한 마지막 파이썬 참조가 삭제되면 이미지 데이터도 삭제되고, Tk는 이미지가 사용된 곳마다 빈 상자를 표시합니다.


@subsubheading 더 보기


Pillow@footnote{https://python-pillow.org/} 패키지는 BMP, JPEG, TIFF 및 WebP와 같은 형식을 위한 지원을 추가합니다.


@node 파일 처리기,,간편한 레퍼런스,tkinter — Tcl/Tk 파이썬 인터페이스
@anchor{library/tkinter file-handlers}@anchor{433c}@anchor{library/tkinter tkinter-file-handlers}@anchor{433d}
@subsubsection 파일 처리기


Tk는 파일 기술자에서 I/O가 가능할 때 Tk 메인 루프에서 호출할 콜백 함수를 등록하고 등록 취소할 수 있도록 합니다. 파일 기술자당 하나의 처리기 만 등록 될 수 있습니다. 예제 코드:

@example
import tkinter
widget = tkinter.Tk()
mask = tkinter.READABLE | tkinter.WRITABLE
widget.tk.createfilehandler(file, mask, callback)
...
widget.tk.deletefilehandler(file)
@end example

윈도우에서는 이 기능을 사용할 수 없습니다.

얼마나 많은 바이트를 읽을 수 있는지 모르므로, @ref{8a2,,BufferedIOBase}나 @ref{8a3,,TextIOBase} @ref{152d,,read()}나 @ref{152e,,readline()} 메서드를 사용하고 싶지 않을것입니다, 이것들은 미리 정의 된 바이트 수를 읽으려고하기 때문입니다. 소켓의 경우, @ref{fa3,,recv()} 또는 @ref{fa4,,recvfrom()} 메서드가 제대로 작동합니다; 다른 파일의 경우, 날(raw) 읽기나 @code{os.read(file.fileno(), maxbytecount)}를 사용하십시오.

@geindex createfilehandler() (_tkinter.Widget.tk 메서드)
@anchor{library/tkinter tkinter Widget tk createfilehandler}@anchor{433e}
@deffn {메서드} Widget.tk.createfilehandler (file, mask, func)

파일 처리기 콜백 함수 `func'를 등록합니다. `file' 인자는 @ref{17b4,,fileno()} 메서드가 있는 객체이거나(가령 파일이나 소켓 객체), 정수 파일 기술자일 수 있습니다. `mask' 인자는 아래의 세 가지 상수들을 OR로 조합한 것입니다. 콜백은 다음과 같이 호출됩니다:

@example
callback(file, mask)
@end example
@end deffn

@geindex deletefilehandler() (_tkinter.Widget.tk 메서드)
@anchor{library/tkinter tkinter Widget tk deletefilehandler}@anchor{433f}
@deffn {메서드} Widget.tk.deletefilehandler (file)

파일 처리기를 등록 취소합니다.
@end deffn

@geindex READABLE (_tkinter 모듈)
@geindex WRITABLE (_tkinter 모듈)
@geindex EXCEPTION (_tkinter 모듈)
@anchor{library/tkinter tkinter READABLE}@anchor{4340}
@deffn {데이터} _tkinter.READABLE
@anchor{library/tkinter tkinter WRITABLE}@anchor{4341}
@deffnx {데이터} _tkinter.WRITABLE
@anchor{library/tkinter tkinter EXCEPTION}@anchor{4342}
@deffnx {데이터} _tkinter.EXCEPTION

`mask' 인자에 사용되는 상수입니다.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node tkinter colorchooser — 색상 선택 대화 상자,tkinter font — Tkinter 글꼴 래퍼,tkinter — Tcl/Tk 파이썬 인터페이스,Graphical user interfaces with Tk
@anchor{library/tkinter colorchooser doc}@anchor{4343}@anchor{library/tkinter colorchooser module-tkinter colorchooser}@anchor{f7}@anchor{library/tkinter colorchooser tkinter-colorchooser-color-choosing-dialog}@anchor{4344}@anchor{library/tkinter colorchooser translation-repo}@anchor{4345}
@subsection @code{tkinter.colorchooser} — 색상 선택 대화 상자


@geindex module; tkinter.colorchooser

`소스 코드:' Lib/tkinter/colorchooser.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/tkinter/colorchooser.py}


__________________________________________________________________


The @code{tkinter.colorchooser} module provides the @ref{4346,,Chooser} class
as an interface to the native color picker dialog. @code{Chooser} implements
a modal color choosing dialog window. The @code{Chooser} class inherits from
the @ref{4347,,Dialog} class.

@geindex Chooser (tkinter.colorchooser 클래스)
@anchor{library/tkinter colorchooser tkinter colorchooser Chooser}@anchor{4346}
@deffn {클래스} tkinter.colorchooser.Chooser (master=None, **options)
@end deffn

@geindex askcolor() (tkinter.colorchooser 모듈)
@anchor{library/tkinter colorchooser tkinter colorchooser askcolor}@anchor{4348}
@deffn {함수} tkinter.colorchooser.askcolor (color=None, **options)

색상 선택 대화 상자를 만듭니다. 이 메서드를 호출하면 창이 표시되고, 사용자가 선택하기를 기다렸다가, 선택한 색상(또는 @code{None})을 호출자에게 반환합니다.
@end deffn


@subsubheading 더 보기



@table @asis

@item 모듈 @ref{f8,,tkinter.commondialog}

Tkinter 표준 대화 상자 모듈
@end table


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node tkinter font — Tkinter 글꼴 래퍼,Tkinter 대화 상자,tkinter colorchooser — 색상 선택 대화 상자,Graphical user interfaces with Tk
@anchor{library/tkinter font doc}@anchor{4349}@anchor{library/tkinter font module-tkinter font}@anchor{fb}@anchor{library/tkinter font tkinter-font-tkinter-font-wrapper}@anchor{434a}@anchor{library/tkinter font translation-repo}@anchor{434b}
@subsection @code{tkinter.font} — Tkinter 글꼴 래퍼


@geindex module; tkinter.font

`소스 코드:' Lib/tkinter/font.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/tkinter/font.py}


__________________________________________________________________


The @code{tkinter.font} module provides the @ref{1ccb,,Font} class for creating
and using named fonts.

구별되는 글꼴 무게와 기울기는 다음과 같습니다:

@geindex NORMAL (tkinter.font 모듈)
@geindex BOLD (tkinter.font 모듈)
@geindex ITALIC (tkinter.font 모듈)
@geindex ROMAN (tkinter.font 모듈)
@anchor{library/tkinter font tkinter font NORMAL}@anchor{434c}
@deffn {데이터} tkinter.font.NORMAL
@anchor{library/tkinter font tkinter font BOLD}@anchor{434d}
@deffnx {데이터} tkinter.font.BOLD
@anchor{library/tkinter font tkinter font ITALIC}@anchor{434e}
@deffnx {데이터} tkinter.font.ITALIC
@anchor{library/tkinter font tkinter font ROMAN}@anchor{434f}
@deffnx {데이터} tkinter.font.ROMAN
@end deffn

@geindex Font (tkinter.font 클래스)
@anchor{library/tkinter font tkinter font Font}@anchor{1ccb}
@deffn {클래스} tkinter.font.Font (root=None, font=None, name=None, exists=False, **options)

@ref{1ccb,,Font} 클래스는 명명된 글꼴을 나타냅니다. `Font' 인스턴스에는 고유한 이름이 지정되며 패밀리, 크기 및 스타일 구성으로 지정할 수 있습니다. 명명된 글꼴은 나타날 때마다 어트리뷰트로 글꼴을 지정하지 않고, 글꼴을 단일 객체로 만들고 식별하는 Tk의 방법입니다.

@quotation

인자:

@quotation


@display
`font' - 글꼴 지정자 튜플 (패밀리, 크기, 옵션)@w{ }
`name' - 고유한 글꼴 이름@w{ }
`exists' - 참이면 self가 기존의 명명된 글꼴을 가리킵니다@w{ }
@end display


@end quotation

추가 키워드 옵션 (`font'가 지정되면 무시됩니다):

@quotation


@display
`family' - 글꼴 패밀리, 즉 Courier, Times@w{ }
`size' - 글꼴 크기@w{ }
@display
`size'가 양수이면 포인트 단위의 크기로 해석됩니다.@w{ }
`size'가 음수이면 절댓값을@w{ }
픽셀 단위의 크기로 처리합니다.@w{ }
@end display
`weight' - 글꼴 강조 (NORMAL, BOLD)@w{ }
`slant' - ROMAN, ITALIC@w{ }
`underline' - 글꼴 밑줄 (0 - 없음, 1 - 밑줄)@w{ }
`overstrike' - 글꼴 취소선 (0 - 없음, 1 - 취소선)@w{ }
@end display


@end quotation
@end quotation

@geindex actual() (tkinter.font.Font 메서드)
@anchor{library/tkinter font tkinter font Font actual}@anchor{4350}
@deffn {메서드} actual (option=None, displayof=None)

글꼴의 어트리뷰트를 반환합니다.
@end deffn

@geindex cget() (tkinter.font.Font 메서드)
@anchor{library/tkinter font tkinter font Font cget}@anchor{4351}
@deffn {메서드} cget (option)

글꼴의 어트리뷰트를 가져옵니다.
@end deffn

@geindex config() (tkinter.font.Font 메서드)
@anchor{library/tkinter font tkinter font Font config}@anchor{4352}
@deffn {메서드} config (**options)

글꼴의 어트리뷰트를 수정합니다.
@end deffn

@geindex copy() (tkinter.font.Font 메서드)
@anchor{library/tkinter font tkinter font Font copy}@anchor{4353}
@deffn {메서드} copy ()

현재 글꼴의 새 인스턴스를 반환합니다.
@end deffn

@geindex measure() (tkinter.font.Font 메서드)
@anchor{library/tkinter font tkinter font Font measure}@anchor{4354}
@deffn {메서드} measure (text, displayof=None)

현재 글꼴로 포맷할 때 지정된 디스플레이에서 텍스트가 차지할 공간의 크기를 반환합니다. 디스플레이가 지정되지 않으면 메인 응용 프로그램 창을 가정합니다.
@end deffn

@geindex metrics() (tkinter.font.Font 메서드)
@anchor{library/tkinter font tkinter font Font metrics}@anchor{4355}
@deffn {메서드} metrics (*options, **kw)

글꼴별 데이터를 반환합니다. 옵션은 다음과 같습니다:


@table @asis

@item `ascent' - 기준선(baseline)과 글꼴의 문자가 차지할 수 있는 가장 높은 점 사이의 거리

.

@item `descent' - 기준선과 글꼴의 문자가 차지할 수 있는 가장 낮은 점 사이의 거리

.

@item `linespace' - 줄 사이에 수직 겹침이 없음을 보장하는, 글꼴의 임의의 두 문자 간에 필요한 최소 수직 분리

.
@end table

`fixed' - 글꼴이 고정 너비이면 1, 그렇지 않으면 0
@end deffn
@end deffn

@geindex families() (tkinter.font 모듈)
@anchor{library/tkinter font tkinter font families}@anchor{4356}
@deffn {함수} tkinter.font.families (root=None, displayof=None)

구별되는 글꼴 패밀리를 반환합니다.
@end deffn

@geindex names() (tkinter.font 모듈)
@anchor{library/tkinter font tkinter font names}@anchor{4357}
@deffn {함수} tkinter.font.names (root=None)

정의된 글꼴의 이름을 반환합니다.
@end deffn

@geindex nametofont() (tkinter.font 모듈)
@anchor{library/tkinter font tkinter font nametofont}@anchor{1ccd}
@deffn {함수} tkinter.font.nametofont (name, root=None)

tk 명명된 글꼴의 @ref{1ccb,,Font} 표현을 반환합니다.


버전 3.10에서 변경: The `root' parameter was added.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Tkinter 대화 상자,tkinter messagebox — Tkinter 메시지 프롬프트,tkinter font — Tkinter 글꼴 래퍼,Graphical user interfaces with Tk
@anchor{library/dialog doc}@anchor{4358}@anchor{library/dialog tkinter-dialogs}@anchor{4359}@anchor{library/dialog translation-repo}@anchor{435a}
@subsection Tkinter 대화 상자


@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. 

@end menu

@node tkinter simpledialog — Standard Tkinter input dialogs,tkinter filedialog — File selection dialogs,,Tkinter 대화 상자
@anchor{library/dialog module-tkinter simpledialog}@anchor{fe}@anchor{library/dialog tkinter-simpledialog-standard-tkinter-input-dialogs}@anchor{435b}
@subsubsection @code{tkinter.simpledialog} — Standard Tkinter input dialogs


@geindex module; tkinter.simpledialog

`소스 코드:' Lib/tkinter/simpledialog.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/tkinter/simpledialog.py}


__________________________________________________________________


The @code{tkinter.simpledialog} module contains convenience classes and
functions for creating simple modal dialogs to get a value from the user.

@geindex askfloat() (tkinter.simpledialog 모듈)
@geindex askinteger() (tkinter.simpledialog 모듈)
@geindex askstring() (tkinter.simpledialog 모듈)
@anchor{library/dialog tkinter simpledialog askfloat}@anchor{435c}
@deffn {함수} tkinter.simpledialog.askfloat (title, prompt, **kw)
@anchor{library/dialog tkinter simpledialog askinteger}@anchor{1cce}
@deffnx {함수} tkinter.simpledialog.askinteger (title, prompt, **kw)
@anchor{library/dialog tkinter simpledialog askstring}@anchor{435d}
@deffnx {함수} tkinter.simpledialog.askstring (title, prompt, **kw)

위의 세 함수는 사용자에게 원하는 형의 값을 입력하도록 요구하는 대화 상자를 제공합니다.
@end deffn

@geindex Dialog (tkinter.simpledialog 클래스)
@anchor{library/dialog tkinter simpledialog Dialog}@anchor{435e}
@deffn {클래스} tkinter.simpledialog.Dialog (parent, title=None)

사용자 정의 대화 상자의 베이스 클래스.

@geindex body() (tkinter.simpledialog.Dialog 메서드)
@anchor{library/dialog tkinter simpledialog Dialog body}@anchor{435f}
@deffn {메서드} body (master)

대화 상자의 인터페이스를 구성하고 초기 포커스가 필요한 위젯을 반환하도록 재정의하십시오.
@end deffn

@geindex buttonbox() (tkinter.simpledialog.Dialog 메서드)
@anchor{library/dialog tkinter simpledialog Dialog buttonbox}@anchor{4360}
@deffn {메서드} buttonbox ()

기본 동작은 OK 와 Cancel 버튼을 추가합니다. 사용자 정의 버튼 레이아웃이 필요하면 재정의하십시오.
@end deffn
@end deffn

@node tkinter filedialog — File selection dialogs,tkinter commondialog — Dialog window templates,tkinter simpledialog — Standard Tkinter input dialogs,Tkinter 대화 상자
@anchor{library/dialog module-tkinter filedialog}@anchor{fa}@anchor{library/dialog tkinter-filedialog-file-selection-dialogs}@anchor{4361}
@subsubsection @code{tkinter.filedialog} — File selection dialogs


@geindex module; tkinter.filedialog

`소스 코드:' Lib/tkinter/filedialog.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/tkinter/filedialog.py}


__________________________________________________________________


The @code{tkinter.filedialog} module provides classes and factory functions for
creating file/directory selection windows.

@menu
* 네이티브 로드/저장 대화 상자:: 

@end menu

@node 네이티브 로드/저장 대화 상자,,,tkinter filedialog — File selection dialogs
@anchor{library/dialog native-load-save-dialogs}@anchor{4362}
@subsubsection 네이티브 로드/저장 대화 상자


다음 클래스와 함수는 네이티브 모양과 느낌을 동작을 사용자 정의하는 구성 옵션과 결합하는 파일 대화 상자 창을 제공합니다. 다음 키워드 인자는 아래 나열된 클래스와 함수에 적용할 수 있습니다:

@quotation


@display
`parent' - 대화 상자를 그 위에 놓을 창@w{ }
@end display




@display
`title' - 창의 제목@w{ }
@end display




@display
`initialdir' - 대화 상자가 시작되는 디렉터리@w{ }
@end display




@display
`initialfile' - 대화 상자를 열 때 선택된 파일@w{ }
@end display




@display
`filetypes' - (label, pattern) 튜플의 시퀀스, ‘*’ 와일드카드가 허용됩니다@w{ }
@end display




@display
`defaultextension' - 파일에 추가할 기본 확장자 (저장 대화 상자)@w{ }
@end display




@display
`multiple' - 참일 때, 여러 항목을 선택할 수 있습니다@w{ }
@end display


@end quotation

`정적 팩토리 함수'

아래 함수는 호출될 때 모달, 네이티브 모양과 느낌의 대화 상자를 만들고, 사용자의 선택을 기다린 다음, 선택한 값이나 @code{None}을 호출자에게 반환합니다.

@geindex askopenfile() (tkinter.filedialog 모듈)
@geindex askopenfiles() (tkinter.filedialog 모듈)
@anchor{library/dialog tkinter filedialog askopenfile}@anchor{4363}
@deffn {함수} tkinter.filedialog.askopenfile (mode='r', **options)
@anchor{library/dialog tkinter filedialog askopenfiles}@anchor{4364}
@deffnx {함수} tkinter.filedialog.askopenfiles (mode='r', **options)

위의 두 함수는 @ref{4365,,Open} 대화 상자를 만들고 열린 파일 객체를 읽기 전용 모드로 반환합니다.
@end deffn

@geindex asksaveasfile() (tkinter.filedialog 모듈)
@anchor{library/dialog tkinter filedialog asksaveasfile}@anchor{4366}
@deffn {함수} tkinter.filedialog.asksaveasfile (mode='w', **options)

@ref{4367,,SaveAs} 대화 상자를 만들고 쓰기 전용 모드로 열린 파일 객체를 반환합니다.
@end deffn

@geindex askopenfilename() (tkinter.filedialog 모듈)
@geindex askopenfilenames() (tkinter.filedialog 모듈)
@anchor{library/dialog tkinter filedialog askopenfilename}@anchor{4368}
@deffn {함수} tkinter.filedialog.askopenfilename (**options)
@anchor{library/dialog tkinter filedialog askopenfilenames}@anchor{4369}
@deffnx {함수} tkinter.filedialog.askopenfilenames (**options)

위의 두 함수는 @ref{4365,,Open} 대화 상자를 만들고 기존 파일(들)에 해당하는 선택된 파일명(들)을 반환합니다.
@end deffn

@geindex asksaveasfilename() (tkinter.filedialog 모듈)
@anchor{library/dialog tkinter filedialog asksaveasfilename}@anchor{436a}
@deffn {함수} tkinter.filedialog.asksaveasfilename (**options)

@ref{4367,,SaveAs} 대화 상자를 만들고 선택한 파일명을 반환합니다.
@end deffn

@geindex askdirectory() (tkinter.filedialog 모듈)
@anchor{library/dialog tkinter filedialog askdirectory}@anchor{436b}
@deffn {함수} tkinter.filedialog.askdirectory (**options)


@display
사용자에게 디렉터리를 선택하라는 메시지를 표시합니다.@w{ }
추가 키워드 옵션:@w{ }
@display
`mustexist' - 선택이 기존 디렉터리여야 하는지를 결정합니다.@w{ }
@end display
@end display


@end deffn

@geindex Open (tkinter.filedialog 클래스)
@geindex SaveAs (tkinter.filedialog 클래스)
@anchor{library/dialog tkinter filedialog Open}@anchor{4365}
@deffn {클래스} tkinter.filedialog.Open (master=None, **options)
@anchor{library/dialog tkinter filedialog SaveAs}@anchor{4367}
@deffnx {클래스} tkinter.filedialog.SaveAs (master=None, **options)

위의 두 클래스는 파일 저장과 로드를 위한 네이티브 대화 창을 제공합니다.
@end deffn

`편의 클래스'

아래 클래스는 파일/디렉터리 창을 처음부터 만드는 데 사용됩니다. 이것들은 플랫폼의 네이티브 모양과 느낌을 모방하지 않습니다.

@geindex Directory (tkinter.filedialog 클래스)
@anchor{library/dialog tkinter filedialog Directory}@anchor{436c}
@deffn {클래스} tkinter.filedialog.Directory (master=None, **options)

사용자에게 디렉터리를 선택하라는 대화 상자를 만듭니다.
@end deffn

@cartouche
@quotation 참고 
`FileDialog' 클래스는 사용자 정의 이벤트 처리와 동작을 위해 서브 클래싱 되어야 합니다.
@end quotation
@end cartouche

@geindex FileDialog (tkinter.filedialog 클래스)
@anchor{library/dialog tkinter filedialog FileDialog}@anchor{436d}
@deffn {클래스} tkinter.filedialog.FileDialog (master, title=None)

기본 파일 선택 대화 상자를 만듭니다.

@geindex cancel_command() (tkinter.filedialog.FileDialog 메서드)
@anchor{library/dialog tkinter filedialog FileDialog cancel_command}@anchor{436e}
@deffn {메서드} cancel_command (event=None)

대화 창의 종료를 트리거 합니다.
@end deffn

@geindex dirs_double_event() (tkinter.filedialog.FileDialog 메서드)
@anchor{library/dialog tkinter filedialog FileDialog dirs_double_event}@anchor{436f}
@deffn {메서드} dirs_double_event (event)

디렉터리에 대한 더블 클릭 이벤트를 위한 이벤트 처리기.
@end deffn

@geindex dirs_select_event() (tkinter.filedialog.FileDialog 메서드)
@anchor{library/dialog tkinter filedialog FileDialog dirs_select_event}@anchor{4370}
@deffn {메서드} dirs_select_event (event)

디렉터리에 대한 클릭 이벤트를 위한 이벤트 처리기.
@end deffn

@geindex files_double_event() (tkinter.filedialog.FileDialog 메서드)
@anchor{library/dialog tkinter filedialog FileDialog files_double_event}@anchor{4371}
@deffn {메서드} files_double_event (event)

파일에 대한 더블 클릭 이벤트를 위한 이벤트 처리기.
@end deffn

@geindex files_select_event() (tkinter.filedialog.FileDialog 메서드)
@anchor{library/dialog tkinter filedialog FileDialog files_select_event}@anchor{4372}
@deffn {메서드} files_select_event (event)

파일에 대한 단일 클릭 이벤트를 위한 이벤트 처리기.
@end deffn

@geindex filter_command() (tkinter.filedialog.FileDialog 메서드)
@anchor{library/dialog tkinter filedialog FileDialog filter_command}@anchor{4373}
@deffn {메서드} filter_command (event=None)

디렉터리로 파일을 필터링합니다.
@end deffn

@geindex get_filter() (tkinter.filedialog.FileDialog 메서드)
@anchor{library/dialog tkinter filedialog FileDialog get_filter}@anchor{4374}
@deffn {메서드} get_filter ()

현재 사용 중인 파일 필터를 가져옵니다.
@end deffn

@geindex get_selection() (tkinter.filedialog.FileDialog 메서드)
@anchor{library/dialog tkinter filedialog FileDialog get_selection}@anchor{4375}
@deffn {메서드} get_selection ()

현재 선택된 항목을 가져옵니다.
@end deffn

@geindex go() (tkinter.filedialog.FileDialog 메서드)
@anchor{library/dialog tkinter filedialog FileDialog go}@anchor{4376}
@deffn {메서드} go (dir_or_file=os.curdir, pattern='*', default='@w{'}, key=None)

대화 상자를 렌더링하고 이벤트 루프를 시작합니다.
@end deffn

@geindex ok_event() (tkinter.filedialog.FileDialog 메서드)
@anchor{library/dialog tkinter filedialog FileDialog ok_event}@anchor{4377}
@deffn {메서드} ok_event (event)

현재 선택을 반환하면서 대화 상자를 종료합니다.
@end deffn

@geindex quit() (tkinter.filedialog.FileDialog 메서드)
@anchor{library/dialog tkinter filedialog FileDialog quit}@anchor{4378}
@deffn {메서드} quit (how=None)

파일명을 (있다면) 반환하면서 대화 상자를 종료합니다.
@end deffn

@geindex set_filter() (tkinter.filedialog.FileDialog 메서드)
@anchor{library/dialog tkinter filedialog FileDialog set_filter}@anchor{4379}
@deffn {메서드} set_filter (dir, pat)

파일 필터를 설정합니다.
@end deffn

@geindex set_selection() (tkinter.filedialog.FileDialog 메서드)
@anchor{library/dialog tkinter filedialog FileDialog set_selection}@anchor{437a}
@deffn {메서드} set_selection (file)

현재 파일 선택을 `file'로 갱신합니다.
@end deffn
@end deffn

@geindex LoadFileDialog (tkinter.filedialog 클래스)
@anchor{library/dialog tkinter filedialog LoadFileDialog}@anchor{437b}
@deffn {클래스} tkinter.filedialog.LoadFileDialog (master, title=None)

기존 파일을 선택하기 위한 대화 상자 창을 만드는 FileDialog의 서브 클래스.

@geindex ok_command() (tkinter.filedialog.LoadFileDialog 메서드)
@anchor{library/dialog tkinter filedialog LoadFileDialog ok_command}@anchor{437c}
@deffn {메서드} ok_command ()

파일이 제공되고 선택이 이미 존재하는 파일을 가리키는지 테스트합니다.
@end deffn
@end deffn

@geindex SaveFileDialog (tkinter.filedialog 클래스)
@anchor{library/dialog tkinter filedialog SaveFileDialog}@anchor{437d}
@deffn {클래스} tkinter.filedialog.SaveFileDialog (master, title=None)

대상 파일을 선택하기 위한 대화 상자 창을 만드는 FileDialog의 서브 클래스.

@geindex ok_command() (tkinter.filedialog.SaveFileDialog 메서드)
@anchor{library/dialog tkinter filedialog SaveFileDialog ok_command}@anchor{437e}
@deffn {메서드} ok_command ()

선택이 디렉터리가 아닌 유효한 파일을 가리키는지 테스트합니다. 이미 존재하는 파일을 선택했으면 확인이 필요합니다.
@end deffn
@end deffn

@node tkinter commondialog — Dialog window templates,,tkinter filedialog — File selection dialogs,Tkinter 대화 상자
@anchor{library/dialog module-tkinter commondialog}@anchor{f8}@anchor{library/dialog tkinter-commondialog-dialog-window-templates}@anchor{437f}
@subsubsection @code{tkinter.commondialog} — Dialog window templates


@geindex module; tkinter.commondialog

`소스 코드:' Lib/tkinter/commondialog.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/tkinter/commondialog.py}


__________________________________________________________________


The @code{tkinter.commondialog} module provides the @ref{4347,,Dialog} class that
is the base class for dialogs defined in other supporting modules.

@geindex Dialog (tkinter.commondialog 클래스)
@anchor{library/dialog tkinter commondialog Dialog}@anchor{4347}
@deffn {클래스} tkinter.commondialog.Dialog (master=None, **options)

@geindex show() (tkinter.commondialog.Dialog 메서드)
@anchor{library/dialog tkinter commondialog Dialog show}@anchor{4380}
@deffn {메서드} show (**options)

대화창을 렌더링합니다.
@end deffn
@end deffn


@subsubheading 더 보기


모듈 @ref{fc,,tkinter.messagebox}, @ref{2064,,파일을 읽고 쓰기}


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node tkinter messagebox — Tkinter 메시지 프롬프트,tkinter scrolledtext — 스크롤 되는 Text 위젯,Tkinter 대화 상자,Graphical user interfaces with Tk
@anchor{library/tkinter messagebox doc}@anchor{4381}@anchor{library/tkinter messagebox module-tkinter messagebox}@anchor{fc}@anchor{library/tkinter messagebox tkinter-messagebox-tkinter-message-prompts}@anchor{4382}@anchor{library/tkinter messagebox translation-repo}@anchor{4383}
@subsection @code{tkinter.messagebox} — Tkinter 메시지 프롬프트


@geindex module; tkinter.messagebox

`소스 코드:' Lib/tkinter/messagebox.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/tkinter/messagebox.py}


__________________________________________________________________


The @code{tkinter.messagebox} module provides a template base class as well as
a variety of convenience methods for commonly used configurations. The message
boxes are modal and will return a subset of (@code{True}, @code{False}, @code{None},
@ref{4384,,OK}, @ref{4385,,CANCEL}, @ref{4386,,YES}, @ref{4387,,NO}) based on
the user’s selection. Common message box styles and layouts include but are not
limited to:


@float Figure

@image{python-figures/tk_msg,,,,png}

@end float


@geindex Message (tkinter.messagebox 클래스)
@anchor{library/tkinter messagebox tkinter messagebox Message}@anchor{4388}
@deffn {클래스} tkinter.messagebox.Message (master=None, **options)

Create a message window with an application-specified message, an icon
and a set of buttons.
Each of the buttons in the message window is identified by a unique symbolic name (see the `type' options).

The following options are supported:

@quotation


@table @asis

@item `command'

Specifies the function to invoke when the user closes the dialog.
The name of the button clicked by the user to close the dialog is
passed as argument.
This is only available on macOS.

@item `default'

Gives the @ref{4389,,symbolic name} of the default button
for this message window (@ref{4384,,OK}, @ref{4385,,CANCEL}, and so on).
If this option is not specified, the first button in the dialog will
be made the default.

@item `detail'

Specifies an auxiliary message to the main message given by the
`message' option.
The message detail will be presented beneath the main message and,
where supported by the OS, in a less emphasized font than the main
message.

@item `icon'

Specifies an @ref{438a,,icon} to display.
If this option is not specified, then the @ref{438b,,INFO} icon will be
displayed.

@item `message'

Specifies the message to display in this message box.
The default value is an empty string.

@item `parent'

Makes the specified window the logical parent of the message box.
The message box is displayed on top of its parent window.

@item `title'

Specifies a string to display as the title of the message box.
This option is ignored on macOS, where platform guidelines forbid
the use of a title on this kind of dialog.

@item `type'

Arranges for a @ref{438c,,predefined set of buttons}
to be displayed.
@end table
@end quotation

@geindex show() (tkinter.messagebox.Message 메서드)
@anchor{library/tkinter messagebox tkinter messagebox Message show}@anchor{438d}
@deffn {메서드} show (**options)

Display a message window and wait for the user to select one of the buttons. Then return the symbolic name of the selected button.
Keyword arguments can override options specified in the constructor.
@end deffn
@end deffn

`정보 메시지 상자'

@geindex showinfo() (tkinter.messagebox 모듈)
@anchor{library/tkinter messagebox tkinter messagebox showinfo}@anchor{438e}
@deffn {함수} tkinter.messagebox.showinfo (title=None, message=None, **options)

지정된 제목과 메시지가 포함된 정보 메시지 상자를 만들고 표시합니다.
@end deffn

`경고 메시지 상자'

@geindex showwarning() (tkinter.messagebox 모듈)
@anchor{library/tkinter messagebox tkinter messagebox showwarning}@anchor{438f}
@deffn {함수} tkinter.messagebox.showwarning (title=None, message=None, **options)

Creates and displays a warning message box with the specified title
and message.
@end deffn

@geindex showerror() (tkinter.messagebox 모듈)
@anchor{library/tkinter messagebox tkinter messagebox showerror}@anchor{4390}
@deffn {함수} tkinter.messagebox.showerror (title=None, message=None, **options)

Creates and displays an error message box with the specified title
and message.
@end deffn

`질문 메시지 상자'

@geindex askquestion() (tkinter.messagebox 모듈)
@anchor{library/tkinter messagebox tkinter messagebox askquestion}@anchor{4391}
@deffn {함수} tkinter.messagebox.askquestion (title=None, message=None, *, type=YESNO, **options)

Ask a question. By default shows buttons @ref{4386,,YES} and @ref{4387,,NO}.
Returns the symbolic name of the selected button.
@end deffn

@geindex askokcancel() (tkinter.messagebox 모듈)
@anchor{library/tkinter messagebox tkinter messagebox askokcancel}@anchor{4392}
@deffn {함수} tkinter.messagebox.askokcancel (title=None, message=None, **options)

Ask if operation should proceed. Shows buttons @ref{4384,,OK} and @ref{4385,,CANCEL}.
Returns @code{True} if the answer is ok and @code{False} otherwise.
@end deffn

@geindex askretrycancel() (tkinter.messagebox 모듈)
@anchor{library/tkinter messagebox tkinter messagebox askretrycancel}@anchor{4393}
@deffn {함수} tkinter.messagebox.askretrycancel (title=None, message=None, **options)

Ask if operation should be retried. Shows buttons @ref{4394,,RETRY} and @ref{4385,,CANCEL}.
Return @code{True} if the answer is yes and @code{False} otherwise.
@end deffn

@geindex askyesno() (tkinter.messagebox 모듈)
@anchor{library/tkinter messagebox tkinter messagebox askyesno}@anchor{4395}
@deffn {함수} tkinter.messagebox.askyesno (title=None, message=None, **options)

Ask a question. Shows buttons @ref{4386,,YES} and @ref{4387,,NO}.
Returns @code{True} if the answer is yes and @code{False} otherwise.
@end deffn

@geindex askyesnocancel() (tkinter.messagebox 모듈)
@anchor{library/tkinter messagebox tkinter messagebox askyesnocancel}@anchor{4396}
@deffn {함수} tkinter.messagebox.askyesnocancel (title=None, message=None, **options)

Ask a question. Shows buttons @ref{4386,,YES}, @ref{4387,,NO} and @ref{4385,,CANCEL}.
Return @code{True} if the answer is yes, @code{None} if cancelled, and @code{False}
otherwise.
@end deffn
@anchor{library/tkinter messagebox messagebox-buttons}@anchor{4389}
Symbolic names of buttons:

@geindex ABORT (tkinter.messagebox 모듈)
@anchor{library/tkinter messagebox tkinter messagebox ABORT}@anchor{4397}
@deffn {데이터} tkinter.messagebox.ABORT = 'abort'
@end deffn

@geindex RETRY (tkinter.messagebox 모듈)
@anchor{library/tkinter messagebox tkinter messagebox RETRY}@anchor{4394}
@deffn {데이터} tkinter.messagebox.RETRY = 'retry'
@end deffn

@geindex IGNORE (tkinter.messagebox 모듈)
@anchor{library/tkinter messagebox tkinter messagebox IGNORE}@anchor{4398}
@deffn {데이터} tkinter.messagebox.IGNORE = 'ignore'
@end deffn

@geindex OK (tkinter.messagebox 모듈)
@anchor{library/tkinter messagebox tkinter messagebox OK}@anchor{4384}
@deffn {데이터} tkinter.messagebox.OK = 'ok'
@end deffn

@geindex CANCEL (tkinter.messagebox 모듈)
@anchor{library/tkinter messagebox tkinter messagebox CANCEL}@anchor{4385}
@deffn {데이터} tkinter.messagebox.CANCEL = 'cancel'
@end deffn

@geindex YES (tkinter.messagebox 모듈)
@anchor{library/tkinter messagebox tkinter messagebox YES}@anchor{4386}
@deffn {데이터} tkinter.messagebox.YES = 'yes'
@end deffn

@geindex NO (tkinter.messagebox 모듈)
@anchor{library/tkinter messagebox tkinter messagebox NO}@anchor{4387}
@deffn {데이터} tkinter.messagebox.NO = 'no'
@end deffn
@anchor{library/tkinter messagebox messagebox-types}@anchor{438c}
Predefined sets of buttons:

@geindex ABORTRETRYIGNORE (tkinter.messagebox 모듈)
@anchor{library/tkinter messagebox tkinter messagebox ABORTRETRYIGNORE}@anchor{4399}
@deffn {데이터} tkinter.messagebox.ABORTRETRYIGNORE = 'abortretryignore'

Displays three buttons whose symbolic names are @ref{4397,,ABORT},
@ref{4394,,RETRY} and @ref{4398,,IGNORE}.
@end deffn


@deffn {데이터} tkinter.messagebox.OK = 'ok'

Displays one button whose symbolic name is @code{OK}.
@end deffn

@geindex OKCANCEL (tkinter.messagebox 모듈)
@anchor{library/tkinter messagebox tkinter messagebox OKCANCEL}@anchor{439a}
@deffn {데이터} tkinter.messagebox.OKCANCEL = 'okcancel'

Displays two buttons whose symbolic names are @ref{4384,,OK} and
@ref{4385,,CANCEL}.
@end deffn

@geindex RETRYCANCEL (tkinter.messagebox 모듈)
@anchor{library/tkinter messagebox tkinter messagebox RETRYCANCEL}@anchor{439b}
@deffn {데이터} tkinter.messagebox.RETRYCANCEL = 'retrycancel'

Displays two buttons whose symbolic names are @ref{4394,,RETRY} and
@ref{4385,,CANCEL}.
@end deffn

@geindex YESNO (tkinter.messagebox 모듈)
@anchor{library/tkinter messagebox tkinter messagebox YESNO}@anchor{439c}
@deffn {데이터} tkinter.messagebox.YESNO = 'yesno'

Displays two buttons whose symbolic names are @ref{4386,,YES} and
@ref{4387,,NO}.
@end deffn

@geindex YESNOCANCEL (tkinter.messagebox 모듈)
@anchor{library/tkinter messagebox tkinter messagebox YESNOCANCEL}@anchor{439d}
@deffn {데이터} tkinter.messagebox.YESNOCANCEL = 'yesnocancel'

Displays three buttons whose symbolic names are @ref{4386,,YES},
@ref{4387,,NO} and @ref{4385,,CANCEL}.
@end deffn
@anchor{library/tkinter messagebox messagebox-icons}@anchor{438a}
Icon images:

@geindex ERROR (tkinter.messagebox 모듈)
@anchor{library/tkinter messagebox tkinter messagebox ERROR}@anchor{439e}
@deffn {데이터} tkinter.messagebox.ERROR = 'error'
@end deffn

@geindex INFO (tkinter.messagebox 모듈)
@anchor{library/tkinter messagebox tkinter messagebox INFO}@anchor{438b}
@deffn {데이터} tkinter.messagebox.INFO = 'info'
@end deffn

@geindex QUESTION (tkinter.messagebox 모듈)
@anchor{library/tkinter messagebox tkinter messagebox QUESTION}@anchor{439f}
@deffn {데이터} tkinter.messagebox.QUESTION = 'question'
@end deffn

@geindex WARNING (tkinter.messagebox 모듈)
@anchor{library/tkinter messagebox tkinter messagebox WARNING}@anchor{43a0}
@deffn {데이터} tkinter.messagebox.WARNING = 'warning'
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node tkinter scrolledtext — 스크롤 되는 Text 위젯,tkinter dnd — 드래그 앤드 드롭 지원,tkinter messagebox — Tkinter 메시지 프롬프트,Graphical user interfaces with Tk
@anchor{library/tkinter scrolledtext doc}@anchor{43a1}@anchor{library/tkinter scrolledtext module-tkinter scrolledtext}@anchor{fd}@anchor{library/tkinter scrolledtext tkinter-scrolledtext-scrolled-text-widget}@anchor{43a2}@anchor{library/tkinter scrolledtext translation-repo}@anchor{43a3}
@subsection @code{tkinter.scrolledtext} — 스크롤 되는 Text 위젯


@geindex module; tkinter.scrolledtext

`소스 코드:' Lib/tkinter/scrolledtext.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/tkinter/scrolledtext.py}


__________________________________________________________________


The @code{tkinter.scrolledtext} module provides a class of the same name which
implements a basic text widget which has a vertical scroll bar configured to do
the “right thing.”  Using the @ref{43a4,,ScrolledText} class is a lot easier than
setting up a text widget and scroll bar directly.

텍스트 위젯과 스크롤 막대는 @code{Frame}에 함께 팩 되며, @code{Grid}와 @code{Pack} 지오메트리 관리자의 메서드를 @code{Frame} 객체에서 얻습니다. 이렇게 함으로써, 가장 일반적인 지오메트리 관리 동작을 달성하는데 @ref{43a4,,ScrolledText} 위젯을 직접 사용할 수 있습니다.

더욱 구체적인 제어가 필요하면, 다음 어트리뷰트를 사용할 수 있습니다:

@geindex ScrolledText (tkinter.scrolledtext 클래스)
@anchor{library/tkinter scrolledtext tkinter scrolledtext ScrolledText}@anchor{43a4}
@deffn {클래스} tkinter.scrolledtext.ScrolledText (master=None, **kw)

@geindex frame (tkinter.scrolledtext.ScrolledText의 속성)
@anchor{library/tkinter scrolledtext tkinter scrolledtext ScrolledText frame}@anchor{43a5}
@deffn {속성} frame

텍스트 및 스크롤 막대 위젯을 둘러싼 프레임.
@end deffn

@geindex vbar (tkinter.scrolledtext.ScrolledText의 속성)
@anchor{library/tkinter scrolledtext tkinter scrolledtext ScrolledText vbar}@anchor{43a6}
@deffn {속성} vbar

스크롤 막대 위젯.
@end deffn
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node tkinter dnd — 드래그 앤드 드롭 지원,tkinter ttk — Tk 테마 위젯,tkinter scrolledtext — 스크롤 되는 Text 위젯,Graphical user interfaces with Tk
@anchor{library/tkinter dnd doc}@anchor{43a7}@anchor{library/tkinter dnd module-tkinter dnd}@anchor{f9}@anchor{library/tkinter dnd tkinter-dnd-drag-and-drop-support}@anchor{43a8}@anchor{library/tkinter dnd translation-repo}@anchor{43a9}
@subsection @code{tkinter.dnd} — 드래그 앤드 드롭 지원


@geindex module; tkinter.dnd

`소스 코드:' Lib/tkinter/dnd.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/tkinter/dnd.py}


__________________________________________________________________


@cartouche
@quotation 참고 
이것은 실험적이며 Tk DND로 대체될 때 폐지될 예정입니다.
@end quotation
@end cartouche

The @code{tkinter.dnd} module provides drag-and-drop support for objects within
a single application, within the same window or between windows. To enable an
object to be dragged, you must create an event binding for it that starts the
drag-and-drop process. Typically, you bind a ButtonPress event to a callback
function that you write (see @ref{4338,,바인딩과 이벤트}). The function should
call @ref{43aa,,dnd_start()}, where ‘source’ is the object to be dragged, and ‘event’
is the event that invoked the call (the argument to your callback function).

대상 객체는 다음과 같이 선택됩니다:


@enumerate 

@item 
대상 위젯에 대한 마우스 아래 영역의 하향식 검색
@end enumerate

@quotation


@itemize *

@item 
대상 위젯에는 콜러블 `dnd_accept' 어트리뷰트가 있어야 합니다

@item 
`dnd_accept'가 없거나 @code{None}을 반환하면, 검색은 부모 위젯으로 이동합니다

@item 
대상 위젯이 발견되지 않으면, 대상 객체는 @code{None}입니다.
@end itemize
@end quotation


@enumerate 2

@item 
`<old_target>.dnd_leave(source, event)'를 호출합니다

@item 
`<new_target>.dnd_enter(source, event)'를 호출합니다

@item 
드롭을 알리기 위해 `<target>.dnd_commit(source, event)'를 호출합니다

@item 
드래그 앤드 드롭의 끝을 알리기 위해 `<source>.dnd_end(target, event)'를 호출합니다
@end enumerate

@geindex DndHandler (tkinter.dnd 클래스)
@anchor{library/tkinter dnd tkinter dnd DndHandler}@anchor{43ab}
@deffn {클래스} tkinter.dnd.DndHandler (source, event)

`DndHandler' 클래스는 이벤트 위젯의 루트에서 Motion과 ButtonRelease 이벤트를 추적하는 드래그 앤드 드롭 이벤트를 처리합니다.

@geindex cancel() (tkinter.dnd.DndHandler 메서드)
@anchor{library/tkinter dnd tkinter dnd DndHandler cancel}@anchor{43ac}
@deffn {메서드} cancel (event=None)

드래그 앤드 드롭 프로세스를 취소합니다.
@end deffn

@geindex finish() (tkinter.dnd.DndHandler 메서드)
@anchor{library/tkinter dnd tkinter dnd DndHandler finish}@anchor{43ad}
@deffn {메서드} finish (event, commit=0)

드래그 앤드 드롭 기능의 끝을 실행합니다.
@end deffn

@geindex on_motion() (tkinter.dnd.DndHandler 메서드)
@anchor{library/tkinter dnd tkinter dnd DndHandler on_motion}@anchor{43ae}
@deffn {메서드} on_motion (event)

드래그가 수행되는 동안 마우스 아래의 대상 객체를 검사합니다.
@end deffn

@geindex on_release() (tkinter.dnd.DndHandler 메서드)
@anchor{library/tkinter dnd tkinter dnd DndHandler on_release}@anchor{43af}
@deffn {메서드} on_release (event)

릴리즈 패턴이 트리거 될 때 드래그의 끝을 알립니다.
@end deffn
@end deffn

@geindex dnd_start() (tkinter.dnd 모듈)
@anchor{library/tkinter dnd tkinter dnd dnd_start}@anchor{43aa}
@deffn {함수} tkinter.dnd.dnd_start (source, event)

드래그 앤드 드롭 프로세스를 위한 팩토리 함수.
@end deffn


@subsubheading 더 보기


@ref{4338,,바인딩과 이벤트}


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node tkinter ttk — Tk 테마 위젯,IDLE — 파이썬 편집기와 셸,tkinter dnd — 드래그 앤드 드롭 지원,Graphical user interfaces with Tk
@anchor{library/tkinter ttk doc}@anchor{43b0}@anchor{library/tkinter ttk module-tkinter ttk}@anchor{ff}@anchor{library/tkinter ttk tkinter-ttk-tk-themed-widgets}@anchor{43b1}@anchor{library/tkinter ttk translation-repo}@anchor{43b2}
@subsection @code{tkinter.ttk} — Tk 테마 위젯


@geindex module; tkinter.ttk

`소스 코드:' Lib/tkinter/ttk.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/tkinter/ttk.py}

@geindex ttk


__________________________________________________________________


The @code{tkinter.ttk} module provides access to the Tk themed widget set,
introduced in Tk 8.5. It provides additional benefits including anti-aliased font
rendering under X11 and window transparency (requiring a composition
window manager on X11).

The basic idea for @code{tkinter.ttk} is to separate, to the extent possible,
the code implementing a widget’s behavior from the code implementing its
appearance.


@subsubheading 더 보기



@table @asis

@item Tk 위젯 스타일링 지원@footnote{https://core.tcl.tk/tips/doc/trunk/tip/48.md}

Tk의 테마 지원을 소개하는 문서
@end table


@menu
* Ttk 사용하기:: 
* Ttk 위젯:: 
* Widget:: 
* Combobox:: 
* Spinbox:: 
* Notebook:: 
* Progressbar:: 
* Separator:: 
* Sizegrip:: 
* Treeview:: 
* Ttk 스타일링:: 

@end menu

@node Ttk 사용하기,Ttk 위젯,,tkinter ttk — Tk 테마 위젯
@anchor{library/tkinter ttk using-ttk}@anchor{43b3}
@subsubsection Ttk 사용하기


Ttk를 사용하려면, 모듈을 임포트 하십시오:

@example
from tkinter import ttk
@end example

기본 Tk 위젯을 재정의하려면, 임포트는 Tk 임포트 뒤에 와야 합니다:

@example
from tkinter import *
from tkinter.ttk import *
@end example

That code causes several @code{tkinter.ttk} widgets (@code{Button},
@code{Checkbutton}, @code{Entry}, @code{Frame}, @code{Label},
@code{LabelFrame}, @code{Menubutton}, @code{PanedWindow},
@code{Radiobutton}, @code{Scale} and @code{Scrollbar}) to
automatically replace the Tk widgets.

이것은 여러 플랫폼에서 더 나은 모양과 느낌을 제공하는 새로운 위젯을 사용하는 직접적인 이점이 있지만, 대체된 위젯은 완전히 호환되지 않습니다. 주요 차이점은 “fg”, “bg” 및 위젯 스타일과 관련된 다른 위젯 옵션이 더는 Ttk 위젯에 존재하지 않는다는 것입니다. 대신, 스타일링 효과를 개선하려면 @code{ttk.Style} 클래스를 사용하십시오.


@subsubheading 더 보기



@table @asis

@item Tile 위젯을 사용하도록 기존 응용 프로그램을 변환하기@footnote{https://tktable.sourceforge.net/tile/doc/converting.txt}

새 위젯을 사용하도록 응용 프로그램을 바꿀 때 일반적으로 발생하는 차이점에 대한 모노그래프 (Tcl 용어로).
@end table


@node Ttk 위젯,Widget,Ttk 사용하기,tkinter ttk — Tk 테마 위젯
@anchor{library/tkinter ttk ttk-widgets}@anchor{43b4}
@subsubsection Ttk 위젯


Ttk에는 18개의 위젯이 있으며, 그중 12개는 tkinter에 이미 존재합니다: @code{Button}, @code{Checkbutton}, @code{Entry}, @code{Frame}, @code{Label}, @code{LabelFrame}, @code{Menubutton}, @code{PanedWindow}, @code{Radiobutton}, @code{Scale}, @code{Scrollbar} 및 @ref{d8c,,Spinbox}. 다른 6개는 @ref{43b5,,Combobox}, @ref{43b6,,Notebook}, @ref{43b7,,Progressbar}, @code{Separator}, @code{Sizegrip} 및 @ref{c85,,Treeview}입니다. 그리고 이들은 모두 @ref{43b8,,Widget}의 서브 클래스입니다.

Ttk 위젯을 사용하면 응용 프로그램의 모양과 느낌이 개선됩니다. 위에서 설명한 것처럼, 스타일을 코딩하는 방법에는 차이가 있습니다.

Tk 코드:

@example
l1 = tkinter.Label(text="Test", fg="black", bg="white")
l2 = tkinter.Label(text="Test", fg="black", bg="white")
@end example

Ttk 코드:

@example
style = ttk.Style()
style.configure("BW.TLabel", foreground="black", background="white")

l1 = ttk.Label(text="Test", style="BW.TLabel")
l2 = ttk.Label(text="Test", style="BW.TLabel")
@end example

@ref{43b9,,Ttk 스타일링}에 대한 자세한 정보는, @ref{55e,,Style} 클래스 설명서를 참조하십시오.

@node Widget,Combobox,Ttk 위젯,tkinter ttk — Tk 테마 위젯
@anchor{library/tkinter ttk widget}@anchor{43ba}
@subsubsection Widget


@code{ttk.Widget}은 Tk 테마 위젯이 지원하는 표준 옵션과 메서드를 정의하며 직접 인스턴스 화하지 않습니다.

@menu
* 표준 옵션:: 
* 스크롤 가능한 위젯 옵션:: 
* 레이블 옵션:: 
* 호환성 옵션:: 
* 위젯 상태:: 
* ttk.Widget: ttk Widget. 

@end menu

@node 표준 옵션,스크롤 가능한 위젯 옵션,,Widget
@anchor{library/tkinter ttk standard-options}@anchor{43bb}
@subsubsection 표준 옵션


모든 @code{ttk} 위젯은 다음 옵션을 받아들입니다:


@multitable {xxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

옵션

@tab

설명

@item

class

@tab

윈도우 클래스를 지정합니다. 이 클래스는 창의 다른 옵션에 대한 옵션 데이터베이스를 조회하고, 창의 기본 바인딩 태그를 결정하고, 위젯의 기본 레이아웃과 스타일을 선택하는 데 사용됩니다. 이 옵션은 읽기 전용이며, 창을 만들 때만 지정할 수 있습니다.

@item

cursor

@tab

위젯에 사용될 마우스 커서를 지정합니다. 빈 문자열(기본값)로 설정하면, 커서가 부모 위젯에서 상속됩니다.

@item

takefocus

@tab

키보드 순회 중 창에서 포커스를 받아들일지를 결정합니다. 0, 1 또는 빈 문자열이 반환됩니다. 0이 반환되면, 키보드 순회 중에 창을 완전히 건너뛰어야 한다는 의미입니다. 1이면, 창은 볼 수 있는 한 입력 포커스를 받아야 함을 의미합니다. 빈 문자열은 순회 스크립트가 창에 포커스를 맞출지를 결정함을 의미합니다.

@item

style

@tab

사용자 정의 위젯 스타일을 지정하는 데 사용될 수 있습니다.

@end multitable


@node 스크롤 가능한 위젯 옵션,레이블 옵션,표준 옵션,Widget
@anchor{library/tkinter ttk scrollable-widget-options}@anchor{43bc}
@subsubsection 스크롤 가능한 위젯 옵션


다음 옵션은 스크롤 막대로 제어되는 위젯에서 지원됩니다.


@multitable {xxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

옵션

@tab

설명

@item

xscrollcommand

@tab

가로 스크롤 막대와 통신하는 데 사용됩니다.

위젯 창에 있는 뷰가 변경될 때, 위젯은 scrollcommand를 기반한 Tcl 명령을 생성합니다.

일반적으로 이 옵션은 어떤 스크롤 막대의 메서드 @code{Scrollbar.set()}으로 구성됩니다. 그러면 창의 뷰가 변경될 때마다 스크롤 막대가 갱신됩니다.

@item

yscrollcommand

@tab

세로 스크롤 막대와 통신하는 데 사용됩니다. 자세한 내용은 위를 참조하십시오.

@end multitable


@node 레이블 옵션,호환성 옵션,스크롤 가능한 위젯 옵션,Widget
@anchor{library/tkinter ttk label-options}@anchor{43bd}
@subsubsection 레이블 옵션


다음 옵션은 레이블, 버튼 및 기타 버튼류 위젯에서 지원됩니다.


@multitable {xxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

옵션

@tab

설명

@item

text

@tab

위젯 안에 표시할 텍스트 문자열을 지정합니다.

@item

textvariable

@tab

text 옵션 자원 대신 그 값이 사용될 이름을 지정합니다.

@item

underline

@tab

설정되면, 텍스트 문자열에서 밑줄 그을 문자의 인덱스(0에서 시작)를 지정합니다. 밑줄 있는 문자는 니모닉 활성화(mnemonic activation)에 사용됩니다.

@item

image

@tab

표시할 이미지를 지정합니다. 이것은 하나 이상의 요소로 구성된 리스트입니다. 첫 번째 요소는 기본 이미지 이름입니다. 리스트의 나머지가 @ref{1ce3,,Style.map()}에 의해 정의된 대로 statespec/value 쌍의 시퀀스면, 위젯이 특정 상태나 상태의 조합에 있을 때 사용할 다른 이미지를 지정합니다. 리스트의 모든 이미지는 크기가 같아야 합니다.

@item

compound

@tab

텍스트와 이미지 옵션이 모두 있을 때, 텍스트를 기준으로 이미지를 표시하는 방법을 지정합니다. 유효한 값은 다음과 같습니다:


@itemize *

@item 
text: 텍스트만 표시합니다

@item 
image: 이미지만 표시합니다

@item 
top, bottom, left, right: 각각 이미지를 텍스트 위, 아래, 왼쪽 또는 오른쪽에 표시합니다.

@item 
none: 기본값입니다. 있으면 이미지를 표시하고, 그렇지 않으면 텍스트를 표시합니다.
@end itemize

@item

width

@tab

0보다 크면, 문자 너비 단위로, 텍스트 레이블에 할당할 공간의 크기를 지정합니다, 0보다 작으면, 최소 너비를 지정합니다. 0으로 지정하거나 지정하지 않으면, 텍스트 레이블의 자연 너비가 사용됩니다.

@end multitable


@node 호환성 옵션,위젯 상태,레이블 옵션,Widget
@anchor{library/tkinter ttk compatibility-options}@anchor{43be}
@subsubsection 호환성 옵션



@multitable {xxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

옵션

@tab

설명

@item

state

@tab

“disabled” 상태 비트를 제어하기 위해 “normal”이나 “disabled”로 설정될 수 있습니다. 이것은 쓰기 전용 옵션입니다: 이를 설정하면 위젯 상태가 변경되지만, @ref{43bf,,Widget.state()} 메서드는 이 옵션에 영향을 미치지 않습니다.

@end multitable


@node 위젯 상태,ttk Widget,호환성 옵션,Widget
@anchor{library/tkinter ttk widget-states}@anchor{43c0}
@subsubsection 위젯 상태


위젯 상태는 독립 상태 플래그의 비트 맵입니다.


@multitable {xxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

플래그

@tab

설명

@item

active

@tab

마우스 커서가 위젯 위에 있으며 마우스 버튼을 누르면 어떤 동작을 일으킵니다

@item

disabled

@tab

프로그램 제어 하에 위젯이 비활성화되었습니다

@item

focus

@tab

위젯에 키보드 포커스가 있습니다

@item

pressed

@tab

위젯을 누르고 있습니다

@item

selected

@tab

체크 버튼과 라디오 버튼과 같은 항목의 경우 “On”, “true” 또는 “current”

@item

background

@tab

윈도우와 맥에는 “활성(active)”이나 전경(foreground) 창이라는 개념이 있습니다. `background' 상태는 배경 창의 위젯에 대해 설정되고, 전경 창의 위젯에서는 지워집니다.

@item

readonly

@tab

위젯이 사용자 수정을 허용하지 않습니다

@item

alternate

@tab

위젯 별 대체 디스플레이 포맷

@item

invalid

@tab

위젯 값이 유효하지 않습니다

@end multitable


상태 명세는 상태 이름의 시퀀스이며, 선택적으로 비트가 꺼져 있음을 나타내는 느낌표가 접두어로 붙습니다.

@node ttk Widget,,위젯 상태,Widget
@anchor{library/tkinter ttk ttk-widget}@anchor{43c1}
@subsubsection ttk.Widget


아래 설명된 메서드 외에도 @code{ttk.Widget}은 메서드 @code{tkinter.Widget.cget()}과 @code{tkinter.Widget.configure()}를 지원합니다.

@geindex Widget (tkinter.ttk 클래스)
@anchor{library/tkinter ttk tkinter ttk Widget}@anchor{43b8}
@deffn {클래스} tkinter.ttk.Widget

@geindex identify() (tkinter.ttk.Widget 메서드)
@anchor{library/tkinter ttk tkinter ttk Widget identify}@anchor{43c2}
@deffn {메서드} identify (x, y)

위치 `x' `y'에 있는 요소의 이름을 반환하거나, 점이 요소 내에 없으면 빈 문자열을 반환합니다.

`x' 와 `y'는 위젯에 상대적인 픽셀 좌표입니다.
@end deffn

@geindex instate() (tkinter.ttk.Widget 메서드)
@anchor{library/tkinter ttk tkinter ttk Widget instate}@anchor{43c3}
@deffn {메서드} instate (statespec, callback=None, *args, **kw)

위젯 상태를 테스트합니다. 콜백을 지정하지 않으면, 위젯 상태가 `statespec'과 일치하면 @code{True}를, 그렇지 않으면 @code{False}를 반환합니다. 콜백이 지정되면 위젯 상태가 `statespec'과 일치하면 args로 호출됩니다.
@end deffn

@geindex state() (tkinter.ttk.Widget 메서드)
@anchor{library/tkinter ttk tkinter ttk Widget state}@anchor{43bf}
@deffn {메서드} state (statespec=None)

위젯 상태를 수정하거나 요청합니다. `statespec'이 지정되면, 그에 따라 위젯 상태를 설정하고 변경된 플래그를 나타내는 새 `statespec'을 반환합니다. `statespec'을 지정하지 않으면, 현재 활성화된 상태 플래그를 반환합니다.
@end deffn

`statespec'은 일반적으로 리스트나 튜플입니다.
@end deffn

@node Combobox,Spinbox,Widget,tkinter ttk — Tk 테마 위젯
@anchor{library/tkinter ttk combobox}@anchor{43c4}
@subsubsection Combobox


@code{ttk.Combobox} 위젯은 텍스트 필드를 값의 팝-다운(pop-down) 리스트와 결합합니다. 이 위젯은 @code{Entry}의 서브 클래스입니다.

@ref{43b8,,Widget}에서 상속된 메서드 @code{Widget.cget()}, @code{Widget.configure()}, @ref{43c2,,Widget.identify()}, @ref{43c3,,Widget.instate()} 및 @ref{43bf,,Widget.state()}와, @code{Entry}에서 상속된 메서드 @code{Entry.bbox()}, @code{Entry.delete()}, @code{Entry.icursor()}, @code{Entry.index()}, @code{Entry.insert()}, @code{Entry.selection()}, @code{Entry.xview()} 외에, @code{ttk.Combobox}에 설명된 다른 메서드가 있습니다.

@menu
* 옵션:: 
* 가상 이벤트:: 
* ttk.Combobox: ttk Combobox. 

@end menu

@node 옵션,가상 이벤트,,Combobox
@anchor{library/tkinter ttk options}@anchor{43c5}
@subsubsection 옵션


이 위젯은 다음과 같은 특정 옵션을 받아들입니다:


@multitable {xxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

옵션

@tab

설명

@item

exportselection

@tab

불리언 값. 설정되면, 위젯 선택은 창 관리자 선택에 연결됩니다 (예를 들어, Misc.selection_get 을 호출하여 반환할 수 있습니다).

@item

justify

@tab

위젯 내에서 텍스트가 정렬되는 방식을 지정합니다. “left”, “center” 또는 “right” 중 하나입니다.

@item

height

@tab

팝-다운 목록 상자의 높이를 행 단위로 지정합니다.

@item

postcommand

@tab

값을 표시하기 직전에 호출되는 (Misc.register로 등록할 수 있는) 스크립트. 표시할 값을 지정할 수 있습니다.

@item

state

@tab

“normal”, “readonly” 또는 “disabled” 중 하나. “readonly” 상태에서는, 값을 직접 편집할 수 없고, 사용자는 드롭다운 목록에서 값을 선택할 수만 있습니다. “normal” 상태에서는, 텍스트 필드를 직접 편집할 수 있습니다. “disabled” 상태에서는, 상호 작용이 불가능합니다.

@item

textvariable

@tab

값이 위젯 값에 연결된 이름을 지정합니다. 해당 이름과 관련된 값이 변경될 때마다, 위젯 값이 갱신되고, 그 반대도 마찬가지입니다. @code{tkinter.StringVar}를 참조하십시오.

@item

values

@tab

드롭-다운 목록 상자에 표시할 값의 리스트를 지정합니다.

@item

width

@tab

원하는 입력 창의 너비를 나타내는 정숫값을 위젯 글꼴의 평균 크기 문자 단위로 지정합니다.

@end multitable


@node 가상 이벤트,ttk Combobox,옵션,Combobox
@anchor{library/tkinter ttk virtual-events}@anchor{43c6}
@subsubsection 가상 이벤트


콤보 박스 위젯은 사용자가 값 목록에서 요소를 선택할 때 `<<ComboboxSelected>>' 가상 이벤트를 생성합니다.

@node ttk Combobox,,가상 이벤트,Combobox
@anchor{library/tkinter ttk ttk-combobox}@anchor{43c7}
@subsubsection ttk.Combobox


@geindex Combobox (tkinter.ttk 클래스)
@anchor{library/tkinter ttk tkinter ttk Combobox}@anchor{43b5}
@deffn {클래스} tkinter.ttk.Combobox

@geindex current() (tkinter.ttk.Combobox 메서드)
@anchor{library/tkinter ttk tkinter ttk Combobox current}@anchor{43c8}
@deffn {메서드} current (newindex=None)

`newindex'를 지정하면, 콤보 박스 값을 요소 위치 `newindex'로 설정합니다. 그렇지 않으면, 현재 값의 인덱스를 반환하거나 현재 값이 값 목록에 없으면 -1을 반환합니다.
@end deffn

@geindex get() (tkinter.ttk.Combobox 메서드)
@anchor{library/tkinter ttk tkinter ttk Combobox get}@anchor{43c9}
@deffn {메서드} get ()

콤보 박스의 현재 값을 반환합니다.
@end deffn

@geindex set() (tkinter.ttk.Combobox 메서드)
@anchor{library/tkinter ttk tkinter ttk Combobox set}@anchor{43ca}
@deffn {메서드} set (value)

콤보 박스의 값을 `value'로 설정합니다.
@end deffn
@end deffn

@node Spinbox,Notebook,Combobox,tkinter ttk — Tk 테마 위젯
@anchor{library/tkinter ttk spinbox}@anchor{43cb}
@subsubsection Spinbox


@code{ttk.Spinbox} 위젯은 증가와 감소 화살표로 개선된 @code{ttk.Entry}입니다. 숫자나 문자열 값의 리스트에 사용할 수 있습니다. 이 위젯은 @code{Entry}의 서브 클래스입니다.

@ref{43b8,,Widget}에서 상속된 메서드 @code{Widget.cget()}, @code{Widget.configure()}, @ref{43c2,,Widget.identify()}, @ref{43c3,,Widget.instate()} 및 @ref{43bf,,Widget.state()}와, @code{Entry}에서 상속된 메서드 @code{Entry.bbox()}, @code{Entry.delete()}, @code{Entry.icursor()}, @code{Entry.index()}, @code{Entry.insert()}, @code{Entry.xview()} 외에도, @code{ttk.Spinbox}에 설명된 다른 메서드가 있습니다.

@menu
* 옵션: 옵션<2>. 
* 가상 이벤트: 가상 이벤트<2>. 
* ttk.Spinbox: ttk Spinbox. 

@end menu

@node 옵션<2>,가상 이벤트<2>,,Spinbox
@anchor{library/tkinter ttk id1}@anchor{43cc}
@subsubsection 옵션


이 위젯은 다음과 같은 특정 옵션을 받아들입니다:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

옵션

@tab

설명

@item

from

@tab

부동 소수점 값. 설정하면, 감소 버튼이 감소할 최솟값입니다. @code{from}은 파이썬 키워드이므로, 인자로 사용될 때 @code{from_}을 사용해야 합니다.

@item

to

@tab

부동 소수점 값. 설정되면, 증가 버튼이 증가할 최댓값입니다.

@item

increment

@tab

부동 소수점 값. 증가/감소 버튼이 값을 변경할 양을 지정합니다. 기본값은 1.0입니다.

@item

values

@tab

문자열이나 부동 소수점 값의 시퀀스. 지정되면, 증가/감소 버튼은 숫자를 늘리거나 줄이는 것이 아니라, 이 시퀀스에서 항목을 순환합니다.

@item

wrap

@tab

불리언 값. @code{True}이면, 증가와 감소 버튼이 각각 @code{to} 값에서 @code{from} 값으로, @code{from} 값에서 @code{to} 값으로 순환합니다.

@item

format

@tab

문자열 값. 증가/감소 버튼으로 설정된 숫자의 포맷을 지정합니다. “%W.Pf” 형식이어야 합니다, 여기서 W는 값의 패딩 된 너비, P는 정밀도, 그리고 ‘%’와 ‘f’는 리터럴 입니다.

@item

command

@tab

파이썬 콜러블. 증가나 감소 버튼 중 하나를 누를 때마다 인자 없이 호출됩니다.

@end multitable


@node 가상 이벤트<2>,ttk Spinbox,옵션<2>,Spinbox
@anchor{library/tkinter ttk id2}@anchor{43cd}
@subsubsection 가상 이벤트


스핀 박스 위젯은 사용자가 <Up>을 누를 때 `<<Increment>>' 가상 이벤트를, 사용자가 <Down>을 누를 때 `<<Decrement>>' 가상 이벤트를 생성합니다.

@node ttk Spinbox,,가상 이벤트<2>,Spinbox
@anchor{library/tkinter ttk ttk-spinbox}@anchor{43ce}
@subsubsection ttk.Spinbox


@geindex Spinbox (tkinter.ttk 클래스)
@anchor{library/tkinter ttk tkinter ttk Spinbox}@anchor{d8c}
@deffn {클래스} tkinter.ttk.Spinbox

@geindex get() (tkinter.ttk.Spinbox 메서드)
@anchor{library/tkinter ttk tkinter ttk Spinbox get}@anchor{43cf}
@deffn {메서드} get ()

스핀 박스의 현재 값을 반환합니다.
@end deffn

@geindex set() (tkinter.ttk.Spinbox 메서드)
@anchor{library/tkinter ttk tkinter ttk Spinbox set}@anchor{43d0}
@deffn {메서드} set (value)

스핀 박스의 값을 `value'로 설정합니다.
@end deffn
@end deffn

@node Notebook,Progressbar,Spinbox,tkinter ttk — Tk 테마 위젯
@anchor{library/tkinter ttk notebook}@anchor{43d1}
@subsubsection Notebook


Ttk Notebook 위젯은 창 모음을 관리하고 한 번에 하나의 창을 표시합니다. 각 자식 창은 사용자가 현재 표시된 창을 변경하도록 선택할 수 있는 탭과 연결되어 있습니다.

@menu
* 옵션: 옵션<3>. 
* 탭 옵션:: 
* 탭 식별자:: 
* 가상 이벤트: 가상 이벤트<3>. 
* ttk.Notebook: ttk Notebook. 

@end menu

@node 옵션<3>,탭 옵션,,Notebook
@anchor{library/tkinter ttk id3}@anchor{43d2}
@subsubsection 옵션


이 위젯은 다음과 같은 특정 옵션을 받아들입니다:


@multitable {xxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

옵션

@tab

설명

@item

height

@tab

존재하고 0보다 크면, 팬 영역(pane area)의 원하는 높이를 지정합니다 (내부 패딩이나 탭을 포함하지 않습니다). 그렇지 않으면, 모든 팬의 최대 높이가 사용됩니다.

@item

padding

@tab

노트북 외부에 추가할 여분의 공간을 지정합니다. 패딩은 좌(left) 상(top) 우(right) 하(bottom) 최대 4개의 길이 명세 리스트입니다. 4개보다 적은 요소가 지정되면, bottom의 기본값은 top, right의 기본값은 left, top의 기본값은 left입니다.

@item

width

@tab

존재하고 0보다 크면, 원하는 팬 영역 너비를 지정합니다 (내부 패딩을 포함하지 않습니다). 그렇지 않으면, 모든 팬의 최대 너비가 사용됩니다.

@end multitable


@node 탭 옵션,탭 식별자,옵션<3>,Notebook
@anchor{library/tkinter ttk tab-options}@anchor{43d3}
@subsubsection 탭 옵션


탭에 대한 특정 옵션도 있습니다:


@multitable {xxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

옵션

@tab

설명

@item

state

@tab

“normal”, “disabled” 또는 “hidden”. “disabled” 이면, 탭을 선택할 수 없습니다. “hidden” 이면, 탭이 표시되지 않습니다.

@item

sticky

@tab

자식 창이 창 영역 내에서 배치되는 방법을 지정합니다. 값은 0개 이상의 문자 “n”, “s”, “e” 또는 “w”를 포함하는 문자열입니다. 각 문자는 @code{grid()} 지오메트리 관리자에 따라, 자식 창이 붙을 변(북(north), 남(south), 동(east) 또는 서(west))을 나타냅니다.

@item

padding

@tab

노트북과 이 팬 사이에 추가할 여분의 공간을 지정합니다. 문법은 이 위젯에서 사용하는 옵션 padding과 같습니다.

@item

text

@tab

탭에 표시할 텍스트를 지정합니다.

@item

image

@tab

탭에 표시할 이미지를 지정합니다. @ref{43b8,,Widget}에 설명된 옵션 image를 참조하십시오.

@item

compound

@tab

옵션 text와 image가 모두 있을 때, 텍스트에 상대적으로 이미지를 표시하는 방법을 지정합니다. 유효한 값은 @ref{43bd,,레이블 옵션}을 참조하십시오.

@item

underline

@tab

텍스트 문자열에서 밑줄 그을 문자의 인덱스(0에서 시작)를 지정합니다. @ref{43d4,,Notebook.enable_traversal()}이 호출되면 밑줄 있는 문자는 니모닉 활성화(mnemonic activation)에 사용됩니다.

@end multitable


@node 탭 식별자,가상 이벤트<3>,탭 옵션,Notebook
@anchor{library/tkinter ttk tab-identifiers}@anchor{43d5}
@subsubsection 탭 식별자


@code{ttk.Notebook}의 여러 가지 메서드에 존재하는 tab_id는 다음 형식 중 하나를 취할 수 있습니다:


@itemize *

@item 
0과 탭 수 사이의 정수

@item 
자식 창의 이름

@item 
탭을 식별하는 “@@x,y” 형식의 위치 명세

@item 
현재 선택된 탭을 식별하는 리터럴 문자열 “current”

@item 
탭 수를 반환하는 리터럴 문자열 “end” (@ref{43d6,,Notebook.index()}에만 유효합니다)
@end itemize

@node 가상 이벤트<3>,ttk Notebook,탭 식별자,Notebook
@anchor{library/tkinter ttk id4}@anchor{43d7}
@subsubsection 가상 이벤트


이 위젯은 새 탭을 선택한 후 `<<NotebookTabChanged>>' 가상 이벤트를 생성합니다.

@node ttk Notebook,,가상 이벤트<3>,Notebook
@anchor{library/tkinter ttk ttk-notebook}@anchor{43d8}
@subsubsection ttk.Notebook


@geindex Notebook (tkinter.ttk 클래스)
@anchor{library/tkinter ttk tkinter ttk Notebook}@anchor{43b6}
@deffn {클래스} tkinter.ttk.Notebook

@geindex add() (tkinter.ttk.Notebook 메서드)
@anchor{library/tkinter ttk tkinter ttk Notebook add}@anchor{43d9}
@deffn {메서드} add (child, **kw)

노트북에 새 탭을 추가합니다.

창이 현재 노트북으로 관리되지만 숨겨져 있으면, 창은 이전 위치로 복원됩니다.

사용 가능한 옵션 목록은 @ref{43d3,,탭 옵션}을 참조하십시오.
@end deffn

@geindex forget() (tkinter.ttk.Notebook 메서드)
@anchor{library/tkinter ttk tkinter ttk Notebook forget}@anchor{43da}
@deffn {메서드} forget (tab_id)

`tab_id'로 지정된 탭을 제거하고, 연관된 창을 매핑 취소하고 관리 취소합니다.
@end deffn

@geindex hide() (tkinter.ttk.Notebook 메서드)
@anchor{library/tkinter ttk tkinter ttk Notebook hide}@anchor{43db}
@deffn {메서드} hide (tab_id)

`tab_id'로 지정된 탭을 숨깁니다.

탭은 표시되지 않지만, 관련 창은 노트북에 의해 계속 관리되고 구성이 기억됩니다. 숨겨진 탭은 @ref{43d9,,add()} 명령으로 복원될 수 있습니다.
@end deffn

@geindex identify() (tkinter.ttk.Notebook 메서드)
@anchor{library/tkinter ttk tkinter ttk Notebook identify}@anchor{43dc}
@deffn {메서드} identify (x, y)

위치 `x', `y'의 탭 요소 이름을 반환하거나, 없으면 비어있는 문자열을 반환합니다.
@end deffn

@geindex index() (tkinter.ttk.Notebook 메서드)
@anchor{library/tkinter ttk tkinter ttk Notebook index}@anchor{43d6}
@deffn {메서드} index (tab_id)

`tab_id'로 지정된 탭의 숫자 인덱스를 반환하거나, `tab_id'가 문자열 “end”이면 총 탭 수를 반환합니다.
@end deffn

@geindex insert() (tkinter.ttk.Notebook 메서드)
@anchor{library/tkinter ttk tkinter ttk Notebook insert}@anchor{43dd}
@deffn {메서드} insert (pos, child, **kw)

지정된 위치에 팬(pane)을 삽입합니다.

`pos'는 문자열 “end”, 정수 인덱스 또는 관리되는 자식의 이름입니다. 노트북에서 `child'를 이미 관리하고 있으면, 지정된 위치로 옮깁니다.

사용 가능한 옵션 목록은 @ref{43d3,,탭 옵션}을 참조하십시오.
@end deffn

@geindex select() (tkinter.ttk.Notebook 메서드)
@anchor{library/tkinter ttk tkinter ttk Notebook select}@anchor{43de}
@deffn {메서드} select (tab_id=None)

지정된 `tab_id'를 선택합니다.

연결된 자식 창이 표시되고, 이전에 선택한 창이 (다르다면) 매핑이 취소됩니다. `tab_id'가 생략되면, 현재 선택된 팬의 위젯 이름을 반환합니다.
@end deffn

@geindex tab() (tkinter.ttk.Notebook 메서드)
@anchor{library/tkinter ttk tkinter ttk Notebook tab}@anchor{43df}
@deffn {메서드} tab (tab_id, option=None, **kw)

특정 `tab_id'의 옵션을 조회하거나 수정합니다.

`kw'가 제공되지 않으면, 탭 옵션값의 딕셔너리를 반환합니다. `option'이 지정되면, 해당 `option'의 값을 반환합니다. 그렇지 않으면, 옵션을 해당 값으로 설정합니다.
@end deffn

@geindex tabs() (tkinter.ttk.Notebook 메서드)
@anchor{library/tkinter ttk tkinter ttk Notebook tabs}@anchor{43e0}
@deffn {메서드} tabs ()

노트북에서 관리하는 창의 리스트를 반환합니다.
@end deffn

@geindex enable_traversal() (tkinter.ttk.Notebook 메서드)
@anchor{library/tkinter ttk tkinter ttk Notebook enable_traversal}@anchor{43d4}
@deffn {메서드} enable_traversal ()

이 노트북이 포함된 최상위 창의 키보드 순회를 활성화합니다.

이것은 노트북을 포함하는 최상위 창에 대한 바인딩을 다음과 같이 확장합니다:


@itemize *

@item 
@code{Control}-@code{Tab}: 현재 선택된 탭 다음에 있는 탭을 선택합니다.

@item 
@code{Shift}-@code{Control}-@code{Tab}: 현재 선택된 탭 앞에 있는 탭을 선택합니다.

@item 
@code{Alt}-@code{K}: 여기서 `K'는 탭의 니모닉 (밑줄이 그어진) 문자이며, 해당 탭을 선택합니다.
@end itemize

중첩된 노트북을 포함하여, 단일 최상위 수준에 있는 여러 노트북의 순회를 활성화할 수 있습니다. 그러나, 모든 팬에 마스터로 있는 노트북이 있을 때만 노트북 순회가 제대로 작동합니다.
@end deffn
@end deffn

@node Progressbar,Separator,Notebook,tkinter ttk — Tk 테마 위젯
@anchor{library/tkinter ttk progressbar}@anchor{43e1}
@subsubsection Progressbar


@code{ttk.Progressbar} 위젯은 장기 실행 작업의 상태를 보여줍니다. 두 가지 모드로 동작할 수 있습니다: 1) 수행할 총작업량을 기준으로 완료된 양을 표시하는 확정적(determinate) 모드와 2) 작업이 진행 중임을 사용자에게 알리는 애니메이션 표시를 제공하는 불확정적(indeterminate) 모드입니다.

@menu
* 옵션: 옵션<4>. 
* ttk.Progressbar: ttk Progressbar. 

@end menu

@node 옵션<4>,ttk Progressbar,,Progressbar
@anchor{library/tkinter ttk id5}@anchor{43e2}
@subsubsection 옵션


이 위젯은 다음과 같은 특정 옵션을 받아들입니다:


@multitable {xxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

옵션

@tab

설명

@item

orient

@tab

“horizontal” 또는 “vertical” 중 하나입니다. 진행 막대의 방향을 지정합니다.

@item

length

@tab

진행 막대의 긴 축의 길이를 지정합니다 (가로면 너비, 세로면 높이).

@item

mode

@tab

“determinate” 또는 “indeterminate” 중 하나.

@item

maximum

@tab

최댓값을 지정하는 숫자. 기본값은 100입니다.

@item

value

@tab

진행 막대의 현재 값. “determinate” (확정적) 모드에서는, 완료된 작업량을 나타냅니다. “indeterminate” (불확정적) 모드에서는, 모듈로 `maximum'으로 해석됩니다; 즉, 진행 막대의 값이 `maximum' 증가하면 하나의 “사이클”이 완료됩니다.

@item

variable

@tab

옵션값에 연결된 이름. 지정되면, 진행 막대의 값은 이 이름의 값이 수정될 때마다 이 이름의 값으로 자동 설정됩니다.

@item

phase

@tab

읽기 전용 옵션. 위젯은 값이 0보다 크고 확정적 모드에서 최댓값보다 작을 때마다 이 옵션의 값을 주기적으로 증가시킵니다. 이 옵션은 현재 테마에서 추가 애니메이션 효과를 제공하는 데 사용할 수 있습니다.

@end multitable


@node ttk Progressbar,,옵션<4>,Progressbar
@anchor{library/tkinter ttk ttk-progressbar}@anchor{43e3}
@subsubsection ttk.Progressbar


@geindex Progressbar (tkinter.ttk 클래스)
@anchor{library/tkinter ttk tkinter ttk Progressbar}@anchor{43b7}
@deffn {클래스} tkinter.ttk.Progressbar

@geindex start() (tkinter.ttk.Progressbar 메서드)
@anchor{library/tkinter ttk tkinter ttk Progressbar start}@anchor{43e4}
@deffn {메서드} start (interval=None)

자동 증가 모드를 시작합니다: `interval' 밀리초마다 @ref{43e5,,Progressbar.step()}을 호출하는 반복 타이머 이벤트를 예약합니다. 생략하면, `interval'의 기본값은 50밀리초입니다.
@end deffn

@geindex step() (tkinter.ttk.Progressbar 메서드)
@anchor{library/tkinter ttk tkinter ttk Progressbar step}@anchor{43e5}
@deffn {메서드} step (amount=None)

진행 막대의 값을 `amount'만큼 증가시킵니다.

생략하면 `amount'의 기본값은 1.0입니다.
@end deffn

@geindex stop() (tkinter.ttk.Progressbar 메서드)
@anchor{library/tkinter ttk tkinter ttk Progressbar stop}@anchor{43e6}
@deffn {메서드} stop ()

자동 증가 모드를 중지합니다: 이 진행 막대에 대한 @ref{43e4,,Progressbar.start()}로 시작된 반복 타이머 이벤트를 취소합니다.
@end deffn
@end deffn

@node Separator,Sizegrip,Progressbar,tkinter ttk — Tk 테마 위젯
@anchor{library/tkinter ttk separator}@anchor{43e7}
@subsubsection Separator


@code{ttk.Separator} 위젯은 가로나 세로 구분 막대를 표시합니다.

@code{ttk.Widget}에서 상속된 것 외에 다른 메서드는 없습니다.

@menu
* 옵션: 옵션<5>. 

@end menu

@node 옵션<5>,,,Separator
@anchor{library/tkinter ttk id6}@anchor{43e8}
@subsubsection 옵션


이 위젯은 다음과 같은 특정 옵션을 받아들입니다:


@multitable {xxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

옵션

@tab

설명

@item

orient

@tab

“horizontal”(가로)이나 “vertical”(세로) 중 하나입니다. 구분 막대의 방향을 지정합니다.

@end multitable


@node Sizegrip,Treeview,Separator,tkinter ttk — Tk 테마 위젯
@anchor{library/tkinter ttk sizegrip}@anchor{43e9}
@subsubsection Sizegrip


@code{ttk.Sizegrip} 위젯(확장 상자(grow box)라고도 합니다)을 사용하면 그립(grip)을 누르고 드래그하여 포함하는 최상위 창의 크기를 조정할 수 있습니다.

이 위젯에는 @code{ttk.Widget}에서 상속된 것 외에 특정 옵션이나 메서드가 없습니다.

@menu
* 플랫폼별 노트:: 
* 버그:: 

@end menu

@node 플랫폼별 노트,버그,,Sizegrip
@anchor{library/tkinter ttk platform-specific-notes}@anchor{43ea}
@subsubsection 플랫폼별 노트



@itemize *

@item 
맥 OS에서, 최상위 창에는 기본적으로 내장 크기 그립이 자동으로 포함됩니다. 내장 그립이 위젯을 가리기 때문에 @code{Sizegrip}을 추가하는 것은 무해합니다.
@end itemize

@node 버그,,플랫폼별 노트,Sizegrip
@anchor{library/tkinter ttk bugs}@anchor{43eb}
@subsubsection 버그



@itemize *

@item 
포함하는 최상위 수준의 위치가 화면의 오른쪽이나 아래쪽을 기준으로 지정되면 (예를 들어 ….), @code{Sizegrip} 위젯은 창의 크기를 조정하지 않습니다.

@item 
이 위젯은 “동남쪽” 크기 조정만 지원합니다.
@end itemize

@node Treeview,Ttk 스타일링,Sizegrip,tkinter ttk — Tk 테마 위젯
@anchor{library/tkinter ttk treeview}@anchor{43ec}
@subsubsection Treeview


@code{ttk.Treeview} 위젯은 계층적 항목 컬렉션을 표시합니다. 각 항목에는 텍스트 레이블, 선택적 이미지 및 선택적 데이터값 목록이 있습니다. 데이터값은 트리 레이블 다음에 연속되는 열에 표시됩니다.

위젯 옵션 @code{displaycolumns}를 설정하여 데이터값이 표시되는 순서를 제어할 수 있습니다. 트리 위젯은 열 제목을 표시할 수도 있습니다. 위젯 옵션 열에 나열된 숫자나 기호 이름으로 열에 액세스 할 수 있습니다. @ref{43ed,,열 식별자}를 참조하십시오.

각 항목은 고유한 이름으로 식별됩니다. 호출자가 제공하지 않으면 위젯은 항목 ID를 생성합니다. @code{@{@}}라고 이름 붙은, 구별되는 루트 항목이 있습니다. 루트 항목 자체는 표시되지 않습니다; 이것의 자식들이 계층 구조의 최상위 수준에 나타납니다.

각 항목에는 이벤트 바인딩을 개별 항목과 연관시키고 항목의 모양을 제어하는 데 사용할 수 있는 태그 목록이 있습니다.

Treeview 위젯은 @ref{43bc,,스크롤 가능한 위젯 옵션}에 설명된 옵션과 @ref{43ee,,Treeview.xview()}와 @ref{43ef,,Treeview.yview()} 메서드에 따라 가로와 세로 스크롤을 지원합니다.

@menu
* 옵션: 옵션<6>. 
* 항목 옵션:: 
* 태그 옵션:: 
* 열 식별자:: 
* 가상 이벤트: 가상 이벤트<4>. 
* ttk.Treeview: ttk Treeview. 

@end menu

@node 옵션<6>,항목 옵션,,Treeview
@anchor{library/tkinter ttk id7}@anchor{43f0}
@subsubsection 옵션


이 위젯은 다음과 같은 특정 옵션을 받아들입니다:


@multitable {xxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

옵션

@tab

설명

@item

columns

@tab

열 수와 이름을 지정하는, 열 식별자 리스트.

@item

displaycolumns

@tab

표시할 데이터 열과 표시되는 순서를 지정하는 열 식별자 (기호나 정수 인덱스) 리스트, 또는 문자열 “#all”.

@item

height

@tab

보여야 하는 행 수를 지정합니다. 참고: 요청된 너비는 열 너비의 합계로 결정됩니다.

@item

padding

@tab

위젯의 내부 패딩을 지정합니다. 패딩은 최대 4개의 길이 명세 리스트입니다.

@item

selectmode

@tab

내장 클래스 바인딩이 선택을 관리하는 방법을 제어합니다. “extended”, “browse” 또는 “none” 중 하나입니다. “extended”(기본값)로 설정하면, 여러 항목을 선택할 수 있습니다. “browse”이면, 한 번에 하나의 항목 만 선택됩니다. “none”이면 선택이 변경되지 않습니다.

이 옵션의 값과 관계없이, 응용 프로그램 코드와 태그 바인딩은 원하는 대로 선택을 설정할 수 있음에 유의하십시오.

@item

show

@tab

표시할 트리의 요소를 지정하는, 다음 값 중 0개 이상을 포함하는 리스트.


@itemize *

@item 
tree: 열 #0에 트리 레이블을 표시합니다.

@item 
headings: 제목 행을 표시합니다.
@end itemize

기본값은 “tree headings” 입니다, 즉, 모든 요소를 표시합니다.

`참고': show=”tree” 가 지정되지 않은 경우에도, #0 열은 항상 트리 열을 나타냅니다.

@end multitable


@node 항목 옵션,태그 옵션,옵션<6>,Treeview
@anchor{library/tkinter ttk item-options}@anchor{43f1}
@subsubsection 항목 옵션


insert와 item 위젯 명령에서 항목에 대해 다음 항목 옵션을 지정할 수 있습니다.


@multitable {xxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

옵션

@tab

설명

@item

text

@tab

항목에 표시할 텍스트 레이블.

@item

image

@tab

레이블 왼쪽에 표시되는, Tk 이미지.

@item

values

@tab

항목과 관련된 값의 리스트.

각 항목은 위젯 옵션 열과 같은 수의 값을 가져야 합니다. 열보다 적은 값이 있으면, 나머지 값은 비어 있다고 가정합니다. 열보다 많은 값이 있으면, 추가 값은 무시됩니다.

@item

open

@tab

항목의 자식을 표시할지를 나타내는 @code{True}/@code{False} 값.

@item

tags

@tab

이 항목과 관련된 태그의 리스트.

@end multitable


@node 태그 옵션,열 식별자,항목 옵션,Treeview
@anchor{library/tkinter ttk tag-options}@anchor{43f2}
@subsubsection 태그 옵션


태그에 다음 옵션을 지정할 수 있습니다:


@multitable {xxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

옵션

@tab

설명

@item

foreground

@tab

텍스트 전경색을 지정합니다.

@item

background

@tab

셀이나 항목 배경색을 지정합니다.

@item

font

@tab

텍스트를 그릴 때 사용할 글꼴을 지정합니다.

@item

image

@tab

항목의 image 옵션이 비어있는 경우, 항목 이미지를 지정합니다.

@end multitable


@node 열 식별자,가상 이벤트<4>,태그 옵션,Treeview
@anchor{library/tkinter ttk column-identifiers}@anchor{43ed}
@subsubsection 열 식별자


열 식별자는 다음 형식 중 하나를 취합니다:


@itemize *

@item 
열 옵션 목록에 있는 기호 이름.

@item 
n번째 데이터 열을 지정하는, 정수 n.

@item 
#n 형식의 문자열, 여기서 n은 정수이며 n번째 표시 열을 지정합니다.
@end itemize

노트:


@itemize *

@item 
항목의 옵션 값은 저장된 순서와 다른 순서로 표시될 수 있습니다.

@item 
show=”tree”가 지정되지 않은 경우에도, #0 열은 항상 트리 열을 나타냅니다.
@end itemize

데이터 열 번호는 항목의 옵션 값 리스트에 대한 인덱스입니다; 표시 열 번호는 값이 표시되는 트리의 열 번호입니다. 트리 레이블은 열 #0 에 표시됩니다. displaycolumns 옵션을 설정하지 않으면, 데이터 열 n이 열 #n+1 에 표시됩니다. 다시, `#0 열은 항상 트리 열을 나타냅니다'.

@node 가상 이벤트<4>,ttk Treeview,열 식별자,Treeview
@anchor{library/tkinter ttk id8}@anchor{43f3}
@subsubsection 가상 이벤트


Treeview 위젯은 다음과 같은 가상 이벤트를 생성합니다.


@multitable {xxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

이벤트

@tab

설명

@item

<<TreeviewSelect>>

@tab

선택이 변경될 때마다 생성됩니다.

@item

<<TreeviewOpen>>

@tab

포커스 항목을 open=True 로 설정하기 직전에 생성됩니다.

@item

<<TreeviewClose>>

@tab

포커스 항목을 open=False 로 설정한 직후 생성됩니다.

@end multitable


@ref{43f4,,Treeview.focus()}와 @ref{c86,,Treeview.selection()} 메서드를 사용하여 영향을 받는 항목이나 항목들을 결정할 수 있습니다.

@node ttk Treeview,,가상 이벤트<4>,Treeview
@anchor{library/tkinter ttk ttk-treeview}@anchor{43f5}
@subsubsection ttk.Treeview


@geindex Treeview (tkinter.ttk 클래스)
@anchor{library/tkinter ttk tkinter ttk Treeview}@anchor{c85}
@deffn {클래스} tkinter.ttk.Treeview

@geindex bbox() (tkinter.ttk.Treeview 메서드)
@anchor{library/tkinter ttk tkinter ttk Treeview bbox}@anchor{43f6}
@deffn {메서드} bbox (item, column=None)

지정된 `item'의 경계 상자(트리 뷰 위젯의 창에 상대적인)를 (x, y, 너비, 높이) 형식으로 반환합니다.

`column'을 지정하면, 해당 셀의 경계 상자를 반환합니다. `item'이 보이지 않으면 (즉, 닫힌 항목의 자손이거나 화면 밖으로 스크롤 되면) 빈 문자열을 반환합니다.
@end deffn

@geindex get_children() (tkinter.ttk.Treeview 메서드)
@anchor{library/tkinter ttk tkinter ttk Treeview get_children}@anchor{43f7}
@deffn {메서드} get_children (item=None)

`item'에 속하는 자식의 리스트를 반환합니다.

`item'이 지정되지 않으면, 루트 자식을 반환합니다.
@end deffn

@geindex set_children() (tkinter.ttk.Treeview 메서드)
@anchor{library/tkinter ttk tkinter ttk Treeview set_children}@anchor{43f8}
@deffn {메서드} set_children (item, *newchildren)

`item'의 자식을 `newchildren'으로 바꿉니다.

`item'에 있지만 `newchildren'에 없는 자식은 트리에서 분리됩니다. `newchildren'의 어떤 항목도 `item'의 조상이 될 수 없습니다. `newchildren'을 지정하지 않으면 `item'의 자식이 분리됨에 유의하십시오.
@end deffn

@geindex column() (tkinter.ttk.Treeview 메서드)
@anchor{library/tkinter ttk tkinter ttk Treeview column}@anchor{43f9}
@deffn {메서드} column (column, option=None, **kw)

지정된 `column'에 대한 옵션을 조회하거나 수정합니다.

`kw'가 제공되지 않으면, 열 옵션 값의 딕셔너리를 반환합니다. `option'이 지정되면 해당 `option'의 값이 반환됩니다. 그렇지 않으면, 옵션을 해당 값으로 설정합니다.

유효한 옵션/값은 다음과 같습니다:


@table @asis

@item `id'

열 이름을 반환합니다. 이것은 읽기 전용 옵션입니다.

@item `anchor': 표준 Tk 앵커값 중 하나.

이 열의 텍스트가 셀을 기준으로 정렬되는 방법을 지정합니다.

@item `minwidth': 너비

열의 픽셀 단위의 최소 너비. 위젯의 크기가 조정되거나 사용자가 열을 드래그할 때 트리 뷰 위젯은 이 옵션으로 지정된 것보다 작게 열을 만들지 않습니다.

@item `stretch': @code{True}/@code{False}

위젯 크기를 조정할 때 열 너비를 조정할지를 지정합니다.

@item `width': 너비

열의 픽셀 단위 너비.
@end table

트리 열을 구성하려면, column = “#0” 으로 호출하십시오.
@end deffn

@geindex delete() (tkinter.ttk.Treeview 메서드)
@anchor{library/tkinter ttk tkinter ttk Treeview delete}@anchor{43fa}
@deffn {메서드} delete (*items)

지정된 `items'와 그들의 모든 자손을 삭제합니다.

루트 항목은 삭제되지 않을 수 있습니다.
@end deffn

@geindex detach() (tkinter.ttk.Treeview 메서드)
@anchor{library/tkinter ttk tkinter ttk Treeview detach}@anchor{43fb}
@deffn {메서드} detach (*items)

지정된 `items'를 모두 트리에서 연결 해제합니다.

항목과 그들의 모든 자손은 여전히 존재하며, 트리의 다른 지점에 다시 삽입될 수 있지만, 표시되지는 않습니다.

루트 아이템은 분리되지 않을 수 있습니다.
@end deffn

@geindex exists() (tkinter.ttk.Treeview 메서드)
@anchor{library/tkinter ttk tkinter ttk Treeview exists}@anchor{43fc}
@deffn {메서드} exists (item)

지정된 `item'이 트리에 있으면 @code{True}를 반환합니다.
@end deffn

@geindex focus() (tkinter.ttk.Treeview 메서드)
@anchor{library/tkinter ttk tkinter ttk Treeview focus}@anchor{43f4}
@deffn {메서드} focus (item=None)

`item'이 지정되면, 포커스 항목을 `item'으로 설정합니다. 그렇지 않으면, 현재 포커스 항목을 반환하거나, 없으면 ‘’ 을 반환합니다.
@end deffn

@geindex heading() (tkinter.ttk.Treeview 메서드)
@anchor{library/tkinter ttk tkinter ttk Treeview heading}@anchor{43fd}
@deffn {메서드} heading (column, option=None, **kw)

지정된 `column'에 대한 제목(heading) 옵션을 조회하거나 수정합니다.

`kw'가 제공되지 않으면, 제목 옵션값의 딕셔너리를 반환합니다. `option'이 지정되면 해당 `option'의 값이 반환됩니다. 그렇지 않으면, 옵션을 해당 값으로 설정합니다.

유효한 옵션/값은 다음과 같습니다:


@table @asis

@item `text': 텍스트

열 제목에 표시할 텍스트.

@item `image': 이미지 이름

열 제목의 오른쪽에 표시할 이미지를 지정합니다.

@item `anchor': 앵커

제목 텍스트를 정렬하는 방법을 지정합니다. 표준 Tk 앵커값 중 하나입니다.

@item `command': 콜백

제목 레이블을 누를 때 호출되는 콜백.
@end table

트리 열 제목을 구성하려면, column = “#0” 으로 호출하십시오.
@end deffn

@geindex identify() (tkinter.ttk.Treeview 메서드)
@anchor{library/tkinter ttk tkinter ttk Treeview identify}@anchor{43fe}
@deffn {메서드} identify (component, x, y)

`x' 와 `y'로 주어진 점 밑에 있는 지정된 `component'에 대한 설명을 반환하거나, 해당 `component'가 해당 위치에 없으면 빈 문자열을 반환합니다.
@end deffn

@geindex identify_row() (tkinter.ttk.Treeview 메서드)
@anchor{library/tkinter ttk tkinter ttk Treeview identify_row}@anchor{43ff}
@deffn {메서드} identify_row (y)

`y' 위치에 있는 항목의 항목 ID를 반환합니다.
@end deffn

@geindex identify_column() (tkinter.ttk.Treeview 메서드)
@anchor{library/tkinter ttk tkinter ttk Treeview identify_column}@anchor{4400}
@deffn {메서드} identify_column (x)

위치 `x'에 있는 셀의 데이터 열 식별자를 반환합니다.

트리 열의 ID는 #0 입니다.
@end deffn

@geindex identify_region() (tkinter.ttk.Treeview 메서드)
@anchor{library/tkinter ttk tkinter ttk Treeview identify_region}@anchor{4401}
@deffn {메서드} identify_region (x, y)

다음 중 하나를 반환합니다:


@multitable {xxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

영역(region)

@tab

의미

@item

heading

@tab

트리 제목 영역.

@item

separator

@tab

두 열 제목 사이의 공간.

@item

tree

@tab

트리 영역.

@item

cell

@tab

데이터 셀.

@end multitable


가용성: Tk 8.6.
@end deffn

@geindex identify_element() (tkinter.ttk.Treeview 메서드)
@anchor{library/tkinter ttk tkinter ttk Treeview identify_element}@anchor{4402}
@deffn {메서드} identify_element (x, y)

위치 `x', `y'에 있는 요소를 반환합니다.

가용성: Tk 8.6.
@end deffn

@geindex index() (tkinter.ttk.Treeview 메서드)
@anchor{library/tkinter ttk tkinter ttk Treeview index}@anchor{4403}
@deffn {메서드} index (item)

부모의 자식 리스트에서 `item'의 정수 인덱스를 반환합니다.
@end deffn

@geindex insert() (tkinter.ttk.Treeview 메서드)
@anchor{library/tkinter ttk tkinter ttk Treeview insert}@anchor{4404}
@deffn {메서드} insert (parent, index, iid=None, **kw)

새 항목을 만들고 새로 만들어진 항목의 항목 ID를 반환합니다.

`parent'는 부모 항목의 항목 ID이거나, 새 최상위 항목을 만들려면 빈 문자열입니다. `index'는 정수이거나, “end” 값으로, 부모의 자식 리스트에서 새 항목을 삽입할 위치를 지정합니다. `index'가 0보다 작거나 같으면, 새 노드가 처음에 삽입됩니다; `index'가 현재 자식 수보다 크거나 같으면, 끝에 삽입됩니다. `iid'가 지정되면, 항목 식별자로 사용됩니다; `iid'는 아직 트리에 존재하지 않아야 합니다. 그렇지 않으면, 새로운 고유 식별자가 생성됩니다.

사용 가능한 옵션 목록은 @ref{43f1,,Item Options}을 참조하십시오.
@end deffn

@geindex item() (tkinter.ttk.Treeview 메서드)
@anchor{library/tkinter ttk tkinter ttk Treeview item}@anchor{4405}
@deffn {메서드} item (item, option=None, **kw)

지정된 `item'에 대한 옵션을 조회하거나 수정합니다.

옵션이 제공되지 않으면 항목에 대한 옵션/값이 포함된 딕셔너리가 반환됩니다. `option'이 지정되면 해당 옵션의 값이 반환됩니다. 그렇지 않으면, 옵션을 `kw'에서 제공한 해당 값으로 설정합니다.
@end deffn

@geindex move() (tkinter.ttk.Treeview 메서드)
@anchor{library/tkinter ttk tkinter ttk Treeview move}@anchor{4406}
@deffn {메서드} move (item, parent, index)

`item'을 `parent'의 자식 리스트에서 `index' 위치로 이동합니다.

항목을 그 자신의 자손 항목 중 하나 밑으로 이동하는 것은 불법입니다. `index'가 0보다 작거나 같으면, `item'이 처음으로 이동합니다; 자식 수보다 크거나 같으면, 끝으로 이동합니다. `item'이 분리되었으면 다시 연결됩니다.
@end deffn

@geindex next() (tkinter.ttk.Treeview 메서드)
@anchor{library/tkinter ttk tkinter ttk Treeview next}@anchor{4407}
@deffn {메서드} next (item)

`item'의 다음 형제의 식별자를 반환하거나, `item'이 부모의 마지막 자식이면 ‘’ 을 반환합니다.
@end deffn

@geindex parent() (tkinter.ttk.Treeview 메서드)
@anchor{library/tkinter ttk tkinter ttk Treeview parent}@anchor{4408}
@deffn {메서드} parent (item)

`item'의 부모 ID를 반환하거나, `item'이 계층의 최상위에 있으면 ‘’ 을 반환합니다.
@end deffn

@geindex prev() (tkinter.ttk.Treeview 메서드)
@anchor{library/tkinter ttk tkinter ttk Treeview prev}@anchor{4409}
@deffn {메서드} prev (item)

`item'의 이전 형제의 식별자를 반환하거나, `item'이 부모의 첫 번째 자식이면 ‘’ 을 반환합니다.
@end deffn

@geindex reattach() (tkinter.ttk.Treeview 메서드)
@anchor{library/tkinter ttk tkinter ttk Treeview reattach}@anchor{440a}
@deffn {메서드} reattach (item, parent, index)

@ref{4406,,Treeview.move()}의 별칭.
@end deffn

@geindex see() (tkinter.ttk.Treeview 메서드)
@anchor{library/tkinter ttk tkinter ttk Treeview see}@anchor{440b}
@deffn {메서드} see (item)

`item'이 보이도록 합니다.

`item'의 모든 조상의 open 옵션을 @code{True}로 설정하고, 필요하면 위젯을 스크롤 하여 `item'이 트리의 보이는 부분 내에 있도록 합니다.
@end deffn

@geindex selection() (tkinter.ttk.Treeview 메서드)
@anchor{library/tkinter ttk tkinter ttk Treeview selection}@anchor{c86}
@deffn {메서드} selection ()

선택한 항목의 튜플을 반환합니다.


버전 3.8에서 변경: @code{selection()}은 더는 인자를 취하지 않습니다. 선택 상태를 변경하려면 다음 선택 메서드를 사용하십시오.

@end deffn

@geindex selection_set() (tkinter.ttk.Treeview 메서드)
@anchor{library/tkinter ttk tkinter ttk Treeview selection_set}@anchor{c87}
@deffn {메서드} selection_set (*items)

`items'가 새로운 선택이 됩니다.


버전 3.6에서 변경: `items'는 단일 튜플이 아닌 별도의 인자로 전달될 수 있습니다.

@end deffn

@geindex selection_add() (tkinter.ttk.Treeview 메서드)
@anchor{library/tkinter ttk tkinter ttk Treeview selection_add}@anchor{440c}
@deffn {메서드} selection_add (*items)

선택에 `items'를 추가합니다.


버전 3.6에서 변경: `items'는 단일 튜플이 아닌 별도의 인자로 전달될 수 있습니다.

@end deffn

@geindex selection_remove() (tkinter.ttk.Treeview 메서드)
@anchor{library/tkinter ttk tkinter ttk Treeview selection_remove}@anchor{440d}
@deffn {메서드} selection_remove (*items)

선택에서 `items'를 제거합니다.


버전 3.6에서 변경: `items'는 단일 튜플이 아닌 별도의 인자로 전달될 수 있습니다.

@end deffn

@geindex selection_toggle() (tkinter.ttk.Treeview 메서드)
@anchor{library/tkinter ttk tkinter ttk Treeview selection_toggle}@anchor{440e}
@deffn {메서드} selection_toggle (*items)

`items'에 있는 각 항목의 선택 상태를 토글 합니다.


버전 3.6에서 변경: `items'는 단일 튜플이 아닌 별도의 인자로 전달될 수 있습니다.

@end deffn

@geindex set() (tkinter.ttk.Treeview 메서드)
@anchor{library/tkinter ttk tkinter ttk Treeview set}@anchor{440f}
@deffn {메서드} set (item, column=None, value=None)

하나의 인자로는, 지정된 `item'에 대한 열/값 쌍 딕셔너리를 반환합니다. 두 개의 인자를 사용하면, 지정된 `column'의 현재 값을 반환합니다. 세 개의 인자를 사용하면, 지정된 `item'의 지정된 `column'의 값을, 지정된 `value'로 설정합니다.
@end deffn

@geindex tag_bind() (tkinter.ttk.Treeview 메서드)
@anchor{library/tkinter ttk tkinter ttk Treeview tag_bind}@anchor{4410}
@deffn {메서드} tag_bind (tagname, sequence=None, callback=None)

주어진 이벤트 `sequence'에 대한 콜백을 태그 `tagname'에 바인딩합니다. 이벤트가 항목에 전달되면, 각 항목의 태그 옵션에 대한 콜백이 호출됩니다.
@end deffn

@geindex tag_configure() (tkinter.ttk.Treeview 메서드)
@anchor{library/tkinter ttk tkinter ttk Treeview tag_configure}@anchor{4411}
@deffn {메서드} tag_configure (tagname, option=None, **kw)

지정된 `tagname'에 대한 옵션을 조회하거나 수정합니다.

`kw'가 제공되지 않으면, `tagname'에 대한 옵션 설정의 딕셔너리를 반환합니다. `option'이 지정되면, 지정된 `tagname'에 대한 해당 `option'의 값을 반환합니다. 그렇지 않으면, 옵션을 주어진 `tagname'에 대해 해당하는 값으로 설정합니다.
@end deffn

@geindex tag_has() (tkinter.ttk.Treeview 메서드)
@anchor{library/tkinter ttk tkinter ttk Treeview tag_has}@anchor{4412}
@deffn {메서드} tag_has (tagname, item=None)

`item'이 지정되면, 지정된 `item'에 지정된 `tagname'이 있는지에 따라 1이나 0을 반환합니다. 그렇지 않으면, 지정된 태그가 있는 모든 항목의 리스트를 반환합니다.

가용성: Tk 8.6
@end deffn

@geindex xview() (tkinter.ttk.Treeview 메서드)
@anchor{library/tkinter ttk tkinter ttk Treeview xview}@anchor{43ee}
@deffn {메서드} xview (*args)

트리 뷰의 가로 위치를 조회하거나 수정합니다.
@end deffn

@geindex yview() (tkinter.ttk.Treeview 메서드)
@anchor{library/tkinter ttk tkinter ttk Treeview yview}@anchor{43ef}
@deffn {메서드} yview (*args)

트리 뷰의 수직 위치를 조회하거나 수정합니다.
@end deffn
@end deffn

@node Ttk 스타일링,,Treeview,tkinter ttk — Tk 테마 위젯
@anchor{library/tkinter ttk ttk-styling}@anchor{4413}@anchor{library/tkinter ttk ttkstyling}@anchor{43b9}
@subsubsection Ttk 스타일링


@code{ttk}의 각 위젯에는 스타일이 지정되는데, 이 스타일은 요소 옵션의 동적 및 기본 설정과 함께 위젯을 구성하는 요소 집합과 배열 방식을 지정합니다. 기본적으로 스타일 이름은 위젯의 클래스 이름과 같지만, 위젯의 스타일 옵션으로 재정의될 수 있습니다. 위젯의 클래스 이름을 모르면, @code{Misc.winfo_class()} 메서드(somewidget.winfo_class())를 사용하십시오.


@subsubheading 더 보기



@table @asis

@item Tcl'2004 conference presentation@footnote{https://tktable.sourceforge.net/tile/tile-tcl2004.pdf}

이 문서는 테마 엔진의 작동 방식을 설명합니다
@end table


@geindex Style (tkinter.ttk 클래스)
@anchor{library/tkinter ttk tkinter ttk Style}@anchor{55e}
@deffn {클래스} tkinter.ttk.Style

이 클래스는 스타일 데이터베이스를 조작하는 데 사용됩니다.

@geindex configure() (tkinter.ttk.Style 메서드)
@anchor{library/tkinter ttk tkinter ttk Style configure}@anchor{4414}
@deffn {메서드} configure (style, query_opt=None, **kw)

`style'에서 지정된 옵션의 기본값을 조회하거나 설정합니다.

`kw'의 각 키는 옵션이며 각 값은 해당 옵션의 값을 식별하는 문자열입니다.

예를 들어, 모든 기본 버튼을 패딩이 있고 배경색이 다른 평평한 버튼으로 바꾸려면:

@example
from tkinter import ttk
import tkinter

root = tkinter.Tk()

ttk.Style().configure("TButton", padding=6, relief="flat",
   background="#ccc")

btn = ttk.Button(text="Sample")
btn.pack()

root.mainloop()
@end example
@end deffn

@geindex map() (tkinter.ttk.Style 메서드)
@anchor{library/tkinter ttk tkinter ttk Style map}@anchor{1ce3}
@deffn {메서드} map (style, query_opt=None, **kw)

`style'에서 지정된 옵션의 동적 값을 조회하거나 설정합니다.

`kw'의 각 키는 옵션이며 각 값은 (일반적으로) 튜플, 리스트 또는 다른 선호하는 것에 그룹화된 상태 명세(statespecs)를 포함하는 리스트나 튜플이어야 합니다. 상태 명세(statespec)는 하나 이상의 상태와 그다음에 값이 오는 복합체입니다.

예를 들면 더 이해하기 쉽습니다:

@example
import tkinter
from tkinter import ttk

root = tkinter.Tk()

style = ttk.Style()
style.map("C.TButton",
    foreground=[('pressed', 'red'), ('active', 'blue')],
    background=[('pressed', '!disabled', 'black'), ('active', 'white')]
    )

colored_btn = ttk.Button(text="Test", style="C.TButton").pack()

root.mainloop()
@end example

옵션의 (상태들, 값) 시퀀스의 순서는 중요함에 유의하십시오. 예를 들어, foreground 옵션에서 순서가 @code{[('active', 'blue'), ('pressed', 'red')]}로 변경되면, 예를 들어, 위젯이 active 나 pressed 상태일 때 결과는 파란색 전경이 됩니다.
@end deffn

@geindex lookup() (tkinter.ttk.Style 메서드)
@anchor{library/tkinter ttk tkinter ttk Style lookup}@anchor{4415}
@deffn {메서드} lookup (style, option, state=None, default=None)

`style'에서 `option'에 지정된 값을 반환합니다.

`state'가 지정되면, 하나 이상의 상태 시퀀스일 것으로 기대됩니다. `default' 인자가 설정되면, 옵션에 대한 명세가 없을 때 폴 백값으로 사용됩니다.

Button이 기본적으로 사용하는 글꼴을 확인하려면:

@example
from tkinter import ttk

print(ttk.Style().lookup("TButton", "font"))
@end example
@end deffn

@geindex layout() (tkinter.ttk.Style 메서드)
@anchor{library/tkinter ttk tkinter ttk Style layout}@anchor{4416}
@deffn {메서드} layout (style, layoutspec=None)

주어진 `style'에 대한 위젯 레이아웃을 정의합니다. `layoutspec'이 생략되면, 지정된 스타일의 레이아웃 명세를 반환합니다.

지정되면, `layoutspec'은 리스트나 다른 시퀀스 형(문자열 제외)이어야 합니다. 여기서 각 항목은 튜플이어야 하고 첫 번째 항목은 레이아웃 이름이고 두 번째 항목은 @ref{4417,,레이아웃}에 설명된 형식이어야 합니다.

형식을 이해하려면, 다음 예제를 참조하십시오 (유용한 것은 아닙니다):

@example
from tkinter import ttk
import tkinter

root = tkinter.Tk()

style = ttk.Style()
style.layout("TMenubutton", [
   ("Menubutton.background", None),
   ("Menubutton.button", @{"children":
       [("Menubutton.focus", @{"children":
           [("Menubutton.padding", @{"children":
               [("Menubutton.label", @{"side": "left", "expand": 1@})]
           @})]
       @})]
   @}),
])

mbtn = ttk.Menubutton(text='Text')
mbtn.pack()
root.mainloop()
@end example
@end deffn

@geindex element_create() (tkinter.ttk.Style 메서드)
@anchor{library/tkinter ttk tkinter ttk Style element_create}@anchor{55f}
@deffn {메서드} element_create (elementname, etype, *args, **kw)

현재 테마에서 주어진 `etype'의 새 요소를 만듭니다. `etype'은 “image”, “from” 또는 “vsapi”일 것으로 기대됩니다. 마지막 것은 윈도우 용 Tk 8.6에서만 사용할 수 있습니다.

“image”를 사용하면, `args'는 기본 이미지 이름과 그 뒤에 오는 statespec/value 쌍 (이것이 이미지 명세(imagespec)입니다)을 포함해야 하며, `kw'에는 다음 옵션이 올 수 있습니다:


@table @asis

@item border=padding

패딩은 각각 좌(left), 상(top), 우(right), 하(bottom) 테두리를 지정하는 최대 4개의 정수 리스트입니다.

@item height=height

요소의 최소 높이를 지정합니다. 0보다 작으면, 기본 이미지의 높이가 기본값으로 사용됩니다.

@item padding=padding

요소의 내부 패딩을 지정합니다. 지정하지 않으면 기본값은 border의 값입니다.

@item sticky=spec

최종 파슬(parcel) 내에 이미지를 배치하는 방법을 지정합니다. 명세에는 0개 이상의 문자 “n”, “s”, “w” 또는 “e” 가 포함됩니다.

@item width=width

요소의 최소 너비를 지정합니다. 0보다 작으면, 기본 이미지의 너비가 기본값으로 사용됩니다.
@end table

예제:

@example
img1 = tkinter.PhotoImage(master=root, file='button.png')
img1 = tkinter.PhotoImage(master=root, file='button-pressed.png')
img1 = tkinter.PhotoImage(master=root, file='button-active.png')
style = ttk.Style(root)
style.element_create('Button.button', 'image',
                     img1, ('pressed', img2), ('active', img3),
                     border=(2, 4), sticky='we')
@end example

“from”이 `etype'의 값으로 사용되면, @ref{55f,,element_create()}는 기존 요소를 복제합니다. `args'는 요소를 복제할 테마 이름(themename)과, 선택적으로 요소를 복제할 요소를 포함할 것으로 기대됩니다. 복제할 요소를 지정하지 않으면, 빈 요소가 사용됩니다. `kw'는 폐기됩니다.

예제:

@example
style = ttk.Style(root)
style.element_create('plain.background', 'from', 'default')
@end example

If “vsapi” is used as the value of `etype', @code{element_create()}
will create a new element in the current theme whose visual appearance
is drawn using the Microsoft Visual Styles API which is responsible
for the themed styles on Windows XP and Vista.
`args' is expected to contain the Visual Styles class and part as
given in the Microsoft documentation followed by an optional sequence
of tuples of ttk states and the corresponding Visual Styles API state
value.
`kw' may have the following options:


@table @asis

@item padding=padding

Specify the element’s interior padding.
`padding' is a list of up to four integers specifying the left,
top, right and bottom padding quantities respectively.
If fewer than four elements are specified, bottom defaults to top,
right defaults to left, and top defaults to left.
In other words, a list of three numbers specify the left, vertical,
and right padding; a list of two numbers specify the horizontal
and the vertical padding; a single number specifies the same
padding all the way around the widget.
This option may not be mixed with any other options.

@item margins=padding

요소 외부 패딩을 지정합니다. `padding'은 각각 좌(left), 상(top), 우(right), 하(bottom) 패딩량을 지정하는 최대 4개의 정수 리스트입니다. 이 옵션은 다른 옵션과 함께 사용할 수 없습니다.

@item width=width

Specifies the width for the element.
If this option is set then the Visual Styles API will not be queried
for the recommended size or the part.
If this option is set then `height' should also be set.
The `width' and `height' options cannot be mixed with the `padding'
or `margins' options.

@item height=height

Specifies the height of the element.
See the comments for `width'.
@end table

예제:

@example
style = ttk.Style(root)
style.element_create('pin', 'vsapi', 'EXPLORERBAR', 3, [
                     ('pressed', '!selected', 3),
                     ('active', '!selected', 2),
                     ('pressed', 'selected', 6),
                     ('active', 'selected', 5),
                     ('selected', 4),
                     ('@w{'}, 1)])
style.layout('Explorer.Pin',
             [('Explorer.Pin.pin', @{'sticky': 'news'@})])
pin = ttk.Checkbutton(style='Explorer.Pin')
pin.pack(expand=True, fill='both')
@end example


버전 3.13에서 변경: Added support of the “vsapi” element factory.

@end deffn

@geindex element_names() (tkinter.ttk.Style 메서드)
@anchor{library/tkinter ttk tkinter ttk Style element_names}@anchor{4418}
@deffn {메서드} element_names ()

현재 테마에 정의된 요소 목록을 반환합니다.
@end deffn

@geindex element_options() (tkinter.ttk.Style 메서드)
@anchor{library/tkinter ttk tkinter ttk Style element_options}@anchor{4419}
@deffn {메서드} element_options (elementname)

`elementname'의 옵션 리스트를 반환합니다.
@end deffn

@geindex theme_create() (tkinter.ttk.Style 메서드)
@anchor{library/tkinter ttk tkinter ttk Style theme_create}@anchor{441a}
@deffn {메서드} theme_create (themename, parent=None, settings=None)

새로운 테마를 만듭니다.

`themename'이 이미 존재하면 에러입니다. `parent'가 지정되면, 새 테마는 부모 테마에서 스타일, 요소 및 레이아웃을 상속합니다. `settings'가 있으면, @ref{441b,,theme_settings()}에 사용되는 것과 같은 문법일 것으로 기대됩니다.
@end deffn

@geindex theme_settings() (tkinter.ttk.Style 메서드)
@anchor{library/tkinter ttk tkinter ttk Style theme_settings}@anchor{441b}
@deffn {메서드} theme_settings (themename, settings)

현재 테마를 `themename'으로 임시 설정하고, 지정된 `settings'를 적용한 다음 이전 테마를 복원합니다.

`settings'의 각 키는 스타일이며 각 값에는 ‘configure’, ‘map’, ‘layout’ 및 ‘element create’ 키가 포함될 수 있으며 각각 @ref{4414,,Style.configure()}, @ref{1ce3,,Style.map()}, @ref{4416,,Style.layout()} 및 @ref{55f,,Style.element_create()}가 지정한 것과 같은 형식을 갖습니다.

예를 들어, 기본 테마의 Combobox를 약간 변경해 봅시다:

@example
from tkinter import ttk
import tkinter

root = tkinter.Tk()

style = ttk.Style()
style.theme_settings("default", @{
   "TCombobox": @{
       "configure": @{"padding": 5@},
       "map": @{
           "background": [("active", "green2"),
                          ("!disabled", "green4")],
           "fieldbackground": [("!disabled", "green3")],
           "foreground": [("focus", "OliveDrab1"),
                          ("!disabled", "OliveDrab2")]
       @}
   @}
@})

combo = ttk.Combobox().pack()

root.mainloop()
@end example
@end deffn

@geindex theme_names() (tkinter.ttk.Style 메서드)
@anchor{library/tkinter ttk tkinter ttk Style theme_names}@anchor{441c}
@deffn {메서드} theme_names ()

알려진 모든 테마의 리스트를 반환합니다.
@end deffn

@geindex theme_use() (tkinter.ttk.Style 메서드)
@anchor{library/tkinter ttk tkinter ttk Style theme_use}@anchor{441d}
@deffn {메서드} theme_use (themename=None)

`themename'이 제공되지 않으면, 사용 중인 테마를 반환합니다. 그렇지 않으면, 현재 테마를 `themename'으로 설정하고, 모든 위젯을 새로 고치고 <<ThemeChanged>> 이벤트를 방출합니다.
@end deffn
@end deffn

@menu
* 레이아웃:: 

@end menu

@node 레이아웃,,,Ttk 스타일링
@anchor{library/tkinter ttk layouts}@anchor{4417}
@subsubsection 레이아웃


레이아웃은 옵션을 취하지 않으면 @code{None}일 수 있습니다, 또는 요소를 정렬하는 방법을 지정하는 옵션의 딕셔너리입니다. 레이아웃 메커니즘은 pack 지오메트리 관리자의 단순화 된 버전을 사용합니다: 초기 캐비티(cavity)가 주어지면, 각 요소에는 파슬(parcel)이 할당됩니다.

유효한 옵션/값은 다음과 같습니다:


@table @asis

@item `side': whichside

요소를 배치할 캐비티(cavity)의 변을 지정합니다; 상(top), 우(right), 하(bottom) 또는 좌(left) 중 하나입니다. 생략하면, 요소가 전체 캐비티를 차지합니다.

@item `sticky': nswe

할당된 파슬(parcel)에서 요소가 배치되는 위치를 지정합니다.

@item `unit': 0 또는 1

1로 설정하면, @ref{43c2,,Widget.identify()} 등의 목적으로 요소와 그것의 모든 자손이 단일 요소로 처리됩니다. 그립이 있는 스크롤 막대 썸(thumbs)과 같은 것들에 사용됩니다.

@item `children': [sublayout… ]

요소 안에 배치할 요소 리스트를 지정합니다. 각 요소는 첫 번째 항목이 레이아웃 이름이고, 다른 하나는 @ref{4417,,레이아웃}인 튜플(또는 다른 시퀀스 형)입니다.
@end table
@anchor{library/tkinter ttk layout}@anchor{441e}
@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node IDLE — 파이썬 편집기와 셸,turtle — Turtle graphics,tkinter ttk — Tk 테마 위젯,Graphical user interfaces with Tk
@anchor{library/idle doc}@anchor{441f}@anchor{library/idle idle}@anchor{1214}@anchor{library/idle idle-python-editor-and-shell}@anchor{4420}@anchor{library/idle translation-repo}@anchor{4421}
@subsection IDLE — 파이썬 편집기와 셸


`소스 코드:' Lib/idlelib/@footnote{https://github.com/python/cpython/tree/3.14/Lib/idlelib/}

@geindex IDLE
@geindex 파이썬 편집기
@geindex 통합 개발 환경

@c Remember to update Lib/idlelib/help.html with idlelib.help.copy_strip() when modifying this file.


__________________________________________________________________


IDLE은 파이썬의 통합 개발 및 학습 환경입니다.

IDLE에는 다음과 같은 기능이 있습니다:


@itemize *

@item 
크로스 플랫폼: 윈도우, 유닉스 및 macOS에서 거의 같게 작동합니다

@item 
코드 입력, 출력 및 에러 메시지를 채색하는 파이썬 셸 창 (대화식 인터프리터)

@item 
다중 실행 취소, 파이썬 색상 지정, 스마트 들여쓰기, 호출 팁, 자동 완성 및 기타 기능이 있는 다중 창 텍스트 편집기

@item 
모든 창 내에서 검색, 편집기 창 내에서 교체 및 여러 파일을 통한 검색 (grep)

@item 
지속적인 중단점(breakpoints), 스테핑(stepping) 및 전역과 지역 이름 공간 보기가 있는 디버거

@item 
구성, 브라우저 및 기타 대화 상자
@end itemize

The IDLE application is implemented in the @ref{77,,idlelib} package.

This is an @ref{2157,,optional module}.
If it is missing from your copy of CPython,
look for documentation from your distributor (that is,
whoever provided Python to you).
If you are the distributor, see @ref{2155,,Requirements for optional modules}.

@c Similar notes appear in the docs of the modules:
@c - zipfile
@c - tarfile

@menu
* 메뉴:: 
* 편집과 탐색:: 
* 시작과 코드 실행:: 
* 도움말과 환경 설정:: 
* idlelib — IDLE 응용 프로그램의 구현:: 

@end menu

@node 메뉴,편집과 탐색,,IDLE — 파이썬 편집기와 셸
@anchor{library/idle menus}@anchor{4422}
@subsubsection 메뉴


IDLE에는 두 가지 메인 창 유형이 있습니다, 셸 창과 편집기 창. 여러 개의 편집기 창을 동시에 가질 수 있습니다. 윈도우와 리눅스에서는, 각각 자신의 최상위 메뉴가 있습니다. 아래에 설명된 각 메뉴는 어떤 창 유형과 관련되는지를 나타냅니다.

가령 Edit => Find in Files 에서 사용되는 것과 같은 출력 창은 편집기 창의 하위 유형입니다. 현재 같은 최상위 메뉴가 있지만, 기본 제목과 문맥 메뉴가 다릅니다.

macOS에는, 하나의 응용 프로그램 메뉴가 있습니다. 현재 선택된 창에 따라 동적으로 변경됩니다. IDLE 메뉴가 있으며, 아래 설명된 일부 항목은 Apple 지침에 따라 이동됩니다.

@menu
* File 메뉴 (셸과 편집기): File 메뉴 셸과 편집기. 
* Edit 메뉴 (셸과 편집기): Edit 메뉴 셸과 편집기. 
* Format 메뉴 (편집기 창 전용): Format 메뉴 편집기 창 전용. 
* Run 메뉴 (편집기 창 전용): Run 메뉴 편집기 창 전용. 
* Shell 메뉴 (셸 창 전용): Shell 메뉴 셸 창 전용. 
* Debug 메뉴 (셸 창 전용): Debug 메뉴 셸 창 전용. 
* Options 메뉴 (셸과 편집기): Options 메뉴 셸과 편집기. 
* Window 메뉴 (셸과 편집기): Window 메뉴 셸과 편집기. 
* Help 메뉴 (셸과 편집기): Help 메뉴 셸과 편집기. 
* Context 메뉴:: 

@end menu

@node File 메뉴 셸과 편집기,Edit 메뉴 셸과 편집기,,메뉴
@anchor{library/idle file-menu-shell-and-editor}@anchor{4423}
@subsubsection File 메뉴 (셸과 편집기)



@table @asis

@item New File

새 파일 편집 창을 만듭니다.

@item Open…

열기 대화 상자로 기존 파일을 엽니다.

@item Open Module…

기존 모듈을 엽니다 (sys.path를 검색합니다).

@item Recent Files

최근 파일의 목록을 엽니다. 하나를 클릭하여 엽니다.
@end table

@geindex 모듈 브라우저
@geindex 경로 브라우저


@table @asis

@item Module Browser

현재 편집기 파일의 함수, 클래스 및 메서드를 트리 구조로 표시합니다. 셸에서, 모듈을 먼저 여십시오.

@item Path Browser

sys.path 디렉터리, 모듈, 함수, 클래스 및 메서드를 트리 구조로 표시합니다.

@item Save

현재 창을 (있다면) 연관된 파일에 저장합니다. 열거나 마지막으로 저장한 이후에 변경된 창에는 창 제목 앞뒤에 * 가 있습니다. 연결된 파일이 없으면, 대신 Save As 를 수행합니다.

@item Save As…

Save the current window with a Save As dialog.  The file saved becomes the
new associated file for the window. (If your file manager is set to hide
extensions, the current extension will be omitted in the file name box.
If the new filename has no ‘.’, ‘.py’ and ‘.txt’ will be added for Python
and text files, except that on macOS Aqua,’.py’ is added for all files.)

@item Save Copy As…

연관된 파일을 변경하지 않고 현재 창을 다른 파일에 저장합니다. (파일명 확장자에 대해서는 위의 Save As 참고 사항을 참조하십시오.)

@item Print Window

현재 창을 기본 프린터로 인쇄합니다.

@item Close Window

현재 창을 닫습니다 (저장하지 않은 편집기면, 저장하도록 요청합니다; 저장하지 않은 셸이면, 실행을 중단하도록 요청합니다. 셸 창에서 @code{exit()}나 @code{close()}를 호출하면 셸을 닫습니다. 만약 이 것이 유일한 창이면, IDLE 도 종료합니다.).

@item Exit IDLE

모든 창을 닫고 IDLE을 종료합니다 (저장되지 않은 편집 창을 저장하도록 요청합니다).
@end table

@node Edit 메뉴 셸과 편집기,Format 메뉴 편집기 창 전용,File 메뉴 셸과 편집기,메뉴
@anchor{library/idle edit-menu-shell-and-editor}@anchor{4424}
@subsubsection Edit 메뉴 (셸과 편집기)



@table @asis

@item Undo

현재 창에 대한 마지막 변경을 되돌립니다. 최대 1000개의 변경을 되돌릴 수 있습니다.

@item Redo

마지막으로 되돌린 변경을 현재 창에 다시 실행합니다.

@item Select All

현재 창의 전체 내용을 선택합니다.

@item Cut

선택 사항을 시스템 전체 클립 보드에 복사합니다; 그런 다음 선택을 삭제합니다.

@item Copy

선택 사항을 시스템 전체 클립 보드에 복사합니다.

@item Paste

시스템 전체 클립 보드의 내용을 현재 창에 삽입합니다.
@end table

클립 보드 기능은 문맥 메뉴에서도 사용할 수 있습니다.


@table @asis

@item Find…

많은 옵션이 제공되는 검색 대화 상자를 엽니다

@item Find Again

마지막 검색이 있으면 반복합니다.

@item Find Selection

현재 선택된 문자열이 있으면 검색합니다.

@item Find in Files…

파일 검색 대화 상자를 엽니다. 새로운 출력 창에 결과를 넣습니다.

@item Replace…

검색과 치환 대화 상자를 엽니다.

@item Go to Line

요청한 줄의 시작 부분으로 커서를 이동하고 해당 줄을 표시합니다. 파일 끝을 지나는 요청은 파일의 끝으로 갑니다. 모든 선택을 취소하고 줄과 열 상태를 갱신합니다.

@item Show Completions

Open a scrollable list allowing selection of existing names. See
@ref{4425,,Completions} in the Editing and Navigation section below.

@item Expand Word

같은 창에서 전체 단어와 일치하도록 입력한 접두사를 확장합니다; 다른 확장을 얻으려면 반복하십시오.

@item Show Call Tip

After an unclosed parenthesis for a function, open a small window with
function parameter hints.  See @ref{4426,,Calltips} in the
Editing and Navigation section below.

@item Show Surrounding Parens

주변 괄호를 강조 표시합니다.
@end table

@node Format 메뉴 편집기 창 전용,Run 메뉴 편집기 창 전용,Edit 메뉴 셸과 편집기,메뉴
@anchor{library/idle format-menu}@anchor{4427}@anchor{library/idle format-menu-editor-window-only}@anchor{4428}
@subsubsection Format 메뉴 (편집기 창 전용)



@table @asis

@item Format Paragraph

Rewrap the text block containing the text insert cursor.
Avoid code lines.  See @ref{4429,,Format block} in the
Editing and Navigation section below.

@item Indent Region

선택한 줄을 들여쓰기 너비(기본값은 4개의 스페이스)만큼 오른쪽으로 이동합니다.

@item Dedent Region

선택한 줄을 들여쓰기 너비(기본값은 4개의 스페이스)만큼 왼쪽으로 이동합니다.

@item Comment Out Region

선택한 줄 앞에 ## 을 삽입합니다.

@item Uncomment Region

선택한 줄에서 선행 # 이나 ## 을 제거합니다.

@item Tabify Region

연속된 `선행' 스페이스를 탭으로 바꿉니다. (참고: 4개의 스페이스 블록을 사용하여 파이썬 코드를 들여 쓰는 것이 좋습니다.)

@item Untabify Region

`모든' 탭을 올바른 수의 스페이스로 바꿉니다.

@item Toggle Tabs

스페이스와 탭 들여쓰기 간을 전환하는 대화 상자를 엽니다.

@item New Indent Width

들여쓰기 너비를 변경하는 대화 상자를 엽니다. 파이썬 커뮤니티에서 받아들여지는 기본값은 4개의 스페이스입니다.

@item Strip Trailing Whitespace

Remove trailing space and other whitespace characters after the last
non-whitespace character of a line by applying @ref{16b6,,str.rstrip()} to each line,
including lines within multiline strings.  Except for Shell windows,
remove extra newlines at the end of the file.
@end table

@geindex 스크립트 실행

@node Run 메뉴 편집기 창 전용,Shell 메뉴 셸 창 전용,Format 메뉴 편집기 창 전용,메뉴
@anchor{library/idle run-menu-editor-window-only}@anchor{442a}
@subsubsection Run 메뉴 (편집기 창 전용)

@anchor{library/idle run-module}@anchor{442b}

@table @asis

@item Run Module

@ref{442c,,Check Module}을 수행합니다. 에러가 없으면, 셸을 다시 시작하여 환경을 정리한 다음, 모듈을 실행합니다. 출력은 셸 창에 표시됩니다. 출력에는 @code{print}나 @code{write}를 사용해야 함에 유의하십시오. 실행이 완료되면, 셸은 포커스를 유지하고 프롬프트를 표시합니다. 이 시점에서, 실행 결과를 대화식으로 탐색할 수 있습니다. 이것은 명령 줄에서 @code{python -i file}로 파일을 실행하는 것과 유사합니다.
@end table
@anchor{library/idle run-custom}@anchor{442d}

@table @asis

@item Run… Customized

@ref{442b,,Run Module}과 같지만, 사용자 정의 설정으로 모듈을 실행합니다. `명령 줄 인자(Command Line Arguments)'는 명령 줄에 전달된 것처럼 @ref{1469,,sys.argv}를 확장합니다. 다시 시작하지 않고 모듈을 셸에서 실행할 수 있습니다.
@end table
@anchor{library/idle check-module}@anchor{442c}

@table @asis

@item Check Module

편집기 창에 현재 열려 있는 모듈의 문법을 검사합니다. 모듈이 저장되지 않았으면 IDLE은 설정 대화 상자의 General 탭에서 선택한 대로 사용자에게 저장을 요구하거나 자동 저장합니다. 문법 에러가 있으면, 대략적인 위치가 편집기 창에 표시됩니다.
@end table
@anchor{library/idle python-shell}@anchor{442e}

@table @asis

@item Python Shell

파이썬 셸 창을 열거나 깨웁니다.
@end table

@node Shell 메뉴 셸 창 전용,Debug 메뉴 셸 창 전용,Run 메뉴 편집기 창 전용,메뉴
@anchor{library/idle shell-menu-shell-window-only}@anchor{442f}
@subsubsection Shell 메뉴 (셸 창 전용)



@table @asis

@item View Last Restart

셸 창을 마지막 셸 재시작으로 스크롤 합니다.

@item Restart Shell

셸을 다시 시작하여 환경을 정리하고 디스플레이와 예외 처리를 재설정합니다.

@item Previous History

히스토리에서 현재 항목과 일치하는 이전 명령을 순환합니다.

@item Next History

히스토리에서 현재 항목과 일치하는 다음 명령을 순환합니다.

@item Interrupt Execution

실행 중인 프로그램을 중지합니다.
@end table

@node Debug 메뉴 셸 창 전용,Options 메뉴 셸과 편집기,Shell 메뉴 셸 창 전용,메뉴
@anchor{library/idle debug-menu-shell-window-only}@anchor{4430}
@subsubsection Debug 메뉴 (셸 창 전용)



@table @asis

@item Go to File/Line

커서가 놓인 현재 줄과 줄 위에서 파일명과 줄 번호는 찾습니다. 발견되면, (파일이 아직 열려 있지 않으면 파일을 열고) 줄을 보여줍니다. 이를 사용하여 예외 트레이스백에서 참조된 소스 줄과 Find in Files에서 찾은 줄을 볼 수 있습니다. 셸 창과 출력 창의 문맥 메뉴에서도 사용할 수 있습니다.
@end table

@geindex 디버거
@geindex 스택 뷰어


@table @asis

@item Debugger (toggle)

활성화되면, 셸에 입력되거나 편집기에서 실행된 코드가 디버거에서 실행됩니다. 편집기에서, 문맥 메뉴를 사용하여 중단점을 설정할 수 있습니다. 이 기능은 아직 불완전하고 다소 실험적입니다.

@item Stack Viewer

locals와 globals에 대한 액세스와 함께, 트리 위젯에 마지막 예외의 스택 트레이스백을 표시합니다.

@item Auto-open Stack Viewer

처리되지 않은 예외에서 스택 뷰어를 자동으로 여는 것을 전환합니다.
@end table

@node Options 메뉴 셸과 편집기,Window 메뉴 셸과 편집기,Debug 메뉴 셸 창 전용,메뉴
@anchor{library/idle options-menu-shell-and-editor}@anchor{4431}
@subsubsection Options 메뉴 (셸과 편집기)



@table @asis

@item Configure IDLE

구성 대화 상자를 열고 다음과 같은 것들에 대한 설정을 변경합니다: 글꼴, 들여쓰기, 키 바인딩, 텍스트 색상 테마, 시작 창과 크기, 추가 도움말 소스 및 확장. macOS의 경우, 응용 프로그램 메뉴에서 Preferences를 선택하여 구성 대화 상자를 여십시오. 자세한 내용은, 도움말과 환경 설정에서 @ref{4432,,환경 설정}을 참조하십시오.
@end table

대부분의 구성 옵션은 모든 창이나 모든 미래 창에 적용됩니다. 아래의 옵션 항목은 활성 창에만 적용됩니다.


@table @asis

@item Show/Hide Code Context (편집기 창 전용)

편집 창의 상단에 창의 상단 위로 스크롤 된 코드의 블록 컨텍스트를 표시하는 팬을 엽니다. 아래의 편집과 탐색 섹션에서 @ref{4433,,코드 컨텍스트}를 참조하십시오.

@item Show/Hide Line Numbers (편집기 창 전용)

편집 창 왼쪽에 텍스트의 줄 번호를 표시하는 열을 엽니다. 기본 설정은 꺼져 있으며, 환경 설정에서 변경될 수 있습니다 (@ref{4432,,환경 설정}을 참조하십시오).

@item Zoom/Restore Height

창을 보통 크기와 최대 높이 사이에서 전환합니다. IDLE 구성 대화 상자의 General 탭에서 변경하지 않는 한 초기 크기의 기본값은 40줄 80문자입니다. 화면의 최대 높이는 화면에서 처음 확대할 때 창을 일시적으로 최대화하여 결정됩니다. 화면 설정을 변경하면 저장된 높이가 무효가 될 수 있습니다. 이 전환은 창이 최대화되었을 때 적용되지 않습니다.
@end table

@node Window 메뉴 셸과 편집기,Help 메뉴 셸과 편집기,Options 메뉴 셸과 편집기,메뉴
@anchor{library/idle window-menu-shell-and-editor}@anchor{4434}
@subsubsection Window 메뉴 (셸과 편집기)


열려있는 모든 창의 이름을 나열합니다; 하나를 선택하여 전경으로 가져옵니다 (필요한 경우 아이콘화를 해제합니다).

@node Help 메뉴 셸과 편집기,Context 메뉴,Window 메뉴 셸과 편집기,메뉴
@anchor{library/idle help-menu-shell-and-editor}@anchor{4435}
@subsubsection Help 메뉴 (셸과 편집기)



@table @asis

@item About IDLE

버전, 저작권, 라이선스, 크레딧 등을 표시합니다.

@item IDLE Help

메뉴 옵션, 기본 편집과 탐색 및 기타 팁을 자세히 설명하는 이 IDLE 설명서를 표시합니다.

@item Python Docs

설치되었으면, 로컬 파이썬 문서에 액세스하거나, 웹 브라우저를 시작하여 최신 파이썬 설명서를 보여주는 docs.python.org 를 엽니다.

@item Turtle Demo

예제 파이썬 코드와 터틀 그래픽을 제공하는 turtledemo 모듈을 실행합니다.
@end table

IDLE 구성 대화 상자의 General 탭으로 여기에 도움말 소스를 추가할 수 있습니다. Help 메뉴 선택에 대한 자세한 내용은 아래의 @ref{4436,,도움말 소스} 하위 섹션을 참조하십시오.

@geindex Cut
@geindex Copy
@geindex Paste
@geindex Set Breakpoint
@geindex Clear Breakpoint
@geindex 중단점

@node Context 메뉴,,Help 메뉴 셸과 편집기,메뉴
@anchor{library/idle context-menus}@anchor{4437}
@subsubsection Context 메뉴


윈도우에서 마우스 오른쪽 버튼을 클릭하여 문맥 메뉴를 엽니다 (macOS에서는 Control-클릭). 문맥 메뉴에는 Edit 메뉴에도 있는 표준 클립 보드 기능이 있습니다.


@table @asis

@item Cut

선택 사항을 시스템 전체 클립 보드에 복사합니다; 그런 다음 선택을 삭제합니다.

@item Copy

선택 사항을 시스템 전체 클립 보드에 복사합니다.

@item Paste

시스템 전체 클립 보드의 내용을 현재 창에 삽입합니다.
@end table

편집기 창에는 중단점 기능도 있습니다. 중단점이 설정된 줄은 특별히 표시됩니다. 중단점은 디버거에서 실행할 때만 영향을 미칩니다. 파일의 중단점은 사용자의 @code{.idlerc} 디렉터리에 저장됩니다.


@table @asis

@item Set Breakpoint

현재 줄에 중단점을 설정합니다.

@item Clear Breakpoint

해당 줄에서 중단점을 지웁니다.
@end table

셸과 출력 창에서는 다음과 같은 것도 있습니다.


@table @asis

@item Go to file/line

Debug 메뉴와 같습니다.
@end table

셸 창에는 아래 `파이썬 셸 창' 하위 섹션에 설명된 출력 압착 기능도 있습니다.


@table @asis

@item Squeeze

커서가 출력 줄 위에 있으면, 위 코드와 아래 프롬프트 사이의 모든 출력을 ‘Squeezed text’ 레이블로 압착합니다.
@end table

@node 편집과 탐색,시작과 코드 실행,메뉴,IDLE — 파이썬 편집기와 셸
@anchor{library/idle editing-and-navigation}@anchor{4438}@anchor{library/idle id1}@anchor{4439}
@subsubsection 편집과 탐색


@menu
* 편집기 창:: 
* 키 바인딩:: 
* 자동 들여쓰기:: 
* 검색과 치환:: 
* 완성: 완성<2>. 
* 콜팁:: 
* Format block:: 
* 코드 컨텍스트:: 
* 셸 창:: 
* 텍스트 색상:: 

@end menu

@node 편집기 창,키 바인딩,,편집과 탐색
@anchor{library/idle editor-windows}@anchor{443a}
@subsubsection 편집기 창


설정과 IDLE 시작 방법에 따라, IDLE이 시작될 때 편집기 창을 열 수 있습니다. 그런 다음, File 메뉴를 사용하십시오. 주어진 파일에 대해 열린 편집기 창이 하나만 있을 수 있습니다.

제목 표시 줄에는 파일 이름, 전체 경로 및 창을 실행하는 파이썬과 IDLE 버전이 포함됩니다. 상태 표시 줄에는 줄 번호(‘Ln’)와 열 번호(‘Col’)가 있습니다. 줄 번호는 1로 시작합니다; 열 번호는 0으로 시작합니다.

IDLE은 알려진 .py* 확장자를 가진 파일에 파이썬 코드가 포함되어 있고 다른 파일은 그렇지 않다고 가정합니다. Run 메뉴를 사용하여 파이썬 코드를 실행하십시오.

@node 키 바인딩,자동 들여쓰기,편집기 창,편집과 탐색
@anchor{library/idle key-bindings}@anchor{443b}
@subsubsection 키 바인딩


The IDLE insertion cursor is a thin vertical bar between character
positions.  When characters are entered, the insertion cursor and
everything to its right moves right one character and
the new character is entered in the new space.

Several non-character keys move the cursor and possibly
delete characters.  Deletion does not puts text on the clipboard,
but IDLE has an undo list.  Wherever this doc discusses keys,
‘C’ refers to the @code{Control} key on Windows and
Unix and the @code{Command} key on macOS.  (And all such discussions
assume that the keys have not been re-bound to something else.)


@itemize *

@item 
Arrow keys move the cursor one character or line.

@item 
@code{C}-@code{LeftArrow}와 @code{C}-@code{RightArrow}는 한 단어 좌/우로 이동합니다.

@item 
@code{Home}과 @code{End}는 줄의 시작/끝으로 이동합니다.

@item 
@code{Page Up}과 @code{Page Down}은 한 화면 위/아래로 이동합니다.

@item 
@code{C}-@code{Home}과 @code{C}-@code{End}는 파일의 시작/끝으로 이동합니다

@item 
@code{Backspace}와 @code{Del}(또는 @code{C}-@code{d})은 이전/다음 문자를 삭제합니다.

@item 
@code{C}-@code{Backspace}와 @code{C}-@code{Del}은 좌/우 의 한 단어를 삭제합니다.

@item 
@code{C}-@code{k} deletes (‘kills’) everything to the right.
@end itemize

(복사하는 @code{C}-@code{c}와 붙여넣기 하는 @code{C}-@code{v}와 같은) 표준 키 바인딩이 작동 할 수 있습니다. 키 바인딩은 IDLE 구성 대화 상자에서 선택됩니다.

@node 자동 들여쓰기,검색과 치환,키 바인딩,편집과 탐색
@anchor{library/idle automatic-indentation}@anchor{443c}
@subsubsection 자동 들여쓰기


블록을 여는 문장 다음에, 다음 줄은 4개의 스페이스로 들여쓰기 됩니다 (파이썬 셸 창에서는 한 탭씩). 특정 키워드(break, return 등)가 다음에 다음 줄이 내어 쓰기 됩니다. 앞선 들여쓰기에서, @code{Backspace}는 최대 4개의 스페이스가 있으면 삭제합니다. @code{Tab}은 스페이스를 삽입합니다 (파이썬 셸 창에서는 하나의 탭), 개수는 들여쓰기 너비에 따라 다릅니다. 현재 Tcl/Tk 제한으로 인해 탭은 4개의 스페이스로 제한됩니다.

@ref{4427,,Format 메뉴}의 Indent/Dedent Region 명령도 참조하십시오.

@node 검색과 치환,완성<2>,자동 들여쓰기,편집과 탐색
@anchor{library/idle search-and-replace}@anchor{443d}
@subsubsection 검색과 치환


Any selection becomes a search target.  However, only selections within
a line work because searches are only performed within lines with the
terminal newline removed.  If @code{[x] Regular expression} is checked, the
target is interpreted according to the Python re module.

@node 완성<2>,콜팁,검색과 치환,편집과 탐색
@anchor{library/idle completions}@anchor{4425}@anchor{library/idle id2}@anchor{443e}
@subsubsection 완성


요청되고 사용할 수 있을 때, 모듈 이름, 클래스나 함수의 어트리뷰트 또는 파일명에 대한 완성(completions)이 제공됩니다. 각 요청 방법은 기존 이름을 가진 완성 상자가 표시됩니다. (예외는 아래의 탭 완성을 참조하십시오.) 모든 상자는, 문자를 입력하고 삭제해서; @code{Up}, @code{Down}, @code{PageUp}, @code{PageDown}, @code{Home} 및 @code{End} 키를 쳐서; 상자 안에서 한 번의 클릭으로 완성 중인 이름과 상자에서 강조 표시된 항목을 변경합니다. @code{Escape}, @code{Enter} 및 이중 @code{Tab} 키나 상자 외부를 클릭하여 상자를 닫으십시오. 상자 안에서 더블 클릭하면 선택하고 닫습니다.

상자를 여는 한 가지 방법은 키 문자를 입력하고 미리 정의된 간격만큼 기다리는 것입니다. 기본값은 2초입니다; 설정 대화 상자에서 사용자 정의하십시오. (자동 팝업을 방지하려면, 지연을 100000000과 같은 큰 밀리초로 설정하십시오.) 임포트한 모듈 이름이나 클래스나 함수 어트리뷰트의 경우, ‘.’를 입력하십시오. 루트 디렉터리의 파일명은 여는 인용 부호 바로 뒤에 @ref{879,,os.sep}이나 @ref{87a,,os.altsep}을 입력하십시오. (윈도우에서는, 먼저 드라이브를 지정할 수 있습니다.) 디렉터리 이름과 구분자를 입력하여 서브 디렉터리로 이동하십시오.

기다리는 대신, 또는 상자를 닫은 후, Edit 메뉴에서 Show Completions를 사용하여 즉시 완성 상자를 여십시오. 기본 단축키는 @code{C}-@code{space}입니다. 상자를 열기 전에 원하는 이름의 접두사를 입력하면, 첫 번째 일치나 근거리 불일치가 표시됩니다. 결과는 상자가 표시된 후 접두사를 입력하는 것과 같습니다. 따옴표 뒤에서의 Show Completions는 루트 디렉터리 대신 현재 디렉터리에서 파일명을 완성합니다.

접두사 다음에 @code{Tab}을 누르면 일반적으로 Show Completions와 같은 효과가 있습니다. (접두사가 없으면 들여쓰기합니다.) 그러나, 접두사와 일치하는 항목이 하나뿐이면, 상자를 열지 않고 해당 일치가 편집기 텍스트에 즉시 추가됩니다.

문자열 밖에서 선행 ‘.’ 없이 접두어 뒤에서 ‘Show Completions’를 실행하거나 @code{Tab}을 누르면 키워드, 내장 이름 및 사용 가능한 모듈 수준 이름이 포함된 상자를 엽니다.

(셸과 달리) 편집기에서 코드를 편집할 때는, 셸을 다시 시작하지 않고 코드를 실행해서 사용 가능한 모듈 수준 이름을 늘리십시오. 파일 맨 위에 임포트를 추가한 후에 특히 유용합니다. 이것은 또한 가능한 어트리뷰트 완성을 늘립니다.

완성 상자는 ‘_’로 시작하거나, 모듈의 경우 ‘__all__’에 포함되지 않은 이름을 처음에는 제외합니다. 숨겨진 이름은 상자를 열기 전이나 후에 ‘.’ 뒤에 ‘_’를 입력하여 액세스 할 수 있습니다.

@node 콜팁,Format block,완성<2>,편집과 탐색
@anchor{library/idle calltips}@anchor{4426}@anchor{library/idle id3}@anchor{443f}
@subsubsection 콜팁


`액세스할 수 있는' 함수 이름 다음에 @code{(}를 입력하면 콜팁이 자동으로 표시됩니다. 함수 이름 표현식에는 점과 서브스크립트가 포함될 수 있습니다. 콜팁은 클릭하거나, 커서가 인자 영역 밖으로 이동하거나, @code{)}를 입력할 때까지 남아 있습니다. 커서가 정의의 인자 부분에 있을 때마다, 콜팁을 표시하려면 메뉴에서 Edit와 “Show Call Tip”을 선택하거나 바로 가기를 입력하십시오.

콜팁은 함수 서명과 독스트링의 첫 번째 빈 줄이나 다섯 번째 비어 있지 않은 줄에 이르는 줄로 구성됩니다. (일부 내장 함수에는 액세스할 수 있는 서명이 없습니다.) 서명의 ‘/’나 ‘*’는 앞서거나 뒤따르는 인자가 위치나 이름(키워드) 전용으로 전달됨을 가리킵니다. 세부 사항은 변경될 수 있습니다.

셸에서, 액세스할 수 있는 함수는 Idle 스스로 임포트 한 모듈을 포함하여, 사용자 프로세스로 임포트 한 모듈과 마지막 재시작 이후에 어떤 정의가 실행되었는지에 따라 다릅니다.

예를 들어, 셸을 다시 시작하고 @code{itertools.count(}를 입력하십시오. Idle이 자신의 목적으로 itertools를 사용자 프로세스로 임포트 하기 때문에 콜팁이 표시됩니다. (이것은 변경될 수 있습니다.) @code{turtle.write(}를 입력하면 아무것도 나타나지 않습니다. Idle은 직접 turtle을 임포트 하지 않습니다. 메뉴 항목과 바로 가기도 아무것도 하지 않습니다. @code{import turtle}을 입력하십시오. 그다음부터, @code{turtle.write(}가 콜팁을 표시합니다.

편집기에서, import 문은 파일을 실행할 때까지 효과가 없습니다. import 문을 작성한 후, 함수 정의를 추가한 후 또는 기존 파일을 연 후 파일을 실행하고 싶을 것입니다.

@node Format block,코드 컨텍스트,콜팁,편집과 탐색
@anchor{library/idle format-block}@anchor{4429}@anchor{library/idle id4}@anchor{4440}
@subsubsection Format block


Reformat Paragraph rewraps a block (‘paragraph’) of contiguous equally
indented non-blank comments, a similar block of text within a multiline
string, or a selected subset of either.
If needed, add a blank line to separate string from code.
Partial lines in a selection expand to complete lines.
The resulting lines have the same indent as before
but have maximum total length of N columns (characters).
Change the default N of 72 on the Window tab of IDLE Settings.

@node 코드 컨텍스트,셸 창,Format block,편집과 탐색
@anchor{library/idle code-context}@anchor{4433}@anchor{library/idle id5}@anchor{4441}
@subsubsection 코드 컨텍스트


파이썬 코드가 포함된 편집기 창 내에서, 창의 상단에 팬을 표시하거나 숨기기 위해 코드 컨텍스트를 토글 할 수 있습니다. 표시될 때, 이 분할 창은 @code{class}, @code{def} 또는 @code{if} 키워드로 시작하는 것과 같이 블록 코드를 여는 줄들을 고정합니다, 그렇지 않다면 뷰에서 스크롤 되어 빠져나갈 줄들입니다. 팬의 크기는 모든 현재 컨텍스트 수준을 표시하기 위해 필요에 따라 확장과 축소되며, IDLE 구성 대화 상자에 정의된 최대 줄 수가지 입니다 (기본값은 15). 현재 컨텍스트 줄이 없고 기능이 켜지면, 빈 줄 하나가 표시됩니다. 컨텍스트 팬에서 줄을 클릭하면 해당 줄을 편집기 맨 위로 이동합니다.

컨텍스트 팬의 텍스트와 배경색은 IDLE 구성 대화 상자의 Highlights 탭에서 구성할 수 있습니다.

@node 셸 창,텍스트 색상,코드 컨텍스트,편집과 탐색
@anchor{library/idle shell-window}@anchor{4442}
@subsubsection 셸 창


IDLE의 셸에서, 문장을 입력, 편집하고 완성된 문장을 다시 불러올 수 있습니다. (대부분의 콘솔과 터미널에서는 한 번에 하나의 물리적인 줄만 작업할 수 있습니다).

Submit a single-line statement for execution by hitting @code{Return}
with the cursor anywhere on the line.  If a line is extended with
Backslash (@code{\}), the cursor must be on the last physical line.
Submit a multi-line compound statement by entering a blank line after
the statement.

셸에 코드를 붙여넣을 때, 위에서 지정한 대로, @code{Return}을 누를 때까지 컴파일되지도 실행되지도 않습니다. 붙여넣은 코드를 먼저 편집할 수 있습니다. 여러 문장을 셸에 붙여넣으면, 여러 문장이 마치 하나인 것처럼 컴파일되어 결과는 @ref{18e,,SyntaxError}가 됩니다.

Lines containing @code{RESTART} mean that the user execution process has been
re-started.  This occurs when the user execution process has crashed,
when one requests a restart on the Shell menu, or when one runs code
in an editor window.

이전 서브 섹션에서 설명한 편집 기능은 대화식으로 코드를 입력할 때 작동합니다. IDLE의 셸 창은 다음에도 반응합니다:


@itemize *

@item 
@code{C}-@code{c} 문장 실행을 중단하려고 시도합니다 (하지만 실패할 수 있습니다).

@item 
@code{C}-@code{d} @code{>>>} 프롬프트에서 입력하면 셸을 닫습니다.

@item 
@code{Alt}-@code{p} and @code{Alt}-@code{n} (@code{C}-@code{p} and @code{C}-@code{n} on macOS)
retrieve to the current prompt the previous or next previously
entered statement that matches anything already typed.

@item 
@code{Return} while the cursor is on any previous statement
appends the latter to anything already typed at the prompt.
@end itemize

@node 텍스트 색상,,셸 창,편집과 탐색
@anchor{library/idle text-colors}@anchor{4443}
@subsubsection 텍스트 색상


Idle은 기본적으로 흰색 위의 검은색 텍스트지만, 특수한 의미로 텍스트를 채색합니다. 셸의 경우, 셸 출력, 셸 에러, 사용자 출력 및 사용자 에러입니다. 파이썬 코드의 경우, 셸 프롬프트나 편집기에서, 키워드, 내장 클래스와 함수 이름, @code{class}와 @code{def} 뒤에 오는 이름, 문자열 및 주석입니다. 모든 텍스트 창에서, 커서 (있다면), 찾은 텍스트 (가능하다면) 및 선택한 텍스트입니다.

IDLE also highlights the @ref{a0d,,soft keywords} @ref{a0e,,match},
@code{case}, and @ref{a0f,,_} in
pattern-matching statements. However, this highlighting is not perfect and
will be incorrect in some rare cases, including some @code{_}-s in @code{case}
patterns.

텍스트 채색은 백그라운드에서 수행되므로, 채색되지 않은 텍스트가 때때로 표시됩니다. 색 구성표를 변경하려면, IDLE 구성 대화 상자 Highlighting 탭을 사용하십시오. 편집기의 디버거 중단점 표시와 팝업과 대화 상자의 텍스트는 사용자가 구성할 수 없습니다.

@node 시작과 코드 실행,도움말과 환경 설정,편집과 탐색,IDLE — 파이썬 편집기와 셸
@anchor{library/idle startup-and-code-execution}@anchor{4444}
@subsubsection 시작과 코드 실행


@code{-s} 옵션으로 시작할 때, IDLE은 환경 변수 
@geindex IDLESTARTUP
@geindex 환경 변수; IDLESTARTUP
@code{IDLESTARTUP}이나 
@geindex PYTHONSTARTUP
@geindex 환경 변수; PYTHONSTARTUP
@ref{1b8,,PYTHONSTARTUP}가 참조하는 파일을 실행합니다. IDLE은 먼저 @code{IDLESTARTUP}을 확인합니다; @code{IDLESTARTUP}이 있으면 참조된 파일이 실행됩니다. @code{IDLESTARTUP}이 없으면, IDLE은 @code{PYTHONSTARTUP}을 확인합니다. 이러한 환경 변수가 참조하는 파일은 IDLE 셸에서 자주 사용되는 함수를 저장하거나 공통 모듈을 임포트 하기 위해 import 문을 실행하기에 편리한 장소입니다.

또한, @code{Tk}도 시작 파일이 있으면 로드합니다. Tk 파일은 무조건 로드됨에 유의하십시오. 이 추가 파일은 @code{.Idle.py}이며 사용자의 홈 디렉터리에서 찾습니다. 이 파일의 문장은 Tk 이름 공간에서 실행되므로, 이 파일은 IDLE의 파이썬 셸에서 사용할 함수를 임포트 하는 데 유용하지 않습니다.

@menu
* Command-line usage: Command-line usage<5>. 
* 시작 실패:: 
* 사용자 코드 실행하기:: 
* 셸의 사용자 출력:: 
* tkinter 응용 프로그램 개발하기:: 
* 서브 프로세스 없이 실행하기:: 

@end menu

@node Command-line usage<5>,시작 실패,,시작과 코드 실행
@anchor{library/idle command-line-usage}@anchor{4445}@anchor{library/idle idlelib-cli}@anchor{4446}
@subsubsection Command-line usage


IDLE can be invoked from the command line with various options. The general syntax is:

@example
python -m idlelib [options] [file ...]
@end example

The following options are available:

@geindex idle 명령줄 옵션; -c
@anchor{library/idle cmdoption-idle-c}@anchor{4447}
@deffn {Option} @w{-}c <command>

Run the specified Python command in the shell window.
For example, pass @code{-c "print('Hello, World!')"}.
On Windows, the outer quotes must be double quotes as shown.
@end deffn

@geindex idle 명령줄 옵션; -d
@anchor{library/idle cmdoption-idle-d}@anchor{4448}
@deffn {Option} @w{-}d

Enable the debugger and open the shell window.
@end deffn

@geindex idle 명령줄 옵션; -e
@anchor{library/idle cmdoption-idle-e}@anchor{4449}
@deffn {Option} @w{-}e

편집기 창을 엽니다.
@end deffn

@geindex idle 명령줄 옵션; -h
@anchor{library/idle cmdoption-idle-h}@anchor{444a}
@deffn {Option} @w{-}h

Print a help message with legal combinations of options and exit.
@end deffn

@geindex idle 명령줄 옵션; -i
@anchor{library/idle cmdoption-idle-i}@anchor{444b}
@deffn {Option} @w{-}i

셸 창을 엽니다.
@end deffn

@geindex idle 명령줄 옵션; -r
@anchor{library/idle cmdoption-idle-r}@anchor{444c}
@deffn {Option} @w{-}r <file>

Run the specified file in the shell window.
@end deffn

@geindex idle 명령줄 옵션; -s
@anchor{library/idle cmdoption-idle-s}@anchor{444d}
@deffn {Option} @w{-}s

Run the startup file (as defined by the environment variables 
@geindex IDLESTARTUP
@geindex 환경 변수; IDLESTARTUP
@code{IDLESTARTUP} or 
@geindex PYTHONSTARTUP
@geindex 환경 변수; PYTHONSTARTUP
@ref{1b8,,PYTHONSTARTUP}) before opening the shell window.
@end deffn

@geindex idle 명령줄 옵션; -t
@anchor{library/idle cmdoption-idle-t}@anchor{444e}
@deffn {Option} @w{-}t <title>

셸 창의 제목을 설정합니다.
@end deffn

@geindex idle 명령줄 옵션; -
@anchor{library/idle cmdoption-idle-0}@anchor{444f}
@deffn {Option} @w{-}

Read and execute standard input in the shell window. This option must be the last one before any arguments.
@end deffn

If arguments are provided:


@itemize -

@item 
@code{-}, @code{-c} 또는 @code{-r}이 사용되면, 모든 인자는 @code{sys.argv[1:]}에 배치되고 @code{sys.argv[0]}은 @code{'@w{'}}, @code{'-c'} 또는 @code{'-r'}로 각각 설정됩니다. `Options' 대화 상자에서 기본값이 설정되어 있어도, 편집기 창이 열리지 않습니다.

@item 
그렇지 않으면, 인자는 편집을 위해 열리는 파일로 취급되고, @code{sys.argv}는 IDLE 자체에 전달된 인자를 반영합니다.
@end itemize

@node 시작 실패,사용자 코드 실행하기,Command-line usage<5>,시작과 코드 실행
@anchor{library/idle startup-failure}@anchor{4450}
@subsubsection 시작 실패


IDLE은 소켓을 사용하여 IDLE GUI 프로세스와 사용자 코드 실행 프로세스 간에 통신합니다. 셸을 시작하거나 다시 시작할 때마다 연결을 만들어야 합니다. (후자는 ‘RESTART’라고 표시된 구분 선으로 표시됩니다). 사용자 프로세스가 GUI 프로세스에 연결하지 못하면, 보통 사용자에게 알리는 ‘cannot connect’ 메시지가 담긴 @code{Tk} 에러 상자가 표시됩니다. 그런 다음 종료합니다.

유닉스 시스템의 한가지 특정한 연결 실패는 시스템 네트워크 설정의 어딘가에서 잘못 구성된 마스쿼레이딩 규칙으로 인해 발생합니다. IDLE이 터미널에서 시작될 때, @code{** Invalid host:}로 시작하는 메시지를 보게 됩니다. 유효한 값은 @code{127.0.0.1 (idlelib.rpc.LOCALHOST)}입니다. 한 터미널 창에서 @code{tcpconnect -irv 127.0.0.1 6543}로, 다른 창에서 @code{tcplisten <same args>}로 진단할 수 있습니다.

일반적인 실패 원인은 `random.py'와 `tkinter.py'처럼, 표준 라이브러리 모듈과 이름이 같은 사용자가 작성한 파일입니다. 이러한 파일이 실행하려는 파일과 같은 디렉터리에 있을 때, IDLE은 표준 라이브러리 파일을 임포트 할 수 없습니다. 현재 수선법은 사용자 파일의 이름을 바꾸는 것입니다.

앞엣것보다 덜 흔하지만, 바이러스 백신이나 방화벽 프로그램이 연결을 중지할 수 있습니다. 프로그램이 연결을 허용하도록 지시할 수 없으면, IDLE이 작동하도록 프로그램을 꺼야 합니다. 외부 포트에 데이터가 노출되지 않기 때문에 이 내부 연결을 허용하는 것은 안전합니다. 비슷한 문제는 연결을 차단하는 네트워크 구성 에러입니다.

파이썬 설치 문제로 인해 IDLE이 중지되는 경우가 있습니다: 여러 버전이 충돌하거나 단일 설치에 관리자 액세스가 필요할 수 있습니다. 충돌을 제거하거나, 관리자 권한으로 실행할 수 없거나 그러고 싶지 않으면 파이썬을 완전히 제거하고 다시 시작하기가 가장 쉽습니다.

좀비 pythonw.exe 프로세스가 문제일 수 있습니다. 윈도우에서는, 작업 관리자를 사용하여 확인하고 있다면 중지하십시오. 때때로 프로그램 충돌이나 키보드 인터럽트(control-C)에 의해 시작된 재시작이 연결에 실패할 수 있습니다. 에러 상자를 닫거나 Shell 메뉴에서 Restart Shell을 사용하면 일시적인 문제를 해결할 수 있습니다.

IDLE이 처음 시작되면, @code{~/.idlerc/}에서 사용자 구성 파일을 읽으려고 시도합니다 (~는 사용자의 홈 디렉터리입니다). 문제가 있으면, 에러 메시지가 표시되어야 합니다. 임의의 디스크 결함은 예외로 할 때, 파일을 절대 직접 편집하지 않으면 이를 방지할 수 있습니다. 대신, Options의 구성 대화 상자를 사용하십시오. 일단 사용자 구성 파일에 에러가 발생하면, 이를 삭제하고 설정 대화 상자에서 다시 시작하는 것이 가장 좋습니다.

IDLE이 메시지 없이 종료되고, 콘솔에서 시작되지 않았으면, 콘솔이나 터미널에서 시작하고 (@code{python -m idlelib}) 에러 메시지가 나타나는지 확인하십시오.

Tcl/tk가 @code{8.6.11}(@code{About IDLE}을 보십시오)보다 오래된 유닉스 기반 시스템에서 특정 글꼴의 특정 문자는 터미널에 보내는 메시지와 함께 tk 실패를 일으킬 수 있습니다. 이러한 문자가 있는 파일을 편집하기 위해 IDLE을 시작하거나 나중에 이러한 문자를 입력할 때 발생할 수 있습니다. tcl/tk를 업그레이드할 수 없으면, 더 잘 작동하는 글꼴을 사용하도록 IDLE을 다시 구성하십시오.

@node 사용자 코드 실행하기,셸의 사용자 출력,시작 실패,시작과 코드 실행
@anchor{library/idle running-user-code}@anchor{4451}
@subsubsection 사용자 코드 실행하기


드문 경우를 제외하고, IDLE을 사용하여 파이썬 코드를 실행한 결과는 텍스트 모드 시스템 콘솔이나 터미널 창에서 파이썬을 사용하여 기본 방법으로 같은 코드를 실행하는 것과 같아야 합니다. 그러나, 다른 인터페이스와 연산은 때때로 시각적인 결과에 영향을 줍니다. 예를 들어, @code{sys.modules}는 더 많은 항목으로 시작하고, @code{threading.active_count()}는 1 대신 2를 반환합니다.

기본적으로, IDLE은 셸과 편집기를 실행하는 사용자 인터페이스 프로세스가 아닌 별도의 OS 프로세스에서 사용자 코드를 실행합니다. 실행 프로세스에서, @code{sys.stdin}, @code{sys.stdout} 및 @code{sys.stderr}를 셸 창에서 입력을 받고 셸 창으로 출력을 보내는 객체로 바꿉니다. @code{sys.__stdin__}, @code{sys.__stdout__} 및 @code{sys.__stderr__}에 저장된 원래 값은 건드리지 않지만, @code{None}일 수 있습니다.

한 프로세스에서 다른 프로세스의 텍스트 위젯으로 인쇄 출력을 보내는 것은 같은 프로세스에서 시스템 터미널로 인쇄하는 것보다 느립니다. 이것은 여러 인자를 인쇄할 때 특히 그렇습니다. 각 인자의 문자열, 각 구분자, 줄 바꿈은 개별적으로 전송되기 때문입니다. 개발할 때는 일반적으로 문제가 되지 않지만, IDLE로 더 빨리 인쇄하려면 표시하려는 모든 항목을 포맷하고 결합한 다음 단일 문자열을 인쇄하십시오. 포맷 문자열과 @ref{260a,,str.join()} 모두 필드와 줄을 결합하는 데 도움이 될 수 있습니다.

IDLE의 표준 스트림 대체는 (사용자 코드 직접 하거나 multiprocessing과 같은 모듈로) 실행 프로세스에서 만들어진 서브 프로세스에 의해 상속되지 않습니다. 이러한 서브 프로세스가 sys.stdin에서 @code{input}을 사용하거나 sys.stdout이나 sys.stderr로 @code{print}나 @code{write}를 사용하면, 명령 줄 창에서 IDLE을 시작해야 합니다. (윈도우에서는, @code{pythonw}나 @code{pyw} 대신 @code{python}이나 @code{py}를 사용하세요.) 그러면 이차 서브 프로세스가 입력과 출력을 위해 해당 창에 연결될 겁니다.

@code{importlib.reload(sys)}와 같은 사용자 코드에 의해 @code{sys}가 재설정되면, IDLE의 변경 사항이 손실되고 키보드로부터의 입력과 화면으로의 출력이 올바르게 동작하지 않게 됩니다.

셸에 포커스가 있으면, 키보드와 화면을 제어합니다. 이것은 일반적으로 투명하지만, 키보드와 화면에 직접 액세스하는 함수는 작동하지 않습니다. 여기에는 키를 눌렀는지를 판단하는 시스템 특정 함수가 포함됩니다.

실행 프로세스에서 실행 중인 IDLE 코드는 그렇지 않다면 없을 프레임을 호출 스택에 추가합니다. IDLE은 @code{sys.getrecursionlimit}와 @code{sys.setrecursionlimit}를 래핑하여 추가 스택 프레임의 영향을 줄입니다.

사용자 코드가 직접 또는 sys.exit를 호출하여 SystemExit를 발생시키면, IDLE은 종료하는 대신 셸 프롬프트로 돌아갑니다.

@node 셸의 사용자 출력,tkinter 응용 프로그램 개발하기,사용자 코드 실행하기,시작과 코드 실행
@anchor{library/idle user-output-in-shell}@anchor{4452}
@subsubsection 셸의 사용자 출력


프로그램이 텍스트를 출력할 때, 결과는 해당 출력 장치에 의해 결정됩니다. IDLE이 사용자 코드를 실행할 때, @code{sys.stdout}과 @code{sys.stderr}이 IDLE 셸의 표시 영역에 연결됩니다. 그 기능 중 일부는 하부 Tk Text 위젯에서 상속됩니다. 다른 것은 프로그래밍한 추가 사항입니다. (중요하다면) 셸은 상용 실행보다는 개발용으로 설계되었습니다.

예를 들어, 셸은 절대로 출력을 버리지 않습니다. 셸에 무제한 출력을 보내는 프로그램은 결국 메모리를 채워서, 메모리 에러를 일으킵니다. 반대로, 일부 시스템 텍스트 창은 마지막 n 줄의 출력만 유지합니다. 예를 들어, 윈도우 콘솔은 사용자가 설정하면 최대 9999줄을 유지할 수 있으며, 기본값은 300입니다.

Tk Text 위젯, 따라서 IDLE의 셸은 유니코드의 BMP (Basic Multilingual Plane) 부분 집합에서 문자(코드 포인트)를 표시합니다. 어떤 문자가 적절한 글리프로 표시될지와 어떤 문자가 대체 상자로 표시될지는 운영 체제와 설치된 글꼴에 따라 다릅니다. 탭 문자는 뒤따르는 문자가 다음 탭 정지 뒤에서 시작되도록 합니다. (탭 정지는 8 ‘문자’마다 나타납니다). 줄 바꿈 문자는 뒤따르는 텍스트가 새 줄에 나타나게 합니다. 다른 제어 문자는 운영 체제와 글꼴에 따라 무시되거나 스페이스, 상자 또는 그 밖의 것으로 표시됩니다. (화살표 키를 사용하여 이러한 출력에서 텍스트 커서를 움직이면 예상치 못한 간격 동작이 나타날 수 있습니다.)

@example
>>> s = 'a\tb\a<\x02><\r>\bc\nd'  # 22문자를 입력합니다.
>>> len(s)
14
>>> s  # repr(s)를 표시합니다
'a\tb\x07<\x02><\r>\x08c\nd'
>>> print(s, end='@w{'})  # s를 그대로 표시합니다.
# 결과는 OS와 글꼴에 따라 다릅니다. 해보세요.
@end example

@code{repr} 함수는 표현식 값의 대화 형 에코에 사용됩니다. 입력 문자열의 변경된 버전을 반환하는데, 제어 코드, 일부 BMP 코드 포인트 및 모든 BMP 이외의 코드 포인트가 이스케이프 코드로 대체됩니다. 위에서 예시했듯이, 어떻게 표시되는지와 관계없이 문자열의 문자를 식별할 수 있도록 합니다.

정상과 에러 출력은 일반적으로 코드 입력 및 서로와 분리되어 별도의 줄에 유지됩니다. 그들은 각각 다른 강조 색상을 얻습니다.

SyntaxError 트레이스백의 경우, 에러가 감지된 곳의 일반적인 ‘^’ 표시는 에러 강조로 텍스트를 색칠하는 것으로 대체됩니다. 파일에서 실행한 코드가 다른 예외를 발생시킬 때, 트레이스백 줄을 마우스 오른쪽 단추로 클릭하여 IDLE 편집기의 해당 줄로 이동할 수 있습니다. 필요하면 파일이 열립니다.

셸에는 출력 라인을 ‘Squeezed text’ 레이블로 압착하는 특수 기능이 있습니다. 이것은 N 줄을 넘어가는 출력에 대해 자동으로 수행됩니다 (기본적으로 N = 50). Settings 대화 상자의 General 페이지의 PyShell 섹션에서 N을 변경할 수 있습니다. 출력을 마우스 오른쪽 버튼으로 클릭하면 더 적은 줄의 출력을 압착할 수 있습니다. 이것은 스크롤 속도를 늦출 수 있을 정도로 긴 줄에 유용할 수 있습니다.

압착된 출력은 레이블을 더블 클릭하여 제자리에서 펼쳐집니다. 레이블을 마우스 오른쪽 버튼으로 클릭하여 클립 보드나 별도의 보기 창으로 보낼 수도 있습니다.

@node tkinter 응용 프로그램 개발하기,서브 프로세스 없이 실행하기,셸의 사용자 출력,시작과 코드 실행
@anchor{library/idle developing-tkinter-applications}@anchor{4453}
@subsubsection tkinter 응용 프로그램 개발하기


IDLE은 tkinter 프로그램 개발을 용이하게 하기 위해 표준 파이썬과 의도적으로 다릅니다. 표준 파이썬에서 @code{import tkinter as tk; root = tk.Tk()}를 입력하면 아무것도 나타나지 않습니다. IDLE에 동일하게 입력하면 tk 창이 나타납니다. 표준 파이썬에서는, 창을 보려면 @code{root.update()}도 입력해야 합니다. IDLE은 초당 약 20회, 대략 50밀리초마다, 백그라운드에서 동등한 일을 합니다. 그런 다음 @code{b = tk.Button(root, text='button'); b.pack()}을 입력하십시오. 마찬가지로, 표준 파이썬에서는 @code{root.update()}를 입력할 때까지 아무것도 시각적으로 변경되지 않습니다.

대부분의 tkinter 프로그램은 @code{root.mainloop()}를 실행하는데, 일반적으로 tk 앱이 파괴될 때까지 반환되지 않습니다. 프로그램이 @code{python -i}이나 IDLE 편집기에서 실행되면, @code{mainloop()}가 반환할 때까지 (상호 작용할 것이 남아있지 않을 때까지) @code{>>>} 셸 프롬프트가 나타나지 않습니다.

IDLE 편집기에서 tkinter 프로그램을 실행할 때, mainloop 호출을 주석 처리할 수 있습니다. 그러면 즉시 셸 프롬프트를 얻고 라이브 응용 프로그램과 상호 작용할 수 있습니다. 표준 파이썬에서 실행할 때 mainloop 호출을 다시 활성화해야 한다는 것을 기억해야 합니다.

@node 서브 프로세스 없이 실행하기,,tkinter 응용 프로그램 개발하기,시작과 코드 실행
@anchor{library/idle running-without-a-subprocess}@anchor{4454}
@subsubsection 서브 프로세스 없이 실행하기


기본적으로, IDLE은 내부 루프 백 인터페이스를 사용하는 소켓을 통해 별도의 서브 프로세스에서 사용자 코드를 실행합니다. 이 연결은 외부에서 볼 수 없으며 인터넷으로 데이터를 보내거나 받지 않습니다. 방화벽 소프트웨어가 어쨌든 불평하면, 무시할 수 있습니다.

소켓 연결 시도가 실패하면, Idle은 여러분에게 알립니다. 이러한 장애는 때때로 일시적이지만, 지속한다면, 문제는 방화벽이 연결을 차단하거나 특정 시스템의 구성이 잘못되었을 수 있습니다. 문제가 해결될 때까지, -n 명령 줄 스위치를 사용하여 Idle을 실행할 수 있습니다.

IDLE이 -n 명령 줄 스위치로 시작되면 단일 프로세스에서 실행되며 RPC 파이썬 실행 서버를 실행하는 서브 프로세스를 만들지 않습니다. 파이썬이 플랫폼에서 서브 프로세스나 RPC 소켓 인터페이스를 만들 수 없을 때 유용할 수 있습니다. 그러나, 이 모드에서 사용자 코드는 IDLE 자체와 분리되지 않습니다. 또한, Run/Run Module (F5) 가 선택될 때 환경이 다시 시작되지 않습니다. 코드가 수정되면, 변경 사항을 적용하려면 영향을 받는 모듈을 reload()하고 특정 항목을 다시 임포트 해야 합니다 (예를 들어 from foo import baz). 이러한 이유로, 가능하다면 기본 서브 프로세스로 IDLE을 실행하는 것이 좋습니다.


버전 3.4부터 폐지됨.


@node 도움말과 환경 설정,idlelib — IDLE 응용 프로그램의 구현,시작과 코드 실행,IDLE — 파이썬 편집기와 셸
@anchor{library/idle help-and-preferences}@anchor{4455}
@subsubsection 도움말과 환경 설정


@menu
* 도움말 소스:: 
* 환경 설정:: 
* macOS의 IDLE:: 
* 확장:: 

@end menu

@node 도움말 소스,환경 설정,,도움말과 환경 설정
@anchor{library/idle help-sources}@anchor{4436}@anchor{library/idle id6}@anchor{4456}
@subsubsection 도움말 소스


Help 메뉴 항목 “IDLE Help”는 라이브러리 레퍼런스의 IDLE 장의 포맷된 html 버전을 표시합니다. 읽기 전용 tkinter 텍스트 창에 표시되는 결과는 웹 브라우저에서 보는 것과 비슷합니다. 마우스 휠, 스크롤 바 또는 위/아래 화살표 키를 누른 상태로 텍스트를 탐색하십시오. 또는 TOC(목차) 단추를 클릭하고 열린 상자에서 섹션 머리글을 선택하십시오.

Help 메뉴 항목 “Python Docs”는 @code{docs.python.org/x.y}에 있는 자습서를 포함하여 광범위한 도움말 소스를 엽니다, 여기서 ‘x.y’는 현재 실행 중인 파이썬 버전입니다. 시스템에 문서의 오프라인 사본이 있으면 (설치 옵션일 수 있습니다), 대신 열립니다.

IDLE 구성 대화 상자의 General 탭을 사용하여 언제든지 도움말 메뉴에서 선택한 URL을 추가하거나 제거할 수 있습니다.

@node 환경 설정,macOS의 IDLE,도움말 소스,도움말과 환경 설정
@anchor{library/idle preferences}@anchor{4432}@anchor{library/idle setting-preferences}@anchor{4457}
@subsubsection 환경 설정


글꼴 설정, 강조 표시, 키 및 일반 설정은 Option 메뉴의 IDLE 구성을 통해 변경할 수 있습니다. 기본이 아닌 사용자 설정은 사용자 홈 디렉터리의 @code{.idlerc} 디렉터리에 저장됩니다. 잘못된 사용자 구성 파일로 인한 문제점은 @code{.idlerc}에서 하나 이상의 파일을 편집하거나 삭제하여 해결됩니다.

Font 탭에서, 여러 언어로 된 여러 문자의 서체와 크기 효과에 대한 텍스트 샘플을 참조하십시오. 개인적으로 관심 있는 다른 문자를 추가하려면 샘플을 편집하십시오. 샘플을 사용하여 고정 폭 글꼴을 선택하십시오. 셸이나 편집기에서 특정 문자에 문제가 있으면, 샘플 상단에 해당 문자를 추가하고 먼저 크기를 변경한 다음 글꼴을 변경해보십시오.

Highlights와 Keys 탭에서, 내장이나 사용자 정의 색상 테마와 키 집합을 선택하십시오. 이전 IDLE로 최신 내장 색상 테마나 키 집합을 사용하려면, 새 사용자 정의 색상 테마나 키 집합으로 저장하십시오, 그러면 이전 IDLE에서 쉽게 액세스 할 수 있습니다.

@node macOS의 IDLE,확장,환경 설정,도움말과 환경 설정
@anchor{library/idle idle-on-macos}@anchor{4458}
@subsubsection macOS의 IDLE


시스템 환경설정: Dock에서, “문서를 열 때 탭 사용”을 “항상”으로 설정할 수 있습니다. 이 설정은 IDLE에서 사용하는 tk/tkinter GUI 프레임 워크와 호환되지 않으며, 몇 가지 IDLE 기능을 훼손합니다.

@node 확장,,macOS의 IDLE,도움말과 환경 설정
@anchor{library/idle extensions}@anchor{4459}
@subsubsection 확장


IDLE에는 확장 기능이 포함되어 있습니다. 설정 대화 상자의 Extensions 탭에서 확장에 대한 설정을 변경할 수 있습니다. 자세한 정보는 idlelib 디렉터리에 있는 config-extensions.def의 시작 부분을 참조하십시오. 현재 기본 확장은 zzdummy 뿐이며, 테스트에도 사용되는 예입니다.

@node idlelib — IDLE 응용 프로그램의 구현,,도움말과 환경 설정,IDLE — 파이썬 편집기와 셸
@anchor{library/idle idlelib-implementation-of-idle-application}@anchor{445a}@anchor{library/idle module-idlelib}@anchor{77}
@subsubsection idlelib — IDLE 응용 프로그램의 구현


@geindex module; idlelib

`소스 코드:' Lib/idlelib@footnote{https://github.com/python/cpython/tree/3.14/Lib/idlelib}


__________________________________________________________________


The Lib/idlelib package implements the IDLE application.  See the rest
of this page for how to use IDLE.

The files in idlelib are described in idlelib/README.txt.  Access it
either in idlelib or click Help => About IDLE on the IDLE menu.  This
file also maps IDLE menu items to the code that implements the item.
Except for files listed under ‘Startup’, the idlelib code is ‘private’ in
sense that feature changes can be backported (see 
@geindex Python 향상 제안; PEP 434
PEP 434@footnote{https://peps.python.org/pep-0434/}).

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node turtle — Turtle graphics,,IDLE — 파이썬 편집기와 셸,Graphical user interfaces with Tk
@anchor{library/turtle doc}@anchor{445b}@anchor{library/turtle module-turtle}@anchor{107}@anchor{library/turtle translation-repo}@anchor{445c}@anchor{library/turtle turtle-turtle-graphics}@anchor{445d}
@subsection @code{turtle} — Turtle graphics


@geindex module; turtle

`소스 코드:' Lib/turtle.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/turtle.py}

@c from turtle import *
@c turtle = Turtle()

@c import os
@c os.remove("my_drawing.ps")


__________________________________________________________________


@menu
* 소개: 소개<5>. 
* 시작하기: 시작하기<2>. 
* Tutorial: Tutorial<2>. 
* How to…:: 
* Turtle graphics reference:: 
* RawTurtle/Turtl의 메서드와 해당 함수:: 
* TurtleScreen/Screen 메서드와 해당 함수:: 
* 공개 클래스:: 
* Explanation: Explanation<2>. 
* 도움말과 구성:: 
* turtledemo — Demo scripts:: 
* 파이썬 2.6 이후의 변화: 파이썬 2 6 이후의 변화. 
* 파이썬 3.0 이후의 변화: 파이썬 3 0 이후의 변화. 

@end menu

@node 소개<5>,시작하기<2>,,turtle — Turtle graphics
@anchor{library/turtle introduction}@anchor{445e}
@subsubsection 소개


터틀(거북이) 그래픽은 1967년 Wally Feurzeig, Seymour Papert 및 Cynthia Solomon이 개발한 로고(Logo)에서 소개된 대중적인 기하학적 그리기 도구@footnote{https://en.wikipedia.org/wiki/Turtle_(robot)}의 구현체입니다.

This is an @ref{2157,,optional module}.
If it is missing from your copy of CPython,
look for documentation from your distributor (that is,
whoever provided Python to you).
If you are the distributor, see @ref{2155,,Requirements for optional modules}.

@c Similar notes appear in the docs of the modules:
@c - zipfile
@c - tarfile

@node 시작하기<2>,Tutorial<2>,소개<5>,turtle — Turtle graphics
@anchor{library/turtle get-started}@anchor{445f}
@subsubsection 시작하기


x-y 평면의 (0, 0)에서 출발하는 로봇 거북이를 상상해보십시오. @code{import turtle} 후에, @code{turtle.forward(15)} 명령을 내리면, 그것이 향한 방향으로 15픽셀 움직이고 (화면에서!), 움직이면서 선을 그립니다. @code{turtle.right(25)} 명령을 내려보십시오, 그러면 제자리에서 시계 방향으로 25도 회전합니다.

@subsubheading Turtle star



turtle은 간단한 움직임을 반복하는 프로그램을 사용하여 복잡한 모양을 그릴 수 있습니다.

@image{python-figures/turtle-star,,,,png}

In Python, turtle graphics provides a representation of a physical “turtle”
(a little robot with a pen) that draws on a sheet of paper on the floor.

It’s an effective and well-proven way for learners to encounter
programming concepts and interaction with software, as it provides instant,
visible feedback. It also provides convenient access to graphical output
in general.

Turtle drawing was originally created as an educational tool, to be used by
teachers in the classroom. For the programmer who needs to produce some
graphical output it can be a way to do that without the overhead of
introducing more complex or external libraries into their work.

@node Tutorial<2>,How to…,시작하기<2>,turtle — Turtle graphics
@anchor{library/turtle turtle-tutorial}@anchor{4460}@anchor{library/turtle tutorial}@anchor{4461}
@subsubsection Tutorial


New users should start here. In this tutorial we’ll explore some of the
basics of turtle drawing.

@menu
* 거북이 환경 시작하기:: 
* Basic drawing:: 
* Making algorithmic patterns:: 

@end menu

@node 거북이 환경 시작하기,Basic drawing,,Tutorial<2>
@anchor{library/turtle starting-a-turtle-environment}@anchor{4462}
@subsubsection 거북이 환경 시작하기


In a Python shell, import all the objects of the @code{turtle} module:

@example
from turtle import *
@end example

If you run into a @code{No module named '_tkinter'} error, you’ll have to
install the @ref{f6,,Tk interface package} on your system.

@node Basic drawing,Making algorithmic patterns,거북이 환경 시작하기,Tutorial<2>
@anchor{library/turtle basic-drawing}@anchor{4463}
@subsubsection Basic drawing


Send the turtle forward 100 steps:

@example
forward(100)
@end example

You should see (most likely, in a new window on your display) a line
drawn by the turtle, heading East. Change the direction of the turtle,
so that it turns 120 degrees left (anti-clockwise):

@example
left(120)
@end example

Let’s continue by drawing a triangle:

@example
forward(100)
left(120)
forward(100)
@end example

Notice how the turtle, represented by an arrow, points in different
directions as you steer it.

Experiment with those commands, and also with @code{backward()} and
@code{right()}.

@menu
* 펜 제어:: 
* 거북이의 위치:: 

@end menu

@node 펜 제어,거북이의 위치,,Basic drawing
@anchor{library/turtle pen-control}@anchor{4464}
@subsubsection 펜 제어


Try changing the color - for example, @code{color('blue')} - and
width of the line - for example, @code{width(3)} - and then drawing again.

You can also move the turtle around without drawing, by lifting up the pen:
@code{up()} before moving. To start drawing again, use @code{down()}.

@node 거북이의 위치,,펜 제어,Basic drawing
@anchor{library/turtle the-turtle-s-position}@anchor{4465}
@subsubsection 거북이의 위치


Send your turtle back to its starting-point (useful if it has disappeared
off-screen):

@example
home()
@end example

The home position is at the center of the turtle’s screen. If you ever need to
know them, get the turtle’s x-y coordinates with:

@example
pos()
@end example

Home is at @code{(0, 0)}.

And after a while, it will probably help to clear the window so we can start
anew:

@example
clearscreen()
@end example

@node Making algorithmic patterns,,Basic drawing,Tutorial<2>
@anchor{library/turtle making-algorithmic-patterns}@anchor{4466}
@subsubsection Making algorithmic patterns


Using loops, it’s possible to build up geometric patterns:

@example
for steps in range(100):
    for c in ('blue', 'red', 'green'):
        color(c)
        forward(steps)
        right(30)
@end example

- which of course, are limited only by the imagination!

Let’s draw the star shape at the top of this page. We want red lines,
filled in with yellow:

@example
color('red')
fillcolor('yellow')
@end example

Just as @code{up()} and @code{down()} determine whether lines will be drawn,
filling can be turned on and off:

@example
begin_fill()
@end example

Next we’ll create a loop:

@example
while True:
    forward(200)
    left(170)
    if abs(pos()) < 1:
        break
@end example

@code{abs(pos()) < 1} is a good way to know when the turtle is back at its
home position.

Finally, complete the filling:

@example
end_fill()
@end example

(Note that filling only actually takes place when you give the
@code{end_fill()} command.)

@node How to…,Turtle graphics reference,Tutorial<2>,turtle — Turtle graphics
@anchor{library/turtle how-to}@anchor{4467}@anchor{library/turtle turtle-how-to}@anchor{4468}
@subsubsection How to…


This section covers some typical turtle use-cases and approaches.

@menu
* Get started as quickly as possible:: 
* Automatically begin and end filling:: 
* Use the turtle module namespace:: 
* 스크립트에서 거북이 그래픽 사용하기:: 
* Use object-oriented turtle graphics:: 

@end menu

@node Get started as quickly as possible,Automatically begin and end filling,,How to…
@anchor{library/turtle get-started-as-quickly-as-possible}@anchor{4469}
@subsubsection Get started as quickly as possible


One of the joys of turtle graphics is the immediate, visual feedback that’s
available from simple commands - it’s an excellent way to introduce children
to programming ideas, with a minimum of overhead (not just children, of
course).

The turtle module makes this possible by exposing all its basic functionality
as functions, available with @code{from turtle import *}. The @ref{4460,,turtle graphics tutorial} covers this approach.

It’s worth noting that many of the turtle commands also have even more terse
equivalents, such as @code{fd()} for @ref{3640,,forward()}. These are especially
useful when working with learners for whom typing is not a skill.
@anchor{library/turtle note}@anchor{446a}
@quotation

You’ll need to have the @ref{f6,,Tk interface package} installed on
your system for turtle graphics to work. Be warned that this is not
always straightforward, so check this in advance if you’re planning to
use turtle graphics with a learner.
@end quotation

@node Automatically begin and end filling,Use the turtle module namespace,Get started as quickly as possible,How to…
@anchor{library/turtle automatically-begin-and-end-filling}@anchor{446b}
@subsubsection Automatically begin and end filling


Starting with Python 3.14, you can use the @ref{2a3,,fill()} @ref{1e1,,context manager}
instead of @ref{446c,,begin_fill()} and @ref{446d,,end_fill()} to automatically begin and
end fill. Here is an example:

@example
with fill():
    for i in range(4):
        forward(100)
        right(90)

forward(200)
@end example

The code above is equivalent to:

@example
begin_fill()
for i in range(4):
    forward(100)
    right(90)
end_fill()

forward(200)
@end example

@node Use the turtle module namespace,스크립트에서 거북이 그래픽 사용하기,Automatically begin and end filling,How to…
@anchor{library/turtle use-the-turtle-module-namespace}@anchor{446e}
@subsubsection Use the @code{turtle} module namespace


Using @code{from turtle import *} is convenient - but be warned that it imports a
rather large collection of objects, and if you’re doing anything but turtle
graphics you run the risk of a name conflict (this becomes even more an issue
if you’re using turtle graphics in a script where other modules might be
imported).

The solution is to use @code{import turtle} - @code{fd()} becomes
@code{turtle.fd()}, @code{width()} becomes @code{turtle.width()} and so on. (If typing
“turtle” over and over again becomes tedious, use for example @code{import turtle
as t} instead.)

@node 스크립트에서 거북이 그래픽 사용하기,Use object-oriented turtle graphics,Use the turtle module namespace,How to…
@anchor{library/turtle use-turtle-graphics-in-a-script}@anchor{446f}
@subsubsection 스크립트에서 거북이 그래픽 사용하기


It’s recommended to use the @code{turtle} module namespace as described
immediately above, for example:

@example
import turtle as t
from random import random

for i in range(100):
    steps = int(random() * 100)
    angle = int(random() * 360)
    t.right(angle)
    t.fd(steps)
@end example

Another step is also required though - as soon as the script ends, Python
will also close the turtle’s window. Add:

@example
t.mainloop()
@end example

to the end of the script. The script will now wait to be dismissed and
will not exit until it is terminated, for example by closing the turtle
graphics window.

@node Use object-oriented turtle graphics,,스크립트에서 거북이 그래픽 사용하기,How to…
@anchor{library/turtle use-object-oriented-turtle-graphics}@anchor{4470}
@subsubsection Use object-oriented turtle graphics



@subsubheading 더 보기


@ref{4471,,Explanation of the object-oriented interface}


Other than for very basic introductory purposes, or for trying things out
as quickly as possible, it’s more usual and much more powerful to use the
object-oriented approach to turtle graphics. For example, this allows
multiple turtles on screen at once.

In this approach, the various turtle commands are methods of objects (mostly of
@code{Turtle} objects). You `can' use the object-oriented approach in the shell,
but it would be more typical in a Python script.

The example above then becomes:

@example
from turtle import Turtle
from random import random

t = Turtle()
for i in range(100):
    steps = int(random() * 100)
    angle = int(random() * 360)
    t.right(angle)
    t.fd(steps)

t.screen.mainloop()
@end example

Note the last line. @code{t.screen} is an instance of the @ref{4472,,Screen}
that a Turtle instance exists on; it’s created automatically along with
the turtle.

The turtle’s screen can be customised, for example:

@example
t.screen.title('Object-oriented turtle demo')
t.screen.bgcolor("orange")
@end example

@node Turtle graphics reference,RawTurtle/Turtl의 메서드와 해당 함수,How to…,turtle — Turtle graphics
@anchor{library/turtle turtle-graphics-reference}@anchor{4473}
@subsubsection Turtle graphics reference


@cartouche
@quotation 참고 
다음 설명서에서 함수의 인자 목록이 제공됩니다. 물론 메서드에는 추가의 첫 번째 인자 `self'가 있으며 여기서는 생략합니다.
@end quotation
@end cartouche

@menu
* Turtle 메서드:: 
* TurtleScreen/Screen의 메서드:: 

@end menu

@node Turtle 메서드,TurtleScreen/Screen의 메서드,,Turtle graphics reference
@anchor{library/turtle turtle-methods}@anchor{4474}
@subsubsection Turtle 메서드



@table @asis

@item 거북이 움직임


@table @asis

@item 이동과 그리기


@display
@ref{3640,,forward()} | @ref{4475,,fd()}@w{ }
@ref{4476,,backward()} | @ref{4477,,bk()} | @ref{4478,,back()}@w{ }
@ref{4479,,right()} | @ref{447a,,rt()}@w{ }
@ref{447b,,left()} | @ref{447c,,lt()}@w{ }
@ref{447d,,goto()} | @ref{447e,,setpos()} | @ref{447f,,setposition()}@w{ }
@ref{1a97,,teleport()}@w{ }
@ref{4480,,setx()}@w{ }
@ref{4481,,sety()}@w{ }
@ref{4482,,setheading()} | @ref{4483,,seth()}@w{ }
@ref{4484,,home()}@w{ }
@ref{4485,,circle()}@w{ }
@ref{4486,,dot()}@w{ }
@ref{4487,,stamp()}@w{ }
@ref{4488,,clearstamp()}@w{ }
@ref{4489,,clearstamps()}@w{ }
@ref{448a,,undo()}@w{ }
@ref{448b,,speed()}@w{ }
@end display



@item 거북이의 상태 보고


@display
@ref{448c,,position()} | @ref{448d,,pos()}@w{ }
@ref{448e,,towards()}@w{ }
@ref{448f,,xcor()}@w{ }
@ref{4490,,ycor()}@w{ }
@ref{4491,,heading()}@w{ }
@ref{4492,,distance()}@w{ }
@end display



@item 설정과 측정


@display
@ref{4493,,degrees()}@w{ }
@ref{4494,,radians()}@w{ }
@end display


@end table

@item 펜 제어


@table @asis

@item 그리기 상태


@display
@ref{4495,,pendown()} | @ref{4496,,pd()} | @ref{4497,,down()}@w{ }
@ref{4498,,penup()} | @ref{4499,,pu()} | @ref{449a,,up()}@w{ }
@ref{449b,,pensize()} | @ref{449c,,width()}@w{ }
@ref{449d,,pen()}@w{ }
@ref{449e,,isdown()}@w{ }
@end display



@item 색상 제어


@display
@ref{449f,,color()}@w{ }
@ref{44a0,,pencolor()}@w{ }
@ref{44a1,,fillcolor()}@w{ }
@end display



@item 채우기


@display
@ref{44a2,,filling()}@w{ }
@ref{2a3,,fill()}@w{ }
@ref{446c,,begin_fill()}@w{ }
@ref{446d,,end_fill()}@w{ }
@end display



@item 더 많은 그리기 제어


@display
@ref{44a3,,reset()}@w{ }
@ref{44a4,,clear()}@w{ }
@ref{44a5,,write()}@w{ }
@end display


@end table

@item 거북이 상태


@table @asis

@item 가시성


@display
@ref{44a6,,showturtle()} | @ref{44a7,,st()}@w{ }
@ref{44a8,,hideturtle()} | @ref{44a9,,ht()}@w{ }
@ref{44aa,,isvisible()}@w{ }
@end display



@item 외관


@display
@ref{44ab,,shape()}@w{ }
@ref{44ac,,resizemode()}@w{ }
@ref{44ad,,shapesize()} | @ref{44ae,,turtlesize()}@w{ }
@ref{44af,,shearfactor()}@w{ }
@ref{92e,,tiltangle()}@w{ }
@ref{44b0,,tilt()}@w{ }
@ref{44b1,,shapetransform()}@w{ }
@ref{44b2,,get_shapepoly()}@w{ }
@end display


@end table

@item 이벤트 사용하기


@display
@ref{44b3,,onclick()}@w{ }
@ref{44b4,,onrelease()}@w{ }
@ref{44b5,,ondrag()}@w{ }
@end display



@item 특수 Turtle 메서드


@display
@ref{2a4,,poly()}@w{ }
@ref{44b6,,begin_poly()}@w{ }
@ref{44b7,,end_poly()}@w{ }
@ref{44b8,,get_poly()}@w{ }
@ref{44b9,,clone()}@w{ }
@ref{44ba,,getturtle()} | @ref{44bb,,getpen()}@w{ }
@ref{44bc,,getscreen()}@w{ }
@ref{44bd,,setundobuffer()}@w{ }
@ref{44be,,undobufferentries()}@w{ }
@end display


@end table

@node TurtleScreen/Screen의 메서드,,Turtle 메서드,Turtle graphics reference
@anchor{library/turtle methods-of-turtlescreen-screen}@anchor{44bf}
@subsubsection TurtleScreen/Screen의 메서드



@table @asis

@item 창 제어


@display
@ref{44c0,,bgcolor()}@w{ }
@ref{44c1,,bgpic()}@w{ }
@ref{44c2,,clearscreen()}@w{ }
@ref{44c3,,resetscreen()}@w{ }
@ref{44c4,,screensize()}@w{ }
@ref{44c5,,setworldcoordinates()}@w{ }
@end display



@item 애니메이션 제어


@display
@ref{2a5,,no_animation()}@w{ }
@ref{44c6,,delay()}@w{ }
@ref{44c7,,tracer()}@w{ }
@ref{44c8,,update()}@w{ }
@end display



@item 화면 이벤트 사용하기


@display
@ref{44c9,,listen()}@w{ }
@ref{44ca,,onkey()} | @ref{44cb,,onkeyrelease()}@w{ }
@ref{44cc,,onkeypress()}@w{ }
@ref{44b3,,onclick()} | @ref{44cd,,onscreenclick()}@w{ }
@ref{44ce,,ontimer()}@w{ }
@ref{44cf,,mainloop()} | @ref{44d0,,done()}@w{ }
@end display



@item 설정과 특수 메서드


@display
@ref{44d1,,mode()}@w{ }
@ref{44d2,,colormode()}@w{ }
@ref{44d3,,getcanvas()}@w{ }
@ref{44d4,,getshapes()}@w{ }
@ref{44d5,,register_shape()} | @ref{44d6,,addshape()}@w{ }
@ref{44d7,,turtles()}@w{ }
@ref{44d8,,window_height()}@w{ }
@ref{44d9,,window_width()}@w{ }
@end display



@item 입력 메서드


@display
@ref{1c78,,textinput()}@w{ }
@ref{1c79,,numinput()}@w{ }
@end display



@item Screen 특정 메서드


@display
@ref{44da,,bye()}@w{ }
@ref{44db,,exitonclick()}@w{ }
@ref{1971,,save()}@w{ }
@ref{44dc,,setup()}@w{ }
@ref{44dd,,title()}@w{ }
@end display


@end table

@node RawTurtle/Turtl의 메서드와 해당 함수,TurtleScreen/Screen 메서드와 해당 함수,Turtle graphics reference,turtle — Turtle graphics
@anchor{library/turtle methods-of-rawturtle-turtle-and-corresponding-functions}@anchor{44de}
@subsubsection RawTurtle/Turtl의 메서드와 해당 함수


이 섹션의 대부분의 예제는 @code{turtle}이라는 Turtle 인스턴스를 참조합니다.

@menu
* 거북이 움직임:: 
* 거북이의 상태 보고:: 
* 측정 설정:: 
* 펜 제어: 펜 제어<2>. 
* 거북이 상태:: 
* 이벤트 사용하기:: 
* 특수 Turtle 메서드:: 
* 복합 모양:: 

@end menu

@node 거북이 움직임,거북이의 상태 보고,,RawTurtle/Turtl의 메서드와 해당 함수
@anchor{library/turtle turtle-motion}@anchor{44df}
@subsubsection 거북이 움직임


@geindex forward() (turtle 모듈)
@geindex fd() (turtle 모듈)
@anchor{library/turtle turtle forward}@anchor{3640}
@deffn {함수} turtle.forward (distance)
@anchor{library/turtle turtle fd}@anchor{4475}
@deffnx {함수} turtle.fd (distance)

@*매개변수: 
@code{distance} – 숫자 (정수나 실수)


거북이가 향한 방향으로, 지정된 `distance'만큼 거북이를 앞으로 움직입니다.

@example
>>> turtle.position()
(0.00,0.00)
>>> turtle.forward(25)
>>> turtle.position()
(25.00,0.00)
>>> turtle.forward(-75)
>>> turtle.position()
(-50.00,0.00)
@end example
@end deffn

@geindex back() (turtle 모듈)
@geindex bk() (turtle 모듈)
@geindex backward() (turtle 모듈)
@anchor{library/turtle turtle back}@anchor{4478}
@deffn {함수} turtle.back (distance)
@anchor{library/turtle turtle bk}@anchor{4477}
@deffnx {함수} turtle.bk (distance)
@anchor{library/turtle turtle backward}@anchor{4476}
@deffnx {함수} turtle.backward (distance)

@*매개변수: 
@code{distance} – 숫자


거북이가 향한 반대 방향으로, `distance'만큼 거북이를 뒤로 움직입니다. 거북이의 방향을 바꾸지 않습니다.

@c >>> turtle.goto(0, 0)

@example
>>> turtle.position()
(0.00,0.00)
>>> turtle.backward(30)
>>> turtle.position()
(-30.00,0.00)
@end example
@end deffn

@geindex right() (turtle 모듈)
@geindex rt() (turtle 모듈)
@anchor{library/turtle turtle right}@anchor{4479}
@deffn {함수} turtle.right (angle)
@anchor{library/turtle turtle rt}@anchor{447a}
@deffnx {함수} turtle.rt (angle)

@*매개변수: 
@code{angle} – 숫자 (정수나 실수)


`angle' 단위만큼 거북이를 오른쪽으로 회전합니다. (단위는 기본적으로 도(degree)이지만, @ref{4493,,degrees()}와 @ref{4494,,radians()} 함수를 통해 설정할 수 있습니다.) 각도 방향은 거북이 모드에 따라 다릅니다, @ref{44d1,,mode()}를 참조하십시오.

@c >>> turtle.setheading(22)

@example
>>> turtle.heading()
22.0
>>> turtle.right(45)
>>> turtle.heading()
337.0
@end example
@end deffn

@geindex left() (turtle 모듈)
@geindex lt() (turtle 모듈)
@anchor{library/turtle turtle left}@anchor{447b}
@deffn {함수} turtle.left (angle)
@anchor{library/turtle turtle lt}@anchor{447c}
@deffnx {함수} turtle.lt (angle)

@*매개변수: 
@code{angle} – 숫자 (정수나 실수)


`angle' 단위만큼 거북이를 왼쪽으로 회전합니다. (단위는 기본적으로 도(degree)이지만, @ref{4493,,degrees()}와 @ref{4494,,radians()} 함수를 통해 설정할 수 있습니다.) 각도 방향은 거북이 모드에 따라 다릅니다, @ref{44d1,,mode()}를 참조하십시오.

@c >>> turtle.setheading(22)

@example
>>> turtle.heading()
22.0
>>> turtle.left(45)
>>> turtle.heading()
67.0
@end example
@end deffn

@geindex goto() (turtle 모듈)
@geindex setpos() (turtle 모듈)
@geindex setposition() (turtle 모듈)
@anchor{library/turtle turtle goto}@anchor{447d}
@deffn {함수} turtle.goto (x, y=None)
@anchor{library/turtle turtle setpos}@anchor{447e}
@deffnx {함수} turtle.setpos (x, y=None)
@anchor{library/turtle turtle setposition}@anchor{447f}
@deffnx {함수} turtle.setposition (x, y=None)

@*매개변수: 

@itemize *

@item 
@code{x} – 숫자나 숫자의 쌍/벡터

@item 
@code{y} – 숫자나 @code{None}
@end itemize


`y'가 @code{None}이면, `x'는 좌표 쌍이거나 @ref{44e0,,Vec2D}여야 합니다 (예를 들어 @ref{448d,,pos()}에서 반환된 것과 같은).

거북이를 절대 위치로 움직입니다. 펜이 내려져 있으면, 선을 그립니다. 거북이의 방향을 바꾸지 않습니다.

@c >>> turtle.goto(0, 0)

@example
>>> tp = turtle.pos()
>>> tp
(0.00,0.00)
>>> turtle.setpos(60,30)
>>> turtle.pos()
(60.00,30.00)
>>> turtle.setpos((20,80))
>>> turtle.pos()
(20.00,80.00)
>>> turtle.setpos(tp)
>>> turtle.pos()
(0.00,0.00)
@end example
@end deffn

@geindex teleport() (turtle 모듈)
@anchor{library/turtle turtle teleport}@anchor{1a97}
@deffn {함수} turtle.teleport (x, y=None, *, fill_gap=False)

@*매개변수: 

@itemize *

@item 
@code{x} – 숫자나 @code{None}

@item 
@code{y} – 숫자나 @code{None}

@item 
@code{fill_gap} – a boolean
@end itemize


Move turtle to an absolute position. Unlike goto(x, y), a line will not
be drawn. The turtle’s orientation does not change. If currently
filling, the polygon(s) teleported from will be filled after leaving,
and filling will begin again after teleporting. This can be disabled
with fill_gap=True, which makes the imaginary line traveled during
teleporting act as a fill barrier like in goto(x, y).

@c >>> turtle.goto(0, 0)

@example
>>> tp = turtle.pos()
>>> tp
(0.00,0.00)
>>> turtle.teleport(60)
>>> turtle.pos()
(60.00,0.00)
>>> turtle.teleport(y=10)
>>> turtle.pos()
(60.00,10.00)
>>> turtle.teleport(20, 30)
>>> turtle.pos()
(20.00,30.00)
@end example


Added in version 3.12.

@end deffn

@geindex setx() (turtle 모듈)
@anchor{library/turtle turtle setx}@anchor{4480}
@deffn {함수} turtle.setx (x)

@*매개변수: 
@code{x} – 숫자 (정수나 실수)


거북이의 첫 번째 좌표를 `x'로 설정하고, 두 번째 좌표는 변경하지 않습니다.

@c >>> turtle.goto(0, 240)

@example
>>> turtle.position()
(0.00,240.00)
>>> turtle.setx(10)
>>> turtle.position()
(10.00,240.00)
@end example
@end deffn

@geindex sety() (turtle 모듈)
@anchor{library/turtle turtle sety}@anchor{4481}
@deffn {함수} turtle.sety (y)

@*매개변수: 
@code{y} – 숫자 (정수나 실수)


거북이의 두 번째 좌표를 `y'로 설정하고, 첫 번째 좌표는 변경하지 않습니다.

@c >>> turtle.goto(0, 40)

@example
>>> turtle.position()
(0.00,40.00)
>>> turtle.sety(-10)
>>> turtle.position()
(0.00,-10.00)
@end example
@end deffn

@geindex setheading() (turtle 모듈)
@geindex seth() (turtle 모듈)
@anchor{library/turtle turtle setheading}@anchor{4482}
@deffn {함수} turtle.setheading (to_angle)
@anchor{library/turtle turtle seth}@anchor{4483}
@deffnx {함수} turtle.seth (to_angle)

@*매개변수: 
@code{to_angle} – 숫자 (정수나 실수)


거북이의 방향을 `to_angle'로 설정합니다. 다음은 몇 가지 일반적인 도(degree)로 나타낸 방향입니다:


@multitable {xxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxx} 
@headitem

표준 모드

@tab

로고 모드

@item

0 - 동

@tab

0 - 북

@item

90 - 북

@tab

90 - 동

@item

180 - 서

@tab

180 - 남

@item

270 - 남

@tab

270 - 서

@end multitable


@example
>>> turtle.setheading(90)
>>> turtle.heading()
90.0
@end example
@end deffn

@geindex home() (turtle 모듈)
@anchor{library/turtle turtle home}@anchor{4484}
@deffn {함수} turtle.home ()

거북이를 원점 – 좌표 (0,0) – 으로 이동하고 방향을 시작 방향으로 설정합니다 (모드에 따라 다릅니다, @ref{44d1,,mode()}를 참조하십시오).

@c >>> turtle.setheading(90)
@c >>> turtle.goto(0, -10)

@example
>>> turtle.heading()
90.0
>>> turtle.position()
(0.00,-10.00)
>>> turtle.home()
>>> turtle.position()
(0.00,0.00)
>>> turtle.heading()
0.0
@end example
@end deffn

@geindex circle() (turtle 모듈)
@anchor{library/turtle turtle circle}@anchor{4485}
@deffn {함수} turtle.circle (radius, extent=None, steps=None)

@*매개변수: 

@itemize *

@item 
@code{radius} – 숫자

@item 
@code{extent} – 숫자 (또는 @code{None})

@item 
@code{steps} – 정수 (또는 @code{None})
@end itemize


주어진 반지름(`radius')으로 원을 그립니다. 중심은 거북이 왼쪽으로 `radius' 단위입니다; `extent' – 각도 – 는 원의 어느 부분이 그려지는지를 결정합니다. `extent'가 주어지지 않으면, 전체 원을 그립니다. `extent'가 완전한 원이 아니면, 호의 한 끝점이 현재 펜 위치입니다. `radius'가 양수면 시계 반대 방향으로, 그렇지 않으면 시계 방향으로 호를 그립니다. 마지막으로 거북이의 방향이 `extent'만큼 변경됩니다.

원은 내접하는 정다각형으로 근사되므로, `steps'가 사용할 단계 수를 결정합니다. 제공하지 않으면, 자동으로 계산됩니다. 정다각형을 그리는 데 사용할 수 있습니다.

@example
>>> turtle.home()
>>> turtle.position()
(0.00,0.00)
>>> turtle.heading()
0.0
>>> turtle.circle(50)
>>> turtle.position()
(-0.00,0.00)
>>> turtle.heading()
0.0
>>> turtle.circle(120, 180)  # 반원을 그립니다
>>> turtle.position()
(0.00,240.00)
>>> turtle.heading()
180.0
@end example
@end deffn

@geindex dot() (turtle 모듈)
@anchor{library/turtle turtle dot}@anchor{4486}
@deffn {함수} turtle.dot ()

@deffnx {함수} turtle.dot (size)

@deffnx {함수} turtle.dot (color, /)

@deffnx {함수} turtle.dot (size, color, /)

@deffnx {함수} turtle.dot (size, r, g, b, /)

@*매개변수: 

@itemize *

@item 
@code{size} – 정수 >= 1 (주어지면)

@item 
@code{color} – 색상 문자열이나 숫자 색상 튜플
@end itemize


Draw a circular dot with diameter `size', using `color'.  If `size' is
not given, the maximum of @code{pensize+4} and @code{2*pensize} is used.

@example
>>> turtle.home()
>>> turtle.dot()
>>> turtle.fd(50); turtle.dot(20, "blue"); turtle.fd(50)
>>> turtle.position()
(100.00,-0.00)
>>> turtle.heading()
0.0
@end example
@end deffn

@geindex stamp() (turtle 모듈)
@anchor{library/turtle turtle stamp}@anchor{4487}
@deffn {함수} turtle.stamp ()

거북이 모양의 사본을 현재 거북이 위치에서 캔버스에 찍습니다. 해당 스탬프에 대한 stamp_id를 반환하는데, @code{clearstamp(stamp_id)}를 호출하여 스탬프를 삭제하는 데 사용할 수 있습니다.

@example
>>> turtle.color("blue")
>>> stamp_id = turtle.stamp()
>>> turtle.fd(50)
@end example
@end deffn

@geindex clearstamp() (turtle 모듈)
@anchor{library/turtle turtle clearstamp}@anchor{4488}
@deffn {함수} turtle.clearstamp (stampid)

@*매개변수: 
@code{stampid} – 정수, 이전 @ref{4487,,stamp()} 호출의 반환 값이어야 합니다


지정된 `stampid'의 스탬프를 삭제합니다.

@example
>>> turtle.position()
(150.00,-0.00)
>>> turtle.color("blue")
>>> astamp = turtle.stamp()
>>> turtle.fd(50)
>>> turtle.position()
(200.00,-0.00)
>>> turtle.clearstamp(astamp)
>>> turtle.position()
(200.00,-0.00)
@end example
@end deffn

@geindex clearstamps() (turtle 모듈)
@anchor{library/turtle turtle clearstamps}@anchor{4489}
@deffn {함수} turtle.clearstamps (n=None)

@*매개변수: 
@code{n} – 정수 (또는 @code{None})


거북이 스탬프의 전부나 처음/마지막 `n' 개를 삭제합니다. `n'이 @code{None}이면, 모든 스탬프를 삭제합니다, `n' > 0 이면 처음 `n' 스탬프를 삭제하고, `n' < 0 이면 마지막 `n' 스탬프를 삭제합니다.

@example
>>> for i in range(8):
...     unused_stamp_id = turtle.stamp()
...     turtle.fd(30)
>>> turtle.clearstamps(2)
>>> turtle.clearstamps(-2)
>>> turtle.clearstamps()
@end example
@end deffn

@geindex undo() (turtle 모듈)
@anchor{library/turtle turtle undo}@anchor{448a}
@deffn {함수} turtle.undo ()

마지막 거북이의 행동을 (반복적으로) 되돌립니다. 되돌릴 수 있는 행동의 수는 언두버퍼(undobuffer)의 크기에 따라 결정됩니다.

@example
>>> for i in range(4):
...     turtle.fd(50); turtle.lt(80)
...
>>> for i in range(8):
...     turtle.undo()
@end example
@end deffn

@geindex speed() (turtle 모듈)
@anchor{library/turtle turtle speed}@anchor{448b}
@deffn {함수} turtle.speed (speed=None)

@*매개변수: 
@code{speed} – 0..10 범위의 정수나 속도 문자열 (아래를 참조하십시오)


거북이의 속도를 0..10 범위의 정숫값으로 설정합니다. 인자가 없으면, 현재 속도를 반환합니다.

입력이 10보다 크거나 0.5보다 작은 숫자면, 속도는 0으로 설정됩니다. 속도 문자열은 다음과 같이 속도 값에 매핑됩니다:


@itemize *

@item 
“fastest”:  0

@item 
“fast”:  10

@item 
“normal”:  6

@item 
“slow”:  3

@item 
“slowest”:  1
@end itemize

1에서 10까지의 속도는 선 그리기와 거북이 회전의 애니메이션이 점점 더 빨라집니다.

주의: `speed' = 0 은 애니메이션이 발생하지 `않음을' 의미합니다. forward/back은 거북이가 점프하게 만들고 마찬가지로 left/right는 거북이가 순간적으로 방향을 바꾸게 만듭니다.

@example
>>> turtle.speed()
3
>>> turtle.speed('normal')
>>> turtle.speed()
6
>>> turtle.speed(9)
>>> turtle.speed()
9
@end example
@end deffn

@node 거북이의 상태 보고,측정 설정,거북이 움직임,RawTurtle/Turtl의 메서드와 해당 함수
@anchor{library/turtle tell-turtle-s-state}@anchor{44e1}
@subsubsection 거북이의 상태 보고


@geindex position() (turtle 모듈)
@geindex pos() (turtle 모듈)
@anchor{library/turtle turtle position}@anchor{448c}
@deffn {함수} turtle.position ()
@anchor{library/turtle turtle pos}@anchor{448d}
@deffnx {함수} turtle.pos ()

거북이의 현재 위치 (x, y)를 (@ref{44e0,,Vec2D} 벡터로) 반환합니다.

@example
>>> turtle.pos()
(440.00,-0.00)
@end example
@end deffn

@geindex towards() (turtle 모듈)
@anchor{library/turtle turtle towards}@anchor{448e}
@deffn {함수} turtle.towards (x, y=None)

@*매개변수: 

@itemize *

@item 
@code{x} – 숫자 또는 숫자 쌍/벡터 또는 거북이 인스턴스

@item 
@code{y} – `x'가 숫자면 숫자, 그렇지 않으면 @code{None}
@end itemize


거북이 위치에서 (x, y), 벡터 또는 다른 거북이로 지정된 위치로의 선과의 각도를 반환합니다. 이것은 거북이의 시작 방향에 따라 다른데, 이는 모드에 따라 다릅니다 - “standard”/”world” 또는 “logo”.

@example
>>> turtle.goto(10, 10)
>>> turtle.towards(0,0)
225.0
@end example
@end deffn

@geindex xcor() (turtle 모듈)
@anchor{library/turtle turtle xcor}@anchor{448f}
@deffn {함수} turtle.xcor ()

거북이의 x 좌표를 반환합니다.

@example
>>> turtle.home()
>>> turtle.left(50)
>>> turtle.forward(100)
>>> turtle.pos()
(64.28,76.60)
>>> print(round(turtle.xcor(), 5))
64.27876
@end example
@end deffn

@geindex ycor() (turtle 모듈)
@anchor{library/turtle turtle ycor}@anchor{4490}
@deffn {함수} turtle.ycor ()

거북이의 y 좌표를 반환합니다.

@example
>>> turtle.home()
>>> turtle.left(60)
>>> turtle.forward(100)
>>> print(turtle.pos())
(50.00,86.60)
>>> print(round(turtle.ycor(), 5))
86.60254
@end example
@end deffn

@geindex heading() (turtle 모듈)
@anchor{library/turtle turtle heading}@anchor{4491}
@deffn {함수} turtle.heading ()

거북이의 현재 방향을 반환합니다 (값은 거북이 모드에 따라 다릅니다. @ref{44d1,,mode()}를 참조하십시오).

@example
>>> turtle.home()
>>> turtle.left(67)
>>> turtle.heading()
67.0
@end example
@end deffn

@geindex distance() (turtle 모듈)
@anchor{library/turtle turtle distance}@anchor{4492}
@deffn {함수} turtle.distance (x, y=None)

@*매개변수: 

@itemize *

@item 
@code{x} – 숫자 또는 숫자 쌍/벡터 또는 거북이 인스턴스

@item 
@code{y} – `x'가 숫자면 숫자, 그렇지 않으면 @code{None}
@end itemize


거북이에서 (x, y), 주어진 벡터 또는 주어진 다른 거북이까지의 거리를 거북이 단계 단위로 반환합니다.

@example
>>> turtle.home()
>>> turtle.distance(30,40)
50.0
>>> turtle.distance((30,40))
50.0
>>> joe = Turtle()
>>> joe.forward(77)
>>> turtle.distance(joe)
77.0
@end example
@end deffn

@node 측정 설정,펜 제어<2>,거북이의 상태 보고,RawTurtle/Turtl의 메서드와 해당 함수
@anchor{library/turtle settings-for-measurement}@anchor{44e2}
@subsubsection 측정 설정


@geindex degrees() (turtle 모듈)
@anchor{library/turtle turtle degrees}@anchor{4493}
@deffn {함수} turtle.degrees (fullcircle=360.0)

@*매개변수: 
@code{fullcircle} – 숫자


각도 측정 단위를 설정합니다, 즉 전체 원에 대한 “도(degrees)”의 수를 설정합니다. 기본값은 360도입니다.

@example
>>> turtle.home()
>>> turtle.left(90)
>>> turtle.heading()
90.0

>>> # 각도 측정 단위를 그레이드(grad)로 변경합니다 (곤(gon),
>>> # grade, 그라디안(gradian)이라고도 하며 직각의 1/100 에 해당합니다.)
>>> turtle.degrees(400.0)
>>> turtle.heading()
100.0
>>> turtle.degrees(360)
>>> turtle.heading()
90.0
@end example
@end deffn

@geindex radians() (turtle 모듈)
@anchor{library/turtle turtle radians}@anchor{4494}
@deffn {함수} turtle.radians ()

각도 측정 단위를 라디안으로 설정합니다. @code{degrees(2*math.pi)}와 동등합니다.

@example
>>> turtle.home()
>>> turtle.left(90)
>>> turtle.heading()
90.0
>>> turtle.radians()
>>> turtle.heading()
1.5707963267948966
@end example

@c >>> turtle.degrees(360)
@end deffn

@node 펜 제어<2>,거북이 상태,측정 설정,RawTurtle/Turtl의 메서드와 해당 함수
@anchor{library/turtle id1}@anchor{44e3}
@subsubsection 펜 제어


@menu
* 그리기 상태:: 
* 색상 제어:: 
* 채우기:: 
* 더 많은 그리기 제어:: 

@end menu

@node 그리기 상태,색상 제어,,펜 제어<2>
@anchor{library/turtle drawing-state}@anchor{44e4}
@subsubsection 그리기 상태


@geindex pendown() (turtle 모듈)
@geindex pd() (turtle 모듈)
@geindex down() (turtle 모듈)
@anchor{library/turtle turtle pendown}@anchor{4495}
@deffn {함수} turtle.pendown ()
@anchor{library/turtle turtle pd}@anchor{4496}
@deffnx {함수} turtle.pd ()
@anchor{library/turtle turtle down}@anchor{4497}
@deffnx {함수} turtle.down ()

펜을 내립니다 – 움직일 때 그립니다.
@end deffn

@geindex penup() (turtle 모듈)
@geindex pu() (turtle 모듈)
@geindex up() (turtle 모듈)
@anchor{library/turtle turtle penup}@anchor{4498}
@deffn {함수} turtle.penup ()
@anchor{library/turtle turtle pu}@anchor{4499}
@deffnx {함수} turtle.pu ()
@anchor{library/turtle turtle up}@anchor{449a}
@deffnx {함수} turtle.up ()

펜을 올립니다 – 움직일 때 그리지 않습니다.
@end deffn

@geindex pensize() (turtle 모듈)
@geindex width() (turtle 모듈)
@anchor{library/turtle turtle pensize}@anchor{449b}
@deffn {함수} turtle.pensize (width=None)
@anchor{library/turtle turtle width}@anchor{449c}
@deffnx {함수} turtle.width (width=None)

@*매개변수: 
@code{width} – 양수


선 두께를 `width'로 설정하거나 반환합니다. 크기 조정 모드(resizemode)가 “auto”로 설정되고 거북이 모양(shape)이 다각형이면, 해당 다각형은 같은 선 두께로 그려집니다. 인자가 없으면, 현재 펜 크기가 반환됩니다.

@example
>>> turtle.pensize()
1
>>> turtle.pensize(10)   # 여기서부터 두께가 10인 선이 그려집니다
@end example
@end deffn

@geindex pen() (turtle 모듈)
@anchor{library/turtle turtle pen}@anchor{449d}
@deffn {함수} turtle.pen (pen=None, **pendict)

@*매개변수: 

@itemize *

@item 
@code{pen} – 아래 나열된 키 중 일부나 전부가 포함된 딕셔너리

@item 
@code{pendict} – 아래에 나열된 키를 키워드로 사용하는 하나 이상의 키워드 인자
@end itemize


다음 키/값 쌍으로 “펜 딕셔너리”에 있는 펜의 속성을 반환하거나 설정합니다:


@itemize *

@item 
“shown”: True/False

@item 
“pendown”: True/False

@item 
“pencolor”: 색상 문자열이나 색상 튜플

@item 
“fillcolor”: 색상 문자열이나 색상 튜플

@item 
“pensize”: 양수

@item 
“speed”: 0..10 범위의 숫자

@item 
“resizemode”: “auto” 또는 “user” 또는 “noresize”

@item 
“stretchfactor”: (양수, 양수)

@item 
“outline”: 양수

@item 
“tilt”: 숫자
@end itemize

이 딕셔너리는 이전 펜 상태를 복원하기 위해 @ref{449d,,pen()}의 후속 호출에 대한 인자로 사용될 수 있습니다. 또한 이러한 속성 중 하나 이상을 키워드 인자로 제공할 수 있습니다. 하나의 문장에서 여러 펜 속성을 설정하는 데 사용할 수 있습니다.

@example
>>> turtle.pen(fillcolor="black", pencolor="red", pensize=10)
>>> sorted(turtle.pen().items())
[('fillcolor', 'black'), ('outline', 1), ('pencolor', 'red'),
 ('pendown', True), ('pensize', 10), ('resizemode', 'noresize'),
 ('shearfactor', 0.0), ('shown', True), ('speed', 9),
 ('stretchfactor', (1.0, 1.0)), ('tilt', 0.0)]
>>> penstate=turtle.pen()
>>> turtle.color("yellow", "")
>>> turtle.penup()
>>> sorted(turtle.pen().items())[:3]
[('fillcolor', '@w{'}), ('outline', 1), ('pencolor', 'yellow')]
>>> turtle.pen(penstate, fillcolor="green")
>>> sorted(turtle.pen().items())[:3]
[('fillcolor', 'green'), ('outline', 1), ('pencolor', 'red')]
@end example
@end deffn

@geindex isdown() (turtle 모듈)
@anchor{library/turtle turtle isdown}@anchor{449e}
@deffn {함수} turtle.isdown ()

펜이 내려가 있으면 @code{True}를, 올라가 있으면 @code{False}를 반환합니다.

@example
>>> turtle.penup()
>>> turtle.isdown()
False
>>> turtle.pendown()
>>> turtle.isdown()
True
@end example
@end deffn

@node 색상 제어,채우기,그리기 상태,펜 제어<2>
@anchor{library/turtle color-control}@anchor{44e5}
@subsubsection 색상 제어


@geindex pencolor() (turtle 모듈)
@anchor{library/turtle turtle pencolor}@anchor{44a0}
@deffn {함수} turtle.pencolor ()

@deffnx {함수} turtle.pencolor (color, /)

@deffnx {함수} turtle.pencolor (r, g, b, /)

펜 색상(pencolor)을 반환하거나 설정합니다.

네 가지 입력 형식이 허용됩니다:


@table @asis

@item @code{pencolor()}

Return the current pencolor as color specification string or
as a tuple (see example).  May be used as input to another
color/pencolor/fillcolor/bgcolor call.

@item @code{pencolor(colorstring)}

펜 색상을 @code{"red"}, @code{"yellow"} 또는 @code{"#33cc8c"}와 같은 Tk 색상 지정 문자열인 `colorstring'으로 설정합니다.

@item @code{pencolor((r, g, b))}

펜 색상을 `r', `g' 및 `b'의 튜플로 표현되는 RGB 색상으로 설정합니다. `r', `g' 및 `b' 각각은 0..colormode 범위에 있어야 합니다. 여기서 colormode는 1.0이나 255입니다 (@ref{44d2,,colormode()}를 참조하십시오).

@item @code{pencolor(r, g, b)}

펜 색상을 `r', `g' 및 `b'로 표현되는 RGB 색상으로 설정합니다. `r', `g' 및 `b'는 각각 0..colormode 범위에 있어야 합니다.
@end table

거북이 모양이 다각형이면, 해당 다각형의 외곽선은 새로 설정된 펜 색상으로 그려집니다.

@example
>>> colormode()
1.0
>>> turtle.pencolor()
'red'
>>> turtle.pencolor("brown")
>>> turtle.pencolor()
'brown'
>>> tup = (0.2, 0.8, 0.55)
>>> turtle.pencolor(tup)
>>> turtle.pencolor()
(0.2, 0.8, 0.5490196078431373)
>>> colormode(255)
>>> turtle.pencolor()
(51.0, 204.0, 140.0)
>>> turtle.pencolor('#32c18f')
>>> turtle.pencolor()
(50.0, 193.0, 143.0)
@end example
@end deffn

@geindex fillcolor() (turtle 모듈)
@anchor{library/turtle turtle fillcolor}@anchor{44a1}
@deffn {함수} turtle.fillcolor ()

@deffnx {함수} turtle.fillcolor (color, /)

@deffnx {함수} turtle.fillcolor (r, g, b, /)

채우기 색상(fillcolor)을 반환하거나 설정합니다.

네 가지 입력 형식이 허용됩니다:


@table @asis

@item @code{fillcolor()}

Return the current fillcolor as color specification string, possibly
in tuple format (see example).  May be used as input to another
color/pencolor/fillcolor/bgcolor call.

@item @code{fillcolor(colorstring)}

채우기 색상을 @code{"red"}, @code{"yellow"} 또는 @code{"#33cc8c"}와 같은 Tk 색상 지정 문자열인 `colorstring'으로 설정합니다.

@item @code{fillcolor((r, g, b))}

채우기 색상을 `r', `g' 및 `b'의 튜플로 표현되는 RGB 색상으로 설정합니다. `r', `g' 및 `b' 각각은 0..colormode 범위에 있어야 합니다. 여기서 colormode는 1.0이나 255입니다 (@ref{44d2,,colormode()}를 참조하십시오).

@item @code{fillcolor(r, g, b)}

채우기 색상을 `r', `g' 및 `b'로 표현되는 RGB 색상으로 설정합니다. `r', `g' 및 `b'는 각각 0..colormode 범위에 있어야 합니다.
@end table

거북이 모양이 다각형이면, 해당 다각형의 내부는 새로 설정된 채우기 색상으로 그려집니다.

@example
>>> turtle.fillcolor("violet")
>>> turtle.fillcolor()
'violet'
>>> turtle.pencolor()
(50.0, 193.0, 143.0)
>>> turtle.fillcolor((50, 193, 143))  # 정수입니다, 실수가 아닙니다
>>> turtle.fillcolor()
(50.0, 193.0, 143.0)
>>> turtle.fillcolor('#ffffff')
>>> turtle.fillcolor()
(255.0, 255.0, 255.0)
@end example
@end deffn

@geindex color() (turtle 모듈)
@anchor{library/turtle turtle color}@anchor{449f}
@deffn {함수} turtle.color ()

@deffnx {함수} turtle.color (color, /)

@deffnx {함수} turtle.color (r, g, b, /)

@deffnx {함수} turtle.color (pencolor, fillcolor, /)

펜 색상과 채우기 색상을 반환하거나 설정합니다.

몇 가지 입력 형식이 허용됩니다. 다음과 같이 0에서 3개의 인자를 사용합니다:


@table @asis

@item @code{color()}

@ref{44a0,,pencolor()}와 @ref{44a1,,fillcolor()}에 의해 반환된 현재 펜 색상과 현재 채우기 색상을 한 쌍의 색 지정 문자열이나 튜플로 반환합니다.

@item @code{color(colorstring)}, @code{color((r,g,b))}, @code{color(r,g,b)}

@ref{44a0,,pencolor()}에서와 같은 입력, 채우기 색상과 펜 색상을 모두 주어진 값으로 설정합니다.

@item @code{color(colorstring1, colorstring2)}, @code{color((r1,g1,b1), (r2,g2,b2))}

@code{pencolor(colorstring1)}과 @code{fillcolor(colorstring2)}와 동등하며 다른 입력 형식을 사용하는 경우도 유사합니다.
@end table

거북이 모양이 다각형이면, 해당 다각형의 외곽선과 내부가 새로 설정된 색상으로 그려집니다.

@example
>>> turtle.color("red", "green")
>>> turtle.color()
('red', 'green')
>>> color("#285078", "#a0c8f0")
>>> color()
((40.0, 80.0, 120.0), (160.0, 200.0, 240.0))
@end example
@end deffn

참조: Screen 메서드 @ref{44d2,,colormode()}.

@node 채우기,더 많은 그리기 제어,색상 제어,펜 제어<2>
@anchor{library/turtle filling}@anchor{44e6}
@subsubsection 채우기


@c >>> turtle.home()

@geindex filling() (turtle 모듈)
@anchor{library/turtle turtle filling}@anchor{44a2}
@deffn {함수} turtle.filling ()

채우기 상태(fillstate)를 반환합니다 (채우면 @code{True}, 그렇지 않으면 @code{False}).

@example
>>> turtle.begin_fill()
>>> if turtle.filling():
...    turtle.pensize(5)
... else:
...    turtle.pensize(3)
@end example
@end deffn

@geindex fill() (turtle 모듈)
@anchor{library/turtle turtle fill}@anchor{2a3}
@deffn {함수} turtle.fill ()

Fill the shape drawn in the @code{with turtle.fill():} block.

@example
>>> turtle.color("black", "red")
>>> with turtle.fill():
...     turtle.circle(80)
@end example

Using @code{fill()} is equivalent to adding the @ref{446c,,begin_fill()} before the
fill-block and @ref{446d,,end_fill()} after the fill-block:

@example
>>> turtle.color("black", "red")
>>> turtle.begin_fill()
>>> turtle.circle(80)
>>> turtle.end_fill()
@end example


Added in version 3.14.

@end deffn

@geindex begin_fill() (turtle 모듈)
@anchor{library/turtle turtle begin_fill}@anchor{446c}
@deffn {함수} turtle.begin_fill ()

채울 모양을 그리기 직전에 호출됩니다.
@end deffn

@geindex end_fill() (turtle 모듈)
@anchor{library/turtle turtle end_fill}@anchor{446d}
@deffn {함수} turtle.end_fill ()

@ref{446c,,begin_fill()}을 마지막으로 호출한 후 그린 모양을 채웁니다.

스스로 교차하는 다각형이나 여러 도형의 겹치는 영역이 채워지는지는 운영 체제 그래픽, 겹침의 유형 및 겹침의 수에 따라 다릅니다. 예를 들어, 위의 거북이 별은 모두 노란색이거나 일부 흰색 영역이 있을 수 있습니다.

@example
>>> turtle.color("black", "red")
>>> turtle.begin_fill()
>>> turtle.circle(80)
>>> turtle.end_fill()
@end example
@end deffn

@node 더 많은 그리기 제어,,채우기,펜 제어<2>
@anchor{library/turtle more-drawing-control}@anchor{44e7}
@subsubsection 더 많은 그리기 제어


@geindex reset() (turtle 모듈)
@anchor{library/turtle turtle reset}@anchor{44a3}
@deffn {함수} turtle.reset ()

화면에서 거북이의 그림을 삭제하고, 거북이를 다시 중심으로 옮기고, 변수를 기본값으로 설정합니다.

@example
>>> turtle.goto(0,-22)
>>> turtle.left(100)
>>> turtle.position()
(0.00,-22.00)
>>> turtle.heading()
100.0
>>> turtle.reset()
>>> turtle.position()
(0.00,0.00)
>>> turtle.heading()
0.0
@end example
@end deffn

@geindex clear() (turtle 모듈)
@anchor{library/turtle turtle clear}@anchor{44a4}
@deffn {함수} turtle.clear ()

화면에서 거북이 그림을 삭제합니다. 거북이를 움직이지 않습니다. 다른 거북이의 그림뿐만 아니라 거북이의 상태와 위치는 영향을 받지 않습니다.
@end deffn

@geindex write() (turtle 모듈)
@anchor{library/turtle turtle write}@anchor{44a5}
@deffn {함수} turtle.write (arg, move=False, align='left', font=('Arial', 8, 'normal'))

@*매개변수: 

@itemize *

@item 
@code{arg} – TurtleScreen에 기록될 객체

@item 
@code{move} – True/False

@item 
@code{align} – “left”, “center” 또는 “right” 문자열 중 하나

@item 
@code{font} – 3-튜플 (fontname, fontsize, fonttype)
@end itemize


`align'(“left”, “center” 또는 “right”)에 따라 현재 거북이 위치에서 주어진 글꼴(font)로 텍스트 - `arg'의 문자열 표현 - 를 기록합니다. `move'가 참이면, 펜이 텍스트의 오른쪽 아래 모서리로 이동합니다. 기본적으로, `move'는 @code{False}입니다.

@example
>>> turtle.write("Home = ", True, align="center")
>>> turtle.write((0,0), True)
@end example
@end deffn

@node 거북이 상태,이벤트 사용하기,펜 제어<2>,RawTurtle/Turtl의 메서드와 해당 함수
@anchor{library/turtle turtle-state}@anchor{44e8}
@subsubsection 거북이 상태


@menu
* 가시성:: 
* 외관:: 

@end menu

@node 가시성,외관,,거북이 상태
@anchor{library/turtle visibility}@anchor{44e9}
@subsubsection 가시성


@geindex hideturtle() (turtle 모듈)
@geindex ht() (turtle 모듈)
@anchor{library/turtle turtle hideturtle}@anchor{44a8}
@deffn {함수} turtle.hideturtle ()
@anchor{library/turtle turtle ht}@anchor{44a9}
@deffnx {함수} turtle.ht ()

거북이를 보이지 않게 합니다. 거북이를 숨기면 그리기 속도가 눈에 띄게 빨라지므로, 복잡한 그리기를 하는 동안 이렇게 하는 것이 좋습니다.

@example
>>> turtle.hideturtle()
@end example
@end deffn

@geindex showturtle() (turtle 모듈)
@geindex st() (turtle 모듈)
@anchor{library/turtle turtle showturtle}@anchor{44a6}
@deffn {함수} turtle.showturtle ()
@anchor{library/turtle turtle st}@anchor{44a7}
@deffnx {함수} turtle.st ()

거북이가 보이게 합니다.

@example
>>> turtle.showturtle()
@end example
@end deffn

@geindex isvisible() (turtle 모듈)
@anchor{library/turtle turtle isvisible}@anchor{44aa}
@deffn {함수} turtle.isvisible ()

거북이가 보이면 @code{True}를, 숨겨져 있으면 @code{False}를 반환합니다.

@example
>>> turtle.hideturtle()
>>> turtle.isvisible()
False
>>> turtle.showturtle()
>>> turtle.isvisible()
True
@end example
@end deffn

@node 외관,,가시성,거북이 상태
@anchor{library/turtle appearance}@anchor{44ea}
@subsubsection 외관


@geindex shape() (turtle 모듈)
@anchor{library/turtle turtle shape}@anchor{44ab}
@deffn {함수} turtle.shape (name=None)

@*매개변수: 
@code{name} – 유효한 모양 이름(shapename)인 문자열


주어진 `name'의 모양으로 거북이 모양을 설정하거나, 이름이 없으면 현재 모양의 이름을 반환합니다. `name'의 모양은 TurtleScreen의 모양 딕셔너리에 있어야 합니다. 처음에는 다음과 같은 다각형 모양이 있습니다: “arrow”, “turtle”, “circle”, “square”, “triangle”, “classic”. 모양을 다루는 방법에 대한 자세한 내용은 Screen 메서드 @ref{44d5,,register_shape()}을 참조하십시오.

@example
>>> turtle.shape()
'classic'
>>> turtle.shape("turtle")
>>> turtle.shape()
'turtle'
@end example
@end deffn

@geindex resizemode() (turtle 모듈)
@anchor{library/turtle turtle resizemode}@anchor{44ac}
@deffn {함수} turtle.resizemode (rmode=None)

@*매개변수: 
@code{rmode} – 문자열 “auto”, “user”, “noresize” 중 하나


크기 조정 모드(resizemode)를 다음 값 중 하나로 설정합니다: “auto”, “user”, “noresize”. `rmode'가 제공되지 않으면, 현재 크기 조정 모드를 반환합니다. 각 크기 조정 모드는 다음과 같은 효과가 있습니다:


@itemize -

@item 
“auto”: 펜 크기(pensize)의 값에 맞춰 거북이의 외관을 조정합니다.

@item 
“user”: @ref{44ad,,shapesize()}로 설정된 stretchfactor와 outlinewidth (outline) 값에 따라 거북이의 외관을 조정합니다.

@item 
“noresize”: 거북이의 외관 조정이 일어나지 않습니다.
@end itemize

@ref{44ad,,shapesize()}에 인자를 사용하면 @code{resizemode("user")} 를 호출합니다.

@example
>>> turtle.resizemode()
'noresize'
>>> turtle.resizemode("auto")
>>> turtle.resizemode()
'auto'
@end example
@end deffn

@geindex shapesize() (turtle 모듈)
@geindex turtlesize() (turtle 모듈)
@anchor{library/turtle turtle shapesize}@anchor{44ad}
@deffn {함수} turtle.shapesize (stretch_wid=None, stretch_len=None, outline=None)
@anchor{library/turtle turtle turtlesize}@anchor{44ae}
@deffnx {함수} turtle.turtlesize (stretch_wid=None, stretch_len=None, outline=None)

@*매개변수: 

@itemize *

@item 
@code{stretch_wid} – 양수

@item 
@code{stretch_len} – 양수

@item 
@code{outline} – 양수
@end itemize


펜의 속성 x/y-stretchfactor 및/또는 outline을 반환하거나 설정합니다. 크기 조정 모드(resizemode)를 “user”로 설정합니다. 크기 조정 모드(resizemode)가 “user”로 설정될 때만, 거북이가 신축 계수(stretchfactor)에 따라 늘려서 표시됩니다: `stretch_wid'는 방향에 수직인 신축 계수, `stretch_len'은 방향 쪽의 신축 계수이고, `outline'은 모양의 윤곽의 너비를 결정합니다.

@example
>>> turtle.shapesize()
(1.0, 1.0, 1)
>>> turtle.resizemode("user")
>>> turtle.shapesize(5, 5, 12)
>>> turtle.shapesize()
(5, 5, 12)
>>> turtle.shapesize(outline=8)
>>> turtle.shapesize()
(5, 5, 8)
@end example
@end deffn

@geindex shearfactor() (turtle 모듈)
@anchor{library/turtle turtle shearfactor}@anchor{44af}
@deffn {함수} turtle.shearfactor (shear=None)

@*매개변수: 
@code{shear} – 숫자 (선택 사항)


기울기 계수(shearfactor)를 설정하거나 반환합니다. 주어진 기울기 계수 shear(기울기 각의 탄젠트입니다)에 따라 거북이 모양을 기울입니다. 거북이의 방향(이동 방향)을 변경하지 `않습니다'. shear가 제공되지 않으면: 현재 기울기 계수(shearfactor)를, 즉 기울기 각도의 탄젠트를 반환합니다. 기울기 각도는 거북이의 방향에 평행한 직선이 기울어진 각도입니다.

@example
>>> turtle.shape("circle")
>>> turtle.shapesize(5,2)
>>> turtle.shearfactor(0.5)
>>> turtle.shearfactor()
0.5
@end example
@end deffn

@geindex tilt() (turtle 모듈)
@anchor{library/turtle turtle tilt}@anchor{44b0}
@deffn {함수} turtle.tilt (angle)

@*매개변수: 
@code{angle} – 숫자


현재 틸트 각도(tilt-angle)에서 거북이 모양을 `angle'만큼 회전합니다. 그러나 거북이의 방향(이동 방향)을 변경하지 `않습니다'.

@example
>>> turtle.reset()
>>> turtle.shape("circle")
>>> turtle.shapesize(5,2)
>>> turtle.tilt(30)
>>> turtle.fd(50)
>>> turtle.tilt(30)
>>> turtle.fd(50)
@end example
@end deffn

@geindex tiltangle() (turtle 모듈)
@anchor{library/turtle turtle tiltangle}@anchor{92e}
@deffn {함수} turtle.tiltangle (angle=None)

@*매개변수: 
@code{angle} – 숫자 (선택 사항)


현재 틸트 각도(tilt-angle)를 설정하거나 반환합니다. angle이 주어지면, 현재 틸트 각도(tilt-angle)와 관계없이 거북이 모양을 angle이 지정하는 방향을 가리키도록 회전합니다. 거북이의 방향(이동 방향)을 변경하지 `않습니다'. angle이 주어지지 않으면: 현재 틸트 각도, 즉 거북이 모양의 방향과 거북이 방향(이동 방향) 사이의 각도를 반환합니다.

@example
>>> turtle.reset()
>>> turtle.shape("circle")
>>> turtle.shapesize(5,2)
>>> turtle.tilt(45)
>>> turtle.tiltangle()
45.0
@end example
@end deffn

@geindex shapetransform() (turtle 모듈)
@anchor{library/turtle turtle shapetransform}@anchor{44b1}
@deffn {함수} turtle.shapetransform (t11=None, t12=None, t21=None, t22=None)

@*매개변수: 

@itemize *

@item 
@code{t11} – 숫자 (선택 사항)

@item 
@code{t12} – 숫자 (선택 사항)

@item 
@code{t21} – 숫자 (선택 사항)

@item 
@code{t12} – 숫자 (선택 사항)
@end itemize


거북이 모양의 현재 변환 행렬을 설정하거나 반환합니다.

행렬 요소가 아무것도 제공되지 않으면, 변환 행렬을 4개 요소의 튜플로 반환합니다. 그렇지 않으면, 주어진 요소를 설정하고 첫 번째 행 t11, t12와 두 번째 행 t21, t22로 구성된 행렬에 따라 거북이 모양을 변환합니다. 행렬식(determinant) t11 * t22 - t12 * t21은 0이 아니어야 합니다, 그렇지 않으면 에러가 발생합니다. 주어진 행렬에 따라 신축 계수(stretchfactor), 기울기 계수(shearfactor) 및 틸트 각도(tiltangle)를 수정합니다.

@example
>>> turtle = Turtle()
>>> turtle.shape("square")
>>> turtle.shapesize(4,2)
>>> turtle.shearfactor(-0.5)
>>> turtle.shapetransform()
(4.0, -1.0, -0.0, 2.0)
@end example
@end deffn

@geindex get_shapepoly() (turtle 모듈)
@anchor{library/turtle turtle get_shapepoly}@anchor{44b2}
@deffn {함수} turtle.get_shapepoly ()

현재 모양 다각형을 좌표 쌍의 튜플로 반환합니다. 이것은 새로운 모양이나 복합 모양의 구성 요소를 정의하는 데 사용할 수 있습니다.

@example
>>> turtle.shape("square")
>>> turtle.shapetransform(4, -1, 0, 2)
>>> turtle.get_shapepoly()
((50, -20), (30, 20), (-50, 20), (-30, -20))
@end example
@end deffn

@node 이벤트 사용하기,특수 Turtle 메서드,거북이 상태,RawTurtle/Turtl의 메서드와 해당 함수
@anchor{library/turtle using-events}@anchor{44eb}
@subsubsection 이벤트 사용하기



@deffn {함수} turtle.onclick (fun, btn=1, add=None)

@*매개변수: 

@itemize *

@item 
@code{fun} – 캔버스에서 클릭한 점의 좌표로 호출되는 두 개의 인자가 있는 함수

@item 
@code{btn} – 마우스 버튼 수, 기본값은 1 (마우스 왼쪽 버튼)

@item 
@code{add} – @code{True} 또는 @code{False} – @code{True}이면, 새 연결이 추가되고, 그렇지 않으면 이전 연결을 대체합니다
@end itemize


이 거북이의 마우스 클릭 이벤트에 `fun'을 연결합니다. `fun'이 @code{None}이면 기존 연결이 제거됩니다. 익명의 거북이, 즉 절차적 방법의 예:

@example
>>> def turn(x, y):
...     left(180)
...
>>> onclick(turn)  # 이제 거북이를 클릭하면 회전합니다.
>>> onclick(None)  # 이벤트 연결을 제거합니다
@end example
@end deffn

@geindex onrelease() (turtle 모듈)
@anchor{library/turtle turtle onrelease}@anchor{44b4}
@deffn {함수} turtle.onrelease (fun, btn=1, add=None)

@*매개변수: 

@itemize *

@item 
@code{fun} – 캔버스에서 클릭한 점의 좌표로 호출되는 두 개의 인자가 있는 함수

@item 
@code{btn} – 마우스 버튼 수, 기본값은 1 (마우스 왼쪽 버튼)

@item 
@code{add} – @code{True} 또는 @code{False} – @code{True}이면, 새 연결이 추가되고, 그렇지 않으면 이전 연결을 대체합니다
@end itemize


이 거북이의 마우스 버튼 해제 이벤트에 `fun'을 연결합니다. `fun'이 @code{None}이면 기존 연결이 제거됩니다.

@example
>>> class MyTurtle(Turtle):
...     def glow(self,x,y):
...         self.fillcolor("red")
...     def unglow(self,x,y):
...         self.fillcolor("")
...
>>> turtle = MyTurtle()
>>> turtle.onclick(turtle.glow)     # 거북이를 클릭하면 붉은색으로 채웁니다,
>>> turtle.onrelease(turtle.unglow) # 버튼 해제하면 투명하게 만듭니다.
@end example
@end deffn

@geindex ondrag() (turtle 모듈)
@anchor{library/turtle turtle ondrag}@anchor{44b5}
@deffn {함수} turtle.ondrag (fun, btn=1, add=None)

@*매개변수: 

@itemize *

@item 
@code{fun} – 캔버스에서 클릭한 점의 좌표로 호출되는 두 개의 인자가 있는 함수

@item 
@code{btn} – 마우스 버튼 수, 기본값은 1 (마우스 왼쪽 버튼)

@item 
@code{add} – @code{True} 또는 @code{False} – @code{True}이면, 새 연결이 추가되고, 그렇지 않으면 이전 연결을 대체합니다
@end itemize


이 거북이의 마우스 이동 이벤트에 `fun'을 연결합니다. `fun'이 @code{None}이면 기존 연결이 제거됩니다.

참고: 거북이의 모든 마우스 이동 이벤트에 앞서 해당 거북이의 마우스 클릭 이벤트가 선행합니다.

@example
>>> turtle.ondrag(turtle.goto)
@end example

그 후, 거북이를 클릭하고 드래그하면 화면을 가로질러 거북이가 움직여 손 그림을 생성합니다 (펜이 내려가 있다면).
@end deffn

@node 특수 Turtle 메서드,복합 모양,이벤트 사용하기,RawTurtle/Turtl의 메서드와 해당 함수
@anchor{library/turtle special-turtle-methods}@anchor{44ec}
@subsubsection 특수 Turtle 메서드


@geindex poly() (turtle 모듈)
@anchor{library/turtle turtle poly}@anchor{2a4}
@deffn {함수} turtle.poly ()

Record the vertices of a polygon drawn in the @code{with turtle.poly():} block.
The first and last vertices will be connected.

@example
>>> with turtle.poly():
...     turtle.forward(100)
...     turtle.right(60)
...     turtle.forward(100)
@end example


Added in version 3.14.

@end deffn

@geindex begin_poly() (turtle 모듈)
@anchor{library/turtle turtle begin_poly}@anchor{44b6}
@deffn {함수} turtle.begin_poly ()

다각형의 꼭짓점 기록을 시작합니다. 현재 거북이 위치가 다각형의 첫 번째 꼭짓점입니다.
@end deffn

@geindex end_poly() (turtle 모듈)
@anchor{library/turtle turtle end_poly}@anchor{44b7}
@deffn {함수} turtle.end_poly ()

다각형의 꼭짓점 기록을 중지합니다. 현재 거북이 위치가 다각형의 마지막 꼭짓점입니다. 첫 번째 꼭짓점과 연결됩니다.
@end deffn

@geindex get_poly() (turtle 모듈)
@anchor{library/turtle turtle get_poly}@anchor{44b8}
@deffn {함수} turtle.get_poly ()

마지막으로 기록된 다각형을 반환합니다.

@example
>>> turtle.home()
>>> turtle.begin_poly()
>>> turtle.fd(100)
>>> turtle.left(20)
>>> turtle.fd(30)
>>> turtle.left(60)
>>> turtle.fd(50)
>>> turtle.end_poly()
>>> p = turtle.get_poly()
>>> register_shape("myFavouriteShape", p)
@end example
@end deffn

@geindex clone() (turtle 모듈)
@anchor{library/turtle turtle clone}@anchor{44b9}
@deffn {함수} turtle.clone ()

같은 위치, 방향 및 거북이 속성을 가진 거북이 복제본을 만들고 반환합니다.

@example
>>> mick = Turtle()
>>> joe = mick.clone()
@end example
@end deffn

@geindex getturtle() (turtle 모듈)
@geindex getpen() (turtle 모듈)
@anchor{library/turtle turtle getturtle}@anchor{44ba}
@deffn {함수} turtle.getturtle ()
@anchor{library/turtle turtle getpen}@anchor{44bb}
@deffnx {함수} turtle.getpen ()

거북이 객체 자체를 반환합니다. 합리적인 용도로만 사용하십시오: “익명 거북이”를 반환하는 함수로:

@example
>>> pet = getturtle()
>>> pet.fd(50)
>>> pet
<turtle.Turtle object at 0x...>
@end example
@end deffn

@geindex getscreen() (turtle 모듈)
@anchor{library/turtle turtle getscreen}@anchor{44bc}
@deffn {함수} turtle.getscreen ()

거북이가 그리는 @ref{44ed,,TurtleScreen} 객체를 반환합니다. 그런 다음 해당 객체에 대해 TurtleScreen 메서드를 호출할 수 있습니다.

@example
>>> ts = turtle.getscreen()
>>> ts
<turtle._Screen object at 0x...>
>>> ts.bgcolor("pink")
@end example
@end deffn

@geindex setundobuffer() (turtle 모듈)
@anchor{library/turtle turtle setundobuffer}@anchor{44bd}
@deffn {함수} turtle.setundobuffer (size)

@*매개변수: 
@code{size} – 정수나 @code{None}


언두버퍼(undobuffer)를 설정하거나 비활성화합니다. `size'가 정수이면, 지정된 크기의 빈 언두버퍼가 설치됩니다. `size'는 @ref{448a,,undo()} 메서드/함수로 취소할 수 있는 최대 거북이 액션 수를 제공합니다. `size'가 @code{None}이면, 언두버퍼가 비활성화됩니다.

@example
>>> turtle.setundobuffer(42)
@end example
@end deffn

@geindex undobufferentries() (turtle 모듈)
@anchor{library/turtle turtle undobufferentries}@anchor{44be}
@deffn {함수} turtle.undobufferentries ()

언두버퍼에 있는 항목 수를 반환합니다.

@example
>>> while undobufferentries():
...     undo()
@end example
@end deffn

@node 복합 모양,,특수 Turtle 메서드,RawTurtle/Turtl의 메서드와 해당 함수
@anchor{library/turtle compound-shapes}@anchor{44ee}@anchor{library/turtle compoundshapes}@anchor{44ef}
@subsubsection 복합 모양


다른 색상의 여러 다각형으로 구성된 복합 거북이 모양을 사용하려면, 아래 설명된 대로 도우미 클래스 @ref{44f0,,Shape}을 명시적으로 사용해야 합니다:


@enumerate 

@item 
“compound” 유형의 빈 Shape 객체를 만듭니다.

@item 
@ref{44f1,,addcomponent()} 메서드를 사용하여, 원하는 만큼 이 객체에 구성 요소를 추가합니다.

예를 들면:

@example
>>> s = Shape("compound")
>>> poly1 = ((0,0),(10,-5),(0,10),(-10,-5))
>>> s.addcomponent(poly1, "red", "blue")
>>> poly2 = ((0,0),(10,-5),(-10,-5))
>>> s.addcomponent(poly2, "blue", "red")
@end example

@item 
이제 Shape을 Screen의 모양 리스트(shapelist)에 추가하고 사용합니다:

@example
>>> register_shape("myshape", s)
>>> shape("myshape")
@end example
@end enumerate

@cartouche
@quotation 참고 
@ref{44f0,,Shape} 클래스는 @ref{44d5,,register_shape()} 메서드에 의해 내부적으로 다른 방식으로 사용됩니다. 응용 프로그램 프로그래머는 위와 같이 복합 모양을 사용할 때 `만' Shape 클래스를 다뤄야 합니다!
@end quotation
@end cartouche

@node TurtleScreen/Screen 메서드와 해당 함수,공개 클래스,RawTurtle/Turtl의 메서드와 해당 함수,turtle — Turtle graphics
@anchor{library/turtle methods-of-turtlescreen-screen-and-corresponding-functions}@anchor{44f2}
@subsubsection TurtleScreen/Screen 메서드와 해당 함수


이 섹션의 대부분의 예제는 @code{screen}이라는 TurtleScreen 인스턴스를 참조합니다.

@c >>> screen = Screen()

@menu
* 창 제어:: 
* 애니메이션 제어:: 
* 화면 이벤트 사용하기:: 
* 입력 메서드:: 
* 설정과 특수 메서드:: 
* TurtleScreen에서 상속되지 않은@comma{} Screen만의 메서드: TurtleScreen에서 상속되지 않은 Screen만의 메서드. 

@end menu

@node 창 제어,애니메이션 제어,,TurtleScreen/Screen 메서드와 해당 함수
@anchor{library/turtle window-control}@anchor{44f3}
@subsubsection 창 제어


@geindex bgcolor() (turtle 모듈)
@anchor{library/turtle turtle bgcolor}@anchor{44c0}
@deffn {함수} turtle.bgcolor ()

@deffnx {함수} turtle.bgcolor (color, /)

@deffnx {함수} turtle.bgcolor (r, g, b, /)

Return or set the background color of the TurtleScreen.

네 가지 입력 형식이 허용됩니다:


@table @asis

@item @code{bgcolor()}

Return the current background color as color specification string or
as a tuple (see example).  May be used as input to another
color/pencolor/fillcolor/bgcolor call.

@item @code{bgcolor(colorstring)}

Set the background color to `colorstring', which is a Tk color
specification string, such as @code{"red"}, @code{"yellow"}, or @code{"#33cc8c"}.

@item @code{bgcolor((r, g, b))}

Set the background color to the RGB color represented by the tuple of
`r', `g', and `b'.
Each of `r', `g', and `b' must be in the range 0..colormode, where
colormode is either 1.0 or 255 (see @ref{44d2,,colormode()}).

@item @code{bgcolor(r, g, b)}

Set the background color to the RGB color represented by `r', `g', and `b'.  Each of
`r', `g', and `b' must be in the range 0..colormode.
@end table

@example
>>> screen.bgcolor("orange")
>>> screen.bgcolor()
'orange'
>>> screen.bgcolor("#800080")
>>> screen.bgcolor()
(128.0, 0.0, 128.0)
@end example
@end deffn

@geindex bgpic() (turtle 모듈)
@anchor{library/turtle turtle bgpic}@anchor{44c1}
@deffn {함수} turtle.bgpic (picname=None)

@*매개변수: 
@code{picname} – a string, name of an image file (PNG, GIF, PGM, and PPM)
or @code{"nopic"}, or @code{None}


배경 이미지를 설정하거나 현재 배경 이미지(backgroundimage)의 이름을 반환합니다. `picname'이 파일명이면, 해당 이미지를 배경으로 설정합니다. `picname'이 @code{"nopic"}이면, 배경 이미지가 있다면 삭제합니다. `picname'이 @code{None}이면, 현재 배경 이미지(backgroundimage)의 파일명을 반환합니다.

@example
>>> screen.bgpic()
'nopic'
>>> screen.bgpic("landscape.gif")
>>> screen.bgpic()
"landscape.gif"
@end example
@end deffn


@deffn {함수} turtle.clear ()

@cartouche
@quotation 참고 
이 TurtleScreen 메서드는 @code{clearscreen}이라는 이름으로만 전역 함수로 사용할 수 있습니다. 전역 함수 @code{clear}는 Turtle 메서드 @code{clear}에서 파생된 다른 것입니다.
@end quotation
@end cartouche
@end deffn

@geindex clearscreen() (turtle 모듈)
@anchor{library/turtle turtle clearscreen}@anchor{44c2}
@deffn {함수} turtle.clearscreen ()

TurtleScreen에서 모든 그림과 모든 거북이를 삭제합니다. 이제 비어있는 TurtleScreen을 초기 상태로 재설정합니다: 흰색 배경, 배경 이미지 없음, 이벤트 연결과 추적 없음.
@end deffn


@deffn {함수} turtle.reset ()

@cartouche
@quotation 참고 
이 TurtleScreen 메서드는 @code{resetscreen}이라는 이름으로만 전역 함수로 사용할 수 있습니다. 전역 함수 @code{reset}은 Turtle 메서드 @code{reset}에서 파생된 또 다른 함수입니다.
@end quotation
@end cartouche
@end deffn

@geindex resetscreen() (turtle 모듈)
@anchor{library/turtle turtle resetscreen}@anchor{44c3}
@deffn {함수} turtle.resetscreen ()

Screen의 모든 거북이를 초기 상태로 재설정합니다.
@end deffn

@geindex screensize() (turtle 모듈)
@anchor{library/turtle turtle screensize}@anchor{44c4}
@deffn {함수} turtle.screensize (canvwidth=None, canvheight=None, bg=None)

@*매개변수: 

@itemize *

@item 
@code{canvwidth} – 양의 정수, 픽셀 단위의 새 캔버스 너비

@item 
@code{canvheight} – 양의 정수, 픽셀 단위의 새 캔버스 높이

@item 
@code{bg} – 색상 문자열(colorstring)이나 색상 튜플, 새 배경색
@end itemize


인자가 제공되지 않으면, 현재  (canvaswidth, canvasheight)를 반환합니다. 그렇지 않으면 거북이가 그리는 캔버스의 크기를 조정합니다. 그리는 창을 변경하지 마십시오. 캔버스의 숨겨진 부분을 보려면, 스크롤 막대를 사용하십시오. 이 메서드를 사용하면, 이전에 캔버스 외부에 있던 그림의 부분을 볼 수 있습니다.

@example
>>> screen.screensize()
(400, 300)
>>> screen.screensize(2000,1500)
>>> screen.screensize()
(2000, 1500)
@end example

예를 들어 잘못 탈출한 거북이를 찾기 위해 ;-)
@end deffn

@geindex setworldcoordinates() (turtle 모듈)
@anchor{library/turtle turtle setworldcoordinates}@anchor{44c5}
@deffn {함수} turtle.setworldcoordinates (llx, lly, urx, ury)

@*매개변수: 

@itemize *

@item 
@code{llx} – 숫자, 캔버스의 왼쪽 아래 모서리의 x-좌표

@item 
@code{lly} – 숫자, 캔버스의 왼쪽 아래 모서리의 y-좌표

@item 
@code{urx} – 숫자, 캔버스의 오른쪽 상단 모서리의 x-좌표

@item 
@code{ury} – 숫자, 캔버스의 오른쪽 상단 모서리의 y-좌표
@end itemize


사용자 정의 좌표계를 설정하고 필요하면 “world” 모드로 전환합니다. 이것은 @code{screen.reset()}을 수행합니다. “world” 모드가 이미 활성화되었으면, 모든 그림은 새 좌표에 따라 다시 그려집니다.

`주의': 사용자 정의 좌표계에서 각도가 왜곡되어 나타날 수 있습니다.

@example
>>> screen.reset()
>>> screen.setworldcoordinates(-50,-7.5,50,7.5)
>>> for _ in range(72):
...     left(10)
...
>>> for _ in range(8):
...     left(45); fd(2)   # 정 팔각형
@end example

@c >>> screen.reset()
@c >>> for t in turtles():
@c ...      t.reset()
@end deffn

@node 애니메이션 제어,화면 이벤트 사용하기,창 제어,TurtleScreen/Screen 메서드와 해당 함수
@anchor{library/turtle animation-control}@anchor{44f4}
@subsubsection 애니메이션 제어


@geindex no_animation() (turtle 모듈)
@anchor{library/turtle turtle no_animation}@anchor{2a5}
@deffn {함수} turtle.no_animation ()

Temporarily disable turtle animation. The code written inside the
@code{no_animation} block will not be animated;
once the code block is exited, the drawing will appear.

@example
>>> with screen.no_animation():
...     for dist in range(2, 400, 2):
...         fd(dist)
...         rt(90)
@end example


Added in version 3.14.

@end deffn

@geindex delay() (turtle 모듈)
@anchor{library/turtle turtle delay}@anchor{44c6}
@deffn {함수} turtle.delay (delay=None)

@*매개변수: 
@code{delay} – 양의 정수


그리기 `지연(delay)'을 밀리초 단위로 설정하거나 반환합니다. (이는 대략 두 개의 연속 캔버스 갱신 사이의 시간 간격입니다.) 그리기 지연이 길수록, 애니메이션이 느려집니다.

선택적 인자:

@example
>>> screen.delay()
10
>>> screen.delay(5)
>>> screen.delay()
5
@end example
@end deffn

@geindex tracer() (turtle 모듈)
@anchor{library/turtle turtle tracer}@anchor{44c7}
@deffn {함수} turtle.tracer (n=None, delay=None)

@*매개변수: 

@itemize *

@item 
@code{n} – 음이 아닌 정수

@item 
@code{delay} – 음이 아닌 정수
@end itemize


거북이 애니메이션을 켜거나 끄고 그림 갱신 지연을 설정합니다. `n'이 제공되면, n 번째 정기 화면 갱신만 실제로 수행됩니다. (복잡한 그래픽의 그리기를 가속하는 데 사용할 수 있습니다.) 인자 없이 호출되면, 현재 저장된 n 값을 반환합니다. 두 번째 인자는 지연(delay) 값을 설정합니다 (@ref{44c6,,delay()}를 참조하십시오).

@example
>>> screen.tracer(8, 25)
>>> dist = 2
>>> for i in range(200):
...     fd(dist)
...     rt(90)
...     dist += 2
@end example
@end deffn

@geindex update() (turtle 모듈)
@anchor{library/turtle turtle update}@anchor{44c8}
@deffn {함수} turtle.update ()

TurtleScreen 갱신을 수행합니다. tracer가 꺼져있을 때 사용됩니다.
@end deffn

RawTurtle/Turtle 메서드 @ref{448b,,speed()}도 참조하십시오.

@node 화면 이벤트 사용하기,입력 메서드,애니메이션 제어,TurtleScreen/Screen 메서드와 해당 함수
@anchor{library/turtle using-screen-events}@anchor{44f5}
@subsubsection 화면 이벤트 사용하기


@geindex listen() (turtle 모듈)
@anchor{library/turtle turtle listen}@anchor{44c9}
@deffn {함수} turtle.listen (xdummy=None, ydummy=None)

(키 이벤트를 수집하기 위해) TurtleScreen에 포커스를 설정합니다. @ref{44c9,,listen()}을 onclick 메서드에 전달할 수 있도록 더미 인자가 제공됩니다.
@end deffn

@geindex onkey() (turtle 모듈)
@geindex onkeyrelease() (turtle 모듈)
@anchor{library/turtle turtle onkey}@anchor{44ca}
@deffn {함수} turtle.onkey (fun, key)
@anchor{library/turtle turtle onkeyrelease}@anchor{44cb}
@deffnx {함수} turtle.onkeyrelease (fun, key)

@*매개변수: 

@itemize *

@item 
@code{fun} – 인자가 없는 함수나 @code{None}

@item 
@code{key} – 문자열: 키 (예를 들어 “a”) 또는 키-기호 (예를 들어 “space”)
@end itemize


key의 키-릴리스 이벤트에 `fun'을 연결합니다. `fun'이 @code{None}이면, 이벤트 연결이 제거됩니다. 비고: 키 이벤트를 등록하려면, TurtleScreen에 포커스가 있어야 합니다. (메서드 @ref{44c9,,listen()}을 참조하십시오.)

@example
>>> def f():
...     fd(50)
...     lt(60)
...
>>> screen.onkey(f, "Up")
>>> screen.listen()
@end example
@end deffn

@geindex onkeypress() (turtle 모듈)
@anchor{library/turtle turtle onkeypress}@anchor{44cc}
@deffn {함수} turtle.onkeypress (fun, key=None)

@*매개변수: 

@itemize *

@item 
@code{fun} – 인자가 없는 함수나 @code{None}

@item 
@code{key} – 문자열: 키 (예를 들어 “a”) 또는 키-기호 (예를 들어 “space”)
@end itemize


key가 제공되면 key의 키-누르기 이벤트에 또는 key를 제공하지 않으면 임의의 키 누르기 이벤트에 `fun'을 연결합니다. 비고: 키 이벤트를 등록하려면, TurtleScreen에 포커스가 있어야 합니다. (메서드 @ref{44c9,,listen()}을 참조하십시오.)

@example
>>> def f():
...     fd(50)
...
>>> screen.onkey(f, "Up")
>>> screen.listen()
@end example
@end deffn

@geindex onclick() (turtle 모듈)
@geindex onscreenclick() (turtle 모듈)
@anchor{library/turtle turtle onclick}@anchor{44b3}
@deffn {함수} turtle.onclick (fun, btn=1, add=None)
@anchor{library/turtle turtle onscreenclick}@anchor{44cd}
@deffnx {함수} turtle.onscreenclick (fun, btn=1, add=None)

@*매개변수: 

@itemize *

@item 
@code{fun} – 캔버스에서 클릭한 점의 좌표로 호출되는 두 개의 인자가 있는 함수

@item 
@code{btn} – 마우스 버튼 수, 기본값은 1 (마우스 왼쪽 버튼)

@item 
@code{add} – @code{True} 또는 @code{False} – @code{True}이면, 새 연결이 추가되고, 그렇지 않으면 이전 연결을 대체합니다
@end itemize


이 화면의 마우스-클릭 이벤트에 `fun'을 연결합니다. `fun'이 @code{None}이면, 기존 연결이 제거됩니다.

이름이 @code{screen}인 TurtleScreen 인스턴스와 이름이 @code{turtle}인 거북이 인스턴스의 예:

@example
>>> screen.onclick(turtle.goto) # 이후 TurtleScreen을 클릭하면 거북이가 클릭한 지점으로
>>>                             # 이동합니다.
>>> screen.onclick(None)        # 이벤트 연결을 다시 제거합니다
@end example

@cartouche
@quotation 참고 
이 TurtleScreen 메서드는 @code{onscreenclick}이라는 이름으로만 전역 함수로 사용할 수 있습니다. 전역 함수 @code{onclick}은 Turtle 메서드 @code{onclick}에서 파생된 또 다른 함수입니다.
@end quotation
@end cartouche
@end deffn

@geindex ontimer() (turtle 모듈)
@anchor{library/turtle turtle ontimer}@anchor{44ce}
@deffn {함수} turtle.ontimer (fun, t=0)

@*매개변수: 

@itemize *

@item 
@code{fun} – 인자가 없는 함수

@item 
@code{t} – 숫자 >= 0
@end itemize


`t' 밀리초 후에 `fun'을 호출하는 타이머를 설치합니다.

@example
>>> running = True
>>> def f():
...     if running:
...         fd(50)
...         lt(60)
...         screen.ontimer(f, 250)
>>> f()   ### 거북이가 주위를 행진하게 만듭니다
>>> running = False
@end example
@end deffn

@geindex mainloop() (turtle 모듈)
@geindex done() (turtle 모듈)
@anchor{library/turtle turtle mainloop}@anchor{44cf}
@deffn {함수} turtle.mainloop ()
@anchor{library/turtle turtle done}@anchor{44d0}
@deffnx {함수} turtle.done ()

이벤트 루프를 시작합니다 - Tkinter의 mainloop 함수를 호출합니다. 터틀 그래픽 프로그램의 마지막 문장이어야 합니다. 터틀 그래픽을 대화식으로 사용하기 위해 -n 모드(서브 프로세스 없음)로 IDLE에서 스크립트를 실행할 때는 사용되지 `않아야' 합니다.

@example
>>> screen.mainloop()
@end example
@end deffn

@node 입력 메서드,설정과 특수 메서드,화면 이벤트 사용하기,TurtleScreen/Screen 메서드와 해당 함수
@anchor{library/turtle input-methods}@anchor{44f6}
@subsubsection 입력 메서드


@geindex textinput() (turtle 모듈)
@anchor{library/turtle turtle textinput}@anchor{1c78}
@deffn {함수} turtle.textinput (title, prompt)

@*매개변수: 

@itemize *

@item 
@code{title} – 문자열

@item 
@code{prompt} – 문자열
@end itemize


문자열 입력을 위한 대화 상자 창을 띄웁니다. 매개변수 title은 대화 상자 창의 제목이고, prompt는 주로 어떤 정보를 입력해야 하는지 설명하는 텍스트입니다. 문자열 입력을 반환합니다. 대화 상자가 취소되면, @code{None}을 반환합니다.

@example
>>> screen.textinput("NIM", "Name of first player:")
@end example
@end deffn

@geindex numinput() (turtle 모듈)
@anchor{library/turtle turtle numinput}@anchor{1c79}
@deffn {함수} turtle.numinput (title, prompt, default=None, minval=None, maxval=None)

@*매개변수: 

@itemize *

@item 
@code{title} – 문자열

@item 
@code{prompt} – 문자열

@item 
@code{default} – 숫자 (선택 사항)

@item 
@code{minval} – 숫자 (선택 사항)

@item 
@code{maxval} – 숫자 (선택 사항)
@end itemize


숫자 입력을 위한 대화 상자 창을 띄웁니다. title은 대화 창의 제목이고, prompt는 주로 어떤 숫자 정보를 입력해야 하는지 설명하는 텍스트입니다. default: 기본값, minval: 입력의 최솟값, maxval: 입력의 최댓값. 이것들이 주어지면 숫자 입력은 minval .. maxval 범위에 있어야 합니다. 그렇지 않으면, 힌트가 발행되고 수정을 위해 대화 상자가 열려 있습니다. 숫자 입력을 반환합니다. 대화 상자가 취소되면, @code{None}을 반환합니다.

@example
>>> screen.numinput("Poker", "Your stakes:", 1000, minval=10, maxval=10000)
@end example
@end deffn

@node 설정과 특수 메서드,TurtleScreen에서 상속되지 않은 Screen만의 메서드,입력 메서드,TurtleScreen/Screen 메서드와 해당 함수
@anchor{library/turtle settings-and-special-methods}@anchor{44f7}
@subsubsection 설정과 특수 메서드


@geindex mode() (turtle 모듈)
@anchor{library/turtle turtle mode}@anchor{44d1}
@deffn {함수} turtle.mode (mode=None)

@*매개변수: 
@code{mode} – 문자열 “standard”, “logo” 또는 “world” 중 하나


거북이 모드(“standard”, “logo” 또는 “world”)를 설정하고 재설정을 수행합니다. mode가 제공되지 않으면, 현재 모드가 반환됩니다.

Mode “standard” is compatible with old @code{turtle}.  Mode “logo” is
compatible with most Logo turtle graphics.  Mode “world” uses user-defined
“world coordinates”. `Attention': in this mode angles appear distorted if
@code{x/y} unit-ratio doesn’t equal 1.


@multitable {xxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxx} 
@headitem

모드

@tab

초기 거북이 방향

@tab

양의 각도

@item

“standard”

@tab

오른쪽 (동)

@tab

시계 반대 방향

@item

“logo”

@tab

위쪽 (북)

@tab

시계 방향

@end multitable


@example
>>> mode("logo")   # 거북이 방향을 북쪽으로 재설정합니다
>>> mode()
'logo'
@end example
@end deffn

@geindex colormode() (turtle 모듈)
@anchor{library/turtle turtle colormode}@anchor{44d2}
@deffn {함수} turtle.colormode (cmode=None)

@*매개변수: 
@code{cmode} – 값 1.0이나 255중 하나


색상 모드(colormode)를 반환하거나 1.0이나 255로 설정합니다. 이후 색상 트리플의 `r', `g', `b' 값은 0..*cmode* 범위에 있어야 합니다.

@example
>>> screen.colormode(1)
>>> turtle.pencolor(240, 160, 80)
Traceback (most recent call last):
     ...
TurtleGraphicsError: bad color sequence: (240, 160, 80)
>>> screen.colormode()
1.0
>>> screen.colormode(255)
>>> screen.colormode()
255
>>> turtle.pencolor(240,160,80)
@end example
@end deffn

@geindex getcanvas() (turtle 모듈)
@anchor{library/turtle turtle getcanvas}@anchor{44d3}
@deffn {함수} turtle.getcanvas ()

이 TurtleScreen의 캔버스를 반환합니다. Tkinter Canvas로 작업하는 법을 알고 있는 내부자에게 유용합니다.

@example
>>> cv = screen.getcanvas()
>>> cv
<turtle.ScrolledCanvas object ...>
@end example
@end deffn

@geindex getshapes() (turtle 모듈)
@anchor{library/turtle turtle getshapes}@anchor{44d4}
@deffn {함수} turtle.getshapes ()

현재 사용 가능한 모든 거북이 모양의 이름 리스트를 반환합니다.

@example
>>> screen.getshapes()
['arrow', 'blank', 'circle', ..., 'turtle']
@end example
@end deffn

@geindex register_shape() (turtle 모듈)
@geindex addshape() (turtle 모듈)
@anchor{library/turtle turtle register_shape}@anchor{44d5}
@deffn {함수} turtle.register_shape (name, shape=None)
@anchor{library/turtle turtle addshape}@anchor{44d6}
@deffnx {함수} turtle.addshape (name, shape=None)

There are four different ways to call this function:


@enumerate 

@item 
`name' is the name of an image file (PNG, GIF, PGM, and PPM) and `shape' is @code{None}: Install the
corresponding image shape.

@example
>>> screen.register_shape("turtle.gif")
@end example

@cartouche
@quotation 참고 
거북이를 회전할 때 이미지 모양은 회전하지 `않아서', 거북이 방향을 표시하지 않습니다!
@end quotation
@end cartouche

@item 
`name' is an arbitrary string and `shape' is the name of an image file (PNG, GIF, PGM, and PPM): Install the
corresponding image shape.

@example
>>> screen.register_shape("turtle", "turtle.gif")
@end example

@cartouche
@quotation 참고 
거북이를 회전할 때 이미지 모양은 회전하지 `않아서', 거북이 방향을 표시하지 않습니다!
@end quotation
@end cartouche

@item 
`name'은 임의의 문자열이고 `shape'은 좌표 쌍의 튜플입니다: 해당 다각형 모양을 설치합니다.

@example
>>> screen.register_shape("triangle", ((5,-3), (0,5), (-5,-3)))
@end example

@item 
`name'은 임의의 문자열이고 `shape'은 (복합) @ref{44f0,,Shape} 객체입니다: 해당 복합 모양을 설치합니다.
@end enumerate

TurtleScreen의 모양 리스트(shapelist)에 거북이 모양을 추가합니다. @code{shape(shapename)} 명령을 실행하면 이처럼 등록된 모양만 사용할 수 있습니다.


버전 3.14에서 변경: Added support for PNG, PGM, and PPM image formats.
Both a shape name and an image file name can be specified.

@end deffn

@geindex turtles() (turtle 모듈)
@anchor{library/turtle turtle turtles}@anchor{44d7}
@deffn {함수} turtle.turtles ()

화면에 있는 거북이의 리스트를 반환합니다.

@example
>>> for turtle in screen.turtles():
...     turtle.color("red")
@end example
@end deffn

@geindex window_height() (turtle 모듈)
@anchor{library/turtle turtle window_height}@anchor{44d8}
@deffn {함수} turtle.window_height ()

거북이 창의 높이를 반환합니다.

@example
>>> screen.window_height()
480
@end example
@end deffn

@geindex window_width() (turtle 모듈)
@anchor{library/turtle turtle window_width}@anchor{44d9}
@deffn {함수} turtle.window_width ()

거북이 창의 너비를 반환합니다.

@example
>>> screen.window_width()
640
@end example
@end deffn

@node TurtleScreen에서 상속되지 않은 Screen만의 메서드,,설정과 특수 메서드,TurtleScreen/Screen 메서드와 해당 함수
@anchor{library/turtle methods-specific-to-screen-not-inherited-from-turtlescreen}@anchor{44f8}@anchor{library/turtle screenspecific}@anchor{44f9}
@subsubsection TurtleScreen에서 상속되지 않은, Screen만의 메서드


@geindex bye() (turtle 모듈)
@anchor{library/turtle turtle bye}@anchor{44da}
@deffn {함수} turtle.bye ()

터틀 그래픽 창을 닫습니다.
@end deffn

@geindex exitonclick() (turtle 모듈)
@anchor{library/turtle turtle exitonclick}@anchor{44db}
@deffn {함수} turtle.exitonclick ()

@code{bye()} 메서드를 Screen에서의 마우스 클릭에 연결합니다.

구성 딕셔너리의 “using_IDLE” 값이 @code{False}(기본값)면, 에인 루프에 진입하기도 합니다. 비고: @code{-n} 스위치로 IDLE(서브 프로세스 없음)을 사용하면, 이 값은 @code{turtle.cfg}에서 @code{True}로 설정되어야 합니다. 이 경우 IDLE의 자체 메인 루프는 클라이언트 스크립트에서도 활성화됩니다.
@end deffn

@geindex save() (turtle 모듈)
@anchor{library/turtle turtle save}@anchor{1971}
@deffn {함수} turtle.save (filename, overwrite=False)

Save the current turtle drawing (and turtles) as a PostScript file.

@*매개변수: 

@itemize *

@item 
@code{filename} – the path of the saved PostScript file

@item 
@code{overwrite} – if @code{False} and there already exists a file with the given
filename, then the function will raise a
@code{FileExistsError}. If it is @code{True}, the file will be
overwritten.
@end itemize


@example
>>> screen.save("my_drawing.ps")
>>> screen.save("my_drawing.ps", overwrite=True)
@end example


Added in version 3.14.

@end deffn

@geindex setup() (turtle 모듈)
@anchor{library/turtle turtle setup}@anchor{44dc}
@deffn {함수} turtle.setup (width=_CFG['width'], height=_CFG['height'], startx=_CFG['leftright'], starty=_CFG['topbottom'])

메인 창의 크기와 위치를 설정합니다. 인자의 기본값은 구성 딕셔너리에 저장되며 @code{turtle.cfg} 파일을 통해 변경할 수 있습니다.

@*매개변수: 

@itemize *

@item 
@code{width} – 정수면 픽셀 단위의 크기, 실수면 화면의 비율; 기본값은 화면의 50%입니다

@item 
@code{height} – 정수면 픽셀 단위의 높이, 실수면 화면의 비율; 기본값은 화면의 75%입니다

@item 
@code{startx} – 양수이면 화면의 왼쪽 가장자리에서부터의 픽셀 단위의 시작 위치, 음수이면 오른쪽 가장자리에서부터, @code{None}이면 창을 가로로 가운데 정렬합니다

@item 
@code{starty} – 양수이면 화면 위쪽 가장자리에서부터의 픽셀 단위의 시작 위치, 음수이면 아래쪽 가장자리에서부터, @code{None}이면 창을 세로로 가운데 정렬합니다
@end itemize


@example
>>> screen.setup (width=200, height=200, startx=0, starty=0)
>>>              # 창을 200x200 픽셀 크기로 화면 왼쪽 상단에 설정합니다
>>> screen.setup(width=.75, height=0.5, startx=None, starty=None)
>>>              # 창을 화면 너비의 75%, 화면 높이의 50% 크기로 가운데에 설정합니다
@end example
@end deffn

@geindex title() (turtle 모듈)
@anchor{library/turtle turtle title}@anchor{44dd}
@deffn {함수} turtle.title (titlestring)

@*매개변수: 
@code{titlestring} – 터틀 그래픽 창의 제목 표시 줄에 표시되는 문자열


거북이 창의 제목을 `titlestring'으로 설정합니다.

@example
>>> screen.title("Welcome to the turtle zoo!")
@end example
@end deffn

@node 공개 클래스,Explanation<2>,TurtleScreen/Screen 메서드와 해당 함수,turtle — Turtle graphics
@anchor{library/turtle public-classes}@anchor{44fa}
@subsubsection 공개 클래스


@geindex RawTurtle (turtle 클래스)
@geindex RawPen (turtle 클래스)
@anchor{library/turtle turtle RawTurtle}@anchor{44fb}
@deffn {클래스} turtle.RawTurtle (canvas)
@anchor{library/turtle turtle RawPen}@anchor{44fc}
@deffnx {클래스} turtle.RawPen (canvas)

@*매개변수: 
@code{canvas} – @code{tkinter.Canvas}, @ref{44fd,,ScrolledCanvas}나 @ref{44ed,,TurtleScreen}


거북이를 만듭니다. 거북이는 위에서 “Turtle/RawTurtle의 메서드”라고 언급한 모든 메서드를 갖습니다.
@end deffn

@geindex Turtle (turtle 클래스)
@anchor{library/turtle turtle Turtle}@anchor{44fe}
@deffn {클래스} turtle.Turtle

RawTurtle의 서브 클래스. 인터페이스는 같지만 처음 필요할 때 자동으로 생성된 기본 @ref{4472,,Screen} 객체에 그립니다.
@end deffn

@geindex TurtleScreen (turtle 클래스)
@anchor{library/turtle turtle TurtleScreen}@anchor{44ed}
@deffn {클래스} turtle.TurtleScreen (cv)

@*매개변수: 
@code{cv} – @code{tkinter.Canvas}


위에서 설명한 @ref{44c0,,bgcolor()} 등과 같은 화면 지향 메서드를 제공합니다.
@end deffn

@geindex Screen (turtle 클래스)
@anchor{library/turtle turtle Screen}@anchor{4472}
@deffn {클래스} turtle.Screen

TurtleScreen의 서브 클래스. @ref{44f9,,4개의 메서드가 추가되었습니다}.
@end deffn

@geindex ScrolledCanvas (turtle 클래스)
@anchor{library/turtle turtle ScrolledCanvas}@anchor{44fd}
@deffn {클래스} turtle.ScrolledCanvas (master)

@*매개변수: 
@code{master} – ScrolledCanvas, 즉 스크롤 막대가 추가된 Tkinter-Canvas를 담을 어떤 Tkinter 위젯


클래스 Screen에서 사용되며, 거북 놀이터로 ScrolledCanvas를 자동으로 제공합니다.
@end deffn

@geindex Shape (turtle 클래스)
@anchor{library/turtle turtle Shape}@anchor{44f0}
@deffn {클래스} turtle.Shape (type_, data)

@*매개변수: 
@code{type_} – 문자열 “polygon”, “image”, “compound” 중 하나


모양을 모델링하는 데이터 구조. 쌍 @code{(type_, data)}는 다음 명세를 따라야 합니다:


@multitable {xxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

`type_'

@tab

`data'

@item

“polygon”

@tab

다각형 튜플, 즉 좌표 쌍의 튜플

@item

“image”

@tab

이미지 (이 형식은 내부적으로만 사용됩니다!)

@item

“compound”

@tab

@code{None} (복합 모양을 @ref{44f1,,addcomponent()} 메서드를 사용하여 구성해야 합니다)

@end multitable


@geindex addcomponent() (turtle.Shape 메서드)
@anchor{library/turtle turtle Shape addcomponent}@anchor{44f1}
@deffn {메서드} addcomponent (poly, fill, outline=None)

@*매개변수: 

@itemize *

@item 
@code{poly} – 다각형, 즉 숫자 쌍의 튜플

@item 
@code{fill} – `poly'가 채워질 색상

@item 
@code{outline} – poly 외곽선의 색상 (제공되면)
@end itemize


예:

@example
>>> poly = ((0,0),(10,-5),(0,10),(-10,-5))
>>> s = Shape("compound")
>>> s.addcomponent(poly, "red", "blue")
>>> # ... 더 많은 구성 요소를 추가한 다음 register_shape()을 사용합니다
@end example

@ref{44ef,,복합 모양}을 참조하십시오.
@end deffn
@end deffn

@geindex Vec2D (turtle 클래스)
@anchor{library/turtle turtle Vec2D}@anchor{44e0}
@deffn {클래스} turtle.Vec2D (x, y)

2차원 벡터 클래스. 터틀 그래픽을 구현하기 위한 도우미 클래스로 사용됩니다. 터틀 그래픽 프로그램에도 유용할 수 있습니다. 튜플에서 파생되기 때문에, 벡터는 튜플입니다!

다음을 제공합니다 (`a', `b'는 벡터, `k'는 번호):


@itemize *

@item 
@code{a + b} 벡터 덧셈

@item 
@code{a - b} 벡터 뺄셈

@item 
@code{a * b} 내적(inner product)

@item 
@code{k * a}와 @code{a * k} 스칼라를 사용한 곱셈

@item 
@code{abs(a)} a의 절댓값

@item 
@code{a.rotate(angle)} 회전
@end itemize
@end deffn

@node Explanation<2>,도움말과 구성,공개 클래스,turtle — Turtle graphics
@anchor{library/turtle explanation}@anchor{44ff}@anchor{library/turtle turtle-explanation}@anchor{4471}
@subsubsection Explanation


A turtle object draws on a screen object, and there a number of key classes in
the turtle object-oriented interface that can be used to create them and relate
them to each other.

A @ref{44fe,,Turtle} instance will automatically create a @ref{4472,,Screen}
instance if one is not already present.

@code{Turtle} is a subclass of @ref{44fb,,RawTurtle}, which `doesn’t' automatically
create a drawing surface - a `canvas' will need to be provided or created for
it. The `canvas' can be a @code{tkinter.Canvas}, @ref{44fd,,ScrolledCanvas}
or @ref{44ed,,TurtleScreen}.

@ref{44ed,,TurtleScreen} is the basic drawing surface for a
turtle. @ref{4472,,Screen} is a subclass of @code{TurtleScreen}, and
includes @ref{44f9,,some additional methods} for managing its
appearance (including size and title) and behaviour. @code{TurtleScreen}’s
constructor needs a @code{tkinter.Canvas} or a
@ref{44fd,,ScrolledCanvas} as an argument.

거북이 그래픽의 함수적 인터페이스는 @code{Turtle}과 @code{TurtleScreen}/@code{Screen}의 다양한 메서드를 사용합니다. 내부적으로, Screen 객체는 Screen 메서드에서 파생된 함수가 호출될 때마다 자동으로 만들어집니다. 마찬가지로, Turtle 메서드에서 파생된 함수가 호출될 때마다 Turtle 객체가 자동으로 생성됩니다.

화면에 여러 거북을 사용하려면, 객체 지향 인터페이스를 사용해야 합니다.

@node 도움말과 구성,turtledemo — Demo scripts,Explanation<2>,turtle — Turtle graphics
@anchor{library/turtle help-and-configuration}@anchor{4500}
@subsubsection 도움말과 구성


@menu
* 도움말 사용법:: 
* 독스트링을 다른 언어로 번역:: 
* Screen과 Turtle을 구성하는 방법:: 

@end menu

@node 도움말 사용법,독스트링을 다른 언어로 번역,,도움말과 구성
@anchor{library/turtle how-to-use-help}@anchor{4501}
@subsubsection 도움말 사용법


Screen과 Turtle 클래스의 공개 메서드는 독스트링을 통해 광범위하게 설명됩니다. 파이썬 도움말 기능을 통해 온라인 도움말로 사용할 수 있습니다:


@itemize -

@item 
IDLE을 사용할 때, 툴팁은 입력된 함수/메서드 호출의 서명과 독스트링의 첫 줄을 보여줍니다.

@item 
메서드나 함수에 대해 @ref{ad4,,help()}를 호출하면 독스트링을 표시합니다:

@example
>>> help(Screen.bgcolor)
Help on method bgcolor in module turtle:

bgcolor(self, *args) unbound turtle.Screen method
    Set or return backgroundcolor of the TurtleScreen.

    Arguments (if given): a color string or three numbers
    in the range 0..colormode or a 3-tuple of such numbers.


    >>> screen.bgcolor("orange")
    >>> screen.bgcolor()
    "orange"
    >>> screen.bgcolor(0.5,0,0.5)
    >>> screen.bgcolor()
    "#800080"

>>> help(Turtle.penup)
Help on method penup in module turtle:

penup(self) unbound turtle.Turtle method
    Pull the pen up -- no drawing when moving.

    Aliases: penup | pu | up

    No argument

    >>> turtle.penup()
@end example

@item 
메서드에서 파생된 함수의 독스트링은 다음과 같이 수정된 형식을 갖습니다:

@example
>>> help(bgcolor)
Help on function bgcolor in module turtle:

bgcolor(*args)
    Set or return backgroundcolor of the TurtleScreen.

    Arguments (if given): a color string or three numbers
    in the range 0..colormode or a 3-tuple of such numbers.

    Example::

      >>> bgcolor("orange")
      >>> bgcolor()
      "orange"
      >>> bgcolor(0.5,0,0.5)
      >>> bgcolor()
      "#800080"

>>> help(penup)
Help on function penup in module turtle:

penup()
    Pull the pen up -- no drawing when moving.

    Aliases: penup | pu | up

    No argument

    Example:
    >>> penup()
@end example
@end itemize

이러한 수정된 독스트링은 임포트 시점에 메서드에서 파생된 함수 정의와 함께 자동으로 만들어집니다.

@node 독스트링을 다른 언어로 번역,Screen과 Turtle을 구성하는 방법,도움말 사용법,도움말과 구성
@anchor{library/turtle translation-of-docstrings-into-different-languages}@anchor{4502}
@subsubsection 독스트링을 다른 언어로 번역


키가 메서드 이름이고 값이 Screen과 Turtle 클래스의 공개 메서드의 독스트링인 딕셔너리를 만드는 유틸리티가 있습니다.

@geindex write_docstringdict() (turtle 모듈)
@anchor{library/turtle turtle write_docstringdict}@anchor{4503}
@deffn {함수} turtle.write_docstringdict (filename='turtle_docstringdict')

@*매개변수: 
@code{filename} – 파일명으로 사용되는 문자열


주어진 파일명의 파이썬 스크립트에 독스트링-딕셔너리를 만들고 씁니다. 이 함수는 명시적으로 호출해야 합니다 (터틀 그래픽 클래스에서는 사용되지 않습니다). 독스트링 딕셔너리는 파이썬 스크립트 @code{`filename'.py}에 기록됩니다. 독스트링을 다른 언어로 번역하기 위한 템플릿으로 사용하려는 목적입니다.
@end deffn

If you (or your students) want to use @code{turtle} with online help in your
native language, you have to translate the docstrings and save the resulting
file as e.g. @code{turtle_docstringdict_german.py}.

여러분의 @code{turtle.cfg} 파일에 적절한 항목이 있으면 임포트 시점에 이 딕셔너리를 읽고 원래 영어 독스트링을 대체합니다.

이 글을 쓰는 시점에는 독일어와 이탈리아어로 된 독스트링 딕셔너리가 있습니다. (@email{glingl@@aon.at} 에 요청하십시오.)

@node Screen과 Turtle을 구성하는 방법,,독스트링을 다른 언어로 번역,도움말과 구성
@anchor{library/turtle how-to-configure-screen-and-turtles}@anchor{4504}
@subsubsection Screen과 Turtle을 구성하는 방법


내장된 기본 구성은 최상의 호환성을 유지하기 위해 기존 turtle 모듈의 외관과 동작을 모방합니다.

이 모듈의 기능을 더 잘 반영하거나 예를 들어 교실에서 사용하기 위해 필요에 더 잘 맞는 다른 구성을 사용하려면, 임포트 시점에 읽는 구성 파일 @code{turtle.cfg}를 준비하고 구성을 그 설정에 따라 수정할 수 있습니다.

내장 구성은 다음 @code{turtle.cfg}에 해당합니다:

@example
width = 0.5
height = 0.75
leftright = None
topbottom = None
canvwidth = 400
canvheight = 300
mode = standard
colormode = 1.0
delay = 10
undobuffersize = 1000
shape = classic
pencolor = black
fillcolor = black
resizemode = noresize
visible = True
language = english
exampleturtle = turtle
examplescreen = screen
title = Python Turtle Graphics
using_IDLE = False
@end example

선택된 항목에 대한 간단한 설명:


@itemize -

@item 
처음 네 줄은 @ref{44dc,,Screen.setup} 메서드의 인자에 해당합니다.

@item 
줄 5와 6은 @ref{44c4,,Screen.screensize} 메서드의 인자에 해당합니다.

@item 
`shape'은 내장 도형 중 하나일 수 있습니다, 예를 들어 arrow, turtle 등. 자세한 정보는 @code{help(shape)}을 시도해 보십시오.

@item 
아무런 채우기 색상(fill color)도 사용하지 않으려면 (즉, 거북이를 투명하게 만들려면), @code{fillcolor = ""}라고 작성해야 합니다 (그러나 비어 있지 않은 모든 문자열은 cfg 파일에서 따옴표가 없어야 합니다).

@item 
거북이의 상태를 반영하려면, @code{resizemode = auto}를 사용해야 합니다.

@item 
If you set e.g. @code{language = italian} the docstringdict
@code{turtle_docstringdict_italian.py} will be loaded at import time (if
present on the import path, e.g. in the same directory as @code{turtle}).

@item 
`exampleturtle'과 `examplescreen' 항목은 독스트링에서 등장하는 이러한 객체들의 이름을 정의합니다. 메서드 독스트링을 함수 독스트링으로 변환하면 이러한 이름이 독스트링에서 삭제됩니다.

@item 
`using_IDLE': IDLE과 그것의 @code{-n} 스위치( “서브 프로세스 없음”)를 정기적으로 사용하면 이 값을 @code{True}로 설정하십시오. 이것은 @ref{44db,,exitonclick()}이 메인 루프에 들어가지 못하게 합니다.
@end itemize

There can be a @code{turtle.cfg} file in the directory where @code{turtle} is
stored and an additional one in the current working directory.  The latter will
override the settings of the first one.

@code{Lib/turtledemo} 디렉터리는 @code{turtle.cfg} 파일을 포함합니다. 예제로 공부하고 데모를 실행할 때 그 효과를 볼 수 있습니다 (바람직하게는 데모 뷰어 내에서는 아닙니다).

@node turtledemo — Demo scripts,파이썬 2 6 이후의 변화,도움말과 구성,turtle — Turtle graphics
@anchor{library/turtle module-turtledemo}@anchor{108}@anchor{library/turtle turtledemo-demo-scripts}@anchor{4505}
@subsubsection @code{turtledemo} — Demo scripts


@geindex module; turtledemo

The @code{turtledemo} package includes a set of demo scripts.  These
scripts can be run and viewed using the supplied demo viewer as follows:

@example
python -m turtledemo
@end example

또는, 데모 스크립트를 개별적으로 실행할 수 있습니다. 예를 들면,

@example
python -m turtledemo.bytedesign
@end example

The @code{turtledemo} package directory contains:


@itemize -

@item 
스크립트의 소스 코드를 보고 동시에 실행하는 데 사용할 수 있는 데모 뷰어 @code{__main__.py}.

@item 
Multiple scripts demonstrating different features of the @code{turtle}
module.  Examples can be accessed via the Examples menu.  They can also
be run standalone.

@item 
구성 파일을 작성하고 사용하는 방법의 예인 @code{turtle.cfg} 파일.
@end itemize

데모 스크립트는 다음과 같습니다:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

이름

@tab

설명

@tab

기능

@item

@code{bytedesign}

@tab

복잡한 클래식 터틀 그래픽 패턴

@tab

@ref{44c7,,tracer()}, @ref{44c6,,delay()},
@ref{44c8,,update()}

@item

@code{chaos}

@tab

베르홀스트(Verhulst) 동역학의 그래프를 그립니다, 컴퓨터의 계산이 때때로 상식적인 기대에 반하는 결과를 생 할 수 있음을 보여줍니다

@tab

세계 좌표

@item

@code{clock}

@tab

컴퓨터의 시간을 보여주는 아날로그 시계

@tab

turtles as clock’s
hands, @ref{44ce,,ontimer()}

@item

@code{colormixer}

@tab

r, g, b 실험

@tab

@ref{44b5,,ondrag()}

@item

@code{forest}

@tab

3개의 너비 우선 나무

@tab

무작위화

@item

@code{fractalcurves}

@tab

힐버트(Hilbert)와 코흐(Koch) 곡선

@tab

재귀

@item

@code{lindenmayer}

@tab

민족 수학 (인도 콜람)

@tab

L-System

@item

@code{minimal_hanoi}

@tab

하노이의 탑

@tab

Rectangular Turtles
as Hanoi discs
(@ref{44ab,,shape()}, @ref{44ad,,shapesize()})

@item

@code{nim}

@tab

3개의 막대 더미로 컴퓨터와 고전적인 님 게임을 합니다.

@tab

님 막대로 쓰는 거북, 이벤트 구동 (마우스, 키보드)

@item

@code{paint}

@tab

극도로 단순한 그리기 프로그램

@tab

@ref{44b3,,onclick()}

@item

@code{peace}

@tab

기초

@tab

거북이: 외관과 애니메이션

@item

@code{penrose}

@tab

연과 다트가 있는 비주기적 타일링

@tab

@ref{4487,,stamp()}

@item

@code{planet_and_moon}

@tab

중력 시스템 시뮬레이션

@tab

복합 모양, @ref{44e0,,Vec2D}

@item

@code{rosette}

@tab

터틀 그래픽에 관한 위키피디아 기사의 패턴

@tab

@ref{44b9,,clone()},
@ref{448a,,undo()}

@item

@code{round_dance}

@tab

반대 방향으로 쌍으로 회전하는 춤추는 거북이

@tab

compound shapes, @ref{44b9,,clone()}
@ref{44ad,,shapesize()}, @ref{44b0,,tilt()},
@ref{44b2,,get_shapepoly()}, @ref{44c8,,update()}

@item

@code{sorting_animate}

@tab

여러 정렬 방법의 시각적 데모

@tab

간단한 정렬, 무작위화

@item

@code{tree}

@tab

(그래픽) 너비 우선 나무 (제너레이터 사용)

@tab

@ref{44b9,,clone()}

@item

@code{two_canvases}

@tab

간단한 디자인

@tab

두 캔버스의 거북이

@item

@code{yinyang}

@tab

또 하나의 기초 예제

@tab

@ref{4485,,circle()}

@end multitable


즐기세요!

@node 파이썬 2 6 이후의 변화,파이썬 3 0 이후의 변화,turtledemo — Demo scripts,turtle — Turtle graphics
@anchor{library/turtle changes-since-python-2-6}@anchor{4506}
@subsubsection 파이썬 2.6 이후의 변화



@itemize -

@item 
메서드 @ref{44c7,,Turtle.tracer}, @ref{44d9,,Turtle.window_width} 및 @ref{44d8,,Turtle.window_height}가 제거되었습니다. 이러한 이름과 기능을 가진 메서드는 이제 @ref{4472,,Screen}의 메서드로만 사용 가능합니다. 이들에서 파생된 함수는 계속 사용할 수 있습니다. (실제로 파이썬 2.6에서 이 메서드는 해당 @ref{44ed,,TurtleScreen}/@code{Screen} 메서드의 복제일 뿐입니다.)

@item 
메서드 @code{Turtle.fill()}이 제거되었습니다. @ref{446c,,begin_fill()}과 @ref{446d,,end_fill()}의 동작이 약간 변경되었습니다: 이제 모든 채우기 프로세스를 @code{end_fill()} 호출로 완료해야 합니다.

@item 
메서드 @ref{44a2,,Turtle.filling}이 추가되었습니다. 불리언 값을 반환합니다: 채우기 프로세스가 진행 중이면 @code{True}를, 그렇지 않으면 @code{False}를 반환합니다. 이 동작은 파이썬 2.6에서 인자가 없는 @code{fill()} 호출에 해당합니다.
@end itemize

@node 파이썬 3 0 이후의 변화,,파이썬 2 6 이후의 변화,turtle — Turtle graphics
@anchor{library/turtle changes-since-python-3-0}@anchor{4507}
@subsubsection 파이썬 3.0 이후의 변화



@itemize -

@item 
@ref{44fe,,Turtle} 메서드 @ref{44af,,shearfactor()}, @ref{44b1,,shapetransform()} 및 @ref{44b2,,get_shapepoly()}가 추가되었습니다. 따라서 이제 거북이 모양을 변환하기 위해 전체 범위의 일반 선형 변환을 사용할 수 있습니다. @ref{92e,,tiltangle()}의 기능이 향상되었습니다: 이제 틸트 각도를 가져오거나 설정하는 데 사용할 수 있습니다.

@item 
@ref{4472,,Screen} 메서드 @ref{44cc,,onkeypress()}는 @ref{44ca,,onkey()}의 보완으로 추가되었습니다. 후자는 키 릴리스 이벤트에 액션을 연결하므로, 이를 위한 별칭 @ref{44cb,,onkeyrelease()}도 추가되었습니다.

@item 
The method @ref{44cf,,Screen.mainloop} has been added,
so there is no longer a need to use the standalone @code{mainloop()} function
when working with @ref{4472,,Screen} and @ref{44fe,,Turtle} objects.

@item 
두 가지 입력 메서드가 추가되었습니다: @ref{1c78,,Screen.textinput}과 @ref{1c79,,Screen.numinput}. 입력 대화 상자를 띄우고 각각 문자열과 숫자를 반환합니다.
@end itemize

@c >>> for turtle in turtles():
@c ...      turtle.reset()
@c >>> turtle.penup()
@c >>> turtle.goto(-200,25)
@c >>> turtle.pendown()
@c >>> turtle.write("No one expects the Spanish Inquisition!",
@c ...      font=("Arial", 20, "normal"))
@c >>> turtle.penup()
@c >>> turtle.goto(-100,-50)
@c >>> turtle.pendown()
@c >>> turtle.write("Our two chief Turtles are...",
@c ...      font=("Arial", 16, "normal"))
@c >>> turtle.penup()
@c >>> turtle.goto(-450,-75)
@c >>> turtle.write(str(turtles()))

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c Other sections I have in mind are
@c Tkinter internals
@c Freezing Tkinter applications

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 개발 도구,디버깅과 프로파일링,Graphical user interfaces with Tk,파이썬 표준 라이브러리
@anchor{library/development doc}@anchor{4508}@anchor{library/development development}@anchor{4509}@anchor{library/development development-tools}@anchor{450a}@anchor{library/development translation-repo}@anchor{450b}
@section 개발 도구


이 장에서 설명하는 모듈은 소프트웨어를 작성하는 것을 돕습니다. 예를 들어, @ref{ba,,pydoc} 모듈은 모듈을 가져와서 모듈의 내용을 기반으로 설명서를 만듭니다. @ref{3e,,doctest} 와 @ref{10c,,unittest} 모듈에는 예상 출력이 만들어지는지 코드를 자동으로 실행하고 확인하는 단위 테스트를 작성하기 위한 프레임워크가 포함되어 있습니다.

이 장에서 설명하는 모듈 목록은 다음과 같습니다:

@menu
* typing — Support for type hints:: 
* pydoc — 설명서 생성과 온라인 도움말 시스템:: 
* 파이썬 개발 모드:: 
* doctest — 대화형 파이썬 예제 테스트:: 
* unittest — 단위 테스트 프레임워크:: 
* unittest.mock — 모의 객체 라이브러리: unittest mock — 모의 객체 라이브러리. 
* unittest.mock — 시작하기: unittest mock — 시작하기. 
* test — 파이썬 용 회귀 테스트 패키지:: 
* test.support — Utilities for the Python test suite: test support — Utilities for the Python test suite. 
* test.support.socket_helper — Utilities for socket tests: test support socket_helper — Utilities for socket tests. 
* test.support.script_helper — Utilities for the Python execution tests: test support script_helper — Utilities for the Python execution tests. 
* test.support.bytecode_helper — Support tools for testing correct bytecode generation: test support bytecode_helper — Support tools for testing correct bytecode generation. 
* test.support.threading_helper — Utilities for threading tests: test support threading_helper — Utilities for threading tests. 
* test.support.os_helper — Utilities for os tests: test support os_helper — Utilities for os tests. 
* test.support.import_helper — Utilities for import tests: test support import_helper — Utilities for import tests. 
* test.support.warnings_helper — Utilities for warnings tests: test support warnings_helper — Utilities for warnings tests. 

@end menu

@node typing — Support for type hints,pydoc — 설명서 생성과 온라인 도움말 시스템,,개발 도구
@anchor{library/typing doc}@anchor{450c}@anchor{library/typing typing-support-for-type-hints}@anchor{450d}
@subsection @code{typing} — Support for type hints


@c import typing
@c from dataclasses import dataclass
@c from typing import *

@geindex module; typing
@anchor{library/typing module-typing}@anchor{10a}

Added in version 3.5.


`소스 코드:' Lib/typing.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/typing.py}

@cartouche
@quotation 참고 
The Python runtime does not enforce function and variable type annotations.
They can be used by third party tools such as @ref{573,,type checkers},
IDEs, linters, etc.
@end quotation
@end cartouche


__________________________________________________________________


This module provides runtime support for type hints.

Consider the function below:

@example
def surface_area_of_cube(edge_length: float) -> str:
    return f"The surface area of the cube is @{6 * edge_length ** 2@}."
@end example

The function @code{surface_area_of_cube} takes an argument expected to
be an instance of @ref{196,,float}, as indicated by the @ref{23cb,,type hint}
@code{edge_length: float}. The function is expected to return an instance
of @ref{169,,str}, as indicated by the @code{-> str} hint.

While type hints can be simple classes like @ref{196,,float} or @ref{169,,str},
they can also be more complex. The @ref{10a,,typing} module provides a vocabulary of
more advanced type hints.

New features are frequently added to the @code{typing} module.
The typing_extensions@footnote{https://pypi.org/project/typing_extensions/} package
provides backports of these new features to older versions of Python.


@subsubheading 더 보기



@table @asis

@item Typing cheat sheet@footnote{https://mypy.readthedocs.io/en/stable/cheat_sheet_py3.html}

A quick overview of type hints (hosted at the mypy docs)

@item Type System Reference section of the mypy docs@footnote{https://mypy.readthedocs.io/en/stable/index.html}

The Python typing system is standardised via PEPs, so this reference
should broadly apply to most Python type checkers. (Some parts may still
be specific to mypy.)

@item Static Typing with Python@footnote{https://typing.python.org/en/latest/}

Type-checker-agnostic documentation written by the community detailing
type system features, useful typing related tools and typing best
practices.
@end table


@menu
* Specification for the Python Type System:: 
* 형 에일리어스:: 
* NewType:: 
* Annotating callable objects:: 
* 제네릭:: 
* Annotating tuples:: 
* The type of class objects:: 
* Annotating generators and coroutines:: 
* 사용자 정의 제네릭 형:: 
* Any 형:: 
* 명목적 대 구조적 서브 타이핑:: 
* 모듈 내용: 모듈 내용<6>. 
* Deprecation Timeline of Major Features:: 

@end menu

@node Specification for the Python Type System,형 에일리어스,,typing — Support for type hints
@anchor{library/typing relevant-peps}@anchor{450e}@anchor{library/typing specification-for-the-python-type-system}@anchor{450f}
@subsubsection Specification for the Python Type System


The canonical, up-to-date specification of the Python type system can be
found at Specification for the Python type system@footnote{https://typing.python.org/en/latest/spec/index.html}.

@node 형 에일리어스,NewType,Specification for the Python Type System,typing — Support for type hints
@anchor{library/typing id2}@anchor{4510}@anchor{library/typing type-aliases}@anchor{682}
@subsubsection 형 에일리어스


A type alias is defined using the @ref{66b,,type} statement, which creates
an instance of @ref{2ae,,TypeAliasType}. In this example,
@code{Vector} and @code{list[float]} will be treated equivalently by static type
checkers:

@example
type Vector = list[float]

def scale(scalar: float, vector: Vector) -> Vector:
    return [scalar * num for num in vector]

# passes type checking; a list of floats qualifies as a Vector.
new_vector = scale(2.0, [1.0, -4.2, 5.4])
@end example

형 에일리어스는 복잡한 형 서명을 단순화하는 데 유용합니다. 예를 들면:

@example
from collections.abc import Sequence

type ConnectionOptions = dict[str, str]
type Address = tuple[str, int]
type Server = tuple[Address, ConnectionOptions]

def broadcast_message(message: str, servers: Sequence[Server]) -> None:
    ...

# The static type checker will treat the previous type signature as
# being exactly equivalent to this one.
def broadcast_message(
    message: str,
    servers: Sequence[tuple[tuple[str, int], dict[str, str]]]
) -> None:
    ...
@end example

The @ref{66b,,type} statement is new in Python 3.12. For backwards
compatibility, type aliases can also be created through simple assignment:

@example
Vector = list[float]
@end example

Or marked with @ref{9cc,,TypeAlias} to make it explicit that this is a type alias,
not a normal variable assignment:

@example
from typing import TypeAlias

Vector: TypeAlias = list[float]
@end example

@node NewType,Annotating callable objects,형 에일리어스,typing — Support for type hints
@anchor{library/typing distinct}@anchor{4511}@anchor{library/typing newtype}@anchor{4512}
@subsubsection NewType


Use the @ref{ef0,,NewType} helper to create distinct types:

@example
from typing import NewType

UserId = NewType('UserId', int)
some_id = UserId(524313)
@end example

정적 형 검사기는 새 형을 원래 형의 서브 클래스인 것처럼 다룹니다. 논리 에러를 잡는 데 유용합니다:

@example
def get_user_name(user_id: UserId) -> str:
    ...

# passes type checking
user_a = get_user_name(UserId(42351))

# fails type checking; an int is not a UserId
user_b = get_user_name(-1)
@end example

@code{UserId} 형의 변수에 대해 모든 @code{int} 연산을 여전히 수행할 수 있지만, 결과는 항상 @code{int} 형이 됩니다. 이것은 @code{int}가 기대되는 모든 곳에 @code{UserId}를 전달할 수 있지만, 잘못된 방식으로 의도하지 않게 @code{UserId}를 만들지 않도록 합니다:

@example
# 'output' is of type 'int', not 'UserId'
output = UserId(23413) + UserId(54341)
@end example

Note that these checks are enforced only by the static type checker. At runtime,
the statement @code{Derived = NewType('Derived', Base)} will make @code{Derived} a
callable that immediately returns whatever parameter you pass it. That means
the expression @code{Derived(some_value)} does not create a new class or introduce
much overhead beyond that of a regular function call.

더욱 정확하게, 표현식 @code{some_value is Derived(some_value)}는 실행 시간에 항상 참입니다.

It is invalid to create a subtype of @code{Derived}:

@example
from typing import NewType

UserId = NewType('UserId', int)

# Fails at runtime and does not pass type checking
class AdminUserId(UserId): pass
@end example

However, it is possible to create a @ref{ef0,,NewType} based on a ‘derived’ @code{NewType}:

@example
from typing import NewType

UserId = NewType('UserId', int)

ProUserId = NewType('ProUserId', UserId)
@end example

그리고 @code{ProUserId}에 대한 형 검사는 예상대로 작동합니다.

자세한 내용은 
@geindex Python 향상 제안; PEP 484
PEP 484@footnote{https://peps.python.org/pep-0484/}를 참조하십시오.

@cartouche
@quotation 참고 
Recall that the use of a type alias declares two types to be `equivalent' to
one another. Doing @code{type Alias = Original} will make the static type checker
treat @code{Alias} as being `exactly equivalent' to @code{Original} in all cases.
This is useful when you want to simplify complex type signatures.

반면에, @code{NewType}은 한 형을 다른 형의 `서브 형'으로 선언합니다. @code{Derived = NewType('Derived', Original)}은 정적 형 검사기가 @code{Derived}를 @code{Original}의 `서브 클래스'로 취급하게 합니다. 이는 @code{Original} 형의 값이 @code{Derived} 형의 값이 예상되는 위치에서 사용될 수 없음을 의미합니다. 실행 시간 비용을 최소화하면서 논리 에러를 방지하려는 경우에 유용합니다.
@end quotation
@end cartouche


Added in version 3.5.2.



버전 3.10에서 변경: @code{NewType} is now a class rather than a function.  As a result, there is
some additional runtime cost when calling @code{NewType} over a regular
function.



버전 3.11에서 변경: The performance of calling @code{NewType} has been restored to its level in
Python 3.9.


@node Annotating callable objects,제네릭,NewType,typing — Support for type hints
@anchor{library/typing annotating-callable-objects}@anchor{4513}@anchor{library/typing annotating-callables}@anchor{26d5}
@subsubsection Annotating callable objects


Functions – or other @ref{2da2,,callable} objects – can be annotated using
@ref{9eb,,collections.abc.Callable} or deprecated @ref{9c8,,typing.Callable}.
@code{Callable[[int], str]} signifies a function that takes a single parameter
of type @ref{19b,,int} and returns a @ref{169,,str}.

For example:

@example
from collections.abc import Callable, Awaitable

def feeder(get_next_item: Callable[[], str]) -> None:
    ...  # Body

def async_query(on_success: Callable[[int], None],
                on_error: Callable[[int, Exception], None]) -> None:
    ...  # Body

async def on_update(value: str) -> None:
    ...  # Body

callback: Callable[[str], Awaitable[None]] = on_update
@end example

@geindex ...;ellipsis literal

The subscription syntax must always be used with exactly two values: the
argument list and the return type.  The argument list must be a list of types,
a @ref{488,,ParamSpec}, @ref{9c7,,Concatenate}, or an ellipsis (@code{...}). The return type must
be a single type.

If a literal ellipsis @code{...} is given as the argument list, it indicates that
a callable with any arbitrary parameter list would be acceptable:

@example
def concat(x: str, y: str) -> str:
    return x + y

x: Callable[..., str]
x = str     # OK
x = concat  # Also OK
@end example

@code{Callable} cannot express complex signatures such as functions that take a
variadic number of arguments, @ref{4514,,overloaded functions}, or
functions that have keyword-only parameters. However, these signatures can be
expressed by defining a @ref{569,,Protocol} class with a
@ref{779,,__call__()} method:

@example
from collections.abc import Iterable
from typing import Protocol

class Combiner(Protocol):
    def __call__(self, *vals: bytes, maxlen: int | None = None) -> list[bytes]: ...

def batch_proc(data: Iterable[bytes], cb_results: Combiner) -> bytes:
    for item in data:
        ...

def good_cb(*vals: bytes, maxlen: int | None = None) -> list[bytes]:
    ...
def bad_cb(*vals: bytes, maxitems: int | None) -> list[bytes]:
    ...

batch_proc([], good_cb)  # OK
batch_proc([], bad_cb)   # Error! Argument 2 has incompatible type because of
                         # different name and kind in the callback
@end example

Callables which take other callables as arguments may indicate that their
parameter types are dependent on each other using @ref{488,,ParamSpec}.
Additionally, if that callable adds or removes arguments from other
callables, the @ref{9c7,,Concatenate} operator may be used.  They
take the form @code{Callable[ParamSpecVariable, ReturnType]} and
@code{Callable[Concatenate[Arg1Type, Arg2Type, ..., ParamSpecVariable], ReturnType]}
respectively.


버전 3.10에서 변경: @code{Callable} now supports @ref{488,,ParamSpec} and @ref{9c7,,Concatenate}.
See 
@geindex Python 향상 제안; PEP 612
PEP 612@footnote{https://peps.python.org/pep-0612/} for more details.



@subsubheading 더 보기


The documentation for @ref{488,,ParamSpec} and @ref{9c7,,Concatenate} provides
examples of usage in @code{Callable}.


@node 제네릭,Annotating tuples,Annotating callable objects,typing — Support for type hints
@anchor{library/typing generics}@anchor{23c9}@anchor{library/typing id3}@anchor{4515}
@subsubsection 제네릭


Since type information about objects kept in containers cannot be statically
inferred in a generic way, many container classes in the standard library support
subscription to denote the expected types of container elements.

@example
from collections.abc import Mapping, Sequence

class Employee: ...

# Sequence[Employee] indicates that all elements in the sequence
# must be instances of "Employee".
# Mapping[str, str] indicates that all keys and all values in the mapping
# must be strings.
def notify_by_email(employees: Sequence[Employee],
                    overrides: Mapping[str, str]) -> None: ...
@end example

Generic functions and classes can be parameterized by using
@ref{5ac,,type parameter syntax}:

@example
from collections.abc import Sequence

def first[T](l: Sequence[T]) -> T:  # Function is generic over the TypeVar "T"
    return l[0]
@end example

Or by using the @ref{487,,TypeVar} factory directly:

@example
from collections.abc import Sequence
from typing import TypeVar

U = TypeVar('U')                  # Declare type variable "U"

def second(l: Sequence[U]) -> U:  # Function is generic over the TypeVar "U"
    return l[1]
@end example


버전 3.12에서 변경: Syntactic support for generics is new in Python 3.12.


@node Annotating tuples,The type of class objects,제네릭,typing — Support for type hints
@anchor{library/typing annotating-tuples}@anchor{26d6}@anchor{library/typing id4}@anchor{4516}
@subsubsection Annotating tuples


For most containers in Python, the typing system assumes that all elements in
the container will be of the same type. For example:

@example
from collections.abc import Mapping

# Type checker will infer that all elements in `@w{`}x`@w{`} are meant to be ints
x: list[int] = []

# Type checker error: `@w{`}list`@w{`} only accepts a single type argument:
y: list[int, str] = [1, 'foo']

# Type checker will infer that all keys in `@w{`}z`@w{`} are meant to be strings,
# and that all values in `@w{`}z`@w{`} are meant to be either strings or ints
z: Mapping[str, str | int] = @{@}
@end example

@ref{24d,,list} only accepts one type argument, so a type checker would emit an
error on the @code{y} assignment above. Similarly,
@ref{ac7,,Mapping} only accepts two type arguments: the first
indicates the type of the keys, and the second indicates the type of the
values.

Unlike most other Python containers, however, it is common in idiomatic Python
code for tuples to have elements which are not all of the same type. For this
reason, tuples are special-cased in Python’s typing system. @ref{610,,tuple}
accepts `any number' of type arguments:

@example
# OK: `@w{`}x`@w{`} is assigned to a tuple of length 1 where the sole element is an int
x: tuple[int] = (5,)

# OK: `@w{`}y`@w{`} is assigned to a tuple of length 2;
# element 1 is an int, element 2 is a str
y: tuple[int, str] = (5, "foo")

# Error: the type annotation indicates a tuple of length 1,
# but `@w{`}z`@w{`} has been assigned to a tuple of length 3
z: tuple[int] = (1, 2, 3)
@end example

@geindex ...;ellipsis literal

To denote a tuple which could be of `any' length, and in which all elements are
of the same type @code{T}, use the literal ellipsis @code{...}: @code{tuple[T, ...]}.
To denote an empty tuple, use
@code{tuple[()]}. Using plain @code{tuple} as an annotation is equivalent to using
@code{tuple[Any, ...]}:

@example
x: tuple[int, ...] = (1, 2)
# These reassignments are OK: `@w{`}tuple[int, ...]`@w{`} indicates x can be of any length
x = (1, 2, 3)
x = ()
# This reassignment is an error: all elements in `@w{`}x`@w{`} must be ints
x = ("foo", "bar")

# `@w{`}y`@w{`} can only ever be assigned to an empty tuple
y: tuple[()] = ()

z: tuple = ("foo", "bar")
# These reassignments are OK: plain `@w{`}tuple`@w{`} is equivalent to `@w{`}tuple[Any, ...]`@w{`}
z = (1, 2, 3)
z = ()
@end example

@node The type of class objects,Annotating generators and coroutines,Annotating tuples,typing — Support for type hints
@anchor{library/typing the-type-of-class-objects}@anchor{4517}@anchor{library/typing type-of-class-objects}@anchor{4518}
@subsubsection The type of class objects


A variable annotated with @code{C} may accept a value of type @code{C}. In
contrast, a variable annotated with @code{type[C]} (or deprecated
@ref{4519,,typing.Type[C]}) may accept values that are classes
themselves – specifically, it will accept the `class object' of @code{C}. For
example:

@example
a = 3         # Has type `@w{`}int`@w{`}
b = int       # Has type `@w{`}type[int]`@w{`}
c = type(a)   # Also has type `@w{`}type[int]`@w{`}
@end example

Note that @code{type[C]} is covariant:

@example
class User: ...
class ProUser(User): ...
class TeamUser(User): ...

def make_new_user(user_class: type[User]) -> User:
    # ...
    return user_class()

make_new_user(User)      # OK
make_new_user(ProUser)   # Also OK: `@w{`}type[ProUser]`@w{`} is a subtype of `@w{`}type[User]`@w{`}
make_new_user(TeamUser)  # Still fine
make_new_user(User())    # Error: expected `@w{`}type[User]`@w{`} but got `@w{`}User`@w{`}
make_new_user(int)       # Error: `@w{`}type[int]`@w{`} is not a subtype of `@w{`}type[User]`@w{`}
@end example

The only legal parameters for @ref{f43,,type} are classes, @ref{8ba,,Any},
@ref{23c9,,type variables}, and unions of any of these types.
For example:

@example
def new_non_team_user(user_class: type[BasicUser | ProUser]): ...

new_non_team_user(BasicUser)  # OK
new_non_team_user(ProUser)    # OK
new_non_team_user(TeamUser)   # Error: `@w{`}type[TeamUser]`@w{`} is not a subtype
                              # of `@w{`}type[BasicUser | ProUser]`@w{`}
new_non_team_user(User)       # Also an error
@end example

@code{type[Any]} is equivalent to @ref{f43,,type}, which is the root of Python’s
@ref{23be,,metaclass hierarchy}.

@node Annotating generators and coroutines,사용자 정의 제네릭 형,The type of class objects,typing — Support for type hints
@anchor{library/typing annotating-generators-and-coroutines}@anchor{29bf}@anchor{library/typing id5}@anchor{451a}
@subsubsection Annotating generators and coroutines


A generator can be annotated using the generic type
@ref{fda,,Generator[YieldType@comma{} SendType@comma{} ReturnType]}.
For example:

@example
def echo_round() -> Generator[int, float, str]:
    sent = yield 0
    while sent >= 0:
        sent = yield round(sent)
    return 'Done'
@end example

Note that unlike many other generic classes in the standard library,
the @code{SendType} of @ref{fda,,Generator} behaves
contravariantly, not covariantly or invariantly.

The @code{SendType} and @code{ReturnType} parameters default to @code{None}:

@example
def infinite_stream(start: int) -> Generator[int]:
    while True:
        yield start
        start += 1
@end example

It is also possible to set these types explicitly:

@example
def infinite_stream(start: int) -> Generator[int, None, None]:
    while True:
        yield start
        start += 1
@end example

Simple generators that only ever yield values can also be annotated
as having a return type of either
@ref{26b4,,Iterable[YieldType]}
or @ref{26b5,,Iterator[YieldType]}:

@example
def infinite_stream(start: int) -> Iterator[int]:
    while True:
        yield start
        start += 1
@end example

Async generators are handled in a similar fashion, but don’t
expect a @code{ReturnType} type argument
(@ref{e86,,AsyncGenerator[YieldType@comma{} SendType]}).
The @code{SendType} argument defaults to @code{None}, so the following definitions
are equivalent:

@example
async def infinite_stream(start: int) -> AsyncGenerator[int]:
    while True:
        yield start
        start = await increment(start)

async def infinite_stream(start: int) -> AsyncGenerator[int, None]:
    while True:
        yield start
        start = await increment(start)
@end example

As in the synchronous case,
@ref{fde,,AsyncIterable[YieldType]}
and @ref{fdd,,AsyncIterator[YieldType]} are
available as well:

@example
async def infinite_stream(start: int) -> AsyncIterator[int]:
    while True:
        yield start
        start = await increment(start)
@end example

Coroutines can be annotated using
@ref{fdc,,Coroutine[YieldType@comma{} SendType@comma{} ReturnType]}.
Generic arguments correspond to those of @ref{fda,,Generator},
for example:

@example
from collections.abc import Coroutine
c: Coroutine[list[str], str, int]  # Some coroutine defined elsewhere
x = c.send('hi')                   # Inferred type of 'x' is list[str]
async def bar() -> None:
    y = await c                    # Inferred type of 'y' is int
@end example

@node 사용자 정의 제네릭 형,Any 형,Annotating generators and coroutines,typing — Support for type hints
@anchor{library/typing user-defined-generic-types}@anchor{451b}@anchor{library/typing user-defined-generics}@anchor{6f5}
@subsubsection 사용자 정의 제네릭 형


사용자 정의 클래스는 제네릭 클래스로 정의 할 수 있습니다.

@example
from logging import Logger

class LoggedVar[T]:
    def __init__(self, value: T, name: str, logger: Logger) -> None:
        self.name = name
        self.logger = logger
        self.value = value

    def set(self, new: T) -> None:
        self.log('Set ' + repr(self.value))
        self.value = new

    def get(self) -> T:
        self.log('Get ' + repr(self.value))
        return self.value

    def log(self, message: str) -> None:
        self.logger.info('%s: %s', self.name, message)
@end example

This syntax indicates that the class @code{LoggedVar} is parameterised around a
single @ref{451c,,type variable} @code{T} . This also makes @code{T} valid as
a type within the class body.

Generic classes implicitly inherit from @ref{17bc,,Generic}. For compatibility
with Python 3.11 and lower, it is also possible to inherit explicitly from
@code{Generic} to indicate a generic class:

@example
from typing import TypeVar, Generic

T = TypeVar('T')

class LoggedVar(Generic[T]):
    ...
@end example

Generic classes have @ref{942,,__class_getitem__()} methods, meaning they
can be parameterised at runtime (e.g. @code{LoggedVar[int]} below):

@example
from collections.abc import Iterable

def zero_all_vars(vars: Iterable[LoggedVar[int]]) -> None:
    for var in vars:
        var.set(0)
@end example

A generic type can have any number of type variables. All varieties of
@ref{487,,TypeVar} are permissible as parameters for a generic type:

@example
from typing import TypeVar, Generic, Sequence

class WeirdTrio[T, B: Sequence[bytes], S: (int, str)]:
    ...

OldT = TypeVar('OldT', contravariant=True)
OldB = TypeVar('OldB', bound=Sequence[bytes], covariant=True)
OldS = TypeVar('OldS', int, str)

class OldWeirdTrio(Generic[OldT, OldB, OldS]):
    ...
@end example

@ref{17bc,,Generic}에 대한 각 형 변수 인자는 달라야 합니다. 그래서 이것은 잘못되었습니다:

@example
from typing import TypeVar, Generic
...

class Pair[M, M]:  # SyntaxError
    ...

T = TypeVar('T')

class Pair(Generic[T, T]):   # INVALID
    ...
@end example

Generic classes can also inherit from other classes:

@example
from collections.abc import Sized

class LinkedList[T](Sized):
    ...
@end example

When inheriting from generic classes, some type parameters could be fixed:

@example
from collections.abc import Mapping

class MyDict[T](Mapping[str, T]):
    ...
@end example

이 경우 @code{MyDict}는 단일 매개 변수 @code{T}를 갖습니다.

Using a generic class without specifying type parameters assumes
@ref{8ba,,Any} for each position. In the following example, @code{MyIterable} is
not generic but implicitly inherits from @code{Iterable[Any]}:

@example
from collections.abc import Iterable

class MyIterable(Iterable): # Same as Iterable[Any]
    ...
@end example

User-defined generic type aliases are also supported. Examples:

@example
from collections.abc import Iterable

type Response[S] = Iterable[S] | int

# Return type here is same as Iterable[str] | int
def response(query: str) -> Response[str]:
    ...

type Vec[T] = Iterable[tuple[T, T]]

def inproduct[T: (int, float, complex)](v: Vec[T]) -> T: # Same as Iterable[tuple[T, T]]
    return sum(x*y for x, y in v)
@end example

For backward compatibility, generic type aliases can also be created
through a simple assignment:

@example
from collections.abc import Iterable
from typing import TypeVar

S = TypeVar("S")
Response = Iterable[S] | int
@end example


버전 3.7에서 변경: @ref{17bc,,Generic}에는 더는 사용자 정의 메타 클래스가 없습니다.



버전 3.12에서 변경: Syntactic support for generics and type aliases is new in version 3.12.
Previously, generic classes had to explicitly inherit from @ref{17bc,,Generic}
or contain a type variable in one of their bases.


User-defined generics for parameter expressions are also supported via parameter
specification variables in the form @code{[**P]}.  The behavior is consistent
with type variables’ described above as parameter specification variables are
treated by the @code{typing} module as a specialized type variable.  The one exception
to this is that a list of types can be used to substitute a @ref{488,,ParamSpec}:

@example
>>> class Z[T, **P]: ...  # T is a TypeVar; P is a ParamSpec
...
>>> Z[int, [dict, float]]
__main__.Z[int, [dict, float]]
@end example

Classes generic over a @ref{488,,ParamSpec} can also be created using explicit
inheritance from @ref{17bc,,Generic}. In this case, @code{**} is not used:

@example
from typing import ParamSpec, Generic

P = ParamSpec('P')

class Z(Generic[P]):
    ...
@end example

Another difference between @ref{487,,TypeVar} and @ref{488,,ParamSpec} is that a
generic with only one parameter specification variable will accept
parameter lists in the forms @code{X[[Type1, Type2, ...]]} and also
@code{X[Type1, Type2, ...]} for aesthetic reasons.  Internally, the latter is converted
to the former, so the following are equivalent:

@example
>>> class X[**P]: ...
...
>>> X[int, str]
__main__.X[[int, str]]
>>> X[[int, str]]
__main__.X[[int, str]]
@end example

Note that generics with @ref{488,,ParamSpec} may not have correct
@code{__parameters__} after substitution in some cases because they
are intended primarily for static type checking.


버전 3.10에서 변경: @ref{17bc,,Generic} can now be parameterized over parameter expressions.
See @ref{488,,ParamSpec} and 
@geindex Python 향상 제안; PEP 612
PEP 612@footnote{https://peps.python.org/pep-0612/} for more details.


A user-defined generic class can have ABCs as base classes without a metaclass
conflict. Generic metaclasses are not supported. The outcome of parameterizing
generics is cached, and most types in the @code{typing} module are @ref{823,,hashable} and
comparable for equality.

@node Any 형,명목적 대 구조적 서브 타이핑,사용자 정의 제네릭 형,typing — Support for type hints
@anchor{library/typing the-any-type}@anchor{451d}
@subsubsection @code{Any} 형


특수한 종류의 형은 @ref{8ba,,Any}입니다. 정적 형 검사기는 모든 형을 @code{Any}와 호환되는 것으로, @code{Any}를 모든 형과 호환되는 것으로 취급합니다.

이것은 @ref{8ba,,Any} 형의 값에 대해 어떤 연산이나 메서드 호출을 수행하고, 그것을 임의의 변수에 대입할 수 있다는 것을 의미합니다:

@example
from typing import Any

a: Any = None
a = []          # OK
a = 2           # OK

s: str = '@w{'}
s = a           # OK

def foo(item: Any) -> int:
    # Passes type checking; 'item' could be any type,
    # and that type might have a 'bar' method
    item.bar()
    ...
@end example

Notice that no type checking is performed when assigning a value of type
@ref{8ba,,Any} to a more precise type. For example, the static type checker did
not report an error when assigning @code{a} to @code{s} even though @code{s} was
declared to be of type @ref{169,,str} and receives an @ref{19b,,int} value at
runtime!

또한, 반환형이나 매개 변수 형이 없는 모든 함수는 묵시적으로 @ref{8ba,,Any} 기본값을 사용합니다:

@example
def legacy_parser(text):
    ...
    return data

# A static type checker will treat the above
# as having the same signature as:
def legacy_parser(text: Any) -> Any:
    ...
    return data
@end example

이 동작은 여러분이 동적으로 형이 지정되는 코드와 정적으로 형이 지정되는 코드를 혼합해야 할 때 @ref{8ba,,Any}를 `탈출구'로 사용할 수 있도록 합니다.

@ref{8ba,,Any}의 동작과 @ref{c7d,,object}의 동작을 대조하십시오. @code{Any}와 유사하게, 모든 형은 @code{object}의 서브 형입니다. 그러나, @code{Any}와는 달리, 그 반대는 사실이 아닙니다: @code{object}는 다른 모든 형의 서브 형이 `아닙'니다.

이것은 값의 형이 @ref{c7d,,object}일 때, 형 검사기가 그것에 대한 거의 모든 연산을 거부하고, 그것을 더 특수한 형의 변수에 대입(또는 그것을 반환 값으로 사용)하는 것이 형 에러임을 의미합니다. 예를 들면:

@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")
@end example

값이 형 안전한 방식으로 모든 형이 될 수 있음을 표시하려면 @ref{c7d,,object}를 사용하십시오. 값이 동적으로 형이 지정됨을 표시하려면 @ref{8ba,,Any}를 사용하십시오.

@node 명목적 대 구조적 서브 타이핑,모듈 내용<6>,Any 형,typing — Support for type hints
@anchor{library/typing nominal-vs-structural-subtyping}@anchor{451e}
@subsubsection 명목적 대 구조적 서브 타이핑


Initially 
@geindex Python 향상 제안; PEP 484
PEP 484@footnote{https://peps.python.org/pep-0484/} defined the Python static type system as using
`nominal subtyping'. This means that a class @code{A} is allowed where
a class @code{B} is expected if and only if @code{A} is a subclass of @code{B}.

이 요구 사항은 이전에 @ref{26b4,,Iterable}과 같은 추상 베이스 클래스에도 적용되었습니다. 이 접근 방식의 문제점은 이것을 지원하려면 클래스를 명시적으로 표시해야만 한다는 점입니다. 이는 파이썬답지 않고 관용적인 동적으로 형이 지정된 파이썬 코드에서 일반적으로 수행하는 것과는 다릅니다. 예를 들어, 이것은 
@geindex Python 향상 제안; PEP 484
PEP 484@footnote{https://peps.python.org/pep-0484/}를 만족합니다:

@example
from collections.abc import Sized, Iterable, Iterator

class Bucket(Sized, Iterable[int]):
    ...
    def __len__(self) -> int: ...
    def __iter__(self) -> Iterator[int]: ...
@end example

@geindex Python 향상 제안; PEP 544
PEP 544@footnote{https://peps.python.org/pep-0544/} solves this problem by allowing users to write
the above code without explicit base classes in the class definition,
allowing @code{Bucket} to be implicitly considered a subtype of both @code{Sized}
and @code{Iterable[int]} by static type checkers. This is known as
`structural subtyping' (or static duck-typing):

@example
from collections.abc import Iterator, Iterable

class Bucket:  # Note: no base classes
    ...
    def __len__(self) -> int: ...
    def __iter__(self) -> Iterator[int]: ...

def collect(items: Iterable[int]) -> int: ...
result = collect(Bucket())  # Passes type check
@end example

또한, 특별한 클래스 @ref{569,,Protocol}을 서브 클래싱 함으로써, 사용자는 새로운 사용자 정의 프로토콜을 정의하여 구조적 서브 타이핑을 완전히 누릴 수 있습니다 (아래 예를 참조하십시오).

@node 모듈 내용<6>,Deprecation Timeline of Major Features,명목적 대 구조적 서브 타이핑,typing — Support for type hints
@anchor{library/typing module-contents}@anchor{451f}
@subsubsection 모듈 내용


The @code{typing} module defines the following classes, functions and decorators.

@menu
* 특수 타이핑 프리미티브:: 
* 프로토콜: 프로토콜<3>. 
* ABCs and Protocols for working with I/O:: 
* 함수와 데코레이터:: 
* 인트로스펙션 도우미:: 
* 상수: 상수<10>. 
* Deprecated aliases:: 

@end menu

@node 특수 타이핑 프리미티브,프로토콜<3>,,모듈 내용<6>
@anchor{library/typing special-typing-primitives}@anchor{4520}
@subsubsection 특수 타이핑 프리미티브


@menu
* 특수형:: 
* 특수 형태:: 
* Building generic types and type aliases:: 
* 기타 특수 지시자:: 

@end menu

@node 특수형,특수 형태,,특수 타이핑 프리미티브
@anchor{library/typing special-types}@anchor{4521}
@subsubsection 특수형


These can be used as types in annotations. They do not support subscription
using @code{[]}.

@geindex Any (typing 모듈)
@anchor{library/typing typing Any}@anchor{8ba}
@deffn {데이터} typing.Any

제한되지 않는 형을 나타내는 특수형.


@itemize *

@item 
모든 형은 @ref{8ba,,Any}와 호환됩니다.

@item 
@ref{8ba,,Any}는 모든 형과 호환됩니다.
@end itemize


버전 3.11에서 변경: @code{Any} can now be used as a base class. This can be useful for
avoiding type checker errors with classes that can duck type anywhere or
are highly dynamic.

@end deffn

@geindex AnyStr (typing 모듈)
@anchor{library/typing typing AnyStr}@anchor{5ab}
@deffn {데이터} typing.AnyStr

A @ref{4522,,constrained type variable}.

Definition:

@example
AnyStr = TypeVar('AnyStr', str, bytes)
@end example

@code{AnyStr} is meant to be used for functions that may accept @ref{169,,str} or
@ref{192,,bytes} arguments but cannot allow the two to mix.

예를 들면:

@example
def concat(a: AnyStr, b: AnyStr) -> AnyStr:
    return a + b

concat("foo", "bar")    # OK, output has type 'str'
concat(b"foo", b"bar")  # OK, output has type 'bytes'
concat("foo", b"bar")   # Error, cannot mix str and bytes
@end example

Note that, despite its name, @code{AnyStr} has nothing to do with the
@ref{8ba,,Any} type, nor does it mean “any string”. In particular, @code{AnyStr}
and @code{str | bytes} are different from each other and have different use
cases:

@example
# Invalid use of AnyStr:
# The type variable is used only once in the function signature,
# so cannot be "solved" by the type checker
def greet_bad(cond: bool) -> AnyStr:
    return "hi there!" if cond else b"greetings!"

# The better way of annotating this function:
def greet_proper(cond: bool) -> str | bytes:
    return "hi there!" if cond else b"greetings!"
@end example


Deprecated since version 3.13, will be removed in version 3.18: Deprecated in favor of the new @ref{5ac,,type parameter syntax}.
Use @code{class A[T: (str, bytes)]: ...} instead of importing @code{AnyStr}. See
@geindex Python 향상 제안; PEP 695
PEP 695@footnote{https://peps.python.org/pep-0695/} for more details.

In Python 3.16, @code{AnyStr} will be removed from @code{typing.__all__}, and
deprecation warnings will be emitted at runtime when it is accessed or
imported from @code{typing}. @code{AnyStr} will be removed from @code{typing}
in Python 3.18.

@end deffn

@geindex LiteralString (typing 모듈)
@anchor{library/typing typing LiteralString}@anchor{7e5}
@deffn {데이터} typing.LiteralString

Special type that includes only literal strings.

Any string
literal is compatible with @code{LiteralString}, as is another
@code{LiteralString}. However, an object typed as just @code{str} is not.
A string created by composing @code{LiteralString}-typed objects
is also acceptable as a @code{LiteralString}.

Example:

@example
def run_query(sql: LiteralString) -> None:
    ...

def caller(arbitrary_string: str, literal_string: LiteralString) -> None:
    run_query("SELECT * FROM students")  # OK
    run_query(literal_string)  # OK
    run_query("SELECT * FROM " + literal_string)  # OK
    run_query(arbitrary_string)  # type checker error
    run_query(  # type checker error
        f"SELECT * FROM students WHERE name = @{arbitrary_string@}"
    )
@end example

@code{LiteralString} is useful for sensitive APIs where arbitrary user-generated
strings could generate problems. For example, the two cases above
that generate type checker errors could be vulnerable to an SQL
injection attack.

See 
@geindex Python 향상 제안; PEP 675
PEP 675@footnote{https://peps.python.org/pep-0675/} for more details.


Added in version 3.11.

@end deffn

@geindex Never (typing 모듈)
@geindex NoReturn (typing 모듈)
@anchor{library/typing typing Never}@anchor{8b6}
@deffn {데이터} typing.Never
@anchor{library/typing typing NoReturn}@anchor{4523}
@deffnx {데이터} typing.NoReturn

@code{Never} and @code{NoReturn} represent the
bottom type@footnote{https://en.wikipedia.org/wiki/Bottom_type},
a type that has no members.

They can be used to indicate that a function never returns,
such as @ref{277,,sys.exit()}:

@example
from typing import Never  # or NoReturn

def stop() -> Never:
    raise RuntimeError('no way')
@end example

Or to define a function that should never be
called, as there are no valid arguments, such as
@ref{8b5,,assert_never()}:

@example
from typing import Never  # or NoReturn

def never_call_me(arg: Never) -> None:
    pass

def int_or_str(arg: int | str) -> None:
    never_call_me(arg)  # type checker error
    match arg:
        case int():
            print("It's an int")
        case str():
            print("It's a str")
        case _:
            never_call_me(arg)  # OK, arg is of type Never (or NoReturn)
@end example

@code{Never} and @code{NoReturn} have the same meaning in the type system
and static type checkers treat both equivalently.


Added in version 3.6.2: Added @code{NoReturn}.



Added in version 3.11: Added @code{Never}.

@end deffn

@geindex Self (typing 모듈)
@anchor{library/typing typing Self}@anchor{7e2}
@deffn {데이터} typing.Self

Special type to represent the current enclosed class.

예를 들면:

@example
from typing import Self, reveal_type

class Foo:
    def return_self(self) -> Self:
        ...
        return self

class SubclassOfFoo(Foo): pass

reveal_type(Foo().return_self())  # Revealed type is "Foo"
reveal_type(SubclassOfFoo().return_self())  # Revealed type is "SubclassOfFoo"
@end example

This annotation is semantically equivalent to the following,
albeit in a more succinct fashion:

@example
from typing import TypeVar

Self = TypeVar("Self", bound="Foo")

class Foo:
    def return_self(self: Self) -> Self:
        ...
        return self
@end example

In general, if something returns @code{self}, as in the above examples, you
should use @code{Self} as the return annotation. If @code{Foo.return_self} was
annotated as returning @code{"Foo"}, then the type checker would infer the
object returned from @code{SubclassOfFoo.return_self} as being of type @code{Foo}
rather than @code{SubclassOfFoo}.

Other common use cases include:


@itemize -

@item 
@ref{48f,,classmethod}s that are used as alternative constructors and return instances
of the @code{cls} parameter.

@item 
Annotating an @ref{7e3,,__enter__()} method which returns self.
@end itemize

You should not use @code{Self} as the return annotation if the method is not
guaranteed to return an instance of a subclass when the class is
subclassed:

@example
class Eggs:
    # Self would be an incorrect return annotation here,
    # as the object returned is always an instance of Eggs,
    # even in subclasses
    def returns_eggs(self) -> "Eggs":
        return Eggs()
@end example

See 
@geindex Python 향상 제안; PEP 673
PEP 673@footnote{https://peps.python.org/pep-0673/} for more details.


Added in version 3.11.

@end deffn

@geindex TypeAlias (typing 모듈)
@anchor{library/typing typing TypeAlias}@anchor{9cc}
@deffn {데이터} typing.TypeAlias

Special annotation for explicitly declaring a @ref{682,,type alias}.

예를 들면:

@example
from typing import TypeAlias

Factors: TypeAlias = list[int]
@end example

@code{TypeAlias} is particularly useful on older Python versions for annotating
aliases that make use of forward references, as it can be hard for type
checkers to distinguish these from normal variable assignments:

@example
from typing import Generic, TypeAlias, TypeVar

T = TypeVar("T")

# "Box" does not exist yet,
# so we have to use quotes for the forward reference on Python <3.12.
# Using `@w{`}TypeAlias`@w{`} tells the type checker that this is a type alias declaration,
# not a variable assignment to a string.
BoxOfStrings: TypeAlias = "Box[str]"

class Box(Generic[T]):
    @@classmethod
    def make_box_of_strings(cls) -> BoxOfStrings: ...
@end example

See 
@geindex Python 향상 제안; PEP 613
PEP 613@footnote{https://peps.python.org/pep-0613/} for more details.


Added in version 3.10.



버전 3.12부터 폐지됨: @code{TypeAlias} is deprecated in favor of the @ref{66b,,type} statement,
which creates instances of @ref{2ae,,TypeAliasType}
and which natively supports forward references.
Note that while @code{TypeAlias} and @code{TypeAliasType} serve
similar purposes and have similar names, they are distinct and the
latter is not the type of the former.
Removal of @code{TypeAlias} is not currently planned, but users
are encouraged to migrate to @code{type} statements.

@end deffn

@node 특수 형태,Building generic types and type aliases,특수형,특수 타이핑 프리미티브
@anchor{library/typing special-forms}@anchor{4524}
@subsubsection 특수 형태


These can be used as types in annotations. They all support subscription using
@code{[]}, but each has a unique syntax.

@geindex Union (typing 클래스)
@anchor{library/typing typing Union}@anchor{2a8}
@deffn {클래스} typing.Union

Union type; @code{Union[X, Y]} is equivalent to @code{X | Y} and means either X or Y.

To define a union, use e.g. @code{Union[int, str]} or the shorthand @code{int | str}. Using that shorthand is recommended. Details:


@itemize *

@item 
인자는 형이어야 하며 적어도 하나 있어야 합니다.

@item 
공용체의 공용체는 펼쳐집니다, 예를 들어:

@example
Union[Union[int, str], float] == Union[int, str, float]
@end example

However, this does not apply to unions referenced through a type
alias, to avoid forcing evaluation of the underlying @ref{2ae,,TypeAliasType}:

@example
type A = Union[int, str]
Union[A, float] != Union[int, str, float]
@end example

@item 
단일 인자의 공용체는 사라집니다. 예를 들어:

@example
Union[int] == int  # The constructor actually returns int
@end example

@item 
중복 인자는 건너뜁니다. 예를 들어:

@example
Union[int, str, int] == Union[int, str] == int | str
@end example

@item 
공용체를 비교할 때, 인자 순서가 무시됩니다, 예를 들어:

@example
Union[int, str] == Union[str, int]
@end example

@item 
You cannot subclass or instantiate a @code{Union}.

@item 
@code{Union[X][Y]}라고 쓸 수 없습니다.
@end itemize


버전 3.7에서 변경: 실행 시간에 공용체의 명시적 서브 클래스를 제거하지 않습니다.



버전 3.10에서 변경: Unions can now be written as @code{X | Y}. See
@ref{9c5,,union type expressions}.



버전 3.14에서 변경: @ref{2a7,,types.UnionType} is now an alias for @code{Union}, and both
@code{Union[int, str]} and @code{int | str} create instances of the same class.
To check whether an object is a @code{Union} at runtime, use
@code{isinstance(obj, Union)}. For compatibility with earlier versions of
Python, use
@code{get_origin(obj) is typing.Union or get_origin(obj) is types.UnionType}.

@end deffn

@geindex Optional (typing 모듈)
@anchor{library/typing typing Optional}@anchor{8c1}
@deffn {데이터} typing.Optional

@code{Optional[X]} is equivalent to @code{X | None} (or @code{Union[X, None]}).

이는 기본값을 갖는 선택적 인자와 같은 개념이 아님에 유의하십시오. 단지 선택적이기 때문에 기본값을 갖는 선택적 인자가 형 어노테이션에 @code{Optional} 한정자가 필요하지는 않습니다. 예를 들면:

@example
def foo(arg: int = 0) -> None:
    ...
@end example

한편, 명시적인 @code{None} 값이 허용되면, 인자가 선택적인지와 관계없이 @code{Optional}을 사용하는 것이 적합합니다. 예를 들면:

@example
def foo(arg: Optional[int] = None) -> None:
    ...
@end example


버전 3.10에서 변경: Optional can now be written as @code{X | None}. See
@ref{9c5,,union type expressions}.

@end deffn

@geindex Concatenate (typing 모듈)
@anchor{library/typing typing Concatenate}@anchor{9c7}
@deffn {데이터} typing.Concatenate

Special form for annotating higher-order functions.

@geindex ...;ellipsis literal

@code{Concatenate} can be used in conjunction with @ref{26d5,,Callable} and
@ref{488,,ParamSpec} to annotate a higher-order callable which adds, removes,
or transforms parameters of another
callable.  Usage is in the form
@code{Concatenate[Arg1Type, Arg2Type, ..., ParamSpecVariable]}. @code{Concatenate}
is currently only valid when used as the first argument to a @ref{26d5,,Callable}.
The last parameter to @code{Concatenate} must be a @code{ParamSpec} or
ellipsis (@code{...}).

For example, to annotate a decorator @code{with_lock} which provides a
@ref{19f4,,threading.Lock} to the decorated function,  @code{Concatenate} can be
used to indicate that @code{with_lock} expects a callable which takes in a
@code{Lock} as the first argument, and returns a callable with a different type
signature.  In this case, the @ref{488,,ParamSpec} indicates that the returned
callable’s parameter types are dependent on the parameter types of the
callable being passed in:

@example
from collections.abc import Callable
from threading import Lock
from typing import Concatenate

# Use this lock to ensure that only one thread is executing a function
# at any time.
my_lock = Lock()

def with_lock[**P, R](f: Callable[Concatenate[Lock, P], R]) -> Callable[P, R]:
    '@w{'}'A type-safe decorator which provides a lock.'@w{'}'
    def inner(*args: P.args, **kwargs: P.kwargs) -> R:
        # Provide the lock as the first argument.
        return f(my_lock, *args, **kwargs)
    return inner

@@with_lock
def sum_threadsafe(lock: Lock, numbers: list[float]) -> float:
    '@w{'}'Add a list of numbers together in a thread-safe manner.'@w{'}'
    with lock:
        return sum(numbers)

# We don't need to pass in the lock ourselves thanks to the decorator.
sum_threadsafe([1.1, 2.2, 3.3])
@end example


Added in version 3.10.



@subsubheading 더 보기



@itemize *

@item 
@geindex Python 향상 제안; PEP 612
PEP 612@footnote{https://peps.python.org/pep-0612/} – Parameter Specification Variables (the PEP which introduced
@code{ParamSpec} and @code{Concatenate})

@item 
@ref{488,,ParamSpec}

@item 
@ref{26d5,,Annotating callable objects}
@end itemize

@end deffn

@geindex Literal (typing 모듈)
@anchor{library/typing typing Literal}@anchor{a55}
@deffn {데이터} typing.Literal

Special typing form to define “literal types”.

@code{Literal} can be used to indicate to type checkers that the
annotated object has a value equivalent to one of the
provided literals.

예를 들면:

@example
def validate_simple(data: Any) -> Literal[True]:  # always returns True
    ...

type Mode = Literal['r', 'rb', 'w', 'wb']
def open_helper(file: str, mode: Mode) -> str:
    ...

open_helper('/some/path', 'r')      # Passes type check
open_helper('/other/path', 'typo')  # Error in type checker
@end example

@code{Literal[...]}은 서브 클래싱 될 수 없습니다. 실행 시간에는, 임의의 값이 @code{Literal[...]}에 대한 형 인자로 허용되지만, 형 검사기는 제한을 부과할 수 있습니다. 리터럴 형에 대한 자세한 내용은 
@geindex Python 향상 제안; PEP 586
PEP 586@footnote{https://peps.python.org/pep-0586/}을 참조하십시오.

Additional details:


@itemize *

@item 
The arguments must be literal values and there must be at least one.

@item 
Nested @code{Literal} types are flattened, e.g.:

@example
assert Literal[Literal[1, 2], 3] == Literal[1, 2, 3]
@end example

However, this does not apply to @code{Literal} types referenced through a type
alias, to avoid forcing evaluation of the underlying @ref{2ae,,TypeAliasType}:

@example
type A = Literal[1, 2]
assert Literal[A, 3] != Literal[1, 2, 3]
@end example

@item 
중복 인자는 건너뜁니다. 예를 들어:

@example
assert Literal[1, 2, 1] == Literal[1, 2]
@end example

@item 
When comparing literals, the argument order is ignored, e.g.:

@example
assert Literal[1, 2] == Literal[2, 1]
@end example

@item 
You cannot subclass or instantiate a @code{Literal}.

@item 
You cannot write @code{Literal[X][Y]}.
@end itemize


Added in version 3.8.



버전 3.9.1에서 변경: @code{Literal} now de-duplicates parameters.  Equality comparisons of
@code{Literal} objects are no longer order dependent. @code{Literal} objects
will now raise a @ref{198,,TypeError} exception during equality comparisons
if one of their parameters are not @ref{823,,hashable}.

@end deffn

@geindex ClassVar (typing 모듈)
@anchor{library/typing typing ClassVar}@anchor{56c}
@deffn {데이터} typing.ClassVar

클래스 변수를 표시하기 위한 특수 형 구조물.

@geindex Python 향상 제안; PEP 526
PEP 526@footnote{https://peps.python.org/pep-0526/}에서 소개된 것처럼, ClassVar로 감싼 변수 어노테이션은 주어진 어트리뷰트가 클래스 변수로 사용되도록 의도되었으며 해당 클래스의 인스턴스에 설정되어서는 안 됨을 나타냅니다. 용법:

@example
class Starship:
    stats: ClassVar[dict[str, int]] = @{@} # class variable
    damage: int = 10                     # instance variable
@end example

@ref{56c,,ClassVar}는 형만 받아들이며 더는 서브 스크립트 할 수 없습니다.

@ref{56c,,ClassVar}는 클래스 자체가 아니므로, @ref{2ad,,isinstance()}나 @ref{9c4,,issubclass()}와 함께 사용하면 안 됩니다. @code{ClassVar}는 파이썬 실행 시간 동작을 변경하지 않지만, 제삼자 형 검사기에서 사용할 수 있습니다. 예를 들어, 형 검사기는 다음 코드를 에러로 표시 할 수 있습니다:

@example
enterprise_d = Starship(3000)
enterprise_d.stats = @{@} # Error, setting class variable on instance
Starship.stats = @{@}     # This is OK
@end example


Added in version 3.5.3.



버전 3.13에서 변경: @code{ClassVar} can now be nested in @ref{56d,,Final} and vice versa.

@end deffn

@geindex Final (typing 모듈)
@anchor{library/typing typing Final}@anchor{56d}
@deffn {데이터} typing.Final

Special typing construct to indicate final names to type checkers.

Final names cannot be reassigned in any scope. Final names declared in class
scopes cannot be overridden in subclasses.

예를 들면:

@example
MAX_SIZE: Final = 9000
MAX_SIZE += 1  # Error reported by type checker

class Connection:
    TIMEOUT: Final[int] = 10

class FastConnector(Connection):
    TIMEOUT = 1  # Error reported by type checker
@end example

이러한 속성에 대한 실행 시간 검사는 없습니다. 자세한 내용은 
@geindex Python 향상 제안; PEP 591
PEP 591@footnote{https://peps.python.org/pep-0591/}을 참조하십시오.


Added in version 3.8.



버전 3.13에서 변경: @code{Final} can now be nested in @ref{56c,,ClassVar} and vice versa.

@end deffn

@geindex Required (typing 모듈)
@anchor{library/typing typing Required}@anchor{7df}
@deffn {데이터} typing.Required

Special typing construct to mark a @ref{332,,TypedDict} key as required.

This is mainly useful for @code{total=False} TypedDicts. See @ref{332,,TypedDict}
and 
@geindex Python 향상 제안; PEP 655
PEP 655@footnote{https://peps.python.org/pep-0655/} for more details.


Added in version 3.11.

@end deffn

@geindex NotRequired (typing 모듈)
@anchor{library/typing typing NotRequired}@anchor{7e0}
@deffn {데이터} typing.NotRequired

Special typing construct to mark a @ref{332,,TypedDict} key as potentially
missing.

See @ref{332,,TypedDict} and 
@geindex Python 향상 제안; PEP 655
PEP 655@footnote{https://peps.python.org/pep-0655/} for more details.


Added in version 3.11.

@end deffn

@geindex ReadOnly (typing 모듈)
@anchor{library/typing typing ReadOnly}@anchor{48b}
@deffn {데이터} typing.ReadOnly

A special typing construct to mark an item of a @ref{332,,TypedDict} as read-only.

예를 들면:

@example
class Movie(TypedDict):
   title: ReadOnly[str]
   year: int

def mutate_movie(m: Movie) -> None:
   m["year"] = 1999  # allowed
   m["title"] = "The Matrix"  # typechecker error
@end example

There is no runtime checking for this property.

See @ref{332,,TypedDict} and 
@geindex Python 향상 제안; PEP 705
PEP 705@footnote{https://peps.python.org/pep-0705/} for more details.


Added in version 3.13.

@end deffn

@geindex Annotated (typing 모듈)
@anchor{library/typing typing Annotated}@anchor{b37}
@deffn {데이터} typing.Annotated

Special typing form to add context-specific metadata to an annotation.

Add metadata @code{x} to a given type @code{T} by using the annotation
@code{Annotated[T, x]}. Metadata added using @code{Annotated} can be used by
static analysis tools or at runtime. At runtime, the metadata is stored
in a @code{__metadata__} attribute.

If a library or tool encounters an annotation @code{Annotated[T, x]} and has
no special logic for the metadata, it should ignore the metadata and simply
treat the annotation as @code{T}. As such, @code{Annotated} can be useful for code
that wants to use annotations for purposes outside Python’s static typing
system.

Using @code{Annotated[T, x]} as an annotation still allows for static
typechecking of @code{T}, as type checkers will simply ignore the metadata @code{x}.
In this way, @code{Annotated} differs from the
@ref{8c2,,@@no_type_check} decorator, which can also be used for
adding annotations outside the scope of the typing system, but
completely disables typechecking for a function or class.

The responsibility of how to interpret the metadata
lies with the tool or library encountering an
@code{Annotated} annotation. A tool or library encountering an @code{Annotated} type
can scan through the metadata elements to determine if they are of interest
(e.g., using @ref{2ad,,isinstance()}).


@deffn {Describe} Annotated[<type>, <metadata>]
@end deffn

Here is an example of how you might use @code{Annotated} to add metadata to
type annotations if you were doing range analysis:

@example
@@dataclass
class ValueRange:
    lo: int
    hi: int

T1 = Annotated[int, ValueRange(-10, 5)]
T2 = Annotated[T1, ValueRange(-20, 3)]
@end example

The first argument to @code{Annotated} must be a valid type. Multiple metadata
elements can be supplied as @code{Annotated} supports variadic arguments. The
order of the metadata elements is preserved and matters for equality checks:

@example
@@dataclass
class ctype:
     kind: str

a1 = Annotated[int, ValueRange(3, 10), ctype("char")]
a2 = Annotated[int, ctype("char"), ValueRange(3, 10)]

assert a1 != a2  # Order matters
@end example

It is up to the tool consuming the annotations to decide whether the
client is allowed to add multiple metadata elements to one annotation and how to
merge those annotations.

Nested @code{Annotated} types are flattened. The order of the metadata elements
starts with the innermost annotation:

@example
assert Annotated[Annotated[int, ValueRange(3, 10)], ctype("char")] == Annotated[
    int, ValueRange(3, 10), ctype("char")
]
@end example

However, this does not apply to @code{Annotated} types referenced through a type
alias, to avoid forcing evaluation of the underlying @ref{2ae,,TypeAliasType}:

@example
type From3To10[T] = Annotated[T, ValueRange(3, 10)]
assert Annotated[From3To10[int], ctype("char")] != Annotated[
   int, ValueRange(3, 10), ctype("char")
]
@end example

Duplicated metadata elements are not removed:

@example
assert Annotated[int, ValueRange(3, 10)] != Annotated[
    int, ValueRange(3, 10), ValueRange(3, 10)
]
@end example

@code{Annotated} can be used with nested and generic aliases:

@quotation

@example
@@dataclass
class MaxLen:
    value: int

type Vec[T] = Annotated[list[tuple[T, T]], MaxLen(10)]

# When used in a type annotation, a type checker will treat "V" the same as
# `@w{`}Annotated[list[tuple[int, int]], MaxLen(10)]`@w{`}:
type V = Vec[int]
@end example
@end quotation

@code{Annotated} cannot be used with an unpacked @ref{489,,TypeVarTuple}:

@example
type Variadic[*Ts] = Annotated[*Ts, Ann1] = Annotated[T1, T2, T3, ..., Ann1]  # NOT valid
@end example

where @code{T1}, @code{T2}, … are @ref{487,,TypeVars}. This is invalid as
only one type should be passed to Annotated.

By default, @ref{8bf,,get_type_hints()} strips the metadata from annotations.
Pass @code{include_extras=True} to have the metadata preserved:

@quotation

@example
>>> from typing import Annotated, get_type_hints
>>> def func(x: Annotated[int, "metadata"]) -> None: pass
...
>>> get_type_hints(func)
@{'x': <class 'int'>, 'return': <class 'NoneType'>@}
>>> get_type_hints(func, include_extras=True)
@{'x': typing.Annotated[int, 'metadata'], 'return': <class 'NoneType'>@}
@end example
@end quotation

At runtime, the metadata associated with an @code{Annotated} type can be
retrieved via the @code{__metadata__} attribute:

@quotation

@example
>>> from typing import Annotated
>>> X = Annotated[int, "very", "important", "metadata"]
>>> X
typing.Annotated[int, 'very', 'important', 'metadata']
>>> X.__metadata__
('very', 'important', 'metadata')
@end example
@end quotation

If you want to retrieve the original type wrapped by @code{Annotated}, use the
@code{__origin__} attribute:

@quotation

@example
>>> from typing import Annotated, get_origin
>>> Password = Annotated[str, "secret"]
>>> Password.__origin__
<class 'str'>
@end example
@end quotation

Note that using @ref{2ab,,get_origin()} will return @code{Annotated} itself:

@quotation

@example
>>> get_origin(Password)
typing.Annotated
@end example
@end quotation


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 593

@item PEP 593@footnote{https://peps.python.org/pep-0593/} - Flexible function and variable annotations

The PEP introducing @code{Annotated} to the standard library.
@end table



Added in version 3.9.

@end deffn

@geindex TypeIs (typing 모듈)
@anchor{library/typing typing TypeIs}@anchor{48c}
@deffn {데이터} typing.TypeIs

Special typing construct for marking user-defined type predicate functions.

@code{TypeIs} can be used to annotate the return type of a user-defined
type predicate function.  @code{TypeIs} only accepts a single type argument.
At runtime, functions marked this way should return a boolean and take at
least one positional argument.

@code{TypeIs} aims to benefit `type narrowing' – a technique used by static
type checkers to determine a more precise type of an expression within a
program’s code flow.  Usually type narrowing is done by analyzing
conditional code flow and applying the narrowing to a block of code.  The
conditional expression here is sometimes referred to as a “type predicate”:

@example
def is_str(val: str | float):
    # "isinstance" type predicate
    if isinstance(val, str):
        # Type of `@w{`}val`@w{`} is narrowed to `@w{`}str`@w{`}
        ...
    else:
        # Else, type of `@w{`}val`@w{`} is narrowed to `@w{`}float`@w{`}.
        ...
@end example

Sometimes it would be convenient to use a user-defined boolean function
as a type predicate.  Such a function should use @code{TypeIs[...]} or
@ref{48d,,TypeGuard} as its return type to alert static type checkers to
this intention.  @code{TypeIs} usually has more intuitive behavior than
@code{TypeGuard}, but it cannot be used when the input and output types
are incompatible (e.g., @code{list[object]} to @code{list[int]}) or when the
function does not return @code{True} for all instances of the narrowed type.

Using  @code{-> TypeIs[NarrowedType]} tells the static type checker that for a given
function:


@enumerate 

@item 
The return value is a boolean.

@item 
If the return value is @code{True}, the type of its argument
is the intersection of the argument’s original type and @code{NarrowedType}.

@item 
If the return value is @code{False}, the type of its argument
is narrowed to exclude @code{NarrowedType}.
@end enumerate

예를 들면:

@example
from typing import assert_type, final, TypeIs

class Parent: pass
class Child(Parent): pass
@@final
class Unrelated: pass

def is_parent(val: object) -> TypeIs[Parent]:
    return isinstance(val, Parent)

def run(arg: Child | Unrelated):
    if is_parent(arg):
        # Type of `@w{`}arg`@w{`} is narrowed to the intersection
        # of `@w{`}Parent`@w{`} and `@w{`}Child`@w{`}, which is equivalent to
        # `@w{`}Child`@w{`}.
        assert_type(arg, Child)
    else:
        # Type of `@w{`}arg`@w{`} is narrowed to exclude `@w{`}Parent`@w{`},
        # so only `@w{`}Unrelated`@w{`} is left.
        assert_type(arg, Unrelated)
@end example

The type inside @code{TypeIs} must be consistent with the type of the
function’s argument; if it is not, static type checkers will raise
an error.  An incorrectly written @code{TypeIs} function can lead to
unsound behavior in the type system; it is the user’s responsibility
to write such functions in a type-safe manner.

If a @code{TypeIs} function is a class or instance method, then the type in
@code{TypeIs} maps to the type of the second parameter (after @code{cls} or
@code{self}).

In short, the form @code{def foo(arg: TypeA) -> TypeIs[TypeB]: ...},
means that if @code{foo(arg)} returns @code{True}, then @code{arg} is an instance
of @code{TypeB}, and if it returns @code{False}, it is not an instance of @code{TypeB}.

@code{TypeIs} also works with type variables.  For more information, see
@geindex Python 향상 제안; PEP 742
PEP 742@footnote{https://peps.python.org/pep-0742/} (Narrowing types with @code{TypeIs}).


Added in version 3.13.

@end deffn

@geindex TypeGuard (typing 모듈)
@anchor{library/typing typing TypeGuard}@anchor{48d}
@deffn {데이터} typing.TypeGuard

Special typing construct for marking user-defined type predicate functions.

Type predicate functions are user-defined functions that return whether their
argument is an instance of a particular type.
@code{TypeGuard} works similarly to @ref{48c,,TypeIs}, but has subtly different
effects on type checking behavior (see below).

Using  @code{-> TypeGuard} tells the static type checker that for a given
function:


@enumerate 

@item 
The return value is a boolean.

@item 
If the return value is @code{True}, the type of its argument
is the type inside @code{TypeGuard}.
@end enumerate

@code{TypeGuard} also works with type variables.  See 
@geindex Python 향상 제안; PEP 647
PEP 647@footnote{https://peps.python.org/pep-0647/} for more details.

예를 들면:

@example
def is_str_list(val: list[object]) -> TypeGuard[list[str]]:
    '@w{'}'Determines whether all objects in the list are strings'@w{'}'
    return all(isinstance(x, str) for x in val)

def func1(val: list[object]):
    if is_str_list(val):
        # Type of `@w{`}val`@w{`} is narrowed to `@w{`}list[str]`@w{`}.
        print(" ".join(val))
    else:
        # Type of `@w{`}val`@w{`} remains as `@w{`}list[object]`@w{`}.
        print("Not a list of strings!")
@end example

@code{TypeIs} and @code{TypeGuard} differ in the following ways:


@itemize *

@item 
@code{TypeIs} requires the narrowed type to be a subtype of the input type, while
@code{TypeGuard} does not.  The main reason is to allow for things like
narrowing @code{list[object]} to @code{list[str]} even though the latter
is not a subtype of the former, since @code{list} is invariant.

@item 
When a @code{TypeGuard} function returns @code{True}, type checkers narrow the type of the
variable to exactly the @code{TypeGuard} type. When a @code{TypeIs} function returns @code{True},
type checkers can infer a more precise type combining the previously known type of the
variable with the @code{TypeIs} type. (Technically, this is known as an intersection type.)

@item 
When a @code{TypeGuard} function returns @code{False}, type checkers cannot narrow the type of
the variable at all. When a @code{TypeIs} function returns @code{False}, type checkers can narrow
the type of the variable to exclude the @code{TypeIs} type.
@end itemize


Added in version 3.10.

@end deffn

@geindex Unpack (typing 모듈)
@anchor{library/typing typing Unpack}@anchor{19a6}
@deffn {데이터} typing.Unpack

Typing operator to conceptually mark an object as having been unpacked.

For example, using the unpack operator @code{*} on a
@ref{4525,,type variable tuple} is equivalent to using @code{Unpack}
to mark the type variable tuple as having been unpacked:

@example
Ts = TypeVarTuple('Ts')
tup: tuple[*Ts]
# Effectively does:
tup: tuple[Unpack[Ts]]
@end example

In fact, @code{Unpack} can be used interchangeably with @code{*} in the context
of @ref{489,,typing.TypeVarTuple} and
@ref{610,,builtins.tuple} types. You might see @code{Unpack} being used
explicitly in older versions of Python, where @code{*} couldn’t be used in
certain places:

@example
# In older versions of Python, TypeVarTuple and Unpack
# are located in the `typing_extensions` backports package.
from typing_extensions import TypeVarTuple, Unpack

Ts = TypeVarTuple('Ts')
tup: tuple[*Ts]         # Syntax error on Python <= 3.10!
tup: tuple[Unpack[Ts]]  # Semantically equivalent, and backwards-compatible
@end example

@code{Unpack} can also be used along with @ref{332,,typing.TypedDict} for typing
@code{**kwargs} in a function signature:

@example
from typing import TypedDict, Unpack

class Movie(TypedDict):
    name: str
    year: int

# This function expects two keyword arguments - `name` of type `str`
# and `year` of type `int`.
def foo(**kwargs: Unpack[Movie]): ...
@end example

See 
@geindex Python 향상 제안; PEP 692
PEP 692@footnote{https://peps.python.org/pep-0692/} for more details on using @code{Unpack} for @code{**kwargs} typing.


Added in version 3.11.

@end deffn

@node Building generic types and type aliases,기타 특수 지시자,특수 형태,특수 타이핑 프리미티브
@anchor{library/typing building-generic-types-and-type-aliases}@anchor{4526}
@subsubsection Building generic types and type aliases


The following classes should not be used directly as annotations.
Their intended purpose is to be building blocks
for creating generic types and type aliases.

These objects can be created through special syntax
(@ref{5ac,,type parameter lists} and the @ref{66b,,type} statement).
For compatibility with Python 3.11 and earlier, they can also be created
without the dedicated syntax, as documented below.

@geindex Generic (typing 클래스)
@anchor{library/typing typing Generic}@anchor{17bc}
@deffn {클래스} typing.Generic

제네릭 형을 위한 추상 베이스 클래스.

A generic type is typically declared by adding a list of type parameters
after the class name:

@example
class Mapping[KT, VT]:
    def __getitem__(self, key: KT) -> VT:
        ...
        # Etc.
@end example

Such a class implicitly inherits from @code{Generic}.
The runtime semantics of this syntax are discussed in the
@ref{680,,Language Reference}.

이 클래스는 다음과 같이 사용할 수 있습니다:

@example
def lookup_name[X, Y](mapping: Mapping[X, Y], key: X, default: Y) -> Y:
    try:
        return mapping[key]
    except KeyError:
        return default
@end example

Here the brackets after the function name indicate a
@ref{681,,generic function}.

For backwards compatibility, generic classes can also be
declared by explicitly inheriting from
@code{Generic}. In this case, the type parameters must be declared
separately:

@example
KT = TypeVar('KT')
VT = TypeVar('VT')

class Mapping(Generic[KT, VT]):
    def __getitem__(self, key: KT) -> VT:
        ...
        # Etc.
@end example
@end deffn

@geindex TypeVar (typing 클래스)
@anchor{library/typing typevar}@anchor{451c}@anchor{library/typing typing TypeVar}@anchor{487}
@deffn {클래스} typing.TypeVar (name, *constraints, bound=None, covariant=False, contravariant=False, infer_variance=False, default=typing.NoDefault)

형 변수.

The preferred way to construct a type variable is via the dedicated syntax
for @ref{681,,generic functions},
@ref{680,,generic classes}, and
@ref{683,,generic type aliases}:

@example
class Sequence[T]:  # T is a TypeVar
    ...
@end example

This syntax can also be used to create bounded and constrained type
variables:

@example
class StrSequence[S: str]:  # S is a TypeVar with a `str` upper bound;
    ...                     # we can say that S is "bounded by `str`"


class StrOrBytesSequence[A: (str, bytes)]:  # A is a TypeVar constrained to str or bytes
    ...
@end example

However, if desired, reusable type variables can also be constructed manually, like so:

@example
T = TypeVar('T')  # Can be anything
S = TypeVar('S', bound=str)  # Can be any subtype of str
A = TypeVar('A', str, bytes)  # Must be exactly str or bytes
@end example

Type variables exist primarily for the benefit of static type
checkers.  They serve as the parameters for generic types as well
as for generic function and type alias definitions.
See @ref{17bc,,Generic} for more
information on generic types.  Generic functions work as follows:

@example
def repeat[T](x: T, n: int) -> Sequence[T]:
    """Return a list containing n references to x."""
    return [x]*n


def print_capitalized[S: str](x: S) -> S:
    """Print x capitalized, and return x."""
    print(x.capitalize())
    return x


def concatenate[A: (str, bytes)](x: A, y: A) -> A:
    """Add two strings or bytes objects together."""
    return x + y
@end example

Note that type variables can be `bounded', `constrained', or neither, but
cannot be both bounded `and' constrained.

The variance of type variables is inferred by type checkers when they are created
through the @ref{5ac,,type parameter syntax} or when
@code{infer_variance=True} is passed.
Manually created type variables may be explicitly marked covariant or contravariant by passing
@code{covariant=True} or @code{contravariant=True}.
By default, manually created type variables are invariant.
See 
@geindex Python 향상 제안; PEP 484
PEP 484@footnote{https://peps.python.org/pep-0484/} and 
@geindex Python 향상 제안; PEP 695
PEP 695@footnote{https://peps.python.org/pep-0695/} for more details.

Bounded type variables and constrained type variables have different
semantics in several important ways. Using a `bounded' type variable means
that the @code{TypeVar} will be solved using the most specific type possible:

@example
x = print_capitalized('a string')
reveal_type(x)  # revealed type is str

class StringSubclass(str):
    pass

y = print_capitalized(StringSubclass('another string'))
reveal_type(y)  # revealed type is StringSubclass

z = print_capitalized(45)  # error: int is not a subtype of str
@end example

The upper bound of a type variable can be a concrete type, abstract type
(ABC or Protocol), or even a union of types:

@example
# Can be anything with an __abs__ method
def print_abs[T: SupportsAbs](arg: T) -> None:
    print("Absolute value:", abs(arg))

U = TypeVar('U', bound=str|bytes)  # Can be any subtype of the union str|bytes
V = TypeVar('V', bound=SupportsAbs)  # Can be anything with an __abs__ method
@end example
@anchor{library/typing typing-constrained-typevar}@anchor{4522}
Using a `constrained' type variable, however, means that the @code{TypeVar}
can only ever be solved as being exactly one of the constraints given:

@example
a = concatenate('one', 'two')
reveal_type(a)  # revealed type is str

b = concatenate(StringSubclass('one'), StringSubclass('two'))
reveal_type(b)  # revealed type is str, despite StringSubclass being passed in

c = concatenate('one', b'two')  # error: type variable 'A' can be either str or bytes in a function call, but not both
@end example

At runtime, @code{isinstance(x, T)} will raise @ref{198,,TypeError}.

@geindex __name__ (typing.TypeVar의 속성)
@anchor{library/typing typing TypeVar __name__}@anchor{4527}
@deffn {속성} __name__

The name of the type variable.
@end deffn

@geindex __covariant__ (typing.TypeVar의 속성)
@anchor{library/typing typing TypeVar __covariant__}@anchor{4528}
@deffn {속성} __covariant__

Whether the type var has been explicitly marked as covariant.
@end deffn

@geindex __contravariant__ (typing.TypeVar의 속성)
@anchor{library/typing typing TypeVar __contravariant__}@anchor{4529}
@deffn {속성} __contravariant__

Whether the type var has been explicitly marked as contravariant.
@end deffn

@geindex __infer_variance__ (typing.TypeVar의 속성)
@anchor{library/typing typing TypeVar __infer_variance__}@anchor{452a}
@deffn {속성} __infer_variance__

Whether the type variable’s variance should be inferred by type checkers.


Added in version 3.12.

@end deffn

@geindex __bound__ (typing.TypeVar의 속성)
@anchor{library/typing typing TypeVar __bound__}@anchor{452b}
@deffn {속성} __bound__

The upper bound of the type variable, if any.


버전 3.12에서 변경: For type variables created through @ref{5ac,,type parameter syntax},
the bound is evaluated only when the attribute is accessed, not when
the type variable is created (see @ref{684,,Lazy evaluation}).

@end deffn

@geindex evaluate_bound() (typing.TypeVar 메서드)
@anchor{library/typing typing TypeVar evaluate_bound}@anchor{452c}
@deffn {메서드} evaluate_bound ()

An @ref{452d,,evaluate function} corresponding to the @ref{452b,,__bound__} attribute.
When called directly, this method supports only the @ref{15e,,VALUE}
format, which is equivalent to accessing the @code{__bound__} attribute directly,
but the method object can be passed to @ref{452e,,annotationlib.call_evaluate_function()}
to evaluate the value in a different format.


Added in version 3.14.

@end deffn

@geindex __constraints__ (typing.TypeVar의 속성)
@anchor{library/typing typing TypeVar __constraints__}@anchor{452f}
@deffn {속성} __constraints__

A tuple containing the constraints of the type variable, if any.


버전 3.12에서 변경: For type variables created through @ref{5ac,,type parameter syntax},
the constraints are evaluated only when the attribute is accessed, not when
the type variable is created (see @ref{684,,Lazy evaluation}).

@end deffn

@geindex evaluate_constraints() (typing.TypeVar 메서드)
@anchor{library/typing typing TypeVar evaluate_constraints}@anchor{4530}
@deffn {메서드} evaluate_constraints ()

An @ref{452d,,evaluate function} corresponding to the @ref{452f,,__constraints__} attribute.
When called directly, this method supports only the @ref{15e,,VALUE}
format, which is equivalent to accessing the @code{__constraints__} attribute directly,
but the method object can be passed to @ref{452e,,annotationlib.call_evaluate_function()}
to evaluate the value in a different format.


Added in version 3.14.

@end deffn

@geindex __default__ (typing.TypeVar의 속성)
@anchor{library/typing typing TypeVar __default__}@anchor{4531}
@deffn {속성} __default__

The default value of the type variable, or @ref{568,,typing.NoDefault} if it
has no default.


Added in version 3.13.

@end deffn

@geindex evaluate_default() (typing.TypeVar 메서드)
@anchor{library/typing typing TypeVar evaluate_default}@anchor{4532}
@deffn {메서드} evaluate_default ()

An @ref{452d,,evaluate function} corresponding to the @ref{4531,,__default__} attribute.
When called directly, this method supports only the @ref{15e,,VALUE}
format, which is equivalent to accessing the @code{__default__} attribute directly,
but the method object can be passed to @ref{452e,,annotationlib.call_evaluate_function()}
to evaluate the value in a different format.


Added in version 3.14.

@end deffn

@geindex has_default() (typing.TypeVar 메서드)
@anchor{library/typing typing TypeVar has_default}@anchor{4533}
@deffn {메서드} has_default ()

Return whether or not the type variable has a default value. This is equivalent
to checking whether @ref{4531,,__default__} is not the @ref{568,,typing.NoDefault}
singleton, except that it does not force evaluation of the
@ref{684,,lazily evaluated} default value.


Added in version 3.13.

@end deffn


버전 3.12에서 변경: Type variables can now be declared using the
@ref{5ac,,type parameter} syntax introduced by 
@geindex Python 향상 제안; PEP 695
PEP 695@footnote{https://peps.python.org/pep-0695/}.
The @code{infer_variance} parameter was added.



버전 3.13에서 변경: Support for default values was added.

@end deffn

@geindex TypeVarTuple (typing 클래스)
@anchor{library/typing typevartuple}@anchor{4525}@anchor{library/typing typing TypeVarTuple}@anchor{489}
@deffn {클래스} typing.TypeVarTuple (name, *, default=typing.NoDefault)

Type variable tuple. A specialized form of @ref{451c,,type variable}
that enables `variadic' generics.

Type variable tuples can be declared in @ref{5ac,,type parameter lists}
using a single asterisk (@code{*}) before the name:

@example
def move_first_element_to_last[T, *Ts](tup: tuple[T, *Ts]) -> tuple[*Ts, T]:
    return (*tup[1:], tup[0])
@end example

Or by explicitly invoking the @code{TypeVarTuple} constructor:

@example
T = TypeVar("T")
Ts = TypeVarTuple("Ts")

def move_first_element_to_last(tup: tuple[T, *Ts]) -> tuple[*Ts, T]:
    return (*tup[1:], tup[0])
@end example

A normal type variable enables parameterization with a single type. A type
variable tuple, in contrast, allows parameterization with an
`arbitrary' number of types by acting like an `arbitrary' number of type
variables wrapped in a tuple. For example:

@example
# T is bound to int, Ts is bound to ()
# Return value is (1,), which has type tuple[int]
move_first_element_to_last(tup=(1,))

# T is bound to int, Ts is bound to (str,)
# Return value is ('spam', 1), which has type tuple[str, int]
move_first_element_to_last(tup=(1, 'spam'))

# T is bound to int, Ts is bound to (str, float)
# Return value is ('spam', 3.0, 1), which has type tuple[str, float, int]
move_first_element_to_last(tup=(1, 'spam', 3.0))

# This fails to type check (and fails at runtime)
# because tuple[()] is not compatible with tuple[T, *Ts]
# (at least one element is required)
move_first_element_to_last(tup=())
@end example

Note the use of the unpacking operator @code{*} in @code{tuple[T, *Ts]}.
Conceptually, you can think of @code{Ts} as a tuple of type variables
@code{(T1, T2, ...)}. @code{tuple[T, *Ts]} would then become
@code{tuple[T, *(T1, T2, ...)]}, which is equivalent to
@code{tuple[T, T1, T2, ...]}. (Note that in older versions of Python, you might
see this written using @ref{19a6,,Unpack} instead, as
@code{Unpack[Ts]}.)

Type variable tuples must `always' be unpacked. This helps distinguish type
variable tuples from normal type variables:

@example
x: Ts          # Not valid
x: tuple[Ts]   # Not valid
x: tuple[*Ts]  # The correct way to do it
@end example

Type variable tuples can be used in the same contexts as normal type
variables. For example, in class definitions, arguments, and return types:

@example
class Array[*Shape]:
    def __getitem__(self, key: tuple[*Shape]) -> float: ...
    def __abs__(self) -> "Array[*Shape]": ...
    def get_shape(self) -> tuple[*Shape]: ...
@end example

Type variable tuples can be happily combined with normal type variables:

@example
class Array[DType, *Shape]:  # This is fine
    pass

class Array2[*Shape, DType]:  # This would also be fine
    pass

class Height: ...
class Width: ...

float_array_1d: Array[float, Height] = Array()     # Totally fine
int_array_2d: Array[int, Height, Width] = Array()  # Yup, fine too
@end example

However, note that at most one type variable tuple may appear in a single
list of type arguments or type parameters:

@example
x: tuple[*Ts, *Ts]            # Not valid
class Array[*Shape, *Shape]:  # Not valid
    pass
@end example

Finally, an unpacked type variable tuple can be used as the type annotation
of @code{*args}:

@example
def call_soon[*Ts](
    callback: Callable[[*Ts], None],
    *args: *Ts
) -> None:
    ...
    callback(*args)
@end example

In contrast to non-unpacked annotations of @code{*args} - e.g. @code{*args: int},
which would specify that `all' arguments are @code{int} - @code{*args: *Ts}
enables reference to the types of the `individual' arguments in @code{*args}.
Here, this allows us to ensure the types of the @code{*args} passed
to @code{call_soon} match the types of the (positional) arguments of
@code{callback}.

See 
@geindex Python 향상 제안; PEP 646
PEP 646@footnote{https://peps.python.org/pep-0646/} for more details on type variable tuples.

@geindex __name__ (typing.TypeVarTuple의 속성)
@anchor{library/typing typing TypeVarTuple __name__}@anchor{4534}
@deffn {속성} __name__

The name of the type variable tuple.
@end deffn

@geindex __default__ (typing.TypeVarTuple의 속성)
@anchor{library/typing typing TypeVarTuple __default__}@anchor{4535}
@deffn {속성} __default__

The default value of the type variable tuple, or @ref{568,,typing.NoDefault} if it
has no default.


Added in version 3.13.

@end deffn

@geindex evaluate_default() (typing.TypeVarTuple 메서드)
@anchor{library/typing typing TypeVarTuple evaluate_default}@anchor{4536}
@deffn {메서드} evaluate_default ()

An @ref{452d,,evaluate function} corresponding to the @ref{4535,,__default__} attribute.
When called directly, this method supports only the @ref{15e,,VALUE}
format, which is equivalent to accessing the @code{__default__} attribute directly,
but the method object can be passed to @ref{452e,,annotationlib.call_evaluate_function()}
to evaluate the value in a different format.


Added in version 3.14.

@end deffn

@geindex has_default() (typing.TypeVarTuple 메서드)
@anchor{library/typing typing TypeVarTuple has_default}@anchor{4537}
@deffn {메서드} has_default ()

Return whether or not the type variable tuple has a default value. This is equivalent
to checking whether @ref{4535,,__default__} is not the @ref{568,,typing.NoDefault}
singleton, except that it does not force evaluation of the
@ref{684,,lazily evaluated} default value.


Added in version 3.13.

@end deffn


Added in version 3.11.



버전 3.12에서 변경: Type variable tuples can now be declared using the
@ref{5ac,,type parameter} syntax introduced by 
@geindex Python 향상 제안; PEP 695
PEP 695@footnote{https://peps.python.org/pep-0695/}.



버전 3.13에서 변경: Support for default values was added.

@end deffn

@geindex ParamSpec (typing 클래스)
@anchor{library/typing typing ParamSpec}@anchor{488}
@deffn {클래스} typing.ParamSpec (name, *, bound=None, covariant=False, contravariant=False, default=typing.NoDefault)

Parameter specification variable.  A specialized version of
@ref{451c,,type variables}.

In @ref{5ac,,type parameter lists}, parameter specifications
can be declared with two asterisks (@code{**}):

@example
type IntFunc[**P] = Callable[P, int]
@end example

For compatibility with Python 3.11 and earlier, @code{ParamSpec} objects
can also be created as follows:

@example
P = ParamSpec('P')
@end example

Parameter specification variables exist primarily for the benefit of static
type checkers.  They are used to forward the parameter types of one
callable to another callable – a pattern commonly found in higher order
functions and decorators.  They are only valid when used in @code{Concatenate},
or as the first argument to @code{Callable}, or as parameters for user-defined
Generics.  See @ref{17bc,,Generic} for more information on generic types.

For example, to add basic logging to a function, one can create a decorator
@code{add_logging} to log function calls.  The parameter specification variable
tells the type checker that the callable passed into the decorator and the
new callable returned by it have inter-dependent type parameters:

@example
from collections.abc import Callable
import logging

def add_logging[T, **P](f: Callable[P, T]) -> Callable[P, T]:
    '@w{'}'A type-safe decorator to add logging to a function.'@w{'}'
    def inner(*args: P.args, **kwargs: P.kwargs) -> T:
        logging.info(f'@{f.__name__@} was called')
        return f(*args, **kwargs)
    return inner

@@add_logging
def add_two(x: float, y: float) -> float:
    '@w{'}'Add two numbers together.'@w{'}'
    return x + y
@end example

Without @code{ParamSpec}, the simplest way to annotate this previously was to
use a @ref{487,,TypeVar} with upper bound @code{Callable[..., Any]}.  However this
causes two problems:


@enumerate 

@item 
The type checker can’t type check the @code{inner} function because
@code{*args} and @code{**kwargs} have to be typed @ref{8ba,,Any}.

@item 
@ref{4538,,cast()} may be required in the body of the @code{add_logging}
decorator when returning the @code{inner} function, or the static type
checker must be told to ignore the @code{return inner}.
@end enumerate

@geindex args (typing.ParamSpec의 속성)
@anchor{library/typing typing ParamSpec args}@anchor{4539}
@deffn {속성} args
@end deffn

@geindex kwargs (typing.ParamSpec의 속성)
@anchor{library/typing typing ParamSpec kwargs}@anchor{453a}
@deffn {속성} kwargs

Since @code{ParamSpec} captures both positional and keyword parameters,
@code{P.args} and @code{P.kwargs} can be used to split a @code{ParamSpec} into its
components.  @code{P.args} represents the tuple of positional parameters in a
given call and should only be used to annotate @code{*args}.  @code{P.kwargs}
represents the mapping of keyword parameters to their values in a given call,
and should be only be used to annotate @code{**kwargs}.  Both
attributes require the annotated parameter to be in scope. At runtime,
@code{P.args} and @code{P.kwargs} are instances respectively of
@ref{9c9,,ParamSpecArgs} and @ref{9ca,,ParamSpecKwargs}.
@end deffn

@geindex __name__ (typing.ParamSpec의 속성)
@anchor{library/typing typing ParamSpec __name__}@anchor{453b}
@deffn {속성} __name__

The name of the parameter specification.
@end deffn

@geindex __default__ (typing.ParamSpec의 속성)
@anchor{library/typing typing ParamSpec __default__}@anchor{453c}
@deffn {속성} __default__

The default value of the parameter specification, or @ref{568,,typing.NoDefault} if it
has no default.


Added in version 3.13.

@end deffn

@geindex evaluate_default() (typing.ParamSpec 메서드)
@anchor{library/typing typing ParamSpec evaluate_default}@anchor{453d}
@deffn {메서드} evaluate_default ()

An @ref{452d,,evaluate function} corresponding to the @ref{453c,,__default__} attribute.
When called directly, this method supports only the @ref{15e,,VALUE}
format, which is equivalent to accessing the @code{__default__} attribute directly,
but the method object can be passed to @ref{452e,,annotationlib.call_evaluate_function()}
to evaluate the value in a different format.


Added in version 3.14.

@end deffn

@geindex has_default() (typing.ParamSpec 메서드)
@anchor{library/typing typing ParamSpec has_default}@anchor{453e}
@deffn {메서드} has_default ()

Return whether or not the parameter specification has a default value. This is equivalent
to checking whether @ref{453c,,__default__} is not the @ref{568,,typing.NoDefault}
singleton, except that it does not force evaluation of the
@ref{684,,lazily evaluated} default value.


Added in version 3.13.

@end deffn

Parameter specification variables created with @code{covariant=True} or
@code{contravariant=True} can be used to declare covariant or contravariant
generic types.  The @code{bound} argument is also accepted, similar to
@ref{487,,TypeVar}.  However the actual semantics of these keywords are yet to
be decided.


Added in version 3.10.



버전 3.12에서 변경: Parameter specifications can now be declared using the
@ref{5ac,,type parameter} syntax introduced by 
@geindex Python 향상 제안; PEP 695
PEP 695@footnote{https://peps.python.org/pep-0695/}.



버전 3.13에서 변경: Support for default values was added.


@cartouche
@quotation 참고 
Only parameter specification variables defined in global scope can
be pickled.
@end quotation
@end cartouche


@subsubheading 더 보기



@itemize *

@item 
@geindex Python 향상 제안; PEP 612
PEP 612@footnote{https://peps.python.org/pep-0612/} – Parameter Specification Variables (the PEP which introduced
@code{ParamSpec} and @code{Concatenate})

@item 
@ref{9c7,,Concatenate}

@item 
@ref{26d5,,Annotating callable objects}
@end itemize

@end deffn

@geindex ParamSpecArgs (typing 모듈)
@geindex ParamSpecKwargs (typing 모듈)
@anchor{library/typing typing ParamSpecArgs}@anchor{9c9}
@deffn {데이터} typing.ParamSpecArgs
@anchor{library/typing typing ParamSpecKwargs}@anchor{9ca}
@deffnx {데이터} typing.ParamSpecKwargs

Arguments and keyword arguments attributes of a @ref{488,,ParamSpec}. The
@code{P.args} attribute of a @code{ParamSpec} is an instance of @code{ParamSpecArgs},
and @code{P.kwargs} is an instance of @code{ParamSpecKwargs}. They are intended
for runtime introspection and have no special meaning to static type checkers.

Calling @ref{2ab,,get_origin()} on either of these objects will return the
original @code{ParamSpec}:

@example
>>> from typing import ParamSpec, get_origin
>>> P = ParamSpec("P")
>>> get_origin(P.args) is P
True
>>> get_origin(P.kwargs) is P
True
@end example


Added in version 3.10.

@end deffn

@geindex TypeAliasType (typing 클래스)
@anchor{library/typing typing TypeAliasType}@anchor{2ae}
@deffn {클래스} typing.TypeAliasType (name, value, *, type_params=())

The type of type aliases created through the @ref{66b,,type} statement.

Example:

@example
>>> type Alias = int
>>> type(Alias)
<class 'typing.TypeAliasType'>
@end example


Added in version 3.12.


@geindex __name__ (typing.TypeAliasType의 속성)
@anchor{library/typing typing TypeAliasType __name__}@anchor{453f}
@deffn {속성} __name__

The name of the type alias:

@example
>>> type Alias = int
>>> Alias.__name__
'Alias'
@end example
@end deffn

@geindex __module__ (typing.TypeAliasType의 속성)
@anchor{library/typing typing TypeAliasType __module__}@anchor{4540}
@deffn {속성} __module__

The name of the module in which the type alias was defined:

@example
>>> type Alias = int
>>> Alias.__module__
'__main__'
@end example
@end deffn

@geindex __type_params__ (typing.TypeAliasType의 속성)
@anchor{library/typing typing TypeAliasType __type_params__}@anchor{4541}
@deffn {속성} __type_params__

The type parameters of the type alias, or an empty tuple if the alias is
not generic:

@example
>>> type ListOrSet[T] = list[T] | set[T]
>>> ListOrSet.__type_params__
(T,)
>>> type NotGeneric = int
>>> NotGeneric.__type_params__
()
@end example
@end deffn

@geindex __value__ (typing.TypeAliasType의 속성)
@anchor{library/typing typing TypeAliasType __value__}@anchor{4542}
@deffn {속성} __value__

The type alias’s value. This is @ref{684,,lazily evaluated},
so names used in the definition of the alias are not resolved until the
@code{__value__} attribute is accessed:

@example
>>> type Mutually = Recursive
>>> type Recursive = Mutually
>>> Mutually
Mutually
>>> Recursive
Recursive
>>> Mutually.__value__
Recursive
>>> Recursive.__value__
Mutually
@end example
@end deffn

@geindex evaluate_value() (typing.TypeAliasType 메서드)
@anchor{library/typing typing TypeAliasType evaluate_value}@anchor{4543}
@deffn {메서드} evaluate_value ()

An @ref{452d,,evaluate function} corresponding to the @ref{4542,,__value__} attribute.
When called directly, this method supports only the @ref{15e,,VALUE}
format, which is equivalent to accessing the @code{__value__} attribute directly,
but the method object can be passed to @ref{452e,,annotationlib.call_evaluate_function()}
to evaluate the value in a different format:

@example
>>> type Alias = undefined
>>> Alias.__value__
Traceback (most recent call last):
...
NameError: name 'undefined' is not defined
>>> from annotationlib import Format, call_evaluate_function
>>> Alias.evaluate_value(Format.VALUE)
Traceback (most recent call last):
...
NameError: name 'undefined' is not defined
>>> call_evaluate_function(Alias.evaluate_value, Format.FORWARDREF)
ForwardRef('undefined')
@end example


Added in version 3.14.

@end deffn

@subsubheading Unpacking


Type aliases support star unpacking using the @code{*Alias} syntax.
This is equivalent to using @code{Unpack[Alias]} directly:

@example
>>> type Alias = tuple[int, str]
>>> type Unpacked = tuple[bool, *Alias]
>>> Unpacked.__value__
tuple[bool, typing.Unpack[Alias]]
@end example


Added in version 3.14.

@end deffn

@node 기타 특수 지시자,,Building generic types and type aliases,특수 타이핑 프리미티브
@anchor{library/typing other-special-directives}@anchor{4544}
@subsubsection 기타 특수 지시자


These functions and classes should not be used directly as annotations.
Their intended purpose is to be building blocks for creating and declaring
types.

@geindex NamedTuple (typing 클래스)
@anchor{library/typing typing NamedTuple}@anchor{331}
@deffn {클래스} typing.NamedTuple

형 지정된(typed) @ref{4e0,,collections.namedtuple()} 버전.

용법:

@example
class Employee(NamedTuple):
    name: str
    id: int
@end example

이것은 다음과 동등합니다:

@example
Employee = collections.namedtuple('Employee', ['name', 'id'])
@end example

필드에 기본값을 부여하려면, 클래스 바디에서 그 값을 대입할 수 있습니다:

@example
class Employee(NamedTuple):
    name: str
    id: int = 3

employee = Employee('Guido')
assert employee.id == 3
@end example

기본값이 있는 필드는 기본값이 없는 모든 필드 뒤에 와야 합니다.

The resulting class has an extra attribute @code{__annotations__} giving a
dict that maps the field names to the field types.  (The field names are in
the @code{_fields} attribute and the default values are in the
@code{_field_defaults} attribute, both of which are part of the @ref{4e0,,namedtuple()}
API.)

@code{NamedTuple} 서브 클래스는 독스트링과 메서드도 가질 수 있습니다:

@example
class Employee(NamedTuple):
    """Represents an employee."""
    name: str
    id: int = 3

    def __repr__(self) -> str:
        return f'<Employee @{self.name@}, id=@{self.id@}>'
@end example

@code{NamedTuple} subclasses can be generic:

@example
class Group[T](NamedTuple):
    key: T
    group: list[T]
@end example

이전 버전과 호환되는 사용법:

@example
# For creating a generic NamedTuple on Python 3.11
T = TypeVar("T")

class Group(NamedTuple, Generic[T]):
    key: T
    group: list[T]

# A functional syntax is also supported
Employee = NamedTuple('Employee', [('name', str), ('id', int)])
@end example


버전 3.6에서 변경: 
@geindex Python 향상 제안; PEP 526
PEP 526@footnote{https://peps.python.org/pep-0526/} 변수 어노테이션 문법 지원을 추가했습니다.



버전 3.6.1에서 변경: 기본값, 메서드 및 독스트링에 대한 지원을 추가했습니다.



버전 3.8에서 변경: @code{_field_types}와 @code{__annotations__} 어트리뷰트는 이제 @code{OrderedDict} 인스턴스가 아닌 일반 딕셔너리입니다.



버전 3.9에서 변경: @code{_field_types} 어트리뷰트를 제거하고, 같은 정보를 가지는 더 표준적인 @code{__annotations__} 어트리뷰트로 대체했습니다.



버전 3.9에서 변경: @code{NamedTuple} is now a function rather than a class.
It can still be used as a class base, as described above.



버전 3.11에서 변경: Added support for generic namedtuples.



버전 3.14에서 변경: Using @ref{1a6,,super()} (and the @code{__class__} @ref{1895,,closure variable}) in methods of @code{NamedTuple} subclasses
is unsupported and causes a @ref{198,,TypeError}.



Deprecated since version 3.13, will be removed in version 3.15: The undocumented keyword argument syntax for creating NamedTuple classes
(@code{NT = NamedTuple("NT", x=int)}) is deprecated, and will be disallowed
in 3.15. Use the class-based syntax or the functional syntax instead.



Deprecated since version 3.13, will be removed in version 3.15: When using the functional syntax to create a NamedTuple class, failing to
pass a value to the ‘fields’ parameter (@code{NT = NamedTuple("NT")}) is
deprecated. Passing @code{None} to the ‘fields’ parameter
(@code{NT = NamedTuple("NT", None)}) is also deprecated. Both will be
disallowed in Python 3.15. To create a NamedTuple class with 0 fields,
use @code{class NT(NamedTuple): pass} or @code{NT = NamedTuple("NT", [])}.

@end deffn

@geindex NewType (typing 클래스)
@anchor{library/typing typing NewType}@anchor{ef0}
@deffn {클래스} typing.NewType (name, tp)

Helper class to create low-overhead @ref{4511,,distinct types}.

A @code{NewType} is considered a distinct type by a typechecker. At runtime,
however, calling a @code{NewType} returns its argument unchanged.

용법:

@example
UserId = NewType('UserId', int)  # Declare the NewType "UserId"
first_user = UserId(1)  # "UserId" returns the argument unchanged at runtime
@end example

@geindex __module__ (typing.NewType의 속성)
@anchor{library/typing typing NewType __module__}@anchor{4545}
@deffn {속성} __module__

The name of the module in which the new type is defined.
@end deffn

@geindex __name__ (typing.NewType의 속성)
@anchor{library/typing typing NewType __name__}@anchor{4546}
@deffn {속성} __name__

The name of the new type.
@end deffn

@geindex __supertype__ (typing.NewType의 속성)
@anchor{library/typing typing NewType __supertype__}@anchor{4547}
@deffn {속성} __supertype__

The type that the new type is based on.
@end deffn


Added in version 3.5.2.



버전 3.10에서 변경: @code{NewType} is now a class rather than a function.

@end deffn

@geindex Protocol (typing 클래스)
@anchor{library/typing typing Protocol}@anchor{569}
@deffn {클래스} typing.Protocol (Generic)

Base class for protocol classes.

Protocol classes are defined like this:

@example
class Proto(Protocol):
    def meth(self) -> int:
        ...
@end example

이러한 클래스는 주로 구조적 서브 타이핑(정적 덕 타이핑)을 인식하는 정적 형 검사기와 함께 사용됩니다, 예를 들어:

@example
class C:
    def meth(self) -> int:
        return 0

def func(x: Proto) -> int:
    return x.meth()

func(C())  # Passes static type check
@end example

See 
@geindex Python 향상 제안; PEP 544
PEP 544@footnote{https://peps.python.org/pep-0544/} for more details. Protocol classes decorated with
@ref{673,,runtime_checkable()} (described later) act as simple-minded runtime
protocols that check only the presence of given attributes, ignoring their
type signatures. Protocol classes without this decorator cannot be used
as the second argument to @ref{2ad,,isinstance()} or @ref{9c4,,issubclass()}.

프로토콜 클래스는 제네릭일 수 있습니다, 예를 들어:

@example
class GenProto[T](Protocol):
    def meth(self) -> T:
        ...
@end example

In code that needs to be compatible with Python 3.11 or older, generic
Protocols can be written as follows:

@example
T = TypeVar("T")

class GenProto(Protocol[T]):
    def meth(self) -> T:
        ...
@end example


Added in version 3.8.

@end deffn

@geindex runtime_checkable() (typing 모듈)
@anchor{library/typing typing runtime_checkable}@anchor{673}
@deffn {함수} @@typing.runtime_checkable

프로토콜 클래스를 실행 시간 프로토콜로 표시합니다.

Such a protocol can be used with @ref{2ad,,isinstance()} and @ref{9c4,,issubclass()}.
This allows a simple-minded structural check, very similar to “one trick ponies”
in @ref{1f,,collections.abc} such as @ref{26b4,,Iterable}.  For example:

@example
@@runtime_checkable
class Closable(Protocol):
    def close(self): ...

assert isinstance(open('/some/file'), Closable)

@@runtime_checkable
class Named(Protocol):
    name: str

import threading
assert isinstance(threading.Thread(name='Bob'), Named)
@end example

This decorator raises @ref{198,,TypeError} when applied to a non-protocol class.

@cartouche
@quotation 참고 
@code{runtime_checkable()} will check only the presence of the required
methods or attributes, not their type signatures or types.
For example, @ref{d79,,ssl.SSLObject}
is a class, therefore it passes an @ref{9c4,,issubclass()}
check against @ref{26d5,,Callable}. However, the
@code{ssl.SSLObject.__init__} method exists only to raise a
@ref{198,,TypeError} with a more informative message, therefore making
it impossible to call (instantiate) @code{ssl.SSLObject}.
@end quotation
@end cartouche

@cartouche
@quotation 참고 
An @ref{2ad,,isinstance()} check against a runtime-checkable protocol can be
surprisingly slow compared to an @code{isinstance()} check against
a non-protocol class. Consider using alternative idioms such as
@ref{6f8,,hasattr()} calls for structural checks in performance-sensitive
code.
@end quotation
@end cartouche


Added in version 3.8.



버전 3.12에서 변경: The internal implementation of @ref{2ad,,isinstance()} checks against
runtime-checkable protocols now uses @ref{6bb,,inspect.getattr_static()}
to look up attributes (previously, @ref{6f8,,hasattr()} was used).
As a result, some objects which used to be considered instances
of a runtime-checkable protocol may no longer be considered instances
of that protocol on Python 3.12+, and vice versa.
Most users are unlikely to be affected by this change.



버전 3.12에서 변경: The members of a runtime-checkable protocol are now considered “frozen”
at runtime as soon as the class has been created. Monkey-patching
attributes onto a runtime-checkable protocol will still work, but will
have no impact on @ref{2ad,,isinstance()} checks comparing objects to the
protocol. See @ref{6f7,,What’s new in Python 3.12}
for more details.

@end deffn

@geindex TypedDict (typing 클래스)
@anchor{library/typing typing TypedDict}@anchor{332}
@deffn {클래스} typing.TypedDict (dict)

Special construct to add type hints to a dictionary.
At runtime “@code{TypedDict} instances” are simply @ref{183,,dicts}.

@code{TypedDict}는 모든 인스턴스가 각 키가 일관된 형의 값에 연관되는, 특정한 키 집합을 갖도록 기대되는 딕셔너리 형을 선언합니다. 이 기대는 실행 시간에는 검사되지 않고, 형 검사기에서만 강제됩니다. 사용법:

@example
class Point2D(TypedDict):
    x: int
    y: int
    label: str

a: Point2D = @{'x': 1, 'y': 2, 'label': 'good'@}  # OK
b: Point2D = @{'z': 3, 'label': 'bad'@}           # Fails type check

assert Point2D(x=1, y=2, label='first') == dict(x=1, y=2, label='first')
@end example

An alternative way to create a @code{TypedDict} is by using
function-call syntax. The second argument must be a literal @ref{183,,dict}:

@example
Point2D = TypedDict('Point2D', @{'x': int, 'y': int, 'label': str@})
@end example

This functional syntax allows defining keys which are not valid
@ref{229d,,identifiers}, for example because they are
keywords or contain hyphens, or when key names must not be
@ref{20a1,,mangled} like regular private names:

@example
# raises SyntaxError
class Point2D(TypedDict):
    in: int  # 'in' is a keyword
    x-y: int  # name with hyphens

class Definition(TypedDict):
    __schema: str  # mangled to `_Definition__schema`

# OK, functional syntax
Point2D = TypedDict('Point2D', @{'in': int, 'x-y': int@})
Definition = TypedDict('Definition', @{'__schema': str@})  # not mangled
@end example

By default, all keys must be present in a @code{TypedDict}. It is possible to
mark individual keys as non-required using @ref{7e0,,NotRequired}:

@example
class Point2D(TypedDict):
    x: int
    y: int
    label: NotRequired[str]

# Alternative syntax
Point2D = TypedDict('Point2D', @{'x': int, 'y': int, 'label': NotRequired[str]@})
@end example

This means that a @code{Point2D} @code{TypedDict} can have the @code{label}
key omitted.

It is also possible to mark all keys as non-required by default
by specifying a totality of @code{False}:

@example
class Point2D(TypedDict, total=False):
    x: int
    y: int

# Alternative syntax
Point2D = TypedDict('Point2D', @{'x': int, 'y': int@}, total=False)
@end example

This means that a @code{Point2D} @code{TypedDict} can have any of the keys
omitted. A type checker is only expected to support a literal @code{False} or
@code{True} as the value of the @code{total} argument. @code{True} is the default,
and makes all items defined in the class body required.

Individual keys of a @code{total=False} @code{TypedDict} can be marked as
required using @ref{7df,,Required}:

@example
class Point2D(TypedDict, total=False):
    x: Required[int]
    y: Required[int]
    label: str

# Alternative syntax
Point2D = TypedDict('Point2D', @{
    'x': Required[int],
    'y': Required[int],
    'label': str
@}, total=False)
@end example

It is possible for a @code{TypedDict} type to inherit from one or more other @code{TypedDict} types
using the class-based syntax.
Usage:

@example
class Point3D(Point2D):
    z: int
@end example

@code{Point3D} has three items: @code{x}, @code{y} and @code{z}. It is equivalent to this
definition:

@example
class Point3D(TypedDict):
    x: int
    y: int
    z: int
@end example

A @code{TypedDict} cannot inherit from a non-@code{TypedDict} class,
except for @ref{17bc,,Generic}. For example:

@example
class X(TypedDict):
    x: int

class Y(TypedDict):
    y: int

class Z(object): pass  # A non-TypedDict class

class XY(X, Y): pass  # OK

class XZ(X, Z): pass  # raises TypeError
@end example

A @code{TypedDict} can be generic:

@example
class Group[T](TypedDict):
    key: T
    group: list[T]
@end example

To create a generic @code{TypedDict} that is compatible with Python 3.11
or lower, inherit from @ref{17bc,,Generic} explicitly:

@example
T = TypeVar("T")

class Group(TypedDict, Generic[T]):
    key: T
    group: list[T]
@end example

A @code{TypedDict} can be introspected via annotations dicts
(see @ref{9d9,,Annotations Best Practices} for more information on annotations best practices),
@ref{4548,,__total__}, @ref{4549,,__required_keys__}, and @ref{454a,,__optional_keys__}.

@geindex __total__ (typing.TypedDict의 속성)
@anchor{library/typing typing TypedDict __total__}@anchor{4548}
@deffn {속성} __total__

@code{Point2D.__total__} gives the value of the @code{total} argument.
Example:

@example
>>> from typing import TypedDict
>>> class Point2D(TypedDict): pass
>>> Point2D.__total__
True
>>> class Point2D(TypedDict, total=False): pass
>>> Point2D.__total__
False
>>> class Point3D(Point2D): pass
>>> Point3D.__total__
True
@end example

This attribute reflects `only' the value of the @code{total} argument
to the current @code{TypedDict} class, not whether the class is semantically
total. For example, a @code{TypedDict} with @code{__total__} set to @code{True} may
have keys marked with @ref{7e0,,NotRequired}, or it may inherit from another
@code{TypedDict} with @code{total=False}. Therefore, it is generally better to use
@ref{4549,,__required_keys__} and @ref{454a,,__optional_keys__} for introspection.
@end deffn

@geindex __required_keys__ (typing.TypedDict의 속성)
@anchor{library/typing typing TypedDict __required_keys__}@anchor{4549}
@deffn {속성} __required_keys__


Added in version 3.9.

@end deffn

@geindex __optional_keys__ (typing.TypedDict의 속성)
@anchor{library/typing typing TypedDict __optional_keys__}@anchor{454a}
@deffn {속성} __optional_keys__

@code{Point2D.__required_keys__} and @code{Point2D.__optional_keys__} return
@ref{7f1,,frozenset} objects containing required and non-required keys, respectively.

Keys marked with @ref{7df,,Required} will always appear in @code{__required_keys__}
and keys marked with @ref{7e0,,NotRequired} will always appear in @code{__optional_keys__}.

For backwards compatibility with Python 3.10 and below,
it is also possible to use inheritance to declare both required and
non-required keys in the same @code{TypedDict} . This is done by declaring a
@code{TypedDict} with one value for the @code{total} argument and then
inheriting from it in another @code{TypedDict} with a different value for
@code{total}:

@example
>>> class Point2D(TypedDict, total=False):
...     x: int
...     y: int
...
>>> class Point3D(Point2D):
...     z: int
...
>>> Point3D.__required_keys__ == frozenset(@{'z'@})
True
>>> Point3D.__optional_keys__ == frozenset(@{'x', 'y'@})
True
@end example


Added in version 3.9.


@cartouche
@quotation 참고 
If @code{from __future__ import annotations} is used or if annotations
are given as strings, annotations are not evaluated when the
@code{TypedDict} is defined. Therefore, the runtime introspection that
@code{__required_keys__} and @code{__optional_keys__} rely on may not work
properly, and the values of the attributes may be incorrect.
@end quotation
@end cartouche
@end deffn

Support for @ref{48b,,ReadOnly} is reflected in the following attributes:

@geindex __readonly_keys__ (typing.TypedDict의 속성)
@anchor{library/typing typing TypedDict __readonly_keys__}@anchor{454b}
@deffn {속성} __readonly_keys__

A @ref{7f1,,frozenset} containing the names of all read-only keys. Keys
are read-only if they carry the @ref{48b,,ReadOnly} qualifier.


Added in version 3.13.

@end deffn

@geindex __mutable_keys__ (typing.TypedDict의 속성)
@anchor{library/typing typing TypedDict __mutable_keys__}@anchor{454c}
@deffn {속성} __mutable_keys__

A @ref{7f1,,frozenset} containing the names of all mutable keys. Keys
are mutable if they do not carry the @ref{48b,,ReadOnly} qualifier.


Added in version 3.13.

@end deffn

See the TypedDict@footnote{https://typing.python.org/en/latest/spec/typeddict.html#typeddict} section in the typing documentation for more examples and detailed rules.


Added in version 3.8.



버전 3.9에서 변경: @code{TypedDict} is now a function rather than a class.
It can still be used as a class base, as described above.



버전 3.11에서 변경: Added support for marking individual keys as @ref{7df,,Required} or @ref{7e0,,NotRequired}.
See 
@geindex Python 향상 제안; PEP 655
PEP 655@footnote{https://peps.python.org/pep-0655/}.



버전 3.11에서 변경: Added support for generic @code{TypedDict}s.



버전 3.13에서 변경: Removed support for the keyword-argument method of creating @code{TypedDict}s.



버전 3.13에서 변경: Support for the @ref{48b,,ReadOnly} qualifier was added.



Deprecated since version 3.13, will be removed in version 3.15: When using the functional syntax to create a TypedDict class, failing to
pass a value to the ‘fields’ parameter (@code{TD = TypedDict("TD")}) is
deprecated. Passing @code{None} to the ‘fields’ parameter
(@code{TD = TypedDict("TD", None)}) is also deprecated. Both will be
disallowed in Python 3.15. To create a TypedDict class with 0 fields,
use @code{class TD(TypedDict): pass} or @code{TD = TypedDict("TD", @{@})}.

@end deffn

@node 프로토콜<3>,ABCs and Protocols for working with I/O,특수 타이핑 프리미티브,모듈 내용<6>
@anchor{library/typing protocols}@anchor{454d}
@subsubsection 프로토콜


The following protocols are provided by the @code{typing} module. All are decorated
with @ref{673,,@@runtime_checkable}.

@geindex SupportsAbs (typing 클래스)
@anchor{library/typing typing SupportsAbs}@anchor{454e}
@deffn {클래스} typing.SupportsAbs

반환형이 공변적(covariant)인 하나의 추상 메서드 @code{__abs__}를 가진 ABC.
@end deffn

@geindex SupportsBytes (typing 클래스)
@anchor{library/typing typing SupportsBytes}@anchor{7ff}
@deffn {클래스} typing.SupportsBytes

하나의 추상 메서드 @code{__bytes__}를 가진 ABC.
@end deffn

@geindex SupportsComplex (typing 클래스)
@anchor{library/typing typing SupportsComplex}@anchor{7fe}
@deffn {클래스} typing.SupportsComplex

하나의 추상 메서드 @code{__complex__}를 가진 ABC.
@end deffn

@geindex SupportsFloat (typing 클래스)
@anchor{library/typing typing SupportsFloat}@anchor{454f}
@deffn {클래스} typing.SupportsFloat

하나의 추상 메서드 @code{__float__}를 가진 ABC.
@end deffn

@geindex SupportsIndex (typing 클래스)
@anchor{library/typing typing SupportsIndex}@anchor{c39}
@deffn {클래스} typing.SupportsIndex

하나의 추상 메서드 @code{__index__}를 가진 ABC.


Added in version 3.8.

@end deffn

@geindex SupportsInt (typing 클래스)
@anchor{library/typing typing SupportsInt}@anchor{c38}
@deffn {클래스} typing.SupportsInt

하나의 추상 메서드 @code{__int__}를 가진 ABC.
@end deffn

@geindex SupportsRound (typing 클래스)
@anchor{library/typing typing SupportsRound}@anchor{4550}
@deffn {클래스} typing.SupportsRound

반환형이 공변적(covariant)인 하나의 추상 메서드 @code{__round__}를 가진 ABC.
@end deffn

@node ABCs and Protocols for working with I/O,함수와 데코레이터,프로토콜<3>,모듈 내용<6>
@anchor{library/typing abcs-and-protocols-for-working-with-i-o}@anchor{4551}@anchor{library/typing typing-io}@anchor{3151}
@subsubsection ABCs and Protocols for working with I/O


@geindex IO (typing 클래스)
@geindex TextIO (typing 클래스)
@geindex BinaryIO (typing 클래스)
@anchor{library/typing typing IO}@anchor{238}
@deffn {클래스} typing.IO [AnyStr]
@anchor{library/typing typing TextIO}@anchor{239}
@deffnx {클래스} typing.TextIO
@anchor{library/typing typing BinaryIO}@anchor{23a}
@deffnx {클래스} typing.BinaryIO

Generic class @code{IO[AnyStr]} and its subclasses @code{TextIO(IO[str])}
and @code{BinaryIO(IO[bytes])}
represent the types of I/O streams such as returned by
@ref{316,,open()}. Please note that these classes are not protocols, and
their interface is fairly broad.
@end deffn

The protocols @ref{236,,io.Reader} and @ref{237,,io.Writer} offer a simpler
alternative for argument types, when only the @code{read()} or @code{write()}
methods are accessed, respectively:

@example
def read_and_write(reader: Reader[str], writer: Writer[bytes]):
    data = reader.read()
    writer.write(data.encode())
@end example

Also consider using @ref{26b4,,collections.abc.Iterable} for iterating over
the lines of an input stream:

@example
def read_config(stream: Iterable[str]):
    for line in stream:
        ...
@end example

@node 함수와 데코레이터,인트로스펙션 도우미,ABCs and Protocols for working with I/O,모듈 내용<6>
@anchor{library/typing functions-and-decorators}@anchor{4552}
@subsubsection 함수와 데코레이터


@geindex cast() (typing 모듈)
@anchor{library/typing typing cast}@anchor{4538}
@deffn {함수} typing.cast (typ, val)

값을 형으로 변환합니다.

값을 변경하지 않고 반환합니다. 형 검사기에서는 반환 값이 지정된 형임을 나타내지만, 실행 시간에는 의도적으로 아무것도 확인하지 않습니다 (우리는 이것이 가능한 한 빠르기를 원합니다).
@end deffn

@geindex assert_type() (typing 모듈)
@anchor{library/typing typing assert_type}@anchor{8b9}
@deffn {함수} typing.assert_type (val, typ, /)

Ask a static type checker to confirm that `val' has an inferred type of `typ'.

At runtime this does nothing: it returns the first argument unchanged with no
checks or side effects, no matter the actual type of the argument.

When a static type checker encounters a call to @code{assert_type()}, it
emits an error if the value is not of the specified type:

@example
def greet(name: str) -> None:
    assert_type(name, str)  # OK, inferred type of `name` is `str`
    assert_type(name, int)  # type checker error
@end example

This function is useful for ensuring the type checker’s understanding of a
script is in line with the developer’s intentions:

@example
def complex_function(arg: object):
    # Do some complex type-narrowing logic,
    # after which we hope the inferred type will be `int`
    ...
    # Test whether the type checker correctly understands our function
    assert_type(arg, int)
@end example


Added in version 3.11.

@end deffn

@geindex assert_never() (typing 모듈)
@anchor{library/typing typing assert_never}@anchor{8b5}
@deffn {함수} typing.assert_never (arg, /)

Ask a static type checker to confirm that a line of code is unreachable.

Example:

@example
def int_or_str(arg: int | str) -> None:
    match arg:
        case int():
            print("It's an int")
        case str():
            print("It's a str")
        case _ as unreachable:
            assert_never(unreachable)
@end example

Here, the annotations allow the type checker to infer that the
last case can never execute, because @code{arg} is either
an @ref{19b,,int} or a @ref{169,,str}, and both options are covered by
earlier cases.

If a type checker finds that a call to @code{assert_never()} is
reachable, it will emit an error. For example, if the type annotation
for @code{arg} was instead @code{int | str | float}, the type checker would
emit an error pointing out that @code{unreachable} is of type @ref{196,,float}.
For a call to @code{assert_never} to pass type checking, the inferred type of
the argument passed in must be the bottom type, @ref{8b6,,Never}, and nothing
else.

At runtime, this throws an exception when called.


@subsubheading 더 보기


Unreachable Code and Exhaustiveness Checking@footnote{https://typing.python.org/en/latest/guides/unreachable.html} has more
information about exhaustiveness checking with static typing.



Added in version 3.11.

@end deffn

@geindex reveal_type() (typing 모듈)
@anchor{library/typing typing reveal_type}@anchor{8b8}
@deffn {함수} typing.reveal_type (obj, /)

Ask a static type checker to reveal the inferred type of an expression.

When a static type checker encounters a call to this function,
it emits a diagnostic with the inferred type of the argument. For example:

@example
x: int = 1
reveal_type(x)  # Revealed type is "builtins.int"
@end example

This can be useful when you want to debug how your type checker
handles a particular piece of code.

At runtime, this function prints the runtime type of its argument to
@ref{b33,,sys.stderr} and returns the argument unchanged (allowing the call to
be used within an expression):

@example
x = reveal_type(1)  # prints "Runtime type is int"
print(x)  # prints "1"
@end example

Note that the runtime type may be different from (more or less specific
than) the type statically inferred by a type checker.

Most type checkers support @code{reveal_type()} anywhere, even if the
name is not imported from @code{typing}. Importing the name from
@code{typing}, however, allows your code to run without runtime errors and
communicates intent more clearly.


Added in version 3.11.

@end deffn

@geindex dataclass_transform() (typing 모듈)
@anchor{library/typing typing dataclass_transform}@anchor{6fa}
@deffn {함수} @@typing.dataclass_transform (*, eq_default=True, order_default=False, kw_only_default=False, frozen_default=False, field_specifiers=(), **kwargs)

Decorator to mark an object as providing
@ref{4e1,,dataclass}-like behavior.

@code{dataclass_transform} may be used to
decorate a class, metaclass, or a function that is itself a decorator.
The presence of @code{@@dataclass_transform()} tells a static type checker that the
decorated object performs runtime “magic” that
transforms a class in a similar way to
@ref{4e1,,@@dataclasses.dataclass}.

Example usage with a decorator function:

@example
@@dataclass_transform()
def create_model[T](cls: type[T]) -> type[T]:
    ...
    return cls

@@create_model
class CustomerModel:
    id: int
    name: str
@end example

On a base class:

@example
@@dataclass_transform()
class ModelBase: ...

class CustomerModel(ModelBase):
    id: int
    name: str
@end example

On a metaclass:

@example
@@dataclass_transform()
class ModelMeta(type): ...

class ModelBase(metaclass=ModelMeta): ...

class CustomerModel(ModelBase):
    id: int
    name: str
@end example

The @code{CustomerModel} classes defined above will
be treated by type checkers similarly to classes created with
@ref{4e1,,@@dataclasses.dataclass}.
For example, type checkers will assume these classes have
@code{__init__} methods that accept @code{id} and @code{name}.

The decorated class, metaclass, or function may accept the following bool
arguments which type checkers will assume have the same effect as they
would have on the
@ref{4e1,,@@dataclasses.dataclass} decorator: @code{init},
@code{eq}, @code{order}, @code{unsafe_hash}, @code{frozen}, @code{match_args},
@code{kw_only}, and @code{slots}. It must be possible for the value of these
arguments (@code{True} or @code{False}) to be statically evaluated.

The arguments to the @code{dataclass_transform} decorator can be used to
customize the default behaviors of the decorated class, metaclass, or
function:

@*매개변수: 

@itemize *

@item 
@code{eq_default} (@ref{3c3,,bool}) – Indicates whether the @code{eq} parameter is assumed to be
@code{True} or @code{False} if it is omitted by the caller.
Defaults to @code{True}.

@item 
@code{order_default} (@ref{3c3,,bool}) – Indicates whether the @code{order} parameter is
assumed to be @code{True} or @code{False} if it is omitted by the caller.
Defaults to @code{False}.

@item 
@code{kw_only_default} (@ref{3c3,,bool}) – Indicates whether the @code{kw_only} parameter is
assumed to be @code{True} or @code{False} if it is omitted by the caller.
Defaults to @code{False}.

@item 
@code{frozen_default} (@ref{3c3,,bool}) – 
Indicates whether the @code{frozen} parameter is
assumed to be @code{True} or @code{False} if it is omitted by the caller.
Defaults to @code{False}.


Added in version 3.12.



@item 
@code{field_specifiers} (@ref{610,,tuple}@code{[}@ref{9eb,,Callable}@code{[}@code{...}@code{, }@code{Any}@code{]}@code{, }@code{...}@code{]}) – Specifies a static list of supported classes
or functions that describe fields, similar to @ref{195b,,dataclasses.field()}.
Defaults to @code{()}.

@item 
@code{**kwargs} (@code{Any}) – Arbitrary other keyword arguments are accepted in order to allow for
possible future extensions.
@end itemize


Type checkers recognize the following optional parameters on field
specifiers:
`Recognised parameters for field specifiers'



@multitable {xxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Parameter name

@tab

Description

@item

@code{init}

@tab

Indicates whether the field should be included in the
synthesized @code{__init__} method. If unspecified, @code{init} defaults to
@code{True}.

@item

@code{default}

@tab

Provides the default value for the field.

@item

@code{default_factory}

@tab

Provides a runtime callback that returns the
default value for the field. If neither @code{default} nor
@code{default_factory} are specified, the field is assumed to have no
default value and must be provided a value when the class is
instantiated.

@item

@code{factory}

@tab

An alias for the @code{default_factory} parameter on field specifiers.

@item

@code{kw_only}

@tab

Indicates whether the field should be marked as
keyword-only. If @code{True}, the field will be keyword-only. If
@code{False}, it will not be keyword-only. If unspecified, the value of
the @code{kw_only} parameter on the object decorated with
@code{dataclass_transform} will be used, or if that is unspecified, the
value of @code{kw_only_default} on @code{dataclass_transform} will be used.

@item

@code{alias}

@tab

Provides an alternative name for the field. This alternative
name is used in the synthesized @code{__init__} method.

@end multitable


At runtime, this decorator records its arguments in the
@code{__dataclass_transform__} attribute on the decorated object.
It has no other runtime effect.

See 
@geindex Python 향상 제안; PEP 681
PEP 681@footnote{https://peps.python.org/pep-0681/} for more details.


Added in version 3.11.

@end deffn

@geindex overload() (typing 모듈)
@anchor{library/typing overload}@anchor{4514}@anchor{library/typing typing overload}@anchor{4553}
@deffn {함수} @@typing.overload

Decorator for creating overloaded functions and methods.

The @code{@@overload} decorator allows describing functions and methods
that support multiple different combinations of argument types. A series
of @code{@@overload}-decorated definitions must be followed by exactly one
non-@code{@@overload}-decorated definition (for the same function/method).

@code{@@overload}-decorated definitions are for the benefit of the
type checker only, since they will be overwritten by the
non-@code{@@overload}-decorated definition. The non-@code{@@overload}-decorated
definition, meanwhile, will be used at
runtime but should be ignored by a type checker.  At runtime, calling
an @code{@@overload}-decorated function directly will raise
@ref{36b,,NotImplementedError}.

An example of overload that gives a more
precise type than can be expressed using a union or a type variable:

@example
@@overload
def process(response: None) -> None:
    ...
@@overload
def process(response: int) -> tuple[int, str]:
    ...
@@overload
def process(response: bytes) -> str:
    ...
def process(response):
    ...  # actual implementation goes here
@end example

See 
@geindex Python 향상 제안; PEP 484
PEP 484@footnote{https://peps.python.org/pep-0484/} for more details and comparison with other typing semantics.


버전 3.11에서 변경: Overloaded functions can now be introspected at runtime using
@ref{8bc,,get_overloads()}.

@end deffn

@geindex get_overloads() (typing 모듈)
@anchor{library/typing typing get_overloads}@anchor{8bc}
@deffn {함수} typing.get_overloads (func)

Return a sequence of @ref{4553,,@@overload}-decorated definitions for
`func'.

`func' is the function object for the implementation of the
overloaded function. For example, given the definition of @code{process} in
the documentation for @ref{4553,,@@overload},
@code{get_overloads(process)} will return a sequence of three function objects
for the three defined overloads. If called on a function with no overloads,
@code{get_overloads()} returns an empty sequence.

@code{get_overloads()} can be used for introspecting an overloaded function at
runtime.


Added in version 3.11.

@end deffn

@geindex clear_overloads() (typing 모듈)
@anchor{library/typing typing clear_overloads}@anchor{8bd}
@deffn {함수} typing.clear_overloads ()

Clear all registered overloads in the internal registry.

This can be used to reclaim the memory used by the registry.


Added in version 3.11.

@end deffn

@geindex final() (typing 모듈)
@anchor{library/typing typing final}@anchor{8bb}
@deffn {함수} @@typing.final

Decorator to indicate final methods and final classes.

Decorating a method with @code{@@final} indicates to a type checker that the
method cannot be overridden in a subclass. Decorating a class with @code{@@final}
indicates that it cannot be subclassed.

예를 들면:

@example
class Base:
    @@final
    def done(self) -> None:
        ...
class Sub(Base):
    def done(self) -> None:  # Error reported by type checker
        ...

@@final
class Leaf:
    ...
class Other(Leaf):  # Error reported by type checker
    ...
@end example

이러한 속성에 대한 실행 시간 검사는 없습니다. 자세한 내용은 
@geindex Python 향상 제안; PEP 591
PEP 591@footnote{https://peps.python.org/pep-0591/}을 참조하십시오.


Added in version 3.8.



버전 3.11에서 변경: The decorator will now attempt to set a @code{__final__} attribute to @code{True}
on the decorated object. Thus, a check like
@code{if getattr(obj, "__final__", False)} can be used at runtime
to determine whether an object @code{obj} has been marked as final.
If the decorated object does not support setting attributes,
the decorator returns the object unchanged without raising an exception.

@end deffn

@geindex no_type_check() (typing 모듈)
@anchor{library/typing typing no_type_check}@anchor{8c2}
@deffn {함수} @@typing.no_type_check

어노테이션이 형 힌트가 아님을 나타내는 데코레이터.

This works as a class or function @ref{939,,decorator}.  With a class, it
applies recursively to all methods and classes defined in that class
(but not to methods defined in its superclasses or subclasses). Type
checkers will ignore all annotations in a function or class with this
decorator.

@code{@@no_type_check} mutates the decorated object in place.
@end deffn

@geindex no_type_check_decorator() (typing 모듈)
@anchor{library/typing typing no_type_check_decorator}@anchor{333}
@deffn {함수} @@typing.no_type_check_decorator

다른 데코레이터에 @ref{8c2,,no_type_check()} 효과를 주는 데코레이터.

이것은 데코레이트 된 함수를 @ref{8c2,,no_type_check()}로 감싸는 무언가로 데코레이터를 감쌉니다.


Deprecated since version 3.13, will be removed in version 3.15: No type checker ever added support for @code{@@no_type_check_decorator}. It
is therefore deprecated, and will be removed in Python 3.15.

@end deffn

@geindex override() (typing 모듈)
@anchor{library/typing typing override}@anchor{67b}
@deffn {함수} @@typing.override

Decorator to indicate that a method in a subclass is intended to override a
method or attribute in a superclass.

Type checkers should emit an error if a method decorated with @code{@@override}
does not, in fact, override anything.
This helps prevent bugs that may occur when a base class is changed without
an equivalent change to a child class.

For example:

@example
class Base:
    def log_status(self) -> None:
        ...

class Sub(Base):
    @@override
    def log_status(self) -> None:  # Okay: overrides Base.log_status
        ...

    @@override
    def done(self) -> None:  # Error reported by type checker
        ...
@end example

There is no runtime checking of this property.

The decorator will attempt to set an @code{__override__} attribute to @code{True} on
the decorated object. Thus, a check like
@code{if getattr(obj, "__override__", False)} can be used at runtime to determine
whether an object @code{obj} has been marked as an override.  If the decorated object
does not support setting attributes, the decorator returns the object unchanged
without raising an exception.

See 
@geindex Python 향상 제안; PEP 698
PEP 698@footnote{https://peps.python.org/pep-0698/} for more details.


Added in version 3.12.

@end deffn

@geindex type_check_only() (typing 모듈)
@anchor{library/typing typing type_check_only}@anchor{4554}
@deffn {함수} @@typing.type_check_only

Decorator to mark a class or function as unavailable at runtime.

이 데코레이터 자체는 실행 시간에 사용할 수 없습니다. 주로, 구현이 비공개 클래스의 인스턴스를 반환할 때, 형 스텁 파일에 정의된 클래스를 표시하기 위한 용도입니다:

@example
@@type_check_only
class Response:  # private or not available at runtime
    code: int
    def get_header(self, name: str) -> str: ...

def fetch_response() -> Response: ...
@end example

비공개 클래스의 인스턴스를 반환하는 것은 좋지 않음에 유의하십시오. 일반적으로 그러한 클래스를 공개로 만드는 것이 바람직합니다.
@end deffn

@node 인트로스펙션 도우미,상수<10>,함수와 데코레이터,모듈 내용<6>
@anchor{library/typing introspection-helpers}@anchor{4555}
@subsubsection 인트로스펙션 도우미


@geindex get_type_hints() (typing 모듈)
@anchor{library/typing typing get_type_hints}@anchor{8bf}
@deffn {함수} typing.get_type_hints (obj, globalns=None, localns=None, include_extras=False)

Return a dictionary containing type hints for a function, method, module,
class object, or other callable object.

This is often the same as @code{obj.__annotations__}, but this function makes
the following changes to the annotations dictionary:


@itemize *

@item 
Forward references encoded as string literals or @ref{1bd8,,ForwardRef}
objects are handled by evaluating them in `globalns', `localns', and
(where applicable) `obj'’s @ref{5ac,,type parameter} namespace.
If `globalns' or `localns' is not given, appropriate namespace
dictionaries are inferred from `obj'.

@item 
@code{None} is replaced with @ref{a52,,types.NoneType}.

@item 
If @ref{8c2,,@@no_type_check} has been applied to `obj', an
empty dictionary is returned.

@item 
If `obj' is a class @code{C}, the function returns a dictionary that merges
annotations from @code{C}’s base classes with those on @code{C} directly. This
is done by traversing @ref{2374,,C.__mro__} and iteratively
combining
@code{__annotations__} dictionaries. Annotations on classes appearing
earlier in the @ref{25e0,,method resolution order} always take precedence over
annotations on classes appearing later in the method resolution order.

@item 
The function recursively replaces all occurrences of
@code{Annotated[T, ...]}, @code{Required[T]}, @code{NotRequired[T]}, and @code{ReadOnly[T]}
with @code{T}, unless `include_extras' is set to @code{True} (see
@ref{b37,,Annotated} for more information).
@end itemize

See also @ref{459,,annotationlib.get_annotations()}, a lower-level function that
returns annotations more directly.

@cartouche
@quotation 조심 
This function may execute arbitrary code contained in annotations.
See @ref{4556,,Security implications of introspecting annotations} for more information.
@end quotation
@end cartouche

@cartouche
@quotation 참고 
If any forward references in the annotations of `obj' are not resolvable
or are not valid Python code, this function will raise an exception
such as @ref{452,,NameError}. For example, this can happen with imported
@ref{682,,type aliases} that include forward references,
or with names imported under @ref{eef,,if TYPE_CHECKING}.
@end quotation
@end cartouche

@cartouche
@quotation 참고 
Calling @code{get_type_hints()} on an instance is not supported.
To retrieve annotations for an instance, call
@code{get_type_hints()} on the instance’s class instead
(for example, @code{get_type_hints(type(obj))}).
@end quotation
@end cartouche


버전 3.9에서 변경: Added @code{include_extras} parameter as part of 
@geindex Python 향상 제안; PEP 593
PEP 593@footnote{https://peps.python.org/pep-0593/}.
See the documentation on @ref{b37,,Annotated} for more information.



버전 3.11에서 변경: Previously, @code{Optional[t]} was added for function and method annotations
if a default value equal to @code{None} was set.
Now the annotation is returned unchanged.



버전 3.14에서 변경: Calling @code{get_type_hints()} on instances is no longer supported.
Some instances were accepted in earlier versions as an undocumented
implementation detail.

@end deffn

@geindex get_origin() (typing 모듈)
@anchor{library/typing typing get_origin}@anchor{2ab}
@deffn {함수} typing.get_origin (tp)

Get the unsubscripted version of a type: for a typing object of the form
@code{X[Y, Z, ...]} return @code{X}.

If @code{X} is a typing-module alias for a builtin or
@ref{1e,,collections} class, it will be normalized to the original class.
If @code{X} is an instance of @ref{9c9,,ParamSpecArgs} or @ref{9ca,,ParamSpecKwargs},
return the underlying @ref{488,,ParamSpec}.
Return @code{None} for unsupported objects.

Examples:

@example
assert get_origin(str) is None
assert get_origin(Dict[str, int]) is dict
assert get_origin(Union[int, str]) is Union
assert get_origin(Annotated[str, "metadata"]) is Annotated
P = ParamSpec('P')
assert get_origin(P.args) is P
assert get_origin(P.kwargs) is P
@end example


Added in version 3.8.

@end deffn

@geindex get_args() (typing 모듈)
@anchor{library/typing typing get_args}@anchor{2ac}
@deffn {함수} typing.get_args (tp)

Get type arguments with all substitutions performed: for a typing object
of the form @code{X[Y, Z, ...]} return @code{(Y, Z, ...)}.

If @code{X} is a union or @ref{a55,,Literal} contained in another
generic type, the order of @code{(Y, Z, ...)} may be different from the order
of the original arguments @code{[Y, Z, ...]} due to type caching.
Return @code{()} for unsupported objects.

Examples:

@example
assert get_args(int) == ()
assert get_args(Dict[int, str]) == (int, str)
assert get_args(Union[int, str]) == (int, str)
@end example


Added in version 3.8.

@end deffn

@geindex get_protocol_members() (typing 모듈)
@anchor{library/typing typing get_protocol_members}@anchor{56a}
@deffn {함수} typing.get_protocol_members (tp)

Return the set of members defined in a @ref{569,,Protocol}.

@example
>>> from typing import Protocol, get_protocol_members
>>> class P(Protocol):
...     def a(self) -> str: ...
...     b: int
>>> get_protocol_members(P) == frozenset(@{'a', 'b'@})
True
@end example

Raise @ref{198,,TypeError} for arguments that are not Protocols.


Added in version 3.13.

@end deffn

@geindex is_protocol() (typing 모듈)
@anchor{library/typing typing is_protocol}@anchor{56b}
@deffn {함수} typing.is_protocol (tp)

Determine if a type is a @ref{569,,Protocol}.

예를 들면:

@example
class P(Protocol):
    def a(self) -> str: ...
    b: int

is_protocol(P)    # => True
is_protocol(int)  # => False
@end example


Added in version 3.13.

@end deffn

@geindex is_typeddict() (typing 모듈)
@anchor{library/typing typing is_typeddict}@anchor{a56}
@deffn {함수} typing.is_typeddict (tp)

Check if a type is a @ref{332,,TypedDict}.

For example:

@example
class Film(TypedDict):
    title: str
    year: int

assert is_typeddict(Film)
assert not is_typeddict(list | str)

# TypedDict is a factory for creating typed dicts,
# not a typed dict itself
assert not is_typeddict(TypedDict)
@end example


Added in version 3.10.

@end deffn

@geindex ForwardRef (typing 클래스)
@anchor{library/typing typing ForwardRef}@anchor{1bd8}
@deffn {클래스} typing.ForwardRef

Class used for internal typing representation of string forward references.

For example, @code{List["SomeClass"]} is implicitly transformed into
@code{List[ForwardRef("SomeClass")]}.  @code{ForwardRef} should not be instantiated by
a user, but may be used by introspection tools.

@cartouche
@quotation 참고 
@geindex Python 향상 제안; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/} generic types such as @code{list["SomeClass"]} will not be
implicitly transformed into @code{list[ForwardRef("SomeClass")]} and thus
will not automatically resolve to @code{list[SomeClass]}.
@end quotation
@end cartouche


Added in version 3.7.4.



버전 3.14에서 변경: This is now an alias for @ref{177e,,annotationlib.ForwardRef}. Several undocumented
behaviors of this class have been changed; for example, after a @code{ForwardRef} has
been evaluated, the evaluated value is no longer cached.

@end deffn

@geindex evaluate_forward_ref() (typing 모듈)
@anchor{library/typing typing evaluate_forward_ref}@anchor{1818}
@deffn {함수} typing.evaluate_forward_ref (forward_ref, *, owner=None, globals=None, locals=None, type_params=None, format=annotationlib.Format.VALUE)

Evaluate an @ref{177e,,annotationlib.ForwardRef} as a @ref{23cb,,type hint}.

This is similar to calling @ref{17b9,,annotationlib.ForwardRef.evaluate()},
but unlike that method, @code{evaluate_forward_ref()} also
recursively evaluates forward references nested within the type hint.

See the documentation for @ref{17b9,,annotationlib.ForwardRef.evaluate()} for
the meaning of the `owner', `globals', `locals', `type_params', and `format' parameters.

@cartouche
@quotation 조심 
This function may execute arbitrary code contained in annotations.
See @ref{4556,,Security implications of introspecting annotations} for more information.
@end quotation
@end cartouche


Added in version 3.14.

@end deffn

@geindex NoDefault (typing 모듈)
@anchor{library/typing typing NoDefault}@anchor{568}
@deffn {데이터} typing.NoDefault

A sentinel object used to indicate that a type parameter has no default
value. For example:

@example
>>> T = TypeVar("T")
>>> T.__default__ is typing.NoDefault
True
>>> S = TypeVar("S", default=None)
>>> S.__default__ is None
True
@end example


Added in version 3.13.

@end deffn

@node 상수<10>,Deprecated aliases,인트로스펙션 도우미,모듈 내용<6>
@anchor{library/typing constant}@anchor{4557}
@subsubsection 상수


@geindex TYPE_CHECKING (typing 모듈)
@anchor{library/typing typing TYPE_CHECKING}@anchor{eef}
@deffn {데이터} typing.TYPE_CHECKING

A special constant that is assumed to be @code{True} by 3rd party static
type checkers. It’s @code{False} at runtime.

A module which is expensive to import, and which only contain types
used for typing annotations, can be safely imported inside an
@code{if TYPE_CHECKING:} block.  This prevents the module from actually
being imported at runtime; annotations aren’t eagerly evaluated
(see 
@geindex Python 향상 제안; PEP 649
PEP 649@footnote{https://peps.python.org/pep-0649/}) so using undefined symbols in annotations is
harmless–as long as you don’t later examine them.
Your static type analysis tool will set @code{TYPE_CHECKING} to
@code{True} during static type analysis, which means the module will
be imported and the types will be checked properly during such analysis.

용법:

@example
if TYPE_CHECKING:
    import expensive_mod

def fun(arg: expensive_mod.SomeType) -> None:
    local_var: expensive_mod.AnotherType = other_fun()
@end example

If you occasionally need to examine type annotations at runtime
which may contain undefined symbols, use
@ref{459,,annotationlib.get_annotations()} with a @code{format} parameter
of @ref{160,,annotationlib.Format.STRING} or
@ref{15f,,annotationlib.Format.FORWARDREF} to safely retrieve the
annotations without raising @ref{452,,NameError}.


Added in version 3.5.2.

@end deffn
@anchor{library/typing generic-concrete-collections}@anchor{4558}
@node Deprecated aliases,,상수<10>,모듈 내용<6>
@anchor{library/typing deprecated-aliases}@anchor{4559}@anchor{library/typing id6}@anchor{455a}
@subsubsection Deprecated aliases


This module defines several deprecated aliases to pre-existing
standard library classes. These were originally included in the @code{typing}
module in order to support parameterizing these generic classes using @code{[]}.
However, the aliases became redundant in Python 3.9 when the
corresponding pre-existing classes were enhanced to support @code{[]} (see
@geindex Python 향상 제안; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/}).

The redundant types are deprecated as of Python 3.9. However, while the aliases
may be removed at some point, removal of these aliases is not currently
planned. As such, no deprecation warnings are currently issued by the
interpreter for these aliases.

If at some point it is decided to remove these deprecated aliases, a
deprecation warning will be issued by the interpreter for at least two releases
prior to removal. The aliases are guaranteed to remain in the @code{typing} module
without deprecation warnings until at least Python 3.14.

Type checkers are encouraged to flag uses of the deprecated types if the
program they are checking targets a minimum Python version of 3.9 or newer.

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

@end menu

@node Aliases to built-in types,Aliases to types in collections,,Deprecated aliases
@anchor{library/typing aliases-to-built-in-types}@anchor{455b}@anchor{library/typing corresponding-to-built-in-types}@anchor{455c}
@subsubsection Aliases to built-in types


@geindex Dict (typing 클래스)
@anchor{library/typing typing Dict}@anchor{455d}
@deffn {클래스} typing.Dict (dict, MutableMapping[KT, VT])

Deprecated alias to @ref{183,,dict}.

Note that to annotate arguments, it is preferred
to use an abstract collection type such as @ref{ac7,,Mapping}
rather than to use @ref{183,,dict} or @code{typing.Dict}.


버전 3.9부터 폐지됨: @ref{183,,builtins.dict} now supports subscripting (@code{[]}).
See 
@geindex Python 향상 제안; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/} and @ref{8c0,,제네릭 에일리어스 형}.

@end deffn

@geindex List (typing 클래스)
@anchor{library/typing typing List}@anchor{455e}
@deffn {클래스} typing.List (list, MutableSequence[T])

Deprecated alias to @ref{24d,,list}.

Note that to annotate arguments, it is preferred
to use an abstract collection type such as
@ref{13c9,,Sequence} or @ref{26b4,,Iterable}
rather than to use @ref{24d,,list} or @code{typing.List}.


버전 3.9부터 폐지됨: @ref{24d,,builtins.list} now supports subscripting (@code{[]}).
See 
@geindex Python 향상 제안; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/} and @ref{8c0,,제네릭 에일리어스 형}.

@end deffn

@geindex Set (typing 클래스)
@anchor{library/typing typing Set}@anchor{455f}
@deffn {클래스} typing.Set (set, MutableSet[T])

Deprecated alias to @ref{184,,builtins.set}.

Note that to annotate arguments, it is preferred
to use an abstract collection type such as @ref{26ac,,collections.abc.Set}
rather than to use @ref{184,,set} or @ref{455f,,typing.Set}.


버전 3.9부터 폐지됨: @ref{184,,builtins.set} now supports subscripting (@code{[]}).
See 
@geindex Python 향상 제안; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/} and @ref{8c0,,제네릭 에일리어스 형}.

@end deffn

@geindex FrozenSet (typing 클래스)
@anchor{library/typing typing FrozenSet}@anchor{4560}
@deffn {클래스} typing.FrozenSet (frozenset, AbstractSet[T_co])

Deprecated alias to @ref{7f1,,builtins.frozenset}.


버전 3.9부터 폐지됨: @ref{7f1,,builtins.frozenset}
now supports subscripting (@code{[]}).
See 
@geindex Python 향상 제안; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/} and @ref{8c0,,제네릭 에일리어스 형}.

@end deffn

@geindex Tuple (typing 모듈)
@anchor{library/typing typing Tuple}@anchor{4561}
@deffn {데이터} typing.Tuple

Deprecated alias for @ref{610,,tuple}.

@ref{610,,tuple} and @code{Tuple} are special-cased in the type system; see
@ref{26d6,,Annotating tuples} for more details.


버전 3.9부터 폐지됨: @ref{610,,builtins.tuple} now supports subscripting (@code{[]}).
See 
@geindex Python 향상 제안; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/} and @ref{8c0,,제네릭 에일리어스 형}.

@end deffn

@geindex Type (typing 클래스)
@anchor{library/typing typing Type}@anchor{4519}
@deffn {클래스} typing.Type (Generic[CT_co])

Deprecated alias to @ref{f43,,type}.

See @ref{4518,,The type of class objects} for details on using @ref{f43,,type} or
@code{typing.Type} in type annotations.


Added in version 3.5.2.



버전 3.9부터 폐지됨: @ref{f43,,builtins.type} now supports subscripting (@code{[]}).
See 
@geindex Python 향상 제안; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/} and @ref{8c0,,제네릭 에일리어스 형}.

@end deffn

@node Aliases to types in collections,Aliases to other concrete types,Aliases to built-in types,Deprecated aliases
@anchor{library/typing aliases-to-types-in-collections}@anchor{4562}@anchor{library/typing corresponding-to-types-in-collections}@anchor{4563}
@subsubsection Aliases to types in @code{collections}


@geindex DefaultDict (typing 클래스)
@anchor{library/typing typing DefaultDict}@anchor{4564}
@deffn {클래스} typing.DefaultDict (collections.defaultdict, MutableMapping[KT, VT])

Deprecated alias to @ref{13c1,,collections.defaultdict}.


Added in version 3.5.2.



버전 3.9부터 폐지됨: @ref{13c1,,collections.defaultdict} now supports subscripting (@code{[]}).
See 
@geindex Python 향상 제안; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/} and @ref{8c0,,제네릭 에일리어스 형}.

@end deffn

@geindex OrderedDict (typing 클래스)
@anchor{library/typing typing OrderedDict}@anchor{4565}
@deffn {클래스} typing.OrderedDict (collections.OrderedDict, MutableMapping[KT, VT])

Deprecated alias to @ref{7f2,,collections.OrderedDict}.


Added in version 3.7.2.



버전 3.9부터 폐지됨: @ref{7f2,,collections.OrderedDict} now supports subscripting (@code{[]}).
See 
@geindex Python 향상 제안; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/} and @ref{8c0,,제네릭 에일리어스 형}.

@end deffn

@geindex ChainMap (typing 클래스)
@anchor{library/typing typing ChainMap}@anchor{4566}
@deffn {클래스} typing.ChainMap (collections.ChainMap, MutableMapping[KT, VT])

Deprecated alias to @ref{e15,,collections.ChainMap}.


Added in version 3.6.1.



버전 3.9부터 폐지됨: @ref{e15,,collections.ChainMap} now supports subscripting (@code{[]}).
See 
@geindex Python 향상 제안; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/} and @ref{8c0,,제네릭 에일리어스 형}.

@end deffn

@geindex Counter (typing 클래스)
@anchor{library/typing typing Counter}@anchor{4567}
@deffn {클래스} typing.Counter (collections.Counter, Dict[T, int])

Deprecated alias to @ref{1296,,collections.Counter}.


Added in version 3.6.1.



버전 3.9부터 폐지됨: @ref{1296,,collections.Counter} now supports subscripting (@code{[]}).
See 
@geindex Python 향상 제안; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/} and @ref{8c0,,제네릭 에일리어스 형}.

@end deffn

@geindex Deque (typing 클래스)
@anchor{library/typing typing Deque}@anchor{4568}
@deffn {클래스} typing.Deque (deque, MutableSequence[T])

Deprecated alias to @ref{7f3,,collections.deque}.


Added in version 3.6.1.



버전 3.9부터 폐지됨: @ref{7f3,,collections.deque} now supports subscripting (@code{[]}).
See 
@geindex Python 향상 제안; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/} and @ref{8c0,,제네릭 에일리어스 형}.

@end deffn

@node Aliases to other concrete types,Aliases to container ABCs in collections abc,Aliases to types in collections,Deprecated aliases
@anchor{library/typing aliases-to-other-concrete-types}@anchor{4569}@anchor{library/typing other-concrete-types}@anchor{456a}
@subsubsection Aliases to other concrete types


@geindex Pattern (typing 클래스)
@geindex Match (typing 클래스)
@anchor{library/typing typing Pattern}@anchor{934}
@deffn {클래스} typing.Pattern
@anchor{library/typing typing Match}@anchor{456b}
@deffnx {클래스} typing.Match

Deprecated aliases corresponding to the return types from
@ref{dcd,,re.compile()} and @ref{1432,,re.match()}.

These types (and the corresponding functions) are generic over
@ref{5ab,,AnyStr}. @code{Pattern} can be specialised as @code{Pattern[str]} or
@code{Pattern[bytes]}; @code{Match} can be specialised as @code{Match[str]} or
@code{Match[bytes]}.


버전 3.9부터 폐지됨: @ref{be,,re}의 클래스 @code{Pattern}과 @code{Match}는 이제 @code{[]}를 지원합니다. 
@geindex Python 향상 제안; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/}와 @ref{8c0,,제네릭 에일리어스 형}을 참조하십시오.

@end deffn

@geindex Text (typing 클래스)
@anchor{library/typing typing Text}@anchor{360}
@deffn {클래스} typing.Text

Deprecated alias for @ref{169,,str}.

@code{Text} is provided to supply a forward
compatible path for Python 2 code: in Python 2, @code{Text} is an alias for
@code{unicode}.

@code{Text}를 사용하여 값이 파이썬 2와 파이썬 3 모두와 호환되는 방식으로 유니코드 문자열을 포함해야 함을 나타내십시오:

@example
def add_unicode_checkmark(text: Text) -> Text:
    return text + u' \u2713'
@end example


Added in version 3.5.2.



버전 3.11부터 폐지됨: Python 2 is no longer supported, and most type checkers also no longer
support type checking Python 2 code. Removal of the alias is not
currently planned, but users are encouraged to use
@ref{169,,str} instead of @code{Text}.

@end deffn
@anchor{library/typing abstract-base-classes}@anchor{456c}
@node Aliases to container ABCs in collections abc,Aliases to asynchronous ABCs in collections abc,Aliases to other concrete types,Deprecated aliases
@anchor{library/typing aliases-to-container-abcs-in-collections-abc}@anchor{456d}@anchor{library/typing corresponding-to-collections-in-collections-abc}@anchor{456e}
@subsubsection Aliases to container ABCs in @code{collections.abc}


@geindex AbstractSet (typing 클래스)
@anchor{library/typing typing AbstractSet}@anchor{456f}
@deffn {클래스} typing.AbstractSet (Collection[T_co])

Deprecated alias to @ref{26ac,,collections.abc.Set}.


버전 3.9부터 폐지됨: @ref{26ac,,collections.abc.Set} now supports subscripting (@code{[]}).
See 
@geindex Python 향상 제안; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/} and @ref{8c0,,제네릭 에일리어스 형}.

@end deffn

@geindex ByteString (typing 클래스)
@anchor{library/typing typing ByteString}@anchor{345}
@deffn {클래스} typing.ByteString (Sequence[int])

Deprecated alias to @ref{342,,collections.abc.ByteString}.

Use @code{isinstance(obj, collections.abc.Buffer)} to test if @code{obj}
implements the @ref{260,,buffer protocol} at runtime. For use in
type annotations, either use @ref{343,,Buffer} or a union
that explicitly specifies the types your code supports (e.g.,
@code{bytes | bytearray | memoryview}).

@code{ByteString} was originally intended to be an abstract class that
would serve as a supertype of both @ref{192,,bytes} and @ref{344,,bytearray}.
However, since the ABC never had any methods, knowing that an object was an
instance of @code{ByteString} never actually told you anything useful
about the object. Other common buffer types such as @ref{165,,memoryview} were
also never understood as subtypes of @code{ByteString} (either at runtime
or by static type checkers).

See 
@geindex Python 향상 제안; PEP 688#current-options
PEP 688@footnote{https://peps.python.org/pep-0688/#current-options} for more details.


Deprecated since version 3.9, will be removed in version 3.17.

@end deffn

@geindex Collection (typing 클래스)
@anchor{library/typing typing Collection}@anchor{eee}
@deffn {클래스} typing.Collection (Sized, Iterable[T_co], Container[T_co])

Deprecated alias to @ref{e83,,collections.abc.Collection}.


Added in version 3.6.



버전 3.9부터 폐지됨: @ref{e83,,collections.abc.Collection} now supports subscripting (@code{[]}).
See 
@geindex Python 향상 제안; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/} and @ref{8c0,,제네릭 에일리어스 형}.

@end deffn

@geindex Container (typing 클래스)
@anchor{library/typing typing Container}@anchor{4570}
@deffn {클래스} typing.Container (Generic[T_co])

Deprecated alias to @ref{26b6,,collections.abc.Container}.


버전 3.9부터 폐지됨: @ref{26b6,,collections.abc.Container} now supports subscripting (@code{[]}).
See 
@geindex Python 향상 제안; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/} and @ref{8c0,,제네릭 에일리어스 형}.

@end deffn

@geindex ItemsView (typing 클래스)
@anchor{library/typing typing ItemsView}@anchor{4571}
@deffn {클래스} typing.ItemsView (MappingView, AbstractSet[tuple[KT_co, VT_co]])

Deprecated alias to @ref{26ba,,collections.abc.ItemsView}.


버전 3.9부터 폐지됨: @ref{26ba,,collections.abc.ItemsView} now supports subscripting (@code{[]}).
See 
@geindex Python 향상 제안; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/} and @ref{8c0,,제네릭 에일리어스 형}.

@end deffn

@geindex KeysView (typing 클래스)
@anchor{library/typing typing KeysView}@anchor{4572}
@deffn {클래스} typing.KeysView (MappingView, AbstractSet[KT_co])

Deprecated alias to @ref{26b9,,collections.abc.KeysView}.


버전 3.9부터 폐지됨: @ref{26b9,,collections.abc.KeysView} now supports subscripting (@code{[]}).
See 
@geindex Python 향상 제안; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/} and @ref{8c0,,제네릭 에일리어스 형}.

@end deffn

@geindex Mapping (typing 클래스)
@anchor{library/typing typing Mapping}@anchor{4573}
@deffn {클래스} typing.Mapping (Collection[KT], Generic[KT, VT_co])

Deprecated alias to @ref{ac7,,collections.abc.Mapping}.


버전 3.9부터 폐지됨: @ref{ac7,,collections.abc.Mapping} now supports subscripting (@code{[]}).
See 
@geindex Python 향상 제안; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/} and @ref{8c0,,제네릭 에일리어스 형}.

@end deffn

@geindex MappingView (typing 클래스)
@anchor{library/typing typing MappingView}@anchor{4574}
@deffn {클래스} typing.MappingView (Sized)

Deprecated alias to @ref{26b8,,collections.abc.MappingView}.


버전 3.9부터 폐지됨: @ref{26b8,,collections.abc.MappingView} now supports subscripting (@code{[]}).
See 
@geindex Python 향상 제안; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/} and @ref{8c0,,제네릭 에일리어스 형}.

@end deffn

@geindex MutableMapping (typing 클래스)
@anchor{library/typing typing MutableMapping}@anchor{4575}
@deffn {클래스} typing.MutableMapping (Mapping[KT, VT])

Deprecated alias to @ref{12b1,,collections.abc.MutableMapping}.


버전 3.9부터 폐지됨: @ref{12b1,,collections.abc.MutableMapping}
now supports subscripting (@code{[]}).
See 
@geindex Python 향상 제안; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/} and @ref{8c0,,제네릭 에일리어스 형}.

@end deffn

@geindex MutableSequence (typing 클래스)
@anchor{library/typing typing MutableSequence}@anchor{4576}
@deffn {클래스} typing.MutableSequence (Sequence[T])

Deprecated alias to @ref{4c1,,collections.abc.MutableSequence}.


버전 3.9부터 폐지됨: @ref{4c1,,collections.abc.MutableSequence}
now supports subscripting (@code{[]}).
See 
@geindex Python 향상 제안; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/} and @ref{8c0,,제네릭 에일리어스 형}.

@end deffn

@geindex MutableSet (typing 클래스)
@anchor{library/typing typing MutableSet}@anchor{4577}
@deffn {클래스} typing.MutableSet (AbstractSet[T])

Deprecated alias to @ref{26b7,,collections.abc.MutableSet}.


버전 3.9부터 폐지됨: @ref{26b7,,collections.abc.MutableSet} now supports subscripting (@code{[]}).
See 
@geindex Python 향상 제안; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/} and @ref{8c0,,제네릭 에일리어스 형}.

@end deffn

@geindex Sequence (typing 클래스)
@anchor{library/typing typing Sequence}@anchor{4578}
@deffn {클래스} typing.Sequence (Reversible[T_co], Collection[T_co])

Deprecated alias to @ref{13c9,,collections.abc.Sequence}.


버전 3.9부터 폐지됨: @ref{13c9,,collections.abc.Sequence} now supports subscripting (@code{[]}).
See 
@geindex Python 향상 제안; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/} and @ref{8c0,,제네릭 에일리어스 형}.

@end deffn

@geindex ValuesView (typing 클래스)
@anchor{library/typing typing ValuesView}@anchor{4579}
@deffn {클래스} typing.ValuesView (MappingView, Collection[_VT_co])

Deprecated alias to @ref{26bb,,collections.abc.ValuesView}.


버전 3.9부터 폐지됨: @ref{26bb,,collections.abc.ValuesView} now supports subscripting (@code{[]}).
See 
@geindex Python 향상 제안; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/} and @ref{8c0,,제네릭 에일리어스 형}.

@end deffn

@node Aliases to asynchronous ABCs in collections abc,Aliases to other ABCs in collections abc,Aliases to container ABCs in collections abc,Deprecated aliases
@anchor{library/typing aliases-to-asynchronous-abcs-in-collections-abc}@anchor{457a}@anchor{library/typing asynchronous-programming}@anchor{457b}
@subsubsection Aliases to asynchronous ABCs in @code{collections.abc}


@geindex Coroutine (typing 클래스)
@anchor{library/typing typing Coroutine}@anchor{1d2e}
@deffn {클래스} typing.Coroutine (Awaitable[ReturnType], Generic[YieldType, SendType, ReturnType])

Deprecated alias to @ref{fdc,,collections.abc.Coroutine}.

See @ref{29bf,,Annotating generators and coroutines}
for details on using @ref{fdc,,collections.abc.Coroutine}
and @code{typing.Coroutine} in type annotations.


Added in version 3.5.3.



버전 3.9부터 폐지됨: @ref{fdc,,collections.abc.Coroutine} now supports subscripting (@code{[]}).
See 
@geindex Python 향상 제안; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/} and @ref{8c0,,제네릭 에일리어스 형}.

@end deffn

@geindex AsyncGenerator (typing 클래스)
@anchor{library/typing typing AsyncGenerator}@anchor{19a4}
@deffn {클래스} typing.AsyncGenerator (AsyncIterator[YieldType], Generic[YieldType, SendType])

Deprecated alias to @ref{e86,,collections.abc.AsyncGenerator}.

See @ref{29bf,,Annotating generators and coroutines}
for details on using @ref{e86,,collections.abc.AsyncGenerator}
and @code{typing.AsyncGenerator} in type annotations.


Added in version 3.6.1.



버전 3.9부터 폐지됨: @ref{e86,,collections.abc.AsyncGenerator}
now supports subscripting (@code{[]}).
See 
@geindex Python 향상 제안; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/} and @ref{8c0,,제네릭 에일리어스 형}.



버전 3.13에서 변경: The @code{SendType} parameter now has a default.

@end deffn

@geindex AsyncIterable (typing 클래스)
@anchor{library/typing typing AsyncIterable}@anchor{457c}
@deffn {클래스} typing.AsyncIterable (Generic[T_co])

Deprecated alias to @ref{fde,,collections.abc.AsyncIterable}.


Added in version 3.5.2.



버전 3.9부터 폐지됨: @ref{fde,,collections.abc.AsyncIterable} now supports subscripting (@code{[]}).
See 
@geindex Python 향상 제안; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/} and @ref{8c0,,제네릭 에일리어스 형}.

@end deffn

@geindex AsyncIterator (typing 클래스)
@anchor{library/typing typing AsyncIterator}@anchor{457d}
@deffn {클래스} typing.AsyncIterator (AsyncIterable[T_co])

Deprecated alias to @ref{fdd,,collections.abc.AsyncIterator}.


Added in version 3.5.2.



버전 3.9부터 폐지됨: @ref{fdd,,collections.abc.AsyncIterator} now supports subscripting (@code{[]}).
See 
@geindex Python 향상 제안; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/} and @ref{8c0,,제네릭 에일리어스 형}.

@end deffn

@geindex Awaitable (typing 클래스)
@anchor{library/typing typing Awaitable}@anchor{457e}
@deffn {클래스} typing.Awaitable (Generic[T_co])

Deprecated alias to @ref{fdb,,collections.abc.Awaitable}.


Added in version 3.5.2.



버전 3.9부터 폐지됨: @ref{fdb,,collections.abc.Awaitable} now supports subscripting (@code{[]}).
See 
@geindex Python 향상 제안; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/} and @ref{8c0,,제네릭 에일리어스 형}.

@end deffn

@node Aliases to other ABCs in collections abc,Aliases to contextlib ABCs,Aliases to asynchronous ABCs in collections abc,Deprecated aliases
@anchor{library/typing aliases-to-other-abcs-in-collections-abc}@anchor{457f}@anchor{library/typing corresponding-to-other-types-in-collections-abc}@anchor{4580}
@subsubsection Aliases to other ABCs in @code{collections.abc}


@geindex Iterable (typing 클래스)
@anchor{library/typing typing Iterable}@anchor{4581}
@deffn {클래스} typing.Iterable (Generic[T_co])

Deprecated alias to @ref{26b4,,collections.abc.Iterable}.


버전 3.9부터 폐지됨: @ref{26b4,,collections.abc.Iterable} now supports subscripting (@code{[]}).
See 
@geindex Python 향상 제안; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/} and @ref{8c0,,제네릭 에일리어스 형}.

@end deffn

@geindex Iterator (typing 클래스)
@anchor{library/typing typing Iterator}@anchor{4582}
@deffn {클래스} typing.Iterator (Iterable[T_co])

Deprecated alias to @ref{26b5,,collections.abc.Iterator}.


버전 3.9부터 폐지됨: @ref{26b5,,collections.abc.Iterator} now supports subscripting (@code{[]}).
See 
@geindex Python 향상 제안; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/} and @ref{8c0,,제네릭 에일리어스 형}.

@end deffn

@geindex Callable (typing 모듈)
@anchor{library/typing typing Callable}@anchor{9c8}
@deffn {데이터} typing.Callable

Deprecated alias to @ref{9eb,,collections.abc.Callable}.

See @ref{26d5,,Annotating callable objects} for details on how to use
@ref{9eb,,collections.abc.Callable} and @code{typing.Callable} in type annotations.


버전 3.9부터 폐지됨: @ref{9eb,,collections.abc.Callable} now supports subscripting (@code{[]}).
See 
@geindex Python 향상 제안; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/} and @ref{8c0,,제네릭 에일리어스 형}.



버전 3.10에서 변경: @code{Callable} now supports @ref{488,,ParamSpec} and @ref{9c7,,Concatenate}.
See 
@geindex Python 향상 제안; PEP 612
PEP 612@footnote{https://peps.python.org/pep-0612/} for more details.

@end deffn

@geindex Generator (typing 클래스)
@anchor{library/typing typing Generator}@anchor{19a3}
@deffn {클래스} typing.Generator (Iterator[YieldType], Generic[YieldType, SendType, ReturnType])

Deprecated alias to @ref{fda,,collections.abc.Generator}.

See @ref{29bf,,Annotating generators and coroutines}
for details on using @ref{fda,,collections.abc.Generator}
and @code{typing.Generator} in type annotations.


버전 3.9부터 폐지됨: @ref{fda,,collections.abc.Generator} now supports subscripting (@code{[]}).
See 
@geindex Python 향상 제안; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/} and @ref{8c0,,제네릭 에일리어스 형}.



버전 3.13에서 변경: Default values for the send and return types were added.

@end deffn

@geindex Hashable (typing 클래스)
@anchor{library/typing typing Hashable}@anchor{716}
@deffn {클래스} typing.Hashable

Deprecated alias to @ref{718,,collections.abc.Hashable}.


버전 3.12부터 폐지됨: Use @ref{718,,collections.abc.Hashable} directly instead.

@end deffn

@geindex Reversible (typing 클래스)
@anchor{library/typing typing Reversible}@anchor{4583}
@deffn {클래스} typing.Reversible (Iterable[T_co])

Deprecated alias to @ref{e84,,collections.abc.Reversible}.


버전 3.9부터 폐지됨: @ref{e84,,collections.abc.Reversible} now supports subscripting (@code{[]}).
See 
@geindex Python 향상 제안; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/} and @ref{8c0,,제네릭 에일리어스 형}.

@end deffn

@geindex Sized (typing 클래스)
@anchor{library/typing typing Sized}@anchor{717}
@deffn {클래스} typing.Sized

Deprecated alias to @ref{719,,collections.abc.Sized}.


버전 3.12부터 폐지됨: Use @ref{719,,collections.abc.Sized} directly instead.

@end deffn

@node Aliases to contextlib ABCs,,Aliases to other ABCs in collections abc,Deprecated aliases
@anchor{library/typing aliases-to-contextlib-abcs}@anchor{4584}@anchor{library/typing context-manager-types}@anchor{4585}
@subsubsection Aliases to @code{contextlib} ABCs


@geindex ContextManager (typing 클래스)
@anchor{library/typing typing ContextManager}@anchor{e8a}
@deffn {클래스} typing.ContextManager (Generic[T_co, ExitT_co])

Deprecated alias to @ref{e89,,contextlib.AbstractContextManager}.

The first type parameter, @code{T_co}, represents the type returned by
the @ref{7e3,,__enter__()} method. The optional second type parameter, @code{ExitT_co},
which defaults to @code{bool | None}, represents the type returned by the
@ref{1505,,__exit__()} method.


Added in version 3.5.4.



버전 3.9부터 폐지됨: @ref{e89,,contextlib.AbstractContextManager}
now supports subscripting (@code{[]}).
See 
@geindex Python 향상 제안; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/} and @ref{8c0,,제네릭 에일리어스 형}.



버전 3.13에서 변경: Added the optional second type parameter, @code{ExitT_co}.

@end deffn

@geindex AsyncContextManager (typing 클래스)
@anchor{library/typing typing AsyncContextManager}@anchor{19a1}
@deffn {클래스} typing.AsyncContextManager (Generic[T_co, AExitT_co])

Deprecated alias to @ref{d1f,,contextlib.AbstractAsyncContextManager}.

The first type parameter, @code{T_co}, represents the type returned by
the @ref{241e,,__aenter__()} method. The optional second type parameter, @code{AExitT_co},
which defaults to @code{bool | None}, represents the type returned by the
@ref{19a2,,__aexit__()} method.


Added in version 3.6.2.



버전 3.9부터 폐지됨: @ref{d1f,,contextlib.AbstractAsyncContextManager}
now supports subscripting (@code{[]}).
See 
@geindex Python 향상 제안; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/} and @ref{8c0,,제네릭 에일리어스 형}.



버전 3.13에서 변경: Added the optional second type parameter, @code{AExitT_co}.

@end deffn

@node Deprecation Timeline of Major Features,,모듈 내용<6>,typing — Support for type hints
@anchor{library/typing deprecation-timeline-of-major-features}@anchor{4586}
@subsubsection Deprecation Timeline of Major Features


Certain features in @code{typing} are deprecated and may be removed in a future
version of Python. The following table summarizes major deprecations for your
convenience. This is subject to change, and not all deprecations are listed.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Feature

@tab

Deprecated in

@tab

Projected removal

@tab

PEP/issue

@item

@code{typing} versions of standard collections

@tab

3.9

@tab

Undecided (see @ref{4559,,Deprecated aliases} for more information)

@tab

@geindex Python 향상 제안; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/}

@item

@ref{345,,typing.ByteString}

@tab

3.9

@tab

3.17

@tab

gh-91896@footnote{https://github.com/python/cpython/issues/91896}

@item

@ref{360,,typing.Text}

@tab

3.11

@tab

Undecided

@tab

gh-92332@footnote{https://github.com/python/cpython/issues/92332}

@item

@ref{716,,typing.Hashable} and @ref{717,,typing.Sized}

@tab

3.12

@tab

Undecided

@tab

gh-94309@footnote{https://github.com/python/cpython/issues/94309}

@item

@ref{9cc,,typing.TypeAlias}

@tab

3.12

@tab

Undecided

@tab

@geindex Python 향상 제안; PEP 695
PEP 695@footnote{https://peps.python.org/pep-0695/}

@item

@ref{333,,@@typing.no_type_check_decorator}

@tab

3.13

@tab

3.15

@tab

gh-106309@footnote{https://github.com/python/cpython/issues/106309}

@item

@ref{5ab,,typing.AnyStr}

@tab

3.13

@tab

3.18

@tab

gh-105578@footnote{https://github.com/python/cpython/issues/105578}

@end multitable


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node pydoc — 설명서 생성과 온라인 도움말 시스템,파이썬 개발 모드,typing — Support for type hints,개발 도구
@anchor{library/pydoc doc}@anchor{4587}@anchor{library/pydoc module-pydoc}@anchor{ba}@anchor{library/pydoc pydoc-documentation-generator-and-online-help-system}@anchor{4588}@anchor{library/pydoc translation-repo}@anchor{4589}
@subsection @code{pydoc} — 설명서 생성과 온라인 도움말 시스템


@geindex module; pydoc

`소스 코드:' Lib/pydoc.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/pydoc.py}

@geindex 문서화;생성
@geindex 문서화;온라인
@geindex 도움말;온라인


__________________________________________________________________


@code{pydoc} 모듈은 파이썬 모듈로부터 자동으로 설명서를 생성합니다. 설명서는 콘솔에 텍스트 페이지로 표시하거나, 웹 브라우저로 제공하거나, HTML 파일에 저장할 수 있습니다.

모듈, 클래스, 함수 및 메서드의 경우, 표시된 설명서는 객체와 재귀적으로 그것의 설명 가능한 멤버들의 독스트링(즉, @ref{b21,,__doc__} 어트리뷰트)에서 파생됩니다. 독스트링이 없으면, @code{pydoc}은 소스 파일의 클래스, 함수 또는 메서드의 정의 바로 위나 모듈의 맨 위에 있는 주석 줄 블록에서 설명을 얻으려고 합니다 (@ref{1939,,inspect.getcomments()}를 참조하십시오).

내장 함수 @ref{ad4,,help()}는 대화형 인터프리터에서 온라인 도움말 시스템을 호출합니다. 이 시스템은 @code{pydoc}을 사용하여 설명서를 콘솔에 텍스트로 생성합니다. 같은 텍스트 설명서는 운영 체제의 명령 프롬프트에서 @code{pydoc}을 스크립트로 실행하여 파이썬 인터프리터 외부에서도 볼 수 있습니다. 예를 들어,

@example
python -m pydoc sys
@end example

를 셸 프롬프트에서 실행하면, @ref{df,,sys} 모듈의 설명서를 유닉스 @code{man} 명령으로 표시되는 매뉴얼 페이지와 비슷한 스타일로 표시합니다. @code{pydoc}의 인자는 함수, 모듈 또는 패키지의 이름이거나 모듈이나 패키지의 모듈 내의 클래스, 메서드 또는 함수에 대한 점으로 구분된 참조일 수 있습니다. @code{pydoc}에 대한 인자가 경로처럼 보이고 (즉, 유닉스의 슬래시와 같이 운영 체제의 경로 구분 기호가 포함되어 있으면), 기존 파이썬 소스 파일을 가리키면, 해당 파일에 대한 설명서가 생성됩니다.

@cartouche
@quotation 참고 
객체와 그들의 설명을 찾기 위해, @code{pydoc}은 설명할 모듈을 임포트 합니다. 따라서, 모듈 수준의 모든 코드는 이때 실행됩니다. 파일이 임포트될 때가 아니라 스크립트로 호출할 때만 실행되도록 코드를 보호하려면 @code{if __name__ == '__main__':}를 사용하십시오.
@end quotation
@end cartouche

출력을 콘솔에 인쇄할 때, @code{pydoc}은 읽기 쉽도록 출력을 페이지로 나누려고 합니다. 
@geindex MANPAGER
@geindex 환경 변수; MANPAGER
@code{MANPAGER}나 
@geindex PAGER
@geindex 환경 변수; PAGER
@code{PAGER} 환경 변수가 설정되면, @code{pydoc}은 그 값을 페이지 매김 프로그램으로 사용합니다. 둘 다 설정되면 
@geindex MANPAGER
@geindex 환경 변수; MANPAGER
@code{MANPAGER}가 사용됩니다.

인자 앞에 @code{-w} 플래그를 지정하면 콘솔에 텍스트를 표시하는 대신, HTML 설명서가 현재 디렉터리에 파일로 기록됩니다.

인자 앞에 @code{-k} 플래그를 지정하면 인자로 주어진 키워드에 대해 사용 가능한 모든 모듈의 개요 행을 검색할 수 있습니다. 역시 유닉스 @code{man} 명령과 유사한 방식입니다. 모듈의 개요 행은 설명서 문자열의 첫 행입니다.

@code{pydoc}을 사용하여 방문하는 웹 브라우저에 설명서를 제공하는 HTTP 서버를 로컬 시스템에서 시작할 수도 있습니다. @code{python -m pydoc -p 1234}는 포트 1234에서 HTTP 서버를 시작해서, 여러분이 선호하는 웹 브라우저에서 @code{http://localhost:1234/}의 설명서를 볼 수 있도록 합니다. 포트 번호로 @code{0}을 지정하면 사용되지 않는 임의의 포트가 선택됩니다.

@code{python -m pydoc -n <hostname>}은 주어진 호스트 이름에서 리스닝하는 서버를 시작합니다. 기본적으로 호스트 이름은 ‘localhost’ 이지만 다른 컴퓨터에서 서버에 도달하도록 하고 싶으면 서버가 응답하는 호스트 이름을 변경해야 할 수 있습니다. 개발 중에 컨테이너 내에서 pydoc을 실행하려는 경우 특히 유용합니다.

@code{python -m pydoc -b}는 서버를 시작하고 모듈 색인 페이지로 웹 브라우저를 추가로 엽니다. 제공되는 각 페이지에는 상단에 탐색 바가 있어, 개별 항목에 대한 도움말을 `조회(Get)'하고, 개요 행에 키워드가 있는 모든 모듈을 `검색(Search)'하고, `모듈 색인(Module index)', `주제(Topics)' 및 `키워드(Keywords)' 페이지로 이동할 수 있습니다.

@code{pydoc}이 설명서를 생성할 때, 현재 환경과 경로를 사용하여 모듈을 찾습니다. 따라서, @code{pydoc spam}을 호출하면 정확히 파이썬 인터프리터를 시작하고 @code{import spam}을 입력할 때 얻는 모듈의 버전을 설명합니다.

코어 모듈에 대한 모듈 설명은 @code{https://docs.python.org/X.Y/library/}에 있다고 가정합니다. 여기서 @code{X}와 @code{Y}는 파이썬 인터프리터의 주 버전 번호와 부 버전 번호입니다. 이는 @code{PYTHONDOCS} 환경 변수를 다른 URL로 설정하거나 라이브러리 레퍼런스 매뉴얼 페이지가 있는 로컬 디렉터리로 설정하여 재정의할 수 있습니다.


버전 3.2에서 변경: @code{-b} 옵션이 추가되었습니다.



버전 3.3에서 변경: @code{-g} 명령 줄 옵션이 제거되었습니다.



버전 3.4에서 변경: 이제 @code{pydoc}은 @ref{940,,inspect.getfullargspec()} 대신 @ref{22f,,inspect.signature()}를 사용하여 콜러블에서 서명 정보를 추출합니다.



버전 3.7에서 변경: @code{-n} 옵션이 추가되었습니다.


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 파이썬 개발 모드,doctest — 대화형 파이썬 예제 테스트,pydoc — 설명서 생성과 온라인 도움말 시스템,개발 도구
@anchor{library/devmode doc}@anchor{458a}@anchor{library/devmode devmode}@anchor{507}@anchor{library/devmode python-development-mode}@anchor{458b}@anchor{library/devmode translation-repo}@anchor{458c}
@subsection 파이썬 개발 모드



Added in version 3.7.


파이썬 개발 모드에는 기본적으로 활성화하기에 너무 비싼 추가 실행 시간 검사를 도입합니다. 코드가 올바르면 기본값보다 더 상세하지(verbose) 않아야 합니다; 새로운 경고는 문제가 감지될 때만 발생합니다.

@ref{16f,,-X dev} 명령 줄 옵션을 사용하거나 
@geindex PYTHONDEVMODE
@geindex 환경 변수; PYTHONDEVMODE
@ref{ce6,,PYTHONDEVMODE} 환경 변수를 @code{1}로 설정하여 활성화할 수 있습니다.

See also @ref{508,,Python debug build}.

@menu
* 파이썬 개발 모드의 효과:: 
* ResourceWarning 예:: 
* 잘못된 파일 기술자 에러 예:: 

@end menu

@node 파이썬 개발 모드의 효과,ResourceWarning 예,,파이썬 개발 모드
@anchor{library/devmode effects-of-the-python-development-mode}@anchor{458d}
@subsubsection 파이썬 개발 모드의 효과


파이썬 개발 모드를 활성화하는 것은 다음 명령과 유사하지만, 아래에 설명된 추가 효과가 있습니다:

@example
PYTHONMALLOC=debug PYTHONASYNCIODEBUG=1 python -W default -X faulthandler
@end example

파이썬 개발 모드의 효과:


@itemize *

@item 
@code{default} @ref{2127,,경고 필터}를 추가합니다. 다음과 같은 경고가 표시됩니다:


@itemize *

@item 
@ref{1a3,,DeprecationWarning}

@item 
@ref{71d,,ImportWarning}

@item 
@ref{ac6,,PendingDeprecationWarning}

@item 
@ref{54e,,ResourceWarning}
@end itemize

일반적으로, 위의 경고는 기본 @ref{2127,,경고 필터}가 필터링합니다.

@ref{ac5,,-W default} 명령 줄 옵션이 사용된 것처럼 작동합니다.

경고를 에러로 처리하려면 @ref{ac5,,-W error} 명령 줄 옵션을 사용하거나 
@geindex PYTHONWARNINGS
@geindex 환경 변수; PYTHONWARNINGS
@ref{da2,,PYTHONWARNINGS} 환경 변수를 @code{error}로 설정하십시오.

@item 
메모리 할당자에 디버그 훅을 설치하여 다음을 확인합니다:


@itemize *

@item 
버퍼 언더플로

@item 
버퍼 오버플로

@item 
메모리 할당자 API 위반

@item 
GIL의 안전하지 않은 사용
@end itemize

@ref{e63,,PyMem_SetupDebugHooks()} C 함수를 참조하십시오.

@geindex PYTHONMALLOC
@geindex 환경 변수; PYTHONMALLOC
@ref{e5d,,PYTHONMALLOC} 환경 변수가 @code{debug}로 설정된 것처럼 동작합니다.

메모리 할당자에 디버그 훅을 설치하지 않고 파이썬 개발 모드를 사용하려면, 
@geindex PYTHONMALLOC
@geindex 환경 변수; PYTHONMALLOC
@ref{e5d,,PYTHONMALLOC} 환경 변수를 @code{default}로 설정하십시오.

@item 
파이썬 시작 시 @ref{20f,,faulthandler.enable()}을 호출하여 @ref{127f,,SIGSEGV}, @ref{1280,,SIGFPE}, @ref{1281,,SIGABRT}, @ref{1282,,SIGBUS} 및 @ref{1283,,SIGILL} 시그널에 대한 처리기를 설치하여 충돌 시 파이썬 트레이스백을 덤프합니다.

@ref{16f,,-X faulthandler} 명령 줄 옵션이 사용되거나 
@geindex PYTHONFAULTHANDLER
@geindex 환경 변수; PYTHONFAULTHANDLER
@ref{1284,,PYTHONFAULTHANDLER} 환경 변수가 @code{1}로 설정된 것처럼 작동합니다.

@item 
@ref{2137,,asyncio 디버그 모드}를 활성화합니다. 예를 들어, @ref{b,,asyncio}는 어웨이트 하지 않은 코루틴을 확인하고 이를 로그 합니다.

@geindex PYTHONASYNCIODEBUG
@geindex 환경 변수; PYTHONASYNCIODEBUG
@ref{2136,,PYTHONASYNCIODEBUG} 환경 변수가 @code{1}로 설정된 것처럼 동작합니다.

@item 
문자열 인코딩과 디코딩 연산에 대해 `encoding'과 `errors' 인자를 확인합니다. 예: @ref{316,,open()}, @ref{ad2,,str.encode()} 및 @ref{ad3,,bytes.decode()}.

기본적으로, 최상의 성능을 위해, `errors' 인자는 첫 번째 인코딩/디코딩 에러에서만 검사되며 빈 문자열에 대해서는 `encoding' 인자가 무시되는 경우가 있습니다.

@item 
@ref{504,,io.IOBase} 파괴자는 @code{close()} 예외를 로그 합니다.

@item 
@ref{89b,,sys.flags}의 @ref{1e7e,,dev_mode} 어트리뷰트를 @code{True}로 설정합니다.
@end itemize

파이썬 개발 모드는 (성능과 메모리에 대한) 오버헤드 비용이 너무 비싸서, 기본적으로 @ref{105,,tracemalloc} 모듈을 활성화하지 않습니다. @code{tracemalloc} 모듈을 활성화하면 일부 에러의 원인에 대한 추가 정보가 제공됩니다. 예를 들어, @ref{54e,,ResourceWarning}은 자원이 할당된 곳의 트레이스백을 로그하고, 버퍼 오버플로 에러는 메모리 블록이 할당된 곳의 트레이스백을 로그 합니다.

파이썬 개발 모드는 @ref{18c,,-O} 명령 줄 옵션이 @ref{b60,,assert} 문을 제거하거나 @ref{9da,,__debug__}를 @code{False}로 설정하는 것을 막지 않습니다.

The Python Development Mode can only be enabled at the Python startup. Its
value can be read from @ref{89b,,sys.flags.dev_mode}.


버전 3.8에서 변경: @ref{504,,io.IOBase} 파괴자는 이제 @code{close()} 예외를 로그 합니다.



버전 3.9에서 변경: `encoding'과 `errors' 인자는 이제 문자열 인코딩과 디코딩 연산을 검사합니다.


@node ResourceWarning 예,잘못된 파일 기술자 에러 예,파이썬 개발 모드의 효과,파이썬 개발 모드
@anchor{library/devmode resourcewarning-example}@anchor{458e}
@subsubsection ResourceWarning 예


명령 줄에 지정된 텍스트 파일의 줄 수를 세는 스크립트의 예:

@example
import sys

def main():
    fp = open(sys.argv[1])
    nlines = len(fp.readlines())
    print(nlines)
    # 파일이 묵시적으로 닫힙니다

if __name__ == "__main__":
    main()
@end example

스크립트는 파일을 명시적으로 닫지 않습니다. 기본적으로, 파이썬은 아무런 경고도 하지 않습니다. 269 줄이 있는 README.txt를 사용하는 예:

@example
$ python script.py README.txt
269
@end example

파이썬 개발 모드를 사용하면 @ref{54e,,ResourceWarning} 경고가 표시됩니다:

@example
$ python -X dev script.py README.txt
269
script.py:10: ResourceWarning: unclosed file <_io.TextIOWrapper name='README.rst' mode='r' encoding='UTF-8'>
  main()
ResourceWarning: Enable tracemalloc to get the object allocation traceback
@end example

또한, @ref{105,,tracemalloc}을 활성화하면 파일이 열린 줄이 표시됩니다:

@example
$ python -X dev -X tracemalloc=5 script.py README.rst
269
script.py:10: ResourceWarning: unclosed file <_io.TextIOWrapper name='README.rst' mode='r' encoding='UTF-8'>
  main()
Object allocated at (most recent call last):
  File "script.py", lineno 10
    main()
  File "script.py", lineno 4
    fp = open(sys.argv[1])
@end example

수선은 파일을 명시적으로 닫는 것입니다. 컨텍스트 관리자를 사용하는 예:

@example
def main():
    # 블록에서 빠져나갈 때 파일을 명시적으로 닫습니다
    with open(sys.argv[1]) as fp:
        nlines = len(fp.readlines())
    print(nlines)
@end example

자원을 명시적으로 닫지 않으면 예상보다 오래 자원을 열어둘 수 있습니다; 파이썬을 종료할 때 심각한 문제가 발생할 수 있습니다. CPython에서도 나쁘지만, PyPy에서는 더 나쁩니다. 리소스를 명시적으로 닫으면 응용 프로그램을 더 결정적이고 안정적으로 만들 수 있습니다.

@node 잘못된 파일 기술자 에러 예,,ResourceWarning 예,파이썬 개발 모드
@anchor{library/devmode bad-file-descriptor-error-example}@anchor{458f}
@subsubsection 잘못된 파일 기술자 에러 예


자신의 첫 줄을 표시하는 스크립트:

@example
import os

def main():
    fp = open(__file__)
    firstline = fp.readline()
    print(firstline.rstrip())
    os.close(fp.fileno())
    # 파일이 묵시적으로 닫힙니다

main()
@end example

기본적으로, 파이썬은 아무런 경고도 하지 않습니다:

@example
$ python script.py
import os
@end example

파이썬 개발 모드는 @ref{54e,,ResourceWarning}을 표시하고 파일 객체를 파이널라이즈 할 때 “잘못된 파일 기술자(Bad file descriptor)” 에러를 로그 합니다:

@example
$ python -X dev script.py
import os
script.py:10: ResourceWarning: unclosed file <_io.TextIOWrapper name='script.py' mode='r' encoding='UTF-8'>
  main()
ResourceWarning: Enable tracemalloc to get the object allocation traceback
Exception ignored in: <_io.TextIOWrapper name='script.py' mode='r' encoding='UTF-8'>
Traceback (most recent call last):
  File "script.py", line 10, in <module>
    main()
OSError: [Errno 9] Bad file descriptor
@end example

@code{os.close(fp.fileno())}는 파일 기술자를 닫습니다. 파일 객체 파이널라이저가 파일 기술자를 다시 닫으려고 하면, @code{Bad file descriptor} 에러로 실패합니다. 파일 기술자는 한 번만 닫아야 합니다. 최악의 시나리오에서는, 두 번 닫을 때 충돌이 발생할 수 있습니다 (예는 bpo-18748@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=18748}을 참조하십시오).

수선은 @code{os.close(fp.fileno())} 줄을 제거하거나, @code{closefd=False}로 파일을 여는 것입니다.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node doctest — 대화형 파이썬 예제 테스트,unittest — 단위 테스트 프레임워크,파이썬 개발 모드,개발 도구
@anchor{library/doctest doc}@anchor{4590}@anchor{library/doctest doctest-test-interactive-python-examples}@anchor{4591}@anchor{library/doctest module-doctest}@anchor{3e}@anchor{library/doctest translation-repo}@anchor{4592}
@subsection @code{doctest} — 대화형 파이썬 예제 테스트


@geindex module; doctest

`소스 코드:' Lib/doctest.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/doctest.py}


__________________________________________________________________


The @code{doctest} module searches for pieces of text that look like interactive
Python sessions, and then executes those sessions to verify that they work
exactly as shown.  There are several common ways to use doctest:


@itemize *

@item 
모든 대화식 예제가 설명된 대로 작동하는지 확인하여 모듈의 독스트링이 최신인지 확인합니다.

@item 
테스트 파일이나 테스트 객체의 대화형 예제가 예상대로 작동하는지 확인하여 회귀 테스트를 수행합니다.

@item 
입/출력 예제를 그대로 보여줌으로써 패키지에 대한 자습서를 작성합니다. 예제나 설명문 중 어느 것이 강조되는지에 따라, “문학적 테스트(literate testing)”나 “실행 가능한 설명서(executable documentation)”의 느낌을 줍니다.
@end itemize

여기에 완전하지만 작은 예제 모듈이 있습니다:

@example
"""
이것은 "예제" 모듈입니다.

예제 모듈은 factorial() 함수 하나를 제공합니다. 예를 들어,

>>> factorial(5)
120
"""

def factorial(n):
    """n의 계승을 반환합니다, 정확한 정수 >= 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

    float의 계승도 좋습니다만, float는 정확한 정수여야 합니다:
    >>> factorial(30.1)
    Traceback (most recent call last):
        ...
    ValueError: n must be exact integer
    >>> factorial(30.0)
    265252859812191058636308480000000

    또한 터무니없이 크지 않아야 합니다:
    >>> 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:  # 1e300과 같은 값을 잡아냅니다
        raise OverflowError("n too large")
    result = 1
    factor = 2
    while factor <= n:
        result *= factor
        factor += 1
    return result


if __name__ == "__main__":
    import doctest
    doctest.testmod()
@end example

If you run @code{example.py} directly from the command line, @code{doctest}
works its magic:

@example
$ python example.py
$
@end example

There’s no output!  That’s normal, and it means all the examples worked.  Pass
@code{-v} to the script, and @code{doctest} prints a detailed log of what
it’s trying, and prints a summary at the end:

@example
$ python example.py -v
Trying:
    factorial(5)
Expecting:
    120
ok
Trying:
    [factorial(n) for n in range(6)]
Expecting:
    [1, 1, 2, 6, 24, 120]
ok
@end example

결국, 다음과 같이 끝납니다:

@example
Trying:
    factorial(1e100)
Expecting:
    Traceback (most recent call last):
        ...
    OverflowError: n too large
ok
2 items passed all tests:
   1 test in __main__
   6 tests in __main__.factorial
7 tests in 2 items.
7 passed.
Test passed.
$
@end example

That’s all you need to know to start making productive use of @code{doctest}!
Jump in.  The following sections provide full details.  Note that there are many
examples of doctests in the standard Python test suite and libraries.
Especially useful examples can be found in the standard test file
@code{Lib/test/test_doctest/test_doctest.py}.


Added in version 3.13: Output is colorized by default and can be
@ref{1b7,,controlled using environment variables}.


@menu
* 간단한 사용법; 독스트링에 있는 예제 확인하기: 간단한 사용법 독스트링에 있는 예제 확인하기. 
* 간단한 사용법; 텍스트 파일에 있는 예제 확인하기: 간단한 사용법 텍스트 파일에 있는 예제 확인하기. 
* 명령줄 사용법: 명령줄 사용법<2>. 
* 작동 방법:: 
* 기본 API:: 
* Unittest API:: 
* 고급 API:: 
* 디버깅:: 
* 맺음말: 맺음말<2>. 

@end menu

@node 간단한 사용법 독스트링에 있는 예제 확인하기,간단한 사용법 텍스트 파일에 있는 예제 확인하기,,doctest — 대화형 파이썬 예제 테스트
@anchor{library/doctest doctest-simple-testmod}@anchor{4593}@anchor{library/doctest simple-usage-checking-examples-in-docstrings}@anchor{4594}
@subsubsection 간단한 사용법: 독스트링에 있는 예제 확인하기


doctest를 사용하는 가장 간단한 방법은 (하지만 계속 이렇게 할 필요는 없습니다) 각 모듈 @code{M}을 다음과 같이 끝내는 것입니다:

@example
if __name__ == "__main__":
    import doctest
    doctest.testmod()
@end example

그러면 @code{doctest}는 모듈 @code{M}의 독스트링을 검사합니다.

모듈을 스크립트로 실행하면 독스트링의 예제가 실행되고 검증됩니다:

@example
python M.py
@end example

예제가 실패하지 않는 한 아무것도 표시되지 않습니다, 실패하면 실패한 예제와 실패 원인이 stdout으로 출력되고, 마지막 출력 줄은 @code{***Test Failed*** N failures.}입니다. 여기서 `N'은 실패한 예제의 수입니다.

대신 @code{-v} 스위치로 실행해 보십시오:

@example
python M.py -v
@end example

그러면 시도한 모든 예제에 대한 자세한 보고서가 표준 출력으로 출력되고, 끝에 정돈된 요약이 붙습니다.

You can force verbose mode by passing @code{verbose=True} to @ref{1672,,testmod()}, or
prohibit it by passing @code{verbose=False}.  In either of those cases,
@ref{1469,,sys.argv} is not examined by @code{testmod()} (so passing @code{-v} or not
has no effect).

@ref{1672,,testmod()}를 실행하는 명령줄 바로 가기도 있습니다, @ref{4595,,명령줄 사용법} 절을 참조하십시오.

@ref{1672,,testmod()}에 대한 자세한 내용은, @ref{4596,,기본 API} 절을 참조하십시오.

@node 간단한 사용법 텍스트 파일에 있는 예제 확인하기,명령줄 사용법<2>,간단한 사용법 독스트링에 있는 예제 확인하기,doctest — 대화형 파이썬 예제 테스트
@anchor{library/doctest doctest-simple-testfile}@anchor{4597}@anchor{library/doctest simple-usage-checking-examples-in-a-text-file}@anchor{4598}
@subsubsection 간단한 사용법: 텍스트 파일에 있는 예제 확인하기


doctest의 또 다른 간단한 활용은 텍스트 파일에 있는 대화형 예제를 테스트하는 것입니다. 이것은 @ref{4599,,testfile()} 함수로 수행할 수 있습니다:

@example
import doctest
doctest.testfile("example.txt")
@end example

이 짧은 스크립트는 @code{example.txt} 파일에 들어있는 대화형 파이썬 예제를 실행하고 검증합니다. 파일 내용은 하나의 거대한 독스트링인 것처럼 취급됩니다; 파일이 파이썬 프로그램일 필요가 없습니다! 예를 들어, @code{example.txt}에 다음과 같은 것이 들어있습니다:

@example
The `@w{`}example`@w{`} module
======================

Using `@w{`}factorial`@w{`}
-------------------

This is an example text file in reStructuredText format.  First import
`@w{`}factorial`@w{`} from the `@w{`}example`@w{`} module:

    >>> from example import factorial

Now use it:

    >>> factorial(6)
    120
@end example

@code{doctest.testfile("example.txt")}를 실행하면 이 문서에 있는 에러를 찾습니다:

@example
File "./example.txt", line 14, in example.txt
Failed example:
    factorial(6)
Expected:
    120
Got:
    720
@end example

As with @ref{1672,,testmod()}, @ref{4599,,testfile()} won’t display anything unless an
example fails.  If an example does fail, then the failing example(s) and the
cause(s) of the failure(s) are printed to stdout, using the same format as
@code{testmod()}.

기본적으로, @ref{4599,,testfile()}은 호출하는 모듈의 디렉터리에서 파일을 찾습니다. 다른 위치에서 파일을 찾도록 지시하는 데 사용할 수 있는 선택적 인자에 대한 설명은 @ref{4596,,기본 API} 절을 참조하십시오.

@ref{1672,,testmod()}와 마찬가지로, @ref{4599,,testfile()}의 상세도는 @code{-v} 명령 줄 스위치나 선택적 키워드 인자 `verbose'를 사용하여 설정할 수 있습니다.

@ref{4599,,testfile()}을 실행하는 명령줄 바로 가기도 있습니다, @ref{4595,,명령줄 사용법} 절을 참조하십시오.

@ref{4599,,testfile()}에 대한 자세한 내용은, @ref{4596,,기본 API} 절을 참조하십시오.

@node 명령줄 사용법<2>,작동 방법,간단한 사용법 텍스트 파일에 있는 예제 확인하기,doctest — 대화형 파이썬 예제 테스트
@anchor{library/doctest command-line-usage}@anchor{459a}@anchor{library/doctest doctest-cli}@anchor{4595}
@subsubsection 명령줄 사용법


The @code{doctest} module can be invoked as a script from the command line:

@example
python -m doctest [-v] [-o OPTION] [-f] file [file ...]
@end example

@geindex doctest 명령줄 옵션; -v
@geindex doctest 명령줄 옵션; --verbose
@anchor{library/doctest cmdoption-doctest-v}@anchor{459b}@anchor{library/doctest cmdoption-doctest-verbose}@anchor{459c}
@deffn {Option} @w{-}v, @w{-}@w{-}verbose

시도한 모든 예제에 대한 자세한 보고서가 표준 출력으로 출력되고, 끝에 정돈된 요약이 붙습니다:

@example
python -m doctest -v example.py
@end example

이렇게 하면 @code{example.py}를 독립 실행형 모듈로 임포트하고, @ref{1672,,testmod()}를 실행합니다. 파일이 패키지 일부이고 그 패키지에서 다른 서브 모듈을 임포트하면, 올바르게 작동하지 않을 수 있음에 유의하십시오.

파일 이름이 @code{.py}로 끝나지 않으면, @code{doctest}는 대신 @ref{4599,,testfile()}로 실행되어야 한다고 추론합니다:

@example
python -m doctest -v example.txt
@end example
@end deffn

@geindex doctest 명령줄 옵션; -o
@geindex doctest 명령줄 옵션; --option
@anchor{library/doctest cmdoption-doctest-o}@anchor{459d}@anchor{library/doctest cmdoption-doctest-option}@anchor{459e}
@deffn {Option} @w{-}o, @w{-}@w{-}option <option>

Option flags control various aspects of doctest’s behavior, see section
@ref{1132,,옵션 플래그}.


Added in version 3.4.

@end deffn

@geindex doctest 명령줄 옵션; -f
@geindex doctest 명령줄 옵션; --fail-fast
@anchor{library/doctest cmdoption-doctest-f}@anchor{459f}@anchor{library/doctest cmdoption-doctest-fail-fast}@anchor{45a0}
@deffn {Option} @w{-}f, @w{-}@w{-}fail@w{-}fast

@code{-o FAIL_FAST}의 축약입니다.


Added in version 3.4.

@end deffn

@node 작동 방법,기본 API,명령줄 사용법<2>,doctest — 대화형 파이썬 예제 테스트
@anchor{library/doctest doctest-how-it-works}@anchor{45a1}@anchor{library/doctest how-it-works}@anchor{45a2}
@subsubsection 작동 방법


이 절에서는 doctest가 어떻게 작동하는지 자세히 설명합니다: 어떤 독스트링을 살피는지, 대화형 예제를 어떻게 찾는지, 사용하는 실행 컨텍스트는 무엇인지, 예외를 어떻게 처리하는지, 어떻게 옵션 플래그를 사용하여 동작을 제어하는지. 이것은 doctest 예제를 작성하기 위해 알아야 할 정보입니다; 이러한 예제에 대해 실제로 doctest를 실행하는 방법에 대한 자세한 내용은 다음 절을 참조하십시오.

@menu
* 어떤 독스트링을 검사합니까?:: 
* 독스트링 예제는 어떻게 인식됩니까?:: 
* 실행 컨텍스트란 무엇입니까?:: 
* 예외는 어떻게 됩니까?:: 
* 옵션 플래그:: 
* 지시자:: 
* 경고: 경고<2>. 

@end menu

@node 어떤 독스트링을 검사합니까?,독스트링 예제는 어떻게 인식됩니까?,,작동 방법
@anchor{library/doctest doctest-which-docstrings}@anchor{45a3}@anchor{library/doctest which-docstrings-are-examined}@anchor{45a4}
@subsubsection 어떤 독스트링을 검사합니까?


모듈 독스트링과 모든 함수, 클래스 및 메서드 독스트링이 검색됩니다. 모듈로 임포트 된 객체는 검색되지 않습니다.

@geindex __test__ (module의 속성)
@anchor{library/doctest module __test__}@anchor{45a5}
또한, 테스트를 모듈의 일부로 포함시키고 싶지만 도움말 텍스트에는 포함시키고 싶지 않은 경우가 있습니다. 이 경우 테스트가 독스트링에 포함되지 않도록 해야 합니다. Doctest는 모듈 수준 변수인 @code{__test__}를 보고 이를 통해 다른 테스트를 찾아냅니다. @code{M.__test__}가 존재하면, 딕셔너리이어야 하고 각 항목은 (문자열) 이름을 함수 객체, 클래스 객체 또는 문자열에 매핑합니다. @code{M.__test__}에서 발견된 함수와 클래스 객체 독스트링이 검색되고, 문자열은 독스트링인 것처럼 처리됩니다. 출력에서, @code{M.__test__}의 키 @code{K}가 이름 @code{M.__test__.K}로 나타납니다.

For example, place this block of code at the top of @code{example.py}:

@example
__test__ = @{
    'numbers': """
>>> factorial(6)
720

>>> [factorial(n) for n in range(6)]
[1, 1, 2, 6, 24, 120]
"""
@}
@end example

The value of @code{example.__test__["numbers"]} will be treated as a
docstring and all the tests inside it will be run. It is
important to note that the value can be mapped to a function,
class object, or module; if so, @code{doctest}
searches them recursively for docstrings, which are then scanned for tests.

발견된 모든 클래스는 포함된 메서드와 중첩된 클래스의 독스트링을 테스트하기 위해 유사하게 재귀적으로 검색됩니다.

@cartouche
@quotation 참고 
@code{doctest} can only automatically discover classes and functions that are
defined at the module level or inside other classes.

Since nested classes and functions only exist when an outer function
is called, they cannot be discovered. Define them outside to make them visible.
@end quotation
@end cartouche

@node 독스트링 예제는 어떻게 인식됩니까?,실행 컨텍스트란 무엇입니까?,어떤 독스트링을 검사합니까?,작동 방법
@anchor{library/doctest doctest-finding-examples}@anchor{45a6}@anchor{library/doctest how-are-docstring-examples-recognized}@anchor{45a7}
@subsubsection 독스트링 예제는 어떻게 인식됩니까?


대부분 대화형 콘솔 세션의 복사하여 붙여넣기가 잘 작동하지만, doctest는 특정 파이썬 셸의 정확한 에뮬레이션을 시도하지 않습니다.

@example
>>> # 주석은 무시됩니다
>>> x = 12
>>> x
12
>>> if x == 13:
...     print("yes")
... else:
...     print("no")
...     print("NO")
...     print("NO!!!")
...
no
NO
NO!!!
>>>
@end example

@geindex >>>;인터프리터 프롬프트
@geindex ...;인터프리터 프롬프트

모든 예상 출력은 코드가 포함된 마지막 @code{'>>> '} 또는 @code{'... '} 줄 바로 다음에 나와야 하며, (있다면) 예상 출력은 다음 @code{'>>> '} 나 전체 공백 줄까지 확장됩니다.

세부 사항:


@itemize *

@item 
예상 출력은 전체 공백 줄을 포함할 수 없습니다. 그러한 줄은 예상 출력의 끝으로 인식되기 때문입니다. 예상 출력이 빈 줄을 포함하면, doctest 예제에서 빈 줄이 나타나는 곳에 @code{<BLANKLINE>}을 넣으십시오.

@item 
모든 하드 탭 문자는 8열 탭 정지를 사용하여 스페이스로 확장됩니다. 테스트 된 코드에 의해 생성된 출력의 탭은 수정되지 않습니다. 샘플 출력의 모든 하드 탭이 `확장되므로', 이것은 코드 출력에 하드 탭이 포함될 때 doctest가 통과할 수 있는 유일한 방법은, @ref{45a8,,NORMALIZE_WHITESPACE} 옵션이나 @ref{45a9,,지시자}가 유효한 경우뿐임을 의미합니다. 또는, 출력을 캡처하여 테스트 일부로 예상값과 비교하도록 테스트를 다시 작성할 수 있습니다. 이러한 소스의 탭 처리는 시행착오를 거쳐 얻어진 것이며, 가장 에러가 발생하지 않는 방법으로 입증되었습니다. 사용자 정의 @ref{45aa,,DocTestParser} 클래스를 작성하여 탭 처리에 다른 알고리즘을 사용하는 것도 가능합니다.

@item 
stdout으로의 출력은 캡처되지만, stderr로의 출력은 그렇지 않습니다 (예외 트레이스백은 다른 수단을 통해 캡처됩니다).

@item 
대화식 세션에서 역 슬래시를 통해 줄을 계속하거나, 다른 이유로 백 슬래시를 사용하면, 날 독스트링(raw docstring)을 사용해서 역 슬래시를 입력한 그대로 유지해야 합니다:

@example
>>> def f(x):
...     r'@w{'}'Backslashes in a raw docstring: m\n'@w{'}'
...
>>> print(f.__doc__)
Backslashes in a raw docstring: m\n
@end example

그렇지 않으면, 백 슬래시가 문자열 일부로 해석됩니다. 예를 들어, 위의 @code{\n}은 개행 문자로 해석됩니다. 또는, doctest 버전에서 각 백 슬래시를 중복시킬 수 있습니다 (그리고 날 문자열은 사용하지 않습니다):

@example
>>> def f(x):
...     '@w{'}'Backslashes in a raw docstring: m\\n'@w{'}'
...
>>> print(f.__doc__)
Backslashes in a raw docstring: m\n
@end example

@item 
시작 열은 중요하지 않습니다:

@example
>>> assert "Easy!"
      >>> import math
          >>> math.floor(1.9)
          1
@end example

그리고 예제를 시작한 초기 @code{'>>> '} 줄에 나타나는 것만큼의 선행 공백을 예상 출력에서 제거합니다.
@end itemize

@node 실행 컨텍스트란 무엇입니까?,예외는 어떻게 됩니까?,독스트링 예제는 어떻게 인식됩니까?,작동 방법
@anchor{library/doctest doctest-execution-context}@anchor{45ab}@anchor{library/doctest what-s-the-execution-context}@anchor{45ac}
@subsubsection 실행 컨텍스트란 무엇입니까?


By default, each time @code{doctest} finds a docstring to test, it uses a
`shallow copy' of @code{M}’s globals, so that running tests doesn’t change the
module’s real globals, and so that one test in @code{M} can’t leave behind
crumbs that accidentally allow another test to work.  This means examples can
freely use any names defined at top-level in @code{M}, and names defined earlier
in the docstring being run. Examples cannot see names defined in other
docstrings.

대신 @code{globs=your_dict}를 @ref{1672,,testmod()}나 @ref{4599,,testfile()}로 전달하여 실행 컨텍스트로 여러분 자신의 딕셔너리를 사용하도록 할 수 있습니다.

@node 예외는 어떻게 됩니까?,옵션 플래그,실행 컨텍스트란 무엇입니까?,작동 방법
@anchor{library/doctest doctest-exceptions}@anchor{45ad}@anchor{library/doctest what-about-exceptions}@anchor{45ae}
@subsubsection 예외는 어떻게 됩니까?


문제없습니다, 트레이스백이 예제에 의해 생성된 유일한 출력이기만 하면 됩니다: 그냥 트레이스백을 붙여넣으십시오. @footnote{
예상 출력과 예외를 모두 포함하는 예제는 지원되지 않습니다. 어디에서 하나가 끝나고 다른 하나가 시작되는지 추측하는 것은 너무 에러가 발생하기 쉽고, 이것은 또한 혼란스러운 테스트를 만들게 됩니다.
} 트레이스백에는 빠르게 변할 가능성이 있는 세부 사항(예를 들어, 정확한 파일 경로와 줄 번호)이 포함되어 있으므로, 이것은 doctest가 수락할 내용에 유연하도록 신경 써야 하는 한 가지 사례입니다.

간단한 예:

@example
>>> [1, 2, 3].remove(42)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: list.remove(x): x not in list
@end example

이 doctest는 @code{list.remove(x): x not in list} 세부 정보를 포함하는 @ref{2ec,,ValueError}가 발생하면 성공합니다.

예외의 예상 출력은 다음 두 줄 중 한 가지가 예제의 첫 번째 줄과 같게 들여쓰기 된 트레이스백 헤더로 시작해야 합니다:

@example
Traceback (most recent call last):
Traceback (innermost last):
@end example

트레이스백 헤더 다음에는 선택적인 트레이스백 스택이 오며, 그 내용은 doctest가 무시합니다. 보통 트레이스백 스택은 생략되거나, 대화형 세션에서 그대로 복사됩니다.

트레이스백 스택 다음에는 가장 흥미로운 부분이 옵니다: 예외 형과 세부 사항이 있는 줄. 대개 이것은 트레이스백의 마지막 줄이지만, 예외에 여러 줄로 구성된 세부 사항이 있으면 여러 줄로 확장될 수 있습니다:

@example
>>> raise ValueError('multi\n    line\ndetail')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: multi
    line
detail
@end example

(@ref{2ec,,ValueError}로 시작하는) 마지막 세 줄이 예외의 형 및 세부 사항과 비교되고, 나머지는 무시됩니다.

모범 사례는 예제에 중요한 설명으로서의 가치를 추가하지 않는 한 트레이스백 스택을 생략하는 것입니다. 따라서 마지막 예제는 이렇게 하는 것이 더 좋습니다:

@example
>>> raise ValueError('multi\n    line\ndetail')
Traceback (most recent call last):
    ...
ValueError: multi
    line
detail
@end example

트레이스백이 매우 특별하게 취급된다는 점에 유의하십시오. 특히, 다시 작성된 예제에서, @code{...}의 사용은 doctest의 @ref{1673,,ELLIPSIS} 옵션과 무관합니다. 이 예제의 줄임표는 생략하거나, 3개(혹은 300개)의 쉼표나 숫자 또는 몬티 파이썬 쇼의 들여쓰기 된 대본이어도 똑같이 잘 동작합니다.

한 번쯤 읽어야 할 세부 정보이지만, 기억할 필요는 없습니다:


@itemize *

@item 
Doctest는 예상 출력이 예외 트레이스백에서 온 것인지 일반 인쇄에서 온 것인지 추측할 수 없습니다. 그래서, 예를 들어, @code{ValueError: 42 is prime}을 예상하는 예제는 @ref{2ec,,ValueError}가 실제로 발생해도 통과하지만, 예제가 단지 그 트레이스백 텍스트를 출력해도 통과합니다. 실제로는, 일반 출력은 거의 트레이스백 헤더 줄로 시작하지 않으므로, 실제 문제가 되지는 않습니다.

@item 
(있다면) 트레이스백 스택의 각 줄은 예제의 첫 번째 줄보다 더 들여쓰기 되거나, `또는' 영숫자(alphanumeric)가 아닌 문자로 시작해야 합니다. 트레이스백 헤더 뒤에 같은 정도로 들여쓰기 되고, 영숫자로 시작하는 첫 번째 줄은 예외 세부 사항의 시작으로 간주합니다. 물론 이것은 진짜 트레이스백에 잘 들어맞습니다.

@item 
@ref{150d,,IGNORE_EXCEPTION_DETAIL} doctest 옵션을 지정하면, 가장 왼쪽 콜론 다음에 오는 모든 것과 예외 이름의 모듈 정보가 무시됩니다.

@item 
The interactive shell omits the traceback header line for some
@ref{18e,,SyntaxError}s.  But doctest uses the traceback header line to
distinguish exceptions from non-exceptions.  So in the rare case where you need
to test a @code{SyntaxError} that omits the traceback header, you will need to
manually add the traceback header line to your test example.
@end itemize

@geindex ^ (캐럿);마커


@itemize *

@item 
일부 예외의 경우, 파이썬은 @code{^} 마커와 물결표를 사용하여 에러의 위치를 표시합니다:

@example
>>> 1 + None
  File "<stdin>", line 1
    1 + None
    ~~^~~~~~
TypeError: unsupported operand type(s) for +: 'int' and 'NoneType'
@end example

에러의 위치를 나타내는 줄은 예외 형과 세부 사항 앞에 오므로, doctest가 점검하지 않습니다. 예를 들어, @code{^} 마커를 잘못된 위치에 넣어도, 다음 테스트가 통과합니다:

@example
>>> 1 + None
  File "<stdin>", line 1
    1 + None
    ^~~~~~~~
TypeError: unsupported operand type(s) for +: 'int' and 'NoneType'
@end example
@end itemize
@anchor{library/doctest option-flags-and-directives}@anchor{45af}
@node 옵션 플래그,지시자,예외는 어떻게 됩니까?,작동 방법
@anchor{library/doctest doctest-options}@anchor{1132}@anchor{library/doctest option-flags}@anchor{45b0}
@subsubsection 옵션 플래그


많은 옵션 플래그가 doctest의 다양한 동작을 제어합니다. 플래그의 기호 이름은 모듈 상수로 제공되며, 함께 @ref{24cd,,비트별 OR}되어 다양한 함수로 전달될 수 있습니다. 이 이름은 @ref{45a9,,doctest 지시자}에서도 사용될 수 있으며, @code{-o} 옵션을 통해 doctest 명령 줄 인터페이스로 전달될 수 있습니다.

첫 번째 옵션 그룹은 테스트의 의미를 정의하는데, doctest가 실제 출력이 예제의 예상 출력과 일치하는지를 결정하는 측면을 제어합니다:

@geindex DONT_ACCEPT_TRUE_FOR_1 (doctest 모듈)
@anchor{library/doctest doctest DONT_ACCEPT_TRUE_FOR_1}@anchor{45b1}
@deffn {데이터} doctest.DONT_ACCEPT_TRUE_FOR_1

기본적으로, 예상 출력 블록에 @code{1} 만 있으면, 단지 @code{1}이나 @code{True} 만 포함된 실제 출력 블록을 일치하는 것으로 간주하며, @code{0}과 @code{False}도 유사하게 다룹니다. @ref{45b1,,DONT_ACCEPT_TRUE_FOR_1}이 지정되면, 두 치환 모두 허용되지 않습니다. 기본 동작은 파이썬이 많은 함수의 반환형을 정수에서 논릿값으로 변경했다는 것을 반영합니다; “작은 정수” 출력을 예상하는 doctest가 이러한 경우에 여전히 작동합니다. 아마도 이 옵션은 사라지게 되겠지만, 몇 년 동안은 남아있을 겁니다.
@end deffn

@geindex <BLANKLINE>

@geindex DONT_ACCEPT_BLANKLINE (doctest 모듈)
@anchor{library/doctest doctest DONT_ACCEPT_BLANKLINE}@anchor{45b2}
@deffn {데이터} doctest.DONT_ACCEPT_BLANKLINE

기본적으로, 예상 출력 블록에 @code{<BLANKLINE>} 문자열만 포함된 줄이 있으면, 해당하는 줄은 실제 출력의 빈 줄과 일치합니다. 진짜 빈 줄은 예상 출력을 끝내므로, 이것이 빈 줄을 예상하는 유일한 방법입니다. @ref{45b2,,DONT_ACCEPT_BLANKLINE}이 지정되면, 이 치환은 허용되지 않습니다.
@end deffn

@geindex NORMALIZE_WHITESPACE (doctest 모듈)
@anchor{library/doctest doctest NORMALIZE_WHITESPACE}@anchor{45a8}
@deffn {데이터} doctest.NORMALIZE_WHITESPACE

지정되면, 모든 공백(빈칸과 개행) 시퀀스는 같게 취급됩니다. 예상 출력 내의 모든 공백 시퀀스는 실제 출력 내의 모든 공백 시퀀스와 일치합니다. 기본적으로, 공백은 정확히 일치해야 합니다. @ref{45a8,,NORMALIZE_WHITESPACE}는 예상 출력 줄이 매우 길고 소스의 여러 줄에 걸쳐 줄넘김하려는 경우에 특히 유용합니다.
@end deffn

@geindex ...;doctest 에서

@geindex ELLIPSIS (doctest 모듈)
@anchor{library/doctest doctest ELLIPSIS}@anchor{1673}
@deffn {데이터} doctest.ELLIPSIS

지정되면, 예상 출력의 줄임표(@code{...})가 실제 출력의 모든 부분 문자열과 일치 할 수 있습니다. 여기에는 줄 경계를 넘는 부분 문자열과 빈 부분 문자열이 포함되므로, 사용을 간단하게 유지하는 것이 가장 좋습니다. 복잡한 사용은 정규식에서 @code{.*}를 쓸 때처럼 “이런, 너무 많이 일치하는군!” 과 같은 상황을 만들 수 있습니다.
@end deffn

@geindex IGNORE_EXCEPTION_DETAIL (doctest 모듈)
@anchor{library/doctest doctest IGNORE_EXCEPTION_DETAIL}@anchor{150d}
@deffn {데이터} doctest.IGNORE_EXCEPTION_DETAIL

When specified, doctests expecting exceptions pass so long as an exception
of the expected type is raised, even if the details
(message and fully qualified exception name) don’t match.

For example, an example expecting @code{ValueError: 42} will pass if the actual
exception raised is @code{ValueError: 3*14}, but will fail if, say, a
@ref{198,,TypeError} is raised instead.
It will also ignore any fully qualified name included before the
exception class, which can vary between implementations and versions
of Python and the code/libraries in use.
Hence, all three of these variations will work with the flag specified:

@example
>>> raise Exception('message')
Traceback (most recent call last):
Exception: message

>>> raise Exception('message')
Traceback (most recent call last):
builtins.Exception: message

>>> raise Exception('message')
Traceback (most recent call last):
__main__.Exception: message
@end example

Note that @ref{1673,,ELLIPSIS} can also be used to ignore the
details of the exception message, but such a test may still fail based
on whether the module name is present or matches exactly.


버전 3.2에서 변경: @ref{150d,,IGNORE_EXCEPTION_DETAIL}은 이제 테스트 중인 예외를 포함하는 모듈과 관련된 정보도 무시합니다.

@end deffn

@geindex SKIP (doctest 모듈)
@anchor{library/doctest doctest SKIP}@anchor{45b3}
@deffn {데이터} doctest.SKIP

지정되면, 예제를 전혀 실행하지 않습니다. 이것은 doctest 예제가 설명서와 테스트 케이스의 두 가지 역할을 하는 문맥에서, 설명을 위해 예제를 포함해야 하지만 검사하지는 않아야 할 때 유용할 수 있습니다. 예를 들어, 예제의 출력이 임의적일 수 있습니다; 또는 예제가 테스트 구동기에서 사용할 수 없는 자원에 의존할 수 있습니다.

SKIP 플래그는 임시로 “주석 처리한” 예제를 위해 사용될 수도 있습니다.
@end deffn

@geindex COMPARISON_FLAGS (doctest 모듈)
@anchor{library/doctest doctest COMPARISON_FLAGS}@anchor{45b4}
@deffn {데이터} doctest.COMPARISON_FLAGS

위의 모든 비교 플래그를 함께 OR 한 비트 마스크.
@end deffn

두 번째 옵션 그룹은 테스트 실패가 보고되는 방식을 제어합니다:

@geindex REPORT_UDIFF (doctest 모듈)
@anchor{library/doctest doctest REPORT_UDIFF}@anchor{1674}
@deffn {데이터} doctest.REPORT_UDIFF

지정되면, 여러 줄의 예상 및 실제 출력을 수반하는 실패가 통합(unified) diff를 사용하여 표시됩니다.
@end deffn

@geindex REPORT_CDIFF (doctest 모듈)
@anchor{library/doctest doctest REPORT_CDIFF}@anchor{1675}
@deffn {데이터} doctest.REPORT_CDIFF

지정되면, 여러 줄의 예상 및 실제 출력을 수반하는 실패가 문맥(context) diff를 사용하여 표시됩니다.
@end deffn

@geindex REPORT_NDIFF (doctest 모듈)
@anchor{library/doctest doctest REPORT_NDIFF}@anchor{1676}
@deffn {데이터} doctest.REPORT_NDIFF

지정되면, 차이점은 널리 사용되는 @code{ndiff.py} 유틸리티와 같은 알고리즘을 사용하여, @code{difflib.Differ}로 계산됩니다. 이 방법은 줄 간의 차이뿐만 아니라 줄 안에서의 차이점을 표시하는 유일한 방법입니다. 예를 들어, 예상 출력 줄에 숫자 @code{1}이 포함된 줄에 실제 출력이 문자 @code{l}을 포함하고 있으면, 일치하지 않는 열 위치를 나타내는 캐럿(caret)이 들어간 줄이 삽입됩니다.
@end deffn

@geindex REPORT_ONLY_FIRST_FAILURE (doctest 모듈)
@anchor{library/doctest doctest REPORT_ONLY_FIRST_FAILURE}@anchor{45b5}
@deffn {데이터} doctest.REPORT_ONLY_FIRST_FAILURE

지정되면, 각 doctest에서 실패한 첫 번째 예제를 표시하지만, 나머지 모든 예제에 대해서는 출력을 억제합니다. 이렇게 하면 doctest가 이전의 실패로 인해 망가진 올바른 예제를 보고하지 않게 되지만, 첫 번째 실패와 무관하게 실패한 잘못된 예제를 숨길 수도 있습니다. @ref{45b5,,REPORT_ONLY_FIRST_FAILURE}가 지정될 때, 나머지 예제는 여전히 실행되며, 보고된 총실패 수에 포함됩니다; 출력만 억제됩니다.
@end deffn

@geindex FAIL_FAST (doctest 모듈)
@anchor{library/doctest doctest FAIL_FAST}@anchor{1133}
@deffn {데이터} doctest.FAIL_FAST

지정되면, 첫 번째 실패 예제 후에 종료하고, 나머지 예제를 실행하지 않습니다. 따라서, 보고되는 실패 횟수는 최대 1입니다. 이 플래그는 디버깅 중에 유용할 수 있습니다, 첫 번째 실패 이후의 예제는 디버깅 출력조차 생성하지 않기 때문입니다.
@end deffn

@geindex REPORTING_FLAGS (doctest 모듈)
@anchor{library/doctest doctest REPORTING_FLAGS}@anchor{45b6}
@deffn {데이터} doctest.REPORTING_FLAGS

위의 모든 보고(reporting) 플래그를 함께 OR 한 비트 마스크.
@end deffn

There is also a way to register new option flag names, though this isn’t
useful unless you intend to extend @code{doctest} internals via subclassing:

@geindex register_optionflag() (doctest 모듈)
@anchor{library/doctest doctest register_optionflag}@anchor{45b7}
@deffn {함수} doctest.register_optionflag (name)

지정된 이름으로 새로운 옵션 플래그를 만들고, 새로운 플래그의 정숫값을 반환합니다. @ref{45b7,,register_optionflag()}은 @ref{45b8,,OutputChecker}나 @ref{45b9,,DocTestRunner}를 서브 클래싱할 때 서브 클래스가 지원하는 새 옵션을 만들 때 사용할 수 있습니다. @code{register_optionflag()}는 항상 다음의 관용구를 사용하여 호출해야 합니다:

@example
MY_FLAG = register_optionflag('MY_FLAG')
@end example
@end deffn

@geindex # (해시);doctest 에서
@geindex + (플러스);doctest 에서
@geindex - (마이너스);doctest 에서

@node 지시자,경고<2>,옵션 플래그,작동 방법
@anchor{library/doctest directives}@anchor{45ba}@anchor{library/doctest doctest-directives}@anchor{45a9}
@subsubsection 지시자


Doctest 지시자를 사용하면 개별 예제의 @ref{1132,,옵션 플래그}를 수정할 수 있습니다. Doctest 지시자는 예제의 소스 코드 뒤에 오는 특수한 파이썬 주석입니다:

@example
@anchor{library/doctest grammar-token-doctest-directive}@anchor{45bb}directive:             "#" "doctest:" @ref{45bc,,directive_options}
@anchor{library/doctest grammar-token-doctest-directive_options}@anchor{45bc}directive_options:     @ref{45bd,,directive_option} ("," @ref{45bd,,directive_option})*
@anchor{library/doctest grammar-token-doctest-directive_option}@anchor{45bd}directive_option:      @ref{45be,,on_or_off} @ref{45bf,,directive_option_name}
@anchor{library/doctest grammar-token-doctest-on_or_off}@anchor{45be}on_or_off:             "+" | "-"
@anchor{library/doctest grammar-token-doctest-directive_option_name}@anchor{45bf}directive_option_name: "DONT_ACCEPT_BLANKLINE" | "NORMALIZE_WHITESPACE" | ...
@end example

@code{+}나 @code{-}와 지시자 옵션 이름 사이의 공백은 허용되지 않습니다. 지시자 옵션 이름은 위에 설명된 옵션 플래그 이름 중 하나일 수 있습니다.

예제의 doctest 지시자는 그 단일 예제에 대한 doctest의 동작을 수정합니다. 이름 붙인 동작을 활성화하려면 @code{+}를 사용하고, 비활성화하려면 @code{-}를 사용하십시오.

예를 들어, 이 테스트는 통과합니다:

@example
>>> print(list(range(20)))  # doctest: +NORMALIZE_WHITESPACE
[0,   1,  2,  3,  4,  5,  6,  7,  8,  9,
10,  11, 12, 13, 14, 15, 16, 17, 18, 19]
@end example

지시자가 없으면 실패하는데, 실제 출력에는 한 자리 숫자 리스트 요소 앞에 두 개의 공백이 없기도 하고, 실제 출력은 한 줄이기 때문입니다. 이 테스트도 통과하는데, 그러기 위해서 역시 지시자가 필요합니다:

@example
>>> print(list(range(20)))  # doctest: +ELLIPSIS
[0, 1, ..., 18, 19]
@end example

하나의 물리적 줄에 여러 개의 지시자를 쉼표로 구분하여 사용할 수 있습니다:

@example
>>> print(list(range(20)))  # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE
[0,    1, ...,   18,    19]
@end example

하나의 예제에 여러 개의 지시자 주석이 사용되면, 모두 결합합니다:

@example
>>> print(list(range(20)))  # doctest: +ELLIPSIS
...                         # doctest: +NORMALIZE_WHITESPACE
[0,    1, ...,   18,    19]
@end example

앞의 예가 보여주듯이, 여러분의 예제에 지시자만 포함된 @code{...} 줄을 추가할 수 있습니다. 예가 너무 길어서 지시자가 같은 줄에 편안하게 들어갈 수 없을 때 유용할 수 있습니다:

@example
>>> print(list(range(5)) + list(range(10, 20)) + list(range(30, 40)))
... # doctest: +ELLIPSIS
[0, ..., 4, 10, ..., 19, 30, ..., 39]
@end example

모든 옵션은 기본적으로 비활성화되고, 지시자가 표시된 예제에만 적용되므로, (지시자에 @code{+}를 통해) 옵션을 활성화하는 것이 일반적으로 유일한 의미 있는 선택입니다. 하지만, doctest를 실행하는 함수에 옵션 플래그를 전달하여 다른 기본값을 설정할 수도 있습니다. 이럴 때, 지시자에서 @code{-}를 통해 옵션을 비활성화하는 것이 유용할 수 있습니다.

@node 경고<2>,,지시자,작동 방법
@anchor{library/doctest doctest-warnings}@anchor{45c0}@anchor{library/doctest warnings}@anchor{45c1}
@subsubsection 경고


@code{doctest} is serious about requiring exact matches in expected output.  If
even a single character doesn’t match, the test fails.  This will probably
surprise you a few times, as you learn exactly what Python does and doesn’t
guarantee about output.  For example, when printing a set, Python doesn’t
guarantee that the element is printed in any particular order, so a test like

@example
>>> foo()
@{"spam", "eggs"@}
@end example

취약합니다! 한 가지 해결 방법은 다음과 같습니다

@example
>>> foo() == @{"spam", "eggs"@}
True
@end example

대신에. 또 다른 방법은

@example
>>> d = sorted(foo())
>>> d
['eggs', 'spam']
@end example

다른 것들도 있지만, 아마 아이디어를 얻었을 겁니다.

또 다른 나쁜 생각은 객체 주소를 포함하는 것들을 출력하는 것입니다

@example
>>> id(1.0)  # 때로 실패할 것이 확실합니다
7948648
>>> class C: pass
>>> C()  # 인스턴스에 대한 기본 repr()은 주소를 포함합니다
<C object at 0x00AC18F0>
@end example

@ref{1673,,ELLIPSIS} 지시자는 마지막 예제를 다루는 좋은 접근법을 제공합니다:

@example
>>> C()  # doctest: +ELLIPSIS
<C object at 0x...>
@end example

Floating-point numbers are also subject to small output variations across
platforms, because Python defers to the platform C library for some
floating-point calculations, and C libraries vary widely in quality here.

@example
>>> 1000**0.1  # risky
1.9952623149688797
>>> round(1000**0.1, 9) # safer
1.995262315
>>> print(f'@{1000**0.1:.4f@}') # much safer
1.9953
@end example

@code{I/2.**J} 형식의 숫자는 모든 플랫폼에서 안전하며, 저는 종종 이런 형식의 숫자를 만들도록 doctest 예제를 꾸밉니다:

@example
>>> 3./4  # 완전히 안전합니다
0.75
@end example

간단한 분수는 또한 사람들이 이해하기가 더 쉬우므로, 더 좋은 설명서가 되도록 합니다.

@node 기본 API,Unittest API,작동 방법,doctest — 대화형 파이썬 예제 테스트
@anchor{library/doctest basic-api}@anchor{45c2}@anchor{library/doctest doctest-basic-api}@anchor{4596}
@subsubsection 기본 API


@ref{1672,,testmod()}와 @ref{4599,,testfile()} 함수는 대부분 기본 사용에 충분한 doctest에 대한 간단한 인터페이스를 제공합니다. 이 두 함수에 대한 덜 형식적인 소개는 섹션 @ref{4593,,간단한 사용법; 독스트링에 있는 예제 확인하기}와 @ref{4597,,간단한 사용법; 텍스트 파일에 있는 예제 확인하기}를 참조하십시오.

@geindex testfile() (doctest 모듈)
@anchor{library/doctest doctest testfile}@anchor{4599}
@deffn {함수} 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)

`filename'를 제외한 모든 인자는 선택적이며 키워드 형식으로 지정해야 합니다.

`filename' 파일에 있는 예제를 테스트합니다. @code{(failure_count, test_count)}를 반환합니다.

선택적 인자 `module_relative'는 filename을 해석하는 방법을 지정합니다:


@itemize *

@item 
`module_relative'가 @code{True}(기본값)이면, `filename'는 OS 독립적 모듈 상대 경로를 지정합니다. 기본적으로, 이 경로는 호출하는 모듈의 디렉터리에 상대적입니다; 그러나 `package' 인자가 지정되면, 해당 패키지에 상대적입니다. OS 독립성을 보장하기 위해, `filename'은 @code{/} 문자를 사용하여 경로 세그먼트를 분리해야 하며, 절대 경로일 수 없습니다 (즉, @code{/}로 시작할 수 없습니다).

@item 
`module_relative'가 @code{False}이면, `filename'은 OS 특정 경로를 지정합니다. 경로는 절대나 상대일 수 있습니다; 상대 경로는 현재 작업 디렉터리를 기준으로 해석됩니다.
@end itemize

선택적 인자 `name'은 테스트의 이름을 제공합니다; 기본적으로, 또는 @code{None}이면, @code{os.path.basename(filename)}이 사용됩니다.

선택적 인자 `package'는 디렉터리가 모듈 상대 filename의 기본 디렉터리로 사용될 파이썬 패키지나 파이썬 패키지의 이름입니다. 패키지를 지정하지 않으면, 호출하는 모듈의 디렉터리가 모듈 상대 filename의 기본 디렉터리로 사용됩니다. `module_relative'가 @code{False}일 때 `package'를 지정하는 것은 에러입니다.

선택적 인자 `globs'는 예제를 실행할 때 전역으로 사용될 딕셔너리를 제공합니다. doctest를 위해 이 딕셔너리의 새 얕은 사본이 만들어지므로, 예제는 깨끗한 서판으로 시작합니다. 기본적으로, 또는 @code{None}이면, 새 빈 딕셔너리가 사용됩니다.

선택적 인자 `extraglobs'는 예제를 실행하는 데 사용되는 전역에 병합될 딕셔너리를 제공합니다. 이것은 @ref{166a,,dict.update()}처럼 작동합니다: `globs'와 `extraglobs'에 공통 키가 있으면, `extraglobs'의 연관된 값이 병합된 딕셔너리에 나타납니다. 기본적으로, 또는 @code{None}이면, 추가 전역은 사용되지 않습니다. doctest의 매개 변수화를 허용하는 고급 기능입니다. 예를 들어, doctest는 클래스의 일반 이름을 사용하여 베이스 클래스용으로 작성할 수 있습니다, 그런 다음 일반 이름을 테스트할 서브 클래스에 매핑하는 `extraglobs' 딕셔너리를 전달하여 임의의 수의 서브 클래스를 테스트하는데 재사용할 수 있습니다.

Optional argument `verbose' prints lots of stuff if true, and prints only
failures if false; by default, or if @code{None}, it’s true if and only if @code{'-v'}
is in @ref{1469,,sys.argv}.

선택적 인자 `report'가 참이면 끝에 요약을 인쇄하고, 그렇지 않으면 끝에 아무것도 인쇄하지 않습니다. verbose 모드에서는 요약 정보가 상세히 표시되며, 그렇지 않으면 요약 정보는 매우 간단합니다 (사실, 모든 테스트가 통과되면 비어 있습니다).

Optional argument `optionflags' (default value @code{0}) takes the
@ref{24cd,,bitwise OR} of option flags.
See section @ref{1132,,옵션 플래그}.

선택적 인자 `raise_on_error'의 기본값은 거짓입니다. 참이면, 예제에서 첫 번째 실패나 예기치 않은 예외가 발생할 때 예외가 발생합니다. 이것은 실패를 사후(post-mortem) 디버깅할 수 있도록 합니다. 기본 동작은 예제를 계속 실행하는 것입니다.

선택적 인자 `parser'는 파일에서 테스트를 추출하는 데 사용할 @ref{45aa,,DocTestParser}(또는 서브 클래스)를 지정합니다. 기본값은 일반 파서(즉, @code{DocTestParser()})입니다.

선택적 인자 `encoding'은 파일을 유니코드로 변환하는 데 사용할 인코딩을 지정합니다.
@end deffn

@geindex testmod() (doctest 모듈)
@anchor{library/doctest doctest testmod}@anchor{1672}
@deffn {함수} doctest.testmod (m=None, name=None, globs=None, verbose=None, report=True, optionflags=0, extraglobs=None, raise_on_error=False, exclude_empty=False)

모든 인자는 선택적이며, `m'을 제외한 모든 인자는 키워드 형식으로 지정해야 합니다.

모듈 `m'(또는 `m'가 제공되지 않았거나 @code{None}이면 모듈 @ref{1,,__main__})에서 도달할 수 있는 함수와 클래스의 독스트링에 있는 예제를 테스트합니다. @code{m.__doc__}으로 시작합니다.

딕셔너리 @code{m.__test__}이 존재하면, 여기에서 도달할 수 있는 예제도 테스트합니다. @code{m.__test__}는 이름(문자열)을 함수, 클래스 및 문자열에 매핑합니다; 함수와 클래스 독스트링에서 예제를 검색합니다; 문자열은 그것이 독스트링인 것처럼 직접 검색합니다.

모듈 `m'에 속하는 객체에 연결된 독스트링 만 검색합니다.

@code{(failure_count, test_count)}를 반환합니다.

선택적 인자 `name'은 모듈의 이름을 제공합니다; 기본적으로, 또는 @code{None}이면, @code{m.__name__}이 사용됩니다.

선택적 인자 `exclude_empty'의 기본값은 거짓입니다. 참이면, doctest가 발견되지 않은 객체는 고려 대상에서 제외됩니다. 기본값은 이전 버전과의 호환성을 위한 해킹입니다, 여전히 @ref{1672,,testmod()}와 함께 @ref{45c3,,doctest.master.summarize}를 사용하는 코드는 테스트가 없는 객체에 대해 계속 출력합니다. 새로운 @ref{19a8,,DocTestFinder} 생성자에 대한 `exclude_empty' 인자의 기본값은 참입니다.

선택적 인자 `extraglobs', `verbose', `report', `optionflags', `raise_on_error' 및 `globs'는 위의 함수 @ref{4599,,testfile()}와 같습니다만, `globs'의 기본값이 @code{m.__dict__}인 점이 다릅니다.
@end deffn

@geindex run_docstring_examples() (doctest 모듈)
@anchor{library/doctest doctest run_docstring_examples}@anchor{45c4}
@deffn {함수} doctest.run_docstring_examples (f, globs, verbose=False, name='NoName', compileflags=None, optionflags=0)

객체 `f'와 관련된 예제를 테스트합니다. 여기서, `f'는 문자열, 모듈, 함수 또는 클래스 객체일 수 있습니다.

딕셔너리 인자 `globs'의 얕은 사본이 실행 컨텍스트에 사용됩니다.

선택적 인자 `name'은 실패 메시지에서 사용되며, 기본값은 @code{"NoName"}입니다.

선택적 인자 `verbose'가 참이면, 실패가 없어도 출력이 생성됩니다. 기본적으로, 출력은 예제가 실패할 때만 생성됩니다.

선택적 인자 `compileflags'는 예제를 실행할 때 파이썬 컴파일러에서 사용해야 하는 플래그 집합을 제공합니다. 기본적으로, 또는 @code{None}이면, `globs'에서 발견되는 퓨처 기능 집합에 해당하는 플래그가 추론됩니다.

선택적 인자 `optionflags'는 위의 함수 @ref{4599,,testfile()}에서 처럼 작동합니다.
@end deffn

@node Unittest API,고급 API,기본 API,doctest — 대화형 파이썬 예제 테스트
@anchor{library/doctest doctest-unittest-api}@anchor{45c5}@anchor{library/doctest unittest-api}@anchor{45c6}
@subsubsection Unittest API


As your collection of doctest’ed modules grows, you’ll want a way to run all
their doctests systematically.  @code{doctest} provides two functions that can
be used to create @ref{10c,,unittest} test suites from modules and text files
containing doctests.  To integrate with @code{unittest} test discovery, include
a @ref{45c7,,load_tests} function in your test module:

@example
import unittest
import doctest
import my_module_with_doctests

def load_tests(loader, tests, ignore):
    tests.addTests(doctest.DocTestSuite(my_module_with_doctests))
    return tests
@end example

Doctest가 있는 텍스트 파일과 모듈로부터 @ref{ff4,,unittest.TestSuite} 인스턴스를 만드는 두 가지 주요 함수가 있습니다:

@geindex DocFileSuite() (doctest 모듈)
@anchor{library/doctest doctest DocFileSuite}@anchor{45c8}
@deffn {함수} doctest.DocFileSuite (*paths, module_relative=True, package=None, setUp=None, tearDown=None, globs=None, optionflags=0, parser=DocTestParser(), encoding=None)

하나 이상의 텍스트 파일로부터 doctest 테스트를 @ref{ff4,,unittest.TestSuite}로 변환합니다.

The returned @ref{ff4,,unittest.TestSuite} is to be run by the unittest framework
and runs the interactive examples in each file.  If an example in any file
fails, then the synthesized unit test fails, and a @ref{45c9,,failureException}
exception is raised showing the name of the file containing the test and a
(sometimes approximate) line number.  If all the examples in a file are
skipped, then the synthesized unit test is also marked as skipped.

검사할 텍스트 파일을 하나 이상의 paths(문자열)로 전달합니다.

옵션은 키워드 인자로 제공될 수 있습니다:

선택적 인자 `module_relative'는 `paths'에 있는 파일명을 해석하는 방법을 지정합니다:


@itemize *

@item 
`module_relative'가 @code{True}(기본값)이면, `paths'의 각 파일명은 OS 독립적 모듈 상대 경로를 지정합니다. 기본적으로, 이 경로는 호출하는 모듈의 디렉터리에 상대적입니다; 그러나 `package' 인자가 지정되면, 해당 패키지에 상대적입니다. OS 독립성을 보장하기 위해, 각 파일명은 @code{/} 문자를 사용하여 경로 세그먼트를 분리해야 하며, 절대 경로일 수 없습니다 (즉, @code{/}로 시작할 수 없습니다).

@item 
`module_relative'가 @code{False}이면, `paths'의 각 파일명은 OS 특정 경로를 지정합니다. 경로는 절대나 상대일 수 있습니다; 상대 경로는 현재 작업 디렉터리를 기준으로 해석됩니다.
@end itemize

선택적 인자 `package'는 디렉터리가 `paths'의 모듈 상대 파일명의 기본 디렉터리로 사용될 파이썬 패키지나 파이썬 패키지의 이름입니다. 패키지를 지정하지 않으면, 호출하는 모듈의 디렉터리가 모듈 상대 파일명의 기본 디렉터리로 사용됩니다. `module_relative'가 @code{False}일 때 `package'를 지정하는 것은 에러입니다.

Optional argument `setUp' specifies a set-up function for the test suite.
This is called before running the tests in each file.  The `setUp' function
will be passed a @ref{1a29,,DocTest} object.  The `setUp' function can access the
test globals as the @ref{45ca,,globs} attribute of the test passed.

Optional argument `tearDown' specifies a tear-down function for the test
suite.  This is called after running the tests in each file.  The `tearDown'
function will be passed a @ref{1a29,,DocTest} object.  The `tearDown' function can
access the test globals as the @ref{45ca,,globs} attribute of the test
passed.

선택적 인자 `globs'는 테스트의 초기 전역 변수를 포함하는 딕셔너리입니다. 이 딕셔너리의 새 사본이 테스트마다 만들어집니다. 기본적으로, `globs'는 새로운 빈 딕셔너리입니다.

선택적 인자 `optionflags'는 테스트에 대한 기본 doctest 옵션을 지정하는데, 개별 옵션 플래그를 함께 OR 해서 만들어집니다. @ref{1132,,옵션 플래그} 절을 참조하십시오. 보고(reporting) 옵션을 설정하는 더 좋은 방법은 아래 함수 @ref{45cb,,set_unittest_reportflags()}를 참조하십시오.

선택적 인자 `parser'는 파일에서 테스트를 추출하는 데 사용할 @ref{45aa,,DocTestParser}(또는 서브 클래스)를 지정합니다. 기본값은 일반 파서(즉, @code{DocTestParser()})입니다.

선택적 인자 `encoding'은 파일을 유니코드로 변환하는 데 사용할 인코딩을 지정합니다.

전역 @code{__file__}이 @ref{45c8,,DocFileSuite()}를 사용하여 텍스트 파일에서 로드된 doctest에 제공된 전역에 추가됩니다.
@end deffn

@geindex DocTestSuite() (doctest 모듈)
@anchor{library/doctest doctest DocTestSuite}@anchor{ff3}
@deffn {함수} doctest.DocTestSuite (module=None, globs=None, extraglobs=None, test_finder=None, setUp=None, tearDown=None, optionflags=0, checker=None)

모듈에 대한 doctest 테스트를 @ref{ff4,,unittest.TestSuite}로 변환합니다.

The returned @ref{ff4,,unittest.TestSuite} is to be run by the unittest framework
and runs each doctest in the module.
Each docstring is run as a separate unit test.
If any of the doctests fail, then the synthesized unit test fails,
and a @ref{45c9,,unittest.TestCase.failureException} exception is raised
showing the name of the file containing the test and a (sometimes approximate)
line number.  If all the examples in a docstring are skipped, then the

선택적 인자 `module'은 테스트할 모듈을 제공합니다. 모듈 객체나 (점으로 구분될 수 있는) 모듈 이름일 수 있습니다. 지정하지 않으면, 이 함수를 호출하는 모듈이 사용됩니다.

Optional argument `globs' is a dictionary containing the initial global
variables for the tests.  A new copy of this dictionary is created for each
test.  By default, `globs' is the module’s @ref{236c,,__dict__}.

선택적 인자 `extraglobs'는 `globs'에 병합되는 전역 변수의 추가 집합을 지정합니다. 기본적으로, 추가 전역 변수는 사용되지 않습니다.

선택적 인자 `test_finder'는 모듈에서 doctest를 추출하는 데 사용되는 @ref{19a8,,DocTestFinder} 객체(또는 드롭 인 대체)입니다.

Optional arguments `setUp', `tearDown', and `optionflags' are the same as for
function @ref{45c8,,DocFileSuite()} above, but they are called for each docstring.

이 함수는 @ref{1672,,testmod()}와 같은 검색 기법을 사용합니다.


버전 3.5에서 변경: `module'에 독스트링이 없으면 @ref{ff3,,DocTestSuite()}는 @ref{2ec,,ValueError}를 발생시키는 대신 빈 @ref{ff4,,unittest.TestSuite}를 반환합니다.

@end deffn

수면 아래에서, @ref{ff3,,DocTestSuite()}는 @code{doctest.DocTestCase} 인스턴스에서 @ref{ff4,,unittest.TestSuite}를 만들고, @code{DocTestCase}는 @ref{2b3,,unittest.TestCase}의 서브 클래스입니다. @code{DocTestCase}는 여기에서 설명되지는 않지만 (내부 세부 사항입니다), 그것의 코드를 살펴보면 @ref{10c,,unittest} 통합의 정확한 세부 사항에 대한 질문에 대한 답을 얻을 수 있습니다.

마찬가지로, @ref{45c8,,DocFileSuite()}는 @code{doctest.DocFileCase} 인스턴스에서 @ref{ff4,,unittest.TestSuite}를 만들고, @code{DocFileCase}는 @code{DocTestCase}의 서브 클래스입니다.

So both ways of creating a @ref{ff4,,unittest.TestSuite} run instances of
@code{DocTestCase}.  This is important for a subtle reason: when you run
@code{doctest} functions yourself, you can control the @code{doctest} options in
use directly, by passing option flags to @code{doctest} functions.  However, if
you’re writing a @ref{10c,,unittest} framework, @code{unittest} ultimately controls
when and how tests get run.  The framework author typically wants to control
@code{doctest} reporting options (perhaps, e.g., specified by command line
options), but there’s no way to pass options through @code{unittest} to
@code{doctest} test runners.

For this reason, @code{doctest} also supports a notion of @code{doctest}
reporting flags specific to @ref{10c,,unittest} support, via this function:

@geindex set_unittest_reportflags() (doctest 모듈)
@anchor{library/doctest doctest set_unittest_reportflags}@anchor{45cb}
@deffn {함수} doctest.set_unittest_reportflags (flags)

Set the @code{doctest} reporting flags to use.

인자 `flags'는 옵션 플래그의 @ref{24cd,,비트별 OR}를 취합니다. @ref{1132,,옵션 플래그} 절을 참조하십시오. “보고 플래그”만 사용할 수 있습니다.

This is a module-global setting, and affects all future doctests run by module
@ref{10c,,unittest}:  the @code{runTest()} method of @code{DocTestCase} looks at
the option flags specified for the test case when the @code{DocTestCase}
instance was constructed.  If no reporting flags were specified (which is the
typical and expected case), @code{doctest}’s @code{unittest} reporting flags are
@ref{24cd,,bitwise ORed} into the option flags, and the option flags
so augmented are passed to the @ref{45b9,,DocTestRunner} instance created to
run the doctest.  If any reporting flags were specified when the
@code{DocTestCase} instance was constructed, @code{doctest}’s
@code{unittest} reporting flags are ignored.

함수가 호출되기 전에 유효했던 @ref{10c,,unittest} 보고 플래그의 값이 함수에 의해 반환됩니다.
@end deffn

@node 고급 API,디버깅,Unittest API,doctest — 대화형 파이썬 예제 테스트
@anchor{library/doctest advanced-api}@anchor{45cc}@anchor{library/doctest doctest-advanced-api}@anchor{45cd}
@subsubsection 고급 API


기본 API는 doctest를 사용하기 쉽게 하기 위한 간단한 래퍼입니다. 그것은 매우 유연하며, 대부분 사용자의 요구를 충족시켜야 합니다; 그러나, 테스팅에 대한 세밀한 제어가 필요하거나, doctest의 기능을 확장하려면, 고급 API를 사용해야 합니다.

고급 API는 doctest 케이스에서 추출한 대화식 예제를 저장하는 데 사용되는 두 개의 컨테이너 클래스를 중심으로 돌아갑니다:


@itemize *

@item 
@ref{45ce,,Example}: 예상 출력과 쌍을 이루는 단일 파이썬 @ref{2c23,,문장}.

@item 
@ref{1a29,,DocTest}: 일반적으로 단일 독스트링이나 텍스트 파일에서 추출된 @ref{45ce,,Example}의 모음.
@end itemize

doctest 예제를 찾고, 구문 분석하고, 실행하고, 검사하기 위해 추가 처리 클래스가 정의됩니다:


@itemize *

@item 
@ref{19a8,,DocTestFinder}: 주어진 모듈에서 모든 독스트링을 찾고, @ref{45aa,,DocTestParser}를 사용하여 대화식 예제가 들어있는 모든 독스트링에서 @ref{1a29,,DocTest}를 만듭니다.

@item 
@ref{45aa,,DocTestParser}: 문자열(가령 객체의 독스트링)에서 @ref{1a29,,DocTest} 객체를 만듭니다.

@item 
@ref{45b9,,DocTestRunner}: @ref{1a29,,DocTest}에 있는 예제를 실행하고, @ref{45b8,,OutputChecker}를 사용하여 출력을 확인합니다.

@item 
@ref{45b8,,OutputChecker}: doctest 예제의 실제 출력을 예상 출력과 비교하고, 그들이 일치하는지 결정합니다.
@end itemize

이러한 처리 클래스 간의 관계는 다음 도표에 요약되어 있습니다:

@example
list of:
+------+                   +---------+
|module| --DocTestFinder-> | DocTest | --DocTestRunner-> results
+------+    |        ^     +---------+     |       ^    (printed)
            |        |     | Example |     |       |
            v        |     |   ...   |     v       |
           DocTestParser   | Example |   OutputChecker
                           +---------+
@end example

@menu
* DocTest 객체:: 
* Example 객체:: 
* DocTestFinder 객체:: 
* DocTestParser 객체:: 
* TestResults 객체:: 
* DocTestRunner 객체:: 
* OutputChecker 객체:: 

@end menu

@node DocTest 객체,Example 객체,,고급 API
@anchor{library/doctest doctest-doctest}@anchor{45cf}@anchor{library/doctest doctest-objects}@anchor{45d0}
@subsubsection DocTest 객체


@geindex DocTest (doctest 클래스)
@anchor{library/doctest doctest DocTest}@anchor{1a29}
@deffn {클래스} doctest.DocTest (examples, globs, name, filename, lineno, docstring)

단일 이름 공간에서 실행되어야 하는 doctest 예제의 모음. 생성자 인자는 같은 이름의 어트리뷰트를 초기화하는 데 사용됩니다.

@ref{1a29,,DocTest}는 다음 어트리뷰트를 정의합니다. 이들은 생성자에 의해 초기화되며, 직접 수정하면 안 됩니다.

@geindex examples (doctest.DocTest의 속성)
@anchor{library/doctest doctest DocTest examples}@anchor{45d1}
@deffn {속성} examples

이 테스트가 실행해야 하는 개별 대화형 파이썬 예제를 인코딩하는 @ref{45ce,,Example} 객체의 리스트.
@end deffn

@geindex globs (doctest.DocTest의 속성)
@anchor{library/doctest doctest DocTest globs}@anchor{45ca}
@deffn {속성} globs

예제가 실행되어야 하는 이름 공간 (일명 전역). 이름을 값에 매핑하는 딕셔너리입니다. 예제가 만든 이름 공간의 모든 변경 사항(가령 새 변수 바인딩)은 테스트가 실행된 후 @ref{45ca,,globs}에 반영됩니다.
@end deffn

@geindex name (doctest.DocTest의 속성)
@anchor{library/doctest doctest DocTest name}@anchor{45d2}
@deffn {속성} name

@ref{1a29,,DocTest}를 식별하는 문자열 이름. 일반적으로, 테스트가 추출된 객체나 파일의 이름입니다.
@end deffn

@geindex filename (doctest.DocTest의 속성)
@anchor{library/doctest doctest DocTest filename}@anchor{45d3}
@deffn {속성} filename

The name of the file that this @code{DocTest} was extracted from; or
@code{None} if the filename is unknown, or if the @code{DocTest} was not
extracted from a file.
@end deffn

@geindex lineno (doctest.DocTest의 속성)
@anchor{library/doctest doctest DocTest lineno}@anchor{17cd}
@deffn {속성} lineno

이 @ref{1a29,,DocTest}가 시작되는 @ref{45d3,,filename} 내의 줄 번호, 또는 줄 번호가 없으면 @code{None}. 이 줄 번호는 파일의 시작 부분을 기준으로 0에서 시작합니다.
@end deffn

@geindex docstring (doctest.DocTest의 속성)
@anchor{library/doctest doctest DocTest docstring}@anchor{45d4}
@deffn {속성} docstring

테스트가 추출된 문자열, 또는 문자열이 없거나 테스트가 문자열에서 추출되지 않았으면 @code{None}.
@end deffn
@end deffn

@node Example 객체,DocTestFinder 객체,DocTest 객체,고급 API
@anchor{library/doctest doctest-example}@anchor{45d5}@anchor{library/doctest example-objects}@anchor{45d6}
@subsubsection Example 객체


@geindex Example (doctest 클래스)
@anchor{library/doctest doctest Example}@anchor{45ce}
@deffn {클래스} doctest.Example (source, want, exc_msg=None, lineno=0, indent=0, options=None)

파이썬 문장과 예상 출력으로 구성된 단일 대화형 예제. 생성자 인자는 같은 이름의 어트리뷰트를 초기화하는 데 사용됩니다.

@ref{45ce,,Example}는 다음 어트리뷰트를 정의합니다. 이들은 생성자에 의해 초기화되며, 직접 수정하면 안 됩니다.

@geindex source (doctest.Example의 속성)
@anchor{library/doctest doctest Example source}@anchor{45d7}
@deffn {속성} source

예제의 소스 코드가 포함된 문자열. 이 소스 코드는 단일 파이썬 문으로 구성되며 항상 개행으로 끝납니다; 생성자는 필요하면 개행 문자를 추가합니다.
@end deffn

@geindex want (doctest.Example의 속성)
@anchor{library/doctest doctest Example want}@anchor{45d8}
@deffn {속성} want

예제의 소스 코드를 실행할 때 (stdout이나 예외 발생 시 트레이스백으로부터) 예상되는 출력. @ref{45d8,,want}는 출력이 예상되지 않으면 빈 문자열이고, 그렇지 않으면 개행으로 끝납니다. 생성자는 필요하면 개행을 추가합니다.
@end deffn

@geindex exc_msg (doctest.Example의 속성)
@anchor{library/doctest doctest Example exc_msg}@anchor{45d9}
@deffn {속성} exc_msg

예제가 예외를 생성할 것으로 예상되면, 예제에서 생성된 예외 메시지; 또는 예외를 생성할 것으로 예상되지 않으면 @code{None}. 이 예외 메시지는 @ref{a4e,,traceback.format_exception_only()}의 반환 값과 비교됩니다. @ref{45d9,,exc_msg}는 @code{None}이 아니면 개행으로 끝납니다. 생성자는 필요하면 개행을 추가합니다.
@end deffn

@geindex lineno (doctest.Example의 속성)
@anchor{library/doctest doctest Example lineno}@anchor{45da}
@deffn {속성} lineno

이 예제가 시작하는 이 예제를 포함하는 문자열 내의 줄 번호. 이 줄 번호는 포함하는 문자열의 시작 부분을 기준으로 0에서 시작합니다.
@end deffn

@geindex indent (doctest.Example의 속성)
@anchor{library/doctest doctest Example indent}@anchor{45db}
@deffn {속성} indent

포함하는 문자열 내에서의 이 예제의 들여쓰기, 즉 예제의 첫 번째 프롬프트 앞에 오는 스페이스 문자의 수.
@end deffn

@geindex options (doctest.Example의 속성)
@anchor{library/doctest doctest Example options}@anchor{45dc}
@deffn {속성} options

옵션 플래그에서 @code{True}나 @code{False} 로 매핑하는 딕셔너리, 이 예제의 기본 옵션을 재정의하는 데 사용됩니다. 이 딕셔너리에 포함되지 않은 옵션 플래그는 (@ref{45b9,,DocTestRunner}의 @ref{1132,,optionflags}에 지정된 대로) 기본값으로 남습니다. 기본적으로, 아무런 옵션도 설정되지 않습니다.
@end deffn
@end deffn

@node DocTestFinder 객체,DocTestParser 객체,Example 객체,고급 API
@anchor{library/doctest doctest-doctestfinder}@anchor{45dd}@anchor{library/doctest doctestfinder-objects}@anchor{45de}
@subsubsection DocTestFinder 객체


@geindex DocTestFinder (doctest 클래스)
@anchor{library/doctest doctest DocTestFinder}@anchor{19a8}
@deffn {클래스} doctest.DocTestFinder (verbose=False, parser=DocTestParser(), recurse=True, exclude_empty=True)

주어진 객체에 관련된 @ref{1a29,,DocTest}를 그것의 독스트링과 그것이 포함하는 객체의 독스트링으로부터 추출하기 위해서 사용되는 처리 클래스. @code{DocTest}는 모듈, 클래스, 함수, 메서드, 정적 메서드, 클래스 메서드 및 프로퍼티에서 추출할 수 있습니다.

선택적 인자 `verbose'는 파인더가 검색한 객체를 표시하는 데 사용될 수 있습니다. 기본값은 @code{False} (출력 없음)입니다.

선택적 인자 `parser'는 독스트링에서 doctest를 추출하는 데 사용되는 @ref{45aa,,DocTestParser} 객체 (또는 드롭 인 대체)를 지정합니다.

선택적 인자 `recurse'가 거짓이면, @ref{1a6f,,DocTestFinder.find()}는 오직 주어진 객체만을 검사 할 뿐, 포함된 객체는 검사하지 않습니다.

선택적 인자 `exclude_empty'가 거짓이면, @ref{1a6f,,DocTestFinder.find()}는 빈 독스트링을 가진 객체에 대한 테스트를 포함합니다.

@ref{19a8,,DocTestFinder}는 다음 메서드를 정의합니다:

@geindex find() (doctest.DocTestFinder 메서드)
@anchor{library/doctest doctest DocTestFinder find}@anchor{1a6f}
@deffn {메서드} find (obj[, name][, module][, globs][, extraglobs])

`obj'의 독스트링이나 포함된 객체의 독스트링으로 정의된 @ref{1a29,,DocTest}의 리스트를 반환합니다.

선택적 인자 `name'은 객체의 이름을 지정합니다. 이 이름은 반환된 @ref{1a29,,DocTest}의 이름을 구성하는 데 사용됩니다. `name'이 지정되지 않으면, @code{obj.__name__}이 사용됩니다.

선택적 매개 변수 `module'은 주어진 객체를 포함하는 모듈입니다. 모듈이 지정되지 않거나 @code{None}이면, 테스트 파인더는 자동으로 올바른 모듈을 판별하려고 시도합니다. 객체의 모듈은 다음과 같이 사용됩니다:


@itemize *

@item 
`globs'가 지정되지 않으면, 기본 이름 공간으로.

@item 
DocTestFinder가 다른 모듈에서 임포트 된 객체에서 DocTest를 추출하지 못하도록 하려고. (`module'이 아닌 다른 모듈을 가진 포함 된 객체는 무시됩니다.)

@item 
객체를 포함하는 파일의 이름을 찾으려고.

@item 
해당 파일 내에서 객체의 줄 번호를 찾는 데 도움이 됩니다.
@end itemize

`module'이 @code{False}면, 모듈을 찾으려고 시도하지 않습니다. 이것은 눈에 띄지 않는데, 대부분 doctest 자체를 테스트할 때 사용합니다: `module'이 @code{False}이거나, @code{None}이지만 자동으로 찾을 수 없으면, 모든 객체는 (존재하지 않는) 모듈에 속한 것으로 간주하므로, 포함된 모든 객체에서 (재귀적으로) doctest를 검색합니다.

The globals for each @ref{1a29,,DocTest} is formed by combining `globs' and
`extraglobs' (bindings in `extraglobs' override bindings in `globs').  A new
shallow copy of the globals dictionary is created for each @code{DocTest}.
If `globs' is not specified, then it defaults to the module’s
@ref{236c,,__dict__}, if specified, or @code{@{@}} otherwise.
If `extraglobs' is not specified, then it defaults to @code{@{@}}.
@end deffn
@end deffn

@node DocTestParser 객체,TestResults 객체,DocTestFinder 객체,고급 API
@anchor{library/doctest doctest-doctestparser}@anchor{45df}@anchor{library/doctest doctestparser-objects}@anchor{45e0}
@subsubsection DocTestParser 객체


@geindex DocTestParser (doctest 클래스)
@anchor{library/doctest doctest DocTestParser}@anchor{45aa}
@deffn {클래스} doctest.DocTestParser

문자열에서 대화형 예제를 추출하고, 이를 사용하여 @ref{1a29,,DocTest} 객체를 만드는 데 사용되는 처리 클래스.

@ref{45aa,,DocTestParser}는 다음 메서드를 정의합니다:

@geindex get_doctest() (doctest.DocTestParser 메서드)
@anchor{library/doctest doctest DocTestParser get_doctest}@anchor{45e1}
@deffn {메서드} get_doctest (string, globs, name, filename, lineno)

주어진 문자열에서 모든 doctest 예제를 추출하고, 이를 @ref{1a29,,DocTest} 객체로 모읍니다.

`globs', `name', `filename', and `lineno' are attributes for the new
@code{DocTest} object.  See the documentation for @ref{1a29,,DocTest} for more
information.
@end deffn

@geindex get_examples() (doctest.DocTestParser 메서드)
@anchor{library/doctest doctest DocTestParser get_examples}@anchor{45e2}
@deffn {메서드} get_examples (string, name='<string>')

주어진 문자열에서 모든 doctest 예제를 추출하고, 이를 @ref{45ce,,Example} 객체의 리스트로 반환합니다. 줄 번호는 0부터 시작합니다. 선택적 인자 `name'은, 이 문자열을 식별하는 이름이며, 에러 메시지에만 사용됩니다.
@end deffn

@geindex parse() (doctest.DocTestParser 메서드)
@anchor{library/doctest doctest DocTestParser parse}@anchor{45e3}
@deffn {메서드} parse (string, name='<string>')

Divide the given string into examples and intervening text, and return them as
a list of alternating @ref{45ce,,Example}s and strings. Line numbers for the
@code{Example}s are 0-based.  The optional argument `name' is a name
identifying this string, and is only used for error messages.
@end deffn
@end deffn

@node TestResults 객체,DocTestRunner 객체,DocTestParser 객체,고급 API
@anchor{library/doctest testresults-objects}@anchor{45e4}
@subsubsection TestResults 객체


@geindex TestResults (doctest 클래스)
@anchor{library/doctest doctest TestResults}@anchor{45e5}
@deffn {클래스} doctest.TestResults (failed, attempted)

@geindex failed (doctest.TestResults의 속성)
@anchor{library/doctest doctest TestResults failed}@anchor{45e6}
@deffn {속성} failed

Number of failed tests.
@end deffn

@geindex attempted (doctest.TestResults의 속성)
@anchor{library/doctest doctest TestResults attempted}@anchor{45e7}
@deffn {속성} attempted

Number of attempted tests.
@end deffn

@geindex skipped (doctest.TestResults의 속성)
@anchor{library/doctest doctest TestResults skipped}@anchor{4f0}
@deffn {속성} skipped

Number of skipped tests.


Added in version 3.13.

@end deffn
@end deffn

@node DocTestRunner 객체,OutputChecker 객체,TestResults 객체,고급 API
@anchor{library/doctest doctest-doctestrunner}@anchor{45e8}@anchor{library/doctest doctestrunner-objects}@anchor{45e9}
@subsubsection DocTestRunner 객체


@geindex DocTestRunner (doctest 클래스)
@anchor{library/doctest doctest DocTestRunner}@anchor{45b9}
@deffn {클래스} doctest.DocTestRunner (checker=None, verbose=None, optionflags=0)

@ref{1a29,,DocTest}에 있는 대화형 예제를 실행하고 검증하는 데 사용되는 처리 클래스.

The comparison between expected outputs and actual outputs is done by an
@ref{45b8,,OutputChecker}.  This comparison may be customized with a number of
option flags; see section @ref{1132,,옵션 플래그} for more information.  If the
option flags are insufficient, then the comparison may also be customized by
passing a subclass of @code{OutputChecker} to the constructor.

테스트 실행기의 디스플레이 출력은 두 가지 방법으로 제어할 수 있습니다. 첫째, 출력 함수를 @ref{4ee,,run()}로 전달할 수 있습니다; 이 함수는 표시되어야 하는 문자열로 호출됩니다. 기본값은 @code{sys.stdout.write}입니다. 출력을 캡처하는 것으로 충분하지 않으면, DocTestRunner를 서브 클래싱하고 @ref{45ea,,report_start()}, @ref{45eb,,report_success()}, @ref{45ec,,report_unexpected_exception()} 및 @ref{45ed,,report_failure()} 메서드를 재정의하여 디스플레이 출력을 사용자 정의할 수 있습니다.

선택적 키워드 인자 `checker'는 예상 출력을 doctest 예제의 실제 출력과 비교하는 데 사용되는 @ref{45b8,,OutputChecker} 객체(또는 드롭 인 대체)를 지정합니다.

선택적 키워드 인자 `verbose'는 @ref{45b9,,DocTestRunner}의 상세도를 제어합니다. `verbose'가 @code{True}이면, 실행될 때 각 예제에 대한 정보가 인쇄됩니다. `verbose'가 @code{False}이면, 실패만 인쇄됩니다. `verbose'가 지정되지 않거나 @code{None}이면, 명령 줄 스위치 @code{-v}가 사용될 때만 상세 출력이 사용됩니다.

선택적 키워드 인자 `optionflags'는 테스트 실행기가 예상 출력을 실제 출력과 비교하는 방법과 실패를 표시하는 방법을 제어하는 데 사용할 수 있습니다. 자세한 내용은 @ref{1132,,옵션 플래그} 절을 참조하십시오.

The test runner accumulates statistics. The aggregated number of attempted,
failed and skipped examples is also available via the @ref{45ee,,tries},
@ref{45ef,,failures} and @ref{4ef,,skips} attributes. The @ref{4ee,,run()} and
@ref{45c3,,summarize()} methods return a @ref{45e5,,TestResults} instance.

@ref{45b9,,DocTestRunner}는 다음 메서드를 정의합니다:

@geindex report_start() (doctest.DocTestRunner 메서드)
@anchor{library/doctest doctest DocTestRunner report_start}@anchor{45ea}
@deffn {메서드} report_start (out, test, example)

테스트 러너가 주어진 예제를 처리하려고 한다고 보고합니다. 이 메서드는 @ref{45b9,,DocTestRunner}의 서브 클래스가 출력을 사용자 정의할 수 있도록 제공됩니다; 직접 호출해서는 안 됩니다.

`example' is the example about to be processed.  `test' is the test
containing `example'.  `out' is the output function that was passed to
@ref{4ee,,DocTestRunner.run()}.
@end deffn

@geindex report_success() (doctest.DocTestRunner 메서드)
@anchor{library/doctest doctest DocTestRunner report_success}@anchor{45eb}
@deffn {메서드} report_success (out, test, example, got)

주어진 예제가 성공적으로 실행되었음을 보고합니다. 이 메서드는 @ref{45b9,,DocTestRunner}의 서브 클래스가 출력을 사용자 정의할 수 있도록 제공됩니다; 직접 호출해서는 안 됩니다.

`example'은 처리될 예제입니다. `got'은 예제의 실제 출력입니다. `test'는 `example'을 포함하는 테스트입니다. `out'은 @ref{4ee,,DocTestRunner.run()}에 전달된 출력 함수입니다.
@end deffn

@geindex report_failure() (doctest.DocTestRunner 메서드)
@anchor{library/doctest doctest DocTestRunner report_failure}@anchor{45ed}
@deffn {메서드} report_failure (out, test, example, got)

주어진 예제가 실패했음을 보고합니다. 이 메서드는 @ref{45b9,,DocTestRunner}의 서브 클래스가 출력을 사용자 정의할 수 있도록 제공됩니다; 직접 호출해서는 안 됩니다.

`example'은 처리될 예제입니다. `got'은 예제의 실제 출력입니다. `test'는 `example'을 포함하는 테스트입니다. `out'은 @ref{4ee,,DocTestRunner.run()}에 전달된 출력 함수입니다.
@end deffn

@geindex report_unexpected_exception() (doctest.DocTestRunner 메서드)
@anchor{library/doctest doctest DocTestRunner report_unexpected_exception}@anchor{45ec}
@deffn {메서드} report_unexpected_exception (out, test, example, exc_info)

주어진 예제가 예기치 않은 예외를 발생시켰다고 보고합니다. 이 메서드는 @ref{45b9,,DocTestRunner}의 서브 클래스가 출력을 사용자 정의할 수 있도록 제공됩니다; 직접 호출해서는 안 됩니다.

`example'은 처리될 예제입니다. `exc_info'는 예기치 않은 예외에 대한 정보를 포함하는 튜플입니다 (@ref{899,,sys.exc_info()}에 의해 반환되는 것). `test'는 `example'을 포함하는 테스트입니다. `out'은 @ref{4ee,,DocTestRunner.run()}에 전달된 출력 함수입니다.
@end deffn

@geindex run() (doctest.DocTestRunner 메서드)
@anchor{library/doctest doctest DocTestRunner run}@anchor{4ee}
@deffn {메서드} run (test, compileflags=None, out=None, clear_globs=True)

`test'(@ref{1a29,,DocTest} 객체)에 있는 예제를 실행하고, 출력 함수 `out'을 사용하여 결과를 표시합니다. @ref{45e5,,TestResults} 인스턴스를 반환합니다.

예제는 이름 공간 @code{test.globs}에서 실행됩니다. `clear_globs'가 참(기본값)이면, 가비지 수집을 돕기 위해 테스트가 실행된 후 이 이름 공간이 지워집니다. 테스트가 완료된 후에 이름 공간을 검사하려면 `clear_globs=False'를 사용하십시오.

`compileflags'는 예제를 실행할 때 파이썬 컴파일러에서 사용해야 하는 플래그 집합을 제공합니다. 지정되지 않으면, `globs'에 적용되는 퓨처-임포트 플래그 집합이 기본값이 됩니다.

각 예제의 출력은 @ref{45b9,,DocTestRunner}의 출력 검사기를 사용하여 검사되며, 결과는 @code{DocTestRunner.report_*()} 메서드로 포맷됩니다.
@end deffn

@geindex summarize() (doctest.DocTestRunner 메서드)
@anchor{library/doctest doctest DocTestRunner summarize}@anchor{45c3}
@deffn {메서드} summarize (verbose=None)

이 DocTestRunner가 실행 한 모든 테스트 케이스의 요약을 인쇄하고, @ref{45e5,,TestResults} 인스턴스를 반환합니다.

선택적 `verbose' 인자는 요약이 얼마나 상세할지를 제어합니다. 상세도가 지정되지 않으면, @ref{45b9,,DocTestRunner}의 상세도가 사용됩니다.
@end deffn

@ref{45aa,,DocTestParser}는 다음과 같은 어트리뷰트를 갖습니다:

@geindex tries (doctest.DocTestRunner의 속성)
@anchor{library/doctest doctest DocTestRunner tries}@anchor{45ee}
@deffn {속성} tries

Number of attempted examples.
@end deffn

@geindex failures (doctest.DocTestRunner의 속성)
@anchor{library/doctest doctest DocTestRunner failures}@anchor{45ef}
@deffn {속성} failures

Number of failed examples.
@end deffn

@geindex skips (doctest.DocTestRunner의 속성)
@anchor{library/doctest doctest DocTestRunner skips}@anchor{4ef}
@deffn {속성} skips

Number of skipped examples.


Added in version 3.13.

@end deffn
@end deffn

@node OutputChecker 객체,,DocTestRunner 객체,고급 API
@anchor{library/doctest doctest-outputchecker}@anchor{45f0}@anchor{library/doctest outputchecker-objects}@anchor{45f1}
@subsubsection OutputChecker 객체


@geindex OutputChecker (doctest 클래스)
@anchor{library/doctest doctest OutputChecker}@anchor{45b8}
@deffn {클래스} doctest.OutputChecker

doctest 예제의 실제 출력이 예상 출력과 일치하는지를 확인하는 데 사용되는 클래스. @ref{45b8,,OutputChecker}는 두 가지 메서드를 정의합니다: @ref{45f2,,check_output()}은 주어진 출력 쌍을 비교하고 일치하면 @code{True}를 반환합니다; @ref{45f3,,output_difference()}는 두 출력 간의 차이를 설명하는 문자열을 반환합니다.

@ref{45b8,,OutputChecker}는 다음 메서드를 정의합니다:

@geindex check_output() (doctest.OutputChecker 메서드)
@anchor{library/doctest doctest OutputChecker check_output}@anchor{45f2}
@deffn {메서드} check_output (want, got, optionflags)

예제의 실제 출력(`got')이 예상 출력(`want')과 일치할 때만 @code{True}를 반환합니다. 이 문자열은 같으면 항상 일치하는 것으로 간주합니다; 그러나 테스트 실행기가 사용하는 옵션 플래그에 따라 몇 가지 정확하지 않은 일치 유형도 가능합니다. 옵션 플래그에 대한 자세한 정보는 @ref{1132,,옵션 플래그} 절을 참조하십시오.
@end deffn

@geindex output_difference() (doctest.OutputChecker 메서드)
@anchor{library/doctest doctest OutputChecker output_difference}@anchor{45f3}
@deffn {메서드} output_difference (example, got, optionflags)

주어진 예제(`example')에 대한 예상 출력과 실제 출력(`got')의 차이를 설명하는 문자열을 반환합니다. `optionflags'는 `want'와 `got'을 비교하는 데 사용되는 옵션 플래그 집합입니다.
@end deffn
@end deffn

@node 디버깅,맺음말<2>,고급 API,doctest — 대화형 파이썬 예제 테스트
@anchor{library/doctest debugging}@anchor{45f4}@anchor{library/doctest doctest-debugging}@anchor{45f5}
@subsubsection 디버깅


Doctest는 doctest 예제를 디버깅하기 위한 몇 가지 메커니즘을 제공합니다:


@itemize *

@item 
몇몇 함수는 doctest를 파이썬 디버거 @ref{aa,,pdb}에서 실행할 수 있는 실행 가능한 파이썬 프로그램으로 변환합니다.

@item 
@ref{45f6,,DebugRunner} 클래스는 첫 번째 실패한 예제에 대한 예외를 발생시키는 @ref{45b9,,DocTestRunner}의 서브 클래스이며 해당 예제에 대한 정보가 들어 있습니다. 이 정보는 예제에서 사후 디버깅을 수행하는 데 사용될 수 있습니다.

@item 
@ref{ff3,,DocTestSuite()}에 의해 생성된 @ref{10c,,unittest} 케이스는 @ref{2b3,,unittest.TestCase}에 의해 정의된 @ref{45f7,,debug()} 메서드를 지원합니다.

@item 
doctest 예제에 @ref{272,,pdb.set_trace()}에 대한 호출을 추가 할 수 있습니다. 그러면 해당하는 줄이 실행될 때 파이썬 디버거로 들어갑니다. 그런 다음 변수의 현재 값을 검사하는 등의 일을 할 수 있습니다. 예를 들어, @code{a.py}가 다음과 같은 모듈 독스트링을 포함한다고 가정합시다:

@example
"""
>>> def f(x):
...     g(x*2)
>>> def g(x):
...     print(x+3)
...     import pdb; pdb.set_trace()
>>> f(3)
9
"""
@end example

그러면 대화형 파이썬 세션은 이런 식이 됩니다:

@example
>>> import a, doctest
>>> doctest.testmod(a)
--Return--
> <doctest a[1]>(3)g()->None
-> import pdb; pdb.set_trace()
(Pdb) list
  1     def g(x):
  2         print(x+3)
  3  ->     import pdb; pdb.set_trace()
[EOF]
(Pdb) p x
6
(Pdb) step
--Return--
> <doctest a[0]>(2)f()->None
-> g(x*2)
(Pdb) list
  1     def f(x):
  2  ->     g(x*2)
[EOF]
(Pdb) p x
3
(Pdb) step
--Return--
> <doctest a[2]>(1)?()->None
-> f(3)
(Pdb) cont
(0, 3)
>>>
@end example
@end itemize

Doctest를 파이썬 코드로 변환하고, 디버거에서 합성 코드를 실행할 수 있는 함수들:

@geindex script_from_examples() (doctest 모듈)
@anchor{library/doctest doctest script_from_examples}@anchor{45f8}
@deffn {함수} doctest.script_from_examples (s)

예제가 있는 텍스트를 스크립트로 변환합니다.

인자 `s'는 doctest 예제를 포함하는 문자열입니다. 문자열은 파이썬 스크립트로 변환됩니다. 여기서 `s'의 doctest 예제는 일반 코드로 변환되고, 나머지는 파이썬 주석으로 변환됩니다. 생성된 스크립트는 문자열로 반환됩니다. 예를 들어,

@example
import doctest
print(doctest.script_from_examples(r"""
    Set x and y to 1 and 2.
    >>> x, y = 1, 2

    Print their sum:
    >>> print(x+y)
    3
"""))
@end example

는 다음과 같이 출력합니다:

@example
# Set x and y to 1 and 2.
x, y = 1, 2
#
# Print their sum:
print(x+y)
# Expected:
## 3
@end example

이 함수는 다른 함수(아래 참조)에서 내부적으로 사용되지만, 대화형 파이썬 세션을 파이썬 스크립트로 변환하려고 할 때도 유용합니다.
@end deffn

@geindex testsource() (doctest 모듈)
@anchor{library/doctest doctest testsource}@anchor{45f9}
@deffn {함수} doctest.testsource (module, name)

객체에 대한 doctest를 스크립트로 변환합니다.

인자 `module'은 doctest가 관심 대상인 객체를 포함하는 모듈 객체나 모듈의 점으로 구분된 이름입니다. 인자 `name'은 doctest가 관심 대상인 객체의 (모듈 내에서의) 이름입니다. 결과는 위의 @ref{45f8,,script_from_examples()}에서 설명한 대로 파이썬 스크립트로 변환된 객체의 독스트링을 포함하는 문자열입니다. 예를 들어, 모듈 @code{a.py}에 최상위 함수 @code{f()}가 포함되었다면,

@example
import a, doctest
print(doctest.testsource(a, "a.f"))
@end example

는 doctest가 코드로 변환되고 나머지는 주석으로 배치된, 함수 @code{f()}의 독스트링의 스크립트 버전을 인쇄합니다.
@end deffn

@geindex debug() (doctest 모듈)
@anchor{library/doctest doctest debug}@anchor{45f7}
@deffn {함수} doctest.debug (module, name, pm=False)

객체의 doctest를 디버그합니다.

`module'과 `name' 인자는 위의 함수 @ref{45f9,,testsource()}와 같습니다. 명명된 객체의 독스트링에 대한 합성된 파이썬 스크립트가 임시 파일에 기록되고, 그 파일을 파이썬 디버거 @ref{aa,,pdb}의 제어하에 실행합니다.

@code{module.__dict__}의 얕은 사본이 지역과 전역 실행 컨텍스트 모두에 사용됩니다.

선택적 인자 `pm'은 사후 디버깅이 사용되는지를 제어합니다. `pm'이 참값이면, 스크립트 파일은 직접 실행되고, 처리되지 않은 예외를 발생시켜 스크립트가 종료될 때만 디버거가 개입합니다. 그럴 때, 사후 디버깅이 @ref{15df,,pdb.post_mortem()}를 통해 호출되어, 처리되지 않은 예외로부터 온 트레이스백 객체를 전달합니다. `pm'이 지정되지 않았거나 거짓이면, 스크립트는 적절한 @ref{4a3,,exec()} 호출을 @ref{45fa,,pdb.run()}에 전달하여 시작부터 디버거에서 실행됩니다.
@end deffn

@geindex debug_src() (doctest 모듈)
@anchor{library/doctest doctest debug_src}@anchor{45fb}
@deffn {함수} doctest.debug_src (src, pm=False, globs=None)

문자열에 있는 doctest를 디버그합니다.

doctest 예제를 포함하는 문자열이 `src' 인자를 통해 직접 지정된다는 점을 제외하면, 위의 함수 @ref{45f7,,debug()}과 같습니다.

선택적 인자 `pm'은 위의 함수 @ref{45f7,,debug()}에서와 같은 의미를 가집니다.

선택적 인자 `globs'는 지역과 전역 실행 컨텍스트 모두에 사용할 딕셔너리를 제공합니다. 지정되지 않거나 @code{None}이면, 빈 딕셔너리가 사용됩니다. 지정되면, 딕셔너리의 얕은 사본이 사용됩니다.
@end deffn

@ref{45f6,,DebugRunner} 클래스와 이 클래스가 발생시킬 수 있는 특별한 예외는 주로 테스트 프레임워크 작성자가 관심을 가지며, 여기에서는 대략적으로만 다룰 예정입니다. 자세한 내용은 소스 코드, 특히 @code{DebugRunner}의 독스트링(doctest입니다!)을 참조하십시오:

@geindex DebugRunner (doctest 클래스)
@anchor{library/doctest doctest DebugRunner}@anchor{45f6}
@deffn {클래스} doctest.DebugRunner (checker=None, verbose=None, optionflags=0)

실패를 만나자마자 예외를 발생시키는 @ref{45b9,,DocTestRunner}의 서브 클래스. 예기치 않은 예외가 발생하면, 테스트, 예제 및 원래 예외가 포함된 @ref{45fc,,UnexpectedException} 예외가 발생합니다. 출력이 일치하지 않으면, 테스트, 예제 및 실제 출력을 포함하는 @ref{45fd,,DocTestFailure} 예외가 발생합니다.

생성자 매개 변수와 메서드에 대한 자세한 내용은 @ref{45cd,,고급 API} 절의 @ref{45b9,,DocTestRunner} 설명서를 참조하십시오.
@end deffn

@ref{45f6,,DebugRunner} 인스턴스가 발생시킬 수 있는 두 가지 예외가 있습니다:

@geindex DocTestFailure
@anchor{library/doctest doctest DocTestFailure}@anchor{45fd}
@deffn {예외} doctest.DocTestFailure (test, example, got)

doctest 예제의 실제 출력이 예상 출력과 일치하지 않는다는 것을 알리기 위해 @ref{45b9,,DocTestRunner}가 발생시키는 예외. 생성자 인자는 같은 이름의 어트리뷰트를 초기화하는 데 사용됩니다.
@end deffn

@ref{45fd,,DocTestFailure}는 다음 어트리뷰트를 정의합니다:

@geindex test (doctest.DocTestFailure의 속성)
@anchor{library/doctest doctest DocTestFailure test}@anchor{45fe}
@deffn {속성} DocTestFailure.test

예제가 실패했을 때 실행 중이던 @ref{1a29,,DocTest} 객체.
@end deffn

@geindex example (doctest.DocTestFailure의 속성)
@anchor{library/doctest doctest DocTestFailure example}@anchor{45ff}
@deffn {속성} DocTestFailure.example

실패한 @ref{45ce,,Example}.
@end deffn

@geindex got (doctest.DocTestFailure의 속성)
@anchor{library/doctest doctest DocTestFailure got}@anchor{4600}
@deffn {속성} DocTestFailure.got

예제의 실제 출력.
@end deffn

@geindex UnexpectedException
@anchor{library/doctest doctest UnexpectedException}@anchor{45fc}
@deffn {예외} doctest.UnexpectedException (test, example, exc_info)

doctest 예제가 예기치 않은 예외를 발생시켰음을 알리기 위해 @ref{45b9,,DocTestRunner}가 발생시키는 예외. 생성자 인자는 같은 이름의 어트리뷰트를 초기화하는 데 사용됩니다.
@end deffn

@ref{45fc,,UnexpectedException}는 다음 어트리뷰트를 정의합니다:

@geindex test (doctest.UnexpectedException의 속성)
@anchor{library/doctest doctest UnexpectedException test}@anchor{4601}
@deffn {속성} UnexpectedException.test

예제가 실패했을 때 실행 중이던 @ref{1a29,,DocTest} 객체.
@end deffn

@geindex example (doctest.UnexpectedException의 속성)
@anchor{library/doctest doctest UnexpectedException example}@anchor{4602}
@deffn {속성} UnexpectedException.example

실패한 @ref{45ce,,Example}.
@end deffn

@geindex exc_info (doctest.UnexpectedException의 속성)
@anchor{library/doctest doctest UnexpectedException exc_info}@anchor{4603}
@deffn {속성} UnexpectedException.exc_info

@ref{899,,sys.exc_info()}에 의해 반환되는 것과 같은, 예기치 않은 예외에 대한 정보가 포함된 튜플.
@end deffn

@node 맺음말<2>,,디버깅,doctest — 대화형 파이썬 예제 테스트
@anchor{library/doctest doctest-soapbox}@anchor{4604}@anchor{library/doctest soapbox}@anchor{4605}
@subsubsection 맺음말


As mentioned in the introduction, @code{doctest} has grown to have three primary
uses:


@enumerate 

@item 
독스트링에 있는 예제 검사.

@item 
회귀 테스트.

@item 
실행 가능한 문서/문학적(literate) 테스트.
@end enumerate

이러한 용도들은 다른 요구 사항을 가지며, 이를 구별하는 것이 중요합니다. 특히, 모호한 테스트 케이스로 독스트링을 채우는 것은 나쁜 설명서를 만듭니다.

When writing a docstring, choose docstring examples with care. There’s an art to
this that needs to be learned—it may not be natural at first.  Examples should
add genuine value to the documentation.  A good example can often be worth many
words. If done with care, the examples will be invaluable for your users, and
will pay back the time it takes to collect them many times over as the years go
by and things change.  I’m still amazed at how often one of my @code{doctest}
examples stops working after a “harmless” change.

Doctest는 회귀 테스트를 위한 훌륭한 도구도 제공합니다. 특히 설명 텍스트를 생략하지 않는다면 더욱더 그렇습니다. 설명과 예제를 번갈아 보여줌으로써, 실제로 무엇이 왜 테스트 되는지를 추적하기가 훨씬 쉬워집니다. 테스트가 실패할 때, 좋은 설명은 문제가 무엇인지, 어떻게 고쳐야 하는지를 쉽게 파악할 수 있게 해줍니다. 코드 기반 테스트에 광범위한 주석을 쓸 수는 있는 것은 사실이지만, 그렇게 하는 프로그래머는 거의 없습니다. 많은 사람이 doctest 접근법을 사용하는 것이 훨씬 더 명확한 테스트를 유도한다는 것을 발견했습니다. 어쩌면 단순히 doctest가 설명을 작성하는 것을 코드를 작성하는 것보다 조금 더 쉽게 만들고, 코드에 주석을 쓰는 것이 조금 더 어렵기 때문일 것입니다. 저는 단지 그것보다는 더 깊이 들어간다고 생각합니다: doctest 기반 테스트를 작성할 때의 자연스러운 태도는 소프트웨어의 미세한 포인트를 설명하고 그것을 예제로 보여주는 것입니다. 이것은 자연스럽게 가장 간단한 기능으로 시작하고, 복잡하고 지엽적인 경우까지 논리적으로 진행되는 테스트 파일로 이어집니다. 무작위로 보이는 격리된 기능 조각을 테스트하는 격리된 함수들의 모음 대신에, 일관된 내러티브가 얻어집니다. 이것은 다른 태도이며, 테스트와 설명의 구별을 모호하게 하면서 다른 결과를 낳습니다.

회귀 테스트는 전용 객체나 파일로 제한하는 것이 가장 좋습니다. 테스트 구성을 위한 몇 가지 옵션이 있습니다.:


@itemize *

@item 
대화형 예제로 테스트 케이스가 들어있는 텍스트 파일을 작성하고, @ref{4599,,testfile()}이나 @ref{45c8,,DocFileSuite()}를 사용하여 파일을 테스트하십시오. doctest를 처음부터 사용하도록 고안된 새로운 프로젝트에서 가장 쉬운 방법이지만, 이 방법을 권장합니다.

@item 
명명된 주제에 대한 테스트 케이스를 포함하는 단일 독스트링으로 구성된 @code{_regrtest_topic}이라는 함수를 정의하십시오. 이 함수들은 모듈과 같은 파일에 포함되거나 별도의 테스트 파일로 분리될 수 있습니다.

@item 
Define a @ref{45a5,,__test__} dictionary mapping from regression test topics to
docstrings containing test cases.
@end itemize

테스트를 모듈에 배치할 때, 모듈 자체가 테스트 실행기가 될 수 있습니다. 테스트가 실패할 때, 문제를 디버깅하는 동안 실패한 doctest 만 다시 실행하도록 테스트 실행기를 조정할 수 있습니다. 다음은 그러한 테스트 실행기의 최소 예입니다:

@example
if __name__ == '__main__':
    import doctest
    flags = doctest.REPORT_NDIFF|doctest.FAIL_FAST
    if len(sys.argv) > 1:
        name = sys.argv[1]
        if name in globals():
            obj = globals()[name]
        else:
            obj = __test__[name]
        doctest.run_docstring_examples(obj, globals(), name=name,
                                       optionflags=flags)
    else:
        fail, total = doctest.testmod(optionflags=flags)
        print(f"@{fail@} failures out of @{total@} tests")
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node unittest — 단위 테스트 프레임워크,unittest mock — 모의 객체 라이브러리,doctest — 대화형 파이썬 예제 테스트,개발 도구
@anchor{library/unittest doc}@anchor{4606}@anchor{library/unittest module-unittest}@anchor{10c}@anchor{library/unittest translation-repo}@anchor{4607}@anchor{library/unittest unittest-unit-testing-framework}@anchor{4608}
@subsection @code{unittest} — 단위 테스트 프레임워크


@geindex module; unittest

`소스 코드:' Lib/unittest/__init__.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/unittest/__init__.py}


__________________________________________________________________


(당신이 이미 테스트 기본 개념에 친숙하다면, @ref{4609,,assert 메서드 목록}으로 건너뛰어도 좋습니다.)

The @code{unittest} unit testing framework was originally inspired by JUnit
and has a similar flavor as major unit testing frameworks in other
languages.  It supports test automation, sharing of setup and shutdown code
for tests, aggregation of tests into collections, and independence of the
tests from the reporting framework.

To achieve this, @code{unittest} supports some important concepts in an
object-oriented way:


@table @asis

@item 테스트 픽스쳐

`테스트 픽스쳐 (test fixture)'는 1개 또는 그 이상의 테스트를 수행할 때 필요한 준비와 그와 관련된 정리 동작에 해당합니다. 예를 들어 이것은 임시 또는 프락시 데이터베이스, 디렉터리를 생성하거나 서버 프로세스를 시작하는 것 등을 포함합니다.

@item 테스트 케이스

A `test case' is the individual unit of testing.  It checks for a specific
response to a particular set of inputs.  @code{unittest} provides a base class,
@ref{2b3,,TestCase}, which may be used to create new test cases.

@item 테스트 묶음

`테스트 묶음(test suite)'은 여러 테스트 케이스, 테스트 묶음, 또는 둘 다의 모임입니다. 이것은 서로 같이 실행되어야 할 테스트들을 종합하는 데 사용됩니다.

@item 테스트 실행자

`테스트 실행자(test runner)'는 테스트 실행을 조율하고 테스트 결과를 사용자에게 제공하는 역할을 하는 컴포넌트입니다. 실행자는 테스트 실행 결과를 보여주기 위해 그래픽 인터페이스, 텍스트 인터페이스를 사용하거나 특별한 값을 반환할 수도 있습니다.
@end table


@subsubheading 더 보기



@table @asis

@item @ref{3e,,doctest} 모듈

매우 다른 특징을 가지고 있는 또 다른 테스트 지원 모듈

@item Simple Smalltalk Testing: With Patterns@footnote{https://web.archive.org/web/20150315073817/http://www.xprogramming.com/testfram.htm}

Kent Beck’s original paper on testing frameworks using the pattern shared
by @code{unittest}.

@item pytest@footnote{https://docs.pytest.org/}

테스트를 작성하기에 간편한 문법을 가지고 있는 제삼자의 단위 테스트 프레임워크. 예시, @code{assert func(10) == 42}.

@item 파이썬 테스트 도구 분류@footnote{https://wiki.python.org/moin/PythonTestingToolsTaxonomy}

함수형 테스트 프레임워크와 모의 객체 라이브러리를 포함한 광범위한 파이썬 테스트 도구 목록

@item Testing in Python 메일링 리스트@footnote{http://lists.idyll.org/listinfo/testing-in-python}

파이썬에서 테스트하기와 테스트 도구에 대해 논의하는 특정-주제-그룹(special-interest-group)
@end table

파이썬 소스 배포판에 있는 @code{Tools/unittestgui/unittestgui.py} 스크립트는 테스트 탐색 및 실행을 위한 GUI 도구입니다. 이것은 단위 테스트가 처음인 사람들이 쉽게 사용할 수 있도록 만들어졌습니다. 라이브 환경에서는 Buildbot@footnote{https://buildbot.net/}, Jenkins@footnote{https://www.jenkins.io/}, GitHub Actions@footnote{https://github.com/features/actions} 또는  AppVeyor@footnote{https://www.appveyor.com/}와 같은 지속적인 통합 시스템을 이용하여 테스트가 이루어지길 추천합니다.


@menu
* 기본 예시:: 
* 명령행 인터페이스:: 
* 테스트 탐색(Discovery): 테스트 탐색 Discovery. 
* 테스트 코드 구조 잡기:: 
* 이전의 테스트 코드를 다시 사용하기:: 
* 테스트 건너뛰기와 예상된 실패:: 
* 부분 테스트(subtest)를 사용하여 테스트 반복 구별 짓기: 부분 테스트 subtest 를 사용하여 테스트 반복 구별 짓기. 
* 클래스와 함수:: 
* 클래스와 모듈 픽스쳐:: 
* 시그널 처리하기:: 

@end menu

@node 기본 예시,명령행 인터페이스,,unittest — 단위 테스트 프레임워크
@anchor{library/unittest basic-example}@anchor{460a}@anchor{library/unittest unittest-minimal-example}@anchor{460b}
@subsubsection 기본 예시


The @code{unittest} module provides a rich set of tools for constructing and
running tests.  This section demonstrates that a small subset of the tools
suffice to meet the needs of most users.

문자열 관련된 3개의 메서드를 테스트하기 위한 짧은 스크립트가 여기에 있습니다:

@example
import unittest

class TestStringMethods(unittest.TestCase):

    def test_upper(self):
        self.assertEqual('foo'.upper(), 'FOO')

    def test_isupper(self):
        self.assertTrue('FOO'.isupper())
        self.assertFalse('Foo'.isupper())

    def test_split(self):
        s = 'hello world'
        self.assertEqual(s.split(), ['hello', 'world'])
        # 구분 기호가 문자열이 아닐 때 s.split이 실패하는지 검사합니다
        with self.assertRaises(TypeError):
            s.split(2)

if __name__ == '__main__':
    unittest.main()
@end example

A test case is created by subclassing @ref{2b3,,unittest.TestCase}.  The three
individual tests are defined with methods whose names start with the letters
@code{test}.  This naming convention informs the test runner about which methods
represent tests.

각 테스트의 핵심은 기대되는 결과를 확인하기 위해 @ref{74b,,assertEqual()}를 호출, 조건을 검증하기 위해 @ref{749,,assertTrue()} 또는 @ref{74a,,assertFalse()}를 호출, 특정 예외가 발생했는지 검증하기 위해 @ref{74f,,assertRaises()}를 호출하는 것입니다. @ref{b60,,assert} 문장을 대신하여 이 메서드들을 사용하면 테스트 실행자가 모든 테스트 결과를 취합하여 리포트를 생성할 수 있습니다.

@ref{153e,,setUp()}과 @ref{153f,,tearDown()} 메서드로 각각의 테스트 메서드 전과 후에 실행될 명령어를 정의할 수 있습니다. @ref{460c,,테스트 코드 구조 잡기}에서 이것을 더 자세히 다루겠습니다.

마지막 블록은 테스트를 실행하는 간단한 방법을 보여줍니다. @ref{11e2,,unittest.main()}은 테스트 스크립트에 명령행 인터페이스를 제공합니다. 명령행에서 위 스크립트를 실행하면, 다음과 같은 출력이 나옵니다:

@example
...
----------------------------------------------------------------------
Ran 3 tests in 0.000s

OK
@end example

@code{-v} 옵션을 테스트 스크립트에 넘겨주게 되면 @ref{11e2,,unittest.main()}은 높은 상세도(verbosity)를 설정하여 그에 따른 출력이 나옵니다:

@example
test_isupper (__main__.TestStringMethods.test_isupper) ... ok
test_split (__main__.TestStringMethods.test_split) ... ok
test_upper (__main__.TestStringMethods.test_upper) ... ok

----------------------------------------------------------------------
Ran 3 tests in 0.001s

OK
@end example

The above examples show the most commonly used @code{unittest} features which
are sufficient to meet many everyday testing needs.  The remainder of the
documentation explores the full feature set from first principles.


버전 3.11에서 변경: The behavior of returning a value from a test method (other than the default
@code{None} value), is now deprecated.


@node 명령행 인터페이스,테스트 탐색 Discovery,기본 예시,unittest — 단위 테스트 프레임워크
@anchor{library/unittest command-line-interface}@anchor{460d}@anchor{library/unittest unittest-command-line-interface}@anchor{460e}
@subsubsection 명령행 인터페이스


unittest 모듈은 명령행을 사용하여 모듈, 클래스, 심지어 각 테스트 메서드의 테스트들을 실행할 수 있습니다:

@example
python -m unittest test_module1 test_module2
python -m unittest test_module.TestClass
python -m unittest test_module.TestClass.test_method
@end example

모듈 이름이나 완전히 정규화된 클래스나 메서드 이름이 포함된 목록을 전달할 수 있습니다.

테스트 모듈은 파일 경로로도 지정할 수 있습니다:

@example
python -m unittest tests/test_something.py
@end example

이것으로 테스트 모듈을 지정할 때 셸(shell)의 파일 이름 완성 기능을 사용할 수 있습니다. 지정된 파일은 반드시 모듈로 임포트 가능해야 합니다. 파일 경로는 ‘.py’ 가 빠지면서 모듈 이름으로 변경되고 경로 구분자도 ‘.’로 변경됩니다. 만약 당신이 임포트 가능하지 않은 테스트 파일을 모듈로 사용하고 싶으시다면 이 방법 대신에 그 파일을 직접 실행해야 합니다.

-v 옵션을 사용하여 더 자세한 정보(높은 상세도)로 테스트를 실행할 수 있습니다:

@example
python -m unittest -v test_module
@end example

아무 인자 없이 실행하면 @ref{460f,,테스트 탐색(Discovery)}이 실행됩니다:

@example
python -m unittest
@end example

모든 명령행 옵션 목록을 보기:

@example
python -m unittest -h
@end example


버전 3.2에서 변경: 이전 버전에서는 개별 테스트 메서드만 실행이 가능했고, 모듈과 클래스는 불가능했습니다.



Added in version 3.14: Output is colorized by default and can be
@ref{1b7,,controlled using environment variables}.


@menu
* 명령행 옵션:: 

@end menu

@node 명령행 옵션,,,명령행 인터페이스
@anchor{library/unittest command-line-options}@anchor{4610}
@subsubsection 명령행 옵션


@code{unittest}는 다음과 같은 명령행 옵션을 제공합니다:

@geindex unittest 명령줄 옵션; -b
@geindex unittest 명령줄 옵션; --buffer
@anchor{library/unittest cmdoption-unittest-b}@anchor{1536}@anchor{library/unittest cmdoption-unittest-buffer}@anchor{4611}
@deffn {Option} @w{-}b, @w{-}@w{-}buffer

테스트가 실행될 동안 표준 출력과 표준 에러 스트림이 버퍼링 됩니다. 통과한 테스트 중에 나온 출력은 버려집니다. 보통 테스트 실패나 에러에서 나온 출력은 표시되고 실패 메시지에 추가됩니다.
@end deffn

@geindex unittest 명령줄 옵션; -c
@geindex unittest 명령줄 옵션; --catch
@anchor{library/unittest cmdoption-unittest-c}@anchor{1537}@anchor{library/unittest cmdoption-unittest-catch}@anchor{4612}
@deffn {Option} @w{-}c, @w{-}@w{-}catch

테스트 실행 중에 @code{Control}-@code{C}를 누르면 현재 테스트가 끝날 때까지 기다린 다음 지금까지의 모든 결과를 보고합니다. @code{Control}-@code{C}를 다시 누르면 일반적인 @ref{bc4,,KeyboardInterrupt} 예외를 발생합니다.

이 기능과 관련된 함수는 @ref{4613,,시그널 처리하기}를 참고하십시오.
@end deffn

@geindex unittest 명령줄 옵션; -f
@geindex unittest 명령줄 옵션; --failfast
@anchor{library/unittest cmdoption-unittest-f}@anchor{1539}@anchor{library/unittest cmdoption-unittest-failfast}@anchor{4614}
@deffn {Option} @w{-}f, @w{-}@w{-}failfast

첫 번째 에러나 실패가 발생하면 테스트 실행을 중단합니다.
@end deffn

@geindex unittest 명령줄 옵션; -k
@anchor{library/unittest cmdoption-unittest-k}@anchor{4615}
@deffn {Option} @w{-}k

패턴이나 부분 문자열과 일치하는 테스트 메서드나 클래스만 실행합니다. 이 옵션은 여러 번 사용될 수 있습니다. 이 경우 주어진 패턴 중 하나라도 일치하는 모든 테스트 케이스가 포함됩니다.

와일드카드 문자(@code{*})를 포함한 패턴은 @ref{1c53,,fnmatch.fnmatchcase()}를 사용하여 그에 일치하는 테스트 이름을 찾고; 그렇지 않은 경우 단순히 대소문자를 구별하는 부분 문자열 일치가 사용됩니다.

패턴을 테스트 로더가 임포트한 완전히 정규화된 테스트 메서드 이름과 대조합니다.

예를 들어 @code{-k foo}는 @code{foo_tests.SomeTest.test_something}, @code{bar_tests.SomeTest.test_foo}에 일치하지만, @code{bar_tests.FooTest.test_something}에는 일치하지 않습니다.
@end deffn

@geindex unittest 명령줄 옵션; --locals
@anchor{library/unittest cmdoption-unittest-locals}@anchor{4616}
@deffn {Option} @w{-}@w{-}locals

트레이스백(traceback)에서 지역 변수를 표시합니다.
@end deffn

@geindex unittest 명령줄 옵션; --durations
@anchor{library/unittest cmdoption-unittest-durations}@anchor{4617}
@deffn {Option} @w{-}@w{-}durations N

Show the N slowest test cases (N=0 for all).
@end deffn


Added in version 3.2: 명령행 옵션인 @code{-b}, @code{-c}, @code{-f}가 추가되었습니다.



Added in version 3.5: 명령행 옵션 @code{--locals}.



Added in version 3.7: 명령행 옵션 @code{-k}.



Added in version 3.12: 명령행 옵션 @code{--durations}.


명령행은 프로젝트의 모든 테스트 또는 일부분의 테스트 탐색을 위해서도 사용할 수 있습니다.

@node 테스트 탐색 Discovery,테스트 코드 구조 잡기,명령행 인터페이스,unittest — 단위 테스트 프레임워크
@anchor{library/unittest test-discovery}@anchor{4618}@anchor{library/unittest unittest-test-discovery}@anchor{460f}
@subsubsection 테스트 탐색(Discovery)



Added in version 3.2.


unittest는 간단한 테스트 탐색을 지원합니다. 테스트 탐색에 호환되기 위해서는 모든 테스트 파일은 반드시 프로젝트의 가장 상위 디렉터리로부터 @ref{203c,,모듈} 또는 @ref{204c,,패키지}로 임포트 가능해야 합니다(이 말은 파일 이름이 반드시 유효한 @ref{229d,,식별자}이어야 한다는 뜻입니다).

테스트 탐색은 @ref{11e4,,TestLoader.discover()}로 구현되어 있습니다, 그러나 명령행으로 사용할 수도 있습니다. 기본적인 명령행 사용법은 다음과 같습니다:

@example
cd project_directory
python -m unittest discover
@end example

@cartouche
@quotation 참고 
단축형인 @code{python -m unittest}는 @code{python -m unittest discover}와 같습니다. 테스트 탐색에 인자를 전달하고 싶을 때는 @code{discover} 부속 명령어(sub-command)를 명시적으로 사용해야 합니다.
@end quotation
@end cartouche

@code{discover} 부-명령어는 다음과 같은 옵션을 가지고 있습니다:

@geindex unittest-discover 명령줄 옵션; -v
@geindex unittest-discover 명령줄 옵션; --verbose
@anchor{library/unittest cmdoption-unittest-discover-v}@anchor{4619}@anchor{library/unittest cmdoption-unittest-discover-verbose}@anchor{461a}
@deffn {Option} @w{-}v, @w{-}@w{-}verbose

상세한 출력
@end deffn

@geindex unittest-discover 명령줄 옵션; -s
@geindex unittest-discover 명령줄 옵션; --start-directory
@anchor{library/unittest cmdoption-unittest-discover-s}@anchor{461b}@anchor{library/unittest cmdoption-unittest-discover-start-directory}@anchor{461c}
@deffn {Option} @w{-}s, @w{-}@w{-}start@w{-}directory directory

탐색을 시작할 디렉터리(기본값 @code{.})
@end deffn

@geindex unittest-discover 명령줄 옵션; -p
@geindex unittest-discover 명령줄 옵션; --pattern
@anchor{library/unittest cmdoption-unittest-discover-p}@anchor{461d}@anchor{library/unittest cmdoption-unittest-discover-pattern}@anchor{461e}
@deffn {Option} @w{-}p, @w{-}@w{-}pattern pattern

테스트 파일을 검색할 패턴(기본값 @code{test*.py})
@end deffn

@geindex unittest-discover 명령줄 옵션; -t
@geindex unittest-discover 명령줄 옵션; --top-level-directory
@anchor{library/unittest cmdoption-unittest-discover-t}@anchor{461f}@anchor{library/unittest cmdoption-unittest-discover-top-level-directory}@anchor{4620}
@deffn {Option} @w{-}t, @w{-}@w{-}top@w{-}level@w{-}directory directory

프로젝트의 최상위 디렉터리(기본값 시작 디렉터리)
@end deffn

@ref{461b,,-s}, @ref{461d,,-p}, @ref{461f,,-t} 옵션은 이 순서대로 위치 인자로서 사용할 수 있습니다. 다음 2개의 명령행은 같습니다:

@example
python -m unittest discover -s project_directory -p "*_test.py"
python -m unittest discover project_directory "*_test.py"
@end example

경로가 사용되는 곳에 패키지 이름을 전달하는 것도 가능합니다, 예를 들어 @code{myproject.subpackage.test}를 시작 디렉터리로 사용할 수 있습니다. 주어진 패키지 이름은 임포트되어 그것의 파일 시스템상의 위치를 시작 디렉터리로 사용하게 됩니다.

@cartouche
@quotation 조심 
테스트 탐색은 테스트를 임포트하여 로드합니다. 테스트 탐색이 당신이 지정한 시작 디렉터리로부터 모든 테스트 파일을 찾았다면 임포트하기 위해 그 파일 경로를 패키지 이름으로 바꿉니다. 예를 들어 @code{foo/bar/baz.py}는 @code{foo.bar.baz}로 임포트될 것입니다.

만약 당신이 전역적으로 설치된 패키지가 있고 테스트 탐색을 다른 패키지 복사본에 하려고 시도한다면 임포트가 잘못된 위치에서 발생할 `수도 있습니다'. 만약 이런 일이 발생한다면 테스트 탐색은 경고하고 종료될 것입니다.

만약 당신이 시작 디렉터리로 경로가 아닌 패키지 이름을 전달했다면 테스트 탐색은 임포트가 어느 경로로부터 되었든 간에 당신이 의도한 경로라고 간주하여 경고를 발생하지 않을 것입니다.
@end quotation
@end cartouche

테스트 모듈과 패키지는 @ref{4621,,load_tests 프로토콜}을 통하여 테스트 로드와 탐색을 사용자 정의할 수 있습니다.


버전 3.4에서 변경: Test discovery supports @ref{2b2,,namespace packages}.



버전 3.11에서 변경: Test discovery dropped the @ref{2b2,,namespace packages}
support. It has been broken since Python 3.7.
Start directory and its subdirectories containing tests must be regular
package that have @code{__init__.py} file.

If the start directory is the dotted name of the package, the ancestor packages
can be namespace packages.



버전 3.14에서 변경: Test discovery supports @ref{2b2,,namespace package} as start directory again.
To avoid scanning directories unrelated to Python,
tests are not searched in subdirectories that do not contain @code{__init__.py}.


@node 테스트 코드 구조 잡기,이전의 테스트 코드를 다시 사용하기,테스트 탐색 Discovery,unittest — 단위 테스트 프레임워크
@anchor{library/unittest organizing-test-code}@anchor{4622}@anchor{library/unittest organizing-tests}@anchor{460c}
@subsubsection 테스트 코드 구조 잡기


The basic building blocks of unit testing are `test cases' — single
scenarios that must be set up and checked for correctness.  In @code{unittest},
test cases are represented by @ref{2b3,,unittest.TestCase} instances.
To make your own test cases you must write subclasses of
@ref{2b3,,TestCase} or use @ref{1a79,,FunctionTestCase}.

@ref{2b3,,TestCase} 인스턴스의 테스트 코드는 완전히 독립적으로 되어 있어야 합니다, 그래야지 이것을 각각 단독으로 실행하거나 다른 여러 테스트 케이스와 함께 임의의 조합으로 실행할 수 있습니다.

가장 간단한 @ref{2b3,,TestCase}의 서브 클래스는 특정 테스트 코드를 수행하도록 단순히 테스트 메서드(즉 @code{test}로 이름이 시작하는 함수)를 구현하는 것입니다:

@example
import unittest

class DefaultWidgetSizeTestCase(unittest.TestCase):
    def test_default_widget_size(self):
        widget = Widget('The widget')
        self.assertEqual(widget.size(), (50, 50))
@end example

Note that in order to test something, we use one of the @ref{4609,,assert* methods}
provided by the @ref{2b3,,TestCase} base class.  If the test fails, an
exception will be raised with an explanatory message, and @code{unittest}
will identify the test case as a `failure'.  Any other exceptions will be
treated as `errors'.

테스트는 매우 많지만, 그것을 위한 사전 설정은 계속 반복될 수 있습니다. 다행히, @ref{153e,,setUp()}이란 메서드를 작성하여 사전 설정 코드를 밖으로 분리해낼 수 있습니다. 테스트 프레임워크가 1개의 테스트마다 매번 자동으로 이것을 호출할 것입니다:

@example
import unittest

class WidgetTestCase(unittest.TestCase):
    def setUp(self):
        self.widget = Widget('The widget')

    def test_default_widget_size(self):
        self.assertEqual(self.widget.size(), (50,50),
                         'incorrect default size')

    def test_widget_resize(self):
        self.widget.resize(100,150)
        self.assertEqual(self.widget.size(), (100,150),
                         'wrong size after resize')
@end example

@cartouche
@quotation 참고 
다양한 테스트가 실행될 순서는 테스트 메서드의 이름을 가지고 내장된 문자열 정렬 순서에 의하여 결정될 것입니다.
@end quotation
@end cartouche

만약 @ref{153e,,setUp()} 메서드가 테스트 실행 중에 예외를 발생시킨다면 프레임워크는 테스트에 오류가 있는 것으로 간주하여 테스트 메서드를 실행하지 않을 것입니다.

마찬가지로 테스트 메서드가 실행되고 나서 정리하기 위해 @ref{153f,,tearDown()} 메서드를 제공합니다:

@example
import unittest

class WidgetTestCase(unittest.TestCase):
    def setUp(self):
        self.widget = Widget('The widget')

    def tearDown(self):
        self.widget.dispose()
@end example

만약 @ref{153e,,setUp()}이 성공했다면, 테스트가 성공했든 실패했든 상관없이 @ref{153f,,tearDown()}이 실행될 것입니다.

Such a working environment for the testing code is called a
`test fixture'.  A new TestCase instance is created as a unique
test fixture used to execute each individual test method.  Thus
@ref{153e,,setUp()}, @ref{153f,,tearDown()}, and @code{TestCase.__init__()}
will be called once per test.

It is recommended that you use TestCase implementations to group tests together
according to the features they test.  @code{unittest} provides a mechanism for
this: the `test suite', represented by @code{unittest}’s
@ref{ff4,,TestSuite} class.  In most cases, calling @ref{11e2,,unittest.main()} will do
the right thing and collect all the module’s test cases for you and execute
them.

그러나 당신이 테스트 묶음을 사용자 정의하고 싶다면 그것을 직접 만들어야 합니다:

@example
def suite():
    suite = unittest.TestSuite()
    suite.addTest(WidgetTestCase('test_default_widget_size'))
    suite.addTest(WidgetTestCase('test_widget_resize'))
    return suite

if __name__ == '__main__':
    runner = unittest.TextTestRunner()
    runner.run(suite())
@end example

당신은 테스트 케이스와 테스트 묶음의 정의를 테스트하려는 코드와 같은 모듈(예를 들어 @code{widget.py})에 넣을 수 있습니다, 그러나 테스트 코드를 분리된 모듈(예를 들어 @code{test_widget.py})에 넣으면 몇 가지 이점이 있습니다:


@itemize *

@item 
테스트 모듈이 명령행에서 독립적으로 작동할 수 있습니다.

@item 
테스트 코드가 배포될 코드와 쉽게 분리될 수 있습니다.

@item 
충분한 이유 없이 테스트하려는 코드에 맞춰서 테스트 코드를 바꾸려는 유혹이 덜 합니다.

@item 
테스트 코드가 테스트하려는 코드에 비해 훨씬 덜 빈번하게 수정되어야 합니다.

@item 
테스트하려는 코드는 더 쉽게 리팩토링할 수 있습니다.

@item 
C 언어로 작성된 모듈의 테스트 코드는 반드시 분리된 모듈에 위치해야 합니다, 따라서 일관성을 지키는 것이 어떨까요?

@item 
만약 테스트 전략이 바뀌더라도 소스 코드를 바꿀 필요가 없습니다.
@end itemize

@node 이전의 테스트 코드를 다시 사용하기,테스트 건너뛰기와 예상된 실패,테스트 코드 구조 잡기,unittest — 단위 테스트 프레임워크
@anchor{library/unittest legacy-unit-tests}@anchor{4623}@anchor{library/unittest re-using-old-test-code}@anchor{4624}
@subsubsection 이전의 테스트 코드를 다시 사용하기


Some users will find that they have existing test code that they would like to
run from @code{unittest}, without converting every old test function to a
@ref{2b3,,TestCase} subclass.

For this reason, @code{unittest} provides a @ref{1a79,,FunctionTestCase} class.
This subclass of @ref{2b3,,TestCase} can be used to wrap an existing test
function.  Set-up and tear-down functions can also be provided.

다음과 같은 테스트 함수가 있을 때:

@example
def testSomething():
    something = makeSomething()
    assert something.name is not None
    # ...
@end example

다음과 같이 동등한 테스트 케이스 인스턴스를 생성할 수 있습니다, 추가로 사전 설정과 정리 메서드를 함께 설정합니다:

@example
testcase = unittest.FunctionTestCase(testSomething,
                                     setUp=makeSomethingDB,
                                     tearDown=deleteSomethingDB)
@end example

@cartouche
@quotation 참고 
Even though @ref{1a79,,FunctionTestCase} can be used to quickly convert an
existing test base over to a @code{unittest}-based system, this approach is
not recommended.  Taking the time to set up proper @ref{2b3,,TestCase}
subclasses will make future test refactorings infinitely easier.
@end quotation
@end cartouche

In some cases, the existing tests may have been written using the @ref{3e,,doctest}
module.  If so, @code{doctest} provides a @ref{ff3,,DocTestSuite} class that can
automatically build @ref{ff4,,unittest.TestSuite} instances from the existing
@code{doctest}-based tests.

@node 테스트 건너뛰기와 예상된 실패,부분 테스트 subtest 를 사용하여 테스트 반복 구별 짓기,이전의 테스트 코드를 다시 사용하기,unittest — 단위 테스트 프레임워크
@anchor{library/unittest skipping-tests-and-expected-failures}@anchor{4625}@anchor{library/unittest unittest-skipping}@anchor{4626}
@subsubsection 테스트 건너뛰기와 예상된 실패



Added in version 3.1.


unittest는 테스트 중에서 개별 테스트 메서드나 심지어 전체 클래스를 건너뛸 수 있는 기능을 제공합니다. 게다가 테스트를 “예상된 실패”로 표시하는 기능도 지원합니다, 테스트가 망가져서 실패하더라도 그것을 @ref{136c,,TestResult}에 실패라고 기록하지 않습니다.

테스트 건너뛰기는 단순히 @ref{1dbb,,skip()} @ref{939,,데코레이터}나 그것의 조건 변형 중 하나를 사용하거나, @ref{153e,,setUp()}이나 테스트 메서드 안에서 @ref{4627,,TestCase.skipTest()}를 호출하거나, @ref{11e3,,SkipTest}를 직접 발생시키면 됩니다.

기본적인 건너뛰기는 다음과 같습니다:

@example
class MyTestCase(unittest.TestCase):

    @@unittest.skip("demonstrating skipping")
    def test_nothing(self):
        self.fail("shouldn't happen")

    @@unittest.skipIf(mylib.__version__ < (1, 3),
                     "not supported in this library version")
    def test_format(self):
        # 특정 버전의 라이브러리에서만 작동하는 테스트.
        pass

    @@unittest.skipUnless(sys.platform.startswith("win"), "requires Windows")
    def test_windows_support(self):
        # 윈도우 특정 테스트 코드
        pass

    def test_maybe_skipped(self):
        if not external_resource_available():
            self.skipTest("external resource not available")
        # 외부 리소스에 의존하는 테스트 코드
        pass
@end example

아래는 위의 예를 상세 모드로 실행했을 때의 출력입니다:

@example
test_format (__main__.MyTestCase.test_format) ... skipped 'not supported in this library version'
test_nothing (__main__.MyTestCase.test_nothing) ... skipped 'demonstrating skipping'
test_maybe_skipped (__main__.MyTestCase.test_maybe_skipped) ... skipped 'external resource not available'
test_windows_support (__main__.MyTestCase.test_windows_support) ... skipped 'requires Windows'

----------------------------------------------------------------------
Ran 4 tests in 0.005s

OK (skipped=4)
@end example

클래스도 메서드처럼 건너뛰기가 가능합니다:

@example
@@unittest.skip("showing class skipping")
class MySkippedTestCase(unittest.TestCase):
    def test_not_run(self):
        pass
@end example

@ref{153e,,TestCase.setUp()} 또한 테스트를 건너뛸 수 있습니다. 이것은 사전 설정해야 할 자원을 사용할 수 없을 때 유용합니다.

예상된 실패는 @ref{4628,,expectedFailure()} 데코레이터를 사용합니다.

@example
class ExpectedFailureTestCase(unittest.TestCase):
    @@unittest.expectedFailure
    def test_fail(self):
        self.assertEqual(1, 0, "broken")
@end example

자신만의 건너뛰기 데코레이터를 만들기는 쉽습니다. 테스트를 건너뛰고 싶을 때 @ref{1dbb,,skip()}를 호출하도록 데코레이터를 만들면 됩니다. 다음의 데코레이터는 특정 어트리뷰트가 있는 객체가 전달되지 않으면 테스트를 건너뜁니다:

@example
def skipUnlessHasattr(obj, attr):
    if hasattr(obj, attr):
        return lambda func: func
    return unittest.skip("@{!r@} doesn't have @{!r@}".format(obj, attr))
@end example

다음 데코레이터들과 예외는 테스트 건너뛰기와 예상된 실패를 구현합니다:

@geindex skip() (unittest 모듈)
@anchor{library/unittest unittest skip}@anchor{1dbb}
@deffn {함수} @@unittest.skip (reason)

조건 없이 데코레이트된 테스트를 건너뜁니다. `reason'은 왜 이 테스트가 건너뛰어 졌는지를 설명해야 합니다.
@end deffn

@geindex skipIf() (unittest 모듈)
@anchor{library/unittest unittest skipIf}@anchor{4629}
@deffn {함수} @@unittest.skipIf (condition, reason)

`condition'이 참이면 데코레이트된 테스트를 건너뜁니다.
@end deffn

@geindex skipUnless() (unittest 모듈)
@anchor{library/unittest unittest skipUnless}@anchor{462a}
@deffn {함수} @@unittest.skipUnless (condition, reason)

`condition'이 참이 아니면 데코레이트된 테스트를 건너뜁니다.
@end deffn

@geindex expectedFailure() (unittest 모듈)
@anchor{library/unittest unittest expectedFailure}@anchor{4628}
@deffn {함수} @@unittest.expectedFailure

테스트가 예상된 실패나 에러라는 표시를 합니다. 테스트가 (`테스트 픽스쳐(test fixture)' 메서드 중 하나가 아니라) 테스트 함수 자체에서 실패하거나 에러이면 성공으로 간주합니다. 테스트에 통과하면 실패로 간주합니다.
@end deffn

@geindex SkipTest
@anchor{library/unittest unittest SkipTest}@anchor{11e3}
@deffn {예외} unittest.SkipTest (reason)

이 예외는 테스트를 건너뛰기 위해서 발생합니다.

보통은 이 예외를 직접 발생시키기보다는 @ref{4627,,TestCase.skipTest()}나 건너뛰기 데코레이터를 사용할 수 있습니다.
@end deffn

건너뛰는 테스트는 테스트 전후로 @ref{153e,,setUp()}이나 @ref{153f,,tearDown()}를 실행하지 않을 것입니다. 건너뛰는 클래스는 @ref{c40,,setUpClass()}나 @ref{153c,,tearDownClass()}를 실행하지 않을 것입니다. 건너뛰는 모듈은 @ref{c3f,,setUpModule()}이나 @ref{153b,,tearDownModule()}을 실행하지 않을 것입니다.

@node 부분 테스트 subtest 를 사용하여 테스트 반복 구별 짓기,클래스와 함수,테스트 건너뛰기와 예상된 실패,unittest — 단위 테스트 프레임워크
@anchor{library/unittest distinguishing-test-iterations-using-subtests}@anchor{462b}@anchor{library/unittest subtests}@anchor{11e1}
@subsubsection 부분 테스트(subtest)를 사용하여 테스트 반복 구별 짓기



Added in version 3.4.


여러분의 테스트들이 아주 작은 부분에서만 다를 때, 예를 들어 몇몇 매개변수, unittest는 @ref{11e0,,subTest()} 컨텍스트 관리자를 사용하여 테스트 메서드의 바디 안에서 그것들은 구별 짓게 해줍니다.

예를 들어, 다음 테스트는:

@example
class NumbersTest(unittest.TestCase):

    def test_even(self):
        """
        0과 5 사이의 숫자가 모두 짝수인지 테스트합니다.
        """
        for i in range(0, 6):
            with self.subTest(i=i):
                self.assertEqual(i % 2, 0)
@end example

다음의 출력을 만듭니다:

@example
======================================================================
FAIL: test_even (__main__.NumbersTest.test_even) (i=1)
Test that numbers between 0 and 5 are all even.
----------------------------------------------------------------------
Traceback (most recent call last):
  File "subtests.py", line 11, in test_even
    self.assertEqual(i % 2, 0)
    ^^^^^^^^^^^^^^^^^^^^^^^^^^
AssertionError: 1 != 0

======================================================================
FAIL: test_even (__main__.NumbersTest.test_even) (i=3)
Test that numbers between 0 and 5 are all even.
----------------------------------------------------------------------
Traceback (most recent call last):
  File "subtests.py", line 11, in test_even
    self.assertEqual(i % 2, 0)
    ^^^^^^^^^^^^^^^^^^^^^^^^^^
AssertionError: 1 != 0

======================================================================
FAIL: test_even (__main__.NumbersTest.test_even) (i=5)
Test that numbers between 0 and 5 are all even.
----------------------------------------------------------------------
Traceback (most recent call last):
  File "subtests.py", line 11, in test_even
    self.assertEqual(i % 2, 0)
    ^^^^^^^^^^^^^^^^^^^^^^^^^^
AssertionError: 1 != 0
@end example

부분 테스트를 사용하지 않는다면 테스트 실행은 첫 번째 실패 후에 중단될 것이고 @code{i} 값이 표시되지 않기 때문에 에러를 진단하는 데 쉽지 않을 것입니다:

@example
======================================================================
FAIL: test_even (__main__.NumbersTest.test_even)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "subtests.py", line 32, in test_even
    self.assertEqual(i % 2, 0)
AssertionError: 1 != 0
@end example

@node 클래스와 함수,클래스와 모듈 픽스쳐,부분 테스트 subtest 를 사용하여 테스트 반복 구별 짓기,unittest — 단위 테스트 프레임워크
@anchor{library/unittest classes-and-functions}@anchor{462c}@anchor{library/unittest unittest-contents}@anchor{462d}
@subsubsection 클래스와 함수


This section describes in depth the API of @code{unittest}.

@menu
* 테스트 케이스:: 
* 테스트 분류:: 
* 테스트를 로드하고 실행하기:: 

@end menu

@node 테스트 케이스,테스트 분류,,클래스와 함수
@anchor{library/unittest test-cases}@anchor{462e}@anchor{library/unittest testcase-objects}@anchor{462f}
@subsubsection 테스트 케이스


@geindex TestCase (unittest 클래스)
@anchor{library/unittest unittest TestCase}@anchor{2b3}
@deffn {클래스} unittest.TestCase (methodName='runTest')

Instances of the @code{TestCase} class represent the logical test units
in the @code{unittest} universe.  This class is intended to be used as a base
class, with specific tests being implemented by concrete subclasses.  This class
implements the interface needed by the test runner to allow it to drive the
tests, and methods that the test code can use to check for and report various
kinds of failure.

@ref{2b3,,TestCase}의 각 인스턴스는 하나의 베이스 메서드: `methodName'이 지정하는 이름의 메서드를 실행할 것입니다. 대부분의 @code{TestCase} 사용에서, 당신은 `methodName'을 바꾸거나 기본 @code{runTest()} 메서드를 재구현하지 않을 것입니다.


버전 3.2에서 변경: `methodName' 제공 없이도 @ref{2b3,,TestCase}를 성공적으로 인스턴스화할 수 있습니다. 이것은 대화형 인터프리터에서 @code{TestCase}로 쉽게 실험을 할 수 있게 합니다.


@ref{2b3,,TestCase} 인스턴스는 3가지 메서드 그룹을 제공합니다: 한 그룹은 테스트를 실행하는 데 사용되고, 다른 한 그룹은 조건을 확인하고 실패를 보고하는 테스트 구현으로 사용되고, 몇몇 조회 메서드는 테스트 자체에 관한 정보를 수집할 수 있게 해줍니다.

첫 번째 그룹(테스트 실행) 안에 메서드는:

@geindex setUp() (unittest.TestCase 메서드)
@anchor{library/unittest unittest TestCase setUp}@anchor{153e}
@deffn {메서드} setUp ()

테스트 픽스쳐를 준비하기 위해 호출되는 메서드입니다. 이 메서드는 테스트 메서드를 호출하기 바로 직전에 호출됩니다; @ref{8b7,,AssertionError} 또는 @ref{11e3,,SkipTest}이외의 이 메서드에서 발생한 모든 예외는 테스트 실패가 아닌 오류로 간주합니다. 기본 구현은 아무것도 하지 않습니다.
@end deffn

@geindex tearDown() (unittest.TestCase 메서드)
@anchor{library/unittest unittest TestCase tearDown}@anchor{153f}
@deffn {메서드} tearDown ()

테스트 메서드가 불리고 결과가 기록되고 나서 바로 다음에 호출되는 메서드입니다. 테스트 메서드가 예외를 발생했더라도 이 메서드는 불립니다, 따라서 서브 클래스의 구현은 내부 상태를 확인하는 데 특별히 주의를 기울여야 합니다. @ref{8b7,,AssertionError} 또는 @ref{11e3,,SkipTest}이외의 이 메서드에서 발생하는 모든 예외는 테스트 실패가 아닌 오류로 간주합니다(따라서 보고된 오류의 총 숫자가 증가합니다). 이 메서드는 테스트 메서드의 결과물에 영향받지 않고 @ref{153e,,setUp()}이 성공했을 때만 불립니다. 기본 구현은 아무것도 하지 않습니다.
@end deffn

@geindex setUpClass() (unittest.TestCase 메서드)
@anchor{library/unittest unittest TestCase setUpClass}@anchor{c40}
@deffn {메서드} setUpClass ()

개별 클래스의 테스트들이 실행되기 전에 불리는 클래스 메서드입니다. @code{setUpClass}는 클래스만 인자로 받아 호출되고 @ref{48f,,classmethod()}로 데코레이트해야 합니다:

@example
@@classmethod
def setUpClass(cls):
    ...
@end example

더 자세한 것은 @ref{4630,,클래스와 모듈 픽스쳐}를 보십시오.


Added in version 3.2.

@end deffn

@geindex tearDownClass() (unittest.TestCase 메서드)
@anchor{library/unittest unittest TestCase tearDownClass}@anchor{153c}
@deffn {메서드} tearDownClass ()

개별 클래스의 테스트들이 실행되고 난 뒤에 불리는 클래스 메서드입니다. @code{tearDownClass}는 클래스만 인자로 받아 호출되고 @ref{48f,,classmethod()}로 데코레이트해야 합니다:

@example
@@classmethod
def tearDownClass(cls):
    ...
@end example

더 자세한 것은 @ref{4630,,클래스와 모듈 픽스쳐}를 보십시오.


Added in version 3.2.

@end deffn

@geindex run() (unittest.TestCase 메서드)
@anchor{library/unittest unittest TestCase run}@anchor{136b}
@deffn {메서드} run (result=None)

테스트를 실행하고, `result' 인자로 전달된 @ref{136c,,TestResult}에 결과를 수집합니다. 만약 `result' 인자가 전달 안 되거나 @code{None}이라면 임시 결과 객체를 (@ref{4631,,defaultTestResult()} 메서드를 불러서) 생성하여 사용합니다. @ref{136b,,run()} 호출자에게 결과 객체를 반환합니다.

단순히 @ref{2b3,,TestCase} 인스턴스를 호출하는 것으로 같은 효과를 볼 수 있습니다.


버전 3.3에서 변경: 기존 버전의 @code{run}은 결과를 반환하지 않았습니다. 인스턴스 호출 또한 그렇지 않았습니다.

@end deffn

@geindex skipTest() (unittest.TestCase 메서드)
@anchor{library/unittest unittest TestCase skipTest}@anchor{4627}
@deffn {메서드} skipTest (reason)

테스트 메서드나 @ref{153e,,setUp()}에서 이것을 호출하면 현재 테스트를 건너뜁니다. 자세한 정보는 @ref{4626,,테스트 건너뛰기와 예상된 실패}를 보십시오.


Added in version 3.1.

@end deffn

@geindex subTest() (unittest.TestCase 메서드)
@anchor{library/unittest unittest TestCase subTest}@anchor{11e0}
@deffn {메서드} subTest (msg=None, **params)

둘러싼 코드 블록을 부분 테스트로서 실행하는 컨텍스트 관리자를 반환합니다. `msg' 및 `params'는 선택 사항이며 부분 테스트가 실패 할 때마다 표시되는 임의의 값으로 당신이 명확하게 알아보게 해줍니다.

테스트 케이스는 여러 개의 부분 테스트 선언을 포함할 수 있고, 그것들은 자유롭게 중첩될 수 있습니다.

자세한 정보는 @ref{11e1,,부분 테스트(subtest)를 사용하여 테스트 반복 구별 짓기}를 보십시오.


Added in version 3.4.

@end deffn

@geindex debug() (unittest.TestCase 메서드)
@anchor{library/unittest unittest TestCase debug}@anchor{1c47}
@deffn {메서드} debug ()

결과를 수집하지 않고 테스트를 실행합니다. 이것은 테스트에서 발생한 예외가 호출자로 전파될 수 있게 해서, 디버거 환경에서 테스트를 실행할 때 사용될 수 있습니다.
@end deffn
@anchor{library/unittest assert-methods}@anchor{4609}
@ref{2b3,,TestCase} 클래스는 값을 검사하고 실패를 보고하기 위해 몇 개의 assert 메서드를 제공합니다. 다음 표는 보통 많이 사용되는 메서드들입니다(더 많은 assert 메서드는 표 아래를 보십시오):


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxx} 
@headitem

메서드

@tab

검사하는 내용

@tab

추가된 버전

@item

@ref{74b,,assertEqual(a@comma{} b)}

@tab

@code{a == b}

@tab

@item

@ref{74c,,assertNotEqual(a@comma{} b)}

@tab

@code{a != b}

@tab

@item

@ref{749,,assertTrue(x)}

@tab

@code{bool(x) is True}

@tab

@item

@ref{74a,,assertFalse(x)}

@tab

@code{bool(x) is False}

@tab

@item

@ref{1540,,assertIs(a@comma{} b)}

@tab

@code{a is b}

@tab

3.1

@item

@ref{1541,,assertIsNot(a@comma{} b)}

@tab

@code{a is not b}

@tab

3.1

@item

@ref{148f,,assertIsNone(x)}

@tab

@code{x is None}

@tab

3.1

@item

@ref{1490,,assertIsNotNone(x)}

@tab

@code{x is not None}

@tab

3.1

@item

@ref{1549,,assertIn(a@comma{} b)}

@tab

@code{a in b}

@tab

3.1

@item

@ref{154a,,assertNotIn(a@comma{} b)}

@tab

@code{a not in b}

@tab

3.1

@item

@ref{1542,,assertIsInstance(a@comma{} b)}

@tab

@code{isinstance(a, b)}

@tab

3.2

@item

@ref{1543,,assertNotIsInstance(a@comma{} b)}

@tab

@code{not isinstance(a, b)}

@tab

3.2

@item

@ref{2b6,,assertIsSubclass(a@comma{} b)}

@tab

@code{issubclass(a, b)}

@tab

3.14

@item

@ref{2b7,,assertNotIsSubclass(a@comma{} b)}

@tab

@code{not issubclass(a, b)}

@tab

3.14

@end multitable


모든 assert 메서드는 `msg' 인자를 받을 수 있습니다, 만약 그것이 전달된다면 실패 시 에러 메시지로 사용됩니다(@ref{153a,,longMessage} 도 참고하십시오). @ref{74f,,assertRaises()}, @ref{751,,assertRaisesRegex()}, @ref{1369,,assertWarns()}, @ref{136a,,assertWarnsRegex()}는 컨텍스트 관리자로서 사용될 때만 그들에게 `msg' 키워드 인자를 전달할 수 있다는 점을 주의하십시오.

@geindex assertEqual() (unittest.TestCase 메서드)
@anchor{library/unittest unittest TestCase assertEqual}@anchor{74b}
@deffn {메서드} assertEqual (first, second, msg=None)

`first'와 `second'가 같은지 테스트합니다. 비교한 값이 같지 않으면 테스트는 실패할 것입니다.

추가로, 만약 `first'와 `second'가 정확히 같은 형(type)이고 list, tuple, dict, set, frozenset, str 이거나 @ref{154d,,addTypeEqualityFunc()}에 등록된 서브 클래스 형 중 하나일 경우 더 유용한 기본 에러 메시지를 생성하기 위해 형-특화(type-specific) 동등성 함수가 불릴 것입니다(@ref{4632,,형-특화 메서드 목록}을 참고하십시오).


버전 3.1에서 변경: 형-특화 동등성 함수가 자동으로 불리도록 추가



버전 3.2에서 변경: 문자열 비교를 위해서 @ref{1548,,assertMultiLineEqual()}를 기본 형-특화 동등성 함수에 추가

@end deffn

@geindex assertNotEqual() (unittest.TestCase 메서드)
@anchor{library/unittest unittest TestCase assertNotEqual}@anchor{74c}
@deffn {메서드} assertNotEqual (first, second, msg=None)

`first'와 `second'가 같지 않은지 테스트합니다, 비교한 값이 같으면 테스트는 실패할 것입니다.
@end deffn

@geindex assertTrue() (unittest.TestCase 메서드)
@geindex assertFalse() (unittest.TestCase 메서드)
@anchor{library/unittest unittest TestCase assertTrue}@anchor{749}
@deffn {메서드} assertTrue (expr, msg=None)
@anchor{library/unittest unittest TestCase assertFalse}@anchor{74a}
@deffnx {메서드} assertFalse (expr, msg=None)

`expr'이 참(또는 거짓)인지 테스트합니다.

이것은 @code{bool(expr) is True}와 동등하고 @code{expr is True}와 동등하지 않다는 것에 주의하십시오(후자를 위해선 @code{assertIs(expr, True)}를 사용하십시오). 더 구체적인 메서드를 사용할 수 있을 때는 이 메서드를 지양해야 합니다(예, @code{assertTrue(a == b)} 대신에 @code{assertEqual(a, b)}), 왜냐하면 실패의 경우에 구체적인 메서드가 더 나은 에러 메시지를 제공하기 때문입니다.
@end deffn

@geindex assertIs() (unittest.TestCase 메서드)
@geindex assertIsNot() (unittest.TestCase 메서드)
@anchor{library/unittest unittest TestCase assertIs}@anchor{1540}
@deffn {메서드} assertIs (first, second, msg=None)
@anchor{library/unittest unittest TestCase assertIsNot}@anchor{1541}
@deffnx {메서드} assertIsNot (first, second, msg=None)

`first'와 `second'가 같은 객체인지 (혹은 아닌지) 테스트합니다.


Added in version 3.1.

@end deffn

@geindex assertIsNone() (unittest.TestCase 메서드)
@geindex assertIsNotNone() (unittest.TestCase 메서드)
@anchor{library/unittest unittest TestCase assertIsNone}@anchor{148f}
@deffn {메서드} assertIsNone (expr, msg=None)
@anchor{library/unittest unittest TestCase assertIsNotNone}@anchor{1490}
@deffnx {메서드} assertIsNotNone (expr, msg=None)

`expr'이 @code{None} 인지(아닌지) 테스트합니다.


Added in version 3.1.

@end deffn

@geindex assertIn() (unittest.TestCase 메서드)
@geindex assertNotIn() (unittest.TestCase 메서드)
@anchor{library/unittest unittest TestCase assertIn}@anchor{1549}
@deffn {메서드} assertIn (member, container, msg=None)
@anchor{library/unittest unittest TestCase assertNotIn}@anchor{154a}
@deffnx {메서드} assertNotIn (member, container, msg=None)

`member'가 `container' 안에 있는지(아닌지) 테스트합니다.


Added in version 3.1.

@end deffn

@geindex assertIsInstance() (unittest.TestCase 메서드)
@geindex assertNotIsInstance() (unittest.TestCase 메서드)
@anchor{library/unittest unittest TestCase assertIsInstance}@anchor{1542}
@deffn {메서드} assertIsInstance (obj, cls, msg=None)
@anchor{library/unittest unittest TestCase assertNotIsInstance}@anchor{1543}
@deffnx {메서드} assertNotIsInstance (obj, cls, msg=None)

`obj'가 `cls'(@ref{2ad,,isinstance()}가 지원하는 것처럼 클래스 또는 클래스의 튜플)의 인스턴스인지(아닌지) 테스트합니다. 정확한 형 검사를 위해서는 @ref{1540,,assertIs(type(obj)@comma{} cls)}를 사용하십시오.


Added in version 3.2.

@end deffn

@geindex assertIsSubclass() (unittest.TestCase 메서드)
@geindex assertNotIsSubclass() (unittest.TestCase 메서드)
@anchor{library/unittest unittest TestCase assertIsSubclass}@anchor{2b6}
@deffn {메서드} assertIsSubclass (cls, superclass, msg=None)
@anchor{library/unittest unittest TestCase assertNotIsSubclass}@anchor{2b7}
@deffnx {메서드} assertNotIsSubclass (cls, superclass, msg=None)

Test that `cls' is (or is not) a subclass of `superclass' (which can be a
class or a tuple of classes, as supported by @ref{9c4,,issubclass()}).
To check for the exact type, use @ref{1540,,assertIs(cls@comma{} superclass)}.


Added in version 3.14.

@end deffn

다음의 메서드를 사용하여 예외, 경고, 로그 메시지의 발생을 검사할 수 있습니다:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxx} 
@headitem

메서드

@tab

검사하는 내용

@tab

추가된 버전

@item

@ref{74f,,assertRaises(exc@comma{} fun@comma{} *args@comma{} **kwds)}

@tab

@code{fun(*args, **kwds)}가 `exc'를 발생

@tab

@item

@ref{751,,assertRaisesRegex(exc@comma{} r@comma{} fun@comma{} *args@comma{} **kwds)}

@tab

@code{fun(*args, **kwds)}가 `exc'를 발생하고 메시지가 정규식 `r'에 일치

@tab

3.1

@item

@ref{1369,,assertWarns(warn@comma{} fun@comma{} *args@comma{} **kwds)}

@tab

@code{fun(*args, **kwds)}가 `warn'을 발생

@tab

3.2

@item

@ref{136a,,assertWarnsRegex(warn@comma{} r@comma{} fun@comma{} *args@comma{} **kwds)}

@tab

@code{fun(*args, **kwds)}가 `warn'을 발생하고 메시지가 정규식 `r'에 일치

@tab

3.2

@item

@ref{a59,,assertLogs(logger@comma{} level)}

@tab

@code{with} 블록이 최소 `level'로 `logger'에 로그를 남김

@tab

3.4

@item

@ref{a58,,assertNoLogs(logger@comma{} level)}

@tab


@table @asis

@item @code{with} 블록이

최소 `level'로 `logger'에 로그를 남기지 않음
@end table

@tab

3.10

@end multitable


@geindex assertRaises() (unittest.TestCase 메서드)
@anchor{library/unittest unittest TestCase assertRaises}@anchor{74f}
@deffn {메서드} assertRaises (exception, callable, *args, **kwds)

@deffnx {메서드} assertRaises (exception, *, msg=None)

@ref{74f,,assertRaises()}에 전달된 어떤 위치 또는 키워드 인자와 함께 `callable'이 호출되었을 때 예외가 발생하는지 테스트합니다. `exception'이 발생하면 테스트를 통과하고, 다른 예외가 발생하면 에러이고, 아무 예외도 발생하지 않으면 실패입니다. 여러 예외 모음을 잡기 위해서 예외 클래스를 포함한 튜플을 `exception'으로 전달해도 좋습니다.

만약 선택적인 `msg'와 함께 오직 `exception' 인자만 전달된다면, 테스트할 코드를 함수가 아닌 인라인으로 작성할 수 있도록 컨텍스트 관리자를 반환합니다:

@example
with self.assertRaises(SomeException):
    do_something()
@end example

컨텍스트 관리자로 사용되면, @ref{74f,,assertRaises()}는 추가적인 키워드 인자인 `msg'를 받을 수 있습니다.

The context manager will store the caught exception object in its
@code{exception} attribute.  This can be useful if the intention
is to perform additional checks on the exception raised:

@example
with self.assertRaises(SomeException) as cm:
    do_something()

the_exception = cm.exception
self.assertEqual(the_exception.error_code, 3)
@end example


버전 3.1에서 변경: @ref{74f,,assertRaises()}를 컨텍스트 관리자로 사용할 수 있도록 기능 추가.



버전 3.2에서 변경: Added the @code{exception} attribute.



버전 3.3에서 변경: 컨텍스트 관리자로 사용될 때 `msg' 키워드 인자 추가.

@end deffn

@geindex assertRaisesRegex() (unittest.TestCase 메서드)
@anchor{library/unittest unittest TestCase assertRaisesRegex}@anchor{751}
@deffn {메서드} assertRaisesRegex (exception, regex, callable, *args, **kwds)

@deffnx {메서드} assertRaisesRegex (exception, regex, *, msg=None)

@ref{74f,,assertRaises()}와 비슷하지만 발생한 예외의 문자열 표현이 `regex'에 일치하는지 테스트합니다. `regex'는 정규식 객체나 @ref{1431,,re.search()}에 사용되기 적합한 정규식 문자열이 될 수 있습니다. 예:

@example
self.assertRaisesRegex(ValueError, "invalid literal for.*XYZ'$",
                       int, 'XYZ')
@end example

또는:

@example
with self.assertRaisesRegex(ValueError, 'literal'):
   int('XYZ')
@end example


Added in version 3.1: @code{assertRaisesRegexp} 라는 이름으로 추가되었습니다.



버전 3.2에서 변경: @ref{751,,assertRaisesRegex()}으로 이름 변경.



버전 3.3에서 변경: 컨텍스트 관리자로 사용될 때 `msg' 키워드 인자 추가.

@end deffn

@geindex assertWarns() (unittest.TestCase 메서드)
@anchor{library/unittest unittest TestCase assertWarns}@anchor{1369}
@deffn {메서드} assertWarns (warning, callable, *args, **kwds)

@deffnx {메서드} assertWarns (warning, *, msg=None)

@ref{1369,,assertWarns()}에 전달된 어떤 위치 또는 키워드 인자와 함께 `callable'이 호출되었을 때 경고(warning)가 발생하는지 테스트합니다. `warning'이 발생하면 테스트를 통과하고, 그렇지 않으면 실패입니다. 예외가 발생하면 에러입니다. 여러 경고 모음을 잡기 위해서 경고 클래스를 포함한 튜플을 `warnings'로 전달해도 좋습니다.

만약 선택적인 `msg'와 함께 오직 `warning' 인자만 전달된다면, 테스트할 코드를 함수가 아닌 인라인으로 작성할 수 있도록 컨텍스트 관리자를 반환합니다:

@example
with self.assertWarns(SomeWarning):
    do_something()
@end example

컨텍스트 관리자로 사용되면, @ref{1369,,assertWarns()}는 추가적인 키워드 인자인 `msg'를 받을 수 있습니다.

The context manager will store the caught warning object in its
@code{warning} attribute, and the source line which triggered the
warnings in the @code{filename} and @code{lineno} attributes.
This can be useful if the intention is to perform additional checks
on the warning caught:

@example
with self.assertWarns(SomeWarning) as cm:
    do_something()

self.assertIn('myfile.py', cm.filename)
self.assertEqual(320, cm.lineno)
@end example

이 메서드는 호출될 때 적용될 경고 필터와 관계없이 작동합니다.


Added in version 3.2.



버전 3.3에서 변경: 컨텍스트 관리자로 사용될 때 `msg' 키워드 인자 추가.

@end deffn

@geindex assertWarnsRegex() (unittest.TestCase 메서드)
@anchor{library/unittest unittest TestCase assertWarnsRegex}@anchor{136a}
@deffn {메서드} assertWarnsRegex (warning, regex, callable, *args, **kwds)

@deffnx {메서드} assertWarnsRegex (warning, regex, *, msg=None)

@ref{1369,,assertWarns()}와 비슷하지만 발생한 경고의 메시지가 `regex'에 일치하는지 테스트합니다. `regex'는 정규식 객체나 @ref{1431,,re.search()}에 사용되기 적합한 정규식 문자열이 될 수 있습니다. 예:

@example
self.assertWarnsRegex(DeprecationWarning,
                      r'legacy_function\(\) is deprecated',
                      legacy_function, 'XYZ')
@end example

또는:

@example
with self.assertWarnsRegex(RuntimeWarning, 'unsafe frobnicating'):
    frobnicate('/etc/passwd')
@end example


Added in version 3.2.



버전 3.3에서 변경: 컨텍스트 관리자로 사용될 때 `msg' 키워드 인자 추가.

@end deffn

@geindex assertLogs() (unittest.TestCase 메서드)
@anchor{library/unittest unittest TestCase assertLogs}@anchor{a59}
@deffn {메서드} assertLogs (logger=None, level=None)

최소한 `level'로 `logger'나 그 자식들에 최소한 1개의 메시지가 기록되는지 테스트하는 컨텍스트 관리자입니다.

`logger'가 주어졌다면, @ref{d45,,logging.Logger} 객체이거나 로거의 이름인 @ref{169,,str}이어야 합니다. 기본값은 전파하지 않는 하위 로거에 의해 차단되지 않은 모든 메시지를 잡을 루트 로거입니다.

`level'이 주어졌다면, 로그 수준의 숫자 값이거나 그에 대응하는 문자열이어야 합니다(예를 들어 @code{"ERROR"}이거나  @ref{20de,,logging.ERROR}). 기본값은 @ref{20dc,,logging.INFO}입니다.

만약 @code{with} 블록 안에서 `logger'와 `level' 조건을 만족하는 최소한 1개의 메시지가 나왔다면 테스트는 성공하고, 그렇지 않으면 실패합니다.

컨텍스트 관리자에 의해 반환되는 객체는 조건에 일치하는 로그 메시지를 추적하기 위한 기록 도우미입니다. 이것은 2개의 어트리뷰트를 가지고 있습니다:

@geindex records (unittest.TestCase의 속성)
@anchor{library/unittest unittest TestCase records}@anchor{4633}
@deffn {속성} records

조건에 일치하는 메시지의 @ref{11e5,,logging.LogRecord} 객체 목록.
@end deffn

@geindex output (unittest.TestCase의 속성)
@anchor{library/unittest unittest TestCase output}@anchor{4634}
@deffn {속성} output

조건에 일치하는 메시지의 포맷 출력인 @ref{169,,str} 객체 목록.
@end deffn

예:

@example
with self.assertLogs('foo', level='INFO') as cm:
    logging.getLogger('foo').info('first message')
    logging.getLogger('foo.bar').error('second message')
self.assertEqual(cm.output, ['INFO:foo:first message',
                             'ERROR:foo.bar:second message'])
@end example


Added in version 3.4.

@end deffn

@geindex assertNoLogs() (unittest.TestCase 메서드)
@anchor{library/unittest unittest TestCase assertNoLogs}@anchor{a58}
@deffn {메서드} assertNoLogs (logger=None, level=None)

`logger'나 그 자식들에 주어진 `level' 이상으로 메시지가 기록되지 않았음을 테스트하는 컨텍스트 관리자입니다.

`logger'가 주어졌다면, @ref{d45,,logging.Logger} 객체이거나 로거의 이름인 @ref{169,,str}이어야 합니다. 기본값은 모든 메시지를 잡을 루트 로거입니다.

`level'이 주어졌다면, 로그 수준의 숫자 값이거나 그에 대응하는 문자열이어야 합니다(예를 들어 @code{"ERROR"}이거나  @ref{20de,,logging.ERROR}). 기본값은 @ref{20dc,,logging.INFO}입니다.

Unlike @ref{a59,,assertLogs()}, nothing will be returned by the context
manager.


Added in version 3.10.

@end deffn

더 구체적인 검사를 수행하기 위한 또 다른 메서드가 있습니다, 아래와 같이:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxx} 
@headitem

메서드

@tab

검사하는 내용

@tab

추가된 버전

@item

@ref{74d,,assertAlmostEqual(a@comma{} b)}

@tab

@code{round(a-b, 7) == 0}

@tab

@item

@ref{74e,,assertNotAlmostEqual(a@comma{} b)}

@tab

@code{round(a-b, 7) != 0}

@tab

@item

@ref{1544,,assertGreater(a@comma{} b)}

@tab

@code{a > b}

@tab

3.1

@item

@ref{1545,,assertGreaterEqual(a@comma{} b)}

@tab

@code{a >= b}

@tab

3.1

@item

@ref{1546,,assertLess(a@comma{} b)}

@tab

@code{a < b}

@tab

3.1

@item

@ref{1547,,assertLessEqual(a@comma{} b)}

@tab

@code{a <= b}

@tab

3.1

@item

@ref{750,,assertRegex(s@comma{} r)}

@tab

@code{r.search(s)}

@tab

3.1

@item

@ref{752,,assertNotRegex(s@comma{} r)}

@tab

@code{not r.search(s)}

@tab

3.2

@item

@ref{142f,,assertCountEqual(a@comma{} b)}

@tab

순서와 상관없이 `a'와 `b'가 같은 개수의 같은 요소를 가졌는지.

@tab

3.2

@item

@ref{2b8,,assertStartsWith(a@comma{} b)}

@tab

@code{a.startswith(b)}

@tab

3.14

@item

@ref{2b9,,assertNotStartsWith(a@comma{} b)}

@tab

@code{not a.startswith(b)}

@tab

3.14

@item

@ref{2ba,,assertEndsWith(a@comma{} b)}

@tab

@code{a.endswith(b)}

@tab

3.14

@item

@ref{2bb,,assertNotEndsWith(a@comma{} b)}

@tab

@code{not a.endswith(b)}

@tab

3.14

@item

@ref{2b4,,assertHasAttr(a@comma{} b)}

@tab

@code{hastattr(a, b)}

@tab

3.14

@item

@ref{2b5,,assertNotHasAttr(a@comma{} b)}

@tab

@code{not hastattr(a, b)}

@tab

3.14

@end multitable


@geindex assertAlmostEqual() (unittest.TestCase 메서드)
@geindex assertNotAlmostEqual() (unittest.TestCase 메서드)
@anchor{library/unittest unittest TestCase assertAlmostEqual}@anchor{74d}
@deffn {메서드} assertAlmostEqual (first, second, places=7, msg=None, delta=None)
@anchor{library/unittest unittest TestCase assertNotAlmostEqual}@anchor{74e}
@deffnx {메서드} assertNotAlmostEqual (first, second, places=7, msg=None, delta=None)

`first'와 `second'가 근사하게 같은지(또는 근사하게 같지 않은지) 테스트합니다. 이는 값 차이를 계산하고, 주어진 소수 `자릿(places)'수(기본값 7)로 반올림한 뒤, 0과 비교하는 것으로 이루어집니다. 이 메서드는 값을 `유효 숫자 자릿수(significant digits)'가 아닌 주어진 `소수 자릿수(decimal places)'(즉, @ref{14df,,round()} 함수와 같이)로 반올림합니다.

만약 `places' 대신에 `delta'가 주어진다면 `first'와 `second'의 값 차이는 반드시 `delta'보다 작거나 같아야(또는 커야) 합니다.

`delta'와 `places'가 동시에 주어지면 @ref{198,,TypeError}가 발생합니다.


버전 3.2에서 변경: @ref{74d,,assertAlmostEqual()}은 같다고 비교되는 거의 동등한 객체를 자동으로 고려합니다. @ref{74e,,assertNotAlmostEqual()}은 객체가 같다고 비교되면 자동으로 실패합니다. `delta' 키워드 인자를 추가.

@end deffn

@geindex assertGreater() (unittest.TestCase 메서드)
@geindex assertGreaterEqual() (unittest.TestCase 메서드)
@geindex assertLess() (unittest.TestCase 메서드)
@geindex assertLessEqual() (unittest.TestCase 메서드)
@anchor{library/unittest unittest TestCase assertGreater}@anchor{1544}
@deffn {메서드} assertGreater (first, second, msg=None)
@anchor{library/unittest unittest TestCase assertGreaterEqual}@anchor{1545}
@deffnx {메서드} assertGreaterEqual (first, second, msg=None)
@anchor{library/unittest unittest TestCase assertLess}@anchor{1546}
@deffnx {메서드} assertLess (first, second, msg=None)
@anchor{library/unittest unittest TestCase assertLessEqual}@anchor{1547}
@deffnx {메서드} assertLessEqual (first, second, msg=None)

`first'를 `second'와 비교해서 각각 메서드 이름에 해당하는 >, >=, <, <= 인지 테스트합니다. 그렇지 않으면 테스트는 실패합니다:

@example
>>> self.assertGreaterEqual(3, 4)
AssertionError: "3" unexpectedly not greater than or equal to "4"
@end example


Added in version 3.1.

@end deffn

@geindex assertRegex() (unittest.TestCase 메서드)
@geindex assertNotRegex() (unittest.TestCase 메서드)
@anchor{library/unittest unittest TestCase assertRegex}@anchor{750}
@deffn {메서드} assertRegex (text, regex, msg=None)
@anchor{library/unittest unittest TestCase assertNotRegex}@anchor{752}
@deffnx {메서드} assertNotRegex (text, regex, msg=None)

`regex' 검색이 `text'에 일치하는지(아닌지) 테스트합니다. 실패의 경우, 에러 메시지는 패턴과 `text'(또는 패턴과 예상과 달리 일치한 `text'의 부분)를 포함할 것입니다. `regex'는 정규식 객체나 @ref{1431,,re.search()}에 사용되기 적합한 정규식 문자열이 될 수 있습니다.


Added in version 3.1: @code{assertRegexpMatches} 라는 이름으로 추가되었습니다.



버전 3.2에서 변경: @code{assertRegexpMatches()} 메서드가 @ref{750,,assertRegex()}로 이름 변경되었습니다.



Added in version 3.2: @code{assertNotRegex()}.

@end deffn

@geindex assertCountEqual() (unittest.TestCase 메서드)
@anchor{library/unittest unittest TestCase assertCountEqual}@anchor{142f}
@deffn {메서드} assertCountEqual (first, second, msg=None)

`first' 시퀀스가 순서에 상관없이 `second'와 같은 요소를 포함하는지 테스트합니다. 그렇지 않은 경우, 시퀀스들의 차이를 나열한 에러 메시지가 생성됩니다.

`first'와 `second'를 비교할 때 중복된 요소는 무시하지 `않습니다'. 두 개의 시퀀스에 각 요소가 같은 수 만큼 있는 것을 확인합니다. @code{assertEqual(Counter(list(first)), Counter(list(second)))}와 같지만 해시 불가능한(unhashable) 시퀀스에도 작동합니다.


Added in version 3.2.

@end deffn

@geindex assertStartsWith() (unittest.TestCase 메서드)
@anchor{library/unittest unittest TestCase assertStartsWith}@anchor{2b8}
@deffn {메서드} assertStartsWith (s, prefix, msg=None)
@end deffn

@geindex assertNotStartsWith() (unittest.TestCase 메서드)
@anchor{library/unittest unittest TestCase assertNotStartsWith}@anchor{2b9}
@deffn {메서드} assertNotStartsWith (s, prefix, msg=None)

Test that the Unicode or byte string `s' starts (or does not start)
with a `prefix'.
`prefix' can also be a tuple of strings to try.


Added in version 3.14.

@end deffn

@geindex assertEndsWith() (unittest.TestCase 메서드)
@anchor{library/unittest unittest TestCase assertEndsWith}@anchor{2ba}
@deffn {메서드} assertEndsWith (s, suffix, msg=None)
@end deffn

@geindex assertNotEndsWith() (unittest.TestCase 메서드)
@anchor{library/unittest unittest TestCase assertNotEndsWith}@anchor{2bb}
@deffn {메서드} assertNotEndsWith (s, suffix, msg=None)

Test that the Unicode or byte string `s' ends (or does not end)
with a `suffix'.
`suffix' can also be a tuple of strings to try.


Added in version 3.14.

@end deffn

@geindex assertHasAttr() (unittest.TestCase 메서드)
@anchor{library/unittest unittest TestCase assertHasAttr}@anchor{2b4}
@deffn {메서드} assertHasAttr (obj, name, msg=None)
@end deffn

@geindex assertNotHasAttr() (unittest.TestCase 메서드)
@anchor{library/unittest unittest TestCase assertNotHasAttr}@anchor{2b5}
@deffn {메서드} assertNotHasAttr (obj, name, msg=None)

Test that the object `obj' has (or has not) an attribute `name'.


Added in version 3.14.

@end deffn
@anchor{library/unittest type-specific-methods}@anchor{4632}
@ref{74b,,assertEqual()} 메서드는 같은 형의 객체의 동등성 검사를 다른 형-특화 메서드에게로 보냅니다. 이러한 메서드들은 대부분의 내장 형에 대해서 이미 구현되어 있지만, @ref{154d,,addTypeEqualityFunc()}을 사용하여 새로운 메서드를 등록하는 것도 가능합니다:

@geindex addTypeEqualityFunc() (unittest.TestCase 메서드)
@anchor{library/unittest unittest TestCase addTypeEqualityFunc}@anchor{154d}
@deffn {메서드} addTypeEqualityFunc (typeobj, function)

정확히 같은 (서브 클래스가 아닌) `typeobj' 형의 두 객체가 같은지 비교 검사하기 위해 @ref{74b,,assertEqual()}한테 불리는 형-특화 메서드를 등록합니다. `function'은 반드시 2개의 위치 인자를 받아야 하고 @code{assertEqual()}이 그러한 것처럼 msg=None 키워드 인자를 세 번째로 받아야 합니다. 이것은 처음 2개의 매개변수가 같지 않은 것이 확인될 경우 @ref{45c9,,self.failureException(msg)}을 반드시 발생시켜야 합니다 – 에러 메시지에 유용한 정보를 제공하고 비동등성을 자세히 설명할 수 있을 것입니다.


Added in version 3.1.

@end deffn

@ref{74b,,assertEqual()}에서 자동으로 사용하는 형-특화 메서드 목록은 다음 표에 정리되어 있습니다. 보통은 이 메서드를 직접 부를 필요가 없다는 것을 기억하십시오.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxx} 
@headitem

메서드

@tab

을 비교하기 위해

@tab

추가된 버전

@item

@ref{1548,,assertMultiLineEqual(a@comma{} b)}

@tab

문자열

@tab

3.1

@item

@ref{148e,,assertSequenceEqual(a@comma{} b)}

@tab

시퀀스

@tab

3.1

@item

@ref{148c,,assertListEqual(a@comma{} b)}

@tab

리스트

@tab

3.1

@item

@ref{148d,,assertTupleEqual(a@comma{} b)}

@tab

튜플

@tab

3.1

@item

@ref{148a,,assertSetEqual(a@comma{} b)}

@tab

집합 또는 불변 집합

@tab

3.1

@item

@ref{148b,,assertDictEqual(a@comma{} b)}

@tab

딕셔너리

@tab

3.1

@end multitable


@geindex assertMultiLineEqual() (unittest.TestCase 메서드)
@anchor{library/unittest unittest TestCase assertMultiLineEqual}@anchor{1548}
@deffn {메서드} assertMultiLineEqual (first, second, msg=None)

여러 줄 문자열인 `first'와 `second'가 같은지 테스트합니다. 같지 않을 경우 에러 메시지에 다른 부분이 강조된 두 문자열의 차이가 포함됩니다. 이 메서드는 @ref{74b,,assertEqual()}에서 문자열을 비교할 때 기본적으로 사용됩니다.


Added in version 3.1.

@end deffn

@geindex assertSequenceEqual() (unittest.TestCase 메서드)
@anchor{library/unittest unittest TestCase assertSequenceEqual}@anchor{148e}
@deffn {메서드} assertSequenceEqual (first, second, msg=None, seq_type=None)

2개의 시퀀스가 같은지 테스트합니다. `seq_type'이 전달된 경우, `first'와 `second' 둘 다 `seq_type'의 인스턴스이어야 하고 그렇지 않은 경우 실패가 발생합니다. 시퀀스가 다른 경우, 에러 메시지는 2개 사이의 차이점을 보여주게 됩니다.

이 메서드는 @ref{74b,,assertEqual()}에서 직접 호출되진 않지만, @ref{148c,,assertListEqual()}와 @ref{148d,,assertTupleEqual()}을 구현할 때 사용됩니다.


Added in version 3.1.

@end deffn

@geindex assertListEqual() (unittest.TestCase 메서드)
@geindex assertTupleEqual() (unittest.TestCase 메서드)
@anchor{library/unittest unittest TestCase assertListEqual}@anchor{148c}
@deffn {메서드} assertListEqual (first, second, msg=None)
@anchor{library/unittest unittest TestCase assertTupleEqual}@anchor{148d}
@deffnx {메서드} assertTupleEqual (first, second, msg=None)

2개의 리스트나 튜플이 같은지 테스트합니다. 만약 같지 않다면 에러 메시지는 2개 사이의 차이점만 보여주게 됩니다. 매개변수 중 하나가 잘못된 형인 경우 에러가 발생합니다. 이 메서드는 @ref{74b,,assertEqual()}에서 리스트와 튜플을 비교할 때 기본적으로 사용됩니다.


Added in version 3.1.

@end deffn

@geindex assertSetEqual() (unittest.TestCase 메서드)
@anchor{library/unittest unittest TestCase assertSetEqual}@anchor{148a}
@deffn {메서드} assertSetEqual (first, second, msg=None)

2개의 집합이 같은지 테스트합니다. 같지 않은 경우 에러 메시지는 집합 사이의 차이를 나열하게 됩니다. 이 메서드는 @ref{74b,,assertEqual()}에서 집합이나 불변 집합을 비교할 때 기본적으로 사용됩니다.

Fails if either of `first' or `second' does not have a @ref{269c,,difference()}
method.


Added in version 3.1.

@end deffn

@geindex assertDictEqual() (unittest.TestCase 메서드)
@anchor{library/unittest unittest TestCase assertDictEqual}@anchor{148b}
@deffn {메서드} assertDictEqual (first, second, msg=None)

2개의 딕셔너리가 같은지 테스트합니다. 같지 않은 경우 에러 메시지는 딕셔너리 사이의 차이를 보여주게 됩니다. 이 메서드는 @ref{74b,,assertEqual()}에서 딕셔너리를 비교할 때 기본적으로 사용될 것입니다.


Added in version 3.1.

@end deffn
@anchor{library/unittest other-methods-and-attrs}@anchor{4635}
마지막으로 @ref{2b3,,TestCase}가 다음의 메서드와 어트리뷰트를 제공합니다:

@geindex fail() (unittest.TestCase 메서드)
@anchor{library/unittest unittest TestCase fail}@anchor{4636}
@deffn {메서드} fail (msg=None)

무조건 테스트 실패 신호를 보냅니다, 에러 메시지를 위해 `msg'나 @code{None}을 전달합니다.
@end deffn

@geindex failureException (unittest.TestCase의 속성)
@anchor{library/unittest unittest TestCase failureException}@anchor{45c9}
@deffn {속성} failureException

이 클래스 어트리뷰트는 테스트 메서드에서 발생한 예외를 줍니다. 만약 테스트 프레임워크가 추가 정보를 전달하기 위해 특수한 예외를 사용할 필요가 있다면, 프레임워크와 “공정하게 행동하기” 위해서 이 예외를 서브 클래스해야 합니다. 이 어트리뷰트의 초깃값은 @ref{8b7,,AssertionError} 입니다.
@end deffn

@geindex longMessage (unittest.TestCase의 속성)
@anchor{library/unittest unittest TestCase longMessage}@anchor{153a}
@deffn {속성} longMessage

이 클래스 어트리뷰트는 실패한 assertXYY 호출에 msg 인자로 전달된 사용자 정의 실패 메시지가 어떻게 동작하는지를 결정합니다. @code{True}가 기본값입니다. 이 경우, 사용자 정의 메시지가 표준 실패 메시지 끝에 추가됩니다. @code{False}로 설정할 경우 사용자 정의 메시지가 표준 메시지를 대체합니다.

이 클래스 설정은 인스턴스 어트리뷰트를 설정하여 개별 테스트 메서드에 의해 재정의될 수 있습니다, assert 메서드를 호출하기 전에 self.longMessage를 @code{True} 또는 @code{False}로 설정하는 것입니다.

이 클래스 설정은 각 테스트 호출 전에 재설정됩니다.


Added in version 3.1.

@end deffn

@geindex maxDiff (unittest.TestCase의 속성)
@anchor{library/unittest unittest TestCase maxDiff}@anchor{1430}
@deffn {속성} maxDiff

이 어트리뷰트는 실패 시 diff를 보고하는 assert 메서드의 최대 diff 출력 길이를 설정합니다. 기본값은 80*8 문자입니다. 이 어트리뷰트에 영향을 받는 assert 메서드는 @ref{148e,,assertSequenceEqual()}(이것에 위임하는 모든 시퀀스 비교 메서드를 포함), @ref{148b,,assertDictEqual()}, @ref{1548,,assertMultiLineEqual()} 입니다.

@code{maxDiff}를 @code{None}으로 설정하면 diff의 최대 길이 제한이 없어지는 것을 뜻합니다.


Added in version 3.2.

@end deffn

테스트 프레임워크는 테스트에 관한 정보를 수집하기 위해 다음의 메서드를 사용할 수 있습니다:

@geindex countTestCases() (unittest.TestCase 메서드)
@anchor{library/unittest unittest TestCase countTestCases}@anchor{4637}
@deffn {메서드} countTestCases ()

이 테스트 객체에 해당하는 테스트 개수를 반환합니다. @ref{2b3,,TestCase} 인스턴스에 대해서는 이것은 항상 @code{1}입니다.
@end deffn

@geindex defaultTestResult() (unittest.TestCase 메서드)
@anchor{library/unittest unittest TestCase defaultTestResult}@anchor{4631}
@deffn {메서드} defaultTestResult ()

이 테스트 케이스 클래스를 위해서 사용되는 테스트 결과 클래스의 인스턴스를 반환합니다(@ref{136b,,run()} 메서드에 다른 결과 인스턴스가 전달되지 않은 경우에).

@ref{2b3,,TestCase} 인스턴스에 대해서는 이것은 항상 @ref{136c,,TestResult}의 인스턴스입니다; @code{TestCase}의 서브 클래스는 이것을 필요에 따라 재정의해야 합니다.
@end deffn

@geindex id() (unittest.TestCase 메서드)
@anchor{library/unittest unittest TestCase id}@anchor{4638}
@deffn {메서드} id ()

특정 테스트 케이스를 식별하는 문자열을 반환합니다. 이것은 보통 모듈과 클래스 이름을 포함한 테스트 메서드의 완전한 이름(full name)입니다.
@end deffn

@geindex shortDescription() (unittest.TestCase 메서드)
@anchor{library/unittest unittest TestCase shortDescription}@anchor{4639}
@deffn {메서드} shortDescription ()

테스트의 설명을 반환하거나 설명이 제공되지 않았으면 @code{None}을 반환합니다. 이 메서드의 기본 구현은 가능하다면 테스트 메서드의 독스트링의 첫 번째 줄을 반환하고 그렇지 않으면 @code{None}을 반환합니다.


버전 3.1에서 변경: 3.1 버전에서 docstring이 있는 경우에도 짧은 설명에 테스트 이름을 추가하도록 변경되었습니다. 이것은 unittest 확장과 호환성 문제를 일으켰고 테스트 이름 추가는 파이썬 3.2에서 @ref{753,,TextTestResult}로 옮겨졌습니다.

@end deffn

@geindex addCleanup() (unittest.TestCase 메서드)
@anchor{library/unittest unittest TestCase addCleanup}@anchor{c73}
@deffn {메서드} addCleanup (function, /, *args, **kwargs)

테스트 중에 사용된 자원을 정리하기 위해 @ref{153f,,tearDown()} 이후에 불리는 함수를 추가합니다. 함수들은 추가된 순서의 반대 순서대로 불리게 됩니다(@abbr{LIFO}). 함수가 추가될 때 @ref{c73,,addCleanup()}에 같이 전달된 위치 인자나 키워드 인자와 함께 호출됩니다.

만약 @ref{153e,,setUp()}이 실패한다면, 즉 @ref{153f,,tearDown()}이 불리지 않더라도, 정리 함수들은 여전히 불리게 될 것입니다.


Added in version 3.1.

@end deffn

@geindex enterContext() (unittest.TestCase 메서드)
@anchor{library/unittest unittest TestCase enterContext}@anchor{8c7}
@deffn {메서드} enterContext (cm)

Enter the supplied @ref{1e1,,context manager}.  If successful, also
add its @ref{1505,,__exit__()} method as a cleanup function by
@ref{c73,,addCleanup()} and return the result of the
@ref{7e3,,__enter__()} method.


Added in version 3.11.

@end deffn

@geindex doCleanups() (unittest.TestCase 메서드)
@anchor{library/unittest unittest TestCase doCleanups}@anchor{153d}
@deffn {메서드} doCleanups ()

이 메서드는 @ref{153f,,tearDown()} 이후나, @ref{153e,,setUp()}이 예외를 발생시키면 @code{setUp()}이후에 조건 없이 호출됩니다.

@ref{c73,,addCleanup()}에서 추가된 모든 정리 함수들을 호출하는 책임이 있습니다. 만약 정리 함수를 @ref{153f,,tearDown()} `이전에' 불러야 할 필요가 있다면 @ref{153d,,doCleanups()}를 직접 부를 수 있습니다.

@ref{153d,,doCleanups()}는 한 번에 하나씩 정리 함수 스택에서 메서드를 꺼내기 때문에 언제든지 호출될 수 있습니다.


Added in version 3.1.

@end deffn

@geindex addClassCleanup() (unittest.TestCase의 클래스 메서드)
@anchor{library/unittest unittest TestCase addClassCleanup}@anchor{c42}
@deffn {메서드} classmethod addClassCleanup (function, /, *args, **kwargs)

테스트 클래스 중에 사용된 자원을 정리하기 위해 @ref{153c,,tearDownClass()} 이후에 불리는 함수를 추가합니다. 함수들은 추가된 순서의 반대 순서대로 불리게 됩니다(@abbr{LIFO}). 함수가 추가될 때 @ref{c42,,addClassCleanup()}에 같이 전달된 위치 인자나 키워드 인자와 함께 호출됩니다.

만약 @ref{c40,,setUpClass()}가 실패한다면, 즉 @ref{153c,,tearDownClass()}가 불리지 않더라도, 정리 함수들은 여전히 불리게 될 것입니다.


Added in version 3.8.

@end deffn

@geindex enterClassContext() (unittest.TestCase의 클래스 메서드)
@anchor{library/unittest unittest TestCase enterClassContext}@anchor{8c8}
@deffn {메서드} classmethod enterClassContext (cm)

Enter the supplied @ref{1e1,,context manager}.  If successful, also
add its @ref{1505,,__exit__()} method as a cleanup function by
@ref{c42,,addClassCleanup()} and return the result of the
@ref{7e3,,__enter__()} method.


Added in version 3.11.

@end deffn

@geindex doClassCleanups() (unittest.TestCase의 클래스 메서드)
@anchor{library/unittest unittest TestCase doClassCleanups}@anchor{463a}
@deffn {메서드} classmethod doClassCleanups ()

이 메서드는 @ref{153c,,tearDownClass()} 이후나, @ref{c40,,setUpClass()}이 예외를 발생시키면 @code{setUpClass()}이후에 조건 없이 호출됩니다.

@ref{c42,,addClassCleanup()}에서 추가된 모든 정리 함수들을 호출하는 책임이 있습니다. 만약 정리 함수를 @ref{153c,,tearDownClass()} `이전에' 호출해야 할 필요가 있다면 @ref{463a,,doClassCleanups()}를 직접 호출할 수 있습니다.

@ref{463a,,doClassCleanups()}는 한 번에 하나씩 정리 함수 스택에서 메서드를 꺼내기 때문에 언제든지 호출될 수 있습니다.


Added in version 3.8.

@end deffn
@end deffn

@geindex IsolatedAsyncioTestCase (unittest 클래스)
@anchor{library/unittest unittest IsolatedAsyncioTestCase}@anchor{361}
@deffn {클래스} unittest.IsolatedAsyncioTestCase (methodName='runTest')

이 클래스는 @ref{2b3,,TestCase}와 유사한 API를 제공하며 코루틴을 테스트 함수로 받아들입니다.


Added in version 3.8.


@geindex loop_factory (unittest.IsolatedAsyncioTestCase의 속성)
@anchor{library/unittest unittest IsolatedAsyncioTestCase loop_factory}@anchor{463b}
@deffn {속성} loop_factory

The `loop_factory' passed to @ref{2f5,,asyncio.Runner}. Override
in subclasses with @ref{1a67,,asyncio.EventLoop} to avoid using the
asyncio policy system.


Added in version 3.13.

@end deffn

@geindex asyncSetUp() (unittest.IsolatedAsyncioTestCase 메서드)
@anchor{library/unittest unittest IsolatedAsyncioTestCase asyncSetUp}@anchor{463c}
@deffn {메서드} async asyncSetUp ()

Method called to prepare the test fixture. This is called after @ref{153e,,TestCase.setUp()}.
This is called immediately before calling the test method; other than
@ref{8b7,,AssertionError} or @ref{11e3,,SkipTest}, any exception raised by this method
will be considered an error rather than a test failure. The default implementation
does nothing.
@end deffn

@geindex asyncTearDown() (unittest.IsolatedAsyncioTestCase 메서드)
@anchor{library/unittest unittest IsolatedAsyncioTestCase asyncTearDown}@anchor{463d}
@deffn {메서드} async asyncTearDown ()

Method called immediately after the test method has been called and the
result recorded.  This is called before @ref{153f,,tearDown()}. This is called even if
the test method raised an exception, so the implementation in subclasses may need
to be particularly careful about checking internal state.  Any exception, other than
@ref{8b7,,AssertionError} or @ref{11e3,,SkipTest}, raised by this method will be
considered an additional error rather than a test failure (thus increasing
the total number of reported errors). This method will only be called if
the @ref{463c,,asyncSetUp()} succeeds, regardless of the outcome of the test method.
The default implementation does nothing.
@end deffn

@geindex addAsyncCleanup() (unittest.IsolatedAsyncioTestCase 메서드)
@anchor{library/unittest unittest IsolatedAsyncioTestCase addAsyncCleanup}@anchor{463e}
@deffn {메서드} addAsyncCleanup (function, /, *args, **kwargs)

이 메서드는 정리 함수로 사용할 수 있는 코루틴을 받아들입니다.
@end deffn

@geindex enterAsyncContext() (unittest.IsolatedAsyncioTestCase 메서드)
@anchor{library/unittest unittest IsolatedAsyncioTestCase enterAsyncContext}@anchor{8c9}
@deffn {메서드} async enterAsyncContext (cm)

Enter the supplied @ref{7ef,,asynchronous context manager}.  If successful,
also add its @ref{19a2,,__aexit__()} method as a cleanup function by
@ref{463e,,addAsyncCleanup()} and return the result of the
@ref{241e,,__aenter__()} method.


Added in version 3.11.

@end deffn

@geindex run() (unittest.IsolatedAsyncioTestCase 메서드)
@anchor{library/unittest unittest IsolatedAsyncioTestCase run}@anchor{463f}
@deffn {메서드} run (result=None)

Sets up a new event loop to run the test, collecting the result into
the @ref{136c,,TestResult} object passed as `result'.  If `result' is
omitted or @code{None}, a temporary result object is created (by calling
the @ref{4631,,defaultTestResult()} method) and used. The result object is
returned to @code{run()}’s caller. At the end of the test all the tasks
in the event loop are cancelled.
@end deffn

순서를 보여주는 예:

@example
from unittest import IsolatedAsyncioTestCase

events = []


class Test(IsolatedAsyncioTestCase):


    def setUp(self):
        events.append("setUp")

    async def asyncSetUp(self):
        self._async_connection = await AsyncConnection()
        events.append("asyncSetUp")

    async def test_response(self):
        events.append("test_response")
        response = await self._async_connection.get("https://example.com")
        self.assertEqual(response.status_code, 200)
        self.addAsyncCleanup(self.on_cleanup)

    def tearDown(self):
        events.append("tearDown")

    async def asyncTearDown(self):
        await self._async_connection.close()
        events.append("asyncTearDown")

    async def on_cleanup(self):
        events.append("cleanup")

if __name__ == "__main__":
    unittest.main()
@end example

테스트를 실행한 후, @code{events}에는 @code{["setUp", "asyncSetUp", "test_response", "asyncTearDown", "tearDown", "cleanup"]}가 포함됩니다.
@end deffn

@geindex FunctionTestCase (unittest 클래스)
@anchor{library/unittest unittest FunctionTestCase}@anchor{1a79}
@deffn {클래스} unittest.FunctionTestCase (testFunc, setUp=None, tearDown=None, description=None)

This class implements the portion of the @ref{2b3,,TestCase} interface which
allows the test runner to drive the test, but does not provide the methods
which test code can use to check and report errors.  This is used to create
test cases using legacy test code, allowing it to be integrated into a
@code{unittest}-based test framework.
@end deffn

@node 테스트 분류,테스트를 로드하고 실행하기,테스트 케이스,클래스와 함수
@anchor{library/unittest grouping-tests}@anchor{4640}@anchor{library/unittest testsuite-objects}@anchor{4641}
@subsubsection 테스트 분류


@geindex TestSuite (unittest 클래스)
@anchor{library/unittest unittest TestSuite}@anchor{ff4}
@deffn {클래스} unittest.TestSuite (tests=())

이 클래스는 개별 테스트 케이스와 테스트 묶음의 집합체를 나타냅니다. 이 클래스는 테스트 실행자가 이것을 다른 테스트 케이스처럼 실행할 수 있기 위해 필요한 인터페이스를 제공합니다. @ref{ff4,,TestSuite} 인스턴스를 실행하는 것은 테스트 묶음을 이터레이션하면서 각 테스트를 개별적으로 실행하는 것과 같습니다.

`tests'가 주어졌다면, 그것은 초기에 이 테스트 묶음을 만들 때 사용될 개별 테스트 케이스이거나 다른 테스트 묶음의 이터러블이어야 합니다. 나중에 컬렉션에 테스트 케이스나 테스트 묶음을 추가할 수 있는 추가 메서드가 제공됩니다.

@ref{ff4,,TestSuite} 객체는 @ref{2b3,,TestCase} 객체와 흡사하게 행동합니다만, 테스트를 실제로 구현하지 않는 것이 다릅니다. 대신에, 이것은 다 같이 실행되어야 하는 테스트 그룹에 테스트들을 모으는 데 사용됩니다. @code{TestSuite} 인스턴스에 테스트를 추가하기 위해 몇몇 추가적인 메서드를 사용할 수 있습니다.

@geindex addTest() (unittest.TestSuite 메서드)
@anchor{library/unittest unittest TestSuite addTest}@anchor{4642}
@deffn {메서드} addTest (test)

테스트 묶음에 @ref{2b3,,TestCase}나 @ref{ff4,,TestSuite} 추가하기.
@end deffn

@geindex addTests() (unittest.TestSuite 메서드)
@anchor{library/unittest unittest TestSuite addTests}@anchor{4643}
@deffn {메서드} addTests (tests)

이 테스트 묶음에 @ref{2b3,,TestCase}와 @ref{ff4,,TestSuite} 인스턴스의 이터러블에서 나온 모든 테스트를 추가하기.

이것은 `tests'를 이터레이션하면서 각 요소에 대해 @ref{4642,,addTest()}를 호출하는 것과 같습니다.
@end deffn

@ref{ff4,,TestSuite}는 다음 메서드를 @ref{2b3,,TestCase}와 공유합니다:

@geindex run() (unittest.TestSuite 메서드)
@anchor{library/unittest unittest TestSuite run}@anchor{4644}
@deffn {메서드} run (result)

이 테스트 묶음과 연관된 테스트를 실행하고, `result'로 전달된 테스트 결과 객체에 결과를 수집합니다. @ref{136b,,TestCase.run()}과 달리 @ref{4644,,TestSuite.run()}은 결과 객체가 반드시 전달되어야 합니다.
@end deffn

@geindex debug() (unittest.TestSuite 메서드)
@anchor{library/unittest unittest TestSuite debug}@anchor{4645}
@deffn {메서드} debug ()

결과를 수집하지 않고 이 테스트 묶음과 연관된 테스트를 실행합니다. 이것은 테스트에서 발생한 예외가 호출자로 전파될 수 있게 해서 디버거 환경에서 테스트를 실행할 때 사용될 수 있습니다.
@end deffn

@geindex countTestCases() (unittest.TestSuite 메서드)
@anchor{library/unittest unittest TestSuite countTestCases}@anchor{4646}
@deffn {메서드} countTestCases ()

이 테스트 객체에 해당하는 테스트 개수를 반환합니다, 모든 개별 테스트와 서브-테스트 묶음을 포함합니다.
@end deffn

@geindex __iter__() (unittest.TestSuite 메서드)
@anchor{library/unittest unittest TestSuite __iter__}@anchor{1228}
@deffn {메서드} __iter__ ()

Tests grouped by a @code{TestSuite} are always accessed by iteration.
Subclasses can lazily provide tests by overriding @code{__iter__()}. Note
that this method may be called several times on a single suite (for
example when counting tests or comparing for equality) so the tests
returned by repeated iterations before @ref{4644,,TestSuite.run()} must be the
same for each call iteration. After @code{TestSuite.run()}, callers should
not rely on the tests returned by this method unless the caller uses a
subclass that overrides @code{TestSuite._removeTestAtIndex()} to preserve
test references.


버전 3.2에서 변경: 이전 버전에서는 @ref{ff4,,TestSuite}가 이터레이션을 사용하기보다는 직접 테스트에 접근했습니다, 따라서 @code{__iter__()}를 재정의하는 것은 테스트를 제공하기에 충분하지 않았습니다.



버전 3.4에서 변경: In earlier versions the @code{TestSuite} held references to each
@ref{2b3,,TestCase} after @ref{4644,,TestSuite.run()}. Subclasses can restore
that behavior by overriding @code{TestSuite._removeTestAtIndex()}.

@end deffn

In the typical usage of a @code{TestSuite} object, the @ref{4644,,run()} method
is invoked by a @code{TestRunner} rather than by the end-user test harness.
@end deffn

@node 테스트를 로드하고 실행하기,,테스트 분류,클래스와 함수
@anchor{library/unittest loading-and-running-tests}@anchor{4647}
@subsubsection 테스트를 로드하고 실행하기


@geindex TestLoader (unittest 클래스)
@anchor{library/unittest unittest TestLoader}@anchor{592}
@deffn {클래스} unittest.TestLoader

The @code{TestLoader} class is used to create test suites from classes and
modules.  Normally, there is no need to create an instance of this class; the
@code{unittest} module provides an instance that can be shared as
@ref{4648,,unittest.defaultTestLoader}.  Using a subclass or instance, however,
allows customization of some configurable properties.

@ref{592,,TestLoader} 객체는 다음 어트리뷰트를 가집니다:

@geindex errors (unittest.TestLoader의 속성)
@anchor{library/unittest unittest TestLoader errors}@anchor{108b}
@deffn {속성} errors

테스트를 로드하는 동안 발생한 치명적이지 않은(non-fatal) 에러 목록입니다. 어떤 시점에도 로더에 의해 재설정되지 않습니다. 치명적인 에러는 예외를 발생시키는 관련 메서드에 의해 신호가 발생하여 호출자에게 전달됩니다. 치명적이지 않은 에러는 실행 시에 원래 에러를 발생시킬 합성(synthetic) 테스트가 표시하기도 합니다.


Added in version 3.5.

@end deffn

@ref{592,,TestLoader} 객체는 다음 메서드를 가집니다:

@geindex loadTestsFromTestCase() (unittest.TestLoader 메서드)
@anchor{library/unittest unittest TestLoader loadTestsFromTestCase}@anchor{594}
@deffn {메서드} loadTestsFromTestCase (testCaseClass)

Return a suite of all test cases contained in the @ref{2b3,,TestCase}-derived
@code{testCaseClass}.

A test case instance is created for each method named by
@ref{595,,getTestCaseNames()}. By default these are the method names
beginning with @code{test}. If @code{getTestCaseNames()} returns no
methods, but the @code{runTest()} method is implemented, a single test
case is created for that method instead.
@end deffn

@geindex loadTestsFromModule() (unittest.TestLoader 메서드)
@anchor{library/unittest unittest TestLoader loadTestsFromModule}@anchor{593}
@deffn {메서드} loadTestsFromModule (module, *, pattern=None)

주어진 모듈에 포함된 모든 테스트 케이스 묶음을 반환합니다. 이 메서드는 @ref{2b3,,TestCase}에서 파생된 클래스를 찾기 위해 `module'을 검색하고 클래스에 정의된 각 테스트 메서드를 위해 클래스의 인스턴스를 생성합니다.

@cartouche
@quotation 참고 
@ref{2b3,,TestCase}에서 파생된 클래스의 계층 사용이 픽스쳐와 도우미 함수를 공유하는 데 편리할 수 있지만 직접 인스턴스화를 하도록 의도되지 않은 베이스 클래스에 테스트 메서드를 정의하는 것은 이 메서드와 잘 작동하지 않습니다. 그러나 그렇게 하는 것이 픽스처들이 다르고 서브 클래스에서 정의될 경우에는 유용할 수 있습니다.
@end quotation
@end cartouche

만약 모듈이 @code{load_tests} 함수를 제공한다면 테스트 로드를 위해 이것을 호출할 것입니다. 이것은 모듈이 테스트 로드를 사용자 정의할 수 있도록 해줍니다. 이것은 @ref{4621,,load_tests 프로토콜}입니다. `pattern' 인자는 @code{load_tests}에 세 번째 인자로 전달됩니다.


버전 3.2에서 변경: @code{load_tests} 지원이 추가됨.



버전 3.5에서 변경: Support for a keyword-only argument `pattern' has been added.



버전 3.12에서 변경: The undocumented and unofficial `use_load_tests' parameter has been
removed.

@end deffn

@geindex loadTestsFromName() (unittest.TestLoader 메서드)
@anchor{library/unittest unittest TestLoader loadTestsFromName}@anchor{154b}
@deffn {메서드} loadTestsFromName (name, module=None)

문자열 지정자에 맞는 모든 테스트 케이스 묶음을 반환합니다.

지정자 `name'은 모듈, 테스트 케이스 클래스, 테스트 케이스 클래스에 있는 테스트 메서드, @ref{ff4,,TestSuite} 인스턴스, @ref{2b3,,TestCase}나 @code{TestSuite} 인스턴스를 반환하는 콜러블 객체로 해석될 수 있는 “점으로 구분된 이름(dotted name)”입니다. 이 검사는 여기에 나열된 순서대로 적용됩니다; 즉, 테스트 케이스 클래스에 있는 메서드는 “콜러블  객체”보다는 “테스트 케이스 클래스에 있는 테스트 메서드”로 선택될 것입니다.

For example, if you have a module @code{SampleTests} containing a
@ref{2b3,,TestCase}-derived class @code{SampleTestCase} with three test
methods (@code{test_one()}, @code{test_two()}, and @code{test_three()}), the
specifier @code{'SampleTests.SampleTestCase'} would cause this method to
return a suite which will run all three test methods. Using the specifier
@code{'SampleTests.SampleTestCase.test_two'} would cause it to return a test
suite which will run only the @code{test_two()} test method. The specifier
can refer to modules and packages which have not been imported; they will
be imported as a side-effect.

이 메서드는 주어진 `module'에 상대적인 `name'을 선택적으로 해석할 수 있습니다.


버전 3.5에서 변경: 만약 `name' 순회 중에 @ref{659,,ImportError}나 @ref{5ee,,AttributeError}가 발생한다면 실행할 때 그 에러를 일으키는 합성 테스트가 반환될 것입니다. 이 에러는 self.errors 에러 모임에 포함될 것입니다.

@end deffn

@geindex loadTestsFromNames() (unittest.TestLoader 메서드)
@anchor{library/unittest unittest TestLoader loadTestsFromNames}@anchor{4649}
@deffn {메서드} loadTestsFromNames (names, module=None)

@ref{154b,,loadTestsFromName()}와 비슷하지만, 1개의 이름이 아닌 이름의 시퀀스를 받습니다. 반환 값은 각 이름에 정의된 모든 테스트를 지원하는 테스트 묶음입니다.
@end deffn

@geindex getTestCaseNames() (unittest.TestLoader 메서드)
@anchor{library/unittest unittest TestLoader getTestCaseNames}@anchor{595}
@deffn {메서드} getTestCaseNames (testCaseClass)

`testCaseClass' 안에서 찾은 메서드 이름을 정렬된 시퀀스로 반환합니다; 이 클래스는 @ref{2b3,,TestCase}의 서브 클래스이어야 합니다.
@end deffn

@geindex discover() (unittest.TestLoader 메서드)
@anchor{library/unittest unittest TestLoader discover}@anchor{11e4}
@deffn {메서드} discover (start_dir, pattern='test*.py', top_level_dir=None)

지정된 시작 디렉터리부터 하위 디렉터리를 재귀적으로 순회하여 모든 테스트 모듈을 찾아, 이를 포함하는 TestSuite 객체를 반환합니다. `pattern'에 일치하는 테스트 파일만 로드될 것입니다. (셸 방식의 패턴 일치를 사용합니다.) 임포트 가능한(즉, 유효한 파이썬 식별자인) 모듈 이름만 로드될 것입니다.

모든 테스트 모듈은 반드시 프로젝트의 최상위 수준에서 임포트 가능해야 합니다. 만약 시작 디렉터리가 최상위 디렉터리가 아니라면 `top_level_dir'을 따로 지정해야 합니다.

만약 모듈 임포트가 실패한다면, 예를 들어 문법 에러로 인해, 이것은 1개의 에러로 기록되고 탐색이 계속 진행될 것입니다. 만약 @ref{11e3,,SkipTest}가 발생해서 임포트가 실패했다면, 이것은 에러가 아닌 건너뛰기로 기록될 것입니다.

만약 패키지(@code{__init__.py} 라는 이름의 파일을 포함한 디렉터리)를 찾으면, @code{load_tests} 함수가 있는지 패키지를 검사할 것입니다. 만약 존재한다면 그 패키지에 대해서 @code{package.load_tests(loader, tests, pattern)}가 불릴 것입니다. 만약 load_tests 함수 자체가 @code{loader.discover}를 호출할지라도, 테스트 탐색은 실행 중에 패키지에 대한 테스트 검사를 한 번만 실행하도록 보장합니다.

만약 @code{load_tests}가 존재한다면 탐색은 패키지 안을 재귀 탐색하지 `않습니다'. @code{load_tests}가 패키지 안의 모든 테스트를 로드할 책임이 있습니다.

패턴은 의도적으로 로더 어트리뷰트로 저장되지 않아 패키지가 자신에 대한 탐색을 계속할 수 있습니다.

`top_level_dir'은 내부적으로 저장되어, @code{discover()}의 중첩된 호출 시 기본값으로 사용됩니다. 즉, 패키지의 @code{load_tests}가 @code{loader.discover()}를 호출할 경우, 이 인자를 전달할 필요가 없습니다.

`start_dir'는 디렉터리뿐만 아니라 점으로 구분된 모듈 이름이 될 수 있습니다.


Added in version 3.2.



버전 3.4에서 변경: 임포트 할 때 @ref{11e3,,SkipTest}를 발생시키는 모듈은 에러가 아니라 건너뛰기로 기록됩니다.

`start_dir'은 @ref{2b2,,이름 공간 패키지}일 수 있습니다.

임포트되기 전에 경로들이 정렬되어 하부 파일 시스템의 정렬 순서가 파일 이름에 의존하지 않더라도 실행 순서가 같아지도록 합니다.



버전 3.5에서 변경: 이제 발견된 패키지는 그것의 경로가 `pattern'과 일치하는지 여부와 상관없이 @code{load_tests}를 검사합니다, 왜냐하면 패키지 이름이 기본 패턴과 일치하는 것이 불가능하기 때문입니다.



버전 3.11에서 변경: `start_dir' can not be a @ref{2b2,,namespace packages}.
It has been broken since Python 3.7, and Python 3.11 officially removes it.



버전 3.13에서 변경: `top_level_dir' is only stored for the duration of `discover' call.



버전 3.14에서 변경: `start_dir' can once again be a @ref{2b2,,namespace package}.

@end deffn

@ref{592,,TestLoader}의 다음 어트리뷰트들은 서브 클래스나 인스턴스에 대입을 통해 구성할 수 있습니다.

@geindex testMethodPrefix (unittest.TestLoader의 속성)
@anchor{library/unittest unittest TestLoader testMethodPrefix}@anchor{464a}
@deffn {속성} testMethodPrefix

테스트 메서드로 해석할 메서드 이름의 접두사에 해당하는 문자열입니다. 기본값은 @code{'test'} 입니다.

이것은 @ref{595,,getTestCaseNames()} 과 모든 @code{loadTestsFrom*} 메서드에 영향을 미칩니다.
@end deffn

@geindex sortTestMethodsUsing (unittest.TestLoader의 속성)
@anchor{library/unittest unittest TestLoader sortTestMethodsUsing}@anchor{464b}
@deffn {속성} sortTestMethodsUsing

@ref{595,,getTestCaseNames()}와 모든 @code{loadTestsFrom*} 메서드에서 메서드 이름 정렬 시에 이름 비교하는 데 사용될 함수입니다.
@end deffn

@geindex suiteClass (unittest.TestLoader의 속성)
@anchor{library/unittest unittest TestLoader suiteClass}@anchor{154c}
@deffn {속성} suiteClass

테스트 목록에서 테스트 묶음을 생성하는 콜러블 객체입니다. 결과 객체에 어떤 메서드도 필요하지 않습니다. 기본값은 @ref{ff4,,TestSuite} 클래스입니다.

이것은 모든 @code{loadTestsFrom*} 메서드에 영향을 미칩니다.
@end deffn

@geindex testNamePatterns (unittest.TestLoader의 속성)
@anchor{library/unittest unittest TestLoader testNamePatterns}@anchor{464c}
@deffn {속성} testNamePatterns

테스트 묶음에 포함되기 위해서 테스트 메서드가 일치해야 할 유닉스 셸-방식의 와일드카드 테스트 이름 패턴 목록입니다(@code{-k} 옵션을 보십시오).

만약 이 어트리뷰트가 @code{None}(기본값)이 아니라면, 테스트 묶음에 포함될 모든 테스트 메서드는 이 목록의 패턴 중 1개와 반드시 일치해야 합니다. 이 패턴 일치는 항상 @ref{1c53,,fnmatch.fnmatchcase()}를 사용하여 수행된다는 것을 기억하십시오, 그래서 @code{-k} 옵션에 패턴을 건네주는 것과 달리, 간단한 부분 문자열 패턴은 @code{*} 와일드카드를 사용하도록 변경되어야 할 것입니다.

이것은 모든 @code{loadTestsFrom*} 메서드에 영향을 미칩니다.


Added in version 3.7.

@end deffn
@end deffn

@geindex TestResult (unittest 클래스)
@anchor{library/unittest unittest TestResult}@anchor{136c}
@deffn {클래스} unittest.TestResult

어떤 테스트가 성공했고 어떤 테스트가 실패했는지에 관한 정보를 엮는데 사용되는 클래스입니다.

@ref{136c,,TestResult} 객체는 여러 테스트의 결과들을 저장합니다. @ref{2b3,,TestCase}와 @ref{ff4,,TestSuite} 클래스는 결과가 올바르게 기록되는 것을 보장합니다; 테스트 작성자가 테스트 결과를 기록하는 것에 대해서 걱정할 필요가 없습니다.

Testing frameworks built on top of @code{unittest} may want access to the
@code{TestResult} object generated by running a set of tests for reporting
purposes; a @code{TestResult} instance is returned by the
@code{TestRunner.run()} method for this purpose.

@ref{136c,,TestResult} 인스턴스는 테스트 실행 결과를 조사할 때 관심이 생길만한 다음과 같은 어트리뷰트를 가지고 있습니다.

@geindex errors (unittest.TestResult의 속성)
@anchor{library/unittest unittest TestResult errors}@anchor{464d}
@deffn {속성} errors

@ref{2b3,,TestCase} 인스턴스와 포맷된(formatted) 트레이스백 문자열로 구성된 2-튜플을 포함하는 목록입니다. 각 튜플은 예기치 못한 예외가 발생한 테스트에 해당합니다.
@end deffn

@geindex failures (unittest.TestResult의 속성)
@anchor{library/unittest unittest TestResult failures}@anchor{464e}
@deffn {속성} failures

@ref{2b3,,TestCase} 인스턴스와 포맷된(formatted) 트레이스백 문자열로 구성된 2-튜플을 포함하는 목록입니다. 각 튜플은 @ref{4609,,assert* 메서드}를 사용하여 명시적으로 실패가 발생한 테스트에 해당합니다.
@end deffn

@geindex skipped (unittest.TestResult의 속성)
@anchor{library/unittest unittest TestResult skipped}@anchor{464f}
@deffn {속성} skipped

@ref{2b3,,TestCase} 인스턴스와 테스트 건너뛰기한 이유 문자열로 구성된 2-튜플을 포함하는 목록입니다.


Added in version 3.1.

@end deffn

@geindex expectedFailures (unittest.TestResult의 속성)
@anchor{library/unittest unittest TestResult expectedFailures}@anchor{4650}
@deffn {속성} expectedFailures

@ref{2b3,,TestCase} 인스턴스와 포맷된(formatted) 트레이스백 문자열로 구성된 2-튜플을 포함하는 목록입니다. 각 튜플은 테스트 케이스의 예상된 실패니 에러에 해당합니다.
@end deffn

@geindex unexpectedSuccesses (unittest.TestResult의 속성)
@anchor{library/unittest unittest TestResult unexpectedSuccesses}@anchor{4651}
@deffn {속성} unexpectedSuccesses

예상된 실패로 표시되었지만 성공한 @ref{2b3,,TestCase} 인스턴스를 포함하는 목록입니다.
@end deffn

@geindex collectedDurations (unittest.TestResult의 속성)
@anchor{library/unittest unittest TestResult collectedDurations}@anchor{1a7c}
@deffn {속성} collectedDurations

테스트 케이스 이름과 실행된 각 테스트의 소요 시간을 나타내는 실수로 구성된 2-튜플을 포함하는 목록입니다.


Added in version 3.12.

@end deffn

@geindex shouldStop (unittest.TestResult의 속성)
@anchor{library/unittest unittest TestResult shouldStop}@anchor{4652}
@deffn {속성} shouldStop

테스트 실행이 @ref{4653,,stop()}에 의해 정지되어야 할 때 @code{True}로 설정합니다.
@end deffn

@geindex testsRun (unittest.TestResult의 속성)
@anchor{library/unittest unittest TestResult testsRun}@anchor{4654}
@deffn {속성} testsRun

이제까지 실행된 테스트 총 개수입니다.
@end deffn

@geindex buffer (unittest.TestResult의 속성)
@anchor{library/unittest unittest TestResult buffer}@anchor{4655}
@deffn {속성} buffer

참으로 설정하면 @code{sys.stdout}와 @code{sys.stderr}가 @ref{4656,,startTest()}와 @ref{4657,,stopTest()} 호출 사이에서 버퍼링될 것입니다. 수집된 출력은 테스트가 실패하거나 에러가 발생한 경우에만 실제 @code{sys.stdout}와 @code{sys.stderr}에 출력될 것입니다. 모든 출력은 실패 / 에러 메시지에도 첨부됩니다.


Added in version 3.2.

@end deffn

@geindex failfast (unittest.TestResult의 속성)
@anchor{library/unittest unittest TestResult failfast}@anchor{4658}
@deffn {속성} failfast

참으로 설정하면 첫 번째 실패 또는 에러에서 @ref{4653,,stop()}이 호출될 것입니다.


Added in version 3.2.

@end deffn

@geindex tb_locals (unittest.TestResult의 속성)
@anchor{library/unittest unittest TestResult tb_locals}@anchor{4659}
@deffn {속성} tb_locals

참으로 설정하면 지역 변수가 트레이스백에 보일 것입니다.


Added in version 3.5.

@end deffn

@geindex wasSuccessful() (unittest.TestResult 메서드)
@anchor{library/unittest unittest TestResult wasSuccessful}@anchor{465a}
@deffn {메서드} wasSuccessful ()

이제까지 실행한 모든 테스트가 성공했다면 @code{True}를 반환하고, 그렇지 않으면 @code{False}를 반환합니다.


버전 3.4에서 변경: @ref{4628,,expectedFailure()} 데코레이터로 표시된 테스트에서 @ref{4651,,unexpectedSuccesses}가 있다면 @code{False}를 반환합니다.

@end deffn

@geindex stop() (unittest.TestResult 메서드)
@anchor{library/unittest unittest TestResult stop}@anchor{4653}
@deffn {메서드} stop ()

This method can be called to signal that the set of tests being run should
be aborted by setting the @ref{4652,,shouldStop} attribute to @code{True}.
@code{TestRunner} objects should respect this flag and return without
running any additional tests.

For example, this feature is used by the @ref{1ab5,,TextTestRunner} class to
stop the test framework when the user signals an interrupt from the
keyboard.  Interactive tools which provide @code{TestRunner}
implementations can use this in a similar manner.
@end deffn

@ref{136c,,TestResult} 클래스의 다음 메서드는 내부 자료 구조를 관리하려고 사용되고, 추가적인 보고 요구사항을 지원하기 위해 서브 클래스에서 확장할 수도 있습니다. 이것은 테스트가 실행 중에 대화형 보고를 지원하는 도구를 만들 때 특별히 유용합니다.

@geindex startTest() (unittest.TestResult 메서드)
@anchor{library/unittest unittest TestResult startTest}@anchor{4656}
@deffn {메서드} startTest (test)

테스트 케이스 `test'가 막 실행되려 할 때 호출됩니다.
@end deffn

@geindex stopTest() (unittest.TestResult 메서드)
@anchor{library/unittest unittest TestResult stopTest}@anchor{4657}
@deffn {메서드} stopTest (test)

결과에 상관없이 테스트 케이스 `test'가 실행되고 나서 호출됩니다.
@end deffn

@geindex startTestRun() (unittest.TestResult 메서드)
@anchor{library/unittest unittest TestResult startTestRun}@anchor{154e}
@deffn {메서드} startTestRun ()

모든 테스트가 실행되기 전에 1번 호출됩니다.


Added in version 3.1.

@end deffn

@geindex stopTestRun() (unittest.TestResult 메서드)
@anchor{library/unittest unittest TestResult stopTestRun}@anchor{154f}
@deffn {메서드} stopTestRun ()

모든 테스트가 실행되고 나서 1번 호출됩니다.


Added in version 3.1.

@end deffn

@geindex addError() (unittest.TestResult 메서드)
@anchor{library/unittest unittest TestResult addError}@anchor{1c4a}
@deffn {메서드} addError (test, err)

테스트 케이스 `test'가 예기치 못한 예외를 발생한 경우 호출됩니다. `err'는 @ref{899,,sys.exc_info()}가 반환한 형식의 튜플입니다: @code{(type, value, traceback)}.

기본 구현은 @code{(test, formatted_err)} 튜플을 인스턴스의 @ref{464d,,errors} 어트리뷰트에 추가합니다, 여기서 `formatted_err'는 `err'에서 파생된 포맷한 트레이스백입니다.
@end deffn

@geindex addFailure() (unittest.TestResult 메서드)
@anchor{library/unittest unittest TestResult addFailure}@anchor{1c49}
@deffn {메서드} addFailure (test, err)

테스트 케이스 `test'가 실패 신호를 보낸 경우 호출됩니다. `err'는 @ref{899,,sys.exc_info()}가 반환한 형식의 튜플입니다: @code{(type, value, traceback)}.

기본 구현은 @code{(test, formatted_err)} 튜플을 인스턴스의 @ref{464e,,failures} 어트리뷰트에 추가합니다, 여기서 `formatted_err'는 `err'에서 파생된 포맷한 트레이스백입니다.
@end deffn

@geindex addSuccess() (unittest.TestResult 메서드)
@anchor{library/unittest unittest TestResult addSuccess}@anchor{465b}
@deffn {메서드} addSuccess (test)

테스트 케이스 `test'가 성공하면 호출됩니다.

기본 구현은 아무것도 하지 않습니다.
@end deffn

@geindex addSkip() (unittest.TestResult 메서드)
@anchor{library/unittest unittest TestResult addSkip}@anchor{1c4b}
@deffn {메서드} addSkip (test, reason)

테스트 케이스 `test'가 건너뛰어지면 호출됩니다. `reason'은 테스트가 준 건너뛰는 이유입니다.

기본 구현은 @code{(test, reason)} 튜플을 인스턴스의 @ref{464f,,skipped} 어트리뷰트에 추가합니다.
@end deffn

@geindex addExpectedFailure() (unittest.TestResult 메서드)
@anchor{library/unittest unittest TestResult addExpectedFailure}@anchor{465c}
@deffn {메서드} addExpectedFailure (test, err)

테스트 케이스 `test'가 실패하거나 에러지만, @ref{4628,,expectedFailure()} 데코레이터로 표시된 경우 호출됩니다

기본 구현은 @code{(test, formatted_err)} 튜플을 인스턴스의 @ref{4650,,expectedFailures} 어트리뷰트에 추가합니다, 여기서 `formatted_err'는 `err'에서 파생된 포맷한 트레이스백입니다.
@end deffn

@geindex addUnexpectedSuccess() (unittest.TestResult 메서드)
@anchor{library/unittest unittest TestResult addUnexpectedSuccess}@anchor{465d}
@deffn {메서드} addUnexpectedSuccess (test)

테스트 케이스 `test'가 @ref{4628,,expectedFailure()} 데코레이터로 표시되었지만, 성공한 경우 호출됩니다.

기본 구현은 테스트를 인스턴스의 @ref{4651,,unexpectedSuccesses} 어트리뷰트에 추가합니다.
@end deffn

@geindex addSubTest() (unittest.TestResult 메서드)
@anchor{library/unittest unittest TestResult addSubTest}@anchor{1c4c}
@deffn {메서드} addSubTest (test, subtest, outcome)

부분 테스트가 완료되었을 때 호출됩니다. `test'는 테스트 메서드에 대응하는 테스트 케이스입니다. `subtest'는 부분 테스트를 설명하는 사용자 지정 @ref{2b3,,TestCase} 인스턴스입니다.

`outcome'이 @ref{884,,None}이면, 부분 테스트가 성공한 것입니다. 그렇지 않으면 예외와 함께 실패한 것인데 `outcome'은 @ref{899,,sys.exc_info()}가 반환한 형식의 튜플입니다: @code{(type, value, traceback)}.

기본 구현은 결과가 성공인 경우 아무것도 하지 않고 부분 테스트의 실패를 일반적인 실패로 기록합니다.


Added in version 3.4.

@end deffn

@geindex addDuration() (unittest.TestResult 메서드)
@anchor{library/unittest unittest TestResult addDuration}@anchor{1ab6}
@deffn {메서드} addDuration (test, elapsed)

Called when the test case finishes.  `elapsed' is the time represented in
seconds, and it includes the execution of cleanup functions.


Added in version 3.12.

@end deffn
@end deffn

@geindex TextTestResult (unittest 클래스)
@anchor{library/unittest unittest TextTestResult}@anchor{753}
@deffn {클래스} unittest.TextTestResult (stream, descriptions, verbosity, *, durations=None)

@ref{1ab5,,TextTestRunner}에서 사용하는 @ref{136c,,TestResult}의 구체적인 구현입니다. 서브 클래스는 인터페이스가 변경될 때 호환성을 보장하기 위해 @code{**kwargs}를 받아야 합니다.


Added in version 3.2.



버전 3.12에서 변경: `durations' 키워드 매개변수 추가.

@end deffn

@geindex defaultTestLoader (unittest 모듈)
@anchor{library/unittest unittest defaultTestLoader}@anchor{4648}
@deffn {데이터} unittest.defaultTestLoader

공유 목적의 @ref{592,,TestLoader} 클래스의 인스턴스입니다. 만약 @code{TestLoader}를 사용자 정의할 필요가 없다면, 계속 새로운 인스턴스를 생성하는 것 대신 이 인스턴스를 사용할 수 있습니다.
@end deffn

@geindex TextTestRunner (unittest 클래스)
@anchor{library/unittest unittest TextTestRunner}@anchor{1ab5}
@deffn {클래스} unittest.TextTestRunner (stream=None, descriptions=True, verbosity=1, failfast=False, buffer=False, resultclass=None, warnings=None, *, tb_locals=False, durations=None)

결과를 스트림으로 출력하는 기본 테스트 실행자 구현입니다. 만약 `stream'이 기본값인 @code{None}이라면, @ref{b33,,sys.stderr}가 출력 스트림으로 사용됩니다. 이 클래스는 몇 가지 설정 가능한 매개변수를 가지고 있지만, 본질적으로 매우 간단합니다. 테스트 묶음을 실행하는 그래픽 애플리케이션은 대안 구현을 제공해야 합니다. 이러한 구현은 unittest에 기능이 추가될 때 실행자를 만드는 인터페이스가 변하기 때문에 @code{**kwargs}를 받아들여야 합니다.

기본적으로 이 실행자는 @ref{1a3,,DeprecationWarning}, @ref{ac6,,PendingDeprecationWarning}, @ref{54e,,ResourceWarning}, @ref{71d,,ImportWarning}이 @ref{465e,,기본적으로 무시} 설정이 되어 있더라도 이것들을 보여줍니다. 파이썬의 @code{-Wd}이나 @code{-Wa} 옵션(@ref{2126,,경고 제어}를 보십시오)을 사용하고 `warnings'를 @code{None}으로 설정하여 이 동작을 오버라이드 할 수 있습니다.


버전 3.2에서 변경: `warnings' 매개변수 추가.



버전 3.2에서 변경: 임포트 시간이 아닌 인스턴스화 시간에 기본 스트림이 @ref{b33,,sys.stderr}으로 설정됩니다.



버전 3.5에서 변경: `tb_locals' 매개변수 추가.



버전 3.12에서 변경: `durations' 매개변수 추가.


@geindex _makeResult() (unittest.TextTestRunner 메서드)
@anchor{library/unittest unittest TextTestRunner _makeResult}@anchor{465f}
@deffn {메서드} _makeResult ()

이 메서드는 @ref{4660,,run()}가 사용하는 @code{TestResult} 인스턴스를 반환합니다. 직접 호출하게 의도되지 않았지만, 사용자 정의 @code{TestResult}를 제공하기 위해 서브 클래스에서 오버라이드할 수 있습니다.

@code{_makeResult()}는 @code{TextTestRunner} 생성자에 @code{resultclass} 인자로 전달된 클래스나 콜러블을 인스턴스화합니다. 만약 @code{resultclass}가 제공되지 않았다면 기본값은 @ref{753,,TextTestResult} 입니다. 결과 클래스는 다음 인자와 함께 인스턴스화됩니다:

@example
stream, descriptions, verbosity
@end example
@end deffn

@geindex run() (unittest.TextTestRunner 메서드)
@anchor{library/unittest unittest TextTestRunner run}@anchor{4660}
@deffn {메서드} run (test)

이 메서드는 @code{TextTestRunner}의 주된 공개 인터페이스입니다. 이 메서드는 @ref{ff4,,TestSuite}나 @ref{2b3,,TestCase} 인스턴스를 받습니다. @ref{136c,,TestResult}는 @ref{465f,,_makeResult()}를 호출하여 생성하고 테스트가 실행되며 결과가 stdout에 출력됩니다.
@end deffn
@end deffn

@geindex main() (unittest 모듈)
@anchor{library/unittest unittest main}@anchor{11e2}
@deffn {함수} 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)

`module'에서 테스트 모음을 로드하고 실행하는 명령행 프로그램입니다; 이것은 주로 편리하게 실행 가능한 테스트 모듈을 만들기 위한 것입니다. 이 함수의 가장 간단한 사용은 테스트 스크립트 마지막에 다음과 같은 줄을 포함하는 것입니다:

@example
if __name__ == '__main__':
    unittest.main()
@end example

당신은 상세도 인자를 전달하여 좀 더 자세한 정보와 함께 테스트를 실행할 수 있습니다:

@example
if __name__ == '__main__':
    unittest.main(verbosity=2)
@end example

`defaultTest' 인자는 `argv'로 테스트 이름이 지정되지 않은 경우 실행될 1개의 테스트 이름이거나 테스트 이름의 이터러블입니다. 만약 이 인자가 지정되지 않거나 @code{None}이면서 `argv'로 테스트 이름이 지정되지 않으면 `module' 안에서 찾은 모든 테스트가 실행됩니다.

`argv' 인자는 프로그램에 전달된 옵션 목록이 될 수 있습니다, 첫 번째 요소는 프로그램 이름입니다. 만약 이 인자가 지정되지 않거나 @code{None}이면, @ref{1469,,sys.argv} 값이 사용됩니다.

`testRunner' 인자는 테스트 실행자 클래스나 이미 생성된 테스트 실행자 인스턴스일 수 있습니다. 기본적으로 @code{main}은 실행한 테스트가 성공(0)인지 실패(1)인지를 나타내는 종료 코드와 함께 @ref{277,,sys.exit()}을 호출합니다. 종료 코드 5는 테스트가 실행되지 않았거나 건너뛴 경우를 나타냅니다.

`testLoader' 인자는 @ref{592,,TestLoader} 인스턴스이어야 하고 기본값은 @ref{4648,,defaultTestLoader} 입니다.

@code{main}은 @code{exit=False} 인자를 전달하여 대화형 인터프리터에서 사용하는 것을 지원합니다. 이것은 @ref{277,,sys.exit()} 호출 없이 결과가 표준 출력에 표시됩니다:

@example
>>> from unittest import main
>>> main(module='test_module', exit=False)
@end example

`failfast', `catchbreak', `buffer' 매개변수는 @ref{4610,,명령행 옵션}의 같은 이름과 같은 효과를 가지고 있습니다.

`warnings' 인자는 테스트 실행 중에 사용되어야 할 @ref{1b1,,경고 필터}를 지정합니다. 만약 아무 값도 지정되지 않았다면, @code{-W} 옵션이 @code{python}으로 전달된 경우(@ref{2126,,경고 제어}를 보십시오)에는 @code{None}으로 남아 있고, 그렇지 않은 경우에는 @code{'default'}로 설정됩니다.

@code{main}을 호출하면 @code{result} 어트리뷰트를 가진 객체를 반환합니다. 이 어트리뷰트는 테스트 실행 결과를 포함하는 @ref{136c,,unittest.TestResult}입니다.


버전 3.1에서 변경: `exit' 매개변수가 추가되었습니다.



버전 3.2에서 변경: `verbosity', `failfast', `catchbreak', `buffer', `warnings' 매개변수가 추가되었습니다.



버전 3.4에서 변경: `defaultTest' 매개변수가 테스트 이름의 이터러블도 받을 수 있게 바뀌었습니다.

@end deffn

@menu
* load_tests 프로토콜:: 

@end menu

@node load_tests 프로토콜,,,테스트를 로드하고 실행하기
@anchor{library/unittest id1}@anchor{4621}@anchor{library/unittest load-tests-protocol}@anchor{45c7}
@subsubsection load_tests 프로토콜



Added in version 3.2.


@code{load_tests} 라 불리는 함수를 구현함으로써 모듈이나 패키지는 일반 테스트 실행이나 테스트 탐색 중에 그것들로부터 테스트가 어떻게 로드될지를 사용자 정의할 수 있습니다.

만약 테스트 모듈이 @code{load_tests}를 정의했다면 그것은 다음 인자와 함께 @ref{593,,TestLoader.loadTestsFromModule()}의해 호출될 것입니다:

@example
load_tests(loader, standard_tests, pattern)
@end example

여기서 `pattern'은 @code{loadTestsFromModule}에서 바로 전달된 것입니다. 기본값은 @code{None}입니다.

이것은 @ref{ff4,,TestSuite}를 반환해야 합니다.

`loader'는 로딩을 실행할 @ref{592,,TestLoader} 인스턴스입니다. `standard_tests'는 모듈에서 기본적으로 로드될 테스트입니다. 테스트 모듈이 테스트 기본 모음에서 오직 테스트를 추가하거나 빼기를 원하는 것은 흔한 일입니다. 세 번째 인자는 테스트 탐색의 일부로서 패키지를 로드할 때 사용됩니다.

특정 @ref{2b3,,TestCase} 클래스 모음에서 테스트를 로드하는 전형적인 @code{load_tests} 함수는 다음과 같습니다:

@example
test_cases = (TestCase1, TestCase2, TestCase3)

def load_tests(loader, tests, pattern):
    suite = TestSuite()
    for test_class in test_cases:
        tests = loader.loadTestsFromTestCase(test_class)
        suite.addTests(tests)
    return suite
@end example

만약 탐색이 명령행 또는 @ref{11e4,,TestLoader.discover()}로부터, 패키지가 포함된 디렉터리에서 시작된다면, @code{load_tests}를 위해 패키지 @code{__init__.py}를 검사합니다. 만약 함수가 존재하지 않으면, 탐색은 그저 다른 디렉터리인 것처럼 패키지 안을 재귀 순회할 것입니다. 그렇지 않다면, 패키지의 테스트를 위한 탐색은 다음 인자와 함께 불리는 @code{load_tests}에게 맡겨질 것입니다:

@example
load_tests(loader, standard_tests, pattern)
@end example

이것은 패키지의 모든 테스트에 해당하는 @ref{ff4,,TestSuite}를 반환해야 합니다. (@code{standard_tests}는 오직 @code{__init__.py}로부터 수집된 테스트만 포함할 것입니다.

패턴이 load_tests로 전달되기 때문에 패키지는 테스트 검색을 계속 진행(그리고 잠재적으로 수정)할 수 있습니다. 테스트 패키지를 위해서 ‘아무것도 하지 않는’ @code{load_tests} 함수는 다음과 같을 것입니다:

@example
def load_tests(loader, standard_tests, pattern):
    # 로더 인스턴스에 캐시 된 최상위 디렉터리
    this_dir = os.path.dirname(__file__)
    package_tests = loader.discover(start_dir=this_dir, pattern=pattern)
    standard_tests.addTests(package_tests)
    return standard_tests
@end example


버전 3.5에서 변경: 패키지 이름이 기본 패턴과 일치하는 것이 불가능하기 때문에 탐색이 더는 `pattern' 일치를 위해서 패키지 이름을 검사하지 않습니다.


@node 클래스와 모듈 픽스쳐,시그널 처리하기,클래스와 함수,unittest — 단위 테스트 프레임워크
@anchor{library/unittest class-and-module-fixtures}@anchor{4630}
@subsubsection 클래스와 모듈 픽스쳐


Class and module level fixtures are implemented in @ref{ff4,,TestSuite}. When
the test suite encounters a test from a new class then
@ref{153c,,tearDownClass()} from the previous class (if there is one)
is called, followed by @ref{c40,,setUpClass()} from the new class.

마찬가지로 만약 테스트가 이전 테스트와 다른 모듈의 것이라면 이전 모듈의 @code{tearDownModule}이 실행되고, 이어 새로운 모듈의 @code{setUpModule}이 호출됩니다.

모든 테스트가 실행된 뒤에 마지막으로 @code{tearDownClass}와 @code{tearDownModule}이 실행됩니다.

공유하는 픽스쳐의 경우 테스트 병렬화와 같은 [잠재적인] 기능과 잘 동작하지 않고 이것은 테스트 분리를 망가트립니다. 이것을 주의 깊게 사용해야 합니다.

unittest의 테스트 로더에 의해 생성된 테스트들의 기본 정렬 순서는 같은 모듈과 클래스의 모든 테스트를 그룹화하는 것입니다. 이것은 @code{setUpClass} / @code{setUpModule}(등) 이 클래스와 모듈별로 정확하게 1번씩 호출되게 할 것입니다. 만약 당신이 무작위로 순서를 정하여, 그래서 다른 모듈과 클래스의 테스트가 서로 인접한다면, 이 공유 픽스처 함수는 1번의 테스트 실행에서 여러 번 호출될 수 있습니다.

공유 픽스처는 비표준 정렬 순서를 사용하는 테스트 묶음과 같이 작동하는 것을 의도하지 않습니다. 공유 픽스처를 지원하길 원치 않는 프레임워크를 위해서 @code{BaseTestSuite}가 여전히 존재합니다.

공유 픽스처 함수 중 1개에서 발생한 예외가 있다면, 테스트를 에러로 보고합니다. 해당 테스트 인스턴스가 없기 때문에 에러를 나타내기 위해 @code{_ErrorHolder} 객체(@ref{2b3,,TestCase}와 같은 인터페이스를 가진)가 생성됩니다. 당신이 그저 표준 unittest의 테스트 실행자를 사용한다면 이 세부 항목은 중요하지 않습니다, 그러나 당신이 프레임워크의 저자라면 이것은 관련이 있을 수 있습니다.

@menu
* setUpClass 와 tearDownClass:: 
* setUpModule 과 tearDownModule:: 

@end menu

@node setUpClass 와 tearDownClass,setUpModule 과 tearDownModule,,클래스와 모듈 픽스쳐
@anchor{library/unittest setupclass-and-teardownclass}@anchor{4661}
@subsubsection setUpClass 와 tearDownClass


이것들은 반드시 클래스 메서드로 구현되어야 합니다:

@example
import unittest

class Test(unittest.TestCase):
    @@classmethod
    def setUpClass(cls):
        cls._connection = createExpensiveConnectionObject()

    @@classmethod
    def tearDownClass(cls):
        cls._connection.destroy()
@end example

만약 당신이 베이스 클래스의 @code{setUpClass}와 @code{tearDownClass}를 호출하고 싶다면 당신이 그것을 직접 호출해야만 합니다. @ref{2b3,,TestCase}의 구현은 비어있습니다.

만약 @code{setUpClass} 중에 예외가 발생한다면 클래스의 테스트는 실행되지 않고 @code{tearDownClass} 는 실행되지 않습니다. 건너뛴 클래스는 @code{setUpClass} 또는 @code{tearDownClass}가 실행되지 않을 것입니다. 만약 예외가 @ref{11e3,,SkipTest} 예외라면 클래스는 에러 대신 건너뛰어졌다고 보고될 것입니다.

@node setUpModule 과 tearDownModule,,setUpClass 와 tearDownClass,클래스와 모듈 픽스쳐
@anchor{library/unittest setupmodule-and-teardownmodule}@anchor{4662}
@subsubsection setUpModule 과 tearDownModule


@geindex setUpModule() (unittest 모듈)
@geindex tearDownModule() (unittest 모듈)
@anchor{library/unittest unittest setUpModule}@anchor{c3f}
이것들은 함수로 구현되어야 합니다:

@example
def setUpModule():
    createConnection()

def tearDownModule():
    closeConnection()
@end example

만약 @code{setUpModule} 중에 예외가 발생한다면 모듈의 테스트는 실행되지 않고 @code{tearDownModule} 는 실행되지 않습니다. 만약 예외가 @ref{11e3,,SkipTest} 예외라면 모듈은 에러 대신 건너뛰어졌다고 보고될 것입니다.

예외가 발생하는 경우에도 실행해야 하는 정리 코드를 추가하려면, @code{addModuleCleanup}을 사용하십시오:

@geindex addModuleCleanup() (unittest 모듈)
@anchor{library/unittest unittest addModuleCleanup}@anchor{c41}
@deffn {함수} unittest.addModuleCleanup (function, /, *args, **kwargs)

테스트 클래스 중에 사용된 자원을 정리하기 위해 @ref{153b,,tearDownModule()} 이후에 불리는 함수를 추가합니다. 함수들은 추가된 순서의 반대 순서대로 불리게 됩니다(@abbr{LIFO}). 함수가 추가될 때 @ref{c41,,addModuleCleanup()}에 같이 전달된 위치 인자나 키워드 인자와 함께 호출됩니다.

만약 @ref{c3f,,setUpModule()}이 실패한다면, 즉 @ref{153b,,tearDownModule()}이 불리지 않더라도, 정리 함수들은 여전히 불리게 될 것입니다.


Added in version 3.8.

@end deffn

@geindex enterModuleContext() (unittest 모듈)
@anchor{library/unittest unittest enterModuleContext}@anchor{8ca}
@deffn {함수} unittest.enterModuleContext (cm)

Enter the supplied @ref{1e1,,context manager}.  If successful, also
add its @ref{1505,,__exit__()} method as a cleanup function by
@ref{c41,,addModuleCleanup()} and return the result of the
@ref{7e3,,__enter__()} method.


Added in version 3.11.

@end deffn

@geindex doModuleCleanups() (unittest 모듈)
@anchor{library/unittest unittest doModuleCleanups}@anchor{1bd1}
@deffn {함수} unittest.doModuleCleanups ()

이 함수는 @ref{153b,,tearDownModule()} 이후나, @ref{c3f,,setUpModule()}이 예외를 발생시키면 @code{setUpModule()}이후에 조건 없이 호출됩니다.

@ref{c41,,addModuleCleanup()}에서 추가된 모든 정리 함수들을 호출하는 책임이 있습니다. 만약 정리 함수를 @ref{153b,,tearDownModule()} `이전에' 불러야 할 필요가 있다면 @ref{1bd1,,doModuleCleanups()}를 직접 부를 수 있습니다.

@ref{1bd1,,doModuleCleanups()}는 한 번에 하나씩 정리 함수 스택에서 메서드를 꺼내기 때문에 언제든지 호출될 수 있습니다.


Added in version 3.8.

@end deffn

@node 시그널 처리하기,,클래스와 모듈 픽스쳐,unittest — 단위 테스트 프레임워크
@anchor{library/unittest signal-handling}@anchor{4613}
@subsubsection 시그널 처리하기



Added in version 3.2.


unittest의 @ref{1537,,-c/--catch} 명령행 옵션은, @ref{11e2,,unittest.main()}의 @code{catchbreak} 매개 변수와 함께, 테스트 실행 중에 control-C를 사용하기 편하게 처리하도록 합니다. 중단 시그널 잡기를 활성화 하면 control-C는 현재 실행 중인 테스트를 완료하고, 그러면 테스트 실행이 끝나고 이제까지의 모든 결과를 보고할 것입니다. 두 번째 control-c는 평소와 같이 @ref{bc4,,KeyboardInterrupt}를 발생할 것입니다.

control-c 시그널 처리기는 자체 @ref{253,,signal.SIGINT} 처리기를 설치하는 코드 또는 테스트와의 호환성을 유지하려고 노력합니다. 만약 @code{unittest} 처리기가 불리지만 그것이 설치된 @code{signal.SIGINT} 처리기가 `아니면', 즉 그것이 테스트 중에 시스템에 의해 대체되고 위임된다면, 그것은 기본 처리기를 호출합니다. 이것은 설치된 처리기를 대체하고 위임하는 코드에 의해 일반적으로 기대되는 동작입니다. @code{unittest} control-c 처리를 개별 테스트 별로 비활성화하고 싶을 때는 @ref{1538,,removeHandler()} 데코레이터를 사용할 수 있습니다.

프레임워크 작성자가 테스트 프레임워크에서 control-c 처리 기능을 활성화하기 위해 몇 가지 유틸리티 함수가 있습니다.

@geindex installHandler() (unittest 모듈)
@anchor{library/unittest unittest installHandler}@anchor{4663}
@deffn {함수} unittest.installHandler ()

control-c 처리기를 설치합니다. @ref{253,,signal.SIGINT}를 받았을 때(보통 사용자가 control-c를 눌렀을 때의 응답으로써) 모든 등록된 결과에 @ref{4653,,stop()}이 호출됩니다.
@end deffn

@geindex registerResult() (unittest 모듈)
@anchor{library/unittest unittest registerResult}@anchor{4664}
@deffn {함수} unittest.registerResult (result)

control-c 처리를 위해서 @ref{136c,,TestResult} 객체를 등록합니다. 결과 등록은 그것의 약한 참조를 저장합니다, 그래서 결과가 가비지 수거되는 것을 막지 않습니다.

만약 control-c 처리가 활성화되지 않았다면 @ref{136c,,TestResult} 객체 등록은 부작용이 없습니다, 그래서 테스트 프레임워크는 처리가 가능한지 여부와 관계없이 자신이 만든 모든 결과를 무조건 등록할 수 있습니다.
@end deffn

@geindex removeResult() (unittest 모듈)
@anchor{library/unittest unittest removeResult}@anchor{4665}
@deffn {함수} unittest.removeResult (result)

등록한 결과를 제거합니다. 결과가 제거되고 나면 control-c에 대한 응답으로 결과 객체의 @ref{4653,,stop()}을 더는 호출하지 않게 됩니다.
@end deffn

@geindex removeHandler() (unittest 모듈)
@anchor{library/unittest unittest removeHandler}@anchor{1538}
@deffn {함수} unittest.removeHandler (function=None)

인자 없이 호출된 경우 이 함수는 만약 control-c 처리기가 설치되었다면 그것을 제거합니다. 또한 이 함수는 테스트 실행 중에 임시로 처리기를 제거하기 위해 테스트 데코레이터로써 사용될 수도 있습니다:

@example
@@unittest.removeHandler
def test_signal_handling(self):
    ...
@end example
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node unittest mock — 모의 객체 라이브러리,unittest mock — 시작하기,unittest — 단위 테스트 프레임워크,개발 도구
@anchor{library/unittest mock doc}@anchor{4666}@anchor{library/unittest mock module-unittest mock}@anchor{10d}@anchor{library/unittest mock translation-repo}@anchor{4667}@anchor{library/unittest mock unittest-mock-mock-object-library}@anchor{4668}
@subsection @code{unittest.mock} — 모의 객체 라이브러리


@geindex module; unittest.mock


Added in version 3.3.


`소스 코드:' Lib/unittest/mock.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/unittest/mock.py}


__________________________________________________________________


@code{unittest.mock} is a library for testing in Python. It allows you to
replace parts of your system under test with mock objects and make assertions
about how they have been used.

@code{unittest.mock} provides a core @ref{c3d,,Mock} class removing the need to
create a host of stubs throughout your test suite. After performing an
action, you can make assertions about which methods / attributes were used
and arguments they were called with. You can also specify return values and
set needed attributes in the normal way.

또한, mock은 테스트 스코프 내에서 모듈과 클래스 수준 어트리뷰트의 패치를 처리하는 @ref{1091,,patch()} 데코레이터를 고유한 객체 생성을 위한 @ref{d98,,sentinel}과 함께 제공합니다. @ref{c3d,,Mock}, @ref{108e,,MagicMock} 및 @code{patch()} 사용 방법에 대한 몇 가지 예는 @ref{4669,,간략 지침}을 참조하십시오.

Mock은 @ref{10c,,unittest}와 함께 사용하도록 설계되었고 많은 모킹(mocking) 프레임워크에서 사용하는 ‘기록(record) -> 재생(replay)’ 대신 ‘액션(action) -> 어서션(assertion)’ 패턴을 기반으로 합니다.

There is a backport of @code{unittest.mock} for earlier versions of Python,
available as mock@footnote{https://pypi.org/project/mock/} on PyPI.

@menu
* 간략 지침:: 
* Mock 클래스:: 
* 패처:: 
* MagicMock과 매직 메서드 지원:: 
* 도우미:: 
* Order of precedence of side_effect@comma{} return_value and wraps: Order of precedence of side_effect return_value and wraps. 

@end menu

@node 간략 지침,Mock 클래스,,unittest mock — 모의 객체 라이브러리
@anchor{library/unittest mock quick-guide}@anchor{4669}
@subsubsection 간략 지침


@c class ProductionClass:
@c     def method(self, a, b, c):
@c         pass
@c 
@c class SomeClass:
@c     @staticmethod
@c     def static_method(args):
@c         return args
@c 
@c     @classmethod
@c     def class_method(cls, args):
@c         return args

@ref{c3d,,Mock}과 @ref{108e,,MagicMock} 객체는 그것들을 액세스함에 따라 모든 어트리뷰트와 메서드를 작성하고 사용 방식에 대한 세부 사항을 저장합니다. 반환 값을 지정하거나 사용 가능한 어트리뷰트를 제한하도록 구성한 다음, 사용된 방식에 대한 어서션을 만들 수 있습니다:

@example
>>> from unittest.mock import MagicMock
>>> thing = ProductionClass()
>>> thing.method = MagicMock(return_value=3)
>>> thing.method(3, 4, 5, key='value')
3
>>> thing.method.assert_called_with(3, 4, 5, key='value')
@end example

@ref{466a,,side_effect}를 사용하면 모의 객체(mock)가 호출될 때 예외를 발생시키는 것을 포함하여 부작용(side effect)을 수행 할 수 있습니다:

@example
>>> from unittest.mock import Mock
>>> mock = Mock(side_effect=KeyError('foo'))
>>> mock()
Traceback (most recent call last):
 ...
KeyError: 'foo'
@end example

@example
>>> values = @{'a': 1, 'b': 2, 'c': 3@}
>>> def side_effect(arg):
...     return values[arg]
...
>>> mock.side_effect = side_effect
>>> mock('a'), mock('b'), mock('c')
(1, 2, 3)
>>> mock.side_effect = [5, 4, 3, 2, 1]
>>> mock(), mock(), mock()
(5, 4, 3)
@end example

Mock은 여러 가지 방법으로 구성하고 동작을 제어 할 수 있습니다. 예를 들어 `spec' 인자는 다른 객체에서 사양을 가져오도록 모의 객체를 구성합니다. spec에 존재하지 않는 모의 객체의 어트리뷰트나 메서드에 액세스하려고 시도하면 @ref{5ee,,AttributeError}로 실패합니다.

@ref{1091,,patch()} 데코레이터 / 컨텍스트 관리자는 테스트 대상 모듈에서 클래스나 객체를 쉽게 모킹할 수 있도록 합니다. 지정한 객체는 테스트 중에 모의 객체(또는 다른 객체)로 치환되고 테스트가 끝나면 복원됩니다:

@example
>>> from unittest.mock import patch
>>> @@patch('module.ClassName2')
... @@patch('module.ClassName1')
... def test(MockClass1, MockClass2):
...     module.ClassName1()
...     module.ClassName2()
...     assert MockClass1 is module.ClassName1
...     assert MockClass2 is module.ClassName2
...     assert MockClass1.called
...     assert MockClass2.called
...
>>> test()
@end example

@cartouche
@quotation 참고 
patch 데코레이터를 중첩할 때 모의 객체는 적용한 순서와 같은 순서로 데코레이트 되는 함수로 전달됩니다 (데코레이터가 적용되는 일반적인 `파이썬' 순서). 이것은 아래에서 위로 감을 뜻하므로, 위의 예에서 @code{module.ClassName1}에 대한 모의 객체가 먼저 전달됩니다.

@ref{1091,,patch()}를 사용할 때 조회되는 이름 공간에서 객체를 패치하는 것이 중요합니다. 이것은 일반적으로 간단하지만, 간략 지침은 @ref{466b,,패치할 곳}을 읽으십시오.
@end quotation
@end cartouche

데코레이터 @ref{1091,,patch()}는 with 문에서 컨텍스트 관리자로 사용할 수도 있습니다:

@example
>>> with patch.object(ProductionClass, 'method', return_value=None) as mock_method:
...     thing = ProductionClass()
...     thing.method(1, 2, 3)
...
>>> mock_method.assert_called_once_with(1, 2, 3)
@end example

스코프 도중 딕셔너리에 값을 설정하고 테스트가 종료될 때 딕셔너리를 원래 상태로 복원하기 위한 @ref{1968,,patch.dict()}도 있습니다:

@example
>>> foo = @{'key': 'value'@}
>>> original = foo.copy()
>>> with patch.dict(foo, @{'newkey': 'newvalue'@}, clear=True):
...     assert foo == @{'newkey': 'newvalue'@}
...
>>> assert foo == original
@end example

Mock은 파이썬 @ref{466c,,매직 메서드}의 모킹을 지원합니다. 매직 메서드를 사용하는 가장 쉬운 방법은 @ref{108e,,MagicMock} 클래스를 사용하는 것입니다. 다음과 같은 것을 할 수 있도록 합니다:

@example
>>> mock = MagicMock()
>>> mock.__str__.return_value = 'foobarbaz'
>>> str(mock)
'foobarbaz'
>>> mock.__str__.assert_called_with()
@end example

Mock을 사용하면 함수(또는 다른 Mock 인스턴스)를 매직 메서드에 대입할 수 있고 적절하게 호출될 것입니다. @ref{108e,,MagicMock} 클래스는 모든 매직 메서드(아마도, 모든 유용한 메서드)가 미리 만들어져 있는 Mock 변형일 뿐입니다.

다음은 평범한 Mock 클래스로 매직 메서드를 사용하는 예입니다:

@example
>>> mock = Mock()
>>> mock.__str__ = Mock(return_value='wheeeeee')
>>> str(mock)
'wheeeeee'
@end example

테스트의 모의 객체가 대체하는 객체와 같은 api를 갖도록, @ref{466d,,자동 사양}를 사용할 수 있습니다. 자동 사양은 패치 할 `autospec' 인자를 patch에 전달하거나 @ref{1935,,create_autospec()} 함수를 통해 수행할 수 있습니다. 자동 사양은 대체하는 객체와 같은 어트리뷰트와 메서드를 갖는 모의 객체를 만들고, 모든 함수와 (생성자를 포함한) 메서드는 실제 객체와 같은 호출 서명을 갖습니다.

이것은 모의 객체가 잘못 사용될 경우 프로덕션 코드와 같은 방식으로 실패하도록 합니다:

@example
>>> from unittest.mock import create_autospec
>>> def function(a, b, c):
...     pass
...
>>> mock_function = create_autospec(function, return_value='fishy')
>>> mock_function(1, 2, 3)
'fishy'
>>> mock_function.assert_called_once_with(1, 2, 3)
>>> mock_function('wrong arguments')
Traceback (most recent call last):
 ...
TypeError: missing a required argument: 'b'
@end example

@ref{1935,,create_autospec()}이 클래스에 사용되면 @code{__init__} 메서드의 서명을 복사하고, 콜러블 객체에 사용되면 @code{__call__} 메서드의 서명을 복사합니다.

@node Mock 클래스,패처,간략 지침,unittest mock — 모의 객체 라이브러리
@anchor{library/unittest mock the-mock-class}@anchor{466e}
@subsubsection Mock 클래스


@c import asyncio
@c import inspect
@c import unittest
@c import threading
@c from unittest.mock import sentinel, DEFAULT, ANY
@c from unittest.mock import patch, call, Mock, MagicMock, PropertyMock, AsyncMock
@c from unittest.mock import ThreadingMock
@c from unittest.mock import mock_open

@ref{c3d,,Mock}은 코드 전체에서 스텁과 테스트 이중화의 사용을 대체하기 위한 유연한 모의 객체입니다. 모의 객체는 콜러블이고 어트리뷰트에 액세스할 때 새 모의 객체로 어트리뷰트를 만듭니다 @footnote{
유일한 예외는 매직 메서드와 어트리뷰트(앞뒤에 이중 밑줄을 가진 것)입니다. Mock은 이것을 만들지 않고 대신 @ref{5ee,,AttributeError}를 발생시킵니다. 이는 인터프리터가 종종 묵시적으로 이러한 메서드를 요청하고, 매직 메서드를 기대할 때 새 Mock 객체를 얻으면 `매우' 혼동되기 때문입니다. 매직 메서드 지원이 필요하면 @ref{466c,,매직 메서드}를 참조하십시오.
}. 같은 어트리뷰트에 액세스하면 항상 같은 모의 객체를 반환합니다. 모의 객체는 사용 방법을 기록하여, 코드가 모의 객체에 대해 수행한 작업에 대한 어서션을 만들 수 있도록 합니다.

@ref{108e,,MagicMock}은 @ref{c3d,,Mock}의 서브 클래스이며, 모든 매직 메서드가 미리 만들어져 사용할 준비가 되어있습니다. 콜러블이 아닌 변형도 있어서, 콜러블이 아닌 객체를 모킹할 때 유용합니다: @ref{466f,,NonCallableMock}과 @ref{4670,,NonCallableMagicMock}

@ref{1091,,patch()} 데코레이터를 사용하면 특정 모듈의 클래스를 @ref{c3d,,Mock} 객체로 쉽게 대체 할 수 있습니다. 기본적으로 @code{patch()}는 @ref{108e,,MagicMock}을 생성합니다. @code{patch()}에 `new_callable' 인자를 사용하여 대체 @code{Mock} 클래스를 지정할 수 있습니다.

@geindex Mock (unittest.mock 클래스)
@anchor{library/unittest mock unittest mock Mock}@anchor{c3d}
@deffn {클래스} unittest.mock.Mock (spec=None, side_effect=None, return_value=DEFAULT, wraps=None, name=None, spec_set=None, unsafe=False, **kwargs)

새로운 @ref{c3d,,Mock} 객체를 만듭니다. @code{Mock}은 Mock 객체의 동작을 지정하는 몇 가지 선택적 인자를 취합니다:


@itemize *

@item 
`spec': 문자열 리스트이거나 모의 객체의 사양으로 작동하는 기존 객체 (클래스나 인스턴스)일 수 있습니다. 객체를 전달하면 객체에 dir을 호출하여 문자열 리스트가 형성됩니다 (지원되지 않는 매직 어트리뷰트와 메서드는 제외합니다). 이 리스트에 없는 어트리뷰트에 액세스하면 @ref{5ee,,AttributeError}가 발생합니다.

`spec'이 (문자열 리스트 대신에) 객체이면, @ref{16b2,,__class__}는 spec 객체의 클래스를 반환합니다. 이것은 모의 객체가 @ref{2ad,,isinstance()} 검사를 통과할 수 있도록 합니다.

@item 
`spec_set': `spec'의 더 엄격한 변형. 사용되면, `spec_set'으로 전달된 객체에 없는 모의 객체의 어트리뷰트를 `설정'하거나 얻으려고 시도하면 @ref{5ee,,AttributeError}가 발생합니다.

@item 
`side_effect': Mock이 호출될 때마다 호출되는 함수. @ref{466a,,side_effect} 어트리뷰트를 참조하십시오. 예외를 발생시키거나 반환 값을 동적으로 변경하는 데 유용합니다. 함수는 모의 객체와 같은 인자로 호출되며, @ref{4671,,DEFAULT}를 반환하지 않는 한, 이 함수의 반환 값이 반환 값으로 사용됩니다.

또는 `side_effect'는 예외 클래스나 인스턴스일 수 있습니다. 이 경우 모의 객체가 호출될 때 그 예외가 발생합니다.

`side_effect'가 이터러블이면 모의 객체에 대한 각 호출은 이터러블의 다음 값을 반환합니다.

`side_effect'는 @code{None}으로 설정하여 지울 수 있습니다.

@item 
`return_value': 모의 객체가 호출될 때 반환되는 값. 기본적으로 이것은 새로운 Mock입니다 (처음 액세스할 때 만들어집니다). @ref{4672,,return_value} 어트리뷰트를 참조하십시오.

@item 
`unsafe': 기본적으로, 이름이 `assert', `assret', `asert', `aseert' 또는 `assrt'로 시작하는 어트리뷰트를 액세스하면 @ref{5ee,,AttributeError}가 발생합니다. @code{unsafe=True}를 전달하면 이러한 어트리뷰트에 액세스 할 수 있습니다.


Added in version 3.5.


@item 
`wraps': 모의 객체가 감쌀 항목. `wraps'가 @code{None}이 아니면 Mock을 호출할 때 래핑 된 객체로 호출이 전달됩니다 (실제 결과를 반환합니다). 모의 객체에 대한 어트리뷰트 액세스는 래핑 된 객체의 해당 어트리뷰트를 래핑하는 Mock 객체를 반환합니다 (따라서 존재하지 않는 어트리뷰트에 액세스하려고 시도하면 @ref{5ee,,AttributeError}가 발생합니다).

모의 객체에 명시적으로 `return_value'가 설정되면 호출은 래핑 된 객체로 전달되지 않고 대신 `return_value'가 반환됩니다.

@item 
`name': 모의 객체에 이름이 있으면 모의 객체의 repr에 사용됩니다. 디버깅에 유용할 수 있습니다. 이름은 자식 모의 객체로 전파됩니다.
@end itemize

임의의 키워드 인자로 모의 객체를 호출할 수도 있습니다. 이것들은 모의 객체가 만들어진 후에 어트리뷰트를 설정하는 데 사용됩니다. 자세한 내용은 @ref{4673,,configure_mock()} 메서드를 참조하십시오.

@geindex assert_called() (unittest.mock.Mock 메서드)
@anchor{library/unittest mock unittest mock Mock assert_called}@anchor{ef3}
@deffn {메서드} assert_called ()

모의 객체가 적어도 한 번 호출되었다고 어서트 합니다.

@example
>>> mock = Mock()
>>> mock.method()
<Mock name='mock.method()' id='...'>
>>> mock.method.assert_called()
@end example


Added in version 3.6.

@end deffn

@geindex assert_called_once() (unittest.mock.Mock 메서드)
@anchor{library/unittest mock unittest mock Mock assert_called_once}@anchor{ef4}
@deffn {메서드} assert_called_once ()

모의 객체가 정확히 한 번 호출되었다고 어서트 합니다.

@example
>>> mock = Mock()
>>> mock.method()
<Mock name='mock.method()' id='...'>
>>> mock.method.assert_called_once()
>>> mock.method()
<Mock name='mock.method()' id='...'>
>>> mock.method.assert_called_once()
Traceback (most recent call last):
...
AssertionError: Expected 'method' to have been called once. Called 2 times.
Calls: [call(), call()].
@end example


Added in version 3.6.

@end deffn

@geindex assert_called_with() (unittest.mock.Mock 메서드)
@anchor{library/unittest mock unittest mock Mock assert_called_with}@anchor{1e00}
@deffn {메서드} assert_called_with (*args, **kwargs)

이 메서드는 마지막 호출이 특정 방식으로 이루어졌음을 어서트하는 편리한 방법입니다:

@example
>>> mock = Mock()
>>> mock.method(1, 2, 3, test='wow')
<Mock name='mock.method()' id='...'>
>>> mock.method.assert_called_with(1, 2, 3, test='wow')
@end example
@end deffn

@geindex assert_called_once_with() (unittest.mock.Mock 메서드)
@anchor{library/unittest mock unittest mock Mock assert_called_once_with}@anchor{4674}
@deffn {메서드} assert_called_once_with (*args, **kwargs)

모의 객체가 정확히 한 번 호출되었고 해당 호출이 지정된 인자로 이루어졌다고 어서트 합니다.

@example
>>> mock = Mock(return_value=None)
>>> mock('foo', bar='baz')
>>> mock.assert_called_once_with('foo', bar='baz')
>>> mock('other', bar='values')
>>> mock.assert_called_once_with('other', bar='values')
Traceback (most recent call last):
  ...
AssertionError: Expected 'mock' to be called once. Called 2 times.
Calls: [call('foo', bar='baz'), call('other', bar='values')].
@end example
@end deffn

@geindex assert_any_call() (unittest.mock.Mock 메서드)
@anchor{library/unittest mock unittest mock Mock assert_any_call}@anchor{4675}
@deffn {메서드} assert_any_call (*args, **kwargs)

지정된 인자로 모의 객체가 호출되었다고 어서트 합니다.

호출이 가장 최근 호출일 때만 통과하는 @ref{1e00,,assert_called_with()}와 @ref{4674,,assert_called_once_with()}, 그리고 @code{assert_called_once_with()}의 경우 유일한 호출이어야 하는 것과 달리 모의 객체가 호출된 적이 `있으면' 어서트가 통과합니다.

@example
>>> mock = Mock(return_value=None)
>>> mock(1, 2, arg='thing')
>>> mock('some', 'thing', 'else')
>>> mock.assert_any_call(1, 2, arg='thing')
@end example
@end deffn

@geindex assert_has_calls() (unittest.mock.Mock 메서드)
@anchor{library/unittest mock unittest mock Mock assert_has_calls}@anchor{1a22}
@deffn {메서드} assert_has_calls (calls, any_order=False)

지정된 호출로 모의 객체가 호출되었다고 어서트 합니다. calls에 대해 @ref{4676,,mock_calls} 리스트를 검사합니다.

`any_order'가 거짓이면 호출은 순차적이어야 합니다. 지정된 호출 전후에 추가 호출이 있을 수 있습니다.

`any_order'가 참이면 호출 순서는 상관없지만, 모두 @ref{4676,,mock_calls}에 나타나야 합니다.

@example
>>> mock = Mock(return_value=None)
>>> mock(1)
>>> mock(2)
>>> mock(3)
>>> mock(4)
>>> calls = [call(2), call(3)]
>>> mock.assert_has_calls(calls)
>>> calls = [call(4), call(2), call(3)]
>>> mock.assert_has_calls(calls, any_order=True)
@end example
@end deffn

@geindex assert_not_called() (unittest.mock.Mock 메서드)
@anchor{library/unittest mock unittest mock Mock assert_not_called}@anchor{108d}
@deffn {메서드} assert_not_called ()

모의 객체가 호출되지 않았다고 어서트 합니다.

@example
>>> m = Mock()
>>> m.hello.assert_not_called()
>>> obj = m.hello()
>>> m.hello.assert_not_called()
Traceback (most recent call last):
  ...
AssertionError: Expected 'hello' to not have been called. Called 1 times.
Calls: [call()].
@end example


Added in version 3.5.

@end deffn

@geindex reset_mock() (unittest.mock.Mock 메서드)
@anchor{library/unittest mock unittest mock Mock reset_mock}@anchor{ef5}
@deffn {메서드} reset_mock (*, return_value=False, side_effect=False)

reset_mock 메서드는 모의 객체의 모든 호출 어트리뷰트를 재설정합니다:

@example
>>> mock = Mock(return_value=None)
>>> mock('hello')
>>> mock.called
True
>>> mock.reset_mock()
>>> mock.called
False
@end example

This can be useful where you want to make a series of assertions that
reuse the same object.

`return_value' parameter when set to @code{True} resets @ref{4672,,return_value}:

@example
>>> mock = Mock(return_value=5)
>>> mock('hello')
5
>>> mock.reset_mock(return_value=True)
>>> mock('hello')
<Mock name='mock()' id='...'>
@end example

`side_effect' parameter when set to @code{True} resets @ref{466a,,side_effect}:

@example
>>> mock = Mock(side_effect=ValueError)
>>> mock('hello')
Traceback (most recent call last):
  ...
ValueError
>>> mock.reset_mock(side_effect=True)
>>> mock('hello')
<Mock name='mock()' id='...'>
@end example

Note that @code{reset_mock()} `doesn’t' clear the
@ref{4672,,return_value}, @ref{466a,,side_effect} or any child attributes you have
set using normal assignment by default.

Child mocks are reset as well.


버전 3.6에서 변경: reset_mock 함수에 두 개의 키워드 전용 인자를 추가했습니다.

@end deffn

@geindex mock_add_spec() (unittest.mock.Mock 메서드)
@anchor{library/unittest mock unittest mock Mock mock_add_spec}@anchor{4677}
@deffn {메서드} mock_add_spec (spec, spec_set=False)

모의 객체에 사양을 추가합니다. `spec'은 객체이거나 문자열 리스트일 수 있습니다. `spec'의 어트리뷰트 만 모의 객체에서 어트리뷰트로 꺼낼 수 있습니다.

`spec_set'이 참이면 스펙에 있는 어트리뷰트 만 설정할 수 있습니다.
@end deffn

@geindex attach_mock() (unittest.mock.Mock 메서드)
@anchor{library/unittest mock unittest mock Mock attach_mock}@anchor{1956}
@deffn {메서드} attach_mock (mock, attribute)

이름과 부모를 치환해서, 이것의 어트리뷰트(attribute)로 모의 객체(mock)를 연결합니다. 연결된 모의 객체에 대한 호출은 이것의 @ref{4678,,method_calls}와 @ref{4676,,mock_calls} 어트리뷰트에 기록됩니다.
@end deffn

@geindex configure_mock() (unittest.mock.Mock 메서드)
@anchor{library/unittest mock unittest mock Mock configure_mock}@anchor{4673}
@deffn {메서드} configure_mock (**kwargs)

키워드 인자를 통해 모의 객체의 어트리뷰트를 설정합니다.

표준 점 표기법과 메서드 호출에서 딕셔너리 언 패킹을 사용해서 자식 모의 객체에 어트리뷰트와 반환 값 및 부작용을 설정할 수 있습니다:

@example
>>> mock = Mock()
>>> attrs = @{'method.return_value': 3, 'other.side_effect': KeyError@}
>>> mock.configure_mock(**attrs)
>>> mock.method()
3
>>> mock.other()
Traceback (most recent call last):
  ...
KeyError
@end example

모의 객체에 대한 생성자 호출에서 같은 것을 할 수 있습니다:

@example
>>> attrs = @{'method.return_value': 3, 'other.side_effect': KeyError@}
>>> mock = Mock(some_attribute='eggs', **attrs)
>>> mock.some_attribute
'eggs'
>>> mock.method()
3
>>> mock.other()
Traceback (most recent call last):
  ...
KeyError
@end example

@ref{4673,,configure_mock()}은 모의 객체를 만든 후에 구성을 더 쉽게 할 수 있도록 하기 위해 존재합니다.
@end deffn

@geindex __dir__() (unittest.mock.Mock 메서드)
@anchor{library/unittest mock unittest mock Mock __dir__}@anchor{4679}
@deffn {메서드} __dir__ ()

@ref{c3d,,Mock} 객체는 @code{dir(some_mock)}의 결과를 유용한 결과로 제한합니다. `spec'이 있는 모의 객체에서 이것은 모의 객체에 허용되는 모든 어트리뷰트를 포함합니다.

이 필터링이 하는 일과 해제 방법에 대해서는 @ref{467a,,FILTER_DIR}을 참조하십시오.
@end deffn

@geindex _get_child_mock() (unittest.mock.Mock 메서드)
@anchor{library/unittest mock unittest mock Mock _get_child_mock}@anchor{467b}
@deffn {메서드} _get_child_mock (**kw)

어트리뷰트와 반환 값에 대한 자식 모의 객체를 만듭니다. 기본적으로 자식 모의 객체는 부모와 같은 형입니다. Mock의 서브 클래스는 자식 모의 객체가 만들어지는 방법을 사용자 정의하기 위해 이를 재정의할 수 있습니다.

콜러블이 아닌 모의 객체의 경우 (사용자 정의 서브 클래스 대신) 콜러블 변형이 사용됩니다.
@end deffn

@geindex called (unittest.mock.Mock의 속성)
@anchor{library/unittest mock unittest mock Mock called}@anchor{467c}
@deffn {속성} called

모의 객체가 호출되었는지를 나타내는 불리언:

@example
>>> mock = Mock(return_value=None)
>>> mock.called
False
>>> mock()
>>> mock.called
True
@end example
@end deffn

@geindex call_count (unittest.mock.Mock의 속성)
@anchor{library/unittest mock unittest mock Mock call_count}@anchor{178a}
@deffn {속성} call_count

모의 객체가 몇 번이나 호출되었는지를 알려주는 정수:

@example
>>> mock = Mock(return_value=None)
>>> mock.call_count
0
>>> mock()
>>> mock()
>>> mock.call_count
2
@end example
@end deffn

@geindex return_value (unittest.mock.Mock의 속성)
@anchor{library/unittest mock unittest mock Mock return_value}@anchor{4672}
@deffn {속성} return_value

모의 객체를 호출할 때 반환되는 값을 구성하려면 이것을 설정하십시오:

@example
>>> mock = Mock()
>>> mock.return_value = 'fish'
>>> mock()
'fish'
@end example

기본 반환 값은 모의 객체이며 일반적인 방식으로 구성할 수 있습니다:

@example
>>> mock = Mock()
>>> mock.return_value.attribute = sentinel.Attribute
>>> mock.return_value()
<Mock name='mock()()' id='...'>
>>> mock.return_value.assert_called_with()
@end example

생성자에서 @ref{4672,,return_value}를 설정할 수도 있습니다:

@example
>>> mock = Mock(return_value=3)
>>> mock.return_value
3
>>> mock()
3
@end example
@end deffn

@geindex side_effect (unittest.mock.Mock의 속성)
@anchor{library/unittest mock unittest mock Mock side_effect}@anchor{466a}
@deffn {속성} side_effect

이것은 모의 객체가 호출될 때 호출되는 함수, 이터러블 또는 발생시킬 예외(클래스나 인스턴스)일 수 있습니다.

함수를 전달하면 모의 객체와 같은 인자로 호출되며 함수가 @ref{4671,,DEFAULT} 싱글톤을 반환하지 않는 한 모의 객체에 대한 호출은 함수가 반환하는 것을 반환합니다. 함수가 @code{DEFAULT}를 반환하면 모의 객체는 (@ref{4672,,return_value}에서) 정상값을 반환합니다.

이터러블을 전달하면, 모든 호출에서 값을 산출해야 하는 이터레이터를 얻는 데 사용됩니다. 이 값은 발생시킬 예외 인스턴스나 모의 객체 호출에서 반환될 값일 수 있습니다 (@ref{4671,,DEFAULT} 처리는 함수 경우와 같습니다).

(API의 예외 처리를 테스트하기 위해) 예외를 발생시키는 모의 객체 예:

@example
>>> mock = Mock()
>>> mock.side_effect = Exception('Boom!')
>>> mock()
Traceback (most recent call last):
  ...
Exception: Boom!
@end example

@ref{466a,,side_effect}를 사용하여 일련의 값을 반환하기:

@example
>>> mock = Mock()
>>> mock.side_effect = [3, 2, 1]
>>> mock(), mock(), mock()
(3, 2, 1)
@end example

콜러블 사용하기:

@example
>>> mock = Mock(return_value=3)
>>> def side_effect(*args, **kwargs):
...     return DEFAULT
...
>>> mock.side_effect = side_effect
>>> mock()
3
@end example

생성자에서 @ref{466a,,side_effect}를 설정할 수 있습니다. 다음은 모의 객체가 호출된 값에 1을 더해서 반환하는 예입니다:

@example
>>> side_effect = lambda value: value + 1
>>> mock = Mock(side_effect=side_effect)
>>> mock(3)
4
>>> mock(-8)
-7
@end example

@ref{466a,,side_effect}를 @code{None}으로 설정하면 지워집니다:

@example
>>> m = Mock(side_effect=KeyError, return_value=3)
>>> m()
Traceback (most recent call last):
 ...
KeyError
>>> m.side_effect = None
>>> m()
3
@end example
@end deffn

@geindex call_args (unittest.mock.Mock의 속성)
@anchor{library/unittest mock unittest mock Mock call_args}@anchor{1d66}
@deffn {속성} call_args

This is either @code{None} (if the mock hasn’t been called), or the
arguments that the mock was last called with. This will be in the
form of a tuple: the first member, which can also be accessed through
the @code{args} property, is any positional arguments the mock was
called with (or an empty tuple) and the second member, which can
also be accessed through the @code{kwargs} property, is any keyword
arguments (or an empty dictionary).

@example
>>> mock = Mock(return_value=None)
>>> print(mock.call_args)
None
>>> mock()
>>> mock.call_args
call()
>>> mock.call_args == ()
True
>>> mock(3, 4)
>>> mock.call_args
call(3, 4)
>>> mock.call_args == ((3, 4),)
True
>>> mock.call_args.args
(3, 4)
>>> mock.call_args.kwargs
@{@}
>>> mock(3, 4, 5, key='fish', next='w00t!')
>>> mock.call_args
call(3, 4, 5, key='fish', next='w00t!')
>>> mock.call_args.args
(3, 4, 5)
>>> mock.call_args.kwargs
@{'key': 'fish', 'next': 'w00t!'@}
@end example

@ref{467d,,call_args_list}, @ref{4678,,method_calls} 및 @ref{4676,,mock_calls} 리스트의 멤버와 함께 @ref{1d66,,call_args}는 @ref{1db0,,call} 객체입니다. 이들은 튜플이므로, 개별 인자를 얻고 더 복잡한 어서션을 하기 위해 언팩할 수 있습니다. @ref{467e,,call 튜플}을 참조하십시오.


버전 3.8에서 변경: @code{args}와 @code{kwargs} 프로퍼티를 추가했습니다.

@end deffn

@geindex call_args_list (unittest.mock.Mock의 속성)
@anchor{library/unittest mock unittest mock Mock call_args_list}@anchor{467d}
@deffn {속성} call_args_list

이것은 모의 객체에 대한 모든 호출을 순서대로 나열한 리스트입니다 (따라서 리스트의 길이는 호출된 횟수입니다). 호출이 있기 전에는 빈 리스트입니다. @ref{1db0,,call} 객체는 @ref{467d,,call_args_list}와 비교할 호출 리스트를 편리하게 구성하는 데 사용할 수 있습니다.

@example
>>> mock = Mock(return_value=None)
>>> mock()
>>> mock(3, 4)
>>> mock(key='fish', next='w00t!')
>>> mock.call_args_list
[call(), call(3, 4), call(key='fish', next='w00t!')]
>>> expected = [(), ((3, 4),), (@{'key': 'fish', 'next': 'w00t!'@},)]
>>> mock.call_args_list == expected
True
@end example

@ref{467d,,call_args_list}의 멤버는 @ref{1db0,,call} 객체입니다. 이들은 개별 인자를 얻기 위해 튜플로서 언팩될 수 있습니다. @ref{467e,,call 튜플}을 참조하십시오.
@end deffn

@geindex method_calls (unittest.mock.Mock의 속성)
@anchor{library/unittest mock unittest mock Mock method_calls}@anchor{4678}
@deffn {속성} method_calls

자신에 대한 호출 추적뿐만 아니라, 모의 객체는 메서드와 어트리뷰트, 그리고 `그들의' 메서드와 어트리뷰트에 대한 호출도 추적합니다:

@example
>>> mock = Mock()
>>> mock.method()
<Mock name='mock.method()' id='...'>
>>> mock.property.method.attribute()
<Mock name='mock.property.method.attribute()' id='...'>
>>> mock.method_calls
[call.method(), call.property.method.attribute()]
@end example

@ref{4678,,method_calls}의 멤버는 @ref{1db0,,call} 객체입니다. 이들은 개별 인자를 얻기 위해 튜플로서 언팩될 수 있습니다. @ref{467e,,call 튜플}을 참조하십시오.
@end deffn

@geindex mock_calls (unittest.mock.Mock의 속성)
@anchor{library/unittest mock unittest mock Mock mock_calls}@anchor{4676}
@deffn {속성} mock_calls

@ref{4676,,mock_calls}는 모의 객체, 그것의 메서드, 매직 메서드 `및' 반환 값 모의 객체에 대한 `모든' 호출을 기록합니다.

@example
>>> mock = MagicMock()
>>> result = mock(1, 2, 3)
>>> mock.first(a=3)
<MagicMock name='mock.first()' id='...'>
>>> mock.second()
<MagicMock name='mock.second()' id='...'>
>>> int(mock)
1
>>> result(1)
<MagicMock name='mock()()' id='...'>
>>> expected = [call(1, 2, 3), call.first(a=3), call.second(),
... call.__int__(), call()(1)]
>>> mock.mock_calls == expected
True
@end example

@ref{4676,,mock_calls}의 멤버는 @ref{1db0,,call} 객체입니다. 이들은 개별 인자를 얻기 위해 튜플로서 언팩될 수 있습니다. @ref{467e,,call 튜플}을 참조하십시오.

@cartouche
@quotation 참고 
@ref{4676,,mock_calls}가 기록되는 방식은 중첩된 호출이 수행될 때 상위 호출의 매개 변수가 기록되지 않아서 항상 같다고 비교됨을 뜻합니다.:

@example
>>> mock = MagicMock()
>>> mock.top(a=3).bottom()
<MagicMock name='mock.top().bottom()' id='...'>
>>> mock.mock_calls
[call.top(a=3), call.top().bottom()]
>>> mock.mock_calls[-1] == call.top(a=-1).bottom()
True
@end example
@end quotation
@end cartouche
@end deffn

@geindex __class__ (unittest.mock.Mock의 속성)
@anchor{library/unittest mock unittest mock Mock __class__}@anchor{467f}
@deffn {속성} __class__

일반적으로 객체의 @code{__class__} 어트리뷰트는 해당 형을 반환합니다. @code{spec}이 있는 모의 객체의 경우, @code{__class__}는 대신 spec 클래스를 반환합니다. 이를 통해 모의 객체는 다음과 같이 대체 / 가장하는 객체에 대한 @ref{2ad,,isinstance()} 테스트를 통과할 수 있습니다:

@example
>>> mock = Mock(spec=3)
>>> isinstance(mock, int)
True
@end example

@code{__class__}는 대입할 수 있습니다. 이를 통해 spec을 사용하지 않고도 모의 객체가 @ref{2ad,,isinstance()} 검사를 통과할 수 있습니다.:

@example
>>> mock = Mock()
>>> mock.__class__ = dict
>>> isinstance(mock, dict)
True
@end example
@end deffn
@end deffn

@geindex NonCallableMock (unittest.mock 클래스)
@anchor{library/unittest mock unittest mock NonCallableMock}@anchor{466f}
@deffn {클래스} unittest.mock.NonCallableMock (spec=None, wraps=None, name=None, spec_set=None, **kwargs)

콜러블이 아닌 @ref{c3d,,Mock} 버전. 생성자 매개 변수는 @code{Mock}과 같은 의미를 가지며, 콜러블이 아닌 모의 객체에서 의미가 없는 `return_value'와 `side_effect'는 예외입니다.
@end deffn

클래스 나 인스턴스를 @code{spec}이나 @code{spec_set}으로 사용하는 모의 객체는 @ref{2ad,,isinstance()} 테스트를 통과할 수 있습니다:

@example
>>> mock = Mock(spec=SomeClass)
>>> isinstance(mock, SomeClass)
True
>>> mock = Mock(spec_set=SomeClass())
>>> isinstance(mock, SomeClass)
True
@end example

@ref{c3d,,Mock} 클래스는 매직 메서드 모킹을 지원합니다. 자세한 내용은 @ref{466c,,매직 메서드}를 참조하십시오.

모의 객체 클래스와 @ref{1091,,patch()} 데코레이터는 모두 구성을 위해 임의의 키워드 인자를 취합니다. @code{patch()} 데코레이터의 경우 키워드는 만들어지는 모의 객체의 생성자로 전달됩니다. 키워드 인자는 모의 객체의 어트리뷰트를 구성하기 위한 것입니다.:

@example
>>> m = MagicMock(attribute=3, other='fish')
>>> m.attribute
3
>>> m.other
'fish'
@end example

자식 모의 객체의 반환 값과 부작용은 점 표기법을 사용하여 같은 방식으로 설정할 수 있습니다. 호출에서 점으로 구분된 이름을 직접 사용할 수 없어서 딕셔너리를 만들고 @code{**}를 사용하여 언팩해야 합니다:

@example
>>> attrs = @{'method.return_value': 3, 'other.side_effect': KeyError@}
>>> mock = Mock(some_attribute='eggs', **attrs)
>>> mock.some_attribute
'eggs'
>>> mock.method()
3
>>> mock.other()
Traceback (most recent call last):
  ...
KeyError
@end example

`spec'(또는 `spec_set')으로 만들어진 콜러블 모의 객체는 호출을 모의 객체와 일치시킬 때 사양 객체의 서명을 검사합니다. 따라서, 위치나 이름으로 전달되었는지와 관계없이 실제 호출의 인자와 일치할 수 있습니다:

@example
>>> def f(a, b, c): pass
...
>>> mock = Mock(spec=f)
>>> mock(1, 2, c=3)
<Mock name='mock()' id='140161580456576'>
>>> mock.assert_called_with(1, 2, 3)
>>> mock.assert_called_with(a=1, b=2, c=3)
@end example

이것은 @ref{1e00,,assert_called_with()}, @ref{4674,,assert_called_once_with()}, @ref{1a22,,assert_has_calls()} 및 @ref{4675,,assert_any_call()}에 적용됩니다. @ref{466d,,자동 사양}할 때, 모의 객체의 메서드 호출에도 적용됩니다.


버전 3.4에서 변경: spec 되거나 자동 사양된 모의 객체에 대한 서명 검사를 추가했습니다.


@geindex PropertyMock (unittest.mock 클래스)
@anchor{library/unittest mock unittest mock PropertyMock}@anchor{4680}
@deffn {클래스} unittest.mock.PropertyMock (*args, **kwargs)

클래스에서 @ref{4b3,,property}나 다른 @ref{1884,,디스크립터}로 사용하기 위한 모의 객체. @ref{4680,,PropertyMock}은 @ref{16ed,,__get__()}과 @ref{23b5,,__set__()} 메서드를 제공하므로 꺼낼 때 반환 값을 지정할 수 있습니다.

객체에서 @ref{4680,,PropertyMock} 인스턴스를 가져오면 인자 없이 모의 객체를 호출합니다. 설정하면 설정되는 값으로 모의 객체를 호출합니다.

@example
>>> class Foo:
...     @@property
...     def foo(self):
...         return 'something'
...     @@foo.setter
...     def foo(self, value):
...         pass
...
>>> with patch('__main__.Foo.foo', new_callable=PropertyMock) as mock_foo:
...     mock_foo.return_value = 'mockity-mock'
...     this_foo = Foo()
...     print(this_foo.foo)
...     this_foo.foo = 6
...
mockity-mock
>>> mock_foo.mock_calls
[call(), call(6)]
@end example
@end deffn

모의 객체 어트리뷰트가 저장되는 방식으로 인해 @ref{4680,,PropertyMock}을 모의 객체에 직접 연결할 수 없습니다. 대신 모의 객체의 형 객체에 연결할 수 있습니다:

@example
>>> m = MagicMock()
>>> p = PropertyMock(return_value=3)
>>> type(m).foo = p
>>> m.foo
3
>>> p.assert_called_once_with()
@end example

@cartouche
@quotation 조심 
If an @ref{5ee,,AttributeError} is raised by @ref{4680,,PropertyMock},
it will be interpreted as a missing descriptor and
@ref{6f9,,__getattr__()} will be called on the parent mock:

@example
>>> m = MagicMock()
>>> no_attribute = PropertyMock(side_effect=AttributeError)
>>> type(m).my_property = no_attribute
>>> m.my_property
<MagicMock name='mock.my_property' id='140165240345424'>
@end example

See @ref{6f9,,__getattr__()} for details.
@end quotation
@end cartouche

@geindex AsyncMock (unittest.mock 클래스)
@anchor{library/unittest mock unittest mock AsyncMock}@anchor{c3e}
@deffn {클래스} unittest.mock.AsyncMock (spec=None, side_effect=None, return_value=DEFAULT, wraps=None, name=None, spec_set=None, unsafe=False, **kwargs)

@ref{108e,,MagicMock}의 비동기 버전. @ref{c3e,,AsyncMock} 객체는 객체가 비동기 함수로 인식되도록 동작하고, 호출 결과는 어웨이터블 입니다.

@example
>>> mock = AsyncMock()
>>> inspect.iscoroutinefunction(mock)
True
>>> inspect.isawaitable(mock())
True
@end example

@code{mock()}의 결과는 어웨이트 한 후 @code{side_effect}나 @code{return_value}를 제공하는 비동기 함수입니다:


@itemize -

@item 
@code{side_effect}가 함수이면, 비동기 함수는 해당 함수의 결과를 반환합니다,

@item 
@code{side_effect}가 예외이면, 비동기 함수는 예외를 발생시킵니다,

@item 
@code{side_effect}가 이터러블이면, 비동기 함수는 이터러블의 다음 값을 반환하지만, 결과 시퀀스가 소진되면 @code{StopAsyncIteration}이 즉시 발생합니다,

@item 
@code{side_effect}가 정의되지 않으면, 비동기 함수는 @code{return_value}에 의해 정의된 값을 반환하므로, 기본적으로 비동기 함수는 새 @ref{c3e,,AsyncMock} 객체를 반환합니다.
@end itemize

@ref{c3d,,Mock}이나 @ref{108e,,MagicMock}의 `spec'을 비동기 함수로 설정하면 호출 후에 코루틴 객체가 반환됩니다.

@example
>>> async def async_func(): pass
...
>>> mock = MagicMock(async_func)
>>> mock
<MagicMock spec='function' id='...'>
>>> mock()
<coroutine object AsyncMockMixin._mock_call at ...>
@end example

@ref{c3d,,Mock}, @ref{108e,,MagicMock} 또는 @ref{c3e,,AsyncMock}의 `spec'을 비동기와 동기 함수가 있는 클래스로 설정하면 동기 함수를 자동으로 감지하고 그들을 @code{MagicMock}(부모 모의 객체가 @code{AsyncMock}이나 @code{MagicMock}일 때)이나 @code{Mock}(부모 모의 객체가 @code{Mock}일 때)으로 설정합니다. 모든 비동기 함수는 @code{AsyncMock}이 됩니다.

@example
>>> class ExampleClass:
...     def sync_foo():
...         pass
...     async def async_foo():
...         pass
...
>>> a_mock = AsyncMock(ExampleClass)
>>> a_mock.sync_foo
<MagicMock name='mock.sync_foo' id='...'>
>>> a_mock.async_foo
<AsyncMock name='mock.async_foo' id='...'>
>>> mock = Mock(ExampleClass)
>>> mock.sync_foo
<Mock name='mock.sync_foo' id='...'>
>>> mock.async_foo
<AsyncMock name='mock.async_foo' id='...'>
@end example


Added in version 3.8.


@geindex assert_awaited() (unittest.mock.AsyncMock 메서드)
@anchor{library/unittest mock unittest mock AsyncMock assert_awaited}@anchor{4681}
@deffn {메서드} assert_awaited ()

모의 객체가 적어도 한 번 어웨이트 되었다고 어서트 합니다. 이것은 호출된 객체와 별개임에 유의하십시오, @code{await} 키워드를 반드시 사용해야 합니다:

@example
>>> mock = AsyncMock()
>>> async def main(coroutine_mock):
...     await coroutine_mock
...
>>> coroutine_mock = mock()
>>> mock.called
True
>>> mock.assert_awaited()
Traceback (most recent call last):
...
AssertionError: Expected mock to have been awaited.
>>> asyncio.run(main(coroutine_mock))
>>> mock.assert_awaited()
@end example
@end deffn

@geindex assert_awaited_once() (unittest.mock.AsyncMock 메서드)
@anchor{library/unittest mock unittest mock AsyncMock assert_awaited_once}@anchor{4682}
@deffn {메서드} assert_awaited_once ()

모의 객체가 정확히 한 번 어웨이트 되었다고 어서트 합니다.

@example
>>> mock = AsyncMock()
>>> async def main():
...     await mock()
...
>>> asyncio.run(main())
>>> mock.assert_awaited_once()
>>> asyncio.run(main())
>>> mock.assert_awaited_once()
Traceback (most recent call last):
...
AssertionError: Expected mock to have been awaited once. Awaited 2 times.
@end example
@end deffn

@geindex assert_awaited_with() (unittest.mock.AsyncMock 메서드)
@anchor{library/unittest mock unittest mock AsyncMock assert_awaited_with}@anchor{4683}
@deffn {메서드} assert_awaited_with (*args, **kwargs)

마지막 어웨이트가 지정된 인자로 이루어졌다고 어서트 합니다.

@example
>>> mock = AsyncMock()
>>> async def main(*args, **kwargs):
...     await mock(*args, **kwargs)
...
>>> asyncio.run(main('foo', bar='bar'))
>>> mock.assert_awaited_with('foo', bar='bar')
>>> mock.assert_awaited_with('other')
Traceback (most recent call last):
...
AssertionError: expected await not found.
Expected: mock('other')
Actual: mock('foo', bar='bar')
@end example
@end deffn

@geindex assert_awaited_once_with() (unittest.mock.AsyncMock 메서드)
@anchor{library/unittest mock unittest mock AsyncMock assert_awaited_once_with}@anchor{4684}
@deffn {메서드} assert_awaited_once_with (*args, **kwargs)

모의 객체가 정확히 한 번, 지정된 인자로 어웨이트 되었다고 어서트 합니다.

@example
>>> mock = AsyncMock()
>>> async def main(*args, **kwargs):
...     await mock(*args, **kwargs)
...
>>> asyncio.run(main('foo', bar='bar'))
>>> mock.assert_awaited_once_with('foo', bar='bar')
>>> asyncio.run(main('foo', bar='bar'))
>>> mock.assert_awaited_once_with('foo', bar='bar')
Traceback (most recent call last):
...
AssertionError: Expected mock to have been awaited once. Awaited 2 times.
@end example
@end deffn

@geindex assert_any_await() (unittest.mock.AsyncMock 메서드)
@anchor{library/unittest mock unittest mock AsyncMock assert_any_await}@anchor{4685}
@deffn {메서드} assert_any_await (*args, **kwargs)

지정된 인자로 모의 객체가 어웨이트된 적이 있다고 어서트 합니다.

@example
>>> mock = AsyncMock()
>>> async def main(*args, **kwargs):
...     await mock(*args, **kwargs)
...
>>> asyncio.run(main('foo', bar='bar'))
>>> asyncio.run(main('hello'))
>>> mock.assert_any_await('foo', bar='bar')
>>> mock.assert_any_await('other')
Traceback (most recent call last):
...
AssertionError: mock('other') await not found
@end example
@end deffn

@geindex assert_has_awaits() (unittest.mock.AsyncMock 메서드)
@anchor{library/unittest mock unittest mock AsyncMock assert_has_awaits}@anchor{4686}
@deffn {메서드} assert_has_awaits (calls, any_order=False)

지정된 호출로 모의 객체가 어웨이트 되었다고 어서트 합니다. 어웨이트에 대해 @ref{1d65,,await_args_list} 리스트가 검사됩니다.

`any_order'가 거짓이면 어웨이트는 순차적이어야 합니다. 지정된 어웨이트 전이나 후에 추가 호출이 있을 수 있습니다.

`any_order'가 참이면 어웨이트 순서와 관계없이 모두 @ref{1d65,,await_args_list}에 나타나야 합니다.

@example
>>> mock = AsyncMock()
>>> async def main(*args, **kwargs):
...     await mock(*args, **kwargs)
...
>>> calls = [call("foo"), call("bar")]
>>> mock.assert_has_awaits(calls)
Traceback (most recent call last):
...
AssertionError: Awaits not found.
Expected: [call('foo'), call('bar')]
Actual: []
>>> asyncio.run(main('foo'))
>>> asyncio.run(main('bar'))
>>> mock.assert_has_awaits(calls)
@end example
@end deffn

@geindex assert_not_awaited() (unittest.mock.AsyncMock 메서드)
@anchor{library/unittest mock unittest mock AsyncMock assert_not_awaited}@anchor{4687}
@deffn {메서드} assert_not_awaited ()

모의 객체가 어웨이트 된 적이 없다고 어서트 합니다.

@example
>>> mock = AsyncMock()
>>> mock.assert_not_awaited()
@end example
@end deffn

@geindex reset_mock() (unittest.mock.AsyncMock 메서드)
@anchor{library/unittest mock unittest mock AsyncMock reset_mock}@anchor{4688}
@deffn {메서드} reset_mock (*args, **kwargs)

@ref{ef5,,Mock.reset_mock()}을 참조하십시오. 또한 @ref{4689,,await_count}를 0으로, @ref{468a,,await_args}를 None으로 설정하고, @ref{1d65,,await_args_list}를 지웁니다.
@end deffn

@geindex await_count (unittest.mock.AsyncMock의 속성)
@anchor{library/unittest mock unittest mock AsyncMock await_count}@anchor{4689}
@deffn {속성} await_count

모의 객체가 몇 번 어웨이트 되었는지 추적하는 정수.

@example
>>> mock = AsyncMock()
>>> async def main():
...     await mock()
...
>>> asyncio.run(main())
>>> mock.await_count
1
>>> asyncio.run(main())
>>> mock.await_count
2
@end example
@end deffn

@geindex await_args (unittest.mock.AsyncMock의 속성)
@anchor{library/unittest mock unittest mock AsyncMock await_args}@anchor{468a}
@deffn {속성} await_args

이것은 @code{None}(모의 객체가 어웨이트 되지 않았을 때)이거나 모의 객체가 마지막으로 어웨이트 된 인자입니다. @ref{1d66,,Mock.call_args}와 같게 기능합니다.

@example
>>> mock = AsyncMock()
>>> async def main(*args):
...     await mock(*args)
...
>>> mock.await_args
>>> asyncio.run(main('foo'))
>>> mock.await_args
call('foo')
>>> asyncio.run(main('bar'))
>>> mock.await_args
call('bar')
@end example
@end deffn

@geindex await_args_list (unittest.mock.AsyncMock의 속성)
@anchor{library/unittest mock unittest mock AsyncMock await_args_list}@anchor{1d65}
@deffn {속성} await_args_list

이것은 모의 객체에 대한 모든 어웨이트를 순서대로 나열한 리스트입니다 (따라서 리스트의 길이는 어웨이트 한 횟수입니다). 어웨이트 전에는 빈 리스트입니다.

@example
>>> mock = AsyncMock()
>>> async def main(*args):
...     await mock(*args)
...
>>> mock.await_args_list
[]
>>> asyncio.run(main('foo'))
>>> mock.await_args_list
[call('foo')]
>>> asyncio.run(main('bar'))
>>> mock.await_args_list
[call('foo'), call('bar')]
@end example
@end deffn
@end deffn

@geindex ThreadingMock (unittest.mock 클래스)
@anchor{library/unittest mock unittest mock ThreadingMock}@anchor{468b}
@deffn {클래스} unittest.mock.ThreadingMock (spec=None, side_effect=None, return_value=DEFAULT, wraps=None, name=None, spec_set=None, unsafe=False, *, timeout=UNSET, **kwargs)

A version of @ref{108e,,MagicMock} for multithreading tests. The
@code{ThreadingMock} object provides extra methods to wait for a call to
be invoked, rather than assert on it immediately.

The default timeout is specified by the @code{timeout} argument, or if unset by the
@ref{468c,,ThreadingMock.DEFAULT_TIMEOUT} attribute, which defaults to blocking (@code{None}).

You can configure the global default timeout by setting @ref{468c,,ThreadingMock.DEFAULT_TIMEOUT}.

@geindex wait_until_called() (unittest.mock.ThreadingMock 메서드)
@anchor{library/unittest mock unittest mock ThreadingMock wait_until_called}@anchor{468d}
@deffn {메서드} wait_until_called (*, timeout=UNSET)

모의 객체가 호출될 때까지 기다립니다.

If a timeout was passed at the creation of the mock or if a timeout
argument is passed to this function, the function raises an
@ref{8b7,,AssertionError} if the call is not performed in time.

@example
>>> mock = ThreadingMock()
>>> thread = threading.Thread(target=mock)
>>> thread.start()
>>> mock.wait_until_called(timeout=1)
>>> thread.join()
@end example
@end deffn

@geindex wait_until_any_call_with() (unittest.mock.ThreadingMock 메서드)
@anchor{library/unittest mock unittest mock ThreadingMock wait_until_any_call_with}@anchor{468e}
@deffn {메서드} wait_until_any_call_with (*args, **kwargs)

지정된 인자로 모의 객체가 호출될 때까지 기다립니다.

If a timeout was passed at the creation of the mock
the function raises an @ref{8b7,,AssertionError} if the call is not performed in time.

@example
>>> mock = ThreadingMock()
>>> thread = threading.Thread(target=mock, args=("arg1", "arg2",), kwargs=@{"arg": "thing"@})
>>> thread.start()
>>> mock.wait_until_any_call_with("arg1", "arg2", arg="thing")
>>> thread.join()
@end example
@end deffn

@geindex DEFAULT_TIMEOUT (unittest.mock.ThreadingMock의 속성)
@anchor{library/unittest mock unittest mock ThreadingMock DEFAULT_TIMEOUT}@anchor{468c}
@deffn {속성} DEFAULT_TIMEOUT

Global default timeout in seconds to create instances of @code{ThreadingMock}.
@end deffn


Added in version 3.13.

@end deffn

@menu
* 호출: 호출<2>. 
* 어트리뷰트 삭제:: 
* 모의 객체 이름과 이름 어트리뷰트:: 
* 모의 객체를 어트리뷰트로 연결하기:: 

@end menu

@node 호출<2>,어트리뷰트 삭제,,Mock 클래스
@anchor{library/unittest mock calling}@anchor{468f}
@subsubsection 호출


모의 객체는 콜러블입니다. 호출은 @ref{4672,,return_value} 어트리뷰트로 설정된 값을 반환합니다. 기본 반환 값은 새로운 Mock 객체입니다; (명시적으로나 Mock을 호출하여) 반환 값에 처음으로 액세스할 때 만들어지지만 - 저장되고 매번 같은 값이 반환됩니다.

객체에 대한 호출은 @ref{1d66,,call_args}와 @ref{467d,,call_args_list} 같은 어트리뷰트로 기록됩니다.

@ref{466a,,side_effect}가 설정되면 호출이 기록된 후에 호출되므로, @code{side_effect}에서 예외가 발생해도 호출은 여전히 기록됩니다.

호출될 때 모의 객체가 예외를 발생시키는 가장 간단한 방법은 @ref{466a,,side_effect}를 예외 클래스나 인스턴스로 만드는 것입니다:

@example
>>> m = MagicMock(side_effect=IndexError)
>>> m(1, 2, 3)
Traceback (most recent call last):
  ...
IndexError
>>> m.mock_calls
[call(1, 2, 3)]
>>> m.side_effect = KeyError('Bang!')
>>> m('two', 'three', 'four')
Traceback (most recent call last):
  ...
KeyError: 'Bang!'
>>> m.mock_calls
[call(1, 2, 3), call('two', 'three', 'four')]
@end example

@ref{466a,,side_effect}가 함수면 해당 함수가 반환하는 것이 모의 객체에 대한 호출이 반환하는 것입니다. @code{side_effect} 함수는 모의 객체와 같은 인자로 호출됩니다. 이를 통해 입력에 따라 호출의 반환 값을 동적으로 변경할 수 있습니다:

@example
>>> def side_effect(value):
...     return value + 1
...
>>> m = MagicMock(side_effect=side_effect)
>>> m(1)
2
>>> m(2)
3
>>> m.mock_calls
[call(1), call(2)]
@end example

모의 객체가 여전히 기본 반환 값(새로운 모의 객체)을, 또는 설정된 반환 값을, 반환하도록 하려면 두 가지 방법이 있습니다. @ref{466a,,side_effect} 내부에서 @ref{4672,,return_value}를 반환하거나 @ref{4671,,DEFAULT}를 반환하십시오:

@example
>>> m = MagicMock()
>>> def side_effect(*args, **kwargs):
...     return m.return_value
...
>>> m.side_effect = side_effect
>>> m.return_value = 3
>>> m()
3
>>> def side_effect(*args, **kwargs):
...     return DEFAULT
...
>>> m.side_effect = side_effect
>>> m()
3
@end example

@ref{466a,,side_effect}를 제거하고 기본 동작으로 돌아가려면, @code{side_effect}를 @code{None}으로 설정하십시오:

@example
>>> m = MagicMock(return_value=6)
>>> def side_effect(*args, **kwargs):
...     return 3
...
>>> m.side_effect = side_effect
>>> m()
3
>>> m.side_effect = None
>>> m()
6
@end example

@ref{466a,,side_effect}는 이터러블 객체일 수도 있습니다. 모의 객체에 대한 반복 호출은 이터러블에서 값을 반환합니다 (이터러블이 소진되고 @ref{df4,,StopIteration}이 발생할 때까지):

@example
>>> m = MagicMock(side_effect=[1, 2, 3])
>>> m()
1
>>> m()
2
>>> m()
3
>>> m()
Traceback (most recent call last):
  ...
StopIteration
@end example

이터러블의 멤버가 예외이면 반환되는 대신 예외를 발생시킵니다:

@example
>>> iterable = (33, ValueError, 66)
>>> m = MagicMock(side_effect=iterable)
>>> m()
33
>>> m()
Traceback (most recent call last):
 ...
ValueError
>>> m()
66
@end example

@node 어트리뷰트 삭제,모의 객체 이름과 이름 어트리뷰트,호출<2>,Mock 클래스
@anchor{library/unittest mock deleting-attributes}@anchor{4690}@anchor{library/unittest mock id2}@anchor{4691}
@subsubsection 어트리뷰트 삭제


모의 객체는 요청 시 어트리뷰트를 만듭니다. 이를 통해 모든 형의 객체인 것처럼 가장할 수 있습니다.

모의 객체가 @ref{6f8,,hasattr()} 호출에 대해 @code{False}를 반환하거나, 어트리뷰트를 가져올 때 @ref{5ee,,AttributeError}를 발생시키길 원할 수 있습니다. 모의 객체에 @code{spec}으로 객체를 제공하여 그렇게 할 수 있지만, 항상 편리하지는 않습니다.

어트리뷰트를 삭제하여 어트리뷰트를 “차단”합니다. 일단 삭제되면, 어트리뷰트에 액세스할 때 @ref{5ee,,AttributeError}가 발생합니다.

@example
>>> mock = MagicMock()
>>> hasattr(mock, 'm')
True
>>> del mock.m
>>> hasattr(mock, 'm')
False
>>> del mock.f
>>> mock.f
Traceback (most recent call last):
    ...
AttributeError: f
@end example

@node 모의 객체 이름과 이름 어트리뷰트,모의 객체를 어트리뷰트로 연결하기,어트리뷰트 삭제,Mock 클래스
@anchor{library/unittest mock mock-names-and-the-name-attribute}@anchor{4692}
@subsubsection 모의 객체 이름과 이름 어트리뷰트


“name”은 @ref{c3d,,Mock} 생성자에 대한 인자이므로, 모의 객체가 “name” 어트리뷰트를 가지려면 생성 시 전달할 수 없습니다. 두 가지 대안이 있습니다. 한가지 옵션은 @ref{4673,,configure_mock()}을 사용하는 것입니다:

@example
>>> mock = MagicMock()
>>> mock.configure_mock(name='my_name')
>>> mock.name
'my_name'
@end example

더 간단한 옵션은 모의 객체를 만든 후 단순히 “name” 어트리뷰트를 설정하는 것입니다:

@example
>>> mock = MagicMock()
>>> mock.name = "foo"
@end example

@node 모의 객체를 어트리뷰트로 연결하기,,모의 객체 이름과 이름 어트리뷰트,Mock 클래스
@anchor{library/unittest mock attaching-mocks-as-attributes}@anchor{4693}
@subsubsection 모의 객체를 어트리뷰트로 연결하기


모의 객체를 다른 모의 객체의 어트리뷰트로 (또는 반환 값으로) 연결하면 그 모의 객체의 “자식”이 됩니다. 자식에 대한 호출은 부모의 @ref{4678,,method_calls}와 @ref{4676,,mock_calls} 어트리뷰트에 기록됩니다. 이는 자식 모의 객체를 구성한 다음 부모에 연결하는 데 유용합니다. 또는 자식들에 대한 모든 호출을 기록하는 부모에 여러 모의 객체를 연결하고 모의 객체 간의 호출 순서에 대한 어서션을 하는 데 유용합니다:

@example
>>> parent = MagicMock()
>>> child1 = MagicMock(return_value=None)
>>> child2 = MagicMock(return_value=None)
>>> parent.child1 = child1
>>> parent.child2 = child2
>>> child1(1)
>>> child2(2)
>>> parent.mock_calls
[call.child1(1), call.child2(2)]
@end example

이에 대한 예외는 모의 객체에 이름이 있는 경우입니다. 어떤 이유로든 원하지 않을 때 “부모가 되는 것(parenting)”을 방지 할 수 있습니다.

@example
>>> mock = MagicMock()
>>> not_a_child = MagicMock(name='not-a-child')
>>> mock.attribute = not_a_child
>>> mock.attribute()
<MagicMock name='not-a-child()' id='...'>
>>> mock.mock_calls
[]
@end example

@ref{1091,,patch()}가 만든 모의 객체에는 자동으로 이름이 지정됩니다. 부모에게 이름을 가진 모의 객체를 연결하려면 @ref{1956,,attach_mock()} 메서드를 사용하십시오:

@example
>>> thing1 = object()
>>> thing2 = object()
>>> parent = MagicMock()
>>> with patch('__main__.thing1', return_value=None) as child1:
...     with patch('__main__.thing2', return_value=None) as child2:
...         parent.attach_mock(child1, 'child1')
...         parent.attach_mock(child2, 'child2')
...         child1('one')
...         child2('two')
...
>>> parent.mock_calls
[call.child1('one'), call.child2('two')]
@end example

@node 패처,MagicMock과 매직 메서드 지원,Mock 클래스,unittest mock — 모의 객체 라이브러리
@anchor{library/unittest mock the-patchers}@anchor{4694}
@subsubsection 패처


patch 데코레이터는 데코레이트 하는 함수의 스코프 내에서만 객체를 패치하는 데 사용됩니다. 예외가 발생하더라도 자동으로 패치 해제를 처리합니다. 이러한 함수는 모두 with 문에서 사용될 수 있고, 클래스 데코레이터로도 사용할 수 있습니다.

@menu
* patch:: 
* patch.object: patch object. 
* patch.dict: patch dict. 
* patch.multiple: patch multiple. 
* 패처 메서드; start와 stop: 패처 메서드 start와 stop. 
* 내장 패치:: 
* TEST_PREFIX:: 
* 패치 데코레이터 중첩하기:: 
* 패치할 곳:: 
* 디스크립터와 프락시 객체 패치하기:: 

@end menu

@node patch,patch object,,패처
@anchor{library/unittest mock patch}@anchor{4695}
@subsubsection patch


@cartouche
@quotation 참고 
중요한 것은 올바른 이름 공간에서 패치를 수행하는 것입니다. @ref{4696,,패치할 곳} 절을 참조하십시오.
@end quotation
@end cartouche

@geindex patch() (unittest.mock 모듈)
@anchor{library/unittest mock unittest mock patch}@anchor{1091}
@deffn {함수} unittest.mock.patch (target, new=DEFAULT, spec=None, create=False, spec_set=None, autospec=None, new_callable=None, **kwargs)

@ref{1091,,patch()}는 함수 데코레이터, 클래스 데코레이터 또는 컨텍스트 관리자 역할을 합니다. 함수 본문이나 with 문 내부에서, `target'은 `new' 객체로 패치됩니다. 함수/with 문이 종료될 때 패치가 복구됩니다.

`new'가 생략되면, 대상(target)은 패치된 객체가 비동기 함수이면 @ref{c3e,,AsyncMock}으로, 그렇지 않으면 @ref{108e,,MagicMock}으로 치환됩니다. @ref{1091,,patch()}가 데코레이터로 사용되고 `new'가 생략되면, 만들어진 모의 객체는 데코레이트 되는 함수에 대한 추가 인자로 전달됩니다. @code{patch()}가 컨텍스트 관리자로 사용되면 만들어진 모의 객체는 컨텍스트 관리자에 의해 반환됩니다.

`target'은 @code{'package.module.ClassName'} 형식의 문자열이어야 합니다. `target'이 임포트되고 지정된 객체를 `new' 객체로 치환하므로, @ref{1091,,patch()}를 호출하는 환경에서 `target'을 임포트 할 수 있어야 합니다. 데코레이트 하는 시간이 아니라 데코레이트 된 함수가 실행될 때 대상(target)을 임포트 합니다.

patch가 여러분을 위해 만든다면 `spec'과 `spec_set' 키워드 인자는 @ref{108e,,MagicMock}으로 전달됩니다.

또한 @code{spec=True}나 @code{spec_set=True}를 전달하면, patch는 모킹되는 객체를 spec/spec_set 객체로 전달합니다.

`new_callable'을 사용하면 `new' 객체를 만들기 위해 호출될 다른 클래스나 콜러블 객체를 지정할 수 있습니다. 기본적으로 @ref{c3e,,AsyncMock}이 비동기 함수에 사용되고 @ref{108e,,MagicMock}이 나머지에 사용됩니다.

`spec'의 더 강력한 형태는 `autospec'입니다. @code{autospec=True}를 설정하면 치환될 객체의 사양으로 모의 객체가 만들어집니다. 모의 객체의 모든 어트리뷰트는 또한 치환되는 객체의 해당 어트리뷰트의 사양을 갖습니다. 모킹되는 메서드와 함수는 인자를 검사하고 잘못된 서명으로 호출되면 @ref{198,,TypeError}를 발생시킵니다. 클래스를 치환하는 모의 객체의 경우, 반환 값(‘인스턴스’)은 클래스와 같은 사양을 갖습니다. @ref{1935,,create_autospec()} 함수와 @ref{466d,,자동 사양}을 참조하십시오.

@code{autospec=True} 대신 @code{autospec=some_object}를 전달하여 치환되는 것 대신 임의의 객체를 사양으로 사용할 수 있습니다.

기본적으로 @ref{1091,,patch()}는 존재하지 않는 어트리뷰트를 치환하지 못합니다. @code{create=True}를 전달하고, 어트리뷰트가 존재하지 않으면, 패치된 함수가 호출될 때 patch가 어트리뷰트를 만들고 패치된 함수가 종료된 후 다시 삭제합니다. 이는 프로덕션 코드가 실행 시간에 만드는 어트리뷰트에 대해 테스트를 작성하는 데 유용합니다. 위험할 수 있어서 기본적으로 꺼져있습니다. 이 기능을 켜면 실제로 존재하지 않는 API에 대해 통과하는 테스트를 작성할 수 있습니다!

@cartouche
@quotation 참고 

버전 3.5에서 변경: 모듈에 있는 내장(builtins)을 패치하는 경우 @code{create=True}를 전달할 필요가 없습니다, 기본적으로 추가됩니다.

@end quotation
@end cartouche

패치는 @ref{2b3,,TestCase} 클래스 데코레이터로 사용할 수 있습니다. 클래스의 각 테스트 메서드를 데코레이트 하여 작동합니다. 테스트 메서드가 공통 패치 집합을 공유할 때 관리용 코드가 줄어듭니다. @ref{1091,,patch()}는 @code{patch.TEST_PREFIX}로 시작하는 메서드 이름을 조회하는 것으로 테스트를 찾습니다. 기본적으로 이것은 @code{'test'}인데, @ref{10c,,unittest}가 테스트를 찾는 방식과 일치합니다. @code{patch.TEST_PREFIX}를 설정하여 대체 접두사를 지정할 수 있습니다.

with 문에서 patch를 컨텍스트 관리자로 사용할 수 있습니다. 여기서 패치는 with 문 다음에 들여쓰기 된 블록에 적용됩니다. “as”를 사용하면 패치된 객체는 “as” 뒤에 오는 이름으로 연결됩니다; @ref{1091,,patch()}가 모의 객체를 만들 때 매우 유용합니다.

@ref{1091,,patch()}는 임의의 키워드 인자를 취합니다. 이들은 만들어질 때 패치되는 객체가 비동기이면 @ref{c3e,,AsyncMock}으로, 그렇지 않으면 @ref{c3d,,Mock}으로, 또는 지정되면 `new_callable'로 전달됩니다.

@code{patch.dict(...)}, @code{patch.multiple(...)} 및 @code{patch.object(...)}는 대체 사용 사례에 사용할 수 있습니다.
@end deffn

@ref{1091,,patch()}를 함수 데코레이터로 사용하여, 모의 객체를 만들고 데코레이트 된 함수에 전달합니다:

@example
>>> @@patch('__main__.SomeClass')
... def function(normal_argument, mock_class):
...     print(mock_class is SomeClass)
...
>>> function(None)
True
@end example

클래스를 패치하면 클래스를 @ref{108e,,MagicMock} `인스턴스'로 치환합니다. 테스트 대상 코드에서 클래스가 인스턴스 화 되면 사용될 모의 객체의 @ref{4672,,return_value}가 됩니다.

클래스가 여러 번 인스턴스 화 되면 @ref{466a,,side_effect}를 사용하여 매번 새 모의 객체를 반환할 수 있습니다. 또는 `return_value'를 원하는 것으로 설정할 수 있습니다.

패치된 클래스에서 `인스턴스'의 메서드에 대한 반환 값을 구성하려면 @ref{4672,,return_value}에서 이를 수행해야 합니다. 예를 들면:

@example
>>> class Class:
...     def method(self):
...         pass
...
>>> with patch('__main__.Class') as MockClass:
...     instance = MockClass.return_value
...     instance.method.return_value = 'foo'
...     assert Class() is instance
...     assert Class().method() == 'foo'
...
@end example

`spec'이나 `spec_set'을 사용하고 @ref{1091,,patch()}가 `클래스'를 대체하고 있다면, 만들어진 모의 객체의 반환 값은 같은 사양을 갖습니다.

@example
>>> Original = Class
>>> patcher = patch('__main__.Class', spec=True)
>>> MockClass = patcher.start()
>>> instance = MockClass()
>>> assert isinstance(instance, Original)
>>> patcher.stop()
@end example

`new_callable' 인자는 생성된 모의 객체의 기본 @ref{108e,,MagicMock}에 대한 대체 클래스를 사용하려고 할 때 유용합니다. 예를 들어, @ref{466f,,NonCallableMock}을 사용하려면:

@example
>>> thing = object()
>>> with patch('__main__.thing', new_callable=NonCallableMock) as mock_thing:
...     assert thing is mock_thing
...     thing()
...
Traceback (most recent call last):
  ...
TypeError: 'NonCallableMock' object is not callable
@end example

또 다른 사용 사례는 객체를 @ref{1128,,io.StringIO} 인스턴스로 교체하는 것입니다:

@example
>>> from io import StringIO
>>> def foo():
...     print('Something')
...
>>> @@patch('sys.stdout', new_callable=StringIO)
... def test(mock_stdout):
...     foo()
...     assert mock_stdout.getvalue() == 'Something\n'
...
>>> test()
@end example

@ref{1091,,patch()}가 여러분 대신 모의 객체를 만들 때, 보통 가장 먼저 해야 할 일은 모의 객체를 구성하는 것입니다. 이 구성 중 일부는 patch 호출에서 수행 할 수 있습니다. 호출에 전달하는 임의의 키워드는 만들어진 모의 객체의 어트리뷰트를 설정하는 데 사용됩니다:

@example
>>> patcher = patch('__main__.thing', first='one', second='two')
>>> mock_thing = patcher.start()
>>> mock_thing.first
'one'
>>> mock_thing.second
'two'
@end example

만들어진 모의 객체 어트리뷰트뿐만 아니라 자식 모의 객체의 @ref{4672,,return_value}와 @ref{466a,,side_effect}와 같은 어트리뷰트도 구성 할 수 있습니다. 키워드 인자로 직접 전달하는 것은 문법적으로 유효하지 않지만, 이것들을 키로 갖는 딕셔너리는 여전히 @code{**}를 사용하여 @ref{1091,,patch()} 호출로 확장될 수 있습니다:

@example
>>> config = @{'method.return_value': 3, 'other.side_effect': KeyError@}
>>> patcher = patch('__main__.thing', **config)
>>> mock_thing = patcher.start()
>>> mock_thing.method()
3
>>> mock_thing.other()
Traceback (most recent call last):
  ...
KeyError
@end example

기본적으로, 존재하지 않는 모듈의 함수(또는 클래스의 메서드나 어트리뷰트)를 패치하려고 시도하면 @ref{5ee,,AttributeError}로 실패합니다:

@example
>>> @@patch('sys.non_existing_attribute', 42)
... def test():
...     assert sys.non_existing_attribute == 42
...
>>> test()
Traceback (most recent call last):
  ...
AttributeError: <module 'sys' (built-in)> does not have the attribute 'non_existing_attribute'
@end example

그러나 @ref{1091,,patch()} 호출에 @code{create=True}를 추가하면 이전 예제가 기대한 대로 작동합니다:

@example
>>> @@patch('sys.non_existing_attribute', 42, create=True)
... def test(mock_stdout):
...     assert sys.non_existing_attribute == 42
...
>>> test()
@end example


버전 3.8에서 변경: @ref{1091,,patch()}는 이제 target이 비동기 함수면 @ref{c3e,,AsyncMock}을 반환합니다.


@node patch object,patch dict,patch,패처
@anchor{library/unittest mock patch-object}@anchor{4697}
@subsubsection patch.object


@geindex patch.object() (unittest.mock 모듈)
@anchor{library/unittest mock unittest mock patch object}@anchor{1907}
@deffn {함수} patch.object (target, attribute, new=DEFAULT, spec=None, create=False, spec_set=None, autospec=None, new_callable=None, **kwargs)

모의 객체로 객체(`target')의 이름 있는 멤버(`attribute')를 패치합니다.

@ref{1907,,patch.object()}는 데코레이터, 클래스 데코레이터 또는 컨텍스트 관리자로 사용할 수 있습니다. 인자 `new', `spec', `create', `spec_set', `autospec' 및 `new_callable'은 @ref{1091,,patch()}와 같은 의미입니다. @code{patch()}와 마찬가지로, @code{patch.object()}는 만드는 모의 객체를 구성하기 위해 임의의 키워드 인자를 취합니다.

클래스 데코레이터로 사용될 때, @ref{1907,,patch.object()}는 감쌀 메서드를 선택하는 데 @code{patch.TEST_PREFIX}를 사용합니다.
@end deffn

세 개의 인자나 두 개의 인자로 @ref{1907,,patch.object()}를 호출 할 수 있습니다. 세 개의 인자 형식은 패치 할 객체, 어트리뷰트 이름 및 어트리뷰트를 대체 할 객체를 취합니다.

두 개의 인자 형식으로 호출하면 대체 객체를 생략하고, 모의 객체가 만들어져 데코레이트 된 함수에 대한 추가 인자로 전달됩니다:

@example
>>> @@patch.object(SomeClass, 'class_method')
... def test(mock_method):
...     SomeClass.class_method(3)
...     mock_method.assert_called_with(3)
...
>>> test()
@end example

`spec', `create' 및 @ref{1907,,patch.object()}에 대한 다른 인자는 @ref{1091,,patch()}와 같은 의미입니다.

@node patch dict,patch multiple,patch object,패처
@anchor{library/unittest mock patch-dict}@anchor{4698}
@subsubsection patch.dict


@geindex patch.dict() (unittest.mock 모듈)
@anchor{library/unittest mock unittest mock patch dict}@anchor{1968}
@deffn {함수} patch.dict (in_dict, values=(), clear=False, **kwargs)

Patch a dictionary, or dictionary like object, and restore the dictionary
to its original state after the test, where the restored dictionary is a
copy of the dictionary as it was before the test.

`in_dict'는 딕셔너리나 컨테이너와 같은 매핑일 수 있습니다. 매핑이면 적어도 가져오기(get), 설정(set) 및 삭제(delete)와 키 이터레이션을 지원해야 합니다.

`in_dict'는 딕셔너리 이름을 지정하는 문자열일 수도 있으며, 이때는 임포트 해서 가져옵니다.

`values'는 딕셔너리에 설정할 값의 딕셔너리일 수 있습니다. `values'는 @code{(key, value)} 쌍의 이터러블일 수도 있습니다.

`clear'가 참이면 새 값이 설정되기 전에 딕셔너리가 지워집니다.

딕셔너리에 값을 설정하기 위해 임의의 키워드 인자로 @ref{1968,,patch.dict()}를 호출할 수도 있습니다.


버전 3.8에서 변경: @ref{1968,,patch.dict()}는 이제 컨텍스트 관리자로 사용될 때 패치된 딕셔너리를 반환합니다.

@end deffn

@ref{1968,,patch.dict()}는 컨텍스트 관리자, 데코레이터 또는 클래스 데코레이터로 사용할 수 있습니다:

@example
>>> foo = @{@}
>>> @@patch.dict(foo, @{'newkey': 'newvalue'@})
... def test():
...     assert foo == @{'newkey': 'newvalue'@}
...
>>> test()
>>> assert foo == @{@}
@end example

클래스 데코레이터로 사용될 때 @ref{1968,,patch.dict()}는 감쌀 메서드를 선택하는 데 @code{patch.TEST_PREFIX}(기본값은 @code{'test'})를 따릅니다:

@example
>>> import os
>>> import unittest
>>> from unittest.mock import patch
>>> @@patch.dict('os.environ', @{'newkey': 'newvalue'@})
... class TestSample(unittest.TestCase):
...     def test_sample(self):
...         self.assertEqual(os.environ['newkey'], 'newvalue')
@end example

테스트에 다른 접두사를 사용하려면, @code{patch.TEST_PREFIX}를 설정하여 패처에 다른 접두사를 알릴 수 있습니다. 값을 변경하는 방법에 대한 자세한 내용은 @ref{4699,,TEST_PREFIX}를 참조하십시오.

@ref{1968,,patch.dict()}를 사용하여 멤버를 딕셔너리에 추가하고 (또는 단순히 테스트에서 딕셔너리를 변경하고) 테스트가 끝나면 딕셔너리가 복원되도록 할 수 있습니다.

@example
>>> foo = @{@}
>>> with patch.dict(foo, @{'newkey': 'newvalue'@}) as patched_foo:
...     assert foo == @{'newkey': 'newvalue'@}
...     assert patched_foo == @{'newkey': 'newvalue'@}
...     # You can add, update or delete keys of foo (or patched_foo, it's the same dict)
...     patched_foo['spam'] = 'eggs'
...
>>> assert foo == @{@}
>>> assert patched_foo == @{@}
@end example

@example
>>> import os
>>> with patch.dict('os.environ', @{'newkey': 'newvalue'@}):
...     print(os.environ['newkey'])
...
newvalue
>>> assert 'newkey' not in os.environ
@end example

@ref{1968,,patch.dict()} 호출에서 키워드를 사용하여 딕셔너리에 값을 설정할 수 있습니다:

@example
>>> mymodule = MagicMock()
>>> mymodule.function.return_value = 'fish'
>>> with patch.dict('sys.modules', mymodule=mymodule):
...     import mymodule
...     mymodule.function('some', 'args')
...
'fish'
@end example

@ref{1968,,patch.dict()}는 실제로 딕셔너리가 아닌 딕셔너리류 객체와 함께 사용할 수 있습니다. 최소한 아이템 가져오기, 설정하기, 삭제하기 및 이터레이션이나 멤버십 검사를 지원해야 합니다. 이것은 매직 메서드 @ref{588,,__getitem__()}, @ref{14d0,,__setitem__()}, @ref{14d1,,__delitem__()} 및 @ref{20a8,,__iter__()}나 @ref{15be,,__contains__()}에 해당합니다.

@example
>>> class Container:
...     def __init__(self):
...         self.values = @{@}
...     def __getitem__(self, name):
...         return self.values[name]
...     def __setitem__(self, name, value):
...         self.values[name] = value
...     def __delitem__(self, name):
...         del self.values[name]
...     def __iter__(self):
...         return iter(self.values)
...
>>> thing = Container()
>>> thing['one'] = 1
>>> with patch.dict(thing, one=2, two=3):
...     assert thing['one'] == 2
...     assert thing['two'] == 3
...
>>> assert thing['one'] == 1
>>> assert list(thing) == ['one']
@end example

@node patch multiple,패처 메서드 start와 stop,patch dict,패처
@anchor{library/unittest mock patch-multiple}@anchor{469a}
@subsubsection patch.multiple


@geindex patch.multiple() (unittest.mock 모듈)
@anchor{library/unittest mock unittest mock patch multiple}@anchor{469b}
@deffn {함수} patch.multiple (target, spec=None, create=False, spec_set=None, autospec=None, new_callable=None, **kwargs)

한 번의 호출로 여러 패치를 수행합니다. 패치할 객체(객체나 임포트로 객체를 가져올 문자열로)와 패치에 대한 키워드 인자를 취합니다:

@example
with patch.multiple(settings, FIRST_PATCH='one', SECOND_PATCH='two'):
    ...
@end example

@ref{469b,,patch.multiple()}가 모의 객체를 만들기를 원하면 @ref{4671,,DEFAULT}를 값으로 사용하십시오. 이 경우 만들어진 모의 객체는 키워드로 데코레이트 된 함수로 전달되며, @code{patch.multiple()}이 컨텍스트 관리자로 사용될 때는 딕셔너리가 반환됩니다.

@ref{469b,,patch.multiple()}은 데코레이터, 클래스 데코레이터 또는 컨텍스트 관리자로 사용할 수 있습니다. `spec', `spec_set', `create', `autospec' 및 `new_callable' 인자는 @ref{1091,,patch()}와 같은 의미입니다. 이 인자는 @code{patch.multiple()}이 수행한 `모든' 패치에 적용됩니다.

클래스 데코레이터로 사용될 때 @ref{469b,,patch.multiple()}은 감쌀 메서드를 선택하는 데 @code{patch.TEST_PREFIX}를 사용합니다.
@end deffn

@ref{469b,,patch.multiple()}가 모의 객체를 만들기를 원하면 @ref{4671,,DEFAULT}를 값으로 사용할 수 있습니다. @code{patch.multiple()}을 데코레이터로 사용하면 만들어진 모의 객체가 키워드로 데코레이트 된 함수에 전달됩니다.

@example
>>> thing = object()
>>> other = object()

>>> @@patch.multiple('__main__', thing=DEFAULT, other=DEFAULT)
... def test_function(thing, other):
...     assert isinstance(thing, MagicMock)
...     assert isinstance(other, MagicMock)
...
>>> test_function()
@end example

@ref{469b,,patch.multiple()}은 다른 @code{patch} 데코레이터와 중첩될 수 있지만, 키워드로 전달된 인자를 @ref{1091,,patch()}가 만든 모든 표준 인자들 `뒤'에 넣습니다:

@example
>>> @@patch('sys.exit')
... @@patch.multiple('__main__', thing=DEFAULT, other=DEFAULT)
... def test_function(mock_exit, other, thing):
...     assert 'other' in repr(other)
...     assert 'thing' in repr(thing)
...     assert 'exit' in repr(mock_exit)
...
>>> test_function()
@end example

@ref{469b,,patch.multiple()}가 컨텍스트 관리자로 사용되면, 컨텍스트 관리자가 반환한 값은 만들어진 모의 객체 이름을 키로 갖는 딕셔너리입니다:

@example
>>> with patch.multiple('__main__', thing=DEFAULT, other=DEFAULT) as values:
...     assert 'other' in repr(values['other'])
...     assert 'thing' in repr(values['thing'])
...     assert values['thing'] is thing
...     assert values['other'] is other
...
@end example

@node 패처 메서드 start와 stop,내장 패치,patch multiple,패처
@anchor{library/unittest mock patch-methods-start-and-stop}@anchor{469c}@anchor{library/unittest mock start-and-stop}@anchor{469d}
@subsubsection 패처 메서드: start와 stop


모든 패처에는 @code{start()}와 @code{stop()} 메서드가 있습니다. 이를 통해 @code{setUp} 메서드나 데코레이터를 중첩하거나 with 문을 사용하지 않고 여러 패치를 수행하려는 곳에서 패치를 수행하는 것이 더 간단해집니다.

이것들을 사용하려면 @ref{1091,,patch()}, @ref{1907,,patch.object()} 또는 @ref{1968,,patch.dict()}를 정상적으로 호출하고 반환된 @code{patcher} 객체에 대한 참조를 유지하십시오. 그런 다음 @code{start()}를 호출하여 패치를 제자리에 놓고 @code{stop()}을 사용하여 패치를 취소할 수 있습니다.

@ref{1091,,patch()}를 사용하여 모의 객체를 만들면 @code{patcher.start} 호출로 반환됩니다.

@example
>>> patcher = patch('package.module.ClassName')
>>> from package import module
>>> original = module.ClassName
>>> new_mock = patcher.start()
>>> assert module.ClassName is not original
>>> assert module.ClassName is new_mock
>>> patcher.stop()
>>> assert module.ClassName is original
>>> assert module.ClassName is not new_mock
@end example

일반적인 사용 사례는 @ref{2b3,,TestCase}의 @code{setUp} 메서드에서 여러 패치를 수행하는 것입니다:

@example
>>> class MyTest(unittest.TestCase):
...     def setUp(self):
...         self.patcher1 = patch('package.module.Class1')
...         self.patcher2 = patch('package.module.Class2')
...         self.MockClass1 = self.patcher1.start()
...         self.MockClass2 = self.patcher2.start()
...
...     def tearDown(self):
...         self.patcher1.stop()
...         self.patcher2.stop()
...
...     def test_something(self):
...         assert package.module.Class1 is self.MockClass1
...         assert package.module.Class2 is self.MockClass2
...
>>> MyTest('test_something').run()
@end example

@cartouche
@quotation 조심 
이 기법을 사용하는 경우 @code{stop}을 호출하여 패치가 “실행 취소” 되도록 해야 합니다. @code{setUp}에서 예외가 발생하면 @code{tearDown}이 호출되지 않기 때문에, 이것은 생각보다 까다로울 수 있습니다. @ref{c73,,unittest.TestCase.addCleanup()}은 이것을 더 쉽게 만듭니다:

@example
>>> class MyTest(unittest.TestCase):
...     def setUp(self):
...         patcher = patch('package.module.Class')
...         self.MockClass = patcher.start()
...         self.addCleanup(patcher.stop)
...
...     def test_something(self):
...         assert package.module.Class is self.MockClass
...
@end example

추가 보너스로 더는 @code{patcher} 객체에 대한 참조를 유지할 필요가 없습니다.
@end quotation
@end cartouche

@ref{469e,,patch.stopall()}을 사용하여 시작된 모든 패치를 중지할 수도 있습니다.

@geindex patch.stopall() (unittest.mock 모듈)
@anchor{library/unittest mock unittest mock patch stopall}@anchor{469e}
@deffn {함수} patch.stopall ()

모든 활성 패치를 중지합니다. @code{start}로 시작한 패치만 중지합니다.
@end deffn

@node 내장 패치,TEST_PREFIX,패처 메서드 start와 stop,패처
@anchor{library/unittest mock id4}@anchor{469f}@anchor{library/unittest mock patch-builtins}@anchor{46a0}
@subsubsection 내장 패치


모듈 내의 어떤 내장(builtins)도 패치 할 수 있습니다. 다음 예제는 내장 @ref{2338,,ord()}를 패치합니다:

@example
>>> @@patch('__main__.ord')
... def test(mock_ord):
...     mock_ord.return_value = 101
...     print(ord('c'))
...
>>> test()
101
@end example

@node TEST_PREFIX,패치 데코레이터 중첩하기,내장 패치,패처
@anchor{library/unittest mock id5}@anchor{46a1}@anchor{library/unittest mock test-prefix}@anchor{4699}
@subsubsection TEST_PREFIX


모든 패처를 클래스 데코레이터로 사용할 수 있습니다. 이런 식으로 사용하면 클래스의 모든 테스트 메서드를 감쌉니다. 패처는 @code{'test'}로 시작하는 메서드를 테스트 메서드로 인식합니다. 이것은 @ref{592,,unittest.TestLoader}가 기본적으로 테스트 메서드를 찾는 것과 같은 방법입니다.

테스트에 다른 접두사를 사용하고 싶을 수도 있습니다. @code{patch.TEST_PREFIX}를 설정하여 다른 접두사를 패처에 알릴 수 있습니다:

@example
>>> patch.TEST_PREFIX = 'foo'
>>> value = 3
>>>
>>> @@patch('__main__.value', 'not three')
... class Thing:
...     def foo_one(self):
...         print(value)
...     def foo_two(self):
...         print(value)
...
>>>
>>> Thing().foo_one()
not three
>>> Thing().foo_two()
not three
>>> value
3
@end example

@node 패치 데코레이터 중첩하기,패치할 곳,TEST_PREFIX,패처
@anchor{library/unittest mock nesting-patch-decorators}@anchor{46a2}
@subsubsection 패치 데코레이터 중첩하기


여러 패치를 수행하려면 단순히 데코레이터를 쌓으면 됩니다.

이 패턴을 사용하여 여러 패치 데코레이터를 쌓을 수 있습니다:

@example
>>> @@patch.object(SomeClass, 'class_method')
... @@patch.object(SomeClass, 'static_method')
... def test(mock1, mock2):
...     assert SomeClass.static_method is mock1
...     assert SomeClass.class_method is mock2
...     SomeClass.static_method('foo')
...     SomeClass.class_method('bar')
...     return mock1, mock2
...
>>> mock1, mock2 = test()
>>> mock1.assert_called_once_with('foo')
>>> mock2.assert_called_once_with('bar')
@end example

데코레이터는 아래에서 위쪽으로 적용됨에 유의하십시오. 이것은 파이썬이 데코레이터를 적용하는 표준 방식입니다. 생성된 모의 객체가 테스트 함수에 전달되는 순서는 이 순서와 일치합니다.

@node 패치할 곳,디스크립터와 프락시 객체 패치하기,패치 데코레이터 중첩하기,패처
@anchor{library/unittest mock id6}@anchor{4696}@anchor{library/unittest mock where-to-patch}@anchor{466b}
@subsubsection 패치할 곳


@ref{1091,,patch()}는 `name'이 가리키는 객체를 다른 객체로 (임시로) 변경하여 작동합니다. 개별 객체를 가리키는 많은 이름이 있을 수 있어서, 패치가 작동하려면 테스트 대상 시스템에서 사용하는 이름을 패치해야 합니다.

기본 원칙은 객체가 `조회되는' 곳을 패치하는 것입니다. 이것은 정의된 곳과 반드시 같은 곳일 필요는 없습니다. 몇 가지 예가 이를 명확히 하는 데 도움이 됩니다.

테스트하려는 프로젝트가 다음 구조로 되어 있다고 가정하십시오:

@example
a.py
    -> SomeClass를 정의합니다

b.py
    -> from a import SomeClass
    -> some_function이 SomeClass의 인스턴스를 만듭니다
@end example

이제 @code{some_function}을 테스트하고 싶지만, @ref{1091,,patch()}를 사용하여 @code{SomeClass}를 모킹하고 싶습니다. 문제는 모듈 b를 임포트 할 때, 모듈 a에서 @code{SomeClass}를 임포트해야 한다는 것입니다. @code{patch()}를 사용하여 @code{a.SomeClass}를 모킹하면 테스트에 영향을 미치지 않습니다; 모듈 b는 이미 `실제' @code{SomeClass}에 대한 참조를 가지고 있으며 패치가 효과가 없는 것처럼 보입니다.

핵심은 @code{SomeClass}가 사용되는 곳(또는 그것을 조회하는 곳)을 패치하는 것입니다. 이 경우 @code{some_function}은 우리가 임포트 한 모듈 b에서 @code{SomeClass}를 조회합니다. 패치는 다음과 같아야 합니다:

@example
@@patch('b.SomeClass')
@end example

하지만, @code{from a import SomeClass} 대신 모듈 b가 @code{import a}를 수행하고 @code{some_function}이 @code{a.SomeClass}를 사용하는 대체 시나리오를 생각해보십시오. 이 두 가지 임포트 형식은 모두 일반적입니다. 이 경우 패치하려는 클래스가 모듈에서 조회되므로 대신 @code{a.SomeClass}를 패치해야 합니다:

@example
@@patch('a.SomeClass')
@end example

@node 디스크립터와 프락시 객체 패치하기,,패치할 곳,패처
@anchor{library/unittest mock patching-descriptors-and-proxy-objects}@anchor{46a3}
@subsubsection 디스크립터와 프락시 객체 패치하기


@ref{4695,,patch} 와 @ref{4697,,patch.object} 모두 디스크립터를 올바르게 패치하고 복원합니다: 클래스 메서드, 정적 메서드 및 프로퍼티. 이것들을 인스턴스가 아닌 `클래스'에서 패치해야 합니다. 이들은 또한 장고 settings 객체@footnote{https://web.archive.org/web/20200603181648/http://www.voidspace.org.uk/python/weblog/arch_d7_2010_12_04.shtml#e1198}와 같이 어트리뷰트 액세스를 프락시 하는 `일부' 객체에서도 작동합니다.

@node MagicMock과 매직 메서드 지원,도우미,패처,unittest mock — 모의 객체 라이브러리
@anchor{library/unittest mock magicmock-and-magic-method-support}@anchor{46a4}
@subsubsection MagicMock과 매직 메서드 지원


@menu
* 매직 메서드 모킹하기:: 
* 매직 모의 객체:: 

@end menu

@node 매직 메서드 모킹하기,매직 모의 객체,,MagicMock과 매직 메서드 지원
@anchor{library/unittest mock magic-methods}@anchor{466c}@anchor{library/unittest mock mocking-magic-methods}@anchor{46a5}
@subsubsection 매직 메서드 모킹하기


@ref{c3d,,Mock}은 @ref{46a6,,“매직 메서드”}라고도 하는 파이썬 프로토콜 메서드 모킹을 지원합니다. 이를 통해 모의 객체가 컨테이너나 파이썬 프로토콜을 구현하는 다른 객체를 대체할 수 있습니다.

매직 메서드는 일반 메서드와는 다르게 조회되므로 @footnote{
매직 메서드는 인스턴스가 아닌 클래스에서 조회되어야 합니다. 다른 버전의 파이썬은 이 규칙을 적용하는 데 일관적이지 않습니다. 지원되는 프로토콜 메서드는 지원되는 모든 버전의 파이썬에서 작동해야 합니다.
}, 이 지원은 특별히 구현되었습니다. 즉, 특정 매직 메서드만 지원됩니다. 지원되는 목록에 이들이 `거의' 모두 포함됩니다. 누락된 것이 있으면 알려주십시오.

관심 있는 메서드를 함수나 모의 객체 인스턴스로 설정하여 매직 메서드를 모킹합니다. 함수를 사용하면 `반드시' @code{self}를 첫 번째 인자로 취해야 합니다 @footnote{
이 함수는 기본적으로 클래스에 연결되어 있지만, 각 @code{Mock} 인스턴스는 다른 것들과 격리되어 있습니다.
}.

@example
>>> def __str__(self):
...     return 'fooble'
...
>>> mock = Mock()
>>> mock.__str__ = __str__
>>> str(mock)
'fooble'
@end example

@example
>>> mock = Mock()
>>> mock.__str__ = Mock()
>>> mock.__str__.return_value = 'fooble'
>>> str(mock)
'fooble'
@end example

@example
>>> mock = Mock()
>>> mock.__iter__ = Mock(return_value=iter([]))
>>> list(mock)
[]
@end example

이것의 한 가지 사용 사례는 @ref{186,,with} 문에서 컨텍스트 관리자로 사용되는 객체를 모킹하는 것입니다:

@example
>>> mock = Mock()
>>> mock.__enter__ = Mock(return_value='foo')
>>> mock.__exit__ = Mock(return_value=False)
>>> with mock as m:
...     assert m == 'foo'
...
>>> mock.__enter__.assert_called_with()
>>> mock.__exit__.assert_called_with(None, None, None)
@end example

매직 메서드 호출은 @ref{4678,,method_calls}에는 나타나지 않지만, @ref{4676,,mock_calls}에 기록됩니다.

@cartouche
@quotation 참고 
`spec' 키워드 인자를 사용하여 모의 객체를 만들면 spec에 없는 매직 메서드를 설정하려고 시도할 때 @ref{5ee,,AttributeError}가 발생합니다.
@end quotation
@end cartouche

지원되는 매직 메서드의 전체 목록은 다음과 같습니다:


@itemize *

@item 
@code{__hash__}, @code{__sizeof__}, @code{__repr__} 및 @code{__str__}

@item 
@code{__dir__}, @code{__format__} 및 @code{__subclasses__}

@item 
@code{__round__}, @code{__floor__}, @code{__trunc__} 및 @code{__ceil__}

@item 
비교: @code{__lt__}, @code{__gt__}, @code{__le__}, @code{__ge__}, @code{__eq__} 및 @code{__ne__}

@item 
컨테이너 메서드: @code{__getitem__}, @code{__setitem__}, @code{__delitem__}, @code{__contains__}, @code{__len__}, @code{__iter__}, @code{__reversed__} 및 @code{__missing__}

@item 
컨텍스트 관리자: @code{__enter__}, @code{__exit__}, @code{__aenter__} 및 @code{__aexit__}

@item 
단항 숫자 메서드: @code{__neg__}, @code{__pos__} 및 @code{__invert__}

@item 
숫자 메서드 (뒤집히거나 제자리 변형 포함) : @code{__add__}, @code{__sub__}, @code{__mul__}, @code{__matmul__}, @code{__truediv__}, @code{__floordiv__}, @code{__mod__}, @code{__divmod__}, @code{__lshift__}, @code{__rshift__}, @code{__and__}, @code{__xor__}, @code{__or__} 및 @code{__pow__}

@item 
숫자 변환 메서드: @code{__complex__}, @code{__int__}, @code{__float__} 및 @code{__index__}

@item 
디스크립터 메서드: @code{__get__}, @code{__set__} 및 @code{__delete__}

@item 
피클링: @code{__reduce__}, @code{__reduce_ex__}, @code{__getinitargs__}, @code{__getnewargs__}, @code{__getstate__} 및 @code{__setstate__}

@item 
파일 시스템 경로 표현: @code{__fspath__}

@item 
비동기 이터레이션 메서드: @code{__aiter__}와 @code{__anext__}
@end itemize


버전 3.8에서 변경: @ref{e4b,,os.PathLike.__fspath__()}에 대한 지원이 추가되었습니다.



버전 3.8에서 변경: @code{__aenter__}, @code{__aexit__}, @code{__aiter__} 및 @code{__anext__}에 대한 지원이 추가되었습니다.


다음과 같은 메서드가 존재하지만, 모의 객체가 사용 중이거나, 동적으로 설정할 수 없거나, 문제를 일으킬 수 있어서 지원되지 `않습니다':


@itemize *

@item 
@code{__getattr__}, @code{__setattr__}, @code{__init__} 및 @code{__new__}

@item 
@code{__prepare__}, @code{__instancecheck__}, @code{__subclasscheck__}, @code{__del__}
@end itemize

@node 매직 모의 객체,,매직 메서드 모킹하기,MagicMock과 매직 메서드 지원
@anchor{library/unittest mock magic-mock}@anchor{46a7}
@subsubsection 매직 모의 객체


두 가지 @code{MagicMock} 변형이 있습니다: @ref{108e,,MagicMock}과 @ref{4670,,NonCallableMagicMock}.

@geindex MagicMock (unittest.mock 클래스)
@anchor{library/unittest mock unittest mock MagicMock}@anchor{108e}
@deffn {클래스} unittest.mock.MagicMock (*args, **kw)

@code{MagicMock}은 대부분의 @ref{46a6,,매직 메서드}의 기본 구현이 있는 @ref{c3d,,Mock}의 서브 클래스입니다. 매직 메서드를 직접 구성하지 않고도 @code{MagicMock}을 사용할 수 있습니다.

생성자 매개 변수는 @ref{c3d,,Mock}과 같은 의미입니다.

`spec'이나 `spec_set' 인자를 사용하면 `오직' 사양에 존재하는 매직 메서드만 만들어집니다.
@end deffn

@geindex NonCallableMagicMock (unittest.mock 클래스)
@anchor{library/unittest mock unittest mock NonCallableMagicMock}@anchor{4670}
@deffn {클래스} unittest.mock.NonCallableMagicMock (*args, **kw)

콜러블이 아닌 @ref{108e,,MagicMock} 버전.

생성자 매개 변수는 콜러블이 아닌 모의 객체에 의미가 없는 `return_value'와 `side_effect'를 제외하고 @ref{108e,,MagicMock}과 같은 의미입니다.
@end deffn

매직 메서드는 @ref{108e,,MagicMock} 객체로 설정되므로, 일반적인 방법으로 구성하고 사용할 수 있습니다:

@example
>>> mock = MagicMock()
>>> mock[3] = 'fish'
>>> mock.__setitem__.assert_called_with(3, 'fish')
>>> mock.__getitem__.return_value = 'result'
>>> mock[2]
'result'
@end example

기본적으로 많은 프로토콜 메서드는 특정 형의 객체를 반환하도록 요구합니다. 이러한 메서드는 기본 반환 값으로 사전 구성되어 있어서, 반환 값에 관심이 없을 때 아무 조처를 하지 않아도 사용할 수 있습니다. 기본값을 변경하고 싶으면, 여전히 반환 값을 수동으로 `설정'할 수 있습니다.

메서드와 기본값:


@itemize *

@item 
@code{__lt__}: @ref{1a2,,NotImplemented}

@item 
@code{__gt__}: @code{NotImplemented}

@item 
@code{__le__}: @code{NotImplemented}

@item 
@code{__ge__}: @code{NotImplemented}

@item 
@code{__int__}: @code{1}

@item 
@code{__contains__}: @code{False}

@item 
@code{__len__}: @code{0}

@item 
@code{__iter__}: @code{iter([])}

@item 
@code{__exit__}: @code{False}

@item 
@code{__aexit__}: @code{False}

@item 
@code{__complex__}: @code{1j}

@item 
@code{__float__}: @code{1.0}

@item 
@code{__bool__}: @code{True}

@item 
@code{__index__}: @code{1}

@item 
@code{__hash__}: 모의 객체의 기본 hash

@item 
@code{__str__}: 모의 객체의 기본 str

@item 
@code{__sizeof__}: 모의 객체의 기본 sizeof
@end itemize

예를 들면:

@example
>>> mock = MagicMock()
>>> int(mock)
1
>>> len(mock)
0
>>> list(mock)
[]
>>> object() in mock
False
@end example

두 동등 비교 메서드 @code{__eq__()}와 @code{__ne__()}는 특별합니다. 이들의 반환 값을 변경하여 다른 것을 반환하지 않는 한, @ref{466a,,side_effect} 어트리뷰트를 사용하여 아이덴티티에 대한 기본 동등 비교를 수행합니다:

@example
>>> MagicMock() == 3
False
>>> MagicMock() != 3
True
>>> mock = MagicMock()
>>> mock.__eq__.return_value = True
>>> mock == 3
True
@end example

@code{MagicMock.__iter__()}의 반환 값은 임의의 이터러블 객체일 수 있으며 이터레이터일 필요는 없습니다:

@example
>>> mock = MagicMock()
>>> mock.__iter__.return_value = ['a', 'b', 'c']
>>> list(mock)
['a', 'b', 'c']
>>> list(mock)
['a', 'b', 'c']
@end example

반환 값이 이터레이터면, 일단 이터레이트 하면 이를 소진하고 후속 이터레이션은 빈 목록을 줍니다:

@example
>>> mock.__iter__.return_value = iter(['a', 'b', 'c'])
>>> list(mock)
['a', 'b', 'c']
>>> list(mock)
[]
@end example

@code{MagicMock}에는 불분명하고 쓸모없는 일부를 제외하고 지원되는 모든 매직 메서드가 구성되어 있습니다. 원한다면 여전히 설정할 수 있습니다.

@code{MagicMock}에서 지원되지만, 기본적으로 설정되지 않는 매직 메서드는 다음과 같습니다:


@itemize *

@item 
@code{__subclasses__}

@item 
@code{__dir__}

@item 
@code{__format__}

@item 
@code{__get__}, @code{__set__} 및 @code{__delete__}

@item 
@code{__reversed__}와 @code{__missing__}

@item 
@code{__reduce__}, @code{__reduce_ex__}, @code{__getinitargs__}, @code{__getnewargs__}, @code{__getstate__} 및 @code{__setstate__}

@item 
@code{__getformat__}
@end itemize

@node 도우미,Order of precedence of side_effect return_value and wraps,MagicMock과 매직 메서드 지원,unittest mock — 모의 객체 라이브러리
@anchor{library/unittest mock helpers}@anchor{46a8}
@subsubsection 도우미


@menu
* sentinel:: 
* DEFAULT:: 
* call:: 
* create_autospec:: 
* ANY:: 
* FILTER_DIR:: 
* mock_open:: 
* 자동 사양:: 
* 실링 모의 객체 봉인하기:: 

@end menu

@node sentinel,DEFAULT,,도우미
@anchor{library/unittest mock sentinel}@anchor{46a9}
@subsubsection sentinel


@geindex sentinel (unittest.mock 모듈)
@anchor{library/unittest mock unittest mock sentinel}@anchor{d98}
@deffn {데이터} unittest.mock.sentinel

@code{sentinel} 객체는 테스트에 고유한(unique) 객체를 제공하는 편리한 방법을 제공합니다.

어트리뷰트는 이름으로 어트리뷰트에 액세스할 때 요청에 따라 만들어집니다. 같은 어트리뷰트에 액세스하면 항상 같은 객체가 반환됩니다. 반환된 객체는 테스트 실패 메시지를 읽을 수 있도록 적절한 repr을 갖습니다.


버전 3.7에서 변경: @code{sentinel} 어트리뷰트는 이제 @ref{29,,복사}되거나 @ref{ab,,피클}될 때 아이덴티티를 유지합니다.

@end deffn

때로 테스트할 때 특정 객체가 다른 메서드에 대한 인자로 전달되거나 반환되는지 테스트해야 할 때가 있습니다. 이것을 테스트하기 위해 이름 붙은 sentinel 객체를 만드는 것이 일반적일 수 있습니다. @ref{d98,,sentinel}은 이와 같은 객체의 아이덴티티를 만들고 테스트하는 편리한 방법을 제공합니다.

이 예에서는 @code{method}를 @code{sentinel.some_object}를 반환하도록 몽키 패치합니다:

@example
>>> real = ProductionClass()
>>> real.method = Mock(name="method")
>>> real.method.return_value = sentinel.some_object
>>> result = real.method()
>>> assert result is sentinel.some_object
>>> result
sentinel.some_object
@end example

@node DEFAULT,call,sentinel,도우미
@anchor{library/unittest mock default}@anchor{46aa}
@subsubsection DEFAULT


@geindex DEFAULT (unittest.mock 모듈)
@anchor{library/unittest mock unittest mock DEFAULT}@anchor{4671}
@deffn {데이터} unittest.mock.DEFAULT

@ref{4671,,DEFAULT} 객체는 미리 만들어진 sentinel(실제로 @code{sentinel.DEFAULT})입니다. @ref{466a,,side_effect} 함수에서 일반 반환 값을 사용해야 함을 나타내는 데 사용할 수 있습니다.
@end deffn

@node call,create_autospec,DEFAULT,도우미
@anchor{library/unittest mock call}@anchor{46ab}
@subsubsection call


@geindex call() (unittest.mock 모듈)
@anchor{library/unittest mock unittest mock call}@anchor{1db0}
@deffn {함수} unittest.mock.call (*args, **kwargs)

@ref{1db0,,call()}은 @ref{1d66,,call_args}, @ref{467d,,call_args_list}, @ref{4676,,mock_calls} 및 @ref{4678,,method_calls}와 비교할 때, 더 간단한 어서션을 만들기 위한 도우미 객체입니다. @code{call()}은 @ref{1a22,,assert_has_calls()}와 함께 사용할 수도 있습니다.

@example
>>> m = MagicMock(return_value=None)
>>> m(1, 2, a='foo', b='bar')
>>> m()
>>> m.call_args_list == [call(1, 2, a='foo', b='bar'), call()]
True
@end example
@end deffn

@geindex call_list() (unittest.mock.call 메서드)
@anchor{library/unittest mock unittest mock call call_list}@anchor{46ac}
@deffn {메서드} call.call_list ()

여러 호출을 나타내는 호출 객체의 경우, @ref{46ac,,call_list()}는 마지막 호출뿐만 아니라 모든 중간 호출의 목록을 반환합니다.
@end deffn

@code{call_list}는 “연쇄 호출(chained calls)”에 대한 어서션을 만드는 데 특히 유용합니다. 연쇄 호출은 한 줄의 코드에 있는 여러 번의 호출입니다. 이로 인해 모의 객체의 @ref{4676,,mock_calls}에 여러 항목이 생성됩니다. 호출 시퀀스를 수동으로 구성하는 것은 지루할 수 있습니다.

@ref{46ac,,call_list()}는 같은 연쇄 호출에서 호출 시퀀스를 구성 할 수 있습니다.:

@example
>>> m = MagicMock()
>>> m(1).method(arg='foo').other('bar')(2.0)
<MagicMock name='mock().method().other()()' id='...'>
>>> kall = call(1).method(arg='foo').other('bar')(2.0)
>>> kall.call_list()
[call(1),
 call().method(arg='foo'),
 call().method().other('bar'),
 call().method().other()(2.0)]
>>> m.mock_calls == kall.call_list()
True
@end example
@anchor{library/unittest mock calls-as-tuples}@anchor{467e}
@code{call} 객체는 구성 방식에 따라 (위치 인자, 키워드 인자)나 (이름, 위치 인자, 키워드 인자)의 튜플입니다. 이것들을 직접 만들 때 특별히 흥미롭지는 않지만, @ref{1d66,,Mock.call_args}, @ref{467d,,Mock.call_args_list} 및 @ref{4676,,Mock.mock_calls} 어트리뷰트에 있는 @code{call} 객체는 포함된 개별 인자를 얻기 위해 검사될 수 있습니다.

@ref{1d66,,Mock.call_args}와 @ref{467d,,Mock.call_args_list}에 있는 @code{call} 객체는 (위치 인자, 키워드 인자)의 2-튜플이지만, @ref{4676,,Mock.mock_calls}에 있는 @code{call} 객체는, 여러분이 직접 생성하는 객체와 함께, (이름, 위치 인자, 키워드 인자)의 3-튜플입니다.

이들의 “튜플성(tupleness)”을 사용하여 더 복잡한 검사와 어서션을 위해 개별 인자를 가져올 수 있습니다. 위치 인자는 튜플(위치 인자가 없으면 비어있는 튜플)이고 키워드 인자는 딕셔너리입니다:

@example
>>> m = MagicMock(return_value=None)
>>> m(1, 2, 3, arg='one', arg2='two')
>>> kall = m.call_args
>>> kall.args
(1, 2, 3)
>>> kall.kwargs
@{'arg': 'one', 'arg2': 'two'@}
>>> kall.args is kall[0]
True
>>> kall.kwargs is kall[1]
True
@end example

@example
>>> m = MagicMock()
>>> m.foo(4, 5, 6, arg='two', arg2='three')
<MagicMock name='mock.foo()' id='...'>
>>> kall = m.mock_calls[0]
>>> name, args, kwargs = kall
>>> name
'foo'
>>> args
(4, 5, 6)
>>> kwargs
@{'arg': 'two', 'arg2': 'three'@}
>>> name is m.mock_calls[0][0]
True
@end example

@node create_autospec,ANY,call,도우미
@anchor{library/unittest mock create-autospec}@anchor{46ad}
@subsubsection create_autospec


@geindex create_autospec() (unittest.mock 모듈)
@anchor{library/unittest mock unittest mock create_autospec}@anchor{1935}
@deffn {함수} unittest.mock.create_autospec (spec, spec_set=False, instance=False, **kwargs)

다른 객체를 사양으로 사용하여 모의 객체를 만듭니다. 모의 객체 어트리뷰트는 `spec' 객체의 해당 어트리뷰트를 사양으로 사용합니다.

모킹되는 함수나 메서드는 올바른 서명으로 호출되도록 인자를 점검합니다.

`spec_set'이 @code{True}이면 사양 객체에 존재하지 않는 어트리뷰트를 설정하려는 시도는 @ref{5ee,,AttributeError}를 발생시킵니다.

클래스가 사양으로 사용되면 모의 객체의 반환 값(클래스의 인스턴스)은 같은 사양을 갖습니다. @code{instance=True}를 전달하여 클래스를 인스턴스 객체의 사양으로 사용할 수 있습니다. 반환된 모의 객체는 모의 객체의 인스턴스가 콜러블일 때만 콜러블입니다.

@ref{1935,,create_autospec()}은 또한 만들어진 모의 객체의 생성자에 전달되는 임의의 키워드 인자를 취합니다.
@end deffn

@ref{1935,,create_autospec()}과 @ref{1091,,patch()}에 대한 `autospec' 인자로 자동 사양을 사용하는 방법에 대한 예는 @ref{466d,,자동 사양}을 참조하십시오.


버전 3.8에서 변경: 대상이 비동기 함수이면 @ref{1935,,create_autospec()}은 이제 @ref{c3e,,AsyncMock}을 반환합니다.


@node ANY,FILTER_DIR,create_autospec,도우미
@anchor{library/unittest mock any}@anchor{46ae}
@subsubsection ANY


@geindex ANY (unittest.mock 모듈)
@anchor{library/unittest mock unittest mock ANY}@anchor{1dae}
@deffn {데이터} unittest.mock.ANY
@end deffn

때로는 모의 객체 호출에서 인자의 `일부'에 대한 어서션을 만들 필요가 있지만, 일부 인자에는 신경 쓰지 않거나 @ref{1d66,,call_args}에서 개별적으로 꺼내어 더 복잡한 어서션을 만들고 싶을 수도 있습니다.

특정 인자를 무시하려면 `모든 것'과 같다고 비교되는 객체를 전달할 수 있습니다. @ref{1e00,,assert_called_with()}와 @ref{4674,,assert_called_once_with()}에 대한 호출은 전달된 내용과 관계없이 성공합니다.

@example
>>> mock = Mock(return_value=None)
>>> mock('foo', bar=object())
>>> mock.assert_called_once_with('foo', bar=ANY)
@end example

@ref{1dae,,ANY}는 @ref{4676,,mock_calls}와 같은 호출 리스트와 비교할 때도 사용할 수 있습니다.:

@example
>>> m = MagicMock(return_value=None)
>>> m(1)
>>> m(1, 2)
>>> m(object())
>>> m.mock_calls == [call(1), call(1, 2), ANY]
True
@end example

@ref{1dae,,ANY} is not limited to comparisons with call objects and so
can also be used in test assertions:

@example
class TestStringMethods(unittest.TestCase):

    def test_split(self):
        s = 'hello world'
        self.assertEqual(s.split(), ['hello', ANY])
@end example

@node FILTER_DIR,mock_open,ANY,도우미
@anchor{library/unittest mock filter-dir}@anchor{46af}
@subsubsection FILTER_DIR


@geindex FILTER_DIR (unittest.mock 모듈)
@anchor{library/unittest mock unittest mock FILTER_DIR}@anchor{467a}
@deffn {데이터} unittest.mock.FILTER_DIR
@end deffn

@ref{467a,,FILTER_DIR}은 모의 객체가 @ref{843,,dir()}에 응답하는 방식을 제어하는 모듈 수준 변수입니다. 기본값은 @code{True}이며, 아래 설명된 필터링을 사용하여 유용한 멤버만 표시합니다. 이 필터링이 마음에 들지 않거나 진단 목적으로 필터를 꺼야 하면, @code{mock.FILTER_DIR = False}를 설정하십시오.

필터링을 켜면, @code{dir(some_mock)}는 유용한 어트리뷰트만 표시하고 일반적으로 표시되지 않는 동적으로 만들어진 어트리뷰트를 포함합니다. `spec'(또는 물론 `autospec')으로 모의 객체를 만들었으면, 아직 액세스하지 않았다 할지라도 원본의 모든 어트리뷰트가 표시됩니다:

@example
>>> dir(Mock())
['assert_any_call',
 'assert_called',
 'assert_called_once',
 'assert_called_once_with',
 'assert_called_with',
 'assert_has_calls',
 'assert_not_called',
 'attach_mock',
 ...
>>> from urllib import request
>>> dir(Mock(spec=request))
['AbstractBasicAuthHandler',
 'AbstractDigestAuthHandler',
 'AbstractHTTPHandler',
 'BaseHandler',
 ...
@end example

@ref{c3d,,Mock}에 대해 @ref{843,,dir()}을 호출한 결과에서 그다지 유용하지 않은 (모킹되는 대상이 아닌 @code{Mock} 전용) 밑줄과 이중 밑줄 접두어 어트리뷰트가 필터링 되었습니다. 이 동작이 마음에 들지 않으면 모듈 수준 스위치 @ref{467a,,FILTER_DIR}를 설정하여 끌 수 있습니다.:

@example
>>> from unittest import mock
>>> mock.FILTER_DIR = False
>>> dir(mock.Mock())
['_NonCallableMock__get_return_value',
 '_NonCallableMock__get_side_effect',
 '_NonCallableMock__return_value_doc',
 '_NonCallableMock__set_return_value',
 '_NonCallableMock__set_side_effect',
 '__call__',
 '__class__',
 ...
@end example

또는 @code{vars(my_mock)}(인스턴스 멤버)과 @code{dir(type(my_mock))}(형 멤버)을 사용하여 @ref{467a,,FILTER_DIR}에 관계없이 필터링을 무시할 수 있습니다.

@node mock_open,자동 사양,FILTER_DIR,도우미
@anchor{library/unittest mock mock-open}@anchor{46b0}
@subsubsection mock_open


@geindex mock_open() (unittest.mock 모듈)
@anchor{library/unittest mock unittest mock mock_open}@anchor{11e6}
@deffn {함수} unittest.mock.mock_open (mock=None, read_data=None)

@ref{316,,open()}의 사용을 대체하기 위한 모의 객체를 만드는 도우미 함수. 직접 호출되거나 컨텍스트 관리자로 사용되는 @code{open()}에 대해 작동합니다.

`mock' 인자는 구성할 모의 객체입니다. @code{None}(기본값)이면 표준 파일 핸들에서 사용 가능한 메서드나 어트리뷰트로 API가 제한된 @ref{108e,,MagicMock}이 만들어집니다.

`read_data'는 파일 핸들의 @ref{101b,,read()}, @ref{152e,,readline()} 및 @ref{27c5,,readlines()} 메서드가 반환할 문자열입니다. 이러한 메서드를 호출하면 `read_data'에서 데이터가 고갈될 때까지 데이터를 가져옵니다. 이러한 메서드의 모의 객체는 매우 단순합니다: `mock'이 호출될 때마다 `read_data'는 처음으로 되감깁니다. 테스트 되는 코드에 공급하는 데이터를 더 세밀하게 제어하려면 이 모의 객체를 스스로 사용자 정의해야 합니다. 이것으로 불충분하면, PyPI@footnote{https://pypi.org}의 메모리 내 파일 시스템 패키지 중 하나가 테스트를 위한 진짜 같은 파일 시스템을 제공할 수 있습니다.


버전 3.4에서 변경: @ref{152e,,readline()}과 @ref{27c5,,readlines()} 지원이 추가되었습니다. @ref{101b,,read()}의 모의 객체는 호출마다 `read_data'를 반환하는 대신 소비하도록 변경되었습니다.



버전 3.5에서 변경: `read_data'는 이제 `mock'을 호출할 때마다 재설정됩니다.



버전 3.8에서 변경: 이터레이션(가령 for 루프)에서 `read_data'를 올바르게 소비하도록 구현에 @ref{20a8,,__iter__()}를 추가했습니다.

@end deffn

@ref{316,,open()}을 컨텍스트 관리자로 사용하는 것은 파일 핸들이 올바르게 닫히도록 보장하는 좋은 방법이고 점차 일반화되고 있습니다:

@example
with open('/some/path', 'w') as f:
    f.write('something')
@end example

문제는 @ref{316,,open()}에 대한 호출을 모킹하더라도 컨텍스트 관리자로 사용되는 것은 `반환된 객체'라는 것입니다 (그리고 @ref{7e3,,__enter__()}와 @ref{1505,,__exit__()}가 호출됩니다).

@ref{108e,,MagicMock}으로 컨텍스트 관리자를 모킹하는 것은 도우미 함수가 유용할 만큼 충분히 일반적입니다.

@example
>>> m = mock_open()
>>> with patch('__main__.open', m):
...     with open('foo', 'w') as h:
...         h.write('some stuff')
...
>>> m.mock_calls
[call('foo', 'w'),
 call().__enter__(),
 call().write('some stuff'),
 call().__exit__(None, None, None)]
>>> m.assert_called_once_with('foo', 'w')
>>> handle = m()
>>> handle.write.assert_called_once_with('some stuff')
@end example

그리고 파일을 읽기 위해서는:

@example
>>> with patch('__main__.open', mock_open(read_data='bibble')) as m:
...     with open('foo') as h:
...         result = h.read()
...
>>> m.assert_called_once_with('foo')
>>> assert result == 'bibble'
@end example

@node 자동 사양,실링 모의 객체 봉인하기,mock_open,도우미
@anchor{library/unittest mock auto-speccing}@anchor{466d}@anchor{library/unittest mock autospeccing}@anchor{46b1}
@subsubsection 자동 사양


자동 사양은 기존의 @code{spec} 기능을 기반으로 합니다. 모의 객체 api를 원본 객체(사양)의 api로 제한하지만, 재귀적(게으르게(lazily) 구현되었습니다)이라서 모의 객체의 어트리뷰트는 사양의 어트리뷰트와 같은 api만 갖습니다. 또한 모킹된 함수 / 메서드는 원본과 같은 호출 서명을 가지므로 잘못 호출되면 @ref{198,,TypeError}를 발생시킵니다.

자동 사양이 작동하는 방식을 설명하기 전에, 이것이 필요한 이유는 이렇습니다.

@ref{c3d,,Mock}은 매우 강력하고 유연한 객체이지만, 모킹에 일반적으로 존재하는 결함을 지니고 있습니다. 멤버 이름 등을 변경하는 등 일부 코드를 리팩토링하면, 여전히 `예전 api'를 사용하는 코드에 대한 테스트는 실제 객체 대신 모의 객체를 사용하면 모두 통과합니다. 이것은 코드가 손상되어도 테스트를 모두 통과 할 수 있다는 뜻입니다.


버전 3.5에서 변경: Before 3.5, tests with a typo in the word assert would silently pass when they should
raise an error. You can still achieve this behavior by passing @code{unsafe=True} to Mock.


이것이 단위 테스트뿐만 아니라 통합 테스트가 필요한 또 다른 이유입니다. 모든 것을 분리해서 테스트하는 것은 괜찮고 멋지지만, 단위들이 어떻게 “서로 연결되어” 있는지 테스트하지 않으면 테스트가 발견할 수도 있을 버그에 대한 여지가 여전히 많습니다.

@code{unittest.mock} already provides a feature to help with this, called speccing. If you
use a class or instance as the @code{spec} for a mock then you can only access
attributes on the mock that exist on the real class:

@example
>>> from urllib import request
>>> mock = Mock(spec=request.Request)
>>> mock.assret_called_with  # Intentional typo!
Traceback (most recent call last):
 ...
AttributeError: Mock object has no attribute 'assret_called_with'
@end example

사양은 모의 객체 자체에만 적용되므로, 모의 객체의 메서드와 관계된 문제는 여전히 있습니다:

@example
>>> mock.header_items()
<mock.Mock object at 0x...>
>>> mock.header_items.assret_called_with()  # Intentional typo!
@end example

자동 사양은 이 문제를 해결합니다. @code{autospec=True}를 @ref{1091,,patch()} / @ref{1907,,patch.object()}로 전달하거나 @ref{1935,,create_autospec()} 함수를 사용하여 사양이 있는 모의 객체를 만들 수 있습니다. @code{autospec=True} 인자를 @code{patch()}에 사용하면 대체 중인 객체가 사양 객체로 사용됩니다. 사양화(speccing)는 “게으르게(lazily)” 수행되므로 (모의 객체의 어트리뷰트에 액세스할 때 사양이 만들어집니다) 성능이 크게 저하되지 않고도 매우 복잡하거나 깊이 중첩된 객체(가령 모듈을 임포트 하는 모듈을 임포트 하는 모듈)와 함께 사용할 수 있습니다.

사용 예는 다음과 같습니다:

@example
>>> from urllib import request
>>> patcher = patch('__main__.request', autospec=True)
>>> mock_request = patcher.start()
>>> request is mock_request
True
>>> mock_request.Request
<MagicMock name='request.Request' spec='Request' id='...'>
@end example

@code{request.Request}에 spec이 있음을 알 수 있습니다. @code{request.Request}는 생성자에서 두 개의 인자를 취합니다 (하나는 `self'입니다). 잘못 호출하면 이렇게 됩니다:

@example
>>> req = request.Request()
Traceback (most recent call last):
 ...
TypeError: <lambda>() takes at least 2 arguments (1 given)
@end example

사양은 인스턴스 화 된 클래스(즉, 사양화된 모의 객체의 반환 값)에도 적용됩니다:

@example
>>> req = request.Request('foo')
>>> req
<NonCallableMagicMock name='request.Request()' spec='Request' id='...'>
@end example

@code{Request} 객체는 콜러블이 아니므로, 모킹된 @code{request.Request}의 인스턴스 화의 반환 값은 콜러블이 아닌 모의 객체입니다. 사양이 적용되면 어서션에 오타가 있을 때 올바른 에러를 발생시킵니다:

@example
>>> req.add_header('spam', 'eggs')
<MagicMock name='request.Request().add_header()' id='...'>
>>> req.add_header.assret_called_with  # Intentional typo!
Traceback (most recent call last):
 ...
AttributeError: Mock object has no attribute 'assret_called_with'
>>> req.add_header.assert_called_with('spam', 'eggs')
@end example

많은 경우 단지 기존 @ref{1091,,patch()} 호출에 @code{autospec=True}를 추가하면 오타와 api 변경으로 인한 버그로부터 보호할 수 있습니다.

@ref{1091,,patch()}를 통해 `autospec'을 사용하는 것뿐만 아니라 자동 사양 모의 객체를 직접 만들기 위한 @ref{1935,,create_autospec()}도 있습니다:

@example
>>> from urllib import request
>>> mock_request = create_autospec(request)
>>> mock_request.Request('foo', 'bar')
<NonCallableMagicMock name='mock.Request()' spec='Request' id='...'>
@end example

그러나 경고와 제한이 없는 것은 아니기 때문에 기본 동작이 아닙니다. 사양 객체에서 사용 가능한 어트리뷰트를 알기 위해 autospec은 사양을 검사(어트리뷰트를 액세스합니다)해야 합니다. 모의 객체 어트리뷰트를 탐색할 때 원본 객체의 대응하는 탐색이 수면 아래에서 발생합니다. 사양 객체 중 어느 하나가 코드 실행을 트리거 할 수 있는 프로퍼티나 디스크립터를 갖는 경우 자동 사양을 사용하지 못할 수 있습니다. 반면에, 내부 검사가 안전하도록 객체를 설계하는 것이 훨씬 좋습니다 @footnote{
이것은 클래스나 이미 인스턴스 화 된 객체에만 적용됩니다. 모킹된 클래스를 호출하여 모의 객체 인스턴스를 만드는 것은 실제 인스턴스를 만들지 `않습니다'. (@ref{843,,dir()} 호출과 함께) 어트리뷰트 조회만 수행됩니다.
}.

더 심각한 문제는 인스턴스 어트리뷰트가 @ref{8be,,__init__()} 메서드에서 만들어지고 클래스에 전혀 존재하지 않는 것이 일반적이라는 것입니다. `autospec'은 동적으로 만들어진 어트리뷰트를 알 수 없으며 api를 가시적 어트리뷰트로 제한합니다.

@example
>>> class Something:
...   def __init__(self):
...     self.a = 33
...
>>> with patch('__main__.Something', autospec=True):
...   thing = Something()
...   thing.a
...
Traceback (most recent call last):
  ...
AttributeError: Mock object has no attribute 'a'
@end example

이 문제를 해결하는 방법에는 몇 가지가 있습니다. 가장 쉬운, 하지만 가장 덜 성가시다고 할 수는 없는, 방법은 단순히 생성 후에 모의 객체에 필요한 어트리뷰트를 설정하는 것입니다. `autospec'은 사양에 존재하지 않는 어트리뷰트를 꺼내는 것을 허락하지 않기 때문에 그것을 설정하는 것을 막지는 않습니다:

@example
>>> with patch('__main__.Something', autospec=True):
...   thing = Something()
...   thing.a = 33
...
@end example

존재하지 않는 어트리뷰트를 설정하지 `못하게 하는' `spec'과 `autospec'의 더 적극적인 버전이 있습니다. 이것은 코드가 `오직' 유효한 어트리뷰트만 설정하도록 보장하려는 경우 유용하지만, 명백히 이 특정 시나리오를 막습니다:

@example
>>> with patch('__main__.Something', autospec=True, spec_set=True):
...   thing = Something()
...   thing.a = 33
...
Traceback (most recent call last):
 ...
AttributeError: Mock object has no attribute 'a'
@end example

아마도 문제를 해결하는 가장 좋은 방법은 @ref{8be,,__init__()}에서 초기화되는 인스턴스 멤버의 기본값으로 클래스 어트리뷰트를 추가하는 것입니다. @code{__init__()}에서 기본 어트리뷰트만 설정하고 있다면 클래스 어트리뷰트(물론 인스턴스 간에 공유됩니다)를 통해 제공하는 것이 더 빠르기도 합니다. 예를 들어

@example
class Something:
    a = 33
@end example

이것은 또 다른 문제를 일으킵니다. 나중에 다른 형의 객체가 될 멤버에 대해 기본값 @code{None}을 제공하는 것이 일반적입니다. `아무런' 어트리뷰트나 메서드에도 액세스할 수 없도록 하므로 @code{None}은 사양으로 쓸모가 없습니다. @code{None}은 `결코' 스펙으로 유용하지 않고, 일반적으로 다른 형의 멤버를 나타낼 것이기 때문에, autospec은 @code{None}으로 설정된 멤버의 사양을 사용하지 않습니다. 이것들은 평범한 모의 객체일 것입니다 (아마도 - MagicMock):

@example
>>> class Something:
...     member = None
...
>>> mock = create_autospec(Something)
>>> mock.member.foo.bar.baz()
<MagicMock name='mock.member.foo.bar.baz()' id='...'>
@end example

프로덕션 클래스를 수정하여 기본값을 추가하는 것이 마음에 들지 않으면 더 많은 선택지가 있습니다. 이 중 하나는 단순히 클래스가 아닌 인스턴스를 사양으로 사용하는 것입니다. 다른 하나는 프로덕션 클래스의 서브 클래스를 만들고 프로덕션 클래스에 영향을 주지 않으면서 기본값을 서브 클래스에 추가하는 것입니다. 이 두 가지 모두 사양으로 대체 객체를 사용해야 합니다. 고맙게도 @ref{1091,,patch()}는 이것을 지원합니다 - 단순히 대체 객체를 `autospec' 인자로 전달할 수 있습니다:

@example
>>> class Something:
...   def __init__(self):
...     self.a = 33
...
>>> class SomethingForTest(Something):
...   a = 33
...
>>> p = patch('__main__.Something', autospec=SomethingForTest)
>>> mock = p.start()
>>> mock.a
<NonCallableMagicMock name='Something.a' spec='int' id='...'>
@end example

@node 실링 모의 객체 봉인하기,,자동 사양,도우미
@anchor{library/unittest mock sealing-mocks}@anchor{46b2}
@subsubsection 실링 모의 객체 봉인하기


@c from unittest.mock import seal

@geindex seal() (unittest.mock 모듈)
@anchor{library/unittest mock unittest mock seal}@anchor{d99}
@deffn {함수} unittest.mock.seal (mock)

Seal은 봉인되는 모의 객체나 이것의 재귀적으로 이미 모의 객체인 어트리뷰트의 어트리뷰트를 액세스할 때 자동 모의 객체 생성을 비활성화합니다.

이름이나 사양을 가진 모의 객체 인스턴스가 어트리뷰트에 대입되면 봉인 체인에서 고려되지 않습니다. 이것은 seal이 모의 객체의 일부를 고정하는 것을 방지할 수 있게 합니다.

@example
>>> mock = Mock()
>>> mock.submock.attribute1 = 2
>>> mock.not_submock = mock.Mock(name="sample_name")
>>> seal(mock)
>>> mock.new_attribute  # AttributeError를 발생시킵니다.
>>> mock.submock.attribute2  # AttributeError를 발생시킵니다.
>>> mock.not_submock.attribute2  # 예외를 발생시키지 않습니다.
@end example


Added in version 3.7.

@end deffn

@node Order of precedence of side_effect return_value and wraps,,도우미,unittest mock — 모의 객체 라이브러리
@anchor{library/unittest mock order-of-precedence-of-side-effect-return-value-and-wraps}@anchor{46b3}
@subsubsection Order of precedence of @code{side_effect}, @code{return_value} and `wraps'


The order of their precedence is:


@enumerate 

@item 
@ref{466a,,side_effect}

@item 
@ref{4672,,return_value}

@item 
`wraps'
@end enumerate

If all three are set, mock will return the value from @ref{466a,,side_effect},
ignoring @ref{4672,,return_value} and the wrapped object altogether. If any
two are set, the one with the higher precedence will return the value.
Regardless of the order of which was set first, the order of precedence
remains unchanged.

@example
>>> from unittest.mock import Mock
>>> class Order:
...     @@staticmethod
...     def get_value():
...         return "third"
...
>>> order_mock = Mock(spec=Order, wraps=Order)
>>> order_mock.get_value.side_effect = ["first"]
>>> order_mock.get_value.return_value = "second"
>>> order_mock.get_value()
'first'
@end example

As @code{None} is the default value of @ref{466a,,side_effect}, if you reassign
its value back to @code{None}, the order of precedence will be checked between
@ref{4672,,return_value} and the wrapped object, ignoring
@code{side_effect}.

@example
>>> order_mock.get_value.side_effect = None
>>> order_mock.get_value()
'second'
@end example

If the value being returned by @ref{466a,,side_effect} is @ref{4671,,DEFAULT},
it is ignored and the order of precedence moves to the successor to obtain the
value to return.

@example
>>> from unittest.mock import DEFAULT
>>> order_mock.get_value.side_effect = [DEFAULT]
>>> order_mock.get_value()
'second'
@end example

When @ref{c3d,,Mock} wraps an object, the default value of
@ref{4672,,return_value} will be @ref{4671,,DEFAULT}.

@example
>>> order_mock = Mock(spec=Order, wraps=Order)
>>> order_mock.return_value
sentinel.DEFAULT
>>> order_mock.get_value.return_value
sentinel.DEFAULT
@end example

The order of precedence will ignore this value and it will move to the last
successor which is the wrapped object.

As the real call is being made to the wrapped object, creating an instance of
this mock will return the real instance of the class. The positional arguments,
if any, required by the wrapped object must be passed.

@example
>>> order_mock_instance = order_mock()
>>> isinstance(order_mock_instance, Order)
True
>>> order_mock_instance.get_value()
'third'
@end example

@example
>>> order_mock.get_value.return_value = DEFAULT
>>> order_mock.get_value()
'third'
@end example

@example
>>> order_mock.get_value.return_value = "second"
>>> order_mock.get_value()
'second'
@end example

But if you assign @code{None} to it, this will not be ignored as it is an
explicit assignment. So, the order of precedence will not move to the wrapped
object.

@example
>>> order_mock.get_value.return_value = None
>>> order_mock.get_value() is None
True
@end example

Even if you set all three at once when initializing the mock, the order of
precedence remains the same:

@example
>>> order_mock = Mock(spec=Order, wraps=Order,
...                   **@{"get_value.side_effect": ["first"],
...                      "get_value.return_value": "second"@}
...                   )
...
>>> order_mock.get_value()
'first'
>>> order_mock.get_value.side_effect = None
>>> order_mock.get_value()
'second'
>>> order_mock.get_value.return_value = DEFAULT
>>> order_mock.get_value()
'third'
@end example

If @ref{466a,,side_effect} is exhausted, the order of precedence will not
cause a value to be obtained from the successors. Instead, @code{StopIteration}
exception is raised.

@example
>>> order_mock = Mock(spec=Order, wraps=Order)
>>> order_mock.get_value.side_effect = ["first side effect value",
...                                     "another side effect value"]
>>> order_mock.get_value.return_value = "second"
@end example

@example
>>> order_mock.get_value()
'first side effect value'
>>> order_mock.get_value()
'another side effect value'
@end example

@example
>>> order_mock.get_value()
Traceback (most recent call last):
 ...
StopIteration
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node unittest mock — 시작하기,test — 파이썬 용 회귀 테스트 패키지,unittest mock — 모의 객체 라이브러리,개발 도구
@anchor{library/unittest mock-examples doc}@anchor{46b4}@anchor{library/unittest mock-examples translation-repo}@anchor{46b5}@anchor{library/unittest mock-examples unittest-mock-getting-started}@anchor{46b6}
@subsection @code{unittest.mock} — 시작하기



Added in version 3.3.

@anchor{library/unittest mock-examples getting-started}@anchor{46b7}
@c import asyncio
@c import unittest
@c from unittest.mock import Mock, MagicMock, AsyncMock, patch, call, sentinel
@c 
@c class SomeClass:
@c     attribute = 'this is a doctest'
@c 
@c     @staticmethod
@c     def static_method():
@c         pass

@menu
* 모의 객체 사용하기:: 
* Patch decorators:: 
* Further examples:: 

@end menu

@node 모의 객체 사용하기,Patch decorators,,unittest mock — 시작하기
@anchor{library/unittest mock-examples using-mock}@anchor{46b8}
@subsubsection 모의 객체 사용하기


@menu
* Mock patching methods:: 
* Mock for method calls on an object:: 
* Mocking classes:: 
* 모의 객체 이름 붙이기:: 
* Tracking all calls:: 
* Setting return values and attributes:: 
* 모의 객체로 예외 발생시키기:: 
* 부작용 함수와 이터러블:: 
* 비동기 이터레이터 모킹하기:: 
* 비동기 컨텍스트 관리자 모킹하기:: 
* Creating a mock from an existing object:: 
* Using side_effect to return per file content:: 

@end menu

@node Mock patching methods,Mock for method calls on an object,,모의 객체 사용하기
@anchor{library/unittest mock-examples mock-patching-methods}@anchor{46b9}
@subsubsection Mock patching methods


@ref{c3d,,Mock} 객체의 일반적인 용도는 다음과 같습니다:


@itemize *

@item 
메서드 패치하기

@item 
객체에 대한 메서드 호출 기록하기
@end itemize

객체의 메서드를 대체하여 시스템의 다른 부분에서 올바른 인자로 호출되었는지 확인할 수 있습니다:

@example
>>> real = SomeClass()
>>> real.method = MagicMock(name='method')
>>> real.method(3, 4, 5, key='value')
<MagicMock name='method()' id='...'>
@end example

일단 모의 객체가 사용되면 (이 예제에서는 @code{real.method}) 사용 방법에 대한 어서션을 만들 수 있도록 하는 메서드와 어트리뷰트를 제공합니다.

@cartouche
@quotation 참고 
이 예의 대부분에서 @ref{c3d,,Mock}과 @ref{108e,,MagicMock} 클래스는 교환할 수 있습니다. @code{MagicMock}이 더 유능한 클래스이기 때문에 기본 사용하기에 적합합니다.
@end quotation
@end cartouche

일단 모의 객체가 호출되면 그것의 @ref{467c,,called} 어트리뷰트가 @code{True}로 설정됩니다. 더 중요하게 @ref{1e00,,assert_called_with()}나 @ref{4674,,assert_called_once_with()} 메서드를 사용하여 올바른 인자로 호출되었는지 확인할 수 있습니다.

이 예제는 @code{ProductionClass().method}를 호출하면 @code{something} 메서드가 호출되는지 테스트합니다:

@example
>>> class ProductionClass:
...     def method(self):
...         self.something(1, 2, 3)
...     def something(self, a, b, c):
...         pass
...
>>> real = ProductionClass()
>>> real.something = MagicMock()
>>> real.method()
>>> real.something.assert_called_once_with(1, 2, 3)
@end example

@node Mock for method calls on an object,Mocking classes,Mock patching methods,모의 객체 사용하기
@anchor{library/unittest mock-examples mock-for-method-calls-on-an-object}@anchor{46ba}
@subsubsection Mock for method calls on an object


마지막 예제에서 우리는 객체에 메서드를 직접 패치하여 올바르게 호출되었는지 확인했습니다. 또 다른 일반적인 사용 사례는 객체를 메서드(또는 테스트 중인 시스템의 일부)에 전달한 다음 올바른 방식으로 사용되는지 확인하는 것입니다.

아래의 간단한 @code{ProductionClass}에는 @code{closer} 메서드가 있습니다. 객체로 호출되면 그것의 @code{close}를 호출합니다.

@example
>>> class ProductionClass:
...     def closer(self, something):
...         something.close()
...
@end example

따라서 테스트하려면 @code{close} 메서드를 가진 객체를 전달하고 올바르게 호출되었는지 확인해야 합니다.

@example
>>> real = ProductionClass()
>>> mock = Mock()
>>> real.closer(mock)
>>> mock.close.assert_called_with()
@end example

모의 객체에 ‘close’ 메서드를 제공하기 위해 어떤 작업도 수행할 필요가 없습니다. close에 액세스하면 만들어집니다. 따라서, ‘close’가 아직 호출되지 않았다면 테스트에서 액세스할 때 만들어지지만, @ref{1e00,,assert_called_with()}는 실패 예외를 발생시킵니다.

@node Mocking classes,모의 객체 이름 붙이기,Mock for method calls on an object,모의 객체 사용하기
@anchor{library/unittest mock-examples mocking-classes}@anchor{46bb}
@subsubsection Mocking classes


일반적인 사용 사례는 테스트 중인 코드가 인스턴스 화하는 클래스를 모킹하는 것입니다. 클래스를 패치하면, 해당 클래스가 모의 객체로 바뀝니다. 인스턴스는 `클래스를 호출해서' 만들어집니다. 이는 모킹된 클래스의 반환 값을 확인하여 “모의 인스턴스”에 액세스한다는 것을 뜻합니다.

아래 예제에는 @code{Foo}를 인스턴스 화하고 그것의 메서드를 호출하는 @code{some_function} 함수가 있습니다. @ref{1091,,patch()}에 대한 호출은 클래스 @code{Foo}를 모의 객체로 대체합니다. @code{Foo} 인스턴스는 모의 객체를 호출한 결과라서, 모의 객체 @ref{4672,,return_value}를 수정하여 구성됩니다.

@example
>>> def some_function():
...     instance = module.Foo()
...     return instance.method()
...
>>> with patch('module.Foo') as mock:
...     instance = mock.return_value
...     instance.method.return_value = 'the result'
...     result = some_function()
...     assert result == 'the result'
@end example

@node 모의 객체 이름 붙이기,Tracking all calls,Mocking classes,모의 객체 사용하기
@anchor{library/unittest mock-examples naming-your-mocks}@anchor{46bc}
@subsubsection 모의 객체 이름 붙이기


모의 객체에 이름을 지정하는 것이 유용할 수 있습니다. 이름은 모의 객체의 repr에 표시되며 모의 객체가 테스트 실패 메시지에 나타날 때 유용할 수 있습니다. 이 이름은 모의 객체의 어트리뷰트나 메서드에도 전파됩니다:

@example
>>> mock = MagicMock(name='foo')
>>> mock
<MagicMock name='foo' id='...'>
>>> mock.method
<MagicMock name='foo.method' id='...'>
@end example

@node Tracking all calls,Setting return values and attributes,모의 객체 이름 붙이기,모의 객체 사용하기
@anchor{library/unittest mock-examples tracking-all-calls}@anchor{46bd}
@subsubsection Tracking all calls


메서드에 대한 단일 호출 이상을 추적하려는 경우가 종종 있습니다. @ref{4676,,mock_calls} 어트리뷰트는 모의 객체의 자식 어트리뷰트에 대한 모든 호출을 기록합니다 - 그리고 그들의 자식에 대해서도 마찬가지입니다.

@example
>>> mock = MagicMock()
>>> mock.method()
<MagicMock name='mock.method()' id='...'>
>>> mock.attribute.method(10, x=53)
<MagicMock name='mock.attribute.method()' id='...'>
>>> mock.mock_calls
[call.method(), call.attribute.method(10, x=53)]
@end example

@code{mock_calls}에 대한 어서션을 만들고 예기치 않은 메서드가 호출되면, 어서션이 실패합니다. 이 기능은 예상한 호출이 이루어졌음을 어서트 할 뿐만 아니라, 추가 호출 없이 올바른 순서로 호출되었는지 확인하기 때문에 유용합니다:

@ref{1db0,,call} 객체를 사용하여 @code{mock_calls}와 비교할 리스트를 구성합니다:

@example
>>> expected = [call.method(), call.attribute.method(10, x=53)]
>>> mock.mock_calls == expected
True
@end example

그러나, 모의 객체를 반환하는 호출에 대한 매개 변수는 기록되지 않아서, 조상을 만드는 데 사용되는 매개 변수가 중요한 중첩된 호출을 추적할 수 없습니다:

@example
>>> m = Mock()
>>> m.factory(important=True).deliver()
<Mock name='mock.factory().deliver()' id='...'>
>>> m.mock_calls[-1] == call.factory(important=False).deliver()
True
@end example

@node Setting return values and attributes,모의 객체로 예외 발생시키기,Tracking all calls,모의 객체 사용하기
@anchor{library/unittest mock-examples setting-return-values-and-attributes}@anchor{46be}
@subsubsection Setting return values and attributes


모의 객체에서 반환 값을 설정하는 것은 아주 간단합니다:

@example
>>> mock = Mock()
>>> mock.return_value = 3
>>> mock()
3
@end example

물론 모의 객체의 메서드에 대해서도 마찬가지입니다:

@example
>>> mock = Mock()
>>> mock.method.return_value = 3
>>> mock.method()
3
@end example

생성자에서 반환 값을 설정할 수도 있습니다:

@example
>>> mock = Mock(return_value=3)
>>> mock()
3
@end example

모의 객체에 어트리뷰트 설정이 필요하면, 그냥 하면 됩니다:

@example
>>> mock = Mock()
>>> mock.x = 3
>>> mock.x
3
@end example

때로는 예를 들어 @code{mock.connection.cursor().execute("SELECT 1")}와 같은 더 복잡한 상황을 모킹하고 싶을 수도 있습니다. 이 호출이 리스트를 반환하도록 하려면, 중첩 호출의 결과를 구성해야 합니다.

@ref{1db0,,call}을 사용하여 다음과 같이 “연쇄 호출(chained call)”로 일련의 호출 집합을 구성할 수 있습니다:

@example
>>> mock = Mock()
>>> cursor = mock.connection.cursor.return_value
>>> cursor.execute.return_value = ['foo']
>>> mock.connection.cursor().execute("SELECT 1")
['foo']
>>> expected = call.connection.cursor().execute("SELECT 1").call_list()
>>> mock.mock_calls
[call.connection.cursor(), call.connection.cursor().execute('SELECT 1')]
>>> mock.mock_calls == expected
True
@end example

@code{.call_list()} 호출이 호출 객체를 연쇄 호출을 나타내는 호출 리스트로 변환합니다.

@node 모의 객체로 예외 발생시키기,부작용 함수와 이터러블,Setting return values and attributes,모의 객체 사용하기
@anchor{library/unittest mock-examples raising-exceptions-with-mocks}@anchor{46bf}
@subsubsection 모의 객체로 예외 발생시키기


유용한 어트리뷰트는 @ref{466a,,side_effect}입니다. 이것을 예외 클래스나 인스턴스로 설정하면 모의 객체가 호출될 때 예외가 발생합니다.

@example
>>> mock = Mock(side_effect=Exception('Boom!'))
>>> mock()
Traceback (most recent call last):
  ...
Exception: Boom!
@end example

@node 부작용 함수와 이터러블,비동기 이터레이터 모킹하기,모의 객체로 예외 발생시키기,모의 객체 사용하기
@anchor{library/unittest mock-examples side-effect-functions-and-iterables}@anchor{46c0}
@subsubsection 부작용 함수와 이터러블


@code{side_effect}는 함수나 이터러블로 설정할 수도 있습니다. @code{side_effect}의 이터러블로서의 사용 사례는 모의 객체가 여러 번 호출되고, 각 호출이 다른 값을 반환하기를 원하는 곳입니다. @code{side_effect}를 이터러블로 설정하면 모의 객체에 대한 모든 호출은 이터러블에서 다음 값을 반환합니다:

@example
>>> mock = MagicMock(side_effect=[4, 5, 6])
>>> mock()
4
>>> mock()
5
>>> mock()
6
@end example

모의 객체 호출에 전달되는 것에 따라 반환 값을 동적으로 변경하는 것과 같은 고급 사용 사례의 경우, @code{side_effect}는 함수가 될 수 있습니다. 함수는 모의 객 체와 같은 인자로 호출됩니다. 함수가 반환하는 것을 호출이 반환합니다:

@example
>>> vals = @{(1, 2): 1, (2, 3): 2@}
>>> def side_effect(*args):
...     return vals[args]
...
>>> mock = MagicMock(side_effect=side_effect)
>>> mock(1, 2)
1
>>> mock(2, 3)
2
@end example

@node 비동기 이터레이터 모킹하기,비동기 컨텍스트 관리자 모킹하기,부작용 함수와 이터러블,모의 객체 사용하기
@anchor{library/unittest mock-examples mocking-asynchronous-iterators}@anchor{46c1}
@subsubsection 비동기 이터레이터 모킹하기


파이썬 3.8부터, @code{AsyncMock}과 @code{MagicMock}은 @code{__aiter__}를 통해 @ref{f76,,비동기 이터레이터(Asynchronous Iterators)}를 모킹하는 것을 지원합니다. @code{__aiter__}의 @ref{4672,,return_value} 어트리뷰트를 사용하여 이터레이션에 사용될 반환 값을 설정할 수 있습니다.

@example
>>> mock = MagicMock()  # AsyncMock also works here
>>> mock.__aiter__.return_value = [1, 2, 3]
>>> async def main():
...     return [i async for i in mock]
...
>>> asyncio.run(main())
[1, 2, 3]
@end example

@node 비동기 컨텍스트 관리자 모킹하기,Creating a mock from an existing object,비동기 이터레이터 모킹하기,모의 객체 사용하기
@anchor{library/unittest mock-examples mocking-asynchronous-context-manager}@anchor{46c2}
@subsubsection 비동기 컨텍스트 관리자 모킹하기


파이썬 3.8부터, @code{AsyncMock}과 @code{MagicMock}은 @code{__aenter__}와 @code{__aexit__}를 통해 @ref{811,,비동기 컨텍스트 관리자}를 모킹하는 것을 지원합니다. 기본적으로, @code{__aenter__}와 @code{__aexit__}는 비동기 함수를 반환하는 @code{AsyncMock} 인스턴스입니다.

@example
>>> class AsyncContextManager:
...     async def __aenter__(self):
...         return self
...     async def __aexit__(self, exc_type, exc, tb):
...         pass
...
>>> mock_instance = MagicMock(AsyncContextManager())  # AsyncMock also works here
>>> async def main():
...     async with mock_instance as result:
...         pass
...
>>> asyncio.run(main())
>>> mock_instance.__aenter__.assert_awaited_once()
>>> mock_instance.__aexit__.assert_awaited_once()
@end example

@node Creating a mock from an existing object,Using side_effect to return per file content,비동기 컨텍스트 관리자 모킹하기,모의 객체 사용하기
@anchor{library/unittest mock-examples creating-a-mock-from-an-existing-object}@anchor{46c3}
@subsubsection Creating a mock from an existing object


모킹을 과도하게 사용하는 한 가지 문제는 테스트를 실제 코드가 아닌 모킹의 구현에 연결한다는 것입니다. @code{some_method}를 구현하는 클래스가 있다고 가정해봅시다. 다른 클래스에 대한 테스트에서, @code{some_method}*도* 제공하는 이 객체의 모의 객체를 제공합니다. 나중에 첫 번째 클래스를 리팩토링하여, 더는 @code{some_method}를 갖지 않습니다 - 그러면 이제 코드가 망가졌음에도 테스트는 계속 통과합니다!

@ref{c3d,,Mock}은 `spec' 키워드 인자를 사용하여, 모의 객체를 위한 사양으로 객체를 제공할 수 있도록 합니다. 사양 객체에 존재하지 않는 모의 객체의 메서드/어트리뷰트에 액세스하면 어트리뷰트 에러가 즉시 발생합니다. 사양의 구현을 변경하면, 해당 클래스를 사용하는 테스트는 해당 테스트에서 클래스를 인스턴스 화하지 않고도 즉시 실패하기 시작합니다.

@example
>>> mock = Mock(spec=SomeClass)
>>> mock.old_method()
Traceback (most recent call last):
   ...
AttributeError: Mock object has no attribute 'old_method'. Did you mean: 'class_method'?
@end example

또한 사양을 사용하면 일부 매개 변수가 위치 인자나 이름 붙인 인자 중 어느 것으로 전달되는지와 관계없이 모의 객체에 대한 호출을 더 스마트하게 일치시킬 수 있도록 합니다:

@example
>>> def f(a, b, c): pass
...
>>> mock = Mock(spec=f)
>>> mock(1, 2, 3)
<Mock name='mock()' id='140161580456576'>
>>> mock.assert_called_with(a=1, b=2, c=3)
@end example

이 더 스마트한 인치가 모의 객체에 대한 메서드 호출에서도 작동하게 하려면, @ref{466d,,자동 사양}을 사용할 수 있습니다.

임의의 어트리뷰트를 읽는 것뿐만 아니라 설정하지 못하게 하는 더 강력한 사양 형식을 원하면 `spec' 대신 `spec_set'을 사용할 수 있습니다.

@node Using side_effect to return per file content,,Creating a mock from an existing object,모의 객체 사용하기
@anchor{library/unittest mock-examples using-side-effect-to-return-per-file-content}@anchor{46c4}
@subsubsection Using side_effect to return per file content


@ref{11e6,,mock_open()} is used to patch @ref{316,,open()} method. @ref{466a,,side_effect}
can be used to return a new Mock object per call. This can be used to return different
contents per file stored in a dictionary:

@example
DEFAULT = "default"
data_dict = @{"file1": "data1",
             "file2": "data2"@}

def open_side_effect(name):
    return mock_open(read_data=data_dict.get(name, DEFAULT))()

with patch("builtins.open", side_effect=open_side_effect):
    with open("file1") as file1:
        assert file1.read() == "data1"

    with open("file2") as file2:
        assert file2.read() == "data2"

    with open("file3") as file2:
        assert file2.read() == "default"
@end example

@node Patch decorators,Further examples,모의 객체 사용하기,unittest mock — 시작하기
@anchor{library/unittest mock-examples patch-decorators}@anchor{46c5}
@subsubsection Patch decorators


@cartouche
@quotation 참고 
@ref{1091,,patch()}를 사용할 때는 그것이 조회되는 이름 공간에서 객체를 패치하는 것이 중요합니다. 이것은 일반적으로 간단하지만, 빠른 안내를 위해 @ref{466b,,패치할 곳}을 읽으십시오.
@end quotation
@end cartouche

테스트에서 흔히 필요한 것은 클래스 어트리뷰트나 모듈 어트리뷰트를 패치하는 것입니다, 예를 들어 내장(builtin)을 패치하거나 모듈에 있는 인스턴스 화 되는 클래스를 패치하는 것. 모듈과 클래스는 사실상 전역이라서, 테스트 후에 패치를 실행 취소해야 합니다, 그렇지 않으면 패치가 다른 테스트로 지속하여, 진단하기 어려운 문제를 일으킵니다.

mock은 세 가지 편리한 데코레이터를 제공합니다: @ref{1091,,patch()}, @ref{1907,,patch.object()} 및 @ref{1968,,patch.dict()}. @code{patch}는 패치 할 어트리뷰트를 지정하기 위해 @code{package.module.Class.attribute} 형식의 단일 문자열을 취합니다. 또한 선택적으로 어트리뷰트(또는 클래스나 무엇이건)를 바꾸려는 값을 취합니다. ‘patch.object’는 객체와 패치하려는 어트리뷰트의 이름 및 선택적으로 패치 할 값을 취합니다.

@code{patch.object}:

@example
>>> original = SomeClass.attribute
>>> @@patch.object(SomeClass, 'attribute', sentinel.attribute)
... def test():
...     assert SomeClass.attribute == sentinel.attribute
...
>>> test()
>>> assert SomeClass.attribute == original

>>> @@patch('package.module.attribute', sentinel.attribute)
... def test():
...     from package.module import attribute
...     assert attribute is sentinel.attribute
...
>>> test()
@end example

모듈(@ref{13,,builtins}를 포함하는)을 패치하려면 @ref{1907,,patch.object()} 대신 @ref{1091,,patch()}를 사용하십시오:

@example
>>> mock = MagicMock(return_value=sentinel.file_handle)
>>> with patch('builtins.open', mock):
...     handle = open('filename', 'r')
...
>>> mock.assert_called_with('filename', 'r')
>>> assert handle == sentinel.file_handle, "incorrect file handle returned"
@end example

필요하면 @code{package.module} 형식으로 모듈 이름을 ‘점으로 표시’할 수 있습니다:

@example
>>> @@patch('package.module.ClassName.attribute', sentinel.attribute)
... def test():
...     from package.module import ClassName
...     assert ClassName.attribute == sentinel.attribute
...
>>> test()
@end example

좋은 패턴은 실제로 테스트 메서드 자체를 데코레이트 하는 것입니다:

@example
>>> class MyTest(unittest.TestCase):
...     @@patch.object(SomeClass, 'attribute', sentinel.attribute)
...     def test_something(self):
...         self.assertEqual(SomeClass.attribute, sentinel.attribute)
...
>>> original = SomeClass.attribute
>>> MyTest('test_something').test_something()
>>> assert SomeClass.attribute == original
@end example

Mock으로 패치하려면, 하나의 인자만으로 @ref{1091,,patch()}를 사용할 수 있습니다 (또는 두 개의 인자로 @ref{1907,,patch.object()}). 모의 객체가 여러분을 위해 만들어지고 테스트 함수 / 메서드로 전달됩니다:

@example
>>> class MyTest(unittest.TestCase):
...     @@patch.object(SomeClass, 'static_method')
...     def test_something(self, mock_method):
...         SomeClass.static_method()
...         mock_method.assert_called_with()
...
>>> MyTest('test_something').test_something()
@end example

이 패턴을 사용하여 여러 패치 데코레이터를 쌓을 수 있습니다:

@example
>>> class MyTest(unittest.TestCase):
...     @@patch('package.module.ClassName1')
...     @@patch('package.module.ClassName2')
...     def test_something(self, MockClass2, MockClass1):
...         self.assertIs(package.module.ClassName1, MockClass1)
...         self.assertIs(package.module.ClassName2, MockClass2)
...
>>> MyTest('test_something').test_something()
@end example

패치 데코레이터를 중첩할 때 모의 객체는 적용한 순서와 같은 순서(데코레이터가 적용되는 일반적인 `파이썬' 순서)로 데코레이트 된 함수로 전달됩니다. 이것은 밑에서 위로 올라가는 순서를 뜻해서, 위의 예에서 @code{test_module.ClassName2}의 모의 객체가 먼저 전달됩니다.

스코프 도중 딕셔너리에 값을 설정하고 테스트가 끝날 때 딕셔너리를 원래 상태로 복원하기 위한 @ref{1968,,patch.dict()}도 있습니다:

@example
>>> foo = @{'key': 'value'@}
>>> original = foo.copy()
>>> with patch.dict(foo, @{'newkey': 'newvalue'@}, clear=True):
...     assert foo == @{'newkey': 'newvalue'@}
...
>>> assert foo == original
@end example

@code{patch}, @code{patch.object} 및 @code{patch.dict}는 모두 컨텍스트 관리자로 사용할 수 있습니다.

@ref{1091,,patch()}를 사용하여 모의 객체를 만드는 곳에서, with 문의 “as” 형식을 사용하여 모의 객체에 대한 참조를 얻을 수 있습니다:

@example
>>> class ProductionClass:
...     def method(self):
...         pass
...
>>> with patch.object(ProductionClass, 'method') as mock_method:
...     mock_method.return_value = None
...     real = ProductionClass()
...     real.method(1, 2, 3)
...
>>> mock_method.assert_called_with(1, 2, 3)
@end example

대안으로 @code{patch}, @code{patch.object} 및 @code{patch.dict}는 클래스 데코레이터로 사용될 수 있습니다. 이런 식으로 사용될 때 이름이 “test”로 시작하는 모든 메서드에 데코레이터를 개별적으로 적용하는 것과 같습니다.

@node Further examples,,Patch decorators,unittest mock — 시작하기
@anchor{library/unittest mock-examples further-examples}@anchor{46c6}@anchor{library/unittest mock-examples id1}@anchor{46c7}
@subsubsection Further examples


다음은 약간 더 고급 시나리오에 대한 몇 가지 예입니다.

@menu
* 연쇄 호출 모킹하기:: 
* 부분 모킹:: 
* Mocking a generator method:: 
* 모든 테스트 메서드에 같은 패치 적용하기:: 
* Mocking unbound methods:: 
* 모의 객체로 여러 호출 확인하기:: 
* 가변 인자에 대처하기:: 
* Nesting patches:: 
* MagicMock으로 딕셔너리 모킹하기:: 
* Mock 서브 클래스와 그 어트리뷰트:: 
* patch.dict로 임포트를 모킹하기: patch dict로 임포트를 모킹하기. 
* 호출 순서 추적과 덜 상세한 호출 어서션:: 
* 더 복잡한 인자 일치:: 

@end menu

@node 연쇄 호출 모킹하기,부분 모킹,,Further examples
@anchor{library/unittest mock-examples mocking-chained-calls}@anchor{46c8}
@subsubsection 연쇄 호출 모킹하기


일단 @ref{4672,,return_value} 어트리뷰트를 이해하면 연쇄 호출 모킹은 모의 객체를 사용하면 실제로 간단합니다. 모의 객체가 처음 호출되거나 호출되기 전에 @code{return_value}를 가져오면, 새 @ref{c3d,,Mock}이 만들어집니다.

이것은 @code{return_value} 모의 객체를 조사하여 모킹 된 객체에 대한 호출에서 반환된 객체가 어떻게 사용되었는지 확인할 수 있음을 뜻합니다:

@example
>>> mock = Mock()
>>> mock().foo(a=2, b=3)
<Mock name='mock().foo()' id='...'>
>>> mock.return_value.foo.assert_called_with(a=2, b=3)
@end example

여기서부터는 구성하고 연쇄 호출에 대한 어서션을 만드는 간단한 단계입니다. 물론 또 다른 대안은 처음부터 더 테스트하기 쉬운 방식으로 코드를 작성하는 것입니다…

그래서, 다음과 같은 코드가 있다고 가정합시다:

@example
>>> class Something:
...     def __init__(self):
...         self.backend = BackendProvider()
...     def method(self):
...         response = self.backend.get_endpoint('foobar').create_call('spam', 'eggs').start_call()
...         # more code
@end example

@code{BackendProvider} 가 이미 잘 테스트 되었다고 가정하면, @code{method()}를 어떻게 테스트해야 할까요? 특히, 코드 섹션 @code{# more code}가 response 객체를 올바른 방식으로 사용하는지 테스트하고 싶습니다.

이 호출의 연쇄는 인스턴스 어트리뷰트에서 이루어지기 때문에 @code{Something} 인스턴스에서 @code{backend} 어트리뷰트를 몽키 패치 할 수 있습니다. 이 특별한 경우에는 @code{start_call}에 대한 최종 호출의 반환 값에만 관심이 있어서 해야 할 구성이 많지 않습니다. 반환하는 객체가 ‘파일류(file-like)’라고 가정하고, response 객체가 @code{spec}으로 내장 @ref{316,,open()}을 사용하도록 할 것입니다.

이를 위해 모의 백 엔드로 모의 인스턴스를 만들고 모의 response 객체를 만듭니다. 응답을 최종 @code{start_call}의 반환 값으로 설정하기 위해 다음을 수행할 수 있습니다:

@example
mock_backend.get_endpoint.return_value.create_call.return_value.start_call.return_value = mock_response
@end example

@ref{4673,,configure_mock()} 메서드를 사용하여 약간 더 좋은 방법으로 반환 값을 직접 설정할 수 있습니다:

@example
>>> something = Something()
>>> mock_response = Mock(spec=open)
>>> mock_backend = Mock()
>>> config = @{'get_endpoint.return_value.create_call.return_value.start_call.return_value': mock_response@}
>>> mock_backend.configure_mock(**config)
@end example

이것들로 우리는 “모의 백 엔드”를 몽키 패치하고 실제 호출을 할 수 있습니다:

@example
>>> something.backend = mock_backend
>>> something.method()
@end example

@ref{4676,,mock_calls}를 사용하면 단일 어서션으로 연쇄 호출을 확인할 수 있습니다. 연쇄 호출은 한 줄의 코드에 있는 여러 번의 호출이라서, @code{mock_calls}에는 여러 항목이 있게 됩니다. @ref{46ac,,call.call_list()}를 사용하여 이 호출의 리스트를 만들 수 있습니다:

@example
>>> chained = call.get_endpoint('foobar').create_call('spam', 'eggs').start_call()
>>> call_list = chained.call_list()
>>> assert mock_backend.mock_calls == call_list
@end example

@node 부분 모킹,Mocking a generator method,연쇄 호출 모킹하기,Further examples
@anchor{library/unittest mock-examples partial-mocking}@anchor{46c9}
@subsubsection 부분 모킹


For some tests, you may want to mock out a call to @ref{16cf,,datetime.date.today()}
to return a known date, but don’t want to prevent the code under test from
creating new date objects. Unfortunately @ref{1fa,,datetime.date} is written in C,
so you cannot just monkey-patch out the static @code{datetime.date.today()} method.

Instead, you can effectively wrap the date
class with a mock, while passing through calls to the constructor to the real
class (and returning real instances).

@ref{1091,,patch 데코레이터}는 여기서 테스트 중인 모듈에서 @code{date} 클래스를 모킹하는 데 사용됩니다. 그런 다음 모의 date 클래스의 @ref{466a,,side_effect} 어트리뷰트는 실제 날짜를 반환하는 람다 함수로 설정됩니다. 모의 date 클래스가 호출되면 진짜 date가 생성되어 @code{side_effect}에 의해 반환됩니다.

@example
>>> import datetime as dt
>>> with patch('mymodule.date') as mock_date:
...     mock_date.today.return_value = dt.date(2010, 10, 8)
...     mock_date.side_effect = lambda *args, **kw: dt.date(*args, **kw)
...
...     assert mymodule.date.today() == dt.date(2010, 10, 8)
...     assert mymodule.date(2009, 6, 8) == dt.date(2009, 6, 8)
@end example

@ref{1fa,,datetime.date}를 전역적으로 패치하지 않았음에 유의하십시오. @code{date}를 `사용하는' 모듈에서 패치했습니다. @ref{466b,,패치할 곳}을 참조하십시오.

@code{date.today()}가 호출되면 알려진 날짜가 반환되지만, @code{date(...)} 생성자에 대한 호출은 여전히 일반 date를 반환합니다. 이렇게 하지 않으면 테스트 중인 코드와 정확히 같은 알고리즘을 사용하여 예상 결과를 계산해야 할 수 있습니다, 이는 고전적인 테스트 안티 패턴입니다.

date 생성자에 대한 호출은 @code{mock_date} 어트리뷰트(@code{call_count}와 그 친구들)에 기록되며 테스트에 유용할 수 있습니다.

date나 기타 내장 클래스 모킹을 처리하는 다른 방법은 이 블로그 페이지@footnote{https://williambert.online/2011/07/how-to-unit-testing-in-django-with-mocking-and-patching/}에서 다루고 있습니다.

@node Mocking a generator method,모든 테스트 메서드에 같은 패치 적용하기,부분 모킹,Further examples
@anchor{library/unittest mock-examples mocking-a-generator-method}@anchor{46ca}
@subsubsection Mocking a generator method


파이썬 제너레이터는 @ref{bc1,,yield} 문을 사용하는 함수나 메서드로, 이터레이트 할 때 일련의 값을 반환합니다 @footnote{
제너레이터 표현식과 제너레이터의 더 @uref{http://www.dabeaz.com/coroutines/index.html,고급 사용}도 있지만, 여기서는 다루지 않습니다. 제너레이터와 이것이 얼마나 강력한지에 대한 아주 좋은 소개: @uref{http://www.dabeaz.com/generators/,Generator Tricks for Systems Programmers}.
}.

제너레이터 메서드 / 함수가 호출되면 제너레이터 객체를 반환합니다. 이터레이트 하는 대상은 제너레이터 객체입니다. 이터레이션을 위한 프로토콜 메서드는 @ref{20a8,,__iter__()}이고, @ref{108e,,MagicMock}을 사용하여 이를 모킹 할 수 있습니다.

다음은 제너레이터로 구현된 “iter” 메서드를 갖는 예제 클래스입니다:

@example
>>> class Foo:
...     def iter(self):
...         for i in [1, 2, 3]:
...             yield i
...
>>> foo = Foo()
>>> list(foo.iter())
[1, 2, 3]
@end example

이 클래스, 특히 “iter” 메서드를 어떻게 모킹할까요?

이터레이션(@ref{24d,,list} 호출로 인해 묵시적으로 이루어집니다)에서 반환된 값을 구성하려면, @code{foo.iter()} 호출에 의해 반환된 객체를 구성해야 합니다.

@example
>>> mock_foo = MagicMock()
>>> mock_foo.iter.return_value = iter([1, 2, 3])
>>> list(mock_foo.iter())
[1, 2, 3]
@end example

@node 모든 테스트 메서드에 같은 패치 적용하기,Mocking unbound methods,Mocking a generator method,Further examples
@anchor{library/unittest mock-examples applying-the-same-patch-to-every-test-method}@anchor{46cb}
@subsubsection 모든 테스트 메서드에 같은 패치 적용하기


여러 테스트 메서드에 대해 여러 패치를 적용하려면 모든 메서드에 패치 데코레이터를 적용하는 것이 가장 확실한 방법입니다. 이것은 불필요한 반복처럼 느낄 수 있습니다. 대신, @ref{1091,,patch()}(이것의 모든 다양한 형태)를 클래스 데코레이터로 사용할 수 있습니다. 이것은 클래스의 모든 테스트 메서드에 패치를 적용합니다. 테스트 메서드는 이름이 @code{test}로 시작하는 메서드로 식별됩니다:

@example
>>> @@patch('mymodule.SomeClass')
... class MyTest(unittest.TestCase):
...
...     def test_one(self, MockSomeClass):
...         self.assertIs(mymodule.SomeClass, MockSomeClass)
...
...     def test_two(self, MockSomeClass):
...         self.assertIs(mymodule.SomeClass, MockSomeClass)
...
...     def not_a_test(self):
...         return 'something'
...
>>> MyTest('test_one').test_one()
>>> MyTest('test_two').test_two()
>>> MyTest('test_two').not_a_test()
'something'
@end example

패치를 관리하는 다른 방법은 @ref{469d,,패처 메서드; start와 stop}을 사용하는 것입니다. 이를 통해 패치를 @code{setUp}과 @code{tearDown} 메서드로 옮길 수 있습니다.

@example
>>> class MyTest(unittest.TestCase):
...     def setUp(self):
...         self.patcher = patch('mymodule.foo')
...         self.mock_foo = self.patcher.start()
...
...     def test_foo(self):
...         self.assertIs(mymodule.foo, self.mock_foo)
...
...     def tearDown(self):
...         self.patcher.stop()
...
>>> MyTest('test_foo').run()
@end example

이 기법을 사용하면 @code{stop}을 호출하여 패치가 “실행 취소”되도록 해야 합니다. setUp에서 예외가 발생하면 tearDown이 호출되지 않기 때문에, 생각보다 복잡할 수 있습니다. @ref{c73,,unittest.TestCase.addCleanup()}은 이것을 더 쉽게 만듭니다:

@example
>>> class MyTest(unittest.TestCase):
...     def setUp(self):
...         patcher = patch('mymodule.foo')
...         self.addCleanup(patcher.stop)
...         self.mock_foo = patcher.start()
...
...     def test_foo(self):
...         self.assertIs(mymodule.foo, self.mock_foo)
...
>>> MyTest('test_foo').run()
@end example

@node Mocking unbound methods,모의 객체로 여러 호출 확인하기,모든 테스트 메서드에 같은 패치 적용하기,Further examples
@anchor{library/unittest mock-examples mocking-unbound-methods}@anchor{46cc}
@subsubsection Mocking unbound methods


Sometimes a test needs to patch an `unbound method', which means patching the
method on the class rather than on the instance. In order to make assertions
about which objects were calling this particular method, you need to pass
@code{self} as the first argument. The issue is that you can’t patch with a mock for
this, because if you replace an unbound method with a mock it doesn’t become
a bound method when fetched from the instance, and so it doesn’t get @code{self}
passed in. The workaround is to patch the unbound method with a real function
instead. The @ref{1091,,patch()} decorator makes it so simple to patch out methods
with a mock that having to create a real function becomes a nuisance.

If you pass @code{autospec=True} to patch then it does the patching with a
`real' function object. This function object has the same signature as the one
it is replacing, but delegates to a mock under the hood. You still get your
mock auto-created in exactly the same way as before. What it means though, is
that if you use it to patch out an unbound method on a class the mocked
function will be turned into a bound method if it is fetched from an instance.
It will have @code{self} passed in as the first argument, which is exactly what
was needed:

@example
>>> class Foo:
...   def foo(self):
...     pass
...
>>> with patch.object(Foo, 'foo', autospec=True) as mock_foo:
...   mock_foo.return_value = 'foo'
...   foo = Foo()
...   foo.foo()
...
'foo'
>>> mock_foo.assert_called_once_with(foo)
@end example

@code{autospec=True}를 사용하지 않으면 연결되지 않은 메서드가 대신 Mock 인스턴스로 패치되고, @code{self}로 호출되지 않습니다.

@node 모의 객체로 여러 호출 확인하기,가변 인자에 대처하기,Mocking unbound methods,Further examples
@anchor{library/unittest mock-examples checking-multiple-calls-with-mock}@anchor{46cd}
@subsubsection 모의 객체로 여러 호출 확인하기


mock에는 모의 객체가 어떻게 사용되는지에 대한 어서션을 만드는 데 유용한 API가 있습니다.

@example
>>> mock = Mock()
>>> mock.foo_bar.return_value = None
>>> mock.foo_bar('baz', spam='eggs')
>>> mock.foo_bar.assert_called_with('baz', spam='eggs')
@end example

모의 객체가 한 번만 호출되면 @ref{178a,,call_count}가 1이라는 것도 어서트하는 @ref{4674,,assert_called_once_with()} 메서드를 사용할 수 있습니다.

@example
>>> mock.foo_bar.assert_called_once_with('baz', spam='eggs')
>>> mock.foo_bar()
>>> mock.foo_bar.assert_called_once_with('baz', spam='eggs')
Traceback (most recent call last):
    ...
AssertionError: Expected 'foo_bar' to be called once. Called 2 times.
Calls: [call('baz', spam='eggs'), call()].
@end example

@code{assert_called_with}와 @code{assert_called_once_with}는 모두 `가장 최근' 호출에 대한 어서션을 합니다. 모의 객체가 여러 번 호출될 것이고, 이 호출 `모두'에 대해 어서션을 하고 싶다면 @ref{467d,,call_args_list}를 사용할 수 있습니다:

@example
>>> mock = Mock(return_value=None)
>>> mock(1, 2, 3)
>>> mock(4, 5, 6)
>>> mock()
>>> mock.call_args_list
[call(1, 2, 3), call(4, 5, 6), call()]
@end example

@ref{1db0,,call} 도우미를 사용하면 이러한 호출에 대한 어서션을 쉽게 할 수 있습니다. 예상 호출 리스트를 만들어서 @code{call_args_list}와 비교할 수 있습니다. 이것은 @code{call_args_list}의 repr과 매우 유사합니다:

@example
>>> expected = [call(1, 2, 3), call(4, 5, 6), call()]
>>> mock.call_args_list == expected
True
@end example

@node 가변 인자에 대처하기,Nesting patches,모의 객체로 여러 호출 확인하기,Further examples
@anchor{library/unittest mock-examples coping-with-mutable-arguments}@anchor{46ce}
@subsubsection 가변 인자에 대처하기


드물지만 여러분을 괴롭힐 수 있는 또 다른 상황은 모의 객체가 가변 인자로 호출되는 경우입니다. @code{call_args}와 @code{call_args_list}는 인자에 대한 `참조'를 저장합니다. 테스트 중인 코드에 의해 인자가 변경되면 모의 객체가 호출되었을 때의 값에 대해 더는 어서션 할 수 없습니다.

다음은 문제를 보여주는 예제 코드입니다. ‘mymodule’에 정의된 다음 함수를 상상해보십시오:

@example
def frob(val):
    pass

def grob(val):
    "먼저 frob 한 다음 val을 clear 합니다"
    frob(val)
    val.clear()
@end example

@code{grob}이 올바른 인자로 @code{frob}을 호출하는지 테스트하려고 할 때 어떤 일이 발생하는지 보십시오:

@example
>>> with patch('mymodule.frob') as mock_frob:
...     val = @{6@}
...     mymodule.grob(val)
...
>>> val
set()
>>> mock_frob.assert_called_with(@{6@})
Traceback (most recent call last):
    ...
AssertionError: Expected: ((@{6@},), @{@})
Called with: ((set(),), @{@})
@end example

한가지 가능성은 모의 객체가 전달한 인자를 복사하는 것일 수 있습니다. 그러면 동일성(equality)을 위해 객체 아이덴티티에 의존하는 어서션을 수행하면 문제가 발생할 수 있습니다.

여기에 @ref{466a,,side_effect} 함수를 사용하는 한 가지 해결책이 있습니다. 모의 객체에 @code{side_effect} 함수를 제공하면 모의 객체와 같은 인자로 @code{side_effect}가 호출됩니다. 이는 인자를 복사하여 나중에 어서션을 위해 저장할 기회를 제공합니다. 이 예제에서는 `다른' 모의 객체를 사용하여 인자를 저장해서 어서션을 수행하기 위해 모의 객체 메서드를 사용할 수 있습니다. 다시 한번 도우미 함수가 이것을 설정합니다.

@example
>>> from copy import deepcopy
>>> from unittest.mock import Mock, patch, DEFAULT
>>> def copy_call_args(mock):
...     new_mock = Mock()
...     def side_effect(*args, **kwargs):
...         args = deepcopy(args)
...         kwargs = deepcopy(kwargs)
...         new_mock(*args, **kwargs)
...         return DEFAULT
...     mock.side_effect = side_effect
...     return new_mock
...
>>> with patch('mymodule.frob') as mock_frob:
...     new_mock = copy_call_args(mock_frob)
...     val = @{6@}
...     mymodule.grob(val)
...
>>> new_mock.assert_called_with(@{6@})
>>> new_mock.call_args
call(@{6@})
@end example

@code{copy_call_args}는 호출될 모의로 호출됩니다. 어서션을 수행할 새로운 모의 객체를 반환합니다. @code{side_effect} 함수는 인자의 사본을 만들고 사본으로 @code{new_mock}을 호출합니다.

@cartouche
@quotation 참고 
모의 객체를 한 번만 사용하려는 경우 호출 시점에서 인자를 확인하는 쉬운 방법이 있습니다. 단순히 @code{side_effect} 함수 내에서 확인할 수 있습니다.

@example
>>> def side_effect(arg):
...     assert arg == @{6@}
...
>>> mock = Mock(side_effect=side_effect)
>>> mock(@{6@})
>>> mock(set())
Traceback (most recent call last):
    ...
AssertionError
@end example
@end quotation
@end cartouche

다른 접근법은 인자를 복사(@ref{d64,,copy.deepcopy()}를 사용해서)하는 @ref{c3d,,Mock}이나 @ref{108e,,MagicMock}의 서브 클래스를 만드는 것입니다. 구현 예는 다음과 같습니다:

@example
>>> from copy import deepcopy
>>> class CopyingMock(MagicMock):
...     def __call__(self, /, *args, **kwargs):
...         args = deepcopy(args)
...         kwargs = deepcopy(kwargs)
...         return super().__call__(*args, **kwargs)
...
>>> c = CopyingMock(return_value=None)
>>> arg = set()
>>> c(arg)
>>> arg.add(1)
>>> c.assert_called_with(set())
>>> c.assert_called_with(arg)
Traceback (most recent call last):
    ...
AssertionError: expected call not found.
Expected: mock(@{1@})
Actual: mock(set())
>>> c.foo
<CopyingMock name='mock.foo' id='...'>
@end example

@code{Mock}이나 @code{MagicMock}을 서브 클래싱할 때 모든 동적으로 만들어진 어트리뷰트와 @code{return_value}는 자동으로 서브 클래스를 사용합니다. 즉, @code{CopyingMock}의 모든 자식도 @code{CopyingMock} 형이 됩니다.

@node Nesting patches,MagicMock으로 딕셔너리 모킹하기,가변 인자에 대처하기,Further examples
@anchor{library/unittest mock-examples nesting-patches}@anchor{46cf}
@subsubsection Nesting patches


patch를 컨텍스트 관리자로 것이 멋지기는 하지만, 여러 패치를 수행하면 오른쪽으로 점점 더 들여쓰기 되는 문장으로 중첩될 수 있습니다:

@example
>>> class MyTest(unittest.TestCase):
...
...     def test_foo(self):
...         with patch('mymodule.Foo') as mock_foo:
...             with patch('mymodule.Bar') as mock_bar:
...                 with patch('mymodule.Spam') as mock_spam:
...                     assert mymodule.Foo is mock_foo
...                     assert mymodule.Bar is mock_bar
...                     assert mymodule.Spam is mock_spam
...
>>> original = mymodule.Foo
>>> MyTest('test_foo').test_foo()
>>> assert mymodule.Foo is original
@end example

unittest @code{cleanup} 함수와 @ref{469d,,패처 메서드; start와 stop}을 사용하면 중첩된 들여쓰기 없이 같은 효과를 얻을 수 있습니다. 간단한 도우미 메서드인 @code{create_patch}는 제 자리에서 패치를 설치하고 만들어진 모의 객체를 반환합니다:

@example
>>> class MyTest(unittest.TestCase):
...
...     def create_patch(self, name):
...         patcher = patch(name)
...         thing = patcher.start()
...         self.addCleanup(patcher.stop)
...         return thing
...
...     def test_foo(self):
...         mock_foo = self.create_patch('mymodule.Foo')
...         mock_bar = self.create_patch('mymodule.Bar')
...         mock_spam = self.create_patch('mymodule.Spam')
...
...         assert mymodule.Foo is mock_foo
...         assert mymodule.Bar is mock_bar
...         assert mymodule.Spam is mock_spam
...
>>> original = mymodule.Foo
>>> MyTest('test_foo').run()
>>> assert mymodule.Foo is original
@end example

@node MagicMock으로 딕셔너리 모킹하기,Mock 서브 클래스와 그 어트리뷰트,Nesting patches,Further examples
@anchor{library/unittest mock-examples mocking-a-dictionary-with-magicmock}@anchor{46d0}
@subsubsection MagicMock으로 딕셔너리 모킹하기


딕셔너리나 다른 컨테이너 객체를 모킹하여, 여전히 딕셔너리처럼 동작하면서 이에 대한 모든 액세스를 기록하고 싶을 수 있습니다.

딕셔너리처럼 동작하는 @ref{108e,,MagicMock}을 사용하고 @ref{466a,,side_effect}가 딕셔너리 액세스를 우리의 제어하에 있는 실제 하부 딕셔너리로 위임하게 해서 목적을 달성할 수 있습니다.

@code{MagicMock}의 @ref{588,,__getitem__()}과 @ref{14d0,,__setitem__()} 메서드가 호출될 때 (일반 딕셔너리 액세스), @code{side_effect}는 키로 호출됩니다 (그리고 @code{__setitem__}의 경우는 값도). 반환되는 것을 제어 할 수도 있습니다.

@code{MagicMock}이 사용된 후에 @ref{467d,,call_args_list}와 같은 어트리뷰트를 사용하여 딕셔너리가 어떻게 사용되었는지를 어서트할 수 있습니다:

@example
>>> my_dict = @{'a': 1, 'b': 2, 'c': 3@}
>>> def getitem(name):
...      return my_dict[name]
...
>>> def setitem(name, val):
...     my_dict[name] = val
...
>>> mock = MagicMock()
>>> mock.__getitem__.side_effect = getitem
>>> mock.__setitem__.side_effect = setitem
@end example

@cartouche
@quotation 참고 
@code{MagicMock}을 사용하는 대신 @code{Mock}을 사용하고 `오직' 원하는 매직 메서드만 제공할 수 있습니다:

@example
>>> mock = Mock()
>>> mock.__getitem__ = Mock(side_effect=getitem)
>>> mock.__setitem__ = Mock(side_effect=setitem)
@end example

`세 번째' 옵션은 @code{MagicMock}을 사용하지만, @code{dict}를 `spec' (또는 `spec_set') 인자로 전달하여 만들어진 @code{MagicMock}이 딕셔너리 매직 메서드 만 갖도록 하는 것입니다:

@example
>>> mock = MagicMock(spec_set=dict)
>>> mock.__getitem__.side_effect = getitem
>>> mock.__setitem__.side_effect = setitem
@end example
@end quotation
@end cartouche

이러한 부작용 함수가 제자리에 들어가면, @code{mock}은 일반 딕셔너리처럼 작동하지만, 액세스를 기록합니다. 존재하지 않는 키에 액세스하려고 하면 @ref{5e5,,KeyError}를 발생시키기조차 합니다.

@example
>>> mock['a']
1
>>> mock['c']
3
>>> mock['d']
Traceback (most recent call last):
    ...
KeyError: 'd'
>>> mock['b'] = 'fish'
>>> mock['d'] = 'eggs'
>>> mock['b']
'fish'
>>> mock['d']
'eggs'
@end example

사용된 후에 일반적인 모의 객체 메서드와 어트리뷰트를 사용하여 액세스에 대한 어서션을 할 수 있습니다:

@example
>>> mock.__getitem__.call_args_list
[call('a'), call('c'), call('d'), call('b'), call('d')]
>>> mock.__setitem__.call_args_list
[call('b', 'fish'), call('d', 'eggs')]
>>> my_dict
@{'a': 1, 'b': 'fish', 'c': 3, 'd': 'eggs'@}
@end example

@node Mock 서브 클래스와 그 어트리뷰트,patch dict로 임포트를 모킹하기,MagicMock으로 딕셔너리 모킹하기,Further examples
@anchor{library/unittest mock-examples mock-subclasses-and-their-attributes}@anchor{46d1}
@subsubsection Mock 서브 클래스와 그 어트리뷰트


@ref{c3d,,Mock}을 서브 클래싱하려는 여러 가지 이유가 있습니다. 한 가지 이유는 도우미 메서드를 추가하는 것입니다. 다음은 시시한 예입니다:

@example
>>> class MyMock(MagicMock):
...     def has_been_called(self):
...         return self.called
...
>>> mymock = MyMock(return_value=None)
>>> mymock
<MyMock id='...'>
>>> mymock.has_been_called()
False
>>> mymock()
>>> mymock.has_been_called()
True
@end example

@code{Mock} 인스턴스의 표준 동작은 어트리뷰트와 반환 값 모의 객체가 액세스 되는 모의 객체의 형과 같은 형이라는 것입니다. 이를 통해 @code{Mock} 어트리뷰트는 @code{Mock}이고 @code{MagicMock} 어트리뷰트는 @code{MagicMock}이 됩니다 @footnote{
이 규칙의 예외는 콜러블이 아닌 모의 객체입니다. 어트리뷰트는 콜러블 변형을 사용하는데, 그렇지 않으면 콜러블이 아닌 모의 객체가 콜러블 메서드를 가질 수 없기 때문입니다.
}. 따라서 도우미 메서드를 추가하기 위해 서브 클래싱하면 이 메서드는 서브 클래스 인스턴스의 어트리뷰트와 반환 값 모의 객체에서도 사용할 수 있습니다.

@example
>>> mymock.foo
<MyMock name='mock.foo' id='...'>
>>> mymock.foo.has_been_called()
False
>>> mymock.foo()
<MyMock name='mock.foo()' id='...'>
>>> mymock.foo.has_been_called()
True
@end example

때때로 이것은 불편합니다. 예를 들어, 한 사용자@footnote{https://code.google.com/archive/p/mock/issues/105}가 Twisted adaptor@footnote{https://twisted.org/documents/11.0.0/api/twisted.python.components.html} 를 만들기 위해 Mock을 서브 클래싱했습니다. 이것을 어트리뷰트에도 적용하면 실제로 에러가 발생합니다.

@code{Mock}(이것의 모든 종류에서)은 @code{_get_child_mock}이라는 메서드를 사용하여 어트리뷰트와 반환 값을 위한 이러한 “서브 모의 객체”를 만듭니다. 이 메서드를 재정의하여 서브 클래스가 어트리뷰트에 사용되지 않도록 할 수 있습니다. 서명은 모의 객체 생성자에 전달되는 임의의 키워드 인자(@code{**kwargs})를 취하는 것입니다:

@example
>>> class Subclass(MagicMock):
...     def _get_child_mock(self, /, **kwargs):
...         return MagicMock(**kwargs)
...
>>> mymock = Subclass()
>>> mymock.foo
<MagicMock name='mock.foo' id='...'>
>>> assert isinstance(mymock, Subclass)
>>> assert not isinstance(mymock.foo, Subclass)
>>> assert not isinstance(mymock(), Subclass)
@end example

@node patch dict로 임포트를 모킹하기,호출 순서 추적과 덜 상세한 호출 어서션,Mock 서브 클래스와 그 어트리뷰트,Further examples
@anchor{library/unittest mock-examples mocking-imports-with-patch-dict}@anchor{46d2}
@subsubsection patch.dict로 임포트를 모킹하기


모킹이 어려울 수 있는 한 가지 상황은 함수 내부에 지역 임포트가 있는 경우입니다. 이것들은 모킹하기가 더 어려운데, 우리가 패치 할 수 있는 모듈 이름 공간의 객체를 사용하지 않기 때문입니다.

일반적으로 지역 임포트는 피해야 합니다. 그것들은 때때로 순환 의존성을 막기 위해 수행되는데, `보통' 문제를 해결하는 더 좋은 방법(코드를 리팩터 하십시오)이 있습니다. 또는 임포트를 지연시켜서 “선불 비용”을 방지하기 위해 수행합니다. 이 또한 무조건적인 지역 임포트보다 더 나은 방법으로 해결할 수 있습니다 (모듈을 클래스나 모듈 어트리뷰트로 저장하고 처음 사용할 때만 임포트 합니다).

그 외에도 @code{mock}을 사용하여 임포트 결과에 영향을 주는 방법이 있습니다. 임포트는 @ref{17ea,,sys.modules} 딕셔너리에서 `객체'를 가져옵니다. `객체'를 가져온다는 것에 유의하십시오, 이것이 모듈일 필요는 없습니다. 처음으로 모듈을 임포트 하면 @code{sys.modules}에 모듈 객체가 배치되어서, 일반적으로 무언가를 임포트 할 때 모듈을 다시 받습니다. 그러나 반드시 그런 것은 아닙니다.

즉, @ref{1968,,patch.dict()}를 사용하여 `임시로' @ref{17ea,,sys.modules}에 모의 객체를 넣을 수 있습니다. 이 패치가 활성화되어있는 동안 모든 임포트는 모의 객체를 가져옵니다. 패치가 완료되면 (데코레이트 된 함수가 종료되거나, with 문 본문이 완료되거나 @code{patcher.stop()}이 호출되면) 이전에 있던 모든 것이 안전하게 복원됩니다.

다음은 ‘fooble’ 모듈을 모킹하는 예입니다.

@example
>>> import sys
>>> mock = Mock()
>>> with patch.dict('sys.modules', @{'fooble': mock@}):
...    import fooble
...    fooble.blob()
...
<Mock name='mock.blob()' id='...'>
>>> assert 'fooble' not in sys.modules
>>> mock.blob.assert_called_once_with()
@end example

보시다시피 @code{import fooble}은 성공하지만, 끝났을 때 @ref{17ea,,sys.modules}에는 ‘fooble’이 남아 있지 않습니다.

이것은 @code{from module import name} 형식에서도 작동합니다:

@example
>>> mock = Mock()
>>> with patch.dict('sys.modules', @{'fooble': mock@}):
...    from fooble import blob
...    blob.blip()
...
<Mock name='mock.blob.blip()' id='...'>
>>> mock.blob.blip.assert_called_once_with()
@end example

약간의 추가 작업으로 패키지 임포트를 모킹 할 수도 있습니다:

@example
>>> mock = Mock()
>>> modules = @{'package': mock, 'package.module': mock.module@}
>>> with patch.dict('sys.modules', modules):
...    from package.module import fooble
...    fooble()
...
<Mock name='mock.module.fooble()' id='...'>
>>> mock.module.fooble.assert_called_once_with()
@end example

@node 호출 순서 추적과 덜 상세한 호출 어서션,더 복잡한 인자 일치,patch dict로 임포트를 모킹하기,Further examples
@anchor{library/unittest mock-examples tracking-order-of-calls-and-less-verbose-call-assertions}@anchor{46d3}
@subsubsection 호출 순서 추적과 덜 상세한 호출 어서션


@ref{c3d,,Mock} 클래스를 사용하면 @ref{4678,,method_calls} 어트리뷰트를 통해 모의 객체에서 메서드 호출의 `순서'를 추적할 수 있습니다. 개별 모의 객체 간의 호출 순서를 추적할 수는 없지만, @ref{4676,,mock_calls}를 사용하여 같은 효과를 얻을 수 있습니다.

모의 객체들은 @code{mock_calls}에서 자식 모의 객체에 대한 호출을 추적하고, 모의 객체의 임의 어트리뷰트에 액세스하면 자식 모의 객체를 만들기 때문에, 부모 모의 객체로부터 개별 모의 객체를 만들 수 있습니다. 그러면 해당 자식 모의 객체에 대한 호출은 부모의 @code{mock_calls}에 순서대로 기록됩니다:

@example
>>> manager = Mock()
>>> mock_foo = manager.foo
>>> mock_bar = manager.bar
@end example

@example
>>> mock_foo.something()
<Mock name='mock.foo.something()' id='...'>
>>> mock_bar.other.thing()
<Mock name='mock.bar.other.thing()' id='...'>
@end example

@example
>>> manager.mock_calls
[call.foo.something(), call.bar.other.thing()]
@end example

그런 다음 관리자 모의 객체의 @code{mock_calls} 어트리뷰트와 비교하여 순서를 포함하여 호출에 대해 어서션 할 수 있습니다:

@example
>>> expected_calls = [call.foo.something(), call.bar.other.thing()]
>>> manager.mock_calls == expected_calls
True
@end example

@code{patch}가 모의 객체를 만들고 제자리에 배치하는 경우, @ref{1956,,attach_mock()} 메서드를 사용하여 모의 객체를 관리자 모의 객체에 연결할 수 있습니다. 연결 후 호출은 관리자의 @code{mock_calls}에 기록됩니다.

@example
>>> manager = MagicMock()
>>> with patch('mymodule.Class1') as MockClass1:
...     with patch('mymodule.Class2') as MockClass2:
...         manager.attach_mock(MockClass1, 'MockClass1')
...         manager.attach_mock(MockClass2, 'MockClass2')
...         MockClass1().foo()
...         MockClass2().bar()
<MagicMock name='mock.MockClass1().foo()' id='...'>
<MagicMock name='mock.MockClass2().bar()' id='...'>
>>> manager.mock_calls
[call.MockClass1(),
call.MockClass1().foo(),
call.MockClass2(),
call.MockClass2().bar()]
@end example

많은 호출이 이루어졌지만, 특정 시퀀스에만 관심이 있다면 대안은 @ref{1a22,,assert_has_calls()} 메서드를 사용하는 것입니다. 이것은 호출 리스트를 취합니다 (@ref{1db0,,call} 객체로 구성됩니다). 해당 호출 시퀀스가 @ref{4676,,mock_calls}에 있으면 어서션이 성공합니다.

@example
>>> m = MagicMock()
>>> m().foo().bar().baz()
<MagicMock name='mock().foo().bar().baz()' id='...'>
>>> m.one().two().three()
<MagicMock name='mock.one().two().three()' id='...'>
>>> calls = call.one().two().three().call_list()
>>> m.assert_has_calls(calls)
@end example

연쇄 호출 @code{m.one().two().three()}가 모의 객체에 대한 호출의 전부는 아니지만, 어서션이 여전히 성공합니다.

때로는 모의 객체에 여러 번의 호출이 있을 수 있고, 그 호출들의 `일부'에 대만 어서션에만 관심이 있을 수 있습니다. 순서에 신경 쓰지 않을 수도 있습니다. 이 경우 @code{any_order=True}를 @code{assert_has_calls}로 전달할 수 있습니다:

@example
>>> m = MagicMock()
>>> m(1), m.two(2, 3), m.seven(7), m.fifty('50')
(...)
>>> calls = [call.fifty('50'), call(1), call.seven(7)]
>>> m.assert_has_calls(calls, any_order=True)
@end example

@node 더 복잡한 인자 일치,,호출 순서 추적과 덜 상세한 호출 어서션,Further examples
@anchor{library/unittest mock-examples more-complex-argument-matching}@anchor{46d4}
@subsubsection 더 복잡한 인자 일치


@ref{1dae,,ANY}와 같은 기본 개념을 사용하여 모의 객체에 인자로 사용되는 객체에 대해 더 복잡한 어서션을 수행하도록 매처(matchers)를 구현할 수 있습니다.

기본적으로 객체 아이덴티티에 기반하여 를 기준으로 같다고 비교되는 (이것이 사용자 정의 클래스의 파이썬 기본 동작입니다) 어떤 객체가 모의 객체로 전달되기를 기대한다고 가정합시다. @ref{1e00,,assert_called_with()}를 사용하려면 정확히 같은 객체를 전달해야 합니다. 이 객체의 일부 어트리뷰트에만 관심이 있다면 이러한 어트리뷰트를 확인하는 매처를 만들 수 있습니다.

이 예에서 @code{assert_called_with}에 대한 ‘표준’ 호출이 충분하지 않다는 것을 볼 수 있습니다:

@example
>>> class Foo:
...     def __init__(self, a, b):
...         self.a, self.b = a, b
...
>>> mock = Mock(return_value=None)
>>> mock(Foo(1, 2))
>>> mock.assert_called_with(Foo(1, 2))
Traceback (most recent call last):
    ...
AssertionError: expected call not found.
Expected: mock(<__main__.Foo object at 0x...>)
Actual: mock(<__main__.Foo object at 0x...>)
@end example

@code{Foo} 클래스를 위한 비교 함수는 다음과 같습니다:

@example
>>> def compare(self, other):
...     if not type(self) == type(other):
...         return False
...     if self.a != other.a:
...         return False
...     if self.b != other.b:
...         return False
...     return True
...
@end example

그리고 동등 비교 연산에 이와 같은 비교 함수를 사용할 수 있는 매처 객체는 다음과 같습니다:

@example
>>> class Matcher:
...     def __init__(self, compare, some_obj):
...         self.compare = compare
...         self.some_obj = some_obj
...     def __eq__(self, other):
...         return self.compare(self.some_obj, other)
...
@end example

이 모든 것을 종합하면:

@example
>>> match_foo = Matcher(compare, Foo(1, 2))
>>> mock.assert_called_with(match_foo)
@end example

@code{Matcher}는 compare 함수와 비교하려는 @code{Foo} 객체로 인스턴스 화 됩니다. @code{assert_called_with}에서는 @code{Matcher} 동등 비교 메서드가 호출되는데, 이 메서드는 모의 객체가 호출된 객체와 우리가 매처를 만들 때 제공한 객체를 비교합니다. 일치하면 @code{assert_called_with}가 통과하고, 그렇지 않으면 @ref{8b7,,AssertionError}가 발생합니다:

@example
>>> match_wrong = Matcher(compare, Foo(3, 4))
>>> mock.assert_called_with(match_wrong)
Traceback (most recent call last):
    ...
AssertionError: Expected: ((<Matcher object at 0x...>,), @{@})
Called with: ((<Foo object at 0x...>,), @{@})
@end example

약간의 조정만으로 비교 함수가 @ref{8b7,,AssertionError}를 직접 발생시키고 더 유용한 실패 메시지를 제공할 수 있습니다.

버전 1.5부터, 파이썬 테스트 라이브러리 PyHamcrest@footnote{https://pyhamcrest.readthedocs.io/}는 여기에서 유용할 수 있는 유사한 기능을 동등 비교 매처의 형태로 제공합니다 (hamcrest.library.integration.match_equality@footnote{https://pyhamcrest.readthedocs.io/en/release-1.8/integration/#module-hamcrest.library.integration.match_equality}).

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node test — 파이썬 용 회귀 테스트 패키지,test support — Utilities for the Python test suite,unittest mock — 시작하기,개발 도구
@anchor{library/test doc}@anchor{46d5}@anchor{library/test module-test}@anchor{e8}@anchor{library/test test-regression-tests-package-for-python}@anchor{46d6}@anchor{library/test translation-repo}@anchor{46d7}
@subsection @code{test} — 파이썬 용 회귀 테스트 패키지


@geindex module; test

@cartouche
@quotation 참고 
The @code{test} package is meant for internal use by Python only. It is
documented for the benefit of the core developers of Python. Any use of
this package outside of Python’s standard library is discouraged as code
mentioned here can change or be removed without notice between releases of
Python.
@end quotation
@end cartouche


__________________________________________________________________


The @code{test} package contains all regression tests for Python as well as the
modules @ref{ea,,test.support} and @ref{e9,,test.regrtest}.
@code{test.support} is used to enhance your tests while
@code{test.regrtest} drives the testing suite.

Each module in the @code{test} package whose name starts with @code{test_} is a
testing suite for a specific module or feature. All new tests should be written
using the @ref{10c,,unittest} or @ref{3e,,doctest} module.  Some older tests are
written using a “traditional” testing style that compares output printed to
@code{sys.stdout}; this style of test is considered deprecated.


@subsubheading 더 보기



@table @asis

@item 모듈 @ref{10c,,unittest}

PyUnit 회귀 테스트 작성.

@item 모듈 @ref{3e,,doctest}

독스트링에 포함된 테스트.
@end table


@menu
* Writing Unit Tests for the test package:: 
* 명령 줄 인터페이스를 사용하여 테스트 실행하기:: 

@end menu

@node Writing Unit Tests for the test package,명령 줄 인터페이스를 사용하여 테스트 실행하기,,test — 파이썬 용 회귀 테스트 패키지
@anchor{library/test writing-tests}@anchor{46d8}@anchor{library/test writing-unit-tests-for-the-test-package}@anchor{46d9}
@subsubsection Writing Unit Tests for the @code{test} package


@ref{10c,,unittest} 모듈을 사용하는 테스트는 몇 가지 지침을 따르는 것이 좋습니다. 하나는 테스트 모듈의 이름을 @code{test_}로 시작하고 테스트 중인 모듈의 이름으로 끝나도록 짓는 것입니다. 테스트 모듈의 테스트 메서드는 @code{test_}로 시작하고 메서드가 테스트하는 내용에 대한 설명으로 끝나야 합니다. 이는 테스트 드라이버가 메서드를 테스트 메서드로 인식하기 위해 필요합니다. 또한, 메서드에 대한 독스트링이 포함되어서는 안 됩니다. 주석(가령 @code{# Tests function returns only True or False})을 사용하여 테스트 메서드에 대한 설명을 제공해야 합니다. 이는 독스트링이 존재하면 이것이 인쇄되어 실행되는 테스트가 인쇄되지 않기 때문입니다.

기본 상용구가 자주 사용됩니다:

@example
import unittest
from test import support

class MyTestCase1(unittest.TestCase):

    # setUp()과 tearDown()은 필요할 때만 사용합니다

    def setUp(self):
        ... 테스트 준비를 위해 실행할 코드 ...

    def tearDown(self):
        ... 테스트 후 정리를 위해 실행할 코드 ...

    def test_feature_one(self):
        # feature one을 테스트합니다.
        ... 테스트 코드 ...

    def test_feature_two(self):
        # feature two를 테스트합니다.
        ... 테스트 코드 ...

    ... 더 많은 테스트 메서드 ...

class MyTestCase2(unittest.TestCase):
    ... MyTestCase1 과 같은 구조 ...

... 더 많은 테스트 클래스 ...

if __name__ == '__main__':
    unittest.main()
@end example

이 코드 패턴을 사용하면 @ref{e9,,test.regrtest}에서 자체적으로 @ref{10c,,unittest} CLI를 지원하는 스크립트로나 @code{python -m unittest} CLI를 통해 테스트 스위트를 실행할 수 있습니다.

회귀 테스트의 목표는 코드를 깨려고 시도하는 것입니다. 이는 따라야 할 몇 가지 지침으로 이어집니다:


@itemize *

@item 
테스트 스위트는 모든 클래스, 함수 및 상수를 괴롭혀야 합니다. 여기에는 외부 세계에 제공되는 외부 API뿐만 아니라 “내부(private)” 코드도 포함됩니다.

@item 
화이트 박스 테스트 (테스트 작성 시 테스트 중인 코드 검사)가 선호됩니다. 블랙박스 테스트(게시된 사용자 인터페이스 만 테스트)는 모든 경계와 에지 케이스가 테스트 되었는지 확인하기에 충분하지 않습니다.

@item 
유효하지 않은 값을 포함하여 가능한 모든 값이 테스트 되었는지 확인하십시오. 이렇게 하면 모든 유효한 값이 받아들여질 뿐만 아니라 부적절한 값이 올바르게 처리되었는지 확인하게 됩니다.

@item 
가능한 한 많은 코드 경로를 소진하십시오. 분기가 발생하는 위치를 테스트하고 입력을 조정하여 코드에서 여러 경로가 사용되는지 확인합니다.

@item 
테스트 된 코드에 대해 발견된 버그에 대한 명시적 테스트를 추가합니다. 이렇게 하면 나중에 코드가 변경되어도 에러가 다시 발생하는지 확인합니다.

@item 
테스트 후에 정리해야 합니다 (가령 모든 임시 파일 닫고 제거하기).

@item 
테스트가 운영 체제의 특정 조건에 의존하면 테스트를 시도하기 전에 조건이 이미 존재하는지 확인하십시오.

@item 
가능한 한 적은 수의 모듈을 임포트 하고 가능한 한 빨리 수행하십시오. 이렇게 하면 테스트의 외부 종속성이 최소화되고 모듈 임포트의 부작용에 따른 비정상적인 동작이 최소화됩니다.

@item 
코드 재사용을 극대화하십시오. 때에 따라, 테스트는 사용되는 입력 유형에 따라 조금씩 달라집니다. 입력을 지정하는 클래스로 기본 테스트 클래스를 서브 클래싱하여 코드 중복을 최소화합니다:

@example
class TestFuncAcceptsSequencesMixin:

    func = mySuperWhammyFunction

    def test_func(self):
        self.func(self.arg)

class AcceptLists(TestFuncAcceptsSequencesMixin, unittest.TestCase):
    arg = [1, 2, 3]

class AcceptStrings(TestFuncAcceptsSequencesMixin, unittest.TestCase):
    arg = 'abc'

class AcceptTuples(TestFuncAcceptsSequencesMixin, unittest.TestCase):
    arg = (1, 2, 3)
@end example

이 패턴을 사용할 때, @ref{2b3,,unittest.TestCase}를 상속한 모든 클래스가 테스트로 실행된다는 점을 기억하십시오. 위 예제의 @code{TestFuncAcceptsSequencesMixin} 클래스는 데이터가 없어서 자체적으로 실행할 수 없기 때문에, @code{unittest.TestCase}를 상속하지 않습니다.
@end itemize


@subsubheading 더 보기



@table @asis

@item 테스트 주도 개발(Test Driven Development)

코드 전에 테스트를 작성하는 것에 관한 Kent Beck의 책.
@end table


@node 명령 줄 인터페이스를 사용하여 테스트 실행하기,,Writing Unit Tests for the test package,test — 파이썬 용 회귀 테스트 패키지
@anchor{library/test module-test regrtest}@anchor{e9}@anchor{library/test regrtest}@anchor{1208}@anchor{library/test running-tests-using-the-command-line-interface}@anchor{46da}
@subsubsection 명령 줄 인터페이스를 사용하여 테스트 실행하기


@geindex module; test.regrtest

The @code{test} package can be run as a script to drive Python’s regression
test suite, thanks to the @ref{23c,,-m} option: @code{python -m test}. Under
the hood, it uses @code{test.regrtest}; the call @code{python -m
test.regrtest} used in previous Python versions still works.  Running the
script by itself automatically starts running all regression tests in the
@code{test} package. It does this by finding all modules in the package whose
name starts with @code{test_}, importing them, and executing the function
@code{test_main()} if present or loading the tests via
unittest.TestLoader.loadTestsFromModule if @code{test_main} does not exist.  The
names of tests to execute may also be passed to the script. Specifying a single
regression test (@code{python -m test test_spam}) will minimize output and
only print whether the test passed or failed.

Running @code{test} directly allows what resources are available for
tests to use to be set. You do this by using the @code{-u} command-line
option. Specifying @code{all} as the value for the @code{-u} option enables all
possible resources: @code{python -m test -uall}.
If all but one resource is desired (a more common case), a
comma-separated list of resources that are not desired may be listed after
@code{all}. The command @code{python -m test -uall,-audio,-largefile}
will run @code{test} with all resources except the @code{audio} and
@code{largefile} resources. For a list of all resources and more command-line
options, run @code{python -m test -h}.

회귀 테스트를 실행하는 다른 방법은 테스트가 실행되는 플랫폼에 따라 다릅니다. 유닉스에서는, 파이썬이 빌드된 최상위 디렉터리에서 @code{make test}를 실행할 수 있습니다. 윈도우에서는, @code{PCbuild} 디렉터리에서 @code{rt.bat}을 실행하면 모든 회귀 테스트가 실행됩니다.


Added in version 3.14: Output is colorized by default and can be
@ref{1b7,,controlled using environment variables}.


@node test support — Utilities for the Python test suite,test support socket_helper — Utilities for socket tests,test — 파이썬 용 회귀 테스트 패키지,개발 도구
@anchor{library/test module-test support}@anchor{ea}@anchor{library/test test-support-utilities-for-the-python-test-suite}@anchor{46db}
@subsection @code{test.support} — Utilities for the Python test suite


@geindex module; test.support

The @code{test.support} module provides support for Python’s regression
test suite.

@cartouche
@quotation 참고 
@code{test.support} is not a public module.  It is documented here to help
Python developers write tests.  The API of this module is subject to change
without backwards compatibility concerns between releases.
@end quotation
@end cartouche

이 모듈은 다음 예외를 정의합니다:

@geindex TestFailed
@anchor{library/test test support TestFailed}@anchor{46dc}
@deffn {예외} test.support.TestFailed

테스트가 실패할 때 발생하는 예외. 이것은 폐지되었고 @ref{10c,,unittest} 기반 테스트와 @ref{2b3,,unittest.TestCase}의 어서션 메서드로 대체합니다.
@end deffn

@geindex ResourceDenied
@anchor{library/test test support ResourceDenied}@anchor{46dd}
@deffn {예외} test.support.ResourceDenied

@ref{11e3,,unittest.SkipTest}의 서브 클래스. 리소스(가령 네트워크 연결)를 사용할 수 없을 때 발생합니다. @ref{46de,,requires()} 함수에 의해 발생합니다.
@end deffn

The @code{test.support} module defines the following constants:

@geindex verbose (test.support 모듈)
@anchor{library/test test support verbose}@anchor{46df}
@deffn {데이터} test.support.verbose

상세 출력이 활성화될 때 @code{True}. 실행 중인 테스트에 대한 자세한 정보가 필요할 때 확인해야 합니다. `verbose'는 @ref{e9,,test.regrtest}에 의해 설정됩니다.
@end deffn

@geindex is_jython (test.support 모듈)
@anchor{library/test test support is_jython}@anchor{46e0}
@deffn {데이터} test.support.is_jython

실행 중인 인터프리터가 Jython이면 @code{True}.
@end deffn

@geindex is_android (test.support 모듈)
@anchor{library/test test support is_android}@anchor{46e1}
@deffn {데이터} test.support.is_android

@code{True} if @code{sys.platform} is @code{android}.
@end deffn

@geindex is_emscripten (test.support 모듈)
@anchor{library/test test support is_emscripten}@anchor{46e2}
@deffn {데이터} test.support.is_emscripten

@code{True} if @code{sys.platform} is @code{emscripten}.
@end deffn

@geindex is_wasi (test.support 모듈)
@anchor{library/test test support is_wasi}@anchor{46e3}
@deffn {데이터} test.support.is_wasi

@code{True} if @code{sys.platform} is @code{wasi}.
@end deffn

@geindex is_apple_mobile (test.support 모듈)
@anchor{library/test test support is_apple_mobile}@anchor{46e4}
@deffn {데이터} test.support.is_apple_mobile

@code{True} if @code{sys.platform} is @code{ios}, @code{tvos}, or @code{watchos}.
@end deffn

@geindex is_apple (test.support 모듈)
@anchor{library/test test support is_apple}@anchor{46e5}
@deffn {데이터} test.support.is_apple

@code{True} if @code{sys.platform} is @code{darwin} or @code{is_apple_mobile} is @code{True}.
@end deffn

@geindex unix_shell (test.support 모듈)
@anchor{library/test test support unix_shell}@anchor{46e6}
@deffn {데이터} test.support.unix_shell

윈도우가 아니면 셸 경로; 그렇지 않으면 @code{None}.
@end deffn

@geindex LOOPBACK_TIMEOUT (test.support 모듈)
@anchor{library/test test support LOOPBACK_TIMEOUT}@anchor{1d99}
@deffn {데이터} test.support.LOOPBACK_TIMEOUT

@code{127.0.0.1}과 같은 네트워크 로컬 루프 백 인터페이스에서 리스닝하는 네트워크 서버를 사용하는 테스트의 초 단위 제한 시간.

제한 시간은 테스트 실패를 방지 할 수 있을 만큼 깁니다: 클라이언트와 서버가 다른 스레드나 다른 프로세스에서 실행될 수 있다는 점을 고려합니다.

제한 시간은 @ref{fa0,,socket.socket}의 @ref{fa2,,connect()}, @ref{fa3,,recv()} 및 @ref{fa6,,send()} 메서드를 위해 충분히 길어야 합니다.

기본값은 5초입니다.

@ref{1d9a,,INTERNET_TIMEOUT}도 참조하십시오.
@end deffn

@geindex INTERNET_TIMEOUT (test.support 모듈)
@anchor{library/test test support INTERNET_TIMEOUT}@anchor{1d9a}
@deffn {데이터} test.support.INTERNET_TIMEOUT

인터넷으로 가는 네트워크 요청에 대한 초 단위 제한 시간.

어떤 이유로 든 인터넷 요청이 블록 되면 테스트가 너무 오래 기다리지 않을 만큼 제한 시간이 적당히 짧습니다.

일반적으로, @ref{1d9a,,INTERNET_TIMEOUT}을 사용하는 시간 초과는 테스트를 실패로 표시해서는 안 되며, 대신 테스트를 건너뜁니다: @ref{46e7,,transient_internet()}을 참조하십시오.

기본값은 1분입니다.

@ref{1d99,,LOOPBACK_TIMEOUT}도 참조하십시오.
@end deffn

@geindex SHORT_TIMEOUT (test.support 모듈)
@anchor{library/test test support SHORT_TIMEOUT}@anchor{1c61}
@deffn {데이터} test.support.SHORT_TIMEOUT

테스트가 “너무 오래” 걸리면 테스트를 실패로 표시하는 초 단위 제한 시간.

제한 시간 값은 regrtest @code{--timeout} 명령 줄 옵션에 따라 다릅니다.

@ref{1c61,,SHORT_TIMEOUT}을 사용하는 테스트가 느린 빌드 봇에서 무작위로 실패하기 시작하면, 대신 @ref{1d9b,,LONG_TIMEOUT}을 사용합니다.

기본값은 30초입니다.
@end deffn

@geindex LONG_TIMEOUT (test.support 모듈)
@anchor{library/test test support LONG_TIMEOUT}@anchor{1d9b}
@deffn {데이터} test.support.LONG_TIMEOUT

테스트 멈춤을 감지하기 위한 초 단위 제한 시간.

가장 느린 파이썬 빌드 봇에서 테스트 실패의 위험을 줄이기에 충분히 깁니다. 테스트가 “너무 오래” 걸리면 테스트를 실패로 표시하는 데 사용해서는 안 됩니다. 제한 시간 값은 regrtest @code{--timeout} 명령 줄 옵션에 따라 다릅니다.

기본값은 5분입니다.

@ref{1d99,,LOOPBACK_TIMEOUT}, @ref{1d9a,,INTERNET_TIMEOUT} 및 @ref{1c61,,SHORT_TIMEOUT}도 참조하십시오.
@end deffn

@geindex PGO (test.support 모듈)
@anchor{library/test test support PGO}@anchor{46e8}
@deffn {데이터} test.support.PGO

PGO에 유용하지 않은 테스트를 건너뛸 수 있을 때 설정합니다.
@end deffn

@geindex PIPE_MAX_SIZE (test.support 모듈)
@anchor{library/test test support PIPE_MAX_SIZE}@anchor{46e9}
@deffn {데이터} test.support.PIPE_MAX_SIZE

쓰기 블로킹을 일으키기 위해, 하부 OS 파이프 버퍼 크기보다 클 가능성이 높은 상수.
@end deffn

@geindex Py_DEBUG (test.support 모듈)
@anchor{library/test test support Py_DEBUG}@anchor{46ea}
@deffn {데이터} test.support.Py_DEBUG

@code{True} if Python was built with the @ref{1837,,Py_DEBUG} macro
defined, that is, if
Python was @ref{508,,built in debug mode}.


Added in version 3.12.

@end deffn

@geindex SOCK_MAX_SIZE (test.support 모듈)
@anchor{library/test test support SOCK_MAX_SIZE}@anchor{46eb}
@deffn {데이터} test.support.SOCK_MAX_SIZE

쓰기 블로킹을 일으키기 위해, 하부 OS 소켓 버퍼 크기보다 클 가능성이 높은 상수.
@end deffn

@geindex TEST_SUPPORT_DIR (test.support 모듈)
@anchor{library/test test support TEST_SUPPORT_DIR}@anchor{46ec}
@deffn {데이터} test.support.TEST_SUPPORT_DIR

Set to the top level directory that contains @code{test.support}.
@end deffn

@geindex TEST_HOME_DIR (test.support 모듈)
@anchor{library/test test support TEST_HOME_DIR}@anchor{46ed}
@deffn {데이터} test.support.TEST_HOME_DIR

테스트 패키지의 최상위 디렉터리로 설정합니다.
@end deffn

@geindex TEST_DATA_DIR (test.support 모듈)
@anchor{library/test test support TEST_DATA_DIR}@anchor{46ee}
@deffn {데이터} test.support.TEST_DATA_DIR

테스트 패키지 내의 @code{data} 디렉터리로 설정합니다.
@end deffn

@geindex MAX_Py_ssize_t (test.support 모듈)
@anchor{library/test test support MAX_Py_ssize_t}@anchor{46ef}
@deffn {데이터} test.support.MAX_Py_ssize_t

대용량 메모리 테스트를 위해 @ref{13ca,,sys.maxsize}로 설정합니다.
@end deffn

@geindex max_memuse (test.support 모듈)
@anchor{library/test test support max_memuse}@anchor{46f0}
@deffn {데이터} test.support.max_memuse

대용량 메모리 테스트를 위한 메모리 제한으로 @ref{46f1,,set_memlimit()}에 의해 설정됩니다. @ref{46ef,,MAX_Py_ssize_t}에 의해 제한됩니다.
@end deffn

@geindex real_max_memuse (test.support 모듈)
@anchor{library/test test support real_max_memuse}@anchor{46f2}
@deffn {데이터} test.support.real_max_memuse

대용량 메모리 테스트를 위한 메모리 제한으로 @ref{46f1,,set_memlimit()}에 의해 설정됩니다. @ref{46ef,,MAX_Py_ssize_t}에 의해 제한되지 않습니다.
@end deffn

@geindex MISSING_C_DOCSTRINGS (test.support 모듈)
@anchor{library/test test support MISSING_C_DOCSTRINGS}@anchor{46f3}
@deffn {데이터} test.support.MISSING_C_DOCSTRINGS

Set to @code{True} if Python is built without docstrings (the
@code{WITH_DOC_STRINGS} macro is not defined).
See the @ref{219f,,configure --without-doc-strings} option.

See also the @ref{46f4,,HAVE_DOCSTRINGS} variable.
@end deffn

@geindex HAVE_DOCSTRINGS (test.support 모듈)
@anchor{library/test test support HAVE_DOCSTRINGS}@anchor{46f4}
@deffn {데이터} test.support.HAVE_DOCSTRINGS

Set to @code{True} if function docstrings are available.
See the @ref{18c,,python -OO} option, which strips docstrings of functions implemented in Python.

See also the @ref{46f3,,MISSING_C_DOCSTRINGS} variable.
@end deffn

@geindex TEST_HTTP_URL (test.support 모듈)
@anchor{library/test test support TEST_HTTP_URL}@anchor{46f5}
@deffn {데이터} test.support.TEST_HTTP_URL

네트워크 테스트를 위한 전용 HTTP 서버의 URL을 정의합니다.
@end deffn

@geindex ALWAYS_EQ (test.support 모듈)
@anchor{library/test test support ALWAYS_EQ}@anchor{46f6}
@deffn {데이터} test.support.ALWAYS_EQ

모든 것과 같은 객체. 혼합형 비교를 테스트하는 데 사용됩니다.
@end deffn

@geindex NEVER_EQ (test.support 모듈)
@anchor{library/test test support NEVER_EQ}@anchor{46f7}
@deffn {데이터} test.support.NEVER_EQ

어떤 것과도 같지 않은 객체 (@ref{46f6,,ALWAYS_EQ}에도 해당합니다). 혼합형 비교를 테스트하는 데 사용됩니다.
@end deffn

@geindex LARGEST (test.support 모듈)
@anchor{library/test test support LARGEST}@anchor{46f8}
@deffn {데이터} test.support.LARGEST

모든 것보다 큰 객체 (자신은 제외하고). 혼합형 비교를 테스트하는 데 사용됩니다.
@end deffn

@geindex SMALLEST (test.support 모듈)
@anchor{library/test test support SMALLEST}@anchor{46f9}
@deffn {데이터} test.support.SMALLEST

모든 것보다 작은 객체 (자신은 제외하고). 혼합형 비교를 테스트하는 데 사용됩니다.
@end deffn

The @code{test.support} module defines the following functions:

@geindex busy_retry() (test.support 모듈)
@anchor{library/test test support busy_retry}@anchor{46fa}
@deffn {함수} test.support.busy_retry (timeout, err_msg=None, /, *, error=True)

Run the loop body until @code{break} stops the loop.

After `timeout' seconds, raise an @ref{8b7,,AssertionError} if `error' is true,
or just stop the loop if `error' is false.

예제:

@example
for _ in support.busy_retry(support.SHORT_TIMEOUT):
    if check():
        break
@end example

error=False 사용 예:

@example
for _ in support.busy_retry(support.SHORT_TIMEOUT, error=False):
    if check():
        break
else:
    raise RuntimeError('my custom error')
@end example
@end deffn

@geindex sleeping_retry() (test.support 모듈)
@anchor{library/test test support sleeping_retry}@anchor{46fb}
@deffn {함수} test.support.sleeping_retry (timeout, err_msg=None, /, *, init_delay=0.010, max_delay=1.0, error=True)

Wait strategy that applies exponential backoff.

Run the loop body until @code{break} stops the loop. Sleep at each loop
iteration, but not at the first iteration. The sleep delay is doubled at
each iteration (up to `max_delay' seconds).

See @ref{46fa,,busy_retry()} documentation for the parameters usage.

Example raising an exception after SHORT_TIMEOUT seconds:

@example
for _ in support.sleeping_retry(support.SHORT_TIMEOUT):
    if check():
        break
@end example

error=False 사용 예:

@example
for _ in support.sleeping_retry(support.SHORT_TIMEOUT, error=False):
    if check():
        break
else:
    raise RuntimeError('my custom error')
@end example
@end deffn

@geindex is_resource_enabled() (test.support 모듈)
@anchor{library/test test support is_resource_enabled}@anchor{46fc}
@deffn {함수} test.support.is_resource_enabled (resource)

`resource'가 활성화되고 사용할 수 있으면 @code{True}를 반환합니다. 사용 가능한 리소스 목록은 @ref{e9,,test.regrtest}가 테스트를 실행할 때만 설정됩니다.
@end deffn

@geindex get_resource_value() (test.support 모듈)
@anchor{library/test test support get_resource_value}@anchor{46fd}
@deffn {함수} test.support.get_resource_value (resource)

Return the value specified for `resource' (as @code{-u @var{resource}=@var{value}}).
Return @code{None} if `resource' is disabled or no value is specified.
@end deffn

@geindex python_is_optimized() (test.support 모듈)
@anchor{library/test test support python_is_optimized}@anchor{46fe}
@deffn {함수} test.support.python_is_optimized ()

파이썬이 @code{-O0}이나 @code{-Og}로 빌드되지 않았으면 @code{True}를 반환합니다.
@end deffn

@geindex with_pymalloc() (test.support 모듈)
@anchor{library/test test support with_pymalloc}@anchor{46ff}
@deffn {함수} test.support.with_pymalloc ()

@code{_testcapi.WITH_PYMALLOC}을 반환합니다.
@end deffn

@geindex requires() (test.support 모듈)
@anchor{library/test test support requires}@anchor{46de}
@deffn {함수} test.support.requires (resource, msg=None)

`resource'를 사용할 수 없으면 @ref{46dd,,ResourceDenied}를 발생시킵니다. `msg'는 @code{ResourceDenied}가 발생한다면 이에 대한 인자입니다. @code{__name__}이 @code{'__main__'}인 함수에 의해 호출되면 항상 @code{True}를 반환합니다. @ref{e9,,test.regrtest}에서 테스트를 실행할 때 사용됩니다.
@end deffn

@geindex sortdict() (test.support 모듈)
@anchor{library/test test support sortdict}@anchor{4700}
@deffn {함수} test.support.sortdict (dict)

정렬된 키로 `dict'의 repr을 반환합니다.
@end deffn

@geindex findfile() (test.support 모듈)
@anchor{library/test test support findfile}@anchor{4701}
@deffn {함수} test.support.findfile (filename, subdir=None)

`filename'이라는 파일의 경로를 반환합니다. 일치하는 것이 없으면 `filename'이 반환됩니다. 이것은 파일의 경로일 수 있어서 실패와 같지 않습니다.

`subdir' 설정은 경로 디렉터리를 직접 찾는 대신 파일을 찾는 데 사용할 상대 경로를 나타냅니다.
@end deffn

@geindex get_pagesize() (test.support 모듈)
@anchor{library/test test support get_pagesize}@anchor{4702}
@deffn {함수} test.support.get_pagesize ()

Get size of a page in bytes.


Added in version 3.12.

@end deffn

@geindex setswitchinterval() (test.support 모듈)
@anchor{library/test test support setswitchinterval}@anchor{4703}
@deffn {함수} test.support.setswitchinterval (interval)

@ref{b44,,sys.setswitchinterval()}을 주어진 `interval'로 설정합니다. 시스템이 멈추는 것을 방지하기 위해 안드로이드 시스템을 위한 최소 간격을 정의합니다.
@end deffn

@geindex check_impl_detail() (test.support 모듈)
@anchor{library/test test support check_impl_detail}@anchor{4704}
@deffn {함수} test.support.check_impl_detail (**guards)

이 검사를 사용하여 CPython의 구현 별 테스트를 보호하거나 인자로 보호되는 구현에서만 실행합니다. 이 함수는 호스트 플랫폼에 따라 @code{True}나 @code{False}를 반환합니다. 사용 예:

@example
check_impl_detail()               # CPython에서만 (기본값).
check_impl_detail(jython=True)    # Jython에서만.
check_impl_detail(cpython=False)  # CPython을 제외한 모든 곳.
@end example
@end deffn

@geindex set_memlimit() (test.support 모듈)
@anchor{library/test test support set_memlimit}@anchor{46f1}
@deffn {함수} test.support.set_memlimit (limit)

대용량 메모리 테스트를 위해 @ref{46f0,,max_memuse}와 @ref{46f2,,real_max_memuse} 값을 설정합니다.
@end deffn

@geindex record_original_stdout() (test.support 모듈)
@anchor{library/test test support record_original_stdout}@anchor{4705}
@deffn {함수} test.support.record_original_stdout (stdout)

`stdout'의 값을 저장합니다. regrtest가 시작될 때 stdout을 잡기 위한 것입니다.
@end deffn

@geindex get_original_stdout() (test.support 모듈)
@anchor{library/test test support get_original_stdout}@anchor{4706}
@deffn {함수} test.support.get_original_stdout ()

@ref{4705,,record_original_stdout()}에 의해 설정된 원래 stdout이나 설정되지 않았으면 @code{sys.stdout}을 반환합니다.
@end deffn

@geindex args_from_interpreter_flags() (test.support 모듈)
@anchor{library/test test support args_from_interpreter_flags}@anchor{4707}
@deffn {함수} test.support.args_from_interpreter_flags ()

@code{sys.flags}와 @code{sys.warnoptions}의 현재 설정을 재현하는 명령 줄 인자 리스트를 반환합니다.
@end deffn

@geindex optim_args_from_interpreter_flags() (test.support 모듈)
@anchor{library/test test support optim_args_from_interpreter_flags}@anchor{4708}
@deffn {함수} test.support.optim_args_from_interpreter_flags ()

@code{sys.flags}의 현재 최적화 설정을 재현하는 명령 줄 인자 리스트를 반환합니다.
@end deffn

@geindex captured_stdin() (test.support 모듈)
@geindex captured_stdout() (test.support 모듈)
@geindex captured_stderr() (test.support 모듈)
@anchor{library/test test support captured_stdin}@anchor{4709}
@deffn {함수} test.support.captured_stdin ()
@anchor{library/test test support captured_stdout}@anchor{470a}
@deffnx {함수} test.support.captured_stdout ()
@anchor{library/test test support captured_stderr}@anchor{1dd5}
@deffnx {함수} test.support.captured_stderr ()

명명된 스트림을 @ref{1128,,io.StringIO} 객체로 일시적으로 대체하는 컨텍스트 관리자.

출력 스트림 사용 예:

@example
with captured_stdout() as stdout, captured_stderr() as stderr:
    print("hello")
    print("error", file=sys.stderr)
assert stdout.getvalue() == "hello\n"
assert stderr.getvalue() == "error\n"
@end example

입력 스트림 사용 예:

@example
with captured_stdin() as stdin:
    stdin.write('hello\n')
    stdin.seek(0)
    # sys.stdin에서 소비하는 테스트 코드를 호출합니다
    captured = input()
self.assertEqual(captured, "hello")
@end example
@end deffn

@geindex disable_faulthandler() (test.support 모듈)
@anchor{library/test test support disable_faulthandler}@anchor{470b}
@deffn {함수} test.support.disable_faulthandler ()

@ref{5c,,faulthandler}를 일시적으로 비활성화하는 컨텍스트 관리자.
@end deffn

@geindex gc_collect() (test.support 모듈)
@anchor{library/test test support gc_collect}@anchor{470c}
@deffn {함수} test.support.gc_collect ()

가능한 한 많은 객체를 수거하도록 강제합니다. 이는 가비지 수거기가 적시에 할당 해제를 보장하지 않기 때문에 필요합니다. 이는 @code{__del__} 메서드가 예상보다 늦게 호출될 수 있고 약한 참조(weakrefs)가 예상보다 오래 살아있을 수 있음을 의미합니다.
@end deffn

@geindex disable_gc() (test.support 모듈)
@anchor{library/test test support disable_gc}@anchor{470d}
@deffn {함수} test.support.disable_gc ()

진입할 때 가비지 수거기를 비활성화하는 컨텍스트 관리자. 탈출할 때, 가비지 수거기는 이전 상태로 복원됩니다.
@end deffn

@geindex swap_attr() (test.support 모듈)
@anchor{library/test test support swap_attr}@anchor{470e}
@deffn {함수} test.support.swap_attr (obj, attr, new_val)

어트리뷰트를 새 객체로 스와프하는 컨텍스트 관리자.

용법:

@example
with swap_attr(obj, "attr", 5):
    ...
@end example

이렇게 하면 @code{with} 블록의 기간 중 @code{obj.attr}이 5로 설정되고, 블록 끝에서 이전 값이 복원됩니다. @code{obj}에 @code{attr}이 없으면, 만들어지고 블록의 끝에서 삭제됩니다.

이전 값(또는 존재하지 않으면 @code{None})이 “as” 절의 대상(있다면)에 대입됩니다.
@end deffn

@geindex swap_item() (test.support 모듈)
@anchor{library/test test support swap_item}@anchor{470f}
@deffn {함수} test.support.swap_item (obj, attr, new_val)

항목을 새 객체로 스와프하는 컨텍스트 관리자.

용법:

@example
with swap_item(obj, "item", 5):
    ...
@end example

이렇게 하면 @code{with} 블록의 기간 중 @code{obj["item"]}이 5로 설정되고, 블록 끝에서 이전 값이 복원됩니다. @code{obj}에 @code{item}이 없으면, 만들어지고 블록의 끝에서 삭제됩니다.

이전 값(또는 존재하지 않으면 @code{None})이 “as” 절의 대상(있다면)에 대입됩니다.
@end deffn

@geindex flush_std_streams() (test.support 모듈)
@anchor{library/test test support flush_std_streams}@anchor{4710}
@deffn {함수} test.support.flush_std_streams ()

Call the @code{flush()} method on @ref{ccc,,sys.stdout} and then on
@ref{b33,,sys.stderr}. It can be used to make sure that the logs order is
consistent before writing into stderr.


Added in version 3.11.

@end deffn

@geindex print_warning() (test.support 모듈)
@anchor{library/test test support print_warning}@anchor{4711}
@deffn {함수} test.support.print_warning (msg)

@ref{4712,,sys.__stderr__}에 경고를 인쇄합니다. 메시지를 다음처럼 포맷합니다: @code{f"Warning -- @{msg@}"}. `msg'가 여러 줄로 구성되면, 각 줄에 @code{"Warning -- "} 접두사를 추가합니다.


Added in version 3.9.

@end deffn

@geindex wait_process() (test.support 모듈)
@anchor{library/test test support wait_process}@anchor{1d5a}
@deffn {함수} test.support.wait_process (pid, *, exitcode, timeout=None)

프로세스 `pid'가 완료될 때까지 기다렸다가 프로세스 종료 코드가 `exitcode'인지 확인합니다.

프로세스 종료 코드가 `exitcode'와 같지 않으면 @ref{8b7,,AssertionError}를 발생시킵니다.

프로세스가 `timeout'(기본적으로 @ref{1c61,,SHORT_TIMEOUT}) 초보다 오래 실행되면, 프로세스를 죽이고 @ref{8b7,,AssertionError}를 발생시킵니다. 제한 시간 기능은 윈도우에서 사용할 수 없습니다.


Added in version 3.9.

@end deffn

@geindex calcobjsize() (test.support 모듈)
@anchor{library/test test support calcobjsize}@anchor{4713}
@deffn {함수} test.support.calcobjsize (fmt)

Return the size of the @ref{5dc,,PyObject} whose structure members are
defined by `fmt'. The returned value includes the size of the Python object header and alignment.
@end deffn

@geindex calcvobjsize() (test.support 모듈)
@anchor{library/test test support calcvobjsize}@anchor{4714}
@deffn {함수} test.support.calcvobjsize (fmt)

Return the size of the @ref{4715,,PyVarObject} whose structure members are
defined by `fmt'. The returned value includes the size of the Python object header and alignment.
@end deffn

@geindex checksizeof() (test.support 모듈)
@anchor{library/test test support checksizeof}@anchor{4716}
@deffn {함수} test.support.checksizeof (test, o, size)

테스트 케이스 `test'에 대해, `o'의 @code{sys.getsizeof}에 GC 헤더 크기를 더한 값이 `size'와 같다고 어서션 합니다.
@end deffn

@geindex anticipate_failure() (test.support 모듈)
@anchor{library/test test support anticipate_failure}@anchor{4717}
@deffn {함수} @@test.support.anticipate_failure (condition)

@ref{4628,,unittest.expectedFailure()}로 테스트를 조건부로 표시하는 데코레이터. 이 데코레이터를 사용하려면 관련 추적기(tracker) 이슈를 식별하는 관련 주석이 있어야 합니다.
@end deffn

@geindex system_must_validate_cert() (test.support 모듈)
@anchor{library/test test support system_must_validate_cert}@anchor{4718}
@deffn {함수} test.support.system_must_validate_cert (f)

TLS 인증서 유효성 검사 실패 시 데코레이트된 테스트를 건너뛰는 데코레이터.
@end deffn

@geindex run_with_locale() (test.support 모듈)
@anchor{library/test test support run_with_locale}@anchor{4719}
@deffn {함수} @@test.support.run_with_locale (catstr, *locales)

다른 로케일에서 함수를 실행하기 위한 데코레이터로, 완료된 후 올바르게 재설정합니다. `catstr'은 문자열로 된 로케일 범주입니다 (예를 들어 @code{"LC_ALL"}). 전달된 `locales'는 순차적으로 시도되며, 첫 번째 유효한 로케일이 사용됩니다.
@end deffn

@geindex run_with_tz() (test.support 모듈)
@anchor{library/test test support run_with_tz}@anchor{471a}
@deffn {함수} @@test.support.run_with_tz (tz)

특정 시간대에서 함수를 실행하기 위한 데코레이터로, 완료된 후 올바르게 재설정합니다.
@end deffn

@geindex requires_freebsd_version() (test.support 모듈)
@anchor{library/test test support requires_freebsd_version}@anchor{471b}
@deffn {함수} @@test.support.requires_freebsd_version (*min_version)

FreeBSD에서 테스트를 실행할 때 최소 버전을 위한 데코레이터. FreeBSD 버전이 최소 버전보다 낮으면, 테스트를 건너뜁니다.
@end deffn

@geindex requires_linux_version() (test.support 모듈)
@anchor{library/test test support requires_linux_version}@anchor{471c}
@deffn {함수} @@test.support.requires_linux_version (*min_version)

리눅스에서 테스트를 실행할 때 최소 버전을 위한 데코레이터. 리눅스 버전이 최소 버전보다 낮으면, 테스트를 건너뜁니다.
@end deffn

@geindex requires_mac_version() (test.support 모듈)
@anchor{library/test test support requires_mac_version}@anchor{471d}
@deffn {함수} @@test.support.requires_mac_version (*min_version)

macOS에서 테스트를 실행할 때 최소 버전을 위한 데코레이터. macOS 버전이 최소 버전보다 낮으면, 테스트를 건너뜁니다.
@end deffn

@geindex requires_gil_enabled() (test.support 모듈)
@anchor{library/test test support requires_gil_enabled}@anchor{471e}
@deffn {함수} @@test.support.requires_gil_enabled

Decorator for skipping tests on the free-threaded build.  If the
@ref{164,,GIL} is disabled, the test is skipped.
@end deffn

@geindex requires_IEEE_754() (test.support 모듈)
@anchor{library/test test support requires_IEEE_754}@anchor{471f}
@deffn {함수} @@test.support.requires_IEEE_754

비 IEEE 754 플랫폼에서 테스트를 건너뛰는 데코레이터.
@end deffn

@geindex requires_zlib() (test.support 모듈)
@anchor{library/test test support requires_zlib}@anchor{4720}
@deffn {함수} @@test.support.requires_zlib

@ref{139,,zlib}가 없으면 테스트를 건너뛰는 데코레이터.
@end deffn

@geindex requires_gzip() (test.support 모듈)
@anchor{library/test test support requires_gzip}@anchor{4721}
@deffn {함수} @@test.support.requires_gzip

@ref{6b,,gzip}이 없으면 테스트를 건너뛰는 데코레이터.
@end deffn

@geindex requires_bz2() (test.support 모듈)
@anchor{library/test test support requires_bz2}@anchor{4722}
@deffn {함수} @@test.support.requires_bz2

@ref{14,,bz2}가 없으면 테스트를 건너뛰는 데코레이터.
@end deffn

@geindex requires_lzma() (test.support 모듈)
@anchor{library/test test support requires_lzma}@anchor{4723}
@deffn {함수} @@test.support.requires_lzma

@ref{8e,,lzma}가 없으면 테스트를 건너뛰는 데코레이터.
@end deffn

@geindex requires_resource() (test.support 모듈)
@anchor{library/test test support requires_resource}@anchor{4724}
@deffn {함수} @@test.support.requires_resource (resource)

`resource'를 사용할 수 없으면 테스트를 건너뛰는 데코레이터.
@end deffn

@geindex requires_docstrings() (test.support 모듈)
@anchor{library/test test support requires_docstrings}@anchor{4725}
@deffn {함수} @@test.support.requires_docstrings

@ref{46f4,,HAVE_DOCSTRINGS}일 때만 테스트를 실행하는 데코레이터.
@end deffn

@geindex requires_limited_api() (test.support 모듈)
@anchor{library/test test support requires_limited_api}@anchor{4726}
@deffn {함수} @@test.support.requires_limited_api

@ref{635,,제한된 C API}를 사용할 수 있을 때만 테스트를 실행하는 데코레이터.
@end deffn

@geindex cpython_only() (test.support 모듈)
@anchor{library/test test support cpython_only}@anchor{4727}
@deffn {함수} @@test.support.cpython_only

CPython에만 적용되는 테스트용 데코레이터.
@end deffn

@geindex impl_detail() (test.support 모듈)
@anchor{library/test test support impl_detail}@anchor{4728}
@deffn {함수} @@test.support.impl_detail (msg=None, **guards)

`guards'에 @ref{4704,,check_impl_detail()}을 호출하는 데코레이터. @code{False}가 반환되면, 테스트를 건너뛰는 이유로 `msg'를 사용합니다.
@end deffn

@geindex thread_unsafe() (test.support 모듈)
@anchor{library/test test support thread_unsafe}@anchor{4729}
@deffn {함수} @@test.support.thread_unsafe (reason=None)

Decorator for marking tests as thread-unsafe.  This test always runs in one
thread even when invoked with @code{--parallel-threads}.
@end deffn

@geindex no_tracing() (test.support 모듈)
@anchor{library/test test support no_tracing}@anchor{472a}
@deffn {함수} @@test.support.no_tracing

테스트 기간 중 일시적으로 추적을 해제하는 데코레이터.
@end deffn

@geindex refcount_test() (test.support 모듈)
@anchor{library/test test support refcount_test}@anchor{472b}
@deffn {함수} @@test.support.refcount_test

참조 횟수를 수반하는 테스트를 위한 데코레이터. 데코레이터는 CPython에 의해 실행되지 않으면 테스트를 실행하지 않습니다. 추적 함수로 인한 예기치 않은 참조 횟수를 방지하기 위해 테스트 기간 중 모든 추적 함수가 설정 해제됩니다.
@end deffn

@geindex bigmemtest() (test.support 모듈)
@anchor{library/test test support bigmemtest}@anchor{472c}
@deffn {함수} @@test.support.bigmemtest (size, memuse, dry_run=True)

bigmem 테스트를 위한 데코레이터.

`size'는 테스트를 위해 요청된 크기입니다 (임의의 테스트가 해석하는 단위.) `memuse'는 테스트 단위당 바이트 수, 또는 이의 적절한 추정치입니다. 예를 들어, 각각 4GiB인 두 개의 바이트 버퍼가 필요한 테스트는 @code{@@bigmemtest(size=_4G, memuse=2)}로 데코레이트 될 수 있습니다.

`size' 인자는 일반적으로 데코레이트 된 테스트 메서드에 추가 인자로 전달됩니다. `dry_run'이 @code{True}이면, 테스트 메서드에 전달된 값이 요청된 값보다 작을 수 있습니다. `dry_run'이 @code{False}이면, @code{-M}가 지정되지 않은 경우 테스트가 더미 실행을 지원하지 않음을 의미합니다.
@end deffn

@geindex bigaddrspacetest() (test.support 모듈)
@anchor{library/test test support bigaddrspacetest}@anchor{472d}
@deffn {함수} @@test.support.bigaddrspacetest

주소 공간을 채우는 테스트용 데코레이터.
@end deffn

@geindex linked_to_musl() (test.support 모듈)
@anchor{library/test test support linked_to_musl}@anchor{472e}
@deffn {함수} test.support.linked_to_musl ()

Return @code{False} if there is no evidence the interpreter was compiled with
@code{musl}, otherwise return a version triple, either @code{(0, 0, 0)} if the
version is unknown, or the actual version if it is known.  Intended for use
in @code{skip} decorators.  @code{emscripten} and @code{wasi} are assumed to be
compiled with @code{musl}; otherwise @code{platform.libc_ver} is checked.
@end deffn

@geindex check_syntax_error() (test.support 모듈)
@anchor{library/test test support check_syntax_error}@anchor{472f}
@deffn {함수} test.support.check_syntax_error (testcase, statement, errtext='@w{'}, *, lineno=None, offset=None)

`statement' 컴파일을 시도하여 `statement'의 구문 에러를 테스트합니다. `testcase'는 테스트를 위한 @ref{10c,,unittest} 인스턴스입니다. `errtext'는 발생한 @ref{18e,,SyntaxError}의 문자열 표현과 일치해야 하는 정규식입니다. `lineno'가 @code{None}이 아니면, 예외 줄과 비교합니다. `offset'이 @code{None}이 아니면, 예외의 오프셋과 비교합니다.
@end deffn

@geindex open_urlresource() (test.support 모듈)
@anchor{library/test test support open_urlresource}@anchor{4730}
@deffn {함수} test.support.open_urlresource (url, *args, **kw)

`url'을 엽니다. 열기에 실패하면, @ref{46dc,,TestFailed}를 발생시킵니다.
@end deffn

@geindex reap_children() (test.support 모듈)
@anchor{library/test test support reap_children}@anchor{4731}
@deffn {함수} test.support.reap_children ()

서브 프로세스가 시작될 때마다 @code{test_main} 끝에 이것을 사용하십시오. 이렇게 하면 여분의 자식(좀비)이 남아서 리소스를 탐하지 않도록 하고 참조 누수를 찾을 때 문제가 발생하지 않도록 할 수 있습니다.
@end deffn

@geindex get_attribute() (test.support 모듈)
@anchor{library/test test support get_attribute}@anchor{4732}
@deffn {함수} test.support.get_attribute (obj, name)

어트리뷰트를 가져옵니다, @ref{5ee,,AttributeError}가 발생하면 @ref{11e3,,unittest.SkipTest}를 발생시킵니다.
@end deffn

@geindex catch_unraisable_exception() (test.support 모듈)
@anchor{library/test test support catch_unraisable_exception}@anchor{1dba}
@deffn {함수} test.support.catch_unraisable_exception ()

@ref{506,,sys.unraisablehook()}를 사용하여 발생시킬 수 없는(unraisable) 예외를 포착하는 컨텍스트 관리자.

예외 값(@code{cm.unraisable.exc_value})을 저장하면 참조 순환을 만듭니다. 컨텍스트 관리자가 탈출할 때 참조 순환이 명시적으로 끊어집니다.

객체(@code{cm.unraisable.object})를 저장하면 파이널라이즈 중인 객체로 설정되어 있으면 되살릴 수 있습니다. 컨텍스트 관리자를 탈출하면 저장된 객체가 지워집니다.

용법:

@example
with support.catch_unraisable_exception() as cm:
    # "발생시킬 수 없는 예외"를 만드는 코드
    ...

    # 발생시킬 수 없는 예외를 확인합니다: cm.unraisable 을 사용하십시오
    ...

# 이 지점에서 cm.unraisable 어프리뷰트는 더는 존재하지 않습니다
# (참조 순환을 끊고자)
@end example


Added in version 3.8.

@end deffn

@geindex load_package_tests() (test.support 모듈)
@anchor{library/test test support load_package_tests}@anchor{4733}
@deffn {함수} test.support.load_package_tests (pkg_dir, loader, standard_tests, pattern)

테스트 패키지에서 사용하기 위한 @ref{10c,,unittest} @code{load_tests} 프로토콜의 일반 구현. `pkg_dir'는 패키지의 루트 디렉터리입니다; `loader', `standard_tests' 및 `pattern'은 @code{load_tests}가 기대하는 인자입니다. 간단한 경우, 테스트 패키지의 @code{__init__.py}는 다음과 같을 수 있습니다:

@example
import os
from test.support import load_package_tests

def load_tests(*args):
    return load_package_tests(os.path.dirname(__file__), *args)
@end example
@end deffn

@geindex detect_api_mismatch() (test.support 모듈)
@anchor{library/test test support detect_api_mismatch}@anchor{4734}
@deffn {함수} test.support.detect_api_mismatch (ref_api, other_api, *, ignore=())

`ignore'에 지정된 이 검사에서 무시할 정의된 항목 리스트를 제외하고, `other_api'에서 찾을 수 없는 `ref_api'의 어트리뷰트, 함수 또는 메서드 집합을 반환합니다.

기본적으로 이것은 ‘_’로 시작하는 내부(private) 어트리뷰트를 건너뛰지만, 모든 매직 메서드, 즉 ‘__’로 시작하고 끝나는 것들을 포함합니다.


Added in version 3.5.

@end deffn

@geindex patch() (test.support 모듈)
@anchor{library/test test support patch}@anchor{4735}
@deffn {함수} test.support.patch (test_instance, object_to_patch, attr_name, new_value)

`object_to_patch.attr_name'을 `new_value'로 대체합니다. 또한 `test_instance'에 대한 정리 절차를 추가하여 `object_to_patch'의 `attr_name'을 복원합니다. `attr_name'은 `object_to_patch'의 유효한 어트리뷰트여야 합니다.
@end deffn

@geindex run_in_subinterp() (test.support 모듈)
@anchor{library/test test support run_in_subinterp}@anchor{4736}
@deffn {함수} test.support.run_in_subinterp (code)

서브 인터프리터에서 `code'를 실행합니다. @ref{105,,tracemalloc}이 활성화되면 @ref{11e3,,unittest.SkipTest}를 발생시킵니다.
@end deffn

@geindex check_free_after_iterating() (test.support 모듈)
@anchor{library/test test support check_free_after_iterating}@anchor{4737}
@deffn {함수} test.support.check_free_after_iterating (test, iter, cls, args=())

이터레이션 후 `cls'의 인스턴스가 할당 해제되었음을 어서션 합니다.
@end deffn

@geindex missing_compiler_executable() (test.support 모듈)
@anchor{library/test test support missing_compiler_executable}@anchor{4738}
@deffn {함수} test.support.missing_compiler_executable (cmd_names=[])

`cmd_names'에 이름이 나열된 컴파일러 실행 파일이나 `cmd_names'가 비어있을 때 모든 컴파일러 실행 파일이 있는지 확인하고 누락된 첫 번째 실행 파일을 반환하거나 누락된 것이 없으면 @code{None}을 반환합니다.
@end deffn

@geindex check__all__() (test.support 모듈)
@anchor{library/test test support check__all__}@anchor{1d30}
@deffn {함수} test.support.check__all__ (test_case, module, name_of_module=None, extra=(), not_exported=())

`module'의 @code{__all__} 변수에 모든 공용 이름이 포함되어 있는지 어서션 합니다.

모듈의 공용 이름(그것의 API)은 공용 이름 규칙과 일치하고 `module'에 정의되었는지에 따라 자동으로 감지됩니다.

`name_of_module' 인자는 공용 API로 감지하기 위해 API를 정의 할 수 있는 모듈을 (문자열이나 튜플로) 지정할 수 있습니다. 이에 대한 한 가지 사례는 `module'이 다른 모듈에서 공용 API의 일부를 임포트 할 때입니다, C 백 엔드도 가능합니다 (@code{csv}와 그것의 @code{_csv} 처럼).

`extra' 인자는 적절한 @ref{26dd,,__module__} 어트리뷰트가 없는 객체처럼, “공용”으로 자동 감지되지 않는 이름 집합일 수 있습니다. 제공되면, 자동 감지된 항목에 추가됩니다.

`not_exported' 인자는 이름이 공용처럼 보이더라도 공용 API의 일부로 취급해서는 안 되는 이름 집합일 수 있습니다.

사용 예:

@example
import bar
import foo
import unittest
from test import support

class MiscTestCase(unittest.TestCase):
    def test__all__(self):
        support.check__all__(self, foo)

class OtherTestCase(unittest.TestCase):
    def test__all__(self):
        extra = @{'BAR_CONST', 'FOO_CONST'@}
        not_exported = @{'baz'@}  # 문서화되지 않은 이름.
        # bar는 _bar에서 API의 일부를 임포트 합니다.
        support.check__all__(self, bar, ('bar', '_bar'),
                             extra=extra, not_exported=not_exported)
@end example


Added in version 3.6.

@end deffn

@geindex skip_if_broken_multiprocessing_synchronize() (test.support 모듈)
@anchor{library/test test support skip_if_broken_multiprocessing_synchronize}@anchor{1d31}
@deffn {함수} test.support.skip_if_broken_multiprocessing_synchronize ()

Skip tests if the @code{multiprocessing.synchronize} module is missing, if
there is no available semaphore implementation, or if creating a lock raises
an @ref{2c0,,OSError}.


Added in version 3.10.

@end deffn

@geindex check_disallow_instantiation() (test.support 모듈)
@anchor{library/test test support check_disallow_instantiation}@anchor{4739}
@deffn {함수} test.support.check_disallow_instantiation (test_case, tp, *args, **kwds)

Assert that type `tp' cannot be instantiated using `args' and `kwds'.


Added in version 3.10.

@end deffn

@geindex adjust_int_max_str_digits() (test.support 모듈)
@anchor{library/test test support adjust_int_max_str_digits}@anchor{473a}
@deffn {함수} test.support.adjust_int_max_str_digits (max_digits)

This function returns a context manager that will change the global
@ref{18f2,,sys.set_int_max_str_digits()} setting for the duration of the
context to allow execution of test code that needs a different limit
on the number of digits when converting between an integer and string.


Added in version 3.11.

@end deffn

The @code{test.support} module defines the following classes:

@geindex SuppressCrashReport (test.support 클래스)
@anchor{library/test test support SuppressCrashReport}@anchor{473b}
@deffn {클래스} test.support.SuppressCrashReport

서브 프로세스를 충돌시킬 것으로 예상되는 테스트에서 충돌 대화 상자 팝업을 방지하는 데 사용되는 컨텍스트 관리자.

윈도우에서는, SetErrorMode@footnote{https://msdn.microsoft.com/en-us/library/windows/desktop/ms680621.aspx}를 사용하여 윈도우 에러 보고 대화 상자를 비활성화합니다.

유닉스에서는, @ref{17cc,,resource.setrlimit()}를 사용하여 @ref{473c,,resource.RLIMIT_CORE}의 소프트 제한을 0으로 설정하여 코어 덤프 파일 생성을 방지하는 데 사용됩니다.

두 플랫폼 모두에서, 이전 값은 @ref{1505,,__exit__()}에 의해 복원됩니다.
@end deffn

@geindex SaveSignals (test.support 클래스)
@anchor{library/test test support SaveSignals}@anchor{473d}
@deffn {클래스} test.support.SaveSignals

파이썬 시그널 처리기가 등록한 시그널 처리기를 저장하고 복원하는 클래스.

@geindex save() (test.support.SaveSignals 메서드)
@anchor{library/test test support SaveSignals save}@anchor{473e}
@deffn {메서드} save (self)

Save the signal handlers to a dictionary mapping signal numbers to the
current signal handler.
@end deffn

@geindex restore() (test.support.SaveSignals 메서드)
@anchor{library/test test support SaveSignals restore}@anchor{473f}
@deffn {메서드} restore (self)

Set the signal numbers from the @ref{473e,,save()} dictionary to the saved
handler.
@end deffn
@end deffn

@geindex Matcher (test.support 클래스)
@anchor{library/test test support Matcher}@anchor{4740}
@deffn {클래스} test.support.Matcher

@geindex matches() (test.support.Matcher 메서드)
@anchor{library/test test support Matcher matches}@anchor{4741}
@deffn {메서드} matches (self, d, **kwargs)

단일 딕셔너리를 제공된 인자와 일치시키려고 합니다.
@end deffn

@geindex match_value() (test.support.Matcher 메서드)
@anchor{library/test test support Matcher match_value}@anchor{4742}
@deffn {메서드} match_value (self, k, dv, v)

단일 저장된 값(`dv')을 제공된 값(`v')과 일치시키려고 합니다.
@end deffn
@end deffn

@node test support socket_helper — Utilities for socket tests,test support script_helper — Utilities for the Python execution tests,test support — Utilities for the Python test suite,개발 도구
@anchor{library/test module-test support socket_helper}@anchor{ef}@anchor{library/test test-support-socket-helper-utilities-for-socket-tests}@anchor{4743}
@subsection @code{test.support.socket_helper} — Utilities for socket tests


@geindex module; test.support.socket_helper

The @code{test.support.socket_helper} module provides support for socket tests.


Added in version 3.9.


@geindex IPV6_ENABLED (test.support.socket_helper 모듈)
@anchor{library/test test support socket_helper IPV6_ENABLED}@anchor{4744}
@deffn {데이터} test.support.socket_helper.IPV6_ENABLED

이 호스트에서 IPv6가 활성화되어 있으면 @code{True}로 설정하고, 그렇지 않으면 @code{False}로 설정합니다.
@end deffn

@geindex find_unused_port() (test.support.socket_helper 모듈)
@anchor{library/test test support socket_helper find_unused_port}@anchor{4745}
@deffn {함수} test.support.socket_helper.find_unused_port (family=socket.AF_INET, socktype=socket.SOCK_STREAM)

바인딩에 적합해야 하는 미사용 포트를 반환합니다. 이는 @code{sock} 매개 변수와 같은 패밀리와 유형으로 (기본값은 @ref{1bab,,AF_INET}, @ref{14f8,,SOCK_STREAM}) 임시 소켓을 만들고, 포트를 0으로 설정하여 지정된 호스트 주소(기본값은 @code{0.0.0.0})에 바인딩하여, OS에서 사용되지 않은 임시 포트를 도출하여 수행됩니다. 그런 다음 임시 소켓이 닫히고 삭제되고, 임시 포트가 반환됩니다.

이 메서드나 @ref{4746,,bind_port()}는 테스트 기간 중 서버 소켓을 특정 포트에 바인딩해야 하는 모든 테스트에 사용해야 합니다. 어떤 것을 사용할 것인지는 호출하는 코드가 파이썬 소켓을 만드는지, 또는 사용되지 않은 포트가 생성자에서 제공되어야 하는지 또는 외부 프로그램에 전달되어야 하는지 (즉 openssl의 s_server 모드에 대한 @code{-accept} 인자)에 따라 다릅니다. 가능하면 항상 @ref{4745,,find_unused_port()}보다 @code{bind_port()}를 선호하십시오. 하드 코딩된 포트를 사용하면 여러 테스트 인스턴스를 동시에 실행할 수 없게 되어 빌드 봇에 문제가 될 수 있어서 피하는 것이 좋습니다.
@end deffn

@geindex bind_port() (test.support.socket_helper 모듈)
@anchor{library/test test support socket_helper bind_port}@anchor{4746}
@deffn {함수} test.support.socket_helper.bind_port (sock, host=HOST)

소켓을 사용 가능한 포트에 바인딩하고 포트 번호를 반환합니다. 바인딩 되지 않은 포트를 사용하기 위해 임시 포트에 의존합니다. 이는 특히 빌드 봇 환경에서, 많은 테스트가 동시에 실행될 수 있어서 중요합니다. 이 메서드는 @code{sock.family}가 @ref{1bab,,AF_INET}이고 @code{sock.type}이 @ref{14f8,,SOCK_STREAM}이고, 소켓에 @code{SO_REUSEADDR}이나 @code{SO_REUSEPORT}가 설정되면 예외가 발생합니다. 테스트는 TCP/IP 소켓에 대해 이러한 소켓 옵션을 설정해서는 안 됩니다. 이러한 옵션을 설정하는 유일한 경우는 여러 UDP 소켓을 통해 멀티캐스팅을 테스트하는 것입니다.

또한, @code{SO_EXCLUSIVEADDRUSE} 소켓 옵션을 사용할 수 있으면 (즉 윈도우에서), 소켓에 설정됩니다. 이렇게 하면 다른 사람이 테스트 기간 중 우리의 호스트/포트에 바인딩하는 것을 방지할 수 있습니다.
@end deffn

@geindex bind_unix_socket() (test.support.socket_helper 모듈)
@anchor{library/test test support socket_helper bind_unix_socket}@anchor{4747}
@deffn {함수} test.support.socket_helper.bind_unix_socket (sock, addr)

유닉스 소켓을 바인드 합니다, @ref{f3d,,PermissionError}가 발생하면 @ref{11e3,,unittest.SkipTest}를 발생시킵니다.
@end deffn

@geindex skip_unless_bind_unix_socket() (test.support.socket_helper 모듈)
@anchor{library/test test support socket_helper skip_unless_bind_unix_socket}@anchor{4748}
@deffn {함수} @@test.support.socket_helper.skip_unless_bind_unix_socket

유닉스 소켓용 @code{bind()} 기능이 필요한 테스트를 실행하기 위한 데코레이터.
@end deffn

@geindex transient_internet() (test.support.socket_helper 모듈)
@anchor{library/test test support socket_helper transient_internet}@anchor{46e7}
@deffn {함수} test.support.socket_helper.transient_internet (resource_name, *, timeout=30.0, errnos=())

인터넷 연결과 관련된 다양한 문제가 예외로 나타날 때 @ref{46dd,,ResourceDenied}를 발생시키는 컨텍스트 관리자.
@end deffn

@node test support script_helper — Utilities for the Python execution tests,test support bytecode_helper — Support tools for testing correct bytecode generation,test support socket_helper — Utilities for socket tests,개발 도구
@anchor{library/test module-test support script_helper}@anchor{ee}@anchor{library/test test-support-script-helper-utilities-for-the-python-execution-tests}@anchor{4749}
@subsection @code{test.support.script_helper} — Utilities for the Python execution tests


@geindex module; test.support.script_helper

The @code{test.support.script_helper} module provides support for Python’s
script execution tests.

@geindex interpreter_requires_environment() (test.support.script_helper 모듈)
@anchor{library/test test support script_helper interpreter_requires_environment}@anchor{474a}
@deffn {함수} test.support.script_helper.interpreter_requires_environment ()

@code{sys.executable 인터프리터}를 실행하기 위해 환경 변수가 필요하면 @code{True}를 반환합니다.

@code{assert_python*()} 함수를 사용하여 격리 모드(@code{-I})를 시작하거나 환경 없음 모드(@code{-E}) 서브 인터프리터 프로세스를 시작해야 하는 테스트를 어노테이트 하는 @code{@@unittest.skipIf()}와 함께 사용하도록 설계되었습니다.

정상적인 빌드와 테스트는 이러한 상황을 만나지 않지만, 파이썬의 현재 홈 찾기 논리로 명확한 홈이 없는 인터프리터에서 표준 라이브러리 테스트 스위트를 실행하려고 할 때 발생할 수 있습니다.

@geindex PYTHONHOME
@geindex 환경 변수; PYTHONHOME
@ref{3f0,,PYTHONHOME} 설정은 이러한 상황에서 대부분의 테스트 스위트를 실행하는 한 가지 방법입니다. 
@geindex PYTHONPATH
@geindex 환경 변수; PYTHONPATH
@ref{121c,,PYTHONPATH}나 
@geindex PYTHONUSERSITE
@geindex 환경 변수; PYTHONUSERSITE
@code{PYTHONUSERSITE}는 인터프리터가 시작될 수 있는지에 영향을 줄 수 있는 다른 공통 환경 변수입니다.
@end deffn

@geindex run_python_until_end() (test.support.script_helper 모듈)
@anchor{library/test test support script_helper run_python_until_end}@anchor{474b}
@deffn {함수} test.support.script_helper.run_python_until_end (*args, **env_vars)

서브 프로세스에서 인터프리터를 실행하기 위해 `env_vars' 기반 환경을 설정합니다. 값에는 @code{__isolated}, @code{__cleanenv}, @code{__cwd} 및 @code{TERM}이 포함될 수 있습니다.


버전 3.9에서 변경: 이 함수는 더는 `stderr'에서 공백을 제거하지 않습니다.

@end deffn

@geindex assert_python_ok() (test.support.script_helper 모듈)
@anchor{library/test test support script_helper assert_python_ok}@anchor{474c}
@deffn {함수} test.support.script_helper.assert_python_ok (*args, **env_vars)

`args'와 선택적 환경 변수 `env_vars'를 사용하여 인터프리터를 실행하면 성공(@code{rc == 0})하고 @code{(return code, stdout, stderr)} 튜플을 반환함을 어서션 합니다.

`__cleanenv' 키워드 전용 매개변수가 설정되면, `env_vars'가 새로운 환경으로 사용됩니다.

파이썬은 `__isolated' 키워드 전용 매개변수가 @code{False}로 설정된 경우를 제외하고, 격리 모드(명령 줄 옵션 @code{-I})에서 시작됩니다.


버전 3.9에서 변경: 이 함수는 더는 `stderr'에서 공백을 제거하지 않습니다.

@end deffn

@geindex assert_python_failure() (test.support.script_helper 모듈)
@anchor{library/test test support script_helper assert_python_failure}@anchor{474d}
@deffn {함수} test.support.script_helper.assert_python_failure (*args, **env_vars)

`args'와 선택적 환경 변수 `env_vars'를 사용하여 인터프리터 실행하면 실패(@code{rc != 0})하고 @code{(return code, stdout, stderr)} 튜플을 반환함을 어서션 합니다.

추가 옵션은 @ref{474c,,assert_python_ok()}를 참조하십시오.


버전 3.9에서 변경: 이 함수는 더는 `stderr'에서 공백을 제거하지 않습니다.

@end deffn

@geindex spawn_python() (test.support.script_helper 모듈)
@anchor{library/test test support script_helper spawn_python}@anchor{474e}
@deffn {함수} test.support.script_helper.spawn_python (*args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, **kw)

주어진 인자로 파이썬 서브 프로세스를 실행합니다.

`kw'는 @ref{4b8,,subprocess.Popen()}에 전달할 추가 키워드 인자입니다. @ref{4b8,,subprocess.Popen} 객체를 반환합니다.
@end deffn

@geindex kill_python() (test.support.script_helper 모듈)
@anchor{library/test test support script_helper kill_python}@anchor{474f}
@deffn {함수} test.support.script_helper.kill_python (p)

완료될 때까지 주어진 @ref{4b8,,subprocess.Popen} 프로세스를 실행하고 stdout을 반환합니다.
@end deffn

@geindex make_script() (test.support.script_helper 모듈)
@anchor{library/test test support script_helper make_script}@anchor{4750}
@deffn {함수} test.support.script_helper.make_script (script_dir, script_basename, source, omit_suffix=False)

`script_dir'과 `script_basename' 경로에 `source'를 포함하는 스크립트를 만듭니다. `omit_suffix'가 @code{False}이면, 이름에 @code{.py}를 추가합니다. 전체 스크립트 경로를 반환합니다.
@end deffn

@geindex make_zip_script() (test.support.script_helper 모듈)
@anchor{library/test test support script_helper make_zip_script}@anchor{4751}
@deffn {함수} test.support.script_helper.make_zip_script (zip_dir, zip_basename, script_name, name_in_zip=None)

`script_name'의 파일을 포함하는 확장자가 @code{zip}인 zip 파일을 `zip_dir'과 `zip_basename'에 만듭니다. `name_in_zip'은 아카이브 이름입니다. @code{(full path, full path of archive name)}을 포함하는 튜플을 반환합니다.
@end deffn

@geindex make_pkg() (test.support.script_helper 모듈)
@anchor{library/test test support script_helper make_pkg}@anchor{4752}
@deffn {함수} test.support.script_helper.make_pkg (pkg_dir, init_source='@w{'})

`init_source'를 내용으로 하는 @code{__init__} 파일을 포함하는 `pkg_dir'이라는 디렉터리를 만듭니다.
@end deffn

@geindex make_zip_pkg() (test.support.script_helper 모듈)
@anchor{library/test test support script_helper make_zip_pkg}@anchor{4753}
@deffn {함수} test.support.script_helper.make_zip_pkg (zip_dir, zip_basename, pkg_name, script_basename, source, depth=1, compiled=False)

빈 @code{__init__} 파일과 `source'를 포함하는 파일 `script_basename'을 포함하는 zip 패키지 디렉터리를 `zip_dir'과 `zip_basename' 경로로 만듭니다. `compiled'가 @code{True}이면, 두 소스 파일이 모두 컴파일되어 zip 패키지에 추가됩니다. 전체 zip 경로와 zip 파일의 아카이브 이름의 튜플을 반환합니다.
@end deffn

@node test support bytecode_helper — Support tools for testing correct bytecode generation,test support threading_helper — Utilities for threading tests,test support script_helper — Utilities for the Python execution tests,개발 도구
@anchor{library/test module-test support bytecode_helper}@anchor{eb}@anchor{library/test test-support-bytecode-helper-support-tools-for-testing-correct-bytecode-generation}@anchor{4754}
@subsection @code{test.support.bytecode_helper} — Support tools for testing correct bytecode generation


@geindex module; test.support.bytecode_helper

The @code{test.support.bytecode_helper} module provides support for testing
and inspecting bytecode generation.


Added in version 3.9.


모듈은 다음 클래스를 정의합니다:

@geindex BytecodeTestCase (test.support.bytecode_helper 클래스)
@anchor{library/test test support bytecode_helper BytecodeTestCase}@anchor{4755}
@deffn {클래스} test.support.bytecode_helper.BytecodeTestCase (unittest.TestCase)

이 클래스에는 바이트 코드를 검사하기 위한 사용자 정의 어서션 메서드가 있습니다.
@end deffn

@geindex get_disassembly_as_string() (test.support.bytecode_helper.BytecodeTestCase 메서드)
@anchor{library/test test support bytecode_helper BytecodeTestCase get_disassembly_as_string}@anchor{4756}
@deffn {메서드} BytecodeTestCase.get_disassembly_as_string (co)

`co'의 역 어셈블리를 문자열로 반환합니다.
@end deffn

@geindex assertInBytecode() (test.support.bytecode_helper.BytecodeTestCase 메서드)
@anchor{library/test test support bytecode_helper BytecodeTestCase assertInBytecode}@anchor{4757}
@deffn {메서드} BytecodeTestCase.assertInBytecode (x, opname, argval=_UNSPECIFIED)

`opname'이 발견되면 명령어를 반환하고, 그렇지 않으면 @ref{8b7,,AssertionError}를 던집니다.
@end deffn

@geindex assertNotInBytecode() (test.support.bytecode_helper.BytecodeTestCase 메서드)
@anchor{library/test test support bytecode_helper BytecodeTestCase assertNotInBytecode}@anchor{4758}
@deffn {메서드} BytecodeTestCase.assertNotInBytecode (x, opname, argval=_UNSPECIFIED)

`opname'이 발견되면 @ref{8b7,,AssertionError}를 던집니다.
@end deffn

@node test support threading_helper — Utilities for threading tests,test support os_helper — Utilities for os tests,test support bytecode_helper — Support tools for testing correct bytecode generation,개발 도구
@anchor{library/test module-test support threading_helper}@anchor{f0}@anchor{library/test test-support-threading-helper-utilities-for-threading-tests}@anchor{4759}
@subsection @code{test.support.threading_helper} — Utilities for threading tests


@geindex module; test.support.threading_helper

The @code{test.support.threading_helper} module provides support for threading tests.


Added in version 3.10.


@geindex join_thread() (test.support.threading_helper 모듈)
@anchor{library/test test support threading_helper join_thread}@anchor{475a}
@deffn {함수} test.support.threading_helper.join_thread (thread, timeout=None)

`timeout' 내에 `thread'에 조인(join)합니다. 스레드가 `timeout' 초 후에도 여전히 살아 있으면 @ref{8b7,,AssertionError}를 발생시킵니다.
@end deffn

@geindex reap_threads() (test.support.threading_helper 모듈)
@anchor{library/test test support threading_helper reap_threads}@anchor{475b}
@deffn {함수} @@test.support.threading_helper.reap_threads

테스트가 실패하더라도 스레드를 정리하는 데코레이터.
@end deffn

@geindex start_threads() (test.support.threading_helper 모듈)
@anchor{library/test test support threading_helper start_threads}@anchor{475c}
@deffn {함수} test.support.threading_helper.start_threads (threads, unlock=None)

Context manager to start `threads', which is a sequence of threads.
`unlock' is a function called after the threads are started, even if an
exception was raised; an example would be @ref{3667,,threading.Event.set()}.
@code{start_threads} will attempt to join the started threads upon exit.
@end deffn

@geindex threading_cleanup() (test.support.threading_helper 모듈)
@anchor{library/test test support threading_helper threading_cleanup}@anchor{475d}
@deffn {함수} test.support.threading_helper.threading_cleanup (*original_values)

`original_values'에 지정되지 않은 스레드를 정리합니다. 테스트가 백그라운드에서 실행 중인 스레드를 남겨두면 경고를 내도록 설계되었습니다.
@end deffn

@geindex threading_setup() (test.support.threading_helper 모듈)
@anchor{library/test test support threading_helper threading_setup}@anchor{475e}
@deffn {함수} test.support.threading_helper.threading_setup ()

현재 스레드 수와 매달린(dangling) 스레드의 복사본을 반환합니다.
@end deffn

@geindex wait_threads_exit() (test.support.threading_helper 모듈)
@anchor{library/test test support threading_helper wait_threads_exit}@anchor{475f}
@deffn {함수} test.support.threading_helper.wait_threads_exit (timeout=None)

@code{with} 문에서 만들어진 모든 스레드가 종료할 때까지 대기하는 컨텍스트 관리자.
@end deffn

@geindex catch_threading_exception() (test.support.threading_helper 모듈)
@anchor{library/test test support threading_helper catch_threading_exception}@anchor{4760}
@deffn {함수} test.support.threading_helper.catch_threading_exception ()

@ref{a4b,,threading.excepthook()}을 사용하여 @ref{176,,threading.Thread} 예외를 포착하는 컨텍스트 관리자.

예외가 포착될 때 설정되는 어트리뷰트:


@itemize *

@item 
@code{exc_type}

@item 
@code{exc_value}

@item 
@code{exc_traceback}

@item 
@code{thread}
@end itemize

@ref{a4b,,threading.excepthook()} 설명서를 참조하십시오.

이러한 어트리뷰트들은 컨텍스트 관리자 탈출 시에 삭제됩니다.

용법:

@example
with threading_helper.catch_threading_exception() as cm:
    # 예외를 발생시키는 스레드를 생성하는 코드
    ...

    # 스레드 예외를 확인합니다, cm 어트리뷰트를 사용하십시오:
    # exc_type, exc_value, exc_traceback, thread
    ...

# 이 지점에서 cm 의 exc_type, exc_value, exc_traceback, thread 어트리뷰트는
# 더는 존재하지 않습니다
# (참조 순환을 피하고자)
@end example


Added in version 3.8.

@end deffn

@geindex run_concurrently() (test.support.threading_helper 모듈)
@anchor{library/test test support threading_helper run_concurrently}@anchor{4761}
@deffn {함수} test.support.threading_helper.run_concurrently (worker_func, nthreads, args=(), kwargs=@{@})

Run the worker function concurrently in multiple threads.
Re-raises an exception if any thread raises one, after all threads have
finished.
@end deffn

@node test support os_helper — Utilities for os tests,test support import_helper — Utilities for import tests,test support threading_helper — Utilities for threading tests,개발 도구
@anchor{library/test module-test support os_helper}@anchor{ed}@anchor{library/test test-support-os-helper-utilities-for-os-tests}@anchor{4762}
@subsection @code{test.support.os_helper} — Utilities for os tests


@geindex module; test.support.os_helper

The @code{test.support.os_helper} module provides support for os tests.


Added in version 3.10.


@geindex FS_NONASCII (test.support.os_helper 모듈)
@anchor{library/test test support os_helper FS_NONASCII}@anchor{4763}
@deffn {데이터} test.support.os_helper.FS_NONASCII

@ref{e4e,,os.fsencode()}로 인코딩 할 수 있는 비 ASCII 문자.
@end deffn

@geindex SAVEDCWD (test.support.os_helper 모듈)
@anchor{library/test test support os_helper SAVEDCWD}@anchor{4764}
@deffn {데이터} test.support.os_helper.SAVEDCWD

@ref{190a,,os.getcwd()}로 설정합니다.
@end deffn

@geindex TESTFN (test.support.os_helper 모듈)
@anchor{library/test test support os_helper TESTFN}@anchor{4765}
@deffn {데이터} test.support.os_helper.TESTFN

임시 파일의 이름으로 사용하기에 안전한 이름으로 설정합니다. 만들어진 모든 임시 파일은 닫히고 언 링크(제거) 되어야 합니다.
@end deffn

@geindex TESTFN_NONASCII (test.support.os_helper 모듈)
@anchor{library/test test support os_helper TESTFN_NONASCII}@anchor{4766}
@deffn {데이터} test.support.os_helper.TESTFN_NONASCII

Set to a filename containing the @ref{4763,,FS_NONASCII} character, if it exists.
This guarantees that if the filename exists, it can be encoded and decoded
with the default filesystem encoding. This allows tests that require a
non-ASCII filename to be easily skipped on platforms where they can’t work.
@end deffn

@geindex TESTFN_UNENCODABLE (test.support.os_helper 모듈)
@anchor{library/test test support os_helper TESTFN_UNENCODABLE}@anchor{4767}
@deffn {데이터} test.support.os_helper.TESTFN_UNENCODABLE

엄격(strict) 모드에서 파일 시스템 인코딩으로 인코딩할 수 없는 파일명(str 형)으로 설정합니다. 이러한 파일명을 생성할 수 없으면 @code{None}일 수 있습니다.
@end deffn

@geindex TESTFN_UNDECODABLE (test.support.os_helper 모듈)
@anchor{library/test test support os_helper TESTFN_UNDECODABLE}@anchor{4768}
@deffn {데이터} test.support.os_helper.TESTFN_UNDECODABLE

엄격(strict) 모드에서 파일 시스템 인코딩으로 디코딩할 수 없는 파일명(bytes 형)으로 설정합니다. 이러한 파일명을 생성할 수 없으면 @code{None}일 수 있습니다.
@end deffn

@geindex TESTFN_UNICODE (test.support.os_helper 모듈)
@anchor{library/test test support os_helper TESTFN_UNICODE}@anchor{4769}
@deffn {데이터} test.support.os_helper.TESTFN_UNICODE

임시 파일을 위한 비 ASCII 이름으로 설정합니다.
@end deffn

@geindex EnvironmentVarGuard (test.support.os_helper 클래스)
@anchor{library/test test support os_helper EnvironmentVarGuard}@anchor{15e7}
@deffn {클래스} test.support.os_helper.EnvironmentVarGuard

환경 변수를 임시로 설정하거나 설정 해제하는 데 사용되는 클래스. 인스턴스는 컨텍스트 관리자로 사용할 수 있으며 하부 @code{os.environ}을 조회/수정하기 위한 완전한 딕셔너리 인터페이스를 가질 수 있습니다. 컨텍스트 관리자를 탈출하면 이 인스턴스를 통해 수행된 환경 변수에 대한 모든 변경 사항이 되돌려집니다.


버전 3.1에서 변경: 딕셔너리 인터페이스가 추가되었습니다.

@end deffn

@geindex FakePath (test.support.os_helper 클래스)
@anchor{library/test test support os_helper FakePath}@anchor{476a}
@deffn {클래스} test.support.os_helper.FakePath (path)

단순 @ref{5a0,,경로류 객체}. 단지 `path' 인자를 반환하는 @ref{e4b,,__fspath__()} 메서드를 구현합니다. `path'가 예외이면, @code{__fspath__()}에서 발생시킵니다.
@end deffn

@geindex set() (test.support.os_helper.EnvironmentVarGuard 메서드)
@anchor{library/test test support os_helper EnvironmentVarGuard set}@anchor{476b}
@deffn {메서드} EnvironmentVarGuard.set (envvar, value)

일시적으로 환경 변수 @code{envvar}를 @code{value} 값으로 설정합니다.
@end deffn

@geindex unset() (test.support.os_helper.EnvironmentVarGuard 메서드)
@anchor{library/test test support os_helper EnvironmentVarGuard unset}@anchor{1875}
@deffn {메서드} EnvironmentVarGuard.unset (envvar, *others)

Temporarily unset one or more environment variables.


버전 3.14에서 변경: More than one environment variable can be unset.

@end deffn

@geindex can_symlink() (test.support.os_helper 모듈)
@anchor{library/test test support os_helper can_symlink}@anchor{476c}
@deffn {함수} test.support.os_helper.can_symlink ()

OS가 심볼릭 링크를 지원하면 @code{True}를, 그렇지 않으면 @code{False}를 반환합니다.
@end deffn

@geindex can_xattr() (test.support.os_helper 모듈)
@anchor{library/test test support os_helper can_xattr}@anchor{476d}
@deffn {함수} test.support.os_helper.can_xattr ()

OS가 xattr을 지원하면 @code{True}를, 그렇지 않으면 @code{False}를 반환합니다.
@end deffn

@geindex change_cwd() (test.support.os_helper 모듈)
@anchor{library/test test support os_helper change_cwd}@anchor{476e}
@deffn {함수} test.support.os_helper.change_cwd (path, quiet=False)

현재 작업 디렉터리를 `path'로 일시적으로 변경하고 그 디렉터리를 산출하는 컨텍스트 관리자.

`quiet'가 @code{False}이면, 컨텍스트 관리자는 에러 시 예외를 발생시킵니다. 그렇지 않으면, 경고만 발행하고 현재 작업 디렉터리를 같게 유지합니다.
@end deffn

@geindex create_empty_file() (test.support.os_helper 모듈)
@anchor{library/test test support os_helper create_empty_file}@anchor{476f}
@deffn {함수} test.support.os_helper.create_empty_file (filename)

`filename'으로 빈 파일을 만듭니다. 이미 있으면, 자릅니다.
@end deffn

@geindex fd_count() (test.support.os_helper 모듈)
@anchor{library/test test support os_helper fd_count}@anchor{4770}
@deffn {함수} test.support.os_helper.fd_count ()

열린 파일 기술자의 수를 셉니다.
@end deffn

@geindex fs_is_case_insensitive() (test.support.os_helper 모듈)
@anchor{library/test test support os_helper fs_is_case_insensitive}@anchor{4771}
@deffn {함수} test.support.os_helper.fs_is_case_insensitive (directory)

`directory'의 파일 시스템이 대소 문자를 구분하지 않으면 @code{True}를 반환합니다.
@end deffn

@geindex make_bad_fd() (test.support.os_helper 모듈)
@anchor{library/test test support os_helper make_bad_fd}@anchor{4772}
@deffn {함수} test.support.os_helper.make_bad_fd ()

임시 파일을 여닫아서 잘못된 파일 기술자를 만든 다음, 그 기술자를 반환합니다.
@end deffn

@geindex rmdir() (test.support.os_helper 모듈)
@anchor{library/test test support os_helper rmdir}@anchor{4773}
@deffn {함수} test.support.os_helper.rmdir (filename)

`filename'에 대해 @ref{12f8,,os.rmdir()}을 호출합니다. 윈도우 플랫폼에서는, 파일의 존재를 확인하는 대기 루프로 래핑 됩니다. 이는 파일을 열려있는 상태로 유지하고 삭제를 막을 수 있는 안티바이러스 프로그램 때문에 필요합니다.
@end deffn

@geindex rmtree() (test.support.os_helper 모듈)
@anchor{library/test test support os_helper rmtree}@anchor{4774}
@deffn {함수} test.support.os_helper.rmtree (path)

`path'에 대해 @ref{356,,shutil.rmtree()}를 호출하거나 @ref{6c7,,os.lstat()}과 @ref{12f8,,os.rmdir()}을 호출하여 경로와 해당 내용을 제거합니다. @ref{4773,,rmdir()}과 마찬가지로, 윈도우 플랫폼에서, 이것은 파일의 존재를 확인하는 대기 루프로 래핑 됩니다.
@end deffn

@geindex skip_unless_symlink() (test.support.os_helper 모듈)
@anchor{library/test test support os_helper skip_unless_symlink}@anchor{4775}
@deffn {함수} @@test.support.os_helper.skip_unless_symlink

심볼릭 링크 지원이 필요한 테스트를 실행하기 위한 데코레이터.
@end deffn

@geindex skip_unless_xattr() (test.support.os_helper 모듈)
@anchor{library/test test support os_helper skip_unless_xattr}@anchor{4776}
@deffn {함수} @@test.support.os_helper.skip_unless_xattr

xattr 지원이 필요한 테스트를 실행하기 위한 데코레이터.
@end deffn

@geindex temp_cwd() (test.support.os_helper 모듈)
@anchor{library/test test support os_helper temp_cwd}@anchor{4777}
@deffn {함수} test.support.os_helper.temp_cwd (name='tempcwd', quiet=False)

임시로 새 디렉터리를 만들고 현재 작업 디렉터리(CWD)를 변경하는 컨텍스트 관리자.

컨텍스트 관리자는 현재 작업 디렉터리를 임시로 변경하기 전에 이름이 `name'인 임시 디렉터리를 현재 디렉터리에 만듭니다. `name'이 @code{None}이면, 임시 디렉터리는 @ref{52d,,tempfile.mkdtemp()}를 사용하여 만들어집니다.

`quiet'가 @code{False}이고 만들 수 없거나 CWD를 변경할 수 없으면, 에러가 발생합니다. 그렇지 않으면, 경고만 발생하고 원래 CWD가 사용됩니다.
@end deffn

@geindex temp_dir() (test.support.os_helper 모듈)
@anchor{library/test test support os_helper temp_dir}@anchor{4778}
@deffn {함수} test.support.os_helper.temp_dir (path=None, quiet=False)

`path'에 임시 디렉터리를 만들고 그 디렉터리를 산출하는 컨텍스트 관리자.

`path'가 @code{None}이면, 임시 디렉터리는 @ref{52d,,tempfile.mkdtemp()}를 사용하여 만들어집니다. `quiet'가 @code{False}이면, 컨텍스트 관리자는 에러 시 예외를 발생시킵니다. 그렇지 않으면, `path'가 지정되고 만들 수 없으면, 경고만 발행됩니다.
@end deffn

@geindex temp_umask() (test.support.os_helper 모듈)
@anchor{library/test test support os_helper temp_umask}@anchor{4779}
@deffn {함수} test.support.os_helper.temp_umask (umask)

프로세스 umask를 임시로 설정하는 컨텍스트 관리자.
@end deffn

@geindex unlink() (test.support.os_helper 모듈)
@anchor{library/test test support os_helper unlink}@anchor{477a}
@deffn {함수} test.support.os_helper.unlink (filename)

`filename'에 대해 @ref{12fa,,os.unlink()}를 호출합니다. @ref{4773,,rmdir()}과 마친가지로, 윈도우 플랫폼에서는, 파일의 존재를 확인하는 대기 루프로 래핑 됩니다.
@end deffn

@node test support import_helper — Utilities for import tests,test support warnings_helper — Utilities for warnings tests,test support os_helper — Utilities for os tests,개발 도구
@anchor{library/test module-test support import_helper}@anchor{ec}@anchor{library/test test-support-import-helper-utilities-for-import-tests}@anchor{477b}
@subsection @code{test.support.import_helper} — Utilities for import tests


@geindex module; test.support.import_helper

The @code{test.support.import_helper} module provides support for import tests.


Added in version 3.10.


@geindex forget() (test.support.import_helper 모듈)
@anchor{library/test test support import_helper forget}@anchor{477c}
@deffn {함수} test.support.import_helper.forget (module_name)

@code{sys.modules}에서 `module_name'이라는 모듈을 제거하고 모듈의 바이트 컴파일된 파일을 삭제합니다.
@end deffn

@geindex import_fresh_module() (test.support.import_helper 모듈)
@anchor{library/test test support import_helper import_fresh_module}@anchor{1c60}
@deffn {함수} test.support.import_helper.import_fresh_module (name, fresh=(), blocked=(), deprecated=False)

이 함수는 임포트 전에 @code{sys.modules}에서 명명된 모듈을 제거하여 명명된 파이썬 모듈의 새 복사본을 임포트하고 반환합니다. @code{reload()}와 달리, 원래 모듈은 이 연산의 영향을 받지 않습니다.

`fresh'는 임포트를 수행하기 전에 @code{sys.modules} 캐시에서 함께 제거되는 추가 모듈 이름의 이터러블입니다.

`blocked'는 임포트 하는 동안 모듈 캐시에서 @code{None}으로 대체되는 모듈 이름의 이터러블로, 임포트 하려고 시도하면 @ref{659,,ImportError}가 발생하도록 합니다.

명명된 모듈과 `fresh'와 `blocked' 매개 변수에 명명된 모든 모듈은 임포트를 시작하기 전에 보관되고 새 임포트가 완료되면 @code{sys.modules}에 다시 삽입됩니다.

`deprecated'가 @code{True}이면 이 임포트 중에 모듈과 패키지 폐지 메시지가 억제됩니다.

이 함수는 명명된 모듈을 임포트 할 수 없으면 @ref{659,,ImportError}를 발생시킵니다.

사용 예:

@example
# 나머지 테스트 스위트에서 사용 중인 버전에 영향을 주지 않고 테스트용 경고 모듈의 사본을
# 얻습니다. 한 사본은 C 구현을 사용하고, 다른 사본은 순수한 파이썬 대체 구현을 사용하도록
# 강요됩니다.
py_warnings = import_fresh_module('warnings', blocked=['_warnings'])
c_warnings = import_fresh_module('warnings', fresh=['_warnings'])
@end example


Added in version 3.1.

@end deffn

@geindex import_module() (test.support.import_helper 모듈)
@anchor{library/test test support import_helper import_module}@anchor{477d}
@deffn {함수} test.support.import_helper.import_module (name, deprecated=False, *, required_on=())

이 함수는 명명된 모듈을 임포트하고 반환합니다. 일반 임포트와 달리, 이 함수는 모듈을 임포트할 수 없으면 @ref{11e3,,unittest.SkipTest}를 발생시킵니다.

`deprecated'가 @code{True}이면 이 임포트 중에 모듈과 패키지 폐지 메시지가 억제됩니다. 모듈이 한 플랫폼에서는 필수지만, 다른 곳에서는 선택적이면, `required_on'을 @ref{291,,sys.platform}과 비교할 플랫폼 접두사의 이터러블로 설정합니다.


Added in version 3.1.

@end deffn

@geindex modules_setup() (test.support.import_helper 모듈)
@anchor{library/test test support import_helper modules_setup}@anchor{477e}
@deffn {함수} test.support.import_helper.modules_setup ()

@ref{17ea,,sys.modules}의 복사본을 반환합니다.
@end deffn

@geindex modules_cleanup() (test.support.import_helper 모듈)
@anchor{library/test test support import_helper modules_cleanup}@anchor{477f}
@deffn {함수} test.support.import_helper.modules_cleanup (oldmodules)

내부 캐시를 보존하기 위해 `oldmodules'와 @code{encodings}를 제외한 모듈들을 제거합니다.
@end deffn

@geindex unload() (test.support.import_helper 모듈)
@anchor{library/test test support import_helper unload}@anchor{4780}
@deffn {함수} test.support.import_helper.unload (name)

@code{sys.modules}에서 `name'을 삭제합니다.
@end deffn

@geindex make_legacy_pyc() (test.support.import_helper 모듈)
@anchor{library/test test support import_helper make_legacy_pyc}@anchor{4781}
@deffn {함수} test.support.import_helper.make_legacy_pyc (source)

@geindex Python 향상 제안; PEP 3147
PEP 3147@footnote{https://peps.python.org/pep-3147/}/
@geindex Python 향상 제안; PEP 488
PEP 488@footnote{https://peps.python.org/pep-0488/} pyc 파일을 레거시 pyc 위치로 옮기고 레거시 pyc 파일에 대한 파일 시스템 경로를 반환합니다. `source' 값은 소스 파일에 대한 파일 시스템 경로입니다. 반드시 존재할 필요는 없지만, PEP 3147/488 pyc 파일이 있어야 합니다.
@end deffn

@geindex CleanImport (test.support.import_helper 클래스)
@anchor{library/test test support import_helper CleanImport}@anchor{4782}
@deffn {클래스} test.support.import_helper.CleanImport (*module_names)

새 모듈 참조를 반환하도록 임포트를 강제하는 컨텍스트 관리자. 이는 임포트 시 @ref{1a3,,DeprecationWarning}의 방출과 같은 모듈 수준 동작을 테스트하는 데 유용합니다. 사용 예:

@example
with CleanImport('foo'):
    importlib.import_module('foo')  # 새 참조.
@end example
@end deffn

@geindex DirsOnSysPath (test.support.import_helper 클래스)
@anchor{library/test test support import_helper DirsOnSysPath}@anchor{4783}
@deffn {클래스} test.support.import_helper.DirsOnSysPath (*paths)

@ref{3e4,,sys.path}에 디렉터리를 임시로 추가하는 컨텍스트 관리자.

이렇게 하면 @ref{3e4,,sys.path}의 복사본이 만들어지고, 위치 인자로 지정된 모든 디렉터리를 추가한 다음, 컨텍스트가 끝나면 @code{sys.path}를 복사된 설정으로 되돌립니다.

객체 교체를 포함하여, 컨텍스트 관리자 본문의 `모든' @ref{3e4,,sys.path} 수정 사항은 블록 끝에서 되돌려짐에 유의하십시오.
@end deffn

@node test support warnings_helper — Utilities for warnings tests,,test support import_helper — Utilities for import tests,개발 도구
@anchor{library/test module-test support warnings_helper}@anchor{f1}@anchor{library/test test-support-warnings-helper-utilities-for-warnings-tests}@anchor{4784}
@subsection @code{test.support.warnings_helper} — Utilities for warnings tests


@geindex module; test.support.warnings_helper

The @code{test.support.warnings_helper} module provides support for warnings tests.


Added in version 3.10.


@geindex ignore_warnings() (test.support.warnings_helper 모듈)
@anchor{library/test test support warnings_helper ignore_warnings}@anchor{4785}
@deffn {함수} test.support.warnings_helper.ignore_warnings (*, category)

Suppress warnings that are instances of `category',
which must be @ref{2718,,Warning} or a subclass.
Roughly equivalent to @ref{179,,warnings.catch_warnings()}
with @ref{8cf,,warnings.simplefilter('ignore'@comma{} category=category)}.
For example:

@example
@@warning_helper.ignore_warnings(category=DeprecationWarning)
def test_suppress_warning():
    # 뭔가 합니다
@end example


Added in version 3.8.

@end deffn

@geindex check_no_resource_warning() (test.support.warnings_helper 모듈)
@anchor{library/test test support warnings_helper check_no_resource_warning}@anchor{4786}
@deffn {함수} test.support.warnings_helper.check_no_resource_warning (testcase)

@ref{54e,,ResourceWarning}이 발생하지 않았는지 확인하는 컨텍스트 관리자. 컨텍스트 관리자가 끝나기 전에 @code{ResourceWarning}을 방출할 수 있는 객체를 제거해야 합니다.
@end deffn

@geindex check_syntax_warning() (test.support.warnings_helper 모듈)
@anchor{library/test test support warnings_helper check_syntax_warning}@anchor{4787}
@deffn {함수} test.support.warnings_helper.check_syntax_warning (testcase, statement, errtext='@w{'}, *, lineno=1, offset=None)

`statement' 컴파일을 시도하여 `statement'에서 구문 경고를 테스트합니다. @ref{1ae,,SyntaxWarning}이 한 번만 방출되고, 에러로 바꿀 때 @ref{18e,,SyntaxError}로 변환되는지도 테스트합니다. `testcase'는 테스트를 위한 @ref{10c,,unittest} 인스턴스입니다. `errtext'는 방출된 @code{SyntaxWarning}과 발생한 @code{SyntaxError}의 문자열 표현과 일치해야 하는 정규식입니다. `lineno'가 @code{None}이 아니면 경고와 예외 줄과 비교합니다. `offset'이 @code{None}이 아니면, 예외 오프셋과 비교합니다.


Added in version 3.8.

@end deffn

@geindex check_warnings() (test.support.warnings_helper 모듈)
@anchor{library/test test support warnings_helper check_warnings}@anchor{4788}
@deffn {함수} test.support.warnings_helper.check_warnings (*filters, quiet=True)

경고가 올바르게 발생했는지 테스트하기 쉽게 하는 @ref{179,,warnings.catch_warnings()} 용 편의 래퍼. @ref{8cf,,warnings.simplefilter()}를 @code{always}로 설정하고 기록된 결과를 자동으로 검증하는 옵션을 사용하여 @code{warnings.catch_warnings(record=True)}를 호출하는 것과 거의 동등합니다.

@code{check_warnings}는 위치 인자로 @code{("message regexp", WarningCategory)} 형식의 2-튜플을 받습니다. 하나 이상의 `filters'가 제공되거나, 선택적 키워드 인자 `quiet'가 @code{False}이면, 경고가 예상대로인지 확인합니다: 지정된 각 필터는 둘러싸인 코드에서 발생한 경고 중 적어도 하나와 일치해야 합니다. 그렇지 않으면 테스트가 실패합니다. 지정된 필터와 일치하지 않는 경고가 발생하면 테스트가 실패합니다. 첫 번째 검사를 비활성화하려면, `quiet'를 @code{True}로 설정합니다.

인자가 지정되지 않으면, 기본값은 다음과 같습니다:

@example
check_warnings(("", Warning), quiet=True)
@end example

이 경우 모든 경고가 포착되고 에러가 발생하지 않습니다.

컨텍스트 관리자에 진입하면, @code{WarningRecorder} 인스턴스가 반환됩니다. @ref{179,,catch_warnings()}의 하부 경고 리스트는 레코더 객체의 @ref{118,,warnings} 어트리뷰트를 통해 사용할 수 있습니다. 편의상, 가장 최근의 경고를 나타내는 객체의 어트리뷰트는 레코더 객체를 통해 직접 액세스 할 수도 있습니다 (아래 예를 참조하십시오). 경고가 발생하지 않으면, 객체에서 예상되는 경고를 나타내는 어트리뷰트는 @code{None}을 반환합니다.

레코더 객체에는 경고 리스트를 지우는 @code{reset()} 메서드도 있습니다.

컨텍스트 관리자는 다음과 같이 사용되도록 설계되었습니다:

@example
with check_warnings(("assertion is always true", SyntaxWarning),
                    ("", UserWarning)):
    exec('assert(False, "Hey!")')
    warnings.warn(UserWarning("Hide me!"))
@end example

이 경우 경고가 발생하지 않았거나, 다른 경고가 발생하면, @ref{4788,,check_warnings()}는 에러를 발생시킵니다.

테스트에서 경고가 발생했는지를 확인하는 것만이 아니라, 경고를 더 깊이 조사해야 할 때, 다음과 같은 코드를 사용할 수 있습니다:

@example
with check_warnings(quiet=True) as w:
    warnings.warn("foo")
    assert str(w.args[0]) == "foo"
    warnings.warn("bar")
    assert str(w.args[0]) == "bar"
    assert str(w.warnings[0].args[0]) == "foo"
    assert str(w.warnings[1].args[0]) == "bar"
    w.reset()
    assert len(w.warnings) == 0
@end example

여기에서 모든 경고가 포착되고, 테스트 코드는 포착된 경고를 직접 테스트합니다.


버전 3.2에서 변경: 새로운 선택적 인자 `filters'와 `quiet'.

@end deffn

@geindex WarningsRecorder (test.support.warnings_helper 클래스)
@anchor{library/test test support warnings_helper WarningsRecorder}@anchor{4789}
@deffn {클래스} test.support.warnings_helper.WarningsRecorder

단위 테스트에 대한 경고를 기록하는 데 사용되는 클래스. 자세한 내용은 위의 @ref{4788,,check_warnings()} 설명서를 참조하십시오.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 디버깅과 프로파일링,소프트웨어 패키징 및 배포,개발 도구,파이썬 표준 라이브러리
@anchor{library/debug doc}@anchor{478a}@anchor{library/debug debugging-and-profiling}@anchor{478b}@anchor{library/debug translation-repo}@anchor{478c}
@section 디버깅과 프로파일링


이 라이브러리들은 파이썬 개발을 돕습니다: 디버거를 사용하면 코드를 단계별로 실행하고, 스택 프레임을 분석하고, 중단 점을 설정할 수 있으며, 프로파일러는 코드를 실행하고, 프로그램의 병목 지점을 식별할 수 있도록 실행 시간을 자세하게 분석합니다. 감사 이벤트는 이것이 없다면 침입적인 디버깅이나 패치가 필요한 실행 시간 동작에 대한 가시성을 제공합니다.

@geindex 감사 이벤트
@anchor{library/audit_events audit-events}@anchor{1c11}
@menu
* 감사 이벤트 표:: 
* bdb — 디버거 프레임워크:: 
* faulthandler — 파이썬 트레이스백 덤프:: 
* pdb — The Python Debugger:: 
* 파이썬 프로파일러:: 
* timeit — 작은 코드 조각의 실행 시간 측정:: 
* trace — 파이썬 문장 실행 추적:: 
* tracemalloc — 메모리 할당 추적:: 

@end menu

@node 감사 이벤트 표,bdb — 디버거 프레임워크,,디버깅과 프로파일링
@anchor{library/audit_events doc}@anchor{478d}@anchor{library/audit_events audit-events-table}@anchor{478e}
@subsection 감사 이벤트 표


이 표는 CPython 런타임과 표준 라이브러리에서 @ref{191c,,sys.audit()}나 @ref{611,,PySys_Audit()} 호출에 의해 발생하는 모든 이벤트를 포함합니다. 이 호출은 3.8 이상에서 추가되었습니다 (
@geindex Python 향상 제안; PEP 578
PEP 578@footnote{https://peps.python.org/pep-0578/}을 참조하십시오).

이 이벤트 처리에 대한 정보는 @ref{478f,,sys.addaudithook()}과 @ref{4790,,PySys_AddAuditHook()}을 참조하십시오.

이 표는 CPython 설명서로부터 생성되며, 다른 구현에서 발생하는 이벤트를 나타내지 않을 수 있습니다. 실제 발생한 이벤트에 대해서는 여러분의 런타임 관련 설명서를 참조하십시오.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxx} 
@headitem

Audit event

@tab

Arguments

@tab

References

@item

_thread.start_new_thread

@tab

@code{function}, @code{args}, @code{kwargs}

@tab

@ref{4791,,[1]}

@item

array.__new__

@tab

@code{typecode}, @code{initializer}

@tab

@ref{4c0,,[1]}

@item

builtins.breakpoint

@tab

@code{breakpointhook}

@tab

@ref{271,,[1]}

@item

builtins.id

@tab

@code{id}

@tab

@ref{1628,,[1]}

@item

builtins.input

@tab

@code{prompt}

@tab

@ref{14dd,,[1]}

@item

builtins.input/result

@tab

@code{result}

@tab

@ref{14dd,,[1]}

@item

code.__new__

@tab

@code{code}, @code{filename}, @code{name}, @code{argcount}, @code{posonlyargcount}, @code{kwonlyargcount}, @code{nlocals}, @code{stacksize}, @code{flags}

@tab

@ref{32f,,[1]}

@item

compile

@tab

@code{source}, @code{filename}

@tab

@ref{4b2,,[1]}

@item

cpython.PyConfig_Set

@tab

@code{name}, @code{value}

@tab

@ref{37d,,[1]}

@item

cpython.PyInterpreterState_Clear

@tab



@tab

@ref{4792,,[1]}

@item

cpython.PyInterpreterState_New

@tab



@tab

@ref{4793,,[1]}

@item

cpython._PySys_ClearAuditHooks

@tab



@tab

@ref{f10,,[1]}

@item

cpython.remote_debugger_script

@tab

@code{script_path}

@tab

@ref{4794,,[1]}

@item

cpython.run_command

@tab

@code{command}

@tab

@ref{1a8,,[1]}

@item

cpython.run_file

@tab

@code{filename}

@tab

@ref{4795,,[1]}

@item

cpython.run_interactivehook

@tab

@code{hook}

@tab

@ref{11c7,,[1]}

@item

cpython.run_module

@tab

@code{module-name}

@tab

@ref{23c,,[1]}

@item

cpython.run_startup

@tab

@code{filename}

@tab

@ref{1b8,,[1]}

@item

cpython.run_stdin

@tab



@tab

@ref{4796,,[1]}@ref{4797,,[2]}@ref{4798,,[3]}

@item

ctypes.addressof

@tab

@code{obj}

@tab

@ref{3366,,[1]}

@item

ctypes.call_function

@tab

@code{func_pointer}, @code{arguments}

@tab

@ref{3360,,[1]}

@item

ctypes.cdata

@tab

@code{address}

@tab

@ref{3371,,[1]}

@item

ctypes.cdata/buffer

@tab

@code{pointer}, @code{size}, @code{offset}

@tab

@ref{3376,,[1]}@ref{3377,,[2]}

@item

ctypes.create_string_buffer

@tab

@code{init}, @code{size}

@tab

@ref{3319,,[1]}

@item

ctypes.create_unicode_buffer

@tab

@code{init}, @code{size}

@tab

@ref{1db1,,[1]}

@item

ctypes.dlopen

@tab

@code{name}

@tab

@ref{335d,,[1]}

@item

ctypes.dlsym

@tab

@code{library}, @code{name}

@tab

@ref{335d,,[1]}

@item

ctypes.dlsym/handle

@tab

@code{handle}, @code{name}

@tab

@ref{335d,,[1]}

@item

ctypes.get_errno

@tab



@tab

@ref{3355,,[1]}

@item

ctypes.get_last_error

@tab



@tab

@ref{3357,,[1]}

@item

ctypes.memoryview_at

@tab

@code{address}, @code{size}, @code{readonly}

@tab

@ref{4799,,[1]}

@item

ctypes.set_errno

@tab

@code{errno}

@tab

@ref{3356,,[1]}

@item

ctypes.set_exception

@tab

@code{code}

@tab

@ref{3360,,[1]}

@item

ctypes.set_last_error

@tab

@code{error}

@tab

@ref{3358,,[1]}

@item

ctypes.string_at

@tab

@code{ptr}, @code{size}

@tab

@ref{1ec,,[1]}

@item

ctypes.wstring_at

@tab

@code{ptr}, @code{size}

@tab

@ref{3370,,[1]}

@item

ensurepip.bootstrap

@tab

@code{root}

@tab

@ref{479a,,[1]}

@item

exec

@tab

@code{code_object}

@tab

@ref{4a4,,[1]}@ref{4a3,,[2]}

@item

fcntl.fcntl

@tab

@code{fd}, @code{cmd}, @code{arg}

@tab

@ref{1854,,[1]}

@item

fcntl.flock

@tab

@code{fd}, @code{operation}

@tab

@ref{479b,,[1]}

@item

fcntl.ioctl

@tab

@code{fd}, @code{request}, @code{arg}

@tab

@ref{1680,,[1]}

@item

fcntl.lockf

@tab

@code{fd}, @code{cmd}, @code{len}, @code{start}, @code{whence}

@tab

@ref{15f1,,[1]}

@item

ftplib.connect

@tab

@code{self}, @code{host}, @code{port}

@tab

@ref{4034,,[1]}

@item

ftplib.sendcmd

@tab

@code{self}, @code{cmd}

@tab

@ref{4039,,[1]}@ref{403a,,[2]}

@item

function.__new__

@tab

@code{code}

@tab

@ref{a83,,[1]}

@item

gc.get_objects

@tab

@code{generation}

@tab

@ref{a04,,[1]}

@item

gc.get_referents

@tab

@code{objs}

@tab

@ref{a06,,[1]}

@item

gc.get_referrers

@tab

@code{objs}

@tab

@ref{a05,,[1]}

@item

glob.glob

@tab

@code{pathname}, @code{recursive}

@tab

@ref{59f,,[1]}@ref{a08,,[2]}

@item

glob.glob/2

@tab

@code{pathname}, @code{recursive}, @code{root_dir}, @code{dir_fd}

@tab

@ref{59f,,[1]}@ref{a08,,[2]}

@item

http.client.connect

@tab

@code{self}, @code{host}, @code{port}

@tab

@ref{4017,,[1]}

@item

http.client.send

@tab

@code{self}, @code{data}

@tab

@ref{401b,,[1]}

@item

imaplib.open

@tab

@code{self}, @code{host}, @code{port}

@tab

@ref{b01,,[1]}

@item

imaplib.send

@tab

@code{self}, @code{data}

@tab

@ref{408c,,[1]}

@item

import

@tab

@code{module}, @code{filename}, @code{sys.path}, @code{sys.meta_path}, @code{sys.path_hooks}

@tab

@ref{7f7,,[1]}

@item

marshal.dumps

@tab

@code{value}, @code{version}

@tab

@ref{2d6a,,[1]}

@item

marshal.load

@tab



@tab

@ref{1df3,,[1]}

@item

marshal.loads

@tab

@code{bytes}

@tab

@ref{1df3,,[1]}

@item

mmap.__new__

@tab

@code{fileno}, @code{length}, @code{access}, @code{offset}

@tab

@ref{518,,[1]}

@item

msvcrt.get_osfhandle

@tab

@code{fd}

@tab

@ref{479c,,[1]}

@item

msvcrt.locking

@tab

@code{fd}, @code{mode}, @code{nbytes}

@tab

@ref{479d,,[1]}

@item

msvcrt.open_osfhandle

@tab

@code{handle}, @code{flags}

@tab

@ref{479e,,[1]}

@item

object.__delattr__

@tab

@code{obj}, @code{name}

@tab

@ref{2379,,[1]}

@item

object.__getattr__

@tab

@code{obj}, @code{name}

@tab

@ref{dca,,[1]}

@item

object.__setattr__

@tab

@code{obj}, @code{name}, @code{value}

@tab

@ref{2378,,[1]}

@item

open

@tab

@code{path}, @code{mode}, @code{flags}

@tab

@ref{316,,[1]}@ref{73f,,[2]}@ref{f91,,[3]}

@item

os.add_dll_directory

@tab

@code{path}

@tab

@ref{bdc,,[1]}

@item

os.chdir

@tab

@code{path}

@tab

@ref{820,,[1]}@ref{f88,,[2]}

@item

os.chflags

@tab

@code{path}, @code{flags}

@tab

@ref{12f2,,[1]}@ref{30a1,,[2]}

@item

os.chmod

@tab

@code{path}, @code{mode}, @code{dir_fd}

@tab

@ref{529,,[1]}@ref{52a,,[2]}@ref{528,,[3]}

@item

os.chown

@tab

@code{path}, @code{uid}, @code{gid}, @code{dir_fd}

@tab

@ref{12f3,,[1]}@ref{f89,,[2]}@ref{30a2,,[3]}

@item

os.exec

@tab

@code{path}, @code{args}, @code{env}

@tab

@ref{30db,,[1]}

@item

os.fork

@tab



@tab

@ref{4b6,,[1]}

@item

os.forkpty

@tab



@tab

@ref{4b7,,[1]}

@item

os.fwalk

@tab

@code{top}, @code{topdown}, @code{onerror}, @code{follow_symlinks}, @code{dir_fd}

@tab

@ref{d51,,[1]}

@item

os.getxattr

@tab

@code{path}, @code{attribute}

@tab

@ref{1309,,[1]}

@item

os.kill

@tab

@code{pid}, @code{sig}

@tab

@ref{156c,,[1]}

@item

os.killpg

@tab

@code{pgid}, @code{sig}

@tab

@ref{1db8,,[1]}

@item

os.link

@tab

@code{src}, @code{dst}, @code{src_dir_fd}, @code{dst_dir_fd}

@tab

@ref{12f4,,[1]}

@item

os.listdir

@tab

@code{path}

@tab

@ref{12ff,,[1]}

@item

os.listdrives

@tab



@tab

@ref{6c4,,[1]}

@item

os.listmounts

@tab

@code{volume}

@tab

@ref{6c6,,[1]}

@item

os.listvolumes

@tab



@tab

@ref{6c5,,[1]}

@item

os.listxattr

@tab

@code{path}

@tab

@ref{130a,,[1]}

@item

os.lockf

@tab

@code{fd}, @code{cmd}, @code{len}

@tab

@ref{1318,,[1]}

@item

os.mkdir

@tab

@code{path}, @code{mode}, @code{dir_fd}

@tab

@ref{52c,,[1]}@ref{52b,,[2]}

@item

os.posix_spawn

@tab

@code{path}, @code{argv}, @code{env}

@tab

@ref{52e,,[1]}@ref{1769,,[2]}

@item

os.putenv

@tab

@code{key}, @code{value}

@tab

@ref{25b,,[1]}

@item

os.remove

@tab

@code{path}, @code{dir_fd}

@tab

@ref{12f5,,[1]}@ref{30a6,,[2]}@ref{12fa,,[3]}

@item

os.removexattr

@tab

@code{path}, @code{attribute}

@tab

@ref{130b,,[1]}

@item

os.rename

@tab

@code{src}, @code{dst}, @code{src_dir_fd}, @code{dst_dir_fd}

@tab

@ref{12f6,,[1]}@ref{30a7,,[2]}@ref{12f7,,[3]}

@item

os.rmdir

@tab

@code{path}, @code{dir_fd}

@tab

@ref{12f8,,[1]}

@item

os.scandir

@tab

@code{path}

@tab

@ref{c53,,[1]}

@item

os.setxattr

@tab

@code{path}, @code{attribute}, @code{value}, @code{flags}

@tab

@ref{130c,,[1]}

@item

os.spawn

@tab

@code{mode}, @code{path}, @code{args}, @code{env}

@tab

@ref{31b,,[1]}

@item

os.startfile

@tab

@code{path}, @code{operation}

@tab

@ref{1c80,,[1]}

@item

os.startfile/2

@tab

@code{path}, @code{operation}, @code{arguments}, @code{cwd}, @code{show_cmd}

@tab

@ref{1c80,,[1]}

@item

os.symlink

@tab

@code{src}, @code{dst}, @code{dir_fd}

@tab

@ref{12f9,,[1]}

@item

os.system

@tab

@code{command}

@tab

@ref{1662,,[1]}

@item

os.truncate

@tab

@code{fd}, @code{length}

@tab

@ref{f8e,,[1]}@ref{103b,,[2]}

@item

os.unsetenv

@tab

@code{key}

@tab

@ref{25c,,[1]}

@item

os.utime

@tab

@code{path}, @code{times}, @code{ns}, @code{dir_fd}

@tab

@ref{12fb,,[1]}

@item

os.walk

@tab

@code{top}, @code{topdown}, @code{onerror}, @code{followlinks}

@tab

@ref{6cf,,[1]}

@item

pathlib.Path.glob

@tab

@code{self}, @code{pattern}

@tab

@ref{537,,[1]}

@item

pathlib.Path.rglob

@tab

@code{self}, @code{pattern}

@tab

@ref{538,,[1]}

@item

pdb.Pdb

@tab



@tab

@ref{273,,[1]}

@item

pickle.find_class

@tab

@code{module}, @code{name}

@tab

@ref{2d40,,[1]}

@item

poplib.connect

@tab

@code{self}, @code{host}, @code{port}

@tab

@ref{b1d,,[1]}@ref{b1e,,[2]}

@item

poplib.putline

@tab

@code{self}, @code{line}

@tab

@ref{b1d,,[1]}@ref{b1e,,[2]}

@item

pty.spawn

@tab

@code{argv}

@tab

@ref{1181,,[1]}

@item

resource.prlimit

@tab

@code{pid}, @code{resource}, @code{limits}

@tab

@ref{1189,,[1]}

@item

resource.setrlimit

@tab

@code{resource}, @code{limits}

@tab

@ref{17cc,,[1]}

@item

setopencodehook

@tab



@tab

@ref{1a99,,[1]}

@item

shutil.chown

@tab

@code{path}, @code{user}, @code{group}

@tab

@ref{548,,[1]}

@item

shutil.copyfile

@tab

@code{src}, @code{dst}

@tab

@ref{c4e,,[1]}@ref{c4f,,[2]}@ref{c4d,,[3]}

@item

shutil.copymode

@tab

@code{src}, @code{dst}

@tab

@ref{c4e,,[1]}@ref{1a24,,[2]}

@item

shutil.copystat

@tab

@code{src}, @code{dst}

@tab

@ref{c4f,,[1]}@ref{1333,,[2]}

@item

shutil.copytree

@tab

@code{src}, @code{dst}

@tab

@ref{c1d,,[1]}

@item

shutil.make_archive

@tab

@code{base_name}, @code{format}, @code{root_dir}, @code{base_dir}

@tab

@ref{6d9,,[1]}

@item

shutil.move

@tab

@code{src}, @code{dst}

@tab

@ref{c50,,[1]}

@item

shutil.rmtree

@tab

@code{path}, @code{dir_fd}

@tab

@ref{356,,[1]}

@item

shutil.unpack_archive

@tab

@code{filename}, @code{extract_dir}, @code{format}

@tab

@ref{695,,[1]}

@item

signal.pthread_kill

@tab

@code{thread_id}, @code{signalnum}

@tab

@ref{1336,,[1]}

@item

smtplib.connect

@tab

@code{self}, @code{host}, @code{port}

@tab

@ref{1dac,,[1]}

@item

smtplib.send

@tab

@code{self}, @code{data}

@tab

@ref{b27,,[1]}

@item

socket.__new__

@tab

@code{self}, @code{family}, @code{type}, @code{protocol}

@tab

@ref{fa0,,[1]}

@item

socket.bind

@tab

@code{self}, @code{address}

@tab

@ref{173f,,[1]}

@item

socket.connect

@tab

@code{self}, @code{address}

@tab

@ref{fa2,,[1]}@ref{173e,,[2]}

@item

socket.getaddrinfo

@tab

@code{host}, @code{port}, @code{family}, @code{type}, @code{protocol}

@tab

@ref{176f,,[1]}

@item

socket.gethostbyaddr

@tab

@code{ip_address}

@tab

@ref{1c81,,[1]}

@item

socket.gethostbyname

@tab

@code{hostname}

@tab

@ref{39cd,,[1]}@ref{1c82,,[2]}

@item

socket.gethostname

@tab



@tab

@ref{304d,,[1]}

@item

socket.getnameinfo

@tab

@code{sockaddr}

@tab

@ref{1a3b,,[1]}

@item

socket.getservbyname

@tab

@code{servicename}, @code{protocolname}

@tab

@ref{39cf,,[1]}

@item

socket.getservbyport

@tab

@code{port}, @code{protocolname}

@tab

@ref{39d0,,[1]}

@item

socket.sendmsg

@tab

@code{self}, @code{address}

@tab

@ref{6a0,,[1]}

@item

socket.sendto

@tab

@code{self}, @code{address}

@tab

@ref{fa8,,[1]}

@item

socket.sethostname

@tab

@code{name}

@tab

@ref{1340,,[1]}

@item

sqlite3.connect

@tab

@code{database}

@tab

@ref{5a5,,[1]}

@item

sqlite3.connect/handle

@tab

@code{connection_handle}

@tab

@ref{5a5,,[1]}

@item

sqlite3.enable_load_extension

@tab

@code{connection}, @code{enabled}

@tab

@ref{a3f,,[1]}

@item

sqlite3.load_extension

@tab

@code{connection}, @code{path}

@tab

@ref{6de,,[1]}

@item

subprocess.Popen

@tab

@code{executable}, @code{args}, @code{cwd}, @code{env}

@tab

@ref{4b8,,[1]}

@item

sys._current_exceptions

@tab



@tab

@ref{6e8,,[1]}

@item

sys._current_frames

@tab



@tab

@ref{1638,,[1]}

@item

sys._getframe

@tab

@code{frame}

@tab

@ref{8ef,,[1]}

@item

sys._getframemodulename

@tab

@code{depth}

@tab

@ref{1add,,[1]}

@item

sys.addaudithook

@tab



@tab

@ref{4790,,[1]}@ref{478f,,[2]}

@item

sys.excepthook

@tab

@code{hook}, @code{type}, @code{value}, @code{traceback}

@tab

@ref{a0c,,[1]}

@item

sys.monitoring.register_callback

@tab

@code{func}

@tab

@ref{479f,,[1]}

@item

sys.remote_exec

@tab

@code{pid}

@tab

@ref{47a0,,[1]}

@item

sys.set_asyncgen_hooks_finalizer

@tab



@tab

@ref{199e,,[1]}

@item

sys.set_asyncgen_hooks_firstiter

@tab



@tab

@ref{199e,,[1]}

@item

sys.setprofile

@tab



@tab

@ref{1703,,[1]}

@item

sys.settrace

@tab



@tab

@ref{2e1,,[1]}

@item

sys.unraisablehook

@tab

@code{hook}, @code{unraisable}

@tab

@ref{506,,[1]}

@item

syslog.closelog

@tab



@tab

@ref{760,,[1]}

@item

syslog.openlog

@tab

@code{ident}, @code{logoption}, @code{facility}

@tab

@ref{75f,,[1]}

@item

syslog.setlogmask

@tab

@code{maskpri}

@tab

@ref{47a1,,[1]}

@item

syslog.syslog

@tab

@code{priority}, @code{message}

@tab

@ref{761,,[1]}

@item

tempfile.mkdtemp

@tab

@code{fullpath}

@tab

@ref{1439,,[1]}@ref{52d,,[2]}

@item

tempfile.mkstemp

@tab

@code{fullpath}

@tab

@ref{6ec,,[1]}@ref{2cf0,,[2]}@ref{2cf1,,[3]}

@item

time.sleep

@tab

@code{secs}

@tab

@ref{47a2,,[1]}

@item

urllib.Request

@tab

@code{fullurl}, @code{data}, @code{headers}, @code{method}

@tab

@ref{307,,[1]}

@item

webbrowser.open

@tab

@code{url}

@tab

@ref{175d,,[1]}

@item

winreg.ConnectRegistry

@tab

@code{computer_name}, @code{key}

@tab

@ref{47a3,,[1]}

@item

winreg.CreateKey

@tab

@code{key}, @code{sub_key}, @code{access}

@tab

@ref{47a4,,[1]}@ref{1567,,[2]}

@item

winreg.DeleteKey

@tab

@code{key}, @code{sub_key}, @code{access}

@tab

@ref{47a5,,[1]}@ref{1568,,[2]}

@item

winreg.DeleteValue

@tab

@code{key}, @code{value}

@tab

@ref{47a6,,[1]}

@item

winreg.DisableReflectionKey

@tab

@code{key}

@tab

@ref{1569,,[1]}

@item

winreg.EnableReflectionKey

@tab

@code{key}

@tab

@ref{156a,,[1]}

@item

winreg.EnumKey

@tab

@code{key}, @code{index}

@tab

@ref{47a7,,[1]}

@item

winreg.EnumValue

@tab

@code{key}, @code{index}

@tab

@ref{47a8,,[1]}

@item

winreg.ExpandEnvironmentStrings

@tab

@code{str}

@tab

@ref{15fd,,[1]}

@item

winreg.LoadKey

@tab

@code{key}, @code{sub_key}, @code{file_name}

@tab

@ref{47a9,,[1]}

@item

winreg.OpenKey

@tab

@code{key}, @code{sub_key}, @code{access}

@tab

@ref{47aa,,[1]}

@item

winreg.OpenKey/result

@tab

@code{key}

@tab

@ref{47a4,,[1]}@ref{1567,,[2]}@ref{47aa,,[3]}

@item

winreg.PyHKEY.Detach

@tab

@code{key}

@tab

@ref{47ab,,[1]}

@item

winreg.QueryInfoKey

@tab

@code{key}

@tab

@ref{47ac,,[1]}

@item

winreg.QueryReflectionKey

@tab

@code{key}

@tab

@ref{156b,,[1]}

@item

winreg.QueryValue

@tab

@code{key}, @code{sub_key}, @code{value_name}

@tab

@ref{47ad,,[1]}@ref{178b,,[2]}

@item

winreg.SaveKey

@tab

@code{key}, @code{file_name}

@tab

@ref{47ae,,[1]}

@item

winreg.SetValue

@tab

@code{key}, @code{sub_key}, @code{type}, @code{value}

@tab

@ref{47af,,[1]}@ref{1b01,,[2]}

@end multitable


다음 이벤트는 내부적으로 발생하며 어떤 CPython의 공개 API에도 해당하지 않습니다:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

감사 이벤트

@tab

인자

@item

_winapi.CreateFile

@tab

@code{file_name}, @code{desired_access},
@code{share_mode}, @code{creation_disposition},
@code{flags_and_attributes}

@item

_winapi.CreateJunction

@tab

@code{src_path}, @code{dst_path}

@item

_winapi.CreateNamedPipe

@tab

@code{name}, @code{open_mode}, @code{pipe_mode}

@item

_winapi.CreatePipe

@tab

@item

_winapi.CreateProcess

@tab

@code{application_name}, @code{command_line},
@code{current_directory}

@item

_winapi.OpenProcess

@tab

@code{process_id}, @code{desired_access}

@item

_winapi.TerminateProcess

@tab

@code{handle}, @code{exit_code}

@item

_posixsubprocess.fork_exec

@tab

@code{exec_list}, @code{args}, @code{env}

@item

ctypes.PyObj_FromPtr

@tab

@code{obj}

@end multitable



Added in version 3.14: The @code{_posixsubprocess.fork_exec} internal audit event.


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node bdb — 디버거 프레임워크,faulthandler — 파이썬 트레이스백 덤프,감사 이벤트 표,디버깅과 프로파일링
@anchor{library/bdb doc}@anchor{47b0}@anchor{library/bdb bdb-debugger-framework}@anchor{47b1}@anchor{library/bdb module-bdb}@anchor{10}@anchor{library/bdb translation-repo}@anchor{47b2}
@subsection @code{bdb} — 디버거 프레임워크


@geindex module; bdb

`소스 코드:' Lib/bdb.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/bdb.py}


__________________________________________________________________


The @code{bdb} module handles basic debugger functions, like setting breakpoints
or managing execution via the debugger.

다음 예외가 정의됩니다:

@geindex BdbQuit
@anchor{library/bdb bdb BdbQuit}@anchor{278}
@deffn {예외} bdb.BdbQuit

디버거를 종료하기 위해 @ref{2d5,,Bdb} 클래스가 발생시키는 예외.
@end deffn

The @code{bdb} module also defines two classes:

@geindex Breakpoint (bdb 클래스)
@anchor{library/bdb bdb Breakpoint}@anchor{47b3}
@deffn {클래스} bdb.Breakpoint (self, file, line, temporary=False, cond=None, funcname=None)

이 클래스는 임시 중단점, 무시 카운트, 비활성화와 (재) 활성화 및 조건을 구현합니다.

중단점은 @ref{47b4,,bpbynumber}라는 리스트를 통해 번호로, @ref{47b5,,bplist}를 통해 @code{(file, line)} 쌍으로 인덱싱됩니다. 전자는 @ref{47b3,,Breakpoint} 클래스의 단일 인스턴스를 가리킵니다. 후자는 줄당 하나 이상의 중단점이 있을 수 있어서 이러한 인스턴스의 리스트를 가리킵니다.

중단점을 만들 때, 연관된 @ref{47b6,,파일명}은 규범적 형식(canonical form)이어야 합니다. @ref{47b7,,funcname}이 정의되면, 해당 함수의 첫 번째 줄이 실행될 때 중단점 @ref{47b8,,적중}이 카운트됩니다. @ref{47b9,,조건부} 중단점은 항상 @code{적중}을 카운트합니다.

@ref{47b3,,Breakpoint} 인스턴스에는 다음과 같은 메서드가 있습니다:

@geindex deleteMe() (bdb.Breakpoint 메서드)
@anchor{library/bdb bdb Breakpoint deleteMe}@anchor{47ba}
@deffn {메서드} deleteMe ()

file/line과 관련된 리스트에서 중단점을 삭제합니다. 해당 위치의 마지막 중단점이면, file/line의 항목도 삭제합니다.
@end deffn

@geindex enable() (bdb.Breakpoint 메서드)
@anchor{library/bdb bdb Breakpoint enable}@anchor{47bb}
@deffn {메서드} enable ()

중단점을 활성화된 것으로 표시합니다.
@end deffn

@geindex disable() (bdb.Breakpoint 메서드)
@anchor{library/bdb bdb Breakpoint disable}@anchor{47bc}
@deffn {메서드} disable ()

중단점을 비활성화된 것으로 표시합니다.
@end deffn

@geindex bpformat() (bdb.Breakpoint 메서드)
@anchor{library/bdb bdb Breakpoint bpformat}@anchor{47bd}
@deffn {메서드} bpformat ()

멋지게 포맷된, 중단점에 대한 모든 정보가 포함된 문자열을 반환합니다:


@itemize *

@item 
중단점 번호.

@item 
Temporary status (del or keep).

@item 
File/line 위치.

@item 
Break condition.

@item 
Number of times to ignore.

@item 
Number of times hit.
@end itemize


Added in version 3.2.

@end deffn

@geindex bpprint() (bdb.Breakpoint 메서드)
@anchor{library/bdb bdb Breakpoint bpprint}@anchor{47be}
@deffn {메서드} bpprint (out=None)

@ref{47bd,,bpformat()}의 출력을 파일 `out', 또는 @code{None}이면 표준 출력으로 인쇄합니다.
@end deffn

@ref{47b3,,Breakpoint} 인스턴스에는 다음과 같은 어트리뷰트가 있습니다:

@geindex file (bdb.Breakpoint의 속성)
@anchor{library/bdb bdb Breakpoint file}@anchor{47b6}
@deffn {속성} file

File name of the @code{Breakpoint}.
@end deffn

@geindex line (bdb.Breakpoint의 속성)
@anchor{library/bdb bdb Breakpoint line}@anchor{47bf}
@deffn {속성} line

Line number of the @code{Breakpoint} within @ref{47b6,,file}.
@end deffn

@geindex temporary (bdb.Breakpoint의 속성)
@anchor{library/bdb bdb Breakpoint temporary}@anchor{47c0}
@deffn {속성} temporary

@code{True} if a @code{Breakpoint} at (file, line) is temporary.
@end deffn

@geindex cond (bdb.Breakpoint의 속성)
@anchor{library/bdb bdb Breakpoint cond}@anchor{47b9}
@deffn {속성} cond

Condition for evaluating a @code{Breakpoint} at (file, line).
@end deffn

@geindex funcname (bdb.Breakpoint의 속성)
@anchor{library/bdb bdb Breakpoint funcname}@anchor{47b7}
@deffn {속성} funcname

Function name that defines whether a @code{Breakpoint} is hit upon
entering the function.
@end deffn

@geindex enabled (bdb.Breakpoint의 속성)
@anchor{library/bdb bdb Breakpoint enabled}@anchor{47c1}
@deffn {속성} enabled

@code{True} if @code{Breakpoint} is enabled.
@end deffn

@geindex bpbynumber (bdb.Breakpoint의 속성)
@anchor{library/bdb bdb Breakpoint bpbynumber}@anchor{47b4}
@deffn {속성} bpbynumber

Numeric index for a single instance of a @code{Breakpoint}.
@end deffn

@geindex bplist (bdb.Breakpoint의 속성)
@anchor{library/bdb bdb Breakpoint bplist}@anchor{47b5}
@deffn {속성} bplist

Dictionary of @code{Breakpoint} instances indexed by
(@ref{47b6,,file}, @ref{47bf,,line}) tuples.
@end deffn

@geindex ignore (bdb.Breakpoint의 속성)
@anchor{library/bdb bdb Breakpoint ignore}@anchor{47c2}
@deffn {속성} ignore

Number of times to ignore a @code{Breakpoint}.
@end deffn

@geindex hits (bdb.Breakpoint의 속성)
@anchor{library/bdb bdb Breakpoint hits}@anchor{47b8}
@deffn {속성} hits

Count of the number of times a @code{Breakpoint} has been hit.
@end deffn
@end deffn

@geindex Bdb (bdb 클래스)
@anchor{library/bdb bdb Bdb}@anchor{2d5}
@deffn {클래스} bdb.Bdb (skip=None, backend='settrace')

@ref{2d5,,Bdb} 클래스는 범용 파이썬 디버거 베이스 클래스 역할을 합니다.

이 클래스는 추적 기능의 세부 사항을 처리합니다; 파생 클래스는 사용자 상호 작용을 구현해야 합니다. 표준 디버거 클래스 (@ref{273,,pdb.Pdb})가 예입니다.

`skip' 인자는, 주어지면, glob 스타일 모듈 이름 패턴의 이터러블 이어야 합니다. 디버거는 이러한 패턴 중 하나와 일치하는 모듈에서 시작되는 프레임으로 들어가지 않습니다. 프레임을 특정 모듈에서 시작된 것으로 간주하는지는 프레임 전역의 @code{__name__}에 의해 결정됩니다.

The `backend' argument specifies the backend to use for @code{Bdb}. It
can be either @code{'settrace'} or @code{'monitoring'}. @code{'settrace'} uses
@ref{2e1,,sys.settrace()} which has the best backward compatibility. The
@code{'monitoring'} backend uses the new @ref{e0,,sys.monitoring} that was
introduced in Python 3.12, which can be much more efficient because it
can disable unused events. We are trying to keep the exact interfaces
for both backends, but there are some differences. The debugger developers
are encouraged to use the @code{'monitoring'} backend to achieve better
performance.


버전 3.1에서 변경: `skip' 매개 변수를 추가했습니다.



버전 3.14에서 변경: Added the `backend' parameter.


@ref{2d5,,Bdb}의 다음 메서드는 일반적으로 재정의할 필요가 없습니다.

@geindex canonic() (bdb.Bdb 메서드)
@anchor{library/bdb bdb Bdb canonic}@anchor{47c3}
@deffn {메서드} canonic (filename)

`filename'의 규범적 형식을 반환합니다.

For real file names, the canonical form is an operating-system-dependent,
@ref{2c7d,,case-normalized} @ref{151f,,absolute path}. A `filename' with angle brackets, such as @code{"<stdin>"}
generated in interactive mode, is returned unchanged.
@end deffn

@geindex start_trace() (bdb.Bdb 메서드)
@anchor{library/bdb bdb Bdb start_trace}@anchor{47c4}
@deffn {메서드} start_trace (self)

Start tracing. For @code{'settrace'} backend, this method is equivalent to
@code{sys.settrace(self.trace_dispatch)}


Added in version 3.14.

@end deffn

@geindex stop_trace() (bdb.Bdb 메서드)
@anchor{library/bdb bdb Bdb stop_trace}@anchor{47c5}
@deffn {메서드} stop_trace (self)

Stop tracing. For @code{'settrace'} backend, this method is equivalent to
@code{sys.settrace(None)}


Added in version 3.14.

@end deffn

@geindex reset() (bdb.Bdb 메서드)
@anchor{library/bdb bdb Bdb reset}@anchor{47c6}
@deffn {메서드} reset ()

디버깅을 시작할 준비가 된 값으로 @code{botframe}, @code{stopframe}, @code{returnframe} 및 @ref{47c7,,quitting} 어트리뷰트를 설정합니다.
@end deffn

@geindex trace_dispatch() (bdb.Bdb 메서드)
@anchor{library/bdb bdb Bdb trace_dispatch}@anchor{47c8}
@deffn {메서드} trace_dispatch (frame, event, arg)

이 함수는 디버그되는 프레임의 추적 함수(trace function)로 설치됩니다. 반환 값은 새로운 추적 함수(대부분 자체)입니다.

기본 구현은 실행되려고 하는 (문자열로 전달된) 이벤트의 유형에 따라 프레임을 디스패치 하는 방법을 결정합니다. `event'는 다음 중 하나일 수 있습니다:


@itemize *

@item 
@code{"line"}: 새로운 코드 줄이 실행되려고 합니다.

@item 
@code{"call"}: 함수가 호출되거나, 다른 코드 블록에 진입하려고 합니다.

@item 
@code{"return"}: 함수나 다른 코드 블록이 반환하려고 합니다.

@item 
@code{"exception"}: 예외가 발생했습니다.

@item 
@code{"c_call"}: C 함수가 호출되려고 합니다.

@item 
@code{"c_return"}: C 함수가 반환했습니다.

@item 
@code{"c_exception"}: C 함수가 예외를 발생시켰습니다.
@end itemize

파이썬 이벤트의 경우, 특수 함수(아래를 참조하세요)가 호출됩니다. C 이벤트의 경우, 아무런 액션도 취하지 않습니다.

`arg' 매개 변수는 앞의 이벤트에 따라 다릅니다.

추적 함수에 대한 자세한 내용은 @ref{2e1,,sys.settrace()} 설명서를 참조하십시오. 코드와 프레임 객체에 대한 자세한 내용은 @ref{232c,,표준형 계층}을 참조하십시오.
@end deffn

@geindex dispatch_line() (bdb.Bdb 메서드)
@anchor{library/bdb bdb Bdb dispatch_line}@anchor{47c9}
@deffn {메서드} dispatch_line (frame)

디버거가 현재 행에서 중지해야 하면, @ref{47ca,,user_line()} 메서드를 호출하십시오 (서브 클래스에서 재정의되어야 합니다). @ref{47c7,,quitting} 플래그가 설정되면 (@code{user_line()}에서 설정할 수 있습니다) @ref{278,,BdbQuit} 예외를 발생시킵니다. 해당 스코프에서 추가 추적을 위해 @ref{47c8,,trace_dispatch()} 메서드에 대한 참조를 반환합니다.
@end deffn

@geindex dispatch_call() (bdb.Bdb 메서드)
@anchor{library/bdb bdb Bdb dispatch_call}@anchor{47cb}
@deffn {메서드} dispatch_call (frame, arg)

디버거가 이 함수 호출에서 중지해야 하면, @ref{47cc,,user_call()} 메서드를 호출하십시오 (서브 클래스에서 재정의되어야 합니다). @ref{47c7,,quitting} 플래그가 설정되면 (@code{user_call()}에서 설정할 수 있습니다) @ref{278,,BdbQuit} 예외를 발생시킵니다. 해당 스코프에서 추가 추적을 위해 @ref{47c8,,trace_dispatch()} 메서드에 대한 참조를 반환합니다.
@end deffn

@geindex dispatch_return() (bdb.Bdb 메서드)
@anchor{library/bdb bdb Bdb dispatch_return}@anchor{47cd}
@deffn {메서드} dispatch_return (frame, arg)

디버거가 이 함수 반환에서 중지해야 하면, @ref{47ce,,user_return()} 메서드를 호출하십시오 (서브 클래스에서 재정의되어야 합니다). @ref{47c7,,quitting} 플래그가 설정되면 (@code{user_return()}에서 설정할 수 있습니다) @ref{278,,BdbQuit} 예외를 발생시킵니다. 해당 스코프에서 추가 추적을 위해 @ref{47c8,,trace_dispatch()} 메서드에 대한 참조를 반환합니다.
@end deffn

@geindex dispatch_exception() (bdb.Bdb 메서드)
@anchor{library/bdb bdb Bdb dispatch_exception}@anchor{47cf}
@deffn {메서드} dispatch_exception (frame, arg)

디버거가 이 예외에서 중지해야 하면, @ref{47d0,,user_exception()} 메서드를 호출하십시오 (서브 클래스에서 재정의되어야 합니다). @ref{47c7,,quitting} 플래그가 설정되면 (@code{user_exception()}에서 설정할 수 있습니다) @ref{278,,BdbQuit} 예외를 발생시킵니다. 해당 스코프에서 추가 추적을 위해 @ref{47c8,,trace_dispatch()} 메서드에 대한 참조를 반환합니다.
@end deffn

일반적으로 파생된 클래스는 다음 메서드를 재정의하지 않지만, 중지와 중단점의 정의를 재정의하려고 하면 그럴 수 있습니다.

@geindex is_skipped_module() (bdb.Bdb 메서드)
@anchor{library/bdb bdb Bdb is_skipped_module}@anchor{47d1}
@deffn {메서드} is_skipped_module (module_name)

Return @code{True} if `module_name' matches any skip pattern.
@end deffn

@geindex stop_here() (bdb.Bdb 메서드)
@anchor{library/bdb bdb Bdb stop_here}@anchor{47d2}
@deffn {메서드} stop_here (frame)

Return @code{True} if `frame' is below the starting frame in the stack.
@end deffn

@geindex break_here() (bdb.Bdb 메서드)
@anchor{library/bdb bdb Bdb break_here}@anchor{47d3}
@deffn {메서드} break_here (frame)

Return @code{True} if there is an effective breakpoint for this line.

Check whether a line or function breakpoint exists and is in effect.  Delete temporary
breakpoints based on information from @ref{47d4,,effective()}.
@end deffn

@geindex break_anywhere() (bdb.Bdb 메서드)
@anchor{library/bdb bdb Bdb break_anywhere}@anchor{47d5}
@deffn {메서드} break_anywhere (frame)

Return @code{True} if any breakpoint exists for `frame'’s filename.
@end deffn

파생 클래스는 디버거 연산을 제어하기 위해 이 메서드를 재정의해야 합니다.

@geindex user_call() (bdb.Bdb 메서드)
@anchor{library/bdb bdb Bdb user_call}@anchor{47cc}
@deffn {메서드} user_call (frame, argument_list)

호출된 함수 내부에서 중단이 발생할 수 있으면 @ref{47cb,,dispatch_call()}에서 호출됩니다.

`argument_list' is not used anymore and will always be @code{None}.
The argument is kept for backwards compatibility.
@end deffn

@geindex user_line() (bdb.Bdb 메서드)
@anchor{library/bdb bdb Bdb user_line}@anchor{47ca}
@deffn {메서드} user_line (frame)

@ref{47d2,,stop_here()}나 @ref{47d3,,break_here()}가 @code{True}를 반환할 때 @ref{47c9,,dispatch_line()}에서 호출됩니다.
@end deffn

@geindex user_return() (bdb.Bdb 메서드)
@anchor{library/bdb bdb Bdb user_return}@anchor{47ce}
@deffn {메서드} user_return (frame, return_value)

@ref{47d2,,stop_here()}가 @code{True}를 반환할 때 @ref{47cd,,dispatch_return()}에서 호출됩니다.
@end deffn

@geindex user_exception() (bdb.Bdb 메서드)
@anchor{library/bdb bdb Bdb user_exception}@anchor{47d0}
@deffn {메서드} user_exception (frame, exc_info)

@ref{47d2,,stop_here()}가 @code{True}를 반환할 때 @ref{47cf,,dispatch_exception()}에서 호출됩니다.
@end deffn

@geindex do_clear() (bdb.Bdb 메서드)
@anchor{library/bdb bdb Bdb do_clear}@anchor{47d6}
@deffn {메서드} do_clear (arg)

중단점이 일시적일 때 중단점을 제거하는 방법을 처리합니다.

이 메서드는 파생 클래스에서 구현해야 합니다.
@end deffn

파생 클래스와 클라이언트는 다음 메서드를 호출하여 스테핑(stepping) 상태에 영향을 줄 수 있습니다.

@geindex set_step() (bdb.Bdb 메서드)
@anchor{library/bdb bdb Bdb set_step}@anchor{47d7}
@deffn {메서드} set_step ()

한 줄의 코드 후에 멈춥니다.
@end deffn

@geindex set_next() (bdb.Bdb 메서드)
@anchor{library/bdb bdb Bdb set_next}@anchor{47d8}
@deffn {메서드} set_next (frame)

주어진 프레임 내 또는 아래의 다음 줄에서 멈춥니다.
@end deffn

@geindex set_return() (bdb.Bdb 메서드)
@anchor{library/bdb bdb Bdb set_return}@anchor{47d9}
@deffn {메서드} set_return (frame)

주어진 프레임에서 반환할 때 멈춥니다.
@end deffn

@geindex set_until() (bdb.Bdb 메서드)
@anchor{library/bdb bdb Bdb set_until}@anchor{47da}
@deffn {메서드} set_until (frame, lineno=None)

현재 줄보다 큰 `lineno'를 갖는 줄에 도달하거나 현재 프레임에서 반환할 때 멈춥니다.
@end deffn

@geindex set_trace() (bdb.Bdb 메서드)
@anchor{library/bdb bdb Bdb set_trace}@anchor{47db}
@deffn {메서드} set_trace ([frame])

`frame'에서 디버깅을 시작합니다. `frame'을 지정하지 않으면 호출자의 프레임에서 디버깅을 시작합니다.


버전 3.13에서 변경: @ref{47dc,,set_trace()} will enter the debugger immediately, rather than
on the next line of code to be executed.

@end deffn

@geindex set_continue() (bdb.Bdb 메서드)
@anchor{library/bdb bdb Bdb set_continue}@anchor{47dd}
@deffn {메서드} set_continue ()

중단점에서나 완료 시에만 멈춥니다. 중단점이 없으면, 시스템 추적 함수를 @code{None}으로 설정합니다.
@end deffn

@geindex set_quit() (bdb.Bdb 메서드)
@anchor{library/bdb bdb Bdb set_quit}@anchor{47c7}
@deffn {메서드} set_quit ()

@geindex quitting (bdb.Bdb 어트리뷰트)

@code{quitting} 어트리뷰트를 @code{True}로 설정합니다. 다음에 @code{dispatch_*()} 메서드 중 하나를 호출할 때 @ref{278,,BdbQuit}가 발생합니다.
@end deffn

파생 클래스와 클라이언트는 다음 메서드를 호출하여 중단점을 조작할 수 있습니다. 이 메서드는 문제가 발생하면 에러 메시지가 포함된 문자열을 반환하고, 모두 정상이면 @code{None}을 반환합니다.

@geindex set_break() (bdb.Bdb 메서드)
@anchor{library/bdb bdb Bdb set_break}@anchor{47de}
@deffn {메서드} set_break (filename, lineno, temporary=False, cond=None, funcname=None)

새로운 중단점을 설정합니다. 인자로 전달된 `filename'에 `lineno' 줄이 없으면 에러 메시지를 반환합니다. @ref{47c3,,canonic()} 메서드에 설명된 대로 `filename'은 규범적 형식이어야 합니다.
@end deffn

@geindex clear_break() (bdb.Bdb 메서드)
@anchor{library/bdb bdb Bdb clear_break}@anchor{47df}
@deffn {메서드} clear_break (filename, lineno)

`filename'과 `lineno'에서 중단점을 삭제합니다. 설정되지 않았으면, 에러 메시지를 반환합니다.
@end deffn

@geindex clear_bpbynumber() (bdb.Bdb 메서드)
@anchor{library/bdb bdb Bdb clear_bpbynumber}@anchor{47e0}
@deffn {메서드} clear_bpbynumber (arg)

@ref{47b4,,Breakpoint.bpbynumber}에서 인덱스 `arg'인 중단점을 삭제합니다. `arg'가 숫자가 아니거나 범위를 벗어나면, 에러 메시지를 반환합니다.
@end deffn

@geindex clear_all_file_breaks() (bdb.Bdb 메서드)
@anchor{library/bdb bdb Bdb clear_all_file_breaks}@anchor{47e1}
@deffn {메서드} clear_all_file_breaks (filename)

`filename'에서 모든 중단점을 삭제합니다. 설정되지 않았으면, 에러 메시지를 반환합니다.
@end deffn

@geindex clear_all_breaks() (bdb.Bdb 메서드)
@anchor{library/bdb bdb Bdb clear_all_breaks}@anchor{47e2}
@deffn {메서드} clear_all_breaks ()

모든 기존 중단점을 삭제합니다. 설정되지 않았으면, 에러 메시지를 반환합니다.
@end deffn

@geindex get_bpbynumber() (bdb.Bdb 메서드)
@anchor{library/bdb bdb Bdb get_bpbynumber}@anchor{47e3}
@deffn {메서드} get_bpbynumber (arg)

주어진 숫자로 지정된 중단점을 반환합니다. `arg'가 문자열이면, 숫자로 변환됩니다. `arg'가 숫자가 아닌 문자열이면, 지정된 중단점이 존재하지 않거나 삭제되었으면, @ref{2ec,,ValueError}가 발생합니다.


Added in version 3.2.

@end deffn

@geindex get_break() (bdb.Bdb 메서드)
@anchor{library/bdb bdb Bdb get_break}@anchor{47e4}
@deffn {메서드} get_break (filename, lineno)

`filename'의 `lineno'에 중단점이 있으면 @code{True}를 반환합니다.
@end deffn

@geindex get_breaks() (bdb.Bdb 메서드)
@anchor{library/bdb bdb Bdb get_breaks}@anchor{47e5}
@deffn {메서드} get_breaks (filename, lineno)

`filename'의 `lineno'에 있는 모든 중단점을 반환하거나, 없으면 빈 리스트를 반환합니다.
@end deffn

@geindex get_file_breaks() (bdb.Bdb 메서드)
@anchor{library/bdb bdb Bdb get_file_breaks}@anchor{47e6}
@deffn {메서드} get_file_breaks (filename)

`filename'의 모든 중단점을 반환하거나, 없으면 빈 리스트를 반환합니다.
@end deffn

@geindex get_all_breaks() (bdb.Bdb 메서드)
@anchor{library/bdb bdb Bdb get_all_breaks}@anchor{47e7}
@deffn {메서드} get_all_breaks ()

설정된 모든 중단점을 반환합니다.
@end deffn

Derived classes and clients can call the following methods to disable and
restart events to achieve better performance. These methods only work
when using the @code{'monitoring'} backend.

@geindex disable_current_event() (bdb.Bdb 메서드)
@anchor{library/bdb bdb Bdb disable_current_event}@anchor{47e8}
@deffn {메서드} disable_current_event ()

Disable the current event until the next time @ref{47e9,,restart_events()} is
called. This is helpful when the debugger is not interested in the current
line.


Added in version 3.14.

@end deffn

@geindex restart_events() (bdb.Bdb 메서드)
@anchor{library/bdb bdb Bdb restart_events}@anchor{47e9}
@deffn {메서드} restart_events ()

Restart all the disabled events. This function is automatically called in
@code{dispatch_*} methods after @code{user_*} methods are called. If the
@code{dispatch_*} methods are not overridden, the disabled events will be
restarted after each user interaction.


Added in version 3.14.

@end deffn

파생 클래스와 클라이언트는 다음 메서드를 호출하여 스택 추적을 나타내는 데이터 구조를 얻을 수 있습니다.

@geindex get_stack() (bdb.Bdb 메서드)
@anchor{library/bdb bdb Bdb get_stack}@anchor{47ea}
@deffn {메서드} get_stack (f, t)

Return a list of (frame, lineno) tuples in a stack trace, and a size.

The most recently called frame is last in the list. The size is the number
of frames below the frame where the debugger was invoked.
@end deffn

@geindex format_stack_entry() (bdb.Bdb 메서드)
@anchor{library/bdb bdb Bdb format_stack_entry}@anchor{47eb}
@deffn {메서드} format_stack_entry (frame_lineno, lprefix=': ')

@code{(frame, lineno)} 튜플인 스택 항목에 대한 정보가 포함된 문자열을 반환합니다. 반환 문자열은 다음을 포함합니다:


@itemize *

@item 
프레임을 포함하는 규범적 파일명.

@item 
함수 이름이나 @code{"<lambda>"}.

@item 
입력 인자.

@item 
반환 값.

@item 
코드 줄 (있으면).
@end itemize
@end deffn

클라이언트가 문자열로 지정된 @ref{2c23,,statement}를 디버깅하기 위해 디버거를 사용하려면 다음 두 가지 메서드를 호출할 수 있습니다.

@geindex run() (bdb.Bdb 메서드)
@anchor{library/bdb bdb Bdb run}@anchor{47ec}
@deffn {메서드} run (cmd, globals=None, locals=None)

@ref{4a3,,exec()} 함수를 통해 실행된 문장을 디버그합니다. `globals'의 기본값은 @code{__main__.__dict__}이고, `locals'의 기본값은 `globals'입니다.
@end deffn

@geindex runeval() (bdb.Bdb 메서드)
@anchor{library/bdb bdb Bdb runeval}@anchor{47ed}
@deffn {메서드} runeval (expr, globals=None, locals=None)

@ref{4a4,,eval()} 함수를 통해 실행된 표현식을 디버그합니다. `globals'와 `locals'는 @ref{47ec,,run()}과 같은 의미입니다.
@end deffn

@geindex runctx() (bdb.Bdb 메서드)
@anchor{library/bdb bdb Bdb runctx}@anchor{47ee}
@deffn {메서드} runctx (cmd, globals, locals)

이전 버전과의 호환성을 위해. @ref{47ec,,run()} 메서드를 호출합니다.
@end deffn

@geindex runcall() (bdb.Bdb 메서드)
@anchor{library/bdb bdb Bdb runcall}@anchor{c70}
@deffn {메서드} runcall (func, /, *args, **kwds)

단일 함수 호출을 디버그하고, 결과를 반환합니다.
@end deffn
@end deffn

마지막으로, 모듈은 다음과 같은 함수를 정의합니다:

@geindex checkfuncname() (bdb 모듈)
@anchor{library/bdb bdb checkfuncname}@anchor{47ef}
@deffn {함수} bdb.checkfuncname (b, frame)

@ref{47b3,,Breakpoint} `b'가 설정된 방식에 따라, 여기서 중단해야 하면 @code{True}를 반환합니다.

줄 번호를 통해 설정되었으면, @ref{47bf,,b.line}이 `frame'의 것과 같은지 확인합니다. @ref{47b7,,함수 이름}을 통해 중단점이 설정되었으면, 우리는 올바른 `frame'(올바른 함수)에 있는지와 그것의 첫 번째 실행 가능한 줄에 있는지 확인해야 합니다.
@end deffn

@geindex effective() (bdb 모듈)
@anchor{library/bdb bdb effective}@anchor{47d4}
@deffn {함수} bdb.effective (file, line, frame)

Return @code{(active breakpoint, delete temporary flag)} or @code{(None, None)} as the
breakpoint to act upon.

The `active breakpoint' is the first entry in
@ref{47b5,,bplist} for the
(@ref{47b6,,file}, @ref{47bf,,line})
(which must exist) that is @ref{47c1,,enabled}, for
which @ref{47ef,,checkfuncname()} is true, and that has neither a false
@ref{47b9,,condition} nor positive
@ref{47c2,,ignore} count.  The `flag', meaning that a
temporary breakpoint should be deleted, is @code{False} only when the
@code{cond} cannot be evaluated (in which case,
@code{ignore} count is ignored).

If no such entry exists, then @code{(None, None)} is returned.
@end deffn

@geindex set_trace() (bdb 모듈)
@anchor{library/bdb bdb set_trace}@anchor{47dc}
@deffn {함수} bdb.set_trace ()

호출자의 프레임에서 @ref{2d5,,Bdb} 인스턴스로 디버깅을 시작합니다.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node faulthandler — 파이썬 트레이스백 덤프,pdb — The Python Debugger,bdb — 디버거 프레임워크,디버깅과 프로파일링
@anchor{library/faulthandler doc}@anchor{47f0}@anchor{library/faulthandler faulthandler-dump-the-python-traceback}@anchor{47f1}@anchor{library/faulthandler module-faulthandler}@anchor{5c}@anchor{library/faulthandler translation-repo}@anchor{47f2}
@subsection @code{faulthandler} — 파이썬 트레이스백 덤프


@geindex module; faulthandler


Added in version 3.3.



__________________________________________________________________


이 모듈은 결함(fault) 시, 시간 초과 후 또는 사용자 시그널에 파이썬 트레이스백을 명시적으로 덤프하는 함수를 포함합니다. @ref{127f,,SIGSEGV}, @ref{1280,,SIGFPE}, @ref{1281,,SIGABRT}, @ref{1282,,SIGBUS} 및 @ref{1283,,SIGILL} 시그널에 대한 결함 처리기를 설치하려면 @ref{20f,,faulthandler.enable()}를 호출하십시오. 
@geindex PYTHONFAULTHANDLER
@geindex 환경 변수; PYTHONFAULTHANDLER
@ref{1284,,PYTHONFAULTHANDLER} 환경 변수를 설정하거나 @ref{16f,,-X} @code{faulthandler} 명령 줄 옵션을 사용하여 시작할 때 활성화할 수도 있습니다.

결함 처리기는 Apport나 윈도우 결함 처리기(Windows fault handler)와 같은 시스템 결함 처리기와 호환됩니다. 이 모듈은 @code{sigaltstack()} 함수를 사용할 수 있으면 시그널 처리기에 대체 스택을 사용합니다. 이것은 스택 오버플로에서조차 트레이스백을 덤프할 수 있도록 합니다.

결함 처리기는 치명적일 때 호출되므로 시그널 안전한 함수만 사용할 수 있습니다 (예를 들어, 힙에 메모리를 할당할 수 없습니다). 이 제한 때문에 일반적인 파이썬 트레이스백에 비해 트레이스백 덤프는 최소화됩니다:


@itemize *

@item 
ASCII만 지원됩니다. 인코딩 시 @code{backslashreplace} 에러 처리기가 사용됩니다.

@item 
각 문자열은 500자로 제한됩니다.

@item 
파일명, 함수 이름 및 줄 번호만 표시됩니다. (소스 코드 없음)

@item 
100프레임과 100스레드로 제한됩니다.

@item 
순서가 뒤집힙니다: 가장 최근의 호출이 먼저 표시됩니다.
@end itemize

기본적으로, 파이썬 트레이스백은 @ref{b33,,sys.stderr}에 기록됩니다. 트레이스백을 보려면, 응용 프로그램이 터미널에서 실행되어야 합니다. 로그 파일을 @ref{20f,,faulthandler.enable()}로 전달할 수도 있습니다.

모듈은 C로 구현되어 있으므로, 충돌 시나 파이썬이 교착 상태에 빠질 때 트레이스백을 덤프할 수 있습니다.

@ref{507,,파이썬 개발 모드}는 파이썬 시작 시 @ref{20f,,faulthandler.enable()}을 호출합니다.


@subsubheading 더 보기



@table @asis

@item Module @ref{aa,,pdb}

Interactive source code debugger for Python programs.

@item Module @ref{104,,traceback}

Standard interface to extract, format and print stack traces of Python programs.
@end table


@menu
* 트레이스백 덤프하기:: 
* Dumping the C stack:: 
* 결함 처리기 상태:: 
* 시간 초과 후에 트레이스백 덤프하기:: 
* 사용자 시그널에 트레이스백 덤프하기:: 
* 파일 기술자 관련 문제:: 
* 예제: 예제<26>. 

@end menu

@node 트레이스백 덤프하기,Dumping the C stack,,faulthandler — 파이썬 트레이스백 덤프
@anchor{library/faulthandler dumping-the-traceback}@anchor{47f3}
@subsubsection 트레이스백 덤프하기


@geindex dump_traceback() (faulthandler 모듈)
@anchor{library/faulthandler faulthandler dump_traceback}@anchor{ffe}
@deffn {함수} faulthandler.dump_traceback (file=sys.stderr, all_threads=True)

모든 스레드의 트레이스백을 `file'로 덤프합니다. `all_threads'가 @code{False}면, 현재 스레드만 덤프합니다.


@subsubheading 더 보기


@ref{1084,,traceback.print_tb()}, which can be used to print a traceback object.



버전 3.5에서 변경: 이 함수에 파일 기술자를 전달하는 지원이 추가되었습니다.

@end deffn

@node Dumping the C stack,결함 처리기 상태,트레이스백 덤프하기,faulthandler — 파이썬 트레이스백 덤프
@anchor{library/faulthandler dumping-the-c-stack}@anchor{47f4}
@subsubsection Dumping the C stack



Added in version 3.14.


@geindex dump_c_stack() (faulthandler 모듈)
@anchor{library/faulthandler faulthandler dump_c_stack}@anchor{20e}
@deffn {함수} faulthandler.dump_c_stack (file=sys.stderr)

Dump the C stack trace of the current thread into `file'.

If the Python build does not support it or the operating system
does not provide a stack trace, then this prints an error in place
of a dumped C stack.
@end deffn

@menu
* C Stack Compatibility:: 

@end menu

@node C Stack Compatibility,,,Dumping the C stack
@anchor{library/faulthandler c-stack-compatibility}@anchor{20d}@anchor{library/faulthandler id1}@anchor{47f5}
@subsubsection C Stack Compatibility


If the system does not support the C-level @code{backtrace(3)@footnote{https://manpages.debian.org/backtrace(3)}}
or @code{dladdr1(3)@footnote{https://manpages.debian.org/dladdr1(3)}}, then C stack dumps will not work.
An error will be printed instead of the stack.

Additionally, some compilers do not support @ref{904,,CPython’s}
implementation of C stack dumps. As a result, a different error may be printed
instead of the stack, even if the operating system supports dumping stacks.

@cartouche
@quotation 참고 
Dumping C stacks can be arbitrarily slow, depending on the DWARF level
of the binaries in the call stack.
@end quotation
@end cartouche

@node 결함 처리기 상태,시간 초과 후에 트레이스백 덤프하기,Dumping the C stack,faulthandler — 파이썬 트레이스백 덤프
@anchor{library/faulthandler fault-handler-state}@anchor{47f6}
@subsubsection 결함 처리기 상태


@geindex enable() (faulthandler 모듈)
@anchor{library/faulthandler faulthandler enable}@anchor{20f}
@deffn {함수} faulthandler.enable (file=sys.stderr, all_threads=True, c_stack=True)

결함 처리기를 활성화합니다: @ref{127f,,SIGSEGV}, @ref{1280,,SIGFPE}, @ref{1281,,SIGABRT}, @ref{1282,,SIGBUS} 및 @ref{1283,,SIGILL} 시그널에 대한 처리기를 설치하여 파이썬 트레이스백을 덤프합니다. `all_threads'가 @code{True}면 실행 중인 모든 스레드에 대한 트레이스백을 생성합니다. 그렇지 않으면, 현재 스레드만 덤프합니다.

`file'은 결함 처리기가 비활성화될 때까지 열려 있어야 합니다: @ref{47f7,,파일 기술자 관련 문제}를 참조하십시오.

If `c_stack' is @code{True}, then the C stack trace is printed after the Python
traceback, unless the system does not support it. See @ref{20e,,dump_c_stack()} for
more information on compatibility.


버전 3.5에서 변경: 이 함수에 파일 기술자를 전달하는 지원이 추가되었습니다.



버전 3.6에서 변경: 윈도우에서는, 윈도우 예외(Windows exception) 처리기도 설치됩니다.



버전 3.10에서 변경: The dump now mentions if a garbage collector collection is running
if `all_threads' is true.



버전 3.14에서 변경: Only the current thread is dumped if the @ref{164,,GIL} is disabled to
prevent the risk of data races.



버전 3.14에서 변경: The dump now displays the C stack trace if `c_stack' is true.

@end deffn

@geindex disable() (faulthandler 모듈)
@anchor{library/faulthandler faulthandler disable}@anchor{47f8}
@deffn {함수} faulthandler.disable ()

결함 처리기를 비활성화합니다: @ref{20f,,enable()}로 설치된 시그널 처리기를 제거합니다.
@end deffn

@geindex is_enabled() (faulthandler 모듈)
@anchor{library/faulthandler faulthandler is_enabled}@anchor{47f9}
@deffn {함수} faulthandler.is_enabled ()

결함 처리기가 활성화되었는지 검사합니다.
@end deffn

@node 시간 초과 후에 트레이스백 덤프하기,사용자 시그널에 트레이스백 덤프하기,결함 처리기 상태,faulthandler — 파이썬 트레이스백 덤프
@anchor{library/faulthandler dumping-the-tracebacks-after-a-timeout}@anchor{47fa}
@subsubsection 시간 초과 후에 트레이스백 덤프하기


@geindex dump_traceback_later() (faulthandler 모듈)
@anchor{library/faulthandler faulthandler dump_traceback_later}@anchor{fff}
@deffn {함수} faulthandler.dump_traceback_later (timeout, repeat=False, file=sys.stderr, exit=False)

`timeout' 초의 시간제한 후, 또는 `repeat'가 @code{True}면 매 `timeout' 초마다, 모든 스레드의 트레이스백을 덤프합니다. `exit'가 @code{True}면, 트레이스백을 덤프한 후 status=1 로 @code{_exit()}를 호출합니다. (@code{_exit()}가 프로세스를 즉시 종료함에 유의하십시오. 파일 버퍼를 플러시 하는 것과 같은 정리 작업을 수행하지 않습니다.) 함수가 두 번 호출되면, 새 호출은 이전 매개 변수를 대체하고 시간제한을 다시 설정합니다. 타이머는 1초 미만의 해상도를 갖습니다.

`file'은 트레이스백이 덤프 되거나 @ref{47fb,,cancel_dump_traceback_later()}가 호출될 때까지 열려 있어야 합니다: @ref{47f7,,파일 기술자 관련 문제}를 참조하십시오.

이 함수는 워치독(watchdog) 스레드를 사용하여 구현됩니다.


버전 3.5에서 변경: 이 함수에 파일 기술자를 전달하는 지원이 추가되었습니다.



버전 3.7에서 변경: 이 함수는 이제 항상 사용할 수 있습니다.

@end deffn

@geindex cancel_dump_traceback_later() (faulthandler 모듈)
@anchor{library/faulthandler faulthandler cancel_dump_traceback_later}@anchor{47fb}
@deffn {함수} faulthandler.cancel_dump_traceback_later ()

마지막 @ref{fff,,dump_traceback_later()} 호출을 취소합니다.
@end deffn

@node 사용자 시그널에 트레이스백 덤프하기,파일 기술자 관련 문제,시간 초과 후에 트레이스백 덤프하기,faulthandler — 파이썬 트레이스백 덤프
@anchor{library/faulthandler dumping-the-traceback-on-a-user-signal}@anchor{47fc}
@subsubsection 사용자 시그널에 트레이스백 덤프하기


@geindex register() (faulthandler 모듈)
@anchor{library/faulthandler faulthandler register}@anchor{ffd}
@deffn {함수} faulthandler.register (signum, file=sys.stderr, all_threads=True, chain=False)

사용자 시그널을 등록합니다: `signum' 시그널에 대한 처리기를 설치해서, 모든 스레드, 또는 `all_threads'가 @code{False}면 현재 스레드의, 트레이스백을 `file'로 덤프합니다. chain이 @code{True}면 이전 처리기를 호출합니다.

`file'은 시그널이 @ref{47fd,,unregister()}로 등록 해지 될 때까지 열려 있어야 합니다: @ref{47f7,,파일 기술자 관련 문제}를 참조하십시오.

윈도우에서는 사용할 수 없습니다.


버전 3.5에서 변경: 이 함수에 파일 기술자를 전달하는 지원이 추가되었습니다.

@end deffn

@geindex unregister() (faulthandler 모듈)
@anchor{library/faulthandler faulthandler unregister}@anchor{47fd}
@deffn {함수} faulthandler.unregister (signum)

사용자 시그널을 등록 해지합니다: @ref{ffd,,register()}로 설치된 `signum' 시그널 처리기를 제거합니다. 시그널이 등록되었으면 @code{True}를 반환하고, 그렇지 않으면 @code{False}를 반환합니다.

윈도우에서는 사용할 수 없습니다.
@end deffn

@node 파일 기술자 관련 문제,예제<26>,사용자 시그널에 트레이스백 덤프하기,faulthandler — 파이썬 트레이스백 덤프
@anchor{library/faulthandler faulthandler-fd}@anchor{47f7}@anchor{library/faulthandler issue-with-file-descriptors}@anchor{47fe}
@subsubsection 파일 기술자 관련 문제


@ref{20f,,enable()}, @ref{fff,,dump_traceback_later()} 및 @ref{ffd,,register()}는 `file' 인자의 파일 기술자를 유지합니다. 파일이 닫히고 파일 기술자가 새 파일에 의해 다시 사용되거나, @ref{d59,,os.dup2()}가 파일 기술자를 바꾸는 데 사용되면, 트레이스백이 다른 파일에 기록됩니다. 파일을 바꿀 때마다 이 함수들을 다시 호출하십시오.

@node 예제<26>,,파일 기술자 관련 문제,faulthandler — 파이썬 트레이스백 덤프
@anchor{library/faulthandler example}@anchor{47ff}
@subsubsection 예제


리눅스에서 결함 처리기를 활성화하거나 그렇지 않았을 때의 세그멘테이션 결함 예제:

@example
$ python -c "import ctypes; ctypes.string_at(0)"
Segmentation fault

$ python -q -X faulthandler
>>> import ctypes
>>> ctypes.string_at(0)
Fatal Python error: Segmentation fault

Current thread 0x00007fb899f39700 (most recent call first):
  File "/opt/python/Lib/ctypes/__init__.py", line 486 in string_at
  File "<stdin>", line 1 in <module>

Current thread's C stack trace (most recent call first):
  Binary file "/opt/python/python", at _Py_DumpStack+0x42 [0x5b27f7d7147e]
  Binary file "/opt/python/python", at +0x32dcbd [0x5b27f7d85cbd]
  Binary file "/opt/python/python", at +0x32df8a [0x5b27f7d85f8a]
  Binary file "/usr/lib/libc.so.6", at +0x3def0 [0x77b73226bef0]
  Binary file "/usr/lib/libc.so.6", at +0x17ef9c [0x77b7323acf9c]
  Binary file "/opt/python/build/lib.linux-x86_64-3.14/_ctypes.cpython-314d-x86_64-linux-gnu.so", at +0xcdf6 [0x77b7315dddf6]
  Binary file "/usr/lib/libffi.so.8", at +0x7976 [0x77b73158f976]
  Binary file "/usr/lib/libffi.so.8", at +0x413c [0x77b73158c13c]
  Binary file "/usr/lib/libffi.so.8", at ffi_call+0x12e [0x77b73158ef0e]
  Binary file "/opt/python/build/lib.linux-x86_64-3.14/_ctypes.cpython-314d-x86_64-linux-gnu.so", at +0x15a33 [0x77b7315e6a33]
  Binary file "/opt/python/build/lib.linux-x86_64-3.14/_ctypes.cpython-314d-x86_64-linux-gnu.so", at +0x164fa [0x77b7315e74fa]
  Binary file "/opt/python/build/lib.linux-x86_64-3.14/_ctypes.cpython-314d-x86_64-linux-gnu.so", at +0xc624 [0x77b7315dd624]
  Binary file "/opt/python/python", at _PyObject_MakeTpCall+0xce [0x5b27f7b73883]
  Binary file "/opt/python/python", at +0x11bab6 [0x5b27f7b73ab6]
  Binary file "/opt/python/python", at PyObject_Vectorcall+0x23 [0x5b27f7b73b04]
  Binary file "/opt/python/python", at _PyEval_EvalFrameDefault+0x490c [0x5b27f7cbb302]
  Binary file "/opt/python/python", at +0x2818e6 [0x5b27f7cd98e6]
  Binary file "/opt/python/python", at +0x281aab [0x5b27f7cd9aab]
  Binary file "/opt/python/python", at PyEval_EvalCode+0xc5 [0x5b27f7cd9ba3]
  Binary file "/opt/python/python", at +0x255957 [0x5b27f7cad957]
  Binary file "/opt/python/python", at +0x255ab4 [0x5b27f7cadab4]
  Binary file "/opt/python/python", at _PyEval_EvalFrameDefault+0x6c3e [0x5b27f7cbd634]
  Binary file "/opt/python/python", at +0x2818e6 [0x5b27f7cd98e6]
  Binary file "/opt/python/python", at +0x281aab [0x5b27f7cd9aab]
  Binary file "/opt/python/python", at +0x11b6e1 [0x5b27f7b736e1]
  Binary file "/opt/python/python", at +0x11d348 [0x5b27f7b75348]
  Binary file "/opt/python/python", at +0x11d626 [0x5b27f7b75626]
  Binary file "/opt/python/python", at PyObject_Call+0x20 [0x5b27f7b7565e]
  Binary file "/opt/python/python", at +0x32a67a [0x5b27f7d8267a]
  Binary file "/opt/python/python", at +0x32a7f8 [0x5b27f7d827f8]
  Binary file "/opt/python/python", at +0x32ac1b [0x5b27f7d82c1b]
  Binary file "/opt/python/python", at Py_RunMain+0x31 [0x5b27f7d82ebe]
  <truncated rest of calls>
Segmentation fault
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node pdb — The Python Debugger,파이썬 프로파일러,faulthandler — 파이썬 트레이스백 덤프,디버깅과 프로파일링
@anchor{library/pdb doc}@anchor{4800}@anchor{library/pdb debugger}@anchor{4801}@anchor{library/pdb module-pdb}@anchor{aa}@anchor{library/pdb pdb-the-python-debugger}@anchor{4802}@anchor{library/pdb translation-repo}@anchor{4803}
@subsection @code{pdb} — The Python Debugger


@geindex module; pdb

`소스 코드:' Lib/pdb.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/pdb.py}

@geindex 디버깅


__________________________________________________________________


The module @code{pdb} defines an interactive source code debugger for Python
programs.  It supports setting (conditional) breakpoints and single stepping at
the source line level, inspection of stack frames, source code listing, and
evaluation of arbitrary Python code in the context of any stack frame.  It also
supports post-mortem debugging and can be called under program control.

@geindex Pdb (pdb 의 클래스)
@geindex 모듈;bdb
@geindex 모듈;cmd

이 디버거는 확장이 가능합니다 – 디버거는 실제로 @ref{273,,Pdb} 클래스로 정의됩니다. 현재 문서화되어 있진 않지만, 소스를 읽어보시면 쉽게 이해하실 수 있습니다. 확장 인터페이스는 @ref{10,,bdb} 와 @ref{1a,,cmd} 모듈을 활용합니다.


@subsubheading 더 보기



@table @asis

@item 모듈 @ref{5c,,faulthandler}

Used to dump Python tracebacks explicitly, on a fault, after a timeout,
or on a user signal.

@item 모듈 @ref{104,,traceback}

Standard interface to extract, format and print stack traces of Python programs.
@end table


디버거로 진입하는 일반적인 사용법은:

@example
import pdb; pdb.set_trace()
@end example

또는:

@example
breakpoint()
@end example

위 코드를 디버거로 진입하고 싶은 구간에 추가한 다음, 프로그램을 실행하면 됩니다. 그런 다음 이 문장 뒤에 오는 코드를 단계별로 실행하고, @ref{4804,,continue} 명령을 사용하여 디버거 없이 프로그램을 계속 실행할 수 있습니다.


버전 3.7에서 변경: 내장 @ref{271,,breakpoint()}가, 기본값으로 호출될 때는, @code{import pdb; pdb.set_trace()}를 대신해서 사용할 수 있습니다.


@example
def double(x):
   breakpoint()
   return x * 2
val = 3
print(f"@{val@} * 2 is @{double(val)@}")
@end example

The debugger’s prompt is @code{(Pdb)}, which is the indicator that you are in debug mode:

@example
> ...(2)double()
-> breakpoint()
(Pdb) p x
3
(Pdb) continue
3 * 2 is 6
@end example


버전 3.3에서 변경: @ref{bf,,readline} 모듈을 통한 탭-완성은 명령과 명령 인자에 사용할 수 있습니다, 예를 들면, 현재 전역 및 지역 이름들은 @code{p} 명령의 인자로 제공됩니다.


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

@end menu

@node Command-line interface<8>,Debugger commands,,pdb — The Python Debugger
@anchor{library/pdb command-line-interface}@anchor{4805}@anchor{library/pdb pdb-cli}@anchor{2e2}
@subsubsection Command-line interface


You can also invoke @code{pdb} from the command line to debug other scripts.  For
example:

@example
python -m pdb [-c command] (-m module | -p pid | pyfile) [args ...]
@end example

모듈로 호출하는 경우, 디버깅 중인 프로그램이 비정상적으로 종료되면 pdb는 자동으로 포스트-모템(post-mortem) 디버깅을 시작합니다. 포스트-모템 디버깅이 끝나면 (또는 프로그램이 정상적으로 종료되면), pdb는 프로그램을 재시작합니다. 자동 재시작은 중단점과 같은 pdb의 상태를 유지하고 대부분의 경우 프로그램 종료 시 디버거를 종료하는 것보다 유용합니다.

@geindex pdb 명령줄 옵션; -c
@geindex pdb 명령줄 옵션; --command
@anchor{library/pdb cmdoption-pdb-c}@anchor{4806}@anchor{library/pdb cmdoption-pdb-command}@anchor{4807}
@deffn {Option} @w{-}c, @w{-}@w{-}command <command>

@code{.pdbrc} 파일에 주어진 것처럼 명령을 실행하기; @ref{4808,,Debugger commands} 을 확인해보세요.


버전 3.2에서 변경: @code{-c} 옵션을 추가했습니다.

@end deffn

@geindex pdb 명령줄 옵션; -m
@anchor{library/pdb cmdoption-pdb-m}@anchor{4809}
@deffn {Option} @w{-}m <module>

@code{python -m}과 비슷한 방식으로 모듈을 실행하기. 스크립트와 마찬가지로, 디버거는 모듈의 첫 번째 줄 바로 전에 실행을 일시정지합니다.


버전 3.7에서 변경: @code{-m} 옵션을 추가했습니다.

@end deffn

@geindex pdb 명령줄 옵션; -p
@geindex pdb 명령줄 옵션; --pid
@anchor{library/pdb cmdoption-pdb-p}@anchor{270}@anchor{library/pdb cmdoption-pdb-pid}@anchor{480a}
@deffn {Option} @w{-}p, @w{-}@w{-}pid <pid>

Attach to the process with the specified PID.


Added in version 3.14.

@end deffn

To attach to a running Python process for remote debugging, use the @code{-p} or
@code{--pid} option with the target process’s PID:

@example
python -m pdb -p 1234
@end example

@cartouche
@quotation 참고 
Attaching to a process that is blocked in a system call or waiting for I/O
will only work once the next bytecode instruction is executed or when the
process receives a signal.
@end quotation
@end cartouche

디버거 제어하에 문장을 실행하는 일반적인 사용법은 다음과 같습니다:

@example
>>> import pdb
>>> def f(x):
...     print(1 / x)
>>> pdb.run("f(2)")
> <string>(1)<module>()
(Pdb) continue
0.5
>>>
@end example

에러가 발생하는 프로그램을 검사하는 일반적인 사용법은 다음과 같습니다:

@example
>>> import pdb
>>> def f(x):
...     print(1 / x)
...
>>> f(0)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in f
ZeroDivisionError: division by zero
>>> pdb.pm()
> <stdin>(2)f()
(Pdb) p x
0
(Pdb)
@end example


버전 3.13에서 변경: The implementation of 
@geindex Python 향상 제안; PEP 667
PEP 667@footnote{https://peps.python.org/pep-0667/} means that name assignments made via @code{pdb}
will immediately affect the active scope, even when running inside an
@ref{4a2,,optimized scope}.


이 모듈은 다음과 같은 함수를 정의합니다; 각 함수는 조금 다른 방식으로 디버거로 진입합니다:

@geindex run() (pdb 모듈)
@anchor{library/pdb pdb run}@anchor{45fa}
@deffn {함수} pdb.run (statement, globals=None, locals=None)

디버거 제어하에 `statement' (주어진 문자열 또는 코드 객체)를 실행합니다. 코드가 실행하기 전에 디버거 프롬프트가 나타납니다; 중단점을 지정하고 @ref{4804,,continue}를 입력하거나, @ref{480b,,step} 또는 @ref{480c,,next}를 통해 문장을 단계별로 살펴볼 수 있습니다. (이 모든 명령은 아래에 설명되어 있습니다.) 선택적 인자 `globals' 와 `locals'는 코드가 실행되는 환경을 구체적으로 명시합니다; 기본적으로는 이 모듈의 딕셔너리 @ref{1,,__main__} 이 사용됩니다. (내장 함수 @ref{4a3,,exec()} 또는 @ref{4a4,,eval()} 에 대한 설명 참조.)
@end deffn

@geindex runeval() (pdb 모듈)
@anchor{library/pdb pdb runeval}@anchor{480d}
@deffn {함수} pdb.runeval (expression, globals=None, locals=None)

디버거 제어하에 문자열 또는 코드 객체로 주어진 `expression'을 평가합니다. @ref{480d,,runeval()} 이 반환될 때, `expression'의 값을 반환합니다. 그렇지 않으면 이 함수는 @ref{45fa,,run()}과 유사한 함수입니다.
@end deffn

@geindex runcall() (pdb 모듈)
@anchor{library/pdb pdb runcall}@anchor{480e}
@deffn {함수} pdb.runcall (function, *args, **kwds)

주어진 인자와 함께 `function' (문자열이 아닌, 함수 또는 메서드 객체)를 호출합니다. @ref{480e,,runcall()} 이 반환될 때, 함수 호출로 반환된 값을 반환합니다. 디버거 프롬프트는 함수에 진입하자마자 나타납니다.
@end deffn

@geindex set_trace() (pdb 모듈)
@anchor{library/pdb pdb set_trace}@anchor{272}
@deffn {함수} pdb.set_trace (*, header=None, commands=None)

Enter the debugger at the calling stack frame.  This is useful to hard-code
a breakpoint at a given point in a program, even if the code is not
otherwise being debugged (e.g. when an assertion fails).  If given,
`header' is printed to the console just before debugging begins.
The `commands' argument, if given, is a list of commands to execute
when the debugger starts.


버전 3.7에서 변경: 키워드 전용 인자 `header'.



버전 3.13에서 변경: @code{set_trace()} will enter the debugger immediately, rather than
on the next line of code to be executed.



Added in version 3.14: The `commands' argument.

@end deffn

@geindex set_trace_async() (pdb 모듈)
@anchor{library/pdb pdb set_trace_async}@anchor{279}
@deffn {함수} awaitable pdb.set_trace_async (*, header=None, commands=None)

async version of @ref{272,,set_trace()}. This function should be used inside an
async function with @ref{18d,,await}.

@example
async def f():
    await pdb.set_trace_async()
@end example

@ref{18d,,await} statements are supported if the debugger is invoked by this function.


Added in version 3.14.

@end deffn

@geindex post_mortem() (pdb 모듈)
@anchor{library/pdb pdb post_mortem}@anchor{15df}
@deffn {함수} pdb.post_mortem (t=None)

주어진 예외나 @ref{cea,,트레이스백 객체}의 포스트-모템(post-mortem) 디버깅으로 진입합니다. 만약 값이 주어지지 않았다면, 현재 처리되고 있는 예외를 사용거나, 없다면 @code{ValueError}를 발생시킵니다.


버전 3.13에서 변경: Support for exception objects was added.

@end deffn

@geindex pm() (pdb 모듈)
@anchor{library/pdb pdb pm}@anchor{540}
@deffn {함수} pdb.pm ()

@ref{6e4,,sys.last_exc} 에서 찾은 예외의 포스트-모템(post-mortem) 디버깅으로 진입합니다.
@end deffn

@geindex set_default_backend() (pdb 모듈)
@anchor{library/pdb pdb set_default_backend}@anchor{480f}
@deffn {함수} pdb.set_default_backend (backend)

There are two supported backends for pdb: @code{'settrace'} and @code{'monitoring'}.
See @ref{2d5,,bdb.Bdb} for details. The user can set the default backend to
use if none is specified when instantiating @ref{273,,Pdb}. If no backend is
specified, the default is @code{'settrace'}.

@cartouche
@quotation 참고 
@ref{271,,breakpoint()} and @ref{272,,set_trace()} will not be affected by this
function. They always use @code{'monitoring'} backend.
@end quotation
@end cartouche


Added in version 3.14.

@end deffn

@geindex get_default_backend() (pdb 모듈)
@anchor{library/pdb pdb get_default_backend}@anchor{4810}
@deffn {함수} pdb.get_default_backend ()

Returns the default backend for pdb.


Added in version 3.14.

@end deffn

@code{run*} 함수와 @ref{272,,set_trace()}는 @ref{273,,Pdb} 클래스를 인스턴스 화하고 같은 이름의 메서드를 호출하는 에일리어스(alias) 입니다. 더 많은 기능에 액세스하려면, 아래를 참고하여 직접 하셔야 합니다:

@geindex Pdb (pdb 클래스)
@anchor{library/pdb pdb Pdb}@anchor{273}
@deffn {클래스} pdb.Pdb (completekey='tab', stdin=None, stdout=None, skip=None, nosigint=False, readrc=True, mode=None, backend=None, colorize=False)

@ref{273,,Pdb} 는 디버거 클래스입니다.

`completekey', `stdin' 그리고 `stdout' 인자는 내부 @ref{1850,,cmd.Cmd} 클래스로 전달됩니다; 자세한 설명은 해당 클래스에서 확인할 수 있습니다.

`skip' 인자가 주어진다면, 반드시 글로브-스타일(glob-style) 모듈 이름 패턴의 이터러블(iterable) 이어야 합니다. 디버거는 이 패턴 중 하나와 일치하는 모듈에서 시작되는 프레임 단계로 들어가지 않습니다. @footnote{
프레임이 특정 모듈에서 시작되는 것으로 간주하는지 여부는 프레임 전역에 있는 @code{__name__}에 의해 결정됩니다.
}

기본적으로, Pdb는 사용자가 @ref{4804,,continue} 명령을 내릴 때, SIGINT 신호(사용자가 콘솔에서 @code{Ctrl}-@code{C}를 누를 때 전송되는 신호) 에 대한 핸들러를 설정합니다. 사용자는 @code{Ctrl}-@code{C}를 눌러서 디버거를 벗어날 수 있습니다. 만약 Pdb가 SIGINT 핸들러를 건드리지 않길 원한다면 `nosigint' 설정을 참으로 변경하면 됩니다.

`readrc' 인자는 기본적으로 참이고 Pdb가 파일 시스템으로부터 .pdbrc를 불러올지 여부를 제어합니다.

The `mode' argument specifies how the debugger was invoked.
It impacts the workings of some debugger commands.
Valid values are @code{'inline'} (used by the breakpoint() builtin),
@code{'cli'} (used by the command line invocation)
or @code{None} (for backwards compatible behaviour, as before the `mode'
argument was added).

The `backend' argument specifies the backend to use for the debugger. If @code{None}
is passed, the default backend will be used. See @ref{480f,,set_default_backend()}.
Otherwise the supported backends are @code{'settrace'} and @code{'monitoring'}.

The `colorize' argument, if set to @code{True}, will enable colorized output in the
debugger, if color is supported. This will highlight source code displayed in pdb.

`skip'으로 추적하기 위한 호출 예시:

@example
import pdb; pdb.Pdb(skip=['django.*']).set_trace()
@end example

인자 없이 @ref{1c6c,,감사 이벤트} @code{pdb.Pdb}를 발생시킵니다.


버전 3.1에서 변경: `skip' 매개 변수를 추가했습니다.



버전 3.2에서 변경: `nosigint' 매개 변수를 추가했습니다. 이전에는, Pdb가 SIGINT 핸들러를 설정하지 않았습니다.



버전 3.6에서 변경: `readrc' 인자.



Added in version 3.14: Added the `mode' argument.



Added in version 3.14: Added the `backend' argument.



Added in version 3.14: Added the `colorize' argument.



버전 3.14에서 변경: Inline breakpoints like @ref{271,,breakpoint()} or @ref{272,,pdb.set_trace()} will
always stop the program at calling frame, ignoring the `skip' pattern (if any).


@geindex run() (pdb.Pdb 메서드)
@geindex runeval() (pdb.Pdb 메서드)
@geindex runcall() (pdb.Pdb 메서드)
@geindex set_trace() (pdb.Pdb 메서드)
@anchor{library/pdb pdb Pdb run}@anchor{4811}
@deffn {메서드} run (statement, globals=None, locals=None)
@anchor{library/pdb pdb Pdb runeval}@anchor{4812}
@deffnx {메서드} runeval (expression, globals=None, locals=None)
@anchor{library/pdb pdb Pdb runcall}@anchor{4813}
@deffnx {메서드} runcall (function, *args, **kwds)
@anchor{library/pdb pdb Pdb set_trace}@anchor{274}
@deffnx {메서드} set_trace ()

위에 설명된 함수에 대한 설명서를 참조하시면 됩니다.
@end deffn
@end deffn

@node Debugger commands,,Command-line interface<8>,pdb — The Python Debugger
@anchor{library/pdb debugger-commands}@anchor{4808}@anchor{library/pdb id2}@anchor{4814}
@subsubsection Debugger commands


디버거가 인식할 수 있는 명령이 아래 나열되어 있습니다. 대부분의 명령은 한두 문자로 단축될 수 있습니다; 예를 들면, @code{h(elp)} 는 @code{h} 또는 @code{help}로 help 명령을 입력할 때 사용할 수 있습니다. (하지만 @code{he}, @code{hel}, @code{H}, @code{Help} 또는 @code{HELP}는 사용할 수 없습니다.) 인자는 반드시 명령과 공백(스페이스나 탭)으로 분리되어야 합니다. 선택적 인자는 명령 문법에서 대괄호(@code{[]})로 묶여있습니다; 대괄호는 입력하지 않습니다. 명령 문법에서 대체 가능한 인자는 세로 바(@code{|})로 분리되어 있습니다.

빈 줄을 입력하면 마지막으로 입력된 명령이 반복됩니다. 예외: 만약 마지막 명령이 @ref{4815,,list} 명령이면, 다음 11줄이 나열됩니다.

디버거가 인식하지 못하는 명령은 파이썬 문장으로 가정하고 디버깅 중인 프로그램의 컨텍스트에서 실행됩니다. 파이썬 문장 앞에 느낌표(@code{!})를 붙여 사용할 수도 있습니다. 이 방법은 디버깅 중인 프로그램을 검사하는 강력한 방법입니다. 변수를 변경하거나 함수를 호출하는 것도 가능합니다. 이 문장에서 예외가 발생하면, 예외 명은 출력되지만 디버거의 상태는 변경되지 않습니다.


버전 3.13에서 변경: Expressions/Statements whose prefix is a pdb command are now correctly
identified and executed.


디버거는 @ref{4816,,에일리어스}을 지원합니다. 에일리어스는 검사 중인 컨텍스트에서 특정 수준의 적응성을 허용하는 매개변수를 가질 수 있습니다.

한 줄에 여러 명령은 @code{;;} 로 구분하여 입력할 수 있습니다. (단일 @code{;} 는 파이썬 파서로 전달되는 한 줄에서, 여러 명령을 구분하기 위한 분리 기호이므로 사용되지 않습니다.) 명령을 똑똑하게 분리하진 못합니다; 입력의 맨 처음 @code{;;} 에서 나뉘며, 따옴표로 묶인 문자열 중간에 있더라도 나눠집니다. 이중 세미콜론이 있는 문자열의 해결 방법은 묵시적 문자열 이어붙이기 @code{';'@w{'};'} 나 @code{";"";"}를 사용하는 것입니다.

To set a temporary global variable, use a `convenience variable'. A `convenience
variable' is a variable whose name starts with @code{$}.  For example, @code{$foo = 1}
sets a global variable @code{$foo} which you can use in the debugger session.  The
`convenience variables' are cleared when the program resumes execution so it’s
less likely to interfere with your program compared to using normal variables
like @code{foo = 1}.

There are four preset `convenience variables':


@itemize *

@item 
@code{$_frame}: the current frame you are debugging

@item 
@code{$_retval}: 프레임이 반환 중이면 반환 값

@item 
@code{$_exception}: the exception if the frame is raising an exception

@item 
@code{$_asynctask}: the asyncio task if pdb stops in an async function
@end itemize


Added in version 3.12: Added the `convenience variable' feature.



Added in version 3.14: Added the @code{$_asynctask} convenience variable.


@geindex .pdbrc;파일
@geindex 디버거;구성;파일

만약 파일 @code{.pdbrc} 가 사용자의 홈 디렉터리 또는 현재 디렉터리에 있으면, 디버거 프롬프트에서 입력된 것처럼 @code{'utf-8'} 인코딩으로 읽히고 실행됩니다. 빈 줄과 @code{#}로 시작하는 줄은 무시됩니다. 이것은 특히 에일리어스에 유용합니다. 만약 두 파일이 모두 존재하면, 홈 디렉터리에 있는 파일이 먼저 읽히고 거기에 정의된 에일리어스는 로컬 파일에 의해 무시될 수 있습니다.


버전 3.2에서 변경: @code{.pdbrc} 는 @ref{4804,,continue}와 @ref{480c,,next}같이 디버깅을 계속하는 명령을 포함할 수 있습니다. 이전에는, 이런 명령이 효과가 없었습니다.



버전 3.11에서 변경: @code{.pdbrc} is now read with @code{'utf-8'} encoding. Previously, it was read
with the system locale encoding.


@geindex help (pdb command)
@anchor{library/pdb pdbcommand-help}@anchor{4817}
@deffn {Pdbcommand} h(elp) [command]

인자가 없는 경우에는, 사용 가능한 명령 리스트를 출력합니다. `command' 인자가 주어진 경우에는, 해당 명령의 도움말을 출력합니다. @code{help pdb} 는 전체 문서(@ref{aa,,pdb} 모듈의 독스트링)를 표시합니다. `command' 인자는 반드시 식별자이어야 하므로, @code{!} 명령의 도움말을 얻기 위해서 @code{help exec} 가 꼭 입력되어야 합니다.
@end deffn

@geindex where (pdb command)
@anchor{library/pdb pdbcommand-where}@anchor{4818}
@deffn {Pdbcommand} w(here) [count]

Print a stack trace, with the most recent frame at the bottom.  if `count'
is 0, print the current frame entry. If `count' is negative, print the least
recent - `count' frames. If `count' is positive, print the most recent
`count' frames.  An arrow (@code{>})
indicates the current frame, which determines the context of most commands.


버전 3.14에서 변경: `count' argument is added.

@end deffn

@geindex down (pdb command)
@anchor{library/pdb pdbcommand-down}@anchor{4819}
@deffn {Pdbcommand} d(own) [count]

스택 트레이스에서 현재 프레임을 `count' (기본 1) 단계 아래로 (새로운 프레임으로) 이동합니다.
@end deffn

@geindex up (pdb command)
@anchor{library/pdb pdbcommand-up}@anchor{481a}
@deffn {Pdbcommand} u(p) [count]

스택 트레이스에서 현재 프레임을 `count' (기본 1) 단계 위로 (이전 프레임으로) 이동합니다.
@end deffn

@geindex break (pdb command)
@anchor{library/pdb pdbcommand-break}@anchor{481b}
@deffn {Pdbcommand} b(reak) [([filename:]lineno | function) [, condition]]

With a `lineno' argument, set a break at line `lineno' in the current file.
The line number may be prefixed with a `filename' and a colon,
to specify a breakpoint in another file (possibly one that hasn’t been loaded
yet).  The file is searched on @ref{3e4,,sys.path}.  Acceptable forms of `filename'
are @code{/abspath/to/file.py}, @code{relpath/file.py}, @code{module} and
@code{package.module}.

`function' 인자가 주어진 경우, 함수 내에서 첫 번째 실행 가능한 문장에서 브레이크를 설정합니다. `function'은 현재 이름 공간에서 함수로 평가되는 모든 표현식이 될 수 있습니다.

두 번째 인자가 있는 경우, 중단점을 적용하기 전에 표현식이 반드시 참이어야 합니다.

인자가 없다면, 각 중단점, 중단점에 도달한 횟수, 현재까지 무시 횟수, 그리고 관련 조건(있는 경우)을 포함한 모든 중단지점을 나열합니다.

Each breakpoint is assigned a number to which all the other
breakpoint commands refer.
@end deffn

@geindex tbreak (pdb command)
@anchor{library/pdb pdbcommand-tbreak}@anchor{481c}
@deffn {Pdbcommand} tbreak [([filename:]lineno | function) [, condition]]

한번 도달하면 제거되는 임시중단점입니다. 인자는 @ref{481b,,break}과 동일합니다.
@end deffn

@geindex clear (pdb command)
@anchor{library/pdb pdbcommand-clear}@anchor{481d}
@deffn {Pdbcommand} cl(ear) [filename:lineno | bpnumber ...]

`filename:lineno' 인자가 주어진 경우, 해당 줄에 있는 모든 중단점을 제거합니다. 공백으로 구분된 중단점 번호 배열이 주어진 경우, 해당 중단점을 제거합니다. 인자가 없는 경우, 모든 중단지점을 재차 확인 후 제거합니다.
@end deffn

@geindex disable (pdb command)
@anchor{library/pdb pdbcommand-disable}@anchor{481e}
@deffn {Pdbcommand} disable bpnumber [bpnumber ...]

공백으로 구분된 중단점 번호로 해당 중단점을 비활성화합니다. 중단점을 비활성화하는 것은 프로그램이 실행을 중단할 수 없다는 것입니다, 하지만 중단점을 제거하는 것과는 달리, 중단점 목록에 남아있으며 (재-)활성화할 수 있습니다.
@end deffn

@geindex enable (pdb command)
@anchor{library/pdb pdbcommand-enable}@anchor{481f}
@deffn {Pdbcommand} enable bpnumber [bpnumber ...]

지정된 중단점을 활성화합니다.
@end deffn

@geindex ignore (pdb command)
@anchor{library/pdb pdbcommand-ignore}@anchor{4820}
@deffn {Pdbcommand} ignore bpnumber [count]

해당 중단점 번호를 무시할 횟수를 설정합니다. 만약 `count'가 생략되면, 무시 횟수는 0으로 설정됩니다. 무시 횟수가 0일 때 중단점이 활성화됩니다. 0이 아닐 때는, 중단점에 도달하고 중단점이 비활성화되지 않고 연관 조건이 참일 때마다 `count'가 차감됩니다.
@end deffn

@geindex condition (pdb command)
@anchor{library/pdb pdbcommand-condition}@anchor{4821}
@deffn {Pdbcommand} condition bpnumber [condition]

중단점에 새로운 `condition'을 설정합니다, 표현식이 참일 때만 중단점이 적용됩니다. 만약 `condition'이 없다면, 설정되어있던 모든 조건이 제거됩니다; 즉, 중단점에 적용되어있던 조건이 없어집니다.
@end deffn

@geindex commands (pdb command)
@anchor{library/pdb pdbcommand-commands}@anchor{276}
@deffn {Pdbcommand} commands [bpnumber]

중단점 번호 `bpnumber' 에 대한 명령을 지정합니다. 명령 목록은 다음 줄에 나타나게 됩니다. 명령을 종료하려면 @code{end}만 입력하면 됩니다. 예를 들면:

@example
(Pdb) commands 1
(com) p some_variable
(com) end
(Pdb)
@end example

중단점에 지정된 모든 명령을 제거하려면, @code{commands} 입력 후에 바로 @code{end}를 입력하면 됩니다; 즉, 아무 명령을 설정하지 않는 것입니다.

`bpnumber' 인자가 주어지지 않으면, @code{commands}는 마지막 중단점 묶음을 참조하게 됩니다.

중단점 명령을 활용해서 프로그램을 다시 시작할 수도 있습니다. @ref{4804,,continue} 명령이나, @ref{480b,,step} 또는 실행을 재개하는 다른 명령을 사용하기만 하면 됩니다.

Specifying any command resuming execution
(currently @ref{4804,,continue}, @ref{480b,,step}, @ref{480c,,next},
@ref{4822,,return}, @ref{4823,,until}, @ref{4824,,jump}, @ref{4825,,quit} and their abbreviations)
terminates the command list (as if
that command was immediately followed by end). This is because any time you
resume execution (even with a simple next or step), you may encounter another
breakpoint—which could have its own command list, leading to ambiguities about
which list to execute.

If the list of commands contains the @code{silent} command, or a command that
resumes execution, then the breakpoint message containing information about
the frame is not displayed.


버전 3.14에서 변경: Frame information will not be displayed if a command that resumes execution
is present in the command list.

@end deffn

@geindex step (pdb command)
@anchor{library/pdb pdbcommand-step}@anchor{480b}
@deffn {Pdbcommand} s(tep)

현재 줄을 실행하고, 멈출 수 있는 가장 첫 번째 줄(호출되는 함수 또는 현재 함수의 다음 줄) 에서 멈춥니다.
@end deffn

@geindex next (pdb command)
@anchor{library/pdb pdbcommand-next}@anchor{480c}
@deffn {Pdbcommand} n(ext)

현재 함수의 다음 줄에 도달하거나, 반환할 때까지 계속 실행합니다. @ref{480c,,next}와 @ref{480b,,step}의 차이점은 @code{step}은 호출된 함수 안에서 멈추고, @code{next}는 호출된 함수를 재빠르게 실행하고 현재 함수의 바로 다음 줄에서만 멈춥니다.
@end deffn

@geindex until (pdb command)
@anchor{library/pdb pdbcommand-until}@anchor{4823}
@deffn {Pdbcommand} unt(il) [lineno]

인자가 없는 경우에는, 현재 줄 번호보다 높은 줄 번호에 도달할 때까지 계속 실행합니다.

`lineno'가 주어진 경우에는, `lineno'보다 크거나 같은 줄에 도달할 때까지 계속 실행합니다. 두 경우 모두 현재 프레임이 반환될 때 멈춥니다.


버전 3.2에서 변경: 줄 번호를 명시적으로 줄 수 있도록 허용합니다.

@end deffn

@geindex return (pdb command)
@anchor{library/pdb pdbcommand-return}@anchor{4822}
@deffn {Pdbcommand} r(eturn)

현재 함수가 반환될 때까지 계속 실행합니다.
@end deffn

@geindex continue (pdb command)
@anchor{library/pdb pdbcommand-continue}@anchor{4804}
@deffn {Pdbcommand} c(ont(inue))

중단점을 마주칠 때까지 계속 실행합니다.
@end deffn

@geindex jump (pdb command)
@anchor{library/pdb pdbcommand-jump}@anchor{4824}
@deffn {Pdbcommand} j(ump) lineno

다음으로 실행될 줄을 설정할 수 있습니다. 프레임의 맨 마지막에서만 실행이 가능합니다. 이전 줄로 돌아가 코드를 재실행하거나, 실행을 원치 않는 코드를 건너뛸 수 있습니다.

중요한 점은 이 명령은 언제나 실행할 수 있진 않습니다 – @ref{34a,,for} 루프 내부로 들어가거나 @ref{1b0,,finally} 절을 건너뛰는 것은 불가능합니다.
@end deffn

@geindex list (pdb command)
@anchor{library/pdb pdbcommand-list}@anchor{4815}
@deffn {Pdbcommand} l(ist) [first[, last]]

현재 파일의 소스 코드를 나열합니다. 인자가 없는 경우, 현재 줄 주위로 11줄을 나열하거나 이전 줄을 이어서 나열합니다. 인자로 @code{.}을 입력한 경우, 현재 줄 주위로 11줄을 나열합니다. 한 인자만 주어진 경우, 해당 줄 주위로 11줄을 나열합니다. 두 인자가 주어진 경우, 두 인자 사이의 모든 줄을 나열합니다; 만약 두 번째 인자가 첫 번째 인자보다 작은 경우, 첫 번째 인자로부터 나열하는 줄 수로 인식합니다.

현재 프레임에서 현재 위치는 @code{->}로 표시됩니다. 예외를 디버깅할 때, 예외가 최초로 발생하거나 전파된 줄이 현재 줄과 다른 경우에는 @code{>>}로  표시됩니다.


버전 3.2에서 변경: @code{>>}표시를 추가했습니다.

@end deffn

@geindex ll (pdb command)
@anchor{library/pdb pdbcommand-ll}@anchor{4826}
@deffn {Pdbcommand} ll | longlist

현재 함수나 프레임의 소스 코드 전체를 나열합니다. 참고할만한 줄은 @ref{4815,,list}처럼 표시됩니다.


Added in version 3.2.

@end deffn

@geindex args (pdb command)
@anchor{library/pdb pdbcommand-args}@anchor{4827}
@deffn {Pdbcommand} a(rgs)

현재 함수의 인자와 그들의 현재 값을 출력합니다.
@end deffn

@geindex p (pdb command)
@anchor{library/pdb pdbcommand-p}@anchor{1175}
@deffn {Pdbcommand} p expression

현재 컨텍스트에서 `expression'을 평가하고 값을 출력합니다.

@cartouche
@quotation 참고 
디버거 명령은 아니지만, @code{print()}도 사용될 수 있습니다 — 이때는 파이썬의 @ref{1174,,print()} 함수를 실행하게 됩니다.
@end quotation
@end cartouche
@end deffn

@geindex pp (pdb command)
@anchor{library/pdb pdbcommand-pp}@anchor{4828}
@deffn {Pdbcommand} pp expression

@ref{1175,,p} 명령과 비슷하지만, `expression'의 값을 @ref{b3,,pprint} 모듈을 활용하여 보기 좋은 형태로 출력합니다.
@end deffn

@geindex whatis (pdb command)
@anchor{library/pdb pdbcommand-whatis}@anchor{4829}
@deffn {Pdbcommand} whatis expression

`expression'의 형(type)을 출력합니다.
@end deffn

@geindex source (pdb command)
@anchor{library/pdb pdbcommand-source}@anchor{482a}
@deffn {Pdbcommand} source expression

`expression'의 소스 코드를 가져와서 보여줍니다.


Added in version 3.2.

@end deffn

@geindex display (pdb command)
@anchor{library/pdb pdbcommand-display}@anchor{275}
@deffn {Pdbcommand} display [expression]

현재 프레임에서 실행이 중지될 때마다, `expression'의 값이 변경된 경우 표시합니다.

`expression'이 주어지지 않은 경우, 현재 프레임에서 표시되는 모든 표현식을 나열합니다.

@cartouche
@quotation 참고 
Display evaluates `expression' and compares to the result of the previous
evaluation of `expression', so when the result is mutable, display may not
be able to pick up the changes.
@end quotation
@end cartouche

예제:

@example
lst = []
breakpoint()
pass
lst.append(1)
print(lst)
@end example

Display won’t realize @code{lst} has been changed because the result of evaluation
is modified in place by @code{lst.append(1)} before being compared:

@example
> example.py(3)<module>()
-> pass
(Pdb) display lst
display lst: []
(Pdb) n
> example.py(4)<module>()
-> lst.append(1)
(Pdb) n
> example.py(5)<module>()
-> print(lst)
(Pdb)
@end example

You can do some tricks with copy mechanism to make it work:

@example
> example.py(3)<module>()
-> pass
(Pdb) display lst[:]
display lst[:]: []
(Pdb) n
> example.py(4)<module>()
-> lst.append(1)
(Pdb) n
> example.py(5)<module>()
-> print(lst)
display lst[:]: [1]  [old: []]
(Pdb)
@end example


Added in version 3.2.

@end deffn

@geindex undisplay (pdb command)
@anchor{library/pdb pdbcommand-undisplay}@anchor{482b}
@deffn {Pdbcommand} undisplay [expression]

현재 프레임에서 `expression'을 더는 표시하지 않습니다. `expression'이 주어지지 않은 경우, 현재 프레임에서 표시되는 모든 표현식을 제거합니다.


Added in version 3.2.

@end deffn

@geindex interact (pdb command)
@anchor{library/pdb pdbcommand-interact}@anchor{482c}
@deffn {Pdbcommand} interact

현재 스코프에 대한 지역 및 전역 이름 공간에서 초기화된 새 전역 이름 공간에서 (@ref{1b,,code} 모듈을 활용하는) 대화형 인터프리터를 시작합니다. 인터프리터를 종료하고 디버거로 돌아가려면 @code{exit()}나 @code{quit()}를 사용하세요.

@cartouche
@quotation 참고 
As @code{interact} creates a new dedicated namespace for code execution,
assignments to variables will not affect the original namespaces.
However, modifications to any referenced mutable objects will be reflected
in the original namespaces as usual.
@end quotation
@end cartouche


Added in version 3.2.



버전 3.13에서 변경: @code{exit()} and @code{quit()} can be used to exit the @ref{482c,,interact}
command.



버전 3.13에서 변경: @ref{482c,,interact} directs its output to the debugger’s
output channel rather than @ref{b33,,sys.stderr}.

@end deffn

@geindex alias (pdb command)
@anchor{library/pdb debugger-aliases}@anchor{4816}@anchor{library/pdb pdbcommand-alias}@anchor{482d}
@deffn {Pdbcommand} alias [name [command]]

`command'를 실행하는 `name'이라 불리는 에일리어스를 생성합니다. `command'는 따옴표로 감싸지 `않아야' 합니다. 대체할 수 있는 파라미터는 @code{%1}, @code{%2}, … 및 @code{%9} 로 표시되지만, @code{%*} 는 모든 파라미터로 대체됩니다. 만약 `command'가 생략되면, 현재 `name'의 에일리어스가 표시됩니다. 만약 아무 인자가 주어지지 않으면, 모든 에일리어스가 나열됩니다.

에일리어스는 중첩될 수 있고 pdb 프롬프트 내에서 정당하게 입력할 수 있는 모든 것을 담을 수 있습니다. 주의할 점은 pdb 내부 명령들이 에일리어스에 의해 오버라이드 `될 수 있습니다'. 그 명령은 에일리어스가 없어질 때까지 사용할 수 없게 됩니다. 에일리어싱은 명령 줄의 첫 번째 단어에 회귀적으로 적용됩니다; 나머지 단어들은 적용되지 않습니다.

@code{.pdbrc}파일에 추가되면 특히 유용한 두 에일리어스 예시:

@example
# 인스턴스 변수를 인쇄합니다 (사용법 "pi classInst")
alias pi for k in %1.__dict__.keys(): print(f"%1.@{k@} = @{%1.__dict__[k]@}")
# self 의 인스턴스 변수를 인쇄합니다
alias ps pi self
@end example
@end deffn

@geindex unalias (pdb command)
@anchor{library/pdb pdbcommand-unalias}@anchor{482e}
@deffn {Pdbcommand} unalias name

지정된 에일리어스 `name'을 제거합니다.
@end deffn

@geindex ! (pdb command)
@anchor{library/pdb pdbcommand-0}@anchor{482f}
@deffn {Pdbcommand} ! statement

현재 스택 프레임의 컨텍스트에서 단일 `statement'를 실행합니다. 문장의 첫 단어가 디버거 명령이 아닌 경우, 느낌표는 제외해도 됩니다, 예를 들면:

@example
(Pdb) ! n=42
(Pdb)
@end example

전역 변수를 설정하려면 실행하려는 명령과 동일한 줄 맨 앞에 @ref{4ad,,global}문장을 붙이면 됩니다, 예를 들면:

@example
(Pdb) global list_options; list_options = ['-l']
(Pdb)
@end example
@end deffn

@geindex run (pdb command)
@geindex restart (pdb command)
@anchor{library/pdb pdbcommand-run}@anchor{4830}
@deffn {Pdbcommand} run [args ...]
@anchor{library/pdb pdbcommand-restart}@anchor{4831}
@deffnx {Pdbcommand} restart [args ...]

디버그 된 파이썬 프로그램을 재시작합니다. 만약 `args'가 주어지면, @ref{c9,,shlex}으로 나뉘게 되고 결과는 새 @ref{1469,,sys.argv}로 사용됩니다. 이전 기록, 중단점, 행동 그리고 디버거 옵션은 유지됩니다. @ref{4831,,restart}는 @ref{4830,,run}의 에일리어스입니다.


버전 3.14에서 변경: @ref{4830,,run} and @ref{4831,,restart} commands are disabled when the
debugger is invoked in @code{'inline'} mode.

@end deffn

@geindex quit (pdb command)
@anchor{library/pdb pdbcommand-quit}@anchor{4825}
@deffn {Pdbcommand} q(uit)

Quit from the debugger.  The program being executed is aborted.
An end-of-file input is equivalent to @ref{4825,,quit}.

A confirmation prompt will be shown if the debugger is invoked in
@code{'inline'} mode. Either @code{y}, @code{Y}, @code{<Enter>} or @code{EOF}
will confirm the quit.


버전 3.14에서 변경: A confirmation prompt will be shown if the debugger is invoked in
@code{'inline'} mode. After the confirmation, the debugger will call
@ref{277,,sys.exit()} immediately, instead of raising @ref{278,,bdb.BdbQuit}
in the next trace event.

@end deffn

@geindex debug (pdb command)
@anchor{library/pdb pdbcommand-debug}@anchor{4832}
@deffn {Pdbcommand} debug code

`code'(현재 환경에서 실행될 임의의 표현식이나 문장)를 단계별로 수행하는 재귀적 디버거에 진입합니다.
@end deffn

@geindex retval (pdb command)
@anchor{library/pdb pdbcommand-retval}@anchor{4833}
@deffn {Pdbcommand} retval

현재 함수의 마지막 반환에 대한 반환 값을 인쇄합니다.
@end deffn

@geindex exceptions (pdb command)
@anchor{library/pdb pdbcommand-exceptions}@anchor{53f}
@deffn {Pdbcommand} exceptions [excnumber]

List or jump between chained exceptions.

When using @code{pdb.pm()}  or @code{Pdb.post_mortem(...)} with a chained exception
instead of a traceback, it allows the user to move between the
chained exceptions using @code{exceptions} command to list exceptions, and
@code{exceptions <number>} to switch to that exception.

예제:

@example
def out():
    try:
        middle()
    except Exception as e:
        raise ValueError("reraise middle() error") from e

def middle():
    try:
        return inner(0)
    except Exception as e:
        raise ValueError("Middle fail")

def inner(x):
    1 / x

 out()
@end example

calling @code{pdb.pm()} will allow to move between exceptions:

@example
> example.py(5)out()
-> raise ValueError("reraise middle() error") from e

(Pdb) exceptions
  0 ZeroDivisionError('division by zero')
  1 ValueError('Middle fail')
> 2 ValueError('reraise middle() error')

(Pdb) exceptions 0
> example.py(16)inner()
-> 1 / x

(Pdb) up
> example.py(10)middle()
-> return inner(0)
@end example


Added in version 3.13.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 파이썬 프로파일러,timeit — 작은 코드 조각의 실행 시간 측정,pdb — The Python Debugger,디버깅과 프로파일링
@anchor{library/profile doc}@anchor{4834}@anchor{library/profile profile}@anchor{4835}@anchor{library/profile the-python-profilers}@anchor{4836}@anchor{library/profile translation-repo}@anchor{4837}
@subsection 파이썬 프로파일러


`소스 코드:' Lib/profile.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/profile.py} 및 Lib/pstats.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/pstats.py}


__________________________________________________________________


@menu
* 프로파일러 소개:: 
* 즉석 사용자 설명서:: 
* profile and cProfile Module Reference:: 
* Stats 클래스:: 
* 결정론적 프로파일링이란 무엇입니까?:: 
* 한계:: 
* 보정:: 
* 사용자 정의 타이머 사용하기:: 

@end menu

@node 프로파일러 소개,즉석 사용자 설명서,,파이썬 프로파일러
@anchor{library/profile introduction-to-the-profilers}@anchor{4838}@anchor{library/profile profiler-introduction}@anchor{4839}
@subsubsection 프로파일러 소개


@geindex 결정론적 프로파일링
@geindex 프로파일링@comma{} 결정론적

@ref{2b,,cProfile}과 @ref{b4,,profile}은 파이썬 프로그램의 `결정론적 프로파일링 (deterministic profiling)'을 제공합니다. `프로파일 (profile)'은 프로그램의 여러 부분이 얼마나 자주 그리고 얼마나 오랫동안 실행되었는지를 기술하는 통계 집합입니다. 이러한 통계는 @ref{b5,,pstats} 모듈을 통해 보고서로 포매팅 할 수 있습니다.

파이썬 표준 라이브러리는 같은 프로파일링 인터페이스의 두 가지 구현을 제공합니다:


@enumerate 

@item 
@ref{2b,,cProfile}이 대부분 사용자에게 권장됩니다; 오래 실행되는 프로그램을 프로파일링하는 데 적합한 합리적인 부하를 주는 C 확장입니다. Brett Rosen과 Ted Czotter가 제공한 @code{lsprof}를 기반으로 합니다.

@item 
@ref{b4,,profile}은 순수 파이썬 모듈이고 이 인터페이스를 @ref{2b,,cProfile}이 모방했습니다. 하지만, 프로파일링 되는 프로그램에 상당한 부하를 추가합니다. 어떤 방식으로 프로파일러를 확장하려고 한다면, 이 모듈을 사용하면 작업이 더 쉬울 수 있습니다. Jim Roskind가 원래 설계하고 작성했습니다.
@end enumerate

@cartouche
@quotation 참고 
프로파일러 모듈은 벤치마킹 목적(이를 위해서는 합리적으로 정확한 결과를 주는 @ref{f5,,timeit}이 있습니다)이 아니라 주어진 프로그램에 대한 실행 프로파일을 제공하도록 설계되었습니다. 이것은 특히 C 코드에 대한 파이썬 코드 벤치마킹에 적용됩니다: 프로파일러는 파이썬 코드에 부하를 가하지만, C 수준 함수에는 그렇지 않아서 C 코드는 모든 파이썬 코드보다 빨라 보입니다.
@end quotation
@end cartouche

@node 즉석 사용자 설명서,profile and cProfile Module Reference,프로파일러 소개,파이썬 프로파일러
@anchor{library/profile instant-user-s-manual}@anchor{483a}@anchor{library/profile profile-instant}@anchor{483b}
@subsubsection 즉석 사용자 설명서


이 섹션은 “설명서를 읽고 싶지 않은” 사용자를 위해 제공됩니다. 매우 간단한 개요를 제공하며, 사용자가 기존 응용 프로그램에서 프로파일링을 빠르게 수행할 수 있도록 합니다.

단일 인자를 취하는 함수를 프로파일링하려면, 이렇게 할 수 있습니다:

@example
import cProfile
import re
cProfile.run('re.compile("foo|bar")')
@end example

(시스템에서 @ref{2b,,cProfile}을 사용할 수 없으면 대신 @ref{b4,,profile}을 사용하십시오.)

위의 작업은 @ref{dcd,,re.compile()}을 실행하고 다음과 같은 프로파일 결과를 인쇄합니다:

@example
214 function calls (207 primitive calls) in 0.002 seconds

Ordered by: cumulative time

ncalls  tottime  percall  cumtime  percall filename:lineno(function)
     1    0.000    0.000    0.002    0.002 @{built-in method builtins.exec@}
     1    0.000    0.000    0.001    0.001 <string>:1(<module>)
     1    0.000    0.000    0.001    0.001 __init__.py:250(compile)
     1    0.000    0.000    0.001    0.001 __init__.py:289(_compile)
     1    0.000    0.000    0.000    0.000 _compiler.py:759(compile)
     1    0.000    0.000    0.000    0.000 _parser.py:937(parse)
     1    0.000    0.000    0.000    0.000 _compiler.py:598(_code)
     1    0.000    0.000    0.000    0.000 _parser.py:435(_parse_sub)
@end example

첫 번째 줄은 214개의 호출이 관찰되었음을 나타냅니다. 이 호출 중 207개는 `프리미티브(primitive)'였으며, 이는 호출이 재귀를 통해 유발되지 않았음을 의미합니다. 다음 줄: @code{Ordered by: cumulative time}, 은 출력이 @code{cumtime} 값으로 정렬되었음을 나타냅니다. 열 제목은 다음과 같습니다:


@table @asis

@item ncalls

호출 수.

@item tottime

주어진 함수에서 소비된 총 시간 (서브 함수 호출에 든 시간은 제외합니다)

@item percall

@code{tottime}을 @code{ncalls}로 나눈 몫

@item cumtime

이 함수와 모든 서브 함수에서 소요된 누적 시간 (호출에서 종료까지). 이 수치는 재귀 함수에서도 `정확'합니다.

@item percall

@code{cumtime}을 프리미티브 호출로 나눈 몫

@item filename:lineno(function)

각 함수의 해당 데이터를 제공합니다 – 파일명:줄 번호(함수)
@end table

첫 번째 열에 두 개의 숫자가 있으면 (예를 들어 @code{3/1}), 함수가 재귀 되었음을 의미합니다. 두 번째 값은 프리미티브 호출 수이고 앞엣것은 총 호출 수입니다. 함수가 재귀 되지 않으면, 이 두 값은 같으며, 한 숫자만 인쇄됩니다.

프로파일 실행의 끝에 출력을 인쇄하는 대신, @code{run()} 함수에 파일명을 지정하여 결과를 파일에 저장할 수 있습니다:

@example
import cProfile
import re
cProfile.run('re.compile("foo|bar")', 'restats')
@end example

@ref{483c,,pstats.Stats} 클래스는 파일에서 프로파일 결과를 읽고 다양한 방식으로 포맷합니다.
@anchor{library/profile profile-cli}@anchor{483d}
@ref{2b,,cProfile}과 @ref{b4,,profile}을 스크립트로 호출하여 다른 스크립트를 프로파일링 할 수도 있습니다. 예를 들면:

@example
python -m cProfile [-o output_file] [-s sort_order] (-m module | myscript.py)
@end example

@geindex cProfile 명령줄 옵션; -o
@anchor{library/profile cmdoption-cProfile-o}@anchor{483e}
@deffn {Option} @w{-}o <output_file>

stdout 대신 파일에 프로파일 결과를 씁니다.
@end deffn

@geindex cProfile 명령줄 옵션; -s
@anchor{library/profile cmdoption-cProfile-s}@anchor{483f}
@deffn {Option} @w{-}s <sort_order>

출력을 정렬할 @ref{4840,,sort_stats()} 정렬 값 중 하나를 지정합니다. 이는 @ref{483e,,-o}가 제공되지 않은 경우에만 적용됩니다.
@end deffn

@geindex cProfile 명령줄 옵션; -m
@anchor{library/profile cmdoption-cProfile-m}@anchor{4841}
@deffn {Option} @w{-}m <module>

스크립트 대신 모듈이 프로파일링 되도록 지정합니다.


Added in version 3.7: @code{-m} 옵션을 @ref{2b,,cProfile}에 추가했습니다.



Added in version 3.8: @code{-m} 옵션을 @ref{b4,,profile}에 추가했습니다.

@end deffn

@ref{b5,,pstats} 모듈의 @ref{483c,,Stats} 클래스에는 프로파일 결과 파일에 저장된 데이터를 조작하고 인쇄하기 위한 다양한 메서드가 있습니다:

@example
import pstats
from pstats import SortKey
p = pstats.Stats('restats')
p.strip_dirs().sort_stats(-1).print_stats()
@end example

@ref{4842,,strip_dirs()} 메서드는 모든 모듈 이름에서 외부 경로를 제거했습니다. @ref{4840,,sort_stats()} 메서드는 인쇄되는 표준 모듈/줄/이름 문자열에 따라 모든 항목을 정렬했습니다. @ref{4843,,print_stats()} 메서드는 모든 통계를 인쇄했습니다. 다음과 같은 정렬 호출을 시도할 수 있습니다:

@example
p.sort_stats(SortKey.NAME)
p.print_stats()
@end example

첫 번째 호출은 실제로 함수 이름으로 목록을 정렬하고, 두 번째 호출은 통계를 인쇄합니다. 다음은 몇 가지 흥미로운 실험 호출입니다:

@example
p.sort_stats(SortKey.CUMULATIVE).print_stats(10)
@end example

이것은 함수에서의 누적 시간을 기준으로 프로파일을 정렬한 다음, 가장 중요한 10개의 줄만 인쇄합니다. 시간이 걸리는 알고리즘을 이해하려면, 위의 줄을 사용하십시오.

어떤 함수가 많이 반복되고 많은 시간이 걸리는지 알고 싶다면, 다음을 수행하여:

@example
p.sort_stats(SortKey.TIME).print_stats(10)
@end example

각 함수 내에서 소비한 시간에 따라 정렬한 다음, 상위 10개 함수에 대한 통계를 인쇄하십시오.

다음과 같은 것도 시도해 볼 수 있습니다:

@example
p.sort_stats(SortKey.FILENAME).print_stats('__init__')
@end example

이렇게 하면 모든 통계가 파일 이름으로 정렬된 다음, 클래스 초기화(init) 메서드에 대한 통계만 인쇄됩니다 (이들의 철자가 @code{__init__}이기 때문입니다). 마지막 예로, 다음을 시도해 볼 수 있습니다:

@example
p.sort_stats(SortKey.TIME, SortKey.CUMULATIVE).print_stats(.5, 'init')
@end example

이 줄은 주 시간 키와 누적 시간 보조 키로 통계를 정렬한 다음, 일부 통계를 인쇄합니다. 구체적으로, 목록을 먼저 원래 크기의 50%(@code{.5})로 줄인 다음, @code{init}를 포함하는 줄만 유지되고, 그 서브 서브 목록이 인쇄됩니다.

어떤 함수가 위의 함수를 호출했는지 궁금하다면, 이제 다음과 같이 할 수 있습니다 (@code{p}는 여전히 마지막 기준에 따라 정렬됩니다):

@example
p.print_callers(.5, 'init')
@end example

그러면 나열된 각 함수에 대한 호출자 목록을 얻습니다.

더 많은 기능을 원하면, 매뉴얼을 읽거나, 다음 함수가 무엇인지 추측하십시오:

@example
p.print_callees()
p.add('restats')
@end example

스크립트로 호출될 때, @ref{b5,,pstats} 모듈은 프로파일 덤프를 읽고 검사하기 위한 통계 브라우저입니다. 간단한 줄 지향 인터페이스(@ref{1a,,cmd}를 사용하여 구현되었습니다)와 대화식 도움말이 있습니다.

@node profile and cProfile Module Reference,Stats 클래스,즉석 사용자 설명서,파이썬 프로파일러
@anchor{library/profile module-cProfile}@anchor{2b}@anchor{library/profile profile-and-cprofile-module-reference}@anchor{4844}
@subsubsection @code{profile} and @code{cProfile} Module Reference


@geindex module; cProfile

@geindex module; profile
@anchor{library/profile module-profile}@anchor{b4}
Both the @ref{b4,,profile} and @code{cProfile} modules provide the following
functions:

@geindex run() (profile 모듈)
@anchor{library/profile profile run}@anchor{4845}
@deffn {함수} profile.run (command, filename=None, sort=-1)

이 함수는 @ref{4a3,,exec()} 함수에 전달할 수 있는 단일 인자와 선택적 파일 이름을 취합니다. 모든 경우에 이 루틴은 다음을 실행합니다:

@example
exec(command, __main__.__dict__, __main__.__dict__)
@end example

그리고 실행으로부터 프로파일링 통계를 수집합니다. 파일 이름이 없으면, 이 함수는 자동으로 @ref{483c,,Stats} 인스턴스를 만들고 간단한 프로파일링 보고서를 인쇄합니다. 정렬 값이 지정되면, 이 @code{Stats} 인스턴스로 전달되어 결과 정렬 방법을 제어합니다.
@end deffn

@geindex runctx() (profile 모듈)
@anchor{library/profile profile runctx}@anchor{4846}
@deffn {함수} profile.runctx (command, globals, locals, filename=None, sort=-1)

이 함수는 @ref{4845,,run()}과 유사하며, `command' 문자열에 대한 전역(globals)과 지역(locals) 매핑 제공하기 위한 인자가 추가되었습니다. 이 루틴은 다음을 실행합니다:

@example
exec(command, globals, locals)
@end example

그리고 위의 @ref{4845,,run()} 함수에서와같이 프로파일링 통계를 수집합니다.
@end deffn

@geindex Profile (profile 클래스)
@anchor{library/profile profile Profile}@anchor{bd5}
@deffn {클래스} profile.Profile (timer=None, timeunit=0.0, subcalls=True, builtins=True)

이 클래스는 일반적으로 @code{cProfile.run()} 함수가 제공하는 것보다 프로파일링에 대한 더 세밀한 제어가 필요할 때만 사용됩니다.

`timer' 인자를 통해 코드를 실행하는 데 걸리는 시간을 측정하기 위한 사용자 정의 타이머를 제공할 수 있습니다. 현재 시각을 나타내는 단일 숫자를 반환하는 함수여야 합니다. 숫자가 정수이면, `timeunit'는 각 시간 단위의 지속 시간을 지정하는 승수를 지정합니다. 예를 들어, 타이머가 밀리초 단위로 측정된 시간을 반환하면 시간 단위는 @code{.001}입니다.

@ref{bd5,,Profile} 클래스를 직접 사용하면 프로파일 데이터를 파일에 쓰지 않고도 프로파일 결과를 포맷할 수 있습니다:

@example
import cProfile, pstats, io
from pstats import SortKey
pr = cProfile.Profile()
pr.enable()
# ... 뭔가 합니다 ...
pr.disable()
s = io.StringIO()
sortby = SortKey.CUMULATIVE
ps = pstats.Stats(pr, stream=s).sort_stats(sortby)
ps.print_stats()
print(s.getvalue())
@end example

The @code{Profile} class can also be used as a context manager (supported
only in @code{cProfile} module. see @ref{240c,,컨텍스트 관리자 형}):

@example
import cProfile

with cProfile.Profile() as pr:
    # ... 뭔가 합니다 ...

    pr.print_stats()
@end example


버전 3.8에서 변경: 컨텍스트 관리자 지원이 추가되었습니다.


@geindex enable() (profile.Profile 메서드)
@anchor{library/profile profile Profile enable}@anchor{4847}
@deffn {메서드} enable ()

Start collecting profiling data. Only in @code{cProfile}.
@end deffn

@geindex disable() (profile.Profile 메서드)
@anchor{library/profile profile Profile disable}@anchor{4848}
@deffn {메서드} disable ()

Stop collecting profiling data. Only in @code{cProfile}.
@end deffn

@geindex create_stats() (profile.Profile 메서드)
@anchor{library/profile profile Profile create_stats}@anchor{4849}
@deffn {메서드} create_stats ()

프로파일링 데이터 수집을 중지하고 결과를 내부적으로 현재 프로파일로 기록합니다.
@end deffn

@geindex print_stats() (profile.Profile 메서드)
@anchor{library/profile profile Profile print_stats}@anchor{484a}
@deffn {메서드} print_stats (sort=-1)

현재 프로파일을 기반으로 @ref{483c,,Stats} 객체를 만들고 결과를 stdout에 인쇄합니다.

The `sort' parameter specifies the sorting order of the displayed
statistics. It accepts a single key or a tuple of keys to enable
multi-level sorting, as in @ref{4840,,Stats.sort_stats}.


Added in version 3.13: @code{print_stats()} now accepts a tuple of keys.

@end deffn

@geindex dump_stats() (profile.Profile 메서드)
@anchor{library/profile profile Profile dump_stats}@anchor{484b}
@deffn {메서드} dump_stats (filename)

현재 프로파일의 결과를 `filename'에 씁니다.
@end deffn

@geindex run() (profile.Profile 메서드)
@anchor{library/profile profile Profile run}@anchor{484c}
@deffn {메서드} run (cmd)

@ref{4a3,,exec()}를 통해 cmd를 프로파일 합니다.
@end deffn

@geindex runctx() (profile.Profile 메서드)
@anchor{library/profile profile Profile runctx}@anchor{484d}
@deffn {메서드} runctx (cmd, globals, locals)

지정된 전역과 지역 환경으로 @ref{4a3,,exec()}를 통해 cmd를 프로파일 합니다.
@end deffn

@geindex runcall() (profile.Profile 메서드)
@anchor{library/profile profile Profile runcall}@anchor{c6f}
@deffn {메서드} runcall (func, /, *args, **kwargs)

@code{func(*args, **kwargs)}를 프로파일 합니다
@end deffn
@end deffn

프로파일링은 호출된 명령/함수가 실제로 반환하는 경우에만 작동함에 유의하십시오. 인터프리터가 종료되면 (예를 들어 호출된 명령/함수 실행 중 @ref{277,,sys.exit()} 호출을 통해) 아무런 프로파일링 결과도 인쇄되지 않습니다.

@node Stats 클래스,결정론적 프로파일링이란 무엇입니까?,profile and cProfile Module Reference,파이썬 프로파일러
@anchor{library/profile profile-stats}@anchor{484e}@anchor{library/profile the-stats-class}@anchor{484f}
@subsubsection @code{Stats} 클래스


프로파일러 데이터의 분석은 @ref{483c,,Stats} 클래스를 사용하여 수행됩니다.

@geindex module; pstats

@geindex Stats (pstats 클래스)
@anchor{library/profile module-pstats}@anchor{b5}@anchor{library/profile pstats Stats}@anchor{483c}
@deffn {클래스} pstats.Stats (*filenames or profile, stream=sys.stdout)

이 클래스 생성자는 `filename'(또는 파일명의 리스트)이나 @code{Profile} 인스턴스에서 “통계 객체”의 인스턴스를 만듭니다. 출력은 `stream'에 의해 지정된 스트림으로 인쇄됩니다.

위의 생성자에 의해 선택된 파일은 해당 버전의 @ref{b4,,profile}이나 @ref{2b,,cProfile}에 의해 만들어졌어야 합니다. 구체적으로, 이 프로파일러의 향후 버전에서 보장되는 파일 호환성은 `없으며', 다른 프로파일러에서 생성된 파일이나 다른 운영 체제에서 실행되는 같은 프로파일러의 실행과 호환되지 않습니다. 여러 파일이 제공되면, 동일한 함수에 대한 모든 통계가 통합되므로, 여러 프로세스에 대한 전체 뷰를 단일 보고서에서 고려할 수 있습니다. 추가 파일을 기존 @ref{483c,,Stats} 객체의 데이터와 결합해야 하면, @ref{4850,,add()} 메서드를 사용할 수 있습니다.

파일에서 프로파일 데이터를 읽는 대신, @code{cProfile.Profile}이나 @ref{bd5,,profile.Profile} 객체를 프로파일 데이터 소스로 사용할 수 있습니다.

@ref{483c,,Stats} 객체에는 다음과 같은 메서드가 있습니다:

@geindex strip_dirs() (pstats.Stats 메서드)
@anchor{library/profile pstats Stats strip_dirs}@anchor{4842}
@deffn {메서드} strip_dirs ()

@ref{483c,,Stats} 클래스에 대한 이 메서드는 파일 이름에서 모든 선행 경로 정보를 제거합니다. 80열 이내에 (가깝게) 맞게 출력물의 크기를 줄이는 데 매우 유용합니다. 이 메서드는 객체를 수정하고, 제거된 정보는 손실됩니다. 제거 조작을 수행한 후, 객체는 객체 초기화와 로드 직후와 마찬가지로 “임의의” 순서로 항목을 가진 것으로 간주합니다. @ref{4842,,strip_dirs()}로 인해 두 함수 이름이 구별할 수 없게 되면 (같은 파일 이름의 같은 줄에 있고, 함수 이름도 같습니다), 이 두 항목에 대한 통계는 단일 항목으로 누적됩니다.
@end deffn

@geindex add() (pstats.Stats 메서드)
@anchor{library/profile pstats Stats add}@anchor{4850}
@deffn {메서드} add (*filenames)

@ref{483c,,Stats} 클래스의 이 메서드는 추가 프로파일링 정보를 현재 프로파일링 객체에 누적합니다. 인자는 해당 버전의 @ref{4845,,profile.run()}이나 @code{cProfile.run()}으로 만들어진 파일명을 참조해야 합니다. 동일한 이름을 가진 (파일, 줄, 이름) 함수에 대한 통계는 자동으로 단일 함수 통계에 축적됩니다.
@end deffn

@geindex dump_stats() (pstats.Stats 메서드)
@anchor{library/profile pstats Stats dump_stats}@anchor{4851}
@deffn {메서드} dump_stats (filename)

@ref{483c,,Stats} 객체에 로드된 데이터를 `filename'이라는 파일에 저장합니다. 파일이 없으면 만들어지고, 이미 존재하면 덮어씁니다. 이것은 @ref{bd5,,profile.Profile}과 @code{cProfile.Profile} 클래스에 있는 같은 이름의 메서드와 동등합니다.
@end deffn

@geindex sort_stats() (pstats.Stats 메서드)
@anchor{library/profile pstats Stats sort_stats}@anchor{4840}
@deffn {메서드} sort_stats (*keys)

이 메서드는 제공된 기준에 따라 @ref{483c,,Stats} 객체를 정렬하여 수정합니다. 인자는 정렬 기준을 식별하는 문자열이나 SortKey 열거형일 수 있습니다 (예: @code{'time'}, @code{'name'}, @code{SortKey.TIME} 또는 @code{SortKey.NAME}). SortKey 열거형 인자는 문자열 인자보다 안정적이고 에러가 적다는 점에서 문자열 인자보다 유리합니다.

둘 이상의 키가 제공되면, 그 앞에 선택된 모든 키가 같을 때 추가 키가 보조 기준으로 사용됩니다. 예를 들어, @code{sort_stats(SortKey.NAME, SortKey.FILE)}은 함수 이름에 따라 모든 항목을 정렬하고, 함수 이름이 같으면 파일 이름으로 정렬합니다.

문자열 인자의 경우, 약어가 모호하지 않은 한, 모든 키 이름에 약어를 사용할 수 있습니다.

유효한 문자열과 SortKey는 다음과 같습니다:


@multitable {xxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

유효한 문자열 인자

@tab

유효한 열거형 인자

@tab

의미

@item

@code{'calls'}

@tab

SortKey.CALLS

@tab

호출 수

@item

@code{'cumulative'}

@tab

SortKey.CUMULATIVE

@tab

누적 시간

@item

@code{'cumtime'}

@tab

해당 없음

@tab

누적 시간

@item

@code{'file'}

@tab

해당 없음

@tab

파일 이름

@item

@code{'filename'}

@tab

SortKey.FILENAME

@tab

파일 이름

@item

@code{'module'}

@tab

해당 없음

@tab

파일 이름

@item

@code{'ncalls'}

@tab

해당 없음

@tab

호출 수

@item

@code{'pcalls'}

@tab

SortKey.PCALLS

@tab

프리미티브 호출 수

@item

@code{'line'}

@tab

SortKey.LINE

@tab

줄 번호

@item

@code{'name'}

@tab

SortKey.NAME

@tab

함수 이름

@item

@code{'nfl'}

@tab

SortKey.NFL

@tab

이름/파일/줄

@item

@code{'stdname'}

@tab

SortKey.STDNAME

@tab

표준 이름

@item

@code{'time'}

@tab

SortKey.TIME

@tab

내부 시간

@item

@code{'tottime'}

@tab

해당 없음

@tab

내부 시간

@end multitable


통계의 모든 정렬은 내림차순이고 (가장 시간이 오래 걸리는 항목을 앞에 놓습니다), 이름, 파일 및 줄 번호 검색은 오름차순(알파벳 순서)임에 유의하십시오. @code{SortKey.NFL}과 @code{SortKey.STDNAME} 간의 미묘한 차이점은 표준 이름이 인쇄된 이름의 일종이라는 것입니다. 즉, 포함된 줄 번호가 이상한 방식으로 비교됩니다. 예를 들어, 줄 3, 20 및 40은 (파일 이름이 같으면) 문자열 순서 20, 3 및 40으로 나타납니다. 반면에 @code{SortKey.NFL}은 줄 번호를 숫자로 비교합니다. 실제로, @code{sort_stats(SortKey.NFL)}은 @code{sort_stats(SortKey.NAME, SortKey.FILENAME, SortKey.LINE)}과 같습니다.

이전 버전과의 호환성을 위해, 숫자 인자 @code{-1}, @code{0}, @code{1} 및 @code{2}가 허용됩니다. 이들은 각각 @code{'stdname'}, @code{'calls'}, @code{'time'} 및 @code{'cumulative'}로 해석됩니다. 이 이전 스타일 형식(숫자)을 사용하면, 오직 하나의 정렬 키(숫자키)만 사용되며, 추가 인자는 조용히 무시됩니다.

@c For compatibility with the old profiler.


Added in version 3.7: SortKey 열거형을 추가했습니다.

@end deffn

@geindex reverse_order() (pstats.Stats 메서드)
@anchor{library/profile pstats Stats reverse_order}@anchor{4852}
@deffn {메서드} reverse_order ()

@ref{483c,,Stats} 클래스에 대한 이 메서드는 객체 내 기본 리스트의 순서를 뒤집습니다. 기본적으로 오름차순 대 내림차순은 선택한 정렬 키에 따라 올바르게 선택됨에 유의하십시오.

@c This method is provided primarily for compatibility with the old
@c profiler.
@end deffn

@geindex print_stats() (pstats.Stats 메서드)
@anchor{library/profile pstats Stats print_stats}@anchor{4843}
@deffn {메서드} print_stats (*restrictions)

@ref{483c,,Stats} 클래스에 대한 이 메서드는 @ref{4845,,profile.run()} 정의에 설명된 대로 보고서를 인쇄합니다.

인쇄 순서는 객체에서 수행된 마지막 @ref{4840,,sort_stats()} 연산을 기반으로 합니다 (@ref{4850,,add()}와 @ref{4842,,strip_dirs()}의 경고가 적용됩니다).

The arguments provided (if any) can be used to limit the list down to the
significant entries.  Initially, the list is taken to be the complete set
of profiled functions.  Each restriction is either an integer (to select a
count of lines), or a decimal fraction between 0.0 and 1.0 inclusive (to
select a percentage of lines), or a string that will be interpreted as a
regular expression (to pattern match the standard name that is printed).
If several restrictions are provided, then they are applied sequentially.
For example:

@example
print_stats(.1, 'foo:')
@end example

는 먼저 인쇄를 목록의 처음 10%로 제한한 다음, 파일 이름 @code{.*foo:}의 일부인 함수만 인쇄합니다. 대조적으로, 명령:

@example
print_stats('foo:', .1)
@end example

은 파일 이름이 @code{.*foo:} 인 모든 함수로 목록을 제한한 다음, 그중 처음 10%만 인쇄합니다.
@end deffn

@geindex print_callers() (pstats.Stats 메서드)
@anchor{library/profile pstats Stats print_callers}@anchor{4853}
@deffn {메서드} print_callers (*restrictions)

@ref{483c,,Stats} 클래스에 대한 이 메서드는 프로파일 된 데이터베이스에 있는 각 함수를 호출한 모든 함수의 목록을 인쇄합니다. 순서는 @ref{4843,,print_stats()}에서 제공한 순서와 동일하며, 제한 인자의 정의도 동일합니다. 각 호출자는 개별 줄로 보고됩니다. 통계를 생성한 프로파일러에 따라 형식이 약간 다릅니다:


@itemize *

@item 
@ref{b4,,profile}을 사용하면, 각 호출자 뒤에 숫자가 괄호 안에 표시되어 이 특정 호출이 몇 번이나 되었는지 표시됩니다. 편의를 위해, 두 번째 괄호로 묶지 않은 숫자는 오른쪽에 나오는 함수에서 소비한 누적 시간을 반복합니다.

@item 
@ref{2b,,cProfile}을 사용하면, 각 호출자 앞에 세 숫자가 나옵니다: 이 특정 호출이 발생한 횟수, 이 특정 호출자가 호출한 동안 현재 함수에서 소비 한 총 및 누적 시간.
@end itemize
@end deffn

@geindex print_callees() (pstats.Stats 메서드)
@anchor{library/profile pstats Stats print_callees}@anchor{4854}
@deffn {메서드} print_callees (*restrictions)

@ref{483c,,Stats} 클래스에 대한 이 메서드는 표시된 함수에 의해 호출된 모든 함수의 목록을 인쇄합니다. 이러한 호출 방향 반전(호출한 대 호출된)을 제외하고, 인자와 순서는 @ref{4853,,print_callers()} 메서드와 같습니다.
@end deffn

@geindex get_stats_profile() (pstats.Stats 메서드)
@anchor{library/profile pstats Stats get_stats_profile}@anchor{4855}
@deffn {메서드} get_stats_profile ()

이 메서드는 함수 이름을 FunctionProfile 인스턴스로 매핑하는 StatsProfile 인스턴스를 반환합니다. 각 FunctionProfile 인스턴스에는 함수 실행 시간, 호출 횟수 등의 함수의 프로파일 관련 정보가 있습니다.


Added in version 3.9: 다음과 같은 데이터 클래스(dataclasses)를 추가했습니다: StatsProfile, FunctionProfile. 다음과 같은 함수를 추가했습니다: get_stats_profile.

@end deffn
@end deffn

@node 결정론적 프로파일링이란 무엇입니까?,한계,Stats 클래스,파이썬 프로파일러
@anchor{library/profile deterministic-profiling}@anchor{4856}@anchor{library/profile what-is-deterministic-profiling}@anchor{4857}
@subsubsection 결정론적 프로파일링이란 무엇입니까?


`결정론적 프로파일링(Deterministic profiling)'이라는 용어는 모든 `함수 호출', `함수 반환' 및 `예외' 이벤트가 모니터링되고, (사용자 코드가 실행되는 시간 동안) 이러한 이벤트 사이의 간격에 대한 정확한 시간 측정이 이루어진다는 사실을 반영하기 위한 것입니다. 반면에, `통계적 프로파일링(statistical profiling)'(이 모듈에서는 수행하지 않습니다)은 유효 명령어 포인터를 무작위로 샘플링하여 시간이 소비되는 위치를 추론합니다. 후자의 기술은 전통적으로 (코드를 계측할 필요가 없기 때문에) 오버헤드가 적지만, 시간이 어디에서 소비되는지에 대한 상대적 표시만 제공합니다.

파이썬에서는, 실행 중에 인터프리터가 활성화되어있어서, 결정론적 프로파일링을 수행하기 위해 인스트루먼트 된 코드(instrumented code)가 필요하지 않습니다. 파이썬은 각 이벤트에 대해 자동으로 `훅(hook)'(선택적 콜백)을 제공합니다. 또한, 파이썬의 인터프리터 적인 성격은 실행에 이미 많은 오버헤드를 추가하는 경향이 있어서, 결정론적 프로파일링은 일반적인 응용 프로그램에서 작은 처리 오버헤드만 추가하는 경향이 있습니다. 결과적으로 결정론적 프로파일링은 그다지 비싸지 않으면서도, 파이썬 프로그램의 실행에 대한 광범위한 실행 시간 통계를 제공합니다.

호출 수 통계를 사용하여 코드의 버그(놀랄만한 횟수)를 식별하고, 가능한 인라인 확장 지점(높은 호출 횟수)을 식별할 수 있습니다. 내부 시간 통계를 사용하여 신중하게 최적화해야 하는 “핫 루프(hot loops)”를 식별할 수 있습니다. 누적 시간 통계를 사용하여 알고리즘 선택에서의 고수준 에러를 식별할 수 있습니다. 이 프로파일러에서의 누적 시간의 특이한 처리는 알고리즘의 재귀 구현에 대한 통계를 반복 구현과 직접 비교할 수 있도록 함에 유의하십시오.

@node 한계,보정,결정론적 프로파일링이란 무엇입니까?,파이썬 프로파일러
@anchor{library/profile limitations}@anchor{4858}@anchor{library/profile profile-limitations}@anchor{4859}
@subsubsection 한계


타이밍 정보의 정확성과 관련하여 한 가지 제약이 있습니다. 정확성과 관련해서는 결정론적 프로파일러에 근본적인 문제가 있습니다. 가장 명백한 제약은 하부 “시계”가 (일반적으로) 약 .001 초의 속도로만 눈금이 변하는 것입니다. 따라서 하부 시계보다 더 정확한 측정은 없습니다. 충분한 측정을 수행하면, “에러”가 평균이 되어 사라지는 경향이 있습니다. 불행히도, 이 첫 번째 에러를 제거하면 두 번째 에러 원인이 발생합니다.

두 번째 문제는 이벤트가 디스패치 된 시점부터 프로파일러가 시간을 얻기 위해 호출하는 것이 실제로 시계의 상태를 `얻기'까지 “시간이 걸린다”는 것입니다. 마찬가지로, 프로파일러 이벤트 핸들러를 빠져나갈 때 시계값이 획득된 (그런 다음 저장됩니다) 시간부터, 사용자의 코드가 다시 실행될 때까지 어떤 지연이 발생합니다. 결과적으로, 여러 번 호출되거나, 많은 함수를 호출하는 함수는 일반적으로 이 에러를 누적합니다. 이러한 방식으로 누적되는 에러는 일반적으로 시계 정확도(1 눈금 미만)보다 작지만, 누적될 `수' 있어서 매우 중요해집니다.

오버헤드가 낮은 @ref{2b,,cProfile}보다 @ref{b4,,profile}에서 이 문제가 더 중요합니다. 이러한 이유로, @code{profile}은 특정 플랫폼에 대해 자신을 보정하는 방법을 제공하여 이 에러를 확률적으로 (평균적으로) 제거할 수 있습니다. 프로파일러가 보정된 후에는, 더 정확하지만 (최소한 최소 자승의 의미에서), 때로는 음수를 생성합니다 (호출 횟수가 예외적으로 낮고, 확률의 신들이 당신에게 등을 돌리면 :-). ) 프로파일에서 음수를 보아도 너무 놀라지 `마십시오'. 프로파일러를 보정한 경우에*만* 나타나야 하며, 결과는 실제로 보정하지 않은 것보다 낫습니다.

@node 보정,사용자 정의 타이머 사용하기,한계,파이썬 프로파일러
@anchor{library/profile calibration}@anchor{485a}@anchor{library/profile profile-calibration}@anchor{485b}
@subsubsection 보정


@ref{b4,,profile} 모듈의 프로파일러는 각 이벤트 처리 시간에서 상수를 빼서 시간 함수 호출의 오버헤드를 보상하고, 결과를 잘 보관합니다. 기본적으로, 상수는 0입니다. 다음 절차는 주어진 플랫폼에 대해 더 나은 상수를 얻는 데 사용될 수 있습니다 (@ref{4859,,한계}를 참조하십시오).

@example
import profile
pr = profile.Profile()
for i in range(5):
    print(pr.calibrate(10000))
@end example

이 메서드는 인자가 제공한 횟수의 파이썬 호출을, 직접하고 프로파일러하에서 다시 하면서, 두 두 시간을 측정합니다. 그런 다음 프로파일러 이벤트 당 숨겨진 오버헤드를 계산하여 부동 소수점으로 반환합니다. 예를 들어, 맥 OS를 실행하는 1.8Ghz 인텔 코어 i5에서, 그리고 파이썬의 time.process_time()을 타이머로 사용할 때, 매직 넘버는 약 4.04e-6입니다.

이 반복의 목적은 상당히 일관된 결과를 얻는 것입니다. 컴퓨터가 `매우' 빠르거나, 타이머 함수의 해상도가 좋지 않으면, 일관된 결과를 얻기 위해 100000이나 심지어 1000000을 전달해야 할 수 있습니다.

일관된 대답을 얻었을 때, 세 가지 방법으로 사용할 수 있습니다:

@example
import profile

# 1. 이후에 만들어지는 모든 Profile 인스턴스에 계산된 바이어스를 적용합니다.
profile.Profile.bias = your_computed_bias

# 2. 특정 Profile 인스턴스에 계산된 바이어스를 적용합니다.
pr = profile.Profile()
pr.bias = your_computed_bias

# 3. 인스턴스 생성자에 계산된 바이어스를 지정합니다.
pr = profile.Profile(bias=your_computed_bias)
@end example

선택해야 한다면, 더 작은 상수를 선택하는 것이 좋습니다, 그러면 결과가 프로파일 통계에서 결과가 “덜 자주” 음수로 표시됩니다.

@node 사용자 정의 타이머 사용하기,,보정,파이썬 프로파일러
@anchor{library/profile profile-timers}@anchor{485c}@anchor{library/profile using-a-custom-timer}@anchor{485d}
@subsubsection 사용자 정의 타이머 사용하기


현재 시각을 결정하는 방법을 변경하려면 (예를 들어, 벽시계 시간이나 소요된 프로세스 시간을 사용하도록 만들려면), @code{Profile} 클래스 생성자에게 원하는 타이밍 함수를 전달합니다:

@example
pr = profile.Profile(your_time_func)
@end example

결과 프로파일러는 @code{your_time_func}를 호출합니다. @ref{bd5,,profile.Profile}이나 @code{cProfile.Profile} 중 어느 것을 사용하느냐에 따라, @code{your_time_func}의 반환 값은 다르게 해석됩니다:


@table @asis

@item @ref{bd5,,profile.Profile}

@code{your_time_func}는 단일 숫자를 반환하거나, 또는 (@ref{131a,,os.times()}가 반환하는 것과 같이) 합계가 현재 시각인 숫자 리스트를 반환해야 합니다. 함수가 단일 시간 숫자를 반환하거나, 반환된 숫자의 리스트 길이가 2이면, 특히 빠른 버전의 디스패치 루틴을 얻게 됩니다.

여러분이 선택한 타이머 함수에 대해 프로파일러 클래스를 보정해야 합니다 (@ref{485b,,보정}을 참조하십시오). 대부분의 기계에서, 단일 정숫값을 반환하는 타이머는 프로파일링 중 낮은 오버헤드 측면에서 최상의 결과를 제공합니다. (@ref{131a,,os.times()}는 부동 소수점 값의 튜플을 반환하므로 `꽤' 나쁩니다). 더 좋은 타이머를 가장 깨끗한 방식으로 대체하려면, 클래스를 파생하고 적절한 보정 상수와 함께 타이머 호출을 가장 잘 처리하는 대체 디스패치 메서드를 배선하십시오.

@item @code{cProfile.Profile}

@code{your_time_func}는 단일 숫자를 반환해야 합니다. 정수를 반환하면, 시간 단위의 실제 지속 시간을 지정하는 두 번째 인자로 클래스 생성자를 호출할 수도 있습니다. 예를 들어, @code{your_integer_time_func}가 밀리초 단위로 측정된 시간을 반환하면, 다음과 같이 @code{Profile} 인스턴스를 구성합니다:

@example
pr = cProfile.Profile(your_integer_time_func, 0.001)
@end example

@code{cProfile.Profile} 클래스를 보정할 수 없어서, 사용자 정의 타이머 함수는 주의해서 사용해야 하고 가능한 한 빨라야 합니다. 사용자 정의 타이머로 최상의 결과를 얻으려면, 내부 @code{_lsprof} 모듈의 C 소스에 하드 코딩해야 할 수도 있습니다.
@end table

파이썬 3.3은 @ref{f4,,time}에 프로세스나 벽시계 시간을 정확하게 측정하는 데 사용할 수 있는 몇 가지 새로운 함수를 추가합니다. 예를 들어, @ref{c79,,time.perf_counter()}를 참조하십시오.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node timeit — 작은 코드 조각의 실행 시간 측정,trace — 파이썬 문장 실행 추적,파이썬 프로파일러,디버깅과 프로파일링
@anchor{library/timeit doc}@anchor{485e}@anchor{library/timeit module-timeit}@anchor{f5}@anchor{library/timeit timeit-measure-execution-time-of-small-code-snippets}@anchor{485f}@anchor{library/timeit translation-repo}@anchor{4860}
@subsection @code{timeit} — 작은 코드 조각의 실행 시간 측정


@geindex module; timeit

`소스 코드:' Lib/timeit.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/timeit.py}

@geindex 벤치마킹
@geindex 성능


__________________________________________________________________


이 모듈은 파이썬 코드의 작은 조각의 시간을 측정하는 간단한 방법을 제공합니다. @ref{4861,,명령 줄 인터페이스}뿐만 아니라 @ref{4862,,콜러블}도 있습니다. 실행 시간을 측정에 따르는 흔한 함정들을 피할 수 있습니다. O’Reilly가 출판한 `Python Cookbook' 2판에 있는 Tim Peters의 “Algorithms” 장의 개요도 참조하십시오.

@menu
* 기본 예제:: 
* 파이썬 인터페이스:: 
* 명령 줄 인터페이스: 명령 줄 인터페이스<2>. 
* 예제: 예제<27>. 

@end menu

@node 기본 예제,파이썬 인터페이스,,timeit — 작은 코드 조각의 실행 시간 측정
@anchor{library/timeit basic-examples}@anchor{4863}
@subsubsection 기본 예제


다음 예제에서는 @ref{4861,,명령 줄 인터페이스}를 사용하여 세 가지 다른 표현식을 비교하는 방법을 보여줍니다:

@example
$ python -m timeit "'-'.join(str(n) for n in range(100))"
10000 loops, best of 5: 30.2 usec per loop
$ python -m timeit "'-'.join([str(n) for n in range(100)])"
10000 loops, best of 5: 27.5 usec per loop
$ python -m timeit "'-'.join(map(str, range(100)))"
10000 loops, best of 5: 23.2 usec per loop
@end example

이것은 @ref{4862,,파이썬 인터페이스}로는 다음과 같이 할 수 있습니다:

@example
>>> import timeit
>>> timeit.timeit('"-".join(str(n) for n in range(100))', number=10000)
0.3018611848820001
>>> timeit.timeit('"-".join([str(n) for n in range(100)])', number=10000)
0.2727368790656328
>>> timeit.timeit('"-".join(map(str, range(100)))', number=10000)
0.23702679807320237
@end example

콜러블을 @ref{4862,,파이썬 인터페이스}로 전달할 수도 있습니다:

@example
>>> timeit.timeit(lambda: "-".join(map(str, range(100))), number=10000)
0.19665591977536678
@end example

그러나 @ref{107d,,timeit()}은 명령 줄 인터페이스가 사용될 때만 반복 횟수를 자동으로 결정합니다. @ref{4864,,예제} 절에서 고급 예제를 찾을 수 있습니다.

@node 파이썬 인터페이스,명령 줄 인터페이스<2>,기본 예제,timeit — 작은 코드 조각의 실행 시간 측정
@anchor{library/timeit id1}@anchor{4865}@anchor{library/timeit python-interface}@anchor{4862}
@subsubsection 파이썬 인터페이스


이 모듈은 세 개의 편리 함수와 하나의 공용 클래스를 정의합니다:

@geindex timeit() (timeit 모듈)
@anchor{library/timeit timeit timeit}@anchor{107d}
@deffn {함수} timeit.timeit (stmt='pass', setup='pass', timer=<default timer>, number=1000000, globals=None)

지정된 문장, `setup' 코드 및 `timer' 함수로 @ref{16cd,,Timer} 인스턴스를 만들고, `number' 실행으로 @ref{ee7,,timeit()} 메서드를 실행합니다. 선택적 `globals' 인자는 코드를 실행할 이름 공간을 지정합니다.


버전 3.5에서 변경: 선택적 `globals' 매개 변수가 추가되었습니다.

@end deffn

@geindex repeat() (timeit 모듈)
@anchor{library/timeit timeit repeat}@anchor{4866}
@deffn {함수} timeit.repeat (stmt='pass', setup='pass', timer=<default timer>, repeat=5, number=1000000, globals=None)

주어진 문장, `setup' 코드 및 `timer' 함수로 @ref{16cd,,Timer} 인스턴스를 생성하고, 주어진 `repeat' 카운트와 `number' 실행으로 @ref{4867,,repeat()} 메서드를 실행합니다. 선택적 `globals' 인자는 코드를 실행할 이름 공간을 지정합니다.


버전 3.5에서 변경: 선택적 `globals' 매개 변수가 추가되었습니다.



버전 3.7에서 변경: `repeat'의 기본값이 3에서 5로 변경되었습니다.

@end deffn

@geindex default_timer() (timeit 모듈)
@anchor{library/timeit timeit default_timer}@anchor{4868}
@deffn {함수} timeit.default_timer ()

기본 타이머, 항상 time.perf_counter() 이고, 초 단위의 float를 반환합니다. 대안인 time.perf_counter_ns 는 나노초 단위의 정수를 반환합니다.


버전 3.3에서 변경: 이제 @ref{c79,,time.perf_counter()}가 기본 타이머입니다.

@end deffn

@geindex Timer (timeit 클래스)
@anchor{library/timeit timeit Timer}@anchor{16cd}
@deffn {클래스} timeit.Timer (stmt='pass', setup='pass', timer=<timer function>, globals=None)

작은 코드 조각의 실행 속도를 측정하기 위한 클래스.

생성자는 시간 측정될 문장, 설정에 사용되는 추가 문장 및 타이머 함수를 받아들입니다. 두 문장의 기본값은 @code{'pass'}입니다; 타이머 함수는 플랫폼에 따라 다릅니다 (모듈 독스트링을 참조하십시오). `stmt'와 `setup'은 여러 줄에 걸친 문자열 리터럴을 포함하지 않는 한 @code{;}나 줄 바꿈으로 구분된 여러 개의 문장을 포함 할 수도 있습니다. 문장은 기본적으로 timeit의 이름 공간 내에서 실행됩니다; 이 동작은 `globals'에 이름 공간을 전달하여 제어 할 수 있습니다.

첫 번째 문장의 실행 시간을 측정하려면, @ref{ee7,,timeit()} 메서드를 사용하십시오. @ref{4867,,repeat()}와 @ref{ee8,,autorange()} 메서드는 @code{timeit()}을 여러 번 호출하는 편리 메서드입니다.

`setup'의 실행 시간은 전체 측정 실행 시간에서 제외됩니다.

`stmt'와 `setup' 매개 변수는 인자 없이 호출 할 수 있는 객체를 받아들일 수도 있습니다. 이렇게 하면 @ref{ee7,,timeit()}에 의해 실행될 타이머 함수에 그들에 대한 호출을 포함시킵니다. 이때는 여분의 함수 호출로 인해 타이밍 오버헤드가 약간 더 커집니다.


버전 3.5에서 변경: 선택적 `globals' 매개 변수가 추가되었습니다.


@geindex timeit() (timeit.Timer 메서드)
@anchor{library/timeit timeit Timer timeit}@anchor{ee7}
@deffn {메서드} timeit (number=1000000)

주 문장의 `number' 실행의 시간을 측정합니다. setup 문장을 한 번 실행한 다음, 주 문장을 여러 번 실행하는 데 걸리는 시간을 반환합니다. 기본 타이머는 초 단위의 float를 반환합니다. 인자는 루프를 통과하는 횟수이며, 기본값은 백만입니다. 주 문장, setup 문장 및 사용할 타이머 함수는 생성자에 전달됩니다.

@cartouche
@quotation 참고 
기본적으로, @ref{ee7,,timeit()}은 시간 측정 중에 @ref{17dd,,가비지 수거}를 일시적으로 끕니다. 이 방법의 장점은 독립적인 시간 측정이 더 잘 비교될 수 있다는 것입니다. 단점은 GC가 측정되는 함수의 성능에서 중요한 요소가 될 수 있다는 것입니다. 그렇다면, GC를 `setup' 문자열의 첫 번째 문장에서 다시 활성화할 수 있습니다. 예를 들면:

@example
timeit.Timer('for i in range(10): oct(i)', 'gc.enable()').timeit()
@end example
@end quotation
@end cartouche
@end deffn

@geindex autorange() (timeit.Timer 메서드)
@anchor{library/timeit timeit Timer autorange}@anchor{ee8}
@deffn {메서드} autorange (callback=None)

@ref{ee7,,timeit()}를 호출하는 횟수를 자동으로 결정합니다.

이 함수는 총 시간이 0.2초 이상이 될 때까지 @ref{ee7,,timeit()}을 반복적으로 호출하고, 최종 (루프 수, 해당 루프 수에 소요된 시간)을 반환하는 편리 함수입니다. 실행 시간이 적어도 0.2초가 될 때까지 1, 2, 5, 10, 20, 50 … 로 루프 수를 증가시키면서 @code{timeit()}을 호출합니다.

`callback'이 주어지고 @code{None}이 아니면, 각 시도 다음에 두 개의 인자로 호출합니다: @code{callback(number, time_taken)}.


Added in version 3.6.

@end deffn

@geindex repeat() (timeit.Timer 메서드)
@anchor{library/timeit timeit Timer repeat}@anchor{4867}
@deffn {메서드} repeat (repeat=5, number=1000000)

@ref{ee7,,timeit()}을 몇 번 호출합니다.

이것은 반복적으로 @ref{ee7,,timeit()}을 호출하여 결과 리스트를 반환하는 편리 함수입니다. 첫 번째 인자는 @code{timeit()}을 호출할 횟수를 지정합니다. 두 번째 인자는 @code{timeit()}에 대한 `number' 인자를 지정합니다.

@cartouche
@quotation 참고 
결과 벡터로부터 평균과 표준 편차를 계산하고 이를 보고하고 싶을 수 있습니다. 하지만, 이것은 별로 유용하지 않습니다. 일반적으로, 가장 낮은 값이 여러분의 기계가 주어진 코드 조각을 얼마나 빨리 실행할 수 있는지에 대한 하한값을 제공합니다; 결과 벡터의 더 높은 값은 일반적으로 파이썬의 속도 변동성 때문이 아니라, 시간 측정의 정확성을 방해하는 다른 프로세스에 의해 발생합니다. 따라서 결과의 @ref{110a,,min()}이 여러분이 관심을 기울여야 할 유일한 숫자일 것입니다. 그 후에, 전체 벡터를 살펴보고 통계보다는 상식을 적용해야 합니다.
@end quotation
@end cartouche


버전 3.7에서 변경: `repeat'의 기본값이 3에서 5로 변경되었습니다.

@end deffn

@geindex print_exc() (timeit.Timer 메서드)
@anchor{library/timeit timeit Timer print_exc}@anchor{4869}
@deffn {메서드} print_exc (file=None)

측정되는 코드로부터의 트레이스백을 인쇄하는 도우미.

일반적인 사용:

@example
t = Timer(...)       # try/except 바깥
try:
    t.timeit(...)    # 또는 t.repeat(...)
except Exception:
    t.print_exc()
@end example

표준 트레이스백에 비해 장점은 컴파일된 템플릿의 소스 행이 표시된다는 것입니다. 선택적 `file' 인자는 트레이스백을 보내야 할 곳을 지시합니다; 기본값은 @ref{b33,,sys.stderr}입니다.
@end deffn
@end deffn

@node 명령 줄 인터페이스<2>,예제<27>,파이썬 인터페이스,timeit — 작은 코드 조각의 실행 시간 측정
@anchor{library/timeit command-line-interface}@anchor{486a}@anchor{library/timeit timeit-command-line-interface}@anchor{4861}
@subsubsection 명령 줄 인터페이스


명령 줄에서 프로그램으로 호출할 때, 다음 형식이 사용됩니다:

@example
python -m timeit [-n N] [-r N] [-u U] [-s S] [-p] [-v] [-h] [statement ...]
@end example

이때 다음 옵션을 지원합니다:

@geindex timeit 명령줄 옵션; -n
@geindex timeit 명령줄 옵션; --number
@anchor{library/timeit cmdoption-timeit-n}@anchor{486b}@anchor{library/timeit cmdoption-timeit-number}@anchor{486c}
@deffn {Option} @w{-}n N, @w{-}@w{-}number=N

‘statement’를 실행하는 횟수
@end deffn

@geindex timeit 명령줄 옵션; -r
@geindex timeit 명령줄 옵션; --repeat
@anchor{library/timeit cmdoption-timeit-r}@anchor{486d}@anchor{library/timeit cmdoption-timeit-repeat}@anchor{486e}
@deffn {Option} @w{-}r N, @w{-}@w{-}repeat=N

타이머 반복 횟수 (기본값 5)
@end deffn

@geindex timeit 명령줄 옵션; -s
@geindex timeit 명령줄 옵션; --setup
@anchor{library/timeit cmdoption-timeit-s}@anchor{486f}@anchor{library/timeit cmdoption-timeit-setup}@anchor{4870}
@deffn {Option} @w{-}s S, @w{-}@w{-}setup=S

초기에 한 번 실행될 문장 (기본값 @code{pass})
@end deffn

@geindex timeit 명령줄 옵션; -p
@geindex timeit 명령줄 옵션; --process
@anchor{library/timeit cmdoption-timeit-p}@anchor{4871}@anchor{library/timeit cmdoption-timeit-process}@anchor{4872}
@deffn {Option} @w{-}p, @w{-}@w{-}process

벽시계 시간이 아니라 프로세스 시간을 측정합니다, 기본값인 @ref{c79,,time.perf_counter()} 대신 @ref{c7a,,time.process_time()}을 사용합니다


Added in version 3.3.

@end deffn

@geindex timeit 명령줄 옵션; -u
@geindex timeit 명령줄 옵션; --unit
@anchor{library/timeit cmdoption-timeit-u}@anchor{4873}@anchor{library/timeit cmdoption-timeit-unit}@anchor{4874}
@deffn {Option} @w{-}u, @w{-}@w{-}unit=U

타이머 출력의 시간 단위를 지정합니다; @code{nsec}, @code{usec}, @code{msec} 또는 @code{sec} 중에서 선택할 수 있습니다.


Added in version 3.5.

@end deffn

@geindex timeit 명령줄 옵션; -v
@geindex timeit 명령줄 옵션; --verbose
@anchor{library/timeit cmdoption-timeit-v}@anchor{4875}@anchor{library/timeit cmdoption-timeit-verbose}@anchor{4876}
@deffn {Option} @w{-}v, @w{-}@w{-}verbose

날 시간 측정 결과를 인쇄합니다; 더 많은 자릿수 정밀도를 위해서는 반복하십시오
@end deffn

@geindex timeit 명령줄 옵션; -h
@geindex timeit 명령줄 옵션; --help
@anchor{library/timeit cmdoption-timeit-h}@anchor{4877}@anchor{library/timeit cmdoption-timeit-help}@anchor{4878}
@deffn {Option} @w{-}h, @w{-}@w{-}help

짧은 사용법 메시지를 출력하고 종료합니다
@end deffn

여러 줄의 문장은 각 줄을 별도의 statement 인자로 지정하여 제공할 수 있습니다; 들여쓰기 된 줄은 인자를 따옴표로 묶고 선행 공백을 사용하면 됩니다. 여러 개의 @ref{486f,,-s} 옵션도 비슷하게 취급됩니다.

@ref{486b,,-n}이 주어지지 않으면, 총 시간이 최소 0.2초가 될 때까지 시퀀스 1, 2, 5, 10, 20, 50, … 에서 증가하는 숫자를 시도하여 적절한 루프 수가 계산됩니다.

@ref{4868,,default_timer()} 측정은 같은 기계에서 실행되는 다른 프로그램의 영향을 받을 수 있으므로, 정확한 시간 측정이 필요할 때 가장 좋은 방법은 시간 측정을 몇 번 반복하고 가장 좋은 시간을 사용하는 것입니다. 이 작업에는 @ref{486d,,-r} 옵션이 좋습니다; 대부분의 경우 기본값인 5번 반복으로 충분할 것입니다. @ref{c7a,,time.process_time()}을 사용하여 CPU 시간을 측정 할 수 있습니다.

@cartouche
@quotation 참고 
pass 문을 실행하는 것과 관련된 어떤 기준 오버헤드가 있습니다. 여기에 있는 코드는 그것을 숨기려고 시도하지는 않지만, 여러분은 신경 써야 합니다. 기준 오버헤드는 인자 없이 프로그램을 호출하여 측정 할 수 있으며, 파이썬 버전마다 다를 수 있습니다.
@end quotation
@end cartouche

@node 예제<27>,,명령 줄 인터페이스<2>,timeit — 작은 코드 조각의 실행 시간 측정
@anchor{library/timeit examples}@anchor{4879}@anchor{library/timeit timeit-examples}@anchor{4864}
@subsubsection 예제


처음에 한 번만 실행되는 setup 문을 제공 할 수 있습니다:

@example
$ python -m timeit -s "text = 'sample string'; char = 'g'" "char in text"
5000000 loops, best of 5: 0.0877 usec per loop
$ python -m timeit -s "text = 'sample string'; char = 'g'" "text.find(char)"
1000000 loops, best of 5: 0.342 usec per loop
@end example

In the output, there are three fields. The loop count, which tells you how many
times the statement body was run per timing loop repetition. The repetition
count (‘best of 5’) which tells you how many times the timing loop was
repeated, and finally the time the statement body took on average within the
best repetition of the timing loop. That is, the time the fastest repetition
took divided by the loop count.

@example
>>> import timeit
>>> timeit.timeit('char in text', setup='text = "sample string"; char = "g"')
0.41440500499993504
>>> timeit.timeit('text.find(char)', setup='text = "sample string"; char = "g"')
1.7246671520006203
@end example

@ref{16cd,,Timer} 클래스와 그 메서드를 사용하여 같은 작업을 수행 할 수 있습니다:

@example
>>> import timeit
>>> t = timeit.Timer('char in text', setup='text = "sample string"; char = "g"')
>>> t.timeit()
0.3955516149999312
>>> t.repeat()
[0.40183617287970225, 0.37027556854118704, 0.38344867356679524, 0.3712595970846668, 0.37866875250654886]
@end example

다음 예제는 여러 줄을 포함하는 표현식의 시간을 측정하는 방법을 보여줍니다. 여기서 우리는 누락되었거나 존재하는 객체 어트리뷰트를 검사하는데 @ref{6f8,,hasattr()}과 @ref{8f7,,try}/@ref{1ab,,except}를 사용하는 비용을 비교합니다:

@example
$ python -m timeit "try:" "  str.__bool__" "except AttributeError:" "  pass"
20000 loops, best of 5: 15.7 usec per loop
$ python -m timeit "if hasattr(str, '__bool__'): pass"
50000 loops, best of 5: 4.26 usec per loop

$ python -m timeit "try:" "  int.__bool__" "except AttributeError:" "  pass"
200000 loops, best of 5: 1.43 usec per loop
$ python -m timeit "if hasattr(int, '__bool__'): pass"
100000 loops, best of 5: 2.23 usec per loop
@end example

@example
>>> import timeit
>>> # 어트리뷰트가 없습니다
>>> 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
>>>
>>> # 어트리뷰트가 있습니다
>>> s = """\
... try:
...     int.__bool__
... except AttributeError:
...     pass
... """
>>> timeit.timeit(stmt=s, number=100000)
0.04215312199994514
>>> s = "if hasattr(int, '__bool__'): pass"
>>> timeit.timeit(stmt=s, number=100000)
0.08588060699912603
@end example

To give the @code{timeit} module access to functions you define, you can pass a
`setup' parameter which contains an import statement:

@example
def test():
    """멍청한 테스트 함수"""
    L = [i for i in range(100)]

if __name__ == '__main__':
    import timeit
    print(timeit.timeit("test()", setup="from __main__ import test"))
@end example

또 다른 옵션은 @ref{1c08,,globals()}를 `globals' 매개 변수로 전달해서, 여러분의 현재 전역 이름 공간에서 코드가 실행되도록 하는 것입니다. 임포트를 개별적으로 지정하는 것보다 편리 할 수 있습니다:

@example
def f(x):
    return x**2
def g(x):
    return x**4
def h(x):
    return x**8

import timeit
print(timeit.timeit('[func(42) for func in (f,g,h)]', globals=globals()))
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node trace — 파이썬 문장 실행 추적,tracemalloc — 메모리 할당 추적,timeit — 작은 코드 조각의 실행 시간 측정,디버깅과 프로파일링
@anchor{library/trace doc}@anchor{487a}@anchor{library/trace module-trace}@anchor{103}@anchor{library/trace trace-trace-or-track-python-statement-execution}@anchor{487b}@anchor{library/trace translation-repo}@anchor{487c}
@subsection @code{trace} — 파이썬 문장 실행 추적


@geindex module; trace

`소스 코드:' Lib/trace.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/trace.py}


__________________________________________________________________


The @code{trace} module allows you to trace program execution, generate
annotated statement coverage listings, print caller/callee relationships and
list functions executed during a program run.  It can be used in another program
or from the command line.


@subsubheading 더 보기



@table @asis

@item Coverage.py@footnote{https://coverage.readthedocs.io/}

브랜치 커버리지와 같은 고급 기능과 함께 HTML 출력을 제공하는 널리 사용되는 제삼자 커버리지 도구.
@end table


@menu
* 명령 줄 사용법:: 
* 프로그래밍 인터페이스:: 

@end menu

@node 명령 줄 사용법,프로그래밍 인터페이스,,trace — 파이썬 문장 실행 추적
@anchor{library/trace command-line-usage}@anchor{487d}@anchor{library/trace trace-cli}@anchor{487e}
@subsubsection 명령 줄 사용법


The @code{trace} module can be invoked from the command line.  It can be as
simple as

@example
python -m trace --count -C . somefile.py ...
@end example

이것은 @code{somefile.py}를 실행하고 실행 중에 임포트 한 모든 파이썬 모듈들의 주석이 달린 리스트를 현재 디렉터리에 생성합니다.

@geindex trace 명령줄 옵션; --help
@anchor{library/trace cmdoption-trace-help}@anchor{487f}
@deffn {Option} @w{-}@w{-}help

사용법을 표시하고 종료합니다.
@end deffn

@geindex trace 명령줄 옵션; --version
@anchor{library/trace cmdoption-trace-version}@anchor{4880}
@deffn {Option} @w{-}@w{-}version

모듈의 버전을 표시하고 종료합니다.
@end deffn


Added in version 3.8: Added @code{--module} option that allows running an executable module.


@menu
* 주요 옵션:: 
* 수정자:: 
* 필터:: 

@end menu

@node 주요 옵션,수정자,,명령 줄 사용법
@anchor{library/trace main-options}@anchor{4881}
@subsubsection 주요 옵션


At least one of the following options must be specified when invoking
@code{trace}.  The @ref{4882,,--listfuncs} option is mutually exclusive with
the @ref{4883,,--trace} and @ref{4884,,--count} options. When
@code{--listfuncs} is provided, neither @code{--count} nor
@code{--trace} are accepted, and vice versa.

@geindex trace 명령줄 옵션; -c
@geindex trace 명령줄 옵션; --count
@anchor{library/trace cmdoption-trace-c}@anchor{4884}@anchor{library/trace cmdoption-trace-count}@anchor{4885}
@deffn {Option} @w{-}c, @w{-}@w{-}count

프로그램 완료 시 각 문장이 실행된 횟수를 보여주는 주석이 달린 리스팅 파일 집합을 생성합니다. 아래의 @ref{4886,,--coverdir}, @ref{4887,,--file} 및 @ref{4888,,--no-report}도 참조하십시오.
@end deffn

@geindex trace 명령줄 옵션; -t
@geindex trace 명령줄 옵션; --trace
@anchor{library/trace cmdoption-trace-t}@anchor{4883}@anchor{library/trace cmdoption-trace-trace}@anchor{4889}
@deffn {Option} @w{-}t, @w{-}@w{-}trace

줄이 실행될 때마다 표시합니다.
@end deffn

@geindex trace 명령줄 옵션; -l
@geindex trace 명령줄 옵션; --listfuncs
@anchor{library/trace cmdoption-trace-l}@anchor{4882}@anchor{library/trace cmdoption-trace-listfuncs}@anchor{488a}
@deffn {Option} @w{-}l, @w{-}@w{-}listfuncs

프로그램을 실행하여 실행되는 함수들을 표시합니다.
@end deffn

@geindex trace 명령줄 옵션; -r
@geindex trace 명령줄 옵션; --report
@anchor{library/trace cmdoption-trace-r}@anchor{488b}@anchor{library/trace cmdoption-trace-report}@anchor{488c}
@deffn {Option} @w{-}r, @w{-}@w{-}report

@ref{4884,,--count} 와 @ref{4887,,--file} 옵션을 사용한 이전 프로그램 실행에서 주석이 달린 목록을 생성합니다. 이것은 어떤 코드도 실행하지 않습니다.
@end deffn

@geindex trace 명령줄 옵션; -T
@geindex trace 명령줄 옵션; --trackcalls
@anchor{library/trace cmdoption-trace-T}@anchor{488d}@anchor{library/trace cmdoption-trace-trackcalls}@anchor{488e}
@deffn {Option} @w{-}T, @w{-}@w{-}trackcalls

프로그램을 실행하여 노출된 호출 관계를 표시합니다.
@end deffn

@node 수정자,필터,주요 옵션,명령 줄 사용법
@anchor{library/trace modifiers}@anchor{488f}
@subsubsection 수정자


@geindex trace 명령줄 옵션; -f
@geindex trace 명령줄 옵션; --file
@anchor{library/trace cmdoption-trace-f}@anchor{4887}@anchor{library/trace cmdoption-trace-file}@anchor{4890}
@deffn {Option} @w{-}f, @w{-}@w{-}file=<file>

여러 추적 실행에서 실행 횟수를 누적할 파일의 이름. @ref{4884,,--count} 옵션과 함께 사용해야 합니다.
@end deffn

@geindex trace 명령줄 옵션; -C
@geindex trace 명령줄 옵션; --coverdir
@anchor{library/trace cmdoption-trace-C}@anchor{4886}@anchor{library/trace cmdoption-trace-coverdir}@anchor{4891}
@deffn {Option} @w{-}C, @w{-}@w{-}coverdir=<dir>

보고서 파일이 저장되는 디렉터리. @code{package.module}에 대한 커버리지 보고서는 @code{`dir'/`package'/`module'.cover} 파일에 기록됩니다.
@end deffn

@geindex trace 명령줄 옵션; -m
@geindex trace 명령줄 옵션; --missing
@anchor{library/trace cmdoption-trace-m}@anchor{4892}@anchor{library/trace cmdoption-trace-missing}@anchor{4893}
@deffn {Option} @w{-}m, @w{-}@w{-}missing

주석이 달린 리스팅을 작성할 때, @code{>>>>>>}로 실행되지 않은 줄을 표시합니다.
@end deffn

@geindex trace 명령줄 옵션; -s
@geindex trace 명령줄 옵션; --summary
@anchor{library/trace cmdoption-trace-s}@anchor{4894}@anchor{library/trace cmdoption-trace-summary}@anchor{4895}
@deffn {Option} @w{-}s, @w{-}@w{-}summary

@ref{4884,,--count} 나 @ref{488b,,--report}를 사용할 때, 처리된 각 파일에 대한 요약을 표준출력으로 기록합니다.
@end deffn

@geindex trace 명령줄 옵션; -R
@geindex trace 명령줄 옵션; --no-report
@anchor{library/trace cmdoption-trace-R}@anchor{4888}@anchor{library/trace cmdoption-trace-no-report}@anchor{4896}
@deffn {Option} @w{-}R, @w{-}@w{-}no@w{-}report

주석이 달린 리스팅을 생성하지 않습니다. 이것은 @ref{4884,,--count}를 사용하여 여러 번 실행한 다음, 마지막에 주석이 달린 리스팅의 단일 집합을 생성하려고 할 때 유용합니다.
@end deffn

@geindex trace 명령줄 옵션; -g
@geindex trace 명령줄 옵션; --timing
@anchor{library/trace cmdoption-trace-g}@anchor{4897}@anchor{library/trace cmdoption-trace-timing}@anchor{4898}
@deffn {Option} @w{-}g, @w{-}@w{-}timing

프로그램이 시작된 이후의 시간을 각 줄 앞에 붙입니다. 추적하는 동안에만 사용됩니다.
@end deffn

@node 필터,,수정자,명령 줄 사용법
@anchor{library/trace filters}@anchor{4899}
@subsubsection 필터


이 옵션들은 여러 번 반복 될 수 있습니다.

@geindex trace 명령줄 옵션; --ignore-module
@anchor{library/trace cmdoption-trace-ignore-module}@anchor{489a}
@deffn {Option} @w{-}@w{-}ignore@w{-}module=<mod>

주어진 각 모듈 이름과 (패키지라면) 그 서브 모듈을 무시합니다. 인자는 쉼표로 구분된 이름 목록일 수 있습니다.
@end deffn

@geindex trace 명령줄 옵션; --ignore-dir
@anchor{library/trace cmdoption-trace-ignore-dir}@anchor{489b}
@deffn {Option} @w{-}@w{-}ignore@w{-}dir=<dir>

명명된 디렉터리와 하위 디렉터리의 모든 모듈과 패키지를 무시합니다. 인자는 @ref{2131,,os.pathsep}으로 구분된 디렉터리 목록일 수 있습니다.
@end deffn

@node 프로그래밍 인터페이스,,명령 줄 사용법,trace — 파이썬 문장 실행 추적
@anchor{library/trace programmatic-interface}@anchor{489c}@anchor{library/trace trace-api}@anchor{489d}
@subsubsection 프로그래밍 인터페이스


@geindex Trace (trace 클래스)
@anchor{library/trace trace Trace}@anchor{489e}
@deffn {클래스} trace.Trace (count=1, trace=1, countfuncs=0, countcallers=0, ignoremods=(), ignoredirs=(), infile=None, outfile=None, timing=False)

단일 문장이나 표현식의 실행을 추적할 객체를 만듭니다. 모든 매개 변수는 선택 사항입니다. `count'는 줄 번호의 카운팅을 활성화합니다. `trace'는 줄 실행 추적을 활성화합니다. `countfuncs'는 실행 중에 호출된 함수들의 리스팅을 활성화합니다. `countcallers'는 호출 관계 추적을 활성화합니다. `ignoremods'는 무시할 모듈이나 패키지의 리스트입니다. `ignoredirs'는 들어있는 모듈이나 패키지를 무시해야 하는 디렉터리의 리스트입니다. `infile'은 저장된 카운트 정보를 읽을 파일 이름입니다. `outfile'는 갱신된 카운트 정보를 쓰는 파일의 이름입니다. `timing'는 추적이 시작될 때에 상대적인 타임스탬프 표시를 활성화합니다.

@geindex run() (trace.Trace 메서드)
@anchor{library/trace trace Trace run}@anchor{489f}
@deffn {메서드} run (cmd)

명령을 실행하고 현재 추적 매개 변수를 사용하여 실행에서 통계를 수집합니다. `cmd'는 @ref{4a3,,exec()}로 전달하는데 적합한 문자열이나 코드 객체여야 합니다.
@end deffn

@geindex runctx() (trace.Trace 메서드)
@anchor{library/trace trace Trace runctx}@anchor{48a0}
@deffn {메서드} runctx (cmd, globals=None, locals=None)

정의된 전역과 지역 환경에서, 명령을 실행하고 현재 추적 매개 변수를 사용하여 실행에서 통계를 수집합니다. 정의되지 않으면, `globals' 와 `locals'의 기본값은 빈 딕셔너리입니다.
@end deffn

@geindex runfunc() (trace.Trace 메서드)
@anchor{library/trace trace Trace runfunc}@anchor{c71}
@deffn {메서드} runfunc (func, /, *args, **kwds)

현재 추적 매개 변수를 갖는 @ref{489e,,Trace} 객체의 제어하에 주어진 인자로 `func'를 호출합니다.
@end deffn

@geindex results() (trace.Trace 메서드)
@anchor{library/trace trace Trace results}@anchor{48a1}
@deffn {메서드} results ()

주어진 @ref{489e,,Trace} 인스턴스에 대한 모든 이전 @code{run}, @code{runctx} 및 @code{runfunc} 호출의 누적 결과를 포함하는 @ref{48a2,,CoverageResults} 객체를 반환합니다. 누적된 추적 결과를 재설정하지 않습니다.
@end deffn
@end deffn

@geindex CoverageResults (trace 클래스)
@anchor{library/trace trace CoverageResults}@anchor{48a2}
@deffn {클래스} trace.CoverageResults

@ref{48a1,,Trace.results()}에 의해 만들어진 커버리지 결과를 위한 컨테이너. 사용자가 직접 만들어서는 안 됩니다.

@geindex update() (trace.CoverageResults 메서드)
@anchor{library/trace trace CoverageResults update}@anchor{48a3}
@deffn {메서드} update (other)

다른 @ref{48a2,,CoverageResults} 객체의 데이터를 병합합니다.
@end deffn

@geindex write_results() (trace.CoverageResults 메서드)
@anchor{library/trace trace CoverageResults write_results}@anchor{48a4}
@deffn {메서드} write_results (show_missing=True, summary=False, coverdir=None, *, ignore_missing_files=False)

커버리지 결과를 기록합니다. 실행 카운트가 없는 줄을 표시하려면 `show_missing'을 설정하십시오. 모듈당 커버리지 요약을 출력에 포함 시키려면 `summary'를 설정하십시오. `coverdir'은 커버리지 결과 파일이 출력될 디렉터리를 지정합니다. @code{None}이면, 각 소스 파일의 결과가 해당 디렉터리에 위치합니다.

If `ignore_missing_files' is @code{True}, coverage counts for files that no
longer exist are silently ignored. Otherwise, a missing file will
raise a @ref{264,,FileNotFoundError}.


버전 3.13에서 변경: Added `ignore_missing_files' parameter.

@end deffn
@end deffn

프로그래밍 인터페이스의 사용을 보여주는 간단한 예제:

@example
import sys
import trace

# Trace 객체를 만들고, 무시할 대상과, 추적할지, 줄을 셀지 또는 둘 다 수행할지를 지정합니다.
tracer = trace.Trace(
    ignoredirs=[sys.prefix, sys.exec_prefix],
    trace=0,
    count=1)

# 주어진 tracer를 사용해서 새 명령을 실행합니다
tracer.run('main()')

# 보고서를 만들어, 현재 디렉터리에 출력을 넣습니다
r = tracer.results()
r.write_results(show_missing=True, coverdir=".")
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node tracemalloc — 메모리 할당 추적,,trace — 파이썬 문장 실행 추적,디버깅과 프로파일링
@anchor{library/tracemalloc doc}@anchor{48a5}@anchor{library/tracemalloc module-tracemalloc}@anchor{105}@anchor{library/tracemalloc tracemalloc-trace-memory-allocations}@anchor{48a6}@anchor{library/tracemalloc translation-repo}@anchor{48a7}
@subsection @code{tracemalloc} — 메모리 할당 추적


@geindex module; tracemalloc


Added in version 3.4.


`소스 코드:' Lib/tracemalloc.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/tracemalloc.py}


__________________________________________________________________


tracemalloc 모듈은 파이썬이 할당한 메모리 블록을 추적하는 디버그 도구입니다. 다음 정보를 제공합니다:


@itemize *

@item 
객체가 할당된 곳의 트레이스백

@item 
파일명과 줄 번호별로 할당된 메모리 블록에 대한 통계: 할당된 메모리 블록의 총 크기, 수 및 평균 크기

@item 
메모리 누수를 탐지하기 위해 두 스냅샷의 차이점 계산
@end itemize

파이썬이 할당한 대부분의 메모리 블록을 추적하려면, 
@geindex PYTHONTRACEMALLOC
@geindex 환경 변수; PYTHONTRACEMALLOC
@ref{212a,,PYTHONTRACEMALLOC} 환경 변수를 @code{1}로 설정하거나, @ref{16f,,-X} @code{tracemalloc} 명령 줄 옵션을 사용하여 모듈을 가능한 한 빨리 시작해야 합니다. @ref{2129,,tracemalloc.start()} 함수는 실행 시간에 호출되어 파이썬 메모리 할당 추적을 시작할 수 있습니다.

기본적으로, 할당된 메모리 블록의 트레이스는 가장 최근의 프레임 만 저장합니다 (1프레임). 시작 시 25프레임을 저장하려면: 
@geindex PYTHONTRACEMALLOC
@geindex 환경 변수; PYTHONTRACEMALLOC
@ref{212a,,PYTHONTRACEMALLOC} 환경 변수를 @code{25}로 설정하거나, @ref{16f,,-X} @code{tracemalloc=25} 명령 줄 옵션을 사용하십시오.

@menu
* 예: 예<15>. 
* API:: 

@end menu

@node 예<15>,API,,tracemalloc — 메모리 할당 추적
@anchor{library/tracemalloc examples}@anchor{48a8}
@subsubsection 예


@menu
* 상위 10개 표시:: 
* 차이 계산:: 
* 메모리 블록의 트레이스백 얻기:: 
* 예쁜 탑(top): 예쁜 탑 top. 

@end menu

@node 상위 10개 표시,차이 계산,,예<15>
@anchor{library/tracemalloc display-the-top-10}@anchor{48a9}
@subsubsection 상위 10개 표시


가장 많은 메모리를 할당하는 10개의 파일을 표시합니다:

@example
import tracemalloc

tracemalloc.start()

# ... 여러분의 응용 프로그램을 실행합니다 ...

snapshot = tracemalloc.take_snapshot()
top_stats = snapshot.statistics('lineno')

print("[ Top 10 ]")
for stat in top_stats[:10]:
    print(stat)
@end example

파이썬 테스트 스위트의 출력 예:

@example
[ Top 10 ]
<frozen importlib._bootstrap>:716: size=4855 KiB, count=39328, average=126 B
<frozen importlib._bootstrap>:284: size=521 KiB, count=3199, average=167 B
/usr/lib/python3.4/collections/__init__.py:368: size=244 KiB, count=2315, average=108 B
/usr/lib/python3.4/unittest/case.py:381: size=185 KiB, count=779, average=243 B
/usr/lib/python3.4/unittest/case.py:402: size=154 KiB, count=378, average=416 B
/usr/lib/python3.4/abc.py:133: size=88.7 KiB, count=347, average=262 B
<frozen importlib._bootstrap>:1446: size=70.4 KiB, count=911, average=79 B
<frozen importlib._bootstrap>:1454: size=52.0 KiB, count=25, average=2131 B
<string>:5: size=49.7 KiB, count=148, average=344 B
/usr/lib/python3.4/sysconfig.py:411: size=48.0 KiB, count=1, average=48.0 KiB
@end example

파이썬이 모듈에서 @code{4855 KiB} 데이터 (바이트 코드와 상수)를 로드했으며 @ref{1e,,collections} 모듈이 @ref{4e0,,namedtuple} 형을 빌드하기 위해 @code{244 KiB}를 할당했음을 알 수 있습니다.

추가 옵션은 @ref{48aa,,Snapshot.statistics()}를 참조하십시오.

@node 차이 계산,메모리 블록의 트레이스백 얻기,상위 10개 표시,예<15>
@anchor{library/tracemalloc compute-differences}@anchor{48ab}
@subsubsection 차이 계산


두 개의 스냅샷을 취하고 차이점을 표시합니다:

@example
import tracemalloc
tracemalloc.start()
# ... 여러분의 응용 프로그램을 시작합니다  ...

snapshot1 = tracemalloc.take_snapshot()
# ... 메모리 누수를 일으키는 함수를 호출합니다 ...
snapshot2 = tracemalloc.take_snapshot()

top_stats = snapshot2.compare_to(snapshot1, 'lineno')

print("[ Top 10 differences ]")
for stat in top_stats[:10]:
    print(stat)
@end example

파이썬 테스트 스위트의 일부 테스트를 실행하기 전/후의 출력 예:

@example
[ Top 10 differences ]
<frozen importlib._bootstrap>:716: size=8173 KiB (+4428 KiB), count=71332 (+39369), average=117 B
/usr/lib/python3.4/linecache.py:127: size=940 KiB (+940 KiB), count=8106 (+8106), average=119 B
/usr/lib/python3.4/unittest/case.py:571: size=298 KiB (+298 KiB), count=589 (+589), average=519 B
<frozen importlib._bootstrap>:284: size=1005 KiB (+166 KiB), count=7423 (+1526), average=139 B
/usr/lib/python3.4/mimetypes.py:217: size=112 KiB (+112 KiB), count=1334 (+1334), average=86 B
/usr/lib/python3.4/http/server.py:848: size=96.0 KiB (+96.0 KiB), count=1 (+1), average=96.0 KiB
/usr/lib/python3.4/inspect.py:1465: size=83.5 KiB (+83.5 KiB), count=109 (+109), average=784 B
/usr/lib/python3.4/unittest/mock.py:491: size=77.7 KiB (+77.7 KiB), count=143 (+143), average=557 B
/usr/lib/python3.4/urllib/parse.py:476: size=71.8 KiB (+71.8 KiB), count=969 (+969), average=76 B
/usr/lib/python3.4/contextlib.py:38: size=67.2 KiB (+67.2 KiB), count=126 (+126), average=546 B
@end example

우리는 파이썬이 @code{8173 KiB}의 모듈 데이터(바이트 코드와 상수)를 로드했으며, 이전 스냅샷을 취할 때인 테스트 전에 로드된 것보다 @code{4428 KiB} 더 많은 것을 볼 수 있습니다. 마찬가지로, @ref{89,,linecache} 모듈은 트레이스백을 포맷하기 위해 @code{940 KiB}의 파이썬 소스 코드를 캐시 했는데, 이전 스냅샷 이후의 모든 것입니다.

시스템에 사용 가능한 메모리가 거의 없으면, 스냅샷을 오프라인으로 분석하기 위해 @ref{48ac,,Snapshot.dump()} 메서드로 디스크에 스냅샷을 기록할 수 있습니다. 그런 다음 @ref{48ad,,Snapshot.load()} 메서드를 사용하여 스냅샷을 다시 로드하십시오.

@node 메모리 블록의 트레이스백 얻기,예쁜 탑 top,차이 계산,예<15>
@anchor{library/tracemalloc get-the-traceback-of-a-memory-block}@anchor{48ae}
@subsubsection 메모리 블록의 트레이스백 얻기


가장 큰 메모리 블록의 트레이스백을 표시하는 코드:

@example
import tracemalloc

# 25프레임을 저장합니다
tracemalloc.start(25)

# ... 여러분의 응용 프로그램을 실행합니다 ...

snapshot = tracemalloc.take_snapshot()
top_stats = snapshot.statistics('traceback')

# 가장 큰 메모리 블록을 꺼냅니다
stat = top_stats[0]
print("%s memory blocks: %.1f KiB" % (stat.count, stat.size / 1024))
for line in stat.traceback.format():
    print(line)
@end example

파이썬 테스트 스위트의 출력 예 (트레이스백은 25프레임으로 제한되었습니다):

@example
903 memory blocks: 870.1 KiB
  File "<frozen importlib._bootstrap>", line 716
  File "<frozen importlib._bootstrap>", line 1036
  File "<frozen importlib._bootstrap>", line 934
  File "<frozen importlib._bootstrap>", line 1068
  File "<frozen importlib._bootstrap>", line 619
  File "<frozen importlib._bootstrap>", line 1581
  File "<frozen importlib._bootstrap>", line 1614
  File "/usr/lib/python3.4/doctest.py", line 101
    import pdb
  File "<frozen importlib._bootstrap>", line 284
  File "<frozen importlib._bootstrap>", line 938
  File "<frozen importlib._bootstrap>", line 1068
  File "<frozen importlib._bootstrap>", line 619
  File "<frozen importlib._bootstrap>", line 1581
  File "<frozen importlib._bootstrap>", line 1614
  File "/usr/lib/python3.4/test/support/__init__.py", line 1728
    import doctest
  File "/usr/lib/python3.4/test/test_pickletools.py", line 21
    support.run_doctest(pickletools)
  File "/usr/lib/python3.4/test/regrtest.py", line 1276
    test_runner()
  File "/usr/lib/python3.4/test/regrtest.py", line 976
    display_failure=not verbose)
  File "/usr/lib/python3.4/test/regrtest.py", line 761
    match_tests=ns.match_tests)
  File "/usr/lib/python3.4/test/regrtest.py", line 1563
    main()
  File "/usr/lib/python3.4/test/__main__.py", line 3
    regrtest.main_in_temp_cwd()
  File "/usr/lib/python3.4/runpy.py", line 73
    exec(code, run_globals)
  File "/usr/lib/python3.4/runpy.py", line 160
    "__main__", fname, loader, pkg_name)
@end example

대부분의 메모리가 모듈에서 데이터(바이트 코드와 상수)를 로드하기 위해 @ref{7b,,importlib} 모듈에 할당되었음을 알 수 있습니다: @code{870.1 KiB}. 트레이스백은 @code{importlib}가 가장 최근에 데이터를 로드한 위치입니다: @ref{3e,,doctest} 모듈의 @code{import pdb} 줄. 새 모듈이 로드되면 트레이스백이 변경될 수 있습니다.

@node 예쁜 탑 top,,메모리 블록의 트레이스백 얻기,예<15>
@anchor{library/tracemalloc pretty-top}@anchor{48af}
@subsubsection 예쁜 탑(top)


@code{<frozen importlib._bootstrap>}과 @code{<unknown>} 파일을 무시하고, 예쁜 출력으로 가장 많은 메모리를 할당하는 10개의 줄을 표시하는 코드:

@example
import linecache
import os
import tracemalloc

def display_top(snapshot, key_type='lineno', limit=10):
    snapshot = snapshot.filter_traces((
        tracemalloc.Filter(False, "<frozen importlib._bootstrap>"),
        tracemalloc.Filter(False, "<unknown>"),
    ))
    top_stats = snapshot.statistics(key_type)

    print("Top %s lines" % limit)
    for index, stat in enumerate(top_stats[:limit], 1):
        frame = stat.traceback[0]
        print("#%s: %s:%s: %.1f KiB"
              % (index, frame.filename, frame.lineno, stat.size / 1024))
        line = linecache.getline(frame.filename, frame.lineno).strip()
        if line:
            print('    %s' % line)

    other = top_stats[limit:]
    if other:
        size = sum(stat.size for stat in other)
        print("%s other: %.1f KiB" % (len(other), size / 1024))
    total = sum(stat.size for stat in top_stats)
    print("Total allocated size: %.1f KiB" % (total / 1024))

tracemalloc.start()

# ... 여러분의 응용 프로그램을 실행합니다 ...

snapshot = tracemalloc.take_snapshot()
display_top(snapshot)
@end example

파이썬 테스트 스위트의 출력 예:

@example
Top 10 lines
#1: Lib/base64.py:414: 419.8 KiB
    _b85chars2 = [(a + b) for a in _b85chars for b in _b85chars]
#2: Lib/base64.py:306: 419.8 KiB
    _a85chars2 = [(a + b) for a in _a85chars for b in _a85chars]
#3: collections/__init__.py:368: 293.6 KiB
    exec(class_definition, namespace)
#4: Lib/abc.py:133: 115.2 KiB
    cls = super().__new__(mcls, name, bases, namespace)
#5: unittest/case.py:574: 103.1 KiB
    testMethod()
#6: Lib/linecache.py:127: 95.4 KiB
    lines = fp.readlines()
#7: urllib/parse.py:476: 71.8 KiB
    for a in _hexdig for b in _hexdig@}
#8: <string>:5: 62.0 KiB
#9: Lib/_weakrefset.py:37: 60.0 KiB
    self.data = set()
#10: Lib/base64.py:142: 59.8 KiB
    _b32tab2 = [a + b for a in _b32tab for b in _b32tab]
6220 other: 3602.8 KiB
Total allocated size: 5303.1 KiB
@end example

추가 옵션은 @ref{48aa,,Snapshot.statistics()}를 참조하십시오.

@menu
* 모든 추적한 메모리 블록의 현재 및 최대 크기를 기록:: 

@end menu

@node 모든 추적한 메모리 블록의 현재 및 최대 크기를 기록,,,예쁜 탑 top
@anchor{library/tracemalloc record-the-current-and-peak-size-of-all-traced-memory-blocks}@anchor{48b0}
@subsubsection 모든 추적한 메모리 블록의 현재 및 최대 크기를 기록


다음 코드는 @code{0 + 1 + 2 + ...}와 같은 두 개의 합계를 비효율적으로 계산하는데, 이 숫자들의 리스트를 만듭니다. 이 리스트는 일시적으로 많은 메모리를 소비합니다. @ref{48b1,,get_traced_memory()}와 @ref{b35,,reset_peak()}를 사용하여 계산 중 최대 메모리 사용량뿐만 아니라 합이 계산된 후의 작은 메모리 사용량도 관찰할 수 있습니다:

@example
import tracemalloc

tracemalloc.start()

# 예제 코드: 커다란 임시 리스트로 합계를 계산합니다
large_sum = sum(list(range(100000)))

first_size, first_peak = tracemalloc.get_traced_memory()

tracemalloc.reset_peak()

# 예제 코드: 작은 임시 리스트로 합계를 계산합니다
small_sum = sum(list(range(1000)))

second_size, second_peak = tracemalloc.get_traced_memory()

print(f"@{first_size=@}, @{first_peak=@}")
print(f"@{second_size=@}, @{second_peak=@}")
@end example

출력:

@example
first_size=664, first_peak=3592984
second_size=804, second_peak=29704
@end example

@ref{b35,,reset_peak()}를 사용하면 @code{small_sum}을 계산하는 동안의 최대 사용량을 @ref{2129,,start()} 호출 이후 메모리 블록의 전체 최대 크기보다 훨씬 작더라도 정확하게 기록 할 수 있습니다. @code{reset_peak()}를 호출하지 않으면, @code{second_peak}는 여전히 @code{large_sum} 계산의 최대가 됩니다 (즉, @code{first_peak}와 같습니다). 이 경우, 두 최댓값은 모두 최종 메모리 사용량보다 훨씬 높아서, 최적화할 수 있음을 제안합니다 (@ref{24d,,list}에 대한 불필요한 호출을 제거하고, @code{sum(range(...))}이라고 작성하여).

@node API,,예<15>,tracemalloc — 메모리 할당 추적
@anchor{library/tracemalloc api}@anchor{48b2}
@subsubsection API


@menu
* 함수: 함수<10>. 
* DomainFilter:: 
* Filter:: 
* Frame:: 
* Snapshot:: 
* Statistic:: 
* StatisticDiff:: 
* Trace:: 
* Traceback:: 

@end menu

@node 함수<10>,DomainFilter,,API
@anchor{library/tracemalloc functions}@anchor{48b3}
@subsubsection 함수


@geindex clear_traces() (tracemalloc 모듈)
@anchor{library/tracemalloc tracemalloc clear_traces}@anchor{48b4}
@deffn {함수} tracemalloc.clear_traces ()

파이썬이 할당한 메모리 블록의 트레이스를 지웁니다.

@ref{18ae,,stop()}도 참조하십시오.
@end deffn

@geindex get_object_traceback() (tracemalloc 모듈)
@anchor{library/tracemalloc tracemalloc get_object_traceback}@anchor{1f35}
@deffn {함수} tracemalloc.get_object_traceback (obj)

Get the traceback where the Python object `obj' was allocated.
Return a @ref{d8e,,Traceback} instance, or @code{None} if the @code{tracemalloc}
module is not tracing memory allocations or did not trace the allocation of
the object.

@ref{a05,,gc.get_referrers()}와 @ref{1ad9,,sys.getsizeof()} 함수도 참조하십시오.
@end deffn

@geindex get_traceback_limit() (tracemalloc 모듈)
@anchor{library/tracemalloc tracemalloc get_traceback_limit}@anchor{48b5}
@deffn {함수} tracemalloc.get_traceback_limit ()

트레이스의 트레이스백에 저장된 최대 프레임 수를 가져옵니다.

The @code{tracemalloc} module must be tracing memory allocations to
get the limit, otherwise an exception is raised.

한계는 @ref{2129,,start()} 함수에 의해 설정됩니다.
@end deffn

@geindex get_traced_memory() (tracemalloc 모듈)
@anchor{library/tracemalloc tracemalloc get_traced_memory}@anchor{48b1}
@deffn {함수} tracemalloc.get_traced_memory ()

Get the current size and peak size of memory blocks traced by the
@code{tracemalloc} module as a tuple: @code{(current: int, peak: int)}.
@end deffn

@geindex reset_peak() (tracemalloc 모듈)
@anchor{library/tracemalloc tracemalloc reset_peak}@anchor{b35}
@deffn {함수} tracemalloc.reset_peak ()

Set the peak size of memory blocks traced by the @code{tracemalloc} module
to the current size.

Do nothing if the @code{tracemalloc} module is not tracing memory
allocations.

이 함수는 기록된 최대 크기만 수정하며, @ref{48b4,,clear_traces()}와 달리 어떤 추적도 수정하거나 지우지 않습니다. @ref{b35,,reset_peak()}를 호출하기 전에 @ref{48b6,,take_snapshot()}로 찍은 스냅숏은 호출 후 찍은 스냅숏과 의미 있게 비교할 수 있습니다.

@ref{48b1,,get_traced_memory()}도 참조하십시오.


Added in version 3.9.

@end deffn

@geindex get_tracemalloc_memory() (tracemalloc 모듈)
@anchor{library/tracemalloc tracemalloc get_tracemalloc_memory}@anchor{48b7}
@deffn {함수} tracemalloc.get_tracemalloc_memory ()

Get the memory usage in bytes of the @code{tracemalloc} module used to store
traces of memory blocks.
Return an @ref{19b,,int}.
@end deffn

@geindex is_tracing() (tracemalloc 모듈)
@anchor{library/tracemalloc tracemalloc is_tracing}@anchor{48b8}
@deffn {함수} tracemalloc.is_tracing ()

@code{True} if the @code{tracemalloc} module is tracing Python memory
allocations, @code{False} otherwise.

@ref{2129,,start()}와 @ref{18ae,,stop()} 함수도 참조하십시오.
@end deffn

@geindex start() (tracemalloc 모듈)
@anchor{library/tracemalloc tracemalloc start}@anchor{2129}
@deffn {함수} tracemalloc.start (nframe: int = 1)

파이썬 메모리 할당 추적을 시작합니다: 파이썬 메모리 할당자(allocator)에 훅을 설치합니다. 수집된 트레이스의 트레이스백은 `nframe' 개의 프레임으로 제한됩니다. 기본적으로, 메모리 블록의 트레이스는 가장 최근의 프레임 만 저장합니다: 제한은 @code{1}입니다. `nframe'은 @code{1}보다 크거나 같아야 합니다.

@ref{48b9,,Traceback.total_nframe} 어트리뷰트를 보면 트레이스백을 구성한 원래의 총 프레임 수를 계속 읽을 수 있습니다.

@code{1}개보다 더 많은 프레임을 저장하는 것은 @code{'traceback'}으로 그룹화된 통계를 계산하거나 누적 통계를 계산할 때만 유용합니다: @ref{48ba,,Snapshot.compare_to()}와 @ref{48aa,,Snapshot.statistics()} 메서드를 참조하십시오.

Storing more frames increases the memory and CPU overhead of the
@code{tracemalloc} module. Use the @ref{48b7,,get_tracemalloc_memory()} function
to measure how much memory is used by the @code{tracemalloc} module.

@geindex PYTHONTRACEMALLOC
@geindex 환경 변수; PYTHONTRACEMALLOC
@ref{212a,,PYTHONTRACEMALLOC} 환경 변수(@code{PYTHONTRACEMALLOC=NFRAME})와 @ref{16f,,-X} @code{tracemalloc=NFRAME} 명령 줄 옵션을 사용하여 시작 시 추적을 시작할 수 있습니다.

@ref{18ae,,stop()}, @ref{48b8,,is_tracing()} 및 @ref{48b5,,get_traceback_limit()} 함수도 참조하십시오.
@end deffn

@geindex stop() (tracemalloc 모듈)
@anchor{library/tracemalloc tracemalloc stop}@anchor{18ae}
@deffn {함수} tracemalloc.stop ()

파이썬 메모리 할당 추적을 중지합니다: 파이썬 메모리 할당자에서 훅을 제거합니다. 또한 파이썬이 할당한 메모리 블록의 이전에 수집된 모든 트레이스를 지웁니다.

트레이스를 지우기 전에 @ref{48b6,,take_snapshot()} 함수를 호출하여 트레이스의 스냅샷을 취하십시오.

@ref{2129,,start()}, @ref{48b8,,is_tracing()} 및 @ref{48b4,,clear_traces()} 함수도 참조하십시오.
@end deffn

@geindex take_snapshot() (tracemalloc 모듈)
@anchor{library/tracemalloc tracemalloc take_snapshot}@anchor{48b6}
@deffn {함수} tracemalloc.take_snapshot ()

파이썬이 할당한 메모리 블록의 트레이스의 스냅샷을 취합니다. 새로운 @ref{48bb,,Snapshot} 인스턴스를 반환합니다.

The snapshot does not include memory blocks allocated before the
@code{tracemalloc} module started to trace memory allocations.

트레이스의 트레이스백은 @ref{48b5,,get_traceback_limit()} 개의 프레임으로 제한됩니다. 더 많은 프레임을 저장하려면 @ref{2129,,start()} 함수의 `nframe' 매개 변수를 사용하십시오.

The @code{tracemalloc} module must be tracing memory allocations to take a
snapshot, see the @ref{2129,,start()} function.

@ref{1f35,,get_object_traceback()} 함수도 참조하십시오.
@end deffn

@node DomainFilter,Filter,함수<10>,API
@anchor{library/tracemalloc domainfilter}@anchor{48bc}
@subsubsection DomainFilter


@geindex DomainFilter (tracemalloc 클래스)
@anchor{library/tracemalloc tracemalloc DomainFilter}@anchor{eec}
@deffn {클래스} tracemalloc.DomainFilter (inclusive: bool, domain: int)

주소 공간(도메인)별로 메모리 블록의 트레이스를 필터링합니다.


Added in version 3.6.


@geindex inclusive (tracemalloc.DomainFilter의 속성)
@anchor{library/tracemalloc tracemalloc DomainFilter inclusive}@anchor{48bd}
@deffn {속성} inclusive

`inclusive'가 @code{True}이면 (포함), 주소 공간 @ref{48be,,domain}에 할당된 메모리 블록을 일치시킵니다.

`inclusive'가 @code{False}이면 (제외), 주소 공간 @ref{48be,,domain}에 할당되지 않은 메모리 블록을 일치시킵니다.
@end deffn

@geindex domain (tracemalloc.DomainFilter의 속성)
@anchor{library/tracemalloc tracemalloc DomainFilter domain}@anchor{48be}
@deffn {속성} domain

메모리 블록의 주소 공간 (@code{int}). 읽기 전용 프로퍼티.
@end deffn
@end deffn

@node Filter,Frame,DomainFilter,API
@anchor{library/tracemalloc filter}@anchor{48bf}
@subsubsection Filter


@geindex Filter (tracemalloc 클래스)
@anchor{library/tracemalloc tracemalloc Filter}@anchor{48c0}
@deffn {클래스} tracemalloc.Filter (inclusive: bool, filename_pattern: str, lineno: int = None, all_frames: bool = False, domain: int = None)

메모리 블록의 트레이스를 필터링합니다.

`filename_pattern'의 문법은 @ref{1c52,,fnmatch.fnmatch()} 함수를 참조하십시오. @code{'.pyc'} 파일 확장자가 @code{'.py'}로 대체됩니다.

예:


@itemize *

@item 
@code{Filter(True, subprocess.__file__)}은 @ref{dc,,subprocess} 모듈의 트레이스만 포함합니다

@item 
@code{Filter(False, tracemalloc.__file__)} excludes traces of the
@code{tracemalloc} module

@item 
@code{Filter(False, "<unknown>")}은 빈 트레이스백을 제외합니다
@end itemize


버전 3.5에서 변경: @code{'.pyo'} 파일 확장자는 더는 @code{'.py'}로 대체되지 않습니다.



버전 3.6에서 변경: @ref{48c1,,domain} 어트리뷰트를 추가했습니다.


@geindex domain (tracemalloc.Filter의 속성)
@anchor{library/tracemalloc tracemalloc Filter domain}@anchor{48c1}
@deffn {속성} domain

메모리 블록의 주소 공간 (@code{int}나 @code{None}).

tracemalloc은 도메인 @code{0}을 사용하여 파이썬의 메모리 할당을 추적합니다. C 확장은 다른 도메인을 사용하여 다른 리소스를 추적 할 수 있습니다.
@end deffn

@geindex inclusive (tracemalloc.Filter의 속성)
@anchor{library/tracemalloc tracemalloc Filter inclusive}@anchor{48c2}
@deffn {속성} inclusive

`inclusive'가 @code{True}(포함)이면, 줄 번호 @ref{48c3,,lineno}에서 이름이 @ref{48c4,,filename_pattern}과 일치하는 파일에서 할당된 메모리 블록만 일치시킵니다.

`inclusive'가 @code{False}(제외)이면, 줄 번호 @ref{48c3,,lineno}에서 이름이 @ref{48c4,,filename_pattern}과 일치하는 파일에 할당된 메모리 블록을 무시합니다.
@end deffn

@geindex lineno (tracemalloc.Filter의 속성)
@anchor{library/tracemalloc tracemalloc Filter lineno}@anchor{48c3}
@deffn {속성} lineno

필터의 줄 번호 (@code{int}). `lineno'가 @code{None}이면, 필터는 모든 줄 번호와 일치합니다.
@end deffn

@geindex filename_pattern (tracemalloc.Filter의 속성)
@anchor{library/tracemalloc tracemalloc Filter filename_pattern}@anchor{48c4}
@deffn {속성} filename_pattern

필터의 파일명 패턴 (@code{str}). 읽기 전용 프로퍼티.
@end deffn

@geindex all_frames (tracemalloc.Filter의 속성)
@anchor{library/tracemalloc tracemalloc Filter all_frames}@anchor{48c5}
@deffn {속성} all_frames

`all_frames'가 @code{True}이면, 트레이스백의 모든 프레임이 검사됩니다. `all_frames'가 @code{False}이면, 가장 최근 프레임 만 검사됩니다.

트레이스백 한계가 @code{1}이면 이 어트리뷰트가 적용되지 않습니다. @ref{48b5,,get_traceback_limit()} 함수와 @ref{48c6,,Snapshot.traceback_limit} 어트리뷰트를 참조하십시오.
@end deffn
@end deffn

@node Frame,Snapshot,Filter,API
@anchor{library/tracemalloc frame}@anchor{48c7}
@subsubsection Frame


@geindex Frame (tracemalloc 클래스)
@anchor{library/tracemalloc tracemalloc Frame}@anchor{48c8}
@deffn {클래스} tracemalloc.Frame

트레이스백의 프레임.

@ref{d8e,,Traceback} 클래스는 @ref{48c8,,Frame} 인스턴스의 시퀀스입니다.

@geindex filename (tracemalloc.Frame의 속성)
@anchor{library/tracemalloc tracemalloc Frame filename}@anchor{48c9}
@deffn {속성} filename

파일명 (@code{str}).
@end deffn

@geindex lineno (tracemalloc.Frame의 속성)
@anchor{library/tracemalloc tracemalloc Frame lineno}@anchor{48ca}
@deffn {속성} lineno

줄 번호 (@code{int}).
@end deffn
@end deffn

@node Snapshot,Statistic,Frame,API
@anchor{library/tracemalloc snapshot}@anchor{48cb}
@subsubsection Snapshot


@geindex Snapshot (tracemalloc 클래스)
@anchor{library/tracemalloc tracemalloc Snapshot}@anchor{48bb}
@deffn {클래스} tracemalloc.Snapshot

파이썬이 할당한 메모리 블록의 트레이스의 스냅샷.

@ref{48b6,,take_snapshot()} 함수는 스냅샷 인스턴스를 만듭니다.

@geindex compare_to() (tracemalloc.Snapshot 메서드)
@anchor{library/tracemalloc tracemalloc Snapshot compare_to}@anchor{48ba}
@deffn {메서드} compare_to (old_snapshot: Snapshot, key_type: str, cumulative: bool = False)

이전 스냅샷과의 차이점을 계산합니다. `key_type' 별로 그룹화된 @ref{48cc,,StatisticDiff} 인스턴스의 정렬된 리스트로 통계를 가져옵니다.

`key_type'과 `cumulative' 매개 변수에 대해서는 @ref{48aa,,Snapshot.statistics()} 메서드를 참조하십시오.

결과는 다음 값에 따라 내림차순으로 정렬됩니다: @ref{48cd,,StatisticDiff.size_diff}의 절댓값, @ref{48ce,,StatisticDiff.size}, @ref{48cf,,StatisticDiff.count_diff}의 절댓값, @ref{48d0,,Statistic.count} 그런 다음 @ref{48d1,,StatisticDiff.traceback}.
@end deffn

@geindex dump() (tracemalloc.Snapshot 메서드)
@anchor{library/tracemalloc tracemalloc Snapshot dump}@anchor{48ac}
@deffn {메서드} dump (filename)

스냅샷을 파일에 씁니다.

스냅샷을 다시 로드하려면 @ref{48ad,,load()}를 사용하십시오.
@end deffn

@geindex filter_traces() (tracemalloc.Snapshot 메서드)
@anchor{library/tracemalloc tracemalloc Snapshot filter_traces}@anchor{48d2}
@deffn {메서드} filter_traces (filters)

필터링 된 @ref{48d3,,traces} 시퀀스로 새 @ref{48bb,,Snapshot} 인스턴스를 만듭니다. `filters'는 @ref{eec,,DomainFilter}와 @ref{48c0,,Filter} 인스턴스의 리스트입니다. `filters'가 빈 리스트면, traces의 사본으로 새 @code{Snapshot} 인스턴스를 반환합니다.

모든 포함 필터가 한 번에 적용되며, 아무런 포함 필터도 일치하지 않으면 트레이스는 무시됩니다. 하나 이상의 제외 필터가 일치하면 트레이스는 무시됩니다.


버전 3.6에서 변경: @ref{eec,,DomainFilter} 인스턴스도 이제 `filters'에서 허용됩니다.

@end deffn

@geindex load() (tracemalloc.Snapshot의 클래스 메서드)
@anchor{library/tracemalloc tracemalloc Snapshot load}@anchor{48ad}
@deffn {메서드} classmethod load (filename)

파일에서 스냅샷을 로드합니다.

@ref{48ac,,dump()}도 참조하십시오.
@end deffn

@geindex statistics() (tracemalloc.Snapshot 메서드)
@anchor{library/tracemalloc tracemalloc Snapshot statistics}@anchor{48aa}
@deffn {메서드} statistics (key_type: str, cumulative: bool = False)

`key_type' 별로 그룹화된 @ref{48d4,,Statistic} 인스턴스의 정렬된 리스트로 통계를 가져옵니다:


@multitable {xxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

key_type

@tab

설명

@item

@code{'filename'}

@tab

파일명

@item

@code{'lineno'}

@tab

파일명과 줄 번호

@item

@code{'traceback'}

@tab

트레이스백

@end multitable


If `cumulative' is @code{True}, cumulate size and count of memory blocks of
all frames of the traceback of a trace, not only the most recent frame.
The cumulative mode can only be used with `key_type' equal to
@code{'filename'} and @code{'lineno'}.

결과는 다음 값에 따라 내림차순으로 정렬됩니다: @ref{48d5,,Statistic.size}, @ref{48d0,,Statistic.count} 그런 다음 @ref{48d6,,Statistic.traceback}.
@end deffn

@geindex traceback_limit (tracemalloc.Snapshot의 속성)
@anchor{library/tracemalloc tracemalloc Snapshot traceback_limit}@anchor{48c6}
@deffn {속성} traceback_limit

@ref{48d3,,traces}의 트레이스백에 저장된 최대 프레임 수: 스냅샷을 취할 때 @ref{48b5,,get_traceback_limit()}의 결과.
@end deffn

@geindex traces (tracemalloc.Snapshot의 속성)
@anchor{library/tracemalloc tracemalloc Snapshot traces}@anchor{48d3}
@deffn {속성} traces

파이썬이 할당한 모든 메모리 블록의 트레이스: @ref{48d7,,Trace} 인스턴스의 시퀀스.

시퀀스의 순서는 정의되지 않았습니다. 정렬된 통계 리스트를 얻으려면 @ref{48aa,,Snapshot.statistics()} 메서드를 사용하십시오.
@end deffn
@end deffn

@node Statistic,StatisticDiff,Snapshot,API
@anchor{library/tracemalloc statistic}@anchor{48d8}
@subsubsection Statistic


@geindex Statistic (tracemalloc 클래스)
@anchor{library/tracemalloc tracemalloc Statistic}@anchor{48d4}
@deffn {클래스} tracemalloc.Statistic

메모리 할당 통계.

@ref{48aa,,Snapshot.statistics()}는 @ref{48d4,,Statistic} 인스턴스의 리스트를 반환합니다.

@ref{48cc,,StatisticDiff} 클래스도 참조하십시오.

@geindex count (tracemalloc.Statistic의 속성)
@anchor{library/tracemalloc tracemalloc Statistic count}@anchor{48d0}
@deffn {속성} count

메모리 블록 수 (@code{int}).
@end deffn

@geindex size (tracemalloc.Statistic의 속성)
@anchor{library/tracemalloc tracemalloc Statistic size}@anchor{48d5}
@deffn {속성} size

총 메모리 블록의 바이트 단위 크기 (@code{int}).
@end deffn

@geindex traceback (tracemalloc.Statistic의 속성)
@anchor{library/tracemalloc tracemalloc Statistic traceback}@anchor{48d6}
@deffn {속성} traceback

메모리 블록이 할당된 곳의 트레이스백, @ref{d8e,,Traceback} 인스턴스.
@end deffn
@end deffn

@node StatisticDiff,Trace,Statistic,API
@anchor{library/tracemalloc statisticdiff}@anchor{48d9}
@subsubsection StatisticDiff


@geindex StatisticDiff (tracemalloc 클래스)
@anchor{library/tracemalloc tracemalloc StatisticDiff}@anchor{48cc}
@deffn {클래스} tracemalloc.StatisticDiff

기존 @ref{48bb,,Snapshot} 인스턴스와 새 인스턴스 간의 메모리 할당에 대한 통계적 차이.

@ref{48ba,,Snapshot.compare_to()}는 @ref{48cc,,StatisticDiff} 인스턴스의 리스트를 반환합니다. @ref{48d4,,Statistic} 클래스도 참조하십시오.

@geindex count (tracemalloc.StatisticDiff의 속성)
@anchor{library/tracemalloc tracemalloc StatisticDiff count}@anchor{48da}
@deffn {속성} count

새 스냅샷의 메모리 블록 수 (@code{int}): 새 스냅샷에서 메모리 블록이 해제되었으면 @code{0}.
@end deffn

@geindex count_diff (tracemalloc.StatisticDiff의 속성)
@anchor{library/tracemalloc tracemalloc StatisticDiff count_diff}@anchor{48cf}
@deffn {속성} count_diff

이전 스냅샷과 새 스냅샷 간의 메모리 블록 수의 차이 (@code{int}): 메모리 블록이 새 스냅샷에 할당되었으면 @code{0}.
@end deffn

@geindex size (tracemalloc.StatisticDiff의 속성)
@anchor{library/tracemalloc tracemalloc StatisticDiff size}@anchor{48ce}
@deffn {속성} size

새 스냅샷에서 총 메모리 블록의 바이트 단위 크기 (@code{int}): 새 스냅샷에서 메모리 블록이 해제되었으면 @code{0}.
@end deffn

@geindex size_diff (tracemalloc.StatisticDiff의 속성)
@anchor{library/tracemalloc tracemalloc StatisticDiff size_diff}@anchor{48cd}
@deffn {속성} size_diff

이전 스냅샷과 새 스냅샷 사이의 총 메모리 블록 크기의 바이트 단위 차이 (@code{int}): 메모리 블록이 새 스냅샷에 할당되었으면 @code{0}.
@end deffn

@geindex traceback (tracemalloc.StatisticDiff의 속성)
@anchor{library/tracemalloc tracemalloc StatisticDiff traceback}@anchor{48d1}
@deffn {속성} traceback

메모리 블록이 할당된 곳의 트레이스백, @ref{d8e,,Traceback} 인스턴스.
@end deffn
@end deffn

@node Trace,Traceback,StatisticDiff,API
@anchor{library/tracemalloc trace}@anchor{48db}
@subsubsection Trace


@geindex Trace (tracemalloc 클래스)
@anchor{library/tracemalloc tracemalloc Trace}@anchor{48d7}
@deffn {클래스} tracemalloc.Trace

메모리 블록의 트레이스.

@ref{48d3,,Snapshot.traces} 어트리뷰트는 @ref{48d7,,Trace} 인스턴스의 시퀀스입니다.


버전 3.6에서 변경: @ref{48dc,,domain} 어트리뷰트를 추가했습니다.


@geindex domain (tracemalloc.Trace의 속성)
@anchor{library/tracemalloc tracemalloc Trace domain}@anchor{48dc}
@deffn {속성} domain

메모리 블록의 주소 공간 (@code{int}). 읽기 전용 프로퍼티.

tracemalloc은 도메인 @code{0}을 사용하여 파이썬의 메모리 할당을 추적합니다. C 확장은 다른 도메인을 사용하여 다른 리소스를 추적 할 수 있습니다.
@end deffn

@geindex size (tracemalloc.Trace의 속성)
@anchor{library/tracemalloc tracemalloc Trace size}@anchor{48dd}
@deffn {속성} size

메모리 블록의 바이트 단위 크기 (@code{int}).
@end deffn

@geindex traceback (tracemalloc.Trace의 속성)
@anchor{library/tracemalloc tracemalloc Trace traceback}@anchor{48de}
@deffn {속성} traceback

메모리 블록이 할당된 곳의 트레이스백, @ref{d8e,,Traceback} 인스턴스.
@end deffn
@end deffn

@node Traceback,,Trace,API
@anchor{library/tracemalloc traceback}@anchor{48df}
@subsubsection Traceback


@geindex Traceback (tracemalloc 클래스)
@anchor{library/tracemalloc tracemalloc Traceback}@anchor{d8e}
@deffn {클래스} tracemalloc.Traceback

가장 오래된 프레임에서 가장 최근 프레임 순으로 정렬된 @ref{48c8,,Frame} 인스턴스의 시퀀스.

트레이스백은 적어도 @code{1}프레임을 포함합니다. @code{tracemalloc} 모듈이 프레임을 가져오지 못하면, 줄 번호 @code{0}의 파일명 @code{"<unknown>"}이 사용됩니다.

When a snapshot is taken, tracebacks of traces are limited to
@ref{48b5,,get_traceback_limit()} frames. See the @ref{48b6,,take_snapshot()} function.
The original number of frames of the traceback is stored in the
@ref{48b9,,Traceback.total_nframe} attribute. That allows one to know if a traceback
has been truncated by the traceback limit.

The @ref{48de,,Trace.traceback} attribute is a @code{Traceback} instance.


버전 3.7에서 변경: 프레임은 이제 가장 최근에서 가장 오래된 것 대신, 가장 오래된 것에서 가장 최근으로 정렬됩니다.


@geindex total_nframe (tracemalloc.Traceback의 속성)
@anchor{library/tracemalloc tracemalloc Traceback total_nframe}@anchor{48b9}
@deffn {속성} total_nframe

자르기 전에 트레이스백을 구성한 총 프레임 수. 정보가 없으면 이 어트리뷰트를 @code{None}으로 설정할 수 있습니다.
@end deffn


버전 3.9에서 변경: @ref{48b9,,Traceback.total_nframe} 어트리뷰트가 추가되었습니다.


@geindex format() (tracemalloc.Traceback 메서드)
@anchor{library/tracemalloc tracemalloc Traceback format}@anchor{d8f}
@deffn {메서드} format (limit=None, most_recent_first=False)

줄의 리스트로 트레이스백을 포맷합니다. 소스 코드에서 줄을 꺼내는데 @ref{89,,linecache} 모듈을 사용합니다. `limit'가 설정되면, `limit'가 양수일 때 가장 최신 `limit' 개의 프레임을 포맷합니다. 그렇지 않으면, 가장 오래된 @code{abs(limit)} 개의 프레임을 포맷합니다. `most_recent_first'가 @code{True}이면, 포맷된 프레임의 순서가 반대로 되어, 가장 최근의 프레임을 마지막이 아니라 처음에 반환합니다.

@ref{d8f,,format()}에 줄 넘김 문자가 포함되지 않는다는 점을 제외하고, @ref{48e0,,traceback.format_tb()} 함수와 유사합니다.

예:

@example
print("Traceback (most recent call first):")
for line in traceback:
    print(line)
@end example

출력:

@example
Traceback (most recent call first):
  File "test.py", line 9
    obj = Object()
  File "test.py", line 12
    tb = tracemalloc.get_object_traceback(f())
@end example
@end deffn
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 소프트웨어 패키징 및 배포,파이썬 실행시간 서비스,디버깅과 프로파일링,파이썬 표준 라이브러리
@anchor{library/distribution doc}@anchor{48e1}@anchor{library/distribution software-packaging-and-distribution}@anchor{48e2}@anchor{library/distribution translation-repo}@anchor{48e3}
@section 소프트웨어 패키징 및 배포


이 라이브러리는 파이썬 소프트웨어를 게시하고 설치하는 데 도움을 줍니다. 이 모듈은 파이썬 패키지 색인@footnote{https://pypi.org}과 함께 작동하도록 설계되었지만, 로컬 색인 서버와 함께 사용할 수도, 색인 서버 없이 사용할 수도 있습니다.

@menu
* ensurepip — pip 설치 프로그램 부트스트랩:: 
* venv — 가상 환경 생성:: 
* zipapp — 실행 가능한 파이썬 zip 아카이브 관리:: 

@end menu

@node ensurepip — pip 설치 프로그램 부트스트랩,venv — 가상 환경 생성,,소프트웨어 패키징 및 배포
@anchor{library/ensurepip doc}@anchor{48e4}@anchor{library/ensurepip ensurepip-bootstrapping-the-pip-installer}@anchor{48e5}@anchor{library/ensurepip module-ensurepip}@anchor{59}
@subsection @code{ensurepip} — @code{pip} 설치 프로그램 부트스트랩


@geindex module; ensurepip


Added in version 3.4.


`소스 코드:' Lib/ensurepip@footnote{https://github.com/python/cpython/tree/3.14/Lib/ensurepip}


__________________________________________________________________


The @code{ensurepip} package provides support for bootstrapping the @code{pip}
installer into an existing Python installation or virtual environment. This
bootstrapping approach reflects the fact that @code{pip} is an independent
project with its own release cycle, and the latest available stable version
is bundled with maintenance and feature releases of the CPython reference
interpreter.

대부분, 파이썬의 최종 사용자는 이 모듈을 직접 호출할 필요가 없습니다 (@code{pip}는 기본적으로 부트스트랩 되어있어야 하기 때문입니다). 하지만, 파이썬을 설치할 때 (또는 가상 환경을 만들 때) @code{pip}를 건너뛰었거나 그 후에 명시적으로 @code{pip}를 제거했다면 필요할 수 있습니다.

@cartouche
@quotation 참고 
이 모듈은 인터넷에 접속하지 `않습니다'. @code{pip}를 부트스트랩 하는 데 필요한 모든 구성 요소는 패키지의 내부 부품으로 포함됩니다.
@end quotation
@end cartouche

This is an @ref{2157,,optional module}.
If it is missing from your copy of CPython,
look for documentation from your distributor (that is,
whoever provided Python to you).
If you are the distributor, see @ref{2155,,Requirements for optional modules}.

@c Similar notes appear in the docs of the modules:
@c - zipfile
@c - tarfile


@subsubheading 더 보기



@table @asis

@item @ref{10f7,,파이썬 모듈 설치하기}

파이썬 패키지를 설치하기 위한 최종 사용자 지침서

@geindex Python 향상 제안; PEP 453

@item PEP 453@footnote{https://peps.python.org/pep-0453/}: 파이썬 설치에서 pip의 명시적 부트스트랩

이 모듈의 원래 근거와 사양.
@end table


@c include for modules that don't work on WASM or mobile platforms

@ref{213c,,가용성}: not Android, not iOS, not WASI.

이 모듈은 @ref{2259,,모바일 플랫폼}이나 @ref{1b68,,웹어셈블리 플랫폼}에서 지원되지 않습니다.

@menu
* Command-line interface: Command-line interface<9>. 
* 모듈 API:: 

@end menu

@node Command-line interface<9>,모듈 API,,ensurepip — pip 설치 프로그램 부트스트랩
@anchor{library/ensurepip command-line-interface}@anchor{48e6}@anchor{library/ensurepip ensurepip-cli}@anchor{48e7}
@subsubsection Command-line interface


명령 줄 인터페이스는 인터프리터의 @code{-m} 스위치를 사용하여 호출됩니다.

가장 간단한 호출은 이렇습니다:

@example
python -m ensurepip
@end example

이 호출은 아직 설치되지 않았으면 @code{pip}를 설치하지만, 그렇지 않으면 아무것도 하지 않습니다. @code{pip}의 설치 버전이 적어도 @code{ensurepip}에서 제공하는 것 만큼 최신 버전이 되도록 하려면, @code{--upgrade} 옵션을 전달하십시오:

@example
python -m ensurepip --upgrade
@end example

기본적으로, @code{pip}는 현재 가상 환경(활성화되었다면)이나 시스템 사이트 패키지(활성 가상 환경이 없으면)에 설치됩니다. 설치 위치는 두 개의 추가 명령 줄 옵션을 통해 제어할 수 있습니다:

@geindex ensurepip 명령줄 옵션; --root
@anchor{library/ensurepip cmdoption-ensurepip-root}@anchor{48e8}
@deffn {Option} @w{-}@w{-}root <dir>

현재 활성화된 가상 환경의 루트(있다면)나 현재 파이썬 설치의 기본 루트 대신, 지정된 루트 디렉터리에 상대적으로 @code{pip}를 설치합니다.
@end deffn

@geindex ensurepip 명령줄 옵션; --user
@anchor{library/ensurepip cmdoption-ensurepip-user}@anchor{48e9}
@deffn {Option} @w{-}@w{-}user

@code{pip}를 현재 파이썬 설치에 전역적으로 설치하지 않고 사용자 사이트 패키지 디렉터리에 설치합니다 (이 옵션은 활성 가상 환경에서는 허용되지 않습니다).
@end deffn

기본적으로, @code{pipX} 와 @code{pipX.Y} 스크립트가 설치됩니다 (여기서 X.Y는 @code{ensurepip}를 호출하는 데 사용된 파이썬 버전을 나타냅니다). 설치된 스크립트는 두 개의 추가 명령 줄 옵션을 통해 제어할 수 있습니다:

@geindex ensurepip 명령줄 옵션; --altinstall
@anchor{library/ensurepip cmdoption-ensurepip-altinstall}@anchor{48ea}
@deffn {Option} @w{-}@w{-}altinstall

대안 설치가 요청되면, @code{pipX} 스크립트가 설치되지 `않습니다'.
@end deffn

@geindex ensurepip 명령줄 옵션; --default-pip
@anchor{library/ensurepip cmdoption-ensurepip-default-pip}@anchor{48eb}
@deffn {Option} @w{-}@w{-}default@w{-}pip

“기본 pip” 설치가 요청되면, 두 개의 일반 스크립트에 더해 @code{pip} 스크립트가 설치됩니다.
@end deffn

두 스크립트 선택 옵션을 모두 제공하면 예외가 발생합니다.

@node 모듈 API,,Command-line interface<9>,ensurepip — pip 설치 프로그램 부트스트랩
@anchor{library/ensurepip module-api}@anchor{48ec}
@subsubsection 모듈 API


@code{ensurepip} exposes two functions for programmatic use:

@geindex version() (ensurepip 모듈)
@anchor{library/ensurepip ensurepip version}@anchor{48ed}
@deffn {함수} ensurepip.version ()

환경을 부트스트랩 할 때 설치될 pip의 버전을 지정하는 문자열을 반환합니다.
@end deffn

@geindex bootstrap() (ensurepip 모듈)
@anchor{library/ensurepip ensurepip bootstrap}@anchor{479a}
@deffn {함수} ensurepip.bootstrap (root=None, upgrade=False, user=False, altinstall=False, default_pip=False, verbosity=0)

@code{pip}를 현재나 지정된 환경으로 부트스트랩 합니다.

`root'는 상대 경로로 설치할 대안 루트 디렉터리를 지정합니다. `root'가 @code{None}이면, 설치는 현재 환경의 기본 설치 위치를 사용합니다.

`upgrade'는 이미 설치된 이전 버전의 @code{pip}를 제공되는 버전으로 업그레이드할지를 나타냅니다.

`user'는 전역으로 설치하는 대신 사용자 구성을 사용할지를 나타냅니다.

기본적으로, @code{pipX} 및 @code{pipX.Y} 스크립트가 설치됩니다 (여기서 X.Y는 현재 버전의 파이썬을 나타냅니다).

`altinstall'가 설정되면, @code{pipX}가 설치되지 `않습니다'.

`default_pip'가 설정되면, 두 개의 일반 스크립트에 더해 @code{pip}가 설치됩니다.

`altinstall' 과 `default_pip'를 모두 설정하면 @ref{2ec,,ValueError}가 발생합니다.

`verbosity'는 부트스트랩 연산에서 @ref{ccc,,sys.stdout}로 출력하는 수준을 제어합니다.

인자 @code{root}로 @ref{1c6c,,감사 이벤트(auditing event)} @code{ensurepip.bootstrap}을 발생시킵니다.

@cartouche
@quotation 참고 
부트스트랩 프로세스에는 @code{sys.path} 와 @code{os.environ} 모두에 부작용이 있습니다. 대신 자식 프로세스에서 명령 줄 인터페이스를 호출하면 이러한 부작용을 피할 수 있습니다.
@end quotation
@end cartouche

@cartouche
@quotation 참고 
부트스트랩 프로세스는 @code{pip}에 필요한 추가 모듈을 설치할 수 있지만, 다른 소프트웨어는 이러한 종속성이 기본적으로 항상 존재한다고 가정해서는 안 됩니다 (@code{pip}의 차후 버전에서 제거될 수 있기 때문입니다).
@end quotation
@end cartouche
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node venv — 가상 환경 생성,zipapp — 실행 가능한 파이썬 zip 아카이브 관리,ensurepip — pip 설치 프로그램 부트스트랩,소프트웨어 패키징 및 배포
@anchor{library/venv doc}@anchor{48ee}@anchor{library/venv module-venv}@anchor{117}@anchor{library/venv translation-repo}@anchor{48ef}@anchor{library/venv venv-creation-of-virtual-environments}@anchor{48f0}
@subsection @code{venv} — 가상 환경 생성


@geindex module; venv


Added in version 3.3.


`소스 코드:' Lib/venv/@footnote{https://github.com/python/cpython/tree/3.14/Lib/venv/}

@geindex 환경;가상


__________________________________________________________________

@anchor{library/venv venv-def}@anchor{3e8}@anchor{library/venv venv-intro}@anchor{48f1}
The @code{venv} module supports creating lightweight “virtual environments”,
each with their own independent set of Python packages installed in
their @ref{cc,,site} directories.
A virtual environment is created on top of an existing
Python installation, known as the virtual environment’s “base” Python, and by
default is isolated from the packages in the base environment,
so that only those explicitly installed in the virtual environment are
available. See @ref{48f2,,Virtual Environments} and @code{site}’s
@ref{48f3,,virtual environments documentation}
for more information.

가상 환경 내에서 사용될 때, pip@footnote{https://pypi.org/project/pip/}와 같은 일반적인 설치 도구는 명시적으로 지정하지 않아도 파이썬 패키지를 가상 환경에 설치합니다.

A virtual environment is (amongst other things):


@itemize *

@item 
Used to contain a specific Python interpreter and software libraries and
binaries which are needed to support a project (library or application). These
are by default isolated from software in other virtual environments and Python
interpreters and libraries installed in the operating system.

@item 
Contained in a directory, conventionally named @code{.venv} or @code{venv} in
the project directory, or under a container directory for lots of virtual
environments, such as @code{~/.virtualenvs}.

@item 
Not checked into source control systems such as Git.

@item 
Considered as disposable – it should be simple to delete and recreate it from
scratch. You don’t place any project code in the environment.

@item 
Not considered as movable or copyable – you just recreate the same
environment in the target location.
@end itemize

파이썬 가상 환경에 대한 자세한 배경 정보는 
@geindex Python 향상 제안; PEP 405
PEP 405@footnote{https://peps.python.org/pep-0405/}를 참조하십시오.


@subsubheading 더 보기


Python Packaging User Guide: Creating and using virtual environments@footnote{https://packaging.python.org/guides/installing-using-pip-and-virtual-environments/#create-and-use-virtual-environments}


@c include for modules that don't work on WASM or mobile platforms

@ref{213c,,가용성}: not Android, not iOS, not WASI.

이 모듈은 @ref{2259,,모바일 플랫폼}이나 @ref{1b68,,웹어셈블리 플랫폼}에서 지원되지 않습니다.

@menu
* 가상 환경 만들기: 가상 환경 만들기<2>. 
* How venvs work:: 
* API: API<2>. 
* EnvBuilder 확장 예제:: 

@end menu

@node 가상 환경 만들기<2>,How venvs work,,venv — 가상 환경 생성
@anchor{library/venv creating-virtual-environments}@anchor{48f4}
@subsubsection 가상 환경 만들기


@ref{3e8,,가상 환경}은 @code{venv} 모듈을 실행해서 만들어집니다:

@example
python -m venv /path/to/new/virtual/environment
@end example

This creates the target directory (including parent directories as needed)
and places a @code{pyvenv.cfg} file in it with a @code{home} key
pointing to the Python installation from which the command was run.
It also creates a @code{bin} (or @code{Scripts} on Windows) subdirectory
containing a copy or symlink of the Python executable
(as appropriate for the platform or arguments used at environment creation time).
It also creates a @code{lib/pythonX.Y/site-packages} subdirectory
(on Windows, this is @code{Lib\site-packages}).
If an existing directory is specified, it will be re-used.


버전 3.5에서 변경: 이제 가상 환경을 만들 때 @code{venv}를 사용하는 것이 좋습니다.



Deprecated since version 3.6, removed in version 3.8: @code{pyvenv}는 파이썬 3.3 및 3.4 용 가상 환경을 만드는 데 권장되는 도구였으며, 파이썬 3.5 에서 @code{venv}를 직접 실행하는 방식으로 대체되었습니다.


윈도우에서는, 다음과 같이 @code{venv} 명령을 호출하십시오:

@example
PS> python -m venv C:\path\to\new\virtual\environment
@end example

명령에 @code{-h}를 사용하면 사용 가능한 옵션이 표시됩니다:

@example
usage: venv [-h] [--system-site-packages] [--symlinks | --copies] [--clear]
            [--upgrade] [--without-pip] [--prompt PROMPT] [--upgrade-deps]
            [--without-scm-ignore-files]
            ENV_DIR [ENV_DIR ...]

Creates virtual Python environments in one or more target directories.

Once an environment has been created, you may wish to activate it, e.g. by
sourcing an activate script in its bin directory.
@end example

@geindex venv 명령줄 옵션; ENV_DIR
@anchor{library/venv venv-cli}@anchor{48f5}@anchor{library/venv cmdoption-venv-arg-ENV_DIR}@anchor{48f6}
@deffn {Option} ENV_DIR

A required argument specifying the directory to create the environment in.
@end deffn

@geindex venv 명령줄 옵션; --system-site-packages
@anchor{library/venv cmdoption-venv-system-site-packages}@anchor{48f7}
@deffn {Option} @w{-}@w{-}system@w{-}site@w{-}packages

Give the virtual environment access to the system site-packages directory.
@end deffn

@geindex venv 명령줄 옵션; --symlinks
@anchor{library/venv cmdoption-venv-symlinks}@anchor{48f8}
@deffn {Option} @w{-}@w{-}symlinks

Try to use symlinks rather than copies, when symlinks are not the default for the platform.
@end deffn

@geindex venv 명령줄 옵션; --copies
@anchor{library/venv cmdoption-venv-copies}@anchor{48f9}
@deffn {Option} @w{-}@w{-}copies

Try to use copies rather than symlinks, even when symlinks are the default for the platform.
@end deffn

@geindex venv 명령줄 옵션; --clear
@anchor{library/venv cmdoption-venv-clear}@anchor{48fa}
@deffn {Option} @w{-}@w{-}clear

Delete the contents of the environment directory if it already exists, before environment creation.
@end deffn

@geindex venv 명령줄 옵션; --upgrade
@anchor{library/venv cmdoption-venv-upgrade}@anchor{48fb}
@deffn {Option} @w{-}@w{-}upgrade

Upgrade the environment directory to use this version of Python, assuming Python has been upgraded in-place.
@end deffn

@geindex venv 명령줄 옵션; --without-pip
@anchor{library/venv cmdoption-venv-without-pip}@anchor{48fc}
@deffn {Option} @w{-}@w{-}without@w{-}pip

Skips installing or upgrading pip in the virtual environment (pip is bootstrapped by default).
@end deffn

@geindex venv 명령줄 옵션; --prompt
@anchor{library/venv cmdoption-venv-prompt}@anchor{48fd}
@deffn {Option} @w{-}@w{-}prompt <PROMPT>

Provides an alternative prompt prefix for this environment.
@end deffn

@geindex venv 명령줄 옵션; --upgrade-deps
@anchor{library/venv cmdoption-venv-upgrade-deps}@anchor{48fe}
@deffn {Option} @w{-}@w{-}upgrade@w{-}deps

Upgrade core dependencies (pip) to the latest version in PyPI.
@end deffn

@geindex venv 명령줄 옵션; --without-scm-ignore-files
@anchor{library/venv cmdoption-venv-without-scm-ignore-files}@anchor{48ff}
@deffn {Option} @w{-}@w{-}without@w{-}scm@w{-}ignore@w{-}files

Skips adding SCM ignore files to the environment directory (Git is supported by default).
@end deffn


버전 3.4에서 변경: 기본적으로 pip을 설치합니다. @code{--without-pip} 와 @code{--copies} 옵션을 추가했습니다.



버전 3.4에서 변경: 이전 버전에서는, @code{--clear} 나 @code{--upgrade} 옵션이 제공되지 않았을 때, 대상 디렉터리가 이미 존재하면 에러가 발생했습니다.



버전 3.9에서 변경: PyPI에 있는 최신으로 pip + setuptools를 업그레이드하는 @code{--upgrade-deps} 옵션을 추가했습니다.



버전 3.12에서 변경: @code{setuptools} is no longer a core venv dependency.



버전 3.13에서 변경: Added the @code{--without-scm-ignore-files} option.



버전 3.13에서 변경: @code{venv} now creates a @code{.gitignore} file for Git by default.


@cartouche
@quotation 참고 
심볼릭 링크가 윈도우에서 지원되지만, 추천하지는 않습니다. 특히 파일 탐색기에서 @code{python.exe}를 더블 클릭하면 심볼릭 링크를 열심히 따라가고(resolve) 가상 환경은 무시됩니다.
@end quotation
@end cartouche

@cartouche
@quotation 참고 
마이크로소프트 윈도우에서는 사용자에 대한 실행 정책을 설정하여 @code{Activate.ps1} 스크립트를 활성화해야 할 수도 있습니다. 다음 PowerShell 명령을 실행하여 이를 수행할 수 있습니다:

@example
PS C:\> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
@end example

자세한 정보는 About Execution Policies@footnote{https://go.microsoft.com/fwlink/?LinkID=135170}를 참조하십시오.
@end quotation
@end cartouche

만들어진 @code{pyvenv.cfg} 파일에는 @code{include-system-site-packages} 키도 포함되어 있으며, @code{venv}가 @code{--system-site-packages} 옵션으로 실행되면 @code{true}로 설정되고, 그렇지 않으면 @code{false}로 설정됩니다.

@code{--without-pip} 옵션을 주지 않는 한, 가상 환경으로 @code{pip}을 부트스트랩 하기 위해 @ref{59,,ensurepip}가 호출됩니다.

@code{venv}에 여러 경로를 지정할 수 있습니다. 이때 지정된 옵션에 따라 제공된 각 경로에서 같은 가상 환경이 만들어집니다.

@node How venvs work,API<2>,가상 환경 만들기<2>,venv — 가상 환경 생성
@anchor{library/venv how-venvs-work}@anchor{4900}@anchor{library/venv venv-explanation}@anchor{67c}
@subsubsection How venvs work


When a Python interpreter is running from a virtual environment,
@ref{3e7,,sys.prefix} and @ref{3eb,,sys.exec_prefix}
point to the directories of the virtual environment,
whereas @ref{3e6,,sys.base_prefix} and @ref{3ea,,sys.base_exec_prefix}
point to those of the base Python used to create the environment.
It is sufficient to check
@code{sys.prefix != sys.base_prefix} to determine if the current interpreter is
running from a virtual environment.

A virtual environment may be “activated” using a script in its binary directory
(@code{bin} on POSIX; @code{Scripts} on Windows).
This will prepend that directory to your 
@geindex PATH
@geindex 환경 변수; PATH
@code{PATH}, so that running
@code{python} will invoke the environment’s Python interpreter
and you can run installed scripts without having to use their full path.
The invocation of the activation script is platform-specific
(@code{@var{<venv>}} must be replaced by the path to the directory
containing the virtual environment):


@multitable {xxxxxxxxxxxxxxx} {xxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

플랫폼

@tab

셸

@tab

가상 환경을 활성화하는 명령

@item

POSIX

@tab

bash/zsh

@tab

@code{$ source @var{<venv>}/bin/activate}

@item

fish

@tab

@code{$ source @var{<venv>}/bin/activate.fish}

@item

csh/tcsh

@tab

@code{$ source @var{<venv>}/bin/activate.csh}

@item

pwsh

@tab

@code{$ @var{<venv>}/bin/Activate.ps1}

@item

윈도우

@tab

cmd.exe

@tab

@code{C:\> @var{<venv>}\Scripts\activate.bat}

@item

PowerShell

@tab

@code{PS C:\> @var{<venv>}\Scripts\Activate.ps1}

@end multitable



Added in version 3.4: @code{fish} 와 @code{csh} 활성화 스크립트.



Added in version 3.8: PowerShell Core 지원을 위해 POSIX에 설치된 PowerShell 활성화 스크립트.


가상 환경을 구체적으로 활성화할 `필요'는 없습니다, 파이썬을 호출할 때 그 환경의 파이썬 인터프리터를 가리키는 전체 경로를 지정하기만 하면 되기 때문입니다. 또한, 환경에 설치된 모든 스크립트는 활성화하지 않고도 실행 가능해야 합니다.

In order to achieve this, scripts installed into virtual environments have
a “shebang” line which points to the environment’s Python interpreter,
@code{#!/@var{<path-to-venv>}/bin/python}.
This means that the script will run with that interpreter regardless of the
value of 
@geindex PATH
@geindex 환경 변수; PATH
@code{PATH}. On Windows, “shebang” line processing is supported if
you have the @ref{7d9,,Python install manager} installed. Thus, double-clicking an installed
script in a Windows Explorer window should run it with the correct interpreter
without the environment needing to be activated or on the 
@geindex PATH
@geindex 환경 변수; PATH
@code{PATH}.

가상 환경이 활성화되면, @code{VIRTUAL_ENV} 환경 변수가 환경의 경로로 설정됩니다. 가상 환경을 사용하기 위해 명시적으로 활성화할 필요가 없기 때문에, @code{VIRTUAL_ENV}로 가상 환경이 사용 중인지를 판단할 수 없습니다.

@cartouche
@quotation 경고 
Because scripts installed in environments should not expect the
environment to be activated, their shebang lines contain the absolute paths
to their environment’s interpreters. Because of this, environments are
inherently non-portable, in the general case. You should always have a
simple means of recreating an environment (for example, if you have a
requirements file @code{requirements.txt}, you can invoke @code{pip install -r
requirements.txt} using the environment’s @code{pip} to install all of the
packages needed by the environment). If for any reason you need to move the
environment to a new location, you should recreate it at the desired
location and delete the one at the old location. If you move an environment
because you moved a parent directory of it, you should recreate the
environment in its new location. Otherwise, software installed into the
environment may not work as expected.
@end quotation
@end cartouche

셸에서 @code{deactivate}를 입력하여 가상 환경을 비활성화할 수 있습니다. 정확한 메커니즘은 플랫폼에 따라 다르고 내부 구현 상세입니다 (보통, 스크립트나 셸 함수가 사용됩니다).

@node API<2>,EnvBuilder 확장 예제,How venvs work,venv — 가상 환경 생성
@anchor{library/venv api}@anchor{4901}@anchor{library/venv venv-api}@anchor{10f4}
@subsubsection API


위에서 설명한 고수준 메서드는 제삼자 가상 환경 작성자가 필요에 따라 환경을 사용자 정의할 수 있는 메커니즘을 제공하는 간단한 API를 사용합니다: @ref{570,,EnvBuilder} 클래스.

@geindex EnvBuilder (venv 클래스)
@anchor{library/venv venv EnvBuilder}@anchor{570}
@deffn {클래스} venv.EnvBuilder (system_site_packages=False, clear=False, symlinks=False, upgrade=False, with_pip=False, prompt=None, upgrade_deps=False, *, scm_ignore_files=frozenset())

@ref{570,,EnvBuilder} 클래스는 인스턴스를 만들 때 다음 키워드 인자를 받아들입니다:


@itemize *

@item 
`system_site_packages' – 시스템 파이썬 site-packages가 환경에서 사용 가능해야 함을 나타내는 논릿값입니다 (기본값은 @code{False}).

@item 
`clear' – 참이면, 환경을 만들기 전에, 대상 디렉터리에 존재하는 내용을 지우도록 하는 논릿값.

@item 
`symlinks' – 파이썬 바이너리를 복사하는 대신 심볼릭 링크하려고 시도할지를 나타내는 논릿값입니다.

@item 
`upgrade' – 참이면 실행 중인 파이썬으로 기존 환경을 업그레이드하도록 하는 논릿값 - 파이썬이 그 자리에서 업그레이드되었을 때 사용됩니다 (기본값은 @code{False}).

@item 
`with_pip' – 참이면 가상 환경에 pip이 설치되도록 하는 논릿값입니다. @code{--default-pip} 옵션과 함께 @ref{59,,ensurepip}를 사용합니다.

@item 
`prompt' – 가상 환경이 활성화된 후 사용할 문자열입니다 (기본값은 환경의 디렉터리 이름이 사용됨을 뜻하는 @code{None}입니다). 특수한 문자열 @code{"."}이 제공되면, 현재 디렉터리의 기본 이름(basename)이 프롬프트로 사용됩니다.

@item 
`upgrade_deps' – PyPI에서 기반 venv 모듈을 최신으로 갱신합니다

@item 
`scm_ignore_files' – Create ignore files based for the specified source
control managers (SCM) in the iterable. Support is defined by having a
method named @code{create_@{scm@}_ignore_file}. The only value supported by
default is @code{"git"} via @ref{4902,,create_git_ignore_file()}.
@end itemize


버전 3.4에서 변경: @code{with_pip} 매개 변수 추가



버전 3.6에서 변경: @code{prompt} 매개 변수 추가



버전 3.9에서 변경: @code{upgrade_deps} 매개 변수 추가



버전 3.13에서 변경: @code{scm_ignore_files} 매개 변수 추가


@ref{570,,EnvBuilder} may be used as a base class.

@geindex create() (venv.EnvBuilder 메서드)
@anchor{library/venv venv EnvBuilder create}@anchor{4903}
@deffn {메서드} create (env_dir)

가상 환경을 담을 대상 디렉터리(절대 또는 현재 디렉터리에 대한 상대)를 지정해서 가상 환경을 만듭니다. @code{create} 메서드는 지정된 디렉터리에 환경을 만들거나 적절한 예외를 발생시킵니다.

@ref{570,,EnvBuilder} 클래스의 @code{create} 메서드는 서브 클래스가 사용자 정의할 수 있는 훅을 보여줍니다:

@example
def create(self, env_dir):
    """
    디렉터리에 가상화된 파이썬 환경을 만듭니다.
    env_dir은 안에 환경을 만들 대상 디렉터리입니다.
    """
    env_dir = os.path.abspath(env_dir)
    context = self.ensure_directories(env_dir)
    self.create_configuration(context)
    self.setup_python(context)
    self.setup_scripts(context)
    self.post_setup(context)
@end example

메서드 @ref{4904,,ensure_directories()}, @ref{4905,,create_configuration()}, @ref{4906,,setup_python()}, @ref{4907,,setup_scripts()} 및 @ref{4908,,post_setup()} 각각을 재정의할 수 있습니다.
@end deffn

@geindex ensure_directories() (venv.EnvBuilder 메서드)
@anchor{library/venv venv EnvBuilder ensure_directories}@anchor{4904}
@deffn {메서드} ensure_directories (env_dir)

환경 디렉터리와 이미 존재하지 않는 필요한 모든 서브 디렉터리를 만들고, 문맥 객체를 돌려줍니다. 문맥 객체는 다른 메서드에서 사용하기 위한 어트리뷰트(가령 경로)를 담고 있을 뿐입니다. @ref{570,,EnvBuilder}가 @code{clear=True} 인자로 만들어지면, 환경 디렉터리의 내용이 지워진 후 모든 필요한 서브 디렉터리가 재생성됩니다.

The returned context object is a @ref{4e5,,types.SimpleNamespace} with the
following attributes:


@itemize *

@item 
@code{env_dir} - The location of the virtual environment. Used for
@code{__VENV_DIR__} in activation scripts (see @ref{4909,,install_scripts()}).

@item 
@code{env_name} - The name of the virtual environment. Used for
@code{__VENV_NAME__} in activation scripts (see @ref{4909,,install_scripts()}).

@item 
@code{prompt} - The prompt to be used by the activation scripts. Used for
@code{__VENV_PROMPT__} in activation scripts (see @ref{4909,,install_scripts()}).

@item 
@code{executable} - The underlying Python executable used by the virtual
environment. This takes into account the case where a virtual environment
is created from another virtual environment.

@item 
@code{inc_path} - The include path for the virtual environment.

@item 
@code{lib_path} - The purelib path for the virtual environment.

@item 
@code{bin_path} - 가상 환경의 스크립트 경로.

@item 
@code{bin_name} - The name of the script path relative to the virtual
environment location. Used for @code{__VENV_BIN_NAME__} in activation
scripts (see @ref{4909,,install_scripts()}).

@item 
@code{env_exe} - The name of the Python interpreter in the virtual
environment. Used for @code{__VENV_PYTHON__} in activation scripts
(see @ref{4909,,install_scripts()}).

@item 
@code{env_exec_cmd} - The name of the Python interpreter, taking into
account filesystem redirections. This can be used to run Python in
the virtual environment.
@end itemize


버전 3.11에서 변경: The `venv'
@ref{449,,sysconfig installation scheme}
is used to construct the paths of the created directories.



버전 3.12에서 변경: The attribute @code{lib_path} was added to the context, and the context
object was documented.

@end deffn

@geindex create_configuration() (venv.EnvBuilder 메서드)
@anchor{library/venv venv EnvBuilder create_configuration}@anchor{4905}
@deffn {메서드} create_configuration (context)

환경에 @code{pyvenv.cfg} 구성 파일을 만듭니다.
@end deffn

@geindex setup_python() (venv.EnvBuilder 메서드)
@anchor{library/venv venv EnvBuilder setup_python}@anchor{4906}
@deffn {메서드} setup_python (context)

환경에 파이썬 실행 파일의 복사본이나 심볼릭 링크를 만듭니다. POSIX 시스템에서, 특정 실행 파일 @code{python3.x}가 사용되면, 해당 이름의 파일이 이미 존재하지 않는 한 @code{python} 과 @code{python3} 심볼릭 링크가 해당 실행 파일을 가리키도록 만들어집니다.
@end deffn

@geindex setup_scripts() (venv.EnvBuilder 메서드)
@anchor{library/venv venv EnvBuilder setup_scripts}@anchor{4907}
@deffn {메서드} setup_scripts (context)

플랫폼에 적합한 활성화 스크립트를 가상 환경에 설치합니다.
@end deffn

@geindex upgrade_dependencies() (venv.EnvBuilder 메서드)
@anchor{library/venv venv EnvBuilder upgrade_dependencies}@anchor{490a}
@deffn {메서드} upgrade_dependencies (context)

환경에서 핵심 venv 종속성 패키지 (현재 pip@footnote{https://pypi.org/project/pip/})를 업그레이드합니다. 이것은 환경에서 셸로 @code{pip} 실행 파일을 실행하여 수행됩니다.


Added in version 3.9.



버전 3.12에서 변경: setuptools@footnote{https://pypi.org/project/setuptools/} is no longer a core venv dependency.

@end deffn

@geindex post_setup() (venv.EnvBuilder 메서드)
@anchor{library/venv venv EnvBuilder post_setup}@anchor{4908}
@deffn {메서드} post_setup (context)

제삼자 구현에서 재정의하여 가상 환경에 패키지를 사전 설치하거나 다른 생성 후 단계를 수행할 수 있는 메서드입니다.
@end deffn

@geindex install_scripts() (venv.EnvBuilder 메서드)
@anchor{library/venv venv EnvBuilder install_scripts}@anchor{4909}
@deffn {메서드} install_scripts (context, path)

이 메서드는 가상 환경에 사용자 정의 스크립트를 설치하는 데 도움을 주는데, 서브 클래스의 @ref{4907,,setup_scripts()} 나 @ref{4908,,post_setup()}에서 호출할 수 있습니다.

`path'는 @code{common}, @code{posix}, @code{nt} 서브 디렉터리를 포함해야 하는 디렉터리 경로입니다. 각 디렉터리에는 환경의 @code{bin} 디렉터리로 들어갈 스크립트가 들어 있습니다. @code{common}과 @ref{302a,,os.name}에 해당하는 디렉터리의 내용은 자리 표시자의 일부 텍스트 치환 후 복사됩니다:


@itemize *

@item 
@code{__VENV_DIR__}은 환경 디렉터리의 절대 경로로 치환됩니다.

@item 
@code{__VENV_NAME__}은 환경 이름(환경 디렉터리의 최종 경로 세그먼트)으로 치환됩니다.

@item 
@code{__VENV_PROMPT__}는 프롬프트(괄호로 묶인 환경 이름과 그 뒤의 스페이스)로 치환됩니다

@item 
@code{__VENV_BIN_NAME__}은 bin 디렉터리의 이름(@code{bin} 이나 @code{Scripts})으로 치환됩니다.

@item 
@code{__VENV_PYTHON__}은 환경의 실행 파일의 절대 경로로 치환됩니다.
@end itemize

디렉터리는 존재하는 것이 허용됩니다 (기존 환경이 업그레이드될 때).
@end deffn

@geindex create_git_ignore_file() (venv.EnvBuilder 메서드)
@anchor{library/venv venv EnvBuilder create_git_ignore_file}@anchor{4902}
@deffn {메서드} create_git_ignore_file (context)

Creates a @code{.gitignore} file within the virtual environment that causes
the entire directory to be ignored by the Git source control manager.


Added in version 3.13.

@end deffn


버전 3.7.2에서 변경: 윈도우는 이제 실제 바이너리를 복사하는 대신 @code{python[w].exe}를 위한 리디렉터 스크립트를 사용합니다. 3.7.2 에서만, 소스 트리의 빌드에서 실행하지 않는 한 @ref{4906,,setup_python()}아무 작업도 수행하지 않습니다.



버전 3.7.3에서 변경: 윈도우는 @ref{4907,,setup_scripts()} 대신 @ref{4906,,setup_python()}의 일부로 리디렉터 스크립트를 복사합니다. 이것은 3.7.2는 해당하지 않습니다. 심볼릭 링크를 사용하면, 원래 실행 파일이 링크됩니다.

@end deffn

모듈 수준의 편리 함수도 있습니다:

@geindex create() (venv 모듈)
@anchor{library/venv venv create}@anchor{571}
@deffn {함수} venv.create (env_dir, system_site_packages=False, clear=False, symlinks=False, with_pip=False, prompt=None, upgrade_deps=False, *, scm_ignore_files=frozenset())

주어진 키워드 인자로 @ref{570,,EnvBuilder}를 만들고, `env_dir' 인자로 @ref{4903,,create()} 메서드를 호출합니다.


Added in version 3.3.



버전 3.4에서 변경: `with_pip' 매개 변수 추가



버전 3.6에서 변경: `prompt' 매개 변수 추가



버전 3.9에서 변경: `upgrade_deps' 매개 변수 추가



버전 3.13에서 변경: `scm_ignore_files' 매개 변수 추가

@end deffn

@node EnvBuilder 확장 예제,,API<2>,venv — 가상 환경 생성
@anchor{library/venv an-example-of-extending-envbuilder}@anchor{490b}
@subsubsection @code{EnvBuilder} 확장 예제


다음 스크립트는 생성된 가상 환경에 setuptools 와 pip을 설치하는 서브 클래스를 구현하여 @ref{570,,EnvBuilder}를 확장하는 방법을 보여줍니다:

@example
import os
import os.path
from subprocess import Popen, PIPE
import sys
from threading import Thread
from urllib.parse import urlsplit
from urllib.request import urlretrieve
import venv

class ExtendedEnvBuilder(venv.EnvBuilder):
    """
    This builder installs setuptools and pip so that you can pip or
    easy_install other packages into the created virtual environment.

    :param nodist: If true, setuptools and pip are not installed into the
                   created virtual environment.
    :param nopip: If true, pip is not installed into the created
                  virtual environment.
    :param progress: If setuptools or pip are installed, the progress of the
                     installation can be monitored by passing a progress
                     callable. If specified, it is called with two
                     arguments: a string indicating some progress, and a
                     context indicating where the string is coming from.
                     The context argument can have one of three values:
                     'main', indicating that it is called from virtualize()
                     itself, and 'stdout' and 'stderr', which are obtained
                     by reading lines from the output streams of a subprocess
                     which is used to install the app.

                     If a callable is not specified, default progress
                     information is output to sys.stderr.
    """

    def __init__(self, *args, **kwargs):
        self.nodist = kwargs.pop('nodist', False)
        self.nopip = kwargs.pop('nopip', False)
        self.progress = kwargs.pop('progress', None)
        self.verbose = kwargs.pop('verbose', False)
        super().__init__(*args, **kwargs)

    def post_setup(self, context):
        """
        Set up any packages which need to be pre-installed into the
        virtual environment being created.

        :param context: The information for the virtual environment
                        creation request being processed.
        """
        os.environ['VIRTUAL_ENV'] = context.env_dir
        if not self.nodist:
            self.install_setuptools(context)
        # Can't install pip without setuptools
        if not self.nopip and not self.nodist:
            self.install_pip(context)

    def reader(self, stream, context):
        """
        Read lines from a subprocess' output stream and either pass to a progress
        callable (if specified) or write progress information to sys.stderr.
        """
        progress = self.progress
        while True:
            s = stream.readline()
            if not s:
                break
            if progress is not None:
                progress(s, context)
            else:
                if not self.verbose:
                    sys.stderr.write('.')
                else:
                    sys.stderr.write(s.decode('utf-8'))
                sys.stderr.flush()
        stream.close()

    def install_script(self, context, name, url):
        _, _, path, _, _ = urlsplit(url)
        fn = os.path.split(path)[-1]
        binpath = context.bin_path
        distpath = os.path.join(binpath, fn)
        # Download script into the virtual environment's binaries folder
        urlretrieve(url, distpath)
        progress = self.progress
        if self.verbose:
            term = '\n'
        else:
            term = '@w{'}
        if progress is not None:
            progress('Installing %s ...%s' % (name, term), 'main')
        else:
            sys.stderr.write('Installing %s ...%s' % (name, term))
            sys.stderr.flush()
        # Install in the virtual environment
        args = [context.env_exe, fn]
        p = Popen(args, stdout=PIPE, stderr=PIPE, cwd=binpath)
        t1 = Thread(target=self.reader, args=(p.stdout, 'stdout'))
        t1.start()
        t2 = Thread(target=self.reader, args=(p.stderr, 'stderr'))
        t2.start()
        p.wait()
        t1.join()
        t2.join()
        if progress is not None:
            progress('done.', 'main')
        else:
            sys.stderr.write('done.\n')
        # Clean up - no longer needed
        os.unlink(distpath)

    def install_setuptools(self, context):
        """
        Install setuptools in the virtual environment.

        :param context: The information for the virtual environment
                        creation request being processed.
        """
        url = "https://bootstrap.pypa.io/ez_setup.py"
        self.install_script(context, 'setuptools', url)
        # clear up the setuptools archive which gets downloaded
        pred = lambda o: o.startswith('setuptools-') and o.endswith('.tar.gz')
        files = filter(pred, os.listdir(context.bin_path))
        for f in files:
            f = os.path.join(context.bin_path, f)
            os.unlink(f)

    def install_pip(self, context):
        """
        Install pip in the virtual environment.

        :param context: The information for the virtual environment
                        creation request being processed.
        """
        url = 'https://bootstrap.pypa.io/get-pip.py'
        self.install_script(context, 'pip', url)


def main(args=None):
    import argparse

    parser = argparse.ArgumentParser(prog=__name__,
                                     description='Creates virtual Python '
                                                 'environments in one or '
                                                 'more target '
                                                 'directories.')
    parser.add_argument('dirs', metavar='ENV_DIR', nargs='+',
                        help='A directory in which to create the '
                             'virtual environment.')
    parser.add_argument('--no-setuptools', default=False,
                        action='store_true', dest='nodist',
                        help="Don't install setuptools or pip in the "
                             "virtual environment.")
    parser.add_argument('--no-pip', default=False,
                        action='store_true', dest='nopip',
                        help="Don't install pip in the virtual "
                             "environment.")
    parser.add_argument('--system-site-packages', default=False,
                        action='store_true', dest='system_site',
                        help='Give the virtual environment access to the '
                             'system site-packages dir.')
    if os.name == 'nt':
        use_symlinks = False
    else:
        use_symlinks = True
    parser.add_argument('--symlinks', default=use_symlinks,
                        action='store_true', dest='symlinks',
                        help='Try to use symlinks rather than copies, '
                             'when symlinks are not the default for '
                             'the platform.')
    parser.add_argument('--clear', default=False, action='store_true',
                        dest='clear', help='Delete the contents of the '
                                           'virtual environment '
                                           'directory if it already '
                                           'exists, before virtual '
                                           'environment creation.')
    parser.add_argument('--upgrade', default=False, action='store_true',
                        dest='upgrade', help='Upgrade the virtual '
                                             'environment directory to '
                                             'use this version of '
                                             'Python, assuming Python '
                                             'has been upgraded '
                                             'in-place.')
    parser.add_argument('--verbose', default=False, action='store_true',
                        dest='verbose', help='Display the output '
                                             'from the scripts which '
                                             'install setuptools and pip.')
    options = parser.parse_args(args)
    if options.upgrade and options.clear:
        raise ValueError('you cannot supply --upgrade and --clear together.')
    builder = ExtendedEnvBuilder(system_site_packages=options.system_site,
                                   clear=options.clear,
                                   symlinks=options.symlinks,
                                   upgrade=options.upgrade,
                                   nodist=options.nodist,
                                   nopip=options.nopip,
                                   verbose=options.verbose)
    for d in options.dirs:
        builder.create(d)

if __name__ == '__main__':
    rc = 1
    try:
        main()
        rc = 0
    except Exception as e:
        print('Error: %s' % e, file=sys.stderr)
    sys.exit(rc)
@end example

이 스크립트는 온라인@footnote{https://gist.github.com/vsajip/4673395}에서 내려받을 수도 있습니다.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node zipapp — 실행 가능한 파이썬 zip 아카이브 관리,,venv — 가상 환경 생성,소프트웨어 패키징 및 배포
@anchor{library/zipapp doc}@anchor{490c}@anchor{library/zipapp module-zipapp}@anchor{136}@anchor{library/zipapp translation-repo}@anchor{490d}@anchor{library/zipapp zipapp-manage-executable-python-zip-archives}@anchor{490e}
@subsection @code{zipapp} — 실행 가능한 파이썬 zip 아카이브 관리


@geindex module; zipapp


Added in version 3.5.


`소스 코드:' Lib/zipapp.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/zipapp.py}

@geindex 실행 가능한 Zip 파일


__________________________________________________________________


이 모듈은 @ref{2118,,파이썬 인터프리터가 직접 실행할} 수 있는 파이썬 코드를 포함하는 zip 파일 생성을 관리하는 도구를 제공합니다. 이 모듈은 @ref{490f,,명령 줄 인터페이스}와 @ref{4910,,파이썬 API}를 모두 제공합니다.

@menu
* 기본 예: 기본 예<2>. 
* 명령 줄 인터페이스: 명령 줄 인터페이스<3>. 
* 파이썬 API:: 
* 예: 예<16>. 
* 인터프리터 지정하기:: 
* zipapp으로 독립형 응용 프로그램 만들기:: 
* 파이썬 Zip 응용 프로그램 아카이브 형식:: 

@end menu

@node 기본 예<2>,명령 줄 인터페이스<3>,,zipapp — 실행 가능한 파이썬 zip 아카이브 관리
@anchor{library/zipapp basic-example}@anchor{4911}
@subsubsection 기본 예


다음 예제는 @ref{490f,,명령 줄 인터페이스}를 사용하여 파이썬 코드가 포함된 디렉터리에서 실행 가능 아카이브를 만드는 방법을 보여줍니다. 실행하면, 아카이브가 아카이브의 모듈 @code{myapp}에서 @code{main} 함수를 실행합니다.

@example
$ python -m zipapp myapp -m "myapp:main"
$ python myapp.pyz
<output from myapp>
@end example

@node 명령 줄 인터페이스<3>,파이썬 API,기본 예<2>,zipapp — 실행 가능한 파이썬 zip 아카이브 관리
@anchor{library/zipapp command-line-interface}@anchor{4912}@anchor{library/zipapp zipapp-command-line-interface}@anchor{490f}
@subsubsection 명령 줄 인터페이스


명령 줄에서 프로그램으로 호출될 때, 다음 형식이 사용됩니다:

@example
$ python -m zipapp source [options]
@end example

`source'가 디렉터리면, `source'의 내용으로부터 아카이브를 만듭니다. `source'가 파일이면, 아카이브여야 하며, 대상 아카이브로 복사됩니다 (또는 –info 옵션이 지정되면 셔뱅(shebang) 줄의 내용이 표시됩니다).

다음과 같은 옵션이 이해됩니다:

@geindex zipapp 명령줄 옵션; -o
@geindex zipapp 명령줄 옵션; --output
@anchor{library/zipapp cmdoption-zipapp-o}@anchor{4913}@anchor{library/zipapp cmdoption-zipapp-output}@anchor{4914}
@deffn {Option} @w{-}o <output>, @w{-}@w{-}output=<output>

출력을 `output'이라는 이름의 파일에 씁니다. 이 옵션을 지정하지 않으면, 출력 파일명은 입력 `source'와 같고, 확장자 @code{.pyz}가 추가됩니다. 명시적인 파일명이 제공되면, 그대로 사용됩니다 (그래서 필요하면 @code{.pyz} 확장자를 포함해야 합니다).

`source'가 아카이브이면 반드시 출력 파일명을 지정해야 합니다 (그리고 이 경우, `output'은 `source'와 달라야 합니다).
@end deffn

@geindex zipapp 명령줄 옵션; -p
@geindex zipapp 명령줄 옵션; --python
@anchor{library/zipapp cmdoption-zipapp-p}@anchor{4915}@anchor{library/zipapp cmdoption-zipapp-python}@anchor{4916}
@deffn {Option} @w{-}p <interpreter>, @w{-}@w{-}python=<interpreter>

실행할 명령으로 `interpreter'를 지정하여 @code{#!} 줄을 아카이브에 추가합니다. 또한, POSIX에서, 아카이브를 실행 파일로 만듭니다. 기본값은 @code{#!} 줄을 쓰지 않고, 파일을 실행 파일로 만들지 않는 것입니다.
@end deffn

@geindex zipapp 명령줄 옵션; -m
@geindex zipapp 명령줄 옵션; --main
@anchor{library/zipapp cmdoption-zipapp-m}@anchor{4917}@anchor{library/zipapp cmdoption-zipapp-main}@anchor{4918}
@deffn {Option} @w{-}m <mainfn>, @w{-}@w{-}main=<mainfn>

아카이브에 `mainfn'을 실행하는 @code{__main__.py} 파일을 씁니다. `mainfn' 인자는 “pkg.mod:fn” 형식이어야 합니다. 여기서 “pkg.mod”는 아카이브의 패키지/모듈이며, “fn”은 주어진 모듈에 있는 콜러블입니다. @code{__main__.py} 파일은 그 콜러블을 실행합니다.

아카이브를 복사할 때 @ref{4917,,--main}을 지정할 수 없습니다.
@end deffn

@geindex zipapp 명령줄 옵션; -c
@geindex zipapp 명령줄 옵션; --compress
@anchor{library/zipapp cmdoption-zipapp-c}@anchor{4919}@anchor{library/zipapp cmdoption-zipapp-compress}@anchor{491a}
@deffn {Option} @w{-}c, @w{-}@w{-}compress

디플레이트(deflate) 메서드로 파일을 압축하여, 출력 파일의 크기를 줄입니다. 기본적으로, 파일은 아카이브에 압축되지 않은 상태로 저장됩니다.

아카이브를 복사할 때 @ref{4919,,--compress}는 효과가 없습니다.


Added in version 3.7.

@end deffn

@geindex zipapp 명령줄 옵션; --info
@anchor{library/zipapp cmdoption-zipapp-info}@anchor{491b}
@deffn {Option} @w{-}@w{-}info

진단 목적으로, 아카이브에 내장된 인터프리터를 표시합니다. 이 경우, 다른 옵션은 무시되고 SOURCE는 디렉터리가 아닌 아카이브여야 합니다.
@end deffn

@geindex zipapp 명령줄 옵션; -h
@geindex zipapp 명령줄 옵션; --help
@anchor{library/zipapp cmdoption-zipapp-h}@anchor{491c}@anchor{library/zipapp cmdoption-zipapp-help}@anchor{491d}
@deffn {Option} @w{-}h, @w{-}@w{-}help

간단한 사용법 메시지를 인쇄하고 종료합니다.
@end deffn

@node 파이썬 API,예<16>,명령 줄 인터페이스<3>,zipapp — 실행 가능한 파이썬 zip 아카이브 관리
@anchor{library/zipapp python-api}@anchor{491e}@anchor{library/zipapp zipapp-python-api}@anchor{4910}
@subsubsection 파이썬 API


이 모듈은 두 개의 편의 함수를 정의합니다:

@geindex create_archive() (zipapp 모듈)
@anchor{library/zipapp zipapp create_archive}@anchor{da8}
@deffn {함수} zipapp.create_archive (source, target=None, interpreter=None, main=None, filter=None, compressed=False)

`source'로 응용 프로그램 아카이브를 만듭니다. 소스는 다음 중 하나일 수 있습니다:


@itemize *

@item 
디렉터리 이름, 또는 디렉터리를 참조하는 @ref{5a0,,경로류 객체}. 이 경우 해당 디렉터리의 내용으로 새 응용 프로그램 아카이브가 만들어집니다.

@item 
기존 응용 프로그램 아카이브 파일의 이름, 또는 이러한 파일을 참조하는 @ref{5a0,,경로류 객체}. 이 경우 파일이 대상(target)으로 복사됩니다 (`interpreter' 인자에 제공된 값을 반영하도록 수정하면서). 필요하면, 파일 이름에 @code{.pyz} 확장자가 포함되어야 합니다.

@item 
바이너리 모드에서 읽기로 열린 파일 객체. 파일의 내용은 응용 프로그램 아카이브여야 하며, 파일 객체는 아카이브의 시작 부분에 위치한 것으로 가정합니다.
@end itemize

`target' 인자는 결과 아카이브가 기록될 위치를 결정합니다:


@itemize *

@item 
파일 이름이거나 @ref{5a0,,경로류 객체}이면, 아카이브가 그 파일에 기록됩니다.

@item 
열린 파일 객체면, 그 파일 객체에 아카이브가 기록되며, 파일은 바이너리 모드로 쓰기로 열려 있어야 합니다.

@item 
target이 생략되면 (또는 @code{None}이면), 소스(source)는 디렉터리여야 하며 대상은 @code{.pyz} 확장자가 추가된 소스와 이름이 같은 파일이 됩니다.
@end itemize

`interpreter' 인자는 아카이브가 실행될 파이썬 인터프리터의 이름을 지정합니다. 아카이브 시작 부분에 “셔뱅(shebang)” 줄로 기록됩니다. POSIX에서는 이를 OS가 해석하고, 윈도우에서는 파이썬 런처가 이를 처리합니다. `interpreter'를 생략하면 셔뱅 줄이 기록되지 않습니다. interpreter가 지정되고 target이 파일명이면, target 파일의 실행 가능 비트가 설정됩니다.

`main' 인자는 아카이브의 메인 프로그램으로 사용될 콜러블의 이름을 지정합니다. 소스가 디렉터리이고 소스에 아직 @code{__main__.py} 파일이 없을 때만 지정할 수 있습니다. `main' 인자는 “pkg.module:callable” 형식이어야 하며 아카이브는 “pkg.module”을 임포트 하고 인자 없이 지정된 콜러블을 실행해서 실행됩니다. 소스가 디렉터리이고 @code{__main__.py} 파일을 포함하지 않을 때 `main'을 생략하는 것은 에러입니다, 그렇지 않으면 결과 아카이브가 실행 가능하지 않기 때문입니다.

선택적 `filter' 인자는 추가되는 파일의 (소스 디렉터리에 상대적인) 경로를 나타내는 Path 객체가 전달되는 콜백 함수를 지정합니다. 파일을 추가하려면 @code{True}를 반환해야 합니다.

선택적 `compressed' 인자는 파일을 압축할지를 결정합니다. @code{True}로 설정하면, 아카이브의 파일이 디플레이트(deflate) 메서드로 압축됩니다; 그렇지 않으면 파일이 압축되지 않은 상태로 저장됩니다. 기존 아카이브를 복사할 때는 이 인자가 효과가 없습니다.

`source'나 `target'에 파일 객체가 지정되면, create_archive를 호출한 후 파일 객체를 닫는 것은 호출자의 책임입니다.

기존 아카이브를 복사할 때, 제공된 파일 객체에는 @code{read}와 @code{readline} 또는 @code{write} 메서드만 필요합니다. 디렉터리에서 아카이브를 만들 때, 대상이 파일 객체면 @code{zipfile.ZipFile} 클래스로 전달되며, 해당 클래스에 필요한 메서드를 제공해야 합니다.


버전 3.7에서 변경: `filter'와 `compressed' 매개 변수를 추가했습니다.

@end deffn

@geindex get_interpreter() (zipapp 모듈)
@anchor{library/zipapp zipapp get_interpreter}@anchor{491f}
@deffn {함수} zipapp.get_interpreter (archive)

아카이브 시작 부분에서 @code{#!} 줄에 지정된 인터프리터를 반환합니다. @code{#!} 줄이 없으면, @ref{884,,None}을 반환합니다. `archive' 인자는 파일명이나 바이너리 모드로 읽기로 열린 파일류 객체일 수 있습니다. 아카이브가 시작 부분에 위치한 것으로 가정합니다.
@end deffn

@node 예<16>,인터프리터 지정하기,파이썬 API,zipapp — 실행 가능한 파이썬 zip 아카이브 관리
@anchor{library/zipapp examples}@anchor{4920}@anchor{library/zipapp zipapp-examples}@anchor{4921}
@subsubsection 예


디렉터리를 아카이브로 패킹하고, 실행합니다.

@example
$ python -m zipapp myapp
$ python myapp.pyz
<output from myapp>
@end example

@ref{da8,,create_archive()} 함수를 사용하여 같은 작업을 수행할 수 있습니다:

@example
>>> import zipapp
>>> zipapp.create_archive('myapp', 'myapp.pyz')
@end example

POSIX에서 응용 프로그램을 직접 실행할 수 있게 만들려면, 사용할 인터프리터를 지정하십시오.

@example
$ python -m zipapp myapp -p "/usr/bin/env python"
$ ./myapp.pyz
<output from myapp>
@end example

기존 아카이브에서 셔뱅 줄을 바꾸려면, @ref{da8,,create_archive()} 함수를 사용하여 수정된 아카이브를 만드십시오:

@example
>>> import zipapp
>>> zipapp.create_archive('old_archive.pyz', 'new_archive.pyz', '/usr/bin/python3')
@end example

파일을 제자리에서 갱신하려면, @ref{10a3,,BytesIO} 객체를 사용하여 메모리에서 치환을 수행한 다음, 나중에 소스를 덮어씁니다. 파일을 제자리에서 덮어쓰면 에러로 인해 원본 파일을 손실할 위험이 있음에 유의하십시오. 이 코드는 이러한 에러에 대한 보호는 없지만, 프로덕션 코드는 이를 방지해야 합니다. 또한, 이 방법은 아카이브가 메모리에 올라올 수 있을 때만 작동합니다:

@example
>>> import zipapp
>>> import io
>>> temp = io.BytesIO()
>>> zipapp.create_archive('myapp.pyz', temp, '/usr/bin/python2')
>>> with open('myapp.pyz', 'wb') as f:
>>>     f.write(temp.getvalue())
@end example

@node 인터프리터 지정하기,zipapp으로 독립형 응용 프로그램 만들기,예<16>,zipapp — 실행 가능한 파이썬 zip 아카이브 관리
@anchor{library/zipapp specifying-the-interpreter}@anchor{4922}@anchor{library/zipapp zipapp-specifying-the-interpreter}@anchor{4923}
@subsubsection 인터프리터 지정하기


인터프리터를 지정한 다음 응용 프로그램 아카이브를 배포한다면, 사용된 인터프리터가 이식성 있는지 확인할 필요가 있음에 유의하십시오. 윈도우 용 파이썬 런처는 가장 일반적인 POSIX @code{#!} 줄 형식을 지원하지만, 고려해야 할 다른 문제가 있습니다:


@itemize *

@item 
“/usr/bin/env python”(또는 “/usr/bin/python”과 같은 “python” 명령의 다른 형식)을 사용한다면, 사용자에게 기본적으로 파이썬 2나 파이썬 3이 있을 수 있음을 고려해야 하고, 두 버전에서 작동하도록 코드를 작성하십시오.

@item 
“/usr/bin/env python3”과 같이 명시적인 버전을 사용하면 해당 버전이 없는 사용자에게는 응용 프로그램이 작동하지 않습니다. (여러분의 코드를 파이썬 2 호환으로 만들지 않았다면 이것이 여러분이 원하는 것일 수 있습니다).

@item 
“파이썬 X.Y 이상”이라고 말할 방법이 없어서, “/usr/bin/env python3.4”처럼 정확한 버전을 사용할 때는 주의하십시오. 예를 들어 파이썬 3.5 사용자를 위해서는 셔뱅 줄을 변경해야 합니다.
@end itemize

일반적으로, 여러분의 코드가 파이썬 2나 3중 어느 것으로 작성되었는지에 따라 “/usr/bin/env python2”나 “/usr/bin/env python3”을 사용해야 합니다.

@node zipapp으로 독립형 응용 프로그램 만들기,파이썬 Zip 응용 프로그램 아카이브 형식,인터프리터 지정하기,zipapp — 실행 가능한 파이썬 zip 아카이브 관리
@anchor{library/zipapp creating-standalone-applications-with-zipapp}@anchor{4924}
@subsubsection zipapp으로 독립형 응용 프로그램 만들기


Using the @code{zipapp} module, it is possible to create self-contained Python
programs, which can be distributed to end users who only need to have a
suitable version of Python installed on their system.  The key to doing this
is to bundle all of the application’s dependencies into the archive, along
with the application code.

독립형 아카이브를 만드는 단계는 다음과 같습니다:


@enumerate 

@item 
정상적으로 디렉터리에 응용 프로그램을 만드십시오, 그러면 @code{__main__.py} 파일과 모든 지원 응용 프로그램 코드를 포함하는 @code{myapp} 디렉터리를 얻게 됩니다.

@item 
pip을 사용하여 모든 응용 프로그램의 종속성을 @code{myapp} 디렉터리에 설치하십시오:

@example
$ python -m pip install -r requirements.txt --target myapp
@end example

(이것은 @code{requirements.txt} 파일에 프로젝트 요구 사항이 있다고 가정합니다 - 그렇지 않으면, pip 명령 줄에 종속성을 수동으로 나열할 수 있습니다).

@item 
다음과 같이 응용 프로그램을 패키징하십시오:

@example
$ python -m zipapp -p "interpreter" myapp
@end example
@end enumerate

그러면 독립형 실행 파일이 생성되며, 사용 가능한 적절한 인터프리터가 있는 모든 시스템에서 실행할 수 있습니다. 자세한 내용은 @ref{4923,,인터프리터 지정하기}를 참조하십시오. 단일 파일로 사용자에게 제공될 수 있습니다.

유닉스에서, @code{myapp.pyz} 파일은 그대로 실행 파일입니다. “평범한” 명령 이름을 선호하면, 파일 이름을 변경하여 @code{.pyz} 확장자를 제거할 수 있습니다. 윈도우에서, 파이썬 인터프리터가 설치될 때 @code{.pyz}와 @code{.pyzw} 파일 확장자를 등록한다는 점에서  @code{myapp.pyz[w]} 파일은 실행 파일입니다.

@menu
* 경고: 경고<3>. 

@end menu

@node 경고<3>,,,zipapp으로 독립형 응용 프로그램 만들기
@anchor{library/zipapp caveats}@anchor{4925}
@subsubsection 경고


응용 프로그램이 C 확장을 포함하는 패키지에 의존하면, 해당 패키지는 zip 파일에서 실행할 수 없습니다 (이것은 OS 제한 사항인데, OS 로더가 로드 할 수 있으려면 실행 코드는 파일 시스템에 있어야만 합니다). 이 경우, zip 파일에서 해당 종속성을 제외하고, 사용자가 파일을 설치하도록 요구하거나, zip 파일과 함께 제공하고 @code{__main__.py}에 코드를 추가하여 @code{sys.path}에 압축 해제된 모듈을 포함하는 디렉터리를 포함할 수 있습니다. 이 경우, 대상 아키텍처에 적합한 바이너리를 제공해야 합니다 (그리고 아마도 사용자 컴퓨터를 기반으로 실행 시간에 @code{sys.path}에 추가할 올바른 버전을 선택해야 합니다).

@node 파이썬 Zip 응용 프로그램 아카이브 형식,,zipapp으로 독립형 응용 프로그램 만들기,zipapp — 실행 가능한 파이썬 zip 아카이브 관리
@anchor{library/zipapp the-python-zip-application-archive-format}@anchor{4926}
@subsubsection 파이썬 Zip 응용 프로그램 아카이브 형식


파이썬은 버전 2.6부터 @code{__main__.py} 파일이 포함된 zip 파일을 실행할 수 있었습니다. 파이썬에서 실행되려면, 응용 프로그램 아카이브는 응용 프로그램의 진입점으로 실행될 @code{__main__.py} 파일이 포함된 표준 zip 파일이어야 합니다. 모든 파이썬 스크립트와 마찬가지로, 스크립트의 부모(이 경우 zip 파일)가 @ref{3e4,,sys.path}에 배치되므로 zip 파일에서 추가 모듈을 임포트 할 수 있습니다.

zip 파일 형식은 임의의 데이터를 zip 파일 앞에 추가할 수 있도록 합니다. zip 응용 프로그램 형식은 이 기능을 사용하여 표준 POSIX “셔뱅(shebang)” 줄을 파일 앞에 추가합니다 (@code{#!/path/to/interpreter}).

따라서 공식적으로 파이썬 zip 응용 프로그램 형식은 다음과 같습니다:


@enumerate 

@item 
문자 @code{b'#!'}, 인터프리터 이름, 개행 (@code{b'\n'}) 문자를 포함하는 선택적 셔뱅(shebang) 줄. 인터프리터 이름은 OS “셔뱅” 처리가 허용하는 모든 것, 또는 윈도우의 파이썬 런처일 수 있습니다. 인터프리터는 윈도우에서는 UTF-8로, POSIX에서는 @ref{e52,,sys.getfilesystemencoding()}으로 인코딩되어야 합니다.

@item 
@ref{137,,zipfile} 모듈에 의해 생성된 표준 zip 파일 데이터. zipfile 내용은 `반드시' @code{__main__.py}라는 파일을 포함해야 합니다 (zip 파일의 “루트”에 있어야 합니다 - 즉, 서브 디렉터리에 있을 수 없습니다). zip 파일 데이터는 압축되거나 그렇지 않을 수 있습니다.
@end enumerate

응용 프로그램 아카이브에 셔뱅 줄이 있으면, POSIX 시스템에서 직접 실행될 수 있도록 실행 파일 비트를 설정할 수 있습니다.

이 모듈의 도구를 사용하여 응용 프로그램 아카이브를 만들 필요는 없습니다 - 모듈은 편의를 위한 것입니다. 하지만 어떤 방법으로 만들었든 위 형식의 아카이브는 파이썬에서 허용됩니다.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 파이썬 실행시간 서비스,사용자 정의 파이썬 인터프리터,소프트웨어 패키징 및 배포,파이썬 표준 라이브러리
@anchor{library/python doc}@anchor{4927}@anchor{library/python python}@anchor{4928}@anchor{library/python python-runtime-services}@anchor{4929}@anchor{library/python translation-repo}@anchor{492a}
@section 파이썬 실행시간 서비스


이 장에서 설명하는 모듈들은 파이썬 인터프리터와 그 환경과의 상호 작용과 관련된 다양한 서비스를 제공합니다. 다음은 개요입니다:

@menu
* sys — 시스템 특정 파라미터와 함수:: 
* sys.monitoring — Execution event monitoring: sys monitoring — Execution event monitoring. 
* sysconfig — 파이썬의 구성 정보에 접근하기:: 
* builtins — 내장 객체:: 
* __main__ — 최상위 코드 환경:: 
* warnings — 경고 제어:: 
* dataclasses — 데이터 클래스:: 
* contextlib — with 문 컨텍스트를 위한 유틸리티:: 
* abc — 추상 베이스 클래스:: 
* atexit — 종료 처리기:: 
* traceback — 스택 트레이스백 인쇄와 조회:: 
* __future__ — 퓨처 문 정의:: 
* gc — 가비지 수거기 인터페이스:: 
* inspect — 라이브 객체 검사:: 
* annotationlib — Functionality for introspecting annotations:: 
* site — 사이트별 구성 훅:: 

@end menu

@node sys — 시스템 특정 파라미터와 함수,sys monitoring — Execution event monitoring,,파이썬 실행시간 서비스
@anchor{library/sys doc}@anchor{492b}@anchor{library/sys module-sys}@anchor{df}@anchor{library/sys sys-system-specific-parameters-and-functions}@anchor{492c}
@subsection @code{sys} — 시스템 특정 파라미터와 함수


@geindex module; sys


__________________________________________________________________


이 모듈은 인터프리터에 의해 사용되거나 유지되는 일부 변수와 인터프리터와 강하게 상호 작용하는 함수에 대한 액세스를 제공합니다. 항상 사용 가능합니다. 명시적으로 달리 언급하지 않는 한, 모든 변수는 읽기 전용입니다.

@geindex abiflags (sys 모듈)
@anchor{library/sys sys abiflags}@anchor{c58}
@deffn {데이터} sys.abiflags

표준 @code{configure} 스크립트를 사용하여 파이썬을 빌드한 POSIX 시스템에서, 이것은 
@geindex Python 향상 제안; PEP 3149
PEP 3149@footnote{https://peps.python.org/pep-3149/}에 지정된 ABI 플래그를 포함합니다.


Added in version 3.2.



버전 3.8에서 변경: 기본 플래그는 빈 문자열이 되었습니다 (pymalloc을 위한 @code{m} 플래그가 제거되었습니다).


@ref{213c,,가용성}: Unix.
@end deffn

@geindex addaudithook() (sys 모듈)
@anchor{library/sys sys addaudithook}@anchor{478f}
@deffn {함수} sys.addaudithook (hook)

현재 (서브) 인터프리터의 활성 감사 훅 리스트에 콜러블 `hook'을 추가합니다.

@ref{191c,,sys.audit()} 함수를 통해 감사 이벤트가 발생하면, 각 훅은 추가된 순서대로 이벤트 이름과 인자 튜플로 호출됩니다. @ref{4790,,PySys_AddAuditHook()}으로 추가된 네이티브 훅이 먼저 호출되고, 현재 (서브) 인터프리터에서 추가된 훅이 뒤따릅니다. 그런 다음 훅은 이벤트를 로그 하거나, 예외를 발생 시켜 연산을 중단하거나, 프로세스를 완전히 종료 할 수 있습니다.

Note that audit hooks are primarily for collecting information about internal
or otherwise unobservable actions, whether by Python or libraries written in
Python. They are not suitable for implementing a “sandbox”. In particular,
malicious code can trivially disable or bypass hooks added using this
function. At a minimum, any security-sensitive hooks must be added using the
C API @ref{4790,,PySys_AddAuditHook()} before initialising the runtime, and any
modules allowing arbitrary memory modification (such as @ref{2e,,ctypes}) should
be completely removed or closely monitored.

@ref{478f,,sys.addaudithook()}을 호출하면 스스로 인자 없이 @code{sys.addaudithook}이라는 이름의 감사 이벤트를 발생시킵니다. 기존 훅에서 @ref{244,,RuntimeError}에서 파생된 예외가 발생하면, 새 훅이 추가되지 않고 예외가 억제됩니다. 결과적으로, 호출자는 기존의 모든 훅을 제어하지 않는 한 훅이 추가되었다고 가정할 수 없습니다.

CPython이 발생시키는 모든 이벤트에 대해서는 @ref{1c11,,감사 이벤트 표}를, 원래 디자인 논의는 
@geindex Python 향상 제안; PEP 578
PEP 578@footnote{https://peps.python.org/pep-0578/}을 참조하십시오.


Added in version 3.8.



버전 3.8.1에서 변경: @ref{bcc,,Exception}에서 파생되었지만 @ref{244,,RuntimeError}가 아닌 예외는 더는 억제되지 않습니다.


추적(tracing)이 활성화되었을 때 (@ref{2e1,,settrace()}를 참조하십시오), 파이썬 훅은 콜러블에 참값으로 설정된 @code{__cantrace__} 멤버가 있을 때만 추적합니다. 그렇지 않으면, 추적 함수는 훅을 건너뜁니다.
@end deffn

@geindex argv (sys 모듈)
@anchor{library/sys sys argv}@anchor{1469}
@deffn {데이터} sys.argv

파이썬 스크립트에 전달된 명령 줄 인자 리스트. @code{argv[0]}은 스크립트 이름입니다 (전체 경로명인지는 운영 체제에 따라 다릅니다). 인터프리터에 @ref{1a8,,-c} 명령 줄 옵션을 사용하여 명령이 실행되었으면, @code{argv[0]}은 문자열 @code{'-c'}로 설정됩니다. 파이썬 인터프리터에 스크립트 이름이 전달되지 않으면, @code{argv[0]}은 빈 문자열입니다.

표준 입력이나 명령 줄에 제공된 파일 목록을 루핑 하려면, @ref{5f,,fileinput} 모듈을 참조하십시오.

See also @ref{a41,,sys.orig_argv}.

@cartouche
@quotation 참고 
유닉스에서, 명령 줄 인자는 OS에서 바이트열로 전달됩니다. 파이썬은 이것들을 파일 시스템 인코딩과 “surrogateescape” 에러 처리기로 디코딩합니다. 원본 바이트열이 필요할 때, @code{[os.fsencode(arg) for arg in sys.argv]}로 얻을 수 있습니다.
@end quotation
@end cartouche
@end deffn

@geindex audit() (sys 모듈)
@anchor{library/sys auditing}@anchor{1c6c}@anchor{library/sys sys audit}@anchor{191c}
@deffn {함수} sys.audit (event, *args)

@geindex 감사

활성 감사 훅으로 감사 이벤트를 발생시킵니다. `event'는 이벤트를 식별하는 문자열이고, `args'는 이벤트에 대한 추가 정보를 갖는 선택적 인자를 포함할 수 있습니다. 주어진 이벤트에 대한 인자의 수와 형은 공개된 안정 API로 간주하며 배포 간에 수정되지 않아야 합니다.

예를 들어, 한 감사 이벤트의 이름은 @code{os.chdir}입니다. 이 이벤트에는 요청된 새 작업 디렉터리를 포함하는 `path'라는 인자가 하나 있습니다.

@ref{191c,,sys.audit()}는 이벤트 이름과 인자들을 전달하여 기존 감사 훅들을 호출하고, 어떤 훅에서건 발생한 첫 번째 예외를 발생시킵니다. 일반적으로, 예외가 발생하면, 처리되지 않아야 하며 가능한 한 빨리 프로세스를 종료해야 합니다. 이렇게 하면 훅 구현이 특정 이벤트에 반응하는 방법을 결정할 수 있습니다: 단순히 이벤트를 로그 하거나 예외를 발생 시켜 연산을 중단 할 수 있습니다.

훅은 @ref{478f,,sys.addaudithook()}이나 @ref{4790,,PySys_AddAuditHook()} 함수를 사용하여 추가됩니다.

이 함수의 네이티브 동등 물은 @ref{611,,PySys_Audit()}입니다. 가능하면 네이티브 함수를 사용하는 것이 좋습니다.

CPython이 발생시키는 모든 이벤트에 대해서는 @ref{1c11,,감사 이벤트 표}를 참조하십시오.


Added in version 3.8.

@end deffn

@geindex base_exec_prefix (sys 모듈)
@anchor{library/sys sys base_exec_prefix}@anchor{3ea}
@deffn {데이터} sys.base_exec_prefix

Equivalent to @ref{3eb,,exec_prefix}, but referring to the base Python installation.

When running under @ref{48f2,,Virtual Environments},
@ref{3eb,,exec_prefix} gets overwritten to the virtual environment prefix.
@code{base_exec_prefix}, conversely, does not change, and always points to
the base Python installation.
Refer to @ref{48f2,,Virtual Environments} for more information.


Added in version 3.3.

@end deffn

@geindex base_prefix (sys 모듈)
@anchor{library/sys sys base_prefix}@anchor{3e6}
@deffn {데이터} sys.base_prefix

Equivalent to @ref{3e7,,prefix}, but referring to the base Python installation.

When running under @ref{3e8,,virtual environment},
@ref{3e7,,prefix} gets overwritten to the virtual environment prefix.
@code{base_prefix}, conversely, does not change, and always points to
the base Python installation.
Refer to @ref{48f2,,Virtual Environments} for more information.


Added in version 3.3.

@end deffn

@geindex byteorder (sys 모듈)
@anchor{library/sys sys byteorder}@anchor{25f8}
@deffn {데이터} sys.byteorder

네이티브 바이트 순서의 표시기. 이는 빅 엔디안(최상위 바이트 먼저) 플랫폼에서 @code{'big'} 값을, 리틀 엔디안(최하위 바이트 먼저) 플랫폼에서 @code{'little'}을 갖습니다.
@end deffn

@geindex builtin_module_names (sys 모듈)
@anchor{library/sys sys builtin_module_names}@anchor{2045}
@deffn {데이터} sys.builtin_module_names

이 파이썬 인터프리터로 컴파일된 모든 모듈의 이름을 포함하는 문자열의 튜플. (이 정보는 다른 방법으로는 얻을 수 없습니다 — @code{modules.keys()}는 임포트 된 모듈만 나열합니다.)

See also the @ref{a42,,sys.stdlib_module_names} list.
@end deffn

@geindex call_tracing() (sys 모듈)
@anchor{library/sys sys call_tracing}@anchor{1bc1}
@deffn {함수} sys.call_tracing (func, args)

추적이 활성화된 동안, @code{func(*args)}를 호출합니다. 추적 상태가 저장되고, 나중에 복원됩니다. 이것은 체크 포인트에서 디버거에서 호출되어 다른 코드를 재귀적으로 디버깅이나 프로파일링하기 위한 것입니다.

Tracing is suspended while calling a tracing function set by
@ref{2e1,,settrace()} or @ref{1703,,setprofile()} to avoid infinite recursion.
@code{call_tracing()} enables explicit recursion of the tracing function.
@end deffn

@geindex copyright (sys 모듈)
@anchor{library/sys sys copyright}@anchor{492d}
@deffn {데이터} sys.copyright

파이썬 인터프리터와 관련된 저작권이 포함된 문자열.
@end deffn

@geindex _clear_type_cache() (sys 모듈)
@anchor{library/sys sys _clear_type_cache}@anchor{292}
@deffn {함수} sys._clear_type_cache ()

내부 형 캐시를 지웁니다. 형 캐시는 어트리뷰트와 메서드 조회 속도를 높이는 데 사용됩니다. 참조 누수 디버깅 중에 불필요한 참조를 제거하기 위해서 `만' 이 함수를 사용하십시오.

이 함수는 내부와 특수 목적으로만 사용해야 합니다.


버전 3.13부터 폐지됨: Use the more general @ref{364,,_clear_internal_caches()} function instead.

@end deffn

@geindex _clear_internal_caches() (sys 모듈)
@anchor{library/sys sys _clear_internal_caches}@anchor{364}
@deffn {함수} sys._clear_internal_caches ()

Clear all internal performance-related caches. Use this function `only' to
release unnecessary references and memory blocks when hunting for leaks.


Added in version 3.13.

@end deffn

@geindex _current_frames() (sys 모듈)
@anchor{library/sys sys _current_frames}@anchor{1638}
@deffn {함수} sys._current_frames ()

함수가 호출될 때 각 스레드의 식별자를 해당 스레드에서 현재 활성화된 최상위 스택 프레임에 매핑하는 딕셔너리를 반환합니다. @ref{104,,traceback} 모듈의 함수는 이러한 프레임을 주면 호출 스택을 빌드할 수 있음에 유의하십시오.

이것은 교착 상태 디버깅에 가장 유용합니다: 이 함수는 교착 상태에 빠진 스레드의 협력을 필요로하지 않으며, 이러한 스레드의 호출 스택은 교착 상태를 유지하는 한 고정됩니다. 교착 상태가 아닌 스레드에 대해 반환된 프레임은 호출하는 코드가 프레임을 검사할 때까지 해당 스레드의 현재 활동과 관련이 없을 수 있습니다.

이 함수는 내부와 특수 목적으로만 사용해야 합니다.

인자 없이 @ref{1c6c,,감사 이벤트} @code{sys._current_frames}를 발생시킵니다.
@end deffn

@geindex _current_exceptions() (sys 모듈)
@anchor{library/sys sys _current_exceptions}@anchor{6e8}
@deffn {함수} sys._current_exceptions ()

함수가 호출될 때 각 스레드의 식별자를 해당 스레드에서 현재 활성화된 최상위 예외에 매핑하는 딕셔너리를 반환합니다. 스레드가 현재 예외를 처리하고 있지 않으면, 결과 딕셔너리에 포함되지 않습니다.

This is most useful for statistical profiling.

이 함수는 내부와 특수 목적으로만 사용해야 합니다.

인자 없이 @ref{1c6c,,감사 이벤트} @code{sys._current_exceptions}를 발생시킵니다.


버전 3.12에서 변경: Each value in the dictionary is now a single exception instance, rather
than a 3-tuple as returned from @code{sys.exc_info()}.

@end deffn

@geindex breakpointhook() (sys 모듈)
@anchor{library/sys sys breakpointhook}@anchor{cd0}
@deffn {함수} sys.breakpointhook ()

이 훅 함수는 내장 @ref{271,,breakpoint()}에 의해 호출됩니다. 기본적으로, @ref{aa,,pdb} 디버거로 떨어뜨리지만, 다른 함수로 설정하여 사용할 디버거를 선택할 수 있습니다.

이 함수의 서명은 그것이 호출하는 것에 의존합니다. 예를 들어, 기본 바인딩(예를 들어 @code{pdb.set_trace()})에는 인자가 필요하지 않지만, 추가 인자(위치 및/또는 키워드)를 기대하는 함수에 바인딩할 수 있습니다. 내장 @code{breakpoint()} 함수는 @code{*args}와 @code{**kws}를 그대로 전달합니다. @code{breakpointhooks()}가 반환하는 것이 @code{breakpoint()}에서 반환됩니다.

기본 구현은 먼저 환경 변수 
@geindex PYTHONBREAKPOINT
@geindex 환경 변수; PYTHONBREAKPOINT
@ref{cd1,,PYTHONBREAKPOINT}를 참조합니다. 이것이 @code{"0"}으로 설정되면, 이 함수는 즉시 반환합니다; 즉, 아무런 일도 하지 않습니다. 환경 변수가 설정되지 않거나 빈 문자열로 설정되면, @code{pdb.set_trace()}가 호출됩니다. 그렇지 않으면 이 변수는 파이썬의 점으로 표현한 임포트 표기법(예를 들어 @code{package.subpackage.module.function})을 사용하여 실행할 함수의 이름을 지정해야 합니다. 이 경우, @code{package.subpackage.module}이 임포트 되고 결과 모듈에는 @code{function()}이라는 이름의 콜러블이 있어야 합니다. 이것이 @code{*args} 및 @code{**kws}를 전달하여 실행되며, @code{function()}이 반환하는 것을 @code{sys.breakpointhook()}이 내장 @ref{271,,breakpoint()} 함수로 반환합니다.

@geindex PYTHONBREAKPOINT
@geindex 환경 변수; PYTHONBREAKPOINT
@ref{cd1,,PYTHONBREAKPOINT}로 이름이 지정된 콜러블을 임포트 하는 도중에 문제가 발생하면, @ref{4d8,,RuntimeWarning}이 보고되고 중단점은 무시됨에 유의하십시오.

또한 @code{sys.breakpointhook()}이 프로그래밍 방식으로 재정의되면, 
@geindex PYTHONBREAKPOINT
@geindex 환경 변수; PYTHONBREAKPOINT
@ref{cd1,,PYTHONBREAKPOINT}는 참조되지 `않음'에 유의하십시오.


Added in version 3.7.

@end deffn

@geindex _debugmallocstats() (sys 모듈)
@anchor{library/sys sys _debugmallocstats}@anchor{492e}
@deffn {함수} sys._debugmallocstats ()

CPython의 메모리 할당자 상태에 대한 저수준 정보를 stderr에 인쇄합니다.

파이썬이 @ref{508,,디버그 모드로 빌드}되었으면 (@ref{664,,configure --with-pydebug option}), 값비싼 내부 일관성 검사도 수행합니다.


Added in version 3.3.


이 함수는 CPython 전용입니다. 정확한 출력 형식은 여기에 정의되어 있지 않으며, 변경될 수 있습니다.
@end deffn

@geindex dllhandle (sys 모듈)
@anchor{library/sys sys dllhandle}@anchor{492f}
@deffn {데이터} sys.dllhandle

파이썬 DLL의 핸들을 지정하는 정수.

@ref{213c,,가용성}: Windows.
@end deffn

@geindex displayhook() (sys 모듈)
@anchor{library/sys sys displayhook}@anchor{1724}
@deffn {함수} sys.displayhook (value)

`value'가 @code{None}이 아니면, 이 함수는 @code{repr(value)}를 @code{sys.stdout}으로 인쇄하고, `value'를 @code{builtins._}에 저장합니다. @code{repr(value)}를 @code{sys.stdout.errors} 에러 처리기(아마도 @code{'strict'})로 @code{sys.stdout.encoding}으로 인코딩할 수 없으면, @code{'backslashreplace'} 에러 처리기를 사용하여 @code{sys.stdout.encoding}으로 인코딩합니다.

@code{sys.displayhook}은 대화형 파이썬 세션에서 입력한 @ref{23cf,,표현식}을 평가한 결과에 대해 호출됩니다. @code{sys.displayhook}에 다른 1-인자 함수를 대입하여 이러한 값의 표시를 사용자 정의할 수 있습니다.

의사 코드:

@example
def displayhook(value):
    if value is None:
        return
    # 재귀를 방지하기 위해 '_' 를 None으로 설정합니다
    builtins._ = None
    text = repr(value)
    try:
        sys.stdout.write(text)
    except UnicodeEncodeError:
        bytes = text.encode(sys.stdout.encoding, 'backslashreplace')
        if hasattr(sys.stdout, 'buffer'):
            sys.stdout.buffer.write(bytes)
        else:
            text = bytes.decode(sys.stdout.encoding, 'strict')
            sys.stdout.write(text)
    sys.stdout.write("\n")
    builtins._ = value
@end example


버전 3.2에서 변경: @ref{886,,UnicodeEncodeError} 에 @code{'backslashreplace'} 에러 처리기를 사용합니다.

@end deffn

@geindex dont_write_bytecode (sys 모듈)
@anchor{library/sys sys dont_write_bytecode}@anchor{4930}
@deffn {데이터} sys.dont_write_bytecode

이것이 참이면, 파이썬은 소스 모듈을 임포트 할 때 @code{.pyc} 파일을 쓰려고 하지 않습니다. 이 값은 @ref{15d2,,-B} 명령 줄 옵션과 
@geindex PYTHONDONTWRITEBYTECODE
@geindex 환경 변수; PYTHONDONTWRITEBYTECODE
@ref{15d3,,PYTHONDONTWRITEBYTECODE} 환경 변수에 따라 초기에 @code{True}나 @code{False}로 설정되지만, 바이트 코드 파일 생성을 제어하기 위해 직접 설정할 수 있습니다.
@end deffn

@geindex _emscripten_info (sys 모듈)
@anchor{library/sys sys _emscripten_info}@anchor{1b8c}
@deffn {데이터} sys._emscripten_info

A @ref{85d,,named tuple} holding information about the environment on the
`wasm32-emscripten' platform. The named tuple is provisional and may change
in the future.

@geindex emscripten_version (sys._emscripten_info의 속성)
@anchor{library/sys sys _emscripten_info emscripten_version}@anchor{4931}
@deffn {속성} _emscripten_info.emscripten_version

Emscripten version as tuple of ints (major, minor, micro), e.g. @code{(3, 1, 8)}.
@end deffn

@geindex runtime (sys._emscripten_info의 속성)
@anchor{library/sys sys _emscripten_info runtime}@anchor{4932}
@deffn {속성} _emscripten_info.runtime

Runtime string, e.g. browser user agent, @code{'Node.js v14.18.2'}, or @code{'UNKNOWN'}.
@end deffn

@geindex pthreads (sys._emscripten_info의 속성)
@anchor{library/sys sys _emscripten_info pthreads}@anchor{4933}
@deffn {속성} _emscripten_info.pthreads

@code{True} if Python is compiled with Emscripten pthreads support.
@end deffn

@geindex shared_memory (sys._emscripten_info의 속성)
@anchor{library/sys sys _emscripten_info shared_memory}@anchor{4934}
@deffn {속성} _emscripten_info.shared_memory

@code{True} if Python is compiled with shared memory support.
@end deffn

@ref{213c,,가용성}: Emscripten.


Added in version 3.11.

@end deffn

@geindex pycache_prefix (sys 모듈)
@anchor{library/sys sys pycache_prefix}@anchor{b9b}
@deffn {데이터} sys.pycache_prefix

이것이 설정되면 (@code{None}이 아니면), 파이썬은 바이트 코드 캐시 @code{.pyc} 파일을 소스 코드 트리의 @code{__pycache__} 디렉터리가 아니라, 이 디렉터리를 루트로 하는 병렬 디렉터리 트리에 씁니다 (그리고 그곳에서 읽습니다). 소스 코드 트리의 모든 @code{__pycache__} 디렉터리는 무시되고 새 @code{.pyc} 파일이 이 디렉터리 내에 기록됩니다. 따라서 @ref{21,,compileall}을 사전 빌드 단계로 사용한다면, 실행 시간에 사용할 같은 pycache 접두어(있다면)로 실행해야 합니다.

상대 경로는 현재 작업 디렉터리를 기준으로 해석됩니다.

이 값은 초기에 @ref{16f,,-X} @code{pycache_prefix=PATH} 명령 줄 옵션이나 
@geindex PYTHONPYCACHEPREFIX
@geindex 환경 변수; PYTHONPYCACHEPREFIX
@ref{b9a,,PYTHONPYCACHEPREFIX} 환경 변수(명령 줄이 우선합니다)의 값을 기반으로 설정됩니다. 둘 다 설정되지 않으면, @code{None}입니다.


Added in version 3.8.

@end deffn

@geindex excepthook() (sys 모듈)
@anchor{library/sys sys excepthook}@anchor{a0c}
@deffn {함수} sys.excepthook (type, value, traceback)

이 함수는 주어진 트레이스백(traceback)과 예외를 @code{sys.stderr}에 인쇄합니다.

@ref{f3b,,SystemExit} 이외의 예외가 발생하고 잡히지 않을 때, 인터프리터는 세 인자, 예외 클래스, 예외 인스턴스 및 트레이스백 객체로 @code{sys.excepthook}을 호출합니다. 대화식 세션에서는 제어가 프롬프트로 반환되기 직전에 일어납니다; 파이썬 프로그램에서는 프로그램이 종료되기 직전에 일어납니다. 이러한 최상위 예외 처리는 @code{sys.excepthook}에 다른 3-인자 함수를 대입하여 사용자 정의할 수 있습니다.

잡히지 않은 예외가 발생할 때 인자 @code{hook}, @code{type}, @code{value}, @code{traceback}로 감사 이벤트 @code{sys.excepthook}을 발생시킵니다. 아무런 훅도 설정되지 않았으면, @code{hook}은 @code{None} 일 수 있습니다. 훅이 @ref{244,,RuntimeError}에서 파생된 예외를 발생시키면 훅 호출이 억제됩니다. 그렇지 않으면, 감사 훅 예외는 발생시킬 수 없는 것(unraisable)으로 보고되고 @code{sys.excepthook}이 호출됩니다.


@subsubheading 더 보기


@ref{506,,sys.unraisablehook()} 함수는 발생시킬 수 없는 예외(unraisable exception)를 다루고 @ref{a4b,,threading.excepthook()} 함수는 @ref{c30,,threading.Thread.run()}이 발생시킨 예외를 다룹니다.

@end deffn

@geindex __breakpointhook__ (sys 모듈)
@geindex __displayhook__ (sys 모듈)
@geindex __excepthook__ (sys 모듈)
@geindex __unraisablehook__ (sys 모듈)
@anchor{library/sys sys __breakpointhook__}@anchor{4935}
@deffn {데이터} sys.__breakpointhook__
@anchor{library/sys sys __displayhook__}@anchor{4936}
@deffnx {데이터} sys.__displayhook__
@anchor{library/sys sys __excepthook__}@anchor{4937}
@deffnx {데이터} sys.__excepthook__
@anchor{library/sys sys __unraisablehook__}@anchor{4938}
@deffnx {데이터} sys.__unraisablehook__

이러한 객체는 프로그램 시작 시 @code{breakpointhook}, @code{displayhook}, @code{excepthook} 및 @code{unraisablehook} 의 원래 값을 포함합니다. @code{breakpointhook}, @code{displayhook} 및 @code{excepthook}, @code{unraisablehook} 이 파손되거나 대체 객체로 교체될 때 복원 할 수 있도록 저장됩니다.


Added in version 3.7: __breakpointhook__



Added in version 3.8: __unraisablehook__

@end deffn

@geindex exception() (sys 모듈)
@anchor{library/sys sys exception}@anchor{89a}
@deffn {함수} sys.exception ()

This function, when called while an exception handler is executing (such as
an @code{except} or @code{except*} clause), returns the exception instance that
was caught by this handler. When exception handlers are nested within one
another, only the exception handled by the innermost handler is accessible.

If no exception handler is executing, this function returns @code{None}.


Added in version 3.11.

@end deffn

@geindex exc_info() (sys 모듈)
@anchor{library/sys sys exc_info}@anchor{899}
@deffn {함수} sys.exc_info ()

This function returns the old-style representation of the handled
exception. If an exception @code{e} is currently handled (so
@ref{89a,,exception()} would return @code{e}), @code{exc_info()} returns the
tuple @code{(type(e), e, e.__traceback__)}.
That is, a tuple containing the type of the exception (a subclass of
@ref{7d6,,BaseException}), the exception itself, and a @ref{cea,,traceback object} which typically encapsulates the call
stack at the point where the exception last occurred.

@geindex 객체;트레이스백

If no exception is being handled anywhere on the stack, this function
return a tuple containing three @code{None} values.


버전 3.11에서 변경: The @code{type} and @code{traceback} fields are now derived from the @code{value}
(the exception instance), so when an exception is modified while it is
being handled, the changes are reflected in the results of subsequent
calls to @code{exc_info()}.

@end deffn

@geindex exec_prefix (sys 모듈)
@anchor{library/sys sys exec_prefix}@anchor{3eb}
@deffn {데이터} sys.exec_prefix

플랫폼 특정 파이썬 파일이 설치되는 사이트 특정 디렉터리 접두사를 제공하는 문자열; 기본적으로, 이것은 @code{'/usr/local'}이기도 합니다. @code{configure} 스크립트에 @code{--exec-prefix} 인자를 사용하여 빌드 시 설정할 수 있습니다. 구체적으로, 모든 구성 파일(예를 들어 @code{pyconfig.h} 헤더 파일)은 디렉터리 @code{`exec_prefix'/lib/python`X.Y'/config}에 설치되고, 공유 라이브러리 모듈은 @code{`exec_prefix'/lib/python`X.Y'/lib-dynload}에 설치됩니다. 여기서 `X.Y'는 파이썬의 버전 번호입니다, 예를 들어 @code{3.2}.

@cartouche
@quotation 참고 
If a @ref{3e8,,virtual environment} is in effect, this @code{exec_prefix}
will point to the virtual environment. The value for the Python installation
will still be available, via @ref{3ea,,base_exec_prefix}.
Refer to @ref{48f2,,Virtual Environments} for more information.
@end quotation
@end cartouche


버전 3.14에서 변경: When running under a @ref{3e8,,virtual environment},
@ref{3e7,,prefix} and @code{exec_prefix} are now set to the virtual
environment prefix by the @ref{18dd,,path initialization},
instead of @ref{cc,,site}. This means that @code{prefix} and
@code{exec_prefix} always point to the virtual environment, even when
@code{site} is disabled (@ref{13ad,,-S}).

@end deffn

@geindex executable (sys 모듈)
@anchor{library/sys sys executable}@anchor{3ed}
@deffn {데이터} sys.executable

의미가 있는 시스템에서, 파이썬 인터프리터를 위한 실행 바이너리의 절대 경로를 제공하는 문자열. 파이썬이 실행 파일의 실제 경로를 검색할 수 없으면, @ref{3ed,,sys.executable}은 빈 문자열이거나 @code{None}입니다.
@end deffn

@geindex exit() (sys 모듈)
@anchor{library/sys sys exit}@anchor{277}
@deffn {함수} sys.exit ([arg])

Raise a @ref{f3b,,SystemExit} exception, signaling an intention to exit the interpreter.

The optional argument `arg' can be an integer giving the exit status
(defaulting to zero), or another type of object.  If it is an integer, zero
is considered “successful termination” and any nonzero value is considered
“abnormal termination” by shells and the like.  Most systems require it to be
in the range 0–127, and produce undefined results otherwise.  Some systems
have a convention for assigning specific meanings to specific exit codes, but
these are generally underdeveloped; Unix programs generally use 2 for command
line syntax errors and 1 for all other kinds of errors.  If another type of
object is passed, @code{None} is equivalent to passing zero, and any other
object is printed to @ref{b33,,stderr} and results in an exit code of 1.  In
particular, @code{sys.exit("some error message")} is a quick way to exit a
program when an error occurs.

@ref{25e8,,exit()}는 궁극적으로 “단지” 예외를 발생시키기만 하므로, 메인 스레드에서 호출되고 예외를 가로채지 않을 때만 프로세스를 종료합니다. @ref{8f7,,try} 문에서 finally 절로 지정된 정리 작업은 수행되며, 바깥 수준에서의 종료 시도를 가로챌 수 있습니다.


버전 3.6에서 변경: 파이썬 인터프리터가 @ref{f3b,,SystemExit}를 잡은 후 정리할 때 에러가 발생하면 (가령 표준 스트림에 버퍼링 된 데이터를 플러시할 때의 에러), 종료 상태가 120으로 변경됩니다.

@end deffn

@geindex flags (sys 모듈)
@anchor{library/sys sys flags}@anchor{89b}
@deffn {데이터} sys.flags

The @ref{85d,,named tuple} `flags' exposes the status of command line
flags.  Flags should only be accessed only by name and not by index.  The
attributes are read only.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

@geindex debug (sys.flags의 속성)
@anchor{library/sys sys flags debug}@anchor{4939}
@deffn {속성} flags.debug
@end deffn

@tab

@ref{2120,,-d}

@item

@geindex inspect (sys.flags의 속성)
@anchor{library/sys sys flags inspect}@anchor{1798}
@deffn {속성} flags.inspect
@end deffn

@tab

@ref{16e0,,-i}

@item

@geindex interactive (sys.flags의 속성)
@anchor{library/sys sys flags interactive}@anchor{493a}
@deffn {속성} flags.interactive
@end deffn

@tab

@ref{16e0,,-i}

@item

@geindex isolated (sys.flags의 속성)
@anchor{library/sys sys flags isolated}@anchor{493b}
@deffn {속성} flags.isolated
@end deffn

@tab

@ref{b56,,-I}

@item

@geindex optimize (sys.flags의 속성)
@anchor{library/sys sys flags optimize}@anchor{493c}
@deffn {속성} flags.optimize
@end deffn

@tab

@ref{18c,,-O} 또는 @ref{fb4,,-OO}

@item

@geindex dont_write_bytecode (sys.flags의 속성)
@anchor{library/sys sys flags dont_write_bytecode}@anchor{493d}
@deffn {속성} flags.dont_write_bytecode
@end deffn

@tab

@ref{15d2,,-B}

@item

@geindex no_user_site (sys.flags의 속성)
@anchor{library/sys sys flags no_user_site}@anchor{493e}
@deffn {속성} flags.no_user_site
@end deffn

@tab

@ref{1593,,-s}

@item

@geindex no_site (sys.flags의 속성)
@anchor{library/sys sys flags no_site}@anchor{493f}
@deffn {속성} flags.no_site
@end deffn

@tab

@ref{13ad,,-S}

@item

@geindex ignore_environment (sys.flags의 속성)
@anchor{library/sys sys flags ignore_environment}@anchor{4940}
@deffn {속성} flags.ignore_environment
@end deffn

@tab

@ref{b55,,-E}

@item

@geindex verbose (sys.flags의 속성)
@anchor{library/sys sys flags verbose}@anchor{4941}
@deffn {속성} flags.verbose
@end deffn

@tab

@ref{162a,,-v}

@item

@geindex bytes_warning (sys.flags의 속성)
@anchor{library/sys sys flags bytes_warning}@anchor{4942}
@deffn {속성} flags.bytes_warning
@end deffn

@tab

@ref{7f8,,-b}

@item

@geindex quiet (sys.flags의 속성)
@anchor{library/sys sys flags quiet}@anchor{4943}
@deffn {속성} flags.quiet
@end deffn

@tab

@ref{1785,,-q}

@item

@geindex hash_randomization (sys.flags의 속성)
@anchor{library/sys sys flags hash_randomization}@anchor{4944}
@deffn {속성} flags.hash_randomization
@end deffn

@tab

@ref{1e74,,-R}

@item

@geindex dev_mode (sys.flags의 속성)
@anchor{library/sys sys flags dev_mode}@anchor{1e7e}
@deffn {속성} flags.dev_mode
@end deffn

@tab

@ref{16f,,-X dev} (@ref{507,,파이썬 개발 모드})

@item

@geindex utf8_mode (sys.flags의 속성)
@anchor{library/sys sys flags utf8_mode}@anchor{4945}
@deffn {속성} flags.utf8_mode
@end deffn

@tab

@ref{16f,,-X utf8}

@item

@geindex safe_path (sys.flags의 속성)
@anchor{library/sys sys flags safe_path}@anchor{53e}
@deffn {속성} flags.safe_path
@end deffn

@tab

@ref{7c0,,-P}

@item

@geindex int_max_str_digits (sys.flags의 속성)
@anchor{library/sys sys flags int_max_str_digits}@anchor{26e1}
@deffn {속성} flags.int_max_str_digits
@end deffn

@tab

@ref{16f,,-X int_max_str_digits}
(@ref{80a,,integer string conversion length limitation})

@item

@geindex warn_default_encoding (sys.flags의 속성)
@anchor{library/sys sys flags warn_default_encoding}@anchor{4946}
@deffn {속성} flags.warn_default_encoding
@end deffn

@tab

@ref{16f,,-X warn_default_encoding}

@item

@geindex gil (sys.flags의 속성)
@anchor{library/sys sys flags gil}@anchor{4947}
@deffn {속성} flags.gil
@end deffn

@tab

@ref{16f,,-X gil} and 
@geindex PYTHON_GIL
@geindex 환경 변수; PYTHON_GIL
@ref{49b,,PYTHON_GIL}

@item

@geindex thread_inherit_context (sys.flags의 속성)
@anchor{library/sys sys flags thread_inherit_context}@anchor{175}
@deffn {속성} flags.thread_inherit_context
@end deffn

@tab

@ref{16f,,-X thread_inherit_context} and
@geindex PYTHON_THREAD_INHERIT_CONTEXT
@geindex 환경 변수; PYTHON_THREAD_INHERIT_CONTEXT
@ref{186b,,PYTHON_THREAD_INHERIT_CONTEXT}

@item

@geindex context_aware_warnings (sys.flags의 속성)
@anchor{library/sys sys flags context_aware_warnings}@anchor{18a}
@deffn {속성} flags.context_aware_warnings
@end deffn

@tab

@ref{16f,,-X context_aware_warnings} and
@geindex PYTHON_CONTEXT_AWARE_WARNINGS
@geindex 환경 변수; PYTHON_CONTEXT_AWARE_WARNINGS
@ref{185e,,PYTHON_CONTEXT_AWARE_WARNINGS}

@end multitable



버전 3.2에서 변경: 새로운 @ref{1785,,-q} 플래그에 대한 @code{quiet} 어트리뷰트가 추가되었습니다.



Added in version 3.2.3: @code{hash_randomization} 어트리뷰트.



버전 3.3에서 변경: 사용되지 않는 @code{division_warning} 어트리뷰트를 제거했습니다.



버전 3.4에서 변경: @ref{b56,,-I} @code{isolated} 플래그에 대한 @code{isolated} 어트리뷰트가 추가되었습니다.



버전 3.7에서 변경: 새로운 @ref{507,,파이썬 개발자 모드}에 대한 @code{dev_mode} 어트리뷰트와 새로운 @ref{16f,,-X} @code{utf8} 플래그에 대한 @code{utf8_mode} 어트리뷰트가 추가되었습니다.



버전 3.10에서 변경: @ref{16f,,-X} @code{warn_default_encoding} 플래그에 대한 @code{warn_default_encoding} 어트리뷰트가 추가되었습니다.



버전 3.11에서 변경: @ref{7c0,,-P} 옵션 대한 @code{safe_path} 어트리뷰트가 추가되었습니다.



버전 3.11에서 변경: @code{int_max_str_digits} 어트리뷰트가 추가되었습니다.



버전 3.13에서 변경: Added the @code{gil} attribute.



버전 3.14에서 변경: Added the @code{thread_inherit_context} attribute.



버전 3.14에서 변경: Added the @code{context_aware_warnings} attribute.

@end deffn

@geindex float_info (sys 모듈)
@anchor{library/sys sys float_info}@anchor{1dcc}
@deffn {데이터} sys.float_info

float 형에 대한 정보를 담은 @ref{85d,,네임드 튜플}. 정밀도와 내부 표현에 대한 저수준 정보를 포함합니다. 값은 ‘C’ 프로그래밍 언어의 표준 헤더 파일 @code{float.h}에 정의된 다양한 부동 소수점 상수에 해당합니다; 자세한 내용은 1999 ISO/IEC C 표준 @ref{4948,,[C99]} 의 섹션 5.2.4.2.2 ‘Characteristics of floating types’를 참조하십시오.
Attributes of the @code{float_info} named tuple



@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

어트리뷰트

@tab

float.h 매크로

@tab

설명

@item

@geindex epsilon (sys.float_info의 속성)
@anchor{library/sys sys float_info epsilon}@anchor{4949}
@deffn {속성} float_info.epsilon
@end deffn

@tab

@code{DBL_EPSILON}

@tab

1.0과 부동 소수점으로 표현할 수 있는 1.0보다 큰 최솟값의 차이.

@ref{b0e,,math.ulp()}도 참조하십시오.

@item

@geindex dig (sys.float_info의 속성)
@anchor{library/sys sys float_info dig}@anchor{494a}
@deffn {속성} float_info.dig
@end deffn

@tab

@code{DBL_DIG}

@tab

부동 소수점으로 충실하게 표현할 수 있는 최대 십진 숫자의 개수; 아래를 참조하십시오.

@item

@geindex mant_dig (sys.float_info의 속성)
@anchor{library/sys sys float_info mant_dig}@anchor{494b}
@deffn {속성} float_info.mant_dig
@end deffn

@tab

@code{DBL_MANT_DIG}

@tab

float 정밀도: float의 유효 숫자에서 기본-@code{radix} 자릿수.

@item

@geindex max (sys.float_info의 속성)
@anchor{library/sys sys float_info max}@anchor{494c}
@deffn {속성} float_info.max
@end deffn

@tab

@code{DBL_MAX}

@tab

최대 표현 가능한 양의 유한 float.

@item

@geindex max_exp (sys.float_info의 속성)
@anchor{library/sys sys float_info max_exp}@anchor{494d}
@deffn {속성} float_info.max_exp
@end deffn

@tab

@code{DBL_MAX_EXP}

@tab

@code{radix**(e-1)} 이 표현 가능한 유한 float가 되도록 하는 최대 정수 `e'.

@item

@geindex max_10_exp (sys.float_info의 속성)
@anchor{library/sys sys float_info max_10_exp}@anchor{494e}
@deffn {속성} float_info.max_10_exp
@end deffn

@tab

@code{DBL_MAX_10_EXP}

@tab

@code{10**e}가 표현 가능한 유한 float의 범위에 있도록 하는 최대 정수 `e'.

@item

@geindex min (sys.float_info의 속성)
@anchor{library/sys sys float_info min}@anchor{494f}
@deffn {속성} float_info.min
@end deffn

@tab

@code{DBL_MIN}

@tab

최소 표현 가능한 양의(positive) `정규화된' float.

@ref{b0e,,math.ulp(0.0)}를 사용하여 가장 작은 양의 `정규화되지 않은(denormalized)' 표현 가능한 float를 얻습니다.

@item

@geindex min_exp (sys.float_info의 속성)
@anchor{library/sys sys float_info min_exp}@anchor{4950}
@deffn {속성} float_info.min_exp
@end deffn

@tab

@code{DBL_MIN_EXP}

@tab

@code{radix**(e-1)} 이 정규화된 float가 되도록 하는 최소 정수 `e'.

@item

@geindex min_10_exp (sys.float_info의 속성)
@anchor{library/sys sys float_info min_10_exp}@anchor{4951}
@deffn {속성} float_info.min_10_exp
@end deffn

@tab

@code{DBL_MIN_10_EXP}

@tab

@code{10**e}가 정규화된 float가 되도록 하는 최소 정수 `e'.

@item

@geindex radix (sys.float_info의 속성)
@anchor{library/sys sys float_info radix}@anchor{4952}
@deffn {속성} float_info.radix
@end deffn

@tab

@code{FLT_RADIX}

@tab

지수 표현의 기수.

@item

@geindex rounds (sys.float_info의 속성)
@anchor{library/sys sys float_info rounds}@anchor{4953}
@deffn {속성} float_info.rounds
@end deffn

@tab

@code{FLT_ROUNDS}

@tab

부동 소수점 산술을 위한 자리 올림 모드를 나타내는 정수. 이는 인터프리터 시작 시 시스템 @code{FLT_ROUNDS} 매크로의 값을 반영합니다:


@itemize *

@item 
@code{-1}: indeterminable

@item 
@code{0}: toward zero

@item 
@code{1}: to nearest

@item 
@code{2}: toward positive infinity

@item 
@code{3}: toward negative infinity
@end itemize

All other values for @code{FLT_ROUNDS} characterize
implementation-defined rounding behavior.

@end multitable


@ref{494a,,sys.float_info.dig} 어트리뷰트는 추가 설명이 필요합니다. @code{s}가 최대 @code{sys.float_info.dig} 유효 숫자를 가진 십진수를 나타내는 문자열이면, @code{s}를 float로 변환한 후 다시 역변환하면 같은 십진수 값을 나타내는 문자열이 복구됩니다:

@example
>>> import sys
>>> sys.float_info.dig
15
>>> s = '3.14159265358979'    # 15개의 유효 숫자가 있는 십진수 문자열
>>> format(float(s), '.15g')  # float로 변환 후 되돌립니다 -> 같은 값
'3.14159265358979'
@end example

그러나 유효 숫자가 @ref{494a,,sys.float_info.dig}보다 많은 문자열의 경우, 항상 그렇지는 않습니다:

@example
>>> s = '9876543211234567'    # 16개의 유효 숫자는 너무 많습니다!
>>> format(float(s), '.16g')  # 변환은 값을 바꿉니다
'9876543211234568'
@end example
@end deffn

@geindex float_repr_style (sys 모듈)
@anchor{library/sys sys float_repr_style}@anchor{14ff}
@deffn {데이터} sys.float_repr_style

@ref{1c1,,repr()} 함수가 float에 대해 작동하는 방식을 나타내는 문자열. 문자열이 @code{'short'} 값을 가지면, 유한 float @code{x}의 경우, @code{repr(x)}는 @code{float(repr(x)) == x} 속성을 유지하는 짧은 문자열을 생성하는 것을 목표로 합니다. 이것은 파이썬 3.1 이상에서 일반적인 동작입니다. 그렇지 않으면, @code{float_repr_style}은 @code{'legacy'} 값을 가지며 @code{repr(x)}는 3.1 이전의 파이썬 버전에서와 같은 방식으로 작동합니다.


Added in version 3.1.

@end deffn

@geindex getallocatedblocks() (sys 모듈)
@anchor{library/sys sys getallocatedblocks}@anchor{11c6}
@deffn {함수} sys.getallocatedblocks ()

크기에 상관없이, 인터프리터가 현재 할당한 메모리 블록 수를 반환합니다. 이 함수는 주로 메모리 누수를 추적하고 디버깅하는 데 유용합니다. 인터프리터의 내부 캐시로 인해, 결과는 호출마다 다를 수 있습니다; 보다 예측 가능한 결과를 얻으려면 @ref{364,,_clear_internal_caches()}와 @ref{1b3,,gc.collect()}를 호출해야 할 수도 있습니다.

파이썬 빌드나 구현이 이 정보를 합리적으로 계산할 수 없으면, @ref{11c6,,getallocatedblocks()}는 대신 0을 반환할 수 있습니다.


Added in version 3.4.

@end deffn

@geindex getunicodeinternedsize() (sys 모듈)
@anchor{library/sys sys getunicodeinternedsize}@anchor{4954}
@deffn {함수} sys.getunicodeinternedsize ()

Return the number of unicode objects that have been interned.


Added in version 3.12.

@end deffn

@geindex getandroidapilevel() (sys 모듈)
@anchor{library/sys sys getandroidapilevel}@anchor{d82}
@deffn {함수} sys.getandroidapilevel ()

Return the build-time API level of Android as an integer. This represents the
minimum version of Android this build of Python can run on. For runtime
version information, see @ref{19c6,,platform.android_ver()}.

@ref{213c,,가용성}: Android.


Added in version 3.7.

@end deffn

@geindex getdefaultencoding() (sys 모듈)
@anchor{library/sys sys getdefaultencoding}@anchor{4955}
@deffn {함수} sys.getdefaultencoding ()

@code{'utf-8'}을 반환합니다. @ref{ad2,,str.encode()} 같은 메서드에서 사용되는, 기본 문자열 인코딩의 이름입니다.
@end deffn

@geindex getdlopenflags() (sys 모듈)
@anchor{library/sys sys getdlopenflags}@anchor{1713}
@deffn {함수} sys.getdlopenflags ()

@code{dlopen()} 호출에 사용되는 플래그의 현재 값을 반환합니다. 플래그 값의 기호 이름은 @ref{a5,,os} 모듈에서 찾을 수 있습니다 (@code{RTLD_@var{xxx}} 상수, 예를 들어 @ref{131d,,os.RTLD_LAZY}).

@ref{213c,,가용성}: Unix.
@end deffn

@geindex getfilesystemencoding() (sys 모듈)
@anchor{library/sys sys getfilesystemencoding}@anchor{e52}
@deffn {함수} sys.getfilesystemencoding ()

Get the @ref{75c,,filesystem encoding}:
the encoding used with the filesystem error handler to convert between Unicode filenames and bytes
filenames. The filesystem error handler is returned from
@ref{ee1,,getfilesystemencodeerrors()}.

최상의 호환성을 위해, 파일명을 바이트열로 나타내는 것도 지원되지만, 모든 경우에 파일명에 str을 사용해야 합니다. 파일명을 받아들이거나 반환하는 함수는 str이나 bytes를 지원하고 내부적으로 시스템의 선호되는 표현으로 변환해야 합니다.

올바른 인코딩과 에러 모드를 사용하려면 @ref{e4e,,os.fsencode()}와 @ref{e4d,,os.fsdecode()}를 사용해야 합니다.

The @ref{75c,,filesystem encoding and error handler} are configured at Python
startup by the @ref{992,,PyConfig_Read()} function: see
@ref{41b,,filesystem_encoding} and
@ref{41c,,filesystem_errors} members of @ref{3f7,,PyConfig}.


버전 3.2에서 변경: @ref{e52,,getfilesystemencoding()} 결과는 더는 @code{None}일 수 없습니다.



버전 3.6에서 변경: 윈도우는 더는 @code{'mbcs'}를 반환한다고 보장하지 않습니다. 자세한 정보는 
@geindex Python 향상 제안; PEP 529
PEP 529@footnote{https://peps.python.org/pep-0529/}와 @ref{33e,,_enablelegacywindowsfsencoding()}를 참조하십시오.



버전 3.7에서 변경: Return @code{'utf-8'} if the @ref{865,,Python UTF-8 Mode} is
enabled.

@end deffn

@geindex getfilesystemencodeerrors() (sys 모듈)
@anchor{library/sys sys getfilesystemencodeerrors}@anchor{ee1}
@deffn {함수} sys.getfilesystemencodeerrors ()

@ref{75c,,파일시스템 에러 처리기}를 얻습니다: 유니코드 파일명과 바이트열 파일명 사이를 변환하는 파일시스템 인코딩과 함께 사용되는 에러 처리기. 파일시스템 인코딩은 @ref{e52,,getfilesystemencoding()} 에서 반환됩니다.

올바른 인코딩과 에러 모드를 사용하려면 @ref{e4e,,os.fsencode()}와 @ref{e4d,,os.fsdecode()}를 사용해야 합니다.

The @ref{75c,,filesystem encoding and error handler} are configured at Python
startup by the @ref{992,,PyConfig_Read()} function: see
@ref{41b,,filesystem_encoding} and
@ref{41c,,filesystem_errors} members of @ref{3f7,,PyConfig}.


Added in version 3.6.

@end deffn

@geindex get_int_max_str_digits() (sys 모듈)
@anchor{library/sys sys get_int_max_str_digits}@anchor{181b}
@deffn {함수} sys.get_int_max_str_digits ()

Returns the current value for the @ref{80a,,integer string conversion length limitation}. See also @ref{18f2,,set_int_max_str_digits()}.


Added in version 3.11.

@end deffn

@geindex getrefcount() (sys 모듈)
@anchor{library/sys sys getrefcount}@anchor{2ce}
@deffn {함수} sys.getrefcount (object)

`object'의 참조 횟수를 반환합니다. 반환된 수는 일반적으로 예상보다 1이 높습니다. @ref{2ce,,getrefcount()}에 대한 인자로서의 (임시) 참조를 포함하기 때문입니다.

Note that the returned value may not actually reflect how many
references to the object are actually held.  For example, some
objects are @ref{290,,immortal} and have a very high refcount that does not
reflect the actual number of references.  Consequently, do not rely
on the returned value to be accurate, other than a value of 0 or 1.

`CPython 구현 상세:' @ref{290,,Immortal} objects with a large reference count can be
identified via @ref{28f,,_is_immortal()}.


버전 3.12에서 변경: Immortal objects have very large refcounts that do not match
the actual number of references to the object.

@end deffn

@geindex getrecursionlimit() (sys 모듈)
@anchor{library/sys sys getrecursionlimit}@anchor{6ea}
@deffn {함수} sys.getrecursionlimit ()

파이썬 인터프리터 스택의 최대 깊이인, 재귀 한계의 현재 값을 반환합니다. 이 제한은 무한 재귀로 인해 C 스택의 오버플로가 발생하고 파이썬이 충돌하는 것을 방지합니다. @ref{6e9,,setrecursionlimit()}로 설정할 수 있습니다.
@end deffn

@geindex getsizeof() (sys 모듈)
@anchor{library/sys sys getsizeof}@anchor{1ad9}
@deffn {함수} sys.getsizeof (object[, default])

객체의 크기를 바이트 단위로 반환합니다. 객체는 모든 형의 객체일 수 있습니다. 모든 내장 객체는 올바른 결과를 반환하지만, 구현 특정이기 때문에 제삼자 확장에서도 그렇다고 보장할 수는 없습니다.

객체에 직접 기여한 메모리 소비만 포함하며, 이 객체가 참조하는 객체의 메모리 소비는 따지지 않습니다.

주어진 경우, 객체가 크기를 조회하는 수단을 제공하지 않으면 `default'가 반환됩니다. 그렇지 않으면 @ref{198,,TypeError}가 발생합니다.

@ref{1ad9,,getsizeof()}는 객체의 @code{__sizeof__} 메서드를 호출하고 객체가 가비지 수거기에 의해 관리되면 추가 가비지 수거기 오버헤드를 추가합니다.

컨테이너와 모든 내용물의 크기를 찾기 위해 @ref{1ad9,,getsizeof()}를 재귀적으로 사용하는 예는 recursive sizeof recipe@footnote{https://code.activestate.com/recipes/577504-compute-memory-footprint-of-an-object-and-its-cont/}를 참조하십시오.
@end deffn

@geindex getswitchinterval() (sys 모듈)
@anchor{library/sys sys getswitchinterval}@anchor{b43}
@deffn {함수} sys.getswitchinterval ()

인터프리터의 “스레드 스위치 간격”을 초 단위로 반환합니다; @ref{b44,,setswitchinterval()}을 참조하십시오.


Added in version 3.2.

@end deffn

@geindex _getframe() (sys 모듈)
@anchor{library/sys sys _getframe}@anchor{8ef}
@deffn {함수} sys._getframe ([depth])

호출 스택에서 프레임 객체를 반환합니다. 선택적 정수 `depth'가 제공되면, 스택 맨 위에서 지정한 수 만큼 아래에 있는 호출의 프레임 객체를 반환합니다. 호출 스택보다 깊으면, @ref{2ec,,ValueError}가 발생합니다. `depth'의 기본값은 0이며, 호출 스택의 맨 위에 있는 프레임을 반환합니다.

인자 @code{frame}으로 @ref{1c6c,,감사 이벤트} @code{sys._getframe}을 발생시킵니다.

이 함수는 내부와 특수 목적으로만 사용해야 합니다. 모든 파이썬 구현에 존재한다고 보장되는 것은 아닙니다.
@end deffn

@geindex _getframemodulename() (sys 모듈)
@anchor{library/sys sys _getframemodulename}@anchor{1add}
@deffn {함수} sys._getframemodulename ([depth])

호출 스택에서 모듈의 이름을 반환합니다. 선택적 정수 `depth'가 제공되면, 스택 맨 위에서 지정한 수 만큼 아래에 있는 호출의 모듈을 반환합니다. 호출 스택보다 깊거나, 모듈을 식별할 수 없으면, @code{None}이 반환됩니다. `depth'의 기본값은 0이며, 호출 스택의 맨 위에 있는 모듈을 반환합니다.

인자 @code{depth}로 @ref{1c6c,,감사 이벤트} @code{sys._getframemodulename}을 발생시킵니다.

이 함수는 내부와 특수 목적으로만 사용해야 합니다. 모든 파이썬 구현에 존재한다고 보장되는 것은 아닙니다.


Added in version 3.12.

@end deffn

@geindex getobjects() (sys 모듈)
@anchor{library/sys sys getobjects}@anchor{28e}
@deffn {함수} sys.getobjects (limit[, type])

This function only exists if CPython was built using the
specialized configure option @ref{634,,--with-trace-refs}.
It is intended only for debugging garbage-collection issues.

Return a list of up to `limit' dynamically allocated Python objects.
If `type' is given, only objects of that exact type (not subtypes)
are included.

Objects from the list are not safe to use.
Specifically, the result will include objects from all interpreters that
share their object allocator state (that is, ones created with
@ref{4956,,PyInterpreterConfig.use_main_obmalloc} set to 1
or using @ref{1b2f,,Py_NewInterpreter()}, and the
@ref{163,,main interpreter}).
Mixing objects from different interpreters may lead to crashes
or other unexpected behavior.

이 함수는 특수 목적으로만 사용해야 합니다. 모든 파이썬 구현에 존재한다고 보장되는 것은 아닙니다.


버전 3.14에서 변경: The result may include objects from other interpreters.

@end deffn

@geindex getprofile() (sys 모듈)
@anchor{library/sys sys getprofile}@anchor{15e5}
@deffn {함수} sys.getprofile ()

@geindex 프로파일 함수
@geindex 프로파일러

@ref{1703,,setprofile()}에 의해 설정된 프로파일러 함수를 얻습니다.
@end deffn

@geindex gettrace() (sys 모듈)
@anchor{library/sys sys gettrace}@anchor{15e6}
@deffn {함수} sys.gettrace ()

@geindex 추적 함수
@geindex 디버거

@ref{2e1,,settrace()}에 의해 설정된 추적 함수를 얻습니다.

@ref{15e6,,gettrace()} 함수는 디버거, 프로파일러, 커버리지 도구 등을 구현하기 위한 것입니다. 그 동작은 언어 정의의 일부라기보다는 구현 플랫폼의 일부이기 때문에, 모든 파이썬 구현에서 사용 가능한 것은 아닙니다.
@end deffn

@geindex getwindowsversion() (sys 모듈)
@anchor{library/sys sys getwindowsversion}@anchor{ee2}
@deffn {함수} sys.getwindowsversion ()

현재 실행 중인 윈도우 버전을 설명하는 네임드 튜플을 반환합니다. 명명된 요소는 `major', `minor', `build', `platform', `service_pack', `service_pack_minor', `service_pack_major', `suite_mask', `product_type' 및 `platform_version'입니다. `service_pack'은 문자열을 포함하고 `platform_version'은 3-튜플이며 다른 모든 값은 정수입니다. 구성 요소는 이름으로도 액세스할 수 있어서, @code{sys.getwindowsversion()[0]} 은 @code{sys.getwindowsversion().major}와 동등합니다. 이전 버전과의 호환성을 위해, 처음 5개 요소 만 인덱싱을 통해 꺼낼 수 있습니다.

`platform'은 @code{2} (VER_PLATFORM_WIN32_NT) 입니다.

`product_type'은 다음 값 중 하나일 수 있습니다:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

상수

@tab

의미

@item

@code{1} (VER_NT_WORKSTATION)

@tab

시스템은 워크 스테이션입니다.

@item

@code{2} (VER_NT_DOMAIN_CONTROLLER)

@tab

시스템은 도메인 컨트롤러입니다.

@item

@code{3} (VER_NT_SERVER)

@tab

시스템은 서버이지만, 도메인 컨트롤러는 아닙니다.

@end multitable


이 함수는 Win32 @code{GetVersionEx()} 함수를 감쌉니다; 이러한 필드에 대한 자세한 내용은 @code{OSVERSIONINFOEX()} 에 대한 마이크로소프트 설명서를 참조하십시오.

`platform_version'은 프로세스에 대해 에뮬레이션 되는 버전이 아니라, 주 버전, 부 버전 및 현재 운영 체제의 빌드 번호를 반환합니다. 기능 감지가 아닌 로깅에 사용하기 위한 것입니다.

@cartouche
@quotation 참고 
`platform_version' derives the version from kernel32.dll which can be of a different
version than the OS version. Please use @ref{af,,platform} module for achieving accurate
OS version.
@end quotation
@end cartouche

@ref{213c,,가용성}: Windows.


버전 3.2에서 변경: 네임드 튜플로 변경되어 `service_pack_minor', `service_pack_major', `suite_mask' 및 `product_type'이 추가되었습니다.



버전 3.6에서 변경: `platform_version'을 추가했습니다

@end deffn

@geindex get_asyncgen_hooks() (sys 모듈)
@anchor{library/sys sys get_asyncgen_hooks}@anchor{1bc2}
@deffn {함수} sys.get_asyncgen_hooks ()

@code{(firstiter, finalizer)} 형식의 @ref{4e0,,namedtuple}과 유사한 `asyncgen_hooks' 객체를 반환합니다. 여기서 `firstiter'와 `finalizer'는 @code{None}이나 @ref{3975,,비동기 제너레이터 이터레이터}를 인자로 취하는 함수로 기대되며, 이벤트 루프에 의해 비동기 제너레이터의 파이널리제이션을 스케줄 하는 데 사용됩니다.


Added in version 3.6: 자세한 내용은 
@geindex Python 향상 제안; PEP 525
PEP 525@footnote{https://peps.python.org/pep-0525/}를 참조하십시오.


@cartouche
@quotation 참고 
이 함수는 잠정적(provisional)으로 추가되었습니다 (자세한 내용은 
@geindex Python 향상 제안; PEP 411
PEP 411@footnote{https://peps.python.org/pep-0411/}을 참조하십시오).
@end quotation
@end cartouche
@end deffn

@geindex get_coroutine_origin_tracking_depth() (sys 모듈)
@anchor{library/sys sys get_coroutine_origin_tracking_depth}@anchor{d83}
@deffn {함수} sys.get_coroutine_origin_tracking_depth ()

@ref{d84,,set_coroutine_origin_tracking_depth()}로 설정된 현재 코루틴 원점 추적 깊이를 가져옵니다.


Added in version 3.7.


@cartouche
@quotation 참고 
이 함수는 잠정적(provisional)으로 추가되었습니다 (자세한 내용은 
@geindex Python 향상 제안; PEP 411
PEP 411@footnote{https://peps.python.org/pep-0411/}을 참조하십시오). 디버깅 목적으로만 사용하십시오.
@end quotation
@end cartouche
@end deffn

@geindex hash_info (sys 모듈)
@anchor{library/sys sys hash_info}@anchor{11fe}
@deffn {데이터} sys.hash_info

숫자 해시 구현의 매개 변수를 제공하는 @ref{85d,,네임드 튜플}. 숫자 형의 해싱에 대한 자세한 내용은 @ref{25ff,,숫자 형의 해싱}을 참조하십시오.

@geindex width (sys.hash_info의 속성)
@anchor{library/sys sys hash_info width}@anchor{4957}
@deffn {속성} hash_info.width

해시값에 사용되는 비트 폭
@end deffn

@geindex modulus (sys.hash_info의 속성)
@anchor{library/sys sys hash_info modulus}@anchor{2600}
@deffn {속성} hash_info.modulus

수치 해시 체계에 사용되는 소수 모듈러스 P
@end deffn

@geindex inf (sys.hash_info의 속성)
@anchor{library/sys sys hash_info inf}@anchor{4958}
@deffn {속성} hash_info.inf

양의 무한대에 대해 반환된 해시값
@end deffn

@geindex nan (sys.hash_info의 속성)
@anchor{library/sys sys hash_info nan}@anchor{4959}
@deffn {속성} hash_info.nan

(This attribute is no longer used)
@end deffn

@geindex imag (sys.hash_info의 속성)
@anchor{library/sys sys hash_info imag}@anchor{495a}
@deffn {속성} hash_info.imag

복소수의 허수부에 사용되는 승수(multiplier)
@end deffn

@geindex algorithm (sys.hash_info의 속성)
@anchor{library/sys sys hash_info algorithm}@anchor{495b}
@deffn {속성} hash_info.algorithm

str, bytes 및 memoryview의 해싱 알고리즘 이름
@end deffn

@geindex hash_bits (sys.hash_info의 속성)
@anchor{library/sys sys hash_info hash_bits}@anchor{495c}
@deffn {속성} hash_info.hash_bits

해시 알고리즘의 내부 출력 크기
@end deffn

@geindex seed_bits (sys.hash_info의 속성)
@anchor{library/sys sys hash_info seed_bits}@anchor{495d}
@deffn {속성} hash_info.seed_bits

해시 알고리즘의 시드 키 크기
@end deffn

@geindex cutoff (sys.hash_info의 속성)
@anchor{library/sys sys hash_info cutoff}@anchor{495e}
@deffn {속성} hash_info.cutoff

Cutoff for small string DJBX33A optimization in range @code{[1, cutoff)}.
@end deffn


Added in version 3.2.



버전 3.4에서 변경: Added `algorithm', `hash_bits', `seed_bits', and `cutoff'.

@end deffn

@geindex hexversion (sys 모듈)
@anchor{library/sys sys hexversion}@anchor{495f}
@deffn {데이터} sys.hexversion

단일 정수로 인코딩된 버전 번호. 이것은 비 프로덕션 릴리스에 대한 적절한 지원을 포함하여, 버전마다 증가함이 보장됩니다. 예를 들어, 파이썬 인터프리터가 버전 1.5.2 이상인지 검사하려면, 다음을 사용하십시오:

@example
if sys.hexversion >= 0x010502F0:
    # 고급 기능을 사용합니다
    ...
else:
    # 대안 구현을 사용하거나 사용자에게 경고합니다
    ...
@end example

내장 @ref{14d4,,hex()} 함수에 전달한 결과로 볼 때만 실제로 의미가 있기 때문에 이것을 @code{hexversion}이라고 합니다. @ref{85d,,네임드 튜플} @ref{8ae,,sys.version_info}는 같은 정보의 더 인간 친화적인 인코딩으로 사용될 수 있습니다.

@code{hexversion}에 대한 자세한 내용은 @ref{4960,,API와 ABI 버전 붙이기} 에서 찾을 수 있습니다.
@end deffn

@geindex implementation (sys 모듈)
@anchor{library/sys sys implementation}@anchor{73a}
@deffn {데이터} sys.implementation

현재 실행 중인 파이썬 인터프리터의 구현에 대한 정보가 포함된 객체. 모든 파이썬 구현에서 다음과 같은 어트리뷰트가 있어야 합니다.

`name'은 구현 식별자입니다, 예를 들어 @code{'cpython'}. 실제 문자열은 파이썬 구현에 의해 정의되지만, 소문자임이 보장됩니다.

`version'은 @ref{8ae,,sys.version_info}와 같은 형식의 네임드 튜플입니다. 파이썬 `구현'의 버전을 나타냅니다. 이것은 현재 실행 중인 인터프리터가 준수하는, @code{sys.version_info}가 나타내는, 특정 버전의 파이썬 `언어'와는 다른 의미입니다. 예를 들어, PyPy 1.8의 경우 @code{sys.implementation.version}은 @code{sys.version_info(1, 8, 0, 'final', 0)}일 수 있지만, @code{sys.version_info}는 @code{sys.version_info(2, 7, 2, 'final', 0)}입니다. CPython의 경우 참조 구현이기 때문에 같은 값입니다.

`hexversion'은 @ref{495f,,sys.hexversion}과 같은 16진수 형식의 구현 버전입니다.

`cache_tag'는 임포트 절차에서 캐시 된 모듈의 파일명에 사용되는 태그입니다. 관습상, @code{'cpython-33'}과 같이 구현 이름과 버전을 합성한 것입니다. 그러나, 파이썬 구현은 적절하다면 다른 값을 사용할 수 있습니다. @code{cache_tag}가 @code{None}으로 설정되면, 모듈 캐싱을 사용하지 않아야 함을 나타냅니다.

`supports_isolated_interpreters' is a boolean value, whether
this implementation supports multiple isolated interpreters.
It is @code{True} for CPython on most platforms.  Platforms with
this support implement the low-level @code{_interpreters} module.


@subsubheading 더 보기


@geindex Python 향상 제안; PEP 684
PEP 684@footnote{https://peps.python.org/pep-0684/}, 
@geindex Python 향상 제안; PEP 734
PEP 734@footnote{https://peps.python.org/pep-0734/}, and @ref{25,,concurrent.interpreters}.


@ref{73a,,sys.implementation}은 파이썬 구현에 고유한 추가 어트리뷰트를 포함할 수 있습니다. 이러한 비표준 어트리뷰트는 밑줄로 시작해야 하며, 여기에서는 설명하지 않습니다. 내용과 관계없이, @code{sys.implementation}은 인터프리터 실행 중이나 구현 버전 간에 변경되지 않습니다. (그러나, 파이썬 언어 버전 간에는 변경될 수 있습니다.) 자세한 정보는 
@geindex Python 향상 제안; PEP 421
PEP 421@footnote{https://peps.python.org/pep-0421/}을 참조하십시오.


Added in version 3.3.



버전 3.14에서 변경: Added @code{supports_isolated_interpreters} field.


@cartouche
@quotation 참고 
새로운 필수 어트리뷰트를 추가하려면 일반 PEP 프로세스를 거쳐야 합니다. 자세한 정보는 
@geindex Python 향상 제안; PEP 421
PEP 421@footnote{https://peps.python.org/pep-0421/}을 참조하십시오.
@end quotation
@end cartouche
@end deffn

@geindex int_info (sys 모듈)
@anchor{library/sys sys int_info}@anchor{1498}
@deffn {데이터} sys.int_info

파이썬의 정수 내부 표현에 대한 정보를 담고 있는 @ref{85d,,네임드 튜플}. 어트리뷰트는 읽기 전용입니다.

@geindex bits_per_digit (sys.int_info의 속성)
@anchor{library/sys sys int_info bits_per_digit}@anchor{4961}
@deffn {속성} int_info.bits_per_digit

각 자릿수에 담긴 비트 수. 파이썬 정수는 내부적으로 기수(base) @code{2**int_info.bits_per_digit}로 저장됩니다.
@end deffn

@geindex sizeof_digit (sys.int_info의 속성)
@anchor{library/sys sys int_info sizeof_digit}@anchor{4962}
@deffn {속성} int_info.sizeof_digit

자릿수를 나타내는 데 사용되는 C형의 바이트 단위 크기.
@end deffn

@geindex default_max_str_digits (sys.int_info의 속성)
@anchor{library/sys sys int_info default_max_str_digits}@anchor{26e2}
@deffn {속성} int_info.default_max_str_digits

The default value for @ref{181b,,sys.get_int_max_str_digits()}
when it is not otherwise explicitly configured.
@end deffn

@geindex str_digits_check_threshold (sys.int_info의 속성)
@anchor{library/sys sys int_info str_digits_check_threshold}@anchor{4963}
@deffn {속성} int_info.str_digits_check_threshold

The minimum non-zero value for @ref{18f2,,sys.set_int_max_str_digits()},
@geindex PYTHONINTMAXSTRDIGITS
@geindex 환경 변수; PYTHONINTMAXSTRDIGITS
@ref{1b38,,PYTHONINTMAXSTRDIGITS}, or @ref{16f,,-X int_max_str_digits}.
@end deffn


Added in version 3.1.



버전 3.11에서 변경: Added @ref{26e2,,default_max_str_digits} and
@ref{4963,,str_digits_check_threshold}.

@end deffn

@geindex __interactivehook__ (sys 모듈)
@anchor{library/sys sys __interactivehook__}@anchor{11c7}
@deffn {데이터} sys.__interactivehook__

이 어트리뷰트가 존재하면, @ref{443,,대화형 모드}로 인터프리터가 시작될 때 해당 값이 (인자 없이) 자동으로 호출됩니다. 이것은 
@geindex PYTHONSTARTUP
@geindex 환경 변수; PYTHONSTARTUP
@ref{1b8,,PYTHONSTARTUP} 파일을 읽은 후에 수행되므로, 그곳에서 이 훅을 설정할 수 있습니다. @ref{cc,,site} 모듈은 @ref{11c8,,이것을 설정합니다}.

시작 시 훅이 호출될 때 훅 객체를 인자로 @ref{1c6c,,감사 이벤트} @code{cpython.run_interactivehook}을 발생시킵니다.


Added in version 3.4.

@end deffn

@geindex intern() (sys 모듈)
@anchor{library/sys sys intern}@anchor{14e0}
@deffn {함수} sys.intern (string)

“인턴 된(interned)” 문자열 테이블에 `string'을 넣고, `string' 자신이거나 사본인 인턴 된 문자열을 반환합니다. 문자열을 인턴 하는 것은 딕셔너리 조회에서 약간의 성능 개선을 얻는 데 유용합니다 – 딕셔너리의 키가 인턴 되고. 조회 키가 인턴 되면, (해싱 후의) 키 비교는 문자열 비교 대신 포인터 비교를 수행 할 수 있습니다. 일반적으로, 파이썬 프로그램에서 사용되는 이름은 자동으로 인턴 되며, 모듈, 클래스 또는 인스턴스 어트리뷰트를 담는 데 사용되는 딕셔너리는 인턴 된 키를 갖습니다.

인턴 된 문자열은 @ref{290,,불멸}이 아닙니다; 이점을 얻으려면 @ref{14e0,,intern()}의 반환 값에 대한 참조를 유지해야 합니다.
@end deffn

@geindex _is_gil_enabled() (sys 모듈)
@anchor{library/sys sys _is_gil_enabled}@anchor{4964}
@deffn {함수} sys._is_gil_enabled ()

Return @ref{e06,,True} if the @ref{164,,GIL} is enabled and @ref{d2a,,False} if
it is disabled.


Added in version 3.13.


모든 파이썬 구현에 존재한다고 보장되는 것은 아닙니다.
@end deffn

@geindex is_finalizing() (sys 모듈)
@anchor{library/sys sys is_finalizing}@anchor{c7f}
@deffn {함수} sys.is_finalizing ()

메인 파이썬 인터프리터가 @ref{47a,,종료} 중이면 @ref{e06,,True}를 반환합니다. 그렇지 않으면 @ref{d2a,,False}를 반환합니다.

See also the @ref{479,,PythonFinalizationError} exception.


Added in version 3.5.

@end deffn

@geindex _jit (sys 모듈)
@anchor{library/sys sys _jit}@anchor{293}
@deffn {데이터} sys._jit

Utilities for observing just-in-time compilation.

`CPython 구현 상세:' JIT compilation is an `experimental implementation detail' of CPython.
@code{sys._jit} is not guaranteed to exist or behave the same way in all
Python implementations, versions, or build configurations.


Added in version 3.14.


@geindex _jit.is_available() (sys 모듈)
@anchor{library/sys sys _jit is_available}@anchor{44f}
@deffn {함수} _jit.is_available ()

Return @code{True} if the current Python executable supports JIT compilation,
and @code{False} otherwise.  This can be controlled by building CPython with
the @code{--experimental-jit} option on Windows, and the
@ref{44e,,--enable-experimental-jit} option on all other platforms.
@end deffn

@geindex _jit.is_enabled() (sys 모듈)
@anchor{library/sys sys _jit is_enabled}@anchor{450}
@deffn {함수} _jit.is_enabled ()

Return @code{True} if JIT compilation is enabled for the current Python
process (implies @ref{44f,,sys._jit.is_available()}), and @code{False} otherwise.
If JIT compilation is available, this can be controlled by setting the
@geindex PYTHON_JIT
@geindex 환경 변수; PYTHON_JIT
@ref{44d,,PYTHON_JIT} environment variable to @code{0} (disabled) or @code{1}
(enabled) at interpreter startup.
@end deffn

@geindex _jit.is_active() (sys 모듈)
@anchor{library/sys sys _jit is_active}@anchor{1864}
@deffn {함수} _jit.is_active ()

Return @code{True} if the topmost Python frame is currently executing JIT
code (implies @ref{450,,sys._jit.is_enabled()}), and @code{False} otherwise.

@cartouche
@quotation 참고 
This function is intended for testing and debugging the JIT itself.
It should be avoided for any other purpose.
@end quotation
@end cartouche

@cartouche
@quotation 참고 
Due to the nature of tracing JIT compilers, repeated calls to this
function may give surprising results. For example, branching on its
return value will likely lead to unexpected behavior (if doing so
causes JIT code to be entered or exited):

@example
>>> for warmup in range(BIG_NUMBER):
...     # This line is "hot", and is eventually JIT-compiled:
...     if sys._jit.is_active():
...         # This line is "cold", and is run in the interpreter:
...         assert sys._jit.is_active()
...
Traceback (most recent call last):
  File "<stdin>", line 5, in <module>
    assert sys._jit.is_active()
           ~~~~~~~~~~~~~~~~~~^^
AssertionError
@end example
@end quotation
@end cartouche
@end deffn
@end deffn

@geindex last_exc (sys 모듈)
@anchor{library/sys sys last_exc}@anchor{6e4}
@deffn {데이터} sys.last_exc

이 변수가 항상 정의되는 것은 아닙니다; 예외가 처리되지 않고 인터프리터가 에러 메시지와 스택 트레이스백을 인쇄할 때 예외 인스턴스로 설정됩니다. 의도된 용도는 대화형 사용자가 디버거 모듈을 임포트하고 에러를 일으킨 명령을 다시 실행하지 않고도 사후 디버깅에 참여할 수 있도록 하는 것입니다. (사후 디버거에 들어가기 위해 일반적으로 @code{import pdb; pdb.pm()}을 사용합니다; 자세한 내용은 @ref{aa,,pdb} 모듈을 참조하십시오.)


Added in version 3.12.

@end deffn

@geindex _is_immortal() (sys 모듈)
@anchor{library/sys sys _is_immortal}@anchor{28f}
@deffn {함수} sys._is_immortal (op)

Return @ref{e06,,True} if the given object is @ref{290,,immortal}, @ref{d2a,,False}
otherwise.

@cartouche
@quotation 참고 
Objects that are immortal (and thus return @code{True} upon being passed
to this function) are not guaranteed to be immortal in future versions,
and vice versa for mortal objects.
@end quotation
@end cartouche


Added in version 3.14.


이 함수는 특수 목적으로만 사용해야 합니다. 모든 파이썬 구현에 존재한다고 보장되는 것은 아닙니다.
@end deffn

@geindex _is_interned() (sys 모듈)
@anchor{library/sys sys _is_interned}@anchor{558}
@deffn {함수} sys._is_interned (string)

주어진 문자열이 “인턴” 되었으면 @ref{e06,,True}를, 그렇지 않으면 @ref{d2a,,False}를 반환합니다.


Added in version 3.13.


모든 파이썬 구현에 존재한다고 보장되는 것은 아닙니다.
@end deffn

@geindex last_type (sys 모듈)
@geindex last_value (sys 모듈)
@geindex last_traceback (sys 모듈)
@anchor{library/sys sys last_type}@anchor{6e5}
@deffn {데이터} sys.last_type
@anchor{library/sys sys last_value}@anchor{6e6}
@deffnx {데이터} sys.last_value
@anchor{library/sys sys last_traceback}@anchor{6e7}
@deffnx {데이터} sys.last_traceback

These three variables are deprecated; use @ref{6e4,,sys.last_exc} instead.
They hold the legacy representation of @code{sys.last_exc}, as returned
from @ref{899,,exc_info()} above.
@end deffn

@geindex maxsize (sys 모듈)
@anchor{library/sys sys maxsize}@anchor{13ca}
@deffn {데이터} sys.maxsize

@ref{c54,,Py_ssize_t} 형의 변수가 취할 수 있는 최댓값을 제공하는 정수. 일반적으로 32비트 플랫폼에서는 @code{2**31 - 1}이고 64비트 플랫폼에서는 @code{2**63 - 1}입니다.
@end deffn

@geindex maxunicode (sys 모듈)
@anchor{library/sys sys maxunicode}@anchor{124c}
@deffn {데이터} sys.maxunicode

가장 큰 유니코드 코드 포인트의 값을 제공하는 정수, 즉 @code{1114111} (16진수로 @code{0x10FFFF}).


버전 3.3에서 변경: 
@geindex Python 향상 제안; PEP 393
PEP 393@footnote{https://peps.python.org/pep-0393/} 이전에는, 유니코드 문자가 UCS-2와 UCS-4 중 어는 것으로 저장되었는지를 지정하는 구성 옵션에 따라, @code{sys.maxunicode}는 @code{0xFFFF}나 @code{0x10FFFF}이었습니다.

@end deffn

@geindex meta_path (sys 모듈)
@anchor{library/sys sys meta_path}@anchor{f26}
@deffn {데이터} sys.meta_path

@ref{126f,,메타 경로 파인더} 객체의 리스트. 이 객체의 @ref{a68,,find_spec()} 메서드를 호출해서 임포트 할 모듈을 찾을 수 있는지 확인할 수 있습니다. 기본적으로, 파이썬의 기본 임포트 의미 체계를 구현하는 항목들을 포함합니다. 최소한 임포트 할 모듈의 절대 이름으로 @code{find_spec()} 메서드가 호출됩니다. 임포트 할 모듈이 패키지에 포함되어 있으면, 부모 패키지의 @ref{2052,,__path__} 어트리뷰트가 두 번째 인자로 전달됩니다. 이 메서드는 @ref{2360,,모듈 스펙}이나 모듈을 찾을 수 없으면 @code{None}을 반환합니다.


@subsubheading 더 보기



@table @asis

@item @ref{a6e,,importlib.abc.MetaPathFinder}

@ref{f26,,meta_path}에 있는 파인더 객체의 인터페이스를 정의하는 추상 베이스 클래스.

@item @ref{2269,,importlib.machinery.ModuleSpec}

@ref{a68,,find_spec()}이 이 구상 클래스의 인스턴스를 반환해야 합니다.
@end table



버전 3.4에서 변경: @ref{2360,,모듈 스펙}은 파이썬 3.4에서 
@geindex Python 향상 제안; PEP 451
PEP 451@footnote{https://peps.python.org/pep-0451/}에 의해 도입되었습니다.



버전 3.12에서 변경: @ref{f26,,meta_path} 항목에 @ref{a68,,find_spec()} 메서드가 없으면 @code{find_module()} 메서드를 찾는 폴백을 제거했습니다.

@end deffn

@geindex modules (sys 모듈)
@anchor{library/sys sys modules}@anchor{17ea}
@deffn {데이터} sys.modules

이것은 모듈 이름을 이미 로드된 모듈로 매핑하는 딕셔너리입니다. 모듈의 재로딩과 기타 트릭을 강제하기 위해 조작할 수 있습니다. 그러나 딕셔너리를 교체하는 것은 예상대로 작동하지는 않으며 딕셔너리에서 필수 항목을 삭제하면 파이썬이 실패할 수 있습니다. 이 전역 딕셔너리를 이터레이트 하려면 항상 @code{sys.modules.copy()} 또는 @code{tuple(sys.modules)} 를 사용하여, 다른 스레드의 코드나 활동의 부작용으로 인해 이터레이션 중 딕셔너리 크기가 변경되어 발생하는 예외를 피하십시오.
@end deffn

@geindex orig_argv (sys 모듈)
@anchor{library/sys sys orig_argv}@anchor{a41}
@deffn {데이터} sys.orig_argv

The list of the original command line arguments passed to the Python
executable.

The elements of @ref{a41,,sys.orig_argv} are the arguments to the Python interpreter,
while the elements of @ref{1469,,sys.argv} are the arguments to the user’s program.
Arguments consumed by the interpreter itself will be present in @code{sys.orig_argv}
and missing from @code{sys.argv}.


Added in version 3.10.

@end deffn

@geindex path (sys 모듈)
@anchor{library/sys sys path}@anchor{3e4}
@deffn {데이터} sys.path

@geindex 모듈;검색;경로

모듈의 검색 경로를 지정하는 문자열 리스트. 환경 변수 
@geindex PYTHONPATH
@geindex 환경 변수; PYTHONPATH
@ref{121c,,PYTHONPATH}와 설치 종속 기본값으로 초기화되었습니다.

By default, as initialized upon program startup, a potentially unsafe path
is prepended to @ref{3e4,,sys.path} (`before' the entries inserted as a result
of 
@geindex PYTHONPATH
@geindex 환경 변수; PYTHONPATH
@ref{121c,,PYTHONPATH}):


@itemize *

@item 
@code{python -m module} 명령 줄: 현재 작업 디렉터리를 앞에 붙입니다.

@item 
@code{python script.py} command line: prepend the script’s directory.
If it’s a symbolic link, resolve symbolic links.

@item 
@code{python -c code} and @code{python} (REPL) command lines: prepend an empty
string, which means the current working directory.
@end itemize

To not prepend this potentially unsafe path, use the @ref{7c0,,-P} command
line option or the 
@geindex PYTHONSAFEPATH
@geindex 환경 변수; PYTHONSAFEPATH
@ref{7c1,,PYTHONSAFEPATH} environment variable.

프로그램은 자체 목적으로 이 리스트를 자유롭게 수정할 수 있습니다. 문자열만 @ref{3e4,,sys.path}에 추가해야 합니다; 임포트 하는 동안 다른 모든 데이터형은 무시됩니다.


@subsubheading 더 보기



@itemize *

@item 
모듈 @ref{cc,,site}. 이것은 .pth 파일을 사용하여 @ref{3e4,,sys.path}를 확장하는 방법에 관해 설명합니다.
@end itemize

@end deffn

@geindex path_hooks (sys 모듈)
@anchor{library/sys sys path_hooks}@anchor{1223}
@deffn {데이터} sys.path_hooks

경로 인자를 취해서 경로를 위한 @ref{2367,,파인더}를 만들려고 시도하는 콜러블의 리스트. 파인더를 만들 수 있으면, 콜러블이 반환하고, 그렇지 않으면 @ref{659,,ImportError}를 발생시킵니다.

원래 
@geindex Python 향상 제안; PEP 302
PEP 302@footnote{https://peps.python.org/pep-0302/}에서 지정되었습니다.
@end deffn

@geindex path_importer_cache (sys 모듈)
@anchor{library/sys sys path_importer_cache}@anchor{7f9}
@deffn {데이터} sys.path_importer_cache

@ref{2367,,파인더} 객체의 캐시 역할을 하는 딕셔너리. 키는 @ref{1223,,sys.path_hooks}에 전달된 경로이며 값은 찾은 파인더입니다. 경로가 유효한 파일 시스템 경로이지만 @code{sys.path_hooks}에 파인더가 없으면 @code{None}이 저장됩니다.

원래 
@geindex Python 향상 제안; PEP 302
PEP 302@footnote{https://peps.python.org/pep-0302/}에서 지정되었습니다.
@end deffn

@geindex platform (sys 모듈)
@anchor{library/sys sys platform}@anchor{291}
@deffn {데이터} sys.platform

A string containing a platform identifier. Known values are:


@multitable {xxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

시스템

@tab

@code{platform} 값

@item

AIX

@tab

@code{'aix'}

@item

안드로이드

@tab

@code{'android'}

@item

Emscripten

@tab

@code{'emscripten'}

@item

FreeBSD

@tab

@code{'freebsd'}

@item

iOS

@tab

@code{'ios'}

@item

리눅스

@tab

@code{'linux'}

@item

맥 OS

@tab

@code{'darwin'}

@item

윈도우

@tab

@code{'win32'}

@item

윈도우/Cygwin

@tab

@code{'cygwin'}

@item

WASI

@tab

@code{'wasi'}

@end multitable


On Unix systems not listed in the table, the value is the lowercased OS name
as returned by @code{uname -s}, with the first part of the version as returned by
@code{uname -r} appended, e.g. @code{'sunos5'}, `at the time when Python was built'.
Unless you want to test for a specific system version, it is therefore
recommended to use the following idiom:

@example
if sys.platform.startswith('sunos'):
    # SunOS-specific code here...
@end example


버전 3.3에서 변경: 리눅스에서, @ref{291,,sys.platform}은 더는 주 버전을 포함하지 않습니다. @code{'linux2'}나 @code{'linux3'} 대신, 항상 @code{'linux'}입니다.



버전 3.8에서 변경: AIX에서, @ref{291,,sys.platform}은 더는 주 버전을 포함하지 않습니다. @code{'aix5'}나 @code{'aix7'} 대신, 항상 @code{'aix'}입니다.



버전 3.13에서 변경: On Android, @ref{291,,sys.platform} now returns @code{'android'} rather than
@code{'linux'}.



버전 3.14에서 변경: On FreeBSD, @ref{291,,sys.platform} doesn’t contain the major version anymore.
It is always @code{'freebsd'}, instead of @code{'freebsd13'} or @code{'freebsd14'}.



@subsubheading 더 보기


@ref{302a,,os.name}은 덜 세분되어 있습니다. @ref{131b,,os.uname()}은 시스템 종속 버전 정보를 제공합니다.

@ref{af,,platform} 모듈은 시스템 식별자에 대한 상세한 검사를 제공합니다.

@end deffn

@geindex platlibdir (sys 모듈)
@anchor{library/sys sys platlibdir}@anchor{b32}
@deffn {데이터} sys.platlibdir

플랫폼별 라이브러리 디렉터리의 이름. 표준 라이브러리의 경로와 설치된 확장 모듈들의 경로를 빌드하는 데 사용됩니다.

대부분의 플랫폼에서 @code{"lib"}와 같습니다. Fedora와 SuSE에서는, 64비트 플랫폼에서 @code{"lib64"}와 같으며 다음과 같은 @code{sys.path} 경로를 제공합니다 (@code{X.Y}는 파이썬 @code{major.minor} 버전):


@itemize *

@item 
@code{/usr/lib64/pythonX.Y/}: 표준 라이브러리 (@ref{a5,,os} 모듈의 @code{os.py}와 같은)

@item 
@code{/usr/lib64/pythonX.Y/lib-dynload/}: 표준 라이브러리의 C 확장 모듈 (@ref{5b,,errno} 모듈과 같은, 정확한 파일 이름은 플랫폼에 따라 다릅니다)

@item 
@code{/usr/lib/pythonX.Y/site-packages/} (항상 @code{lib}를 사용합니다, @ref{b32,,sys.platlibdir}이 아닙니다): 제삼자 모듈

@item 
@code{/usr/lib64/pythonX.Y/site-packages/}: 제삼자 패키지의 C 확장 모듈
@end itemize


Added in version 3.9.

@end deffn

@geindex prefix (sys 모듈)
@anchor{library/sys sys prefix}@anchor{3e7}
@deffn {데이터} sys.prefix

플랫폼 독립적인 파이썬 파일이 설치되는 사이트별 디렉터리 접두사를 제공하는 문자열; 유닉스에서, 기본 값은 @code{/usr/local}입니다. @code{configure} 스크립트에 대한 @ref{214c,,--prefix} 인자를 사용하여 빌드 시 설정할 수 있습니다. 파생 경로는 @ref{449,,설치 경로}를 참조하십시오.

@cartouche
@quotation 참고 
If a @ref{3e8,,virtual environment} is in effect, this @code{prefix}
will point to the virtual environment. The value for the Python installation
will still be available, via @ref{3e6,,base_prefix}.
Refer to @ref{48f2,,Virtual Environments} for more information.
@end quotation
@end cartouche


버전 3.14에서 변경: When running under a @ref{3e8,,virtual environment},
@code{prefix} and @ref{3eb,,exec_prefix} are now set to the virtual
environment prefix by the @ref{18dd,,path initialization},
instead of @ref{cc,,site}. This means that @code{prefix} and
@code{exec_prefix} always point to the virtual environment, even when
@code{site} is disabled (@ref{13ad,,-S}).

@end deffn

@geindex ps1 (sys 모듈)
@geindex ps2 (sys 모듈)
@anchor{library/sys sys ps1}@anchor{2132}
@deffn {데이터} sys.ps1
@anchor{library/sys sys ps2}@anchor{2133}
@deffnx {데이터} sys.ps2

@geindex 인터프리터 프롬프트
@geindex 프롬프트@comma{} 인터프리터
@geindex >>>;인터프리터 프롬프트
@geindex ...;인터프리터 프롬프트

인터프리터의 기본과 보조 프롬프트를 지정하는 문자열. 인터프리터가 대화형 모드일 때만 정의됩니다. 이 경우 초깃값은 @code{'>>> '}과 @code{'... '}입니다. 문자열이 아닌 객체가 어느 변수에라도 지정되면, 인터프리터가 새 대화식 명령을 읽을 준비를 할 때마다 그 객체의 @ref{169,,str()}이 재평가됩니다; 동적 프롬프트를 구현하는 데 사용할 수 있습니다.
@end deffn

@geindex setdlopenflags() (sys 모듈)
@anchor{library/sys sys setdlopenflags}@anchor{1324}
@deffn {함수} sys.setdlopenflags (n)

인터프리터가 확장 모듈을 로드할 때와 같이 @code{dlopen()} 호출에 인터프리터가 사용하는 플래그를 설정합니다. 무엇보다도, 이것은 @code{sys.setdlopenflags(0)}라고 호출하는 경우, 모듈을 임포트 할 때 심볼의 지연된 결정(lazy resolving)을 활성화합니다. 확장 모듈 간에 심볼을 공유하려면, @code{sys.setdlopenflags(os.RTLD_GLOBAL)}로 호출하십시오. 플래그 값의 기호 이름은 @ref{a5,,os} 모듈에서 찾을 수 있습니다 (@code{RTLD_@var{xxx}} 상수, 예를 들어 @ref{131d,,os.RTLD_LAZY}).

@ref{213c,,가용성}: Unix.
@end deffn

@geindex set_int_max_str_digits() (sys 모듈)
@anchor{library/sys sys set_int_max_str_digits}@anchor{18f2}
@deffn {함수} sys.set_int_max_str_digits (maxdigits)

Set the @ref{80a,,integer string conversion length limitation} used by this interpreter. See also
@ref{181b,,get_int_max_str_digits()}.


Added in version 3.11.

@end deffn

@geindex setprofile() (sys 모듈)
@anchor{library/sys sys setprofile}@anchor{1703}
@deffn {함수} sys.setprofile (profilefunc)

@geindex 프로파일 함수
@geindex 프로파일러

시스템의 프로파일 함수를 설정합니다. 파이썬에서 파이썬 소스 코드 프로파일러를 구현할 수 있도록 합니다. 파이썬 프로파일러에 대한 자세한 내용은 @ref{4835,,파이썬 프로파일러} 장을 참조하십시오. 시스템의 프로파일 함수는 시스템의 추적 함수(@ref{2e1,,settrace()}를 참조하십시오)와 유사하게 호출되지만, 다른 이벤트로 호출됩니다, 예를 들어 이 함수는 실행되는 줄마다 호출되지 않습니다 (오직 호출과 반환에서만 호출됩니다만, 예외가 설정되었을 때도 반환 이벤트가 보고됩니다). 이 함수는 스레드로 한정되지만, 프로파일러가 스레드 간의 컨텍스트 전환에 대해 알 방법이 없어서, 여러 스레드가 있을 때 이를 사용하는 것은 의미가 없습니다. 또한, 반환 값이 사용되지 않아서, 단순히 @code{None}을 반환할 수 있습니다. 프로파일 함수에서 에러가 발생하면 설정이 해제됩니다.

@cartouche
@quotation 참고 
The same tracing mechanism is used for @code{setprofile()} as @ref{2e1,,settrace()}.
To trace calls with @code{setprofile()} inside a tracing function
(e.g. in a debugger breakpoint), see @ref{1bc1,,call_tracing()}.
@end quotation
@end cartouche

프로파일 함수에는 세 가지 인자가 있습니다: `frame', `event' 및 `arg'. `frame'은 현재 스택 프레임입니다. `event'는 문자열입니다: @code{'call'}, @code{'return'}, @code{'c_call'}, @code{'c_return'} 또는 @code{'c_exception'}. `arg'는 이벤트 유형에 따라 다릅니다.

이벤트의 의미는 다음과 같습니다:


@table @asis

@item @code{'call'}

함수가 호출되었습니다 (또는 다른 코드 블록에 진입했습니다). 프로파일 함수가 호출됩니다; `arg'는 @code{None}입니다.

@item @code{'return'}

함수(또는 다른 코드 블록)가 반환하려고 합니다. 프로파일 함수가 호출됩니다; `arg'는 반환될 값이거나, 예외가 발생하여 이벤트가 발생한 경우는 @code{None}입니다.

@item @code{'c_call'}

C 함수를 호출하려고 합니다. 확장 함수나 내장일 수 있습니다. `arg'는 C 함수 객체입니다.

@item @code{'c_return'}

C 함수가 반환했습니다. `arg'는 C 함수 객체입니다.

@item @code{'c_exception'}

C 함수에서 예외가 발생했습니다. `arg'는 C 함수 객체입니다.
@end table

인자 없이 @ref{1c6c,,감사 이벤트} @code{sys.setprofile}을 발생시킵니다.
@end deffn

@geindex setrecursionlimit() (sys 모듈)
@anchor{library/sys sys setrecursionlimit}@anchor{6e9}
@deffn {함수} sys.setrecursionlimit (limit)

파이썬 인터프리터 스택의 최대 깊이를 `limit'로 설정합니다. 이 제한은 무한 재귀로 인해 C 스택의 오버플로가 발생하고 파이썬이 충돌하는 것을 방지합니다.

가능한 최대 제한은 플랫폼에 따라 다릅니다. 사용자는 깊은 재귀가 필요한 프로그램과 더 높은 제한을 지원하는 플랫폼이 있을 때 제한을 더 높게 설정해야 할 수 있습니다. 제한이 너무 높으면 충돌이 발생할 수 있기 때문에, 주의해서 사용해야 합니다.

현재 재귀 깊이에서 새 제한이 너무 낮으면 @ref{f67,,RecursionError} 예외가 발생합니다.


버전 3.5.1에서 변경: 현재 재귀 깊이에서 새 한계가 너무 낮으면 이제 @ref{f67,,RecursionError} 예외가 발생합니다.

@end deffn

@geindex setswitchinterval() (sys 모듈)
@anchor{library/sys sys setswitchinterval}@anchor{b44}
@deffn {함수} sys.setswitchinterval (interval)

인터프리터의 스레드 전환 간격을 (초 단위로) 설정합니다. 이 부동 소수점 값은 동시에 실행 중인 파이썬 스레드에 할당된 “시 분할(timeslices)”의 이상적인 지속 시간을 결정합니다. 특히 오래 실행되는 내부 함수나 메서드가 사용된다면, 실제 값은 더 클 수 있음에 유의하십시오. 또한, 간격이 끝날 때 어떤 스레드가 예약되는지는 운영 체제의 결정입니다. 인터프리터에는 자체 스케줄러가 없습니다.


Added in version 3.2.

@end deffn

@geindex settrace() (sys 모듈)
@anchor{library/sys sys settrace}@anchor{2e1}
@deffn {함수} sys.settrace (tracefunc)

@geindex 추적 함수
@geindex 디버거

시스템의 추적 함수를 설정합니다. 파이썬에서 파이썬 소스 코드 디버거를 구현할 수 있도록 합니다. 이 함수는 스레드로 한정됩니다; 디버거가 여러 스레드를 지원하려면, 디버깅 중인 각 스레드에 대해 @ref{2e1,,settrace()}를 사용하여 추적 함수를 등록하거나, @ref{a48,,threading.settrace()}를 사용해야 합니다.

Trace functions should have three arguments: `frame', `event', and
`arg'. `frame' is the @ref{8ee,,current stack frame}. `event' is a string: @code{'call'},
@code{'line'}, @code{'return'}, @code{'exception'} or @code{'opcode'}.  `arg' depends on
the event type.

추적 함수는 새로운 로컬 스코프에 진입할 때마다 호출됩니다 (`event'가 @code{'call'}로 설정됩니다); 새 스코프에서 사용될 지역 추적 함수(local trace function)에 대한 참조를 반환하거나, 스코프를 추적하지 않아야 하면 @code{None}을 반환해야 합니다.

지역 추적 함수는 자기 자신, 또는 해당 스코프의 지역 추적 합수로 사용될 다른 함수에 대한 참조를 반환해야 합니다.

추적 함수에서 에러가 발생하면, @code{settrace(None)}이 호출되는 것처럼 설정이 해제됩니다.

@cartouche
@quotation 참고 
Tracing is disabled while calling the trace function (e.g. a function set by
@code{settrace()}). For recursive tracing see @ref{1bc1,,call_tracing()}.
@end quotation
@end cartouche

이벤트의 의미는 다음과 같습니다:


@table @asis

@item @code{'call'}

함수가 호출되었습니다 (또는 다른 코드 블록에 진입했습니다). 전역 추적 함수가 호출됩니다; `arg'는 @code{None}입니다; 반환 값은 지역 추적 함수를 지정합니다.

@item @code{'line'}

인터프리터가 새로운 코드 줄을 실행하거나 루프의 조건을 다시 실행하려고 합니다. 지역 추적 함수가 호출됩니다; `arg'는 @code{None}입니다; 반환 값은 새로운 지역 추적 함수를 지정합니다. 작동 방식에 대한 자세한 설명은 @code{Objects/lnotab_notes.txt}를 참조하십시오. 해당 @ref{8ee,,프레임}에서 @ref{dd5,,f_trace_lines}를 @ref{d2a,,False}로 설정하여 줄별 이벤트를 비활성화 할 수 있습니다.

@item @code{'return'}

함수(또는 다른 코드 블록)가 반환하려고 합니다. 지역 추적 함수가 호출됩니다; `arg'는 반환될 값이거나, 예외가 발생하여 이벤트가 발생한 경우는 @code{None}입니다. 추적 함수의 반환 값은 무시됩니다.

@item @code{'exception'}

예외가 발생했습니다. 지역 추적 함수가 호출됩니다; `arg'는 튜플 @code{(exception, value, traceback)}입니다; 반환 값은 새로운 지역 추적 함수를 지정합니다.

@item @code{'opcode'}

인터프리터가 새 옵코드(opcode)를 실행하려고 합니다 (opcode 세부 사항은 @ref{3c,,dis}를 참조하십시오). 지역 추적 함수가 호출됩니다; `arg'는 @code{None}입니다; 반환 값은 새로운 지역 추적 함수를 지정합니다. 옵코드 별 이벤트는 기본적으로 발생하지 않습니다; 해당 @ref{8ee,,프레임}에서 @ref{dd6,,f_trace_opcodes}를 @ref{e06,,True}로 설정하여 명시적으로 요청해야 합니다.
@end table

호출자 체인을 따라 예외가 전파됨에 따라, 각 수준에서 @code{'exception'} 이벤트가 생성됨에 유의하십시오.

더 세분된 사용을 위해, 이미 설치된 추적 함수의 반환 값을 통해 간접적으로 설정되는 것에 의존하는 대신, @code{frame.f_trace = tracefunc}를 명시적으로 대입하여 추적 함수를 설정할 수 있습니다. 이것은 현재 프레임에서 추적 함수를 활성화하는 데에도 필요한데, @ref{2e1,,settrace()}가 하지 않는 일입니다. 이것이 작동하려면 실행 시간 추적 장치를 활성화하기 위해 전역 추적 함수가 @code{settrace()}로 설치되어 있어야 하지만, 같은 추적 함수 일 필요는 없음에 유의하십시오 (예를 들어, 각 프레임에서 즉시 비활성화되도록 단순히 @code{None}을 반환하는 오버헤드가 낮은 추적 함수일 수 있습니다).

코드와 프레임 객체에 대한 자세한 내용은 @ref{232c,,표준형 계층}를 참조하십시오.

인자 없이 @ref{1c6c,,감사 이벤트} @code{sys.settrace}를 발생시킵니다.

@ref{2e1,,settrace()} 함수는 오직 디버거, 프로파일러, 커버리지(coverage) 도구 등을 구현하기 위한 것입니다. 그 동작은 언어 정의의 일부라기보다는 구현 플랫폼의 일부라서, 모든 파이썬 구현에서 사용 가능한 것은 아닙니다.


버전 3.7에서 변경: @code{'opcode'} 이벤트 유형이 추가되었습니다; @ref{dd5,,f_trace_lines}와 @ref{dd6,,f_trace_opcodes} 어트리뷰트가 프레임에 추가되었습니다

@end deffn

@geindex set_asyncgen_hooks() (sys 모듈)
@anchor{library/sys sys set_asyncgen_hooks}@anchor{199e}
@deffn {함수} sys.set_asyncgen_hooks ([firstiter] [, finalizer])

두 개의 선택적 키워드 인자를 받아들이는데, 모두 @ref{3975,,비동기 제너레이터 이터레이터}를 인자로 받아들이는 콜러블입니다. 비동기 제너레이터가 처음으로 이터레이트 될 때 `firstiter' 콜러블이 호출됩니다. 비동기 제너레이터가 가비지 수거될 때 `finalizer'가 호출됩니다.

인자 없이 @ref{1c6c,,감사 이벤트} @code{sys.set_asyncgen_hooks_firstiter}를 발생시킵니다.

인자 없이 @ref{1c6c,,감사 이벤트} @code{sys.set_asyncgen_hooks_finalizer}를 발생시킵니다.

하부 API는 두 개의 호출로 구성되기 때문에, 두 개의 감사 이벤트가 발생합니다, 각각은 자체 이벤트를 발생시켜야 합니다.


Added in version 3.6: 자세한 내용은 
@geindex Python 향상 제안; PEP 525
PEP 525@footnote{https://peps.python.org/pep-0525/}를 참조하고, `finalizer' 메서드의 참조 예제는 Lib/asyncio/base_events.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/asyncio/base_events.py}의 @code{asyncio.Loop.shutdown_asyncgens} 구현을 참조하십시오.


@cartouche
@quotation 참고 
이 함수는 잠정적(provisional)으로 추가되었습니다 (자세한 내용은 
@geindex Python 향상 제안; PEP 411
PEP 411@footnote{https://peps.python.org/pep-0411/}을 참조하십시오).
@end quotation
@end cartouche
@end deffn

@geindex set_coroutine_origin_tracking_depth() (sys 모듈)
@anchor{library/sys sys set_coroutine_origin_tracking_depth}@anchor{d84}
@deffn {함수} sys.set_coroutine_origin_tracking_depth (depth)

코루틴 원점 추적을 활성화하거나 비활성화하도록 합니다. 활성화하면, 코루틴 객체의 @code{cr_origin} 어트리뷰트에 코루틴 객체가 만들어진 트레이스백을 설명하는 (파일명, 줄 번호, 함수 이름) 튜플이 포함됩니다. 가장 최근의 호출이 먼저 옵니다. 비활성화하면 @code{cr_origin}은 @code{None}입니다.

To enable, pass a `depth' value greater than zero; this sets the
number of frames whose information will be captured. To disable,
set `depth' to zero.

이 설정은 스레드에 한정됩니다.


Added in version 3.7.


@cartouche
@quotation 참고 
이 함수는 잠정적(provisional)으로 추가되었습니다 (자세한 내용은 
@geindex Python 향상 제안; PEP 411
PEP 411@footnote{https://peps.python.org/pep-0411/}을 참조하십시오). 디버깅 목적으로만 사용하십시오.
@end quotation
@end cartouche
@end deffn

@geindex activate_stack_trampoline() (sys 모듈)
@anchor{library/sys sys activate_stack_trampoline}@anchor{699}
@deffn {함수} sys.activate_stack_trampoline (backend, /)

Activate the stack profiler trampoline `backend'.
The only supported backend is @code{"perf"}.

Stack trampolines cannot be activated if the JIT is active.

@ref{213c,,가용성}: Linux.


Added in version 3.12.



@subsubheading 더 보기



@itemize *

@item 
@ref{4b0,,Python support for the Linux perf profiler}

@item 
@indicateurl{https://perf.wiki.kernel.org}
@end itemize

@end deffn

@geindex deactivate_stack_trampoline() (sys 모듈)
@anchor{library/sys sys deactivate_stack_trampoline}@anchor{69a}
@deffn {함수} sys.deactivate_stack_trampoline ()

Deactivate the current stack profiler trampoline backend.

If no stack profiler is activated, this function has no effect.

@ref{213c,,가용성}: Linux.


Added in version 3.12.

@end deffn

@geindex is_stack_trampoline_active() (sys 모듈)
@anchor{library/sys sys is_stack_trampoline_active}@anchor{69b}
@deffn {함수} sys.is_stack_trampoline_active ()

Return @code{True} if a stack profiler trampoline is active.

@ref{213c,,가용성}: Linux.


Added in version 3.12.

@end deffn

@geindex remote_exec() (sys 모듈)
@anchor{library/sys sys remote_exec}@anchor{16d}
@deffn {함수} sys.remote_exec (pid, script)

Executes `script', a file containing Python code in the remote
process with the given `pid'.

This function returns immediately, and the code will be executed by the
target process’s main thread at the next available opportunity, similarly
to how signals are handled. There is no interface to determine when the
code has been executed. The caller is responsible for making sure that
the file still exists whenever the remote process tries to read it and that
it hasn’t been overwritten.

The remote process must be running a CPython interpreter of the same major
and minor version as the local process. If either the local or remote
interpreter is pre-release (alpha, beta, or release candidate) then the
local and remote interpreters must be the same exact version.

See @ref{4965,,Remote debugging attachment protocol} for more information about the remote debugging
mechanism.


When the code is executed in the remote process, an
@ref{1c6c,,auditing event} @code{sys.remote_exec} is raised with
the `pid' and the path to the script file.
This event is raised in the process that called @ref{16d,,sys.remote_exec()}.



When the script is executed in the remote process, an
@ref{1c6c,,auditing event}
@code{cpython.remote_debugger_script} is raised
with the path in the remote process.
This event is raised in the remote process, not the one
that called @ref{16d,,sys.remote_exec()}.


@ref{213c,,가용성}: Unix, Windows.


Added in version 3.14: See 
@geindex Python 향상 제안; PEP 768
PEP 768@footnote{https://peps.python.org/pep-0768/} for more details.

@end deffn

@geindex _enablelegacywindowsfsencoding() (sys 모듈)
@anchor{library/sys sys _enablelegacywindowsfsencoding}@anchor{33e}
@deffn {함수} sys._enablelegacywindowsfsencoding ()

3.6 이전의 파이썬 버전과 일관성을 유지하기 위해, @ref{75c,,파일 시스템 인코딩과 에러 처리기}를 각각 ‘mbcs’와 ‘replace’로 변경합니다.

이것은 파이썬을 시작하기 전에 
@geindex PYTHONLEGACYWINDOWSFSENCODING
@geindex 환경 변수; PYTHONLEGACYWINDOWSFSENCODING
@ref{33f,,PYTHONLEGACYWINDOWSFSENCODING} 환경 변수를 정의하는 것과 동등합니다.

See also @ref{e52,,sys.getfilesystemencoding()} and
@ref{ee1,,sys.getfilesystemencodeerrors()}.

@ref{213c,,가용성}: Windows.

@cartouche
@quotation 참고 
Changing the filesystem encoding after Python startup is risky because
the old fsencoding or paths encoded by the old fsencoding may be cached
somewhere. Use 
@geindex PYTHONLEGACYWINDOWSFSENCODING
@geindex 환경 변수; PYTHONLEGACYWINDOWSFSENCODING
@ref{33f,,PYTHONLEGACYWINDOWSFSENCODING} instead.
@end quotation
@end cartouche


Added in version 3.6: 자세한 내용은 
@geindex Python 향상 제안; PEP 529
PEP 529@footnote{https://peps.python.org/pep-0529/}를 참조하십시오.



Deprecated since version 3.13, will be removed in version 3.16: Use 
@geindex PYTHONLEGACYWINDOWSFSENCODING
@geindex 환경 변수; PYTHONLEGACYWINDOWSFSENCODING
@ref{33f,,PYTHONLEGACYWINDOWSFSENCODING} instead.

@end deffn

@geindex stdin (sys 모듈)
@geindex stdout (sys 모듈)
@geindex stderr (sys 모듈)
@anchor{library/sys sys stdin}@anchor{75e}
@deffn {데이터} sys.stdin
@anchor{library/sys sys stdout}@anchor{ccc}
@deffnx {데이터} sys.stdout
@anchor{library/sys sys stderr}@anchor{b33}
@deffnx {데이터} sys.stderr

인터프리터가 표준 입력, 출력 및 에러에 사용하는 @ref{13c8,,파일 객체}:


@itemize *

@item 
@code{stdin}는 모든 대화식 입력에 사용됩니다 (@ref{14dd,,input()} 호출을 포함합니다);

@item 
@code{stdout}은 @ref{1174,,print()}와 @ref{23cf,,표현식} 문장의 출력과 @ref{14dd,,input()}의 프롬프트에 사용됩니다;

@item 
인터프리터 자신의 프롬프트와 에러 메시지는 @code{stderr}로 갑니다.
@end itemize

이 스트림은 @ref{316,,open()} 함수에 의해 반환되는 것과 같은 일반적인 @ref{206b,,텍스트 파일}입니다. 매개 변수는 다음과 같이 선택됩니다:


@itemize *

@item 
The encoding and error handling are is initialized from
@ref{642,,PyConfig.stdio_encoding} and @ref{4966,,PyConfig.stdio_errors}.

윈도우에서는, 콘솔 장치에 UTF-8이 사용됩니다. 디스크 파일과 파이프와 같은 비문자 장치는 시스템 로케일 인코딩(즉, ANSI 코드 페이지)을 사용합니다. NUL(즉, @code{isatty()}가 @code{True}를 반환하는)과 같은 비 콘솔 문자 장치는 시작 시에 콘솔 입력과 출력 코드 페이지의 값을 각각 stdin과 stdout/stderr에 사용합니다. 프로세스가 초기에 콘솔에 연결되지 않았으면 시스템 @ref{54a,,로케일 인코딩}이 기본값입니다.

파이썬을 시작하기 전에 환경 변수 PYTHONLEGACYWINDOWSSTDIO를 설정하여 콘솔의 특수 동작을 재정의할 수 있습니다. 이 경우, 콘솔 코드 페이지는 다른 모든 문자 장치에서처럼 사용됩니다.

모든 플랫폼에서, 파이썬을 시작하기 전에 
@geindex PYTHONIOENCODING
@geindex 환경 변수; PYTHONIOENCODING
@ref{1209,,PYTHONIOENCODING} 환경 변수를 설정하거나 새로운 @ref{16f,,-X} @code{utf8} 명령 줄 옵션과 
@geindex PYTHONUTF8
@geindex 환경 변수; PYTHONUTF8
@ref{cce,,PYTHONUTF8} 환경 변수를 사용하여 문자 인코딩을 재정의할 수 있습니다. 그러나, 윈도우 콘솔의 경우, 
@geindex PYTHONLEGACYWINDOWSSTDIO
@geindex 환경 변수; PYTHONLEGACYWINDOWSSTDIO
@ref{e54,,PYTHONLEGACYWINDOWSSTDIO} 도 설정했을 때만 적용됩니다.

@item 
대화형일 때, @code{stdout} 스트림은 줄 버퍼링 됩니다. 그렇지 않으면, 일반 텍스트 파일처럼 블록 버퍼링 됩니다. @code{stderr} 스트림은 두 경우 모두 줄 버퍼링 됩니다. @ref{1d8b,,-u} 명령 줄 옵션을 전달하거나 
@geindex PYTHONUNBUFFERED
@geindex 환경 변수; PYTHONUNBUFFERED
@ref{1d8c,,PYTHONUNBUFFERED} 환경 변수를 설정하여 두 스트림을 모두 버퍼링하지 않을 수 있습니다.
@end itemize


버전 3.9에서 변경: 비 대화형 @code{stderr}은 이제 완전히 버퍼링 되는 대신 줄 버퍼링 됩니다.


@cartouche
@quotation 참고 
표준 스트림에서 바이너리 데이터를 읽거나 표준 스트림으로 바이너리 데이터를 쓰려면, 하부 바이너리 @ref{14a8,,buffer} 객체를 사용하십시오. 예를 들어, 바이트열을 @ref{ccc,,stdout}에 쓰려면, @code{sys.stdout.buffer.write(b'abc')}를 사용하십시오.

그러나, 라이브러리를 작성하고 있다면 (그리고 코드가 실행될 문맥을 제어하지 않으면), 표준 스트림은 @code{buffer} 어트리뷰트를 지원하지 않는 @ref{1128,,io.StringIO}와 같은 파일류 객체로 대체 될 수 있음을 유의하십시오.
@end quotation
@end cartouche
@end deffn

@geindex __stdin__ (sys 모듈)
@geindex __stdout__ (sys 모듈)
@geindex __stderr__ (sys 모듈)
@anchor{library/sys sys __stdin__}@anchor{4967}
@deffn {데이터} sys.__stdin__
@anchor{library/sys sys __stdout__}@anchor{2d22}
@deffnx {데이터} sys.__stdout__
@anchor{library/sys sys __stderr__}@anchor{4712}
@deffnx {데이터} sys.__stderr__

이 객체는 프로그램 시작 시 @code{stdin}, @code{stderr} 및 @code{stdout}의 원래 값을 포함합니다. 이들은 파이널리제이션 중에 사용되며, @code{sys.std*} 객체가 리디렉션 되었는지에 관계없이 실제 표준 스트림으로 인쇄하는 데 유용할 수 있습니다.

또한 잘못된 객체로 덮어쓴 경우 실제 파일을 알려진 작동하는 파일 객체로 복원하는 데 사용할 수 있습니다. 그러나, 이를 수행하기 위해 선호되는 방법은 이전 스트림을 교체하기 전에 명시적으로 저장하고, 저장된 객체를 복원하는 것입니다.

@cartouche
@quotation 참고 
일부 조건에서, @code{stdin}, @code{stdout} 및 @code{stderr} 뿐만 아니라 원래 값 @code{__stdin__}, @code{__stdout__} 및 @code{__stderr__}은 @code{None}일 수 있습니다. 보통 콘솔에 연결되지 않은 윈도우 GUI 앱과 @code{pythonw}로 시작된 파이썬 앱이 이런 경우입니다.
@end quotation
@end cartouche
@end deffn

@geindex stdlib_module_names (sys 모듈)
@anchor{library/sys sys stdlib_module_names}@anchor{a42}
@deffn {데이터} sys.stdlib_module_names

A frozenset of strings containing the names of standard library modules.

It is the same on all platforms. Modules which are not available on
some platforms and modules disabled at Python build are also listed.
All module kinds are listed: pure Python, built-in, frozen and extension
modules. Test modules are excluded.

For packages, only the main package is listed: sub-packages and sub-modules
are not listed. For example, the @code{email} package is listed, but the
@code{email.mime} sub-package and the @code{email.message} sub-module are not
listed.

See also the @ref{2045,,sys.builtin_module_names} list.


Added in version 3.10.

@end deffn

@geindex thread_info (sys 모듈)
@anchor{library/sys sys thread_info}@anchor{1355}
@deffn {데이터} sys.thread_info

스레드 구현에 대한 정보를 담은 @ref{85d,,네임드 튜플}.

@geindex name (sys.thread_info의 속성)
@anchor{library/sys sys thread_info name}@anchor{4968}
@deffn {속성} thread_info.name

스레드 구현 이름:


@itemize *

@item 
@code{"nt"}: 윈도우 스레드

@item 
@code{"pthread"}: POSIX 스레드

@item 
@code{"pthread-stubs"}: stub POSIX threads
(on WebAssembly platforms without threading support)

@item 
@code{"solaris"}: 솔라리스 스레드
@end itemize
@end deffn

@geindex lock (sys.thread_info의 속성)
@anchor{library/sys sys thread_info lock}@anchor{4969}
@deffn {속성} thread_info.lock

록 구현 이름:


@itemize *

@item 
@code{"semaphore"}: 록은 세마포어를 사용합니다

@item 
@code{"mutex+cond"}: 록은 뮤텍스(mutex)와 조건 변수(condition variable)를 사용합니다

@item 
이 정보를 알 수 없으면 @code{None}
@end itemize
@end deffn

@geindex version (sys.thread_info의 속성)
@anchor{library/sys sys thread_info version}@anchor{496a}
@deffn {속성} thread_info.version

스레드 라이브러리의 이름과 버전. 문자열이거나, 이 정보를 알 수 없으면 @code{None}입니다.
@end deffn


Added in version 3.3.

@end deffn

@geindex tracebacklimit (sys 모듈)
@anchor{library/sys sys tracebacklimit}@anchor{1945}
@deffn {데이터} sys.tracebacklimit

이 변수가 정숫값으로 설정되면, 처리되지 않은 예외가 발생할 때 인쇄되는 트레이스백 정보의 최대 수준 수를 결정합니다. 기본값은 @code{1000}입니다. @code{0} 이하로 설정하면, 모든 트레이스백 정보가 억제되고 예외 형과 값만 인쇄됩니다.
@end deffn

@geindex unraisablehook() (sys 모듈)
@anchor{library/sys sys unraisablehook}@anchor{506}
@deffn {함수} sys.unraisablehook (unraisable, /)

발생시킬 수 없는 예외(unraisable exception)를 처리합니다.

예외가 발생했지만, 파이썬이 예외를 처리할 방법이 없을 때 호출됩니다. 예를 들어, 파괴자가 예외를 발생시키거나 가비지 수거 (@ref{1b3,,gc.collect()}) 중에.

`unraisable' 인자에는 다음과 같은 어트리뷰트가 있습니다:


@itemize *

@item 
@code{exc_type}: 예외 형.

@item 
@code{exc_value}: 예외 값. @code{None}일 수 있습니다.

@item 
@code{exc_traceback}: 예외 트레이스백, @code{None}일 수 있습니다.

@item 
@code{err_msg}: 에러 메시지, @code{None}일 수 있습니다.

@item 
@code{object}: 예외를 발생시킨 객체, @code{None}일 수 있습니다.
@end itemize

기본 훅은 @code{err_msg}와 @code{object}를 다음과 같이 포맷합니다: @code{f'@{err_msg@}: @{object!r@}'}; @code{err_msg}가 @code{None}이면 “Exception ignored in” 에러 메시지를 사용합니다.

@ref{506,,sys.unraisablehook()} 은 발생시킬 수 없는 예외 처리 방법을 제어하기 위해 재정의될 수 있습니다.


@subsubheading 더 보기


잡히지 않은 예외를 처리하는 @ref{a0c,,excepthook()}.


@cartouche
@quotation 경고 
사용자 정의 훅을 사용하여 @code{exc_value}를 저장하면 참조 순환이 만들어질 수 있습니다. 예외가 더는 필요하지 않을 때 참조 순환을 끊기 위해 명시적으로 지워야 합니다.

사용자 정의 훅을 사용하여 @code{object}를 저장하면 파이널라이즈 중인 객체로 설정될 때 그것을 되살릴 수 있습니다. 객체 되살림을 방지하려면 사용자 정의 훅이 완료된 후 @code{object}를 저장하지 마십시오.
@end quotation
@end cartouche

처리할 수 없는 예외가 발생할 때 인자 `hook', `unraisable'로 감사 이벤트 @code{sys.unraisablehook}을 발생시킵니다. `unraisable' 객체는 훅에 전달되는 것과 같습니다. 아무런 훅도 설정되지 않았으면, `hook'은 @code{None} 일 수 있습니다.


Added in version 3.8.

@end deffn

@geindex version (sys 모듈)
@anchor{library/sys sys version}@anchor{49d}
@deffn {데이터} sys.version

파이썬 인터프리터의 버전 번호와 빌드 번호 및 사용된 컴파일러에 대한 추가 정보가 포함된 문자열. 이 문자열은 대화식 인터프리터가 시작될 때 표시됩니다. 여기서 버전 정보를 추출하지 말고, @ref{8ae,,version_info}와 @ref{af,,platform} 모듈이 제공하는 함수를 사용하십시오.
@end deffn

@geindex api_version (sys 모듈)
@anchor{library/sys sys api_version}@anchor{496b}
@deffn {데이터} sys.api_version

The C API version, equivalent to the C macro @ref{496c,,PYTHON_API_VERSION}.
Defined for backwards compatibility.

Currently, this constant is not updated in new Python versions, and is not
useful for versioning. This may change in the future.
@end deffn

@geindex version_info (sys 모듈)
@anchor{library/sys sys version_info}@anchor{8ae}
@deffn {데이터} sys.version_info

버전 번호의 5가지 구성 요소를 포함하는 튜플: `major', `minor', `micro', `releaselevel' 및 `serial'. `releaselevel'을 제외한 모든 값은 정수입니다; 릴리스 수준은 @code{'alpha'}, @code{'beta'}, @code{'candidate'} 또는 @code{'final'}입니다. 파이썬 버전 2.0에 해당하는 @code{version_info} 값은 @code{(2, 0, 0, 'final', 0)}입니다. 구성 요소는 이름으로도 액세스 할 수 있어서, @code{sys.version_info[0]}는 @code{sys.version_info.major}와 동등합니다.


버전 3.1에서 변경: 이름있는 구성 요소 어트리뷰트를 추가했습니다.

@end deffn

@geindex warnoptions (sys 모듈)
@anchor{library/sys sys warnoptions}@anchor{3f5}
@deffn {데이터} sys.warnoptions

이것은 경고 프레임워크의 구현 세부 사항입니다; 이 값을 수정하지 마십시오. 경고 프레임워크에 대한 자세한 정보는 @ref{118,,warnings} 모듈을 참조하십시오.
@end deffn

@geindex winver (sys 모듈)
@anchor{library/sys sys winver}@anchor{496d}
@deffn {데이터} sys.winver

The version number used to form registry keys on Windows platforms. This is
stored as string resource 1000 in the Python DLL.  The value is normally the
major and minor versions of the running Python interpreter.  It is provided in the @code{sys}
module for informational purposes; modifying this value has no effect on the
registry keys used by Python.

@ref{213c,,가용성}: Windows.
@end deffn


@deffn {데이터} sys.monitoring

Namespace containing functions and constants for register callbacks
and controlling monitoring events.
See  @ref{e0,,sys.monitoring} for details.
@end deffn

@geindex _xoptions (sys 모듈)
@anchor{library/sys sys _xoptions}@anchor{212e}
@deffn {데이터} sys._xoptions

@ref{16f,,-X} 명령 줄 옵션을 통해 전달된 다양한 구현 특정 플래그의 딕셔너리. 옵션 이름은 명시적으로 지정되면 그들의 값으로, 그렇지 않으면 @ref{e06,,True}로 매핑됩니다. 예:

@example
$ ./python -Xa=b -Xc
Python 3.2a3+ (py3k, Oct 16 2010, 20:14:50)
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys._xoptions
@{'a': 'b', 'c': True@}
@end example

이는 @ref{16f,,-X}를 통해 전달된 옵션에 액세스하는 CPython 특정 방법입니다. 다른 구현은 다른 수단을 통해, 또는 전혀 노출하지 않을 수 있습니다.


Added in version 3.2.

@end deffn

@subsubheading 인용


@anchor{library/sys c99}@anchor{4948}@w{(C99)} 
ISO/IEC 9899:1999. “Programming languages – C.” 이 표준의 공개 초안은 @indicateurl{https://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf}에 있습니다.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node sys monitoring — Execution event monitoring,sysconfig — 파이썬의 구성 정보에 접근하기,sys — 시스템 특정 파라미터와 함수,파이썬 실행시간 서비스
@anchor{library/sys monitoring doc}@anchor{496e}@anchor{library/sys monitoring module-sys monitoring}@anchor{e0}@anchor{library/sys monitoring sys-monitoring-execution-event-monitoring}@anchor{496f}@anchor{library/sys monitoring translation-repo}@anchor{4970}
@subsection @code{sys.monitoring} — Execution event monitoring


@geindex module; sys.monitoring


Added in version 3.12.



__________________________________________________________________


@cartouche
@quotation 참고 
@code{sys.monitoring} is a namespace within the @ref{df,,sys} module,
not an independent module, so there is no need to
@code{import sys.monitoring}, simply @code{import sys} and then use
@code{sys.monitoring}.
@end quotation
@end cartouche

This namespace provides access to the functions and constants necessary to
activate and control event monitoring.

As programs execute, events occur that might be of interest to tools that
monitor execution. The @code{sys.monitoring} namespace provides means to
receive callbacks when events of interest occur.

The monitoring API consists of three components:


@itemize *

@item 
@ref{4971,,Tool identifiers}

@item 
@ref{4972,,Events}

@item 
@ref{4973,,Callbacks}
@end itemize

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

@end menu

@node Tool identifiers,Events,,sys monitoring — Execution event monitoring
@anchor{library/sys monitoring tool-identifiers}@anchor{4971}
@subsubsection Tool identifiers


A tool identifier is an integer and the associated name.
Tool identifiers are used to discourage tools from interfering with each
other and to allow multiple tools to operate at the same time.
Currently tools are completely independent and cannot be used to
monitor each other. This restriction may be lifted in the future.

Before registering or activating events, a tool should choose an identifier.
Identifiers are integers in the range 0 to 5 inclusive.

@menu
* Registering and using tools:: 

@end menu

@node Registering and using tools,,,Tool identifiers
@anchor{library/sys monitoring registering-and-using-tools}@anchor{4974}
@subsubsection Registering and using tools


@geindex use_tool_id() (sys.monitoring 모듈)
@anchor{library/sys monitoring sys monitoring use_tool_id}@anchor{4975}
@deffn {함수} sys.monitoring.use_tool_id (tool_id: int, name: str, /) -> None

Must be called before `tool_id' can be used.
`tool_id' must be in the range 0 to 5 inclusive.
Raises a @ref{2ec,,ValueError} if `tool_id' is in use.
@end deffn

@geindex clear_tool_id() (sys.monitoring 모듈)
@anchor{library/sys monitoring sys monitoring clear_tool_id}@anchor{192f}
@deffn {함수} sys.monitoring.clear_tool_id (tool_id: int, /) -> None

Unregister all events and callback functions associated with `tool_id'.
@end deffn

@geindex free_tool_id() (sys.monitoring 모듈)
@anchor{library/sys monitoring sys monitoring free_tool_id}@anchor{4976}
@deffn {함수} sys.monitoring.free_tool_id (tool_id: int, /) -> None

Should be called once a tool no longer requires `tool_id'.
Will call @ref{192f,,clear_tool_id()} before releasing `tool_id'.
@end deffn

@geindex get_tool() (sys.monitoring 모듈)
@anchor{library/sys monitoring sys monitoring get_tool}@anchor{4977}
@deffn {함수} sys.monitoring.get_tool (tool_id: int, /) -> str | None

Returns the name of the tool if `tool_id' is in use,
otherwise it returns @code{None}.
`tool_id' must be in the range 0 to 5 inclusive.
@end deffn

All IDs are treated the same by the VM with regard to events, but the
following IDs are pre-defined to make co-operation of tools easier:

@example
sys.monitoring.DEBUGGER_ID = 0
sys.monitoring.COVERAGE_ID = 1
sys.monitoring.PROFILER_ID = 2
sys.monitoring.OPTIMIZER_ID = 5
@end example

@node Events,Turning events on and off,Tool identifiers,sys monitoring — Execution event monitoring
@anchor{library/sys monitoring events}@anchor{4972}
@subsubsection Events


The following events are supported:

@geindex BRANCH_LEFT (monitoring event)
@anchor{library/sys monitoring monitoring-event-BRANCH_LEFT}@anchor{295}
@deffn {monitoring-event} sys.monitoring.events.BRANCH_LEFT

A conditional branch goes left.

It is up to the tool to determine how to present “left” and “right” branches.
There is no guarantee which branch is “left” and which is “right”, except
that it will be consistent for the duration of the program.
@end deffn

@geindex BRANCH_RIGHT (monitoring event)
@anchor{library/sys monitoring monitoring-event-BRANCH_RIGHT}@anchor{296}
@deffn {monitoring-event} sys.monitoring.events.BRANCH_RIGHT

A conditional branch goes right.
@end deffn

@geindex CALL (monitoring event)
@anchor{library/sys monitoring monitoring-event-CALL}@anchor{19bd}
@deffn {monitoring-event} sys.monitoring.events.CALL

A call in Python code (event occurs before the call).
@end deffn

@geindex C_RAISE (monitoring event)
@anchor{library/sys monitoring monitoring-event-C_RAISE}@anchor{4978}
@deffn {monitoring-event} sys.monitoring.events.C_RAISE

An exception raised from any callable, except for Python functions (event occurs after the exit).
@end deffn

@geindex C_RETURN (monitoring event)
@anchor{library/sys monitoring monitoring-event-C_RETURN}@anchor{4979}
@deffn {monitoring-event} sys.monitoring.events.C_RETURN

Return from any callable, except for Python functions (event occurs after the return).
@end deffn

@geindex EXCEPTION_HANDLED (monitoring event)
@anchor{library/sys monitoring monitoring-event-EXCEPTION_HANDLED}@anchor{497a}
@deffn {monitoring-event} sys.monitoring.events.EXCEPTION_HANDLED

An exception is handled.
@end deffn

@geindex INSTRUCTION (monitoring event)
@anchor{library/sys monitoring monitoring-event-INSTRUCTION}@anchor{497b}
@deffn {monitoring-event} sys.monitoring.events.INSTRUCTION

A VM instruction is about to be executed.
@end deffn

@geindex JUMP (monitoring event)
@anchor{library/sys monitoring monitoring-event-JUMP}@anchor{497c}
@deffn {monitoring-event} sys.monitoring.events.JUMP

An unconditional jump in the control flow graph is made.
@end deffn

@geindex LINE (monitoring event)
@anchor{library/sys monitoring monitoring-event-LINE}@anchor{497d}
@deffn {monitoring-event} sys.monitoring.events.LINE

An instruction is about to be executed that has a different line number from the preceding instruction.
@end deffn

@geindex PY_RESUME (monitoring event)
@anchor{library/sys monitoring monitoring-event-PY_RESUME}@anchor{497e}
@deffn {monitoring-event} sys.monitoring.events.PY_RESUME

Resumption of a Python function (for generator and coroutine functions), except for @code{throw()} calls.
@end deffn

@geindex PY_RETURN (monitoring event)
@anchor{library/sys monitoring monitoring-event-PY_RETURN}@anchor{497f}
@deffn {monitoring-event} sys.monitoring.events.PY_RETURN

Return from a Python function (occurs immediately before the return, the callee’s frame will be on the stack).
@end deffn

@geindex PY_START (monitoring event)
@anchor{library/sys monitoring monitoring-event-PY_START}@anchor{4980}
@deffn {monitoring-event} sys.monitoring.events.PY_START

Start of a Python function (occurs immediately after the call, the callee’s frame will be on the stack)
@end deffn

@geindex PY_THROW (monitoring event)
@anchor{library/sys monitoring monitoring-event-PY_THROW}@anchor{1858}
@deffn {monitoring-event} sys.monitoring.events.PY_THROW

A Python function is resumed by a @code{throw()} call.
@end deffn

@geindex PY_UNWIND (monitoring event)
@anchor{library/sys monitoring monitoring-event-PY_UNWIND}@anchor{4981}
@deffn {monitoring-event} sys.monitoring.events.PY_UNWIND

Exit from a Python function during exception unwinding. This includes exceptions raised directly within the
function and that are allowed to continue to propagate.
@end deffn

@geindex PY_YIELD (monitoring event)
@anchor{library/sys monitoring monitoring-event-PY_YIELD}@anchor{4982}
@deffn {monitoring-event} sys.monitoring.events.PY_YIELD

Yield from a Python function (occurs immediately before the yield, the callee’s frame will be on the stack).
@end deffn

@geindex RAISE (monitoring event)
@anchor{library/sys monitoring monitoring-event-RAISE}@anchor{1975}
@deffn {monitoring-event} sys.monitoring.events.RAISE

An exception is raised, except those that cause a @ref{4983,,STOP_ITERATION} event.
@end deffn

@geindex RERAISE (monitoring event)
@anchor{library/sys monitoring monitoring-event-RERAISE}@anchor{4984}
@deffn {monitoring-event} sys.monitoring.events.RERAISE

An exception is re-raised, for example at the end of a @ref{1b0,,finally} block.
@end deffn

@geindex STOP_ITERATION (monitoring event)
@anchor{library/sys monitoring monitoring-event-STOP_ITERATION}@anchor{4983}
@deffn {monitoring-event} sys.monitoring.events.STOP_ITERATION

An artificial @ref{df4,,StopIteration} is raised; see @ref{4985,,the STOP_ITERATION event}.
@end deffn

More events may be added in the future.

These events are attributes of the @code{sys.monitoring.events} namespace.
Each event is represented as a power-of-2 integer constant.
To define a set of events, simply bitwise OR the individual events together.
For example, to specify both @ref{497f,,PY_RETURN} and @ref{4980,,PY_START}
events, use the expression @code{PY_RETURN | PY_START}.

@geindex NO_EVENTS (monitoring event)
@anchor{library/sys monitoring monitoring-event-NO_EVENTS}@anchor{4986}
@deffn {monitoring-event} sys.monitoring.events.NO_EVENTS

An alias for @code{0} so users can do explicit comparisons like:

@example
if get_events(DEBUGGER_ID) == NO_EVENTS:
    ...
@end example

Setting this event deactivates all events.
@end deffn

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

@end menu

@node Local events,Deprecated event,,Events
@anchor{library/sys monitoring local-events}@anchor{4987}@anchor{library/sys monitoring monitoring-event-local}@anchor{4988}
@subsubsection Local events


Local events are associated with normal execution of the program and happen
at clearly defined locations. All local events can be disabled.
The local events are:


@itemize *

@item 
@ref{4980,,PY_START}

@item 
@ref{497e,,PY_RESUME}

@item 
@ref{497f,,PY_RETURN}

@item 
@ref{4982,,PY_YIELD}

@item 
@ref{19bd,,CALL}

@item 
@ref{497d,,LINE}

@item 
@ref{497b,,INSTRUCTION}

@item 
@ref{497c,,JUMP}

@item 
@ref{295,,BRANCH_LEFT}

@item 
@ref{296,,BRANCH_RIGHT}

@item 
@ref{4983,,STOP_ITERATION}
@end itemize

@node Deprecated event,Ancillary events,Local events,Events
@anchor{library/sys monitoring deprecated-event}@anchor{4989}
@subsubsection Deprecated event



@itemize *

@item 
@code{BRANCH}
@end itemize

The @code{BRANCH} event is deprecated in 3.14.
Using @ref{295,,BRANCH_LEFT} and @ref{296,,BRANCH_RIGHT}
events will give much better performance as they can be disabled
independently.

@node Ancillary events,Other events,Deprecated event,Events
@anchor{library/sys monitoring ancillary-events}@anchor{498a}
@subsubsection Ancillary events


Ancillary events can be monitored like other events, but are controlled
by another event:


@itemize *

@item 
@ref{4978,,C_RAISE}

@item 
@ref{4979,,C_RETURN}
@end itemize

The @ref{4979,,C_RETURN} and @ref{4978,,C_RAISE} events
are controlled by the @ref{19bd,,CALL} event.
@code{C_RETURN} and @code{C_RAISE} events will only be
seen if the corresponding @code{CALL} event is being monitored.

@node Other events,The STOP_ITERATION event,Ancillary events,Events
@anchor{library/sys monitoring monitoring-event-global}@anchor{498b}@anchor{library/sys monitoring other-events}@anchor{498c}
@subsubsection Other events


Other events are not necessarily tied to a specific location in the
program and cannot be individually disabled via @ref{498d,,DISABLE}.

The other events that can be monitored are:


@itemize *

@item 
@ref{1858,,PY_THROW}

@item 
@ref{4981,,PY_UNWIND}

@item 
@ref{1975,,RAISE}

@item 
@ref{497a,,EXCEPTION_HANDLED}
@end itemize

@node The STOP_ITERATION event,,Other events,Events
@anchor{library/sys monitoring the-stop-iteration-event}@anchor{4985}
@subsubsection The STOP_ITERATION event


@geindex Python 향상 제안; PEP 380#use-of-stopiteration-to-return-values
PEP 380@footnote{https://peps.python.org/pep-0380/#use-of-stopiteration-to-return-values}
specifies that a @ref{df4,,StopIteration} exception is raised when returning a value
from a generator or coroutine. However, this is a very inefficient way to
return a value, so some Python implementations, notably CPython 3.12+, do not
raise an exception unless it would be visible to other code.

To allow tools to monitor for real exceptions without slowing down generators
and coroutines, the @ref{4983,,STOP_ITERATION} event is provided.
@code{STOP_ITERATION} can be locally disabled, unlike
@ref{1975,,RAISE}.

Note that the @ref{4983,,STOP_ITERATION} event and the
@ref{1975,,RAISE} event for a @ref{df4,,StopIteration} exception are
equivalent, and are treated as interchangeable when generating events.
Implementations will favor @code{STOP_ITERATION} for performance
reasons, but may generate a @code{RAISE} event with a
@code{StopIteration}.

@node Turning events on and off,Registering callback functions,Events,sys monitoring — Execution event monitoring
@anchor{library/sys monitoring turning-events-on-and-off}@anchor{498e}
@subsubsection Turning events on and off


In order to monitor an event, it must be turned on and a corresponding callback
must be registered. Events can be turned on or off by setting the events either
globally and/or for a particular code object. An event will trigger only once,
even if it is turned on both globally and locally.

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

@end menu

@node Setting events globally,Per code object events,,Turning events on and off
@anchor{library/sys monitoring setting-events-globally}@anchor{498f}
@subsubsection Setting events globally


Events can be controlled globally by modifying the set of events being monitored.

@geindex get_events() (sys.monitoring 모듈)
@anchor{library/sys monitoring sys monitoring get_events}@anchor{4990}
@deffn {함수} sys.monitoring.get_events (tool_id: int, /) -> int

Returns the @code{int} representing all the active events.
@end deffn

@geindex set_events() (sys.monitoring 모듈)
@anchor{library/sys monitoring sys monitoring set_events}@anchor{4991}
@deffn {함수} sys.monitoring.set_events (tool_id: int, event_set: int, /) -> None

Activates all events which are set in `event_set'.
Raises a @ref{2ec,,ValueError} if `tool_id' is not in use.
@end deffn

No events are active by default.

@node Per code object events,Disabling events,Setting events globally,Turning events on and off
@anchor{library/sys monitoring per-code-object-events}@anchor{4992}
@subsubsection Per code object events


Events can also be controlled on a per code object basis. The functions
defined below which accept a @ref{32f,,types.CodeType} should be prepared
to accept a look-alike object from functions which are not defined
in Python (see @ref{486,,Monitoring C API}).

@geindex get_local_events() (sys.monitoring 모듈)
@anchor{library/sys monitoring sys monitoring get_local_events}@anchor{4993}
@deffn {함수} sys.monitoring.get_local_events (tool_id: int, code: CodeType, /) -> int

Returns all the @ref{4988,,local events} for `code'
@end deffn

@geindex set_local_events() (sys.monitoring 모듈)
@anchor{library/sys monitoring sys monitoring set_local_events}@anchor{4994}
@deffn {함수} sys.monitoring.set_local_events (tool_id: int, code: CodeType, event_set: int, /) -> None

Activates all the @ref{4988,,local events} for `code'
which are set in `event_set'. Raises a @ref{2ec,,ValueError} if `tool_id' is not
in use.
@end deffn

@node Disabling events,,Per code object events,Turning events on and off
@anchor{library/sys monitoring disabling-events}@anchor{4995}
@subsubsection Disabling events


@geindex DISABLE (sys.monitoring 모듈)
@anchor{library/sys monitoring sys monitoring DISABLE}@anchor{498d}
@deffn {데이터} sys.monitoring.DISABLE

A special value that can be returned from a callback function to disable
events for the current code location.
@end deffn

@ref{4988,,Local events} can be disabled for a specific code
location by returning @ref{498d,,sys.monitoring.DISABLE} from a callback function.
This does not change which events are set, or any other code locations for the
same event.

Disabling events for specific locations is very important for high
performance monitoring. For example, a program can be run under a
debugger with no overhead if the debugger disables all monitoring
except for a few breakpoints.

If @ref{498d,,DISABLE} is returned by a callback for a
@ref{498b,,global event}, @ref{2ec,,ValueError} will be raised
by the interpreter in a non-specific location (that is, no traceback will be
provided).

@geindex restart_events() (sys.monitoring 모듈)
@anchor{library/sys monitoring sys monitoring restart_events}@anchor{4996}
@deffn {함수} sys.monitoring.restart_events () -> None

Enable all the events that were disabled by @ref{498d,,sys.monitoring.DISABLE}
for all tools.
@end deffn

@node Registering callback functions,,Turning events on and off,sys monitoring — Execution event monitoring
@anchor{library/sys monitoring callbacks}@anchor{4973}@anchor{library/sys monitoring registering-callback-functions}@anchor{4997}
@subsubsection Registering callback functions


@geindex register_callback() (sys.monitoring 모듈)
@anchor{library/sys monitoring sys monitoring register_callback}@anchor{479f}
@deffn {함수} sys.monitoring.register_callback (tool_id: int, event: int, func: Callable | None, /) -> Callable | None

Registers the callable `func' for the `event' with the given `tool_id'

If another callback was registered for the given `tool_id' and `event',
it is unregistered and returned.
Otherwise @code{register_callback()} returns @code{None}.

Raises an @ref{1c6c,,auditing event} @code{sys.monitoring.register_callback} with argument @code{func}.
@end deffn

Functions can be unregistered by calling
@code{sys.monitoring.register_callback(tool_id, event, None)}.

Callback functions can be registered and unregistered at any time.

Callbacks are called only once regardless if the event is turned on both
globally and locally. As such, if an event could be turned on for both global
and local events by your code then the callback needs to be written to handle
either trigger.

@menu
* Callback function arguments:: 

@end menu

@node Callback function arguments,,,Registering callback functions
@anchor{library/sys monitoring callback-function-arguments}@anchor{4998}
@subsubsection Callback function arguments


@geindex MISSING (sys.monitoring 모듈)
@anchor{library/sys monitoring sys monitoring MISSING}@anchor{4999}
@deffn {데이터} sys.monitoring.MISSING

A special value that is passed to a callback function to indicate
that there are no arguments to the call.
@end deffn

When an active event occurs, the registered callback function is called.
Callback functions returning an object other than @ref{498d,,DISABLE} will have no effect.
Different events will provide the callback function with different arguments, as follows:


@itemize *

@item 
@ref{4980,,PY_START} and @ref{497e,,PY_RESUME}:

@example
func(code: CodeType, instruction_offset: int) -> object
@end example

@item 
@ref{497f,,PY_RETURN} and @ref{4982,,PY_YIELD}:

@example
func(code: CodeType, instruction_offset: int, retval: object) -> object
@end example

@item 
@ref{19bd,,CALL}, @ref{4978,,C_RAISE} and @ref{4979,,C_RETURN}
(`arg0' can be @ref{4999,,MISSING} specifically):

@example
func(code: CodeType, instruction_offset: int, callable: object, arg0: object) -> object
@end example

`code' represents the code object where the call is being made, while
`callable' is the object that is about to be called (and thus
triggered the event).
If there are no arguments, `arg0' is set to @ref{4999,,sys.monitoring.MISSING}.

For instance methods, `callable' will be the function object as found on the
class with `arg0' set to the instance (i.e. the @code{self} argument to the
method).

@item 
@ref{1975,,RAISE}, @ref{4984,,RERAISE}, @ref{497a,,EXCEPTION_HANDLED},
@ref{4981,,PY_UNWIND}, @ref{1858,,PY_THROW} and @ref{4983,,STOP_ITERATION}:

@example
func(code: CodeType, instruction_offset: int, exception: BaseException) -> object
@end example

@item 
@ref{497d,,LINE}:

@example
func(code: CodeType, line_number: int) -> object
@end example

@item 
@ref{295,,BRANCH_LEFT}, @ref{296,,BRANCH_RIGHT} and @ref{497c,,JUMP}:

@example
func(code: CodeType, instruction_offset: int, destination_offset: int) -> object
@end example

Note that the `destination_offset' is where the code will next execute.

@item 
@ref{497b,,INSTRUCTION}:

@example
func(code: CodeType, instruction_offset: int) -> object
@end example
@end itemize

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node sysconfig — 파이썬의 구성 정보에 접근하기,builtins — 내장 객체,sys monitoring — Execution event monitoring,파이썬 실행시간 서비스
@anchor{library/sysconfig doc}@anchor{499a}@anchor{library/sysconfig module-sysconfig}@anchor{e1}@anchor{library/sysconfig sysconfig-provide-access-to-python-s-configuration-information}@anchor{499b}@anchor{library/sysconfig translation-repo}@anchor{499c}
@subsection @code{sysconfig} — 파이썬의 구성 정보에 접근하기


@geindex module; sysconfig


Added in version 3.2.


`소스 코드:' Lib/sysconfig@footnote{https://github.com/python/cpython/tree/3.14/Lib/sysconfig}

@geindex 구성 정보


__________________________________________________________________


The @code{sysconfig} module provides access to Python’s configuration
information like the list of installation paths and the configuration variables
relevant for the current platform.

@menu
* 구성 변수:: 
* 설치 경로:: 
* User scheme:: 
* Home scheme:: 
* Prefix scheme:: 
* 설치 경로 함수:: 
* 기타 함수: 기타 함수<3>. 
* Command-line usage: Command-line usage<6>. 

@end menu

@node 구성 변수,설치 경로,,sysconfig — 파이썬의 구성 정보에 접근하기
@anchor{library/sysconfig configuration-variables}@anchor{499d}
@subsubsection 구성 변수


Python 배포판에는 @code{Makefile} 과 @code{pyconfig.h} 헤더 파일이 들어 있습니다. 이 파일은 파이썬 바이너리 자체와 @code{setuptools} 를 사용하여 컴파일된 타사 C 확장을 빌드하는 데 필요합니다.

@code{sysconfig} puts all variables found in these files in a dictionary that
can be accessed using @ref{298,,get_config_vars()} or @ref{174,,get_config_var()}.

윈도우에서는 훨씬 작은 세트입니다.

@geindex get_config_vars() (sysconfig 모듈)
@anchor{library/sysconfig sysconfig get_config_vars}@anchor{298}
@deffn {함수} sysconfig.get_config_vars (*args)

인자가 없으면, 현재 플랫폼과 관련된 모든 구성 변수의 딕셔너리를 반환합니다.

인자가 있으면, 인자를 사용하여 구성 변수 딕셔너리에서 각 인자를 조회한 결괏값 리스트를 돌려줍니다.

인자별로, 값이 없으면 @code{None} 을 반환합니다.
@end deffn

@geindex get_config_var() (sysconfig 모듈)
@anchor{library/sysconfig sysconfig get_config_var}@anchor{174}
@deffn {함수} sysconfig.get_config_var (name)

하나의 변수 `name' 의 값을 반환합니다. @code{get_config_vars().get(name)} 과 같습니다.

`name' 을 찾지 못하면 @code{None} 을 반환합니다.
@end deffn

사용 예:

@example
>>> import sysconfig
>>> sysconfig.get_config_var('Py_ENABLE_SHARED')
0
>>> sysconfig.get_config_var('LIBDIR')
'/usr/local/lib'
>>> sysconfig.get_config_vars('AR', 'CXX')
['ar', 'g++']
@end example

@node 설치 경로,User scheme,구성 변수,sysconfig — 파이썬의 구성 정보에 접근하기
@anchor{library/sysconfig id1}@anchor{499e}@anchor{library/sysconfig installation-paths}@anchor{449}
@subsubsection 설치 경로


Python uses an installation scheme that differs depending on the platform and on
the installation options.  These schemes are stored in @code{sysconfig} under
unique identifiers based on the value returned by @ref{302a,,os.name}.
The schemes are used by package installers to determine where to copy files to.

파이썬은 현재 9가지 스킴을 지원합니다:


@itemize -

@item 
`posix_prefix': 리눅스나 맥 OS 같은 포직스(POSIX) 플랫폼용 스킴. 이것은 파이썬이나 컴포넌트가 설치될 때 사용되는 기본 스킴입니다.

@item 
`posix_home': `home' 옵션이 사용될 때, 포직스 플랫폼용 스킴. 이 스킴은 특정 홈 접두어 아래에 있는 경로를 정의합니다.

@item 
`posix_user': `user' 옵션이 사용될 때, 포직스 플랫폼용 스킴. 이 스킴은 사용자 홈 디렉터리 아래에 있는 경로를 정의합니다 (@ref{1521,,site.USER_BASE}).

@item 
`posix_venv': scheme for @ref{117,,Python virtual environments} on POSIX
platforms; by default it is the same as `posix_prefix'.

@item 
`nt': 윈도우용 스킴. 이것은 파이썬이나 컴포넌트가 설치될 때 사용되는 기본 스킴입니다.

@item 
`nt_user': `user' 옵션이 사용될 때, 윈도우용 스킴.

@item 
`nt_venv': scheme for @ref{117,,Python virtual environments} on Windows;
by default it is the same as `nt'.

@item 
`venv': a scheme with values from either `posix_venv' or `nt_venv' depending
on the platform Python runs on.

@item 
`osx_framework_user': `user' 옵션이 사용될, 맥 OS용 스킴.
@end itemize

각 스킴은 일련의 경로로 구성되며 각 경로는 고유한 식별자를 가집니다. 파이썬은 현재 8개의 경로를 사용합니다:


@itemize -

@item 
`stdlib': 플랫폼마다 다르지 않은 표준 파이썬 라이브러리 파일이 들어있는 디렉터리.

@item 
`platstdlib': 플랫폼마다 다른 표준 파이썬 라이브러리 파일이 들어있는 디렉터리.

@item 
`platlib': 사이트마다, 플랫폼마다 다른 파일용 디렉터리.

@item 
`purelib': 사이트마다 다르지만, 플랫폼마다 다르지 않은 파일이 들어있는 디렉터리 (‘순수한’ 파이썬’).

@item 
`include': 파이썬 C-API 를 위한 플랫폼마다 다르지 않은 헤더 파일용 디렉터리.

@item 
`platinclude': 파이썬 C-API 를 위한 플랫폼마다 다른 헤더 파일용 디렉터리.

@item 
`scripts': 스크립트 파일용 디렉터리.

@item 
`data': 데이터 파일용 디렉터리.
@end itemize

@node User scheme,Home scheme,설치 경로,sysconfig — 파이썬의 구성 정보에 접근하기
@anchor{library/sysconfig sysconfig-user-scheme}@anchor{2134}@anchor{library/sysconfig user-scheme}@anchor{499f}
@subsubsection User scheme


This scheme is designed to be the most convenient solution for users that don’t
have write permission to the global site-packages directory or don’t want to
install into it.

Files will be installed into subdirectories of @ref{1521,,site.USER_BASE} (written
as @code{`userbase'} hereafter).  This scheme installs pure Python modules and
extension modules in the same location (also known as @ref{2123,,site.USER_SITE}).

@menu
* posix_user:: 
* nt_user:: 
* osx_framework_user:: 

@end menu

@node posix_user,nt_user,,User scheme
@anchor{library/sysconfig posix-user}@anchor{49a0}
@subsubsection @code{posix_user}



@multitable {xxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

경로

@tab

설치 디렉터리

@item

`stdlib'

@tab

@code{`userbase'/lib/python`X.Y'}

@item

`platstdlib'

@tab

@code{`userbase'/lib/python`X.Y'}

@item

`platlib'

@tab

@code{`userbase'/lib/python`X.Y'/site-packages}

@item

`purelib'

@tab

@code{`userbase'/lib/python`X.Y'/site-packages}

@item

`include'

@tab

@code{`userbase'/include/python`X.Y'}

@item

`scripts'

@tab

@code{`userbase'/bin}

@item

`data'

@tab

@code{`userbase'}

@end multitable


@node nt_user,osx_framework_user,posix_user,User scheme
@anchor{library/sysconfig nt-user}@anchor{49a1}
@subsubsection @code{nt_user}



@multitable {xxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

경로

@tab

설치 디렉터리

@item

`stdlib'

@tab

@code{`userbase'\Python`XY'}

@item

`platstdlib'

@tab

@code{`userbase'\Python`XY'}

@item

`platlib'

@tab

@code{`userbase'\Python`XY'\site-packages}

@item

`purelib'

@tab

@code{`userbase'\Python`XY'\site-packages}

@item

`include'

@tab

@code{`userbase'\Python`XY'\Include}

@item

`scripts'

@tab

@code{`userbase'\Python`XY'\Scripts}

@item

`data'

@tab

@code{`userbase'}

@end multitable


@node osx_framework_user,,nt_user,User scheme
@anchor{library/sysconfig osx-framework-user}@anchor{49a2}
@subsubsection @code{osx_framework_user}



@multitable {xxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

경로

@tab

설치 디렉터리

@item

`stdlib'

@tab

@code{`userbase'/lib/python}

@item

`platstdlib'

@tab

@code{`userbase'/lib/python}

@item

`platlib'

@tab

@code{`userbase'/lib/python/site-packages}

@item

`purelib'

@tab

@code{`userbase'/lib/python/site-packages}

@item

`include'

@tab

@code{`userbase'/include/python`X.Y'}

@item

`scripts'

@tab

@code{`userbase'/bin}

@item

`data'

@tab

@code{`userbase'}

@end multitable


@node Home scheme,Prefix scheme,User scheme,sysconfig — 파이썬의 구성 정보에 접근하기
@anchor{library/sysconfig home-scheme}@anchor{49a3}@anchor{library/sysconfig sysconfig-home-scheme}@anchor{49a4}
@subsubsection Home scheme


The idea behind the “home scheme” is that you build and maintain a personal
stash of Python modules.  This scheme’s name is derived from the idea of a
“home” directory on Unix, since it’s not unusual for a Unix user to make their
home directory have a layout similar to @code{/usr/} or @code{/usr/local/}.
This scheme can be used by anyone, regardless of the operating system they
are installing for.

@menu
* posix_home:: 

@end menu

@node posix_home,,,Home scheme
@anchor{library/sysconfig posix-home}@anchor{49a5}
@subsubsection @code{posix_home}



@multitable {xxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

경로

@tab

설치 디렉터리

@item

`stdlib'

@tab

@code{`home'/lib/python}

@item

`platstdlib'

@tab

@code{`home'/lib/python}

@item

`platlib'

@tab

@code{`home'/lib/python}

@item

`purelib'

@tab

@code{`home'/lib/python}

@item

`include'

@tab

@code{`home'/include/python}

@item

`platinclude'

@tab

@code{`home'/include/python}

@item

`scripts'

@tab

@code{`home'/bin}

@item

`data'

@tab

@code{`home'}

@end multitable


@node Prefix scheme,설치 경로 함수,Home scheme,sysconfig — 파이썬의 구성 정보에 접근하기
@anchor{library/sysconfig prefix-scheme}@anchor{49a6}@anchor{library/sysconfig sysconfig-prefix-scheme}@anchor{49a7}
@subsubsection Prefix scheme


The “prefix scheme” is useful when you wish to use one Python installation to
perform the build/install (i.e., to run the setup script), but install modules
into the third-party module directory of a different Python installation (or
something that looks like a different Python installation).  If this sounds a
trifle unusual, it is—that’s why the user and home schemes come before.  However,
there are at least two known cases where the prefix scheme will be useful.

First, consider that many Linux distributions put Python in @code{/usr}, rather
than the more traditional @code{/usr/local}.  This is entirely appropriate,
since in those cases Python is part of “the system” rather than a local add-on.
However, if you are installing Python modules from source, you probably want
them to go in @code{/usr/local/lib/python2.`X'} rather than
@code{/usr/lib/python2.`X'}.

Another possibility is a network filesystem where the name used to write to a
remote directory is different from the name used to read it: for example, the
Python interpreter accessed as @code{/usr/local/bin/python} might search for
modules in @code{/usr/local/lib/python2.`X'}, but those modules would have to
be installed to, say, @code{/mnt/`@@server'/export/lib/python2.`X'}.

@menu
* posix_prefix:: 
* nt:: 

@end menu

@node posix_prefix,nt,,Prefix scheme
@anchor{library/sysconfig posix-prefix}@anchor{49a8}
@subsubsection @code{posix_prefix}



@multitable {xxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

경로

@tab

설치 디렉터리

@item

`stdlib'

@tab

@code{`prefix'/lib/python`X.Y'}

@item

`platstdlib'

@tab

@code{`prefix'/lib/python`X.Y'}

@item

`platlib'

@tab

@code{`prefix'/lib/python`X.Y'/site-packages}

@item

`purelib'

@tab

@code{`prefix'/lib/python`X.Y'/site-packages}

@item

`include'

@tab

@code{`prefix'/include/python`X.Y'}

@item

`platinclude'

@tab

@code{`prefix'/include/python`X.Y'}

@item

`scripts'

@tab

@code{`prefix'/bin}

@item

`data'

@tab

@code{`prefix'}

@end multitable


@node nt,,posix_prefix,Prefix scheme
@anchor{library/sysconfig nt}@anchor{49a9}
@subsubsection @code{nt}



@multitable {xxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

경로

@tab

설치 디렉터리

@item

`stdlib'

@tab

@code{`prefix'\Lib}

@item

`platstdlib'

@tab

@code{`prefix'\Lib}

@item

`platlib'

@tab

@code{`prefix'\Lib\site-packages}

@item

`purelib'

@tab

@code{`prefix'\Lib\site-packages}

@item

`include'

@tab

@code{`prefix'\Include}

@item

`platinclude'

@tab

@code{`prefix'\Include}

@item

`scripts'

@tab

@code{`prefix'\Scripts}

@item

`data'

@tab

@code{`prefix'}

@end multitable


@node 설치 경로 함수,기타 함수<3>,Prefix scheme,sysconfig — 파이썬의 구성 정보에 접근하기
@anchor{library/sysconfig installation-path-functions}@anchor{49aa}
@subsubsection 설치 경로 함수


@code{sysconfig} provides some functions to determine these installation paths.

@geindex get_scheme_names() (sysconfig 모듈)
@anchor{library/sysconfig sysconfig get_scheme_names}@anchor{49ab}
@deffn {함수} sysconfig.get_scheme_names ()

Return a tuple containing all schemes currently supported in
@code{sysconfig}.
@end deffn

@geindex get_default_scheme() (sysconfig 모듈)
@anchor{library/sysconfig sysconfig get_default_scheme}@anchor{1bb3}
@deffn {함수} sysconfig.get_default_scheme ()

현재 플랫폼에 대한 기본 스킴 이름을 반환합니다.


Added in version 3.10: This function was previously named @code{_get_default_scheme()} and
considered an implementation detail.



버전 3.11에서 변경: When Python runs from a virtual environment,
the `venv' scheme is returned.

@end deffn

@geindex get_preferred_scheme() (sysconfig 모듈)
@anchor{library/sysconfig sysconfig get_preferred_scheme}@anchor{89e}
@deffn {함수} sysconfig.get_preferred_scheme (key)

Return a preferred scheme name for an installation layout specified by `key'.

`key' must be either @code{"prefix"}, @code{"home"}, or @code{"user"}.

The return value is a scheme name listed in @ref{49ab,,get_scheme_names()}. It
can be passed to @code{sysconfig} functions that take a `scheme' argument,
such as @ref{340,,get_paths()}.


Added in version 3.10.



버전 3.11에서 변경: When Python runs from a virtual environment and @code{key="prefix"},
the `venv' scheme is returned.

@end deffn

@geindex _get_preferred_schemes() (sysconfig 모듈)
@anchor{library/sysconfig sysconfig _get_preferred_schemes}@anchor{49ac}
@deffn {함수} sysconfig._get_preferred_schemes ()

Return a dict containing preferred scheme names on the current platform.
Python implementers and redistributors may add their preferred schemes to
the @code{_INSTALL_SCHEMES} module-level global value, and modify this function
to return those scheme names, to e.g. provide different schemes for system
and language package managers to use, so packages installed by either do not
mix with those by the other.

End users should not use this function, but @ref{1bb3,,get_default_scheme()} and
@ref{89e,,get_preferred_scheme()} instead.


Added in version 3.10.

@end deffn

@geindex get_path_names() (sysconfig 모듈)
@anchor{library/sysconfig sysconfig get_path_names}@anchor{49ad}
@deffn {함수} sysconfig.get_path_names ()

Return a tuple containing all path names currently supported in
@code{sysconfig}.
@end deffn

@geindex get_path() (sysconfig 모듈)
@anchor{library/sysconfig sysconfig get_path}@anchor{1532}
@deffn {함수} sysconfig.get_path (name[, scheme[, vars[, expand]]])

`scheme' 이라는 설치 스킴에서, 경로 `name' 에 해당하는 설치 경로를 돌려줍니다.

`name' 은 @ref{49ad,,get_path_names()} 가 돌려주는 리스트에 있는 값이어야 합니다.

@code{sysconfig} stores installation paths corresponding to each path name,
for each platform, with variables to be expanded.  For instance the `stdlib'
path for the `nt' scheme is: @code{@{base@}/Lib}.

@ref{1532,,get_path()} 는 @ref{298,,get_config_vars()} 에 의해 반환된 변수를 사용하여 경로를 확장합니다. 모든 변수는 각 플랫폼에 대한 기본값을 가지므로 이 함수를 호출하고 기본값을 가져올 수 있습니다.

`scheme' 이 제공되면, 그것은 @ref{49ab,,get_scheme_names()} 에 의해 반환된 리스트에 있는 값이어야 합니다. 그렇지 않으면, 현재 플랫폼의 기본 스킴이 사용됩니다.

`vars' 가 제공되면, @ref{298,,get_config_vars()} 에 의해 반환된 딕셔너리를 갱신할 변수의 딕셔너리여야 합니다.

`expand' 가 @code{False} 로 설정되면, 경로는 변수를 사용하여 확장되지 않습니다.

`name' 을 찾지 못하면, @ref{5e5,,KeyError}를 발생시킵니다.
@end deffn

@geindex get_paths() (sysconfig 모듈)
@anchor{library/sysconfig sysconfig get_paths}@anchor{340}
@deffn {함수} sysconfig.get_paths ([scheme[, vars[, expand]]])

설치 스킴에 해당하는 모든 설치 경로를 포함하는 딕셔너리를 돌려줍니다. 자세한 정보는 @ref{1532,,get_path()} 를 보십시오.

`scheme' 을 제공하지 않으면, 현재 플랫폼에 대한 기본 스킴을 사용합니다.

`vars' 가 제공되면, 경로를 확장하는 데 사용되는 딕셔너리를 갱신하는 변수의 딕셔너리여야 합니다.

`expand' 를 거짓으로 설정하면 경로가 확장되지 않습니다.

`scheme' 이 존재하는 스킴이 아니면, @ref{340,,get_paths()} 는 @ref{5e5,,KeyError} 를 발생시킵니다.
@end deffn

@node 기타 함수<3>,Command-line usage<6>,설치 경로 함수,sysconfig — 파이썬의 구성 정보에 접근하기
@anchor{library/sysconfig other-functions}@anchor{49ae}
@subsubsection 기타 함수


@geindex get_python_version() (sysconfig 모듈)
@anchor{library/sysconfig sysconfig get_python_version}@anchor{1448}
@deffn {함수} sysconfig.get_python_version ()

@code{MAJOR.MINOR} 파이썬 버전 번호를 문자열로 반환합니다. @code{'%d.%d' % sys.version_info[:2]} 와 유사합니다.
@end deffn

@geindex get_platform() (sysconfig 모듈)
@anchor{library/sysconfig sysconfig get_platform}@anchor{1447}
@deffn {함수} sysconfig.get_platform ()

현재의 플랫폼을 식별하는 문자열을 돌려줍니다.

이는 주로 플랫폼별 빌드 디렉터리와 플랫폼별로 빌드 된 배포판을 구별하기 위해 사용됩니다. 포함된 정확한 정보는 OS에 따라 다르지만, 일반적으로 OS 이름과 버전 및 아키텍처를 포함합니다 (@ref{131b,,os.uname()} 에서 제공됩니다); 예를 들어, 리눅스에서 커널 버전은 특별히 중요하지 않습니다.

반환 값의 예:

Windows:


@itemize -

@item 
win-amd64 (AMD64의 64비트 윈도우, 일명 x86_64, Intel64, EM64T 등)

@item 
win-arm64 (ARM64의 64비트 윈도우, 일명 AArch64)

@item 
win32 (기타 모든 것 - 구체적으로, sys.platform이 반환됩니다)
@end itemize

POSIX based OS:


@itemize -

@item 
linux-x86_64

@item 
macosx-15.5-arm64

@item 
macosx-26.0-universal2 (macOS on Apple Silicon or Intel)

@item 
android-24-arm64_v8a
@end itemize

다른 포직스 이외의 플랫폼의 경우, 현재는 @ref{291,,sys.platform} 만 반환합니다.
@end deffn

@geindex is_python_build() (sysconfig 모듈)
@anchor{library/sysconfig sysconfig is_python_build}@anchor{32d}
@deffn {함수} sysconfig.is_python_build ()

실행 중인 파이썬 인터프리터가 소스에서 빌드되어 빌드 된 위치에서 실행되고, @code{make install} 을 실행하거나 바이너리 설치 프로그램을 통해 설치 한 결과가 아닌 위치에서 실행되는 것이 아니라면 @code{True} 를 반환합니다.
@end deffn

@geindex parse_config_h() (sysconfig 모듈)
@anchor{library/sysconfig sysconfig parse_config_h}@anchor{49af}
@deffn {함수} sysconfig.parse_config_h (fp[, vars])

@code{config.h}-스타일 파일을 해석합니다.

`fp' 는 @code{config.h}-류 파일을 가리키는 파일류 객체입니다.

이름/값 쌍을 포함하는 딕셔너리가 반환됩니다. 선택적 딕셔너리가 두 번째 인자로 전달되면, 새 사전 대신 사용되며 파일에서 읽은 값으로 갱신됩니다.
@end deffn

@geindex get_config_h_filename() (sysconfig 모듈)
@anchor{library/sysconfig sysconfig get_config_h_filename}@anchor{49b0}
@deffn {함수} sysconfig.get_config_h_filename ()

@code{pyconfig.h} 의 경로를 반환합니다.
@end deffn

@geindex get_makefile_filename() (sysconfig 모듈)
@anchor{library/sysconfig sysconfig get_makefile_filename}@anchor{49b1}
@deffn {함수} sysconfig.get_makefile_filename ()

@code{Makefile} 의 경로를 반환합니다.
@end deffn
@anchor{library/sysconfig sysconfig-cli}@anchor{49b2}
@node Command-line usage<6>,,기타 함수<3>,sysconfig — 파이썬의 구성 정보에 접근하기
@anchor{library/sysconfig command-line-usage}@anchor{49b3}@anchor{library/sysconfig using-sysconfig-as-a-script}@anchor{49b4}
@subsubsection Command-line usage


You can use @code{sysconfig} as a script with Python’s `-m' option:

@example
$ python -m sysconfig
Platform: "macosx-10.4-i386"
Python version: "3.2"
Current installation scheme: "posix_prefix"

Paths:
        data = "/usr/local"
        include = "/Users/tarek/Dev/svn.python.org/py3k/Include"
        platinclude = "."
        platlib = "/usr/local/lib/python3.2/site-packages"
        platstdlib = "/usr/local/lib/python3.2"
        purelib = "/usr/local/lib/python3.2/site-packages"
        scripts = "/usr/local/bin"
        stdlib = "/usr/local/lib/python3.2"

Variables:
        AC_APPLE_UNIVERSAL_BUILD = "0"
        AIX_GENUINE_CPLUSPLUS = "0"
        AR = "ar"
        ARFLAGS = "rc"
        ...
@end example

이 호출은 @ref{1447,,get_platform()}, @ref{1448,,get_python_version()}, @ref{1532,,get_path()} 및 @ref{298,,get_config_vars()} 에 의해 반환된 정보를 표준 출력에 인쇄합니다.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node builtins — 내장 객체,__main__ — 최상위 코드 환경,sysconfig — 파이썬의 구성 정보에 접근하기,파이썬 실행시간 서비스
@anchor{library/builtins doc}@anchor{49b5}@anchor{library/builtins builtins-built-in-objects}@anchor{49b6}@anchor{library/builtins module-builtins}@anchor{13}@anchor{library/builtins translation-repo}@anchor{49b7}
@subsection @code{builtins} — 내장 객체


@geindex module; builtins


__________________________________________________________________


이 모듈은 파이썬의 모든 ‘내장’ 식별자에 대한 직접 액세스를 제공합니다. 예를 들어, @code{builtins.open} 은 내장 함수 @ref{316,,open()} 의 완전한 이름입니다.

이 모듈은 일반적으로 대부분의 응용 프로그램에서 명시적으로 액세스하지 않지만, 내장된 값과 이름이 같은 객체를 제공하면서도 그 이름의 내장 객체가 필요한 모듈에서 유용 할 수 있습니다. 예를 들어, 내장 @ref{316,,open()} 을 감싸는 @code{open()} 함수를 구현하고자 하는 모듈에서 이 모듈을 직접 사용할 수 있습니다:

@example
import builtins

def open(path):
    f = builtins.open(path, 'r')
    return UpperCaser(f)

class UpperCaser:
    '@w{'}'출력을 대문자로 변환하도록 파일을 감싸는 래퍼.'@w{'}'

    def __init__(self, f):
        self._f = f

    def read(self, count=-1):
        return self._f.read(count).upper()

    # ...
@end example

구현 세부 사항으로, 대부분 모듈은 전역 변수로 @code{__builtins__} 라는 이름을 가지고 있습니다. @code{__builtins__} 의 값은, 보통 이 모듈이거나 모듈의 @ref{77c,,__dict__} 어트리뷰트의 값입니다. 이것은 구현 세부 사항이므로, 파이썬의 대안 구현에서는 사용되지 않을 수 있습니다.


@subsubheading 더 보기



@itemize *

@item 
@ref{2477,,내장 상수}

@item 
@ref{1c25,,내장 예외}

@item 
@ref{1461,,내장 함수}

@item 
@ref{25ea,,내장형}
@end itemize


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node __main__ — 최상위 코드 환경,warnings — 경고 제어,builtins — 내장 객체,파이썬 실행시간 서비스
@anchor{library/__main__ doc}@anchor{49b8}@anchor{library/__main__ main-top-level-code-environment}@anchor{49b9}@anchor{library/__main__ module-__main__}@anchor{1}@anchor{library/__main__ translation-repo}@anchor{49ba}
@subsection @code{__main__} — 최상위 코드 환경


@geindex module; __main__


__________________________________________________________________


파이썬에서 특수 이름 @code{__main__} 은 두 가지 중요한 구조에 사용됩니다:


@enumerate 

@item 
프로그램의 최상위 환경 이름으로, @code{__name__ == '__main__'} 식을 사용하여 확인 할 수 있습니다; 그리고

@item 
파이썬 패키지의 @code{__main__.py} 파일입니다.
@end enumerate

이 두 메커니즘은 파이썬 모듈과 관련이 있으며, 사용자가 그것과 상호작용을 하는 방식과 그들끼리 상호작용을 하는 방식에 관한 것입니다. 자세한 내용은 아래에서 설명합니다. 파이썬의 모듈이 처음이라면 자습서의 @ref{203c,,모듈} 를 참고하십시오.

@menu
* __name__ == '__main__':: 
* 파이썬 패키지의 __main__.py: 파이썬 패키지의 __main__ py. 
* import __main__:: 

@end menu

@node __name__ == '__main__',파이썬 패키지의 __main__ py,,__main__ — 최상위 코드 환경
@anchor{library/__main__ name-equals-main}@anchor{49bb}@anchor{library/__main__ name-main}@anchor{49bc}
@subsubsection @code{__name__ == '__main__'}


파이썬 모듈이나 패키지가 임포트 되면, @code{__name__} 은 해당 모듈의 이름으로 설정됩니다. 보통, 이름은 @code{.py} 확장자를 제외한 파이썬 파일 자체의 이름입니다:

@example
>>> import configparser
>>> configparser.__name__
'configparser'
@end example

파일이 패키지의 일부라면, @code{__name__} 은 상위 패키지 경로도 포함합니다:

@example
>>> from concurrent.futures import process
>>> process.__name__
'concurrent.futures.process'
@end example

그러나 모듈이 최상위 코드 환경에서 실행될 경우, @code{__name__} 은 문자열 @code{__main__} 으로 설정됩니다.

@menu
* “최상위 코드 환경” 이란 무엇인가요?:: 
* 관용적 사용법:: 
* 패키징 고려 사항:: 

@end menu

@node “최상위 코드 환경” 이란 무엇인가요?,관용적 사용법,,__name__ == '__main__'
@anchor{library/__main__ what-is-the-top-level-code-environment}@anchor{49bd}
@subsubsection “최상위 코드 환경” 이란 무엇인가요?


@code{__main__} 은 최상위 코드가 실행되는 환경의 이름입니다. “최상위 코드” 란 사용자가 지정한 첫 번째 파이썬 모듈로, 실행을 시작하는 모듈입니다. “최상위” 라고 부르는 이유는 프로그램이 필요로 하는 다른 모든 모듈을 임포트하기 때문입니다. 때때로 “최상위 코드” 는 응용 프로그램의 `진입 지점' 이라고도 합니다.

최상위 코드 환경은 다음과 같습니다:


@itemize *

@item 
대화형 프롬프트의 스코프:

@example
>>> __name__
'__main__'
@end example

@item 
파이썬 인터프리터에 파일 인자로 전달된 파이썬 모듈:

@example
$ python helloworld.py
Hello, world!
@end example

@item 
파이썬 인터프리터 @ref{23c,,-m} 인자로 전달된 파이썬 모듈이나 패키지:

@example
$ python -m tarfile
usage: tarfile.py [-h] [-v] (...)
@end example

@item 
표준 입력으로부터 파이썬 인터프리터가 읽은 코드:

@example
$ echo "import this" | python
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
...
@end example

@item 
파이썬 인터프리터에 @ref{1a8,,-c} 인자로 전달된 파이썬 코드:

@example
$ python -c "import this"
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
...
@end example
@end itemize

이러한 모든 경우에서, 최상위 모듈의 @code{__name__} 은 @code{'__main__'} 으로 설정됩니다.

결과적으로, 모듈은 자신의 @code{__name__} 을 검사하여 최상위 환경에서 실행 중인지를 확인할 수 있습니다. 이 때문에 모듈이 임포트 문에서 초기화되지 않을 때 조건부로 코드를 실행하는 공통 관용구를 사용할 수 있습니다:

@example
if __name__ == '__main__':
    # 모듈이 임포트 문에서 초기화되지 않을 때 실행합니다.
    ...
@end example


@subsubheading 더 보기


@code{__name__} 이 다양한 상황에서 어떻게 설정되는 것에 대한 자세한 내용은 자습서의 @ref{203c,,모듈} 을 참고하십시오.


@node 관용적 사용법,패키징 고려 사항,“최상위 코드 환경” 이란 무엇인가요?,__name__ == '__main__'
@anchor{library/__main__ idiomatic-usage}@anchor{49be}
@subsubsection 관용적 사용법


일부 모듈에는 명령줄 인자를 분석하거나 표준 입력에서 데이터를 가져오는 등, 스크립트용으로만 의도된 코드가 포함되어 있습니다. 이러한 모듈을 다른 모듈에서 임포트하면, 예를 들어 유닛 테스트를 위해 임포트를 할 때도, 스크립트 코드가 의도치 않게 실행될 수 있습니다.

이럴 때 @code{if __name__ == '__main__'} 코드 블록을 사용하면 유용합니다. 이 블록 안의 코드는 모듈이 최상위 환경에서 실행되지 않는 한 실행되지 않습니다.

@code{if __name__ == '__main__'} 아래의 블록에서는 가능한 적은 구문을 두는 것이 코드의 명확성과 정확성을 높일 수 있습니다. 대부분은 @code{main} 이라는 함수를 정의해 프로그램의 주요 동작을 캡슐화합니다:

@example
# echo.py

import shlex
import sys

def echo(phrase: str) -> None:
   """print 를 둘러싼 더미 래퍼."""
   # 시연의 목적으로, 이 함수 안에 쓸모있고 재사용할 수 있는
   #  로직이 있다고 상상할 수 있습니다
   print(phrase)

def main() -> int:
    """입력 인자를 표준 출력으로 에코합니다"""
    phrase = shlex.join(sys.argv)
    echo(phrase)
    return 0

if __name__ == '__main__':
    sys.exit(main())  # 다음 절에서 sys.exit 의 사용에 대해 설명합니다
@end example

모듈이 코드를 @code{main} 함수 안에 캡슐화하지 않고 @code{if __name__ == '__main__'} 블록 안에 직접 작성한다면, @code{phrase} 는 모듈 전체에서 전역 변수가 됩니다. 이 경우 모듈 내의 다른 함수들이 지역 이름 대신 전역 변수를 의도치 않게 사용할 수 있어 오류가 발생하기 쉽습니다. @code{main} 함수는 이러한 문제를 해결합니다.

@code{main} 함수를 사용하는 또 다른 장점은 @code{echo} 함수 자체와 분리되어 다른 곳에서도 임포트 할 수 있다는 점입니다. @code{echo.py} 가 임포트 되면 @code{echo} 와 @code{main} 함수가 정의되지만, @code{__name__ != '__main__'} 이므로 두 함수 중 어느 것도 호출되지 않습니다.

@node 패키징 고려 사항,,관용적 사용법,__name__ == '__main__'
@anchor{library/__main__ packaging-considerations}@anchor{49bf}
@subsubsection 패키징 고려 사항


@code{main} 함수는 콘솔 스크립트의 진입 지점으로 지정하여 명령줄 도구를 만들 때 자주 사용됩니다. 이 경우 pip@footnote{https://pip.pypa.io/} 는 함수 호출을 템플릿 스크립트에 삽입하며, @code{main} 의 반환 값은 @ref{277,,sys.exit()} 로 전달됩니다. 예를 들면:

@example
sys.exit(main())
@end example

@code{main} 호출이 @ref{277,,sys.exit()} 로 감싸져 있으므로, 함수는 @code{sys.exit()} 의 입력으로 사용될 수 있는 값을 반환해야 합니다. 일반적으로 이는 정수이거나, 함수의 반환문이 없는 경우 암묵적으로 반환되는 @code{None} 입니다.

이 규칙을 따름으로써, 모듈은 나중에 pip로 설치 가능한 패키지의 콘솔 스크립트 진입 지점으로 배포되더라도, 직접 실행할 때 (예를 들어 @code{python echo.py})와 동일한 동작을 하게 됩니다.

특히 @code{main} 에서 문자열을 반환할 때 주의해야 합니다. @ref{277,,sys.exit()} 함수는 문자열 인자를 실패 메시지로 해석하므로, 프로그램의 종료 코드는 실패를 의미하는 @code{1} 이 되고, 문자열은 @ref{b33,,sys.stderr} 에 기록됩니다. 앞서 언급한 @code{echo.py} 의 예제는 @code{sys.exit(main())} 규칙 사용을 잘 보여줍니다.


@subsubheading 더 보기


Python Packaging User Guide@footnote{https://packaging.python.org/} 는 현대적인 도구를 사용하여 파이썬 패키지를 배포하고 설치하는 방법에 대한 자습서와 참고 자료를 제공합니다.


@node 파이썬 패키지의 __main__ py,import __main__,__name__ == '__main__',__main__ — 최상위 코드 환경
@anchor{library/__main__ main-py-in-python-packages}@anchor{49c0}
@subsubsection 파이썬 패키지의 @code{__main__.py}


파이썬 패키지에 익숙하지 않다면, 자습서의 @ref{204c,,패키지} 를 참고하십시오. 대부분의 경우 @code{__main.py__} 파일은 패키지에 명령줄 인터페이스를 제공하는 데 사용됩니다. 다음은 가상의 패키지 “bandclass” 예시입니다:

@example
bandclass
  ├── __init__.py
  ├── __main__.py
  └── student.py
@end example

@ref{23c,,-m} 플래그를 사용해 명령줄에서 패키지 자체를 직접 호출하면, @code{__main__.py} 가 실행됩니다. 예를 들어:

@example
$ python -m bandclass
@end example

이 명령은 @code{__main__.py} 를 실행시킵니다. 이 메커니즘을 어떻게 활용할지는 작성 중인 패키지의 성격에 따라 달라지지만, 이 가상의 예시에서는 교사가 학생을 검색할 수 있도록 하는 것이 합리적일 것입니다:

@example
# bandclass/__main__.py

import sys
from .student import search_students

student_name = sys.argv[1] if len(sys.argv) >= 2 else '@w{'}
print(f'Found student: @{search_students(student_name)@}')
@end example

@code{from .student import search_students} 는 상대 임포트의 예시입니다. 이 임포트 방식은 패키지 내부의 모듈을 참조할 때 사용할 수 있습니다. 자세한 내용은 자습서의 @ref{203c,,모듈} 부분의 @ref{2050,,패키지 내부 간의 참조} 를 참고하십시오.

@menu
* 관용적 사용법: 관용적 사용법<2>. 

@end menu

@node 관용적 사용법<2>,,,파이썬 패키지의 __main__ py
@anchor{library/__main__ id1}@anchor{49c1}
@subsubsection 관용적 사용법


일반적으로 @code{__main__.py} 의 내용은 @code{if __name__ == '__main__'} 블록으로 감싸지 않습니다. 대신, 파일을 간결하게 유지하고 실행할 함수들을 다른 모듈에서 임포트합니다. 이렇게 하면 다른 모듈은 손쉽게 단위 테스트할 수 있고, 재사용하기에도 적합합니다.

만약 사용할 때에도, 패키지 내의 @code{__main__.py} 파일에서는 @code{if __name__ == '__main__'} 블록이 예상대로 동작합니다. 임포트될 때 @code{__name__} 속성에 패키지의 경로가 포함되기 때문입니다:

@example
>>> import asyncio.__main__
>>> asyncio.__main__.__name__
'asyncio.__main__'
@end example

그러나 @code{.zip} 파일의 루트 디렉터리에 있는 @code{__main__.py} 파일에서는 이 방식이 작동하지 않습니다. 따라서 일관성을 위해 @code{__name__} 검사를 포함하지 않은 최소한의 @code{__main__.py} 를 사용하는 것이 권장됩니다.


@subsubheading 더 보기


표준 라이브러리에서 최소한의 @code{__main__.py} 를 가진 패키지 예시로는 @ref{117,,venv} 를 들 수 있습니다. 이 모듈에는 @code{if __name__ == '__main__'} 블록이 포함되어 있지 않으며, @code{python -m venv [directory]} 명령으로 호출할 수 있습니다.

@ref{23c,,-m} 플래그에 대한 자세한 내용은 @ref{c3,,runpy} 모듈을 참고하십시오.

`.zip' 파일로 패키징된 애플리케이션을 실행하는 방법은 @ref{136,,zipapp} 모듈을 참고하십시오. 이 경우 파이썬은 아카이브의 루트 디렉터리에서 @code{__main__.py} 파일을 찾습니다.


@node import __main__,,파이썬 패키지의 __main__ py,__main__ — 최상위 코드 환경
@anchor{library/__main__ import-main}@anchor{49c2}
@subsubsection @code{import __main__}


파이썬 프로그램이 어떤 모듈에서 시작되었는지와 관계없이, 같은 프로그램 내의 다른 모듈들은 @code{__main__} 모듈을 임포트하여 최상위 환경의 스코프(@ref{203d,,namespace})를 불러올 수 있습니다. 이는 @code{__main__.py} 파일을 임포트하는 것이 아니라, 특수한 이름 @code{'__main__'} 을 부여받은 모듈을 임포트하는 것입니다.

다음은 @code{__main__} 네임스페이스를 사용하는 모듈의 예시입니다:

@example
# namely.py

import __main__

def did_user_define_their_name():
    return 'my_name' in dir(__main__)

def print_user_name():
    if not did_user_define_their_name():
        raise ValueError('Define the variable `my_name`!')

    print(__main__.my_name)
@end example

이 모듈의 사용 예시는 다음과 같습니다:

@example
# start.py

import sys

from namely import print_user_name

# my_name = "Dinsdale"

def main():
    try:
        print_user_name()
    except ValueError as ve:
        return str(ve)

if __name__ == "__main__":
    sys.exit(main())
@end example

이제 프로그램을 실행하면 결과는 다음과 같을 것입니다:

@example
$ python start.py
Define the variable `my_name`!
@end example

프로그램의 종료 코드는 오류를 나타내는 1이 됩니다. @code{my_name = "Dinsdale"} 줄의 주석을 해제하면 프로그램이 정상 동작하며, 이제 상태 코드 0으로 종료되어 성공을 의미하게 됩니다:

@example
$ python start.py
Dinsdale
@end example

@code{__main__} 을 임포트하더라도, @code{start} 모듈의 @code{if __name__ == '__main__'} 블록에 있는 스크립트 전용 코드가 의도치 않게 실행되는 문제는 발생하지 않습니다. 왜 그럴까요?

파이썬은 인터프리터 시작 시 @ref{17ea,,sys.modules} 에 빈 @code{__main__} 모듈을 삽입하고, 최상위 코드를 실행하면서 이를 채웁니다. 이 예제에서 그 최상위 모듈은 @code{start} 이며, 한 줄씩 실행되면서 @code{namely} 를 임포트합니다. 그런데 @code{namely} 는 다시 @code{__main__} (즉, 실제로는 @code{start}) 을 임포트합니다. 이는 임포트 순환입니다! 다행히도, 부분적으로 채워진 @code{__main__} 모듈이 이미 @code{sys.modules} 에 존재하므로, 파이썬은 그것을 @code{namely} 에 전달합니다. 이 동작 방식에 대한 자세한 내용은 import 시스템 레퍼런스의 @ref{245f,,__main__ 에 대한 특수 고려 사항} 을 참고하십시오.

파이썬 REPL은 또 다른 형태의 ‘최상위 환경’ 예시이므로, REPL에서 정의된 모든 것은 @code{__main__} 스코프의 일부가 됩니다:

@example
>>> import namely
>>> namely.did_user_define_their_name()
False
>>> namely.print_user_name()
Traceback (most recent call last):
...
ValueError: Define the variable `my_name`!
>>> my_name = 'Jabberwocky'
>>> namely.did_user_define_their_name()
True
>>> namely.print_user_name()
Jabberwocky
@end example

@code{__main__} 스코프는 @ref{aa,,pdb} 와 @ref{c2,,rlcompleter} 의 구현에서도 사용됩니다.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node warnings — 경고 제어,dataclasses — 데이터 클래스,__main__ — 최상위 코드 환경,파이썬 실행시간 서비스
@anchor{library/warnings doc}@anchor{49c3}@anchor{library/warnings module-warnings}@anchor{118}@anchor{library/warnings translation-repo}@anchor{49c4}@anchor{library/warnings warnings-warning-control}@anchor{49c5}
@subsection @code{warnings} — 경고 제어


@geindex module; warnings

`소스 코드:' Lib/warnings.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/warnings.py}

@geindex 경고


__________________________________________________________________


경고 메시지는 일반적으로 프로그램에서 사용자에게 (일반적으로) 예외를 발생시키거나 프로그램을 종료하는 것을 보증하지 않는 특정 조건에 대해 경고하는 것이 유용한 상황 상황에서 발행됩니다. 예를 들어, 프로그램이 더는 사용되지 않는 모듈을 사용할 때 경고를 발행하려고 할 수 있습니다.

파이썬 프로그래머는 이 모듈에 정의된 @ref{171e,,warn()} 함수를 호출하여 경고를 발행합니다. (C 프로그래머는 @ref{1651,,PyErr_WarnEx()}를 사용합니다; 자세한 내용은 @ref{49c6,,예외 처리}를 참조하십시오).

경고 메시지는 일반적으로 @ref{b33,,sys.stderr}에 기록되지만, 모든 경고를 무시하는 것에서 예외로 변경하는 것에 이르기까지 배치를 유연하게 변경할 수 있습니다. 경고의 처리는 @ref{2717,,경고 범주}, 경고 메시지의 텍스트 및 발행된 소스 위치에 따라 달라질 수 있습니다. 같은 소스 위치에 대한 특정 경고의 반복은 일반적으로 억제됩니다.

경고 제어에는 두 가지 단계가 있습니다; 첫째, 경고가 발행될 때마다, 메시지를 발행할지를 결정합니다; 다음으로, 메시지가 발행된다면, 사용자 설정 가능한 훅을 사용하여 포맷되고 인쇄됩니다.

경고 메시지를 발행할지는 @ref{1b1,,경고 필터}에 의해 제어되며, 이는 일치 규칙과 조치의 시퀀스입니다. @ref{16ae,,filterwarnings()}를 호출하여 규칙을 필터에 추가하고 @ref{49c7,,resetwarnings()}를 호출하여 기본 상태로 재설정할 수 있습니다.

경고 메시지의 인쇄는 @ref{49c8,,showwarning()}을 호출하여 수행되며, 이는 재정의될 수 있습니다; 이 함수의 기본 구현은 @ref{1df5,,formatwarning()}을 호출하여 메시지를 포맷하며, 사용자 정의 구현에서도 사용할 수 있습니다.


@subsubheading 더 보기


@ref{31cc,,logging.captureWarnings()}를 사용하면 표준 로깅 인프라로 모든 경고를 처리할 수 있습니다.


@menu
* 경고 범주:: 
* 경고 필터:: 
* 일시적인 경고 억제:: 
* 경고 테스트:: 
* 새 버전의 종속성에 대한 코드 갱신:: 
* 사용 가능한 함수:: 
* 사용 가능한 컨텍스트 관리자:: 
* Concurrent safety of Context Managers:: 

@end menu

@node 경고 범주,경고 필터,,warnings — 경고 제어
@anchor{library/warnings id1}@anchor{49c9}@anchor{library/warnings warning-categories}@anchor{2717}
@subsubsection 경고 범주


경고 범주를 나타내는 여러 가지 내장 예외가 있습니다. 이 범주화는 경고 그룹을 필터링하는 데 유용합니다.

이들은 기술적으로 @ref{2715,,내장 예외}이지만, 개념적으로 경고 메커니즘에 속하기 때문에 여기에서 설명합니다.

사용자 코드는 표준 경고 범주 중 하나를 서브 클래싱 하여 추가 경고 범주를 정의할 수 있습니다. 경고 범주는 항상 @ref{2718,,Warning} 클래스의 서브 클래스여야 합니다.

다음과 같은 경고 범주 클래스가 현재 정의되어 있습니다:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

클래스

@tab

설명

@item

@ref{2718,,Warning}

@tab

이것은 모든 경고 범주 클래스의 베이스 클래스입니다. @ref{bcc,,Exception}의 서브 클래스입니다.

@item

@ref{2719,,UserWarning}

@tab

@ref{171e,,warn()}의 기본 범주.

@item

@ref{1a3,,DeprecationWarning}

@tab

폐지된 기능에 대한 경고의 베이스 범주, 경고가 다른 파이썬 개발자를 대상으로 할 때 (@code{__main__}에 있는 코드로 트리거 되지 않는 한 기본적으로 무시됩니다).

@item

@ref{1ae,,SyntaxWarning}

@tab

Base category for warnings about dubious
syntactic features (typically emitted when
compiling Python source code, and hence
may not be suppressed by runtime filters)

@item

@ref{4d8,,RuntimeWarning}

@tab

모호한 런타임 기능에 대한 경고의 베이스 범주.

@item

@ref{657,,FutureWarning}

@tab

폐지된 기능에 대한 경고의 베이스 범주, 경고가 파이썬으로 작성된 응용 프로그램의 최종 사용자를 대상으로 할 때.

@item

@ref{ac6,,PendingDeprecationWarning}

@tab

향후 폐지될 기능에 대한 경고의 베이스 범주 (기본적으로 무시됩니다).

@item

@ref{71d,,ImportWarning}

@tab

모듈을 임포트 하는 과정에서 트리거 되는 경고의 베이스 범주 (기본적으로 무시됩니다).

@item

@ref{1629,,UnicodeWarning}

@tab

유니코드와 관련된 경고의 베이스 범주.

@item

@ref{e1b,,BytesWarning}

@tab

@ref{192,,bytes}와 @ref{344,,bytearray}와 관련된 경고의 베이스 범주.

@item

@ref{54e,,ResourceWarning}

@tab

자원 사용과 관련된 경고의 베이스 범주 (기본적으로 무시됩니다).

@end multitable



버전 3.7에서 변경: 이전에는 @ref{1a3,,DeprecationWarning}과 @ref{657,,FutureWarning}은 기능이 완전히 제거되었는지 또는 동작을 변경하는지에 따라 구별되었습니다. 이제 의도한 대상과 기본 경고 필터에서 처리하는 방식에 따라 구별됩니다.


@node 경고 필터,일시적인 경고 억제,경고 범주,warnings — 경고 제어
@anchor{library/warnings the-warnings-filter}@anchor{49ca}@anchor{library/warnings warning-filter}@anchor{1b1}
@subsubsection 경고 필터


경고 필터는 경고를 무시, 표시 또는 에러로 전환(예외 발생)할지를 제어합니다.

개념적으로, 경고 필터는 필터 명세의 순서 있는 목록을 유지합니다; 일치가 발견될 때까지 목록의 각 필터 명세에 대해 특정 경고를 일치시킵니다; 필터는 일치의 처리를 결정합니다. 각 항목은 (`action', `message', `category', `module', `lineno') 형식의 튜플입니다, 여기서:


@itemize *

@item 
`action'은 다음 문자열 중 하나입니다:


@multitable {xxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

값

@tab

처리

@item

@code{"default"}

@tab

경고가 발행된 각 위치(모듈 + 줄 번호)에 대해 일치하는 경고의 첫 번째 발생을 인쇄합니다

@item

@code{"error"}

@tab

일치하는 경고를 예외로 바꿉니다

@item

@code{"ignore"}

@tab

일치하는 경고를 인쇄하지 않습니다

@item

@code{"always"}

@tab

일치하는 경고를 항상 인쇄합니다

@item

@code{"all"}

@tab

alias to “always”

@item

@code{"module"}

@tab

경고가 발행된 모듈마다 (줄 번호와 관계없이) 일치하는 경고의 첫 번째 발생을 인쇄합니다

@item

@code{"once"}

@tab

위치와 관계없이 일치하는 경고의 첫 번째 발생만 인쇄합니다

@end multitable


@item 
`message'는 경고 메시지의 시작 부분이 대소문자를 구분 없이 일치해야 하는 정규식을 포함하는 문자열입니다. @ref{ac5,,-W}와 
@geindex PYTHONWARNINGS
@geindex 환경 변수; PYTHONWARNINGS
@ref{da2,,PYTHONWARNINGS}에서, `message'는 경고 메시지의 시작 부분에 (대소문자 구분 없이) 포함되어야 하는 리터럴 문자열로, `message'의 시작이나 끝에 있는 공백은 무시합니다.

@item 
`category'는 클래스(@ref{2718,,Warning}의 서브 클래스)이며, 일치하는 경고 범주는 이것의 서브 클래스여야 합니다.

@item 
`module'은 완전히 정규화된 모듈 이름의 시작 부분이 대소문자를 구분하여 일치해야 하는 정규식을 포함하는 문자열입니다. @ref{ac5,,-W}와 
@geindex PYTHONWARNINGS
@geindex 환경 변수; PYTHONWARNINGS
@ref{da2,,PYTHONWARNINGS}에서, `module'은 완전히 정규화된 모듈 이름과 (대소문자 구분하여) 같아야 하는 리터럴 문자열로, `module'의 시작이나 끝에 있는 공백은 무시합니다.

@item 
`lineno'는 경고가 발생한 줄 번호가 일치해야 하는 정수이거나, 모든 줄 번호와 일치하려면 @code{0}입니다.
@end itemize

@ref{2718,,Warning} 클래스는 내장 @ref{bcc,,Exception} 클래스에서 파생되므로, 경고를 에러로 바꾸려면 단순히 @code{category(message)}를 raise 합니다.

경고가 보고되고 등록된 필터와 일치하지 않으면 “default” 조치가 적용됩니다 (그래서 그런 이름을 갖고 있습니다).

@menu
* Repeated Warning Suppression Criteria:: 
* 경고 필터 설명:: 
* 기본 경고 필터:: 
* 기본 필터 재정의:: 

@end menu

@node Repeated Warning Suppression Criteria,경고 필터 설명,,경고 필터
@anchor{library/warnings id2}@anchor{49cb}@anchor{library/warnings repeated-warning-suppression-criteria}@anchor{49cc}
@subsubsection Repeated Warning Suppression Criteria


The filters that suppress repeated warnings apply the following criteria to determine if a warning is considered a repeat:


@itemize -

@item 
@code{"default"}: A warning is considered a repeat only if the (`message', `category', `module', `lineno') are all the same.

@item 
@code{"module"}: A warning is considered a repeat if the (`message', `category', `module') are the same, ignoring the line number.

@item 
@code{"once"}: A warning is considered a repeat if the (`message', `category') are the same, ignoring the module and line number.
@end itemize

@node 경고 필터 설명,기본 경고 필터,Repeated Warning Suppression Criteria,경고 필터
@anchor{library/warnings describing-warning-filters}@anchor{2127}@anchor{library/warnings id3}@anchor{49cd}
@subsubsection 경고 필터 설명


The warnings filter is initialized by @ref{ac5,,-W} options passed to the Python
interpreter command line and the 
@geindex PYTHONWARNINGS
@geindex 환경 변수; PYTHONWARNINGS
@ref{da2,,PYTHONWARNINGS} environment variable.
The interpreter saves the arguments for all supplied entries without
interpretation in @ref{3f5,,sys.warnoptions}; the @code{warnings} module parses these
when it is first imported (invalid options are ignored, after printing a
message to @ref{b33,,sys.stderr}).

개별 경고 필터는 콜론으로 구분된 필드의 시퀀스로 지정됩니다:

@example
action:message:category:module:line
@end example

이러한 각 필드의 의미는 @ref{1b1,,경고 필터}에 설명된 대로입니다. 한 줄에 여러 필터를 나열할 때 (
@geindex PYTHONWARNINGS
@geindex 환경 변수; PYTHONWARNINGS
@ref{da2,,PYTHONWARNINGS}와 같이), 개별 필터는 쉼표로 구분되고 나중에 나열된 필터가 그 앞에 나열된 필터보다 우선합니다 (왼쪽에서 오른쪽으로 적용되고, 가장 최근에 적용된 필터가 앞서 나온 필터에 우선하기 때문입니다).

일반적으로 사용되는 경고 필터는 모든 경고, 특정 범주의 경고 또는 특정 모듈이나 패키지에서 발생하는 경고에 적용됩니다. 몇 가지 예:

@example
default                      # 모든 경고를 표시합니다 (설사 기본적으로 무시되더라도)
ignore                       # 모든 경고를 무시합니다
error                        # 모든 경고를 에러로 변환합니다
error::ResourceWarning       # ResourceWarning 메시지를 에러로 취급합니다
default::DeprecationWarning  # DeprecationWarning 메시지를 표시합니다
ignore,default:::mymodule    # "mymodule"이 트리거 한 경고만 보고합니다
error:::mymodule             # "mymodule"에서 경고를 에러로 변환합니다
@end example

@node 기본 경고 필터,기본 필터 재정의,경고 필터 설명,경고 필터
@anchor{library/warnings default-warning-filter}@anchor{49ce}@anchor{library/warnings id4}@anchor{49cf}
@subsubsection 기본 경고 필터


기본적으로, 파이썬은 @ref{ac5,,-W} 명령 줄 옵션, 
@geindex PYTHONWARNINGS
@geindex 환경 변수; PYTHONWARNINGS
@ref{da2,,PYTHONWARNINGS} 환경 변수 및 @ref{16ae,,filterwarnings()} 호출로 재정의할 수 있는 몇 가지 경고 필터를 설치합니다.

정규 릴리스 빌드에서, 기본 경고 필터에는 다음과 같은 항목이 있습니다 (우선순위 순서로):

@example
default::DeprecationWarning:__main__
ignore::DeprecationWarning
ignore::PendingDeprecationWarning
ignore::ImportWarning
ignore::ResourceWarning
@end example

@ref{508,,디버그 빌드}에서, 기본 경고 필터 목록은 비어 있습니다.


버전 3.2에서 변경: @ref{1a3,,DeprecationWarning}은 이제 @ref{ac6,,PendingDeprecationWarning} 에 더해 기본적으로 무시됩니다.



버전 3.7에서 변경: @ref{1a3,,DeprecationWarning}은 @code{__main__}의 코드에 의해 직접 트리거 될 때 기본적으로 다시 한번 표시됩니다.



버전 3.7에서 변경: @ref{e1b,,BytesWarning}은 더는 기본 필터 목록에 나타나지 않으며 대신 @ref{7f8,,-b}가 두 번 지정되면 @ref{3f5,,sys.warnoptions}를 통해 구성됩니다.


@node 기본 필터 재정의,,기본 경고 필터,경고 필터
@anchor{library/warnings overriding-the-default-filter}@anchor{49d0}@anchor{library/warnings warning-disable}@anchor{49d1}
@subsubsection 기본 필터 재정의


파이썬으로 작성된 응용 프로그램 개발자는 기본적으로 사용자에게 `모든' 파이썬 수준 경고를 숨기고, 테스트를 실행하거나 달리 응용 프로그램에 대해 작업할 때만 표시하고 싶을 수 있습니다. 필터 구성을 인터프리터에 전달하는 데 사용되는 @ref{3f5,,sys.warnoptions} 어트리뷰트는 경고를 비활성화해야 하는지를 나타내는 마커로 사용할 수 있습니다:

@example
import sys

if not sys.warnoptions:
    import warnings
    warnings.simplefilter("ignore")
@end example

파이썬 코드용 테스트 실행기 개발자는 대신 다음과 같은 코드를 사용하여 테스트 대상 코드에 대해 기본적으로 `모든' 경고가 표시되도록 하는 것이 좋습니다:

@example
import sys

if not sys.warnoptions:
    import os, warnings
    warnings.simplefilter("default") # 이 프로세스의 필터를 변경합니다
    os.environ["PYTHONWARNINGS"] = "default" # 서브 프로세스에도 영향을 줍니다
@end example

마지막으로, @code{__main__} 이외의 이름 공간에서 사용자 코드를 실행하는 대화식 셸 개발자는 다음과 같은 코드를 사용하여 @ref{1a3,,DeprecationWarning} 메시지가 기본적으로 표시되도록 하는 것이 좋습니다 (여기서 @code{user_ns}는 대화식으로 입력된 코드를 실행하는 데 사용되는 모듈입니다):

@example
import warnings
warnings.filterwarnings("default", category=DeprecationWarning,
                                   module=user_ns.get("__name__"))
@end example

@node 일시적인 경고 억제,경고 테스트,경고 필터,warnings — 경고 제어
@anchor{library/warnings temporarily-suppressing-warnings}@anchor{49d2}@anchor{library/warnings warning-suppress}@anchor{49d3}
@subsubsection 일시적인 경고 억제


폐지된 함수처럼, 경고를 발생시킬 것을 알고 있는 코드를 사용하고 있지만, 경고를 보고 싶지 않으면 (명령 줄을 통해 경고가 명시적으로 구성된 경우조차), @ref{179,,catch_warnings} 컨텍스트 관리자를 사용하여 경고를 억제할 수 있습니다:

@example
import warnings

def fxn():
    warnings.warn("deprecated", DeprecationWarning)

with warnings.catch_warnings():
    warnings.simplefilter("ignore")
    fxn()
@end example

While within the context manager all warnings will simply be ignored. This
allows you to use known-deprecated code without having to see the warning while
not suppressing the warning for other code that might not be aware of its use
of deprecated code.

@quotation

@cartouche
@quotation 참고 
See @ref{49d4,,Concurrent safety of Context Managers} for details on the
concurrency-safety of the @ref{179,,catch_warnings} context manager when
used in programs using multiple threads or async functions.
@end quotation
@end cartouche
@end quotation

@node 경고 테스트,새 버전의 종속성에 대한 코드 갱신,일시적인 경고 억제,warnings — 경고 제어
@anchor{library/warnings testing-warnings}@anchor{49d5}@anchor{library/warnings warning-testing}@anchor{49d6}
@subsubsection 경고 테스트


코드가 발생시키는 경고를 테스트하려면, @ref{179,,catch_warnings} 컨텍스트 관리자를 사용하십시오. 이를 통해 쉽게 테스트할 수 있도록 경고 필터를 일시적으로 변경할 수 있습니다. 예를 들어, 검사할 모든 경고를 캡처하려면 다음을 수행하십시오:

@example
import warnings

def fxn():
    warnings.warn("deprecated", DeprecationWarning)

with warnings.catch_warnings(record=True) as w:
    # Cause all warnings to always be triggered.
    warnings.simplefilter("always")
    # Trigger a warning.
    fxn()
    # Verify some things
    assert len(w) == 1
    assert issubclass(w[-1].category, DeprecationWarning)
    assert "deprecated" in str(w[-1].message)
@end example

@code{always} 대신 @code{error}를 사용하여 모든 경고를 예외로 만들 수도 있습니다. 한 가지 알아야 할 것은 @code{once} / @code{default} 규칙으로 인해 경고가 이미 발생했으면, 어떤 필터가 설정되어 있더라도 경고와 관련된 경고 레지스트리가 지워지지 않으면 경고가 다시 표시되지 않는다는 것입니다.

Once the context manager exits, the warnings filter is restored to its state
when the context was entered. This prevents tests from changing the warnings
filter in unexpected ways between tests and leading to indeterminate test
results.

@quotation

@cartouche
@quotation 참고 
See @ref{49d4,,Concurrent safety of Context Managers} for details on the
concurrency-safety of the @ref{179,,catch_warnings} context manager when
used in programs using multiple threads or async functions.
@end quotation
@end cartouche
@end quotation

같은 종류의 경고를 발생시키는 여러 작업을 테스트할 때, 각 작업이 새로운 경고를 발생시키는지 확인하는 방식으로 테스트하는 것이 중요합니다 (예를 들어 경고가 예외를 발생시키도록 설정하고 작업이 예외를 일으키는지 확인합니다, 각 작업 후에 경고 목록의 길이가 계속 증가하는지 확인합니다, 또는 각 새 작업 전에 경고 목록에서 이전 항목을 삭제합니다).

@node 새 버전의 종속성에 대한 코드 갱신,사용 가능한 함수,경고 테스트,warnings — 경고 제어
@anchor{library/warnings updating-code-for-new-versions-of-dependencies}@anchor{49d7}@anchor{library/warnings warning-ignored}@anchor{465e}
@subsubsection 새 버전의 종속성에 대한 코드 갱신


(파이썬으로 작성된 응용 프로그램의 최종 사용자가 아닌) 파이썬 개발자가 주로 관심을 두는 경고 범주는 기본적으로 무시됩니다.

특히, 이 “기본적으로 무시됨” 목록에는 @ref{1a3,,DeprecationWarning}(@code{__main__}을 제외한 모든 모듈에서)가 포함되어 있습니다. 이는 개발자가 (표준 라이브러리와 제삼자 패키지 모두에서) 호환성을 깨는 향후 API 변경에 대한 시기적절한 알림을 받기 위해 일반적으로 무시되는 경고를 가시화해서 코드를 테스트해야 한다는 것을 의미합니다.

이상적인 경우, 코드에 적절한 테스트 스위트가 있고, 테스트 실행기는 테스트를 실행할 때 모든 경고를 묵시적으로 활성화합니다 (@ref{10c,,unittest} 모듈에서 제공하는 테스트 실행기가 이렇게 합니다).

덜 이상적인 경우, @ref{ac5,,-Wd} 를 파이썬 인터프리터에 전달하거나 (@code{-W default}의 줄임 표현입니다), 환경에 @code{PYTHONWARNINGS=default}를 설정하여 응용프로그램이 폐지된 인터페이스를 사용하는지를 확인할 수 있습니다. 이를 통해 기본적으로 무시되는 경고를 포함한 모든 경고에 대한 default 처리가 가능합니다. 발생한 경고에 대해 수행할 조치를 변경하려면 @code{-W}로 전달되는 인자를 변경할 수 있습니다 (예를 들어 @code{-W error}). 어떤 것이 가능한지에 대한 자세한 내용은 @code{-W} 플래그를 참조하십시오.

@node 사용 가능한 함수,사용 가능한 컨텍스트 관리자,새 버전의 종속성에 대한 코드 갱신,warnings — 경고 제어
@anchor{library/warnings available-functions}@anchor{49d8}@anchor{library/warnings warning-functions}@anchor{49d9}
@subsubsection 사용 가능한 함수


@geindex warn() (warnings 모듈)
@anchor{library/warnings warnings warn}@anchor{171e}
@deffn {함수} warnings.warn (message, category=None, stacklevel=1, source=None, *, skip_file_prefixes=())

경고를 발행하거나, 무시하거나 예외를 발생시킵니다. 주어지면 `category' 인자는 @ref{2717,,경고 범주 클래스}여야 합니다; 기본값은 @ref{2719,,UserWarning}입니다. 또는, `message'가 @ref{2718,,Warning} 인스턴스일 수 있으며, 이 경우 `category'는 무시되고 @code{message.__class__}가 사용됩니다. 이 경우, 메시지 텍스트는 @code{str(message)}입니다. 이 함수는 발행된 특정 경고가 @ref{1b1,,경고 필터}에 의해 에러로 변경되면 예외를 발생시킵니다. `stacklevel' 인자는 다음과 같이 파이썬으로 작성된 래퍼 함수에서 사용할 수 있습니다:

@example
def deprecated_api(message):
    warnings.warn(message, DeprecationWarning, stacklevel=2)
@end example

이것은 경고가 @code{deprecated_api} 자체의 소스가 아닌 @code{deprecated_api}의 호출자를 참조하게 합니다 (전자는 경고 메시지의 목적을 무효로 하기 때문입니다).

The `skip_file_prefixes' keyword argument can be used to indicate which
stack frames are ignored when counting stack levels. This can be useful when
you want the warning to always appear at call sites outside of a package
when a constant `stacklevel' does not fit all call paths or is otherwise
challenging to maintain. If supplied, it must be a tuple of strings. When
prefixes are supplied, stacklevel is implicitly overridden to be @code{max(2,
stacklevel)}. To cause a warning to be attributed to the caller from
outside of the current package you might write:

@example
# example/lower.py
_warn_skips = (os.path.dirname(__file__),)

def one_way(r_luxury_yacht=None, t_wobbler_mangrove=None):
    if r_luxury_yacht:
        warnings.warn("Please migrate to t_wobbler_mangrove=.",
                      skip_file_prefixes=_warn_skips)

# example/higher.py
from . import lower

def another_way(**kw):
    lower.one_way(**kw)
@end example

This makes the warning refer to both the @code{example.lower.one_way()} and
@code{example.higher.another_way()} call sites only from calling code living
outside of @code{example} package.

제공되면, `source'는 @ref{54e,,ResourceWarning}을 방출한 파괴된 객체입니다.


버전 3.6에서 변경: `source' 매개 변수를 추가했습니다.



버전 3.12에서 변경: Added `skip_file_prefixes'.

@end deffn

@geindex warn_explicit() (warnings 모듈)
@anchor{library/warnings warnings warn_explicit}@anchor{efc}
@deffn {함수} warnings.warn_explicit (message, category, filename, lineno, module=None, registry=None, module_globals=None, source=None)

This is a low-level interface to the functionality of @ref{171e,,warn()}, passing in
explicitly the message, category, filename and line number, and optionally
other arguments.
`message' must be a string and `category' a subclass of @ref{2718,,Warning} or
`message' may be a @code{Warning} instance, in which case `category' will be
ignored.

`module', if supplied, should be the module name.
If no module is passed, the filename with @code{.py} stripped is used.

`registry', if supplied, should be the @code{__warningregistry__} dictionary
of the module.
If no registry is passed, each warning is treated as the first occurrence,
that is, filter actions @code{"default"}, @code{"module"} and @code{"once"} are
handled as @code{"always"}.

제공되면, `module_globals'는 경고가 발행되는 코드에서 사용 중인 전역 이름 공간이어야 합니다. (이 인자는 zip 파일이나 다른 파일 시스템이 아닌 임포트 소스에서 찾은 모듈의 소스 표시를 지원하는 데 사용됩니다).

제공되면, `source'는 @ref{54e,,ResourceWarning}을 방출한 파괴된 객체입니다.


버전 3.6에서 변경: `source' 매개 변수를 추가합니다.

@end deffn

@geindex showwarning() (warnings 모듈)
@anchor{library/warnings warnings showwarning}@anchor{49c8}
@deffn {함수} warnings.showwarning (message, category, filename, lineno, file=None, line=None)

파일에 경고를 기록합니다. 기본 구현은 @code{formatwarning(message, category, filename, lineno, line)}를 호출하고 결과 문자열을 `file'에 씁니다, `file'의 기본값은 @ref{b33,,sys.stderr}입니다. @code{warnings.showwarning}에 대입하여 이 함수를 임의의 콜러블로 대체할 수 있습니다. `line'은 경고 메시지에 포함될 소스 코드 줄입니다; `line'이 제공되지 않으면, @ref{49c8,,showwarning()}은 `filename'과 `lineno'로 지정된 줄을 읽으려고 시도합니다.
@end deffn

@geindex formatwarning() (warnings 모듈)
@anchor{library/warnings warnings formatwarning}@anchor{1df5}
@deffn {함수} warnings.formatwarning (message, category, filename, lineno, line=None)

표준 방식으로 경고를 포맷합니다. 내장된 개행 문자를 포함하고 개행 문자로 끝날 수 있는 문자열을 반환합니다. `line'은 경고 메시지에 포함될 소스 코드 줄입니다; `line'이 제공되지 않으면, @ref{1df5,,formatwarning()}은 `filename'과 `lineno'로 지정된 줄을 읽으려고 시도합니다.
@end deffn

@geindex filterwarnings() (warnings 모듈)
@anchor{library/warnings warnings filterwarnings}@anchor{16ae}
@deffn {함수} warnings.filterwarnings (action, message='@w{'}, category=Warning, module='@w{'}, lineno=0, append=False)

@ref{1b1,,경고 필터 명세} 목록에 항목을 삽입합니다. 항목은 기본적으로 앞에 삽입됩니다; `append'가 참이면, 끝에 삽입됩니다. 인자의 형을 확인하고, `message'와 `module' 정규식을 컴파일한 후 경고 필터 목록에 튜플로 삽입합니다. 둘 다 특정 경고와 일치하면, 목록 앞쪽에 더 가까운 항목이 목록의 뒷부분에 있는 항목보다 우선합니다. 생략된 인자의 기본값은 모든 것과 일치하는 값입니다.
@end deffn

@geindex simplefilter() (warnings 모듈)
@anchor{library/warnings warnings simplefilter}@anchor{8cf}
@deffn {함수} warnings.simplefilter (action, category=Warning, lineno=0, append=False)

@ref{1b1,,경고 필터 명세} 목록에 간단한 항목을 삽입합니다. 함수 매개 변수의 의미는 @ref{16ae,,filterwarnings()}와 같지만, 범주와 줄 번호가 일치하는 한 삽입 된 필터가 항상 모든 모듈의 메시지와 일치하기 때문에 정규식이 필요하지 않습니다.
@end deffn

@geindex resetwarnings() (warnings 모듈)
@anchor{library/warnings warnings resetwarnings}@anchor{49c7}
@deffn {함수} warnings.resetwarnings ()

경고 필터를 재설정합니다. 이는 @ref{ac5,,-W} 명령 줄 옵션과 @ref{8cf,,simplefilter()}에 대한 호출을 포함하여 @ref{16ae,,filterwarnings()}에 대한 모든 이전 호출의 영향을 되돌립니다.
@end deffn

@geindex deprecated() (warnings 모듈)
@anchor{library/warnings warnings deprecated}@anchor{48a}
@deffn {함수} @@warnings.deprecated (msg, *, category=DeprecationWarning, stacklevel=1)

Decorator to indicate that a class, function or overload is deprecated.

When this decorator is applied to an object,
deprecation warnings may be emitted at runtime when the object is used.
@ref{573,,static type checkers}
will also generate a diagnostic on usage of the deprecated object.

사용법:

@example
from warnings import deprecated
from typing import overload

@@deprecated("Use B instead")
class A:
    pass

@@deprecated("Use g instead")
def f():
    pass

@@overload
@@deprecated("int support is deprecated")
def g(x: int) -> int: ...
@@overload
def g(x: str) -> int: ...
@end example

The warning specified by `category' will be emitted at runtime
on use of deprecated objects. For functions, that happens on calls;
for classes, on instantiation and on creation of subclasses.
If the `category' is @code{None}, no warning is emitted at runtime.
The `stacklevel' determines where the
warning is emitted. If it is @code{1} (the default), the warning
is emitted at the direct caller of the deprecated object; if it
is higher, it is emitted further up the stack.
Static type checker behavior is not affected by the `category'
and `stacklevel' arguments.

The deprecation message passed to the decorator is saved in the
@code{__deprecated__} attribute on the decorated object.
If applied to an overload, the decorator
must be after the @ref{4553,,@@~typing.overload} decorator
for the attribute to exist on the overload as returned by
@ref{8bc,,typing.get_overloads()}.


Added in version 3.13: See 
@geindex Python 향상 제안; PEP 702
PEP 702@footnote{https://peps.python.org/pep-0702/}.

@end deffn

@node 사용 가능한 컨텍스트 관리자,Concurrent safety of Context Managers,사용 가능한 함수,warnings — 경고 제어
@anchor{library/warnings available-context-managers}@anchor{49da}
@subsubsection 사용 가능한 컨텍스트 관리자


@geindex catch_warnings (warnings 클래스)
@anchor{library/warnings warnings catch_warnings}@anchor{179}
@deffn {클래스} warnings.catch_warnings (*, record=False, module=None, action=None, category=Warning, lineno=0, append=False)

경고 필터와 @ref{49c8,,showwarning()} 함수를 복사하고 종료 시 복원하는 컨텍스트 관리자. `record' 인자가 @ref{d2a,,False}(기본값)이면 컨텍스트 관리자는 진입할 때 @ref{884,,None}을 반환합니다. `record'가 @ref{e06,,True}이면, 재정의된 @code{showwarning()} 함수에 보이는 객체로 점진적으로 채워지는 리스트가 반환됩니다 (@code{sys.stdout} 으로의 출력도 억제합니다). 리스트의 각 객체에는 @code{showwarning()}에 대한 인자와 이름이 같은 어트리뷰트가 있습니다.

The `module' argument takes a module that will be used instead of the
module returned when you import @code{warnings} whose filter will be
protected. This argument exists primarily for testing the @code{warnings}
module itself.

If the `action' argument is not @code{None}, the remaining arguments are
passed to @ref{8cf,,simplefilter()} as if it were called immediately on
entering the context.

See @ref{1b1,,경고 필터} for the meaning of the `category' and `lineno'
parameters.

@cartouche
@quotation 참고 
See @ref{49d4,,Concurrent safety of Context Managers} for details on the
concurrency-safety of the @code{catch_warnings} context manager when
used in programs using multiple threads or async functions.
@end quotation
@end cartouche


버전 3.11에서 변경: Added the `action', `category', `lineno', and `append' parameters.

@end deffn

@node Concurrent safety of Context Managers,,사용 가능한 컨텍스트 관리자,warnings — 경고 제어
@anchor{library/warnings concurrent-safety-of-context-managers}@anchor{49db}@anchor{library/warnings warning-concurrent-safe}@anchor{49d4}
@subsubsection Concurrent safety of Context Managers


The behavior of @ref{179,,catch_warnings} context manager depends on the
@ref{18a,,sys.flags.context_aware_warnings} flag.  If the flag is true, the
context manager behaves in a concurrent-safe fashion and otherwise not.
Concurrent-safe means that it is both thread-safe and safe to use within
@ref{37e9,,asyncio coroutines} and tasks.  Being thread-safe means
that behavior is predictable in a multi-threaded program.  The flag defaults
to true for free-threaded builds and false otherwise.

If the @ref{18a,,context_aware_warnings} flag is false, then
@ref{179,,catch_warnings} will modify the global attributes of the
@code{warnings} module.  This is not safe if used within a concurrent program
(using multiple threads or using asyncio coroutines).  For example, if two
or more threads use the @code{catch_warnings} class at the same time, the
behavior is undefined.

If the flag is true, @ref{179,,catch_warnings} will not modify global
attributes and will instead use a @ref{1878,,ContextVar} to
store the newly established warning filtering state.  A context variable
provides thread-local storage and it makes the use of @code{catch_warnings}
thread-safe.

The `record' parameter of the context handler also behaves differently
depending on the value of the flag.  When `record' is true and the flag is
false, the context manager works by replacing and then later restoring the
module’s @ref{49c8,,showwarning()} function.  That is not concurrent-safe.

When `record' is true and the flag is true, the @ref{49c8,,showwarning()} function
is not replaced.  Instead, the recording status is indicated by an internal
property in the context variable.  In this case, the @code{showwarning()}
function will not be restored when exiting the context handler.

The @ref{18a,,context_aware_warnings} flag can be set the @ref{16f,,-X context_aware_warnings} command-line option or by the
@geindex PYTHON_CONTEXT_AWARE_WARNINGS
@geindex 환경 변수; PYTHON_CONTEXT_AWARE_WARNINGS
@ref{185e,,PYTHON_CONTEXT_AWARE_WARNINGS} environment variable.

@quotation

@cartouche
@quotation 참고 
It is likely that most programs that desire thread-safe
behaviour of the warnings module will also want to set the
@ref{175,,thread_inherit_context} flag to true.  That flag
causes threads created by @ref{176,,threading.Thread} to start
with a copy of the context variables from the thread starting
it.  When true, the context established by @ref{179,,catch_warnings}
in one thread will also apply to new threads started by it.  If false,
new threads will start with an empty warnings context variable,
meaning that any filtering that was established by a
@code{catch_warnings} context manager will no longer be active.
@end quotation
@end cartouche
@end quotation


버전 3.14에서 변경: Added the @ref{18a,,sys.flags.context_aware_warnings} flag and the use of a
context variable for @ref{179,,catch_warnings} if the flag is true.  Previous
versions of Python acted as if the flag was always set to false.


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node dataclasses — 데이터 클래스,contextlib — with 문 컨텍스트를 위한 유틸리티,warnings — 경고 제어,파이썬 실행시간 서비스
@anchor{library/dataclasses doc}@anchor{49dc}@anchor{library/dataclasses dataclasses-data-classes}@anchor{49dd}@anchor{library/dataclasses module-dataclasses}@anchor{33}@anchor{library/dataclasses translation-repo}@anchor{49de}
@subsection @code{dataclasses} — 데이터 클래스


@geindex module; dataclasses

`소스 코드:' Lib/dataclasses.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/dataclasses.py}


__________________________________________________________________


이 모듈은 @ref{8be,,__init__()} 나 @ref{82e,,__repr__()} 과 같은 생성된 @ref{1c5e,,특수 메서드} 를 사용자 정의 클래스에 자동으로 추가하는 데코레이터와 함수를 제공합니다. 원래 
@geindex Python 향상 제안; PEP 557
PEP 557@footnote{https://peps.python.org/pep-0557/} 에 설명되어 있습니다.

생성된 메서드에서 사용할 멤버 변수는 
@geindex Python 향상 제안; PEP 526
PEP 526@footnote{https://peps.python.org/pep-0526/} 형 어노테이션을 사용하여 정의됩니다. 예를 들어, 이 코드는:

@example
from dataclasses import dataclass

@@dataclass
class InventoryItem:
    """인벤토리에 있는 항목을 추적하는 클래스."""
    name: str
    unit_price: float
    quantity_on_hand: int = 0

    def total_cost(self) -> float:
        return self.unit_price * self.quantity_on_hand
@end example

다른 것 중에서도, 다음과 같은 @code{__init__()} 를 추가합니다:

@example
def __init__(self, name: str, unit_price: float, quantity_on_hand: int = 0):
    self.name = name
    self.unit_price = unit_price
    self.quantity_on_hand = quantity_on_hand
@end example

이 메서드는 클래스에 자동으로 추가됩니다: 위의 @code{InventoryItem} 정의에서 직접 지정되지는 않았습니다.


Added in version 3.7.


@menu
* Module contents: Module contents<2>. 
* 초기화 후처리:: 
* 클래스 변수:: 
* 초기화 전용 변수:: 
* 고정 인스턴스:: 
* 계승:: 
* Re-ordering of keyword-only parameters in __init__(): Re-ordering of keyword-only parameters in __init__. 
* 기본 팩토리 함수:: 
* 가변 기본값:: 
* Descriptor-typed fields:: 

@end menu

@node Module contents<2>,초기화 후처리,,dataclasses — 데이터 클래스
@anchor{library/dataclasses module-contents}@anchor{49df}
@subsubsection Module contents


@geindex dataclass() (dataclasses 모듈)
@anchor{library/dataclasses dataclasses dataclass}@anchor{4e1}
@deffn {함수} @@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)

이 함수는 (아래에서 설명하는) 생성된 @ref{1c5e,,특수 메서드}를 클래스에 추가하는데 사용되는 @ref{939,,데코레이터} 입니다.

@code{@@dataclass} 데코레이터는 클래스를 검사하여 필드를 찾습니다. 필드는 @ref{f4f,,형 어노테이션}을 가진 클래스 변수로 정의됩니다. 아래에 설명된 두 가지 예외를 제외하고는, @code{@@dataclass} 는 변수 어노테이션에 지정된 형을 검사하지 않습니다.

생성된 모든 메서드의 필드 순서는 클래스 정의에 나타나는 순서입니다.

@code{@@dataclass} 데코레이터는 여러 “던더(dunder)” 메서드들을 클래스에 추가하는데, 아래에서 설명합니다. 추가할 메서드가 클래스에 이미 존재하면, 동작은 아래에 설명된 대로 매개변수에 따라 다릅니다. 데코레이터는 호출된 클래스와 같은 클래스를 반환합니다; 새 클래스가 만들어지지 않습니다.

@code{@@dataclass} 가 매개변수 없는 단순한 데코레이터로 사용되면, 이 서명에 문서화 된 기본값들이 제공된 것처럼 행동합니다. 즉, 다음 @code{@@dataclass} 의 세 가지 용법은 동등합니다:

@example
@@dataclass
class C:
    ...

@@dataclass()
class C:
    ...

@@dataclass(init=True, repr=True, eq=True, order=False, unsafe_hash=False, frozen=False,
           match_args=True, kw_only=False, slots=False, weakref_slot=False)
class C:
    ...
@end example

@code{@@dataclass} 의 매개변수는 다음과 같습니다:


@itemize -

@item 
`init': 참(기본값)이면, @ref{8be,,__init__()} 메서드가 생성됩니다.

클래스가 이미 @code{__init__()} 를 정의했으면, 이 매개변수는 무시됩니다.

@item 
`repr': 참(기본값)이면, @ref{82e,,__repr__()} 메서드가 생성됩니다. 생성된 repr 문자열은 클래스 이름과 각 필드의 이름과 repr 을 갖습니다. 각 필드는 클래스에 정의된 순서대로 표시됩니다. repr에서 제외하도록 표시된 필드는 포함되지 않습니다. 예를 들어: 예 :@code{InventoryItem(name='widget', unit_price=3.0, quantity_on_hand=10)}.

클래스가 이미 @code{__repr__()} 을 정의했으면, 이 매개변수는 무시됩니다.

@item 
`eq': 참(기본값)이면, @ref{cf1,,__eq__()} 메서드가 생성됩니다. 이 메서드는 클래스를 필드의 튜플인 것처럼 순서대로 비교합니다. 비교되는 두 인스턴스는 같은 형이어야 합니다.

클래스가 이미 @code{__eq__()} 를 정의했으면, 이 매개변수는 무시됩니다.

@item 
`order': 참이면 (기본값은 @code{False}), @ref{14a5,,__lt__()}, @ref{150f,,__le__()}, @ref{1510,,__gt__()}, @ref{1511,,__ge__()} 메서드가 생성됩니다. 이것들은 클래스를 필드의 튜플인 것처럼 순서대로 비교합니다. 비교되는 두 인스턴스는 같은 형이어야 합니다. `order' 가 참이고 `eq' 가 거짓이면 @ref{2ec,,ValueError} 가 발생합니다.

클래스가 이미 @code{__lt__()}, @code{__le__()}, @code{__gt__()}, @code{__ge__()} 중 하나를 정의하고 있다면 @ref{198,,TypeError} 가 발생합니다.

@item 
`unsafe_hash': If true, force @code{dataclasses} to create a
@ref{cf2,,__hash__()} method, even though it may not be safe to do so.
Otherwise, generate a @code{__hash__()} method according to how
`eq' and `frozen' are set.
The default value is @code{False}.

@code{__hash__()} 는 내장 @ref{800,,hash()} 에 의해 사용되며, 딕셔너리와 집합 같은 해시 컬렉션에 객체가 추가될 때 사용됩니다. @code{__hash__()} 를 갖는다는 것은 클래스의 인스턴스가 불변이라는 것을 의미합니다. 가변성은 프로그래머의 의도, @code{__eq__()} 의 존재와 행동, @code{@@dataclass} 데코레이터의 `eq' 와 `frozen' 플래그의 값에 의존하는 복잡한 성질입니다.

기본적으로, @code{@@dataclass} 는 안전하지 않다면 @ref{cf2,,__hash__()} 메서드를 묵시적으로 추가하지 않습니다. 기존에 명시적으로 정의된 @code{__hash__()} 메서드를 추가하거나 변경하지도 않습니다. @code{__hash__()} 문서에서 설명된 대로, 클래스 어트리뷰트를 @code{__hash__ = None} 로 설정하는 것은 파이썬에 특별한 의미가 있습니다.

@code{__hash__()} 가 명시적으로 정의되어 있지 않거나 @code{None} 으로 설정된 경우, @code{@@dataclass} 는 묵시적 @code{__hash__()} 메서드를 `추가할 수 있습니다'. 권장하지는 않지만, @code{unsafe_hash=True} 로 @code{@@dataclass} 가 @code{__hash__()} 메서드를 만들도록 강제할 수 있습니다. 이것은 당신의 클래스가 논리적으로 불변이지만, 여전히 변경될 수 있는 경우 일 수 있습니다. 이는 특수한 사용 사례이므로 신중하게 고려해야 합니다.

다음은 @code{__hash__()} 메서드의 묵시적 생성을 관장하는 규칙입니다. 데이터 클래스에 명시적 @code{__hash__()} 메서드를 가지면서 @code{unsafe_hash=True} 를 설정할 수는 없습니다; 그러면 @ref{198,,TypeError} 가 발생합니다.

`eq' 와 `frozen' 이 모두 참이면, 기본적으로 @code{@@dataclass} 는 @code{__hash__()} 메서드를 만듭니다. `eq' 가 참이고 `frozen' 이 거짓이면, @code{__hash__()} 가 @code{None} 으로 설정되어 해시 불가능하다고 표시됩니다(가변이기 때문입니다). 만약 `eq' 가 거짓이면, @code{__hash__()} 를 건드리지 않는데, 슈퍼 클래스의 @code{__hash__()} 가 사용된다는 뜻이 됩니다 (슈퍼 클래스가 @ref{c7d,,object} 라면, id 기반 해싱으로 돌아간다는 뜻입니다).

@item 
`frozen': If true (the default is @code{False}), assigning to fields will
generate an exception.  This emulates read-only frozen instances.
See the @ref{49e0,,discussion} below.

If @ref{2378,,__setattr__()} or @ref{2379,,__delattr__()} is defined in the class
and `frozen' is true, then @ref{198,,TypeError} is raised.

@item 
`match_args': If true (the default is @code{True}), the
@ref{1c73,,__match_args__} tuple will be created from the list of
non keyword-only parameters to the generated @ref{8be,,__init__()} method (even if
@code{__init__()} is not generated, see above).  If false, or if
@code{__match_args__} is already defined in the class, then
@code{__match_args__} will not be generated.
@end itemize

@quotation


Added in version 3.10.

@end quotation


@itemize -

@item 
`kw_only': If true (the default value is @code{False}), then all
fields will be marked as keyword-only.  If a field is marked as
keyword-only, then the only effect is that the @ref{8be,,__init__()}
parameter generated from a keyword-only field must be specified
with a keyword when @code{__init__()} is called. See the @ref{2348,,parameter}
glossary entry for details.  Also see the
@ref{49e1,,KW_ONLY} section.

Keyword-only fields are not included in @code{__match_args__}.
@end itemize

@quotation


Added in version 3.10.

@end quotation


@itemize -

@item 
`slots': 참이면 (기본값은 @code{False}), @ref{16f0,,__slots__} 어트리뷰트가 만들어지고 원래 클래스 대신 새 클래스가 반환됩니다. @code{__slots__} 이 클래스에 이미 정의되어 있다면 @ref{198,,TypeError} 가 발생합니다.
@end itemize

@quotation

@cartouche
@quotation 경고 
Passing parameters to a base class @ref{842,,__init_subclass__()}
when using @code{slots=True} will result in a @ref{198,,TypeError}.
Either use @code{__init_subclass__} with no parameters
or use default values as a workaround.
See gh-91126@footnote{https://github.com/python/cpython/issues/91126} for full details.
@end quotation
@end cartouche


Added in version 3.10.



버전 3.11에서 변경: If a field name is already included in the @code{__slots__}
of a base class, it will not be included in the generated @code{__slots__}
to prevent @ref{23ba,,overriding them}.
Therefore, do not use @code{__slots__} to retrieve the field names of a
dataclass. Use @ref{1936,,fields()} instead.
To be able to determine inherited slots,
base class @code{__slots__} may be any iterable, but `not' an iterator.

@end quotation


@itemize -

@item 
`weakref_slot': If true (the default is @code{False}), add a slot
named “__weakref__”, which is required to make an instance
@ref{11ef,,weakref-able}.
It is an error to specify @code{weakref_slot=True}
without also specifying @code{slots=True}.
@end itemize

@quotation


Added in version 3.11.

@end quotation

필드는 선택적으로 일반적인 파이썬 문법을 사용하여 기본값을 지정할 수 있습니다:

@example
@@dataclass
class C:
    a: int       # 'a' 에는 기본값이 없습니다
    b: int = 0   # 'b' 에 기본값을 대입합니다
@end example

이 예제에서, @code{a} 와 @code{b} 모두 추가된 @ref{8be,,__init__()} 메서드에 포함되는데, 이런 식으로 정의됩니다:

@example
def __init__(self, a: int, b: int = 0):
@end example

기본값이 없는 필드가 기본값이 있는 필드 뒤에 오는 경우 @ref{198,,TypeError} 가 발생합니다. 이것은 단일 클래스 내에서 발생하든, 클래스 상속의 결과로 발생하든 마찬가지입니다.
@end deffn

@geindex field() (dataclasses 모듈)
@anchor{library/dataclasses dataclasses field}@anchor{195b}
@deffn {함수} dataclasses.field (*, default=MISSING, default_factory=MISSING, init=True, repr=True, hash=None, compare=True, metadata=None, kw_only=MISSING, doc=None)

일반적이고 간단한 사용 사례의 경우 다른 기능은 필요하지 않습니다. 그러나 필드별로 추가 정보가 필요한 일부 데이터 클래스 기능이 있습니다. 추가 정보에 대한 필요성을 충족시키기 위해, 기본 필드 값을 제공된 @code{field()} 함수 호출로 바꿀 수 있습니다. 예를 들면:

@example
@@dataclass
class C:
    mylist: list[int] = field(default_factory=list)

c = C()
c.mylist += [1, 2, 3]
@end example

위에서 보인 것처럼, @ref{49e2,,MISSING} 값은 사용자가 일부 매개변수를 제공했는지를 탐지하는데 사용되는 표지 객체입니다. 일부 매개변수에 대해서는 @code{None} 이 별개의 의미를 갖는 유효한 값이기 때문에 이 표지가 사용됩니다. 어떤 코드도 @code{MISSING} 값을 직접 사용해서는 안 됩니다.

@code{field()} 의 매개변수는 다음과 같습니다:


@itemize -

@item 
`default': 제공되면, 이 필드의 기본값이 됩니다. 이것은 @code{field()} 호출 자체가 기본값의 정상 위치를 대체하기 때문에 필요합니다.

@item 
`default_factory': 제공되면, 이 필드의 기본값이 필요할 때 호출되는 인자가 없는 콜러블이어야 합니다. 여러 용도 중에서도, 이것은 아래에서 논의되는 것처럼 가변 기본값을 가진 필드를 지정하는 데 사용될 수 있습니다. `default' 와 `default_factory' 를 모두 지정하는 것은 에러입니다.

@item 
`init': 참(기본값)이면, 이 필드는 생성된 @ref{8be,,__init__()} 메서드의 매개변수로 포함됩니다.

@item 
`repr': 참(기본값)이면, 이 필드는 생성된 @ref{82e,,__repr__()} 메서드가 돌려주는 문자열에 포함됩니다.

@item 
`hash': 이것은 bool 또는 @code{None} 일 수 있습니다. 참이면, 이 필드는 생성된 @ref{cf2,,__hash__()} 메서드에 포함됩니다. 거짓이면, 이 필드는 생성된 @code{__hash__()}에서 제외됩니다. @code{None} (기본값) 이면, `compare' 의 값을 사용합니다: 필드가 비교에 사용되면 해시에 포함되어야 하기 때문에, 이것은 일반적으로 기대되는 행동입니다. 이 값을 @code{None} 이외의 값으로 설정하는 것은 권장하지 않습니다.

@code{hash=False} 이지만 @code{compare=True} 로 설정하는 한 가지 가능한 이유는, 동등 비교에 포함되는 필드가 해시값을 계산하는 데 비용이 많이 들고, 형의 해시값에 이바지하는 다른 필드가 있는 경우입니다. 필드가 해시에서 제외된 경우에도 비교에는 계속 사용됩니다.

@item 
`compare': 참(기본값)이면, 이 필드는 생성된 같음 및 비교 메서드(@ref{cf1,,__eq__()}, @ref{1510,,__gt__()} 등)에 포함됩니다.

@item 
`metadata': 매핑이나 @code{None}이 될 수 있습니다. @code{None}은 빈 딕셔너리로 취급됩니다. 이 값은 @ref{697,,MappingProxyType()} 로 감싸져서 읽기 전용으로 만들어지고, @ref{195c,,Field} 객체에 노출됩니다. 데이터 클래스에서는 전혀 사용되지 않으며, 제삼자 확장 메커니즘으로 제공됩니다. 여러 제삼자는 이름 공간으로 사용할 자신만의 키를 가질 수 있습니다.

@item 
`kw_only': If true, this field will be marked as keyword-only.
This is used when the generated @ref{8be,,__init__()} method’s
parameters are computed.

Keyword-only fields are also not included in @code{__match_args__}.
@end itemize

@quotation


Added in version 3.10.

@end quotation


@itemize -

@item 
`doc': optional docstring for this field.
@end itemize

@quotation


Added in version 3.14.

@end quotation

If the default value of a field is specified by a call to
@code{field()}, then the class attribute for this field will be
replaced by the specified `default' value.  If `default' is not
provided, then the class attribute will be deleted.  The intent is
that after the @ref{4e1,,@@dataclass} decorator runs, the class
attributes will all contain the default values for the fields, just
as if the default value itself were specified.  For example,
after:

@example
@@dataclass
class C:
    x: int
    y: int = field(repr=False)
    z: int = field(repr=False, default=10)
    t: int = 20
@end example

클래스 어트리뷰트 @code{C.z} 는 @code{10} 이 되고, 클래스 어트리뷰트 @code{C.t} 는 @code{20} 이 되고, 클래스 어트리뷰트 @code{C.x} 와 @code{C.y} 는 설정되지 않게 됩니다.
@end deffn

@geindex Field (dataclasses 클래스)
@anchor{library/dataclasses dataclasses Field}@anchor{195c}
@deffn {클래스} dataclasses.Field

@code{Field} 객체는 정의된 각 필드를 설명합니다. 이 객체는 내부적으로 생성되며 @ref{1936,,fields()} 모듈 수준 메서드(아래 참조)가 돌려줍니다. 사용자는 직접 @code{Field} 인스턴스 객체를 만들어서는 안 됩니다. 문서화 된 어트리뷰트는 다음과 같습니다:


@itemize -

@item 
@code{name}: 필드의 이름.

@item 
@code{type}: 필드의 형.

@item 
@code{default}, @code{default_factory}, @code{init}, @code{repr}, @code{hash}, @code{compare}, @code{metadata} 및 @code{kw_only} 는 @ref{195b,,field()} 함수에서와 같은 의미와 값을 가지고 있습니다.
@end itemize

다른 어트리뷰트도 있을 수 있지만, 내부적인 것이므로 검사하거나 의존해서는 안 됩니다.
@end deffn

@geindex InitVar (dataclasses 클래스)
@anchor{library/dataclasses dataclasses InitVar}@anchor{1bb2}
@deffn {클래스} dataclasses.InitVar

@code{InitVar[T]} type annotations describe variables that are @ref{49e3,,init-only}. Fields annotated with @code{InitVar}
are considered pseudo-fields, and thus are neither returned by the
@ref{1936,,fields()} function nor used in any way except adding them as
parameters to @ref{8be,,__init__()} and an optional
@ref{49e4,,__post_init__()}.
@end deffn

@geindex fields() (dataclasses 모듈)
@anchor{library/dataclasses dataclasses fields}@anchor{1936}
@deffn {함수} dataclasses.fields (class_or_instance)

데이터 클래스의 필드들을 정의하는 @ref{195c,,Field} 객체들의 튜플을 돌려줍니다. 데이터 클래스나 데이터 클래스의 인스턴스를 받아들입니다. 데이터 클래스 나 데이터 클래스의 인스턴스를 전달하지 않으면 @ref{198,,TypeError} 를 돌려줍니다. @code{ClassVar} 또는 @code{InitVar} 인 의사 필드는 반환하지 않습니다.
@end deffn

@geindex asdict() (dataclasses 모듈)
@anchor{library/dataclasses dataclasses asdict}@anchor{1a95}
@deffn {함수} dataclasses.asdict (obj, *, dict_factory=dict)

데이터 클래스 `obj' 를 딕셔너리로 변환합니다 (팩토리 함수 `dict_factory' 를 사용합니다). 각 데이터 클래스는 각 필드를 @code{name: value} 쌍으로 갖는 딕셔너리로 변환됩니다. 데이터 클래스, 딕셔너리, 리스트 및 튜플은 재귀적으로 변환됩니다. 다른 객체들은 @ref{d64,,copy.deepcopy()}로 복사됩니다.

Example of using @code{asdict()} on nested dataclasses:

@example
@@dataclass
class Point:
     x: int
     y: int

@@dataclass
class C:
     mylist: list[Point]

p = Point(10, 20)
assert asdict(p) == @{'x': 10, 'y': 20@}

c = C([Point(0, 0), Point(10, 4)])
assert asdict(c) == @{'mylist': [@{'x': 0, 'y': 0@}, @{'x': 10, 'y': 4@}]@}
@end example

To create a shallow copy, the following workaround may be used:

@example
@{field.name: getattr(obj, field.name) for field in fields(obj)@}
@end example

@code{asdict()}는 `obj' 가 데이터 클래스 인스턴스가 아닌 경우 @ref{198,,TypeError} 를 일으킵니다.
@end deffn

@geindex astuple() (dataclasses 모듈)
@anchor{library/dataclasses dataclasses astuple}@anchor{1a9d}
@deffn {함수} dataclasses.astuple (obj, *, tuple_factory=tuple)

데이터 클래스 `obj' 를 튜플로 변환합니다 (팩토리 함수 `tuple_factory' 를 사용합니다). 각 데이터 클래스는 각 필드 값들의 튜플로 변환됩니다. 데이터 클래스, 딕셔너리, 리스트 및 튜플은 재귀적으로 변환됩니다. 다른 객체들은 @ref{d64,,copy.deepcopy()}로 복사됩니다.

이전 예에서 계속하면:

@example
assert astuple(p) == (10, 20)
assert astuple(c) == ([(0, 0), (10, 4)],)
@end example

To create a shallow copy, the following workaround may be used:

@example
tuple(getattr(obj, field.name) for field in dataclasses.fields(obj))
@end example

@code{astuple()}은 `obj' 가 데이터 클래스 인스턴스가 아닌 경우 @ref{198,,TypeError} 를 일으킵니다.
@end deffn

@geindex make_dataclass() (dataclasses 모듈)
@anchor{library/dataclasses dataclasses make_dataclass}@anchor{185f}
@deffn {함수} dataclasses.make_dataclass (cls_name, fields, *, bases=(), namespace=None, init=True, repr=True, eq=True, order=False, unsafe_hash=False, frozen=False, match_args=True, kw_only=False, slots=False, weakref_slot=False, module=None, decorator=dataclass)

Creates a new dataclass with name `cls_name', fields as defined
in `fields', base classes as given in `bases', and initialized
with a namespace as given in `namespace'.  `fields' is an
iterable whose elements are each either @code{name}, @code{(name, type)},
or @code{(name, type, Field)}.  If just @code{name} is supplied,
@ref{8ba,,typing.Any} is used for @code{type}.  The values of `init',
`repr', `eq', `order', `unsafe_hash', `frozen',
`match_args', `kw_only', `slots', and `weakref_slot' have
the same meaning as they do in @ref{4e1,,@@dataclass}.

If `module' is defined, the @code{__module__} attribute
of the dataclass is set to that value.
By default, it is set to the module name of the caller.

The `decorator' parameter is a callable that will be used to create the dataclass.
It should take the class object as a first argument and the same keyword arguments
as @ref{4e1,,@@dataclass}. By default, the @code{@@dataclass}
function is used.

This function is not strictly required, because any Python
mechanism for creating a new class with @ref{458,,__annotations__} can
then apply the @ref{4e1,,@@dataclass} function to convert that class to
a dataclass.  This function is provided as a convenience.  For
example:

@example
C = make_dataclass('C',
                   [('x', int),
                     'y',
                    ('z', int, field(default=5))],
                   namespace=@{'add_one': lambda self: self.x + 1@})
@end example

는 다음과 동등합니다:

@example
@@dataclass
class C:
    x: int
    y: 'typing.Any'
    z: int = 5

    def add_one(self):
        return self.x + 1
@end example


Added in version 3.14: Added the `decorator' parameter.

@end deffn

@geindex replace() (dataclasses 모듈)
@anchor{library/dataclasses dataclasses replace}@anchor{1a6a}
@deffn {함수} dataclasses.replace (obj, /, **changes)

`obj' 와 같은 형의 새 객체를 만드는데, 필드를 `changes' 의 값들로 대체합니다. `obj' 가 데이터 클래스가 아니라면 @ref{198,,TypeError} 를 발생시킵니다. `changes' 의 키가 주어진 데이터 클래스의 필드 이름이 아니면, @code{TypeError} 를 발생시킵니다.

새로 반환된 객체는 데이터 클래스의 @ref{8be,,__init__()} 메서드를 호출하여 생성됩니다. 이렇게 함으로써 (있는 경우) @ref{49e4,,__post_init__()} 의 호출을 보장합니다.

기본값을 가지지 않는 초기화 전용 변수가 존재한다면, @code{replace()} 호출에 반드시 지정해서 @code{__init__()} 와 @ref{49e4,,__post_init__()} 에 전달 될 수 있도록 해야 합니다.

`changes' 가 @code{init=False} 를 갖는 것으로 정의된 필드를 포함하는 것은 에러입니다. 이 경우 @ref{2ec,,ValueError} 가 발생합니다.

@code{replace()}를 호출하는 동안 @code{init=False} 필드가 어떻게 작동하는지 미리 경고합니다. 그것들은 소스 객체로부터 복사되는 것이 아니라, (초기화되기는 한다면) @ref{49e4,,__post_init__()} 에서 초기화됩니다. @code{init=False} 필드는 거의 사용되지 않으리라고 예상합니다. 사용된다면, 대체 클래스 생성자를 사용하거나, 인스턴스 복사를 처리하는 사용자 정의 @code{replace()} (또는 비슷하게 이름 지어진) 메서드를 사용하는 것이 좋을 것입니다.

Dataclass instances are also supported by generic function @ref{1c0,,copy.replace()}.
@end deffn

@geindex is_dataclass() (dataclasses 모듈)
@anchor{library/dataclasses dataclasses is_dataclass}@anchor{1c15}
@deffn {함수} dataclasses.is_dataclass (obj)

매개변수가 데이터 클래스(데이터 클래스의 서브클래스 포함)나 그의 인스턴스면 @code{True}를 반환하고, 그렇지 않으면 @code{False}를 반환합니다.

(데이터 클래스 자체가 아니라) 데이터 클래스의 인스턴스인지 알아야 한다면 @code{not isinstance(obj, type)} 검사를 추가하십시오:

@example
def is_dataclass_instance(obj):
    return is_dataclass(obj) and not isinstance(obj, type)
@end example
@end deffn

@geindex MISSING (dataclasses 모듈)
@anchor{library/dataclasses dataclasses MISSING}@anchor{49e2}
@deffn {데이터} dataclasses.MISSING

A sentinel value signifying a missing default or default_factory.
@end deffn

@geindex KW_ONLY (dataclasses 모듈)
@anchor{library/dataclasses dataclasses KW_ONLY}@anchor{49e1}
@deffn {데이터} dataclasses.KW_ONLY

A sentinel value used as a type annotation.  Any fields after a
pseudo-field with the type of @code{KW_ONLY} are marked as
keyword-only fields.  Note that a pseudo-field of type
@code{KW_ONLY} is otherwise completely ignored.  This includes the
name of such a field.  By convention, a name of @code{_} is used for a
@code{KW_ONLY} field.  Keyword-only fields signify
@ref{8be,,__init__()} parameters that must be specified as keywords when
the class is instantiated.

In this example, the fields @code{y} and @code{z} will be marked as keyword-only fields:

@example
@@dataclass
class Point:
    x: float
    _: KW_ONLY
    y: float
    z: float

p = Point(0, y=1.5, z=2.0)
@end example

In a single dataclass, it is an error to specify more than one
field whose type is @code{KW_ONLY}.


Added in version 3.10.

@end deffn

@geindex FrozenInstanceError
@anchor{library/dataclasses dataclasses FrozenInstanceError}@anchor{49e5}
@deffn {예외} dataclasses.FrozenInstanceError

@code{frozen=True} 로 정의된 데이터 클래스에서 묵시적으로 정의된 @ref{2378,,__setattr__()} 또는 @ref{2379,,__delattr__()} 이 호출 될 때 발생합니다. @ref{5ee,,AttributeError}의 서브 클래스입니다.
@end deffn

@node 초기화 후처리,클래스 변수,Module contents<2>,dataclasses — 데이터 클래스
@anchor{library/dataclasses id1}@anchor{49e6}@anchor{library/dataclasses post-init-processing}@anchor{49e7}
@subsubsection 초기화 후처리


@geindex __post_init__() (dataclasses 모듈)
@anchor{library/dataclasses dataclasses __post_init__}@anchor{49e4}
@deffn {함수} dataclasses.__post_init__ ()

클래스에 정의된 경우, 생성된 @ref{8be,,__init__()}에 의해 호출되며, 일반적으로 @code{self.__post_init__()} 형태로 호출됩니다. 그러나, @code{InitVar} 필드가 정의되어 있으면, 클래스에 정의된 순서대로 @code{__post_init__()} 로 전달됩니다. @code{__init__()} 메서드가 생성되지 않으면, @code{__post_init__()} 가 자동으로 호출되지 않습니다.

다른 용도 중에서도, 하나나 그 이상의 다른 필드에 의존하는 필드 값을 초기화하는데 사용할 수 있습니다. 예를 들면:

@example
@@dataclass
class C:
    a: float
    b: float
    c: float = field(init=False)

    def __post_init__(self):
        self.c = self.a + self.b
@end example
@end deffn

The @ref{8be,,__init__()} method generated by @ref{4e1,,@@dataclass} does not call base
class @code{__init__()} methods. If the base class has an @code{__init__()} method
that has to be called, it is common to call this method in a
@ref{49e4,,__post_init__()} method:

@example
class Rectangle:
    def __init__(self, height, width):
        self.height = height
        self.width = width

@@dataclass
class Square(Rectangle):
    side: float

    def __post_init__(self):
        super().__init__(self.side, self.side)
@end example

Note, however, that in general the dataclass-generated @code{__init__()} methods
don’t need to be called, since the derived dataclass will take care of
initializing all fields of any base class that is a dataclass itself.

매개변수를 @code{__post_init__()} 에 전달하는 방법은 초기화 전용 변수에 대한 아래 섹션을 참조하십시오. 또한 @ref{1a6a,,replace()} 가 @code{init=False} 필드를 처리하는 방식에 관한 경고를 보십시오.

@node 클래스 변수,초기화 전용 변수,초기화 후처리,dataclasses — 데이터 클래스
@anchor{library/dataclasses class-variables}@anchor{49e8}@anchor{library/dataclasses dataclasses-class-variables}@anchor{49e9}
@subsubsection 클래스 변수


One of the few places where @ref{4e1,,@@dataclass} actually inspects the type
of a field is to determine if a field is a class variable as defined
in 
@geindex Python 향상 제안; PEP 526
PEP 526@footnote{https://peps.python.org/pep-0526/}.  It does this by checking if the type of the field is
@ref{56c,,typing.ClassVar}.  If a field is a @code{ClassVar}, it is excluded
from consideration as a field and is ignored by the dataclass
mechanisms.  Such @code{ClassVar} pseudo-fields are not returned by the
module-level @ref{1936,,fields()} function.

@node 초기화 전용 변수,고정 인스턴스,클래스 변수,dataclasses — 데이터 클래스
@anchor{library/dataclasses dataclasses-init-only-variables}@anchor{49e3}@anchor{library/dataclasses init-only-variables}@anchor{49ea}
@subsubsection 초기화 전용 변수


Another place where @ref{4e1,,@@dataclass} inspects a type annotation is to
determine if a field is an init-only variable.  It does this by seeing
if the type of a field is of type @ref{1bb2,,InitVar}.  If a field
is an @code{InitVar}, it is considered a pseudo-field called an init-only
field.  As it is not a true field, it is not returned by the
module-level @ref{1936,,fields()} function.  Init-only fields are added as
parameters to the generated @ref{8be,,__init__()} method, and are passed to
the optional @ref{49e4,,__post_init__()} method.  They are not otherwise used
by dataclasses.

예를 들어, 클래스를 만들 때 값이 제공되지 않으면, 필드가 데이터베이스로부터 초기화된다고 가정합시다:

@example
@@dataclass
class C:
    i: int
    j: int | None = None
    database: InitVar[DatabaseType | None] = None

    def __post_init__(self, database):
        if self.j is None and database is not None:
            self.j = database.lookup('j')

c = C(10, database=my_database)
@end example

이 경우, @ref{1936,,fields()} 는 @code{i} 와 @code{j} 를 위한 @ref{195c,,Field} 객체를 반환하지만, @code{database} 는 반환하지 않습니다.

@node 고정 인스턴스,계승,초기화 전용 변수,dataclasses — 데이터 클래스
@anchor{library/dataclasses dataclasses-frozen}@anchor{49e0}@anchor{library/dataclasses frozen-instances}@anchor{49eb}
@subsubsection 고정 인스턴스


It is not possible to create truly immutable Python objects.  However,
by passing @code{frozen=True} to the @ref{4e1,,@@dataclass} decorator you can
emulate immutability.  In that case, dataclasses will add
@ref{2378,,__setattr__()} and @ref{2379,,__delattr__()} methods to the class.  These
methods will raise a @ref{49e5,,FrozenInstanceError} when invoked.

@code{frozen=True} 를 사용할 때 약간의 성능 저하가 있습니다: @ref{8be,,__init__()} 는 필드를 초기화하는데 간단한 대입을 사용할 수 없고, @code{object.__setattr__()} 을 사용해야 합니다.

@c Make sure to not remove "object" from "object.__setattr__" in the above markup!

@node 계승,Re-ordering of keyword-only parameters in __init__,고정 인스턴스,dataclasses — 데이터 클래스
@anchor{library/dataclasses dataclasses-inheritance}@anchor{49ec}@anchor{library/dataclasses inheritance}@anchor{49ed}
@subsubsection 계승


When the dataclass is being created by the @ref{4e1,,@@dataclass} decorator,
it looks through all of the class’s base classes in reverse MRO (that
is, starting at @ref{c7d,,object}) and, for each dataclass that it finds,
adds the fields from that base class to an ordered mapping of fields.
After all of the base class fields are added, it adds its own fields
to the ordered mapping.  All of the generated methods will use this
combined, calculated ordered mapping of fields.  Because the fields
are in insertion order, derived classes override base classes.  An
example:

@example
@@dataclass
class Base:
    x: Any = 15.0
    y: int = 0

@@dataclass
class C(Base):
    z: int = 10
    x: int = 15
@end example

필드의 최종 목록은 순서대로 @code{x}, @code{y}, @code{z} 입니다. @code{x} 의 최종 형은 클래스 @code{C} 에서 지정된 @ref{19b,,int} 입니다.

생성된 @code{C} 의 @ref{8be,,__init__()} 메서드는 이렇게 됩니다:

@example
def __init__(self, x: int = 15, y: int = 0, z: int = 10):
@end example

@node Re-ordering of keyword-only parameters in __init__,기본 팩토리 함수,계승,dataclasses — 데이터 클래스
@anchor{library/dataclasses re-ordering-of-keyword-only-parameters-in-init}@anchor{49ee}
@subsubsection Re-ordering of keyword-only parameters in @code{__init__()}


After the parameters needed for @ref{8be,,__init__()} are computed, any
keyword-only parameters are moved to come after all regular
(non-keyword-only) parameters.  This is a requirement of how
keyword-only parameters are implemented in Python: they must come
after non-keyword-only parameters.

In this example, @code{Base.y}, @code{Base.w}, and @code{D.t} are keyword-only
fields, and @code{Base.x} and @code{D.z} are regular fields:

@example
@@dataclass
class Base:
    x: Any = 15.0
    _: KW_ONLY
    y: int = 0
    w: int = 1

@@dataclass
class D(Base):
    z: int = 10
    t: int = field(kw_only=True, default=0)
@end example

생성된 @code{D} 의 @code{__init__()} 메서드는 이렇게 됩니다:

@example
def __init__(self, x: Any = 15.0, z: int = 10, *, y: int = 0, w: int = 1, t: int = 0):
@end example

Note that the parameters have been re-ordered from how they appear in
the list of fields: parameters derived from regular fields are
followed by parameters derived from keyword-only fields.

The relative ordering of keyword-only parameters is maintained in the
re-ordered @code{__init__()} parameter list.

@node 기본 팩토리 함수,가변 기본값,Re-ordering of keyword-only parameters in __init__,dataclasses — 데이터 클래스
@anchor{library/dataclasses default-factory-functions}@anchor{49ef}
@subsubsection 기본 팩토리 함수


@ref{195b,,field()} 가 `default_factory' 를 지정하면, 필드의 기본값이 필요할 때 인자 없이 호출됩니다. 예를 들어, 리스트의 새 인스턴스를 만들려면, 이렇게 하세요:

@example
mylist: list = field(default_factory=list)
@end example

필드가 (@code{init=False} 를 사용해서) @ref{8be,,__init__()} 에서 제외되고, 그 필드가 `default_factory' 를 지정하면, 생성된 @code{__init__()} 함수는 항상 기본 팩토리 함수를 호출합니다. 이는 필드에 초기화 값을 제공할 수 있는 다른 방법이 없기 때문입니다.

@node 가변 기본값,Descriptor-typed fields,기본 팩토리 함수,dataclasses — 데이터 클래스
@anchor{library/dataclasses mutable-default-values}@anchor{49f0}
@subsubsection 가변 기본값


파이썬은 기본 멤버 변숫값을 클래스 어트리뷰트에 저장합니다. 데이터 클래스를 사용하지 않는 이 예제를 생각해보세요:

@example
class C:
    x = []
    def add(self, element):
        self.x.append(element)

o1 = C()
o2 = C()
o1.add(1)
o2.add(2)
assert o1.x == [1, 2]
assert o1.x is o2.x
@end example

클래스 @code{C} 의 두 인스턴스는 예상대로 같은 클래스 변수 @code{x} 를 공유합니다.

데이터 클래스를 사용해서, `만약' 이 코드가 올바르다면:

@example
@@dataclass
class D:
    x: list = []      # 이 코드는 ValueError 를 발생시킵니다
    def add(self, element):
        self.x.append(element)
@end example

비슷한 코드를 생성합니다:

@example
class D:
    x = []
    def __init__(self, x=x):
        self.x = x
    def add(self, element):
        self.x.append(element)

assert D().x is D().x
@end example

This has the same issue as the original example using class @code{C}.
That is, two instances of class @code{D} that do not specify a value
for @code{x} when creating a class instance will share the same copy
of @code{x}.  Because dataclasses just use normal Python class
creation they also share this behavior.  There is no general way
for Data Classes to detect this condition.  Instead, the
@ref{4e1,,@@dataclass} decorator will raise a @ref{2ec,,ValueError} if it
detects an unhashable default parameter.  The assumption is that if
a value is unhashable, it is mutable.  This is a partial solution,
but it does protect against many common errors.

기본 팩토리 함수를 사용하면 필드의 기본값으로 가변형의 새 인스턴스를 만들 수 있습니다:

@example
@@dataclass
class D:
    x: list = field(default_factory=list)

assert D().x is not D().x
@end example


버전 3.11에서 변경: Instead of looking for and disallowing objects of type @ref{24d,,list},
@ref{183,,dict}, or @ref{184,,set}, unhashable objects are now not allowed as
default values.  Unhashability is used to approximate
mutability.


@node Descriptor-typed fields,,가변 기본값,dataclasses — 데이터 클래스
@anchor{library/dataclasses descriptor-typed-fields}@anchor{49f1}
@subsubsection Descriptor-typed fields


Fields that are assigned @ref{e48,,descriptor objects} as their
default value have the following special behaviors:


@itemize *

@item 
The value for the field passed to the dataclass’s @ref{8be,,__init__()} method is
passed to the descriptor’s @ref{23b5,,__set__()} method rather than overwriting the
descriptor object.

@item 
Similarly, when getting or setting the field, the descriptor’s
@ref{16ed,,__get__()} or @code{__set__()} method is called rather than returning or
overwriting the descriptor object.

@item 
To determine whether a field contains a default value, @ref{4e1,,@@dataclass}
will call the descriptor’s @code{__get__()} method using its class access
form: @code{descriptor.__get__(obj=None, type=cls)}.  If the
descriptor returns a value in this case, it will be used as the
field’s default. On the other hand, if the descriptor raises
@ref{5ee,,AttributeError} in this situation, no default value will be
provided for the field.
@end itemize

@example
class IntConversionDescriptor:
    def __init__(self, *, default):
        self._default = default

    def __set_name__(self, owner, name):
        self._name = "_" + name

    def __get__(self, obj, type):
        if obj is None:
            return self._default

        return getattr(obj, self._name, self._default)

    def __set__(self, obj, value):
        setattr(obj, self._name, int(value))

@@dataclass
class InventoryItem:
    quantity_on_hand: IntConversionDescriptor = IntConversionDescriptor(default=100)

i = InventoryItem()
print(i.quantity_on_hand)   # 100
i.quantity_on_hand = 2.5    # __set__ 을 2.5 로 호출합니다
print(i.quantity_on_hand)   # 2
@end example

Note that if a field is annotated with a descriptor type, but is not assigned
a descriptor object as its default value, the field will act like a normal
field.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node contextlib — with 문 컨텍스트를 위한 유틸리티,abc — 추상 베이스 클래스,dataclasses — 데이터 클래스,파이썬 실행시간 서비스
@anchor{library/contextlib doc}@anchor{49f2}@anchor{library/contextlib contextlib-utilities-for-with-statement-contexts}@anchor{49f3}@anchor{library/contextlib module-contextlib}@anchor{27}@anchor{library/contextlib translation-repo}@anchor{49f4}
@subsection @code{contextlib} — @code{with} 문 컨텍스트를 위한 유틸리티


@geindex module; contextlib

`소스 코드:' Lib/contextlib.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/contextlib.py}


__________________________________________________________________


이 모듈은 @ref{186,,with} 문이 수반되는 일반적인 작업을 위한 유틸리티를 제공합니다. 자세한 정보는 @ref{240c,,컨텍스트 관리자 형} 과 @ref{237e,,with 문 컨텍스트 관리자}도 참조하십시오.

@menu
* 유틸리티:: 
* 예제와 조리법: 예제와 조리법<3>. 
* 일회용@comma{} 재사용 가능 및 재진입 가능 컨텍스트 관리자: 일회용 재사용 가능 및 재진입 가능 컨텍스트 관리자. 

@end menu

@node 유틸리티,예제와 조리법<3>,,contextlib — with 문 컨텍스트를 위한 유틸리티
@anchor{library/contextlib utilities}@anchor{49f5}
@subsubsection 유틸리티


제공되는 함수와 클래스:

@geindex AbstractContextManager (contextlib 클래스)
@anchor{library/contextlib contextlib AbstractContextManager}@anchor{e89}
@deffn {클래스} contextlib.AbstractContextManager

An @ref{13bb,,abstract base class} for classes that implement
@ref{7e3,,__enter__()} and @ref{1505,,__exit__()}. A default
implementation for @code{__enter__()} is provided which returns
@code{self} while @code{__exit__()} is an abstract method which by default
returns @code{None}. See also the definition of @ref{240c,,컨텍스트 관리자 형}.


Added in version 3.6.

@end deffn

@geindex AbstractAsyncContextManager (contextlib 클래스)
@anchor{library/contextlib contextlib AbstractAsyncContextManager}@anchor{d1f}
@deffn {클래스} contextlib.AbstractAsyncContextManager

An @ref{13bb,,abstract base class} for classes that implement
@ref{241e,,__aenter__()} and @ref{19a2,,__aexit__()}. A default
implementation for @code{__aenter__()} is provided which returns
@code{self} while @code{__aexit__()} is an abstract method which by default
returns @code{None}. See also the definition of
@ref{811,,비동기 컨텍스트 관리자}.


Added in version 3.7.

@end deffn

@geindex contextmanager() (contextlib 모듈)
@anchor{library/contextlib contextlib contextmanager}@anchor{1407}
@deffn {함수} @@contextlib.contextmanager

이 함수는 클래스나 별도의 @ref{7e3,,__enter__()}와 @ref{1505,,__exit__()} 메서드를 작성할 필요 없이, @ref{186,,with} 문 컨텍스트 관리자를 위한 팩토리 함수를 정의하는 데 사용할 수 있는 @ref{939,,데코레이터}입니다.

많은 객체가 자체적으로 with 문에서의 사용을 지원하지만, 스스로는 컨텍스트 관리자가 아니고 @code{contextlib.closing}과 함께 사용할 @code{close()} 메서드를 구현하지 않는 자원을 관리해야 하는 경우가 있습니다.

올바른 자원 관리를 보장하기 위한 추상적인 예는 다음과 같습니다:

@example
from contextlib import contextmanager

@@contextmanager
def managed_resource(*args, **kwds):
    # 자원을 얻는 코드, 예를 들어:
    resource = acquire_resource(*args, **kwds)
    try:
        yield resource
    finally:
        # 자원을 해제하는 코드, 예를 들어:
        release_resource(resource)
@end example

The function can then be used like this:

@example
>>> with managed_resource(timeout=3600) as resource:
...     # 블록의 코드에서 예외가 발생하더라도,
...     # 이 블록의 끝에서 자원이 해제됩니다
@end example

데코레이트 되는 함수는 호출될 때 @ref{1260,,제너레이터} 이터레이터를 반환해야 합니다. 이 이터레이터는 정확히 하나의 값을 산출해야 하며, 이는 @ref{186,,with} 문의 @code{as} 절에 있는 대상에 연결됩니다 (있다면).

제너레이터가 산출하는 지점에서, @ref{186,,with} 문에 중첩된 블록이 실행됩니다. 그런 다음 블록이 종료된 후 제너레이터가 재개합니다. 블록에서 처리되지 않은 예외가 발생하면, 제너레이터 내부의 yield가 등장한 지점에서 다시 발생합니다. 따라서, @ref{8f7,,try}…@ref{1ab,,except}…@ref{1b0,,finally} 문을 사용하여 에러(있다면)를 잡거나, 어떤 정리가 수행되도록 할 수 있습니다. 예외를 단지 로그 하기 위해 또는 (예외를 완전히 억제하는 대신) 어떤 작업을 수행하기 위해 예외를 잡았다면 제너레이터는 해당 예외를 다시 발생시켜야 합니다. 그렇지 않으면 제너레이터 컨텍스트 관리자가 @code{with} 문에 예외가 처리되었음을 표시하고, @code{with} 문 바로 다음에 오는 문장으로 실행이 재개됩니다.

@ref{1407,,contextmanager()}는 @ref{1406,,ContextDecorator}를 사용해서, 만들어진 컨텍스트 관리자를 @ref{186,,with} 문뿐만 아니라 데코레이터로 사용할 수 있습니다. 데코레이터로 사용될 때, 새로운 제너레이터 인스턴스는 각 함수 호출마다 묵시적으로 만들어집니다 (이는 그렇지 않을 경우 @code{contextmanager()}에 의해 만들어진 “일회성” 컨텍스트 관리자가 데코레이터로 사용하기 위해 컨텍스트 관리자가 여러 번의 호출을 지원해야 한다는 요구 사항을 충족시킬 수 있도록 합니다) .


버전 3.2에서 변경: @ref{1406,,ContextDecorator} 사용.

@end deffn

@geindex asynccontextmanager() (contextlib 모듈)
@anchor{library/contextlib contextlib asynccontextmanager}@anchor{d1e}
@deffn {함수} @@contextlib.asynccontextmanager

@ref{1407,,contextmanager()}와 유사하지만, @ref{811,,비동기 컨텍스트 관리자}를 만듭니다.

이 함수는 클래스나 별도의 @ref{241e,,__aenter__()}와 @ref{19a2,,__aexit__()} 메서드를 작성할 필요 없이, @ref{185,,async with} 문 비동기 컨텍스트 관리자를 위한 팩토리 함수를 정의하는 데 사용할 수 있는 @ref{939,,데코레이터}입니다. @ref{249b,,비동기 제너레이터} 함수에 적용해야 합니다.

간단한 예:

@example
from contextlib import asynccontextmanager

@@asynccontextmanager
async def get_connection():
    conn = await acquire_db_connection()
    try:
        yield conn
    finally:
        await release_db_connection(conn)

async def get_all_users():
    async with get_connection() as conn:
        return conn.query('SELECT ...')
@end example


Added in version 3.7.


Context managers defined with @code{asynccontextmanager()} can be used
either as decorators or with @ref{185,,async with} statements:

@example
import time
from contextlib import asynccontextmanager

@@asynccontextmanager
async def timeit():
    now = time.monotonic()
    try:
        yield
    finally:
        print(f'it took @{time.monotonic() - now@}s to run')

@@timeit()
async def main():
    # ... 비동기 코드 ...
@end example

데코레이터로 사용될 때, 새로운 제너레이터 인스턴스는 각 함수 호출마다 묵시적으로 만들어집니다. 이는 그렇지 않을 경우 @ref{1407,,contextmanager()}에 의해 만들어진 “일회성” 컨텍스트 관리자가 데코레이터로 사용하기 위해 컨텍스트 관리자가 여러 번의 호출을 지원해야 한다는 요구 사항을 충족시킬 수 있도록 합니다.


버전 3.10에서 변경: Async context managers created with @code{asynccontextmanager()} can
be used as decorators.

@end deffn

@geindex closing() (contextlib 모듈)
@anchor{library/contextlib contextlib closing}@anchor{158e}
@deffn {함수} contextlib.closing (thing)

블록이 완료될 때 `thing'을 닫는 컨텍스트 관리자를 반환합니다. 이것은 기본적으로 다음과 동등합니다:

@example
from contextlib import contextmanager

@@contextmanager
def closing(thing):
    try:
        yield thing
    finally:
        thing.close()
@end example

그리고 다음과 같은 코드를 작성할 수 있도록 합니다:

@example
from contextlib import closing
from urllib.request import urlopen

with closing(urlopen('https://www.python.org')) as page:
    for line in page:
        print(line)
@end example

@code{page}를 명시적으로 닫을 필요가 없습니다. 에러가 발생하더라도, @ref{186,,with} 블록이 종료될 때 @code{page.close()}가 호출됩니다.

@cartouche
@quotation 참고 
Most types managing resources support the @ref{1e1,,context manager} protocol,
which closes `thing' on leaving the @ref{186,,with} statement.
As such, @code{closing()} is most useful for third party types that don’t
support context managers.
This example is purely for illustration purposes,
as @ref{307,,urlopen()} would normally be used in a context manager.
@end quotation
@end cartouche
@end deffn

@geindex aclosing() (contextlib 모듈)
@anchor{library/contextlib contextlib aclosing}@anchor{9ee}
@deffn {함수} contextlib.aclosing (thing)

블록이 완료될 때 `thing'의 @code{aclose()} 메서드를 호출하는 비동기 컨텍스트 관리자를 반환합니다. 이것은 기본적으로 다음과 동등합니다:

@example
from contextlib import asynccontextmanager

@@asynccontextmanager
async def aclosing(thing):
    try:
        yield thing
    finally:
        await thing.aclose()
@end example

Significantly, @code{aclosing()} supports deterministic cleanup of async
generators when they happen to exit early by @ref{17f,,break} or an
exception.  For example:

@example
from contextlib import aclosing

async with aclosing(my_generator()) as values:
    async for value in values:
        if value == 42:
            break
@end example

This pattern ensures that the generator’s async exit code is executed in
the same context as its iterations (so that exceptions and context
variables work as expected, and the exit code isn’t run after the
lifetime of some task it depends on).


Added in version 3.10.

@end deffn

@geindex nullcontext() (contextlib 모듈)
@anchor{library/contextlib simplifying-support-for-single-optional-context-managers}@anchor{49f6}@anchor{library/contextlib contextlib nullcontext}@anchor{9ef}
@deffn {함수} contextlib.nullcontext (enter_result=None)

Return a context manager that returns `enter_result' from @ref{7e3,,__enter__()}, but
otherwise does nothing. It is intended to be used as a stand-in for an
optional context manager, for example:

@example
def myfunction(arg, ignore_exceptions=False):
    if ignore_exceptions:
        # 모든 예외를 무시하기 위해 suppress를 사용합니다.
        cm = contextlib.suppress(Exception)
    else:
        # 아무런 예외도 무시하지 않습니다, cm은 아무 효과도 없습니다.
        cm = contextlib.nullcontext()
    with cm:
        # 뭔가 합니다
@end example

`enter_result'를 사용하는 예:

@example
def process_file(file_or_path):
    if isinstance(file_or_path, str):
        # 문자열이면, 파일을 엽니다
        cm = open(file_or_path)
    else:
        # 파일을 닫는 책임은 호출자에게 있습니다
        cm = nullcontext(file_or_path)

    with cm as file:
        # 파일에 대한 처리를 수행합니다
@end example

또한 @ref{811,,비동기 컨텍스트 관리자}의 대체로 사용할 수 있습니다:

@example
async def send_http(session=None):
    if not session:
        # http 세션이 없으면, aiohttp 로 만듭니다
        cm = aiohttp.ClientSession()
    else:
        # 세션을 닫는 책임은 호출자에게 있습니다
        cm = nullcontext(session)

    async with cm as session:
        # 세션으로 http 요청을 보냅니다
@end example


Added in version 3.7.



버전 3.10에서 변경: @ref{7ef,,asynchronous context manager} support was added.

@end deffn

@geindex suppress() (contextlib 모듈)
@anchor{library/contextlib contextlib suppress}@anchor{1127}
@deffn {함수} contextlib.suppress (*exceptions)

@code{with} 문의 본문에서 발생하는 지정된 예외를 모두 억제한 후 @code{with} 문의 끝 다음에 오는 첫 번째 문장에서 실행을 재개하는 컨텍스트 관리자를 반환합니다.

예외를 완전히 억제하는 다른 메커니즘과 마찬가지로, 이 컨텍스트 관리자는 프로그램 실행을 조용히 계속하는 것이 옳은 것으로 알려진 매우 특정한 에러를 다루기 위해서만 사용해야 합니다.

예를 들면:

@example
from contextlib import suppress

with suppress(FileNotFoundError):
    os.remove('somefile.tmp')

with suppress(FileNotFoundError):
    os.remove('someotherfile.tmp')
@end example

이 코드는 다음과 동등합니다:

@example
try:
    os.remove('somefile.tmp')
except FileNotFoundError:
    pass

try:
    os.remove('someotherfile.tmp')
except FileNotFoundError:
    pass
@end example

이 컨텍스트 관리자는 @ref{49f7,,재진입 가능}합니다.

If the code within the @code{with} block raises a
@ref{564,,BaseExceptionGroup}, suppressed exceptions are removed from the
group.  Any exceptions of the group which are not suppressed are re-raised in
a new group which is created using the original group’s @ref{1a37,,derive()}
method.


Added in version 3.4.



버전 3.12에서 변경: @code{suppress} now supports suppressing exceptions raised as
part of a @ref{564,,BaseExceptionGroup}.

@end deffn

@geindex redirect_stdout() (contextlib 모듈)
@anchor{library/contextlib contextlib redirect_stdout}@anchor{fe6}
@deffn {함수} contextlib.redirect_stdout (new_target)

@ref{ccc,,sys.stdout}을 다른 파일이나 파일류 객체로 일시적으로 리디렉션 하기 위한 컨텍스트 관리자.

이 도구는 출력이 stdout에 배선된 기존 함수나 클래스에 유연성을 추가합니다.

For example, the output of @ref{ad4,,help()} normally is sent to `sys.stdout'.
You can capture that output in a string by redirecting the output to an
@ref{1128,,io.StringIO} object. The replacement stream is returned from the
@ref{7e3,,__enter__()} method and so is available as the target of the
@ref{186,,with} statement:

@example
with redirect_stdout(io.StringIO()) as f:
    help(pow)
s = f.getvalue()
@end example

@ref{ad4,,help()}의 출력을 디스크의 파일로 보내려면, 출력을 일반 파일로 리디렉션 하십시오:

@example
with open('help.txt', 'w') as f:
    with redirect_stdout(f):
        help(pow)
@end example

@ref{ad4,,help()}의 출력을 `sys.stderr'로 보내려면:

@example
with redirect_stdout(sys.stderr):
    help(pow)
@end example

@ref{ccc,,sys.stdout}에 대한 전역 부작용은 이 컨텍스트 관리자가 라이브러리 코드와 대부분의 스레드 응용 프로그램에 사용하기에 적합하지 않음을 의미합니다. 또한 서브 프로세스의 출력에는 영향을 미치지 않습니다. 그러나, 여전히 많은 유틸리티 스크립트에 유용한 접근법입니다.

이 컨텍스트 관리자는 @ref{49f7,,재진입 가능}합니다.


Added in version 3.4.

@end deffn

@geindex redirect_stderr() (contextlib 모듈)
@anchor{library/contextlib contextlib redirect_stderr}@anchor{fe5}
@deffn {함수} contextlib.redirect_stderr (new_target)

@ref{fe6,,redirect_stdout()}과 유사하지만, @ref{b33,,sys.stderr}를 다른 파일이나 파일류 객체로 리디렉션 합니다.

이 컨텍스트 관리자는 @ref{49f7,,재진입 가능}합니다.


Added in version 3.5.

@end deffn

@geindex chdir() (contextlib 모듈)
@anchor{library/contextlib contextlib chdir}@anchor{81f}
@deffn {함수} contextlib.chdir (path)

Non parallel-safe context manager to change the current working directory.
As this changes a global state, the working directory, it is not suitable
for use in most threaded or async contexts. It is also not suitable for most
non-linear code execution, like generators, where the program execution is
temporarily relinquished – unless explicitly desired, you should not yield
when this context manager is active.

This is a simple wrapper around @ref{820,,chdir()}, it changes the current
working directory upon entering and restores the old one on exit.

이 컨텍스트 관리자는 @ref{49f7,,재진입 가능}합니다.


Added in version 3.11.

@end deffn

@geindex ContextDecorator (contextlib 클래스)
@anchor{library/contextlib contextlib ContextDecorator}@anchor{1406}
@deffn {클래스} contextlib.ContextDecorator

컨텍스트 관리자를 데코레이터로도 사용할 수 있도록 하는 베이스 클래스.

Context managers inheriting from @code{ContextDecorator} have to implement
@ref{7e3,,__enter__()} and @ref{1505,,__exit__()} as normal.
@code{__exit__} retains its optional
exception handling even when used as a decorator.

@code{ContextDecorator}는 @ref{1407,,contextmanager()}에서 사용되므로, 이 기능을 자동으로 얻게 됩니다.

@code{ContextDecorator}의 예:

@example
from contextlib import ContextDecorator

class mycontext(ContextDecorator):
    def __enter__(self):
        print('Starting')
        return self

    def __exit__(self, *exc):
        print('Finishing')
        return False
@end example

The class can then be used like this:

@example
>>> @@mycontext()
... def function():
...     print('The bit in the middle')
...
>>> function()
Starting
The bit in the middle
Finishing

>>> with mycontext():
...     print('The bit in the middle')
...
Starting
The bit in the middle
Finishing
@end example

이 변경은 단지 다음 형식의 구성에 대한 편의 문법일 뿐입니다:

@example
def f():
    with cm():
        # 뭔가 합니다
@end example

@code{ContextDecorator}는 대신 다음과 같이 쓸 수 있도록 합니다:

@example
@@cm()
def f():
    # 뭔가 합니다
@end example

@code{cm}이 단지 함수의 일부가 아니라 전체 함수에 적용된다는 것을 분명히 합니다 (그리고 들여쓰기 수준을 절약하는 것도 좋습니다).

베이스 클래스가 이미 있는 기존 컨텍스트 관리자는 @code{ContextDecorator}를 믹스인 클래스로 사용하여 확장할 수 있습니다:

@example
from contextlib import ContextDecorator

class mycontext(ContextBaseClass, ContextDecorator):
    def __enter__(self):
        return self

    def __exit__(self, *exc):
        return False
@end example

@cartouche
@quotation 참고 
데코레이트 된 함수는 여러 번 호출될 수 있어야 해서, 하부 컨텍스트 관리자는 여러 @ref{186,,with} 문에서의 사용을 지원해야 합니다. 그렇지 않으면, 함수 내에 명시적인 @code{with} 문이 있는 원래 구문을 사용해야 합니다.
@end quotation
@end cartouche


Added in version 3.2.

@end deffn

@geindex AsyncContextDecorator (contextlib 클래스)
@anchor{library/contextlib contextlib AsyncContextDecorator}@anchor{9f0}
@deffn {클래스} contextlib.AsyncContextDecorator

@ref{1406,,ContextDecorator}와 유사하지만, 비동기 함수 전용입니다.

@code{AsyncContextDecorator}의 예:

@example
from asyncio import run
from contextlib import AsyncContextDecorator

class mycontext(AsyncContextDecorator):
    async def __aenter__(self):
        print('Starting')
        return self

    async def __aexit__(self, *exc):
        print('Finishing')
        return False
@end example

The class can then be used like this:

@example
>>> @@mycontext()
... async def function():
...     print('The bit in the middle')
...
>>> run(function())
Starting
The bit in the middle
Finishing

>>> async def function():
...    async with mycontext():
...         print('The bit in the middle')
...
>>> run(function())
Starting
The bit in the middle
Finishing
@end example


Added in version 3.10.

@end deffn

@geindex ExitStack (contextlib 클래스)
@anchor{library/contextlib contextlib ExitStack}@anchor{d1d}
@deffn {클래스} contextlib.ExitStack

다른 컨텍스트 관리자와 정리 함수, 특히 입력 데이터에 의해 선택적이거나 다른 방식으로 구동되는 것들을 프로그래밍 방식으로 쉽게 결합할 수 있도록 설계된 컨텍스트 관리자.

예를 들어, 일련의 파일을 다음과 같이 단일 with 문으로 쉽게 처리할 수 있습니다:

@example
with ExitStack() as stack:
    files = [stack.enter_context(open(fname)) for fname in filenames]
    # 목록의 뒤에 나오는 파일을 열려는 시도가
    # 예외를 발생시키더라도, with 문의 끝에서
    # 열린 모든 파일이 자동으로 닫힙니다.
@end example

The @ref{7e3,,__enter__()} method returns the @code{ExitStack} instance, and
performs no additional operations.

각 인스턴스는 인스턴스가 닫힐 때 (명시적으로 혹은 @ref{186,,with} 문의 끝에서 묵시적으로) 역순으로 호출되는 등록된 콜백의 스택을 유지합니다. 컨텍스트 스택 인스턴스가 가비지 수집될 때 콜백이 묵시적으로 호출되지 `않음'에 유의하십시오.

이 스택 모델은 @code{__init__} 메서드에서 자원을 확보하는 컨텍스트 관리자(가령 파일 객체)가 올바르게 처리될 수 있도록 사용됩니다.

등록된 콜백이 등록 순서의 역순으로 호출되므로, 여러 개의 중첩된 @ref{186,,with} 문이 등록된 콜백 집합과 함께 사용된 것처럼 작동합니다. 이것은 예외 처리로도 확장됩니다 - 내부 콜백이 예외를 억제하거나 바꾸면, 외부 콜백에는 갱신된 상태에 따른 인자가 전달됩니다.

탈출 콜백의 스택을 올바르게 되감는 세부 사항을 다루는 비교적 저수준의 API입니다. 응용 프로그램 특정 방식으로 탈출 스택을 조작하는 고수준 컨텍스트 관리자에게 적절한 기반을 제공합니다.


Added in version 3.3.


@geindex enter_context() (contextlib.ExitStack 메서드)
@anchor{library/contextlib contextlib ExitStack enter_context}@anchor{7ed}
@deffn {메서드} enter_context (cm)

새로운 컨텍스트 관리자에 진입하고 @ref{1505,,__exit__()} 메서드를 콜백 스택에 추가합니다. 반환 값은 컨텍스트 관리자 고유의 @ref{7e3,,__enter__()} 메서드의 결과입니다.

이러한 컨텍스트 관리자는 @ref{186,,with} 문의 일부로 직접 사용되었다면 일반적으로 했을 것과 마찬가지로 예외를 억제할 수 있습니다.


버전 3.11에서 변경: Raises @ref{198,,TypeError} instead of @ref{5ee,,AttributeError} if `cm'
is not a context manager.

@end deffn

@geindex push() (contextlib.ExitStack 메서드)
@anchor{library/contextlib contextlib ExitStack push}@anchor{49f8}
@deffn {메서드} push (exit)

컨텍스트 관리자의 @ref{1505,,__exit__()} 메서드를 콜백 스택에 추가합니다.

@code{__enter__}가 호출되지 `않기' 때문에, 이 메서드를 사용하여 컨텍스트 관리자 고유의 @ref{1505,,__exit__()} 메서드로 @ref{7e3,,__enter__()} 구현의 일부를 보호(cover)하는 데 사용할 수 있습니다.

컨텍스트 관리자가 아닌 객체를 전달하면, 이 메서드는 해당 객체가 컨텍스트 관리자의 @ref{1505,,__exit__()} 메서드와 같은 서명을 가진 콜백인 것으로 가정하여 콜백 스택에 직접 추가합니다.

참값을 반환함으로써, 이 콜백은 컨텍스트 관리자 @ref{1505,,__exit__()} 메서드와 같은 방식으로 예외를 억제할 수 있습니다.

전달된 객체는 함수에서 반환되어, 이 메서드를 함수 데코레이터로 사용할 수 있도록 합니다.
@end deffn

@geindex callback() (contextlib.ExitStack 메서드)
@anchor{library/contextlib contextlib ExitStack callback}@anchor{c75}
@deffn {메서드} callback (callback, /, *args, **kwds)

임의의 콜백 함수와 인자를 받아서 콜백 스택에 추가합니다.

다른 메서드와 달리, 이 방법으로 추가된 콜백은 예외를 무시할 수 없습니다 (예외 세부 정보가 전달되지 않기 때문입니다).

전달된 콜백은 함수에서 반환되어, 이 메서드를 함수 데코레이터로 사용할 수 있도록 합니다.
@end deffn

@geindex pop_all() (contextlib.ExitStack 메서드)
@anchor{library/contextlib contextlib ExitStack pop_all}@anchor{49f9}
@deffn {메서드} pop_all ()

콜백 스택을 새로운 @ref{d1d,,ExitStack} 인스턴스로 옮기고 그것을 반환합니다. 이 작업으로 아무런 콜백도 호출되지 않습니다 - 대신, 이제 새 스택이 닫힐 때 (명시적으로나 @ref{186,,with} 문의 끝에서 묵시적으로) 호출됩니다.

예를 들어, 파일 그룹을 다음과 같이 “전부 아니면 아무것도” 방식으로 열 수 있습니다:

@example
with ExitStack() as stack:
    files = [stack.enter_context(open(fname)) for fname in filenames]
    # close 메서드를 잡고 있지만, 아직 호출하지 않습니다.
    close_files = stack.pop_all().close
    # 어떤 파일을 여는 데 실패하면, 이전에 열었던 모든 파일이
    # 자동으로 닫힙니다. 모든 파일이 성공적으로 열리면,
    # with 문이 끝난 후에도 열린 상태로 유지됩니다. 그런 다음
    # close_files()를 명시적으로 호출하여 모두 닫을 수 있습니다.
@end example
@end deffn

@geindex close() (contextlib.ExitStack 메서드)
@anchor{library/contextlib contextlib ExitStack close}@anchor{49fa}
@deffn {메서드} close ()

콜백 스택을 즉시 되감고, 등록 역순으로 콜백을 호출합니다. 등록된 모든 컨텍스트 관리자와 탈출 콜백에 전달되는 인자는 예외가 발생하지 않았음을 나타냅니다.
@end deffn
@end deffn

@geindex AsyncExitStack (contextlib 클래스)
@anchor{library/contextlib contextlib AsyncExitStack}@anchor{d20}
@deffn {클래스} contextlib.AsyncExitStack

@ref{d1d,,ExitStack}과 유사한 @ref{811,,비동기 컨텍스트 관리자}, 코루틴 정리 로직을 가질 뿐만 아니라 동기와 비동기 컨텍스트 관리자의 결합을 지원합니다.

@ref{49fa,,close()} 메서드는 구현되지 않았습니다; 대신 @ref{49fb,,aclose()}를 사용해야 합니다.

@geindex enter_async_context() (contextlib.AsyncExitStack 메서드)
@anchor{library/contextlib contextlib AsyncExitStack enter_async_context}@anchor{7ee}
@deffn {메서드} async enter_async_context (cm)

@ref{7ed,,ExitStack.enter_context()}와 유사하지만, 비동기 컨텍스트 관리자를 기대합니다.


버전 3.11에서 변경: Raises @ref{198,,TypeError} instead of @ref{5ee,,AttributeError} if `cm'
is not an asynchronous context manager.

@end deffn

@geindex push_async_exit() (contextlib.AsyncExitStack 메서드)
@anchor{library/contextlib contextlib AsyncExitStack push_async_exit}@anchor{49fc}
@deffn {메서드} push_async_exit (exit)

@ref{49f8,,ExitStack.push()}와 유사하지만, 비동기 컨텍스트 관리자나 코루틴 함수를 기대합니다.
@end deffn

@geindex push_async_callback() (contextlib.AsyncExitStack 메서드)
@anchor{library/contextlib contextlib AsyncExitStack push_async_callback}@anchor{c76}
@deffn {메서드} push_async_callback (callback, /, *args, **kwds)

@ref{c75,,ExitStack.callback()}과 유사하지만 코루틴 함수를 기대합니다.
@end deffn

@geindex aclose() (contextlib.AsyncExitStack 메서드)
@anchor{library/contextlib contextlib AsyncExitStack aclose}@anchor{49fb}
@deffn {메서드} async aclose ()

@ref{49fa,,ExitStack.close()}와 유사하지만 어웨이터블을 올바르게 처리합니다.
@end deffn

@ref{d1e,,asynccontextmanager()} 에 대한 예제를 계속합니다:

@example
async with AsyncExitStack() as stack:
    connections = [await stack.enter_async_context(get_connection())
        for i in range(5)]
    # 목록의 뒤에서 연결을 열려는 시도가 예외를
    # 발생시키더라도, async with 문의 끝에서
    # 열린 모든 연결이 자동으로 해제됩니다.
@end example


Added in version 3.7.

@end deffn

@node 예제와 조리법<3>,일회용 재사용 가능 및 재진입 가능 컨텍스트 관리자,유틸리티,contextlib — with 문 컨텍스트를 위한 유틸리티
@anchor{library/contextlib examples-and-recipes}@anchor{49fd}
@subsubsection 예제와 조리법


This section describes some examples and recipes for making effective use of
the tools provided by @code{contextlib}.

@menu
* 일정하지 않은 수의 컨텍스트 관리자 지원:: 
* __enter__ 메서드에서 발생하는 예외 잡기:: 
* __enter__ 구현에서 정리하기:: 
* try-finally와 플래그 변수 사용 교체하기:: 
* 함수 데코레이터로 컨텍스트 관리자 사용하기:: 

@end menu

@node 일정하지 않은 수의 컨텍스트 관리자 지원,__enter__ 메서드에서 발생하는 예외 잡기,,예제와 조리법<3>
@anchor{library/contextlib supporting-a-variable-number-of-context-managers}@anchor{49fe}
@subsubsection 일정하지 않은 수의 컨텍스트 관리자 지원


@ref{d1d,,ExitStack}의 주요 사용 사례는 클래스 설명서에 제공된 것입니다: 일정하지 않은 수의 컨텍스트 관리자와 기타 정리 연산을 단일 @ref{186,,with} 문에서 지원합니다. 가변성은 사용자 입력(가령 사용자 지정한 파일 모음을 여는 것)에 의해 구동되는 필요한 컨텍스트 관리자의 수나, 일부 선택적인 컨텍스트 관리자의 존재에서 비롯될 수 있습니다:

@example
with ExitStack() as stack:
    for resource in resources:
        stack.enter_context(resource)
    if need_special_resource():
        special = acquire_special_resource()
        stack.callback(release_special_resource, special)
    # 획득한 자원들을 사용하는 작업을 수행합니다
@end example

볼 수 있듯이, @ref{d1d,,ExitStack}을 사용하면 @ref{186,,with} 문을 사용하여 컨텍스트 관리자 프로토콜을 스스로 지원하지 않는 임의의 자원을 쉽게 관리할 수 있습니다.

@node __enter__ 메서드에서 발생하는 예외 잡기,__enter__ 구현에서 정리하기,일정하지 않은 수의 컨텍스트 관리자 지원,예제와 조리법<3>
@anchor{library/contextlib catching-exceptions-from-enter-methods}@anchor{49ff}
@subsubsection @code{__enter__} 메서드에서 발생하는 예외 잡기


It is occasionally desirable to catch exceptions from an @ref{7e3,,__enter__()}
method implementation, `without' inadvertently catching exceptions from
the @ref{186,,with} statement body or the context manager’s @ref{1505,,__exit__()}
method. By using @ref{d1d,,ExitStack} the steps in the context management
protocol can be separated slightly in order to allow this:

@example
stack = ExitStack()
try:
    x = stack.enter_context(cm)
except Exception:
    # __enter__ 예외를 처리합니다
else:
    with stack:
        # 정상적인 경우를 처리합니다
@end example

실제로 이렇게 할 필요가 있다는 것은 하부 API가 @ref{8f7,,try}/@ref{1ab,,except}/@ref{1b0,,finally} 문과 함께 사용하기 위한 직접 자원 관리 인터페이스를 제공해야 함을 나타내지만, 모든 API가 이런 측면에서 잘 설계된 것은 아닙니다. 컨텍스트 관리자가 유일하게 제공되는 자원 관리 API일 때, @ref{d1d,,ExitStack}을 사용하면 @ref{186,,with} 문에서 직접 처리할 수 없는 다양한 상황을 더 쉽게 처리할 수 있습니다.

@node __enter__ 구현에서 정리하기,try-finally와 플래그 변수 사용 교체하기,__enter__ 메서드에서 발생하는 예외 잡기,예제와 조리법<3>
@anchor{library/contextlib cleaning-up-in-an-enter-implementation}@anchor{4a00}
@subsubsection @code{__enter__} 구현에서 정리하기


@ref{49f8,,ExitStack.push()} 설명서에서 언급했듯이, 이 메서드는 @ref{7e3,,__enter__()} 구현의 후반 단계가 실패하면 이미 할당된 자원을 정리하는 데 유용할 수 있습니다.

다음은 선택적 유효성 검증 함수와 함께 자원 확보와 해제 함수를 받아들이고 이를 컨텍스트 관리 프로토콜에 매핑하는 컨텍스트 관리자를 위해 이를 수행하는 예제입니다:

@example
from contextlib import contextmanager, AbstractContextManager, ExitStack

class ResourceManager(AbstractContextManager):

    def __init__(self, acquire_resource, release_resource, check_resource_ok=None):
        self.acquire_resource = acquire_resource
        self.release_resource = release_resource
        if check_resource_ok is None:
            def check_resource_ok(resource):
                return True
        self.check_resource_ok = check_resource_ok

    @@contextmanager
    def _cleanup_on_error(self):
        with ExitStack() as stack:
            stack.push(self)
            yield
            # 유효성 검사가 통과되어 예외가 발생하지 않았습니다
            # 따라서, 자원을 유지하고 호출자에게 다시
            # 전달하려고 합니다
            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):
        # 자원 해제 로직을 중복할 필요가 없습니다
        self.release_resource()
@end example

@node try-finally와 플래그 변수 사용 교체하기,함수 데코레이터로 컨텍스트 관리자 사용하기,__enter__ 구현에서 정리하기,예제와 조리법<3>
@anchor{library/contextlib replacing-any-use-of-try-finally-and-flag-variables}@anchor{4a01}
@subsubsection @code{try-finally}와 플래그 변수 사용 교체하기


때때로 보이는 패턴은 @code{finally} 절의 본문을 실행할지를 나타내는 플래그 변수가 있는 @code{try-finally} 문입니다. 가장 간단한 형태(단지 대신 @code{except} 절을 사용하는 것만으로 이미 처리되었을 수 없는)는 다음과 같습니다:

@example
cleanup_needed = True
try:
    result = perform_operation()
    if result:
        cleanup_needed = False
finally:
    if cleanup_needed:
        cleanup_resources()
@end example

다른 @code{try} 문 기반 코드와 마찬가지로, 설정 코드와 정리 코드가 임의로 긴 코드 섹션으로 분리될 수 있어서 개발과 검토에 문제가 발생할 수 있습니다.

@ref{d1d,,ExitStack}을 사용하면 대신 @code{with} 문의 끝에서 실행할 콜백을 등록한 다음 나중에 해당 콜백 실행을 건너뛰기로 할 수 있습니다:

@example
from contextlib import ExitStack

with ExitStack() as stack:
    stack.callback(cleanup_resources)
    result = perform_operation()
    if result:
        stack.pop_all()
@end example

이를 통해 별도의 플래그 변수를 요구하지 않고, 의도하는 정리 동작을 사전에 명시적으로 만들 수 있습니다.

특정 응용 프로그램에서 이 패턴을 많이 사용한다면, 작은 도우미 클래스를 사용하여 훨씬 더 단순화할 수 있습니다:

@example
from contextlib import ExitStack

class Callback(ExitStack):
    def __init__(self, callback, /, *args, **kwds):
        super().__init__()
        self.callback(callback, *args, **kwds)

    def cancel(self):
        self.pop_all()

with Callback(cleanup_resources) as cb:
    result = perform_operation()
    if result:
        cb.cancel()
@end example

자원 정리가 아직 독립 함수로 깔끔하게 번들 되어 있지 않으면, @ref{c75,,ExitStack.callback()}의 데코레이터 형식을 사용하여 자원 정리를 미리 선언할 수 있습니다:

@example
from contextlib import ExitStack

with ExitStack() as stack:
    @@stack.callback
    def cleanup_resources():
        ...
    result = perform_operation()
    if result:
        stack.pop_all()
@end example

데코레이터 프로토콜의 작동 방식으로 인해, 이 방법으로 선언된 콜백 함수는 아무런 매개 변수도 취할 수 없습니다. 대신 해제할 모든 자원은 클로저(closure) 변수로 액세스해야 합니다.

@node 함수 데코레이터로 컨텍스트 관리자 사용하기,,try-finally와 플래그 변수 사용 교체하기,예제와 조리법<3>
@anchor{library/contextlib using-a-context-manager-as-a-function-decorator}@anchor{4a02}
@subsubsection 함수 데코레이터로 컨텍스트 관리자 사용하기


@ref{1406,,ContextDecorator}를 사용하면 일반적인 @code{with} 문과 함수 데코레이터 모두로 컨텍스트 관리자를 사용할 수 있습니다.

예를 들어, 진입 시간과 탈출 시간을 추적할 수 있는 로거(logger)로 함수나 문장 그룹을 감싸는 것이 유용할 때가 있습니다. 작업에 대한 함수 데코레이터와 컨텍스트 관리자를 모두 작성하는 대신, @ref{1406,,ContextDecorator}를 상속하면 두 가지 기능을 하나의 정의로 제공합니다:

@example
from contextlib import ContextDecorator
import logging

logging.basicConfig(level=logging.INFO)

class track_entry_and_exit(ContextDecorator):
    def __init__(self, name):
        self.name = name

    def __enter__(self):
        logging.info('Entering: %s', self.name)

    def __exit__(self, exc_type, exc, exc_tb):
        logging.info('Exiting: %s', self.name)
@end example

이 클래스의 인스턴스는 컨텍스트 관리자로 사용할 수 있습니다:

@example
with track_entry_and_exit('widget loader'):
    print('Some time consuming activity goes here')
    load_widget()
@end example

또한 함수 데코레이터로도 사용할 수 있습니다:

@example
@@track_entry_and_exit('widget loader')
def activity():
    print('Some time consuming activity goes here')
    load_widget()
@end example

컨텍스트 관리자를 함수 데코레이터로 사용할 때 한 가지 추가 제한 사항이 있음에 유의하십시오: @ref{7e3,,__enter__()}의 반환 값에 액세스 할 수 있는 방법이 없습니다. 이 값이 필요하면, 여전히 명시적인 @code{with} 문을 사용할 필요가 있습니다.


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 343

@item PEP 343@footnote{https://peps.python.org/pep-0343/}- “with” 문

파이썬 @ref{186,,with} 문의 명세, 배경 및 예
@end table


@node 일회용 재사용 가능 및 재진입 가능 컨텍스트 관리자,,예제와 조리법<3>,contextlib — with 문 컨텍스트를 위한 유틸리티
@anchor{library/contextlib single-use-reusable-and-reentrant-cms}@anchor{1129}@anchor{library/contextlib single-use-reusable-and-reentrant-context-managers}@anchor{4a03}
@subsubsection 일회용, 재사용 가능 및 재진입 가능 컨텍스트 관리자


대부분의 컨텍스트 관리자는 @ref{186,,with} 문에서 한 번만 효과적으로 사용할 수 있다는 것을 의미하는 방식으로 작성됩니다. 이러한 일회용 컨텍스트 관리자는 사용될 때마다 새로 만들어야 합니다 - 두 번째로 사용하려고 하면 예외가 발생하거나 올바르게 작동하지 않습니다.

이 흔한 제한 사항은 일반적으로 컨텍스트 관리자가 사용되는 @ref{186,,with} 문의 헤더에서 컨텍스트 관리자를 직접 만들도록 권고하게 합니다 (위의 모든 사용 예제에서 보이듯이).

파일은 효과적인 일회용 컨텍스트 관리자의 예입니다, 첫 번째 @ref{186,,with} 문이 파일을 닫아서, 해당 파일 객체를 사용하는 추가 IO 연산을 막기 때문입니다.

@ref{1407,,contextmanager()}를 사용하여 만들어진 컨텍스트 관리자도 일회용 컨텍스트 관리자이며, 두 번째로 사용하려는 경우 하부 제너레이터가 산출에 실패하는 것에 대해 불평합니다:

@example
>>> from contextlib import contextmanager
>>> @@contextmanager
... def singleuse():
...     print("Before")
...     yield
...     print("After")
...
>>> cm = singleuse()
>>> with cm:
...     pass
...
Before
After
>>> with cm:
...     pass
...
Traceback (most recent call last):
    ...
RuntimeError: generator didn't yield
@end example

@menu
* 재진입 가능 컨텍스트 관리자:: 
* 재사용 가능 컨텍스트 관리자:: 

@end menu

@node 재진입 가능 컨텍스트 관리자,재사용 가능 컨텍스트 관리자,,일회용 재사용 가능 및 재진입 가능 컨텍스트 관리자
@anchor{library/contextlib reentrant-cms}@anchor{49f7}@anchor{library/contextlib reentrant-context-managers}@anchor{4a04}
@subsubsection 재진입 가능 컨텍스트 관리자


더욱 정교한 컨텍스트 관리자는 “재진입”할 수 있습니다. 이러한 컨텍스트 관리자는 여러 @ref{186,,with} 문에서 사용될 수 있을 뿐만 아니라 이미 같은 컨텍스트 관리자를 사용하는 @code{with} 문 `내부에서' 사용될 수도 있습니다.

@ref{32e,,threading.RLock}은 @ref{1127,,suppress()}, @ref{fe6,,redirect_stdout()} 및 @ref{81f,,chdir()}과 같이 재진입 가능 컨텍스트 관리자의 예입니다. 재진입 사용의 매우 간단한 예는 다음과 같습니다:

@example
>>> from contextlib import redirect_stdout
>>> from io import StringIO
>>> stream = StringIO()
>>> write_to_stream = redirect_stdout(stream)
>>> with write_to_stream:
...     print("This is written to the stream rather than stdout")
...     with write_to_stream:
...         print("This is also written to the stream")
...
>>> print("This is written directly to stdout")
This is written directly to stdout
>>> print(stream.getvalue())
This is written to the stream rather than stdout
This is also written to the stream
@end example

재진입의 실제 예는 서로를 호출하는 여러 함수를 포함할 가능성이 높아서 이 예보다 훨씬 더 복잡합니다.

재진입 가능하다는 것이 스레드 안전하다는 것과 같지 `않음'에도 유의하십시오. 예를 들어, @ref{fe6,,redirect_stdout()}은 @ref{ccc,,sys.stdout}을 다른 스트림으로 연결하여 시스템 상태를 전역적으로 수정하므로 명백히 스레드 안전하지 않습니다.

@node 재사용 가능 컨텍스트 관리자,,재진입 가능 컨텍스트 관리자,일회용 재사용 가능 및 재진입 가능 컨텍스트 관리자
@anchor{library/contextlib reusable-cms}@anchor{4a05}@anchor{library/contextlib reusable-context-managers}@anchor{4a06}
@subsubsection 재사용 가능 컨텍스트 관리자


일회용과 재진입 가능 컨텍스트 관리자와 구별되는 “재사용할 수 있는” 컨텍스트 관리자입니다 (또는 재진입 가능 컨텍스트 관리자도 재사용 가능하므로, 완전히 명시적이려면 “재사용할 수 있지만 재진입할 수 없는” 컨텍스트 관리자입니다). 이러한 컨텍스트 관리자는 여러 번 사용되는 것을 지원하지만, 같은 컨텍스트 관리자 인스턴스가 포함하는 with 문에서 이미 사용되었으면 실패합니다 (또는 올바르게 작동하지 않습니다).

@ref{19f4,,threading.Lock}은 재사용할 수 있지만 재진입할 수 없는 컨텍스트 관리자의 예입니다 (재진입 가능 록을 위해서는 @ref{32e,,threading.RLock}을 대신 사용해야 합니다).

재사용할 수 있지만 재진입할 수 없는 컨텍스트 관리자의 또 다른 예는 @ref{d1d,,ExitStack}인 데, 콜백이 추가된 위치와 관계없이 with 문을 떠날 때 현재 등록된 콜백을 `모두' 호출하기 때문입니다:

@example
>>> from contextlib import ExitStack
>>> stack = ExitStack()
>>> with stack:
...     stack.callback(print, "Callback: from first context")
...     print("Leaving first context")
...
Leaving first context
Callback: from first context
>>> with stack:
...     stack.callback(print, "Callback: from second context")
...     print("Leaving second context")
...
Leaving second context
Callback: from second context
>>> with stack:
...     stack.callback(print, "Callback: from outer context")
...     with stack:
...         stack.callback(print, "Callback: from inner context")
...         print("Leaving inner context")
...     print("Leaving outer context")
...
Leaving inner context
Callback: from inner context
Callback: from outer context
Leaving outer context
@end example

예제의 결과가 보여주듯이, 여러 with 문에서 단일 스택 객체를 재사용하는 것은 올바르게 작동하지만, 중첩을 시도하면 가장 안쪽 with 문 끝에서 스택이 지워지기 때문에 바람직한 동작이 아닙니다.

단일 인스턴스를 재사용하는 대신 별도의 @ref{d1d,,ExitStack} 인스턴스를 사용하면 이 문제를 피할 수 있습니다:

@example
>>> from contextlib import ExitStack
>>> with ExitStack() as outer_stack:
...     outer_stack.callback(print, "Callback: from outer context")
...     with ExitStack() as inner_stack:
...         inner_stack.callback(print, "Callback: from inner context")
...         print("Leaving inner context")
...     print("Leaving outer context")
...
Leaving inner context
Callback: from inner context
Leaving outer context
Callback: from outer context
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node abc — 추상 베이스 클래스,atexit — 종료 처리기,contextlib — with 문 컨텍스트를 위한 유틸리티,파이썬 실행시간 서비스
@anchor{library/abc doc}@anchor{4a07}@anchor{library/abc abc-abstract-base-classes}@anchor{4a08}@anchor{library/abc module-abc}@anchor{4}@anchor{library/abc translation-repo}@anchor{4a09}
@subsection @code{abc} — 추상 베이스 클래스


@geindex module; abc

@c much of the content adapted from docstrings

`소스 코드:' Lib/abc.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/abc.py}


__________________________________________________________________


이 모듈은, 
@geindex Python 향상 제안; PEP 3119
PEP 3119@footnote{https://peps.python.org/pep-3119/}에서 설명된 대로, 파이썬에서 @ref{13bb,,추상 베이스 클래스} (ABC) 를 정의하기 위한 기반 구조를 제공합니다; 이것이 왜 파이썬에 추가되었는지는 PEP를 참조하십시오. (ABC를 기반으로 하는 숫자의 형 계층 구조에 관해서는 
@geindex Python 향상 제안; PEP 3141
PEP 3141@footnote{https://peps.python.org/pep-3141/}과 @ref{a2,,numbers} 모듈을 참고하십시오.)

@ref{1e,,collections} 모듈은 ABC로부터 파생된 몇 가지 구상(concrete) 클래스를 가지고 있습니다; 이것은 물론 더 파생될 수 있습니다. 또한, @ref{1f,,collections.abc} 서브 모듈에는 클래스나 인스턴스가 특정 인터페이스를 (예를 들어, @ref{823,,해시 가능}이거나 @ref{13c0,,매핑}이면) 제공하는지 검사하는 데 사용할 수 있는 ABC가 있습니다.

이 모듈은 ABC를 정의하기 위한 메타 클래스 @ref{111a,,ABCMeta}와 상속을 통해 ABC를 정의하는 대안적 방법을 제공하는 도우미 클래스 @ref{1119,,ABC}를 제공합니다:

@geindex ABC (abc 클래스)
@anchor{library/abc abc ABC}@anchor{1119}
@deffn {클래스} abc.ABC

@ref{111a,,ABCMeta}를 메타 클래스로 가지는 도우미 클래스. 이 클래스를 사용하면, 때로 혼란스러운 메타 클래스를 사용하지 않고, 추상 베이스 클래스를 간단히 @code{ABC}에서 파생시켜서 만들 수 있습니다. 예를 들어:

@example
from abc import ABC

class MyABC(ABC):
    pass
@end example

@code{ABC} 의 형은 여전히 @ref{111a,,ABCMeta} 이므로, @code{ABC}를 상속할 때는 메타 클래스 사용에 관한 일반적인 주의가 필요한데, 다중 상속이 메타 클래스 충돌을 일으킬 수 있기 때문입니다. metaclass 키워드를 전달하고 @code{ABCMeta}를 직접 사용해서 추상 베이스 클래스를 정의할 수도 있습니다, 예를 들어:

@example
from abc import ABCMeta

class MyABC(metaclass=ABCMeta):
    pass
@end example


Added in version 3.4.

@end deffn

@geindex ABCMeta (abc 클래스)
@anchor{library/abc abc ABCMeta}@anchor{111a}
@deffn {클래스} abc.ABCMeta

추상 베이스 클래스 (ABC)를 정의하기 위한 메타 클래스.

이 메타 클래스를 사용하여 ABC를 만듭니다. ABC는 직접 서브 클래싱 될 수 있으며 믹스인 클래스의 역할을 합니다. 관련 없는 구상 클래스(심지어 내장 클래스도)와 관련 없는 ABC를 “가상 서브 클래스”로 등록 할 수 있습니다 – 이들과 이들의 서브 클래스는 내장 @ref{9c4,,issubclass()} 함수에 의해 등록하는 ABC의 서브 클래스로 간주합니다. 하지만 등록하는 ABC는 그들의 MRO (메서드 결정 순서)에 나타나지 않을 것이고, 등록하는 ABC가 정의한 메서드 구현도 호출할 수 없을 것입니다 (@ref{1a6,,super()}를 통해서도 가능하지 않습니다). @footnote{
C++ 프로그래머는 파이썬의 가상 베이스 클래스 개념이 C++과 다르다는 것을 알아야 합니다.
}

@code{ABCMeta}를 메타 클래스로 생성된 클래스는 다음과 같은 메서드를 가집니다:

@geindex register() (abc.ABCMeta 메서드)
@anchor{library/abc abc ABCMeta register}@anchor{128d}
@deffn {메서드} register (subclass)

이 ABC의 “가상 서브 클래스”로 `subclass' 를 등록합니다. 예를 들면:

@example
from abc import ABC

class MyABC(ABC):
    pass

MyABC.register(tuple)

assert issubclass(tuple, MyABC)
assert isinstance((), MyABC)
@end example


버전 3.3에서 변경: 클래스 데코레이터로 사용할 수 있도록, 등록된 subclass 돌려줍니다.



버전 3.4에서 변경: @code{register()} 호출을 감지하려면, @ref{1118,,get_cache_token()} 함수를 사용할 수 있습니다.

@end deffn

추상 베이스 클래스에서 다음 메서드를 재정의할 수도 있습니다:

@geindex __subclasshook__() (abc.ABCMeta 메서드)
@anchor{library/abc abc ABCMeta __subclasshook__}@anchor{29bd}
@deffn {메서드} __subclasshook__ (subclass)

(반드시 클래스 메서드로 정의되어야 합니다.)

`subclass' 를 이 ABC의 서브 클래스로 간주할지를 검사합니다. 이것은, ABC의 서브 클래스로 취급하고 싶은 클래스마다 @ref{128d,,register()}를 호출할 필요 없이, @ref{9c4,,issubclass()} 의 행동을 더 사용자 정의할 수 있음을 의미합니다. (이 클래스 메서드는 ABC의 @ref{23c7,,__subclasscheck__()} 메서드에서 호출됩니다.)

이 메서드는 @code{True}, @code{False} 또는 @ref{1a2,,NotImplemented} 를 반환해야 합니다. @code{True} 를 반환하면, `subclass' 를 이 ABC의 서브 클래스로 간주합니다. @code{False} 를 반환하면, `subclass' 를 ABC의 서브 클래스로 간주하지 않습니다. @code{NotImplemented} 를 반환하면, 서브 클래스 검사가 일반적인 메커니즘으로 계속됩니다.

@c XXX explain the "usual mechanism"
@end deffn

이러한 개념들의 시연으로, 이 예제 ABC 정의를 보십시오:

@example
class Foo:
    def __getitem__(self, index):
        ...
    def __len__(self):
        ...
    def get_iterator(self):
        return iter(self)

class MyIterable(ABC):

    @@abstractmethod
    def __iter__(self):
        while False:
            yield None

    def get_iterator(self):
        return self.__iter__()

    @@classmethod
    def __subclasshook__(cls, C):
        if cls is MyIterable:
            if any("__iter__" in B.__dict__ for B in C.__mro__):
                return True
        return NotImplemented

MyIterable.register(Foo)
@end example

ABC @code{MyIterable} 은 추상 메서드로 @ref{e68,,__iter__()} 라는 표준 이터러블 메서드를 정의합니다. 여기에 제공된 구현은 여전히 서브 클래스에서 호출 할 수 있습니다. @code{get_iterator()} 메서드 또한 @code{MyIterable} 추상 베이스 클래스의 일부이지만, 추상이 아닌 파생 클래스에서 재정의될 필요는 없습니다.

여기에 정의된 @ref{29bd,,__subclasshook__()} 클래스 메서드는 자신의 (또는 그것의 @ref{2374,,__mro__} 리스트를 통해 액세스 되는 베이스 클래스 중 하나의) @ref{77c,,__dict__} 에 @ref{e68,,__iter__()} 메서드를 가진 모든 클래스도 @code{MyIterable} 로 간주한다고 말합니다.

마지막으로, 마지막 줄은, @code{Foo} 가 @ref{e68,,__iter__()} 메서드를 정의하지는 않았음에도 불구하고 (이것은 @ref{1797,,__len__()} 과 @ref{588,,__getitem__()} 로 정의되는 이전 스타일의 이터러블 프로토콜을 사용합니다), @code{MyIterable} 의 가상 서브 클래스로 만듭니다. 이렇게 하면 @code{get_iterator} 가 @code{Foo} 의 메서드로 사용할 수 있지 않으므로, 별도로 제공됩니다.
@end deffn

@code{abc} 모듈은 다음 데코레이터도 제공합니다:

@geindex abstractmethod() (abc 모듈)
@anchor{library/abc abc abstractmethod}@anchor{128a}
@deffn {함수} @@abc.abstractmethod

추상 메서드를 나타내는 데코레이터.

이 데코레이터를 사용하려면 클래스의 메타 클래스가 @ref{111a,,ABCMeta} 이거나 여기에서 파생된 것이어야 합니다. @code{ABCMeta} 에서 파생된 메타 클래스를 가진 클래스는 모든 추상 메서드와 프로퍼티가 재정의되지 않는 한 인스턴스로 만들 수 없습니다. 추상 메서드는 일반적인 ‘super’ 호출 메커니즘을 사용하여 호출 할 수 있습니다. @code{abstractmethod()} 는 프로퍼티와 디스크립터에 대한 추상 메서드를 선언하는 데 사용될 수 있습니다.

클래스에 추상 메서드를 동적으로 추가하거나, 메서드나 클래스가 작성된 후에 추상화 상태를 수정하려고 시도하는 것은 @ref{4a0a,,update_abstractmethods()} 함수를 통해서만 지원됩니다. @code{abstractmethod()} 는 정규 상속을 사용하여 파생된 서브 클래스에만 영향을 줍니다; ABC의 @ref{128d,,register()} 메서드로 등록된 “가상 서브 클래스” 는 영향을 받지 않습니다.

@code{abstractmethod()} 가 다른 메서드 디스크립터와 함께 적용될 때, 다음 사용 예제와 같이 가장 안쪽의 데코레이터로 적용되어야 합니다:

@example
class C(ABC):
    @@abstractmethod
    def my_abstract_method(self, arg1):
        ...
    @@classmethod
    @@abstractmethod
    def my_abstract_classmethod(cls, arg2):
        ...
    @@staticmethod
    @@abstractmethod
    def my_abstract_staticmethod(arg3):
        ...

    @@property
    @@abstractmethod
    def my_abstract_property(self):
        ...
    @@my_abstract_property.setter
    @@abstractmethod
    def my_abstract_property(self, val):
        ...

    @@abstractmethod
    def _get_x(self):
        ...
    @@abstractmethod
    def _set_x(self, val):
        ...
    x = property(_get_x, _set_x)
@end example

추상 베이스 클래스 장치와 정확하게 상호 작용하기 위해서, 디스크립터는 @code{__isabstractmethod__} 를 사용하여 자신을 추상으로 식별해야 합니다. 일반적으로 이 어트리뷰트는 디스크립터를 구성하는 데 사용된 메서드 중 어느 하나라도 추상이면 @code{True} 여야 합니다. 예를 들어, 파이썬의 내장 @ref{4b3,,property}는 다음과 동등한 일을 합니다:

@example
class Descriptor:
    ...
    @@property
    def __isabstractmethod__(self):
        return any(getattr(f, '__isabstractmethod__', False) for
                   f in (self._fget, self._fset, self._fdel))
@end example

@cartouche
@quotation 참고 
자바 추상 메서드와 달리, 이 추상 메서드는 구현을 가질 수 있습니다. 이 구현은 그것을 재정의하는 클래스에서 @ref{1a6,,super()} 메커니즘을 통해 호출 할 수 있습니다. 이는 협업적 다중 상속을 사용하는 프레임워크에서 super-호출의 종점으로 유용 할 수 있습니다.
@end quotation
@end cartouche
@end deffn

@code{abc} 모듈은 다음 레거시 데코레이터도 지원합니다:

@geindex abstractclassmethod() (abc 모듈)
@anchor{library/abc abc abstractclassmethod}@anchor{128b}
@deffn {함수} @@abc.abstractclassmethod


Added in version 3.2.



버전 3.3부터 폐지됨: 이제 @ref{48f,,classmethod} 와 @ref{128a,,abstractmethod()} 를 함께 사용할 수 있어서, 이 데코레이터는 필요 없습니다.


내장 @ref{48f,,classmethod()} 의 서브 클래스로, 추상 classmethod를 나타냅니다. 그 외에는 @ref{128a,,abstractmethod()} 와 유사합니다.

@ref{48f,,classmethod()} 데코레이터가 이제 추상 메서드에 적용될 때 추상으로 정확하게 식별되기 때문에, 이 특별한 경우는 폐지되었습니다.:

@example
class C(ABC):
    @@classmethod
    @@abstractmethod
    def my_abstract_classmethod(cls, arg):
        ...
@end example
@end deffn

@geindex abstractstaticmethod() (abc 모듈)
@anchor{library/abc abc abstractstaticmethod}@anchor{128c}
@deffn {함수} @@abc.abstractstaticmethod


Added in version 3.2.



버전 3.3부터 폐지됨: 이제 @ref{453,,staticmethod} 와 @ref{128a,,abstractmethod()} 를 함께 사용할 수 있어서, 이 데코레이터는 필요 없습니다.


내장 @ref{453,,staticmethod()} 의 서브 클래스로, 추상 staticmethod를 나타냅니다. 그 외에는 @ref{128a,,abstractmethod()} 와 유사합니다.

@ref{453,,staticmethod()} 데코레이터가 이제 추상 메서드에 적용될 때 추상으로 정확하게 식별되기 때문에, 이 특별한 경우는 폐지되었습니다.:

@example
class C(ABC):
    @@staticmethod
    @@abstractmethod
    def my_abstract_staticmethod(arg):
        ...
@end example
@end deffn

@geindex abstractproperty() (abc 모듈)
@anchor{library/abc abc abstractproperty}@anchor{1289}
@deffn {함수} @@abc.abstractproperty


버전 3.3부터 폐지됨: 이제 @ref{4b3,,property}, @ref{19d9,,property.getter()}, @ref{19da,,property.setter()}, @ref{19db,,property.deleter()} 와 @ref{128a,,abstractmethod()} 를 함께 사용할 수 있어서, 이 데코레이터는 필요 없습니다.


내장 @ref{4b3,,property()} 의 서브 클래스로, 추상 property를 나타냅니다.

@ref{4b3,,property()} 데코레이터가 이제 추상 메서드에 적용될 때 추상으로 정확하게 식별되기 때문에, 이 특별한 경우는 폐지되었습니다.:

@example
class C(ABC):
    @@property
    @@abstractmethod
    def my_abstract_property(self):
        ...
@end example

위의 예제는 읽기 전용 프로퍼티를 정의합니다; 하나나 그 이상의 하부 메서드를 추상으로 적절하게 표시하여 읽기-쓰기 추상 프로퍼티를 정의할 수도 있습니다:

@example
class C(ABC):
    @@property
    def x(self):
        ...

    @@x.setter
    @@abstractmethod
    def x(self, val):
        ...
@end example

일부 구성 요소만 추상인 경우, 서브 클래스에서 구상 프로퍼티를 만들기 위해서는 해당 구성 요소만 갱신하면 됩니다:

@example
class D(C):
    @@C.x.setter
    def x(self, val):
        ...
@end example
@end deffn

@code{abc} 모듈은 또한 다음과 같은 기능을 제공합니다 :

@geindex get_cache_token() (abc 모듈)
@anchor{library/abc abc get_cache_token}@anchor{1118}
@deffn {함수} abc.get_cache_token ()

현재의 추상 베이스 클래스 캐시 토큰을 반환합니다.

토큰은 가상 서브 클래스를 위한 추상 베이스 클래스 캐시의 현재 버전을 식별하는 (동등성 검사를 지원하는) 불투명 객체입니다. 임의의 ABC에서 @ref{128d,,ABCMeta.register()} 가 호출될 때마다 토큰이 변경됩니다.


Added in version 3.4.

@end deffn

@geindex update_abstractmethods() (abc 모듈)
@anchor{library/abc abc update_abstractmethods}@anchor{4a0a}
@deffn {함수} 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.

클래스 데코레이터로 사용할 수 있도록, `cls'를 돌려줍니다.

If `cls' is not an instance of @ref{111a,,ABCMeta}, does nothing.

@cartouche
@quotation 참고 
This function assumes that `cls'’s superclasses are already updated.
It does not update any subclasses.
@end quotation
@end cartouche


Added in version 3.10.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node atexit — 종료 처리기,traceback — 스택 트레이스백 인쇄와 조회,abc — 추상 베이스 클래스,파이썬 실행시간 서비스
@anchor{library/atexit doc}@anchor{4a0b}@anchor{library/atexit atexit-exit-handlers}@anchor{4a0c}@anchor{library/atexit module-atexit}@anchor{d}@anchor{library/atexit translation-repo}@anchor{4a0d}
@subsection @code{atexit} — 종료 처리기


@geindex module; atexit


__________________________________________________________________


The @code{atexit} module defines functions to register and unregister cleanup
functions.  Functions thus registered are automatically executed upon normal
interpreter termination.  @code{atexit} runs these functions in the `reverse'
order in which they were registered; if you register @code{A}, @code{B}, and @code{C},
at interpreter termination time they will be run in the order @code{C}, @code{B},
@code{A}.

`참고:' 이 모듈을 통해 등록된 함수는 다음과 같은 경우 호출되지 않습니다. 프로그램이 파이썬이 처리하지 않는 시그널에 의해 종료될 때. 파이썬의 치명적인 내부 에러가 감지되었을 때. @ref{26ff,,os._exit()} 가 호출될 때.

`Note:' The effect of registering or unregistering functions from within
a cleanup function is undefined.


버전 3.7에서 변경: C-API 서브 인터프리터와 함께 사용될 때, 등록된 함수는 등록된 인터프리터에 국지적입니다.


@geindex register() (atexit 모듈)
@anchor{library/atexit atexit register}@anchor{a7e}
@deffn {함수} atexit.register (func, *args, **kwargs)

`func' 를 종료 시에 실행할 함수로 등록합니다. `func' 에 전달되어야 하는 선택적 인자는 @ref{a7e,,register()} 에 인자로 전달되어야 합니다. 같은 함수와 인자를 두 번 이상 등록 할 수 있습니다.

정상적인 프로그램 종료 시에 (예를 들어, @ref{277,,sys.exit()} 가 호출되거나 주 모듈의 실행이 완료된 경우에), 등록된 모든 함수는 후입선출 순서로 호출됩니다. 낮은 수준의 모듈은 일반적으로 상위 수준 모듈보다 먼저 임포트 되기 때문에 나중에 정리해야 한다는 가정입니다.

종료 처리기의 실행 중에 예외가 발생하면 (@ref{f3b,,SystemExit}가 발생하지 않는다면) 트레이스백이 인쇄되고 예외 정보가 저장됩니다. 모든 종료 처리기가 실행될 기회를 얻은 후에, 발생한 마지막 예외를 다시 일으킵니다.

이 함수는 `func' 을 반환하므로 데코레이터로 사용할 수 있습니다.

@cartouche
@quotation 경고 
Starting new threads or calling @ref{4b6,,os.fork()} from a registered
function can lead to race condition between the main Python
runtime thread freeing thread states while internal @ref{f3,,threading}
routines or the new process try to use that state. This can lead to
crashes rather than clean shutdown.
@end quotation
@end cartouche


버전 3.12에서 변경: Attempts to start a new thread or @ref{4b6,,os.fork()} a new process
in a registered function now leads to @ref{244,,RuntimeError}.

@end deffn

@geindex unregister() (atexit 모듈)
@anchor{library/atexit atexit unregister}@anchor{1786}
@deffn {함수} atexit.unregister (func)

Remove `func' from the list of functions to be run at interpreter shutdown.
@code{unregister()} silently does nothing if `func' was not previously
registered.  If `func' has been registered more than once, every occurrence
of that function in the @code{atexit} call stack will be removed.  Equality
comparisons (@code{==}) are used internally during unregistration, so function
references do not need to have matching identities.
@end deffn


@subsubheading 더 보기



@table @asis

@item 모듈 @ref{bf,,readline}

Useful example of @code{atexit} to read and write @ref{bf,,readline} history
files.
@end table


@menu
* atexit Example:: 

@end menu

@node atexit Example,,,atexit — 종료 처리기
@anchor{library/atexit atexit-example}@anchor{4a0e}@anchor{library/atexit id1}@anchor{4a0f}
@subsubsection @code{atexit} Example


다음의 간단한 예제는, 모듈이 임포트 될 때 파일에서 카운터를 읽고 프로그램이 종료할 때 프로그램의 명시적인 호출에 의존하지 않고 카운터의 변경된 값을 자동으로 저장하는 방법을 보여줍니다.:

@example
try:
    with open('counterfile') as infile:
        _count = int(infile.read())
except FileNotFoundError:
    _count = 0

def incrcounter(n):
    global _count
    _count = _count + n

def savecounter():
    with open('counterfile', 'w') as outfile:
        outfile.write('%d' % _count)

import atexit

atexit.register(savecounter)
@end example

위치 및 키워드 인자가 등록된 함수가 호출될 때 전달되도록 @ref{a7e,,register()} 에 전달할 수 있습니다:

@example
def goodbye(name, adjective):
    print('Goodbye %s, it was %s to meet you.' % (name, adjective))

import atexit

atexit.register(goodbye, 'Donny', 'nice')
# or:
atexit.register(goodbye, adjective='nice', name='Donny')
@end example

@ref{939,,데코레이터} 로 사용하기:

@example
import atexit

@@atexit.register
def goodbye():
    print('You are now leaving the Python sector.')
@end example

이 방법은 인자 없이 호출할 수 있는 함수에서만 작동합니다.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node traceback — 스택 트레이스백 인쇄와 조회,__future__ — 퓨처 문 정의,atexit — 종료 처리기,파이썬 실행시간 서비스
@anchor{library/traceback doc}@anchor{4a10}@anchor{library/traceback module-traceback}@anchor{104}@anchor{library/traceback traceback-print-or-retrieve-a-stack-traceback}@anchor{4a11}@anchor{library/traceback translation-repo}@anchor{4a12}
@subsection @code{traceback} — 스택 트레이스백 인쇄와 조회


@geindex module; traceback

`소스 코드:' Lib/traceback.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/traceback.py}


__________________________________________________________________


This module provides a standard interface to extract, format and print
stack traces of Python programs. It is more flexible than the
interpreter’s default traceback display, and therefore makes it
possible to configure certain aspects of the output. Finally,
it contains a utility for capturing enough information about an
exception to print it later, without the need to save a reference
to the actual exception. Since exceptions can be the roots of large
objects graph, this utility can significantly improve
memory management.

@geindex 객체;트레이스백

The module uses @ref{cea,,traceback objects} — these are
objects of type @ref{ce9,,types.TracebackType},
which are assigned to the @ref{14cb,,__traceback__} field of
@ref{7d6,,BaseException} instances.


@subsubheading 더 보기



@table @asis

@item 모듈 @ref{5c,,faulthandler}

Used to dump Python tracebacks explicitly, on a fault, after a timeout, or on a user signal.

@item 모듈 @ref{aa,,pdb}

Interactive source code debugger for Python programs.
@end table


The module’s API can be divided into two parts:


@itemize *

@item 
Module-level functions offering basic functionality, which are useful for interactive
inspection of exceptions and tracebacks.

@item 
@ref{561,,TracebackException} class and its helper classes
@ref{1082,,StackSummary} and @ref{1083,,FrameSummary}. These offer both more
flexibility in the output generated and the ability to store the information
necessary for later formatting without holding references to actual exception
and traceback objects.
@end itemize


Added in version 3.13: Output is colorized by default and can be
@ref{1b7,,controlled using environment variables}.


@menu
* 모듈 수준 함수: 모듈 수준 함수<2>. 
* TracebackException 객체:: 
* StackSummary 객체:: 
* FrameSummary 객체:: 
* Examples of Using the Module-Level Functions:: 
* TracebackException을 사용하는 예제:: 

@end menu

@node 모듈 수준 함수<2>,TracebackException 객체,,traceback — 스택 트레이스백 인쇄와 조회
@anchor{library/traceback module-level-functions}@anchor{4a13}
@subsubsection 모듈 수준 함수


@geindex print_tb() (traceback 모듈)
@anchor{library/traceback traceback print_tb}@anchor{1084}
@deffn {함수} traceback.print_tb (tb, limit=None, file=None)

`limit'가 양수면 (호출자 프레임에서 시작하여) @ref{cea,,트레이스백 객체} `tb'의 최대 `limit' 개의 스택 트레이스 항목을 인쇄합니다. 그렇지 않으면, 마지막 @code{abs(limit)} 항목을 인쇄합니다. `limit'가 생략되거나 @code{None}이면, 모든 항목이 인쇄됩니다. `file'이 생략되거나 @code{None}이면, 출력은 @ref{b33,,sys.stderr}로 갑니다; 그렇지 않으면 출력을 받을 열린 @ref{13c8,,파일}이나 @ref{17b3,,파일류 객체}여야 합니다.

@cartouche
@quotation 참고 
The meaning of the `limit' parameter is different than the meaning
of @ref{1945,,sys.tracebacklimit}. A negative `limit' value corresponds to
a positive value of @code{sys.tracebacklimit}, whereas the behaviour of
a positive `limit' value cannot be achieved with
@code{sys.tracebacklimit}.
@end quotation
@end cartouche


버전 3.5에서 변경: 음수 `limit' 지원을 추가했습니다.

@end deffn

@geindex print_exception() (traceback 모듈)
@anchor{library/traceback traceback print_exception}@anchor{a4f}
@deffn {함수} traceback.print_exception (exc, /[, value, tb], limit=None, file=None, chain=True)

예외 정보와 @ref{cea,,트레이스백 객체} `tb'의 스택 트레이스 항목을 `file'로 인쇄합니다. 이것은 다음과 같은 점에서 @ref{1084,,print_tb()}와 다릅니다:


@itemize *

@item 
`tb'가 @code{None}이 아니면, 헤더 @code{Traceback (most recent call last):}를 인쇄합니다.

@item 
스택 트레이스 다음에 예외 형과 `value'를 인쇄합니다
@end itemize

@geindex ^ (캐럿);마커


@itemize *

@item 
`type(value)'가 @ref{18e,,SyntaxError}고 `value'가 적절한 형식을 가지면, 에러의 대략적인 위치를 나타내는 캐럿(caret)과 함께 문법 에러가 발생한 줄을 인쇄합니다.
@end itemize

Since Python 3.10, instead of passing `value' and `tb', an exception object
can be passed as the first argument. If `value' and `tb' are provided, the
first argument is ignored in order to provide backwards compatibility.

선택적 `limit' 인자는 @ref{1084,,print_tb()}와 같은 의미입니다. `chain'이 참(기본값)이면, 처리되지 않은 예외를 인쇄할 때 인터프리터 자체가 하는 것과 마찬가지로, 연결된 예외(예외의 @ref{14cd,,__cause__}나 @ref{14cc,,__context__} 어트리뷰트)도 인쇄됩니다.


버전 3.5에서 변경: `etype' 인자는 무시되고 `value' 형에서 유추됩니다.



버전 3.10에서 변경: The `etype' parameter has been renamed to `exc' and is now
positional-only.

@end deffn

@geindex print_exc() (traceback 모듈)
@anchor{library/traceback traceback print_exc}@anchor{1c22}
@deffn {함수} traceback.print_exc (limit=None, file=None, chain=True)

이것은 @code{print_exception(sys.exception(), limit=limit, file=file, chain=chain)}의 줄임 표현입니다.
@end deffn

@geindex print_last() (traceback 모듈)
@anchor{library/traceback traceback print_last}@anchor{4a14}
@deffn {함수} traceback.print_last (limit=None, file=None, chain=True)

이것은 @code{print_exception(sys.last_exc, limit=limit, file=file, chain=chain)}의 줄임 표현입니다. 일반적으로 예외가 대화식 프롬프트에 도달한 후에만 작동합니다 (@ref{6e4,,sys.last_exc}을 참조하십시오).
@end deffn

@geindex print_stack() (traceback 모듈)
@anchor{library/traceback traceback print_stack}@anchor{1085}
@deffn {함수} traceback.print_stack (f=None, limit=None, file=None)

`limit'가 양수면 (호출 지점에서 시작하여) 최대 `limit' 개의 스택 트레이스 항목을 인쇄합니다. 그렇지 않으면, 마지막 @code{abs(limit)} 항목을 인쇄합니다. `limit'가 생략되거나 @code{None}이면, 모든 항목이 인쇄됩니다. 선택적 `f' 인자를 사용하여 시작할 대체 @ref{8ee,,스택 프레임}을 지정할 수 있습니다. 선택적 `file' 인자는 @ref{1084,,print_tb()}와 같은 의미입니다.


버전 3.5에서 변경: 음수 `limit' 지원을 추가했습니다.

@end deffn

@geindex extract_tb() (traceback 모듈)
@anchor{library/traceback traceback extract_tb}@anchor{4a15}
@deffn {함수} traceback.extract_tb (tb, limit=None)

@ref{cea,,트레이스백 객체} `tb'에서 추출된 “전 처리된” 스택 트레이스 항목의 리스트를 나타내는 @ref{1082,,StackSummary} 객체를 반환합니다. 스택 트레이스의 대체 포매팅으로 유용합니다. 선택적 `limit' 인자는 @ref{1084,,print_tb()}와 같은 의미입니다. “전 처리된” 스택 트레이스 항목은 일반적으로 스택 트레이스를 위해 인쇄되는 정보를 나타내는 어트리뷰트 @ref{4a16,,filename}, @ref{4a17,,lineno}, @ref{4a18,,name} 및 @ref{4a19,,line}을 포함하는 @ref{1083,,FrameSummary} 객체입니다.
@end deffn

@geindex extract_stack() (traceback 모듈)
@anchor{library/traceback traceback extract_stack}@anchor{4a1a}
@deffn {함수} traceback.extract_stack (f=None, limit=None)

현재 @ref{8ee,,스택 프레임}에서 날 트레이스백을 추출합니다. 반환 값은 @ref{4a15,,extract_tb()}와 같은 형식입니다. 선택적 `f'와 `limit' 인자는 @ref{1085,,print_stack()}과 같은 의미입니다.
@end deffn

@geindex print_list() (traceback 모듈)
@anchor{library/traceback traceback print_list}@anchor{18f0}
@deffn {함수} traceback.print_list (extracted_list, file=None)

Print the list of tuples as returned by @ref{4a15,,extract_tb()} or
@ref{4a1a,,extract_stack()} as a formatted stack trace to the given file.
If `file' is @code{None}, the output is written to @ref{b33,,sys.stderr}.
@end deffn

@geindex format_list() (traceback 모듈)
@anchor{library/traceback traceback format_list}@anchor{4a1b}
@deffn {함수} traceback.format_list (extracted_list)

@ref{4a15,,extract_tb()}나 @ref{4a1a,,extract_stack()}이 반환한 튜플이나 @ref{1083,,FrameSummary} 객체의 리스트가 제공되면, 인쇄할 준비가 된 문자열의 리스트를 반환합니다. 결과 리스트의 각 문자열은 인자 리스트에서 같은 인덱스를 가진 항목에 해당합니다. 각 문자열은 줄 바꿈으로 끝납니다; 소스 텍스트 줄이 @code{None}이 아닌 항목의 경우, 문자열에 내부 줄 바꿈도 포함될 수 있습니다.
@end deffn

@geindex format_exception_only() (traceback 모듈)
@anchor{library/traceback traceback format_exception_only}@anchor{a4e}
@deffn {함수} traceback.format_exception_only (exc, /[, value], *, show_group=False)

트레이스백의 예외 부분을 @ref{6e6,,sys.last_value}로 주어진 것과 같은 예외 값을 사용하여 포맷합니다. 반환 값은 각각 줄 바꿈으로 끝나는 문자열의 리스트입니다. 리스트는 예외 메시지를 포함하는데, 일반적으로 단일 문자열입니다; 그러나, @ref{18e,,SyntaxError} 예외의 경우, 문법 에러가 발생한 위치에 대한 자세한 정보를 (인쇄될 때) 표시하는 여러 줄을 포함합니다. 어떤 예외가 발생했는지를 나타내는 메시지는 리스트에서 항상 마지막 문자열입니다. 메시지 다음으로, 리스트는 예외의 @ref{26ea,,notes}를 포함합니다.

Since Python 3.10, instead of passing `value', an exception object
can be passed as the first argument.  If `value' is provided, the first
argument is ignored in order to provide backwards compatibility.

When `show_group' is @code{True}, and the exception is an instance of
@ref{564,,BaseExceptionGroup}, the nested exceptions are included as
well, recursively, with indentation relative to their nesting depth.


버전 3.10에서 변경: The `etype' parameter has been renamed to `exc' and is now
positional-only.



버전 3.11에서 변경: The returned list now includes any
@ref{26ea,,notes} attached to the exception.



버전 3.13에서 변경: `show_group' parameter was added.

@end deffn

@geindex format_exception() (traceback 모듈)
@anchor{library/traceback traceback format_exception}@anchor{a4d}
@deffn {함수} traceback.format_exception (exc, /[, value, tb], limit=None, chain=True)

스택 트레이스와 예외 정보를 포맷합니다. 인자는 @ref{a4f,,print_exception()}의 해당하는 인자와 같은 의미입니다. 반환 값은 각각 줄 바꿈으로 끝나고 일부는 내부 줄 바꿈을 포함하는 문자열의 리스트입니다. 이 줄들을 이어붙여서 인쇄하면, @code{print_exception()}과 정확히 같은 텍스트가 인쇄됩니다.


버전 3.5에서 변경: `etype' 인자는 무시되고 `value' 형에서 유추됩니다.



버전 3.10에서 변경: This function’s behavior and signature were modified to match
@ref{a4f,,print_exception()}.

@end deffn

@geindex format_exc() (traceback 모듈)
@anchor{library/traceback traceback format_exc}@anchor{4a1c}
@deffn {함수} traceback.format_exc (limit=None, chain=True)

이것은 @code{print_exc(limit)}와 비슷하지만, 파일로 인쇄하는 대신 문자열을 반환합니다.
@end deffn

@geindex format_tb() (traceback 모듈)
@anchor{library/traceback traceback format_tb}@anchor{48e0}
@deffn {함수} traceback.format_tb (tb, limit=None)

@code{format_list(extract_tb(tb, limit))}의 줄임 표현입니다.
@end deffn

@geindex format_stack() (traceback 모듈)
@anchor{library/traceback traceback format_stack}@anchor{4a1d}
@deffn {함수} traceback.format_stack (f=None, limit=None)

@code{format_list(extract_stack(f, limit))}의 줄임 표현입니다.
@end deffn

@geindex clear_frames() (traceback 모듈)
@anchor{library/traceback traceback clear_frames}@anchor{11d3}
@deffn {함수} traceback.clear_frames (tb)

각 @ref{8ee,,프레임 객체}의 @ref{584,,clear()} 메서드를 호출하여 @ref{cea,,트레이스백} `tb'에 있는 모든 스택 프레임의 지역 변수를 지웁니다.


Added in version 3.4.

@end deffn

@geindex walk_stack() (traceback 모듈)
@anchor{library/traceback traceback walk_stack}@anchor{1080}
@deffn {함수} traceback.walk_stack (f)

주어진 프레임에서 @ref{98e,,f.f_back}을 따라 스택을 걸어가며 각 프레임의 프레임과 줄 번호를 산출(yield)합니다. `f'가 @code{None}이면, 현재 스택이 사용됩니다. 이 도우미는 @ref{4a1e,,StackSummary.extract()}와 함께 사용됩니다.


Added in version 3.5.



버전 3.14에서 변경: This function previously returned a generator that would walk the stack
when first iterated over. The generator returned now is the state of the
stack when @code{walk_stack} is called.

@end deffn

@geindex walk_tb() (traceback 모듈)
@anchor{library/traceback traceback walk_tb}@anchor{1081}
@deffn {함수} traceback.walk_tb (tb)

@ref{ceb,,tb_next}를 따라 트레이스백을 걸으면서 각 프레임의 프레임과 줄 번호를 산출(yield)합니다. 이 도우미는 @ref{4a1e,,StackSummary.extract()}와 함께 사용됩니다.


Added in version 3.5.

@end deffn

@node TracebackException 객체,StackSummary 객체,모듈 수준 함수<2>,traceback — 스택 트레이스백 인쇄와 조회
@anchor{library/traceback tracebackexception-objects}@anchor{4a1f}
@subsubsection @code{TracebackException} 객체



Added in version 3.5.


@code{TracebackException} objects are created from actual exceptions to
capture data for later printing.  They offer a more lightweight method of
storing this information by avoiding holding references to
@ref{cea,,traceback} and @ref{8ee,,frame} objects.
In addition, they expose more options to configure the output compared to
the module-level functions described above.

@geindex TracebackException (traceback 클래스)
@anchor{library/traceback traceback TracebackException}@anchor{561}
@deffn {클래스} traceback.TracebackException (exc_type, exc_value, exc_traceback, *, limit=None, lookup_lines=True, capture_locals=False, compact=False, max_group_width=15, max_group_depth=10)

나중에 렌더링하기 위해 예외를 포착합니다. `limit', `lookup_lines' 및 `capture_locals'의 의미는 @ref{1082,,StackSummary} 클래스와 같습니다.

If `compact' is true, only data that is required by
@code{TracebackException}’s @ref{199,,format()} method
is saved in the class attributes. In particular, the
@ref{4a20,,__context__} field is calculated only if @ref{4a21,,__cause__} is
@code{None} and @ref{4a22,,__suppress_context__} is false.

locals가 포착되면, 트레이스백에도 표시됨에 유의하십시오.

`max_group_width' and `max_group_depth' control the formatting of exception
groups (see @ref{564,,BaseExceptionGroup}). The depth refers to the nesting
level of the group, and the width refers to the size of a single exception
group’s exceptions array. The formatted output is truncated when either
limit is exceeded.


버전 3.10에서 변경: Added the `compact' parameter.



버전 3.11에서 변경: Added the `max_group_width' and `max_group_depth' parameters.


@geindex __cause__ (traceback.TracebackException의 속성)
@anchor{library/traceback traceback TracebackException __cause__}@anchor{4a21}
@deffn {속성} __cause__

원래 @ref{14cd,,__cause__}의 @code{TracebackException}.
@end deffn

@geindex __context__ (traceback.TracebackException의 속성)
@anchor{library/traceback traceback TracebackException __context__}@anchor{4a20}
@deffn {속성} __context__

원래 @ref{14cc,,__context__}의 @code{TracebackException}.
@end deffn

@geindex exceptions (traceback.TracebackException의 속성)
@anchor{library/traceback traceback TracebackException exceptions}@anchor{4a23}
@deffn {속성} exceptions

If @code{self} represents an @ref{4d3,,ExceptionGroup}, this field holds a list of
@code{TracebackException} instances representing the nested exceptions.
Otherwise it is @code{None}.


Added in version 3.11.

@end deffn

@geindex __suppress_context__ (traceback.TracebackException의 속성)
@anchor{library/traceback traceback TracebackException __suppress_context__}@anchor{4a22}
@deffn {속성} __suppress_context__

원래 예외의 @ref{2514,,__suppress_context__} 값.
@end deffn

@geindex __notes__ (traceback.TracebackException의 속성)
@anchor{library/traceback traceback TracebackException __notes__}@anchor{4a24}
@deffn {속성} __notes__

The @ref{26ea,,__notes__} value from the original exception,
or @code{None}
if the exception does not have any notes. If it is not @code{None}
is it formatted in the traceback after the exception string.


Added in version 3.11.

@end deffn

@geindex stack (traceback.TracebackException의 속성)
@anchor{library/traceback traceback TracebackException stack}@anchor{4a25}
@deffn {속성} stack

트레이스백을 나타내는 @ref{1082,,StackSummary}.
@end deffn

@geindex exc_type (traceback.TracebackException의 속성)
@anchor{library/traceback traceback TracebackException exc_type}@anchor{563}
@deffn {속성} exc_type

원래 트레이스백의 클래스.


버전 3.13부터 폐지됨.

@end deffn

@geindex exc_type_str (traceback.TracebackException의 속성)
@anchor{library/traceback traceback TracebackException exc_type_str}@anchor{562}
@deffn {속성} exc_type_str

원래 예외 클래스의 문자열 표시.


Added in version 3.13.

@end deffn

@geindex filename (traceback.TracebackException의 속성)
@anchor{library/traceback traceback TracebackException filename}@anchor{4a26}
@deffn {속성} filename

문법 에러일 때 - 에러가 발생한 파일 이름.
@end deffn

@geindex lineno (traceback.TracebackException의 속성)
@anchor{library/traceback traceback TracebackException lineno}@anchor{4a27}
@deffn {속성} lineno

문법 에러일 때 - 에러가 발생한 줄 번호.
@end deffn

@geindex end_lineno (traceback.TracebackException의 속성)
@anchor{library/traceback traceback TracebackException end_lineno}@anchor{4a28}
@deffn {속성} end_lineno

문법 에러일 때 - 에러가 발생한 끝 줄 번호. 존재하지 않으면 @code{None}일 수 있습니다.


Added in version 3.10.

@end deffn

@geindex text (traceback.TracebackException의 속성)
@anchor{library/traceback traceback TracebackException text}@anchor{4a29}
@deffn {속성} text

문법 에러일 때 - 에러가 발생한 텍스트.
@end deffn

@geindex offset (traceback.TracebackException의 속성)
@anchor{library/traceback traceback TracebackException offset}@anchor{4a2a}
@deffn {속성} offset

문법 에러일 때 - 에러가 발생한 텍스트에서의 오프셋.
@end deffn

@geindex end_offset (traceback.TracebackException의 속성)
@anchor{library/traceback traceback TracebackException end_offset}@anchor{4a2b}
@deffn {속성} end_offset

문법 에러일 때 - 에러가 발생한 텍스트에서의 끝 오프셋. 존재하지 않으면 @code{None}일 수 있습니다.


Added in version 3.10.

@end deffn

@geindex msg (traceback.TracebackException의 속성)
@anchor{library/traceback traceback TracebackException msg}@anchor{4a2c}
@deffn {속성} msg

문법 에러일 때 - 컴파일러 에러 메시지.
@end deffn

@geindex from_exception() (traceback.TracebackException의 클래스 메서드)
@anchor{library/traceback traceback TracebackException from_exception}@anchor{4a2d}
@deffn {메서드} classmethod from_exception (exc, *, limit=None, lookup_lines=True, capture_locals=False)

나중에 렌더링하기 위해 예외를 포착합니다. `limit', `lookup_lines' 및 `capture_locals'는 @ref{1082,,StackSummary} 클래스와 같습니다.

locals가 포착되면, 트레이스백에도 표시됨에 유의하십시오.
@end deffn

@geindex print() (traceback.TracebackException 메서드)
@anchor{library/traceback traceback TracebackException print}@anchor{8b2}
@deffn {메서드} print (*, file=None, chain=True)

Print to `file' (default @code{sys.stderr}) the exception information returned by
@ref{199,,format()}.


Added in version 3.11.

@end deffn

@geindex format() (traceback.TracebackException 메서드)
@anchor{library/traceback traceback TracebackException format}@anchor{4a2e}
@deffn {메서드} format (*, chain=True)

예외를 포맷합니다.

`chain'이 @code{True}가 아니면, @ref{4a21,,__cause__}와 @ref{4a20,,__context__}는 포맷되지 않습니다.

반환 값은 각각 줄 바꿈으로 끝나고 일부는 내부 줄 바꿈을 포함하는 문자열의 제너레이터입니다. @ref{a4f,,print_exception()}은 단지 파일에 줄을 인쇄하는 이 메서드를 둘러싸는 래퍼입니다.
@end deffn

@geindex format_exception_only() (traceback.TracebackException 메서드)
@anchor{library/traceback traceback TracebackException format_exception_only}@anchor{565}
@deffn {메서드} format_exception_only (*, show_group=False)

트레이스백의 예외 부분을 포맷합니다.

반환 값은 각각 줄 바꿈으로 끝나는 문자열의 제너레이터입니다.

`show_group'이 @code{False}일 때, 제너레이터는 예외 메시지와 (노트가 있다면) 그 뒤를 따르는 노트를 방출합니다. 예외 메시지는 일반적으로 단일 문자열입니다; 그러나 @ref{18e,,SyntaxError} 예외의 경우, 문법 에러가 발생한 위치에 대한 자세한 정보를 (인쇄할 때) 표시하는 여러 줄로 구성됩니다.

When `show_group' is @code{True}, and the exception is an instance of
@ref{564,,BaseExceptionGroup}, the nested exceptions are included as
well, recursively, with indentation relative to their nesting depth.


버전 3.11에서 변경: The exception’s @ref{26ea,,notes} are now
included in the output.



버전 3.13에서 변경: Added the `show_group' parameter.

@end deffn
@end deffn

@node StackSummary 객체,FrameSummary 객체,TracebackException 객체,traceback — 스택 트레이스백 인쇄와 조회
@anchor{library/traceback stacksummary-objects}@anchor{4a2f}
@subsubsection @code{StackSummary} 객체



Added in version 3.5.


@code{StackSummary} 객체는 포맷 준비가 된 호출 스택을 나타냅니다.

@geindex StackSummary (traceback 클래스)
@anchor{library/traceback traceback StackSummary}@anchor{1082}
@deffn {클래스} traceback.StackSummary

@geindex extract() (traceback.StackSummary의 클래스 메서드)
@anchor{library/traceback traceback StackSummary extract}@anchor{4a1e}
@deffn {메서드} classmethod extract (frame_gen, *, limit=None, lookup_lines=True, capture_locals=False)

(@ref{1080,,walk_stack()}이나 @ref{1081,,walk_tb()}에서 반환된 것과 같은) 프레임 제너레이터로 @code{StackSummary} 객체를 생성합니다.

`limit'가 제공되면, `frame_gen'에서 이 수 만큼의 프레임만 취합니다. `lookup_lines'가 @code{False}이면, 반환된 @ref{1083,,FrameSummary} 객체는 아직 해당 줄을 읽지 않아서 @code{StackSummary}를 만드는 비용을 줄입니다 (실제로 포맷되지 않을 수 있다면 유용 할 수 있습니다). `capture_locals'가 @code{True}이면, 각 @code{FrameSummary}의 지역 변수는 객체 표현(representation)으로 포착됩니다.


버전 3.12에서 변경: Exceptions raised from @ref{1c1,,repr()} on a local variable (when
`capture_locals' is @code{True}) are no longer propagated to the caller.

@end deffn

@geindex from_list() (traceback.StackSummary의 클래스 메서드)
@anchor{library/traceback traceback StackSummary from_list}@anchor{4a30}
@deffn {메서드} classmethod from_list (a_list)

제공된 @ref{1083,,FrameSummary} 객체의 리스트나 이전 스타일의 튜플 리스트로 @code{StackSummary} 객체를 생성합니다. 각 튜플은 `filename', `lineno', `name', `line'을 요소로 하는 4-튜플이어야 합니다.
@end deffn

@geindex format() (traceback.StackSummary 메서드)
@anchor{library/traceback traceback StackSummary format}@anchor{4a31}
@deffn {메서드} format ()

인쇄 준비가 된 문자열의 리스트를 반환합니다. 결과 리스트의 각 문자열은 스택의 단일 @ref{8ee,,프레임}에 해당합니다. 각 문자열은 줄 바꿈으로 끝납니다; 소스 텍스트 줄이 있는 항목의 경우, 문자열에 내부 줄 바꿈도 포함될 수 있습니다.

같은 프레임과 줄의 긴 시퀀스의 경우, 처음 몇 번의 반복이 표시된 다음, 정확한 추가의 반복 횟수를 나타내는 요약 줄이 표시됩니다.


버전 3.6에서 변경: 반복되는 프레임의 긴 시퀀스가 이제 축약됩니다.

@end deffn

@geindex format_frame_summary() (traceback.StackSummary 메서드)
@anchor{library/traceback traceback StackSummary format_frame_summary}@anchor{8b1}
@deffn {메서드} format_frame_summary (frame_summary)

Returns a string for printing one of the @ref{8ee,,frames}
involved in the stack.
This method is called for each @ref{1083,,FrameSummary} object to be
printed by @ref{4a31,,StackSummary.format()}. If it returns @code{None}, the
frame is omitted from the output.


Added in version 3.11.

@end deffn
@end deffn

@node FrameSummary 객체,Examples of Using the Module-Level Functions,StackSummary 객체,traceback — 스택 트레이스백 인쇄와 조회
@anchor{library/traceback framesummary-objects}@anchor{4a32}
@subsubsection @code{FrameSummary} 객체



Added in version 3.5.


@code{FrameSummary} 객체는 @ref{cea,,트레이스백}에서 단일 @ref{8ee,,프레임}을 나타냅니다.

@geindex FrameSummary (traceback 클래스)
@anchor{library/traceback traceback FrameSummary}@anchor{1083}
@deffn {클래스} traceback.FrameSummary (filename, lineno, name, *, lookup_line=True, locals=None, line=None, end_lineno=None, colno=None, end_colno=None)

포맷되거나 인쇄 중인 @ref{cea,,트레이스백}이나 스택의 단일 @ref{8ee,,프레임}을 나타냅니다. 선택적으로 문자열로 변환된 버전의 프레임 지역 변수를 포함할 수 있습니다. `lookup_line'이 @code{False}이면, @code{FrameSummary}의 @ref{4a19,,line} 어트리뷰트에 액세스할 때까지 (@ref{610,,tuple}로 캐스트 할 때도 발생합니다) 소스 코드를 찾지 않습니다. @code{line}은 직접 제공될 수 있으며, 줄 조회가 전혀 발생하지 않도록 합니다. `locals'는 선택적 지역 변수 매핑이며, 제공되면 변수 표현(representation)은 나중에 표시할 수 있도록 요약에 저장됩니다.

@code{FrameSummary} instances have the following attributes:

@geindex filename (traceback.FrameSummary의 속성)
@anchor{library/traceback traceback FrameSummary filename}@anchor{4a16}
@deffn {속성} filename

The filename of the source code for this frame. Equivalent to accessing
@ref{1572,,f.f_code.co_filename} on a
@ref{8ee,,frame object} `f'.
@end deffn

@geindex lineno (traceback.FrameSummary의 속성)
@anchor{library/traceback traceback FrameSummary lineno}@anchor{4a17}
@deffn {속성} lineno

The line number of the source code for this frame.
@end deffn

@geindex name (traceback.FrameSummary의 속성)
@anchor{library/traceback traceback FrameSummary name}@anchor{4a18}
@deffn {속성} name

Equivalent to accessing @ref{2385,,f.f_code.co_name} on
a @ref{8ee,,frame object} `f'.
@end deffn

@geindex line (traceback.FrameSummary의 속성)
@anchor{library/traceback traceback FrameSummary line}@anchor{4a19}
@deffn {속성} line

A string representing the source code for this frame, with leading and
trailing whitespace stripped.
If the source is not available, it is @code{None}.
@end deffn

@geindex end_lineno (traceback.FrameSummary의 속성)
@anchor{library/traceback traceback FrameSummary end_lineno}@anchor{4a33}
@deffn {속성} end_lineno

The last line number of the source code for this frame.
By default, it is set to @code{lineno} and indexation starts from 1.


버전 3.13에서 변경: The default value changed from @code{None} to @code{lineno}.

@end deffn

@geindex colno (traceback.FrameSummary의 속성)
@anchor{library/traceback traceback FrameSummary colno}@anchor{4a34}
@deffn {속성} colno

The column number of the source code for this frame.
By default, it is @code{None} and indexation starts from 0.
@end deffn

@geindex end_colno (traceback.FrameSummary의 속성)
@anchor{library/traceback traceback FrameSummary end_colno}@anchor{4a35}
@deffn {속성} end_colno

The last column number of the source code for this frame.
By default, it is @code{None} and indexation starts from 0.
@end deffn
@end deffn

@node Examples of Using the Module-Level Functions,TracebackException을 사용하는 예제,FrameSummary 객체,traceback — 스택 트레이스백 인쇄와 조회
@anchor{library/traceback examples-of-using-the-module-level-functions}@anchor{4a36}@anchor{library/traceback traceback-example}@anchor{4a37}
@subsubsection Examples of Using the Module-Level Functions


이 간단한 예제는 표준 파이썬 대화식 인터프리터 루프와 비슷하지만 (하지만 덜 유용한) 기본적인 읽기-평가-인쇄 루프를 구현합니다. 인터프리터 루프의 더욱 완전한 구현은 @ref{1b,,code} 모듈을 참조하십시오.

@example
import sys, traceback

def run_user_code(envdir):
    source = input(">>> ")
    try:
        exec(source, envdir)
    except Exception:
        print("Exception in user code:")
        print("-"*60)
        traceback.print_exc(file=sys.stdout)
        print("-"*60)

envdir = @{@}
while True:
    run_user_code(envdir)
@end example

다음 예제는 예외와 추적을 인쇄하고 포맷하는 다양한 방법을 보여줍니다:

@example
import sys, traceback

def lumberjack():
    bright_side_of_life()

def bright_side_of_life():
    return tuple()[0]

try:
    lumberjack()
except IndexError as exc:
    print("*** print_tb:")
    traceback.print_tb(exc.__traceback__, limit=1, file=sys.stdout)
    print("*** print_exception:")
    traceback.print_exception(exc, limit=2, file=sys.stdout)
    print("*** print_exc:")
    traceback.print_exc(limit=2, file=sys.stdout)
    print("*** format_exc, first and last line:")
    formatted_lines = traceback.format_exc().splitlines()
    print(formatted_lines[0])
    print(formatted_lines[-1])
    print("*** format_exception:")
    print(repr(traceback.format_exception(exc)))
    print("*** extract_tb:")
    print(repr(traceback.extract_tb(exc.__traceback__)))
    print("*** format_tb:")
    print(repr(traceback.format_tb(exc.__traceback__)))
    print("*** tb_lineno:", exc.__traceback__.tb_lineno)
@end example

예제의 출력은 다음과 유사합니다:

@example
*** print_tb:
  File "<doctest...>", line 10, in <module>
    lumberjack()
    ~~~~~~~~~~^^
*** print_exception:
Traceback (most recent call last):
  File "<doctest...>", line 10, in <module>
    lumberjack()
    ~~~~~~~~~~^^
  File "<doctest...>", line 4, in lumberjack
    bright_side_of_life()
    ~~~~~~~~~~~~~~~~~~~^^
IndexError: tuple index out of range
*** print_exc:
Traceback (most recent call last):
  File "<doctest...>", line 10, in <module>
    lumberjack()
    ~~~~~~~~~~^^
  File "<doctest...>", line 4, in lumberjack
    bright_side_of_life()
    ~~~~~~~~~~~~~~~~~~~^^
IndexError: tuple index out of range
*** format_exc, first and last line:
Traceback (most recent call last):
IndexError: tuple index out of range
*** format_exception:
['Traceback (most recent call last):\n',
 '  File "<doctest default[0]>", line 10, in <module>\n    lumberjack()\n    ~~~~~~~~~~^^\n',
 '  File "<doctest default[0]>", line 4, in lumberjack\n    bright_side_of_life()\n    ~~~~~~~~~~~~~~~~~~~^^\n',
 '  File "<doctest default[0]>", line 7, in bright_side_of_life\n    return tuple()[0]\n           ~~~~~~~^^^\n',
 'IndexError: tuple index out of range\n']
*** extract_tb:
[<FrameSummary file <doctest...>, line 10 in <module>>,
 <FrameSummary file <doctest...>, line 4 in lumberjack>,
 <FrameSummary file <doctest...>, line 7 in bright_side_of_life>]
*** format_tb:
['  File "<doctest default[0]>", line 10, in <module>\n    lumberjack()\n    ~~~~~~~~~~^^\n',
 '  File "<doctest default[0]>", line 4, in lumberjack\n    bright_side_of_life()\n    ~~~~~~~~~~~~~~~~~~~^^\n',
 '  File "<doctest default[0]>", line 7, in bright_side_of_life\n    return tuple()[0]\n           ~~~~~~~^^^\n']
*** tb_lineno: 10
@end example

다음 예제는 스택을 인쇄하고 포맷하는 다양한 방법을 보여줍니다:

@example
>>> import traceback
>>> def another_function():
...     lumberstack()
...
>>> def lumberstack():
...     traceback.print_stack()
...     print(repr(traceback.extract_stack()))
...     print(repr(traceback.format_stack()))
...
>>> another_function()
  File "<doctest>", line 10, in <module>
    another_function()
  File "<doctest>", line 3, in another_function
    lumberstack()
  File "<doctest>", line 6, in lumberstack
    traceback.print_stack()
[('<doctest>', 10, '<module>', 'another_function()'),
 ('<doctest>', 3, 'another_function', 'lumberstack()'),
 ('<doctest>', 7, 'lumberstack', 'print(repr(traceback.extract_stack()))')]
['  File "<doctest>", line 10, in <module>\n    another_function()\n',
 '  File "<doctest>", line 3, in another_function\n    lumberstack()\n',
 '  File "<doctest>", line 8, in lumberstack\n    print(repr(traceback.format_stack()))\n']
@end example

이 마지막 예제는 마지막 몇 가지 포매팅 함수를 예시합니다:

@example
>>> import traceback
>>> traceback.format_list([('spam.py', 3, '<module>', 'spam.eggs()'),
...                        ('eggs.py', 42, 'eggs', 'return "bacon"')])
['  File "spam.py", line 3, in <module>\n    spam.eggs()\n',
 '  File "eggs.py", line 42, in eggs\n    return "bacon"\n']
>>> an_error = IndexError('tuple index out of range')
>>> traceback.format_exception_only(an_error)
['IndexError: tuple index out of range\n']
@end example

@node TracebackException을 사용하는 예제,,Examples of Using the Module-Level Functions,traceback — 스택 트레이스백 인쇄와 조회
@anchor{library/traceback examples-of-using-tracebackexception}@anchor{4a38}
@subsubsection @code{TracebackException}을 사용하는 예제


With the helper class, we have more options:

@example
>>> import sys
>>> from traceback import TracebackException
>>>
>>> def lumberjack():
...     bright_side_of_life()
...
>>> def bright_side_of_life():
...     t = "bright", "side", "of", "life"
...     return t[5]
...
>>> try:
...     lumberjack()
... except IndexError as e:
...     exc = e
...
>>> try:
...     try:
...         lumberjack()
...     except:
...         1/0
... except Exception as e:
...     chained_exc = e
...
>>> # limit 는 모듈 수준 함수처럼 작동합니다
>>> TracebackException.from_exception(exc, limit=-2).print()
Traceback (most recent call last):
  File "<python-input-1>", line 6, in lumberjack
    bright_side_of_life()
    ~~~~~~~~~~~~~~~~~~~^^
  File "<python-input-1>", line 10, in bright_side_of_life
    return t[5]
           ~^^^
IndexError: tuple index out of range

>>> # capture_locals 는 프레임에 지역 변수를 추가합니다
>>> TracebackException.from_exception(exc, limit=-2, capture_locals=True).print()
Traceback (most recent call last):
  File "<python-input-1>", line 6, in lumberjack
    bright_side_of_life()
    ~~~~~~~~~~~~~~~~~~~^^
  File "<python-input-1>", line 10, in bright_side_of_life
    return t[5]
           ~^^^
    t = ("bright", "side", "of", "life")
IndexError: tuple index out of range

>>> # print() 의 *chain* 키워드 인자는 연결된 예외를
>>> # 표시할지를 제어합니다
>>> TracebackException.from_exception(chained_exc).print()
Traceback (most recent call last):
  File "<python-input-19>", line 4, in <module>
    lumberjack()
    ~~~~~~~~~~^^
  File "<python-input-8>", line 7, in lumberjack
    bright_side_of_life()
    ~~~~~~~~~~~~~~~~~~~^^
  File "<python-input-8>", line 11, in bright_side_of_life
    return t[5]
           ~^^^
IndexError: tuple index out of range

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<python-input-19>", line 6, in <module>
    1/0
    ~^~
ZeroDivisionError: division by zero

>>> TracebackException.from_exception(chained_exc).print(chain=False)
Traceback (most recent call last):
  File "<python-input-19>", line 6, in <module>
    1/0
    ~^~
ZeroDivisionError: division by zero
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node __future__ — 퓨처 문 정의,gc — 가비지 수거기 인터페이스,traceback — 스택 트레이스백 인쇄와 조회,파이썬 실행시간 서비스
@anchor{library/__future__ doc}@anchor{4a39}@anchor{library/__future__ future-future-statement-definitions}@anchor{4a3a}@anchor{library/__future__ module-__future__}@anchor{0}@anchor{library/__future__ translation-repo}@anchor{4a3b}
@subsection @code{__future__} — 퓨처 문 정의


@geindex module; __future__

`소스 코드:' Lib/__future__.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/__future__.py}


__________________________________________________________________


Imports of the form @code{from __future__ import feature} are called
@ref{45d,,future statements}. These are special-cased by the Python compiler
to allow the use of new Python features in modules containing the future statement
before the release in which the feature becomes standard.

While these future statements are given additional special meaning by the
Python compiler, they are still executed like any other import statement and
the @code{__future__} exists and is handled by the import system the same way
any other Python module would be. This design serves three purposes:


@itemize *

@item 
임포트 문을 분석하고 임포트하는 모듈을 발견하리라고 기대하는 기존 도구가 혼동하지 않게 하려고.

@item 
To document when incompatible changes were introduced, and when they will be
— or were — made mandatory.  This is a form of executable documentation, and
can be inspected programmatically via importing @code{__future__} and examining
its contents.

@item 
To ensure that @ref{45d,,future statements} run under releases prior to
Python 2.1 at least yield runtime exceptions (the import of @code{__future__}
will fail, because there was no module of that name prior to 2.1).
@end itemize

@menu
* Module Contents:: 

@end menu

@node Module Contents,,,__future__ — 퓨처 문 정의
@anchor{library/__future__ module-contents}@anchor{4a3c}
@subsubsection Module Contents


No feature description will ever be deleted from @code{__future__}. Since its
introduction in Python 2.1 the following features have found their way into the
language using this mechanism:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

기능

@tab

선택적 버전

@tab

필수적 버전

@tab

효과

@item

@geindex nested_scopes (__future__ 모듈)
@anchor{library/__future__ future__ nested_scopes}@anchor{4a3d}
@deffn {데이터} __future__.nested_scopes
@end deffn

@tab

2.1.0b1

@tab

2.2

@tab

@geindex Python 향상 제안; PEP 227
PEP 227@footnote{https://peps.python.org/pep-0227/}: `정적으로 중첩된 스코프'

@item

@geindex generators (__future__ 모듈)
@anchor{library/__future__ future__ generators}@anchor{4a3e}
@deffn {데이터} __future__.generators
@end deffn

@tab

2.2.0a1

@tab

2.3

@tab

@geindex Python 향상 제안; PEP 255
PEP 255@footnote{https://peps.python.org/pep-0255/}: `단순 제너레이터'

@item

@geindex division (__future__ 모듈)
@anchor{library/__future__ future__ division}@anchor{4a3f}
@deffn {데이터} __future__.division
@end deffn

@tab

2.2.0a2

@tab

3.0

@tab

@geindex Python 향상 제안; PEP 238
PEP 238@footnote{https://peps.python.org/pep-0238/}: `나누기 연산자 변경'

@item

@geindex absolute_import (__future__ 모듈)
@anchor{library/__future__ future__ absolute_import}@anchor{4a40}
@deffn {데이터} __future__.absolute_import
@end deffn

@tab

2.5.0a1

@tab

3.0

@tab

@geindex Python 향상 제안; PEP 328
PEP 328@footnote{https://peps.python.org/pep-0328/}: `임포트: 복수 줄 및 절대/상대'

@item

@geindex with_statement (__future__ 모듈)
@anchor{library/__future__ future__ with_statement}@anchor{4a41}
@deffn {데이터} __future__.with_statement
@end deffn

@tab

2.5.0a1

@tab

2.6

@tab

@geindex Python 향상 제안; PEP 343
PEP 343@footnote{https://peps.python.org/pep-0343/}: `The “with” Statement'

@item

@geindex print_function (__future__ 모듈)
@anchor{library/__future__ future__ print_function}@anchor{4a42}
@deffn {데이터} __future__.print_function
@end deffn

@tab

2.6.0a2

@tab

3.0

@tab

@geindex Python 향상 제안; PEP 3105
PEP 3105@footnote{https://peps.python.org/pep-3105/}: `print를 함수로 만들기'

@item

@geindex unicode_literals (__future__ 모듈)
@anchor{library/__future__ future__ unicode_literals}@anchor{4a43}
@deffn {데이터} __future__.unicode_literals
@end deffn

@tab

2.6.0a2

@tab

3.0

@tab

@geindex Python 향상 제안; PEP 3112
PEP 3112@footnote{https://peps.python.org/pep-3112/}: `파이썬 3000의 바이트열 리터럴'

@item

@geindex generator_stop (__future__ 모듈)
@anchor{library/__future__ future__ generator_stop}@anchor{4a44}
@deffn {데이터} __future__.generator_stop
@end deffn

@tab

3.5.0b1

@tab

3.7

@tab

@geindex Python 향상 제안; PEP 479
PEP 479@footnote{https://peps.python.org/pep-0479/}: `제너레이터 내부의 StopIteration 처리'

@item

@geindex annotations (__future__ 모듈)
@anchor{library/__future__ future__ annotations}@anchor{4a45}
@deffn {데이터} __future__.annotations
@end deffn

@tab

3.7.0b1

@tab

Never @footnote{
@code{from __future__ import annotations} was previously scheduled to
become mandatory in Python 3.10, but the change was delayed and ultimately
canceled. This feature will eventually be deprecated and removed. See
@geindex Python 향상 제안; PEP 649
@uref{https://peps.python.org/pep-0649/,PEP 649} and 
@geindex Python 향상 제안; PEP 749
@uref{https://peps.python.org/pep-0749/,PEP 749}.
}

@tab

@geindex Python 향상 제안; PEP 563
PEP 563@footnote{https://peps.python.org/pep-0563/}: `Postponed evaluation of annotations',
@geindex Python 향상 제안; PEP 649
PEP 649@footnote{https://peps.python.org/pep-0649/}: `Deferred evaluation of annotations using descriptors'

@end multitable


@c XXX Adding a new entry?  Remember to update simple_stmts.rst, too.

@geindex _Feature (__future__ 클래스)
@anchor{library/__future__ future-classes}@anchor{4a46}@anchor{library/__future__ future__ _Feature}@anchor{25c8}
@deffn {클래스} __future__._Feature

@code{__future__.py} 의 각 문장은 다음과 같은 형식입니다:

@example
FeatureName = _Feature(OptionalRelease, MandatoryRelease,
                       CompilerFlag)
@end example

보통, `OptionalRelease' 는 `MandatoryRelease' 보다 작으며, 둘 다 @ref{8ae,,sys.version_info}와 같은 형태의 5-튜플입니다:

@example
(PY_MAJOR_VERSION, # the 2 in 2.1.0a3; an int
 PY_MINOR_VERSION, # the 1; an int
 PY_MICRO_VERSION, # the 0; an int
 PY_RELEASE_LEVEL, # "alpha", "beta", "candidate" or "final"; string
 PY_RELEASE_SERIAL # the 3; an int
)
@end example
@end deffn

@geindex getOptionalRelease() (__future__._Feature 메서드)
@anchor{library/__future__ future__ _Feature getOptionalRelease}@anchor{4a47}
@deffn {메서드} _Feature.getOptionalRelease ()

`OptionalRelease' 는 해당 기능이 승인된 첫 번째 배포를 기록합니다.
@end deffn

@geindex getMandatoryRelease() (__future__._Feature 메서드)
@anchor{library/__future__ future__ _Feature getMandatoryRelease}@anchor{4a48}
@deffn {메서드} _Feature.getMandatoryRelease ()

`MandatoryRelease' 가 아직 배포되지 않은 경우, `MandatoryRelease' 는 해당 기능이 언어 일부가 될 배포를 예측합니다.

그렇지 않으면 `MandatoryRelease' 는 기능이 언어 일부가 된 때를 기록합니다; 그 배포와 그 이후의 배포에서, 모듈이 해당 기능을 사용하기 위해 더 퓨처 문을 요구하지 않지만, 그러한 임포트는 계속 사용할 수 있습니다.

`MandatoryRelease' 는 @code{None} 일 수도 있습니다. 이는 계획된 기능이 삭제되었거나 아직 결정되지 않았음을 의미합니다.
@end deffn

@geindex compiler_flag (__future__._Feature의 속성)
@anchor{library/__future__ future__ _Feature compiler_flag}@anchor{2393}
@deffn {속성} _Feature.compiler_flag

`CompilerFlag' 은 동적으로 컴파일되는 코드에서 해당 기능을 활성화하기 위해, 내장 함수 @ref{4b2,,compile()} 의 네 번째 인자로 전달되어야 하는 (비트 필드) 플래그입니다. 이 플래그는 @ref{25c8,,_Feature} 인스턴스의 @ref{2393,,_Feature.compiler_flag} 어트리뷰트에 저장됩니다.
@end deffn


@subsubheading 더 보기



@table @asis

@item @ref{45d,,퓨처 문}

컴파일러가 퓨처 임포트를 처리하는 방법.

@geindex Python 향상 제안; PEP 236

@item PEP 236@footnote{https://peps.python.org/pep-0236/} - Back to the __future__

The original proposal for the __future__ mechanism.
@end table


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node gc — 가비지 수거기 인터페이스,inspect — 라이브 객체 검사,__future__ — 퓨처 문 정의,파이썬 실행시간 서비스
@anchor{library/gc doc}@anchor{4a49}@anchor{library/gc gc-garbage-collector-interface}@anchor{4a4a}@anchor{library/gc module-gc}@anchor{64}@anchor{library/gc translation-repo}@anchor{4a4b}
@subsection @code{gc} — 가비지 수거기 인터페이스


@geindex module; gc


__________________________________________________________________


이 모듈은 선택적인 가비지 수거기에 대한 인터페이스를 제공합니다. 수거기를 비활성화하고, 수거 빈도를 조정하며, 디버깅 옵션을 설정하는 기능을 제공합니다. 또한 수거기가 발견했지만 해제할 수 없는 도달 불가능한 객체에 대한 액세스를 제공합니다. 수거기는 파이썬에서 이미 사용된 참조 횟수 추적을 보충하므로, 프로그램이 참조 순환을 만들지 않는다고 확신한다면 수거기를 비활성화 할 수 있습니다. @code{gc.disable()}을 호출하여 자동 수거를 비활성화 할 수 있습니다. 누수가 발생하는 프로그램을 디버그하려면, @code{gc.set_debug(gc.DEBUG_LEAK)}을 호출하십시오. 이것은 @code{gc.DEBUG_SAVEALL}을 포함하므로, 가비지 수거된 객체가 검사를 위해 gc.garbage에 저장되도록 함에 유의하십시오.

The @code{gc} module provides the following functions:

@geindex enable() (gc 모듈)
@anchor{library/gc gc enable}@anchor{4a4c}
@deffn {함수} gc.enable ()

자동 가비지 수거를 활성화합니다.
@end deffn

@geindex disable() (gc 모듈)
@anchor{library/gc gc disable}@anchor{4a4d}
@deffn {함수} gc.disable ()

자동 가비지 수거를 비활성화합니다.
@end deffn

@geindex isenabled() (gc 모듈)
@anchor{library/gc gc isenabled}@anchor{4a4e}
@deffn {함수} gc.isenabled ()

자동 수거가 활성화되었으면 @code{True}를 반환합니다.
@end deffn

@geindex collect() (gc 모듈)
@anchor{library/gc gc collect}@anchor{1b3}
@deffn {함수} gc.collect (generation=2)

Perform a collection.  The optional argument `generation'
may be an integer specifying which generation to collect (from 0 to 2).  A
@ref{2ec,,ValueError} is raised if the generation number is invalid. The sum of
collected objects and uncollectable objects is returned.

Calling @code{gc.collect(0)} will perform a GC collection on the young generation.

Calling @code{gc.collect(1)} will perform a GC collection on the young generation
and an increment of the old generation.

Calling @code{gc.collect(2)} or @code{gc.collect()} performs a full collection

여러 내장형을 위해 유지되는 자유 목록(free list)은 전체 수거나 최고 세대(2)의 수거가 실행될 때마다 지워집니다. 특정 구현(특히 @ref{196,,float})으로 인해, 일부 자유 목록에서 모든 항목이 해제되지는 않을 수 있습니다.

The effect of calling @code{gc.collect()} while the interpreter is already
performing a collection is undefined.


버전 3.14에서 변경: @code{generation=1} performs an increment of collection.

@end deffn

@geindex set_debug() (gc 모듈)
@anchor{library/gc gc set_debug}@anchor{4a4f}
@deffn {함수} gc.set_debug (flags)

가비지 수거 디버깅 플래그를 설정합니다. 디버깅 정보가 @code{sys.stderr}에 기록됩니다. 디버깅을 제어하기 위해 비트 연산을 사용하여 결합할 수 있는 디버깅 플래그 목록은 아래를 참조하십시오.
@end deffn

@geindex get_debug() (gc 모듈)
@anchor{library/gc gc get_debug}@anchor{4a50}
@deffn {함수} gc.get_debug ()

현재 설정된 디버깅 플래그를 반환합니다.
@end deffn

@geindex get_objects() (gc 모듈)
@anchor{library/gc gc get_objects}@anchor{a04}
@deffn {함수} gc.get_objects (generation=None)

Returns a list of all objects tracked by the collector, excluding the list
returned. If `generation' is not @code{None}, return only the objects as follows:


@itemize *

@item 
0: All objects in the young generation

@item 
1: No objects, as there is no generation 1 (as of Python 3.14)

@item 
2: All objects in the old generation
@end itemize


버전 3.8에서 변경: 새로운 `generation' 매개 변수.



버전 3.14에서 변경: Generation 1 is removed


인자 @code{generation}으로 @ref{1c6c,,감사 이벤트} @code{gc.get_objects}를 발생시킵니다.
@end deffn

@geindex get_stats() (gc 모듈)
@anchor{library/gc gc get_stats}@anchor{2dc}
@deffn {함수} gc.get_stats ()

인터프리터가 시작된 이후의 수거 통계를 포함하는 세 개의 세대별 딕셔너리의 리스트를 반환합니다. 향후 키 수는 변경될 수 있지만, 현재 각 딕셔너리에는 다음과 같은 항목이 포함됩니다:


@itemize *

@item 
@code{collections}는 이 세대가 수거된 횟수입니다.

@item 
@code{collected}는 이 세대 내에서 수거된 총 객체 수입니다.

@item 
@code{uncollectable}은 이 세대 내에서 수거할 수 없는 (따라서 @ref{13c6,,garbage} 리스트로 이동된) 것으로 확인된 총 객체 수입니다.
@end itemize


Added in version 3.4.

@end deffn

@geindex set_threshold() (gc 모듈)
@anchor{library/gc gc set_threshold}@anchor{2da}
@deffn {함수} gc.set_threshold (threshold0[, threshold1[, threshold2]])

가비지 수거 임곗값(수거 빈도)을 설정합니다. `threshold0'을 0으로 설정하면 수거가 비활성화됩니다.

The GC classifies objects into two generations depending on whether they have
survived a collection. New objects are placed in the young generation. If an
object survives a collection it is moved into the old generation.

In order to decide when to run, the collector keeps track of the number of object
allocations and deallocations since the last collection.  When the number of
allocations minus the number of deallocations exceeds `threshold0', collection
starts. For each collection, all the objects in the young generation and some
fraction of the old generation is collected.

In the free-threaded build, the increase in process memory usage is also
checked before running the collector.  If the memory usage has not increased
by 10% since the last collection and the net number of object allocations
has not exceeded 40 times `threshold0', the collection is not run.

The fraction of the old generation that is collected is `inversely' proportional
to `threshold1'. The larger `threshold1' is, the slower objects in the old generation
are collected.
For the default value of 10, 1% of the old generation is scanned during each collection.

`threshold2' is ignored.

See Garbage collector design@footnote{https://github.com/python/cpython/blob/3.14/InternalDocs/garbage_collector.md} for more information.


버전 3.14에서 변경: `threshold2' is ignored

@end deffn

@geindex get_count() (gc 모듈)
@anchor{library/gc gc get_count}@anchor{2db}
@deffn {함수} gc.get_count ()

현재 수거 횟수를 @code{(count0, count1, count2)}의 튜플로 반환합니다.
@end deffn

@geindex get_threshold() (gc 모듈)
@anchor{library/gc gc get_threshold}@anchor{2d9}
@deffn {함수} gc.get_threshold ()

현재 수거 임곗값을 @code{(threshold0, threshold1, threshold2)}의 튜플로 반환합니다.
@end deffn

@geindex get_referrers() (gc 모듈)
@anchor{library/gc gc get_referrers}@anchor{a05}
@deffn {함수} gc.get_referrers (*objs)

objs에 있는 것을 직접 참조하는 객체의 리스트를 반환합니다. 이 함수는 가비지 수거를 지원하는 컨테이너만 찾습니다; 다른 객체를 참조하지만, 가비지 수거를 지원하지 않는 확장형은 찾을 수 없습니다.

이미 참조 해제되었지만, 순환에 참여해서 가비지 수거기에 의해 아직 수거되지 않은 객체는 결과 참조자(referrer)에 나열될 수 있음에 유의하십시오. 현재 살아있는 객체만 가져오려면, @ref{a05,,get_referrers()}를 호출하기 전에 @ref{1b3,,collect()}를 호출하십시오.

@cartouche
@quotation 경고 
@ref{a05,,get_referrers()}에서 반환된 객체를 사용할 때는, 그중 일부는 아직 생성 중이라서 일시적으로 유효하지 않은 상태일 수 있기 때문에 주의해야 합니다. 디버깅 이외의 목적으로 @code{get_referrers()}를 사용하지 마십시오.
@end quotation
@end cartouche

인자 @code{objs}로 @ref{1c6c,,감사 이벤트} @code{gc.get_referrers}를 발생시킵니다.
@end deffn

@geindex get_referents() (gc 모듈)
@anchor{library/gc gc get_referents}@anchor{a06}
@deffn {함수} gc.get_referents (*objs)

인자로 제공된 객체가 직접 참조하는 객체의 리스트를 반환합니다. 반환된 피 참조자(referent)는 인자의 C 수준 @ref{981,,tp_traverse} 메서드(있다면)가 방문한 객체이며, 실제로 직접 도달할 수 있는 모든 객체는 아닐 수 있습니다. @code{tp_traverse} 메서드는 가비지 수거를 지원하는 객체에서만 지원되며, 순환에 참여하는 객체만 방문하면 됩니다. 그래서, 예를 들어, 인자에서 정수에 직접 도달 할 수 있으면, 해당 정수 객체가 결과 목록에 나타날 수도 그렇지 않을 수도 있습니다.

인자 @code{objs}로 @ref{1c6c,,감사 이벤트} @code{gc.get_referents}를 발생시킵니다.
@end deffn

@geindex is_tracked() (gc 모듈)
@anchor{library/gc gc is_tracked}@anchor{1512}
@deffn {함수} gc.is_tracked (obj)

가비지 수거기가 객체를 현재 추적하고 있으면 @code{True}를, 그렇지 않으면 @code{False}를 반환합니다. 일반적인 규칙으로, 원자 형(atomic type)의 인스턴스는 추적하지 않고, 원자 형이 아닌 인스턴스(컨테이너, 사용자 정의 객체…)는 추적합니다. 그러나 간단한 인스턴스의 가비지 수거기 크기를 줄이기 위해 일부 형별 최적화가 존재할 수 있습니다 (예를 들어, 원자적 키와 값만 포함하는 딕셔너리):

@example
>>> gc.is_tracked(0)
False
>>> gc.is_tracked("a")
False
>>> gc.is_tracked([])
True
>>> gc.is_tracked(@{@})
False
>>> gc.is_tracked(@{"a": 1@})
True
@end example


Added in version 3.1.

@end deffn

@geindex is_finalized() (gc 모듈)
@anchor{library/gc gc is_finalized}@anchor{af9}
@deffn {함수} gc.is_finalized (obj)

주어진 객체가 가비지 수거기에 의해 파이널라이즈 되었으면 @code{True}를, 그렇지 않으면 @code{False}를 반환합니다.

@example
>>> x = None
>>> class Lazarus:
...     def __del__(self):
...         global x
...         x = self
...
>>> lazarus = Lazarus()
>>> gc.is_finalized(lazarus)
False
>>> del lazarus
>>> gc.is_finalized(x)
True
@end example


Added in version 3.9.

@end deffn

@geindex freeze() (gc 모듈)
@anchor{library/gc gc freeze}@anchor{d2d}
@deffn {함수} gc.freeze ()

가비지 수거기가 추적한 모든 객체를 고정합니다; 그들을 영구 세대(permanent generation)로 이동하고 향후 모든 수거에서 그들을 무시합니다.

If a process will @code{fork()} without @code{exec()}, avoiding unnecessary
copy-on-write in child processes will maximize memory sharing and reduce
overall memory usage. This requires both avoiding creation of freed “holes”
in memory pages in the parent process and ensuring that GC collections in
child processes won’t touch the @code{gc_refs} counter of long-lived objects
originating in the parent process. To accomplish both, call @code{gc.disable()}
early in the parent process, @code{gc.freeze()} right before @code{fork()}, and
@code{gc.enable()} early in child processes.


Added in version 3.7.

@end deffn

@geindex unfreeze() (gc 모듈)
@anchor{library/gc gc unfreeze}@anchor{d2e}
@deffn {함수} gc.unfreeze ()

영구 세대(permanent generation)의 객체를 고정 해제하고, 가장 나이 든 세대로 되돌립니다.


Added in version 3.7.

@end deffn

@geindex get_freeze_count() (gc 모듈)
@anchor{library/gc gc get_freeze_count}@anchor{d2f}
@deffn {함수} gc.get_freeze_count ()

영구 세대(permanent generation)에 있는 객체 수를 반환합니다.


Added in version 3.7.

@end deffn

다음 변수가 전용 액세스로 제공됩니다 (값을 변경할 수는 있지만, 다시 연결해서는 안 됩니다):

@geindex garbage (gc 모듈)
@anchor{library/gc gc garbage}@anchor{13c6}
@deffn {데이터} gc.garbage

수거기가 발견했지만 해제할 수 없는 도달 불가능한 객체의 리스트 (수거할 수 없는 객체). 파이썬 3.4부터, @code{NULL}이 아닌 @code{tp_del} 슬롯이 있는 C 확장형의 인스턴스를 사용할 때를 제외하고, 이 리스트는 대체로 비어 있어야 합니다.

@ref{4a51,,DEBUG_SAVEALL}이 설정되면, 도달할 수 없는 모든 객체가 해제되지 않고 이 목록에 추가됩니다.


버전 3.2에서 변경: @ref{47a,,인터프리터 종료} 시 이 목록이 비어 있지 않으면, @ref{54e,,ResourceWarning}이 발생하는데, 기본적으로 조용(silent)합니다. @ref{13c7,,DEBUG_UNCOLLECTABLE}이 설정되면, 추가로 모든 수거 할 수 없는 객체가 인쇄됩니다.



버전 3.4에서 변경: 
@geindex Python 향상 제안; PEP 442
PEP 442@footnote{https://peps.python.org/pep-0442/}에 따라, @ref{11fc,,__del__()} 메서드를 가진 객체는 더는 @ref{13c6,,gc.garbage}에 들어가지 않습니다.

@end deffn

@geindex callbacks (gc 모듈)
@anchor{library/gc gc callbacks}@anchor{12cc}
@deffn {데이터} gc.callbacks

수거 전후에 가비지 수거기가 호출할 콜백의 리스트입니다. 콜백은 두 인자로 호출됩니다, `phase'와 `info'.

`phase'는 다음 두 값 중 하나일 수 있습니다:

@quotation

“start”: 가비지 수거를 시작하려고 합니다.

“stop”: 가비지 수거가 완료되었습니다.
@end quotation

`info'는 콜백에 추가 정보를 제공하는 딕셔너리입니다. 현재 다음 키가 정의되어 있습니다:

@quotation

“generation”: 수거되는 가장 나이 든 세대.

“collected”: `phase'가 “stop”일 때, 성공적으로 수거된 객체 수.

“uncollectable”: `phase'가 “stop”일 때, 수거할 수 없어서 @ref{13c6,,garbage}에 들어간 객체 수.
@end quotation

응용 프로그램은 이 리스트에 자체 콜백을 추가 할 수 있습니다. 주요 사용 사례는 다음과 같습니다:

@quotation

다양한 세대가 수거되는 빈도와 수거에 걸린 시간과 같은 가비지 수거에 대한 통계 수집.

응용 프로그램이 자신의 수거할 수 없는 형이 @ref{13c6,,garbage}에 나타날 때 식별하고 지울 수 있도록 합니다.
@end quotation


Added in version 3.3.

@end deffn

@ref{4a4f,,set_debug()}와 함께 사용하기 위해 다음 상수가 제공됩니다:

@geindex DEBUG_STATS (gc 모듈)
@anchor{library/gc gc DEBUG_STATS}@anchor{4a52}
@deffn {데이터} gc.DEBUG_STATS

수거 중 통계를 인쇄합니다. 이 정보는 수거 빈도를 조정할 때 유용 할 수 있습니다.
@end deffn

@geindex DEBUG_COLLECTABLE (gc 모듈)
@anchor{library/gc gc DEBUG_COLLECTABLE}@anchor{4a53}
@deffn {데이터} gc.DEBUG_COLLECTABLE

발견된 수거 가능한 객체에 대한 정보를 인쇄합니다.
@end deffn

@geindex DEBUG_UNCOLLECTABLE (gc 모듈)
@anchor{library/gc gc DEBUG_UNCOLLECTABLE}@anchor{13c7}
@deffn {데이터} gc.DEBUG_UNCOLLECTABLE

발견된 수거 할 수 없는 객체에 대한 정보를 인쇄합니다 (도달 할 수 있지만, 수거기가 해제할 수 없는 객체). 이 객체는 @code{garbage} 리스트에 추가됩니다.


버전 3.2에서 변경: @ref{47a,,인터프리터 종료} 시에 @ref{13c6,,garbage} 리스트가 비어있지 않으면 내용을 인쇄하기도 합니다.

@end deffn

@geindex DEBUG_SAVEALL (gc 모듈)
@anchor{library/gc gc DEBUG_SAVEALL}@anchor{4a51}
@deffn {데이터} gc.DEBUG_SAVEALL

설정하면, 발견된 모든 도달할 수 없는 객체를 해제하는 대신 `garbage'에 추가합니다. 누수가 있는 프로그램을 디버깅하는 데 유용 할 수 있습니다.
@end deffn

@geindex DEBUG_LEAK (gc 모듈)
@anchor{library/gc gc DEBUG_LEAK}@anchor{4a54}
@deffn {데이터} gc.DEBUG_LEAK

수거기가 누수가 있는 프로그램에 대한 정보를 인쇄하도록 하는 데 필요한 디버깅 플래그 (@code{DEBUG_COLLECTABLE | DEBUG_UNCOLLECTABLE | DEBUG_SAVEALL}과 같습니다).
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node inspect — 라이브 객체 검사,annotationlib — Functionality for introspecting annotations,gc — 가비지 수거기 인터페이스,파이썬 실행시간 서비스
@anchor{library/inspect doc}@anchor{4a55}@anchor{library/inspect inspect-inspect-live-objects}@anchor{4a56}@anchor{library/inspect translation-repo}@anchor{4a57}
@subsection @code{inspect} — 라이브 객체 검사


@c import inspect
@c from inspect import *

@geindex module; inspect
@anchor{library/inspect module-inspect}@anchor{82}
`소스 코드:' Lib/inspect.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/inspect.py}


__________________________________________________________________


The @code{inspect} module provides several useful functions to help get
information about live objects such as modules, classes, methods, functions,
tracebacks, frame objects, and code objects.  For example, it can help you
examine the contents of a class, retrieve the source code of a method, extract
and format the argument list for a function, or get all the information you need
to display a detailed traceback.

이 모듈은 4가지 종류의 주요 서비스를 제공합니다: 형 검사, 소스 코드 가져오기, 클래스와 함수 검사, 인터프리터 스택 검사.

@menu
* 형과 멤버:: 
* 소스 코드 가져오기:: 
* Signature 객체로 콜러블 검사하기:: 
* 클래스와 함수: 클래스와 함수<2>. 
* 인터프리터 스택:: 
* 정적으로 어트리뷰트 가져오기:: 
* 제너레이터@comma{} 코루틴 및 비동기 제너레이터의 현재 상태: 제너레이터 코루틴 및 비동기 제너레이터의 현재 상태. 
* 코드 객체 비트 플래그:: 
* Buffer flags:: 
* Command-line interface: Command-line interface<10>. 

@end menu

@node 형과 멤버,소스 코드 가져오기,,inspect — 라이브 객체 검사
@anchor{library/inspect inspect-types}@anchor{1d8f}@anchor{library/inspect types-and-members}@anchor{4a58}
@subsubsection 형과 멤버


@ref{1bef,,getmembers()} 함수는 클래스나 모듈과 같은 객체의 멤버를 검색합니다. 이름이 “is”로 시작하는 함수는 주로 @code{getmembers()}의 두 번째 인자로 쓰기에 편리하도록 제공됩니다. 또한 다음과 같은 특수 어트리뷰트를 언제 찾을 수 있는지 결정하는 데 도움이 됩니다 (모듈 어트리뷰트에 관해서는 @ref{235e,,Import-related attributes on module objects}를 참조하세요):

@c this function name is too big to fit in the ascii-art table below


@multitable {xxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

형

@tab

어트리뷰트

@tab

설명

@item

클래스

@tab

__doc__

@tab

도큐멘테이션 문자열

@item

@tab

__name__

@tab

이 클래스가 정의된 이름

@item

@tab

__qualname__

@tab

정규화된 이름

@item

@tab

__module__

@tab

이 클래스가 정의된 모듈의 이름

@item

@tab

__type_params__

@tab

A tuple containing the
@ref{5ac,,type parameters} of
a generic class

@item

메서드

@tab

__doc__

@tab

도큐멘테이션 문자열

@item

@tab

__name__

@tab

이 메서드가 정의된 이름

@item

@tab

__qualname__

@tab

정규화된 이름

@item

@tab

__func__

@tab

메서드의 구현을 포함하는 함수 객체

@item

@tab

__self__

@tab

이 메서드가 연결된 인스턴스, 또는 @code{None}

@item

@tab

__module__

@tab

이 메서드가 정의된 모듈의 이름

@item

함수

@tab

__doc__

@tab

도큐멘테이션 문자열

@item

@tab

__name__

@tab

이 함수가 정의된 이름

@item

@tab

__qualname__

@tab

정규화된 이름

@item

@tab

__code__

@tab

컴파일된 함수 @ref{4ab,,바이트 코드}를 포함하는 코드 객체

@item

@tab

__defaults__

@tab

위치나 키워드 매개 변수에 대한 기본값의 튜플

@item

@tab

__kwdefaults__

@tab

키워드 전용 매개 변수의 기본값 매핑

@item

@tab

__globals__

@tab

이 함수가 정의된 전역 이름 공간

@item

@tab

__builtins__

@tab

내장 이름 공간

@item

@tab

__annotations__

@tab

매개 변수 이름에서 어노테이션으로의 매핑; @code{"return"} 키는 반환 값 어노테이션을 위해 예약되어 있습니다.

@item

@tab

__type_params__

@tab

A tuple containing the
@ref{5ac,,type parameters} of
a generic function

@item

@tab

__module__

@tab

이 함수가 정의된 모듈의 이름

@item

트레이스백

@tab

tb_frame

@tab

이 수준의 프레임 객체

@item

@tab

tb_lasti

@tab

바이트 코드에서 마지막으로 시도한 명령의 인덱스

@item

@tab

tb_lineno

@tab

파이썬 소스 코드의 현재 줄 번호

@item

@tab

tb_next

@tab

(이 수준에서 호출된) 다음 내부(inner) 트레이스백 객체

@item

프레임

@tab

f_back

@tab

다음 외부(outer) 프레임 객체 (이 프레임의 호출자)

@item

@tab

f_builtins

@tab

이 프레임이 보는 내장 이름 공간

@item

@tab

f_code

@tab

이 프레임에서 실행되는 코드 객체

@item

@tab

f_globals

@tab

이 프레임이 보는 전역 이름 공간

@item

@tab

f_lasti

@tab

바이트 코드에서 마지막으로 시도한 명령의 인덱스

@item

@tab

f_lineno

@tab

파이썬 소스 코드의 현재 줄 번호

@item

@tab

f_locals

@tab

이 프레임이 보는 지역 이름 공간

@item

@tab

f_generator

@tab

returns the generator or
coroutine object that
owns this frame, or
@code{None} if the frame is
of a regular function

@item

@tab

f_trace

@tab

이 프레임의 추적 함수(tracing function), 또는 @code{None}

@item

@tab

f_trace_lines

@tab

indicate whether a
tracing event is
triggered for each source
source line

@item

@tab

f_trace_opcodes

@tab

indicate whether
per-opcode events are
requested

@item

@tab

clear()

@tab

used to clear all
references to local
variables

@item

코드

@tab

co_argcount

@tab

인자 개수 (키워드 전용 인자, * 또는 ** 인자는 포함하지 않습니다)

@item

@tab

co_code

@tab

컴파일된 날 바이트 코드의 문자열

@item

@tab

co_cellvars

@tab

(포함하는 스코프가 참조하는) 셀 변수 이름의 튜플

@item

@tab

co_consts

@tab

바이트 코드에서 사용되는 상수의 튜플

@item

@tab

co_filename

@tab

이 코드 객체가 만들어진 파일의 이름

@item

@tab

co_firstlineno

@tab

파이썬 소스 코드의 첫 줄 번호

@item

@tab

co_flags

@tab

@code{CO_*} 플래그의 비트맵, @ref{2392,,여기}를 더 읽어보십시오

@item

@tab

co_lnotab

@tab

줄 번호에서 바이트 코드 인덱스로의 인코딩된 매핑

@item

@tab

co_freevars

@tab

(함수의 클로저를 통해 참조되는) 자유 변수(free variables) 이름의 튜플

@item

@tab

co_posonlyargcount

@tab

위치 전용 인자의 개수

@item

@tab

co_kwonlyargcount

@tab

키워드 전용 인자의 개수 (** 인자는 제외합니다)

@item

@tab

co_name

@tab

이 코드 객체가 정의된 이름

@item

@tab

co_qualname

@tab

이 코드 객체가 정의된 완전히 정규화된 이름

@item

@tab

co_names

@tab

인자와 함수 지역이 아닌 이름의 튜플

@item

@tab

co_nlocals

@tab

지역 변수의 개수

@item

@tab

co_stacksize

@tab

필요한 가상 기계 스택 공간

@item

@tab

co_varnames

@tab

인자와 지역 변수  이름의 튜플

@item

@tab

co_lines()

@tab

returns an iterator that
yields successive
bytecode ranges

@item

@tab

co_positions()

@tab

returns an iterator of
source code positions for
each bytecode instruction

@item

@tab

replace()

@tab

returns a copy of the
code object with new
values

@item

제너레이터

@tab

__name__

@tab

이름

@item

@tab

__qualname__

@tab

정규화된 이름

@item

@tab

gi_frame

@tab

프레임

@item

@tab

gi_running

@tab

제너레이터가 실행 중입니까?

@item

@tab

gi_suspended

@tab

is the generator
suspended?

@item

@tab

gi_code

@tab

코드

@item

@tab

gi_yieldfrom

@tab

@code{yield from}에 의해 이터레이트 중인 객체, 또는 @code{None}

@item

비동기 제너레이터

@tab

__name__

@tab

이름

@item

@tab

__qualname__

@tab

정규화된 이름

@item

@tab

ag_await

@tab

어웨이트 중인 객체, 또는 @code{None}

@item

@tab

ag_frame

@tab

프레임

@item

@tab

ag_running

@tab

제너레이터가 실행 중입니까?

@item

@tab

ag_suspended

@tab

is the generator
suspended?

@item

@tab

ag_code

@tab

코드

@item

코루틴

@tab

__name__

@tab

이름

@item

@tab

__qualname__

@tab

정규화된 이름

@item

@tab

cr_await

@tab

어웨이트 중인 객체, 또는 @code{None}

@item

@tab

cr_frame

@tab

프레임

@item

@tab

cr_running

@tab

코루틴이 실행 중입니까?

@item

@tab

cr_suspended

@tab

is the coroutine
suspended?

@item

@tab

cr_code

@tab

코드

@item

@tab

cr_origin

@tab

코루틴이 생성된 곳, 또는 @code{None}. @ref{d84,,sys.set_coroutine_origin_tracking_depth()}를 참조하세요

@item

내장

@tab

__doc__

@tab

도큐멘테이션 문자열

@item

@tab

__name__

@tab

이 함수나 메서드의 원래 이름

@item

@tab

__qualname__

@tab

정규화된 이름

@item

@tab

__self__

@tab

메서드가 연결된 인스턴스, 또는 @code{None}

@end multitable



버전 3.5에서 변경: @code{__qualname__}과 @code{gi_yieldfrom} 어트리뷰트를 제너레이터에 추가합니다.

제너레이터의 @code{__name__} 어트리뷰트는 이제 코드 이름 대신 함수 이름에서 설정되며, 이제 수정할 수 있습니다.



버전 3.7에서 변경: 코루틴에 @code{cr_origin} 어트리뷰트를 추가합니다.



버전 3.10에서 변경: 함수에 @code{__builtins__} 어트리뷰트를 추가합니다.



버전 3.11에서 변경: Add @code{gi_suspended} attribute to generators.



버전 3.11에서 변경: Add @code{cr_suspended} attribute to coroutines.



버전 3.12에서 변경: Add @code{ag_suspended} attribute to async generators.



버전 3.14에서 변경: Add @code{f_generator} attribute to frames.


@geindex getmembers() (inspect 모듈)
@anchor{library/inspect inspect getmembers}@anchor{1bef}
@deffn {함수} inspect.getmembers (object[, predicate])

이름으로 정렬된 @code{(name, value)} 쌍의 리스트로 객체(object)의 모든 멤버를 반환합니다. 각 멤버의 @code{value} 객체로 호출될 선택적 `predicate' 인자가 제공되면, predicate가 참값을 반환하는 멤버만 포함됩니다.

@cartouche
@quotation 참고 
@ref{1bef,,getmembers()}는 인자가 클래스이고 해당 클래스 어트리뷰트가 메타 클래스의 사용자 정의 @ref{176c,,__dir__()}에서 나열될 때만 메타 클래스에 정의된 클래스 어트리뷰트를 반환합니다.
@end quotation
@end cartouche
@end deffn

@geindex getmembers_static() (inspect 모듈)
@anchor{library/inspect inspect getmembers_static}@anchor{858}
@deffn {함수} inspect.getmembers_static (object[, predicate])

Return all the members of an object in a list of @code{(name, value)}
pairs sorted by name without triggering dynamic lookup via the descriptor
protocol, __getattr__ or __getattribute__. Optionally, only return members
that satisfy a given predicate.

@cartouche
@quotation 참고 
@ref{858,,getmembers_static()}은 getmembers 가 가져올 수 있는 모든 멤버를 조회하지 못할 수 있으며 (가령 동적으로 만들어진 어트리뷰트), getmembers 가 가져올 수 없는 멤버를 찾을 수 있습니다 (가령 AttributeError를 발생시키는 디스크립터). 어떤 경우에는 인스턴스 멤버 대신 디스크립터 객체를 반환할 수도 있습니다.
@end quotation
@end cartouche


Added in version 3.11.

@end deffn

@geindex getmodulename() (inspect 모듈)
@anchor{library/inspect inspect getmodulename}@anchor{f33}
@deffn {함수} inspect.getmodulename (path)

감싸고 있는 패키지 이름 없이, 파일 경로(`path')가 가리키는 모듈의 이름을 반환합니다. 파일 확장자는 @ref{4a59,,importlib.machinery.all_suffixes()}의 모든 항목에 대해 점검됩니다. 일치하면, 확장명이 제거된 최종 경로 구성 요소가 반환됩니다. 그렇지 않으면, @code{None}이 반환됩니다.

이 함수는 `오직' 실제 파이썬 모듈로 의미 있는 이름만 반환합니다. 잠재적으로 파이썬 패키지를 가리키는 경로는 여전히 @code{None}을 반환합니다.


버전 3.3에서 변경: 이 함수는 @ref{7b,,importlib}에 직접 기반합니다.

@end deffn

@geindex ismodule() (inspect 모듈)
@anchor{library/inspect inspect ismodule}@anchor{4a5a}
@deffn {함수} inspect.ismodule (object)

객체가 모듈이면 @code{True}를 반환합니다.
@end deffn

@geindex isclass() (inspect 모듈)
@anchor{library/inspect inspect isclass}@anchor{4a5b}
@deffn {함수} inspect.isclass (object)

객체가 (내장이거나 파이썬 코드로 만든) 클래스이면 @code{True}를 반환합니다.
@end deffn

@geindex ismethod() (inspect 모듈)
@anchor{library/inspect inspect ismethod}@anchor{4a5c}
@deffn {함수} inspect.ismethod (object)

객체가 파이썬으로 작성된 연결된(bound) 메서드면 @code{True}를 반환합니다.
@end deffn

@geindex ispackage() (inspect 모듈)
@anchor{library/inspect inspect ispackage}@anchor{232}
@deffn {함수} inspect.ispackage (object)

Return @code{True} if the object is a @ref{233,,package}.


Added in version 3.14.

@end deffn

@geindex isfunction() (inspect 모듈)
@anchor{library/inspect inspect isfunction}@anchor{4a5d}
@deffn {함수} inspect.isfunction (object)

객체가 파이썬 함수이면 @code{True}를 반환합니다. @ref{2bda,,람다} 표현식으로 만든 함수를 포함합니다.
@end deffn

@geindex isgeneratorfunction() (inspect 모듈)
@anchor{library/inspect inspect isgeneratorfunction}@anchor{1b59}
@deffn {함수} inspect.isgeneratorfunction (object)

객체가 파이썬 제너레이터 함수이면 @code{True}를 반환합니다.


버전 3.8에서 변경: 래핑 된 함수가 파이썬 제너레이터 함수일 때 @ref{217,,functools.partial()}로 래핑 된 함수는 이제 @code{True}를 반환합니다.



버전 3.13에서 변경: 래핑 된 함수가 파이썬 제너레이터 함수일 때 @ref{218,,functools.partialmethod()}로 래핑 된 함수는 이제 @code{True}를 반환합니다.

@end deffn

@geindex isgenerator() (inspect 모듈)
@anchor{library/inspect inspect isgenerator}@anchor{4a5e}
@deffn {함수} inspect.isgenerator (object)

객체가 제너레이터이면 @code{True}를 반환합니다.
@end deffn

@geindex iscoroutinefunction() (inspect 모듈)
@anchor{library/inspect inspect iscoroutinefunction}@anchor{30d}
@deffn {함수} inspect.iscoroutinefunction (object)

객체가 @ref{f72,,코루틴 함수} (@ref{7ec,,async def} 문법으로 정의된 함수), 코루틴 함수를 감싸는 @ref{217,,functools.partial()} 또는 @ref{6b7,,markcoroutinefunction()}으로 표시된 동기 함수이면 @code{True}를 반환합니다.


Added in version 3.5.



버전 3.8에서 변경: 래핑 된 함수가 @ref{f72,,코루틴 함수}일 때 @ref{217,,functools.partial()}로 래핑 된 함수는 이제 @code{True}를 반환합니다.



버전 3.12에서 변경: Sync functions marked with @ref{6b7,,markcoroutinefunction()} now return
@code{True}.



버전 3.13에서 변경: 래핑 된 함수가 @ref{f72,,코루틴 함수}일 때 @ref{218,,functools.partialmethod()}로 래핑 된 함수는 이제 @code{True}를 반환합니다.

@end deffn

@geindex markcoroutinefunction() (inspect 모듈)
@anchor{library/inspect inspect markcoroutinefunction}@anchor{6b7}
@deffn {함수} inspect.markcoroutinefunction (func)

Decorator to mark a callable as a @ref{f72,,coroutine function} if it would not
otherwise be detected by @ref{30d,,iscoroutinefunction()}.

This may be of use for sync functions that return a @ref{6b8,,coroutine}, if
the function is passed to an API that requires @ref{30d,,iscoroutinefunction()}.

When possible, using an @ref{7ec,,async def} function is preferred. Also
acceptable is calling the function and testing the return with
@ref{1016,,iscoroutine()}.


Added in version 3.12.

@end deffn

@geindex iscoroutine() (inspect 모듈)
@anchor{library/inspect inspect iscoroutine}@anchor{1016}
@deffn {함수} inspect.iscoroutine (object)

객체가 @ref{7ec,,async def} 함수가 만든 @ref{6b8,,코루틴}이면 @code{True}를 반환합니다.


Added in version 3.5.

@end deffn

@geindex isawaitable() (inspect 모듈)
@anchor{library/inspect inspect isawaitable}@anchor{1017}
@deffn {함수} inspect.isawaitable (object)

@ref{18d,,await} 표현식에서 객체를 사용할 수 있으면 @code{True}를 반환합니다.

제너레이터 기반 코루틴을 일반 제너레이터와 구별하는 데 사용할 수도 있습니다:

@example
import types

def gen():
    yield
@@types.coroutine
def gen_coro():
    yield

assert not isawaitable(gen())
assert isawaitable(gen_coro())
@end example


Added in version 3.5.

@end deffn

@geindex isasyncgenfunction() (inspect 모듈)
@anchor{library/inspect inspect isasyncgenfunction}@anchor{1b5a}
@deffn {함수} inspect.isasyncgenfunction (object)

객체가 @ref{249b,,비동기 제너레이터} 함수이면 @code{True}를 반환합니다, 예를 들면:

@example
>>> async def agen():
...     yield 1
...
>>> inspect.isasyncgenfunction(agen)
True
@end example


Added in version 3.6.



버전 3.8에서 변경: 래핑 된 함수가 @ref{249b,,비동기 제너레이터} 함수일 때 @ref{217,,functools.partial()}로 래핑 된 함수는 이제 @code{True}를 반환합니다.



버전 3.13에서 변경: Functions wrapped in @ref{218,,functools.partialmethod()} now return @code{True}
if the wrapped function is a @ref{249b,,asynchronous generator} function.

@end deffn

@geindex isasyncgen() (inspect 모듈)
@anchor{library/inspect inspect isasyncgen}@anchor{4a5f}
@deffn {함수} inspect.isasyncgen (object)

객체가 @ref{249b,,asynchronous generator} 함수가 만든 @ref{3975,,비동기 제너레이터 이터레이터}이면 @code{True}를 반환합니다.


Added in version 3.6.

@end deffn

@geindex istraceback() (inspect 모듈)
@anchor{library/inspect inspect istraceback}@anchor{4a60}
@deffn {함수} inspect.istraceback (object)

객체가 트레이스백이면 @code{True}를 반환합니다.
@end deffn

@geindex isframe() (inspect 모듈)
@anchor{library/inspect inspect isframe}@anchor{4a61}
@deffn {함수} inspect.isframe (object)

객체가 프레임이면 @code{True}를 반환합니다.
@end deffn

@geindex iscode() (inspect 모듈)
@anchor{library/inspect inspect iscode}@anchor{4a62}
@deffn {함수} inspect.iscode (object)

객체가 코드이면 @code{True}를 반환합니다.
@end deffn

@geindex isbuiltin() (inspect 모듈)
@anchor{library/inspect inspect isbuiltin}@anchor{4a63}
@deffn {함수} inspect.isbuiltin (object)

객체가 내장 함수나 연결된(bound) 내장 메서드이면 @code{True}를 반환합니다.
@end deffn

@geindex ismethodwrapper() (inspect 모듈)
@anchor{library/inspect inspect ismethodwrapper}@anchor{859}
@deffn {함수} inspect.ismethodwrapper (object)

객체의 형이 @ref{85a,,MethodWrapperType}이면 @code{True}를 반환합니다.

These are instances of @ref{85a,,MethodWrapperType}, such as @ref{82f,,__str__()},
@ref{cf1,,__eq__()} and @ref{82e,,__repr__()}.


Added in version 3.11.

@end deffn

@geindex isroutine() (inspect 모듈)
@anchor{library/inspect inspect isroutine}@anchor{1bdb}
@deffn {함수} inspect.isroutine (object)

객체가 사용자 정의이거나 내장 함수나 메서드이면 @code{True}를 반환합니다.
@end deffn

@geindex isabstract() (inspect 모듈)
@anchor{library/inspect inspect isabstract}@anchor{4a64}
@deffn {함수} inspect.isabstract (object)

객체가 추상 베이스 클래스이면 @code{True}를 반환합니다.
@end deffn

@geindex ismethoddescriptor() (inspect 모듈)
@anchor{library/inspect inspect ismethoddescriptor}@anchor{194f}
@deffn {함수} inspect.ismethoddescriptor (object)

객체가 메서드 디스크립터이면 @code{True}를 반환하지만, @ref{4a5c,,ismethod()}, @ref{4a5b,,isclass()}, @ref{4a5d,,isfunction()} 또는 @ref{4a63,,isbuiltin()}이 참일 때는 그렇지 않습니다.

예를 들어, 이것은 @code{int.__add__}에 대해서 참입니다. 이 테스트를 통과한 객체에는 @ref{16ed,,__get__()} 메서드가 있지만 @ref{23b5,,__set__()} 메서드나 @ref{1950,,__delete__()} 메서드는 없습니다. 하지만 그 외의 어트리뷰트 집합은 달라집니다. @ref{1265,,__name__} 어트리뷰트는 보통 존재하고, @ref{b21,,__doc__}도 종종 그렇습니다.

다른 테스트 중 하나를 통과하는 디스크립터로 구현된 메서드는 @ref{194f,,ismethoddescriptor()} 테스트에서 @code{False}를 반환합니다. 단순히 다른 테스트가 더 많은 것을 약속하기 때문입니다 – 예를 들어, 객체가 @ref{4a5c,,ismethod()}를 통과할 때 @ref{1501,,__func__} 어트리뷰트(등)가 있다고 기대할 수 있습니다.


버전 3.13에서 변경: This function no longer incorrectly reports objects with @ref{16ed,,__get__()}
and @ref{1950,,__delete__()}, but not @ref{23b5,,__set__()}, as being method
descriptors (such objects are data descriptors, not method descriptors).

@end deffn

@geindex isdatadescriptor() (inspect 모듈)
@anchor{library/inspect inspect isdatadescriptor}@anchor{4a65}
@deffn {함수} inspect.isdatadescriptor (object)

객체가 데이터 디스크립터이면 @code{True}를 반환합니다.

데이터 디스크립터에는 @ref{23b5,,__set__}이나 @ref{1950,,__delete__} 메서드가 있습니다. 예는 (파이썬으로 정의한) 프로퍼티, getset 및 멤버입니다. 뒤의 두 가지는 C로 정의되며 해당 형에 대해 더 구체적인 테스트가 있으며, 이는 다른 파이썬 구현에서도 지원됩니다. 일반적으로 데이터 디스크립터는 @ref{1265,,__name__}과 @code{__doc__} 어트리뷰트를 갖지만 (프로퍼티, getet 및 멤버는 이 두 어트리뷰트를 모두 갖습니다), 이것이 보장되지는 않습니다.
@end deffn

@geindex isgetsetdescriptor() (inspect 모듈)
@anchor{library/inspect inspect isgetsetdescriptor}@anchor{4a66}
@deffn {함수} inspect.isgetsetdescriptor (object)

객체가 getset 디스크립터이면 @code{True}를 반환합니다.

getset은 @ref{db1,,PyGetSetDef} 구조체를 통해 확장 모듈에서 정의된 어트리뷰트입니다. 이러한 형이 없는 파이썬 구현에서, 이 메서드는 항상 @code{False}를 반환합니다.
@end deffn

@geindex ismemberdescriptor() (inspect 모듈)
@anchor{library/inspect inspect ismemberdescriptor}@anchor{4a67}
@deffn {함수} inspect.ismemberdescriptor (object)

객체가 멤버 디스크립터이면 @code{True}를 반환합니다.

멤버 디스크립터는 @ref{770,,PyMemberDef} 구조체를 통해 확장 모듈에서 정의된 어트리뷰트입니다. 이러한 형이 없는 파이썬 구현에서, 이 메서드는 항상 @code{False}를 반환합니다.
@end deffn

@node 소스 코드 가져오기,Signature 객체로 콜러블 검사하기,형과 멤버,inspect — 라이브 객체 검사
@anchor{library/inspect inspect-source}@anchor{4a68}@anchor{library/inspect retrieving-source-code}@anchor{4a69}
@subsubsection 소스 코드 가져오기


@geindex getdoc() (inspect 모듈)
@anchor{library/inspect inspect getdoc}@anchor{bec}
@deffn {함수} inspect.getdoc (object)

@ref{1a2c,,cleandoc()}으로 정리된 객체의 독스트링을 가져옵니다. 객체가 독스트링을 제공하지 않고 객체가 클래스, 메서드, 프로퍼티 또는 디스크립터이면, 상속 계층 구조에서 독스트링을 가져옵니다. 독스트링이 유효하지 않거나 누락되었으면 @code{None}을 반환합니다.


버전 3.5에서 변경: 이제 재정의되지 않으면 독스트링이 상속됩니다.

@end deffn

@geindex getcomments() (inspect 모듈)
@anchor{library/inspect inspect getcomments}@anchor{1939}
@deffn {함수} inspect.getcomments (object)

객체의 소스 코드 바로 앞(클래스, 함수 또는 메서드일 때)이나 파이썬 소스 파일의 최상단 (객체가 모듈일 때) 주석 줄들을 단일 문자열로 반환합니다. 객체의 소스 코드를 사용할 수 없으면, @code{None}을 반환합니다. 객체가 C나 대화식 셸에서 정의될 때 이런 일이 일어날 수 있습니다.
@end deffn

@geindex getfile() (inspect 모듈)
@anchor{library/inspect inspect getfile}@anchor{1e81}
@deffn {함수} inspect.getfile (object)

객체가 정의된 (텍스트나 바이너리) 파일의 이름을 반환합니다. 객체가 내장 모듈, 클래스 또는 함수이면 @ref{198,,TypeError}로 실패합니다.
@end deffn

@geindex getmodule() (inspect 모듈)
@anchor{library/inspect inspect getmodule}@anchor{1b6b}
@deffn {함수} inspect.getmodule (object)

객체가 정의된 모듈을 추측합니다. 모듈이 결정될 수 없으면 @code{None}을 반환합니다.
@end deffn

@geindex getsourcefile() (inspect 모듈)
@anchor{library/inspect inspect getsourcefile}@anchor{1b6c}
@deffn {함수} inspect.getsourcefile (object)

객체가 정의된 파이썬 소스 파일의 이름을 반환합니다. 또는 소스를 얻을 수 있는 방법이 없으면 @code{None}을 반환합니다. 객체가 내장 모듈, 클래스 또는 함수이면 @ref{198,,TypeError}로 실패합니다.
@end deffn

@geindex getsourcelines() (inspect 모듈)
@anchor{library/inspect inspect getsourcelines}@anchor{17bd}
@deffn {함수} inspect.getsourcelines (object)

객체의 소스 줄의 리스트와 시작 줄 번호를 반환합니다. 인자는 모듈, 클래스, 메서드, 함수, 트레이스백, 프레임 또는 코드 객체일 수 있습니다. 소스 코드는 객체에 해당하는 줄 리스트로 반환되며 줄 번호는 원본 소스 파일에서 첫 번째 코드 줄이 발견되는 위치를 나타냅니다. 소스 코드를 가져올 수 없으면 @ref{2c0,,OSError}가 발생합니다. 객체가 내장 모듈, 클래스 또는 함수면 @ref{198,,TypeError}가 발생합니다.


버전 3.3에서 변경: @ref{1252,,IOError} 대신 @ref{2c0,,OSError}가 발생합니다. 이제 IOError는 OSError의 별칭입니다.

@end deffn

@geindex getsource() (inspect 모듈)
@anchor{library/inspect inspect getsource}@anchor{17c9}
@deffn {함수} inspect.getsource (object)

객체의 소스 코드 텍스트를 반환합니다. 인자는 모듈, 클래스, 메서드, 함수, 트레이스백, 프레임 또는 코드 객체일 수 있습니다. 소스 코드는 단일 문자열로 반환됩니다. 소스 코드를 가져올 수 없으면 @ref{2c0,,OSError}가 발생합니다. 객체가 내장 모듈, 클래스 또는 함수면 @ref{198,,TypeError}가 발생합니다.


버전 3.3에서 변경: @ref{1252,,IOError} 대신 @ref{2c0,,OSError}가 발생합니다. 이제 IOError는 OSError의 별칭입니다.

@end deffn

@geindex cleandoc() (inspect 모듈)
@anchor{library/inspect inspect cleandoc}@anchor{1a2c}
@deffn {함수} inspect.cleandoc (doc)

코드 블록과 일치하도록 들여쓰기 된 독스트링에서 들여쓰기를 정리합니다.

모든 선행 공백이 첫 번째 줄에서 제거됩니다. 두 번째 줄부터 균일하게 제거할 수 있는 선행 공백이 제거됩니다. 시작과 끝의 빈 줄은 그다음에 제거됩니다. 또한, 모든 탭이 스페이스로 확장됩니다.
@end deffn

@node Signature 객체로 콜러블 검사하기,클래스와 함수<2>,소스 코드 가져오기,inspect — 라이브 객체 검사
@anchor{library/inspect inspect-signature-object}@anchor{4a6a}@anchor{library/inspect introspecting-callables-with-the-signature-object}@anchor{4a6b}
@subsubsection Signature 객체로 콜러블 검사하기



Added in version 3.3.


@ref{4e3,,Signature} 객체는 콜러블 객체의 호출 서명과 반환 값 어노테이션을 나타냅니다. @code{Signature} 객체를 가져오려면, @code{signature()} 함수를 사용하십시오.

@geindex signature() (inspect 모듈)
@anchor{library/inspect inspect signature}@anchor{22f}
@deffn {함수} inspect.signature (callable, *, follow_wrapped=True, globals=None, locals=None, eval_str=False, annotation_format=Format.VALUE)

주어진 `callable'에 대한 @ref{4e3,,Signature} 객체를 반환합니다:

@example
>>> from inspect import signature
>>> def foo(a, *, b:int, **kwargs):
...     pass

>>> sig = signature(foo)

>>> str(sig)
'(a, *, b: int, **kwargs)'

>>> str(sig.parameters['b'])
'b: int'

>>> sig.parameters['b'].annotation
<class 'int'>
@end example

일반 함수와 클래스에서 @ref{217,,functools.partial()} 객체에 이르기까지 광범위한 파이썬 콜러블을 받아들입니다.

If some of the annotations are strings (e.g., because
@code{from __future__ import annotations} was used), @code{signature()} will
attempt to automatically un-stringize the annotations using
@ref{459,,annotationlib.get_annotations()}.  The
`globals', `locals', and `eval_str' parameters are passed
into @code{annotationlib.get_annotations()} when resolving the
annotations; see the documentation for @code{annotationlib.get_annotations()}
for instructions on how to use these parameters. A member of the
@ref{230,,annotationlib.Format} enum can be passed to the
`annotation_format' parameter to control the format of the returned
annotations. For example, use
@code{annotation_format=annotationlib.Format.STRING} to return annotations in string
format.

Raises @ref{2ec,,ValueError} if no signature can be provided, and
@ref{198,,TypeError} if that type of object is not supported.  Also,
if the annotations are stringized, and `eval_str' is not false,
the @code{eval()} call(s) to un-stringize the annotations in @ref{459,,annotationlib.get_annotations()}
could potentially raise any kind of exception.

A slash (/) in the signature of a function denotes that the parameters prior
to it are positional-only. For more info, see
@ref{25d6,,the FAQ entry on positional-only parameters}.


버전 3.5에서 변경: `follow_wrapped' 매개 변수를 추가했습니다. 구체적으로 `callable'의 서명을 가져오려면 @code{False}를 전달하십시오 (데코레이트 된 콜러블의 래핑을 풀기 위해 @code{callable.__wrapped__}를 사용하지 않게 됩니다).



버전 3.10에서 변경: The `globals', `locals', and `eval_str' parameters were added.



버전 3.14에서 변경: The `annotation_format' parameter was added.


@cartouche
@quotation 참고 
특정 파이썬 구현에서 일부 콜러블은 검사할 수 없습니다. 예를 들어, CPython에서, C로 정의된 일부 내장 함수는 인자에 대한 메타 데이터를 제공하지 않습니다.
@end quotation
@end cartouche

`CPython 구현 상세:' If the passed object has a @code{__signature__} attribute,
we may use it to create the signature.
The exact semantics are an implementation detail and are subject to
unannounced changes. Consult the source code for current semantics.
@end deffn

@geindex Signature (inspect 클래스)
@anchor{library/inspect inspect Signature}@anchor{4e3}
@deffn {클래스} inspect.Signature (parameters=None, *, return_annotation=Signature.empty)

@code{Signature} 객체는 함수의 호출 서명과 반환 값 어노테이션을 나타냅니다. 함수가 받아들이는 각 매개 변수에 대해 @ref{4a6c,,parameters} 컬렉션에 @ref{4e4,,Parameter} 객체를 저장합니다.

선택적 `parameters' 인자는 @ref{4e4,,Parameter} 객체의 시퀀스이며, 중복된 이름을 가진 매개 변수가 없는지, 매개 변수가 올바른 순서인지 (즉, 위치 전용이 먼저 온 후, 위치-키워드가 그다음에 오는지), 기본값이 있는 매개 변수가 그렇지 않은 매개 변수 뒤에 오는지 검사합니다.

선택적 `return_annotation' 인자는 임의의 파이썬 객체일 수 있습니다. 콜러블의 “반환 값” 어노테이션을 나타냅니다.

@code{Signature} 객체는 `불변(immutable)'입니다. 수정된 사본을 만들려면 @ref{4a6d,,Signature.replace()}나 @ref{1c0,,copy.replace()}를 사용하십시오.


버전 3.5에서 변경: @code{Signature} 객체는 이제 피클 가능하고 @ref{823,,해시 가능}합니다.


@geindex empty (inspect.Signature의 속성)
@anchor{library/inspect inspect Signature empty}@anchor{4a6e}
@deffn {속성} empty

반환 값 어노테이션이 없음을 지정하는 특수 클래스 수준 마커입니다.
@end deffn

@geindex parameters (inspect.Signature의 속성)
@anchor{library/inspect inspect Signature parameters}@anchor{4a6c}
@deffn {속성} parameters

매개 변수 이름에서 해당 @ref{4e4,,Parameter} 객체로의 순서 있는 매핑. 키워드 전용 매개 변수를 포함하여, 매개 변수는 엄격한 정의 순서대로 나타납니다.


버전 3.7에서 변경: 실제로 파이썬 3에서 항상 유지되었습니다만, 파이썬은 버전 3.7부터 키워드 전용 매개 변수의 선언 순서를 유지한다는 것을 명시적으로 보장합니다.

@end deffn

@geindex return_annotation (inspect.Signature의 속성)
@anchor{library/inspect inspect Signature return_annotation}@anchor{4a6f}
@deffn {속성} return_annotation

콜러블의 “반환 값” 어노테이션. 콜러블에 “반환 값” 어노테이션이 없으면, 이 어트리뷰트는 @ref{4a6e,,Signature.empty}로 설정됩니다.
@end deffn

@geindex bind() (inspect.Signature 메서드)
@anchor{library/inspect inspect Signature bind}@anchor{1894}
@deffn {메서드} bind (*args, **kwargs)

위치와 키워드 인자에서 매개 변수로의 매핑을 만듭니다. @code{*args}와 @code{**kwargs}가 서명과 일치하면 @ref{1268,,BoundArguments}를 반환하고, 그렇지 않으면 @ref{198,,TypeError}를 발생시킵니다.
@end deffn

@geindex bind_partial() (inspect.Signature 메서드)
@anchor{library/inspect inspect Signature bind_partial}@anchor{4a70}
@deffn {메서드} bind_partial (*args, **kwargs)

@ref{1894,,Signature.bind()}와 같은 방식으로 작동하지만, 일부 필수 인자를 생략 할 수 있습니다 (@ref{217,,functools.partial()} 동작을 흉내 냅니다). @ref{1268,,BoundArguments}를 반환하거나, 전달된 인자가 서명과 일치하지 않으면 @ref{198,,TypeError}를 발생시킵니다.
@end deffn

@geindex replace() (inspect.Signature 메서드)
@anchor{library/inspect inspect Signature replace}@anchor{4a6d}
@deffn {메서드} replace (*[, parameters][, return_annotation])

@ref{4a6d,,replace()}가 호출된 인스턴스를 기반으로 새 @ref{4e3,,Signature} 인스턴스를 만듭니다. 다른 `parameters'나 `return_annotation' 또는 둘 모두를 전달하여 기반 서명의 해당 속성을 재정의할 수 있습니다. 복사된 @code{Signature}에서 @code{return_annotation}을 제거하려면, @ref{4a6e,,Signature.empty}를 전달하십시오.

@example
>>> def test(a, b):
...     pass
...
>>> sig = signature(test)
>>> new_sig = sig.replace(return_annotation="new return anno")
>>> str(new_sig)
"(a, b) -> 'new return anno'"
@end example

@code{Signature} objects are also supported by the generic function
@ref{1c0,,copy.replace()}.
@end deffn

@geindex format() (inspect.Signature 메서드)
@anchor{library/inspect inspect Signature format}@anchor{231}
@deffn {메서드} format (*, max_width=None, quote_annotation_strings=True)

@ref{4e3,,Signature} 객체의 문자열 표현을 만듭니다.

If `max_width' is passed, the method will attempt to fit
the signature into lines of at most `max_width' characters.
If the signature is longer than `max_width',
all parameters will be on separate lines.

If `quote_annotation_strings' is False, @ref{15c,,annotations}
in the signature are displayed without opening and closing quotation
marks if they are strings. This is useful if the signature was created with the
@ref{160,,STRING} format or if
@code{from __future__ import annotations} was used.


Added in version 3.13.



버전 3.14에서 변경: The `unquote_annotations' parameter was added.

@end deffn

@geindex from_callable() (inspect.Signature의 클래스 메서드)
@anchor{library/inspect inspect Signature from_callable}@anchor{941}
@deffn {메서드} classmethod from_callable (obj, *, follow_wrapped=True, globals=None, locals=None, eval_str=False)

주어진 콜러블 `obj'에 대한 @ref{4e3,,Signature} (또는 그 서브 클래스) 객체를 반환합니다:

이 메서드는 @ref{4e3,,Signature}의 서브 클래싱을 단순화합니다:

@example
class MySignature(Signature):
    pass
sig = MySignature.from_callable(sum)
assert isinstance(sig, MySignature)
@end example

Its behavior is otherwise identical to that of @ref{22f,,signature()}.


Added in version 3.5.



버전 3.10에서 변경: The `globals', `locals', and `eval_str' parameters were added.

@end deffn
@end deffn

@geindex Parameter (inspect 클래스)
@anchor{library/inspect inspect Parameter}@anchor{4e4}
@deffn {클래스} inspect.Parameter (name, kind, *, default=Parameter.empty, annotation=Parameter.empty)

@code{Parameter} 객체는 `불변(immutable)'입니다. @code{Parameter} 객체를 수정하는 대신, 수정된 사본을 만들려면 @ref{4a71,,Parameter.replace()}나 @ref{1c0,,copy.replace()}를 사용하십시오.


버전 3.5에서 변경: Parameter 객체는 이제 피클 가능하고 @ref{823,,해시 가능}합니다.


@geindex empty (inspect.Parameter의 속성)
@anchor{library/inspect inspect Parameter empty}@anchor{4a72}
@deffn {속성} empty

기본값과 어노테이션이 없음을 지정하는 특수 클래스 수준 마커.
@end deffn

@geindex name (inspect.Parameter의 속성)
@anchor{library/inspect inspect Parameter name}@anchor{4a73}
@deffn {속성} name

문자열로 표현한 매개 변수의 이름. 이름은 유효한 파이썬 식별자여야 합니다.

CPython은 컴프리헨션과 제너레이터 표현식을 구현하는 데 사용되는 코드 객체에서 @code{.0} 형식의 묵시적 매개 변수 이름을 생성합니다.


버전 3.6에서 변경: 이 매개 변수 이름은 이제 이 모듈에서 @code{implicit0}과 같은 이름으로 노출됩니다.

@end deffn

@geindex default (inspect.Parameter의 속성)
@anchor{library/inspect inspect Parameter default}@anchor{4a74}
@deffn {속성} default

매개 변수의 기본값. 매개 변수에 기본값이 없으면, 이 어트리뷰트는 @ref{4a72,,Parameter.empty}로 설정됩니다.
@end deffn

@geindex annotation (inspect.Parameter의 속성)
@anchor{library/inspect inspect Parameter annotation}@anchor{4a75}
@deffn {속성} annotation

매개 변수의 어노테이션. 매개 변수에 어노테이션이 없으면, 이 어트리뷰트는 @ref{4a72,,Parameter.empty}로 설정됩니다.
@end deffn

@geindex kind (inspect.Parameter의 속성)
@anchor{library/inspect inspect Parameter kind}@anchor{4a76}
@deffn {속성} kind

인자 값이 매개 변수에 연결되는 방법을 설명합니다. 가능한 값은 (@code{Parameter.KEYWORD_ONLY}처럼) @ref{4e4,,Parameter}를 통해 액세스할 수 있고, 다음과 같은 순서로 비교와 순서를 지원합니다:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

이름

@tab

의미

@item

`POSITIONAL_ONLY'

@tab

위치 인자로만 값을 제공해야 합니다. 위치 전용 매개 변수는 파이썬 함수 정의에서 @code{/} 항목 (있다면) 앞에 나오는 매개 변수입니다.

@item

`POSITIONAL_OR_KEYWORD'

@tab

값은 키워드나 위치 인자로 제공될 수 있습니다 (이것이 파이썬으로 구현된 함수의 표준 연결 동작입니다).

@item

`VAR_POSITIONAL'

@tab

다른 매개 변수에 연결되지 않은 위치 인자의 튜플. 이것은 파이썬 함수 정의의 @code{*args} 매개 변수에 해당합니다.

@item

`KEYWORD_ONLY'

@tab

키워드 인자로만 값을 제공해야 합니다. 키워드 전용 매개 변수는 파이썬 함수 정의에서 @code{*}나 @code{*args} 항목 다음에 나오는 매개 변수입니다.

@item

`VAR_KEYWORD'

@tab

다른 매개 변수에 연결되지 않은 키워드 인자의 딕셔너리. 이것은 파이썬 함수 정의의 @code{**kwargs} 매개 변수에 해당합니다.

@end multitable


예: 기본값이 없는 모든 키워드 전용 인자를 인쇄합니다:

@example
>>> def foo(a, b, *, c, d=10):
...     pass

>>> sig = signature(foo)
>>> for param in sig.parameters.values():
...     if (param.kind == param.KEYWORD_ONLY and
...                        param.default is param.empty):
...         print('Parameter:', param)
Parameter: c
@end example
@end deffn

@geindex description (inspect.Parameter.kind의 속성)
@anchor{library/inspect inspect Parameter kind description}@anchor{4a77}
@deffn {속성} kind.description

@ref{4a76,,Parameter.kind}의 열거형 값을 설명합니다.


Added in version 3.8.


예: 모든 인자의 설명을 인쇄합니다:

@example
>>> def foo(a, b, *, c, d=10):
...     pass

>>> sig = signature(foo)
>>> for param in sig.parameters.values():
...     print(param.kind.description)
positional or keyword
positional or keyword
keyword-only
keyword-only
@end example
@end deffn

@geindex replace() (inspect.Parameter 메서드)
@anchor{library/inspect inspect Parameter replace}@anchor{4a71}
@deffn {메서드} replace (*[, name][, kind][, default][, annotation])

replace가 호출된 인스턴스를 기반으로 새 @ref{4e4,,Parameter} 인스턴스를 만듭니다. @code{Parameter} 어트리뷰트를 재정의하려면, 해당 인자를 전달하십시오. @code{Parameter}에서 기본값이나 어노테이션, 또는 둘 다 제거하려면 @ref{4a72,,Parameter.empty}를 전달하십시오.

@example
>>> from inspect import Parameter
>>> param = Parameter('foo', Parameter.KEYWORD_ONLY, default=42)
>>> str(param)
'foo=42'

>>> str(param.replace()) # 'param'의 얕은 사본을 만듭니다
'foo=42'

>>> str(param.replace(default=Parameter.empty, annotation='spam'))
"foo: 'spam'"
@end example

@ref{4e4,,Parameter} objects are also supported by the generic function
@ref{1c0,,copy.replace()}.
@end deffn


버전 3.4에서 변경: 파이썬 3.3에서, @code{kind}가 @code{POSITIONAL_ONLY}로 설정되었을 때 @ref{4e4,,Parameter} 객체의 @code{name}을 @code{None}으로 설정할 수 있었습니다. 이는 더는 허용되지 않습니다.

@end deffn

@geindex BoundArguments (inspect 클래스)
@anchor{library/inspect inspect BoundArguments}@anchor{1268}
@deffn {클래스} inspect.BoundArguments

@ref{1894,,Signature.bind()}나 @ref{4a70,,Signature.bind_partial()} 호출의 결과. 인자에서 함수의 매개 변수로의 매핑을 보관합니다.

@geindex arguments (inspect.BoundArguments의 속성)
@anchor{library/inspect inspect BoundArguments arguments}@anchor{b08}
@deffn {속성} arguments

매개 변수 이름에서 인자 값으로의 가변 매핑. 명시적으로 연결된 인자만 포함합니다. @ref{b08,,arguments}의 변경 사항은 @ref{4a78,,args}와 @ref{4a79,,kwargs}에 반영됩니다.

인자 처리 목적으로 @ref{4a6c,,Signature.parameters}와 함께 사용해야 합니다.

@cartouche
@quotation 참고 
@ref{1894,,Signature.bind()}나 @ref{4a70,,Signature.bind_partial()}이 기본값에 의존하는 인자는 건너뜁니다. 그러나, 필요하다면 @ref{1015,,BoundArguments.apply_defaults()}를 사용하여 추가하십시오.
@end quotation
@end cartouche


버전 3.9에서 변경: @ref{b08,,arguments}는 이제 @ref{183,,dict} 형입니다. 이전에는, @ref{7f2,,collections.OrderedDict} 형이었습니다.

@end deffn

@geindex args (inspect.BoundArguments의 속성)
@anchor{library/inspect inspect BoundArguments args}@anchor{4a78}
@deffn {속성} args

위치 인자 값의 튜플. @ref{b08,,arguments} 어트리뷰트에서 동적으로 계산됩니다.
@end deffn

@geindex kwargs (inspect.BoundArguments의 속성)
@anchor{library/inspect inspect BoundArguments kwargs}@anchor{4a79}
@deffn {속성} kwargs

키워드 인자 값의 딕셔너리. @ref{b08,,arguments} 어트리뷰트에서 동적으로 계산됩니다. 위치적으로 전달될 수 있는 인자는 대신 @ref{4a78,,args}에 포함됩니다.
@end deffn

@geindex signature (inspect.BoundArguments의 속성)
@anchor{library/inspect inspect BoundArguments signature}@anchor{4a7a}
@deffn {속성} signature

부모 @ref{4e3,,Signature} 객체에 대한 참조.
@end deffn

@geindex apply_defaults() (inspect.BoundArguments 메서드)
@anchor{library/inspect inspect BoundArguments apply_defaults}@anchor{1015}
@deffn {메서드} apply_defaults ()

누락된 인자에 대한 기본값을 설정합니다.

가변 위치 인자(@code{*args})의 기본값은 빈 튜플입니다.

가변 변수 키워드 인자(@code{**kwargs})의 기본값은 빈 딕셔너리입니다.

@example
>>> def foo(a, b='ham', *args): pass
>>> ba = inspect.signature(foo).bind('spam')
>>> ba.apply_defaults()
>>> ba.arguments
@{'a': 'spam', 'b': 'ham', 'args': ()@}
@end example


Added in version 3.5.

@end deffn

@ref{4a78,,args}와 @ref{4a79,,kwargs} 프로퍼티를 사용하여 함수를 호출할 수 있습니다:

@example
def test(a, *, b):
    ...

sig = signature(test)
ba = sig.bind(10, b=20)
test(*ba.args, **ba.kwargs)
@end example
@end deffn


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 362

@item PEP 362@footnote{https://peps.python.org/pep-0362/} - 함수 Signature 객체.

자세한 명세, 구현 세부 사항 및 예
@end table


@node 클래스와 함수<2>,인터프리터 스택,Signature 객체로 콜러블 검사하기,inspect — 라이브 객체 검사
@anchor{library/inspect classes-and-functions}@anchor{4a7b}@anchor{library/inspect inspect-classes-functions}@anchor{4a7c}
@subsubsection 클래스와 함수


@geindex getclasstree() (inspect 모듈)
@anchor{library/inspect inspect getclasstree}@anchor{4a7d}
@deffn {함수} inspect.getclasstree (classes, unique=False)

주어진 클래스 리스트를 중첩된 리스트의 계층 구조로 배치합니다. 중첩된 리스트가 나타나면, 리스트 바로 앞에 나오는 항목의 클래스에서 파생된 클래스를 포함합니다. 각 항목은 클래스와 베이스 클래스의 튜플을 포함하는 2-튜플입니다. `unique' 인자가 참이면, 주어진 리스트의 각 클래스가 반환된 구조에 정확히 하나의 항목으로 나타납니다. 그렇지 않으면, 다중 상속을 사용하는 클래스와 그 자식들이 여러 번 나타납니다.
@end deffn

@geindex getfullargspec() (inspect 모듈)
@anchor{library/inspect inspect getfullargspec}@anchor{940}
@deffn {함수} inspect.getfullargspec (func)

파이썬 함수 매개 변수의 이름과 기본값을 가져옵니다. @ref{85d,,네임드 튜플}이 반환됩니다:

@code{FullArgSpec(args, varargs, varkw, defaults, kwonlyargs, kwonlydefaults,
annotations)}

`args'는 위치 매개 변수 이름의 리스트입니다. `varargs'는 @code{*} 매개 변수의 이름이거나 임의의 위치 인자가 허용되지 않으면 @code{None}입니다. `varkw'는 @code{**} 매개 변수의 이름이거나 임의의 키워드 인자가 허용되지 않으면 @code{None}입니다. `defaults'는 마지막 `n' 개의 위치 매개 변수에 해당하는 기본 인자 값의 `n'-튜플이거나, 이러한 기본값이 정의되지 않으면 @code{None}입니다. `kwonlyargs'는 선언 순서를 따르는 키워드 전용 매개 변수 이름 리스트입니다. `kwonlydefaults'는 `kwonlyargs'의 매개 변수 이름에서 인자가 제공되지 않을 때 사용되는 기본값으로의 딕셔너리 매핑입니다. `annotations'는 매개 변수 이름에서 어노테이션으로의 딕셔너리 매핑입니다. 특수키 @code{"return"}은 함수 반환 값 어노테이션(있다면)을 보고하는 데 사용됩니다.

@ref{22f,,signature()}와 @ref{4a6a,,Signature 객체}가 콜러블 내부 검사에 권장되는 API를 제공하고, 확장 모듈 API에서 종종 등장하는 추가 동작(위치 전용 인자와 같은)을 지원함에 유의하십시오. 이 함수는 주로 파이썬 2 @code{inspect} 모듈 API와의 호환성을 유지해야 하는 코드에서 사용하기 위해 유지됩니다.


버전 3.4에서 변경: 이 함수는 이제 @ref{22f,,signature()}를 기반으로 하지만, 여전히 @code{__wrapped__} 어트리뷰트를 무시하고 연결된(bound) 메서드의 서명 출력에 이미 연결된 첫 번째 매개 변수를 포함합니다.



버전 3.6에서 변경: This method was previously documented as deprecated in favour of
@ref{22f,,signature()} in Python 3.5, but that decision has been reversed
in order to restore a clearly supported standard interface for
single-source Python 2/3 code migrating away from the legacy
@code{getargspec()} API.



버전 3.7에서 변경: 실제로 파이썬 3에서 항상 유지되었습니다만, 파이썬은 버전 3.7부터 키워드 전용 매개 변수의 선언 순서를 유지한다는 것을 명시적으로 보장합니다.

@end deffn

@geindex getargvalues() (inspect 모듈)
@anchor{library/inspect inspect getargvalues}@anchor{10be}
@deffn {함수} inspect.getargvalues (frame)

특정 프레임으로 전달된 인자에 대한 정보를 얻습니다. @ref{85d,,네임드 튜플} @code{ArgInfo(args, varargs, keywords, locals)}가 반환됩니다. `args'는 인자 이름의 리스트입니다. `varargs'와 `keywords'는 @code{*}와 @code{**} 인자의 이름이거나 @code{None}입니다. `locals'는 주어진 프레임의 지역 딕셔너리입니다.

@cartouche
@quotation 참고 
이 함수는 실수로 파이썬 3.5에서 폐지된 것으로 표시되었습니다.
@end quotation
@end cartouche
@end deffn

@geindex formatargvalues() (inspect 모듈)
@anchor{library/inspect inspect formatargvalues}@anchor{10bf}
@deffn {함수} inspect.formatargvalues (args[, varargs, varkw, locals, formatarg, formatvarargs, formatvarkw, formatvalue])

@ref{10be,,getargvalues()}가 반환한 4개의 값으로 예쁜 인자 명세를 포맷합니다. format* 인자는 해당 이름과 값을 문자열로 변환하기 위해 호출되는 선택적 포매팅 함수입니다.

@cartouche
@quotation 참고 
이 함수는 실수로 파이썬 3.5에서 폐지된 것으로 표시되었습니다.
@end quotation
@end cartouche
@end deffn

@geindex getmro() (inspect 모듈)
@anchor{library/inspect inspect getmro}@anchor{4a7e}
@deffn {함수} inspect.getmro (cls)

클래스 cls의 베이스 클래스의 튜플(cls를 포함합니다)을 메서드 결정 순서로 반환합니다. 이 튜플에는 클래스가 두 번 이상 나타나지 않습니다. 메서드 결정 순서는 cls의 형에 따라 다릅니다. 매우 독특한 사용자 정의 메타 형을 사용하지 않는 한, cls는 튜플의 첫 번째 요소가 됩니다.
@end deffn

@geindex getcallargs() (inspect 모듈)
@anchor{library/inspect inspect getcallargs}@anchor{10bd}
@deffn {함수} inspect.getcallargs (func, /, *args, **kwds)

`args'와 `kwds'를 마치 이들로 호출된 것처럼 파이썬 함수나 메서드 `func'의 인자 이름에 연결합니다. 연결된 메서드의 경우, 첫 번째 인자(일반적으로 @code{self}라고 합니다)도 해당 인스턴스에 연결합니다. 인자 이름(있다면, @code{*}와 @code{**} 인자의 이름도 포함합니다)을 `args'와 `kwds'의 값으로 매핑하는 딕셔너리가 반환됩니다. `func'를 잘못 호출하는 경우, 즉 호환되지 않는 서명으로 인해 @code{func(*args, **kwds)}가 예외를 발생시키게 될 때마다, 같은 형의 예외가 같거나 유사한 메시지로 발생합니다. 예를 들면:

@example
>>> from inspect import getcallargs
>>> def f(a, b=1, *pos, **named):
...     pass
...
>>> getcallargs(f, 1, 2, 3) == @{'a': 1, 'named': @{@}, 'b': 2, 'pos': (3,)@}
True
>>> getcallargs(f, a=2, x=4) == @{'a': 2, 'named': @{'x': 4@}, 'b': 1, 'pos': ()@}
True
>>> getcallargs(f)
Traceback (most recent call last):
...
TypeError: f() missing 1 required positional argument: 'a'
@end example


Added in version 3.2.



버전 3.5부터 폐지됨: 대신 @ref{1894,,Signature.bind()}와 @ref{4a70,,Signature.bind_partial()}을 사용하십시오.

@end deffn

@geindex getclosurevars() (inspect 모듈)
@anchor{library/inspect inspect getclosurevars}@anchor{12da}
@deffn {함수} inspect.getclosurevars (func)

파이썬 함수나 메서드 `func'에 있는 외부 이름 참조에서 현재 값으로의 매핑을 얻습니다. @ref{85d,,네임드 튜플} @code{ClosureVars(nonlocals, globals, builtins, unbound)}가 반환됩니다. `nonlocals'는 참조된 이름을 어휘 클로저(closure) 변수로, `globals'는 함수의 모듈 전역으로, `builtins'는 함수 바디에서 볼 수 있는 내장으로 매핑합니다. `unbound'는 현재 모듈 전역과 내장에서 전혀 결정할 수 없는 함수에서 참조된 이름 집합입니다.

`func'가 파이썬 함수나 메서드가 아니면 @ref{198,,TypeError}가 발생합니다.


Added in version 3.3.

@end deffn

@geindex unwrap() (inspect 모듈)
@anchor{library/inspect inspect unwrap}@anchor{115b}
@deffn {함수} inspect.unwrap (func, *, stop=None)

`func'로 래핑 된 객체를 가져옵니다. 체인의 마지막 객체를 반환하는 @code{__wrapped__} 어트리뷰트의 체인을 따라갑니다.

`stop'은 래퍼 체인의 객체를 유일한 인자로 받아들이는 선택적 콜백으로, 콜백이 참값을 반환할 때 언 래핑을 조기에 종료 할 수 있도록 합니다. 콜백이 참값을 반환하지 않으면, 체인의 마지막 객체가 평소처럼 반환됩니다. 예를 들어, @ref{22f,,signature()}는 이것을 사용하여 체인에 있는 객체에 @code{__signature__} 어트리뷰트가 정의되면 언 래핑을 중지합니다.

순환이 발견되면 @ref{2ec,,ValueError}가 발생합니다.


Added in version 3.4.

@end deffn

@geindex get_annotations() (inspect 모듈)
@anchor{library/inspect inspect get_annotations}@anchor{a14}
@deffn {함수} inspect.get_annotations (obj, *, globals=None, locals=None, eval_str=False, format=annotationlib.Format.VALUE)

Compute the annotations dict for an object.

This is an alias for @ref{459,,annotationlib.get_annotations()}; see the documentation
of that function for more information.

@cartouche
@quotation 조심 
This function may execute arbitrary code contained in annotations.
See @ref{4556,,Security implications of introspecting annotations} for more information.
@end quotation
@end cartouche


Added in version 3.10.



버전 3.14에서 변경: This function is now an alias for @ref{459,,annotationlib.get_annotations()}.
Calling it as @code{inspect.get_annotations} will continue to work.

@end deffn

@node 인터프리터 스택,정적으로 어트리뷰트 가져오기,클래스와 함수<2>,inspect — 라이브 객체 검사
@anchor{library/inspect inspect-stack}@anchor{4a7f}@anchor{library/inspect the-interpreter-stack}@anchor{4a80}
@subsubsection 인터프리터 스택


Some of the following functions return
@ref{85b,,FrameInfo} objects. For backwards compatibility these objects allow
tuple-like operations on all attributes except @code{positions}. This behavior
is considered deprecated and may be removed in the future.

@geindex FrameInfo (inspect 클래스)
@anchor{library/inspect inspect FrameInfo}@anchor{85b}
@deffn {클래스} inspect.FrameInfo

@geindex frame (inspect.FrameInfo의 속성)
@anchor{library/inspect inspect FrameInfo frame}@anchor{4a81}
@deffn {속성} frame

The @ref{8ee,,frame object} that the record corresponds to.
@end deffn

@geindex filename (inspect.FrameInfo의 속성)
@anchor{library/inspect inspect FrameInfo filename}@anchor{4a82}
@deffn {속성} filename

The file name associated with the code being executed by the frame this record
corresponds to.
@end deffn

@geindex lineno (inspect.FrameInfo의 속성)
@anchor{library/inspect inspect FrameInfo lineno}@anchor{4a83}
@deffn {속성} lineno

The line number of the current line associated with the code being
executed by the frame this record corresponds to.
@end deffn

@geindex function (inspect.FrameInfo의 속성)
@anchor{library/inspect inspect FrameInfo function}@anchor{4a84}
@deffn {속성} function

The function name that is being executed by the frame this record corresponds to.
@end deffn

@geindex code_context (inspect.FrameInfo의 속성)
@anchor{library/inspect inspect FrameInfo code_context}@anchor{4a85}
@deffn {속성} code_context

A list of lines of context from the source code that’s being executed by the frame
this record corresponds to.
@end deffn

@geindex index (inspect.FrameInfo의 속성)
@anchor{library/inspect inspect FrameInfo index}@anchor{4a86}
@deffn {속성} index

The index of the current line being executed in the @ref{4a85,,code_context} list.
@end deffn

@geindex positions (inspect.FrameInfo의 속성)
@anchor{library/inspect inspect FrameInfo positions}@anchor{4a87}
@deffn {속성} positions

A @ref{1941,,dis.Positions} object containing the start line number, end line
number, start column offset, and end column offset associated with the
instruction being executed by the frame this record corresponds to.
@end deffn


버전 3.5에서 변경: @ref{610,,tuple} 대신 @ref{85d,,네임드 튜플}을 반환합니다.



버전 3.11에서 변경: @code{FrameInfo} is now a class instance
(that is backwards compatible with the previous @ref{85d,,named tuple}).

@end deffn

@geindex Traceback (inspect 클래스)
@anchor{library/inspect inspect Traceback}@anchor{85c}
@deffn {클래스} inspect.Traceback

@geindex filename (inspect.Traceback의 속성)
@anchor{library/inspect inspect Traceback filename}@anchor{4a88}
@deffn {속성} filename

The file name associated with the code being executed by the frame this traceback
corresponds to.
@end deffn

@geindex lineno (inspect.Traceback의 속성)
@anchor{library/inspect inspect Traceback lineno}@anchor{4a89}
@deffn {속성} lineno

The line number of the current line associated with the code being
executed by the frame this traceback corresponds to.
@end deffn

@geindex function (inspect.Traceback의 속성)
@anchor{library/inspect inspect Traceback function}@anchor{4a8a}
@deffn {속성} function

The function name that is being executed by the frame this traceback corresponds to.
@end deffn

@geindex code_context (inspect.Traceback의 속성)
@anchor{library/inspect inspect Traceback code_context}@anchor{4a8b}
@deffn {속성} code_context

A list of lines of context from the source code that’s being executed by the frame
this traceback corresponds to.
@end deffn

@geindex index (inspect.Traceback의 속성)
@anchor{library/inspect inspect Traceback index}@anchor{4a8c}
@deffn {속성} index

The index of the current line being executed in the @ref{4a8b,,code_context} list.
@end deffn

@geindex positions (inspect.Traceback의 속성)
@anchor{library/inspect inspect Traceback positions}@anchor{4a8d}
@deffn {속성} positions

A @ref{1941,,dis.Positions} object containing the start line number, end
line number, start column offset, and end column offset associated with
the instruction being executed by the frame this traceback corresponds
to.
@end deffn


버전 3.11에서 변경: @code{Traceback} is now a class instance
(that is backwards compatible with the previous @ref{85d,,named tuple}).

@end deffn

@cartouche
@quotation 참고 
이러한 함수가 반환하는 프레임 레코드의 첫 번째 요소에서 발견되는 것처럼, 프레임 객체에 대한 참조를 유지하면 프로그램이 참조 순환을 만들 수 있습니다. 일단 참조 순환이 생성되면, 파이썬의 선택적 순환 검출기가 활성화되어 있어도, 순환을 형성하는 객체에서 액세스 할 수 있는 모든 객체의 수명이 훨씬 더 길어질 수 있습니다. 이러한 순환을 만들어야만 하면, 명시적으로 끊어서 객체의 지연된 파괴와 메모리 소비 증가를 피하는 것이 중요합니다.

순환 감지기가 이를 잡기는 하겠지만, @ref{1b0,,finally} 절에서 순환을 제거하여 프레임(과 지역 변수)의 파괴를 결정적(deterministic)으로 만들 수 있습니다. 파이썬을 컴파일할 때나 @ref{4a4d,,gc.disable()}을 사용해서 순환 감지기를 비활성화했을 때도 중요합니다. 예를 들면:

@example
def handle_stackframe_without_leak():
    frame = inspect.currentframe()
    try:
        # frame으로 뭔가 합니다
    finally:
        del frame
@end example

프레임을 계속 유지하려면 (예를 들어 나중에 트레이스백을 인쇄하려고) @ref{584,,frame.clear()} 메서드를 사용하여 참조 순환을 끊을 수도 있습니다.
@end quotation
@end cartouche

이 함수들 대부분이 지원하는 선택적 `context' 인자는 반환할 문맥(context) 줄 수를 지정합니다. 이 줄들은 현재 줄을 중심으로 합니다.

@geindex getframeinfo() (inspect 모듈)
@anchor{library/inspect inspect getframeinfo}@anchor{85e}
@deffn {함수} inspect.getframeinfo (frame, context=1)

프레임이나 트레이스백 객체에 대한 정보를 얻습니다. @ref{85c,,Traceback} 객체가 반환됩니다.


버전 3.11에서 변경: A @ref{85c,,Traceback} object is returned instead of a named tuple.

@end deffn

@geindex getouterframes() (inspect 모듈)
@anchor{library/inspect inspect getouterframes}@anchor{85f}
@deffn {함수} inspect.getouterframes (frame, context=1)

frame과 모든 외부(outer) 프레임에 대한 @ref{85b,,FrameInfo} 객체 리스트를 얻습니다. 이 프레임들은 `frame'을 만들도록 한 호출을 나타냅니다. 반환된 리스트의 첫 번째 항목은 `frame'을 나타냅니다; 마지막 항목은 `frame'의 스택에서 가장 바깥쪽 호출을 나타냅니다.


버전 3.5에서 변경: @ref{85d,,네임드 튜플} @code{FrameInfo(frame, filename, lineno, function, code_context, index)}의 리스트가 반환됩니다.



버전 3.11에서 변경: A list of @ref{85b,,FrameInfo} objects is returned.

@end deffn

@geindex getinnerframes() (inspect 모듈)
@anchor{library/inspect inspect getinnerframes}@anchor{860}
@deffn {함수} inspect.getinnerframes (traceback, context=1)

traceback의 프레임과 모든 내부(inner) 프레임에 대한 @ref{85b,,FrameInfo} 객체 리스트를 얻습니다. 이 프레임들은 `frame'의 결과로 만들어진 호출을 나타냅니다. 리스트의 첫 번째 항목은 `traceback'을 나타냅니다; 마지막 항목은 예외가 발생한 위치를 나타냅니다.


버전 3.5에서 변경: @ref{85d,,네임드 튜플} @code{FrameInfo(frame, filename, lineno, function, code_context, index)}의 리스트가 반환됩니다.



버전 3.11에서 변경: A list of @ref{85b,,FrameInfo} objects is returned.

@end deffn

@geindex currentframe() (inspect 모듈)
@anchor{library/inspect inspect currentframe}@anchor{8f0}
@deffn {함수} inspect.currentframe ()

호출자의 스택 프레임에 대한 프레임 객체를 반환합니다.

이 함수는 인터프리터의 파이썬 스택 프레임 지원에 의존하며, 모든 파이썬 구현에서 제공된다고 보장되는 것은 아닙니다. 파이썬 스택 프레임 지원이 없는 구현에서 실행하면, 이 함수는 @code{None}을 반환합니다.
@end deffn

@geindex stack() (inspect 모듈)
@anchor{library/inspect inspect stack}@anchor{861}
@deffn {함수} inspect.stack (context=1)

호출자의 스택에 대한 @ref{85b,,FrameInfo} 객체 리스트를 반환합니다. 반환된 리스트의 첫 번째 항목은 호출자를 나타냅니다; 마지막 항목은 스택에서 가장 바깥쪽 호출을 나타냅니다.


버전 3.5에서 변경: @ref{85d,,네임드 튜플} @code{FrameInfo(frame, filename, lineno, function, code_context, index)}의 리스트가 반환됩니다.



버전 3.11에서 변경: A list of @ref{85b,,FrameInfo} objects is returned.

@end deffn

@geindex trace() (inspect 모듈)
@anchor{library/inspect inspect trace}@anchor{862}
@deffn {함수} inspect.trace (context=1)

현재 프레임과 현재 처리 중인 예외가 발생한 프레임 사이의 스택에 대한 @ref{85b,,FrameInfo} 객체 리스트를 반환합니다. 리스트의 첫 번째 항목은 호출자를 나타냅니다; 마지막 항목은 예외가 발생한 위치를 나타냅니다.


버전 3.5에서 변경: @ref{85d,,네임드 튜플} @code{FrameInfo(frame, filename, lineno, function, code_context, index)}의 리스트가 반환됩니다.



버전 3.11에서 변경: A list of @ref{85b,,FrameInfo} objects is returned.

@end deffn

@node 정적으로 어트리뷰트 가져오기,제너레이터 코루틴 및 비동기 제너레이터의 현재 상태,인터프리터 스택,inspect — 라이브 객체 검사
@anchor{library/inspect fetching-attributes-statically}@anchor{4a8e}
@subsubsection 정적으로 어트리뷰트 가져오기


@ref{dc9,,getattr()}과 @ref{6f8,,hasattr()}은 모두 어트리뷰트를 가져오거나 존재하는지 확인할 때 코드 실행을 유발할 수 있습니다. 프로퍼티와 같은 디스크립터가 호출되고 @ref{6f9,,__getattr__()}과 @ref{dca,,__getattribute__()}가 호출될 수 있습니다.

문서화 도구처럼 수동적인(passive) 검사를 원할 때는 불편할 수 있습니다. @ref{6bb,,getattr_static()}은 @ref{dc9,,getattr()}과 같은 서명을 갖지만 어트리뷰트를 가져올 때 코드 실행을 피합니다.

@geindex getattr_static() (inspect 모듈)
@anchor{library/inspect inspect getattr_static}@anchor{6bb}
@deffn {함수} inspect.getattr_static (obj, attr, default=None)

디스크립터 프로토콜, @ref{6f9,,__getattr__()} 또는 @ref{dca,,__getattribute__()}를 통한 동적 조회를 일으키지 않고 어트리뷰트를 조회합니다.

참고: 이 함수는 getattr이 가져올 수 있는 모든 어트리뷰트를 조회하지 못할 수 있으며 (가령 동적으로 만들어진 어트리뷰트), getattr이 가져올 수 없는 어트리뷰트를 찾을 수 있습니다 (가령 AttributeError를 발생시키는 디스크립터). 또한 인스턴스 멤버 대신 디스크립터 객체를 반환할 수도 있습니다.

인스턴스 @ref{77c,,__dict__}가 다른 멤버(예를 들어 프로퍼티)에 의해 가려지면 이 함수는 인스턴스 멤버를 찾을 수 없습니다.


Added in version 3.2.

@end deffn

@ref{6bb,,getattr_static()}은 디스크립터를 해석하지 않습니다, 예를 들어 C로 구현된 객체의 슬롯 디스크립터나 getset 디스크립터. 하부 어트리뷰트 대신 디스크립터 객체가 반환됩니다.

다음과 같은 코드로 이를 처리할 수 있습니다. 임의의 getset 디스크립터에 대해 이를 호출하면 코드 실행이 유발될 수 있음에 유의하십시오:

@example
# 내장 디스크립터 형을 해석하기 위한 예제 코드
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:
        # 디스크립터는 AttributeError를 발생 시켜
        # 하부 값이 없음을 나타냅니다.
        # 이 경우 디스크립터 자체가
        # 수행해야 합니다.
        pass
@end example

@node 제너레이터 코루틴 및 비동기 제너레이터의 현재 상태,코드 객체 비트 플래그,정적으로 어트리뷰트 가져오기,inspect — 라이브 객체 검사
@anchor{library/inspect current-state-of-generators-coroutines-and-asynchronous-generators}@anchor{4a8f}
@subsubsection 제너레이터, 코루틴 및 비동기 제너레이터의 현재 상태


코루틴 스케줄러를 구현할 때와 기타 제너레이터의 고급 사용을 위해, 제너레이터가 현재 실행 중인지, 시작, 재개 또는 실행을 대기하는 중인지, 또는 이미 종료되었는지를 판별하는 것이 유용합니다. @ref{143b,,getgeneratorstate()}를 사용하면 제너레이터의 현재 상태를 쉽게 확인할 수 있습니다.

@geindex getgeneratorstate() (inspect 모듈)
@anchor{library/inspect inspect getgeneratorstate}@anchor{143b}
@deffn {함수} inspect.getgeneratorstate (generator)

제너레이터-이터레이터의 현재 상태를 가져옵니다.

가능한 상태는 다음과 같습니다:


@itemize *

@item 
GEN_CREATED: 실행 시작을 기다리는 중입니다.

@item 
GEN_RUNNING: 현재 인터프리터에서 실행 중입니다.

@item 
GEN_SUSPENDED: 현재 일드(yield) 표현식에서 일시 중지되었습니다.

@item 
GEN_CLOSED: 실행이 완료되었습니다.
@end itemize


Added in version 3.2.

@end deffn

@geindex getcoroutinestate() (inspect 모듈)
@anchor{library/inspect inspect getcoroutinestate}@anchor{1019}
@deffn {함수} inspect.getcoroutinestate (coroutine)

코루틴 객체의 현재 상태를 가져옵니다. 이 함수는 @ref{7ec,,async def} 함수가 만든 코루틴 객체와 함께 사용하기 위한 것이지만, @code{cr_running}과 @code{cr_frame} 어트리뷰트가 있는 임의의 코루틴류 객체를 허용합니다.

가능한 상태는 다음과 같습니다:


@itemize *

@item 
CORO_CREATED: 실행 시작을 기다리는 중입니다.

@item 
CORO_RUNNING: 현재 인터프리터에서 실행 중입니다.

@item 
CORO_SUSPENDED: 현재 어웨이트(await) 표현식에서 일시 중지되었습니다.

@item 
CORO_CLOSED: 실행이 완료되었습니다.
@end itemize


Added in version 3.5.

@end deffn

@geindex getasyncgenstate() (inspect 모듈)
@anchor{library/inspect inspect getasyncgenstate}@anchor{6b9}
@deffn {함수} inspect.getasyncgenstate (agen)

비동기 제너레이터 객체의 현재 상태를 가져옵니다. 이 함수는 @ref{bc1,,yield} 문을 사용하는 @ref{7ec,,async def} 함수가 만든 비동기 이터레이터 객체와 함께 사용하기 위한 것이지만, @code{ag_running}과 @code{ag_frame} 어트리뷰트가 있는 임의의 비동기 제너레이터류 객체를 허용합니다.

가능한 상태는 다음과 같습니다:


@itemize *

@item 
AGEN_CREATED: 실행 시작을 기다리는 중입니다.

@item 
AGEN_RUNNING: 현재 인터프리터에서 실행 중입니다.

@item 
AGEN_SUSPENDED: 현재 일드(yield) 표현식에서 일시 중지되었습니다.

@item 
AGEN_CLOSED: 실행이 완료되었습니다.
@end itemize


Added in version 3.12.

@end deffn

제너레이터의 현재 내부 상태도 조회할 수 있습니다. 이는 주로 내부 상태가 예상대로 갱신되었는지 확인하는 테스트 목적으로 유용합니다:

@geindex getgeneratorlocals() (inspect 모듈)
@anchor{library/inspect inspect getgeneratorlocals}@anchor{12db}
@deffn {함수} inspect.getgeneratorlocals (generator)

`generator'의 라이브 로컬 변수에서 그것의 현재 값으로의 매핑을 얻습니다. 변수 이름을 값으로 매핑하는 딕셔너리가 반환됩니다. 이것은 제너레이터 바디에서 @ref{46f,,locals()}를 호출하는 것과 동등하며, 같은 경고가 모두 적용됩니다.

`generator'가 현재 연결된 프레임이 없는 @ref{1260,,제너레이터}이면, 빈 딕셔너리가 반환됩니다. `generator'가 파이썬 제너레이터 객체가 아니면 @ref{198,,TypeError}가 발생합니다.

이 함수는 내부 검사를 위해 파이썬 스택 프레임을 노출하는 제너레이터에 의존하며, 모든 파이썬 구현에서 보장되는 것은 아닙니다. 그럴 경우, 이 함수는 항상 빈 딕셔너리를 반환합니다.


Added in version 3.3.

@end deffn

@geindex getcoroutinelocals() (inspect 모듈)
@anchor{library/inspect inspect getcoroutinelocals}@anchor{1018}
@deffn {함수} inspect.getcoroutinelocals (coroutine)

이 함수는 @ref{12db,,getgeneratorlocals()}와 유사하지만, @ref{7ec,,async def} 함수가 만든 코루틴 객체에 작동합니다.


Added in version 3.5.

@end deffn

@geindex getasyncgenlocals() (inspect 모듈)
@anchor{library/inspect inspect getasyncgenlocals}@anchor{6ba}
@deffn {함수} inspect.getasyncgenlocals (agen)

이 함수는 @ref{12db,,getgeneratorlocals()}와 유사하지만, @ref{bc1,,yield} 문을 사용하는 @ref{7ec,,async def} 함수가 만든 비동기 제너레이터 객체에 작동합니다.


Added in version 3.12.

@end deffn

@node 코드 객체 비트 플래그,Buffer flags,제너레이터 코루틴 및 비동기 제너레이터의 현재 상태,inspect — 라이브 객체 검사
@anchor{library/inspect code-objects-bit-flags}@anchor{4a90}@anchor{library/inspect inspect-module-co-flags}@anchor{2392}
@subsubsection 코드 객체 비트 플래그


파이썬 코드 객체에는 @ref{18dc,,co_flags} 어트리뷰트가 있으며, 이는 다음 플래그의 비트맵입니다:

@geindex CO_OPTIMIZED (inspect 모듈)
@anchor{library/inspect inspect CO_OPTIMIZED}@anchor{4a91}
@deffn {데이터} inspect.CO_OPTIMIZED

코드 객체는 빠른 locals(fast locals)를 사용하여 최적화되었습니다.
@end deffn

@geindex CO_NEWLOCALS (inspect 모듈)
@anchor{library/inspect inspect CO_NEWLOCALS}@anchor{4a92}
@deffn {데이터} inspect.CO_NEWLOCALS

설정되면, 코드 객체가 실행될 때 프레임의 @ref{4a6,,f_locals}에 대한 새 딕셔너리가 만들어집니다.
@end deffn

@geindex CO_VARARGS (inspect 모듈)
@anchor{library/inspect inspect CO_VARARGS}@anchor{4a93}
@deffn {데이터} inspect.CO_VARARGS

코드 객체에는 (@code{*args} 같은) 가변 위치 매개 변수가 있습니다.
@end deffn

@geindex CO_VARKEYWORDS (inspect 모듈)
@anchor{library/inspect inspect CO_VARKEYWORDS}@anchor{4a94}
@deffn {데이터} inspect.CO_VARKEYWORDS

코드 객체에는 (@code{**kwargs} 같은) 가변 키워드 매개 변수가 있습니다.
@end deffn

@geindex CO_NESTED (inspect 모듈)
@anchor{library/inspect inspect CO_NESTED}@anchor{4a95}
@deffn {데이터} inspect.CO_NESTED

코드 객체가 중첩 함수일 때 이 플래그가 설정됩니다.
@end deffn

@geindex CO_GENERATOR (inspect 모듈)
@anchor{library/inspect inspect CO_GENERATOR}@anchor{4a96}
@deffn {데이터} inspect.CO_GENERATOR

코드 객체가 제너레이터 함수일 때, 즉 코드 객체가 실행될 때 제너레이터 객체를 반환할 때 이 플래그가 설정됩니다.
@end deffn

@geindex CO_COROUTINE (inspect 모듈)
@anchor{library/inspect inspect CO_COROUTINE}@anchor{4a97}
@deffn {데이터} inspect.CO_COROUTINE

코드 객체가 코루틴 함수일 때 이 플래그가 설정됩니다. 코드 객체가 실행될 때 코루틴 객체를 반환합니다. 자세한 내용은 
@geindex Python 향상 제안; PEP 492
PEP 492@footnote{https://peps.python.org/pep-0492/}를 참조하십시오.


Added in version 3.5.

@end deffn

@geindex CO_ITERABLE_COROUTINE (inspect 모듈)
@anchor{library/inspect inspect CO_ITERABLE_COROUTINE}@anchor{4a98}
@deffn {데이터} inspect.CO_ITERABLE_COROUTINE

이 플래그는 제너레이터를 제너레이터 기반 코루틴으로 변환하는 데 사용됩니다. 이 플래그가 있는 제너레이터 객체는 @code{await} 표현식에 사용될 수 있으며, 코루틴 객체를 @code{yield from} 할 수 있습니다. 자세한 내용은 
@geindex Python 향상 제안; PEP 492
PEP 492@footnote{https://peps.python.org/pep-0492/}를 참조하십시오.


Added in version 3.5.

@end deffn

@geindex CO_ASYNC_GENERATOR (inspect 모듈)
@anchor{library/inspect inspect CO_ASYNC_GENERATOR}@anchor{4a99}
@deffn {데이터} inspect.CO_ASYNC_GENERATOR

코드 객체가 비동기 제너레이터 함수일 때 이 플래그가 설정됩니다. 코드 객체가 실행될 때 비동기 제너레이터 객체가 반환됩니다. 자세한 내용은 
@geindex Python 향상 제안; PEP 525
PEP 525@footnote{https://peps.python.org/pep-0525/}를 참조하십시오.


Added in version 3.6.

@end deffn

@geindex CO_HAS_DOCSTRING (inspect 모듈)
@anchor{library/inspect inspect CO_HAS_DOCSTRING}@anchor{2394}
@deffn {데이터} inspect.CO_HAS_DOCSTRING

The flag is set when there is a docstring for the code object in
the source code. If set, it will be the first item in
@ref{189d,,co_consts}.


Added in version 3.14.

@end deffn

@geindex CO_METHOD (inspect 모듈)
@anchor{library/inspect inspect CO_METHOD}@anchor{4a9a}
@deffn {데이터} inspect.CO_METHOD

The flag is set when the code object is a function defined in class
scope.


Added in version 3.14.

@end deffn

@cartouche
@quotation 참고 
The flags are specific to CPython, and may not be defined in other
Python implementations.  Furthermore, the flags are an implementation
detail, and can be removed or deprecated in future Python releases.
It’s recommended to use public APIs from the @code{inspect} module
for any introspection needs.
@end quotation
@end cartouche

@node Buffer flags,Command-line interface<10>,코드 객체 비트 플래그,inspect — 라이브 객체 검사
@anchor{library/inspect buffer-flags}@anchor{4a9b}
@subsubsection Buffer flags


@geindex BufferFlags (inspect 클래스)
@anchor{library/inspect inspect BufferFlags}@anchor{68c}
@deffn {클래스} inspect.BufferFlags

This is an @ref{e99,,enum.IntFlag} that represents the flags that
can be passed to the @ref{68b,,__buffer__()} method of objects
implementing the @ref{260,,buffer protocol}.

The meaning of the flags is explained at @ref{4a9c,,버퍼 요청 유형}.

@geindex SIMPLE (inspect.BufferFlags의 속성)
@anchor{library/inspect inspect BufferFlags SIMPLE}@anchor{4a9d}
@deffn {속성} SIMPLE
@end deffn

@geindex WRITABLE (inspect.BufferFlags의 속성)
@anchor{library/inspect inspect BufferFlags WRITABLE}@anchor{4a9e}
@deffn {속성} WRITABLE
@end deffn

@geindex FORMAT (inspect.BufferFlags의 속성)
@anchor{library/inspect inspect BufferFlags FORMAT}@anchor{4a9f}
@deffn {속성} FORMAT
@end deffn

@geindex ND (inspect.BufferFlags의 속성)
@anchor{library/inspect inspect BufferFlags ND}@anchor{4aa0}
@deffn {속성} ND
@end deffn

@geindex STRIDES (inspect.BufferFlags의 속성)
@anchor{library/inspect inspect BufferFlags STRIDES}@anchor{4aa1}
@deffn {속성} STRIDES
@end deffn

@geindex C_CONTIGUOUS (inspect.BufferFlags의 속성)
@anchor{library/inspect inspect BufferFlags C_CONTIGUOUS}@anchor{4aa2}
@deffn {속성} C_CONTIGUOUS
@end deffn

@geindex F_CONTIGUOUS (inspect.BufferFlags의 속성)
@anchor{library/inspect inspect BufferFlags F_CONTIGUOUS}@anchor{4aa3}
@deffn {속성} F_CONTIGUOUS
@end deffn

@geindex ANY_CONTIGUOUS (inspect.BufferFlags의 속성)
@anchor{library/inspect inspect BufferFlags ANY_CONTIGUOUS}@anchor{4aa4}
@deffn {속성} ANY_CONTIGUOUS
@end deffn

@geindex INDIRECT (inspect.BufferFlags의 속성)
@anchor{library/inspect inspect BufferFlags INDIRECT}@anchor{4aa5}
@deffn {속성} INDIRECT
@end deffn

@geindex CONTIG (inspect.BufferFlags의 속성)
@anchor{library/inspect inspect BufferFlags CONTIG}@anchor{4aa6}
@deffn {속성} CONTIG
@end deffn

@geindex CONTIG_RO (inspect.BufferFlags의 속성)
@anchor{library/inspect inspect BufferFlags CONTIG_RO}@anchor{4aa7}
@deffn {속성} CONTIG_RO
@end deffn

@geindex STRIDED (inspect.BufferFlags의 속성)
@anchor{library/inspect inspect BufferFlags STRIDED}@anchor{4aa8}
@deffn {속성} STRIDED
@end deffn

@geindex STRIDED_RO (inspect.BufferFlags의 속성)
@anchor{library/inspect inspect BufferFlags STRIDED_RO}@anchor{4aa9}
@deffn {속성} STRIDED_RO
@end deffn

@geindex RECORDS (inspect.BufferFlags의 속성)
@anchor{library/inspect inspect BufferFlags RECORDS}@anchor{4aaa}
@deffn {속성} RECORDS
@end deffn

@geindex RECORDS_RO (inspect.BufferFlags의 속성)
@anchor{library/inspect inspect BufferFlags RECORDS_RO}@anchor{4aab}
@deffn {속성} RECORDS_RO
@end deffn

@geindex FULL (inspect.BufferFlags의 속성)
@anchor{library/inspect inspect BufferFlags FULL}@anchor{4aac}
@deffn {속성} FULL
@end deffn

@geindex FULL_RO (inspect.BufferFlags의 속성)
@anchor{library/inspect inspect BufferFlags FULL_RO}@anchor{4aad}
@deffn {속성} FULL_RO
@end deffn

@geindex READ (inspect.BufferFlags의 속성)
@anchor{library/inspect inspect BufferFlags READ}@anchor{18f6}
@deffn {속성} READ
@end deffn

@geindex WRITE (inspect.BufferFlags의 속성)
@anchor{library/inspect inspect BufferFlags WRITE}@anchor{18f7}
@deffn {속성} WRITE
@end deffn


Added in version 3.12.

@end deffn

@node Command-line interface<10>,,Buffer flags,inspect — 라이브 객체 검사
@anchor{library/inspect command-line-interface}@anchor{4aae}@anchor{library/inspect inspect-module-cli}@anchor{115a}
@subsubsection Command-line interface


The @code{inspect} module also provides a basic introspection capability
from the command line.

기본적으로, 모듈의 이름을 받아들이고 해당 모듈의 소스를 인쇄합니다. 콜론과 대상 객체의 정규화된 이름을 덧붙여, 대신 모듈 내의 클래스나 함수를 인쇄 할 수 있습니다.

@geindex inspect 명령줄 옵션; --details
@anchor{library/inspect cmdoption-inspect-details}@anchor{4aaf}
@deffn {Option} @w{-}@w{-}details

소스 코드 대신에 지정된 객체에 대한 정보를 인쇄합니다
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node annotationlib — Functionality for introspecting annotations,site — 사이트별 구성 훅,inspect — 라이브 객체 검사,파이썬 실행시간 서비스
@anchor{library/annotationlib doc}@anchor{4ab0}@anchor{library/annotationlib annotationlib-functionality-for-introspecting-annotations}@anchor{4ab1}@anchor{library/annotationlib module-annotationlib}@anchor{6}@anchor{library/annotationlib translation-repo}@anchor{4ab2}
@subsection @code{annotationlib} — Functionality for introspecting annotations


@geindex module; annotationlib


Added in version 3.14.


`Source code:' Lib/annotationlib.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/annotationlib.py}

@c import annotationlib
@c from annotationlib import *


__________________________________________________________________


The @code{annotationlib} module provides tools for introspecting
@ref{15c,,annotations} on modules, classes, and functions.

Annotations are @ref{684,,lazily evaluated} and often contain
forward references to objects that are not yet defined when the annotation
is created. This module provides a set of low-level tools that can be used to retrieve annotations in a reliable way, even
in the presence of forward references and other edge cases.

This module supports retrieving annotations in three main formats
(see @ref{230,,Format}), each of which works best for different use cases:


@itemize *

@item 
@ref{15e,,VALUE} evaluates the annotations and returns their value.
This is most straightforward to work with, but it may raise errors,
for example if the annotations contain references to undefined names.

@item 
@ref{15f,,FORWARDREF} returns @ref{177e,,ForwardRef} objects
for annotations that cannot be resolved, allowing you to inspect the
annotations without evaluating them. This is useful when you need to
work with annotations that may contain unresolved forward references.

@item 
@ref{160,,STRING} returns the annotations as a string, similar
to how it would appear in the source file. This is useful for documentation
generators that want to display annotations in a readable way.
@end itemize

The @ref{459,,get_annotations()} function is the main entry point for
retrieving annotations. Given a function, class, or module, it returns
an annotations dictionary in the requested format. This module also provides
functionality for working directly with the @ref{15d,,annotate function}
that is used to evaluate annotations, such as @ref{45b,,get_annotate_from_class_namespace()}
and @ref{17c4,,call_annotate_function()}, as well as the
@ref{452e,,call_evaluate_function()} function for working with
@ref{452d,,evaluate functions}.

@cartouche
@quotation 조심 
Most functionality in this module can execute arbitrary code; see
@ref{4556,,the security section} for more information.
@end quotation
@end cartouche


@subsubheading 더 보기


@geindex Python 향상 제안; PEP 649
PEP 649@footnote{https://peps.python.org/pep-0649/} proposed the current model for how annotations work in Python.

@geindex Python 향상 제안; PEP 749
PEP 749@footnote{https://peps.python.org/pep-0749/} expanded on various aspects of 
@geindex Python 향상 제안; PEP 649
PEP 649@footnote{https://peps.python.org/pep-0649/} and introduced the
@code{annotationlib} module.

@ref{9d9,,Annotations Best Practices} provides best practices for working with
annotations.

typing-extensions@footnote{https://pypi.org/project/typing-extensions/} provides a backport of @ref{459,,get_annotations()}
that works on earlier versions of Python.


@menu
* Annotation semantics:: 
* Classes:: 
* Functions: Functions<2>. 
* Recipes:: 
* Limitations of the STRING format:: 
* Limitations of the FORWARDREF format:: 
* Security implications of introspecting annotations:: 

@end menu

@node Annotation semantics,Classes,,annotationlib — Functionality for introspecting annotations
@anchor{library/annotationlib annotation-semantics}@anchor{4ab3}
@subsubsection Annotation semantics


The way annotations are evaluated has changed over the history of Python 3,
and currently still depends on a @ref{45d,,future import}.
There have been execution models for annotations:


@itemize *

@item 
`Stock semantics' (default in Python 3.0 through 3.13; see 
@geindex Python 향상 제안; PEP 3107
PEP 3107@footnote{https://peps.python.org/pep-3107/}
and 
@geindex Python 향상 제안; PEP 526
PEP 526@footnote{https://peps.python.org/pep-0526/}): Annotations are evaluated eagerly, as they are
encountered in the source code.

@item 
`Stringified annotations' (used with @code{from __future__ import annotations}
in Python 3.7 and newer; see 
@geindex Python 향상 제안; PEP 563
PEP 563@footnote{https://peps.python.org/pep-0563/}): Annotations are stored as
strings only.

@item 
`Deferred evaluation' (default in Python 3.14 and newer; see 
@geindex Python 향상 제안; PEP 649
PEP 649@footnote{https://peps.python.org/pep-0649/} and
@geindex Python 향상 제안; PEP 749
PEP 749@footnote{https://peps.python.org/pep-0749/}): Annotations are evaluated lazily, only when they are accessed.
@end itemize

As an example, consider the following program:

@example
def func(a: Cls) -> None:
    print(a)

class Cls: pass

print(func.__annotations__)
@end example

This will behave as follows:


@itemize *

@item 
Under stock semantics (Python 3.13 and earlier), it will throw a
@ref{452,,NameError} at the line where @code{func} is defined,
because @code{Cls} is an undefined name at that point.

@item 
Under stringified annotations (if @code{from __future__ import annotations}
is used), it will print @code{@{'a': 'Cls', 'return': 'None'@}}.

@item 
Under deferred evaluation (Python 3.14 and later), it will print
@code{@{'a': <class 'Cls'>, 'return': None@}}.
@end itemize

Stock semantics were used when function annotations were first introduced
in Python 3.0 (by 
@geindex Python 향상 제안; PEP 3107
PEP 3107@footnote{https://peps.python.org/pep-3107/}) because this was the simplest, most obvious
way to implement annotations. The same execution model was used when variable
annotations were introduced in Python 3.6 (by 
@geindex Python 향상 제안; PEP 526
PEP 526@footnote{https://peps.python.org/pep-0526/}). However,
stock semantics caused problems when using annotations as type hints,
such as a need to refer to names that are not yet defined when the
annotation is encountered. In addition, there were performance problems
with executing annotations at module import time. Therefore, in Python 3.7,
@geindex Python 향상 제안; PEP 563
PEP 563@footnote{https://peps.python.org/pep-0563/} introduced the ability to store annotations as strings using the
@code{from __future__ import annotations} syntax. The plan at the time was to
eventually make this behavior the default, but a problem appeared:
stringified annotations are more difficult to process for those who
introspect annotations at runtime. An alternative proposal, 
@geindex Python 향상 제안; PEP 649
PEP 649@footnote{https://peps.python.org/pep-0649/},
introduced the third execution model, deferred evaluation, and was implemented
in Python 3.14. Stringified annotations are still used if
@code{from __future__ import annotations} is present, but this behavior will
eventually be removed.

@node Classes,Functions<2>,Annotation semantics,annotationlib — Functionality for introspecting annotations
@anchor{library/annotationlib classes}@anchor{4ab4}
@subsubsection Classes


@geindex Format (annotationlib 클래스)
@anchor{library/annotationlib annotationlib Format}@anchor{230}
@deffn {클래스} annotationlib.Format

An @ref{eda,,IntEnum} describing the formats in which annotations
can be returned. Members of the enum, or their equivalent integer values,
can be passed to @ref{459,,get_annotations()} and other functions in this
module, as well as to @ref{1984,,__annotate__} functions.

@geindex VALUE (annotationlib.Format의 속성)
@anchor{library/annotationlib annotationlib Format VALUE}@anchor{15e}
@deffn {속성} VALUE = 1

Values are the result of evaluating the annotation expressions.
@end deffn

@geindex VALUE_WITH_FAKE_GLOBALS (annotationlib.Format의 속성)
@anchor{library/annotationlib annotationlib Format VALUE_WITH_FAKE_GLOBALS}@anchor{4ab5}
@deffn {속성} VALUE_WITH_FAKE_GLOBALS = 2

Special value used to signal that an annotate function is being
evaluated in a special environment with fake globals. When passed this
value, annotate functions should either return the same value as for
the @ref{15e,,Format.VALUE} format, or raise @ref{36b,,NotImplementedError}
to signal that they do not support execution in this environment.
This format is only used internally and should not be passed to
the functions in this module.
@end deffn

@geindex FORWARDREF (annotationlib.Format의 속성)
@anchor{library/annotationlib annotationlib Format FORWARDREF}@anchor{15f}
@deffn {속성} FORWARDREF = 3

Values are real annotation values (as per @ref{15e,,Format.VALUE} format)
for defined values, and @ref{177e,,ForwardRef} proxies for undefined
values. Real objects may contain references to @code{ForwardRef}
proxy objects.
@end deffn

@geindex STRING (annotationlib.Format의 속성)
@anchor{library/annotationlib annotationlib Format STRING}@anchor{160}
@deffn {속성} STRING = 4

Values are the text string of the annotation as it appears in the
source code, up to modifications including, but not restricted to,
whitespace normalizations and constant values optimizations.

The exact values of these strings may change in future versions of Python.
@end deffn


Added in version 3.14.

@end deffn

@geindex ForwardRef (annotationlib 클래스)
@anchor{library/annotationlib annotationlib ForwardRef}@anchor{177e}
@deffn {클래스} annotationlib.ForwardRef

A proxy object for forward references in annotations.

Instances of this class are returned when the @ref{15f,,FORWARDREF}
format is used and annotations contain a name that cannot be resolved.
This can happen when a forward reference is used in an annotation, such as
when a class is referenced before it is defined.

@geindex __forward_arg__ (annotationlib.ForwardRef의 속성)
@anchor{library/annotationlib annotationlib ForwardRef __forward_arg__}@anchor{4ab6}
@deffn {속성} __forward_arg__

A string containing the code that was evaluated to produce the
@code{ForwardRef}. The string may not be exactly equivalent
to the original source.
@end deffn

@geindex evaluate() (annotationlib.ForwardRef 메서드)
@anchor{library/annotationlib annotationlib ForwardRef evaluate}@anchor{17b9}
@deffn {메서드} evaluate (*, owner=None, globals=None, locals=None, type_params=None, format=Format.VALUE)

Evaluate the forward reference, returning its value.

If the `format' argument is @ref{15e,,VALUE} (the default),
this method may throw an exception, such as @ref{452,,NameError}, if the forward
reference refers to a name that cannot be resolved. The arguments to this
method can be used to provide bindings for names that would otherwise
be undefined. If the `format' argument is @ref{15f,,FORWARDREF},
the method will never throw an exception, but may return a @code{ForwardRef}
instance. For example, if the forward reference object contains the code
@code{list[undefined]}, where @code{undefined} is a name that is not defined,
evaluating it with the @code{FORWARDREF} format will return
@code{list[ForwardRef('undefined')]}. If the `format' argument is
@ref{160,,STRING}, the method will return @ref{4ab6,,__forward_arg__}.

The `owner' parameter provides the preferred mechanism for passing scope
information to this method. The owner of a @code{ForwardRef} is the
object that contains the annotation from which the @code{ForwardRef}
derives, such as a module object, type object, or function object.

The `globals', `locals', and `type_params' parameters provide a more precise
mechanism for influencing the names that are available when the @code{ForwardRef}
is evaluated. `globals' and `locals' are passed to @ref{4a4,,eval()}, representing
the global and local namespaces in which the name is evaluated.
The `type_params' parameter is relevant for objects created using the native
syntax for @ref{680,,generic classes} and @ref{681,,functions}.
It is a tuple of @ref{5ac,,type parameters} that are in scope
while the forward reference is being evaluated. For example, if evaluating a
@code{ForwardRef} retrieved from an annotation found in the class namespace
of a generic class @code{C}, `type_params' should be set to @code{C.__type_params__}.

@code{ForwardRef} instances returned by @ref{459,,get_annotations()}
retain references to information about the scope they originated from,
so calling this method with no further arguments may be sufficient to
evaluate such objects. @code{ForwardRef} instances created by other
means may not have any information about their scope, so passing
arguments to this method may be necessary to evaluate them successfully.

If no `owner', `globals', `locals', or `type_params' are provided and the
@code{ForwardRef} does not contain information about its origin,
empty globals and locals dictionaries are used.
@end deffn


Added in version 3.14.

@end deffn

@node Functions<2>,Recipes,Classes,annotationlib — Functionality for introspecting annotations
@anchor{library/annotationlib functions}@anchor{4ab7}
@subsubsection Functions


@geindex annotations_to_string() (annotationlib 모듈)
@anchor{library/annotationlib annotationlib annotations_to_string}@anchor{4ab8}
@deffn {함수} annotationlib.annotations_to_string (annotations)

Convert an annotations dict containing runtime values to a
dict containing only strings. If the values are not already strings,
they are converted using @ref{1859,,type_repr()}.
This is meant as a helper for user-provided
annotate functions that support the @ref{160,,STRING} format but
do not have access to the code creating the annotations.

For example, this is used to implement the @ref{160,,STRING} for
@ref{332,,typing.TypedDict} classes created through the functional syntax:

@example
>>> from typing import TypedDict
>>> Movie = TypedDict("movie", @{"name": str, "year": int@})
>>> get_annotations(Movie, format=Format.STRING)
@{'name': 'str', 'year': 'int'@}
@end example


Added in version 3.14.

@end deffn

@geindex call_annotate_function() (annotationlib 모듈)
@anchor{library/annotationlib annotationlib call_annotate_function}@anchor{17c4}
@deffn {함수} annotationlib.call_annotate_function (annotate, format, *, owner=None)

Call the @ref{15d,,annotate function} `annotate' with the given `format',
a member of the @ref{230,,Format} enum, and return the annotations
dictionary produced by the function.

This helper function is required because annotate functions generated by
the compiler for functions, classes, and modules only support
the @ref{15e,,VALUE} format when called directly.
To support other formats, this function calls the annotate function
in a special environment that allows it to produce annotations in the
other formats. This is a useful building block when implementing
functionality that needs to partially evaluate annotations while a class
is being constructed.

`owner' is the object that owns the annotation function, usually
a function, class, or module. If provided, it is used in the
@ref{15f,,FORWARDREF} format to produce a @ref{177e,,ForwardRef}
object that carries more information.


@subsubheading 더 보기


@geindex Python 향상 제안; PEP 649#the-stringizer-and-the-fake-globals-environment
PEP 649@footnote{https://peps.python.org/pep-0649/#the-stringizer-and-the-fake-globals-environment}
contains an explanation of the implementation technique used by this
function.



Added in version 3.14.

@end deffn

@geindex call_evaluate_function() (annotationlib 모듈)
@anchor{library/annotationlib annotationlib call_evaluate_function}@anchor{452e}
@deffn {함수} annotationlib.call_evaluate_function (evaluate, format, *, owner=None)

Call the @ref{452d,,evaluate function} `evaluate' with the given `format',
a member of the @ref{230,,Format} enum, and return the value produced by
the function. This is similar to @ref{17c4,,call_annotate_function()},
but the latter always returns a dictionary mapping strings to annotations,
while this function returns a single value.

This is intended for use with the evaluate functions generated for lazily
evaluated elements related to type aliases and type parameters:


@itemize *

@item 
@ref{4543,,typing.TypeAliasType.evaluate_value()}, the value of type aliases

@item 
@ref{452c,,typing.TypeVar.evaluate_bound()}, the bound of type variables

@item 
@ref{4530,,typing.TypeVar.evaluate_constraints()}, the constraints of
type variables

@item 
@ref{4532,,typing.TypeVar.evaluate_default()}, the default value of
type variables

@item 
@ref{453d,,typing.ParamSpec.evaluate_default()}, the default value of
parameter specifications

@item 
@ref{4536,,typing.TypeVarTuple.evaluate_default()}, the default value of
type variable tuples
@end itemize

`owner' is the object that owns the evaluate function, such as the type
alias or type variable object.

`format' can be used to control the format in which the value is returned:

@example
>>> type Alias = undefined
>>> call_evaluate_function(Alias.evaluate_value, Format.VALUE)
Traceback (most recent call last):
...
NameError: name 'undefined' is not defined
>>> call_evaluate_function(Alias.evaluate_value, Format.FORWARDREF)
ForwardRef('undefined')
>>> call_evaluate_function(Alias.evaluate_value, Format.STRING)
'undefined'
@end example


Added in version 3.14.

@end deffn

@geindex get_annotate_from_class_namespace() (annotationlib 모듈)
@anchor{library/annotationlib annotationlib get_annotate_from_class_namespace}@anchor{45b}
@deffn {함수} annotationlib.get_annotate_from_class_namespace (namespace)

Retrieve the @ref{15d,,annotate function} from a class namespace dictionary `namespace'.
Return @code{None} if the namespace does not contain an annotate function.
This is primarily useful before the class has been fully created (e.g., in a metaclass);
after the class exists, the annotate function can be retrieved with @code{cls.__annotate__}.
See @ref{4ab9,,below} for an example using this function in a metaclass.


Added in version 3.14.

@end deffn

@geindex get_annotations() (annotationlib 모듈)
@anchor{library/annotationlib annotationlib get_annotations}@anchor{459}
@deffn {함수} annotationlib.get_annotations (obj, *, globals=None, locals=None, eval_str=False, format=Format.VALUE)

Compute the annotations dict for an object.

`obj' may be a callable, class, module, or other object with
@ref{1984,,__annotate__} or @ref{458,,__annotations__} attributes.
Passing any other object raises @ref{198,,TypeError}.

The `format' parameter controls the format in which annotations are returned,
and must be a member of the @ref{230,,Format} enum or its integer equivalent.
The different formats work as follows:


@itemize *

@item 
VALUE: @code{object.__annotations__} is tried first; if that does not exist,
the @code{object.__annotate__} function is called if it exists.

@item 
FORWARDREF: If @code{object.__annotations__} exists and can be evaluated successfully,
it is used; otherwise, the @code{object.__annotate__} function is called. If it
does not exist either, @code{object.__annotations__} is tried again and any error
from accessing it is re-raised.


@itemize *

@item 
When calling @code{object.__annotate__} it is first called with @ref{15f,,FORWARDREF}.
If this is not implemented, it will then check if @ref{4ab5,,VALUE_WITH_FAKE_GLOBALS}
is supported and use that in the fake globals environment.
If neither of these formats are supported, it will fall back to using @ref{15e,,VALUE}.
If @code{VALUE} fails, the error from this call will be raised.
@end itemize

@item 
STRING: If @code{object.__annotate__} exists, it is called first;
otherwise, @code{object.__annotations__} is used and stringified
using @ref{4ab8,,annotations_to_string()}.


@itemize *

@item 
When calling @code{object.__annotate__} it is first called with @ref{160,,STRING}.
If this is not implemented, it will then check if @ref{4ab5,,VALUE_WITH_FAKE_GLOBALS}
is supported and use that in the fake globals environment.
If neither of these formats are supported, it will fall back to using @ref{15e,,VALUE}
with the result converted using @ref{4ab8,,annotations_to_string()}.
If @code{VALUE} fails, the error from this call will be raised.
@end itemize
@end itemize

Returns a dict. @code{get_annotations()} returns a new dict every time
it’s called; calling it twice on the same object will return two
different but equivalent dicts.

This function handles several details for you:


@itemize *

@item 
If `eval_str' is true, values of type @code{str} will
be un-stringized using @ref{4a4,,eval()}. This is intended
for use with stringized annotations
(@code{from __future__ import annotations}). It is an error
to set `eval_str' to true with formats other than @ref{15e,,Format.VALUE}.

@item 
If `obj' doesn’t have an annotations dict, returns an
empty dict. (Functions and methods always have an
annotations dict; classes, modules, and other types of
callables may not.)

@item 
Ignores inherited annotations on classes, as well as annotations
on metaclasses. If a class
doesn’t have its own annotations dict, returns an empty dict.

@item 
All accesses to object members and dict values are done
using @code{getattr()} and @code{dict.get()} for safety.
@end itemize

`eval_str' controls whether or not values of type @code{str} are
replaced with the result of calling @ref{4a4,,eval()} on those values:


@itemize *

@item 
If eval_str is true, @ref{4a4,,eval()} is called on values of type
@code{str}. (Note that @code{get_annotations()} doesn’t catch
exceptions; if @code{eval()} raises an exception, it will unwind
the stack past the @code{get_annotations()} call.)

@item 
If `eval_str' is false (the default), values of type @code{str} are
unchanged.
@end itemize

`globals' and `locals' are passed in to @ref{4a4,,eval()}; see the documentation
for @code{eval()} for more information. If `globals' or `locals'
is @code{None}, this function may replace that value with a
context-specific default, contingent on @code{type(obj)}:


@itemize *

@item 
If `obj' is a module, `globals' defaults to @code{obj.__dict__}.

@item 
If `obj' is a class, `globals' defaults to
@code{sys.modules[obj.__module__].__dict__} and `locals' defaults
to the `obj' class namespace.

@item 
If `obj' is a callable, `globals' defaults to
@ref{14d8,,obj.__globals__},
although if `obj' is a wrapped function (using
@ref{1221,,functools.update_wrapper()}) or a @ref{217,,functools.partial} object,
it is unwrapped until a non-wrapped function is found.
@end itemize

Calling @code{get_annotations()} is best practice for accessing the
annotations dict of any object. See @ref{9d9,,Annotations Best Practices} for
more information on annotations best practices.

@example
>>> def f(a: int, b: str) -> float:
...     pass
>>> get_annotations(f)
@{'a': <class 'int'>, 'b': <class 'str'>, 'return': <class 'float'>@}
@end example


Added in version 3.14.

@end deffn

@geindex type_repr() (annotationlib 모듈)
@anchor{library/annotationlib annotationlib type_repr}@anchor{1859}
@deffn {함수} annotationlib.type_repr (value)

Convert an arbitrary Python value to a format suitable for use by the
@ref{160,,STRING} format. This calls @ref{1c1,,repr()} for most
objects, but has special handling for some objects, such as type objects.

This is meant as a helper for user-provided
annotate functions that support the @ref{160,,STRING} format but
do not have access to the code creating the annotations. It can also
be used to provide a user-friendly string representation for other
objects that contain values that are commonly encountered in annotations.


Added in version 3.14.

@end deffn

@node Recipes,Limitations of the STRING format,Functions<2>,annotationlib — Functionality for introspecting annotations
@anchor{library/annotationlib recipes}@anchor{4aba}
@subsubsection Recipes


@menu
* Using annotations in a metaclass:: 

@end menu

@node Using annotations in a metaclass,,,Recipes
@anchor{library/annotationlib annotationlib-metaclass}@anchor{4ab9}@anchor{library/annotationlib using-annotations-in-a-metaclass}@anchor{4abb}
@subsubsection Using annotations in a metaclass


A @ref{23be,,metaclass} may want to inspect or even modify the annotations
in a class body during class creation. Doing so requires retrieving annotations
from the class namespace dictionary. For classes created with
@code{from __future__ import annotations}, the annotations will be in the @code{__annotations__}
key of the dictionary. For other classes with annotations,
@ref{45b,,get_annotate_from_class_namespace()} can be used to get the
annotate function, and @ref{17c4,,call_annotate_function()} can be used to call it and
retrieve the annotations. Using the @ref{15f,,FORWARDREF} format will usually
be best, because this allows the annotations to refer to names that cannot yet be
resolved when the class is created.

To modify the annotations, it is best to create a wrapper annotate function
that calls the original annotate function, makes any necessary adjustments, and
returns the result.

Below is an example of a metaclass that filters out all @ref{56c,,typing.ClassVar}
annotations from the class and puts them in a separate attribute:

@example
import annotationlib
import typing

class ClassVarSeparator(type):
   def __new__(mcls, name, bases, ns):
      if "__annotations__" in ns:  # from __future__ import annotations
         annotations = ns["__annotations__"]
         classvar_keys = @{
            key for key, value in annotations.items()
            # Use string comparison for simplicity; a more robust solution
            # could use annotationlib.ForwardRef.evaluate
            if value.startswith("ClassVar")
         @}
         classvars = @{key: annotations[key] for key in classvar_keys@}
         ns["__annotations__"] = @{
            key: value for key, value in annotations.items()
            if key not in classvar_keys
         @}
         wrapped_annotate = None
      elif annotate := annotationlib.get_annotate_from_class_namespace(ns):
         annotations = annotationlib.call_annotate_function(
            annotate, format=annotationlib.Format.FORWARDREF
         )
         classvar_keys = @{
            key for key, value in annotations.items()
            if typing.get_origin(value) is typing.ClassVar
         @}
         classvars = @{key: annotations[key] for key in classvar_keys@}

         def wrapped_annotate(format):
            annos = annotationlib.call_annotate_function(annotate, format, owner=typ)
            return @{key: value for key, value in annos.items() if key not in classvar_keys@}

      else:  # no annotations
         classvars = @{@}
         wrapped_annotate = None
      typ = super().__new__(mcls, name, bases, ns)

      if wrapped_annotate is not None:
         # Wrap the original __annotate__ with a wrapper that removes ClassVars
         typ.__annotate__ = wrapped_annotate
      typ.classvars = classvars  # Store the ClassVars in a separate attribute
      return typ
@end example

@node Limitations of the STRING format,Limitations of the FORWARDREF format,Recipes,annotationlib — Functionality for introspecting annotations
@anchor{library/annotationlib limitations-of-the-string-format}@anchor{4abc}
@subsubsection Limitations of the @code{STRING} format


The @ref{160,,STRING} format is meant to approximate the source code
of the annotation, but the implementation strategy used means that it is not
always possible to recover the exact source code.

First, the stringifier of course cannot recover any information that is not present in
the compiled code, including comments, whitespace, parenthesization, and operations that
get simplified by the compiler.

Second, the stringifier can intercept almost all operations that involve names looked
up in some scope, but it cannot intercept operations that operate fully on constants.
As a corollary, this also means it is not safe to request the @code{STRING} format on
untrusted code: Python is powerful enough that it is possible to achieve arbitrary
code execution even with no access to any globals or builtins. For example:

@example
>>> def f(x: (1).__class__.__base__.__subclasses__()[-1].__init__.__builtins__["print"]("Hello world")): pass
...
>>> annotationlib.get_annotations(f, format=annotationlib.Format.STRING)
Hello world
@{'x': 'None'@}
@end example

@cartouche
@quotation 참고 
This particular example works as of the time of writing, but it relies on
implementation details and is not guaranteed to work in the future.
@end quotation
@end cartouche

Among the different kinds of expressions that exist in Python,
as represented by the @ref{9,,ast} module, some expressions are supported,
meaning that the @code{STRING} format can generally recover the original source code;
others are unsupported, meaning that they may result in incorrect output or an error.

The following are supported (sometimes with caveats):


@itemize *

@item 
@ref{1daf,,ast.BinOp}

@item 
@ref{4abd,,ast.UnaryOp}


@itemize *

@item 
@ref{4abe,,ast.Invert} (@code{~}), @ref{4abf,,ast.UAdd} (@code{+}), and @ref{4ac0,,ast.USub} (@code{-}) are supported

@item 
@ref{4ac1,,ast.Not} (@code{not}) is not supported
@end itemize

@item 
@ref{1d46,,ast.Dict} (except when using @code{**} unpacking)

@item 
@ref{4ac2,,ast.Set}

@item 
@ref{4ac3,,ast.Compare}


@itemize *

@item 
@ref{4ac4,,ast.Eq} and @ref{4ac5,,ast.NotEq} are supported

@item 
@ref{4ac6,,ast.Lt}, @ref{4ac7,,ast.LtE}, @ref{4ac8,,ast.Gt}, and @ref{4ac9,,ast.GtE} are supported, but the operand may be flipped

@item 
@ref{4aca,,ast.Is}, @ref{4acb,,ast.IsNot}, @ref{4acc,,ast.In}, and @ref{4acd,,ast.NotIn} are not supported
@end itemize

@item 
@ref{4ace,,ast.Call} (except when using @code{**} unpacking)

@item 
@ref{2ef,,ast.Constant} (though not the exact representation of the constant; for example, escape
sequences in strings are lost; hexadecimal numbers are converted to decimal)

@item 
@ref{4acf,,ast.Attribute} (assuming the value is not a constant)

@item 
@ref{4ad0,,ast.Subscript} (assuming the value is not a constant)

@item 
@ref{4ad1,,ast.Starred} (@code{*} unpacking)

@item 
@ref{1d1f,,ast.Name}

@item 
@ref{4ad2,,ast.List}

@item 
@ref{4ad3,,ast.Tuple}

@item 
@ref{4ad4,,ast.Slice}
@end itemize

The following are unsupported, but throw an informative error when encountered by the
stringifier:


@itemize *

@item 
@ref{4ad5,,ast.FormattedValue} (f-strings; error is not detected if conversion specifiers like @code{!r}
are used)

@item 
@ref{1a5c,,ast.JoinedStr} (f-strings)
@end itemize

The following are unsupported and result in incorrect output:


@itemize *

@item 
@ref{4ad6,,ast.BoolOp} (@code{and} and @code{or})

@item 
@ref{4ad7,,ast.IfExp}

@item 
@ref{4ad8,,ast.Lambda}

@item 
@ref{4ad9,,ast.ListComp}

@item 
@ref{4ada,,ast.SetComp}

@item 
@ref{4adb,,ast.DictComp}

@item 
@ref{4adc,,ast.GeneratorExp}
@end itemize

The following are disallowed in annotation scopes and therefore not relevant:


@itemize *

@item 
@ref{4add,,ast.NamedExpr} (@code{:=})

@item 
@ref{4ade,,ast.Await}

@item 
@ref{4adf,,ast.Yield}

@item 
@ref{4ae0,,ast.YieldFrom}
@end itemize

@node Limitations of the FORWARDREF format,Security implications of introspecting annotations,Limitations of the STRING format,annotationlib — Functionality for introspecting annotations
@anchor{library/annotationlib limitations-of-the-forwardref-format}@anchor{4ae1}
@subsubsection Limitations of the @code{FORWARDREF} format


The @ref{15f,,FORWARDREF} format aims to produce real values as much
as possible, with anything that cannot be resolved replaced with
@ref{177e,,ForwardRef} objects. It is affected by broadly the same Limitations
as the @ref{160,,STRING} format: annotations that perform operations on
literals or that use unsupported expression types may raise exceptions when
evaluated using the @code{FORWARDREF} format.

Below are a few examples of the behavior with unsupported expressions:

@example
>>> from annotationlib import get_annotations, Format
>>> def zerodiv(x: 1 / 0): ...
>>> get_annotations(zerodiv, format=Format.STRING)
Traceback (most recent call last):
  ...
ZeroDivisionError: division by zero
>>> get_annotations(zerodiv, format=Format.FORWARDREF)
Traceback (most recent call last):
  ...
ZeroDivisionError: division by zero
>>> def ifexp(x: 1 if y else 0): ...
>>> get_annotations(ifexp, format=Format.STRING)
@{'x': '1'@}
@end example

@node Security implications of introspecting annotations,,Limitations of the FORWARDREF format,annotationlib — Functionality for introspecting annotations
@anchor{library/annotationlib annotationlib-security}@anchor{4556}@anchor{library/annotationlib security-implications-of-introspecting-annotations}@anchor{4ae2}
@subsubsection Security implications of introspecting annotations


Much of the functionality in this module involves executing code related to annotations,
which can then do arbitrary things. For example,
@ref{459,,get_annotations()} may call an arbitrary @ref{15d,,annotate function}, and
@ref{17b9,,ForwardRef.evaluate()} may call @ref{4a4,,eval()} on an arbitrary string. Code contained
in an annotation might make arbitrary system calls, enter an infinite loop, or perform any
other operation. This is also true for any access of the @ref{458,,__annotations__} attribute,
and for various functions in the @ref{10a,,typing} module that work with annotations, such as
@ref{8bf,,typing.get_type_hints()}.

Any security issue arising from this also applies immediately after importing
code that may contain untrusted annotations: importing code can always cause arbitrary operations
to be performed. However, it is unsafe to accept strings or other input from an untrusted source and
pass them to any of the APIs for introspecting annotations, for example by editing an
@code{__annotations__} dictionary or directly creating a @ref{177e,,ForwardRef} object.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node site — 사이트별 구성 훅,,annotationlib — Functionality for introspecting annotations,파이썬 실행시간 서비스
@anchor{library/site doc}@anchor{4ae3}@anchor{library/site module-site}@anchor{cc}@anchor{library/site site-site-specific-configuration-hook}@anchor{4ae4}@anchor{library/site translation-repo}@anchor{4ae5}
@subsection @code{site} — 사이트별 구성 훅


@geindex module; site

`소스 코드:' Lib/site.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/site.py}


__________________________________________________________________


`이 모듈은 초기화 중에 자동으로 임포트 됩니다.' 인터프리터의 @ref{13ad,,-S} 옵션을 사용하여 자동 임포트를 억제할 수 있습니다.

@geindex 모듈;검색;경로

이 모듈을 임포트하면 일반적으로 사이트별 경로를 모듈 검색 경로에 추가하고 @ref{ad4,,help()}를 포함한 @ref{25e6,,콜러블들}을 내장 이름 공간에 추가합니다. 그러나 시작 옵션 @ref{13ad,,-S}는 이를 막고 모듈 검색 경로의 자동 수정이나 내장의 추가 없이 이 모듈을 안전하게 임포트할 수 있습니다. 일반적인 사이트별 추가를 명시적으로 트리거 하려면, @ref{2124,,main()} 함수를 호출하십시오.


버전 3.3에서 변경: @ref{13ad,,-S}를 사용하는 경우에도 모듈을 임포트 하면 경로 조작을 트리거 했습니다.


@geindex site-packages;디렉터리

It starts by constructing up to four directories from a head and a tail part.
For the head part, it uses @code{sys.prefix} and @code{sys.exec_prefix}; empty heads
are skipped.  For the tail part, it uses the empty string and then
@code{lib/site-packages} (on Windows) or
@code{lib/python`X.Y[t]'/site-packages} (on Unix and macOS). (The
optional suffix “t” indicates the @ref{1767,,free-threaded build}, and is
appended if @code{"t"} is present in the @ref{c58,,sys.abiflags} constant.)
For each
of the distinct head-tail combinations, it sees if it refers to an existing
directory, and if so, adds it to @code{sys.path} and also inspects the newly
added path for configuration files.


버전 3.5에서 변경: “site-python” 디렉터리에 대한 지원이 제거되었습니다.



버전 3.13에서 변경: On Unix, @ref{1f4,,Free threading} Python installations are
identified by the “t” suffix in the version-specific directory name, such as
@code{lib/python3.13t/}.



버전 3.14에서 변경: @code{site} is no longer responsible for updating @ref{3e7,,sys.prefix} and
@ref{3eb,,sys.exec_prefix} on @ref{48f2,,Virtual Environments}. This is
now done during the @ref{18dd,,path initialization}. As a result,
under @ref{48f2,,Virtual Environments}, @code{sys.prefix} and
@code{sys.exec_prefix} no longer depend on the @code{site} initialization,
and are therefore unaffected by @ref{13ad,,-S}.

@anchor{library/site site-virtual-environments-configuration}@anchor{48f3}
When running under a @ref{48f2,,virtual environment},
the @code{pyvenv.cfg} file in @ref{3e7,,sys.prefix} is checked for site-specific
configurations. If the @code{include-system-site-packages} key exists and is set to
@code{true} (case-insensitive), the system-level prefixes will be searched for
site-packages, otherwise they won’t.

@geindex # (해시);주석
@geindex 문장;임포트

경로 구성 파일은 이름이 @code{`name'.pth} 인 파일이며, 위에서 언급한 4개의 디렉터리 중 하나에 존재합니다; 내용은 @code{sys.path}에 추가될 추가 항목(한 줄에 하나씩)입니다. 존재하지 않는 항목은 @code{sys.path}에 추가되지 않으며, 항목이 파일이 아닌 디렉터리를 참조하는지 확인하지 않습니다. 어떤 항목도 @code{sys.path}에 두 번 추가되지 않습니다. 빈 줄과 @code{#}으로 시작하는 줄은 건너뜁니다. @code{import}로 시작하는 (공백이나 탭이 뒤따르는) 줄은 실행됩니다.

@cartouche
@quotation 참고 
@code{.pth} 파일의 실행 줄은 특정 모듈이 실제 사용될지에 관계없이 모든 파이썬 시작 시에 실행됩니다. 따라서 영향을 최소화해야 합니다. 실행 줄의 주요 목적은 해당 모듈을 임포트 가능하게 만드는 것입니다 (제삼자 임포트 훅 로드, 
@geindex PATH
@geindex 환경 변수; PATH
@code{PATH} 조정 등). 다른 초기화는 모듈의 실제 임포트에서 수행된다고 간주합니다, (임포트 한다면 그리고 임포트 할 때). 코드 청크를 한 줄로 제한하는 것은 여기에 더 복잡한 것을 넣지 않도록 하려는 의도입니다.
@end quotation
@end cartouche


버전 3.13에서 변경: The @code{.pth} files are now decoded by UTF-8 at first and then by the
@ref{54a,,locale encoding} if it fails.


@geindex 패키지
@geindex 경로;구성;파일

예를 들어, @code{sys.prefix}와 @code{sys.exec_prefix}가 @code{/usr/local}로 설정되었다고 가정하십시오. 그러면 파이썬 X.Y 라이브러리는 @code{/usr/local/lib/python`X.Y'}에 설치되어 있습니다. 여기에 @code{foo}, @code{bar} 및 @code{spam}이라는 세 개의 서브 디렉터리와, @code{foo.pth}와 @code{bar.pth}라는 두 개의 경로 구성 파일이 있는 서브 디렉터리 @code{/usr/local/lib/python`X.Y'/site-packages}가 있다고 가정하십시오. @code{foo.pth}에 다음이 포함되어 있고:

@example
# foo package configuration

foo
bar
bletch
@end example

@code{bar.pth}는 다음을 포함한다고 가정하십시오:

@example
# bar package configuration

bar
@end example

그러면 다음과 같은 버전 별 디렉터리가 이 순서대로 @code{sys.path}에 추가됩니다:

@example
/usr/local/lib/pythonX.Y/site-packages/bar
/usr/local/lib/pythonX.Y/site-packages/foo
@end example

@code{bletch}가 존재하지 않기 때문에 생략되었음에 유의하십시오; @code{bar.pth}가 알파벳순으로 @code{foo.pth} 앞에 오기 때문에 @code{bar} 디렉터리가 @code{foo} 디렉터리보다 앞에 옵니다; @code{spam}은 경로 구성 파일에 언급되어 있지 않기 때문에 생략되었습니다.

@menu
* sitecustomize:: 
* usercustomize:: 
* Readline 구성:: 
* 모듈 내용: 모듈 내용<7>. 
* Command-line interface: Command-line interface<11>. 

@end menu

@node sitecustomize,usercustomize,,site — 사이트별 구성 훅
@anchor{library/site module-sitecustomize}@anchor{cd}@anchor{library/site sitecustomize}@anchor{4ae6}
@subsubsection @code{sitecustomize}


@geindex module; sitecustomize

After these path manipulations, an attempt is made to import a module named
@code{sitecustomize}, which can perform arbitrary site-specific customizations.
It is typically created by a system administrator in the site-packages
directory.  If this import fails with an @ref{659,,ImportError} or its subclass
exception, and the exception’s @ref{26f0,,name}
attribute equals @code{'sitecustomize'},
it is silently ignored.  If Python is started without output streams available, as
with @code{pythonw.exe} on Windows (which is used by default to start IDLE),
attempted output from @code{sitecustomize} is ignored.  Any other exception
causes a silent and perhaps mysterious failure of the process.

@node usercustomize,Readline 구성,sitecustomize,site — 사이트별 구성 훅
@anchor{library/site module-usercustomize}@anchor{114}@anchor{library/site usercustomize}@anchor{4ae7}
@subsubsection @code{usercustomize}


@geindex module; usercustomize

After this, an attempt is made to import a module named @code{usercustomize},
which can perform arbitrary user-specific customizations, if
@ref{4ae8,,ENABLE_USER_SITE} is true.  This file is intended to be created in the
user site-packages directory (see below), which is part of @code{sys.path} unless
disabled by @ref{1593,,-s}.  If this import fails with an @ref{659,,ImportError} or
its subclass exception, and the exception’s @ref{26f0,,name}
attribute equals @code{'usercustomize'}, it is silently ignored.

Note that for some non-Unix systems, @code{sys.prefix} and @code{sys.exec_prefix} are
empty, and the path manipulations are skipped; however the import of
@ref{cd,,sitecustomize} and @code{usercustomize} is still attempted.

@node Readline 구성,모듈 내용<7>,usercustomize,site — 사이트별 구성 훅
@anchor{library/site readline-configuration}@anchor{4ae9}@anchor{library/site rlcompleter-config}@anchor{11c8}
@subsubsection Readline 구성


On systems that support @ref{bf,,readline}, this module will also import and
configure the @ref{c2,,rlcompleter} module, if Python is started in
@ref{443,,interactive mode} and without the @ref{13ad,,-S} option.
The default behavior is to enable tab completion and to use
@code{~/.python_history} as the history save file.  To disable it, delete (or
override) the @ref{11c7,,sys.__interactivehook__} attribute in your
@ref{cd,,sitecustomize} or @ref{114,,usercustomize} module or your
@geindex PYTHONSTARTUP
@geindex 환경 변수; PYTHONSTARTUP
@ref{1b8,,PYTHONSTARTUP} file.


버전 3.4에서 변경: rlcompleter와 히스토리 활성화가 자동으로 이루어졌습니다.


@node 모듈 내용<7>,Command-line interface<11>,Readline 구성,site — 사이트별 구성 훅
@anchor{library/site module-contents}@anchor{4aea}
@subsubsection 모듈 내용


@geindex PREFIXES (site 모듈)
@anchor{library/site site PREFIXES}@anchor{4aeb}
@deffn {데이터} site.PREFIXES

site-packages 디렉터리의 접두사 리스트.
@end deffn

@geindex ENABLE_USER_SITE (site 모듈)
@anchor{library/site site ENABLE_USER_SITE}@anchor{4ae8}
@deffn {데이터} site.ENABLE_USER_SITE

사용자 site-packages 디렉터리의 상태를 나타내는 플래그. @code{True}는 활성화되어 @code{sys.path}에 추가되었음을 의미합니다. @code{False}는 사용자 요청(@ref{1593,,-s}나 
@geindex PYTHONNOUSERSITE
@geindex 환경 변수; PYTHONNOUSERSITE
@ref{1594,,PYTHONNOUSERSITE}로)에 의해 비활성화되었음을 의미합니다. @code{None}은 보안상의 이유(사용자나 그룹 id와 유효(effective) id가 일치하지 않음)로 또는 관리자에 의해 비활성화되었음을 의미합니다.
@end deffn

@geindex USER_SITE (site 모듈)
@anchor{library/site site USER_SITE}@anchor{2123}
@deffn {데이터} site.USER_SITE

실행 중인 파이썬의 사용자 site-packages 경로. @ref{1445,,getusersitepackages()}가 아직 호출되지 않았으면 @code{None}일 수 있습니다. 기본값은 유닉스와 비 프레임워크 맥 OS 빌드의 경우 @code{~/.local/lib/python`X.Y'[t]/site-packages}, 맥 OS 프레임워크 빌드의 경우 @code{~/Library/Python/`X.Y'/lib/python/site-packages}, 윈도우의 경우 @code{`%APPDATA%'\Python\Python`XY'\site-packages}입니다. 선택적 “t” 는 자유 스레딩 빌드를 나타냅니다. 이 디렉터리는 사이트 디렉터리이며, 이는 그 안에 있는 @code{.pth} 파일이 처리됨을 의미합니다.
@end deffn

@geindex USER_BASE (site 모듈)
@anchor{library/site site USER_BASE}@anchor{1521}
@deffn {데이터} site.USER_BASE

사용자 site-packages의 베이스 디렉터리에 대한 경로. @ref{1444,,getuserbase()}가 아직 호출되지 않았으면 @code{None}일 수 있습니다. 기본값은 유닉스와 맥 OS 비 프레임워크 빌드의 경우 @code{~/.local}, 맥 OS 프레임워크 빌드의 경우 @code{~/Library/Python/`X.Y'}, 윈도우의 경우 @code{`%APPDATA%'\Python}입니다. 이 값은 @ref{2134,,사용자 설치 스킴}의 스크립트, 데이터 파일, 파이썬 모듈 등의 설치 디렉터리를 계산하는 데 사용됩니다. 
@geindex PYTHONUSERBASE
@geindex 환경 변수; PYTHONUSERBASE
@ref{1592,,PYTHONUSERBASE} 도 참조하십시오.
@end deffn

@geindex main() (site 모듈)
@anchor{library/site site main}@anchor{2124}
@deffn {함수} site.main ()

모든 표준 사이트별 디렉터리를 모듈 검색 경로에 추가합니다. 파이썬 인터프리터가 @ref{13ad,,-S} 플래그로 시작되지 않았으면, 이 모듈이 임포트 될 때 이 함수가 자동으로 호출됩니다.


버전 3.3에서 변경: 이 함수는 무조건 호출되었습니다.

@end deffn

@geindex addsitedir() (site 모듈)
@anchor{library/site site addsitedir}@anchor{226f}
@deffn {함수} site.addsitedir (sitedir, known_paths=None)

sys.path에 디렉터리를 추가하고 @code{.pth} 파일을 처리합니다. 일반적으로 @ref{cd,,sitecustomize}나 @ref{114,,usercustomize}에서 사용됩니다 (위를 참조하십시오).
@end deffn

@geindex getsitepackages() (site 모듈)
@anchor{library/site site getsitepackages}@anchor{1443}
@deffn {함수} site.getsitepackages ()

모든 전역 site-packages 디렉터리를 포함하는 리스트를 반환합니다.


Added in version 3.2.

@end deffn

@geindex getuserbase() (site 모듈)
@anchor{library/site site getuserbase}@anchor{1444}
@deffn {함수} site.getuserbase ()

사용자 베이스 디렉터리 @ref{1521,,USER_BASE}의 경로를 반환합니다. 아직 초기화되지 않았으면, 이 함수는 
@geindex PYTHONUSERBASE
@geindex 환경 변수; PYTHONUSERBASE
@ref{1592,,PYTHONUSERBASE}를 따라 설정합니다.


Added in version 3.2.

@end deffn

@geindex getusersitepackages() (site 모듈)
@anchor{library/site site getusersitepackages}@anchor{1445}
@deffn {함수} site.getusersitepackages ()

사용자별 site-packages 디렉터리 @ref{2123,,USER_SITE}의 경로를 반환합니다. 아직 초기화되지 않았으면, 이 함수는 @ref{1521,,USER_BASE}를 따라 설정합니다. 사용자별 site-packages가 @code{sys.path}에 추가되었는지 확인하려면 @ref{4ae8,,ENABLE_USER_SITE}를 사용해야 합니다.


Added in version 3.2.

@end deffn

@node Command-line interface<11>,,모듈 내용<7>,site — 사이트별 구성 훅
@anchor{library/site command-line-interface}@anchor{4aec}@anchor{library/site site-commandline}@anchor{4aed}
@subsubsection Command-line interface


The @code{site} module also provides a way to get the user directories from the
command line:

@example
$ python -m site --user-site
/home/user/.local/lib/python3.11/site-packages
@end example

인자 없이 호출되면, 표준 출력에 @ref{3e4,,sys.path}의 내용을 인쇄한 다음, @ref{1521,,USER_BASE}의 값과 디렉터리가 존재하는지를 인쇄하고, @ref{2123,,USER_SITE}에 대해 같은 것을 인쇄하고, 마지막으로 @ref{4ae8,,ENABLE_USER_SITE}의 값을 인쇄합니다.

@geindex site 명령줄 옵션; --user-base
@anchor{library/site cmdoption-site-user-base}@anchor{4aee}
@deffn {Option} @w{-}@w{-}user@w{-}base

사용자 베이스 디렉터리의 경로를 인쇄합니다.
@end deffn

@geindex site 명령줄 옵션; --user-site
@anchor{library/site cmdoption-site-user-site}@anchor{4aef}
@deffn {Option} @w{-}@w{-}user@w{-}site

사용자 site-packages 디렉터리의 경로를 인쇄합니다.
@end deffn

두 옵션이 모두 제공되면, @ref{2131,,os.pathsep}으로 구분하여, 사용자 베이스와 사용자 사이트를 (항상 이 순서대로) 인쇄합니다.

어떤 옵션이건 제공되면, 스크립트는 다음 값 중 하나로 종료됩니다: 사용자 site-packages 디렉터리가 활성화되었으면 @code{0}, 사용자에 의해 비활성화되었으면 @code{1}, 보안상의 이유나 관리자에 의해 비활성화되었으면 @code{2}, 그리고 에러가 있으면 2보다 큰 값.


@subsubheading 더 보기



@itemize *

@item 
@geindex Python 향상 제안; PEP 370
PEP 370@footnote{https://peps.python.org/pep-0370/} – 사용자별 site-packages 디렉터리

@item 
@ref{18dd,,The initialization of the sys.path module search path} – The initialization of @ref{3e4,,sys.path}.
@end itemize


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)


@subsubheading 더 보기



@itemize *

@item 
See the @ref{25,,concurrent.interpreters} module, which similarly
exposes core runtime functionality.
@end itemize


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 사용자 정의 파이썬 인터프리터,모듈 임포트 하기,파이썬 실행시간 서비스,파이썬 표준 라이브러리
@anchor{library/custominterp doc}@anchor{4af0}@anchor{library/custominterp custom-python-interpreters}@anchor{4af1}@anchor{library/custominterp custominterp}@anchor{4af2}@anchor{library/custominterp translation-repo}@anchor{4af3}
@section 사용자 정의 파이썬 인터프리터


이 장에서 설명하는 모듈은 파이썬의 대화형 인터프리터와 비슷한 인터페이스를 작성할 수 있도록 합니다. 파이썬 언어 외에도 몇 가지 특별한 기능을 지원하는 파이썬 인터프리터를 원한다면, @ref{1b,,code} 모듈을 살펴보아야 합니다. (@ref{1d,,codeop} 모듈은 더 저수준이며, 불완전할 수도 있는 파이썬 코드 조각의 컴파일을 지원하는 데 사용됩니다.)

이 장에서 설명하는 모듈의 전체 목록은 다음과 같습니다:

@menu
* code — 인터프리터 베이스 클래스:: 
* codeop — 파이썬 코드 컴파일:: 

@end menu

@node code — 인터프리터 베이스 클래스,codeop — 파이썬 코드 컴파일,,사용자 정의 파이썬 인터프리터
@anchor{library/code doc}@anchor{4af4}@anchor{library/code code-interpreter-base-classes}@anchor{4af5}@anchor{library/code module-code}@anchor{1b}
@subsection @code{code} — 인터프리터 베이스 클래스


@geindex module; code

`소스 코드:' Lib/code.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/code.py}


__________________________________________________________________


@code{code} 모듈은 파이썬에서 REPL(read-eval-print loop)을 구현하는 기능을 제공합니다. 대화형 인터프리터 프롬프트를 제공하는 응용 프로그램을 만드는 데 사용할 수 있는 두 개의 클래스와 편리 함수들이 포함되어 있습니다.

@geindex InteractiveInterpreter (code 클래스)
@anchor{library/code code InteractiveInterpreter}@anchor{1944}
@deffn {클래스} code.InteractiveInterpreter (locals=None)

이 클래스는 구문 분석과 인터프리터 상태(사용자의 이름 공간)를 처리합니다; 입력 버퍼링이나 프롬프트 또는 입력 파일 이름 지정을 처리하지 않습니다 (파일명은 항상 명시적으로 전달됩니다). 선택적 `locals' 인자는 코드가 실행될 이름 공간으로 사용될 매핑을 지정합니다; 기본값은 키 @code{'__name__'}이 @code{'__console__'}로 설정되고 키 @code{'__doc__'}이 @code{None}으로 설정된 새로 만들어진 딕셔너리입니다.

Note that functions and classes objects created under an
@code{InteractiveInterpreter} instance will belong to the namespace
specified by `locals'.
They are only pickleable if `locals' is the namespace of an existing
module.
@end deffn

@geindex InteractiveConsole (code 클래스)
@anchor{library/code code InteractiveConsole}@anchor{282a}
@deffn {클래스} code.InteractiveConsole (locals=None, filename='<console>', local_exit=False)

대화형 파이썬 인터프리터의 동작을 가깝게 흉내 냅니다. 이 클래스는 @ref{1944,,InteractiveInterpreter}를 기반으로 하며 친숙한 @code{sys.ps1}과 @code{sys.ps2}를 사용하는 프롬프트와 입력 버퍼링을 추가합니다. `local_exit'가 참이면, 콘솔에서의 @code{exit()}와 @code{quit()}는 @ref{f3b,,SystemExit}를 발생시키지 않고, 대신 호출 코드로 돌아갑니다.


버전 3.13에서 변경: `local_exit' 매개 변수가 추가되었습니다.

@end deffn

@geindex interact() (code 모듈)
@anchor{library/code code interact}@anchor{1892}
@deffn {함수} code.interact (banner=None, readfunc=None, local=None, exitmsg=None, local_exit=False)

REPL(read-eval-print loop)를 실행하는 편리 함수. 이것은 @ref{282a,,InteractiveConsole}의 새 인스턴스를 만들고, 제공된다면 `readfunc'가 @ref{4af6,,InteractiveConsole.raw_input()} 메서드로 사용되도록 설정합니다. `local'이 제공되면 인터프리터 루프의 기본 이름 공간으로 사용하기 위해 @code{InteractiveConsole} 생성자로 전달됩니다. `local_exit'가 제공되면 @code{InteractiveConsole} 생성자로 전달됩니다. 그런 다음 인스턴스의 @ref{4af7,,interact()} 메서드를 실행하는데, 제공된다면 `banner'와 `exitmsg'를 각각 배너와 종료 메시지로 사용하도록 전달합니다. 콘솔 객체는 사용 후에 폐기됩니다.


버전 3.6에서 변경: `exitmsg' 매개 변수가 추가되었습니다.



버전 3.13에서 변경: `local_exit' 매개 변수가 추가되었습니다.

@end deffn

@geindex compile_command() (code 모듈)
@anchor{library/code code compile_command}@anchor{4af8}
@deffn {함수} code.compile_command (source, filename='<input>', symbol='single')

이 함수는 파이썬의 인터프리터 메인 루프(소위 REPL)를 흉내 내고 싶은 프로그램에 유용합니다. 까다로운 부분은 사용자가 후에 추가의 텍스트를 입력해서 완성할 수 있는 불완전한 명령을 입력했는지를 결정하는 것입니다 (완전한 명령이나 문법 에러가 아니라). 이 함수는 `거의' 항상 실제 인터프리터 메인 루프와 같은 결정을 내립니다.

`source'는 소스 문자열입니다; `filename'은 소스를 읽어 들인 선택적 파일명이며, 기본값은 @code{'<input>'}입니다; 그리고 `symbol'은 선택적 문법 시작 기호이며 @code{'single'} (기본값), @code{'eval'} 또는 @code{'exec'} 중 하나여야 합니다.

명령이 완전하고 유효하면 코드 객체(@code{compile(source, filename, symbol)}와 같습니다)를 반환합니다; 명령이 불완전하면 @code{None}을 반환합니다; 명령이 완전하고 문법 에러가 있으면 @ref{18e,,SyntaxError}를 발생시키고, 명령에 유효하지 않은 리터럴이 포함되었으면 @ref{a81,,OverflowError}나 @ref{2ec,,ValueError}를 발생시킵니다.
@end deffn

@menu
* 대화형 인터프리터 객체:: 
* 대화형 콘솔 객체:: 

@end menu

@node 대화형 인터프리터 객체,대화형 콘솔 객체,,code — 인터프리터 베이스 클래스
@anchor{library/code interactive-interpreter-objects}@anchor{4af9}@anchor{library/code interpreter-objects}@anchor{4afa}
@subsubsection 대화형 인터프리터 객체


@geindex runsource() (code.InteractiveInterpreter 메서드)
@anchor{library/code code InteractiveInterpreter runsource}@anchor{4afb}
@deffn {메서드} InteractiveInterpreter.runsource (source, filename='<input>', symbol='single')

인터프리터에서 소스를 컴파일하고 실행합니다. 인자는 @ref{4af8,,compile_command()}와 같습니다; `filename'의 기본값은 @code{'<input>'}이고, `symbol'의 기본값은 @code{'single'}입니다. 여러 가지 중 하나가 발생할 수 있습니다:


@itemize *

@item 
입력이 잘못되었습니다; @ref{4af8,,compile_command()}가 예외(@ref{18e,,SyntaxError}나 @ref{a81,,OverflowError})를 발생시켰습니다. 문법 트레이스백이 @ref{4afc,,showsyntaxerror()} 메서드를 호출하여 인쇄됩니다. @ref{4afb,,runsource()}는 @code{False}를 반환합니다.

@item 
입력이 불완전하고, 더 많은 입력이 필요합니다; @ref{4af8,,compile_command()}가 @code{None}을 반환했습니다. @ref{4afb,,runsource()}는 @code{True}를 반환합니다.

@item 
입력이 완전합니다; @ref{4af8,,compile_command()}가 코드 객체를 반환했습니다. 코드는 @ref{4afd,,runcode()}(@ref{f3b,,SystemExit}를 제외한 실행 시간 예외도 처리합니다)를 호출하여 실행됩니다. @ref{4afb,,runsource()}는 @code{False}를 반환합니다.
@end itemize

반환 값은 다음 줄의 프롬프트에 @code{sys.ps1}과 @code{sys.ps2} 중 어느 것을 사용할지 결정하는 데 사용될 수 있습니다.
@end deffn

@geindex runcode() (code.InteractiveInterpreter 메서드)
@anchor{library/code code InteractiveInterpreter runcode}@anchor{4afd}
@deffn {메서드} InteractiveInterpreter.runcode (code)

코드 객체를 실행합니다. 예외가 발생하면, @ref{fcd,,showtraceback()}가 호출되어 트레이스백을 표시합니다. 전파가 허락된 @ref{f3b,,SystemExit}를 제외한 모든 예외를 잡습니다.

@ref{bc4,,KeyboardInterrupt}에 대한 노트: 이 예외는 이 코드의 어딘가에서 발생할 수 있으며, 항상 잡히지는 않습니다. 호출자는 이것을 처리할 준비가 되어 있어야 합니다.
@end deffn

@geindex showsyntaxerror() (code.InteractiveInterpreter 메서드)
@anchor{library/code code InteractiveInterpreter showsyntaxerror}@anchor{4afc}
@deffn {메서드} InteractiveInterpreter.showsyntaxerror (filename=None)

방금 발생한 문법 에러를 표시합니다. 스택 트레이스는 표시하지 않습니다, 문법 에러에는 그런 것이 없기 때문입니다. `filename'이 주어지면, 파이썬 구문 분석기가 제공하는 기본 파일명 대신에 예외에 채워집니다, 문자열에서 읽을 때는 항상 @code{'<string>'}을 사용하기 때문입니다. 출력은 @ref{4afe,,write()} 메서드로 기록됩니다.
@end deffn

@geindex showtraceback() (code.InteractiveInterpreter 메서드)
@anchor{library/code code InteractiveInterpreter showtraceback}@anchor{fcd}
@deffn {메서드} InteractiveInterpreter.showtraceback ()

방금 발생한 예외를 표시합니다. 첫 번째 스택 항목을 제거합니다, 그것은 인터프리터 객체 구현에 속하기 때문입니다. 출력은 @ref{4afe,,write()} 메서드로 기록됩니다.


버전 3.5에서 변경: 단지 기본(primary) 트레이스백이 아니라 전체 연결된(chained) 트레이스백이 표시됩니다.

@end deffn

@geindex write() (code.InteractiveInterpreter 메서드)
@anchor{library/code code InteractiveInterpreter write}@anchor{4afe}
@deffn {메서드} InteractiveInterpreter.write (data)

문자열을 표준 에러 스트림(@code{sys.stderr})에 기록합니다. 파생 클래스는 필요에 따라 적절한 출력 처리를 제공하기 위해 이것을 재정의해야 합니다.
@end deffn

@node 대화형 콘솔 객체,,대화형 인터프리터 객체,code — 인터프리터 베이스 클래스
@anchor{library/code console-objects}@anchor{4aff}@anchor{library/code interactive-console-objects}@anchor{4b00}
@subsubsection 대화형 콘솔 객체


@ref{282a,,InteractiveConsole} 클래스는 @ref{1944,,InteractiveInterpreter}의 서브 클래스이므로, 인터프리터 객체의 모든 메서드와 다음과 같은 추가 메서드를 제공합니다.

@geindex interact() (code.InteractiveConsole 메서드)
@anchor{library/code code InteractiveConsole interact}@anchor{4af7}
@deffn {메서드} InteractiveConsole.interact (banner=None, exitmsg=None)

대화형 파이썬 콘솔을 가깝게 흉내 냅니다. 선택적 `banner' 인자는 첫 번째 상호 작용 전에 인쇄할 배너를 지정합니다; 기본적으로 표준 파이썬 인터프리터가 출력하는 것과 비슷한 배너를 출력한 다음 괄호 안에 콘솔 객체의 클래스 이름을 출력합니다 (실제 인터프리터와 혼동하지 않도록 하기 위함입니다 – 너무 비슷합니다!).

선택적 `exitmsg' 인자는 종료할 때 인쇄되는 종료 메시지를 지정합니다. 종료 메시지를 표시하지 않으려면 빈 문자열을 전달하십시오. `exitmsg'가 주어지지 않았거나 @code{None}이면, 기본 메시지가 인쇄됩니다.


버전 3.4에서 변경: 배너 인쇄를 억제하려면, 빈 문자열을 전달하십시오.



버전 3.6에서 변경: 종료할 때 종료 메시지를 인쇄합니다.

@end deffn

@geindex push() (code.InteractiveConsole 메서드)
@anchor{library/code code InteractiveConsole push}@anchor{4b01}
@deffn {메서드} InteractiveConsole.push (line)

소스 텍스트 줄을 인터프리터로 밀어 넣습니다. line에는 후행 줄 바꿈이 없어야 합니다; 내부 줄 바꿈은 있을 수 있습니다. 줄은 버퍼에 추가되고 인터프리터의 @ref{4afb,,runsource()} 메서드가 이어붙인 버퍼의 내용을 소스로 하여 호출됩니다. 이것이 명령이 실행되었거나 유효하지 않았다고 알리면 버퍼는 재설정됩니다; 그렇지 않고 명령이 불완전하다면, 버퍼는 줄을 추가한 상태로 유지됩니다. 반환 값은 추가 입력이 필요하면 @code{True}이고, 어떤 식으로든 줄이 처리되었으면 @code{False}입니다 (@code{runsource()}와 같습니다).
@end deffn

@geindex resetbuffer() (code.InteractiveConsole 메서드)
@anchor{library/code code InteractiveConsole resetbuffer}@anchor{4b02}
@deffn {메서드} InteractiveConsole.resetbuffer ()

처리되지 않은 소스 텍스트를 입력 버퍼에서 제거합니다.
@end deffn

@geindex raw_input() (code.InteractiveConsole 메서드)
@anchor{library/code code InteractiveConsole raw_input}@anchor{4af6}
@deffn {메서드} InteractiveConsole.raw_input (prompt='@w{'})

프롬프트를 기록하고 줄을 읽습니다. 반환된 줄에는 후행 줄 바꿈이 포함되지 않습니다. 사용자가 EOF 키 시퀀스를 입력하면, @ref{14de,,EOFError}가 발생합니다. 기본 구현은 @code{sys.stdin}에서 읽습니다; 서브 클래스는 이것을 다른 구현으로 바꿀 수 있습니다.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node codeop — 파이썬 코드 컴파일,,code — 인터프리터 베이스 클래스,사용자 정의 파이썬 인터프리터
@anchor{library/codeop doc}@anchor{4b03}@anchor{library/codeop codeop-compile-python-code}@anchor{4b04}@anchor{library/codeop module-codeop}@anchor{1d}@anchor{library/codeop translation-repo}@anchor{4b05}
@subsection @code{codeop} — 파이썬 코드 컴파일


@geindex module; codeop

`소스 코드:' Lib/codeop.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/codeop.py}


__________________________________________________________________


The @code{codeop} module provides utilities upon which the Python
read-eval-print loop can be emulated, as is done in the @ref{1b,,code} module.  As
a result, you probably don’t want to use the module directly; if you want to
include such a loop in your program you probably want to use the @code{code}
module instead.

이 작업에는 두 가지 부분이 있습니다:


@enumerate 

@item 
입력 줄이 파이썬 문장을 완성하는지 알려주는 것: 간단히 말해서, ‘@code{>>>}’ 나 ‘@code{...}’ 를 다음에 인쇄할지 알려주기.

@item 
사용자가 입력한 퓨처 문을 기억해서, 후속 입력을 컴파일할 때 이것들이 효과가 있도록 하기.
@end enumerate

The @code{codeop} module provides a way of doing each of these things, and a way
of doing them both.

단지 전자를 수행하려면:

@geindex compile_command() (codeop 모듈)
@anchor{library/codeop codeop compile_command}@anchor{1b51}
@deffn {함수} codeop.compile_command (source, filename='<input>', symbol='single')

`source'를 컴파일하려고 시도합니다. `source'는 파이썬 코드의 문자열이어야 하며, `source'가 유효한 파이썬 코드면 코드 객체를 반환합니다. 이 경우, 코드 객체의 filename 어트리뷰트는 `filename'가 되는데, 기본값은 @code{'<input>'}입니다. `source'가 `유효한 파이썬 코드가 *아니지만' 유효한 파이썬 코드의 앞부분이면 @code{None}을 반환합니다.

`source'에 문제가 있으면, 예외가 발생합니다. 유효하지 않은 파이썬 구문이 있으면 @ref{18e,,SyntaxError}가 발생하고, 유효하지 않은 리터럴이 있으면 @ref{a81,,OverflowError} 나 @ref{2ec,,ValueError}가 발생합니다.

`symbol' 인자는 `source'가 문장(@code{'single'}, 기본값)으로 컴파일되는지, @ref{2c23,,문장}의 시퀀스(@code{'exec'})로 컴파일되는지 또는 @ref{23cf,,표현식}(@code{'eval'})으로 컴파일되는지 결정합니다. 다른 값을 지정하면 @ref{2ec,,ValueError}가 발생합니다.

@cartouche
@quotation 참고 
구문 분석기가 source의 끝에 도달하기 전에 성공적인 결과로 구문 분석을 중지하는 것이 가능합니다 (하지만 대체로 그렇지 않습니다); 이 경우, 뒤따르는 기호는 에러를 유발하는 대신 무시 될 수 있습니다. 예를 들어, 백 슬래시 뒤에 두 개의 개행이 오면 그 뒤에 임의의 가비지가 올 수 있습니다. 구문 분석기를 위한 API가 개선되면 이 문제가 해결될 것입니다.
@end quotation
@end cartouche
@end deffn

@geindex Compile (codeop 클래스)
@anchor{library/codeop codeop Compile}@anchor{4b06}
@deffn {클래스} codeop.Compile

이 클래스의 인스턴스는 내장 함수 @ref{4b2,,compile()}와 같은 서명의 @ref{779,,__call__()} 메서드를 갖지만, 인스턴스가 @ref{0,,__future__} 문을 포함하는 프로그램 텍스트를 컴파일하면 인스턴스가 이를 ‘기억’하고 모든 후속 프로그램 텍스트를 이 문장의 효과 아래에서 컴파일한다는 차이점이 있습니다.
@end deffn

@geindex CommandCompiler (codeop 클래스)
@anchor{library/codeop codeop CommandCompiler}@anchor{4b07}
@deffn {클래스} codeop.CommandCompiler

이 클래스의 인스턴스는 @ref{1b51,,compile_command()}와 같은 서명의 @ref{779,,__call__()} 메서드를 갖습니다; 차이점은, 인스턴스가 @ref{0,,__future__} 문을 포함하는 프로그램 텍스트를 컴파일하면 인스턴스가 이를 ‘기억’하고 모든 후속 프로그램 텍스트를 이 문장의 효과 아래에서 컴파일한다는 것입니다.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 모듈 임포트 하기,파이썬 언어 서비스,사용자 정의 파이썬 인터프리터,파이썬 표준 라이브러리
@anchor{library/modules doc}@anchor{4b08}@anchor{library/modules importing-modules}@anchor{4b09}@anchor{library/modules modules}@anchor{4b0a}@anchor{library/modules translation-repo}@anchor{4b0b}
@section 모듈 임포트 하기


이 장에서 설명하는 모듈은 다른 파이썬 모듈을 임포트하는 새로운 방법과 임포트 절차를 사용자 정의하기 위한 훅을 제공합니다.

이 장에서 설명하는 모듈의 전체 목록은 다음과 같습니다:

@menu
* zipimport — Zip 저장소에서 모듈 임포트:: 
* pkgutil — 패키지 확장 유틸리티:: 
* modulefinder — 스크립트에서 사용되는 모듈 찾기:: 
* runpy — 파이썬 모듈 찾기와 실행:: 
* importlib — import의 구현:: 
* importlib.resources – Package resource reading@comma{} opening and access: importlib resources – Package resource reading opening and access. 
* importlib.resources.abc – Abstract base classes for resources: importlib resources abc – Abstract base classes for resources. 
* importlib.metadata – 패키지 메타데이터 액세스: importlib metadata – 패키지 메타데이터 액세스. 
* The initialization of the sys.path module search path: The initialization of the sys path module search path. 

@end menu

@node zipimport — Zip 저장소에서 모듈 임포트,pkgutil — 패키지 확장 유틸리티,,모듈 임포트 하기
@anchor{library/zipimport doc}@anchor{4b0c}@anchor{library/zipimport module-zipimport}@anchor{138}@anchor{library/zipimport zipimport-import-modules-from-zip-archives}@anchor{4b0d}
@subsection @code{zipimport} — Zip 저장소에서 모듈 임포트


@geindex module; zipimport

`소스 코드:' Lib/zipimport.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/zipimport.py}


__________________________________________________________________


This module adds the ability to import Python modules (@code{*.py},
@code{*.pyc}) and packages from ZIP-format archives. It is usually not
needed to use the @code{zipimport} module explicitly; it is automatically used
by the built-in @ref{7f7,,import} mechanism for @ref{3e4,,sys.path} items that are paths
to ZIP archives.

일반적으로, @ref{3e4,,sys.path}는 문자열 디렉터리 이름의 리스트입니다. 이 모듈은 또한 @code{sys.path} 항목이 ZIP 파일 저장소를 명명하는 문자열이 될 수 있도록 합니다. ZIP 저장소에는 패키지 임포트를 지원하는 하위 디렉터리 구조가 포함될 수 있으며, 저장소 내의 경로를 지정하여 하위 디렉터리에서만 임포트 되도록 할 수 있습니다. 예를 들어, 경로 @code{example.zip/lib/}는 저장소 내의 @code{lib/} 서브 디렉터리에서만 임포트하도록 합니다.

어떤 파일이든 ZIP 저장소에 있을 수 있지만, 임포터는 @code{.py} 와 @code{.pyc} 파일에 대해서만 호출됩니다. 동적 모듈(@code{.pyd}, @code{.so})의 ZIP 임포트는 허용되지 않습니다. 저장소에 @code{.py} 파일만 포함되어있으면, 파이썬은 해당 @code{.pyc} 파일을 추가하여 저장소를 수정하지 않습니다. 즉, ZIP 저장소에 @code{.pyc} 파일이 포함되어 있지 않으면, 임포트가 다소 느릴 수 있습니다.


버전 3.13에서 변경: ZIP64 를 지원합니다



버전 3.8에서 변경: 전에는, 저장소 주석이 포함된 ZIP 저장소는 지원되지 않았습니다.



@subsubheading 더 보기



@table @asis

@item PKZIP Application Note@footnote{https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT}

사용된 형식과 알고리즘 저자인 Phil Katz의 ZIP 파일 형식에 관한 설명서.

@geindex Python 향상 제안; PEP 273

@item PEP 273@footnote{https://peps.python.org/pep-0273/} - Zip 저장소에서 모듈 임포트

구현도 제공한 James C. Ahlstrom이 작성했습니다. 파이썬 2.3은 
@geindex Python 향상 제안; PEP 273
PEP 273@footnote{https://peps.python.org/pep-0273/}의 명세를 따르지만, Just van Rossum이 작성한 구현을 사용하는데 
@geindex Python 향상 제안; PEP 302
PEP 302@footnote{https://peps.python.org/pep-0302/}에 설명된 임포트 훅을 사용합니다.

@item @ref{7b,,importlib} - The implementation of the import machinery

Package providing the relevant protocols for all importers to
implement.
@end table


이 모듈은 예외를 정의합니다:

@geindex ZipImportError
@anchor{library/zipimport zipimport ZipImportError}@anchor{4b0e}
@deffn {예외} zipimport.ZipImportError

zipimporter 객체가 발생시키는 예외. @ref{659,,ImportError}의 서브 클래스이므로, @code{ImportError}로도 잡힐 수 있습니다.
@end deffn

@menu
* zipimporter 객체:: 
* 예제: 예제<28>. 

@end menu

@node zipimporter 객체,예제<28>,,zipimport — Zip 저장소에서 모듈 임포트
@anchor{library/zipimport id1}@anchor{4b0f}@anchor{library/zipimport zipimporter-objects}@anchor{4b10}
@subsubsection zipimporter 객체


@ref{4b11,,zipimporter}는 ZIP 파일을 임포트하는 클래스입니다.

@geindex zipimporter (zipimport 클래스)
@anchor{library/zipimport zipimport zipimporter}@anchor{4b11}
@deffn {클래스} zipimport.zipimporter (archivepath)

새로운 zipimporter 인스턴스를 만듭니다. `archivepath'는 ZIP 파일의 경로이거나, ZIP 파일 내의 특정 경로여야 합니다. 예를 들어, `archivepath' @code{foo/bar.zip/lib}는 ZIP 파일 @code{foo/bar.zip} 내의 @code{lib} 디렉터리에 있는 모듈을 찾습니다 (존재한다면).

`archivepath'가 유효한 ZIP 저장소를 가리키지 않으면 @ref{4b0e,,ZipImportError}가 발생합니다.


버전 3.12에서 변경: Methods @code{find_loader()} and @code{find_module()}, deprecated in 3.10 are
now removed.  Use @ref{a5e,,find_spec()} instead.


@geindex create_module() (zipimport.zipimporter 메서드)
@anchor{library/zipimport zipimport zipimporter create_module}@anchor{a5f}
@deffn {메서드} create_module (spec)

Implementation of @ref{eab,,importlib.abc.Loader.create_module()} that returns
@ref{884,,None} to explicitly request the default semantics.


Added in version 3.10.

@end deffn

@geindex exec_module() (zipimport.zipimporter 메서드)
@anchor{library/zipimport zipimport zipimporter exec_module}@anchor{339}
@deffn {메서드} exec_module (module)

Implementation of @ref{a6a,,importlib.abc.Loader.exec_module()}.


Added in version 3.10.

@end deffn

@geindex find_spec() (zipimport.zipimporter 메서드)
@anchor{library/zipimport zipimport zipimporter find_spec}@anchor{a5e}
@deffn {메서드} find_spec (fullname, target=None)

An implementation of @ref{a6c,,importlib.abc.PathEntryFinder.find_spec()}.


Added in version 3.10.

@end deffn

@geindex get_code() (zipimport.zipimporter 메서드)
@anchor{library/zipimport zipimport zipimporter get_code}@anchor{4b12}
@deffn {메서드} get_code (fullname)

지정된 모듈의 코드 객체를 반환합니다. 모듈을 임포트할 수 없으면 @ref{4b0e,,ZipImportError}를 발생시킵니다.
@end deffn

@geindex get_data() (zipimport.zipimporter 메서드)
@anchor{library/zipimport zipimport zipimporter get_data}@anchor{4b13}
@deffn {메서드} get_data (pathname)

`pathname'와 관련된 데이터를 반환합니다. 파일을 찾을 수 없으면 @ref{2c0,,OSError}를 발생시킵니다.


버전 3.3에서 변경: @ref{1252,,IOError} 를 발생시켜왔습니다, 이제 @ref{2c0,,OSError}의 별칭입니다.

@end deffn

@geindex get_filename() (zipimport.zipimporter 메서드)
@anchor{library/zipimport zipimport zipimporter get_filename}@anchor{4b14}
@deffn {메서드} get_filename (fullname)

지정한 모듈이 임포트될 때 설정될 @code{__file__}의 값을 반환합니다. 모듈을 임포트할 수 없으면 @ref{4b0e,,ZipImportError}를 발생시킵니다.


Added in version 3.1.

@end deffn

@geindex get_source() (zipimport.zipimporter 메서드)
@anchor{library/zipimport zipimport zipimporter get_source}@anchor{4b15}
@deffn {메서드} get_source (fullname)

지정된 모듈의 소스 코드를 반환합니다. 모듈을 찾을 수 없으면 @ref{4b0e,,ZipImportError}를 발생시키고, 저장소에 모듈이 있지만, 소스가 없으면 @ref{884,,None}을 반환합니다.
@end deffn

@geindex is_package() (zipimport.zipimporter 메서드)
@anchor{library/zipimport zipimport zipimporter is_package}@anchor{4b16}
@deffn {메서드} is_package (fullname)

`fullname'으로 지정된 모듈이 패키지면 @code{True}를 반환합니다. 모듈을 찾을 수 없으면 @ref{4b0e,,ZipImportError}를 발생시킵니다.
@end deffn

@geindex load_module() (zipimport.zipimporter 메서드)
@anchor{library/zipimport zipimport zipimporter load_module}@anchor{338}
@deffn {메서드} load_module (fullname)

`fullname'으로 지정된 모듈을 로드 합니다. `fullname'은 완전히 정규화된 (점으로 구분된) 모듈 이름이어야 합니다. 성공하면 임포트 된 모듈을 반환하고, 실패하면 @ref{4b0e,,ZipImportError}를 발생시킵니다.


Deprecated since version 3.10, will be removed in version 3.15: Use @ref{339,,exec_module()} instead.

@end deffn

@geindex invalidate_caches() (zipimport.zipimporter 메서드)
@anchor{library/zipimport zipimport zipimporter invalidate_caches}@anchor{a60}
@deffn {메서드} invalidate_caches ()

Clear out the internal cache of information about files found within
the ZIP archive.


Added in version 3.10.

@end deffn

@geindex archive (zipimport.zipimporter의 속성)
@anchor{library/zipimport zipimport zipimporter archive}@anchor{4b17}
@deffn {속성} archive

있을 수도 있는 하위 경로를 제외한, 임포터와 연결된 ZIP 파일의 파일 이름.
@end deffn

@geindex prefix (zipimport.zipimporter의 속성)
@anchor{library/zipimport zipimport zipimporter prefix}@anchor{4b18}
@deffn {속성} prefix

모듈이 검색되는 ZIP 파일 내의 하위 경로. ZIP 파일의 루트를 가리키는 zipimporter 객체에서는 빈 문자열입니다.
@end deffn

@ref{4b17,,archive}와 @ref{4b18,,prefix} 어트리뷰트는, 슬래시로 결합 될 때, @ref{4b11,,zipimporter} 생성자에 지정된 원래 `archivepath' 인자와 같습니다.
@end deffn

@node 예제<28>,,zipimporter 객체,zipimport — Zip 저장소에서 모듈 임포트
@anchor{library/zipimport examples}@anchor{4b19}@anchor{library/zipimport zipimport-examples}@anchor{4b1a}
@subsubsection 예제


Here is an example that imports a module from a ZIP archive - note that the
@code{zipimport} module is not explicitly used.

@example
$ unzip -l example_archive.zip
Archive:  example_archive.zip
  Length     Date   Time    Name
 --------    ----   ----    ----
     8467  01-01-00 12:30   example.py
 --------                   -------
     8467                   1 file
@end example

@example
>>> import sys
>>> # Add the archive to the front of the module search path
>>> sys.path.insert(0, 'example_archive.zip')
>>> import example
>>> example.__file__
'example_archive.zip/example.py'
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node pkgutil — 패키지 확장 유틸리티,modulefinder — 스크립트에서 사용되는 모듈 찾기,zipimport — Zip 저장소에서 모듈 임포트,모듈 임포트 하기
@anchor{library/pkgutil doc}@anchor{4b1b}@anchor{library/pkgutil module-pkgutil}@anchor{ae}@anchor{library/pkgutil pkgutil-package-extension-utility}@anchor{4b1c}@anchor{library/pkgutil translation-repo}@anchor{4b1d}
@subsection @code{pkgutil} — 패키지 확장 유틸리티


@geindex module; pkgutil

`소스 코드:' Lib/pkgutil.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/pkgutil.py}


__________________________________________________________________


이 모듈은 임포트 시스템, 특히 패키지 지원을 위한 유틸리티를 제공합니다.

@geindex ModuleInfo (pkgutil 클래스)
@anchor{library/pkgutil pkgutil ModuleInfo}@anchor{f47}
@deffn {클래스} pkgutil.ModuleInfo (module_finder, name, ispkg)

모듈 정보에 대한 간략한 요약을 담고 있는 네임드 튜플.


Added in version 3.6.

@end deffn

@geindex extend_path() (pkgutil 모듈)
@anchor{library/pkgutil pkgutil extend_path}@anchor{1925}
@deffn {함수} pkgutil.extend_path (path, name)

패키지를 구성하는 모듈의 검색 경로를 확장합니다. 의도된 사용법은 패키지의 @code{__init__.py}에 다음 코드를 삽입하는 것입니다:

@example
from pkgutil import extend_path
__path__ = extend_path(__path__, __name__)
@end example

@ref{3e4,,sys.path}에 있는 디렉터리들의 모든 서브 디렉터리 중, 패키지의 이름과 일치하는 것들을 패키지의 @ref{2052,,__path__}에 추가합니다. 이것은 하나의 논리적 패키지의 부분들을 여러 디렉터리로 분배하려고 할 때 유용합니다.

@code{*}가 `name' 인자와 일치하는 @code{*.pkg} 파일도 찾습니다. 이 기능은 @code{import}로 시작하는 줄을 특수하게 다루지 않는다는 점을 제외하면, @code{*.pth} 파일과 유사합니다 (자세한 내용은 @ref{cc,,site} 모듈을 참조하십시오). @code{*.pkg} 파일을 액면 그대로 신뢰합니다: 빈 줄을 건너뛰고 주석을 무시하지만, @code{*.pkg} 파일에 있는 모든 항목은 파일 시스템에 있는지에 관계없이 경로에 추가됩니다. (이것은 기능입니다.)

입력 경로가 리스트가 아니면 (프로즌 패키지의 경우처럼) 변경되지 않은 상태로 반환됩니다. 입력 경로는 수정되지 않습니다; 확장한 사본이 반환됩니다. 항목은 사본의 끝에 추가되기만 합니다.

@ref{3e4,,sys.path}기 시퀀스라고 가정합니다. 존재하는 디렉터리를 참조하는 문자열이 아닌 @code{sys.path} 항목은 무시됩니다. 파일명으로 사용될 때 에러를 일으키는 @code{sys.path}의 유니코드 항목은 이 함수가 예외를 발생시키도록 할 수 있습니다 (@ref{c04,,os.path.isdir()} 동작과 일치합니다).
@end deffn

@geindex get_importer() (pkgutil 모듈)
@anchor{library/pkgutil pkgutil get_importer}@anchor{4b1e}
@deffn {함수} pkgutil.get_importer (path_item)

주어진 `path_item'에 대한 @ref{2367,,파인더}를 가져옵니다.

반환된 파인더는 경로 훅 때문에 새로 만들어지면 @ref{7f9,,sys.path_importer_cache}에 캐시 됩니다.

@ref{1223,,sys.path_hooks}의 재검색이 필요하면, 캐시(또는 그 일부)를 수동으로 지울 수 있습니다.


버전 3.3에서 변경: 패키지 내부 
@geindex Python 향상 제안; PEP 302
PEP 302@footnote{https://peps.python.org/pep-0302/} 임포트 에뮬레이션에 의존하는 대신, @ref{7b,,importlib}에 직접 기반하도록 갱신되었습니다.

@end deffn

@geindex iter_importers() (pkgutil 모듈)
@anchor{library/pkgutil pkgutil iter_importers}@anchor{139e}
@deffn {함수} pkgutil.iter_importers (fullname='@w{'})

주어진 모듈 이름에 대해 @ref{2367,,파인더} 객체를 산출(yield)합니다.

If `fullname' contains a @code{'.'}, the finders will be for the package
containing `fullname', otherwise they will be all registered top level
finders (i.e. those on both @ref{f26,,sys.meta_path} and @ref{1223,,sys.path_hooks}).

명명된 모듈이 패키지에 있으면, 이 함수를 호출하는 부작용으로 그 패키지를 임포트 합니다.

모듈 이름을 지정하지 않으면, 모든 최상위 수준 파인더가 생성됩니다.


버전 3.3에서 변경: 패키지 내부 
@geindex Python 향상 제안; PEP 302
PEP 302@footnote{https://peps.python.org/pep-0302/} 임포트 에뮬레이션에 의존하는 대신, @ref{7b,,importlib}에 직접 기반하도록 갱신되었습니다.

@end deffn

@geindex iter_modules() (pkgutil 모듈)
@anchor{library/pkgutil pkgutil iter_modules}@anchor{f46}
@deffn {함수} pkgutil.iter_modules (path=None, prefix='@w{'})

`path'의 모든 서브 모듈에 대한 @ref{f47,,ModuleInfo}를, 또는 `path'가 @code{None}이면, @ref{3e4,,sys.path}에 있는 모든 최상위 모듈을 산출(yield)합니다.

`path'는 @code{None}이거나 모듈을 찾을 경로의 리스트이어야 합니다.

`prefix'는 출력 시 모든 모듈 이름 앞에 출력할 문자열입니다.

@cartouche
@quotation 참고 
@code{iter_modules()} 메서드를 정의하는 @ref{2367,,파인더}에서만 작동합니다. 이 인터페이스는 비표준이므로, 모듈은 @ref{1271,,importlib.machinery.FileFinder}와 @ref{4b11,,zipimport.zipimporter}에 대한 구현도 제공합니다.
@end quotation
@end cartouche


버전 3.3에서 변경: 패키지 내부 
@geindex Python 향상 제안; PEP 302
PEP 302@footnote{https://peps.python.org/pep-0302/} 임포트 에뮬레이션에 의존하는 대신, @ref{7b,,importlib}에 직접 기반하도록 갱신되었습니다.

@end deffn

@geindex walk_packages() (pkgutil 모듈)
@anchor{library/pkgutil pkgutil walk_packages}@anchor{df8}
@deffn {함수} pkgutil.walk_packages (path=None, prefix='@w{'}, onerror=None)

`path'에 재귀적으로 포함된 모든 모듈이나, `path'가 @code{None}이면 모든 액세스할 수 있는 모듈에 대한 @ref{f47,,ModuleInfo}를 산출(yield)합니다.

`path'는 @code{None}이거나 모듈을 찾을 경로의 리스트이어야 합니다.

`prefix'는 출력 시 모든 모듈 이름 앞에 출력할 문자열입니다.

서브 모듈 검색을 위한 @code{__path__} 어트리뷰트에 액세스하기 위해, 이 함수는 주어진 `path'에 있는 모든 `패키지'(모든 모듈이 `아닙니다'!)를 임포트 해야 함에 유의하십시오.

`onerror'는 패키지 임포트를 시도하는 동안 예외가 발생하면 하나의 인자(임포트 하려는 패키지의 이름)로 호출되는 함수입니다. `onerror' 함수가 제공되지 않으면, @ref{659,,ImportError}는 잡아서 무시하고, 다른 모든 예외는 전파되어 검색이 종료됩니다.

예제:

@example
# 파이썬이 액세스할 수 있는 모든 모듈을 나열합니다
walk_packages()

# ctypes의 모든 서브 모듈을 나열합니다
walk_packages(ctypes.__path__, ctypes.__name__ + '.')
@end example

@cartouche
@quotation 참고 
@code{iter_modules()} 메서드를 정의하는 @ref{2367,,파인더}에서만 작동합니다. 이 인터페이스는 비표준이므로, 모듈은 @ref{1271,,importlib.machinery.FileFinder}와 @ref{4b11,,zipimport.zipimporter}에 대한 구현도 제공합니다.
@end quotation
@end cartouche


버전 3.3에서 변경: 패키지 내부 
@geindex Python 향상 제안; PEP 302
PEP 302@footnote{https://peps.python.org/pep-0302/} 임포트 에뮬레이션에 의존하는 대신, @ref{7b,,importlib}에 직접 기반하도록 갱신되었습니다.

@end deffn

@geindex get_data() (pkgutil 모듈)
@anchor{library/pkgutil pkgutil get_data}@anchor{4b1f}
@deffn {함수} pkgutil.get_data (package, resource)

패키지에서 리소스를 가져옵니다.

이것은 @ref{1a28,,로더} @ref{4b20,,get_data} API에 대한 래퍼입니다. `package' 인자는 표준 모듈 형식(@code{foo.bar})의 패키지 이름이어야 합니다. `resource' 인자는 @code{/}를 경로 분리자로 사용하는 상대 파일명의 형식이어야 합니다. 상위 디렉터리 이름 @code{..}는 허용되지 않으며, 루트에서 시작하는(@code{/}로 시작하는) 이름도 허용되지 않습니다.

이 함수는 지정된 리소스의 내용인 바이트열을 반환합니다.

파일시스템에 있는 패키지(이미 임포트 되었습니다)의 경우, 이것은 대략 다음과 동등합니다:

@example
d = os.path.dirname(sys.modules[package].__file__)
data = open(os.path.join(d, resource), 'rb').read()
@end example

패키지를 찾거나 로드 할 수 없거나, 패키지가 @ref{4b20,,get_data}를 지원하지 않는 @ref{1a28,,로더}를 사용하면, @code{None}이 반환됩니다. 특히, @ref{2b2,,이름 공간 패키지}를 위한 로더는 @code{get_data}를 지원하지 않습니다.
@end deffn

@geindex resolve_name() (pkgutil 모듈)
@anchor{library/pkgutil pkgutil resolve_name}@anchor{4b21}
@deffn {함수} pkgutil.resolve_name (name)

이름을 객체로 해석합니다.

이 기능은 표준 라이브러리의 여러 곳에서 사용됩니다 (bpo-12915@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=12915}를 참조하십시오) - 그리고 동등한 기능이 setuptools, Django 및 Pyramid와 같은 널리 사용되는 제삼자 패키지에도 있습니다.

`name'은 다음 형식 중 하나의 문자열 일 것으로 기대됩니다, 여기서 W는 유효한 파이썬 식별자를 나타내는 줄임 표현이며 점은 이러한 의사 정규식에서 리터럴 마침표를 나타냅니다:


@itemize *

@item 
@code{W(.W)*}

@item 
@code{W(.W)*:(W(.W)*)?}
@end itemize

첫 번째 형식은 이전 버전과의 호환성을 위해서만 사용됩니다. 점으로 구분된 이름의 일부는 패키지이고, 나머지는 패키지 내의 어딘가에 있는 객체이며, 다른 객체 안에 중첩되었을 수 있습니다. 패키지가 멈추고 객체 계층 구조가 시작되는 위치는 보는 것 만으로는 유추할 수 없습니다, 이 형식으로는 임포트 시도를 반복해서 수행해야합니다.

두 번째 형식에서, 호출자는 단일 콜론을 제공하여 구분 지점을 명확하게 만듭니다: 콜론 왼쪽의 점으로 구분된 이름은 임포트할 패키지이고, 오른쪽의 점으로 구분된 이름은 해당 패키지 내의 객체 계층 구조입니다. 이 형식에서는 한 번의 임포트만 필요합니다. 콜론으로 끝나면, 모듈 객체가 반환됩니다.

이 함수는 객체(모듈일 수 있습니다)를 반환하거나, 다음 예외 중 하나를 발생시킵니다:

@ref{2ec,,ValueError} – `name'이 인식되는 형식이 아니면.

@ref{659,,ImportError} – 그러지 말아야할 때 임포트가 실패하면.

@ref{5ee,,AttributeError} – 임포트한 패키지 내에서 객체 계층 구조를 탐색하여 원하는 객체에 도달하는 도중 실패가 발생할 때.


Added in version 3.9.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node modulefinder — 스크립트에서 사용되는 모듈 찾기,runpy — 파이썬 모듈 찾기와 실행,pkgutil — 패키지 확장 유틸리티,모듈 임포트 하기
@anchor{library/modulefinder doc}@anchor{4b22}@anchor{library/modulefinder module-modulefinder}@anchor{95}@anchor{library/modulefinder modulefinder-find-modules-used-by-a-script}@anchor{4b23}@anchor{library/modulefinder translation-repo}@anchor{4b24}
@subsection @code{modulefinder} — 스크립트에서 사용되는 모듈 찾기


@geindex module; modulefinder

`소스 코드:' Lib/modulefinder.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/modulefinder.py}


__________________________________________________________________


이 모듈은 스크립트가 임포트 한 모듈 집합을 판단하는 데 사용할 수 있는 @ref{1de2,,ModuleFinder} 클래스를 제공합니다. @code{modulefinder.py}는 스크립트로 실행될 수도 있습니다, 인자로 파이썬 스크립트의 파일 이름을 지정하면, 임포트 된 모듈의 보고서가 인쇄됩니다.

@geindex AddPackagePath() (modulefinder 모듈)
@anchor{library/modulefinder modulefinder AddPackagePath}@anchor{4b25}
@deffn {함수} modulefinder.AddPackagePath (pkg_name, path)

지정된 `path'에서 `pkg_name' 패키지를 찾을 수 있음을 기록합니다.
@end deffn

@geindex ReplacePackage() (modulefinder 모듈)
@anchor{library/modulefinder modulefinder ReplacePackage}@anchor{4b26}
@deffn {함수} modulefinder.ReplacePackage (oldname, newname)

`oldname' 라는 이름의 모듈이 실제로는 `newname'라는 이름의 패키지라는 것을 지정할 수 있도록 합니다.
@end deffn

@geindex ModuleFinder (modulefinder 클래스)
@anchor{library/modulefinder modulefinder ModuleFinder}@anchor{1de2}
@deffn {클래스} modulefinder.ModuleFinder (path=None, debug=0, excludes=[], replace_paths=[])

이 클래스는 스크립트가 임포트하는 모듈 집합을 판단하는 @ref{4b27,,run_script()} 와 @ref{4b28,,report()} 메서드를 제공합니다. `path'는 모듈을 검색할 디렉터리 리스트일 수 있습니다; 지정되지 않으면, @code{sys.path}가 사용됩니다. `debug'는 디버깅 수준을 설정합니다; 값이 크면 클래스가 수행 중인 작업에 대한 디버깅 메시지를 인쇄합니다. `excludes'는 분석에서 제외할 모듈 이름 리스트입니다. `replace_paths'는 모듈 경로에서 교체될 @code{(oldpath, newpath)} 튜플의 리스트입니다.

@geindex report() (modulefinder.ModuleFinder 메서드)
@anchor{library/modulefinder modulefinder ModuleFinder report}@anchor{4b28}
@deffn {메서드} report ()

빠지거나 빠진 것으로 보이는 모듈뿐 아니라, 스크립트가 임포트하는 모듈과 그들의 경로의 목록에 관한 보고서를 표준 출력으로 인쇄합니다.
@end deffn

@geindex run_script() (modulefinder.ModuleFinder 메서드)
@anchor{library/modulefinder modulefinder ModuleFinder run_script}@anchor{4b27}
@deffn {메서드} run_script (pathname)

파이썬 코드를 포함하는, `pathname' 파일의 내용을 분석합니다.
@end deffn

@geindex modules (modulefinder.ModuleFinder의 속성)
@anchor{library/modulefinder modulefinder ModuleFinder modules}@anchor{4b29}
@deffn {속성} modules

모듈 이름을 모듈에 매핑하는 딕셔너리. @ref{4b2a,,ModuleFinder의 사용 예}를 참조하십시오.
@end deffn
@end deffn

@menu
* ModuleFinder의 사용 예:: 

@end menu

@node ModuleFinder의 사용 예,,,modulefinder — 스크립트에서 사용되는 모듈 찾기
@anchor{library/modulefinder example-usage-of-modulefinder}@anchor{4b2b}@anchor{library/modulefinder modulefinder-example}@anchor{4b2a}
@subsubsection @code{ModuleFinder}의 사용 예


나중에 분석할 스크립트 (bacon.py):

@example
import re, itertools

try:
    import baconhameggs
except ImportError:
    pass

try:
    import guido.python.ham
except ImportError:
    pass
@end example

bacon.py의 보고서를 출력하는 스크립트:

@example
from modulefinder import ModuleFinder

finder = ModuleFinder()
finder.run_script('bacon.py')

print('Loaded modules:')
for name, mod in finder.modules.items():
    print('%s: ' % name, end='@w{'})
    print(','.join(list(mod.globalnames.keys())[:3]))

print('-'*50)
print('Modules not imported:')
print('\n'.join(finder.badmodules.keys()))
@end example

표본 출력(아키텍처에 따라 다를 수 있습니다):

@example
Loaded modules:
_types:
copyreg:  _inverted_registry,_slotnames,__all__
re._compiler:  isstring,_sre,_optimize_unicode
_sre:
re._constants:  REPEAT_ONE,makedict,AT_END_LINE
sys:
re:  __module__,finditer,_expand
itertools:
__main__:  re,itertools,baconhameggs
re._parser:  _PATTERNENDERS,SRE_FLAG_UNICODE
array:
types:  __module__,IntType,TypeType
---------------------------------------------------
Modules not imported:
guido.python.ham
baconhameggs
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node runpy — 파이썬 모듈 찾기와 실행,importlib — import의 구현,modulefinder — 스크립트에서 사용되는 모듈 찾기,모듈 임포트 하기
@anchor{library/runpy doc}@anchor{4b2c}@anchor{library/runpy module-runpy}@anchor{c3}@anchor{library/runpy runpy-locating-and-executing-python-modules}@anchor{4b2d}@anchor{library/runpy translation-repo}@anchor{4b2e}
@subsection @code{runpy} — 파이썬 모듈 찾기와 실행


@geindex module; runpy

`소스 코드:' Lib/runpy.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/runpy.py}


__________________________________________________________________


The @code{runpy} module is used to locate and run Python modules without
importing them first. Its main use is to implement the @ref{23c,,-m} command
line switch that allows scripts to be located using the Python module
namespace rather than the filesystem.

이것은 샌드박스 모듈이 `아닙니다' - 모든 코드가 현재 프로세스에서 실행되고, 모든 부작용(가령 다른 모듈의 캐시된 임포트)은 함수가 반환된 후에도 그대로 유지됩니다.

Furthermore, any functions and classes defined by the executed code are not
guaranteed to work correctly after a @code{runpy} function has returned.
If that limitation is not acceptable for a given use case, @ref{7b,,importlib}
is likely to be a more suitable choice than this module.

The @code{runpy} module provides two functions:

@geindex run_module() (runpy 모듈)
@anchor{library/runpy runpy run_module}@anchor{1b95}
@deffn {함수} runpy.run_module (mod_name, init_globals=None, run_name=None, alter_sys=False)

@geindex 모듈;__main__

지정된 모듈의 코드를 실행하고 결과 모듈의 전역 딕셔너리를 반환합니다. 모듈의 코드는 먼저 표준 임포트 메커니즘(자세한 내용은 
@geindex Python 향상 제안; PEP 302
PEP 302@footnote{https://peps.python.org/pep-0302/}를 참조하십시오)을 사용하여 찾은 다음 새로운 모듈 이름 공간에서 실행됩니다.

`mod_name' 인자는 절대 모듈 이름이어야 합니다. 모듈 이름이 일반 모듈이 아닌 패키지를 참조하면, 해당 패키지를 임포트하고 그 패키지 내의 @ref{1,,__main__} 서브 모듈을 실행하고 결과 모듈 전역 딕셔너리를 반환합니다.

선택적 딕셔너리 인자 `init_globals'는 코드가 실행되기 전에 모듈의 전역 딕셔너리를 미리 채우기 위해 사용될 수 있습니다. `init_globals'는 수정되지 않습니다. 아래의 특수 전역 변수가 `init_globals'에 정의되어 있으면, 해당 정의가 @ref{1b95,,run_module()}에 의해 대체됩니다.

특수 전역 변수 @code{__name__}, @code{__spec__}, @code{__file__}, @code{__cached__}, @code{__loader__} 및 @code{__package__}는 모듈 코드가 실행되기 전에 전역 딕셔너리에 설정됩니다. (이 변수는 최소한의 변수 집합임에 유의하십시오 - 인터프리터 구현 세부 사항에 따라 다른 변수가 묵시적으로 설정될 수 있습니다.)

@code{__name__}은 (이 선택적 인자가 @ref{884,,None}이 아니면) `run_name'으로, 명명된 모듈이 패키지면 @code{mod_name + '.__main__'}으로, 그렇지 않으면 `mod_name' 인자로 설정됩니다.

@code{__spec__}은 `실제로' 임포트 된 모듈에 맞게 설정됩니다 (즉, @code{__spec__.name}은 항상 `mod_name'이나 @code{mod_name + '.__main__'}이 됩니다, 절대 `run_name'은 아닙니다).

@code{__file__}, @code{__cached__}, @code{__loader__} 및 @code{__package__}는 모듈 스펙에 따라 @ref{235e,,표준적으로 설정됩니다}.

인자 `alter_sys'가 제공되고 @ref{e06,,True}로 평가되면, @code{sys.argv[0]}은 @code{__file__} 값으로 갱신되고 @code{sys.modules[__name__]}은 실행 중인 모듈에 대한 임시 모듈 객체로 갱신됩니다. @code{sys.argv[0]}과 @code{sys.modules[__name__]}은 함수가 반환되기 전에 원래 값으로 복원됩니다.

이 @ref{df,,sys} 조작은 스레드-안전하지 않습니다. 다른 스레드가 부분적으로 초기화된 모듈과 변경된 인자 목록을 볼 수 있습니다. 스레드를 사용하는 코드에서 이 함수를 호출할 때 @code{sys} 모듈을 단독으로 두는 것이 좋습니다.


@subsubheading 더 보기


명령 줄에서 동등한 기능을 제공하는 @ref{23c,,-m} 옵션.



버전 3.1에서 변경: @ref{1,,__main__} 서브 모듈을 찾아 패키지를 실행할 수 있는 기능 추가.



버전 3.2에서 변경: @code{__cached__} 전역 변수 추가 (
@geindex Python 향상 제안; PEP 3147
PEP 3147@footnote{https://peps.python.org/pep-3147/}을 참조하십시오).



버전 3.4에서 변경: 
@geindex Python 향상 제안; PEP 451
PEP 451@footnote{https://peps.python.org/pep-0451/}이 추가한 모듈 스펙 기능을 활용하도록 갱신되었습니다. 이것은 실제 모듈 이름을 항상 @code{__spec__.name}으로 액세스할 수 있으면서, @code{__cached__}가 이 방법으로 실행되는 모듈에 대해 올바르게 설정되도록 합니다.



버전 3.12에서 변경: @code{__cached__}, @code{__loader__} 및 @code{__package__}의 설정은 폐지되었습니다. 대안은 @ref{2269,,ModuleSpec}을 참조하세요.

@end deffn

@geindex run_path() (runpy 모듈)
@anchor{library/runpy runpy run_path}@anchor{4a5}
@deffn {함수} runpy.run_path (path_name, init_globals=None, run_name=None)

@geindex 모듈;__main__

명명된 파일 시스템 위치에 있는 코드를 실행하고 결과 모듈의 전역 딕셔너리를 반환합니다. CPython 명령 줄에 제공된 스크립트 이름과 마찬가지로, `file_path'는 파이썬 소스 파일, 컴파일된 바이트 코드 파일 또는 @ref{1,,__main__} 모듈이 포함된 유효한 @ref{3e4,,sys.path} 항목(예를 들어, 최상위 수준 @code{__main__.py} 파일을 포함하는 zip 파일)을 가리킬 수 있습니다.

간단한 스크립트의 경우, 지정된 코드는 단순히 새로운 모듈 이름 공간에서 실행됩니다. 유효한 @ref{3e4,,sys.path} 항목(보통 zip 파일이나 디렉터리)의 경우, 항목이 먼저 @code{sys.path}의 시작 부분에 추가됩니다. 그런 다음 함수는 갱신된 경로를 사용하여 @ref{1,,__main__} 모듈을 찾아 실행합니다. 지정된 위치에 해당 모듈이 없을 때 @code{sys.path}의 다른 위치에 있는 기존 @code{__main__} 항목을 호출하는 것을 막는 특별한 보호 장치가 없다는 점에 유의하십시오.

선택적 딕셔너리 인자 `init_globals'는 코드가 실행되기 전에 모듈의 전역 딕셔너리를 미리 채우기 위해 사용될 수 있습니다. `init_globals'는 수정되지 않습니다. 아래의 특수 전역 변수가 `init_globals'에 정의되어 있으면, 해당 정의가 @ref{4a5,,run_path()}에 의해 대체됩니다.

특수 전역 변수 @code{__name__}, @code{__spec__}, @code{__file__}, @code{__cached__}, @code{__loader__} 및 @code{__package__}는 모듈 코드가 실행되기 전에 전역 딕셔너리에 설정됩니다. (이 변수는 최소한의 변수 집합임에 유의하십시오 - 인터프리터 구현 세부 사항에 따라 다른 변수가 묵시적으로 설정될 수 있습니다.)

@code{__name__}은 (이 선택적 인자가 @ref{884,,None}이 아니면) `run_name'으로, 그렇지 않으면 @code{'<run_path>'}로 설정됩니다.

`file_path'가 스크립트 파일(소스나 사전 컴파일된 바이트 코드)을 직접 참조하면, @code{__file__}은 `file_path'로 설정되고 @code{__spec__}, @code{__cached__}, @code{__loader__} 및 @code{__package__}는 모두 @ref{884,,None}으로 설정됩니다.

`file_path'가 유효한 @ref{3e4,,sys.path} 항목에 대한 참조면, @code{__spec__}은 임포트 된 @ref{1,,__main__} 모듈에 대해 적절하게 설정됩니다 (즉, @code{__spec__.name}은 항상 @code{__main__}이 됩니다). @code{__file__}, @code{__cached__}, @code{__loader__} 및 @code{__package__}는 모듈 스펙에 따라 @ref{235e,,표준적으로 설정됩니다}.

@ref{df,,sys} 모듈에도 여러 가지 변경이 적용됩니다. 첫째, @ref{3e4,,sys.path}는 위에서 설명한 것처럼 변경될 수 있습니다. @code{sys.argv[0]}은 `file_path' 값으로 갱신되고 @code{sys.modules[__name__]}은 실행 중인 모듈에 대한 임시 모듈 객체로 갱신됩니다. 함수가 반환되기 전에 @code{sys}의 항목에 대한 모든 수정 내용이 되돌려집니다.

@ref{1b95,,run_module()}과 달리, @ref{df,,sys}에 대한 변경은 이 함수에서는 선택 사항이 아닌데, 이 조정이 @ref{3e4,,sys.path} 항목의 실행을 허용하는 데 필수적이기 때문입니다. 스레드-안전 제약 사항이 계속 적용되므로, 스레드를 사용하는 코드에서 이 함수를 사용하려면 임포트 잠금을 사용하여 직렬화하거나 별도의 프로세스에 위임해야 합니다.


@subsubheading 더 보기


명령 줄에서의 동등한 기능에 대한 @ref{2118,,인터페이스 옵션} (@code{python path/to/script}).



Added in version 3.2.



버전 3.4에서 변경: 
@geindex Python 향상 제안; PEP 451
PEP 451@footnote{https://peps.python.org/pep-0451/}이 추가한 모듈 스펙 기능을 활용하도록 갱신되었습니다. 이것은 @code{__main__}이 직접 실행되는 대신 유효한 @ref{3e4,,sys.path} 항목에서 임포트 될 때 @code{__cached__}가 올바르게 설정되도록 합니다.



버전 3.12에서 변경: @code{__cached__}, @code{__loader__} 및 @code{__package__}의 설정은 폐지되었습니다.

@end deffn


@subsubheading 더 보기



@table @asis

@geindex Python 향상 제안; PEP 338

@item PEP 338@footnote{https://peps.python.org/pep-0338/} – 모듈을 스크립트로 실행하기

Nick Coghlan이 작성하고 구현한 PEP.

@geindex Python 향상 제안; PEP 366

@item PEP 366@footnote{https://peps.python.org/pep-0366/} – 메인 모듈 명시적 상대 임포트

Nick Coghlan이 작성하고 구현한 PEP.

@geindex Python 향상 제안; PEP 451

@item PEP 451@footnote{https://peps.python.org/pep-0451/} – 임포트 시스템의 ModuleSpec 형

Eric Snow가 작성하고 구현한 PEP
@end table

@ref{1da4,,명령 줄과 환경} - CPython 명령 줄 세부 사항

@ref{73b,,importlib.import_module()} 함수


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node importlib — import의 구현,importlib resources – Package resource reading opening and access,runpy — 파이썬 모듈 찾기와 실행,모듈 임포트 하기
@anchor{library/importlib doc}@anchor{4b2f}@anchor{library/importlib importlib-the-implementation-of-import}@anchor{4b30}@anchor{library/importlib module-importlib}@anchor{7b}@anchor{library/importlib translation-repo}@anchor{4b31}
@subsection @code{importlib} — @code{import}의 구현


@geindex module; importlib


Added in version 3.1.


`소스 코드:' Lib/importlib/__init__.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/importlib/__init__.py}


__________________________________________________________________


@menu
* 소개: 소개<6>. 
* 함수: 함수<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. 
* 예: 예<17>. 

@end menu

@node 소개<6>,함수<11>,,importlib — import의 구현
@anchor{library/importlib introduction}@anchor{4b32}
@subsubsection 소개


The purpose of the @code{importlib} package is three-fold.

하나는 파이썬 소스 코드에서 @ref{7f7,,import} 문(그리고, 확장하면 @ref{ad1,,__import__()} 함수)의 구현을 제공하는 것입니다. 이것은 모든 파이썬 인터프리터에 이식할 수 있는 @code{import}의 구현을 제공합니다. 또한 파이썬 이외의 프로그래밍 언어로 구현된 것보다 이해하기 쉬운 구현을 제공합니다.

둘째, @ref{7f7,,import}를 구현하는 구성 요소가 이 패키지에서 노출되어, 사용자가 임포트 프로세스에 참여하기 위해 자신의 사용자 지정 객체(일반적으로 @ref{2449,,임포터}라고 합니다)를 쉽게 만들 수 있도록 합니다.

Three, the package contains modules exposing additional functionality for
managing aspects of Python packages:


@itemize *

@item 
@ref{7e,,importlib.metadata} presents access to metadata from third-party
distributions.

@item 
@ref{7f,,importlib.resources} provides routines for accessing non-code
“resources” from Python packages.
@end itemize


@subsubheading 더 보기



@table @asis

@item @ref{7f7,,임포트(import) 문}

@ref{7f7,,import} 문의 언어 레퍼런스.

@item 패키지 명세@footnote{https://www.python.org/doc/essays/packages/}

패키지의 원래 명세. 이 문서를 작성한 이후로 일부 의미가 변경되었습니다 (예를 들어 @ref{17ea,,sys.modules}의 @code{None}을 기반으로 하는 리디렉션).

@item @ref{126c,,__import__()} 함수

@ref{7f7,,import} 문은 이 함수의 편의 문법입니다.

@item @ref{18dd,,The initialization of the sys.path module search path}

The initialization of @ref{3e4,,sys.path}.

@geindex Python 향상 제안; PEP 235

@item PEP 235@footnote{https://peps.python.org/pep-0235/}

대소 문자를 구분하지 않는 플랫폼에서의 임포트

@geindex Python 향상 제안; PEP 263

@item PEP 263@footnote{https://peps.python.org/pep-0263/}

파이썬 소스 코드 인코딩 정의

@geindex Python 향상 제안; PEP 302

@item PEP 302@footnote{https://peps.python.org/pep-0302/}

새로운 임포트 훅

@geindex Python 향상 제안; PEP 328

@item PEP 328@footnote{https://peps.python.org/pep-0328/}

임포트: 다중 줄과 절대/상대

@geindex Python 향상 제안; PEP 366

@item PEP 366@footnote{https://peps.python.org/pep-0366/}

메인 모듈 명시적 상대 임포트

@geindex Python 향상 제안; PEP 420

@item PEP 420@footnote{https://peps.python.org/pep-0420/}

묵시적 이름 공간 패키지

@geindex Python 향상 제안; PEP 451

@item PEP 451@footnote{https://peps.python.org/pep-0451/}

임포트 시스템을 위한 ModuleSpec 형

@geindex Python 향상 제안; PEP 488

@item PEP 488@footnote{https://peps.python.org/pep-0488/}

PYO 파일 제거

@geindex Python 향상 제안; PEP 489

@item PEP 489@footnote{https://peps.python.org/pep-0489/}

다단계 확장 모듈 초기화

@geindex Python 향상 제안; PEP 552

@item PEP 552@footnote{https://peps.python.org/pep-0552/}

결정론적 pyc

@geindex Python 향상 제안; PEP 3120

@item PEP 3120@footnote{https://peps.python.org/pep-3120/}

UTF-8을 기본 소스 인코딩으로 사용하기

@geindex Python 향상 제안; PEP 3147

@item PEP 3147@footnote{https://peps.python.org/pep-3147/}

PYC 저장소 디렉터리
@end table


@node 함수<11>,importlib abc – Abstract base classes related to import,소개<6>,importlib — import의 구현
@anchor{library/importlib functions}@anchor{4b33}
@subsubsection 함수


@geindex __import__() (importlib 모듈)
@anchor{library/importlib importlib __import__}@anchor{126c}
@deffn {함수} importlib.__import__ (name, globals=None, locals=None, fromlist=(), level=0)

내장 @ref{ad1,,__import__()} 함수의 구현.

@cartouche
@quotation 참고 
프로그래밍 방식으로 모듈을 임포트 하려면 이 함수 대신 @ref{73b,,import_module()}을 사용해야 합니다.
@end quotation
@end cartouche
@end deffn

@geindex import_module() (importlib 모듈)
@anchor{library/importlib importlib import_module}@anchor{73b}
@deffn {함수} importlib.import_module (name, package=None)

모듈을 임포트 합니다. `name' 인자는 절대나 상대적인 항으로 임포트 할 모듈을 지정합니다 (예를 들어 @code{pkg.mod}나 @code{..mod}). 이름이 상대적인 항으로 지정되면, `package' 인자는 패키지 이름을 결정하기 위한 앵커 역할을 하는 패키지 이름으로 설정해야 합니다 (예를 들어 @code{import_module('..mod', 'pkg.subpkg')}는 @code{pkg.mod}를 임포트 합니다).

@ref{73b,,import_module()} 함수는 @ref{126c,,importlib.__import__()} 주위를 감싸는 단순화 래퍼 역할을 합니다. 이는 함수의 모든 의미가 @code{importlib.__import__()}에서 파생됨을 뜻합니다. 이 두 함수의 가장 중요한 차이점은 @code{import_module()}이 지정된 패키지나 모듈(예를 들어 @code{pkg.mod})을 반환하는 반면, @ref{ad1,,__import__()}는 최상위 패키지나 모듈(예를 들어 @code{pkg})을 반환한다는 것입니다.

인터프리터가 실행을 시작한 이후 만들어진 모듈(예를 들어, 파이썬 소스 파일을 만들면)을 동적으로 임포트 하는 경우, 임포트 시스템에서 새 모듈을 알 수 있도록 @ref{e09,,invalidate_caches()}를 호출해야 할 수 있습니다.


버전 3.3에서 변경: 부모 패키지는 자동으로 임포트 됩니다.

@end deffn

@geindex invalidate_caches() (importlib 모듈)
@anchor{library/importlib importlib invalidate_caches}@anchor{e09}
@deffn {함수} importlib.invalidate_caches ()

@ref{f26,,sys.meta_path}에 저장된 파인더의 내부 캐시를 무효로 합니다. 파인더가 @code{invalidate_caches()}를 구현하면 무효화를 수행하기 위해 호출됩니다. 모든 파인더가 새로운 모듈의 존재를 알 수 있도록 프로그램이 실행되는 동안 모듈이 만들어진/설치된 경우 이 함수를 호출해야 합니다.


Added in version 3.3.



버전 3.10에서 변경: Namespace packages created/installed in a different @ref{3e4,,sys.path}
location after the same namespace was already imported are noticed.

@end deffn

@geindex reload() (importlib 모듈)
@anchor{library/importlib importlib reload}@anchor{73c}
@deffn {함수} importlib.reload (module)

이전에 임포트 한 `module'을 다시 로드합니다. 인자는 모듈 객체여야 해서, 이전에 성공적으로 임포트 됐어야 합니다. 외부 편집기를 사용하여 모듈 소스 파일을 편집했고 파이썬 인터프리터를 떠나지 않고 새 버전을 시험해보고 싶을 때 유용합니다. 반환 값은 모듈 객체입니다 (재 임포트로 인해 다른 객체가 @ref{17ea,,sys.modules}에 배치되면 다를 수 있습니다).

@ref{73c,,reload()}가 실행될 때:


@itemize *

@item 
파이썬 모듈의 코드가 다시 컴파일되고 모듈 수준 코드가 다시 실행되어, 원래 모듈을 로드한 @ref{1a28,,로더}를 재사용하여 모듈 딕셔너리에 있는 이름에 연결되는 새로운 객체 집합을 정의합니다. 확장 모듈의 @code{init} 함수는 두 번째에는 호출되지 않습니다.

@item 
파이썬의 다른 모든 객체와 마찬가지로 이전 객체는 참조 횟수가 0으로 떨어진 후에만 자원이 회수됩니다.

@item 
모듈 이름 공간의 이름은 새로운 객체나 변경된 객체를 가리키도록 갱신됩니다.

@item 
이전 객체에 대한 다른 참조(가령 모듈 외부의 이름)는 새 객체를 참조하기 위해 다시 연결되지 않으며 필요하다면 그들이 등장하는 각 이름 공간에서 갱신되어야 합니다.
@end itemize

다른 여러 가지 경고가 있습니다:

모듈을 다시 로드할 때, 그것의 (모듈의 전역 변수를 포함하는) 딕셔너리가 유지됩니다. 이름을 재정의하면 이전 정의를 대체해서, 일반적으로 문제가 되지 않습니다. 새 버전의 모듈이 이전 버전이 정의한 이름을 정의하지 않으면, 이전 정의가 그대로 남습니다. 이 기능은 객체의 전역 테이블이나 캐시를 유지한다면 모듈의 이점으로 사용될 수 있습니다 — @ref{8f7,,try} 문으로 테이블의 존재를 검사하고 필요하다면 초기화를 건너뛸 수 있습니다:

@example
try:
    cache
except NameError:
    cache = @{@}
@end example

일반적으로 내장이나 동적으로 로드된 모듈을 다시 로드하는 것은 그리 유용하지 않습니다. @ref{df,,sys}, @ref{1,,__main__}, @ref{13,,builtins} 및 기타 주요 모듈을 다시 로드하지 않는 것이 좋습니다. 많은 경우 확장 모듈은 두 번 이상 초기화되도록 설계되지 않았으며, 다시 로드할 때 임의의 방식으로 실패할 수 있습니다.

모듈이 @ref{14b0,,from} … @ref{7f7,,import} …를 사용하여 다른 모듈에서 객체를 임포트 하면, 다른 모듈에 대해 @ref{73c,,reload()}를 호출해도 그것에서 임포트 한 객체를 재정의하지 않습니다 — 이것을 피하는 한 가지 방법은 @code{from} 문을 다시 실행하는 것입니다, 다른 방법은 대신 @code{import}와 정규화된 이름(`module.name')을 사용하는 것입니다.

모듈이 클래스의 인스턴스를 인스턴스 화하면, 클래스를 정의하는 모듈을 다시 로드해도 인스턴스의 메서드 정의에는 영향을 미치지 않습니다 — 이전 클래스 정의를 계속 사용합니다. 파생 클래스의 경우도 마찬가지입니다.


Added in version 3.4.



버전 3.7에서 변경: 다시 로드되는 모듈에 @ref{2269,,ModuleSpec}이 없으면 @ref{d3c,,ModuleNotFoundError} 가 발생합니다.


@cartouche
@quotation 경고 
This function is not thread-safe. Calling it from multiple threads can result
in unexpected behavior. It’s recommended to use the @ref{19f4,,threading.Lock}
or other synchronization primitives for thread-safe module reloading.
@end quotation
@end cartouche
@end deffn

@node importlib abc – Abstract base classes related to import,importlib machinery – Importers and path hooks,함수<11>,importlib — import의 구현
@anchor{library/importlib importlib-abc-abstract-base-classes-related-to-import}@anchor{4b34}@anchor{library/importlib module-importlib abc}@anchor{7c}
@subsubsection @code{importlib.abc} – Abstract base classes related to import


@geindex module; importlib.abc

`소스 코드:' Lib/importlib/abc.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/importlib/abc.py}


__________________________________________________________________


The @code{importlib.abc} module contains all of the core abstract base classes
used by @ref{7f7,,import}. Some subclasses of the core abstract base classes
are also provided to help in implementing the core ABCs.

ABC 계층:

@example
object
 +-- MetaPathFinder
 +-- PathEntryFinder
 +-- Loader
      +-- ResourceLoader --------+
      +-- InspectLoader          |
           +-- ExecutionLoader --+
                                 +-- FileLoader
                                 +-- SourceLoader
@end example

@geindex MetaPathFinder (importlib.abc 클래스)
@anchor{library/importlib importlib abc MetaPathFinder}@anchor{a6e}
@deffn {클래스} importlib.abc.MetaPathFinder

@ref{126f,,메타 경로 파인더}를 나타내는 추상 베이스 클래스.


Added in version 3.3.



버전 3.10에서 변경: No longer a subclass of @code{Finder}.


@geindex find_spec() (importlib.abc.MetaPathFinder 메서드)
@anchor{library/importlib importlib abc MetaPathFinder find_spec}@anchor{a68}
@deffn {메서드} find_spec (fullname, path, target=None)

지정된 모듈의 @ref{2360,,스펙}을 찾는 추상 메서드. 최상위 임포트 인 경우, `path'는 @code{None}입니다. 그렇지 않으면, 이것은 서브 패키지나 모듈의 검색이 되고, `path'는 부모 패키지의 @ref{2052,,__path__} 값입니다. 스펙을 찾을 수 없으면, @code{None}이 반환됩니다. 전달될 때, @code{target}은 파인더가 반환할 스펙에 대해 더 정교하게 추측하기 위해 사용할 수 있는 모듈 객체입니다. @ref{a6d,,importlib.util.spec_from_loader()}는 구상 @code{MetaPathFinders}를 구현하는 데 유용할 수 있습니다.


Added in version 3.4.

@end deffn

@geindex invalidate_caches() (importlib.abc.MetaPathFinder 메서드)
@anchor{library/importlib importlib abc MetaPathFinder invalidate_caches}@anchor{4b35}
@deffn {메서드} invalidate_caches ()

호출될 때, 파인더가 사용하는 내부 캐시를 무효로 해야 하는 선택적 메서드. @ref{f26,,sys.meta_path}에서 모든 파인더의 캐시를 무효로 할 때 @ref{e09,,importlib.invalidate_caches()}에서 사용합니다.


버전 3.4에서 변경: 호출될 때 @ref{1a2,,NotImplemented} 대신 @code{None}을 반환합니다.

@end deffn
@end deffn

@geindex PathEntryFinder (importlib.abc 클래스)
@anchor{library/importlib importlib abc PathEntryFinder}@anchor{a6f}
@deffn {클래스} importlib.abc.PathEntryFinder

@ref{1270,,경로 엔트리 파인더}를 나타내는 추상 베이스 클래스. @ref{a6e,,MetaPathFinder}와 일부 유사하지만, @code{PathEntryFinder}는 @ref{1222,,importlib.machinery.PathFinder}가 제공하는 경로 기반 임포트 서브 시스템 내에서만 사용하려는 것입니다.


Added in version 3.3.



버전 3.10에서 변경: No longer a subclass of @code{Finder}.


@geindex find_spec() (importlib.abc.PathEntryFinder 메서드)
@anchor{library/importlib importlib abc PathEntryFinder find_spec}@anchor{a6c}
@deffn {메서드} find_spec (fullname, target=None)

지정된 모듈의 @ref{2360,,스펙}을 찾는 추상 메서드. 파인더는 할당된 @ref{2458,,경로 엔트리} 내에서만 모듈을 검색합니다. 스펙을 찾을 수 없으면, @code{None}이 반환됩니다. 전달될 때, @code{target}은 파인더가 반환할 스펙에 대해 더 정교하게 추측하기 위해 사용할 수 있는 모듈 객체입니다. @ref{a6d,,importlib.util.spec_from_loader()}는 구상 @code{PathEntryFinders}를 구현하는 데 유용할 수 있습니다.


Added in version 3.4.

@end deffn

@geindex invalidate_caches() (importlib.abc.PathEntryFinder 메서드)
@anchor{library/importlib importlib abc PathEntryFinder invalidate_caches}@anchor{4b36}
@deffn {메서드} invalidate_caches ()

호출될 때, 파인더가 사용하는 내부 캐시를 무효로 해야 하는 선택적 메서드. 모든 캐시 된 파인더의 캐시를 무효화 할 때 @ref{e08,,importlib.machinery.PathFinder.invalidate_caches()}에서 사용합니다.
@end deffn
@end deffn

@geindex Loader (importlib.abc 클래스)
@anchor{library/importlib importlib abc Loader}@anchor{10c6}
@deffn {클래스} importlib.abc.Loader

@ref{1a28,,로더}의 추상 베이스 클래스. 로더에 대한 정확한 정의는 
@geindex Python 향상 제안; PEP 302
PEP 302@footnote{https://peps.python.org/pep-0302/}를 참조하십시오.

리소스 읽기를 지원하려는 로더는 @ref{4b37,,importlib.resources.abc.ResourceReader}에 지정된 대로 @code{get_resource_reader()} 메서드를 구현해야 합니다.


버전 3.7에서 변경: 선택적 @code{get_resource_reader()} 메서드를 도입했습니다.


@geindex create_module() (importlib.abc.Loader 메서드)
@anchor{library/importlib importlib abc Loader create_module}@anchor{eab}
@deffn {메서드} create_module (spec)

모듈을 임포트 할 때 사용할 모듈 객체를 반환하는 메서드. 이 메서드는 @code{None}을 반환해서 기본 모듈 생성 시맨틱이 적용되어야 함을 나타낼 수 있습니다.


Added in version 3.4.



버전 3.6에서 변경: @ref{a6a,,exec_module()}이 정의될 때 이 메서드는 더는 선택 사항이 아닙니다.

@end deffn

@geindex exec_module() (importlib.abc.Loader 메서드)
@anchor{library/importlib importlib abc Loader exec_module}@anchor{a6a}
@deffn {메서드} exec_module (module)

모듈을 임포트 하거나 다시 로드할 때 자체 이름 공간에서 모듈을 실행하는 추상 메서드. @ref{a6a,,exec_module()}이 호출될 때 모듈이 이미 초기화되어 있어야 합니다. 이 메서드가 존재하면, @ref{eab,,create_module()}을 정의해야 합니다.


Added in version 3.4.



버전 3.6에서 변경: @ref{eab,,create_module()}도 정의해야 합니다.

@end deffn

@geindex load_module() (importlib.abc.Loader 메서드)
@anchor{library/importlib importlib abc Loader load_module}@anchor{a69}
@deffn {메서드} load_module (fullname)

모듈을 로드하는 레거시 메서드. 모듈을 로드할 수 없으면, @ref{659,,ImportError}가 발생하고, 그렇지 않으면 로드된 모듈이 반환됩니다.

요청된 모듈이 @ref{17ea,,sys.modules}에 이미 존재하면, 해당 모듈이 사용되고 다시 로드되어야 합니다. 그렇지 않으면 로더는 임포트에서 재귀를 방지하기 위해 로드를 시작하기 전에 새 모듈을 만들어 @code{sys.modules}에 삽입해야 합니다. 로더가 모듈을 삽입했는데 로드에 실패하면, 로더가 @code{sys.modules}에서 모듈을 제거해야 합니다; 로더가 실행을 시작하기 전에 이미 @code{sys.modules}에 있었던 모듈은 그대로 두어야 합니다.

로더는 모듈에서 여러 어트리뷰트를 설정해야 합니다 (이러한 어트리뷰트 중 일부는 모듈을 다시 로드할 때 변경될 수 있습니다):


@itemize -

@item 
@ref{1590,,module.__name__}

@item 
@ref{2366,,module.__file__}

@item 
@ref{321,,module.__cached__} `(폐지됨)'

@item 
@ref{2052,,module.__path__}

@item 
@ref{323,,module.__package__} `(폐지됨)'

@item 
@ref{33b,,module.__loader__} `(폐지됨)'
@end itemize

@ref{a6a,,exec_module()}을 사용할 수 있으면 이전 버전과 호환되는 기능이 제공됩니다.


버전 3.4에서 변경: 호출될 때 @ref{36b,,NotImplementedError} 대신 @ref{659,,ImportError}를 발생시킵니다. @ref{a6a,,exec_module()}을 사용할 수 있을 때 제공되는 기능.



Deprecated since version 3.4, will be removed in version 3.15: 모듈 로드에 권장되는 API는 @ref{a6a,,exec_module()}(및 @ref{eab,,create_module()})입니다. 로더는 @ref{a69,,load_module()} 대신 이것을 구현해야 합니다. 임포트 절차는 @code{exec_module()}이 구현될 때 @code{load_module()}의 다른 모든 책임을 처리합니다.

@end deffn
@end deffn

@geindex ResourceLoader (importlib.abc 클래스)
@anchor{library/importlib importlib abc ResourceLoader}@anchor{de1}
@deffn {클래스} importlib.abc.ResourceLoader

`TraversableResources 로 대체되었습니다'

@quotation

스토리지 백 엔드에서 임의의 리소스를 로드하기 위한 선택적 
@geindex Python 향상 제안; PEP 302
PEP 302@footnote{https://peps.python.org/pep-0302/} 프로토콜을 구현하는 @ref{1a28,,로더}의 추상 베이스 클래스.


버전 3.7부터 폐지됨: This ABC is deprecated in favour of supporting resource loading
through @ref{2f9,,importlib.resources.abc.TraversableResources}.
This class exists for backwards compatibility only with other ABCs in
this module.


@geindex get_data() (importlib.abc.ResourceLoader 메서드)
@anchor{library/importlib importlib abc ResourceLoader get_data}@anchor{4b20}
@deffn {메서드} abstractmethod get_data (path)

@quotation

`path'에 있는 데이터를 바이트열로 반환하는 추상 메서드. 임의의 데이터를 저장할 수 있는 파일류 스토리지 백 엔드가 있는 로더는 이 추상 메서드를 구현하여 저장된 데이터에 직접 액세스하도록 할 수 있습니다. `path'를 찾을 수 없으면 @ref{2c0,,OSError}가 발생합니다. `path'는 모듈의 @ref{2366,,__file__} 어트리뷰트나 패키지의 @ref{2052,,__path__}에서 온 항목을 사용하여 구성될 것으로 기대됩니다.


버전 3.4에서 변경: @ref{36b,,NotImplementedError} 대신 @ref{2c0,,OSError}를 발생시킵니다.

@end quotation
@end deffn
@end quotation
@end deffn

@geindex InspectLoader (importlib.abc 클래스)
@anchor{library/importlib importlib abc InspectLoader}@anchor{1153}
@deffn {클래스} importlib.abc.InspectLoader

모듈을 검사(inspect)하는 로더를 위한 선택적 
@geindex Python 향상 제안; PEP 302
PEP 302@footnote{https://peps.python.org/pep-0302/} 프로토콜을 구현하는 @ref{1a28,,로더}의 추상 베이스 클래스.

@geindex get_code() (importlib.abc.InspectLoader 메서드)
@anchor{library/importlib importlib abc InspectLoader get_code}@anchor{1154}
@deffn {메서드} get_code (fullname)

모듈에 대한 코드 객체나, 모듈에 코드 객체가 없으면 (예를 들어, 내장 모듈이 이런 경우입니다) @code{None}을 반환합니다. 로더가 요청한 모듈을 찾을 수 없으면 @ref{659,,ImportError}가 발생합니다.

@cartouche
@quotation 참고 
이 메서드에는 기본 구현이 있지만, 가능하다면 성능을 위해 재정의하는 것이 좋습니다.
@end quotation
@end cartouche

@geindex 유니버설 줄 넘김;importlib.abc.InspectLoader.get_source 메서드


버전 3.4에서 변경: 더는 추상적이지 않고 구상 구현이 제공됩니다.

@end deffn

@geindex get_source() (importlib.abc.InspectLoader 메서드)
@anchor{library/importlib importlib abc InspectLoader get_source}@anchor{1157}
@deffn {메서드} abstractmethod get_source (fullname)

@quotation

모듈의 소스를 반환하는 추상 메서드. 인식된 모든 줄 구분자를 @code{'\n'} 문자로 변환하는 @ref{f34,,유니버설 줄 넘김}을 사용하여 텍스트 문자열로 반환됩니다. 사용 가능한 소스가 없으면 (예를 들어, 내장 모듈) @code{None}을 반환합니다. 로더가 지정된 모듈을 찾을 수 없으면 @ref{659,,ImportError}를 발생시킵니다.


버전 3.4에서 변경: @ref{36b,,NotImplementedError} 대신 @ref{659,,ImportError}를 발생시킵니다.

@end quotation
@end deffn

@geindex is_package() (importlib.abc.InspectLoader 메서드)
@anchor{library/importlib importlib abc InspectLoader is_package}@anchor{4b38}
@deffn {메서드} is_package (fullname)

모듈이 패키지이면 참값을 반환하고, 그렇지 않으면 거짓 값을 반환하는 선택적 메서드. @ref{1a28,,로더}가 모듈을 찾을 수 없으면 @ref{659,,ImportError}가 발생합니다.


버전 3.4에서 변경: @ref{36b,,NotImplementedError} 대신 @ref{659,,ImportError}를 발생시킵니다.

@end deffn

@geindex source_to_code() (importlib.abc.InspectLoader의 정적 메서드)
@anchor{library/importlib importlib abc InspectLoader source_to_code}@anchor{1011}
@deffn {메서드} static source_to_code (data, path='<string>')

파이썬 소스에서 코드 객체를 만듭니다.

`data' 인자는 @ref{4b2,,compile()} 함수가 지원하는 것은 무엇이든 될 수 있습니다 (즉 문자열이나 바이트열). `path' 인자는 소스 코드가 온 곳의 “경로”여야 하며, 추상 개념(예를 들어 zip 파일에서의 위치)일 수 있습니다.

후속 코드 객체를 사용하면 @code{exec(code, module.__dict__)}를 실행하여 그 코드를 모듈에서 실행할 수 있습니다.


Added in version 3.4.



버전 3.5에서 변경: 메서드를 정적(static)으로 만들었습니다.

@end deffn

@geindex exec_module() (importlib.abc.InspectLoader 메서드)
@anchor{library/importlib importlib abc InspectLoader exec_module}@anchor{1211}
@deffn {메서드} exec_module (module)

@ref{a6a,,Loader.exec_module()}의 구현.


Added in version 3.4.

@end deffn

@geindex load_module() (importlib.abc.InspectLoader 메서드)
@anchor{library/importlib importlib abc InspectLoader load_module}@anchor{4b39}
@deffn {메서드} load_module (fullname)

@ref{a69,,Loader.load_module()}의 구현.


Deprecated since version 3.4, will be removed in version 3.15: 대신 @ref{1211,,exec_module()}을 사용하십시오.

@end deffn
@end deffn

@geindex ExecutionLoader (importlib.abc 클래스)
@anchor{library/importlib importlib abc ExecutionLoader}@anchor{4b3a}
@deffn {클래스} importlib.abc.ExecutionLoader

구현될 때, 모듈이 스크립트로 실행되도록 돕는 @ref{1153,,InspectLoader}에서 상속되는 추상 베이스 클래스. ABC는 선택적 
@geindex Python 향상 제안; PEP 302
PEP 302@footnote{https://peps.python.org/pep-0302/} 프로토콜을 표현합니다.

@geindex get_filename() (importlib.abc.ExecutionLoader 메서드)
@anchor{library/importlib importlib abc ExecutionLoader get_filename}@anchor{4b3b}
@deffn {메서드} abstractmethod get_filename (fullname)

@quotation

지정된 모듈의 @ref{2366,,__file__} 값을 반환하는 추상 메서드. 사용 가능한 경로가 없으면 @ref{659,,ImportError}가 발생합니다.

소스 코드를 사용할 수 있으면, 메서드는 모듈을 로드하는 데 바이트 코드를 사용했는지와 관계없이 소스 파일의 경로를 반환해야 합니다.


버전 3.4에서 변경: @ref{36b,,NotImplementedError} 대신 @ref{659,,ImportError}를 발생시킵니다.

@end quotation
@end deffn
@end deffn

@geindex FileLoader (importlib.abc 클래스)
@anchor{library/importlib importlib abc FileLoader}@anchor{1272}
@deffn {클래스} importlib.abc.FileLoader (fullname, path)

@ref{de1,,ResourceLoader}와 @ref{4b3a,,ExecutionLoader}를 상속하고 @ref{4b20,,ResourceLoader.get_data()}와 @ref{4b3b,,ExecutionLoader.get_filename()}의 구상 구현을 제공하는 추상 베이스 클래스.

`fullname' 인자는 로더가 처리해야 하는 모듈의 완전히 결정된(resolved) 이름입니다. `path' 인자는 모듈의 파일 경로입니다.


Added in version 3.3.


@geindex name (importlib.abc.FileLoader의 속성)
@anchor{library/importlib importlib abc FileLoader name}@anchor{4b3c}
@deffn {속성} name

로더가 처리할 수 있는 모듈의 이름.
@end deffn

@geindex path (importlib.abc.FileLoader의 속성)
@anchor{library/importlib importlib abc FileLoader path}@anchor{4b3d}
@deffn {속성} path

모듈 파일의 경로.
@end deffn

@geindex load_module() (importlib.abc.FileLoader 메서드)
@anchor{library/importlib importlib abc FileLoader load_module}@anchor{4b3e}
@deffn {메서드} load_module (fullname)

super의 @code{load_module()}을 호출합니다.


Deprecated since version 3.4, will be removed in version 3.15: 대신 @ref{a6a,,Loader.exec_module()}을 사용하십시오.

@end deffn

@geindex get_filename() (importlib.abc.FileLoader 메서드)
@anchor{library/importlib importlib abc FileLoader get_filename}@anchor{4b3f}
@deffn {메서드} abstractmethod get_filename (fullname)

@ref{4b3d,,path}를 반환합니다.
@end deffn

@geindex get_data() (importlib.abc.FileLoader 메서드)
@anchor{library/importlib importlib abc FileLoader get_data}@anchor{4b40}
@deffn {메서드} abstractmethod get_data (path)

`path'를 바이너리 파일로 읽고 그것의 바이트열을 반환합니다.
@end deffn
@end deffn

@geindex SourceLoader (importlib.abc 클래스)
@anchor{library/importlib importlib abc SourceLoader}@anchor{4b41}
@deffn {클래스} importlib.abc.SourceLoader

소스 (및 선택적으로 바이트 코드) 파일 로드를 구현하기 위한 추상 베이스 클래스. 이 클래스는 @ref{de1,,ResourceLoader}와 @ref{4b3a,,ExecutionLoader}를 모두 상속하며, 다음을 구현해야 합니다:


@itemize *

@item 
@ref{4b20,,ResourceLoader.get_data()}

@item 

@table @asis

@item @ref{4b3b,,ExecutionLoader.get_filename()}

소스 파일의 경로만 반환해야 합니다; 소스 없는 로딩은 지원되지 않습니다.
@end table
@end itemize

이 클래스에 의해 정의된 추상 메서드는 선택적 바이트 코드 파일 지원을 추가하는 것입니다. 이러한 선택적 메서드를 구현하지 않으면 (또는 그들이 @ref{36b,,NotImplementedError}를 발생시키도록 하면) 로더가 소스 코드에 대해서만 작동하도록 만듭니다. 메서드를 구현하면 로더가 소스*와* 바이트 코드 파일 모두에 대해 작동하게 할 수 있습니다; 바이트 코드만 제공되는 `소스 없는' 로드는 허용하지 않습니다. 바이트 코드 파일은 파이썬 컴파일러의 구문 분석 단계를 제거하여 로딩 속도를 높이기 위한 최적화라서, 바이트 코드 전용 API는 노출되지 않습니다.

@geindex path_stats() (importlib.abc.SourceLoader 메서드)
@anchor{library/importlib importlib abc SourceLoader path_stats}@anchor{138f}
@deffn {메서드} path_stats (path)

지정된 경로에 대한 메타 데이터를 포함하는 @ref{183,,dict}를 반환하는 선택적 추상 메서드. 지원되는 딕셔너리 키는 다음과 같습니다:


@itemize -

@item 
@code{'mtime'} (필수): 소스 코드의 수정 시간을 나타내는 정수나 부동 소수점 숫자;

@item 
@code{'size'} (선택): 바이트 단위의 소스 코드의 크기.
@end itemize

향후 확장을 위해, 딕셔너리의 다른 키는 무시됩니다. 경로를 처리할 수 없으면, @ref{2c0,,OSError}가 발생합니다.


Added in version 3.3.



버전 3.4에서 변경: @ref{36b,,NotImplementedError} 대신 @ref{2c0,,OSError}를 발생시킵니다.

@end deffn

@geindex path_mtime() (importlib.abc.SourceLoader 메서드)
@anchor{library/importlib importlib abc SourceLoader path_mtime}@anchor{138e}
@deffn {메서드} path_mtime (path)

지정된 경로의 수정 시간을 반환하는 선택적 추상 메서드.


버전 3.3부터 폐지됨: 이 메서드는 폐지되었고 @ref{138f,,path_stats()}로 대체되었습니다. 구현할 필요는 없지만, 호환성을 위해 여전히 제공됩니다. 경로를 처리할 수 없으면 @ref{2c0,,OSError}를 발생시킵니다.



버전 3.4에서 변경: @ref{36b,,NotImplementedError} 대신 @ref{2c0,,OSError}를 발생시킵니다.

@end deffn

@geindex set_data() (importlib.abc.SourceLoader 메서드)
@anchor{library/importlib importlib abc SourceLoader set_data}@anchor{4b42}
@deffn {메서드} set_data (path, data)

지정된 바이트열을 파일 경로에 쓰는 선택적 추상 메서드. 존재하지 않는 중간 디렉터리는 자동으로 만들어집니다.

경로가 읽기 전용(@ref{2712,,errno.EACCES}/@ref{f3d,,PermissionError})이라서 경로에 쓰지 못할 때 예외를 전파하지 않습니다.


버전 3.4에서 변경: 호출할 때 더는 @ref{36b,,NotImplementedError}를 발생시키지 않습니다.

@end deffn

@geindex get_code() (importlib.abc.SourceLoader 메서드)
@anchor{library/importlib importlib abc SourceLoader get_code}@anchor{4b43}
@deffn {메서드} get_code (fullname)

@ref{1154,,InspectLoader.get_code()}의 구상 구현.
@end deffn

@geindex exec_module() (importlib.abc.SourceLoader 메서드)
@anchor{library/importlib importlib abc SourceLoader exec_module}@anchor{1212}
@deffn {메서드} exec_module (module)

@ref{a6a,,Loader.exec_module()}의 구상 구현.


Added in version 3.4.

@end deffn

@geindex load_module() (importlib.abc.SourceLoader 메서드)
@anchor{library/importlib importlib abc SourceLoader load_module}@anchor{4b44}
@deffn {메서드} load_module (fullname)

@ref{a69,,Loader.load_module()}의 구상 구현.


Deprecated since version 3.4, will be removed in version 3.15: 대신 @ref{1212,,exec_module()}을 사용하십시오.

@end deffn

@geindex get_source() (importlib.abc.SourceLoader 메서드)
@anchor{library/importlib importlib abc SourceLoader get_source}@anchor{1220}
@deffn {메서드} get_source (fullname)

@ref{1157,,InspectLoader.get_source()}의 구상 구현.
@end deffn

@geindex is_package() (importlib.abc.SourceLoader 메서드)
@anchor{library/importlib importlib abc SourceLoader is_package}@anchor{4b45}
@deffn {메서드} is_package (fullname)

@ref{4b38,,InspectLoader.is_package()}의 구상 구현. (@ref{4b3b,,ExecutionLoader.get_filename()}에서 제공되는) 파일 경로가 파일 확장자를 제거했을 때 @code{__init__}라는 이름의 파일이고 `동시에' 모듈 이름 자체가 @code{__init__}로 끝나지 않으면 모듈은 패키지로 결정됩니다.
@end deffn
@end deffn

@node importlib machinery – Importers and path hooks,importlib util – Utility code for importers,importlib abc – Abstract base classes related to import,importlib — import의 구현
@anchor{library/importlib importlib-machinery-importers-and-path-hooks}@anchor{4b46}@anchor{library/importlib module-importlib machinery}@anchor{7d}
@subsubsection @code{importlib.machinery} – Importers and path hooks


@geindex module; importlib.machinery

`소스 코드:' Lib/importlib/machinery.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/importlib/machinery.py}


__________________________________________________________________


이 모듈에는 @ref{7f7,,import}가 모듈을 찾고 로드하는 데 도움이 되는 다양한 객체가 포함되어 있습니다.

@geindex SOURCE_SUFFIXES (importlib.machinery 모듈)
@anchor{library/importlib importlib machinery SOURCE_SUFFIXES}@anchor{737}
@deffn {데이터} importlib.machinery.SOURCE_SUFFIXES

소스 모듈로 인식되는 파일 접미사를 나타내는 문자열 리스트.


Added in version 3.3.

@end deffn

@geindex DEBUG_BYTECODE_SUFFIXES (importlib.machinery 모듈)
@anchor{library/importlib importlib machinery DEBUG_BYTECODE_SUFFIXES}@anchor{18b1}
@deffn {데이터} importlib.machinery.DEBUG_BYTECODE_SUFFIXES

최적화되지 않은 바이트 코드 모듈의 파일 접미사를 나타내는 문자열 리스트.


Added in version 3.3.



버전 3.5부터 폐지됨: 대신 @ref{739,,BYTECODE_SUFFIXES}를 사용하십시오.

@end deffn

@geindex OPTIMIZED_BYTECODE_SUFFIXES (importlib.machinery 모듈)
@anchor{library/importlib importlib machinery OPTIMIZED_BYTECODE_SUFFIXES}@anchor{18b2}
@deffn {데이터} importlib.machinery.OPTIMIZED_BYTECODE_SUFFIXES

최적화된 바이트 코드 모듈의 파일 접미사를 나타내는 문자열 리스트.


Added in version 3.3.



버전 3.5부터 폐지됨: 대신 @ref{739,,BYTECODE_SUFFIXES}를 사용하십시오.

@end deffn

@geindex BYTECODE_SUFFIXES (importlib.machinery 모듈)
@anchor{library/importlib importlib machinery BYTECODE_SUFFIXES}@anchor{739}
@deffn {데이터} importlib.machinery.BYTECODE_SUFFIXES

바이트 코드 모듈로 인식되는 파일 접미사를 나타내는 문자열 리스트 (앞의 점을 포함합니다).


Added in version 3.3.



버전 3.5에서 변경: 이 값은 더는 @code{__debug__}에 의존하지 않습니다.

@end deffn

@geindex EXTENSION_SUFFIXES (importlib.machinery 모듈)
@anchor{library/importlib importlib machinery EXTENSION_SUFFIXES}@anchor{738}
@deffn {데이터} importlib.machinery.EXTENSION_SUFFIXES

확장 모듈로 인식되는 파일 접미사를 나타내는 문자열 리스트.


Added in version 3.3.

@end deffn

@geindex all_suffixes() (importlib.machinery 모듈)
@anchor{library/importlib importlib machinery all_suffixes}@anchor{4a59}
@deffn {함수} importlib.machinery.all_suffixes ()

표준 임포트 절차가 인식하는 모듈의 모든 파일 접미사를 나타내는 문자열의 결합한 리스트를 반환합니다. 이것은 모듈 종류에 대한 세부 정보 없이 파일 시스템 경로가 잠재적으로 모듈을 참조하는지를 알아야 하는 코드(예를 들어, @ref{f33,,inspect.getmodulename()})를 위한 도우미입니다.


Added in version 3.3.

@end deffn

@geindex BuiltinImporter (importlib.machinery 클래스)
@anchor{library/importlib importlib machinery BuiltinImporter}@anchor{eac}
@deffn {클래스} importlib.machinery.BuiltinImporter

내장 모듈용 @ref{2449,,임포터}. 알려진 모든 내장 모듈은 @ref{2045,,sys.builtin_module_names}에 나열되어 있습니다. 이 클래스는 @ref{a6e,,importlib.abc.MetaPathFinder}와 @ref{1153,,importlib.abc.InspectLoader} ABC를 구현합니다.

이 클래스는 인스턴스 화의 필요성을 완화하기 위해 클래스 메서드만 정의합니다.


버전 3.5에서 변경: 
@geindex Python 향상 제안; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}의 일부로, 내장 임포터는 이제 @code{Loader.create_module()}과 @code{Loader.exec_module()}을 구현합니다.

@end deffn

@geindex FrozenImporter (importlib.machinery 클래스)
@anchor{library/importlib importlib machinery FrozenImporter}@anchor{121e}
@deffn {클래스} importlib.machinery.FrozenImporter

프로즌(frozen) 모듈용 @ref{2449,,임포터}. 이 클래스는 @ref{a6e,,importlib.abc.MetaPathFinder}와 @ref{1153,,importlib.abc.InspectLoader} ABC를 구현합니다.

이 클래스는 인스턴스 화의 필요성을 완화하기 위해 클래스 메서드만 정의합니다.


버전 3.4에서 변경: @code{Loader.create_module()}과 @code{Loader.exec_module()} 메서드를 얻었습니다.

@end deffn

@geindex WindowsRegistryFinder (importlib.machinery 클래스)
@anchor{library/importlib importlib machinery WindowsRegistryFinder}@anchor{f25}
@deffn {클래스} importlib.machinery.WindowsRegistryFinder

윈도우 레지스트리에 선언된 모듈용 @ref{2367,,파인더}. 이 클래스는 @ref{a6e,,importlib.abc.MetaPathFinder} ABC를 구현합니다.

이 클래스는 인스턴스 화의 필요성을 완화하기 위해 클래스 메서드만 정의합니다.


Added in version 3.3.



버전 3.6부터 폐지됨: 대신 @ref{cc,,site} 구성을 사용하십시오. 이후 버전의 파이썬은 기본적으로 이 파인더를 활성화하지 않을 수 있습니다.

@end deffn

@geindex PathFinder (importlib.machinery 클래스)
@anchor{library/importlib importlib machinery PathFinder}@anchor{1222}
@deffn {클래스} importlib.machinery.PathFinder

@ref{3e4,,sys.path}와 패키지 @code{__path__} 어트리뷰트용 @ref{2367,,파인더}. 이 클래스는 @ref{a6e,,importlib.abc.MetaPathFinder} ABC를 구현합니다.

이 클래스는 인스턴스 화의 필요성을 완화하기 위해 클래스 메서드만 정의합니다.

@geindex find_spec() (importlib.machinery.PathFinder의 클래스 메서드)
@anchor{library/importlib importlib machinery PathFinder find_spec}@anchor{1210}
@deffn {메서드} classmethod find_spec (fullname, path=None, target=None)

@ref{3e4,,sys.path} 또는, 정의되었다면, `path'에서 `fullname'에 의해 지정된 모듈에 대한 @ref{2360,,스펙}을 찾으려고 시도하는 클래스 메서드. 검색된 각 경로 엔트리에 대해, @ref{7f9,,sys.path_importer_cache}가 확인됩니다. 거짓이 아닌 객체를 찾으면 검색 중인 모듈을 찾기 위한 @ref{1270,,경로 엔트리 파인더}로 사용됩니다. @code{sys.path_importer_cache}에 엔트리가 없으면, @ref{1223,,sys.path_hooks}에서 경로 엔트리를 위한 파인더를 검색하고, 발견되면, 모듈에 대해 조회되는 것과 동시에 @code{sys.path_importer_cache}에 저장됩니다. 파인더가 아예 발견되지 않으면 @code{None}이 캐시에 저장되고 반환됩니다.


Added in version 3.4.



버전 3.5에서 변경: 현재 작업 디렉터리 – 빈 문자열로 표현됩니다 – 가 더는 유효하지 않으면 @code{None}이 반환되지만 @ref{7f9,,sys.path_importer_cache}에 값이 캐시 되지는 않습니다.

@end deffn

@geindex invalidate_caches() (importlib.machinery.PathFinder의 클래스 메서드)
@anchor{library/importlib importlib machinery PathFinder invalidate_caches}@anchor{e08}
@deffn {메서드} classmethod invalidate_caches ()

메서드를 정의하는 @ref{7f9,,sys.path_importer_cache}에 저장된 모든 파인더에 대해 @ref{4b36,,importlib.abc.PathEntryFinder.invalidate_caches()}를 호출합니다. @code{sys.path_importer_cache}에 @code{None}으로 설정된 엔트리가 삭제됩니다.


버전 3.7에서 변경: @ref{7f9,,sys.path_importer_cache}에서 @code{None}의 엔트리가 삭제됩니다.

@end deffn


버전 3.4에서 변경: @code{'@w{'}}(즉 빈 문자열)에 대해서는 현재 작업 디렉터리로 @ref{1223,,sys.path_hooks}의 객체를 호출합니다.

@end deffn

@geindex FileFinder (importlib.machinery 클래스)
@anchor{library/importlib importlib machinery FileFinder}@anchor{1271}
@deffn {클래스} importlib.machinery.FileFinder (path, *loader_details)

파일 시스템에서의 결과를 캐시 하는 @ref{a6f,,importlib.abc.PathEntryFinder} 의 구상 구현.

`path' 인자는 파인더가 검색을 담당하는 디렉터리입니다.

`loader_details' 인자는 각각 로더와 로더가 인식하는 파일 접미사의 시퀀스를 포함하는 가변 개수의 2개 항목 튜플입니다. 로더는 모듈 이름과 찾은 파일의 경로로 구성되는 두 인자를 받아들이는 콜러블일 것으로 기대됩니다.

파인더는 필요에 따라 디렉터리 내용을 캐시 하여, 각 모듈 검색에서 stat 호출을 수행하여 캐시가 시효가 지나지 않았는지 확인합니다. 캐시 만료는 파일 시스템의 운영 체제 상태 정보의 세분성에 의존하기 때문에, 모듈 검색, 새 파일 생성 및 새 파일이 나타내는 모듈 검색의 잠재적 경쟁 조건이 있습니다. stat 호출의 세분성 이하로 연산이 아주 빠르게 수행되면, 모듈 검색이 실패합니다. 이를 방지하려면, 모듈을 동적으로 만들 때, @ref{e09,,importlib.invalidate_caches()}를 호출해야 합니다.


Added in version 3.3.


@geindex path (importlib.machinery.FileFinder의 속성)
@anchor{library/importlib importlib machinery FileFinder path}@anchor{4b47}
@deffn {속성} path

파인더가 검색할 경로.
@end deffn

@geindex find_spec() (importlib.machinery.FileFinder 메서드)
@anchor{library/importlib importlib machinery FileFinder find_spec}@anchor{10c5}
@deffn {메서드} find_spec (fullname, target=None)

@ref{4b47,,path} 내에서 `fullname'을 처리할 스펙을 찾으려고 합니다.


Added in version 3.4.

@end deffn

@geindex invalidate_caches() (importlib.machinery.FileFinder 메서드)
@anchor{library/importlib importlib machinery FileFinder invalidate_caches}@anchor{4b48}
@deffn {메서드} invalidate_caches ()

내부 캐시를 지웁니다.
@end deffn

@geindex path_hook() (importlib.machinery.FileFinder의 클래스 메서드)
@anchor{library/importlib importlib machinery FileFinder path_hook}@anchor{4b49}
@deffn {메서드} classmethod path_hook (*loader_details)

@ref{1223,,sys.path_hooks}에 사용할 클로저를 반환하는 클래스 메서드. @ref{1271,,FileFinder}의 인스턴스는 클로저에 직접 제공된 경로 인자와 `loader_details'를 간접적으로 사용하여 클로저에 의해 반환됩니다.

클로저에 대한 인자가 기존 디렉터리가 아니면, @ref{659,,ImportError}가 발생합니다.
@end deffn
@end deffn

@geindex SourceFileLoader (importlib.machinery 클래스)
@anchor{library/importlib importlib machinery SourceFileLoader}@anchor{1273}
@deffn {클래스} importlib.machinery.SourceFileLoader (fullname, path)

@ref{1272,,importlib.abc.FileLoader}를 서브 클래싱하고 다른 메서드의 구상 구현을 제공하는 @ref{4b41,,importlib.abc.SourceLoader}의 구상 구현.


Added in version 3.3.


@geindex name (importlib.machinery.SourceFileLoader의 속성)
@anchor{library/importlib importlib machinery SourceFileLoader name}@anchor{4b4a}
@deffn {속성} name

이 로더가 처리할 모듈의 이름.
@end deffn

@geindex path (importlib.machinery.SourceFileLoader의 속성)
@anchor{library/importlib importlib machinery SourceFileLoader path}@anchor{4b4b}
@deffn {속성} path

소스 파일의 경로.
@end deffn

@geindex is_package() (importlib.machinery.SourceFileLoader 메서드)
@anchor{library/importlib importlib machinery SourceFileLoader is_package}@anchor{4b4c}
@deffn {메서드} is_package (fullname)

@ref{4b4b,,path}가 패키지에 대한 것으로 드러나면 @code{True}를 반환합니다.
@end deffn

@geindex path_stats() (importlib.machinery.SourceFileLoader 메서드)
@anchor{library/importlib importlib machinery SourceFileLoader path_stats}@anchor{4b4d}
@deffn {메서드} path_stats (path)

@ref{138f,,importlib.abc.SourceLoader.path_stats()}의 구상 구현.
@end deffn

@geindex set_data() (importlib.machinery.SourceFileLoader 메서드)
@anchor{library/importlib importlib machinery SourceFileLoader set_data}@anchor{4b4e}
@deffn {메서드} set_data (path, data)

@ref{4b42,,importlib.abc.SourceLoader.set_data()}의 구상 구현.
@end deffn

@geindex load_module() (importlib.machinery.SourceFileLoader 메서드)
@anchor{library/importlib importlib machinery SourceFileLoader load_module}@anchor{f23}
@deffn {메서드} load_module (name=None)

로드할 모듈 이름을 지정하는 것이 선택적인 @ref{a69,,importlib.abc.Loader.load_module()}의 구상 구현.


Deprecated since version 3.6, will be removed in version 3.15: 대신 @ref{a6a,,importlib.abc.Loader.exec_module()}을 사용하십시오.

@end deffn
@end deffn

@geindex SourcelessFileLoader (importlib.machinery 클래스)
@anchor{library/importlib importlib machinery SourcelessFileLoader}@anchor{1274}
@deffn {클래스} importlib.machinery.SourcelessFileLoader (fullname, path)

바이트 코드 파일을 (즉, 소스 코드 파일 없이) 임포트 할 수 있는 @ref{1272,,importlib.abc.FileLoader}의 구상 구현.

바이트 코드 파일(그래서 소스 코드 파일이 아닌)을 직접 사용하면 모든 파이썬 구현이나 바이트 코드 형식을 변경하는 새 버전의 파이썬에서 모듈을 사용할 수 없게 됨에 유의하십시오.


Added in version 3.3.


@geindex name (importlib.machinery.SourcelessFileLoader의 속성)
@anchor{library/importlib importlib machinery SourcelessFileLoader name}@anchor{4b4f}
@deffn {속성} name

로더가 처리할 모듈의 이름.
@end deffn

@geindex path (importlib.machinery.SourcelessFileLoader의 속성)
@anchor{library/importlib importlib machinery SourcelessFileLoader path}@anchor{4b50}
@deffn {속성} path

바이트 코드 파일의 경로.
@end deffn

@geindex is_package() (importlib.machinery.SourcelessFileLoader 메서드)
@anchor{library/importlib importlib machinery SourcelessFileLoader is_package}@anchor{4b51}
@deffn {메서드} is_package (fullname)

@ref{4b50,,path}를 기반으로 모듈이 패키지인지 판단합니다.
@end deffn

@geindex get_code() (importlib.machinery.SourcelessFileLoader 메서드)
@anchor{library/importlib importlib machinery SourcelessFileLoader get_code}@anchor{4b52}
@deffn {메서드} get_code (fullname)

@ref{4b50,,path}에서 만들어진 @ref{4b4f,,name}의 코드 객체를 반환합니다.
@end deffn

@geindex get_source() (importlib.machinery.SourcelessFileLoader 메서드)
@anchor{library/importlib importlib machinery SourcelessFileLoader get_source}@anchor{4b53}
@deffn {메서드} get_source (fullname)

이 로더가 사용될 때는 바이트 코드 파일에 소스가 없어서 @code{None}을 반환합니다.
@end deffn

@geindex load_module() (importlib.machinery.SourcelessFileLoader 메서드)
@anchor{library/importlib importlib machinery SourcelessFileLoader load_module}@anchor{f24}
@deffn {메서드} load_module (name=None)
@end deffn

로드할 모듈 이름을 지정하는 것이 선택적인 @ref{a69,,importlib.abc.Loader.load_module()}의 구상 구현.


Deprecated since version 3.6, will be removed in version 3.15: 대신 @ref{a6a,,importlib.abc.Loader.exec_module()}을 사용하십시오.

@end deffn

@geindex ExtensionFileLoader (importlib.machinery 클래스)
@anchor{library/importlib importlib machinery ExtensionFileLoader}@anchor{ead}
@deffn {클래스} importlib.machinery.ExtensionFileLoader (fullname, path)

확장 모듈을 위한 @ref{4b3a,,importlib.abc.ExecutionLoader}의 구상 구현.

`fullname' 인자는 로더가 지원할 모듈의 이름을 지정합니다. `path' 인자는 확장 모듈 파일의 경로입니다.

Note that, by default, importing an extension module will fail
in subinterpreters if it doesn’t implement multi-phase init
(see 
@geindex Python 향상 제안; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}), even if it would otherwise import successfully.


Added in version 3.3.



버전 3.12에서 변경: Multi-phase init is now required for use in subinterpreters.


@geindex name (importlib.machinery.ExtensionFileLoader의 속성)
@anchor{library/importlib importlib machinery ExtensionFileLoader name}@anchor{4b54}
@deffn {속성} name

로더가 지원하는 모듈의 이름.
@end deffn

@geindex path (importlib.machinery.ExtensionFileLoader의 속성)
@anchor{library/importlib importlib machinery ExtensionFileLoader path}@anchor{4b55}
@deffn {속성} path

확장 모듈의 경로.
@end deffn

@geindex create_module() (importlib.machinery.ExtensionFileLoader 메서드)
@anchor{library/importlib importlib machinery ExtensionFileLoader create_module}@anchor{4b56}
@deffn {메서드} create_module (spec)

@geindex Python 향상 제안; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}에 따라 지정된 명세에서 모듈 객체를 만듭니다.


Added in version 3.5.

@end deffn

@geindex exec_module() (importlib.machinery.ExtensionFileLoader 메서드)
@anchor{library/importlib importlib machinery ExtensionFileLoader exec_module}@anchor{4b57}
@deffn {메서드} exec_module (module)

@geindex Python 향상 제안; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}에 따라 주어진 모듈 객체를 초기화합니다.


Added in version 3.5.

@end deffn

@geindex is_package() (importlib.machinery.ExtensionFileLoader 메서드)
@anchor{library/importlib importlib machinery ExtensionFileLoader is_package}@anchor{4b58}
@deffn {메서드} is_package (fullname)

@ref{738,,EXTENSION_SUFFIXES}에 기반해서 파일 경로가 패키지의 @code{__init__} 모듈을 가리키면 @code{True}를 반환합니다.
@end deffn

@geindex get_code() (importlib.machinery.ExtensionFileLoader 메서드)
@anchor{library/importlib importlib machinery ExtensionFileLoader get_code}@anchor{4b59}
@deffn {메서드} get_code (fullname)

확장 모듈에는 코드 객체가 없어서 @code{None}을 반환합니다.
@end deffn

@geindex get_source() (importlib.machinery.ExtensionFileLoader 메서드)
@anchor{library/importlib importlib machinery ExtensionFileLoader get_source}@anchor{4b5a}
@deffn {메서드} get_source (fullname)

확장 모듈에는 소스 코드가 없어서 @code{None}을 반환합니다.
@end deffn

@geindex get_filename() (importlib.machinery.ExtensionFileLoader 메서드)
@anchor{library/importlib importlib machinery ExtensionFileLoader get_filename}@anchor{1158}
@deffn {메서드} get_filename (fullname)

@ref{4b55,,path}를 반환합니다.


Added in version 3.4.

@end deffn
@end deffn

@geindex NamespaceLoader (importlib.machinery 클래스)
@anchor{library/importlib importlib machinery NamespaceLoader}@anchor{1155}
@deffn {클래스} importlib.machinery.NamespaceLoader (name, path, path_finder)

A concrete implementation of @ref{1153,,importlib.abc.InspectLoader} for
namespace packages.  This is an alias for a private class and is only made
public for introspecting the @code{__loader__} attribute on namespace
packages:

@example
>>> from importlib.machinery import NamespaceLoader
>>> import my_namespace
>>> isinstance(my_namespace.__loader__, NamespaceLoader)
True
>>> import importlib.abc
>>> isinstance(my_namespace.__loader__, importlib.abc.Loader)
True
@end example


Added in version 3.11.

@end deffn

@geindex ModuleSpec (importlib.machinery 클래스)
@anchor{library/importlib importlib machinery ModuleSpec}@anchor{2269}
@deffn {클래스} importlib.machinery.ModuleSpec (name, loader, *, origin=None, loader_state=None, is_package=None)

모듈의 임포트 시스템 관련 상태에 대한 명세. 이것은 일반적으로 모듈의 @ref{2361,,__spec__} 어트리뷰트로 노출됩니다. 이 중 많은 어트리뷰트는 모듈에서도 직접 제공됩니다: 예를 들어, @code{module.__spec__.origin == module.__file__}. 그러나 `values'는 일반적으로 동등하지만, 두 객체 간에 동기화가 없기 때문에 다를 수 있음에 유의하십시오. 예를 들어, 실행 시간에 모듈의 @ref{2366,,__file__}을 갱신할 수 있으며, 이는 모듈의 @ref{4b5b,,__spec__.origin}에 자동으로 반영되지 않고, 그 반대도 마찬가지 입니다.


Added in version 3.4.


@geindex name (importlib.machinery.ModuleSpec의 속성)
@anchor{library/importlib importlib machinery ModuleSpec name}@anchor{2362}
@deffn {속성} name

The module’s fully qualified name (see @ref{1590,,module.__name__}).
The @ref{2367,,finder} should always set this attribute to a non-empty string.
@end deffn

@geindex loader (importlib.machinery.ModuleSpec의 속성)
@anchor{library/importlib importlib machinery ModuleSpec loader}@anchor{33c}
@deffn {속성} loader

모듈을 로드하는 데 사용되는 @ref{1a28,,로더} (@ref{33b,,module.__loader__}를 참조하세요). @ref{2367,,파인더}는 항상 이 어트리뷰트를 설정해야 합니다.
@end deffn

@geindex origin (importlib.machinery.ModuleSpec의 속성)
@anchor{library/importlib importlib machinery ModuleSpec origin}@anchor{4b5b}
@deffn {속성} origin

The location the @ref{1a28,,loader} should use to load the module
(see @ref{2366,,module.__file__}).
For example, for modules loaded from a @code{.py} file this is the filename.
The @ref{2367,,finder} should always set this attribute to a meaningful value
for the loader to use.  In the uncommon case that there is not one
(like for namespace packages), it should be set to @code{None}.
@end deffn

@geindex submodule_search_locations (importlib.machinery.ModuleSpec의 속성)
@anchor{library/importlib importlib machinery ModuleSpec submodule_search_locations}@anchor{2365}
@deffn {속성} submodule_search_locations

A (possibly empty) @ref{715,,sequence} of strings enumerating the locations
in which a package’s submodules will be found
(see @ref{2052,,module.__path__}). Most of the time there will only be a
single directory in this list.

The @ref{2367,,finder} should set this attribute to a sequence, even an empty
one, to indicate
to the import system that the module is a package.  It should be set to @code{None} for
non-package modules.  It is set automatically later to a special object for
namespace packages.
@end deffn

@geindex loader_state (importlib.machinery.ModuleSpec의 속성)
@anchor{library/importlib importlib machinery ModuleSpec loader_state}@anchor{4b5c}
@deffn {속성} loader_state

The @ref{2367,,finder} may set this attribute to an object containing additional,
module-specific data to use when loading the module.  Otherwise it should be
set to @code{None}.
@end deffn

@geindex cached (importlib.machinery.ModuleSpec의 속성)
@anchor{library/importlib importlib machinery ModuleSpec cached}@anchor{322}
@deffn {속성} cached

The filename of a compiled version of the module’s code
(see @ref{321,,module.__cached__}).
The @ref{2367,,finder} should always set this attribute but it may be @code{None}
for modules that do not need compiled code stored.
@end deffn

@geindex parent (importlib.machinery.ModuleSpec의 속성)
@anchor{library/importlib importlib machinery ModuleSpec parent}@anchor{324}
@deffn {속성} parent

(읽기 전용) 모듈이 속한 패키지의 패키지의 완전히 정규화된 이름 (또는 최상위 수준 모듈의 경우 빈 문자열). @ref{323,,module.__package__}를 참조하세요. 모듈이 패키지면, @ref{2362,,name}과 같습니다.
@end deffn

@geindex has_location (importlib.machinery.ModuleSpec의 속성)
@anchor{library/importlib importlib machinery ModuleSpec has_location}@anchor{4b5d}
@deffn {속성} has_location

@code{True} if the spec’s @ref{4b5b,,origin} refers to a loadable location,
@code{False} otherwise.  This value impacts how @code{origin} is interpreted
and how the module’s @ref{2366,,__file__} is populated.
@end deffn
@end deffn

@geindex AppleFrameworkLoader (importlib.machinery 클래스)
@anchor{library/importlib importlib machinery AppleFrameworkLoader}@anchor{2268}
@deffn {클래스} importlib.machinery.AppleFrameworkLoader (name, path)

프레임워크 형식의 확장 모듈을 로드할 수 있는 @ref{ead,,importlib.machinery.ExtensionFileLoader}의 특수화.

For compatibility with the iOS App Store, `all' binary modules in an iOS app
must be dynamic libraries, contained in a framework with appropriate
metadata, stored in the @code{Frameworks} folder of the packaged app. There can
be only a single binary per framework, and there can be no executable binary
material outside the Frameworks folder.

To accommodate this requirement, when running on iOS, extension module
binaries are `not' packaged as @code{.so} files on @code{sys.path}, but as
individual standalone frameworks. To discover those frameworks, this loader
is registered against the @code{.fwork} file extension, with a @code{.fwork}
file acting as a placeholder in the original location of the binary on
@code{sys.path}. The @code{.fwork} file contains the path of the actual binary in
the @code{Frameworks} folder, relative to the app bundle. To allow for
resolving a framework-packaged binary back to the original location, the
framework is expected to contain a @code{.origin} file that contains the
location of the @code{.fwork} file, relative to the app bundle.

For example, consider the case of an import @code{from foo.bar import _whiz},
where @code{_whiz} is implemented with the binary module
@code{sources/foo/bar/_whiz.abi3.so}, with @code{sources} being the location
registered on @code{sys.path}, relative to the application bundle. This module
`must' be distributed as
@code{Frameworks/foo.bar._whiz.framework/foo.bar._whiz} (creating the framework
name from the full import path of the module), with an @code{Info.plist} file
in the @code{.framework} directory identifying the binary as a framework. The
@code{foo.bar._whiz} module would be represented in the original location with
a @code{sources/foo/bar/_whiz.abi3.fwork} marker file, containing the path
@code{Frameworks/foo.bar._whiz/foo.bar._whiz}. The framework would also contain
@code{Frameworks/foo.bar._whiz.framework/foo.bar._whiz.origin}, containing the
path to the @code{.fwork} file.

When a module is loaded with this loader, the @code{__file__} for the module
will report as the location of the @code{.fwork} file. This allows code to use
the @code{__file__} of a  module as an anchor for file system traversal.
However, the spec origin will reference the location of the `actual' binary
in the @code{.framework} folder.

The Xcode project building the app is responsible for converting any @code{.so}
files from wherever they exist in the @code{PYTHONPATH} into frameworks in the
@code{Frameworks} folder (including stripping extensions from the module file,
the addition of framework metadata, and signing the resulting framework),
and creating the @code{.fwork} and @code{.origin} files. This will usually be done
with a build step in the Xcode project; see the iOS documentation for
details on how to construct this build step.


Added in version 3.13.


@ref{213c,,가용성}: iOS.

@geindex name (importlib.machinery.AppleFrameworkLoader의 속성)
@anchor{library/importlib importlib machinery AppleFrameworkLoader name}@anchor{4b5e}
@deffn {속성} name

로더가 지원하는 모듈의 이름.
@end deffn

@geindex path (importlib.machinery.AppleFrameworkLoader의 속성)
@anchor{library/importlib importlib machinery AppleFrameworkLoader path}@anchor{4b5f}
@deffn {속성} path

확장 모듈의 @code{.fwork} 파일 경로.
@end deffn
@end deffn

@node importlib util – Utility code for importers,예<17>,importlib machinery – Importers and path hooks,importlib — import의 구현
@anchor{library/importlib importlib-util-utility-code-for-importers}@anchor{4b60}@anchor{library/importlib module-importlib util}@anchor{81}
@subsubsection @code{importlib.util} – Utility code for importers


@geindex module; importlib.util

`소스 코드:' Lib/importlib/util.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/importlib/util.py}


__________________________________________________________________


이 모듈에는 @ref{2449,,임포터} 구성에 도움이 되는 다양한 객체가 포함되어 있습니다.

@geindex MAGIC_NUMBER (importlib.util 모듈)
@anchor{library/importlib importlib util MAGIC_NUMBER}@anchor{736}
@deffn {데이터} importlib.util.MAGIC_NUMBER

바이트 코드 버전 번호를 나타내는 바이트열. 바이트 코드의 로드/쓰기에 도움이 필요하면 @ref{4b41,,importlib.abc.SourceLoader}를 고려하십시오.


Added in version 3.4.

@end deffn

@geindex cache_from_source() (importlib.util 모듈)
@anchor{library/importlib importlib util cache_from_source}@anchor{353}
@deffn {함수} importlib.util.cache_from_source (path, debug_override=None, *, optimization=None)

소스 `path'와 연관된 바이트 컴파일된 파일의 
@geindex Python 향상 제안; PEP 3147
PEP 3147@footnote{https://peps.python.org/pep-3147/}/
@geindex Python 향상 제안; PEP 488
PEP 488@footnote{https://peps.python.org/pep-0488/} 경로를 반환합니다. 예를 들어, `path'가 @code{/foo/bar/baz.py}이면 반환값은 파이썬 3.2의 경우 @code{/foo/bar/__pycache__/baz.cpython-32.pyc}입니다. @code{cpython-32} 문자열은 현재 매직 태그에서 온 것입니다 (@code{get_tag()}를 참조하십시오; @code{sys.implementation.cache_tag}가 정의되지 않으면 @ref{36b,,NotImplementedError} 가 발생합니다).

`optimization' 매개 변수는 바이트 코드 파일의 최적화 수준을 지정하는 데 사용됩니다. 빈 문자열은 최적화하지 않음을 나타내므로, `optimization'이 @code{'@w{'}} 인 @code{/foo/bar/baz.py}는 바이트 코드 경로가 @code{/foo/bar/__pycache__/baz.cpython-32.pyc}가 됩니다. @code{None}은 인터프리터의 최적화 수준이 사용되도록 합니다. 다른 값의 문자열 표현은 사용되므로, `optimization'이 @code{2}인 @code{/foo/bar/baz.py}는 바이트 코드 경로가 @code{/foo/bar/__pycache__/baz.cpython-32.opt-2.pyc}가 됩니다. `optimization'의 문자열 표현은 영숫자만 가능하며, 그렇지 않으면 @ref{2ec,,ValueError}가 발생합니다.

`debug_override' 매개 변수는 폐지되었고 @code{__debug__}의 시스템값을 대체하는 데 사용할 수 있습니다. @code{True} 값은 `optimization'을 빈 문자열로 설정하는 것과 등등합니다. @code{False} 값은 `optimization'을 @code{1}로 설정하는 것과 같습니다. `debug_override'와 `optimization'이 모두 @code{None}이 아니면 @ref{198,,TypeError}가 발생합니다.


Added in version 3.4.



버전 3.5에서 변경: `optimization' 매개 변수가 추가되었고 `debug_override' 매개 변수는 폐지되었습니다.



버전 3.6에서 변경: @ref{5a0,,경로류 객체}를 받아들입니다.

@end deffn

@geindex source_from_cache() (importlib.util 모듈)
@anchor{library/importlib importlib util source_from_cache}@anchor{73d}
@deffn {함수} importlib.util.source_from_cache (path)

`path'에 
@geindex Python 향상 제안; PEP 3147
PEP 3147@footnote{https://peps.python.org/pep-3147/} 파일 이름이 주어지면, 연관된 소스 코드 파일 경로를 반환합니다. 예를 들어, `path'가 @code{/foo/bar/__pycache__/baz.cpython-32.pyc}이면 반환된 경로는 @code{/foo/bar/baz.py}입니다. `path'는 존재할 필요는 없지만, 
@geindex Python 향상 제안; PEP 3147
PEP 3147@footnote{https://peps.python.org/pep-3147/}이나 
@geindex Python 향상 제안; PEP 488
PEP 488@footnote{https://peps.python.org/pep-0488/} 형식을 준수하지 않으면, @ref{2ec,,ValueError}가 발생합니다. @code{sys.implementation.cache_tag}가 정의되지 않으면, @ref{36b,,NotImplementedError} 가 발생합니다.


Added in version 3.4.



버전 3.6에서 변경: @ref{5a0,,경로류 객체}를 받아들입니다.

@end deffn

@geindex decode_source() (importlib.util 모듈)
@anchor{library/importlib importlib util decode_source}@anchor{1156}
@deffn {함수} importlib.util.decode_source (source_bytes)

소스 코드를 나타내는 주어진 바이트열을 디코딩하고 유니버설 줄 넘김이 적용된 문자열로 반환합니다 (@ref{1157,,importlib.abc.InspectLoader.get_source()}에 필요한 대로).


Added in version 3.4.

@end deffn

@geindex resolve_name() (importlib.util 모듈)
@anchor{library/importlib importlib util resolve_name}@anchor{b06}
@deffn {함수} importlib.util.resolve_name (name, package)

상대 모듈 이름을 절대 이름으로 결정합니다.

`name' 선두에 점이 없으면, `name'이 단순히 반환됩니다. 이를 통해 `package' 인자가 필요한지 확인하지 않고 @code{importlib.util.resolve_name('sys', __spec__.parent)}와 같은 사용이 가능합니다.

`name'이 상대 모듈 이름이지만 `package'가 거짓 값(예를 들어 @code{None}이나 빈 문자열)이면 @ref{659,,ImportError}가 발생합니다. @code{ImportError}는 또한 상대 이름이 그것을 포함하는 패키지를 벗어날 것 같으면 발생합니다 (예를 들어 @code{spam} 패키지 내에서 @code{..bacon}을 요청하는 것).


Added in version 3.3.



버전 3.9에서 변경: import 문과의 일관성을 개선하기 위해, 잘못된 상대 임포트 시도에 대해 @ref{2ec,,ValueError} 대신 @ref{659,,ImportError}를 발생시킵니다.

@end deffn

@geindex find_spec() (importlib.util 모듈)
@anchor{library/importlib importlib util find_spec}@anchor{5ae}
@deffn {함수} importlib.util.find_spec (name, package=None)

선택적으로 지정된 `package' 이름에 상대적으로, 모듈의 @ref{2360,,스펙}을 찾습니다. 모듈이 @ref{17ea,,sys.modules}에 있으면, @code{sys.modules[name].__spec__}이 반환됩니다 (스펙이 @code{None}이 되거나 설정되지 않지 않은 한, 그럴 경우는 @ref{2ec,,ValueError}가 발생합니다). 그렇지 않으면 @ref{f26,,sys.meta_path}를 사용한 검색이 수행됩니다. 스펙을 찾지 못하면 @code{None}이 반환됩니다.

`name'이 서브 모듈에 관한 것이면 (점을 포함하면), 부모 모듈은 자동으로 임포트 됩니다.

`name'과 `package'는 @code{import_module()}과 같게 작동합니다.


Added in version 3.4.



버전 3.7에서 변경: `package'가 실제로 패키지가 아니면 (즉 @ref{2052,,__path__} 어트리뷰트가 없으면) @ref{5ee,,AttributeError} 대신 @ref{d3c,,ModuleNotFoundError}를 발생시킵니다.

@end deffn

@geindex module_from_spec() (importlib.util 모듈)
@anchor{library/importlib importlib util module_from_spec}@anchor{1012}
@deffn {함수} importlib.util.module_from_spec (spec)

`spec'과 @ref{eab,,spec.loader.create_module}을 기반으로 새 모듈을 만듭니다.

@ref{eab,,spec.loader.create_module}이 @code{None}을 반환하지 않으면, 어떤 기존 어트리뷰트도 재설정되지 않습니다. 또한 `spec'에 액세스하거나 모듈에서 어트리뷰트를 설정하는 동안 트리거 되면 @ref{5ee,,AttributeError}가 발생하지 않습니다.

`spec'은 모듈에서 가능한 많은 임포트 제어 어트리뷰트를 설정하는 데 사용되므로 새 모듈을 작성하는 데 @ref{1013,,types.ModuleType}을 사용하는 것보다 이 함수가 선호됩니다.


Added in version 3.5.

@end deffn

@geindex spec_from_loader() (importlib.util 모듈)
@anchor{library/importlib importlib util spec_from_loader}@anchor{a6d}
@deffn {함수} importlib.util.spec_from_loader (name, loader, *, origin=None, is_package=None)

로더(loader)를 기반으로 @ref{2269,,ModuleSpec} 인스턴스를 만들기 위한 팩토리 함수. 매개 변수는 ModuleSpec에서와 같은 의미입니다. 이 함수는 @code{InspectLoader.is_package()}와 같은 사용 가능한 @ref{1a28,,로더} API를 사용하여 스펙에 빠진 정보를 채웁니다.


Added in version 3.4.

@end deffn

@geindex spec_from_file_location() (importlib.util 모듈)
@anchor{library/importlib importlib util spec_from_file_location}@anchor{eae}
@deffn {함수} importlib.util.spec_from_file_location (name, location, *, loader=None, submodule_search_locations=None)

파일 경로를 기반으로 @ref{2269,,ModuleSpec} 인스턴스를 만드는 팩토리 함수. 로더 API를 사용하고 모듈이 파일 기반일 것이라는 것이 뜻하는 것으로 누락된 정보가 스펙에 채워집니다.


Added in version 3.4.



버전 3.6에서 변경: @ref{5a0,,경로류 객체}를 받아들입니다.

@end deffn

@geindex source_hash() (importlib.util 모듈)
@anchor{library/importlib importlib util source_hash}@anchor{d3d}
@deffn {함수} importlib.util.source_hash (source_bytes)

`source_bytes'의 해시를 바이트열로 반환합니다. 해시 기반 @code{.pyc} 파일은 해당 소스 파일 내용의 @ref{d3d,,source_hash()}를 헤더에 포함합니다.


Added in version 3.7.

@end deffn

@geindex _incompatible_extension_module_restrictions() (importlib.util 모듈)
@anchor{library/importlib importlib util _incompatible_extension_module_restrictions}@anchor{4b61}
@deffn {함수} importlib.util._incompatible_extension_module_restrictions (*, disable_check)

A context manager that can temporarily skip the compatibility check
for extension modules.  By default the check is enabled and will fail
when a single-phase init module is imported in a subinterpreter.
It will also fail for a multi-phase init module that doesn’t
explicitly support a per-interpreter GIL, when imported
in an interpreter with its own GIL.

Note that this function is meant to accommodate an unusual case;
one which is likely to eventually go away.  There’s is a pretty good
chance this is not what you were looking for.

You can get the same effect as this function by implementing the
basic interface of multi-phase init (
@geindex Python 향상 제안; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}) and lying about
support for multiple interpreters (or per-interpreter GIL).

@cartouche
@quotation 경고 
Using this function to disable the check can lead to
unexpected behavior and even crashes.  It should only be used during
extension module development.
@end quotation
@end cartouche


Added in version 3.12.

@end deffn

@geindex LazyLoader (importlib.util 클래스)
@anchor{library/importlib importlib util LazyLoader}@anchor{eaa}
@deffn {클래스} importlib.util.LazyLoader (loader)

모듈이 어트리뷰트에 액세스할 때까지 모듈 로더의 실행을 연기하는 클래스.

이 클래스는 필요한 모듈 형에 대한 제어로 @ref{a6a,,exec_module()}을 정의하는 로더**에서만** 작동합니다. 같은 이유로, 로더의 @ref{eab,,create_module()} 메서드는 @code{None}을 반환하거나, @ref{7f6,,슬롯}을 사용하지 않고 @code{__class__} 어트리뷰트가 변경될 수 있는 형을 반환해야 합니다. 마지막으로, @ref{17ea,,sys.modules}에 배치된 객체를 치환하는 모듈은 인터프리터 전체에서 모듈 참조를 안전하게 대체할 방법이 없어서 작동하지 않습니다; 이러한 치환이 감지되면 @ref{2ec,,ValueError}가 발생합니다.

@cartouche
@quotation 참고 
시작 시간이 중요한 프로젝트의 경우, 이 클래스를 사용하면 사용하지 않을 모듈을 로드하는 데 드는 비용을 최소화할 수 있습니다. 시작 시간이 핵심이 아닌 프로젝트의 경우 로딩이 지연되는 동안 만들어진, 따라서 문맥을 벗어난 에러 메시지 때문에, 이 클래스를 사용하지 말 것을 `강하게' 권고합니다.
@end quotation
@end cartouche


Added in version 3.5.



버전 3.6에서 변경: @ref{eac,,importlib.machinery.BuiltinImporter}와 @ref{ead,,importlib.machinery.ExtensionFileLoader} 에 대한 호환성 경고를 제거하고, @ref{eab,,create_module()}을 호출하기 시작했습니다.


@geindex factory() (importlib.util.LazyLoader의 클래스 메서드)
@anchor{library/importlib importlib util LazyLoader factory}@anchor{4b62}
@deffn {메서드} classmethod factory (loader)

지연된 로더(lazy loader)를 만드는 콜러블을 반환하는 클래스 메서드. 이것은 로더가 인스턴스가 아닌 클래스로 전달되는 상황에서 사용하려는 것입니다.

@example
suffixes = importlib.machinery.SOURCE_SUFFIXES
loader = importlib.machinery.SourceFileLoader
lazy_loader = importlib.util.LazyLoader.factory(loader)
finder = importlib.machinery.FileFinder(path, (lazy_loader, suffixes))
@end example
@end deffn
@end deffn

@node 예<17>,,importlib util – Utility code for importers,importlib — import의 구현
@anchor{library/importlib examples}@anchor{4b63}@anchor{library/importlib importlib-examples}@anchor{4b64}
@subsubsection 예


@menu
* 프로그래밍 방식으로 임포트 하기:: 
* 모듈을 임포트 할 수 있는지 확인하기:: 
* 소스 파일을 직접 임포트 하기:: 
* Implementing lazy imports:: 
* 임포터 설정하기:: 
* importlib.import_module() 근사하기: importlib import_module 근사하기. 

@end menu

@node 프로그래밍 방식으로 임포트 하기,모듈을 임포트 할 수 있는지 확인하기,,예<17>
@anchor{library/importlib importing-programmatically}@anchor{4b65}
@subsubsection 프로그래밍 방식으로 임포트 하기


프로그래밍 방식으로 모듈을 임포트 하려면, @ref{73b,,importlib.import_module()}을 사용하십시오.

@example
import importlib

itertools = importlib.import_module('itertools')
@end example

@node 모듈을 임포트 할 수 있는지 확인하기,소스 파일을 직접 임포트 하기,프로그래밍 방식으로 임포트 하기,예<17>
@anchor{library/importlib checking-if-a-module-can-be-imported}@anchor{4b66}
@subsubsection 모듈을 임포트 할 수 있는지 확인하기


실제로 임포트를 수행하지 않고 모듈을 임포트 할 수 있는지 확인해야 하면, @ref{5ae,,importlib.util.find_spec()}을 사용해야 합니다.

Note that if @code{name} is a submodule (contains a dot),
@ref{5ae,,importlib.util.find_spec()} will import the parent module.

@example
import importlib.util
import sys

# 설명을 위해.
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:
    # 실제 임포트를 수행하기로 선택하면 ...
    module = importlib.util.module_from_spec(spec)
    sys.modules[name] = module
    spec.loader.exec_module(module)
    print(f"@{name!r@} has been imported")
else:
    print(f"can't find the @{name!r@} module")
@end example

@node 소스 파일을 직접 임포트 하기,Implementing lazy imports,모듈을 임포트 할 수 있는지 확인하기,예<17>
@anchor{library/importlib importing-a-source-file-directly}@anchor{4b67}
@subsubsection 소스 파일을 직접 임포트 하기


This recipe should be used with caution: it is an approximation of an import
statement where the file path is specified directly, rather than
@ref{3e4,,sys.path} being searched. Alternatives should first be considered first,
such as modifying @code{sys.path} when a proper module is required, or using
@ref{4a5,,runpy.run_path()} when the global namespace resulting from running a Python
file is appropriate.

파이썬 소스 파일을 경로에서 직접 임포트 하려면, 다음 조리법을 사용하십시오:

@example
import importlib.util
import sys


def import_from_path(module_name, file_path):
    spec = importlib.util.spec_from_file_location(module_name, file_path)
    module = importlib.util.module_from_spec(spec)
    sys.modules[module_name] = module
    spec.loader.exec_module(module)
    return module


# 오직 설명을 위해 (`json` 의 사용은 임의적입니다).
import json
file_path = json.__file__
module_name = json.__name__

# `import json` 과 유사한 결과.
json = import_from_path(module_name, file_path)
@end example

@node Implementing lazy imports,임포터 설정하기,소스 파일을 직접 임포트 하기,예<17>
@anchor{library/importlib implementing-lazy-imports}@anchor{4b68}
@subsubsection Implementing lazy imports


The example below shows how to implement lazy imports:

@example
>>> import importlib.util
>>> import sys
>>> def lazy_import(name):
...     spec = importlib.util.find_spec(name)
...     loader = importlib.util.LazyLoader(spec.loader)
...     spec.loader = loader
...     module = importlib.util.module_from_spec(spec)
...     sys.modules[name] = module
...     loader.exec_module(module)
...     return module
...
>>> lazy_typing = lazy_import("typing")
>>> #lazy_typing 은 실제 모듈 객체입니다,
>>> #하지만 아직 메모리에 로드되지 않았습니다.
>>> lazy_typing.TYPE_CHECKING
False
@end example

@node 임포터 설정하기,importlib import_module 근사하기,Implementing lazy imports,예<17>
@anchor{library/importlib setting-up-an-importer}@anchor{4b69}
@subsubsection 임포터 설정하기


임포트의 심층 사용자 정의를 위해서는, 일반적으로 @ref{2449,,임포터}를 구현하려고 합니다. 이는 @ref{2367,,파인더}와 @ref{1a28,,로더} 측면을 모두 관리한다는 의미입니다. 파인더에는 필요에 따라 두 가지 종류가 있습니다: @ref{126f,,메타 경로 파인더}나 @ref{1270,,경로 엔트리 파인더}. 전자는 @ref{f26,,sys.meta_path}에 배치하는 것이고 후자는 @ref{1223,,sys.path_hooks}에서 @ref{245a,,경로 엔트리 훅}을 사용하여 만드는 것으로 @ref{3e4,,sys.path} 항목과 함께 작동하여 파인더를 만듭니다. 이 예제는 임포트가 임포터를 사용할 수 있도록 임포터를 등록하는 방법을 보여줍니다 (임포터를 직접 만들려면, 이 패키지에 정의된 적절한 클래스의 설명서를 읽으십시오):

@example
import importlib.machinery
import sys

# 오직 설명을 위해.
SpamMetaPathFinder = importlib.machinery.PathFinder
SpamPathEntryFinder = importlib.machinery.FileFinder
loader_details = (importlib.machinery.SourceFileLoader,
                  importlib.machinery.SOURCE_SUFFIXES)

# 메타 경로 파인더 설정하기.
# 파인더를 우선순위 측면에서 리스트의 올바른 위치에
# 넣으십시오.
sys.meta_path.append(SpamMetaPathFinder)

# 경로 엔트리 파인더 설정하기.
# 경로 훅을 우선순위 측면에서 리스트의 올바른 위치에
# 넣으십시오.
sys.path_hooks.append(SpamPathEntryFinder.path_hook(loader_details))
@end example

@node importlib import_module 근사하기,,임포터 설정하기,예<17>
@anchor{library/importlib approximating-importlib-import-module}@anchor{4b6a}
@subsubsection @code{importlib.import_module()} 근사하기


임포트 자체는 파이썬 코드로 구현되므로, importlib를 통해 대부분의 임포트 절차를 노출할 수 있습니다. 다음은 @ref{73b,,importlib.import_module()}의 근사적인(approximate) 구현을 제공하여 importlib가 노출하는 다양한 API를 설명하는 데 도움을 줍니다:

@example
import importlib.util
import sys

def import_module(name, package=None):
    """import의 대략적인 구현."""
    absolute_name = importlib.util.resolve_name(name, package)
    try:
        return sys.modules[absolute_name]
    except KeyError:
        pass

    path = None
    if '.' in absolute_name:
        parent_name, _, child_name = absolute_name.rpartition('.')
        parent_module = import_module(parent_name)
        path = parent_module.__spec__.submodule_search_locations
    for finder in sys.meta_path:
        spec = finder.find_spec(absolute_name, path)
        if spec is not None:
            break
    else:
        msg = f'No module named @{absolute_name!r@}'
        raise ModuleNotFoundError(msg, name=absolute_name)
    module = importlib.util.module_from_spec(spec)
    sys.modules[absolute_name] = module
    spec.loader.exec_module(module)
    if path is not None:
        setattr(parent_module, child_name, module)
    return module
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node importlib resources – Package resource reading opening and access,importlib resources abc – Abstract base classes for resources,importlib — import의 구현,모듈 임포트 하기
@anchor{library/importlib resources doc}@anchor{4b6b}@anchor{library/importlib resources importlib-resources-package-resource-reading-opening-and-access}@anchor{4b6c}@anchor{library/importlib resources module-importlib resources}@anchor{7f}@anchor{library/importlib resources translation-repo}@anchor{4b6d}
@subsection @code{importlib.resources} – Package resource reading, opening and access


@geindex module; importlib.resources

`Source code:' Lib/importlib/resources/__init__.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/importlib/resources/__init__.py}


__________________________________________________________________



Added in version 3.7.


This module leverages Python’s import system to provide access to `resources'
within `packages'.

“Resources” are file-like resources associated with a module or package in
Python. The resources may be contained directly in a package, within a
subdirectory contained in that package, or adjacent to modules outside a
package. Resources may be text or binary. As a result, a package’s Python
module sources (.py), compilation artifacts (pycache), and installation
artifacts (like @ref{32b,,reserved filenames}
in directories) are technically de-facto resources of that package.
In practice, however, resources are primarily those non-Python artifacts
exposed specifically by the package author.

Resources can be opened or read in either binary or text mode.

Resources are roughly akin to files inside directories, though it’s important
to keep in mind that this is just a metaphor.  Resources and packages `do
not' have to exist as physical files and directories on the file system:
for example, a package and its resources can be imported from a zip file using
@ref{138,,zipimport}.

@cartouche
@quotation 참고 
This module provides functionality similar to pkg_resources@footnote{https://setuptools.readthedocs.io/en/latest/pkg_resources.html} Basic Resource Access@footnote{https://setuptools.readthedocs.io/en/latest/pkg_resources.html#basic-resource-access}
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@footnote{https://importlib-resources.readthedocs.io/en/latest/using.html} and
migrating from pkg_resources to importlib.resources@footnote{https://importlib-resources.readthedocs.io/en/latest/migration.html}.
@end quotation
@end cartouche

@ref{10c6,,Loaders} that wish to support resource reading should implement a
@code{get_resource_reader(fullname)} method as specified by
@ref{4b37,,importlib.resources.abc.ResourceReader}.

@geindex Anchor (importlib.resources 클래스)
@anchor{library/importlib resources importlib resources Anchor}@anchor{4b6e}
@deffn {클래스} importlib.resources.Anchor

Represents an anchor for resources, either a @ref{1013,,module object} or a module name as a string. Defined as
@code{Union[str, ModuleType]}.
@end deffn

@geindex files() (importlib.resources 모듈)
@anchor{library/importlib resources importlib resources files}@anchor{6b5}
@deffn {함수} importlib.resources.files (anchor: Anchor | None = None)

Returns a @ref{2fa,,Traversable} object
representing the resource container (think directory) and its resources
(think files). A Traversable may contain other containers (think
subdirectories).

`anchor' is an optional @ref{4b6e,,Anchor}. If the anchor is a
package, resources are resolved from that package. If a module,
resources are resolved adjacent to that module (in the same package
or the package root). If the anchor is omitted, the caller’s module
is used.


Added in version 3.9.



버전 3.12에서 변경: `package' parameter was renamed to `anchor'. `anchor' can now
be a non-package module and if omitted will default to the caller’s
module. `package' is still accepted for compatibility but will raise
a @ref{1a3,,DeprecationWarning}. Consider passing the anchor positionally or
using @code{importlib_resources >= 5.10} for a compatible interface
on older Pythons.

@end deffn

@geindex as_file() (importlib.resources 모듈)
@anchor{library/importlib resources importlib resources as_file}@anchor{6b4}
@deffn {함수} importlib.resources.as_file (traversable)

Given a @ref{2fa,,Traversable} object representing
a file or directory, typically from @ref{6b5,,importlib.resources.files()},
return a context manager for use in a @ref{186,,with} statement.
The context manager provides a @ref{266,,pathlib.Path} object.

Exiting the context manager cleans up any temporary file or directory
created when the resource was extracted from e.g. a zip file.

Use @code{as_file} when the Traversable methods
(@code{read_text}, etc) are insufficient and an actual file or directory on
the file system is required.


Added in version 3.9.



버전 3.12에서 변경: Added support for `traversable' representing a directory.

@end deffn

@menu
* Functional API:: 

@end menu

@node Functional API,,,importlib resources – Package resource reading opening and access
@anchor{library/importlib resources functional-api}@anchor{4b6f}@anchor{library/importlib resources importlib-resources-functional}@anchor{4b70}
@subsubsection Functional API


A set of simplified, backwards-compatible helpers is available.
These allow common operations in a single function call.

For all the following functions:


@itemize -

@item 
`anchor' is an @ref{4b6e,,Anchor},
as in @ref{6b5,,files()}.
Unlike in @code{files}, it may not be omitted.

@item 
`path_names' are components of a resource’s path name, relative to
the anchor.
For example, to get the text of resource named @code{info.txt}, use:

@example
importlib.resources.read_text(my_module, "info.txt")
@end example

Like @ref{2fa,,Traversable.joinpath},
The individual components should use forward slashes (@code{/})
as path separators.
For example, the following are equivalent:

@example
importlib.resources.read_binary(my_module, "pics/painting.png")
importlib.resources.read_binary(my_module, "pics", "painting.png")
@end example

For backward compatibility reasons, functions that read text require
an explicit `encoding' argument if multiple `path_names' are given.
For example, to get the text of @code{info/chapter1.txt}, use:

@example
importlib.resources.read_text(my_module, "info", "chapter1.txt",
                              encoding='utf-8')
@end example
@end itemize

@geindex open_binary() (importlib.resources 모듈)
@anchor{library/importlib resources importlib resources open_binary}@anchor{4fd}
@deffn {함수} importlib.resources.open_binary (anchor, *path_names)

Open the named resource for binary reading.

See @ref{4b70,,the introduction} for
details on `anchor' and `path_names'.

This function returns a @ref{23a,,BinaryIO} object,
that is, a binary stream open for reading.

This function is roughly equivalent to:

@example
files(anchor).joinpath(*path_names).open('rb')
@end example


버전 3.13에서 변경: Multiple `path_names' are accepted.

@end deffn

@geindex open_text() (importlib.resources 모듈)
@anchor{library/importlib resources importlib resources open_text}@anchor{4fe}
@deffn {함수} importlib.resources.open_text (anchor, *path_names, encoding='utf-8', errors='strict')

Open the named resource for text reading.
By default, the contents are read as strict UTF-8.

See @ref{4b70,,the introduction} for
details on `anchor' and `path_names'.
`encoding' and `errors' have the same meaning as in built-in @ref{316,,open()}.

For backward compatibility reasons, the `encoding' argument must be given
explicitly if there are multiple `path_names'.
This limitation is scheduled to be removed in Python 3.15.

This function returns a @ref{239,,TextIO} object,
that is, a text stream open for reading.

This function is roughly equivalent to:

@example
files(anchor).joinpath(*path_names).open('r', encoding=encoding)
@end example


버전 3.13에서 변경: Multiple `path_names' are accepted.
`encoding' and `errors' must be given as keyword arguments.

@end deffn

@geindex read_binary() (importlib.resources 모듈)
@anchor{library/importlib resources importlib resources read_binary}@anchor{500}
@deffn {함수} importlib.resources.read_binary (anchor, *path_names)

Read and return the contents of the named resource as @ref{192,,bytes}.

See @ref{4b70,,the introduction} for
details on `anchor' and `path_names'.

This function is roughly equivalent to:

@example
files(anchor).joinpath(*path_names).read_bytes()
@end example


버전 3.13에서 변경: Multiple `path_names' are accepted.

@end deffn

@geindex read_text() (importlib.resources 모듈)
@anchor{library/importlib resources importlib resources read_text}@anchor{501}
@deffn {함수} importlib.resources.read_text (anchor, *path_names, encoding='utf-8', errors='strict')

Read and return the contents of the named resource as @ref{169,,str}.
By default, the contents are read as strict UTF-8.

See @ref{4b70,,the introduction} for
details on `anchor' and `path_names'.
`encoding' and `errors' have the same meaning as in built-in @ref{316,,open()}.

For backward compatibility reasons, the `encoding' argument must be given
explicitly if there are multiple `path_names'.
This limitation is scheduled to be removed in Python 3.15.

This function is roughly equivalent to:

@example
files(anchor).joinpath(*path_names).read_text(encoding=encoding)
@end example


버전 3.13에서 변경: Multiple `path_names' are accepted.
`encoding' and `errors' must be given as keyword arguments.

@end deffn

@geindex path() (importlib.resources 모듈)
@anchor{library/importlib resources importlib resources path}@anchor{4ff}
@deffn {함수} importlib.resources.path (anchor, *path_names)

Provides the path to the `resource' as an actual file system path.  This
function returns a context manager for use in a @ref{186,,with} statement.
The context manager provides a @ref{266,,pathlib.Path} object.

Exiting the context manager cleans up any temporary files created, e.g.
when the resource needs to be extracted from a zip file.

For example, the @ref{a24,,stat()} method requires
an actual file system path; it can be used like this:

@example
with importlib.resources.path(anchor, "resource.txt") as fspath:
    result = fspath.stat()
@end example

See @ref{4b70,,the introduction} for
details on `anchor' and `path_names'.

This function is roughly equivalent to:

@example
as_file(files(anchor).joinpath(*path_names))
@end example


버전 3.13에서 변경: Multiple `path_names' are accepted.
`encoding' and `errors' must be given as keyword arguments.

@end deffn

@geindex is_resource() (importlib.resources 모듈)
@anchor{library/importlib resources importlib resources is_resource}@anchor{4fc}
@deffn {함수} importlib.resources.is_resource (anchor, *path_names)

Return @code{True} if the named resource exists, otherwise @code{False}.
This function does not consider directories to be resources.

See @ref{4b70,,the introduction} for
details on `anchor' and `path_names'.

This function is roughly equivalent to:

@example
files(anchor).joinpath(*path_names).is_file()
@end example


버전 3.13에서 변경: Multiple `path_names' are accepted.

@end deffn

@geindex contents() (importlib.resources 모듈)
@anchor{library/importlib resources importlib resources contents}@anchor{502}
@deffn {함수} importlib.resources.contents (anchor, *path_names)

Return an iterable over the named items within the package or path.
The iterable returns names of resources (e.g. files) and non-resources
(e.g. directories) as @ref{169,,str}.
The iterable does not recurse into subdirectories.

See @ref{4b70,,the introduction} for
details on `anchor' and `path_names'.

This function is roughly equivalent to:

@example
for resource in files(anchor).joinpath(*path_names).iterdir():
    yield resource.name
@end example


버전 3.11부터 폐지됨: Prefer @code{iterdir()} as above, which offers more control over the
results and richer functionality.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node importlib resources abc – Abstract base classes for resources,importlib metadata – 패키지 메타데이터 액세스,importlib resources – Package resource reading opening and access,모듈 임포트 하기
@anchor{library/importlib resources abc doc}@anchor{4b71}@anchor{library/importlib resources abc importlib-resources-abc-abstract-base-classes-for-resources}@anchor{4b72}@anchor{library/importlib resources abc module-importlib resources abc}@anchor{80}@anchor{library/importlib resources abc translation-repo}@anchor{4b73}
@subsection @code{importlib.resources.abc} – Abstract base classes for resources


@geindex module; importlib.resources.abc

`Source code:' Lib/importlib/resources/abc.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/importlib/resources/abc.py}


__________________________________________________________________



Added in version 3.11.


@geindex ResourceReader (importlib.resources.abc 클래스)
@anchor{library/importlib resources abc importlib resources abc ResourceReader}@anchor{4b37}
@deffn {클래스} importlib.resources.abc.ResourceReader

`Superseded by TraversableResources'

An @ref{13bb,,abstract base class} to provide the ability to read
`resources'.

From the perspective of this ABC, a `resource' is a binary
artifact that is shipped within a package. Typically this is
something like a data file that lives next to the @code{__init__.py}
file of the package. The purpose of this class is to help abstract
out the accessing of such data files so that it does not matter if
the package and its data file(s) are stored e.g. in a zip file
versus on the file system.

For any of methods of this class, a `resource' argument is
expected to be a @ref{5a0,,path-like object} which represents
conceptually just a file name. This means that no subdirectory
paths should be included in the `resource' argument. This is
because the location of the package the reader is for, acts as the
“directory”. Hence the metaphor for directories and file
names is packages and resources, respectively. This is also why
instances of this class are expected to directly correlate to
a specific package (instead of potentially representing multiple
packages or a module).

Loaders that wish to support resource reading are expected to
provide a method called @code{get_resource_reader(fullname)} which
returns an object implementing this ABC’s interface. If the module
specified by fullname is not a package, this method should return
@ref{884,,None}. An object compatible with this ABC should only be
returned when the specified module is a package.


버전 3.12부터 폐지됨: Use @ref{2f9,,importlib.resources.abc.TraversableResources} instead.


@geindex open_resource() (importlib.resources.abc.ResourceReader 메서드)
@anchor{library/importlib resources abc importlib resources abc ResourceReader open_resource}@anchor{4b74}
@deffn {메서드} abstractmethod open_resource (resource)

Returns an opened, @ref{17b3,,file-like object} for binary reading
of the `resource'.

If the resource cannot be found, @ref{264,,FileNotFoundError} is
raised.
@end deffn

@geindex resource_path() (importlib.resources.abc.ResourceReader 메서드)
@anchor{library/importlib resources abc importlib resources abc ResourceReader resource_path}@anchor{4b75}
@deffn {메서드} abstractmethod resource_path (resource)

Returns the file system path to the `resource'.

If the resource does not concretely exist on the file system,
raise @ref{264,,FileNotFoundError}.
@end deffn

@geindex is_resource() (importlib.resources.abc.ResourceReader 메서드)
@anchor{library/importlib resources abc importlib resources abc ResourceReader is_resource}@anchor{4b76}
@deffn {메서드} abstractmethod is_resource (path)

Returns @code{True} if the named `path' is considered a resource.
@ref{264,,FileNotFoundError} is raised if `path' does not exist.


버전 3.10에서 변경: The argument `name' was renamed to `path'.

@end deffn

@geindex contents() (importlib.resources.abc.ResourceReader 메서드)
@anchor{library/importlib resources abc importlib resources abc ResourceReader contents}@anchor{4b77}
@deffn {메서드} abstractmethod contents ()

Returns an @ref{142c,,iterable} of strings over the contents of
the package. Do note that it is not required that all names
returned by the iterator be actual resources, e.g. it is
acceptable to return names for which @ref{4b76,,is_resource()} would
be false.

Allowing non-resource names to be returned is to allow for
situations where how a package and its resources are stored
are known a priori and the non-resource names would be useful.
For instance, returning subdirectory names is allowed so that
when it is known that the package and resources are stored on
the file system then those subdirectory names can be used
directly.

The abstract method returns an iterable of no items.
@end deffn
@end deffn

@geindex Traversable (importlib.resources.abc 클래스)
@anchor{library/importlib resources abc importlib resources abc Traversable}@anchor{2fa}
@deffn {클래스} importlib.resources.abc.Traversable

An object with a subset of @ref{266,,pathlib.Path} methods suitable for
traversing directories and opening files.

For a representation of the object on the file-system, use
@ref{6b4,,importlib.resources.as_file()}.

@geindex name (importlib.resources.abc.Traversable의 속성)
@anchor{library/importlib resources abc importlib resources abc Traversable name}@anchor{4b78}
@deffn {속성} name

Abstract. The base name of this object without any parent references.
@end deffn

@geindex iterdir() (importlib.resources.abc.Traversable 메서드)
@anchor{library/importlib resources abc importlib resources abc Traversable iterdir}@anchor{4b79}
@deffn {메서드} abstractmethod iterdir ()

Yield Traversable objects in self.
@end deffn

@geindex is_dir() (importlib.resources.abc.Traversable 메서드)
@anchor{library/importlib resources abc importlib resources abc Traversable is_dir}@anchor{4b7a}
@deffn {메서드} abstractmethod is_dir ()

Return @code{True} if self is a directory.
@end deffn

@geindex is_file() (importlib.resources.abc.Traversable 메서드)
@anchor{library/importlib resources abc importlib resources abc Traversable is_file}@anchor{4b7b}
@deffn {메서드} abstractmethod is_file ()

Return @code{True} if self is a file.
@end deffn

@geindex joinpath() (importlib.resources.abc.Traversable 메서드)
@anchor{library/importlib resources abc importlib resources abc Traversable joinpath}@anchor{4b7c}
@deffn {메서드} abstractmethod joinpath (*pathsegments)

Traverse directories according to `pathsegments' and return
the result as @code{Traversable}.

Each `pathsegments' argument may contain multiple names separated by
forward slashes (@code{/}, @code{posixpath.sep} ).
For example, the following are equivalent:

@example
files.joinpath('subdir', 'subsuddir', 'file.txt')
files.joinpath('subdir/subsuddir/file.txt')
@end example

Note that some @code{Traversable} implementations
might not be updated to the latest version of the protocol.
For compatibility with such implementations, provide a single argument
without path separators to each call to @code{joinpath}. For example:

@example
files.joinpath('subdir').joinpath('subsubdir').joinpath('file.txt')
@end example


버전 3.11에서 변경: @code{joinpath} accepts multiple `pathsegments', and these segments
may contain forward slashes as path separators.
Previously, only a single `child' argument was accepted.

@end deffn

@geindex __truediv__() (importlib.resources.abc.Traversable 메서드)
@anchor{library/importlib resources abc importlib resources abc Traversable __truediv__}@anchor{4b7d}
@deffn {메서드} abstractmethod __truediv__ (child)

Return Traversable child in self.
Equivalent to @code{joinpath(child)}.
@end deffn

@geindex open() (importlib.resources.abc.Traversable 메서드)
@anchor{library/importlib resources abc importlib resources abc Traversable open}@anchor{4b7e}
@deffn {메서드} abstractmethod open (mode='r', *args, **kwargs)

`mode' may be ‘r’ or ‘rb’ to open as text or binary. Return a handle
suitable for reading (same as @ref{2c61,,pathlib.Path.open}).

When opening as text, accepts encoding parameters such as those
accepted by @ref{9be,,io.TextIOWrapper}.
@end deffn

@geindex read_bytes() (importlib.resources.abc.Traversable 메서드)
@anchor{library/importlib resources abc importlib resources abc Traversable read_bytes}@anchor{4b7f}
@deffn {메서드} read_bytes ()

Read contents of self as bytes.
@end deffn

@geindex read_text() (importlib.resources.abc.Traversable 메서드)
@anchor{library/importlib resources abc importlib resources abc Traversable read_text}@anchor{4b80}
@deffn {메서드} read_text (encoding=None)

Read contents of self as text.
@end deffn
@end deffn

@geindex TraversableResources (importlib.resources.abc 클래스)
@anchor{library/importlib resources abc importlib resources abc TraversableResources}@anchor{2f9}
@deffn {클래스} importlib.resources.abc.TraversableResources

An abstract base class for resource readers capable of serving
the @ref{6b5,,importlib.resources.files()} interface. Subclasses
@ref{4b37,,ResourceReader} and provides
concrete implementations of the @code{ResourceReader}’s
abstract methods. Therefore, any loader supplying
@code{TraversableResources} also supplies @code{ResourceReader}.

Loaders that wish to support resource reading are expected to
implement this interface.

@geindex files() (importlib.resources.abc.TraversableResources 메서드)
@anchor{library/importlib resources abc importlib resources abc TraversableResources files}@anchor{4b81}
@deffn {메서드} abstractmethod files ()

Returns a @ref{2fa,,importlib.resources.abc.Traversable} object for the loaded
package.
@end deffn
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node importlib metadata – 패키지 메타데이터 액세스,The initialization of the sys path module search path,importlib resources abc – Abstract base classes for resources,모듈 임포트 하기
@anchor{library/importlib metadata doc}@anchor{4b82}@anchor{library/importlib metadata importlib-metadata-accessing-package-metadata}@anchor{4b83}@anchor{library/importlib metadata module-importlib metadata}@anchor{7e}@anchor{library/importlib metadata translation-repo}@anchor{4b84}@anchor{library/importlib metadata using}@anchor{4b85}
@subsection @code{importlib.metadata} – 패키지 메타데이터 액세스


@geindex module; importlib.metadata


Added in version 3.8.



버전 3.10에서 변경: @code{importlib.metadata}는 더는 잠정적이지 않습니다.


`Source code:' Lib/importlib/metadata/__init__.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/importlib/metadata/__init__.py}

@code{importlib.metadata} is a library that provides access to
the metadata of an installed Distribution Package@footnote{https://packaging.python.org/en/latest/glossary/#term-Distribution-Package},
such as its entry points
or its top-level names (Import Package@footnote{https://packaging.python.org/en/latest/glossary/#term-Import-Package}s, modules, if any).
Built in part on Python’s import system, this library
intends to replace similar functionality in the entry point API@footnote{https://setuptools.readthedocs.io/en/latest/pkg_resources.html#entry-points} and metadata API@footnote{https://setuptools.readthedocs.io/en/latest/pkg_resources.html#metadata-api} of @code{pkg_resources}. Along with
@ref{7f,,importlib.resources},
this package can eliminate the need to use the older and less efficient
@code{pkg_resources} package.

@code{importlib.metadata} operates on third-party `distribution packages'
installed into Python’s @code{site-packages} directory via tools such as
pip@footnote{https://pypi.org/project/pip/}.
Specifically, it works with distributions with discoverable
@code{dist-info} or @code{egg-info} directories,
and metadata defined by the Core metadata specifications@footnote{https://packaging.python.org/en/latest/specifications/core-metadata/#core-metadata}.

@cartouche
@quotation 중요 
These are `not' necessarily equivalent to or correspond 1:1 with
the top-level `import package' names
that can be imported inside Python code.
One `distribution package' can contain multiple `import packages'
(and single modules),
and one top-level `import package'
may map to multiple `distribution packages'
if it is a namespace package.
You can use @ref{a11,,packages_distributions()}
to get a mapping between them.
@end quotation
@end cartouche

By default, distribution metadata can live on the file system
or in zip archives on
@ref{3e4,,sys.path}. Through an extension mechanism, the metadata can live almost
anywhere.


@subsubheading 더 보기



@table @asis

@item @indicateurl{https://importlib-metadata.readthedocs.io/}

The documentation for @code{importlib_metadata}, which supplies a
backport of @code{importlib.metadata}.
This includes an API reference@footnote{https://importlib-metadata.readthedocs.io/en/latest/api.html}
for this module’s classes and functions,
as well as a migration guide@footnote{https://importlib-metadata.readthedocs.io/en/latest/migration.html}
for existing users of @code{pkg_resources}.
@end table


@menu
* 개요: 개요<3>. 
* 기능적 API:: 
* 배포:: 
* 배포 발견:: 
* Implementing Custom Providers:: 

@end menu

@node 개요<3>,기능적 API,,importlib metadata – 패키지 메타데이터 액세스
@anchor{library/importlib metadata overview}@anchor{4b86}
@subsubsection 개요


Let’s say you wanted to get the version string for a
Distribution Package@footnote{https://packaging.python.org/en/latest/glossary/#term-Distribution-Package} you’ve installed
using @code{pip}. We start by creating a virtual environment and installing
something into it:

@example
$ python -m venv example
$ source example/bin/activate
(example) $ python -m pip install wheel
@end example

다음을 실행하여 @code{wheel}에 대한 버전 문자열을 얻을 수 있습니다:

@example
(example) $ python
>>> from importlib.metadata import version
>>> version('wheel')
'0.32.3'
@end example

You can also get a collection of entry points selectable by properties of the EntryPoint (typically ‘group’ or ‘name’), such as
@code{console_scripts}, @code{distutils.commands} and others. Each group contains a
collection of @ref{587,,EntryPoint} objects.

여러분은 @ref{4b87,,배포 메타데이터}를 얻을 수 있습니다:

@example
>>> list(metadata('wheel'))
['Metadata-Version', 'Name', 'Version', 'Summary', 'Home-page', 'Author', 'Author-email', 'Maintainer', 'Maintainer-email', 'License', 'Project-URL', 'Project-URL', 'Project-URL', 'Keywords', 'Platform', 'Classifier', 'Classifier', 'Classifier', 'Classifier', 'Classifier', 'Classifier', 'Classifier', 'Classifier', 'Classifier', 'Classifier', 'Classifier', 'Classifier', 'Requires-Python', 'Provides-Extra', 'Requires-Dist', 'Requires-Dist']
@end example

또한 @ref{4b88,,배포의 버전 번호}를 가져오고, @ref{4b89,,구성 파일}을 나열하고, 배포의 @ref{4b8a,,요구사항} 리스트를 얻을 수 있습니다.

@geindex PackageNotFoundError
@anchor{library/importlib metadata importlib metadata PackageNotFoundError}@anchor{4b8b}
@deffn {예외} importlib.metadata.PackageNotFoundError

Subclass of @ref{d3c,,ModuleNotFoundError} raised by several functions in this
module when queried for a distribution package which is not installed in the
current Python environment.
@end deffn

@node 기능적 API,배포,개요<3>,importlib metadata – 패키지 메타데이터 액세스
@anchor{library/importlib metadata functional-api}@anchor{4b8c}
@subsubsection 기능적 API


이 패키지는 공용 API를 통해 다음과 같은 기능을 제공합니다.

@menu
* 진입 지점:: 
* 배포 메타데이터:: 
* 배포 버전:: 
* 배포 파일:: 
* 배포 요구 사항:: 
* Mapping import to distribution packages:: 

@end menu

@node 진입 지점,배포 메타데이터,,기능적 API
@anchor{library/importlib metadata entry-points}@anchor{587}@anchor{library/importlib metadata id2}@anchor{4b8d}
@subsubsection 진입 지점


@geindex entry_points() (importlib.metadata 모듈)
@anchor{library/importlib metadata importlib metadata entry_points}@anchor{4b8e}
@deffn {함수} importlib.metadata.entry_points (**select_params)

Returns a @ref{4b8f,,EntryPoints} instance describing entry points for the
current environment. Any given keyword parameters are passed to the
@code{select()} method for comparison to the attributes of
the individual entry point definitions.

Note: it is not currently possible to query for entry points based on
their @code{EntryPoint.dist} attribute (as different @code{Distribution}
instances do not currently compare equal, even if they have the same attributes)
@end deffn

@geindex EntryPoints (importlib.metadata 클래스)
@anchor{library/importlib metadata importlib metadata EntryPoints}@anchor{4b8f}
@deffn {클래스} importlib.metadata.EntryPoints

Details of a collection of installed entry points.

Also provides a @code{.groups} attribute that reports all identified entry
point groups, and a @code{.names} attribute that reports all identified entry
point names.
@end deffn

@geindex EntryPoint (importlib.metadata 클래스)
@anchor{library/importlib metadata importlib metadata EntryPoint}@anchor{4b90}
@deffn {클래스} importlib.metadata.EntryPoint

Details of an installed entry point.

각 @code{EntryPoint} 인스턴스에는 @code{.name}, @code{.group} 및 @code{.value} 어트리뷰트가 있고 값을 결정하는 @code{.load()} 메서드가 있습니다. @code{.value} 어트리뷰트의 구성 요소를 가져오기 위한 @code{.module}, @code{.attr} 및 @code{.extras} 어트리뷰트도 있으며, @code{.dist}는 진입 지점을 제공하는 배포 패키지에 대한 정보를 얻는데 사용됩니다.
@end deffn

모든 진입 지점을 조회합니다:

@example
>>> eps = entry_points()
@end example

The @code{entry_points()} function returns a @code{EntryPoints} object,
a collection of all @code{EntryPoint} objects with @code{names} and @code{groups}
attributes for convenience:

@example
>>> sorted(eps.groups)
['console_scripts', 'distutils.commands', 'distutils.setup_keywords', 'egg_info.writers', 'setuptools.installation']
@end example

@code{EntryPoints} has a @code{select()} method to select entry points
matching specific properties. Select entry points in the
@code{console_scripts} group:

@example
>>> scripts = eps.select(group='console_scripts')
@end example

Equivalently, since @code{entry_points()} passes keyword arguments
through to select:

@example
>>> scripts = entry_points(group='console_scripts')
@end example

Pick out a specific script named “wheel” (found in the wheel project):

@example
>>> 'wheel' in scripts.names
True
>>> wheel = scripts['wheel']
@end example

Equivalently, query for that entry point during selection:

@example
>>> (wheel,) = entry_points(group='console_scripts', name='wheel')
>>> (wheel,) = entry_points().select(group='console_scripts', name='wheel')
@end example

Inspect the resolved entry point:

@example
>>> wheel
EntryPoint(name='wheel', value='wheel.cli:main', group='console_scripts')
>>> wheel.module
'wheel.cli'
>>> wheel.attr
'main'
>>> wheel.extras
[]
>>> main = wheel.load()
>>> main
<function main at 0x103528488>
@end example

The @code{group} and @code{name} are arbitrary values defined by the package author
and usually a client will wish to resolve all entry points for a particular
group. Read the setuptools docs@footnote{https://setuptools.pypa.io/en/latest/userguide/entry_point.html}
for more information on entry points, their definition, and usage.


버전 3.12에서 변경: The “selectable” entry points were introduced in @code{importlib_metadata}
3.6 and Python 3.10. Prior to those changes, @code{entry_points} accepted
no parameters and always returned a dictionary of entry points, keyed
by group. With @code{importlib_metadata} 5.0 and Python 3.12,
@code{entry_points} always returns an @code{EntryPoints} object. See
backports.entry_points_selectable@footnote{https://pypi.org/project/backports.entry_points_selectable/}
for compatibility options.



버전 3.13에서 변경: @code{EntryPoint} objects no longer present a tuple-like interface
(@ref{588,,__getitem__()}).


@node 배포 메타데이터,배포 버전,진입 지점,기능적 API
@anchor{library/importlib metadata distribution-metadata}@anchor{4b91}@anchor{library/importlib metadata metadata}@anchor{4b87}
@subsubsection 배포 메타데이터


@geindex metadata() (importlib.metadata 모듈)
@anchor{library/importlib metadata importlib metadata metadata}@anchor{4b92}
@deffn {함수} importlib.metadata.metadata (distribution_name)

Return the distribution metadata corresponding to the named
distribution package as a @ref{4b93,,PackageMetadata} instance.

Raises @ref{4b8b,,PackageNotFoundError} if the named distribution
package is not installed in the current Python environment.
@end deffn

@geindex PackageMetadata (importlib.metadata 클래스)
@anchor{library/importlib metadata importlib metadata PackageMetadata}@anchor{4b93}
@deffn {클래스} importlib.metadata.PackageMetadata

A concrete implementation of the
PackageMetadata protocol@footnote{https://importlib-metadata.readthedocs.io/en/latest/api.html#importlib_metadata.PackageMetadata}.

In addition to providing the defined protocol methods and attributes, subscripting
the instance is equivalent to calling the @code{get()} method.
@end deffn

모든 배포 패키지@footnote{https://packaging.python.org/en/latest/glossary/#term-Distribution-Package}는 @code{metadata()} 함수를 사용하여 추출할 수 있는 몇 가지 메타 데이터가 포함되어 있습니다:

@example
>>> wheel_metadata = metadata('wheel')
@end example

반환된 데이터 구조의 키는 메타데이터 키워드의 이름을 지정하고, 값은 배포 메타데이터에서 구문 분석하지 않은 채로 반환됩니다:

@example
>>> wheel_metadata['Requires-Python']
'>=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*'
@end example

@ref{4b93,,PackageMetadata} also presents a @code{json} attribute that returns
all the metadata in a JSON-compatible form per 
@geindex Python 향상 제안; PEP 566
PEP 566@footnote{https://peps.python.org/pep-0566/}:

@example
>>> wheel_metadata.json['requires_python']
'>=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*'
@end example

The full set of available metadata is not described here.
See the PyPA Core metadata specification@footnote{https://packaging.python.org/en/latest/specifications/core-metadata/#core-metadata} for additional details.


버전 3.10에서 변경: The @code{Description} is now included in the metadata when presented
through the payload. Line continuation characters have been removed.

The @code{json} attribute was added.


@node 배포 버전,배포 파일,배포 메타데이터,기능적 API
@anchor{library/importlib metadata distribution-versions}@anchor{4b94}@anchor{library/importlib metadata version}@anchor{4b88}
@subsubsection 배포 버전


@geindex version() (importlib.metadata 모듈)
@anchor{library/importlib metadata importlib metadata version}@anchor{1967}
@deffn {함수} importlib.metadata.version (distribution_name)

Return the installed distribution package
version@footnote{https://packaging.python.org/en/latest/specifications/core-metadata/#version}
for the named distribution package.

Raises @ref{4b8b,,PackageNotFoundError} if the named distribution
package is not installed in the current Python environment.
@end deffn

@code{version()} 함수는 배포 패키지@footnote{https://packaging.python.org/en/latest/glossary/#term-Distribution-Package}의 버전 번호를 문자열로 가져오는 가장 빠른 방법입니다:

@example
>>> version('wheel')
'0.32.3'
@end example

@node 배포 파일,배포 요구 사항,배포 버전,기능적 API
@anchor{library/importlib metadata distribution-files}@anchor{4b95}@anchor{library/importlib metadata files}@anchor{4b89}
@subsubsection 배포 파일


@geindex files() (importlib.metadata 모듈)
@anchor{library/importlib metadata importlib metadata files}@anchor{4b96}
@deffn {함수} importlib.metadata.files (distribution_name)

Return the full set of files contained within the named
distribution package.

Raises @ref{4b8b,,PackageNotFoundError} if the named distribution
package is not installed in the current Python environment.

Returns @ref{884,,None} if the distribution is found but the installation
database records reporting the files associated with the distribution package
are missing.
@end deffn

@geindex PackagePath (importlib.metadata 클래스)
@anchor{library/importlib metadata importlib metadata PackagePath}@anchor{4b97}
@deffn {클래스} importlib.metadata.PackagePath

A @ref{6cc,,pathlib.PurePath} derived object with additional @code{dist},
@code{size}, and @code{hash} properties corresponding to the distribution
package’s installation metadata for that file.
@end deffn

The @code{files()} function takes a
Distribution Package@footnote{https://packaging.python.org/en/latest/glossary/#term-Distribution-Package}
name and returns all of the files installed by this distribution. Each file is reported
as a @ref{4b97,,PackagePath} instance. For example:

@example
>>> util = [p for p in files('wheel') if 'util.py' in str(p)][0]
>>> util
PackagePath('wheel/util.py')
>>> util.size
859
>>> util.dist
<importlib.metadata._hooks.PathDistribution object at 0x101e0cef0>
>>> util.hash
<FileHash mode: sha256 value: bYkw5oMccfazVCoYQwKkkemoVyMAFoR34mmKBx8R1NI>
@end example

일단 파일을 얻으면, 내용을 읽을 수도 있습니다:

@example
>>> print(util.read_text())
import base64
import sys
...
def as_bytes(s):
    if isinstance(s, text_type):
        return s.encode('utf-8')
    return s
@end example

You can also use the @code{locate()} method to get the absolute
path to the file:

@example
>>> util.locate()
PosixPath('/home/gustav/example/lib/site-packages/wheel/util.py')
@end example

메타 데이터 파일 목록 파일(@code{RECORD}나 @code{SOURCES.txt})이 누락된 경우, @code{files()}는 @ref{884,,None}을 반환합니다. 대상 배포에 메타 데이터가 있음이 알려지지 않았을 때, 이 조건에 대한 보호로 호출자는 @code{files()}에 대한 호출을 always_iterable@footnote{https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.always_iterable}이나 다른 것으로 감쌀 수 있습니다.

@node 배포 요구 사항,Mapping import to distribution packages,배포 파일,기능적 API
@anchor{library/importlib metadata distribution-requirements}@anchor{4b98}@anchor{library/importlib metadata requirements}@anchor{4b8a}
@subsubsection 배포 요구 사항


@geindex requires() (importlib.metadata 모듈)
@anchor{library/importlib metadata importlib metadata requires}@anchor{4b99}
@deffn {함수} importlib.metadata.requires (distribution_name)

Return the declared dependency specifiers for the named
distribution package.

Raises @ref{4b8b,,PackageNotFoundError} if the named distribution
package is not installed in the current Python environment.
@end deffn

배포 패키지@footnote{https://packaging.python.org/en/latest/glossary/#term-Distribution-Package}의 전체 요구 사항을 얻으려면, @code{requires()} 함수를 사용하십시오:

@example
>>> requires('wheel')
["pytest (>=3.0.0) ; extra == 'test'", "pytest-cov ; extra == 'test'"]
@end example
@anchor{library/importlib metadata package-distributions}@anchor{a11}
@node Mapping import to distribution packages,,배포 요구 사항,기능적 API
@anchor{library/importlib metadata import-distribution-package-mapping}@anchor{4b9a}@anchor{library/importlib metadata mapping-import-to-distribution-packages}@anchor{4b9b}
@subsubsection Mapping import to distribution packages


@geindex packages_distributions() (importlib.metadata 모듈)
@anchor{library/importlib metadata importlib metadata packages_distributions}@anchor{4b9c}
@deffn {함수} importlib.metadata.packages_distributions ()

Return a mapping from the top level module and import package
names found via @ref{f26,,sys.meta_path} to the names of the distribution
packages (if any) that provide the corresponding files.

To allow for namespace packages (which may have members provided by
multiple distribution packages), each top level import name maps to a
list of distribution names rather than mapping directly to a single name.
@end deffn

A convenience method to resolve the Distribution Package@footnote{https://packaging.python.org/en/latest/glossary/#term-Distribution-Package}
name (or names, in the case of a namespace package)
that provide each importable top-level
Python module or Import Package@footnote{https://packaging.python.org/en/latest/glossary/#term-Import-Package}:

@example
>>> packages_distributions()
@{'importlib_metadata': ['importlib-metadata'], 'yaml': ['PyYAML'], 'jaraco': ['jaraco.classes', 'jaraco.functools'], ...@}
@end example

Some editable installs, do not supply top-level names@footnote{https://github.com/pypa/packaging-problems/issues/609}, and thus this
function is not reliable with such installs.


Added in version 3.10.


@node 배포,배포 발견,기능적 API,importlib metadata – 패키지 메타데이터 액세스
@anchor{library/importlib metadata distributions}@anchor{a12}@anchor{library/importlib metadata id9}@anchor{4b9d}
@subsubsection 배포


@geindex distribution() (importlib.metadata 모듈)
@anchor{library/importlib metadata importlib metadata distribution}@anchor{4b9e}
@deffn {함수} importlib.metadata.distribution (distribution_name)

Return a @ref{4b9f,,Distribution} instance describing the named
distribution package.

Raises @ref{4b8b,,PackageNotFoundError} if the named distribution
package is not installed in the current Python environment.
@end deffn

@geindex Distribution (importlib.metadata 클래스)
@anchor{library/importlib metadata importlib metadata Distribution}@anchor{4b9f}
@deffn {클래스} importlib.metadata.Distribution

Details of an installed distribution package.

Note: different @code{Distribution} instances do not currently compare
equal, even if they relate to the same installed distribution and
accordingly have the same attributes.
@end deffn

위에 기술된 모듈 수준 API가 가장 일반적이며 편리한 사용법이지만, @code{Distribution} 클래스에서 모든 정보를 얻을 수 있습니다. @code{Distribution}은 파이썬 배포 패키지@footnote{https://packaging.python.org/en/latest/glossary/#term-Distribution-Package}의 메타 데이터를 나타내는 추상 객체입니다. @ref{4b9e,,distribution()} 함수를 호출해서, 설치된 배포 패키지의 구상 @code{Distribution} 서브클래스 인스턴스를 얻을 수 있습니다:

@example
>>> from importlib.metadata import distribution
>>> dist = distribution('wheel')
>>> type(dist)
<class 'importlib.metadata.PathDistribution'>
@end example

따라서, 버전 번호를 얻는 다른 방법은 @code{Distribution} 인스턴스를 사용하는 것입니다:

@example
>>> dist.version
'0.32.3'
@end example

@code{Distribution} 인스턴스에서 사용할 수 있는 모든 종류의 추가 메타 데이터가 있습니다:

@example
>>> dist.metadata['Requires-Python']
'>=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*'
>>> dist.metadata['License']
'MIT'
@end example

For editable packages, an @code{origin} property may present 
@geindex Python 향상 제안; PEP 610
PEP 610@footnote{https://peps.python.org/pep-0610/}
metadata:

@example
>>> dist.origin.url
'file:///path/to/wheel-0.32.3.editable-py3-none-any.whl'
@end example

The full set of available metadata is not described here.
See the PyPA Core metadata specification@footnote{https://packaging.python.org/en/latest/specifications/core-metadata/#core-metadata} for additional details.


Added in version 3.13: The @code{.origin} property was added.


@node 배포 발견,Implementing Custom Providers,배포,importlib metadata – 패키지 메타데이터 액세스
@anchor{library/importlib metadata distribution-discovery}@anchor{4ba0}
@subsubsection 배포 발견


By default, this package provides built-in support for discovery of metadata
for file system and zip file Distribution Package@footnote{https://packaging.python.org/en/latest/glossary/#term-Distribution-Package}s.
This metadata finder search defaults to @code{sys.path}, but varies slightly in how it interprets those values from how other import machinery does. In particular:


@itemize -

@item 
@code{importlib.metadata} does not honor @ref{192,,bytes} objects on @code{sys.path}.

@item 
@code{importlib.metadata} will incidentally honor @ref{266,,pathlib.Path} objects on @code{sys.path} even though such values will be ignored for imports.
@end itemize

@node Implementing Custom Providers,,배포 발견,importlib metadata – 패키지 메타데이터 액세스
@anchor{library/importlib metadata implementing-custom-providers}@anchor{4ba1}
@subsubsection Implementing Custom Providers


@code{importlib.metadata} address two API surfaces, one for `consumers'
and another for `providers'. Most users are consumers, consuming
metadata provided by the packages. There are other use-cases, however,
where users wish to expose metadata through some other mechanism,
such as alongside a custom importer. Such a use case calls for a
`custom provider'.

Because Distribution Package@footnote{https://packaging.python.org/en/latest/glossary/#term-Distribution-Package} metadata
is not available through @ref{3e4,,sys.path} searches, or
package loaders directly,
the metadata for a distribution is found through import
system @ref{2447,,finders}. To find a distribution package’s metadata,
@code{importlib.metadata} queries the list of @ref{126f,,meta path finders} on
@ref{f26,,sys.meta_path}.

The implementation has hooks integrated into the @code{PathFinder},
serving metadata for distribution packages found on the file system.

추상 클래스 @ref{a6e,,importlib.abc.MetaPathFinder}는 파이썬의 임포트 시스템에 의해 파인더가 기대하는 인터페이스를 정의합니다. @code{importlib.metadata}는 @ref{f26,,sys.meta_path}의 파인더에서 선택적인 @code{find_distributions} 콜러블을 조회함으로써 이 프로토콜을 확장하고 이 확장된 인터페이스를 다음과 같은 추상 메서드를 정의하는 @code{DistributionFinder} 추상 베이스 클래스로 제공합니다:

@example
@@abc.abstractmethod
def find_distributions(context=DistributionFinder.Context()) -> Iterable[Distribution]:
    """Return an iterable of all Distribution instances capable of
    loading the metadata for packages for the indicated `@w{`}context`@w{`}.
    """
@end example

The @code{DistributionFinder.Context} object provides @code{.path} and @code{.name}
properties indicating the path to search and name to match and may
supply other relevant context sought by the consumer.

In practice, to support finding distribution package
metadata in locations other than the file system, subclass
@code{Distribution} and implement the abstract methods. Then from
a custom finder, return instances of this derived @code{Distribution} in the
@code{find_distributions()} method.

@menu
* 예제: 예제<29>. 

@end menu

@node 예제<29>,,,Implementing Custom Providers
@anchor{library/importlib metadata example}@anchor{4ba2}
@subsubsection 예제


Imagine a custom finder that loads Python modules from a database:

@example
class DatabaseImporter(importlib.abc.MetaPathFinder):
    def __init__(self, db):
        self.db = db

    def find_spec(self, fullname, target=None) -> ModuleSpec:
        return self.db.spec_from_name(fullname)

sys.meta_path.append(DatabaseImporter(connect_db(...)))
@end example

That importer now presumably provides importable modules from a
database, but it provides no metadata or entry points. For this
custom importer to provide metadata, it would also need to implement
@code{DistributionFinder}:

@example
from importlib.metadata import DistributionFinder

class DatabaseImporter(DistributionFinder):
    ...

    def find_distributions(self, context=DistributionFinder.Context()):
        query = dict(name=context.name) if context.name else @{@}
        for dist_record in self.db.query_distributions(query):
            yield DatabaseDistribution(dist_record)
@end example

In this way, @code{query_distributions} would return records for
each distribution served by the database matching the query. For
example, if @code{requests-1.0} is in the database, @code{find_distributions}
would yield a @code{DatabaseDistribution} for @code{Context(name='requests')}
or @code{Context(name=None)}.

For the sake of simplicity, this example ignores @code{context.path}. The
@code{path} attribute defaults to @code{sys.path} and is the set of import paths to
be considered in the search. A @code{DatabaseImporter} could potentially function
without any concern for a search path. Assuming the importer does no
partitioning, the “path” would be irrelevant. In order to illustrate the
purpose of @code{path}, the example would need to illustrate a more complex
@code{DatabaseImporter} whose behavior varied depending on
@code{sys.path}/@code{PYTHONPATH}. In that case, the @code{find_distributions} should
honor the @code{context.path} and only yield @code{Distribution}s pertinent to that
path.

@code{DatabaseDistribution}, then, would look something like:

@example
class DatabaseDistribution(importlib.metadata.Distribution):
    def __init__(self, record):
        self.record = record

    def read_text(self, filename):
        """
        Read a file like "METADATA" for the current distribution.
        """
        if filename == "METADATA":
            return f"""Name: @{self.record.name@}
Version: @{self.record.version@}
"""
        if filename == "entry_points.txt":
            return "\n".join(
              f"""[@{ep.group@}]\n@{ep.name@}=@{ep.value@}"""
              for ep in self.record.entry_points)

    def locate_file(self, path):
        raise RuntimeError("This distribution has no file system")
@end example

This basic implementation should provide metadata and entry points for
packages served by the @code{DatabaseImporter}, assuming that the
@code{record} supplies suitable @code{.name}, @code{.version}, and
@code{.entry_points} attributes.

The @code{DatabaseDistribution} may also provide other metadata files, like
@code{RECORD} (required for @code{Distribution.files}) or override the
implementation of @code{Distribution.files}. See the source for more inspiration.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node The initialization of the sys path module search path,,importlib metadata – 패키지 메타데이터 액세스,모듈 임포트 하기
@anchor{library/sys_path_init doc}@anchor{4ba3}@anchor{library/sys_path_init sys-path-init}@anchor{18dd}@anchor{library/sys_path_init the-initialization-of-the-sys-path-module-search-path}@anchor{4ba4}@anchor{library/sys_path_init translation-repo}@anchor{4ba5}
@subsection The initialization of the @code{sys.path} module search path


A module search path is initialized when Python starts. This module search path
may be accessed at @ref{3e4,,sys.path}.

The first entry in the module search path is the directory that contains the
input script, if there is one. Otherwise, the first entry is the current
directory, which is the case when executing the interactive shell, a @ref{1a8,,-c}
command, or @ref{23c,,-m} module.

The 
@geindex PYTHONPATH
@geindex 환경 변수; PYTHONPATH
@ref{121c,,PYTHONPATH} environment variable is often used to add directories
to the search path. If this environment variable is found then the contents are
added to the module search path.

@cartouche
@quotation 참고 
@geindex PYTHONPATH
@geindex 환경 변수; PYTHONPATH
@ref{121c,,PYTHONPATH} will affect all installed Python versions/environments.
Be wary of setting this in your shell profile or global environment variables.
The @ref{cc,,site} module offers more nuanced techniques as mentioned below.
@end quotation
@end cartouche

The next items added are the directories containing standard Python modules as
well as any @ref{224e,,extension module}s that these modules depend on. Extension
modules are @code{.pyd} files on Windows and @code{.so} files on other platforms. The
directory with the platform-independent Python modules is called @code{prefix}.
The directory with the extension modules is called @code{exec_prefix}.

The 
@geindex PYTHONHOME
@geindex 환경 변수; PYTHONHOME
@ref{3f0,,PYTHONHOME} environment variable may be used to set the @code{prefix}
and @code{exec_prefix} locations. Otherwise these directories are found by using
the Python executable as a starting point and then looking for various ‘landmark’
files and directories. Note that any symbolic links are followed so the real
Python executable location is used as the search starting point. The Python
executable location is called @code{home}.

Once @code{home} is determined, the @code{prefix} directory is found by first looking
for @code{python`majorversion'`minorversion'.zip} (@code{python311.zip}). On Windows
the zip archive is searched for in @code{home} and on Unix the archive is expected
to be in @code{lib}. Note that the expected zip archive location is added to the
module search path even if the archive does not exist. If no archive was found,
Python on Windows will continue the search for @code{prefix} by looking for @code{Lib\os.py}.
Python on Unix will look for @code{lib/python`majorversion'.`minorversion'/os.py}
(@code{lib/python3.11/os.py}). On Windows @code{prefix} and @code{exec_prefix} are the same,
however on other platforms @code{lib/python`majorversion'.`minorversion'/lib-dynload}
(@code{lib/python3.11/lib-dynload}) is searched for and used as an anchor for
@code{exec_prefix}. On some platforms @code{lib} may be @code{lib64} or another value,
see @ref{b32,,sys.platlibdir} and 
@geindex PYTHONPLATLIBDIR
@geindex 환경 변수; PYTHONPLATLIBDIR
@ref{1d20,,PYTHONPLATLIBDIR}.

Once found, @code{prefix} and @code{exec_prefix} are available at
@ref{3e6,,sys.base_prefix} and @ref{3ea,,sys.base_exec_prefix} respectively.

If 
@geindex PYTHONHOME
@geindex 환경 변수; PYTHONHOME
@ref{3f0,,PYTHONHOME} is not set, and a @code{pyvenv.cfg} file is found alongside
the main executable, or in its parent directory, @ref{3e7,,sys.prefix} and
@ref{3eb,,sys.exec_prefix} get set to the directory containing @code{pyvenv.cfg},
otherwise they are set to the same value as @ref{3e6,,sys.base_prefix} and
@ref{3ea,,sys.base_exec_prefix}, respectively.
This is used by @ref{48f2,,Virtual Environments}.

Finally, the @ref{cc,,site} module is processed and @code{site-packages} directories
are added to the module search path. A common way to customize the search path is
to create @ref{cd,,sitecustomize} or @ref{114,,usercustomize} modules as described in
the @code{site} module documentation.

@cartouche
@quotation 참고 
Certain command line options may further affect path calculations.
See @ref{b55,,-E}, @ref{b56,,-I}, @ref{1593,,-s} and @ref{13ad,,-S} for further details.
@end quotation
@end cartouche


버전 3.14에서 변경: @ref{3e7,,sys.prefix} and @ref{3eb,,sys.exec_prefix} are now set to the
@code{pyvenv.cfg} directory during the path initialization. This was previously
done by @ref{cc,,site}, therefore affected by @ref{13ad,,-S}.


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

@end menu

@node Virtual Environments,_pth files,,The initialization of the sys path module search path
@anchor{library/sys_path_init sys-path-init-virtual-environments}@anchor{48f2}@anchor{library/sys_path_init virtual-environments}@anchor{4ba6}
@subsubsection Virtual Environments


Virtual environments place a @code{pyvenv.cfg} file in their prefix, which causes
@ref{3e7,,sys.prefix} and @ref{3eb,,sys.exec_prefix} to point to them, instead of the
base installation.

The @code{prefix} and @code{exec_prefix} values of the base installation are available
at @ref{3e6,,sys.base_prefix} and @ref{3ea,,sys.base_exec_prefix}.

As well as being used as a marker to identify virtual environments,
@code{pyvenv.cfg} may also be used to configure the @ref{cc,,site} initialization.
Please refer to @code{site}’s
@ref{48f3,,virtual environments documentation}.

@cartouche
@quotation 참고 
@geindex PYTHONHOME
@geindex 환경 변수; PYTHONHOME
@ref{3f0,,PYTHONHOME} overrides the @code{pyvenv.cfg} detection.
@end quotation
@end cartouche

@cartouche
@quotation 참고 
There are other ways how “virtual environments” could be implemented, this
documentation refers implementations based on the @code{pyvenv.cfg} mechanism,
such as @ref{117,,venv}. Most virtual environment implementations follow the
model set by @code{venv}, but there may be exotic implementations that
diverge from it.
@end quotation
@end cartouche

@node _pth files,Embedded Python,Virtual Environments,The initialization of the sys path module search path
@anchor{library/sys_path_init pth-files}@anchor{4ba7}
@subsubsection _pth files


To completely override @ref{3e4,,sys.path} create a @code{._pth} file with the same
name as the shared library or executable (@code{python._pth} or @code{python311._pth}).
The shared library path is always known on Windows, however it may not be
available on other platforms. In the @code{._pth} file specify one line for each path
to add to @code{sys.path}. The file based on the shared library name overrides
the one based on the executable, which allows paths to be restricted for any
program loading the runtime if desired.

When the file exists, all registry and environment variables are ignored,
isolated mode is enabled, and @ref{cc,,site} is not imported unless one line in the
file specifies @code{import site}. Blank paths and lines starting with @code{#} are
ignored. Each path may be absolute or relative to the location of the file.
Import statements other than to @code{site} are not permitted, and arbitrary code
cannot be specified.

Note that @code{.pth} files (without leading underscore) will be processed normally
by the @ref{cc,,site} module when @code{import site} has been specified.

@node Embedded Python,,_pth files,The initialization of the sys path module search path
@anchor{library/sys_path_init embedded-python}@anchor{4ba8}
@subsubsection Embedded Python


If Python is embedded within another application @ref{3f6,,Py_InitializeFromConfig()} and
the @ref{3f7,,PyConfig} structure can be used to initialize Python. The path specific
details are described at @ref{aaa,,Python Path Configuration}.


@subsubheading 더 보기



@itemize *

@item 
@ref{e19,,모듈 찾기} for detailed Windows notes.

@item 
@ref{2141,,유닉스 플랫폼에서 파이썬 사용하기} for Unix details.
@end itemize


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 파이썬 언어 서비스,MS 윈도우 특정 서비스,모듈 임포트 하기,파이썬 표준 라이브러리
@anchor{library/language doc}@anchor{4ba9}@anchor{library/language language}@anchor{4baa}@anchor{library/language python-language-services}@anchor{4bab}@anchor{library/language translation-repo}@anchor{4bac}
@section 파이썬 언어 서비스


파이썬은 파이썬 언어로 작업하는 데 도움이 되는 여러 모듈을 제공합니다. 이 모듈들은 토큰화, 구문 분석, 문법 분석, 바이트 코드 역 어셈블리 및 기타 다양한 기능을 지원합니다.

이 모듈들은 다음과 같습니다:

@menu
* ast — Abstract syntax trees:: 
* symtable — 컴파일러 심볼 테이블 액세스:: 
* token — 파이썬 구문 분석 트리에 사용되는 상수:: 
* keyword — 파이썬 키워드 검사:: 
* tokenize — 파이썬 소스를 위한 토크나이저:: 
* tabnanny — 모호한 들여쓰기 감지:: 
* pyclbr — 파이썬 모듈 브라우저 지원:: 
* py_compile — 파이썬 소스 파일 컴파일:: 
* compileall — 파이썬 라이브러리 바이트 컴파일하기:: 
* dis — Disassembler for Python bytecode:: 
* pickletools — 피클 개발자를 위한 도구:: 

@end menu

@node ast — Abstract syntax trees,symtable — 컴파일러 심볼 테이블 액세스,,파이썬 언어 서비스
@anchor{library/ast doc}@anchor{4bad}@anchor{library/ast ast-abstract-syntax-trees}@anchor{4bae}@anchor{library/ast module-ast}@anchor{9}
@subsection @code{ast} — Abstract syntax trees


@geindex module; ast

@c import ast

`소스 코드:' Lib/ast.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/ast.py}


__________________________________________________________________


The @code{ast} module helps Python applications to process trees of the Python
abstract syntax grammar.  The abstract syntax itself might change with each
Python release; this module helps to find out programmatically what the current
grammar looks like.

@ref{4baf,,ast.PyCF_ONLY_AST}를 플래그로 @ref{4b2,,compile()} 내장 함수에 전달하거나, 이 모듈에서 제공된 @ref{1c2,,parse()} 도우미를 사용하여 추상 구문 트리를 생성할 수 있습니다. 결과는 클래스가 모두 @ref{4c5,,ast.AST}에서 상속되는 객체들의 트리가 됩니다. 내장 @code{compile()} 함수를 사용하여 추상 구문 트리를 파이썬 코드 객체로 컴파일할 수 있습니다.

@menu
* Abstract grammar:: 
* 노드 클래스:: 
* ast helpers:: 
* Compiler flags: Compiler flags<2>. 
* Command-line usage: Command-line usage<7>. 

@end menu

@node Abstract grammar,노드 클래스,,ast — Abstract syntax trees
@anchor{library/ast abstract-grammar}@anchor{4bb0}@anchor{library/ast id1}@anchor{4bb1}
@subsubsection Abstract grammar


추상 문법은 현재 다음과 같이 정의됩니다:

@example
-- ASDL's 4 builtin types are:
-- identifier, int, string, constant

module Python
@{
    mod = Module(stmt* body, type_ignore* type_ignores)
        | Interactive(stmt* body)
        | Expression(expr body)
        | FunctionType(expr* argtypes, expr returns)

    stmt = FunctionDef(identifier name, arguments args,
                       stmt* body, expr* decorator_list, expr? returns,
                       string? type_comment, type_param* type_params)
          | AsyncFunctionDef(identifier name, arguments args,
                             stmt* body, expr* decorator_list, expr? returns,
                             string? type_comment, type_param* type_params)

          | ClassDef(identifier name,
             expr* bases,
             keyword* keywords,
             stmt* body,
             expr* decorator_list,
             type_param* type_params)
          | Return(expr? value)

          | Delete(expr* targets)
          | Assign(expr* targets, expr value, string? type_comment)
          | TypeAlias(expr name, type_param* type_params, expr value)
          | AugAssign(expr target, operator op, expr value)
          -- 'simple' indicates that we annotate simple name without parens
          | AnnAssign(expr target, expr annotation, expr? value, int simple)

          -- use 'orelse' because else is a keyword in target languages
          | For(expr target, expr iter, stmt* body, stmt* orelse, string? type_comment)
          | AsyncFor(expr target, expr iter, stmt* body, stmt* orelse, string? type_comment)
          | While(expr test, stmt* body, stmt* orelse)
          | If(expr test, stmt* body, stmt* orelse)
          | With(withitem* items, stmt* body, string? type_comment)
          | AsyncWith(withitem* items, stmt* body, string? type_comment)

          | Match(expr subject, match_case* cases)

          | Raise(expr? exc, expr? cause)
          | Try(stmt* body, excepthandler* handlers, stmt* orelse, stmt* finalbody)
          | TryStar(stmt* body, excepthandler* handlers, stmt* orelse, stmt* finalbody)
          | Assert(expr test, expr? msg)

          | Import(alias* names)
          | ImportFrom(identifier? module, alias* names, int? level)

          | Global(identifier* names)
          | Nonlocal(identifier* names)
          | Expr(expr value)
          | Pass | Break | Continue

          -- col_offset is the byte offset in the utf8 string the parser uses
          attributes (int lineno, int col_offset, int? end_lineno, int? end_col_offset)

          -- BoolOp() can use left & right?
    expr = BoolOp(boolop op, expr* values)
         | NamedExpr(expr target, expr value)
         | BinOp(expr left, operator op, expr right)
         | UnaryOp(unaryop op, expr operand)
         | Lambda(arguments args, expr body)
         | IfExp(expr test, expr body, expr orelse)
         | Dict(expr?* keys, expr* values)
         | Set(expr* elts)
         | ListComp(expr elt, comprehension* generators)
         | SetComp(expr elt, comprehension* generators)
         | DictComp(expr key, expr value, comprehension* generators)
         | GeneratorExp(expr elt, comprehension* generators)
         -- the grammar constrains where yield expressions can occur
         | Await(expr value)
         | Yield(expr? value)
         | YieldFrom(expr value)
         -- need sequences for compare to distinguish between
         -- x < 4 < 3 and (x < 4) < 3
         | Compare(expr left, cmpop* ops, expr* comparators)
         | Call(expr func, expr* args, keyword* keywords)
         | FormattedValue(expr value, int conversion, expr? format_spec)
         | Interpolation(expr value, constant str, int conversion, expr? format_spec)
         | JoinedStr(expr* values)
         | TemplateStr(expr* values)
         | Constant(constant value, string? kind)

         -- the following expression can appear in assignment context
         | Attribute(expr value, identifier attr, expr_context ctx)
         | Subscript(expr value, expr slice, expr_context ctx)
         | Starred(expr value, expr_context ctx)
         | Name(identifier id, expr_context ctx)
         | List(expr* elts, expr_context ctx)
         | Tuple(expr* elts, expr_context ctx)

         -- can appear only in Subscript
         | Slice(expr? lower, expr? upper, expr? step)

          -- col_offset is the byte offset in the utf8 string the parser uses
          attributes (int lineno, int col_offset, int? end_lineno, int? end_col_offset)

    expr_context = Load | Store | Del

    boolop = And | Or

    operator = Add | Sub | Mult | MatMult | Div | Mod | Pow | LShift
                 | RShift | BitOr | BitXor | BitAnd | FloorDiv

    unaryop = Invert | Not | UAdd | USub

    cmpop = Eq | NotEq | Lt | LtE | Gt | GtE | Is | IsNot | In | NotIn

    comprehension = (expr target, expr iter, expr* ifs, int is_async)

    excepthandler = ExceptHandler(expr? type, identifier? name, stmt* body)
                    attributes (int lineno, int col_offset, int? end_lineno, int? end_col_offset)

    arguments = (arg* posonlyargs, arg* args, arg? vararg, arg* kwonlyargs,
                 expr?* kw_defaults, arg? kwarg, expr* defaults)

    arg = (identifier arg, expr? annotation, string? type_comment)
           attributes (int lineno, int col_offset, int? end_lineno, int? end_col_offset)

    -- keyword arguments supplied to call (NULL identifier for **kwargs)
    keyword = (identifier? arg, expr value)
               attributes (int lineno, int col_offset, int? end_lineno, int? end_col_offset)

    -- import name with optional 'as' alias.
    alias = (identifier name, identifier? asname)
             attributes (int lineno, int col_offset, int? end_lineno, int? end_col_offset)

    withitem = (expr context_expr, expr? optional_vars)

    match_case = (pattern pattern, expr? guard, stmt* body)

    pattern = MatchValue(expr value)
            | MatchSingleton(constant value)
            | MatchSequence(pattern* patterns)
            | MatchMapping(expr* keys, pattern* patterns, identifier? rest)
            | MatchClass(expr cls, pattern* patterns, identifier* kwd_attrs, pattern* kwd_patterns)

            | MatchStar(identifier? name)
            -- The optional "rest" MatchMapping parameter handles capturing extra mapping keys

            | MatchAs(pattern? pattern, identifier? name)
            | MatchOr(pattern* patterns)

             attributes (int lineno, int col_offset, int end_lineno, int end_col_offset)

    type_ignore = TypeIgnore(int lineno, string tag)

    type_param = TypeVar(identifier name, expr? bound, expr? default_value)
               | ParamSpec(identifier name, expr? default_value)
               | TypeVarTuple(identifier name, expr? default_value)
               attributes (int lineno, int col_offset, int end_lineno, int end_col_offset)
@}
@end example

@node 노드 클래스,ast helpers,Abstract grammar,ast — Abstract syntax trees
@anchor{library/ast node-classes}@anchor{4bb2}
@subsubsection 노드 클래스


@geindex AST (ast 클래스)
@anchor{library/ast ast AST}@anchor{4c5}
@deffn {클래스} ast.AST

This is the base of all AST node classes.  The actual node classes are
derived from the @code{Parser/Python.asdl} file, which is reproduced
@ref{4bb0,,above}.  They are defined in the @code{_ast} C
module and re-exported in @code{ast}.

추상 문법의 각 좌변 심볼마다 하나의 클래스가 정의되어 있습니다 (예를 들어, @code{ast.stmt}나 @code{ast.expr}). 또한, 우변의 생성자마다 하나의 클래스가 정의되어 있습니다; 이 클래스는 좌변 트리의 클래스에서 상속됩니다. 예를 들어, @ref{1daf,,ast.BinOp}는 @code{ast.expr}에서 상속됩니다. 대안을 갖는 생성 규칙(일명 “합”)의 경우, 좌변 클래스는 추상입니다: 특정 생성자 노드의 인스턴스만 만들어집니다.

@geindex ? (question mark);in AST grammar

@geindex * (asterisk);in AST grammar

@geindex _fields (ast.AST의 속성)
@anchor{library/ast ast AST _fields}@anchor{17dc}
@deffn {속성} _fields

Each concrete class has an attribute @code{_fields} which gives the names
of all child nodes.

구상 클래스의 각 인스턴스에는 각 자식 노드마다 문법에 정의된 형의 어트리뷰트가 하나씩 있습니다. 예를 들어, @ref{1daf,,ast.BinOp} 인스턴스는 @code{ast.expr} 형의 어트리뷰트 @code{left}를 갖습니다.

문법에서 이러한 어트리뷰트가 선택적으로 표시되면 (물음표를 사용해서), 값은 @code{None}일 수 있습니다. 어트리뷰트가 0개 이상의 값을 가질 수 있으면 (애스터리스크로 표시됩니다), 값은 파이썬 리스트로 표현됩니다. @ref{4b2,,compile()}로 AST를 컴파일할 때 가능한 모든 어트리뷰트가 존재하고 유효한 값을 가져야 합니다.
@end deffn

@geindex _field_types (ast.AST의 속성)
@anchor{library/ast ast AST _field_types}@anchor{4c4}
@deffn {속성} _field_types

The @code{_field_types} attribute on each concrete class is a dictionary
mapping field names (as also listed in @ref{17dc,,_fields}) to their types.

@example
>>> ast.TypeVar._field_types
@{'name': <class 'str'>, 'bound': ast.expr | None, 'default_value': ast.expr | None@}
@end example


Added in version 3.13.

@end deffn

@geindex lineno (ast.AST의 속성)
@geindex col_offset (ast.AST의 속성)
@geindex end_lineno (ast.AST의 속성)
@geindex end_col_offset (ast.AST의 속성)
@anchor{library/ast ast AST lineno}@anchor{4bb3}
@deffn {속성} lineno
@anchor{library/ast ast AST col_offset}@anchor{4bb4}
@deffnx {속성} col_offset
@anchor{library/ast ast AST end_lineno}@anchor{4bb5}
@deffnx {속성} end_lineno
@anchor{library/ast ast AST end_col_offset}@anchor{4bb6}
@deffnx {속성} end_col_offset

Instances of @code{ast.expr} and @code{ast.stmt} subclasses have
@ref{4bb3,,lineno}, @ref{4bb4,,col_offset}, @ref{4bb5,,end_lineno}, and
@ref{4bb6,,end_col_offset} attributes.  The @code{lineno} and @code{end_lineno}
are the first and last line numbers of source text span (1-indexed so the
first line is line 1) and the @code{col_offset} and @code{end_col_offset}
are the corresponding UTF-8 byte offsets of the first and last tokens that
generated the node. The UTF-8 offset is recorded because the parser uses
UTF-8 internally.

종료 위치는 컴파일러에 필요하지 않아서 선택 사항입니다. 종료 오프셋은 마지막 심볼 `뒤'입니다. 예를 들어 @code{source_line[node.col_offset : node.end_col_offset]}를 사용하여 한 줄 표현식 노드의 소스 세그먼트를 가져올 수 있습니다.
@end deffn

@code{ast.T} 클래스의 생성자는 다음과 같이 인자를 구문 분석합니다:


@itemize *

@item 
위치 인자가 있으면, @code{T._fields}에 있는 항목 수만큼 있어야 합니다; 이러한 이름의 어트리뷰트로 대입될 것입니다.

@item 
키워드 인자가 있으면, 같은 이름의 어트리뷰트를 지정된 값으로 설정합니다.
@end itemize

예를 들어, @ref{4abd,,ast.UnaryOp} 노드를 만들고 채우려면, 다음과 같이 할 수 있습니다

@example
node = ast.UnaryOp(ast.USub(), ast.Constant(5, lineno=0, col_offset=0),
                   lineno=0, col_offset=0)
@end example

If a field that is optional in the grammar is omitted from the constructor,
it defaults to @code{None}. If a list field is omitted, it defaults to the empty
list. If a field of type @code{ast.expr_context} is omitted, it defaults to
@ref{4c3,,Load()}. If any other field is omitted, a @ref{1a3,,DeprecationWarning} is raised
and the AST node will not have this field. In Python 3.15, this condition will
raise an error.
@end deffn


버전 3.8에서 변경: @ref{2ef,,ast.Constant} 클래스는 이제 모든 상수에 사용됩니다.



버전 3.9에서 변경: 단순 인덱스는 값으로 표현되고, 확장 슬라이스는 튜플로 표현됩니다.



버전 3.13에서 변경: AST node constructors were changed to provide sensible defaults for omitted
fields: optional fields now default to @code{None}, list fields default to an
empty list, and fields of type @code{ast.expr_context} default to
@ref{4c3,,Load()}. Previously, omitted attributes would not exist on constructed
nodes (accessing them raised @ref{5ee,,AttributeError}).



버전 3.14에서 변경: The @ref{82e,,__repr__()} output of @ref{4c5,,AST} nodes includes
the values of the node fields.



Deprecated since version 3.8, removed in version 3.14: Previous versions of Python provided the AST classes @code{ast.Num},
@code{ast.Str}, @code{ast.Bytes}, @code{ast.NameConstant} and
@code{ast.Ellipsis}, which were deprecated in Python 3.8. These classes
were removed in Python 3.14, and their functionality has been replaced with
@ref{2ef,,ast.Constant}.



버전 3.9부터 폐지됨: Old classes @code{ast.Index} and @code{ast.ExtSlice} are still
available, but they will be removed in future Python releases.
In the meantime, instantiating them will return an instance of
a different class.



Deprecated since version 3.13, will be removed in version 3.15: Previous versions of Python allowed the creation of AST nodes that were missing
required fields. Similarly, AST node constructors allowed arbitrary keyword
arguments that were set as attributes of the AST node, even if they did not
match any of the fields of the AST node. This behavior is deprecated and will
be removed in Python 3.15.


@cartouche
@quotation 참고 
여기에 표시된 특정 노드 클래스에 대한 설명은 처음에는 환상적인 Green Tree Snakes@footnote{https://greentreesnakes.readthedocs.io/en/latest/} 프로젝트와 모든 기여자로부터 차용했습니다.
@end quotation
@end cartouche

@menu
* Root nodes:: 
* 리터럴: 리터럴<2>. 
* 변수:: 
* 표현식: 표현식<2>. 
* 문장:: 
* 제어 흐름:: 
* Pattern matching:: 
* Type annotations:: 
* Type parameters:: 
* 함수와 클래스 정의:: 
* Async와 await:: 

@end menu

@node Root nodes,리터럴<2>,,노드 클래스
@anchor{library/ast ast-root-nodes}@anchor{4bb7}@anchor{library/ast root-nodes}@anchor{4bb8}
@subsubsection Root nodes


@geindex Module (ast 클래스)
@anchor{library/ast ast Module}@anchor{4bb9}
@deffn {클래스} ast.Module (body, type_ignores)

A Python module, as with @ref{259e,,file input}.
Node type generated by @ref{1c2,,ast.parse()} in the default @code{"exec"} `mode'.

@code{body} is a @ref{24d,,list} of the module’s @ref{4bba,,문장}.

@code{type_ignores} is a @ref{24d,,list} of the module’s type ignore comments;
see @ref{1c2,,ast.parse()} for more details.

@example
>>> print(ast.dump(ast.parse('x = 1'), indent=4))
Module(
    body=[
        Assign(
            targets=[
                Name(id='x', ctx=Store())],
            value=Constant(value=1))])
@end example
@end deffn

@geindex Expression (ast 클래스)
@anchor{library/ast ast Expression}@anchor{4bbb}
@deffn {클래스} ast.Expression (body)

A single Python @ref{25a4,,expression input}.
Node type generated by @ref{1c2,,ast.parse()} when `mode' is @code{"eval"}.

@code{body} is a single node,
one of the @ref{4bbc,,expression types}.

@example
>>> print(ast.dump(ast.parse('123', mode='eval'), indent=4))
Expression(
    body=Constant(value=123))
@end example
@end deffn

@geindex Interactive (ast 클래스)
@anchor{library/ast ast Interactive}@anchor{187c}
@deffn {클래스} ast.Interactive (body)

A single @ref{25a1,,interactive input}, like in @ref{495,,대화형 모드}.
Node type generated by @ref{1c2,,ast.parse()} when `mode' is @code{"single"}.

@code{body} is a @ref{24d,,list} of @ref{4bba,,statement nodes}.

@example
>>> print(ast.dump(ast.parse('x = 1; y = 2', mode='single'), indent=4))
Interactive(
    body=[
        Assign(
            targets=[
                Name(id='x', ctx=Store())],
            value=Constant(value=1)),
        Assign(
            targets=[
                Name(id='y', ctx=Store())],
            value=Constant(value=2))])
@end example
@end deffn

@geindex FunctionType (ast 클래스)
@anchor{library/ast ast FunctionType}@anchor{4bbd}
@deffn {클래스} ast.FunctionType (argtypes, returns)

A representation of an old-style type comments for functions,
as Python versions prior to 3.5 didn’t support 
@geindex Python 향상 제안; PEP 484
PEP 484@footnote{https://peps.python.org/pep-0484/} annotations.
Node type generated by @ref{1c2,,ast.parse()} when `mode' is @code{"func_type"}.

Such type comments would look like this:

@example
def sum_two_number(a, b):
    # type: (int, int) -> int
    return a + b
@end example

@code{argtypes} is a @ref{24d,,list} of @ref{4bbc,,expression nodes}.

@code{returns} is a single @ref{4bbc,,expression node}.

@example
>>> print(ast.dump(ast.parse('(int, str) -> List[int]', mode='func_type'), indent=4))
FunctionType(
    argtypes=[
        Name(id='int', ctx=Load()),
        Name(id='str', ctx=Load())],
    returns=Subscript(
        value=Name(id='List', ctx=Load()),
        slice=Name(id='int', ctx=Load()),
        ctx=Load()))
@end example


Added in version 3.8.

@end deffn

@node 리터럴<2>,변수,Root nodes,노드 클래스
@anchor{library/ast literals}@anchor{4bbe}
@subsubsection 리터럴


@geindex Constant (ast 클래스)
@anchor{library/ast ast Constant}@anchor{2ef}
@deffn {클래스} ast.Constant (value)

A constant value. The @code{value} attribute of the @code{Constant} literal contains the
Python object it represents. The values represented can be instances of @ref{169,,str},
@ref{192,,bytes}, @ref{19b,,int}, @ref{196,,float}, @ref{197,,complex}, and @ref{3c3,,bool},
and the constants @ref{884,,None} and @ref{2325,,Ellipsis}.

@example
>>> print(ast.dump(ast.parse('123', mode='eval'), indent=4))
Expression(
    body=Constant(value=123))
@end example
@end deffn

@geindex FormattedValue (ast 클래스)
@anchor{library/ast ast FormattedValue}@anchor{4ad5}
@deffn {클래스} ast.FormattedValue (value, conversion, format_spec)

f-문자열에서 단일 포매팅 필드를 나타내는 노드. 문자열에 단일 포매팅 필드가 포함되어 있고 다른 것이 없으면 노드를 분리 할 수 있습니다, 그렇지 않으면 @ref{1a5c,,JoinedStr}에 나타납니다.


@itemize *

@item 
@code{value}는 모든 표현식 노드(가령 리터럴, 변수 또는 함수 호출)입니다.

@item 
@code{conversion}은 정수입니다:


@itemize *

@item 
-1: 포매팅 없음

@item 
97 (@code{ord('a')}): @code{!a} @ref{15eb,,ASCII} formatting

@item 
114 (@code{ord('r')}): @code{!r} @ref{1c1,,repr()} formatting

@item 
115 (@code{ord('s')}): @code{!s} @ref{169,,string} formatting
@end itemize

@item 
@code{format_spec}은 값의 포매팅을 나타내는 @ref{1a5c,,JoinedStr} 노드이거나, 표맷이 지정되지 않았으면 @code{None}입니다. @code{conversion}과 @code{format_spec}을 동시에 설정할 수 있습니다.
@end itemize
@end deffn

@geindex JoinedStr (ast 클래스)
@anchor{library/ast ast JoinedStr}@anchor{1a5c}
@deffn {클래스} ast.JoinedStr (values)

일련의 @ref{4ad5,,FormattedValue}와 @ref{2ef,,Constant} 노드로 구성된 f-문자열.

@example
>>> print(ast.dump(ast.parse('f"sin(@{a@}) is @{sin(a):.3@}"', mode='eval'), indent=4))
Expression(
    body=JoinedStr(
        values=[
            Constant(value='sin('),
            FormattedValue(
                value=Name(id='a', ctx=Load()),
                conversion=-1),
            Constant(value=') is '),
            FormattedValue(
                value=Call(
                    func=Name(id='sin', ctx=Load()),
                    args=[
                        Name(id='a', ctx=Load())]),
                conversion=-1,
                format_spec=JoinedStr(
                    values=[
                        Constant(value='.3')]))]))
@end example
@end deffn

@geindex TemplateStr (ast 클래스)
@anchor{library/ast ast TemplateStr}@anchor{4bbf}
@deffn {클래스} ast.TemplateStr (values, /)


Added in version 3.14.


Node representing a template string literal, comprising a series of
@ref{17bb,,Interpolation} and @ref{2ef,,Constant} nodes.
These nodes may be any order, and do not need to be interleaved.

@example
>>> expr = ast.parse('t"@{name@} finished @{place:ordinal@}"', mode='eval')
>>> print(ast.dump(expr, indent=4))
Expression(
    body=TemplateStr(
        values=[
            Interpolation(
                value=Name(id='name', ctx=Load()),
                str='name',
                conversion=-1),
            Constant(value=' finished '),
            Interpolation(
                value=Name(id='place', ctx=Load()),
                str='place',
                conversion=-1,
                format_spec=JoinedStr(
                    values=[
                        Constant(value='ordinal')]))]))
@end example
@end deffn

@geindex Interpolation (ast 클래스)
@anchor{library/ast ast Interpolation}@anchor{17bb}
@deffn {클래스} ast.Interpolation (value, str, conversion, format_spec=None)


Added in version 3.14.


Node representing a single interpolation field in a template string literal.


@itemize *

@item 
@code{value} is any expression node (such as a literal, a variable, or a
function call).
This has the same meaning as @code{FormattedValue.value}.

@item 
@code{str} is a constant containing the text of the interpolation expression.

If @code{str} is set to @code{None}, then @code{value} is used to generate code
when calling @ref{ae2,,ast.unparse()}. This no longer guarantees that the
generated code is identical to the original and is intended for code
generation.

@item 
@code{conversion}은 정수입니다:


@itemize *

@item 
-1: no conversion

@item 
97 (@code{ord('a')}): @code{!a} @ref{15eb,,ASCII} conversion

@item 
114 (@code{ord('r')}): @code{!r} @ref{1c1,,repr()} conversion

@item 
115 (@code{ord('s')}): @code{!s} @ref{169,,string} conversion
@end itemize

This has the same meaning as @code{FormattedValue.conversion}.

@item 
@code{format_spec} is a @ref{1a5c,,JoinedStr} node representing the formatting
of the value, or @code{None} if no format was specified. Both
@code{conversion} and @code{format_spec} can be set at the same time.
This has the same meaning as @code{FormattedValue.format_spec}.
@end itemize
@end deffn

@geindex List (ast 클래스)
@geindex Tuple (ast 클래스)
@anchor{library/ast ast List}@anchor{4ad2}
@deffn {클래스} ast.List (elts, ctx)
@anchor{library/ast ast Tuple}@anchor{4ad3}
@deffnx {클래스} ast.Tuple (elts, ctx)

리스트나 튜플. @code{elts}는 요소를 나타내는 노드의 리스트를 보유합니다. @code{ctx}는 컨테이너가 대입 대상이면 (가령 @code{(x,y)=something}) @ref{4bc0,,Store}이고, 그렇지 않으면 @ref{4c3,,Load}입니다.

@example
>>> print(ast.dump(ast.parse('[1, 2, 3]', mode='eval'), indent=4))
Expression(
    body=List(
        elts=[
            Constant(value=1),
            Constant(value=2),
            Constant(value=3)],
        ctx=Load()))
>>> print(ast.dump(ast.parse('(1, 2, 3)', mode='eval'), indent=4))
Expression(
    body=Tuple(
        elts=[
            Constant(value=1),
            Constant(value=2),
            Constant(value=3)],
        ctx=Load()))
@end example
@end deffn

@geindex Set (ast 클래스)
@anchor{library/ast ast Set}@anchor{4ac2}
@deffn {클래스} ast.Set (elts)

집합. @code{elts}는 집합의 요소를 나타내는 노드의 리스트를 보유합니다.

@example
>>> print(ast.dump(ast.parse('@{1, 2, 3@}', mode='eval'), indent=4))
Expression(
    body=Set(
        elts=[
            Constant(value=1),
            Constant(value=2),
            Constant(value=3)]))
@end example
@end deffn

@geindex Dict (ast 클래스)
@anchor{library/ast ast Dict}@anchor{1d46}
@deffn {클래스} ast.Dict (keys, values)

딕셔너리. @code{keys}와 @code{values}는 각각 키와 값을 나타내는 노드의 리스트를 일치하는 순서대로 (@code{dictionary.keys()}와 @code{dictionary.values()}를 호출할 때 반환되는 순서) 보유합니다.

딕셔너리 리터럴을 사용하여 딕셔너리 언 패킹을 수행할 때 확장될 표현식은 @code{values} 리스트로 가고, @code{keys}의 해당 위치에는 @code{None}이 갑니다.

@example
>>> print(ast.dump(ast.parse('@{"a":1, **d@}', mode='eval'), indent=4))
Expression(
    body=Dict(
        keys=[
            Constant(value='a'),
            None],
        values=[
            Constant(value=1),
            Name(id='d', ctx=Load())]))
@end example
@end deffn

@node 변수,표현식<2>,리터럴<2>,노드 클래스
@anchor{library/ast variables}@anchor{4bc1}
@subsubsection 변수


@geindex Name (ast 클래스)
@anchor{library/ast ast Name}@anchor{1d1f}
@deffn {클래스} ast.Name (id, ctx)

변수 이름. @code{id}는 이름을 문자열로 보유하며, @code{ctx}는 다음 형 중 하나입니다.
@end deffn

@geindex Load (ast 클래스)
@geindex Store (ast 클래스)
@geindex Del (ast 클래스)
@anchor{library/ast ast Load}@anchor{4c3}
@deffn {클래스} ast.Load
@anchor{library/ast ast Store}@anchor{4bc0}
@deffnx {클래스} ast.Store
@anchor{library/ast ast Del}@anchor{4bc2}
@deffnx {클래스} ast.Del

변수 참조는 변숫값을 로드하거나, 그것에 새 값을 대입하거나, 그것을 삭제하는데 사용될 수 있습니다. 변수 참조에는 이러한 경우를 구별하기 위한 컨텍스트가 제공됩니다.

@example
>>> print(ast.dump(ast.parse('a'), indent=4))
Module(
    body=[
        Expr(
            value=Name(id='a', ctx=Load()))])

>>> print(ast.dump(ast.parse('a = 1'), indent=4))
Module(
    body=[
        Assign(
            targets=[
                Name(id='a', ctx=Store())],
            value=Constant(value=1))])

>>> print(ast.dump(ast.parse('del a'), indent=4))
Module(
    body=[
        Delete(
            targets=[
                Name(id='a', ctx=Del())])])
@end example
@end deffn

@geindex Starred (ast 클래스)
@anchor{library/ast ast Starred}@anchor{4ad1}
@deffn {클래스} ast.Starred (value, ctx)

@code{*var} 변수 참조. @code{value}는 변수(일반적으로 @ref{1d1f,,Name} 노드)를 보유합니다. 이 형은 @code{*args}로 @ref{4ace,,Call} 노드를 빌드할 때 사용해야 합니다.

@example
>>> print(ast.dump(ast.parse('a, *b = it'), indent=4))
Module(
    body=[
        Assign(
            targets=[
                Tuple(
                    elts=[
                        Name(id='a', ctx=Store()),
                        Starred(
                            value=Name(id='b', ctx=Store()),
                            ctx=Store())],
                    ctx=Store())],
            value=Name(id='it', ctx=Load()))])
@end example
@end deffn

@node 표현식<2>,문장,변수,노드 클래스
@anchor{library/ast ast-expressions}@anchor{4bbc}@anchor{library/ast expressions}@anchor{4bc3}
@subsubsection 표현식


@geindex Expr (ast 클래스)
@anchor{library/ast ast Expr}@anchor{4bc4}
@deffn {클래스} ast.Expr (value)

표현식(가령 함수 호출)이 반환 값이 사용되거나 저장되지 않은 자신만의 문장으로 나타나면, 이 컨테이너에 래핑 됩니다. @code{value}는 이 섹션의 다른 노드인 @ref{2ef,,Constant}, @ref{1d1f,,Name}, @ref{4ad8,,Lambda}, @ref{4adf,,Yield} 또는 @ref{4ae0,,YieldFrom} 노드 중 하나를 보유합니다.

@example
>>> print(ast.dump(ast.parse('-a'), indent=4))
Module(
    body=[
        Expr(
            value=UnaryOp(
                op=USub(),
                operand=Name(id='a', ctx=Load())))])
@end example
@end deffn

@geindex UnaryOp (ast 클래스)
@anchor{library/ast ast UnaryOp}@anchor{4abd}
@deffn {클래스} ast.UnaryOp (op, operand)

단항 연산. @code{op}는 연산자이고, @code{operand}는 임의의 표현식 노드입니다.
@end deffn

@geindex UAdd (ast 클래스)
@geindex USub (ast 클래스)
@geindex Not (ast 클래스)
@geindex Invert (ast 클래스)
@anchor{library/ast ast UAdd}@anchor{4abf}
@deffn {클래스} ast.UAdd
@anchor{library/ast ast USub}@anchor{4ac0}
@deffnx {클래스} ast.USub
@anchor{library/ast ast Not}@anchor{4ac1}
@deffnx {클래스} ast.Not
@anchor{library/ast ast Invert}@anchor{4abe}
@deffnx {클래스} ast.Invert

단항 연산자 토큰. @ref{4ac1,,Not}은 @code{not} 키워드이고, @ref{4abe,,Invert}는 @code{~} 연산자입니다.

@example
>>> print(ast.dump(ast.parse('not x', mode='eval'), indent=4))
Expression(
    body=UnaryOp(
        op=Not(),
        operand=Name(id='x', ctx=Load())))
@end example
@end deffn

@geindex BinOp (ast 클래스)
@anchor{library/ast ast BinOp}@anchor{1daf}
@deffn {클래스} ast.BinOp (left, op, right)

이항 연산 (더하기나 나누기 같은). @code{op}는 연산자이고, @code{left}와 @code{right}는 임의의 표현식 노드입니다.

@example
>>> print(ast.dump(ast.parse('x + y', mode='eval'), indent=4))
Expression(
    body=BinOp(
        left=Name(id='x', ctx=Load()),
        op=Add(),
        right=Name(id='y', ctx=Load())))
@end example
@end deffn

@geindex Add (ast 클래스)
@geindex Sub (ast 클래스)
@geindex Mult (ast 클래스)
@geindex Div (ast 클래스)
@geindex FloorDiv (ast 클래스)
@geindex Mod (ast 클래스)
@geindex Pow (ast 클래스)
@geindex LShift (ast 클래스)
@geindex RShift (ast 클래스)
@geindex BitOr (ast 클래스)
@geindex BitXor (ast 클래스)
@geindex BitAnd (ast 클래스)
@geindex MatMult (ast 클래스)
@anchor{library/ast ast Add}@anchor{4bc5}
@deffn {클래스} ast.Add
@anchor{library/ast ast Sub}@anchor{4bc6}
@deffnx {클래스} ast.Sub
@anchor{library/ast ast Mult}@anchor{4bc7}
@deffnx {클래스} ast.Mult
@anchor{library/ast ast Div}@anchor{4bc8}
@deffnx {클래스} ast.Div
@anchor{library/ast ast FloorDiv}@anchor{4bc9}
@deffnx {클래스} ast.FloorDiv
@anchor{library/ast ast Mod}@anchor{4bca}
@deffnx {클래스} ast.Mod
@anchor{library/ast ast Pow}@anchor{4bcb}
@deffnx {클래스} ast.Pow
@anchor{library/ast ast LShift}@anchor{4bcc}
@deffnx {클래스} ast.LShift
@anchor{library/ast ast RShift}@anchor{4bcd}
@deffnx {클래스} ast.RShift
@anchor{library/ast ast BitOr}@anchor{4bce}
@deffnx {클래스} ast.BitOr
@anchor{library/ast ast BitXor}@anchor{4bcf}
@deffnx {클래스} ast.BitXor
@anchor{library/ast ast BitAnd}@anchor{4bd0}
@deffnx {클래스} ast.BitAnd
@anchor{library/ast ast MatMult}@anchor{4bd1}
@deffnx {클래스} ast.MatMult

이항 연산자 토큰.
@end deffn

@geindex BoolOp (ast 클래스)
@anchor{library/ast ast BoolOp}@anchor{4ad6}
@deffn {클래스} ast.BoolOp (op, values)

불리언 연산, ‘or’ 나 ‘and’. @code{op}는 @ref{4bd2,,Or}나 @ref{4bd3,,And}입니다. @code{values}는 관련된 값입니다. 같은 연산자를 사용하는 연속 연산(가령 @code{a or b or c})은 여러 값을 가진 하나의 노드로 축소됩니다.

여기에는 @ref{4abd,,UnaryOp}인 @code{not}이 포함되지 않습니다.

@example
>>> print(ast.dump(ast.parse('x or y', mode='eval'), indent=4))
Expression(
    body=BoolOp(
        op=Or(),
        values=[
            Name(id='x', ctx=Load()),
            Name(id='y', ctx=Load())]))
@end example
@end deffn

@geindex And (ast 클래스)
@geindex Or (ast 클래스)
@anchor{library/ast ast And}@anchor{4bd3}
@deffn {클래스} ast.And
@anchor{library/ast ast Or}@anchor{4bd2}
@deffnx {클래스} ast.Or

불리언 연산자 토큰.
@end deffn

@geindex Compare (ast 클래스)
@anchor{library/ast ast Compare}@anchor{4ac3}
@deffn {클래스} ast.Compare (left, ops, comparators)

둘 이상의 값의 비교. @code{left}는 비교의 첫 번째 값이고, @code{ops}는 연산자의 리스트이며, @code{comparators}는 비교의 첫 번째 요소 다음의 값 리스트입니다.

@example
>>> print(ast.dump(ast.parse('1 <= a < 10', mode='eval'), indent=4))
Expression(
    body=Compare(
        left=Constant(value=1),
        ops=[
            LtE(),
            Lt()],
        comparators=[
            Name(id='a', ctx=Load()),
            Constant(value=10)]))
@end example
@end deffn

@geindex Eq (ast 클래스)
@geindex NotEq (ast 클래스)
@geindex Lt (ast 클래스)
@geindex LtE (ast 클래스)
@geindex Gt (ast 클래스)
@geindex GtE (ast 클래스)
@geindex Is (ast 클래스)
@geindex IsNot (ast 클래스)
@geindex In (ast 클래스)
@geindex NotIn (ast 클래스)
@anchor{library/ast ast Eq}@anchor{4ac4}
@deffn {클래스} ast.Eq
@anchor{library/ast ast NotEq}@anchor{4ac5}
@deffnx {클래스} ast.NotEq
@anchor{library/ast ast Lt}@anchor{4ac6}
@deffnx {클래스} ast.Lt
@anchor{library/ast ast LtE}@anchor{4ac7}
@deffnx {클래스} ast.LtE
@anchor{library/ast ast Gt}@anchor{4ac8}
@deffnx {클래스} ast.Gt
@anchor{library/ast ast GtE}@anchor{4ac9}
@deffnx {클래스} ast.GtE
@anchor{library/ast ast Is}@anchor{4aca}
@deffnx {클래스} ast.Is
@anchor{library/ast ast IsNot}@anchor{4acb}
@deffnx {클래스} ast.IsNot
@anchor{library/ast ast In}@anchor{4acc}
@deffnx {클래스} ast.In
@anchor{library/ast ast NotIn}@anchor{4acd}
@deffnx {클래스} ast.NotIn

비교 연산자 토큰.
@end deffn

@geindex Call (ast 클래스)
@anchor{library/ast ast Call}@anchor{4ace}
@deffn {클래스} ast.Call (func, args, keywords)

함수 호출. @code{func}는 함수이며, 종종 @ref{1d1f,,Name}이나 @ref{4acf,,Attribute} 객체입니다. 인자 중:


@itemize *

@item 
@code{args}는 위치로 전달된 인자의 리스트를 보유합니다.

@item 
@code{keywords} holds a list of @ref{4bd4,,keyword} objects representing
arguments passed by keyword.
@end itemize

The @code{args} and @code{keywords} arguments are optional and default to empty lists.

@example
>>> print(ast.dump(ast.parse('func(a, b=c, *d, **e)', mode='eval'), indent=4))
Expression(
    body=Call(
        func=Name(id='func', ctx=Load()),
        args=[
            Name(id='a', ctx=Load()),
            Starred(
                value=Name(id='d', ctx=Load()),
                ctx=Load())],
        keywords=[
            keyword(
                arg='b',
                value=Name(id='c', ctx=Load())),
            keyword(
                value=Name(id='e', ctx=Load()))]))
@end example
@end deffn

@geindex keyword (ast 클래스)
@anchor{library/ast ast keyword}@anchor{4bd4}
@deffn {클래스} ast.keyword (arg, value)

함수 호출이나 클래스 정의에 대한 키워드 인자. @code{arg}는 매개 변수 이름의 원시 문자열이고, @code{value}는 전달할 노드입니다.
@end deffn

@geindex IfExp (ast 클래스)
@anchor{library/ast ast IfExp}@anchor{4ad7}
@deffn {클래스} ast.IfExp (test, body, orelse)

@code{a if b else c}와 같은 표현식. 각 필드는 단일 노드를 보유해서, 다음 예에서, 세 개 모두 @ref{1d1f,,Name} 노드입니다.

@example
>>> print(ast.dump(ast.parse('a if b else c', mode='eval'), indent=4))
Expression(
    body=IfExp(
        test=Name(id='b', ctx=Load()),
        body=Name(id='a', ctx=Load()),
        orelse=Name(id='c', ctx=Load())))
@end example
@end deffn

@geindex Attribute (ast 클래스)
@anchor{library/ast ast Attribute}@anchor{4acf}
@deffn {클래스} ast.Attribute (value, attr, ctx)

어트리뷰트 액세스, 예를 들어 @code{d.keys}. @code{value}는 노드(보통 @ref{1d1f,,Name})입니다. @code{attr}은 어트리뷰트의 이름을 제공하는 문자열이며, @code{ctx}는 어트리뷰트에 적용되는 방식에 따라 @ref{4c3,,Load}, @ref{4bc0,,Store} 또는 @ref{4bc2,,Del}입니다.

@example
>>> print(ast.dump(ast.parse('snake.colour', mode='eval'), indent=4))
Expression(
    body=Attribute(
        value=Name(id='snake', ctx=Load()),
        attr='colour',
        ctx=Load()))
@end example
@end deffn

@geindex NamedExpr (ast 클래스)
@anchor{library/ast ast NamedExpr}@anchor{4add}
@deffn {클래스} ast.NamedExpr (target, value)

명명된 표현식. 이 AST 노드는 대입 표현식 연산자(바다코끼리(walrus) 연산자라고도 합니다)에 의해 생성됩니다. 첫 번째 인자가 여러 노드일 수 있는 @ref{4bd5,,Assign} 노드와 달리, 이 경우에는 @code{target}과 @code{value}는 모두 단일 노드여야 합니다.

@example
>>> print(ast.dump(ast.parse('(x := 4)', mode='eval'), indent=4))
Expression(
    body=NamedExpr(
        target=Name(id='x', ctx=Store()),
        value=Constant(value=4)))
@end example


Added in version 3.8.

@end deffn

@menu
* 서브스크립팅:: 
* 컴프리헨션:: 

@end menu

@node 서브스크립팅,컴프리헨션,,표현식<2>
@anchor{library/ast subscripting}@anchor{4bd6}
@subsubsection 서브스크립팅


@geindex Subscript (ast 클래스)
@anchor{library/ast ast Subscript}@anchor{4ad0}
@deffn {클래스} ast.Subscript (value, slice, ctx)

서브스크립트, 가령 @code{l[1]}. @code{value}는 서브스크립트되는 객체입니다 (보통 시퀀스나 매핑). @code{slice}는 인덱스, 슬라이스 또는 키입니다. @ref{4ad3,,Tuple}일 수 있으며 @ref{4ad4,,Slice}를 포함합니다. @code{ctx}는 서브스크립트로 수행되는 동작에 따라 @ref{4c3,,Load}, @ref{4bc0,,Store} 또는 @ref{4bc2,,Del}입니다.

@example
>>> print(ast.dump(ast.parse('l[1:2, 3]', mode='eval'), indent=4))
Expression(
    body=Subscript(
        value=Name(id='l', ctx=Load()),
        slice=Tuple(
            elts=[
                Slice(
                    lower=Constant(value=1),
                    upper=Constant(value=2)),
                Constant(value=3)],
            ctx=Load()),
        ctx=Load()))
@end example
@end deffn

@geindex Slice (ast 클래스)
@anchor{library/ast ast Slice}@anchor{4ad4}
@deffn {클래스} ast.Slice (lower, upper, step)

일반 슬라이싱 (@code{lower:upper}나 @code{lower:upper:step} 형식). @ref{4ad0,,Subscript}의 `slice' 필드 내에서만 직접 또는 @ref{4ad3,,Tuple}의 요소로 등장할 수 있습니다.

@example
>>> print(ast.dump(ast.parse('l[1:2]', mode='eval'), indent=4))
Expression(
    body=Subscript(
        value=Name(id='l', ctx=Load()),
        slice=Slice(
            lower=Constant(value=1),
            upper=Constant(value=2)),
        ctx=Load()))
@end example
@end deffn

@node 컴프리헨션,,서브스크립팅,표현식<2>
@anchor{library/ast comprehensions}@anchor{4bd7}
@subsubsection 컴프리헨션


@geindex ListComp (ast 클래스)
@geindex SetComp (ast 클래스)
@geindex GeneratorExp (ast 클래스)
@geindex DictComp (ast 클래스)
@anchor{library/ast ast ListComp}@anchor{4ad9}
@deffn {클래스} ast.ListComp (elt, generators)
@anchor{library/ast ast SetComp}@anchor{4ada}
@deffnx {클래스} ast.SetComp (elt, generators)
@anchor{library/ast ast GeneratorExp}@anchor{4adc}
@deffnx {클래스} ast.GeneratorExp (elt, generators)
@anchor{library/ast ast DictComp}@anchor{4adb}
@deffnx {클래스} ast.DictComp (key, value, generators)

리스트와 집합 컴프리헨션, 제너레이터 표현식 및 딕셔너리 컴프리헨션. @code{elt}(또는 @code{key}와 @code{value})는 항목마다 평가될 부분을 나타내는 단일 노드입니다.

@code{generators}는 @ref{4bd8,,comprehension} 노드의 리스트입니다.

@example
>>> print(ast.dump(
...     ast.parse('[x for x in numbers]', mode='eval'),
...     indent=4,
... ))
Expression(
    body=ListComp(
        elt=Name(id='x', ctx=Load()),
        generators=[
            comprehension(
                target=Name(id='x', ctx=Store()),
                iter=Name(id='numbers', ctx=Load()),
                is_async=0)]))
>>> print(ast.dump(
...     ast.parse('@{x: x**2 for x in numbers@}', mode='eval'),
...     indent=4,
... ))
Expression(
    body=DictComp(
        key=Name(id='x', ctx=Load()),
        value=BinOp(
            left=Name(id='x', ctx=Load()),
            op=Pow(),
            right=Constant(value=2)),
        generators=[
            comprehension(
                target=Name(id='x', ctx=Store()),
                iter=Name(id='numbers', ctx=Load()),
                is_async=0)]))
>>> print(ast.dump(
...     ast.parse('@{x for x in numbers@}', mode='eval'),
...     indent=4,
... ))
Expression(
    body=SetComp(
        elt=Name(id='x', ctx=Load()),
        generators=[
            comprehension(
                target=Name(id='x', ctx=Store()),
                iter=Name(id='numbers', ctx=Load()),
                is_async=0)]))
@end example
@end deffn

@geindex comprehension (ast 클래스)
@anchor{library/ast ast comprehension}@anchor{4bd8}
@deffn {클래스} ast.comprehension (target, iter, ifs, is_async)

컴프리헨션에서 하나의 @code{for} 절. @code{target}은 각 요소(보통 @ref{1d1f,,Name}이나 @ref{4ad3,,Tuple} 노드)에 사용할 참조입니다. @code{iter}는 이터레이트 할 객체입니다. @code{ifs}는 테스트 표현식의 리스트입니다: 각 @code{for} 절은 여러 @code{ifs}를 가질 수 있습니다.

@code{is_async}는 컴프리헨션이 비동기임을 나타냅니다 (@code{for} 대신 @code{async for}를 사용합니다). 값은 정수(0이나 1)입니다.

@example
>>> print(ast.dump(ast.parse('[ord(c) for line in file for c in line]', mode='eval'),
...                indent=4)) # Multiple comprehensions in one.
Expression(
    body=ListComp(
        elt=Call(
            func=Name(id='ord', ctx=Load()),
            args=[
                Name(id='c', ctx=Load())]),
        generators=[
            comprehension(
                target=Name(id='line', ctx=Store()),
                iter=Name(id='file', ctx=Load()),
                is_async=0),
            comprehension(
                target=Name(id='c', ctx=Store()),
                iter=Name(id='line', ctx=Load()),
                is_async=0)]))

>>> print(ast.dump(ast.parse('(n**2 for n in it if n>5 if n<10)', mode='eval'),
...                indent=4)) # generator comprehension
Expression(
    body=GeneratorExp(
        elt=BinOp(
            left=Name(id='n', ctx=Load()),
            op=Pow(),
            right=Constant(value=2)),
        generators=[
            comprehension(
                target=Name(id='n', ctx=Store()),
                iter=Name(id='it', ctx=Load()),
                ifs=[
                    Compare(
                        left=Name(id='n', ctx=Load()),
                        ops=[
                            Gt()],
                        comparators=[
                            Constant(value=5)]),
                    Compare(
                        left=Name(id='n', ctx=Load()),
                        ops=[
                            Lt()],
                        comparators=[
                            Constant(value=10)])],
                is_async=0)]))

>>> print(ast.dump(ast.parse('[i async for i in soc]', mode='eval'),
...                indent=4)) # Async comprehension
Expression(
    body=ListComp(
        elt=Name(id='i', ctx=Load()),
        generators=[
            comprehension(
                target=Name(id='i', ctx=Store()),
                iter=Name(id='soc', ctx=Load()),
                is_async=1)]))
@end example
@end deffn

@node 문장,제어 흐름,표현식<2>,노드 클래스
@anchor{library/ast ast-statements}@anchor{4bba}@anchor{library/ast statements}@anchor{4bd9}
@subsubsection 문장


@geindex Assign (ast 클래스)
@anchor{library/ast ast Assign}@anchor{4bd5}
@deffn {클래스} ast.Assign (targets, value, type_comment)

대입. @code{targets}는 노드의 리스트이고, @code{value}는 단일 노드입니다.

@code{targets}의 여러 노드는 각각 같은 값을 할당하는 것을 나타냅니다. 언 패킹은 @code{targets} 내에 @ref{4ad3,,Tuple}이나 @ref{4ad2,,List}를 넣어 표현됩니다.

@geindex type_comment (ast.Assign의 속성)
@anchor{library/ast ast Assign type_comment}@anchor{4bda}
@deffn {속성} type_comment

@code{type_comment}는 형 어노테이션이 주석으로 포함된 선택적 문자열입니다.
@end deffn

@example
>>> print(ast.dump(ast.parse('a = b = 1'), indent=4)) # Multiple assignment
Module(
    body=[
        Assign(
            targets=[
                Name(id='a', ctx=Store()),
                Name(id='b', ctx=Store())],
            value=Constant(value=1))])

>>> print(ast.dump(ast.parse('a,b = c'), indent=4)) # Unpacking
Module(
    body=[
        Assign(
            targets=[
                Tuple(
                    elts=[
                        Name(id='a', ctx=Store()),
                        Name(id='b', ctx=Store())],
                    ctx=Store())],
            value=Name(id='c', ctx=Load()))])
@end example
@end deffn

@geindex AnnAssign (ast 클래스)
@anchor{library/ast ast AnnAssign}@anchor{4bdb}
@deffn {클래스} ast.AnnAssign (target, annotation, value, simple)

An assignment with a type annotation. @code{target} is a single node and can
be a @ref{1d1f,,Name}, an @ref{4acf,,Attribute} or a @ref{4ad0,,Subscript}.
@code{annotation} is the annotation, such as a @ref{2ef,,Constant} or @code{Name}
node. @code{value} is a single optional node.

@code{simple} is always either 0 (indicating a “complex” target) or 1
(indicating a “simple” target). A “simple” target consists solely of a
@ref{1d1f,,Name} node that does not appear between parentheses; all other
targets are considered complex. Only simple targets appear in
the @ref{458,,__annotations__} dictionary of modules and classes.

@example
>>> print(ast.dump(ast.parse('c: int'), indent=4))
Module(
    body=[
        AnnAssign(
            target=Name(id='c', ctx=Store()),
            annotation=Name(id='int', ctx=Load()),
            simple=1)])

>>> print(ast.dump(ast.parse('(a): int = 1'), indent=4)) # Annotation with parenthesis
Module(
    body=[
        AnnAssign(
            target=Name(id='a', ctx=Store()),
            annotation=Name(id='int', ctx=Load()),
            value=Constant(value=1),
            simple=0)])

>>> print(ast.dump(ast.parse('a.b: int'), indent=4)) # Attribute annotation
Module(
    body=[
        AnnAssign(
            target=Attribute(
                value=Name(id='a', ctx=Load()),
                attr='b',
                ctx=Store()),
            annotation=Name(id='int', ctx=Load()),
            simple=0)])

>>> print(ast.dump(ast.parse('a[1]: int'), indent=4)) # Subscript annotation
Module(
    body=[
        AnnAssign(
            target=Subscript(
                value=Name(id='a', ctx=Load()),
                slice=Constant(value=1),
                ctx=Store()),
            annotation=Name(id='int', ctx=Load()),
            simple=0)])
@end example
@end deffn

@geindex AugAssign (ast 클래스)
@anchor{library/ast ast AugAssign}@anchor{4bdc}
@deffn {클래스} ast.AugAssign (target, op, value)

증분 대입, 가령 @code{a += 1}. 다음 예에서, @code{target}은 @code{x}(@ref{4bc0,,Store} 컨텍스트로)를 위한 @ref{1d1f,,Name} 노드이고, @code{op}는 @ref{4bc5,,Add}이며, @code{value}는 값이 1인 @ref{2ef,,Constant}입니다.

The @code{target} attribute cannot be of class @ref{4ad3,,Tuple} or @ref{4ad2,,List},
unlike the targets of @ref{4bd5,,Assign}.

@example
>>> print(ast.dump(ast.parse('x += 2'), indent=4))
Module(
    body=[
        AugAssign(
            target=Name(id='x', ctx=Store()),
            op=Add(),
            value=Constant(value=2))])
@end example
@end deffn

@geindex Raise (ast 클래스)
@anchor{library/ast ast Raise}@anchor{4bdd}
@deffn {클래스} ast.Raise (exc, cause)

@code{raise} 문. @code{exc}는 발생시킬 예외 객체로 일반적으로 @ref{4ace,,Call}이나 @ref{1d1f,,Name}이거나, 독립 @code{raise}의 경우 @code{None}입니다. @code{cause}는 @code{raise x from y}에서 @code{y}에 해당하는 선택적 부분입니다.

@example
>>> print(ast.dump(ast.parse('raise x from y'), indent=4))
Module(
    body=[
        Raise(
            exc=Name(id='x', ctx=Load()),
            cause=Name(id='y', ctx=Load()))])
@end example
@end deffn

@geindex Assert (ast 클래스)
@anchor{library/ast ast Assert}@anchor{4bde}
@deffn {클래스} ast.Assert (test, msg)

어서션. @code{test}는 (@ref{4ac3,,Compare} 노드와 같은) 조건을 보유합니다. @code{msg}는 실패 메시지를 보유합니다.

@example
>>> print(ast.dump(ast.parse('assert x,y'), indent=4))
Module(
    body=[
        Assert(
            test=Name(id='x', ctx=Load()),
            msg=Name(id='y', ctx=Load()))])
@end example
@end deffn

@geindex Delete (ast 클래스)
@anchor{library/ast ast Delete}@anchor{4bdf}
@deffn {클래스} ast.Delete (targets)

@code{del} 문을 나타냅니다. @code{targets}는 @ref{1d1f,,Name}, @ref{4acf,,Attribute} 또는 @ref{4ad0,,Subscript} 같은 노드들의 리스트입니다.

@example
>>> print(ast.dump(ast.parse('del x,y,z'), indent=4))
Module(
    body=[
        Delete(
            targets=[
                Name(id='x', ctx=Del()),
                Name(id='y', ctx=Del()),
                Name(id='z', ctx=Del())])])
@end example
@end deffn

@geindex Pass (ast 클래스)
@anchor{library/ast ast Pass}@anchor{4be0}
@deffn {클래스} ast.Pass

@code{pass} 문.

@example
>>> print(ast.dump(ast.parse('pass'), indent=4))
Module(
    body=[
        Pass()])
@end example
@end deffn

@geindex TypeAlias (ast 클래스)
@anchor{library/ast ast TypeAlias}@anchor{1a55}
@deffn {클래스} ast.TypeAlias (name, type_params, value)

A @ref{682,,type alias} created through the @ref{66b,,type}
statement. @code{name} is the name of the alias, @code{type_params} is a list of
@ref{4be1,,type parameters}, and @code{value} is the value of the
type alias.

@example
>>> print(ast.dump(ast.parse('type Alias = int'), indent=4))
Module(
    body=[
        TypeAlias(
            name=Name(id='Alias', ctx=Store()),
            value=Name(id='int', ctx=Load()))])
@end example


Added in version 3.12.

@end deffn

함수나 루프 내부에만 적용할 수 있는 다른 문장들은 다른 섹션에 설명되어 있습니다.

@menu
* 임포트:: 

@end menu

@node 임포트,,,문장
@anchor{library/ast imports}@anchor{4be2}
@subsubsection 임포트


@geindex Import (ast 클래스)
@anchor{library/ast ast Import}@anchor{4be3}
@deffn {클래스} ast.Import (names)

import 문. @code{names}는 @ref{1c72,,alias} 노드의 리스트입니다.

@example
>>> print(ast.dump(ast.parse('import x,y,z'), indent=4))
Module(
    body=[
        Import(
            names=[
                alias(name='x'),
                alias(name='y'),
                alias(name='z')])])
@end example
@end deffn

@geindex ImportFrom (ast 클래스)
@anchor{library/ast ast ImportFrom}@anchor{4be4}
@deffn {클래스} ast.ImportFrom (module, names, level)

@code{from x import y}를 나타냅니다. @code{module}은  선행 점이 없는 ‘from’ 이름의 원시 문자열이며, @code{from . import foo}와 같은 문장의 경우 @code{None}입니다. @code{level}은 상대 임포트 수준을 보유하는 정수입니다 (0은 절대 임포트를 의미합니다).

@example
>>> print(ast.dump(ast.parse('from y import x,y,z'), indent=4))
Module(
    body=[
        ImportFrom(
            module='y',
            names=[
                alias(name='x'),
                alias(name='y'),
                alias(name='z')],
            level=0)])
@end example
@end deffn

@geindex alias (ast 클래스)
@anchor{library/ast ast alias}@anchor{1c72}
@deffn {클래스} ast.alias (name, asname)

두 매개 변수 모두 이름의 원시 문자열입니다. 정규 이름을 사용하면 @code{asname}은 @code{None}이 될 수 있습니다.

@example
>>> print(ast.dump(ast.parse('from ..foo.bar import a as b, c'), indent=4))
Module(
    body=[
        ImportFrom(
            module='foo.bar',
            names=[
                alias(name='a', asname='b'),
                alias(name='c')],
            level=2)])
@end example
@end deffn

@node 제어 흐름,Pattern matching,문장,노드 클래스
@anchor{library/ast control-flow}@anchor{4be5}
@subsubsection 제어 흐름


@cartouche
@quotation 참고 
@code{else}와 같은 선택적 절은 존재하지 않으면 빈 목록으로 저장됩니다.
@end quotation
@end cartouche

@geindex If (ast 클래스)
@anchor{library/ast ast If}@anchor{4be6}
@deffn {클래스} ast.If (test, body, orelse)

@code{if} 문. @code{test}는 (@ref{4ac3,,Compare} 노드와 같은) 단일 노드를 보유합니다. @code{body}와 @code{orelse}는 각각 노드 리스트를 보유합니다.

@code{elif} 절은 AST에서 특별한 표현이 없지만, 앞의 @code{orelse} 섹션 안에서 추가 @ref{4be6,,If} 노드로 나타납니다.

@example
>>> print(ast.dump(ast.parse("""
... if x:
...    ...
... elif y:
...    ...
... else:
...    ...
... """), indent=4))
Module(
    body=[
        If(
            test=Name(id='x', ctx=Load()),
            body=[
                Expr(
                    value=Constant(value=Ellipsis))],
            orelse=[
                If(
                    test=Name(id='y', ctx=Load()),
                    body=[
                        Expr(
                            value=Constant(value=Ellipsis))],
                    orelse=[
                        Expr(
                            value=Constant(value=Ellipsis))])])])
@end example
@end deffn

@geindex For (ast 클래스)
@anchor{library/ast ast For}@anchor{4be7}
@deffn {클래스} ast.For (target, iter, body, orelse, type_comment)

A @code{for} loop. @code{target} holds the variable(s) the loop assigns to, as a
single @ref{1d1f,,Name}, @ref{4ad3,,Tuple}, @ref{4ad2,,List}, @ref{4acf,,Attribute} or
@ref{4ad0,,Subscript} node. @code{iter} holds the item to be looped over, again
as a single node. @code{body} and @code{orelse} contain lists of nodes to execute.
Those in @code{orelse} are executed if the loop finishes normally, rather than
via a @code{break} statement.

@geindex type_comment (ast.For의 속성)
@anchor{library/ast ast For type_comment}@anchor{4be8}
@deffn {속성} type_comment

@code{type_comment}는 형 어노테이션이 주석으로 포함된 선택적 문자열입니다.
@end deffn

@example
>>> print(ast.dump(ast.parse("""
... for x in y:
...     ...
... else:
...     ...
... """), indent=4))
Module(
    body=[
        For(
            target=Name(id='x', ctx=Store()),
            iter=Name(id='y', ctx=Load()),
            body=[
                Expr(
                    value=Constant(value=Ellipsis))],
            orelse=[
                Expr(
                    value=Constant(value=Ellipsis))])])
@end example
@end deffn

@geindex While (ast 클래스)
@anchor{library/ast ast While}@anchor{4be9}
@deffn {클래스} ast.While (test, body, orelse)

@code{while} 루프. @code{test}는 (@ref{4ac3,,Compare} 노드와 같은) 조건을 보유합니다.

@example
>>> print(ast.dump(ast.parse("""
... while x:
...    ...
... else:
...    ...
... """), indent=4))
Module(
    body=[
        While(
            test=Name(id='x', ctx=Load()),
            body=[
                Expr(
                    value=Constant(value=Ellipsis))],
            orelse=[
                Expr(
                    value=Constant(value=Ellipsis))])])
@end example
@end deffn

@geindex Break (ast 클래스)
@geindex Continue (ast 클래스)
@anchor{library/ast ast Break}@anchor{4bea}
@deffn {클래스} ast.Break
@anchor{library/ast ast Continue}@anchor{4beb}
@deffnx {클래스} ast.Continue

@code{break}와 @code{continue} 문.

@example
>>> print(ast.dump(ast.parse("""\
... for a in b:
...     if a > 5:
...         break
...     else:
...         continue
...
... """), indent=4))
Module(
    body=[
        For(
            target=Name(id='a', ctx=Store()),
            iter=Name(id='b', ctx=Load()),
            body=[
                If(
                    test=Compare(
                        left=Name(id='a', ctx=Load()),
                        ops=[
                            Gt()],
                        comparators=[
                            Constant(value=5)]),
                    body=[
                        Break()],
                    orelse=[
                        Continue()])])])
@end example
@end deffn

@geindex Try (ast 클래스)
@anchor{library/ast ast Try}@anchor{4bec}
@deffn {클래스} ast.Try (body, handlers, orelse, finalbody)

@code{try} 블록. @ref{4bed,,ExceptHandler} 노드의 리스트인 @code{handlers}를 제외한, 모든 어트리뷰트는 실행할 노드의 리스트입니다.

@example
>>> print(ast.dump(ast.parse("""
... try:
...    ...
... except Exception:
...    ...
... except OtherException as e:
...    ...
... else:
...    ...
... finally:
...    ...
... """), indent=4))
Module(
    body=[
        Try(
            body=[
                Expr(
                    value=Constant(value=Ellipsis))],
            handlers=[
                ExceptHandler(
                    type=Name(id='Exception', ctx=Load()),
                    body=[
                        Expr(
                            value=Constant(value=Ellipsis))]),
                ExceptHandler(
                    type=Name(id='OtherException', ctx=Load()),
                    name='e',
                    body=[
                        Expr(
                            value=Constant(value=Ellipsis))])],
            orelse=[
                Expr(
                    value=Constant(value=Ellipsis))],
            finalbody=[
                Expr(
                    value=Constant(value=Ellipsis))])])
@end example
@end deffn

@geindex TryStar (ast 클래스)
@anchor{library/ast ast TryStar}@anchor{4bee}
@deffn {클래스} ast.TryStar (body, handlers, orelse, finalbody)

@code{try} blocks which are followed by @code{except*} clauses. The attributes are the
same as for @ref{4bec,,Try} but the @ref{4bed,,ExceptHandler} nodes in @code{handlers}
are interpreted as @code{except*} blocks rather then @code{except}.

@example
>>> print(ast.dump(ast.parse("""
... try:
...    ...
... except* Exception:
...    ...
... """), indent=4))
Module(
    body=[
        TryStar(
            body=[
                Expr(
                    value=Constant(value=Ellipsis))],
            handlers=[
                ExceptHandler(
                    type=Name(id='Exception', ctx=Load()),
                    body=[
                        Expr(
                            value=Constant(value=Ellipsis))])])])
@end example


Added in version 3.11.

@end deffn

@geindex ExceptHandler (ast 클래스)
@anchor{library/ast ast ExceptHandler}@anchor{4bed}
@deffn {클래스} ast.ExceptHandler (type, name, body)

단일 @code{except} 절. @code{type}은 일치할 예외 형이며, 일반적으로 @ref{1d1f,,Name} 노드(또는 모두 잡는 @code{except:} 절의 경우는 @code{None})입니다. @code{name}은 예외를 담을 이름을 위한 원시 문자열이거나, 절에 @code{as foo}가 없으면 @code{None}입니다. @code{body}는 노드의 리스트입니다.

@example
>>> print(ast.dump(ast.parse("""\
... try:
...     a + 1
... except TypeError:
...     pass
... """), indent=4))
Module(
    body=[
        Try(
            body=[
                Expr(
                    value=BinOp(
                        left=Name(id='a', ctx=Load()),
                        op=Add(),
                        right=Constant(value=1)))],
            handlers=[
                ExceptHandler(
                    type=Name(id='TypeError', ctx=Load()),
                    body=[
                        Pass()])])])
@end example
@end deffn

@geindex With (ast 클래스)
@anchor{library/ast ast With}@anchor{4bef}
@deffn {클래스} ast.With (items, body, type_comment)

@code{with} 블록. @code{items}는 컨텍스트 관리자를 나타내는 @ref{4bf0,,withitem} 노드의 리스트이며, @code{body}는 컨텍스트 내에서 들여쓰기 된 블록입니다.

@geindex type_comment (ast.With의 속성)
@anchor{library/ast ast With type_comment}@anchor{4bf1}
@deffn {속성} type_comment

@code{type_comment}는 형 어노테이션이 주석으로 포함된 선택적 문자열입니다.
@end deffn
@end deffn

@geindex withitem (ast 클래스)
@anchor{library/ast ast withitem}@anchor{4bf0}
@deffn {클래스} ast.withitem (context_expr, optional_vars)

@code{with} 블록의 단일 컨텍스트 관리자. @code{context_expr}은 컨텍스트 관리자이며, 종종 @ref{4ace,,Call} 노드입니다. @code{optional_vars}는 @code{as foo} 부분의 경우 @ref{1d1f,,Name}, @ref{4ad3,,Tuple} 또는 @ref{4ad2,,List}이거나, 사용하지 않으면 @code{None}입니다.

@example
>>> print(ast.dump(ast.parse("""\
... with a as b, c as d:
...    something(b, d)
... """), indent=4))
Module(
    body=[
        With(
            items=[
                withitem(
                    context_expr=Name(id='a', ctx=Load()),
                    optional_vars=Name(id='b', ctx=Store())),
                withitem(
                    context_expr=Name(id='c', ctx=Load()),
                    optional_vars=Name(id='d', ctx=Store()))],
            body=[
                Expr(
                    value=Call(
                        func=Name(id='something', ctx=Load()),
                        args=[
                            Name(id='b', ctx=Load()),
                            Name(id='d', ctx=Load())]))])])
@end example
@end deffn

@node Pattern matching,Type annotations,제어 흐름,노드 클래스
@anchor{library/ast pattern-matching}@anchor{4bf2}
@subsubsection Pattern matching


@geindex Match (ast 클래스)
@anchor{library/ast ast Match}@anchor{4bf3}
@deffn {클래스} ast.Match (subject, cases)

A @code{match} statement. @code{subject} holds the subject of the match (the object
that is being matched against the cases) and @code{cases} contains an iterable of
@ref{4bf4,,match_case} nodes with the different cases.


Added in version 3.10.

@end deffn

@geindex match_case (ast 클래스)
@anchor{library/ast ast match_case}@anchor{4bf4}
@deffn {클래스} ast.match_case (pattern, guard, body)

A single case pattern in a @code{match} statement. @code{pattern} contains the
match pattern that the subject will be matched against. Note that the
@ref{4c5,,AST} nodes produced for patterns differ from those produced for
expressions, even when they share the same syntax.

The @code{guard} attribute contains an expression that will be evaluated if
the pattern matches the subject.

@code{body} contains a list of nodes to execute if the pattern matches and
the result of evaluating the guard expression is true.

@example
>>> print(ast.dump(ast.parse("""
... match x:
...     case [x] if x>0:
...         ...
...     case tuple():
...         ...
... """), indent=4))
Module(
    body=[
        Match(
            subject=Name(id='x', ctx=Load()),
            cases=[
                match_case(
                    pattern=MatchSequence(
                        patterns=[
                            MatchAs(name='x')]),
                    guard=Compare(
                        left=Name(id='x', ctx=Load()),
                        ops=[
                            Gt()],
                        comparators=[
                            Constant(value=0)]),
                    body=[
                        Expr(
                            value=Constant(value=Ellipsis))]),
                match_case(
                    pattern=MatchClass(
                        cls=Name(id='tuple', ctx=Load())),
                    body=[
                        Expr(
                            value=Constant(value=Ellipsis))])])])
@end example


Added in version 3.10.

@end deffn

@geindex MatchValue (ast 클래스)
@anchor{library/ast ast MatchValue}@anchor{4bf5}
@deffn {클래스} ast.MatchValue (value)

A match literal or value pattern that compares by equality. @code{value} is
an expression node. Permitted value nodes are restricted as described in
the match statement documentation. This pattern succeeds if the match
subject is equal to the evaluated value.

@example
>>> print(ast.dump(ast.parse("""
... match x:
...     case "Relevant":
...         ...
... """), indent=4))
Module(
    body=[
        Match(
            subject=Name(id='x', ctx=Load()),
            cases=[
                match_case(
                    pattern=MatchValue(
                        value=Constant(value='Relevant')),
                    body=[
                        Expr(
                            value=Constant(value=Ellipsis))])])])
@end example


Added in version 3.10.

@end deffn

@geindex MatchSingleton (ast 클래스)
@anchor{library/ast ast MatchSingleton}@anchor{4bf6}
@deffn {클래스} ast.MatchSingleton (value)

A match literal pattern that compares by identity. @code{value} is the
singleton to be compared against: @code{None}, @code{True}, or @code{False}. This
pattern succeeds if the match subject is the given constant.

@example
>>> print(ast.dump(ast.parse("""
... match x:
...     case None:
...         ...
... """), indent=4))
Module(
    body=[
        Match(
            subject=Name(id='x', ctx=Load()),
            cases=[
                match_case(
                    pattern=MatchSingleton(value=None),
                    body=[
                        Expr(
                            value=Constant(value=Ellipsis))])])])
@end example


Added in version 3.10.

@end deffn

@geindex MatchSequence (ast 클래스)
@anchor{library/ast ast MatchSequence}@anchor{4bf7}
@deffn {클래스} ast.MatchSequence (patterns)

A match sequence pattern. @code{patterns} contains the patterns to be matched
against the subject elements if the subject is a sequence. Matches a variable
length sequence if one of the subpatterns is a @code{MatchStar} node, otherwise
matches a fixed length sequence.

@example
>>> print(ast.dump(ast.parse("""
... match x:
...     case [1, 2]:
...         ...
... """), indent=4))
Module(
    body=[
        Match(
            subject=Name(id='x', ctx=Load()),
            cases=[
                match_case(
                    pattern=MatchSequence(
                        patterns=[
                            MatchValue(
                                value=Constant(value=1)),
                            MatchValue(
                                value=Constant(value=2))]),
                    body=[
                        Expr(
                            value=Constant(value=Ellipsis))])])])
@end example


Added in version 3.10.

@end deffn

@geindex MatchStar (ast 클래스)
@anchor{library/ast ast MatchStar}@anchor{4bf8}
@deffn {클래스} ast.MatchStar (name)

Matches the rest of the sequence in a variable length match sequence pattern.
If @code{name} is not @code{None}, a list containing the remaining sequence
elements is bound to that name if the overall sequence pattern is successful.

@example
>>> print(ast.dump(ast.parse("""
... match x:
...     case [1, 2, *rest]:
...         ...
...     case [*_]:
...         ...
... """), indent=4))
Module(
    body=[
        Match(
            subject=Name(id='x', ctx=Load()),
            cases=[
                match_case(
                    pattern=MatchSequence(
                        patterns=[
                            MatchValue(
                                value=Constant(value=1)),
                            MatchValue(
                                value=Constant(value=2)),
                            MatchStar(name='rest')]),
                    body=[
                        Expr(
                            value=Constant(value=Ellipsis))]),
                match_case(
                    pattern=MatchSequence(
                        patterns=[
                            MatchStar()]),
                    body=[
                        Expr(
                            value=Constant(value=Ellipsis))])])])
@end example


Added in version 3.10.

@end deffn

@geindex MatchMapping (ast 클래스)
@anchor{library/ast ast MatchMapping}@anchor{4bf9}
@deffn {클래스} ast.MatchMapping (keys, patterns, rest)

A match mapping pattern. @code{keys} is a sequence of expression nodes.
@code{patterns} is a corresponding sequence of pattern nodes. @code{rest} is an
optional name that can be specified to capture the remaining mapping elements.
Permitted key expressions are restricted as described in the match statement
documentation.

This pattern succeeds if the subject is a mapping, all evaluated key
expressions are present in the mapping, and the value corresponding to each
key matches the corresponding subpattern. If @code{rest} is not @code{None}, a dict
containing the remaining mapping elements is bound to that name if the overall
mapping pattern is successful.

@example
>>> print(ast.dump(ast.parse("""
... match x:
...     case @{1: _, 2: _@}:
...         ...
...     case @{**rest@}:
...         ...
... """), indent=4))
Module(
    body=[
        Match(
            subject=Name(id='x', ctx=Load()),
            cases=[
                match_case(
                    pattern=MatchMapping(
                        keys=[
                            Constant(value=1),
                            Constant(value=2)],
                        patterns=[
                            MatchAs(),
                            MatchAs()]),
                    body=[
                        Expr(
                            value=Constant(value=Ellipsis))]),
                match_case(
                    pattern=MatchMapping(rest='rest'),
                    body=[
                        Expr(
                            value=Constant(value=Ellipsis))])])])
@end example


Added in version 3.10.

@end deffn

@geindex MatchClass (ast 클래스)
@anchor{library/ast ast MatchClass}@anchor{4bfa}
@deffn {클래스} ast.MatchClass (cls, patterns, kwd_attrs, kwd_patterns)

A match class pattern. @code{cls} is an expression giving the nominal class to
be matched. @code{patterns} is a sequence of pattern nodes to be matched against
the class defined sequence of pattern matching attributes. @code{kwd_attrs} is a
sequence of additional attributes to be matched (specified as keyword arguments
in the class pattern), @code{kwd_patterns} are the corresponding patterns
(specified as keyword values in the class pattern).

This pattern succeeds if the subject is an instance of the nominated class,
all positional patterns match the corresponding class-defined attributes, and
any specified keyword attributes match their corresponding pattern.

Note: classes may define a property that returns self in order to match a
pattern node against the instance being matched. Several builtin types are
also matched that way, as described in the match statement documentation.

@example
>>> print(ast.dump(ast.parse("""
... match x:
...     case Point2D(0, 0):
...         ...
...     case Point3D(x=0, y=0, z=0):
...         ...
... """), indent=4))
Module(
    body=[
        Match(
            subject=Name(id='x', ctx=Load()),
            cases=[
                match_case(
                    pattern=MatchClass(
                        cls=Name(id='Point2D', ctx=Load()),
                        patterns=[
                            MatchValue(
                                value=Constant(value=0)),
                            MatchValue(
                                value=Constant(value=0))]),
                    body=[
                        Expr(
                            value=Constant(value=Ellipsis))]),
                match_case(
                    pattern=MatchClass(
                        cls=Name(id='Point3D', ctx=Load()),
                        kwd_attrs=[
                            'x',
                            'y',
                            'z'],
                        kwd_patterns=[
                            MatchValue(
                                value=Constant(value=0)),
                            MatchValue(
                                value=Constant(value=0)),
                            MatchValue(
                                value=Constant(value=0))]),
                    body=[
                        Expr(
                            value=Constant(value=Ellipsis))])])])
@end example


Added in version 3.10.

@end deffn

@geindex MatchAs (ast 클래스)
@anchor{library/ast ast MatchAs}@anchor{4bfb}
@deffn {클래스} ast.MatchAs (pattern, name)

A match “as-pattern”, capture pattern or wildcard pattern. @code{pattern}
contains the match pattern that the subject will be matched against.
If the pattern is @code{None}, the node represents a capture pattern (i.e a
bare name) and will always succeed.

The @code{name} attribute contains the name that will be bound if the pattern
is successful. If @code{name} is @code{None}, @code{pattern} must also be @code{None}
and the node represents the wildcard pattern.

@example
>>> print(ast.dump(ast.parse("""
... match x:
...     case [x] as y:
...         ...
...     case _:
...         ...
... """), indent=4))
Module(
    body=[
        Match(
            subject=Name(id='x', ctx=Load()),
            cases=[
                match_case(
                    pattern=MatchAs(
                        pattern=MatchSequence(
                            patterns=[
                                MatchAs(name='x')]),
                        name='y'),
                    body=[
                        Expr(
                            value=Constant(value=Ellipsis))]),
                match_case(
                    pattern=MatchAs(),
                    body=[
                        Expr(
                            value=Constant(value=Ellipsis))])])])
@end example


Added in version 3.10.

@end deffn

@geindex MatchOr (ast 클래스)
@anchor{library/ast ast MatchOr}@anchor{4bfc}
@deffn {클래스} ast.MatchOr (patterns)

A match “or-pattern”. An or-pattern matches each of its subpatterns in turn
to the subject, until one succeeds. The or-pattern is then deemed to
succeed. If none of the subpatterns succeed the or-pattern fails. The
@code{patterns} attribute contains a list of match pattern nodes that will be
matched against the subject.

@example
>>> print(ast.dump(ast.parse("""
... match x:
...     case [x] | (y):
...         ...
... """), indent=4))
Module(
    body=[
        Match(
            subject=Name(id='x', ctx=Load()),
            cases=[
                match_case(
                    pattern=MatchOr(
                        patterns=[
                            MatchSequence(
                                patterns=[
                                    MatchAs(name='x')]),
                            MatchAs(name='y')]),
                    body=[
                        Expr(
                            value=Constant(value=Ellipsis))])])])
@end example


Added in version 3.10.

@end deffn

@node Type annotations,Type parameters,Pattern matching,노드 클래스
@anchor{library/ast type-annotations}@anchor{4bfd}
@subsubsection Type annotations


@geindex TypeIgnore (ast 클래스)
@anchor{library/ast ast TypeIgnore}@anchor{1b0c}
@deffn {클래스} ast.TypeIgnore (lineno, tag)

A @code{# type: ignore} comment located at `lineno'.
`tag' is the optional tag specified by the form @code{# type: ignore <tag>}.

@example
>>> print(ast.dump(ast.parse('x = 1 # type: ignore', type_comments=True), indent=4))
Module(
    body=[
        Assign(
            targets=[
                Name(id='x', ctx=Store())],
            value=Constant(value=1))],
    type_ignores=[
        TypeIgnore(lineno=1, tag='@w{'})])
>>> print(ast.dump(ast.parse('x: bool = 1 # type: ignore[assignment]', type_comments=True), indent=4))
Module(
    body=[
        AnnAssign(
            target=Name(id='x', ctx=Store()),
            annotation=Name(id='bool', ctx=Load()),
            value=Constant(value=1),
            simple=1)],
    type_ignores=[
        TypeIgnore(lineno=1, tag='[assignment]')])
@end example

@cartouche
@quotation 참고 
@code{TypeIgnore} nodes are not generated when the `type_comments' parameter
is set to @code{False} (default).  See @ref{1c2,,ast.parse()} for more details.
@end quotation
@end cartouche


Added in version 3.8.

@end deffn

@node Type parameters,함수와 클래스 정의,Type annotations,노드 클래스
@anchor{library/ast ast-type-params}@anchor{4be1}@anchor{library/ast type-parameters}@anchor{4bfe}
@subsubsection Type parameters


@ref{5ac,,Type parameters} can exist on classes, functions, and type
aliases.

@geindex TypeVar (ast 클래스)
@anchor{library/ast ast TypeVar}@anchor{4bff}
@deffn {클래스} ast.TypeVar (name, bound, default_value)

A @ref{487,,typing.TypeVar}. @code{name} is the name of the type variable.
@code{bound} is the bound or constraints, if any. If @code{bound} is a @ref{4ad3,,Tuple},
it represents constraints; otherwise it represents the bound. @code{default_value}
is the default value; if the @code{TypeVar} has no default, this
attribute will be set to @code{None}.

@example
>>> print(ast.dump(ast.parse("type Alias[T: int = bool] = list[T]"), indent=4))
Module(
    body=[
        TypeAlias(
            name=Name(id='Alias', ctx=Store()),
            type_params=[
                TypeVar(
                    name='T',
                    bound=Name(id='int', ctx=Load()),
                    default_value=Name(id='bool', ctx=Load()))],
            value=Subscript(
                value=Name(id='list', ctx=Load()),
                slice=Name(id='T', ctx=Load()),
                ctx=Load()))])
@end example


Added in version 3.12.



버전 3.13에서 변경: Added the `default_value' parameter.

@end deffn

@geindex ParamSpec (ast 클래스)
@anchor{library/ast ast ParamSpec}@anchor{4c00}
@deffn {클래스} ast.ParamSpec (name, default_value)

A @ref{488,,typing.ParamSpec}. @code{name} is the name of the parameter specification.
@code{default_value} is the default value; if the @code{ParamSpec} has no default,
this attribute will be set to @code{None}.

@example
>>> print(ast.dump(ast.parse("type Alias[**P = [int, str]] = Callable[P, int]"), indent=4))
Module(
    body=[
        TypeAlias(
            name=Name(id='Alias', ctx=Store()),
            type_params=[
                ParamSpec(
                    name='P',
                    default_value=List(
                        elts=[
                            Name(id='int', ctx=Load()),
                            Name(id='str', ctx=Load())],
                        ctx=Load()))],
            value=Subscript(
                value=Name(id='Callable', ctx=Load()),
                slice=Tuple(
                    elts=[
                        Name(id='P', ctx=Load()),
                        Name(id='int', ctx=Load())],
                    ctx=Load()),
                ctx=Load()))])
@end example


Added in version 3.12.



버전 3.13에서 변경: Added the `default_value' parameter.

@end deffn

@geindex TypeVarTuple (ast 클래스)
@anchor{library/ast ast TypeVarTuple}@anchor{4c01}
@deffn {클래스} ast.TypeVarTuple (name, default_value)

A @ref{489,,typing.TypeVarTuple}. @code{name} is the name of the type variable tuple.
@code{default_value} is the default value; if the @code{TypeVarTuple} has no
default, this attribute will be set to @code{None}.

@example
>>> print(ast.dump(ast.parse("type Alias[*Ts = ()] = tuple[*Ts]"), indent=4))
Module(
    body=[
        TypeAlias(
            name=Name(id='Alias', ctx=Store()),
            type_params=[
                TypeVarTuple(
                    name='Ts',
                    default_value=Tuple(ctx=Load()))],
            value=Subscript(
                value=Name(id='tuple', ctx=Load()),
                slice=Tuple(
                    elts=[
                        Starred(
                            value=Name(id='Ts', ctx=Load()),
                            ctx=Load())],
                    ctx=Load()),
                ctx=Load()))])
@end example


Added in version 3.12.



버전 3.13에서 변경: Added the `default_value' parameter.

@end deffn

@node 함수와 클래스 정의,Async와 await,Type parameters,노드 클래스
@anchor{library/ast function-and-class-definitions}@anchor{4c02}
@subsubsection 함수와 클래스 정의


@geindex FunctionDef (ast 클래스)
@anchor{library/ast ast FunctionDef}@anchor{1a78}
@deffn {클래스} ast.FunctionDef (name, args, body, decorator_list, returns, type_comment, type_params)

함수 정의.


@itemize *

@item 
@code{name}은 함수 이름의 원시 문자열입니다.

@item 
@code{args} is an @ref{4c03,,arguments} node.

@item 
@code{body}는 함수 내부의 노드 리스트입니다.

@item 
@code{decorator_list}는 적용할 데코레이터 리스트이며, 가장 바깥쪽에 먼저 저장됩니다 (즉, 리스트의 첫 번째가 마지막에 적용됩니다).

@item 
@code{returns}는 반환 어노테이션입니다.

@item 
@code{type_params} is a list of @ref{4be1,,type parameters}.
@end itemize

@geindex type_comment (ast.FunctionDef의 속성)
@anchor{library/ast ast FunctionDef type_comment}@anchor{4c04}
@deffn {속성} type_comment

@code{type_comment}는 형 어노테이션이 주석으로 포함된 선택적 문자열입니다.
@end deffn


버전 3.12에서 변경: Added @code{type_params}.

@end deffn

@geindex Lambda (ast 클래스)
@anchor{library/ast ast Lambda}@anchor{4ad8}
@deffn {클래스} ast.Lambda (args, body)

@code{lambda}는 표현식 내에서 사용할 수 있는 최소 함수 정의입니다. @ref{1a78,,FunctionDef}와 달리, @code{body}는 단일 노드를 보유합니다.

@example
>>> print(ast.dump(ast.parse('lambda x,y: ...'), indent=4))
Module(
    body=[
        Expr(
            value=Lambda(
                args=arguments(
                    args=[
                        arg(arg='x'),
                        arg(arg='y')]),
                body=Constant(value=Ellipsis)))])
@end example
@end deffn

@geindex arguments (ast 클래스)
@anchor{library/ast ast arguments}@anchor{4c03}
@deffn {클래스} ast.arguments (posonlyargs, args, vararg, kwonlyargs, kw_defaults, kwarg, defaults)

함수의 인자.


@itemize *

@item 
@code{posonlyargs}, @code{args} 및 @code{kwonlyargs}는 @ref{4c05,,arg} 노드의 리스트입니다.

@item 
@code{vararg}와 @code{kwarg}는 @code{*args, **kwargs} 매개 변수를 참조하는 단일 @ref{4c05,,arg} 노드입니다.

@item 
@code{kw_defaults}는 키워드 전용 인자의 기본값 리스트입니다. 어떤 것이 @code{None}이면, 해당 인자는 필수입니다.

@item 
@code{defaults}는 위치적으로 전달될 수 있는 인자의 기본값 리스트입니다. 기본값 수가 더 적으면, 마지막 n개의 인자에 해당합니다.
@end itemize
@end deffn

@geindex arg (ast 클래스)
@anchor{library/ast ast arg}@anchor{4c05}
@deffn {클래스} ast.arg (arg, annotation, type_comment)

A single argument in a list. @code{arg} is a raw string of the argument
name; @code{annotation} is its annotation, such as a @ref{1d1f,,Name} node.

@geindex type_comment (ast.arg의 속성)
@anchor{library/ast ast arg type_comment}@anchor{4c06}
@deffn {속성} type_comment

@code{type_comment}는 주석으로 제공된 형 어노테이션이 있는 선택적 문자열입니다.
@end deffn

@example
>>> print(ast.dump(ast.parse("""\
... @@decorator1
... @@decorator2
... def f(a: 'annotation', b=1, c=2, *d, e, f=3, **g) -> 'return annotation':
...     pass
... """), indent=4))
Module(
    body=[
        FunctionDef(
            name='f',
            args=arguments(
                args=[
                    arg(
                        arg='a',
                        annotation=Constant(value='annotation')),
                    arg(arg='b'),
                    arg(arg='c')],
                vararg=arg(arg='d'),
                kwonlyargs=[
                    arg(arg='e'),
                    arg(arg='f')],
                kw_defaults=[
                    None,
                    Constant(value=3)],
                kwarg=arg(arg='g'),
                defaults=[
                    Constant(value=1),
                    Constant(value=2)]),
            body=[
                Pass()],
            decorator_list=[
                Name(id='decorator1', ctx=Load()),
                Name(id='decorator2', ctx=Load())],
            returns=Constant(value='return annotation'))])
@end example
@end deffn

@geindex Return (ast 클래스)
@anchor{library/ast ast Return}@anchor{4c07}
@deffn {클래스} ast.Return (value)

@code{return} 문.

@example
>>> print(ast.dump(ast.parse('return 4'), indent=4))
Module(
    body=[
        Return(
            value=Constant(value=4))])
@end example
@end deffn

@geindex Yield (ast 클래스)
@geindex YieldFrom (ast 클래스)
@anchor{library/ast ast Yield}@anchor{4adf}
@deffn {클래스} ast.Yield (value)
@anchor{library/ast ast YieldFrom}@anchor{4ae0}
@deffnx {클래스} ast.YieldFrom (value)

A @code{yield} or @code{yield from} expression. Because these are expressions, they
must be wrapped in an @ref{4bc4,,Expr} node if the value sent back is not used.

@example
>>> print(ast.dump(ast.parse('yield x'), indent=4))
Module(
    body=[
        Expr(
            value=Yield(
                value=Name(id='x', ctx=Load())))])

>>> print(ast.dump(ast.parse('yield from x'), indent=4))
Module(
    body=[
        Expr(
            value=YieldFrom(
                value=Name(id='x', ctx=Load())))])
@end example
@end deffn

@geindex Global (ast 클래스)
@geindex Nonlocal (ast 클래스)
@anchor{library/ast ast Global}@anchor{4c08}
@deffn {클래스} ast.Global (names)
@anchor{library/ast ast Nonlocal}@anchor{4c09}
@deffnx {클래스} ast.Nonlocal (names)

@code{global}과 @code{nonlocal} 문. @code{names}는 원시 문자열 리스트입니다.

@example
>>> print(ast.dump(ast.parse('global x,y,z'), indent=4))
Module(
    body=[
        Global(
            names=[
                'x',
                'y',
                'z'])])

>>> print(ast.dump(ast.parse('nonlocal x,y,z'), indent=4))
Module(
    body=[
        Nonlocal(
            names=[
                'x',
                'y',
                'z'])])
@end example
@end deffn

@geindex ClassDef (ast 클래스)
@anchor{library/ast ast ClassDef}@anchor{1a76}
@deffn {클래스} ast.ClassDef (name, bases, keywords, body, decorator_list, type_params)

클래스 정의.


@itemize *

@item 
@code{name}은 클래스 이름의 원시 문자열입니다.

@item 
@code{bases}는 명시적으로 지정된 베이스 클래스의 노드 리스트입니다.

@item 
@code{keywords} is a list of @ref{4bd4,,keyword} nodes, principally for ‘metaclass’.
Other keywords will be passed to the metaclass, as per 
@geindex Python 향상 제안; PEP 3115
PEP 3115@footnote{https://peps.python.org/pep-3115/}.

@item 
@code{body}는 클래스 정의 내에서 코드를 나타내는 노드 리스트입니다.

@item 
@code{decorator_list}는 @ref{1a78,,FunctionDef}에서와 같이 노드 리스트입니다.

@item 
@code{type_params} is a list of @ref{4be1,,type parameters}.
@end itemize

@example
>>> print(ast.dump(ast.parse("""\
... @@decorator1
... @@decorator2
... class Foo(base1, base2, metaclass=meta):
...     pass
... """), indent=4))
Module(
    body=[
        ClassDef(
            name='Foo',
            bases=[
                Name(id='base1', ctx=Load()),
                Name(id='base2', ctx=Load())],
            keywords=[
                keyword(
                    arg='metaclass',
                    value=Name(id='meta', ctx=Load()))],
            body=[
                Pass()],
            decorator_list=[
                Name(id='decorator1', ctx=Load()),
                Name(id='decorator2', ctx=Load())])])
@end example


버전 3.12에서 변경: Added @code{type_params}.

@end deffn

@node Async와 await,,함수와 클래스 정의,노드 클래스
@anchor{library/ast async-and-await}@anchor{4c0a}
@subsubsection Async와 await


@geindex AsyncFunctionDef (ast 클래스)
@anchor{library/ast ast AsyncFunctionDef}@anchor{1a77}
@deffn {클래스} ast.AsyncFunctionDef (name, args, body, decorator_list, returns, type_comment, type_params)

@code{async def} 함수 정의. @ref{1a78,,FunctionDef}와 같은 필드를 갖습니다.


버전 3.12에서 변경: Added @code{type_params}.

@end deffn

@geindex Await (ast 클래스)
@anchor{library/ast ast Await}@anchor{4ade}
@deffn {클래스} ast.Await (value)

@code{await} 표현식. @code{value}는 기다릴 대상입니다. @ref{1a77,,AsyncFunctionDef}의 본문에서만 유효합니다.
@end deffn

@example
>>> print(ast.dump(ast.parse("""\
... async def f():
...     await other_func()
... """), indent=4))
Module(
    body=[
        AsyncFunctionDef(
            name='f',
            args=arguments(),
            body=[
                Expr(
                    value=Await(
                        value=Call(
                            func=Name(id='other_func', ctx=Load()))))])])
@end example

@geindex AsyncFor (ast 클래스)
@geindex AsyncWith (ast 클래스)
@anchor{library/ast ast AsyncFor}@anchor{4c0b}
@deffn {클래스} ast.AsyncFor (target, iter, body, orelse, type_comment)
@anchor{library/ast ast AsyncWith}@anchor{4c0c}
@deffnx {클래스} ast.AsyncWith (items, body, type_comment)

@code{async for} 루프와 @code{async with} 컨텍스트 관리자. 이들은 각각 @ref{4be7,,For}와 @ref{4bef,,With}와 같은 필드를 갖습니다. @ref{1a77,,AsyncFunctionDef}의 본문에서만 유효합니다.
@end deffn

@cartouche
@quotation 참고 
When a string is parsed by @ref{1c2,,ast.parse()}, operator nodes (subclasses
of @code{ast.operator}, @code{ast.unaryop}, @code{ast.cmpop},
@code{ast.boolop} and @code{ast.expr_context}) on the returned tree
will be singletons. Changes to one will be reflected in all other
occurrences of the same value (for example, @ref{4bc5,,ast.Add}).
@end quotation
@end cartouche

@node ast helpers,Compiler flags<2>,노드 클래스,ast — Abstract syntax trees
@anchor{library/ast ast-helpers}@anchor{4c0d}
@subsubsection @code{ast} helpers


Apart from the node classes, the @code{ast} module defines these utility functions
and classes for traversing abstract syntax trees:

@geindex parse() (ast 모듈)
@anchor{library/ast ast parse}@anchor{1c2}
@deffn {함수} ast.parse (source, filename='<unknown>', mode='exec', *, type_comments=False, feature_version=None, optimize=-1)

Parse the source into an AST node.  Equivalent to @code{compile(source,
filename, mode, flags=FLAGS_VALUE, optimize=optimize)},
where @code{FLAGS_VALUE} is @code{ast.PyCF_ONLY_AST} if @code{optimize <= 0}
and @code{ast.PyCF_OPTIMIZED_AST} otherwise.

If @code{type_comments=True} is given, the parser is modified to check
and return type comments as specified by 
@geindex Python 향상 제안; PEP 484
PEP 484@footnote{https://peps.python.org/pep-0484/} and 
@geindex Python 향상 제안; PEP 526
PEP 526@footnote{https://peps.python.org/pep-0526/}.
This is equivalent to adding @ref{4c0e,,ast.PyCF_TYPE_COMMENTS} to the
flags passed to @ref{4b2,,compile()}.  This will report syntax errors
for misplaced type comments.  Without this flag, type comments will
be ignored, and the @code{type_comment} field on selected AST nodes
will always be @code{None}.  In addition, the locations of @code{# type:
ignore} comments will be returned as the @code{type_ignores}
attribute of @ref{4bb9,,Module} (otherwise it is always an empty list).

또한, @code{mode}가 @code{'func_type'}이면, 입력 문법은 
@geindex Python 향상 제안; PEP 484
PEP 484@footnote{https://peps.python.org/pep-0484/} “서명 형 주석”에 따라 수정됩니다, 예를 들어 @code{(str, int) -> List[str]}.

Setting @code{feature_version} to a tuple @code{(major, minor)} will result in
a “best-effort” attempt to parse using that Python version’s grammar.
For example, setting @code{feature_version=(3, 9)} will attempt to disallow
parsing of @ref{a0e,,match} statements.
Currently @code{major} must equal to @code{3}. The lowest supported version is
@code{(3, 7)} (and this may increase in future Python versions);
the highest is @code{sys.version_info[0:2]}. “Best-effort” attempt means there
is no guarantee that the parse (or success of the parse) is the same as
when run on the Python version corresponding to @code{feature_version}.

If source contains a null character (@code{\0}), @ref{2ec,,ValueError} is raised.

@cartouche
@quotation 경고 
Note that successfully parsing source code into an AST object doesn’t
guarantee that the source code provided is valid Python code that can
be executed as the compilation step can raise further @ref{18e,,SyntaxError}
exceptions. For instance, the source @code{return 42} generates a valid
AST node for a return statement, but it cannot be compiled alone (it needs
to be inside a function node).

In particular, @ref{1c2,,ast.parse()} won’t do any scoping checks, which the
compilation step does.
@end quotation
@end cartouche

@cartouche
@quotation 경고 
파이썬 AST 컴파일러의 스택 깊이 제한으로 인해 충분히 크고/복잡한 문자열로 파이썬 인터프리터가 충돌하도록 만들 수 있습니다.
@end quotation
@end cartouche


버전 3.8에서 변경: @code{type_comments}, @code{mode='func_type'} 및 @code{feature_version}추가했습니다.



버전 3.13에서 변경: The minimum supported version for @code{feature_version} is now @code{(3, 7)}.
The @code{optimize} argument was added.

@end deffn

@geindex unparse() (ast 모듈)
@anchor{library/ast ast unparse}@anchor{ae2}
@deffn {함수} ast.unparse (ast_obj)

@ref{4c5,,ast.AST} 객체를 역 구문 분석하고 @ref{1c2,,ast.parse()}로 다시 구문 분석할 경우 동등한 @code{ast.AST} 객체를 생성하는 코드가 포함된 문자열을 생성합니다.

@cartouche
@quotation 경고 
생성된 코드 문자열은 @ref{4c5,,ast.AST} 객체를 생성한 원래 코드와 반드시 같을 필요는 없습니다 (상수 튜플/frozenset과 같은 컴파일러 최적화 없이).
@end quotation
@end cartouche

@cartouche
@quotation 경고 
매우 복잡한 표현식을 역 구분 분석하려고 하면 @ref{f67,,RecursionError}가 발생할 수 있습니다.
@end quotation
@end cartouche


Added in version 3.9.

@end deffn

@geindex literal_eval() (ast 모듈)
@anchor{library/ast ast literal_eval}@anchor{e11}
@deffn {함수} ast.literal_eval (node_or_string)

Evaluate an expression node or a string containing only a Python literal or
container display.  The string or node provided may only consist of the
following Python literal structures: strings, bytes, numbers, tuples, lists,
dicts, sets, booleans, @code{None} and @code{Ellipsis}.

This can be used for evaluating strings containing Python values without the
need to parse the values oneself.  It is not capable of evaluating
arbitrarily complex expressions, for example involving operators or
indexing.

This function had been documented as “safe” in the past without defining
what that meant. That was misleading. This is specifically designed not to
execute Python code, unlike the more general @ref{4a4,,eval()}. There is no
namespace, no name lookups, or ability to call out. But it is not free from
attack: A relatively small input can lead to memory exhaustion or to C stack
exhaustion, crashing the process. There is also the possibility for
excessive CPU consumption denial of service on some inputs. Calling it on
untrusted data is thus not recommended.

@cartouche
@quotation 경고 
It is possible to crash the Python interpreter due to stack depth
limitations in Python’s AST compiler.

It can raise @ref{2ec,,ValueError}, @ref{198,,TypeError}, @ref{18e,,SyntaxError},
@ref{175f,,MemoryError} and @ref{f67,,RecursionError} depending on the malformed
input.
@end quotation
@end cartouche


버전 3.2에서 변경: 이제 바이트열과 집합 리터럴을 허용합니다.



버전 3.9에서 변경: 이제 @code{'set()'}으로 빈 집합을 만드는 것을 지원합니다.



버전 3.10에서 변경: For string inputs, leading spaces and tabs are now stripped.

@end deffn

@geindex get_docstring() (ast 모듈)
@anchor{library/ast ast get_docstring}@anchor{1e37}
@deffn {함수} ast.get_docstring (node, clean=True)

주어진 `node'(@ref{1a78,,FunctionDef}, @ref{1a77,,AsyncFunctionDef}, @ref{1a76,,ClassDef} 또는 @ref{4bb9,,Module} 노드이어야 합니다)의 독스트링이나, 독스트링이 없으면 @code{None}을 반환합니다. `clean'이 참이면, @ref{1a2c,,inspect.cleandoc()}으로 독스트링의 들여쓰기를 정리합니다.


버전 3.5에서 변경: @ref{1a77,,AsyncFunctionDef} 가 이제 지원됩니다.

@end deffn

@geindex get_source_segment() (ast 모듈)
@anchor{library/ast ast get_source_segment}@anchor{bca}
@deffn {함수} ast.get_source_segment (source, node, *, padded=False)

Get source code segment of the `source' that generated `node'.
If some location information (@ref{4bb3,,lineno}, @ref{4bb5,,end_lineno},
@ref{4bb4,,col_offset}, or @ref{4bb6,,end_col_offset}) is missing, return @code{None}.

`padded'가 @code{True}이면, 여러 줄 문장의 첫 번째 줄은 원래 위치와 일치하도록 스페이스로 채워집니다.


Added in version 3.8.

@end deffn

@geindex fix_missing_locations() (ast 모듈)
@anchor{library/ast ast fix_missing_locations}@anchor{4c0f}
@deffn {함수} ast.fix_missing_locations (node)

When you compile a node tree with @ref{4b2,,compile()}, the compiler expects
@ref{4bb3,,lineno} and @ref{4bb4,,col_offset} attributes for every node that supports
them.  This is rather tedious to fill in for generated nodes, so this helper
adds these attributes recursively where not already set, by setting them to
the values of the parent node.  It works recursively starting at `node'.
@end deffn

@geindex increment_lineno() (ast 모듈)
@anchor{library/ast ast increment_lineno}@anchor{1b0b}
@deffn {함수} ast.increment_lineno (node, n=1)

`node'에서 시작하는 트리에서 각 노드의 줄 번호와 끝 줄 번호를 `n'만큼 증가시킵니다. 파일의 다른 위치로 “코드를 이동”하는 데 유용합니다.
@end deffn

@geindex copy_location() (ast 모듈)
@anchor{library/ast ast copy_location}@anchor{4c10}
@deffn {함수} ast.copy_location (new_node, old_node)

Copy source location (@ref{4bb3,,lineno}, @ref{4bb4,,col_offset}, @ref{4bb5,,end_lineno},
and @ref{4bb6,,end_col_offset}) from `old_node' to `new_node' if possible,
and return `new_node'.
@end deffn

@geindex iter_fields() (ast 모듈)
@anchor{library/ast ast iter_fields}@anchor{4c11}
@deffn {함수} ast.iter_fields (node)

`node'에 존재하는 @code{node._fields}의 각 필드에 대해 @code{(fieldname, value)} 튜플을 산출합니다.
@end deffn

@geindex iter_child_nodes() (ast 모듈)
@anchor{library/ast ast iter_child_nodes}@anchor{4c12}
@deffn {함수} ast.iter_child_nodes (node)

`node'의 모든 직접 자식 노드, 즉 노드인 모든 필드와 노드 리스트인 필드의 모든 항목을 산출합니다.
@end deffn

@geindex walk() (ast 모듈)
@anchor{library/ast ast walk}@anchor{4c13}
@deffn {함수} ast.walk (node)

`node'로 시작하는 트리(`node' 자체를 포함합니다)의 모든 자손 노드를 지정된 순서 없이 재귀적으로 산출합니다. 이는 노드를 제자리에서 수정하고 문맥을 신경 쓰지 않을 때 유용합니다.
@end deffn

@geindex NodeVisitor (ast 클래스)
@anchor{library/ast ast NodeVisitor}@anchor{2f0}
@deffn {클래스} ast.NodeVisitor

추상 구문 트리를 걷고 발견된 모든 노드에 대해 방문자 함수를 호출하는 노드 방문자 베이스 클래스. 이 함수는 @ref{4c14,,visit()} 메서드에 의해 전달되는 값을 반환할 수 있습니다.

이 클래스는 서브 클래싱하고자 하는 것이며, 서브 클래스는 방문자 메서드를 추가합니다.

@geindex visit() (ast.NodeVisitor 메서드)
@anchor{library/ast ast NodeVisitor visit}@anchor{4c14}
@deffn {메서드} visit (node)

노드를 방문합니다. 기본 구현은 @code{self.visit_@var{classname}}이라는 메서드를 호출하는데, 여기서 `classname' 은 노드 클래스의 이름입니다. 또는 이 메서드가 없으면 @ref{4c15,,generic_visit()}를 호출합니다.
@end deffn

@geindex generic_visit() (ast.NodeVisitor 메서드)
@anchor{library/ast ast NodeVisitor generic_visit}@anchor{4c15}
@deffn {메서드} generic_visit (node)

이 방문자는 노드의 자식에 대해 @ref{4c14,,visit()}를 호출합니다.

방문자가 @ref{4c15,,generic_visit()}를 호출하거나 직접 방문하지 않는 한, 사용자 정의 방문자 메서드가 있는 노드의 자식 노드는 방문 되지 않음에 유의하십시오.
@end deffn

@geindex visit_Constant() (ast.NodeVisitor 메서드)
@anchor{library/ast ast NodeVisitor visit_Constant}@anchor{c62}
@deffn {메서드} visit_Constant (node)

Handles all constant nodes.
@end deffn

탐색 중에 노드에 변경 사항을 적용하려면 @ref{2f0,,NodeVisitor}를 사용하지 마십시오. 이를 위해 수정을 허락하는 특수한 방문자(@ref{4c16,,NodeTransformer})가 있습니다.


Deprecated since version 3.8, removed in version 3.14: Methods @code{visit_Num()}, @code{visit_Str()}, @code{visit_Bytes()},
@code{visit_NameConstant()} and @code{visit_Ellipsis()} will not be called
in Python 3.14+.  Add the @ref{c62,,visit_Constant()} method instead to handle
all constant nodes.

@end deffn

@geindex NodeTransformer (ast 클래스)
@anchor{library/ast ast NodeTransformer}@anchor{4c16}
@deffn {클래스} ast.NodeTransformer

추상 구문 트리를 걷고 노드 수정을 허락하는 @ref{2f0,,NodeVisitor} 서브 클래스.

@ref{4c16,,NodeTransformer}는 AST를 걷고 방문자 메서드의 반환 값을 사용하여 이전 노드를 바꾸거나 제거합니다. 방문자 메서드의 반환 값이 @code{None}이면, 노드가 그 위치에서 제거되고, 그렇지 않으면 반환 값으로 치환됩니다. 반환 값은 원래 노드일 수 있으며, 이때는 치환이 일어나지 않습니다.

다음은 모든 이름 조회(@code{foo})를 @code{data['foo']}로 다시 쓰는 변환기 예제입니다:

@example
class RewriteName(NodeTransformer):

    def visit_Name(self, node):
        return Subscript(
            value=Name(id='data', ctx=Load()),
            slice=Constant(value=node.id),
            ctx=node.ctx
        )
@end example

Keep in mind that if the node you’re operating on has child nodes you must
either transform the child nodes yourself or call the @ref{4c15,,generic_visit()}
method for the node first.

문장의 컬렉션의 일부인 노드의 경우 (모든 문장 노드에 적용됩니다), 방문자는 단일 노드가 아닌 노드 리스트를 반환 할 수도 있습니다.

If @code{NodeTransformer} introduces new nodes (that weren’t part of
original tree) without giving them location information (such as
@ref{4bb3,,lineno}), @ref{4c0f,,fix_missing_locations()} should be called with
the new sub-tree to recalculate the location information:

@example
tree = ast.parse('foo', mode='eval')
new_tree = fix_missing_locations(RewriteName().visit(tree))
@end example

일반적으로 다음과 같이 변환기를 사용합니다:

@example
node = YourTransformer().visit(node)
@end example
@end deffn

@geindex dump() (ast 모듈)
@anchor{library/ast ast dump}@anchor{ae1}
@deffn {함수} ast.dump (node, annotate_fields=True, include_attributes=False, *, indent=None, show_empty=False)

`node'에서 포맷된 트리 덤프를 반환합니다. 이것은 주로 디버깅 목적으로 유용합니다. `annotate_fields'가 참이면 (기본값), 반환된 문자열에 필드의 이름과 값이 표시됩니다. `annotate_fields'가 거짓이면, 모호하지 않은 필드 이름을 생략하여 결과 문자열이 더 간결해집니다. 줄 번호와 열 오프셋과 같은 어트리뷰트는 기본적으로 덤프 되지 않습니다. 원한다면, `include_attributes'를 참으로 설정할 수 있습니다.

`indent'가 음이 아닌 정수나 문자열이면, 트리는 그 들여쓰기 수준으로 예쁘게 인쇄됩니다. 들여쓰기 수준 0, 음수 또는 @code{""}는 줄 넘김 만 삽입합니다. @code{None}(기본값)은 단일 줄 표현을 선택합니다. 양의 정수 indent를 사용하면 수준마다 그만큼 들여쓰기 됩니다. `indent'가 문자열(가령 @code{"\t"})이면, 해당 문자열은 각 수준을 들여 쓰는 데 사용됩니다.

If `show_empty' is false (the default), optional empty lists will be
omitted from the output.
Optional @code{None} values are always omitted.


버전 3.9에서 변경: `indent' 옵션을 추가했습니다.



버전 3.13에서 변경: Added the `show_empty' option.

@example
>>> print(ast.dump(ast.parse("""\
... async def f():
...     await other_func()
... """), indent=4, show_empty=True))
Module(
    body=[
        AsyncFunctionDef(
            name='f',
            args=arguments(
                posonlyargs=[],
                args=[],
                kwonlyargs=[],
                kw_defaults=[],
                defaults=[]),
            body=[
                Expr(
                    value=Await(
                        value=Call(
                            func=Name(id='other_func', ctx=Load()),
                            args=[],
                            keywords=[])))],
            decorator_list=[],
            type_params=[])],
    type_ignores=[])
@end example

@end deffn

@node Compiler flags<2>,Command-line usage<7>,ast helpers,ast — Abstract syntax trees
@anchor{library/ast ast-compiler-flags}@anchor{25c7}@anchor{library/ast compiler-flags}@anchor{4c17}
@subsubsection Compiler flags


프로그램 컴파일에 대한 효과를 변경하기 위해 다음 플래그를 @ref{4b2,,compile()}에 전달할 수 있습니다:

@geindex PyCF_ALLOW_TOP_LEVEL_AWAIT (ast 모듈)
@anchor{library/ast ast PyCF_ALLOW_TOP_LEVEL_AWAIT}@anchor{4c18}
@deffn {데이터} ast.PyCF_ALLOW_TOP_LEVEL_AWAIT

최상위 수준 @code{await}, @code{async for}, @code{async with} 및 비동기 컴프리헨션에 대한 지원을 활성화합니다.


Added in version 3.8.

@end deffn

@geindex PyCF_ONLY_AST (ast 모듈)
@anchor{library/ast ast PyCF_ONLY_AST}@anchor{4baf}
@deffn {데이터} ast.PyCF_ONLY_AST

컴파일된 코드 객체를 반환하는 대신 추상 구문 트리를 생성하고 반환합니다.
@end deffn

@geindex PyCF_OPTIMIZED_AST (ast 모듈)
@anchor{library/ast ast PyCF_OPTIMIZED_AST}@anchor{4c19}
@deffn {데이터} ast.PyCF_OPTIMIZED_AST

The returned AST is optimized according to the `optimize' argument
in @ref{4b2,,compile()} or @ref{1c2,,ast.parse()}.


Added in version 3.13.

@end deffn

@geindex PyCF_TYPE_COMMENTS (ast 모듈)
@anchor{library/ast ast PyCF_TYPE_COMMENTS}@anchor{4c0e}
@deffn {데이터} ast.PyCF_TYPE_COMMENTS

@geindex Python 향상 제안; PEP 484
PEP 484@footnote{https://peps.python.org/pep-0484/}와 
@geindex Python 향상 제안; PEP 526
PEP 526@footnote{https://peps.python.org/pep-0526/} 스타일 형 주석(@code{# type: <type>}, @code{# type: ignore <stuff>})에 대한 지원을 활성화합니다.


Added in version 3.8.

@end deffn

@geindex compare() (ast 모듈)
@anchor{library/ast ast compare}@anchor{1bf}
@deffn {함수} ast.compare (a, b, /, *, compare_attributes=False)

Recursively compares two ASTs.

`compare_attributes' affects whether AST attributes are considered
in the comparison. If `compare_attributes' is @code{False} (default), then
attributes are ignored. Otherwise they must all be equal. This
option is useful to check whether the ASTs are structurally equal but
differ in whitespace or similar details. Attributes include line numbers
and column offsets.


Added in version 3.14.

@end deffn

@node Command-line usage<7>,,Compiler flags<2>,ast — Abstract syntax trees
@anchor{library/ast ast-cli}@anchor{4c1a}@anchor{library/ast command-line-usage}@anchor{4c1b}
@subsubsection Command-line usage



Added in version 3.9.


The @code{ast} module can be executed as a script from the command line.
It is as simple as:

@example
python -m ast [-m <mode>] [-a] [infile]
@end example

다음과 같은 옵션이 허용됩니다:

@geindex ast 명령줄 옵션; -h
@geindex ast 명령줄 옵션; --help
@anchor{library/ast cmdoption-ast-h}@anchor{4c1c}@anchor{library/ast cmdoption-ast-help}@anchor{4c1d}
@deffn {Option} @w{-}h, @w{-}@w{-}help

도움말 메시지를 표시하고 종료합니다.
@end deffn

@geindex ast 명령줄 옵션; -m
@geindex ast 명령줄 옵션; --mode
@anchor{library/ast cmdoption-ast-m}@anchor{4c1e}
@deffn {Option} @w{-}m <mode>
@anchor{library/ast cmdoption-ast-mode}@anchor{4c1f}
@deffnx {Option} @w{-}@w{-}mode <mode>

@ref{1c2,,parse()}의 `mode' 인자와 같이, 컴파일해야 하는 코드 종류를 지정합니다.
@end deffn

@geindex ast 명령줄 옵션; --no-type-comments
@anchor{library/ast cmdoption-ast-no-type-comments}@anchor{4c20}
@deffn {Option} @w{-}@w{-}no@w{-}type@w{-}comments

형 주석을 구문 분석하지 않습니다.
@end deffn

@geindex ast 명령줄 옵션; -a
@geindex ast 명령줄 옵션; --include-attributes
@anchor{library/ast cmdoption-ast-a}@anchor{4c21}@anchor{library/ast cmdoption-ast-include-attributes}@anchor{4c22}
@deffn {Option} @w{-}a, @w{-}@w{-}include@w{-}attributes

줄 번호와 열 오프셋과 같은 어트리뷰트를 포함합니다.
@end deffn

@geindex ast 명령줄 옵션; -i
@geindex ast 명령줄 옵션; --indent
@anchor{library/ast cmdoption-ast-i}@anchor{4c23}
@deffn {Option} @w{-}i <indent>
@anchor{library/ast cmdoption-ast-indent}@anchor{4c24}
@deffnx {Option} @w{-}@w{-}indent <indent>

AST에서 노드 들여쓰기(스페이스 수).
@end deffn

@geindex ast 명령줄 옵션; --feature-version
@anchor{library/ast cmdoption-ast-feature-version}@anchor{1c3}
@deffn {Option} @w{-}@w{-}feature@w{-}version <version>

Python version in the format 3.x (for example, 3.10). Defaults to the
current version of the interpreter.


Added in version 3.14.

@end deffn

@geindex ast 명령줄 옵션; -O
@geindex ast 명령줄 옵션; --optimize
@anchor{library/ast cmdoption-ast-O}@anchor{4c25}
@deffn {Option} @w{-}O <level>
@anchor{library/ast cmdoption-ast-optimize}@anchor{1c4}
@deffnx {Option} @w{-}@w{-}optimize <level>

Optimization level for parser. Defaults to no optimization.


Added in version 3.14.

@end deffn

@geindex ast 명령줄 옵션; --show-empty
@anchor{library/ast cmdoption-ast-show-empty}@anchor{1c5}
@deffn {Option} @w{-}@w{-}show@w{-}empty

Show empty lists and fields that are @code{None}. Defaults to not showing empty
objects.


Added in version 3.14.

@end deffn

@code{infile}이 지정되면 그 내용이 AST로 구문 분석되고 stdout에 덤프 됩니다. 그렇지 않으면, stdin에서 내용을 읽습니다.


@subsubheading 더 보기


Green Tree Snakes@footnote{https://greentreesnakes.readthedocs.io/}, 파이썬 AST로 작업하는 것에 대한 자세한 내용이 있는 외부 문서 자원.

ASTTokens@footnote{https://asttokens.readthedocs.io/en/latest/user-guide.html}는 토큰의 위치와 토큰을 생성한 소스 코드의 텍스트로 파이썬 AST에 주석을 추가합니다. 이는 소스 코드 변환을 수행하는 도구에 유용합니다.

leoAst.py@footnote{https://leo-editor.github.io/leo-editor/appendices.html#leoast-py}
unifies the
token-based and parse-tree-based views of python programs by inserting
two-way links between tokens and ast nodes.

LibCST@footnote{https://libcst.readthedocs.io/}는 코드를 ast 트리처럼 보이고 모든 포매팅 세부 정보를 유지하는 구상 구문 트리(Concrete Syntax Tree)로 구문 분석합니다. 자동화된 리팩토링 (codemod) 응용 프로그램과 린터(linter)를 구축하는 데 유용합니다.

Parso@footnote{https://parso.readthedocs.io} is a Python parser that supports
error recovery and round-trip parsing for different Python versions (in
multiple Python versions). Parso is also able to list multiple syntax errors
in your Python file.


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node symtable — 컴파일러 심볼 테이블 액세스,token — 파이썬 구문 분석 트리에 사용되는 상수,ast — Abstract syntax trees,파이썬 언어 서비스
@anchor{library/symtable doc}@anchor{4c26}@anchor{library/symtable module-symtable}@anchor{de}@anchor{library/symtable symtable-access-to-the-compiler-s-symbol-tables}@anchor{4c27}@anchor{library/symtable translation-repo}@anchor{4c28}
@subsection @code{symtable} — 컴파일러 심볼 테이블 액세스


@geindex module; symtable

`소스 코드:' Lib/symtable.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/symtable.py}


__________________________________________________________________


Symbol tables are generated by the compiler from AST just before bytecode is
generated.  The symbol table is responsible for calculating the scope of every
identifier in the code.  @code{symtable} provides an interface to examine these
tables.

@menu
* 심볼 테이블 생성하기:: 
* 심볼 테이블 검사하기:: 
* Command-Line Usage:: 

@end menu

@node 심볼 테이블 생성하기,심볼 테이블 검사하기,,symtable — 컴파일러 심볼 테이블 액세스
@anchor{library/symtable generating-symbol-tables}@anchor{4c29}
@subsubsection 심볼 테이블 생성하기


@geindex symtable() (symtable 모듈)
@anchor{library/symtable symtable symtable}@anchor{1dce}
@deffn {함수} symtable.symtable (code, filename, compile_type)

파이썬 소스 `code'에 대한 최상위 @ref{4c2a,,SymbolTable}을 반환합니다. `filename'은 코드가 들어있는 파일의 이름입니다. `compile_type'은 @ref{4b2,,compile()}에 대한 `mode' 인자와 같습니다.
@end deffn

@node 심볼 테이블 검사하기,Command-Line Usage,심볼 테이블 생성하기,symtable — 컴파일러 심볼 테이블 액세스
@anchor{library/symtable examining-symbol-tables}@anchor{4c2b}
@subsubsection 심볼 테이블 검사하기


@geindex SymbolTableType (symtable 클래스)
@anchor{library/symtable symtable SymbolTableType}@anchor{1953}
@deffn {클래스} symtable.SymbolTableType

An enumeration indicating the type of a @ref{4c2a,,SymbolTable} object.

@geindex MODULE (symtable.SymbolTableType의 속성)
@anchor{library/symtable symtable SymbolTableType MODULE}@anchor{4c2c}
@deffn {속성} MODULE = "module"

Used for the symbol table of a module.
@end deffn

@geindex FUNCTION (symtable.SymbolTableType의 속성)
@anchor{library/symtable symtable SymbolTableType FUNCTION}@anchor{4c2d}
@deffn {속성} FUNCTION = "function"

Used for the symbol table of a function.
@end deffn

@geindex CLASS (symtable.SymbolTableType의 속성)
@anchor{library/symtable symtable SymbolTableType CLASS}@anchor{4c2e}
@deffn {속성} CLASS = "class"

Used for the symbol table of a class.
@end deffn

The following members refer to different flavors of
@ref{4ac,,annotation scopes}.

@geindex ANNOTATION (symtable.SymbolTableType의 속성)
@anchor{library/symtable symtable SymbolTableType ANNOTATION}@anchor{4c2f}
@deffn {속성} ANNOTATION = "annotation"

Used for annotations if @code{from __future__ import annotations} is active.
@end deffn

@geindex TYPE_ALIAS (symtable.SymbolTableType의 속성)
@anchor{library/symtable symtable SymbolTableType TYPE_ALIAS}@anchor{4c30}
@deffn {속성} TYPE_ALIAS = "type alias"

Used for the symbol table of @ref{66b,,type} constructions.
@end deffn

@geindex TYPE_PARAMETERS (symtable.SymbolTableType의 속성)
@anchor{library/symtable symtable SymbolTableType TYPE_PARAMETERS}@anchor{4c31}
@deffn {속성} TYPE_PARAMETERS = "type parameters"

Used for the symbol table of @ref{681,,generic functions}
or @ref{680,,generic classes}.
@end deffn

@geindex TYPE_VARIABLE (symtable.SymbolTableType의 속성)
@anchor{library/symtable symtable SymbolTableType TYPE_VARIABLE}@anchor{4c32}
@deffn {속성} TYPE_VARIABLE = "type variable"

Used for the symbol table of the bound, the constraint tuple or the
default value of a single type variable in the formal sense, i.e.,
a TypeVar, a TypeVarTuple or a ParamSpec object (the latter two do
not support a bound or a constraint tuple).
@end deffn


Added in version 3.13.

@end deffn

@geindex SymbolTable (symtable 클래스)
@anchor{library/symtable symtable SymbolTable}@anchor{4c2a}
@deffn {클래스} symtable.SymbolTable

블록에 대한 이름 공간 테이블. 생성자는 공개되지 않습니다.

@geindex get_type() (symtable.SymbolTable 메서드)
@anchor{library/symtable symtable SymbolTable get_type}@anchor{1954}
@deffn {메서드} get_type ()

심볼 테이블의 형을 돌려줍니다. 가능한 값은 @ref{1953,,SymbolTableType} 열거형의 멤버들입니다.


버전 3.12에서 변경: Added @code{'annotation'},  @code{'TypeVar bound'}, @code{'type alias'},
and @code{'type parameter'} as possible return values.



버전 3.13에서 변경: Return values are members of the @ref{1953,,SymbolTableType} enumeration.

The exact values of the returned string may change in the future,
and thus, it is recommended to use @ref{1953,,SymbolTableType} members
instead of hard-coded strings.

@end deffn

@geindex get_id() (symtable.SymbolTable 메서드)
@anchor{library/symtable symtable SymbolTable get_id}@anchor{4c33}
@deffn {메서드} get_id ()

테이블의 식별자를 돌려줍니다.
@end deffn

@geindex get_name() (symtable.SymbolTable 메서드)
@anchor{library/symtable symtable SymbolTable get_name}@anchor{4c34}
@deffn {메서드} get_name ()

Return the table’s name.  This is the name of the class if the table is
for a class, the name of the function if the table is for a function, or
@code{'top'} if the table is global (@ref{1954,,get_type()} returns @code{'module'}).
For type parameter scopes (which are used for generic classes, functions,
and type aliases), it is the name of the underlying class, function, or
type alias. For type alias scopes, it is the name of the type alias.
For @ref{487,,TypeVar} bound scopes, it is the name of the @code{TypeVar}.
@end deffn

@geindex get_lineno() (symtable.SymbolTable 메서드)
@anchor{library/symtable symtable SymbolTable get_lineno}@anchor{4c35}
@deffn {메서드} get_lineno ()

이 테이블이 나타내는 블록의 첫 번째 줄 번호를 반환합니다.
@end deffn

@geindex is_optimized() (symtable.SymbolTable 메서드)
@anchor{library/symtable symtable SymbolTable is_optimized}@anchor{4c36}
@deffn {메서드} is_optimized ()

이 테이블의 지역(locals)을 최적화할 수 있으면 @code{True}를 반환합니다.
@end deffn

@geindex is_nested() (symtable.SymbolTable 메서드)
@anchor{library/symtable symtable SymbolTable is_nested}@anchor{4c37}
@deffn {메서드} is_nested ()

블록이 중첩된 클래스나 함수면 @code{True}를 반환합니다.
@end deffn

@geindex has_children() (symtable.SymbolTable 메서드)
@anchor{library/symtable symtable SymbolTable has_children}@anchor{4c38}
@deffn {메서드} has_children ()

블록에 중첩된 이름 공간이 있으면 @code{True}를 반환합니다. 이것들은 @ref{4c39,,get_children()}으로 얻을 수 있습니다.
@end deffn

@geindex get_identifiers() (symtable.SymbolTable 메서드)
@anchor{library/symtable symtable SymbolTable get_identifiers}@anchor{4c3a}
@deffn {메서드} get_identifiers ()

Return a view object containing the names of symbols in the table.
See the @ref{26a9,,documentation of view objects}.
@end deffn

@geindex lookup() (symtable.SymbolTable 메서드)
@anchor{library/symtable symtable SymbolTable lookup}@anchor{4c3b}
@deffn {메서드} lookup (name)

테이블에서 `name'을 찾아서 @ref{289,,Symbol} 인스턴스를 반환합니다.
@end deffn

@geindex get_symbols() (symtable.SymbolTable 메서드)
@anchor{library/symtable symtable SymbolTable get_symbols}@anchor{4c3c}
@deffn {메서드} get_symbols ()

테이블에 있는 이름에 대한 @ref{289,,Symbol} 인스턴스 리스트를 반환합니다.
@end deffn

@geindex get_children() (symtable.SymbolTable 메서드)
@anchor{library/symtable symtable SymbolTable get_children}@anchor{4c39}
@deffn {메서드} get_children ()

중첩된 심볼 테이블의 리스트를 반환합니다.
@end deffn
@end deffn

@geindex Function (symtable 클래스)
@anchor{library/symtable symtable Function}@anchor{4c3d}
@deffn {클래스} symtable.Function

함수나 메서드의 이름 공간. 이 클래스는 @ref{4c2a,,SymbolTable}을 상속합니다.

@geindex get_parameters() (symtable.Function 메서드)
@anchor{library/symtable symtable Function get_parameters}@anchor{4c3e}
@deffn {메서드} get_parameters ()

이 함수의 매개 변수 이름을 포함하는 튜플을 반환합니다.
@end deffn

@geindex get_locals() (symtable.Function 메서드)
@anchor{library/symtable symtable Function get_locals}@anchor{4c3f}
@deffn {메서드} get_locals ()

이 함수의 지역 이름을 포함하는 튜플을 반환합니다.
@end deffn

@geindex get_globals() (symtable.Function 메서드)
@anchor{library/symtable symtable Function get_globals}@anchor{4c40}
@deffn {메서드} get_globals ()

이 함수의 전역 이름을 포함하는 튜플을 반환합니다.
@end deffn

@geindex get_nonlocals() (symtable.Function 메서드)
@anchor{library/symtable symtable Function get_nonlocals}@anchor{4c41}
@deffn {메서드} get_nonlocals ()

이 함수에서 명시적으로 선언된 nonlocal 이름을 포함하는 튜플을 반환합니다.
@end deffn

@geindex get_frees() (symtable.Function 메서드)
@anchor{library/symtable symtable Function get_frees}@anchor{4c42}
@deffn {메서드} get_frees ()

이 함수의 @ref{1895,,자유 (클로저) 변수} 이름을 포함하는 튜플을 반환합니다.
@end deffn
@end deffn

@geindex Class (symtable 클래스)
@anchor{library/symtable symtable Class}@anchor{4c43}
@deffn {클래스} symtable.Class

클래스의 이름 공간. 이 클래스는 @ref{4c2a,,SymbolTable}을 상속합니다.

@geindex get_methods() (symtable.Class 메서드)
@anchor{library/symtable symtable Class get_methods}@anchor{31d}
@deffn {메서드} get_methods ()

클래스에서 선언된 메서드 같은 함수의 이름을 포함하는 튜플을 반환합니다.

Here, the term ‘method’ designates `any' function defined in the class
body via @ref{165f,,def} or @ref{7ec,,async def}.

Functions defined in a deeper scope (e.g., in an inner class) are not
picked up by @code{get_methods()}.

예를 들면:

@c import warnings
@c context = warnings.catch_warnings()
@c context.__enter__()
@c warnings.simplefilter("ignore", category=DeprecationWarning)

@c context.__exit__()

@example
>>> import symtable
>>> st = symtable.symtable('@w{'}'
... def outer(): pass
...
... class A:
...    def f():
...        def w(): pass
...
...    def g(self): pass
...
...    @@classmethod
...    async def h(cls): pass
...
...    global outer
...    def outer(self): pass
... '@w{'}', 'test', 'exec')
>>> class_A = st.get_children()[2]
>>> class_A.get_methods()
('f', 'g', 'h')
@end example

Although @code{A().f()} raises @ref{198,,TypeError} at runtime, @code{A.f} is still
considered as a method-like function.


Deprecated since version 3.14, will be removed in version 3.16.

@end deffn
@end deffn

@geindex Symbol (symtable 클래스)
@anchor{library/symtable symtable Symbol}@anchor{289}
@deffn {클래스} symtable.Symbol

소스의 식별자에 해당하는 @ref{4c2a,,SymbolTable}의 항목. 생성자는 공개되지 않습니다.

@geindex get_name() (symtable.Symbol 메서드)
@anchor{library/symtable symtable Symbol get_name}@anchor{4c44}
@deffn {메서드} get_name ()

심볼의 이름을 돌려줍니다.
@end deffn

@geindex is_referenced() (symtable.Symbol 메서드)
@anchor{library/symtable symtable Symbol is_referenced}@anchor{4c45}
@deffn {메서드} is_referenced ()

심볼이 블록에서 사용되면 @code{True}를 반환합니다.
@end deffn

@geindex is_imported() (symtable.Symbol 메서드)
@anchor{library/symtable symtable Symbol is_imported}@anchor{4c46}
@deffn {메서드} is_imported ()

심볼이 import 문에서 만들어지면 @code{True}를 반환합니다.
@end deffn

@geindex is_parameter() (symtable.Symbol 메서드)
@anchor{library/symtable symtable Symbol is_parameter}@anchor{4c47}
@deffn {메서드} is_parameter ()

심볼이 매개 변수면 @code{True}를 반환합니다.
@end deffn

@geindex is_type_parameter() (symtable.Symbol 메서드)
@anchor{library/symtable symtable Symbol is_type_parameter}@anchor{1955}
@deffn {메서드} is_type_parameter ()

Return @code{True} if the symbol is a type parameter.


Added in version 3.14.

@end deffn

@geindex is_global() (symtable.Symbol 메서드)
@anchor{library/symtable symtable Symbol is_global}@anchor{4c48}
@deffn {메서드} is_global ()

심볼이 전역이면 @code{True}를 반환합니다.
@end deffn

@geindex is_nonlocal() (symtable.Symbol 메서드)
@anchor{library/symtable symtable Symbol is_nonlocal}@anchor{1e0a}
@deffn {메서드} is_nonlocal ()

심볼이 nonlocal이면 @code{True}를 반환합니다.
@end deffn

@geindex is_declared_global() (symtable.Symbol 메서드)
@anchor{library/symtable symtable Symbol is_declared_global}@anchor{152a}
@deffn {메서드} is_declared_global ()

심볼이 global 문으로 전역으로 선언되면 @code{True}를 반환합니다.
@end deffn

@geindex is_local() (symtable.Symbol 메서드)
@anchor{library/symtable symtable Symbol is_local}@anchor{4c49}
@deffn {메서드} is_local ()

심볼이 블록의 지역이면 @code{True}를 반환합니다.
@end deffn

@geindex is_annotated() (symtable.Symbol 메서드)
@anchor{library/symtable symtable Symbol is_annotated}@anchor{4c4a}
@deffn {메서드} is_annotated ()

심볼이 어노테이트 되었으면 @code{True}를 반환합니다.


Added in version 3.6.

@end deffn

@geindex is_free() (symtable.Symbol 메서드)
@anchor{library/symtable symtable Symbol is_free}@anchor{4c4b}
@deffn {메서드} is_free ()

심볼이 블록에서 참조되지만 대입되지 않으면 @code{True}를 반환합니다.
@end deffn

@geindex is_free_class() (symtable.Symbol 메서드)
@anchor{library/symtable symtable Symbol is_free_class}@anchor{28c}
@deffn {메서드} is_free_class ()

Return `True' if a class-scoped symbol is free from
the perspective of a method.

Consider the following example:

@example
def f():
    x = 1  # function-scoped
    class C:
        x = 2  # class-scoped
        def method(self):
            return x
@end example

In this example, the class-scoped symbol @code{x} is considered to
be free from the perspective of @code{C.method}, thereby allowing
the latter to return `1' at runtime and not `2'.


Added in version 3.14.

@end deffn

@geindex is_assigned() (symtable.Symbol 메서드)
@anchor{library/symtable symtable Symbol is_assigned}@anchor{4c4c}
@deffn {메서드} is_assigned ()

심볼이 블록에 대입되면 @code{True}를 반환합니다.
@end deffn

@geindex is_comp_iter() (symtable.Symbol 메서드)
@anchor{library/symtable symtable Symbol is_comp_iter}@anchor{28b}
@deffn {메서드} is_comp_iter ()

Return @code{True} if the symbol is a comprehension iteration variable.


Added in version 3.14.

@end deffn

@geindex is_comp_cell() (symtable.Symbol 메서드)
@anchor{library/symtable symtable Symbol is_comp_cell}@anchor{28a}
@deffn {메서드} is_comp_cell ()

Return @code{True} if the symbol is a cell in an inlined comprehension.


Added in version 3.14.

@end deffn

@geindex is_namespace() (symtable.Symbol 메서드)
@anchor{library/symtable symtable Symbol is_namespace}@anchor{4c4d}
@deffn {메서드} is_namespace ()

이름 연결(name binding)이 새로운 이름 공간을 도입하면 @code{True}를 반환합니다.

이름이 함수나 클래스 문의 대상으로 사용되면 참입니다.

예를 들면:

@example
>>> table = symtable.symtable("def some_func(): pass", "string", "exec")
>>> table.lookup("some_func").is_namespace()
True
@end example

하나의 이름을 여러 객체에 연결할 수 있음에 유의하십시오. 결과가 @code{True} 이면, 이름은 새 이름 공간을 도입하지 않는 int 나 list와 같은 다른 객체에도 연결되어있을 수 있습니다.
@end deffn

@geindex get_namespaces() (symtable.Symbol 메서드)
@anchor{library/symtable symtable Symbol get_namespaces}@anchor{4c4e}
@deffn {메서드} get_namespaces ()

이 이름에 연결된 이름 공간의 리스트를 돌려줍니다.
@end deffn

@geindex get_namespace() (symtable.Symbol 메서드)
@anchor{library/symtable symtable Symbol get_namespace}@anchor{4c4f}
@deffn {메서드} get_namespace ()

이 이름에 연결된 이름 공간을 돌려줍니다. 이 이름에 연결된 이름 공간이 둘 이상이거나 없으면, @ref{2ec,,ValueError}가 발생합니다.
@end deffn
@end deffn

@node Command-Line Usage,,심볼 테이블 검사하기,symtable — 컴파일러 심볼 테이블 액세스
@anchor{library/symtable command-line-usage}@anchor{4c50}@anchor{library/symtable symtable-cli}@anchor{4c51}
@subsubsection Command-Line Usage



Added in version 3.13.


The @code{symtable} module can be executed as a script from the command line.

@example
python -m symtable [infile...]
@end example

Symbol tables are generated for the specified Python source files and
dumped to stdout.
If no input file is specified, the content is read from stdin.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node token — 파이썬 구문 분석 트리에 사용되는 상수,keyword — 파이썬 키워드 검사,symtable — 컴파일러 심볼 테이블 액세스,파이썬 언어 서비스
@anchor{library/token doc}@anchor{4c52}@anchor{library/token module-token}@anchor{100}@anchor{library/token token-constants-used-with-python-parse-trees}@anchor{4c53}@anchor{library/token translation-repo}@anchor{4c54}
@subsection @code{token} — 파이썬 구문 분석 트리에 사용되는 상수


@geindex module; token

`소스 코드:' Lib/token.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/token.py}


__________________________________________________________________


이 모듈은 구문 분석 트리의 말단 노드의 숫자 값을 나타내는 상수를 제공합니다 (터미널 토큰). 언어 문법의 문맥에서 이름의 정의는 파이썬 배포판의 @code{Grammar/Tokens} 파일을 참조하십시오. 이름이 매핑되는 특정 숫자 값은 파이썬 버전 간에 변경될 수 있습니다.

이 모듈은 숫자 코드에서 이름으로의 매핑과 몇몇 함수도 제공합니다. 이 함수는 파이썬 C 헤더 파일의 정의를 반영합니다.

Note that a token’s value may depend on tokenizer options. For example, a
@code{"+"} token may be reported as either @ref{4c55,,PLUS} or @ref{2287,,OP}, or
a @code{"match"} token may be either @ref{22b6,,NAME} or @ref{4c56,,SOFT_KEYWORD}.

@geindex tok_name (token 모듈)
@anchor{library/token token tok_name}@anchor{4c57}
@deffn {데이터} token.tok_name

이 모듈에 정의된 상수의 숫자 값을 다시 이름 문자열로 매핑하여 사람이 읽을 수 있는 구문 분석 트리 표현을 생성할 수 있도록 하는 딕셔너리.
@end deffn

@geindex ISTERMINAL() (token 모듈)
@anchor{library/token token ISTERMINAL}@anchor{4c58}
@deffn {함수} token.ISTERMINAL (x)

터미널 토큰값이면 @code{True}를 반환합니다.
@end deffn

@geindex ISNONTERMINAL() (token 모듈)
@anchor{library/token token ISNONTERMINAL}@anchor{4c59}
@deffn {함수} token.ISNONTERMINAL (x)

비 터미널 토큰값이면 @code{True}를 반환합니다.
@end deffn

@geindex ISEOF() (token 모듈)
@anchor{library/token token ISEOF}@anchor{4c5a}
@deffn {함수} token.ISEOF (x)

`x'가 입력의 마지막을 나타내는 표시면 @code{True}를 반환합니다.
@end deffn

토큰 상수는 다음과 같습니다:

@geindex NAME (token 모듈)
@anchor{library/token token NAME}@anchor{22b6}
@deffn {데이터} token.NAME

Token value that indicates an @ref{229d,,identifier or keyword}.
@end deffn

@geindex NUMBER (token 모듈)
@anchor{library/token token NUMBER}@anchor{22b7}
@deffn {데이터} token.NUMBER

Token value that indicates a @ref{229e,,numeric literal}
@end deffn

@geindex STRING (token 모듈)
@anchor{library/token token STRING}@anchor{22b8}
@deffn {데이터} token.STRING

Token value that indicates a @ref{229c,,string or byte literal},
excluding @ref{19a,,formatted string literals}.
The token string is not interpreted:
it includes the surrounding quotation marks and the prefix (if given);
backslashes are included literally, without processing escape sequences.
@end deffn

@geindex OP (token 모듈)
@anchor{library/token token OP}@anchor{2287}
@deffn {데이터} token.OP

A generic token value that indicates an
@ref{2289,,operator} or @ref{2288,,delimiter}.

`CPython 구현 상세:' This value is only reported by the @ref{101,,tokenize} module.
Internally, the tokenizer uses
@ref{231b,,exact token types} instead.
@end deffn

@geindex COMMENT (token 모듈)
@anchor{library/token token COMMENT}@anchor{4c5b}
@deffn {데이터} token.COMMENT

주석을 나타내는 데 사용되는 토큰값. 구문 분석기는 @code{COMMENT} 토큰을 무시합니다.
@end deffn

@geindex NEWLINE (token 모듈)
@anchor{library/token token NEWLINE}@anchor{2291}
@deffn {데이터} token.NEWLINE

Token value that indicates the end of a @ref{22a2,,logical line}.
@end deffn

@geindex NL (token 모듈)
@anchor{library/token token NL}@anchor{4c5c}
@deffn {데이터} token.NL

비종결 줄넘김을 나타내는데 사용되는 토큰값. @code{NL} 토큰은 코드의 논리적 줄이 여러 물리적 줄로 이어질 때 생성됩니다. 구문 분석기는 @code{NL} 토큰을 무시합니다.
@end deffn

@geindex INDENT (token 모듈)
@anchor{library/token token INDENT}@anchor{20fa}
@deffn {데이터} token.INDENT

Token value used at the beginning of a @ref{22a2,,logical line}
to indicate the start of an @ref{2299,,indented block}.
@end deffn

@geindex DEDENT (token 모듈)
@anchor{library/token token DEDENT}@anchor{22af}
@deffn {데이터} token.DEDENT

Token value used at the beginning of a @ref{22a2,,logical line}
to indicate the end of an @ref{2299,,indented block}.
@end deffn

@geindex FSTRING_START (token 모듈)
@anchor{library/token token FSTRING_START}@anchor{22ee}
@deffn {데이터} token.FSTRING_START

Token value used to indicate the beginning of an
@ref{19a,,f-string literal}.

`CPython 구현 상세:' The token string includes the prefix and the opening quote(s), but none
of the contents of the literal.
@end deffn

@geindex FSTRING_MIDDLE (token 모듈)
@anchor{library/token token FSTRING_MIDDLE}@anchor{22ef}
@deffn {데이터} token.FSTRING_MIDDLE

Token value used for literal text inside an @ref{19a,,f-string literal},
including format specifications.

`CPython 구현 상세:' Replacement fields (that is, the non-literal parts of f-strings) use
the same tokens as other expressions, and are delimited by
@ref{4c5d,,LBRACE}, @ref{4c5e,,RBRACE}, @ref{4c5f,,EXCLAMATION} and @ref{4c60,,COLON}
tokens.
@end deffn

@geindex FSTRING_END (token 모듈)
@anchor{library/token token FSTRING_END}@anchor{22f0}
@deffn {데이터} token.FSTRING_END

@ref{19a,,f-string}의 끝을 나타내는 데 사용되는 토큰값.

`CPython 구현 상세:' The token string contains the closing quote(s).
@end deffn

@geindex TSTRING_START (token 모듈)
@anchor{library/token token TSTRING_START}@anchor{4c61}
@deffn {데이터} token.TSTRING_START

Token value used to indicate the beginning of a template string literal.

`CPython 구현 상세:' The token string includes the prefix and the opening quote(s), but none
of the contents of the literal.


Added in version 3.14.

@end deffn

@geindex TSTRING_MIDDLE (token 모듈)
@anchor{library/token token TSTRING_MIDDLE}@anchor{4c62}
@deffn {데이터} token.TSTRING_MIDDLE

Token value used for literal text inside a template string literal
including format specifications.

`CPython 구현 상세:' Replacement fields (that is, the non-literal parts of t-strings) use
the same tokens as other expressions, and are delimited by
@ref{4c5d,,LBRACE}, @ref{4c5e,,RBRACE}, @ref{4c5f,,EXCLAMATION} and @ref{4c60,,COLON}
tokens.


Added in version 3.14.

@end deffn

@geindex TSTRING_END (token 모듈)
@anchor{library/token token TSTRING_END}@anchor{4c63}
@deffn {데이터} token.TSTRING_END

Token value used to indicate the end of a template string literal.

`CPython 구현 상세:' The token string contains the closing quote(s).


Added in version 3.14.

@end deffn

@geindex ENDMARKER (token 모듈)
@anchor{library/token token ENDMARKER}@anchor{22b3}
@deffn {데이터} token.ENDMARKER

Token value that indicates the end of input.
Used in @ref{259a,,top-level grammar rules}.
@end deffn

@geindex ENCODING (token 모듈)
@anchor{library/token token ENCODING}@anchor{4c64}
@deffn {데이터} token.ENCODING

소스 바이트열을 텍스트로 디코딩하는 데 사용되는 인코딩을 나타내는 토큰값. @ref{6ff,,tokenize.tokenize()}에 의해 반환되는 첫 번째 토큰은 항상 @code{ENCODING} 토큰입니다.

이 토큰 유형은 C 토크나이저가 사용하지 않지만 @ref{101,,tokenize} 모듈에 필요합니다.
@end deffn

The following token types are not produced by the @ref{101,,tokenize} module,
and are defined for special uses in the tokenizer or parser:

@geindex TYPE_IGNORE (token 모듈)
@anchor{library/token token TYPE_IGNORE}@anchor{4c65}
@deffn {데이터} token.TYPE_IGNORE

@code{type: ignore} 주석이 인식되었음을 나타내는 토큰값. 이러한 토큰은 @ref{4c0e,,PyCF_TYPE_COMMENTS} 플래그가 있는 경우에만 일반 @ref{4c5b,,COMMENT} 토큰 대신 생성됩니다.
@end deffn

@geindex TYPE_COMMENT (token 모듈)
@anchor{library/token token TYPE_COMMENT}@anchor{4c66}
@deffn {데이터} token.TYPE_COMMENT

형 주석이 인식되었음을 나타내는 토큰값. 이러한 토큰은 @ref{4c0e,,PyCF_TYPE_COMMENTS} 플래그가 있는 경우에만 일반 @ref{4c5b,,COMMENT} 토큰 대신 생성됩니다.
@end deffn

@geindex SOFT_KEYWORD (token 모듈)
@anchor{library/token token SOFT_KEYWORD}@anchor{4c56}
@deffn {데이터} token.SOFT_KEYWORD

Token value indicating a @ref{a0d,,soft keyword}.

The tokenizer never produces this value.
To check for a soft keyword, pass a @ref{22b6,,NAME} token’s string to
@ref{4c67,,keyword.issoftkeyword()}.
@end deffn

@geindex ERRORTOKEN (token 모듈)
@anchor{library/token token ERRORTOKEN}@anchor{4c68}
@deffn {데이터} token.ERRORTOKEN

잘못된 입력을 나타내는 데 사용되는 토큰값.

The @ref{101,,tokenize} module generally indicates errors by
raising exceptions instead of emitting this token.
It can also emit tokens such as @ref{2287,,OP} or @ref{22b6,,NAME} with strings that
are later rejected by the parser.
@end deffn
@anchor{library/token token-operators-delimiters}@anchor{231b}
The remaining tokens represent specific @ref{2289,,operators} and
@ref{2288,,delimiters}.
(The @ref{101,,tokenize} module reports these as @ref{2287,,OP}; see @code{exact_type}
in the @code{tokenize} documentation for details.)

@c Auto-generated by Tools/build/generate_token.py


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

토큰

@tab

값

@item

@geindex LPAR (token 모듈)
@anchor{library/token token LPAR}@anchor{4c69}
@deffn {데이터} token.LPAR
@end deffn

@tab

@code{"("}

@item

@geindex RPAR (token 모듈)
@anchor{library/token token RPAR}@anchor{4c6a}
@deffn {데이터} token.RPAR
@end deffn

@tab

@code{")"}

@item

@geindex LSQB (token 모듈)
@anchor{library/token token LSQB}@anchor{4c6b}
@deffn {데이터} token.LSQB
@end deffn

@tab

@code{"["}

@item

@geindex RSQB (token 모듈)
@anchor{library/token token RSQB}@anchor{4c6c}
@deffn {데이터} token.RSQB
@end deffn

@tab

@code{"]"}

@item

@geindex COLON (token 모듈)
@anchor{library/token token COLON}@anchor{4c60}
@deffn {데이터} token.COLON
@end deffn

@tab

@code{":"}

@item

@geindex COMMA (token 모듈)
@anchor{library/token token COMMA}@anchor{4c6d}
@deffn {데이터} token.COMMA
@end deffn

@tab

@code{","}

@item

@geindex SEMI (token 모듈)
@anchor{library/token token SEMI}@anchor{4c6e}
@deffn {데이터} token.SEMI
@end deffn

@tab

@code{";"}

@item

@geindex PLUS (token 모듈)
@anchor{library/token token PLUS}@anchor{4c55}
@deffn {데이터} token.PLUS
@end deffn

@tab

@code{"+"}

@item

@geindex MINUS (token 모듈)
@anchor{library/token token MINUS}@anchor{4c6f}
@deffn {데이터} token.MINUS
@end deffn

@tab

@code{"-"}

@item

@geindex STAR (token 모듈)
@anchor{library/token token STAR}@anchor{4c70}
@deffn {데이터} token.STAR
@end deffn

@tab

@code{"*"}

@item

@geindex SLASH (token 모듈)
@anchor{library/token token SLASH}@anchor{4c71}
@deffn {데이터} token.SLASH
@end deffn

@tab

@code{"/"}

@item

@geindex VBAR (token 모듈)
@anchor{library/token token VBAR}@anchor{4c72}
@deffn {데이터} token.VBAR
@end deffn

@tab

@code{"|"}

@item

@geindex AMPER (token 모듈)
@anchor{library/token token AMPER}@anchor{4c73}
@deffn {데이터} token.AMPER
@end deffn

@tab

@code{"&"}

@item

@geindex LESS (token 모듈)
@anchor{library/token token LESS}@anchor{4c74}
@deffn {데이터} token.LESS
@end deffn

@tab

@code{"<"}

@item

@geindex GREATER (token 모듈)
@anchor{library/token token GREATER}@anchor{4c75}
@deffn {데이터} token.GREATER
@end deffn

@tab

@code{">"}

@item

@geindex EQUAL (token 모듈)
@anchor{library/token token EQUAL}@anchor{4c76}
@deffn {데이터} token.EQUAL
@end deffn

@tab

@code{"="}

@item

@geindex DOT (token 모듈)
@anchor{library/token token DOT}@anchor{4c77}
@deffn {데이터} token.DOT
@end deffn

@tab

@code{"."}

@item

@geindex PERCENT (token 모듈)
@anchor{library/token token PERCENT}@anchor{4c78}
@deffn {데이터} token.PERCENT
@end deffn

@tab

@code{"%"}

@item

@geindex LBRACE (token 모듈)
@anchor{library/token token LBRACE}@anchor{4c5d}
@deffn {데이터} token.LBRACE
@end deffn

@tab

@code{"@{"}

@item

@geindex RBRACE (token 모듈)
@anchor{library/token token RBRACE}@anchor{4c5e}
@deffn {데이터} token.RBRACE
@end deffn

@tab

@code{"@}"}

@item

@geindex EQEQUAL (token 모듈)
@anchor{library/token token EQEQUAL}@anchor{4c79}
@deffn {데이터} token.EQEQUAL
@end deffn

@tab

@code{"=="}

@item

@geindex NOTEQUAL (token 모듈)
@anchor{library/token token NOTEQUAL}@anchor{4c7a}
@deffn {데이터} token.NOTEQUAL
@end deffn

@tab

@code{"!="}

@item

@geindex LESSEQUAL (token 모듈)
@anchor{library/token token LESSEQUAL}@anchor{4c7b}
@deffn {데이터} token.LESSEQUAL
@end deffn

@tab

@code{"<="}

@item

@geindex GREATEREQUAL (token 모듈)
@anchor{library/token token GREATEREQUAL}@anchor{4c7c}
@deffn {데이터} token.GREATEREQUAL
@end deffn

@tab

@code{">="}

@item

@geindex TILDE (token 모듈)
@anchor{library/token token TILDE}@anchor{4c7d}
@deffn {데이터} token.TILDE
@end deffn

@tab

@code{"~"}

@item

@geindex CIRCUMFLEX (token 모듈)
@anchor{library/token token CIRCUMFLEX}@anchor{4c7e}
@deffn {데이터} token.CIRCUMFLEX
@end deffn

@tab

@code{"^"}

@item

@geindex LEFTSHIFT (token 모듈)
@anchor{library/token token LEFTSHIFT}@anchor{4c7f}
@deffn {데이터} token.LEFTSHIFT
@end deffn

@tab

@code{"<<"}

@item

@geindex RIGHTSHIFT (token 모듈)
@anchor{library/token token RIGHTSHIFT}@anchor{4c80}
@deffn {데이터} token.RIGHTSHIFT
@end deffn

@tab

@code{">>"}

@item

@geindex DOUBLESTAR (token 모듈)
@anchor{library/token token DOUBLESTAR}@anchor{4c81}
@deffn {데이터} token.DOUBLESTAR
@end deffn

@tab

@code{"**"}

@item

@geindex PLUSEQUAL (token 모듈)
@anchor{library/token token PLUSEQUAL}@anchor{4c82}
@deffn {데이터} token.PLUSEQUAL
@end deffn

@tab

@code{"+="}

@item

@geindex MINEQUAL (token 모듈)
@anchor{library/token token MINEQUAL}@anchor{4c83}
@deffn {데이터} token.MINEQUAL
@end deffn

@tab

@code{"-="}

@item

@geindex STAREQUAL (token 모듈)
@anchor{library/token token STAREQUAL}@anchor{4c84}
@deffn {데이터} token.STAREQUAL
@end deffn

@tab

@code{"*="}

@item

@geindex SLASHEQUAL (token 모듈)
@anchor{library/token token SLASHEQUAL}@anchor{4c85}
@deffn {데이터} token.SLASHEQUAL
@end deffn

@tab

@code{"/="}

@item

@geindex PERCENTEQUAL (token 모듈)
@anchor{library/token token PERCENTEQUAL}@anchor{4c86}
@deffn {데이터} token.PERCENTEQUAL
@end deffn

@tab

@code{"%="}

@item

@geindex AMPEREQUAL (token 모듈)
@anchor{library/token token AMPEREQUAL}@anchor{4c87}
@deffn {데이터} token.AMPEREQUAL
@end deffn

@tab

@code{"&="}

@item

@geindex VBAREQUAL (token 모듈)
@anchor{library/token token VBAREQUAL}@anchor{4c88}
@deffn {데이터} token.VBAREQUAL
@end deffn

@tab

@code{"|="}

@item

@geindex CIRCUMFLEXEQUAL (token 모듈)
@anchor{library/token token CIRCUMFLEXEQUAL}@anchor{4c89}
@deffn {데이터} token.CIRCUMFLEXEQUAL
@end deffn

@tab

@code{"^="}

@item

@geindex LEFTSHIFTEQUAL (token 모듈)
@anchor{library/token token LEFTSHIFTEQUAL}@anchor{4c8a}
@deffn {데이터} token.LEFTSHIFTEQUAL
@end deffn

@tab

@code{"<<="}

@item

@geindex RIGHTSHIFTEQUAL (token 모듈)
@anchor{library/token token RIGHTSHIFTEQUAL}@anchor{4c8b}
@deffn {데이터} token.RIGHTSHIFTEQUAL
@end deffn

@tab

@code{">>="}

@item

@geindex DOUBLESTAREQUAL (token 모듈)
@anchor{library/token token DOUBLESTAREQUAL}@anchor{4c8c}
@deffn {데이터} token.DOUBLESTAREQUAL
@end deffn

@tab

@code{"**="}

@item

@geindex DOUBLESLASH (token 모듈)
@anchor{library/token token DOUBLESLASH}@anchor{4c8d}
@deffn {데이터} token.DOUBLESLASH
@end deffn

@tab

@code{"//"}

@item

@geindex DOUBLESLASHEQUAL (token 모듈)
@anchor{library/token token DOUBLESLASHEQUAL}@anchor{4c8e}
@deffn {데이터} token.DOUBLESLASHEQUAL
@end deffn

@tab

@code{"//="}

@item

@geindex AT (token 모듈)
@anchor{library/token token AT}@anchor{4c8f}
@deffn {데이터} token.AT
@end deffn

@tab

@code{"@@"}

@item

@geindex ATEQUAL (token 모듈)
@anchor{library/token token ATEQUAL}@anchor{4c90}
@deffn {데이터} token.ATEQUAL
@end deffn

@tab

@code{"@@="}

@item

@geindex RARROW (token 모듈)
@anchor{library/token token RARROW}@anchor{4c91}
@deffn {데이터} token.RARROW
@end deffn

@tab

@code{"->"}

@item

@geindex ELLIPSIS (token 모듈)
@anchor{library/token token ELLIPSIS}@anchor{4c92}
@deffn {데이터} token.ELLIPSIS
@end deffn

@tab

@code{"..."}

@item

@geindex COLONEQUAL (token 모듈)
@anchor{library/token token COLONEQUAL}@anchor{4c93}
@deffn {데이터} token.COLONEQUAL
@end deffn

@tab

@code{":="}

@item

@geindex EXCLAMATION (token 모듈)
@anchor{library/token token EXCLAMATION}@anchor{4c5f}
@deffn {데이터} token.EXCLAMATION
@end deffn

@tab

@code{"!"}

@end multitable


다음과 같은 토큰이 아닌 상수가 제공됩니다:

@geindex N_TOKENS (token 모듈)
@anchor{library/token token N_TOKENS}@anchor{4c94}
@deffn {데이터} token.N_TOKENS

The number of token types defined in this module.
@end deffn

@c NT_OFFSET is deliberately undocumented; if you need it you should be
@c reading the source

@geindex EXACT_TOKEN_TYPES (token 모듈)
@anchor{library/token token EXACT_TOKEN_TYPES}@anchor{18e8}
@deffn {데이터} token.EXACT_TOKEN_TYPES

A dictionary mapping the string representation of a token to its numeric code.


Added in version 3.8.

@end deffn


버전 3.5에서 변경: @code{AWAIT} 와 @code{ASYNC} 토큰이 추가되었습니다.



버전 3.7에서 변경: @ref{4c5b,,COMMENT}, @ref{4c5c,,NL} 및 @ref{4c64,,ENCODING} 토큰이 추가되었습니다.



버전 3.7에서 변경: @code{AWAIT} 와 @code{ASYNC} 토큰이 제거되었습니다. “async”와 “await”는 이제 @ref{22b6,,NAME} 토큰으로 토큰화됩니다.



버전 3.8에서 변경: @ref{4c66,,TYPE_COMMENT}, @ref{4c65,,TYPE_IGNORE}, @ref{4c93,,COLONEQUAL}이 추가되었습니다. @code{AWAIT}와 @code{ASYNC} 토큰을 다시 추가했습니다 (@code{feature_version}을 6 이하로 설정하여 @ref{1c2,,ast.parse()}로 구형 파이썬 버전의 구문 분석을 지원하는 데 필요합니다).



버전 3.12에서 변경: @ref{4c5f,,EXCLAMATION}을 추가했습니다.



버전 3.13에서 변경: @code{AWAIT} 와 @code{ASYNC} 토큰을 다시 제거했습니다.


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node keyword — 파이썬 키워드 검사,tokenize — 파이썬 소스를 위한 토크나이저,token — 파이썬 구문 분석 트리에 사용되는 상수,파이썬 언어 서비스
@anchor{library/keyword doc}@anchor{4c95}@anchor{library/keyword keyword-testing-for-python-keywords}@anchor{4c96}@anchor{library/keyword module-keyword}@anchor{88}@anchor{library/keyword translation-repo}@anchor{4c97}
@subsection @code{keyword} — 파이썬 키워드 검사


@geindex module; keyword

`소스 코드:' Lib/keyword.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/keyword.py}


__________________________________________________________________


이 모듈은 파이썬 프로그램이 문자열이 @ref{2286,,키워드} 나 @ref{a0d,,소프트 키워드}인지 판단하게 합니다.

@geindex iskeyword() (keyword 모듈)
@anchor{library/keyword keyword iskeyword}@anchor{2650}
@deffn {함수} keyword.iskeyword (s)

`s'가 파이썬 @ref{2286,,키워드}면 @code{True}를 반환합니다.
@end deffn

@geindex kwlist (keyword 모듈)
@anchor{library/keyword keyword kwlist}@anchor{4c98}
@deffn {데이터} keyword.kwlist

인터프리터에 대해 정의된 모든 @ref{2286,,키워드}를 포함하는 시퀀스. 특정 @ref{0,,__future__} 문이 적용될 때만 활성화되도록 키워드가 정의되어 있으면, 이러한 키워드도 함께 포함됩니다.
@end deffn

@geindex issoftkeyword() (keyword 모듈)
@anchor{library/keyword keyword issoftkeyword}@anchor{4c67}
@deffn {함수} keyword.issoftkeyword (s)

`s'가 파이썬 @ref{a0d,,소프트 키워드}면 @code{True}를 반환합니다.


Added in version 3.9.

@end deffn

@geindex softkwlist (keyword 모듈)
@anchor{library/keyword keyword softkwlist}@anchor{4c99}
@deffn {데이터} keyword.softkwlist

인터프리터에 대해 정의된 모든 @ref{a0d,,소프트 키워드}를 포함하는 시퀀스. 특정 @ref{0,,__future__} 문이 적용될 때만 활성화되도록 소프트(soft) 키워드가 정의되어 있으면, 이러한 키워드도 함께 포함됩니다.


Added in version 3.9.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node tokenize — 파이썬 소스를 위한 토크나이저,tabnanny — 모호한 들여쓰기 감지,keyword — 파이썬 키워드 검사,파이썬 언어 서비스
@anchor{library/tokenize doc}@anchor{4c9a}@anchor{library/tokenize module-tokenize}@anchor{101}@anchor{library/tokenize tokenize-tokenizer-for-python-source}@anchor{4c9b}@anchor{library/tokenize translation-repo}@anchor{4c9c}
@subsection @code{tokenize} — 파이썬 소스를 위한 토크나이저


@geindex module; tokenize

`소스 코드:' Lib/tokenize.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/tokenize.py}


__________________________________________________________________


The @code{tokenize} module provides a lexical scanner for Python source code,
implemented in Python.  The scanner in this module returns comments as tokens
as well, making it useful for implementing “pretty-printers”, including
colorizers for on-screen displays.

토큰 스트림 처리를 단순화하기 위해, 모든 @ref{2289,,연산자}와 @ref{2288,,구분자} 토큰과 @ref{2325,,Ellipsis}는 범용 @ref{2287,,OP} 토큰 유형을 사용하여 반환됩니다. 정확한 유형은 @ref{6ff,,tokenize.tokenize()}에서 반환된 @ref{85d,,네임드 튜플}의 @code{exact_type} 프로퍼티를 확인하여 파악할 수 있습니다.

@cartouche
@quotation 경고 
Note that the functions in this module are only designed to parse
syntactically valid Python code (code that does not raise when parsed
using @ref{1c2,,ast.parse()}).  The behavior of the functions in this module is
`undefined' when providing invalid Python code and it can change at any
point.
@end quotation
@end cartouche

@menu
* 입력 토큰화하기:: 
* 명령 줄 사용법: 명령 줄 사용법<2>. 
* 예제: 예제<30>. 

@end menu

@node 입력 토큰화하기,명령 줄 사용법<2>,,tokenize — 파이썬 소스를 위한 토크나이저
@anchor{library/tokenize tokenizing-input}@anchor{4c9d}
@subsubsection 입력 토큰화하기


기본 진입점은 @ref{1260,,제너레이터}입니다:

@geindex tokenize() (tokenize 모듈)
@anchor{library/tokenize tokenize tokenize}@anchor{6ff}
@deffn {함수} tokenize.tokenize (readline)

@ref{6ff,,tokenize()} 제너레이터는 하나의 인자 `readline'을 요구합니다. 이 인자는 파일 객체의 @ref{152e,,io.IOBase.readline()} 메서드와 같은 인터페이스를 제공하는 콜러블 객체여야 합니다. 함수를 호출할 때마다 한 줄의 입력을 바이트열로 반환해야 합니다.

제너레이터는 다음 멤버를 갖는 5-튜플을 생성합니다: 토큰 유형; 토큰 문자열; 토큰이 소스에서 시작하는 줄과 열을 지정하는 정수의 2-튜플 @code{(srow, scol)}; 토큰이 소스에서 끝나는 줄과 열을 지정하는 정수의 2-튜플 @code{(erow, ecol)}과 토큰이 발견된 줄. 전달된 줄(마지막 튜플 항목)은 `물리적' 줄입니다. 5-튜플은 필드 이름이 @code{type string start end line} 인 @ref{85d,,네임드 튜플}로 반환됩니다.

반환된 @ref{85d,,네임드 튜플}에는 @ref{2287,,OP} 토큰에 대한 정확한 연산자 유형이 포함된 @code{exact_type}이라는 추가 프로퍼티가 있습니다. 다른 모든 토큰 유형에서 @code{exact_type}은 네임드 튜플 @code{type} 필드와 같습니다.


버전 3.1에서 변경: 네임드 튜플에 대한 지원이 추가되었습니다.



버전 3.3에서 변경: @code{exact_type}에 대한 지원이 추가되었습니다.


@ref{6ff,,tokenize()}는 
@geindex Python 향상 제안; PEP 263
PEP 263@footnote{https://peps.python.org/pep-0263/}에 따라 UTF-8 BOM이나 인코딩 쿠키를 찾아 파일의 소스 인코딩을 결정합니다.
@end deffn

@geindex generate_tokens() (tokenize 모듈)
@anchor{library/tokenize tokenize generate_tokens}@anchor{700}
@deffn {함수} tokenize.generate_tokens (readline)

바이트열 대신에 유니코드 문자열을 읽는 소스를 토큰화합니다.

@ref{6ff,,tokenize()}와 마찬가지로, `readline' 인자는 한 줄의 입력을 반환하는 콜러블입니다. 그러나, @ref{700,,generate_tokens()}는 `readline'이 바이트열이 아닌 문자열 객체를 반환할 것으로 기대합니다.

결과는 정확히 @ref{6ff,,tokenize()}처럼 네임드 튜플을 산출하는 이터레이터입니다. @ref{4c64,,ENCODING} 토큰을 산출하지 않습니다.
@end deffn

All constants from the @ref{100,,token} module are also exported from
@code{tokenize}.

토큰화 프로세스를 역전시키는 또 다른 함수가 제공됩니다. 이것은 스크립트를 토큰화하고, 토큰 스트림을 수정한 후, 수정된 스크립트를 다시 쓰는 도구를 만드는 데 유용합니다.

@geindex untokenize() (tokenize 모듈)
@anchor{library/tokenize tokenize untokenize}@anchor{18b4}
@deffn {함수} tokenize.untokenize (iterable)

토큰을 파이썬 소스 코드로 역 변환합니다. `iterable'은 최소한 토큰 유형과 토큰 문자열의 두 요소가 있는 시퀀스를 반환해야 합니다. 추가 시퀀스 요소는 무시됩니다.

결과는 다시 토큰화하면 입력과 일치함이 보장되어, 변환은 무손실이고 왕복이 보장됩니다. 보증은 토큰 유형과 토큰 문자열에만 적용되어, 토큰 간의 간격(열 위치)은 변경될 수 있습니다.

@ref{6ff,,tokenize()} 에 의해 출력되는 첫 번째 토큰 시퀀스인 @ref{4c64,,ENCODING} 토큰을 사용하여 인코딩된 바이트열을 반환합니다. 입력에 인코딩 토큰이 없으면, 대신 str을 반환합니다.
@end deffn

@ref{6ff,,tokenize()}는 토큰화하는 소스 파일의 인코딩을 감지해야 합니다. 이 작업을 수행하는 데 사용되는 함수를 사용할 수 있습니다:

@geindex detect_encoding() (tokenize 모듈)
@anchor{library/tokenize tokenize detect_encoding}@anchor{17be}
@deffn {함수} tokenize.detect_encoding (readline)

@ref{17be,,detect_encoding()} 함수는 파이썬 소스 파일을 디코딩할 때 사용해야 하는 인코딩을 감지하는 데 사용됩니다. @ref{6ff,,tokenize()} 제너레이터와 같은 방식으로, 하나의 인자 readline을 요구합니다.

readline을 최대 두 번 호출하고, 사용된 인코딩(문자열로)과 읽은 줄들(바이트열에서 디코드 되지 않습니다)의 리스트를 반환합니다.

@geindex Python 향상 제안; PEP 263
PEP 263@footnote{https://peps.python.org/pep-0263/}에 지정된 대로 UTF-8 BOM이나 인코딩 쿠키의 존재로부터 인코딩을 검색합니다. BOM과 쿠키가 모두 있지만 서로 일치하지 않으면 @ref{18e,,SyntaxError}가 발생합니다. BOM이 발견되면, @code{'utf-8-sig'}가 인코딩으로 반환됩니다.

인코딩이 지정되지 않으면, 기본값인 @code{'utf-8'}이 반환됩니다.

@ref{2d06,,open()}을 사용하여 파이썬 소스 파일을 여십시오: @ref{17be,,detect_encoding()}을 사용하여 파일 인코딩을 감지합니다.
@end deffn

@geindex open() (tokenize 모듈)
@anchor{library/tokenize tokenize open}@anchor{2d06}
@deffn {함수} tokenize.open (filename)

@ref{17be,,detect_encoding()}에 의해 감지된 인코딩을 사용하여 읽기 전용 모드로 파일을 엽니다.


Added in version 3.2.

@end deffn

@geindex TokenError
@anchor{library/tokenize tokenize TokenError}@anchor{763}
@deffn {예외} tokenize.TokenError

여러 줄로 나눌 수 있는 독스트링이나 표현식이 파일의 어디에서도 완료되지 않을 때 발생합니다, 예를 들어:

@example
"""Beginning of
docstring
@end example

또는:

@example
[1,
 2,
 3
@end example
@end deffn

@node 명령 줄 사용법<2>,예제<30>,입력 토큰화하기,tokenize — 파이썬 소스를 위한 토크나이저
@anchor{library/tokenize command-line-usage}@anchor{4c9e}@anchor{library/tokenize tokenize-cli}@anchor{4c9f}
@subsubsection 명령 줄 사용법



Added in version 3.3.


The @code{tokenize} module can be executed as a script from the command line.
It is as simple as:

@example
python -m tokenize [-e] [filename.py]
@end example

허용되는 옵션은 다음과 같습니다:

@geindex tokenize 명령줄 옵션; -h
@geindex tokenize 명령줄 옵션; --help
@anchor{library/tokenize cmdoption-tokenize-h}@anchor{4ca0}@anchor{library/tokenize cmdoption-tokenize-help}@anchor{4ca1}
@deffn {Option} @w{-}h, @w{-}@w{-}help

이 도움말 메시지를 표시하고 종료합니다
@end deffn

@geindex tokenize 명령줄 옵션; -e
@geindex tokenize 명령줄 옵션; --exact
@anchor{library/tokenize cmdoption-tokenize-e}@anchor{4ca2}@anchor{library/tokenize cmdoption-tokenize-exact}@anchor{4ca3}
@deffn {Option} @w{-}e, @w{-}@w{-}exact

정확한 유형(exact_type)을 사용하여 토큰 이름을 표시합니다
@end deffn

@code{filename.py}가 지정되면 그 내용은 표준출력(stdout)으로 토큰화됩니다. 그렇지 않으면, 표준입력(stdin)에 대해 토큰화가 수행됩니다.

@node 예제<30>,,명령 줄 사용법<2>,tokenize — 파이썬 소스를 위한 토크나이저
@anchor{library/tokenize examples}@anchor{4ca4}
@subsubsection 예제


float 리터럴을 Decimal 객체로 변환하는 스크립트 재 작성기의 예제:

@example
from tokenize import tokenize, untokenize, NUMBER, STRING, NAME, OP
from io import BytesIO

def decistmt(s):
    """문장 문자열에 있는 float를 Decimal로 치환합니다.

    >>> from decimal import Decimal
    >>> s = 'print(+21.3e-5*-.1234/81.7)'
    >>> decistmt(s)
    "print (+Decimal ('21.3e-5')*-Decimal ('.1234')/Decimal ('81.7'))"

    지수 형식은 플랫폼 C 라이브러리에서 상속됩니다. 알려진 경우는 "e-007" (윈도우) 와 "e-07"
    (윈도우 외) 입니다. 우리는 단지 12자리 숫자를 보여주고 있고, 13번째 숫자는 5에 가깝지
    않으므로, 출력의 나머지 부분은 플랫폼 독립적이어야 합니다.

    >>> exec(s)  #doctest: +ELLIPSIS
    -3.21716034272e-0...7

    Decimal을 사용한 계산의 결과는 모든 플랫폼에서 같아야 합니다.

    >>> exec(decistmt(s))
    -3.217160342717258261933904529E-7
    """
    result = []
    g = tokenize(BytesIO(s.encode('utf-8')).readline)  # 문자열을 토큰화합니다
    for toknum, tokval, _, _, _ in g:
        if toknum == NUMBER and '.' in tokval:  # NUMBER 토큰을 바꿔치기합니다
            result.extend([
                (NAME, 'Decimal'),
                (OP, '('),
                (STRING, repr(tokval)),
                (OP, ')')
            ])
        else:
            result.append((toknum, tokval))
    return untokenize(result).decode('utf-8')
@end example

명령 줄에서 토큰화하는 예제. 스크립트:

@example
def say_hello():
    print("Hello, World!")

say_hello()
@end example

는 다음 출력으로 토큰화됩니다. 여기서 첫 번째 열은 토큰이 발견된 줄/열 좌표의 범위이고, 두 번째 열은 토큰의 이름이며, 마지막 열은 토큰의 값입니다 (있다면)

@example
$ python -m tokenize hello.py
0,0-0,0:            ENCODING       'utf-8'
1,0-1,3:            NAME           'def'
1,4-1,13:           NAME           'say_hello'
1,13-1,14:          OP             '('
1,14-1,15:          OP             ')'
1,15-1,16:          OP             ':'
1,16-1,17:          NEWLINE        '\n'
2,0-2,4:            INDENT         '    '
2,4-2,9:            NAME           'print'
2,9-2,10:           OP             '('
2,10-2,25:          STRING         '"Hello, World!"'
2,25-2,26:          OP             ')'
2,26-2,27:          NEWLINE        '\n'
3,0-3,1:            NL             '\n'
4,0-4,0:            DEDENT         '@w{'}
4,0-4,9:            NAME           'say_hello'
4,9-4,10:           OP             '('
4,10-4,11:          OP             ')'
4,11-4,12:          NEWLINE        '\n'
5,0-5,0:            ENDMARKER      '@w{'}
@end example

정확한 토큰 유형 이름은 @ref{4ca2,,-e} 옵션을 사용하여 표시할 수 있습니다:

@example
0,0-0,0:            ENCODING       'utf-8'
1,0-1,3:            NAME           'def'
1,4-1,13:           NAME           'say_hello'
1,13-1,14:          LPAR           '('
1,14-1,15:          RPAR           ')'
1,15-1,16:          COLON          ':'
1,16-1,17:          NEWLINE        '\n'
2,0-2,4:            INDENT         '    '
2,4-2,9:            NAME           'print'
2,9-2,10:           LPAR           '('
2,10-2,25:          STRING         '"Hello, World!"'
2,25-2,26:          RPAR           ')'
2,26-2,27:          NEWLINE        '\n'
3,0-3,1:            NL             '\n'
4,0-4,0:            DEDENT         '@w{'}
4,0-4,9:            NAME           'say_hello'
4,9-4,10:           LPAR           '('
4,10-4,11:          RPAR           ')'
4,11-4,12:          NEWLINE        '\n'
5,0-5,0:            ENDMARKER      '@w{'}
@end example

@ref{700,,generate_tokens()}로 바이트열 대신 유니코드 문자열을 읽는, 프로그래밍 방식으로 파일을 토큰화하는 예:

@example
import tokenize

with tokenize.open('hello.py') as f:
    tokens = tokenize.generate_tokens(f.readline)
    for token in tokens:
        print(token)
@end example

또는 @ref{6ff,,tokenize()}로 직접 바이트열을 읽는 예:

@example
import tokenize

with open('hello.py', 'rb') as f:
    tokens = tokenize.tokenize(f.readline)
    for token in tokens:
        print(token)
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node tabnanny — 모호한 들여쓰기 감지,pyclbr — 파이썬 모듈 브라우저 지원,tokenize — 파이썬 소스를 위한 토크나이저,파이썬 언어 서비스
@anchor{library/tabnanny doc}@anchor{4ca5}@anchor{library/tabnanny module-tabnanny}@anchor{e3}@anchor{library/tabnanny tabnanny-detection-of-ambiguous-indentation}@anchor{4ca6}@anchor{library/tabnanny translation-repo}@anchor{4ca7}
@subsection @code{tabnanny} — 모호한 들여쓰기 감지


@geindex module; tabnanny

@c rudimentary documentation based on module comments

`소스 코드:' Lib/tabnanny.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/tabnanny.py}


__________________________________________________________________


이 모듈은 당장은 스크립트로 호출하기 위한 것입니다. 하지만 IDE로 임포트 해서 아래에 설명된 @ref{4ca8,,check()} 함수를 사용할 수 있습니다.

@cartouche
@quotation 참고 
이 모듈에서 제공하는 API는 향후 배포에서 변경될 수 있습니다; 그러한 변경은 이전 버전과 호환되지 않을 수 있습니다.
@end quotation
@end cartouche

@geindex check() (tabnanny 모듈)
@anchor{library/tabnanny tabnanny check}@anchor{4ca8}
@deffn {함수} tabnanny.check (file_or_dir)

`file_or_dir'가 디렉터리이고 심볼릭 링크가 아니면, `file_or_dir'라는 이름의 디렉터리 트리를 재귀적으로 내려가면서, 모든 @code{.py} 파일을 검사합니다. `file_or_dir'가 일반 파이썬 소스 파일이면, 공백과 관련된 문제가 있는지 확인합니다. 진단 메시지는 @ref{1174,,print()} 함수를 사용하여 표준 출력에 기록됩니다.
@end deffn

@geindex verbose (tabnanny 모듈)
@anchor{library/tabnanny tabnanny verbose}@anchor{4ca9}
@deffn {데이터} tabnanny.verbose

상세 메시지를 인쇄할지를 나타내는 플래그. 이것은 스크립트로 호출되면 @code{-v} 옵션에 의해 증가합니다.
@end deffn

@geindex filename_only (tabnanny 모듈)
@anchor{library/tabnanny tabnanny filename_only}@anchor{4caa}
@deffn {데이터} tabnanny.filename_only

공백 관련 문제가 있는 파일의 파일명만 인쇄할지를 나타내는 플래그. 이것은 스크립트로 호출되면 @code{-q} 옵션에 의해 참으로 설정됩니다.
@end deffn

@geindex NannyNag
@anchor{library/tabnanny tabnanny NannyNag}@anchor{4cab}
@deffn {예외} tabnanny.NannyNag

모호한 들여쓰기를 감지하면 @ref{4cac,,process_tokens()}에 의해 발생합니다. @ref{4ca8,,check()}에서 잡아서 처리됩니다.
@end deffn

@geindex process_tokens() (tabnanny 모듈)
@anchor{library/tabnanny tabnanny process_tokens}@anchor{4cac}
@deffn {함수} tabnanny.process_tokens (tokens)

이 함수는 @ref{101,,tokenize} 모듈에서 생성된 토큰을 처리하기 위해 @ref{4ca8,,check()}에서 사용됩니다.
@end deffn

@c XXX document errprint, format_witnesses, Whitespace, check_equal, indents,
@c reset_globals


@subsubheading 더 보기



@table @asis

@item 모듈 @ref{101,,tokenize}

파이썬 소스 코드를 위한 어휘 스캐너.
@end table


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node pyclbr — 파이썬 모듈 브라우저 지원,py_compile — 파이썬 소스 파일 컴파일,tabnanny — 모호한 들여쓰기 감지,파이썬 언어 서비스
@anchor{library/pyclbr doc}@anchor{4cad}@anchor{library/pyclbr module-pyclbr}@anchor{b9}@anchor{library/pyclbr pyclbr-python-module-browser-support}@anchor{4cae}@anchor{library/pyclbr translation-repo}@anchor{4caf}
@subsection @code{pyclbr} — 파이썬 모듈 브라우저 지원


@geindex module; pyclbr

`소스 코드:' Lib/pyclbr.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/pyclbr.py}


__________________________________________________________________


The @code{pyclbr} module provides limited information about the
functions, classes, and methods defined in a Python-coded module.  The
information is sufficient to implement a module browser.  The
information is extracted from the Python source code rather than by
importing the module, so this module is safe to use with untrusted code.
This restriction makes it impossible to use this module with modules not
implemented in Python, including all standard and optional extension
modules.

@geindex readmodule() (pyclbr 모듈)
@anchor{library/pyclbr pyclbr readmodule}@anchor{a2c}
@deffn {함수} pyclbr.readmodule (module, path=None)

모듈 수준의 클래스 이름을 클래스 설명자에 매핑하는 딕셔너리를 돌려줍니다. 가능하면, 임포트 된 베이스 클래스에 관한 설명자가 포함됩니다. 매개 변수 `module'은 읽을 모듈 이름이 들어있는 문자열입니다; 패키지 내의 모듈 이름일 수 있습니다. 주어지면, `path'는 @code{sys.path} 앞에 추가된 디렉터리 경로 시퀀스인데, 모듈 소스 코드의 위치를 찾는 데 사용됩니다.

이 함수는 원래 인터페이스이며 이전 버전과의 호환성을 위해서만 유지됩니다. 다음 함수의 필터링 된 버전을 반환합니다.
@end deffn

@geindex readmodule_ex() (pyclbr 모듈)
@anchor{library/pyclbr pyclbr readmodule_ex}@anchor{a2d}
@deffn {함수} pyclbr.readmodule_ex (module, path=None)

@code{def} 나 @code{class} 문을 사용하여 모듈에 정의된 각 함수 및 클래스에 대한 함수나 클래스 설명자를 포함하는 딕셔너리 기반 트리를 반환합니다. 반환된 딕셔너리는 모듈 수준의 함수와 클래스 이름을 해당 설명자에 대응합니다. 중첩된 객체는 그들의 parent의 children 딕셔너리에 들어갑니다. readmodule과 마찬가지로, `module'은 읽을 모듈의 이름을 지정하고 `path'는 sys.path의 앞에 추가됩니다. 읽히는 모듈이 패키지면, 반환된 딕셔너리는 키 @code{'__path__'}를 가지는데, 값은 패키지 검색 경로를 포함하는 리스트입니다.
@end deffn


Added in version 3.7: 중첩된 정의에 대한 설명자. 새로운 children 어트리뷰트를 통해 액세스할 수 있습니다. 각에는 새로운 parent 어트리뷰트가 있습니다.


이러한 함수에 의해 반환되는 설명자는 Function과 Class 클래스의 인스턴스입니다. 사용자가 이러한 클래스의 인스턴스를 만들 것으로 기대하지 않습니다.

@menu
* Function 객체:: 
* Class 객체:: 

@end menu

@node Function 객체,Class 객체,,pyclbr — 파이썬 모듈 브라우저 지원
@anchor{library/pyclbr function-objects}@anchor{4cb0}@anchor{library/pyclbr pyclbr-function-objects}@anchor{4cb1}
@subsubsection Function 객체


@geindex Function (pyclbr 클래스)
@anchor{library/pyclbr pyclbr Function}@anchor{4cb2}
@deffn {클래스} pyclbr.Function

클래스 @code{Function} 인스턴스는 def 문으로 정의된 함수를 설명합니다. 다음과 같은 어트리뷰트를 가지고 있습니다 :

@geindex file (pyclbr.Function의 속성)
@anchor{library/pyclbr pyclbr Function file}@anchor{4cb3}
@deffn {속성} file

함수가 정의된 파일의 이름.
@end deffn

@geindex module (pyclbr.Function의 속성)
@anchor{library/pyclbr pyclbr Function module}@anchor{4cb4}
@deffn {속성} module

설명된 함수를 정의하는 모듈의 이름.
@end deffn

@geindex name (pyclbr.Function의 속성)
@anchor{library/pyclbr pyclbr Function name}@anchor{4cb5}
@deffn {속성} name

함수의 이름.
@end deffn

@geindex lineno (pyclbr.Function의 속성)
@anchor{library/pyclbr pyclbr Function lineno}@anchor{4cb6}
@deffn {속성} lineno

정의가 시작되는 파일의 줄 번호.
@end deffn

@geindex parent (pyclbr.Function의 속성)
@anchor{library/pyclbr pyclbr Function parent}@anchor{4cb7}
@deffn {속성} parent

최상위 함수면, @code{None}. 중첩된 함수면, 부모.


Added in version 3.7.

@end deffn

@geindex children (pyclbr.Function의 속성)
@anchor{library/pyclbr pyclbr Function children}@anchor{4cb8}
@deffn {속성} children

이름을 중첩된 함수와 클래스에 관한 설명자로 매핑하는 @ref{183,,딕셔너리}.


Added in version 3.7.

@end deffn

@geindex is_async (pyclbr.Function의 속성)
@anchor{library/pyclbr pyclbr Function is_async}@anchor{4cb9}
@deffn {속성} is_async

@code{True} for functions that are defined with the
@ref{7ec,,async} prefix, @code{False} otherwise.


Added in version 3.10.

@end deffn
@end deffn

@node Class 객체,,Function 객체,pyclbr — 파이썬 모듈 브라우저 지원
@anchor{library/pyclbr class-objects}@anchor{4cba}@anchor{library/pyclbr pyclbr-class-objects}@anchor{4cbb}
@subsubsection Class 객체


@geindex Class (pyclbr 클래스)
@anchor{library/pyclbr pyclbr Class}@anchor{4cbc}
@deffn {클래스} pyclbr.Class

클래스 @code{Class} 인스턴스는 class 문으로 정의된 클래스를 설명합니다. @ref{4cb2,,Function}과 같은 어트리뷰트에 더해 두 개의 어트리뷰트가 더 있습니다.

@geindex file (pyclbr.Class의 속성)
@anchor{library/pyclbr pyclbr Class file}@anchor{4cbd}
@deffn {속성} file

클래스가 정의된 파일의 이름.
@end deffn

@geindex module (pyclbr.Class의 속성)
@anchor{library/pyclbr pyclbr Class module}@anchor{4cbe}
@deffn {속성} module

설명된 클래스를 정의하는 모듈의 이름.
@end deffn

@geindex name (pyclbr.Class의 속성)
@anchor{library/pyclbr pyclbr Class name}@anchor{4cbf}
@deffn {속성} name

클래스의 이름.
@end deffn

@geindex lineno (pyclbr.Class의 속성)
@anchor{library/pyclbr pyclbr Class lineno}@anchor{4cc0}
@deffn {속성} lineno

정의가 시작되는 파일의 줄 번호.
@end deffn

@geindex parent (pyclbr.Class의 속성)
@anchor{library/pyclbr pyclbr Class parent}@anchor{4cc1}
@deffn {속성} parent

최상위 클래스면, @code{None}. 중첩된 클래스면, 부모.


Added in version 3.7.

@end deffn

@geindex children (pyclbr.Class의 속성)
@anchor{library/pyclbr pyclbr Class children}@anchor{4cc2}
@deffn {속성} children

이름을 중첩된 함수와 클래스에 관한 설명자로 매핑하는 딕셔너리.


Added in version 3.7.

@end deffn

@geindex super (pyclbr.Class의 속성)
@anchor{library/pyclbr pyclbr Class super}@anchor{4cc3}
@deffn {속성} super

설명되는 클래스의 직접적인 베이스 클래스를 설명하는 @code{Class} 객체의 리스트. 슈퍼 클래스로 명명되었지만 @ref{a2d,,readmodule_ex()}가 찾을 수 없는 클래스는 @code{Class} 객체가 아니라 클래스 이름을 담은 문자열로 나열됩니다.
@end deffn

@geindex methods (pyclbr.Class의 속성)
@anchor{library/pyclbr pyclbr Class methods}@anchor{4cc4}
@deffn {속성} methods

메서드 이름을 줄 번호에 매핑하는 @ref{183,,딕셔너리}. 최신 @ref{4cc2,,children} 딕셔너리에서 파생될 수 있지만, 이전 버전과의 호환성을 위해 남아있습니다.
@end deffn
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node py_compile — 파이썬 소스 파일 컴파일,compileall — 파이썬 라이브러리 바이트 컴파일하기,pyclbr — 파이썬 모듈 브라우저 지원,파이썬 언어 서비스
@anchor{library/py_compile doc}@anchor{4cc5}@anchor{library/py_compile module-py_compile}@anchor{b8}@anchor{library/py_compile py-compile-compile-python-source-files}@anchor{4cc6}@anchor{library/py_compile translation-repo}@anchor{4cc7}
@subsection @code{py_compile} — 파이썬 소스 파일 컴파일


@geindex module; py_compile

@c documentation based on module docstrings

`소스 코드:' Lib/py_compile.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/py_compile.py}

@geindex 파일;바이트 코드


__________________________________________________________________


The @code{py_compile} module provides a function to generate a byte-code file
from a source file, and another function used when the module source file is
invoked as a script.

자주 사용되지는 않지만, 특히 일부 사용자가 소스 코드가 들어있는 디렉터리에 바이트 코드 캐시 파일을 쓸 수 있는 권한이 없을 때, 이 함수는 공유 사용을 위해 모듈을 설치할 때 유용할 수 있습니다.

@geindex PyCompileError
@anchor{library/py_compile py_compile PyCompileError}@anchor{4cc8}
@deffn {예외} py_compile.PyCompileError

파일을 컴파일하는 도중 에러가 일어날 때 발생하는 예외.
@end deffn

@geindex compile() (py_compile 모듈)
@anchor{library/py_compile py_compile compile}@anchor{c19}
@deffn {함수} py_compile.compile (file, cfile=None, dfile=None, doraise=False, optimize=-1, invalidation_mode=PycInvalidationMode.TIMESTAMP, quiet=0)

바이트 코드로 소스 파일을 컴파일하고 바이트 코드 캐시 파일을 기록합니다. 소스 코드는 `file'이 지정하는 이름의 파일에서 로드됩니다. 바이트 코드는 `cfile'에 기록되며, 기본값은 @code{.pyc}로 끝나는 
@geindex Python 향상 제안; PEP 3147
PEP 3147@footnote{https://peps.python.org/pep-3147/}/
@geindex Python 향상 제안; PEP 488
PEP 488@footnote{https://peps.python.org/pep-0488/} 경로입니다. 예를 들어, `file'이 @code{/foo/bar/baz.py}이면 `cfile'은 파이썬 3.2의 경우 @code{/foo/bar/__pycache__/baz.cpython-32.pyc}로 기본 설정됩니다. `dfile'이 지정되면, 예외 트레이스백에 표시하기 위해 소스 줄을 얻은 소스 파일 이름으로 `file' 대신 사용됩니다. `doraise'가 참이면, `file'을 컴파일하는 동안 에러를 만나면 @ref{4cc8,,PyCompileError}가 발생합니다. `doraise'가 거짓(기본값)이면, @code{sys.stderr}에 에러 문자열이 기록되지만, 예외는 발생하지 않습니다. 이 함수는 바이트 컴파일된 파일의 경로, 즉 사용된 `cfile' 값을 반환합니다.

`doraise'와 `quiet' 인자는 파일을 컴파일하는 동안 에러를 처리하는 방법을 결정합니다. `quiet'가 0이나 1이고, `doraise'가 거짓이면, 기본 동작이 활성화됩니다: 에러 문자열이 @code{sys.stderr}에 기록되고, 함수는 경로 대신 @code{None}을 반환합니다. `doraise'가 참이면, 대신 @ref{4cc8,,PyCompileError}가 발생합니다. 그러나 `quiet'가 2이면, 아무런 메시지도 기록되지 않고, `doraise'는 효과가 없습니다.

`cfile'이 되는 경로(명시적으로 지정되거나 계산된 경로)가 심볼릭 링크나 비정규 파일이면, @ref{121f,,FileExistsError}가 발생합니다. 이것은 바이트 컴파일된 파일을 해당 경로에 쓸 수 있을 때 임포트가 해당 경로를 일반 파일로 바꾼다는 경고로 작용합니다. 이는 동시 파일 기록 문제를 방지하기 위해 최종 바이트 컴파일된 파일을 위치시키는데 파일 이름 바꾸기를 사용하는 임포트의 부작용입니다.

`optimize'는 최적화 수준을 제어하고 내장 @ref{4b2,,compile()} 함수로 전달됩니다. 기본값 @code{-1}은 현재 인터프리터의 최적화 수준을 선택합니다.

`invalidation_mode'는 @ref{4cc9,,PycInvalidationMode} enum의 멤버여야 하며 실행 시간에 생성된 바이트 코드 캐시를 무효로 하는 방법을 제어합니다. 
@geindex SOURCE_DATE_EPOCH
@geindex 환경 변수; SOURCE_DATE_EPOCH
@code{SOURCE_DATE_EPOCH} 환경 변수가 설정되면 기본값은 @ref{4cca,,PycInvalidationMode.CHECKED_HASH}이고, 그렇지 않으면 기본값은 @ref{4ccb,,PycInvalidationMode.TIMESTAMP}입니다.


버전 3.2에서 변경: `cfile'의 기본값을 
@geindex Python 향상 제안; PEP 3147
PEP 3147@footnote{https://peps.python.org/pep-3147/}과 호환되도록 변경했습니다. 이전 기본값은 `file' + @code{'c'}(최적화가 활성화되었으면 @code{'o'})입니다. 또한 `optimize' 매개 변수가 추가되었습니다.



버전 3.4에서 변경: 바이트 코드 캐시 파일 쓰기에 @ref{7b,,importlib}를 사용하도록 코드를 변경했습니다. 이것은 파일 생성/기록 의미가 이제 @code{importlib}가 하는 것과 일치한다는 것을 의미합니다, 예를 들어 권한, 쓰기-와-이동 의미 등. 또한, `cfile'이 심볼릭 링크나 비정규 파일이면 @ref{121f,,FileExistsError}가 발생시키는 경고를 추가했습니다.



버전 3.7에서 변경: `invalidation_mode' 매개 변수가 
@geindex Python 향상 제안; PEP 552
PEP 552@footnote{https://peps.python.org/pep-0552/}에 지정된 대로 추가되었습니다. 
@geindex SOURCE_DATE_EPOCH
@geindex 환경 변수; SOURCE_DATE_EPOCH
@code{SOURCE_DATE_EPOCH} 환경 변수가 설정되면, `invalidation_mode'는 @ref{4cca,,PycInvalidationMode.CHECKED_HASH}로 강제 설정됩니다.



버전 3.7.2에서 변경: 
@geindex SOURCE_DATE_EPOCH
@geindex 환경 변수; SOURCE_DATE_EPOCH
@code{SOURCE_DATE_EPOCH} 환경 변수는 더는 `invalidation_mode' 인자의 값을 재정의하지 않으며, 대신 기본값을 결정합니다.



버전 3.8에서 변경: `quiet' 매개 변수가 추가되었습니다.

@end deffn

@geindex PycInvalidationMode (py_compile 클래스)
@anchor{library/py_compile py_compile PycInvalidationMode}@anchor{4cc9}
@deffn {클래스} py_compile.PycInvalidationMode

인터프리터가 바이트 코드 파일이 소스 파일에 대해 최신 버전인지를 결정하는 데 사용할 수 있는 가능한 방법의 열거형입니다. @code{.pyc} 파일은 헤더에서 원하는 무효화 모드를 가리킵니다. 파이썬이 실행 시간에 @code{.pyc} 파일을 무효로 하는 방법에 대한 자세한 내용은 @ref{801,,캐시된 바이트 코드 무효화}를 참조하십시오.


Added in version 3.7.


@geindex TIMESTAMP (py_compile.PycInvalidationMode의 속성)
@anchor{library/py_compile py_compile PycInvalidationMode TIMESTAMP}@anchor{4ccb}
@deffn {속성} TIMESTAMP

@code{.pyc} 파일은 파이썬이 실행 시간에 소스 파일의 메타 데이터와 비교하여 @code{.pyc} 파일을 재생성해야 하는지를 결정할 소스 파일의 타임스탬프와 크기를 포함합니다.
@end deffn

@geindex CHECKED_HASH (py_compile.PycInvalidationMode의 속성)
@anchor{library/py_compile py_compile PycInvalidationMode CHECKED_HASH}@anchor{4cca}
@deffn {속성} CHECKED_HASH

@code{.pyc} 파일은 파이썬이 실행 시간에 소스와 비교하여 @code{.pyc} 파일을 다시 생성해야 하는지를 결정할 소스 파일 내용의 해시를 포함합니다.
@end deffn

@geindex UNCHECKED_HASH (py_compile.PycInvalidationMode의 속성)
@anchor{library/py_compile py_compile PycInvalidationMode UNCHECKED_HASH}@anchor{4ccc}
@deffn {속성} UNCHECKED_HASH

@ref{4cca,,CHECKED_HASH}와 마찬가지로, @code{.pyc} 파일에는 소스 파일 내용의 해시가 포함됩니다. 하지만, 파이썬은 실행 시간에 @code{.pyc} 파일이 최신 버전이라고 가정하고, 소스 파일에 대해 @code{.pyc}를 전혀 검증하지 않습니다.

이 옵션은 @code{.pycs}가 빌드 시스템처럼 파이썬 외부 시스템에 의해 최신 상태로 유지될 때 유용합니다.
@end deffn
@end deffn

@menu
* 명령줄 인터페이스:: 

@end menu

@node 명령줄 인터페이스,,,py_compile — 파이썬 소스 파일 컴파일
@anchor{library/py_compile command-line-interface}@anchor{4ccd}@anchor{library/py_compile py-compile-cli}@anchor{4cce}
@subsubsection 명령줄 인터페이스


이 모듈은 스크립트로 호출하여 여러 소스 파일을 컴파일할 수 있습니다. `filenames'로 이름이 지정된 파일이 컴파일되고 결과 바이트 코드가 일반적인 방식으로 캐시 됩니다. 이 프로그램은 소스 파일을 찾기 위해 디렉터리 구조를 검색하지 않습니다; 명시적으로 이름이 지정된 파일 만 컴파일합니다. 컴파일할 수 없는 파일이 있으면 종료 상태가 0이 아닙니다.

@geindex python--m-py_compile 명령줄 옵션; <file>
@geindex python--m-py_compile 명령줄 옵션; -
@anchor{library/py_compile cmdoption-python-m-py_compile-arg-file}@anchor{4ccf}
@deffn {Option} <file> ... <fileN>
@anchor{library/py_compile cmdoption-python-m-py_compile}@anchor{4cd0}
@deffnx {Option} @w{-}

위치 인자는 컴파일할 파일입니다. @code{-}가 유일한 매개 변수면, 파일 목록을 표준 입력에서 가져옵니다.
@end deffn

@geindex python--m-py_compile 명령줄 옵션; -q
@geindex python--m-py_compile 명령줄 옵션; --quiet
@anchor{library/py_compile cmdoption-python-m-py_compile-q}@anchor{4cd1}@anchor{library/py_compile cmdoption-python-m-py_compile-quiet}@anchor{4cd2}
@deffn {Option} @w{-}q, @w{-}@w{-}quiet

에러 출력을 억제합니다.
@end deffn


버전 3.2에서 변경: @code{-}에 대한 지원이 추가되었습니다.



버전 3.10에서 변경: @ref{4cd1,,-q}에 대한 지원이 추가되었습니다.



@subsubheading 더 보기



@table @asis

@item 모듈 @ref{21,,compileall}

디렉터리 트리에 있는 모든 파이썬 소스 파일을 컴파일하는 유틸리티.
@end table


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node compileall — 파이썬 라이브러리 바이트 컴파일하기,dis — Disassembler for Python bytecode,py_compile — 파이썬 소스 파일 컴파일,파이썬 언어 서비스
@anchor{library/compileall doc}@anchor{4cd3}@anchor{library/compileall compileall-byte-compile-python-libraries}@anchor{4cd4}@anchor{library/compileall module-compileall}@anchor{21}@anchor{library/compileall translation-repo}@anchor{4cd5}
@subsection @code{compileall} — 파이썬 라이브러리 바이트 컴파일하기


@geindex module; compileall

`소스 코드:' Lib/compileall.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/compileall.py}


__________________________________________________________________


이 모듈은 파이썬 라이브러리 설치를 지원하는 몇 가지 유틸리티 함수를 제공합니다. 이 함수는 디렉터리 트리에서 파이썬 소스 파일을 컴파일합니다. 이 모듈을 사용하면 라이브러리 설치 시 캐시 된 바이트 코드 파일을 만들 수 있으므로, 라이브러리 디렉터리에 쓰기 권한이 없는 사용자도 사용할 수 있도록 합니다.

@c include for modules that don't work on WASM

@ref{213c,,가용성}: not WASI.

이 모듈은 웹어셈블리에서 작동하지 않거나 제공되지 않습니다. 자세한 내용은 @ref{1b68,,웹어셈블리 플랫폼}을 참조하세요.

@menu
* 명령 줄 사용:: 
* 공용 함수:: 

@end menu

@node 명령 줄 사용,공용 함수,,compileall — 파이썬 라이브러리 바이트 컴파일하기
@anchor{library/compileall command-line-use}@anchor{4cd6}@anchor{library/compileall compileall-cli}@anchor{4cd7}
@subsubsection 명령 줄 사용


이 모듈은 파이썬 소스를 컴파일하는 스크립트로 작동할 수 있습니다 (@code{python -m compileall}을 사용합니다).

@geindex compileall 명령줄 옵션; directory
@geindex compileall 명령줄 옵션; file
@anchor{library/compileall cmdoption-compileall-arg-directory}@anchor{4cd8}
@deffn {Option} directory ...
@anchor{library/compileall cmdoption-compileall-arg-file}@anchor{4cd9}
@deffnx {Option} file ...

위치 인자는 컴파일할 파일이나 소스 파일을 포함하는 디렉터리이며 재귀적으로 탐색 됩니다. 인자가 주어지지 않으면, 명령 줄이 @code{-l @var{<directories from sys.path>}} 인 것처럼 행동합니다.
@end deffn

@geindex compileall 명령줄 옵션; -l
@anchor{library/compileall cmdoption-compileall-l}@anchor{4cda}
@deffn {Option} @w{-}l

서브 디렉터리를 재귀적으로 탐색하지 않고, 이름이 지정되었거나 암시된 디렉터리에 직접 포함된 소스 코드 파일 만 컴파일합니다.
@end deffn

@geindex compileall 명령줄 옵션; -f
@anchor{library/compileall cmdoption-compileall-f}@anchor{4cdb}
@deffn {Option} @w{-}f

타임스탬프가 최신일 때도 강제로 다시 빌드합니다.
@end deffn

@geindex compileall 명령줄 옵션; -q
@anchor{library/compileall cmdoption-compileall-q}@anchor{4cdc}
@deffn {Option} @w{-}q

컴파일된 파일 목록을 인쇄하지 않습니다. 한 번 전달하면, 에러 메시지는 여전히 인쇄됩니다. 두 번 전달하면 (@code{-qq}), 모든 출력이 억제됩니다.
@end deffn

@geindex compileall 명령줄 옵션; -d
@anchor{library/compileall cmdoption-compileall-d}@anchor{4cdd}
@deffn {Option} @w{-}d destdir

디렉터리가 컴파일되는 각 파일의 경로 앞에 추가됩니다. 이것은 컴파일 시간 트레이스백에 나타나며, 바이트 코드 파일에 컴파일되어 들어가서, 바이트 코드 파일이 실행되는 시점에 소스 파일이 존재하지 않으면 트레이스백과 기타 메시지에 사용됩니다.
@end deffn

@geindex compileall 명령줄 옵션; -s
@anchor{library/compileall cmdoption-compileall-s}@anchor{4cde}
@deffn {Option} @w{-}s strip_prefix

Remove the given prefix from paths recorded in the @code{.pyc} files.
Paths are made relative to the prefix.

This option can be used with @code{-p} but not with @code{-d}.
@end deffn

@geindex compileall 명령줄 옵션; -p
@anchor{library/compileall cmdoption-compileall-p}@anchor{4cdf}
@deffn {Option} @w{-}p prepend_prefix

Prepend the given prefix to paths recorded in the @code{.pyc} files.
Use @code{-p /} to make the paths absolute.

This option can be used with @code{-s} but not with @code{-d}.
@end deffn

@geindex compileall 명령줄 옵션; -x
@anchor{library/compileall cmdoption-compileall-x}@anchor{4ce0}
@deffn {Option} @w{-}x regex

regex는 컴파일 대상으로 고려되는 각 파일의 전체 경로를 검색(search)하는 데 사용되며, 정규식이 일치를 생성하면 그 파일을 건너뜁니다.
@end deffn

@geindex compileall 명령줄 옵션; -i
@anchor{library/compileall cmdoption-compileall-i}@anchor{4ce1}
@deffn {Option} @w{-}i list

파일 @code{list}를 읽고 포함된 각 줄을 컴파일할 파일과 디렉터리 목록에 추가합니다. @code{list}가 @code{-}이면, @code{stdin}에서 줄을 읽습니다.
@end deffn

@geindex compileall 명령줄 옵션; -b
@anchor{library/compileall cmdoption-compileall-b}@anchor{4ce2}
@deffn {Option} @w{-}b

바이트 코드 파일을 레거시 위치 및 이름에 써서, 다른 버전의 파이썬이 만든 바이트 코드 파일을 덮어쓸 수 있습니다. 기본값은 여러 버전의 파이썬의 바이트 코드 파일이 공존할 수 있는 
@geindex Python 향상 제안; PEP 3147
PEP 3147@footnote{https://peps.python.org/pep-3147/} 위치와 이름에 파일을 쓰는 것입니다.
@end deffn

@geindex compileall 명령줄 옵션; -r
@anchor{library/compileall cmdoption-compileall-r}@anchor{4ce3}
@deffn {Option} @w{-}r

서브 디렉터리의 최대 재귀 수준을 제어합니다. 이것이 주어지면, @code{-l} 옵션은 고려되지 않습니다. @code{python -m compileall <directory> -r 0}은 @code{python -m compileall <directory> -l}과 동등합니다.
@end deffn

@geindex compileall 명령줄 옵션; -j
@anchor{library/compileall cmdoption-compileall-j}@anchor{4ce4}
@deffn {Option} @w{-}j N

주어진 디렉터리 내의 파일을 컴파일하는 데 `N' 작업자를 사용합니다. @code{0}이 사용되면, @ref{51d,,os.process_cpu_count()}의 결과가 사용됩니다.
@end deffn

@geindex compileall 명령줄 옵션; --invalidation-mode
@anchor{library/compileall cmdoption-compileall-invalidation-mode}@anchor{4ce5}
@deffn {Option} @w{-}@w{-}invalidation@w{-}mode [timestamp|checked@w{-}hash|unchecked@w{-}hash]

생성된 바이트 코드 파일이 실행 시간에 무효가 되는 방식을 제어합니다. @code{timestamp} 값은 소스 타임스탬프와 크기가 포함된 @code{.pyc} 파일이 생성됨을 의미합니다. @code{checked-hash}와 @code{unchecked-hash} 값은 해시 기반 pyc를 생성합니다. 해시 기반 pyc는 타임스탬프 대신 소스 파일 내용의 해시를 포함합니다. 파이썬이 실행 시간에 바이트 코드 캐시 파일의 유효성을 검사하는 방법에 대한 자세한 내용은 @ref{801,,캐시된 바이트 코드 무효화}를 참조하십시오. 기본값은 
@geindex SOURCE_DATE_EPOCH
@geindex 환경 변수; SOURCE_DATE_EPOCH
@code{SOURCE_DATE_EPOCH} 환경 변수가 설정되지 않으면 @code{timestamp}이고, @code{SOURCE_DATE_EPOCH} 환경 변수가 설정되면 @code{checked-hash}입니다.
@end deffn

@geindex compileall 명령줄 옵션; -o
@anchor{library/compileall cmdoption-compileall-o}@anchor{4ce6}
@deffn {Option} @w{-}o level

주어진 최적화 수준으로 컴파일합니다. 한 번에 여러 수준으로 컴파일하기 위해 여러 번 사용할 수 있습니다 (예를 들어, @code{compileall -o 1 -o 2}).
@end deffn

@geindex compileall 명령줄 옵션; -e
@anchor{library/compileall cmdoption-compileall-e}@anchor{4ce7}
@deffn {Option} @w{-}e dir

지정된 디렉터리 외부를 가리키는 심볼릭 링크를 무시합니다.
@end deffn

@geindex compileall 명령줄 옵션; --hardlink-dupes
@anchor{library/compileall cmdoption-compileall-hardlink-dupes}@anchor{4ce8}
@deffn {Option} @w{-}@w{-}hardlink@w{-}dupes

최적화 수준이 다른 두 개의 @code{.pyc} 파일의 내용이 같으면, 하드 링크를 사용하여 중복 파일을 통합합니다.
@end deffn


버전 3.2에서 변경: @code{-i}, @code{-b} 및 @code{-h} 옵션이 추가되었습니다.



버전 3.5에서 변경: @code{-j}, @code{-r} 및 @code{-qq} 옵션이 추가되었습니다. @code{-q} 옵션이 다중 수준 값으로 변경되었습니다. @code{-b}는 항상 @code{.pyc}로 끝나는 바이트 코드 파일을 생성하며, 결코 @code{.pyo}를 생성하지 않습니다.



버전 3.7에서 변경: @code{--invalidation-mode} 옵션이 추가되었습니다.



버전 3.9에서 변경: @code{-s}, @code{-p}, @code{-e} 및 @code{--hardlink-dupes} 옵션을 추가했습니다. 기본 재귀 제한을 10에서 @ref{6ea,,sys.getrecursionlimit()}로 올렸습니다. @code{-o} 옵션을 여러 번 지정할 수 있는 가능성이 추가되었습니다.


@ref{4b2,,compile()} 함수가 사용하는 최적화 수준을 제어하는 명령 줄 옵션은 없습니다. 파이썬 인터프리터 자신이 그 옵션을 제공하고 있기 때문입니다: @code{python -O -m compileall}.

마찬가지로, @ref{4b2,,compile()} 함수는 @ref{b9b,,sys.pycache_prefix} 설정을 따릅니다. 생성된 바이트 코드 캐시는 @code{compile()}이 실행 시간에 사용될 것과 같은 @code{sys.pycache_prefix}(있다면)로 실행될 때만 유용합니다.

@node 공용 함수,,명령 줄 사용,compileall — 파이썬 라이브러리 바이트 컴파일하기
@anchor{library/compileall public-functions}@anchor{4ce9}
@subsubsection 공용 함수


@geindex compile_dir() (compileall 모듈)
@anchor{library/compileall compileall compile_dir}@anchor{d1a}
@deffn {함수} 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)

`dir'로 명명된 디렉터리 트리를 재귀적으로 탐색해 내려가면서, 발견되는 모든 @code{.py} 파일을 컴파일합니다. 모든 파일이 성공적으로 컴파일되면 참값을 반환하고, 그렇지 않으면 거짓값을 반환합니다.

`maxlevels' 매개 변수는 재귀의 깊이를 제한하는 데 사용됩니다; 기본값은 @code{sys.getrecursionlimit()}입니다.

`ddir'이 주어지면, 컴파일 시간 트레이스백에서 사용하기 위해 컴파일되는 각 파일의 경로 앞에 추가되며, 바이트 코드 파일에 컴파일되어 들어가서, 바이트 코드 파일이 실행되는 시점에 소스 파일이 존재하지 않으면 트레이스백과 기타 메시지에 사용됩니다.

`force'가 참이면, 타임스탬프가 최신일 때도 모듈이 다시 컴파일됩니다.

`rx'가 주어지면, 컴파일 대상으로 고려되는 각 파일의 전체 경로로 그것의 @code{search} 메서드를 호출하고, 참값을 반환하면 그 파일을 건너뜁니다. 이는 @ref{1186,,re.Pattern} 객체로 주어지는 정규식과 일치하는 파일을 제외하는 데 사용할 수 있습니다.

`quiet'가 @code{False}나 @code{0}(기본값)이면, 파일명과 기타 정보가 표준 출력에 인쇄됩니다. @code{1}로 설정하면, 에러만 인쇄됩니다. @code{2}로 설정하면, 모든 출력이 억제됩니다.

`legacy'가 참이면, 바이트 코드 파일을 레거시 위치 및 이름에 써서, 다른 버전의 파이썬이 만든 바이트 코드 파일을 덮어쓸 수 있습니다. 기본값은 여러 버전의 파이썬의 바이트 코드 파일이 공존할 수 있는 
@geindex Python 향상 제안; PEP 3147
PEP 3147@footnote{https://peps.python.org/pep-3147/} 위치와 이름에 파일을 쓰는 것입니다.

`optimize'는 컴파일러의 최적화 수준을 지정합니다. 내장 @ref{4b2,,compile()} 함수로 전달됩니다. 한 번의 호출로 하나의 @code{.py} 파일을 여러 번 컴파일하도록 하는 최적화 수준의 시퀀스도 허용합니다.

인자 `workers'는 파일을 컴파일하는 데 병렬로 사용되는 작업자 수를 지정합니다. 기본값은 다중 작업자를 사용하지 않는 것입니다. 플랫폼이 다중 작업자를 사용할 수 없고 `workers' 인자가 주어지면, 순차 컴파일로 대체합니다. `workers'가 0이면 시스템의 코어 수가 사용됩니다. `workers'가 @code{0}보다 작으면, @ref{2ec,,ValueError}가 발생합니다.

`invalidation_mode'는 @ref{4cc9,,py_compile.PycInvalidationMode} 열거형의 멤버여야 하며 실행 시간에 생성된 pyc가 무효가 되는 방식을 제어합니다.

`stripdir', `prependdir' 및 `limit_sl_dest' 인자는 위에서 설명한 @code{-s}, @code{-p} 및 @code{-e} 옵션에 해당합니다. @code{str} 이나 @ref{e4a,,os.PathLike}으로 지정할 수 있습니다.

`hardlink_dupes'가 참이고 최적화 수준이 다른 두 개의 @code{.pyc} 파일의 내용이 같으면, 하드 링크를 사용하여 중복 파일을 통합합니다.


버전 3.2에서 변경: `legacy'와 `optimize' 매개 변수가 추가되었습니다.



버전 3.5에서 변경: `workers' 매개 변수가 추가되었습니다.



버전 3.5에서 변경: `quiet' 매개 변수가 다중 수준 값으로 변경되었습니다.



버전 3.5에서 변경: `legacy' 매개 변수는 `optimize' 값과 상관없이 @code{.pyo} 파일이 아니라 @code{.pyc} 파일 만 기록합니다.



버전 3.6에서 변경: @ref{5a0,,경로류 객체}를 받아들입니다.



버전 3.7에서 변경: `invalidation_mode' 매개 변수가 추가되었습니다.



버전 3.7.2에서 변경: `invalidation_mode' 매개 변수의 기본값이 @code{None}으로 변경되었습니다.



버전 3.8에서 변경: `workers'를 0으로 설정하면 최적의 코어 수가 선택됩니다.



버전 3.9에서 변경: `stripdir', `prependdir', `limit_sl_dest' 및 `hardlink_dupes' 인자가 추가되었습니다. `maxlevels'의 기본값이 @code{10}에서 @code{sys.getrecursionlimit()}으로 변경되었습니다.

@end deffn

@geindex compile_file() (compileall 모듈)
@anchor{library/compileall compileall compile_file}@anchor{fe0}
@deffn {함수} 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)

경로 `fullname'의 파일을 컴파일합니다. 파일이 성공적으로 컴파일되면 참값을 반환하고, 그렇지 않으면 거짓값을 반환합니다.

`ddir'이 주어지면, 컴파일 시간 트레이스백에서 사용하기 위해 컴파일되는 파일의 경로 앞에 추가되며, 바이트 코드 파일에 컴파일되어 들어가서, 바이트 코드 파일이 실행되는 시점에 소스 파일이 존재하지 않으면 트레이스백과 기타 메시지에 사용됩니다.

`rx'가 주어지면, 컴파일 중인 파일의 전체 경로가 그것의 @code{search} 메서드로 전달되고, 참값을 반환하면, 파일이 컴파일되지 않고 @code{True}가 반환됩니다. 이는 @ref{1186,,re.Pattern} 객체로 주어지는 정규식과 일치하는 파일을 제외하는 데 사용할 수 있습니다.

`quiet'가 @code{False}나 @code{0}(기본값)이면, 파일명과 기타 정보가 표준 출력에 인쇄됩니다. @code{1}로 설정하면, 에러만 인쇄됩니다. @code{2}로 설정하면, 모든 출력이 억제됩니다.

`legacy'가 참이면, 바이트 코드 파일을 레거시 위치 및 이름에 써서, 다른 버전의 파이썬이 만든 바이트 코드 파일을 덮어쓸 수 있습니다. 기본값은 여러 버전의 파이썬의 바이트 코드 파일이 공존할 수 있는 
@geindex Python 향상 제안; PEP 3147
PEP 3147@footnote{https://peps.python.org/pep-3147/} 위치와 이름에 파일을 쓰는 것입니다.

`optimize'는 컴파일러의 최적화 수준을 지정합니다. 내장 @ref{4b2,,compile()} 함수로 전달됩니다. 한 번의 호출로 하나의 @code{.py} 파일을 여러 번 컴파일하도록 하는 최적화 수준의 시퀀스도 허용합니다.

`invalidation_mode'는 @ref{4cc9,,py_compile.PycInvalidationMode} 열거형의 멤버여야 하며 실행 시간에 생성된 pyc가 무효가 되는 방식을 제어합니다.

`stripdir', `prependdir' 및 `limit_sl_dest' 인자는 위에서 설명한 @code{-s}, @code{-p} 및 @code{-e} 옵션에 해당합니다. @code{str} 이나 @ref{e4a,,os.PathLike}으로 지정할 수 있습니다.

`hardlink_dupes'가 참이고 최적화 수준이 다른 두 개의 @code{.pyc} 파일의 내용이 같으면, 하드 링크를 사용하여 중복 파일을 통합합니다.


Added in version 3.2.



버전 3.5에서 변경: `quiet' 매개 변수가 다중 수준 값으로 변경되었습니다.



버전 3.5에서 변경: `legacy' 매개 변수는 `optimize' 값과 상관없이 @code{.pyo} 파일이 아니라 @code{.pyc} 파일 만 기록합니다.



버전 3.7에서 변경: `invalidation_mode' 매개 변수가 추가되었습니다.



버전 3.7.2에서 변경: `invalidation_mode' 매개 변수의 기본값이 @code{None}으로 변경되었습니다.



버전 3.9에서 변경: `stripdir', `prependdir', `limit_sl_dest' 및 `hardlink_dupes' 인자가 추가되었습니다.

@end deffn

@geindex compile_path() (compileall 모듈)
@anchor{library/compileall compileall compile_path}@anchor{fe1}
@deffn {함수} compileall.compile_path (skip_curdir=True, maxlevels=0, force=False, quiet=0, legacy=False, optimize=-1, invalidation_mode=None)

@code{sys.path}에서 발견된 모든 @code{.py} 파일을 바이트 컴파일합니다. 모든 파일이 성공적으로 컴파일되면 참값을 반환하고, 그렇지 않으면 거짓값을 반환합니다.

`skip_curdir'가 참(기본값)이면, 현재 디렉터리가 검색에 포함되지 않습니다. 다른 모든 매개 변수는 @ref{d1a,,compile_dir()} 함수에 전달됩니다. 다른 컴파일 함수와 달리, @code{maxlevels}의 기본값은 @code{0}임에 유의하십시오.


버전 3.2에서 변경: `legacy'와 `optimize' 매개 변수가 추가되었습니다.



버전 3.5에서 변경: `quiet' 매개 변수가 다중 수준 값으로 변경되었습니다.



버전 3.5에서 변경: `legacy' 매개 변수는 `optimize' 값과 상관없이 @code{.pyo} 파일이 아니라 @code{.pyc} 파일 만 기록합니다.



버전 3.7에서 변경: `invalidation_mode' 매개 변수가 추가되었습니다.



버전 3.7.2에서 변경: `invalidation_mode' 매개 변수의 기본값이 @code{None}으로 변경되었습니다.

@end deffn

@code{Lib/} 서브 디렉터리와 그것의 모든 서브 디렉터리에 있는 모든 @code{.py} 파일을 강제로 다시 컴파일하려면 다음과 같이 합니다:

@example
import compileall

compileall.compile_dir('Lib/', force=True)

# .svn 디렉터리의 파일을 제외하고, 같은 컴파일을 수행합니다.
import re
compileall.compile_dir('Lib/', rx=re.compile(r'[/\\][.]svn'), force=True)

# pathlib.Path 객체도 사용할 수 있습니다.
import pathlib
compileall.compile_dir(pathlib.Path('Lib/'), force=True)
@end example


@subsubheading 더 보기



@table @asis

@item 모듈 @ref{b8,,py_compile}

단일 소스 파일을 바이트 컴파일합니다.
@end table


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node dis — Disassembler for Python bytecode,pickletools — 피클 개발자를 위한 도구,compileall — 파이썬 라이브러리 바이트 컴파일하기,파이썬 언어 서비스
@anchor{library/dis doc}@anchor{4cea}@anchor{library/dis dis-disassembler-for-python-bytecode}@anchor{4ceb}@anchor{library/dis module-dis}@anchor{3c}@anchor{library/dis translation-repo}@anchor{4cec}
@subsection @code{dis} — Disassembler for Python bytecode


@geindex module; dis

`소스 코드:' Lib/dis.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/dis.py}

@c import dis
@c def myfunc(alist):
@c     return len(alist)


__________________________________________________________________


The @code{dis} module supports the analysis of CPython @ref{4ab,,bytecode} by
disassembling it. The CPython bytecode which this module takes as an input is
defined in the file @code{Include/opcode.h} and used by the compiler and the
interpreter.

바이트 코드는 CPython 인터프리터의 구현 세부 사항입니다. 파이썬 버전 간에 바이트 코드가 추가, 제거 또는 변경되지 않을 것이라는 보장은 없습니다. 이 모듈을 사용하는 것이 파이썬 VM이나 파이썬 릴리스에 걸쳐 작동할 것으로 생각하지 말아야 합니다.


버전 3.6에서 변경: 명령어마다 2바이트를 사용합니다. 이전에는 바이트 수가 명령어에 따라 달랐습니다.



버전 3.10에서 변경: The argument of jump, exception handling and loop instructions is now
the instruction offset rather than the byte offset.



버전 3.11에서 변경: Some instructions are accompanied by one or more inline cache entries,
which take the form of @ref{907,,CACHE} instructions. These instructions
are hidden by default, but can be shown by passing @code{show_caches=True} to
any @code{dis} utility. Furthermore, the interpreter now adapts the
bytecode to specialize it for different runtime conditions. The
adaptive bytecode can be shown by passing @code{adaptive=True}.



버전 3.12에서 변경: The argument of a jump is the offset of the target instruction relative
to the instruction that appears immediately after the jump instruction’s
@ref{907,,CACHE} entries.

As a consequence, the presence of the @ref{907,,CACHE} instructions is
transparent for forward jumps but needs to be taken into account when
reasoning about backward jumps.



버전 3.13에서 변경: The output shows logical labels rather than instruction offsets
for jump targets and exception handlers. The @code{-O} command line
option and the @code{show_offsets} argument were added.



버전 3.14에서 변경: The @ref{208,,-P} command-line option
and the @code{show_positions} argument were added.

The @ref{209,,-S} command-line option is added.


Example: Given the function @code{myfunc()}:

@example
def myfunc(alist):
    return len(alist)
@end example

the following command can be used to display the disassembly of
@code{myfunc()}:

@example
>>> dis.dis(myfunc)
  2           RESUME                   0

  3           LOAD_GLOBAL              1 (len + NULL)
              LOAD_FAST_BORROW         0 (alist)
              CALL                     1
              RETURN_VALUE
@end example

(“2”는 줄 번호입니다).

@menu
* Command-line interface: Command-line interface<12>. 
* 바이트 코드 분석:: 
* 분석 함수:: 
* 파이썬 바이트 코드 명령어:: 
* 옵코드 모음:: 

@end menu

@node Command-line interface<12>,바이트 코드 분석,,dis — Disassembler for Python bytecode
@anchor{library/dis command-line-interface}@anchor{4ced}@anchor{library/dis dis-cli}@anchor{4cee}
@subsubsection Command-line interface


The @code{dis} module can be invoked as a script from the command line:

@example
python -m dis [-h] [-C] [-O] [-P] [-S] [infile]
@end example

The following options are accepted:

@geindex dis 명령줄 옵션; -h
@geindex dis 명령줄 옵션; --help
@anchor{library/dis cmdoption-dis-h}@anchor{4cef}@anchor{library/dis cmdoption-dis-help}@anchor{4cf0}
@deffn {Option} @w{-}h, @w{-}@w{-}help

Display usage and exit.
@end deffn

@geindex dis 명령줄 옵션; -C
@geindex dis 명령줄 옵션; --show-caches
@anchor{library/dis cmdoption-dis-C}@anchor{4cf1}@anchor{library/dis cmdoption-dis-show-caches}@anchor{4cf2}
@deffn {Option} @w{-}C, @w{-}@w{-}show@w{-}caches

Show inline caches.


Added in version 3.13.

@end deffn

@geindex dis 명령줄 옵션; -O
@geindex dis 명령줄 옵션; --show-offsets
@anchor{library/dis cmdoption-dis-O}@anchor{4eb}@anchor{library/dis cmdoption-dis-show-offsets}@anchor{4cf3}
@deffn {Option} @w{-}O, @w{-}@w{-}show@w{-}offsets

Show offsets of instructions.


Added in version 3.13.

@end deffn

@geindex dis 명령줄 옵션; -P
@geindex dis 명령줄 옵션; --show-positions
@anchor{library/dis cmdoption-dis-P}@anchor{208}@anchor{library/dis cmdoption-dis-show-positions}@anchor{4cf4}
@deffn {Option} @w{-}P, @w{-}@w{-}show@w{-}positions

Show positions of instructions in the source code.


Added in version 3.14.

@end deffn

@geindex dis 명령줄 옵션; -S
@geindex dis 명령줄 옵션; --specialized
@anchor{library/dis cmdoption-dis-S}@anchor{209}@anchor{library/dis cmdoption-dis-specialized}@anchor{4cf5}
@deffn {Option} @w{-}S, @w{-}@w{-}specialized

Show specialized bytecode.


Added in version 3.14.

@end deffn

If @code{infile} is specified, its disassembled code will be written to stdout.
Otherwise, disassembly is performed on compiled source code received from stdin.

@node 바이트 코드 분석,분석 함수,Command-line interface<12>,dis — Disassembler for Python bytecode
@anchor{library/dis bytecode-analysis}@anchor{4cf6}
@subsubsection 바이트 코드 분석



Added in version 3.4.


바이트 코드 분석 API는 컴파일된 코드의 세부 사항에 쉽게 액세스 할 수 있도록 하는 @ref{204,,Bytecode} 객체로 파이썬 코드 조각을 감쌀 수 있도록 합니다.

@geindex Bytecode (dis 클래스)
@anchor{library/dis dis Bytecode}@anchor{204}
@deffn {클래스} dis.Bytecode (x, *, first_line=None, current_offset=None, show_caches=False, adaptive=False, show_offsets=False, show_positions=False)

함수, 제너레이터, 비동기 제너레이터, 코루틴, 메서드, 소스 코드 문자열 또는 (@ref{4b2,,compile()}에서 반환된) 코드 객체에 해당하는 바이트 코드를 분석합니다.

이것은 아래에 나열된 많은 함수, 특히 @ref{4ec,,get_instructions()}를 둘러싼 편리한 래퍼입니다, @ref{204,,Bytecode} 인스턴스를 이터레이트 하면 바이트 코드 연산이 @ref{203,,Instruction} 인스턴스로 산출되기 때문입니다.

`first_line'이 @code{None}이 아니면, 역 어셈블 된 코드에서 첫 번째 소스 줄에 대해 보고해야 하는 줄 번호를 나타냅니다. 그렇지 않으면, 소스 줄 정보(있다면)를 역 어셈블 된 코드 객체에서 직접 취합니다.

`current_offset'이 @code{None}이 아니면, 역 어셈블 된 코드의 명령어 오프셋을 나타냅니다. 이를 설정하면, @ref{112e,,dis()}가 지정된 옵코드(opcode)에 대해 “현재 명령어” 마커를 표시합니다.

If `show_caches' is @code{True}, @ref{112e,,dis()} will display inline cache
entries used by the interpreter to specialize the bytecode.

If `adaptive' is @code{True}, @ref{112e,,dis()} will display specialized bytecode
that may be different from the original bytecode.

If `show_offsets' is @code{True}, @ref{112e,,dis()} will include instruction
offsets in the output.

If `show_positions' is @code{True}, @ref{112e,,dis()} will include instruction
source code positions in the output.

@geindex from_traceback() (dis.Bytecode의 클래스 메서드)
@anchor{library/dis dis Bytecode from_traceback}@anchor{112f}
@deffn {메서드} classmethod from_traceback (tb, *, show_caches=False)

주어진 트레이스백에서 @ref{204,,Bytecode} 인스턴스를 구성하고, `current_offset'을 예외를 일으킨 명령어로 설정합니다.
@end deffn

@geindex Bytecode.codeobj (dis 모듈)
@anchor{library/dis dis Bytecode codeobj}@anchor{4cf7}
@deffn {데이터} codeobj

컴파일된 코드 객체.
@end deffn

@geindex Bytecode.first_line (dis 모듈)
@anchor{library/dis dis Bytecode first_line}@anchor{4cf8}
@deffn {데이터} first_line

코드 객체의 첫 번째 소스 줄 (사용 가능하다면)
@end deffn

@geindex dis() (dis.Bytecode 메서드)
@anchor{library/dis dis Bytecode dis}@anchor{112e}
@deffn {메서드} dis ()

바이트 코드 연산의 포맷된 보기를 반환합니다 (@ref{205,,dis.dis()}가 인쇄하는 것과 같지만, 여러 줄 문자열로 반환됩니다).
@end deffn

@geindex info() (dis.Bytecode 메서드)
@anchor{library/dis dis Bytecode info}@anchor{4cf9}
@deffn {메서드} info ()

@ref{143e,,code_info()}처럼, 코드 객체에 대한 자세한 정보가 포함된 포맷된 여러 줄 문자열을 반환합니다.
@end deffn


버전 3.7에서 변경: 이제 코루틴과 비동기 제너레이터 객체를 처리할 수 있습니다.



버전 3.11에서 변경: Added the `show_caches' and `adaptive' parameters.



버전 3.13에서 변경: Added the `show_offsets' parameter



버전 3.14에서 변경: Added the `show_positions' parameter.

@end deffn

Example:

@example
>>> bytecode = dis.Bytecode(myfunc)
>>> for instr in bytecode:
...     print(instr.opname)
...
RESUME
LOAD_GLOBAL
LOAD_FAST_BORROW
CALL
RETURN_VALUE
@end example

@node 분석 함수,파이썬 바이트 코드 명령어,바이트 코드 분석,dis — Disassembler for Python bytecode
@anchor{library/dis analysis-functions}@anchor{4cfa}
@subsubsection 분석 함수


The @code{dis} module also defines the following analysis functions that convert
the input directly to the desired output. They can be useful if only a single
operation is being performed, so the intermediate analysis object isn’t useful:

@geindex code_info() (dis 모듈)
@anchor{library/dis dis code_info}@anchor{143e}
@deffn {함수} dis.code_info (x)

제공된 함수, 제너레이터, 비동기 제너레이터, 코루틴, 메서드, 소스 코드 문자열 또는 코드 객체에 대한 자세한 코드 객체 정보가 포함된 포맷된 여러 줄 문자열을 반환합니다.

코드 정보 문자열의 정확한 내용은 구현에 따라 달라지며 파이썬 VM이나 파이썬 릴리스에 걸쳐 임의로 변경될 수 있습니다.


Added in version 3.2.



버전 3.7에서 변경: 이제 코루틴과 비동기 제너레이터 객체를 처리할 수 있습니다.

@end deffn

@geindex show_code() (dis 모듈)
@anchor{library/dis dis show_code}@anchor{112d}
@deffn {함수} dis.show_code (x, *, file=None)

제공된 함수, 메서드, 소스 코드 문자열 또는 코드 객체에 대한 자세한 코드 객체 정보를 `file'(또는 `file'이 지정되지 않으면 @code{sys.stdout})로 인쇄합니다.

이것은 @code{print(code_info(x), file=file)}의 편리한 축약 형으로, 인터프리터 프롬프트에서의 대화식 탐색을 위한 것입니다.


Added in version 3.2.



버전 3.4에서 변경: `file' 매개 변수를 추가했습니다.

@end deffn

@geindex dis() (dis 모듈)
@anchor{library/dis dis dis}@anchor{205}
@deffn {함수} dis.dis (x=None, *, file=None, depth=None, show_caches=False, adaptive=False, show_offsets=False, show_positions=False)

Disassemble the `x' object.  `x' can denote either a module, a class, a
method, a function, a generator, an asynchronous generator, a coroutine,
a code object, a string of source code or a byte sequence of raw bytecode.
For a module, it disassembles all functions. For a class, it disassembles
all methods (including class and static methods). For a code object or
sequence of raw bytecode, it prints one line per bytecode instruction.
It also recursively disassembles nested code objects. These can include
generator expressions, nested functions, the bodies of nested classes,
and the code objects used for @ref{4ac,,annotation scopes}.
Strings are first compiled to code objects with the @ref{4b2,,compile()}
built-in function before being disassembled.  If no object is provided, this
function disassembles the last traceback.

역 어셈블리는 제공된다면 제공된 `file' 인자에, 그렇지 않으면 @code{sys.stdout}에 텍스트로 기록됩니다.

재귀의 최대 깊이는 @code{None}이 아닌 한 `depth'에 의해 제한됩니다. @code{depth=0}은 재귀가 없음을 의미합니다.

If `show_caches' is @code{True}, this function will display inline cache
entries used by the interpreter to specialize the bytecode.

If `adaptive' is @code{True}, this function will display specialized bytecode
that may be different from the original bytecode.


버전 3.4에서 변경: `file' 매개 변수를 추가했습니다.



버전 3.7에서 변경: 재귀 역 어셈블을 구현하고 `depth' 매개 변수를 추가했습니다.



버전 3.7에서 변경: 이제 코루틴과 비동기 제너레이터 객체를 처리할 수 있습니다.



버전 3.11에서 변경: Added the `show_caches' and `adaptive' parameters.



버전 3.13에서 변경: Added the `show_offsets' parameter.



버전 3.14에서 변경: Added the `show_positions' parameter.

@end deffn

@geindex distb() (dis 모듈)
@anchor{library/dis dis distb}@anchor{206}
@deffn {함수} dis.distb (tb=None, *, file=None, show_caches=False, adaptive=False, show_offset=False, show_positions=False)

트레이스백의 최상단 함수를 역 어셈블 합니다. 전달되지 않으면 마지막 트레이스백을 사용합니다. 예외를 일으키는 명령어가 표시됩니다.

역 어셈블리는 제공된다면 제공된 `file' 인자에, 그렇지 않으면 @code{sys.stdout}에 텍스트로 기록됩니다.


버전 3.4에서 변경: `file' 매개 변수를 추가했습니다.



버전 3.11에서 변경: Added the `show_caches' and `adaptive' parameters.



버전 3.13에서 변경: Added the `show_offsets' parameter.



버전 3.14에서 변경: Added the `show_positions' parameter.

@end deffn

@geindex disassemble() (dis 모듈)
@geindex disco() (dis 모듈)
@anchor{library/dis dis disassemble}@anchor{207}
@deffn {함수} dis.disassemble (code, lasti=-1, *, file=None, show_caches=False, adaptive=False, show_offsets=False, show_positions=False)
@anchor{library/dis dis disco}@anchor{4cfb}
@deffnx {함수} dis.disco (code, lasti=-1, *, file=None, show_caches=False, adaptive=False, show_offsets=False, show_positions=False)

코드 객체를 역 어셈블 하고, `lasti'가 제공되면 마지막 명령어를 표시합니다. 출력은 다음 열로 나뉩니다:


@enumerate 

@item 
the source code location of the instruction. Complete location information
is shown if `show_positions' is true. Otherwise (the default) only the
line number is displayed.

@item 
현재 명령어, @code{-->}로 표시됩니다,

@item 
레이블이 있는 명령어, @code{>>}로 표시됩니다,

@item 
명령어의 주소,

@item 
연산 코드 이름,

@item 
연산 매개 변수, 그리고

@item 
괄호 안에 있는 매개 변수의 해석.
@end enumerate

매개 변수 해석은 지역과 전역 변수 이름, 상숫값, 분기 대상 및 비교 연산자를 인식합니다.

역 어셈블리는 제공된다면 제공된 `file' 인자에, 그렇지 않으면 @code{sys.stdout}에 텍스트로 기록됩니다.


버전 3.4에서 변경: `file' 매개 변수를 추가했습니다.



버전 3.11에서 변경: Added the `show_caches' and `adaptive' parameters.



버전 3.13에서 변경: Added the `show_offsets' parameter.



버전 3.14에서 변경: Added the `show_positions' parameter.

@end deffn

@geindex get_instructions() (dis 모듈)
@anchor{library/dis dis get_instructions}@anchor{4ec}
@deffn {함수} dis.get_instructions (x, *, first_line=None, show_caches=False, adaptive=False)

제공된 함수, 메서드, 소스 코드 문자열 또는 코드 객체의 명령어들에 대한 이터레이터를 반환합니다.

이터레이터는 제공된 코드의 각 연산에 대한 세부 정보를 제공하는 @ref{203,,Instruction} 네임드 튜플의 연속을 생성합니다.

`first_line'이 @code{None}이 아니면, 역 어셈블 된 코드에서 첫 번째 소스 줄에 대해 보고해야 하는 줄 번호를 나타냅니다. 그렇지 않으면, 소스 줄 정보(있다면)를 역 어셈블 된 코드 객체에서 직접 취합니다.

The `adaptive' parameter works as it does in @ref{3c,,dis()}.


Added in version 3.4.



버전 3.11에서 변경: Added the `show_caches' and `adaptive' parameters.



버전 3.13에서 변경: The `show_caches' parameter is deprecated and has no effect. The iterator
generates the @ref{203,,Instruction} instances with the `cache_info'
field populated (regardless of the value of `show_caches') and it no longer
generates separate items for the cache entries.

@end deffn

@geindex findlinestarts() (dis 모듈)
@anchor{library/dis dis findlinestarts}@anchor{4cfc}
@deffn {함수} dis.findlinestarts (code)

This generator function uses the @ref{350,,co_lines()} method
of the @ref{4e6,,code object} `code' to find the offsets which
are starts of
lines in the source code.  They are generated as @code{(offset, lineno)} pairs.


버전 3.6에서 변경: 줄 번호가 줄어들 수 있습니다. 전에는, 언제나 증가했습니다.



버전 3.10에서 변경: The 
@geindex Python 향상 제안; PEP 626
PEP 626@footnote{https://peps.python.org/pep-0626/} @ref{350,,co_lines()} method is used instead of the
@ref{2390,,co_firstlineno} and @ref{330,,co_lnotab}
attributes of the @ref{4e6,,code object}.



버전 3.13에서 변경: Line numbers can be @code{None} for bytecode that does not map to source lines.

@end deffn

@geindex findlabels() (dis 모듈)
@anchor{library/dis dis findlabels}@anchor{4cfd}
@deffn {함수} dis.findlabels (code)

원시 컴파일된 바이트 코드 문자열 `code'에서 점프 대상인 모든 오프셋을 감지하고, 이러한 오프셋의 리스트를 반환합니다.
@end deffn

@geindex stack_effect() (dis 모듈)
@anchor{library/dis dis stack_effect}@anchor{1130}
@deffn {함수} dis.stack_effect (opcode, oparg=None, *, jump=None)

인자 `oparg'를 갖는 `opcode'의 스택 효과를 계산합니다.

코드에 점프 대상이 있고 `jump'가 @code{True}이면, @ref{1130,,stack_effect()}는 점프의 스택 효과를 반환합니다. `jump'가 @code{False}이면, 점프하지 않는 스택 효과를 반환합니다. `jump'가 @code{None}(기본값)이면, 두 경우의 최대 스택 효과를 반환합니다.


Added in version 3.4.



버전 3.8에서 변경: `jump' 매개 변수를 추가했습니다.



버전 3.13에서 변경: If @code{oparg} is omitted (or @code{None}), the stack effect is now returned
for @code{oparg=0}. Previously this was an error for opcodes that use their
arg. It is also no longer an error to pass an integer @code{oparg} when
the @code{opcode} does not use it; the @code{oparg} in this case is ignored.

@end deffn

@node 파이썬 바이트 코드 명령어,옵코드 모음,분석 함수,dis — Disassembler for Python bytecode
@anchor{library/dis bytecodes}@anchor{7ce}@anchor{library/dis python-bytecode-instructions}@anchor{4cfe}
@subsubsection 파이썬 바이트 코드 명령어


@ref{4ec,,get_instructions()} 함수와 @ref{204,,Bytecode} 클래스는 바이트 코드 명령어의 세부 사항을 @ref{203,,Instruction} 인스턴스로 제공합니다:

@geindex Instruction (dis 클래스)
@anchor{library/dis dis Instruction}@anchor{203}
@deffn {클래스} dis.Instruction

바이트 코드 연산에 대한 세부 사항

@geindex Instruction.opcode (dis 모듈)
@anchor{library/dis dis Instruction opcode}@anchor{4cff}
@deffn {데이터} opcode

연산의 숫자 코드, 아래 나열된 옵코드 값과 @ref{4d00,,옵코드 모음}에 있는 바이트 코드 값에 해당합니다.
@end deffn

@geindex Instruction.opname (dis 모듈)
@anchor{library/dis dis Instruction opname}@anchor{4d01}
@deffn {데이터} opname

연산의 사람이 읽을 수 있는 이름
@end deffn

@geindex Instruction.baseopcode (dis 모듈)
@anchor{library/dis dis Instruction baseopcode}@anchor{4d02}
@deffn {데이터} baseopcode

numeric code for the base operation if operation is specialized;
otherwise equal to @ref{4cff,,opcode}
@end deffn

@geindex Instruction.baseopname (dis 모듈)
@anchor{library/dis dis Instruction baseopname}@anchor{4d03}
@deffn {데이터} baseopname

human readable name for the base operation if operation is specialized;
otherwise equal to @ref{4d04,,opname}
@end deffn

@geindex Instruction.arg (dis 모듈)
@anchor{library/dis dis Instruction arg}@anchor{4d05}
@deffn {데이터} arg

연산에 대한 숫자 인자 (있다면), 그렇지 않으면 @code{None}
@end deffn

@geindex Instruction.oparg (dis 모듈)
@anchor{library/dis dis Instruction oparg}@anchor{4d06}
@deffn {데이터} oparg

alias for @ref{4d05,,arg}
@end deffn

@geindex Instruction.argval (dis 모듈)
@anchor{library/dis dis Instruction argval}@anchor{4d07}
@deffn {데이터} argval

resolved arg value (if any), otherwise @code{None}
@end deffn

@geindex Instruction.argrepr (dis 모듈)
@anchor{library/dis dis Instruction argrepr}@anchor{4d08}
@deffn {데이터} argrepr

human readable description of operation argument (if any),
otherwise an empty string.
@end deffn

@geindex Instruction.offset (dis 모듈)
@anchor{library/dis dis Instruction offset}@anchor{4d09}
@deffn {데이터} offset

바이트 코드 시퀀스 내에서 연산의 시작 인덱스
@end deffn

@geindex Instruction.start_offset (dis 모듈)
@anchor{library/dis dis Instruction start_offset}@anchor{4d0a}
@deffn {데이터} start_offset

start index of operation within bytecode sequence, including prefixed
@code{EXTENDED_ARG} operations if present; otherwise equal to @ref{4d09,,offset}
@end deffn

@geindex Instruction.cache_offset (dis 모듈)
@anchor{library/dis dis Instruction cache_offset}@anchor{4d0b}
@deffn {데이터} cache_offset

start index of the cache entries following the operation
@end deffn

@geindex Instruction.end_offset (dis 모듈)
@anchor{library/dis dis Instruction end_offset}@anchor{4d0c}
@deffn {데이터} end_offset

end index of the cache entries following the operation
@end deffn

@geindex Instruction.starts_line (dis 모듈)
@anchor{library/dis dis Instruction starts_line}@anchor{4d0d}
@deffn {데이터} starts_line

@code{True} if this opcode starts a source line, otherwise @code{False}
@end deffn

@geindex Instruction.line_number (dis 모듈)
@anchor{library/dis dis Instruction line_number}@anchor{4d0e}
@deffn {데이터} line_number

source line number associated with this opcode (if any), otherwise @code{None}
@end deffn

@geindex Instruction.is_jump_target (dis 모듈)
@anchor{library/dis dis Instruction is_jump_target}@anchor{4d0f}
@deffn {데이터} is_jump_target

다른 코드가 여기로 점프하면 @code{True}, 그렇지 않으면 @code{False}
@end deffn

@geindex Instruction.jump_target (dis 모듈)
@anchor{library/dis dis Instruction jump_target}@anchor{4d10}
@deffn {데이터} jump_target

bytecode index of the jump target if this is a jump operation,
otherwise @code{None}
@end deffn

@geindex Instruction.positions (dis 모듈)
@anchor{library/dis dis Instruction positions}@anchor{4d11}
@deffn {데이터} positions

@ref{1941,,dis.Positions} object holding the
start and end locations that are covered by this instruction.
@end deffn

@geindex Instruction.cache_info (dis 모듈)
@anchor{library/dis dis Instruction cache_info}@anchor{4d12}
@deffn {데이터} cache_info

Information about the cache entries of this instruction, as
triplets of the form @code{(name, size, data)}, where the @code{name}
and @code{size} describe the cache format and data is the contents
of the cache. @code{cache_info} is @code{None} if the instruction does not have
caches.
@end deffn


Added in version 3.4.



버전 3.11에서 변경: Field @code{positions} is added.



버전 3.13에서 변경: Changed field @code{starts_line}.

Added fields @code{start_offset}, @code{cache_offset}, @code{end_offset},
@code{baseopname}, @code{baseopcode}, @code{jump_target}, @code{oparg},
@code{line_number} and @code{cache_info}.

@end deffn

@geindex Positions (dis 클래스)
@anchor{library/dis dis Positions}@anchor{1941}
@deffn {클래스} dis.Positions

In case the information is not available, some fields might be @code{None}.

@geindex Positions.lineno (dis 모듈)
@anchor{library/dis dis Positions lineno}@anchor{4d13}
@deffn {데이터} lineno
@end deffn

@geindex Positions.end_lineno (dis 모듈)
@anchor{library/dis dis Positions end_lineno}@anchor{4d14}
@deffn {데이터} end_lineno
@end deffn

@geindex Positions.col_offset (dis 모듈)
@anchor{library/dis dis Positions col_offset}@anchor{4d15}
@deffn {데이터} col_offset
@end deffn

@geindex Positions.end_col_offset (dis 모듈)
@anchor{library/dis dis Positions end_col_offset}@anchor{4d16}
@deffn {데이터} end_col_offset
@end deffn


Added in version 3.11.

@end deffn

파이썬 컴파일러는 현재 다음 바이트 코드 명령어를 생성합니다.

`일반 명령어'

In the following, We will refer to the interpreter stack as @code{STACK} and describe
operations on it as if it was a Python list. The top of the stack corresponds to
@code{STACK[-1]} in this language.

@geindex NOP (opcode)
@anchor{library/dis opcode-NOP}@anchor{4d17}
@deffn {Opcode} NOP

Do nothing code.  Used as a placeholder by the bytecode optimizer, and to
generate line tracing events.
@end deffn

@geindex NOT_TAKEN (opcode)
@anchor{library/dis opcode-NOT_TAKEN}@anchor{376}
@deffn {Opcode} NOT_TAKEN

Do nothing code.
Used by the interpreter to record @ref{295,,BRANCH_LEFT}
and @ref{296,,BRANCH_RIGHT} events for @ref{e0,,sys.monitoring}.


Added in version 3.14.

@end deffn

@geindex POP_ITER (opcode)
@anchor{library/dis opcode-POP_ITER}@anchor{370}
@deffn {Opcode} POP_ITER

Removes the iterator from the top of the stack.


Added in version 3.14.

@end deffn

@geindex POP_TOP (opcode)
@anchor{library/dis opcode-POP_TOP}@anchor{4d18}
@deffn {Opcode} POP_TOP

Removes the top-of-stack item:

@example
STACK.pop()
@end example
@end deffn

@geindex END_FOR (opcode)
@anchor{library/dis opcode-END_FOR}@anchor{4d19}
@deffn {Opcode} END_FOR

Removes the top-of-stack item.
Equivalent to @code{POP_TOP}.
Used to clean up at the end of loops, hence the name.


Added in version 3.12.

@end deffn

@geindex END_SEND (opcode)
@anchor{library/dis opcode-END_SEND}@anchor{4d1a}
@deffn {Opcode} END_SEND

Implements @code{del STACK[-2]}.
Used to clean up when a generator exits.


Added in version 3.12.

@end deffn

@geindex COPY (opcode)
@anchor{library/dis opcode-COPY}@anchor{916}
@deffn {Opcode} COPY (i)

Push the i-th item to the top of the stack without removing it from its original
location:

@example
assert i > 0
STACK.append(STACK[-i])
@end example


Added in version 3.11.

@end deffn

@geindex SWAP (opcode)
@anchor{library/dis opcode-SWAP}@anchor{917}
@deffn {Opcode} SWAP (i)

Swap the top of the stack with the i-th element:

@example
STACK[-i], STACK[-1] = STACK[-1], STACK[-i]
@end example


Added in version 3.11.

@end deffn

@geindex CACHE (opcode)
@anchor{library/dis opcode-CACHE}@anchor{907}
@deffn {Opcode} CACHE

Rather than being an actual instruction, this opcode is used to mark extra
space for the interpreter to cache useful data directly in the bytecode
itself. It is automatically hidden by all @code{dis} utilities, but can be
viewed with @code{show_caches=True}.

Logically, this space is part of the preceding instruction. Many opcodes
expect to be followed by an exact number of caches, and will instruct the
interpreter to skip over them at runtime.

Populated caches can look like arbitrary instructions, so great care should
be taken when reading or modifying raw, adaptive bytecode containing
quickened data.


Added in version 3.11.

@end deffn

`단항 연산'

단항 연산은 스택의 최상단을 취하고, 연산을 적용한 다음, 결과를 스택에 다시 푸시합니다.

@geindex UNARY_NEGATIVE (opcode)
@anchor{library/dis opcode-UNARY_NEGATIVE}@anchor{4d1b}
@deffn {Opcode} UNARY_NEGATIVE

Implements @code{STACK[-1] = -STACK[-1]}.
@end deffn

@geindex UNARY_NOT (opcode)
@anchor{library/dis opcode-UNARY_NOT}@anchor{1a61}
@deffn {Opcode} UNARY_NOT

Implements @code{STACK[-1] = not STACK[-1]}.


버전 3.13에서 변경: This instruction now requires an exact @ref{3c3,,bool} operand.

@end deffn

@geindex UNARY_INVERT (opcode)
@anchor{library/dis opcode-UNARY_INVERT}@anchor{4d1c}
@deffn {Opcode} UNARY_INVERT

Implements @code{STACK[-1] = ~STACK[-1]}.
@end deffn

@geindex GET_ITER (opcode)
@anchor{library/dis opcode-GET_ITER}@anchor{4d1d}
@deffn {Opcode} GET_ITER

Implements @code{STACK[-1] = iter(STACK[-1])}.
@end deffn

@geindex GET_YIELD_FROM_ITER (opcode)
@anchor{library/dis opcode-GET_YIELD_FROM_ITER}@anchor{4d1e}
@deffn {Opcode} GET_YIELD_FROM_ITER

If @code{STACK[-1]} is a @ref{dd8,,generator iterator} or @ref{6b8,,coroutine} object
it is left as is.  Otherwise, implements @code{STACK[-1] = iter(STACK[-1])}.


Added in version 3.5.

@end deffn

@geindex TO_BOOL (opcode)
@anchor{library/dis opcode-TO_BOOL}@anchor{1a5e}
@deffn {Opcode} TO_BOOL

Implements @code{STACK[-1] = bool(STACK[-1])}.


Added in version 3.13.

@end deffn

`Binary and in-place operations'

Binary operations remove the top two items from the stack (@code{STACK[-1]} and
@code{STACK[-2]}). They perform the operation, then put the result back on the stack.

In-place operations are like binary operations, but the operation is done in-place
when @code{STACK[-2]} supports it, and the resulting @code{STACK[-1]} may be (but does
not have to be) the original @code{STACK[-2]}.

@geindex BINARY_OP (opcode)
@anchor{library/dis opcode-BINARY_OP}@anchor{366}
@deffn {Opcode} BINARY_OP (op)

Implements the binary and in-place operators (depending on the value of
`op'):

@example
rhs = STACK.pop()
lhs = STACK.pop()
STACK.append(lhs op rhs)
@end example


Added in version 3.11.



버전 3.14에서 변경: With oparg :@code{NB_SUBSCR}, implements binary subscript (replaces opcode @code{BINARY_SUBSCR})

@end deffn

@geindex STORE_SUBSCR (opcode)
@anchor{library/dis opcode-STORE_SUBSCR}@anchor{1ba9}
@deffn {Opcode} STORE_SUBSCR

Implements:

@example
key = STACK.pop()
container = STACK.pop()
value = STACK.pop()
container[key] = value
@end example
@end deffn

@geindex DELETE_SUBSCR (opcode)
@anchor{library/dis opcode-DELETE_SUBSCR}@anchor{4d1f}
@deffn {Opcode} DELETE_SUBSCR

Implements:

@example
key = STACK.pop()
container = STACK.pop()
del container[key]
@end example
@end deffn

@geindex BINARY_SLICE (opcode)
@anchor{library/dis opcode-BINARY_SLICE}@anchor{704}
@deffn {Opcode} BINARY_SLICE

Implements:

@example
end = STACK.pop()
start = STACK.pop()
container = STACK.pop()
STACK.append(container[start:end])
@end example


Added in version 3.12.

@end deffn

@geindex STORE_SLICE (opcode)
@anchor{library/dis opcode-STORE_SLICE}@anchor{705}
@deffn {Opcode} STORE_SLICE

Implements:

@example
end = STACK.pop()
start = STACK.pop()
container = STACK.pop()
value = STACK.pop()
container[start:end] = value
@end example


Added in version 3.12.

@end deffn

`코루틴 옵코드'

@geindex GET_AWAITABLE (opcode)
@anchor{library/dis opcode-GET_AWAITABLE}@anchor{1bc5}
@deffn {Opcode} GET_AWAITABLE (where)

Implements @code{STACK[-1] = get_awaitable(STACK[-1])}, where @code{get_awaitable(o)}
returns @code{o} if @code{o} is a coroutine object or a generator object with
the @ref{4a98,,CO_ITERABLE_COROUTINE} flag, or resolves
@code{o.__await__}.

@quotation

If the @code{where} operand is nonzero, it indicates where the instruction
occurs:


@itemize *

@item 
@code{1}: After a call to @code{__aenter__}

@item 
@code{2}: After a call to @code{__aexit__}
@end itemize
@end quotation


Added in version 3.5.



버전 3.11에서 변경: Previously, this instruction did not have an oparg.

@end deffn

@geindex GET_AITER (opcode)
@anchor{library/dis opcode-GET_AITER}@anchor{4d20}
@deffn {Opcode} GET_AITER

Implements @code{STACK[-1] = STACK[-1].__aiter__()}.


Added in version 3.5.



버전 3.7에서 변경: @code{__aiter__}로부터 어웨이터블 객체를 반환하는 것은 더는 지원되지 않습니다.

@end deffn

@geindex GET_ANEXT (opcode)
@anchor{library/dis opcode-GET_ANEXT}@anchor{4d21}
@deffn {Opcode} GET_ANEXT

Implement @code{STACK.append(get_awaitable(STACK[-1].__anext__()))} to the stack.
See @code{GET_AWAITABLE} for details about @code{get_awaitable}.


Added in version 3.5.

@end deffn

@geindex END_ASYNC_FOR (opcode)
@anchor{library/dis opcode-END_ASYNC_FOR}@anchor{ca0}
@deffn {Opcode} END_ASYNC_FOR

Terminates an @ref{c9f,,async for} loop.  Handles an exception raised
when awaiting a next item. The stack contains the async iterable in
@code{STACK[-2]} and the raised exception in @code{STACK[-1]}. Both are popped.
If the exception is not @ref{1e0c,,StopAsyncIteration}, it is re-raised.


Added in version 3.8.



버전 3.11에서 변경: Exception representation on the stack now consist of one, not three, items.

@end deffn

@geindex CLEANUP_THROW (opcode)
@anchor{library/dis opcode-CLEANUP_THROW}@anchor{708}
@deffn {Opcode} CLEANUP_THROW

Handles an exception raised during a @ref{71b,,throw()} or
@ref{179b,,close()} call through the current frame.  If @code{STACK[-1]} is an
instance of @ref{df4,,StopIteration}, pop three values from the stack and push
its @code{value} member.  Otherwise, re-raise @code{STACK[-1]}.


Added in version 3.12.

@end deffn

`기타 옵코드'

@geindex SET_ADD (opcode)
@anchor{library/dis opcode-SET_ADD}@anchor{4d22}
@deffn {Opcode} SET_ADD (i)

Implements:

@example
item = STACK.pop()
set.add(STACK[-i], item)
@end example

Used to implement set comprehensions.
@end deffn

@geindex LIST_APPEND (opcode)
@anchor{library/dis opcode-LIST_APPEND}@anchor{4d23}
@deffn {Opcode} LIST_APPEND (i)

Implements:

@example
item = STACK.pop()
list.append(STACK[-i], item)
@end example

Used to implement list comprehensions.
@end deffn

@geindex MAP_ADD (opcode)
@anchor{library/dis opcode-MAP_ADD}@anchor{ca1}
@deffn {Opcode} MAP_ADD (i)

Implements:

@example
value = STACK.pop()
key = STACK.pop()
dict.__setitem__(STACK[-i], key, value)
@end example

Used to implement dict comprehensions.


Added in version 3.1.



버전 3.8에서 변경: Map value is @code{STACK[-1]} and map key is @code{STACK[-2]}. Before, those
were reversed.

@end deffn

모든 @ref{4d22,,SET_ADD}, @ref{4d23,,LIST_APPEND} 및 @ref{ca1,,MAP_ADD} 명령어에 대해, 추가된 값이나 키/값 쌍이 팝 되지만, 컨테이너 객체는 스택에 남아 있어서 루프의 추가 이터레이션에 사용할 수 있습니다.

@geindex RETURN_VALUE (opcode)
@anchor{library/dis opcode-RETURN_VALUE}@anchor{1b1e}
@deffn {Opcode} RETURN_VALUE

Returns with @code{STACK[-1]} to the caller of the function.
@end deffn

@geindex YIELD_VALUE (opcode)
@anchor{library/dis opcode-YIELD_VALUE}@anchor{1a39}
@deffn {Opcode} YIELD_VALUE

Yields @code{STACK.pop()} from a @ref{1260,,generator}.


버전 3.11에서 변경: oparg set to be the stack depth.



버전 3.12에서 변경: oparg set to be the exception block depth, for efficient closing of generators.



버전 3.13에서 변경: oparg is @code{1} if this instruction is part of a yield-from or await, and @code{0}
otherwise.

@end deffn

@geindex SETUP_ANNOTATIONS (opcode)
@anchor{library/dis opcode-SETUP_ANNOTATIONS}@anchor{f50}
@deffn {Opcode} SETUP_ANNOTATIONS

@code{locals()}에 @code{__annotations__}가 정의되어 있는지 확인합니다, 그렇지 않으면 비어있는 @code{dict}로 설정됩니다. 이 옵코드는 클래스나 모듈 본문에 @ref{f4f,,변수 어노테이션}이 정적으로 포함될 때만 생성됩니다.


Added in version 3.6.

@end deffn

@geindex POP_EXCEPT (opcode)
@anchor{library/dis opcode-POP_EXCEPT}@anchor{4d24}
@deffn {Opcode} POP_EXCEPT

Pops a value from the stack, which is used to restore the exception state.


버전 3.11에서 변경: Exception representation on the stack now consist of one, not three, items.

@end deffn

@geindex RERAISE (opcode)
@anchor{library/dis opcode-RERAISE}@anchor{4d25}
@deffn {Opcode} RERAISE

Re-raises the exception currently on top of the stack. If oparg is non-zero,
pops an additional value from the stack which is used to set
@ref{a88,,f_lasti} of the current frame.


Added in version 3.9.



버전 3.11에서 변경: Exception representation on the stack now consist of one, not three, items.

@end deffn

@geindex PUSH_EXC_INFO (opcode)
@anchor{library/dis opcode-PUSH_EXC_INFO}@anchor{911}
@deffn {Opcode} PUSH_EXC_INFO

Pops a value from the stack. Pushes the current exception to the top of the stack.
Pushes the value originally popped back to the stack.
Used in exception handlers.


Added in version 3.11.

@end deffn

@geindex CHECK_EXC_MATCH (opcode)
@anchor{library/dis opcode-CHECK_EXC_MATCH}@anchor{918}
@deffn {Opcode} CHECK_EXC_MATCH

Performs exception matching for @code{except}. Tests whether the @code{STACK[-2]}
is an exception matching @code{STACK[-1]}. Pops @code{STACK[-1]} and pushes the boolean
result of the test.


Added in version 3.11.

@end deffn

@geindex CHECK_EG_MATCH (opcode)
@anchor{library/dis opcode-CHECK_EG_MATCH}@anchor{910}
@deffn {Opcode} CHECK_EG_MATCH

Performs exception matching for @code{except*}. Applies @code{split(STACK[-1])} on
the exception group representing @code{STACK[-2]}.

In case of a match, pops two items from the stack and pushes the
non-matching subgroup (@code{None} in case of full match) followed by the
matching subgroup. When there is no match, pops one item (the match
type) and pushes @code{None}.


Added in version 3.11.

@end deffn

@geindex WITH_EXCEPT_START (opcode)
@anchor{library/dis opcode-WITH_EXCEPT_START}@anchor{4d26}
@deffn {Opcode} WITH_EXCEPT_START

Calls the function in position 4 on the stack with arguments (type, val, tb)
representing the exception at the top of the stack.
Used to implement the call @code{context_manager.__exit__(*exc_info())} when an exception
has occurred in a @ref{186,,with} statement.


Added in version 3.9.



버전 3.11에서 변경: The @code{__exit__} function is in position 4 of the stack rather than 7.
Exception representation on the stack now consist of one, not three, items.

@end deffn

@geindex LOAD_COMMON_CONSTANT (opcode)
@anchor{library/dis opcode-LOAD_COMMON_CONSTANT}@anchor{36a}
@deffn {Opcode} LOAD_COMMON_CONSTANT

Pushes a common constant onto the stack. The interpreter contains a hardcoded
list of constants supported by this instruction.  Used by the @ref{b60,,assert}
statement to load @ref{8b7,,AssertionError}.


Added in version 3.14.

@end deffn

@geindex LOAD_BUILD_CLASS (opcode)
@anchor{library/dis opcode-LOAD_BUILD_CLASS}@anchor{4d27}
@deffn {Opcode} LOAD_BUILD_CLASS

Pushes @code{builtins.__build_class__()} onto the stack.  It is later called
to construct a class.
@end deffn

@geindex GET_LEN (opcode)
@anchor{library/dis opcode-GET_LEN}@anchor{4d28}
@deffn {Opcode} GET_LEN

Perform @code{STACK.append(len(STACK[-1]))}. Used in @ref{a0e,,match} statements where
comparison with structure of pattern is needed.


Added in version 3.10.

@end deffn

@geindex MATCH_MAPPING (opcode)
@anchor{library/dis opcode-MATCH_MAPPING}@anchor{4d29}
@deffn {Opcode} MATCH_MAPPING

If @code{STACK[-1]} is an instance of @ref{ac7,,collections.abc.Mapping} (or, more
technically: if it has the @ref{1c56,,Py_TPFLAGS_MAPPING} flag set in its
@ref{1c6f,,tp_flags}), push @code{True} onto the stack.  Otherwise,
push @code{False}.


Added in version 3.10.

@end deffn

@geindex MATCH_SEQUENCE (opcode)
@anchor{library/dis opcode-MATCH_SEQUENCE}@anchor{4d2a}
@deffn {Opcode} MATCH_SEQUENCE

If @code{STACK[-1]} is an instance of @ref{13c9,,collections.abc.Sequence} and is `not' an instance
of @ref{169,,str}/@ref{192,,bytes}/@ref{344,,bytearray} (or, more technically: if it has
the @ref{1c57,,Py_TPFLAGS_SEQUENCE} flag set in its @ref{1c6f,,tp_flags}),
push @code{True} onto the stack.  Otherwise, push @code{False}.


Added in version 3.10.

@end deffn

@geindex MATCH_KEYS (opcode)
@anchor{library/dis opcode-MATCH_KEYS}@anchor{91f}
@deffn {Opcode} MATCH_KEYS

@code{STACK[-1]} is a tuple of mapping keys, and @code{STACK[-2]} is the match subject.
If @code{STACK[-2]} contains all of the keys in @code{STACK[-1]}, push a @ref{610,,tuple}
containing the corresponding values. Otherwise, push @code{None}.


Added in version 3.10.



버전 3.11에서 변경: Previously, this instruction also pushed a boolean value indicating
success (@code{True}) or failure (@code{False}).

@end deffn

@geindex STORE_NAME (opcode)
@anchor{library/dis opcode-STORE_NAME}@anchor{4d2b}
@deffn {Opcode} STORE_NAME (namei)

Implements @code{name = STACK.pop()}. `namei' is the index of `name' in the attribute
@ref{238f,,co_names} of the @ref{4e6,,code object}.
The compiler tries to use @ref{1a63,,STORE_FAST} or @ref{4d2c,,STORE_GLOBAL} if possible.
@end deffn

@geindex DELETE_NAME (opcode)
@anchor{library/dis opcode-DELETE_NAME}@anchor{4d2d}
@deffn {Opcode} DELETE_NAME (namei)

Implements @code{del name}, where `namei' is the index into @ref{238f,,co_names}
attribute of the @ref{4e6,,code object}.
@end deffn

@geindex UNPACK_SEQUENCE (opcode)
@anchor{library/dis opcode-UNPACK_SEQUENCE}@anchor{1bc7}
@deffn {Opcode} UNPACK_SEQUENCE (count)

Unpacks @code{STACK[-1]} into `count' individual values, which are put onto the stack
right-to-left. Require there to be exactly `count' values.:

@example
assert(len(STACK[-1]) == count)
STACK.extend(STACK.pop()[:-count-1:-1])
@end example
@end deffn

@geindex UNPACK_EX (opcode)
@anchor{library/dis opcode-UNPACK_EX}@anchor{4d2e}
@deffn {Opcode} UNPACK_EX (counts)

Implements assignment with a starred target: Unpacks an iterable in @code{STACK[-1]}
into individual values, where the total number of values can be smaller than the
number of items in the iterable: one of the new values will be a list of all
leftover items.

The number of values before and after the list value is limited to 255.

The number of values before the list value is encoded in the argument of the
opcode. The number of values after the list if any is encoded using an
@code{EXTENDED_ARG}. As a consequence, the argument can be seen as a two bytes values
where the low byte of `counts' is the number of values before the list value, the
high byte of `counts' the number of values after it.

The extracted values are put onto the stack right-to-left, i.e. @code{a, *b, c = d}
will be stored after execution as @code{STACK.extend((a, b, c))}.
@end deffn

@geindex STORE_ATTR (opcode)
@anchor{library/dis opcode-STORE_ATTR}@anchor{1bc6}
@deffn {Opcode} STORE_ATTR (namei)

Implements:

@example
obj = STACK.pop()
value = STACK.pop()
obj.name = value
@end example

where `namei' is the index of name in @ref{238f,,co_names} of the
@ref{4e6,,code object}.
@end deffn

@geindex DELETE_ATTR (opcode)
@anchor{library/dis opcode-DELETE_ATTR}@anchor{4d2f}
@deffn {Opcode} DELETE_ATTR (namei)

Implements:

@example
obj = STACK.pop()
del obj.name
@end example

where `namei' is the index of name into @ref{238f,,co_names} of the
@ref{4e6,,code object}.
@end deffn

@geindex STORE_GLOBAL (opcode)
@anchor{library/dis opcode-STORE_GLOBAL}@anchor{4d2c}
@deffn {Opcode} STORE_GLOBAL (namei)

@ref{4d2b,,STORE_NAME}처럼 작동하지만, 이름을 전역으로 저장합니다.
@end deffn

@geindex DELETE_GLOBAL (opcode)
@anchor{library/dis opcode-DELETE_GLOBAL}@anchor{4d30}
@deffn {Opcode} DELETE_GLOBAL (namei)

@ref{4d2d,,DELETE_NAME}처럼 작동하지만, 전역 이름을 삭제합니다.
@end deffn

@geindex LOAD_CONST (opcode)
@anchor{library/dis opcode-LOAD_CONST}@anchor{4d31}
@deffn {Opcode} LOAD_CONST (consti)

@code{co_consts[consti]}를 스택으로 푸시합니다.
@end deffn

@geindex LOAD_SMALL_INT (opcode)
@anchor{library/dis opcode-LOAD_SMALL_INT}@anchor{36e}
@deffn {Opcode} LOAD_SMALL_INT (i)

Pushes the integer @code{i} onto the stack.
@code{i} must be in @code{range(256)}


Added in version 3.14.

@end deffn

@geindex LOAD_NAME (opcode)
@anchor{library/dis opcode-LOAD_NAME}@anchor{4d32}
@deffn {Opcode} LOAD_NAME (namei)

Pushes the value associated with @code{co_names[namei]} onto the stack.
The name is looked up within the locals, then the globals, then the builtins.
@end deffn

@geindex LOAD_LOCALS (opcode)
@anchor{library/dis opcode-LOAD_LOCALS}@anchor{70d}
@deffn {Opcode} LOAD_LOCALS

Pushes a reference to the locals dictionary onto the stack.  This is used
to prepare namespace dictionaries for @ref{70b,,LOAD_FROM_DICT_OR_DEREF}
and @ref{70c,,LOAD_FROM_DICT_OR_GLOBALS}.


Added in version 3.12.

@end deffn

@geindex LOAD_FROM_DICT_OR_GLOBALS (opcode)
@anchor{library/dis opcode-LOAD_FROM_DICT_OR_GLOBALS}@anchor{70c}
@deffn {Opcode} LOAD_FROM_DICT_OR_GLOBALS (i)

Pops a mapping off the stack and looks up the value for @code{co_names[namei]}.
If the name is not found there, looks it up in the globals and then the builtins,
similar to @ref{1a5a,,LOAD_GLOBAL}.
This is used for loading global variables in
@ref{4ac,,annotation scopes} within class bodies.


Added in version 3.12.

@end deffn

@geindex BUILD_TEMPLATE (opcode)
@anchor{library/dis opcode-BUILD_TEMPLATE}@anchor{368}
@deffn {Opcode} BUILD_TEMPLATE

Constructs a new @ref{16a,,Template} instance from a tuple
of strings and a tuple of interpolations and pushes the resulting object
onto the stack:

@example
interpolations = STACK.pop()
strings = STACK.pop()
STACK.append(_build_template(strings, interpolations))
@end example


Added in version 3.14.

@end deffn

@geindex BUILD_INTERPOLATION (opcode)
@anchor{library/dis opcode-BUILD_INTERPOLATION}@anchor{367}
@deffn {Opcode} BUILD_INTERPOLATION (format)

Constructs a new @ref{16b,,Interpolation} instance from a
value and its source expression and pushes the resulting object onto the
stack.

If no conversion or format specification is present, @code{format} is set to
@code{2}.

If the low bit of @code{format} is set, it indicates that the interpolation
contains a format specification.

If @code{format >> 2} is non-zero, it indicates that the interpolation
contains a conversion. The value of @code{format >> 2} is the conversion type
(@code{0} for no conversion, @code{1} for @code{!s}, @code{2} for @code{!r}, and
@code{3} for @code{!a}):

@example
conversion = format >> 2
if format & 1:
    format_spec = STACK.pop()
else:
    format_spec = None
expression = STACK.pop()
value = STACK.pop()
STACK.append(_build_interpolation(value, expression, conversion, format_spec))
@end example


Added in version 3.14.

@end deffn

@geindex BUILD_TUPLE (opcode)
@anchor{library/dis opcode-BUILD_TUPLE}@anchor{4d33}
@deffn {Opcode} BUILD_TUPLE (count)

Creates a tuple consuming `count' items from the stack, and pushes the
resulting tuple onto the stack:

@example
if count == 0:
    value = ()
else:
    value = tuple(STACK[-count:])
    STACK = STACK[:-count]

STACK.append(value)
@end example
@end deffn

@geindex BUILD_LIST (opcode)
@anchor{library/dis opcode-BUILD_LIST}@anchor{4d34}
@deffn {Opcode} BUILD_LIST (count)

@ref{4d33,,BUILD_TUPLE}처럼 작동하지만, 리스트를 만듭니다.
@end deffn

@geindex BUILD_SET (opcode)
@anchor{library/dis opcode-BUILD_SET}@anchor{4d35}
@deffn {Opcode} BUILD_SET (count)

@ref{4d33,,BUILD_TUPLE}처럼 작동하지만, 집합을 만듭니다.
@end deffn

@geindex BUILD_MAP (opcode)
@anchor{library/dis opcode-BUILD_MAP}@anchor{369}
@deffn {Opcode} BUILD_MAP (count)

Pushes a new dictionary object onto the stack.  Pops @code{2 * count} items
so that the dictionary holds `count' entries:
@code{@{..., STACK[-4]: STACK[-3], STACK[-2]: STACK[-1]@}}.


버전 3.5에서 변경: 딕셔너리는 `count' 항목을 갖도록 미리 크기가 조정된 빈 딕셔너리를 만드는 대신 스택 항목에서 만들어집니다.

@end deffn

@geindex BUILD_STRING (opcode)
@anchor{library/dis opcode-BUILD_STRING}@anchor{f4c}
@deffn {Opcode} BUILD_STRING (count)

스택에서 `count' 문자열을 이어붙이고 결과 문자열을 스택으로 푸시합니다.


Added in version 3.6.

@end deffn

@geindex LIST_EXTEND (opcode)
@anchor{library/dis opcode-LIST_EXTEND}@anchor{4d36}
@deffn {Opcode} LIST_EXTEND (i)

Implements:

@example
seq = STACK.pop()
list.extend(STACK[-i], seq)
@end example

Used to build lists.


Added in version 3.9.

@end deffn

@geindex SET_UPDATE (opcode)
@anchor{library/dis opcode-SET_UPDATE}@anchor{4d37}
@deffn {Opcode} SET_UPDATE (i)

Implements:

@example
seq = STACK.pop()
set.update(STACK[-i], seq)
@end example

Used to build sets.


Added in version 3.9.

@end deffn

@geindex DICT_UPDATE (opcode)
@anchor{library/dis opcode-DICT_UPDATE}@anchor{4d38}
@deffn {Opcode} DICT_UPDATE (i)

Implements:

@example
map = STACK.pop()
dict.update(STACK[-i], map)
@end example

Used to build dicts.


Added in version 3.9.

@end deffn

@geindex DICT_MERGE (opcode)
@anchor{library/dis opcode-DICT_MERGE}@anchor{4d39}
@deffn {Opcode} DICT_MERGE (i)

@ref{4d38,,DICT_UPDATE}와 유사하지만, 중복 키에 대해 예외를 발생시킵니다.


Added in version 3.9.

@end deffn

@geindex LOAD_ATTR (opcode)
@anchor{library/dis opcode-LOAD_ATTR}@anchor{703}
@deffn {Opcode} LOAD_ATTR (namei)

If the low bit of @code{namei} is not set, this replaces @code{STACK[-1]} with
@code{getattr(STACK[-1], co_names[namei>>1])}.

If the low bit of @code{namei} is set, this will attempt to load a method named
@code{co_names[namei>>1]} from the @code{STACK[-1]} object. @code{STACK[-1]} is popped.
This bytecode distinguishes two cases: if @code{STACK[-1]} has a method with the
correct name, the bytecode pushes the unbound method and @code{STACK[-1]}.
@code{STACK[-1]} will be used as the first argument (@code{self}) by @ref{914,,CALL}
or @ref{372,,CALL_KW} when calling the unbound method.
Otherwise, @code{NULL} and the object returned by
the attribute lookup are pushed.


버전 3.12에서 변경: If the low bit of @code{namei} is set, then a @code{NULL} or @code{self} is
pushed to the stack before the attribute or unbound method respectively.

@end deffn

@geindex LOAD_SUPER_ATTR (opcode)
@anchor{library/dis opcode-LOAD_SUPER_ATTR}@anchor{701}
@deffn {Opcode} LOAD_SUPER_ATTR (namei)

This opcode implements @ref{1a6,,super()}, both in its zero-argument and
two-argument forms (e.g. @code{super().method()}, @code{super().attr} and
@code{super(cls, self).method()}, @code{super(cls, self).attr}).

It pops three values from the stack (from top of stack down):


@itemize *

@item 
@code{self}: the first argument to the current method

@item 
@code{cls}: the class within which the current method was defined

@item 
the global @code{super}
@end itemize

With respect to its argument, it works similarly to @ref{703,,LOAD_ATTR},
except that @code{namei} is shifted left by 2 bits instead of 1.

The low bit of @code{namei} signals to attempt a method load, as with
@ref{703,,LOAD_ATTR}, which results in pushing @code{NULL} and the loaded method.
When it is unset a single value is pushed to the stack.

The second-low bit of @code{namei}, if set, means that this was a two-argument
call to @ref{1a6,,super()} (unset means zero-argument).


Added in version 3.12.

@end deffn

@geindex COMPARE_OP (opcode)
@anchor{library/dis opcode-COMPARE_OP}@anchor{b61}
@deffn {Opcode} COMPARE_OP (opname)

Performs a Boolean operation.  The operation name can be found in
@code{cmp_op[opname >> 5]}. If the fifth-lowest bit of @code{opname} is set
(@code{opname & 16}), the result should be coerced to @code{bool}.


버전 3.13에서 변경: The fifth-lowest bit of the oparg now indicates a forced conversion to
@ref{3c3,,bool}.

@end deffn

@geindex IS_OP (opcode)
@anchor{library/dis opcode-IS_OP}@anchor{193d}
@deffn {Opcode} IS_OP (invert)

@code{is} 비교를 수행하거나, @code{invert}가 1이면 @code{is not}을 수행합니다.


Added in version 3.9.

@end deffn

@geindex CONTAINS_OP (opcode)
@anchor{library/dis opcode-CONTAINS_OP}@anchor{193c}
@deffn {Opcode} CONTAINS_OP (invert)

@code{in} 비교를 수행하거나, @code{invert}가 1이면 @code{not in}을 수행합니다.


Added in version 3.9.

@end deffn

@geindex IMPORT_NAME (opcode)
@anchor{library/dis opcode-IMPORT_NAME}@anchor{4d3a}
@deffn {Opcode} IMPORT_NAME (namei)

Imports the module @code{co_names[namei]}.  @code{STACK[-1]} and @code{STACK[-2]} are
popped and provide the `fromlist' and `level' arguments of @ref{ad1,,__import__()}.
The module object is pushed onto the stack.  The current namespace is not affected: for a proper import statement, a subsequent @ref{1a63,,STORE_FAST} instruction
modifies the namespace.
@end deffn

@geindex IMPORT_FROM (opcode)
@anchor{library/dis opcode-IMPORT_FROM}@anchor{4d3b}
@deffn {Opcode} IMPORT_FROM (namei)

Loads the attribute @code{co_names[namei]} from the module found in @code{STACK[-1]}.
The resulting object is pushed onto the stack, to be subsequently stored by a
@ref{1a63,,STORE_FAST} instruction.
@end deffn

@geindex JUMP_FORWARD (opcode)
@anchor{library/dis opcode-JUMP_FORWARD}@anchor{1973}
@deffn {Opcode} JUMP_FORWARD (delta)

바이트 코드 카운터를 `delta'만큼 증가시킵니다.
@end deffn

@geindex JUMP_BACKWARD (opcode)
@anchor{library/dis opcode-JUMP_BACKWARD}@anchor{919}
@deffn {Opcode} JUMP_BACKWARD (delta)

Decrements bytecode counter by `delta'. Checks for interrupts.


Added in version 3.11.

@end deffn

@geindex JUMP_BACKWARD_NO_INTERRUPT (opcode)
@anchor{library/dis opcode-JUMP_BACKWARD_NO_INTERRUPT}@anchor{90d}
@deffn {Opcode} JUMP_BACKWARD_NO_INTERRUPT (delta)

Decrements bytecode counter by `delta'. Does not check for interrupts.


Added in version 3.11.

@end deffn

@geindex POP_JUMP_IF_TRUE (opcode)
@anchor{library/dis opcode-POP_JUMP_IF_TRUE}@anchor{1a5f}
@deffn {Opcode} POP_JUMP_IF_TRUE (delta)

If @code{STACK[-1]} is true, increments the bytecode counter by `delta'.
@code{STACK[-1]} is popped.


버전 3.11에서 변경: The oparg is now a relative delta rather than an absolute target.
This opcode is a pseudo-instruction, replaced in final bytecode by
the directed versions (forward/backward).



버전 3.12에서 변경: This is no longer a pseudo-instruction.



버전 3.13에서 변경: This instruction now requires an exact @ref{3c3,,bool} operand.

@end deffn

@geindex POP_JUMP_IF_FALSE (opcode)
@anchor{library/dis opcode-POP_JUMP_IF_FALSE}@anchor{1a60}
@deffn {Opcode} POP_JUMP_IF_FALSE (delta)

If @code{STACK[-1]} is false, increments the bytecode counter by `delta'.
@code{STACK[-1]} is popped.


버전 3.11에서 변경: The oparg is now a relative delta rather than an absolute target.
This opcode is a pseudo-instruction, replaced in final bytecode by
the directed versions (forward/backward).



버전 3.12에서 변경: This is no longer a pseudo-instruction.



버전 3.13에서 변경: This instruction now requires an exact @ref{3c3,,bool} operand.

@end deffn

@geindex POP_JUMP_IF_NOT_NONE (opcode)
@anchor{library/dis opcode-POP_JUMP_IF_NOT_NONE}@anchor{1b7e}
@deffn {Opcode} POP_JUMP_IF_NOT_NONE (delta)

If @code{STACK[-1]} is not @code{None}, increments the bytecode counter by `delta'.
@code{STACK[-1]} is popped.


Added in version 3.11.



버전 3.12에서 변경: This is no longer a pseudo-instruction.

@end deffn

@geindex POP_JUMP_IF_NONE (opcode)
@anchor{library/dis opcode-POP_JUMP_IF_NONE}@anchor{1b7d}
@deffn {Opcode} POP_JUMP_IF_NONE (delta)

If @code{STACK[-1]} is @code{None}, increments the bytecode counter by `delta'.
@code{STACK[-1]} is popped.


Added in version 3.11.



버전 3.12에서 변경: This is no longer a pseudo-instruction.

@end deffn

@geindex FOR_ITER (opcode)
@anchor{library/dis opcode-FOR_ITER}@anchor{1ac1}
@deffn {Opcode} FOR_ITER (delta)

@code{STACK[-1]} is an @ref{4ca,,iterator}.  Call its @ref{14d2,,__next__()} method.
If this yields a new value, push it on the stack (leaving the iterator below
it).  If the iterator indicates it is exhausted then the byte code counter is
incremented by `delta'.


버전 3.12에서 변경: Up until 3.11 the iterator was popped when it was exhausted.

@end deffn

@geindex LOAD_GLOBAL (opcode)
@anchor{library/dis opcode-LOAD_GLOBAL}@anchor{1a5a}
@deffn {Opcode} LOAD_GLOBAL (namei)

Loads the global named @code{co_names[namei>>1]} onto the stack.


버전 3.11에서 변경: If the low bit of @code{namei} is set, then a @code{NULL} is pushed to the
stack before the global variable.

@end deffn

@geindex LOAD_FAST (opcode)
@anchor{library/dis opcode-LOAD_FAST}@anchor{4d3c}
@deffn {Opcode} LOAD_FAST (var_num)

지역 @code{co_varnames[var_num]}에 대한 참조를 스택으로 푸시합니다.


버전 3.12에서 변경: This opcode is now only used in situations where the local variable is
guaranteed to be initialized. It cannot raise @ref{173b,,UnboundLocalError}.

@end deffn

@geindex LOAD_FAST_BORROW (opcode)
@anchor{library/dis opcode-LOAD_FAST_BORROW}@anchor{36c}
@deffn {Opcode} LOAD_FAST_BORROW (var_num)

Pushes a borrowed reference to the local @code{co_varnames[var_num]} onto the
stack.


Added in version 3.14.

@end deffn

@geindex LOAD_FAST_LOAD_FAST (opcode)
@anchor{library/dis opcode-LOAD_FAST_LOAD_FAST}@anchor{4d3d}
@deffn {Opcode} LOAD_FAST_LOAD_FAST (var_nums)

Pushes references to @code{co_varnames[var_nums >> 4]} and
@code{co_varnames[var_nums & 15]} onto the stack.


Added in version 3.13.

@end deffn

@geindex LOAD_FAST_BORROW_LOAD_FAST_BORROW (opcode)
@anchor{library/dis opcode-LOAD_FAST_BORROW_LOAD_FAST_BORROW}@anchor{36d}
@deffn {Opcode} LOAD_FAST_BORROW_LOAD_FAST_BORROW (var_nums)

Pushes borrowed references to @code{co_varnames[var_nums >> 4]} and
@code{co_varnames[var_nums & 15]} onto the stack.


Added in version 3.14.

@end deffn

@geindex LOAD_FAST_CHECK (opcode)
@anchor{library/dis opcode-LOAD_FAST_CHECK}@anchor{70a}
@deffn {Opcode} LOAD_FAST_CHECK (var_num)

Pushes a reference to the local @code{co_varnames[var_num]} onto the stack,
raising an @ref{173b,,UnboundLocalError} if the local variable has not been
initialized.


Added in version 3.12.

@end deffn

@geindex LOAD_FAST_AND_CLEAR (opcode)
@anchor{library/dis opcode-LOAD_FAST_AND_CLEAR}@anchor{709}
@deffn {Opcode} LOAD_FAST_AND_CLEAR (var_num)

Pushes a reference to the local @code{co_varnames[var_num]} onto the stack (or
pushes @code{NULL} onto the stack if the local variable has not been
initialized) and sets @code{co_varnames[var_num]} to @code{NULL}.


Added in version 3.12.

@end deffn

@geindex STORE_FAST (opcode)
@anchor{library/dis opcode-STORE_FAST}@anchor{1a63}
@deffn {Opcode} STORE_FAST (var_num)

Stores @code{STACK.pop()} into the local @code{co_varnames[var_num]}.
@end deffn

@geindex STORE_FAST_STORE_FAST (opcode)
@anchor{library/dis opcode-STORE_FAST_STORE_FAST}@anchor{4d3e}
@deffn {Opcode} STORE_FAST_STORE_FAST (var_nums)

Stores @code{STACK[-1]} into @code{co_varnames[var_nums >> 4]}
and @code{STACK[-2]} into @code{co_varnames[var_nums & 15]}.


Added in version 3.13.

@end deffn

@geindex STORE_FAST_LOAD_FAST (opcode)
@anchor{library/dis opcode-STORE_FAST_LOAD_FAST}@anchor{4d3f}
@deffn {Opcode} STORE_FAST_LOAD_FAST (var_nums)

Stores @code{STACK.pop()} into the local @code{co_varnames[var_nums >> 4]}
and pushes a reference to the local @code{co_varnames[var_nums & 15]}
onto the stack.


Added in version 3.13.

@end deffn

@geindex DELETE_FAST (opcode)
@anchor{library/dis opcode-DELETE_FAST}@anchor{4d40}
@deffn {Opcode} DELETE_FAST (var_num)

지역 @code{co_varnames[var_num]}을 삭제합니다.
@end deffn

@geindex MAKE_CELL (opcode)
@anchor{library/dis opcode-MAKE_CELL}@anchor{90e}
@deffn {Opcode} MAKE_CELL (i)

Creates a new cell in slot @code{i}.  If that slot is nonempty then
that value is stored into the new cell.


Added in version 3.11.

@end deffn

@geindex LOAD_DEREF (opcode)
@anchor{library/dis opcode-LOAD_DEREF}@anchor{4d41}
@deffn {Opcode} LOAD_DEREF (i)

Loads the cell contained in slot @code{i} of the “fast locals” storage.
Pushes a reference to the object the cell contains on the stack.


버전 3.11에서 변경: @code{i} is no longer offset by the length of @ref{238b,,co_varnames}.

@end deffn

@geindex LOAD_FROM_DICT_OR_DEREF (opcode)
@anchor{library/dis opcode-LOAD_FROM_DICT_OR_DEREF}@anchor{70b}
@deffn {Opcode} LOAD_FROM_DICT_OR_DEREF (i)

Pops a mapping off the stack and looks up the name associated with
slot @code{i} of the “fast locals” storage in this mapping.
If the name is not found there, loads it from the cell contained in
slot @code{i}, similar to @ref{4d41,,LOAD_DEREF}. This is used for loading
@ref{1895,,closure variables} in class bodies (which previously used
@code{LOAD_CLASSDEREF}) and in
@ref{4ac,,annotation scopes} within class bodies.


Added in version 3.12.

@end deffn

@geindex STORE_DEREF (opcode)
@anchor{library/dis opcode-STORE_DEREF}@anchor{4d42}
@deffn {Opcode} STORE_DEREF (i)

Stores @code{STACK.pop()} into the cell contained in slot @code{i} of the “fast locals”
storage.


버전 3.11에서 변경: @code{i} is no longer offset by the length of @ref{238b,,co_varnames}.

@end deffn

@geindex DELETE_DEREF (opcode)
@anchor{library/dis opcode-DELETE_DEREF}@anchor{4d43}
@deffn {Opcode} DELETE_DEREF (i)

Empties the cell contained in slot @code{i} of the “fast locals” storage.
Used by the @ref{1b1d,,del} statement.


Added in version 3.2.



버전 3.11에서 변경: @code{i} is no longer offset by the length of @ref{238b,,co_varnames}.

@end deffn

@geindex COPY_FREE_VARS (opcode)
@anchor{library/dis opcode-COPY_FREE_VARS}@anchor{90c}
@deffn {Opcode} COPY_FREE_VARS (n)

Copies the @code{n} @ref{1895,,free (closure) variables} from the closure
into the frame. Removes the need for special code on the caller’s side when calling
closures.


Added in version 3.11.

@end deffn

@geindex RAISE_VARARGS (opcode)
@anchor{library/dis opcode-RAISE_VARARGS}@anchor{4d44}
@deffn {Opcode} RAISE_VARARGS (argc)

`argc'의 값에 따라, @code{raise} 문의 3가지 형식 중 하나를 사용하여 예외를 발생시킵니다:


@itemize *

@item 
0: @code{raise} (이전 예외를 다시 발생시킵니다)

@item 
1: @code{raise STACK[-1]} (raise exception instance or type at @code{STACK[-1]})

@item 
2: @code{raise STACK[-2] from STACK[-1]} (raise exception instance or type at
@code{STACK[-2]} with @code{__cause__} set to @code{STACK[-1]})
@end itemize
@end deffn

@geindex CALL (opcode)
@anchor{library/dis opcode-CALL}@anchor{914}
@deffn {Opcode} CALL (argc)

Calls a callable object with the number of arguments specified by @code{argc}.
On the stack are (in ascending order):


@itemize *

@item 
The callable

@item 
@code{self} or @code{NULL}

@item 
The remaining positional arguments
@end itemize

@code{argc} is the total of the positional arguments, excluding @code{self}.

@code{CALL} pops all arguments and the callable object off the stack,
calls the callable object with those arguments, and pushes the return value
returned by the callable object.


Added in version 3.11.



버전 3.13에서 변경: The callable now always appears at the same position on the stack.



버전 3.13에서 변경: Calls with keyword arguments are now handled by @ref{372,,CALL_KW}.

@end deffn

@geindex CALL_KW (opcode)
@anchor{library/dis opcode-CALL_KW}@anchor{372}
@deffn {Opcode} CALL_KW (argc)

Calls a callable object with the number of arguments specified by @code{argc},
including one or more named arguments. On the stack are (in ascending order):


@itemize *

@item 
The callable

@item 
@code{self} or @code{NULL}

@item 
The remaining positional arguments

@item 
The named arguments

@item 
A @ref{610,,tuple} of keyword argument names
@end itemize

@code{argc} is the total of the positional and named arguments, excluding @code{self}.
The length of the tuple of keyword argument names is the number of named arguments.

@code{CALL_KW} pops all arguments, the keyword names, and the callable object
off the stack, calls the callable object with those arguments, and pushes the
return value returned by the callable object.


Added in version 3.13.

@end deffn

@geindex CALL_FUNCTION_EX (opcode)
@anchor{library/dis opcode-CALL_FUNCTION_EX}@anchor{f4e}
@deffn {Opcode} CALL_FUNCTION_EX (flags)

위치와 키워드 인자의 변수 집합으로 콜러블 객체를 호출합니다. `flags'의 최하위 비트가 설정되면, 스택의 맨 위에 추가 키워드 인자가 포함된 매핑 객체가 포함됩니다. 콜러블이 호출되기 전에, 매핑 객체와 이터러블 객체는 각각 “언팩” 되고 그 내용이 각각 키워드와 위치 인자로 전달됩니다. @code{CALL_FUNCTION_EX}는 모든 인자와 콜러블 객체를 스택에서 팝하고, 해당 인자로 콜러블 객체를 호출한 다음, 콜러블 객체가 반환한 반환 값을 푸시합니다.


Added in version 3.6.

@end deffn

@geindex PUSH_NULL (opcode)
@anchor{library/dis opcode-PUSH_NULL}@anchor{915}
@deffn {Opcode} PUSH_NULL

Pushes a @code{NULL} to the stack.
Used in the call sequence to match the @code{NULL} pushed by
@code{LOAD_METHOD} for non-method calls.


Added in version 3.11.

@end deffn

@geindex MAKE_FUNCTION (opcode)
@anchor{library/dis opcode-MAKE_FUNCTION}@anchor{f4d}
@deffn {Opcode} MAKE_FUNCTION

Pushes a new function object on the stack built from the code object at @code{STACK[-1]}.


버전 3.10에서 변경: Flag value @code{0x04} is a tuple of strings instead of dictionary



버전 3.11에서 변경: Qualified name at @code{STACK[-1]} was removed.



버전 3.13에서 변경: Extra function attributes on the stack, signaled by oparg flags, were
removed. They now use @ref{4d45,,SET_FUNCTION_ATTRIBUTE}.

@end deffn

@geindex SET_FUNCTION_ATTRIBUTE (opcode)
@anchor{library/dis opcode-SET_FUNCTION_ATTRIBUTE}@anchor{4d45}
@deffn {Opcode} SET_FUNCTION_ATTRIBUTE (flag)

Sets an attribute on a function object. Expects the function at @code{STACK[-1]}
and the attribute value to set at @code{STACK[-2]}; consumes both and leaves the
function at @code{STACK[-1]}. The flag determines which attribute to set:


@itemize *

@item 
@code{0x01} 위치 전용과 위치-키워드 매개 변수를 위한 기본값의 위치 순서 튜플

@item 
@code{0x02} 키워드 전용 매개 변수의 기본값 딕셔너리

@item 
@code{0x04} a tuple of strings containing parameters’ annotations

@item 
@code{0x08} 자유 변수를 위한 셀을 포함하는 튜플, 클로저를 만듭니다

@item 
@code{0x10} the @ref{15d,,annotate function} for the function object
@end itemize


Added in version 3.13.



버전 3.14에서 변경: Added @code{0x10} to indicate the annotate function for the function object.

@end deffn

@geindex BUILD_SLICE (opcode)
@anchor{library/dis opcode-BUILD_SLICE}@anchor{4d46}
@deffn {Opcode} BUILD_SLICE (argc)

@geindex built-in function;slice

Pushes a slice object on the stack.  `argc' must be 2 or 3.  If it is 2, implements:

@example
end = STACK.pop()
start = STACK.pop()
STACK.append(slice(start, end))
@end example

if it is 3, implements:

@example
step = STACK.pop()
end = STACK.pop()
start = STACK.pop()
STACK.append(slice(start, end, step))
@end example

See the @ref{693,,slice()} built-in function for more information.
@end deffn

@geindex EXTENDED_ARG (opcode)
@anchor{library/dis opcode-EXTENDED_ARG}@anchor{1b1c}
@deffn {Opcode} EXTENDED_ARG (ext)

너무 커서 기본 1바이트에 맞지 않는 인자를 가진 옵코드에 접두어로 붙입니다. `ext'는 인자에서 더 높은 비트로 작동하는 추가 바이트를 보유합니다. 각 옵코드마다, 최대 3개의 접두사 @code{EXTENDED_ARG}가 허용되며, 2바이트에서 4바이트 사이의 인자를 형성합니다.
@end deffn

@geindex CONVERT_VALUE (opcode)
@anchor{library/dis opcode-CONVERT_VALUE}@anchor{4d47}
@deffn {Opcode} CONVERT_VALUE (oparg)

Convert value to a string, depending on @code{oparg}:

@example
value = STACK.pop()
result = func(value)
STACK.append(result)
@end example


@itemize *

@item 
@code{oparg == 1}: call @ref{169,,str()} on `value'

@item 
@code{oparg == 2}: call @ref{1c1,,repr()} on `value'

@item 
@code{oparg == 3}: call @ref{15eb,,ascii()} on `value'
@end itemize

Used for implementing formatted string literals (f-strings).


Added in version 3.13.

@end deffn

@geindex FORMAT_SIMPLE (opcode)
@anchor{library/dis opcode-FORMAT_SIMPLE}@anchor{4d48}
@deffn {Opcode} FORMAT_SIMPLE

Formats the value on top of stack:

@example
value = STACK.pop()
result = value.__format__("")
STACK.append(result)
@end example

Used for implementing formatted string literals (f-strings).


Added in version 3.13.

@end deffn

@geindex FORMAT_WITH_SPEC (opcode)
@anchor{library/dis opcode-FORMAT_WITH_SPEC}@anchor{4d49}
@deffn {Opcode} FORMAT_WITH_SPEC

Formats the given value with the given format spec:

@example
spec = STACK.pop()
value = STACK.pop()
result = value.__format__(spec)
STACK.append(result)
@end example

Used for implementing formatted string literals (f-strings).


Added in version 3.13.

@end deffn

@geindex MATCH_CLASS (opcode)
@anchor{library/dis opcode-MATCH_CLASS}@anchor{91e}
@deffn {Opcode} MATCH_CLASS (count)

@code{STACK[-1]} is a tuple of keyword attribute names, @code{STACK[-2]} is the class
being matched against, and @code{STACK[-3]} is the match subject.  `count' is the
number of positional sub-patterns.

Pop @code{STACK[-1]}, @code{STACK[-2]}, and @code{STACK[-3]}. If @code{STACK[-3]} is an
instance of @code{STACK[-2]} and has the positional and keyword attributes
required by `count' and @code{STACK[-1]}, push a tuple of extracted attributes.
Otherwise, push @code{None}.


Added in version 3.10.



버전 3.11에서 변경: Previously, this instruction also pushed a boolean value indicating
success (@code{True}) or failure (@code{False}).

@end deffn

@geindex RESUME (opcode)
@anchor{library/dis opcode-RESUME}@anchor{5b9}
@deffn {Opcode} RESUME (context)

A no-op. Performs internal tracing, debugging and optimization checks.

The @code{context} operand consists of two parts. The lowest two bits
indicate where the @code{RESUME} occurs:


@itemize *

@item 
@code{0} The start of a function, which is neither a generator, coroutine
nor an async generator

@item 
@code{1} After a @code{yield} expression

@item 
@code{2} After a @code{yield from} expression

@item 
@code{3} After an @code{await} expression
@end itemize

The next bit is @code{1} if the RESUME is at except-depth @code{1}, and @code{0}
otherwise.


Added in version 3.11.



버전 3.13에서 변경: The oparg value changed to include information about except-depth

@end deffn

@geindex RETURN_GENERATOR (opcode)
@anchor{library/dis opcode-RETURN_GENERATOR}@anchor{90a}
@deffn {Opcode} RETURN_GENERATOR

Create a generator, coroutine, or async generator from the current frame.
Used as first opcode of in code object for the above mentioned callables.
Clear the current frame and return the newly created generator.


Added in version 3.11.

@end deffn

@geindex SEND (opcode)
@anchor{library/dis opcode-SEND}@anchor{90b}
@deffn {Opcode} SEND (delta)

Equivalent to @code{STACK[-1] = STACK[-2].send(STACK[-1])}. Used in @code{yield from}
and @code{await} statements.

If the call raises @ref{df4,,StopIteration}, pop the top value from the stack,
push the exception’s @code{value} attribute, and increment the bytecode counter
by `delta'.


Added in version 3.11.

@end deffn

@geindex HAVE_ARGUMENT (opcode)
@anchor{library/dis opcode-HAVE_ARGUMENT}@anchor{6b0}
@deffn {Opcode} HAVE_ARGUMENT

This is not really an opcode.  It identifies the dividing line between
opcodes in the range [0,255] which don’t use their argument and those
that do (@code{< HAVE_ARGUMENT} and @code{>= HAVE_ARGUMENT}, respectively).

If your application uses pseudo instructions or specialized instructions,
use the @ref{59e,,hasarg} collection instead.


버전 3.6에서 변경: 이제 모든 명령어에는 인자가 있지만, @code{< HAVE_ARGUMENT}인 옵코드는 이를 무시합니다. 이전에는, @code{>= HAVE_ARGUMENT}인 옵코드에만 인자가 있었습니다.



버전 3.12에서 변경: Pseudo instructions were added to the @code{dis} module, and for them
it is not true that comparison with @code{HAVE_ARGUMENT} indicates whether
they use their arg.



버전 3.13부터 폐지됨: Use @ref{59e,,hasarg} instead.

@end deffn

@geindex CALL_INTRINSIC_1 (opcode)
@anchor{library/dis opcode-CALL_INTRINSIC_1}@anchor{706}
@deffn {Opcode} CALL_INTRINSIC_1

Calls an intrinsic function with one argument. Passes @code{STACK[-1]} as the
argument and sets @code{STACK[-1]} to the result. Used to implement
functionality that is not performance critical.

The operand determines which intrinsic function is called:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Operand

@tab

Description

@item

@code{INTRINSIC_1_INVALID}

@tab

Not valid

@item

@code{INTRINSIC_PRINT}

@tab

Prints the argument to standard
out. Used in the REPL.

@item

@code{INTRINSIC_IMPORT_STAR}

@tab

Performs @code{import *} for the
named module.

@item

@code{INTRINSIC_STOPITERATION_ERROR}

@tab

Extracts the return value from a
@code{StopIteration} exception.

@item

@code{INTRINSIC_ASYNC_GEN_WRAP}

@tab

Wraps an async generator value

@item

@code{INTRINSIC_UNARY_POSITIVE}

@tab

Performs the unary @code{+}
operation

@item

@code{INTRINSIC_LIST_TO_TUPLE}

@tab

Converts a list to a tuple

@item

@code{INTRINSIC_TYPEVAR}

@tab

Creates a @ref{487,,typing.TypeVar}

@item

@code{INTRINSIC_PARAMSPEC}

@tab

Creates a
@ref{488,,typing.ParamSpec}

@item

@code{INTRINSIC_TYPEVARTUPLE}

@tab

Creates a
@ref{489,,typing.TypeVarTuple}

@item

@code{INTRINSIC_SUBSCRIPT_GENERIC}

@tab

Returns @ref{17bc,,typing.Generic}
subscripted with the argument

@item

@code{INTRINSIC_TYPEALIAS}

@tab

Creates a
@ref{2ae,,typing.TypeAliasType};
used in the @ref{66b,,type}
statement. The argument is a tuple
of the type alias’s name,
type parameters, and value.

@end multitable



Added in version 3.12.

@end deffn

@geindex CALL_INTRINSIC_2 (opcode)
@anchor{library/dis opcode-CALL_INTRINSIC_2}@anchor{707}
@deffn {Opcode} CALL_INTRINSIC_2

Calls an intrinsic function with two arguments. Used to implement functionality
that is not performance critical:

@example
arg2 = STACK.pop()
arg1 = STACK.pop()
result = intrinsic2(arg1, arg2)
STACK.append(result)
@end example

The operand determines which intrinsic function is called:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Operand

@tab

Description

@item

@code{INTRINSIC_2_INVALID}

@tab

Not valid

@item

@code{INTRINSIC_PREP_RERAISE_STAR}

@tab

Calculates the
@ref{4d3,,ExceptionGroup} to raise
from a @code{try-except*}.

@item

@code{INTRINSIC_TYPEVAR_WITH_BOUND}

@tab

Creates a @ref{487,,typing.TypeVar}
with a bound.

@item

@code{INTRINSIC_TYPEVAR_WITH_CONSTRAINTS}

@tab

Creates a
@ref{487,,typing.TypeVar} with
constraints.

@item

@code{INTRINSIC_SET_FUNCTION_TYPE_PARAMS}

@tab

Sets the @code{__type_params__}
attribute of a function.

@end multitable



Added in version 3.12.

@end deffn

@geindex LOAD_SPECIAL (opcode)
@anchor{library/dis opcode-LOAD_SPECIAL}@anchor{36f}
@deffn {Opcode} LOAD_SPECIAL

Performs special method lookup on @code{STACK[-1]}.
If @code{type(STACK[-1]).__xxx__} is a method, leave
@code{type(STACK[-1]).__xxx__; STACK[-1]} on the stack.
If @code{type(STACK[-1]).__xxx__} is not a method, leave
@code{STACK[-1].__xxx__; NULL} on the stack.


Added in version 3.14.

@end deffn

`Pseudo-instructions'

These opcodes do not appear in Python bytecode. They are used by the compiler
but are replaced by real opcodes or removed before bytecode is generated.

@geindex SETUP_FINALLY (opcode)
@anchor{library/dis opcode-SETUP_FINALLY}@anchor{4d4a}
@deffn {Opcode} SETUP_FINALLY (target)

Set up an exception handler for the following code block. If an exception
occurs, the value stack level is restored to its current state and control
is transferred to the exception handler at @code{target}.
@end deffn

@geindex SETUP_CLEANUP (opcode)
@anchor{library/dis opcode-SETUP_CLEANUP}@anchor{4d4b}
@deffn {Opcode} SETUP_CLEANUP (target)

Like @code{SETUP_FINALLY}, but in case of an exception also pushes the last
instruction (@code{lasti}) to the stack so that @code{RERAISE} can restore it.
If an exception occurs, the value stack level and the last instruction on
the frame are restored to their current state, and control is transferred
to the exception handler at @code{target}.
@end deffn

@geindex SETUP_WITH (opcode)
@anchor{library/dis opcode-SETUP_WITH}@anchor{4d4c}
@deffn {Opcode} SETUP_WITH (target)

Like @code{SETUP_CLEANUP}, but in case of an exception one more item is popped
from the stack before control is transferred to the exception handler at
@code{target}.

This variant is used in @ref{186,,with} and @ref{185,,async with}
constructs, which push the return value of the context manager’s
@ref{7e3,,__enter__()} or @ref{241e,,__aenter__()} to the stack.
@end deffn

@geindex POP_BLOCK (opcode)
@anchor{library/dis opcode-POP_BLOCK}@anchor{4d4d}
@deffn {Opcode} POP_BLOCK

Marks the end of the code block associated with the last @code{SETUP_FINALLY},
@code{SETUP_CLEANUP} or @code{SETUP_WITH}.
@end deffn

@geindex LOAD_CONST_IMMORTAL (opcode)
@anchor{library/dis opcode-LOAD_CONST_IMMORTAL}@anchor{375}
@deffn {Opcode} LOAD_CONST_IMMORTAL (consti)

Works as @ref{4d31,,LOAD_CONST}, but is more efficient for immortal objects.
@end deffn

@geindex JUMP (opcode)
@geindex JUMP_NO_INTERRUPT (opcode)
@anchor{library/dis opcode-JUMP}@anchor{4d4e}
@deffn {Opcode} JUMP
@anchor{library/dis opcode-JUMP_NO_INTERRUPT}@anchor{1ba3}
@deffnx {Opcode} JUMP_NO_INTERRUPT

Undirected relative jump instructions which are replaced by their
directed (forward/backward) counterparts by the assembler.
@end deffn

@geindex JUMP_IF_TRUE (opcode)
@geindex JUMP_IF_FALSE (opcode)
@anchor{library/dis opcode-JUMP_IF_TRUE}@anchor{373}
@deffn {Opcode} JUMP_IF_TRUE
@anchor{library/dis opcode-JUMP_IF_FALSE}@anchor{374}
@deffnx {Opcode} JUMP_IF_FALSE

Conditional jumps which do not impact the stack. Replaced by the sequence
@code{COPY 1}, @code{TO_BOOL}, @code{POP_JUMP_IF_TRUE/FALSE}.
@end deffn

@geindex LOAD_CLOSURE (opcode)
@anchor{library/dis opcode-LOAD_CLOSURE}@anchor{1a5d}
@deffn {Opcode} LOAD_CLOSURE (i)

Pushes a reference to the cell contained in slot @code{i} of the “fast locals”
storage.

Note that @code{LOAD_CLOSURE} is replaced with @code{LOAD_FAST} in the assembler.


버전 3.13에서 변경: This opcode is now a pseudo-instruction.

@end deffn

@node 옵코드 모음,,파이썬 바이트 코드 명령어,dis — Disassembler for Python bytecode
@anchor{library/dis id1}@anchor{4d4f}@anchor{library/dis opcode-collections}@anchor{4d00}
@subsubsection 옵코드 모음


이 모음은 바이트 코드 명령어의 자동 검사를 위해 제공됩니다:


버전 3.12에서 변경: The collections now contain pseudo instructions and instrumented
instructions as well. These are opcodes with values @code{>= MIN_PSEUDO_OPCODE}
and @code{>= MIN_INSTRUMENTED_OPCODE}.


@geindex opname (dis 모듈)
@anchor{library/dis dis opname}@anchor{4d04}
@deffn {데이터} dis.opname

연산 이름의 시퀀스, 바이트 코드를 사용하여 인덱싱할 수 있습니다.
@end deffn

@geindex opmap (dis 모듈)
@anchor{library/dis dis opmap}@anchor{4d50}
@deffn {데이터} dis.opmap

연산 이름을 바이트 코드로 매핑하는 딕셔너리.
@end deffn

@geindex cmp_op (dis 모듈)
@anchor{library/dis dis cmp_op}@anchor{4d51}
@deffn {데이터} dis.cmp_op

모든 비교 연산 이름의 시퀀스.
@end deffn

@geindex hasarg (dis 모듈)
@anchor{library/dis dis hasarg}@anchor{59e}
@deffn {데이터} dis.hasarg

Sequence of bytecodes that use their argument.


Added in version 3.12.

@end deffn

@geindex hasconst (dis 모듈)
@anchor{library/dis dis hasconst}@anchor{4d52}
@deffn {데이터} dis.hasconst

상수에 액세스하는 바이트 코드의 시퀀스.
@end deffn

@geindex hasfree (dis 모듈)
@anchor{library/dis dis hasfree}@anchor{4d53}
@deffn {데이터} dis.hasfree

Sequence of bytecodes that access a @ref{1895,,free (closure) variable}.
‘free’ in this context refers to names in the current scope that are
referenced by inner scopes or names in outer scopes that are referenced
from this scope.  It does `not' include references to global or builtin scopes.
@end deffn

@geindex hasname (dis 모듈)
@anchor{library/dis dis hasname}@anchor{4d54}
@deffn {데이터} dis.hasname

어트리뷰트를 이름으로 액세스하는 바이트 코드의 시퀀스.
@end deffn

@geindex hasjump (dis 모듈)
@anchor{library/dis dis hasjump}@anchor{4d55}
@deffn {데이터} dis.hasjump

Sequence of bytecodes that have a jump target. All jumps
are relative.


Added in version 3.13.

@end deffn

@geindex haslocal (dis 모듈)
@anchor{library/dis dis haslocal}@anchor{4d56}
@deffn {데이터} dis.haslocal

지역 변수에 액세스하는 바이트 코드의 시퀀스.
@end deffn

@geindex hascompare (dis 모듈)
@anchor{library/dis dis hascompare}@anchor{4d57}
@deffn {데이터} dis.hascompare

불리언 연산의 바이트 코드의 시퀀스.
@end deffn

@geindex hasexc (dis 모듈)
@anchor{library/dis dis hasexc}@anchor{6b1}
@deffn {데이터} dis.hasexc

Sequence of bytecodes that set an exception handler.


Added in version 3.12.

@end deffn

@geindex hasjrel (dis 모듈)
@anchor{library/dis dis hasjrel}@anchor{4d58}
@deffn {데이터} dis.hasjrel

상대 점프 대상이 있는 바이트 코드의 시퀀스.


버전 3.13부터 폐지됨: All jumps are now relative. Use @ref{4d55,,hasjump}.

@end deffn

@geindex hasjabs (dis 모듈)
@anchor{library/dis dis hasjabs}@anchor{4d59}
@deffn {데이터} dis.hasjabs

절대 점프 대상이 있는 바이트 코드의 시퀀스.


버전 3.13부터 폐지됨: All jumps are now relative. This list is empty.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node pickletools — 피클 개발자를 위한 도구,,dis — Disassembler for Python bytecode,파이썬 언어 서비스
@anchor{library/pickletools doc}@anchor{4d5a}@anchor{library/pickletools module-pickletools}@anchor{ac}@anchor{library/pickletools pickletools-tools-for-pickle-developers}@anchor{4d5b}@anchor{library/pickletools translation-repo}@anchor{4d5c}
@subsection @code{pickletools} — 피클 개발자를 위한 도구


@geindex module; pickletools

`소스 코드:' Lib/pickletools.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/pickletools.py}


__________________________________________________________________


This module contains various constants relating to the intimate details of the
@ref{ab,,pickle} module, some lengthy comments about the implementation, and a
few useful functions for analyzing pickled data.  The contents of this module
are useful for Python core developers who are working on the @code{pickle};
ordinary users of the @code{pickle} module probably won’t find the
@code{pickletools} module relevant.

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

@end menu

@node Command-line usage<8>,Programmatic interface,,pickletools — 피클 개발자를 위한 도구
@anchor{library/pickletools command-line-usage}@anchor{4d5d}@anchor{library/pickletools pickletools-cli}@anchor{2d56}
@subsubsection Command-line usage



Added in version 3.2.


명령 줄에서 호출될 때, @code{python -m pickletools}는 하나 이상의 피클 파일의 내용을 역 어셈블합니다. 피클 형식의 세부 사항이 아닌 피클에 저장된 파이썬 객체를 보려면, 대신 @code{-m pickle}을 사용하는 것이 좋습니다. 그러나, 검사하려는 피클 파일이 신뢰할 수 없는 소스에서 왔을 때, 피클 바이트 코드를 실행하지 않으므로 @code{-m pickletools}가 더 안전한 옵션입니다.

예를 들어, 튜플 @code{(1, 2)}가 파일 @code{x.pickle}에 피클 된 경우:

@example
$ python -m pickle x.pickle
(1, 2)

$ python -m pickletools x.pickle
    0: \x80 PROTO      3
    2: K    BININT1    1
    4: K    BININT1    2
    6: \x86 TUPLE2
    7: q    BINPUT     0
    9: .    STOP
highest protocol among opcodes = 2
@end example

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

@end menu

@node Command-line options<3>,,,Command-line usage<8>
@anchor{library/pickletools command-line-options}@anchor{4d5e}
@subsubsection Command-line options


@geindex pickletools 명령줄 옵션; -a
@geindex pickletools 명령줄 옵션; --annotate
@anchor{library/pickletools cmdoption-pickletools-a}@anchor{4d5f}@anchor{library/pickletools cmdoption-pickletools-annotate}@anchor{4d60}
@deffn {Option} @w{-}a, @w{-}@w{-}annotate

각 줄에 짧은 opcode 설명으로 주석을 답니다.
@end deffn

@geindex pickletools 명령줄 옵션; -o
@geindex pickletools 명령줄 옵션; --output
@anchor{library/pickletools cmdoption-pickletools-o}@anchor{4d61}@anchor{library/pickletools cmdoption-pickletools-output}@anchor{4d62}
@deffn {Option} @w{-}o, @w{-}@w{-}output=<file>

출력이 기록되어야 하는 파일의 이름.
@end deffn

@geindex pickletools 명령줄 옵션; -l
@geindex pickletools 명령줄 옵션; --indentlevel
@anchor{library/pickletools cmdoption-pickletools-l}@anchor{4d63}@anchor{library/pickletools cmdoption-pickletools-indentlevel}@anchor{4d64}
@deffn {Option} @w{-}l, @w{-}@w{-}indentlevel=<num>

새 MARK 수준을 들여쓰기하는 공백의 수.
@end deffn

@geindex pickletools 명령줄 옵션; -m
@geindex pickletools 명령줄 옵션; --memo
@anchor{library/pickletools cmdoption-pickletools-m}@anchor{4d65}@anchor{library/pickletools cmdoption-pickletools-memo}@anchor{4d66}
@deffn {Option} @w{-}m, @w{-}@w{-}memo

여러 객체가 역 어셈블될 때, 역 어셈블리 간에 메모를 보존합니다.
@end deffn

@geindex pickletools 명령줄 옵션; -p
@geindex pickletools 명령줄 옵션; --preamble
@anchor{library/pickletools cmdoption-pickletools-p}@anchor{4d67}@anchor{library/pickletools cmdoption-pickletools-preamble}@anchor{4d68}
@deffn {Option} @w{-}p, @w{-}@w{-}preamble=<preamble>

When more than one pickle file is specified, print given preamble
before each disassembly.
@end deffn

@geindex pickletools 명령줄 옵션; pickle_file
@anchor{library/pickletools cmdoption-pickletools-arg-pickle_file}@anchor{4d69}
@deffn {Option} pickle_file

A pickle file to read, or @code{-} to indicate reading from standard input.
@end deffn

@node Programmatic interface,,Command-line usage<8>,pickletools — 피클 개발자를 위한 도구
@anchor{library/pickletools programmatic-interface}@anchor{4d6a}
@subsubsection Programmatic interface


@geindex dis() (pickletools 모듈)
@anchor{library/pickletools pickletools dis}@anchor{ebd}
@deffn {함수} pickletools.dis (pickle, out=None, memo=None, indentlevel=4, annotate=0)

피클의 기호적인 역 어셈블리를 기본값이 @code{sys.stdout}인 파일류 객체 `out'으로 출력합니다. `pickle'는 문자열이나 파일류 객체가 될 수 있습니다. `memo'는 피클의 메모로 사용될 파이썬 딕셔너리일 수 있습니다; 같은 피클러로 만들어진 여러 피클에 걸쳐 역 어셈블리를 수행하는 데 사용할 수 있습니다. 스트림의 @code{MARK} 옵코드로 표시된 연속 수준은 `indentlevel'개의 스페이스로 들여쓰기 됩니다. 0이 아닌 값이 `annotate'에 주어지면, 출력의 각 옵코드에 짧은 설명이 주석으로 표시됩니다. `annotate' 값은 주석을 시작해야 하는 열의 힌트로 사용됩니다.


버전 3.2에서 변경: `annotate' 인자를 추가했습니다.

@end deffn

@geindex genops() (pickletools 모듈)
@anchor{library/pickletools pickletools genops}@anchor{4d6b}
@deffn {함수} pickletools.genops (pickle)

피클의 모든 옵코드에 대해 @code{(opcode, arg, pos)} 트리플을 반환하는 @ref{4ca,,이터레이터}를 제공합니다. `opcode'는 @code{OpcodeInfo} 클래스의 인스턴스입니다; `arg'는 옵코드 인자의 파이썬 객체로 디코딩된 값입니다; `pos'는 이 옵코드의 위치입니다. `pickle'은 문자열이나 파일류 객체가 될 수 있습니다.
@end deffn

@geindex optimize() (pickletools 모듈)
@anchor{library/pickletools pickletools optimize}@anchor{2d3d}
@deffn {함수} pickletools.optimize (picklestring)

사용되지 않는 @code{PUT} 옵코드를 제거한 후 새로운 동등한 피클 문자열을 반환합니다. 최적화된 피클은 더 짧고, 전송 시간이 덜 걸리며, 저장 공간이 덜 필요하고, 역 피클이 더 효율적입니다.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node MS 윈도우 특정 서비스,Unix-specific services,파이썬 언어 서비스,파이썬 표준 라이브러리
@anchor{library/windows doc}@anchor{4d6c}@anchor{library/windows ms-windows-specific-services}@anchor{4d6d}@anchor{library/windows mswin-specific-services}@anchor{221d}@anchor{library/windows translation-repo}@anchor{4d6e}
@section MS 윈도우 특정 서비스


이 장에서는 MS 윈도우 플랫폼에서만 사용 가능한 모듈에 관해 설명합니다.

@menu
* msvcrt — MS VC++ 런타임의 유용한 루틴:: 
* winreg — 윈도우 레지스트리 액세스:: 
* winsound — 윈도우용 소리 재생 인터페이스:: 

@end menu

@node msvcrt — MS VC++ 런타임의 유용한 루틴,winreg — 윈도우 레지스트리 액세스,,MS 윈도우 특정 서비스
@anchor{library/msvcrt doc}@anchor{4d6f}@anchor{library/msvcrt module-msvcrt}@anchor{97}@anchor{library/msvcrt msvcrt-useful-routines-from-the-ms-vc-runtime}@anchor{4d70}
@subsection @code{msvcrt} — MS VC++ 런타임의 유용한 루틴


@geindex module; msvcrt


__________________________________________________________________


이 함수들은 윈도우 플랫폼에서 유용한 기능에 대한 액세스를 제공합니다. 일부 고수준 모듈은 이러한 함수를 사용하여 해당 서비스의 윈도우 구현을 구축합니다. 예를 들어, @ref{66,,getpass} 모듈은 @ref{66,,getpass()} 함수를 구현할 때 이를 사용합니다.

이 함수에 대한 자세한 설명은 플랫폼 API 설명서에서 찾을 수 있습니다.

이 모듈은 콘솔 I/O api의 일반과 광폭(wide) 문자 변형을 모두 구현합니다. 일반 API는 ASCII 문자만 다루며 국제화된 응용 프로그램에서는 제한적으로 사용됩니다. 가능하면 광폭 문자 API를 사용해야 합니다.

@ref{213c,,가용성}: Windows.


버전 3.3에서 변경: 이 모듈의 연산은 이제 @ref{1252,,IOError}를 발생시키던 곳에서 @ref{2c0,,OSError}를 발생시킵니다.


@menu
* 파일 연산:: 
* 콘솔 I/O:: 
* 기타 함수: 기타 함수<4>. 

@end menu

@node 파일 연산,콘솔 I/O,,msvcrt — MS VC++ 런타임의 유용한 루틴
@anchor{library/msvcrt file-operations}@anchor{4d71}@anchor{library/msvcrt msvcrt-files}@anchor{4d72}
@subsubsection 파일 연산


@geindex locking() (msvcrt 모듈)
@anchor{library/msvcrt msvcrt locking}@anchor{479d}
@deffn {함수} msvcrt.locking (fd, mode, nbytes)

C 런타임의 파일 기술자 `fd'를 기반으로 파일 일부를 잠급니다. 실패하면 @ref{2c0,,OSError}를 발생시킵니다. 파일의 잠긴 영역은 현재 파일 위치에서부터 `nbytes' 바이트까지며, 파일 끝을 넘어 계속될 수 있습니다. `mode'는 아래에 나열된 @code{LK_*} 상수 중 하나여야 합니다. 파일의 여러 영역이 동시에 잠길 수 있지만 겹칠 수는 없습니다. 인접한 영역은 병합되지 않습니다; 개별적으로 잠금을 해제해야 합니다.

인자 @code{fd}, @code{mode}, @code{nbytes}로 @ref{1c6c,,감사 이벤트} @code{msvcrt.locking}을 발생시킵니다.
@end deffn

@geindex LK_LOCK (msvcrt 모듈)
@geindex LK_RLCK (msvcrt 모듈)
@anchor{library/msvcrt msvcrt LK_LOCK}@anchor{4d73}
@deffn {데이터} msvcrt.LK_LOCK
@anchor{library/msvcrt msvcrt LK_RLCK}@anchor{4d74}
@deffnx {데이터} msvcrt.LK_RLCK

지정된 바이트를 잠급니다. 바이트를 잠글 수 없으면, 프로그램은 1초 후에 즉시 다시 시도합니다. 10 번 시도한 후에도 바이트를 잠글 수 없으면, @ref{2c0,,OSError}가 발생합니다.
@end deffn

@geindex LK_NBLCK (msvcrt 모듈)
@geindex LK_NBRLCK (msvcrt 모듈)
@anchor{library/msvcrt msvcrt LK_NBLCK}@anchor{4d75}
@deffn {데이터} msvcrt.LK_NBLCK
@anchor{library/msvcrt msvcrt LK_NBRLCK}@anchor{4d76}
@deffnx {데이터} msvcrt.LK_NBRLCK

지정된 바이트를 잠급니다. 바이트를 잠글 수 없으면, @ref{2c0,,OSError}가 발생합니다.
@end deffn

@geindex LK_UNLCK (msvcrt 모듈)
@anchor{library/msvcrt msvcrt LK_UNLCK}@anchor{4d77}
@deffn {데이터} msvcrt.LK_UNLCK

이전에 잠겨 있어야 하는 지정된 바이트의 잠금을 해제합니다.
@end deffn

@geindex setmode() (msvcrt 모듈)
@anchor{library/msvcrt msvcrt setmode}@anchor{4d78}
@deffn {함수} msvcrt.setmode (fd, flags)

파일 기술자 `fd'의 줄 종료 변환 모드를 설정합니다. 텍스트 모드로 설정하려면, `flags'가 @ref{307b,,os.O_TEXT} 여야 합니다; 바이너리는, @ref{306c,,os.O_BINARY} 여야 합니다.
@end deffn

@geindex open_osfhandle() (msvcrt 모듈)
@anchor{library/msvcrt msvcrt open_osfhandle}@anchor{479e}
@deffn {함수} msvcrt.open_osfhandle (handle, flags)

파일 핸들 `handle'에서 C 런타임 파일 기술자를 만듭니다. `flags' 매개 변수는 @ref{306e,,os.O_APPEND}, @ref{306a,,os.O_RDONLY}, @ref{307b,,os.O_TEXT} 및 @ref{3076,,os.O_NOINHERIT}의 비트별 OR 여야 합니다. 반환된 파일 기술자는 @ref{237d,,os.fdopen()}에 대한 매개 변수로 사용되어 파일 객체를 만들 수 있습니다.

The file descriptor is inheritable by default. Pass @ref{3076,,os.O_NOINHERIT}
flag to make it non inheritable.

인자 @code{handle}, @code{flags}로 @ref{1c6c,,감사 이벤트} @code{msvcrt.open_osfhandle}을 발생시킵니다.
@end deffn

@geindex get_osfhandle() (msvcrt 모듈)
@anchor{library/msvcrt msvcrt get_osfhandle}@anchor{479c}
@deffn {함수} msvcrt.get_osfhandle (fd)

파일 기술자 `fd'의 파일 핸들을 돌려줍니다. `fd'가 인식되지 않으면 @ref{2c0,,OSError}를 발생시킵니다.

인자 @code{fd}로 @ref{1c6c,,감사 이벤트} @code{msvcrt.get_osfhandle}을 발생시킵니다.
@end deffn

@node 콘솔 I/O,기타 함수<4>,파일 연산,msvcrt — MS VC++ 런타임의 유용한 루틴
@anchor{library/msvcrt console-i-o}@anchor{4d79}@anchor{library/msvcrt msvcrt-console}@anchor{4d7a}
@subsubsection 콘솔 I/O


@geindex kbhit() (msvcrt 모듈)
@anchor{library/msvcrt msvcrt kbhit}@anchor{4d7b}
@deffn {함수} msvcrt.kbhit ()

읽을 수 있는 키 누르기가 대기 중이면 0이 아닌 값을 반환합니다. 그렇지 않으면, 0을 반환합니다.
@end deffn

@geindex getch() (msvcrt 모듈)
@anchor{library/msvcrt msvcrt getch}@anchor{4d7c}
@deffn {함수} msvcrt.getch ()

키 누르기를 읽고 결과 문자를 바이트열로 반환합니다. 콘솔에 아무것도 에코 되지 않습니다. 이 호출은 키 누르기를 아직 사용할 수 없으면 블록하지만, @code{Enter}가 눌러지기를 기다리지는 않습니다. 누른 키가 특수 기능 키면, @code{'\000'} 이나 @code{'\xe0'}를 반환합니다; 다음 호출은 키코드를 반환합니다. 이 함수로 @code{Control}-@code{C} 키 누르기를 읽을 수 없습니다.
@end deffn

@geindex getwch() (msvcrt 모듈)
@anchor{library/msvcrt msvcrt getwch}@anchor{15fa}
@deffn {함수} msvcrt.getwch ()

유니코드 값을 반환하는 @ref{4d7c,,getch()}의 광폭 문자 변형.
@end deffn

@geindex getche() (msvcrt 모듈)
@anchor{library/msvcrt msvcrt getche}@anchor{4d7d}
@deffn {함수} msvcrt.getche ()

@ref{4d7c,,getch()}와 비슷하지만, 인쇄 가능한 문자를 나타내는 경우 키 누르기가 에코 됩니다.
@end deffn

@geindex getwche() (msvcrt 모듈)
@anchor{library/msvcrt msvcrt getwche}@anchor{15fb}
@deffn {함수} msvcrt.getwche ()

유니코드 값을 반환하는 @ref{4d7d,,getche()}의 광폭 문자 변형.
@end deffn

@geindex putch() (msvcrt 모듈)
@anchor{library/msvcrt msvcrt putch}@anchor{4d7e}
@deffn {함수} msvcrt.putch (char)

버퍼링하지 않고 바이트열 `char'을 콘솔에 인쇄합니다.
@end deffn

@geindex putwch() (msvcrt 모듈)
@anchor{library/msvcrt msvcrt putwch}@anchor{15fc}
@deffn {함수} msvcrt.putwch (unicode_char)

유니코드 값을 받아들이는 @ref{4d7e,,putch()}의 광폭 문자 변형.
@end deffn

@geindex ungetch() (msvcrt 모듈)
@anchor{library/msvcrt msvcrt ungetch}@anchor{4d7f}
@deffn {함수} msvcrt.ungetch (char)

바이트열 `char'이 콘솔 버퍼로 “푸시백” 되도록 합니다; @ref{4d7c,,getch()} 나 @ref{4d7d,,getche()}가 읽는 다음 문자가 됩니다.
@end deffn

@geindex ungetwch() (msvcrt 모듈)
@anchor{library/msvcrt msvcrt ungetwch}@anchor{4d80}
@deffn {함수} msvcrt.ungetwch (unicode_char)

유니코드 값을 받아들이는 @ref{4d7f,,ungetch()}의 광폭 문자 변형.
@end deffn

@node 기타 함수<4>,,콘솔 I/O,msvcrt — MS VC++ 런타임의 유용한 루틴
@anchor{library/msvcrt msvcrt-other}@anchor{4d81}@anchor{library/msvcrt other-functions}@anchor{4d82}
@subsubsection 기타 함수


@geindex heapmin() (msvcrt 모듈)
@anchor{library/msvcrt msvcrt heapmin}@anchor{4d83}
@deffn {함수} msvcrt.heapmin ()

강제로 @code{malloc()} 힙이 자신을 정리하고, 사용하지 않는 블록을 운영 체제로 반환하도록 합니다. 실패하면, @ref{2c0,,OSError}가 발생합니다.
@end deffn

@geindex set_error_mode() (msvcrt 모듈)
@anchor{library/msvcrt msvcrt set_error_mode}@anchor{4d84}
@deffn {함수} msvcrt.set_error_mode (mode)

Changes the location where the C runtime writes an error message for an error
that might end the program. `mode' must be one of the @code{OUT_*}
constants listed below  or @ref{4d85,,REPORT_ERRMODE}. Returns the old setting
or -1 if an error occurs. Only available in
@ref{508,,debug build of Python}.
@end deffn

@geindex OUT_TO_DEFAULT (msvcrt 모듈)
@anchor{library/msvcrt msvcrt OUT_TO_DEFAULT}@anchor{4d86}
@deffn {데이터} msvcrt.OUT_TO_DEFAULT

Error sink is determined by the app’s type. Only available in
@ref{508,,debug build of Python}.
@end deffn

@geindex OUT_TO_STDERR (msvcrt 모듈)
@anchor{library/msvcrt msvcrt OUT_TO_STDERR}@anchor{4d87}
@deffn {데이터} msvcrt.OUT_TO_STDERR

Error sink is a standard error. Only available in
@ref{508,,debug build of Python}.
@end deffn

@geindex OUT_TO_MSGBOX (msvcrt 모듈)
@anchor{library/msvcrt msvcrt OUT_TO_MSGBOX}@anchor{4d88}
@deffn {데이터} msvcrt.OUT_TO_MSGBOX

Error sink is a message box. Only available in
@ref{508,,debug build of Python}.
@end deffn

@geindex REPORT_ERRMODE (msvcrt 모듈)
@anchor{library/msvcrt msvcrt REPORT_ERRMODE}@anchor{4d85}
@deffn {데이터} msvcrt.REPORT_ERRMODE

Report the current error mode value. Only available in
@ref{508,,debug build of Python}.
@end deffn

@geindex CrtSetReportMode() (msvcrt 모듈)
@anchor{library/msvcrt msvcrt CrtSetReportMode}@anchor{4d89}
@deffn {함수} msvcrt.CrtSetReportMode (type, mode)

Specifies the destination or destinations for a specific report type
generated by @code{_CrtDbgReport()} in the MS VC++ runtime. `type' must be
one of the @code{CRT_*} constants listed below. `mode' must be one of the
@code{CRTDBG_*} constants listed below. Only available in
@ref{508,,debug build of Python}.
@end deffn

@geindex CrtSetReportFile() (msvcrt 모듈)
@anchor{library/msvcrt msvcrt CrtSetReportFile}@anchor{4d8a}
@deffn {함수} msvcrt.CrtSetReportFile (type, file)

After you use @ref{4d89,,CrtSetReportMode()} to specify @ref{4d8b,,CRTDBG_MODE_FILE},
you can specify the file handle to receive the message text. `type' must be
one of the @code{CRT_*} constants listed below. `file' should be the file
handle your want specified. Only available in
@ref{508,,debug build of Python}.
@end deffn

@geindex CRT_WARN (msvcrt 모듈)
@anchor{library/msvcrt msvcrt CRT_WARN}@anchor{4d8c}
@deffn {데이터} msvcrt.CRT_WARN

Warnings, messages, and information that doesn’t need immediate attention.
@end deffn

@geindex CRT_ERROR (msvcrt 모듈)
@anchor{library/msvcrt msvcrt CRT_ERROR}@anchor{4d8d}
@deffn {데이터} msvcrt.CRT_ERROR

Errors, unrecoverable problems, and issues that require immediate attention.
@end deffn

@geindex CRT_ASSERT (msvcrt 모듈)
@anchor{library/msvcrt msvcrt CRT_ASSERT}@anchor{4d8e}
@deffn {데이터} msvcrt.CRT_ASSERT

Assertion failures.
@end deffn

@geindex CRTDBG_MODE_DEBUG (msvcrt 모듈)
@anchor{library/msvcrt msvcrt CRTDBG_MODE_DEBUG}@anchor{4d8f}
@deffn {데이터} msvcrt.CRTDBG_MODE_DEBUG

Writes the message to the debugger’s output window.
@end deffn

@geindex CRTDBG_MODE_FILE (msvcrt 모듈)
@anchor{library/msvcrt msvcrt CRTDBG_MODE_FILE}@anchor{4d8b}
@deffn {데이터} msvcrt.CRTDBG_MODE_FILE

Writes the message to a user-supplied file handle. @ref{4d8a,,CrtSetReportFile()}
should be called to define the specific file or stream to use as
the destination.
@end deffn

@geindex CRTDBG_MODE_WNDW (msvcrt 모듈)
@anchor{library/msvcrt msvcrt CRTDBG_MODE_WNDW}@anchor{4d90}
@deffn {데이터} msvcrt.CRTDBG_MODE_WNDW

Creates a message box to display the message along with the @code{Abort},
@code{Retry}, and @code{Ignore} buttons.
@end deffn

@geindex CRTDBG_REPORT_MODE (msvcrt 모듈)
@anchor{library/msvcrt msvcrt CRTDBG_REPORT_MODE}@anchor{4d91}
@deffn {데이터} msvcrt.CRTDBG_REPORT_MODE

Returns current `mode' for the specified `type'.
@end deffn

@geindex CRT_ASSEMBLY_VERSION (msvcrt 모듈)
@anchor{library/msvcrt msvcrt CRT_ASSEMBLY_VERSION}@anchor{1564}
@deffn {데이터} msvcrt.CRT_ASSEMBLY_VERSION

The CRT Assembly version, from the @code{crtassem.h} header file.
@end deffn

@geindex VC_ASSEMBLY_PUBLICKEYTOKEN (msvcrt 모듈)
@anchor{library/msvcrt msvcrt VC_ASSEMBLY_PUBLICKEYTOKEN}@anchor{1565}
@deffn {데이터} msvcrt.VC_ASSEMBLY_PUBLICKEYTOKEN

The VC Assembly public key token, from the @code{crtassem.h} header file.
@end deffn

@geindex LIBRARIES_ASSEMBLY_NAME_PREFIX (msvcrt 모듈)
@anchor{library/msvcrt msvcrt LIBRARIES_ASSEMBLY_NAME_PREFIX}@anchor{1566}
@deffn {데이터} msvcrt.LIBRARIES_ASSEMBLY_NAME_PREFIX

The Libraries Assembly name prefix, from the @code{crtassem.h} header file.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node winreg — 윈도우 레지스트리 액세스,winsound — 윈도우용 소리 재생 인터페이스,msvcrt — MS VC++ 런타임의 유용한 루틴,MS 윈도우 특정 서비스
@anchor{library/winreg doc}@anchor{4d92}@anchor{library/winreg module-winreg}@anchor{11c}@anchor{library/winreg translation-repo}@anchor{4d93}@anchor{library/winreg winreg-windows-registry-access}@anchor{4d94}
@subsection @code{winreg} — 윈도우 레지스트리 액세스


@geindex module; winreg


__________________________________________________________________


이 함수들은 윈도우 레지스트리 API를 파이썬에 노출합니다. 프로그래머가 명시적으로 닫는 것을 무시하더라도 핸들이 올바르게 닫히도록 하기 위해, 레지스트리 핸들로 정수를 사용하는 대신 @ref{4d95,,핸들 객체}가 사용됩니다.

@ref{213c,,가용성}: Windows.
@anchor{library/winreg exception-changed}@anchor{4d96}

버전 3.3에서 변경: 이 모듈의 여러 함수는 @ref{1254,,WindowsError}를 발생시켜왔는데, 이제는 @ref{2c0,,OSError}의 별칭입니다.


@menu
* 함수: 함수<12>. 
* 상수: 상수<11>. 
* 레지스트리 핸들 객체:: 

@end menu

@node 함수<12>,상수<11>,,winreg — 윈도우 레지스트리 액세스
@anchor{library/winreg functions}@anchor{4d97}@anchor{library/winreg id1}@anchor{4d98}
@subsubsection 함수


이 모듈은 다음 함수를 제공합니다:

@geindex CloseKey() (winreg 모듈)
@anchor{library/winreg winreg CloseKey}@anchor{4d99}
@deffn {함수} winreg.CloseKey (hkey)

이전에 열린 레지스트리 키를 닫습니다. `hkey' 인자는 이전에 열린 키를 지정합니다.

@cartouche
@quotation 참고 
이 메서드를 사용하여 (또는 @ref{4d9a,,hkey.Close()}를 통해) `hkey'가 닫히지 않으면, `hkey' 객체가 파이썬에 의해 파괴될 때 닫힙니다.
@end quotation
@end cartouche
@end deffn

@geindex ConnectRegistry() (winreg 모듈)
@anchor{library/winreg winreg ConnectRegistry}@anchor{47a3}
@deffn {함수} winreg.ConnectRegistry (computer_name, key)

다른 컴퓨터에 있는 사전 정의된 레지스트리 핸들에 연결하고, @ref{4d95,,핸들 객체}를 반환합니다.

`computer_name'은 @code{r"\\computername"} 형식의 원격 컴퓨터 이름입니다. @code{None}이면, 로컬 컴퓨터가 사용됩니다.

`key'는 연결할 사전 정의된 핸들입니다.

반환 값은 열린 키의 핸들입니다. 함수가 실패하면, @ref{2c0,,OSError} 예외가 발생합니다.

인자 @code{computer_name}, @code{key}로 @ref{1c6c,,감사 이벤트} @code{winreg.ConnectRegistry}를 발생시킵니다.


버전 3.3에서 변경: @ref{4d96,,위}를 참조하십시오.

@end deffn

@geindex CreateKey() (winreg 모듈)
@anchor{library/winreg winreg CreateKey}@anchor{47a4}
@deffn {함수} winreg.CreateKey (key, sub_key)

지정된 키를 만들거나 열어, @ref{4d95,,핸들 객체}를 반환합니다.

`key'는 이미 열린 키이거나, 사전 정의된 @ref{4d9b,,HKEY_* 상수} 중 하나입니다.

`sub_key'는 이 메서드가 열거나 만드는 키의 이름을 지정하는 문자열입니다.

`key'가 사전 정의된 키 중 하나이면, `sub_key'는 @code{None}일 수 있습니다. 이 경우, 반환된 핸들은 함수에 전달된 것과 같은 키 핸들입니다.

키가 이미 존재하면, 이 함수는 기존 키를 엽니다.

반환 값은 열린 키의 핸들입니다. 함수가 실패하면, @ref{2c0,,OSError} 예외가 발생합니다.

인자 @code{key}, @code{sub_key}, @code{access}로 @ref{1c6c,,감사 이벤트} @code{winreg.CreateKey}를 발생시킵니다.

인자 @code{key}로 @ref{1c6c,,감사 이벤트} @code{winreg.OpenKey/result}를 발생시킵니다.


버전 3.3에서 변경: @ref{4d96,,위}를 참조하십시오.

@end deffn

@geindex CreateKeyEx() (winreg 모듈)
@anchor{library/winreg winreg CreateKeyEx}@anchor{1567}
@deffn {함수} winreg.CreateKeyEx (key, sub_key, reserved=0, access=KEY_WRITE)

지정된 키를 만들거나 열어, @ref{4d95,,핸들 객체}를 반환합니다.

`key'는 이미 열린 키이거나, 사전 정의된 @ref{4d9b,,HKEY_* 상수} 중 하나입니다.

`sub_key'는 이 메서드가 열거나 만드는 키의 이름을 지정하는 문자열입니다.

`reserved'는 예약된 정수이며, 0이어야 합니다. 기본값은 0입니다.

`access'는 키에 대한 원하는 보안 액세스를 기술하는 액세스 마스크를 지정하는 정수입니다. 기본값은 @ref{4d9c,,KEY_WRITE}입니다. 허용되는 다른 값은 @ref{4d9d,,액세스 권한}을 참조하십시오.

`key'가 사전 정의된 키 중 하나이면, `sub_key'는 @code{None}일 수 있습니다. 이 경우, 반환된 핸들은 함수에 전달된 것과 같은 키 핸들입니다.

키가 이미 존재하면, 이 함수는 기존 키를 엽니다.

반환 값은 열린 키의 핸들입니다. 함수가 실패하면, @ref{2c0,,OSError} 예외가 발생합니다.

인자 @code{key}, @code{sub_key}, @code{access}로 @ref{1c6c,,감사 이벤트} @code{winreg.CreateKey}를 발생시킵니다.

인자 @code{key}로 @ref{1c6c,,감사 이벤트} @code{winreg.OpenKey/result}를 발생시킵니다.


Added in version 3.2.



버전 3.3에서 변경: @ref{4d96,,위}를 참조하십시오.

@end deffn

@geindex DeleteKey() (winreg 모듈)
@anchor{library/winreg winreg DeleteKey}@anchor{47a5}
@deffn {함수} winreg.DeleteKey (key, sub_key)

지정된 키를 삭제합니다.

`key'는 이미 열린 키이거나, 사전 정의된 @ref{4d9b,,HKEY_* 상수} 중 하나입니다.

`sub_key'는 `key' 매개 변수로 식별된 키의 서브 키여야 하는 문자열입니다. 이 값은 @code{None}이 아니어야 하며, 키에 서브 키가 없을 수 있습니다.

`이 메서드는 서브 키가 있는 키를 삭제할 수 없습니다.'

메서드가 성공하면, 모든 값을 포함하여 전체 키가 제거됩니다. 메서드가 실패하면, @ref{2c0,,OSError} 예외가 발생합니다.

인자 @code{key}, @code{sub_key}, @code{access}로 @ref{1c6c,,감사 이벤트} @code{winreg.DeleteKey}를 발생시킵니다.


버전 3.3에서 변경: @ref{4d96,,위}를 참조하십시오.

@end deffn

@geindex DeleteKeyEx() (winreg 모듈)
@anchor{library/winreg winreg DeleteKeyEx}@anchor{1568}
@deffn {함수} winreg.DeleteKeyEx (key, sub_key, access=KEY_WOW64_64KEY, reserved=0)

지정된 키를 삭제합니다.

`key'는 이미 열린 키이거나, 사전 정의된 @ref{4d9b,,HKEY_* 상수} 중 하나입니다.

`sub_key'는 `key' 매개 변수로 식별된 키의 서브 키여야 하는 문자열입니다. 이 값은 @code{None}이 아니어야 하며, 키에 서브 키가 없을 수 있습니다.

`reserved'는 예약된 정수이며, 0이어야 합니다. 기본값은 0입니다.

`access'는 키에 대한 원하는 보안 액세스를 기술하는 액세스 마스크를 지정하는 정수입니다. 기본값은 @ref{4d9e,,KEY_WOW64_64KEY}입니다. 32비트 윈도우에서는, WOW64 상수가 무시됩니다. 허용되는 다른 값은 @ref{4d9d,,액세스 권한}을 참조하십시오.

`이 메서드는 서브 키가 있는 키를 삭제할 수 없습니다.'

메서드가 성공하면, 모든 값을 포함하여 전체 키가 제거됩니다. 메서드가 실패하면, @ref{2c0,,OSError} 예외가 발생합니다.

지원되지 않는 윈도우 버전에서는, @ref{36b,,NotImplementedError} 가 발생합니다.

인자 @code{key}, @code{sub_key}, @code{access}로 @ref{1c6c,,감사 이벤트} @code{winreg.DeleteKey}를 발생시킵니다.


Added in version 3.2.



버전 3.3에서 변경: @ref{4d96,,위}를 참조하십시오.

@end deffn

@geindex DeleteValue() (winreg 모듈)
@anchor{library/winreg winreg DeleteValue}@anchor{47a6}
@deffn {함수} winreg.DeleteValue (key, value)

레지스트리 키에서 명명된 값을 제거합니다.

`key'는 이미 열린 키이거나, 사전 정의된 @ref{4d9b,,HKEY_* 상수} 중 하나입니다.

`value'는 제거할 값을 식별하는 문자열입니다.

인자 @code{key}, @code{value}로 @ref{1c6c,,감사 이벤트} @code{winreg.DeleteValue}를 발생시킵니다.
@end deffn

@geindex EnumKey() (winreg 모듈)
@anchor{library/winreg winreg EnumKey}@anchor{47a7}
@deffn {함수} winreg.EnumKey (key, index)

열린 레지스트리 키의 서브 키를 열거하고, 문자열을 반환합니다.

`key'는 이미 열린 키이거나, 사전 정의된 @ref{4d9b,,HKEY_* 상수} 중 하나입니다.

`index'는 꺼낼 키의 인덱스를 식별하는 정수입니다.

이 함수는 호출될 때마다 하나의 서브 키 이름을 꺼냅니다. 일반적으로  더 이상 사용할 수 있는 값이 없음을 나타내는 @ref{2c0,,OSError} 예외가 발생할 때까지 반복적으로 호출됩니다.

인자 @code{key}, @code{index}로 @ref{1c6c,,감사 이벤트} @code{winreg.EnumKey}를 발생시킵니다.


버전 3.3에서 변경: @ref{4d96,,위}를 참조하십시오.

@end deffn

@geindex EnumValue() (winreg 모듈)
@anchor{library/winreg winreg EnumValue}@anchor{47a8}
@deffn {함수} winreg.EnumValue (key, index)

열린 레지스트리 키의 값을 열거하고, 튜플을 반환합니다.

`key'는 이미 열린 키이거나, 사전 정의된 @ref{4d9b,,HKEY_* 상수} 중 하나입니다.

`index'는 꺼낼 값의 인덱스를 식별하는 정수입니다.

이 함수는 호출될 때마다 하나의 서브 키 이름을 꺼냅니다. 일반적으로 더는 값이 없음을 표시하는 @ref{2c0,,OSError} 예외가 발생할 때까지 반복적으로 호출됩니다.

결과는 3개의 항목으로 구성된 튜플입니다:


@multitable {xxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

인덱스

@tab

의미

@item

@code{0}

@tab

값 이름을 식별하는 문자열

@item

@code{1}

@tab

값 데이터를 담은 객체, 형이 하부 레지스트리 유형에 따라 달라집니다

@item

@code{2}

@tab

값 데이터의 형을 식별하는 정수 (@ref{1b01,,SetValueEx()}에 대한 설명서에 있는 표를 참조하십시오)

@end multitable


인자 @code{key}, @code{index}로 @ref{1c6c,,감사 이벤트} @code{winreg.EnumValue}를 발생시킵니다.


버전 3.3에서 변경: @ref{4d96,,위}를 참조하십시오.

@end deffn

@geindex % (퍼센트);환경 변수 확장 (윈도우)

@geindex ExpandEnvironmentStrings() (winreg 모듈)
@anchor{library/winreg winreg ExpandEnvironmentStrings}@anchor{15fd}
@deffn {함수} winreg.ExpandEnvironmentStrings (str)

@ref{4d9f,,REG_EXPAND_SZ}와 같은 문자열에서 환경 변수 자리 표시자 @code{%NAME%}을 확장합니다:

@example
>>> ExpandEnvironmentStrings('%windir%')
'C:\\Windows'
@end example

인자 @code{str}로 @ref{1c6c,,감사 이벤트} @code{winreg.ExpandEnvironmentStrings}를 발생시킵니다.
@end deffn

@geindex FlushKey() (winreg 모듈)
@anchor{library/winreg winreg FlushKey}@anchor{4da0}
@deffn {함수} winreg.FlushKey (key)

키의 모든 어트리뷰트를 레지스트리에 씁니다.

`key'는 이미 열린 키이거나, 사전 정의된 @ref{4d9b,,HKEY_* 상수} 중 하나입니다.

키를 변경하기 위해 @ref{4da0,,FlushKey()}를 호출할 필요는 없습니다. 레지스트리 변경은 지연 플러셔를 사용하여 레지스트리에 의해 디스크로 플러시 됩니다. 레지스트리 변경은 시스템 종료 시에도 디스크로 플러시 됩니다. @ref{4d99,,CloseKey()}와 달리, @code{FlushKey()} 메서드는 모든 데이터가 레지스트리에 기록될 때만 반환합니다. 응용 프로그램은 레지스트리 변경이 디스크에 있다는 절대적인 확신이 필요할 때만 @code{FlushKey()}를 호출해야 합니다.

@cartouche
@quotation 참고 
@ref{4da0,,FlushKey()} 호출이 필요한지 모른다면, 아마도 필요하지 않습니다.
@end quotation
@end cartouche
@end deffn

@geindex LoadKey() (winreg 모듈)
@anchor{library/winreg winreg LoadKey}@anchor{47a9}
@deffn {함수} winreg.LoadKey (key, sub_key, file_name)

지정된 키 아래에 서브 키를 만들고 지정된 파일에 있는 등록 정보를 그 서브 키에 저장합니다.

`key'는 @ref{47a3,,ConnectRegistry()}가 반환한 핸들이거나 상수 @ref{4da1,,HKEY_USERS}나 @ref{4da2,,HKEY_LOCAL_MACHINE} 중 하나입니다.

`sub_key'는 로드할 서브 키를 식별하는 문자열입니다.

`file_name'은 레지스트리 데이터를 로드할 파일의 이름입니다. 이 파일은 @ref{47ae,,SaveKey()} 함수로 만들어졌어야 합니다. FAT(file allocation table) 파일 시스템에서, 파일명은 확장자가 없을 수 있습니다.

호출하는 프로세스에 @code{SE_RESTORE_PRIVILEGE} 권한(privilege)이 없으면 @ref{47a9,,LoadKey()}에 대한 호출이 실패합니다. 권한(privilege)은 허가(permissions)와 다름에 유의하십시오 – 자세한 내용은 RegLoadKey 설명서@footnote{https://msdn.microsoft.com/en-us/library/ms724889%28v=VS.85%29.aspx}를 참조하십시오.

`key'가 @ref{47a3,,ConnectRegistry()}가 반환한 핸들이면, `file_name'에 지정된 경로는 원격 컴퓨터에 상대적입니다.

인자 @code{key}, @code{sub_key}, @code{file_name}으로 @ref{1c6c,,감사 이벤트} @code{winreg.LoadKey}를 발생시킵니다.
@end deffn

@geindex OpenKey() (winreg 모듈)
@geindex OpenKeyEx() (winreg 모듈)
@anchor{library/winreg winreg OpenKey}@anchor{47aa}
@deffn {함수} winreg.OpenKey (key, sub_key, reserved=0, access=KEY_READ)
@anchor{library/winreg winreg OpenKeyEx}@anchor{4da3}
@deffnx {함수} winreg.OpenKeyEx (key, sub_key, reserved=0, access=KEY_READ)

지정된 키를 열고, @ref{4d95,,핸들 객체}를 반환합니다.

`key'는 이미 열린 키이거나, 사전 정의된 @ref{4d9b,,HKEY_* 상수} 중 하나입니다.

`sub_key'는 열 서브 키를 식별하는 문자열입니다.

`reserved'는 예약된 정수이며, 0이어야 합니다. 기본값은 0입니다.

`access'는 키에 대한 원하는 보안 액세스를 기술하는 액세스 마스크를 지정하는 정수입니다. 기본값은 @ref{4da4,,KEY_READ}입니다. 허용되는 다른 값은 @ref{4d9d,,액세스 권한}을 참조하십시오.

결과는 지정된 키에 대한 새로운 핸들입니다.

함수가 실패하면, @ref{2c0,,OSError}가 발생합니다.

인자 @code{key}, @code{sub_key}, @code{access}로 @ref{1c6c,,감사 이벤트} @code{winreg.OpenKey}를 발생시킵니다.

인자 @code{key}로 @ref{1c6c,,감사 이벤트} @code{winreg.OpenKey/result}를 발생시킵니다.


버전 3.2에서 변경: 명명된 인자 사용을 허용합니다.



버전 3.3에서 변경: @ref{4d96,,위}를 참조하십시오.

@end deffn

@geindex QueryInfoKey() (winreg 모듈)
@anchor{library/winreg winreg QueryInfoKey}@anchor{47ac}
@deffn {함수} winreg.QueryInfoKey (key)

키에 대한 정보를 튜플로 반환합니다.

`key'는 이미 열린 키이거나, 사전 정의된 @ref{4d9b,,HKEY_* 상수} 중 하나입니다.

결과는 3개의 항목으로 구성된 튜플입니다:


@multitable {xxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

인덱스

@tab

의미

@item

@code{0}

@tab

이 키가 가진 서브 키의 수를 제공하는 정수.

@item

@code{1}

@tab

이 키가 가진 값의 수를 제공하는 정수.

@item

@code{2}

@tab

키가 마지막으로 수정된 때(있다면)를 1601년 1월 1일 이후로 지난 100나노초로 제공하는 정수.

@end multitable


인자 @code{key}로 @ref{1c6c,,감사 이벤트} @code{winreg.QueryInfoKey}를 발생시킵니다.
@end deffn

@geindex QueryValue() (winreg 모듈)
@anchor{library/winreg winreg QueryValue}@anchor{47ad}
@deffn {함수} winreg.QueryValue (key, sub_key)

키의 이름이 없는 값을 문자열로 가져옵니다.

`key'는 이미 열린 키이거나, 사전 정의된 @ref{4d9b,,HKEY_* 상수} 중 하나입니다.

`sub_key'는 값이 연관된 서브 키의 이름을 담은 문자열입니다. 이 매개 변수가 @code{None}이거나 비어있으면, 함수는 `key'로 식별된 키에 대해 @ref{47af,,SetValue()} 메서드로 설정된 값을 가져옵니다.

레지스트리의 값에는 이름, 형 및 데이터 구성 요소가 있습니다. 이 메서드는 @code{NULL} 이름을 가진 키의 첫 번째 값에 대한 데이터를 가져옵니다. 그러나 하부 API 호출은 형을 반환하지 않아서, 가능하다면 항상 @ref{178b,,QueryValueEx()}를 사용하십시오.

인자 @code{key}, @code{sub_key}, @code{value_name}으로 @ref{1c6c,,감사 이벤트} @code{winreg.QueryValue}를 발생시킵니다.
@end deffn

@geindex QueryValueEx() (winreg 모듈)
@anchor{library/winreg winreg QueryValueEx}@anchor{178b}
@deffn {함수} winreg.QueryValueEx (key, value_name)

열린 레지스트리 키와 연관된 지정된 값 이름의 형과 데이터를 가져옵니다.

`key'는 이미 열린 키이거나, 사전 정의된 @ref{4d9b,,HKEY_* 상수} 중 하나입니다.

`value_name'은 조회할 값을 나타내는 문자열입니다.

결과는 2개의 항목으로 구성된 튜플입니다:


@multitable {xxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

인덱스

@tab

의미

@item

@code{0}

@tab

레지스트리 항목의 값.

@item

@code{1}

@tab

이 값에 대한 레지스트리 유형을 제공하는 정수 (@ref{1b01,,SetValueEx()}의 설명서에 있는 표를 참조하십시오)

@end multitable


인자 @code{key}, @code{sub_key}, @code{value_name}으로 @ref{1c6c,,감사 이벤트} @code{winreg.QueryValue}를 발생시킵니다.
@end deffn

@geindex SaveKey() (winreg 모듈)
@anchor{library/winreg winreg SaveKey}@anchor{47ae}
@deffn {함수} winreg.SaveKey (key, file_name)

지정된 키와 그것의 모든 서브 키를 지정된 파일에 저장합니다.

`key'는 이미 열린 키이거나, 사전 정의된 @ref{4d9b,,HKEY_* 상수} 중 하나입니다.

`file_name'은 레지스트리 데이터를 저장할 파일 이름입니다. 이 파일은 이미 존재할 수 없습니다. 이 파일명에 확장자가 포함되어 있으면, @ref{47a9,,LoadKey()} 메서드로 FAT(file allocation table) 파일 시스템에서 사용할 수 없습니다.

`key'가 원격 컴퓨터의 키를 나타내면, `file_name'이 기술하는 경로는 원격 컴퓨터에 상대적입니다. 이 메서드의 호출자는 `SeBackupPrivilege' 보안 권한(privilege)을 가지고 있어야 합니다. 권한(privilege)은 허가(permissions)와 다름에 유의하십시오 – 자세한 내용은 사용자 권한과 허가 간의 충돌 설명서@footnote{https://msdn.microsoft.com/en-us/library/ms724878%28v=VS.85%29.aspx}를 참조하십시오.

이 함수는 `security_attributes'로 @code{NULL}을 API로 전달합니다.

인자 @code{key}, @code{file_name}으로 @ref{1c6c,,감사 이벤트} @code{winreg.SaveKey}를 발생시킵니다.
@end deffn

@geindex SetValue() (winreg 모듈)
@anchor{library/winreg winreg SetValue}@anchor{47af}
@deffn {함수} winreg.SetValue (key, sub_key, type, value)

값을 지정된 키와 연관시킵니다.

`key'는 이미 열린 키이거나, 사전 정의된 @ref{4d9b,,HKEY_* 상수} 중 하나입니다.

`sub_key'는 값이 연관된 서브 키의 이름을 지정하는 문자열입니다.

`type'은 데이터의 형을 지정하는 정수입니다. 현재 이것은 @ref{4da5,,REG_SZ} 여야 하는데, 문자열만 지원된다는 뜻입니다. 다른 데이터형을 지원하려면 @ref{1b01,,SetValueEx()} 함수를 사용하십시오.

`value'는 새 값을 지정하는 문자열입니다.

`sub_key' 매개 변수로 지정된 키가 존재하지 않으면, SetValue 함수가 이를 만듭니다.

값 길이는 사용 가능한 메모리에 따라 제한됩니다. 긴 값(2048바이트보다 긴)은 구성 레지스트리에 저장된 파일명을 가진 파일로 저장해야 합니다. 이렇게 하면 레지스트리가 효율적으로 수행하는 데 도움을 줍니다.

`key' 매개 변수로 식별된 키는 @ref{4da6,,KEY_SET_VALUE} 액세스로 열렸어야 합니다.

인자 @code{key}, @code{sub_key}, @code{type}, @code{value}로 @ref{1c6c,,감사 이벤트} @code{winreg.SetValue}를 발생시킵니다.
@end deffn

@geindex SetValueEx() (winreg 모듈)
@anchor{library/winreg winreg SetValueEx}@anchor{1b01}
@deffn {함수} winreg.SetValueEx (key, value_name, reserved, type, value)

열린 레지스트리 키의 값 필드에 데이터를 저장합니다.

`key'는 이미 열린 키이거나, 사전 정의된 @ref{4d9b,,HKEY_* 상수} 중 하나입니다.

`value_name'은 값이 연관된 서브 키의 이름을 지정하는 문자열입니다.

`reserved'는 무엇이든 가능합니다 – 0이 항상 API로 전달됩니다.

`type'은 데이터의 형을 지정하는 정수입니다. 사용 가능한 형은 @ref{4da7,,값 형}을 참조하십시오.

`value'는 새 값을 지정하는 문자열입니다.

이 메서드는 지정된 키에 대한 추가 값과 형 정보를 설정할 수도 있습니다. key 매개 변수로 식별된 키는 @ref{4da6,,KEY_SET_VALUE} 액세스로 열렸어야 합니다.

키를 열려면, @ref{47a4,,CreateKey()}나 @ref{47aa,,OpenKey()} 메서드를 사용하십시오.

값 길이는 사용 가능한 메모리에 따라 제한됩니다. 긴 값(2048바이트보다 긴)은 구성 레지스트리에 저장된 파일명을 가진 파일로 저장해야 합니다. 이렇게 하면 레지스트리가 효율적으로 수행하는 데 도움을 줍니다.

인자 @code{key}, @code{sub_key}, @code{type}, @code{value}로 @ref{1c6c,,감사 이벤트} @code{winreg.SetValue}를 발생시킵니다.
@end deffn

@geindex DisableReflectionKey() (winreg 모듈)
@anchor{library/winreg winreg DisableReflectionKey}@anchor{1569}
@deffn {함수} winreg.DisableReflectionKey (key)

64비트 운영 체제에서 실행 중인 32비트 프로세스에 대한 레지스트리 리플렉션(reflection)을 비활성화합니다.

`key'는 이미 열린 키이거나, 사전 정의된 @ref{4d9b,,HKEY_* 상수} 중 하나입니다.

32비트 운영 체제에서 실행하면 일반적으로 @ref{36b,,NotImplementedError} 가 발생합니다.

키가 리플렉션 목록에 없으면, 함수는 성공하지만 아무런 효과가 없습니다. 키에 대한 리플렉션을 비활성화해도 서브 키의 리플렉션에는 영향을 미치지 않습니다.

인자 @code{key}로 @ref{1c6c,,감사 이벤트} @code{winreg.DisableReflectionKey}를 발생시킵니다.
@end deffn

@geindex EnableReflectionKey() (winreg 모듈)
@anchor{library/winreg winreg EnableReflectionKey}@anchor{156a}
@deffn {함수} winreg.EnableReflectionKey (key)

지정된 비활성화 된 키에 대한 레지스트리 리플렉션(reflection)을 복원합니다.

`key'는 이미 열린 키이거나, 사전 정의된 @ref{4d9b,,HKEY_* 상수} 중 하나입니다.

32비트 운영 체제에서 실행하면 일반적으로 @ref{36b,,NotImplementedError} 가 발생합니다.

키에 대한 리플렉션을 복원해도 서브 키의 리플렉션에 영향을 미치지 않습니다.

인자 @code{key}로 @ref{1c6c,,감사 이벤트} @code{winreg.EnableReflectionKey}를 발생시킵니다.
@end deffn

@geindex QueryReflectionKey() (winreg 모듈)
@anchor{library/winreg winreg QueryReflectionKey}@anchor{156b}
@deffn {함수} winreg.QueryReflectionKey (key)

지정된 키의 리플렉션(reflection) 상태를 판단합니다.

`key'는 이미 열린 키이거나, 사전 정의된 @ref{4d9b,,HKEY_* 상수} 중 하나입니다.

리플렉션이 비활성화되었으면 @code{True}를 반환합니다.

32비트 운영 체제에서 실행하면 일반적으로 @ref{36b,,NotImplementedError} 가 발생합니다.

인자 @code{key}로 @ref{1c6c,,감사 이벤트} @code{winreg.QueryReflectionKey}를 발생시킵니다.
@end deffn

@node 상수<11>,레지스트리 핸들 객체,함수<12>,winreg — 윈도우 레지스트리 액세스
@anchor{library/winreg constants}@anchor{4da8}@anchor{library/winreg id2}@anchor{4da9}
@subsubsection 상수


The following constants are defined for use in many @code{winreg} functions.

@menu
* HKEY_* 상수:: 
* 액세스 권한:: 
* 값 형:: 

@end menu

@node HKEY_* 상수,액세스 권한,,상수<11>
@anchor{library/winreg hkey-constants}@anchor{4d9b}@anchor{library/winreg id3}@anchor{4daa}
@subsubsection HKEY_* 상수


@geindex HKEY_CLASSES_ROOT (winreg 모듈)
@anchor{library/winreg winreg HKEY_CLASSES_ROOT}@anchor{4dab}
@deffn {데이터} winreg.HKEY_CLASSES_ROOT

이 키에 종속된 레지스트리 항목은 문서의 형(또는 클래스)과 해당 형과 연관된 속성을 정의합니다. 셸과 COM 응용 프로그램은 이 키에 저장된 정보를 사용합니다.
@end deffn

@geindex HKEY_CURRENT_USER (winreg 모듈)
@anchor{library/winreg winreg HKEY_CURRENT_USER}@anchor{4dac}
@deffn {데이터} winreg.HKEY_CURRENT_USER

이 키에 종속된 레지스트리 항목은 현재 사용자의 환경 설정(preferences)을 정의합니다. 이러한 환경 설정에는 환경 변수 설정, 프로그램 그룹, 색상, 프린터, 네트워크 연결 및 응용 프로그램 환경 설정에 대한 데이터가 포함됩니다.
@end deffn

@geindex HKEY_LOCAL_MACHINE (winreg 모듈)
@anchor{library/winreg winreg HKEY_LOCAL_MACHINE}@anchor{4da2}
@deffn {데이터} winreg.HKEY_LOCAL_MACHINE

이 키에 종속된 레지스트리 항목은 버스 유형, 시스템 메모리 및 설치된 하드웨어와 소프트웨어에 대한 데이터를 포함하는 컴퓨터의 물리적 상태를 정의합니다.
@end deffn

@geindex HKEY_USERS (winreg 모듈)
@anchor{library/winreg winreg HKEY_USERS}@anchor{4da1}
@deffn {데이터} winreg.HKEY_USERS

이 키에 종속된 레지스트리 항목은 로컬 컴퓨터의 새 사용자를 위한 기본 사용자 구성과 현재 사용자의 사용자 구성을 정의합니다.
@end deffn

@geindex HKEY_PERFORMANCE_DATA (winreg 모듈)
@anchor{library/winreg winreg HKEY_PERFORMANCE_DATA}@anchor{4dad}
@deffn {데이터} winreg.HKEY_PERFORMANCE_DATA

이 키에 종속된 레지스트리 항목을 사용하면 성능 데이터에 액세스 할 수 있습니다. 데이터는 실제로 레지스트리에 저장되지 않습니다; 레지스트리 함수는 시스템이 소스에서 데이터를 수집하도록 합니다.
@end deffn

@geindex HKEY_CURRENT_CONFIG (winreg 모듈)
@anchor{library/winreg winreg HKEY_CURRENT_CONFIG}@anchor{4dae}
@deffn {데이터} winreg.HKEY_CURRENT_CONFIG

로컬 컴퓨터 시스템의 현재 하드웨어 프로필에 대한 정보가 들어 있습니다.
@end deffn

@geindex HKEY_DYN_DATA (winreg 모듈)
@anchor{library/winreg winreg HKEY_DYN_DATA}@anchor{4daf}
@deffn {데이터} winreg.HKEY_DYN_DATA

이 키는 98 이후의 윈도우 버전에서는 사용되지 않습니다.
@end deffn

@node 액세스 권한,값 형,HKEY_* 상수,상수<11>
@anchor{library/winreg access-rights}@anchor{4d9d}@anchor{library/winreg id4}@anchor{4db0}
@subsubsection 액세스 권한


자세한 내용은 레지스트리 키 보안과 액세스@footnote{https://msdn.microsoft.com/en-us/library/ms724878%28v=VS.85%29.aspx}를 참조하십시오.

@geindex KEY_ALL_ACCESS (winreg 모듈)
@anchor{library/winreg winreg KEY_ALL_ACCESS}@anchor{4db1}
@deffn {데이터} winreg.KEY_ALL_ACCESS

STANDARD_RIGHTS_REQUIRED, @ref{4db2,,KEY_QUERY_VALUE}, @ref{4da6,,KEY_SET_VALUE}, @ref{4db3,,KEY_CREATE_SUB_KEY}, @ref{4db4,,KEY_ENUMERATE_SUB_KEYS}, @ref{4db5,,KEY_NOTIFY} 및 @ref{4db6,,KEY_CREATE_LINK} 액세스 권한을 결합합니다.
@end deffn

@geindex KEY_WRITE (winreg 모듈)
@anchor{library/winreg winreg KEY_WRITE}@anchor{4d9c}
@deffn {데이터} winreg.KEY_WRITE

STANDARD_RIGHTS_WRITE, @ref{4da6,,KEY_SET_VALUE} 및 @ref{4db3,,KEY_CREATE_SUB_KEY} 액세스 권한을 결합합니다.
@end deffn

@geindex KEY_READ (winreg 모듈)
@anchor{library/winreg winreg KEY_READ}@anchor{4da4}
@deffn {데이터} winreg.KEY_READ

STANDARD_RIGHTS_READ, @ref{4db2,,KEY_QUERY_VALUE}, @ref{4db4,,KEY_ENUMERATE_SUB_KEYS} 및 @ref{4db5,,KEY_NOTIFY} 값을 결합합니다.
@end deffn

@geindex KEY_EXECUTE (winreg 모듈)
@anchor{library/winreg winreg KEY_EXECUTE}@anchor{4db7}
@deffn {데이터} winreg.KEY_EXECUTE

@ref{4da4,,KEY_READ}와 동등합니다.
@end deffn

@geindex KEY_QUERY_VALUE (winreg 모듈)
@anchor{library/winreg winreg KEY_QUERY_VALUE}@anchor{4db2}
@deffn {데이터} winreg.KEY_QUERY_VALUE

레지스트리 키의 값을 조회하는 데 필요합니다.
@end deffn

@geindex KEY_SET_VALUE (winreg 모듈)
@anchor{library/winreg winreg KEY_SET_VALUE}@anchor{4da6}
@deffn {데이터} winreg.KEY_SET_VALUE

레지스트리 값을 생성, 삭제 또는 설정하는 데 필요합니다.
@end deffn

@geindex KEY_CREATE_SUB_KEY (winreg 모듈)
@anchor{library/winreg winreg KEY_CREATE_SUB_KEY}@anchor{4db3}
@deffn {데이터} winreg.KEY_CREATE_SUB_KEY

레지스트리 키의 서브 키를 만드는 데 필요합니다.
@end deffn

@geindex KEY_ENUMERATE_SUB_KEYS (winreg 모듈)
@anchor{library/winreg winreg KEY_ENUMERATE_SUB_KEYS}@anchor{4db4}
@deffn {데이터} winreg.KEY_ENUMERATE_SUB_KEYS

레지스트리 키의 서브 키를 열거하는 데 필요합니다.
@end deffn

@geindex KEY_NOTIFY (winreg 모듈)
@anchor{library/winreg winreg KEY_NOTIFY}@anchor{4db5}
@deffn {데이터} winreg.KEY_NOTIFY

레지스트리 키나 레지스트리 키의 서브 키에 대한 변경 알림을 요청하는 데 필요합니다.
@end deffn

@geindex KEY_CREATE_LINK (winreg 모듈)
@anchor{library/winreg winreg KEY_CREATE_LINK}@anchor{4db6}
@deffn {데이터} winreg.KEY_CREATE_LINK

시스템 사용을 위해 예약되어 있습니다.
@end deffn

@menu
* 64비트 특정:: 

@end menu

@node 64비트 특정,,,액세스 권한
@anchor{library/winreg bit-access-rights}@anchor{4db8}@anchor{library/winreg bit-specific}@anchor{4db9}
@subsubsection 64비트 특정


자세한 내용은 대체 레지스트리 뷰에 액세스하기@footnote{https://msdn.microsoft.com/en-us/library/aa384129(v=VS.85).aspx}를 참조하십시오.

@geindex KEY_WOW64_64KEY (winreg 모듈)
@anchor{library/winreg winreg KEY_WOW64_64KEY}@anchor{4d9e}
@deffn {데이터} winreg.KEY_WOW64_64KEY

64비트 윈도우의 응용 프로그램이 64비트 레지스트리 뷰에서 작동해야 함을 나타냅니다. 32비트 윈도우에서, 이 상수는 무시됩니다.
@end deffn

@geindex KEY_WOW64_32KEY (winreg 모듈)
@anchor{library/winreg winreg KEY_WOW64_32KEY}@anchor{4dba}
@deffn {데이터} winreg.KEY_WOW64_32KEY

64비트 윈도우의 응용 프로그램이 32비트 레지스트리 뷰에서 작동해야 함을 나타냅니다. 32비트 윈도우에서, 이 상수는 무시됩니다.
@end deffn

@node 값 형,,액세스 권한,상수<11>
@anchor{library/winreg id5}@anchor{4dbb}@anchor{library/winreg value-types}@anchor{4da7}
@subsubsection 값 형


자세한 내용은 레지스트리 값 형@footnote{https://msdn.microsoft.com/en-us/library/ms724884%28v=VS.85%29.aspx}을 참조하십시오.

@geindex REG_BINARY (winreg 모듈)
@anchor{library/winreg winreg REG_BINARY}@anchor{4dbc}
@deffn {데이터} winreg.REG_BINARY

모든 형태의 바이너리 데이터.
@end deffn

@geindex REG_DWORD (winreg 모듈)
@anchor{library/winreg winreg REG_DWORD}@anchor{4dbd}
@deffn {데이터} winreg.REG_DWORD

32비트 숫자.
@end deffn

@geindex REG_DWORD_LITTLE_ENDIAN (winreg 모듈)
@anchor{library/winreg winreg REG_DWORD_LITTLE_ENDIAN}@anchor{4dbe}
@deffn {데이터} winreg.REG_DWORD_LITTLE_ENDIAN

리틀 엔디안 형식의 32비트 숫자. @ref{4dbd,,REG_DWORD}와 동등합니다.
@end deffn

@geindex REG_DWORD_BIG_ENDIAN (winreg 모듈)
@anchor{library/winreg winreg REG_DWORD_BIG_ENDIAN}@anchor{4dbf}
@deffn {데이터} winreg.REG_DWORD_BIG_ENDIAN

빅 엔디안 형식의 32비트 숫자.
@end deffn

@geindex REG_EXPAND_SZ (winreg 모듈)
@anchor{library/winreg winreg REG_EXPAND_SZ}@anchor{4d9f}
@deffn {데이터} winreg.REG_EXPAND_SZ

환경 변수(@code{%PATH%})에 대한 참조를 포함하는 널 종료 문자열.
@end deffn

@geindex REG_LINK (winreg 모듈)
@anchor{library/winreg winreg REG_LINK}@anchor{4dc0}
@deffn {데이터} winreg.REG_LINK

유니코드 심볼릭 링크.
@end deffn

@geindex REG_MULTI_SZ (winreg 모듈)
@anchor{library/winreg winreg REG_MULTI_SZ}@anchor{1dc0}
@deffn {데이터} winreg.REG_MULTI_SZ

두 개의 널 문자로 끝나는 널 종료 문자열의 시퀀스. (파이썬은 이 종료를 자동으로 처리합니다.)
@end deffn

@geindex REG_NONE (winreg 모듈)
@anchor{library/winreg winreg REG_NONE}@anchor{4dc1}
@deffn {데이터} winreg.REG_NONE

정의된 값 형이 없습니다.
@end deffn

@geindex REG_QWORD (winreg 모듈)
@anchor{library/winreg winreg REG_QWORD}@anchor{efe}
@deffn {데이터} winreg.REG_QWORD

64비트 숫자.


Added in version 3.6.

@end deffn

@geindex REG_QWORD_LITTLE_ENDIAN (winreg 모듈)
@anchor{library/winreg winreg REG_QWORD_LITTLE_ENDIAN}@anchor{4dc2}
@deffn {데이터} winreg.REG_QWORD_LITTLE_ENDIAN

리틀 엔디안 형식의 64비트 숫자. @ref{efe,,REG_QWORD}와 동등합니다.


Added in version 3.6.

@end deffn

@geindex REG_RESOURCE_LIST (winreg 모듈)
@anchor{library/winreg winreg REG_RESOURCE_LIST}@anchor{4dc3}
@deffn {데이터} winreg.REG_RESOURCE_LIST

장치 드라이버 리소스 목록.
@end deffn

@geindex REG_FULL_RESOURCE_DESCRIPTOR (winreg 모듈)
@anchor{library/winreg winreg REG_FULL_RESOURCE_DESCRIPTOR}@anchor{4dc4}
@deffn {데이터} winreg.REG_FULL_RESOURCE_DESCRIPTOR

하드웨어 설정.
@end deffn

@geindex REG_RESOURCE_REQUIREMENTS_LIST (winreg 모듈)
@anchor{library/winreg winreg REG_RESOURCE_REQUIREMENTS_LIST}@anchor{4dc5}
@deffn {데이터} winreg.REG_RESOURCE_REQUIREMENTS_LIST

하드웨어 리소스 목록.
@end deffn

@geindex REG_SZ (winreg 모듈)
@anchor{library/winreg winreg REG_SZ}@anchor{4da5}
@deffn {데이터} winreg.REG_SZ

널 종료 문자열.
@end deffn

@node 레지스트리 핸들 객체,,상수<11>,winreg — 윈도우 레지스트리 액세스
@anchor{library/winreg handle-object}@anchor{4d95}@anchor{library/winreg registry-handle-objects}@anchor{4dc6}
@subsubsection 레지스트리 핸들 객체


이 객체는 윈도우 HKEY 객체를 감싸서, 객체가 파괴될 때 자동으로 닫습니다. 정리를 보장하기 위해, 객체의 @ref{4d9a,,Close()} 메서드나 @ref{4d99,,CloseKey()} 함수를 호출할 수 있습니다.

이 모듈의 모든 레지스트리 함수는 이러한 객체 중 하나를 반환합니다.

핸들 객체를 받아들이는 이 모듈의 모든 레지스트리 함수는 정수도 받아들이지만, 핸들 객체의 사용을 권장합니다.

핸들 객체는 @ref{14da,,__bool__()}에 대한 의미를 제공합니다 – 그래서

@example
if handle:
    print("Yes")
@end example

는 핸들이 현재 유효하면 (닫혔거나 분리되지(detached) 않았으면) @code{Yes}를 인쇄합니다.

핸들 객체는 정수로 변환될 수 있으며 (예를 들어, 내장 @ref{19b,,int()} 함수 사용해서), 이 경우 하부 윈도우 핸들값이 반환됩니다. @ref{47ab,,Detach()} 메서드를 사용하여 정수 핸들을 반환하고 핸들 객체에서 윈도우 핸들을 분리할 수도 있습니다.

@geindex Close() (winreg.PyHKEY 메서드)
@anchor{library/winreg winreg PyHKEY Close}@anchor{4d9a}
@deffn {메서드} PyHKEY.Close ()

하부 윈도우 핸들을 닫습니다.

핸들이 이미 닫혀 있으면, 에러가 발생하지 않습니다.
@end deffn

@geindex Detach() (winreg.PyHKEY 메서드)
@anchor{library/winreg winreg PyHKEY Detach}@anchor{47ab}
@deffn {메서드} PyHKEY.Detach ()

핸들 객체에서 윈도우 핸들을 분리합니다.

결과는 핸들이 분리되기 전의 핸들 값을 담고 있는 정수입니다. 핸들이 이미 분리되었거나 닫혔으면 0이 반환됩니다.

이 함수를 호출한 후에는, 핸들이 효과적으로 무효가 되지만, 핸들이 닫히지는 않습니다. 하부 Win32 핸들이 핸들 객체의 수명을 넘어 존재해야 할 때 이 함수를 호출합니다.

인자 @code{key}로 @ref{1c6c,,감사 이벤트} @code{winreg.PyHKEY.Detach}를 발생시킵니다.
@end deffn

@geindex __enter__() (winreg.PyHKEY 메서드)
@geindex __exit__() (winreg.PyHKEY 메서드)
@anchor{library/winreg winreg PyHKEY __enter__}@anchor{4dc7}
@deffn {메서드} PyHKEY.__enter__ ()
@anchor{library/winreg winreg PyHKEY __exit__}@anchor{4dc8}
@deffnx {메서드} PyHKEY.__exit__ (*exc_info)

HKEY 객체는 @ref{7e3,,__enter__()}와 @ref{1505,,__exit__()}를 구현하므로 @ref{186,,with} 문의 컨텍스트 프로토콜을 지원합니다:

@example
with OpenKey(HKEY_LOCAL_MACHINE, "foo") as key:
    ...  # key로 작업합니다
@end example

는 제어가 @ref{186,,with} 블록을 벗어날 때 `key'를 자동으로 닫습니다.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node winsound — 윈도우용 소리 재생 인터페이스,,winreg — 윈도우 레지스트리 액세스,MS 윈도우 특정 서비스
@anchor{library/winsound doc}@anchor{4dc9}@anchor{library/winsound module-winsound}@anchor{11d}@anchor{library/winsound translation-repo}@anchor{4dca}@anchor{library/winsound winsound-sound-playing-interface-for-windows}@anchor{4dcb}
@subsection @code{winsound} — 윈도우용 소리 재생 인터페이스


@geindex module; winsound


__________________________________________________________________


The @code{winsound} module provides access to the basic sound-playing machinery
provided by Windows platforms.  It includes functions and several constants.

@ref{213c,,가용성}: Windows.

@geindex Beep() (winsound 모듈)
@anchor{library/winsound winsound Beep}@anchor{f00}
@deffn {함수} winsound.Beep (frequency, duration)

PC 스피커로 신호음을 울립니다. `frequency' 매개 변수는 소리의 주파수를 헤르츠 단위로 지정하며 37에서 32,767 범위에 있어야 합니다. `duration' 매개 변수는 소리의 지속 시간을 밀리 초로 지정합니다. 시스템이 스피커에서 신호음을 울리지 못하면, @ref{244,,RuntimeError}가 발생합니다.
@end deffn

@geindex PlaySound() (winsound 모듈)
@anchor{library/winsound winsound PlaySound}@anchor{f02}
@deffn {함수} winsound.PlaySound (sound, flags)

플랫폼 API에서 하부 @code{PlaySound()} 함수를 호출합니다. `sound' 매개 변수는 파일명, 시스템 소리 별칭, @ref{193,,바이트열류 객체}의 오디오 데이터 또는 @code{None} 일 수 있습니다. 해석은 `flags'의 값에 따라 달라지는데, 아래에 설명된 상수의 비트별 OR 결합이 될 수 있습니다. `sound' 매개 변수가 @code{None}이면, 현재 재생 중인 파형 소리가 중지됩니다. 시스템이 에러를 표시하면 @ref{244,,RuntimeError}가 발생합니다.
@end deffn

@geindex MessageBeep() (winsound 모듈)
@anchor{library/winsound winsound MessageBeep}@anchor{f01}
@deffn {함수} winsound.MessageBeep (type=MB_OK)

플랫폼 API에서 하부 @code{MessageBeep()} 함수를 호출합니다. 레지스트리에 지정된 소리를 재생합니다. `type' 인자는 재생할 소리를 지정합니다; 가능한 값은 아래에 설명된 @code{-1}, @code{MB_ICONASTERISK}, @code{MB_ICONEXCLAMATION}, @code{MB_ICONHAND}, @code{MB_ICONQUESTION} 및 @code{MB_OK}입니다. @code{-1} 값은 “간단한 신호음”을 생성합니다; 이것은 소리를 재생할 수 없을 때 최종 대체가 됩니다. 시스템이 에러를 표시하면 @ref{244,,RuntimeError}가 발생합니다.
@end deffn

@geindex SND_FILENAME (winsound 모듈)
@anchor{library/winsound winsound SND_FILENAME}@anchor{4dcc}
@deffn {데이터} winsound.SND_FILENAME

`sound' 매개 변수는 WAV 파일의 이름입니다. @ref{4dcd,,SND_ALIAS}와 함께 사용하지 마십시오.
@end deffn

@geindex SND_ALIAS (winsound 모듈)
@anchor{library/winsound winsound SND_ALIAS}@anchor{4dcd}
@deffn {데이터} winsound.SND_ALIAS

`sound' 매개 변수는 레지스트리의 소리 연결 이름입니다. 레지스트리에 그러한 이름이 없으면, @ref{4dce,,SND_NODEFAULT}도 함께 지정하지 않는 한 시스템 기본 소리를 재생합니다. 기본 소리가 등록되어 있지 않으면, @ref{244,,RuntimeError}를 일으킵니다. @ref{4dcc,,SND_FILENAME}과 함께 사용하지 마십시오.

모든 Win32 시스템은 적어도 다음을 지원합니다; 대부분 시스템은 더 많은 것을 지원합니다:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

@ref{f02,,PlaySound()} `이름'

@tab

해당 제어판 소리 이름

@item

@code{'SystemAsterisk'}

@tab

Asterisk

@item

@code{'SystemExclamation'}

@tab

Exclamation

@item

@code{'SystemExit'}

@tab

Exit Windows

@item

@code{'SystemHand'}

@tab

Critical Stop

@item

@code{'SystemQuestion'}

@tab

Question

@end multitable


예를 들면:

@example
import winsound
# 윈도우 종료 소리를 재생합니다.
winsound.PlaySound("SystemExit", winsound.SND_ALIAS)

# 아마도 (등록되어 있다면) 윈도우 기본 소리를 재생합니다 (아마도 "*" 는 등록 된 소리
# 이름이 아닐 것이기 때문입니다).
winsound.PlaySound("*", winsound.SND_ALIAS)
@end example
@end deffn

@geindex SND_LOOP (winsound 모듈)
@anchor{library/winsound winsound SND_LOOP}@anchor{4dcf}
@deffn {데이터} winsound.SND_LOOP

소리를 반복해서 재생합니다. 블로킹을 피하고자 @ref{4dd0,,SND_ASYNC} 플래그도 사용해야 합니다. @ref{4dd1,,SND_MEMORY}와 함께 사용할 수 없습니다.
@end deffn

@geindex SND_MEMORY (winsound 모듈)
@anchor{library/winsound winsound SND_MEMORY}@anchor{4dd1}
@deffn {데이터} winsound.SND_MEMORY

@ref{f02,,PlaySound()}에 대한 `sound' 매개 변수는 @ref{193,,바이트열류 객체}의 WAV 파일의 메모리 이미지입니다.

@cartouche
@quotation 참고 
이 모듈은 메모리 이미지를 비동기적으로 재생하는 것을 지원하지 않으므로, 이 플래그와 @ref{4dd0,,SND_ASYNC}의 조합은 @ref{244,,RuntimeError}를 발생시킵니다.
@end quotation
@end cartouche
@end deffn

@geindex SND_PURGE (winsound 모듈)
@anchor{library/winsound winsound SND_PURGE}@anchor{4dd2}
@deffn {데이터} winsound.SND_PURGE

지정된 소리의 모든 인스턴스 재생을 중지합니다.

@cartouche
@quotation 참고 
이 플래그는 최신 윈도우 플랫폼에서 지원되지 않습니다.
@end quotation
@end cartouche
@end deffn

@geindex SND_ASYNC (winsound 모듈)
@anchor{library/winsound winsound SND_ASYNC}@anchor{4dd0}
@deffn {데이터} winsound.SND_ASYNC

소리를 비동기적으로 재생할 수 있도록, 즉시 반환합니다.
@end deffn

@geindex SND_NODEFAULT (winsound 모듈)
@anchor{library/winsound winsound SND_NODEFAULT}@anchor{4dce}
@deffn {데이터} winsound.SND_NODEFAULT

지정된 소리를 찾을 수 없을 때, 시스템 기본 소리를 재생하지 않습니다.
@end deffn

@geindex SND_NOSTOP (winsound 모듈)
@anchor{library/winsound winsound SND_NOSTOP}@anchor{4dd3}
@deffn {데이터} winsound.SND_NOSTOP

현재 재생 중인 소리를 중단하지 않습니다.
@end deffn

@geindex SND_NOWAIT (winsound 모듈)
@anchor{library/winsound winsound SND_NOWAIT}@anchor{4dd4}
@deffn {데이터} winsound.SND_NOWAIT

사운드 드라이버가 바쁘면 즉시 반환합니다.

@cartouche
@quotation 참고 
이 플래그는 최신 윈도우 플랫폼에서 지원되지 않습니다.
@end quotation
@end cartouche
@end deffn

@geindex SND_APPLICATION (winsound 모듈)
@anchor{library/winsound winsound SND_APPLICATION}@anchor{4dd5}
@deffn {데이터} winsound.SND_APPLICATION

The `sound' parameter is an application-specific alias in the registry.
This flag can be combined with the @ref{4dcd,,SND_ALIAS} flag
to specify an application-defined sound alias.
@end deffn

@geindex SND_SENTRY (winsound 모듈)
@anchor{library/winsound winsound SND_SENTRY}@anchor{4dd6}
@deffn {데이터} winsound.SND_SENTRY

Triggers a SoundSentry event when the sound is played.


Added in version 3.14.

@end deffn

@geindex SND_SYNC (winsound 모듈)
@anchor{library/winsound winsound SND_SYNC}@anchor{4dd7}
@deffn {데이터} winsound.SND_SYNC

The sound is played synchronously.  This is the default behavior.


Added in version 3.14.

@end deffn

@geindex SND_SYSTEM (winsound 모듈)
@anchor{library/winsound winsound SND_SYSTEM}@anchor{4dd8}
@deffn {데이터} winsound.SND_SYSTEM

Assign the sound to the audio session for system notification sounds.


Added in version 3.14.

@end deffn

@geindex MB_ICONASTERISK (winsound 모듈)
@anchor{library/winsound winsound MB_ICONASTERISK}@anchor{4dd9}
@deffn {데이터} winsound.MB_ICONASTERISK

@code{SystemDefault} 소리를 재생합니다.
@end deffn

@geindex MB_ICONEXCLAMATION (winsound 모듈)
@anchor{library/winsound winsound MB_ICONEXCLAMATION}@anchor{4dda}
@deffn {데이터} winsound.MB_ICONEXCLAMATION

@code{SystemExclamation} 소리를 재생합니다.
@end deffn

@geindex MB_ICONHAND (winsound 모듈)
@anchor{library/winsound winsound MB_ICONHAND}@anchor{4ddb}
@deffn {데이터} winsound.MB_ICONHAND

@code{SystemHand} 소리를 재생합니다.
@end deffn

@geindex MB_ICONQUESTION (winsound 모듈)
@anchor{library/winsound winsound MB_ICONQUESTION}@anchor{4ddc}
@deffn {데이터} winsound.MB_ICONQUESTION

@code{SystemQuestion} 소리를 재생합니다.
@end deffn

@geindex MB_OK (winsound 모듈)
@anchor{library/winsound winsound MB_OK}@anchor{4ddd}
@deffn {데이터} winsound.MB_OK

@code{SystemDefault} 소리를 재생합니다.
@end deffn

@geindex MB_ICONERROR (winsound 모듈)
@anchor{library/winsound winsound MB_ICONERROR}@anchor{4dde}
@deffn {데이터} winsound.MB_ICONERROR

@code{SystemHand} 소리를 재생합니다.


Added in version 3.14.

@end deffn

@geindex MB_ICONINFORMATION (winsound 모듈)
@anchor{library/winsound winsound MB_ICONINFORMATION}@anchor{4ddf}
@deffn {데이터} winsound.MB_ICONINFORMATION

@code{SystemDefault} 소리를 재생합니다.


Added in version 3.14.

@end deffn

@geindex MB_ICONSTOP (winsound 모듈)
@anchor{library/winsound winsound MB_ICONSTOP}@anchor{4de0}
@deffn {데이터} winsound.MB_ICONSTOP

@code{SystemHand} 소리를 재생합니다.


Added in version 3.14.

@end deffn

@geindex MB_ICONWARNING (winsound 모듈)
@anchor{library/winsound winsound MB_ICONWARNING}@anchor{4de1}
@deffn {데이터} winsound.MB_ICONWARNING

@code{SystemExclamation} 소리를 재생합니다.


Added in version 3.14.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Unix-specific services,Modules command-line interface CLI,MS 윈도우 특정 서비스,파이썬 표준 라이브러리
@anchor{library/unix doc}@anchor{4de2}@anchor{library/unix translation-repo}@anchor{4de3}@anchor{library/unix unix}@anchor{4de4}@anchor{library/unix unix-specific-services}@anchor{4de5}
@section Unix-specific services


이 장에서 설명하는 모듈은 유닉스 운영 체제(혹은 때에 따라 일부 혹은 많은 변종)에 고유한 기능에 대한 인터페이스를 제공합니다. 다음은 개요입니다:

@menu
* shlex — 간단한 어휘 분석:: 
* posix — 가장 일반적인 POSIX 시스템 호출:: 
* pwd — 암호 데이터베이스:: 
* grp — 그룹 데이터베이스:: 
* termios — POSIX 스타일 tty 제어:: 
* tty — 터미널 제어 함수:: 
* pty — 의사 터미널 유틸리티:: 
* fcntl — fcntl과 ioctl 시스템 호출:: 
* resource — 자원 사용 정보:: 
* syslog — 유닉스 syslog 라이브러리 루틴:: 

@end menu

@node shlex — 간단한 어휘 분석,posix — 가장 일반적인 POSIX 시스템 호출,,Unix-specific services
@anchor{library/shlex doc}@anchor{4de6}@anchor{library/shlex module-shlex}@anchor{c9}@anchor{library/shlex shlex-simple-lexical-analysis}@anchor{4de7}
@subsection @code{shlex} — 간단한 어휘 분석


@geindex module; shlex

`소스 코드:' Lib/shlex.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/shlex.py}


__________________________________________________________________


@ref{ec7,,shlex} 클래스를 사용하면 유닉스 셸과 유사한 간단한 구문에 대한 어휘 분석기를 쉽게 작성할 수 있습니다. 이것은 미니 언어를 작성하거나 (예를 들어 파이썬 응용 프로그램을 위한 실행 제어 파일에서), 인용된 문자열을 구문 분석할 때 유용합니다.

The @code{shlex} module defines the following functions:

@geindex split() (shlex 모듈)
@anchor{library/shlex shlex split}@anchor{75d}
@deffn {함수} shlex.split (s, comments=False, posix=True)

셸과 비슷한 문법을 사용하여 문자열 `s'를 분할합니다. `comments'가 @ref{d2a,,False}(기본값)이면, 지정된 문자열의 주석 구문 분석이 비활성화됩니다 (@ref{ec7,,shlex} 인스턴스의 @ref{4de8,,commenters} 어트리뷰트를 빈 문자열로 설정합니다). 이 함수는 기본적으로 POSIX 모드로 작동하지만, `posix' 인자가 거짓이면 비 POSIX 모드를 사용합니다.


버전 3.12에서 변경: `s' 인자에 @code{None}을 전달하면 이제 @ref{75e,,sys.stdin}을 읽는 대신 예외를 일으킵니다.

@end deffn

@geindex join() (shlex 모듈)
@anchor{library/shlex shlex join}@anchor{c1b}
@deffn {함수} shlex.join (split_command)

리스트 `split_command'의 토큰을 이어붙이고 문자열을 반환합니다. 이 함수는 @ref{75d,,split()}의 역함수입니다.

@example
>>> from shlex import join
>>> print(join(['echo', '-n', 'Multiple words']))
echo -n 'Multiple words'
@end example

반환된 값은 주입 취약점(injection vulnerabilities)으로부터 보호하기 위해 셸 이스케이프 처리됩니다 (@ref{581,,quote()}를 참조하십시오).


Added in version 3.8.

@end deffn

@geindex quote() (shlex 모듈)
@anchor{library/shlex shlex quote}@anchor{581}
@deffn {함수} shlex.quote (s)

셸 이스케이프 된 문자열 `s'를 반환합니다. 반환된 값은 (리스트를 사용할 수 없는 경우) 셸 명령 줄에서 하나의 토큰으로 안전하게 사용할 수 있는 문자열입니다.
@anchor{library/shlex shlex-quote-warning}@anchor{3788}
@cartouche
@quotation 경고 
The @code{shlex} module is `only designed for Unix shells'.

The @code{quote()} function is not guaranteed to be correct on non-POSIX
compliant shells or shells from other operating systems such as Windows.
Executing commands quoted by this module on such shells can open up the
possibility of a command injection vulnerability.

Consider using functions that pass command arguments with lists such as
@ref{d7e,,subprocess.run()} with @code{shell=False}.
@end quotation
@end cartouche

이 관용구는 안전하지 않습니다:

@example
>>> filename = 'somefile; rm -rf ~'
>>> command = 'ls -l @{@}'.format(filename)
>>> print(command)  # executed by a shell: boom!
ls -l somefile; rm -rf ~
@end example

@ref{581,,quote()}를 사용하면 보안 허점을 메꿀 수 있습니다:

@example
>>> from shlex import quote
>>> command = 'ls -l @{@}'.format(quote(filename))
>>> print(command)
ls -l 'somefile; rm -rf ~'
>>> remote_command = 'ssh home @{@}'.format(quote(command))
>>> print(remote_command)
ssh home 'ls -l '"'"'somefile; rm -rf ~'"'"'@w{'}
@end example

인용(quoting)은 유닉스 셸과 @ref{75d,,split()}과 호환됩니다:

@example
>>> from shlex import split
>>> remote_command = split(remote_command)
>>> remote_command
['ssh', 'home', "ls -l 'somefile; rm -rf ~'"]
>>> command = split(remote_command[-1])
>>> command
['ls', '-l', 'somefile; rm -rf ~']
@end example


Added in version 3.3.

@end deffn

The @code{shlex} module defines the following class:

@geindex shlex (shlex 클래스)
@anchor{library/shlex shlex shlex}@anchor{ec7}
@deffn {클래스} shlex.shlex (instream=None, infile=None, posix=False, punctuation_chars=False)

@ref{ec7,,shlex} 인스턴스나 서브 클래스 인스턴스는 어휘 분석기 객체입니다. 존재할 때 초기화 인자는 문자를 어디에서 읽을지를 지정합니다. @ref{206a,,read()}와 @ref{20a4,,readline()} 메서드가 있는 파일/스트림류 객체이거나 문자열이어야 합니다. 인자가 없으면 @code{sys.stdin}에서 입력을 받습니다. 두 번째 선택적 인자는 파일명 문자열이며, @ref{4de9,,infile} 어트리뷰트의 초깃값을 설정합니다. `instream' 인자가 생략되거나 @code{sys.stdin}과 같으면, 이 두 번째 인자의 기본값은 “stdin”입니다. `posix' 인자는 작동 모드를 정의합니다: `posix'가 참이 아닐 때 (기본값), @code{shlex} 인스턴스는 호환 모드에서 작동합니다. POSIX 모드에서 작동할 때, @code{shlex}는 가능한 한 POSIX 셸 구문 분석 규칙에 가깝도록 시도합니다. `punctuation_chars' 인자는 동작을 실제 셸이 구문 분석하는 방식에 더 가깝게 만드는 방법을 제공합니다. 이것은 여러 종류의 값을 취할 수 있습니다: 기본값 @code{False}는 파이썬 3.5와 이전 버전에서의 동작을 유지합니다. @code{True}로 설정되면, 문자 @code{();<>|&}의 구문 분석이 변경됩니다: 이러한 문자(구두(punctuation) 문자로 간주합니다)의 모든 연속은 단일 토큰으로 반환됩니다. 비어 있지 않은 문자열로 설정하면, 해당 문자는 구두(punctuation) 문자로 사용됩니다. `punctuation_chars'에 나타나는 @ref{4dea,,wordchars} 어트리뷰트의 문자는 @code{wordchars}에서 제거됩니다. 자세한 정보는 @ref{ec8,,셸과의 호환성 향상}을 참조하십시오. `punctuation_chars'는 @code{shlex} 인스턴스 생성 시에만 설정할 수 있으며 나중에 수정할 수 없습니다.


버전 3.6에서 변경: `punctuation_chars' 매개 변수가 추가되었습니다.

@end deffn


@subsubheading 더 보기



@table @asis

@item 모듈 @ref{26,,configparser}

윈도우 @code{.ini} 파일과 유사한 구성 파일 구문 분석기.
@end table


@menu
* shlex 객체:: 
* 구문 분석 규칙:: 
* 셸과의 호환성 향상:: 

@end menu

@node shlex 객체,구문 분석 규칙,,shlex — 간단한 어휘 분석
@anchor{library/shlex id1}@anchor{4deb}@anchor{library/shlex shlex-objects}@anchor{4dec}
@subsubsection shlex 객체


@ref{ec7,,shlex} 인스턴스에는 다음과 같은 메서드가 있습니다:

@geindex get_token() (shlex.shlex 메서드)
@anchor{library/shlex shlex shlex get_token}@anchor{4ded}
@deffn {메서드} shlex.get_token ()

토큰을 반환합니다. @ref{4dee,,push_token()}을 사용하여 토큰이 스택(stack) 되었으면, 스택에서 토큰을 팝(pop) 합니다. 그렇지 않으면, 입력 스트림에서 하나를 읽습니다. 읽기가 즉시 파일 끝을 만나면, @ref{4def,,eof}가 반환됩니다 (POSIX 모드가 아니면 빈 문자열 (@code{'@w{'}}), POSIX 모드이면 @code{None}).
@end deffn

@geindex push_token() (shlex.shlex 메서드)
@anchor{library/shlex shlex shlex push_token}@anchor{4dee}
@deffn {메서드} shlex.push_token (str)

인자를 토큰 스택으로 푸시(push)합니다.
@end deffn

@geindex read_token() (shlex.shlex 메서드)
@anchor{library/shlex shlex shlex read_token}@anchor{4df0}
@deffn {메서드} shlex.read_token ()

원시 토큰을 읽습니다. 푸시백 스택을 무시하고, 소스 요청(source requests)을 해석하지 않습니다. (이것은 일반적으로 유용한 진입점이 아니며, 단지 완전성을 위해 여기에서 설명합니다.)
@end deffn

@geindex sourcehook() (shlex.shlex 메서드)
@anchor{library/shlex shlex shlex sourcehook}@anchor{4df1}
@deffn {메서드} shlex.sourcehook (filename)

@ref{ec7,,shlex}가 소스 요청(아래 @ref{4df2,,source}를 참조하십시오)을 감지할 때 이 메서드에는 다음 토큰이 인자로 제공되고 파일명과 열린 파일류 객체로 구성된 튜플을 반환해야 합니다.

일반적으로, 이 메서드는 먼저 인자에서 인용(quotes)을 제거합니다. 결과가 절대 경로명이거나 유효한 이전 소스 요청이 없거나 이전 소스가 스트림(가령 @code{sys.stdin})이면 결과는 그대로 유지됩니다. 그렇지 않으면, 결과가 상대 경로명이면 소스 포함 스택에서 파일 바로 앞에 있는 파일의 이름의 디렉터리 부분을 앞에 붙입니다 (이 동작은 C 전처리기가 @code{#include "file.h"}를 처리하는 방식과 유사합니다).

조작 결과는 파일명으로 취급되고, 튜플의 첫 번째 구성 요소로 반환되며, 이것에 @ref{316,,open()}이 호출되어 두 번째 구성 요소를 산출합니다. (참고: 이것은 인스턴스 초기화의 인자 순서와 반대입니다!)

이 훅은 디렉터리 검색 경로, 파일 확장자 추가 및 기타 네임 스페이스 해킹을 구현하는 데 사용할 수 있도록 노출됩니다. 해당 ‘닫기’ 훅은 없지만, shlex 인스턴스는 소스 입력 스트림이 EOF를 반환할 때 그것의 @ref{505,,close()} 메서드를 호출합니다.

소스 스태킹을 더 명시적으로 제어하려면, @ref{4df3,,push_source()}와 @ref{4df4,,pop_source()} 메서드를 사용하십시오.
@end deffn

@geindex push_source() (shlex.shlex 메서드)
@anchor{library/shlex shlex shlex push_source}@anchor{4df3}
@deffn {메서드} shlex.push_source (newstream, newfile=None)

입력 소스 스트림을 입력 스택으로 푸시합니다. filename 인자가 지정되면 나중에 에러 메시지에 사용할 수 있습니다. 이것은 @ref{4df1,,sourcehook()} 메서드에 의해 내부적으로 사용되는 것과 같은 메서드입니다.
@end deffn

@geindex pop_source() (shlex.shlex 메서드)
@anchor{library/shlex shlex shlex pop_source}@anchor{4df4}
@deffn {메서드} shlex.pop_source ()

마지막으로 푸시 된 입력 소스를 입력 스택에서 팝 합니다. 이는 어휘 분석기가 스택 된 입력 스트림에서 EOF에 도달할 때 내부적으로 사용되는 것과 같은 메서드입니다.
@end deffn

@geindex error_leader() (shlex.shlex 메서드)
@anchor{library/shlex shlex shlex error_leader}@anchor{4df5}
@deffn {메서드} shlex.error_leader (infile=None, lineno=None)

이 메서드는 유닉스 C 컴파일러 에러 레이블 형식으로 에러 메시지 리더를 생성합니다; 형식은 @code{'"%s", line %d: '}이며, 여기서 @code{%s}는 현재 소스 파일의 이름으로 치환되고 @code{%d}는 현재 입력 줄 번호로 치환됩니다 (선택적 인자를 사용하여 이를 재정의할 수 있습니다).

This convenience is provided to encourage @code{shlex} users to generate error
messages in the standard, parseable format understood by Emacs and other Unix
tools.
@end deffn

@ref{ec7,,shlex} 서브 클래스의 인스턴스에는 어휘 분석을 제어하거나 디버깅에 사용할 수 있는 일부 공용 인스턴스 변수가 있습니다:

@geindex commenters (shlex.shlex의 속성)
@anchor{library/shlex shlex shlex commenters}@anchor{4de8}
@deffn {속성} shlex.commenters

주석을 시작하는 것으로 인식되는 문자열. 주석 시작부터 줄 끝까지의 모든 문자는 무시됩니다. 기본적으로 @code{'#'} 만 포함합니다.
@end deffn

@geindex wordchars (shlex.shlex의 속성)
@anchor{library/shlex shlex shlex wordchars}@anchor{4dea}
@deffn {속성} shlex.wordchars

다중 문자 토큰에 누적될 문자들의 문자열. 기본적으로, 모든 ASCII 영숫자와 밑줄이 포함됩니다. POSIX 모드에서는, 라틴-1 집합의 악센트 부호 문자도 포함됩니다. @ref{1db3,,punctuation_chars}가 비어 있지 않으면, 파일명 명세와 명령 줄 매개 변수에 나타날 수 있는 문자 @code{~-./*?=}도 이 어트리뷰트에 포함되며, @code{punctuation_chars}에 있는 문자는 @code{wordchars}에 있으면 제거됩니다. @ref{4df6,,whitespace_split}이 @code{True}로 설정되면, 이것은 효과가 없습니다.
@end deffn

@geindex whitespace (shlex.shlex의 속성)
@anchor{library/shlex shlex shlex whitespace}@anchor{4df7}
@deffn {속성} shlex.whitespace

공백으로 간주하여 건너뛸 문자들. 공백은 토큰의 경계를 만듭니다. 기본적으로, 스페이스, 탭, 줄 바꿈 및 캐리지 리턴이 포함됩니다.
@end deffn

@geindex escape (shlex.shlex의 속성)
@anchor{library/shlex shlex shlex escape}@anchor{4df8}
@deffn {속성} shlex.escape

이스케이프로 간주하는 문자들. POSIX 모드에서만 사용되며, 기본적으로 @code{'\'} 만 포함합니다.
@end deffn

@geindex quotes (shlex.shlex의 속성)
@anchor{library/shlex shlex shlex quotes}@anchor{4df9}
@deffn {속성} shlex.quotes

문자열 인용으로 간주하는 문자들. 같은 인용을 다시 만날 때까지 토큰이 누적됩니다 (따라서, 다른 인용 유형은 셸에서와같이 서로를 보호합니다). 기본적으로, ASCII 작은따옴표와 큰따옴표가 포함됩니다.
@end deffn

@geindex escapedquotes (shlex.shlex의 속성)
@anchor{library/shlex shlex shlex escapedquotes}@anchor{4dfa}
@deffn {속성} shlex.escapedquotes

@ref{4df8,,escape}에 정의된 이스케이프 문자를 해석하는 @ref{4df9,,quotes}의 문자들. 이것은 POSIX 모드에서만 사용되며, 기본적으로 @code{'"'} 만 포함합니다.
@end deffn

@geindex whitespace_split (shlex.shlex의 속성)
@anchor{library/shlex shlex shlex whitespace_split}@anchor{4df6}
@deffn {속성} shlex.whitespace_split

@code{True}이면, 토큰은 공백으로만 분할됩니다. 예를 들어, @ref{ec7,,shlex}로 명령 줄을 구문 분석하고 셸 인자와 유사한 방식으로 토큰을 가져오는 데 유용합니다. @ref{1db3,,punctuation_chars}와 함께 사용하면, 토큰은 그 문자들 외에도 공백으로 분할됩니다.


버전 3.8에서 변경: @ref{1db3,,punctuation_chars} 어트리뷰트가 @ref{4df6,,whitespace_split} 어트리뷰트와 호환되었습니다.

@end deffn

@geindex infile (shlex.shlex의 속성)
@anchor{library/shlex shlex shlex infile}@anchor{4de9}
@deffn {속성} shlex.infile

클래스 인스턴스화 시점에 처음 설정되거나 이후 소스 요청으로 스택 된 현재 입력 파일의 이름. 에러 메시지를 구성할 때 이를 조사하는 것이 유용할 수 있습니다.
@end deffn

@geindex instream (shlex.shlex의 속성)
@anchor{library/shlex shlex shlex instream}@anchor{4dfb}
@deffn {속성} shlex.instream

이 @ref{ec7,,shlex} 인스턴스가 문자를 읽고 있는 입력 스트림.
@end deffn

@geindex source (shlex.shlex의 속성)
@anchor{library/shlex shlex shlex source}@anchor{4df2}
@deffn {속성} shlex.source

이 어트리뷰트는 기본적으로 @code{None}입니다. 문자열을 대입하면, 해당 문자열은 여러 셸의 @code{source} 키워드와 유사한 어휘 수준 포함 요청으로 인식됩니다. 즉, 바로 다음 토큰이 파일명으로 열리고 그 스트림에서 입력을 EOF까지 취합니다, 이 시점에서 해당 스트림의 @ref{505,,close()} 메서드가 호출되고 입력 소스는 다시 원래 입력 스트림이 됩니다. 소스 요청은 임의의 수준 깊이로 스택 될 수 있습니다.
@end deffn

@geindex debug (shlex.shlex의 속성)
@anchor{library/shlex shlex shlex debug}@anchor{4dfc}
@deffn {속성} shlex.debug

이 어트리뷰트가 숫자이고 @code{1} 이상이면, @ref{ec7,,shlex} 인스턴스는 자신의 동작에 대한 자세한 진행 출력을 인쇄합니다. 이것을 사용해야 하면, 세부 사항을 배우기 위해 모듈 소스 코드를 읽을 수 있습니다.
@end deffn

@geindex lineno (shlex.shlex의 속성)
@anchor{library/shlex shlex shlex lineno}@anchor{4dfd}
@deffn {속성} shlex.lineno

소스 줄 번호 (지금까지 본 줄 넘김 개수에 1을 더한 것).
@end deffn

@geindex token (shlex.shlex의 속성)
@anchor{library/shlex shlex shlex token}@anchor{4dfe}
@deffn {속성} shlex.token

토큰 버퍼. 예외를 잡을 때 이를 조사하는 것이 유용 할 수 있습니다.
@end deffn

@geindex eof (shlex.shlex의 속성)
@anchor{library/shlex shlex shlex eof}@anchor{4def}
@deffn {속성} shlex.eof

파일 끝을 판단하는 데 사용되는 토큰. POSIX 모드가 아닐 때 빈 문자열 (@code{'@w{'}}), POSIX 모드일 때 @code{None}으로 설정됩니다.
@end deffn

@geindex punctuation_chars (shlex.shlex의 속성)
@anchor{library/shlex shlex shlex punctuation_chars}@anchor{1db3}
@deffn {속성} shlex.punctuation_chars

읽기 전용 프로퍼티. 구두 부호로 간주할 문자들. 구두 부호 문자들은 단일 토큰으로 반환됩니다. 그러나, 아무런 의미 유효성 검사도 수행되지 않음에 유의하십시오: 예를 들어 ‘>>>’는 셸에서 인식되지 않더라도 토큰으로 반환될 수 있습니다.


Added in version 3.6.

@end deffn

@node 구문 분석 규칙,셸과의 호환성 향상,shlex 객체,shlex — 간단한 어휘 분석
@anchor{library/shlex parsing-rules}@anchor{4dff}@anchor{library/shlex shlex-parsing-rules}@anchor{4e00}
@subsubsection 구문 분석 규칙


When operating in non-POSIX mode, @ref{ec7,,shlex} will try to obey the
following rules.


@itemize *

@item 
인용 문자는 단어 내에서 인식되지 않습니다 (@code{Do"Not"Separate}는 단일 단어 @code{Do"Not"Separate}로 구문 분석됩니다);

@item 
이스케이프 문자는 인식되지 않습니다;

@item 
인용으로 묶인 문자들은 인용 안에 있는 모든 문자의 리터럴 값을 유지합니다;

@item 
인용을 닫는 것은 단어를 분리합니다 (@code{"Do"Separate}는 @code{"Do"}와 @code{Separate}로 구문 분석됩니다);

@item 
@ref{4df6,,whitespace_split}가 @code{False}이면, 단어 문자, 공백 또는 인용으로 선언되지 않은 모든 문자는 단일 문자 토큰으로 반환됩니다. @code{True}이면, @ref{ec7,,shlex}는 공백으로 만 단어를 분리합니다;

@item 
EOF는 빈 문자열(@code{'@w{'}})로 알립니다;

@item 
인용된 경우에도 빈 문자열을 구문 분석할 수 없습니다.
@end itemize

When operating in POSIX mode, @ref{ec7,,shlex} will try to obey the
following parsing rules.


@itemize *

@item 
인용은 제거되고, 단어를 분리하지 않습니다 (@code{"Do"Not"Separate"}는 단일 단어 @code{DoNotSeparate}로 구문 분석됩니다);

@item 
인용되지 않은 이스케이프 문자(예를 들어 @code{'\'})는 다음에 오는 문자의 리터럴 값을 유지합니다;

@item 
@ref{4dfa,,escapedquotes}의 일부가 아닌 인용으로 묶인 문자(예를 들어 @code{"'"})는 인용 안에 있는 모든 문자의 리터럴 값을 유지합니다;

@item 
Enclosing characters in quotes which are part of
@ref{4dfa,,escapedquotes} (e.g. @code{'"'}) preserves the literal value
of all characters within the quotes, with the exception of the characters
mentioned in @ref{4df8,,escape}.  The escape characters retain their
special meaning only when followed by the quote in use, or the escape
character itself. Otherwise the escape character will be considered a
normal character.

@item 
EOF는 @ref{884,,None} 값으로 알립니다;

@item 
인용된 빈 문자열(@code{'@w{'}})이 허용됩니다.
@end itemize

@node 셸과의 호환성 향상,,구문 분석 규칙,shlex — 간단한 어휘 분석
@anchor{library/shlex improved-compatibility-with-shells}@anchor{4e01}@anchor{library/shlex improved-shell-compatibility}@anchor{ec8}
@subsubsection 셸과의 호환성 향상



Added in version 3.6.


@ref{c9,,shlex} 클래스는 @code{bash}, @code{dash} 및 @code{sh}와 같은 일반적인 유닉스 셸에서 수행하는 구문 분석과 호환됩니다. 이 호환성을 이용하려면, 생성자에서 @code{punctuation_chars} 인자를 지정하십시오. 기본값은 @code{False}이며, 3.6 이전 동작을 유지합니다. 그러나, @code{True}로 설정되면, 문자 @code{();<>|&}의 구문 분석이 변경됩니다: 이러한 문자의 연속은 단일 토큰으로 반환됩니다. 이것은 셸에 대한 전체 파서로는 부족하지만 (여러 종류의 셀이 있음을 고려할 때, 표준 라이브러리의 범위를 벗어납니다), 이것이 없을 때보다 명령 줄 처리를 더 쉽게 수행할 수 있도록 합니다. 예시하기 위해, 다음 코드 조각에서 차이점을 볼 수 있습니다:

@example
>>> import shlex
>>> text = "a && b; c && d || e; f >'abc'; (def \"ghi\")"
>>> s = shlex.shlex(text, posix=True)
>>> s.whitespace_split = True
>>> list(s)
['a', '&&', 'b;', 'c', '&&', 'd', '||', 'e;', 'f', '>abc;', '(def', 'ghi)']
>>> s = shlex.shlex(text, posix=True, punctuation_chars=True)
>>> s.whitespace_split = True
>>> list(s)
['a', '&&', 'b', ';', 'c', '&&', 'd', '||', 'e', ';', 'f', '>', 'abc', ';',
'(', 'def', 'ghi', ')']
@end example

물론, 셸에 유효하지 않은 토큰이 반환되며, 반환된 토큰에 대해 여러분 자신의 에러 검사를 구현해야 합니다.

punctuation_chars 매개 변수의 값으로 @code{True}를 전달하는 대신, 특정 문자가 포함된 문자열을 전달하면 구두 부호를 구성하는 문자를 판별하는 데 사용됩니다. 예를 들면:

@example
>>> import shlex
>>> s = shlex.shlex("a && b || c", punctuation_chars="|")
>>> list(s)
['a', '&', '&', 'b', '||', 'c']
@end example

@cartouche
@quotation 참고 
@code{punctuation_chars}가 지정되면, @ref{4dea,,wordchars} 어트리뷰트는 문자 @code{~-./*?=}로 보강됩니다. 이러한 문자는 파일 이름(와일드카드를 포함해서)과 명령 줄 인자(예를 들어 @code{--color=auto})에 나타날 수 있기 때문입니다. 그래서:

@example
>>> import shlex
>>> s = shlex.shlex('~/a && b-c --color=auto || d *.py?',
...                 punctuation_chars=True)
>>> list(s)
['~/a', '&&', 'b-c', '--color=auto', '||', 'd', '*.py?']
@end example

그러나, 가능한 한 가깝게 셸과 일치하려면, @ref{1db3,,punctuation_chars}를 사용할 때 항상 @code{posix}와 @ref{4df6,,whitespace_split}를 사용하는 것이 좋습니다, 이는 @ref{4dea,,wordchars}를 완전히 무효로 합니다.
@end quotation
@end cartouche

최상의 효과를 얻으려면, @code{punctuation_chars}를 @code{posix=True}와 함께 설정해야 합니다. (@code{posix=False}가 @ref{ec7,,shlex}의 기본값임에 유의하십시오.)

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node posix — 가장 일반적인 POSIX 시스템 호출,pwd — 암호 데이터베이스,shlex — 간단한 어휘 분석,Unix-specific services
@anchor{library/posix doc}@anchor{4e02}@anchor{library/posix module-posix}@anchor{b2}@anchor{library/posix posix-the-most-common-posix-system-calls}@anchor{4e03}@anchor{library/posix translation-repo}@anchor{4e04}
@subsection @code{posix} — 가장 일반적인 POSIX 시스템 호출


@geindex module; posix


__________________________________________________________________


이 모듈은 C 표준과 POSIX 표준(얇게 위장한 유닉스 인터페이스)에 의해 표준화된 운영 체제 기능에 대한 액세스를 제공합니다.

@ref{213c,,가용성}: Unix.

@geindex 모듈;운영 체제

`Do not import this module directly.'  Instead, import the module @ref{a5,,os},
which provides a `portable' version of this interface.  On Unix, the @code{os}
module provides a superset of the @code{posix} interface.  On non-Unix operating
systems the @code{posix} module is not available, but a subset is always
available through the @code{os} interface.  Once @code{os} is imported, there is
`no' performance penalty in using it instead of @code{posix}.  In addition,
@code{os} provides some additional functionality, such as automatically calling
@ref{25b,,putenv()} when an entry in @code{os.environ} is changed.

에러는 예외로 보고됩니다; 보통 예외는 형 에러로 인한 것입니다만, 시스템 호출 때문에 보고되는 에러는 @ref{2c0,,OSError}를 발생시킵니다.

@menu
* 대용량 파일 지원:: 
* 주목할만한 모듈 내용:: 

@end menu

@node 대용량 파일 지원,주목할만한 모듈 내용,,posix — 가장 일반적인 POSIX 시스템 호출
@anchor{library/posix large-file-support}@anchor{4e05}@anchor{library/posix posix-large-files}@anchor{4e06}
@subsubsection 대용량 파일 지원


@geindex 대용량 파일
@geindex 파일;대용량 파일

여러 운영 체제(AIX 와 Solaris 포함)는 int와 long이 32비트 값인 C 프로그래밍 모델로 인한 2 GiB보다 큰 파일에 대한 지원을 제공합니다. 이것은 일반적으로 관련 크기 및 오프셋 형을 64비트 값으로 정의하여 수행됩니다. 이러한 파일을 때로 `대용량 파일 (large files)'이라고 합니다.

@code{off_t}의 크기가 long보다 크고 long long이 적어도 @code{off_t}만큼 크면 파이썬에서 대용량 파일 지원이 활성화됩니다. 이 모드를 활성화하려면 특정 컴파일러 플래그로 파이썬을 구성하고 컴파일해야 할 수도 있습니다. 예를 들어, Solaris 2.6과 2.7에서는 다음과 같은 작업이 필요합니다:

@example
CFLAGS="`getconf LFS_CFLAGS`" OPT="-g -O2 $CFLAGS" \
        ./configure
@end example

대용량 파일을 사용할 수 있는 리눅스 시스템에서, 이렇게 할 수 있습니다:

@example
CFLAGS='-D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64' OPT="-g -O2 $CFLAGS" \
        ./configure
@end example

@node 주목할만한 모듈 내용,,대용량 파일 지원,posix — 가장 일반적인 POSIX 시스템 호출
@anchor{library/posix notable-module-contents}@anchor{4e07}@anchor{library/posix posix-contents}@anchor{4e08}
@subsubsection 주목할만한 모듈 내용


In addition to many functions described in the @ref{a5,,os} module documentation,
@code{posix} defines the following data item:

@geindex environ (posix 모듈)
@anchor{library/posix posix environ}@anchor{4e09}
@deffn {데이터} posix.environ

인터프리터가 시작될 때 문자열 환경을 나타내는 딕셔너리. 키와 값은 유닉스에서는 바이트열이고 윈도우에서는 str입니다. 예를 들어, @code{environ[b'HOME']}(윈도우에서는 @code{environ['HOME']})은 홈 디렉터리의 경로명이며, C의 @code{getenv("HOME")}와 동등합니다.

이 딕셔너리를 수정해도 @ref{3040,,execv()}, @ref{31a,,popen()} 또는 @ref{1662,,system()}에 전달되는 문자열 환경에는 영향을 주지 않습니다; 환경을 변경해야 하는 경우 @code{environ}을 @ref{12fe,,execve()}로 전달하거나, @code{system()} 이나 @code{popen()}의 명령 문자열에 변수 대입과 export 문장을 추가하십시오.


버전 3.2에서 변경: 유닉스에서, 키와 값은 바이트열입니다.


@cartouche
@quotation 참고 
The @ref{a5,,os} module provides an alternate implementation of @code{environ}
which updates the environment on modification. Note also that updating
@ref{259,,os.environ} will render this dictionary obsolete. Use of the
@code{os} module version of this is recommended over direct access to the
@code{posix} module.
@end quotation
@end cartouche
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node pwd — 암호 데이터베이스,grp — 그룹 데이터베이스,posix — 가장 일반적인 POSIX 시스템 호출,Unix-specific services
@anchor{library/pwd doc}@anchor{4e0a}@anchor{library/pwd module-pwd}@anchor{b7}@anchor{library/pwd pwd-the-password-database}@anchor{4e0b}@anchor{library/pwd translation-repo}@anchor{4e0c}
@subsection @code{pwd} — 암호 데이터베이스


@geindex module; pwd


__________________________________________________________________


이 모듈은 유닉스 사용자 계정과 암호 데이터베이스에 대한 액세스를 제공합니다. 모든 유닉스 버전에서 사용할 수 있습니다.

@ref{213c,,가용성}: Unix, not WASI, not iOS.

암호 데이터베이스 항목은 @code{passwd} 구조체(아래의 어트리뷰트 필드, @code{<pwd.h>}를 보세요)의 멤버에 해당하는 어트리뷰트를 가진 튜플류 객체로 보고됩니다.:


@multitable {xxxxxxxxx} {xxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

인덱스

@tab

어트리뷰트

@tab

의미

@item

0

@tab

@code{pw_name}

@tab

로그인 이름

@item

1

@tab

@code{pw_passwd}

@tab

선택적 암호화된 암호

@item

2

@tab

@code{pw_uid}

@tab

숫자 사용자 ID

@item

3

@tab

@code{pw_gid}

@tab

숫자 그룹 ID

@item

4

@tab

@code{pw_gecos}

@tab

사용자 이름이나 주석 필드

@item

5

@tab

@code{pw_dir}

@tab

사용자 홈 디렉터리

@item

6

@tab

@code{pw_shell}

@tab

사용자 명령 인터프리터

@end multitable


uid 및 gid 항목은 정수이고, 다른 모든 항목은 문자열입니다. 요청된 항목을 찾을 수 없으면 @ref{5e5,,KeyError}가 발생합니다.

@cartouche
@quotation 참고 
전통적인 유닉스에서 필드 @code{pw_passwd}는 대개 DES 파생 알고리즘으로 암호화된 암호를 포함합니다. 그러나 대부분의 현대 유닉스는 소위 `섀도 암호' 시스템을 사용합니다. 이러한 유닉스에서 `pw_passwd' 필드는 별표 (@code{'*'}) 또는 문자 @code{'x'} 만 포함하고, 암호화된 암호는 세계(world)가 읽을 수 없는 파일 @code{/etc/shadow}에 저장됩니다. `pw_passwd' 필드에 유용한 것이 포함되어 있는지는 시스템에 따라 다릅니다.
@end quotation
@end cartouche

다음 항목을 정의합니다:

@geindex getpwuid() (pwd 모듈)
@anchor{library/pwd pwd getpwuid}@anchor{1e0e}
@deffn {함수} pwd.getpwuid (uid)

주어진 숫자 사용자 ID에 대한 암호 데이터베이스 항목을 반환합니다.
@end deffn

@geindex getpwnam() (pwd 모듈)
@anchor{library/pwd pwd getpwnam}@anchor{3778}
@deffn {함수} pwd.getpwnam (name)

주어진 사용자 이름에 대한 암호 데이터베이스 항목을 반환합니다.
@end deffn

@geindex getpwall() (pwd 모듈)
@anchor{library/pwd pwd getpwall}@anchor{4e0d}
@deffn {함수} pwd.getpwall ()

사용 가능한 모든 암호 데이터베이스 항목의 리스트를 임의의 순서로 반환합니다.
@end deffn


@subsubheading 더 보기



@table @asis

@item 모듈 @ref{6a,,grp}

그룹 데이터베이스에 대한 인터페이스, 이것과 유사합니다.
@end table


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node grp — 그룹 데이터베이스,termios — POSIX 스타일 tty 제어,pwd — 암호 데이터베이스,Unix-specific services
@anchor{library/grp doc}@anchor{4e0e}@anchor{library/grp grp-the-group-database}@anchor{4e0f}@anchor{library/grp module-grp}@anchor{6a}@anchor{library/grp translation-repo}@anchor{4e10}
@subsection @code{grp} — 그룹 데이터베이스


@geindex module; grp


__________________________________________________________________


이 모듈은 유닉스 그룹 데이터베이스에 대한 액세스를 제공합니다. 모든 유닉스 버전에서 사용할 수 있습니다.

@ref{213c,,가용성}: Unix, not WASI, not Android, not iOS.

그룹 데이터베이스 항목은 @code{group} 구조체(아래의 어트리뷰트 필드, @code{<grp.h>}를 보세요)의 멤버에 해당하는 어트리뷰트를 가진 튜플류 객체로 보고됩니다.:


@multitable {xxxxxxxxx} {xxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

인덱스

@tab

어트리뷰트

@tab

의미

@item

0

@tab

gr_name

@tab

그룹의 이름

@item

1

@tab

gr_passwd

@tab

(암호화된) 그룹 암호; 종종 비어있습니다

@item

2

@tab

gr_gid

@tab

숫자 그룹 ID

@item

3

@tab

gr_mem

@tab

모든 그룹 구성원의 사용자 이름

@end multitable


gid는 정수고, 이름과 암호는 문자열이며, 구성원 목록은 문자열 리스트입니다. (대부분 사용자는 암호 데이터베이스에 따라 속한 그룹의 구성원으로 명시적으로 나열되지 않습니다. 완전한 멤버십 정보를 얻으려면 두 데이터베이스를 모두 확인하십시오. @code{+} 나 @code{-}로 시작하는 @code{gr_name}은 YP/NIS 참조일 수 있고 @ref{3777,,getgrnam()} 이나 @ref{f21,,getgrgid()}로 액세스하지 못할 수 있습니다.)

다음 항목을 정의합니다:

@geindex getgrgid() (grp 모듈)
@anchor{library/grp grp getgrgid}@anchor{f21}
@deffn {함수} grp.getgrgid (id)

주어진 숫자 그룹 ID에 대한 그룹 데이터베이스 항목을 반환합니다. 요청된 항목을 찾을 수 없으면 @ref{5e5,,KeyError}가 발생합니다.


버전 3.10에서 변경: float나 문자열과 같은 정수가 아닌 인자에 대해 @ref{198,,TypeError}를 일으킵니다.

@end deffn

@geindex getgrnam() (grp 모듈)
@anchor{library/grp grp getgrnam}@anchor{3777}
@deffn {함수} grp.getgrnam (name)

지정된 그룹 이름에 대한 그룹 데이터베이스의 항목을 반환합니다. 요청된 항목을 찾을 수 없으면 @ref{5e5,,KeyError}가 발생합니다.
@end deffn

@geindex getgrall() (grp 모듈)
@anchor{library/grp grp getgrall}@anchor{18ea}
@deffn {함수} grp.getgrall ()

사용 가능한 모든 그룹 항목의 리스트를 임의의 순서로 반환합니다.
@end deffn


@subsubheading 더 보기



@table @asis

@item 모듈 @ref{b7,,pwd}

사용자 데이터베이스와의 인터페이스, 이것과 유사합니다.
@end table


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node termios — POSIX 스타일 tty 제어,tty — 터미널 제어 함수,grp — 그룹 데이터베이스,Unix-specific services
@anchor{library/termios doc}@anchor{4e11}@anchor{library/termios module-termios}@anchor{e7}@anchor{library/termios termios-posix-style-tty-control}@anchor{4e12}@anchor{library/termios translation-repo}@anchor{4e13}
@subsection @code{termios} — POSIX 스타일 tty 제어


@geindex module; termios

@geindex POSIX;I/O 제어
@geindex tty;I/O 제어


__________________________________________________________________


이 모듈은 tty I/O 제어를 위한 POSIX 호출에 대한 인터페이스를 제공합니다. 이 호출에 대한 자세한 설명은 @code{termios(3)@footnote{https://manpages.debian.org/termios(3)}} 유닉스 매뉴얼 페이지를 참조하십시오. 설치 중에 구성된 POSIX `termios' 스타일 tty I/O 제어를 지원하는 유닉스 버전에서만 사용할 수 있습니다.

@ref{213c,,가용성}: Unix.

이 모듈의 모든 함수는 첫 번째 인자로 파일 기술자 `fd'를 받아들입니다. @code{sys.stdin.fileno()}에 의해 반환된 것과 같은 정수 파일 기술자이거나, @code{sys.stdin} 자체와 같은 @ref{13c8,,파일 객체} 일 수 있습니다.

이 모듈은 여기에 제공된 함수로 작업하는 데 필요한 모든 상수도 정의합니다; 이것들은 C에 있는 것들과 같은 이름을 가집니다. 이 터미널 제어 인터페이스의 사용에 대한 자세한 내용은 시스템 설명서를 참조하십시오.

모듈은 다음 함수를 정의합니다:

@geindex tcgetattr() (termios 모듈)
@anchor{library/termios termios tcgetattr}@anchor{19f3}
@deffn {함수} termios.tcgetattr (fd)

Return a list containing the tty attributes for file descriptor `fd', as
follows: @code{[iflag, oflag, cflag, lflag, ispeed, ospeed, cc]} where `cc' is a
list of the tty special characters (each a string of length 1, except the
items with indices @code{VMIN} and @code{VTIME}, which are integers when
these fields are defined).  The interpretation of the flags and the speeds as
well as the indexing in the `cc' array must be done using the symbolic
constants defined in the @code{termios} module.
@end deffn

@geindex tcsetattr() (termios 모듈)
@anchor{library/termios termios tcsetattr}@anchor{1a69}
@deffn {함수} termios.tcsetattr (fd, when, attributes)

파일 기술자 `fd'에 대한 tty 어트리뷰트를 `attributes'로 설정합니다. `attributes'는 @ref{19f3,,tcgetattr()}에 의해 반환된 것과 같은 리스트입니다. `when' 인자는 언제 어트리뷰트가 변경되는지를 결정합니다:

@geindex TCSANOW (termios 모듈)
@anchor{library/termios termios TCSANOW}@anchor{4e14}
@deffn {데이터} termios.TCSANOW

어트리뷰트를 즉시 변경합니다.
@end deffn

@geindex TCSADRAIN (termios 모듈)
@anchor{library/termios termios TCSADRAIN}@anchor{4e15}
@deffn {데이터} termios.TCSADRAIN

계류 중인 모든 출력을 전송한 후에 어트리뷰트를 변경합니다.
@end deffn

@geindex TCSAFLUSH (termios 모듈)
@anchor{library/termios termios TCSAFLUSH}@anchor{4e16}
@deffn {데이터} termios.TCSAFLUSH

계류 중인 모든 출력을 전송하고 계류 중인 모든 입력을 버린 후에 어트리뷰트를 변경합니다.
@end deffn
@end deffn

@geindex tcsendbreak() (termios 모듈)
@anchor{library/termios termios tcsendbreak}@anchor{4e17}
@deffn {함수} termios.tcsendbreak (fd, duration)

파일 기술자 `fd'에 브레이크(break)를 보냅니다. 0 `duration'은 0.25–0.5 초 동안 브레이크를 보냅니다; 0이 아닌 `duration'은 시스템 종속적인 의미가 있습니다.
@end deffn

@geindex tcdrain() (termios 모듈)
@anchor{library/termios termios tcdrain}@anchor{4e18}
@deffn {함수} termios.tcdrain (fd)

파일 기술자 `fd'에 기록된 모든 출력이 전송될 때까지 기다립니다.
@end deffn

@geindex tcflush() (termios 모듈)
@anchor{library/termios termios tcflush}@anchor{4e19}
@deffn {함수} termios.tcflush (fd, queue)

파일 기술자 `fd'에 계류 중인 데이터를 버립니다. `queue' 선택기는 어떤 큐인지를 지정합니다: 입력 큐는 @code{TCIFLUSH}, 출력 큐는 @code{TCOFLUSH} 또는 두 큐 모두는 @code{TCIOFLUSH}.
@end deffn

@geindex tcflow() (termios 모듈)
@anchor{library/termios termios tcflow}@anchor{4e1a}
@deffn {함수} termios.tcflow (fd, action)

파일 기술자 `fd'에서 입력 또는 출력을 일시 중단하거나 다시 시작합니다. `action' 인자는 출력을 일시 중단하는 @code{TCOOFF}, 출력을 다시 시작하는 @code{TCOON}, 입력을 일시 중단하는 @code{TCIOFF} 또는 입력을 다시 시작하는 @code{TCION}이 될 수 있습니다.
@end deffn

@geindex tcgetwinsize() (termios 모듈)
@anchor{library/termios termios tcgetwinsize}@anchor{4e1b}
@deffn {함수} termios.tcgetwinsize (fd)

Return a tuple @code{(ws_row, ws_col)} containing the tty window size for file
descriptor `fd'. Requires @code{termios.TIOCGWINSZ} or
@code{termios.TIOCGSIZE}.


Added in version 3.11.

@end deffn

@geindex tcsetwinsize() (termios 모듈)
@anchor{library/termios termios tcsetwinsize}@anchor{4e1c}
@deffn {함수} termios.tcsetwinsize (fd, winsize)

Set the tty window size for file descriptor `fd' from `winsize', which is
a two-item tuple @code{(ws_row, ws_col)} like the one returned by
@ref{4e1b,,tcgetwinsize()}. Requires at least one of the pairs
(@code{termios.TIOCGWINSZ}, @code{termios.TIOCSWINSZ});
(@code{termios.TIOCGSIZE}, @code{termios.TIOCSSIZE}) to be defined.


Added in version 3.11.

@end deffn


@subsubheading 더 보기



@table @asis

@item 모듈 @ref{106,,tty}

공통 터미널 제어 연산을 위한 편리 함수.
@end table


@menu
* 예제: 예제<31>. 

@end menu

@node 예제<31>,,,termios — POSIX 스타일 tty 제어
@anchor{library/termios example}@anchor{4e1d}@anchor{library/termios termios-example}@anchor{4e1e}
@subsubsection 예제


이것은 에코가 꺼진 상태에서 암호를 묻는 함수입니다. 별도의 @ref{19f3,,tcgetattr()} 호출과 @ref{8f7,,try} … @ref{1b0,,finally} 문을 사용하여 이전 tty 어트리뷰트가 어떤 일이 발생하든 정확하게 복원되도록 하는 것에 유의하십시오:

@example
def getpass(prompt="Password: "):
    import termios, sys
    fd = sys.stdin.fileno()
    old = termios.tcgetattr(fd)
    new = termios.tcgetattr(fd)
    new[3] = new[3] & ~termios.ECHO          # lflags
    try:
        termios.tcsetattr(fd, termios.TCSADRAIN, new)
        passwd = input(prompt)
    finally:
        termios.tcsetattr(fd, termios.TCSADRAIN, old)
    return passwd
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node tty — 터미널 제어 함수,pty — 의사 터미널 유틸리티,termios — POSIX 스타일 tty 제어,Unix-specific services
@anchor{library/tty doc}@anchor{4e1f}@anchor{library/tty module-tty}@anchor{106}@anchor{library/tty translation-repo}@anchor{4e20}@anchor{library/tty tty-terminal-control-functions}@anchor{4e21}
@subsection @code{tty} — 터미널 제어 함수


@geindex module; tty

`소스 코드:' Lib/tty.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/tty.py}


__________________________________________________________________


The @code{tty} module defines functions for putting the tty into cbreak and raw
modes.

@ref{213c,,가용성}: Unix.

@ref{e7,,termios} 모듈이 필요하기 때문에 유닉스에서만 작동합니다.

The @code{tty} module defines the following functions:

@geindex cfmakeraw() (tty 모듈)
@anchor{library/tty tty cfmakeraw}@anchor{1a42}
@deffn {함수} tty.cfmakeraw (mode)

Convert the tty attribute list `mode', which is a list like the one returned
by @ref{19f3,,termios.tcgetattr()}, to that of a tty in raw mode.


Added in version 3.12.

@end deffn

@geindex cfmakecbreak() (tty 모듈)
@anchor{library/tty tty cfmakecbreak}@anchor{19f6}
@deffn {함수} tty.cfmakecbreak (mode)

Convert the tty attribute list `mode', which is a list like the one returned
by @ref{19f3,,termios.tcgetattr()}, to that of a tty in cbreak mode.

This clears the @code{ECHO} and @code{ICANON} local mode flags in `mode' as well
as setting the minimum input to 1 byte with no delay.


Added in version 3.12.



버전 3.12.2에서 변경: The @code{ICRNL} flag is no longer cleared. This matches Linux and macOS
@code{stty cbreak} behavior and what @ref{19f5,,setcbreak()} historically did.

@end deffn

@geindex setraw() (tty 모듈)
@anchor{library/tty tty setraw}@anchor{1a41}
@deffn {함수} tty.setraw (fd, when=termios.TCSAFLUSH)

파일 기술자 `fd'의 모드를 raw로 변경합니다. `when'이 생략되면, 기본값은 @ref{4e16,,termios.TCSAFLUSH}이며 @ref{1a69,,termios.tcsetattr()}로 전달됩니다. `fd'를 raw 모드로 설정하기 전에 @ref{19f3,,termios.tcgetattr()}의 반환값을 보관합니다; 이 값을 반환합니다.


버전 3.12에서 변경: The return value is now the original tty attributes, instead of @code{None}.

@end deffn

@geindex setcbreak() (tty 모듈)
@anchor{library/tty tty setcbreak}@anchor{19f5}
@deffn {함수} tty.setcbreak (fd, when=termios.TCSAFLUSH)

파일 기술자 `fd'의 모드를 cbreak로 변경합니다. `when'이 생략되면, 기본값은 @ref{4e16,,termios.TCSAFLUSH}이며 @ref{1a69,,termios.tcsetattr()}로 전달됩니다. `fd'를 cbreak 모드로 설정하기 전에 @ref{19f3,,termios.tcgetattr()}의 반환값을 보관합니다; 이 값을 반환합니다.

This clears the @code{ECHO} and @code{ICANON} local mode flags as well as setting
the minimum input to 1 byte with no delay.


버전 3.12에서 변경: The return value is now the original tty attributes, instead of @code{None}.



버전 3.12.2에서 변경: The @code{ICRNL} flag is no longer cleared. This restores the behavior
of Python 3.11 and earlier as well as matching what Linux, macOS, & BSDs
describe in their @code{stty(1)} man pages regarding cbreak mode.

@end deffn


@subsubheading 더 보기



@table @asis

@item 모듈 @ref{e7,,termios}

저수준 터미널 제어 인터페이스.
@end table


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node pty — 의사 터미널 유틸리티,fcntl — fcntl과 ioctl 시스템 호출,tty — 터미널 제어 함수,Unix-specific services
@anchor{library/pty doc}@anchor{4e22}@anchor{library/pty module-pty}@anchor{b6}@anchor{library/pty pty-pseudo-terminal-utilities}@anchor{4e23}@anchor{library/pty translation-repo}@anchor{4e24}
@subsection @code{pty} — 의사 터미널 유틸리티


@geindex module; pty

`소스 코드:' Lib/pty.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/pty.py}


__________________________________________________________________


The @code{pty} module defines operations for handling the pseudo-terminal
concept: starting another process and being able to write to and read from its
controlling terminal programmatically.

@ref{213c,,가용성}: Unix.

의사 터미널 처리는 플랫폼에 따라 매우 다릅니다. 이 코드는 주로 리눅스, FreeBSD, macOS 에서 테스트 되었습니다 (다른 POSIX 플랫폼에서도 작동하리라고 기대되지만, 충분히 테스트 되지는 않았습니다).

The @code{pty} module defines the following functions:

@geindex fork() (pty 모듈)
@anchor{library/pty pty fork}@anchor{1ac7}
@deffn {함수} pty.fork ()

포크. 자식의 제어 터미널을 의사 터미널에 연결합니다. 반환 값은 @code{(pid, fd)}입니다. 자식은 `pid' 0을 받고, `fd'는 `유효하지 않음'에 유의하십시오. 부모의 반환 값은 자식의 `pid'이고, `fd'는 자식의 제어 터미널(또한, 자식의 표준 입력과 출력)에 연결된 파일 기술자입니다.

@cartouche
@quotation 경고 
On macOS the use of this function is unsafe when mixed with using
higher-level system APIs, and that includes using @ref{111,,urllib.request}.
@end quotation
@end cartouche
@end deffn

@geindex openpty() (pty 모듈)
@anchor{library/pty pty openpty}@anchor{301}
@deffn {함수} pty.openpty ()

가능하면 @ref{3081,,os.openpty()}를 사용하고, 그렇지 않으면 일반 유닉스 시스템을 위한 에뮬레이션 코드를 사용해서 새로운 의사 터미널 쌍을 엽니다. 각각 마스터와 슬레이브인 파일 기술자 쌍 @code{(master, slave)}를 반환합니다.
@end deffn

@geindex spawn() (pty 모듈)
@anchor{library/pty pty spawn}@anchor{1181}
@deffn {함수} pty.spawn (argv[, master_read[, stdin_read]])

프로세스를 스폰하고, 그것의 제어 터미널을 현재 프로세스의 표준 입출력과 연결합니다. 이것은 종종 제어 터미널에서 읽으려고 하는 프로그램을 조절하는 데 사용됩니다. pty 뒤에 스폰된 프로세스가 결국 종료할 것으로 기대하고, 그 때 `spawn'이 반환됩니다.

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.

함수 `master_read'와 `stdin_read'는 그들이 읽어야 할 파일 기술자를 전달받고, 항상 바이트열을 반환해야 합니다. 자식 프로세스가 종료하기 전에 spawn이 강제로 반환되게 하려면 파일의 끝을 알리기 위해 빈 바이트열을 반환해야 합니다.

두 함수의 기본 구현은 함수가 호출될 때마다 최대 1024바이트를 읽고 반환합니다. `master_read' 콜백으로 의사 터미널의 마스터 파일 기술자가 전달되어 자식 프로세스의 출력을 읽으며, `stdin_read'는 파일 기술자 0을 전달받아, 부모 프로세스의 표준 입력을 읽습니다.

두 콜백 중 하나가 빈 바이트열을 반환하는 것은 파일 끝(EOF) 조건으로 해석되며, 그 이후로 해당 콜백은 호출되지 않습니다. `stdin_read'가 EOF 신호를 보내면 제어 터미널은 더는 부모 프로세스나 자식 프로세스와 통신할 수 없습니다. 자식 프로세스가 입력 없이 종료하지 않는 한, `spawn'은 영원히 반복됩니다. `master_read'가 EOF 신호를 보내면 같은 동작으로 이어집니다 (적어도 리눅스에서는).

자식 프로세스에 대한 @ref{f99,,os.waitpid()}로부터 온 종료 상태 값을 반환합니다.

@ref{b17,,os.waitstatus_to_exitcode()}를 사용하여 종료 상태를 종료 코드로 변환할 수 있습니다.

인자 @code{argv}로 @ref{1c6c,,감사 이벤트} @code{pty.spawn}을 발생시킵니다.


버전 3.4에서 변경: 이제 @ref{1181,,spawn()}은 자식 프로세스에 대한 @ref{f99,,os.waitpid()}로부터 온 상태 값을 반환합니다.

@end deffn

@menu
* 예제: 예제<32>. 

@end menu

@node 예제<32>,,,pty — 의사 터미널 유틸리티
@anchor{library/pty example}@anchor{4e25}
@subsubsection 예제


다음 프로그램은 유닉스 명령 @code{script(1)@footnote{https://manpages.debian.org/script(1)}}과 유사하게 동작하며, 의사 터미널을 사용하여 터미널 세션의 모든 입력과 출력을 “typescript”에 기록합니다.

@example
import argparse
import os
import pty
import sys
import time

parser = argparse.ArgumentParser()
parser.add_argument('-a', dest='append', action='store_true')
parser.add_argument('-p', dest='use_python', action='store_true')
parser.add_argument('filename', nargs='?', default='typescript')
options = parser.parse_args()

shell = sys.executable if options.use_python else os.environ.get('SHELL', 'sh')
filename = options.filename
mode = 'ab' if options.append else 'wb'

with open(filename, mode) as script:
    def read(fd):
        data = os.read(fd, 1024)
        script.write(data)
        return data

    print('Script started, file is', filename)
    script.write(('Script started on %s\n' % time.asctime()).encode())

    pty.spawn(shell, read)

    script.write(('Script done on %s\n' % time.asctime()).encode())
    print('Script done, file is', filename)
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node fcntl — fcntl과 ioctl 시스템 호출,resource — 자원 사용 정보,pty — 의사 터미널 유틸리티,Unix-specific services
@anchor{library/fcntl doc}@anchor{4e26}@anchor{library/fcntl fcntl-the-fcntl-and-ioctl-system-calls}@anchor{4e27}@anchor{library/fcntl module-fcntl}@anchor{5d}@anchor{library/fcntl translation-repo}@anchor{4e28}
@subsection @code{fcntl} — @code{fcntl}과 @code{ioctl} 시스템 호출


@geindex module; fcntl

@geindex UNIX;파일 제어
@geindex UNIX;I/O 제어


__________________________________________________________________


이 모듈은 파일 기술자에 대한 파일과 I/O 제어를 수행합니다. @code{fcntl()}과 @code{ioctl()} 유닉스 루틴에 대한 인터페이스입니다. 자세한 설명은 @code{fcntl(2)@footnote{https://manpages.debian.org/fcntl(2)}}과 @code{ioctl(2)@footnote{https://manpages.debian.org/ioctl(2)}} 유닉스 매뉴얼 페이지를 참조하십시오.

@ref{213c,,가용성}: Unix, not WASI.

이 모듈의 모든 함수는 첫 번째 인자로 파일 기술자 `fd'를 받아들입니다. 이것은 @code{sys.stdin.fileno()}에 의해 반환된 것과 같은 정수 파일 기술자이거나 @code{sys.stdin} 자체와 같은 @ref{504,,io.IOBase} 객체일 수 있습니다. 이 객체는 실제 파일 기술자를 반환하는 @ref{17b4,,fileno()}를 제공합니다.


버전 3.3에서 변경: 이 모듈의 연산은 @ref{1252,,IOError}를 발생시켰는데, 이제는 @ref{2c0,,OSError}를 발생시킵니다.



버전 3.8에서 변경: @code{fcntl} 모듈에는 이제 @ref{bfd,,os.memfd_create()} 파일 기술자를 봉인(seal)하기 위한 @code{F_ADD_SEALS}, @code{F_GET_SEALS} 및 @code{F_SEAL_*} 상수가 포함됩니다.



버전 3.9에서 변경: macOS에서, @code{fcntl} 모듈은 파일 기술자에서 파일의 경로를 얻는 @code{F_GETPATH} 상수를 노출합니다. 리눅스(>=3.15)에서, @code{fcntl} 모듈은 열린 파일 기술 록(open file description locks)으로 작업할 때 사용되는 @code{F_OFD_GETLK}, @code{F_OFD_SETLK} 및 @code{F_OFD_SETLKW} 상수를 노출합니다.



버전 3.10에서 변경: On Linux >= 2.6.11, the @code{fcntl} module exposes the @code{F_GETPIPE_SZ} and
@code{F_SETPIPE_SZ} constants, which allow to check and modify a pipe’s size
respectively.



버전 3.11에서 변경: On FreeBSD, the @code{fcntl} module exposes the @code{F_DUP2FD} and
@code{F_DUP2FD_CLOEXEC} constants, which allow to duplicate a file descriptor,
the latter setting @code{FD_CLOEXEC} flag in addition.



버전 3.12에서 변경: On Linux >= 4.5, the @code{fcntl} module exposes the @code{FICLONE} and
@code{FICLONERANGE} constants, which allow to share some data of one file with
another file by reflinking on some filesystems (e.g., btrfs, OCFS2, and
XFS). This behavior is commonly referred to as “copy-on-write”.



버전 3.13에서 변경: On Linux >= 2.6.32, the @code{fcntl} module exposes the
@code{F_GETOWN_EX}, @code{F_SETOWN_EX}, @code{F_OWNER_TID}, @code{F_OWNER_PID}, @code{F_OWNER_PGRP} constants, which allow to direct I/O availability signals
to a specific thread, process, or process group.
On Linux >= 4.13, the @code{fcntl} module exposes the
@code{F_GET_RW_HINT}, @code{F_SET_RW_HINT}, @code{F_GET_FILE_RW_HINT},
@code{F_SET_FILE_RW_HINT}, and @code{RWH_WRITE_LIFE_*} constants, which allow
to inform the kernel about the relative expected lifetime of writes on
a given inode or via a particular open file description.
On Linux >= 5.1 and NetBSD, the @code{fcntl} module exposes the
@code{F_SEAL_FUTURE_WRITE} constant for use with @code{F_ADD_SEALS} and
@code{F_GET_SEALS} operations.
On FreeBSD, the @code{fcntl} module exposes the @code{F_READAHEAD}, @code{F_ISUNIONSTACK}, and @code{F_KINFO} constants.
On macOS and FreeBSD, the @code{fcntl} module exposes the @code{F_RDAHEAD}
constant.
On NetBSD and AIX, the @code{fcntl} module exposes the @code{F_CLOSEM}
constant.
On NetBSD, the @code{fcntl} module exposes the @code{F_MAXFD} constant.
On macOS and NetBSD, the @code{fcntl} module exposes the @code{F_GETNOSIGPIPE}
and @code{F_SETNOSIGPIPE} constant.



버전 3.14에서 변경: On Linux >= 6.1, the @code{fcntl} module exposes the @code{F_DUPFD_QUERY}
to query a file descriptor pointing to the same file.


이 모듈은 다음 함수를 정의합니다:

@geindex fcntl() (fcntl 모듈)
@anchor{library/fcntl fcntl fcntl}@anchor{1854}
@deffn {함수} fcntl.fcntl (fd, cmd, arg=0, /)

Perform the operation `cmd' on file descriptor `fd' (file objects providing
a @ref{17b4,,fileno()} method are accepted as well).  The values used
for `cmd' are operating system dependent, and are available as constants
in the @code{fcntl} module, using the same names as used in the relevant C
header files. The argument `arg' can either be an integer value, a
@ref{193,,bytes-like object}, or a string.
The type and size of `arg' must match the type and size of
the argument of the operation as specified in the relevant C documentation.

When `arg' is an integer, the function returns the integer
return value of the C @code{fcntl()} call.

When the argument is bytes-like object, it represents a binary structure,
for example, created by @ref{147b,,struct.pack()}.
A string value is encoded to binary using the UTF-8 encoding.
The binary data is copied to a buffer whose address is
passed to the C @code{fcntl()} call.  The return value after a successful
call is the contents of the buffer, converted to a @ref{192,,bytes} object.
The length of the returned object will be the same as the length of the
`arg' argument. This is limited to 1024 bytes.

@code{fcntl()} 호출이 실패하면, @ref{2c0,,OSError}가 발생합니다.

@cartouche
@quotation 참고 
If the type or the size of `arg' does not match the type or size
of the argument of the operation (for example, if an integer is
passed when a pointer is expected, or the information returned in
the buffer by the operating system is larger than 1024 bytes),
this is most likely to result in a segmentation violation or
a more subtle data corruption.
@end quotation
@end cartouche

인자 @code{fd}, @code{cmd}, @code{arg}로 @ref{1c6c,,감사 이벤트} @code{fcntl.fcntl}을 발생시킵니다.


버전 3.14에서 변경: Add support of arbitrary @ref{193,,bytes-like objects},
not only @ref{192,,bytes}.

@end deffn

@geindex ioctl() (fcntl 모듈)
@anchor{library/fcntl fcntl ioctl}@anchor{1680}
@deffn {함수} fcntl.ioctl (fd, request, arg=0, mutate_flag=True, /)

이 함수는 인자 처리가 훨씬 더 복잡하다는 점을 제외하면, @ref{1854,,fcntl()} 함수와 같습니다.

The `request' parameter is limited to values that can fit in 32-bits
or 64-bits, depending on the platform.
Additional constants of interest for use as the `request' argument can be
found in the @ref{e7,,termios} module, under the same names as used in
the relevant C header files.

The parameter `arg' can be an integer, a @ref{193,,bytes-like object},
or a string.
The type and size of `arg' must match the type and size of
the argument of the operation as specified in the relevant C documentation.

If `arg' does not support the read-write buffer interface or
the `mutate_flag' is false, behavior is as for the @ref{1854,,fcntl()}
function.

If `arg' supports the read-write buffer interface (like @ref{344,,bytearray})
and `mutate_flag' is true (the default), then the buffer is (in effect) passed
to the underlying @code{ioctl()} system call, the latter’s return code is
passed back to the calling Python, and the buffer’s new contents reflect the
action of the @code{ioctl()}.  This is a slight simplification, because if the
supplied buffer is less than 1024 bytes long it is first copied into a static
buffer 1024 bytes long which is then passed to @code{ioctl()} and copied back
into the supplied buffer.

@code{ioctl()} 호출이 실패하면, @ref{2c0,,OSError} 예외가 발생합니다.

@cartouche
@quotation 참고 
If the type or size of `arg' does not match the type or size
of the operation’s argument (for example, if an integer is
passed when a pointer is expected, or the information returned in
the buffer by the operating system is larger than 1024 bytes,
or the size of the mutable bytes-like object is too small),
this is most likely to result in a segmentation violation or
a more subtle data corruption.
@end quotation
@end cartouche

예제:

@example
>>> import array, fcntl, struct, termios, os
>>> os.getpgrp()
13341
>>> struct.unpack('h', fcntl.ioctl(0, termios.TIOCGPGRP, "  "))[0]
13341
>>> buf = array.array('h', [0])
>>> fcntl.ioctl(0, termios.TIOCGPGRP, buf, 1)
0
>>> buf
array('h', [13341])
@end example

인자 @code{fd}, @code{request}, @code{arg}로 @ref{1c6c,,감사 이벤트} @code{fcntl.ioctl}을 발생시킵니다.


버전 3.14에서 변경: The GIL is always released during a system call.
System calls failing with EINTR are automatically retried.

@end deffn

@geindex flock() (fcntl 모듈)
@anchor{library/fcntl fcntl flock}@anchor{479b}
@deffn {함수} fcntl.flock (fd, operation, /)

파일 기술자 `fd'(@ref{17b4,,fileno()} 메서드를 제공하는 파일 객체도 허용됩니다)에 대한 잠금 연산 `operation'을 수행합니다. 자세한 내용은 유닉스 매뉴얼 @code{flock(2)@footnote{https://manpages.debian.org/flock(2)}}를 참조하십시오. (일부 시스템에서는, 이 함수가 @code{fcntl()}를 사용하여 에뮬레이트됩니다.)

@code{flock()} 호출이 실패하면, @ref{2c0,,OSError} 예외가 발생합니다.

인자 @code{fd}, @code{operation}으로 @ref{1c6c,,감사 이벤트} @code{fcntl.flock}을 발생시킵니다.
@end deffn

@geindex lockf() (fcntl 모듈)
@anchor{library/fcntl fcntl lockf}@anchor{15f1}
@deffn {함수} fcntl.lockf (fd, cmd, len=0, start=0, whence=0, /)

이것은 본질에서 @ref{1854,,fcntl()} 잠금 호출에 대한 래퍼입니다. `fd'는 잠그거나 잠금 해제할 파일의 파일 기술자이고 (@ref{17b4,,fileno()} 메서드를 제공하는 파일 객체도 허용됩니다), `cmd'는 다음 값 중 하나입니다:

@geindex LOCK_UN (fcntl 모듈)
@anchor{library/fcntl fcntl LOCK_UN}@anchor{4e29}
@deffn {데이터} fcntl.LOCK_UN

기존 잠금 해제.
@end deffn

@geindex LOCK_SH (fcntl 모듈)
@anchor{library/fcntl fcntl LOCK_SH}@anchor{4e2a}
@deffn {데이터} fcntl.LOCK_SH

공유 잠금 획득.
@end deffn

@geindex LOCK_EX (fcntl 모듈)
@anchor{library/fcntl fcntl LOCK_EX}@anchor{4e2b}
@deffn {데이터} fcntl.LOCK_EX

배타적 잠금 획득.
@end deffn

@geindex LOCK_NB (fcntl 모듈)
@anchor{library/fcntl fcntl LOCK_NB}@anchor{4e2c}
@deffn {데이터} fcntl.LOCK_NB

다른 세 개의 @code{LOCK_*} 상수와 비트별 OR 하여 요청을 비 블로킹으로 만듭니다.
@end deffn

@code{LOCK_NB}가 사용되고 잠금을 얻을 수 없을 때, @ref{2c0,,OSError}가 발생하고 `errno' 어트리뷰트가 @ref{2712,,EACCES}나 @ref{2703,,EAGAIN}으로 설정됩니다 (운영 체제에 따라 다릅니다; 이식성을 위해서 두 값을 모두 확인하십시오). 적어도 일부 시스템에서, @code{LOCK_EX}는 파일 기술자가 쓰기 위해 열린 파일을 참조할 때만 사용할 수 있습니다.

`len'은 잠글 바이트 수, `start'는 `whence'가 정의하는 기준으로 잠금이 시작되는 바이트 오프셋이며 `whence'는 @ref{1491,,io.IOBase.seek()}에서와 같은데, 구체적으로 다음과 같습니다:


@itemize *

@item 
@code{0} – 파일의 시작에 상대적 (@ref{1492,,os.SEEK_SET})

@item 
@code{1} – 현재 버퍼 위치에 상대적 (@ref{1493,,os.SEEK_CUR})

@item 
@code{2} – 파일의 끝에 상대적 (@ref{1494,,os.SEEK_END})
@end itemize

`start'의 기본값은 파일 시작 부분에서 시작한다는 의미인 0입니다. `len'의 기본값은 파일 끝까지 잠그는 것을 의미하는 0입니다. `whence'의 기본값도 0입니다.

인자 @code{fd}, @code{cmd}, @code{len}, @code{start}, @code{whence}로 @ref{1c6c,,감사 이벤트} @code{fcntl.lockf}를 발생시킵니다.
@end deffn

예제 (모두 SVR4 호환 시스템에서):

@example
import struct, fcntl, os

f = open(...)
rv = fcntl.fcntl(f, fcntl.F_SETFL, os.O_NDELAY)

lockdata = struct.pack('hhllhh', fcntl.F_WRLCK, 0, 0, 0, 0, 0)
rv = fcntl.fcntl(f, fcntl.F_SETLKW, lockdata)
@end example

첫 번째 예제에서 반환 값 변수 `rv'는 정숫값을 저장합니다; 두 번째 예제에서는 @ref{192,,bytes} 객체를 저장합니다. `lockdata' 변수에 대한 구조체 배치는 시스템 종속적입니다 — 그래서 @ref{479b,,flock()} 호출을 사용하는 것이 더 좋을 수 있습니다.


@subsubheading 더 보기



@table @asis

@item 모듈 @ref{a5,,os}

잠금 플래그 @ref{1634,,O_SHLOCK}과 @ref{1635,,O_EXLOCK}이 @ref{a5,,os} 모듈에 있으면 (BSD에만 해당합니다), @ref{f91,,os.open()} 함수는 @ref{15f1,,lockf()}와 @ref{479b,,flock()} 함수의 대안을 제공합니다.
@end table


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node resource — 자원 사용 정보,syslog — 유닉스 syslog 라이브러리 루틴,fcntl — fcntl과 ioctl 시스템 호출,Unix-specific services
@anchor{library/resource doc}@anchor{4e2d}@anchor{library/resource module-resource}@anchor{c1}@anchor{library/resource resource-resource-usage-information}@anchor{4e2e}@anchor{library/resource translation-repo}@anchor{4e2f}
@subsection @code{resource} — 자원 사용 정보


@geindex module; resource


__________________________________________________________________


이 모듈은 프로그램에서 사용하는 시스템 자원을 측정하고 제어하기 위한 기본 메커니즘을 제공합니다.

@ref{213c,,가용성}: Unix, not WASI.

기호 상수는 특정 시스템 자원을 지정하고 현재 프로세스나 그 자식들에 대한 사용 정보를 요청하는 데 사용됩니다.

시스템 호출(syscall) 실패 시 @ref{2c0,,OSError}가 발생합니다.

@geindex error
@anchor{library/resource resource error}@anchor{4e30}
@deffn {예외} resource.error

폐지된 @ref{2c0,,OSError}의 별칭.


버전 3.3에서 변경: 
@geindex Python 향상 제안; PEP 3151
PEP 3151@footnote{https://peps.python.org/pep-3151/}에 따라, 이 클래스는 @ref{2c0,,OSError}의 별칭이 되었습니다.

@end deffn

@menu
* 자원 제한: 자원 제한<2>. 
* 자원 사용량:: 

@end menu

@node 자원 제한<2>,자원 사용량,,resource — 자원 사용 정보
@anchor{library/resource resource-limits}@anchor{4e31}
@subsubsection 자원 제한


아래 설명된 @ref{17cc,,setrlimit()} 함수를 사용하여 자원 사용량을 제한 할 수 있습니다. 각 자원은 제한의 쌍으로 제어됩니다: 소프트 제한과 하드 제한. 소프트 제한은 현재 제한이며, 시간이 지남에 따라 프로세스에 의해 낮아지거나 높아질 수 있습니다. 소프트 제한은 하드 제한을 초과할 수 없습니다. 하드 제한은 소프트 제한보다 큰 값으로 낮출 수 있지만, 높일 수는 없습니다. (슈퍼 유저의 유효 UID를 갖는 프로세스만 하드 제한을 높일 수 있습니다.)

제한될 수 있는 구체적인 자원은 시스템에 따라 다릅니다. @code{getrlimit(2)@footnote{https://manpages.debian.org/getrlimit(2)}} 매뉴얼 페이지에 설명되어 있습니다. 아래에 나열된 자원은 하부 운영 체제에서 지원할 때 지원됩니다; 운영 체제에서 검사하거나 제어할 수 없는 자원은 해당 플랫폼에서는 이 모듈에서 정의되지 않습니다.

@geindex RLIM_INFINITY (resource 모듈)
@anchor{library/resource resource RLIM_INFINITY}@anchor{17cb}
@deffn {데이터} resource.RLIM_INFINITY

무제한 자원의 제한을 나타내는 데 사용되는 상수.
@end deffn

@geindex getrlimit() (resource 모듈)
@anchor{library/resource resource getrlimit}@anchor{17ca}
@deffn {함수} resource.getrlimit (resource)

`resource'의 현재 소프트와 하드 제한인 튜플 @code{(soft, hard)}를 반환합니다. 유효하지 않은 resource가 지정되면 @ref{2ec,,ValueError}가 발생하고, 하부 시스템 호출이 예기치 않게 실패하면 @ref{4e30,,error}가 발생합니다.
@end deffn

@geindex setrlimit() (resource 모듈)
@anchor{library/resource resource setrlimit}@anchor{17cc}
@deffn {함수} resource.setrlimit (resource, limits)

Sets new limits of consumption of `resource'. The `limits' argument must be a
tuple @code{(soft, hard)} of two integers describing the new limits. A value of
@ref{17cb,,RLIM_INFINITY} can be used to request a limit that is
unlimited.

Raises @ref{2ec,,ValueError} if an invalid resource is specified, if the new soft
limit exceeds the hard limit, or if a process tries to raise its hard limit.
Specifying a limit of @ref{17cb,,RLIM_INFINITY} when the hard or
system limit for that resource is not unlimited will result in a
@code{ValueError}.  A process with the effective UID of super-user can
request any valid limit value, including unlimited, but @code{ValueError}
will still be raised if the requested limit exceeds the system imposed
limit.

하부 시스템 호출이 실패하면 @code{setrlimit}도 @ref{4e30,,error}를 발생시킬 수 있습니다.

VxWorks only supports setting @ref{4e32,,RLIMIT_NOFILE}.

인자 @code{resource}, @code{limits}로 @ref{1c6c,,감사 이벤트} @code{resource.setrlimit}를 발생시킵니다.
@end deffn

@geindex prlimit() (resource 모듈)
@anchor{library/resource resource prlimit}@anchor{1189}
@deffn {함수} resource.prlimit (pid, resource[, limits])

하나의 함수에서 @ref{17cc,,setrlimit()}와 @ref{17ca,,getrlimit()}를 결합하고 임의 프로세스의 자원 제한을 가져오고 설정하도록 지원합니다. `pid'가 0이면, 호출은 현재 프로세스에 적용됩니다. `resource'와 `limits'는 `limits'가 선택적이라는 점을 제외하고 @code{setrlimit()}와 같은 의미입니다.

`limits'가 제공되지 않으면 함수는 프로세스 `pid'의 `resource' 제한을 반환합니다. `limits'가 제공되면 프로세스의 `resource' 제한이 설정되고 이전 자원 제한이 반환됩니다.

`pid'를 찾을 수 없으면 @ref{125a,,ProcessLookupError}가 발생하고 사용자가 프로세스에 대해 @code{CAP_SYS_RESOURCE}가 없으면 @ref{f3d,,PermissionError}가 발생합니다.

인자 @code{pid}, @code{resource}, @code{limits}로 @ref{1c6c,,감사 이벤트} @code{resource.prlimit}를 발생시킵니다.

@ref{213c,,가용성}: Linux >= 2.6.36 with glibc >= 2.13.


Added in version 3.4.

@end deffn

이 기호들은 @ref{17cc,,setrlimit()}와 @ref{17ca,,getrlimit()} 함수를 사용하여 소비를 제어할 수 있는 아래 설명된 자원을 정의합니다. 이 기호의 값은 정확히 C 프로그램에서 사용하는 상수입니다.

@code{getrlimit(2)@footnote{https://manpages.debian.org/getrlimit(2)}}에 관한 유닉스 매뉴얼 페이지는 사용 가능한 자원을 나열합니다. 모든 시스템이 같은 자원을 나타내는 데 같은 기호나 같은 값을 사용하는 것은 아닙니다. 이 모듈은 플랫폼 차이를 감추려고 시도하지 않습니다 — 플랫폼에서 정의되지 않은 기호는 해당 플랫폼에서 이 모듈에서 제공되지 않습니다.

@geindex RLIMIT_CORE (resource 모듈)
@anchor{library/resource resource RLIMIT_CORE}@anchor{473c}
@deffn {데이터} resource.RLIMIT_CORE

현재 프로세스가 만들 수 있는 코어(core) 파일의 최대 크기 (바이트). 전체 프로세스 이미지를 담기 위해 더 큰 코어가 필요할 때 부분 코어 파일이 생성될 수 있습니다.
@end deffn

@geindex RLIMIT_CPU (resource 모듈)
@anchor{library/resource resource RLIMIT_CPU}@anchor{4e33}
@deffn {데이터} resource.RLIMIT_CPU

The maximum amount of processor time (in seconds) that a process can use. If
this limit is exceeded, a @ref{3aa7,,SIGXCPU} signal is sent to the process. (See
the @ref{cb,,signal} module documentation for information about how to catch this
signal and do something useful, e.g. flush open files to disk.)
@end deffn

@geindex RLIMIT_FSIZE (resource 모듈)
@anchor{library/resource resource RLIMIT_FSIZE}@anchor{4e34}
@deffn {데이터} resource.RLIMIT_FSIZE

프로세스가 만들 수 있는 파일의 최대 크기.
@end deffn

@geindex RLIMIT_DATA (resource 모듈)
@anchor{library/resource resource RLIMIT_DATA}@anchor{4e35}
@deffn {데이터} resource.RLIMIT_DATA

프로세스 힙(heap)의 최대 크기 (바이트).
@end deffn

@geindex RLIMIT_STACK (resource 모듈)
@anchor{library/resource resource RLIMIT_STACK}@anchor{4e36}
@deffn {데이터} resource.RLIMIT_STACK

현재 프로세스에 대한 호출 스택의 최대 크기 (바이트). 이것은 다중 스레드 프로세스에서 메인 스레드의 스택에만 영향을 줍니다.
@end deffn

@geindex RLIMIT_RSS (resource 모듈)
@anchor{library/resource resource RLIMIT_RSS}@anchor{4e37}
@deffn {데이터} resource.RLIMIT_RSS

프로세스에서 사용할 수 있는 최대 상주 집합(resident set) 크기.
@end deffn

@geindex RLIMIT_NPROC (resource 모듈)
@anchor{library/resource resource RLIMIT_NPROC}@anchor{4e38}
@deffn {데이터} resource.RLIMIT_NPROC

현재 프로세스가 만들 수 있는 최대 프로세스 수.
@end deffn

@geindex RLIMIT_NOFILE (resource 모듈)
@anchor{library/resource resource RLIMIT_NOFILE}@anchor{4e32}
@deffn {데이터} resource.RLIMIT_NOFILE

현재 프로세스에 대한 열린 파일 기술자의 최대 수.
@end deffn

@geindex RLIMIT_OFILE (resource 모듈)
@anchor{library/resource resource RLIMIT_OFILE}@anchor{4e39}
@deffn {데이터} resource.RLIMIT_OFILE

@ref{4e32,,RLIMIT_NOFILE}의 BSD 이름.
@end deffn

@geindex RLIMIT_MEMLOCK (resource 모듈)
@anchor{library/resource resource RLIMIT_MEMLOCK}@anchor{4e3a}
@deffn {데이터} resource.RLIMIT_MEMLOCK

메모리에 잠겨 있을 수 있는 최대 주소 공간.
@end deffn

@geindex RLIMIT_VMEM (resource 모듈)
@anchor{library/resource resource RLIMIT_VMEM}@anchor{4e3b}
@deffn {데이터} resource.RLIMIT_VMEM

The largest area of mapped memory which the process may occupy.
Usually an alias of @ref{4e3c,,RLIMIT_AS}.

@ref{213c,,가용성}: Solaris, FreeBSD, NetBSD.
@end deffn

@geindex RLIMIT_AS (resource 모듈)
@anchor{library/resource resource RLIMIT_AS}@anchor{4e3c}
@deffn {데이터} resource.RLIMIT_AS

프로세스에서 사용할 수 있는 주소 공간의 최대 영역 (바이트).
@end deffn

@geindex RLIMIT_MSGQUEUE (resource 모듈)
@anchor{library/resource resource RLIMIT_MSGQUEUE}@anchor{118a}
@deffn {데이터} resource.RLIMIT_MSGQUEUE

POSIX 메시지 큐에 할당할 수 있는 바이트 수.

@ref{213c,,가용성}: Linux >= 2.6.8.


Added in version 3.4.

@end deffn

@geindex RLIMIT_NICE (resource 모듈)
@anchor{library/resource resource RLIMIT_NICE}@anchor{118b}
@deffn {데이터} resource.RLIMIT_NICE

프로세스의 나이스(nice) 수준의 상한 (20 - rlim_cur로 계산됩니다).

@ref{213c,,가용성}: Linux >= 2.6.12.


Added in version 3.4.

@end deffn

@geindex RLIMIT_RTPRIO (resource 모듈)
@anchor{library/resource resource RLIMIT_RTPRIO}@anchor{118c}
@deffn {데이터} resource.RLIMIT_RTPRIO

실시간 우선순위의 상한.

@ref{213c,,가용성}: Linux >= 2.6.12.


Added in version 3.4.

@end deffn

@geindex RLIMIT_RTTIME (resource 모듈)
@anchor{library/resource resource RLIMIT_RTTIME}@anchor{118d}
@deffn {데이터} resource.RLIMIT_RTTIME

프로세스가 블로킹 시스템 호출 없이 실시간 스케줄링 하에서 소비할 수 있는 CPU 시간의 시간제한 (마이크로초).

@ref{213c,,가용성}: Linux >= 2.6.25.


Added in version 3.4.

@end deffn

@geindex RLIMIT_SIGPENDING (resource 모듈)
@anchor{library/resource resource RLIMIT_SIGPENDING}@anchor{118e}
@deffn {데이터} resource.RLIMIT_SIGPENDING

프로세스가 큐에 넣을 수 있는 시그널 수입니다.

@ref{213c,,가용성}: Linux >= 2.6.8.


Added in version 3.4.

@end deffn

@geindex RLIMIT_SBSIZE (resource 모듈)
@anchor{library/resource resource RLIMIT_SBSIZE}@anchor{118f}
@deffn {데이터} resource.RLIMIT_SBSIZE

이 사용자의 소켓 버퍼 사용량의 최대 크기 (바이트). 이것은 이 사용자가 모든 시점에 보유할 수 있는 네트워크 메모리양과 mbuf들의 양을 제한합니다.

@ref{213c,,가용성}: FreeBSD, NetBSD.


Added in version 3.4.

@end deffn

@geindex RLIMIT_SWAP (resource 모듈)
@anchor{library/resource resource RLIMIT_SWAP}@anchor{1190}
@deffn {데이터} resource.RLIMIT_SWAP

이 사용자 ID의 모든 프로세스에서 예약하거나 사용할 수 있는 스와프 공간의 최대 크기 (바이트). 이 제한은 vm.overcommit sysctl의 비트 1이 설정되었을 때만 적용됩니다. 이 sysctl에 대한 자세한 설명은 tuning(7)@footnote{https://man.freebsd.org/cgi/man.cgi?query=tuning&sektion=7}를 참조하십시오.

@ref{213c,,가용성}: FreeBSD >= 8.


Added in version 3.4.

@end deffn

@geindex RLIMIT_NPTS (resource 모듈)
@anchor{library/resource resource RLIMIT_NPTS}@anchor{1191}
@deffn {데이터} resource.RLIMIT_NPTS

이 사용자 ID로 만들어지는 최대 의사 터미널(pseudo-terminal) 수.

@ref{213c,,가용성}: FreeBSD >= 8.


Added in version 3.4.

@end deffn

@geindex RLIMIT_KQUEUES (resource 모듈)
@anchor{library/resource resource RLIMIT_KQUEUES}@anchor{1ca3}
@deffn {데이터} resource.RLIMIT_KQUEUES

이 사용자 ID로 만들 수 있는 최대 kqueue 수.

@ref{213c,,가용성}: FreeBSD >= 11.


Added in version 3.10.

@end deffn

@node 자원 사용량,,자원 제한<2>,resource — 자원 사용 정보
@anchor{library/resource resource-usage}@anchor{4e3d}
@subsubsection 자원 사용량


이 함수는 자원 사용량 정보를 조회하는 데 사용됩니다:

@geindex getrusage() (resource 모듈)
@anchor{library/resource resource getrusage}@anchor{1636}
@deffn {함수} resource.getrusage (who)

이 함수는 `who' 매개 변수에 지정된 대로 현재 프로세스나 그 자식이 소비한 자원을 설명하는 객체를 반환합니다. `who' 매개 변수는 아래에 설명된 @code{RUSAGE_*} 상수 중 하나를 사용하여 지정해야 합니다.

간단한 예:

@example
from resource import *
import time

# CPU 병목이 아닌 작업
time.sleep(3)
print(getrusage(RUSAGE_SELF))

# CPU 병목 작업
for i in range(10 ** 8):
   _ = 1 + 1
print(getrusage(RUSAGE_SELF))
@end example

The fields of the return value each describe how a particular system resource
has been used, e.g. amount of time spent running in user mode or number of times
the process was swapped out of main memory. Some values are dependent on the
clock tick interval, e.g. the amount of memory the process is using.

이전 버전과의 호환성을 위해, 반환 값은 16개 요소의 튜플로 액세스 할 수도 있습니다.

The fields @code{ru_utime} and @code{ru_stime} of the return value are
floating-point values representing the amount of time spent executing in user
mode and the amount of time spent executing in system mode, respectively. The
remaining values are integers. Consult the @code{getrusage(2)@footnote{https://manpages.debian.org/getrusage(2)}} man page for
detailed information about these values. A brief summary is presented here:


@multitable {xxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

인덱스

@tab

필드

@tab

자원

@item

@code{0}

@tab

@code{ru_utime}

@tab

사용자 모드의 시간 (float 초)

@item

@code{1}

@tab

@code{ru_stime}

@tab

시스템 모드의 시간 (float 초)

@item

@code{2}

@tab

@code{ru_maxrss}

@tab

최대 상주 집합(resident set) 크기

@item

@code{3}

@tab

@code{ru_ixrss}

@tab

공유 메모리 크기

@item

@code{4}

@tab

@code{ru_idrss}

@tab

비공유 메모리 크기

@item

@code{5}

@tab

@code{ru_isrss}

@tab

비공유 스택 크기

@item

@code{6}

@tab

@code{ru_minflt}

@tab

I/O가 필요 없는 페이지 폴트(page fault)

@item

@code{7}

@tab

@code{ru_majflt}

@tab

I/O가 필요한 페이지 폴트(page fault)

@item

@code{8}

@tab

@code{ru_nswap}

@tab

스와프(swap out) 수

@item

@code{9}

@tab

@code{ru_inblock}

@tab

블록 입력 연산(block input operations)

@item

@code{10}

@tab

@code{ru_oublock}

@tab

블록 출력 연산(block output operations)

@item

@code{11}

@tab

@code{ru_msgsnd}

@tab

보낸 메시지

@item

@code{12}

@tab

@code{ru_msgrcv}

@tab

받은 메시지

@item

@code{13}

@tab

@code{ru_nsignals}

@tab

받은 시그널

@item

@code{14}

@tab

@code{ru_nvcsw}

@tab

자발적 컨텍스트 전환(voluntary context switches)

@item

@code{15}

@tab

@code{ru_nivcsw}

@tab

비자발적 컨텍스트 전환(involuntary context switches)

@end multitable


유효하지 않은 `who' 매개 변수가 지정되면 이 함수는 @ref{2ec,,ValueError}를 발생시킵니다. 비정상적인 상황에서 @ref{4e30,,error} 예외가 발생할 수도 있습니다.
@end deffn

@geindex getpagesize() (resource 모듈)
@anchor{library/resource resource getpagesize}@anchor{4e3e}
@deffn {함수} resource.getpagesize ()

시스템 페이지의 바이트 수를 반환합니다. (하드웨어 페이지 크기와 같을 필요는 없습니다.)
@end deffn

다음 @code{RUSAGE_*} 기호는 @ref{1636,,getrusage()} 함수에 전달되어 제공할 프로세스 정보를 지정합니다.

@geindex RUSAGE_SELF (resource 모듈)
@anchor{library/resource resource RUSAGE_SELF}@anchor{4e3f}
@deffn {데이터} resource.RUSAGE_SELF

호출하는 프로세스가 소비한 자원을 요청하기 위해 @ref{1636,,getrusage()}로 전달합니다. 이는 프로세스의 모든 스레드가 사용하는 자원의 합계입니다.
@end deffn

@geindex RUSAGE_CHILDREN (resource 모듈)
@anchor{library/resource resource RUSAGE_CHILDREN}@anchor{4e40}
@deffn {데이터} resource.RUSAGE_CHILDREN

호출하는 프로세스의 종료되어 기다리고 있는 자식 프로세스에서 소비한 자원을 요청하기 위해 @ref{1636,,getrusage()}로 전달합니다.
@end deffn

@geindex RUSAGE_BOTH (resource 모듈)
@anchor{library/resource resource RUSAGE_BOTH}@anchor{4e41}
@deffn {데이터} resource.RUSAGE_BOTH

현재 프로세스와 자식 프로세스 모두에서 소비한 자원을 요청하기 위해 @ref{1636,,getrusage()}로 전달합니다. 모든 시스템에서 사용 가능한 것은 아닙니다.
@end deffn

@geindex RUSAGE_THREAD (resource 모듈)
@anchor{library/resource resource RUSAGE_THREAD}@anchor{4e42}
@deffn {데이터} resource.RUSAGE_THREAD

현재 스레드가 소비한 자원을 요청하기 위해 @ref{1636,,getrusage()}에 전달합니다. 모든 시스템에서 사용 가능한 것은 아닙니다.


Added in version 3.2.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node syslog — 유닉스 syslog 라이브러리 루틴,,resource — 자원 사용 정보,Unix-specific services
@anchor{library/syslog doc}@anchor{4e43}@anchor{library/syslog module-syslog}@anchor{e2}@anchor{library/syslog syslog-unix-syslog-library-routines}@anchor{4e44}@anchor{library/syslog translation-repo}@anchor{4e45}
@subsection @code{syslog} — 유닉스 syslog 라이브러리 루틴


@geindex module; syslog


__________________________________________________________________


이 모듈은 유닉스 @code{syslog} 라이브러리 루틴에 대한 인터페이스를 제공합니다. @code{syslog} 기능에 대한 자세한 설명은 유닉스 매뉴얼 페이지를 참조하십시오.

@ref{213c,,가용성}: Unix, not WASI, not iOS.

이 모듈은 시스템 @code{syslog} 계열의 루틴을 감쌉니다. syslog 서버와 통신할 수 있는 순수한 파이썬 라이브러리는 @ref{8d,,logging.handlers} 모듈에서 @ref{86b,,SysLogHandler}로 제공됩니다.

모듈은 다음 함수를 정의합니다:

@geindex syslog() (syslog 모듈)
@anchor{library/syslog syslog syslog}@anchor{761}
@deffn {함수} syslog.syslog (message)

@deffnx {함수} syslog.syslog (priority, message)

`message' 문자열을 시스템 로거로 보냅니다. 필요하면 끝에 줄 넘김이 추가됩니다. 각 메시지에는 `시설(facility)' 과 `수준(level)'으로 구성된 우선순위(priority)로 꼬리표가 붙습니다. 선택적 `priority' 인자(기본값은 @ref{4e46,,LOG_INFO})는 메시지 우선순위를 결정합니다. 시설이 논리합(@code{LOG_INFO | LOG_USER})을 사용하여 `priority'로 인코딩되지 않으면, @ref{75f,,openlog()} 호출에 지정된 값이 사용됩니다.

@ref{e2,,syslog()} 호출 이전에 @ref{75f,,openlog()}가 호출되지 않았으면, 인자 없이 @code{openlog()}가 호출됩니다.

인자 @code{priority}, @code{message}로 @ref{1c6c,,감사 이벤트} @code{syslog.syslog}를 발생시킵니다.


버전 3.2에서 변경: In previous versions, @ref{75f,,openlog()} would not be called automatically if
it wasn’t called prior to the call to @code{syslog()}, deferring to the syslog
implementation to call @code{openlog()}.



버전 3.12에서 변경: This function is restricted in subinterpreters.
(Only code that runs in multiple interpreters is affected and
the restriction is not relevant for most users.)
@ref{75f,,openlog()} must be called in the main interpreter before @code{syslog()} may be used
in a subinterpreter.  Otherwise it will raise @ref{244,,RuntimeError}.

@end deffn

@geindex openlog() (syslog 모듈)
@anchor{library/syslog syslog openlog}@anchor{75f}
@deffn {함수} syslog.openlog ([ident[, logoption[, facility]]])

후속 @ref{e2,,syslog()} 호출의 로깅 옵션은 @ref{75f,,openlog()}를 호출하여 설정할 수 있습니다. 로그가 현재 열려 있지 않으면 @code{syslog()}는 인자 없이 @code{openlog()}를 호출합니다.

선택적 `ident' 키워드 인자는 모든 메시지 앞에 추가되는 문자열이며, 기본값은 선행 경로 구성 요소가 제거된 @code{sys.argv[0]}입니다. 선택적 `logoption' 키워드 인자(기본값은 0)는 비트 필드입니다 – 결합할 수 있는 가능한 값은 아래를 보십시오. 선택적 `facility' 키워드 인자(기본값은 @ref{4e47,,LOG_USER})는 명시적으로 인코드 된 시설이 없는 메시지에 대한 기본 시설을 설정합니다.

인자 @code{ident}, @code{logoption}, @code{facility}로 @ref{1c6c,,감사 이벤트} @code{syslog.openlog}를 발생시킵니다.


버전 3.2에서 변경: 이전 버전에서는, 키워드 인자가 허용되지 않았고, `ident'가 필수였습니다.



버전 3.12에서 변경: This function is restricted in subinterpreters.
(Only code that runs in multiple interpreters is affected and
the restriction is not relevant for most users.)
This may only be called in the main interpreter.
It will raise @ref{244,,RuntimeError} if called in a subinterpreter.

@end deffn

@geindex closelog() (syslog 모듈)
@anchor{library/syslog syslog closelog}@anchor{760}
@deffn {함수} syslog.closelog ()

syslog 모듈값을 재설정하고 시스템 라이브러리 @code{closelog()}를 호출합니다.

이것은 모듈이 처음 임포트될 때처럼 작동하도록 합니다. 예를 들어, @ref{75f,,openlog()}는 첫 번째 @ref{e2,,syslog()} 호출에서 호출되며(@code{openlog()}가 아직 호출되지 않았다면), `ident' 와 기타 @code{openlog()} 매개 변수가 기본값으로 재설정됩니다.

인자 없이 @ref{1c6c,,감사 이벤트} @code{syslog.closelog}를 발생시킵니다.


버전 3.12에서 변경: This function is restricted in subinterpreters.
(Only code that runs in multiple interpreters is affected and
the restriction is not relevant for most users.)
This may only be called in the main interpreter.
It will raise @ref{244,,RuntimeError} if called in a subinterpreter.

@end deffn

@geindex setlogmask() (syslog 모듈)
@anchor{library/syslog syslog setlogmask}@anchor{47a1}
@deffn {함수} syslog.setlogmask (maskpri)

우선순위 마스크를 `maskpri'로 설정하고 이전 마스크값을 반환합니다. `maskpri'에 설정되지 않은 우선순위 수준으로 @ref{e2,,syslog()}를 호출하면 무시됩니다. 기본값은 모든 우선순위를 로그 하는 것입니다. 함수 @code{LOG_MASK(pri)}는 개별 우선순위 `pri'에 대한 마스크를 계산합니다. 함수 @code{LOG_UPTO(pri)}는 `pri'까지의 모든 우선순위에 대한 마스크를 계산합니다.

인자 @code{maskpri}로 @ref{1c6c,,감사 이벤트} @code{syslog.setlogmask}를 발생시킵니다.
@end deffn

모듈은 다음 상수를 정의합니다:

@geindex LOG_EMERG (syslog 모듈)
@geindex LOG_ALERT (syslog 모듈)
@geindex LOG_CRIT (syslog 모듈)
@geindex LOG_ERR (syslog 모듈)
@geindex LOG_WARNING (syslog 모듈)
@geindex LOG_NOTICE (syslog 모듈)
@geindex LOG_INFO (syslog 모듈)
@geindex LOG_DEBUG (syslog 모듈)
@anchor{library/syslog syslog LOG_EMERG}@anchor{4e48}
@deffn {데이터} syslog.LOG_EMERG
@anchor{library/syslog syslog LOG_ALERT}@anchor{4e49}
@deffnx {데이터} syslog.LOG_ALERT
@anchor{library/syslog syslog LOG_CRIT}@anchor{4e4a}
@deffnx {데이터} syslog.LOG_CRIT
@anchor{library/syslog syslog LOG_ERR}@anchor{4e4b}
@deffnx {데이터} syslog.LOG_ERR
@anchor{library/syslog syslog LOG_WARNING}@anchor{4e4c}
@deffnx {데이터} syslog.LOG_WARNING
@anchor{library/syslog syslog LOG_NOTICE}@anchor{4e4d}
@deffnx {데이터} syslog.LOG_NOTICE
@anchor{library/syslog syslog LOG_INFO}@anchor{4e46}
@deffnx {데이터} syslog.LOG_INFO
@anchor{library/syslog syslog LOG_DEBUG}@anchor{4e4e}
@deffnx {데이터} syslog.LOG_DEBUG

우선순위 수준 (높음에서 낮음 순서).
@end deffn

@geindex LOG_AUTH (syslog 모듈)
@geindex LOG_AUTHPRIV (syslog 모듈)
@geindex LOG_CRON (syslog 모듈)
@geindex LOG_DAEMON (syslog 모듈)
@geindex LOG_FTP (syslog 모듈)
@geindex LOG_INSTALL (syslog 모듈)
@geindex LOG_KERN (syslog 모듈)
@geindex LOG_LAUNCHD (syslog 모듈)
@geindex LOG_LPR (syslog 모듈)
@geindex LOG_MAIL (syslog 모듈)
@geindex LOG_NETINFO (syslog 모듈)
@geindex LOG_NEWS (syslog 모듈)
@geindex LOG_RAS (syslog 모듈)
@geindex LOG_REMOTEAUTH (syslog 모듈)
@geindex LOG_SYSLOG (syslog 모듈)
@geindex LOG_USER (syslog 모듈)
@geindex LOG_UUCP (syslog 모듈)
@geindex LOG_LOCAL0 (syslog 모듈)
@geindex LOG_LOCAL1 (syslog 모듈)
@geindex LOG_LOCAL2 (syslog 모듈)
@geindex LOG_LOCAL3 (syslog 모듈)
@geindex LOG_LOCAL4 (syslog 모듈)
@geindex LOG_LOCAL5 (syslog 모듈)
@geindex LOG_LOCAL6 (syslog 모듈)
@geindex LOG_LOCAL7 (syslog 모듈)
@anchor{library/syslog syslog LOG_AUTH}@anchor{4e4f}
@deffn {데이터} syslog.LOG_AUTH
@anchor{library/syslog syslog LOG_AUTHPRIV}@anchor{4e50}
@deffnx {데이터} syslog.LOG_AUTHPRIV
@anchor{library/syslog syslog LOG_CRON}@anchor{4e51}
@deffnx {데이터} syslog.LOG_CRON
@anchor{library/syslog syslog LOG_DAEMON}@anchor{4e52}
@deffnx {데이터} syslog.LOG_DAEMON
@anchor{library/syslog syslog LOG_FTP}@anchor{4e53}
@deffnx {데이터} syslog.LOG_FTP
@anchor{library/syslog syslog LOG_INSTALL}@anchor{4e54}
@deffnx {데이터} syslog.LOG_INSTALL
@anchor{library/syslog syslog LOG_KERN}@anchor{4e55}
@deffnx {데이터} syslog.LOG_KERN
@anchor{library/syslog syslog LOG_LAUNCHD}@anchor{4e56}
@deffnx {데이터} syslog.LOG_LAUNCHD
@anchor{library/syslog syslog LOG_LPR}@anchor{4e57}
@deffnx {데이터} syslog.LOG_LPR
@anchor{library/syslog syslog LOG_MAIL}@anchor{4e58}
@deffnx {데이터} syslog.LOG_MAIL
@anchor{library/syslog syslog LOG_NETINFO}@anchor{4e59}
@deffnx {데이터} syslog.LOG_NETINFO
@anchor{library/syslog syslog LOG_NEWS}@anchor{4e5a}
@deffnx {데이터} syslog.LOG_NEWS
@anchor{library/syslog syslog LOG_RAS}@anchor{4e5b}
@deffnx {데이터} syslog.LOG_RAS
@anchor{library/syslog syslog LOG_REMOTEAUTH}@anchor{4e5c}
@deffnx {데이터} syslog.LOG_REMOTEAUTH
@anchor{library/syslog syslog LOG_SYSLOG}@anchor{4e5d}
@deffnx {데이터} syslog.LOG_SYSLOG
@anchor{library/syslog syslog LOG_USER}@anchor{4e47}
@deffnx {데이터} syslog.LOG_USER
@anchor{library/syslog syslog LOG_UUCP}@anchor{4e5e}
@deffnx {데이터} syslog.LOG_UUCP
@anchor{library/syslog syslog LOG_LOCAL0}@anchor{4e5f}
@deffnx {데이터} syslog.LOG_LOCAL0
@anchor{library/syslog syslog LOG_LOCAL1}@anchor{4e60}
@deffnx {데이터} syslog.LOG_LOCAL1
@anchor{library/syslog syslog LOG_LOCAL2}@anchor{4e61}
@deffnx {데이터} syslog.LOG_LOCAL2
@anchor{library/syslog syslog LOG_LOCAL3}@anchor{4e62}
@deffnx {데이터} syslog.LOG_LOCAL3
@anchor{library/syslog syslog LOG_LOCAL4}@anchor{4e63}
@deffnx {데이터} syslog.LOG_LOCAL4
@anchor{library/syslog syslog LOG_LOCAL5}@anchor{4e64}
@deffnx {데이터} syslog.LOG_LOCAL5
@anchor{library/syslog syslog LOG_LOCAL6}@anchor{4e65}
@deffnx {데이터} syslog.LOG_LOCAL6
@anchor{library/syslog syslog LOG_LOCAL7}@anchor{4e66}
@deffnx {데이터} syslog.LOG_LOCAL7

시설, @ref{4e50,,LOG_AUTHPRIV}, @ref{4e53,,LOG_FTP}, @ref{4e59,,LOG_NETINFO}, @ref{4e5c,,LOG_REMOTEAUTH}, @ref{4e54,,LOG_INSTALL} 및 @ref{4e5b,,LOG_RAS}는 @code{<syslog.h>}에 정의되었을 때만 제공됩니다.


버전 3.13에서 변경: @ref{4e53,,LOG_FTP}, @ref{4e59,,LOG_NETINFO}, @ref{4e5c,,LOG_REMOTEAUTH}, @ref{4e54,,LOG_INSTALL}, @ref{4e5b,,LOG_RAS} 및 @ref{4e56,,LOG_LAUNCHD}를 추가했습니다.

@end deffn

@geindex LOG_PID (syslog 모듈)
@geindex LOG_CONS (syslog 모듈)
@geindex LOG_NDELAY (syslog 모듈)
@geindex LOG_ODELAY (syslog 모듈)
@geindex LOG_NOWAIT (syslog 모듈)
@geindex LOG_PERROR (syslog 모듈)
@anchor{library/syslog syslog LOG_PID}@anchor{4e67}
@deffn {데이터} syslog.LOG_PID
@anchor{library/syslog syslog LOG_CONS}@anchor{4e68}
@deffnx {데이터} syslog.LOG_CONS
@anchor{library/syslog syslog LOG_NDELAY}@anchor{4e69}
@deffnx {데이터} syslog.LOG_NDELAY
@anchor{library/syslog syslog LOG_ODELAY}@anchor{4e6a}
@deffnx {데이터} syslog.LOG_ODELAY
@anchor{library/syslog syslog LOG_NOWAIT}@anchor{4e6b}
@deffnx {데이터} syslog.LOG_NOWAIT
@anchor{library/syslog syslog LOG_PERROR}@anchor{4e6c}
@deffnx {데이터} syslog.LOG_PERROR

로그 옵션, @ref{4e6a,,LOG_ODELAY}, @ref{4e6b,,LOG_NOWAIT} 및 @ref{4e6c,,LOG_PERROR}는 @code{<syslog.h>}에 정의되었을 때만 제공됩니다.
@end deffn

@menu
* 예제: 예제<33>. 

@end menu

@node 예제<33>,,,syslog — 유닉스 syslog 라이브러리 루틴
@anchor{library/syslog examples}@anchor{4e6d}
@subsubsection 예제


@menu
* 간단한 예제:: 

@end menu

@node 간단한 예제,,,예제<33>
@anchor{library/syslog simple-example}@anchor{4e6e}
@subsubsection 간단한 예제


간단한 예제 집합:

@example
import syslog

syslog.syslog('Processing started')
if error:
    syslog.syslog(syslog.LOG_ERR, 'Processing started')
@end example

일부 로그 옵션 설정의 예, 이것은 로그 메시지에 프로세스 ID를 포함하며, 메일 로깅에 사용되는 대상 시설로 메시지를 기록합니다:

@example
syslog.openlog(logoption=syslog.LOG_PID, facility=syslog.LOG_MAIL)
syslog.syslog('E-mail processing initiated...')
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Modules command-line interface CLI,대체된 모듈,Unix-specific services,파이썬 표준 라이브러리
@anchor{library/cmdline doc}@anchor{4e6f}@anchor{library/cmdline library-cmdline}@anchor{4e70}@anchor{library/cmdline modules-command-line-interface-cli}@anchor{4e71}@anchor{library/cmdline translation-repo}@anchor{4e72}
@section Modules command-line interface (CLI)


The following modules have a command-line interface.


@itemize *

@item 
@ref{4c1a,,ast}

@item 
@ref{37f3,,asyncio}

@item 
@ref{f,,base64}

@item 
@ref{1d0,,calendar}

@item 
@ref{1b,,code}

@item 
@ref{4cd7,,compileall}

@item 
@ref{2b,,cProfile}: see @ref{483d,,profile}

@item 
@ref{4cee,,dis}

@item 
@ref{4595,,doctest}

@item 
@code{encodings.rot_13}

@item 
@ref{48e7,,ensurepip}

@item 
@ref{5e,,filecmp}

@item 
@ref{5f,,fileinput}

@item 
@ref{62,,ftplib}

@item 
@ref{2e81,,gzip}

@item 
@ref{1150,,http.server}

@item 
@ref{4446,,idlelib}

@item 
@ref{115a,,inspect}

@item 
@ref{23e,,json}

@item 
@ref{247,,mimetypes}

@item 
@ref{2e2,,pdb}

@item 
@ref{2d55,,pickle}

@item 
@ref{2d56,,pickletools}

@item 
@ref{326c,,platform}

@item 
@ref{b1,,poplib}

@item 
@ref{483d,,profile}

@item 
@ref{b5,,pstats}

@item 
@ref{4cce,,py_compile}

@item 
@ref{b9,,pyclbr}

@item 
@ref{ba,,pydoc}

@item 
@ref{bc,,quopri}

@item 
@ref{47f,,random}

@item 
@ref{c3,,runpy}

@item 
@ref{4aed,,site}

@item 
@ref{672,,sqlite3}

@item 
@ref{4c51,,symtable}

@item 
@ref{49b2,,sysconfig}

@item 
@ref{e3,,tabnanny}

@item 
@ref{11ca,,tarfile}

@item 
@code{this}

@item 
@ref{4861,,timeit}

@item 
@ref{4c9f,,tokenize}

@item 
@ref{487e,,trace}

@item 
@ref{108,,turtledemo}

@item 
@ref{460e,,unittest}

@item 
@ref{674,,uuid}

@item 
@ref{48f5,,venv}

@item 
@ref{3efb,,webbrowser}

@item 
@ref{490f,,zipapp}

@item 
@ref{2ef0,,zipfile}
@end itemize

See also the @ref{1da4,,Python command-line interface}.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 대체된 모듈,Removed Modules,Modules command-line interface CLI,파이썬 표준 라이브러리
@anchor{library/superseded doc}@anchor{4e73}@anchor{library/superseded superseded}@anchor{4e74}@anchor{library/superseded superseded-modules}@anchor{4e75}@anchor{library/superseded translation-repo}@anchor{4e76}
@section 대체된 모듈


이 장에서 설명하는 모듈은 대부분의 사용 사례에서 다른 모듈로 대체되었으며, 주로 하위 호환성을 유지하기 위해 유지됩니다.

Modules may appear in this chapter because they only cover a limited subset of
a problem space, and a more generally applicable solution is available elsewhere
in the standard library (for example, @ref{65,,getopt} covers the very specific
task of “mimic the C @code{getopt()} API in Python”, rather than the broader
command line option parsing and argument parsing capabilities offered by
@ref{a4,,optparse} and @ref{7,,argparse}).

Alternatively, modules may appear in this chapter because they are deprecated
outright, and awaiting removal in a future release, or they are
@ref{23d,,soft deprecated} and their use is actively discouraged in new projects.
With the removal of various obsolete modules through 
@geindex Python 향상 제안; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/}, there are
currently no modules in this latter category.

@menu
* getopt — 명령 줄 옵션용 C 스타일 구문 분석기:: 

@end menu

@node getopt — 명령 줄 옵션용 C 스타일 구문 분석기,,,대체된 모듈
@anchor{library/getopt doc}@anchor{4e77}@anchor{library/getopt getopt-c-style-parser-for-command-line-options}@anchor{4e78}@anchor{library/getopt module-getopt}@anchor{65}
@subsection @code{getopt} — 명령 줄 옵션용 C 스타일 구문 분석기


@geindex module; getopt

`소스 코드:' Lib/getopt.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/getopt.py}

@cartouche
@quotation 참고 
This module is considered feature complete. A more declarative and
extensible alternative to this API is provided in the @ref{a4,,optparse}
module. Further functional enhancements for command line parameter
processing are provided either as third party modules on PyPI,
or else as features in the @ref{7,,argparse} module.
@end quotation
@end cartouche


__________________________________________________________________


이 모듈은 스크립트가 @code{sys.argv}에 있는 명령 줄 인자를 구문 분석하는 데 도움이 됩니다. 유닉스 @code{getopt()} 함수와 같은 규칙을 지원합니다 (’@code{-}’ 와 ‘@code{--}’ 형식의 인자의 특수한 의미를 포함합니다). 선택적인 세 번째 인자를 통해 GNU 소프트웨어가 지원하는 것과 유사한 긴 옵션을 사용할 수 있습니다.

Users who are unfamiliar with the Unix @code{getopt()} function should consider
using the @ref{7,,argparse} module instead. Users who are familiar with the Unix
@code{getopt()} function, but would like to get equivalent behavior while
writing less code and getting better help and error messages should consider
using the @ref{a4,,optparse} module. See @ref{339c,,Choosing an argument parsing library} for
additional details.

이 모듈은 두 가지 함수와 예외를 제공합니다:

@geindex getopt() (getopt 모듈)
@anchor{library/getopt getopt getopt}@anchor{16c0}
@deffn {함수} getopt.getopt (args, shortopts, longopts=[])

Parses command line options and parameter list.  `args' is the argument list to
be parsed, without the leading reference to the running program. Typically, this
means @code{sys.argv[1:]}. `shortopts' is the string of option letters that the
script wants to recognize, with options that require an argument followed by a
colon (@code{':'}) and options that accept an optional argument followed by
two colons (@code{'::'}); i.e., the same format that Unix @code{getopt()} uses.

@cartouche
@quotation 참고 
GNU @code{getopt()}와는 달리, 옵션이 아닌 인자 다음에 오는 모든 인자는 옵션이 아닌 것으로 간주합니다. 이는 비 GNU 유닉스 시스템이 작동하는 방식과 비슷합니다.
@end quotation
@end cartouche

`longopts', if specified, must be a list of strings with the names of the
long options which should be supported.  The leading @code{'--'} characters
should not be included in the option name.  Long options which require an
argument should be followed by an equal sign (@code{'='}).
Long options which accept an optional argument should be followed by
an equal sign and question mark (@code{'=?'}).
To accept only long options, `shortopts' should be an
empty string.  Long options on the command line can be recognized so long as
they provide a prefix of the option name that matches exactly one of the
accepted options.  For example, if `longopts' is @code{['foo', 'frob']}, the
option @code{--fo} will match as @code{--foo}, but @code{--f} will
not match uniquely, so @ref{18eb,,GetoptError} will be raised.

반환 값은 두 요소로 구성됩니다: 첫 번째는 @code{(option, value)} 쌍의 리스트입니다; 두 번째는 옵션 리스트가 제거된 후 남겨진 프로그램 인자 리스트입니다 (이것은 `args'의 후행 슬라이스입니다). 반환된 각 옵션-값 쌍은 첫 번째 요소로 옵션을 가지며, 짧은 옵션(예를 들어, @code{'-x'})은 하이픈이, 긴 옵션(예를 들어, @code{'--long-option'})은 두 개의 하이픈이 접두사로 붙고, 두 번째 요소는 옵션 인자나 옵션에 인자가 없으면 빈 문자열입니다. 옵션은 발견된 순서와 같은 순서로 리스트에 나타나므로, 여러 번 나오는 것을 허용합니다. 긴 옵션과 짧은 옵션은 혼합될 수 있습니다.


버전 3.14에서 변경: Optional arguments are supported.

@end deffn

@geindex gnu_getopt() (getopt 모듈)
@anchor{library/getopt getopt gnu_getopt}@anchor{16bf}
@deffn {함수} getopt.gnu_getopt (args, shortopts, longopts=[])

이 함수는 기본적으로 GNU 스타일 스캔 모드가 사용된다는 점을 제외하고는 @ref{65,,getopt()}처럼 작동합니다. 이것은 옵션과 옵션이 아닌 인자가 섞일 수 있음을 뜻합니다. @code{getopt()} 함수는 옵션이 아닌 인자가 발견되자마자 옵션 처리를 중지합니다.

옵션 문자열의 첫 번째 문자가 @code{'+'} 이거나, 환경 변수 @code{POSIXLY_CORRECT}가 설정되면, 옵션이 아닌 인자를 만나자마자 옵션 처리가 중지됩니다.

If the first character of the option string is @code{'-'}, non-option arguments
that are followed by options are added to the list of option-and-value pairs
as a pair that has @code{None} as its first element and the list of non-option
arguments as its second element.
The second element of the @code{gnu_getopt()} result is a list of
program arguments after the last option.


버전 3.14에서 변경: Support for returning intermixed options and non-option arguments in order.

@end deffn

@geindex GetoptError
@anchor{library/getopt getopt GetoptError}@anchor{18eb}
@deffn {예외} getopt.GetoptError

인자 목록에 인식할 수 없는 옵션이 있거나 인자가 필요한 옵션에 아무것도 주어지지 않으면 발생합니다. 예외에 대한 인자는 에러의 원인을 나타내는 문자열입니다. 긴 옵션의 경우, 인자를 요구하지 않는 옵션에 인자가 주어질 때도 이 예외를 발생시킵니다. 어트리뷰트 @code{msg} 와 @code{opt}는 에러 메시지와 관련 옵션을 제공합니다; 예외와 관련된 특정 옵션이 없으면 @code{opt}는 빈 문자열입니다.
@end deffn

@c XXX deprecated?

@geindex error
@anchor{library/getopt getopt error}@anchor{4e79}
@deffn {예외} getopt.error

@ref{18eb,,GetoptError}의 별칭; 과거 호환성을 위한 것입니다.
@end deffn

유닉스 스타일 옵션만 사용하는 예제:

@example
>>> import getopt
>>> args = '-a -b -cfoo -d bar a1 a2'.split()
>>> args
['-a', '-b', '-cfoo', '-d', 'bar', 'a1', 'a2']
>>> optlist, args = getopt.getopt(args, 'abc:d:')
>>> optlist
[('-a', '@w{'}), ('-b', '@w{'}), ('-c', 'foo'), ('-d', 'bar')]
>>> args
['a1', 'a2']
@end example

긴 옵션 이름을 사용하는 것도 똑같이 간단합니다:

@example
>>> s = '--condition=foo --testing --output-file abc.def -x a1 a2'
>>> args = s.split()
>>> args
['--condition=foo', '--testing', '--output-file', 'abc.def', '-x', 'a1', 'a2']
>>> optlist, args = getopt.getopt(args, 'x', [
...     'condition=', 'output-file=', 'testing'])
>>> optlist
[('--condition', 'foo'), ('--testing', '@w{'}), ('--output-file', 'abc.def'), ('-x', '@w{'})]
>>> args
['a1', 'a2']
@end example

Optional arguments should be specified explicitly:

@example
>>> s = '-Con -C --color=off --color a1 a2'
>>> args = s.split()
>>> args
['-Con', '-C', '--color=off', '--color', 'a1', 'a2']
>>> optlist, args = getopt.getopt(args, 'C::', ['color=?'])
>>> optlist
[('-C', 'on'), ('-C', '@w{'}), ('--color', 'off'), ('--color', '@w{'})]
>>> args
['a1', 'a2']
@end example

The order of options and non-option arguments can be preserved:

@example
>>> s = 'a1 -x a2 a3 a4 --long a5 a6'
>>> args = s.split()
>>> args
['a1', '-x', 'a2', 'a3', 'a4', '--long', 'a5', 'a6']
>>> optlist, args = getopt.gnu_getopt(args, '-x:', ['long='])
>>> optlist
[(None, ['a1']), ('-x', 'a2'), (None, ['a3', 'a4']), ('--long', 'a5')]
>>> args
['a6']
@end example

스크립트에서, 일반적인 사용법은 다음과 같습니다:

@example
import getopt, sys

def main():
    try:
        opts, args = getopt.getopt(sys.argv[1:], "ho:v", ["help", "output="])
    except getopt.GetoptError as err:
        # 도움말 정보를 출력하고 종료합니다:
        print(err)  # "option -a not recognized" 같은 것을 출력합니다
        usage()
        sys.exit(2)
    output = None
    verbose = False
    for o, a in opts:
        if o == "-v":
            verbose = True
        elif o in ("-h", "--help"):
            usage()
            sys.exit()
        elif o in ("-o", "--output"):
            output = a
        else:
            assert False, "unhandled option"
    process(args, output=output, verbose=verbose)

if __name__ == "__main__":
    main()
@end example

@ref{a4,,optparse} 모듈을 사용하면 더 적은 코드로, 더욱 유용한 도움말과 에러 메시지를 제공하는 동등한 명령 줄 인터페이스를 만들 수 있습니다:

@example
import optparse

if __name__ == '__main__':
    parser = optparse.OptionParser()
    parser.add_option('-o', '--output')
    parser.add_option('-v', dest='verbose', action='store_true')
    opts, args = parser.parse_args()
    process(args, output=opts.output, verbose=opts.verbose)
@end example

이 경우와 거의 동등한 명령 줄 인터페이스를 @ref{7,,argparse} 모듈을 사용해서도 만들 수 있습니다:

@example
import argparse

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('-o', '--output')
    parser.add_argument('-v', dest='verbose', action='store_true')
    parser.add_argument('rest', nargs='*')
    args = parser.parse_args()
    process(args.rest, output=args.output, verbose=args.verbose)
@end example

See @ref{339c,,Choosing an argument parsing library} for details on how the @code{argparse}
version of this code differs in behaviour from the @code{optparse} (and
@code{getopt}) version.


@subsubheading 더 보기



@table @asis

@item 모듈 @ref{a4,,optparse}

선언적 명령 줄 옵션 구문 분석.

@item 모듈 @ref{7,,argparse}

더 견해가 강한 명령 줄 옵션과 인자 구문 분석 라이브러리.
@end table


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Removed Modules,Security Considerations<2>,대체된 모듈,파이썬 표준 라이브러리
@anchor{library/removed doc}@anchor{4e7a}@anchor{library/removed removed}@anchor{4e7b}@anchor{library/removed removed-modules}@anchor{4e7c}@anchor{library/removed translation-repo}@anchor{4e7d}
@section Removed Modules


The modules described in this chapter have been removed from the Python
standard library.  They are documented here to help people find replacements.

@menu
* aifc — AIFF와 AIFC 파일 읽고 쓰기:: 
* asynchat — 비동기 소켓 명령/응답 처리기:: 
* asyncore — 비동기 소켓 처리기:: 
* audioop — 원시 오디오 데이터 조작:: 
* cgi — 공통 게이트웨이 인터페이스 지원:: 
* cgitb — CGI 스크립트를 위한 트레이스백 관리자:: 
* chunk — IFF 청크된 데이터 읽기:: 
* crypt — 유닉스 비밀번호 확인 함수:: 
* distutils — 파이썬 모듈 빌드와 설치:: 
* imghdr — 이미지 유형 판단:: 
* imp — 임포트 내부 액세스:: 
* mailcap — Mailcap 파일 처리:: 
* msilib — 마이크로소프트 설치 파일 읽고 쓰기:: 
* nis — Sun의 NIS(옐로 페이지)에 대한 인터페이스: nis — Sun의 NIS 옐로 페이지 에 대한 인터페이스. 
* nntplib — NNTP 프로토콜 클라이언트:: 
* ossaudiodev — OSS 호환 오디오 장치 액세스:: 
* pipes — 셸 파이프라인에 대한 인터페이스:: 
* smtpd — SMTP 서버:: 
* sndhdr — 음향 파일 유형 판단:: 
* spwd — 섀도 암호 데이터베이스:: 
* sunau — Sun AU 파일 읽고 쓰기:: 
* telnetlib — 텔넷 클라이언트:: 
* uu — uuencode 파일 인코딩과 디코딩:: 
* xdrlib — XDR 데이터 인코딩과 디코딩:: 

@end menu

@node aifc — AIFF와 AIFC 파일 읽고 쓰기,asynchat — 비동기 소켓 명령/응답 처리기,,Removed Modules
@anchor{library/aifc doc}@anchor{4e7e}@anchor{library/aifc aifc-read-and-write-aiff-and-aifc-files}@anchor{4e7f}@anchor{library/aifc module-aifc}@anchor{5}
@subsection @code{aifc} — AIFF와 AIFC 파일 읽고 쓰기


@geindex module; aifc


Deprecated since version 3.11, removed in version 3.13.


이 모듈은 더는 파이썬 표준 라이브러리에 포함되지 않습니다. 파이썬 3.11 에서 폐지된 후 @ref{471,,파이썬 3.13 에서 제거}되었습니다. 제거는 
@geindex Python 향상 제안; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/} 에서 결정되었습니다.

@code{aifc} 모듈을 제공한 마지막 파이썬 버전은 파이썬 3.12@footnote{https://docs.python.org/ko/3.12/library/aifc.html} 입니다.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node asynchat — 비동기 소켓 명령/응답 처리기,asyncore — 비동기 소켓 처리기,aifc — AIFF와 AIFC 파일 읽고 쓰기,Removed Modules
@anchor{library/asynchat doc}@anchor{4e80}@anchor{library/asynchat asynchat-asynchronous-socket-command-response-handler}@anchor{4e81}@anchor{library/asynchat module-asynchat}@anchor{a}@anchor{library/asynchat translation-repo}@anchor{4e82}
@subsection @code{asynchat} — 비동기 소켓 명령/응답 처리기


@geindex module; asynchat


Deprecated since version 3.6, removed in version 3.12.


이 모듈은 더는 파이썬 표준 라이브러리에 포함되지 않습니다. 파이썬 3.6 에서 폐지된 후 @ref{725,,파이썬 3.12 에서 제거}되었습니다. 제거는 
@geindex Python 향상 제안; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/} 에서 결정되었습니다.

응용은 대신 @ref{b,,asyncio} 모듈을 사용해야 합니다.

@code{asynchat} 모듈을 제공한 마지막 파이썬 버전은 파이썬 3.11@footnote{https://docs.python.org/ko/3.11/library/asynchat.html} 입니다.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node asyncore — 비동기 소켓 처리기,audioop — 원시 오디오 데이터 조작,asynchat — 비동기 소켓 명령/응답 처리기,Removed Modules
@anchor{library/asyncore doc}@anchor{4e83}@anchor{library/asyncore asyncore-asynchronous-socket-handler}@anchor{4e84}@anchor{library/asyncore module-asyncore}@anchor{c}@anchor{library/asyncore translation-repo}@anchor{4e85}
@subsection @code{asyncore} — 비동기 소켓 처리기


@geindex module; asyncore


Deprecated since version 3.6, removed in version 3.12.


이 모듈은 더는 파이썬 표준 라이브러리에 포함되지 않습니다. 파이썬 3.6 에서 폐지된 후 @ref{725,,파이썬 3.12 에서 제거}되었습니다. 제거는 
@geindex Python 향상 제안; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/} 에서 결정되었습니다.

응용은 대신 @ref{b,,asyncio} 모듈을 사용해야 합니다.

@code{asyncore} 모듈을 제공한 마지막 파이썬 버전은 파이썬 3.11@footnote{https://docs.python.org/ko/3.11/library/asyncore.html} 입니다.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node audioop — 원시 오디오 데이터 조작,cgi — 공통 게이트웨이 인터페이스 지원,asyncore — 비동기 소켓 처리기,Removed Modules
@anchor{library/audioop doc}@anchor{4e86}@anchor{library/audioop audioop-manipulate-raw-audio-data}@anchor{4e87}@anchor{library/audioop module-audioop}@anchor{e}@anchor{library/audioop translation-repo}@anchor{4e88}
@subsection @code{audioop} — 원시 오디오 데이터 조작


@geindex module; audioop


Deprecated since version 3.11, removed in version 3.13.


이 모듈은 더는 파이썬 표준 라이브러리에 포함되지 않습니다. 파이썬 3.11 에서 폐지된 후 @ref{471,,파이썬 3.13 에서 제거}되었습니다. 제거는 
@geindex Python 향상 제안; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/} 에서 결정되었습니다.

@code{audioop} 모듈을 제공한 마지막 파이썬 버전은 파이썬 3.12@footnote{https://docs.python.org/ko/3.12/library/audioop.html} 입니다.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node cgi — 공통 게이트웨이 인터페이스 지원,cgitb — CGI 스크립트를 위한 트레이스백 관리자,audioop — 원시 오디오 데이터 조작,Removed Modules
@anchor{library/cgi doc}@anchor{4e89}@anchor{library/cgi cgi-common-gateway-interface-support}@anchor{4e8a}@anchor{library/cgi module-cgi}@anchor{16}@anchor{library/cgi translation-repo}@anchor{4e8b}
@subsection @code{cgi} — 공통 게이트웨이 인터페이스 지원


@geindex module; cgi


Deprecated since version 3.11, removed in version 3.13.


이 모듈은 더는 파이썬 표준 라이브러리에 포함되지 않습니다. 파이썬 3.11 에서 폐지된 후 @ref{471,,파이썬 3.13 에서 제거}되었습니다. 제거는 
@geindex Python 향상 제안; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/} 에서 결정되었습니다.

PyPI의 모듈 포크를 대신 사용할 수 있습니다: legacy-cgi@footnote{https://pypi.org/project/legacy-cgi/}. 이것은 cgi 모듈의 복사본인데, 더 이상 파이썬 코어 팀에서 유지 관리하거나 지원하지 않습니다.

@code{cgi} 모듈을 제공한 마지막 파이썬 버전은 파이썬 3.12@footnote{https://docs.python.org/ko/3.12/library/cgi.html} 입니다.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node cgitb — CGI 스크립트를 위한 트레이스백 관리자,chunk — IFF 청크된 데이터 읽기,cgi — 공통 게이트웨이 인터페이스 지원,Removed Modules
@anchor{library/cgitb doc}@anchor{4e8c}@anchor{library/cgitb cgitb-traceback-manager-for-cgi-scripts}@anchor{4e8d}@anchor{library/cgitb module-cgitb}@anchor{17}@anchor{library/cgitb translation-repo}@anchor{4e8e}
@subsection @code{cgitb} — CGI 스크립트를 위한 트레이스백 관리자


@geindex module; cgitb


Deprecated since version 3.11, removed in version 3.13.


이 모듈은 더는 파이썬 표준 라이브러리에 포함되지 않습니다. 파이썬 3.11 에서 폐지된 후 @ref{471,,파이썬 3.13 에서 제거}되었습니다. 제거는 
@geindex Python 향상 제안; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/} 에서 결정되었습니다.

PyPI의 모듈 포크를 대신 사용할 수 있습니다: legacy-cgi@footnote{https://pypi.org/project/legacy-cgi/}. 이것은 cgi 모듈의 복사본인데, 더 이상 파이썬 코어 팀에서 유지 관리하거나 지원하지 않습니다.

@code{cgitb} 모듈을 제공한 마지막 파이썬 버전은 파이썬 3.12@footnote{https://docs.python.org/ko/3.12/library/cgitb.html} 입니다.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node chunk — IFF 청크된 데이터 읽기,crypt — 유닉스 비밀번호 확인 함수,cgitb — CGI 스크립트를 위한 트레이스백 관리자,Removed Modules
@anchor{library/chunk doc}@anchor{4e8f}@anchor{library/chunk chunk-read-iff-chunked-data}@anchor{4e90}@anchor{library/chunk module-chunk}@anchor{18}@anchor{library/chunk translation-repo}@anchor{4e91}
@subsection @code{chunk} — IFF 청크된 데이터 읽기


@geindex module; chunk


Deprecated since version 3.11, removed in version 3.13.


이 모듈은 더는 파이썬 표준 라이브러리에 포함되지 않습니다. 파이썬 3.11 에서 폐지된 후 @ref{471,,파이썬 3.13 에서 제거}되었습니다. 제거는 
@geindex Python 향상 제안; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/} 에서 결정되었습니다.

@code{chunk} 모듈을 제공한 마지막 파이썬 버전은 파이썬 3.12@footnote{https://docs.python.org/ko/3.12/library/chunk.html} 입니다.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node crypt — 유닉스 비밀번호 확인 함수,distutils — 파이썬 모듈 빌드와 설치,chunk — IFF 청크된 데이터 읽기,Removed Modules
@anchor{library/crypt doc}@anchor{4e92}@anchor{library/crypt crypt-function-to-check-unix-passwords}@anchor{4e93}@anchor{library/crypt module-crypt}@anchor{2c}@anchor{library/crypt translation-repo}@anchor{4e94}
@subsection @code{crypt} — 유닉스 비밀번호 확인 함수


@geindex module; crypt


Deprecated since version 3.11, removed in version 3.13.


이 모듈은 더는 파이썬 표준 라이브러리에 포함되지 않습니다. 파이썬 3.11 에서 폐지된 후 @ref{471,,파이썬 3.13 에서 제거}되었습니다. 제거는 
@geindex Python 향상 제안; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/} 에서 결정되었습니다.

Applications can use the @ref{6c,,hashlib} module from the standard library.
Other possible replacements are third-party libraries from PyPI:
legacycrypt@footnote{https://pypi.org/project/legacycrypt/}, bcrypt@footnote{https://pypi.org/project/bcrypt/}, or argon2-cffi@footnote{https://pypi.org/project/argon2-cffi/}.
These are not supported or maintained by the Python core team.

@code{crypt} 모듈을 제공한 마지막 파이썬 버전은 파이썬 3.12@footnote{https://docs.python.org/ko/3.12/library/crypt.html} 입니다.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node distutils — 파이썬 모듈 빌드와 설치,imghdr — 이미지 유형 판단,crypt — 유닉스 비밀번호 확인 함수,Removed Modules
@anchor{library/distutils doc}@anchor{4e95}@anchor{library/distutils distutils-building-and-installing-python-modules}@anchor{4e96}@anchor{library/distutils module-distutils}@anchor{3d}@anchor{library/distutils translation-repo}@anchor{4e97}
@subsection @code{distutils} — 파이썬 모듈 빌드와 설치


@geindex module; distutils


Deprecated since version 3.10, removed in version 3.12.


이 모듈은 더는 파이썬 표준 라이브러리에 포함되지 않습니다. 파이썬 3.10 에서 폐지된 후 @ref{72b,,파이썬 3.12 에서 제거}되었습니다. 제거는 
@geindex Python 향상 제안; PEP 632
PEP 632@footnote{https://peps.python.org/pep-0632/} 에서 결정되었고, 마이그레이션 지침@footnote{https://peps.python.org/pep-0632/#migration-advice}이 있습니다.

@code{distutils} 모듈을 제공한 마지막 파이썬 버전은 파이썬 3.11@footnote{https://docs.python.org/ko/3.11/library/distutils.html} 입니다.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node imghdr — 이미지 유형 판단,imp — 임포트 내부 액세스,distutils — 파이썬 모듈 빌드와 설치,Removed Modules
@anchor{library/imghdr doc}@anchor{4e98}@anchor{library/imghdr imghdr-determine-the-type-of-an-image}@anchor{4e99}@anchor{library/imghdr module-imghdr}@anchor{79}@anchor{library/imghdr translation-repo}@anchor{4e9a}
@subsection @code{imghdr} — 이미지 유형 판단


@geindex module; imghdr


Deprecated since version 3.11, removed in version 3.13.


이 모듈은 더는 파이썬 표준 라이브러리에 포함되지 않습니다. 파이썬 3.11 에서 폐지된 후 @ref{471,,파이썬 3.13 에서 제거}되었습니다. 제거는 
@geindex Python 향상 제안; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/} 에서 결정되었습니다.

가능한 대체품은 PyPI 에 있는 타사 라이브러리들입니다: filetype@footnote{https://pypi.org/project/filetype/}, puremagic@footnote{https://pypi.org/project/puremagic/} 또는 python-magic@footnote{https://pypi.org/project/python-magic/}. 이 라이브러리는 파이썬 코어 팀에서 지원하거나 유지 관리하지 않습니다.

@code{imghdr} 모듈을 제공한 마지막 파이썬 버전은 파이썬 3.12@footnote{https://docs.python.org/ko/3.12/library/imghdr.html} 입니다.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node imp — 임포트 내부 액세스,mailcap — Mailcap 파일 처리,imghdr — 이미지 유형 판단,Removed Modules
@anchor{library/imp doc}@anchor{4e9b}@anchor{library/imp imp-access-the-import-internals}@anchor{4e9c}@anchor{library/imp module-imp}@anchor{7a}@anchor{library/imp translation-repo}@anchor{4e9d}
@subsection @code{imp} — 임포트 내부 액세스


@geindex module; imp


Deprecated since version 3.4, removed in version 3.12.


이 모듈은 더는 파이썬 표준 라이브러리에 포함되지 않습니다. 파이썬 3.4 에서 폐지된 후 @ref{735,,파이썬 3.12 에서 제거}되었습니다.

@ref{735,,제거 공지}에는 코드를 @code{imp} 에서 @ref{7b,,importlib} 로 마이그레이션하는 방법에 대한 지침이 포함되어 있습니다.

@code{imp} 모듈을 제공한 마지막 파이썬 버전은 파이썬 3.11@footnote{https://docs.python.org/ko/3.11/library/imp.html} 입니다.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node mailcap — Mailcap 파일 처리,msilib — 마이크로소프트 설치 파일 읽고 쓰기,imp — 임포트 내부 액세스,Removed Modules
@anchor{library/mailcap doc}@anchor{4e9e}@anchor{library/mailcap mailcap-mailcap-file-handling}@anchor{4e9f}@anchor{library/mailcap module-mailcap}@anchor{90}@anchor{library/mailcap translation-repo}@anchor{4ea0}
@subsection @code{mailcap} — Mailcap 파일 처리


@geindex module; mailcap


Deprecated since version 3.11, removed in version 3.13.


이 모듈은 더는 파이썬 표준 라이브러리에 포함되지 않습니다. 파이썬 3.11 에서 폐지된 후 @ref{471,,파이썬 3.13 에서 제거}되었습니다. 제거는 
@geindex Python 향상 제안; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/} 에서 결정되었습니다.

@code{mailcap} 모듈을 제공한 마지막 파이썬 버전은 파이썬 3.12@footnote{https://docs.python.org/ko/3.12/library/mailcap.html} 입니다.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node msilib — 마이크로소프트 설치 파일 읽고 쓰기,nis — Sun의 NIS 옐로 페이지 에 대한 인터페이스,mailcap — Mailcap 파일 처리,Removed Modules
@anchor{library/msilib doc}@anchor{4ea1}@anchor{library/msilib module-msilib}@anchor{96}@anchor{library/msilib msilib-read-and-write-microsoft-installer-files}@anchor{4ea2}@anchor{library/msilib translation-repo}@anchor{4ea3}
@subsection @code{msilib} — 마이크로소프트 설치 파일 읽고 쓰기


@geindex module; msilib


Deprecated since version 3.11, removed in version 3.13.


이 모듈은 더는 파이썬 표준 라이브러리에 포함되지 않습니다. 파이썬 3.11 에서 폐지된 후 @ref{471,,파이썬 3.13 에서 제거}되었습니다. 제거는 
@geindex Python 향상 제안; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/} 에서 결정되었습니다.

@code{msilib} 모듈을 제공한 마지막 파이썬 버전은 파이썬 3.12@footnote{https://docs.python.org/ko/3.12/library/msilib.html} 입니다.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node nis — Sun의 NIS 옐로 페이지 에 대한 인터페이스,nntplib — NNTP 프로토콜 클라이언트,msilib — 마이크로소프트 설치 파일 읽고 쓰기,Removed Modules
@anchor{library/nis doc}@anchor{4ea4}@anchor{library/nis module-nis}@anchor{a0}@anchor{library/nis nis-interface-to-suns-nis-yellow-pages}@anchor{4ea5}@anchor{library/nis translation-repo}@anchor{4ea6}
@subsection @code{nis} — Sun의 NIS(옐로 페이지)에 대한 인터페이스


@geindex module; nis


Deprecated since version 3.11, removed in version 3.13.


이 모듈은 더는 파이썬 표준 라이브러리에 포함되지 않습니다. 파이썬 3.11 에서 폐지된 후 @ref{471,,파이썬 3.13 에서 제거}되었습니다. 제거는 
@geindex Python 향상 제안; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/} 에서 결정되었습니다.

@code{nis} 모듈을 제공한 마지막 파이썬 버전은 파이썬 3.12@footnote{https://docs.python.org/ko/3.12/library/nis.html} 입니다.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node nntplib — NNTP 프로토콜 클라이언트,ossaudiodev — OSS 호환 오디오 장치 액세스,nis — Sun의 NIS 옐로 페이지 에 대한 인터페이스,Removed Modules
@anchor{library/nntplib doc}@anchor{4ea7}@anchor{library/nntplib module-nntplib}@anchor{a1}@anchor{library/nntplib nntplib-nntp-protocol-client}@anchor{4ea8}@anchor{library/nntplib translation-repo}@anchor{4ea9}
@subsection @code{nntplib} — NNTP 프로토콜 클라이언트


@geindex module; nntplib


Deprecated since version 3.11, removed in version 3.13.


이 모듈은 더는 파이썬 표준 라이브러리에 포함되지 않습니다. 파이썬 3.11 에서 폐지된 후 @ref{471,,파이썬 3.13 에서 제거}되었습니다. 제거는 
@geindex Python 향상 제안; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/} 에서 결정되었습니다.

@code{nntplib} 모듈을 제공한 마지막 파이썬 버전은 파이썬 3.12@footnote{https://docs.python.org/ko/3.12/library/nntplib.html} 입니다.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node ossaudiodev — OSS 호환 오디오 장치 액세스,pipes — 셸 파이프라인에 대한 인터페이스,nntplib — NNTP 프로토콜 클라이언트,Removed Modules
@anchor{library/ossaudiodev doc}@anchor{4eaa}@anchor{library/ossaudiodev module-ossaudiodev}@anchor{a7}@anchor{library/ossaudiodev ossaudiodev-access-to-oss-compatible-audio-devices}@anchor{4eab}@anchor{library/ossaudiodev translation-repo}@anchor{4eac}
@subsection @code{ossaudiodev} — OSS 호환 오디오 장치 액세스


@geindex module; ossaudiodev


Deprecated since version 3.11, removed in version 3.13.


이 모듈은 더는 파이썬 표준 라이브러리에 포함되지 않습니다. 파이썬 3.11 에서 폐지된 후 @ref{471,,파이썬 3.13 에서 제거}되었습니다. 제거는 
@geindex Python 향상 제안; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/} 에서 결정되었습니다.

@code{ossaudiodev} 모듈을 제공한 마지막 파이썬 버전은 파이썬 3.12@footnote{https://docs.python.org/ko/3.12/library/ossaudiodev.html} 입니다.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node pipes — 셸 파이프라인에 대한 인터페이스,smtpd — SMTP 서버,ossaudiodev — OSS 호환 오디오 장치 액세스,Removed Modules
@anchor{library/pipes doc}@anchor{4ead}@anchor{library/pipes module-pipes}@anchor{ad}@anchor{library/pipes pipes-interface-to-shell-pipelines}@anchor{4eae}@anchor{library/pipes translation-repo}@anchor{4eaf}
@subsection @code{pipes} — 셸 파이프라인에 대한 인터페이스


@geindex module; pipes


Deprecated since version 3.11, removed in version 3.13.


이 모듈은 더는 파이썬 표준 라이브러리에 포함되지 않습니다. 파이썬 3.11 에서 폐지된 후 @ref{471,,파이썬 3.13 에서 제거}되었습니다. 제거는 
@geindex Python 향상 제안; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/} 에서 결정되었습니다.

응용은 대신 @ref{dc,,subprocess} 모듈을 사용해야 합니다.

@code{pipes} 모듈을 제공한 마지막 파이썬 버전은 파이썬 3.12@footnote{https://docs.python.org/ko/3.12/library/pipes.html} 입니다.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node smtpd — SMTP 서버,sndhdr — 음향 파일 유형 판단,pipes — 셸 파이프라인에 대한 인터페이스,Removed Modules
@anchor{library/smtpd doc}@anchor{4eb0}@anchor{library/smtpd module-smtpd}@anchor{ce}@anchor{library/smtpd smtpd-smtp-server}@anchor{4eb1}@anchor{library/smtpd translation-repo}@anchor{4eb2}
@subsection @code{smtpd} — SMTP 서버


@geindex module; smtpd


Deprecated since version 3.6, removed in version 3.12.


이 모듈은 더는 파이썬 표준 라이브러리에 포함되지 않습니다. 파이썬 3.6 에서 폐지된 후 @ref{725,,파이썬 3.12 에서 제거}되었습니다. 제거는 
@geindex Python 향상 제안; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/} 에서 결정되었습니다.

가능한 대체품은 타사 aiosmtpd@footnote{https://pypi.org/project/aiosmtpd/} 라이브러리입니다. 이 라이브러리는 파이썬 코어 팀에서 유지 관리하거나 지원하지 않습니다.

@code{smtpd} 모듈을 제공한 마지막 파이썬 버전은 파이썬 3.11@footnote{https://docs.python.org/ko/3.11/library/smtpd.html} 입니다.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node sndhdr — 음향 파일 유형 판단,spwd — 섀도 암호 데이터베이스,smtpd — SMTP 서버,Removed Modules
@anchor{library/sndhdr doc}@anchor{4eb3}@anchor{library/sndhdr module-sndhdr}@anchor{d0}@anchor{library/sndhdr sndhdr-determine-type-of-sound-file}@anchor{4eb4}@anchor{library/sndhdr translation-repo}@anchor{4eb5}
@subsection @code{sndhdr} — 음향 파일 유형 판단


@geindex module; sndhdr


Deprecated since version 3.11, removed in version 3.13.


이 모듈은 더는 파이썬 표준 라이브러리에 포함되지 않습니다. 파이썬 3.11 에서 폐지된 후 @ref{471,,파이썬 3.13 에서 제거}되었습니다. 제거는 
@geindex Python 향상 제안; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/} 에서 결정되었습니다.

가능한 대체품은 PyPI 에 있는 타사 라이브러리들입니다: filetype@footnote{https://pypi.org/project/filetype/}, puremagic@footnote{https://pypi.org/project/puremagic/} 또는 python-magic@footnote{https://pypi.org/project/python-magic/}. 이 라이브러리는 파이썬 코어 팀에서 지원하거나 유지 관리하지 않습니다.

@code{sndhdr} 모듈을 제공한 마지막 파이썬 버전은 파이썬 3.12@footnote{https://docs.python.org/ko/3.12/library/sndhdr.html} 입니다.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node spwd — 섀도 암호 데이터베이스,sunau — Sun AU 파일 읽고 쓰기,sndhdr — 음향 파일 유형 판단,Removed Modules
@anchor{library/spwd doc}@anchor{4eb6}@anchor{library/spwd module-spwd}@anchor{d3}@anchor{library/spwd spwd-the-shadow-password-database}@anchor{4eb7}@anchor{library/spwd translation-repo}@anchor{4eb8}
@subsection @code{spwd} — 섀도 암호 데이터베이스


@geindex module; spwd


Deprecated since version 3.11, removed in version 3.13.


이 모듈은 더는 파이썬 표준 라이브러리에 포함되지 않습니다. 파이썬 3.11 에서 폐지된 후 @ref{471,,파이썬 3.13 에서 제거}되었습니다. 제거는 
@geindex Python 향상 제안; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/} 에서 결정되었습니다.

가능한 대체품은 타사 python-pam@footnote{https://pypi.org/project/python-pam/} 라이브러리입니다. 이 라이브러리는 파이썬 코어 팀에서 지원하거나 유지 관리하지 않습니다.

@code{spwd} 모듈을 제공한 마지막 파이썬 버전은 파이썬 3.12@footnote{https://docs.python.org/ko/3.12/library/spwd.html} 입니다.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node sunau — Sun AU 파일 읽고 쓰기,telnetlib — 텔넷 클라이언트,spwd — 섀도 암호 데이터베이스,Removed Modules
@anchor{library/sunau doc}@anchor{4eb9}@anchor{library/sunau module-sunau}@anchor{dd}@anchor{library/sunau sunau-read-and-write-sun-au-files}@anchor{4eba}@anchor{library/sunau translation-repo}@anchor{4ebb}
@subsection @code{sunau} — Sun AU 파일 읽고 쓰기


@geindex module; sunau


Deprecated since version 3.11, removed in version 3.13.


이 모듈은 더는 파이썬 표준 라이브러리에 포함되지 않습니다. 파이썬 3.11 에서 폐지된 후 @ref{471,,파이썬 3.13 에서 제거}되었습니다. 제거는 
@geindex Python 향상 제안; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/} 에서 결정되었습니다.

@code{sunau} 모듈을 제공한 마지막 파이썬 버전은 파이썬 3.12@footnote{https://docs.python.org/ko/3.12/library/sunau.html} 입니다.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node telnetlib — 텔넷 클라이언트,uu — uuencode 파일 인코딩과 디코딩,sunau — Sun AU 파일 읽고 쓰기,Removed Modules
@anchor{library/telnetlib doc}@anchor{4ebc}@anchor{library/telnetlib module-telnetlib}@anchor{e5}@anchor{library/telnetlib telnetlib-telnet-client}@anchor{4ebd}@anchor{library/telnetlib translation-repo}@anchor{4ebe}
@subsection @code{telnetlib} — 텔넷 클라이언트


@geindex module; telnetlib


Deprecated since version 3.11, removed in version 3.13.


이 모듈은 더는 파이썬 표준 라이브러리에 포함되지 않습니다. 파이썬 3.11 에서 폐지된 후 @ref{471,,파이썬 3.13 에서 제거}되었습니다. 제거는 
@geindex Python 향상 제안; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/} 에서 결정되었습니다.

가능한 대체품은 PyPI 에 있는 타사 라이브러리들입니다: telnetlib3@footnote{https://pypi.org/project/telnetlib3/} 이나 Exscript@footnote{https://pypi.org/project/Exscript/}. 이 라이브러리는 파이썬 코어 팀에서 지원하거나 유지 관리하지 않습니다.

@code{telnetlib} 모듈을 제공한 마지막 파이썬 버전은 파이썬 3.12@footnote{https://docs.python.org/ko/3.12/library/telnetlib.html} 입니다.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node uu — uuencode 파일 인코딩과 디코딩,xdrlib — XDR 데이터 인코딩과 디코딩,telnetlib — 텔넷 클라이언트,Removed Modules
@anchor{library/uu doc}@anchor{4ebf}@anchor{library/uu module-uu}@anchor{115}@anchor{library/uu translation-repo}@anchor{4ec0}@anchor{library/uu uu-encode-and-decode-uuencode-files}@anchor{4ec1}
@subsection @code{uu} — uuencode 파일 인코딩과 디코딩


@geindex module; uu


Deprecated since version 3.11, removed in version 3.13.


이 모듈은 더는 파이썬 표준 라이브러리에 포함되지 않습니다. 파이썬 3.11 에서 폐지된 후 @ref{471,,파이썬 3.13 에서 제거}되었습니다. 제거는 
@geindex Python 향상 제안; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/} 에서 결정되었습니다.

@code{uu} 모듈을 제공한 마지막 파이썬 버전은 파이썬 3.12@footnote{https://docs.python.org/ko/3.12/library/uu.html} 입니다.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node xdrlib — XDR 데이터 인코딩과 디코딩,,uu — uuencode 파일 인코딩과 디코딩,Removed Modules
@anchor{library/xdrlib doc}@anchor{4ec2}@anchor{library/xdrlib module-xdrlib}@anchor{125}@anchor{library/xdrlib translation-repo}@anchor{4ec3}@anchor{library/xdrlib xdrlib-encode-and-decode-xdr-data}@anchor{4ec4}
@subsection @code{xdrlib} — XDR 데이터 인코딩과 디코딩


@geindex module; xdrlib


Deprecated since version 3.11, removed in version 3.13.


이 모듈은 더는 파이썬 표준 라이브러리에 포함되지 않습니다. 파이썬 3.11 에서 폐지된 후 @ref{471,,파이썬 3.13 에서 제거}되었습니다. 제거는 
@geindex Python 향상 제안; PEP 594
PEP 594@footnote{https://peps.python.org/pep-0594/} 에서 결정되었습니다.

@code{xdrlib} 모듈을 제공한 마지막 파이썬 버전은 파이썬 3.12@footnote{https://docs.python.org/ko/3.12/library/xdrlib.html} 입니다.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@geindex security considerations
@anchor{library/security_warnings security-warnings}@anchor{4ec5}
@node Security Considerations<2>,,Removed Modules,파이썬 표준 라이브러리
@anchor{library/security_warnings doc}@anchor{4ec6}@anchor{library/security_warnings security-considerations}@anchor{4ec7}@anchor{library/security_warnings translation-repo}@anchor{4ec8}
@section Security Considerations


The following modules have specific security considerations:


@itemize *

@item 
@ref{f,,base64}: @ref{3ced,,base64 security considerations} in
@geindex RFC; RFC 4648
RFC 4648@footnote{https://datatracker.ietf.org/doc/html/rfc4648.html}

@item 
@ref{6c,,hashlib}: @ref{2fef,,all constructors take a “usedforsecurity” keyword-only argument disabling known insecure and blocked algorithms}

@item 
@ref{76,,http.server} is not suitable for production use, only implementing
basic security checks. See the @ref{4120,,security considerations}.

@item 
@ref{8b,,logging}: @ref{31d4,,Logging configuration uses eval()}

@item 
@ref{98,,multiprocessing}: @ref{36b7,,Connection.recv() uses pickle}

@item 
@ref{ab,,pickle}: @ref{2d41,,Restricting globals in pickle}

@item 
@ref{bd,,random} shouldn’t be used for security purposes, use @ref{c5,,secrets}
instead

@item 
@ref{c8,,shelve}: @ref{2d63,,shelve is based on pickle and thus unsuitable for dealing with untrusted sources}

@item 
@ref{d5,,ssl}: @ref{38c5,,SSL/TLS security considerations}

@item 
@ref{dc,,subprocess}: @ref{3787,,Subprocess security considerations}

@item 
@ref{e6,,tempfile}: @ref{2cfb,,mktemp is deprecated due to vulnerability to race conditions}

@item 
@ref{126,,xml}: @ref{3d21,,XML security}

@item 
@ref{137,,zipfile}: @ref{2eff,,maliciously prepared .zip files can cause disk volume exhaustion}
@end itemize

The @ref{b56,,-I} command line option can be used to run Python in isolated
mode. When it cannot be used, the @ref{7c0,,-P} option or the
@geindex PYTHONSAFEPATH
@geindex 환경 변수; PYTHONSAFEPATH
@ref{7c1,,PYTHONSAFEPATH} environment variable can be used to not prepend a
potentially unsafe path to @ref{3e4,,sys.path} such as the current directory, the
script’s directory or an empty string.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 파이썬 인터프리터 확장 및 내장,Python/C API reference manual,파이썬 표준 라이브러리,Top
@anchor{extending/index doc}@anchor{4ec9}@anchor{extending/index extending-and-embedding-the-python-interpreter}@anchor{4eca}@anchor{extending/index extending-index}@anchor{1fb9}@anchor{extending/index translation-repo}@anchor{4ecb}
@chapter 파이썬 인터프리터 확장 및 내장


이 문서는 새로운 모듈로 파이썬 인터프리터를 확장하기 위해 C 나 C++로 모듈을 작성하는 방법을 설명합니다. 이러한 모듈은 새로운 함수뿐만 아니라 새로운 객체 형과 메서드를 정의할 수 있습니다. 또한, 확장 언어로 사용하기 위해, 파이썬 인터프리터를 다른 응용 프로그램에 내장시키는 방법에 관해서도 설명합니다. 마지막으로, 하부 운영 체제에서 이 기능을 지원하는 경우, 동적으로 (실행시간에) 인터프리터에 로드될 수 있도록 확장 모듈을 컴파일하고 링크하는 방법을 보여줍니다.

이 문서는 파이썬에 대한 기본 지식을 전제로 합니다. 언어에 대한 형식적이지 않은 소개는 @ref{1fb8,,파이썬 자습서} 를 보십시오. @ref{14a,,파이썬 언어 레퍼런스} 는 보다 형식적인 언어 정의를 제공합니다. @ref{149,,파이썬 표준 라이브러리} 는 존재하는 객체 형, 함수 및 모듈(내장된 것과 파이썬으로 작성된 것 모두)을 설명하는데, 이것들이 언어의 응용 범위를 넓힙니다.

전체 파이썬/C API에 대한 자세한 설명은 별도의 @ref{1fba,,Python/C API reference manual} 를 참조하십시오.

@menu
* 권장 제삼자 도구:: 
* 제삼자 도구 없이 확장 만들기:: 
* 더 큰 응용 프로그램에 CPython 런타임을 내장하기:: 

@end menu

@node 권장 제삼자 도구,제삼자 도구 없이 확장 만들기,,파이썬 인터프리터 확장 및 내장
@anchor{extending/index recommended-third-party-tools}@anchor{4ecc}
@section 권장 제삼자 도구


This guide only covers the basic tools for creating extensions provided
as part of this version of CPython. Some @ref{4ecd,,third party tools} offer both simpler and more sophisticated approaches to creating
C and C++ extensions for Python.

@node 제삼자 도구 없이 확장 만들기,더 큰 응용 프로그램에 CPython 런타임을 내장하기,권장 제삼자 도구,파이썬 인터프리터 확장 및 내장
@anchor{extending/index creating-extensions-without-third-party-tools}@anchor{4ece}
@section 제삼자 도구 없이 확장 만들기


지침서의 이 부문에서는 제삼자 도구의 도움 없이 C와 C++ 확장을 만드는 방법에 관해 설명합니다. 여러분 자신의 C 확장을 만드는 데 권장되는 방법이라기보다는, 주로 도구를 제작하는 사람들을 대상으로 합니다.


@subsubheading 더 보기


@geindex Python 향상 제안; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/} – Multi-phase extension module initialization


@menu
* C나 C++로 파이썬 확장하기:: 
* 확장형 정의하기; 자습서: 확장형 정의하기 자습서. 
* 확장형 정의하기; 여러 가지 주제: 확장형 정의하기 여러 가지 주제. 
* C와 C++ 확장 빌드하기:: 
* 윈도우에서 C와 C++ 확장 빌드하기:: 

@end menu

@node C나 C++로 파이썬 확장하기,확장형 정의하기 자습서,,제삼자 도구 없이 확장 만들기
@anchor{extending/extending doc}@anchor{4ecf}@anchor{extending/extending extending-intro}@anchor{4ed0}@anchor{extending/extending extending-python-with-c-or-c}@anchor{4ed1}
@subsection C나 C++로 파이썬 확장하기


C로 프로그래밍하는 방법을 알고 있다면, 파이썬에 새로운 내장 모듈을 추가하기는 매우 쉽습니다. 그러한 `확장 모듈(extension modules)'은 파이썬에서 직접 할 수 없는 두 가지 일을 할 수 있습니다: 새로운 내장 객체 형을 구현할 수 있고, C 라이브러리 함수와 시스템 호출을 호출할 수 있습니다.

확장을 지원하기 위해, 파이썬 API(Application Programmers Interface)는 파이썬 런타임 시스템의 대부분 측면에 액세스 할 수 있는 함수, 매크로 및 변수 집합을 정의합니다. 파이썬 API는 헤더 @code{"Python.h"}를 포함해 C 소스 파일에 통합됩니다.

확장 모듈의 컴파일은 시스템 설정뿐만 아니라 의도하는 용도에 따라 다릅니다; 자세한 내용은 다음 장에서 설명합니다.

@cartouche
@quotation 참고 
C 확장 인터페이스는 CPython에만 해당하며, 확장 모듈은 다른 파이썬 구현에서는 작동하지 않습니다. 많은 경우에, C 확장을 작성하지 않고 다른 구현으로의 이식성을 유지하는 것이 가능합니다. 예를 들어, 사용 사례가 C 라이브러리 함수나 시스템 호출을 호출하는 것이라면, 사용자 정의 C 코드를 작성하는 대신 @ref{2e,,ctypes} 모듈이나 cffi@footnote{https://cffi.readthedocs.io/} 라이브러리 사용을 고려해야 합니다. 이 모듈을 사용하면 C 코드와 인터페이스 하기 위한 파이썬 코드를 작성할 수 있으며 C 확장 모듈을 작성하고 컴파일하는 것보다 파이썬 구현 간에 이식성이 더 좋습니다.
@end quotation
@end cartouche

@menu
* 간단한 예:: 
* 막간극; 에러와 예외: 막간극 에러와 예외. 
* 예제로 돌아가기:: 
* 모듈의 메서드 테이블과 초기화 함수:: 
* 컴파일과 링크:: 
* C에서 파이썬 함수 호출하기:: 
* 확장 함수에서 매개 변수 추출하기:: 
* 확장 함수를 위한 키워드 매개 변수:: 
* 임의의 값을 구축하기:: 
* 참조 횟수:: 
* C++로 확장 작성하기:: 
* 확장 모듈을 위한 C API 제공하기:: 

@end menu

@node 간단한 예,막간극 에러와 예외,,C나 C++로 파이썬 확장하기
@anchor{extending/extending a-simple-example}@anchor{4ed2}@anchor{extending/extending extending-simpleexample}@anchor{4ed3}
@subsubsection 간단한 예


@code{spam}(몬티 파이썬 팬들이 가장 좋아하는 음식…)이라는 확장 모듈을 만듭시다, 그리고 C 라이브러리 함수 @code{system()}에 대한 파이썬 인터페이스를 만들고 싶다고 합시다 @footnote{
이 함수에 대한 인터페이스는 표준 모듈 @ref{a5,,os}에 이미 존재합니다 — 간단하고 단순한 예제로 선택되었습니다.
}. 이 함수는 널 종료 문자열을 인자로 취하고 정수를 반환합니다. 우리는 이 함수를 다음과 같이 파이썬에서 호출할 수 있기를 원합니다:

@example
>>> import spam
>>> status = spam.system("ls -l")
@end example

@code{spammodule.c} 파일을 만드는 것으로 시작하십시오. (역사적으로, 모듈을 @code{spam}이라고 하면, 해당 구현을 포함하는 C 파일은 @code{spammodule.c}라고 합니다; 모듈 이름이 @code{spammify}처럼 매우 길면, 모듈 이름은 그냥 @code{spammify.c}일 수 있습니다.)

파일의 처음 두 줄은 다음과 같습니다:

@example
#define PY_SSIZE_T_CLEAN
#include <Python.h>
@end example

이것은 파이썬 API를 가져옵니다 (원한다면 모듈의 목적과 저작권 표시를 설명하는 주석을 추가할 수 있습니다).

@cartouche
@quotation 참고 
파이썬이 일부 시스템의 표준 헤더에 영향을 미치는 일부 전처리기 정의를 정의할 수 있어서, 표준 헤더가 포함되기 전에 `반드시' @code{Python.h}를 포함해야 합니다.

@code{#define PY_SSIZE_T_CLEAN} was used to indicate that @code{Py_ssize_t} should be
used in some APIs instead of @code{int}.
It is not necessary since Python 3.13, but we keep it here for backward compatibility.
See @ref{62a,,문자열과 버퍼} for a description of this macro.
@end quotation
@end cartouche

All user-visible symbols defined by @code{Python.h} have a prefix of @code{Py} or
@code{PY}, except those defined in standard header files.

@cartouche
@quotation 팁 
For backward compatibility, @code{Python.h} includes several standard header files.
C extensions should include the standard headers that they use,
and should not rely on these implicit includes.
If using the limited C API version 3.13 or newer, the implicit includes are:


@itemize *

@item 
@code{<assert.h>}

@item 
@code{<intrin.h>} (on Windows)

@item 
@code{<inttypes.h>}

@item 
@code{<limits.h>}

@item 
@code{<math.h>}

@item 
@code{<stdarg.h>}

@item 
@code{<wchar.h>}

@item 
@code{<sys/types.h>} (if present)
@end itemize

If @ref{65e,,Py_LIMITED_API} is not defined, or is set to version 3.12 or older,
the headers below are also included:


@itemize *

@item 
@code{<ctype.h>}

@item 
@code{<unistd.h>} (on POSIX)
@end itemize

If @ref{65e,,Py_LIMITED_API} is not defined, or is set to version 3.10 or older,
the headers below are also included:


@itemize *

@item 
@code{<errno.h>}

@item 
@code{<stdio.h>}

@item 
@code{<stdlib.h>}

@item 
@code{<string.h>}
@end itemize
@end quotation
@end cartouche

다음으로 모듈 파일에 추가하는 것은 파이썬 표현식 @code{spam.system(string)}이 평가될 때 호출될 C 함수입니다 (이것이 어떻게 호출되는지 곧 보게 될 것입니다):

@example
static PyObject *
spam_system(PyObject *self, PyObject *args)
@{
    const char *command;
    int sts;

    if (!PyArg_ParseTuple(args, "s", &command))
        return NULL;
    sts = system(command);
    return PyLong_FromLong(sts);
@}
@end example

파이썬의 인자 목록(예를 들어, 단일 표현식 @code{"ls -l"})에서 C 함수로 전달되는 인자로의 간단한 변환이 있습니다. C 함수에는 항상 `self'와 `args'라는 두 개의 인자가 있습니다.

`self' 인자는 모듈 수준 함수에서 모듈 객체를 가리킵니다; 메서드의 경우 객체 인스턴스를 가리킵니다.

`args' 인자는 인자를 포함하는 파이썬 튜플 객체에 대한 포인터입니다. 튜플의 각 항목은 호출의 인자 목록에 있는 인자에 해당합니다. 인자는 파이썬 객체입니다 — C 함수에서 무언가를 수행하려면 이들을 C 값으로 변환해야 합니다. 파이썬 API의 @ref{3c1,,PyArg_ParseTuple()} 함수는 인자 형을 확인하고 C 값으로 변환합니다. 템플릿 문자열을 사용하여 필요한 인자 형과 변환된 값을 저장할 C 변수 형을 결정합니다. 나중에 이것에 대해 자세히 알아보겠습니다.

모든 인자의 형이 올바르고 해당 구성 요소가 주소가 전달된 변수에 저장되면, @ref{3c1,,PyArg_ParseTuple()}은 참(0이 아닙니다)을 반환합니다. 유효하지 않은 인자 목록이 전달되면 거짓(0)을 반환합니다. 후자의 경우 호출 함수가  (예에서 보듯이) @code{NULL}을 즉시 반환할 수 있도록 적절한 예외를 발생시킵니다.

@node 막간극 에러와 예외,예제로 돌아가기,간단한 예,C나 C++로 파이썬 확장하기
@anchor{extending/extending extending-errors}@anchor{4ed4}@anchor{extending/extending intermezzo-errors-and-exceptions}@anchor{4ed5}
@subsubsection 막간극: 에러와 예외


파이썬 인터프리터 전체에서 중요한 규칙은 다음과 같습니다: 함수가 실패하면 예외 조건을 설정하고 에러값(보통 @code{-1}이나 @code{NULL} 포인터)을 반환해야 합니다. 예외 정보는 인터프리터의 스레드 상태의 세 멤버에 저장됩니다. 예외가 발생하지 않았으면 이들은 @code{NULL}입니다. 그렇지 않으면, @ref{899,,sys.exc_info()}가 반환하는 파이썬 튜플 멤버의 C 동등 물입니다. 이들은 예외 형, 예외 인스턴스, 트레이스백 객체입니다. 에러가 어떻게 전달되는지 이해하기 위해서는 이들에 대해 아는 것이 중요합니다.

파이썬 API는 다양한 형의 예외를 설정하기 위한 여러 함수를 정의합니다.

가장 일반적인 것은 @ref{79b,,PyErr_SetString()}입니다. 인자는 예외 객체와 C 문자열입니다. 예외 객체는 보통 @ref{4ed6,,PyExc_ZeroDivisionError}와 같은 미리 정의된 객체입니다. C 문자열은 에러의 원인을 나타내며 파이썬 문자열 객체로 변환되어 예외의 “연관된 값”으로 저장됩니다.

또 다른 유용한 함수는 @ref{4ed7,,PyErr_SetFromErrno()}입니다. 이 함수는 예외 인자만 취하고 전역 변수 @code{errno}를 검사하여 관련 값을 구성합니다. 가장 일반적인 함수는 @ref{79a,,PyErr_SetObject()}이며, 예외와 관련 값인 두 개의 객체 인자를 취합니다. 이러한 함수들에 전달되는 객체를 @ref{78e,,Py_INCREF()} 할 필요는 없습니다.

@ref{1cac,,PyErr_Occurred()}로 예외가 설정되어 있는지 비 파괴적으로 검사할 수 있습니다. 현재 예외 객체나 예외가 발생하지 않았으면 @code{NULL}을 반환합니다. 반환 값에서 알 수 있어야 해서 일반적으로 함수 호출에서 에러가 발생했는지 확인하기 위해 @code{PyErr_Occurred()}를 호출할 필요는 없습니다.

다른 함수 `g'를 호출하는 함수 `f'가 `g'의 실패를 감지할 때, `f' 자체가 에러값(보통 @code{NULL}이나 @code{-1})을 반환해야 합니다. @code{PyErr_*} 함수 중 하나를 호출하지 `않아야' 합니다 — `g'에 의해 이미 호출되었습니다. 그러면 `f'의 호출자도 역시 @code{PyErr_*} 호출 `없이', `자신의' 호출자에게 에러 표시를 반환하고, 이런 식으로 계속된다고 가정합니다 — 에러를 가장 먼저 감지한 함수에 의해 에러의 가장 자세한 원인이 이미 보고되었습니다. 일단 에러가 파이썬 인터프리터의 메인 루프에 도달하면, 현재 실행 중인 파이썬 코드를 중단하고 파이썬 프로그래머가 지정한 예외 처리기를 찾으려고 시도합니다.

(모듈이 실제로 다른 @code{PyErr_*} 함수를 호출하여 더 자세한 에러 메시지를 표시할 수 있는 상황이 있습니다. 그럴 때는 그렇게 하는 것이 좋습니다. 그러나, 일반적인 규칙으로 이는 필요하지 않고, 에러가 발생하는 원인에 관한 정보를 잃어버리게 합니다: 대부분의 연산은 다양한 이유로 실패할 수 있습니다.)

실패한 함수 호출로 설정된 예외를 무시하려면, @ref{1230,,PyErr_Clear()}를 호출하여 예외 조건을 명시적으로 지워야 합니다. C 코드가 @code{PyErr_Clear()}를 호출해야 하는 유일한 때는 에러를 인터프리터에 전달하지 않고 스스로 완전히 처리하려고 하는 경우입니다 (아마 다른 것을 시도하거나, 아무것도 잘못되지 않은 척해서).

모든 실패한 @code{malloc()} 호출은 예외로 전환되어야 합니다 — @code{malloc()}(또는 @code{realloc()})의 직접 호출자는 스스로 @ref{4ed8,,PyErr_NoMemory()}를 호출하고 실패 표시기를 반환해야 합니다. 모든 객체 생성 함수(예를 들어, @ref{1bce,,PyLong_FromLong()})는 이미 이 작업을 수행하므로, 이 주의는 @code{malloc()}을 직접 호출하는 호출자에게만 해당합니다.

또한 @ref{3c1,,PyArg_ParseTuple()}과 그 친구들의 중요한 예외를 제외하고, 정수 상태를 반환하는 함수는 유닉스 시스템 호출처럼 일반적으로 성공 시 양수 값이나 0을 반환하고, 실패 시 @code{-1}을 반환합니다.

마지막으로, 에러 표시기를 반환할 때 (이미 만든 객체를 @ref{991,,Py_XDECREF()}나 @ref{78f,,Py_DECREF()}를 호출하여) 가비지를 정리하십시오!

어떤 예외를 발생시킬지는 전적으로 여러분의 것입니다. 모든 내장 파이썬 예외에 해당하는 사전 선언된 C 객체(가령 @ref{4ed6,,PyExc_ZeroDivisionError})가 있는데, 직접 사용할 수 있습니다. 물론, 예외를 현명하게 선택해야 합니다 — 파일을 열 수 없음을 뜻하는 데 @ref{4ed9,,PyExc_TypeError}를 사용하지 마십시오 (아마도 @ref{4eda,,PyExc_OSError}여야 합니다). 인자 목록에 문제가 있으면, @ref{3c1,,PyArg_ParseTuple()} 함수는 일반적으로 @code{PyExc_TypeError}를 발생시킵니다. 값이 특정 범위 내에 있어야 하거나 다른 조건을 만족해야 하는 인자가 있으면, @ref{4edb,,PyExc_ValueError}가 적합합니다.

You can also define a new exception that is unique to your module.
The simplest way to do this is to declare a static global object variable at
the beginning of the file:

@example
static PyObject *SpamError = NULL;
@end example

and initialize it by calling @ref{146e,,PyErr_NewException()} in the module’s
@ref{b75,,Py_mod_exec} function (@code{spam_module_exec()}):

@example
SpamError = PyErr_NewException("spam.error", NULL, NULL);
@end example

Since @code{SpamError} is a global variable, it will be overwritten every time
the module is reinitialized, when the @ref{b75,,Py_mod_exec} function is called.

For now, let’s avoid the issue: we will block repeated initialization by raising an
@ref{659,,ImportError}:

@example
static PyObject *SpamError = NULL;

static int
spam_module_exec(PyObject *m)
@{
    if (SpamError != NULL) @{
        PyErr_SetString(PyExc_ImportError,
                        "cannot initialize spam module more than once");
        return -1;
    @}
    SpamError = PyErr_NewException("spam.error", NULL, NULL);
    if (PyModule_AddObjectRef(m, "SpamError", SpamError) < 0) @{
        return -1;
    @}

    return 0;
@}

static PyModuleDef_Slot spam_module_slots[] = @{
    @{Py_mod_exec, spam_module_exec@},
    @{0, NULL@}
@};

static struct PyModuleDef spam_module = @{
    .m_base = PyModuleDef_HEAD_INIT,
    .m_name = "spam",
    .m_size = 0,  // non-negative
    .m_slots = spam_module_slots,
@};

PyMODINIT_FUNC
PyInit_spam(void)
@{
    return PyModuleDef_Init(&spam_module);
@}
@end example

예외 객체의 파이썬 이름은 @code{spam.error}임에 유의하십시오. @ref{146e,,PyErr_NewException()} 함수는 (@code{NULL} 대신 다른 클래스가 전달되지 않는 한) 베이스 클래스가 (@ref{1c25,,내장 예외}에서 설명된) @ref{bcc,,Exception}인 클래스를 만들 수 있습니다.

@code{SpamError} 변수는 새로 만들어진 예외 클래스에 대한 참조를 보유함에도 유의하십시오; 이것은 의도적입니다! 외부 코드에 의해 예외가 모듈에서 제거될 수 있기 때문에, 클래스가 버려져서 @code{SpamError}가 매달린(dangling) 포인터가 되지 않도록 하려면, 클래스에 대한 참조를 소유할 필요가 있습니다. 매달린 포인터가 되면, 예외를 발생시키는 C 코드가 코어 덤프나 다른 의도하지 않은 부작용을 일으킬 수 있습니다.

For now, the @ref{78f,,Py_DECREF()} call to remove this reference is missing.
Even when the Python interpreter shuts down, the global @code{SpamError}
variable will not be garbage-collected. It will “leak”.
We did, however, ensure that this will happen at most once per process.

이 샘플의 뒷부분에서 @ref{16d8,,PyMODINIT_FUNC}를 함수 반환형으로 사용하는 것에 관해 설명합니다.

다음과 같이 @ref{79b,,PyErr_SetString()}을 호출하여 확장 모듈에서 @code{spam.error} 예외를 발생시킬 수 있습니다:

@example
static PyObject *
spam_system(PyObject *self, PyObject *args)
@{
    const char *command;
    int sts;

    if (!PyArg_ParseTuple(args, "s", &command))
        return NULL;
    sts = system(command);
    if (sts < 0) @{
        PyErr_SetString(SpamError, "System command failed");
        return NULL;
    @}
    return PyLong_FromLong(sts);
@}
@end example

@node 예제로 돌아가기,모듈의 메서드 테이블과 초기화 함수,막간극 에러와 예외,C나 C++로 파이썬 확장하기
@anchor{extending/extending back-to-the-example}@anchor{4edc}@anchor{extending/extending backtoexample}@anchor{4edd}
@subsubsection 예제로 돌아가기


예제 함수로 돌아가서, 이제 여러분은 이 문장을 이해할 수 있어야 합니다:

@example
if (!PyArg_ParseTuple(args, "s", &command))
    return NULL;
@end example

인자 목록에서 에러가 발견되면 @ref{3c1,,PyArg_ParseTuple()}에 의해 설정된 예외에 의존하면서 @code{NULL}(객체 포인터를 반환하는 함수의 에러 표시기)을 반환합니다. 그렇지 않으면 인자의 문자열 값이 지역 변수 @code{command}에 복사되었습니다. 이것은 포인터 대입이며 가리키는 문자열을 수정해서는 안 됩니다 (따라서 표준 C에서, 변수 @code{command}는 @code{const char *command}로 올바르게 선언되어야 합니다).

다음 문장은 유닉스 함수 @code{system()}을 호출인데, @ref{3c1,,PyArg_ParseTuple()}에서 얻은 문자열을 전달합니다:

@example
sts = system(command);
@end example

우리의 @code{spam.system()} 함수는 @code{sts}의 값을 파이썬 객체로 반환해야 합니다. 이것은 @ref{1bce,,PyLong_FromLong()} 함수를 사용하여 이루어집니다.

@example
return PyLong_FromLong(sts);
@end example

이 경우, 정수 객체를 반환합니다. (예, 정수조차도 파이썬에서는 힙 상의 객체입니다!)

유용한 인자를 반환하지 않는 C 함수(void를 반환하는 함수)가 있으면, 해당 파이썬 함수는 @code{None}을 반환해야 합니다. 그렇게 하려면 이 관용구가 필요합니다 (@ref{1678,,Py_RETURN_NONE} 매크로로 구현됩니다):

@example
Py_INCREF(Py_None);
return Py_None;
@end example

@ref{4ede,,Py_None}은 특수 파이썬 객체 @code{None}의 C 이름입니다. 앞에서 보았듯이, 대부분의 상황에서 “에러”를 뜻하는 @code{NULL} 포인터가 아니라 진짜 파이썬 객체입니다.

@node 모듈의 메서드 테이블과 초기화 함수,컴파일과 링크,예제로 돌아가기,C나 C++로 파이썬 확장하기
@anchor{extending/extending methodtable}@anchor{4edf}@anchor{extending/extending the-module-s-method-table-and-initialization-function}@anchor{4ee0}
@subsubsection 모듈의 메서드 테이블과 초기화 함수


파이썬 프로그램에서 @code{spam_system()}이 어떻게 호출되는지 보여 주겠다고 약속했습니다. 먼저, “메서드 테이블”에 이름과 주소를 나열해야 합니다:

@example
static PyMethodDef spam_methods[] = @{
    ...
    @{"system",  spam_system, METH_VARARGS,
     "Execute a shell command."@},
    ...
    @{NULL, NULL, 0, NULL@}        /* Sentinel */
@};
@end example

세 번째 항목 (@code{METH_VARARGS})에 유의하십시오. 이것은 인터프리터에게 C 함수에 사용될 호출 규칙을 알려주는 플래그입니다. 일반적으로 항상 @code{METH_VARARGS}나 @code{METH_VARARGS | METH_KEYWORDS}여야 합니다; @code{0} 값은 더는 사용되지 않는 @ref{3c1,,PyArg_ParseTuple()} 변형이 사용됨을 의미합니다.

@code{METH_VARARGS} 만 사용할 때, 함수는 파이썬 수준 매개 변수가 @ref{3c1,,PyArg_ParseTuple()}을 통한 구문 분석에 허용되는 튜플로 전달될 것으로 기대해야 합니다; 이 함수에 대한 자세한 정보는 아래에 제공됩니다.

키워드 인자를 함수에 전달해야 하면, 세 번째 필드에서 @ref{4ee1,,METH_KEYWORDS} 비트를 설정할 수 있습니다. 이 경우, C 함수는 키워드 딕셔너리가 될 세 번째 @code{PyObject *} 매개 변수를 받아들여야 합니다. 이러한 함수에는 @ref{622,,PyArg_ParseTupleAndKeywords()}를 사용하여 인자를 구문 분석하십시오.

메서드 테이블은 모듈 정의 구조체에서 참조되어야 합니다:

@example
static struct PyModuleDef spam_module = @{
    ...
    .m_methods = spam_methods,
    ...
@};
@end example

다시, 이 구조체는 모듈의 초기화 함수에서 인터프리터로 전달되어야 합니다. 초기화 함수의 이름은 @code{PyInit_name()}이어야 합니다, 여기서 `name'은 모듈의 이름이며, 모듈 파일에 정의된 유일한 비 @code{static} 항목이어야 합니다:

@example
PyMODINIT_FUNC
PyInit_spam(void)
@{
    return PyModuleDef_Init(&spam_module);
@}
@end example

@ref{16d8,,PyMODINIT_FUNC}는 함수를 @code{PyObject *} 반환형으로 선언하고, 플랫폼에 필요한 특수 링크 선언을 선언하며, C++의 경우 함수를 @code{extern "C"}로 선언함에 유의하십시오.

@code{PyInit_spam()} is called when each interpreter imports its module
@code{spam} for the first time.  (See below for comments about embedding Python.)
A pointer to the module definition must be returned via @ref{4ee2,,PyModuleDef_Init()},
so that the import machinery can create the module and store it in @code{sys.modules}.

When embedding Python, the @code{PyInit_spam()} function is not called
automatically unless there’s an entry in the @ref{1b19,,PyImport_Inittab} table.
To add the module to the initialization table, use @ref{1b1a,,PyImport_AppendInittab()},
optionally followed by an import of the module:

@example
#define PY_SSIZE_T_CLEAN
#include <Python.h>

int
main(int argc, char *argv[])
@{
    PyStatus status;
    PyConfig config;
    PyConfig_InitPythonConfig(&config);

    /* Py_Initialize 앞에 내장 모듈을 추가합니다 */
    if (PyImport_AppendInittab("spam", PyInit_spam) == -1) @{
        fprintf(stderr, "Error: could not extend in-built modules table\n");
        exit(1);
    @}

    /* 파이썬 인터프리터로 argv[0] 을 전달합니다 */
    status = PyConfig_SetBytesString(&config, &config.program_name, argv[0]);
    if (PyStatus_Exception(status)) @{
        goto exception;
    @}

    /* 파이썬 인터프리터를 초기화합니다. 필수.
       이 단계가 실패하면, 치명적인 에러가 됩니다. */
    status = Py_InitializeFromConfig(&config);
    if (PyStatus_Exception(status)) @{
        goto exception;
    @}
    PyConfig_Clear(&config);

    /* 선택적으로 모듈을 임포트 합니다; 또는,
       내장된 스크립트가 임포트할 때까지 임포트를
       지연시킬 수 있습니다. */
    PyObject *pmodule = PyImport_ImportModule("spam");
    if (!pmodule) @{
        PyErr_Print();
        fprintf(stderr, "Error: could not import module 'spam'\n");
    @}

    // ... 여기서 파이썬 C API 를 사용합니다 ...

    return 0;

  exception:
     PyConfig_Clear(&config);
     Py_ExitStatusException(status);
@}
@end example

@cartouche
@quotation 참고 
If you declare a global variable or a local static one, the module may
experience unintended side-effects on re-initialisation, for example when
removing entries from @code{sys.modules} or importing compiled modules into
multiple interpreters within a process
(or following a @code{fork()} without an intervening @code{exec()}).
If module state is not yet fully @ref{166,,isolated},
authors should consider marking the module as having no support for subinterpreters
(via @ref{4ee3,,Py_MOD_MULTIPLE_INTERPRETERS_NOT_SUPPORTED}).
@end quotation
@end cartouche

A more substantial example module is included in the Python source distribution
as @code{Modules/xxlimited.c}.  This file may be used as a template or simply
read as an example.

@node 컴파일과 링크,C에서 파이썬 함수 호출하기,모듈의 메서드 테이블과 초기화 함수,C나 C++로 파이썬 확장하기
@anchor{extending/extending compilation}@anchor{4ee4}@anchor{extending/extending compilation-and-linkage}@anchor{4ee5}
@subsubsection 컴파일과 링크


새로운 확장을 사용하기 전에 해야 할 두 가지 작업이 더 있습니다: 컴파일과 파이썬 시스템과의 링크. 동적 로딩을 사용하면, 세부 사항은 시스템이 사용하는 동적 로딩 스타일에 따라 달라질 수 있습니다; 확장 모듈을 빌드하는 것에 관한 장(@ref{4ee6,,C와 C++ 확장 빌드하기} 장)과 윈도우 빌드에 대한 자세한 정보는 이에만 관련된 추가 정보(@ref{2221,,윈도우에서 C와 C++ 확장 빌드하기} 장)를 참조하십시오.

동적 로딩을 사용할 수 없거나, 모듈을 파이썬 인터프리터의 영구적인 부분으로 만들려면, 구성 설정을 변경하고 인터프리터를 다시 빌드해야 합니다. 운 좋게도, 이것은 유닉스에서 매우 간단합니다: 압축을 푼 소스 배포의 @code{Modules/} 디렉터리에 파일(예를 들어 @code{spammodule.c})을 놓고, @code{Modules/Setup.local} 파일에 여러분의 파일을 기술하는 한 줄을 추가하십시오:

@example
spam spammodule.o
@end example

그리고 최상위 디렉터리에서 @code{make}를 실행하여 인터프리터를 다시 빌드하십시오. @code{Modules/} 서브 디렉터리에서 @code{make}를 실행할 수도 있지만, 먼저 ‘@code{make} Makefile’을 실행하여 @code{Makefile}을 다시 빌드해야 합니다. (이것은 @code{Setup} 파일을 변경할 때마다 필요합니다.)

모듈에 링크할 추가 라이브러리가 필요하면, 이것도 구성 파일의 줄에 나열될 수 있습니다, 예를 들어:

@example
spam spammodule.o -lX11
@end example

@node C에서 파이썬 함수 호출하기,확장 함수에서 매개 변수 추출하기,컴파일과 링크,C나 C++로 파이썬 확장하기
@anchor{extending/extending calling-python-functions-from-c}@anchor{4ee7}@anchor{extending/extending callingpython}@anchor{4ee8}
@subsubsection C에서 파이썬 함수 호출하기


지금까지 파이썬에서 C 함수를 호출할 수 있도록 하는 데 집중했습니다. 그 반대도 유용합니다: C에서 파이썬 함수 호출하기. 이것은 특히 “콜백” 함수를 지원하는 라이브러리의 경우에 해당합니다. C 인터페이스가 콜백을 사용하면, 동등한 파이썬은 종종 파이썬 프로그래머에게 콜백 메커니즘을 제공해야 할 필요가 있습니다; 구현은 C 콜백에서 파이썬 콜백 함수를 호출해야 합니다. 다른 용도도 상상할 수 있습니다.

다행히, 파이썬 인터프리터는 재귀적으로 쉽게 호출되며, 파이썬 함수를 호출하는 표준 인터페이스가 있습니다. (특정 문자열을 입력으로 파이썬 파서를 호출하는 방법에 대해서는 다루지 않겠습니다 — 관심이 있다면, 파이썬 소스 코드에서 @code{Modules/main.c}의 @ref{1a8,,-c} 명령 줄 옵션 구현을 살펴보십시오.)

파이썬 함수를 호출하기는 쉽습니다. 먼저, 파이썬 프로그램은 어떻게 든 여러분에게 파이썬 함수 객체를 전달해야 합니다. 이를 위해 함수(또는 다른 인터페이스)를 제공해야 합니다. 이 함수가 호출될 때, 전역 변수(또는 여러분이 보기에 적절한 곳 어디에나)에 파이썬 함수 객체에 대한 포인터를 저장하십시오 (@ref{78e,,Py_INCREF()}해야 하는 것에 주의하십시오!). 예를 들어, 다음 함수는 모듈 정의의 일부일 수 있습니다:

@example
static PyObject *my_callback = NULL;

static PyObject *
my_set_callback(PyObject *dummy, PyObject *args)
@{
    PyObject *result = NULL;
    PyObject *temp;

    if (PyArg_ParseTuple(args, "O:set_callback", &temp)) @{
        if (!PyCallable_Check(temp)) @{
            PyErr_SetString(PyExc_TypeError, "parameter must be callable");
            return NULL;
        @}
        Py_XINCREF(temp);         /* 새 콜백에 대한 참조를 추가합니다 */
        Py_XDECREF(my_callback);  /* 이전 콜백을 제거합니다 */
        my_callback = temp;       /* 새 콜백을 기억합니다 */
        /* "None" 을 반환하는 보일러 플레이트 */
        Py_INCREF(Py_None);
        result = Py_None;
    @}
    return result;
@}
@end example

이 함수는 @ref{170d,,METH_VARARGS} 플래그를 사용하여 인터프리터에 등록해야 합니다; 이것은 섹션 @ref{4edf,,모듈의 메서드 테이블과 초기화 함수}에 설명되어 있습니다. @ref{3c1,,PyArg_ParseTuple()} 함수와 그것의 인자는 @ref{4ee9,,확장 함수에서 매개 변수 추출하기} 섹션에 설명되어 있습니다.

매크로 @ref{c59,,Py_XINCREF()}와 @ref{991,,Py_XDECREF()}는 객체의 참조 횟수를 증가/감소시키며 @code{NULL} 포인터가 있을 때 안전합니다 (그러나 이 문맥에서 `temp'는 @code{NULL}이 아님에 유의하십시오). 섹션 @ref{4eea,,참조 횟수}에 이에 대한 자세한 정보가 있습니다.

@geindex PyObject_CallObject (C 함수)

나중에, 함수를 호출할 때, C 함수 @ref{4eeb,,PyObject_CallObject()}를 호출합니다. 이 함수에는 두 개의 인자가 있는데, 모두 임의의 파이썬 객체에 대한 포인터입니다: 파이썬 함수와 인자 목록. 인자 목록은 항상 길이가 인자의 수인 튜플 객체여야 합니다. 인자 없이 파이썬 함수를 호출하려면, @code{NULL}이나 빈 튜플을 전달하십시오; 하나의 인자로 호출하려면, 단 항목 튜플을 전달하십시오. @ref{3c2,,Py_BuildValue()}는 포맷 문자열이 괄호 사이에 0개 이상의 포맷 코드로 구성되었을 때 튜플을 반환합니다. 예를 들면:

@example
int arg;
PyObject *arglist;
PyObject *result;
...
arg = 123;
...
/* 콜백을 호출할 시간입니다 */
arglist = Py_BuildValue("(i)", arg);
result = PyObject_CallObject(my_callback, arglist);
Py_DECREF(arglist);
@end example

@ref{4eeb,,PyObject_CallObject()}는 파이썬 객체 포인터를 반환합니다: 이것은 파이썬 함수의 반환 값입니다. @code{PyObject_CallObject()}는 인자와 관련하여 “참조 횟수 중립적”입니다. 이 예에서는 @code{PyObject_CallObject()} 호출 직후 @ref{78f,,Py_DECREF()}되는 인자 목록으로 사용할 새 튜플이 만들어졌습니다.

@ref{4eeb,,PyObject_CallObject()}의 반환 값은 “새것”입니다: 완전히 새로운 객체이거나 참조 횟수가 증가한 기존 객체입니다. 따라서, 전역 변수에 저장하려는 것이 아닌 한, 설사 (특히!) 그 값에 관심이 없더라도 결과를 @ref{78f,,Py_DECREF()}해야 합니다.

그러나, 이 작업을 수행하기 전에 반환 값이 @code{NULL}이 아닌지 확인해야 합니다. 그렇다면, 파이썬 함수는 예외를 발생 시켜 종료한 것입니다. @ref{4eeb,,PyObject_CallObject()}라는 C 코드가 파이썬에서 호출되었다면 이제 파이썬 호출자에게 에러 표시를 반환하여, 인터프리터가 스택 트레이스를 인쇄하거나 호출하는 파이썬 코드가 예외를 처리할 수 있도록 합니다. 이것이 불가능하거나 바람직하지 않으면, @ref{1230,,PyErr_Clear()}를 호출하여 예외를 지워야 합니다. 예를 들면:

@example
if (result == NULL)
    return NULL; /* 에러를 돌려줍니다 */
...use result...
Py_DECREF(result);
@end example

파이썬 콜백 함수에 대해 원하는 인터페이스에 따라, @ref{4eeb,,PyObject_CallObject()}에 인자 목록을 제공해야 할 수도 있습니다. 때에 따라 인자 목록은 콜백 함수를 지정한 같은 인터페이스를 통해 파이썬 프로그램에서 제공됩니다. 그런 다음 함수 객체와 같은 방식으로 저장하고 사용할 수 있습니다. 다른 경우에는, 인자 목록으로 전달할 새 튜플을 구성해야 할 수도 있습니다. 이렇게 하는 가장 간단한 방법은 @ref{3c2,,Py_BuildValue()}를 호출하는 것입니다. 예를 들어, 정수 이벤트 코드를 전달하려면, 다음 코드를 사용할 수 있습니다:

@example
PyObject *arglist;
...
arglist = Py_BuildValue("(l)", eventcode);
result = PyObject_CallObject(my_callback, arglist);
Py_DECREF(arglist);
if (result == NULL)
    return NULL; /* 에러를 돌려줍니다 */
/* 여기서 아마도 result를 사용합니다 */
Py_DECREF(result);
@end example

호출 직후, 에러 점검 전에 @code{Py_DECREF(arglist)}의 배치에 유의하십시오! 또한 엄격하게 말하면 이 코드가 완전하지 않음에도 유의하십시오: @ref{3c2,,Py_BuildValue()}에 메모리가 부족할 수 있어서 확인해야 합니다.

인자와 키워드 인자를 지원하는 @ref{63b,,PyObject_Call()}을 사용하여 키워드 인자가 있는 함수를 호출할 수도 있습니다. 위의 예에서와같이, @ref{3c2,,Py_BuildValue()}를 사용하여 딕셔너리를 구성합니다.

@example
PyObject *dict;
...
dict = Py_BuildValue("@{s:i@}", "name", val);
result = PyObject_Call(my_callback, NULL, dict);
Py_DECREF(dict);
if (result == NULL)
    return NULL; /* 에러를 돌려줍니다 */
/* 여기서 아마도 result를 사용합니다 */
Py_DECREF(result);
@end example

@node 확장 함수에서 매개 변수 추출하기,확장 함수를 위한 키워드 매개 변수,C에서 파이썬 함수 호출하기,C나 C++로 파이썬 확장하기
@anchor{extending/extending extracting-parameters-in-extension-functions}@anchor{4eec}@anchor{extending/extending parsetuple}@anchor{4ee9}
@subsubsection 확장 함수에서 매개 변수 추출하기


@geindex PyArg_ParseTuple (C 함수)

@ref{3c1,,PyArg_ParseTuple()} 함수는 다음과 같이 선언됩니다:

@example
int PyArg_ParseTuple(PyObject *arg, const char *format, ...);
@end example

`arg' 인자는 파이썬에서 C 함수로 전달되는 인자 목록이 포함된 튜플 객체여야 합니다. `format' 인자는 포맷 문자열이어야 하며, 문법은 파이썬/C API 레퍼런스 매뉴얼의 @ref{3d5,,인자 구문 분석과 값 구축}에 설명되어 있습니다. 나머지 인자는 포맷 문자열에 의해 형이 결정되는 변수의 주소여야 합니다.

@ref{3c1,,PyArg_ParseTuple()}은 파이썬 인자가 요구되는 형인지 확인하지만, 호출에 전달된 C 변수 주소의 유효성을 확인할 수는 없습니다: 실수를 하면, 코드가 충돌하거나 적어도 메모리의 임의 비트를 덮어씁니다. 그러니 조심하십시오!

호출자에게 제공되는 모든 파이썬 객체 참조는 `빌려온(borrowed)' 참조임에 유의하십시오; 참조 횟수를 줄이지 마십시오!

몇 가지 예제 호출:

@example
#define PY_SSIZE_T_CLEAN
#include <Python.h>
@end example

@example
int ok;
int i, j;
long k, l;
const char *s;
Py_ssize_t size;

ok = PyArg_ParseTuple(args, ""); /* 인자가 없습니다 */
    /* 파이썬 호출: f() */
@end example

@example
ok = PyArg_ParseTuple(args, "s", &s); /* 문자열 */
    /* 가능한 파이썬 호출: f('whoops!') */
@end example

@example
ok = PyArg_ParseTuple(args, "lls", &k, &l, &s); /* 두 개의 long과 문자열 */
    /* 가능한 파이썬 호출: f(1, 2, 'three') */
@end example

@example
ok = PyArg_ParseTuple(args, "(ii)s#", &i, &j, &s, &size);
    /* int 쌍과 문자열, 문자열의 크기도 반환됩니다 */
    /* 가능한 파이썬 호출: f((1, 2), 'three') */
@end example

@example
@{
    const char *file;
    const char *mode = "r";
    int bufsize = 0;
    ok = PyArg_ParseTuple(args, "s|si", &file, &mode, &bufsize);
    /* 문자열, 그리고 선택적으로 또 다른 문자열과 정수 */
    /* 가능한 파이썬 호출:
       f('spam')
       f('spam', 'w')
       f('spam', 'wb', 100000) */
@}
@end example

@example
@{
    int left, top, right, bottom, h, v;
    ok = PyArg_ParseTuple(args, "((ii)(ii))(ii)",
             &left, &top, &right, &bottom, &h, &v);
    /* 직사각형과 점 */
    /* 가능한 파이썬 호출:
       f(((0, 0), (400, 300)), (10, 10)) */
@}
@end example

@example
@{
    Py_complex c;
    ok = PyArg_ParseTuple(args, "D:myfunction", &c);
    /* 복소수, 에러를 위한 함수 이름도 제공합니다 */
    /* 가능한 파이썬 호출: myfunction(1+2j) */
@}
@end example

@node 확장 함수를 위한 키워드 매개 변수,임의의 값을 구축하기,확장 함수에서 매개 변수 추출하기,C나 C++로 파이썬 확장하기
@anchor{extending/extending keyword-parameters-for-extension-functions}@anchor{4eed}@anchor{extending/extending parsetupleandkeywords}@anchor{4eee}
@subsubsection 확장 함수를 위한 키워드 매개 변수


@geindex PyArg_ParseTupleAndKeywords (C 함수)

@ref{622,,PyArg_ParseTupleAndKeywords()} 함수는 다음과 같이 선언됩니다:

@example
int PyArg_ParseTupleAndKeywords(PyObject *arg, PyObject *kwdict,
                                const char *format, char * const *kwlist, ...);
@end example

`arg'와 `format' 매개 변수는 @ref{3c1,,PyArg_ParseTuple()} 함수와 동일합니다. `kwdict' 매개 변수는 파이썬 런타임에서 세 번째 매개 변수로 수신된 키워드 딕셔너리입니다. `kwlist' 매개 변수는 매개 변수를 식별하는 문자열의 @code{NULL} 종료 목록입니다; 이름은 왼쪽에서 오른쪽으로 `format'의 형 정보와 일치합니다. 성공하면, @ref{622,,PyArg_ParseTupleAndKeywords()}는 참을 반환하고, 그렇지 않으면 거짓을 반환하고 적절한 예외를 발생시킵니다.

@cartouche
@quotation 참고 
키워드 인자를 사용할 때 중첩된 튜플을 구문분석할 수 없습니다! `kwlist'에 없는 키워드 매개 변수가 전달되면 @ref{198,,TypeError}를 발생시킵니다.
@end quotation
@end cartouche

@geindex Philbrick@comma{} Geoff

다음은 Geoff Philbrick (@email{philbrick@@hks.com}) 의 예제를 기반으로 한, 키워드를 사용하는 예제 모듈입니다:

@example
#define PY_SSIZE_T_CLEAN
#include <Python.h>

static PyObject *
keywdarg_parrot(PyObject *self, PyObject *args, PyObject *keywds)
@{
    int voltage;
    const char *state = "a stiff";
    const char *action = "voom";
    const char *type = "Norwegian Blue";

    static char *kwlist[] = @{"voltage", "state", "action", "type", NULL@};

    if (!PyArg_ParseTupleAndKeywords(args, keywds, "i|sss", kwlist,
                                     &voltage, &state, &action, &type))
        return NULL;

    printf("-- This parrot wouldn't %s if you put %i Volts through it.\n",
           action, voltage);
    printf("-- Lovely plumage, the %s -- It's %s!\n", type, state);

    Py_RETURN_NONE;
@}

static PyMethodDef keywdarg_methods[] = @{
    /* The cast of the function is necessary since PyCFunction values
     * only take two PyObject* parameters, and keywdarg_parrot() takes
     * three.
     */
    @{"parrot", (PyCFunction)(void(*)(void))keywdarg_parrot, METH_VARARGS | METH_KEYWORDS,
     "Print a lovely skit to standard output."@},
    @{NULL, NULL, 0, NULL@}   /* sentinel */
@};

static struct PyModuleDef keywdarg_module = @{
    .m_base = PyModuleDef_HEAD_INIT,
    .m_name = "keywdarg",
    .m_size = 0,
    .m_methods = keywdarg_methods,
@};

PyMODINIT_FUNC
PyInit_keywdarg(void)
@{
    return PyModuleDef_Init(&keywdarg_module);
@}
@end example

@node 임의의 값을 구축하기,참조 횟수,확장 함수를 위한 키워드 매개 변수,C나 C++로 파이썬 확장하기
@anchor{extending/extending building-arbitrary-values}@anchor{4eef}@anchor{extending/extending buildvalue}@anchor{4ef0}
@subsubsection 임의의 값을 구축하기


이 함수는 @ref{3c1,,PyArg_ParseTuple()}의 반대입니다. 다음과 같이 선언됩니다:

@example
PyObject *Py_BuildValue(const char *format, ...);
@end example

@ref{3c1,,PyArg_ParseTuple()}에서 인식되는 것과 유사한 포맷 단위 집합을 인식하지만, 인자(함수의 출력이 아니라 입력입니다)는 포인터가 아니라 그냥 값이어야 합니다. 파이썬에서 호출한 C 함수에서 반환하기에 적합한 새 파이썬 객체를 반환합니다.

@ref{3c1,,PyArg_ParseTuple()}과의 한 가지 차이점: 후자는 첫 번째 인자가 튜플이어야 하지만 (파이썬 인자 목록은 항상 내부적으로 튜플로 표현되기 때문입니다), @ref{3c2,,Py_BuildValue()}는 항상 튜플을 빌드하지는 않습니다. 포맷 문자열에 둘 이상의 포맷 단위가 포함된 경우에만 튜플을 빌드합니다. 포맷 문자열이 비어 있으면 @code{None}을 반환합니다; 정확히 하나의 포맷 단위를 포함하면, 그것이 무엇이건 해당 포맷 단위가 기술하는 객체를 반환합니다. 크기가 0이나 1인 튜플을 강제로 반환하도록 하려면, 포맷 문자열을 괄호로 묶으십시오.

예제 (왼쪽은 호출이고, 오른쪽은 결과 파이썬 값입니다):

@example
Py_BuildValue("")                        None
Py_BuildValue("i", 123)                  123
Py_BuildValue("iii", 123, 456, 789)      (123, 456, 789)
Py_BuildValue("s", "hello")              'hello'
Py_BuildValue("y", "hello")              b'hello'
Py_BuildValue("ss", "hello", "world")    ('hello', 'world')
Py_BuildValue("s#", "hello", 4)          'hell'
Py_BuildValue("y#", "hello", 4)          b'hell'
Py_BuildValue("()")                      ()
Py_BuildValue("(i)", 123)                (123,)
Py_BuildValue("(ii)", 123, 456)          (123, 456)
Py_BuildValue("(i,i)", 123, 456)         (123, 456)
Py_BuildValue("[i,i]", 123, 456)         [123, 456]
Py_BuildValue("@{s:i,s:i@}",
              "abc", 123, "def", 456)    @{'abc': 123, 'def': 456@}
Py_BuildValue("((ii)(ii)) (ii)",
              1, 2, 3, 4, 5, 6)          (((1, 2), (3, 4)), (5, 6))
@end example

@node 참조 횟수,C++로 확장 작성하기,임의의 값을 구축하기,C나 C++로 파이썬 확장하기
@anchor{extending/extending refcounts}@anchor{4eea}@anchor{extending/extending reference-counts}@anchor{4ef1}
@subsubsection 참조 횟수


C나 C++ 와 같은 언어에서, 힙에서 메모리의 동적 할당과 할당 해제하는 것은 프로그래머가 담당합니다. C에서는, @code{malloc()}과 @code{free()} 함수를 사용하여 이 작업을 수행합니다. C++에서는, 연산자 @code{new}와 @code{delete}는 본질적으로 같은 의미로 사용되며 우리는 뒤따르는 논의를 C의 경우로 제한하겠습니다.

@code{malloc()}으로 할당된 모든 메모리 블록은 @code{free()}를 정확히 한 번 호출하여 사용 가능한 메모리 풀로 반환되어야 합니다. 적시에 @code{free()}를 호출하는 것이 중요합니다. 블록의 주소를 잊어버렸지만, @code{free()}를 호출하지 않으면 프로그램이 종료될 때까지 블록을 차지하는 메모리를 재사용할 수 없습니다. 이것을 `메모리 누수(memory leak)'라고 합니다. 반면에, 프로그램이 블록에 대해 @code{free()}를 호출한 다음 블록을 계속 사용하면, 다른 @code{malloc()} 호출을 통해 블록을 재사용할 때 충돌이 발생합니다. 이것을 `해제된 메모리 사용하기(using freed memory)'라고 합니다. 초기화되지 않은 데이터를 참조하는 것과 같은 나쁜 결과를 초래합니다 — 코어 덤프, 잘못된 결과, 미스테리한 충돌.

메모리 누수의 일반적인 원인은 코드를 통한 비정상적인 경로입니다. 예를 들어, 함수는 메모리 블록을 할당하고, 어떤 계산을 한 다음, 블록을 다시 해제할 수 있습니다. 이제 함수에 대한 요구 사항이 변경되어 에러 조건을 감지하는 계산에 대한 검사를 추가하고 함수가 조기에 반환할 수 있도록 합니다. 이 조기 탈출을 수행할 때, 특히 나중에 코드에 추가될 때, 할당된 메모리 블록을 해제하는 것을 잊어버리기 쉽습니다. 이러한 누수는 일단 만들어지면 종종 오랫동안 탐지되지 않습니다: 에러 탈출은 전체 호출의 작은 부분에서만 이루어지며, 대부분의 최신 시스템에는 많은 가상 메모리가 있어서, 누수 하는 함수를 자주 사용하는 오래 실행되는 프로세스에서만 누수가 나타납니다. 따라서, 이런 종류의 에러를 코딩 규칙이나 전략을 통해 누수가 발생하지 않도록 하는 것이 중요합니다.

파이썬은 @code{malloc()}과 @code{free()}를 많이 사용하기 때문에, 메모리 누수와 해제된 메모리 사용을 피하는 전략이 필요합니다. 선택된 방법을 `참조 횟수 세기(reference counting)'라고 합니다. 원리는 간단합니다: 모든 객체에는 카운터를 포함합니다, 카운터는 객체에 대한 참조가 어딘가에 저장될 때 증가하고, 참조가 삭제될 때 감소합니다. 카운터가 0에 도달하면, 객체에 대한 마지막 참조가 삭제된 것이고 객체가 해제됩니다.

대체 전략을 `자동 가비지 수집(automatic garbage collection)'이라고 합니다. (때로는, 참조 횟수 세기도 가비지 수집 전략이라고 해서, 두 가지를 구별하기 위해 “자동”을 붙였습니다.) 자동 가비지 수집의 가장 큰 장점은 사용자가 @code{free()}를 명시적으로 호출할 필요가 없다는 것입니다. (또 다른 주장된 이점은 속도나 메모리 사용량의 개선이지만 — 이것은 견고한 사실이 아닙니다.) 단점은 C의 경우 참조 횟수 세기는 이식성 있게 구현할 수 있지만 (함수 @code{malloc()}과 @code{free()}를 사용할 수 있는 한 — 이는 C 표준이 보장합니다), 실제로 이식성 있는 자동 가비지 수집기가 없다는 것입니다. 언젠가 C를 위해 충분히 이식성 있는 자동 가비지 수집기를 사용할 수 있을 것입니다. 그때까지, 우리는 참조 횟수와 함께 살아야 할 것입니다.

파이썬은 전통적인 참조 횟수 세기 구현을 사용하지만, 참조 순환을 감지하는 순환 감지기도 제공합니다. 이를 통해 응용 프로그램은 직접적이거나 간접적인 순환 참조를  만드는 것(이것이 참조 횟수만 사용하여 구현된 가비지 수집의 약점입니다)에 대해 걱정하지 않아도 됩니다. 참조 순환은 (어쩌면 간접적으로) 자신에 대한 참조를 포함하는 객체로 구성되어서, 순환의 각 객체는 0이 아닌 참조 횟수를 갖습니다. 일반적인 참조 횟수 세기 구현에서는 순환 자체에 대한 추가 참조가 없더라도 참조 순환의 객체에 속하는 메모리나 순환에 속한 객체에서 참조된 메모리를 회수할 수 없습니다.

The cycle detector is able to detect garbage cycles and can reclaim them.
The @ref{64,,gc} module exposes a way to run the detector (the
@ref{1b3,,collect()} function), as well as configuration
interfaces and the ability to disable the detector at runtime.

@menu
* 파이썬에서 참조 횟수 세기:: 
* 소유권 규칙:: 
* 살얼음:: 
* NULL 포인터:: 

@end menu

@node 파이썬에서 참조 횟수 세기,소유권 규칙,,참조 횟수
@anchor{extending/extending refcountsinpython}@anchor{4ef2}@anchor{extending/extending reference-counting-in-python}@anchor{4ef3}
@subsubsection 파이썬에서 참조 횟수 세기


참조 횟수의 증가와 감소를 처리하는 두 개의 매크로 @code{Py_INCREF(x)}와 @code{Py_DECREF(x)}가 있습니다. @ref{78f,,Py_DECREF()}는 횟수가 0에 도달하면 객체를 해제하기도 합니다. 유연성을 위해, @code{free()}를 직접 호출하지 않습니다 — 대신, 객체의 `형 객체(type object)'에 있는 함수 포인터를 통해 호출합니다. 이 목적(및 기타)을 위해 모든 객체에는 해당 형 객체에 대한 포인터도 포함됩니다.

이제 큰 질문이 남습니다: 언제 @code{Py_INCREF(x)}와 @code{Py_DECREF(x)}를 사용합니까? 먼저 몇 가지 용어를 소개하겠습니다. 아무도 객체를 “소유(owns)”하지 않습니다ㅣ 그러나, 객체에 대한 `참조를 소유(own a reference)'할 수 있습니다. 객체의 참조 횟수는 이제 이 객체에 대한 참조를 소유한 수로 정의됩니다. 참조 소유자는 더는 참조가 필요하지 않을 때 @ref{78f,,Py_DECREF()}를 호출해야 합니다. 참조의 소유권을 양도할 수 있습니다. 소유한 참조를 처분하는 세 가지 방법이 있습니다: 전달, 저장 및 @code{Py_DECREF()} 호출. 소유한 참조를 처분하지 않으면 메모리 누수가 발생합니다.

객체에 대한 참조를 `빌리는(borrow)' @footnote{
참조 “빌리기(borrowing)” 은유는 완전히 올바르지 않습니다: 소유자는 여전히 참조 사본을 가지고 있습니다.
} 것도 가능합니다. 참조의 대여자(borrower)는 @ref{78f,,Py_DECREF()}를 호출해서는 안 됩니다. 대여자는 빌린 소유자보다 더 오래 객체를 붙잡아서는 안 됩니다. 소유자가 처분한 후 빌린 참조를 사용하면 해제된 메모리를 사용할 위험이 있어서 절대 피해야 합니다 @footnote{
참조 횟수가 1 이상인지 확인하는 것은 `작동하지 않습니다' — 참조 횟수 자체가 해제된 메모리에 있을 수 있어서 다른 객체에 재사용될 수 있습니다!
}.

참조 소유에 비교할 때 빌리기의 이점은 코드를 통한 가능한 모든 경로에서 참조를 처리할 필요가 없다는 것입니다 — 즉, 빌려온 참조를 사용하면 조기 종료 시에 누수의 위험이 없습니다. 소유하는 것에 비해 빌리는 것의 단점은, 겉보기에는 올바른 코드지만, 빌려준 소유자가 실제로는 참조를 처분한 후에 빌린 참조가 사용될 수 있는 미묘한 상황이 있다는 것입니다.

빌린 참조는 @ref{78e,,Py_INCREF()}를 호출하여 소유한 참조로 변경할 수 있습니다. 이는 참조를 빌려온 소유자의 상태에 영향을 미치지 않습니다 — 새로운 소유된 참조를 만들고, 완전한 소유자 책임을 부여합니다 (이전 소유자뿐만 아니라, 새 소유자는 참조를 올바르게 처분해야 합니다).

@node 소유권 규칙,살얼음,파이썬에서 참조 횟수 세기,참조 횟수
@anchor{extending/extending ownership-rules}@anchor{4ef4}@anchor{extending/extending ownershiprules}@anchor{4ef5}
@subsubsection 소유권 규칙


객체 참조가 함수 안팎으로 전달될 때마다, 소유권이 참조와 함께 전달되는지 그렇지 않은지는 함수 인터페이스 명세의 일부입니다.

객체에 대한 참조를 반환하는 대부분의 함수는 참조와 함께 소유권을 전달합니다. 특히, @ref{1bce,,PyLong_FromLong()}이나 @ref{3c2,,Py_BuildValue()}와 같은 새 객체를 만드는 기능을 가진 모든 함수는 소유권을 수신자에게 전달합니다. 객체가 실제로 새 객체가 아니더라도, 여전히 해당 객체에 대한 새 참조의 소유권을 받습니다. 예를 들어, @code{PyLong_FromLong()}은 흔히 사용되는 값의 캐시를 유지하고 캐시 된 항목에 대한 참조를 반환할 수 있습니다.

다른 객체에서 객체를 추출하는 많은 함수도 참조와 함께 소유권을 전달합니다, 예를 들어 @ref{5ed,,PyObject_GetAttrString()}. 그러나 몇 가지 일반적인 루틴이 예외이기 때문에 그림이 명확하지 않습니다: @ref{4ef6,,PyTuple_GetItem()}, @ref{5fc,,PyList_GetItem()}, @ref{626,,PyDict_GetItem()} 및 @ref{627,,PyDict_GetItemString()}은 모두 튜플, 리스트 또는 딕셔너리에서 빌린 참조를 반환합니다.

@ref{5f9,,PyImport_AddModule()} 함수도 실제는 반환하는 객체를 만들 수 있지만 빌린 참조를 반환합니다: 객체에 대한 소유한 참조가 @code{sys.modules}에 저장되어 있기 때문에 가능합니다.

객체 참조를 다른 함수에 전달할 때, 일반적으로, 함수는 여러분으로부터 참조를 빌립니다 — 참조를 저장해야 하면, @ref{78e,,Py_INCREF()}를 사용하여 독립 소유자가 됩니다. 이 규칙에는 두 가지 중요한 예외가 있습니다: @ref{4ef7,,PyTuple_SetItem()}과 @ref{18bb,,PyList_SetItem()}. 이 함수들은 전달된 항목에 대한 소유권을 취합니다 — 설사 실패하더라도! (@ref{4ef8,,PyDict_SetItem()}과 그 친구들은 소유권을 취하지 않습니다 — 이들은 “정상” 입니다.)

C 함수가 파이썬에서 호출될 때, 호출자로부터 온 인자에 대한 참조를 빌립니다. 호출자는 객체에 대한 참조를 소유하기 때문에, 빌린 참조의 수명은 함수가 반환될 때까지 보장됩니다. 이러한 빌린 참조를 저장하거나 전달해야 할 때만, @ref{78e,,Py_INCREF()}를 호출하여 소유한 참조로 만들어야 합니다.

파이썬에서 호출된 C 함수에서 반환된 객체 참조는 소유한 참조여야 합니다 — 소유권은 함수에서 호출자로 전달됩니다.

@node 살얼음,NULL 포인터,소유권 규칙,참조 횟수
@anchor{extending/extending thin-ice}@anchor{4ef9}@anchor{extending/extending thinice}@anchor{4efa}
@subsubsection 살얼음


겉보기에 무해한 빌린 참조의 사용이 문제를 일으킬 수 있는 몇 가지 상황이 있습니다. 이것들은 모두 참조의 소유자가 참조를 처분하도록 할 수 있는 인터프리터의 묵시적 호출과 관련이 있습니다.

가장 먼저 알아야 할 가장 중요한 경우는 리스트 항목에 대한 참조를 빌리는 동안 관련이 없는 객체에서 @ref{78f,,Py_DECREF()}를 사용하는 것입니다. 예를 들어:

@example
void
bug(PyObject *list)
@{
    PyObject *item = PyList_GetItem(list, 0);

    PyList_SetItem(list, 1, PyLong_FromLong(0L));
    PyObject_Print(item, stdout, 0); /* BUG! */
@}
@end example

이 함수는 먼저 @code{list[0]}에 대한 참조를 빌린 다음, @code{list[1]}을 값 @code{0}으로 바꾸고, 마지막으로 빌린 참조를 인쇄합니다. 무해해 보이지요? 하지만 그렇지 않습니다!

Let’s follow the control flow into @ref{18bb,,PyList_SetItem()}.  The list owns
references to all its items, so when item 1 is replaced, it has to dispose of
the original item 1.  Now let’s suppose the original item 1 was an instance of a
user-defined class, and let’s further suppose that the class defined a
@code{__del__()} method.  If this class instance has a reference count of 1,
disposing of it will call its @code{__del__()} method. Internally,
@code{PyList_SetItem()} calls @ref{78f,,Py_DECREF()} on the replaced item,
which invokes replaced item’s corresponding
@ref{4efb,,tp_dealloc} function. During
deallocation, @code{tp_dealloc} calls
@ref{c9c,,tp_finalize}, which is mapped to the
@code{__del__()} method for class instances (see 
@geindex Python 향상 제안; PEP 442
PEP 442@footnote{https://peps.python.org/pep-0442/}). This entire
sequence happens synchronously within the @code{PyList_SetItem()} call.

파이썬으로 작성되었기 때문에, @code{__del__()} 메서드는 임의의 파이썬 코드를 실행할 수 있습니다. 그것이 @code{bug()}에서 @code{item}에 대한 참조를 무효로 하는 작업을 수행할 수 있을까요? 물론입니다! @code{bug()}에 전달된 리스트가 @code{__del__()} 메서드에서 액세스 가능하다고 가정하면, @code{del list[0]}의 효과를 주는 문장을 실행할 수 있으며, 이것이 해당 객체에 대한 마지막 참조라고 가정하면, 그것과 연관된 메모리를 해제하고, 그래서 @code{item}을 무효로 합니다.

문제의 원인을 알고 나면, 해결 방법은 쉽습니다: 일시적으로 참조 횟수를 늘리십시오. 올바른 버전의 함수는 다음과 같습니다:

@example
void
no_bug(PyObject *list)
@{
    PyObject *item = PyList_GetItem(list, 0);

    Py_INCREF(item);
    PyList_SetItem(list, 1, PyLong_FromLong(0L));
    PyObject_Print(item, stdout, 0);
    Py_DECREF(item);
@}
@end example

이것은 실제 이야기입니다. 이전 버전의 파이썬에는 이 버그의 변형이 포함되어 있으며 누군가 @code{__del__()} 메서드가 실패하는 이유를 알아내기 위해 C 디버거에서 상당한 시간을 보냈습니다…

The second case of problems with a borrowed reference is a variant involving
threads.  Normally, multiple threads in the Python interpreter can’t get in each
other’s way, because there is a @ref{474,,global lock}
protecting Python’s entire object space.
However, it is possible to temporarily release this lock using the macro
@ref{4efc,,Py_BEGIN_ALLOW_THREADS}, and to re-acquire it using
@ref{c7e,,Py_END_ALLOW_THREADS}.  This is common around blocking I/O calls, to
let other threads use the processor while waiting for the I/O to complete.
Obviously, the following function has the same problem as the previous one:

@example
void
bug(PyObject *list)
@{
    PyObject *item = PyList_GetItem(list, 0);
    Py_BEGIN_ALLOW_THREADS
    ...some blocking I/O call...
    Py_END_ALLOW_THREADS
    PyObject_Print(item, stdout, 0); /* 버그! */
@}
@end example

@node NULL 포인터,,살얼음,참조 횟수
@anchor{extending/extending null-pointers}@anchor{4efd}@anchor{extending/extending nullpointers}@anchor{4efe}
@subsubsection NULL 포인터


일반적으로, 객체 참조를 인자로 취하는 함수는 @code{NULL} 포인터를 전달할 것으로 기대하지 않으며, 그렇게 하면 코어를 덤프합니다 (또는 이후의 코어 덤프를 유발합니다). 객체 참조를 반환하는 함수는 일반적으로 예외가 발생했음을 나타내기 위해서만 @code{NULL}을 반환합니다. @code{NULL} 인자를 검사하지 않는 이유는 함수들이 종종 자신이 받은 객체를 다른 함수에 전달하기 때문입니다 — 각 함수가 @code{NULL}을 검사한다면, 중복 검사가 많이 발생하고 코드가 더 느리게 실행됩니다.

@code{NULL}일 수 있는 포인터가 수신될 때 “소스”에서만 @code{NULL}을 검사하는 것이 좋습니다, 예를 들어, @code{malloc()}이나 예외를 발생시킬 수 있는 함수에서.

매크로 @ref{78e,,Py_INCREF()}와 @ref{78f,,Py_DECREF()}는 @code{NULL} 포인터를 검사하지 않습니다 — 하지만, 그들의 변형 @ref{c59,,Py_XINCREF()}와 @ref{991,,Py_XDECREF()}는 확인합니다.

특정 객체 형을 확인하기 위한 매크로(@code{Pytype_Check()})는 @code{NULL} 포인터를 확인하지 않습니다 — 다시, 여러 기대하는 형에 대해 객체를 검사하기 위해 연속해서 이들을 여러 번 호출하는 코드가 많아서, 중복 검사가 생성됩니다. @code{NULL} 검사를 하는 변형은 없습니다.

C 함수 호출 메커니즘은 C 함수에 전달된 인자 목록(예에서는 @code{args})이 절대 @code{NULL}이 아님을 보장합니다 — 실제로는 항상 튜플임을 보장합니다 @footnote{
“오래된” 스타일 호출 규칙을 사용할 때 이러한 보장은 유지되지 않습니다 — 이것은 여전히 기존 코드에서 많이 발견됩니다.
}.

@code{NULL} 포인터를 파이썬 사용자에게 “빠져나가게” 만드는 것은 심각한 에러입니다.

@c Frank Stajano:
@c A pedagogically buggy example, along the lines of the previous listing, would
@c be helpful here -- showing in more concrete terms what sort of actions could
@c cause the problem. I can't very well imagine it from the description.

@node C++로 확장 작성하기,확장 모듈을 위한 C API 제공하기,참조 횟수,C나 C++로 파이썬 확장하기
@anchor{extending/extending cplusplus}@anchor{4eff}@anchor{extending/extending writing-extensions-in-c}@anchor{4f00}
@subsubsection C++로 확장 작성하기


C++로 확장 모듈을 작성할 수 있습니다. 일부 제한 사항이 적용됩니다. 메인 프로그램(파이썬 인터프리터)이 C 컴파일러로 컴파일되고 링크되면, 생성자가 있는 전역이나 정적(static) 객체를 사용할 수 없습니다. 메인 프로그램이 C++ 컴파일러로 링크된 경우에는 문제가 되지 않습니다. 파이썬 인터프리터가 호출할 함수(특히, 모듈 초기화 함수)는 @code{extern "C"}를 사용하여 선언해야 합니다. @code{extern "C" @{...@}}로 파이썬 헤더 파일을 묶을 필요는 없습니다 — @code{__cplusplus} 기호가 정의되면 (모든 최신 C++ 컴파일러가 이 기호를 정의합니다) 이미 이 형식을 사용합니다.

@node 확장 모듈을 위한 C API 제공하기,,C++로 확장 작성하기,C나 C++로 파이썬 확장하기
@anchor{extending/extending providing-a-c-api-for-an-extension-module}@anchor{4f01}@anchor{extending/extending using-capsules}@anchor{1562}
@subsubsection 확장 모듈을 위한 C API 제공하기


많은 확장 모듈은 단지 파이썬에서 사용할 새로운 함수와 형을 제공하지만, 때로 확장 모듈의 코드가 다른 확장 모듈에 유용할 수 있습니다. 예를 들어, 확장 모듈은 순서 없는 리스트처럼 작동하는 “컬렉션” 형을 구현할 수 있습니다. 표준 파이썬 리스트 형에 확장 모듈이 리스트를 만들고 조작할 수 있게 하는 C API가 있는 것처럼, 이 새로운 컬렉션 형에는 다른 확장 모듈에서 직접 조작할 수 있는 C 함수 집합이 있어야 합니다.

첫눈에 이것은 쉬운 것처럼 보입니다; 단지 함수를 작성하고 (물론 @code{static}을 선언하지 않고), 적절한 헤더 파일을 제공하고, C API를 설명합니다. 사실 이것은 모든 확장 모듈이 항상 파이썬 인터프리터와 정적으로 링크되어 있다면 작동합니다. 그러나 모듈을 공유 라이브러리로 사용하면, 한 모듈에 정의된 기호가 다른 모듈에서 보이지 않을 수 있습니다. 가시성의 세부 사항은 운영 체제에 따라 다릅니다; 어떤 시스템은 파이썬 인터프리터와 모든 확장 모듈에 하나의 전역 이름 공간을 사용하는 반면 (예를 들어 윈도우), 다른 시스템은 모듈 링크 시점에 임포트 되는 기호의 목록을 명시적으로 요구하거나 (AIX가 하나의 예입니다), 여러 전략 중 선택할 수 있도록 합니다 (대부분의 유닉스). 또한 기호가 전역적으로 보이더라도, 호출하려는 함수를 가진 모듈이 아직 로드되지 않았을 수 있습니다!

따라서 이식성에는 기호 가시성에 대해 가정하지 않을 것이 요구됩니다. 이것은 다른 확장 모듈과의 이름 충돌을 피하고자, 모듈의 초기화 함수를 제외한 확장 모듈의 모든 기호를 @code{static}으로 선언해야 함을 의미합니다 (섹션 @ref{4edf,,모듈의 메서드 테이블과 초기화 함수}에서 설명되듯이). 그리고 이는 다른 확장 모듈에서 액세스 `해야만' 하는 기호를 다른 방식으로 노출해야 함을 의미합니다.

파이썬은 한 확장 모듈에서 다른 확장 모듈로 C 수준 정보(포인터)를 전달하는 특별한 메커니즘을 제공합니다: 캡슐(Capsule). 캡슐은 포인터(void*)를 저장하는 파이썬 데이터형입니다. 캡슐은 C API를 통해서만 만들고 액세스할 수 있지만, 다른 파이썬 객체처럼 전달할 수 있습니다. 특히, 확장 모듈의 이름 공간에서 이름에 대입할 수 있습니다. 다른 확장 모듈은 이 모듈을 임포트 해서, 이 이름의 값을 가져온 다음, 캡슐에서 포인터를 가져올 수 있습니다.

확장 모듈의 C API를 노출하는 데 캡슐을 사용하는 방법에는 여러 가지가 있습니다. 각 함수가 자신만의 캡슐을 얻거나, 모든 C API 포인터가 저장된 배열의 주소를 캡슐로 게시할 수 있습니다. 그리고 포인터를 저장하고 꺼내는 다양한 작업은 코드를 제공하는 모듈과 클라이언트 모듈 간에 여러 방식으로 분산될 수 있습니다.

어떤 방법을 선택하든, 캡슐 이름을 올바르게 지정하는 것이 중요합니다. @ref{4f02,,PyCapsule_New()} 함수는 name 매개 변수(const char*)를 취합니다; @code{NULL} name을 전달할 수는 있지만, 이름을 지정하도록 강력히 권고합니다. 적절하게 이름 붙인 캡슐은 어느 정도의 실행 시간 형 안전성을 제공합니다; 하나의 이름 없는 캡슐을 다른 캡슐과 구별할 수 있는 적절한 방법은 없습니다.

특히, C API를 공개하는 데 사용되는 캡슐에는 다음 규칙에 따라 이름을 지정해야 합니다:

@example
modulename.attributename
@end example

편의 함수 @ref{1c0e,,PyCapsule_Import()}를 사용하면 캡슐을 통해 제공된 C API를 쉽게 로드 할 수 있지만, 캡슐 이름이 이 규칙과 일치할 때만 그렇습니다. 이 동작은 C API 사용자에게 자신이 로드 한 캡슐에 올바른 C API가 포함되어 있다는 확신을 줍니다.

다음 예제는 대부분의 부담을 내보내는 모듈의 작성자에게 주는 방식을 보여주는데, 일반적으로 사용되는 라이브러리 모듈에 적합합니다. 캡슐의 값이 되는 void 포인터의 배열에 모든 C API 포인터(이 예에서는 하나뿐입니다!)를 저장합니다. 모듈에 해당하는 헤더 파일은 모듈을 임포트 하고 C API 포인터를 가져오는 매크로를 제공합니다; 클라이언트 모듈은 C API에 액세스하기 전에 이 매크로를 호출하기만 하면 됩니다.

내보내는 모듈은 섹션 @ref{4ed3,,간단한 예}의 @code{spam} 모듈을 수정한 것입니다. @code{spam.system()} 함수는 C 라이브러리 함수 @code{system()}을 직접 호출하지는 않고, 실제로는 더 복잡한 작업을 수행하는 (가령 모든 명령에 “spam”을 추가하는 것과 같은) @code{PySpam_System()} 함수를 호출합니다. 이 함수 @code{PySpam_System()}도 다른 확장 모듈로 내보냅니다.

함수 @code{PySpam_System()}은 평범한 C 함수이며, 다른 모든 것과 같이 @code{static}으로 선언되었습니다:

@example
static int
PySpam_System(const char *command)
@{
    return system(command);
@}
@end example

@code{spam_system()} 함수는 사소하게 수정됩니다:

@example
static PyObject *
spam_system(PyObject *self, PyObject *args)
@{
    const char *command;
    int sts;

    if (!PyArg_ParseTuple(args, "s", &command))
        return NULL;
    sts = PySpam_System(command);
    return PyLong_FromLong(sts);
@}
@end example

모듈의 시작 부분에서, 다음 줄 바로 다음에

@example
#include <Python.h>
@end example

다음 두 줄을 더 추가해야 합니다:

@example
#define SPAM_MODULE
#include "spammodule.h"
@end example

The @code{#define} is used to tell the header file that it is being included in the
exporting module, not a client module. Finally, the module’s @ref{b75,,mod_exec} function must take care of initializing the C API pointer array:

@example
static int
spam_module_exec(PyObject *m)
@{
    static void *PySpam_API[PySpam_API_pointers];
    PyObject *c_api_object;

    /* Initialize the C API pointer array */
    PySpam_API[PySpam_System_NUM] = (void *)PySpam_System;

    /* Create a Capsule containing the API pointer array's address */
    c_api_object = PyCapsule_New((void *)PySpam_API, "spam._C_API", NULL);

    if (PyModule_Add(m, "_C_API", c_api_object) < 0) @{
        return -1;
    @}

    return 0;
@}
@end example

@code{PySpam_API}는 @code{static}으로 선언됩니다; 그렇지 않으면 @code{PyInit_spam()}이 종료할 때 포인터 배열이 사라집니다!

작업 대부분은 헤더 파일 @code{spammodule.h}에 있으며, 다음과 같습니다:

@example
#ifndef Py_SPAMMODULE_H
#define Py_SPAMMODULE_H
#ifdef __cplusplus
extern "C" @{
#endif

/* spammodule 의 헤더 파일 */

/* C API functions */
#define PySpam_System_NUM 0
#define PySpam_System_RETURN int
#define PySpam_System_PROTO (const char *command)

/* C API 포인터의 총수 */
#define PySpam_API_pointers 1


#ifdef SPAM_MODULE
/* 이 섹션은 spammodule.c를 컴파일할 때 사용됩니다 */

static PySpam_System_RETURN PySpam_System PySpam_System_PROTO;

#else
/* 이 섹션은 spammodule의 API를 사용하는 모듈에서 사용됩니다 */

static void **PySpam_API;

#define PySpam_System \
 (*(PySpam_System_RETURN (*)PySpam_System_PROTO) PySpam_API[PySpam_System_NUM])

/* 에러 시 -1, 성공 시 0을 반환합니다.
 * PyCapsule_Import는 에러가 있으면 예외를 설정합니다.
 */
static int
import_spam(void)
@{
    PySpam_API = (void **)PyCapsule_Import("spam._C_API", 0);
    return (PySpam_API != NULL) ? 0 : -1;
@}

#endif

#ifdef __cplusplus
@}
#endif

#endif /* !defined(Py_SPAMMODULE_H) */
@end example

All that a client module must do in order to have access to the function
@code{PySpam_System()} is to call the function (or rather macro)
@code{import_spam()} in its @ref{b75,,mod_exec} function:

@example
static int
client_module_exec(PyObject *m)
@{
    if (import_spam() < 0) @{
        return -1;
    @}
    /* additional initialization can happen here */
    return 0;
@}
@end example

이 방법의 주요 단점은 파일 @code{spammodule.h}가 다소 복잡하다는 것입니다. 그러나, 기본 구조는 내보내는 함수마다 같아서, 한 번만 학습하면 됩니다.

마지막으로 캡슐은 추가 기능을 제공하며, 특히 캡슐에 저장된 포인터의 메모리 할당과 할당 해제에 유용합니다. 세부 사항은 파이썬/C API 레퍼런스 매뉴얼의 @ref{2a16,,캡슐} 섹션과 캡슐 구현(파이썬 소스 코드 배포의 @code{Include/pycapsule.h}와 @code{Objects/pycapsule.c} 파일)에 설명되어 있습니다.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 확장형 정의하기 자습서,확장형 정의하기 여러 가지 주제,C나 C++로 파이썬 확장하기,제삼자 도구 없이 확장 만들기
@anchor{extending/newtypes_tutorial doc}@anchor{1bb9}@anchor{extending/newtypes_tutorial defining-extension-types-tutorial}@anchor{4f03}@anchor{extending/newtypes_tutorial defining-new-types}@anchor{4f04}@anchor{extending/newtypes_tutorial translation-repo}@anchor{4f05}
@subsection 확장형 정의하기: 자습서


파이썬은 C 확장 모듈 작성자가 내장 @ref{169,,str}과 @ref{24d,,list} 형과 마찬가지로 파이썬 코드에서 조작할 수 있는 새로운 형을 정의할 수 있도록 합니다. 모든 확장형의 코드는 패턴을 따르지만, 시작하기 전에 이해해야 할 세부 사항이 있습니다. 이 설명서는 주제에 대한 간단한 소개입니다.

@menu
* 기초:: 
* 기초 예제에 데이터와 메서드 추가하기:: 
* 데이터 어트리뷰트를 더 세밀하게 제어하기:: 
* 순환 가비지 수거 지원하기:: 
* 다른 형의 서브 클래싱:: 

@end menu

@node 기초,기초 예제에 데이터와 메서드 추가하기,,확장형 정의하기 자습서
@anchor{extending/newtypes_tutorial dnt-basics}@anchor{4f06}@anchor{extending/newtypes_tutorial the-basics}@anchor{4f07}
@subsubsection 기초


The @ref{904,,CPython} runtime sees all Python objects as variables of type
@ref{5dc,,PyObject}*, which serves as a “base type” for all Python objects.
The @ref{5dc,,PyObject} structure itself only contains the object’s
@ref{4f08,,reference count} and a pointer to the object’s “type object”.
This is where the action is; the type object determines which (C) functions
get called by the interpreter when, for instance, an attribute gets looked up
on an object, a method called, or it is multiplied by another object.  These
C functions are called “type methods”.

따라서, 새 확장형을 정의하려면, 새 형 객체를 만들어야 합니다.

This sort of thing can only be explained by example, so here’s a minimal, but
complete, module that defines a new type named @code{Custom} inside a C
extension module @code{custom}:

@cartouche
@quotation 참고 
여기에 표시하는 것은 `정적인(static)' 확장형을 정의하는 전통적인 방법입니다. 대부분의 용도에 적합해야 합니다. C API는 또한 @ref{79c,,PyType_FromSpec()} 함수를 사용하여 힙 할당 확장형을 정의 할 수 있습니다만, 이 자습서에서는 다루지 않습니다.
@end quotation
@end cartouche

@example
#define PY_SSIZE_T_CLEAN
#include <Python.h>

typedef struct @{
    PyObject_HEAD
    /* Type-specific fields go here. */
@} CustomObject;

static PyTypeObject CustomType = @{
    .ob_base = PyVarObject_HEAD_INIT(NULL, 0)
    .tp_name = "custom.Custom",
    .tp_doc = PyDoc_STR("Custom objects"),
    .tp_basicsize = sizeof(CustomObject),
    .tp_itemsize = 0,
    .tp_flags = Py_TPFLAGS_DEFAULT,
    .tp_new = PyType_GenericNew,
@};

static int
custom_module_exec(PyObject *m)
@{
    if (PyType_Ready(&CustomType) < 0) @{
        return -1;
    @}

    if (PyModule_AddObjectRef(m, "Custom", (PyObject *) &CustomType) < 0) @{
        return -1;
    @}

    return 0;
@}

static PyModuleDef_Slot custom_module_slots[] = @{
    @{Py_mod_exec, custom_module_exec@},
    // Just use this while using static types
    @{Py_mod_multiple_interpreters, Py_MOD_MULTIPLE_INTERPRETERS_NOT_SUPPORTED@},
    @{0, NULL@}
@};

static PyModuleDef custom_module = @{
    .m_base = PyModuleDef_HEAD_INIT,
    .m_name = "custom",
    .m_doc = "Example module that creates an extension type.",
    .m_size = 0,
    .m_slots = custom_module_slots,
@};

PyMODINIT_FUNC
PyInit_custom(void)
@{
    return PyModuleDef_Init(&custom_module);
@}
@end example

이제는 한 번에 배워야 할 것이 많지만, 이전 장과 비슷해 보이기를 바랍니다. 이 파일은 세 가지를 정의합니다:


@enumerate 

@item 
What a @code{Custom} `object' contains: this is the @code{CustomObject}
struct, which is allocated once for each @code{Custom} instance.

@item 
How the @code{Custom} `type' behaves: this is the @code{CustomType} struct,
which defines a set of flags and function pointers that the interpreter
inspects when specific operations are requested.

@item 
How to define and execute the @code{custom} module: this is the
@code{PyInit_custom} function and the associated @code{custom_module} struct for
defining the module, and the @code{custom_module_exec} function to set up
a fresh module object.
@end enumerate

첫 번째 것은:

@example
typedef struct @{
    PyObject_HEAD
@} CustomObject;
@end example

This is what a Custom object will contain.  @code{PyObject_HEAD} is mandatory
at the start of each object struct and defines a field called @code{ob_base}
of type @ref{5dc,,PyObject}, containing a pointer to a type object and a
reference count (these can be accessed using the macros @ref{3c9,,Py_TYPE}
and @ref{2cf,,Py_REFCNT} respectively).  The reason for the macro is to
abstract away the layout and to enable additional fields in @ref{508,,debug builds}.

@cartouche
@quotation 참고 
@ref{14e2,,PyObject_HEAD} 매크로 뒤에는 세미콜론이 없습니다. 실수로 추가하는 것에 주의하십시오: 일부 컴파일러는 불평할 것입니다.
@end quotation
@end cartouche

물론, 객체는 일반적으로 표준 @code{PyObject_HEAD} 관용구 외에 추가 데이터를 저장합니다; 예를 들어, 표준 파이썬 floats에 대한 정의는 다음과 같습니다:

@example
typedef struct @{
    PyObject_HEAD
    double ob_fval;
@} PyFloatObject;
@end example

두 번째 것은 형 객체의 정의입니다.

@example
static PyTypeObject CustomType = @{
    .ob_base = PyVarObject_HEAD_INIT(NULL, 0)
    .tp_name = "custom.Custom",
    .tp_doc = PyDoc_STR("Custom objects"),
    .tp_basicsize = sizeof(CustomObject),
    .tp_itemsize = 0,
    .tp_flags = Py_TPFLAGS_DEFAULT,
    .tp_new = PyType_GenericNew,
@};
@end example

@cartouche
@quotation 참고 
신경 쓰지 않는 모든 @ref{c9b,,PyTypeObject} 필드를 나열하지 않고 필드의 선언 순서를 신경 쓰지 않으려면, 위와 같이 C99 스타일의 지명(designated) 초기화자를 사용하는 것이 좋습니다.
@end quotation
@end cartouche

@code{object.h}에 있는 @ref{c9b,,PyTypeObject}의 실제 정의는 위의 정의보다 더 많은 @ref{b83,,필드}를 갖습니다. 나머지 필드는 C 컴파일러에 의해 0으로 채워지며, 필요하지 않으면 명시적으로 지정하지 않는 것이 일반적입니다.

한 번에 한 필드씩 따로 다루려고 합니다:

@example
.ob_base = PyVarObject_HEAD_INIT(NULL, 0)
@end example

이 줄은 위에서 언급한 @code{ob_base} 필드를 초기화하기 위한 필수 상용구입니다.

@example
.tp_name = "custom.Custom",
@end example

우리 형의 이름. 이것은 객체의 기본 텍스트 표현과 일부 에러 메시지에 나타납니다, 예를 들어:

@example
>>> "" + custom.Custom()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can only concatenate str (not "custom.Custom") to str
@end example

Note that the name is a dotted name that includes both the module name and the
name of the type within the module. The module in this case is @code{custom} and
the type is @code{Custom}, so we set the type name to @code{custom.Custom}.
Using the real dotted import path is important to make your type compatible
with the @ref{ba,,pydoc} and @ref{ab,,pickle} modules.

@example
.tp_basicsize = sizeof(CustomObject),
.tp_itemsize = 0,
@end example

This is so that Python knows how much memory to allocate when creating
new @code{Custom} instances.  @ref{23bb,,tp_itemsize} is
only used for variable-sized objects and should otherwise be zero.

@cartouche
@quotation 참고 
If you want your type to be subclassable from Python, and your type has the same
@ref{b7d,,tp_basicsize} as its base type, you may have problems with multiple
inheritance.  A Python subclass of your type will have to list your type first
in its @ref{16b1,,__bases__}, or else it will not be able to call your type’s
@ref{79f,,__new__()} method without getting an error.  You can avoid this problem by
ensuring that your type has a larger value for @code{tp_basicsize} than its
base type does.  Most of the time, this will be true anyway, because either your
base type will be @ref{c7d,,object}, or else you will be adding data members to
your base type, and therefore increasing its size.
@end quotation
@end cartouche

We set the class flags to @ref{4f09,,Py_TPFLAGS_DEFAULT}.

@example
.tp_flags = Py_TPFLAGS_DEFAULT,
@end example

모든 형은 이 상수를 플래그에 포함해야 합니다. 적어도 파이썬 3.3까지 정의된 모든 멤버를 활성화합니다. 추가 멤버가 필요하면, 해당 플래그를 OR 해야 합니다.

@ref{4f0a,,tp_doc}에 형의 독스트링을 제공합니다.

@example
.tp_doc = PyDoc_STR("Custom objects"),
@end example

To enable object creation, we have to provide a @ref{79e,,tp_new}
handler.  This is the equivalent of the Python method @ref{79f,,__new__()}, but
has to be specified explicitly.  In this case, we can just use the default
implementation provided by the API function @ref{4f0b,,PyType_GenericNew()}.

@example
.tp_new = PyType_GenericNew,
@end example

Everything else in the file should be familiar, except for some code in
@code{custom_module_exec()}:

@example
if (PyType_Ready(&CustomType) < 0) @{
    return -1;
@}
@end example

This initializes the @code{Custom} type, filling in a number of members
to the appropriate default values, including @ref{4f0c,,ob_type} that we initially
set to @code{NULL}.

@example
if (PyModule_AddObjectRef(m, "Custom", (PyObject *) &CustomType) < 0) @{
    return -1;
@}
@end example

This adds the type to the module dictionary.  This allows us to create
@code{Custom} instances by calling the @code{Custom} class:

@example
>>> import custom
>>> mycustom = custom.Custom()
@end example

That’s it!  All that remains is to build it; put the above code in a file called
@code{custom.c},

@example
[build-system]
requires = ["setuptools"]
build-backend = "setuptools.build_meta"

[project]
name = "custom"
version = "1"
@end example

in a file called @code{pyproject.toml}, and

@example
from setuptools import Extension, setup
setup(ext_modules=[Extension("custom", ["custom.c"])])
@end example

를 @code{setup.py}라는 파일에 넣은 다음; 다음을

@example
$ python -m pip install .
@end example

in a shell should produce a file @code{custom.so} in a subdirectory
and install it; now fire up Python — you should be able to @code{import custom}
and play around with @code{Custom} objects.

그렇게 어렵지 않습니다, 그렇지 않나요?

물론, 현재 Custom 형은 그리 흥미롭지 않습니다. 데이터가 없고 아무것도 하지 않습니다. 서브 클래싱조차 할 수 없습니다.

@node 기초 예제에 데이터와 메서드 추가하기,데이터 어트리뷰트를 더 세밀하게 제어하기,기초,확장형 정의하기 자습서
@anchor{extending/newtypes_tutorial adding-data-and-methods-to-the-basic-example}@anchor{4f0d}
@subsubsection 기초 예제에 데이터와 메서드 추가하기


Let’s extend the basic example to add some data and methods.  Let’s also make
the type usable as a base class. We’ll create a new module, @code{custom2} that
adds these capabilities:

@example
#define PY_SSIZE_T_CLEAN
#include <Python.h>
#include <stddef.h> /* for offsetof() */

typedef struct @{
    PyObject_HEAD
    PyObject *first; /* first name */
    PyObject *last;  /* last name */
    int number;
@} CustomObject;

static void
Custom_dealloc(PyObject *op)
@{
    CustomObject *self = (CustomObject *) op;
    Py_XDECREF(self->first);
    Py_XDECREF(self->last);
    Py_TYPE(self)->tp_free(self);
@}

static PyObject *
Custom_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
@{
    CustomObject *self;
    self = (CustomObject *) type->tp_alloc(type, 0);
    if (self != NULL) @{
        self->first = Py_GetConstant(Py_CONSTANT_EMPTY_STR);
        if (self->first == NULL) @{
            Py_DECREF(self);
            return NULL;
        @}
        self->last = Py_GetConstant(Py_CONSTANT_EMPTY_STR);
        if (self->last == NULL) @{
            Py_DECREF(self);
            return NULL;
        @}
        self->number = 0;
    @}
    return (PyObject *) self;
@}

static int
Custom_init(PyObject *op, PyObject *args, PyObject *kwds)
@{
    CustomObject *self = (CustomObject *) op;
    static char *kwlist[] = @{"first", "last", "number", NULL@};
    PyObject *first = NULL, *last = NULL;

    if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OOi", kwlist,
                                     &first, &last,
                                     &self->number))
        return -1;

    if (first) @{
        Py_XSETREF(self->first, Py_NewRef(first));
    @}
    if (last) @{
        Py_XSETREF(self->last, Py_NewRef(last));
    @}
    return 0;
@}

static PyMemberDef Custom_members[] = @{
    @{"first", Py_T_OBJECT_EX, offsetof(CustomObject, first), 0,
     "first name"@},
    @{"last", Py_T_OBJECT_EX, offsetof(CustomObject, last), 0,
     "last name"@},
    @{"number", Py_T_INT, offsetof(CustomObject, number), 0,
     "custom number"@},
    @{NULL@}  /* Sentinel */
@};

static PyObject *
Custom_name(PyObject *op, PyObject *Py_UNUSED(dummy))
@{
    CustomObject *self = (CustomObject *) op;
    if (self->first == NULL) @{
        PyErr_SetString(PyExc_AttributeError, "first");
        return NULL;
    @}
    if (self->last == NULL) @{
        PyErr_SetString(PyExc_AttributeError, "last");
        return NULL;
    @}
    return PyUnicode_FromFormat("%S %S", self->first, self->last);
@}

static PyMethodDef Custom_methods[] = @{
    @{"name", Custom_name, METH_NOARGS,
     "Return the name, combining the first and last name"
    @},
    @{NULL@}  /* Sentinel */
@};

static PyTypeObject CustomType = @{
    .ob_base = PyVarObject_HEAD_INIT(NULL, 0)
    .tp_name = "custom2.Custom",
    .tp_doc = PyDoc_STR("Custom objects"),
    .tp_basicsize = sizeof(CustomObject),
    .tp_itemsize = 0,
    .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
    .tp_new = Custom_new,
    .tp_init = Custom_init,
    .tp_dealloc = Custom_dealloc,
    .tp_members = Custom_members,
    .tp_methods = Custom_methods,
@};

static int
custom_module_exec(PyObject *m)
@{
    if (PyType_Ready(&CustomType) < 0) @{
        return -1;
    @}

    if (PyModule_AddObjectRef(m, "Custom", (PyObject *) &CustomType) < 0) @{
        return -1;
    @}

    return 0;
@}

static PyModuleDef_Slot custom_module_slots[] = @{
    @{Py_mod_exec, custom_module_exec@},
    @{Py_mod_multiple_interpreters, Py_MOD_MULTIPLE_INTERPRETERS_NOT_SUPPORTED@},
    @{0, NULL@}
@};

static PyModuleDef custom_module = @{
    .m_base = PyModuleDef_HEAD_INIT,
    .m_name = "custom2",
    .m_doc = "Example module that creates an extension type.",
    .m_size = 0,
    .m_slots = custom_module_slots,
@};

PyMODINIT_FUNC
PyInit_custom2(void)
@{
    return PyModuleDef_Init(&custom_module);
@}
@end example

이 버전의 모듈에는 여러 가지 변경 사항이 있습니다.

The  @code{Custom} type now has three data attributes in its C struct,
`first', `last', and `number'.  The `first' and `last' variables are Python
strings containing first and last names.  The `number' attribute is a C integer.

객체 구조체는 다음과 같이 갱신됩니다:

@example
typedef struct @{
    PyObject_HEAD
    PyObject *first; /* first name */
    PyObject *last;  /* last name */
    int number;
@} CustomObject;
@end example

이제 관리할 데이터가 있기 때문에, 객체 할당과 할당 해제에 관해 더욱 신중해야 합니다. 최소한, 할당 해제 메서드가 필요합니다:

@example
static void
Custom_dealloc(PyObject *op)
@{
    CustomObject *self = (CustomObject *) op;
    Py_XDECREF(self->first);
    Py_XDECREF(self->last);
    Py_TYPE(self)->tp_free(self);
@}
@end example

이는 @ref{4efb,,tp_dealloc} 멤버에 대입됩니다:

@example
.tp_dealloc = Custom_dealloc,
@end example

This method first clears the reference counts of the two Python attributes.
@ref{991,,Py_XDECREF()} correctly handles the case where its argument is
@code{NULL} (which might happen here if @code{tp_new} failed midway).  It then
calls the @ref{4f0e,,tp_free} member of the object’s type
(computed by @code{Py_TYPE(self)}) to free the object’s memory.  Note that
the object’s type might not be @code{CustomType}, because the object may
be an instance of a subclass.

@cartouche
@quotation 참고 
The explicit cast to @code{CustomObject *} above is needed because we defined
@code{Custom_dealloc} to take a @code{PyObject *} argument, as the @code{tp_dealloc}
function pointer expects to receive a @code{PyObject *} argument.
By assigning to the @code{tp_dealloc} slot of a type, we declare
that it can only be called with instances of our @code{CustomObject}
class, so the cast to @code{(CustomObject *)} is safe.
This is object-oriented polymorphism, in C!

In existing code, or in previous versions of this tutorial,
you might see similar functions take a pointer to the subtype
object structure (@code{CustomObject*}) directly, like this:

@example
Custom_dealloc(CustomObject *self)
@{
    Py_XDECREF(self->first);
    Py_XDECREF(self->last);
    Py_TYPE(self)->tp_free((PyObject *) self);
@}
...
.tp_dealloc = (destructor) Custom_dealloc,
@end example

This does the same thing on all architectures that CPython
supports, but according to the C standard, it invokes
undefined behavior.
@end quotation
@end cartouche

우리는 성과 이름이 빈 문자열로 초기화되도록 하고 싶어서, @code{tp_new} 구현을 제공합니다:

@example
static PyObject *
Custom_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
@{
    CustomObject *self;
    self = (CustomObject *) type->tp_alloc(type, 0);
    if (self != NULL) @{
        self->first = PyUnicode_FromString("");
        if (self->first == NULL) @{
            Py_DECREF(self);
            return NULL;
        @}
        self->last = PyUnicode_FromString("");
        if (self->last == NULL) @{
            Py_DECREF(self);
            return NULL;
        @}
        self->number = 0;
    @}
    return (PyObject *) self;
@}
@end example

그리고 그것을 @ref{79e,,tp_new} 멤버에 설치합니다:

@example
.tp_new = Custom_new,
@end example

The @code{tp_new} handler is responsible for creating (as opposed to initializing)
objects of the type.  It is exposed in Python as the @ref{79f,,__new__()} method.
It is not required to define a @code{tp_new} member, and indeed many extension
types will simply reuse @ref{4f0b,,PyType_GenericNew()} as done in the first
version of the @code{Custom} type above.  In this case, we use the @code{tp_new}
handler to initialize the @code{first} and @code{last} attributes to non-@code{NULL}
default values.

@code{tp_new}는 인스턴스 화 되는 형(서브 클래스가 인스턴스 화 되면, 반드시 @code{CustomType}일 필요는 없습니다)과 형이 호출될 때 전달된 모든 인자가 전달되며, 만들어진 인스턴스를 반환할 것으로 기대됩니다. @code{tp_new} 처리기는 항상 위치와 키워드 인자를 받아들이지만, 종종 인자를 무시하고 인자 처리를 초기화 (C의 @code{tp_init}나 파이썬의 @code{__init__}) 메서드에게 남겨둡니다.

@cartouche
@quotation 참고 
인터프리터가 직접 할 것이라서, @code{tp_new}는 명시적으로 @code{tp_init}를 호출하면 안 됩니다.
@end quotation
@end cartouche

@code{tp_new} 구현은 @ref{4f0f,,tp_alloc} 슬롯을 호출하여 메모리를 할당합니다:

@example
self = (CustomObject *) type->tp_alloc(type, 0);
@end example

메모리 할당이 실패할 수 있어서, 진행하기 전에 @ref{4f0f,,tp_alloc} 결과가 @code{NULL}이 아닌지 확인해야 합니다.

@cartouche
@quotation 참고 
우리는 @ref{4f0f,,tp_alloc} 슬롯을 직접 채우지 않았습니다. 대신 @ref{97f,,PyType_Ready()}가 베이스 클래스(기본적으로 @ref{c7d,,object}입니다)에서 상속하여 이를 채웁니다. 대부분의 형은 기본 할당 전략을 사용합니다.
@end quotation
@end cartouche

@cartouche
@quotation 참고 
If you are creating a co-operative @ref{79e,,tp_new} (one
that calls a base type’s @code{tp_new} or @ref{79f,,__new__()}),
you must `not' try to determine what method to call using method resolution
order at runtime.  Always statically determine what type you are going to
call, and call its @code{tp_new} directly, or via
@code{type->tp_base->tp_new}.  If you do not do this, Python subclasses of your
type that also inherit from other Python-defined classes may not work correctly.
(Specifically, you may not be able to create instances of such subclasses
without getting a @ref{198,,TypeError}.)
@end quotation
@end cartouche

인스턴스의 초깃값을 제공하는 인자를 받아들이는 초기화 함수도 정의합니다:

@example
static int
Custom_init(PyObject *op, PyObject *args, PyObject *kwds)
@{
    CustomObject *self = (CustomObject *) op;
    static char *kwlist[] = @{"first", "last", "number", NULL@};
    PyObject *first = NULL, *last = NULL, *tmp;

    if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OOi", kwlist,
                                     &first, &last,
                                     &self->number))
        return -1;

    if (first) @{
        tmp = self->first;
        Py_INCREF(first);
        self->first = first;
        Py_XDECREF(tmp);
    @}
    if (last) @{
        tmp = self->last;
        Py_INCREF(last);
        self->last = last;
        Py_XDECREF(tmp);
    @}
    return 0;
@}
@end example

이것으로 @ref{7a0,,tp_init} 슬롯을 채웁니다:

@example
.tp_init = Custom_init,
@end example

The @ref{7a0,,tp_init} slot is exposed in Python as the
@ref{8be,,__init__()} method.  It is used to initialize an object after it’s
created.  Initializers always accept positional and keyword arguments,
and they should return either @code{0} on success or @code{-1} on error.

Unlike the @code{tp_new} handler, there is no guarantee that @code{tp_init}
is called at all (for example, the @ref{ab,,pickle} module by default
doesn’t call @ref{8be,,__init__()} on unpickled instances).  It can also be
called multiple times.  Anyone can call the @code{__init__()} method on
our objects.  For this reason, we have to be extra careful when assigning
the new attribute values.  We might be tempted, for example to assign the
@code{first} member like this:

@example
if (first) @{
    Py_XDECREF(self->first);
    Py_INCREF(first);
    self->first = first;
@}
@end example

But this would be risky.  Our type doesn’t restrict the type of the
@code{first} member, so it could be any kind of object.  It could have a
destructor that causes code to be executed that tries to access the
@code{first} member; or that destructor could detach the
@ref{4f10,,thread state} and let arbitrary code run in other
threads that accesses and modifies our object.

편집증적이 되고 이 가능성으로부터 우리 자신을 보호하기 위해, 우리는 거의 항상 참조 횟수를 줄이기 전에 멤버를 다시 대입합니다. 언제 이렇게 하지 않아도 될까요?


@itemize *

@item 
참조 횟수가 1보다 크다는 것을 확실히 알고 있을 때;

@item 
when we know that deallocation of the object @footnote{
이것은 객체가 문자열이나 부동 소수점과 같은 기본형이라는 것을 알고 있을 때 참입니다.
} will neither detach
the @ref{4f10,,thread state} nor cause any calls back into our type’s code;

@item 
순환 가비지 수거를 지원하지 않는 형의 @ref{4efb,,tp_dealloc} 처리기에서 참조 횟수를 감소시킬 때 @footnote{
우리의 형이 가비지 수거를 지원하지 않기 때문에, 이 예제에서는 @ref{4efb,,tp_dealloc} 처리기에서 이것을 사용했습니다.
}.
@end itemize

인스턴스 변수를 어트리뷰트로 노출하려고 합니다. 이를 수행하는 방법에는 여러 가지가 있습니다. 가장 간단한 방법은 멤버 정의를 정의하는 것입니다:

@example
static PyMemberDef Custom_members[] = @{
    @{"first", Py_T_OBJECT_EX, offsetof(CustomObject, first), 0,
     "first name"@},
    @{"last", Py_T_OBJECT_EX, offsetof(CustomObject, last), 0,
     "last name"@},
    @{"number", Py_T_INT, offsetof(CustomObject, number), 0,
     "custom number"@},
    @{NULL@}  /* Sentinel */
@};
@end example

그리고 @ref{4f11,,tp_members} 슬롯에 정의를 넣습니다:

@example
.tp_members = Custom_members,
@end example

각 멤버 정의에는 멤버 이름, 형, 오프셋, 액세스 플래그 및 독스트링이 있습니다. 자세한 내용은 아래 @ref{4f12,,범용 어트리뷰트 관리} 섹션을 참조하십시오.

이 접근법의 단점은 파이썬 어트리뷰트에 대입할 수 있는 객체의 형을 제한할 방법을 제공하지 않는다는 것입니다. 이름과 성은 문자열일 것으로 기대하지만, 모든 파이썬 객체를 할당할 수 있습니다. 또한 어트리뷰트를 삭제할 수 있습니다, C 포인터를 @code{NULL}로 설정합니다. @code{NULL}이 아닌 값으로 멤버를 초기화 할 수 있지만, 어트리뷰트를 삭제하면 멤버를 @code{NULL}로 설정할 수 있습니다.

We define a single method, @code{Custom.name()}, that outputs the objects name as the
concatenation of the first and last names.

@example
static PyObject *
Custom_name(PyObject *op, PyObject *Py_UNUSED(dummy))
@{
    CustomObject *self = (CustomObject *) op;
    if (self->first == NULL) @{
        PyErr_SetString(PyExc_AttributeError, "first");
        return NULL;
    @}
    if (self->last == NULL) @{
        PyErr_SetString(PyExc_AttributeError, "last");
        return NULL;
    @}
    return PyUnicode_FromFormat("%S %S", self->first, self->last);
@}
@end example

The method is implemented as a C function that takes a @code{Custom} (or
@code{Custom} subclass) instance as the first argument.  Methods always take an
instance as the first argument. Methods often take positional and keyword
arguments as well, but in this case we don’t take any and don’t need to accept
a positional argument tuple or keyword argument dictionary. This method is
equivalent to the Python method:

@example
def name(self):
    return "%s %s" % (self.first, self.last)
@end example

Note that we have to check for the possibility that our @code{first} and
@code{last} members are @code{NULL}.  This is because they can be deleted, in which
case they are set to @code{NULL}.  It would be better to prevent deletion of these
attributes and to restrict the attribute values to be strings.  We’ll see how to
do that in the next section.

이제 메서드를 정의했습니다, 메서드 정의 배열을 만들어야 합니다:

@example
static PyMethodDef Custom_methods[] = @{
    @{"name", Custom_name, METH_NOARGS,
     "Return the name, combining the first and last name"
    @},
    @{NULL@}  /* Sentinel */
@};
@end example

(note that we used the @ref{16d9,,METH_NOARGS} flag to indicate that the method
is expecting no arguments other than `self')

그리고 @ref{4f13,,tp_methods} 슬롯에 대입합니다:

@example
.tp_methods = Custom_methods,
@end example

Finally, we’ll make our type usable as a base class for subclassing.  We’ve
written our methods carefully so far so that they don’t make any assumptions
about the type of the object being created or used, so all we need to do is
to add the @ref{4f14,,Py_TPFLAGS_BASETYPE} to our class flag definition:

@example
.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
@end example

We rename @code{PyInit_custom()} to @code{PyInit_custom2()}, update the
module name in the @ref{b71,,PyModuleDef} struct, and update the full class
name in the @ref{c9b,,PyTypeObject} struct.

Finally, we update our @code{setup.py} file to include the new module,

@example
from setuptools import Extension, setup
setup(ext_modules=[
    Extension("custom", ["custom.c"]),
    Extension("custom2", ["custom2.c"]),
])
@end example

and then we re-install so that we can @code{import custom2}:

@example
$ python -m pip install .
@end example

@node 데이터 어트리뷰트를 더 세밀하게 제어하기,순환 가비지 수거 지원하기,기초 예제에 데이터와 메서드 추가하기,확장형 정의하기 자습서
@anchor{extending/newtypes_tutorial providing-finer-control-over-data-attributes}@anchor{4f15}
@subsubsection 데이터 어트리뷰트를 더 세밀하게 제어하기


In this section, we’ll provide finer control over how the @code{first} and
@code{last} attributes are set in the @code{Custom} example. In the previous
version of our module, the instance variables @code{first} and @code{last}
could be set to non-string values or even deleted. We want to make sure that
these attributes always contain strings.

@example
#define PY_SSIZE_T_CLEAN
#include <Python.h>
#include <stddef.h> /* for offsetof() */

typedef struct @{
    PyObject_HEAD
    PyObject *first; /* first name */
    PyObject *last;  /* last name */
    int number;
@} CustomObject;

static void
Custom_dealloc(PyObject *op)
@{
    CustomObject *self = (CustomObject *) op;
    Py_XDECREF(self->first);
    Py_XDECREF(self->last);
    Py_TYPE(self)->tp_free(self);
@}

static PyObject *
Custom_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
@{
    CustomObject *self;
    self = (CustomObject *) type->tp_alloc(type, 0);
    if (self != NULL) @{
        self->first = Py_GetConstant(Py_CONSTANT_EMPTY_STR);
        if (self->first == NULL) @{
            Py_DECREF(self);
            return NULL;
        @}
        self->last = Py_GetConstant(Py_CONSTANT_EMPTY_STR);
        if (self->last == NULL) @{
            Py_DECREF(self);
            return NULL;
        @}
        self->number = 0;
    @}
    return (PyObject *) self;
@}

static int
Custom_init(PyObject *op, PyObject *args, PyObject *kwds)
@{
    CustomObject *self = (CustomObject *) op;
    static char *kwlist[] = @{"first", "last", "number", NULL@};
    PyObject *first = NULL, *last = NULL;

    if (!PyArg_ParseTupleAndKeywords(args, kwds, "|UUi", kwlist,
                                     &first, &last,
                                     &self->number))
        return -1;

    if (first) @{
        Py_SETREF(self->first, Py_NewRef(first));
    @}
    if (last) @{
        Py_SETREF(self->last, Py_NewRef(last));
    @}
    return 0;
@}

static PyMemberDef Custom_members[] = @{
    @{"number", Py_T_INT, offsetof(CustomObject, number), 0,
     "custom number"@},
    @{NULL@}  /* Sentinel */
@};

static PyObject *
Custom_getfirst(PyObject *op, void *closure)
@{
    CustomObject *self = (CustomObject *) op;
    return Py_NewRef(self->first);
@}

static int
Custom_setfirst(PyObject *op, PyObject *value, void *closure)
@{
    CustomObject *self = (CustomObject *) op;
    if (value == NULL) @{
        PyErr_SetString(PyExc_TypeError, "Cannot delete the first attribute");
        return -1;
    @}
    if (!PyUnicode_Check(value)) @{
        PyErr_SetString(PyExc_TypeError,
                        "The first attribute value must be a string");
        return -1;
    @}
    Py_SETREF(self->first, Py_NewRef(value));
    return 0;
@}

static PyObject *
Custom_getlast(PyObject *op, void *closure)
@{
    CustomObject *self = (CustomObject *) op;
    return Py_NewRef(self->last);
@}

static int
Custom_setlast(PyObject *op, PyObject *value, void *closure)
@{
    CustomObject *self = (CustomObject *) op;
    if (value == NULL) @{
        PyErr_SetString(PyExc_TypeError, "Cannot delete the last attribute");
        return -1;
    @}
    if (!PyUnicode_Check(value)) @{
        PyErr_SetString(PyExc_TypeError,
                        "The last attribute value must be a string");
        return -1;
    @}
    Py_SETREF(self->last, Py_NewRef(value));
    return 0;
@}

static PyGetSetDef Custom_getsetters[] = @{
    @{"first", Custom_getfirst, Custom_setfirst,
     "first name", NULL@},
    @{"last", Custom_getlast, Custom_setlast,
     "last name", NULL@},
    @{NULL@}  /* Sentinel */
@};

static PyObject *
Custom_name(PyObject *op, PyObject *Py_UNUSED(dummy))
@{
    CustomObject *self = (CustomObject *) op;
    return PyUnicode_FromFormat("%S %S", self->first, self->last);
@}

static PyMethodDef Custom_methods[] = @{
    @{"name", Custom_name, METH_NOARGS,
     "Return the name, combining the first and last name"
    @},
    @{NULL@}  /* Sentinel */
@};

static PyTypeObject CustomType = @{
    .ob_base = PyVarObject_HEAD_INIT(NULL, 0)
    .tp_name = "custom3.Custom",
    .tp_doc = PyDoc_STR("Custom objects"),
    .tp_basicsize = sizeof(CustomObject),
    .tp_itemsize = 0,
    .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
    .tp_new = Custom_new,
    .tp_init = Custom_init,
    .tp_dealloc = Custom_dealloc,
    .tp_members = Custom_members,
    .tp_methods = Custom_methods,
    .tp_getset = Custom_getsetters,
@};

static int
custom_module_exec(PyObject *m)
@{
    if (PyType_Ready(&CustomType) < 0) @{
        return -1;
    @}

    if (PyModule_AddObjectRef(m, "Custom", (PyObject *) &CustomType) < 0) @{
        return -1;
    @}

    return 0;
@}

static PyModuleDef_Slot custom_module_slots[] = @{
    @{Py_mod_exec, custom_module_exec@},
    @{Py_mod_multiple_interpreters, Py_MOD_MULTIPLE_INTERPRETERS_NOT_SUPPORTED@},
    @{0, NULL@}
@};

static PyModuleDef custom_module = @{
    .m_base = PyModuleDef_HEAD_INIT,
    .m_name = "custom3",
    .m_doc = "Example module that creates an extension type.",
    .m_size = 0,
    .m_slots = custom_module_slots,
@};

PyMODINIT_FUNC
PyInit_custom3(void)
@{
    return PyModuleDef_Init(&custom_module);
@}
@end example

To provide greater control, over the @code{first} and @code{last} attributes,
we’ll use custom getter and setter functions.  Here are the functions for
getting and setting the @code{first} attribute:

@example
static PyObject *
Custom_getfirst(PyObject *op, void *closure)
@{
    CustomObject *self = (CustomObject *) op;
    Py_INCREF(self->first);
    return self->first;
@}

static int
Custom_setfirst(PyObject *op, PyObject *value, void *closure)
@{
    CustomObject *self = (CustomObject *) op;
    PyObject *tmp;
    if (value == NULL) @{
        PyErr_SetString(PyExc_TypeError, "Cannot delete the first attribute");
        return -1;
    @}
    if (!PyUnicode_Check(value)) @{
        PyErr_SetString(PyExc_TypeError,
                        "The first attribute value must be a string");
        return -1;
    @}
    tmp = self->first;
    Py_INCREF(value);
    self->first = value;
    Py_DECREF(tmp);
    return 0;
@}
@end example

The getter function is passed a @code{Custom} object and a “closure”, which is
a void pointer.  In this case, the closure is ignored.  (The closure supports an
advanced usage in which definition data is passed to the getter and setter. This
could, for example, be used to allow a single set of getter and setter functions
that decide the attribute to get or set based on data in the closure.)

The setter function is passed the @code{Custom} object, the new value, and the
closure.  The new value may be @code{NULL}, in which case the attribute is being
deleted.  In our setter, we raise an error if the attribute is deleted or if its
new value is not a string.

@ref{db1,,PyGetSetDef} 구조체의 배열을 만듭니다:

@example
static PyGetSetDef Custom_getsetters[] = @{
    @{"first", Custom_getfirst, Custom_setfirst,
     "first name", NULL@},
    @{"last", Custom_getlast, Custom_setlast,
     "last name", NULL@},
    @{NULL@}  /* Sentinel */
@};
@end example

그리고 @ref{4f16,,tp_getset} 슬롯에 등록합니다:

@example
.tp_getset = Custom_getsetters,
@end example

@ref{db1,,PyGetSetDef} 구조체의 마지막 항목은 위에서 언급한 “클로저”입니다. 이 경우, 클로저를 사용하지 않아서, @code{NULL}만 전달합니다.

또한 이러한 어트리뷰트에 대한 멤버 정의를 제거합니다:

@example
static PyMemberDef Custom_members[] = @{
    @{"number", Py_T_INT, offsetof(CustomObject, number), 0,
     "custom number"@},
    @{NULL@}  /* Sentinel */
@};
@end example

또한 문자열만 전달되도록 @footnote{
우리는 이제 first와 last 멤버가 문자열이라는 것을 알고 있어서, 참조 횟수를 줄이는 데 덜 주의할 수 있지만, 우리는 문자열 서브 클래스의 인스턴스를 받아들입니다. 일반 문자열을 할당 해제하는 것이 우리 객체로 다시 호출되지는 않더라도, 문자열 서브 클래스의 인스턴스를 할당 해제하는 것이 객체로 다시 호출되지 않는다고 보장할 수 없습니다.
} @ref{7a0,,tp_init} 처리기를 갱신해야 합니다:

@example
static int
Custom_init(PyObject *op, PyObject *args, PyObject *kwds)
@{
    CustomObject *self = (CustomObject *) op;
    static char *kwlist[] = @{"first", "last", "number", NULL@};
    PyObject *first = NULL, *last = NULL, *tmp;

    if (!PyArg_ParseTupleAndKeywords(args, kwds, "|UUi", kwlist,
                                     &first, &last,
                                     &self->number))
        return -1;

    if (first) @{
        tmp = self->first;
        Py_INCREF(first);
        self->first = first;
        Py_DECREF(tmp);
    @}
    if (last) @{
        tmp = self->last;
        Py_INCREF(last);
        self->last = last;
        Py_DECREF(tmp);
    @}
    return 0;
@}
@end example

이러한 변경을 통해, @code{first}와 @code{last} 멤버가 절대 @code{NULL}이 아니라고 확신할 수 있어서, 거의 모든 경우에 @code{NULL} 값 검사를 제거할 수 있습니다. 이것은 대부분의 @ref{991,,Py_XDECREF()} 호출이 @ref{78f,,Py_DECREF()} 호출로 변환될 수 있음을 의미합니다. 이러한 호출을 변경할 수 없는 유일한 장소는 @code{tp_dealloc} 구현에서인데, @code{tp_new}에서 이 멤버의 초기화가 실패했을 가능성이 있습니다.

또한 이전과 마찬가지로, 초기화 함수에서 모듈 초기화 함수와 모듈 이름을 바꾸고, @code{setup.py} 파일에 추가 정의를 추가합니다.

@node 순환 가비지 수거 지원하기,다른 형의 서브 클래싱,데이터 어트리뷰트를 더 세밀하게 제어하기,확장형 정의하기 자습서
@anchor{extending/newtypes_tutorial supporting-cyclic-garbage-collection}@anchor{4f17}
@subsubsection 순환 가비지 수거 지원하기


파이썬에는 참조 횟수가 0이 아닐 때도 불필요한 객체를 식별할 수 있는 @ref{17dd,,순환 가비지 수거기 (GC)}가 있습니다. 이것은 객체가 순환에 참여할 때 일어날 수 있습니다. 예를 들어, 다음을 고려하십시오:

@example
>>> l = []
>>> l.append(l)
>>> del l
@end example

이 예에서, 자신을 포함하는 리스트를 만듭니다. 삭제해도 여전히 자체 참조가 있습니다. 참조 횟수가 0으로 떨어지지 않습니다. 다행스럽게도, 파이썬의 순환 가비지 수거기는 결국 리스트가 가비지임을 확인하고 해제합니다.

In the second version of the @code{Custom} example, we allowed any kind of
object to be stored in the @code{first} or @code{last} attributes @footnote{
또한, 어트리뷰트가 문자열 인스턴스로 제한된 경우에도, 사용자는 임의의 @ref{169,,str} 서브 클래스를 전달할 수 있어서 여전히 참조 순환을 만들 수 있습니다.
}.
Besides, in the second and third versions, we allowed subclassing
@code{Custom}, and subclasses may add arbitrary attributes.  For any of
those two reasons, @code{Custom} objects can participate in cycles:

@example
>>> import custom3
>>> class Derived(custom3.Custom): pass
...
>>> n = Derived()
>>> n.some_attribute = n
@end example

To allow a @code{Custom} instance participating in a reference cycle to
be properly detected and collected by the cyclic GC, our @code{Custom} type
needs to fill two additional slots and to enable a flag that enables these slots:

@example
#define PY_SSIZE_T_CLEAN
#include <Python.h>
#include <stddef.h> /* for offsetof() */

typedef struct @{
    PyObject_HEAD
    PyObject *first; /* first name */
    PyObject *last;  /* last name */
    int number;
@} CustomObject;

static int
Custom_traverse(PyObject *op, visitproc visit, void *arg)
@{
    CustomObject *self = (CustomObject *) op;
    Py_VISIT(self->first);
    Py_VISIT(self->last);
    return 0;
@}

static int
Custom_clear(PyObject *op)
@{
    CustomObject *self = (CustomObject *) op;
    Py_CLEAR(self->first);
    Py_CLEAR(self->last);
    return 0;
@}

static void
Custom_dealloc(PyObject *op)
@{
    PyObject_GC_UnTrack(op);
    (void)Custom_clear(op);
    Py_TYPE(op)->tp_free(op);
@}

static PyObject *
Custom_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
@{
    CustomObject *self;
    self = (CustomObject *) type->tp_alloc(type, 0);
    if (self != NULL) @{
        self->first = Py_GetConstant(Py_CONSTANT_EMPTY_STR);
        if (self->first == NULL) @{
            Py_DECREF(self);
            return NULL;
        @}
        self->last = Py_GetConstant(Py_CONSTANT_EMPTY_STR);
        if (self->last == NULL) @{
            Py_DECREF(self);
            return NULL;
        @}
        self->number = 0;
    @}
    return (PyObject *) self;
@}

static int
Custom_init(PyObject *op, PyObject *args, PyObject *kwds)
@{
    CustomObject *self = (CustomObject *) op;
    static char *kwlist[] = @{"first", "last", "number", NULL@};
    PyObject *first = NULL, *last = NULL;

    if (!PyArg_ParseTupleAndKeywords(args, kwds, "|UUi", kwlist,
                                     &first, &last,
                                     &self->number))
        return -1;

    if (first) @{
        Py_SETREF(self->first, Py_NewRef(first));
    @}
    if (last) @{
        Py_SETREF(self->last, Py_NewRef(last));
    @}
    return 0;
@}

static PyMemberDef Custom_members[] = @{
    @{"number", Py_T_INT, offsetof(CustomObject, number), 0,
     "custom number"@},
    @{NULL@}  /* Sentinel */
@};

static PyObject *
Custom_getfirst(PyObject *op, void *closure)
@{
    CustomObject *self = (CustomObject *) op;
    return Py_NewRef(self->first);
@}

static int
Custom_setfirst(PyObject *op, PyObject *value, void *closure)
@{
    CustomObject *self = (CustomObject *) op;
    if (value == NULL) @{
        PyErr_SetString(PyExc_TypeError, "Cannot delete the first attribute");
        return -1;
    @}
    if (!PyUnicode_Check(value)) @{
        PyErr_SetString(PyExc_TypeError,
                        "The first attribute value must be a string");
        return -1;
    @}
    Py_XSETREF(self->first, Py_NewRef(value));
    return 0;
@}

static PyObject *
Custom_getlast(PyObject *op, void *closure)
@{
    CustomObject *self = (CustomObject *) op;
    return Py_NewRef(self->last);
@}

static int
Custom_setlast(PyObject *op, PyObject *value, void *closure)
@{
    CustomObject *self = (CustomObject *) op;
    if (value == NULL) @{
        PyErr_SetString(PyExc_TypeError, "Cannot delete the last attribute");
        return -1;
    @}
    if (!PyUnicode_Check(value)) @{
        PyErr_SetString(PyExc_TypeError,
                        "The last attribute value must be a string");
        return -1;
    @}
    Py_XSETREF(self->last, Py_NewRef(value));
    return 0;
@}

static PyGetSetDef Custom_getsetters[] = @{
    @{"first", Custom_getfirst, Custom_setfirst,
     "first name", NULL@},
    @{"last", Custom_getlast, Custom_setlast,
     "last name", NULL@},
    @{NULL@}  /* Sentinel */
@};

static PyObject *
Custom_name(PyObject *op, PyObject *Py_UNUSED(dummy))
@{
    CustomObject *self = (CustomObject *) op;
    return PyUnicode_FromFormat("%S %S", self->first, self->last);
@}

static PyMethodDef Custom_methods[] = @{
    @{"name", Custom_name, METH_NOARGS,
     "Return the name, combining the first and last name"
    @},
    @{NULL@}  /* Sentinel */
@};

static PyTypeObject CustomType = @{
    .ob_base = PyVarObject_HEAD_INIT(NULL, 0)
    .tp_name = "custom4.Custom",
    .tp_doc = PyDoc_STR("Custom objects"),
    .tp_basicsize = sizeof(CustomObject),
    .tp_itemsize = 0,
    .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
    .tp_new = Custom_new,
    .tp_init = Custom_init,
    .tp_dealloc = Custom_dealloc,
    .tp_traverse = Custom_traverse,
    .tp_clear = Custom_clear,
    .tp_members = Custom_members,
    .tp_methods = Custom_methods,
    .tp_getset = Custom_getsetters,
@};

static int
custom_module_exec(PyObject *m)
@{
    if (PyType_Ready(&CustomType) < 0) @{
        return -1;
    @}

    if (PyModule_AddObjectRef(m, "Custom", (PyObject *) &CustomType) < 0) @{
        return -1;
    @}

    return 0;
@}

static PyModuleDef_Slot custom_module_slots[] = @{
    @{Py_mod_exec, custom_module_exec@},
    @{Py_mod_multiple_interpreters, Py_MOD_MULTIPLE_INTERPRETERS_NOT_SUPPORTED@},
    @{0, NULL@}
@};

static PyModuleDef custom_module = @{
    .m_base = PyModuleDef_HEAD_INIT,
    .m_name = "custom4",
    .m_doc = "Example module that creates an extension type.",
    .m_size = 0,
    .m_slots = custom_module_slots,
@};

PyMODINIT_FUNC
PyInit_custom4(void)
@{
    return PyModuleDef_Init(&custom_module);
@}
@end example

첫째, 탐색(traversal) 메서드는 순환 GC가 순환에 참여할 수 있는 서브 객체에 대해 알 수 있도록 합니다:

@example
static int
Custom_traverse(PyObject *op, visitproc visit, void *arg)
@{
    CustomObject *self = (CustomObject *) op;
    int vret;
    if (self->first) @{
        vret = visit(self->first, arg);
        if (vret != 0)
            return vret;
    @}
    if (self->last) @{
        vret = visit(self->last, arg);
        if (vret != 0)
            return vret;
    @}
    return 0;
@}
@end example

For each subobject that can participate in cycles, we need to call the
@code{visit()} function, which is passed to the traversal method. The
@code{visit()} function takes as arguments the subobject and the extra argument
`arg' passed to the traversal method.  It returns an integer value that must be
returned if it is non-zero.

파이썬은 visit 함수 호출을 자동화하는 @ref{4f18,,Py_VISIT()} 매크로를 제공합니다. @code{Py_VISIT()}를 사용하면, @code{Custom_traverse}에서 관용구 양을 최소화할 수 있습니다:

@example
static int
Custom_traverse(PyObject *op, visitproc visit, void *arg)
@{
    CustomObject *self = (CustomObject *) op;
    Py_VISIT(self->first);
    Py_VISIT(self->last);
    return 0;
@}
@end example

@cartouche
@quotation 참고 
@ref{4f18,,Py_VISIT()}를 사용하려면 @ref{981,,tp_traverse} 구현에서 인자 이름을 `visit'과 `arg'로 정확하게 지정해야 합니다.
@end quotation
@end cartouche

둘째, 순환에 참여할 수 있는 서브 객체를 지우는 메서드를 제공해야 합니다:

@example
static int
Custom_clear(PyObject *op)
@{
    CustomObject *self = (CustomObject *) op;
    Py_CLEAR(self->first);
    Py_CLEAR(self->last);
    return 0;
@}
@end example

@ref{797,,Py_CLEAR()} 매크로 사용에 주목하십시오. 참조 횟수를 줄이면서 임의 형의 데이터 어트리뷰트를 지우는 권장되고 안전한 방법입니다. @code{NULL}로 설정하기 전에 어트리뷰트에서 @ref{991,,Py_XDECREF()}를 대신 호출했으면, 어트리뷰트의 파괴자가 어트리뷰트를 다시 읽는 코드(`특히' 참조 순환이 있으면 )를 다시 호출할 가능성이 있습니다.

@cartouche
@quotation 참고 
다음과 같이 작성하여 @ref{797,,Py_CLEAR()}를 에뮬레이션할 수 있습니다:

@example
PyObject *tmp;
tmp = self->first;
self->first = NULL;
Py_XDECREF(tmp);
@end example

그런데도, 어트리뷰트를 삭제할 때 항상 @ref{797,,Py_CLEAR()}를 사용하기가 훨씬 쉽고 에러가 적습니다. 견고성을 희생하면서 세밀한 최적화를 시도하지 마십시오!
@end quotation
@end cartouche

할당 해제기 @code{Custom_dealloc}은 어트리뷰트를 지울 때 임의의 코드를 호출할 수 있습니다. 이는 함수 내에서 순환 GC가 트리거 될 수 있음을 의미합니다. GC는 참조 횟수가 0이 아니라고 가정하기 때문에, 멤버를 지우기 전에 @ref{170a,,PyObject_GC_UnTrack()}을 호출하여 GC에서 객체를 추적 해제해야 합니다. 다음은 @code{PyObject_GC_UnTrack()}과 @code{Custom_clear}를 사용하여 다시 구현된 할당 해제기입니다:

@example
static void
Custom_dealloc(PyObject *op)
@{
    PyObject_GC_UnTrack(op);
    (void)Custom_clear(op);
    Py_TYPE(op)->tp_free(op);
@}
@end example

Finally, we add the @ref{980,,Py_TPFLAGS_HAVE_GC} flag to the class flags:

@example
.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
@end example

거의 다 됐습니다. 사용자 정의 @ref{4f0f,,tp_alloc}이나 @ref{4f0e,,tp_free} 처리기를 작성했으면, 순환 가비지 수거를 위해 이를 수정해야 합니다. 대부분의 확장은 자동으로 제공된 버전을 사용합니다.

@node 다른 형의 서브 클래싱,,순환 가비지 수거 지원하기,확장형 정의하기 자습서
@anchor{extending/newtypes_tutorial subclassing-other-types}@anchor{4f19}
@subsubsection 다른 형의 서브 클래싱


기존 형에서 파생된 새 확장형을 만들 수 있습니다. 확장이 필요한 @ref{c9b,,PyTypeObject}를 쉽게 사용할 수 있어서, 내장형에서 상속하기가 가장 쉽습니다. 확장 모듈 간에 이러한 @code{PyTypeObject} 구조체를 공유하기 어려울 수 있습니다.

In this example we will create a @code{SubList} type that inherits from the
built-in @ref{24d,,list} type. The new type will be completely compatible with
regular lists, but will have an additional @code{increment()} method that
increases an internal counter:

@example
>>> import sublist
>>> s = sublist.SubList(range(3))
>>> s.extend(s)
>>> print(len(s))
6
>>> print(s.increment())
1
>>> print(s.increment())
2
@end example

@example
#define PY_SSIZE_T_CLEAN
#include <Python.h>

typedef struct @{
    PyListObject list;
    int state;
@} SubListObject;

static PyObject *
SubList_increment(PyObject *op, PyObject *Py_UNUSED(dummy))
@{
    SubListObject *self = (SubListObject *) op;
    self->state++;
    return PyLong_FromLong(self->state);
@}

static PyMethodDef SubList_methods[] = @{
    @{"increment", SubList_increment, METH_NOARGS,
     PyDoc_STR("increment state counter")@},
    @{NULL@},
@};

static int
SubList_init(PyObject *op, PyObject *args, PyObject *kwds)
@{
    SubListObject *self = (SubListObject *) op;
    if (PyList_Type.tp_init(op, args, kwds) < 0)
        return -1;
    self->state = 0;
    return 0;
@}

static PyTypeObject SubListType = @{
    .ob_base = PyVarObject_HEAD_INIT(NULL, 0)
    .tp_name = "sublist.SubList",
    .tp_doc = PyDoc_STR("SubList objects"),
    .tp_basicsize = sizeof(SubListObject),
    .tp_itemsize = 0,
    .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
    .tp_init = SubList_init,
    .tp_methods = SubList_methods,
@};

static int
sublist_module_exec(PyObject *m)
@{
    SubListType.tp_base = &PyList_Type;
    if (PyType_Ready(&SubListType) < 0) @{
        return -1;
    @}

    if (PyModule_AddObjectRef(m, "SubList", (PyObject *) &SubListType) < 0) @{
        return -1;
    @}

    return 0;
@}

static PyModuleDef_Slot sublist_module_slots[] = @{
    @{Py_mod_exec, sublist_module_exec@},
    @{Py_mod_multiple_interpreters, Py_MOD_MULTIPLE_INTERPRETERS_NOT_SUPPORTED@},
    @{0, NULL@}
@};

static PyModuleDef sublist_module = @{
    .m_base = PyModuleDef_HEAD_INIT,
    .m_name = "sublist",
    .m_doc = "Example module that creates an extension type.",
    .m_size = 0,
    .m_slots = sublist_module_slots,
@};

PyMODINIT_FUNC
PyInit_sublist(void)
@{
    return PyModuleDef_Init(&sublist_module);
@}
@end example

As you can see, the source code closely resembles the @code{Custom} examples in
previous sections. We will break down the main differences between them.

@example
typedef struct @{
    PyListObject list;
    int state;
@} SubListObject;
@end example

파생형 객체의 주요 차이점은 베이스형의 객체 구조체가 첫 번째 값이어야 한다는 것입니다. 베이스형은 이미 구조체의 시작 부분에 @ref{14e2,,PyObject_HEAD()}를 포함합니다.

When a Python object is a @code{SubList} instance, its @code{PyObject *} pointer
can be safely cast to both @code{PyListObject *} and @code{SubListObject *}:

@example
static int
SubList_init(PyObject *op, PyObject *args, PyObject *kwds)
@{
    SubListObject *self = (SubListObject *) op;
    if (PyList_Type.tp_init(op, args, kwds) < 0)
        return -1;
    self->state = 0;
    return 0;
@}
@end example

We see above how to call through to the @ref{8be,,__init__()} method of the base
type.

이 패턴은 사용자 정의 @ref{79e,,tp_new}와 @ref{4efb,,tp_dealloc} 멤버를 갖는 형을 작성할 때 중요합니다. @code{tp_new} 처리기는 실제로 @ref{4f0f,,tp_alloc}을 사용하여 객체의 메모리를 만들지 말고, 베이스 클래스가 자체 @code{tp_new}를 호출하여 처리하도록 해야 합니다.

The @ref{c9b,,PyTypeObject} struct supports a @ref{2372,,tp_base}
specifying the type’s concrete base class.  Due to cross-platform compiler
issues, you can’t fill that field directly with a reference to
@ref{4f1a,,PyList_Type}; it should be done in the @ref{b75,,Py_mod_exec}
function:

@example
static int
sublist_module_exec(PyObject *m)
@{
    SubListType.tp_base = &PyList_Type;
    if (PyType_Ready(&SubListType) < 0) @{
        return -1;
    @}

    if (PyModule_AddObjectRef(m, "SubList", (PyObject *) &SubListType) < 0) @{
        return -1;
    @}

    return 0;
@}
@end example

@ref{97f,,PyType_Ready()}를 호출하기 전에, 형 구조체에 @ref{2372,,tp_base} 슬롯이 채워져 있어야 합니다. 기존 형을 파생할 때, @ref{4f0b,,PyType_GenericNew()}로 @ref{4f0f,,tp_alloc} 슬롯을 채울 필요는 없습니다 – 베이스형의 할당 함수가 상속됩니다.

After that, calling @ref{97f,,PyType_Ready()} and adding the type object to the
module is the same as with the basic @code{Custom} examples.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 확장형 정의하기 여러 가지 주제,C와 C++ 확장 빌드하기,확장형 정의하기 자습서,제삼자 도구 없이 확장 만들기
@anchor{extending/newtypes doc}@anchor{4f1b}@anchor{extending/newtypes defining-extension-types-assorted-topics}@anchor{4f1c}@anchor{extending/newtypes new-types-topics}@anchor{4f1d}@anchor{extending/newtypes translation-repo}@anchor{4f1e}
@subsection 확장형 정의하기: 여러 가지 주제

@anchor{extending/newtypes dnt-type-methods}@anchor{4f1f}
이 섹션은 구현할 수 있는 다양한 형 메서드와 그것이 하는 일에 대해 훑어보기를 제공하기 위한 것입니다.

다음은 @ref{508,,디버그 빌드}에서만 사용되는 일부 필드가 생략된 @ref{c9b,,PyTypeObject}의 정의입니다:

@example
typedef struct _typeobject @{
    PyObject_VAR_HEAD
    const char *tp_name; /* For printing, in format "<module>.<name>" */
    Py_ssize_t tp_basicsize, tp_itemsize; /* For allocation */

    /* Methods to implement standard operations */

    destructor tp_dealloc;
    Py_ssize_t tp_vectorcall_offset;
    getattrfunc tp_getattr;
    setattrfunc tp_setattr;
    PyAsyncMethods *tp_as_async; /* formerly known as tp_compare (Python 2)
                                    or tp_reserved (Python 3) */
    reprfunc tp_repr;

    /* Method suites for standard classes */

    PyNumberMethods *tp_as_number;
    PySequenceMethods *tp_as_sequence;
    PyMappingMethods *tp_as_mapping;

    /* More standard operations (here for binary compatibility) */

    hashfunc tp_hash;
    ternaryfunc tp_call;
    reprfunc tp_str;
    getattrofunc tp_getattro;
    setattrofunc tp_setattro;

    /* Functions to access object as input/output buffer */
    PyBufferProcs *tp_as_buffer;

    /* Flags to define presence of optional/expanded features */
    unsigned long tp_flags;

    const char *tp_doc; /* Documentation string */

    /* Assigned meaning in release 2.0 */
    /* call function for all accessible objects */
    traverseproc tp_traverse;

    /* delete references to contained objects */
    inquiry tp_clear;

    /* Assigned meaning in release 2.1 */
    /* rich comparisons */
    richcmpfunc tp_richcompare;

    /* weak reference enabler */
    Py_ssize_t tp_weaklistoffset;

    /* Iterators */
    getiterfunc tp_iter;
    iternextfunc tp_iternext;

    /* Attribute descriptor and subclassing stuff */
    PyMethodDef *tp_methods;
    PyMemberDef *tp_members;
    PyGetSetDef *tp_getset;
    // Strong reference on a heap type, borrowed reference on a static type
    PyTypeObject *tp_base;
    PyObject *tp_dict;
    descrgetfunc tp_descr_get;
    descrsetfunc tp_descr_set;
    Py_ssize_t tp_dictoffset;
    initproc tp_init;
    allocfunc tp_alloc;
    newfunc tp_new;
    freefunc tp_free; /* Low-level free-memory routine */
    inquiry tp_is_gc; /* For PyObject_IS_GC */
    PyObject *tp_bases;
    PyObject *tp_mro; /* method resolution order */
    PyObject *tp_cache; /* no longer used */
    void *tp_subclasses;  /* for static builtin types this is an index */
    PyObject *tp_weaklist; /* not used for static builtin types */
    destructor tp_del;

    /* Type attribute cache version tag. Added in version 2.6.
     * If zero, the cache is invalid and must be initialized.
     */
    unsigned int tp_version_tag;

    destructor tp_finalize;
    vectorcallfunc tp_vectorcall;

    /* bitset of which type-watchers care about this type */
    unsigned char tp_watched;

    /* Number of tp_version_tag values used.
     * Set to _Py_ATTR_CACHE_UNUSED if the attribute cache is
     * disabled for this type (e.g. due to custom MRO entries).
     * Otherwise, limited to MAX_VERSIONS_PER_CLASS (defined elsewhere).
     */
    uint16_t tp_versions_used;
@} PyTypeObject;
@end example

이제 메서드가 아주 `많습니다'. 너무 걱정하지 마십시오 – 정의하려는 형이 있으면, 이 중 일부만 구현할 가능성이 매우 높습니다.

아마 지금까지 예상했듯이, 이것에 대해 살펴보고 다양한 처리기에 대한 자세한 정보를 제공할 것입니다. 필드의 순서에 영향을 미치는 많은 과거의 짐이 있어서, 구조체에 정의된 순서대로 진행하지 않을 것입니다. 필요한 필드가 포함된 예제를 찾은 다음 새 형에 맞게 값을 변경하기가 종종 가장 쉽습니다.

@example
const char *tp_name; /* 인쇄 용 */
@end example

형의 이름 – 이전 장에서 언급했듯이, 이것은 여러 곳에서 나타나는데, 거의 진단 목적입니다. 그러한 상황에서 도움이 될만한 것을 선택하십시오!

@example
Py_ssize_t tp_basicsize, tp_itemsize; /* 할당(allocation)용 */
@end example

이 필드는 이 형의 새 객체가 만들어질 때 할당할 메모리양을 런타임에 알려줍니다. 파이썬은 가변 길이 구조(생각하세요: 문자열, 튜플)에 대한 지원을 내장하고 있는데, 이때 @ref{23bb,,tp_itemsize} 필드가 참여합니다. 이것은 나중에 다룰 것입니다.

@example
const char *tp_doc;
@end example

여기에 파이썬 스크립트가 @code{obj.__doc__}을 참조하여 독스트링을 꺼낼 때 반환할 문자열(또는 문자열의 주소)을 넣을 수 있습니다.

이제 기본 형 메서드에 대해 살펴보겠습니다 – 대부분의 확장형이 구현할 것들입니다.

@menu
* 파이널리제이션과 할당 해제:: 
* 객체 표현:: 
* 어트리뷰트 관리:: 
* 객체 비교:: 
* 추상 프로토콜 지원:: 
* 약한 참조 지원:: 
* 추가 제안:: 

@end menu

@node 파이널리제이션과 할당 해제,객체 표현,,확장형 정의하기 여러 가지 주제
@anchor{extending/newtypes finalization-and-de-allocation}@anchor{4f20}
@subsubsection 파이널리제이션과 할당 해제


@geindex 객체;할당 해제
@geindex 할당 해제@comma{} 객체
@geindex 객체;파이널리제이션
@geindex 파이널리제이션@comma{} 객체의

@example
destructor tp_dealloc;
@end example

이 함수는 형의 인스턴스의 참조 횟수가 0으로 줄어들고 파이썬 인터프리터가 그것을 재활용하고자 할 때 호출됩니다. 여러분의 형에 해제할 메모리가 있거나 수행할 기타 정리 작업이 있으면, 여기에 넣을 수 있습니다. 객체 자체도 여기서 해제해야 합니다. 이 함수의 예는 다음과 같습니다:

@example
static void
newdatatype_dealloc(PyObject *op)
@{
    newdatatypeobject *self = (newdatatypeobject *) op;
    free(self->obj_UnderlyingDatatypePtr);
    Py_TYPE(self)->tp_free(self);
@}
@end example

형이 가비지 수거를 지원하면, 파괴자는 멤버 필드를 지우기 전에 @ref{170a,,PyObject_GC_UnTrack()}을 호출해야 합니다:

@example
static void
newdatatype_dealloc(PyObject *op)
@{
    newdatatypeobject *self = (newdatatypeobject *) op;
    PyObject_GC_UnTrack(op);
    Py_CLEAR(self->other_obj);
    ...
    Py_TYPE(self)->tp_free(self);
@}
@end example

@geindex PyErr_Fetch (C 함수)
@geindex PyErr_Restore (C 함수)

할당 해제 함수의 중요한 요구 사항 중 하나는 계류 중인 예외를 그대로 남겨 두어야 한다는 것입니다. 인터프리터가 파이썬 스택을 되감을 때 할당 해제기가 자주 호출되기 때문에 중요합니다; 스택이 (정상적인 반환이 아닌) 예외로 인해 되감길 때, 할당 해제기가 예외가 이미 설정되어 있음을 알 수 없도록 하는 것은 아무것도 수행되지 않습니다. 할당 해제기가 수행하는 추가 파이썬 코드가 실행될 수 있도록 하는 추가 조치는 예외가 설정되었음을 감지할 수 있습니다. 이는 인터프리터가 혼동하도록 할 수 있습니다. 이를 방지하는 올바른 방법은 안전하지 않은 조치를 수행하기 전에 계류 중인 예외를 저장하고 완료되면 복원하는 것입니다. @ref{428,,PyErr_Fetch()}와 @ref{42b,,PyErr_Restore()} 함수를 사용하여 수행할 수 있습니다:

@example
static void
my_dealloc(PyObject *obj)
@{
    MyObject *self = (MyObject *) obj;
    PyObject *cbresult;

    if (self->my_callback != NULL) @{
        PyObject *err_type, *err_value, *err_traceback;

        /* This saves the current exception state */
        PyErr_Fetch(&err_type, &err_value, &err_traceback);

        cbresult = PyObject_CallNoArgs(self->my_callback);
        if (cbresult == NULL) @{
           PyErr_WriteUnraisable(self->my_callback);
        @}
        else @{
            Py_DECREF(cbresult);
        @}

        /* This restores the saved exception state */
        PyErr_Restore(err_type, err_value, err_traceback);

        Py_DECREF(self->my_callback);
    @}
    Py_TYPE(self)->tp_free(self);
@}
@end example

@cartouche
@quotation 참고 
할당 해제 함수에서 안전하게 수행할 수 있는 작업에는 제한이 있습니다. 먼저, 형이 가비지 수거를 지원하면 (@ref{981,,tp_traverse} 및/또는 @ref{4f21,,tp_clear}를 사용해서), @ref{4efb,,tp_dealloc}이 호출될 때 객체의 일부 멤버가 지워지거나 파이널라이즈 될 수 있습니다. 둘째, @code{tp_dealloc}에서, 객체는 불안정한 상태에 있습니다: 참조 횟수가 0입니다. (위의 예에서와같이) 사소하지 않은 객체나 API를 호출하면 @code{tp_dealloc}을 다시 호출하게 되어, 이중 해제와 충돌이 발생할 수 있습니다.

파이썬 3.4부터는, @ref{4efb,,tp_dealloc}에 복잡한 파이널리제이션 코드를 넣지 말고, 대신 새로운 @ref{c9c,,tp_finalize} 형 메서드를 사용하는 것이 좋습니다.


@subsubheading 더 보기


@geindex Python 향상 제안; PEP 442
PEP 442@footnote{https://peps.python.org/pep-0442/}는 새로운 파이널리제이션 체계를 설명합니다.

@end quotation
@end cartouche

@geindex 문자열;객체 표현
@geindex 내장 함수;repr

@node 객체 표현,어트리뷰트 관리,파이널리제이션과 할당 해제,확장형 정의하기 여러 가지 주제
@anchor{extending/newtypes object-presentation}@anchor{4f22}
@subsubsection 객체 표현


파이썬에서, 객체의 텍스트 표현을 생성하는 두 가지 방법이 있습니다: @ref{1c1,,repr()} 함수와 @ref{169,,str()} 함수. (@ref{1174,,print()} 함수는 단지 @code{str()}을 호출합니다.) 이 처리기들은 모두 선택적입니다.

@example
reprfunc tp_repr;
reprfunc tp_str;
@end example

@ref{4f23,,tp_repr} 처리기는 호출된 인스턴스의 표현을 포함하는 문자열 객체를 반환해야 합니다. 다음은 간단한 예입니다:

@example
static PyObject *
newdatatype_repr(PyObject *op)
@{
    newdatatypeobject *self = (newdatatypeobject *) op;
    return PyUnicode_FromFormat("Repr-ified_newdatatype@{@{size:%d@}@}",
                                self->obj_UnderlyingDatatypePtr->size);
@}
@end example

@ref{4f23,,tp_repr} 처리기가 지정되지 않으면, 인터프리터는 형의 @ref{1cad,,tp_name}과 객체의 고유 식별 값을 사용하는 표현을 제공합니다.

@ref{4f24,,tp_str} 처리기는 @ref{169,,str()}에 대한 것이고, 위에서 설명한 @ref{4f23,,tp_repr} 처리기와 @ref{1c1,,repr()} 간의 관계와 같은 관계입니다; 즉, 파이썬 코드가 객체의 인스턴스에서 @code{str()}을 호출할 때 호출됩니다. 구현은 @code{tp_repr} 함수와 매우 유사하지만, 결과 문자열은 사람이 사용하기 위한 것입니다. @code{tp_str}을 지정하지 않으면, @code{tp_repr} 처리기가 대신 사용됩니다.

다음은 간단한 예입니다:

@example
static PyObject *
newdatatype_str(PyObject *op)
@{
    newdatatypeobject *self = (newdatatypeobject *) op;
    return PyUnicode_FromFormat("Stringified_newdatatype@{@{size:%d@}@}",
                                self->obj_UnderlyingDatatypePtr->size);
@}
@end example

@node 어트리뷰트 관리,객체 비교,객체 표현,확장형 정의하기 여러 가지 주제
@anchor{extending/newtypes attribute-management}@anchor{4f25}
@subsubsection 어트리뷰트 관리


어트리뷰트를 지원할 수 있는 모든 객체에 대해, 해당 형은 어트리뷰트가 결정되는(resolved) 방법을 제어하는 함수를 제공해야 합니다. 어트리뷰트를 꺼낼 수 있는 함수와 (뭔가 정의되어 있다면), 어트리뷰트를 설정하는 다른 함수(어트리뷰트 설정이 허용된다면)가 있어야 합니다. 어트리뷰트 제거는 특별한 경우이며, 처리기에 전달된 새 값이 @code{NULL}입니다.

파이썬은 두 쌍의 어트리뷰트 처리기를 지원합니다; 어트리뷰트를 지원하는 형은 한 쌍의 함수만 구현하면 됩니다. 차이점은 한 쌍은 어트리뷰트 이름을 char*로 취하고, 다른 쌍은 @ref{5dc,,PyObject}*를 받아들인다는 것입니다. 각 형은 구현의 편의에 더 적합한 쌍을 사용할 수 있습니다.

@example
getattrfunc  tp_getattr;        /* char * 버전 */
setattrfunc  tp_setattr;
/* ... */
getattrofunc tp_getattro;       /* PyObject * 버전 */
setattrofunc tp_setattro;
@end example

객체의 어트리뷰트에 액세스하는 것이 항상 간단한 연산이면 (짧게 설명할 것입니다), 어트리뷰트 관리 함수의 @ref{5dc,,PyObject}* 버전을 제공하는 데 사용할 수 있는 일반적인 구현이 있습니다. 파이썬 2.2부터 형별 어트리뷰트 처리기에 대한 실제 필요성은 거의 완전히 사라졌지만, 사용 가능한 새로운 일반 메커니즘을 사용하도록 갱신되지 않은 예제가 많이 있습니다.

@menu
* 범용 어트리뷰트 관리:: 
* 형별 어트리뷰트 관리:: 

@end menu

@node 범용 어트리뷰트 관리,형별 어트리뷰트 관리,,어트리뷰트 관리
@anchor{extending/newtypes generic-attribute-management}@anchor{4f12}@anchor{extending/newtypes id1}@anchor{4f26}
@subsubsection 범용 어트리뷰트 관리


대부분의 확장형은 `간단한' 어트리뷰트만 사용합니다. 그렇다면, 어트리뷰트를 간단하게 만드는 것은 무엇입니까? 충족해야 하는 몇 가지 조건만 있습니다:


@enumerate 

@item 
@ref{97f,,PyType_Ready()}가 호출될 때 어트리뷰트의 이름을 알아야 합니다.

@item 
어트리뷰트를 찾거나 설정했음을 기록하는 데 특별한 처리가 필요하지 않으며 값을 기반으로 조처를 하지 않아도 됩니다.
@end enumerate

이 목록은 어트리뷰트 값, 값을 계산하는 시점 또는 관련 데이터가 저장되는 방법에 제한을 두지 않음에 유의하십시오.

@ref{97f,,PyType_Ready()}가 호출될 때, 형 객체가 참조하는 3개의 테이블을 사용하여 형 객체의 딕셔너리에 배치되는 @ref{1884,,디스크립터}를 만듭니다. 각 디스크립터는 인스턴스 객체의 한 어트리뷰트에 대한 액세스를 제어합니다. 각 테이블은 선택적입니다; 세 개 모두가 @code{NULL}이면, 형의 인스턴스는 베이스형에서 상속된 어트리뷰트만 갖게 되며, @ref{1a64,,tp_getattro}와 @ref{4f27,,tp_setattro} 필드도 @code{NULL}로 남겨두어야 베이스형이 어트리뷰트를 처리할 수 있습니다.

테이블은 형 객체의 세 필드로 선언됩니다:

@example
struct PyMethodDef *tp_methods;
struct PyMemberDef *tp_members;
struct PyGetSetDef *tp_getset;
@end example

@ref{4f13,,tp_methods}가 @code{NULL}이 아니면, @ref{16dc,,PyMethodDef} 구조체의 배열을 참조해야 합니다. 테이블의 각 항목은 다음 구조체의 인스턴스입니다:

@example
typedef struct PyMethodDef @{
    const char  *ml_name;       /* 메서드 이름 */
    PyCFunction  ml_meth;       /* 구현 함수 */
    int          ml_flags;      /* 플래그 */
    const char  *ml_doc;        /* 독스트링 */
@} PyMethodDef;
@end example

형에서 제공되는 각 메서드에 대해 하나의 항목을 정의해야 합니다; 베이스형에서 상속된 메서드에는 항목이 필요하지 않습니다. 마지막에 하나의 추가 항목이 필요합니다; 배열의 끝을 나타내는 센티넬(sentinel)입니다. 센티넬의 @ref{4f28,,ml_name} 필드는 @code{NULL}이어야 합니다.

두 번째 테이블은 인스턴스에 저장된 데이터에 직접 매핑되는 어트리뷰트를 정의하는 데 사용됩니다. 다양한 기본 C형이 지원되며, 액세스는 읽기 전용이거나 읽고 쓰기일 수 있습니다. 테이블의 구조체는 다음과 같이 정의됩니다:

@example
typedef struct PyMemberDef @{
    const char *name;
    int         type;
    int         offset;
    int         flags;
    const char *doc;
@} PyMemberDef;
@end example

테이블의 각 항목에 대해, @ref{1884,,디스크립터}가 구성되고 형에 추가되어 인스턴스 구조체에서 값을 추출할 수 있게 됩니다. @ref{4f29,,type} 필드는 @ref{7ab,,Py_T_INT} 나 @ref{7ac,,Py_T_DOUBLE}와 같은 형 코드를 포함해야 합니다; 이 값은 파이썬 값과 C값 간에 변환하는 방법을 결정하는 데 사용됩니다. @ref{4f2a,,flags} 필드는 어트리뷰트에 액세스하는 방법을 제어하는 플래그를 저장하는 데 사용됩니다: 이를 @ref{7ad,,Py_READONLY}로 설정하면 파이썬 코드가 이를 설정하지 못하도록 방지할 수 있습니다.

@ref{4f11,,tp_members} 테이블을 사용하여 실행 시간에 사용되는 디스크립터를 구축하는 것의 흥미로운 이점은 이 방법으로 정의된 모든 어트리뷰트가 단순히 테이블에 텍스트를 제공하는 것으로 연관된 독스트링을 가질 수 있다는 것입니다. 응용 프로그램은 내부 검사(introspection) API를 사용하여 클래스 객체에서 디스크립터를 꺼내고, 그것의 @ref{2093,,__doc__} 어트리뷰트를 사용하여 독스트링을 얻을 수 있습니다.

@ref{4f13,,tp_methods} 테이블과 마찬가지로, @ref{4f28,,ml_name} 값이 @code{NULL}인 센티넬 항목이 필요합니다.

@c XXX Descriptors need to be explained in more detail somewhere, but not here.
@c 
@c Descriptor objects have two handler functions which correspond to the
@c \member{tp_getattro} and \member{tp_setattro} handlers.  The
@c \method{__get__()} handler is a function which is passed the descriptor,
@c instance, and type objects, and returns the value of the attribute, or it
@c returns \NULL{} and sets an exception.  The \method{__set__()} handler is
@c passed the descriptor, instance, type, and new value;

@node 형별 어트리뷰트 관리,,범용 어트리뷰트 관리,어트리뷰트 관리
@anchor{extending/newtypes type-specific-attribute-management}@anchor{4f2b}
@subsubsection 형별 어트리뷰트 관리


간단히 하기 위해, char* 버전 만 여기에서 예시합니다; name 매개 변수의 형이 인터페이스의 char*와 @ref{5dc,,PyObject}* 버전 간의 유일한 차이점입니다. 이 예제는 위의 범용 예제와 효과적으로 같은 것을 수행하지만, 파이썬 2.2에 추가된 범용 지원은 사용하지 않습니다. 처리기 함수가 호출되는 방식을 설명하므로, 기능을 확장해야 한다면, 무엇을 해야 할지 이해할 수 있을 겁니다.

@ref{4f2c,,tp_getattr} 처리기는 객체에 어트리뷰트 조회가 필요할 때 호출됩니다. 클래스의 @ref{6f9,,__getattr__()} 메서드가 호출되는 것과 같은 상황에서 호출됩니다.

예는 다음과 같습니다:

@example
static PyObject *
newdatatype_getattr(PyObject *op, char *name)
@{
    newdatatypeobject *self = (newdatatypeobject *) op;
    if (strcmp(name, "data") == 0) @{
        return PyLong_FromLong(self->data);
    @}

    PyErr_Format(PyExc_AttributeError,
                 "'%.100s' object has no attribute '%.400s'",
                 Py_TYPE(self)->tp_name, name);
    return NULL;
@}
@end example

@ref{4f2d,,tp_setattr} 처리기는 클래스 인스턴스의 @ref{2378,,__setattr__()}이나 @ref{2379,,__delattr__()} 메서드가 호출될 때 호출됩니다. 어트리뷰트를 삭제해야 하면, 세 번째 매개 변수는 @code{NULL}이 됩니다. 다음은 단순히 예외를 발생시키는 예입니다; 이것이 정말로 여러분이 원하는 전부라면, @code{tp_setattr} 처리기는 @code{NULL}로 설정되어야 합니다.

@example
static int
newdatatype_setattr(PyObject *op, char *name, PyObject *v)
@{
    PyErr_Format(PyExc_RuntimeError, "Read-only attribute: %s", name);
    return -1;
@}
@end example

@node 객체 비교,추상 프로토콜 지원,어트리뷰트 관리,확장형 정의하기 여러 가지 주제
@anchor{extending/newtypes object-comparison}@anchor{4f2e}
@subsubsection 객체 비교


@example
richcmpfunc tp_richcompare;
@end example

@ref{4f2f,,tp_richcompare} 처리기는 비교가 필요할 때 호출됩니다. @code{__lt__()}와 같은 @ref{23ae,,풍부한 비교 메서드}에 해당하며, @ref{4f30,,PyObject_RichCompare()}와 @ref{1d8a,,PyObject_RichCompareBool()}에 의해서도 호출됩니다.

이 함수는 두 개의 파이썬 객체와 연산자를 인자로 사용하여 호출됩니다, 여기서 연산자는 @code{Py_EQ}, @code{Py_NE}, @code{Py_LE}, @code{Py_GE}, @code{Py_LT} 또는 @code{Py_GT} 중 하나입니다. 지정된 연산자로 두 객체를 비교하고 비교에 성공하면 @code{Py_True}나 @code{Py_False}를, 비교가 구현되지 않았으며 다른 객체의 비교 메서드를 시도해야 한다는 것을 나타내려면 @code{Py_NotImplemented}를, 예외가 설정되면 @code{NULL}을 반환해야 합니다.

내부 포인터의 크기가 같으면 같다고 간주하는 데이터형에 대한 샘플 구현은 다음과 같습니다:

@example
static PyObject *
newdatatype_richcmp(PyObject *lhs, PyObject *rhs, int op)
@{
    newdatatypeobject *obj1 = (newdatatypeobject *) lhs;
    newdatatypeobject *obj2 = (newdatatypeobject *) rhs;
    PyObject *result;
    int c, size1, size2;

    /* code to make sure that both arguments are of type
       newdatatype omitted */

    size1 = obj1->obj_UnderlyingDatatypePtr->size;
    size2 = obj2->obj_UnderlyingDatatypePtr->size;

    switch (op) @{
    case Py_LT: c = size1 <  size2; break;
    case Py_LE: c = size1 <= size2; break;
    case Py_EQ: c = size1 == size2; break;
    case Py_NE: c = size1 != size2; break;
    case Py_GT: c = size1 >  size2; break;
    case Py_GE: c = size1 >= size2; break;
    @}
    result = c ? Py_True : Py_False;
    return Py_NewRef(result);
 @}
@end example

@node 추상 프로토콜 지원,약한 참조 지원,객체 비교,확장형 정의하기 여러 가지 주제
@anchor{extending/newtypes abstract-protocol-support}@anchor{4f31}
@subsubsection 추상 프로토콜 지원


파이썬은 다양한 `추상' ‘프로토콜’을 지원합니다; 이러한 인터페이스를 사용하기 위해 제공되는 구체적인 인터페이스는 @ref{4f32,,추상 객체 계층}에 설명되어 있습니다.

이러한 추상 인터페이스 중 다수는 파이썬 구현 개발 초기에 정의되었습니다. 특히, 숫자, 매핑 및 시퀀스 프로토콜은 처음부터 파이썬의 일부였습니다. 다른 프로토콜은 시간이 지남에 따라 추가되었습니다. 형 구현의 여러 처리기 루틴에 의존하는 프로토콜의 경우, 이전 프로토콜은 형 객체가 참조하는 선택적 처리기 블록으로 정의되었습니다. 최신 프로토콜의 경우 메인 형 객체에 추가 슬롯이 있으며, 슬롯이 존재하고 인터프리터가 확인해야 함을 나타내는 플래그 비트가 설정됩니다. (플래그 비트는 슬롯 값이 @code{NULL}이 아님을 나타내지 않습니다. 플래그는 슬롯의 존재를 나타내도록 설정될 수 있지만, 슬롯은 여전히 채워지지 않을 수 있습니다.)

@example
PyNumberMethods   *tp_as_number;
PySequenceMethods *tp_as_sequence;
PyMappingMethods  *tp_as_mapping;
@end example

여러분의 객체가 숫자, 시퀀스 또는 매핑 객체처럼 작동하도록 하려면, C형 @ref{1623,,PyNumberMethods}, @ref{4f33,,PySequenceMethods} 또는 @ref{4f34,,PyMappingMethods}를 각각 구현하는 구조체의 주소를 배치합니다. 이 구조체를 적절한 값으로 채우는 것은 여러분의 책임입니다. 파이썬 소스 배포의 @code{Objects} 디렉터리에서 이들 각각의 사용 예를 찾을 수 있습니다.

@example
hashfunc tp_hash;
@end example

여러분이 제공하기로 선택했다면, 이 함수는 데이터형의 인스턴스에 대한 해시 숫자를 반환해야 합니다. 다음은 간단한 예입니다:

@example
static Py_hash_t
newdatatype_hash(PyObject *op)
@{
    newdatatypeobject *self = (newdatatypeobject *) op;
    Py_hash_t result;
    result = self->some_size + 32767 * self->some_number;
    if (result == -1) @{
        result = -2;
    @}
    return result;
@}
@end example

@ref{1468,,Py_hash_t}는 플랫폼에 따라 변하는 너비의 부호 있는 정수 형입니다. @ref{4f35,,tp_hash}에서 @code{-1}을 반환하면 에러를 표시해서, 위와 같이 해시 계산에 성공했을 때 반환하지 않도록 주의해야 합니다.

@example
ternaryfunc tp_call;
@end example

이 함수는 데이터형의 인스턴스가 “호출”될 때 호출됩니다, 예를 들어, @code{obj1}이 데이터형의 인스턴스이고 파이썬 스크립트에 @code{obj1('hello')}가 포함되어 있으면 @ref{77a,,tp_call} 처리기가 호출됩니다.

이 함수는 세 개의 인자를 취합니다:


@enumerate 

@item 
`self'는 호출의 대상인 데이터형의 인스턴스입니다. 호출이 @code{obj1('hello')}이면, `self'는 @code{obj1}입니다.

@item 
`args'는 호출에 대한 인자를 포함하는 튜플입니다. @ref{3c1,,PyArg_ParseTuple()}을 사용하여 인자를 추출할 수 있습니다.

@item 
`kwds'는 전달된 키워드 인자의 딕셔너리입니다. 이것이 @code{NULL}이 아니고 키워드 인자를 지원하면 @ref{622,,PyArg_ParseTupleAndKeywords()}를 사용하여 인자를 추출하십시오. 키워드 인자를 지원하지 않고 이것이 @code{NULL}이 아니면, 키워드 인자가 지원되지 않는다는 메시지와 함께 @ref{198,,TypeError}를 발생시키십시오.
@end enumerate

장난감 @code{tp_call} 구현은 다음과 같습니다:

@example
static PyObject *
newdatatype_call(PyObject *op, PyObject *args, PyObject *kwds)
@{
    newdatatypeobject *self = (newdatatypeobject *) op;
    PyObject *result;
    const char *arg1;
    const char *arg2;
    const char *arg3;

    if (!PyArg_ParseTuple(args, "sss:call", &arg1, &arg2, &arg3)) @{
        return NULL;
    @}
    result = PyUnicode_FromFormat(
        "Returning -- value: [%d] arg1: [%s] arg2: [%s] arg3: [%s]\n",
        self->obj_UnderlyingDatatypePtr->size,
        arg1, arg2, arg3);
    return result;
@}
@end example

@example
/* 이터레이터 */
getiterfunc tp_iter;
iternextfunc tp_iternext;
@end example

이 함수는 이터레이터 프로토콜 지원을 제공합니다. 두 처리기 모두 정확히 하나의 매개 변수, 호출되는 인스턴스를 취하고 새 참조를 반환합니다. 에러가 발생하면, 예외를 설정하고 @code{NULL}을 반환해야 합니다. @ref{16f4,,tp_iter}는 파이썬 @ref{e68,,__iter__()} 메서드에 해당하고, @ref{16f5,,tp_iternext}는 파이썬 @ref{14d2,,__next__()} 메서드에 해당합니다.

모든 @ref{142c,,이터러블} 객체는 @ref{4ca,,이터레이터} 객체를 반환해야 하는 @ref{16f4,,tp_iter} 처리기를 구현해야 합니다. 다음은 파이썬 클래스에도 적용되는 공통 지침입니다:


@itemize *

@item 
여러 개의 독립 이터레이터를 지원할 수 있는 컬렉션(가령 리스트와 튜플)의 경우, @ref{16f4,,tp_iter}를 호출할 때마다 새 이터레이터가 만들어지고 반환되어야 합니다.

@item 
한 번만 이터레이트 될 수 있는 (보통 파일 객체처럼 이터레이션의 부작용으로 인해) 객체는 스스로에 대한 새로운 참조를 반환하여 @ref{16f4,,tp_iter}를 구현할 수 있습니다 – 따라서 @ref{16f5,,tp_iternext} 처리기도 구현해야 합니다.
@end itemize

모든 @ref{4ca,,이터레이터} 객체는 @ref{16f4,,tp_iter}와 @ref{16f5,,tp_iternext}를 모두 구현해야 합니다. 이터레이터의 @code{tp_iter} 처리기는 이터레이터에 대한 새로운 참조를 반환해야 합니다. @code{tp_iternext} 처리기는 이터레이션의 다음 객체(있다면)에 대한 새 참조를 반환해야 합니다. 이터레이션이 끝에 도달하면, @code{tp_iternext}는 예외를 설정하지 않고 @code{NULL}을 반환하거나, @code{NULL}을 반환하는 것에 `더해' @ref{df4,,StopIteration}을 설정할 수 있습니다; 예외를 피하면 성능이 약간 향상될 수 있습니다. 실제 에러가 발생하면, @code{tp_iternext}는 항상 예외를 설정하고, @code{NULL}을 반환해야 합니다.

@node 약한 참조 지원,추가 제안,추상 프로토콜 지원,확장형 정의하기 여러 가지 주제
@anchor{extending/newtypes weak-reference-support}@anchor{4f36}@anchor{extending/newtypes weakref-support}@anchor{29f2}
@subsubsection 약한 참조 지원


파이썬의 약한 참조 구현의 목표 중 하나는 성능에 중요한 객체(가령 숫자)에 대한 부하를 발생시키지 않고 모든 형이 약한 참조 메커니즘에 참여할 수 있도록 하는 것입니다.


@subsubheading 더 보기


@ref{11a,,weakref} 모듈에 대한 설명서.


객체가 약하게 참조될 수 있으려면, 확장형이 @ref{1c6f,,tp_flags} 필드의 @code{Py_TPFLAGS_MANAGED_WEAKREF} 비트를 설정해야 합니다. 레거시 @ref{b7e,,tp_weaklistoffset} 필드는 0으로 유지되어야 합니다.

구체적으로, 정적으로 선언된 형 객체는 이런 식입니다:

@example
static PyTypeObject TrivialType = @{
    PyVarObject_HEAD_INIT(NULL, 0)
    /* ... 간결성을 위해 생략된 다른 멤버들 ... */
    .tp_flags = Py_TPFLAGS_MANAGED_WEAKREF | ...,
@};
@end example

유일한 추가 사항은 @code{tp_dealloc}이 (@ref{795,,PyObject_ClearWeakRefs()}를 호출하여) 모든 약한 참조를 지울 필요가 있다는 것입니다:

@example
static void
Trivial_dealloc(PyObject *op)
@{
    /* Clear weakrefs first before calling any destructors */
    PyObject_ClearWeakRefs(op);
    /* ... remainder of destruction code omitted for brevity ... */
    Py_TYPE(op)->tp_free(op);
@}
@end example

@node 추가 제안,,약한 참조 지원,확장형 정의하기 여러 가지 주제
@anchor{extending/newtypes more-suggestions}@anchor{4f37}
@subsubsection 추가 제안


새 데이터형에 특정 메서드를 구현하는 방법을 배우려면, @ref{904,,CPython} 소스 코드를 구하십시오. @code{Objects} 디렉터리로 이동한 다음, C 소스 파일에서 @code{tp_}에 원하는 기능을 더한 것(예를 들어, @code{tp_richcompare})을 검색하십시오. 구현하려는 함수의 예를 찾을 수 있을 겁니다.

객체가 구현 중인 형의 구상 인스턴스인지 확인해야 하면, @ref{1cb2,,PyObject_TypeCheck()} 함수를 사용하십시오. 사용 예는 다음과 같습니다:

@example
if (!PyObject_TypeCheck(some_object, &MyType)) @{
    PyErr_SetString(PyExc_TypeError, "arg #1 not a mything");
    return NULL;
@}
@end example


@subsubheading 더 보기



@table @asis

@item CPython 소스 릴리스를 다운로드하십시오.

@indicateurl{https://www.python.org/downloads/source/}

@item GitHub의 CPython 프로젝트, CPython 소스 코드가 개발되는 곳.

@indicateurl{https://github.com/python/cpython}
@end table


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node C와 C++ 확장 빌드하기,윈도우에서 C와 C++ 확장 빌드하기,확장형 정의하기 여러 가지 주제,제삼자 도구 없이 확장 만들기
@anchor{extending/building doc}@anchor{4f38}@anchor{extending/building building}@anchor{4ee6}@anchor{extending/building building-c-and-c-extensions}@anchor{4f39}@anchor{extending/building translation-repo}@anchor{4f3a}
@subsection C와 C++ 확장 빌드하기


A C extension for CPython is a shared library (for example, a @code{.so} file on
Linux, @code{.pyd} on Windows), which exports an `initialization function'.

See @ref{4f3b,,Defining extension modules} for details.
@anchor{extending/building install-index}@anchor{10f8}
@menu
* setuptools로 C와 C++ 확장 빌드하기:: 

@end menu

@node setuptools로 C와 C++ 확장 빌드하기,,,C와 C++ 확장 빌드하기
@anchor{extending/building building-c-and-c-extensions-with-setuptools}@anchor{4f3c}@anchor{extending/building setuptools-index}@anchor{10f9}
@subsubsection setuptools로 C와 C++ 확장 빌드하기


Building, packaging and distributing extension modules is best done with
third-party tools, and is out of scope of this document.
One suitable tool is Setuptools, whose documentation can be found at
@indicateurl{https://setuptools.pypa.io/en/latest/setuptools.html}.

The @ref{3d,,distutils} module, which was included in the standard library
until Python 3.12, is now maintained as part of Setuptools.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 윈도우에서 C와 C++ 확장 빌드하기,,C와 C++ 확장 빌드하기,제삼자 도구 없이 확장 만들기
@anchor{extending/windows doc}@anchor{4f3d}@anchor{extending/windows building-c-and-c-extensions-on-windows}@anchor{4f3e}@anchor{extending/windows building-on-windows}@anchor{2221}@anchor{extending/windows translation-repo}@anchor{4f3f}
@subsection 윈도우에서 C와 C++ 확장 빌드하기


이 장에서는 Microsoft Visual C++를 사용하여 파이썬 용 윈도우 확장 모듈을 만드는 방법을 간략히 설명하고, 이 확장 모듈의 작동 방식에 대한 보다 자세한 배경 정보를 제공합니다. 설명 자료는 파이썬 확장을 빌드하는 법을 배우는 윈도우 프로그래머와 유닉스와 윈도우 모두에서 성공적으로 빌드 할 수 있는 소프트웨어 제작에 관심이 있는 유닉스 프로그래머 모두에게 유용합니다.

모듈 저자는 확장 모듈을 빌드하는데 이 섹션에서 설명하는 것 대신 distutils 접근 방식을 사용하는 것이 좋습니다. 파이썬을 빌드하는 데 사용된 C 컴파일러가 여전히 필요합니다; 보통 Microsoft Visual C++입니다.

@cartouche
@quotation 참고 
이 장에서는 인코딩된 파이썬 버전 번호를 포함하는 여러 파일 이름을 언급합니다. 이 파일 이름은 @code{XY}로 나타낸 버전 번호로 표시됩니다; 실제로, @code{'X'}는 주(major) 버전 번호이고 @code{'Y'}는 여러분이 작업 중인 파이썬 배포의 부(minor) 버전 번호입니다. 예를 들어, 파이썬 2.2.1을 사용하면, @code{XY}는 실제로는 @code{22}가 됩니다.
@end quotation
@end cartouche

@menu
* 요리책 접근법:: 
* 유닉스와 윈도우의 차이점:: 
* DLL을 실제로 사용하기:: 

@end menu

@node 요리책 접근법,유닉스와 윈도우의 차이점,,윈도우에서 C와 C++ 확장 빌드하기
@anchor{extending/windows a-cookbook-approach}@anchor{4f40}@anchor{extending/windows win-cookbook}@anchor{4f41}
@subsubsection 요리책 접근법


유닉스에서처럼, 윈도우에서 확장 모듈을 빌드하는 두 가지 접근법이 있습니다: @code{setuptools} 패키지를 사용하여 빌드 프로세스를 제어하거나 수동으로 작업합니다. setuptools 접근법은 대부분 확장에서 잘 작동합니다; @code{setuptools}를 사용하여 확장 모듈을 빌드하고 패키징하는 방법에 대한 설명은 @ref{10f9,,setuptools로 C와 C++ 확장 빌드하기}에 있습니다. 수동으로 작업할 수밖에 없다면, winsound@footnote{https://github.com/python/cpython/tree/3.14/PCbuild/winsound.vcxproj} 표준 라이브러리 모듈의 프로젝트 파일을 연구하는 것이 도움이 될 겁니다.

@node 유닉스와 윈도우의 차이점,DLL을 실제로 사용하기,요리책 접근법,윈도우에서 C와 C++ 확장 빌드하기
@anchor{extending/windows differences-between-unix-and-windows}@anchor{4f42}@anchor{extending/windows dynamic-linking}@anchor{4f43}
@subsubsection 유닉스와 윈도우의 차이점


유닉스와 윈도우는 코드의 실행시간 로딩에 완전히 다른 패러다임을 사용합니다. 동적으로 로드 할 수 있는 모듈을 빌드하려고 시도하기 전에, 시스템 작동 방식을 알고 있어야 합니다.

유닉스에서, 공유 오브젝트 (@code{.so}) 파일은 프로그램에서 사용할 코드와 프로그램에서 찾을 것으로 예상되는 함수와 데이터의 이름을 포함합니다. 파일이 프로그램에 결합할 때, 파일의 코드에 있는 함수와 데이터의 모든 참조가 함수와 데이터가 메모리에 놓이게 되는 프로그램에서의 실제 위치를 가리키도록 변경됩니다. 이것은 기본적으로 링크 작업입니다.

윈도우에서, 동적 연결 라이브러리 (@code{.dll}) 파일에는 매달린(dangling) 참조가 없습니다. 대신, 함수나 데이터에 대한 액세스는 참조 테이블(lookup table)을 통해 이루어집니다. 따라서 DLL 코드는 프로그램의 메모리를 참조하도록 실행 시간에 수정될 필요가 없습니다; 대신, 코드는 이미 DLL의 참조 테이블을 사용하고 있고, 실행 시간에 참조 테이블이 함수와 데이터를 가리 키도록 수정됩니다.

유닉스에는, 한가지 유형의 라이브러리 파일(@code{.a}) 만 있는데, 여러 오브젝트 파일(@code{.o})의 코드가 포함됩니다. 공유 오브젝트 파일(@code{.so})을 만들기 위한 링크 단계에서, 링커는 식별자가 정의된 위치를 알 수 없음을 발견할 수 있습니다. 링커는 라이브러리의 오브젝트 파일에서 그것들을 찾습니다. 발견하면, 그 오브젝트 파일의 모든 코드를 포함합니다.

윈도우에는, 두 가지 유형의 라이브러리, 정적 라이브러리와 임포트 라이브러리가 있습니다 (둘 다 @code{.lib}라고 합니다). 정적 라이브러리는 유닉스 @code{.a} 파일과 같습니다; 필요할 때 포함될 코드가 들어 있습니다. 임포트 라이브러리는 기본적으로 특정 식별자가 합법적이고 DLL이 로드될 때 프로그램에 존재하게 된다고 링커를 안심시키기 위해서만 사용됩니다. 따라서 링커는 임포트 라이브러리의 정보를 사용하여 DLL에 포함되지 않은 식별자를 사용하는 참조 테이블을 작성합니다. 응용 프로그램이나 DLL이 링크될 때, 임포트 라이브러리가 만들어질 수 있습니다. 이것은 응용 프로그램이나 DLL의 심볼을 사용하는, 이후의 모든 DLL에 사용해야 합니다.

다른 코드 블록 A를 공유해야 하는, 두 개의 동적 로드 모듈 B와 C를 빌드한다고 가정합니다. 유닉스에서는, @code{B.so}와 @code{C.so}에 대해 링커로 @code{A.a}를 전달하지 `않습니다'; 전달하면 B와 C가 각각 자신의 복사본을 갖게 되어 두 번 포함하게 됩니다. 윈도우에서는, @code{A.dll}를 빌드하면 @code{A.lib}도 빌드됩니다. 여러분은 B와 C에 대헤 링커로 @code{A.lib}를 전달 `합니다'. @code{A.lib}는 코드를 포함하지 않습니다; 실행 시간에 A의 코드에 액세스하는 데 사용될 정보만 포함합니다.

윈도우에서, 임포트 라이브러리를 사용하는 것은 @code{import spam}을 사용하는 것과 비슷합니다; 이것은 스팸의 이름에 액세스할 수 있도록 하지만, 별도의 복사본을 만들지는 않습니다. 유닉스에서, 라이브러리와 링크하는 것은 @code{from spam import *}와 더 비슷합니다; 별도의 복사본을 만듭니다.

@geindex Py_NO_LINK_LIB (C macro)
@anchor{extending/windows c Py_NO_LINK_LIB}@anchor{444}
@deffn {C 매크로} Py_NO_LINK_LIB

Turn off the implicit, @code{#pragma}-based linkage with the Python
library, performed inside CPython header files.


Added in version 3.14.

@end deffn

@node DLL을 실제로 사용하기,,유닉스와 윈도우의 차이점,윈도우에서 C와 C++ 확장 빌드하기
@anchor{extending/windows using-dlls-in-practice}@anchor{4f44}@anchor{extending/windows win-dlls}@anchor{4f45}
@subsubsection DLL을 실제로 사용하기


윈도우 파이썬은 Microsoft Visual C++로 빌드되었습니다; 다른 컴파일러를 사용하는 것은 동작할 수도 있고 그렇지 않을 수도 있습니다. 이 섹션의 나머지 부분은 MSVC++에만 해당합니다.

When creating DLLs in Windows, you can use the CPython library in two ways:


@enumerate 

@item 
By default, inclusion of @code{PC/pyconfig.h} directly or via
@code{Python.h} triggers an implicit, configure-aware link with the
library.  The header file chooses @code{pythonXY_d.lib} for Debug,
@code{pythonXY.lib} for Release, and @code{pythonX.lib} for Release with
the @ref{4f46,,Limited API} enabled.

To build two DLLs, spam and ni (which uses C functions found in spam), you
could use these commands:

@example
cl /LD /I/python/include spam.c
cl /LD /I/python/include ni.c spam.lib
@end example

The first command created three files: @code{spam.obj}, @code{spam.dll}
and @code{spam.lib}.  @code{Spam.dll} does not contain any Python
functions (such as @ref{3c1,,PyArg_ParseTuple()}), but it does know how to find
the Python code thanks to the implicitly linked @code{pythonXY.lib}.

두 번째 명령은 @code{ni.dll}(그리고 @code{.obj}와 @code{.lib})을 만들었습니다. spam과 파이썬 실행 파일에서 필요한 함수를 찾는 방법을 알고 있습니다.

@item 
Manually by defining @ref{444,,Py_NO_LINK_LIB} macro before including
@code{Python.h}. You must pass @code{pythonXY.lib} to the linker.

To build two DLLs, spam and ni (which uses C functions found in spam), you
could use these commands:

@example
cl /LD /DPy_NO_LINK_LIB /I/python/include spam.c ../libs/pythonXY.lib
cl /LD /DPy_NO_LINK_LIB /I/python/include ni.c spam.lib ../libs/pythonXY.lib
@end example

첫 번째 명령은 세 개의 파일을 만들었습니다: @code{spam.obj}, @code{spam.dll} 및 @code{spam.lib}. @code{Spam.dll}은 파이썬 함수(가령 @ref{3c1,,PyArg_ParseTuple()})를 포함하지 않지만, @code{pythonXY.lib} 덕분에 파이썬 코드를 찾는 방법을 알고 있습니다.

두 번째 명령은 @code{ni.dll}(그리고 @code{.obj}와 @code{.lib})을 만들었습니다. spam과 파이썬 실행 파일에서 필요한 함수를 찾는 방법을 알고 있습니다.
@end enumerate

모든 식별자를 참조 테이블로 내보내지는 않습니다. 다른 모듈(파이썬 포함)이 식별자를 볼 수 있게 하려면, @code{void _declspec(dllexport) initspam(void)}나 @code{PyObject _declspec(dllexport) *NiGetSpamData(void)}처럼 @code{_declspec(dllexport)}라고 선언해야 합니다.

Developer Studio는 실제로 필요하지 않은 많은 임포트 라이브러리를 던져넣어서 실행 파일에 약 100K를 추가합니다. 이것들을 제거하려면, 프로젝트 설정 대화 상자를 통해 `ignore default libraries'를 지정하십시오. 올바른 @code{msvcrt`xx'.lib}를 라이브러리 목록에 추가하십시오.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 더 큰 응용 프로그램에 CPython 런타임을 내장하기,,제삼자 도구 없이 확장 만들기,파이썬 인터프리터 확장 및 내장
@anchor{extending/index embedding-the-cpython-runtime-in-a-larger-application}@anchor{4f47}
@section 더 큰 응용 프로그램에 CPython 런타임을 내장하기


때로는, 파이썬 인터프리터를 메인 응용 프로그램으로 사용하고 그 안에서 실행되는 확장을 만드는 대신, CPython 런타임을 더 큰 응용 프로그램에 내장하는 것이 바람직합니다. 이 절에서는 이를 성공적으로 수행하는 데 관련된 몇 가지 세부 사항에 관해 설명합니다.

@menu
* 다른 응용 프로그램에 파이썬 내장하기:: 

@end menu

@node 다른 응용 프로그램에 파이썬 내장하기,,,더 큰 응용 프로그램에 CPython 런타임을 내장하기
@anchor{extending/embedding doc}@anchor{4f48}@anchor{extending/embedding embedding}@anchor{2258}@anchor{extending/embedding embedding-python-in-another-application}@anchor{4f49}
@subsection 다른 응용 프로그램에 파이썬 내장하기


이전 장에서는 파이썬을 확장하는 방법, 즉 C 함수의 라이브러리를 파이썬에 연결하여 파이썬의 기능을 확장하는 방법에 관해 설명했습니다. 다른 방법도 가능합니다: 파이썬을 내장시켜 C/C++ 응용 프로그램을 풍부하게 만들 수 있습니다. 내장은 C 나 C++가 아닌 파이썬으로 응용 프로그램의 일부 기능을 구현하는 능력을 응용 프로그램에 제공합니다. 이것은 여러 목적으로 사용될 수 있습니다; 한 가지 예는 사용자가 파이썬으로 스크립트를 작성하여 응용 프로그램을 필요에 맞게 조정할 수 있게 하는 것입니다. 일부 기능을 파이썬으로 작성하기가 더 쉽다면 직접 사용할 수도 있습니다.

파이썬을 내장하는 것은 파이썬을 확장하는 것과 유사합니다만, 아주 같지는 않습니다. 차이점은, 파이썬을 확장할 때 응용 프로그램의 주 프로그램은 여전히 파이썬 인터프리터입니다. 반면에 파이썬을 내장하면 주 프로그램은 파이썬과 아무 관련이 없습니다 — 대신 응용 프로그램 일부에서 간혹 파이썬 코드를 실행하기 위해 파이썬 인터프리터를 호출합니다.

그래서 파이썬을 내장한다면, 여러분은 자신의 메인 프로그램을 제공하게 됩니다. 이 메인 프로그램이해야 할 일 중 하나는 파이썬 인터프리터를 초기화하는 것입니다. 최소한, @ref{460,,Py_Initialize()} 함수를 호출해야 합니다. 파이썬에 명령 줄 인자를 전달하는 선택적 호출이 있습니다. 그런 다음 나중에 응용 프로그램의 어느 부분에서나 인터프리터를 호출할 수 있습니다.

인터프리터를 호출하는 방법에는 여러 가지가 있습니다: 파이썬 문장을 포함하는 문자열을 @ref{4f4a,,PyRun_SimpleString()}에 전달하거나, stdio 파일 포인터와 파일명(에러 메시지에서의 식별만을 위해)을 @ref{4f4b,,PyRun_SimpleFile()}에 전달할 수 있습니다. 또한, 이전 장에서 설명한 저수준의 연산을 호출하여 파이썬 객체를 만들고 사용할 수 있습니다.


@subsubheading 더 보기



@table @asis

@item @ref{1fba,,Python/C API reference manual}

파이썬의 C 인터페이스에 대한 자세한 내용은 이 매뉴얼에 있습니다. 필요한 정보가 많이 있습니다.
@end table


@menu
* 매우 고수준의 내장:: 
* 매우 고수준 내장을 넘어서; 개요: 매우 고수준 내장을 넘어서 개요. 
* 순수한 내장:: 
* 내장된 파이썬을 확장하기:: 
* C++로 파이썬 내장하기:: 
* 유닉스 계열 시스템에서 컴파일과 링크하기:: 

@end menu

@node 매우 고수준의 내장,매우 고수준 내장을 넘어서 개요,,다른 응용 프로그램에 파이썬 내장하기
@anchor{extending/embedding high-level-embedding}@anchor{4f4c}@anchor{extending/embedding very-high-level-embedding}@anchor{4f4d}
@subsubsection 매우 고수준의 내장


파이썬을 내장하는 가장 간단한 형태는 매우 고수준의 인터페이스를 사용하는 것입니다. 이 인터페이스는 응용 프로그램과 직접 상호 작용할 필요 없이 파이썬 스크립트를 실행하기 위한 것입니다. 이것은 예를 들어 파일에 대해 어떤 연산을 수행하는 데 사용될 수 있습니다.

@example
#define PY_SSIZE_T_CLEAN
#include <Python.h>

int
main(int argc, char *argv[])
@{
    PyStatus status;
    PyConfig config;
    PyConfig_InitPythonConfig(&config);

    /* 선택적이지만 권장됩니다 */
    status = PyConfig_SetBytesString(&config, &config.program_name, argv[0]);
    if (PyStatus_Exception(status)) @{
        goto exception;
    @}

    status = Py_InitializeFromConfig(&config);
    if (PyStatus_Exception(status)) @{
        goto exception;
    @}
    PyConfig_Clear(&config);

    PyRun_SimpleString("from time import time,ctime\n"
                       "print('Today is', ctime(time()))\n");
    if (Py_FinalizeEx() < 0) @{
        exit(120);
    @}
    return 0;

  exception:
     PyConfig_Clear(&config);
     Py_ExitStatusException(status);
@}
@end example

@cartouche
@quotation 참고 
@code{#define PY_SSIZE_T_CLEAN} was used to indicate that @code{Py_ssize_t} should be
used in some APIs instead of @code{int}.
It is not necessary since Python 3.13, but we keep it here for backward compatibility.
See @ref{62a,,문자열과 버퍼} for a description of this macro.
@end quotation
@end cartouche

@ref{3f2,,PyConfig.program_name} 설정은 파이썬 런타임 라이브러리에 대한 경로를 인터프리터에게 알리기 위해 @ref{3f6,,Py_InitializeFromConfig()}보다 먼저 호출되어야 합니다. 다음으로, 파이썬 인터프리터는 @ref{460,,Py_Initialize()}로 초기화되고, 날짜와 시간을 인쇄하는 하드 코딩된 파이썬 스크립트가 실행됩니다. 그런 다음, @ref{f10,,Py_FinalizeEx()} 호출이 인터프리터를 종료하고 프로그램이 끝납니다. 실제 프로그램에서는 파이썬 스크립트를 다른 소스(아마도 텍스트 편집기 루틴, 파일 또는 데이터베이스)에서 가져올 수 있습니다. 파일에서 파이썬 코드를 얻는 것은 @ref{4f4b,,PyRun_SimpleFile()} 함수를 사용하면 더 잘할 수 있는데, 메모리 공간을 할당하고 파일 내용을 로드하는 번거로움을 덜어줍니다.

@node 매우 고수준 내장을 넘어서 개요,순수한 내장,매우 고수준의 내장,다른 응용 프로그램에 파이썬 내장하기
@anchor{extending/embedding beyond-very-high-level-embedding-an-overview}@anchor{4f4e}@anchor{extending/embedding lower-level-embedding}@anchor{4f4f}
@subsubsection 매우 고수준 내장을 넘어서: 개요


고수준 인터페이스는 응용 프로그램에서 임의의 파이썬 코드를 실행할 수 있는 능력을 제공하지만, 최소한 데이터 값을 교환하는 것이 꽤 번거롭습니다. 그러길 원한다면 저수준의 호출을 사용해야 합니다. 더 많은 C 코드를 작성해야 하는 대신, 거의 모든 것을 달성할 수 있습니다.

파이썬을 확장하는 것과 파이썬을 내장하는 것은 다른 의도에도 불구하고 꽤 똑같은 활동이라는 점에 유의해야 합니다. 이전 장에서 논의된 대부분 주제는 여전히 유효합니다. 이것을 보시려면, 파이썬에서 C로의 확장 코드가 실제로 하는 일을 생각해보십시오:


@enumerate 

@item 
데이터값을 파이썬에서 C로 변환하고,

@item 
변환된 값을 사용하여 C 루틴으로 함수 호출을 수행하고,

@item 
그 호출에서 얻은 데이터값을 C에서 파이썬으로 변환합니다.
@end enumerate

파이썬을 내장할 때, 인터페이스 코드는 다음을 수행합니다:


@enumerate 

@item 
데이터값을 C에서 파이썬으로 변환하고,

@item 
변환된 값을 사용하여 파이썬 인터페이스 루틴으로 함수 호출을 수행하고,

@item 
그 호출에서 얻은 데이터 값을 파이썬에서 C로 변환합니다.
@end enumerate

보시다시피, 데이터 변환 단계가 언어 간 전송의 다른 방향을 수용하기 위해 단순히 교환됩니다. 유일한 차이점은 두 데이터 변환 간에 호출하는 루틴입니다. 확장할 때는 C 루틴을 호출하고, 내장할 때는 파이썬 루틴을 호출합니다.

이 장에서는 파이썬에서 C로 데이터를 변환하는 방법과 그 반대로 데이터를 변환하는 방법에 관해서는 설명하지 않습니다. 또한, 참조의 올바른 사용과 에러를 다루는 것을 이해하고 있다고 가정합니다. 이러한 측면은 인터프리터를 확장하는 것과 다르지 않으므로, 이전 장에서 필요한 정보를 참조할 수 있습니다.

@node 순수한 내장,내장된 파이썬을 확장하기,매우 고수준 내장을 넘어서 개요,다른 응용 프로그램에 파이썬 내장하기
@anchor{extending/embedding id1}@anchor{4f50}@anchor{extending/embedding pure-embedding}@anchor{4f51}
@subsubsection 순수한 내장


첫 번째 프로그램은 파이썬 스크립트에 있는 함수를 실행하는 것을 목표로 합니다. 매우 고수준의 인터페이스에 관한 절에서와같이, 파이썬 인터프리터는 애플리케이션과 직접 상호 작용하지 않습니다 (하지만 다음 절에서 바뀔 것입니다).

파이썬 스크립트에서 정의된 함수를 실행하는 코드는 다음과 같습니다:

@example
#define PY_SSIZE_T_CLEAN
#include <Python.h>

int
main(int argc, char *argv[])
@{
    PyObject *pName, *pModule, *pFunc;
    PyObject *pArgs, *pValue;
    int i;

    if (argc < 3) @{
        fprintf(stderr,"Usage: call pythonfile funcname [args]\n");
        return 1;
    @}

    Py_Initialize();
    pName = PyUnicode_DecodeFSDefault(argv[1]);
    /* pName의 에러 검사가 생략되었습니다 */

    pModule = PyImport_Import(pName);
    Py_DECREF(pName);

    if (pModule != NULL) @{
        pFunc = PyObject_GetAttrString(pModule, argv[2]);
        /* pFunc는 새로운 참조입니다 */

        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 참조를 훔칩니다: */
                PyTuple_SetItem(pArgs, i, pValue);
            @}
            pValue = PyObject_CallObject(pFunc, pArgs);
            Py_DECREF(pArgs);
            if (pValue != NULL) @{
                printf("Result of call: %ld\n", PyLong_AsLong(pValue));
                Py_DECREF(pValue);
            @}
            else @{
                Py_DECREF(pFunc);
                Py_DECREF(pModule);
                PyErr_Print();
                fprintf(stderr,"Call failed\n");
                return 1;
            @}
        @}
        else @{
            if (PyErr_Occurred())
                PyErr_Print();
            fprintf(stderr, "Cannot find function \"%s\"\n", argv[2]);
        @}
        Py_XDECREF(pFunc);
        Py_DECREF(pModule);
    @}
    else @{
        PyErr_Print();
        fprintf(stderr, "Failed to load \"%s\"\n", argv[1]);
        return 1;
    @}
    if (Py_FinalizeEx() < 0) @{
        return 120;
    @}
    return 0;
@}
@end example

이 코드는 @code{argv[1]}를 사용하여 파이썬 스크립트를 로드하고, @code{argv[2]}에서 명명된 함수를 호출합니다. 정수 인자는 @code{argv} 배열의 남은 값들입니다. 이 프로그램을 @ref{4f52,,컴파일하고 링크하면} (완성된 실행 파일을 @code{call}이라고 부릅시다), 다음과 같은 파이썬 스크립트를 실행하는 데 사용합니다:

@example
def multiply(a,b):
    print("Will compute", a, "times", b)
    c = 0
    for i in range(0, a):
        c = c + b
    return c
@end example

그러면 결과는 다음과 같아야 합니다:

@example
$ call multiply multiply 3 2
Will compute 3 times 2
Result of call: 6
@end example

프로그램이 기능보다 상당히 큰 편이지만, 대부분 코드는 파이썬과 C 사이의 데이터 변환과 에러 보고를 위한 것입니다. 파이썬 내장과 관련된 흥미로운 부분은 다음처럼 시작합니다

@example
Py_Initialize();
pName = PyUnicode_DecodeFSDefault(argv[1]);
/* Error checking of pName left out */
pModule = PyImport_Import(pName);
@end example

인터프리터를 초기화한 후, 스크립트는 @ref{1601,,PyImport_Import()}를 사용하여 로드됩니다. 이 루틴은 인자로 파이썬 문자열을 요구하는데, @ref{1a88,,PyUnicode_DecodeFSDefault()} 데이터 변환 루틴을 사용하여 구성됩니다.

@example
pFunc = PyObject_GetAttrString(pModule, argv[2]);
/* pFunc는 새로운 참조입니다 */

if (pFunc && PyCallable_Check(pFunc)) @{
    ...
@}
Py_XDECREF(pFunc);
@end example

일단 스크립트가 로드되면, 우리가 찾고 있는 이름이 @ref{5ed,,PyObject_GetAttrString()}를 사용하여 검색됩니다. 이름이 존재하고, 반환된 객체가 콜러블이면, 그것이 함수라고 안전하게 가정할 수 있습니다. 그런 다음 프로그램은 인자의 튜플을 일반적인 방법으로 구성하여 진행합니다. 그런 다음 파이썬 함수 호출은 이렇게 이루어집니다:

@example
pValue = PyObject_CallObject(pFunc, pArgs);
@end example

함수가 반환되면, @code{pValue}는 @code{NULL}이거나 함수의 반환 값에 대한 참조를 포함합니다. 값을 검토한 후 참조를 해제해야 합니다.

@node 내장된 파이썬을 확장하기,C++로 파이썬 내장하기,순수한 내장,다른 응용 프로그램에 파이썬 내장하기
@anchor{extending/embedding extending-embedded-python}@anchor{4f53}@anchor{extending/embedding extending-with-embedding}@anchor{4f54}
@subsubsection 내장된 파이썬을 확장하기


지금까지 내장된 파이썬 인터프리터는 애플리케이션 자체의 기능에 액세스할 수 없었습니다. 파이썬 API는 내장된 인터프리터를 확장함으로써 이것을 허용합니다. 즉, 내장된 인터프리터는 응용 프로그램에서 제공하는 루틴으로 확장됩니다. 복잡하게 들리지만, 그렇게 나쁘지는 않습니다. 잠시 응용 프로그램이 파이썬 인터프리터를 시작한다는 것을 잊어버리십시오. 대신, 응용 프로그램을 서브 루틴의 집합으로 간주하고, 일반 파이썬 확장을 작성하는 것처럼 파이썬에서 해당 루틴에 액세스할 수 있도록 연결 코드를 작성하십시오. 예를 들면:

@example
static int numargs=0;

/* Return the number of arguments of the application command line */
static PyObject*
emb_numargs(PyObject *self, PyObject *args)
@{
    if(!PyArg_ParseTuple(args, ":numargs"))
        return NULL;
    return PyLong_FromLong(numargs);
@}

static PyMethodDef emb_module_methods[] = @{
    @{"numargs", emb_numargs, METH_VARARGS,
     "Return the number of arguments received by the process."@},
    @{NULL, NULL, 0, NULL@}
@};

static struct PyModuleDef emb_module = @{
    .m_base = PyModuleDef_HEAD_INIT,
    .m_name = "emb",
    .m_size = 0,
    .m_methods = emb_module_methods,
@};

static PyObject*
PyInit_emb(void)
@{
    return PyModuleDef_Init(&emb_module);
@}
@end example

위의 코드를 @code{main()} 함수 바로 위에 삽입하십시오. 또한, @ref{460,,Py_Initialize()}에 대한 호출 전에 다음 두 문장을 삽입하십시오:

@example
numargs = argc;
PyImport_AppendInittab("emb", &PyInit_emb);
@end example

이 두 줄은 @code{numargs} 변수를 초기화하고, @code{emb.numargs()} 함수를 내장된 파이썬 인터프리터가 액세스할 수 있도록 만듭니다. 이러한 확장을 통해, 파이썬 스크립트는 다음과 같은 작업을 수행할 수 있습니다

@example
import emb
print("Number of arguments", emb.numargs())
@end example

실제 응용 프로그램에서, 이 방법은 응용 프로그램의 API를 파이썬에 노출합니다.

@c TODO: threads, code examples do not really behave well if errors happen
@c (what to watch out for)

@node C++로 파이썬 내장하기,유닉스 계열 시스템에서 컴파일과 링크하기,내장된 파이썬을 확장하기,다른 응용 프로그램에 파이썬 내장하기
@anchor{extending/embedding embedding-python-in-c}@anchor{4f55}@anchor{extending/embedding embeddingincplusplus}@anchor{4f56}
@subsubsection C++로 파이썬 내장하기


파이썬을 C++ 프로그램에 내장하는 것도 가능합니다; 이것이 어떻게 수행되는지는 사용된 C++ 시스템의 세부 사항에 달려 있습니다; 일반적으로 C++로 메인 프로그램을 작성하고, C++ 컴파일러를 사용하여 프로그램을 컴파일하고 링크해야 합니다. C++을 사용하여 파이썬 자체를 다시 컴파일할 필요는 없습니다.

@node 유닉스 계열 시스템에서 컴파일과 링크하기,,C++로 파이썬 내장하기,다른 응용 프로그램에 파이썬 내장하기
@anchor{extending/embedding compiling}@anchor{4f52}@anchor{extending/embedding compiling-and-linking-under-unix-like-systems}@anchor{4f57}
@subsubsection 유닉스 계열 시스템에서 컴파일과 링크하기


파이썬 인터프리터를 응용 프로그램에 내장하기 위해 컴파일러(와 링커)에 적절한 플래그를 찾는 것이 늘 간단하지는 않습니다. 특히, 특히 파이썬이 자신에게 링크된 C 동적 확장(@code{.so} 파일)으로 구현된 라이브러리 모듈을 로드해야 하기 때문입니다.

필요한 컴파일러와 링커 플래그를 찾으려면, 설치 절차의 일부로 생성된 @code{python`X.Y'-config} 스크립트를 실행할 수 있습니다 (@code{python3-config} 스크립트도 사용 가능할 수 있습니다). 이 스크립트에는 여러 옵션이 있으며, 다음과 같은 것들은 여러분에 직접 유용할 것입니다:


@itemize *

@item 
@code{pythonX.Y-config --cflags}는 컴파일 할 때의 권장 플래그를 제공합니다:

@example
$ /opt/bin/python3.11-config --cflags
-I/opt/include/python3.11 -I/opt/include/python3.11 -Wsign-compare  -DNDEBUG -g -fwrapv -O3 -Wall
@end example

@item 
@code{pythonX.Y-config --ldflags --embed}는 링크 할 때의 권장 플래그를 제공합니다:

@example
$ /opt/bin/python3.11-config --ldflags --embed
-L/opt/lib/python3.11/config-3.11-x86_64-linux-gnu -L/opt/lib -lpython3.11 -lpthread -ldl  -lutil -lm
@end example
@end itemize

@cartouche
@quotation 참고 
여러 파이썬 설치 간의 (특히 시스템 파이썬과 여러분이 직접 컴파일한 파이썬 간의) 혼란을 피하려면, 위의 예와 같이 @code{python`X.Y'-config}의 절대 경로를 사용하는 것이 좋습니다.
@end quotation
@end cartouche

이 절차가 여러분을 위해 작동하지 않는다면 (모든 유닉스 계열 플랫폼에서 작동하는 것은 보장되지 않습니다; 하지만, @ref{4f58,,버그 보고}를 환영합니다), 동적 링크에 관한 시스템의 설명서를 읽는 것과/이나 파이썬의 @code{Makefile}과 (그 위치를 찾으려면 @ref{49b1,,sysconfig.get_makefile_filename()}를 사용하십시오) 컴파일 옵션을 검사해야 합니다. 이때, @ref{e1,,sysconfig} 모듈은 여러분이 결합하려는 구성 값을 프로그래밍 방식으로 추출하는 데 유용한 도구입니다. 예를 들어:

@example
>>> import sysconfig
>>> sysconfig.get_config_var('LIBS')
'-lpthread -ldl  -lutil'
>>> sysconfig.get_config_var('LINKFORSHARED')
'-Xlinker -export-dynamic'
@end example

@c XXX similar documentation for Windows missing

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Python/C API reference manual,파이썬 모듈 설치하기,파이썬 인터프리터 확장 및 내장,Top
@anchor{c-api/index doc}@anchor{4f59}@anchor{c-api/index c-api-index}@anchor{1fba}@anchor{c-api/index python-c-api-reference-manual}@anchor{4f5a}@anchor{c-api/index translation-repo}@anchor{4f5b}
@chapter Python/C API reference manual


이 설명서는 확장 모듈을 작성하거나 파이썬을 내장하고자 하는 C와 C++ 프로그래머가 사용하는 API에 관해 설명합니다. 이 설명서와 쌍을 이루는 @ref{1fb9,,파이썬 인터프리터 확장 및 내장} 는 확장 제작의 일반 원칙을 설명하지만, API 함수를 자세하게 설명하지는 않습니다.

@menu
* 소개: 소개<7>. 
* C API Stability:: 
* 매우 고수준 계층:: 
* 참조 횟수: 참조 횟수<3>. 
* 예외 처리:: 
* Defining extension modules:: 
* 유틸리티: 유틸리티<2>. 
* 추상 객체 계층:: 
* 구상 객체 계층:: 
* Interpreter initialization and finalization:: 
* Thread states and the global interpreter lock:: 
* Asynchronous notifications:: 
* Operating system thread APIs:: 
* Synchronization primitives:: 
* Thread-local storage support:: 
* Multiple interpreters in a Python process:: 
* Profiling and tracing:: 
* Reference tracing:: 
* 파이썬 초기화 구성:: 
* 메모리 관리:: 
* 객체 구현 지원:: 
* API와 ABI 버전 붙이기:: 
* Monitoring C API:: 
* Generating Execution Events:: 

@end menu

@node 소개<7>,C API Stability,,Python/C API reference manual
@anchor{c-api/intro doc}@anchor{4f5c}@anchor{c-api/intro api-intro}@anchor{4f5d}@anchor{c-api/intro introduction}@anchor{4f5e}
@section 소개


파이썬의 애플리케이션 프로그래머용 인터페이스는 다양한 수준에서 C/C++ 프로그래머에게 파이썬 인터프리터에 대한 접근 방법을 제공합니다. 이 API는 C++에서도 동일하게 사용 가능하지만 간결함을 위해 보통 파이썬/C API 로 불립니다. 파이썬/C API를 사용하는 데에는 근본적으로 다른 두 가지 이유가 있습니다. 첫번째 이유는 특정한 목적을 위해 `확장 모듈'을 작성하기 위해서입니다; 이 확장 모듈들은 파이썬 인터프리터를 확장하는 C 모듈들입니다. 이것이 아마도 가장 흔한 용도일 것입니다. 두번째 이유는 파이썬을 더 큰 애플리케이션의 컴포넌트로 사용하기 위함입니다. 이 기술은 일반적으로 파이썬을 애플리케이션에 `임베딩(embedding)' 하는 것을 말합니다.

확장 모듈을 작성하는 것은 비교적 잘 다듬어진 과정으로, “쿡북” 접근법이 잘 통하며 프로세스를 다소 자동화하는 툴들도 존재합니다. 사람들은 파이썬이 존재한 초기부터 다른 애플리케이션에 파이썬을 임베드 해왔으나 파이썬을 임베딩 하는 과정은 확장 모듈을 작성하는 것보다 복잡합니다.

많은 API 함수들은 파이썬을 임베딩하거나 확장하는 것에 무관하게 유용합니다. 더욱이 파이썬을 임베드하는 대부분의 애플리케이션은 커스텀 확장을 제공할 필요성이 있기 때문에 파이썬을 임베드하려고 시도하기 전에 확장을 작성하는 것에 친숙해지는 것이 좋습니다.

@menu
* Language version compatibility:: 
* 코딩 표준:: 
* 인클루드 파일:: 
* 유용한 매크로들:: 
* 객체@comma{} 형 그리고 참조 횟수: 객체 형 그리고 참조 횟수. 
* 예외: 예외<18>. 
* 파이썬 임베딩하기:: 
* 디버깅 빌드:: 
* Recommended third party tools:: 

@end menu

@node Language version compatibility,코딩 표준,,소개<7>
@anchor{c-api/intro language-version-compatibility}@anchor{4f5f}
@subsection Language version compatibility


Python’s C API is compatible with C11 and C++11 versions of C and C++.

This is a lower limit: the C API does not require features from later
C/C++ versions.
You do `not' need to enable your compiler’s “c11 mode”.

@node 코딩 표준,인클루드 파일,Language version compatibility,소개<7>
@anchor{c-api/intro coding-standards}@anchor{4f60}
@subsection 코딩 표준


CPython 에 포함하기 위해 C 코드를 작성하는 경우에는 
@geindex Python 향상 제안; PEP 7
PEP 7@footnote{https://peps.python.org/pep-0007/} 에 정의된 지침과 표준을 따라야 합니다. 이 지침은 기여하고 있는 파이썬 버전과 상관없이 적용됩니다. 최종적으로 파이썬에 기여하는 것을 기대하지 않는 이상 이 규칙을 따르는 것은 제삼자 확장 모듈에는 필수가 아닙니다.

@node 인클루드 파일,유용한 매크로들,코딩 표준,소개<7>
@anchor{c-api/intro api-includes}@anchor{986}@anchor{c-api/intro include-files}@anchor{4f61}
@subsection 인클루드 파일


파이썬/C API를 사용하기 위한 모든 함수, 타입 그리고 매크로 정의는 다음 행에 의해 인클루드됩니다.

@example
#define PY_SSIZE_T_CLEAN
#include <Python.h>
@end example

이는 다음과 같은 표준 헤더를 인클루드하는것을 의미합니다: @code{<stdio.h>}, @code{<string.h>}, @code{<errno.h>}, @code{<limits.h>}, @code{<assert.h>} 그리고 @code{<stdlib.h>} (사용 가능한 경우).

@cartouche
@quotation 참고 
파이썬은 일부 시스템의 표준 헤더에 영향을 미치는 전처리기 정의를 정의할 수 있으므로 표준 헤더를 인클루드하기 전에 @code{Python.h} 를 인클루드해야 합니다.

@code{Python.h} 를 인클루드하기 전에 항상 @code{PY_SSIZE_T_CLEAN} 를 정의하는 것을 권장합니다. 이 매크로에 대한 자세한 사항은 @ref{3d5,,인자 구문 분석과 값 구축} 을 참조하십시오.
@end quotation
@end cartouche

Python.h로 정의된 사용자에게 공개되는 모든 이름들은 (포함된 표준 헤더로 정의된 것은 제외) @code{Py} 또는 @code{_Py} 로 시작하는 이름을 가지고 있습니다. @code{_Py} 로 시작하는 이름들은 파이썬 구현에 의해 내부적으로 사용되며 확장 개발자들에 의해 사용돠어서는 안됩니다. 구조체 멤버들은 이름에 접두사가 붙지 않습니다.

@cartouche
@quotation 참고 
사용자 코드는 @code{Py} 또는 @code{_Py} 로 시작하는 이름들을 정의해서는 안됩니다. 이것은 읽는 사람을 혼란스럽게 하며이러한 접두사가 붙는 추가적인 이름을 정의할수도 있는 향후의 파이썬 버전에 대한 사용자 코드의 이식성을 위태롭게 합니다.
@end quotation
@end cartouche

헤더 파일들은 일반적으로 파이썬과 함께 설치됩니다. 유닉스에서는 헤더 파일들은 @code{`prefix'/include/pythonversion/} 와 @code{`exec_prefix'/include/pythonversion/} 안에 들어있습니다. @ref{214c,,prefix} 와 @ref{214d,,exec_prefix} 는 파이썬의 @code{configure} 스크립트에 해당하는 파라미터로 정의되며 `버전' 은 @code{'%d.%d' % sys.version_info[:2]} 입니다. 윈도우에서는 헤더 파일들은 @code{`prefix'/include} 안에 설치되어 있습니다. @code{prefix} 는 인스톨러에 의해 지정된 설치 디렉터리 입니다.

헤더를 인클루드 하기 위해선 두 디렉터리 모두 (두 디렉터리가 다를 경우) 컴파일러의 검색 패스에 추가하십시오. 부모 디렉터리를 검색 패스에 추가해서 @code{#include <pythonX.Y/Python.h>} 처럼 사용해서는 `안됩니다.' @ref{214c,,prefix} 아래의 플랫폼 독립적인 헤더들이 @ref{214d,,exec_prefix} 에서 플랫폼 종속적인 헤더를 인클루드 하기 때문에 멀티플랫폼 빌드가 고장날 것입니다.

C++ 사용자들은 파이썬/C API 가 C 만을 사용하여 정의되었어도 헤더 파일들이 @code{extern "C"} 로 진입점을 제대로 선언한다는 점에 유의해야 합니다. C++ 에서 파이썬/C API 를 사용하기 위해 특별한 조치를 취할 필요는 없습니다.

@node 유용한 매크로들,객체 형 그리고 참조 횟수,인클루드 파일,소개<7>
@anchor{c-api/intro useful-macros}@anchor{4f62}
@subsection 유용한 매크로들


Several useful macros are defined in the Python header files.  Many are
defined closer to where they are useful (for example, @ref{1678,,Py_RETURN_NONE},
@ref{16d8,,PyMODINIT_FUNC}).
Others of a more general utility are defined here.  This is not necessarily a
complete listing.

@geindex Py_CAN_START_THREADS (C macro)
@anchor{c-api/intro c Py_CAN_START_THREADS}@anchor{4f63}
@deffn {C 매크로} Py_CAN_START_THREADS

If this macro is defined, then the current system is able to start threads.

Currently, all systems supported by CPython (per 
@geindex Python 향상 제안; PEP 11
PEP 11@footnote{https://peps.python.org/pep-0011/}), with the
exception of some WebAssembly platforms, support starting threads.


Added in version 3.13.

@end deffn

@geindex Py_GETENV (C macro)
@anchor{c-api/intro c Py_GETENV}@anchor{4f64}
@deffn {C 매크로} Py_GETENV (s)

Like @code{getenv(@var{s})}, but returns @code{NULL} if @ref{b55,,-E} was passed
on the command line (see @ref{40b,,PyConfig.use_environment}).
@end deffn

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

@end menu

@node Docstring macros,General utility macros,,유용한 매크로들
@anchor{c-api/intro docstring-macros}@anchor{4f65}
@subsubsection Docstring macros


@geindex PyDoc_STRVAR (C macro)
@anchor{c-api/intro c PyDoc_STRVAR}@anchor{1d58}
@deffn {C 매크로} PyDoc_STRVAR (name, str)

Creates a variable with name `name' that can be used in docstrings.
If Python is built without docstrings (@ref{219f,,--without-doc-strings}),
the value will be an empty string.

예제:

@example
PyDoc_STRVAR(pop_doc, "Remove and return the rightmost element.");

static PyMethodDef deque_methods[] = @{
    // ...
    @{"pop", (PyCFunction)deque_pop, METH_NOARGS, pop_doc@},
    // ...
@}
@end example

Expands to @code{PyDoc_VAR(@var{name}) = PyDoc_STR(@var{str})}.
@end deffn

@geindex PyDoc_STR (C macro)
@anchor{c-api/intro c PyDoc_STR}@anchor{1b94}
@deffn {C 매크로} PyDoc_STR (str)

Expands to the given input string, or an empty string
if docstrings are disabled (@ref{219f,,--without-doc-strings}).

예제:

@example
static PyMethodDef pysqlite_row_methods[] = @{
    @{"keys", (PyCFunction)pysqlite_row_keys, METH_NOARGS,
        PyDoc_STR("Returns the keys of the row.")@},
    @{NULL, NULL@}
@};
@end example
@end deffn

@geindex PyDoc_VAR (C macro)
@anchor{c-api/intro c PyDoc_VAR}@anchor{1ded}
@deffn {C 매크로} PyDoc_VAR (name)

Declares a static character array variable with the given `name'.
Expands to @code{static const char @var{name}[]}

For example:

@example
PyDoc_VAR(python_doc) = PyDoc_STR(
   "A genus of constricting snakes in the Pythonidae family native "
   "to the tropics and subtropics of the Eastern Hemisphere.");
@end example
@end deffn

@node General utility macros,Declaration utilities,Docstring macros,유용한 매크로들
@anchor{c-api/intro general-utility-macros}@anchor{4f66}
@subsubsection General utility macros


The following macros are for common tasks not specific to Python.

@geindex Py_UNUSED (C macro)
@anchor{c-api/intro c Py_UNUSED}@anchor{1a8a}
@deffn {C 매크로} Py_UNUSED (arg)

함수의 미사용 인자에 사용하여 컴파일러 경고를 무시합니다. 예시: @code{int func(int a, int Py_UNUSED(b)) @{ return a; @}}.


Added in version 3.4.

@end deffn

@geindex Py_GCC_ATTRIBUTE (C macro)
@anchor{c-api/intro c Py_GCC_ATTRIBUTE}@anchor{4f67}
@deffn {C 매크로} Py_GCC_ATTRIBUTE (name)

Use a GCC attribute `name', hiding it from compilers that don’t support GCC
attributes (such as MSVC).

This expands to @code{__attribute__((@var{name)})} on a GCC compiler,
and expands to nothing on compilers that don’t support GCC attributes.
@end deffn

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

@end menu

@node Numeric utilities,Assertion utilities,,General utility macros
@anchor{c-api/intro numeric-utilities}@anchor{4f68}
@subsubsection Numeric utilities


@geindex Py_ABS (C macro)
@anchor{c-api/intro c Py_ABS}@anchor{4f69}
@deffn {C 매크로} Py_ABS (x)

@code{x} 의 절댓값을 반환합니다.

The argument may be evaluated more than once.
Consequently, do not pass an expression with side-effects directly
to this macro.

If the result cannot be represented (for example, if @code{x} has
@code{INT_MIN} value for int type), the behavior is
undefined.

Corresponds roughly to @code{((@var{x}) < 0 ? -(@var{x}) : (@var{x}))}


Added in version 3.3.

@end deffn

@geindex Py_MAX (C macro)
@geindex Py_MIN (C macro)
@anchor{c-api/intro c Py_MAX}@anchor{4f6a}
@deffn {C 매크로} Py_MAX (x, y)
@anchor{c-api/intro c Py_MIN}@anchor{4f6b}
@deffnx {C 매크로} Py_MIN (x, y)

Return the larger or smaller of the arguments, respectively.

Any arguments may be evaluated more than once.
Consequently, do not pass an expression with side-effects directly
to this macro.

@code{Py_MAX} corresponds roughly to
@code{(((@var{x}) > (@var{y})) ? (@var{x}) : (@var{y}))}.


Added in version 3.3.

@end deffn

@geindex Py_ARITHMETIC_RIGHT_SHIFT (C macro)
@anchor{c-api/intro c Py_ARITHMETIC_RIGHT_SHIFT}@anchor{4f6c}
@deffn {C 매크로} Py_ARITHMETIC_RIGHT_SHIFT (type, integer, positions)

Similar to @code{@var{integer} >> @var{positions}}, but forces sign extension,
as the C standard does not define whether a right-shift of a signed
integer will perform sign extension or a zero-fill.

`integer' should be any signed integer type.
`positions' is the number of positions to shift to the right.

Both `integer' and `positions' can be evaluated more than once;
consequently, avoid directly passing a function call or some other
operation with side-effects to this macro. Instead, store the result as a
variable and then pass it.

`type' is unused and only kept for backwards compatibility. Historically,
`type' was used to cast `integer'.


버전 3.1에서 변경: This macro is now valid for all signed integer types, not just those for
which @code{unsigned type} is legal. As a result, `type' is no longer
used.

@end deffn

@geindex Py_CHARMASK (C macro)
@anchor{c-api/intro c Py_CHARMASK}@anchor{4f6d}
@deffn {C 매크로} Py_CHARMASK (c)

인자는 문자 또는 [-128, 127] 나 [0, 255] 사이의 정수여야 합니다. 이 매크로는 @code{unsigned char} 로 캐스팅된 @code{c} 를 반환합니다
@end deffn

@node Assertion utilities,Type size utilities,Numeric utilities,General utility macros
@anchor{c-api/intro assertion-utilities}@anchor{4f6e}
@subsubsection Assertion utilities


@geindex Py_UNREACHABLE (C macro)
@anchor{c-api/intro c Py_UNREACHABLE}@anchor{dad}
@deffn {C 매크로} Py_UNREACHABLE ()

의도적으로 도달할 수 없는 코드 경로가 있을 경우에 이 매크로를 사용하십시오. 예를 들어, @code{switch} 문에서 가능한 모든 값이 @code{case} 절에서 다뤄지는 경우에 @code{default:} 절에서 사용할 수 있습니다. @code{assert(0)} 또는 @code{abort()} 대신 사용하십시오.

릴리즈 모드에서 이 매크로는 컴파일러가 코드를 최적화하는데 도움이 되며 도달할 수 없는 코드에 대한 경고를 방지합니다. 예를 들어, 이 매크로는 릴리즈 모드에서 GCC의 @code{__builtin_unreachable()} 로 구현됩니다.

In debug mode, and on unsupported compilers, the macro expands to a call to
@ref{b79,,Py_FatalError()}.

A use for @code{Py_UNREACHABLE()} is following a call to a function that
never returns but that is not declared @code{_Noreturn}.

코드 경로가 매우 가능성이 낮지만 예외적인 경우에 도달할 수 있는 경우, 이 매크로를 사용해서는 안됩니다. 예를 들어, 메모리가 부족하거나 시스템 콜이 예상 범위를 벗어나는 값을 반환했을 경우에는 호출자에게 에러를 보고하는 것이 좋습니다. 호출자에게 에러를 보고할 수 없는 경우 @ref{b79,,Py_FatalError()} 를 사용할 수 있습니다.


Added in version 3.7.

@end deffn

@geindex Py_SAFE_DOWNCAST (C macro)
@anchor{c-api/intro c Py_SAFE_DOWNCAST}@anchor{4f6f}
@deffn {C 매크로} Py_SAFE_DOWNCAST (value, larger, smaller)

Cast `value' to type `smaller' from type `larger', validating that no
information was lost.

On release builds of Python, this is roughly equivalent to
@code{((@var{smaller}) @var{value})}
(in C++, @code{static_cast<@var{smaller}>(@var{value})} will be used instead).

On debug builds (implying that @ref{1837,,Py_DEBUG} is defined), this asserts
that no information was lost with the cast from `larger' to `smaller'.

`value', `larger', and `smaller' may all be evaluated more than once in the
expression; consequently, do not pass an expression with side-effects
directly to this macro.
@end deffn

@geindex Py_BUILD_ASSERT (C macro)
@anchor{c-api/intro c Py_BUILD_ASSERT}@anchor{19b3}
@deffn {C 매크로} Py_BUILD_ASSERT (cond)

Asserts a compile-time condition `cond', as a statement.
The build will fail if the condition is false or cannot be evaluated at compile time.

Corresponds roughly to @code{static_assert(@var{cond})} on C23 and above.

For example:

@example
Py_BUILD_ASSERT(sizeof(PyTime_t) == sizeof(int64_t));
@end example


Added in version 3.3.

@end deffn

@geindex Py_BUILD_ASSERT_EXPR (C macro)
@anchor{c-api/intro c Py_BUILD_ASSERT_EXPR}@anchor{19b4}
@deffn {C 매크로} Py_BUILD_ASSERT_EXPR (cond)

Asserts a compile-time condition `cond', as an expression that evaluates to @code{0}.
The build will fail if the condition is false or cannot be evaluated at compile time.

For example:

@example
#define foo_to_char(foo) \
    ((char *)(foo) + Py_BUILD_ASSERT_EXPR(offsetof(struct foo, string) == 0))
@end example


Added in version 3.3.

@end deffn

@node Type size utilities,Macro definition utilities,Assertion utilities,General utility macros
@anchor{c-api/intro type-size-utilities}@anchor{4f70}
@subsubsection Type size utilities


@geindex Py_ARRAY_LENGTH (C macro)
@anchor{c-api/intro c Py_ARRAY_LENGTH}@anchor{4f71}
@deffn {C 매크로} Py_ARRAY_LENGTH (array)

Compute the length of a statically allocated C array at compile time.

The `array' argument must be a C array with a size known at compile time.
Passing an array with an unknown size, such as a heap-allocated array,
will result in a compilation error on some compilers, or otherwise produce
incorrect results.

This is roughly equivalent to:

@example
sizeof(array) / sizeof((array)[0])
@end example
@end deffn

@geindex Py_MEMBER_SIZE (C macro)
@anchor{c-api/intro c Py_MEMBER_SIZE}@anchor{4f72}
@deffn {C 매크로} Py_MEMBER_SIZE (type, member)

Return the size of a structure (`type') `member' in bytes.

Corresponds roughly to @code{sizeof(((@var{type} *)NULL)->@var{member})}.


Added in version 3.6.

@end deffn

@node Macro definition utilities,,Type size utilities,General utility macros
@anchor{c-api/intro macro-definition-utilities}@anchor{4f73}
@subsubsection Macro definition utilities


@geindex Py_FORCE_EXPANSION (C macro)
@anchor{c-api/intro c Py_FORCE_EXPANSION}@anchor{4f74}
@deffn {C 매크로} Py_FORCE_EXPANSION (X)

This is equivalent to @code{@var{X}}, which is useful for token-pasting in
macros, as macro expansions in `X' are forcefully evaluated by the
preprocessor.
@end deffn

@geindex Py_STRINGIFY (C macro)
@anchor{c-api/intro c Py_STRINGIFY}@anchor{4f75}
@deffn {C 매크로} Py_STRINGIFY (x)

Convert @code{x} to a C string.  For example, @code{Py_STRINGIFY(123)} returns
@code{"123"}.


Added in version 3.4.

@end deffn

@node Declaration utilities,Outdated macros,General utility macros,유용한 매크로들
@anchor{c-api/intro declaration-utilities}@anchor{4f76}
@subsubsection Declaration utilities


The following macros can be used in declarations.
They are most useful for defining the C API itself, and have limited use
for extension authors.
Most of them expand to compiler-specific spellings of common extensions
to the C language.

@geindex Py_ALWAYS_INLINE (C macro)
@anchor{c-api/intro c Py_ALWAYS_INLINE}@anchor{1c69}
@deffn {C 매크로} Py_ALWAYS_INLINE

Ask the compiler to always inline a static inline function. The compiler can
ignore it and decide to not inline the function.

Corresponds to @code{always_inline} attribute in GCC and @code{__forceinline}
in MSVC.

It can be used to inline performance critical static inline functions when
building Python in debug mode with function inlining disabled. For example,
MSC disables function inlining when building in debug mode.

Marking blindly a static inline function with Py_ALWAYS_INLINE can result in
worse performances (due to increased code size for example). The compiler is
usually smarter than the developer for the cost/benefit analysis.

If Python is @ref{508,,built in debug mode} (if the @ref{1837,,Py_DEBUG}
macro is defined), the @ref{1c69,,Py_ALWAYS_INLINE} macro does nothing.

It must be specified before the function return type. Usage:

@example
static inline Py_ALWAYS_INLINE int random(void) @{ return 4; @}
@end example


Added in version 3.11.

@end deffn

@geindex Py_NO_INLINE (C macro)
@anchor{c-api/intro c Py_NO_INLINE}@anchor{1805}
@deffn {C 매크로} Py_NO_INLINE

Disable inlining on a function. For example, it reduces the C stack
consumption: useful on LTO+PGO builds which heavily inline code (see
bpo-33720@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=33720}).

Corresponds to the @code{noinline} attribute/specification on GCC and MSVC.

사용법:

@example
Py_NO_INLINE static int random(void) @{ return 4; @}
@end example


Added in version 3.11.

@end deffn

@geindex Py_DEPRECATED (C macro)
@anchor{c-api/intro c Py_DEPRECATED}@anchor{c9a}
@deffn {C 매크로} Py_DEPRECATED (version)

Use this to declare APIs that were deprecated in a specific CPython version.
The macro must be placed before the symbol name.

예제:

@example
Py_DEPRECATED(3.8) PyAPI_FUNC(int) Py_OldFunction(void);
@end example


버전 3.8에서 변경: MSVC 지원을 추가했습니다.

@end deffn

@geindex Py_LOCAL (C macro)
@anchor{c-api/intro c Py_LOCAL}@anchor{164f}
@deffn {C 매크로} Py_LOCAL (type)

Declare a function returning the specified `type' using a fast-calling
qualifier for functions that are local to the current file.
Semantically, this is equivalent to @code{static @var{type}}.
@end deffn

@geindex Py_LOCAL_INLINE (C macro)
@anchor{c-api/intro c Py_LOCAL_INLINE}@anchor{1650}
@deffn {C 매크로} Py_LOCAL_INLINE (type)

Equivalent to @ref{164f,,Py_LOCAL} but additionally requests the function
be inlined.
@end deffn

@geindex Py_LOCAL_SYMBOL (C macro)
@anchor{c-api/intro c Py_LOCAL_SYMBOL}@anchor{4f77}
@deffn {C 매크로} Py_LOCAL_SYMBOL

Macro used to declare a symbol as local to the shared library (hidden).
On supported platforms, it ensures the symbol is not exported.

On compatible versions of GCC/Clang, it
expands to @code{__attribute__((visibility("hidden")))}.
@end deffn

@geindex Py_EXPORTED_SYMBOL (C macro)
@anchor{c-api/intro c Py_EXPORTED_SYMBOL}@anchor{4f78}
@deffn {C 매크로} Py_EXPORTED_SYMBOL

Macro used to declare a symbol (function or data) as exported.
On Windows, this expands to @code{__declspec(dllexport)}.
On compatible versions of GCC/Clang, it
expands to @code{__attribute__((visibility("default")))}.
This macro is for defining the C API itself; extension modules should not use it.
@end deffn

@geindex Py_IMPORTED_SYMBOL (C macro)
@anchor{c-api/intro c Py_IMPORTED_SYMBOL}@anchor{4f79}
@deffn {C 매크로} Py_IMPORTED_SYMBOL

Macro used to declare a symbol as imported.
On Windows, this expands to @code{__declspec(dllimport)}.
This macro is for defining the C API itself; extension modules should not use it.
@end deffn

@geindex PyAPI_FUNC (C macro)
@anchor{c-api/intro c PyAPI_FUNC}@anchor{4f7a}
@deffn {C 매크로} PyAPI_FUNC (type)

Macro used by CPython to declare a function as part of the C API.
Its expansion depends on the platform and build configuration.
This macro is intended for defining CPython’s C API itself;
extension modules should not use it for their own symbols.
@end deffn

@geindex PyAPI_DATA (C macro)
@anchor{c-api/intro c PyAPI_DATA}@anchor{4f7b}
@deffn {C 매크로} PyAPI_DATA (type)

Macro used by CPython to declare a public global variable as part of the C API.
Its expansion depends on the platform and build configuration.
This macro is intended for defining CPython’s C API itself;
extension modules should not use it for their own symbols.
@end deffn

@node Outdated macros,,Declaration utilities,유용한 매크로들
@anchor{c-api/intro outdated-macros}@anchor{4f7c}
@subsubsection Outdated macros


The following macros have been used to features that have been standardized
in C11.

@geindex Py_ALIGNED (C macro)
@anchor{c-api/intro c Py_ALIGNED}@anchor{4f7d}
@deffn {C 매크로} Py_ALIGNED (num)

Specify alignment to `num' bytes on compilers that support it.

Consider using the C11 standard @code{_Alignas} specifier over this macro.
@end deffn

@geindex Py_LL (C macro)
@geindex Py_ULL (C macro)
@anchor{c-api/intro c Py_LL}@anchor{4f7e}
@deffn {C 매크로} Py_LL (number)
@anchor{c-api/intro c Py_ULL}@anchor{4f7f}
@deffnx {C 매크로} Py_ULL (number)

Use `number' as a @code{long long} or @code{unsigned long long} integer literal,
respectively.

Expands to `number' followed by @code{LL} or @code{LLU}, respectively, but will
expand to some compiler-specific suffixes on some older compilers.

Consider using the C99 standard suffixes @code{LL} and @code{LLU} directly.
@end deffn

@geindex Py_MEMCPY (C macro)
@anchor{c-api/intro c Py_MEMCPY}@anchor{1991}
@deffn {C 매크로} Py_MEMCPY (dest, src, n)

This is a @ref{23d,,soft deprecated} alias to @code{memcpy()}.
Use @code{memcpy()} directly instead.


버전 3.14부터 폐지됨: The macro is @ref{23d,,soft deprecated}.

@end deffn

@geindex Py_VA_COPY (C macro)
@anchor{c-api/intro c Py_VA_COPY}@anchor{4f80}
@deffn {C 매크로} Py_VA_COPY

This is a @ref{23d,,soft deprecated} alias to the C99-standard @code{va_copy}
function.

Historically, this would use a compiler-specific method to copy a @code{va_list}.


버전 3.6에서 변경: This is now an alias to @code{va_copy}.

@end deffn

@node 객체 형 그리고 참조 횟수,예외<18>,유용한 매크로들,소개<7>
@anchor{c-api/intro api-objects}@anchor{4f81}@anchor{c-api/intro objects-types-and-reference-counts}@anchor{4f82}
@subsection 객체, 형 그리고 참조 횟수


@geindex 객체;형

대부분의 파이썬/C API 함수는 하나 이상의 인자와 @ref{5dc,,PyObject}* 형의 반환 값을 가집니다. 해당 형은 임의의 파이썬 객체를 나타내는 오파크(Opaque) 데이터 형에 대한 포인터입니다. 할당, 스코프 규칙, 인자 전달 등 대부분의 상황에서 파이썬 언어가 모든 파이썬 객체 형을 동일한 방식으로 취급하기 때문에 단일한 C 형으로 표현하는 것이 적절합니다. 대부분의 객체는 힙에 존재합니다. @ref{5dc,,PyObject} 형의 자동 변수나 정적 변수를 선언해서는 안되며 PyObject* 형의 포인터 변수만을 선언할 수 있습니다. 유일한 예외는 형 객체입니다. 형 객체들은 절대 할당이 해제돼서는 안되기 때문에 형 객체들은 보통 정적 @ref{c9b,,PyTypeObject} 객체들입니다.

모든 파이썬 객체는 (파이썬 정수조차도) `형(type)' 과 `참조 횟수(reference count)' 를 가지고 있습니다. 객체의 형은 객체의 종류를 결정합니다. (예를 들어 정수, 리스트, 또는 사용자 정의 함수 등. @ref{232c,,표준형 계층} 에 추가적인 형들에 대해 설명되어 있습니다.) 잘 알려진 형에는 객체가 해당 형인지를 확인하는 매크로가 있습니다. 예를 들어 @code{PyList_Check(a)} 는 `a' 가 가리키는 객체가 파이썬 리스트일 경우에만 참입니다.

@menu
* 참조 횟수: 참조 횟수<2>. 
* 형:: 

@end menu

@node 참조 횟수<2>,형,,객체 형 그리고 참조 횟수
@anchor{c-api/intro api-refcounts}@anchor{4f83}@anchor{c-api/intro reference-counts}@anchor{4f84}
@subsubsection 참조 횟수


오늘날의 컴퓨터는 유한한(그리고 자주 제한되는) 양의 메모리를 가지고 있기 때문에 참조 횟수는 매우 중요합니다; 참조 횟수는 객체에 대해 @ref{5df,,강한 참조}를 갖는 위치의 갯수를 셉니다. 객체를 참조하는 위치는 다른 객체일 수도 있고, C 전역 변수이거나 C 함수 안의 지역 변수일 수도 있습니다. 객체에 대한 마지막 강한 참조가 해제될 때 (즉, 객체의 참조 횟수가 0이 되면), 객체는 할당이 해제됩니다. 객체가 다른 객체에 대한 참조를 가지고 있을 경우, 그 참조들도 해제됩니다. 이들에 대한 참조가 더는 없으면, 다른 객체들이 차례로 할당이 해제될 수 있습니다. (서로를 참조하는 객체에 대해 분명한 문제점이 있으나 현재 해결책은 “그러지 마세요” 입니다.)

@geindex Py_INCREF (C 함수)
@geindex Py_DECREF (C 함수)

참조 횟수는 항상 명시적으로 조작됩니다. 일반적인 방법은 매크로 @ref{78e,,Py_INCREF()} 를 사용하여 객체에 대한 새로운 참조를 취하고(즉, 객체의 참조 횟수를 하나 증가시키고), @ref{78f,,Py_DECREF()} 를 사용하여 참조를 해제하는 (즉, 참조 횟수를 하나 감소시키는) 것입니다. @code{Py_DECREF()} 매크로는 참조 횟수가 0이 되는지를 확인하고 객체의 할당해제자(deallocator) 를 호출해야 하므로 참조 횟수를 증가시키는 매크로보다 상당히 복잡합니다. 할당 해제자는 객체의 형 구조체에 포함된 함수 포인터입니다. 형별 할당 해제자는 리스트와 같은 복합 객체 형에 대해서 객체에 포함된 객체에 포함 된 다른 객체에 대한 참조를 해제하고 필요한 추가 마무리 작업을 수행합니다. 참조 횟수가 오버플로우 될 가능성은 없습니다. 참조 횟수를 저장하기 위해서 가상 메모리 안에서 구별되는 메모리 위치 만큼 (@code{sizeof(Py_ssize_t) >= sizeof(void*)} 라고 가정할 경우) 많은 비트가 사용됩니다. 따라서 참조 횟수 증가는 간단한 연산입니다

객체에 대한 포인터를 포함하는 모든 지역 변수에 대해 객체에 대한 @ref{5df,,강한 참조}를 잡을 (즉, 참조 횟수를 증가시킬) 필요는 없습니다. 이론적으로는 객체의 참조 횟수는 변수가 객체를 가리킬 때 증가하고 변수가 스코프를 벗어날 때 감소합니다. 하지만 이 두 동작은 서로를 상쇄시키기 때문에 결과적으로 참조 횟수는 변하지 않습니다. 참조 횟수를 사용해야만 하는 이유는 우리의 변수가 객체를 참조하는 한 객체가 할당 해제되지 않도록 하기 위함입니다. 만약 객체에 대한 적어도 하나 이상의 다른 참조가 우리의 변수만큼 오래 살아있을 것을 안다면 일시적으로 새로운 strong reference를 취할 (즉, 참조 횟수를 증가시킬) 필요가 없습니다. 이런 현상이 발생하는 중요한 상황은 파이썬이 호출하는 확장 모듈의 C 함수에 인자로 넘겨지는 객체에서 발생합니다. 호출 메커니즘은 호출하는동안 모든 인자에 대한 참조를 보유하도록 보장합니다.

그러나 흔히 하기 쉬운 실수는 리스트에서 객체를 가져와 새 참조를 취하지 않고 유지하는 것입니다. 다른 연산이 리스트에서 객체를 제거해 그 참조를 해제하면 객체가 할당 해제될수도 있습니다. 진짜 위험은 무해해 보이는 연산이 이를 실행할 수도 있는 임의의 파이썬 코드를 실행할수도 있다는 것입니다. @ref{78f,,Py_DECREF()} 에서 사용자로 컨트롤을 돌아가게 하는 코드 경로가 있기 때문에 사실 거의 모든 연산이 잠재적으로 위험합니다.

안전한 접근방식은 제네릭 연산들 (@code{PyObject_}, @code{PyNumber_}, @code{PySequence_} 또는 @code{PyMapping_} 로 시작하는 이름을 가진 함수들) 을 사용하는 것입니다. 이러한 연산들은 항상 반환하는 모든 객체에 대해 새로운 @ref{5df,,강한 참조}를 만듭니다 (즉, 참조 횟수를 증가시킵니다). 이는 함수 호출자에게 연산이 반환된 객체와의 작업이 끝났을 경우 @ref{78f,,Py_DECREF()} 를 호출할 책임을 지웁니다. 이건 곧 습관화 될 것입니다.

@menu
* 참조 횟수 상세:: 

@end menu

@node 참조 횟수 상세,,,참조 횟수<2>
@anchor{c-api/intro api-refcountdetails}@anchor{4f85}@anchor{c-api/intro reference-count-details}@anchor{4f86}
@subsubsection 참조 횟수 상세


파이썬/C API 에서 함수의 참조 횟수 동작은 `참조의 소유권' 으로 가장 잘 설명됩니다. 소유권은 객체가 아닌 참조에 관련되어 있습니다. (객체는 소유되지 않습니다: 객체는 항상 공유됩니다.) “참조를 소유하는 것” 은 더 이상 참조가 필요하지 않을 때 Py_DECREF 를 호출할 책임이 있다는 것을 의미합니다. 소유권은 양도될 수도 있습니다. 즉, 참조의 소유권을 받은 코드가 소유권이 더 이상 필요하지 않을 때 @ref{78f,,Py_DECREF()} 또는 @ref{991,,Py_XDECREF()} 를 호출하거나 책임을 (대게 자신의 호출자에게) 넘김으로써 결국 참조를 해제할 책임이 생긴다는 것을 의미합니다. 함수가 참조의 소유권을 호출자에게 넘길때 호출자는 `새로운' 참조를 받는다고 합니다. 소유권이 옮겨지지 않을 때 호출자는 참조를 `빌린다' 라고 합니다. @ref{3d7,,빌린 참조}를 위해서는 아무것도 할 필요가 없습니다.

반대로 호출 함수에게 객체에 대한 참조를 넘길 때는 두가지 가능성이 있습니다: 함수는 객체에 대한 참조를 `훔칠' 수도, 그러지 않을 수도 있습니다. 참조를 훔치는 것은 함수에 참조를 전달할 때 해당 함수가 전달된 참조를 소유한다고 가정하고 더 이상 책임을 지지 않는다는 것을 의미합니다.

@geindex PyList_SetItem (C 함수)
@geindex PyTuple_SetItem (C 함수)

참조를 훔치는 함수는 거의 없습니다. 주목할만한 두가지 예외는 @ref{18bb,,PyList_SetItem()} 과 @ref{4ef7,,PyTuple_SetItem()} 입니다. 이 두가지 함수는 요소에 대한 참조를 훔칩니다(단, 요소를 넣을 튜플이나 리스트에 대한 참조는 훔치지 않습니다.). 이 함수들은 새로 만들어진 객체들로 튜플이나 리스트를 채우는 일반적인 관행 때문에 참조를 훔치도록 설계되었습니다. 예를 들어, 튜플을 만드는 코드 @code{(1, 2, "three")} 는 다음과 같을 수 있습니다. (잠시 에러 처리는 잊어버리십시오. 더 좋은 방법으로 코딩하는 방법은 아래에 나와 있습니다.):

@example
PyObject *t;

t = PyTuple_New(3);
PyTuple_SetItem(t, 0, PyLong_FromLong(1L));
PyTuple_SetItem(t, 1, PyLong_FromLong(2L));
PyTuple_SetItem(t, 2, PyUnicode_FromString("three"));
@end example

여기서 @ref{4ef7,,PyTuple_SetItem()} 는 @ref{1bce,,PyLong_FromLong()} 가 반환한 참조를 곧바로 훔칩니다. 객체에 대한 참조가 훔쳐져도 계속 객체를 사용하려면 참조를 훔치는 함수를 호출하기 전에 @ref{78e,,Py_INCREF()} 를 다른 참조를 가져오는데 사용하십시오.

덧붙이자면, @ref{4ef7,,PyTuple_SetItem()} 은 튜플에 요소를 넣는 `유일한' 방법입니다. 튜플은 불변 자료형이기 때문에 @ref{1e31,,PySequence_SetItem()} 과 @ref{4f87,,PyObject_SetItem()} 는 튜플에 요소를 넣는 것을 거부합니다. @code{PyTuple_SetItem()} 은 직접 만들고 있는 튜플에만 사용되어야 합니다.

리스트를 채우는 동일한 의미의 코드는 @ref{4f88,,PyList_New()} 와 @ref{18bb,,PyList_SetItem()} 을 사용해 만들 수 있습니다.

하지만 실제로는 이렇게 튜플 또는 리스트를 만들고 채우는 경우는 드뭅니다. 일반적인 객체들을 `형식 문자열(format string)'로 지시되는 C 값으로부터 만들어낼 수 있는 제네릭 함수 @ref{3c2,,Py_BuildValue()} 가 있습니다. 예룰 들어, 위의 두 블록의 코드를 다음 코드로 대체할 수 있습니다. (에러 검사도 처리합니다.):

@example
PyObject *tuple, *list;

tuple = Py_BuildValue("(iis)", 1, 2, "three");
list = Py_BuildValue("[iis]", 1, 2, "three");
@end example

@ref{4f87,,PyObject_SetItem()} 과 그 친구들은 함수에 전달되는 인자처럼 참조만 빌리고 있는 요소와 함께 사용하는 것이 일반적입니다. 이 경우 새로운 참조를 취하지 않고 참조를 제공할 수 있으므로 참조에 대한 함수들의 동작이 훨씬 멀쩡합니다:

@example
int
set_all(PyObject *target, PyObject *item)
@{
    Py_ssize_t i, n;

    n = PyObject_Length(target);
    if (n < 0)
        return -1;
    for (i = 0; i < n; i++) @{
        PyObject *index = PyLong_FromSsize_t(i);
        if (!index)
            return -1;
        if (PyObject_SetItem(target, index, item) < 0) @{
            Py_DECREF(index);
            return -1;
        @}
        Py_DECREF(index);
    @}
    return 0;
@}
@end example

@geindex set_all()

함수 반환 값에 대해서는 상황이 약간 다릅니다. 대부분의 함수에 참조를 전달해도 해당 참조에 대한 소유권 책임이 바뀌진 않지만 객체에 대한 참조를 제공하는 많은 함수는 참조의 소유권을 제공합니다. 이유는 간단합니다. 대부분의 경우에서 반환된 객체는 즉석에서 생성되고 반환된 참조는 객체에 대한 유일한 참조입니다. 따라서 @ref{5e6,,PyObject_GetItem()} 과 @ref{1e30,,PySequence_GetItem()} 처럼 객체에 대한 참조를 반환하는 제네릭 함수들은 언제나 새로운 참조를 반환합니다 (호출자가 객체의 소유자가 됩니다).

함수의 의해 반환된 함수를 소유하고 있는지는 어떤 함수를 호출하느냐에 따라 달라진다는 것을 아는 것이 중요합니다. — `깃털' (함수에 인자로 전달된 객체의 형) `은 해당되지 않습니다!' 따라서 @ref{5fc,,PyList_GetItem()} 를 사용하여 리스트에서 항목을 가져오면 참조를 소유하지 않습니다. — 하지만 동일한 인자를 받는 @ref{1e30,,PySequence_GetItem()} 를 사용하여 리스트에서 항목을 가져온다면 반환된 객체에 대한 참조를 소유하게 됩니다.

@geindex PyList_GetItem (C 함수)
@geindex PySequence_GetItem (C 함수)

다음은 정수 리스트에 있는 항목의 합계를 구하는 함수를 작성하는 방법의 예시입니다. 한 번은 @ref{5fc,,PyList_GetItem()} 를 사용하고, 한 번은 @ref{1e30,,PySequence_GetItem()} 을 사용합니다.

@example
long
sum_list(PyObject *list)
@{
    Py_ssize_t i, n;
    long total = 0, value;
    PyObject *item;

    n = PyList_Size(list);
    if (n < 0)
        return -1; /* Not a list */
    for (i = 0; i < n; i++) @{
        item = PyList_GetItem(list, i); /* Can't fail */
        if (!PyLong_Check(item)) continue; /* Skip non-integers */
        value = PyLong_AsLong(item);
        if (value == -1 && PyErr_Occurred())
            /* Integer too big to fit in a C long, bail out */
            return -1;
        total += value;
    @}
    return total;
@}
@end example

@geindex sum_list()

@example
long
sum_sequence(PyObject *sequence)
@{
    Py_ssize_t i, n;
    long total = 0, value;
    PyObject *item;
    n = PySequence_Length(sequence);
    if (n < 0)
        return -1; /* Has no length */
    for (i = 0; i < n; i++) @{
        item = PySequence_GetItem(sequence, i);
        if (item == NULL)
            return -1; /* Not a sequence, or other failure */
        if (PyLong_Check(item)) @{
            value = PyLong_AsLong(item);
            Py_DECREF(item);
            if (value == -1 && PyErr_Occurred())
                /* Integer too big to fit in a C long, bail out */
                return -1;
            total += value;
        @}
        else @{
            Py_DECREF(item); /* Discard reference ownership */
        @}
    @}
    return total;
@}
@end example

@geindex sum_sequence()

@node 형,,참조 횟수<2>,객체 형 그리고 참조 횟수
@anchor{c-api/intro api-types}@anchor{4f89}@anchor{c-api/intro types}@anchor{4f8a}
@subsubsection 형


파이썬/C API에서 중요한 역할을 하는 다른 데이터 형은 거의 없습니다. 대부분은 int,  long, double 그리고 char* 같은 평범한 C 형입니다. 모듈에서 내보내는 함수나 새 객체 형의 데이터 속성들을 나열하는데 사용되는 정적 테이블을 표현하는데 사용되는 구조체 형이 몇가지 있으며, 복소수를 표현하기 위해 사용되는 구조체 형도 있습니다. 이러한 형들은 해당 형들을 사용하는 함수와 함께 다뤄질 것입니다.

@geindex Py_ssize_t (C type)
@anchor{c-api/intro c Py_ssize_t}@anchor{c54}
@deffn {C 자료형} type Py_ssize_t
` Part of the @ref{774,,안정 ABI}.'
A signed integral type such that @code{sizeof(Py_ssize_t) == sizeof(size_t)}.
C99 doesn’t define such a thing directly (size_t is an unsigned integral type).
See 
@geindex Python 향상 제안; PEP 353
PEP 353@footnote{https://peps.python.org/pep-0353/} for details. @code{PY_SSIZE_T_MAX} is the largest positive value
of type @ref{c54,,Py_ssize_t}.
@end deffn

@node 예외<18>,파이썬 임베딩하기,객체 형 그리고 참조 횟수,소개<7>
@anchor{c-api/intro api-exceptions}@anchor{4f8b}@anchor{c-api/intro exceptions}@anchor{4f8c}
@subsection 예외


파이썬 프로그래머는 특정한 에러 처리가 필요할 경우에만 에러를 처리하면 됩니다. 처리되지 않은 예외는 사용자에게 전달되는 최상위 인터프리터까지 스택 트레이스백과 함께 자동으로 호출자, 호출자의 호출자 등으로 전파됩니다.

@geindex PyErr_Occurred (C 함수)

그러나 C 프로그래머들에게 에러 검사는 항상 명시적이어야만 합니다. 파이썬/C API의 모든 함수는 해당 함수의 문서에서 명시하지 않는 한 예외를 발생시킬 수 있습니다. 일반적으로 함수에 에러가 발생하면 함수는 예외를 설정하고 소유하고 있는 모든 객체에 대한 참조를 취소하고 에러 표시기를 반환합니다. 달리 문서화되지 않은 경우 표시기는 함수의 반환 형에 따라 @code{NULL} 또는 @code{-1} 입니다. 일부 함수는 에러를 의미하는 거짓과 함께 참/거짓의 불리언 결과를 반환합니다. 아주 일부의 함수는 명시적인 에러 표시기가 없거나 모호한 반환값을 가지며 @ref{1cac,,PyErr_Occurred()} 를 사용하여 명시적인 점검을 요구합니다. 이런 예외는 항상 명시적으로 문서화됩니다.

@geindex PyErr_SetString (C 함수)
@geindex PyErr_Clear (C 함수)

예외 상태는 스레드 별 공간에서 관리됩니다. (스레드를 사용하지 않는 프로그램에서는 전역 공간을 사용한다는 말과 같습니다.) 스레드는 예외가 발생했거나, 발생하지 않았거나의 두가지 상태 중 하나일 수 있습니다. 함수 @ref{1cac,,PyErr_Occurred()} 는 이 상태를 확인하기 위해 사용할 수 있습니다. 해당 함수는 예외가 발생했을 경우 예외 형 객체에 대한 빌린 참조를 반환합니다. 예외가 발생하지 않았을 경우엔 @code{NULL} 을 반환합니다. 예외 상태를 설정하기 위한 여러가지 함수들이 있습니다: @ref{79b,,PyErr_SetString()} 는 예외 상태를 설정하기 위해 가장 보편적인 (가장 일반적인 것은 아니지만) 함수입니다. @ref{1230,,PyErr_Clear()} 는 예외 상태를 지웁니다.

전체 예외 상태는 예외 형, 해당 예외 값, 트레이스백이라는 세가지 객체로 구성됩니다. (셋 모두 @code{NULL} 일 수 있습니다.) 이 세가지 객체는 파이썬의 @code{sys.exc_info()} 의 결과와 같은 의미를 가지고 있지만 동일하지는 않습니다. 파이썬 객체는 @ref{8f7,,try} … @ref{1ab,,except} 문으로 처리되는 마지막 예외를 표현하는 반면 C 수준 예외는 @code{sys.exc_info()} 와 그 친구들로 예외를 전송하는 파이썬 바이트코드 인터프리터의 메인 루프에 도달할 때까지 C 함수들 간에 전달되는 동안에만 존재합니다.

@geindex exc_info (모듈 sys 에서)

파이썬 1.5부터 선호되어 온 파이썬 코드에서의 스레드 안전한 예외 상태 접근 방법은 파이썬 코드를 위해 스레드 별 예외 상태를 반환하는 @ref{899,,sys.exc_info()} 함수를 호출하는 것입니다. 또한 예외 상태에 접근하는 양쪽 방법의 의미도 바뀌어 에러를 포착하는 함수가 호출자의 예외 상태를 보존하기 위해 스레드의 예외를 저장하고 복원합니다. 이는 평범해 보이는 함수가 처리중인 예외를 덮어씌우는 것으로 인한 예외 처리 코드의 흔한 버그를 방지합니다. 또한 트레이스백의 스택 프레임에 의하여 참조되는 객체들에 대해 종종 원하지 않은 수명 증가가 일어나는 것을 방지합니다

일반적으로 어떤 작업을 수행하기 위해 다른 함수를 호출하는 함수는 호출된 함수가 예외를 일으켰는지 확인해야만 하며 만약 예외가 일어났다면 호출자에게 예외 상태를 전달해야 합니다. 소유하고 있는 모든 객체에 대한 참조를 버리고 에러 표시기를 반환해야 하지만 다른 예외를 설정해서는 `안됩니다.' — 방금 일어난 예외를 덮어씌우고 정확한 에러 원인에 대한 중요한 정보를 잃어버리게 됩니다.

@geindex sum_sequence()

예외를 감지하고 전달하는 간단한 예가 아래 @code{sum_sequence()} 예시에 나와 있습니다. 우연히 이 예시에선 에러를 감지했을 때 소유하고 있는 참조를 정리할 필요가 없습니다. 그 다음 예시 함수에서는 몇가지 에러 정리작업을 보여줍니다. 먼저 파이썬을 좋아하는 이유를 상기시키기 위해 같은 의미의 파이썬 코드를 제공합니다:

@example
def incr_item(dict, key):
    try:
        item = dict[key]
    except KeyError:
        item = 0
    dict[key] = item + 1
@end example

@geindex incr_item()

다음은 같은 의미의 웅장한 C 코드입니다:

@example
int
incr_item(PyObject *dict, PyObject *key)
@{
    /* Objects all initialized to NULL for Py_XDECREF */
    PyObject *item = NULL, *const_one = NULL, *incremented_item = NULL;
    int rv = -1; /* Return value initialized to -1 (failure) */

    item = PyObject_GetItem(dict, key);
    if (item == NULL) @{
        /* Handle KeyError only: */
        if (!PyErr_ExceptionMatches(PyExc_KeyError))
            goto error;

        /* Clear the error and use zero: */
        PyErr_Clear();
        item = PyLong_FromLong(0L);
        if (item == NULL)
            goto error;
    @}
    const_one = PyLong_FromLong(1L);
    if (const_one == NULL)
        goto error;

    incremented_item = PyNumber_Add(item, const_one);
    if (incremented_item == NULL)
        goto error;

    if (PyObject_SetItem(dict, key, incremented_item) < 0)
        goto error;
    rv = 0; /* Success */
    /* Continue with cleanup code */

 error:
    /* Cleanup code, shared by success and failure path */

    /* Use Py_XDECREF() to ignore NULL references */
    Py_XDECREF(item);
    Py_XDECREF(const_one);
    Py_XDECREF(incremented_item);

    return rv; /* -1 for error, 0 for success */
@}
@end example

@geindex incr_item()

@geindex PyErr_ExceptionMatches (C 함수)
@geindex PyErr_Clear (C 함수)
@geindex Py_XDECREF (C 함수)

이 예시는 C @code{goto} 문의 허용된 사용방법을 보여줍니다! 이 예시는 특정한 예외를 처리하기 위한 @ref{4f8d,,PyErr_ExceptionMatches()} 와 @ref{1230,,PyErr_Clear()} 의 사용 방법과 @ref{991,,Py_XDECREF()} 를 사용하여 소유하고 있는 @code{NULL} 일 수도 있는 참조를 삭제하는 방법을 표현합니다. (이름에 있는 @code{'X'} 를 주목하십시오. @ref{78f,,Py_DECREF()} 는 @code{NULL} 참조와 마주치면 충돌을 일으킵니다.) 이 예시를 수행하려면 소유하고 있는 참조를 보유하는데 사용하는 변수를 @code{NULL} 로 초기화하는 것이 중요합니다. 마찬가지로 반환 값은 @code{-1} (실패) 로 설정되고 마지만 호출이 성공한 뒤에야 성공으로 설정됩니다.

@node 파이썬 임베딩하기,디버깅 빌드,예외<18>,소개<7>
@anchor{c-api/intro api-embedding}@anchor{4f8e}@anchor{c-api/intro embedding-python}@anchor{4f8f}
@subsection 파이썬 임베딩하기


확장 작성자들과는 달리 파이썬 인터프리터를 임베딩 하는 사람들만이 걱정해야 하는 한가지 중요한 문제는 파이썬 인터프리터의 초기화, 그리고 아마도 마무리일 것입니다. 인터프리터의 대부분의 기능은 인터프리터가 초기화 된 이후에 사용할 수 있습니다.

@geindex Py_Initialize (C 함수)
@geindex 모듈;builtins
@geindex 모듈;__main__
@geindex 모듈;sys
@geindex 모듈;검색;경로
@geindex path (모듈 sys 에서)

기본적인 초기화 함수는 @ref{460,,Py_Initialize()} 입니다. 이 함수는 로드된 모듈 테이블을 초기화 하고 기본 모듈인 @ref{13,,builtins}, @ref{1,,__main__}, 그리고 @ref{df,,sys} 를 생성합니다. 또한 모듈 검색 경로 (@code{sys.path}) 를 초기화합니다

@ref{460,,Py_Initialize()} 는 “스크립트 인자 리스트” (@code{sys.argv}) 를 설정하지 않습니다. 만약 후에 실행될 파이썬 코드가 이 변수를 필요로 한다면, 설정 @ref{3f1,,PyConfig.argv}와 @ref{1cee,,PyConfig.parse_argv}는 반드시 설정되어야 합니다: @ref{644,,파이썬 초기화 구성}을 참조하세요.

대부분의 시스템에서 (특별히 유닉스와 윈도우는 세부적인 부분이 조금 다르긴 하지만) @ref{460,,Py_Initialize()} 는 파이썬 인터프리터를 기준으로 고정된 위치에 파이썬 라이브러리가 있다고 가정하여 표준 파이썬 인터프리터 실행 파일에 대한 최선의 추측을 바탕으로 바탕으로 모듈 검색 경로를 계산합니다. 특히 셸 명령어 검색 경로 (환경 변수 
@geindex PATH
@geindex 환경 변수; PATH
@code{PATH}) 에서 @code{python} 이라는 이름의 실행 파일이 발견되는 부모 디렉터리를 기준으로 @code{lib/python`X.Y'} 같은 이름을 가진 디렉터리를 찾습니다.

예를 들어 파이썬 실행 파일이 @code{/usr/local/bin/python} 에서 발견된다면 라이브러리는 @code{/usr/local/lib/python`X.Y'} 에 있는 것으로 가정합니다. (실제로 이 특정 경로는 
@geindex PATH
@geindex 환경 변수; PATH
@code{PATH} 를 따라 @code{python} 이라는 이름의 실행 파일이 발견되지 않을 때 사용되는 “fallback” 경로이기도 합니다.) 유저는 환경 변수 
@geindex PYTHONHOME
@geindex 환경 변수; PYTHONHOME
@ref{3f0,,PYTHONHOME} 를 설정하여 이 동작을 재정의하거나 
@geindex PYTHONPATH
@geindex 환경 변수; PYTHONPATH
@ref{121c,,PYTHONPATH} 를 설정하여 표준 경로 앞에 추가적인 디렉터리를 추가할 수 있습니다.

@geindex Py_GetPath (C 함수)
@geindex Py_GetPrefix (C 함수)
@geindex Py_GetExecPrefix (C 함수)
@geindex Py_GetProgramFullPath (C 함수)

파이썬을 임베딩하는 애플리케이션은 @ref{3f6,,Py_InitializeFromConfig()} 를 호출하기 `전에' @ref{3f2,,PyConfig.program_name} 을 설정하여 검색을 제어할 수 있습니다. 
@geindex PYTHONHOME
@geindex 환경 변수; PYTHONHOME
@ref{3f0,,PYTHONHOME} 는 여전히 이 값을 재정의하며 
@geindex PYTHONPATH
@geindex 환경 변수; PYTHONPATH
@ref{121c,,PYTHONPATH} 는 여전히 표준 경로 앞에 추가된다는 점에 유의하십시오.  완전한 제어가 필요한 애플리케이션은 @ref{3e3,,Py_GetPath()}, @ref{3e5,,Py_GetPrefix()}, @ref{3e9,,Py_GetExecPrefix()}, 그리고 @ref{3ec,,Py_GetProgramFullPath()} 의 자체적인 구현을 제공할 필요가 있습니다. (모두 @code{Modules/getpath.c} 에 정의되어 있습니다.)

@geindex Py_IsInitialized (C 함수)

가끔은 파이썬을 “uninitialize” 하는 것이 바람직합니다. 예를 들어 애플리케이션이 다시 시작하거나 (@ref{460,,Py_Initialize()} 다시 호출하기) 애플리케이션에서 파이썬의 사용이 끝나 파이썬이 할당한 메모리를 해제하려고 할 수 있습니다. @ref{f10,,Py_FinalizeEx()} 를 호출하여 이를 달성할 수 있습니다. 함수 @ref{4f90,,Py_IsInitialized()} 는 파이썬이 현재 초기화된 상태에 있을 경우 참을 반환합니다. 이 함수들에 대한 자세한 내용은 다른 장에서 제공됩니다. @code{Py_FinalizeEx()} 가 파이썬 인터프리터가 할당한 모든 메모리를 해제하지는 않는다는 점에 유의해야 합니다. 예를 들어, 현재 확장 모듈에서 할당한 메모리는 해제할 수 없습니다.

@node 디버깅 빌드,Recommended third party tools,파이썬 임베딩하기,소개<7>
@anchor{c-api/intro api-debugging}@anchor{4f91}@anchor{c-api/intro debugging-builds}@anchor{4f92}
@subsection 디버깅 빌드


파이썬은 인터프리터와 확장 모듈들에 대한 추가적인 검사를 가능하게 하는 여러 매크로를 사용하여 빌드될 수 있습니다. 이러한 검사는 런타임에 많은 오버헤드를 추가하는 경향이 있으므로 기본적으로 실행되지 않습니다.

다양한 유형의 디버깅 빌드의 전체 목록은 파이썬 소스 배포판 안의 @code{Misc/SpecialBuilds.txt} 파일에 있습니다. 참조 횟수 추적, 메모리 할당자 디버깅, 메인 인터프리터 루프의 저수준 프로파일링을 지원하는 빌드들을 사용할 수 있습니다. 이 섹션에서는 가장 자주 사용되는 빌드만 설명합니다.

@geindex Py_DEBUG (C macro)
@anchor{c-api/intro c Py_DEBUG}@anchor{1837}
@deffn {C 매크로} Py_DEBUG
@end deffn

@code{Py_DEBUG} 매크로가 정의된 인터프리터를 컴파일하면 일반적으로 @ref{508,,파이썬의 디버그 빌드}가 일반적으로 의미하는 빌드가 생성됩니다. @code{Py_DEBUG} 는 @code{./configure} 명령에 @ref{664,,--with-pydebug} 를 추가하여 유닉스 빌드에서 활성화됩니다. 또한 파이썬 전용이 아닌 @code{_DEBUG} 매크로의 존재를 암시합니다. 유닉스 빌드에서 @code{Py_DEBUG} 가 활성화 되어있으면 컴파일러 최적화가 비활성화됩니다.

아래에 설명된 참조 횟수 디버깅 외에도 추가적인 검사가 수행됩니다, @ref{508,,파이썬 디버그 빌드}를 찹조하세요.

@code{Py_TRACE_REFS} 를 정의하면 참조 추적이 활성화됩니다 (@ref{634,,configure --with-trace-refs option}를 참조하세요). 정의된 경우 모든 @ref{5dc,,PyObject} 에 두 개의 추가 필드를 추가함으로써 활성 객체에 대한 이중 원형 연결 리스트가 유지됩니다. 또한 모든 할당이 추적됩니다. 인터프리터 종료시에는 현재 사용되고 있는 모든 참조가 출력됩니다. (대화식 모드에서는 인터프리터가 명령문을 실행할 때마다 이후에 출력됩니다.)

자세한 내용은 파이썬 소스 배포판 안의 @code{Misc/SpecialBuilds.txt} 를 참조하십시오.

@node Recommended third party tools,,디버깅 빌드,소개<7>
@anchor{c-api/intro c-api-tools}@anchor{4ecd}@anchor{c-api/intro recommended-third-party-tools}@anchor{4f93}
@subsection Recommended third party tools


The following third party tools offer both simpler and more sophisticated
approaches to creating C, C++ and Rust extensions for Python:


@itemize *

@item 
Cython@footnote{https://cython.org/}

@item 
cffi@footnote{https://cffi.readthedocs.io}

@item 
HPy@footnote{https://hpyproject.org/}

@item 
nanobind@footnote{https://github.com/wjakob/nanobind} (C++)

@item 
Numba@footnote{https://numba.pydata.org/}

@item 
pybind11@footnote{https://pybind11.readthedocs.io/} (C++)

@item 
PyO3@footnote{https://pyo3.rs/} (Rust)

@item 
SWIG@footnote{https://www.swig.org}
@end itemize

Using tools such as these can help avoid writing code that is tightly bound to
a particular version of CPython, avoid reference counting errors, and focus
more on your own code than on using the CPython API. In general, new versions
of Python can be supported by updating the tool, and your code will often use
newer and more efficient APIs automatically. Some tools also support compiling
for other implementations of Python from a single set of sources.

These projects are not supported by the same people who maintain Python, and
issues need to be raised with the projects directly. Remember to check that the
project is still maintained and supported, as the list above may become
outdated.


@subsubheading 더 보기



@table @asis

@item Python Packaging User Guide: Binary Extensions@footnote{https://packaging.python.org/guides/packaging-binary-extensions/}

The Python Packaging User Guide not only covers several available
tools that simplify the creation of binary extensions, but also
discusses the various reasons why creating an extension module may be
desirable in the first place.
@end table


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node C API Stability,매우 고수준 계층,소개<7>,Python/C API reference manual
@anchor{c-api/stable doc}@anchor{4f94}@anchor{c-api/stable c-api-stability}@anchor{4f95}@anchor{c-api/stable stable}@anchor{774}@anchor{c-api/stable translation-repo}@anchor{4f96}
@section C API Stability


Unless documented otherwise, Python’s C API is covered by the Backwards
Compatibility Policy, 
@geindex Python 향상 제안; PEP 387
PEP 387@footnote{https://peps.python.org/pep-0387/}.
Most changes to it are source-compatible (typically by only adding new API).
Changing existing API or removing API is only done after a deprecation period
or to fix serious issues.

CPython’s Application Binary Interface (ABI) is forward- and
backwards-compatible across a minor release (if these are compiled the same
way; see @ref{4f97,,Platform Considerations} below).
So, code compiled for Python 3.10.0 will work on 3.10.8 and vice versa,
but will need to be compiled separately for 3.9.x and 3.11.x.

There are two tiers of C API with different stability expectations:


@itemize -

@item 
@ref{768,,Unstable API}, may change in minor versions without
a deprecation period. It is marked by the @code{PyUnstable} prefix in names.

@item 
@ref{635,,Limited API}, is compatible across several minor releases.
When @ref{65e,,Py_LIMITED_API} is defined, only this subset is exposed
from @code{Python.h}.
@end itemize

These are discussed in more detail below.

Names prefixed by an underscore, such as @code{_Py_InternalState},
are private API that can change without notice even in patch releases.
If you need to use this API, consider reaching out to
CPython developers@footnote{https://discuss.python.org/c/core-dev/c-api/30}
to discuss adding public API for your use case.

@menu
* Unstable C API:: 
* 안정적인 응용 프로그램 바이너리 인터페이스:: 
* Platform Considerations:: 
* Contents of Limited API:: 

@end menu

@node Unstable C API,안정적인 응용 프로그램 바이너리 인터페이스,,C API Stability
@anchor{c-api/stable id1}@anchor{4f98}@anchor{c-api/stable unstable-c-api}@anchor{768}
@subsection Unstable C API


@geindex PyUnstable

Any API named with the @code{PyUnstable} prefix exposes CPython implementation
details, and may change in every minor release (e.g. from 3.9 to 3.10) without
any deprecation warnings.
However, it will not change in a bugfix release (e.g. from 3.10.0 to 3.10.1).

It is generally intended for specialized, low-level tools like debuggers.

Projects that use this API are expected to follow
CPython development and spend extra effort adjusting to changes.

@node 안정적인 응용 프로그램 바이너리 인터페이스,Platform Considerations,Unstable C API,C API Stability
@anchor{c-api/stable id2}@anchor{4f99}@anchor{c-api/stable stable-application-binary-interface}@anchor{4f46}
@subsection 안정적인 응용 프로그램 바이너리 인터페이스


For simplicity, this document talks about `extensions', but the Limited API
and Stable ABI work the same way for all uses of the API – for example,
embedding Python.

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

@end menu

@node Limited C API,Stable ABI,,안정적인 응용 프로그램 바이너리 인터페이스
@anchor{c-api/stable id3}@anchor{4f9a}@anchor{c-api/stable limited-c-api}@anchor{635}
@subsubsection Limited C API


Python 3.2 introduced the `Limited API', a subset of Python’s C API.
Extensions that only use the Limited API can be
compiled once and be loaded on multiple versions of Python.
Contents of the Limited API are @ref{99c,,listed below}.

@geindex Py_LIMITED_API (C macro)
@anchor{c-api/stable c Py_LIMITED_API}@anchor{65e}
@deffn {C 매크로} Py_LIMITED_API

Define this macro before including @code{Python.h} to opt in to only use
the Limited API, and to select the Limited API version.

Define @code{Py_LIMITED_API} to the value of @ref{382,,PY_VERSION_HEX}
corresponding to the lowest Python version your extension supports.
The extension will be ABI-compatible with all Python 3 releases
from the specified one onward, and can use Limited API introduced up to that
version.

Rather than using the @code{PY_VERSION_HEX} macro directly, hardcode a minimum
minor version (e.g. @code{0x030A0000} for Python 3.10) for stability when
compiling with future Python versions.

You can also define @code{Py_LIMITED_API} to @code{3}. This works the same as
@code{0x03020000} (Python 3.2, the version that introduced Limited API).
@end deffn

@node Stable ABI,Limited API Scope and Performance,Limited C API,안정적인 응용 프로그램 바이너리 인터페이스
@anchor{c-api/stable id4}@anchor{4f9b}@anchor{c-api/stable stable-abi}@anchor{4f9c}
@subsubsection Stable ABI


To enable this, Python provides a `Stable ABI': a set of symbols that will
remain ABI-compatible across Python 3.x versions.

@cartouche
@quotation 참고 
The Stable ABI prevents ABI issues, like linker errors due to missing
symbols or data corruption due to changes in structure layouts or function
signatures.
However, other changes in Python can change the `behavior' of extensions.
See Python’s Backwards Compatibility Policy (
@geindex Python 향상 제안; PEP 387
PEP 387@footnote{https://peps.python.org/pep-0387/}) for details.
@end quotation
@end cartouche

The Stable ABI contains symbols exposed in the @ref{635,,Limited API}, but also other ones – for example, functions necessary to
support older versions of the Limited API.

On Windows, extensions that use the Stable ABI should be linked against
@code{python3.dll} rather than a version-specific library such as
@code{python39.dll}.

On some platforms, Python will look for and load shared library files named
with the @code{abi3} tag (e.g. @code{mymodule.abi3.so}).
It does not check if such extensions conform to a Stable ABI.
The user (or their packaging tools) need to ensure that, for example,
extensions built with the 3.10+ Limited API are not installed for lower
versions of Python.

All functions in the Stable ABI are present as functions in Python’s shared
library, not solely as macros. This makes them usable from languages that don’t
use the C preprocessor.

@node Limited API Scope and Performance,Limited API Caveats,Stable ABI,안정적인 응용 프로그램 바이너리 인터페이스
@anchor{c-api/stable limited-api-scope-and-performance}@anchor{4f9d}
@subsubsection Limited API Scope and Performance


The goal for the Limited API is to allow everything that is possible with the
full C API, but possibly with a performance penalty.

For example, while @ref{5fc,,PyList_GetItem()} is available, its “unsafe” macro
variant @ref{4f9e,,PyList_GET_ITEM()} is not.
The macro can be faster because it can rely on version-specific implementation
details of the list object.

Without @code{Py_LIMITED_API} defined, some C API functions are inlined or
replaced by macros.
Defining @code{Py_LIMITED_API} disables this inlining, allowing stability as
Python’s data structures are improved, but possibly reducing performance.

By leaving out the @code{Py_LIMITED_API} definition, it is possible to compile
a Limited API extension with a version-specific ABI. This can improve
performance for that Python version, but will limit compatibility.
Compiling with @code{Py_LIMITED_API} will then yield an extension that can be
distributed where a version-specific one is not available – for example,
for prereleases of an upcoming Python version.

@node Limited API Caveats,,Limited API Scope and Performance,안정적인 응용 프로그램 바이너리 인터페이스
@anchor{c-api/stable limited-api-caveats}@anchor{4f9f}
@subsubsection Limited API Caveats


Note that compiling with @code{Py_LIMITED_API} is `not' a complete guarantee that
code conforms to the @ref{635,,Limited API} or the @ref{4f9c,,Stable ABI}. @code{Py_LIMITED_API} only covers definitions, but an API also
includes other issues, such as expected semantics.

One issue that @code{Py_LIMITED_API} does not guard against is calling a function
with arguments that are invalid in a lower Python version.
For example, consider a function that starts accepting @code{NULL} for an
argument. In Python 3.9, @code{NULL} now selects a default behavior, but in
Python 3.8, the argument will be used directly, causing a @code{NULL} dereference
and crash. A similar argument works for fields of structs.

Another issue is that some struct fields are currently not hidden when
@code{Py_LIMITED_API} is defined, even though they’re part of the Limited API.

For these reasons, we recommend testing an extension with `all' minor Python
versions it supports, and preferably to build with the `lowest' such version.

We also recommend reviewing documentation of all used API to check
if it is explicitly part of the Limited API. Even with @code{Py_LIMITED_API}
defined, a few private declarations are exposed for technical reasons (or
even unintentionally, as bugs).

Also note that the Limited API is not necessarily stable: compiling with
@code{Py_LIMITED_API} with Python 3.8 means that the extension will
run with Python 3.12, but it will not necessarily `compile' with Python 3.12.
In particular, parts of the Limited API may be deprecated and removed,
provided that the Stable ABI stays stable.

@node Platform Considerations,Contents of Limited API,안정적인 응용 프로그램 바이너리 인터페이스,C API Stability
@anchor{c-api/stable platform-considerations}@anchor{4fa0}@anchor{c-api/stable stable-abi-platform}@anchor{4f97}
@subsection Platform Considerations


ABI stability depends not only on Python, but also on the compiler used,
lower-level libraries and compiler options. For the purposes of
the @ref{4f9c,,Stable ABI}, these details define a “platform”. They
usually depend on the OS type and processor architecture

It is the responsibility of each particular distributor of Python
to ensure that all Python versions on a particular platform are built
in a way that does not break the Stable ABI.
This is the case with Windows and macOS releases from @code{python.org} and many
third-party distributors.

@node Contents of Limited API,,Platform Considerations,C API Stability
@anchor{c-api/stable contents-of-limited-api}@anchor{4fa1}@anchor{c-api/stable limited-api-list}@anchor{99c}
@subsection Contents of Limited API


Currently, the @ref{635,,Limited API} includes the following items:



@itemize *

@item 
@ref{16da,,METH_CLASS}

@item 
@ref{167c,,METH_COEXIST}

@item 
@ref{199f,,METH_FASTCALL}

@item 
@ref{b68,,METH_METHOD}

@item 
@ref{16d9,,METH_NOARGS}

@item 
@ref{170c,,METH_O}

@item 
@ref{16db,,METH_STATIC}

@item 
@ref{170d,,METH_VARARGS}

@item 
@ref{77f,,PY_VECTORCALL_ARGUMENTS_OFFSET}

@item 
@ref{4fa2,,PyAIter_Check()}

@item 
@ref{1811,,PyArg_Parse()}

@item 
@ref{3c1,,PyArg_ParseTuple()}

@item 
@ref{622,,PyArg_ParseTupleAndKeywords()}

@item 
@ref{170b,,PyArg_UnpackTuple()}

@item 
@ref{4fa3,,PyArg_VaParse()}

@item 
@ref{623,,PyArg_VaParseTupleAndKeywords()}

@item 
@ref{4fa4,,PyArg_ValidateKeywordArguments()}

@item 
@ref{4fa5,,PyBUF_ANY_CONTIGUOUS}

@item 
@ref{4fa6,,PyBUF_CONTIG}

@item 
@ref{4fa7,,PyBUF_CONTIG_RO}

@item 
@ref{15bb,,PyBUF_C_CONTIGUOUS}

@item 
@ref{4fa8,,PyBUF_FORMAT}

@item 
@ref{4fa9,,PyBUF_FULL}

@item 
@ref{4faa,,PyBUF_FULL_RO}

@item 
@ref{15bc,,PyBUF_F_CONTIGUOUS}

@item 
@ref{4fab,,PyBUF_INDIRECT}

@item 
@ref{4fac,,PyBUF_MAX_NDIM}

@item 
@ref{4fad,,PyBUF_ND}

@item 
@ref{1a0b,,PyBUF_READ}

@item 
@ref{4fae,,PyBUF_RECORDS}

@item 
@ref{4faf,,PyBUF_RECORDS_RO}

@item 
@ref{4fb0,,PyBUF_SIMPLE}

@item 
@ref{4fb1,,PyBUF_STRIDED}

@item 
@ref{4fb2,,PyBUF_STRIDED_RO}

@item 
@ref{4fb3,,PyBUF_STRIDES}

@item 
@ref{15ba,,PyBUF_WRITABLE}

@item 
@ref{1a0c,,PyBUF_WRITE}

@item 
@ref{4fb4,,PyBaseObject_Type}

@item 
@ref{4fb5,,PyBool_FromLong()}

@item 
@ref{4fb6,,PyBool_Type}

@item 
@ref{962,,PyBuffer_FillContiguousStrides()}

@item 
@ref{963,,PyBuffer_FillInfo()}

@item 
@ref{95f,,PyBuffer_FromContiguous()}

@item 
@ref{95c,,PyBuffer_GetPointer()}

@item 
@ref{961,,PyBuffer_IsContiguous()}

@item 
@ref{639,,PyBuffer_Release()}

@item 
@ref{95d,,PyBuffer_SizeFromFormat()}

@item 
@ref{95e,,PyBuffer_ToContiguous()}

@item 
@ref{4fb7,,PyByteArrayIter_Type}

@item 
@ref{4fb8,,PyByteArray_AsString()}

@item 
@ref{4fb9,,PyByteArray_Concat()}

@item 
@ref{15ad,,PyByteArray_FromObject()}

@item 
@ref{15ae,,PyByteArray_FromStringAndSize()}

@item 
@ref{4fba,,PyByteArray_Resize()}

@item 
@ref{4fbb,,PyByteArray_Size()}

@item 
@ref{4fbc,,PyByteArray_Type}

@item 
@ref{4fbd,,PyBytesIter_Type}

@item 
@ref{a87,,PyBytes_AsString()}

@item 
@ref{4fbe,,PyBytes_AsStringAndSize()}

@item 
@ref{4fbf,,PyBytes_Concat()}

@item 
@ref{4fc0,,PyBytes_ConcatAndDel()}

@item 
@ref{4fc1,,PyBytes_DecodeEscape()}

@item 
@ref{1e08,,PyBytes_FromFormat()}

@item 
@ref{4fc2,,PyBytes_FromFormatV()}

@item 
@ref{4fc3,,PyBytes_FromObject()}

@item 
@ref{4fc4,,PyBytes_FromString()}

@item 
@ref{15a5,,PyBytes_FromStringAndSize()}

@item 
@ref{4fc5,,PyBytes_Repr()}

@item 
@ref{4fc6,,PyBytes_Size()}

@item 
@ref{4fc7,,PyBytes_Type}

@item 
@ref{167d,,PyCFunction}

@item 
@ref{4fc8,,PyCFunctionFast}

@item 
@ref{4fc9,,PyCFunctionFastWithKeywords}

@item 
@ref{4fca,,PyCFunctionWithKeywords}

@item 
@ref{4fcb,,PyCFunction_GetFlags()}

@item 
@ref{4fcc,,PyCFunction_GetFunction()}

@item 
@ref{4fcd,,PyCFunction_GetSelf()}

@item 
@ref{1cae,,PyCFunction_New()}

@item 
@ref{1d73,,PyCFunction_NewEx()}

@item 
@ref{4fce,,PyCFunction_Type}

@item 
@ref{1ca8,,PyCMethod_New()}

@item 
@ref{4fcf,,PyCallIter_New()}

@item 
@ref{4fd0,,PyCallIter_Type}

@item 
@ref{4fd1,,PyCallable_Check()}

@item 
@ref{4fd2,,PyCapsule_Destructor}

@item 
@ref{4fd3,,PyCapsule_GetContext()}

@item 
@ref{4fd4,,PyCapsule_GetDestructor()}

@item 
@ref{4fd5,,PyCapsule_GetName()}

@item 
@ref{4fd6,,PyCapsule_GetPointer()}

@item 
@ref{1c0e,,PyCapsule_Import()}

@item 
@ref{1561,,PyCapsule_IsValid()}

@item 
@ref{4f02,,PyCapsule_New()}

@item 
@ref{4fd7,,PyCapsule_SetContext()}

@item 
@ref{4fd8,,PyCapsule_SetDestructor()}

@item 
@ref{4fd9,,PyCapsule_SetName()}

@item 
@ref{4fda,,PyCapsule_SetPointer()}

@item 
@ref{4fdb,,PyCapsule_Type}

@item 
@ref{4fdc,,PyClassMethodDescr_Type}

@item 
@ref{4fdd,,PyCodec_BackslashReplaceErrors()}

@item 
@ref{3e1,,PyCodec_Decode()}

@item 
@ref{4fde,,PyCodec_Decoder()}

@item 
@ref{3e2,,PyCodec_Encode()}

@item 
@ref{4fdf,,PyCodec_Encoder()}

@item 
@ref{4fe0,,PyCodec_IgnoreErrors()}

@item 
@ref{4fe1,,PyCodec_IncrementalDecoder()}

@item 
@ref{4fe2,,PyCodec_IncrementalEncoder()}

@item 
@ref{4fe3,,PyCodec_KnownEncoding()}

@item 
@ref{4fe4,,PyCodec_LookupError()}

@item 
@ref{10ae,,PyCodec_NameReplaceErrors()}

@item 
@ref{4fe5,,PyCodec_Register()}

@item 
@ref{4fe6,,PyCodec_RegisterError()}

@item 
@ref{4fe7,,PyCodec_ReplaceErrors()}

@item 
@ref{4fe8,,PyCodec_StreamReader()}

@item 
@ref{4fe9,,PyCodec_StreamWriter()}

@item 
@ref{4fea,,PyCodec_StrictErrors()}

@item 
@ref{a97,,PyCodec_Unregister()}

@item 
@ref{4feb,,PyCodec_XMLCharRefReplaceErrors()}

@item 
@ref{4fec,,PyComplex_FromDoubles()}

@item 
@ref{1a13,,PyComplex_ImagAsDouble()}

@item 
@ref{1a12,,PyComplex_RealAsDouble()}

@item 
@ref{4fed,,PyComplex_Type}

@item 
@ref{4fee,,PyDescr_NewClassMethod()}

@item 
@ref{4fef,,PyDescr_NewGetSet()}

@item 
@ref{4ff0,,PyDescr_NewMember()}

@item 
@ref{1d72,,PyDescr_NewMethod()}

@item 
@ref{4ff1,,PyDictItems_Type}

@item 
@ref{4ff2,,PyDictIterItem_Type}

@item 
@ref{4ff3,,PyDictIterKey_Type}

@item 
@ref{4ff4,,PyDictIterValue_Type}

@item 
@ref{4ff5,,PyDictKeys_Type}

@item 
@ref{4ff6,,PyDictProxy_New()}

@item 
@ref{4ff7,,PyDictProxy_Type}

@item 
@ref{4ff8,,PyDictRevIterItem_Type}

@item 
@ref{4ff9,,PyDictRevIterKey_Type}

@item 
@ref{4ffa,,PyDictRevIterValue_Type}

@item 
@ref{4ffb,,PyDictValues_Type}

@item 
@ref{4ffc,,PyDict_Clear()}

@item 
@ref{5db,,PyDict_Contains()}

@item 
@ref{660,,PyDict_Copy()}

@item 
@ref{4ffd,,PyDict_DelItem()}

@item 
@ref{4ffe,,PyDict_DelItemString()}

@item 
@ref{626,,PyDict_GetItem()}

@item 
@ref{5e0,,PyDict_GetItemRef()}

@item 
@ref{627,,PyDict_GetItemString()}

@item 
@ref{421,,PyDict_GetItemStringRef()}

@item 
@ref{5de,,PyDict_GetItemWithError()}

@item 
@ref{4fff,,PyDict_Items()}

@item 
@ref{5000,,PyDict_Keys()}

@item 
@ref{5001,,PyDict_Merge()}

@item 
@ref{5002,,PyDict_MergeFromSeq2()}

@item 
@ref{5003,,PyDict_New()}

@item 
@ref{1990,,PyDict_Next()}

@item 
@ref{4ef8,,PyDict_SetItem()}

@item 
@ref{198e,,PyDict_SetItemString()}

@item 
@ref{5004,,PyDict_Size()}

@item 
@ref{5005,,PyDict_Type}

@item 
@ref{5006,,PyDict_Update()}

@item 
@ref{5007,,PyDict_Values()}

@item 
@ref{5008,,PyEllipsis_Type}

@item 
@ref{5009,,PyEnum_Type}

@item 
@ref{500a,,PyErr_BadArgument()}

@item 
@ref{500b,,PyErr_BadInternalCall()}

@item 
@ref{692,,PyErr_CheckSignals()}

@item 
@ref{1230,,PyErr_Clear()}

@item 
@code{PyErr_Display()}

@item 
@ref{435,,PyErr_DisplayException()}

@item 
@ref{4f8d,,PyErr_ExceptionMatches()}

@item 
@ref{428,,PyErr_Fetch()}

@item 
@ref{10af,,PyErr_Format()}

@item 
@ref{10b0,,PyErr_FormatV()}

@item 
@ref{975,,PyErr_GetExcInfo()}

@item 
@ref{972,,PyErr_GetHandledException()}

@item 
@ref{429,,PyErr_GetRaisedException()}

@item 
@ref{500c,,PyErr_GivenExceptionMatches()}

@item 
@ref{146e,,PyErr_NewException()}

@item 
@ref{146d,,PyErr_NewExceptionWithDoc()}

@item 
@ref{4ed8,,PyErr_NoMemory()}

@item 
@ref{42a,,PyErr_NormalizeException()}

@item 
@ref{1cac,,PyErr_Occurred()}

@item 
@ref{1d29,,PyErr_Print()}

@item 
@ref{500d,,PyErr_PrintEx()}

@item 
@ref{500e,,PyErr_ProgramText()}

@item 
@ref{f12,,PyErr_ResourceWarning()}

@item 
@ref{42b,,PyErr_Restore()}

@item 
@ref{500f,,PyErr_SetExcFromWindowsErr()}

@item 
@ref{1a86,,PyErr_SetExcFromWindowsErrWithFilename()}

@item 
@ref{5010,,PyErr_SetExcFromWindowsErrWithFilenameObject()}

@item 
@ref{5011,,PyErr_SetExcFromWindowsErrWithFilenameObjects()}

@item 
@ref{974,,PyErr_SetExcInfo()}

@item 
@ref{4ed7,,PyErr_SetFromErrno()}

@item 
@ref{1a85,,PyErr_SetFromErrnoWithFilename()}

@item 
@ref{5012,,PyErr_SetFromErrnoWithFilenameObject()}

@item 
@ref{5013,,PyErr_SetFromErrnoWithFilenameObjects()}

@item 
@ref{5014,,PyErr_SetFromWindowsErr()}

@item 
@ref{1a87,,PyErr_SetFromWindowsErrWithFilename()}

@item 
@ref{973,,PyErr_SetHandledException()}

@item 
@ref{f38,,PyErr_SetImportError()}

@item 
@ref{f11,,PyErr_SetImportErrorSubclass()}

@item 
@ref{5015,,PyErr_SetInterrupt()}

@item 
@ref{a9e,,PyErr_SetInterruptEx()}

@item 
@ref{5016,,PyErr_SetNone()}

@item 
@ref{79a,,PyErr_SetObject()}

@item 
@ref{42c,,PyErr_SetRaisedException()}

@item 
@ref{79b,,PyErr_SetString()}

@item 
@ref{5017,,PyErr_SyntaxLocation()}

@item 
@ref{5018,,PyErr_SyntaxLocationEx()}

@item 
@ref{1651,,PyErr_WarnEx()}

@item 
@ref{1a8d,,PyErr_WarnExplicit()}

@item 
@ref{5019,,PyErr_WarnFormat()}

@item 
@ref{5ef,,PyErr_WriteUnraisable()}

@item 
@ref{647,,PyEval_AcquireThread()}

@item 
@ref{a86,,PyEval_EvalCode()}

@item 
@ref{1ad8,,PyEval_EvalCodeEx()}

@item 
@ref{501a,,PyEval_EvalFrame()}

@item 
@ref{122d,,PyEval_EvalFrameEx()}

@item 
@ref{5f1,,PyEval_GetBuiltins()}

@item 
@ref{1b37,,PyEval_GetFrame()}

@item 
@ref{5f2,,PyEval_GetFrameBuiltins()}

@item 
@ref{5f4,,PyEval_GetFrameGlobals()}

@item 
@ref{5f6,,PyEval_GetFrameLocals()}

@item 
@ref{501b,,PyEval_GetFuncDesc()}

@item 
@ref{501c,,PyEval_GetFuncName()}

@item 
@ref{5f3,,PyEval_GetGlobals()}

@item 
@ref{5f5,,PyEval_GetLocals()}

@item 
@ref{19b9,,PyEval_InitThreads()}

@item 
@ref{501d,,PyEval_ReleaseThread()}

@item 
@ref{646,,PyEval_RestoreThread()}

@item 
@ref{645,,PyEval_SaveThread()}

@item 
@ref{501e,,PyExc_ArithmeticError}

@item 
@ref{501f,,PyExc_AssertionError}

@item 
@ref{5020,,PyExc_AttributeError}

@item 
@ref{5021,,PyExc_BaseException}

@item 
@ref{5022,,PyExc_BaseExceptionGroup}

@item 
@ref{5023,,PyExc_BlockingIOError}

@item 
@ref{5024,,PyExc_BrokenPipeError}

@item 
@ref{5025,,PyExc_BufferError}

@item 
@ref{5026,,PyExc_BytesWarning}

@item 
@ref{5027,,PyExc_ChildProcessError}

@item 
@ref{5028,,PyExc_ConnectionAbortedError}

@item 
@ref{5029,,PyExc_ConnectionError}

@item 
@ref{502a,,PyExc_ConnectionRefusedError}

@item 
@ref{502b,,PyExc_ConnectionResetError}

@item 
@ref{502c,,PyExc_DeprecationWarning}

@item 
@ref{502d,,PyExc_EOFError}

@item 
@ref{502e,,PyExc_EncodingWarning}

@item 
@ref{502f,,PyExc_EnvironmentError}

@item 
@ref{5030,,PyExc_Exception}

@item 
@ref{5031,,PyExc_FileExistsError}

@item 
@ref{5032,,PyExc_FileNotFoundError}

@item 
@ref{5033,,PyExc_FloatingPointError}

@item 
@ref{5034,,PyExc_FutureWarning}

@item 
@ref{5035,,PyExc_GeneratorExit}

@item 
@ref{5036,,PyExc_IOError}

@item 
@ref{5037,,PyExc_ImportError}

@item 
@ref{5038,,PyExc_ImportWarning}

@item 
@ref{5039,,PyExc_IndentationError}

@item 
@ref{503a,,PyExc_IndexError}

@item 
@ref{503b,,PyExc_InterruptedError}

@item 
@ref{503c,,PyExc_IsADirectoryError}

@item 
@ref{503d,,PyExc_KeyError}

@item 
@ref{503e,,PyExc_KeyboardInterrupt}

@item 
@ref{503f,,PyExc_LookupError}

@item 
@ref{5040,,PyExc_MemoryError}

@item 
@ref{5041,,PyExc_ModuleNotFoundError}

@item 
@ref{5042,,PyExc_NameError}

@item 
@ref{5043,,PyExc_NotADirectoryError}

@item 
@ref{5044,,PyExc_NotImplementedError}

@item 
@ref{4eda,,PyExc_OSError}

@item 
@ref{5045,,PyExc_OverflowError}

@item 
@ref{5046,,PyExc_PendingDeprecationWarning}

@item 
@ref{5047,,PyExc_PermissionError}

@item 
@ref{5048,,PyExc_ProcessLookupError}

@item 
@ref{10b1,,PyExc_RecursionError}

@item 
@ref{5049,,PyExc_ReferenceError}

@item 
@ref{504a,,PyExc_ResourceWarning}

@item 
@ref{504b,,PyExc_RuntimeError}

@item 
@ref{504c,,PyExc_RuntimeWarning}

@item 
@ref{504d,,PyExc_StopAsyncIteration}

@item 
@ref{504e,,PyExc_StopIteration}

@item 
@ref{504f,,PyExc_SyntaxError}

@item 
@ref{5050,,PyExc_SyntaxWarning}

@item 
@ref{5051,,PyExc_SystemError}

@item 
@ref{5052,,PyExc_SystemExit}

@item 
@ref{5053,,PyExc_TabError}

@item 
@ref{5054,,PyExc_TimeoutError}

@item 
@ref{4ed9,,PyExc_TypeError}

@item 
@ref{5055,,PyExc_UnboundLocalError}

@item 
@ref{5056,,PyExc_UnicodeDecodeError}

@item 
@ref{5057,,PyExc_UnicodeEncodeError}

@item 
@ref{5058,,PyExc_UnicodeError}

@item 
@ref{5059,,PyExc_UnicodeTranslateError}

@item 
@ref{505a,,PyExc_UnicodeWarning}

@item 
@ref{505b,,PyExc_UserWarning}

@item 
@ref{4edb,,PyExc_ValueError}

@item 
@ref{505c,,PyExc_Warning}

@item 
@ref{505d,,PyExc_WindowsError}

@item 
@ref{4ed6,,PyExc_ZeroDivisionError}

@item 
@ref{c5a,,PyExceptionClass_Name()}

@item 
@ref{78a,,PyException_GetArgs()}

@item 
@ref{505e,,PyException_GetCause()}

@item 
@ref{505f,,PyException_GetContext()}

@item 
@ref{5060,,PyException_GetTraceback()}

@item 
@ref{78b,,PyException_SetArgs()}

@item 
@ref{5061,,PyException_SetCause()}

@item 
@ref{5062,,PyException_SetContext()}

@item 
@ref{1dcb,,PyException_SetTraceback()}

@item 
@ref{5063,,PyFile_FromFd()}

@item 
@ref{5064,,PyFile_GetLine()}

@item 
@ref{5065,,PyFile_WriteObject()}

@item 
@ref{5066,,PyFile_WriteString()}

@item 
@ref{5067,,PyFilter_Type}

@item 
@ref{c5e,,PyFloat_AsDouble()}

@item 
@ref{5068,,PyFloat_FromDouble()}

@item 
@ref{5069,,PyFloat_FromString()}

@item 
@ref{15f5,,PyFloat_GetInfo()}

@item 
@ref{15f3,,PyFloat_GetMax()}

@item 
@ref{15f4,,PyFloat_GetMin()}

@item 
@ref{506a,,PyFloat_Type}

@item 
@ref{98b,,PyFrameObject}

@item 
@ref{98c,,PyFrame_GetCode()}

@item 
@ref{98d,,PyFrame_GetLineNumber()}

@item 
@ref{164a,,PyFrozenSet_New()}

@item 
@ref{506b,,PyFrozenSet_Type}

@item 
@ref{b84,,PyGC_Collect()}

@item 
@ref{aa5,,PyGC_Disable()}

@item 
@ref{aa4,,PyGC_Enable()}

@item 
@ref{aa6,,PyGC_IsEnabled()}

@item 
@ref{648,,PyGILState_Ensure()}

@item 
@ref{506c,,PyGILState_GetThisThreadState()}

@item 
@ref{649,,PyGILState_Release()}

@item 
@ref{506d,,PyGILState_STATE}

@item 
@ref{db1,,PyGetSetDef}

@item 
@ref{506e,,PyGetSetDescr_Type}

@item 
@ref{5f9,,PyImport_AddModule()}

@item 
@ref{506f,,PyImport_AddModuleObject()}

@item 
@ref{5fa,,PyImport_AddModuleRef()}

@item 
@ref{1b1a,,PyImport_AppendInittab()}

@item 
@ref{5070,,PyImport_ExecCodeModule()}

@item 
@ref{5071,,PyImport_ExecCodeModuleEx()}

@item 
@ref{5072,,PyImport_ExecCodeModuleObject()}

@item 
@ref{5073,,PyImport_ExecCodeModuleWithPathnames()}

@item 
@ref{1a84,,PyImport_GetImporter()}

@item 
@ref{13a8,,PyImport_GetMagicNumber()}

@item 
@ref{5074,,PyImport_GetMagicTag()}

@item 
@ref{dab,,PyImport_GetModule()}

@item 
@ref{5075,,PyImport_GetModuleDict()}

@item 
@ref{1601,,PyImport_Import()}

@item 
@ref{5076,,PyImport_ImportFrozenModule()}

@item 
@ref{5077,,PyImport_ImportFrozenModuleObject()}

@item 
@ref{3dc,,PyImport_ImportModule()}

@item 
@ref{13a9,,PyImport_ImportModuleLevel()}

@item 
@ref{5078,,PyImport_ImportModuleLevelObject()}

@item 
@ref{3db,,PyImport_ImportModuleNoBlock()}

@item 
@ref{5079,,PyImport_ReloadModule()}

@item 
@ref{b80,,PyIndex_Check()}

@item 
@ref{aba,,PyInterpreterState}

@item 
@ref{4792,,PyInterpreterState_Clear()}

@item 
@ref{507a,,PyInterpreterState_Delete()}

@item 
@ref{64a,,PyInterpreterState_Get()}

@item 
@ref{507b,,PyInterpreterState_GetDict()}

@item 
@ref{dbe,,PyInterpreterState_GetID()}

@item 
@ref{4793,,PyInterpreterState_New()}

@item 
@ref{1caf,,PyIter_Check()}

@item 
@ref{399,,PyIter_Next()}

@item 
@ref{398,,PyIter_NextItem()}

@item 
@ref{a98,,PyIter_Send()}

@item 
@ref{507c,,PyListIter_Type}

@item 
@ref{507d,,PyListRevIter_Type}

@item 
@ref{507e,,PyList_Append()}

@item 
@ref{507f,,PyList_AsTuple()}

@item 
@ref{5fc,,PyList_GetItem()}

@item 
@ref{5fd,,PyList_GetItemRef()}

@item 
@ref{5080,,PyList_GetSlice()}

@item 
@ref{18ba,,PyList_Insert()}

@item 
@ref{4f88,,PyList_New()}

@item 
@ref{5081,,PyList_Reverse()}

@item 
@ref{18bb,,PyList_SetItem()}

@item 
@ref{5082,,PyList_SetSlice()}

@item 
@ref{161f,,PyList_Size()}

@item 
@ref{5083,,PyList_Sort()}

@item 
@ref{4f1a,,PyList_Type}

@item 
@ref{39e,,PyLongObject}

@item 
@ref{5084,,PyLongRangeIter_Type}

@item 
@ref{1976,,PyLong_AsDouble()}

@item 
@ref{602,,PyLong_AsInt()}

@item 
@ref{39f,,PyLong_AsInt32()}

@item 
@ref{3a0,,PyLong_AsInt64()}

@item 
@ref{603,,PyLong_AsLong()}

@item 
@ref{146b,,PyLong_AsLongAndOverflow()}

@item 
@ref{5085,,PyLong_AsLongLong()}

@item 
@ref{146a,,PyLong_AsLongLongAndOverflow()}

@item 
@ref{604,,PyLong_AsNativeBytes()}

@item 
@ref{5086,,PyLong_AsSize_t()}

@item 
@ref{5087,,PyLong_AsSsize_t()}

@item 
@ref{3a1,,PyLong_AsUInt32()}

@item 
@ref{3a2,,PyLong_AsUInt64()}

@item 
@ref{5088,,PyLong_AsUnsignedLong()}

@item 
@ref{1499,,PyLong_AsUnsignedLongLong()}

@item 
@ref{1dc7,,PyLong_AsUnsignedLongLongMask()}

@item 
@ref{5089,,PyLong_AsUnsignedLongMask()}

@item 
@ref{508a,,PyLong_AsVoidPtr()}

@item 
@ref{b3c,,PyLong_FromDouble()}

@item 
@ref{3a3,,PyLong_FromInt32()}

@item 
@ref{3a4,,PyLong_FromInt64()}

@item 
@ref{1bce,,PyLong_FromLong()}

@item 
@ref{1bcf,,PyLong_FromLongLong()}

@item 
@ref{605,,PyLong_FromNativeBytes()}

@item 
@ref{18c0,,PyLong_FromSize_t()}

@item 
@ref{18a0,,PyLong_FromSsize_t()}

@item 
@ref{508b,,PyLong_FromString()}

@item 
@ref{3a5,,PyLong_FromUInt32()}

@item 
@ref{3a6,,PyLong_FromUInt64()}

@item 
@ref{18be,,PyLong_FromUnsignedLong()}

@item 
@ref{18bf,,PyLong_FromUnsignedLongLong()}

@item 
@ref{606,,PyLong_FromUnsignedNativeBytes()}

@item 
@ref{508c,,PyLong_FromVoidPtr()}

@item 
@ref{508d,,PyLong_GetInfo()}

@item 
@ref{508e,,PyLong_Type}

@item 
@ref{508f,,PyMap_Type}

@item 
@ref{5090,,PyMapping_Check()}

@item 
@ref{5e7,,PyMapping_GetItemString()}

@item 
@ref{5e8,,PyMapping_GetOptionalItem()}

@item 
@ref{5e9,,PyMapping_GetOptionalItemString()}

@item 
@ref{61d,,PyMapping_HasKey()}

@item 
@ref{61f,,PyMapping_HasKeyString()}

@item 
@ref{620,,PyMapping_HasKeyStringWithError()}

@item 
@ref{61e,,PyMapping_HasKeyWithError()}

@item 
@ref{db6,,PyMapping_Items()}

@item 
@ref{db4,,PyMapping_Keys()}

@item 
@ref{5091,,PyMapping_Length()}

@item 
@ref{5092,,PyMapping_SetItemString()}

@item 
@ref{1e33,,PyMapping_Size()}

@item 
@ref{db5,,PyMapping_Values()}

@item 
@ref{10ac,,PyMem_Calloc()}

@item 
@ref{1647,,PyMem_Free()}

@item 
@ref{e5e,,PyMem_Malloc()}

@item 
@ref{630,,PyMem_RawCalloc()}

@item 
@ref{632,,PyMem_RawFree()}

@item 
@ref{62f,,PyMem_RawMalloc()}

@item 
@ref{631,,PyMem_RawRealloc()}

@item 
@ref{1231,,PyMem_Realloc()}

@item 
@ref{770,,PyMemberDef}

@item 
@ref{5093,,PyMemberDescr_Type}

@item 
@ref{7a9,,PyMember_GetOne()}

@item 
@ref{7aa,,PyMember_SetOne()}

@item 
@ref{964,,PyMemoryView_FromBuffer()}

@item 
@ref{1375,,PyMemoryView_FromMemory()}

@item 
@ref{5094,,PyMemoryView_FromObject()}

@item 
@ref{5095,,PyMemoryView_GetContiguous()}

@item 
@ref{5096,,PyMemoryView_Type}

@item 
@ref{16dc,,PyMethodDef}

@item 
@ref{5097,,PyMethodDescr_Type}

@item 
@ref{b71,,PyModuleDef}

@item 
@code{PyModuleDef_Base}

@item 
@ref{4ee2,,PyModuleDef_Init()}

@item 
@ref{5098,,PyModuleDef_Slot}

@item 
@ref{5099,,PyModuleDef_Type}

@item 
@ref{609,,PyModule_Add()}

@item 
@ref{509a,,PyModule_AddFunctions()}

@item 
@ref{1741,,PyModule_AddIntConstant()}

@item 
@ref{608,,PyModule_AddObject()}

@item 
@ref{607,,PyModule_AddObjectRef()}

@item 
@ref{1742,,PyModule_AddStringConstant()}

@item 
@ref{b6c,,PyModule_AddType()}

@item 
@ref{509b,,PyModule_Create2()}

@item 
@ref{10b4,,PyModule_ExecDef()}

@item 
@ref{10b3,,PyModule_FromDefAndSpec2()}

@item 
@ref{509c,,PyModule_GetDef()}

@item 
@ref{509d,,PyModule_GetDict()}

@item 
@ref{42d,,PyModule_GetFilename()}

@item 
@ref{42e,,PyModule_GetFilenameObject()}

@item 
@ref{509e,,PyModule_GetName()}

@item 
@ref{509f,,PyModule_GetNameObject()}

@item 
@ref{b76,,PyModule_GetState()}

@item 
@ref{50a0,,PyModule_New()}

@item 
@ref{50a1,,PyModule_NewObject()}

@item 
@ref{50a2,,PyModule_SetDocString()}

@item 
@ref{50a3,,PyModule_Type}

@item 
@ref{50a4,,PyNumber_Absolute()}

@item 
@ref{50a5,,PyNumber_Add()}

@item 
@ref{50a6,,PyNumber_And()}

@item 
@ref{50a7,,PyNumber_AsSsize_t()}

@item 
@ref{c5b,,PyNumber_Check()}

@item 
@ref{50a8,,PyNumber_Divmod()}

@item 
@ref{c5d,,PyNumber_Float()}

@item 
@ref{50a9,,PyNumber_FloorDivide()}

@item 
@ref{50aa,,PyNumber_InPlaceAdd()}

@item 
@ref{50ab,,PyNumber_InPlaceAnd()}

@item 
@ref{50ac,,PyNumber_InPlaceFloorDivide()}

@item 
@ref{50ad,,PyNumber_InPlaceLshift()}

@item 
@ref{10b6,,PyNumber_InPlaceMatrixMultiply()}

@item 
@ref{50ae,,PyNumber_InPlaceMultiply()}

@item 
@ref{50af,,PyNumber_InPlaceOr()}

@item 
@ref{50b0,,PyNumber_InPlacePower()}

@item 
@ref{50b1,,PyNumber_InPlaceRemainder()}

@item 
@ref{50b2,,PyNumber_InPlaceRshift()}

@item 
@ref{50b3,,PyNumber_InPlaceSubtract()}

@item 
@ref{50b4,,PyNumber_InPlaceTrueDivide()}

@item 
@ref{50b5,,PyNumber_InPlaceXor()}

@item 
@ref{a93,,PyNumber_Index()}

@item 
@ref{50b6,,PyNumber_Invert()}

@item 
@ref{c5c,,PyNumber_Long()}

@item 
@ref{50b7,,PyNumber_Lshift()}

@item 
@ref{10b5,,PyNumber_MatrixMultiply()}

@item 
@ref{50b8,,PyNumber_Multiply()}

@item 
@ref{50b9,,PyNumber_Negative()}

@item 
@ref{50ba,,PyNumber_Or()}

@item 
@ref{50bb,,PyNumber_Positive()}

@item 
@ref{50bc,,PyNumber_Power()}

@item 
@ref{50bd,,PyNumber_Remainder()}

@item 
@ref{50be,,PyNumber_Rshift()}

@item 
@ref{50bf,,PyNumber_Subtract()}

@item 
@ref{1b71,,PyNumber_ToBase()}

@item 
@ref{50c0,,PyNumber_TrueDivide()}

@item 
@ref{50c1,,PyNumber_Xor()}

@item 
@ref{42f,,PyOS_AfterFork()}

@item 
@ref{430,,PyOS_AfterFork_Child()}

@item 
@ref{db8,,PyOS_AfterFork_Parent()}

@item 
@ref{db7,,PyOS_BeforeFork()}

@item 
@ref{1b9f,,PyOS_CheckStack()}

@item 
@ref{f13,,PyOS_FSPath()}

@item 
@ref{7a3,,PyOS_InputHook}

@item 
@ref{1d3f,,PyOS_InterruptOccurred()}

@item 
@ref{50c2,,PyOS_double_to_string()}

@item 
@ref{1743,,PyOS_getsig()}

@item 
@ref{1d38,,PyOS_mystricmp()}

@item 
@ref{1d37,,PyOS_mystrnicmp()}

@item 
@ref{1744,,PyOS_setsig()}

@item 
@ref{50c3,,PyOS_sighandler_t}

@item 
@ref{170e,,PyOS_snprintf()}

@item 
@ref{149a,,PyOS_string_to_double()}

@item 
@ref{50c4,,PyOS_strtol()}

@item 
@ref{50c5,,PyOS_strtoul()}

@item 
@ref{170f,,PyOS_vsnprintf()}

@item 
@ref{5dc,,PyObject}

@item 
@ref{a9f,,PyObject.ob_refcnt}

@item 
@ref{4f0c,,PyObject.ob_type}

@item 
@ref{50c6,,PyObject_ASCII()}

@item 
@ref{50c7,,PyObject_AsFileDescriptor()}

@item 
@ref{50c8,,PyObject_Bytes()}

@item 
@ref{63b,,PyObject_Call()}

@item 
@ref{63d,,PyObject_CallFunction()}

@item 
@ref{50c9,,PyObject_CallFunctionObjArgs()}

@item 
@ref{63e,,PyObject_CallMethod()}

@item 
@ref{1ddc,,PyObject_CallMethodObjArgs()}

@item 
@ref{63a,,PyObject_CallNoArgs()}

@item 
@ref{4eeb,,PyObject_CallObject()}

@item 
@ref{10ad,,PyObject_Calloc()}

@item 
@ref{637,,PyObject_CheckBuffer()}

@item 
@ref{795,,PyObject_ClearWeakRefs()}

@item 
@ref{960,,PyObject_CopyData()}

@item 
@ref{1834,,PyObject_DelAttr()}

@item 
@ref{1835,,PyObject_DelAttrString()}

@item 
@ref{50ca,,PyObject_DelItem()}

@item 
@ref{50cb,,PyObject_DelItemString()}

@item 
@ref{50cc,,PyObject_Dir()}

@item 
@ref{50cd,,PyObject_Format()}

@item 
@ref{e5f,,PyObject_Free()}

@item 
@ref{1708,,PyObject_GC_Del()}

@item 
@ref{b6e,,PyObject_GC_IsFinalized()}

@item 
@ref{b6d,,PyObject_GC_IsTracked()}

@item 
@ref{1709,,PyObject_GC_Track()}

@item 
@ref{170a,,PyObject_GC_UnTrack()}

@item 
@ref{50ce,,PyObject_GenericGetAttr()}

@item 
@ref{1d02,,PyObject_GenericGetDict()}

@item 
@ref{50cf,,PyObject_GenericSetAttr()}

@item 
@ref{50d0,,PyObject_GenericSetDict()}

@item 
@ref{50d1,,PyObject_GetAIter()}

@item 
@ref{5ec,,PyObject_GetAttr()}

@item 
@ref{5ed,,PyObject_GetAttrString()}

@item 
@ref{638,,PyObject_GetBuffer()}

@item 
@ref{5e6,,PyObject_GetItem()}

@item 
@ref{50d2,,PyObject_GetIter()}

@item 
@ref{5ea,,PyObject_GetOptionalAttr()}

@item 
@ref{5eb,,PyObject_GetOptionalAttrString()}

@item 
@ref{76a,,PyObject_GetTypeData()}

@item 
@ref{619,,PyObject_HasAttr()}

@item 
@ref{61b,,PyObject_HasAttrString()}

@item 
@ref{61c,,PyObject_HasAttrStringWithError()}

@item 
@ref{61a,,PyObject_HasAttrWithError()}

@item 
@ref{436,,PyObject_Hash()}

@item 
@ref{15cb,,PyObject_HashNotImplemented()}

@item 
@ref{c60,,PyObject_Init()}

@item 
@ref{1d3d,,PyObject_InitVar()}

@item 
@ref{10a5,,PyObject_IsInstance()}

@item 
@ref{10a6,,PyObject_IsSubclass()}

@item 
@ref{50d3,,PyObject_IsTrue()}

@item 
@ref{50d4,,PyObject_Length()}

@item 
@ref{e61,,PyObject_Malloc()}

@item 
@ref{50d5,,PyObject_Not()}

@item 
@ref{1648,,PyObject_Realloc()}

@item 
@ref{122e,,PyObject_Repr()}

@item 
@ref{4f30,,PyObject_RichCompare()}

@item 
@ref{1d8a,,PyObject_RichCompareBool()}

@item 
@ref{50d6,,PyObject_SelfIter()}

@item 
@ref{1770,,PyObject_SetAttr()}

@item 
@ref{198f,,PyObject_SetAttrString()}

@item 
@ref{4f87,,PyObject_SetItem()}

@item 
@ref{50d7,,PyObject_Size()}

@item 
@ref{122f,,PyObject_Str()}

@item 
@ref{50d8,,PyObject_Type()}

@item 
@ref{77d,,PyObject_Vectorcall()}

@item 
@ref{77e,,PyObject_VectorcallMethod()}

@item 
@ref{50d9,,PyProperty_Type}

@item 
@ref{50da,,PyRangeIter_Type}

@item 
@ref{50db,,PyRange_Type}

@item 
@ref{50dc,,PyReversed_Type}

@item 
@ref{50dd,,PySeqIter_New()}

@item 
@ref{50de,,PySeqIter_Type}

@item 
@ref{50df,,PySequence_Check()}

@item 
@ref{50e0,,PySequence_Concat()}

@item 
@ref{3d9,,PySequence_Contains()}

@item 
@ref{50e1,,PySequence_Count()}

@item 
@ref{1e32,,PySequence_DelItem()}

@item 
@ref{50e2,,PySequence_DelSlice()}

@item 
@ref{18a4,,PySequence_Fast()}

@item 
@ref{1e30,,PySequence_GetItem()}

@item 
@ref{50e3,,PySequence_GetSlice()}

@item 
@ref{3d8,,PySequence_In()}

@item 
@ref{50e4,,PySequence_InPlaceConcat()}

@item 
@ref{50e5,,PySequence_InPlaceRepeat()}

@item 
@ref{50e6,,PySequence_Index()}

@item 
@ref{50e7,,PySequence_Length()}

@item 
@ref{50e8,,PySequence_List()}

@item 
@ref{50e9,,PySequence_Repeat()}

@item 
@ref{1e31,,PySequence_SetItem()}

@item 
@ref{50ea,,PySequence_SetSlice()}

@item 
@ref{1e2f,,PySequence_Size()}

@item 
@ref{50eb,,PySequence_Tuple()}

@item 
@ref{50ec,,PySetIter_Type}

@item 
@ref{164b,,PySet_Add()}

@item 
@ref{50ed,,PySet_Clear()}

@item 
@ref{164d,,PySet_Contains()}

@item 
@ref{164c,,PySet_Discard()}

@item 
@ref{1649,,PySet_New()}

@item 
@ref{50ee,,PySet_Pop()}

@item 
@ref{164e,,PySet_Size()}

@item 
@ref{50ef,,PySet_Type}

@item 
@ref{433,,PySlice_AdjustIndices()}

@item 
@ref{50f0,,PySlice_GetIndices()}

@item 
@ref{431,,PySlice_GetIndicesEx()}

@item 
@ref{50f1,,PySlice_New()}

@item 
@ref{50f2,,PySlice_Type}

@item 
@ref{432,,PySlice_Unpack()}

@item 
@ref{50f3,,PyState_AddModule()}

@item 
@ref{50f4,,PyState_FindModule()}

@item 
@ref{50f5,,PyState_RemoveModule()}

@item 
@ref{db3,,PyStructSequence_Desc}

@item 
@ref{db2,,PyStructSequence_Field}

@item 
@ref{50f6,,PyStructSequence_GetItem()}

@item 
@ref{50f7,,PyStructSequence_New()}

@item 
@ref{50f8,,PyStructSequence_NewType()}

@item 
@ref{50f9,,PyStructSequence_SetItem()}

@item 
@ref{b78,,PyStructSequence_UnnamedField}

@item 
@ref{50fa,,PySuper_Type}

@item 
@ref{611,,PySys_Audit()}

@item 
@ref{612,,PySys_AuditTuple()}

@item 
@ref{50fb,,PySys_FormatStderr()}

@item 
@ref{50fc,,PySys_FormatStdout()}

@item 
@ref{628,,PySys_GetObject()}

@item 
@ref{50fd,,PySys_GetXOptions()}

@item 
@ref{3f4,,PySys_ResetWarnOptions()}

@item 
@ref{19b8,,PySys_SetArgv()}

@item 
@ref{19b7,,PySys_SetArgvEx()}

@item 
@ref{50fe,,PySys_SetObject()}

@item 
@ref{50ff,,PySys_WriteStderr()}

@item 
@ref{5100,,PySys_WriteStdout()}

@item 
@ref{98f,,PyThreadState}

@item 
@ref{1992,,PyThreadState_Clear()}

@item 
@ref{1d87,,PyThreadState_Delete()}

@item 
@ref{613,,PyThreadState_Get()}

@item 
@ref{5101,,PyThreadState_GetDict()}

@item 
@ref{990,,PyThreadState_GetFrame()}

@item 
@ref{b6a,,PyThreadState_GetID()}

@item 
@ref{b69,,PyThreadState_GetInterpreter()}

@item 
@ref{5102,,PyThreadState_New()}

@item 
@ref{dbc,,PyThreadState_SetAsyncExc()}

@item 
@ref{5103,,PyThreadState_Swap()}

@item 
@ref{5104,,PyThread_GetInfo()}

@item 
@ref{441,,PyThread_ReInitTLS()}

@item 
@ref{5105,,PyThread_acquire_lock()}

@item 
@ref{5106,,PyThread_acquire_lock_timed()}

@item 
@ref{5107,,PyThread_allocate_lock()}

@item 
@ref{437,,PyThread_create_key()}

@item 
@ref{439,,PyThread_delete_key()}

@item 
@ref{43f,,PyThread_delete_key_value()}

@item 
@ref{5108,,PyThread_exit_thread()}

@item 
@ref{5109,,PyThread_free_lock()}

@item 
@ref{43d,,PyThread_get_key_value()}

@item 
@ref{510a,,PyThread_get_stacksize()}

@item 
@ref{510b,,PyThread_get_thread_ident()}

@item 
@ref{1ba0,,PyThread_get_thread_native_id()}

@item 
@ref{510c,,PyThread_init_thread()}

@item 
@ref{510d,,PyThread_release_lock()}

@item 
@ref{43b,,PyThread_set_key_value()}

@item 
@ref{510e,,PyThread_set_stacksize()}

@item 
@ref{1e27,,PyThread_start_new_thread()}

@item 
@ref{438,,PyThread_tss_alloc()}

@item 
@ref{510f,,PyThread_tss_create()}

@item 
@ref{440,,PyThread_tss_delete()}

@item 
@ref{43a,,PyThread_tss_free()}

@item 
@ref{43e,,PyThread_tss_get()}

@item 
@ref{5110,,PyThread_tss_is_created()}

@item 
@ref{43c,,PyThread_tss_set()}

@item 
@ref{5111,,PyTraceBack_Here()}

@item 
@ref{5112,,PyTraceBack_Print()}

@item 
@ref{5113,,PyTraceBack_Type}

@item 
@ref{5114,,PyTupleIter_Type}

@item 
@ref{4ef6,,PyTuple_GetItem()}

@item 
@ref{5115,,PyTuple_GetSlice()}

@item 
@ref{63c,,PyTuple_New()}

@item 
@ref{5116,,PyTuple_Pack()}

@item 
@ref{4ef7,,PyTuple_SetItem()}

@item 
@ref{5117,,PyTuple_Size()}

@item 
@ref{5118,,PyTuple_Type}

@item 
@ref{c9b,,PyTypeObject}

@item 
@ref{5119,,PyType_ClearCache()}

@item 
@ref{3af,,PyType_Freeze()}

@item 
@ref{771,,PyType_FromMetaclass()}

@item 
@ref{772,,PyType_FromModuleAndSpec()}

@item 
@ref{79c,,PyType_FromSpec()}

@item 
@ref{79d,,PyType_FromSpecWithBases()}

@item 
@ref{c5f,,PyType_GenericAlloc()}

@item 
@ref{4f0b,,PyType_GenericNew()}

@item 
@ref{3b0,,PyType_GetBaseByToken()}

@item 
@ref{1d3a,,PyType_GetFlags()}

@item 
@ref{614,,PyType_GetFullyQualifiedName()}

@item 
@ref{b66,,PyType_GetModule()}

@item 
@ref{633,,PyType_GetModuleByDef()}

@item 
@ref{616,,PyType_GetModuleName()}

@item 
@ref{b67,,PyType_GetModuleState()}

@item 
@ref{957,,PyType_GetName()}

@item 
@ref{958,,PyType_GetQualName()}

@item 
@ref{a9c,,PyType_GetSlot()}

@item 
@ref{76b,,PyType_GetTypeDataSize()}

@item 
@ref{511a,,PyType_IsSubtype()}

@item 
@ref{1b79,,PyType_Modified()}

@item 
@ref{97f,,PyType_Ready()}

@item 
@ref{511b,,PyType_Slot}

@item 
@ref{1a89,,PyType_Spec}

@item 
@ref{76e,,PyType_Type}

@item 
@ref{511c,,PyUnicodeDecodeError_Create()}

@item 
@ref{511d,,PyUnicodeDecodeError_GetEncoding()}

@item 
@ref{511e,,PyUnicodeDecodeError_GetEnd()}

@item 
@ref{511f,,PyUnicodeDecodeError_GetObject()}

@item 
@ref{5120,,PyUnicodeDecodeError_GetReason()}

@item 
@ref{5121,,PyUnicodeDecodeError_GetStart()}

@item 
@ref{5122,,PyUnicodeDecodeError_SetEnd()}

@item 
@ref{5123,,PyUnicodeDecodeError_SetReason()}

@item 
@ref{5124,,PyUnicodeDecodeError_SetStart()}

@item 
@ref{5125,,PyUnicodeEncodeError_GetEncoding()}

@item 
@ref{18fc,,PyUnicodeEncodeError_GetEnd()}

@item 
@ref{5126,,PyUnicodeEncodeError_GetObject()}

@item 
@ref{5127,,PyUnicodeEncodeError_GetReason()}

@item 
@ref{18ff,,PyUnicodeEncodeError_GetStart()}

@item 
@ref{5128,,PyUnicodeEncodeError_SetEnd()}

@item 
@ref{5129,,PyUnicodeEncodeError_SetReason()}

@item 
@ref{512a,,PyUnicodeEncodeError_SetStart()}

@item 
@ref{512b,,PyUnicodeIter_Type}

@item 
@ref{512c,,PyUnicodeTranslateError_GetEnd()}

@item 
@ref{512d,,PyUnicodeTranslateError_GetObject()}

@item 
@ref{512e,,PyUnicodeTranslateError_GetReason()}

@item 
@ref{512f,,PyUnicodeTranslateError_GetStart()}

@item 
@ref{5130,,PyUnicodeTranslateError_SetEnd()}

@item 
@ref{5131,,PyUnicodeTranslateError_SetReason()}

@item 
@ref{5132,,PyUnicodeTranslateError_SetStart()}

@item 
@ref{5133,,PyUnicode_Append()}

@item 
@ref{5134,,PyUnicode_AppendAndDel()}

@item 
@ref{1397,,PyUnicode_AsASCIIString()}

@item 
@ref{5135,,PyUnicode_AsCharmapString()}

@item 
@code{PyUnicode_AsDecodedObject()}

@item 
@code{PyUnicode_AsDecodedUnicode()}

@item 
@code{PyUnicode_AsEncodedObject()}

@item 
@ref{5136,,PyUnicode_AsEncodedString()}

@item 
@code{PyUnicode_AsEncodedUnicode()}

@item 
@ref{1396,,PyUnicode_AsLatin1String()}

@item 
@ref{1398,,PyUnicode_AsMBCSString()}

@item 
@ref{1395,,PyUnicode_AsRawUnicodeEscapeString()}

@item 
@ref{137d,,PyUnicode_AsUCS4()}

@item 
@ref{ab8,,PyUnicode_AsUCS4Copy()}

@item 
@ref{5137,,PyUnicode_AsUTF16String()}

@item 
@ref{5138,,PyUnicode_AsUTF32String()}

@item 
@ref{a99,,PyUnicode_AsUTF8AndSize()}

@item 
@ref{1393,,PyUnicode_AsUTF8String()}

@item 
@ref{1394,,PyUnicode_AsUnicodeEscapeString()}

@item 
@ref{1e34,,PyUnicode_AsWideChar()}

@item 
@ref{ab9,,PyUnicode_AsWideCharString()}

@item 
@ref{1a62,,PyUnicode_BuildEncodingMap()}

@item 
@ref{ab4,,PyUnicode_Compare()}

@item 
@ref{146c,,PyUnicode_CompareWithASCIIString()}

@item 
@ref{13a6,,PyUnicode_Concat()}

@item 
@ref{5139,,PyUnicode_Contains()}

@item 
@ref{513a,,PyUnicode_Count()}

@item 
@ref{1dc4,,PyUnicode_Decode()}

@item 
@ref{513b,,PyUnicode_DecodeASCII()}

@item 
@ref{513c,,PyUnicode_DecodeCharmap()}

@item 
@ref{513d,,PyUnicode_DecodeCodePageStateful()}

@item 
@ref{1a88,,PyUnicode_DecodeFSDefault()}

@item 
@ref{513e,,PyUnicode_DecodeFSDefaultAndSize()}

@item 
@ref{513f,,PyUnicode_DecodeLatin1()}

@item 
@ref{5140,,PyUnicode_DecodeLocale()}

@item 
@ref{dc1,,PyUnicode_DecodeLocaleAndSize()}

@item 
@ref{5141,,PyUnicode_DecodeMBCS()}

@item 
@ref{5142,,PyUnicode_DecodeMBCSStateful()}

@item 
@ref{5143,,PyUnicode_DecodeRawUnicodeEscape()}

@item 
@ref{5144,,PyUnicode_DecodeUTF16()}

@item 
@ref{5145,,PyUnicode_DecodeUTF16Stateful()}

@item 
@ref{5146,,PyUnicode_DecodeUTF32()}

@item 
@ref{5147,,PyUnicode_DecodeUTF32Stateful()}

@item 
@ref{5148,,PyUnicode_DecodeUTF7()}

@item 
@ref{5149,,PyUnicode_DecodeUTF7Stateful()}

@item 
@ref{514a,,PyUnicode_DecodeUTF8()}

@item 
@ref{1b15,,PyUnicode_DecodeUTF8Stateful()}

@item 
@ref{514b,,PyUnicode_DecodeUnicodeEscape()}

@item 
@ref{1399,,PyUnicode_EncodeCodePage()}

@item 
@ref{1e2d,,PyUnicode_EncodeFSDefault()}

@item 
@ref{dc2,,PyUnicode_EncodeLocale()}

@item 
@ref{3b2,,PyUnicode_Equal()}

@item 
@ref{618,,PyUnicode_EqualToUTF8()}

@item 
@ref{617,,PyUnicode_EqualToUTF8AndSize()}

@item 
@ref{f14,,PyUnicode_FSConverter()}

@item 
@ref{796,,PyUnicode_FSDecoder()}

@item 
@ref{514c,,PyUnicode_Find()}

@item 
@ref{ab6,,PyUnicode_FindChar()}

@item 
@ref{514d,,PyUnicode_Format()}

@item 
@ref{514e,,PyUnicode_FromEncodedObject()}

@item 
@ref{629,,PyUnicode_FromFormat()}

@item 
@ref{793,,PyUnicode_FromFormatV()}

@item 
@ref{514f,,PyUnicode_FromObject()}

@item 
@ref{5150,,PyUnicode_FromOrdinal()}

@item 
@ref{5151,,PyUnicode_FromString()}

@item 
@ref{5152,,PyUnicode_FromStringAndSize()}

@item 
@ref{1391,,PyUnicode_FromWideChar()}

@item 
@ref{5153,,PyUnicode_GetDefaultEncoding()}

@item 
@ref{ab0,,PyUnicode_GetLength()}

@item 
@ref{198d,,PyUnicode_InternFromString()}

@item 
@ref{aae,,PyUnicode_InternInPlace()}

@item 
@ref{1d84,,PyUnicode_IsIdentifier()}

@item 
@ref{13a7,,PyUnicode_Join()}

@item 
@ref{189a,,PyUnicode_Partition()}

@item 
@ref{189b,,PyUnicode_RPartition()}

@item 
@ref{1899,,PyUnicode_RSplit()}

@item 
@ref{1376,,PyUnicode_ReadChar()}

@item 
@ref{5154,,PyUnicode_Replace()}

@item 
@ref{5155,,PyUnicode_Resize()}

@item 
@ref{5156,,PyUnicode_RichCompare()}

@item 
@ref{5157,,PyUnicode_Split()}

@item 
@ref{5158,,PyUnicode_Splitlines()}

@item 
@ref{ab3,,PyUnicode_Substring()}

@item 
@ref{ab5,,PyUnicode_Tailmatch()}

@item 
@ref{5159,,PyUnicode_Translate()}

@item 
@ref{515a,,PyUnicode_Type}

@item 
@ref{1377,,PyUnicode_WriteChar()}

@item 
@ref{4715,,PyVarObject}

@item 
@code{PyVarObject.ob_base}

@item 
@ref{515b,,PyVarObject.ob_size}

@item 
@ref{777,,PyVectorcall_Call()}

@item 
@ref{776,,PyVectorcall_NARGS()}

@item 
@code{PyWeakReference}

@item 
@ref{3dd,,PyWeakref_GetObject()}

@item 
@ref{3df,,PyWeakref_GetRef()}

@item 
@ref{515c,,PyWeakref_NewProxy()}

@item 
@ref{1be4,,PyWeakref_NewRef()}

@item 
@ref{515d,,PyWrapperDescr_Type}

@item 
@ref{515e,,PyWrapper_New()}

@item 
@ref{515f,,PyZip_Type}

@item 
@ref{5160,,Py_ASNATIVEBYTES_ALLOW_INDEX}

@item 
@ref{5161,,Py_ASNATIVEBYTES_BIG_ENDIAN}

@item 
@ref{5162,,Py_ASNATIVEBYTES_DEFAULTS}

@item 
@ref{5163,,Py_ASNATIVEBYTES_LITTLE_ENDIAN}

@item 
@ref{5164,,Py_ASNATIVEBYTES_NATIVE_ENDIAN}

@item 
@ref{5165,,Py_ASNATIVEBYTES_REJECT_NEGATIVE}

@item 
@ref{5166,,Py_ASNATIVEBYTES_UNSIGNED_BUFFER}

@item 
@ref{7ae,,Py_AUDIT_READ}

@item 
@ref{b77,,Py_AddPendingCall()}

@item 
@ref{5167,,Py_AtExit()}

@item 
@ref{4efc,,Py_BEGIN_ALLOW_THREADS}

@item 
@ref{5168,,Py_BLOCK_THREADS}

@item 
@ref{3c2,,Py_BuildValue()}

@item 
@ref{bb7,,Py_BytesMain()}

@item 
@ref{a85,,Py_CompileString()}

@item 
@ref{5169,,Py_DecRef()}

@item 
@ref{dbf,,Py_DecodeLocale()}

@item 
@ref{c7e,,Py_END_ALLOW_THREADS}

@item 
@ref{dc0,,Py_EncodeLocale()}

@item 
@ref{1847,,Py_EndInterpreter()}

@item 
@ref{3d2,,Py_EnterRecursiveCall()}

@item 
@ref{f4a,,Py_Exit()}

@item 
@ref{b79,,Py_FatalError()}

@item 
@code{Py_FileSystemDefaultEncodeErrors}

@item 
@code{Py_FileSystemDefaultEncoding}

@item 
@ref{45f,,Py_Finalize()}

@item 
@ref{f10,,Py_FinalizeEx()}

@item 
@ref{516a,,Py_GenericAlias()}

@item 
@ref{516b,,Py_GenericAliasType}

@item 
@ref{1637,,Py_GetBuildInfo()}

@item 
@ref{516c,,Py_GetCompiler()}

@item 
@ref{5f7,,Py_GetConstant()}

@item 
@ref{5f8,,Py_GetConstantBorrowed()}

@item 
@ref{516d,,Py_GetCopyright()}

@item 
@ref{3e9,,Py_GetExecPrefix()}

@item 
@ref{3e3,,Py_GetPath()}

@item 
@ref{516e,,Py_GetPlatform()}

@item 
@ref{3e5,,Py_GetPrefix()}

@item 
@ref{3ec,,Py_GetProgramFullPath()}

@item 
@ref{3ee,,Py_GetProgramName()}

@item 
@ref{3ef,,Py_GetPythonHome()}

@item 
@ref{516f,,Py_GetRecursionLimit()}

@item 
@ref{5170,,Py_GetVersion()}

@item 
@code{Py_HasFileSystemDefaultEncoding}

@item 
@ref{5171,,Py_IncRef()}

@item 
@ref{460,,Py_Initialize()}

@item 
@ref{5172,,Py_InitializeEx()}

@item 
@ref{aa0,,Py_Is()}

@item 
@ref{aa3,,Py_IsFalse()}

@item 
@ref{5fb,,Py_IsFinalizing()}

@item 
@ref{4f90,,Py_IsInitialized()}

@item 
@ref{aa1,,Py_IsNone()}

@item 
@ref{aa2,,Py_IsTrue()}

@item 
@ref{b6b,,Py_LeaveRecursiveCall()}

@item 
@ref{e1d,,Py_Main()}

@item 
@ref{5173,,Py_MakePendingCalls()}

@item 
@ref{1b2f,,Py_NewInterpreter()}

@item 
@ref{a9a,,Py_NewRef()}

@item 
@ref{380,,Py_PACK_FULL_VERSION()}

@item 
@ref{37f,,Py_PACK_VERSION()}

@item 
@ref{7ad,,Py_READONLY}

@item 
@ref{2cf,,Py_REFCNT()}

@item 
@ref{76f,,Py_RELATIVE_OFFSET}

@item 
@ref{5174,,Py_ReprEnter()}

@item 
@ref{5175,,Py_ReprLeave()}

@item 
@ref{19b6,,Py_SetProgramName()}

@item 
@ref{19b5,,Py_SetPythonHome()}

@item 
@ref{5176,,Py_SetRecursionLimit()}

@item 
@ref{4f14,,Py_TPFLAGS_BASETYPE}

@item 
@ref{4f09,,Py_TPFLAGS_DEFAULT}

@item 
@ref{980,,Py_TPFLAGS_HAVE_GC}

@item 
@ref{775,,Py_TPFLAGS_HAVE_VECTORCALL}

@item 
@ref{76c,,Py_TPFLAGS_ITEMS_AT_END}

@item 
@ref{5177,,Py_TPFLAGS_METHOD_DESCRIPTOR}

@item 
@ref{5178,,Py_TP_USE_SPEC}

@item 
@ref{3c9,,Py_TYPE()}

@item 
@ref{5179,,Py_T_BOOL}

@item 
@ref{517a,,Py_T_BYTE}

@item 
@ref{517b,,Py_T_CHAR}

@item 
@ref{7ac,,Py_T_DOUBLE}

@item 
@ref{517c,,Py_T_FLOAT}

@item 
@ref{7ab,,Py_T_INT}

@item 
@ref{517d,,Py_T_LONG}

@item 
@ref{517e,,Py_T_LONGLONG}

@item 
@ref{7b0,,Py_T_OBJECT_EX}

@item 
@ref{517f,,Py_T_PYSSIZET}

@item 
@ref{5180,,Py_T_SHORT}

@item 
@ref{5181,,Py_T_STRING}

@item 
@ref{5182,,Py_T_STRING_INPLACE}

@item 
@ref{5183,,Py_T_UBYTE}

@item 
@ref{5184,,Py_T_UINT}

@item 
@ref{5185,,Py_T_ULONG}

@item 
@ref{5186,,Py_T_ULONGLONG}

@item 
@ref{5187,,Py_T_USHORT}

@item 
@ref{33d,,Py_UCS4}

@item 
@ref{5188,,Py_UNBLOCK_THREADS}

@item 
@code{Py_UTF8Mode}

@item 
@ref{5189,,Py_VaBuildValue()}

@item 
@ref{381,,Py_Version}

@item 
@ref{a9b,,Py_XNewRef()}

@item 
@ref{518a,,Py_am_aiter}

@item 
@ref{518b,,Py_am_anext}

@item 
@ref{518c,,Py_am_await}

@item 
@ref{518d,,Py_am_send}

@item 
@ref{518e,,Py_bf_getbuffer}

@item 
@ref{518f,,Py_bf_releasebuffer}

@item 
@ref{95b,,Py_buffer}

@item 
@code{Py_intptr_t}

@item 
@ref{5190,,Py_mod_create}

@item 
@ref{b75,,Py_mod_exec}

@item 
@ref{483,,Py_mod_gil}

@item 
@ref{5191,,Py_mod_multiple_interpreters}

@item 
@ref{5192,,Py_mp_ass_subscript}

@item 
@ref{5193,,Py_mp_length}

@item 
@ref{5194,,Py_mp_subscript}

@item 
@ref{5195,,Py_nb_absolute}

@item 
@ref{5196,,Py_nb_add}

@item 
@ref{5197,,Py_nb_and}

@item 
@ref{5198,,Py_nb_bool}

@item 
@ref{5199,,Py_nb_divmod}

@item 
@ref{519a,,Py_nb_float}

@item 
@ref{519b,,Py_nb_floor_divide}

@item 
@ref{519c,,Py_nb_index}

@item 
@ref{519d,,Py_nb_inplace_add}

@item 
@ref{519e,,Py_nb_inplace_and}

@item 
@ref{519f,,Py_nb_inplace_floor_divide}

@item 
@ref{51a0,,Py_nb_inplace_lshift}

@item 
@ref{51a1,,Py_nb_inplace_matrix_multiply}

@item 
@ref{51a2,,Py_nb_inplace_multiply}

@item 
@ref{51a3,,Py_nb_inplace_or}

@item 
@ref{51a4,,Py_nb_inplace_power}

@item 
@ref{51a5,,Py_nb_inplace_remainder}

@item 
@ref{51a6,,Py_nb_inplace_rshift}

@item 
@ref{51a7,,Py_nb_inplace_subtract}

@item 
@ref{51a8,,Py_nb_inplace_true_divide}

@item 
@ref{51a9,,Py_nb_inplace_xor}

@item 
@ref{51aa,,Py_nb_int}

@item 
@ref{51ab,,Py_nb_invert}

@item 
@ref{51ac,,Py_nb_lshift}

@item 
@ref{51ad,,Py_nb_matrix_multiply}

@item 
@ref{51ae,,Py_nb_multiply}

@item 
@ref{51af,,Py_nb_negative}

@item 
@ref{51b0,,Py_nb_or}

@item 
@ref{51b1,,Py_nb_positive}

@item 
@ref{51b2,,Py_nb_power}

@item 
@ref{51b3,,Py_nb_remainder}

@item 
@ref{51b4,,Py_nb_rshift}

@item 
@ref{51b5,,Py_nb_subtract}

@item 
@ref{51b6,,Py_nb_true_divide}

@item 
@ref{51b7,,Py_nb_xor}

@item 
@ref{51b8,,Py_sq_ass_item}

@item 
@ref{51b9,,Py_sq_concat}

@item 
@ref{51ba,,Py_sq_contains}

@item 
@ref{51bb,,Py_sq_inplace_concat}

@item 
@ref{51bc,,Py_sq_inplace_repeat}

@item 
@ref{51bd,,Py_sq_item}

@item 
@ref{51be,,Py_sq_length}

@item 
@ref{51bf,,Py_sq_repeat}

@item 
@ref{c54,,Py_ssize_t}

@item 
@ref{51c0,,Py_tp_alloc}

@item 
@ref{51c1,,Py_tp_base}

@item 
@ref{51c2,,Py_tp_bases}

@item 
@ref{51c3,,Py_tp_call}

@item 
@ref{51c4,,Py_tp_clear}

@item 
@ref{51c5,,Py_tp_dealloc}

@item 
@ref{51c6,,Py_tp_del}

@item 
@ref{51c7,,Py_tp_descr_get}

@item 
@ref{51c8,,Py_tp_descr_set}

@item 
@ref{51c9,,Py_tp_doc}

@item 
@ref{51ca,,Py_tp_finalize}

@item 
@ref{51cb,,Py_tp_free}

@item 
@ref{51cc,,Py_tp_getattr}

@item 
@ref{51cd,,Py_tp_getattro}

@item 
@ref{51ce,,Py_tp_getset}

@item 
@ref{51cf,,Py_tp_hash}

@item 
@ref{51d0,,Py_tp_init}

@item 
@ref{51d1,,Py_tp_is_gc}

@item 
@ref{51d2,,Py_tp_iter}

@item 
@ref{51d3,,Py_tp_iternext}

@item 
@ref{51d4,,Py_tp_members}

@item 
@ref{51d5,,Py_tp_methods}

@item 
@ref{51d6,,Py_tp_new}

@item 
@ref{51d7,,Py_tp_repr}

@item 
@ref{51d8,,Py_tp_richcompare}

@item 
@ref{51d9,,Py_tp_setattr}

@item 
@ref{51da,,Py_tp_setattro}

@item 
@ref{51db,,Py_tp_str}

@item 
@ref{3b1,,Py_tp_token}

@item 
@ref{51dc,,Py_tp_traverse}

@item 
@ref{51dd,,Py_tp_vectorcall}

@item 
@code{Py_uintptr_t}

@item 
@ref{51de,,allocfunc}

@item 
@ref{51df,,binaryfunc}

@item 
@ref{51e0,,descrgetfunc}

@item 
@ref{51e1,,descrsetfunc}

@item 
@ref{51e2,,destructor}

@item 
@ref{51e3,,getattrfunc}

@item 
@ref{51e4,,getattrofunc}

@item 
@ref{51e5,,getbufferproc}

@item 
@ref{51e6,,getiterfunc}

@item 
@ref{51e7,,getter}

@item 
@ref{51e8,,hashfunc}

@item 
@ref{51e9,,initproc}

@item 
@ref{51ea,,inquiry}

@item 
@ref{51eb,,iternextfunc}

@item 
@ref{51ec,,lenfunc}

@item 
@ref{51ed,,newfunc}

@item 
@ref{51ee,,objobjargproc}

@item 
@ref{51ef,,objobjproc}

@item 
@ref{51f0,,releasebufferproc}

@item 
@ref{51f1,,reprfunc}

@item 
@ref{51f2,,richcmpfunc}

@item 
@ref{51f3,,setattrfunc}

@item 
@ref{51f4,,setattrofunc}

@item 
@ref{51f5,,setter}

@item 
@ref{51f6,,ssizeargfunc}

@item 
@ref{51f7,,ssizeobjargproc}

@item 
@code{ssizessizeargfunc}

@item 
@code{ssizessizeobjargproc}

@item 
@code{symtable}

@item 
@ref{51f8,,ternaryfunc}

@item 
@ref{51f9,,traverseproc}

@item 
@ref{51fa,,unaryfunc}

@item 
@ref{778,,vectorcallfunc}

@item 
@ref{51fb,,visitproc}
@end itemize


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 매우 고수준 계층,참조 횟수<3>,C API Stability,Python/C API reference manual
@anchor{c-api/veryhigh doc}@anchor{51fc}@anchor{c-api/veryhigh the-very-high-level-layer}@anchor{51fd}@anchor{c-api/veryhigh translation-repo}@anchor{51fe}@anchor{c-api/veryhigh veryhigh}@anchor{51ff}
@section 매우 고수준 계층


이 장의 함수들은 파일이나 버퍼에 제공된 파이썬 소스 코드를 실행할 수 있도록 하지만, 인터프리터와 더 세밀한 방식으로 상호 작용하도록 하지는 않습니다.

Several of these functions accept a start symbol from the grammar as a
parameter.  The available start symbols are @ref{5200,,Py_eval_input},
@ref{5201,,Py_file_input}, @ref{5202,,Py_single_input}, and
@ref{5203,,Py_func_type_input}.  These are described following the functions
which accept them as parameters.

또한 이 함수 중 일부는 FILE* 매개 변수를 취합니다. 주의해서 다루어야 할 한 가지 문제는 다른 C 라이브러리의 @code{FILE} 구조체가 다르고, 호환되지 않을 수 있다는 것입니다. (적어도) 윈도우에서는, 동적으로 링크된 확장에서 실제로 다른 라이브러리를 사용할 수 있어서, FILE* 매개 변수가 파이썬 런타임이 사용하고 있는 것과 같은 라이브러리에서 만들어진 것이 확실할 때만 이러한 함수에 전달되도록 주의해야 합니다.

@geindex PyRun_AnyFile (C function)
@anchor{c-api/veryhigh c PyRun_AnyFile}@anchor{5204}
@deffn {C 함수} int PyRun_AnyFile (FILE *fp, const char *filename)

아래 @ref{5205,,PyRun_AnyFileExFlags()} 의 단순화된 인터페이스입니다. `closeit'은 @code{0}으로 `flags'는 @code{NULL}로 설정된 상태로 남겨둡니다.
@end deffn

@geindex PyRun_AnyFileFlags (C function)
@anchor{c-api/veryhigh c PyRun_AnyFileFlags}@anchor{5206}
@deffn {C 함수} int PyRun_AnyFileFlags (FILE *fp, const char *filename, PyCompilerFlags *flags)

아래 @ref{5205,,PyRun_AnyFileExFlags()} 의 단순화된 인터페이스입니다. 이것은 `closeit' 인자를 @code{0}으로 설정된 상태로 남겨둡니다.
@end deffn

@geindex PyRun_AnyFileEx (C function)
@anchor{c-api/veryhigh c PyRun_AnyFileEx}@anchor{5207}
@deffn {C 함수} int PyRun_AnyFileEx (FILE *fp, const char *filename, int closeit)

아래 @ref{5205,,PyRun_AnyFileExFlags()} 의 단순화된 인터페이스입니다. 이것은 `flags' 인자를 @code{NULL}로 설정된 상태로 남겨둡니다.
@end deffn

@geindex PyRun_AnyFileExFlags (C function)
@anchor{c-api/veryhigh c PyRun_AnyFileExFlags}@anchor{5205}
@deffn {C 함수} int PyRun_AnyFileExFlags (FILE *fp, const char *filename, int closeit, PyCompilerFlags *flags)

`fp'가 대화식 장치(콘솔이나 터미널 입력이나 유닉스 의사 터미널)와 연결된 파일을 가리키면, @ref{5208,,PyRun_InteractiveLoop()}의 값을 반환하고, 그렇지 않으면 @ref{4f4b,,PyRun_SimpleFile()}의 결과를 반환합니다. `filename'은 파일 시스템 인코딩(@ref{e52,,sys.getfilesystemencoding()})으로 디코딩됩니다. `filename'이 @code{NULL}이면, 이 함수는 파일명으로 @code{"???"}를 사용합니다. `closeit'이 참이면, @code{PyRun_SimpleFileExFlags()}이 반환하기 전에 파일이 닫힙니다.
@end deffn

@geindex PyRun_SimpleString (C function)
@anchor{c-api/veryhigh c PyRun_SimpleString}@anchor{4f4a}
@deffn {C 함수} int PyRun_SimpleString (const char *command)

아래 @ref{5209,,PyRun_SimpleStringFlags()} 의 단순화된 인터페이스입니다. @ref{c97,,PyCompilerFlags}* 인자를 @code{NULL}로 설정된 상태로 남겨둡니다.
@end deffn

@geindex PyRun_SimpleStringFlags (C function)
@anchor{c-api/veryhigh c PyRun_SimpleStringFlags}@anchor{5209}
@deffn {C 함수} int PyRun_SimpleStringFlags (const char *command, PyCompilerFlags *flags)

`flags' 인자에 따라 @ref{1,,__main__} 모듈에서 `command'에 있는 파이썬 소스 코드를 실행합니다. @code{__main__}이 존재하지 않으면 만듭니다. 성공하면 @code{0}을, 예외가 발생하면 @code{-1}을 반환합니다. 에러가 있으면, 예외 정보를 얻을 방법이 없습니다. `flags'의 의미는 아래를 참조하십시오.

처리되지 않은 @ref{f3b,,SystemExit}가 발생하면, 이 함수는 @ref{401,,PyConfig.inspect}가 0인 한 @code{-1}을 반환하지 않고 프로세스를 종료함에 유의하십시오.
@end deffn

@geindex PyRun_SimpleFile (C function)
@anchor{c-api/veryhigh c PyRun_SimpleFile}@anchor{4f4b}
@deffn {C 함수} int PyRun_SimpleFile (FILE *fp, const char *filename)

아래 @ref{1cc7,,PyRun_SimpleFileExFlags()} 의 단순화된 인터페이스입니다. `closeit'을 @code{0}으로, `flags'를 @code{NULL}로 설정된 상태로 남겨둡니다.
@end deffn

@geindex PyRun_SimpleFileEx (C function)
@anchor{c-api/veryhigh c PyRun_SimpleFileEx}@anchor{520a}
@deffn {C 함수} int PyRun_SimpleFileEx (FILE *fp, const char *filename, int closeit)

아래 @ref{1cc7,,PyRun_SimpleFileExFlags()} 의 단순화된 인터페이스입니다. `flags'를 @code{NULL}로 설정된 상태로 남겨둡니다.
@end deffn

@geindex PyRun_SimpleFileExFlags (C function)
@anchor{c-api/veryhigh c PyRun_SimpleFileExFlags}@anchor{1cc7}
@deffn {C 함수} int PyRun_SimpleFileExFlags (FILE *fp, const char *filename, int closeit, PyCompilerFlags *flags)

@ref{5209,,PyRun_SimpleStringFlags()} 와 비슷하지만, 메모리에 있는 문자열 대신 `fp'에서 파이썬 소스 코드를 읽습니다. `filename'은 파일의 이름이어야 하며, @ref{75c,,파일시스템 인코딩과 에러 처리기}로 디코딩됩니다. `closeit'이 참이면 @code{PyRun_SimpleFileExFlags()} 가 반환하기 전에 파일이 닫힙니다.

@cartouche
@quotation 참고 
윈도우에서, `fp'는 바이너리 모드로 열어야 합니다 (예를 들어 @code{fopen(filename, "rb")}). 그렇지 않으면, 파이썬은 LF 줄 종료가 있는 스크립트 파일을 올바르게 처리하지 못할 수 있습니다.
@end quotation
@end cartouche
@end deffn

@geindex PyRun_InteractiveOneObject (C function)
@anchor{c-api/veryhigh c PyRun_InteractiveOneObject}@anchor{520b}
@deffn {C 함수} int PyRun_InteractiveOneObject (FILE *fp, PyObject *filename, PyCompilerFlags *flags)

Read and execute a single statement from a file associated with an
interactive device according to the `flags' argument.  The user will be
prompted using @code{sys.ps1} and @code{sys.ps2}. `filename' must be a Python
@ref{169,,str} object.

입력이 성공적으로 실행될 때 @code{0}을, 예외가 있으면 @code{-1}을, 또는 구문 분석 에러가 있으면 파이썬의 일부로 배포된 @code{errcode.h} 인클루드 파일에 있는 에러 코드를 반환합니다. (@code{errcode.h}는 @code{Python.h}에서 인클루드하지 않기 때문에 필요하면 특별히 인클루드해야 함에 유의하십시오.)
@end deffn

@geindex PyRun_InteractiveOne (C function)
@anchor{c-api/veryhigh c PyRun_InteractiveOne}@anchor{520c}
@deffn {C 함수} int PyRun_InteractiveOne (FILE *fp, const char *filename)

아래 @ref{520d,,PyRun_InteractiveOneFlags()} 의 단순화된 인터페이스입니다. `flags'를 @code{NULL}로 설정된 상태로 남겨둡니다.
@end deffn

@geindex PyRun_InteractiveOneFlags (C function)
@anchor{c-api/veryhigh c PyRun_InteractiveOneFlags}@anchor{520d}
@deffn {C 함수} int PyRun_InteractiveOneFlags (FILE *fp, const char *filename, PyCompilerFlags *flags)

Similar to @ref{520b,,PyRun_InteractiveOneObject()}, but `filename' is a
const char*, which is decoded from the
@ref{75c,,filesystem encoding and error handler}.
@end deffn

@geindex PyRun_InteractiveLoop (C function)
@anchor{c-api/veryhigh c PyRun_InteractiveLoop}@anchor{5208}
@deffn {C 함수} int PyRun_InteractiveLoop (FILE *fp, const char *filename)

아래 @ref{520e,,PyRun_InteractiveLoopFlags()} 의 단순화된 인터페이스입니다. `flags'를 @code{NULL}로 설정된 상태로 남겨둡니다.
@end deffn

@geindex PyRun_InteractiveLoopFlags (C function)
@anchor{c-api/veryhigh c PyRun_InteractiveLoopFlags}@anchor{520e}
@deffn {C 함수} int PyRun_InteractiveLoopFlags (FILE *fp, const char *filename, PyCompilerFlags *flags)

EOF에 도달할 때까지 대화식 장치와 연관된 파일에서 문장을 읽고 실행합니다. @code{sys.ps1}과 @code{sys.ps2}를 사용하여 사용자에게 프롬프트 합니다. `filename'은 @ref{75c,,파일시스템 인코딩과 에러 처리기}로 디코딩됩니다. EOF에서 @code{0}을 반환하거나, 실패하면 음수를 반환합니다.
@end deffn

@geindex PyOS_InputHook (C var)
@anchor{c-api/veryhigh c PyOS_InputHook}@anchor{7a3}
@deffn {C 변수} int (*PyOS_InputHook)(void)
` Part of the @ref{774,,안정 ABI}.'
Can be set to point to a function with the prototype
@code{int func(void)}.  The function will be called when Python’s
interpreter prompt is about to become idle and wait for user input
from the terminal.  The return value is ignored.  Overriding this
hook can be used to integrate the interpreter’s prompt with other
event loops, as done in @code{Modules/_tkinter.c} in the
Python source code.


버전 3.12에서 변경: This function is only called from the
@ref{163,,main interpreter}.

@end deffn

@geindex PyOS_ReadlineFunctionPointer (C var)
@anchor{c-api/veryhigh c PyOS_ReadlineFunctionPointer}@anchor{7a4}
@deffn {C 변수} char *(*PyOS_ReadlineFunctionPointer)(FILE*, FILE*, const char*)

프로토타입 @code{char *func(FILE *stdin, FILE *stdout, char *prompt)}인 함수를 가리키도록 설정하여, 인터프리터의 프롬프트에서 단일 입력 줄을 읽는 데 사용되는 기본 함수를 재정의할 수 있습니다. 이 함수는 @code{NULL}이 아니면 문자열 `prompt'를 출력한 다음 제공된 표준 입력 파일에서 입력 줄을 읽고 결과 문자열을 반환할 것이라고 기대됩니다. 예를 들어, @ref{bf,,readline} 모듈은 이 훅을 설정하여 줄 편집과 탭 완성 기능을 제공합니다.

결과는 @ref{62f,,PyMem_RawMalloc()}이나 @ref{631,,PyMem_RawRealloc()}으로 할당된 문자열 이거나, 에러가 발생했으면 @code{NULL}이어야 합니다.


버전 3.4에서 변경: 결과는 @ref{e5e,,PyMem_Malloc()}이나 @ref{1231,,PyMem_Realloc()}으로 할당하는 대신, @ref{62f,,PyMem_RawMalloc()}이나 @ref{631,,PyMem_RawRealloc()}으로 할당해야 합니다.



버전 3.12에서 변경: This function is only called from the
@ref{163,,main interpreter}.

@end deffn

@geindex PyRun_String (C function)
@anchor{c-api/veryhigh c PyRun_String}@anchor{1dbd}
@deffn {C 함수} @ref{5dc,,PyObject} *PyRun_String (const char *str, int start, PyObject *globals, PyObject *locals)
`반환값: 새 참조.'
아래 @ref{520f,,PyRun_StringFlags()}의 단순화된 인터페이스입니다. 이것은 `flags'를 @code{NULL}로 설정된 상태로 남겨둡니다.
@end deffn

@geindex PyRun_StringFlags (C function)
@anchor{c-api/veryhigh c PyRun_StringFlags}@anchor{520f}
@deffn {C 함수} @ref{5dc,,PyObject} *PyRun_StringFlags (const char *str, int start, PyObject *globals, PyObject *locals, PyCompilerFlags *flags)
`반환값: 새 참조.'
Execute Python source code from `str' in the context specified by the
objects `globals' and `locals' with the compiler flags specified by
`flags'.  `globals' must be a dictionary; `locals' can be any object
that implements the mapping protocol.  The parameter `start' specifies
the start symbol and must be one of the @ref{5210,,available start symbols}.

코드를 실행한 결과를 파이썬 객체로 반환하거나, 예외가 발생하면 @code{NULL}을 반환합니다.
@end deffn

@geindex PyRun_File (C function)
@anchor{c-api/veryhigh c PyRun_File}@anchor{5211}
@deffn {C 함수} @ref{5dc,,PyObject} *PyRun_File (FILE *fp, const char *filename, int start, PyObject *globals, PyObject *locals)
`반환값: 새 참조.'
아래 @ref{5212,,PyRun_FileExFlags()}의 단순화된 인터페이스입니다. `closeit'을 @code{0}으로, `flags'를 @code{NULL}로 설정된 상태로 남겨둡니다.
@end deffn

@geindex PyRun_FileEx (C function)
@anchor{c-api/veryhigh c PyRun_FileEx}@anchor{5213}
@deffn {C 함수} @ref{5dc,,PyObject} *PyRun_FileEx (FILE *fp, const char *filename, int start, PyObject *globals, PyObject *locals, int closeit)
`반환값: 새 참조.'
아래 @ref{5212,,PyRun_FileExFlags()}의 단순화된 인터페이스입니다. `flags'를 @code{NULL}로 설정된 상태로 남겨둡니다.
@end deffn

@geindex PyRun_FileFlags (C function)
@anchor{c-api/veryhigh c PyRun_FileFlags}@anchor{5214}
@deffn {C 함수} @ref{5dc,,PyObject} *PyRun_FileFlags (FILE *fp, const char *filename, int start, PyObject *globals, PyObject *locals, PyCompilerFlags *flags)
`반환값: 새 참조.'
아래 @ref{5212,,PyRun_FileExFlags()}의 단순화된 인터페이스입니다. `closeit'을 @code{0}으로 설정된 상태로 남겨둡니다.
@end deffn

@geindex PyRun_FileExFlags (C function)
@anchor{c-api/veryhigh c PyRun_FileExFlags}@anchor{5212}
@deffn {C 함수} @ref{5dc,,PyObject} *PyRun_FileExFlags (FILE *fp, const char *filename, int start, PyObject *globals, PyObject *locals, int closeit, PyCompilerFlags *flags)
`반환값: 새 참조.'
@ref{520f,,PyRun_StringFlags()}와 유사하지만, 파이썬 소스 코드는 메모리에 있는 문자열 대신 `fp'에서 읽습니다. `filename'은 파일명이어야 하며 @ref{75c,,파일시스템 인코딩과 에러 처리기}로 디코딩됩니다. `closeit'이 참이면 @ref{5212,,PyRun_FileExFlags()}가 반환되기 전에 파일이 닫힙니다.
@end deffn

@geindex Py_CompileString (C function)
@anchor{c-api/veryhigh c Py_CompileString}@anchor{a85}
@deffn {C 함수} @ref{5dc,,PyObject} *Py_CompileString (const char *str, const char *filename, int start)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
아래 @ref{5215,,Py_CompileStringFlags()} 의 단순화된 인터페이스입니다. `flags'를 @code{NULL}로 설정된 상태로 유지합니다.
@end deffn

@geindex Py_CompileStringFlags (C function)
@anchor{c-api/veryhigh c Py_CompileStringFlags}@anchor{5215}
@deffn {C 함수} @ref{5dc,,PyObject} *Py_CompileStringFlags (const char *str, const char *filename, int start, PyCompilerFlags *flags)
`반환값: 새 참조.'
아래 @ref{5216,,Py_CompileStringExFlags()} 의 단순화된 인터페이스입니다. `optimize'를 @code{-1}로 설정된 상태로 유지합니다.
@end deffn

@geindex Py_CompileStringObject (C function)
@anchor{c-api/veryhigh c Py_CompileStringObject}@anchor{5217}
@deffn {C 함수} @ref{5dc,,PyObject} *Py_CompileStringObject (const char *str, PyObject *filename, int start, PyCompilerFlags *flags, int optimize)
`반환값: 새 참조.'
Parse and compile the Python source code in `str', returning the resulting code
object.  The start symbol is given by `start'; this can be used to constrain the
code which can be compiled and should be @ref{5210,,available start symbols}.  The filename specified by
`filename' is used to construct the code object and may appear in tracebacks or
@ref{18e,,SyntaxError} exception messages.  This returns @code{NULL} if the code
cannot be parsed or compiled.

정수 `optimize'는 컴파일러의 최적화 수준을 지정합니다. @code{-1} 값은 @ref{18c,,-O} 옵션으로 주어진 것처럼 인터프리터의 최적화 수준을 선택합니다. 명시적 수준은 @code{0} (최적화 없음; @code{__debug__}가 참), @code{1} (어서션이 제거되고 @code{__debug__}가 거짓) 또는 @code{2} (독스트링도 제거됩니다)입니다.


Added in version 3.4.

@end deffn

@geindex Py_CompileStringExFlags (C function)
@anchor{c-api/veryhigh c Py_CompileStringExFlags}@anchor{5216}
@deffn {C 함수} @ref{5dc,,PyObject} *Py_CompileStringExFlags (const char *str, const char *filename, int start, PyCompilerFlags *flags, int optimize)
`반환값: 새 참조.'
@ref{5217,,Py_CompileStringObject()}와 유사하지만, `filename'은 @ref{75c,,파일시스템 인코딩과 에러 처리기}로 디코딩된 바이트 문자열입니다.


Added in version 3.2.

@end deffn

@geindex PyEval_EvalCode (C function)
@anchor{c-api/veryhigh c PyEval_EvalCode}@anchor{a86}
@deffn {C 함수} @ref{5dc,,PyObject} *PyEval_EvalCode (PyObject *co, PyObject *globals, PyObject *locals)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
이것은 코드 객체와 전역 변수 및 지역 변수만 있는, @ref{1ad8,,PyEval_EvalCodeEx()}의 단순화된 인터페이스입니다. 다른 인자는 @code{NULL}로 설정됩니다.
@end deffn

@geindex PyEval_EvalCodeEx (C function)
@anchor{c-api/veryhigh c PyEval_EvalCodeEx}@anchor{1ad8}
@deffn {C 함수} @ref{5dc,,PyObject} *PyEval_EvalCodeEx (PyObject *co, PyObject *globals, PyObject *locals, PyObject *const *args, int argcount, PyObject *const *kws, int kwcount, PyObject *const *defs, int defcount, PyObject *kwdefs, PyObject *closure)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
주어진 평가를 위한 특정 환경에서, 미리 컴파일된 코드 객체를 평가합니다. 이 환경은 전역 변수의 딕셔너리, 지역 변수의 매핑 객체, 인자의 배열, 키워드와 기본값, @ref{5a4,,키워드 전용} 인자의 기본값 딕셔너리 및 셀의 클로저 튜플로 구성됩니다.
@end deffn

@geindex PyEval_EvalFrame (C function)
@anchor{c-api/veryhigh c PyEval_EvalFrame}@anchor{501a}
@deffn {C 함수} @ref{5dc,,PyObject} *PyEval_EvalFrame (PyFrameObject *f)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
실행 프레임을 평가합니다. 이전 버전과의 호환성을 위한, @ref{122d,,PyEval_EvalFrameEx()}의 단순화된 인터페이스입니다.
@end deffn

@geindex PyEval_EvalFrameEx (C function)
@anchor{c-api/veryhigh c PyEval_EvalFrameEx}@anchor{122d}
@deffn {C 함수} @ref{5dc,,PyObject} *PyEval_EvalFrameEx (PyFrameObject *f, int throwflag)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
이것은 파이썬 인터프리트의 메인, 꾸미지 않은 함수입니다. 실행 프레임 `f'와 연관된 코드 객체가 실행됩니다. 필요에 따라 바이트 코드를 해석하고 호출을 실행합니다. 추가 `throwflag' 매개 변수는 대체로 무시할 수 있습니다 - 참이면, 예외가 즉시 발생하도록 합니다; 제너레이터 객체의 @ref{71b,,throw()} 메서드에 사용됩니다.


버전 3.4에서 변경: 이 함수는 이제 활성 예외를 조용히 버리지 않았는지 확인하도록 도우려고 디버그 어서션을 포함합니다.

@end deffn

@geindex PyEval_MergeCompilerFlags (C function)
@anchor{c-api/veryhigh c PyEval_MergeCompilerFlags}@anchor{5218}
@deffn {C 함수} int PyEval_MergeCompilerFlags (PyCompilerFlags *cf)

이 함수는 현재 평가 프레임의 플래그를 변경하고, 성공하면 참을, 실패하면 거짓을 반환합니다.
@end deffn

@geindex PyCompilerFlags (C struct)
@anchor{c-api/veryhigh c PyCompilerFlags}@anchor{c97}
@deffn {C 구조체} struct PyCompilerFlags

이것은 컴파일러 플래그를 담는 데 사용되는 구조체입니다. 코드가 컴파일되기만 하는 경우 @code{int flags}로 전달되고, 코드가 실행되는 경우 @code{PyCompilerFlags *flags}로 전달됩니다. 이 경우, @code{from __future__ import}는 `flags'를 수정할 수 있습니다.

@code{PyCompilerFlags *flags}가 @code{NULL}일 때마다, @ref{5219,,cf_flags}는 @code{0}과 같다고 취급되며, @code{from __future__ import}로 인한 수정은 버립니다.

@geindex PyCompilerFlags.cf_flags (C member)
@anchor{c-api/veryhigh c PyCompilerFlags cf_flags}@anchor{5219}
@deffn {C 멤버 변수} int cf_flags

컴파일러 플래그.
@end deffn

@geindex PyCompilerFlags.cf_feature_version (C member)
@anchor{c-api/veryhigh c PyCompilerFlags cf_feature_version}@anchor{521a}
@deffn {C 멤버 변수} int cf_feature_version

`cf_feature_version'은 부 파이썬 버전입니다. @code{PY_MINOR_VERSION}으로 초기화되어야 합니다.

이 필드는 기본적으로 무시되며, @code{PyCF_ONLY_AST} 플래그가 @ref{5219,,cf_flags}에 설정된 경우에만 사용됩니다.
@end deffn


버전 3.8에서 변경: `cf_feature_version' 필드를 추가했습니다.


The available compiler flags are accessible as macros:

@geindex PyCF_ALLOW_TOP_LEVEL_AWAIT (C macro)
@geindex PyCF_ONLY_AST (C macro)
@geindex PyCF_OPTIMIZED_AST (C macro)
@geindex PyCF_TYPE_COMMENTS (C macro)
@anchor{c-api/veryhigh c PyCF_ALLOW_TOP_LEVEL_AWAIT}@anchor{521b}
@deffn {C 매크로} PyCF_ALLOW_TOP_LEVEL_AWAIT
@anchor{c-api/veryhigh c PyCF_ONLY_AST}@anchor{521c}
@deffnx {C 매크로} PyCF_ONLY_AST
@anchor{c-api/veryhigh c PyCF_OPTIMIZED_AST}@anchor{521d}
@deffnx {C 매크로} PyCF_OPTIMIZED_AST
@anchor{c-api/veryhigh c PyCF_TYPE_COMMENTS}@anchor{521e}
@deffnx {C 매크로} PyCF_TYPE_COMMENTS

See @ref{25c7,,compiler flags} in documentation of the
@code{ast} Python module, which exports these constants under
the same names.
@end deffn

The “@code{PyCF}” flags above can be combined with “@code{CO_FUTURE}” flags such
as @ref{521f,,CO_FUTURE_ANNOTATIONS} to enable features normally
selectable using @ref{45d,,future statements}.
See @ref{5220,,Code Object Flags} for a complete list.
@end deffn

@menu
* Available start symbols:: 
* Stack Effects:: 

@end menu

@node Available start symbols,Stack Effects,,매우 고수준 계층
@anchor{c-api/veryhigh available-start-symbols}@anchor{5221}@anchor{c-api/veryhigh start-symbols}@anchor{5210}
@subsection Available start symbols


@geindex Py_eval_input (C var)
@anchor{c-api/veryhigh c Py_eval_input}@anchor{5200}
@deffn {C 변수} int Py_eval_input

@geindex Py_CompileString (C 함수)

격리된 표현식을 위한 파이썬 문법의 시작 기호; @ref{a85,,Py_CompileString()}과 함께 사용합니다.
@end deffn

@geindex Py_file_input (C var)
@anchor{c-api/veryhigh c Py_file_input}@anchor{5201}
@deffn {C 변수} int Py_file_input

@geindex Py_CompileString (C 함수)

파일이나 다른 소스에서 읽은 문장의 시퀀스를 위한 파이썬 문법의 시작 기호; @ref{a85,,Py_CompileString()}과 함께 사용합니다. 임의로 긴 파이썬 소스 코드를 컴파일할 때 사용하는 기호입니다.
@end deffn

@geindex Py_single_input (C var)
@anchor{c-api/veryhigh c Py_single_input}@anchor{5202}
@deffn {C 변수} int Py_single_input

@geindex Py_CompileString (C 함수)

단일 문장을 위한 파이썬 문법의 시작 기호; @ref{a85,,Py_CompileString()}과 함께 사용합니다. 대화식 인터프리터 루프에 사용되는 기호입니다.
@end deffn

@geindex Py_func_type_input (C var)
@anchor{c-api/veryhigh c Py_func_type_input}@anchor{5203}
@deffn {C 변수} int Py_func_type_input

@geindex Py_CompileString (C 함수)

The start symbol from the Python grammar for a function type; for use with
@ref{a85,,Py_CompileString()}. This is used to parse “signature type comments”
from 
@geindex Python 향상 제안; PEP 484
PEP 484@footnote{https://peps.python.org/pep-0484/}.

This requires the @ref{521c,,PyCF_ONLY_AST} flag to be set.


@subsubheading 더 보기



@itemize *

@item 
@ref{4bbd,,ast.FunctionType}

@item 
@geindex Python 향상 제안; PEP 484
PEP 484@footnote{https://peps.python.org/pep-0484/}
@end itemize



Added in version 3.8.

@end deffn

@node Stack Effects,,Available start symbols,매우 고수준 계층
@anchor{c-api/veryhigh stack-effects}@anchor{5222}
@subsection Stack Effects



@subsubheading 더 보기


@ref{1130,,dis.stack_effect()}


@geindex PY_INVALID_STACK_EFFECT (C macro)
@anchor{c-api/veryhigh c PY_INVALID_STACK_EFFECT}@anchor{5223}
@deffn {C 매크로} PY_INVALID_STACK_EFFECT

Sentinel value representing an invalid stack effect.

This is currently equivalent to @code{INT_MAX}.


Added in version 3.8.

@end deffn

@geindex PyCompile_OpcodeStackEffect (C function)
@anchor{c-api/veryhigh c PyCompile_OpcodeStackEffect}@anchor{5224}
@deffn {C 함수} int PyCompile_OpcodeStackEffect (int opcode, int oparg)

Compute the stack effect of `opcode' with argument `oparg'.

On success, this function returns the stack effect; on failure, this
returns @ref{5223,,PY_INVALID_STACK_EFFECT}.


Added in version 3.4.

@end deffn

@geindex PyCompile_OpcodeStackEffectWithJump (C function)
@anchor{c-api/veryhigh c PyCompile_OpcodeStackEffectWithJump}@anchor{1e2e}
@deffn {C 함수} int PyCompile_OpcodeStackEffectWithJump (int opcode, int oparg, int jump)

Similar to @ref{5224,,PyCompile_OpcodeStackEffect()}, but don’t include the
stack effect of jumping if `jump' is zero.

If `jump' is @code{0}, this will not include the stack effect of jumping, but
if `jump' is @code{1} or @code{-1}, this will include it.

On success, this function returns the stack effect; on failure, this
returns @ref{5223,,PY_INVALID_STACK_EFFECT}.


Added in version 3.8.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 참조 횟수<3>,예외 처리,매우 고수준 계층,Python/C API reference manual
@anchor{c-api/refcounting doc}@anchor{5225}@anchor{c-api/refcounting countingrefs}@anchor{5226}@anchor{c-api/refcounting reference-counting}@anchor{5227}@anchor{c-api/refcounting translation-repo}@anchor{5228}
@section 참조 횟수


이 섹션의 함수와 매크로는 파이썬 객체의 참조 횟수를 관리하는 데 사용됩니다.

@geindex Py_REFCNT (C function)
@anchor{c-api/refcounting c Py_REFCNT}@anchor{2cf}
@deffn {C 함수} @ref{c54,,Py_ssize_t} Py_REFCNT (PyObject *o)
` Part of the @ref{774,,안정 ABI} 버전 3.14 이후로.'
Get the reference count of the Python object `o'.

Note that the returned value may not actually reflect how many
references to the object are actually held.  For example, some
objects are @ref{290,,immortal} and have a very high refcount that does not
reflect the actual number of references.  Consequently, do not rely
on the returned value to be accurate, other than a value of 0 or 1.

Use the @ref{aa8,,Py_SET_REFCNT()} function to set an object reference count.

@cartouche
@quotation 참고 
On @ref{1767,,free-threaded builds} of Python, returning 1
isn’t sufficient to determine if it’s safe to treat `o' as having no
access by other threads. Use @ref{3c6,,PyUnstable_Object_IsUniquelyReferenced()}
for that instead.

See also the function @ref{3c7,,PyUnstable_Object_IsUniqueReferencedTemporary()}.
@end quotation
@end cartouche


버전 3.10에서 변경: @ref{2cf,,Py_REFCNT()} is changed to the inline static function.



버전 3.11에서 변경: The parameter type is no longer const @ref{5dc,,PyObject}*.

@end deffn

@geindex Py_SET_REFCNT (C function)
@anchor{c-api/refcounting c Py_SET_REFCNT}@anchor{aa8}
@deffn {C 함수} void Py_SET_REFCNT (PyObject *o, Py_ssize_t refcnt)

Set the object `o' reference counter to `refcnt'.

On @ref{216b,,Python build with Free Threading}, if
`refcnt' is larger than @code{UINT32_MAX}, the object is made @ref{290,,immortal}.

This function has no effect on @ref{290,,immortal} objects.


Added in version 3.9.



버전 3.12에서 변경: Immortal objects are not modified.

@end deffn

@geindex Py_INCREF (C function)
@anchor{c-api/refcounting c Py_INCREF}@anchor{78e}
@deffn {C 함수} void Py_INCREF (PyObject *o)

Indicate taking a new @ref{5df,,strong reference} to object `o',
indicating it is in use and should not be destroyed.

This function has no effect on @ref{290,,immortal} objects.

This function is usually used to convert a @ref{3d7,,borrowed reference} to a
@ref{5df,,strong reference} in-place. The @ref{a9a,,Py_NewRef()} function can be
used to create a new strong reference.

When done using the object, release is by calling @ref{78f,,Py_DECREF()}.

객체는 @code{NULL} 일 수 없습니다; @code{NULL}이 아닌지 확실하지 않으면, @ref{c59,,Py_XINCREF()}를 사용하십시오.

Do not expect this function to actually modify `o' in any way.
For at least 
@geindex Python 향상 제안; PEP 0683
some objects@footnote{https://peps.python.org/pep-0683/},
this function has no effect.


버전 3.12에서 변경: Immortal objects are not modified.

@end deffn

@geindex Py_XINCREF (C function)
@anchor{c-api/refcounting c Py_XINCREF}@anchor{c59}
@deffn {C 함수} void Py_XINCREF (PyObject *o)

Similar to @ref{78e,,Py_INCREF()}, but the object `o' can be @code{NULL},
in which case this has no effect.

See also @ref{a9b,,Py_XNewRef()}.
@end deffn

@geindex Py_NewRef (C function)
@anchor{c-api/refcounting c Py_NewRef}@anchor{a9a}
@deffn {C 함수} @ref{5dc,,PyObject} *Py_NewRef (PyObject *o)
` Part of the @ref{774,,안정 ABI} 버전 3.10 이후로.'
Create a new @ref{5df,,strong reference} to an object:
call @ref{78e,,Py_INCREF()} on `o' and return the object `o'.

When the @ref{5df,,strong reference} is no longer needed, @ref{78f,,Py_DECREF()}
should be called on it to release the reference.

The object `o' must not be @code{NULL}; use @ref{a9b,,Py_XNewRef()} if `o' can be
@code{NULL}.

예를 들어:

@example
Py_INCREF(obj);
self->attr = obj;
@end example

can be written as:

@example
self->attr = Py_NewRef(obj);
@end example

See also @ref{78e,,Py_INCREF()}.


Added in version 3.10.

@end deffn

@geindex Py_XNewRef (C function)
@anchor{c-api/refcounting c Py_XNewRef}@anchor{a9b}
@deffn {C 함수} @ref{5dc,,PyObject} *Py_XNewRef (PyObject *o)
` Part of the @ref{774,,안정 ABI} 버전 3.10 이후로.'
Similar to @ref{a9a,,Py_NewRef()}, but the object `o' can be NULL.

If the object `o' is @code{NULL}, the function just returns @code{NULL}.


Added in version 3.10.

@end deffn

@geindex Py_DECREF (C function)
@anchor{c-api/refcounting c Py_DECREF}@anchor{78f}
@deffn {C 함수} void Py_DECREF (PyObject *o)

Release a @ref{5df,,strong reference} to object `o', indicating the
reference is no longer used.

This function has no effect on @ref{290,,immortal} objects.

마지막 @ref{5df,,강한 참조}가 해제되면 (즉 객체의 참조 횟수가 0이 되면), 객체 형의 할당 해제 함수 (반드시 @code{NULL}이 아니어야 합니다)가 호출됩니다.

This function is usually used to delete a @ref{5df,,strong reference} before
exiting its scope.

객체는 @code{NULL} 일 수 없습니다; @code{NULL}이 아닌지 확실하지 않으면, @ref{991,,Py_XDECREF()}를 사용하십시오.

Do not expect this function to actually modify `o' in any way.
For at least 
@geindex Python 향상 제안; PEP 683
some objects@footnote{https://peps.python.org/pep-0683/},
this function has no effect.

@cartouche
@quotation 경고 
할당 해제 함수는 임의의 파이썬 코드가 호출되도록 할 수 있습니다 (예를 들어, @ref{11fc,,__del__()} 메서드가 있는 클래스 인스턴스가 할당 해제될 때). 이러한 코드에서의 예외는 전파되지 않지만, 실행된 코드는 모든 파이썬 전역 변수에 자유롭게 액세스할 수 있습니다. 이것은 @ref{78f,,Py_DECREF()}가 호출되기 전에 전역 변수에서 도달할 수 있는 모든 객체가 일관성 있는 상태에 있어야 함을 뜻합니다. 예를 들어, 리스트에서 객체를 삭제하는 코드는 삭제된 객체에 대한 참조를 임시 변수에 복사하고, 리스트 데이터 구조를 갱신한 다음, 임시 변수에 대해 @code{Py_DECREF()}를 호출해야 합니다.
@end quotation
@end cartouche


버전 3.12에서 변경: Immortal objects are not modified.

@end deffn

@geindex Py_XDECREF (C function)
@anchor{c-api/refcounting c Py_XDECREF}@anchor{991}
@deffn {C 함수} void Py_XDECREF (PyObject *o)

Similar to @ref{78f,,Py_DECREF()}, but the object `o' can be @code{NULL},
in which case this has no effect.
The same warning from @code{Py_DECREF()} applies here as well.
@end deffn

@geindex Py_CLEAR (C function)
@anchor{c-api/refcounting c Py_CLEAR}@anchor{797}
@deffn {C 함수} void Py_CLEAR (PyObject *o)

객체 `o'에 대한 @ref{5df,,강한 참조}를 해제합니다. 객체는 @code{NULL} 일 수 있습니다, 이때 매크로는 효과가 없습니다; 그렇지 않으면 인자도 @code{NULL}로 설정된다는 점을 제외하고는, 효과가 @ref{78f,,Py_DECREF()}와 같습니다. 매크로가 임시 변수를 신중하게 사용하고, 참조를 해제하기 전에 인자를 @code{NULL}로 설정하기 때문에, @code{Py_DECREF()}에 대한 경고는 전달된 객체와 관련하여 적용되지 않습니다.

가비지 수집 중에 탐색 될 수 있는 객체에 대한 참조를 해제할 때마다 이 매크로를 사용하는 것이 좋습니다.


버전 3.12에서 변경: The macro argument is now only evaluated once. If the argument has side
effects, these are no longer duplicated.

@end deffn

@geindex Py_IncRef (C function)
@anchor{c-api/refcounting c Py_IncRef}@anchor{5171}
@deffn {C 함수} void Py_IncRef (PyObject *o)
` Part of the @ref{774,,안정 ABI}.'
Indicate taking a new @ref{5df,,strong reference} to object `o'.
A function version of @ref{c59,,Py_XINCREF()}.
It can be used for runtime dynamic embedding of Python.
@end deffn

@geindex Py_DecRef (C function)
@anchor{c-api/refcounting c Py_DecRef}@anchor{5169}
@deffn {C 함수} void Py_DecRef (PyObject *o)
` Part of the @ref{774,,안정 ABI}.'
Release a @ref{5df,,strong reference} to object `o'.
A function version of @ref{991,,Py_XDECREF()}.
It can be used for runtime dynamic embedding of Python.
@end deffn

@geindex Py_SETREF (C macro)
@anchor{c-api/refcounting c Py_SETREF}@anchor{798}
@deffn {C 매크로} Py_SETREF (dst, src)

Macro safely releasing a @ref{5df,,strong reference} to object `dst'
and setting `dst' to `src'.

As in case of @ref{797,,Py_CLEAR()}, “the obvious” code can be deadly:

@example
Py_DECREF(dst);
dst = src;
@end example

The safe way is:

@example
Py_SETREF(dst, src);
@end example

That arranges to set `dst' to `src' `before' releasing the reference
to the old value of `dst', so that any code triggered as a side-effect
of `dst' getting torn down no longer believes `dst' points
to a valid object.


Added in version 3.6.



버전 3.12에서 변경: The macro arguments are now only evaluated once. If an argument has side
effects, these are no longer duplicated.

@end deffn

@geindex Py_XSETREF (C macro)
@anchor{c-api/refcounting c Py_XSETREF}@anchor{799}
@deffn {C 매크로} Py_XSETREF (dst, src)

Variant of @ref{798,,Py_SETREF} macro that uses @ref{991,,Py_XDECREF()} instead
of @ref{78f,,Py_DECREF()}.


Added in version 3.6.



버전 3.12에서 변경: The macro arguments are now only evaluated once. If an argument has side
effects, these are no longer duplicated.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 예외 처리,Defining extension modules,참조 횟수<3>,Python/C API reference manual
@anchor{c-api/exceptions doc}@anchor{5229}@anchor{c-api/exceptions exception-handling}@anchor{522a}@anchor{c-api/exceptions exceptionhandling}@anchor{49c6}@anchor{c-api/exceptions translation-repo}@anchor{522b}
@section 예외 처리


이 장에서 설명하는 함수를 사용하면 파이썬 예외를 처리하고 발생시킬 수 있습니다. 파이썬 예외 처리의 기본 사항을 이해하는 것이 중요합니다. POSIX @code{errno} 변수와 비슷하게 작동합니다: 발생한 마지막 에러에 대한 전역 표시기(스레드 당)가 있습니다. 대부분 C API 함수는 성공 시 이를 지우지 않지만, 실패 시 에러의 원인을 나타내도록 설정합니다. 대부분 C API 함수는 에러 표시기도 반환합니다, 일반적으로 포인터를 반환해야 하면 @code{NULL}, 정수를 반환하면 @code{-1}을 반환합니다 (예외: @code{PyArg_*} 함수는 성공하면 @code{1}을, 실패하면 @code{0}을 반환합니다).

구체적으로, 에러 표시기는 세 가지 객체 포인터로 구성됩니다: 예외 형, 예외 값 및 트레이스백 객체. 이러한 포인터들은 설정되지 않으면 @code{NULL}이 될 수 있습니다 (하지만 일부 조합은 금지되어 있습니다, 예를 들어 예외 형이 @code{NULL}이면 @code{NULL}이 아닌 트레이스백을 가질 수 없습니다).

호출한 일부 함수가 실패하여 함수가 실패해야 할 때, 일반적으로 에러 표시기를 설정하지 않습니다; 호출된 함수가 이미 설정했습니다. 에러를 처리하고 예외를 지우거나 보유한 모든 리소스(가령 객체 참조나 메모리 할당)를 정리한 후 반환해야 할 책임이 있습니다; 에러를 처리할 준비가 되지 않았을 때 정상적으로 계속되지 `않아야' 합니다. 에러로 인해 반환하면, 호출자에게 에러가 설정되었음을 알리는 것이 중요합니다. 에러를 처리하지 않거나 신중하게 전파하지 않으면, 파이썬/C API에 대한 추가 호출이 의도한 대로 작동하지 않을 수 있으며 알 수 없는 방식으로 실패할 수 있습니다.

@cartouche
@quotation 참고 
에러 표시기는 @ref{899,,sys.exc_info()}의 결과가 `아닙니다'. 전자는 아직 포착되지 않은 (따라서 여전히 전파 중인) 예외에 해당하는 반면, 후자는 포착된 후 (따라서 전파가 중단된) 예외를 반환합니다.
@end quotation
@end cartouche

@menu
* 인쇄와 지우기:: 
* 예외 발생시키기:: 
* 경고 발행하기:: 
* 에러 표시기 조회하기:: 
* 시그널 처리하기: 시그널 처리하기<2>. 
* 예외 클래스: 예외 클래스<2>. 
* 예외 객체:: 
* 유니코드 예외 객체:: 
* 재귀 제어:: 
* Exception and warning types:: 
* Tracebacks:: 

@end menu

@node 인쇄와 지우기,예외 발생시키기,,예외 처리
@anchor{c-api/exceptions printing-and-clearing}@anchor{522c}
@subsection 인쇄와 지우기


@geindex PyErr_Clear (C function)
@anchor{c-api/exceptions c PyErr_Clear}@anchor{1230}
@deffn {C 함수} void PyErr_Clear ()
` Part of the @ref{774,,안정 ABI}.'
에러 표시기를 지웁니다. 에러 표시기가 설정되어 있지 않으면 효과가 없습니다.
@end deffn

@geindex PyErr_PrintEx (C function)
@anchor{c-api/exceptions c PyErr_PrintEx}@anchor{500d}
@deffn {C 함수} void PyErr_PrintEx (int set_sys_last_vars)
` Part of the @ref{774,,안정 ABI}.'
표준 트레이스백을 @code{sys.stderr}로 인쇄하고 에러 표시기를 지웁니다. 에러가 @code{SystemExit}가 `아닌 한', 이 경우에는 트레이스백이 인쇄되지 않고 파이썬 프로세스는 @code{SystemExit} 인스턴스에 의해 지정된 에러 코드로 종료됩니다.

에러 표시기가 설정된 경우**에만** 이 함수를 호출하십시오. 그렇지 않으면 치명적인 에러가 발생합니다!

`set_sys_last_vars'가 0이 아니면, 변수 @ref{6e4,,sys.last_exc} 는 인쇄되는 예외로 설정됩니다. 하위 호환성을 위해, 폐지된 변수 @ref{6e5,,sys.last_type}, @ref{6e6,,sys.last_value} 및 @ref{6e7,,sys.last_traceback} 도 각각 이 예외의 형, 값 및 트레이스백으로 설정됩니다.


버전 3.12에서 변경: The setting of @ref{6e4,,sys.last_exc} was added.

@end deffn

@geindex PyErr_Print (C function)
@anchor{c-api/exceptions c PyErr_Print}@anchor{1d29}
@deffn {C 함수} void PyErr_Print ()
` Part of the @ref{774,,안정 ABI}.'
@code{PyErr_PrintEx(1)}의 별칭.
@end deffn

@geindex PyErr_WriteUnraisable (C function)
@anchor{c-api/exceptions c PyErr_WriteUnraisable}@anchor{5ef}
@deffn {C 함수} void PyErr_WriteUnraisable (PyObject *obj)
` Part of the @ref{774,,안정 ABI}.'
현재 예외와 `obj' 인자를 사용하여 @ref{506,,sys.unraisablehook()} 을 호출합니다.

이 유틸리티 함수는 예외가 설정되었지만, 인터프리터가 실제로 예외를 발생시킬 수 없을 때 @code{sys.stderr}에 경고 메시지를 인쇄합니다. 예를 들어, @ref{11fc,,__del__()} 메서드에서 예외가 발생할 때 사용됩니다.

이 함수는 발생시킬 수 없는 예외가 발생한 문맥을 식별하는 단일 인자 `obj'로 호출됩니다. 가능하면, `obj'의 repr이 경고 메시지에 인쇄됩니다. `obj'가 @code{NULL}이면, 트래이스백만 인쇄됩니다.

이 함수를 호출할 때 예외를 설정되어 있어야 합니다.


버전 3.4에서 변경: Print a traceback. Print only traceback if `obj' is @code{NULL}.



버전 3.8에서 변경: Use @ref{506,,sys.unraisablehook()}.

@end deffn

@geindex PyErr_FormatUnraisable (C function)
@anchor{c-api/exceptions c PyErr_FormatUnraisable}@anchor{5f0}
@deffn {C 함수} void PyErr_FormatUnraisable (const char *format, ...)

Similar to @ref{5ef,,PyErr_WriteUnraisable()}, but the `format' and subsequent
parameters help format the warning message; they have the same meaning and
values as in @ref{629,,PyUnicode_FromFormat()}.
@code{PyErr_WriteUnraisable(obj)} is roughly equivalent to
@code{PyErr_FormatUnraisable("Exception ignored in: %R", obj)}.
If `format' is @code{NULL}, only the traceback is printed.


Added in version 3.13.

@end deffn

@geindex PyErr_DisplayException (C function)
@anchor{c-api/exceptions c PyErr_DisplayException}@anchor{435}
@deffn {C 함수} void PyErr_DisplayException (PyObject *exc)
` Part of the @ref{774,,안정 ABI} 버전 3.12 이후로.'
Print the standard traceback display of @code{exc} to @code{sys.stderr}, including
chained exceptions and notes.


Added in version 3.12.

@end deffn

@node 예외 발생시키기,경고 발행하기,인쇄와 지우기,예외 처리
@anchor{c-api/exceptions raising-exceptions}@anchor{522d}
@subsection 예외 발생시키기


이 함수들은 현재 스레드의 에러 표시기를 설정하는 데 도움이 됩니다. 편의를 위해, 이러한 함수 중 일부는 항상 @code{return} 문에서 사용할 @code{NULL} 포인터를 반환합니다.

@geindex PyErr_SetString (C function)
@anchor{c-api/exceptions c PyErr_SetString}@anchor{79b}
@deffn {C 함수} void PyErr_SetString (PyObject *type, const char *message)
` Part of the @ref{774,,안정 ABI}.'
이것은 에러 표시기를 설정하는 가장 일반적인 방법입니다. 첫 번째 인자는 예외 형을 지정합니다; 일반적으로 표준 예외 중 하나입니다, 예를 들어 @ref{504b,,PyExc_RuntimeError}. 새로운 @ref{5df,,강한 참조}를 만들 필요가 없습니다 (예를 들어, @ref{78e,,Py_INCREF()}로). 두 번째 인자는 에러 메시지입니다; @code{'utf-8'} 에서 디코딩됩니다.
@end deffn

@geindex PyErr_SetObject (C function)
@anchor{c-api/exceptions c PyErr_SetObject}@anchor{79a}
@deffn {C 함수} void PyErr_SetObject (PyObject *type, PyObject *value)
` Part of the @ref{774,,안정 ABI}.'
이 함수는 @ref{79b,,PyErr_SetString()}과 유사하지만, 예외의 “값”에 대해 임의의 파이썬 객체를 지정할 수 있습니다.
@end deffn

@geindex PyErr_Format (C function)
@anchor{c-api/exceptions c PyErr_Format}@anchor{10af}
@deffn {C 함수} @ref{5dc,,PyObject} *PyErr_Format (PyObject *exception, const char *format, ...)
`반환값: 항상 NULL.'` Part of the @ref{774,,안정 ABI}.'
이 함수는 에러 표시기를 설정하고 @code{NULL}을 반환합니다. `exception'은 파이썬 예외 클래스여야 합니다. `format'과 후속 매개 변수는 에러 메시지를 포맷하는 데 도움이 됩니다; @ref{629,,PyUnicode_FromFormat()}에서와 같은 의미와 값을 갖습니다. `format'은 ASCII 인코딩된 문자열입니다.
@end deffn

@geindex PyErr_FormatV (C function)
@anchor{c-api/exceptions c PyErr_FormatV}@anchor{10b0}
@deffn {C 함수} @ref{5dc,,PyObject} *PyErr_FormatV (PyObject *exception, const char *format, va_list vargs)
`반환값: 항상 NULL.'` Part of the @ref{774,,안정 ABI} 버전 3.5 이후로.'
@ref{10af,,PyErr_Format()}과 같지만, 가변 개수의 인자 대신 @code{va_list} 인자를 취합니다.


Added in version 3.5.

@end deffn

@geindex PyErr_SetNone (C function)
@anchor{c-api/exceptions c PyErr_SetNone}@anchor{5016}
@deffn {C 함수} void PyErr_SetNone (PyObject *type)
` Part of the @ref{774,,안정 ABI}.'
이것은 @code{PyErr_SetObject(type, Py_None)}의 줄임 표현입니다.
@end deffn

@geindex PyErr_BadArgument (C function)
@anchor{c-api/exceptions c PyErr_BadArgument}@anchor{500a}
@deffn {C 함수} int PyErr_BadArgument ()
` Part of the @ref{774,,안정 ABI}.'
이것은 @code{PyErr_SetString(PyExc_TypeError, message)}의 줄임 표현입니다, 여기서 `message'는 잘못된 인자로 내장 연산이 호출되었음을 나타냅니다. 대부분 내부 용입니다.
@end deffn

@geindex PyErr_NoMemory (C function)
@anchor{c-api/exceptions c PyErr_NoMemory}@anchor{4ed8}
@deffn {C 함수} @ref{5dc,,PyObject} *PyErr_NoMemory ()
`반환값: 항상 NULL.'` Part of the @ref{774,,안정 ABI}.'
이것은 @code{PyErr_SetNone(PyExc_MemoryError)}의 줄임 표현입니다; @code{NULL}을 반환해서 객체 할당 함수는 메모리가 부족할 때 @code{return PyErr_NoMemory();} 라고 쓸 수 있습니다.
@end deffn

@geindex PyErr_SetFromErrno (C function)
@anchor{c-api/exceptions c PyErr_SetFromErrno}@anchor{4ed7}
@deffn {C 함수} @ref{5dc,,PyObject} *PyErr_SetFromErrno (PyObject *type)
`반환값: 항상 NULL.'` Part of the @ref{774,,안정 ABI}.'
@geindex strerror (C 함수)

C 라이브러리 함수가 에러를 반환하고 C 변수 @code{errno}를 설정했을 때 예외를 발생시키는 편의 함수입니다. 첫 번째 항목이 정수 @code{errno} 값이고 두 번째 항목이 (@code{strerror()}에서 얻은) 해당 에러 메시지인 튜플 객체를 만든 다음, @code{PyErr_SetObject(type, object)}를 호출합니다. 유닉스에서, @code{errno} 값이 시스템 호출이 중단되었음을 나타내는 @code{EINTR}이면, @ref{692,,PyErr_CheckSignals()}를 호출하고 이것이 에러 표시기를 설정하면, 설정된 그대로 둡니다. 이 함수는 항상 @code{NULL}을 반환해서, 시스템 호출에 대한 래퍼 함수는 시스템 호출이 에러를 반환할 때 @code{return PyErr_SetFromErrno(type);} 이라고 쓸 수 있습니다.
@end deffn

@geindex PyErr_SetFromErrnoWithFilenameObject (C function)
@anchor{c-api/exceptions c PyErr_SetFromErrnoWithFilenameObject}@anchor{5012}
@deffn {C 함수} @ref{5dc,,PyObject} *PyErr_SetFromErrnoWithFilenameObject (PyObject *type, PyObject *filenameObject)
`반환값: 항상 NULL.'` Part of the @ref{774,,안정 ABI}.'
@ref{4ed7,,PyErr_SetFromErrno()}와 유사하지만, `filenameObject'가 @code{NULL}이 아니면, `type'의 생성자에 세 번째 매개 변수로 전달된다는 추가 동작이 있습니다. @ref{2c0,,OSError} 예외의 경우, 예외 인스턴스의 @code{filename} 어트리뷰트를 정의하는 데 사용됩니다.
@end deffn

@geindex PyErr_SetFromErrnoWithFilenameObjects (C function)
@anchor{c-api/exceptions c PyErr_SetFromErrnoWithFilenameObjects}@anchor{5013}
@deffn {C 함수} @ref{5dc,,PyObject} *PyErr_SetFromErrnoWithFilenameObjects (PyObject *type, PyObject *filenameObject, PyObject *filenameObject2)
`반환값: 항상 NULL.'` Part of the @ref{774,,안정 ABI} 버전 3.7 이후로.'
@ref{5012,,PyErr_SetFromErrnoWithFilenameObject()}와 유사하지만, 두 개의 파일명을 취하는 함수가 실패할 때 에러를 발생시키기 위해 두 번째 파일명 객체를 취합니다.


Added in version 3.4.

@end deffn

@geindex PyErr_SetFromErrnoWithFilename (C function)
@anchor{c-api/exceptions c PyErr_SetFromErrnoWithFilename}@anchor{1a85}
@deffn {C 함수} @ref{5dc,,PyObject} *PyErr_SetFromErrnoWithFilename (PyObject *type, const char *filename)
`반환값: 항상 NULL.'` Part of the @ref{774,,안정 ABI}.'
@ref{5012,,PyErr_SetFromErrnoWithFilenameObject()}와 유사하지만, 파일명이 C 문자열로 제공됩니다. `filename'은 @ref{75c,,파일시스템 인코딩과 에러 처리기}로 디코딩됩니다.
@end deffn

@geindex PyErr_SetFromWindowsErr (C function)
@anchor{c-api/exceptions c PyErr_SetFromWindowsErr}@anchor{5014}
@deffn {C 함수} @ref{5dc,,PyObject} *PyErr_SetFromWindowsErr (int ierr)
`반환값: 항상 NULL.'` Part of the @ref{774,,안정 ABI} on Windows 버전 3.7 이후로.'
@ref{2c0,,OSError}를 발생시키는 편의 함수입니다. @code{0}의 `ierr'로 호출하면, @code{GetLastError()} 호출에서 반환된 에러 코드가 대신 사용됩니다. Win32 함수 @code{FormatMessage()}를 호출하여 `ierr'이나 @code{GetLastError()}가 제공하는 에러 코드의 윈도우 설명을 얻은 다음, @ref{26f5,,winerror} 어트리뷰트가 에러 코드로 설정되고, @ref{26f6,,strerror} 어트리뷰트가 (@code{FormatMessage()}에서 얻은) 해당 에러 메시지로 설정된 @code{OSError} 객체를 생성한 다음, @code{PyErr_SetObject(PyExc_OSError, object)}를 호출합니다. 이 함수는 항상 @code{NULL}을 반환합니다.

@ref{213c,,가용성}: Windows.
@end deffn

@geindex PyErr_SetExcFromWindowsErr (C function)
@anchor{c-api/exceptions c PyErr_SetExcFromWindowsErr}@anchor{500f}
@deffn {C 함수} @ref{5dc,,PyObject} *PyErr_SetExcFromWindowsErr (PyObject *type, int ierr)
`반환값: 항상 NULL.'` Part of the @ref{774,,안정 ABI} on Windows 버전 3.7 이후로.'
@ref{5014,,PyErr_SetFromWindowsErr()} 와 유사하며, 발생시킬 예외 형을 지정하는 추가 매개 변수가 있습니다.

@ref{213c,,가용성}: Windows.
@end deffn

@geindex PyErr_SetFromWindowsErrWithFilename (C function)
@anchor{c-api/exceptions c PyErr_SetFromWindowsErrWithFilename}@anchor{1a87}
@deffn {C 함수} @ref{5dc,,PyObject} *PyErr_SetFromWindowsErrWithFilename (int ierr, const char *filename)
`반환값: 항상 NULL.'` Part of the @ref{774,,안정 ABI} on Windows 버전 3.7 이후로.'
@ref{5014,,PyErr_SetFromWindowsErr()}과 유사하지만, `filename'이 @code{NULL}이 아니면, 파일 시스템 인코딩으로 디코딩되고 (@ref{e4d,,os.fsdecode()}) @ref{2c0,,OSError}의 생성자에 세 번째 매개 변수로 전달되어 예외 인스턴스의 @code{filename} 어트리뷰트를 정의하는 데 사용되도록 하는 추가 동작이 있습니다.

@ref{213c,,가용성}: Windows.
@end deffn

@geindex PyErr_SetExcFromWindowsErrWithFilenameObject (C function)
@anchor{c-api/exceptions c PyErr_SetExcFromWindowsErrWithFilenameObject}@anchor{5010}
@deffn {C 함수} @ref{5dc,,PyObject} *PyErr_SetExcFromWindowsErrWithFilenameObject (PyObject *type, int ierr, PyObject *filename)
`반환값: 항상 NULL.'` Part of the @ref{774,,안정 ABI} on Windows 버전 3.7 이후로.'
@ref{500f,,PyErr_SetExcFromWindowsErr()}과 유사하지만, `filename'이 @code{NULL}이 아니면, @ref{2c0,,OSError}의 생성자에 세 번째 매개 변수로 전달되어 예외 인스턴스의 @code{filename} 어트리뷰트를 정의하는 데 사용되도록 하는 추가 동작이 있습니다.

@ref{213c,,가용성}: Windows.
@end deffn

@geindex PyErr_SetExcFromWindowsErrWithFilenameObjects (C function)
@anchor{c-api/exceptions c PyErr_SetExcFromWindowsErrWithFilenameObjects}@anchor{5011}
@deffn {C 함수} @ref{5dc,,PyObject} *PyErr_SetExcFromWindowsErrWithFilenameObjects (PyObject *type, int ierr, PyObject *filename, PyObject *filename2)
`반환값: 항상 NULL.'` Part of the @ref{774,,안정 ABI} on Windows 버전 3.7 이후로.'
@ref{5010,,PyErr_SetExcFromWindowsErrWithFilenameObject()}와 유사하지만, 두 번째 파일명 객체를 받아들입니다.

@ref{213c,,가용성}: Windows.


Added in version 3.4.

@end deffn

@geindex PyErr_SetExcFromWindowsErrWithFilename (C function)
@anchor{c-api/exceptions c PyErr_SetExcFromWindowsErrWithFilename}@anchor{1a86}
@deffn {C 함수} @ref{5dc,,PyObject} *PyErr_SetExcFromWindowsErrWithFilename (PyObject *type, int ierr, const char *filename)
`반환값: 항상 NULL.'` Part of the @ref{774,,안정 ABI} on Windows 버전 3.7 이후로.'
@ref{1a87,,PyErr_SetFromWindowsErrWithFilename()}와 유사하며, 발생시킬 예외 형을 지정하는 추가 매개 변수가 있습니다.

@ref{213c,,가용성}: Windows.
@end deffn

@geindex PyErr_SetImportError (C function)
@anchor{c-api/exceptions c PyErr_SetImportError}@anchor{f38}
@deffn {C 함수} @ref{5dc,,PyObject} *PyErr_SetImportError (PyObject *msg, PyObject *name, PyObject *path)
`반환값: 항상 NULL.'` Part of the @ref{774,,안정 ABI} 버전 3.7 이후로.'
@ref{659,,ImportError}를 발생시키는 편의 함수입니다. `msg'는 예외의 메시지 문자열로 설정됩니다. 둘 다 @code{NULL}이 될 수 있는, `name'과 `path'는 각각 @code{ImportError}의 @code{name}과 @code{path} 어트리뷰트로 설정됩니다.


Added in version 3.3.

@end deffn

@geindex PyErr_SetImportErrorSubclass (C function)
@anchor{c-api/exceptions c PyErr_SetImportErrorSubclass}@anchor{f11}
@deffn {C 함수} @ref{5dc,,PyObject} *PyErr_SetImportErrorSubclass (PyObject *exception, PyObject *msg, PyObject *name, PyObject *path)
`반환값: 항상 NULL.'` Part of the @ref{774,,안정 ABI} 버전 3.6 이후로.'
@ref{f38,,PyErr_SetImportError()} 와 매우 비슷하지만, 이 함수는 발생시킬 @ref{659,,ImportError}의 서브 클래스를 지정할 수 있습니다.


Added in version 3.6.

@end deffn

@geindex PyErr_SyntaxLocationObject (C function)
@anchor{c-api/exceptions c PyErr_SyntaxLocationObject}@anchor{522e}
@deffn {C 함수} void PyErr_SyntaxLocationObject (PyObject *filename, int lineno, int col_offset)

현재 예외에 대한 파일(file), 줄(line) 및 오프셋(offset) 정보를 설정합니다. 현재 예외가 @ref{18e,,SyntaxError}가 아니면, 추가 어트리뷰트를 설정하여, 예외 인쇄 하위 시스템이 예외가 @code{SyntaxError}라고 생각하게 합니다.


Added in version 3.4.

@end deffn

@geindex PyErr_RangedSyntaxLocationObject (C function)
@anchor{c-api/exceptions c PyErr_RangedSyntaxLocationObject}@anchor{522f}
@deffn {C 함수} void PyErr_RangedSyntaxLocationObject (PyObject *filename, int lineno, int col_offset, int end_lineno, int end_col_offset)

Similar to @ref{522e,,PyErr_SyntaxLocationObject()}, but also sets the
`end_lineno' and `end_col_offset' information for the current exception.


Added in version 3.10.

@end deffn

@geindex PyErr_SyntaxLocationEx (C function)
@anchor{c-api/exceptions c PyErr_SyntaxLocationEx}@anchor{5018}
@deffn {C 함수} void PyErr_SyntaxLocationEx (const char *filename, int lineno, int col_offset)
` Part of the @ref{774,,안정 ABI} 버전 3.7 이후로.'
@ref{522e,,PyErr_SyntaxLocationObject()} 와 비슷하지만, `filename'은 @ref{75c,,파일시스템 인코딩과 에러 처리기}로 디코딩되는 바이트 문자열입니다.


Added in version 3.2.

@end deffn

@geindex PyErr_SyntaxLocation (C function)
@anchor{c-api/exceptions c PyErr_SyntaxLocation}@anchor{5017}
@deffn {C 함수} void PyErr_SyntaxLocation (const char *filename, int lineno)
` Part of the @ref{774,,안정 ABI}.'
@ref{5018,,PyErr_SyntaxLocationEx()} 와 비슷하지만, `col_offset' 매개 변수는 생략됩니다.
@end deffn

@geindex PyErr_BadInternalCall (C function)
@anchor{c-api/exceptions c PyErr_BadInternalCall}@anchor{500b}
@deffn {C 함수} void PyErr_BadInternalCall ()
` Part of the @ref{774,,안정 ABI}.'
이것은 @code{PyErr_SetString(PyExc_SystemError, message)}의 줄임 표현입니다. 여기서 `message'는 내부 연산(예를 들어 파이썬/C API 함수)이 잘못된 인자로 호출되었음을 나타냅니다. 대부분 내부 용입니다.
@end deffn

@geindex PyErr_ProgramTextObject (C function)
@anchor{c-api/exceptions c PyErr_ProgramTextObject}@anchor{5230}
@deffn {C 함수} @ref{5dc,,PyObject} *PyErr_ProgramTextObject (PyObject *filename, int lineno)

Get the source line in `filename' at line `lineno'. `filename' should be a
Python @ref{169,,str} object.

On success, this function returns a Python string object with the found line.
On failure, this function returns @code{NULL} without an exception set.
@end deffn

@geindex PyErr_ProgramText (C function)
@anchor{c-api/exceptions c PyErr_ProgramText}@anchor{500e}
@deffn {C 함수} @ref{5dc,,PyObject} *PyErr_ProgramText (const char *filename, int lineno)
` Part of the @ref{774,,안정 ABI}.'
Similar to @ref{5230,,PyErr_ProgramTextObject()}, but `filename' is a
const char*, which is decoded with the
@ref{75c,,filesystem encoding and error handler}, instead of a
Python object reference.
@end deffn

@node 경고 발행하기,에러 표시기 조회하기,예외 발생시키기,예외 처리
@anchor{c-api/exceptions issuing-warnings}@anchor{5231}
@subsection 경고 발행하기


이 함수를 사용하여 C 코드에서 경고를 발행하십시오. 파이썬 @ref{118,,warnings} 모듈에서 내보낸 유사한 함수를 미러링합니다. 일반적으로 `sys.stderr'에 경고 메시지를 인쇄합니다; 그러나, 사용자가 경고를 에러로 전환하도록 지정했을 수도 있으며, 이 경우 예외가 발생합니다. 경고 장치의 문제로 인해 이 함수가 예외를 발생시키는 것도 가능합니다. 예외가 발생하지 않으면 반환 값은 @code{0}이고, 예외가 발생하면 @code{-1}입니다. (경고 메시지가 실제로 인쇄되는지나 예외의 이유를 확인할 수 없습니다; 이것은 의도적입니다.) 예외가 발생하면, 호출자는 정상적인 예외 처리를 수행해야 합니다 (예를 들어, 소유한 참조를 @ref{78f,,Py_DECREF()}하고 에러값을 반환합니다).

@geindex PyErr_WarnEx (C function)
@anchor{c-api/exceptions c PyErr_WarnEx}@anchor{1651}
@deffn {C 함수} int PyErr_WarnEx (PyObject *category, const char *message, Py_ssize_t stack_level)
` Part of the @ref{774,,안정 ABI}.'
경고 메시지를 발행합니다. `category' 인자는 경고 범주(아래를 참조하십시오)나 @code{NULL}입니다; `message' 인자는 UTF-8로 인코딩된 문자열입니다. `stack_level'은 스택 프레임 수를 제공하는 양수입니다; 해당 스택 프레임에서 현재 실행 중인 코드 줄에서 경고가 발생합니다. `stack_level'이 1이면 @ref{1651,,PyErr_WarnEx()}를 호출하는 함수, 2는 그 위의 함수, 등등.

경고 범주는 @ref{505c,,PyExc_Warning}의 서브 클래스여야 합니다. @code{PyExc_Warning}은 @ref{5030,,PyExc_Exception}의 서브 클래스입니다; 기본 경고 범주는 @ref{504c,,PyExc_RuntimeWarning}입니다. 표준 파이썬 경고 범주는 이름이 @ref{5232,,Warning types} 에 열거된 전역 변수로 제공됩니다.

경고 제어에 대한 자세한 내용은, @ref{118,,warnings} 모듈 설명서와 명령 줄 설명서에서 @ref{ac5,,-W} 옵션을 참조하십시오. 경고 제어를 위한 C API는 없습니다.
@end deffn

@geindex PyErr_WarnExplicitObject (C function)
@anchor{c-api/exceptions c PyErr_WarnExplicitObject}@anchor{5233}
@deffn {C 함수} int PyErr_WarnExplicitObject (PyObject *category, PyObject *message, PyObject *filename, int lineno, PyObject *module, PyObject *registry)

모든 경고 어트리뷰트를 명시적으로 제어하면서 경고 메시지를 발행합니다. 이것은 파이썬 함수 @ref{efc,,warnings.warn_explicit()}에 대한 간단한 래퍼입니다; 자세한 내용은 거기를 참조하십시오. 그곳에 설명된 기본 효과를 얻으려면 `module'과 `registry' 인자를 @code{NULL}로 설정해야 합니다.


Added in version 3.4.

@end deffn

@geindex PyErr_WarnExplicit (C function)
@anchor{c-api/exceptions c PyErr_WarnExplicit}@anchor{1a8d}
@deffn {C 함수} int PyErr_WarnExplicit (PyObject *category, const char *message, const char *filename, int lineno, const char *module, PyObject *registry)
` Part of the @ref{774,,안정 ABI}.'
`message'와 `module'이 UTF-8 인코딩된 문자열이고, `filename'은 @ref{75c,,파일시스템 인코딩과 에러 처리기}로 디코딩된다는 점을 제외하면 @ref{5233,,PyErr_WarnExplicitObject()} 와 유사합니다.
@end deffn

@geindex PyErr_WarnFormat (C function)
@anchor{c-api/exceptions c PyErr_WarnFormat}@anchor{5019}
@deffn {C 함수} int PyErr_WarnFormat (PyObject *category, Py_ssize_t stack_level, const char *format, ...)
` Part of the @ref{774,,안정 ABI}.'
@ref{1651,,PyErr_WarnEx()}와 유사한 함수지만, @ref{629,,PyUnicode_FromFormat()}을 사용하여 경고 메시지를 포맷합니다. `format'은 ASCII 인코딩된 문자열입니다.


Added in version 3.2.

@end deffn

@geindex PyErr_WarnExplicitFormat (C function)
@anchor{c-api/exceptions c PyErr_WarnExplicitFormat}@anchor{5234}
@deffn {C 함수} int PyErr_WarnExplicitFormat (PyObject *category, const char *filename, int lineno, const char *module, PyObject *registry, const char *format, ...)

Similar to @ref{1a8d,,PyErr_WarnExplicit()}, but uses
@ref{629,,PyUnicode_FromFormat()} to format the warning message. `format' is
an ASCII-encoded string.


Added in version 3.2.

@end deffn

@geindex PyErr_ResourceWarning (C function)
@anchor{c-api/exceptions c PyErr_ResourceWarning}@anchor{f12}
@deffn {C 함수} int PyErr_ResourceWarning (PyObject *source, Py_ssize_t stack_level, const char *format, ...)
` Part of the @ref{774,,안정 ABI} 버전 3.6 이후로.'
@ref{5019,,PyErr_WarnFormat()}과 유사한 함수지만, `category'는 @ref{54e,,ResourceWarning}이고 `source'를 @code{warnings.WarningMessage}로 전달합니다.


Added in version 3.6.

@end deffn

@node 에러 표시기 조회하기,시그널 처리하기<2>,경고 발행하기,예외 처리
@anchor{c-api/exceptions querying-the-error-indicator}@anchor{5235}
@subsection 에러 표시기 조회하기


@geindex PyErr_Occurred (C function)
@anchor{c-api/exceptions c PyErr_Occurred}@anchor{1cac}
@deffn {C 함수} @ref{5dc,,PyObject} *PyErr_Occurred ()
`반환값: 빌린 참조.'` Part of the @ref{774,,안정 ABI}.'
에러 표시기가 설정되었는지 테스트합니다. 설정되었으면, 예외 `type'(@code{PyErr_Set*} 함수나 @ref{42b,,PyErr_Restore()}에 대한 마지막 호출의 첫 번째 인자)을 반환합니다. 설정되지 않았으면, @code{NULL}을 반환합니다. 여러분이 반환 값에 대한 참조를 소유하지 않아서, @ref{78f,,Py_DECREF()} 할 필요가 없습니다.

The caller must have an @ref{4f10,,attached thread state}.

@cartouche
@quotation 참고 
반환 값을 특정 예외와 비교하지 마십시오; 대신 @ref{4f8d,,PyErr_ExceptionMatches()}를 사용하십시오, 아래를 참조하십시오. (클래스 예외의 경우 예외가 클래스 대신 인스턴스이거나, 예상하는 예외의 서브 클래스일 수 있어서 비교는 실패하기 쉽습니다.)
@end quotation
@end cartouche
@end deffn

@geindex PyErr_ExceptionMatches (C function)
@anchor{c-api/exceptions c PyErr_ExceptionMatches}@anchor{4f8d}
@deffn {C 함수} int PyErr_ExceptionMatches (PyObject *exc)
` Part of the @ref{774,,안정 ABI}.'
@code{PyErr_GivenExceptionMatches(PyErr_Occurred(), exc)}와 동등합니다. 예외가 실제로 설정되었을 때만 호출해야 합니다; 예외가 발생하지 않았으면 메모리 액세스 위반이 발생합니다.
@end deffn

@geindex PyErr_GivenExceptionMatches (C function)
@anchor{c-api/exceptions c PyErr_GivenExceptionMatches}@anchor{500c}
@deffn {C 함수} int PyErr_GivenExceptionMatches (PyObject *given, PyObject *exc)
` Part of the @ref{774,,안정 ABI}.'
`given' 예외가 `exc'의 예외 형과 일치하면 참을 반환합니다. `exc'가 클래스 객체이면, `given'이 서브 클래스의 인스턴스일 때도 참을 반환합니다. `exc'가 튜플이면, 튜플에 있는 모든 예외 형(그리고 서브 튜플도 재귀적으로)을 일치를 위해 검색합니다.
@end deffn

@geindex PyErr_GetRaisedException (C function)
@anchor{c-api/exceptions c PyErr_GetRaisedException}@anchor{429}
@deffn {C 함수} @ref{5dc,,PyObject} *PyErr_GetRaisedException (void)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI} 버전 3.12 이후로.'
Return the exception currently being raised, clearing the error indicator at
the same time. Return @code{NULL} if the error indicator is not set.

이 함수는 예외를 포착해야 하는 코드나 에러 표시기를 일시적으로 저장하고 복원해야 하는 코드에서 사용됩니다.

예를 들어:

@example
@{
   PyObject *exc = PyErr_GetRaisedException();

   /* ... 다른 에러를 생성할 수 있는 코드 ... */

   PyErr_SetRaisedException(exc);
@}
@end example


@subsubheading 더 보기


@ref{972,,PyErr_GetHandledException()},
to save the exception currently being handled.



Added in version 3.12.

@end deffn

@geindex PyErr_SetRaisedException (C function)
@anchor{c-api/exceptions c PyErr_SetRaisedException}@anchor{42c}
@deffn {C 함수} void PyErr_SetRaisedException (PyObject *exc)
` Part of the @ref{774,,안정 ABI} 버전 3.12 이후로.'
Set `exc' as the exception currently being raised,
clearing the existing exception if one is set.

@cartouche
@quotation 경고 
This call steals a reference to `exc', which must be a valid exception.
@end quotation
@end cartouche


Added in version 3.12.

@end deffn

@geindex PyErr_Fetch (C function)
@anchor{c-api/exceptions c PyErr_Fetch}@anchor{428}
@deffn {C 함수} void PyErr_Fetch (PyObject **ptype, PyObject **pvalue, PyObject **ptraceback)
` Part of the @ref{774,,안정 ABI}.'

버전 3.12부터 폐지됨: Use @ref{429,,PyErr_GetRaisedException()} instead.


주소가 전달된 세 개의 변수로 에러 표시기를 꺼냅니다. 에러 표시기가 설정되지 않았으면, 세 변수를 모두 @code{NULL}로 설정합니다. 설정되었으면, 지워지고 꺼낸 각 객체에 대한 참조를 여러분이 소유합니다. 값과 트레이스백 객체는 형 객체가 그렇지 않을 때도 @code{NULL}일 수 있습니다.

@cartouche
@quotation 참고 
이 함수는 일반적으로 예외를 포착해야 하거나 에러 표시기를 일시적으로 저장하고 복원해야 하는 레거시 코드에서만 사용됩니다.

예를 들어:

@example
@{
   PyObject *type, *value, *traceback;
   PyErr_Fetch(&type, &value, &traceback);

   /* ... 다른 에러를 생성할 수 있는 코드 ... */

   PyErr_Restore(type, value, traceback);
@}
@end example
@end quotation
@end cartouche
@end deffn

@geindex PyErr_Restore (C function)
@anchor{c-api/exceptions c PyErr_Restore}@anchor{42b}
@deffn {C 함수} void PyErr_Restore (PyObject *type, PyObject *value, PyObject *traceback)
` Part of the @ref{774,,안정 ABI}.'

버전 3.12부터 폐지됨: Use @ref{42c,,PyErr_SetRaisedException()} instead.


세 객체, `type', `value' 및 `traceback'으로 에러 표시기를 설정합니다. 이미 설정되어 있으면, 기존 예외를 지웁니다. 객체가 @code{NULL}이면, 에러 표시기가 지워집니다. @code{NULL} type과 함께 @code{NULL}이 아닌 value나 traceback 을 전달하지 마십시오. 예외 형은 클래스여야 합니다. 잘못된 예외 형이나 값을 전달하지 마십시오. (이러한 규칙을 위반하면 나중에 미묘한 문제가 발생합니다.) 이 호출은 각 객체에 대한 참조를 제거합니다: 호출 전에 각 객체에 대한 참조를 소유해야 하며 호출 후에는 더는 이러한 참조를 소유하지 않습니다. (이것을 이해할 수 없다면, 이 함수를 사용하지 마십시오. 경고했습니다.)

@cartouche
@quotation 참고 
이 함수는 일반적으로 에러 표시기를 일시적으로 저장하고 복원해야 하는 레거시 코드에서만 사용됩니다. 현재 에러 표시기를 저장하려면 @ref{428,,PyErr_Fetch()}를 사용하십시오.
@end quotation
@end cartouche
@end deffn

@geindex PyErr_NormalizeException (C function)
@anchor{c-api/exceptions c PyErr_NormalizeException}@anchor{42a}
@deffn {C 함수} void PyErr_NormalizeException (PyObject **exc, PyObject **val, PyObject **tb)
` Part of the @ref{774,,안정 ABI}.'

버전 3.12부터 폐지됨: Use @ref{429,,PyErr_GetRaisedException()} instead,
to avoid any possible de-normalization.


특정 상황에서, 아래의 @ref{428,,PyErr_Fetch()}가 반환하는 값은 “비 정규화”되었을 수 있습니다. 즉, @code{*exc}는 클래스 객체이지만 @code{*val}은 같은 클래스의 인스턴스가 아닙니다. 이 함수는 이 경우 클래스를 인스턴스 화하는 데 사용할 수 있습니다. 값이 이미 정규화되어 있으면, 아무 일도 일어나지 않습니다. 지연된 정규화는 성능 향상을 위해 구현됩니다.

@cartouche
@quotation 참고 
이 함수 예외 값에 @ref{14cb,,__traceback__} 어트리뷰트를 묵시적으로 설정하지 `않습니다'. 트레이스백을 적절하게 설정해야 하면, 다음과 같은 추가 스니펫이 필요합니다:

@example
if (tb != NULL) @{
  PyException_SetTraceback(val, tb);
@}
@end example
@end quotation
@end cartouche
@end deffn

@geindex PyErr_GetHandledException (C function)
@anchor{c-api/exceptions c PyErr_GetHandledException}@anchor{972}
@deffn {C 함수} @ref{5dc,,PyObject} *PyErr_GetHandledException (void)
` Part of the @ref{774,,안정 ABI} 버전 3.11 이후로.'
@ref{89a,,sys.exception()}이 반환하는 것과 같은, 활성 예외 인스턴스를 꺼냅니다. 이것은 새로 발생한 예외가 아니라, `이미 포착된' 예외를 가리킵니다. 예외에 대한 새 참조나 @code{NULL}을 반환합니다. 인터프리터의 예외 상태를 수정하지 않습니다.

@cartouche
@quotation 참고 
이 함수는 일반적으로 예외를 처리하려는 코드에서 사용되지 않습니다. 오히려, 코드가 예외 상태를 임시로 저장하고 복원해야 할 때 사용할 수 있습니다. 예외 상태를 복원하거나 지우려면 @ref{973,,PyErr_SetHandledException()}를 사용하십시오.
@end quotation
@end cartouche


Added in version 3.11.

@end deffn

@geindex PyErr_SetHandledException (C function)
@anchor{c-api/exceptions c PyErr_SetHandledException}@anchor{973}
@deffn {C 함수} void PyErr_SetHandledException (PyObject *exc)
` Part of the @ref{774,,안정 ABI} 버전 3.11 이후로.'
@code{sys.exception()}으로 알려진 것과 같은, 활성 예외를 설정합니다. 이것은 새로 발생한 예외가 아니라, `이미 포착된' 예외를 가리킵니다. 예외 상태를 지우려면, @code{NULL}을 전달하십시오.

@cartouche
@quotation 참고 
이 함수는 일반적으로 예외를 처리하려는 코드에서 사용되지 않습니다. 오히려, 코드가 예외 상태를 임시로 저장하고 복원해야 할 때 사용할 수 있습니다. 예외 상태를 얻으려면 @ref{972,,PyErr_GetHandledException()}를 사용하십시오.
@end quotation
@end cartouche


Added in version 3.11.

@end deffn

@geindex PyErr_GetExcInfo (C function)
@anchor{c-api/exceptions c PyErr_GetExcInfo}@anchor{975}
@deffn {C 함수} void PyErr_GetExcInfo (PyObject **ptype, PyObject **pvalue, PyObject **ptraceback)
` Part of the @ref{774,,안정 ABI} 버전 3.7 이후로.'
@ref{899,,sys.exc_info()}로 알려진 것과 같은, 예외 정보의 구식 표현을 꺼냅니다. 이것은 새로 발생한 예외가 아니라, `이미 포착된' 예외를 가리킵니다. 세 객체에 대한 새 참조를 반환합니다. 이 중 어느 것이든 @code{NULL}일 수 있습니다. 예외 정보 상태를 수정하지 않습니다. 이 함수는 하위 호환성을 위해 유지됩니다. 대신 @ref{972,,PyErr_GetHandledException()}을 사용하세요.

@cartouche
@quotation 참고 
이 함수는 일반적으로 예외를 처리하려는 코드에서 사용되지 않습니다. 오히려, 코드가 예외 상태를 임시로 저장하고 복원해야 할 때 사용할 수 있습니다. 예외 상태를 복원하거나 지우려면 @ref{974,,PyErr_SetExcInfo()}를 사용하십시오.
@end quotation
@end cartouche


Added in version 3.3.

@end deffn

@geindex PyErr_SetExcInfo (C function)
@anchor{c-api/exceptions c PyErr_SetExcInfo}@anchor{974}
@deffn {C 함수} void PyErr_SetExcInfo (PyObject *type, PyObject *value, PyObject *traceback)
` Part of the @ref{774,,안정 ABI} 버전 3.7 이후로.'
@code{sys.exc_info()}로 알려진 것과 같은, 예외 정보를 설정합니다. 이것은 새로 발생한 예외가 아니라, `이미 포착된' 예외를 가리킵니다. 이 함수는 인자의 참조를 훔칩니다. 예외 상태를 지우려면, 세 인자 모두에 @code{NULL}을 전달하십시오. 이 함수는 하위 호환성을 위해 유지됩니다. 대신 @ref{973,,PyErr_SetHandledException()}을 사용하십시오.

@cartouche
@quotation 참고 
이 함수는 일반적으로 예외를 처리하려는 코드에서 사용되지 않습니다. 오히려, 코드가 예외 상태를 임시로 저장하고 복원해야 할 때 사용할 수 있습니다. 예외 상태를 읽으려면 @ref{975,,PyErr_GetExcInfo()}를 사용하십시오.
@end quotation
@end cartouche


Added in version 3.3.



버전 3.11에서 변경: The @code{type} and @code{traceback} arguments are no longer used and
can be NULL. The interpreter now derives them from the exception
instance (the @code{value} argument). The function still steals
references of all three arguments.

@end deffn

@node 시그널 처리하기<2>,예외 클래스<2>,에러 표시기 조회하기,예외 처리
@anchor{c-api/exceptions signal-handling}@anchor{5236}
@subsection 시그널 처리하기


@geindex PyErr_CheckSignals (C function)
@anchor{c-api/exceptions c PyErr_CheckSignals}@anchor{692}
@deffn {C 함수} int PyErr_CheckSignals ()
` Part of the @ref{774,,안정 ABI}.'
@geindex 모듈;시그널
@geindex SIGINT (C 매크로)
@geindex KeyboardInterrupt (내장 예외)

Handle external interruptions, such as signals or activating a debugger,
whose processing has been delayed until it is safe
to run Python code and/or raise exceptions.

For example, pressing @code{Ctrl}-@code{C} causes a terminal to send the
@ref{253,,signal.SIGINT} signal.
This function executes the corresponding Python signal handler, which,
by default, raises the @ref{bc4,,KeyboardInterrupt} exception.

@code{PyErr_CheckSignals()} should be called by long-running C code
frequently enough so that the response appears immediate to humans.

Handlers invoked by this function currently include:


@itemize -

@item 
Signal handlers, including Python functions registered using
the @ref{cb,,signal} module.

Signal handlers are only run in the main thread of the main interpreter.

(This is where the function got the name: originally, signals
were the only way to interrupt the interpreter.)

@item 
Running the garbage collector, if necessary.

@item 
Executing a pending @ref{4965,,remote debugger} script.
@end itemize

If any handler raises an exception, immediately return @code{-1} with that
exception set.
Any remaining interruptions are left to be processed on the next
@ref{692,,PyErr_CheckSignals()} invocation, if appropriate.

If all handlers finish successfully, or there are no handlers to run,
return @code{0}.


버전 3.12에서 변경: This function may now invoke the garbage collector.



버전 3.14에서 변경: This function may now execute a remote debugger script, if remote
debugging is enabled.

@end deffn

@geindex PyErr_SetInterrupt (C function)
@anchor{c-api/exceptions c PyErr_SetInterrupt}@anchor{5015}
@deffn {C 함수} void PyErr_SetInterrupt ()
` Part of the @ref{774,,안정 ABI}.'
@geindex 모듈;시그널
@geindex SIGINT (C 매크로)
@geindex KeyboardInterrupt (내장 예외)

Simulate the effect of a @code{SIGINT} signal arriving.
This is equivalent to @code{PyErr_SetInterruptEx(SIGINT)}.

@cartouche
@quotation 참고 
This function is async-signal-safe.  It can be called without
an @ref{4f10,,attached thread state} and from a C signal handler.
@end quotation
@end cartouche
@end deffn

@geindex PyErr_SetInterruptEx (C function)
@anchor{c-api/exceptions c PyErr_SetInterruptEx}@anchor{a9e}
@deffn {C 함수} int PyErr_SetInterruptEx (int signum)
` Part of the @ref{774,,안정 ABI} 버전 3.10 이후로.'
@geindex 모듈;시그널
@geindex KeyboardInterrupt (내장 예외)

시그널 도착의 효과를 시뮬레이션합니다. 다음에 @ref{692,,PyErr_CheckSignals()}가 호출되면, 주어진 시그널 번호에 대한 파이썬 시그널 처리기가 호출됩니다.

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).

주어진 시그널이 파이썬에서 처리되지 않으면 (@ref{1bb0,,signal.SIG_DFL}이나 @ref{1baf,,signal.SIG_IGN}으로 설정되어서), 무시됩니다.

If `signum' is outside of the allowed range of signal numbers, @code{-1}
is returned.  Otherwise, @code{0} is returned.  The error indicator is
never changed by this function.

@cartouche
@quotation 참고 
This function is async-signal-safe.  It can be called without
an @ref{4f10,,attached thread state} and from a C signal handler.
@end quotation
@end cartouche


Added in version 3.10.

@end deffn

@geindex PySignal_SetWakeupFd (C function)
@anchor{c-api/exceptions c PySignal_SetWakeupFd}@anchor{15e0}
@deffn {C 함수} int PySignal_SetWakeupFd (int fd)

이 유틸리티 함수는 시그널이 수신될 때마다 시그널 번호가 단일 바이트로 기록되는 파일 기술자를 지정합니다. `fd'는 비 블로킹이어야 합니다. 이전의 파일 기술자를 반환합니다.

값 @code{-1}은 기능을 비활성화합니다; 이것이 초기 상태입니다. 이것은 파이썬의 @ref{d66,,signal.set_wakeup_fd()}와 동등하지만, 에러 검사는 없습니다. `fd'는 유효한 파일 기술자여야 합니다. 함수는 메인 스레드에서만 호출되어야 합니다.


버전 3.5에서 변경: 윈도우에서, 함수는 이제 소켓 핸들도 지원합니다.

@end deffn

@node 예외 클래스<2>,예외 객체,시그널 처리하기<2>,예외 처리
@anchor{c-api/exceptions exception-classes}@anchor{5237}
@subsection 예외 클래스


@geindex PyErr_NewException (C function)
@anchor{c-api/exceptions c PyErr_NewException}@anchor{146e}
@deffn {C 함수} @ref{5dc,,PyObject} *PyErr_NewException (const char *name, PyObject *base, PyObject *dict)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
이 유틸리티 함수는 새 예외 클래스를 만들고 반환합니다. `name' 인자는 새 예외의 이름, @code{module.classname} 형식의 C 문자열이어야 합니다. `base'와 `dict' 인자는 일반적으로 @code{NULL}입니다. 이렇게 하면 @ref{bcc,,Exception}(C에서 @ref{5030,,PyExc_Exception}으로 액세스할 수 있습니다)에서 파생된 클래스 객체가 만들어집니다.

새 클래스의 @ref{615,,__module__} 어트리뷰트는 `name' 인자의 첫 번째 부분(마지막 점까지)으로 설정되고, 클래스 이름은 마지막 부분(마지막 점 뒤)으로 설정됩니다. `base' 인자는 대체 베이스 클래스를 지정하는 데 사용할 수 있습니다; 하나의 클래스나 클래스의 튜플일 수 있습니다. `dict' 인자는 클래스 변수와 메서드의 딕셔너리를 지정하는 데 사용할 수 있습니다.
@end deffn

@geindex PyErr_NewExceptionWithDoc (C function)
@anchor{c-api/exceptions c PyErr_NewExceptionWithDoc}@anchor{146d}
@deffn {C 함수} @ref{5dc,,PyObject} *PyErr_NewExceptionWithDoc (const char *name, const char *doc, PyObject *base, PyObject *dict)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
새로운 예외 클래스에 독스트링을 쉽게 부여할 수 있다는 점을 제외하면 @ref{146e,,PyErr_NewException()}과 같습니다: `doc'이 @code{NULL}이 아니면, 예외 클래스에 대한 독스트링으로 사용됩니다.


Added in version 3.2.

@end deffn

@geindex PyExceptionClass_Check (C function)
@anchor{c-api/exceptions c PyExceptionClass_Check}@anchor{5238}
@deffn {C 함수} int PyExceptionClass_Check (PyObject *ob)

Return non-zero if `ob' is an exception class, zero otherwise. This function always succeeds.
@end deffn

@geindex PyExceptionClass_Name (C function)
@anchor{c-api/exceptions c PyExceptionClass_Name}@anchor{c5a}
@deffn {C 함수} const char *PyExceptionClass_Name (PyObject *ob)
` Part of the @ref{774,,안정 ABI} 버전 3.8 이후로.'
Return @ref{1cad,,tp_name} of the exception class `ob'.
@end deffn

@node 예외 객체,유니코드 예외 객체,예외 클래스<2>,예외 처리
@anchor{c-api/exceptions exception-objects}@anchor{5239}
@subsection 예외 객체


@geindex PyExceptionInstance_Check (C function)
@anchor{c-api/exceptions c PyExceptionInstance_Check}@anchor{523a}
@deffn {C 함수} int PyExceptionInstance_Check (PyObject *op)

Return true if `op' is an instance of @ref{7d6,,BaseException}, false
otherwise. This function always succeeds.
@end deffn

@geindex PyExceptionInstance_Class (C macro)
@anchor{c-api/exceptions c PyExceptionInstance_Class}@anchor{523b}
@deffn {C 매크로} PyExceptionInstance_Class (op)

Equivalent to @ref{3c9,,Py_TYPE(op)}.
@end deffn

@geindex PyException_GetTraceback (C function)
@anchor{c-api/exceptions c PyException_GetTraceback}@anchor{5060}
@deffn {C 함수} @ref{5dc,,PyObject} *PyException_GetTraceback (PyObject *ex)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
파이썬에서 @ref{14cb,,__traceback__} 어트리뷰트를 통해 액세스 할 수 있는 새로운 참조로 예외와 관련된 트레이스백을 반환합니다. 관련된 트레이스백이 없으면, @code{NULL}을 반환합니다.
@end deffn

@geindex PyException_SetTraceback (C function)
@anchor{c-api/exceptions c PyException_SetTraceback}@anchor{1dcb}
@deffn {C 함수} int PyException_SetTraceback (PyObject *ex, PyObject *tb)
` Part of the @ref{774,,안정 ABI}.'
예외와 관련된 트레이스백을 `tb'로 설정합니다. 지우려면 @code{Py_None}을 사용하십시오.
@end deffn

@geindex PyException_GetContext (C function)
@anchor{c-api/exceptions c PyException_GetContext}@anchor{505f}
@deffn {C 함수} @ref{5dc,,PyObject} *PyException_GetContext (PyObject *ex)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
파이썬에서 @ref{14cc,,__context__} 어트리뷰트를 통해 액세스 할 수 있는 새 참조로 예외와 연관된 컨텍스트(다른 예외 인스턴스, 이것을 처리하는 도중 `ex'가 발생했습니다)를 반환합니다. 연결된 컨텍스트가 없으면 @code{NULL}을 반환합니다.
@end deffn

@geindex PyException_SetContext (C function)
@anchor{c-api/exceptions c PyException_SetContext}@anchor{5062}
@deffn {C 함수} void PyException_SetContext (PyObject *ex, PyObject *ctx)
` Part of the @ref{774,,안정 ABI}.'
예외와 연관된 컨텍스트를 `ctx'로 설정합니다. 지우려면 @code{NULL}을 사용하십시오. `ctx'가 예외 인스턴스인지 확인하는 형 검사는 없습니다. 이것은 `ctx'에 대한 참조를 훔칩니다.
@end deffn

@geindex PyException_GetCause (C function)
@anchor{c-api/exceptions c PyException_GetCause}@anchor{505e}
@deffn {C 함수} @ref{5dc,,PyObject} *PyException_GetCause (PyObject *ex)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
파이썬에서 @ref{14cd,,__cause__} 어트리뷰트를 통해 액세스 할 수 있는 새 참조로 예외와 관련된 원인(예외 인스턴스나 @code{None}, @code{raise ... from ...}으로 설정됩니다)을 반환합니다.
@end deffn

@geindex PyException_SetCause (C function)
@anchor{c-api/exceptions c PyException_SetCause}@anchor{5061}
@deffn {C 함수} void PyException_SetCause (PyObject *ex, PyObject *cause)
` Part of the @ref{774,,안정 ABI}.'
예외와 관련된 원인을 `cause'로 설정합니다. 지우려면 @code{NULL}을 사용하십시오. `cause'가 예외 인스턴스나 @code{None}인지 확인하는 형 검사는 없습니다. 이것은 `cause'에 대한 참조를 훔칩니다.

@ref{2514,,__suppress_context__} 어트리뷰트는 이 함수에 의해 묵시적으로 @code{True}로 설정됩니다.
@end deffn

@geindex PyException_GetArgs (C function)
@anchor{c-api/exceptions c PyException_GetArgs}@anchor{78a}
@deffn {C 함수} @ref{5dc,,PyObject} *PyException_GetArgs (PyObject *ex)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI} 버전 3.12 이후로.'
Return @ref{78c,,args} of exception `ex'.
@end deffn

@geindex PyException_SetArgs (C function)
@anchor{c-api/exceptions c PyException_SetArgs}@anchor{78b}
@deffn {C 함수} void PyException_SetArgs (PyObject *ex, PyObject *args)
` Part of the @ref{774,,안정 ABI} 버전 3.12 이후로.'
Set @ref{78c,,args} of exception `ex' to `args'.
@end deffn

@geindex PyUnstable_Exc_PrepReraiseStar (C function)
@anchor{c-api/exceptions c PyUnstable_Exc_PrepReraiseStar}@anchor{523c}
@deffn {C 함수} @ref{5dc,,PyObject} *PyUnstable_Exc_PrepReraiseStar (PyObject *orig, PyObject *excs)

@cartouche
@quotation 이것은 불안정 API. It may change without warning in minor releases. `이것은 @ref{768,,불안정 API}. It may change without warning in minor releases.'
@end quotation
@end cartouche

Implement part of the interpreter’s implementation of @code{except*}.
`orig' is the original exception that was caught, and `excs' is the list of
the exceptions that need to be raised. This list contains the unhandled
part of `orig', if any, as well as the exceptions that were raised from the
@code{except*} clauses (so they have a different traceback from `orig') and
those that were reraised (and have the same traceback as `orig').
Return the @ref{4d3,,ExceptionGroup} that needs to be reraised in the end, or
@code{None} if there is nothing to reraise.


Added in version 3.12.

@end deffn

@node 유니코드 예외 객체,재귀 제어,예외 객체,예외 처리
@anchor{c-api/exceptions unicode-exception-objects}@anchor{523d}@anchor{c-api/exceptions unicodeexceptions}@anchor{461}
@subsection 유니코드 예외 객체


다음 함수는 C에서 유니코드 예외를 만들고 수정하는 데 사용됩니다.

@geindex PyUnicodeDecodeError_Create (C function)
@anchor{c-api/exceptions c PyUnicodeDecodeError_Create}@anchor{511c}
@deffn {C 함수} @ref{5dc,,PyObject} *PyUnicodeDecodeError_Create (const char *encoding, const char *object, Py_ssize_t length, Py_ssize_t start, Py_ssize_t end, const char *reason)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
`encoding', `object', `length', `start', `end' 및 `reason' 어트리뷰트를 사용하여 @ref{c07,,UnicodeDecodeError} 객체를 만듭니다. `encoding'과 `reason'은 UTF-8로 인코딩된 문자열입니다.
@end deffn

@geindex PyUnicodeDecodeError_GetEncoding (C function)
@geindex PyUnicodeEncodeError_GetEncoding (C function)
@anchor{c-api/exceptions c PyUnicodeDecodeError_GetEncoding}@anchor{511d}
@deffn {C 함수} @ref{5dc,,PyObject} *PyUnicodeDecodeError_GetEncoding (PyObject *exc)
@anchor{c-api/exceptions c PyUnicodeEncodeError_GetEncoding}@anchor{5125}
@deffnx {C 함수} @ref{5dc,,PyObject} *PyUnicodeEncodeError_GetEncoding (PyObject *exc)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
주어진 예외 객체의 `encoding' 어트리뷰트를 반환합니다.
@end deffn

@geindex PyUnicodeDecodeError_GetObject (C function)
@geindex PyUnicodeEncodeError_GetObject (C function)
@geindex PyUnicodeTranslateError_GetObject (C function)
@anchor{c-api/exceptions c PyUnicodeDecodeError_GetObject}@anchor{511f}
@deffn {C 함수} @ref{5dc,,PyObject} *PyUnicodeDecodeError_GetObject (PyObject *exc)
@anchor{c-api/exceptions c PyUnicodeEncodeError_GetObject}@anchor{5126}
@deffnx {C 함수} @ref{5dc,,PyObject} *PyUnicodeEncodeError_GetObject (PyObject *exc)
@anchor{c-api/exceptions c PyUnicodeTranslateError_GetObject}@anchor{512d}
@deffnx {C 함수} @ref{5dc,,PyObject} *PyUnicodeTranslateError_GetObject (PyObject *exc)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
주어진 예외 객체의 `object' 어트리뷰트를 반환합니다.
@end deffn

@geindex PyUnicodeDecodeError_GetStart (C function)
@geindex PyUnicodeEncodeError_GetStart (C function)
@geindex PyUnicodeTranslateError_GetStart (C function)
@anchor{c-api/exceptions c PyUnicodeDecodeError_GetStart}@anchor{5121}
@deffn {C 함수} int PyUnicodeDecodeError_GetStart (PyObject *exc, Py_ssize_t *start)
@anchor{c-api/exceptions c PyUnicodeEncodeError_GetStart}@anchor{18ff}
@deffnx {C 함수} int PyUnicodeEncodeError_GetStart (PyObject *exc, Py_ssize_t *start)
@anchor{c-api/exceptions c PyUnicodeTranslateError_GetStart}@anchor{512f}
@deffnx {C 함수} int PyUnicodeTranslateError_GetStart (PyObject *exc, Py_ssize_t *start)
` Part of the @ref{774,,안정 ABI}.'
주어진 예외 객체의 `start' 어트리뷰트를 가져와서 `*start'에 배치합니다. `start'는 @code{NULL}이 아니어야 합니다. 성공하면 @code{0}을, 실패하면 @code{-1}을 반환합니다.

If the @ref{18fd,,UnicodeError.object} is an empty sequence, the resulting
`start' is @code{0}. Otherwise, it is clipped to @code{[0, len(object) - 1]}.


@subsubheading 더 보기


@ref{18c1,,UnicodeError.start}

@end deffn

@geindex PyUnicodeDecodeError_SetStart (C function)
@geindex PyUnicodeEncodeError_SetStart (C function)
@geindex PyUnicodeTranslateError_SetStart (C function)
@anchor{c-api/exceptions c PyUnicodeDecodeError_SetStart}@anchor{5124}
@deffn {C 함수} int PyUnicodeDecodeError_SetStart (PyObject *exc, Py_ssize_t start)
@anchor{c-api/exceptions c PyUnicodeEncodeError_SetStart}@anchor{512a}
@deffnx {C 함수} int PyUnicodeEncodeError_SetStart (PyObject *exc, Py_ssize_t start)
@anchor{c-api/exceptions c PyUnicodeTranslateError_SetStart}@anchor{5132}
@deffnx {C 함수} int PyUnicodeTranslateError_SetStart (PyObject *exc, Py_ssize_t start)
` Part of the @ref{774,,안정 ABI}.'
Set the `start' attribute of the given exception object to `start'.
Return @code{0} on success, @code{-1} on failure.

@cartouche
@quotation 참고 
While passing a negative `start' does not raise an exception,
the corresponding getters will not consider it as a relative
offset.
@end quotation
@end cartouche
@end deffn

@geindex PyUnicodeDecodeError_GetEnd (C function)
@geindex PyUnicodeEncodeError_GetEnd (C function)
@geindex PyUnicodeTranslateError_GetEnd (C function)
@anchor{c-api/exceptions c PyUnicodeDecodeError_GetEnd}@anchor{511e}
@deffn {C 함수} int PyUnicodeDecodeError_GetEnd (PyObject *exc, Py_ssize_t *end)
@anchor{c-api/exceptions c PyUnicodeEncodeError_GetEnd}@anchor{18fc}
@deffnx {C 함수} int PyUnicodeEncodeError_GetEnd (PyObject *exc, Py_ssize_t *end)
@anchor{c-api/exceptions c PyUnicodeTranslateError_GetEnd}@anchor{512c}
@deffnx {C 함수} int PyUnicodeTranslateError_GetEnd (PyObject *exc, Py_ssize_t *end)
` Part of the @ref{774,,안정 ABI}.'
주어진 예외 객체의 `end' 어트리뷰트를 가져와서 `*end'에 배치합니다. `end'는 @code{NULL}이 아니어야 합니다. 성공하면 @code{0}을, 실패하면 @code{-1}을 반환합니다.

If the @ref{18fd,,UnicodeError.object} is an empty sequence, the resulting
`end' is @code{0}. Otherwise, it is clipped to @code{[1, len(object)]}.
@end deffn

@geindex PyUnicodeDecodeError_SetEnd (C function)
@geindex PyUnicodeEncodeError_SetEnd (C function)
@geindex PyUnicodeTranslateError_SetEnd (C function)
@anchor{c-api/exceptions c PyUnicodeDecodeError_SetEnd}@anchor{5122}
@deffn {C 함수} int PyUnicodeDecodeError_SetEnd (PyObject *exc, Py_ssize_t end)
@anchor{c-api/exceptions c PyUnicodeEncodeError_SetEnd}@anchor{5128}
@deffnx {C 함수} int PyUnicodeEncodeError_SetEnd (PyObject *exc, Py_ssize_t end)
@anchor{c-api/exceptions c PyUnicodeTranslateError_SetEnd}@anchor{5130}
@deffnx {C 함수} int PyUnicodeTranslateError_SetEnd (PyObject *exc, Py_ssize_t end)
` Part of the @ref{774,,안정 ABI}.'
주어진 예외 객체의 `end' 어트리뷰트를 `end'로 설정합니다. 성공하면 @code{0}을, 실패하면 @code{-1}을 반환합니다.


@subsubheading 더 보기


@ref{18c2,,UnicodeError.end}

@end deffn

@geindex PyUnicodeDecodeError_GetReason (C function)
@geindex PyUnicodeEncodeError_GetReason (C function)
@geindex PyUnicodeTranslateError_GetReason (C function)
@anchor{c-api/exceptions c PyUnicodeDecodeError_GetReason}@anchor{5120}
@deffn {C 함수} @ref{5dc,,PyObject} *PyUnicodeDecodeError_GetReason (PyObject *exc)
@anchor{c-api/exceptions c PyUnicodeEncodeError_GetReason}@anchor{5127}
@deffnx {C 함수} @ref{5dc,,PyObject} *PyUnicodeEncodeError_GetReason (PyObject *exc)
@anchor{c-api/exceptions c PyUnicodeTranslateError_GetReason}@anchor{512e}
@deffnx {C 함수} @ref{5dc,,PyObject} *PyUnicodeTranslateError_GetReason (PyObject *exc)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
주어진 예외 객체의 `reason' 어트리뷰트를 반환합니다.
@end deffn

@geindex PyUnicodeDecodeError_SetReason (C function)
@geindex PyUnicodeEncodeError_SetReason (C function)
@geindex PyUnicodeTranslateError_SetReason (C function)
@anchor{c-api/exceptions c PyUnicodeDecodeError_SetReason}@anchor{5123}
@deffn {C 함수} int PyUnicodeDecodeError_SetReason (PyObject *exc, const char *reason)
@anchor{c-api/exceptions c PyUnicodeEncodeError_SetReason}@anchor{5129}
@deffnx {C 함수} int PyUnicodeEncodeError_SetReason (PyObject *exc, const char *reason)
@anchor{c-api/exceptions c PyUnicodeTranslateError_SetReason}@anchor{5131}
@deffnx {C 함수} int PyUnicodeTranslateError_SetReason (PyObject *exc, const char *reason)
` Part of the @ref{774,,안정 ABI}.'
주어진 예외 객체의 `reason' 어트리뷰트를 `reason'으로 설정합니다. 성공하면 @code{0}을, 실패하면 @code{-1}을 반환합니다.
@end deffn

@node 재귀 제어,Exception and warning types,유니코드 예외 객체,예외 처리
@anchor{c-api/exceptions recursion}@anchor{523e}@anchor{c-api/exceptions recursion-control}@anchor{523f}
@subsection 재귀 제어


이 두 함수는 코어와 확장 모듈 모두에서 C 수준에서 안전한 재귀 호출을 수행하는 방법을 제공합니다. 재귀 코드가 반드시 파이썬 코드를 호출하지 않는 경우 필요합니다 (파이썬 코드는 재귀 깊이를 자동으로 추적합니다). @ref{7a2,,호출 프로토콜}이 재귀 처리를 처리하기 때문에 `tp_call' 구현에도 필요하지 않습니다.

@geindex Py_EnterRecursiveCall (C function)
@anchor{c-api/exceptions c Py_EnterRecursiveCall}@anchor{3d2}
@deffn {C 함수} int Py_EnterRecursiveCall (const char *where)
` Part of the @ref{774,,안정 ABI} 버전 3.9 이후로.'
재귀적 C 수준 호출이 막 수행되려고 하는 지점을 표시합니다.

The function then checks if the stack limit is reached.  If this is the
case, a @ref{f67,,RecursionError} is set and a nonzero value is returned.
Otherwise, zero is returned.

`where'는 재귀 깊이 제한으로 인한 @ref{f67,,RecursionError} 메시지에 이어붙일 @code{" in instance check"}와 같은 UTF-8 인코딩된 문자열이어야 합니다.


@subsubheading 더 보기


The @ref{466,,PyUnstable_ThreadState_SetStackProtection()} function.



버전 3.9에서 변경: 이 함수는 이제 @ref{635,,제한된 API}에서도 사용할 수 있습니다.

@end deffn

@geindex Py_LeaveRecursiveCall (C function)
@anchor{c-api/exceptions c Py_LeaveRecursiveCall}@anchor{b6b}
@deffn {C 함수} void Py_LeaveRecursiveCall (void)
` Part of the @ref{774,,안정 ABI} 버전 3.9 이후로.'
@ref{3d2,,Py_EnterRecursiveCall()} 을 종료합니다. @code{Py_EnterRecursiveCall()} 의 각 `성공적인' 호출마다 한 번씩 호출되어야 합니다.


버전 3.9에서 변경: 이 함수는 이제 @ref{635,,제한된 API}에서도 사용할 수 있습니다.

@end deffn

컨테이너형에 대해 @ref{4f23,,tp_repr}을 올바르게 구현하려면 특별한 재귀 처리가 필요합니다. 스택을 보호하는 것 외에도, @code{tp_repr}은 순환을 방지하기 위해 객체를 추적해야 합니다. 다음 두 함수는 이 기능을 쉽게 만듭니다. 사실상, 이들은 @ref{13f8,,reprlib.recursive_repr()}에 대한 C 동등물입니다.

@geindex Py_ReprEnter (C function)
@anchor{c-api/exceptions c Py_ReprEnter}@anchor{5174}
@deffn {C 함수} int Py_ReprEnter (PyObject *object)
` Part of the @ref{774,,안정 ABI}.'
순환을 감지하기 위해 @ref{4f23,,tp_repr} 구현 시작 시 호출됩니다.

객체가 이미 처리되었으면, 함수는 양의 정수를 반환합니다. 이 경우 @ref{4f23,,tp_repr} 구현은 순환을 나타내는 문자열 객체를 반환해야 합니다. 예를 들어, @ref{183,,dict} 객체는 @code{@{...@}}를 반환하고 @ref{24d,,list} 객체는 @code{[...]}를 반환합니다.

재귀 제한에 도달하면 함수는 음의 정수를 반환합니다. 이 경우 @ref{4f23,,tp_repr} 구현은 일반적으로 @code{NULL}을 반환해야 합니다.

그렇지 않으면, 함수는 0을 반환하고 @ref{4f23,,tp_repr} 구현은 정상적으로 계속될 수 있습니다.
@end deffn

@geindex Py_ReprLeave (C function)
@anchor{c-api/exceptions c Py_ReprLeave}@anchor{5175}
@deffn {C 함수} void Py_ReprLeave (PyObject *object)
` Part of the @ref{774,,안정 ABI}.'
@ref{5174,,Py_ReprEnter()}를 종료합니다. 0을 반환하는 @code{Py_ReprEnter()} 호출마다 한 번씩 호출해야 합니다.
@end deffn

@geindex Py_GetRecursionLimit (C function)
@anchor{c-api/exceptions c Py_GetRecursionLimit}@anchor{516f}
@deffn {C 함수} int Py_GetRecursionLimit (void)
` Part of the @ref{774,,안정 ABI}.'
Get the recursion limit for the current interpreter. It can be set with
@ref{5176,,Py_SetRecursionLimit()}. The recursion limit prevents the
Python interpreter stack from growing infinitely.

This function cannot fail, and the caller must hold an
@ref{4f10,,attached thread state}.


@subsubheading 더 보기


@ref{6ea,,sys.getrecursionlimit()}

@end deffn

@geindex Py_SetRecursionLimit (C function)
@anchor{c-api/exceptions c Py_SetRecursionLimit}@anchor{5176}
@deffn {C 함수} void Py_SetRecursionLimit (int new_limit)
` Part of the @ref{774,,안정 ABI}.'
Set the recursion limit for the current interpreter.

This function cannot fail, and the caller must hold an
@ref{4f10,,attached thread state}.


@subsubheading 더 보기


@ref{6e9,,sys.setrecursionlimit()}

@end deffn

@node Exception and warning types,Tracebacks,재귀 제어,예외 처리
@anchor{c-api/exceptions exception-and-warning-types}@anchor{5240}@anchor{c-api/exceptions standardexceptions}@anchor{5241}
@subsection Exception and warning types


All standard Python exceptions and warning categories are available as global
variables whose names are @code{PyExc_} followed by the Python exception name.
These have the type @ref{5dc,,PyObject}*; they are all class objects.

For completeness, here are all the variables:

@menu
* Exception types:: 
* OSError aliases:: 
* Warning types:: 

@end menu

@node Exception types,OSError aliases,,Exception and warning types
@anchor{c-api/exceptions exception-types}@anchor{5242}
@subsubsection Exception types



@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

C name

@tab

Python name

@item

@geindex PyExc_BaseException (C var)
@anchor{c-api/exceptions c PyExc_BaseException}@anchor{5021}
@deffn {C 변수} @ref{5dc,,PyObject} *PyExc_BaseException
` Part of the @ref{774,,안정 ABI}.'
@end deffn

@tab

@ref{7d6,,BaseException}

@item

@geindex PyExc_BaseExceptionGroup (C var)
@anchor{c-api/exceptions c PyExc_BaseExceptionGroup}@anchor{5022}
@deffn {C 변수} @ref{5dc,,PyObject} *PyExc_BaseExceptionGroup
` Part of the @ref{774,,안정 ABI} 버전 3.11 이후로.'
@end deffn

@tab

@ref{564,,BaseExceptionGroup}

@item

@geindex PyExc_Exception (C var)
@anchor{c-api/exceptions c PyExc_Exception}@anchor{5030}
@deffn {C 변수} @ref{5dc,,PyObject} *PyExc_Exception
` Part of the @ref{774,,안정 ABI}.'
@end deffn

@tab

@ref{bcc,,Exception}

@item

@geindex PyExc_ArithmeticError (C var)
@anchor{c-api/exceptions c PyExc_ArithmeticError}@anchor{501e}
@deffn {C 변수} @ref{5dc,,PyObject} *PyExc_ArithmeticError
` Part of the @ref{774,,안정 ABI}.'
@end deffn

@tab

@ref{26eb,,ArithmeticError}

@item

@geindex PyExc_AssertionError (C var)
@anchor{c-api/exceptions c PyExc_AssertionError}@anchor{501f}
@deffn {C 변수} @ref{5dc,,PyObject} *PyExc_AssertionError
` Part of the @ref{774,,안정 ABI}.'
@end deffn

@tab

@ref{8b7,,AssertionError}

@item

@geindex PyExc_AttributeError (C var)
@anchor{c-api/exceptions c PyExc_AttributeError}@anchor{5020}
@deffn {C 변수} @ref{5dc,,PyObject} *PyExc_AttributeError
` Part of the @ref{774,,안정 ABI}.'
@end deffn

@tab

@ref{5ee,,AttributeError}

@item

@geindex PyExc_BlockingIOError (C var)
@anchor{c-api/exceptions c PyExc_BlockingIOError}@anchor{5023}
@deffn {C 변수} @ref{5dc,,PyObject} *PyExc_BlockingIOError
` Part of the @ref{774,,안정 ABI} 버전 3.7 이후로.'
@end deffn

@tab

@ref{235,,BlockingIOError}

@item

@geindex PyExc_BrokenPipeError (C var)
@anchor{c-api/exceptions c PyExc_BrokenPipeError}@anchor{5024}
@deffn {C 변수} @ref{5dc,,PyObject} *PyExc_BrokenPipeError
` Part of the @ref{774,,안정 ABI} 버전 3.7 이후로.'
@end deffn

@tab

@ref{125b,,BrokenPipeError}

@item

@geindex PyExc_BufferError (C var)
@anchor{c-api/exceptions c PyExc_BufferError}@anchor{5025}
@deffn {C 변수} @ref{5dc,,PyObject} *PyExc_BufferError
` Part of the @ref{774,,안정 ABI}.'
@end deffn

@tab

@ref{179f,,BufferError}

@item

@geindex PyExc_ChildProcessError (C var)
@anchor{c-api/exceptions c PyExc_ChildProcessError}@anchor{5027}
@deffn {C 변수} @ref{5dc,,PyObject} *PyExc_ChildProcessError
` Part of the @ref{774,,안정 ABI} 버전 3.7 이후로.'
@end deffn

@tab

@ref{1257,,ChildProcessError}

@item

@geindex PyExc_ConnectionAbortedError (C var)
@anchor{c-api/exceptions c PyExc_ConnectionAbortedError}@anchor{5028}
@deffn {C 변수} @ref{5dc,,PyObject} *PyExc_ConnectionAbortedError
` Part of the @ref{774,,안정 ABI} 버전 3.7 이후로.'
@end deffn

@tab

@ref{125c,,ConnectionAbortedError}

@item

@geindex PyExc_ConnectionError (C var)
@anchor{c-api/exceptions c PyExc_ConnectionError}@anchor{5029}
@deffn {C 변수} @ref{5dc,,PyObject} *PyExc_ConnectionError
` Part of the @ref{774,,안정 ABI} 버전 3.7 이후로.'
@end deffn

@tab

@ref{100a,,ConnectionError}

@item

@geindex PyExc_ConnectionRefusedError (C var)
@anchor{c-api/exceptions c PyExc_ConnectionRefusedError}@anchor{502a}
@deffn {C 변수} @ref{5dc,,PyObject} *PyExc_ConnectionRefusedError
` Part of the @ref{774,,안정 ABI} 버전 3.7 이후로.'
@end deffn

@tab

@ref{125d,,ConnectionRefusedError}

@item

@geindex PyExc_ConnectionResetError (C var)
@anchor{c-api/exceptions c PyExc_ConnectionResetError}@anchor{502b}
@deffn {C 변수} @ref{5dc,,PyObject} *PyExc_ConnectionResetError
` Part of the @ref{774,,안정 ABI} 버전 3.7 이후로.'
@end deffn

@tab

@ref{125e,,ConnectionResetError}

@item

@geindex PyExc_EOFError (C var)
@anchor{c-api/exceptions c PyExc_EOFError}@anchor{502d}
@deffn {C 변수} @ref{5dc,,PyObject} *PyExc_EOFError
` Part of the @ref{774,,안정 ABI}.'
@end deffn

@tab

@ref{14de,,EOFError}

@item

@geindex PyExc_FileExistsError (C var)
@anchor{c-api/exceptions c PyExc_FileExistsError}@anchor{5031}
@deffn {C 변수} @ref{5dc,,PyObject} *PyExc_FileExistsError
` Part of the @ref{774,,안정 ABI} 버전 3.7 이후로.'
@end deffn

@tab

@ref{121f,,FileExistsError}

@item

@geindex PyExc_FileNotFoundError (C var)
@anchor{c-api/exceptions c PyExc_FileNotFoundError}@anchor{5032}
@deffn {C 변수} @ref{5dc,,PyObject} *PyExc_FileNotFoundError
` Part of the @ref{774,,안정 ABI} 버전 3.7 이후로.'
@end deffn

@tab

@ref{264,,FileNotFoundError}

@item

@geindex PyExc_FloatingPointError (C var)
@anchor{c-api/exceptions c PyExc_FloatingPointError}@anchor{5033}
@deffn {C 변수} @ref{5dc,,PyObject} *PyExc_FloatingPointError
` Part of the @ref{774,,안정 ABI}.'
@end deffn

@tab

@ref{26ec,,FloatingPointError}

@item

@geindex PyExc_GeneratorExit (C var)
@anchor{c-api/exceptions c PyExc_GeneratorExit}@anchor{5035}
@deffn {C 변수} @ref{5dc,,PyObject} *PyExc_GeneratorExit
` Part of the @ref{774,,안정 ABI}.'
@end deffn

@tab

@ref{15cc,,GeneratorExit}

@item

@geindex PyExc_ImportError (C var)
@anchor{c-api/exceptions c PyExc_ImportError}@anchor{5037}
@deffn {C 변수} @ref{5dc,,PyObject} *PyExc_ImportError
` Part of the @ref{774,,안정 ABI}.'
@end deffn

@tab

@ref{659,,ImportError}

@item

@geindex PyExc_IndentationError (C var)
@anchor{c-api/exceptions c PyExc_IndentationError}@anchor{5039}
@deffn {C 변수} @ref{5dc,,PyObject} *PyExc_IndentationError
` Part of the @ref{774,,안정 ABI}.'
@end deffn

@tab

@ref{9ab,,IndentationError}

@item

@geindex PyExc_IndexError (C var)
@anchor{c-api/exceptions c PyExc_IndexError}@anchor{503a}
@deffn {C 변수} @ref{5dc,,PyObject} *PyExc_IndexError
` Part of the @ref{774,,안정 ABI}.'
@end deffn

@tab

@ref{173a,,IndexError}

@item

@geindex PyExc_InterruptedError (C var)
@anchor{c-api/exceptions c PyExc_InterruptedError}@anchor{503b}
@deffn {C 변수} @ref{5dc,,PyObject} *PyExc_InterruptedError
` Part of the @ref{774,,안정 ABI} 버전 3.7 이후로.'
@end deffn

@tab

@ref{f87,,InterruptedError}

@item

@geindex PyExc_IsADirectoryError (C var)
@anchor{c-api/exceptions c PyExc_IsADirectoryError}@anchor{503c}
@deffn {C 변수} @ref{5dc,,PyObject} *PyExc_IsADirectoryError
` Part of the @ref{774,,안정 ABI} 버전 3.7 이후로.'
@end deffn

@tab

@ref{1258,,IsADirectoryError}

@item

@geindex PyExc_KeyError (C var)
@anchor{c-api/exceptions c PyExc_KeyError}@anchor{503d}
@deffn {C 변수} @ref{5dc,,PyObject} *PyExc_KeyError
` Part of the @ref{774,,안정 ABI}.'
@end deffn

@tab

@ref{5e5,,KeyError}

@item

@geindex PyExc_KeyboardInterrupt (C var)
@anchor{c-api/exceptions c PyExc_KeyboardInterrupt}@anchor{503e}
@deffn {C 변수} @ref{5dc,,PyObject} *PyExc_KeyboardInterrupt
` Part of the @ref{774,,안정 ABI}.'
@end deffn

@tab

@ref{bc4,,KeyboardInterrupt}

@item

@geindex PyExc_LookupError (C var)
@anchor{c-api/exceptions c PyExc_LookupError}@anchor{503f}
@deffn {C 변수} @ref{5dc,,PyObject} *PyExc_LookupError
` Part of the @ref{774,,안정 ABI}.'
@end deffn

@tab

@ref{23e5,,LookupError}

@item

@geindex PyExc_MemoryError (C var)
@anchor{c-api/exceptions c PyExc_MemoryError}@anchor{5040}
@deffn {C 변수} @ref{5dc,,PyObject} *PyExc_MemoryError
` Part of the @ref{774,,안정 ABI}.'
@end deffn

@tab

@ref{175f,,MemoryError}

@item

@geindex PyExc_ModuleNotFoundError (C var)
@anchor{c-api/exceptions c PyExc_ModuleNotFoundError}@anchor{5041}
@deffn {C 변수} @ref{5dc,,PyObject} *PyExc_ModuleNotFoundError
` Part of the @ref{774,,안정 ABI} 버전 3.6 이후로.'
@end deffn

@tab

@ref{d3c,,ModuleNotFoundError}

@item

@geindex PyExc_NameError (C var)
@anchor{c-api/exceptions c PyExc_NameError}@anchor{5042}
@deffn {C 변수} @ref{5dc,,PyObject} *PyExc_NameError
` Part of the @ref{774,,안정 ABI}.'
@end deffn

@tab

@ref{452,,NameError}

@item

@geindex PyExc_NotADirectoryError (C var)
@anchor{c-api/exceptions c PyExc_NotADirectoryError}@anchor{5043}
@deffn {C 변수} @ref{5dc,,PyObject} *PyExc_NotADirectoryError
` Part of the @ref{774,,안정 ABI} 버전 3.7 이후로.'
@end deffn

@tab

@ref{1259,,NotADirectoryError}

@item

@geindex PyExc_NotImplementedError (C var)
@anchor{c-api/exceptions c PyExc_NotImplementedError}@anchor{5044}
@deffn {C 변수} @ref{5dc,,PyObject} *PyExc_NotImplementedError
` Part of the @ref{774,,안정 ABI}.'
@end deffn

@tab

@ref{36b,,NotImplementedError}

@item

@geindex PyExc_OSError (C var)
@anchor{c-api/exceptions c PyExc_OSError}@anchor{4eda}
@deffn {C 변수} @ref{5dc,,PyObject} *PyExc_OSError
` Part of the @ref{774,,안정 ABI}.'
@end deffn

@tab

@ref{2c0,,OSError}

@item

@geindex PyExc_OverflowError (C var)
@anchor{c-api/exceptions c PyExc_OverflowError}@anchor{5045}
@deffn {C 변수} @ref{5dc,,PyObject} *PyExc_OverflowError
` Part of the @ref{774,,안정 ABI}.'
@end deffn

@tab

@ref{a81,,OverflowError}

@item

@geindex PyExc_PermissionError (C var)
@anchor{c-api/exceptions c PyExc_PermissionError}@anchor{5047}
@deffn {C 변수} @ref{5dc,,PyObject} *PyExc_PermissionError
` Part of the @ref{774,,안정 ABI} 버전 3.7 이후로.'
@end deffn

@tab

@ref{f3d,,PermissionError}

@item

@geindex PyExc_ProcessLookupError (C var)
@anchor{c-api/exceptions c PyExc_ProcessLookupError}@anchor{5048}
@deffn {C 변수} @ref{5dc,,PyObject} *PyExc_ProcessLookupError
` Part of the @ref{774,,안정 ABI} 버전 3.7 이후로.'
@end deffn

@tab

@ref{125a,,ProcessLookupError}

@item

@geindex PyExc_PythonFinalizationError (C var)
@anchor{c-api/exceptions c PyExc_PythonFinalizationError}@anchor{5243}
@deffn {C 변수} @ref{5dc,,PyObject} *PyExc_PythonFinalizationError
@end deffn

@tab

@ref{479,,PythonFinalizationError}

@item

@geindex PyExc_RecursionError (C var)
@anchor{c-api/exceptions c PyExc_RecursionError}@anchor{10b1}
@deffn {C 변수} @ref{5dc,,PyObject} *PyExc_RecursionError
` Part of the @ref{774,,안정 ABI} 버전 3.7 이후로.'
@end deffn

@tab

@ref{f67,,RecursionError}

@item

@geindex PyExc_ReferenceError (C var)
@anchor{c-api/exceptions c PyExc_ReferenceError}@anchor{5049}
@deffn {C 변수} @ref{5dc,,PyObject} *PyExc_ReferenceError
` Part of the @ref{774,,안정 ABI}.'
@end deffn

@tab

@ref{1712,,ReferenceError}

@item

@geindex PyExc_RuntimeError (C var)
@anchor{c-api/exceptions c PyExc_RuntimeError}@anchor{504b}
@deffn {C 변수} @ref{5dc,,PyObject} *PyExc_RuntimeError
` Part of the @ref{774,,안정 ABI}.'
@end deffn

@tab

@ref{244,,RuntimeError}

@item

@geindex PyExc_StopAsyncIteration (C var)
@anchor{c-api/exceptions c PyExc_StopAsyncIteration}@anchor{504d}
@deffn {C 변수} @ref{5dc,,PyObject} *PyExc_StopAsyncIteration
` Part of the @ref{774,,안정 ABI} 버전 3.7 이후로.'
@end deffn

@tab

@ref{1e0c,,StopAsyncIteration}

@item

@geindex PyExc_StopIteration (C var)
@anchor{c-api/exceptions c PyExc_StopIteration}@anchor{504e}
@deffn {C 변수} @ref{5dc,,PyObject} *PyExc_StopIteration
` Part of the @ref{774,,안정 ABI}.'
@end deffn

@tab

@ref{df4,,StopIteration}

@item

@geindex PyExc_SyntaxError (C var)
@anchor{c-api/exceptions c PyExc_SyntaxError}@anchor{504f}
@deffn {C 변수} @ref{5dc,,PyObject} *PyExc_SyntaxError
` Part of the @ref{774,,안정 ABI}.'
@end deffn

@tab

@ref{18e,,SyntaxError}

@item

@geindex PyExc_SystemError (C var)
@anchor{c-api/exceptions c PyExc_SystemError}@anchor{5051}
@deffn {C 변수} @ref{5dc,,PyObject} *PyExc_SystemError
` Part of the @ref{774,,안정 ABI}.'
@end deffn

@tab

@ref{794,,SystemError}

@item

@geindex PyExc_SystemExit (C var)
@anchor{c-api/exceptions c PyExc_SystemExit}@anchor{5052}
@deffn {C 변수} @ref{5dc,,PyObject} *PyExc_SystemExit
` Part of the @ref{774,,안정 ABI}.'
@end deffn

@tab

@ref{f3b,,SystemExit}

@item

@geindex PyExc_TabError (C var)
@anchor{c-api/exceptions c PyExc_TabError}@anchor{5053}
@deffn {C 변수} @ref{5dc,,PyObject} *PyExc_TabError
` Part of the @ref{774,,안정 ABI}.'
@end deffn

@tab

@ref{764,,TabError}

@item

@geindex PyExc_TimeoutError (C var)
@anchor{c-api/exceptions c PyExc_TimeoutError}@anchor{5054}
@deffn {C 변수} @ref{5dc,,PyObject} *PyExc_TimeoutError
` Part of the @ref{774,,안정 ABI} 버전 3.7 이후로.'
@end deffn

@tab

@ref{a36,,TimeoutError}

@item

@geindex PyExc_TypeError (C var)
@anchor{c-api/exceptions c PyExc_TypeError}@anchor{4ed9}
@deffn {C 변수} @ref{5dc,,PyObject} *PyExc_TypeError
` Part of the @ref{774,,안정 ABI}.'
@end deffn

@tab

@ref{198,,TypeError}

@item

@geindex PyExc_UnboundLocalError (C var)
@anchor{c-api/exceptions c PyExc_UnboundLocalError}@anchor{5055}
@deffn {C 변수} @ref{5dc,,PyObject} *PyExc_UnboundLocalError
` Part of the @ref{774,,안정 ABI}.'
@end deffn

@tab

@ref{173b,,UnboundLocalError}

@item

@geindex PyExc_UnicodeDecodeError (C var)
@anchor{c-api/exceptions c PyExc_UnicodeDecodeError}@anchor{5056}
@deffn {C 변수} @ref{5dc,,PyObject} *PyExc_UnicodeDecodeError
` Part of the @ref{774,,안정 ABI}.'
@end deffn

@tab

@ref{c07,,UnicodeDecodeError}

@item

@geindex PyExc_UnicodeEncodeError (C var)
@anchor{c-api/exceptions c PyExc_UnicodeEncodeError}@anchor{5057}
@deffn {C 변수} @ref{5dc,,PyObject} *PyExc_UnicodeEncodeError
` Part of the @ref{774,,안정 ABI}.'
@end deffn

@tab

@ref{886,,UnicodeEncodeError}

@item

@geindex PyExc_UnicodeError (C var)
@anchor{c-api/exceptions c PyExc_UnicodeError}@anchor{5058}
@deffn {C 변수} @ref{5dc,,PyObject} *PyExc_UnicodeError
` Part of the @ref{774,,안정 ABI}.'
@end deffn

@tab

@ref{462,,UnicodeError}

@item

@geindex PyExc_UnicodeTranslateError (C var)
@anchor{c-api/exceptions c PyExc_UnicodeTranslateError}@anchor{5059}
@deffn {C 변수} @ref{5dc,,PyObject} *PyExc_UnicodeTranslateError
` Part of the @ref{774,,안정 ABI}.'
@end deffn

@tab

@ref{18fe,,UnicodeTranslateError}

@item

@geindex PyExc_ValueError (C var)
@anchor{c-api/exceptions c PyExc_ValueError}@anchor{4edb}
@deffn {C 변수} @ref{5dc,,PyObject} *PyExc_ValueError
` Part of the @ref{774,,안정 ABI}.'
@end deffn

@tab

@ref{2ec,,ValueError}

@item

@geindex PyExc_ZeroDivisionError (C var)
@anchor{c-api/exceptions c PyExc_ZeroDivisionError}@anchor{4ed6}
@deffn {C 변수} @ref{5dc,,PyObject} *PyExc_ZeroDivisionError
` Part of the @ref{774,,안정 ABI}.'
@end deffn

@tab

@ref{b3f,,ZeroDivisionError}

@end multitable



Added in version 3.3: @ref{5023,,PyExc_BlockingIOError}, @ref{5024,,PyExc_BrokenPipeError}, @ref{5027,,PyExc_ChildProcessError}, @ref{5029,,PyExc_ConnectionError}, @ref{5028,,PyExc_ConnectionAbortedError}, @ref{502a,,PyExc_ConnectionRefusedError}, @ref{502b,,PyExc_ConnectionResetError}, @ref{5031,,PyExc_FileExistsError}, @ref{5032,,PyExc_FileNotFoundError}, @ref{503b,,PyExc_InterruptedError}, @ref{503c,,PyExc_IsADirectoryError}, @ref{5043,,PyExc_NotADirectoryError}, @ref{5047,,PyExc_PermissionError}, @ref{5048,,PyExc_ProcessLookupError} 및 @ref{5054,,PyExc_TimeoutError}는 
@geindex Python 향상 제안; PEP 3151
PEP 3151@footnote{https://peps.python.org/pep-3151/}을 따라 도입되었습니다.



Added in version 3.5: @ref{504d,,PyExc_StopAsyncIteration} 과 @ref{10b1,,PyExc_RecursionError}.



Added in version 3.6: @ref{5041,,PyExc_ModuleNotFoundError}.



Added in version 3.11: @ref{5022,,PyExc_BaseExceptionGroup}.


@node OSError aliases,Warning types,Exception types,Exception and warning types
@anchor{c-api/exceptions oserror-aliases}@anchor{5244}
@subsubsection OSError aliases


The following are a compatibility aliases to @ref{4eda,,PyExc_OSError}.


버전 3.3에서 변경: 이러한 별칭은 별도의 예외 형이었습니다.



@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

C name

@tab

Python name

@tab

노트

@item

@geindex PyExc_EnvironmentError (C var)
@anchor{c-api/exceptions c PyExc_EnvironmentError}@anchor{502f}
@deffn {C 변수} @ref{5dc,,PyObject} *PyExc_EnvironmentError
` Part of the @ref{774,,안정 ABI}.'
@end deffn

@tab

@ref{2c0,,OSError}

@tab

@item

@geindex PyExc_IOError (C var)
@anchor{c-api/exceptions c PyExc_IOError}@anchor{5036}
@deffn {C 변수} @ref{5dc,,PyObject} *PyExc_IOError
` Part of the @ref{774,,안정 ABI}.'
@end deffn

@tab

@ref{2c0,,OSError}

@tab

@item

@geindex PyExc_WindowsError (C var)
@anchor{c-api/exceptions c PyExc_WindowsError}@anchor{505d}
@deffn {C 변수} @ref{5dc,,PyObject} *PyExc_WindowsError
` Part of the @ref{774,,안정 ABI} on Windows 버전 3.7 이후로.'
@end deffn

@tab

@ref{2c0,,OSError}

@tab

@ref{5245,,[win]}

@end multitable


노트:

@anchor{c-api/exceptions win}@anchor{5245}@w{(win)} 
@code{PyExc_WindowsError} is only defined on Windows; protect code that uses this by testing that the preprocessor macro @code{MS_WINDOWS} is defined.

@node Warning types,,OSError aliases,Exception and warning types
@anchor{c-api/exceptions standardwarningcategories}@anchor{5232}@anchor{c-api/exceptions warning-types}@anchor{5246}
@subsubsection Warning types



@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

C name

@tab

Python name

@item

@geindex PyExc_Warning (C var)
@anchor{c-api/exceptions c PyExc_Warning}@anchor{505c}
@deffn {C 변수} @ref{5dc,,PyObject} *PyExc_Warning
` Part of the @ref{774,,안정 ABI}.'
@end deffn

@tab

@ref{2718,,Warning}

@item

@geindex PyExc_BytesWarning (C var)
@anchor{c-api/exceptions c PyExc_BytesWarning}@anchor{5026}
@deffn {C 변수} @ref{5dc,,PyObject} *PyExc_BytesWarning
` Part of the @ref{774,,안정 ABI}.'
@end deffn

@tab

@ref{e1b,,BytesWarning}

@item

@geindex PyExc_DeprecationWarning (C var)
@anchor{c-api/exceptions c PyExc_DeprecationWarning}@anchor{502c}
@deffn {C 변수} @ref{5dc,,PyObject} *PyExc_DeprecationWarning
` Part of the @ref{774,,안정 ABI}.'
@end deffn

@tab

@ref{1a3,,DeprecationWarning}

@item

@geindex PyExc_EncodingWarning (C var)
@anchor{c-api/exceptions c PyExc_EncodingWarning}@anchor{502e}
@deffn {C 변수} @ref{5dc,,PyObject} *PyExc_EncodingWarning
` Part of the @ref{774,,안정 ABI} 버전 3.10 이후로.'
@end deffn

@tab

@ref{212b,,EncodingWarning}

@item

@geindex PyExc_FutureWarning (C var)
@anchor{c-api/exceptions c PyExc_FutureWarning}@anchor{5034}
@deffn {C 변수} @ref{5dc,,PyObject} *PyExc_FutureWarning
` Part of the @ref{774,,안정 ABI}.'
@end deffn

@tab

@ref{657,,FutureWarning}

@item

@geindex PyExc_ImportWarning (C var)
@anchor{c-api/exceptions c PyExc_ImportWarning}@anchor{5038}
@deffn {C 변수} @ref{5dc,,PyObject} *PyExc_ImportWarning
` Part of the @ref{774,,안정 ABI}.'
@end deffn

@tab

@ref{71d,,ImportWarning}

@item

@geindex PyExc_PendingDeprecationWarning (C var)
@anchor{c-api/exceptions c PyExc_PendingDeprecationWarning}@anchor{5046}
@deffn {C 변수} @ref{5dc,,PyObject} *PyExc_PendingDeprecationWarning
` Part of the @ref{774,,안정 ABI}.'
@end deffn

@tab

@ref{ac6,,PendingDeprecationWarning}

@item

@geindex PyExc_ResourceWarning (C var)
@anchor{c-api/exceptions c PyExc_ResourceWarning}@anchor{504a}
@deffn {C 변수} @ref{5dc,,PyObject} *PyExc_ResourceWarning
` Part of the @ref{774,,안정 ABI} 버전 3.7 이후로.'
@end deffn

@tab

@ref{54e,,ResourceWarning}

@item

@geindex PyExc_RuntimeWarning (C var)
@anchor{c-api/exceptions c PyExc_RuntimeWarning}@anchor{504c}
@deffn {C 변수} @ref{5dc,,PyObject} *PyExc_RuntimeWarning
` Part of the @ref{774,,안정 ABI}.'
@end deffn

@tab

@ref{4d8,,RuntimeWarning}

@item

@geindex PyExc_SyntaxWarning (C var)
@anchor{c-api/exceptions c PyExc_SyntaxWarning}@anchor{5050}
@deffn {C 변수} @ref{5dc,,PyObject} *PyExc_SyntaxWarning
` Part of the @ref{774,,안정 ABI}.'
@end deffn

@tab

@ref{1ae,,SyntaxWarning}

@item

@geindex PyExc_UnicodeWarning (C var)
@anchor{c-api/exceptions c PyExc_UnicodeWarning}@anchor{505a}
@deffn {C 변수} @ref{5dc,,PyObject} *PyExc_UnicodeWarning
` Part of the @ref{774,,안정 ABI}.'
@end deffn

@tab

@ref{1629,,UnicodeWarning}

@item

@geindex PyExc_UserWarning (C var)
@anchor{c-api/exceptions c PyExc_UserWarning}@anchor{505b}
@deffn {C 변수} @ref{5dc,,PyObject} *PyExc_UserWarning
` Part of the @ref{774,,안정 ABI}.'
@end deffn

@tab

@ref{2719,,UserWarning}

@end multitable



Added in version 3.2: @ref{504a,,PyExc_ResourceWarning}.



Added in version 3.10: @ref{502e,,PyExc_EncodingWarning}.


@node Tracebacks,,Exception and warning types,예외 처리
@anchor{c-api/exceptions tracebacks}@anchor{5247}
@subsection Tracebacks


@geindex PyTraceBack_Type (C var)
@anchor{c-api/exceptions c PyTraceBack_Type}@anchor{5113}
@deffn {C 변수} @ref{c9b,,PyTypeObject} PyTraceBack_Type
` Part of the @ref{774,,안정 ABI}.'
Type object for traceback objects. This is available as
@ref{ce9,,types.TracebackType} in the Python layer.
@end deffn

@geindex PyTraceBack_Check (C function)
@anchor{c-api/exceptions c PyTraceBack_Check}@anchor{5248}
@deffn {C 함수} int PyTraceBack_Check (PyObject *op)

Return true if `op' is a traceback object, false otherwise. This function
does not account for subtypes.
@end deffn

@geindex PyTraceBack_Here (C function)
@anchor{c-api/exceptions c PyTraceBack_Here}@anchor{5111}
@deffn {C 함수} int PyTraceBack_Here (PyFrameObject *f)
` Part of the @ref{774,,안정 ABI}.'
Replace the @ref{14cb,,__traceback__} attribute on the current
exception with a new traceback prepending `f' to the existing chain.

Calling this function without an exception set is undefined behavior.

This function returns @code{0} on success, and returns @code{-1} with an
exception set on failure.
@end deffn

@geindex PyTraceBack_Print (C function)
@anchor{c-api/exceptions c PyTraceBack_Print}@anchor{5112}
@deffn {C 함수} int PyTraceBack_Print (PyObject *tb, PyObject *f)
` Part of the @ref{774,,안정 ABI}.'
Write the traceback `tb' into the file `f'.

This function returns @code{0} on success, and returns @code{-1} with an
exception set on failure.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Defining extension modules,유틸리티<2>,예외 처리,Python/C API reference manual
@anchor{c-api/extension-modules doc}@anchor{5249}@anchor{c-api/extension-modules defining-extension-modules}@anchor{524a}@anchor{c-api/extension-modules extension-modules}@anchor{4f3b}@anchor{c-api/extension-modules translation-repo}@anchor{524b}
@section Defining extension modules


A C extension for CPython is a shared library (for example, a @code{.so} file
on Linux, @code{.pyd} DLL on Windows), which is loadable into the Python process
(for example, it is compiled with compatible compiler settings), and which
exports an @ref{524c,,initialization function}.

To be importable by default (that is, by
@ref{ead,,importlib.machinery.ExtensionFileLoader}),
the shared library must be available on @ref{3e4,,sys.path},
and must be named after the module name plus an extension listed in
@ref{738,,importlib.machinery.EXTENSION_SUFFIXES}.

@cartouche
@quotation 참고 
Building, packaging and distributing extension modules is best done with
third-party tools, and is out of scope of this document.
One suitable tool is Setuptools, whose documentation can be found at
@indicateurl{https://setuptools.pypa.io/en/latest/setuptools.html}.
@end quotation
@end cartouche

Normally, the initialization function returns a module definition initialized
using @ref{4ee2,,PyModuleDef_Init()}.
This allows splitting the creation process into several phases:


@itemize -

@item 
Before any substantial code is executed, Python can determine which
capabilities the module supports, and it can adjust the environment or
refuse loading an incompatible extension.

@item 
By default, Python itself creates the module object – that is, it does
the equivalent of @ref{79f,,object.__new__()} for classes.
It also sets initial attributes like @ref{323,,__package__} and
@ref{33b,,__loader__}.

@item 
Afterwards, the module object is initialized using extension-specific
code – the equivalent of @ref{8be,,__init__()} on classes.
@end itemize

This is called `multi-phase initialization' to distinguish it from the legacy
(but still supported) `single-phase initialization' scheme,
where the initialization function returns a fully constructed module.
See the @ref{524d,,single-phase-initialization section below}
for details.


버전 3.5에서 변경: Added support for multi-phase initialization (
@geindex Python 향상 제안; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}).


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

@end menu

@node Multiple module instances,Initialization function,,Defining extension modules
@anchor{c-api/extension-modules multiple-module-instances}@anchor{524e}
@subsection Multiple module instances


By default, extension modules are not singletons.
For example, if the @ref{17ea,,sys.modules} entry is removed and the module
is re-imported, a new module object is created, and typically populated with
fresh method and type objects.
The old module is subject to normal garbage collection.
This mirrors the behavior of pure-Python modules.

Additional module instances may be created in
@ref{163,,sub-interpreters}
or after Python runtime reinitialization
(@ref{45f,,Py_Finalize()} and @ref{460,,Py_Initialize()}).
In these cases, sharing Python objects between module instances would likely
cause crashes or undefined behavior.

To avoid such issues, each instance of an extension module should
be `isolated': changes to one instance should not implicitly affect the others,
and all state owned by the module, including references to Python objects,
should be specific to a particular module instance.
See @ref{166,,Isolating Extension Modules} for more details and a practical guide.

A simpler way to avoid these issues is
@ref{524f,,raising an error on repeated initialization}.

All modules are expected to support
@ref{163,,sub-interpreters}, or otherwise explicitly
signal a lack of support.
This is usually achieved by isolation or blocking repeated initialization,
as above.
A module may also be limited to the main interpreter using
the @ref{5191,,Py_mod_multiple_interpreters} slot.

@node Initialization function,Multi-phase initialization,Multiple module instances,Defining extension modules
@anchor{c-api/extension-modules extension-export-hook}@anchor{524c}@anchor{c-api/extension-modules initialization-function}@anchor{5250}
@subsection Initialization function


The initialization function defined by an extension module has the
following signature:

@geindex PyInit_modulename (C function)
@anchor{c-api/extension-modules c PyInit_modulename}@anchor{5251}
@deffn {C 함수} @ref{5dc,,PyObject} *PyInit_modulename (void)
@end deffn

Its name should be @code{PyInit_@var{<name>}}, with @code{<name>} replaced by the
name of the module.

For modules with ASCII-only names, the function must instead be named
@code{PyInit_@var{<name>}}, with @code{<name>} replaced by the name of the module.
When using @ref{5252,,Multi-phase initialization}, non-ASCII module names
are allowed. In this case, the initialization function name is
@code{PyInitU_@var{<name>}}, with @code{<name>} encoded using Python’s
`punycode' encoding with hyphens replaced by underscores. In Python:

@example
def initfunc_name(name):
    try:
        suffix = b'_' + name.encode('ascii')
    except UnicodeEncodeError:
        suffix = b'U_' + name.encode('punycode').replace(b'-', b'_')
    return b'PyInit' + suffix
@end example

It is recommended to define the initialization function using a helper macro:

@geindex PyMODINIT_FUNC (C macro)
@anchor{c-api/extension-modules c PyMODINIT_FUNC}@anchor{16d8}
@deffn {C 매크로} PyMODINIT_FUNC

Declare an extension module initialization function.
This macro:


@itemize *

@item 
specifies the @ref{5dc,,PyObject}* return type,

@item 
adds any special linkage declarations required by the platform, and

@item 
for C++, declares the function as @code{extern "C"}.
@end itemize
@end deffn

For example, a module called @code{spam} would be defined like this:

@example
static struct PyModuleDef spam_module = @{
    .m_base = PyModuleDef_HEAD_INIT,
    .m_name = "spam",
    ...
@};

PyMODINIT_FUNC
PyInit_spam(void)
@{
    return PyModuleDef_Init(&spam_module);
@}
@end example

It is possible to export multiple modules from a single shared library by
defining multiple initialization functions. However, importing them requires
using symbolic links or a custom importer, because by default only the
function corresponding to the filename is found.
See the Multiple modules in one library@footnote{https://peps.python.org/pep-0489/#multiple-modules-in-one-library}
section in 
@geindex Python 향상 제안; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/} for details.

The initialization function is typically the only non-@code{static}
item defined in the module’s C source.

@node Multi-phase initialization,Legacy single-phase initialization,Initialization function,Defining extension modules
@anchor{c-api/extension-modules id1}@anchor{5253}@anchor{c-api/extension-modules multi-phase-initialization}@anchor{5252}
@subsection Multi-phase initialization


Normally, the @ref{524c,,initialization function}
(@code{PyInit_modulename}) returns a @ref{b71,,PyModuleDef} instance with
non-@code{NULL} @ref{5254,,m_slots}.
Before it is returned, the @code{PyModuleDef} instance must be initialized
using the following function:

@geindex PyModuleDef_Init (C function)
@anchor{c-api/extension-modules c PyModuleDef_Init}@anchor{4ee2}
@deffn {C 함수} @ref{5dc,,PyObject} *PyModuleDef_Init (PyModuleDef *def)
` Part of the @ref{774,,안정 ABI} 버전 3.5 이후로.'
Ensure a module definition is a properly initialized Python object that
correctly reports its type and a reference count.

Return `def' cast to @code{PyObject*}, or @code{NULL} if an error occurred.

Calling this function is required for @ref{5252,,Multi-phase initialization}.
It should not be used in other contexts.

Note that Python assumes that @code{PyModuleDef} structures are statically
allocated.
This function may return either a new reference or a borrowed one;
this reference must not be released.


Added in version 3.5.

@end deffn

@node Legacy single-phase initialization,,Multi-phase initialization,Defining extension modules
@anchor{c-api/extension-modules legacy-single-phase-initialization}@anchor{5255}@anchor{c-api/extension-modules single-phase-initialization}@anchor{524d}
@subsection Legacy single-phase initialization


@cartouche
@quotation 주의 
Single-phase initialization is a legacy mechanism to initialize extension
modules, with known drawbacks and design flaws. Extension module authors
are encouraged to use multi-phase initialization instead.
@end quotation
@end cartouche

In single-phase initialization, the
@ref{524c,,initialization function} (@code{PyInit_modulename})
should create, populate and return a module object.
This is typically done using @ref{5256,,PyModule_Create()} and functions like
@ref{607,,PyModule_AddObjectRef()}.

Single-phase initialization differs from the @ref{5252,,default}
in the following ways:


@itemize *

@item 
Single-phase modules are, or rather `contain', “singletons”.

When the module is first initialized, Python saves the contents of
the module’s @code{__dict__} (that is, typically, the module’s functions and
types).

For subsequent imports, Python does not call the initialization function
again.
Instead, it creates a new module object with a new @code{__dict__}, and copies
the saved contents to it.
For example, given a single-phase module @code{_testsinglephase}
@footnote{
@code{_testsinglephase} is an internal module used
in CPython’s self-test suite; your installation may or may not
include it.
} that defines a function @code{sum} and an exception class
@code{error}:

@example
>>> import sys
>>> import _testsinglephase as one
>>> del sys.modules['_testsinglephase']
>>> import _testsinglephase as two
>>> one is two
False
>>> one.__dict__ is two.__dict__
False
>>> one.sum is two.sum
True
>>> one.error is two.error
True
@end example

The exact behavior should be considered a CPython implementation detail.

@item 
To work around the fact that @code{PyInit_modulename} does not take a `spec'
argument, some state of the import machinery is saved and applied to the
first suitable module created during the @code{PyInit_modulename} call.
Specifically, when a sub-module is imported, this mechanism prepends the
parent package name to the name of the module.

A single-phase @code{PyInit_modulename} function should create “its” module
object as soon as possible, before any other module objects can be created.

@item 
Non-ASCII module names (@code{PyInitU_modulename}) are not supported.

@item 
Single-phase modules support module lookup functions like
@ref{50f4,,PyState_FindModule()}.
@end itemize

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 유틸리티<2>,추상 객체 계층,Defining extension modules,Python/C API reference manual
@anchor{c-api/utilities doc}@anchor{5257}@anchor{c-api/utilities id1}@anchor{5258}@anchor{c-api/utilities translation-repo}@anchor{5259}@anchor{c-api/utilities utilities}@anchor{525a}
@section 유틸리티


이 장의 함수들은 C 코드의 플랫폼 간 호환성 개선, C에서 파이썬 모듈 사용, 함수 인자의 구문 분석 및 C값으로부터 파이썬 값을 구성하는 것에 이르기까지 다양한 유틸리티 작업을 수행합니다.

@menu
* 운영 체제 유틸리티:: 
* 시스템 함수:: 
* 프로세스 제어:: 
* 모듈 임포트 하기: 모듈 임포트 하기<2>. 
* 데이터 마샬링 지원:: 
* 인자 구문 분석과 값 구축:: 
* 문자열 변환과 포매팅:: 
* Character classification and conversion:: 
* PyHash API:: 
* 리플렉션:: 
* 코덱 등록소와 지원 함수:: 
* PyTime C API:: 
* Support for Perf Maps:: 

@end menu

@node 운영 체제 유틸리티,시스템 함수,,유틸리티<2>
@anchor{c-api/sys doc}@anchor{525b}@anchor{c-api/sys operating-system-utilities}@anchor{525c}@anchor{c-api/sys os}@anchor{525d}
@subsection 운영 체제 유틸리티


@geindex PyOS_FSPath (C function)
@anchor{c-api/sys c PyOS_FSPath}@anchor{f13}
@deffn {C 함수} @ref{5dc,,PyObject} *PyOS_FSPath (PyObject *path)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI} 버전 3.6 이후로.'
`path'에 대한 파일 시스템 표현을 반환합니다. 객체가 @ref{169,,str}이나 @ref{192,,bytes} 객체이면, 새 @ref{5df,,강한 참조}를 반환합니다. 객체가 @ref{e4a,,os.PathLike} 인터페이스를 구현하면, @ref{e4b,,__fspath__()}가 @code{str}나 @code{bytes} 객체일 때 반환됩니다. 그렇지 않으면, @ref{198,,TypeError}가 발생하고 @code{NULL}이 반환됩니다.


Added in version 3.6.

@end deffn

@geindex Py_FdIsInteractive (C function)
@anchor{c-api/sys c Py_FdIsInteractive}@anchor{525e}
@deffn {C 함수} int Py_FdIsInteractive (FILE *fp, const char *filename)

이름이 `filename'인 표준 I/O 파일 `fp'를 대화식으로 간주하면 참(0이 아닙니다)을 반환합니다. @code{isatty(fileno(fp))}가 참인 파일의 경우입니다. @ref{3ff,,PyConfig.interactive}가 0이 아니면, 이 함수는 `filename' 포인터가 @code{NULL}이거나 이름이 문자열 @code{'<stdin>'}이나 @code{'???'} 중 하나와 같을 때도 참을 반환합니다.

This function must not be called before Python is initialized.
@end deffn

@geindex PyOS_BeforeFork (C function)
@anchor{c-api/sys c PyOS_BeforeFork}@anchor{db7}
@deffn {C 함수} void PyOS_BeforeFork ()
` Part of the @ref{774,,안정 ABI} on platforms with fork() 버전 3.7 이후로.'
프로세스 포크 전에 내부 상태를 준비하는 함수. @code{fork()}나 현재 프로세스를 복제하는 유사한 함수를 호출하기 전에 호출해야 합니다. @code{fork()}가 정의된 시스템에서만 사용 가능합니다.

@cartouche
@quotation 경고 
C @code{fork()} 호출은 (@ref{163,,“메인” 인터프리터}의) @ref{525f,,“메인” 스레드}에서만 이루어져야 합니다. @code{PyOS_BeforeFork()}도 마찬가지입니다.
@end quotation
@end cartouche


Added in version 3.7.

@end deffn

@geindex PyOS_AfterFork_Parent (C function)
@anchor{c-api/sys c PyOS_AfterFork_Parent}@anchor{db8}
@deffn {C 함수} void PyOS_AfterFork_Parent ()
` Part of the @ref{774,,안정 ABI} on platforms with fork() 버전 3.7 이후로.'
프로세스 포크 후 일부 내부 상태를 갱신하는 함수. 프로세스 복제가 성공했는지와 관계없이, @code{fork()}나 현재 프로세스를 복제하는 유사한 함수를 호출한 후 부모 프로세스에서 호출해야 합니다. @code{fork()}가 정의된 시스템에서만 사용 가능합니다.

@cartouche
@quotation 경고 
C @code{fork()} 호출은 (@ref{163,,“메인” 인터프리터}의) @ref{525f,,“메인” 스레드}에서만 이루어져야 합니다. @code{PyOS_AfterFork_Parent()}도 마찬가지입니다.
@end quotation
@end cartouche


Added in version 3.7.

@end deffn

@geindex PyOS_AfterFork_Child (C function)
@anchor{c-api/sys c PyOS_AfterFork_Child}@anchor{430}
@deffn {C 함수} void PyOS_AfterFork_Child ()
` Part of the @ref{774,,안정 ABI} on platforms with fork() 버전 3.7 이후로.'
프로세스 포크 후 내부 인터프리터 상태를 갱신하는 함수. @code{fork()}나 현재 프로세스를 복제하는 유사한 함수를 호출한 후, 프로세스가 파이썬 인터프리터를 다시 호출할 가능성이 있으면 자식 프로세스에서 호출해야 합니다. @code{fork()}가 정의된 시스템에서만 사용 가능합니다.

@cartouche
@quotation 경고 
C @code{fork()} 호출은 (@ref{163,,“메인” 인터프리터}의) @ref{525f,,“메인” 스레드}에서만 이루어져야 합니다. @code{PyOS_AfterFork_Child()}도 마찬가지입니다.
@end quotation
@end cartouche


Added in version 3.7.



@subsubheading 더 보기


@ref{355,,os.register_at_fork()}를 사용하면 @ref{db7,,PyOS_BeforeFork()}, @ref{db8,,PyOS_AfterFork_Parent()} 및 @ref{430,,PyOS_AfterFork_Child()}에서 호출될 사용자 정의 파이썬 함수를 등록 할 수 있습니다.

@end deffn

@geindex PyOS_AfterFork (C function)
@anchor{c-api/sys c PyOS_AfterFork}@anchor{42f}
@deffn {C 함수} void PyOS_AfterFork ()
` Part of the @ref{774,,안정 ABI} on platforms with fork().'
프로세스 포크 후 일부 내부 상태를 갱신하는 함수; 파이썬 인터프리터가 계속 사용된다면 새로운 프로세스에서 호출되어야 합니다. 새 실행 파일이 새 프로세스에 로드되면, 이 함수를 호출할 필요가 없습니다.


버전 3.7부터 폐지됨: 이 함수는 @ref{430,,PyOS_AfterFork_Child()}로 대체되었습니다.

@end deffn

@geindex PyOS_CheckStack (C function)
@anchor{c-api/sys c PyOS_CheckStack}@anchor{1b9f}
@deffn {C 함수} int PyOS_CheckStack ()
` Part of the @ref{774,,안정 ABI} on platforms with USE_STACKCHECK 버전 3.7 이후로.'
@geindex USE_STACKCHECK (C 매크로)

인터프리터에 스택 공간이 부족하면 참을 반환합니다. 이것은 신뢰성 있는 확인이지만, @code{USE_STACKCHECK}이 정의되어 있을 때만 사용할 수 있습니다 (현재 마이크로소프트 Visual C++ 컴파일러를 사용하는 특정 버전의 윈도우에서). @code{USE_STACKCHECK}은 자동으로 정의됩니다; 여러분 자신의 코드에서 정의를 변경해서는 안 됩니다.
@end deffn

@geindex PyOS_sighandler_t (C type)
@anchor{c-api/sys c PyOS_sighandler_t}@anchor{50c3}
@deffn {C 자료형} typedef void (*PyOS_sighandler_t)(int)
` Part of the @ref{774,,안정 ABI}.'
@end deffn

@geindex PyOS_getsig (C function)
@anchor{c-api/sys c PyOS_getsig}@anchor{1743}
@deffn {C 함수} @ref{50c3,,PyOS_sighandler_t} PyOS_getsig (int i)
` Part of the @ref{774,,안정 ABI}.'
시그널 `i'에 대한 현재 시그널 처리기를 반환합니다. 이것은 @code{sigaction()}이나 @code{signal()}을 감싸는 얇은 래퍼입니다. 그 함수들을 직접 호출하지 마십시오!
@end deffn

@geindex PyOS_setsig (C function)
@anchor{c-api/sys c PyOS_setsig}@anchor{1744}
@deffn {C 함수} @ref{50c3,,PyOS_sighandler_t} PyOS_setsig (int i, PyOS_sighandler_t h)
` Part of the @ref{774,,안정 ABI}.'
시그널 `i'의 시그널 처리기를 `h'로 설정합니다; 이전 시그널 처리기를 반환합니다. 이것은 @code{sigaction()}이나 @code{signal()}을 감싸는 얇은 래퍼입니다. 그 함수들을 직접 호출하지 마십시오!
@end deffn

@geindex PyOS_InterruptOccurred (C function)
@anchor{c-api/sys c PyOS_InterruptOccurred}@anchor{1d3f}
@deffn {C 함수} int PyOS_InterruptOccurred (void)
` Part of the @ref{774,,안정 ABI}.'
Check if a @code{SIGINT} signal has been received.

Returns @code{1} if a @code{SIGINT} has occurred and clears the signal flag,
or @code{0} otherwise.

In most cases, you should prefer @ref{692,,PyErr_CheckSignals()} over this function.
@code{PyErr_CheckSignals()} invokes the appropriate signal handlers
for all pending signals, allowing Python code to handle the signal properly.
This function only detects @code{SIGINT} and does not invoke any Python
signal handlers.

This function is async-signal-safe and this function cannot fail.
The caller must hold an @ref{4f10,,attached thread state}.
@end deffn

@geindex Py_DecodeLocale (C function)
@anchor{c-api/sys c Py_DecodeLocale}@anchor{dbf}
@deffn {C 함수} wchar_t *Py_DecodeLocale (const char *arg, size_t *size)
` Part of the @ref{774,,안정 ABI} 버전 3.7 이후로.'
@cartouche
@quotation 경고 
This function should not be called directly: use the @ref{3f7,,PyConfig}
API with the @ref{baa,,PyConfig_SetBytesString()} function which ensures
that @ref{4306,,Python is preinitialized}.

This function must not be called before @ref{4306,,Python is preinitialized} and so that the LC_CTYPE locale is properly configured: see
the @ref{41e,,Py_PreInitialize()} function.
@end quotation
@end cartouche

@ref{75c,,파일시스템 인코딩과 에러 처리기}로 바이트열을 디코딩합니다. 에러 처리기가 @ref{2878,,surrogateescape 에러 처리기}면, 디코딩할 수 없는 바이트열은 U+DC80..U+DCFF 범위의 문자로 디코딩됩니다; 그리고, 바이트 시퀀스를 서로게이트 문자로 디코딩 할 수 있으면, 이들을 디코딩하는 대신 surrogateescape 에러 처리기를 사용하여 바이트열를 이스케이프 합니다.

새로 할당된 와이드 문자(wide character) 문자열에 대한 포인터를 반환합니다, 메모리를 해제하려면 @ref{632,,PyMem_RawFree()}를 사용하십시오. size가 @code{NULL}이 아니면, 널 문자를 제외한 와이드 문자 수를 @code{*size}에 기록합니다.

디코딩 에러나 메모리 할당 에러 시 @code{NULL}을 반환합니다. `size'가 @code{NULL}이 아니면, 메모리 에러 시 @code{*size}가 @code{(size_t)-1}로 설정되고, 디코딩 에러 시 @code{(size_t)-2}로 설정됩니다.

The @ref{75c,,filesystem encoding and error handler} are selected by
@ref{992,,PyConfig_Read()}: see @ref{41b,,filesystem_encoding} and
@ref{41c,,filesystem_errors} members of @ref{3f7,,PyConfig}.

C 라이브러리에 버그가 없으면, 디코딩 에러가 발생하지 않아야 합니다.

문자열을 바이트열로 다시 인코딩하려면 @ref{dc0,,Py_EncodeLocale()} 함수를 사용하십시오.


@subsubheading 더 보기


@ref{513e,,PyUnicode_DecodeFSDefaultAndSize()}와 @ref{dc1,,PyUnicode_DecodeLocaleAndSize()} 함수.



Added in version 3.5.



버전 3.7에서 변경: 이 함수는 이제 @ref{865,,파이썬 UTF-8 모드}에서 UTF-8 인코딩을 사용합니다.



버전 3.8에서 변경: 이 함수는 이제 윈도우에서 @ref{418,,PyPreConfig.legacy_windows_fs_encoding}가 0이면 UTF-8 인코딩을 사용합니다;

@end deffn

@geindex Py_EncodeLocale (C function)
@anchor{c-api/sys c Py_EncodeLocale}@anchor{dc0}
@deffn {C 함수} char *Py_EncodeLocale (const wchar_t *text, size_t *error_pos)
` Part of the @ref{774,,안정 ABI} 버전 3.7 이후로.'
와이드 문자(wide character) 문자열을 @ref{75c,,파일시스템 인코딩과 에러 처리기}로 인코딩합니다. 에러 처리기가 @ref{2878,,surrogateescape 에러 처리기}면 U+DC80..U+DCFF 범위의 서로게이트 문자는 바이트 0x80..0xFF로 변환됩니다.

새로 할당된 바이트열에 대한 포인터를 반환합니다, 메모리를 해제하려면 @ref{1647,,PyMem_Free()}를 사용하십시오. 인코딩 에러나 메모리 할당 에러 시 @code{NULL}을 반환합니다.

error_pos가 @code{NULL}이 아니면, @code{*error_pos}는 성공 시 @code{(size_t)-1}로 설정되고, 인코딩 에러 시 유효하지 않은 문자의 인덱스로 설정됩니다.

The @ref{75c,,filesystem encoding and error handler} are selected by
@ref{992,,PyConfig_Read()}: see @ref{41b,,filesystem_encoding} and
@ref{41c,,filesystem_errors} members of @ref{3f7,,PyConfig}.

바이트열을 와이드 문자 문자열로 다시 디코딩하려면 @ref{dbf,,Py_DecodeLocale()} 함수를 사용하십시오.

@cartouche
@quotation 경고 
This function must not be called before @ref{4306,,Python is preinitialized} and so that the LC_CTYPE locale is properly configured: see
the @ref{41e,,Py_PreInitialize()} function.
@end quotation
@end cartouche


@subsubheading 더 보기


@ref{1e2d,,PyUnicode_EncodeFSDefault()}와 @ref{dc2,,PyUnicode_EncodeLocale()} 함수.



Added in version 3.5.



버전 3.7에서 변경: 이 함수는 이제 @ref{865,,파이썬 UTF-8 모드}에서 UTF-8 인코딩을 사용합니다.



버전 3.8에서 변경: 이 함수는 이제 윈도우에서 @ref{418,,PyPreConfig.legacy_windows_fs_encoding}이 0이면 UTF-8 인코딩을 사용합니다.

@end deffn

@geindex Py_fopen (C function)
@anchor{c-api/sys c Py_fopen}@anchor{393}
@deffn {C 함수} FILE *Py_fopen (PyObject *path, const char *mode)

Similar to @code{fopen()}, but `path' is a Python object and
an exception is set on error.

`path' must be a @ref{169,,str} object, a @ref{192,,bytes} object,
or a @ref{5a0,,path-like object}.

On success, return the new file pointer.
On error, set an exception and return @code{NULL}.

The file must be closed by @ref{394,,Py_fclose()} rather than calling directly
@code{fclose()}.

The file descriptor is created non-inheritable (
@geindex Python 향상 제안; PEP 446
PEP 446@footnote{https://peps.python.org/pep-0446/}).

The caller must have an @ref{4f10,,attached thread state}.


Added in version 3.14.

@end deffn

@geindex Py_fclose (C function)
@anchor{c-api/sys c Py_fclose}@anchor{394}
@deffn {C 함수} int Py_fclose (FILE *file)

Close a file that was opened by @ref{393,,Py_fopen()}.

On success, return @code{0}.
On error, return @code{EOF} and @code{errno} is set to indicate the error.
In either case, any further access (including another call to
@ref{394,,Py_fclose()}) to the stream results in undefined behavior.


Added in version 3.14.

@end deffn

@node 시스템 함수,프로세스 제어,운영 체제 유틸리티,유틸리티<2>
@anchor{c-api/sys system-functions}@anchor{5260}@anchor{c-api/sys systemfunctions}@anchor{5261}
@subsection 시스템 함수


@ref{df,,sys} 모듈의 기능을 C 코드에서 액세스 할 수 있게 하는 유틸리티 함수입니다. 모두 내부 스레드 상태 구조체에 포함된 현재 인터프리터 스레드의 @code{sys} 모듈의 딕셔너리에 작동합니다.

@geindex PySys_GetObject (C function)
@anchor{c-api/sys c PySys_GetObject}@anchor{628}
@deffn {C 함수} @ref{5dc,,PyObject} *PySys_GetObject (const char *name)
`반환값: 빌린 참조.'` Part of the @ref{774,,안정 ABI}.'
@ref{df,,sys} 모듈에서 객체 `name'을 반환하거나, 존재하지 않으면 예외를 설정하지 않고 @code{NULL}을 반환합니다.
@end deffn

@geindex PySys_SetObject (C function)
@anchor{c-api/sys c PySys_SetObject}@anchor{50fe}
@deffn {C 함수} int PySys_SetObject (const char *name, PyObject *v)
` Part of the @ref{774,,안정 ABI}.'
`v'가 `NULL'이 아닌 한 @ref{df,,sys} 모듈의 `name'을 `v'로 설정합니다. @code{NULL}이면 `name'은 sys 모듈에서 삭제됩니다. 성공하면 @code{0}, 에러 시 @code{-1}을 반환합니다.
@end deffn

@geindex PySys_ResetWarnOptions (C function)
@anchor{c-api/sys c PySys_ResetWarnOptions}@anchor{3f4}
@deffn {C 함수} void PySys_ResetWarnOptions ()
` Part of the @ref{774,,안정 ABI}.'
@ref{3f5,,sys.warnoptions}를 빈 리스트로 재설정합니다. 이 함수는 @ref{460,,Py_Initialize()} 이전에 호출할 수 있습니다.


Deprecated since version 3.13, will be removed in version 3.15: Clear @ref{3f5,,sys.warnoptions} and @code{warnings.filters} instead.

@end deffn

@geindex PySys_WriteStdout (C function)
@anchor{c-api/sys c PySys_WriteStdout}@anchor{5100}
@deffn {C 함수} void PySys_WriteStdout (const char *format, ...)
` Part of the @ref{774,,안정 ABI}.'
`format'으로 기술되는 출력 문자열을 @ref{ccc,,sys.stdout}에 기록합니다. 잘림이 발생하더라도 예외는 발생하지 않습니다 (아래를 참조하십시오).

`format'은 포맷된 출력 문자열의 총 크기를 1000바이트 이하로 제한해야 합니다 – 1000바이트 이후에는, 출력 문자열이 잘립니다. 특히, 이것은 무제한 “%s” 포맷이 있어서는 안 됨을 의미합니다; “%.<N>s”를 사용하여 제한해야 합니다, 여기서 <N>은 <N>에 다른 포맷된 텍스트의 최대 크기를 더할 때 1000바이트를 초과하지 않도록 계산된 십진수입니다. 또한 “%f”도 주의하십시오, 아주 큰 숫자는 수백 자리를 인쇄할 수 있습니다.

문제가 발생하거나, @ref{ccc,,sys.stdout}가 설정되어 있지 않으면, 포맷된 메시지는 실제(C 수준) `stdout'에 기록됩니다.
@end deffn

@geindex PySys_WriteStderr (C function)
@anchor{c-api/sys c PySys_WriteStderr}@anchor{50ff}
@deffn {C 함수} void PySys_WriteStderr (const char *format, ...)
` Part of the @ref{774,,안정 ABI}.'
@ref{5100,,PySys_WriteStdout()}과 같지만, 대신 @ref{b33,,sys.stderr}이나 `stderr'에 씁니다.
@end deffn

@geindex PySys_FormatStdout (C function)
@anchor{c-api/sys c PySys_FormatStdout}@anchor{50fc}
@deffn {C 함수} void PySys_FormatStdout (const char *format, ...)
` Part of the @ref{774,,안정 ABI}.'
PySys_WriteStdout()과 유사한 함수이지만, 메시지를 @ref{793,,PyUnicode_FromFormatV()}를 사용하여 포맷하고 메시지를 임의의 길이로 자르지 않습니다.


Added in version 3.2.

@end deffn

@geindex PySys_FormatStderr (C function)
@anchor{c-api/sys c PySys_FormatStderr}@anchor{50fb}
@deffn {C 함수} void PySys_FormatStderr (const char *format, ...)
` Part of the @ref{774,,안정 ABI}.'
@ref{50fc,,PySys_FormatStdout()}과 같지만, 대신 @ref{b33,,sys.stderr}이나 `stderr'에 씁니다.


Added in version 3.2.

@end deffn

@geindex PySys_GetXOptions (C function)
@anchor{c-api/sys c PySys_GetXOptions}@anchor{50fd}
@deffn {C 함수} @ref{5dc,,PyObject} *PySys_GetXOptions ()
`반환값: 빌린 참조.'` Part of the @ref{774,,안정 ABI} 버전 3.7 이후로.'
@ref{212e,,sys._xoptions}와 유사하게, @ref{16f,,-X} 옵션의 현재 딕셔너리를 반환합니다. 에러가 발생하면, @code{NULL}이 반환되고 예외가 설정됩니다.


Added in version 3.2.

@end deffn

@geindex PySys_Audit (C function)
@anchor{c-api/sys c PySys_Audit}@anchor{611}
@deffn {C 함수} int PySys_Audit (const char *event, const char *format, ...)
` Part of the @ref{774,,안정 ABI} 버전 3.13 이후로.'
모든 활성 훅으로 감사 이벤트를 발생시킵니다. 성공 시 0을 반환하고 실패 시 예외를 설정하여 0이 아닌 값을 반환합니다.

The `event' string argument must not be `NULL'.

훅이 추가되었으면, `format'과 기타 인자를 사용하여 전달할 튜플을 구성합니다. @code{N} 외에도, @ref{3c2,,Py_BuildValue()}에서 사용된 것과 같은 포맷 문자를 사용할 수 있습니다. 빌드된 값이 튜플이 아니면, 단일 요소 튜플에 추가됩니다.

@code{N} 포맷 옵션은 사용하지 않아야 합니다. 참조를 소비하지만, 이 함수에 대한 인자가 소비될지를 알 방법이 없기 때문에, 사용하면 참조 누수가 발생할 수 있습니다.

@code{PY_SSIZE_T_CLEAN}이 정의되었는지와 관계없이, @code{#} 포맷 문자는 항상 @ref{c54,,Py_ssize_t}로 처리되어야 합니다.

@ref{191c,,sys.audit()}은 파이썬 코드와 동일한 기능을 수행합니다.

See also @ref{612,,PySys_AuditTuple()}.


Added in version 3.8.



버전 3.8.2에서 변경: @code{#} 포맷 문자에 대해 @ref{c54,,Py_ssize_t}를 요구합니다. 이전에는, 피할 수 없는 폐지 경고가 발생했습니다.

@end deffn

@geindex PySys_AuditTuple (C function)
@anchor{c-api/sys c PySys_AuditTuple}@anchor{612}
@deffn {C 함수} int PySys_AuditTuple (const char *event, PyObject *args)
` Part of the @ref{774,,안정 ABI} 버전 3.13 이후로.'
Similar to @ref{611,,PySys_Audit()}, but pass arguments as a Python object.
`args' must be a @ref{610,,tuple}. To pass no arguments, `args' can be `NULL'.


Added in version 3.13.

@end deffn

@geindex PySys_AddAuditHook (C function)
@anchor{c-api/sys c PySys_AddAuditHook}@anchor{4790}
@deffn {C 함수} int PySys_AddAuditHook (Py_AuditHookFunction hook, void *userData)

활성 감사 훅 리스트에 콜러블 `hook'을 추가합니다. 성공하면 0을, 실패하면 0이 아닌 값을 반환합니다. 런타임이 초기화되었으면, 실패 시 에러도 설정합니다. 이 API를 통해 추가된 훅은 런타임이 만든 모든 인터프리터에 대해 호출됩니다.

`userData' 포인터는 훅 함수로 전달됩니다. 훅 함수는 다른 런타임에서 호출될 수 있어서, 이 포인터는 파이썬 상태를 직접 참조하면 안 됩니다.

이 함수는 @ref{460,,Py_Initialize()} 이전에 호출해도 안전합니다. 런타임 초기화 후 호출되면, 기존 감사 훅에 알리고 @ref{bcc,,Exception}에서 서브 클래싱 된 에러를 발생 시켜 조용히 연산을 중단할 수 있습니다 (다른 에러는 억제되지(silenced) 않습니다).

The hook function is always called with an @ref{4f10,,attached thread state} by
the Python interpreter that raised the event.

감사에 대한 자세한 설명은 
@geindex Python 향상 제안; PEP 578
PEP 578@footnote{https://peps.python.org/pep-0578/}을 참조하십시오. 이벤트를 발생시키는 런타임과 표준 라이브러리의 함수는 @ref{1c11,,감사 이벤트 표}에 나열되어 있습니다. 자세한 내용은 각 함수 설명서에 있습니다.

인터프리터가 초기화되면, 이 함수는 인자 없이 감사 이벤트 @code{sys.addaudithook}을 발생시킵니다. 기존 훅이 @ref{bcc,,Exception}에서 파생된 예외를 발생시키면, 새 훅이 추가되지 않고 예외가 지워집니다. 결과적으로, 호출자가 기존의 모든 훅을 제어하지 않는 한 훅이 추가되었다고 가정할 수 없습니다.

@geindex Py_AuditHookFunction (C type)
@anchor{c-api/sys c Py_AuditHookFunction}@anchor{5262}
@deffn {C 자료형} typedef int (*Py_AuditHookFunction)(const char *event, @ref{5dc,,PyObject} *args, void *userData)

The type of the hook function.
`event' is the C string event argument passed to @ref{611,,PySys_Audit()} or
@ref{612,,PySys_AuditTuple()}.
`args' is guaranteed to be a @ref{5263,,PyTupleObject}.
`userData' is the argument passed to PySys_AddAuditHook().
@end deffn


Added in version 3.8.

@end deffn

@node 프로세스 제어,모듈 임포트 하기<2>,시스템 함수,유틸리티<2>
@anchor{c-api/sys process-control}@anchor{5264}@anchor{c-api/sys processcontrol}@anchor{5265}
@subsection 프로세스 제어


@geindex Py_FatalError (C function)
@anchor{c-api/sys c Py_FatalError}@anchor{b79}
@deffn {C 함수} void Py_FatalError (const char *message)
` Part of the @ref{774,,안정 ABI}.'
@geindex abort (C 함수)

치명적인 에러 메시지를 인쇄하고 프로세스를 죽입니다. 아무런 정리도 수행되지 않습니다. 이 함수는 파이썬 인터프리터를 계속 사용하는 것이 위험한 조건이 감지되었을 때만 호출해야 합니다; 예를 들어, 객체 관리가 손상된 것으로 보일 때. 유닉스에서는, 표준 C 라이브러리 함수 @code{abort()}가 호출되어 @code{core} 파일을 생성하려고 시도합니다.

@code{Py_LIMITED_API} 매크로가 정의되어 있지 않은 한, @code{Py_FatalError()} 함수는 현재 함수의 이름을 자동으로 로그 하는 매크로로 대체됩니다.


버전 3.9에서 변경: 함수 이름을 자동으로 로그 합니다.

@end deffn

@geindex Py_Exit (C function)
@anchor{c-api/sys c Py_Exit}@anchor{f4a}
@deffn {C 함수} void Py_Exit (int status)
` Part of the @ref{774,,안정 ABI}.'
@geindex Py_FinalizeEx (C 함수)
@geindex exit (C 함수)

현재 프로세스를 종료합니다. 이것은 @ref{f10,,Py_FinalizeEx()}를 호출한 다음 표준 C 라이브러리 함수 @code{exit(status)}를 호출합니다. @code{Py_FinalizeEx()}가 에러를 표시하면, 종료 상태는 120으로 설정됩니다.


버전 3.6에서 변경: 파이널리제이션에서의 에러가 더는 무시되지 않습니다.

@end deffn

@geindex Py_AtExit (C function)
@anchor{c-api/sys c Py_AtExit}@anchor{5167}
@deffn {C 함수} int Py_AtExit (void (*func)())
` Part of the @ref{774,,안정 ABI}.'
@geindex Py_FinalizeEx (C 함수)
@geindex 정리 함수

@ref{f10,,Py_FinalizeEx()}가 호출할 정리 함수를 등록합니다. 정리 함수는 인자 없이 호출되며 값을 반환하지 않아야 합니다. 최대 32개의 정리 함수를 등록할 수 있습니다. 등록이 성공하면, @ref{5167,,Py_AtExit()}는 @code{0}을 반환합니다; 실패하면 @code{-1}을 반환합니다. 마지막에 등록된 정리 함수가 먼저 호출됩니다. 각 정리 함수는 최대 한 번 호출됩니다. 정리 함수 전에 파이썬의 내부 파이널리제이션이 완료되기 때문에, `func'에서 파이썬 API를 호출하면 안 됩니다.


@subsubheading 더 보기


@ref{18fb,,PyUnstable_AtExit()} for passing a @code{void *data} argument.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 모듈 임포트 하기<2>,데이터 마샬링 지원,프로세스 제어,유틸리티<2>
@anchor{c-api/import doc}@anchor{5266}@anchor{c-api/import importing}@anchor{5267}@anchor{c-api/import importing-modules}@anchor{5268}@anchor{c-api/import translation-repo}@anchor{5269}
@subsection 모듈 임포트 하기


@geindex PyImport_ImportModule (C function)
@anchor{c-api/import c PyImport_ImportModule}@anchor{3dc}
@deffn {C 함수} @ref{5dc,,PyObject} *PyImport_ImportModule (const char *name)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
@geindex 패키지 변수;__all__
@geindex __all__ (패키지 변수)
@geindex modules (sys 모듈)

This is a wrapper around @ref{1601,,PyImport_Import()} which takes a
const char* as an argument instead of a @ref{5dc,,PyObject}*.
@end deffn

@geindex PyImport_ImportModuleNoBlock (C function)
@anchor{c-api/import c PyImport_ImportModuleNoBlock}@anchor{3db}
@deffn {C 함수} @ref{5dc,,PyObject} *PyImport_ImportModuleNoBlock (const char *name)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
이 함수는 @ref{3dc,,PyImport_ImportModule()}의 폐지된 별칭입니다.


버전 3.3에서 변경: 이 기능은 다른 스레드가 임포트 잠금을 보유한 경우 즉시 실패했었습니다. 그러나 파이썬 3.3에서는, 잠금 방식이 대부분의 목적에서 모듈 단위 잠금으로 전환되었기 때문에, 이 함수의 특수한 동작은 더는 필요하지 않습니다.



Deprecated since version 3.13, will be removed in version 3.15: @ref{3dc,,PyImport_ImportModule()}을 대신 사용하십시오.

@end deffn

@geindex PyImport_ImportModuleEx (C function)
@anchor{c-api/import c PyImport_ImportModuleEx}@anchor{13aa}
@deffn {C 함수} @ref{5dc,,PyObject} *PyImport_ImportModuleEx (const char *name, PyObject *globals, PyObject *locals, PyObject *fromlist)
`반환값: 새 참조.'
@geindex 내장 함수;__import__

모듈을 임포트 합니다. 내장 파이썬 함수 @ref{ad1,,__import__()}를 통해 가장 잘 설명할 수 있습니다.

반환 값은 임포트 된 모듈이나 최상위 패키지에 대한 새로운 참조, 또는 실패 시 예외가 설정된 @code{NULL}입니다. @ref{ad1,,__import__()}와 마찬가지로, 비어 있지 않은 `fromlist'가 제공되지 않는 한, 패키지의 서브 모듈이 요청되었을 때의 반환 값은 최상위 패키지입니다.

임포트 실패는 @ref{3dc,,PyImport_ImportModule()}처럼 불완전한 모듈 객체를 제거합니다.
@end deffn

@geindex PyImport_ImportModuleLevelObject (C function)
@anchor{c-api/import c PyImport_ImportModuleLevelObject}@anchor{5078}
@deffn {C 함수} @ref{5dc,,PyObject} *PyImport_ImportModuleLevelObject (PyObject *name, PyObject *globals, PyObject *locals, PyObject *fromlist, int level)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI} 버전 3.7 이후로.'
모듈을 임포트 합니다. 표준 @ref{ad1,,__import__()} 함수가 이 함수를 직접 호출하기 때문에, 내장 파이썬 함수 @code{__import__()}를 통해 가장 잘 설명할 수 있습니다.

반환 값은 임포트 된 모듈이나 최상위 패키지에 대한 새로운 참조, 또는 실패 시 예외가 설정된 @code{NULL}입니다. @ref{ad1,,__import__()}와 마찬가지로, 비어 있지 않은 `fromlist'가 제공되지 않는 한, 패키지의 서브 모듈이 요청되었을 때의 반환 값은 최상위 패키지입니다.


Added in version 3.3.

@end deffn

@geindex PyImport_ImportModuleLevel (C function)
@anchor{c-api/import c PyImport_ImportModuleLevel}@anchor{13a9}
@deffn {C 함수} @ref{5dc,,PyObject} *PyImport_ImportModuleLevel (const char *name, PyObject *globals, PyObject *locals, PyObject *fromlist, int level)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
@ref{5078,,PyImport_ImportModuleLevelObject()}와 비슷하지만, name은 유니코드 객체 대신 UTF-8로 인코딩된 문자열입니다.


버전 3.3에서 변경: `level'의 음수 값은 더는 허용되지 않습니다.

@end deffn

@geindex PyImport_Import (C function)
@anchor{c-api/import c PyImport_Import}@anchor{1601}
@deffn {C 함수} @ref{5dc,,PyObject} *PyImport_Import (PyObject *name)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
이것은 현재 “임포트 훅 함수”를 호출하는 고수준 인터페이스입니다 (명시적인 `level' 0을 사용하는데, 절대 임포트를 뜻합니다). 현재 전역의 @code{__builtins__}에 있는 @ref{ad1,,__import__()} 함수를 호출합니다. 이는 현재 환경에 설치된 임포트 훅을 사용하여 임포트가 수행됨을 의미합니다.

이 함수는 항상 절대 임포트를 사용합니다.
@end deffn

@geindex PyImport_ReloadModule (C function)
@anchor{c-api/import c PyImport_ReloadModule}@anchor{5079}
@deffn {C 함수} @ref{5dc,,PyObject} *PyImport_ReloadModule (PyObject *m)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
모듈을 다시 로드(reload)합니다. 다시 로드된 모듈에 대한 참조를 반환하거나, 실패 시 예외가 설정된 @code{NULL}을 반환합니다 (이때 모듈은 여전히 존재합니다).
@end deffn

@geindex PyImport_AddModuleRef (C function)
@anchor{c-api/import c PyImport_AddModuleRef}@anchor{5fa}
@deffn {C 함수} @ref{5dc,,PyObject} *PyImport_AddModuleRef (const char *name)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI} 버전 3.13 이후로.'
모듈 이름에 해당하는 모듈 객체를 반환합니다.

`name' 인자는 @code{package.module} 형식일 수 있습니다. 먼저 모듈 딕셔너리에 있는지 확인하고, 없으면 새로 만들어 모듈 딕셔너리에 삽입합니다.

성공하면 모듈에 대한 @ref{5df,,강한 참조}를 반환합니다. 실패 시 예외를 설정하고 @code{NULL}을 반환합니다.

The module name `name' is decoded from UTF-8.

이 함수는 모듈을 로드하거나 임포트 하지 않습니다; 모듈이 아직 로드되지 않았으면, 빈 모듈 객체를 얻게 됩니다. 모듈을 임포트 하려면 @ref{3dc,,PyImport_ImportModule()}이나 그 변형 중 하나를 사용하십시오. `name'에서 점으로 구분된 이름으로 암시된 패키지 구조는 이미 존재하지 않는다면 만들어지지 않습니다.


Added in version 3.13.

@end deffn

@geindex PyImport_AddModuleObject (C function)
@anchor{c-api/import c PyImport_AddModuleObject}@anchor{506f}
@deffn {C 함수} @ref{5dc,,PyObject} *PyImport_AddModuleObject (PyObject *name)
`반환값: 빌린 참조.'` Part of the @ref{774,,안정 ABI} 버전 3.7 이후로.'
@ref{5fa,,PyImport_AddModuleRef()}와 비슷하지만, @ref{3d7,,빌린 참조}를 반환하고 `name'은 @ref{169,,str} 객체입니다.


Added in version 3.3.

@end deffn

@geindex PyImport_AddModule (C function)
@anchor{c-api/import c PyImport_AddModule}@anchor{5f9}
@deffn {C 함수} @ref{5dc,,PyObject} *PyImport_AddModule (const char *name)
`반환값: 빌린 참조.'` Part of the @ref{774,,안정 ABI}.'
Similar to @ref{5fa,,PyImport_AddModuleRef()}, but return a @ref{3d7,,borrowed reference}.
@end deffn

@geindex PyImport_ExecCodeModule (C function)
@anchor{c-api/import c PyImport_ExecCodeModule}@anchor{5070}
@deffn {C 함수} @ref{5dc,,PyObject} *PyImport_ExecCodeModule (const char *name, PyObject *co)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
@geindex 내장 함수;컴파일

주어진 모듈 이름(name)(@code{package.module} 형식일 수 있습니다)과 파이썬 바이트 코드 파일에서 읽거나 내장 함수 @ref{4b2,,compile()}로 얻은 코드 객체로, 모듈을 로드합니다. 모듈 객체에 대한 새로운 참조를 반환하거나, 또는 에러가 발생하면 예외가 설정된 @code{NULL}을 반환합니다. 에러가 발생하면 @ref{17ea,,sys.modules}에서 `name'이 제거됩니다, @ref{5070,,PyImport_ExecCodeModule()} 에 진입할 때 `name'이 @code{sys.modules}에 이미 있어도 그렇습니다. @code{sys.modules}에 불완전하게 초기화된 모듈을 남겨 두는 것은 위험합니다, 그러한 모듈을 임포트 할 때 모듈 객체가 알 수 없는 (그리고 아마도 모듈 작성자의 의도에 비추어볼 때 손상된) 상태에 있음을 알 방법이 없기 때문입니다.

모듈의 @ref{2361,,__spec__}과 @ref{33b,,__loader__}는 아직 설정되지 않았다면 적절한 값으로 설정됩니다. 스펙의 로더는 모듈의 @code{__loader__}(설정되었다면)로 설정되고, 그렇지 않으면 @ref{1273,,SourceFileLoader} 의 인스턴스로 설정됩니다.

모듈의 @ref{2366,,__file__} 어트리뷰트는 코드 객체의 @ref{1572,,co_filename}으로 설정됩니다. 해당한다면, @ref{321,,__cached__}도 설정됩니다.

이 함수는 이미 임포트 되었다면 모듈을 다시 로드합니다. 모듈을 다시 로드하는 의도된 방법은 @ref{5079,,PyImport_ReloadModule()}을 참조하십시오.

`name'이 @code{package.module} 형식의 점으로 구분된 이름을 가리키면, 이미 만들어지지 않은 패키지 구조는 여전히 만들어지지 않습니다.

@ref{5071,,PyImport_ExecCodeModuleEx()}와 @ref{5073,,PyImport_ExecCodeModuleWithPathnames()}도 참조하십시오.


버전 3.12에서 변경: The setting of @ref{321,,__cached__} and @ref{33b,,__loader__}
is deprecated. See @ref{2269,,ModuleSpec} for
alternatives.

@end deffn

@geindex PyImport_ExecCodeModuleEx (C function)
@anchor{c-api/import c PyImport_ExecCodeModuleEx}@anchor{5071}
@deffn {C 함수} @ref{5dc,,PyObject} *PyImport_ExecCodeModuleEx (const char *name, PyObject *co, const char *pathname)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
@ref{5070,,PyImport_ExecCodeModule()}과 유사하지만, 모듈 객체의 @ref{2366,,__file__} 어트리뷰트는 @code{NULL}이 아니라면 `pathname'으로 설정됩니다.

@ref{5073,,PyImport_ExecCodeModuleWithPathnames()}도 참조하십시오.
@end deffn

@geindex PyImport_ExecCodeModuleObject (C function)
@anchor{c-api/import c PyImport_ExecCodeModuleObject}@anchor{5072}
@deffn {C 함수} @ref{5dc,,PyObject} *PyImport_ExecCodeModuleObject (PyObject *name, PyObject *co, PyObject *pathname, PyObject *cpathname)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI} 버전 3.7 이후로.'
@ref{5071,,PyImport_ExecCodeModuleEx()}와 유사하지만, 모듈 객체의 @ref{321,,__cached__} 어트리뷰트는 @code{NULL}이 아니라면 `cpathname'으로 설정됩니다. 세 가지 함수 중 이것이 선호되는 것입니다.


Added in version 3.3.



버전 3.12에서 변경: Setting @ref{321,,__cached__} is deprecated. See
@ref{2269,,ModuleSpec} for alternatives.

@end deffn

@geindex PyImport_ExecCodeModuleWithPathnames (C function)
@anchor{c-api/import c PyImport_ExecCodeModuleWithPathnames}@anchor{5073}
@deffn {C 함수} @ref{5dc,,PyObject} *PyImport_ExecCodeModuleWithPathnames (const char *name, PyObject *co, const char *pathname, const char *cpathname)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
@ref{5072,,PyImport_ExecCodeModuleObject()}와 유사하지만, `name', `pathname' 및 `cpathname'은 UTF-8로 인코딩된 문자열입니다. `pathname'의 값이 @code{NULL}로 설정된 경우 어떤 값이 `cpathname'에서 와야하는지 알아내려고 합니다.


Added in version 3.2.



버전 3.3에서 변경: 바이트 코드 경로만 제공되면 소스 경로를 계산할 때 @code{imp.source_from_cache()}를 사용합니다.



버전 3.12에서 변경: No longer uses the removed @code{imp} module.

@end deffn

@geindex PyImport_GetMagicNumber (C function)
@anchor{c-api/import c PyImport_GetMagicNumber}@anchor{13a8}
@deffn {C 함수} long PyImport_GetMagicNumber ()
` Part of the @ref{774,,안정 ABI}.'
파이썬 바이트 코드 파일(일명 @code{.pyc} 파일)의 매직 번호(magic number)를 반환합니다. 매직 번호는 바이트 코드 파일의 처음 4바이트에 리틀 엔디안 바이트 순서로 존재해야 합니다. 에러 시 @code{-1}을 반환합니다.


버전 3.3에서 변경: 실패 시 @code{-1}을 반환합니다.

@end deffn

@geindex PyImport_GetMagicTag (C function)
@anchor{c-api/import c PyImport_GetMagicTag}@anchor{5074}
@deffn {C 함수} const char *PyImport_GetMagicTag ()
` Part of the @ref{774,,안정 ABI}.'
@geindex Python 향상 제안; PEP 3147
PEP 3147@footnote{https://peps.python.org/pep-3147/} 형식 파이썬 바이트 코드 파일 이름의 매직 태그 문자열을 반환합니다. @code{sys.implementation.cache_tag}의 값은 신뢰할 수 있고 이 함수 대신 사용해야 함에 유의하십시오.


Added in version 3.2.

@end deffn

@geindex PyImport_GetModuleDict (C function)
@anchor{c-api/import c PyImport_GetModuleDict}@anchor{5075}
@deffn {C 함수} @ref{5dc,,PyObject} *PyImport_GetModuleDict ()
`반환값: 빌린 참조.'` Part of the @ref{774,,안정 ABI}.'
모듈 관리에 사용되는 딕셔너리(일명 @code{sys.modules})를 반환합니다. 이것은 인터프리터마다 존재하는 변수임에 유의하십시오.
@end deffn

@geindex PyImport_GetModule (C function)
@anchor{c-api/import c PyImport_GetModule}@anchor{dab}
@deffn {C 함수} @ref{5dc,,PyObject} *PyImport_GetModule (PyObject *name)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI} 버전 3.8 이후로.'
주어진 이름으로 이미 임포트 된 모듈을 반환합니다. 모듈이 아직 임포트 되지 않았다면 @code{NULL}을 반환하지만 에러는 설정하지 않습니다. 조회에 실패하면 @code{NULL}을 반환하고 에러를 설정합니다.


Added in version 3.7.

@end deffn

@geindex PyImport_GetImporter (C function)
@anchor{c-api/import c PyImport_GetImporter}@anchor{1a84}
@deffn {C 함수} @ref{5dc,,PyObject} *PyImport_GetImporter (PyObject *path)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
@ref{3e4,,sys.path}/@code{pkg.__path__} 항목 `path'를 위한 파인더 객체를 반환합니다, @ref{7f9,,sys.path_importer_cache} 딕셔너리에서 꺼낼 수도 있습니다. 아직 캐시 되지 않았으면, 경로 항목을 처리할 수 있는 훅이 발견될 때까지 @ref{1223,,sys.path_hooks}를 탐색합니다. 훅이 없으면 @code{None}을 반환합니다; 이것은 호출자에게 @ref{244d,,경로 기반 파인더}가 이 경로 항목에 대한 파인더를 찾을 수 없음을 알려줍니다. @code{sys.path_importer_cache}에 결과를 캐시 합니다. 파인더 객체에 대한 새로운 참조를 반환합니다.
@end deffn

@geindex PyImport_ImportFrozenModuleObject (C function)
@anchor{c-api/import c PyImport_ImportFrozenModuleObject}@anchor{5077}
@deffn {C 함수} int PyImport_ImportFrozenModuleObject (PyObject *name)
` Part of the @ref{774,,안정 ABI} 버전 3.7 이후로.'
`name'이라는 이름의 프로즌 모듈(frozen module)을 로드합니다. 성공하면 @code{1}을, 모듈을 찾지 못하면 @code{0}을, 초기화에 실패하면 예외를 설정하고 @code{-1}을 반환합니다. 로드가 성공할 때 임포트 된 모듈에 액세스하려면 @ref{3dc,,PyImport_ImportModule()}을 사용하십시오. (잘못된 이름에 주의하십시오 — 이 함수는 모듈이 이미 임포트 되었을 때 다시 로드합니다.)


Added in version 3.3.



버전 3.4에서 변경: @code{__file__} 어트리뷰트는 더는 모듈에 설정되지 않습니다.

@end deffn

@geindex PyImport_ImportFrozenModule (C function)
@anchor{c-api/import c PyImport_ImportFrozenModule}@anchor{5076}
@deffn {C 함수} int PyImport_ImportFrozenModule (const char *name)
` Part of the @ref{774,,안정 ABI}.'
@ref{5077,,PyImport_ImportFrozenModuleObject()}와 비슷하지만, name은 유니코드 객체 대신 UTF-8로 인코딩된 문자열입니다.
@end deffn

@geindex _frozen (C struct)
@anchor{c-api/import c _frozen}@anchor{978}
@deffn {C 구조체} struct _frozen

@geindex freeze 유틸리티

이것은 @code{freeze} 유틸리티(파이썬 소스 배포의 @code{Tools/freeze/}를 참조하십시오)가 생성한 프로즌 모듈 디스크립터를 위한 구조체 형 정의입니다. @code{Include/import.h}에 있는 정의는 다음과 같습니다:

@example
struct _frozen @{
    const char *name;
    const unsigned char *code;
    int size;
    bool is_package;
@};
@end example


버전 3.11에서 변경: The new @code{is_package} field indicates whether the module is a package or not.
This replaces setting the @code{size} field to a negative value.

@end deffn

@geindex PyImport_FrozenModules (C var)
@anchor{c-api/import c PyImport_FrozenModules}@anchor{3344}
@deffn {C 변수} const struct @ref{978,,_frozen} *PyImport_FrozenModules

이 포인터는 @ref{978,,_frozen} 레코드의 배열을 가리키도록 초기화되는데, 멤버가 모두 @code{NULL}이나 0인 레코드로 끝납니다. 프로즌 모듈이 임포트 될 때, 이 테이블에서 검색됩니다. 제삼자 코드는 이것을 사용하여 동적으로 생성된 프로즌 모듈 컬렉션을 제공할 수 있습니다.
@end deffn

@geindex PyImport_AppendInittab (C function)
@anchor{c-api/import c PyImport_AppendInittab}@anchor{1b1a}
@deffn {C 함수} int PyImport_AppendInittab (const char *name, PyObject *(*initfunc)(void))
` Part of the @ref{774,,안정 ABI}.'
기존의 내장 모듈 테이블에 단일 모듈을 추가합니다. 이것은 @ref{1b1b,,PyImport_ExtendInittab()}을 감싸는 편리한 래퍼인데, 테이블을 확장할 수 없으면 @code{-1}을 반환합니다. 새 모듈은 `name'이라는 이름으로 임포트 될 수 있으며, `initfunc' 함수를 처음 시도한 임포트에서 호출되는 초기화 함수로 사용합니다. @ref{460,,Py_Initialize()} 전에 호출해야 합니다.
@end deffn

@geindex _inittab (C struct)
@anchor{c-api/import c _inittab}@anchor{526a}
@deffn {C 구조체} struct _inittab

내장 모듈 목록에 있는 단일 항목을 기술하는 구조체. 파이썬을 내장하는 프로그램은 @ref{1b1b,,PyImport_ExtendInittab()}과 함께 이러한 구조체의 배열을 사용하여 추가 내장 모듈을 제공 할 수 있습니다. 구조체는 두 개의 멤버로 구성됩니다:

@geindex _inittab.name (C member)
@anchor{c-api/import c _inittab name}@anchor{526b}
@deffn {C 멤버 변수} const char *name

모듈 이름, ASCII로 인코딩된 문자열.
@end deffn

@geindex _inittab.initfunc (C member)
@anchor{c-api/import c _inittab initfunc}@anchor{526c}
@deffn {C 멤버 변수} @ref{5dc,,PyObject} *(*initfunc)(void)

인터프리터에 내장된 모듈을 위한 초기화 함수.
@end deffn
@end deffn

@geindex PyImport_ExtendInittab (C function)
@anchor{c-api/import c PyImport_ExtendInittab}@anchor{1b1b}
@deffn {C 함수} int PyImport_ExtendInittab (struct _inittab *newtab)

내장 모듈 테이블에 모듈 컬렉션을 추가합니다. `newtab' 배열은 @ref{526b,,name} 필드에 @code{NULL}을 포함하는 센티넬(sentinel) 항목으로 끝나야 합니다; 센티넬 값을 제공하지 않으면 메모리 오류가 발생할 수 있습니다. 성공하면 @code{0}을, 내부 테이블을 확장하기 위한 메모리가 충분하지 않으면 @code{-1}을 반환합니다. 실패하면, 내부 테이블에 모듈이 추가되지 않습니다. @ref{460,,Py_Initialize()} 전에 호출해야 합니다.

If Python is initialized multiple times, @ref{1b1a,,PyImport_AppendInittab()} or
@ref{1b1b,,PyImport_ExtendInittab()} must be called before each Python
initialization.
@end deffn

@geindex PyImport_Inittab (C var)
@anchor{c-api/import c PyImport_Inittab}@anchor{1b19}
@deffn {C 변수} struct @ref{526a,,_inittab} *PyImport_Inittab

The table of built-in modules used by Python initialization. Do not use this directly;
use @ref{1b1a,,PyImport_AppendInittab()} and @ref{1b1b,,PyImport_ExtendInittab()}
instead.
@end deffn

@geindex PyImport_ImportModuleAttr (C function)
@anchor{c-api/import c PyImport_ImportModuleAttr}@anchor{396}
@deffn {C 함수} @ref{5dc,,PyObject} *PyImport_ImportModuleAttr (PyObject *mod_name, PyObject *attr_name)
`반환값: 새 참조.'
Import the module `mod_name' and get its attribute `attr_name'.

Names must be Python @ref{169,,str} objects.

Helper function combining @ref{1601,,PyImport_Import()} and
@ref{5ec,,PyObject_GetAttr()}. For example, it can raise @ref{659,,ImportError} if
the module is not found, and @ref{5ee,,AttributeError} if the attribute doesn’t
exist.


Added in version 3.14.

@end deffn

@geindex PyImport_ImportModuleAttrString (C function)
@anchor{c-api/import c PyImport_ImportModuleAttrString}@anchor{397}
@deffn {C 함수} @ref{5dc,,PyObject} *PyImport_ImportModuleAttrString (const char *mod_name, const char *attr_name)
`반환값: 새 참조.'
Similar to @ref{396,,PyImport_ImportModuleAttr()}, but names are UTF-8 encoded
strings instead of Python @ref{169,,str} objects.


Added in version 3.14.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 데이터 마샬링 지원,인자 구문 분석과 값 구축,모듈 임포트 하기<2>,유틸리티<2>
@anchor{c-api/marshal doc}@anchor{526d}@anchor{c-api/marshal data-marshalling-support}@anchor{526e}@anchor{c-api/marshal marshalling-utils}@anchor{526f}@anchor{c-api/marshal translation-repo}@anchor{5270}
@subsection 데이터 마샬링 지원


이러한 루틴은 C 코드가 @ref{91,,marshal} 모듈과 같은 데이터 형식을 사용하여 직렬화된 객체로 작업 할 수 있도록 합니다. 직렬화 형식으로 데이터를 쓰는 함수와 데이터를 다시 읽는 데 사용할 수 있는 추가 함수가 있습니다. 마샬링 된 데이터를 저장하는 데 사용되는 파일은 바이너리 모드로 열어야 합니다.

숫자 값은 최하위 바이트가 먼저 저장됩니다.

The module supports several versions of the data format; see
the @ref{91,,Python module documentation} for details.

@geindex Py_MARSHAL_VERSION (C macro)
@anchor{c-api/marshal c Py_MARSHAL_VERSION}@anchor{5271}
@deffn {C 매크로} Py_MARSHAL_VERSION

The current format version. See @ref{2d69,,marshal.version}.
@end deffn

@geindex PyMarshal_WriteLongToFile (C function)
@anchor{c-api/marshal c PyMarshal_WriteLongToFile}@anchor{998}
@deffn {C 함수} void PyMarshal_WriteLongToFile (long value, FILE *file, int version)

long 정수 `value'를 `file'로 마샬합니다. `value'의 최하위 32비트 만 기록합니다; 기본 long 형의 크기와 관계없이. `version'은 파일 형식을 나타냅니다.

This function can fail, in which case it sets the error indicator.
Use @ref{1cac,,PyErr_Occurred()} to check for that.
@end deffn

@geindex PyMarshal_WriteObjectToFile (C function)
@anchor{c-api/marshal c PyMarshal_WriteObjectToFile}@anchor{999}
@deffn {C 함수} void PyMarshal_WriteObjectToFile (PyObject *value, FILE *file, int version)

파이썬 객체 `value'를 `file'로 마샬합니다. `version'은 파일 형식을 나타냅니다.

This function can fail, in which case it sets the error indicator.
Use @ref{1cac,,PyErr_Occurred()} to check for that.
@end deffn

@geindex PyMarshal_WriteObjectToString (C function)
@anchor{c-api/marshal c PyMarshal_WriteObjectToString}@anchor{99b}
@deffn {C 함수} @ref{5dc,,PyObject} *PyMarshal_WriteObjectToString (PyObject *value, int version)
`반환값: 새 참조.'
마샬된 `value' 표현을 포함한 바이트열 객체를 반환합니다. `version'은 파일 형식을 나타냅니다.
@end deffn

다음 함수를 사용하면 마샬된 값을 다시 읽을 수 있습니다.

@geindex PyMarshal_ReadLongFromFile (C function)
@anchor{c-api/marshal c PyMarshal_ReadLongFromFile}@anchor{5272}
@deffn {C 함수} long PyMarshal_ReadLongFromFile (FILE *file)

읽기 위해 열린 FILE*의 데이터 스트림에서 C long을 반환합니다. 이 함수를 사용하면 long의 기본 크기와 관계없이 32비트 값만 읽을 수 있습니다.

에러 시, 적절한 예외(@ref{14de,,EOFError})를 설정하고 @code{-1}을 반환합니다.
@end deffn

@geindex PyMarshal_ReadShortFromFile (C function)
@anchor{c-api/marshal c PyMarshal_ReadShortFromFile}@anchor{5273}
@deffn {C 함수} int PyMarshal_ReadShortFromFile (FILE *file)

읽기 위해 열린 FILE*의 데이터 스트림에서 C short를 반환합니다. 이 함수를 사용하면 short의 기본 크기와 관계없이 16비트 값만 읽을 수 있습니다.

에러 시, 적절한 예외(@ref{14de,,EOFError})를 설정하고 @code{-1}을 반환합니다.
@end deffn

@geindex PyMarshal_ReadObjectFromFile (C function)
@anchor{c-api/marshal c PyMarshal_ReadObjectFromFile}@anchor{5274}
@deffn {C 함수} @ref{5dc,,PyObject} *PyMarshal_ReadObjectFromFile (FILE *file)
`반환값: 새 참조.'
읽기 위해 열린 FILE*의 데이터 스트림에서 파이썬 객체를 반환합니다.

에러 시, 적절한 예외(@ref{14de,,EOFError}, @ref{2ec,,ValueError} 또는 @ref{198,,TypeError})를 설정하고 @code{NULL}을 반환합니다.
@end deffn

@geindex PyMarshal_ReadLastObjectFromFile (C function)
@anchor{c-api/marshal c PyMarshal_ReadLastObjectFromFile}@anchor{5275}
@deffn {C 함수} @ref{5dc,,PyObject} *PyMarshal_ReadLastObjectFromFile (FILE *file)
`반환값: 새 참조.'
Return a Python object from the data stream in a FILE* opened for
reading.  Unlike @ref{5274,,PyMarshal_ReadObjectFromFile()}, this function
assumes that no further objects will be read from the file, allowing it to
aggressively load file data into memory so that the de-serialization can
operate from data in memory rather than reading a byte at a time from the
file.  Only use this variant if you are certain that you won’t be reading
anything else from the file.

에러 시, 적절한 예외(@ref{14de,,EOFError}, @ref{2ec,,ValueError} 또는 @ref{198,,TypeError})를 설정하고 @code{NULL}을 반환합니다.
@end deffn

@geindex PyMarshal_ReadObjectFromString (C function)
@anchor{c-api/marshal c PyMarshal_ReadObjectFromString}@anchor{99a}
@deffn {C 함수} @ref{5dc,,PyObject} *PyMarshal_ReadObjectFromString (const char *data, Py_ssize_t len)
`반환값: 새 참조.'
`data'가 가리키는 `len' 바이트를 포함하는 바이트 버퍼의 데이터 스트림에서 파이썬 객체를 반환합니다.

에러 시, 적절한 예외(@ref{14de,,EOFError}, @ref{2ec,,ValueError} 또는 @ref{198,,TypeError})를 설정하고 @code{NULL}을 반환합니다.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 인자 구문 분석과 값 구축,문자열 변환과 포매팅,데이터 마샬링 지원,유틸리티<2>
@anchor{c-api/arg doc}@anchor{5276}@anchor{c-api/arg arg-parsing}@anchor{3d5}@anchor{c-api/arg parsing-arguments-and-building-values}@anchor{5277}@anchor{c-api/arg translation-repo}@anchor{5278}
@subsection 인자 구문 분석과 값 구축


이 함수들은 자체 확장 함수와 메서드를 만들 때 유용합니다. 추가 정보와 예제는 @ref{1fb9,,파이썬 인터프리터 확장 및 내장}에 있습니다.

설명된 이러한 함수 중 처음 세 개인 @ref{3c1,,PyArg_ParseTuple()}, @ref{622,,PyArg_ParseTupleAndKeywords()} 및 @ref{1811,,PyArg_Parse()}는 모두 예상 인자에 관한 사항을 함수에 알리는 데 사용되는 `포맷 문자열(format strings)'을 사용합니다. 포맷 문자열은 이러한 각 함수에 대해 같은 문법을 사용합니다.

@menu
* 인자 구문 분석:: 
* 값 구축:: 

@end menu

@node 인자 구문 분석,값 구축,,인자 구문 분석과 값 구축
@anchor{c-api/arg parsing-arguments}@anchor{5279}
@subsubsection 인자 구문 분석


포맷 문자열은 0개 이상의 “포맷 단위(format units)”로 구성됩니다. 포맷 단위는 하나의 파이썬 객체를 설명합니다; 일반적으로 단일 문자나 괄호로 묶인 포맷 단위 시퀀스입니다. 몇 가지 예외를 제외하고, 괄호로 묶인 시퀀스가 아닌 포맷 단위는 일반적으로 이러한 함수에 대한 단일 주소 인자에 대응합니다. 다음 설명에서, 인용된(quoted) 형식은 포맷 단위입니다; (둥근) 괄호 안의 항목은 포맷 단위와 일치하는 파이썬 객체 형입니다; [대괄호] 안의 항목은 주소를 전달해야 하는 C 변수의 형입니다.

@menu
* 문자열과 버퍼:: 
* 숫자: 숫자<2>. 
* 기타 객체:: 
* API 함수:: 

@end menu

@node 문자열과 버퍼,숫자<2>,,인자 구문 분석
@anchor{c-api/arg arg-parsing-string-and-buffers}@anchor{62a}@anchor{c-api/arg strings-and-buffers}@anchor{527a}
@subsubsection 문자열과 버퍼


@cartouche
@quotation 참고 
On Python 3.12 and older, the macro @code{PY_SSIZE_T_CLEAN} must be
defined before including @code{Python.h} to use all @code{#} variants of
formats (@code{s#}, @code{y#}, etc.) explained below.
This is not necessary on Python 3.13 and later.
@end quotation
@end cartouche

이러한 포맷을 사용하면 연속적인 메모리 청크로 객체에 액세스 할 수 있습니다. 반환된 유니코드나 바이트열 영역에 대한 원시 저장소를 제공할 필요가 없습니다.

달리 명시되지 않는 한, 버퍼는 NUL로 종료되지 않습니다.

There are three ways strings and buffers can be converted to C:


@itemize *

@item 
@code{y*} 와 @code{s*} 같은 포맷은 @ref{95b,,Py_buffer} 구조체를 채웁니다. 이는 하부 버퍼를 잠가서, 호출자가 @ref{4efc,,Py_BEGIN_ALLOW_THREADS} 블록 내에서도 가변 데이터의 크기가 조정되거나 파괴될 위험 없이 이후에 버퍼를 사용할 수 있습니다. 결과적으로, 데이터 처리를 마친 후 (또는 모든 조기 중단의 경우) @ref{639,,PyBuffer_Release()}를 `호출해야 합니다'.

@item 
The @code{es}, @code{es#}, @code{et} and @code{et#} formats allocate the result buffer.
`You have to call' @ref{1647,,PyMem_Free()} after you have finished
processing the data (or in any early abort case).

@item @anchor{c-api/arg c-arg-borrowed-buffer}@anchor{3d6}
Other formats take a @ref{169,,str} or a read-only @ref{193,,bytes-like object},
such as @ref{192,,bytes}, and provide a @code{const char *} pointer to
its buffer.
In this case the buffer is “borrowed”: it is managed by the corresponding
Python object, and shares the lifetime of this object.
You won’t have to release any memory yourself.

To ensure that the underlying buffer may be safely borrowed, the object’s
@ref{966,,PyBufferProcs.bf_releasebuffer} field must be @code{NULL}.
This disallows common mutable objects such as @ref{344,,bytearray},
but also some read-only objects such as @ref{165,,memoryview} of
@ref{192,,bytes}.

Besides this @code{bf_releasebuffer} requirement, there is no check to verify
whether the input object is immutable (e.g. whether it would honor a request
for a writable buffer, or whether another thread can mutate the data).
@end itemize


@table @asis

@item @code{s} (@ref{169,,str}) [const char *]

유니코드 객체를 문자열에 대한 C 포인터로 변환합니다. 기존 문자열에 대한 포인터는 여러분이 주소를 전달한 문자 포인터 변수에 저장됩니다. C 문자열은 NUL로 종료됩니다. 파이썬 문자열은 내장된 널 코드 포인트를 포함하지 않아야 합니다; 그렇다면 @ref{2ec,,ValueError} 예외가 발생합니다. 유니코드 객체는 @code{'utf-8'} 인코딩을 사용하여 C 문자열로 변환됩니다. 이 변환이 실패하면, @ref{462,,UnicodeError}가 발생합니다.

@cartouche
@quotation 참고 
이 포맷은 @ref{193,,바이트열류 객체}를 받아들이지 않습니다. 파일 시스템 경로를 받아들이고 이를 C 문자열로 변환하려면, @ref{f14,,PyUnicode_FSConverter()}를 `converter'로 @code{O&} 포맷을 사용하는 것이 좋습니다.
@end quotation
@end cartouche


버전 3.5에서 변경: 이전에는, 파이썬 문자열에서 내장된 널 코드 포인트가 발견되면 @ref{198,,TypeError}가 발생했습니다.


@item @code{s*} (@ref{169,,str} 또는 @ref{193,,바이트열류 객체}) [Py_buffer]

이 포맷은 바이트열류 객체뿐만 아니라 유니코드 객체를 받아들입니다. 호출자가 제공한 @ref{95b,,Py_buffer} 구조체를 채웁니다. 이 경우 결과 C 문자열은 내장된 NUL 바이트를 포함할 수 있습니다. 유니코드 객체는 @code{'utf-8'} 인코딩을 사용하여 C 문자열로 변환됩니다.

@item @code{s#} (@ref{169,,str}, 읽기 전용 @ref{193,,바이트열류 객체}) [const char *, @ref{c54,,Py_ssize_t}]

@ref{3d6,,빌린 버퍼}를 제공한다는 점을 제외하면, @code{s*}와 같습니다. 결과는 두 개의 C 변수에 저장됩니다. 첫 번째 변수는 C 문자열에 대한 포인터이고, 두 번째 변수는 길이입니다. 문자열은 내장 널 바이트를 포함할 수  있습니다. 유니코드 객체는 @code{'utf-8'} 인코딩을 사용하여 C 문자열로 변환됩니다.

@item @code{z} (@ref{169,,str} 또는 @code{None}) [const char *]

@code{s}와 비슷하지만, 파이썬 객체가 @code{None}일 수도 있는데, 이 경우 C 포인터가 @code{NULL}로 설정됩니다.

@item @code{z*} (@ref{169,,str}, @ref{193,,바이트열류 객체} 또는 @code{None}) [Py_buffer]

@code{s*}와 비슷하지만, 파이썬 객체는 @code{None}일 수도 있습니다, 이 경우 @ref{95b,,Py_buffer} 구조체의 @code{buf} 멤버가 @code{NULL}로 설정됩니다.

@item @code{z#} (@ref{169,,str}, 읽기 전용 @ref{193,,바이트열류 객체} 또는 @code{None}) [const char *, @ref{c54,,Py_ssize_t}]

@code{s#}와 비슷하지만, 파이썬 객체는 @code{None}일 수도 있습니다, 이 경우 C 포인터가 @code{NULL}로 설정됩니다.

@item @code{y} (읽기 전용 @ref{193,,바이트열류 객체}) [const char *]

이 포맷은 바이트열류 객체를 @ref{3d6,,빌린} 문자열에 대한 C 포인터로 변환합니다; 유니코드 객체를 받아들이지 않습니다. 바이트열 버퍼는 내장 널 바이트를 포함하지 않아야 합니다; 만약 그렇다면, @ref{2ec,,ValueError} 예외가 발생합니다.


버전 3.5에서 변경: 이전에는, 바이트열 버퍼에서 내장 널 바이트가 발견되면 @ref{198,,TypeError}가 발생했습니다.


@item @code{y*} (@ref{193,,바이트열류 객체}) [Py_buffer]

@code{s*}의 이 변형은 유니코드 객체가 아니라 바이트열류 객체만 받아들입니다. `바이너리 데이터를 받아들이는 권장 방법입니다.'

@item @code{y#} (읽기 전용 @ref{193,,바이트열류 객체}) [const char *, @ref{c54,,Py_ssize_t}]

@code{s#}의 이 변형은 유니코드 객체가 아니라 바이트열류 객체만 받아들입니다.

@item @code{S} (@ref{192,,bytes}) [PyBytesObject *]

변환을 시도하지 않고, 파이썬 객체가 @ref{192,,bytes} 객체일 것을 요구합니다. 객체가 바이트열 객체가 아니면 @ref{198,,TypeError}를 발생시킵니다. C 변수는 @ref{5dc,,PyObject}*로 선언될 수도 있습니다.

@item @code{Y} (@ref{344,,bytearray}) [PyByteArrayObject *]

변환을 시도하지 않고, 파이썬 객체가 @ref{344,,bytearray} 객체일 것을 요구합니다. 객체가 @code{bytearray} 객체가 아니면 @ref{198,,TypeError}를 발생시킵니다. C 변수는 @ref{5dc,,PyObject}*로 선언될 수도 있습니다.

@item @code{U} (@ref{169,,str}) [PyObject *]

변환을 시도하지 않고, 파이썬 객체가 유니코드 객체일 것을 요구합니다. 객체가 유니코드 객체가 아니면 @ref{198,,TypeError}를 발생시킵니다. C 변수는 @ref{5dc,,PyObject}*로 선언될 수도 있습니다.

@item @code{w*} (읽기-쓰기 @ref{193,,바이트열류 객체}) [Py_buffer]

This format accepts any object which implements the read-write buffer
interface. It fills a @ref{95b,,Py_buffer} structure provided by the caller.
The buffer may contain embedded null bytes. The caller has to call
@ref{639,,PyBuffer_Release()} when it is done with the buffer.

@item @code{es} (@ref{169,,str}) [const char *encoding, char **buffer]

@code{s}의 이 변형은 유니코드를 문자 버퍼로 인코딩하는 데 사용됩니다. 내장 NUL 바이트가 포함되지 않은 인코딩된 데이터에 대해서만 작동합니다.

이 포맷에는 두 개의 인자가 필요합니다. 첫 번째는 입력으로만 사용되며, 인코딩 이름을 가리키는 NUL 종료 문자열로 const char*이거나, @code{'utf-8'} 인코딩이 사용되도록 하는 @code{NULL}이어야 합니다. 명명된 인코딩이 파이썬에 알려지지 않았으면 예외가 발생합니다. 두 번째 인자는 char**여야 합니다; 참조하는 포인터의 값은 인자 텍스트의 내용이 있는 버퍼로 설정됩니다. 텍스트는 첫 번째 인자에 지정된 인코딩으로 인코딩됩니다.

@ref{3c1,,PyArg_ParseTuple()}은 필요한 크기의 버퍼를 할당하고, 인코딩된 데이터를 이 버퍼에 복사하고 새로 할당된 스토리지를 참조하도록 `*buffer'를 조정합니다. 호출자는 사용 후에 할당된 버퍼를 해제하기 위해 @ref{1647,,PyMem_Free()}를 호출해야 합니다.

@item @code{et} (@ref{169,,str}, @ref{192,,bytes} 또는 @ref{344,,bytearray}) [const char *encoding, char **buffer]

바이트 문자열 객체를 다시 코딩하지 않고 통과시킨다는 점을 제외하면 @code{es}와 같습니다. 대신, 구현은 바이트 문자열 객체가 매개 변수로 전달된 인코딩을 사용한다고 가정합니다.

@item @code{es#} (@ref{169,,str}) [const char *encoding, char **buffer, @ref{c54,,Py_ssize_t} *buffer_length]

@code{s#}의 이 변형은 유니코드를 문자 버퍼로 인코딩하는 데 사용됩니다. @code{es} 포맷과 달리, 이 변형은 NUL 문자를 포함하는 입력 데이터를 허용합니다.

세 가지 인자가 필요합니다. 첫 번째는 입력으로만 사용되며, 인코딩 이름을 가리키는 NUL 종료 문자열로 const char*이거나, @code{'utf-8'} 인코딩이 사용되도록 하는 @code{NULL}이어야 합니다. 명명된 인코딩이 파이썬에 알려지지 않았으면 예외가 발생합니다. 두 번째 인자는 char**여야 합니다; 참조하는 포인터의 값은 인자 텍스트의 내용이 있는 버퍼로 설정됩니다. 텍스트는 첫 번째 인자에 지정된 인코딩으로 인코딩됩니다. 세 번째 인자는 정수에 대한 포인터여야 합니다; 참조된 정수는 출력 버퍼의 바이트 수로 설정됩니다.

두 가지 작동 모드가 있습니다:

`*buffer'가 @code{NULL} 포인터를 가리키면, 함수는 필요한 크기의 버퍼를 할당하고, 이 버퍼로 인코딩된 데이터를 복사하고 `*buffer'를 새로 할당된 스토리지를 참조하도록 설정합니다. 호출자는 사용 후 할당된 버퍼를 해제하기 위해 @ref{1647,,PyMem_Free()}를 호출해야 합니다.

`*buffer'가 @code{NULL}이 아닌 포인터를 가리키면 (이미 할당된 버퍼), @ref{3c1,,PyArg_ParseTuple()}은 이 위치를 버퍼로 사용하고 `*buffer_length'의 초깃값을 버퍼 크기로 해석합니다. 그런 다음 인코딩된 데이터를 버퍼에 복사하고 NUL 종료합니다. 버퍼가 충분히 크지 않으면, @ref{2ec,,ValueError}가 설정됩니다.

두 경우 모두, `*buffer_length'는 후행 NUL 바이트를 제외한 인코딩된 데이터의 길이로 설정됩니다.

@item @code{et#} (@ref{169,,str}, @ref{192,,bytes} 또는 @ref{344,,bytearray}) [const char *encoding, char **buffer, @ref{c54,,Py_ssize_t} *buffer_length]

바이트 문자열 객체를 다시 코딩하지 않고 통과시킨다는 점을 제외하면 @code{es#}와 같습니다. 대신, 구현은 바이트 문자열 객체가 매개 변수로 전달된 인코딩을 사용한다고 가정합니다.
@end table


버전 3.12에서 변경: @code{u}, @code{u#}, @code{Z}, and @code{Z#} are removed because they used a legacy
@code{Py_UNICODE*} representation.


@node 숫자<2>,기타 객체,문자열과 버퍼,인자 구문 분석
@anchor{c-api/arg numbers}@anchor{527b}
@subsubsection 숫자


These formats allow representing Python numbers or single characters as C numbers.
Formats that require @ref{19b,,int}, @ref{196,,float} or @ref{197,,complex} can
also use the corresponding special methods @ref{19e,,__index__()},
@ref{bc0,,__float__()} or @ref{7fc,,__complex__()} to convert
the Python object to the required type.

For signed integer formats, @ref{a81,,OverflowError} is raised if the value
is out of range for the C type.
For unsigned integer formats, no range checking is done — the
most significant bits are silently truncated when the receiving field is too
small to receive the value.


@table @asis

@item @code{b} (@ref{19b,,int}) [unsigned char]

음이 아닌 파이썬 정수를 부호 없는 작은 정수로 변환하고, C unsigned char에 저장합니다.

@item @code{B} (@ref{19b,,int}) [unsigned char]

오버플로 검사 없이 파이썬 정수를 작은 정수로 변환하고, C unsigned char에 저장합니다.

@item @code{h} (@ref{19b,,int}) [short int]

파이썬 정수를 C short int로 변환합니다.

@item @code{H} (@ref{19b,,int}) [unsigned short int]

오버플로 검사 없이, 파이썬 정수를 C unsigned short int로 변환합니다.

@item @code{i} (@ref{19b,,int}) [int]

파이썬 정수를 일반 C int로 변환합니다.

@item @code{I} (@ref{19b,,int}) [unsigned int]

오버플로 검사 없이, 파이썬 정수를 C unsigned int로 변환합니다.

@item @code{l} (@ref{19b,,int}) [long int]

파이썬 정수를 C long int로 변환합니다.

@item @code{k} (@ref{19b,,int}) [unsigned long]

오버플로 검사 없이 파이썬 정수를 C unsigned long으로 변환합니다.


버전 3.14에서 변경: Use @ref{19e,,__index__()} if available.


@item @code{L} (@ref{19b,,int}) [long long]

파이썬 정수를 C long long으로 변환합니다.

@item @code{K} (@ref{19b,,int}) [unsigned long long]

오버플로 검사 없이 파이썬 정수를 C unsigned long long으로 변환합니다.


버전 3.14에서 변경: Use @ref{19e,,__index__()} if available.


@item @code{n} (@ref{19b,,int}) [@ref{c54,,Py_ssize_t}]

파이썬 정수를 C @ref{c54,,Py_ssize_t}로 변환합니다.

@item @code{c} (길이 1의 @ref{192,,bytes} 또는 @ref{344,,bytearray}) [char]

길이가 1인 @ref{192,,bytes}나 @ref{344,,bytearray} 객체로 표시된, 파이썬 바이트를 C char로 변환합니다.


버전 3.3에서 변경: @ref{344,,bytearray} 객체를 허용합니다.


@item @code{C} (길이 1의 @ref{169,,str}) [int]

길이가 1인 @ref{169,,str} 객체로 표시된, 파이썬 문자를 C int로 변환합니다.

@item @code{f} (@ref{196,,float}) [float]

파이썬 부동 소수점 숫자를 C float로 변환합니다.

@item @code{d} (@ref{196,,float}) [double]

파이썬 부동 소수점 숫자를 C double로 변환합니다.

@item @code{D} (@ref{197,,complex}) [Py_complex]

파이썬 복소수를 C @ref{527c,,Py_complex} 구조체로 변환합니다.
@end table

@node 기타 객체,API 함수,숫자<2>,인자 구문 분석
@anchor{c-api/arg other-objects}@anchor{527d}
@subsubsection 기타 객체



@table @asis

@item @code{O} (object) [PyObject *]

C 객체 포인터에 파이썬 객체를 (변환 없이) 저장합니다. 따라서 C 프로그램은 전달된 실제 객체를 받습니다. 객체에 대한 새로운 @ref{5df,,강한 참조}는 생성되지 않습니다 (즉, 객체의 참조 횟수는 증가하지 않습니다). 저장된 포인터는 @code{NULL}이 아닙니다.

@item @code{O!} (object) [`typeobject', PyObject *]

C 객체 포인터에 파이썬 객체를 저장합니다. 이것은 @code{O}와 유사하지만, 두 개의 C 인자를 취합니다: 첫 번째는 파이썬 형 객체의 주소이고, 두 번째는 객체 포인터가 저장되는 (@ref{5dc,,PyObject}* 형의) C 변수의 주소입니다. 파이썬 객체가 필요한 형이 아니면, @ref{198,,TypeError}가 발생합니다.
@end table
@anchor{c-api/arg o-ampersand}@anchor{527e}

@table @asis

@item @code{O&} (object) [`converter', `address']

`converter' 함수를 통해 파이썬 객체를 C 변수로 변환합니다. 두 개의 인자를 취합니다: 첫 번째는 함수이고, 두 번째는 void*로 변환된, (임의의 형의) C 변수의 주소입니다. `converter' 함수는 다음과 같이 호출됩니다:

@example
status = converter(object, address);
@end example

여기서 `object'는 변환할 파이썬 객체이고 `address'는 @code{PyArg_Parse*} 함수에 전달된 void* 인자입니다. 반환된 `status'는 성공적인 변환의 경우 @code{1}이고 변환에 실패한 경우 @code{0}이어야 합니다. 변환이 실패하면, `converter' 함수는 예외를 발생시키고 `address'의 내용을 수정하지 않은 상태로 두어야 합니다.

@geindex Py_CLEANUP_SUPPORTED (C macro)
@anchor{c-api/arg c Py_CLEANUP_SUPPORTED}@anchor{527f}
`converter'가 @code{Py_CLEANUP_SUPPORTED}를 반환하면, 인자 구문 분석이 결국 실패하면 두 번째로 호출되어 변환기에 이미 할당된 메모리를 해제할 기회를 제공할 수 있습니다. 이 두 번째 호출에서, `object' 매개 변수는 @code{NULL}이 됩니다; `address'는 원래 호출과 같은 값을 갖습니다.

Examples of converters: @ref{f14,,PyUnicode_FSConverter()} and
@ref{796,,PyUnicode_FSDecoder()}.


버전 3.1에서 변경: @code{Py_CLEANUP_SUPPORTED}가 추가되었습니다.


@item @code{p} (@ref{3c3,,bool}) [int]

전달된 값의 논리값을 테스트(불리언 `p'redicate)하고 결과를 동등한 C 참/거짓 정숫값으로 변환합니다. 표현식이 참이면 int를 @code{1}로, 거짓이면 @code{0}으로 설정합니다. 모든 유효한 파이썬 값을 허용합니다. 파이썬이 논리값을 테스트하는 방법에 대한 자세한 내용은 @ref{185b,,논리값 검사}를 참조하십시오.


Added in version 3.3.


@item @code{(items)} (sequence) [`matching-items']

The object must be a Python sequence (except @ref{169,,str}, @ref{192,,bytes}
or @ref{344,,bytearray}) whose length is the number of format units
in `items'.  The C arguments must correspond to the individual format units in
`items'.  Format units for sequences may be nested.

If `items' contains format units which store a @ref{3d6,,borrowed buffer} (@code{s}, @code{s#}, @code{z}, @code{z#}, @code{y}, or @code{y#})
or a @ref{3d7,,borrowed reference} (@code{S}, @code{Y}, @code{U}, @code{O}, or @code{O!}),
the object must be a Python tuple.
The `converter' for the @code{O&} format unit in `items' must not store
a borrowed buffer or a borrowed reference.


버전 3.14에서 변경: @ref{169,,str} and @ref{344,,bytearray} objects no longer accepted as a sequence.



버전 3.14부터 폐지됨: Non-tuple sequences are deprecated if `items' contains format units
which store a borrowed buffer or a borrowed reference.

@end table

몇 가지 다른 문자는 포맷 문자열에서 의미가 있습니다. 중첩된 괄호 안에서는 나타날 수 없습니다. 그들은:


@table @asis

@item @code{|}

파이썬 인자 리스트의 나머지 인자가 선택 사항임을 나타냅니다. 선택적 인자에 해당하는 C 변수는 기본값으로 초기화되어야 합니다 — 선택적 인자가 지정되지 않을 때, @ref{3c1,,PyArg_ParseTuple()}은 해당 C 변수의 내용을 건드리지 않습니다.

@item @code{$}

@ref{622,,PyArg_ParseTupleAndKeywords()} 전용: 파이썬 인자 리스트의 나머지 인자가 키워드 전용임을 나타냅니다. 현재, 모든 키워드 전용 인자는 선택적 인자여야 하므로, @code{|}는 항상 포맷 문자열에서 @code{$} 앞에 지정되어야 합니다.


Added in version 3.3.


@item @code{:}

포맷 단위 리스트는 여기에서 끝납니다; 콜론 뒤의 문자열은 에러 메시지에서 함수 이름으로 사용됩니다 (@ref{3c1,,PyArg_ParseTuple()}이 발생시키는 예외의 “연관된 값”).

@item @code{;}

포맷 단위 리스트는 여기에서 끝납니다; 세미콜론 뒤의 문자열은 기본 에러 메시지의 에러 메시지 `대신' 에러 메시지로 사용됩니다. @code{:}와 @code{;}는 서로를 배제합니다.
@end table

호출자에게 제공되는 모든 파이썬 객체 참조는 `빌려온(borrowed)' 참조임에 유의하십시오; 해제하지 마십시오 (즉, 참조 횟수를 줄이지 마십시오)!

이러한 함수에 전달되는 추가 인자는 포맷 문자열에 의해 형이 결정되는 변수의 주소여야 합니다; 이들은 입력 튜플의 값을 저장하는 데 사용됩니다. 위의 포맷 단위 리스트에서 설명된 대로, 이러한 매개 변수가 입력값으로 사용되는 몇 가지 경우가 있습니다; 이 경우 해당 포맷 단위에 대해 지정된 것과 일치해야 합니다.

변환이 성공하려면, `arg' 객체가 포맷과 일치해야 하며 포맷이 소진되어야 합니다. 성공하면, @code{PyArg_Parse*} 함수는 참을 반환하고, 그렇지 않으면 거짓을 반환하고 적절한 예외를 발생시킵니다. 포맷 단위 중 하나의 변환 실패로 인해 @code{PyArg_Parse*} 함수가 실패하면, 해당 주소의 변수와 그 뒤에 오는 포맷 단위는 건드리지 않습니다.

@node API 함수,,기타 객체,인자 구문 분석
@anchor{c-api/arg api-functions}@anchor{5280}
@subsubsection API 함수


@geindex PyArg_ParseTuple (C function)
@anchor{c-api/arg c PyArg_ParseTuple}@anchor{3c1}
@deffn {C 함수} int PyArg_ParseTuple (PyObject *args, const char *format, ...)
` Part of the @ref{774,,안정 ABI}.'
위치 매개 변수만 지역 변수로 취하는 함수의 매개 변수를 구문 분석합니다. 성공하면 참을 반환합니다; 실패하면, 거짓을 반환하고 적절한 예외를 발생시킵니다.
@end deffn

@geindex PyArg_VaParse (C function)
@anchor{c-api/arg c PyArg_VaParse}@anchor{4fa3}
@deffn {C 함수} int PyArg_VaParse (PyObject *args, const char *format, va_list vargs)
` Part of the @ref{774,,안정 ABI}.'
가변 개수의 인자가 아닌 va_list를 받아들인다는 점을 제외하면, @ref{3c1,,PyArg_ParseTuple()}과 동일합니다.
@end deffn

@geindex PyArg_ParseTupleAndKeywords (C function)
@anchor{c-api/arg c PyArg_ParseTupleAndKeywords}@anchor{622}
@deffn {C 함수} int PyArg_ParseTupleAndKeywords (PyObject *args, PyObject *kw, const char *format, char *const *keywords, ...)
` Part of the @ref{774,,안정 ABI}.'
위치와 키워드 매개 변수를 모두 지역 변수로 취하는 함수의 매개 변수를 구문 분석합니다. `keywords' 인자는 널-종료된 ASCII 나 UTF-8 인코딩된 C 문자열로 지정된 키워드 매개 변수 이름의 @code{NULL}-종료 배열입니다. 빈 이름은 @ref{c77,,위치-전용 매개 변수}를 나타냅니다. 성공하면 참을 반환합니다; 실패하면, 거짓을 반환하고 적절한 예외를 발생시킵니다.

@cartouche
@quotation 참고 
The `keywords' parameter declaration is char *const* in C and
const char *const* in C++.
This can be overridden with the @ref{624,,PY_CXX_CONST} macro.
@end quotation
@end cartouche


버전 3.6에서 변경: @ref{c77,,위치-전용 매개 변수}에 대한 지원이 추가되었습니다.



버전 3.13에서 변경: The `keywords' parameter has now type char *const* in C and
const char *const* in C++, instead of char**.
Added support for non-ASCII keyword parameter names.

@end deffn

@geindex PyArg_VaParseTupleAndKeywords (C function)
@anchor{c-api/arg c PyArg_VaParseTupleAndKeywords}@anchor{623}
@deffn {C 함수} int PyArg_VaParseTupleAndKeywords (PyObject *args, PyObject *kw, const char *format, char *const *keywords, va_list vargs)
` Part of the @ref{774,,안정 ABI}.'
가변 개수의 인자가 아닌 va_list를 받아들인다는 점을 제외하면, @ref{622,,PyArg_ParseTupleAndKeywords()} 와 동일합니다.
@end deffn

@geindex PyArg_ValidateKeywordArguments (C function)
@anchor{c-api/arg c PyArg_ValidateKeywordArguments}@anchor{4fa4}
@deffn {C 함수} int PyArg_ValidateKeywordArguments (PyObject*)
` Part of the @ref{774,,안정 ABI}.'
키워드 인자 딕셔너리의 키가 문자열인지 확인합니다. @ref{622,,PyArg_ParseTupleAndKeywords()} 가 사용되지 않는 경우에만 필요합니다, 여기서는 이미 이 검사를 수행하기 때문입니다.


Added in version 3.2.

@end deffn

@geindex PyArg_Parse (C function)
@anchor{c-api/arg c PyArg_Parse}@anchor{1811}
@deffn {C 함수} int PyArg_Parse (PyObject *args, const char *format, ...)
` Part of the @ref{774,,안정 ABI}.'
단일 위치 매개 변수를 취하는 함수의 매개 변수를 지역 변수로 구문 분석합니다. 성공하면 참을 반환합니다; 실패하면, 거짓을 반환하고 적절한 예외를 발생시킵니다.

예제:

@example
// METH_O 호출 규칙을 사용하는 함수
static PyObject*
my_function(PyObject *module, PyObject *arg)
@{
    int value;
    if (!PyArg_Parse(arg, "i:my_function", &value)) @{
        return NULL;
    @}
    // ... value 를 사용합니다 ...
@}
@end example
@end deffn

@geindex PyArg_UnpackTuple (C function)
@anchor{c-api/arg c PyArg_UnpackTuple}@anchor{170b}
@deffn {C 함수} int PyArg_UnpackTuple (PyObject *args, const char *name, Py_ssize_t min, Py_ssize_t max, ...)
` Part of the @ref{774,,안정 ABI}.'
인자 형을 지정하기 위해 포맷 문자열을 사용하지 않는 더 간단한 형식의 매개 변수 조회. 이 방법으로 매개 변수를 꺼내는 함수는 함수나 메서드 테이블에서 @ref{170d,,METH_VARARGS}로 선언되어야 합니다. 실제 매개 변수를 포함하는 튜플은 `args'로 전달되어야 합니다; 이것은 실제로 튜플이어야 합니다. 튜플의 길이는 `min' 이상 `max' 이하이어야 합니다; `min'과 `max'는 같을 수 있습니다. 추가 인자는 함수에 전달되어야 하며, 각 인자는 @ref{5dc,,PyObject}* 변수에 대한 포인터여야 합니다; 이들은 `args'의 값으로 채워집니다; @ref{3d7,,빌린 참조}가 포함됩니다. `args'에서 제공하지 않는 선택적 매개 변수에 해당하는 변수는 채워지지 않습니다; 이것들은 호출자에 의해 초기화되어야 합니다. 이 함수는 성공하면 참을 반환하고 `args'가 튜플이 아니거나, 잘못된 수의 요소를 포함하면 거짓을 반환합니다; 실패하면 예외가 설정됩니다.

다음은 이 함수 사용의 예입니다, 약한 참조를 위한 @code{_weakref} 도우미 모듈의 소스에서 가져왔습니다:

@example
static PyObject *
weakref_ref(PyObject *self, PyObject *args)
@{
    PyObject *object;
    PyObject *callback = NULL;
    PyObject *result = NULL;

    if (PyArg_UnpackTuple(args, "ref", 1, 2, &object, &callback)) @{
        result = PyWeakref_NewRef(object, callback);
    @}
    return result;
@}
@end example

이 예제에서 @ref{170b,,PyArg_UnpackTuple()}에 대한 호출은 @ref{3c1,,PyArg_ParseTuple()}에 대한 다음 호출과 전적으로 동등합니다:

@example
PyArg_ParseTuple(args, "O|O:ref", &object, &callback)
@end example
@end deffn

@geindex PY_CXX_CONST (C macro)
@anchor{c-api/arg c PY_CXX_CONST}@anchor{624}
@deffn {C 매크로} PY_CXX_CONST

The value to be inserted, if any, before char *const*
in the `keywords' parameter declaration of
@ref{622,,PyArg_ParseTupleAndKeywords()} and
@ref{623,,PyArg_VaParseTupleAndKeywords()}.
Default empty for C and @code{const} for C++
(const char *const*).
To override, define it to the desired value before including
@code{Python.h}.


Added in version 3.13.

@end deffn

@node 값 구축,,인자 구문 분석,인자 구문 분석과 값 구축
@anchor{c-api/arg building-values}@anchor{5281}
@subsubsection 값 구축


@geindex Py_BuildValue (C function)
@anchor{c-api/arg c Py_BuildValue}@anchor{3c2}
@deffn {C 함수} @ref{5dc,,PyObject} *Py_BuildValue (const char *format, ...)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
@code{PyArg_Parse*} 함수 계열에서 받아들이는 것과 유사한 포맷 문자열과 값 시퀀스를 기반으로 새 값을 만듭니다. 값을 반환하거나 에러가 발생하면 @code{NULL}을 반환합니다; @code{NULL}이 반환되면 예외가 발생합니다.

@ref{3c2,,Py_BuildValue()}는 항상 튜플을 구축하지는 않습니다. 포맷 문자열에 둘 이상의 포맷 단위가 포함되었을 때만 튜플을 구축합니다. 포맷 문자열이 비어 있으면, @code{None}을 반환합니다; 정확히 하나의 포맷 단위를 포함하면, 해당 포맷 단위가 기술하는 객체가 무엇이건 반환합니다. 크기가 0이나 1인 튜플을 반환하도록 하려면, 포맷 문자열을 괄호로 묶으십시오.

@code{s}와 @code{s#} 포맷의 경우처럼, 메모리 버퍼가 데이터를 빌드 객체에 제공하기 위해 매개 변수로 전달될 때, 필요한 데이터가 복사됩니다. 호출자가 제공하는 버퍼는 @ref{3c2,,Py_BuildValue()}가 만든 객체에 의해 참조되지 않습니다. 즉, 여러분의 코드가 @code{malloc()}을 호출하고 할당된 메모리를 @code{Py_BuildValue()}에 전달하면, 인단 @code{Py_BuildValue()}가 반환되면 여러분이 코드가 해당 메모리에 대해 @code{free()}를 호출해야 합니다.

다음 설명에서, 인용된 형식은 포맷 단위입니다; (둥근) 괄호 안의 항목은 포맷 단위가 반환할 파이썬 객체 형입니다; [대괄호] 안의 항목은 전달할 C 값의 형입니다.

문자 스페이스, 탭, 콜론 및 쉼표는 포맷 문자열에서 무시됩니다 (하지만 @code{s#}와 같은 포맷 단위 내에서는 아닙니다). 이것은 긴 포맷 문자열을 좀 더 읽기 쉽게 만드는 데 사용할 수 있습니다.


@table @asis

@item @code{s} (@ref{169,,str} 또는 @code{None}) [const char *]

@code{'utf-8'} 인코딩을 사용하여 널-종료 C 문자열을 파이썬 @ref{169,,str} 객체로 변환합니다. C 문자열 포인터가 @code{NULL}이면, @code{None}이 사용됩니다.

@item @code{s#} (@ref{169,,str} 또는 @code{None}) [const char *, @ref{c54,,Py_ssize_t}]

@code{'utf-8'} 인코딩을 사용하여 C 문자열과 그 길이를 파이썬 @ref{169,,str} 객체로 변환합니다. C 문자열 포인터가 @code{NULL}이면, 길이가 무시되고 @code{None}이 반환됩니다.

@item @code{y} (@ref{192,,bytes}) [const char *]

이것은 C 문자열을 파이썬 @ref{192,,bytes} 객체로 변환합니다. C 문자열 포인터가 @code{NULL}이면, @code{None}이 반환됩니다.

@item @code{y#} (@ref{192,,bytes}) [const char *, @ref{c54,,Py_ssize_t}]

이것은 C 문자열과 그 길이를 파이썬 객체로 변환합니다. C 문자열 포인터가 @code{NULL}이면, @code{None}이 반환됩니다.

@item @code{z} (@ref{169,,str} 또는 @code{None}) [const char *]

@code{s}와 같습니다.

@item @code{z#} (@ref{169,,str} 또는 @code{None}) [const char *, @ref{c54,,Py_ssize_t}]

@code{s#}과 같습니다.

@item @code{u} (@ref{169,,str}) [const wchar_t *]

유니코드 (UTF-16 또는 UCS-4) 데이터의 널-종료 @code{wchar_t} 버퍼를 파이썬 유니코드 객체로 변환합니다. 유니코드 버퍼 포인터가 @code{NULL}이면, @code{None}이 반환됩니다.

@item @code{u#} (@ref{169,,str}) [const wchar_t *, @ref{c54,,Py_ssize_t}]

유니코드 (UTF-16 또는 UCS-4) 데이터 버퍼와 그 길이를 파이썬 유니코드 객체로 변환합니다. 유니코드 버퍼 포인터가 @code{NULL}이면, 길이가 무시되고 @code{None}이 반환됩니다.

@item @code{U} (@ref{169,,str} 또는 @code{None}) [const char *]

@code{s}와 같습니다.

@item @code{U#} (@ref{169,,str} 또는 @code{None}) [const char *, @ref{c54,,Py_ssize_t}]

@code{s#}과 같습니다.

@item @code{i} (@ref{19b,,int}) [int]

일반 C int를 파이썬 정수 객체로 변환합니다.

@item @code{b} (@ref{19b,,int}) [char]

일반 C char을 파이썬 정수 객체로 변환합니다.

@item @code{h} (@ref{19b,,int}) [short int]

일반 C short int를 파이썬 정수 객체로 변환합니다.

@item @code{l} (@ref{19b,,int}) [long int]

C long int를 파이썬 정수 객체로 변환합니다.

@item @code{B} (@ref{19b,,int}) [unsigned char]

C unsigned char을 파이썬 정수 객체로 변환합니다.

@item @code{H} (@ref{19b,,int}) [unsigned short int]

C unsigned short int를 파이썬 정수 객체로 변환합니다.

@item @code{I} (@ref{19b,,int}) [unsigned int]

C unsigned int를 파이썬 정수 객체로 변환합니다.

@item @code{k} (@ref{19b,,int}) [unsigned long]

C unsigned long을 파이썬 정수 객체로 변환합니다.

@item @code{L} (@ref{19b,,int}) [long long]

C long long을 파이썬 정수 객체로 변환합니다.
@end table
@anchor{c-api/arg capi-py-buildvalue-format-k}@anchor{186e}

@table @asis

@item @code{K} (@ref{19b,,int}) [unsigned long long]

C unsigned long long을 파이썬 정수 객체로 변환합니다.

@item @code{n} (@ref{19b,,int}) [@ref{c54,,Py_ssize_t}]

C @ref{c54,,Py_ssize_t}를 파이썬 정수로 변환합니다.

@item @code{p} (@ref{3c3,,bool}) [int]

Convert a C int to a Python @ref{3c3,,bool} object.

Be aware that this format requires an @code{int} argument.
Unlike most other contexts in C, variadic arguments are not coerced to
a suitable type automatically.
You can convert another type (for example, a pointer or a float) to a
suitable @code{int} value using @code{(x) ? 1 : 0} or @code{!!x}.


Added in version 3.14.


@item @code{c} (길이 1의 @ref{192,,bytes}) [char]

바이트를 나타내는 C int를 길이 1의 파이썬 @ref{192,,bytes} 객체로 변환합니다.

@item @code{C} (길이 1의 @ref{169,,str}) [int]

문자를 나타내는 C int를 길이 1의 파이썬 @ref{169,,str} 객체로 변환합니다.

@item @code{d} (@ref{196,,float}) [double]

C double을 파이썬 부동 소수점 숫자로 변환합니다.

@item @code{f} (@ref{196,,float}) [float]

C float를 파이썬 부동 소수점 숫자로 변환합니다.

@item @code{D} (@ref{197,,complex}) [Py_complex *]

C @ref{527c,,Py_complex} 구조체를 파이썬 복소수로 변환합니다.

@item @code{O} (object) [PyObject *]

파이썬 객체를 그대로 전달하지만, 그 객체에 새로운 @ref{5df,,강한 참조}를 만듭니다 (즉, 참조 횟수가 1 증가합니다). 전달된 객체가 @code{NULL} 포인터면, 인자를 생성하는 호출이 에러를 발견하고 예외를 설정했기 때문으로 간주합니다. 따라서, @ref{3c2,,Py_BuildValue()}는 @code{NULL}을 반환하지만, 예외를 발생시키지 않습니다. 아직 예외가 발생하지 않았으면, @ref{794,,SystemError}가 설정됩니다.

@item @code{S} (object) [PyObject *]

@code{O}와 같습니다.

@item @code{N} (object) [PyObject *]

@code{O}와 같지만, 새로운 @ref{5df,,강한 참조}를 만들지 않습니다. 인자 리스트에서 객체 생성자를 호출하여 객체를 만들 때 유용합니다.

@item @code{O&} (object) [`converter', `anything']

`converter' 함수를 통해 `anything'을 파이썬 객체로 변환합니다. 함수는 인자로 `anything'(void*와 호환되어야 합니다)을 사용하여 호출되며 “새” 파이썬 객체를 반환하거나, 에러가 발생하면 @code{NULL}을 반환해야 합니다.

@item @code{(items)} (@ref{610,,tuple}) [`matching-items']

C값의 시퀀스를 항목 수가 같은 파이썬 튜플로 변환합니다.

@item @code{[items]} (@ref{24d,,list}) [`matching-items']

C값의 시퀀스를 항목 수가 같은 파이썬 리스트로 변환합니다.

@item @code{@{items@}} (@ref{183,,dict}) [`matching-items']

C값의 시퀀스를 파이썬 딕셔너리로 변환합니다. 연속된 C 값의 각 쌍은 딕셔너리에 하나의 항목을 추가하여, 각각 키와 값으로 사용됩니다.
@end table

포맷 문자열에 에러가 있으면, @ref{794,,SystemError} 예외가 설정되고 @code{NULL}이 반환됩니다.
@end deffn

@geindex Py_VaBuildValue (C function)
@anchor{c-api/arg c Py_VaBuildValue}@anchor{5189}
@deffn {C 함수} @ref{5dc,,PyObject} *Py_VaBuildValue (const char *format, va_list vargs)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
가변 개수의 인자가 아닌 va_list를 받아들인다는 점을 제외하면, @ref{3c2,,Py_BuildValue()}와 동일합니다.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 문자열 변환과 포매팅,Character classification and conversion,인자 구문 분석과 값 구축,유틸리티<2>
@anchor{c-api/conversion doc}@anchor{5282}@anchor{c-api/conversion string-conversion}@anchor{5283}@anchor{c-api/conversion string-conversion-and-formatting}@anchor{5284}@anchor{c-api/conversion translation-repo}@anchor{5285}
@subsection 문자열 변환과 포매팅


숫자 변환과 포맷된 문자열 출력을 위한 함수.

@geindex PyOS_snprintf (C function)
@anchor{c-api/conversion c PyOS_snprintf}@anchor{170e}
@deffn {C 함수} int PyOS_snprintf (char *str, size_t size, const char *format, ...)
` Part of the @ref{774,,안정 ABI}.'
포맷 문자열 `format' 과 추가 인자에 따라 `size' 바이트를 넘지 않도록 `str'로 출력합니다. 유닉스 매뉴얼 페이지 @code{snprintf(3)@footnote{https://manpages.debian.org/snprintf(3)}}를 보십시오.
@end deffn

@geindex PyOS_vsnprintf (C function)
@anchor{c-api/conversion c PyOS_vsnprintf}@anchor{170f}
@deffn {C 함수} int PyOS_vsnprintf (char *str, size_t size, const char *format, va_list va)
` Part of the @ref{774,,안정 ABI}.'
포맷 문자열 `format' 과 가변 인자 목록 `va'에 따라 `size' 바이트를 넘지 않도록 `str'로 출력합니다. 유닉스 매뉴얼 페이지 @code{vsnprintf(3)@footnote{https://manpages.debian.org/vsnprintf(3)}}를 보십시오.
@end deffn

@ref{170e,,PyOS_snprintf()}와 @ref{170f,,PyOS_vsnprintf()}는 표준 C 라이브러리 함수 @code{snprintf()}와 @code{vsnprintf()}를 감쌉니다. 그들의 목적은 경계 조건에서 표준 C 함수가 제공하지 않는 수준의 일관된 동작을 보장하는 것입니다.

래퍼는 반환 시 @code{str[size-1]}이 항상 @code{'\0'}이 되도록 합니다. str에 `size' 바이트(후행 @code{'\0'} 포함)를 초과해서 쓰지 않습니다. 두 함수 모두 @code{str != NULL}, @code{size > 0}, @code{format != NULL} 및 @code{size < INT_MAX}를 요구합니다. 이는 필요한 버퍼 크기를 결정하는 C99 @code{n = snprintf(NULL, 0, ...)}에 해당하는 것이 없다는 뜻임에 유의하십시오.

이 함수들의 반환 값(`rv')은 다음과 같이 해석되어야 합니다:


@itemize *

@item 
@code{0 <= rv < size} 일 때, 출력 변환에 성공했으며 `rv' 문자가 `str'에 기록되었습니다 (@code{str[rv]}의 후행 @code{'\0'} 바이트 제외).

@item 
@code{rv >= size} 일 때, 출력 변환이 잘렸고 성공하려면 @code{rv + 1} 바이트의 버퍼가 필요합니다. @code{str[size-1]}은 이때 @code{'\0'}입니다.

@item 
When @code{rv < 0}, the output conversion failed and @code{str[size-1]} is @code{'\0'} in
this case too, but the rest of `str' is undefined. The exact cause of the error
depends on the underlying platform.
@end itemize

다음 함수는 로케일 독립적인 문자열에서 숫자로의 변환을 제공합니다.

@geindex PyOS_strtoul (C function)
@anchor{c-api/conversion c PyOS_strtoul}@anchor{50c5}
@deffn {C 함수} unsigned long PyOS_strtoul (const char *str, char **ptr, int base)
` Part of the @ref{774,,안정 ABI}.'
Convert the initial part of the string in @code{str} to an unsigned long value according to the given @code{base}, which must be between @code{2} and
@code{36} inclusive, or be the special value @code{0}.

Leading white space and case of characters are ignored.  If @code{base} is zero
it looks for a leading @code{0b}, @code{0o} or @code{0x} to tell which base.  If
these are absent it defaults to @code{10}.  Base must be 0 or between 2 and 36
(inclusive).  If @code{ptr} is non-@code{NULL} it will contain a pointer to the
end of the scan.

If the converted value falls out of range of corresponding return type,
range error occurs (@code{errno} is set to @code{ERANGE}) and
@code{ULONG_MAX} is returned.  If no conversion can be performed, @code{0}
is returned.

See also the Unix man page @code{strtoul(3)@footnote{https://manpages.debian.org/strtoul(3)}}.


Added in version 3.2.

@end deffn

@geindex PyOS_strtol (C function)
@anchor{c-api/conversion c PyOS_strtol}@anchor{50c4}
@deffn {C 함수} long PyOS_strtol (const char *str, char **ptr, int base)
` Part of the @ref{774,,안정 ABI}.'
Convert the initial part of the string in @code{str} to an long value
according to the given @code{base}, which must be between @code{2} and @code{36}
inclusive, or be the special value @code{0}.

Same as @ref{50c5,,PyOS_strtoul()}, but return a long value instead
and @code{LONG_MAX} on overflows.

See also the Unix man page @code{strtol(3)@footnote{https://manpages.debian.org/strtol(3)}}.


Added in version 3.2.

@end deffn

@geindex PyOS_string_to_double (C function)
@anchor{c-api/conversion c PyOS_string_to_double}@anchor{149a}
@deffn {C 함수} double PyOS_string_to_double (const char *s, char **endptr, PyObject *overflow_exception)
` Part of the @ref{774,,안정 ABI}.'
문자열 @code{s}를 double로 변환하고, 실패 시 파이썬 예외를 발생시킵니다. 허용되는 문자열 집합은 @code{s}가 선행이나 후행 공백을 가질 수 없다는 점을 제외하고는 파이썬의 @ref{196,,float()} 생성자가 허용하는 문자열 집합에 대응합니다. 변환은 현재 로케일과 독립적입니다.

@code{endptr}이 @code{NULL}이면, 전체 문자열을 변환합니다. 문자열이 부동 소수점 숫자의 유효한 표현이 아니면 @ref{2ec,,ValueError}를 발생시키고 @code{-1.0}을 반환합니다.

endptr이 @code{NULL}이 아니면, 가능한 한 많은 문자열을 변환하고 @code{*endptr}이 변환되지 않은 첫 번째 문자를 가리키도록 설정합니다. 문자열의 초기 세그먼트가 부동 소수점 숫자의 유효한 표현이 아니면, @code{*endptr}이 문자열의 시작을 가리키도록 설정하고, ValueError를 발생시키고 @code{-1.0}을 반환합니다.

If @code{s} represents a value that is too large to store in a float
(for example, @code{"1e500"} is such a string on many platforms) then
if @code{overflow_exception} is @code{NULL} return @code{Py_INFINITY} (with
an appropriate sign) and don’t set any exception.  Otherwise,
@code{overflow_exception} must point to a Python exception object;
raise that exception and return @code{-1.0}.  In both cases, set
@code{*endptr} to point to the first character after the converted value.

변환 중 다른 에러가 발생하면 (예를 들어 메모리 부족 에러), 적절한 파이썬 예외를 설정하고 @code{-1.0}을 반환합니다.


Added in version 3.1.

@end deffn

@geindex PyOS_double_to_string (C function)
@anchor{c-api/conversion c PyOS_double_to_string}@anchor{50c2}
@deffn {C 함수} char *PyOS_double_to_string (double val, char format_code, int precision, int flags, int *ptype)
` Part of the @ref{774,,안정 ABI}.'
제공된 `format_code', `precision' 및 `flags'를 사용하여 double `val'을 문자열로 변환합니다.

`format_code'는 @code{'e'}, @code{'E'}, @code{'f'}, @code{'F'}, @code{'g'}, @code{'G'} 또는 @code{'r'} 중 하나여야 합니다. @code{'r'}의 경우, 제공된 `precision'은 0이어야 하며 무시됩니다. @code{'r'} 포맷 코드는 표준 @ref{1c1,,repr()} 형식을 지정합니다.

`flags' can be zero or more of the following values or-ed together:

@geindex Py_DTSF_SIGN (C macro)
@anchor{c-api/conversion c Py_DTSF_SIGN}@anchor{5286}
@deffn {C 매크로} Py_DTSF_SIGN

Always precede the returned string with a sign
character, even if `val' is non-negative.
@end deffn

@geindex Py_DTSF_ADD_DOT_0 (C macro)
@anchor{c-api/conversion c Py_DTSF_ADD_DOT_0}@anchor{5287}
@deffn {C 매크로} Py_DTSF_ADD_DOT_0

Ensure that the returned string will not look like an integer.
@end deffn

@geindex Py_DTSF_ALT (C macro)
@anchor{c-api/conversion c Py_DTSF_ALT}@anchor{5288}
@deffn {C 매크로} Py_DTSF_ALT

Apply “alternate” formatting rules.
See the documentation for the @ref{170e,,PyOS_snprintf()} @code{'#'} specifier for
details.
@end deffn

@geindex Py_DTSF_NO_NEG_0 (C macro)
@anchor{c-api/conversion c Py_DTSF_NO_NEG_0}@anchor{5289}
@deffn {C 매크로} Py_DTSF_NO_NEG_0

Negative zero is converted to positive zero.


Added in version 3.11.

@end deffn

If `ptype' is non-@code{NULL}, then the value it points to will be set to one
of the following constants depending on the type of `val':


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

`*ptype'

@tab

type of `val'

@item

@geindex Py_DTST_FINITE (C macro)
@anchor{c-api/conversion c Py_DTST_FINITE}@anchor{528a}
@deffn {C 매크로} Py_DTST_FINITE
@end deffn

@tab

finite number

@item

@geindex Py_DTST_INFINITE (C macro)
@anchor{c-api/conversion c Py_DTST_INFINITE}@anchor{528b}
@deffn {C 매크로} Py_DTST_INFINITE
@end deffn

@tab

infinite number

@item

@geindex Py_DTST_NAN (C macro)
@anchor{c-api/conversion c Py_DTST_NAN}@anchor{528c}
@deffn {C 매크로} Py_DTST_NAN
@end deffn

@tab

not a number

@end multitable


반환 값은 변환된 문자열이 있는 `buffer'에 대한 포인터이거나, 변환에 실패하면 @code{NULL}입니다. 호출자는 @ref{1647,,PyMem_Free()}를 호출하여 반환된 문자열을 해제해야 합니다.


Added in version 3.1.

@end deffn

@geindex PyOS_mystricmp (C function)
@geindex PyOS_mystrnicmp (C function)
@anchor{c-api/conversion c PyOS_mystricmp}@anchor{1d38}
@deffn {C 함수} int PyOS_mystricmp (const char *str1, const char *str2)
@anchor{c-api/conversion c PyOS_mystrnicmp}@anchor{1d37}
@deffnx {C 함수} int PyOS_mystrnicmp (const char *str1, const char *str2, Py_ssize_t size)
` Part of the @ref{774,,안정 ABI}.'
Case insensitive comparison of strings. These functions work almost
identically to @code{strcmp()} and @code{strncmp()} (respectively),
except that they ignore the case of ASCII characters.

Return @code{0} if the strings are equal, a negative value if `str1' sorts
lexicographically before `str2', or a positive value if it sorts after.

In the `str1' or `str2' arguments, a NUL byte marks the end of the string.
For @code{PyOS_mystrnicmp()}, the `size' argument gives the maximum size
of the string, as if NUL was present at the index given by `size'.

These functions do not use the locale.
@end deffn

@geindex PyOS_stricmp (C function)
@geindex PyOS_strnicmp (C function)
@anchor{c-api/conversion c PyOS_stricmp}@anchor{528d}
@deffn {C 함수} int PyOS_stricmp (const char *str1, const char *str2)
@anchor{c-api/conversion c PyOS_strnicmp}@anchor{528e}
@deffnx {C 함수} int PyOS_strnicmp (const char *str1, const char *str2, Py_ssize_t size)

Case insensitive comparison of strings.

On Windows, these are aliases of @code{stricmp()} and @code{strnicmp()},
respectively.

On other platforms, they are aliases of @ref{1d38,,PyOS_mystricmp()} and
@ref{1d37,,PyOS_mystrnicmp()}, respectively.
@end deffn

@node Character classification and conversion,PyHash API,문자열 변환과 포매팅,유틸리티<2>
@anchor{c-api/conversion character-classification-and-conversion}@anchor{528f}
@subsection Character classification and conversion


The following macros provide locale-independent (unlike the C standard library
@code{ctype.h}) character classification and conversion.
The argument must be a signed or unsigned char.

@geindex Py_ISALNUM (C macro)
@anchor{c-api/conversion c Py_ISALNUM}@anchor{1556}
@deffn {C 매크로} Py_ISALNUM (c)

Return true if the character `c' is an alphanumeric character.
@end deffn

@geindex Py_ISALPHA (C macro)
@anchor{c-api/conversion c Py_ISALPHA}@anchor{1557}
@deffn {C 매크로} Py_ISALPHA (c)

Return true if the character `c' is an alphabetic character (@code{a-z} and @code{A-Z}).
@end deffn

@geindex Py_ISDIGIT (C macro)
@anchor{c-api/conversion c Py_ISDIGIT}@anchor{1558}
@deffn {C 매크로} Py_ISDIGIT (c)

Return true if the character `c' is a decimal digit (@code{0-9}).
@end deffn

@geindex Py_ISLOWER (C macro)
@anchor{c-api/conversion c Py_ISLOWER}@anchor{1559}
@deffn {C 매크로} Py_ISLOWER (c)

Return true if the character `c' is a lowercase ASCII letter (@code{a-z}).
@end deffn

@geindex Py_ISUPPER (C macro)
@anchor{c-api/conversion c Py_ISUPPER}@anchor{155b}
@deffn {C 매크로} Py_ISUPPER (c)

Return true if the character `c' is an uppercase ASCII letter (@code{A-Z}).
@end deffn

@geindex Py_ISSPACE (C macro)
@anchor{c-api/conversion c Py_ISSPACE}@anchor{155a}
@deffn {C 매크로} Py_ISSPACE (c)

Return true if the character `c' is a whitespace character (space, tab,
carriage return, newline, vertical tab, or form feed).
@end deffn

@geindex Py_ISXDIGIT (C macro)
@anchor{c-api/conversion c Py_ISXDIGIT}@anchor{155c}
@deffn {C 매크로} Py_ISXDIGIT (c)

Return true if the character `c' is a hexadecimal digit (@code{0-9}, @code{a-f}, and
@code{A-F}).
@end deffn

@geindex Py_TOLOWER (C macro)
@anchor{c-api/conversion c Py_TOLOWER}@anchor{155d}
@deffn {C 매크로} Py_TOLOWER (c)

Return the lowercase equivalent of the character `c'.
@end deffn

@geindex Py_TOUPPER (C macro)
@anchor{c-api/conversion c Py_TOUPPER}@anchor{155e}
@deffn {C 매크로} Py_TOUPPER (c)

Return the uppercase equivalent of the character `c'.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node PyHash API,리플렉션,Character classification and conversion,유틸리티<2>
@anchor{c-api/hash doc}@anchor{5290}@anchor{c-api/hash pyhash-api}@anchor{5291}@anchor{c-api/hash translation-repo}@anchor{5292}
@subsection PyHash API


See also the @ref{4f35,,PyTypeObject.tp_hash} member and @ref{25ff,,숫자 형의 해싱}.

@geindex Py_hash_t (C type)
@anchor{c-api/hash c Py_hash_t}@anchor{1468}
@deffn {C 자료형} type Py_hash_t

Hash value type: signed integer.


Added in version 3.2.

@end deffn

@geindex Py_uhash_t (C type)
@anchor{c-api/hash c Py_uhash_t}@anchor{5293}
@deffn {C 자료형} type Py_uhash_t

Hash value type: unsigned integer.


Added in version 3.2.

@end deffn

@geindex Py_HASH_ALGORITHM (C macro)
@anchor{c-api/hash c Py_HASH_ALGORITHM}@anchor{5294}
@deffn {C 매크로} Py_HASH_ALGORITHM

A numerical value indicating the algorithm for hashing of @ref{169,,str},
@ref{192,,bytes}, and @ref{165,,memoryview}.

The algorithm name is exposed by @ref{495b,,sys.hash_info.algorithm}.


Added in version 3.4.

@end deffn

@geindex Py_HASH_FNV (C macro)
@geindex Py_HASH_SIPHASH24 (C macro)
@geindex Py_HASH_SIPHASH13 (C macro)
@anchor{c-api/hash c Py_HASH_FNV}@anchor{5295}
@deffn {C 매크로} Py_HASH_FNV
@anchor{c-api/hash c Py_HASH_SIPHASH24}@anchor{5296}
@deffnx {C 매크로} Py_HASH_SIPHASH24
@anchor{c-api/hash c Py_HASH_SIPHASH13}@anchor{5297}
@deffnx {C 매크로} Py_HASH_SIPHASH13

Numerical values to compare to @ref{5294,,Py_HASH_ALGORITHM} to determine
which algorithm is used for hashing. The hash algorithm can be configured
via the configure @ref{21b3,,--with-hash-algorithm} option.


Added in version 3.4: Add @code{Py_HASH_FNV} and @code{Py_HASH_SIPHASH24}.



Added in version 3.11: Add @code{Py_HASH_SIPHASH13}.

@end deffn

@geindex Py_HASH_CUTOFF (C macro)
@anchor{c-api/hash c Py_HASH_CUTOFF}@anchor{5298}
@deffn {C 매크로} Py_HASH_CUTOFF

Buffers of length in range @code{[1, Py_HASH_CUTOFF)} are hashed using DJBX33A
instead of the algorithm described by @ref{5294,,Py_HASH_ALGORITHM}.


@itemize -

@item 
A @code{Py_HASH_CUTOFF} of 0 disables the optimization.

@item 
@code{Py_HASH_CUTOFF} must be non-negative and less or equal than 7.
@end itemize

32-bit platforms should use a cutoff smaller than 64-bit platforms because
it is easier to create colliding strings. A cutoff of 7 on 64-bit platforms
and 5 on 32-bit platforms should provide a decent safety margin.

This corresponds to the @ref{495e,,sys.hash_info.cutoff} constant.


Added in version 3.4.

@end deffn

@geindex PyHASH_MODULUS (C macro)
@anchor{c-api/hash c PyHASH_MODULUS}@anchor{19e8}
@deffn {C 매크로} PyHASH_MODULUS

The Mersenne prime@footnote{https://en.wikipedia.org/wiki/Mersenne_prime} @code{P = 2**n -1},
used for numeric hash scheme.

This corresponds to the @ref{2600,,sys.hash_info.modulus} constant.


Added in version 3.13.

@end deffn

@geindex PyHASH_BITS (C macro)
@anchor{c-api/hash c PyHASH_BITS}@anchor{19e9}
@deffn {C 매크로} PyHASH_BITS

The exponent @code{n} of @code{P} in @ref{19e8,,PyHASH_MODULUS}.


Added in version 3.13.

@end deffn

@geindex PyHASH_MULTIPLIER (C macro)
@anchor{c-api/hash c PyHASH_MULTIPLIER}@anchor{1995}
@deffn {C 매크로} PyHASH_MULTIPLIER

Prime multiplier used in string and various other hashes.


Added in version 3.13.

@end deffn

@geindex PyHASH_INF (C macro)
@anchor{c-api/hash c PyHASH_INF}@anchor{19ea}
@deffn {C 매크로} PyHASH_INF

The hash value returned for a positive infinity.

This corresponds to the @ref{4958,,sys.hash_info.inf} constant.


Added in version 3.13.

@end deffn

@geindex PyHASH_IMAG (C macro)
@anchor{c-api/hash c PyHASH_IMAG}@anchor{19eb}
@deffn {C 매크로} PyHASH_IMAG

The multiplier used for the imaginary part of a complex number.

This corresponds to the @ref{495a,,sys.hash_info.imag} constant.


Added in version 3.13.

@end deffn

@geindex PyHash_FuncDef (C type)
@anchor{c-api/hash c PyHash_FuncDef}@anchor{5299}
@deffn {C 자료형} type PyHash_FuncDef

Hash function definition used by @ref{529a,,PyHash_GetFuncDef()}.

@geindex PyHash_FuncDef.hash (C member)
@anchor{c-api/hash c PyHash_FuncDef hash}@anchor{529b}
@deffn {C 멤버 변수} @ref{1468,,Py_hash_t} (*const hash)(const void*, @ref{c54,,Py_ssize_t})

Hash function.
@end deffn

@geindex PyHash_FuncDef.name (C member)
@anchor{c-api/hash c PyHash_FuncDef name}@anchor{529c}
@deffn {C 멤버 변수} const char *name

Hash function name (UTF-8 encoded string).

This corresponds to the @ref{495b,,sys.hash_info.algorithm} constant.
@end deffn

@geindex PyHash_FuncDef.hash_bits (C member)
@anchor{c-api/hash c PyHash_FuncDef hash_bits}@anchor{529d}
@deffn {C 멤버 변수} const int hash_bits

Internal size of the hash value in bits.

This corresponds to the @ref{495c,,sys.hash_info.hash_bits} constant.
@end deffn

@geindex PyHash_FuncDef.seed_bits (C member)
@anchor{c-api/hash c PyHash_FuncDef seed_bits}@anchor{529e}
@deffn {C 멤버 변수} const int seed_bits

Size of seed input in bits.

This corresponds to the @ref{495d,,sys.hash_info.seed_bits} constant.
@end deffn


Added in version 3.4.

@end deffn

@geindex PyHash_GetFuncDef (C function)
@anchor{c-api/hash c PyHash_GetFuncDef}@anchor{529a}
@deffn {C 함수} @ref{5299,,PyHash_FuncDef} *PyHash_GetFuncDef (void)

Get the hash function definition.


@subsubheading 더 보기


@geindex Python 향상 제안; PEP 456
PEP 456@footnote{https://peps.python.org/pep-0456/} “Secure and interchangeable hash algorithm”.



Added in version 3.4.

@end deffn

@geindex Py_HashPointer (C function)
@anchor{c-api/hash c Py_HashPointer}@anchor{425}
@deffn {C 함수} @ref{1468,,Py_hash_t} Py_HashPointer (const void *ptr)

Hash a pointer value: process the pointer value as an integer (cast it to
@code{uintptr_t} internally). The pointer is not dereferenced.

The function cannot fail: it cannot return @code{-1}.


Added in version 3.13.

@end deffn

@geindex Py_HashBuffer (C function)
@anchor{c-api/hash c Py_HashBuffer}@anchor{395}
@deffn {C 함수} @ref{1468,,Py_hash_t} Py_HashBuffer (const void *ptr, Py_ssize_t len)

Compute and return the hash value of a buffer of `len' bytes
starting at address `ptr'. The hash is guaranteed to match that of
@ref{192,,bytes}, @ref{165,,memoryview}, and other built-in objects
that implement the @ref{260,,buffer protocol}.

Use this function to implement hashing for immutable objects whose
@ref{4f2f,,tp_richcompare} function compares to another
object’s buffer.

`len' must be greater than or equal to @code{0}.

This function always succeeds.


Added in version 3.14.

@end deffn

@geindex PyObject_GenericHash (C function)
@anchor{c-api/hash c PyObject_GenericHash}@anchor{60a}
@deffn {C 함수} @ref{1468,,Py_hash_t} PyObject_GenericHash (PyObject *obj)

Generic hashing function that is meant to be put into a type
object’s @code{tp_hash} slot.
Its result only depends on the object’s identity.

`CPython 구현 상세:' In CPython, it is equivalent to @ref{425,,Py_HashPointer()}.


Added in version 3.13.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 리플렉션,코덱 등록소와 지원 함수,PyHash API,유틸리티<2>
@anchor{c-api/reflection doc}@anchor{529f}@anchor{c-api/reflection id1}@anchor{52a0}@anchor{c-api/reflection reflection}@anchor{52a1}@anchor{c-api/reflection translation-repo}@anchor{52a2}
@subsection 리플렉션


@geindex PyEval_GetBuiltins (C function)
@anchor{c-api/reflection c PyEval_GetBuiltins}@anchor{5f1}
@deffn {C 함수} @ref{5dc,,PyObject} *PyEval_GetBuiltins (void)
`반환값: 빌린 참조.'` Part of the @ref{774,,안정 ABI}.'

버전 3.13부터 폐지됨: 대신 @ref{5f2,,PyEval_GetFrameBuiltins()}를 사용하십시오.


현재 실행 프레임이나 현재 실행 중인 프레임이 없으면 스레드 상태의 인터프리터의 builtins의 딕셔너리를 반환합니다.
@end deffn

@geindex PyEval_GetLocals (C function)
@anchor{c-api/reflection c PyEval_GetLocals}@anchor{5f5}
@deffn {C 함수} @ref{5dc,,PyObject} *PyEval_GetLocals (void)
`반환값: 빌린 참조.'` Part of the @ref{774,,안정 ABI}.'

버전 3.13부터 폐지됨: Use either @ref{5f6,,PyEval_GetFrameLocals()} to obtain the same behaviour as calling
@ref{46f,,locals()} in Python code, or else call @ref{65f,,PyFrame_GetLocals()} on the result
of @ref{1b37,,PyEval_GetFrame()} to access the @ref{4a6,,f_locals} attribute of the
currently executing frame.


현재 실행 프레임의 지역 변수로의 접근을 제공하는 매핑을 반환하거나, 현재 실행 중인 프레임이 없으면 @code{NULL}을 반환합니다.

Refer to @ref{46f,,locals()} for details of the mapping returned at different scopes.

As this function returns a @ref{3d7,,borrowed reference}, the dictionary returned for
@ref{4a2,,optimized scopes} is cached on the frame object and will remain
alive as long as the frame object does. Unlike @ref{5f6,,PyEval_GetFrameLocals()} and
@ref{46f,,locals()}, subsequent calls to this function in the same frame will update the
contents of the cached dictionary to reflect changes in the state of the local variables
rather than returning a new snapshot.


버전 3.13에서 변경: As part of 
@geindex Python 향상 제안; PEP 667
PEP 667@footnote{https://peps.python.org/pep-0667/}, @ref{65f,,PyFrame_GetLocals()}, @ref{46f,,locals()}, and
@ref{4a6,,FrameType.f_locals} no longer make use of the shared cache
dictionary. Refer to the @ref{470,,What’s New entry} for
additional details.

@end deffn

@geindex PyEval_GetGlobals (C function)
@anchor{c-api/reflection c PyEval_GetGlobals}@anchor{5f3}
@deffn {C 함수} @ref{5dc,,PyObject} *PyEval_GetGlobals (void)
`반환값: 빌린 참조.'` Part of the @ref{774,,안정 ABI}.'

버전 3.13부터 폐지됨: 대신 @ref{5f4,,PyEval_GetFrameGlobals()}를 사용하십시오.


현재 실행 프레임의 전역 변수 딕셔너리를 반환하거나, 현재 실행 중인 프레임이 없으면 @code{NULL}을 반환합니다.
@end deffn

@geindex PyEval_GetFrame (C function)
@anchor{c-api/reflection c PyEval_GetFrame}@anchor{1b37}
@deffn {C 함수} @ref{98b,,PyFrameObject} *PyEval_GetFrame (void)
`반환값: 빌린 참조.'` Part of the @ref{774,,안정 ABI}.'
Return the @ref{4f10,,attached thread state}’s frame, which is @code{NULL} if no frame is
currently executing.

@ref{990,,PyThreadState_GetFrame()}도 참조하십시오.
@end deffn

@geindex PyEval_GetFrameBuiltins (C function)
@anchor{c-api/reflection c PyEval_GetFrameBuiltins}@anchor{5f2}
@deffn {C 함수} @ref{5dc,,PyObject} *PyEval_GetFrameBuiltins (void)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI} 버전 3.13 이후로.'
현재 실행 프레임이나 현재 실행 중인 프레임이 없으면 스레드 상태의 인터프리터의 builtins의 딕셔너리를 반환합니다.


Added in version 3.13.

@end deffn

@geindex PyEval_GetFrameLocals (C function)
@anchor{c-api/reflection c PyEval_GetFrameLocals}@anchor{5f6}
@deffn {C 함수} @ref{5dc,,PyObject} *PyEval_GetFrameLocals (void)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI} 버전 3.13 이후로.'
현재 실행 프레임의 지역 변수 딕셔너리를 반환하거나, 현재 실행 중인 프레임이 없으면 @code{NULL}을 반환합니다. 파이썬 코드에서 @ref{46f,,locals()}를 호출하는 것과 동등합니다.

To access @ref{4a6,,f_locals} on the current frame without making an independent
snapshot in @ref{4a2,,optimized scopes}, call @ref{65f,,PyFrame_GetLocals()}
on the result of @ref{1b37,,PyEval_GetFrame()}.


Added in version 3.13.

@end deffn

@geindex PyEval_GetFrameGlobals (C function)
@anchor{c-api/reflection c PyEval_GetFrameGlobals}@anchor{5f4}
@deffn {C 함수} @ref{5dc,,PyObject} *PyEval_GetFrameGlobals (void)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI} 버전 3.13 이후로.'
현재 실행 프레임의 전역 변수 딕셔너리를 반환하거나, 현재 실행 중인 프레임이 없으면 @code{NULL}을 반환합니다. 파이썬 코드에서 @ref{1c08,,globals()}를 호출하는 것과 동등합니다.


Added in version 3.13.

@end deffn

@geindex PyEval_GetFuncName (C function)
@anchor{c-api/reflection c PyEval_GetFuncName}@anchor{501c}
@deffn {C 함수} const char *PyEval_GetFuncName (PyObject *func)
` Part of the @ref{774,,안정 ABI}.'
`func'가 함수, 클래스 또는 인스턴스 객체면 `func'의 이름을 반환하고, 그렇지 않으면 `func'의 형의 이름을 반환합니다.
@end deffn

@geindex PyEval_GetFuncDesc (C function)
@anchor{c-api/reflection c PyEval_GetFuncDesc}@anchor{501b}
@deffn {C 함수} const char *PyEval_GetFuncDesc (PyObject *func)
` Part of the @ref{774,,안정 ABI}.'
`func'의 형에 따라 설명 문자열을 반환합니다. 반환 값에는 함수 및 메서드의 “()”, “ constructor”, “ instance” 및 “ object” 가 포함됩니다. @ref{501c,,PyEval_GetFuncName()}의 결과와 이어붙이면 `func'의 설명이 됩니다.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 코덱 등록소와 지원 함수,PyTime C API,리플렉션,유틸리티<2>
@anchor{c-api/codec doc}@anchor{52a3}@anchor{c-api/codec codec-registry}@anchor{f2f}@anchor{c-api/codec codec-registry-and-support-functions}@anchor{52a4}@anchor{c-api/codec translation-repo}@anchor{52a5}
@subsection 코덱 등록소와 지원 함수


@geindex PyCodec_Register (C function)
@anchor{c-api/codec c PyCodec_Register}@anchor{4fe5}
@deffn {C 함수} int PyCodec_Register (PyObject *search_function)
` Part of the @ref{774,,안정 ABI}.'
새로운 코덱 검색 함수를 등록합니다.

As a side effect, this tries to load the @code{encodings} package, if not yet
done, to make sure that it is always first in the list of search functions.
@end deffn

@geindex PyCodec_Unregister (C function)
@anchor{c-api/codec c PyCodec_Unregister}@anchor{a97}
@deffn {C 함수} int PyCodec_Unregister (PyObject *search_function)
` Part of the @ref{774,,안정 ABI} 버전 3.10 이후로.'
Unregister a codec search function and clear the registry’s cache.
If the search function is not registered, do nothing.
Return 0 on success. Raise an exception and return -1 on error.


Added in version 3.10.

@end deffn

@geindex PyCodec_KnownEncoding (C function)
@anchor{c-api/codec c PyCodec_KnownEncoding}@anchor{4fe3}
@deffn {C 함수} int PyCodec_KnownEncoding (const char *encoding)
` Part of the @ref{774,,안정 ABI}.'
지정된 `encoding'에 대해 등록된 코덱이 있는지에 따라 @code{1} 이나 @code{0}을 반환합니다. 이 함수는 항상 성공합니다.
@end deffn

@geindex PyCodec_Encode (C function)
@anchor{c-api/codec c PyCodec_Encode}@anchor{3e2}
@deffn {C 함수} @ref{5dc,,PyObject} *PyCodec_Encode (PyObject *object, const char *encoding, const char *errors)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
일반 코덱 기반 인코딩 API.

`object'는 `errors'로 정의된 에러 처리 방법을 사용하여 지정된 `encoding'에 대해 발견된 인코더 함수로 전달됩니다. 코덱에 정의된 기본 방법을 사용하기 위해 `errors'가 @code{NULL} 일 수 있습니다. 인코더를 찾을 수 없으면 @ref{23e5,,LookupError}를 발생시킵니다.
@end deffn

@geindex PyCodec_Decode (C function)
@anchor{c-api/codec c PyCodec_Decode}@anchor{3e1}
@deffn {C 함수} @ref{5dc,,PyObject} *PyCodec_Decode (PyObject *object, const char *encoding, const char *errors)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
일반 코덱 기반 디코딩 API.

`object' is passed through the decoder function found for the given
`encoding' using the error handling method defined by `errors'.  `errors' may
be @code{NULL} to use the default method defined for the codec.  Raises a
@ref{23e5,,LookupError} if no decoder can be found.
@end deffn

@menu
* 코덱 조회 API:: 
* 유니코드 인코딩 에러 처리기용 등록소 API:: 
* Codec utility variables:: 

@end menu

@node 코덱 조회 API,유니코드 인코딩 에러 처리기용 등록소 API,,코덱 등록소와 지원 함수
@anchor{c-api/codec codec-lookup-api}@anchor{52a6}
@subsubsection 코덱 조회 API


다음 함수에서, `encoding' 문자열은 모두 소문자로 변환되어 조회되므로, 이 메커니즘을 통한 인코딩 조회는 대소문자를 구분하지 않게 됩니다. 코덱이 없으면, @ref{5e5,,KeyError}가 설정되고 @code{NULL}이 반환됩니다.

@geindex PyCodec_Encoder (C function)
@anchor{c-api/codec c PyCodec_Encoder}@anchor{4fdf}
@deffn {C 함수} @ref{5dc,,PyObject} *PyCodec_Encoder (const char *encoding)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
주어진 `encoding'에 대한 인코더 함수를 가져옵니다.
@end deffn

@geindex PyCodec_Decoder (C function)
@anchor{c-api/codec c PyCodec_Decoder}@anchor{4fde}
@deffn {C 함수} @ref{5dc,,PyObject} *PyCodec_Decoder (const char *encoding)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
주어진 `encoding'에 대한 디코더 함수를 가져옵니다.
@end deffn

@geindex PyCodec_IncrementalEncoder (C function)
@anchor{c-api/codec c PyCodec_IncrementalEncoder}@anchor{4fe2}
@deffn {C 함수} @ref{5dc,,PyObject} *PyCodec_IncrementalEncoder (const char *encoding, const char *errors)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
지정된 `encoding'에 대한 @ref{285b,,IncrementalEncoder} 객체를 가져옵니다.
@end deffn

@geindex PyCodec_IncrementalDecoder (C function)
@anchor{c-api/codec c PyCodec_IncrementalDecoder}@anchor{4fe1}
@deffn {C 함수} @ref{5dc,,PyObject} *PyCodec_IncrementalDecoder (const char *encoding, const char *errors)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
지정된 `encoding'에 대한 @ref{285c,,IncrementalDecoder} 객체를 가져옵니다.
@end deffn

@geindex PyCodec_StreamReader (C function)
@anchor{c-api/codec c PyCodec_StreamReader}@anchor{4fe8}
@deffn {C 함수} @ref{5dc,,PyObject} *PyCodec_StreamReader (const char *encoding, PyObject *stream, const char *errors)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
지정된 `encoding'에 대한 @ref{2860,,StreamReader} 팩토리 함수를 가져옵니다.
@end deffn

@geindex PyCodec_StreamWriter (C function)
@anchor{c-api/codec c PyCodec_StreamWriter}@anchor{4fe9}
@deffn {C 함수} @ref{5dc,,PyObject} *PyCodec_StreamWriter (const char *encoding, PyObject *stream, const char *errors)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
지정된 `encoding'에 대한 @ref{285f,,StreamWriter} 팩토리 함수를 가져옵니다.
@end deffn

@node 유니코드 인코딩 에러 처리기용 등록소 API,Codec utility variables,코덱 조회 API,코덱 등록소와 지원 함수
@anchor{c-api/codec registry-api-for-unicode-encoding-error-handlers}@anchor{52a7}
@subsubsection 유니코드 인코딩 에러 처리기용 등록소 API


@geindex PyCodec_RegisterError (C function)
@anchor{c-api/codec c PyCodec_RegisterError}@anchor{4fe6}
@deffn {C 함수} int PyCodec_RegisterError (const char *name, PyObject *error)
` Part of the @ref{774,,안정 ABI}.'
지정된 `name' 으로 에러 처리 콜백 함수 `error'를 등록합니다. 코덱이 인코딩할 수 없는 문자/디코딩할 수 없는 바이트열을 발견하고, 인코드/디코드 함수를 호출할 때 `name'이 error 매개 변수로 지정되었을 때 이 콜백 함수를 호출합니다.

콜백은 하나의 인자로 @ref{886,,UnicodeEncodeError}, @ref{c07,,UnicodeDecodeError} 또는 @ref{18fe,,UnicodeTranslateError}의 인스턴스를 받아들이는데, 문제가 되는 문자나 바이트의 시퀀스와 이들의 원본 문자열에서의 오프셋에 대한 정보를 담고 있습니다 (이 정보를 추출하는 함수는 @ref{461,,유니코드 예외 객체}를 참조하세요). 콜백은 주어진 예외를 발생시키거나, 문제가 있는 시퀀스의 대체와 원래 문자열에서 인코딩/디코딩을 다시 시작해야 하는 오프셋을 제공하는 정수를 포함하는 두 항목 튜플을 반환해야 합니다.

성공하면 @code{0}을, 에러면 @code{-1}을 반환합니다.
@end deffn

@geindex PyCodec_LookupError (C function)
@anchor{c-api/codec c PyCodec_LookupError}@anchor{4fe4}
@deffn {C 함수} @ref{5dc,,PyObject} *PyCodec_LookupError (const char *name)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
`name' 으로 등록된 에러 처리 콜백 함수를 찾습니다. 특수한 경우로 @code{NULL}이 전달 될 수 있는데, 이때는 “strict” 에 대한 에러 처리 콜백이 반환됩니다.
@end deffn

@geindex PyCodec_StrictErrors (C function)
@anchor{c-api/codec c PyCodec_StrictErrors}@anchor{4fea}
@deffn {C 함수} @ref{5dc,,PyObject} *PyCodec_StrictErrors (PyObject *exc)
`반환값: 항상 NULL.'` Part of the @ref{774,,안정 ABI}.'
`exc'를 예외로 발생시킵니다.
@end deffn

@geindex PyCodec_IgnoreErrors (C function)
@anchor{c-api/codec c PyCodec_IgnoreErrors}@anchor{4fe0}
@deffn {C 함수} @ref{5dc,,PyObject} *PyCodec_IgnoreErrors (PyObject *exc)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
잘못된 입력을 건너뛰고, 유니코드 에러를 무시합니다.
@end deffn

@geindex PyCodec_ReplaceErrors (C function)
@anchor{c-api/codec c PyCodec_ReplaceErrors}@anchor{4fe7}
@deffn {C 함수} @ref{5dc,,PyObject} *PyCodec_ReplaceErrors (PyObject *exc)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
유니코드 인코딩 에러를 @code{?} 나 @code{U+FFFD}로 치환합니다.
@end deffn

@geindex PyCodec_XMLCharRefReplaceErrors (C function)
@anchor{c-api/codec c PyCodec_XMLCharRefReplaceErrors}@anchor{4feb}
@deffn {C 함수} @ref{5dc,,PyObject} *PyCodec_XMLCharRefReplaceErrors (PyObject *exc)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
유니코드 인코딩 에러를 XML 문자 참조로 치환합니다.
@end deffn

@geindex PyCodec_BackslashReplaceErrors (C function)
@anchor{c-api/codec c PyCodec_BackslashReplaceErrors}@anchor{4fdd}
@deffn {C 함수} @ref{5dc,,PyObject} *PyCodec_BackslashReplaceErrors (PyObject *exc)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
유니코드 인코딩 에러를 백 슬래시 이스케이프(@code{\x}, @code{\u} 및 @code{\U})로 치환합니다.
@end deffn

@geindex PyCodec_NameReplaceErrors (C function)
@anchor{c-api/codec c PyCodec_NameReplaceErrors}@anchor{10ae}
@deffn {C 함수} @ref{5dc,,PyObject} *PyCodec_NameReplaceErrors (PyObject *exc)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI} 버전 3.7 이후로.'
유니코드 인코딩 에러를 @code{\N@{...@}} 이스케이프로 치환합니다.


Added in version 3.5.

@end deffn

@node Codec utility variables,,유니코드 인코딩 에러 처리기용 등록소 API,코덱 등록소와 지원 함수
@anchor{c-api/codec codec-utility-variables}@anchor{52a8}
@subsubsection Codec utility variables


@geindex Py_hexdigits (C var)
@anchor{c-api/codec c Py_hexdigits}@anchor{52a9}
@deffn {C 변수} const char *Py_hexdigits

A string constant containing the lowercase hexadecimal digits: @code{"0123456789abcdef"}.


Added in version 3.3.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node PyTime C API,Support for Perf Maps,코덱 등록소와 지원 함수,유틸리티<2>
@anchor{c-api/time doc}@anchor{484}@anchor{c-api/time c-api-time}@anchor{5d0}@anchor{c-api/time pytime-c-api}@anchor{52aa}@anchor{c-api/time translation-repo}@anchor{52ab}
@subsection PyTime C API



Added in version 3.13.


The clock C API provides access to system clocks.
It is similar to the Python @ref{f4,,time} module.

For C API related to the @ref{34,,datetime} module, see @ref{52ac,,DateTime 객체}.

@menu
* Types: Types<2>. 
* Clock Functions:: 
* Raw Clock Functions:: 
* Conversion functions:: 

@end menu

@node Types<2>,Clock Functions,,PyTime C API
@anchor{c-api/time types}@anchor{52ad}
@subsubsection Types


@geindex PyTime_t (C type)
@anchor{c-api/time c PyTime_t}@anchor{5d1}
@deffn {C 자료형} type PyTime_t

A timestamp or duration in nanoseconds, represented as a signed 64-bit
integer.

The reference point for timestamps depends on the clock used. For example,
@ref{5d9,,PyTime_Time()} returns timestamps relative to the UNIX epoch.

The supported range is around [-292.3 years; +292.3 years].
Using the Unix epoch (January 1st, 1970) as reference, the supported date
range is around [1677-09-21; 2262-04-11].
The exact limits are exposed as constants:
@end deffn

@geindex PyTime_MIN (C var)
@anchor{c-api/time c PyTime_MIN}@anchor{5d2}
@deffn {C 변수} @ref{5d1,,PyTime_t} PyTime_MIN

Minimum value of @ref{5d1,,PyTime_t}.
@end deffn

@geindex PyTime_MAX (C var)
@anchor{c-api/time c PyTime_MAX}@anchor{5d3}
@deffn {C 변수} @ref{5d1,,PyTime_t} PyTime_MAX

Maximum value of @ref{5d1,,PyTime_t}.
@end deffn

@node Clock Functions,Raw Clock Functions,Types<2>,PyTime C API
@anchor{c-api/time clock-functions}@anchor{52ae}
@subsubsection Clock Functions


The following functions take a pointer to a @ref{5d1,,PyTime_t} that they
set to the value of a particular clock.
Details of each clock are given in the documentation of the corresponding
Python function.

The functions return @code{0} on success, or @code{-1} (with an exception set)
on failure.

On integer overflow, they set the @ref{5045,,PyExc_OverflowError} exception and
set @code{*result} to the value clamped to the @code{[PyTime_MIN; PyTime_MAX]}
range.
(On current systems, integer overflows are likely caused by misconfigured
system time.)

As any other C API (unless otherwise specified), the functions must be called
with an @ref{4f10,,attached thread state}.

@geindex PyTime_Monotonic (C function)
@anchor{c-api/time c PyTime_Monotonic}@anchor{5d5}
@deffn {C 함수} int PyTime_Monotonic (PyTime_t *result)

Read the monotonic clock.
See @ref{55b,,time.monotonic()} for important details on this clock.
@end deffn

@geindex PyTime_PerfCounter (C function)
@anchor{c-api/time c PyTime_PerfCounter}@anchor{5d7}
@deffn {C 함수} int PyTime_PerfCounter (PyTime_t *result)

Read the performance counter.
See @ref{c79,,time.perf_counter()} for important details on this clock.
@end deffn

@geindex PyTime_Time (C function)
@anchor{c-api/time c PyTime_Time}@anchor{5d9}
@deffn {C 함수} int PyTime_Time (PyTime_t *result)

Read the “wall clock” time.
See @ref{55c,,time.time()} for details important on this clock.
@end deffn

@node Raw Clock Functions,Conversion functions,Clock Functions,PyTime C API
@anchor{c-api/time raw-clock-functions}@anchor{52af}
@subsubsection Raw Clock Functions


Similar to clock functions, but don’t set an exception on error and don’t
require the caller to have an @ref{4f10,,attached thread state}.

On success, the functions return @code{0}.

On failure, they set @code{*result} to @code{0} and return @code{-1}, `without' setting
an exception. To get the cause of the error, @ref{4f10,,attach} a @ref{1848,,thread state},
and call the regular (non-@code{Raw}) function. Note that the regular function may succeed after
the @code{Raw} one failed.

@geindex PyTime_MonotonicRaw (C function)
@anchor{c-api/time c PyTime_MonotonicRaw}@anchor{5d6}
@deffn {C 함수} int PyTime_MonotonicRaw (PyTime_t *result)

Similar to @ref{5d5,,PyTime_Monotonic()},
but don’t set an exception on error and don’t require an @ref{4f10,,attached thread state}.
@end deffn

@geindex PyTime_PerfCounterRaw (C function)
@anchor{c-api/time c PyTime_PerfCounterRaw}@anchor{5d8}
@deffn {C 함수} int PyTime_PerfCounterRaw (PyTime_t *result)

Similar to @ref{5d7,,PyTime_PerfCounter()},
but don’t set an exception on error and don’t require an @ref{4f10,,attached thread state}.
@end deffn

@geindex PyTime_TimeRaw (C function)
@anchor{c-api/time c PyTime_TimeRaw}@anchor{5da}
@deffn {C 함수} int PyTime_TimeRaw (PyTime_t *result)

Similar to @ref{5d9,,PyTime_Time()},
but don’t set an exception on error and don’t require an @ref{4f10,,attached thread state}.
@end deffn

@node Conversion functions,,Raw Clock Functions,PyTime C API
@anchor{c-api/time conversion-functions}@anchor{52b0}
@subsubsection Conversion functions


@geindex PyTime_AsSecondsDouble (C function)
@anchor{c-api/time c PyTime_AsSecondsDouble}@anchor{5d4}
@deffn {C 함수} double PyTime_AsSecondsDouble (PyTime_t t)

Convert a timestamp to a number of seconds as a C double.

The function cannot fail, but note that double has limited
accuracy for large values.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Support for Perf Maps,,PyTime C API,유틸리티<2>
@anchor{c-api/perfmaps doc}@anchor{52b1}@anchor{c-api/perfmaps perfmaps}@anchor{52b2}@anchor{c-api/perfmaps support-for-perf-maps}@anchor{52b3}@anchor{c-api/perfmaps translation-repo}@anchor{52b4}
@subsection Support for Perf Maps


On supported platforms (as of this writing, only Linux), the runtime can take
advantage of `perf map files' to make Python functions visible to an external
profiling tool (such as perf@footnote{https://perf.wiki.kernel.org/index.php/Main_Page}).
A running process may create a file in the @code{/tmp} directory, which contains entries
that can map a section of executable code to a name. This interface is described in the
documentation of the Linux Perf tool@footnote{https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/tools/perf/Documentation/jit-interface.txt}.

In Python, these helper APIs can be used by libraries and features that rely
on generating machine code on the fly.

Note that holding an @ref{4f10,,attached thread state} is not required for these APIs.

@geindex PyUnstable_PerfMapState_Init (C function)
@anchor{c-api/perfmaps c PyUnstable_PerfMapState_Init}@anchor{1aa9}
@deffn {C 함수} int PyUnstable_PerfMapState_Init (void)

@cartouche
@quotation 이것은 불안정 API. It may change without warning in minor releases. `이것은 @ref{768,,불안정 API}. It may change without warning in minor releases.'
@end quotation
@end cartouche

Open the @code{/tmp/perf-$pid.map} file, unless it’s already opened, and create
a lock to ensure thread-safe writes to the file (provided the writes are
done through @ref{1aa8,,PyUnstable_WritePerfMapEntry()}). Normally, there’s no need
to call this explicitly; just use @code{PyUnstable_WritePerfMapEntry()}
and it will initialize the state on first call.

Returns @code{0} on success, @code{-1} on failure to create/open the perf map file,
or @code{-2} on failure to create a lock. Check @code{errno} for more information
about the cause of a failure.
@end deffn

@geindex PyUnstable_WritePerfMapEntry (C function)
@anchor{c-api/perfmaps c PyUnstable_WritePerfMapEntry}@anchor{1aa8}
@deffn {C 함수} int PyUnstable_WritePerfMapEntry (const void *code_addr, unsigned int code_size, const char *entry_name)

@cartouche
@quotation 이것은 불안정 API. It may change without warning in minor releases. `이것은 @ref{768,,불안정 API}. It may change without warning in minor releases.'
@end quotation
@end cartouche

Write one single entry to the @code{/tmp/perf-$pid.map} file. This function is
thread safe. Here is what an example entry looks like:

@example
# address      size  name
7f3529fcf759 b     py::bar:/run/t.py
@end example

Will call @ref{1aa9,,PyUnstable_PerfMapState_Init()} before writing the entry, if
the perf map file is not already opened. Returns @code{0} on success, or the
same error codes as @code{PyUnstable_PerfMapState_Init()} on failure.
@end deffn

@geindex PyUnstable_PerfMapState_Fini (C function)
@anchor{c-api/perfmaps c PyUnstable_PerfMapState_Fini}@anchor{1aaa}
@deffn {C 함수} void PyUnstable_PerfMapState_Fini (void)

@cartouche
@quotation 이것은 불안정 API. It may change without warning in minor releases. `이것은 @ref{768,,불안정 API}. It may change without warning in minor releases.'
@end quotation
@end cartouche

Close the perf map file opened by @ref{1aa9,,PyUnstable_PerfMapState_Init()}.
This is called by the runtime itself during interpreter shut-down. In
general, there shouldn’t be a reason to explicitly call this, except to
handle specific scenarios such as forking.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 추상 객체 계층,구상 객체 계층,유틸리티<2>,Python/C API reference manual
@anchor{c-api/abstract doc}@anchor{52b5}@anchor{c-api/abstract abstract}@anchor{4f32}@anchor{c-api/abstract abstract-objects-layer}@anchor{52b6}@anchor{c-api/abstract translation-repo}@anchor{52b7}
@section 추상 객체 계층


이 장의 함수는 객체의 형과 무관하게, 혹은 광범위한 종류의 객체 형의 (예를 들어, 모든 숫자 형 또는 모든 시퀀스 형) 파이썬 객체와 상호 작용합니다. 적용되지 않는 객체 형에 사용되면, 파이썬 예외가 발생합니다.

@ref{4f88,,PyList_New()}로 만들었지만, 항목이 아직 @code{NULL}이 아닌 값으로 설정되지 않은 리스트 객체와 같이, 제대로 초기화되지 않은 객체에 대해서는 이 함수를 사용할 수 없습니다.

@menu
* 객체 프로토콜:: 
* 호출 프로토콜:: 
* 숫자 프로토콜:: 
* 시퀀스 프로토콜:: 
* 매핑 프로토콜:: 
* 이터레이터 프로토콜:: 
* 버퍼 프로토콜:: 

@end menu

@node 객체 프로토콜,호출 프로토콜,,추상 객체 계층
@anchor{c-api/object doc}@anchor{52b8}@anchor{c-api/object object}@anchor{52b9}@anchor{c-api/object object-protocol}@anchor{52ba}
@subsection 객체 프로토콜


@geindex Py_GetConstant (C function)
@anchor{c-api/object c Py_GetConstant}@anchor{5f7}
@deffn {C 함수} @ref{5dc,,PyObject} *Py_GetConstant (unsigned int constant_id)
` Part of the @ref{774,,안정 ABI} 버전 3.13 이후로.'
Get a @ref{5df,,strong reference} to a constant.

Set an exception and return @code{NULL} if `constant_id' is invalid.

`constant_id' must be one of these constant identifiers:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Constant Identifier

@tab

Value

@tab

Returned object

@item

@geindex Py_CONSTANT_NONE (C macro)
@anchor{c-api/object c Py_CONSTANT_NONE}@anchor{52bb}
@deffn {C 매크로} Py_CONSTANT_NONE
@end deffn

@tab

@code{0}

@tab

@ref{884,,None}

@item

@geindex Py_CONSTANT_FALSE (C macro)
@anchor{c-api/object c Py_CONSTANT_FALSE}@anchor{52bc}
@deffn {C 매크로} Py_CONSTANT_FALSE
@end deffn

@tab

@code{1}

@tab

@ref{d2a,,False}

@item

@geindex Py_CONSTANT_TRUE (C macro)
@anchor{c-api/object c Py_CONSTANT_TRUE}@anchor{52bd}
@deffn {C 매크로} Py_CONSTANT_TRUE
@end deffn

@tab

@code{2}

@tab

@ref{e06,,True}

@item

@geindex Py_CONSTANT_ELLIPSIS (C macro)
@anchor{c-api/object c Py_CONSTANT_ELLIPSIS}@anchor{52be}
@deffn {C 매크로} Py_CONSTANT_ELLIPSIS
@end deffn

@tab

@code{3}

@tab

@ref{2325,,Ellipsis}

@item

@geindex Py_CONSTANT_NOT_IMPLEMENTED (C macro)
@anchor{c-api/object c Py_CONSTANT_NOT_IMPLEMENTED}@anchor{52bf}
@deffn {C 매크로} Py_CONSTANT_NOT_IMPLEMENTED
@end deffn

@tab

@code{4}

@tab

@ref{1a2,,NotImplemented}

@item

@geindex Py_CONSTANT_ZERO (C macro)
@anchor{c-api/object c Py_CONSTANT_ZERO}@anchor{52c0}
@deffn {C 매크로} Py_CONSTANT_ZERO
@end deffn

@tab

@code{5}

@tab

@code{0}

@item

@geindex Py_CONSTANT_ONE (C macro)
@anchor{c-api/object c Py_CONSTANT_ONE}@anchor{52c1}
@deffn {C 매크로} Py_CONSTANT_ONE
@end deffn

@tab

@code{6}

@tab

@code{1}

@item

@geindex Py_CONSTANT_EMPTY_STR (C macro)
@anchor{c-api/object c Py_CONSTANT_EMPTY_STR}@anchor{52c2}
@deffn {C 매크로} Py_CONSTANT_EMPTY_STR
@end deffn

@tab

@code{7}

@tab

@code{'@w{'}}

@item

@geindex Py_CONSTANT_EMPTY_BYTES (C macro)
@anchor{c-api/object c Py_CONSTANT_EMPTY_BYTES}@anchor{52c3}
@deffn {C 매크로} Py_CONSTANT_EMPTY_BYTES
@end deffn

@tab

@code{8}

@tab

@code{b'@w{'}}

@item

@geindex Py_CONSTANT_EMPTY_TUPLE (C macro)
@anchor{c-api/object c Py_CONSTANT_EMPTY_TUPLE}@anchor{52c4}
@deffn {C 매크로} Py_CONSTANT_EMPTY_TUPLE
@end deffn

@tab

@code{9}

@tab

@code{()}

@end multitable


Numeric values are only given for projects which cannot use the constant
identifiers.


Added in version 3.13.


`CPython 구현 상세:' In CPython, all of these constants are @ref{290,,immortal}.
@end deffn

@geindex Py_GetConstantBorrowed (C function)
@anchor{c-api/object c Py_GetConstantBorrowed}@anchor{5f8}
@deffn {C 함수} @ref{5dc,,PyObject} *Py_GetConstantBorrowed (unsigned int constant_id)
` Part of the @ref{774,,안정 ABI} 버전 3.13 이후로.'
Similar to @ref{5f7,,Py_GetConstant()}, but return a @ref{3d7,,borrowed reference}.

This function is primarily intended for backwards compatibility:
using @ref{5f7,,Py_GetConstant()} is recommended for new code.

The reference is borrowed from the interpreter, and is valid until the
interpreter finalization.


Added in version 3.13.

@end deffn

@geindex Py_NotImplemented (C var)
@anchor{c-api/object c Py_NotImplemented}@anchor{52c5}
@deffn {C 변수} @ref{5dc,,PyObject} *Py_NotImplemented

지정된 형 조합에 대해 연산이 구현되지 않았음을 알리는 데 사용되는 @code{NotImplemented} 싱글톤.
@end deffn

@geindex Py_RETURN_NOTIMPLEMENTED (C macro)
@anchor{c-api/object c Py_RETURN_NOTIMPLEMENTED}@anchor{17eb}
@deffn {C 매크로} Py_RETURN_NOTIMPLEMENTED

C 함수 내에서 @ref{52c5,,Py_NotImplemented} 반환을 올바르게 처리합니다 (즉, @ref{1a2,,NotImplemented}에 대한 새로운 @ref{5df,,강한 참조}를 만들고 반환합니다).
@end deffn

@geindex Py_PRINT_RAW (C macro)
@anchor{c-api/object c Py_PRINT_RAW}@anchor{52c6}
@deffn {C 매크로} Py_PRINT_RAW

Flag to be used with multiple functions that print the object (like
@ref{198c,,PyObject_Print()} and @ref{5065,,PyFile_WriteObject()}).
If passed, these functions use the @ref{169,,str()} of the object
instead of the @ref{1c1,,repr()}.
@end deffn

@geindex PyObject_Print (C function)
@anchor{c-api/object c PyObject_Print}@anchor{198c}
@deffn {C 함수} int PyObject_Print (PyObject *o, FILE *fp, int flags)

파일 `fp'에 객체 `o'를 인쇄합니다. 에러 시 @code{-1}을 반환합니다. flags 인자는 특정 인쇄 옵션을 활성화하는 데 사용됩니다. 현재 지원되는 유일한 옵션은 @ref{52c6,,Py_PRINT_RAW}입니다; 주어지면, @ref{1c1,,repr()} 대신 객체의 @ref{169,,str()}이 기록됩니다.
@end deffn

@geindex PyObject_HasAttrWithError (C function)
@anchor{c-api/object c PyObject_HasAttrWithError}@anchor{61a}
@deffn {C 함수} int PyObject_HasAttrWithError (PyObject *o, PyObject *attr_name)
` Part of the @ref{774,,안정 ABI} 버전 3.13 이후로.'
`o'에 `attr_name' 어트리뷰트가 있으면 @code{1}을, 그렇지 않으면 @code{0}을 반환합니다. 이것은 파이썬 표현식 @code{hasattr(o, attr_name)}과 동등합니다. 실패하면, @code{-1}을 반환합니다.


Added in version 3.13.

@end deffn

@geindex PyObject_HasAttrStringWithError (C function)
@anchor{c-api/object c PyObject_HasAttrStringWithError}@anchor{61c}
@deffn {C 함수} int PyObject_HasAttrStringWithError (PyObject *o, const char *attr_name)
` Part of the @ref{774,,안정 ABI} 버전 3.13 이후로.'
This is the same as @ref{61a,,PyObject_HasAttrWithError()}, but `attr_name' is
specified as a const char* UTF-8 encoded bytes string,
rather than a @ref{5dc,,PyObject}*.


Added in version 3.13.

@end deffn

@geindex PyObject_HasAttr (C function)
@anchor{c-api/object c PyObject_HasAttr}@anchor{619}
@deffn {C 함수} int PyObject_HasAttr (PyObject *o, PyObject *attr_name)
` Part of the @ref{774,,안정 ABI}.'
`o'에 `attr_name' 어트리뷰트가 있으면 @code{1}을, 그렇지 않으면 @code{0}을 반환합니다. 이 함수는 항상 성공합니다.

@cartouche
@quotation 참고 
Exceptions that occur when this calls @ref{6f9,,__getattr__()} and
@ref{dca,,__getattribute__()} methods aren’t propagated,
but instead given to @ref{506,,sys.unraisablehook()}.
For proper error handling, use @ref{61a,,PyObject_HasAttrWithError()},
@ref{5ea,,PyObject_GetOptionalAttr()} or @ref{5ec,,PyObject_GetAttr()} instead.
@end quotation
@end cartouche
@end deffn

@geindex PyObject_HasAttrString (C function)
@anchor{c-api/object c PyObject_HasAttrString}@anchor{61b}
@deffn {C 함수} int PyObject_HasAttrString (PyObject *o, const char *attr_name)
` Part of the @ref{774,,안정 ABI}.'
This is the same as @ref{619,,PyObject_HasAttr()}, but `attr_name' is
specified as a const char* UTF-8 encoded bytes string,
rather than a @ref{5dc,,PyObject}*.

@cartouche
@quotation 참고 
@ref{6f9,,__getattr__()}과 @ref{dca,,__getattribute__()} 메서드를 호출할 때나 임시 @ref{169,,str} 객체를 만드는 중에 발생하는 예외는 조용히 무시됩니다. 적절한 에러 처리를 위해서는, 대신 @ref{61c,,PyObject_HasAttrStringWithError()}, @ref{5eb,,PyObject_GetOptionalAttrString()} 또는 @ref{5ed,,PyObject_GetAttrString()}을 사용하십시오.
@end quotation
@end cartouche
@end deffn

@geindex PyObject_GetAttr (C function)
@anchor{c-api/object c PyObject_GetAttr}@anchor{5ec}
@deffn {C 함수} @ref{5dc,,PyObject} *PyObject_GetAttr (PyObject *o, PyObject *attr_name)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
객체 `o'에서 `attr_name'이라는 이름의 어트리뷰트를 가져옵니다. 성공하면 어트리뷰트 값을, 실패하면 @code{NULL}을 반환합니다. 이것은 파이썬 표현식 @code{o.attr_name}과 동등합니다.

If the missing attribute should not be treated as a failure, you can use
@ref{5ea,,PyObject_GetOptionalAttr()} instead.
@end deffn

@geindex PyObject_GetAttrString (C function)
@anchor{c-api/object c PyObject_GetAttrString}@anchor{5ed}
@deffn {C 함수} @ref{5dc,,PyObject} *PyObject_GetAttrString (PyObject *o, const char *attr_name)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
This is the same as @ref{5ec,,PyObject_GetAttr()}, but `attr_name' is
specified as a const char* UTF-8 encoded bytes string,
rather than a @ref{5dc,,PyObject}*.

If the missing attribute should not be treated as a failure, you can use
@ref{5eb,,PyObject_GetOptionalAttrString()} instead.
@end deffn

@geindex PyObject_GetOptionalAttr (C function)
@anchor{c-api/object c PyObject_GetOptionalAttr}@anchor{5ea}
@deffn {C 함수} int PyObject_GetOptionalAttr (PyObject *obj, PyObject *attr_name, PyObject **result);
` Part of the @ref{774,,안정 ABI} 버전 3.13 이후로.'
Variant of @ref{5ec,,PyObject_GetAttr()} which doesn’t raise
@ref{5ee,,AttributeError} if the attribute is not found.

If the attribute is found, return @code{1} and set `*result' to a new
@ref{5df,,strong reference} to the attribute.
If the attribute is not found, return @code{0} and set `*result' to @code{NULL};
the @ref{5ee,,AttributeError} is silenced.
If an error other than @code{AttributeError} is raised, return @code{-1} and
set `*result' to @code{NULL}.


Added in version 3.13.

@end deffn

@geindex PyObject_GetOptionalAttrString (C function)
@anchor{c-api/object c PyObject_GetOptionalAttrString}@anchor{5eb}
@deffn {C 함수} int PyObject_GetOptionalAttrString (PyObject *obj, const char *attr_name, PyObject **result);
` Part of the @ref{774,,안정 ABI} 버전 3.13 이후로.'
This is the same as @ref{5ea,,PyObject_GetOptionalAttr()}, but `attr_name' is
specified as a const char* UTF-8 encoded bytes string,
rather than a @ref{5dc,,PyObject}*.


Added in version 3.13.

@end deffn

@geindex PyObject_GenericGetAttr (C function)
@anchor{c-api/object c PyObject_GenericGetAttr}@anchor{50ce}
@deffn {C 함수} @ref{5dc,,PyObject} *PyObject_GenericGetAttr (PyObject *o, PyObject *name)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
형 객체의 @code{tp_getattro} 슬롯에 배치되는 일반 어트리뷰트 게터(getter) 함수. 객체의 (있다면) @ref{77c,,__dict__}에 있는 어트리뷰트뿐만 아니라 객체의 MRO에 있는 클래스의 딕셔너리에 있는 디스크립터를 찾습니다. @ref{e48,,디스크립터 구현하기}에 요약된 것처럼, 데이터 디스크립터는 인스턴스 어트리뷰트보다 우선하지만, 비 데이터 디스크립터는 그렇지 않습니다. 그렇지 않으면, @ref{5ee,,AttributeError}가 발생합니다.
@end deffn

@geindex PyObject_SetAttr (C function)
@anchor{c-api/object c PyObject_SetAttr}@anchor{1770}
@deffn {C 함수} int PyObject_SetAttr (PyObject *o, PyObject *attr_name, PyObject *v)
` Part of the @ref{774,,안정 ABI}.'
객체 `o'에 대해, `attr_name'이라는 이름의 어트리뷰트 값을 `v' 값으로 설정합니다. 실패 시 예외를 발생시키고 @code{-1}을 반환합니다. 성공하면 @code{0}을 반환합니다. 이것은 파이썬 문장 @code{o.attr_name = v}와 동등합니다.

`v'가 @code{NULL}이면, 어트리뷰트가 삭제됩니다. 이 동작은 폐지되었고 @ref{1834,,PyObject_DelAttr()}로 대체되었습니다만, 현재 제거할 계획이 없습니다.
@end deffn

@geindex PyObject_SetAttrString (C function)
@anchor{c-api/object c PyObject_SetAttrString}@anchor{198f}
@deffn {C 함수} int PyObject_SetAttrString (PyObject *o, const char *attr_name, PyObject *v)
` Part of the @ref{774,,안정 ABI}.'
This is the same as @ref{1770,,PyObject_SetAttr()}, but `attr_name' is
specified as a const char* UTF-8 encoded bytes string,
rather than a @ref{5dc,,PyObject}*.

`v'가 @code{NULL}이면, 어트리뷰트가 삭제되지만, 이 기능은 폐지되었고 @ref{1835,,PyObject_DelAttrString()}으로 대체되었습니다.

The number of different attribute names passed to this function
should be kept small, usually by using a statically allocated string
as `attr_name'.
For attribute names that aren’t known at compile time, prefer calling
@ref{5151,,PyUnicode_FromString()} and @ref{1770,,PyObject_SetAttr()} directly.
For more details, see @ref{198d,,PyUnicode_InternFromString()}, which may be
used internally to create a key object.
@end deffn

@geindex PyObject_GenericSetAttr (C function)
@anchor{c-api/object c PyObject_GenericSetAttr}@anchor{50cf}
@deffn {C 함수} int PyObject_GenericSetAttr (PyObject *o, PyObject *name, PyObject *value)
` Part of the @ref{774,,안정 ABI}.'
형 객체의 @ref{4f27,,tp_setattro} 슬롯에 배치되는 일반 어트리뷰트 세터(setter)와 딜리터(deleter) 함수. 객체의 MRO에 있는 클래스의 딕셔너리에서 데이터 디스크립터를 찾고, 발견되면 인스턴스 딕셔너리에 있는 어트리뷰트를 설정하거나 삭제하는 것보다 우선합니다. 그렇지 않으면, 객체의 (있다면) @ref{77c,,__dict__}에서 어트리뷰트가 설정되거나 삭제됩니다. 성공하면 @code{0}이 반환되고, 그렇지 않으면 @ref{5ee,,AttributeError}가 발생하고 @code{-1}이 반환됩니다.
@end deffn

@geindex PyObject_DelAttr (C function)
@anchor{c-api/object c PyObject_DelAttr}@anchor{1834}
@deffn {C 함수} int PyObject_DelAttr (PyObject *o, PyObject *attr_name)
` Part of the @ref{774,,안정 ABI} 버전 3.13 이후로.'
객체 `o'에 대해, `attr_name'이라는 이름의 어트리뷰트를 삭제합니다. 실패 시 @code{-1}을 반환합니다. 이것은 파이썬 문장 @code{del o.attr_name}과 동등합니다.
@end deffn

@geindex PyObject_DelAttrString (C function)
@anchor{c-api/object c PyObject_DelAttrString}@anchor{1835}
@deffn {C 함수} int PyObject_DelAttrString (PyObject *o, const char *attr_name)
` Part of the @ref{774,,안정 ABI} 버전 3.13 이후로.'
This is the same as @ref{1834,,PyObject_DelAttr()}, but `attr_name' is
specified as a const char* UTF-8 encoded bytes string,
rather than a @ref{5dc,,PyObject}*.

The number of different attribute names passed to this function
should be kept small, usually by using a statically allocated string
as `attr_name'.
For attribute names that aren’t known at compile time, prefer calling
@ref{5151,,PyUnicode_FromString()} and @ref{1834,,PyObject_DelAttr()} directly.
For more details, see @ref{198d,,PyUnicode_InternFromString()}, which may be
used internally to create a key object for lookup.
@end deffn

@geindex PyObject_GenericGetDict (C function)
@anchor{c-api/object c PyObject_GenericGetDict}@anchor{1d02}
@deffn {C 함수} @ref{5dc,,PyObject} *PyObject_GenericGetDict (PyObject *o, void *context)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI} 버전 3.10 이후로.'
@code{__dict__} 디스크립터의 게터(getter)를 위한 일반적인 구현. 필요하면 딕셔너리를 만듭니다.

This function may also be called to get the @ref{77c,,__dict__}
of the object `o'. Pass @code{NULL} for `context' when calling it.
Since this function may need to allocate memory for the
dictionary, it may be more efficient to call @ref{5ec,,PyObject_GetAttr()}
when accessing an attribute on the object.

On failure, returns @code{NULL} with an exception set.


Added in version 3.3.

@end deffn

@geindex PyObject_GenericSetDict (C function)
@anchor{c-api/object c PyObject_GenericSetDict}@anchor{50d0}
@deffn {C 함수} int PyObject_GenericSetDict (PyObject *o, PyObject *value, void *context)
` Part of the @ref{774,,안정 ABI} 버전 3.7 이후로.'
@code{__dict__} 디스크립터의 세터(setter)를 위한 일반적인 구현. 이 구현은 딕셔너리 삭제를 허락하지 않습니다.


Added in version 3.3.

@end deffn

@geindex _PyObject_GetDictPtr (C function)
@anchor{c-api/object c _PyObject_GetDictPtr}@anchor{52c7}
@deffn {C 함수} @ref{5dc,,PyObject} **_PyObject_GetDictPtr (PyObject *obj)

Return a pointer to @ref{77c,,__dict__} of the object `obj'.
If there is no @code{__dict__}, return @code{NULL} without setting an exception.

This function may need to allocate memory for the
dictionary, so it may be more efficient to call @ref{5ec,,PyObject_GetAttr()}
when accessing an attribute on the object.
@end deffn

@geindex PyObject_RichCompare (C function)
@anchor{c-api/object c PyObject_RichCompare}@anchor{4f30}
@deffn {C 함수} @ref{5dc,,PyObject} *PyObject_RichCompare (PyObject *o1, PyObject *o2, int opid)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
`opid'에 의해 지정된 연산을 사용하여 `o1'과 `o2'의 값을 비교합니다. `opid'는 @ref{52c8,,Py_LT}, @ref{52c9,,Py_LE}, @ref{52ca,,Py_EQ}, @ref{52cb,,Py_NE}, @ref{52cc,,Py_GT} 또는 @ref{52cd,,Py_GE} 중 하나여야 하고 각각 @code{<}, @code{<=}, @code{==}, @code{!=}, @code{>} 또는 @code{>=}에 해당합니다. 이는 파이썬 표현식 @code{o1 op o2}와 동등합니다. 여기서 @code{op}는 `opid'에 해당하는 연산자입니다. 성공 시 비교 값을, 실패 시 @code{NULL}을 반환합니다.
@end deffn

@geindex PyObject_RichCompareBool (C function)
@anchor{c-api/object c PyObject_RichCompareBool}@anchor{1d8a}
@deffn {C 함수} int PyObject_RichCompareBool (PyObject *o1, PyObject *o2, int opid)
` Part of the @ref{774,,안정 ABI}.'
Compare the values of `o1' and `o2' using the operation specified by `opid',
like @ref{4f30,,PyObject_RichCompare()}, but returns @code{-1} on error, @code{0} if
the result is false, @code{1} otherwise.
@end deffn

@cartouche
@quotation 참고 
`o1'과 `o2'가 같은 객체이면, @ref{1d8a,,PyObject_RichCompareBool()} 은 항상 @ref{52ca,,Py_EQ}의 경우는 @code{1}을, @ref{52cb,,Py_NE}의 경우는 @code{0}을 반환합니다.
@end quotation
@end cartouche

@geindex PyObject_Format (C function)
@anchor{c-api/object c PyObject_Format}@anchor{50cd}
@deffn {C 함수} @ref{5dc,,PyObject} *PyObject_Format (PyObject *obj, PyObject *format_spec)
` Part of the @ref{774,,안정 ABI}.'
Format `obj' using `format_spec'. This is equivalent to the Python
expression @code{format(obj, format_spec)}.

`format_spec' may be @code{NULL}. In this case the call is equivalent
to @code{format(obj)}.
Returns the formatted string on success, @code{NULL} on failure.
@end deffn

@geindex PyObject_Repr (C function)
@anchor{c-api/object c PyObject_Repr}@anchor{122e}
@deffn {C 함수} @ref{5dc,,PyObject} *PyObject_Repr (PyObject *o)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
@geindex 내장 함수;repr

객체 `o'의 문자열 표현을 계산합니다. 성공하면 문자열 표현을, 실패하면 @code{NULL}을 반환합니다. 이것은 파이썬 표현식 @code{repr(o)}와 동등합니다. @ref{1c1,,repr()} 내장 함수에 의해 호출됩니다.

If argument is @code{NULL}, return the string @code{'<NULL>'}.


버전 3.4에서 변경: 이 함수에는 이제 디버그 어서션이 포함되어 있어 활성 예외를 조용히 버리지 않도록 합니다.

@end deffn

@geindex PyObject_ASCII (C function)
@anchor{c-api/object c PyObject_ASCII}@anchor{50c6}
@deffn {C 함수} @ref{5dc,,PyObject} *PyObject_ASCII (PyObject *o)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
@geindex 내장 함수;아스키

@ref{122e,,PyObject_Repr()}처럼, 객체 `o'의 문자열 표현을 계산하지만, @code{\x}, @code{\u} 또는 @code{\U} 이스케이프를 사용하여 @code{PyObject_Repr()}이 반환한 문자열에서 비 ASCII 문자를 이스케이프 합니다. 이것은 파이썬 2에서 @code{PyObject_Repr()}에 의해 반환된 것과 유사한 문자열을 생성합니다. @ref{15eb,,ascii()} 내장 함수에 의해 호출됩니다.

If argument is @code{NULL}, return the string @code{'<NULL>'}.

@geindex 문자열;PyObject_Str (C 함수)
@end deffn

@geindex PyObject_Str (C function)
@anchor{c-api/object c PyObject_Str}@anchor{122f}
@deffn {C 함수} @ref{5dc,,PyObject} *PyObject_Str (PyObject *o)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
객체 `o'의 문자열 표현을 계산합니다. 성공 시 문자열 표현을, 실패 시 @code{NULL}을 반환합니다. 이것은 파이썬 표현식 @code{str(o)}와 동등합니다. @ref{169,,str()} 내장 함수에 의해, 따라서 @ref{1174,,print()} 함수에 의해서도 호출됩니다.

If argument is @code{NULL}, return the string @code{'<NULL>'}.


버전 3.4에서 변경: 이 함수에는 이제 디버그 어서션이 포함되어 있어 활성 예외를 조용히 버리지 않도록 합니다.

@end deffn

@geindex PyObject_Bytes (C function)
@anchor{c-api/object c PyObject_Bytes}@anchor{50c8}
@deffn {C 함수} @ref{5dc,,PyObject} *PyObject_Bytes (PyObject *o)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
@geindex 내장 함수;바이트열

객체 `o'의 바이트열 표현을 계산합니다. 실패하면 @code{NULL}을, 성공하면 바이트열 객체를 반환됩니다. 이는 `o'가 정수가 아닐 때 파이썬 표현식 @code{bytes(o)}와 동등합니다. @code{bytes(o)}와 달리, `o'가 정수이면 0으로 초기화된 바이트열 객체 대신 TypeError가 발생합니다.

If argument is @code{NULL}, return the @ref{192,,bytes} object @code{b'<NULL>'}.
@end deffn

@geindex PyObject_IsSubclass (C function)
@anchor{c-api/object c PyObject_IsSubclass}@anchor{10a6}
@deffn {C 함수} int PyObject_IsSubclass (PyObject *derived, PyObject *cls)
` Part of the @ref{774,,안정 ABI}.'
클래스 `derived'가 클래스 `cls'와 동일하거나 `cls'에서 파생되었으면 @code{1}을 반환하고, 그렇지 않으면 @code{0}을 반환합니다. 에러가 발생하면 @code{-1}을 반환합니다.

`cls'가 튜플이면, `cls'의 모든 항목에 대해 검사가 수행됩니다. 적어도 하나의 검사에서 @code{1}을 반환하면 결과는 @code{1}이 되고, 그렇지 않으면 @code{0}이 됩니다.

`cls'에 @ref{23c7,,__subclasscheck__()} 메서드가 있으면, 
@geindex Python 향상 제안; PEP 3119
PEP 3119@footnote{https://peps.python.org/pep-3119/}에 설명된 대로 서브 클래스 상태를 판별하기 위해 호출됩니다. 그렇지 않으면, `derived'가 직접 또는 간접 서브 클래스일 때 `cls'의 서브 클래스입니다, 즉 @ref{2374,,cls.__mro__}에 포함되어 있습니다.

일반적으로 클래스 객체(즉 @ref{f43,,type}이나 파생 클래스의 인스턴스)만 클래스로 간주합니다. 그러나, 객체는 @ref{16b1,,__bases__} 어트리뷰트(베이스 클래스의 튜플이어야 합니다)를 가짐으로써 이를 재정의할 수 있습니다.
@end deffn

@geindex PyObject_IsInstance (C function)
@anchor{c-api/object c PyObject_IsInstance}@anchor{10a5}
@deffn {C 함수} int PyObject_IsInstance (PyObject *inst, PyObject *cls)
` Part of the @ref{774,,안정 ABI}.'
`inst'가 `cls' 클래스나 `cls'의 서브 클래스의 인스턴스이면 @code{1}을 반환하고, 그렇지 않으면 @code{0}을 반환합니다. 에러가 발생하면 @code{-1}을 반환하고 예외를 설정합니다.

`cls'가 튜플이면, `cls'의 모든 항목에 대해 검사가 수행됩니다. 적어도 하나의 검사에서 @code{1}을 반환하면 결과는 @code{1}이 되고, 그렇지 않으면 @code{0}이 됩니다.

`cls'에 @ref{23c6,,__instancecheck__()} 메서드가 있으면, 
@geindex Python 향상 제안; PEP 3119
PEP 3119@footnote{https://peps.python.org/pep-3119/}에 설명된 대로 서브 클래스 상태를 판별하기 위해 호출됩니다. 그렇지 않으면, `inst'는 해당 클래스가 `cls'의 서브 클래스일 때 `cls'의 인스턴스입니다.

인스턴스 `inst'는 @ref{16b2,,__class__} 어트리뷰트를 가짐으로써 클래스로 간주하는 것을 재정의할 수 있습니다.

객체 `cls'는 @ref{16b1,,__bases__} 어트리뷰트(베이스 클래스의 튜플이어야 합니다)를 가짐으로써, 클래스로 간주하는지와 베이스 클래스가 무엇인지를 재정의할 수 있습니다.
@end deffn

@geindex PyObject_Hash (C function)
@anchor{c-api/object c PyObject_Hash}@anchor{436}
@deffn {C 함수} @ref{1468,,Py_hash_t} PyObject_Hash (PyObject *o)
` Part of the @ref{774,,안정 ABI}.'
@geindex 내장 함수;해시

객체 `o'의 해시값을 계산하고 반환합니다. 실패하면 @code{-1}을 반환합니다. 이것은 파이썬 표현식 @code{hash(o)}와 동등합니다.


버전 3.2에서 변경: 반환형은 이제 Py_hash_t입니다. 이것은 @ref{c54,,Py_ssize_t}와 같은 크기의 부호 있는 정수입니다.

@end deffn

@geindex PyObject_HashNotImplemented (C function)
@anchor{c-api/object c PyObject_HashNotImplemented}@anchor{15cb}
@deffn {C 함수} @ref{1468,,Py_hash_t} PyObject_HashNotImplemented (PyObject *o)
` Part of the @ref{774,,안정 ABI}.'
@code{type(o)}가 @ref{823,,해시 가능}하지 않음을 나타내는 @ref{198,,TypeError}를 설정하고 @code{-1}을 반환합니다. 이 함수는 @code{tp_hash} 슬롯에 저장될 때 특수한 처방을 받아서, 인터프리터에 형이 해시 가능하지 않음을 명시적으로 알립니다.
@end deffn

@geindex PyObject_IsTrue (C function)
@anchor{c-api/object c PyObject_IsTrue}@anchor{50d3}
@deffn {C 함수} int PyObject_IsTrue (PyObject *o)
` Part of the @ref{774,,안정 ABI}.'
객체 `o'를 참으로 간주하면 @code{1}을, 그렇지 않으면 @code{0}을 반환합니다. 이것은 파이썬 표현식 @code{not not o}와 동등합니다. 실패하면 @code{-1}을 반환합니다.
@end deffn

@geindex PyObject_Not (C function)
@anchor{c-api/object c PyObject_Not}@anchor{50d5}
@deffn {C 함수} int PyObject_Not (PyObject *o)
` Part of the @ref{774,,안정 ABI}.'
객체 `o'를 참으로 간주하면 @code{0}을, 그렇지 않으면 @code{1}을 반환합니다. 이것은 파이썬 표현식 @code{not o}와 동등합니다. 실패하면 @code{-1}을 반환합니다.
@end deffn

@geindex PyObject_Type (C function)
@anchor{c-api/object c PyObject_Type}@anchor{50d8}
@deffn {C 함수} @ref{5dc,,PyObject} *PyObject_Type (PyObject *o)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
@geindex 내장 함수;형

`o'가 @code{NULL}이 아니면, 객체 `o'의 객체 형에 해당하는 형 객체를 반환합니다. 실패하면 @ref{794,,SystemError}를 발생시키고 @code{NULL}을 반환합니다. 이것은 파이썬 표현식 @code{type(o)}와 동등합니다. 이 함수는 반환 값에 대한 새로운 @ref{5df,,강한 참조}를 만듭니다. 새로운 강한 참조가 필요할 때를 제외하고, @ref{c9b,,PyTypeObject}* 형의 포인터를 반환하는 @ref{3c9,,Py_TYPE()} 함수 대신 이 함수를 사용할 이유가 없습니다.
@end deffn

@geindex PyObject_TypeCheck (C function)
@anchor{c-api/object c PyObject_TypeCheck}@anchor{1cb2}
@deffn {C 함수} int PyObject_TypeCheck (PyObject *o, PyTypeObject *type)

객체 `o'가 `type' 형이거나 `type'의 서브 형이면 0이 아닌 값을 반환하고, 그렇지 않으면 @code{0}을 반환합니다. 두 매개 변수 모두 @code{NULL}이 아니어야 합니다.
@end deffn

@geindex PyObject_Size (C function)
@geindex PyObject_Length (C function)
@anchor{c-api/object c PyObject_Size}@anchor{50d7}
@deffn {C 함수} @ref{c54,,Py_ssize_t} PyObject_Size (PyObject *o)
@anchor{c-api/object c PyObject_Length}@anchor{50d4}
@deffnx {C 함수} @ref{c54,,Py_ssize_t} PyObject_Length (PyObject *o)
` Part of the @ref{774,,안정 ABI}.'
@geindex 내장 함수;len

객체 `o'의 길이를 반환합니다. 객체 `o'가 시퀀스와 매핑 프로토콜을 제공하면, 시퀀스 길이가 반환됩니다. 에러가 발생하면 @code{-1}이 반환됩니다. 이것은 파이썬 표현식 @code{len(o)}와 동등합니다.
@end deffn

@geindex PyObject_LengthHint (C function)
@anchor{c-api/object c PyObject_LengthHint}@anchor{1203}
@deffn {C 함수} @ref{c54,,Py_ssize_t} PyObject_LengthHint (PyObject *o, Py_ssize_t defaultvalue)

`o' 객체의 추정된 길이를 반환합니다. 먼저 실제 길이를 반환하려고 시도한 다음, @ref{110d,,__length_hint__()}를 사용하여 추정값을 반환하고, 마지막으로 기본값을 반환합니다. 에러 시 @code{-1}을 반환합니다. 이것은 파이썬 표현식 @code{operator.length_hint(o, defaultvalue)}와 동등합니다.


Added in version 3.4.

@end deffn

@geindex PyObject_GetItem (C function)
@anchor{c-api/object c PyObject_GetItem}@anchor{5e6}
@deffn {C 함수} @ref{5dc,,PyObject} *PyObject_GetItem (PyObject *o, PyObject *key)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
객체 `key'에 해당하는 `o'의 요소를 반환하거나 실패 시 @code{NULL}을 반환합니다. 이것은 파이썬 표현식 @code{o[key]}와 동등합니다.
@end deffn

@geindex PyObject_SetItem (C function)
@anchor{c-api/object c PyObject_SetItem}@anchor{4f87}
@deffn {C 함수} int PyObject_SetItem (PyObject *o, PyObject *key, PyObject *v)
` Part of the @ref{774,,안정 ABI}.'
객체 `key'를 값 `v'에 매핑합니다. 실패 시 예외를 발생시키고 @code{-1}을 반환합니다; 성공하면 @code{0}을 반환합니다. 이것은 파이썬 문장 @code{o[key] = v}와 동등합니다. 이 함수는 `v'에 대한 참조를 훔치지 `않습니다'.
@end deffn

@geindex PyObject_DelItem (C function)
@anchor{c-api/object c PyObject_DelItem}@anchor{50ca}
@deffn {C 함수} int PyObject_DelItem (PyObject *o, PyObject *key)
` Part of the @ref{774,,안정 ABI}.'
객체 `o'에서 객체 `key'에 대한 매핑을 제거합니다. 실패하면 @code{-1}을 반환합니다. 이것은 파이썬 문장 @code{del o[key]}와 동등합니다.
@end deffn

@geindex PyObject_DelItemString (C function)
@anchor{c-api/object c PyObject_DelItemString}@anchor{50cb}
@deffn {C 함수} int PyObject_DelItemString (PyObject *o, const char *key)
` Part of the @ref{774,,안정 ABI}.'
This is the same as @ref{50ca,,PyObject_DelItem()}, but `key' is
specified as a const char* UTF-8 encoded bytes string,
rather than a @ref{5dc,,PyObject}*.
@end deffn

@geindex PyObject_Dir (C function)
@anchor{c-api/object c PyObject_Dir}@anchor{50cc}
@deffn {C 함수} @ref{5dc,,PyObject} *PyObject_Dir (PyObject *o)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
이것은 파이썬 표현식 @code{dir(o)}와 동등하며, 객체 인자에 적합한 문자열의 (비어있을 수 있는) 리스트를 반환하거나, 에러가 있으면 @code{NULL}을 반환합니다. 인자가 @code{NULL}이면, 파이썬 @code{dir()}과 비슷하며, 현재 지역(locals)의 이름들을 반환합니다; 이 경우, 실행 프레임이 활성화되어 있지 않으면 @code{NULL}이 반환되지만 @ref{1cac,,PyErr_Occurred()}는 거짓을 반환합니다.
@end deffn

@geindex PyObject_GetIter (C function)
@anchor{c-api/object c PyObject_GetIter}@anchor{50d2}
@deffn {C 함수} @ref{5dc,,PyObject} *PyObject_GetIter (PyObject *o)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
이것은 파이썬 표현식 @code{iter(o)}와 동등합니다. 객체 인자에 대한 새로운 이터레이터를 반환하거나, 객체가 이미 이터레이터이면 객체 자체를 반환합니다. 객체를 이터레이트 할 수 없으면 @ref{198,,TypeError}를 발생시키고 @code{NULL}을 반환합니다.
@end deffn

@geindex PyObject_SelfIter (C function)
@anchor{c-api/object c PyObject_SelfIter}@anchor{50d6}
@deffn {C 함수} @ref{5dc,,PyObject} *PyObject_SelfIter (PyObject *obj)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
This is equivalent to the Python @code{__iter__(self): return self} method.
It is intended for @ref{4ca,,iterator} types, to be used in the @ref{16f4,,PyTypeObject.tp_iter} slot.
@end deffn

@geindex PyObject_GetAIter (C function)
@anchor{c-api/object c PyObject_GetAIter}@anchor{50d1}
@deffn {C 함수} @ref{5dc,,PyObject} *PyObject_GetAIter (PyObject *o)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI} 버전 3.10 이후로.'
이것은 파이썬 표현식 @code{aiter(o)}와 동등합니다. @code{AsyncIterable}을 받아서 그 것의 @code{AsyncIterator}를 반환합니다. 보통 새 이터레이터이지만, 인자가 @code{AsyncIterator}면 그 자신을 반환합니다. 객체를 이터레이트 할 수 없으면 @ref{198,,TypeError}를 발생시키고 @code{NULL}을 반환합니다.


Added in version 3.10.

@end deffn

@geindex PyObject_GetTypeData (C function)
@anchor{c-api/object c PyObject_GetTypeData}@anchor{76a}
@deffn {C 함수} void *PyObject_GetTypeData (PyObject *o, PyTypeObject *cls)
` Part of the @ref{774,,안정 ABI} 버전 3.12 이후로.'
Get a pointer to subclass-specific data reserved for `cls'.

The object `o' must be an instance of `cls', and `cls' must have been
created using negative @ref{769,,PyType_Spec.basicsize}.
Python does not check this.

On error, set an exception and return @code{NULL}.


Added in version 3.12.

@end deffn

@geindex PyType_GetTypeDataSize (C function)
@anchor{c-api/object c PyType_GetTypeDataSize}@anchor{76b}
@deffn {C 함수} @ref{c54,,Py_ssize_t} PyType_GetTypeDataSize (PyTypeObject *cls)
` Part of the @ref{774,,안정 ABI} 버전 3.12 이후로.'
Return the size of the instance memory space reserved for `cls', i.e. the size of the
memory @ref{76a,,PyObject_GetTypeData()} returns.

This may be larger than requested using @ref{769,,-PyType_Spec.basicsize};
it is safe to use this larger size (e.g. with @code{memset()}).

The type `cls' `must' have been created using
negative @ref{769,,PyType_Spec.basicsize}.
Python does not check this.

On error, set an exception and return a negative value.


Added in version 3.12.

@end deffn

@geindex PyObject_GetItemData (C function)
@anchor{c-api/object c PyObject_GetItemData}@anchor{76d}
@deffn {C 함수} void *PyObject_GetItemData (PyObject *o)

Get a pointer to per-item data for a class with
@ref{76c,,Py_TPFLAGS_ITEMS_AT_END}.

On error, set an exception and return @code{NULL}.
@ref{198,,TypeError} is raised if `o' does not have
@ref{76c,,Py_TPFLAGS_ITEMS_AT_END} set.


Added in version 3.12.

@end deffn

@geindex PyObject_VisitManagedDict (C function)
@anchor{c-api/object c PyObject_VisitManagedDict}@anchor{60b}
@deffn {C 함수} int PyObject_VisitManagedDict (PyObject *obj, visitproc visit, void *arg)

Visit the managed dictionary of `obj'.

This function must only be called in a traverse function of the type which
has the @ref{60d,,Py_TPFLAGS_MANAGED_DICT} flag set.


Added in version 3.13.

@end deffn

@geindex PyObject_ClearManagedDict (C function)
@anchor{c-api/object c PyObject_ClearManagedDict}@anchor{60c}
@deffn {C 함수} void PyObject_ClearManagedDict (PyObject *obj)

Clear the managed dictionary of `obj'.

This function must only be called in a clear function of the type which
has the @ref{60d,,Py_TPFLAGS_MANAGED_DICT} flag set.


Added in version 3.13.

@end deffn

@geindex PyUnstable_Object_EnableDeferredRefcount (C function)
@anchor{c-api/object c PyUnstable_Object_EnableDeferredRefcount}@anchor{3c5}
@deffn {C 함수} int PyUnstable_Object_EnableDeferredRefcount (PyObject *obj)

@cartouche
@quotation 이것은 불안정 API. It may change without warning in minor releases. `이것은 @ref{768,,불안정 API}. It may change without warning in minor releases.'
@end quotation
@end cartouche

Enable deferred reference counting@footnote{https://peps.python.org/pep-0703/#deferred-reference-counting} on `obj',
if supported by the runtime.  In the @ref{1f4,,free-threaded} build,
this allows the interpreter to avoid reference count adjustments to `obj',
which may improve multi-threaded performance.  The tradeoff is
that `obj' will only be deallocated by the tracing garbage collector, and
not when the interpreter no longer has any references to it.

This function returns @code{1} if deferred reference counting is enabled on `obj',
and @code{0} if deferred reference counting is not supported or if the hint was
ignored by the interpreter, such as when deferred reference counting is already
enabled on `obj'. This function is thread-safe, and cannot fail.

This function does nothing on builds with the @ref{164,,GIL} enabled, which do
not support deferred reference counting. This also does nothing if `obj' is not
an object tracked by the garbage collector (see @ref{1512,,gc.is_tracked()} and
@ref{b6d,,PyObject_GC_IsTracked()}).

This function is intended to be used soon after `obj' is created,
by the code that creates it, such as in the object’s @ref{79e,,tp_new}
slot.


Added in version 3.14.

@end deffn

@geindex PyUnstable_Object_IsUniqueReferencedTemporary (C function)
@anchor{c-api/object c PyUnstable_Object_IsUniqueReferencedTemporary}@anchor{3c7}
@deffn {C 함수} int PyUnstable_Object_IsUniqueReferencedTemporary (PyObject *obj)

@cartouche
@quotation 이것은 불안정 API. It may change without warning in minor releases. `이것은 @ref{768,,불안정 API}. It may change without warning in minor releases.'
@end quotation
@end cartouche

Check if `obj' is a unique temporary object.
Returns @code{1} if `obj' is known to be a unique temporary object,
and @code{0} otherwise.  This function cannot fail, but the check is
conservative, and may return @code{0} in some cases even if `obj' is a unique
temporary object.

If an object is a unique temporary, it is guaranteed that the current code
has the only reference to the object. For arguments to C functions, this
should be used instead of checking if the reference count is @code{1}. Starting
with Python 3.14, the interpreter internally avoids some reference count
modifications when loading objects onto the operands stack by
@ref{3d7,,borrowing} references when possible, which means
that a reference count of @code{1} by itself does not guarantee that a function
argument uniquely referenced.

In the example below, @code{my_func} is called with a unique temporary object
as its argument:

@example
my_func([1, 2, 3])
@end example

In the example below, @code{my_func} is `not' called with a unique temporary
object as its argument, even if its refcount is @code{1}:

@example
my_list = [1, 2, 3]
my_func(my_list)
@end example

See also the function @ref{2cf,,Py_REFCNT()}.


Added in version 3.14.

@end deffn

@geindex PyUnstable_IsImmortal (C function)
@anchor{c-api/object c PyUnstable_IsImmortal}@anchor{3c4}
@deffn {C 함수} int PyUnstable_IsImmortal (PyObject *obj)

@cartouche
@quotation 이것은 불안정 API. It may change without warning in minor releases. `이것은 @ref{768,,불안정 API}. It may change without warning in minor releases.'
@end quotation
@end cartouche

This function returns non-zero if `obj' is @ref{290,,immortal}, and zero
otherwise. This function cannot fail.

@cartouche
@quotation 참고 
Objects that are immortal in one CPython version are not guaranteed to
be immortal in another.
@end quotation
@end cartouche


Added in version 3.14.

@end deffn

@geindex PyUnstable_TryIncRef (C function)
@anchor{c-api/object c PyUnstable_TryIncRef}@anchor{18ca}
@deffn {C 함수} int PyUnstable_TryIncRef (PyObject *obj)

@cartouche
@quotation 이것은 불안정 API. It may change without warning in minor releases. `이것은 @ref{768,,불안정 API}. It may change without warning in minor releases.'
@end quotation
@end cartouche

Increments the reference count of `obj' if it is not zero.  Returns @code{1}
if the object’s reference count was successfully incremented. Otherwise,
this function returns @code{0}.

@ref{18cb,,PyUnstable_EnableTryIncRef()} must have been called
earlier on `obj' or this function may spuriously return @code{0} in the
@ref{1767,,free-threaded build}.

This function is logically equivalent to the following C code, except that
it behaves atomically in the @ref{1767,,free-threaded build}:

@example
if (Py_REFCNT(op) > 0) @{
   Py_INCREF(op);
   return 1;
@}
return 0;
@end example

This is intended as a building block for managing weak references
without the overhead of a Python @ref{52ce,,weak reference object}.

Typically, correct use of this function requires support from `obj'’s
deallocator (@ref{4efb,,tp_dealloc}).
For example, the following sketch could be adapted to implement a
“weakmap” that works like a @ref{192b,,WeakValueDictionary}
for a specific type:

@example
PyMutex mutex;

PyObject *
add_entry(weakmap_key_type *key, PyObject *value)
@{
    PyUnstable_EnableTryIncRef(value);
    weakmap_type weakmap = ...;
    PyMutex_Lock(&mutex);
    weakmap_add_entry(weakmap, key, value);
    PyMutex_Unlock(&mutex);
    Py_RETURN_NONE;
@}

PyObject *
get_value(weakmap_key_type *key)
@{
    weakmap_type weakmap = ...;
    PyMutex_Lock(&mutex);
    PyObject *result = weakmap_find(weakmap, key);
    if (PyUnstable_TryIncRef(result)) @{
        // `result` is safe to use
        PyMutex_Unlock(&mutex);
        return result;
    @}
    // if we get here, `result` is starting to be garbage-collected,
    // but has not been removed from the weakmap yet
    PyMutex_Unlock(&mutex);
    return NULL;
@}

// tp_dealloc function for weakmap values
void
value_dealloc(PyObject *value)
@{
    weakmap_type weakmap = ...;
    PyMutex_Lock(&mutex);
    weakmap_remove_value(weakmap, value);

    ...
    PyMutex_Unlock(&mutex);
@}
@end example


Added in version 3.14.

@end deffn

@geindex PyUnstable_EnableTryIncRef (C function)
@anchor{c-api/object c PyUnstable_EnableTryIncRef}@anchor{18cb}
@deffn {C 함수} void PyUnstable_EnableTryIncRef (PyObject *obj)

@cartouche
@quotation 이것은 불안정 API. It may change without warning in minor releases. `이것은 @ref{768,,불안정 API}. It may change without warning in minor releases.'
@end quotation
@end cartouche

Enables subsequent uses of @ref{18ca,,PyUnstable_TryIncRef()} on `obj'.  The
caller must hold a @ref{5df,,strong reference} to `obj' when calling this.


Added in version 3.14.

@end deffn

@geindex PyUnstable_Object_IsUniquelyReferenced (C function)
@anchor{c-api/object c PyUnstable_Object_IsUniquelyReferenced}@anchor{3c6}
@deffn {C 함수} int PyUnstable_Object_IsUniquelyReferenced (PyObject *op)

@cartouche
@quotation 이것은 불안정 API. It may change without warning in minor releases. `이것은 @ref{768,,불안정 API}. It may change without warning in minor releases.'
@end quotation
@end cartouche

Determine if `op' only has one reference.

On GIL-enabled builds, this function is equivalent to
@ref{2cf,,Py_REFCNT}(@ref{3c6,,op}) == 1.

On a @ref{1767,,free-threaded build}, this checks if `op'’s
@ref{4f08,,reference count} is equal to one and additionally checks if `op'
is only used by this thread. @ref{2cf,,Py_REFCNT}(@ref{3c6,,op}) == 1 is `not'
thread-safe on free-threaded builds; prefer this function.

The caller must hold an @ref{4f10,,attached thread state}, despite the fact
that this function doesn’t call into the Python interpreter. This function
cannot fail.


Added in version 3.14.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 호출 프로토콜,숫자 프로토콜,객체 프로토콜,추상 객체 계층
@anchor{c-api/call doc}@anchor{52cf}@anchor{c-api/call call}@anchor{7a2}@anchor{c-api/call call-protocol}@anchor{52d0}@anchor{c-api/call translation-repo}@anchor{52d1}
@subsection 호출 프로토콜


CPython은 두 가지 호출 프로토콜을 지원합니다: `tp_call'과 벡터콜(vectorcall).

@menu
* tp_call 프로토콜:: 
* 벡터콜(Vectorcall) 프로토콜: 벡터콜 Vectorcall 프로토콜. 
* 객체 호출 API:: 
* 호출 지원 API:: 

@end menu

@node tp_call 프로토콜,벡터콜 Vectorcall 프로토콜,,호출 프로토콜
@anchor{c-api/call the-tp-call-protocol}@anchor{52d2}
@subsubsection `tp_call' 프로토콜


@ref{77a,,tp_call}을 설정하는 클래스의 인스턴스는 콜러블입니다. 슬롯의 서명은 다음과 같습니다:

@example
PyObject *tp_call(PyObject *callable, PyObject *args, PyObject *kwargs);
@end example

파이썬 코드의 @code{callable(*args, **kwargs)} 와 유사하게, 위치 인자를 위한 튜플과 키워드 인자를 위한 딕셔너리를 사용하여 호출합니다. `args'는 NULL이 아니어야 합니다 (인자가 없으면 빈 튜플을 사용하십시오). 하지만 키워드 인자가 없으면 `kwargs'는 `NULL'일 수 있습니다.

이 규칙은 `tp_call'에서만 사용되는 것이 아닙니다: @ref{79e,,tp_new}와 @ref{7a0,,tp_init}도 인자를 이런 식으로 전달합니다.

객체를 호출하려면, @ref{63b,,PyObject_Call()}이나 다른 @ref{52d3,,호출 API}를 사용하십시오.

@node 벡터콜 Vectorcall 프로토콜,객체 호출 API,tp_call 프로토콜,호출 프로토콜
@anchor{c-api/call the-vectorcall-protocol}@anchor{52d4}@anchor{c-api/call vectorcall}@anchor{773}
@subsubsection 벡터콜(Vectorcall) 프로토콜



Added in version 3.9.


벡터콜 프로토콜은 
@geindex Python 향상 제안; PEP 590
PEP 590@footnote{https://peps.python.org/pep-0590/}에서 호출 효율을 높이기 위한 추가 프로토콜로 도입되었습니다.

경험 규칙으로, CPython은 콜러블이 지원하면 내부 호출에 대해 벡터콜을 선호합니다. 그러나 이것은 엄격한 규칙이 아닙니다. 또한, 일부 제삼자 확장은 (@code{PyObject_call()}을 사용하지 않고) `tp_call'을 직접 사용합니다. 따라서, 벡터콜을 지원하는 클래스도 @ref{77a,,tp_call}을 구현해야 합니다. 또한, 어떤 프로토콜을 사용하는지와 관계없이 콜러블은 동일하게 작동해야 합니다. 이를 위해 권장되는 방법은 @code{tp_call}을 @ref{777,,PyVectorcall_Call()}로 설정하는 것입니다. 이것이 반복을 처리합니다:

@cartouche
@quotation 경고 
벡터콜을 지원하는 클래스도 같은 의미가 있도록 @ref{77a,,tp_call}을 `반드시' 구현해야 합니다.
@end quotation
@end cartouche


버전 3.12에서 변경: The @ref{775,,Py_TPFLAGS_HAVE_VECTORCALL} flag is now removed from a class
when the class’s @ref{779,,__call__()} method is reassigned.
(This internally sets @ref{77a,,tp_call} only, and thus
may make it behave differently than the vectorcall function.)
In earlier Python versions, vectorcall should only be used with
@ref{3cf,,immutable} or static types.


`tp_call'보다 느려진다면 클래스는 벡터콜을 구현해서는 안 됩니다. 예를 들어, 피호출자가 어차피 인자를 인자 튜플과 kwargs 딕셔너리로 변환해야 하면, 벡터콜을 구현할 이유가 없습니다.

클래스는 @ref{775,,Py_TPFLAGS_HAVE_VECTORCALL} 플래그를 활성화하고 @ref{52d5,,tp_vectorcall_offset}을 `vectorcallfunc' 가 등장하는 객체 구조체 내부의 오프셋으로 설정하여 벡터콜 프로토콜을 구현할 수 있습니다. 이것은 다음과 같은 서명을 갖는 함수를 가리키는 포인터입니다:

@geindex vectorcallfunc (C type)
@anchor{c-api/call c vectorcallfunc}@anchor{778}
@deffn {C 자료형} typedef @ref{5dc,,PyObject} *(*vectorcallfunc)(@ref{5dc,,PyObject} *callable, @ref{5dc,,PyObject} *const *args, size_t nargsf, @ref{5dc,,PyObject} *kwnames)
` Part of the @ref{774,,안정 ABI} 버전 3.12 이후로.'
@end deffn


@itemize -

@item 
`callable'은 호출되는 객체입니다.

@item 

@table @asis

@item `args'는 위치 인자와 그 뒤를 따르는 키워드 인자의 값으로 구성된 C 배열입니다.

인자가 없으면 `NULL'일 수 있습니다.
@end table

@item 

@table @asis

@item `nargsf'는 위치 인자의 수에

@ref{77f,,PY_VECTORCALL_ARGUMENTS_OFFSET} 플래그를 더한 것입니다. `nargsf'에서 실제 위치 인자 수를 얻으려면, @ref{776,,PyVectorcall_NARGS()}를 사용하십시오.
@end table

@item 

@table @asis

@item `kwnames'는 키워드 인자의 이름을 포함하는 튜플입니다;

다시 말해, kwargs 딕셔너리의 키. 이 이름들은 문자열(@code{str}이나 서브 클래스의 인스턴스)이어야하며 고유해야 합니다. 키워드 인자가 없으면, `kwnames'는 대신 `NULL'일 수 있습니다.
@end table
@end itemize

@geindex PY_VECTORCALL_ARGUMENTS_OFFSET (C macro)
@anchor{c-api/call c PY_VECTORCALL_ARGUMENTS_OFFSET}@anchor{77f}
@deffn {C 매크로} PY_VECTORCALL_ARGUMENTS_OFFSET
` Part of the @ref{774,,안정 ABI} 버전 3.12 이후로.'
이 플래그가 벡터콜 `nargsf' 인자에 설정되면, 피호출자는 일시적으로 @code{args[-1]}을 변경할 수 있습니다. 즉, `args'는 할당된 벡터에서 인자 1(0이 아닙니다)을 가리킵니다. 피호출자는 반환하기 전에 @code{args[-1]} 값을 복원해야 합니다.

@ref{77e,,PyObject_VectorcallMethod()} 의 경우, 이 플래그는 대신 @code{args[0]}이 변경될 수 있음을 의미합니다.

(추가 할당 없이) 저렴하게 할 수 있을 때마다, 호출자는 @ref{77f,,PY_VECTORCALL_ARGUMENTS_OFFSET}을 사용하는 것이 좋습니다. 이렇게 하면 연결된 메서드와 같은 콜러블이 후속 호출(앞에 `self' 인자를 포함하는)을 매우 효율적으로 만들 수 있습니다.


Added in version 3.8.

@end deffn

벡터콜을 구현하는 객체를 호출하려면, 다른 콜러블과 마찬가지로 @ref{52d3,,호출 API} 함수를 사용하십시오. @ref{77d,,PyObject_Vectorcall()}은 일반적으로 가장 효율적입니다.

@menu
* 재귀 제어: 재귀 제어<2>. 
* 벡터콜 지원 API:: 

@end menu

@node 재귀 제어<2>,벡터콜 지원 API,,벡터콜 Vectorcall 프로토콜
@anchor{c-api/call recursion-control}@anchor{52d6}
@subsubsection 재귀 제어


`tp_call'을 사용할 때, 피호출자는 @ref{523e,,재귀}에 대해 걱정할 필요가 없습니다: CPython은 `tp_call'을 사용하여 호출한 경우 @ref{3d2,,Py_EnterRecursiveCall()} 과 @ref{b6b,,Py_LeaveRecursiveCall()} 을 사용합니다.

효율성을 위해, 벡터콜을 사용하여 호출한 경우에는 그렇지 않습니다: 피호출자는 필요하면 `Py_EnterRecursiveCall' 과 `Py_LeaveRecursiveCall' 을 사용해야 합니다.

@node 벡터콜 지원 API,,재귀 제어<2>,벡터콜 Vectorcall 프로토콜
@anchor{c-api/call vectorcall-support-api}@anchor{52d7}
@subsubsection 벡터콜 지원 API


@geindex PyVectorcall_NARGS (C function)
@anchor{c-api/call c PyVectorcall_NARGS}@anchor{776}
@deffn {C 함수} @ref{c54,,Py_ssize_t} PyVectorcall_NARGS (size_t nargsf)
` Part of the @ref{774,,안정 ABI} 버전 3.12 이후로.'
벡터콜 `nargsf' 인자가 주어지면, 실제 인자 수를 반환합니다. 현재 다음과 동등합니다:

@example
(Py_ssize_t)(nargsf & ~PY_VECTORCALL_ARGUMENTS_OFFSET)
@end example

그러나, 향후 확장을 위해 @code{PyVectorcall_NARGS} 함수를 사용해야 합니다.


Added in version 3.8.

@end deffn

@geindex PyVectorcall_Function (C function)
@anchor{c-api/call c PyVectorcall_Function}@anchor{52d8}
@deffn {C 함수} @ref{778,,vectorcallfunc} PyVectorcall_Function (PyObject *op)

`op'가 벡터콜 프로토콜을 지원하지 않으면 (형이 지원하지 않거나 인스턴스가 지원하지 않기 때문에), `NULL'을 반환합니다. 그렇지 않으면, `op'에 저장된 벡터콜 함수 포인터를 반환합니다. 이 함수는 예외를 발생시키지 않습니다.

이것은 `op'가 벡터콜을 지원하는지를 확인하는 데 주로 유용하며, @code{PyVectorcall_Function(op) != NULL}을 확인하여 수행 할 수 있습니다.


Added in version 3.9.

@end deffn

@geindex PyVectorcall_Call (C function)
@anchor{c-api/call c PyVectorcall_Call}@anchor{777}
@deffn {C 함수} @ref{5dc,,PyObject} *PyVectorcall_Call (PyObject *callable, PyObject *tuple, PyObject *dict)
` Part of the @ref{774,,안정 ABI} 버전 3.12 이후로.'
튜플과 딕셔너리에 각각 주어진 위치와 키워드 인자로 `callable'의 @ref{778,,vectorcallfunc} 를 호출합니다.

이것은 @ref{77a,,tp_call} 슬롯에 넣거나 @code{tp_call} 구현에 사용하기 위한 특수 함수입니다. @ref{775,,Py_TPFLAGS_HAVE_VECTORCALL} 플래그를 확인하지 않고 @code{tp_call}로 폴 백하지 않습니다.


Added in version 3.8.

@end deffn

@node 객체 호출 API,호출 지원 API,벡터콜 Vectorcall 프로토콜,호출 프로토콜
@anchor{c-api/call capi-call}@anchor{52d3}@anchor{c-api/call object-calling-api}@anchor{52d9}
@subsubsection 객체 호출 API


파이썬 객체를 호출하기 위해 다양한 함수를 사용할 수 있습니다. 각각은 인자를 호출된 객체가 지원하는 규칙으로 변환합니다 - `tp_call' 또는 벡터콜. 가능한 한 적은 변환을 수행하려면, 사용 가능한 데이터 형식에 가장 적합한 것을 선택하십시오.

다음 표는 사용 가능한 함수를 요약한 것입니다; 자세한 내용은 개별 설명서를 참조하십시오.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxx} 
@headitem

함수

@tab

콜러블

@tab

args

@tab

kwargs

@item

@ref{63b,,PyObject_Call()}

@tab

@code{PyObject *}

@tab

튜플

@tab

딕셔너리/@code{NULL}

@item

@ref{63a,,PyObject_CallNoArgs()}

@tab

@code{PyObject *}

@tab

—

@tab

—

@item

@ref{b6f,,PyObject_CallOneArg()}

@tab

@code{PyObject *}

@tab

1 객체

@tab

—

@item

@ref{4eeb,,PyObject_CallObject()}

@tab

@code{PyObject *}

@tab

튜플/@code{NULL}

@tab

—

@item

@ref{63d,,PyObject_CallFunction()}

@tab

@code{PyObject *}

@tab

포맷(format)

@tab

—

@item

@ref{63e,,PyObject_CallMethod()}

@tab

obj + @code{char*}

@tab

포맷(format)

@tab

—

@item

@ref{50c9,,PyObject_CallFunctionObjArgs()}

@tab

@code{PyObject *}

@tab

가변(variadic)

@tab

—

@item

@ref{1ddc,,PyObject_CallMethodObjArgs()}

@tab

obj + name

@tab

가변(variadic)

@tab

—

@item

@ref{52da,,PyObject_CallMethodNoArgs()}

@tab

obj + name

@tab

—

@tab

—

@item

@ref{52db,,PyObject_CallMethodOneArg()}

@tab

obj + name

@tab

1 객체

@tab

—

@item

@ref{77d,,PyObject_Vectorcall()}

@tab

@code{PyObject *}

@tab

벡터콜

@tab

벡터콜

@item

@ref{52dc,,PyObject_VectorcallDict()}

@tab

@code{PyObject *}

@tab

벡터콜

@tab

딕셔너리/@code{NULL}

@item

@ref{77e,,PyObject_VectorcallMethod()}

@tab

arg + name

@tab

벡터콜

@tab

벡터콜

@end multitable


@geindex PyObject_Call (C function)
@anchor{c-api/call c PyObject_Call}@anchor{63b}
@deffn {C 함수} @ref{5dc,,PyObject} *PyObject_Call (PyObject *callable, PyObject *args, PyObject *kwargs)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
튜플 `args'로 주어진 인자와 딕셔너리 `kwargs'로 주어진 이름있는 인자로 콜러블 파이썬 객체 `callable'을 호출합니다.

`args'는 `NULL'이 아니어야 합니다ㅣ 인자가 필요 없으면 빈 튜플을 사용하십시오. 이름있는 인자가 필요하지 않으면, `kwargs'는 `NULL'일 수 있습니다.

성공하면 호출 결과를 반환하고, 실패하면 예외를 발생시키고 `NULL'을 반환합니다.

이것은 다음 파이썬 표현식과 동등합니다: @code{callable(*args, **kwargs)}.
@end deffn

@geindex PyObject_CallNoArgs (C function)
@anchor{c-api/call c PyObject_CallNoArgs}@anchor{63a}
@deffn {C 함수} @ref{5dc,,PyObject} *PyObject_CallNoArgs (PyObject *callable)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI} 버전 3.10 이후로.'
인자 없이 콜러블 파이썬 객체 `callable'을 호출합니다. 인자 없이 콜러블 파이썬 객체를 호출하는 가장 효율적인 방법입니다.

성공하면 호출 결과를 반환하고, 실패하면 예외를 발생시키고 `NULL'을 반환합니다.


Added in version 3.9.

@end deffn

@geindex PyObject_CallOneArg (C function)
@anchor{c-api/call c PyObject_CallOneArg}@anchor{b6f}
@deffn {C 함수} @ref{5dc,,PyObject} *PyObject_CallOneArg (PyObject *callable, PyObject *arg)
`반환값: 새 참조.'
정확히 1개의 위치 인자 `arg'로 키워드 인자 없이 콜러블 파이썬 객체 `callable'을 호출합니다.

성공하면 호출 결과를 반환하고, 실패하면 예외를 발생시키고 `NULL'을 반환합니다.


Added in version 3.9.

@end deffn

@geindex PyObject_CallObject (C function)
@anchor{c-api/call c PyObject_CallObject}@anchor{4eeb}
@deffn {C 함수} @ref{5dc,,PyObject} *PyObject_CallObject (PyObject *callable, PyObject *args)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
튜플 `args'에 의해 주어진 인자로 콜러블 파이썬 객체 `callable'을 호출합니다. 인자가 필요하지 않으면 `args'는 `NULL'일 수 있습니다.

성공하면 호출 결과를 반환하고, 실패하면 예외를 발생시키고 `NULL'을 반환합니다.

이것은 다음 파이썬 표현식과 동등합니다: @code{callable(*args)}.
@end deffn

@geindex PyObject_CallFunction (C function)
@anchor{c-api/call c PyObject_CallFunction}@anchor{63d}
@deffn {C 함수} @ref{5dc,,PyObject} *PyObject_CallFunction (PyObject *callable, const char *format, ...)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
가변 개수의 C 인자로 콜러블 파이썬 객체 `callable'을 호출합니다. C 인자는 @ref{3c2,,Py_BuildValue()} 스타일 포맷 문자열을 사용하여 기술됩니다. format은 `NULL'일 수 있으며, 인자가 제공되지 않음을 나타냅니다.

성공하면 호출 결과를 반환하고, 실패하면 예외를 발생시키고 `NULL'을 반환합니다.

이것은 다음 파이썬 표현식과 동등합니다: @code{callable(*args)}.

@ref{5dc,,PyObject}* 인자만 전달한다면 @ref{50c9,,PyObject_CallFunctionObjArgs()} 가 더 빠른 대안임에 유의하십시오.


버전 3.4에서 변경: `format'의 형이 @code{char *}에서 변경되었습니다.

@end deffn

@geindex PyObject_CallMethod (C function)
@anchor{c-api/call c PyObject_CallMethod}@anchor{63e}
@deffn {C 함수} @ref{5dc,,PyObject} *PyObject_CallMethod (PyObject *obj, const char *name, const char *format, ...)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
가변 개수의 C 인자를 사용하여 객체 `obj'의 `name'이라는 이름의 메서드를 호출합니다. C 인자는 튜플을 생성해야 하는 @ref{3c2,,Py_BuildValue()} 포맷 문자열로 기술됩니다.

format은 `NULL'일 수 있으며, 인자가 제공되지 않음을 나타냅니다.

성공하면 호출 결과를 반환하고, 실패하면 예외를 발생시키고 `NULL'을 반환합니다.

이것은 다음 파이썬 표현식과 동등합니다: @code{obj.name(arg1, arg2, ...)}.

@ref{5dc,,PyObject}* 인자만 전달한다면 @ref{1ddc,,PyObject_CallMethodObjArgs()} 가 더 빠른 대안임에 유의하십시오.


버전 3.4에서 변경: `name'과 `format'의 형이 @code{char *}에서 변경되었습니다.

@end deffn

@geindex PyObject_CallFunctionObjArgs (C function)
@anchor{c-api/call c PyObject_CallFunctionObjArgs}@anchor{50c9}
@deffn {C 함수} @ref{5dc,,PyObject} *PyObject_CallFunctionObjArgs (PyObject *callable, ...)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
가변 개수의 @ref{5dc,,PyObject}* 인자로 콜러블 파이썬 객체 `callable'을 호출합니다. 인자는 `NULL'로 끝나는 가변 개수의 매개 변수로 제공됩니다.

성공하면 호출 결과를 반환하고, 실패하면 예외를 발생시키고 `NULL'을 반환합니다.

이것은 다음 파이썬 표현식과 동등합니다: @code{callable(arg1, arg2, ...)}.
@end deffn

@geindex PyObject_CallMethodObjArgs (C function)
@anchor{c-api/call c PyObject_CallMethodObjArgs}@anchor{1ddc}
@deffn {C 함수} @ref{5dc,,PyObject} *PyObject_CallMethodObjArgs (PyObject *obj, PyObject *name, ...)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
파이썬 객체 `obj'의 메서드를 호출합니다. 여기서 메서드 이름은 `name'에서 파이썬 문자열 객체로 제공됩니다. 가변 개수의 @ref{5dc,,PyObject}* 인자로 호출됩니다. 인자는 `NULL'로 끝나는 가변 개수의 매개 변수로 제공됩니다.

성공하면 호출 결과를 반환하고, 실패하면 예외를 발생시키고 `NULL'을 반환합니다.
@end deffn

@geindex PyObject_CallMethodNoArgs (C function)
@anchor{c-api/call c PyObject_CallMethodNoArgs}@anchor{52da}
@deffn {C 함수} @ref{5dc,,PyObject} *PyObject_CallMethodNoArgs (PyObject *obj, PyObject *name)

인자 없이 파이썬 객체 `obj'의 메서드를 호출합니다. 여기서 메서드 이름은 `name'에서 파이썬 문자열 객체로 제공됩니다.

성공하면 호출 결과를 반환하고, 실패하면 예외를 발생시키고 `NULL'을 반환합니다.


Added in version 3.9.

@end deffn

@geindex PyObject_CallMethodOneArg (C function)
@anchor{c-api/call c PyObject_CallMethodOneArg}@anchor{52db}
@deffn {C 함수} @ref{5dc,,PyObject} *PyObject_CallMethodOneArg (PyObject *obj, PyObject *name, PyObject *arg)

단일 위치 인자 `arg'로 파이썬 객체 `obj'의 메서드를 호출합니다. 여기서 메서드 이름은 `name'에서 파이썬 문자열 객체로 제공됩니다.

성공하면 호출 결과를 반환하고, 실패하면 예외를 발생시키고 `NULL'을 반환합니다.


Added in version 3.9.

@end deffn

@geindex _PyObject_Vectorcall (C function)

@geindex PyObject_Vectorcall (C function)
@anchor{c-api/call c _PyObject_Vectorcall}@anchor{52dd}@anchor{c-api/call c PyObject_Vectorcall}@anchor{77d}
@deffn {C 함수} @ref{5dc,,PyObject} *PyObject_Vectorcall (PyObject *callable, PyObject *const *args, size_t nargsf, PyObject *kwnames)
` Part of the @ref{774,,안정 ABI} 버전 3.12 이후로.'
콜러블 파이썬 객체 `callable'을 호출합니다. 인자는 @ref{778,,vectorcallfunc} 와 같습니다. `callable'이 @ref{773,,벡터콜}을 지원하면, `callable'에 저장된 벡터콜 함수를 직접 호출합니다.

성공하면 호출 결과를 반환하고, 실패하면 예외를 발생시키고 `NULL'을 반환합니다.


Added in version 3.8: as @code{_PyObject_Vectorcall}



버전 3.9에서 변경: Renamed to the current name, without the leading underscore.
The old provisional name is @ref{23d,,soft deprecated}.

@end deffn

@geindex PyObject_VectorcallDict (C function)
@anchor{c-api/call c PyObject_VectorcallDict}@anchor{52dc}
@deffn {C 함수} @ref{5dc,,PyObject} *PyObject_VectorcallDict (PyObject *callable, PyObject *const *args, size_t nargsf, PyObject *kwdict)

위치 인자가 @ref{773,,벡터콜} 프로토콜과 정확히 일치하지만 딕셔너리 `kwdict'로 전달된 키워드 인자로 `callable'을 호출합니다. `args' 배열은 위치 인자만 포함합니다.

내부적으로 사용되는 프로토콜과 관계없이, 인자를 변환해야 합니다. 따라서, 이 함수는 호출자에게 이미 키워드 인자로 사용할 준비가 된 딕셔너리가 있지만, 위치 인자에 대한 튜플이 없을 때만 사용해야 합니다.


Added in version 3.9.

@end deffn

@geindex PyObject_VectorcallMethod (C function)
@anchor{c-api/call c PyObject_VectorcallMethod}@anchor{77e}
@deffn {C 함수} @ref{5dc,,PyObject} *PyObject_VectorcallMethod (PyObject *name, PyObject *const *args, size_t nargsf, PyObject *kwnames)
` Part of the @ref{774,,안정 ABI} 버전 3.12 이후로.'
벡터콜 호출 규칙을 사용하여 메서드를 호출합니다. 메서드 이름은 파이썬 문자열 `name'으로 제공됩니다. 메서드가 호출되는 객체는 `args[0]'이며, `args[1]'에서 시작하는 `args' 배열은 호출의 인자를 나타냅니다. 하나 이상의 위치 인자가 있어야 합니다. `nargsf'는 `args[0]'을 포함한 위치 인자의 수이며, @code{args[0]} 값이 일시적으로 변경될 수 있으면 @ref{77f,,PY_VECTORCALL_ARGUMENTS_OFFSET}이 더해집니다. 키워드 인자는 @ref{77d,,PyObject_Vectorcall()}에서처럼 전달될 수 있습니다.

객체에 @ref{5177,,Py_TPFLAGS_METHOD_DESCRIPTOR} 기능이 있으면, 전체 `args' 벡터를 인자로 연결되지 않은 메서드 객체를 호출합니다.

성공하면 호출 결과를 반환하고, 실패하면 예외를 발생시키고 `NULL'을 반환합니다.


Added in version 3.9.

@end deffn

@node 호출 지원 API,,객체 호출 API,호출 프로토콜
@anchor{c-api/call call-support-api}@anchor{52de}
@subsubsection 호출 지원 API


@geindex PyCallable_Check (C function)
@anchor{c-api/call c PyCallable_Check}@anchor{4fd1}
@deffn {C 함수} int PyCallable_Check (PyObject *o)
` Part of the @ref{774,,안정 ABI}.'
객체 `o'가 콜러블 인지 판별합니다. 객체가 콜러블 이면 @code{1}을, 그렇지 않으면 @code{0}을 반환합니다. 이 함수는 항상 성공합니다.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 숫자 프로토콜,시퀀스 프로토콜,호출 프로토콜,추상 객체 계층
@anchor{c-api/number doc}@anchor{52df}@anchor{c-api/number number}@anchor{52e0}@anchor{c-api/number number-protocol}@anchor{52e1}@anchor{c-api/number translation-repo}@anchor{52e2}
@subsection 숫자 프로토콜


@geindex PyNumber_Check (C function)
@anchor{c-api/number c PyNumber_Check}@anchor{c5b}
@deffn {C 함수} int PyNumber_Check (PyObject *o)
` Part of the @ref{774,,안정 ABI}.'
객체 `o'가 숫자 프로토콜을 제공하면 @code{1}을 반환하고, 그렇지 않으면 거짓을 반환합니다. 이 함수는 항상 성공합니다.


버전 3.8에서 변경: `o'가 인덱스 정수면 @code{1}을 반환합니다.

@end deffn

@geindex PyNumber_Add (C function)
@anchor{c-api/number c PyNumber_Add}@anchor{50a5}
@deffn {C 함수} @ref{5dc,,PyObject} *PyNumber_Add (PyObject *o1, PyObject *o2)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
`o1'과 `o2'를 더한 결과나, 실패 시 @code{NULL}을 반환합니다. 이것은 파이썬 표현식 @code{o1 + o2}와 동등합니다.
@end deffn

@geindex PyNumber_Subtract (C function)
@anchor{c-api/number c PyNumber_Subtract}@anchor{50bf}
@deffn {C 함수} @ref{5dc,,PyObject} *PyNumber_Subtract (PyObject *o1, PyObject *o2)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
`o1'에서 `o2'를 뺀 결과나, 실패 시 @code{NULL}을 반환합니다. 이것은 파이썬 표현식 @code{o1 - o2}와 동등합니다.
@end deffn

@geindex PyNumber_Multiply (C function)
@anchor{c-api/number c PyNumber_Multiply}@anchor{50b8}
@deffn {C 함수} @ref{5dc,,PyObject} *PyNumber_Multiply (PyObject *o1, PyObject *o2)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
`o1'과 `o2'를 곱한 결과나, 실패 시 @code{NULL}을 반환합니다. 이것은 파이썬 표현식 @code{o1 * o2}와 동등합니다.
@end deffn

@geindex PyNumber_MatrixMultiply (C function)
@anchor{c-api/number c PyNumber_MatrixMultiply}@anchor{10b5}
@deffn {C 함수} @ref{5dc,,PyObject} *PyNumber_MatrixMultiply (PyObject *o1, PyObject *o2)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI} 버전 3.7 이후로.'
`o1'과 `o2'를 행렬 곱셈한 결과나, 실패 시 @code{NULL}을 반환합니다. 이것은 파이썬 표현식 @code{o1 @@ o2}와 동등합니다.


Added in version 3.5.

@end deffn

@geindex PyNumber_FloorDivide (C function)
@anchor{c-api/number c PyNumber_FloorDivide}@anchor{50a9}
@deffn {C 함수} @ref{5dc,,PyObject} *PyNumber_FloorDivide (PyObject *o1, PyObject *o2)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
`o1'을 `o2'로 정수 나눗셈한 몫을, 실패 시 @code{NULL}을 반환합니다. 이것은 파이썬 표현식 @code{o1 // o2}와 동등합니다.
@end deffn

@geindex PyNumber_TrueDivide (C function)
@anchor{c-api/number c PyNumber_TrueDivide}@anchor{50c0}
@deffn {C 함수} @ref{5dc,,PyObject} *PyNumber_TrueDivide (PyObject *o1, PyObject *o2)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
`o1'을 `o2'로 나눈 수학적 값의 적절한 근삿값이나, 실패 시 @code{NULL}을 반환합니다. 반환 값은 “근사치” 인데, 이진 부동 소수점 수가 근사치이기 때문입니다; 이진수로 모든 실수를 표현할 수는 없습니다. 이 함수는 두 개의 정수를 전달할 때 부동 소수점 수를 반환할 수 있습니다.
@end deffn

@geindex PyNumber_Remainder (C function)
@anchor{c-api/number c PyNumber_Remainder}@anchor{50bd}
@deffn {C 함수} @ref{5dc,,PyObject} *PyNumber_Remainder (PyObject *o1, PyObject *o2)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
`o1'을 `o2'로 나눈 나머지나, 실패 시 @code{NULL}을 반환합니다. 이것은 파이썬 표현식 @code{o1 % o2}와 동등합니다.
@end deffn

@geindex PyNumber_Divmod (C function)
@anchor{c-api/number c PyNumber_Divmod}@anchor{50a8}
@deffn {C 함수} @ref{5dc,,PyObject} *PyNumber_Divmod (PyObject *o1, PyObject *o2)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
@geindex 내장 함수;divmod

내장 함수 @ref{b98,,divmod()}를 참조하십시오. 실패하면 @code{NULL}을 반환합니다. 이것은 파이썬 표현식 @code{divmod(o1, o2)}와 동등합니다.
@end deffn

@geindex PyNumber_Power (C function)
@anchor{c-api/number c PyNumber_Power}@anchor{50bc}
@deffn {C 함수} @ref{5dc,,PyObject} *PyNumber_Power (PyObject *o1, PyObject *o2, PyObject *o3)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
@geindex 내장 함수;pow

내장 함수 @ref{1a4,,pow()}를 참조하십시오. 실패하면 @code{NULL}을 반환합니다. 이것은 파이썬 표현식 @code{pow(o1, o2, o3)}와 동등합니다, 여기서 `o3'는 선택적입니다. `o3'를 무시하려면, 그 자리에 @ref{4ede,,Py_None}을 전달하십시오 (`o3'에 @code{NULL}을 전달하면 잘못된 메모리 액세스가 발생합니다).
@end deffn

@geindex PyNumber_Negative (C function)
@anchor{c-api/number c PyNumber_Negative}@anchor{50b9}
@deffn {C 함수} @ref{5dc,,PyObject} *PyNumber_Negative (PyObject *o)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
성공 시 `o'의 음의 값(negation)을, 실패 시 @code{NULL}을 반환합니다. 이것은 파이썬 표현식 @code{-o}와 동등합니다.
@end deffn

@geindex PyNumber_Positive (C function)
@anchor{c-api/number c PyNumber_Positive}@anchor{50bb}
@deffn {C 함수} @ref{5dc,,PyObject} *PyNumber_Positive (PyObject *o)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
성공 시 `o'를, 실패 시 @code{NULL}을 반환합니다. 이것은 파이썬 표현식 @code{+o}와 동등합니다.
@end deffn

@geindex PyNumber_Absolute (C function)
@anchor{c-api/number c PyNumber_Absolute}@anchor{50a4}
@deffn {C 함수} @ref{5dc,,PyObject} *PyNumber_Absolute (PyObject *o)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
@geindex 내장 함수;abs

`o'의 절댓값이나, 실패 시 @code{NULL}을 반환합니다. 이것은 파이썬 표현식 @code{abs(o)}와 동등합니다.
@end deffn

@geindex PyNumber_Invert (C function)
@anchor{c-api/number c PyNumber_Invert}@anchor{50b6}
@deffn {C 함수} @ref{5dc,,PyObject} *PyNumber_Invert (PyObject *o)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
성공 시 `o'의 비트 반전(bitwise negation)을, 실패 시 @code{NULL}을 반환합니다. 이것은 파이썬 표현식 @code{~o}와 동등합니다.
@end deffn

@geindex PyNumber_Lshift (C function)
@anchor{c-api/number c PyNumber_Lshift}@anchor{50b7}
@deffn {C 함수} @ref{5dc,,PyObject} *PyNumber_Lshift (PyObject *o1, PyObject *o2)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
성공 시 `o1'을 `o2'만큼 왼쪽으로 시프트 한 결과를, 실패 시 @code{NULL}을 반환합니다. 이것은 파이썬 표현식 @code{o1 << o2}와 동등합니다.
@end deffn

@geindex PyNumber_Rshift (C function)
@anchor{c-api/number c PyNumber_Rshift}@anchor{50be}
@deffn {C 함수} @ref{5dc,,PyObject} *PyNumber_Rshift (PyObject *o1, PyObject *o2)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
성공 시 `o1'을 `o2'만큼 오른쪽으로 시프트 한 결과를, 실패 시 @code{NULL}을 반환합니다. 이것은 파이썬 표현식 @code{o1 >> o2}와 동등합니다.
@end deffn

@geindex PyNumber_And (C function)
@anchor{c-api/number c PyNumber_And}@anchor{50a6}
@deffn {C 함수} @ref{5dc,,PyObject} *PyNumber_And (PyObject *o1, PyObject *o2)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
성공 시 `o1'과 `o2'의 “비트별 논리곱(bitwise and)”을, 실패 시 @code{NULL}을 반환합니다. 이것은 파이썬 표현식 @code{o1 & o2}와 동등합니다.
@end deffn

@geindex PyNumber_Xor (C function)
@anchor{c-api/number c PyNumber_Xor}@anchor{50c1}
@deffn {C 함수} @ref{5dc,,PyObject} *PyNumber_Xor (PyObject *o1, PyObject *o2)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
성공 시 `o1'과 `o2'의 “비트별 배타적 논리합(bitwise exclusive or)”을, 실패 시 @code{NULL}을 반환합니다. 이것은 파이썬 표현식 @code{o1 ^ o2}와 동등합니다.
@end deffn

@geindex PyNumber_Or (C function)
@anchor{c-api/number c PyNumber_Or}@anchor{50ba}
@deffn {C 함수} @ref{5dc,,PyObject} *PyNumber_Or (PyObject *o1, PyObject *o2)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
성공 시 `o1'과 `o2'의 “비트별 논리합(bitwise or)”을, 실패 시 @code{NULL}을 반환합니다. 이것은 파이썬 표현식 @code{o1 | o2}와 동등합니다.
@end deffn

@geindex PyNumber_InPlaceAdd (C function)
@anchor{c-api/number c PyNumber_InPlaceAdd}@anchor{50aa}
@deffn {C 함수} @ref{5dc,,PyObject} *PyNumber_InPlaceAdd (PyObject *o1, PyObject *o2)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
`o1'과 `o2'를 더한 결과나, 실패 시 @code{NULL}을 반환합니다. 이 연산은 `o1'이 지원하면 `제자리에서(in-place)' 수행됩니다. 이것은 파이썬 문장 @code{o1 += o2}와 동등합니다.
@end deffn

@geindex PyNumber_InPlaceSubtract (C function)
@anchor{c-api/number c PyNumber_InPlaceSubtract}@anchor{50b3}
@deffn {C 함수} @ref{5dc,,PyObject} *PyNumber_InPlaceSubtract (PyObject *o1, PyObject *o2)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
`o1'에서 `o2'를 뺀 결과나, 실패 시 @code{NULL}을 반환합니다. 이 연산은 `o1'이 지원하면 `제자리에서(in-place)' 수행됩니다. 이것은 파이썬 문장 @code{o1 -= o2}와 동등합니다.
@end deffn

@geindex PyNumber_InPlaceMultiply (C function)
@anchor{c-api/number c PyNumber_InPlaceMultiply}@anchor{50ae}
@deffn {C 함수} @ref{5dc,,PyObject} *PyNumber_InPlaceMultiply (PyObject *o1, PyObject *o2)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
`o1'과 `o2'를 곱한 결과나, 실패 시 @code{NULL}을 반환합니다. 이 연산은 `o1'이 지원하면 `제자리에서(in-place)' 수행됩니다. 이것은 파이썬 문장 @code{o1 *= o2}와 동등합니다.
@end deffn

@geindex PyNumber_InPlaceMatrixMultiply (C function)
@anchor{c-api/number c PyNumber_InPlaceMatrixMultiply}@anchor{10b6}
@deffn {C 함수} @ref{5dc,,PyObject} *PyNumber_InPlaceMatrixMultiply (PyObject *o1, PyObject *o2)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI} 버전 3.7 이후로.'
`o1'과 `o2'를 행렬 곱셈한 결과나, 실패 시 @code{NULL}을 반환합니다. 이 연산은 `o1'이 지원하면 `제자리에서(in-place)' 수행됩니다. 이것은 파이썬 문장 @code{o1 @@= o2}와 동등합니다.


Added in version 3.5.

@end deffn

@geindex PyNumber_InPlaceFloorDivide (C function)
@anchor{c-api/number c PyNumber_InPlaceFloorDivide}@anchor{50ac}
@deffn {C 함수} @ref{5dc,,PyObject} *PyNumber_InPlaceFloorDivide (PyObject *o1, PyObject *o2)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
`o1'을 `o2'로 나눈 수학적 플로어(floor)나, 실패 시 @code{NULL}을 반환합니다. 이 연산은 `o1'이 지원하면 `제자리에서(in-place)' 수행됩니다. 이것은 파이썬 문장 @code{o1 //= o2}와 동등합니다.
@end deffn

@geindex PyNumber_InPlaceTrueDivide (C function)
@anchor{c-api/number c PyNumber_InPlaceTrueDivide}@anchor{50b4}
@deffn {C 함수} @ref{5dc,,PyObject} *PyNumber_InPlaceTrueDivide (PyObject *o1, PyObject *o2)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
`o1'을 `o2'로 나눈 수학적 값의 적절한 근삿값이나, 실패 시 @code{NULL}을 반환합니다. 반환 값은 “근사치” 인데, 이진 부동 소수점 수가 근사치이기 때문입니다; 이진수로 모든 실수를 표현할 수는 없습니다. 이 함수는 두 개의 정수를 전달할 때 부동 소수점 수를 반환할 수 있습니다. 이 연산은 `o1'이 지원하면 `제자리에서(in-place)' 수행됩니다. 이것은 파이썬 문장 @code{o1 /= o2}와 동등합니다.
@end deffn

@geindex PyNumber_InPlaceRemainder (C function)
@anchor{c-api/number c PyNumber_InPlaceRemainder}@anchor{50b1}
@deffn {C 함수} @ref{5dc,,PyObject} *PyNumber_InPlaceRemainder (PyObject *o1, PyObject *o2)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
`o1'을 `o2'로 나눈 나머지나, 실패 시 @code{NULL}을 반환합니다. 이 연산은 `o1'이 지원하면 `제자리에서(in-place)' 수행됩니다. 이것은 파이썬 문장 @code{o1 %= o2}와 동등합니다.
@end deffn

@geindex PyNumber_InPlacePower (C function)
@anchor{c-api/number c PyNumber_InPlacePower}@anchor{50b0}
@deffn {C 함수} @ref{5dc,,PyObject} *PyNumber_InPlacePower (PyObject *o1, PyObject *o2, PyObject *o3)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
@geindex 내장 함수;pow

내장 함수 @ref{1a4,,pow()}를 참조하십시오. 실패하면 @code{NULL}을 반환합니다. 이 연산은 `o1'이 지원하면 `제자리에서(in-place)' 수행됩니다. 이것은 o3가 @ref{4ede,,Py_None}일 때 파이썬 문장 @code{o1 **= o2}와, 그렇지 않으면 @code{pow(o1, o2, o3)}의 제자리 변형과 동등합니다. `o3'를 무시하려면, 그 자리에 @code{Py_None}을 전달하십시오 (`o3'에 @code{NULL}을 전달하면 잘못된 메모리 액세스가 발생합니다).
@end deffn

@geindex PyNumber_InPlaceLshift (C function)
@anchor{c-api/number c PyNumber_InPlaceLshift}@anchor{50ad}
@deffn {C 함수} @ref{5dc,,PyObject} *PyNumber_InPlaceLshift (PyObject *o1, PyObject *o2)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
성공 시 `o1'을 `o2'만큼 왼쪽으로 시프트 한 결과를, 실패 시 @code{NULL}을 반환합니다. 이 연산은 `o1'이 지원하면 `제자리에서(in-place)' 수행됩니다. 이것은 파이썬 문장 @code{o1 <<= o2}와 동등합니다.
@end deffn

@geindex PyNumber_InPlaceRshift (C function)
@anchor{c-api/number c PyNumber_InPlaceRshift}@anchor{50b2}
@deffn {C 함수} @ref{5dc,,PyObject} *PyNumber_InPlaceRshift (PyObject *o1, PyObject *o2)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
성공 시 `o1'을 `o2'만큼 오른쪽으로 시프트 한 결과를, 실패 시 @code{NULL}을 반환합니다. 이 연산은 `o1'이 지원하면 `제자리에서(in-place)' 수행됩니다. 이것은 파이썬 문장 @code{o1 >>= o2}와 동등합니다.
@end deffn

@geindex PyNumber_InPlaceAnd (C function)
@anchor{c-api/number c PyNumber_InPlaceAnd}@anchor{50ab}
@deffn {C 함수} @ref{5dc,,PyObject} *PyNumber_InPlaceAnd (PyObject *o1, PyObject *o2)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
성공 시 `o1'과 `o2'의 “비트별 논리곱(bitwise and)”을, 실패 시 @code{NULL}을 반환합니다. 이 연산은 `o1'이 지원하면 `제자리에서(in-place)' 수행됩니다. 이것은 파이썬 문장 @code{o1 &= o2}와 동등합니다.
@end deffn

@geindex PyNumber_InPlaceXor (C function)
@anchor{c-api/number c PyNumber_InPlaceXor}@anchor{50b5}
@deffn {C 함수} @ref{5dc,,PyObject} *PyNumber_InPlaceXor (PyObject *o1, PyObject *o2)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
성공 시 `o1'과 `o2'의 “비트별 배타적 논리합(bitwise exclusive or)”을, 실패 시 @code{NULL}을 반환합니다. 이 연산은 `o1'이 지원하면 `제자리에서(in-place)' 수행됩니다. 이것은 파이썬 문장 @code{o1 ^= o2}와 동등합니다.
@end deffn

@geindex PyNumber_InPlaceOr (C function)
@anchor{c-api/number c PyNumber_InPlaceOr}@anchor{50af}
@deffn {C 함수} @ref{5dc,,PyObject} *PyNumber_InPlaceOr (PyObject *o1, PyObject *o2)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
성공 시 `o1'과 `o2'의 “비트별 논리합(bitwise or)”을, 실패 시 @code{NULL}을 반환합니다. 이 연산은 `o1'이 지원하면 `제자리에서(in-place)' 수행됩니다. 이것은 파이썬 문장 @code{o1 |= o2}와 동등합니다.
@end deffn

@geindex PyNumber_Long (C function)
@anchor{c-api/number c PyNumber_Long}@anchor{c5c}
@deffn {C 함수} @ref{5dc,,PyObject} *PyNumber_Long (PyObject *o)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
@geindex 내장 함수;int

성공 시 정수 객체로 변환된 `o'를, 실패 시 @code{NULL}을 반환합니다. 이것은 파이썬 표현식 @code{int(o)}와 동등합니다.
@end deffn

@geindex PyNumber_Float (C function)
@anchor{c-api/number c PyNumber_Float}@anchor{c5d}
@deffn {C 함수} @ref{5dc,,PyObject} *PyNumber_Float (PyObject *o)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
@geindex 내장 함수;float

성공 시 float 객체로 변환된 `o'를, 실패 시 @code{NULL}을 반환합니다. 이것은 파이썬 표현식 @code{float(o)}와 동등합니다.
@end deffn

@geindex PyNumber_Index (C function)
@anchor{c-api/number c PyNumber_Index}@anchor{a93}
@deffn {C 함수} @ref{5dc,,PyObject} *PyNumber_Index (PyObject *o)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
성공 시 파이썬 int로 변환된 `o'를, 실패 시 @code{NULL}을 반환합니다. 실패 시 @ref{198,,TypeError} 예외가 발생합니다.


버전 3.10에서 변경: The result always has exact type @ref{19b,,int}.  Previously, the result
could have been an instance of a subclass of @code{int}.

@end deffn

@geindex PyNumber_ToBase (C function)
@anchor{c-api/number c PyNumber_ToBase}@anchor{1b71}
@deffn {C 함수} @ref{5dc,,PyObject} *PyNumber_ToBase (PyObject *n, int base)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
정수 `n'을 진수 `base'를 사용해서 변환한 문자열을 반환합니다. `base' 인자는 2, 8, 10 또는 16중 하나여야 합니다. 진수 2, 8 또는 16의 경우, 반환된 문자열은 @code{'0b'}, @code{'0o'} 또는 @code{'0x'}의 진수 표시자가 각각 앞에 붙습니다. `n'이 파이썬 int가 아니면, 먼저 @ref{a93,,PyNumber_Index()}로 변환됩니다.
@end deffn

@geindex PyNumber_AsSsize_t (C function)
@anchor{c-api/number c PyNumber_AsSsize_t}@anchor{50a7}
@deffn {C 함수} @ref{c54,,Py_ssize_t} PyNumber_AsSsize_t (PyObject *o, PyObject *exc)
` Part of the @ref{774,,안정 ABI}.'
`o'가 정수로 해석될 수 있으면, `o'를 @ref{c54,,Py_ssize_t} 값으로 변환하여 반환합니다. 호출이 실패하면, 예외가 발생하고 @code{-1}이 반환됩니다.

`o'가 파이썬 int로 변환될 수 있지만 @ref{c54,,Py_ssize_t} 값으로 변환하려는 시도가 @ref{a81,,OverflowError}를 발생시키면, `exc' 인자는 발생할 예외의 형(일반적으로 @ref{173a,,IndexError}나 @code{OverflowError})입니다. `exc'가 @code{NULL}이면, 예외가 지워지고 값은 음의 정수는 @code{PY_SSIZE_T_MIN}으로, 양의 정수는 @code{PY_SSIZE_T_MAX}로 잘립니다.
@end deffn

@geindex PyIndex_Check (C function)
@anchor{c-api/number c PyIndex_Check}@anchor{b80}
@deffn {C 함수} int PyIndex_Check (PyObject *o)
` Part of the @ref{774,,안정 ABI} 버전 3.8 이후로.'
`o'가 인덱스 정수(@code{tp_as_number} 구조의 @code{nb_index} 슬롯이 채워져 있습니다)면 @code{1}을 반환하고, 그렇지 않으면 @code{0}을 반환합니다. 이 함수는 항상 성공합니다.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 시퀀스 프로토콜,매핑 프로토콜,숫자 프로토콜,추상 객체 계층
@anchor{c-api/sequence doc}@anchor{52e3}@anchor{c-api/sequence sequence}@anchor{52e4}@anchor{c-api/sequence sequence-protocol}@anchor{52e5}@anchor{c-api/sequence translation-repo}@anchor{52e6}
@subsection 시퀀스 프로토콜


@geindex PySequence_Check (C function)
@anchor{c-api/sequence c PySequence_Check}@anchor{50df}
@deffn {C 함수} int PySequence_Check (PyObject *o)
` Part of the @ref{774,,안정 ABI}.'
객체가 시퀀스 프로토콜을 제공하면 @code{1}을 반환하고, 그렇지 않으면 @code{0}을 반환합니다. @ref{588,,__getitem__()} 메서드가 있는 파이썬 클래스의 경우 @ref{183,,dict} 서브 클래스가 아닌 한 @code{1}을 반환하는 것에 유의하십시오. 일반적으로 클래스가 어떤 형의 키를 지원하는지 판단할 수 없기 때문입니다. 이 함수는 항상 성공합니다.
@end deffn

@geindex PySequence_Size (C function)
@geindex PySequence_Length (C function)
@anchor{c-api/sequence c PySequence_Size}@anchor{1e2f}
@deffn {C 함수} @ref{c54,,Py_ssize_t} PySequence_Size (PyObject *o)
@anchor{c-api/sequence c PySequence_Length}@anchor{50e7}
@deffnx {C 함수} @ref{c54,,Py_ssize_t} PySequence_Length (PyObject *o)
` Part of the @ref{774,,안정 ABI}.'
@geindex 내장 함수;len

성공 시 시퀀스 `o'의 객체 수를 반환하고, 실패하면 @code{-1}을 반환합니다. 이것은 파이썬 표현식 @code{len(o)}와 동등합니다.
@end deffn

@geindex PySequence_Concat (C function)
@anchor{c-api/sequence c PySequence_Concat}@anchor{50e0}
@deffn {C 함수} @ref{5dc,,PyObject} *PySequence_Concat (PyObject *o1, PyObject *o2)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
성공 시 `o1'와 `o2'의 이어붙이기를 반환하고, 실패하면 @code{NULL}을 반환합니다. 이것은 파이썬 표현식 @code{o1 + o2}와 동등합니다.
@end deffn

@geindex PySequence_Repeat (C function)
@anchor{c-api/sequence c PySequence_Repeat}@anchor{50e9}
@deffn {C 함수} @ref{5dc,,PyObject} *PySequence_Repeat (PyObject *o, Py_ssize_t count)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
시퀸스 객체 `o'를 `count' 번 반복한 결과를 반환하거나, 실패 시 @code{NULL}을 반환합니다. 이것은 파이썬 표현식 @code{o * count}와 동등합니다.
@end deffn

@geindex PySequence_InPlaceConcat (C function)
@anchor{c-api/sequence c PySequence_InPlaceConcat}@anchor{50e4}
@deffn {C 함수} @ref{5dc,,PyObject} *PySequence_InPlaceConcat (PyObject *o1, PyObject *o2)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
성공 시 `o1'와 `o2'의 이어붙이기를 반환하고, 실패하면 @code{NULL}을 반환합니다. 이 연산은 `o1'가 지원하면 `제자리에서(in-place)' 수행됩니다. 이것은 파이썬 표현식 @code{o1 += o2}와 동등합니다.
@end deffn

@geindex PySequence_InPlaceRepeat (C function)
@anchor{c-api/sequence c PySequence_InPlaceRepeat}@anchor{50e5}
@deffn {C 함수} @ref{5dc,,PyObject} *PySequence_InPlaceRepeat (PyObject *o, Py_ssize_t count)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
시퀸스 객체 `o'를 `count' 번 반복한 결과를 반환하거나, 실패 시 @code{NULL}을 반환합니다. 이 연산은 `o'가 지원하면 `제자리에서(in-place)' 수행됩니다. 이것은 파이썬 표현식 @code{o *= count}와 동등합니다.
@end deffn

@geindex PySequence_GetItem (C function)
@anchor{c-api/sequence c PySequence_GetItem}@anchor{1e30}
@deffn {C 함수} @ref{5dc,,PyObject} *PySequence_GetItem (PyObject *o, Py_ssize_t i)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
`o'의 `i' 번째 요소를 반환하거나, 실패하면 @code{NULL}을 반환합니다. 이것은 파이썬 표현식 @code{o[i]}와 동등합니다.
@end deffn

@geindex PySequence_GetSlice (C function)
@anchor{c-api/sequence c PySequence_GetSlice}@anchor{50e3}
@deffn {C 함수} @ref{5dc,,PyObject} *PySequence_GetSlice (PyObject *o, Py_ssize_t i1, Py_ssize_t i2)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
시퀀스 객체 `o'의 `i1'와 `i2' 사이의 슬라이스를 반환하거나, 실패하면 @code{NULL}을 반환합니다. 이것은 파이썬 표현식 @code{o[i1:i2]}와 동등합니다.
@end deffn

@geindex PySequence_SetItem (C function)
@anchor{c-api/sequence c PySequence_SetItem}@anchor{1e31}
@deffn {C 함수} int PySequence_SetItem (PyObject *o, Py_ssize_t i, PyObject *v)
` Part of the @ref{774,,안정 ABI}.'
객체 `v'를 `o'의 `i' 번째 요소에 대입합니다. 실패하면 예외를 발생시키고 @code{-1}을 반환합니다; 성공하면 @code{0}을 반환합니다. 이것은 파이썬 문장 @code{o[i] = v}와 동등합니다. 이 함수는 `v'에 대한 참조를 훔치지 `않습니다'.

`v'가 @code{NULL}이면, 요소가 삭제되지만, 이 기능은 @ref{1e32,,PySequence_DelItem()} 사용을 위해 폐지되었습니다.
@end deffn

@geindex PySequence_DelItem (C function)
@anchor{c-api/sequence c PySequence_DelItem}@anchor{1e32}
@deffn {C 함수} int PySequence_DelItem (PyObject *o, Py_ssize_t i)
` Part of the @ref{774,,안정 ABI}.'
`o' 객체의 `i' 번째 요소를 삭제합니다. 실패하면 @code{-1}을 반환합니다. 이것은 파이썬 문장 @code{del o[i]}와 동등합니다.
@end deffn

@geindex PySequence_SetSlice (C function)
@anchor{c-api/sequence c PySequence_SetSlice}@anchor{50ea}
@deffn {C 함수} int PySequence_SetSlice (PyObject *o, Py_ssize_t i1, Py_ssize_t i2, PyObject *v)
` Part of the @ref{774,,안정 ABI}.'
시퀀스 객체 `v'를 시퀀스 객체 `o'의 `i1'에서 `i2' 사이의 슬라이스에 대입합니다. 이것은 파이썬 문장 @code{o[i1:i2] = v}와 동등합니다.
@end deffn

@geindex PySequence_DelSlice (C function)
@anchor{c-api/sequence c PySequence_DelSlice}@anchor{50e2}
@deffn {C 함수} int PySequence_DelSlice (PyObject *o, Py_ssize_t i1, Py_ssize_t i2)
` Part of the @ref{774,,안정 ABI}.'
시퀀스 객체 `o'의 `i1'에서 `i2' 사이의 슬라이스를 삭제합니다. 실패하면 @code{-1}을 반환합니다. 이것은 파이썬 문장 @code{del o[i1:i2]}와 동등합니다.
@end deffn

@geindex PySequence_Count (C function)
@anchor{c-api/sequence c PySequence_Count}@anchor{50e1}
@deffn {C 함수} @ref{c54,,Py_ssize_t} PySequence_Count (PyObject *o, PyObject *value)
` Part of the @ref{774,,안정 ABI}.'
`o'에 있는 `value'의 수를 반환합니다. 즉, @code{o[key] == value}를 만족하는 key의 수를 반환합니다. 실패하면 @code{-1}을 반환합니다. 이것은 파이썬 표현식 @code{o.count(value)}와 동등합니다.
@end deffn

@geindex PySequence_Contains (C function)
@anchor{c-api/sequence c PySequence_Contains}@anchor{3d9}
@deffn {C 함수} int PySequence_Contains (PyObject *o, PyObject *value)
` Part of the @ref{774,,안정 ABI}.'
`o'에 `value'가 있는지 확인합니다. `o'의 항목 중 하나가 `value'와 같으면 @code{1}을 반환하고, 그렇지 않으면 @code{0}을 반환합니다. 에러 시 @code{-1}을 반환합니다. 이는 파이썬 표현식 @code{value in o}와 동등합니다.
@end deffn

@geindex PySequence_In (C function)
@anchor{c-api/sequence c PySequence_In}@anchor{3d8}
@deffn {C 함수} int PySequence_In (PyObject *o, PyObject *value)
` Part of the @ref{774,,안정 ABI}.'
Alias for @ref{3d9,,PySequence_Contains()}.


버전 3.14부터 폐지됨: The function is @ref{23d,,soft deprecated} and should no longer be used to
write new code.

@end deffn

@geindex PySequence_Index (C function)
@anchor{c-api/sequence c PySequence_Index}@anchor{50e6}
@deffn {C 함수} @ref{c54,,Py_ssize_t} PySequence_Index (PyObject *o, PyObject *value)
` Part of the @ref{774,,안정 ABI}.'
@code{o[i] == value}을 만족하는 첫 번째 인덱스 `i'를 반환합니다. 에러 시 @code{-1}을 반환합니다. 이것은 파이썬 표현식 @code{o.index(value)}와 동등합니다.
@end deffn

@geindex PySequence_List (C function)
@anchor{c-api/sequence c PySequence_List}@anchor{50e8}
@deffn {C 함수} @ref{5dc,,PyObject} *PySequence_List (PyObject *o)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
시퀀스나 이터러블 `o'와 같은 내용을 가진 리스트 객체를 반환하거나, 실패하면 @code{NULL}을 반환합니다. 반환된 리스트는 새로운 것으로 보장됩니다. 이것은 파이썬 표현식 @code{list(o)}와 동등합니다.
@end deffn

@geindex PySequence_Tuple (C function)
@anchor{c-api/sequence c PySequence_Tuple}@anchor{50eb}
@deffn {C 함수} @ref{5dc,,PyObject} *PySequence_Tuple (PyObject *o)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
@geindex 내장 함수;튜플

시퀀스나 이터러블 `o'와 같은 내용을 가진 튜플 객체를 반환하거나, 실패하면 @code{NULL}을 반환합니다. `o'가 튜플이면, 새로운 참조가 반환되고, 그렇지 않으면 튜플이 적절한 내용으로 만들어집니다. 이것은 파이썬 표현식 @code{tuple(o)}와 동등합니다.
@end deffn

@geindex PySequence_Fast (C function)
@anchor{c-api/sequence c PySequence_Fast}@anchor{18a4}
@deffn {C 함수} @ref{5dc,,PyObject} *PySequence_Fast (PyObject *o, const char *m)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
시퀀스나 이터러블 `o'를 다른 @code{PySequence_Fast*} 계열 함수에서 사용할 수 있는 객체로 반환합니다. 객체가 시퀀스나 이터러블이 아니면 `m'을 메시지 텍스트로 사용하여 @ref{198,,TypeError}를 발생시킵니다. 실패 시 @code{NULL}을 반환합니다.

@code{PySequence_Fast*} 함수는 `o'가 @ref{5263,,PyTupleObject}나 @ref{2733,,PyListObject}라고 가정하고 `o'의 데이터 필드에 직접 액세스하기 때문에 이렇게 이름 붙였습니다.

CPython 구현 세부 사항으로, `o'가 이미 시퀀스나 리스트면, 반환됩니다.
@end deffn

@geindex PySequence_Fast_GET_SIZE (C function)
@anchor{c-api/sequence c PySequence_Fast_GET_SIZE}@anchor{3ca}
@deffn {C 함수} @ref{c54,,Py_ssize_t} PySequence_Fast_GET_SIZE (PyObject *o)

`o'의 길이를 반환하는데, `o'가 @ref{18a4,,PySequence_Fast()}에 의해 반환되었고, `o'가 @code{NULL}이 아니라고 가정합니다. 크기는 `o'에 대해 @ref{1e2f,,PySequence_Size()}를 호출하여 얻을 수도 있지만, @ref{3ca,,PySequence_Fast_GET_SIZE()}는 `o'가 리스트나 튜플이라고 가정할 수 있으므로 더 빠릅니다.
@end deffn

@geindex PySequence_Fast_GET_ITEM (C function)
@anchor{c-api/sequence c PySequence_Fast_GET_ITEM}@anchor{3cb}
@deffn {C 함수} @ref{5dc,,PyObject} *PySequence_Fast_GET_ITEM (PyObject *o, Py_ssize_t i)
`반환값: 빌린 참조.'
`o'의 `i' 번째 요소를 반환하는데, `o'가 @ref{18a4,,PySequence_Fast()}에 의해 반환되었고, `o'가 @code{NULL}이 아니며, `i'가 경계 내에 있다고 가정합니다.
@end deffn

@geindex PySequence_Fast_ITEMS (C function)
@anchor{c-api/sequence c PySequence_Fast_ITEMS}@anchor{3cc}
@deffn {C 함수} @ref{5dc,,PyObject} **PySequence_Fast_ITEMS (PyObject *o)

PyObject 포인터의 하부 배열을 반환합니다. `o'가 @ref{18a4,,PySequence_Fast()}에 의해 반환되었고, `o'가 @code{NULL}이 아니라고 가정합니다.

리스트의 크기가 변경되면, 재할당이 항목 배열을 재배치할 수 있음에 유의하십시오. 따라서, 시퀀스가 변경될 수 없는 문맥에서만 하부 배열 포인터를 사용하십시오.
@end deffn

@geindex PySequence_ITEM (C function)
@anchor{c-api/sequence c PySequence_ITEM}@anchor{52e7}
@deffn {C 함수} @ref{5dc,,PyObject} *PySequence_ITEM (PyObject *o, Py_ssize_t i)
`반환값: 새 참조.'
`o'의 `i' 번째 요소를 반환하거나, 실패하면 @code{NULL}을 반환합니다. @ref{1e30,,PySequence_GetItem()}의 빠른 형식이지만, `o'에 대해 @ref{50df,,PySequence_Check()}가 참인지 검사하지 않고, 음수 인덱스를 조정하지 않습니다.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 매핑 프로토콜,이터레이터 프로토콜,시퀀스 프로토콜,추상 객체 계층
@anchor{c-api/mapping doc}@anchor{52e8}@anchor{c-api/mapping mapping}@anchor{52e9}@anchor{c-api/mapping mapping-protocol}@anchor{52ea}@anchor{c-api/mapping translation-repo}@anchor{52eb}
@subsection 매핑 프로토콜


@ref{5e6,,PyObject_GetItem()}, @ref{4f87,,PyObject_SetItem()} 및 @ref{50ca,,PyObject_DelItem()}도 참조하십시오.

@geindex PyMapping_Check (C function)
@anchor{c-api/mapping c PyMapping_Check}@anchor{5090}
@deffn {C 함수} int PyMapping_Check (PyObject *o)
` Part of the @ref{774,,안정 ABI}.'
객체가 매핑 프로토콜을 제공하거나 슬라이싱을 지원하면 @code{1}을 반환하고, 그렇지 않으면 @code{0}을 반환합니다. @ref{588,,__getitem__()} 메서드가 있는 파이썬 클래스의 경우 @code{1}을 반환한다는 점에 유의하십시오; 일반적으로 클래스가 지원하는 키 형을 판단할 수 없기 때문입니다. 이 함수는 항상 성공합니다.
@end deffn

@geindex PyMapping_Size (C function)
@geindex PyMapping_Length (C function)
@anchor{c-api/mapping c PyMapping_Size}@anchor{1e33}
@deffn {C 함수} @ref{c54,,Py_ssize_t} PyMapping_Size (PyObject *o)
@anchor{c-api/mapping c PyMapping_Length}@anchor{5091}
@deffnx {C 함수} @ref{c54,,Py_ssize_t} PyMapping_Length (PyObject *o)
` Part of the @ref{774,,안정 ABI}.'
@geindex 내장 함수;len

성공 시 객체 `o'의 키 수를 반환하고, 실패하면 @code{-1}을 반환합니다. 이는 파이썬 표현식 @code{len(o)}와 동등합니다.
@end deffn

@geindex PyMapping_GetItemString (C function)
@anchor{c-api/mapping c PyMapping_GetItemString}@anchor{5e7}
@deffn {C 함수} @ref{5dc,,PyObject} *PyMapping_GetItemString (PyObject *o, const char *key)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
This is the same as @ref{5e6,,PyObject_GetItem()}, but `key' is
specified as a const char* UTF-8 encoded bytes string,
rather than a @ref{5dc,,PyObject}*.
@end deffn

@geindex PyMapping_GetOptionalItem (C function)
@anchor{c-api/mapping c PyMapping_GetOptionalItem}@anchor{5e8}
@deffn {C 함수} int PyMapping_GetOptionalItem (PyObject *obj, PyObject *key, PyObject **result)
` Part of the @ref{774,,안정 ABI} 버전 3.13 이후로.'
Variant of @ref{5e6,,PyObject_GetItem()} which doesn’t raise
@ref{5e5,,KeyError} if the key is not found.

If the key is found, return @code{1} and set `*result' to a new
@ref{5df,,strong reference} to the corresponding value.
If the key is not found, return @code{0} and set `*result' to @code{NULL};
the @ref{5e5,,KeyError} is silenced.
If an error other than @code{KeyError} is raised, return @code{-1} and
set `*result' to @code{NULL}.


Added in version 3.13.

@end deffn

@geindex PyMapping_GetOptionalItemString (C function)
@anchor{c-api/mapping c PyMapping_GetOptionalItemString}@anchor{5e9}
@deffn {C 함수} int PyMapping_GetOptionalItemString (PyObject *obj, const char *key, PyObject **result)
` Part of the @ref{774,,안정 ABI} 버전 3.13 이후로.'
This is the same as @ref{5e8,,PyMapping_GetOptionalItem()}, but `key' is
specified as a const char* UTF-8 encoded bytes string,
rather than a @ref{5dc,,PyObject}*.


Added in version 3.13.

@end deffn

@geindex PyMapping_SetItemString (C function)
@anchor{c-api/mapping c PyMapping_SetItemString}@anchor{5092}
@deffn {C 함수} int PyMapping_SetItemString (PyObject *o, const char *key, PyObject *v)
` Part of the @ref{774,,안정 ABI}.'
This is the same as @ref{4f87,,PyObject_SetItem()}, but `key' is
specified as a const char* UTF-8 encoded bytes string,
rather than a @ref{5dc,,PyObject}*.
@end deffn

@geindex PyMapping_DelItem (C function)
@anchor{c-api/mapping c PyMapping_DelItem}@anchor{52ec}
@deffn {C 함수} int PyMapping_DelItem (PyObject *o, PyObject *key)

이것은 @ref{50ca,,PyObject_DelItem()}의 별칭입니다.
@end deffn

@geindex PyMapping_DelItemString (C function)
@anchor{c-api/mapping c PyMapping_DelItemString}@anchor{52ed}
@deffn {C 함수} int PyMapping_DelItemString (PyObject *o, const char *key)

This is the same as @ref{50ca,,PyObject_DelItem()}, but `key' is
specified as a const char* UTF-8 encoded bytes string,
rather than a @ref{5dc,,PyObject}*.
@end deffn

@geindex PyMapping_HasKeyWithError (C function)
@anchor{c-api/mapping c PyMapping_HasKeyWithError}@anchor{61e}
@deffn {C 함수} int PyMapping_HasKeyWithError (PyObject *o, PyObject *key)
` Part of the @ref{774,,안정 ABI} 버전 3.13 이후로.'
매핑 객체에 `key' 키가 있으면 @code{1}을 반환하고, 그렇지 않으면 @code{0}을 반환합니다. 이는 파이썬 표현식 @code{key in o}와 동등합니다. 실패하면 @code{-1}을 반환합니다.


Added in version 3.13.

@end deffn

@geindex PyMapping_HasKeyStringWithError (C function)
@anchor{c-api/mapping c PyMapping_HasKeyStringWithError}@anchor{620}
@deffn {C 함수} int PyMapping_HasKeyStringWithError (PyObject *o, const char *key)
` Part of the @ref{774,,안정 ABI} 버전 3.13 이후로.'
This is the same as @ref{61e,,PyMapping_HasKeyWithError()}, but `key' is
specified as a const char* UTF-8 encoded bytes string,
rather than a @ref{5dc,,PyObject}*.


Added in version 3.13.

@end deffn

@geindex PyMapping_HasKey (C function)
@anchor{c-api/mapping c PyMapping_HasKey}@anchor{61d}
@deffn {C 함수} int PyMapping_HasKey (PyObject *o, PyObject *key)
` Part of the @ref{774,,안정 ABI}.'
매핑 객체에 `key' 키가 있으면 @code{1}을 반환하고, 그렇지 않으면 @code{0}을 반환합니다. 이는 파이썬 표현식 @code{key in o}와 동등합니다. 이 함수는 항상 성공합니다.

@cartouche
@quotation 참고 
Exceptions which occur when this calls the @ref{588,,__getitem__()}
method are silently ignored.
For proper error handling, use @ref{61e,,PyMapping_HasKeyWithError()},
@ref{5e8,,PyMapping_GetOptionalItem()} or @ref{5e6,,PyObject_GetItem()} instead.
@end quotation
@end cartouche
@end deffn

@geindex PyMapping_HasKeyString (C function)
@anchor{c-api/mapping c PyMapping_HasKeyString}@anchor{61f}
@deffn {C 함수} int PyMapping_HasKeyString (PyObject *o, const char *key)
` Part of the @ref{774,,안정 ABI}.'
This is the same as @ref{61d,,PyMapping_HasKey()}, but `key' is
specified as a const char* UTF-8 encoded bytes string,
rather than a @ref{5dc,,PyObject}*.

@cartouche
@quotation 참고 
Exceptions that occur when this calls the @ref{588,,__getitem__()}
method or while creating the temporary @ref{169,,str}
object are silently ignored.
For proper error handling, use @ref{620,,PyMapping_HasKeyStringWithError()},
@ref{5e9,,PyMapping_GetOptionalItemString()} or
@ref{5e7,,PyMapping_GetItemString()} instead.
@end quotation
@end cartouche
@end deffn

@geindex PyMapping_Keys (C function)
@anchor{c-api/mapping c PyMapping_Keys}@anchor{db4}
@deffn {C 함수} @ref{5dc,,PyObject} *PyMapping_Keys (PyObject *o)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
성공하면, 객체 `o'의 키 리스트를 반환합니다. 실패하면, @code{NULL}을 반환합니다.


버전 3.7에서 변경: 이전에는 함수가 리스트나 튜플을 반환했습니다.

@end deffn

@geindex PyMapping_Values (C function)
@anchor{c-api/mapping c PyMapping_Values}@anchor{db5}
@deffn {C 함수} @ref{5dc,,PyObject} *PyMapping_Values (PyObject *o)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
성공하면, 객체 `o'의 값 리스트를 반환합니다. 실패하면, @code{NULL}을 반환합니다.


버전 3.7에서 변경: 이전에는 함수가 리스트나 튜플을 반환했습니다.

@end deffn

@geindex PyMapping_Items (C function)
@anchor{c-api/mapping c PyMapping_Items}@anchor{db6}
@deffn {C 함수} @ref{5dc,,PyObject} *PyMapping_Items (PyObject *o)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
성공하면, 객체 `o'에 있는 항목 리스트를 반환합니다. 여기서 각 항목은 키-값 쌍을 포함하는 튜플입니다. 실패하면, @code{NULL}을 반환합니다.


버전 3.7에서 변경: 이전에는 함수가 리스트나 튜플을 반환했습니다.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 이터레이터 프로토콜,버퍼 프로토콜,매핑 프로토콜,추상 객체 계층
@anchor{c-api/iter doc}@anchor{52ee}@anchor{c-api/iter iterator}@anchor{52ef}@anchor{c-api/iter iterator-protocol}@anchor{52f0}@anchor{c-api/iter translation-repo}@anchor{52f1}
@subsection 이터레이터 프로토콜


특히 이터레이터를 사용하기 위한 두 함수가 있습니다.

@geindex PyIter_Check (C function)
@anchor{c-api/iter c PyIter_Check}@anchor{1caf}
@deffn {C 함수} int PyIter_Check (PyObject *o)
` Part of the @ref{774,,안정 ABI} 버전 3.8 이후로.'
Return non-zero if the object `o' can be safely passed to
@ref{398,,PyIter_NextItem()} and @code{0} otherwise.
This function always succeeds.
@end deffn

@geindex PyAIter_Check (C function)
@anchor{c-api/iter c PyAIter_Check}@anchor{4fa2}
@deffn {C 함수} int PyAIter_Check (PyObject *o)
` Part of the @ref{774,,안정 ABI} 버전 3.10 이후로.'
객체 `o'가 @code{AsyncIterator} 프로토콜을 지원하면 @code{0}이 아닌 값을, 그렇지 않으면 @code{0}을 돌려줍니다. 이 함수는 항상 성공합니다.


Added in version 3.10.

@end deffn

@geindex PyIter_NextItem (C function)
@anchor{c-api/iter c PyIter_NextItem}@anchor{398}
@deffn {C 함수} int PyIter_NextItem (PyObject *iter, PyObject **item)
` Part of the @ref{774,,안정 ABI} 버전 3.14 이후로.'
Return @code{1} and set `item' to a @ref{5df,,strong reference} of the
next value of the iterator `iter' on success.
Return @code{0} and set `item' to @code{NULL} if there are no remaining values.
Return @code{-1}, set `item' to @code{NULL} and set an exception on error.


Added in version 3.14.

@end deffn

@geindex PyIter_Next (C function)
@anchor{c-api/iter c PyIter_Next}@anchor{399}
@deffn {C 함수} @ref{5dc,,PyObject} *PyIter_Next (PyObject *o)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
This is an older version of @code{PyIter_NextItem()},
which is retained for backwards compatibility.
Prefer @ref{398,,PyIter_NextItem()}.

이터레이터 `o'에서 다음 값을 반환합니다. 객체는  @ref{1caf,,PyIter_Check()}에 따르는 이터레이터 여야 합니다 (이것을 확인하는 것은 호출자 책임입니다). 남은 값이 없으면, 예외가 설정되지 않은 상태로 @code{NULL}을 반환합니다. 항목을 꺼내는 동안 에러가 발생하면, @code{NULL}을 반환하고 예외를 전달합니다.
@end deffn

@geindex PySendResult (C type)
@anchor{c-api/iter c PySendResult}@anchor{52f2}
@deffn {C 자료형} type PySendResult

The enum value used to represent different results of @ref{a98,,PyIter_Send()}.


Added in version 3.10.

@end deffn

@geindex PyIter_Send (C function)
@anchor{c-api/iter c PyIter_Send}@anchor{a98}
@deffn {C 함수} @ref{52f2,,PySendResult} PyIter_Send (PyObject *iter, PyObject *arg, PyObject **presult)
` Part of the @ref{774,,안정 ABI} 버전 3.10 이후로.'
Sends the `arg' value into the iterator `iter'. Returns:


@itemize -

@item 
@code{PYGEN_RETURN} if iterator returns. Return value is returned via `presult'.

@item 
@code{PYGEN_NEXT} if iterator yields. Yielded value is returned via `presult'.

@item 
@code{PYGEN_ERROR} if iterator has raised and exception. `presult' is set to @code{NULL}.
@end itemize


Added in version 3.10.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@geindex 버퍼 프로토콜
@geindex 버퍼 인터페이스;(버퍼 프로토콜을 보십시오)
@geindex 버퍼 객체;(버퍼 프로토콜을 보십시오)

@node 버퍼 프로토콜,,이터레이터 프로토콜,추상 객체 계층
@anchor{c-api/buffer doc}@anchor{52f3}@anchor{c-api/buffer buffer-protocol}@anchor{52f4}@anchor{c-api/buffer bufferobjects}@anchor{260}@anchor{c-api/buffer translation-repo}@anchor{52f5}
@subsection 버퍼 프로토콜


파이썬에서 사용할 수 있는 어떤 객체는 하부 메모리 배열 또는 `버퍼'에 대한 액세스를 감쌉니다. 이러한 객체에는 내장 @ref{192,,bytes} 와 @ref{344,,bytearray}, 그리고 @ref{4c0,,array.array}와 같은 일부 확장형이 포함됩니다. 제삼자 라이브러리도 이미지 처리나 수치 해석과 같은 특수한 용도로 자체 형을 정의할 수 있습니다.

이러한 형은 각각 고유의 의미가 있지만, (아마도) 큰 메모리 버퍼에 의해 뒷받침되는 공통된 특징을 공유합니다. 어떤 상황에서는 중간 복사 없이 직접 버퍼에 액세스하는 것이 바람직합니다.

Python provides such a facility at the C and Python level in the form of the
@ref{260,,buffer protocol}.  This protocol has two sides:

@geindex PyBufferProcs (C 형)


@itemize -

@item 
on the producer side, a type can export a “buffer interface” which allows
objects of that type to expose information about their underlying buffer.
This interface is described in the section @ref{52f6,,버퍼 객체 구조체}; for
Python see @ref{2410,,Emulating buffer types}.

@item 
on the consumer side, several means are available to obtain a pointer to
the raw underlying data of an object (for example a method parameter). For
Python see @ref{165,,memoryview}.
@end itemize

@ref{192,,bytes} 와 @ref{344,,bytearray}와 같은 간단한 객체는 하부 버퍼를 바이트 지향 형식으로 노출합니다. 다른 형태도 가능합니다; 예를 들어, @ref{4c0,,array.array}에 의해 노출되는 요소는 멀티 바이트 값이 될 수 있습니다.

버퍼 인터페이스의 소비자 예는 파일 객체의 @ref{ed6,,write()} 메서드입니다: 버퍼 인터페이스를 통해 일련의 바이트를 내보낼 수 있는 모든 객체는 파일에 기록될 수 있습니다. @code{write()}가 전달된 객체의 내부 내용에 대한 읽기 전용 액세스만 필요하지만, @ref{1897,,readinto()}와 같은 다른 메서드는 인자의 내용에 쓰기 액세스가 필요합니다. 버퍼 인터페이스는 객체가 읽기-쓰기와 읽기 전용 버퍼를 선택적으로 허용하거나 거부할 수 있도록 합니다.

버퍼 인터페이스의 소비자가 대상 객체에 대해 버퍼를 얻는 방법에는 두 가지가 있습니다:


@itemize *

@item 
올바른 매개 변수로 @ref{638,,PyObject_GetBuffer()}를 호출합니다;

@item 
@code{y*}, @code{w*} 또는 @code{s*} @ref{3d5,,형식 코드} 중 하나를 사용하여 @ref{3c1,,PyArg_ParseTuple()}(또는 그 형제 중 하나)을 호출합니다.
@end itemize

두 경우 모두, 버퍼가 더는 필요하지 않으면 @ref{639,,PyBuffer_Release()}를 호출해야 합니다. 그렇게 하지 않으면 자원 누수와 같은 다양한 문제가 발생할 수 있습니다.


Added in version 3.12: The buffer protocol is now accessible in Python, see
@ref{2410,,Emulating buffer types} and @ref{165,,memoryview}.


@menu
* 버퍼 구조체:: 
* 버퍼 요청 유형:: 
* 복잡한 배열:: 
* 버퍼 관련 함수:: 

@end menu

@node 버퍼 구조체,버퍼 요청 유형,,버퍼 프로토콜
@anchor{c-api/buffer buffer-structure}@anchor{52f7}@anchor{c-api/buffer id1}@anchor{52f8}
@subsubsection 버퍼 구조체


버퍼 구조체(또는 단순히 “버퍼”)는 다른 객체의 바이너리 데이터를 파이썬 프로그래머에게 노출하는 방법으로 유용합니다. 또한, 복사 없는(zero-copy) 슬라이싱 메커니즘으로 사용할 수 있습니다. 메모리 블록을 참조하는 능력을 사용해서, 임의의 데이터를 파이썬 프로그래머에게 아주 쉽게 노출할 수 있습니다. 메모리는 C 확장의 큰 상수 배열일 수 있으며, 운영 체제 라이브러리로 전달되기 전에 조작하기 위한 원시 메모리 블록일 수도 있고, 네이티브 인 메모리(in-memory) 형식으로 구조화된 데이터를 전달하는 데 사용될 수도 있습니다.

파이썬 인터프리터가 노출하는 대부분의 데이터형과 달리, 버퍼는 @ref{5dc,,PyObject} 포인터가 아니라 단순한 C 구조체입니다. 이를 통해 매우 간단하게 만들고 복사할 수 있습니다. 버퍼를 감싸는 일반 래퍼가 필요할 때는, @ref{52f9,,메모리 뷰} 객체를 만들 수 있습니다.

제공하는(exporting) 객체를 작성하는 간단한 지침은 @ref{52f6,,버퍼 객체 구조체}를 참조하십시오. 버퍼를 얻으려면, @ref{638,,PyObject_GetBuffer()}를 참조하십시오.

@geindex Py_buffer (C type)
@anchor{c-api/buffer c Py_buffer}@anchor{95b}
@deffn {C 자료형} type Py_buffer
` Part of the @ref{774,,안정 ABI} (including all members) 버전 3.11 이후로.'
@geindex Py_buffer.buf (C member)
@anchor{c-api/buffer c Py_buffer buf}@anchor{52fa}
@deffn {C 멤버 변수} void *buf

버퍼 필드에 의해 기술된 논리적 구조의 시작을 가리키는 포인터. 이것은 제공자(exporter)의 하부 물리적 메모리 블록 내의 모든 위치일 수 있습니다. 예를 들어, 음의 @ref{52fb,,strides}를 사용하면 값이 메모리 블록의 끝을 가리킬 수 있습니다.

@ref{2689,,연속} 배열의 경우, 값은 메모리 블록의 시작을 가리킵니다.
@end deffn

@geindex Py_buffer.obj (C member)
@anchor{c-api/buffer c Py_buffer obj}@anchor{52fc}
@deffn {C 멤버 변수} @ref{5dc,,PyObject} *obj

제공하는(exporting) 객체에 대한 새 참조. 참조는 소비자가 소유하고, @ref{639,,PyBuffer_Release()}에 의해 자동으로 해제되고 (즉 참조 횟수가 감소합니다) @code{NULL}로 설정됩니다. 이 필드는 표준 C-API 함수의 반환 값과 동등합니다.

특수한 경우로, @ref{964,,PyMemoryView_FromBuffer()} 나 @ref{963,,PyBuffer_FillInfo()}로 감싸진 `임시(temporary)' 버퍼의 경우, 이 필드는 @code{NULL}입니다. 일반적으로, 제공하는(exporting) 객체는 이 체계를 사용하지 않아야 합니다.
@end deffn

@geindex Py_buffer.len (C member)
@anchor{c-api/buffer c Py_buffer len}@anchor{52fd}
@deffn {C 멤버 변수} @ref{c54,,Py_ssize_t} len

@code{product(shape) * itemsize}. 연속 배열의 경우, 하부 메모리 블록의 길이입니다. 불연속 배열의 경우, 연속 표현으로 복사된다면 논리적 구조체가 갖게 될 길이입니다.

@code{((char *)buf)[0] 에서 ((char *)buf)[len-1]} 범위의 액세스는 연속성을 보장하는 요청으로 버퍼가 확보된 경우에만 유효합니다. 대부분 이러한 요청은 @ref{4fb0,,PyBUF_SIMPLE} 또는 @ref{15ba,,PyBUF_WRITABLE}입니다.
@end deffn

@geindex Py_buffer.readonly (C member)
@anchor{c-api/buffer c Py_buffer readonly}@anchor{52fe}
@deffn {C 멤버 변수} int readonly

버퍼가 읽기 전용인지를 나타내는 표시기입니다. 이 필드는 @ref{15ba,,PyBUF_WRITABLE} 플래그로 제어됩니다.
@end deffn

@geindex Py_buffer.itemsize (C member)
@anchor{c-api/buffer c Py_buffer itemsize}@anchor{52ff}
@deffn {C 멤버 변수} @ref{c54,,Py_ssize_t} itemsize

단일 요소의 항목 크기(바이트)입니다. @code{NULL}이 아닌 @ref{5300,,format} 값에 호출된 @ref{1da6,,struct.calcsize()} 값과 같습니다.

중요한 예외: 소비자가 @ref{4fa8,,PyBUF_FORMAT} 플래그 없이 버퍼를 요청하면, @ref{5300,,format}은 @code{NULL}로 설정되지만, @ref{52ff,,itemsize}는 여전히 원래 형식의 값을 갖습니다.

@ref{5301,,shape}이 있으면, @code{product(shape) * itemsize == len} 동치가 계속 성립하고 소비자는 @ref{52ff,,itemsize}를 사용하여 버퍼를 탐색할 수 있습니다.

@ref{4fb0,,PyBUF_SIMPLE} 이나 @ref{15ba,,PyBUF_WRITABLE} 요청의 결과로 @ref{5301,,shape}이 @code{NULL}이면, 소비자는 @ref{52ff,,itemsize}를 무시하고 @code{itemsize == 1}로 가정해야 합니다.
@end deffn

@geindex Py_buffer.format (C member)
@anchor{c-api/buffer c Py_buffer format}@anchor{5300}
@deffn {C 멤버 변수} char *format

단일 항목의 내용을 설명하는 @ref{db,,struct} 모듈 스타일 문법의 `NULL' 종료 문자열. 이것이 @code{NULL}이면, @code{"B"}(부호 없는 바이트)를 가정합니다.

이 필드는 @ref{4fa8,,PyBUF_FORMAT} 플래그로 제어됩니다.
@end deffn

@geindex Py_buffer.ndim (C member)
@anchor{c-api/buffer c Py_buffer ndim}@anchor{5302}
@deffn {C 멤버 변수} int ndim

메모리가 n 차원 배열로 나타내는 차원 수. @code{0}이면, @ref{52fa,,buf}는 스칼라를 나타내는 단일 항목을 가리 킵니다. 이 경우, @ref{5301,,shape}, @ref{52fb,,strides} 및 @ref{5303,,suboffsets}는 반드시 @code{NULL} 이어야 합니다. 최대 차원 수는 @ref{4fac,,PyBUF_MAX_NDIM}으로 지정됩니다.
@end deffn

@geindex Py_buffer.shape (C member)
@anchor{c-api/buffer c Py_buffer shape}@anchor{5301}
@deffn {C 멤버 변수} @ref{c54,,Py_ssize_t} *shape

n-차원 배열로 메모리의 모양을 나타내는 길이 @ref{5302,,ndim}의 @ref{c54,,Py_ssize_t} 배열. @code{shape[0] * ... * shape[ndim-1] * itemsize}는 @ref{52fd,,len}과 같아야 합니다.

모양 값은 @code{shape[n] >= 0}로 제한됩니다. @code{shape[n] == 0}인 경우는 특별한 주의가 필요합니다. 자세한 정보는 @ref{5304,,복잡한 배열}을 참조하십시오.

shape 배열은 소비자에게 읽기 전용입니다.
@end deffn

@geindex Py_buffer.strides (C member)
@anchor{c-api/buffer c Py_buffer strides}@anchor{52fb}
@deffn {C 멤버 변수} @ref{c54,,Py_ssize_t} *strides

각 차원에서 새 요소를 가져오기 위해 건너뛸 바이트 수를 제공하는 길이 @ref{5302,,ndim}의 @ref{c54,,Py_ssize_t} 배열.

스트라이드 값은 임의의 정수일 수 있습니다. 일반 배열의 경우, 스트라이드는 보통 양수이지만, 소비자는 @code{strides[n] <= 0}인 경우를 처리할 수 있어야 합니다. 자세한 내용은 @ref{5304,,복잡한 배열}을 참조하십시오.

strides 배열은 소비자에게 읽기 전용입니다.
@end deffn

@geindex Py_buffer.suboffsets (C member)
@anchor{c-api/buffer c Py_buffer suboffsets}@anchor{5303}
@deffn {C 멤버 변수} @ref{c54,,Py_ssize_t} *suboffsets

길이 @ref{5302,,ndim}의 @ref{c54,,Py_ssize_t} 배열. @code{suboffsets[n] >= 0} 면, n 번째 차원을 따라 저장된 값은 포인터이고 서브 오프셋 값은 역참조(de-referencing) 후 각 포인터에 더할 바이트 수를 나타냅니다. 음의 서브 오프셋 값은 역참조(de-referencing)가 발생하지 않아야 함을 나타냅니다 (연속 메모리 블록에서의 스트라이드).

모든 서브 오프셋이 음수면 (즉, 역참조가 필요하지 않으면), 이 필드는 @code{NULL}(기본값) 이어야 합니다.

이 유형의 배열 표현은 파이썬 이미징 라이브러리(PIL)에서 사용됩니다. 이러한 배열 요소에 액세스하는 방법에 대한 자세한 내용은 @ref{5304,,복잡한 배열}을 참조하십시오.

suboffsets 배열은 소비자에게 읽기 전용입니다.
@end deffn

@geindex Py_buffer.internal (C member)
@anchor{c-api/buffer c Py_buffer internal}@anchor{5305}
@deffn {C 멤버 변수} void *internal

이것은 제공하는(exporting) 객체에 의해 내부적으로 사용됩니다. 예를 들어, 이것은 제공자(exporter)가 정수로 다시 캐스팅할 수 있으며, 버퍼가 해제될 때 shape, strides 및 suboffsets 배열을 해제해야 하는지에 대한 플래그를 저장하는 데 사용됩니다. 소비자가 이 값을 변경해서는 안 됩니다.
@end deffn
@end deffn

상수:

@geindex PyBUF_MAX_NDIM (C macro)
@anchor{c-api/buffer c PyBUF_MAX_NDIM}@anchor{4fac}
@deffn {C 매크로} PyBUF_MAX_NDIM
` Part of the @ref{774,,안정 ABI} 버전 3.11 이후로.'
메모리가 나타내는 최대 차원 수 입니다. 제공자는 이 제한을 존중해야 하며, 다차원 버퍼의 소비자는 @code{PyBUF_MAX_NDIM} 차원까지 처리할 수 있어야 합니다. 현재 64로 설정되었습니다.
@end deffn

@node 버퍼 요청 유형,복잡한 배열,버퍼 구조체,버퍼 프로토콜
@anchor{c-api/buffer buffer-request-types}@anchor{4a9c}@anchor{c-api/buffer id2}@anchor{5306}
@subsubsection 버퍼 요청 유형


버퍼는 대개 @ref{638,,PyObject_GetBuffer()}를 통해 제공하는(exporting) 객체로 버퍼 요청을 보내서 얻습니다. 메모리의 논리적 구조의 복잡성이 크게 다를 수 있으므로, 소비자는 처리할 수 있는 정확한 버퍼 유형을 지정하기 위해 `flags' 인자를 사용합니다.

모든 @ref{95b,,Py_buffer} 필드는 요청 유형에 의해 모호하지 않게 정의됩니다.

@menu
* 요청 독립적 필드:: 
* readonly@comma{} format: readonly format. 
* shape@comma{} strides@comma{} suboffsets: shape strides suboffsets. 
* 연속성 요청:: 
* 복합 요청:: 

@end menu

@node 요청 독립적 필드,readonly format,,버퍼 요청 유형
@anchor{c-api/buffer request-independent-fields}@anchor{5307}
@subsubsection 요청 독립적 필드


다음 필드는 `flags'의 영향을 받지 않고 항상 올바른 값으로 채워져야 합니다: @ref{52fc,,obj}, @ref{52fa,,buf}, @ref{52fd,,len}, @ref{52ff,,itemsize}, @ref{5302,,ndim}.

@node readonly format,shape strides suboffsets,요청 독립적 필드,버퍼 요청 유형
@anchor{c-api/buffer readonly-format}@anchor{5308}
@subsubsection readonly, format


@quotation

@geindex PyBUF_WRITABLE (C macro)
@anchor{c-api/buffer c PyBUF_WRITABLE}@anchor{15ba}
@deffn {C 매크로} PyBUF_WRITABLE
` Part of the @ref{774,,안정 ABI} 버전 3.11 이후로.'
@ref{52fe,,readonly} 필드를 제어합니다. 설정되면, 제공자는 반드시 쓰기 가능한 버퍼를 제공하거나 실패를 보고해야 합니다. 그렇지 않으면, 제공자는 읽기 전용 버퍼나 쓰기 가능 버퍼를 제공할 수 있지만, 모든 소비자에 대해 일관성을 유지해야 합니다. 예를 들어, 간단한 쓰기 가능 버퍼를 요청하려면 @ref{4fb0,,PyBUF_SIMPLE} | @ref{15ba,,PyBUF_WRITABLE}을 사용할 수 있습니다.
@end deffn

@geindex PyBUF_WRITEABLE (C macro)
@anchor{c-api/buffer c PyBUF_WRITEABLE}@anchor{5309}
@deffn {C 매크로} PyBUF_WRITEABLE

This is a @ref{23d,,soft deprecated} alias to @ref{15ba,,PyBUF_WRITABLE}.
@end deffn

@geindex PyBUF_FORMAT (C macro)
@anchor{c-api/buffer c PyBUF_FORMAT}@anchor{4fa8}
@deffn {C 매크로} PyBUF_FORMAT
` Part of the @ref{774,,안정 ABI} 버전 3.11 이후로.'
@ref{5300,,format} 필드를 제어합니다. 설정되면, 이 필드를 올바르게 채워야 합니다. 그렇지 않으면, 이 필드는 반드시 @code{NULL} 이어야 합니다.
@end deffn
@end quotation

@ref{15ba,,PyBUF_WRITABLE}은 다음 섹션의 모든 플래그와 | 될 수 있습니다. @ref{4fb0,,PyBUF_SIMPLE}이 0으로 정의되므로, @code{PyBUF_WRITABLE}은 독립형 플래그로 사용되어 간단한 쓰기 가능한 버퍼를 요청할 수 있습니다.

@ref{4fa8,,PyBUF_FORMAT}은 @ref{4fb0,,PyBUF_SIMPLE}을 제외한 임의의 플래그와 | 되어야 합니다. PyBUF_SIMPLE 은 이미 형식 @code{B}(부호 없는 바이트)를 의미하기 때문입니다. @code{PyBUF_FORMAT}은 단독으로 사용할 수 없습니다.

@node shape strides suboffsets,연속성 요청,readonly format,버퍼 요청 유형
@anchor{c-api/buffer shape-strides-suboffsets}@anchor{530a}
@subsubsection shape, strides, suboffsets


메모리의 논리 구조를 제어하는 플래그는 복잡도가 감소하는 순서로 나열됩니다. 각 플래그는 그 아래에 있는 플래그의 모든 비트를 포함합니다.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxx} {xxxxxxxxxxx} {xxxxxxxxxxxxxx} 
@headitem

요청

@tab

shape

@tab

strides

@tab

suboffsets

@item

@geindex PyBUF_INDIRECT (C macro)
@anchor{c-api/buffer c PyBUF_INDIRECT}@anchor{4fab}
@deffn {C 매크로} PyBUF_INDIRECT
` Part of the @ref{774,,안정 ABI} 버전 3.11 이후로.'
@end deffn

@tab

yes

@tab

yes

@tab

필요하면

@item

@geindex PyBUF_STRIDES (C macro)
@anchor{c-api/buffer c PyBUF_STRIDES}@anchor{4fb3}
@deffn {C 매크로} PyBUF_STRIDES
` Part of the @ref{774,,안정 ABI} 버전 3.11 이후로.'
@end deffn

@tab

yes

@tab

yes

@tab

NULL

@item

@geindex PyBUF_ND (C macro)
@anchor{c-api/buffer c PyBUF_ND}@anchor{4fad}
@deffn {C 매크로} PyBUF_ND
` Part of the @ref{774,,안정 ABI} 버전 3.11 이후로.'
@end deffn

@tab

yes

@tab

NULL

@tab

NULL

@item

@geindex PyBUF_SIMPLE (C macro)
@anchor{c-api/buffer c PyBUF_SIMPLE}@anchor{4fb0}
@deffn {C 매크로} PyBUF_SIMPLE
` Part of the @ref{774,,안정 ABI} 버전 3.11 이후로.'
@end deffn

@tab

NULL

@tab

NULL

@tab

NULL

@end multitable


@geindex 연속
@geindex C-연속
@geindex 포트란 연속

@node 연속성 요청,복합 요청,shape strides suboffsets,버퍼 요청 유형
@anchor{c-api/buffer contiguity-requests}@anchor{530b}
@subsubsection 연속성 요청


C 나 포트란 @ref{2689,,연속성}을 명시적으로 요청할 수 있는데, 스트라이드 정보를 포함하기도 그렇지 않기도 합니다. 스트라이드 정보가 없으면, 버퍼는 C-연속이어야 합니다.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxx} {xxxxxxxxxxx} {xxxxxxxxxxxxxx} {xxxxxxxxxx} 
@headitem

요청

@tab

shape

@tab

strides

@tab

suboffsets

@tab

연속성

@item

@geindex PyBUF_C_CONTIGUOUS (C macro)
@anchor{c-api/buffer c PyBUF_C_CONTIGUOUS}@anchor{15bb}
@deffn {C 매크로} PyBUF_C_CONTIGUOUS
` Part of the @ref{774,,안정 ABI} 버전 3.11 이후로.'
@end deffn

@tab

yes

@tab

yes

@tab

NULL

@tab

C

@item

@geindex PyBUF_F_CONTIGUOUS (C macro)
@anchor{c-api/buffer c PyBUF_F_CONTIGUOUS}@anchor{15bc}
@deffn {C 매크로} PyBUF_F_CONTIGUOUS
` Part of the @ref{774,,안정 ABI} 버전 3.11 이후로.'
@end deffn

@tab

yes

@tab

yes

@tab

NULL

@tab

F

@item

@geindex PyBUF_ANY_CONTIGUOUS (C macro)
@anchor{c-api/buffer c PyBUF_ANY_CONTIGUOUS}@anchor{4fa5}
@deffn {C 매크로} PyBUF_ANY_CONTIGUOUS
` Part of the @ref{774,,안정 ABI} 버전 3.11 이후로.'
@end deffn

@tab

yes

@tab

yes

@tab

NULL

@tab

C 또는 F

@item

@ref{4fad,,PyBUF_ND}

@tab

yes

@tab

NULL

@tab

NULL

@tab

C

@end multitable


@node 복합 요청,,연속성 요청,버퍼 요청 유형
@anchor{c-api/buffer compound-requests}@anchor{530c}
@subsubsection 복합 요청


모든 가능한 요청은 앞 절의 플래그 조합에 의해 완전히 정의됩니다. 편의상, 버퍼 프로토콜은 자주 사용되는 조합을 단일 플래그로 제공합니다.

다음 표에서 `U'는 정의되지 않은 연속성을 나타냅니다. 소비자는 연속성을 판단하기 위해 @ref{961,,PyBuffer_IsContiguous()}를 호출해야 합니다.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxx} {xxxxxxxxxxx} {xxxxxxxxxxxxxx} {xxxxxxxxxx} {xxxxxxxxxxxx} {xxxxxxxxxx} 
@headitem

요청

@tab

shape

@tab

strides

@tab

suboffsets

@tab

연속성

@tab

readonly

@tab

format

@item

@geindex PyBUF_FULL (C macro)
@anchor{c-api/buffer c PyBUF_FULL}@anchor{4fa9}
@deffn {C 매크로} PyBUF_FULL
` Part of the @ref{774,,안정 ABI} 버전 3.11 이후로.'
@end deffn

@tab

yes

@tab

yes

@tab

필요하면

@tab

U

@tab

0

@tab

yes

@item

@geindex PyBUF_FULL_RO (C macro)
@anchor{c-api/buffer c PyBUF_FULL_RO}@anchor{4faa}
@deffn {C 매크로} PyBUF_FULL_RO
` Part of the @ref{774,,안정 ABI} 버전 3.11 이후로.'
@end deffn

@tab

yes

@tab

yes

@tab

필요하면

@tab

U

@tab

1 또는 0

@tab

yes

@item

@geindex PyBUF_RECORDS (C macro)
@anchor{c-api/buffer c PyBUF_RECORDS}@anchor{4fae}
@deffn {C 매크로} PyBUF_RECORDS
` Part of the @ref{774,,안정 ABI} 버전 3.11 이후로.'
@end deffn

@tab

yes

@tab

yes

@tab

NULL

@tab

U

@tab

0

@tab

yes

@item

@geindex PyBUF_RECORDS_RO (C macro)
@anchor{c-api/buffer c PyBUF_RECORDS_RO}@anchor{4faf}
@deffn {C 매크로} PyBUF_RECORDS_RO
` Part of the @ref{774,,안정 ABI} 버전 3.11 이후로.'
@end deffn

@tab

yes

@tab

yes

@tab

NULL

@tab

U

@tab

1 또는 0

@tab

yes

@item

@geindex PyBUF_STRIDED (C macro)
@anchor{c-api/buffer c PyBUF_STRIDED}@anchor{4fb1}
@deffn {C 매크로} PyBUF_STRIDED
` Part of the @ref{774,,안정 ABI} 버전 3.11 이후로.'
@end deffn

@tab

yes

@tab

yes

@tab

NULL

@tab

U

@tab

0

@tab

NULL

@item

@geindex PyBUF_STRIDED_RO (C macro)
@anchor{c-api/buffer c PyBUF_STRIDED_RO}@anchor{4fb2}
@deffn {C 매크로} PyBUF_STRIDED_RO
` Part of the @ref{774,,안정 ABI} 버전 3.11 이후로.'
@end deffn

@tab

yes

@tab

yes

@tab

NULL

@tab

U

@tab

1 또는 0

@tab

NULL

@item

@geindex PyBUF_CONTIG (C macro)
@anchor{c-api/buffer c PyBUF_CONTIG}@anchor{4fa6}
@deffn {C 매크로} PyBUF_CONTIG
` Part of the @ref{774,,안정 ABI} 버전 3.11 이후로.'
@end deffn

@tab

yes

@tab

NULL

@tab

NULL

@tab

C

@tab

0

@tab

NULL

@item

@geindex PyBUF_CONTIG_RO (C macro)
@anchor{c-api/buffer c PyBUF_CONTIG_RO}@anchor{4fa7}
@deffn {C 매크로} PyBUF_CONTIG_RO
` Part of the @ref{774,,안정 ABI} 버전 3.11 이후로.'
@end deffn

@tab

yes

@tab

NULL

@tab

NULL

@tab

C

@tab

1 또는 0

@tab

NULL

@end multitable


@node 복잡한 배열,버퍼 관련 함수,버퍼 요청 유형,버퍼 프로토콜
@anchor{c-api/buffer complex-arrays}@anchor{5304}
@subsubsection 복잡한 배열


@menu
* NumPy-스타일; shape과 strides: NumPy-스타일 shape과 strides. 
* PIL-스타일; shape@comma{} strides 및 suboffsets: PIL-스타일 shape strides 및 suboffsets. 

@end menu

@node NumPy-스타일 shape과 strides,PIL-스타일 shape strides 및 suboffsets,,복잡한 배열
@anchor{c-api/buffer numpy-style-shape-and-strides}@anchor{530d}
@subsubsection NumPy-스타일: shape과 strides


NumPy 스타일 배열의 논리적 구조는 @ref{52ff,,itemsize}, @ref{5302,,ndim}, @ref{5301,,shape} 및 @ref{52fb,,strides}로 정의됩니다.

@code{ndim == 0}이면, @ref{52fa,,buf}가 가리키는 메모리 위치가 @ref{52ff,,itemsize} 크기의 스칼라로 해석됩니다. 이 경우, @ref{5301,,shape} 과 @ref{52fb,,strides}는 모두 @code{NULL}입니다.

@ref{52fb,,strides}가 @code{NULL}이면, 배열은 표준 n-차원 C 배열로 해석됩니다. 그렇지 않으면, 소비자는 다음과 같이 n-차원 배열에 액세스해야 합니다:

@example
ptr = (char *)buf + indices[0] * strides[0] + ... + indices[n-1] * strides[n-1];
item = *((typeof(item) *)ptr);
@end example

위에서 언급했듯이, @ref{52fa,,buf}는 실제 메모리 블록 내의 모든 위치를 가리킬 수 있습니다. 제공자(exporter)는 이 함수로 버퍼의 유효성을 검사 할 수 있습니다:

@example
def verify_structure(memlen, itemsize, ndim, shape, strides, offset):
    """매개 변수가 할당된 메모리 범위 내에서 유효한 배열을 나타내는지 확인합니다:
           char *mem: 물리적 메모리 블록의 시작
           memlen: 물리적 메모리 블록의 길이
           offset: (char *)buf - mem
    """
    if offset % itemsize:
        return False
    if offset < 0 or offset+itemsize > memlen:
        return False
    if any(v % itemsize for v in strides):
        return False

    if ndim <= 0:
        return ndim == 0 and not shape and not strides
    if 0 in shape:
        return True

    imin = sum(strides[j]*(shape[j]-1) for j in range(ndim)
               if strides[j] <= 0)
    imax = sum(strides[j]*(shape[j]-1) for j in range(ndim)
               if strides[j] > 0)

    return 0 <= offset+imin and offset+imax+itemsize <= memlen
@end example

@node PIL-스타일 shape strides 및 suboffsets,,NumPy-스타일 shape과 strides,복잡한 배열
@anchor{c-api/buffer pil-style-shape-strides-and-suboffsets}@anchor{530e}
@subsubsection PIL-스타일: shape, strides 및 suboffsets


일반 항목 외에도, PIL 스타일 배열에는 차원의 다음 요소를 가져오기 위해 따라야 하는 포인터가 포함될 수 있습니다. 예를 들어, 일반 3-차원 C 배열 @code{char v[2][2][3]}는 2개의 2-차원 배열을 가리키는 2개의 포인터 배열로 볼 수도 있습니다: @code{char (*v[2])[2][3]}. suboffsets 표현에서, 이 두 포인터는 @ref{52fa,,buf}의 시작 부분에 임베드 될 수 있는데, 메모리의 어느 위치 에나 배치될 수 있는 두 개의 @code{char x[2][3]} 배열을 가리킵니다.

다음은 @code{NULL}이 아닌 strides와 suboffsets가 있을 때, N-차원 인덱스가 가리키는 N-차원 배열의 요소에 대한 포인터를 반환하는 함수입니다:

@example
void *get_item_pointer(int ndim, void *buf, Py_ssize_t *strides,
                       Py_ssize_t *suboffsets, Py_ssize_t *indices) @{
    char *pointer = (char*)buf;
    int i;
    for (i = 0; i < ndim; i++) @{
        pointer += strides[i] * indices[i];
        if (suboffsets[i] >=0 ) @{
            pointer = *((char**)pointer) + suboffsets[i];
        @}
    @}
    return (void*)pointer;
@}
@end example

@node 버퍼 관련 함수,,복잡한 배열,버퍼 프로토콜
@anchor{c-api/buffer buffer-related-functions}@anchor{530f}
@subsubsection 버퍼 관련 함수


@geindex PyObject_CheckBuffer (C function)
@anchor{c-api/buffer c PyObject_CheckBuffer}@anchor{637}
@deffn {C 함수} int PyObject_CheckBuffer (PyObject *obj)
` Part of the @ref{774,,안정 ABI} 버전 3.11 이후로.'
`obj'가 버퍼 인터페이스를 지원하면 @code{1}을 반환하고, 그렇지 않으면 @code{0}을 반환합니다. @code{1}이 반환될 때, @ref{638,,PyObject_GetBuffer()}가 성공할 것이라고 보장하지는 않습니다. 이 함수는 항상 성공합니다.
@end deffn

@geindex PyObject_GetBuffer (C function)
@anchor{c-api/buffer c PyObject_GetBuffer}@anchor{638}
@deffn {C 함수} int PyObject_GetBuffer (PyObject *exporter, Py_buffer *view, int flags)
` Part of the @ref{774,,안정 ABI} 버전 3.11 이후로.'
`flags'에 지정된 대로 `view'를 채우도록 `exporter'에게 요청을 보냅니다. 제공자(exporter)가 정확한 유형의 버퍼를 제공할 수 없다면, @ref{179f,,BufferError}를 일으키고, @code{view->obj}를 @code{NULL}로 설정하고, @code{-1}를 반환해야 합니다.

성공하면, `view'를 채우고, @code{view->obj}를 `exporter'에 대한 새 참조로 설정하고, 0을 반환합니다. 요청을 단일 객체로 리디렉션하는 연결된(chained) 버퍼 공급자의 경우, @code{view->obj}는 `exporter' 대신 이 객체를 참조할 수 있습니다 (@ref{52f6,,버퍼 객체 구조체}를 보세요).

@ref{638,,PyObject_GetBuffer()}에 대한 성공적인 호출은 @ref{639,,PyBuffer_Release()}에 대한 호출과 쌍을 이루어야 합니다, @code{malloc()}과 @code{free()}와 유사합니다. 따라서, 소비자가 버퍼로 작업한 후에는, @code{PyBuffer_Release()}를 정확히 한 번 호출해야 합니다.
@end deffn

@geindex PyBuffer_Release (C function)
@anchor{c-api/buffer c PyBuffer_Release}@anchor{639}
@deffn {C 함수} void PyBuffer_Release (Py_buffer *view)
` Part of the @ref{774,,안정 ABI} 버전 3.11 이후로.'
버퍼 `view'를 해제하고 뷰의 지원 객체인 @code{view->obj}에 대한 @ref{5df,,강한 참조}를 해제합니다 (즉 참조 횟수를 감소시킵니다). 버퍼가 더는 사용되지 않을 때, 이 함수를 반드시 호출해야 합니다. 그렇지 않으면 참조 누수가 발생할 수 있습니다.

@ref{638,,PyObject_GetBuffer()}를 통해 얻지 않은 버퍼에 이 함수를 호출하는 것은 에러입니다.
@end deffn

@geindex PyBuffer_SizeFromFormat (C function)
@anchor{c-api/buffer c PyBuffer_SizeFromFormat}@anchor{95d}
@deffn {C 함수} @ref{c54,,Py_ssize_t} PyBuffer_SizeFromFormat (const char *format)
` Part of the @ref{774,,안정 ABI} 버전 3.11 이후로.'
@ref{5300,,format}이 암시하는 @ref{52ff,,itemsize}를 반환합니다. 에러가 발생하면, 예외를 발생시키고 -1을 반환합니다.


Added in version 3.9.

@end deffn

@geindex PyBuffer_IsContiguous (C function)
@anchor{c-api/buffer c PyBuffer_IsContiguous}@anchor{961}
@deffn {C 함수} int PyBuffer_IsContiguous (const Py_buffer *view, char order)
` Part of the @ref{774,,안정 ABI} 버전 3.11 이후로.'
`view'로 정의된 메모리가 C 스타일(`order'가 @code{'C'})이나 포트란 스타일(`order'가 @code{'F'}) @ref{2689,,연속}이거나 둘 중 하나(`order'가 @code{'A'})면 @code{1}을 반환합니다. 그렇지 않으면 @code{0}을 반환합니다. 이 함수는 항상 성공합니다.
@end deffn

@geindex PyBuffer_GetPointer (C function)
@anchor{c-api/buffer c PyBuffer_GetPointer}@anchor{95c}
@deffn {C 함수} void *PyBuffer_GetPointer (const Py_buffer *view, const Py_ssize_t *indices)
` Part of the @ref{774,,안정 ABI} 버전 3.11 이후로.'
주어진 `view' 내부의 `indices'가 가리키는 메모리 영역을 가져옵니다. `indices'는 @code{view->ndim} 인덱스의 배열을 가리켜야 합니다.
@end deffn

@geindex PyBuffer_FromContiguous (C function)
@anchor{c-api/buffer c PyBuffer_FromContiguous}@anchor{95f}
@deffn {C 함수} int PyBuffer_FromContiguous (const Py_buffer *view, const void *buf, Py_ssize_t len, char fort)
` Part of the @ref{774,,안정 ABI} 버전 3.11 이후로.'
`buf'에 있는 연속된 `len' 바이트를 `view'로 복사합니다. `fort'는 @code{'C'} 또는 @code{'F'}(C 스타일 또는 포트란 스타일 순서)일 수 있습니다. 성공하면 @code{0}이 반환되고, 에러가 있으면 @code{-1}이 반환됩니다.
@end deffn

@geindex PyBuffer_ToContiguous (C function)
@anchor{c-api/buffer c PyBuffer_ToContiguous}@anchor{95e}
@deffn {C 함수} int PyBuffer_ToContiguous (void *buf, const Py_buffer *src, Py_ssize_t len, char order)
` Part of the @ref{774,,안정 ABI} 버전 3.11 이후로.'
`src'에 있는 `len' 바이트를 `buf'에 연속 표현으로 복사합니다. `order'는 @code{'C'} 또는 @code{'F'} 또는 @code{'A'}(C 스타일 또는 포트란 스타일 순서 또는 둘 중 하나)일 수 있습니다. 성공하면 @code{0}이 반환되고, 에러가 있으면 @code{-1}이 반환됩니다.

이 함수는 `len' != `src->len'이면 실패합니다.
@end deffn

@geindex PyObject_CopyData (C function)
@anchor{c-api/buffer c PyObject_CopyData}@anchor{960}
@deffn {C 함수} int PyObject_CopyData (PyObject *dest, PyObject *src)
` Part of the @ref{774,,안정 ABI} 버전 3.11 이후로.'
Copy data from `src' to `dest' buffer. Can convert between C-style and
or Fortran-style buffers.

@code{0} is returned on success, @code{-1} on error.
@end deffn

@geindex PyBuffer_FillContiguousStrides (C function)
@anchor{c-api/buffer c PyBuffer_FillContiguousStrides}@anchor{962}
@deffn {C 함수} void PyBuffer_FillContiguousStrides (int ndims, Py_ssize_t *shape, Py_ssize_t *strides, int itemsize, char order)
` Part of the @ref{774,,안정 ABI} 버전 3.11 이후로.'
`strides' 배열을 주어진 요소당 바이트 수와 주어진 shape 으로 @ref{2689,,연속} (`order'가 @code{'C'}면 C 스타일, `order'가 @code{'F'}면 포트란 스타일) 배열의 바이트 스트라이드로 채웁니다.
@end deffn

@geindex PyBuffer_FillInfo (C function)
@anchor{c-api/buffer c PyBuffer_FillInfo}@anchor{963}
@deffn {C 함수} int PyBuffer_FillInfo (Py_buffer *view, PyObject *exporter, void *buf, Py_ssize_t len, int readonly, int flags)
` Part of the @ref{774,,안정 ABI} 버전 3.11 이후로.'
`readonly'에 따라 쓰기 가능성이 설정된 `len' 크기의 `buf'를 노출하려는 제공자(exporter)에 대한 버퍼 요청을 처리합니다. `buf'는 부호 없는 바이트의 시퀀스로 해석됩니다.

`flags' 인자는 요청 유형을 나타냅니다. 이 함수는 `buf'가 읽기 전용으로 지정되고 @ref{15ba,,PyBUF_WRITABLE}이 `flags'에 설정되어 있지 않으면, 항상 플래그가 지정하는 대로 `view'를 채웁니다.

성공하면, @code{view->obj}를 `exporter'에 대한 새 참조로 설정하고, 0을 반환합니다. 그렇지 않으면, @ref{179f,,BufferError}를 일으키고, @code{view->obj}를 @code{NULL}로 설정한 다음 @code{-1}을 반환합니다.

이 함수가 @ref{52f6,,getbufferproc}의 일부로 사용되면, `exporter'가 제공하는(exporting) 객체로 설정되어야 하고, `flags'는 수정되지 않은 채로 전달되어야 합니다. 그렇지 않으면 `exporter'가 @code{NULL}이어야 합니다.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 구상 객체 계층,Interpreter initialization and finalization,추상 객체 계층,Python/C API reference manual
@anchor{c-api/concrete doc}@anchor{5310}@anchor{c-api/concrete concrete}@anchor{5311}@anchor{c-api/concrete concrete-objects-layer}@anchor{5312}@anchor{c-api/concrete translation-repo}@anchor{5313}
@section 구상 객체 계층


이 장의 함수는 특정 파이썬 객체 형에게만 적용됩니다. 그들에게 잘못된 형의 객체를 전달하는 것은 좋은 생각이 아닙니다; 파이썬 프로그램에서 객체를 받았는데 올바른 형을 가졌는지 확실하지 않다면, 먼저 형 검사를 수행해야 합니다; 예를 들어, 객체가 딕셔너리인지 확인하려면, @ref{5314,,PyDict_Check()}를 사용하십시오. 이 장은 파이썬 객체 형의 “족보”처럼 구성되어 있습니다.

@cartouche
@quotation 경고 
이 장에서 설명하는 함수는 전달되는 객체의 형을 주의 깊게 검사하지만, 많은 함수는 유효한 객체 대신 전달되는 @code{NULL}을 확인하지 않습니다. @code{NULL}을 전달하면 메모리 액세스 위반이 발생하고 인터프리터가 즉시 종료될 수 있습니다.
@end quotation
@end cartouche

@menu
* 기본 객체:: 
* 숫자 객체:: 
* 시퀀스 객체:: 
* 컨테이너 객체:: 
* 함수 객체:: 
* 기타 객체: 기타 객체<2>. 
* C API for extension modules:: 

@end menu

@node 기본 객체,숫자 객체,,구상 객체 계층
@anchor{c-api/concrete fundamental}@anchor{5315}@anchor{c-api/concrete fundamental-objects}@anchor{5316}
@subsection 기본 객체


이 절에서는 파이썬 형 객체와 싱글톤 객체 @code{None}에 대해 설명합니다.

@menu
* 형 객체: 형 객체<2>. 
* None 객체:: 

@end menu

@node 형 객체<2>,None 객체,,기본 객체
@anchor{c-api/type doc}@anchor{5317}@anchor{c-api/type type-objects}@anchor{5318}@anchor{c-api/type typeobjects}@anchor{5319}
@subsubsection 형 객체


@geindex 객체;형

@geindex PyTypeObject (C type)
@anchor{c-api/type c PyTypeObject}@anchor{c9b}
@deffn {C 자료형} type PyTypeObject
` Part of the @ref{774,,제한된 API} (as an opaque struct).'
내장형을 기술하는 데 사용되는 객체의 C 구조체.
@end deffn

@geindex PyType_Type (C var)
@anchor{c-api/type c PyType_Type}@anchor{76e}
@deffn {C 변수} @ref{c9b,,PyTypeObject} PyType_Type
` Part of the @ref{774,,안정 ABI}.'
이것은 형 객체의 형 객체입니다; 파이썬 계층의 @ref{f43,,type}과 같은 객체입니다.
@end deffn

@geindex PyType_Check (C function)
@anchor{c-api/type c PyType_Check}@anchor{1d85}
@deffn {C 함수} int PyType_Check (PyObject *o)

객체 `o'가 표준형 객체에서 파생된 형의 인스턴스를 포함하여 형 객체면 0이 아닌 값을 반환합니다. 다른 모든 경우 0을 반환합니다. 이 함수는 항상 성공합니다.
@end deffn

@geindex PyType_CheckExact (C function)
@anchor{c-api/type c PyType_CheckExact}@anchor{1d86}
@deffn {C 함수} int PyType_CheckExact (PyObject *o)

객체 `o'가 형 객체이지만, 표준형 객체의 서브 형이 아니면 0이 아닌 값을 반환합니다. 다른 모든 경우 0을 반환합니다. 이 함수는 항상 성공합니다.
@end deffn

@geindex PyType_ClearCache (C function)
@anchor{c-api/type c PyType_ClearCache}@anchor{5119}
@deffn {C 함수} unsigned int PyType_ClearCache ()
` Part of the @ref{774,,안정 ABI}.'
내부 조회 캐시를 지웁니다. 현재의 버전 태그를 반환합니다.
@end deffn

@geindex PyType_GetFlags (C function)
@anchor{c-api/type c PyType_GetFlags}@anchor{1d3a}
@deffn {C 함수} unsigned long PyType_GetFlags (PyTypeObject *type)
` Part of the @ref{774,,안정 ABI}.'
`type'의 @ref{1c6f,,tp_flags} 멤버를 반환합니다. 이 함수는 주로 @code{Py_LIMITED_API}와 함께 사용하기 위한 것입니다; 개별 플래그 비트는 파이썬 배포 간에 안정적인 것으로 보장되지만, @code{tp_flags} 자체에 대한 액세스는 @ref{635,,제한된 API} 일부가 아닙니다.


Added in version 3.2.



버전 3.4에서 변경: 반환형은 이제 @code{long}이 아니라 @code{unsigned long}입니다.

@end deffn

@geindex PyType_GetDict (C function)
@anchor{c-api/type c PyType_GetDict}@anchor{1a8b}
@deffn {C 함수} @ref{5dc,,PyObject} *PyType_GetDict (PyTypeObject *type)

Return the type object’s internal namespace, which is otherwise only
exposed via a read-only proxy (@ref{e56,,cls.__dict__}).
This is a
replacement for accessing @ref{1a8c,,tp_dict} directly.
The returned dictionary must be treated as read-only.

This function is meant for specific embedding and language-binding cases,
where direct access to the dict is necessary and indirect access
(e.g. via the proxy or @ref{5ec,,PyObject_GetAttr()}) isn’t adequate.

Extension modules should continue to use @code{tp_dict},
directly or indirectly, when setting up their own types.


Added in version 3.12.

@end deffn

@geindex PyType_Modified (C function)
@anchor{c-api/type c PyType_Modified}@anchor{1b79}
@deffn {C 함수} void PyType_Modified (PyTypeObject *type)
` Part of the @ref{774,,안정 ABI}.'
형과 그것의 모든 서브 형에 대한 내부 검색 캐시를 무효로 합니다. 형의 어트리뷰트나 베이스 클래스를 수동으로 수정한 후에는 이 함수를 호출해야 합니다.
@end deffn

@geindex PyType_AddWatcher (C function)
@anchor{c-api/type c PyType_AddWatcher}@anchor{784}
@deffn {C 함수} int PyType_AddWatcher (PyType_WatchCallback callback)

Register `callback' as a type watcher. Return a non-negative integer ID
which must be passed to future calls to @ref{785,,PyType_Watch()}. In case of
error (e.g. no more watcher IDs available), return @code{-1} and set an
exception.

In free-threaded builds, @ref{784,,PyType_AddWatcher()} is not thread-safe,
so it must be called at start up (before spawning the first thread).


Added in version 3.12.

@end deffn

@geindex PyType_ClearWatcher (C function)
@anchor{c-api/type c PyType_ClearWatcher}@anchor{531a}
@deffn {C 함수} int PyType_ClearWatcher (int watcher_id)

Clear watcher identified by `watcher_id' (previously returned from
@ref{784,,PyType_AddWatcher()}). Return @code{0} on success, @code{-1} on error (e.g.
if `watcher_id' was never registered.)

An extension should never call @code{PyType_ClearWatcher} with a `watcher_id'
that was not returned to it by a previous call to
@ref{784,,PyType_AddWatcher()}.


Added in version 3.12.

@end deffn

@geindex PyType_Watch (C function)
@anchor{c-api/type c PyType_Watch}@anchor{785}
@deffn {C 함수} int PyType_Watch (int watcher_id, PyObject *type)

Mark `type' as watched. The callback granted `watcher_id' by
@ref{784,,PyType_AddWatcher()} will be called whenever
@ref{1b79,,PyType_Modified()} reports a change to `type'. (The callback may be
called only once for a series of consecutive modifications to `type', if
@code{_PyType_Lookup()} is not called on `type' between the modifications;
this is an implementation detail and subject to change.)

An extension should never call @code{PyType_Watch} with a `watcher_id' that was
not returned to it by a previous call to @ref{784,,PyType_AddWatcher()}.


Added in version 3.12.

@end deffn

@geindex PyType_Unwatch (C function)
@anchor{c-api/type c PyType_Unwatch}@anchor{531b}
@deffn {C 함수} int PyType_Unwatch (int watcher_id, PyObject *type)

Mark `type' as not watched. This undoes a previous call to
@ref{785,,PyType_Watch()}. `type' must not be @code{NULL}.

An extension should never call this function with a `watcher_id' that was
not returned to it by a previous call to @ref{784,,PyType_AddWatcher()}.

On success, this function returns @code{0}. On failure, this function returns
@code{-1} with an exception set.


Added in version 3.12.

@end deffn

@geindex PyType_WatchCallback (C type)
@anchor{c-api/type c PyType_WatchCallback}@anchor{531c}
@deffn {C 자료형} typedef int (*PyType_WatchCallback)(@ref{5dc,,PyObject} *type)

Type of a type-watcher callback function.

The callback must not modify `type' or cause @ref{1b79,,PyType_Modified()} to be
called on `type' or any type in its MRO; violating this rule could cause
infinite recursion.


Added in version 3.12.

@end deffn

@geindex PyType_HasFeature (C function)
@anchor{c-api/type c PyType_HasFeature}@anchor{1d39}
@deffn {C 함수} int PyType_HasFeature (PyTypeObject *o, int feature)

형 객체 `o'가 기능 `feature'를 설정하면 0이 아닌 값을 반환합니다. 형 기능은 단일 비트 플래그로 표시됩니다.
@end deffn

@geindex PyType_FastSubclass (C function)
@anchor{c-api/type c PyType_FastSubclass}@anchor{531d}
@deffn {C 함수} int PyType_FastSubclass (PyTypeObject *type, int flag)

Return non-zero if the type object `type' sets the subclass flag `flag'.
Subclass flags are denoted by
@ref{531e,,Py_TPFLAGS_*_SUBCLASS}.
This function is used by many @code{_Check} functions for common types.


@subsubheading 더 보기


@ref{1cb2,,PyObject_TypeCheck()}, which is used as a slower alternative in
@code{_Check} functions for types that don’t come with subclass flags.

@end deffn

@geindex PyType_IS_GC (C function)
@anchor{c-api/type c PyType_IS_GC}@anchor{531f}
@deffn {C 함수} int PyType_IS_GC (PyTypeObject *o)

형 객체가 순환 검출기에 대한 지원을 포함하고 있으면 참을 반환합니다. 이것은 형 플래그 @ref{980,,Py_TPFLAGS_HAVE_GC}를 검사합니다.
@end deffn

@geindex PyType_IsSubtype (C function)
@anchor{c-api/type c PyType_IsSubtype}@anchor{511a}
@deffn {C 함수} int PyType_IsSubtype (PyTypeObject *a, PyTypeObject *b)
` Part of the @ref{774,,안정 ABI}.'
`a'가 `b'의 서브 형이면 참을 반환합니다.

이 함수는 실제 서브 형만 검사합니다. 즉, @ref{23c7,,__subclasscheck__()}가 `b'에 대해 호출되지 않습니다. @ref{9c4,,issubclass()}가 수행하는 것과 같은 검사를 하려면 @ref{10a6,,PyObject_IsSubclass()}를 호출하십시오.
@end deffn

@geindex PyType_GenericAlloc (C function)
@anchor{c-api/type c PyType_GenericAlloc}@anchor{c5f}
@deffn {C 함수} @ref{5dc,,PyObject} *PyType_GenericAlloc (PyTypeObject *type, Py_ssize_t nitems)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
Generic handler for the @ref{4f0f,,tp_alloc} slot of a type
object.  Uses Python’s default memory allocation mechanism to allocate memory
for a new instance, zeros the memory, then initializes the memory as if by
calling @ref{c60,,PyObject_Init()} or @ref{1d3d,,PyObject_InitVar()}.

Do not call this directly to allocate memory for an object; call the type’s
@ref{4f0f,,tp_alloc} slot instead.

For types that support garbage collection (i.e., the
@ref{980,,Py_TPFLAGS_HAVE_GC} flag is set), this function behaves like
@ref{c98,,PyObject_GC_New} or @ref{c99,,PyObject_GC_NewVar} (except the
memory is guaranteed to be zeroed before initialization), and should be
paired with @ref{1708,,PyObject_GC_Del()} in @ref{4f0e,,tp_free}.
Otherwise, it behaves like @ref{b7b,,PyObject_New} or
@ref{b7c,,PyObject_NewVar} (except the memory is guaranteed to be zeroed
before initialization) and should be paired with @ref{e5f,,PyObject_Free()} in
@code{tp_free}.
@end deffn

@geindex PyType_GenericNew (C function)
@anchor{c-api/type c PyType_GenericNew}@anchor{4f0b}
@deffn {C 함수} @ref{5dc,,PyObject} *PyType_GenericNew (PyTypeObject *type, PyObject *args, PyObject *kwds)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
Generic handler for the @ref{79e,,tp_new} slot of a type
object.  Creates a new instance using the type’s
@ref{4f0f,,tp_alloc} slot and returns the resulting object.
@end deffn

@geindex PyType_Ready (C function)
@anchor{c-api/type c PyType_Ready}@anchor{97f}
@deffn {C 함수} int PyType_Ready (PyTypeObject *type)
` Part of the @ref{774,,안정 ABI}.'
형 개체를 마무리합니다. 초기화를 완료하려면 모든 형 객체에 대해 이 메서드를 호출해야 합니다. 이 함수는 형의 베이스 클래스에서 상속된 슬롯을 추가합니다. 성공 시 @code{0}을 반환하고, 오류 시 @code{-1}을 반환하고 예외를 설정합니다.

@cartouche
@quotation 참고 
If some of the base classes implements the GC protocol and the provided
type does not include the @ref{980,,Py_TPFLAGS_HAVE_GC} in its flags, then
the GC protocol will be automatically implemented from its parents. On
the contrary, if the type being created does include
@code{Py_TPFLAGS_HAVE_GC} in its flags then it `must' implement the
GC protocol itself by at least implementing the
@ref{981,,tp_traverse} handle.
@end quotation
@end cartouche
@end deffn

@geindex PyType_GetName (C function)
@anchor{c-api/type c PyType_GetName}@anchor{957}
@deffn {C 함수} @ref{5dc,,PyObject} *PyType_GetName (PyTypeObject *type)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI} 버전 3.11 이후로.'
Return the type’s name. Equivalent to getting the type’s
@ref{16b0,,__name__} attribute.


Added in version 3.11.

@end deffn

@geindex PyType_GetQualName (C function)
@anchor{c-api/type c PyType_GetQualName}@anchor{958}
@deffn {C 함수} @ref{5dc,,PyObject} *PyType_GetQualName (PyTypeObject *type)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI} 버전 3.11 이후로.'
Return the type’s qualified name. Equivalent to getting the
type’s @ref{2370,,__qualname__} attribute.


Added in version 3.11.

@end deffn

@geindex PyType_GetFullyQualifiedName (C function)
@anchor{c-api/type c PyType_GetFullyQualifiedName}@anchor{614}
@deffn {C 함수} @ref{5dc,,PyObject} *PyType_GetFullyQualifiedName (PyTypeObject *type)
` Part of the @ref{774,,안정 ABI} 버전 3.13 이후로.'
Return the type’s fully qualified name. Equivalent to
@code{f"@{type.__module__@}.@{type.__qualname__@}"}, or @ref{2370,,type.__qualname__}
if @ref{615,,type.__module__} is not a string or is equal to @code{"builtins"}.


Added in version 3.13.

@end deffn

@geindex PyType_GetModuleName (C function)
@anchor{c-api/type c PyType_GetModuleName}@anchor{616}
@deffn {C 함수} @ref{5dc,,PyObject} *PyType_GetModuleName (PyTypeObject *type)
` Part of the @ref{774,,안정 ABI} 버전 3.13 이후로.'
Return the type’s module name. Equivalent to getting the
@ref{615,,type.__module__} attribute.


Added in version 3.13.

@end deffn

@geindex PyType_GetSlot (C function)
@anchor{c-api/type c PyType_GetSlot}@anchor{a9c}
@deffn {C 함수} void *PyType_GetSlot (PyTypeObject *type, int slot)
` Part of the @ref{774,,안정 ABI} 버전 3.4 이후로.'
지정된 슬롯에 저장된 함수 포인터를 반환합니다. 결과가 @code{NULL}이면, 슬롯이 @code{NULL}이거나 함수가 유효하지 않은 매개 변수로 호출되었음을 나타냅니다. 호출자는 일반적으로 결과 포인터를 적절한 함수 형으로 캐스팅합니다.

`slot' 인자의 가능한 값은 @ref{5320,,PyType_Slot.slot}을 참조하십시오.


Added in version 3.4.



버전 3.10에서 변경: @ref{a9c,,PyType_GetSlot()} can now accept all types.
Previously, it was limited to @ref{b5e,,heap types}.

@end deffn

@geindex PyType_GetModule (C function)
@anchor{c-api/type c PyType_GetModule}@anchor{b66}
@deffn {C 함수} @ref{5dc,,PyObject} *PyType_GetModule (PyTypeObject *type)
`반환값: 빌린 참조.'` Part of the @ref{774,,안정 ABI} 버전 3.10 이후로.'
@ref{772,,PyType_FromModuleAndSpec()}를 사용하여 형을 만들 때 지정된 형과 관련된 모듈 객체를 반환합니다.

The returned reference is @ref{3d7,,borrowed} from `type',
and will be valid as long as you hold a reference to `type'.
Do not release it with @ref{78f,,Py_DECREF()} or similar.

주어진 형과 연관된 모듈이 없으면, @ref{198,,TypeError}를 설정하고 @code{NULL}을 반환합니다.

이 함수는 일반적으로 메서드가 정의된 모듈을 가져오는 데 사용됩니다. 이러한 메서드에서, @code{PyType_GetModule(Py_TYPE(self))}는 의도한 결과를 반환하지 않을 수 있음에 유의하십시오. @code{Py_TYPE(self)}는 의도한 클래스의 `서브 클래스'일 수 있으며, 서브 클래스가 반드시 슈퍼 클래스와 같은 모듈에 정의된 것은 아닙니다. 메서드를 정의하는 클래스를 얻으려면 @ref{967,,PyCMethod}를 참조하십시오. @code{PyCMethod}를 사용할 수 없는 경우는 @ref{633,,PyType_GetModuleByDef()}를 참조하세요.


Added in version 3.9.

@end deffn

@geindex PyType_GetModuleState (C function)
@anchor{c-api/type c PyType_GetModuleState}@anchor{b67}
@deffn {C 함수} void *PyType_GetModuleState (PyTypeObject *type)
` Part of the @ref{774,,안정 ABI} 버전 3.10 이후로.'
주어진 형과 관련된 모듈 객체의 상태를 반환합니다. @ref{b66,,PyType_GetModule()} 결과에 @ref{b76,,PyModule_GetState()}를 호출하는 바로 가기입니다.

주어진 형과 연관된 모듈이 없으면, @ref{198,,TypeError}를 설정하고 @code{NULL}을 반환합니다.

`type'에 연관된 모듈이 있지만, 상태가 @code{NULL}이면, 예외를 설정하지 않고 @code{NULL}을 반환합니다.


Added in version 3.9.

@end deffn

@geindex PyType_GetModuleByDef (C function)
@anchor{c-api/type c PyType_GetModuleByDef}@anchor{633}
@deffn {C 함수} @ref{5dc,,PyObject} *PyType_GetModuleByDef (PyTypeObject *type, struct PyModuleDef *def)
`반환값: 빌린 참조.'` Part of the @ref{774,,안정 ABI} 버전 3.13 이후로.'
Find the first superclass whose module was created from
the given @ref{b71,,PyModuleDef} `def', and return that module.

모듈을 찾을 수 없으면, @ref{198,,TypeError}를 발생시키고 @code{NULL}을 반환합니다.

This function is intended to be used together with
@ref{b76,,PyModule_GetState()} to get module state from slot methods (such as
@ref{7a0,,tp_init} or @ref{5321,,nb_add})
and other places where a method’s defining class cannot be passed using the
@ref{967,,PyCMethod} calling convention.

The returned reference is @ref{3d7,,borrowed} from `type',
and will be valid as long as you hold a reference to `type'.
Do not release it with @ref{78f,,Py_DECREF()} or similar.


Added in version 3.11.

@end deffn

@geindex PyType_GetBaseByToken (C function)
@anchor{c-api/type c PyType_GetBaseByToken}@anchor{3b0}
@deffn {C 함수} int PyType_GetBaseByToken (PyTypeObject *type, void *token, PyTypeObject **result)
` Part of the @ref{774,,안정 ABI} 버전 3.14 이후로.'
Find the first superclass in `type'’s @ref{25e0,,method resolution order} whose
@ref{3b1,,Py_tp_token} token is equal to the given one.


@itemize *

@item 
If found, set `*result' to a new @ref{5df,,strong reference}
to it and return @code{1}.

@item 
If not found, set `*result' to @code{NULL} and return @code{0}.

@item 
On error, set `*result' to @code{NULL} and return @code{-1} with an
exception set.
@end itemize

The `result' argument may be @code{NULL}, in which case `*result' is not set.
Use this if you need only the return value.

The `token' argument may not be @code{NULL}.


Added in version 3.14.

@end deffn

@geindex PyUnstable_Type_AssignVersionTag (C function)
@anchor{c-api/type c PyUnstable_Type_AssignVersionTag}@anchor{5322}
@deffn {C 함수} int PyUnstable_Type_AssignVersionTag (PyTypeObject *type)

@cartouche
@quotation 이것은 불안정 API. It may change without warning in minor releases. `이것은 @ref{768,,불안정 API}. It may change without warning in minor releases.'
@end quotation
@end cartouche

Attempt to assign a version tag to the given type.

Returns 1 if the type already had a valid version tag or a new one was
assigned, or 0 if a new tag could not be assigned.


Added in version 3.12.

@end deffn

@geindex PyType_SUPPORTS_WEAKREFS (C function)
@anchor{c-api/type c PyType_SUPPORTS_WEAKREFS}@anchor{5323}
@deffn {C 함수} int PyType_SUPPORTS_WEAKREFS (PyTypeObject *type)

Return true if instances of `type' support creating weak references, false
otherwise. This function always succeeds. `type' must not be @code{NULL}.


@subsubheading 더 보기



@itemize *

@item 
@ref{52ce,,약한 참조 객체}

@item 
@ref{11a,,weakref}
@end itemize

@end deffn

@menu
* 힙에 할당된 형 만들기:: 

@end menu

@node 힙에 할당된 형 만들기,,,형 객체<2>
@anchor{c-api/type creating-heap-allocated-types}@anchor{5324}
@subsubsection 힙에 할당된 형 만들기


다음 함수와 구조체는 @ref{b5e,,힙 형}을 만드는 데 사용됩니다.

@geindex PyType_FromMetaclass (C function)
@anchor{c-api/type c PyType_FromMetaclass}@anchor{771}
@deffn {C 함수} @ref{5dc,,PyObject} *PyType_FromMetaclass (PyTypeObject *metaclass, PyObject *module, PyType_Spec *spec, PyObject *bases)
` Part of the @ref{774,,안정 ABI} 버전 3.12 이후로.'
`spec'으로 @ref{b5e,,힙 형}을 만들고 반환합니다 (@ref{aac,,Py_TPFLAGS_HEAPTYPE}을 찹고하세요).

The metaclass `metaclass' is used to construct the resulting type object.
When `metaclass' is @code{NULL}, the metaclass is derived from `bases'
(or `Py_tp_base[s]' slots if `bases' is @code{NULL}, see below).

Metaclasses that override @ref{79e,,tp_new} are not
supported, except if @code{tp_new} is @code{NULL}.

The `bases' argument can be used to specify base classes; it can either
be only one class or a tuple of classes.
If `bases' is @code{NULL}, the @ref{51c2,,Py_tp_bases} slot is used instead.
If that also is @code{NULL}, the @ref{51c1,,Py_tp_base} slot is used instead.
If that also is @code{NULL}, the new type derives from @ref{c7d,,object}.

`module' 인자는 새 클래스가 정의된 모듈을 기록하는 데 사용할 수 있습니다. 모듈 객체나 @code{NULL}이어야 합니다. @code{NULL}이 아니면, 모듈은 새 형과 연관되며 나중에 @ref{b66,,PyType_GetModule()}로 가져올 수 있습니다. 연관된 모듈은 서브 클래스에 상속되지 않습니다; 각 클래스에 대해 개별적으로 지정해야 합니다.

이 함수는 새로운 형에 @ref{97f,,PyType_Ready()}를 호출합니다.

Note that this function does `not' fully match the behavior of
calling @ref{f43,,type()} or using the @ref{14dc,,class} statement.
With user-provided base types or metaclasses, prefer
@ref{52d3,,calling} @code{type} (or the metaclass)
over @code{PyType_From*} functions.
Specifically:


@itemize *

@item 
@ref{79f,,__new__()} is not called on the new class
(and it must be set to @code{type.__new__}).

@item 
@ref{8be,,__init__()} is not called on the new class.

@item 
@ref{842,,__init_subclass__()} is not called on any bases.

@item 
@ref{e47,,__set_name__()} is not called on new descriptors.
@end itemize


Added in version 3.12.

@end deffn

@geindex PyType_FromModuleAndSpec (C function)
@anchor{c-api/type c PyType_FromModuleAndSpec}@anchor{772}
@deffn {C 함수} @ref{5dc,,PyObject} *PyType_FromModuleAndSpec (PyObject *module, PyType_Spec *spec, PyObject *bases)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI} 버전 3.10 이후로.'
@code{PyType_FromMetaclass(NULL, module, spec, bases)}와 동등합니다.


Added in version 3.9.



버전 3.10에서 변경: The function now accepts a single class as the `bases' argument and
@code{NULL} as the @code{tp_doc} slot.



버전 3.12에서 변경: The function now finds and uses a metaclass corresponding to the provided
base classes.  Previously, only @ref{f43,,type} instances were returned.

The @ref{79e,,tp_new} of the metaclass is `ignored'.
which may result in incomplete initialization.
Creating classes whose metaclass overrides
@code{tp_new} is deprecated.



버전 3.14에서 변경: Creating classes whose metaclass overrides
@ref{79e,,tp_new} is no longer allowed.

@end deffn

@geindex PyType_FromSpecWithBases (C function)
@anchor{c-api/type c PyType_FromSpecWithBases}@anchor{79d}
@deffn {C 함수} @ref{5dc,,PyObject} *PyType_FromSpecWithBases (PyType_Spec *spec, PyObject *bases)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI} 버전 3.3 이후로.'
@code{PyType_FromMetaclass(NULL, NULL, spec, bases)}와 동등합니다.


Added in version 3.3.



버전 3.12에서 변경: The function now finds and uses a metaclass corresponding to the provided
base classes.  Previously, only @ref{f43,,type} instances were returned.

The @ref{79e,,tp_new} of the metaclass is `ignored'.
which may result in incomplete initialization.
Creating classes whose metaclass overrides
@code{tp_new} is deprecated.



버전 3.14에서 변경: Creating classes whose metaclass overrides
@ref{79e,,tp_new} is no longer allowed.

@end deffn

@geindex PyType_FromSpec (C function)
@anchor{c-api/type c PyType_FromSpec}@anchor{79c}
@deffn {C 함수} @ref{5dc,,PyObject} *PyType_FromSpec (PyType_Spec *spec)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
@code{PyType_FromMetaclass(NULL, NULL, spec, NULL)}와 동등합니다.


버전 3.12에서 변경: The function now finds and uses a metaclass corresponding to the
base classes provided in `Py_tp_base[s]' slots.
Previously, only @ref{f43,,type} instances were returned.

The @ref{79e,,tp_new} of the metaclass is `ignored'.
which may result in incomplete initialization.
Creating classes whose metaclass overrides
@code{tp_new} is deprecated.



버전 3.14에서 변경: Creating classes whose metaclass overrides
@ref{79e,,tp_new} is no longer allowed.

@end deffn

@geindex PyType_Freeze (C function)
@anchor{c-api/type c PyType_Freeze}@anchor{3af}
@deffn {C 함수} int PyType_Freeze (PyTypeObject *type)
` Part of the @ref{774,,안정 ABI} 버전 3.14 이후로.'
Make a type immutable: set the @ref{3cf,,Py_TPFLAGS_IMMUTABLETYPE} flag.

All base classes of `type' must be immutable.

On success, return @code{0}.
On error, set an exception and return @code{-1}.

The type must not be used before it’s made immutable. For example, type
instances must not be created before the type is made immutable.


Added in version 3.14.

@end deffn

@geindex PyType_Spec (C type)
@anchor{c-api/type c PyType_Spec}@anchor{1a89}
@deffn {C 자료형} type PyType_Spec
` Part of the @ref{774,,안정 ABI} (including all members).'
형의 행동을 정의하는 구조체.

@geindex PyType_Spec.name (C member)
@anchor{c-api/type c PyType_Spec name}@anchor{5325}
@deffn {C 멤버 변수} const char *name

형의 이름, @ref{1cad,,PyTypeObject.tp_name}을 설정하는 데 사용됩니다.
@end deffn

@geindex PyType_Spec.basicsize (C member)
@anchor{c-api/type c PyType_Spec basicsize}@anchor{769}
@deffn {C 멤버 변수} int basicsize

양수면, 인스턴스의 바이트 수 크기를 지정합니다. @ref{b7d,,PyTypeObject.tp_basicsize}를 설정하는 데 사용됩니다.

If zero, specifies that @ref{b7d,,tp_basicsize}
should be inherited.

If negative, the absolute value specifies how much space instances of the
class need `in addition' to the superclass.
Use @ref{76a,,PyObject_GetTypeData()} to get a pointer to subclass-specific
memory reserved this way.
For negative @code{basicsize}, Python will insert padding when
needed to meet @ref{b7d,,tp_basicsize}’s alignment
requirements.


버전 3.12에서 변경: Previously, this field could not be negative.

@end deffn

@geindex PyType_Spec.itemsize (C member)
@anchor{c-api/type c PyType_Spec itemsize}@anchor{5326}
@deffn {C 멤버 변수} int itemsize

가변 크기 형의 한 요소의 바이트 수 크기. @ref{23bb,,PyTypeObject.tp_itemsize}를 설정하는 데 사용됩니다. 주의 사항은 @code{tp_itemsize} 설명서를 참조하세요.

If zero, @ref{23bb,,tp_itemsize} is inherited.
Extending arbitrary variable-sized classes is dangerous,
since some types use a fixed offset for variable-sized memory,
which can then overlap fixed-sized memory used by a subclass.
To help prevent mistakes, inheriting @code{itemsize} is only possible
in the following situations:


@itemize -

@item 
베이스는 가변 크기가 아닙니다 (@ref{23bb,,tp_itemsize} 입니다).

@item 
The requested @ref{769,,PyType_Spec.basicsize} is positive,
suggesting that the memory layout of the base class is known.

@item 
The requested @ref{769,,PyType_Spec.basicsize} is zero,
suggesting that the subclass does not access the instance’s memory
directly.

@item 
With the @ref{76c,,Py_TPFLAGS_ITEMS_AT_END} flag.
@end itemize
@end deffn

@geindex PyType_Spec.flags (C member)
@anchor{c-api/type c PyType_Spec flags}@anchor{5327}
@deffn {C 멤버 변수} unsigned int flags

형 플래그, @ref{1c6f,,PyTypeObject.tp_flags}를 설정하는 데 사용됩니다.

@code{Py_TPFLAGS_HEAPTYPE} 플래그가 설정되어 있지 않으면, @ref{79d,,PyType_FromSpecWithBases()} 가 자동으로 플래그를 설정합니다.
@end deffn

@geindex PyType_Spec.slots (C member)
@anchor{c-api/type c PyType_Spec slots}@anchor{5328}
@deffn {C 멤버 변수} @ref{511b,,PyType_Slot} *slots

@ref{511b,,PyType_Slot} 구조체의 배열. 특수 슬롯값 @code{@{0, NULL@}}에 의해 종료됩니다.

Each slot ID should be specified at most once.
@end deffn
@end deffn

@geindex PyType_Slot (C type)
@anchor{c-api/type c PyType_Slot}@anchor{511b}
@deffn {C 자료형} type PyType_Slot
` Part of the @ref{774,,안정 ABI} (including all members).'
형의 선택적 기능을 정의하는 구조체, 슬롯 ID와 값 포인터를 포함합니다.

@geindex PyType_Slot.slot (C member)
@anchor{c-api/type c PyType_Slot slot}@anchor{5320}
@deffn {C 멤버 변수} int slot

슬롯 ID.

슬롯 ID는 구조체 @ref{c9b,,PyTypeObject}, @ref{1623,,PyNumberMethods}, @ref{4f33,,PySequenceMethods}, @ref{4f34,,PyMappingMethods} 및 @ref{5329,,PyAsyncMethods} 의 필드 이름에 @code{Py_} 접두사를 붙인 이름을 사용합니다. 예를 들어, :


@itemize *

@item 
@ref{51c5,,Py_tp_dealloc} to set @ref{4efb,,PyTypeObject.tp_dealloc}

@item 
@ref{5196,,Py_nb_add} to set @ref{5321,,PyNumberMethods.nb_add}

@item 
@ref{51be,,Py_sq_length} to set @ref{532a,,PySequenceMethods.sq_length}
@end itemize

An additional slot is supported that does not correspond to a
@code{PyTypeObject} struct field:


@itemize *

@item 
@ref{3b1,,Py_tp_token}
@end itemize

다음 “offset” 필드는 @ref{511b,,PyType_Slot}을 사용하여 설정할 수 없습니다:


@itemize *

@item 
@ref{b7e,,tp_weaklistoffset} (가능하면 대신 @ref{77b,,Py_TPFLAGS_MANAGED_WEAKREF}를 사용하세요)

@item 
@ref{532b,,tp_dictoffset} (가능하면 대신 @ref{60d,,Py_TPFLAGS_MANAGED_DICT}를 사용하세요)

@item 
@ref{52d5,,tp_vectorcall_offset} (@ref{532c,,PyMemberDef}에서 @code{"__vectorcalloffset__"}를 사용하세요)
@end itemize

If it is not possible to switch to a @code{MANAGED} flag (for example,
for vectorcall or to support Python older than 3.12), specify the
offset in @ref{51d4,,Py_tp_members}.
See @ref{532c,,PyMemberDef documentation}
for details.

The following internal fields cannot be set at all when creating a heap
type:


@itemize *

@item 
@ref{1a8c,,tp_dict},
@ref{532d,,tp_mro},
@ref{532e,,tp_cache},
@ref{791,,tp_subclasses}, and
@ref{532f,,tp_weaklist}.
@end itemize

일부 플랫폼에서는 @ref{51c2,,Py_tp_bases}나 @ref{51c1,,Py_tp_base}를 설정하는 것이 문제가 될 수 있습니다. 문제를 피하려면, 대신 @ref{79d,,PyType_FromSpecWithBases()} 의 `bases' 인자를 사용하십시오.


버전 3.9에서 변경: @ref{5330,,PyBufferProcs}의 슬롯은 제한 없는 API에서 설정할 수 있습니다.



버전 3.11에서 변경: @ref{965,,bf_getbuffer} and
@ref{966,,bf_releasebuffer} are now available
under the @ref{635,,limited API}.



버전 3.14에서 변경: The field @ref{198b,,tp_vectorcall} can now be set
using @ref{51dd,,Py_tp_vectorcall}.  See the field’s documentation
for details.

@end deffn

@geindex PyType_Slot.pfunc (C member)
@anchor{c-api/type c PyType_Slot pfunc}@anchor{5331}
@deffn {C 멤버 변수} void *pfunc

슬롯의 원하는 값입니다. 대부분 이것은 함수에 대한 포인터입니다.

`pfunc' values may not be @code{NULL}, except for the following slots:


@itemize *

@item 
@ref{51c9,,Py_tp_doc}

@item 
@ref{3b1,,Py_tp_token} (for clarity, prefer @ref{5178,,Py_TP_USE_SPEC}
rather than @code{NULL})
@end itemize
@end deffn
@end deffn

@geindex Py_tp_token (C macro)
@anchor{c-api/type c Py_tp_token}@anchor{3b1}
@deffn {C 매크로} Py_tp_token
` Part of the @ref{774,,안정 ABI} 버전 3.14 이후로.'
A @ref{5320,,slot} that records a static memory layout ID
for a class.

If the @ref{1a89,,PyType_Spec} of the class is statically
allocated, the token can be set to the spec using the special value
@ref{5178,,Py_TP_USE_SPEC}:

@example
static PyType_Slot foo_slots[] = @{
   @{Py_tp_token, Py_TP_USE_SPEC@},
@end example

It can also be set to an arbitrary pointer, but you must ensure that:


@itemize *

@item 
The pointer outlives the class, so it’s not reused for something else
while the class exists.

@item 
It “belongs” to the extension module where the class lives, so it will not
clash with other extensions.
@end itemize

Use @ref{3b0,,PyType_GetBaseByToken()} to check if a class’s superclass has
a given token – that is, check whether the memory layout is compatible.

To get the token for a given class (without considering superclasses),
use @ref{a9c,,PyType_GetSlot()} with @code{Py_tp_token}.


Added in version 3.14.


@geindex Py_TP_USE_SPEC (C macro)
@anchor{c-api/type c Py_TP_USE_SPEC}@anchor{5178}
@deffn {C 매크로} Py_TP_USE_SPEC
` Part of the @ref{774,,안정 ABI} 버전 3.14 이후로.'
Used as a value with @ref{3b1,,Py_tp_token} to set the token to the
class’s @ref{1a89,,PyType_Spec}.
Expands to @code{NULL}.


Added in version 3.14.

@end deffn
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node None 객체,,형 객체<2>,기본 객체
@anchor{c-api/none doc}@anchor{5332}@anchor{c-api/none noneobject}@anchor{5333}@anchor{c-api/none the-none-object}@anchor{5334}@anchor{c-api/none translation-repo}@anchor{5335}
@subsubsection @code{None} 객체


@geindex 객체;None

@code{None}에 대한 @ref{c9b,,PyTypeObject}는 파이썬/C API에서 직접 노출되지 않습니다. @code{None}은 싱글톤이기 때문에 (C에서 @code{==}를 사용해서) 객체 아이덴티티를 검사하는 것으로 충분합니다. 같은 이유로 @code{PyNone_Check()} 함수가 없습니다.

@geindex Py_None (C var)
@anchor{c-api/none c Py_None}@anchor{4ede}
@deffn {C 변수} @ref{5dc,,PyObject} *Py_None

값의 부재를 나타내는 파이썬 @code{None} 객체입니다. 이 객체는 메서드가 없고 @ref{290,,불멸}입니다.


버전 3.12에서 변경: @ref{4ede,,Py_None}은 @ref{290,,불멸}입니다.

@end deffn

@geindex Py_RETURN_NONE (C macro)
@anchor{c-api/none c Py_RETURN_NONE}@anchor{1678}
@deffn {C 매크로} Py_RETURN_NONE

함수에서 @ref{4ede,,Py_None}을 반환합니다.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 숫자 객체,시퀀스 객체,기본 객체,구상 객체 계층
@anchor{c-api/concrete numeric-objects}@anchor{5336}@anchor{c-api/concrete numericobjects}@anchor{5337}
@subsection 숫자 객체


@geindex object;numeric

@menu
* 정수 객체:: 
* 불리언 객체:: 
* 부동 소수점 객체:: 
* 복소수 객체:: 

@end menu

@node 정수 객체,불리언 객체,,숫자 객체
@anchor{c-api/long doc}@anchor{5338}@anchor{c-api/long integer-objects}@anchor{5339}@anchor{c-api/long longobjects}@anchor{533a}
@subsubsection 정수 객체


@geindex 객체;long 정수
@geindex 객체;정수

모든 정수는 임의의 크기의 “long” 정수 객체로 구현됩니다.

에러 시, 대부분의 @code{PyLong_As*} API는 숫자와 구별할 수 없는 @code{(return type)-1}을 반환합니다. 모호성을 제거하려면 @ref{1cac,,PyErr_Occurred()}를 사용하십시오.

@geindex PyLongObject (C type)
@anchor{c-api/long c PyLongObject}@anchor{39e}
@deffn {C 자료형} type PyLongObject
` Part of the @ref{774,,제한된 API} (as an opaque struct).'
이 @ref{5dc,,PyObject}의 서브 형은 파이썬 정수 객체를 나타냅니다.
@end deffn

@geindex PyLong_Type (C var)
@anchor{c-api/long c PyLong_Type}@anchor{508e}
@deffn {C 변수} @ref{c9b,,PyTypeObject} PyLong_Type
` Part of the @ref{774,,안정 ABI}.'
이 @ref{c9b,,PyTypeObject} 인스턴스는 파이썬 정수 형을 나타냅니다. 이것은 파이썬 계층의 @ref{19b,,int}와 같은 객체입니다.
@end deffn

@geindex PyLong_Check (C function)
@anchor{c-api/long c PyLong_Check}@anchor{533b}
@deffn {C 함수} int PyLong_Check (PyObject *p)

인자가 @ref{39e,,PyLongObject}이나 @code{PyLongObject}의 서브 형이면 참을 반환합니다. 이 함수는 항상 성공합니다.
@end deffn

@geindex PyLong_CheckExact (C function)
@anchor{c-api/long c PyLong_CheckExact}@anchor{533c}
@deffn {C 함수} int PyLong_CheckExact (PyObject *p)

인자가 @ref{39e,,PyLongObject} 이지만 @code{PyLongObject}의 서브 형이 아니면 참을 반환합니다. 이 함수는 항상 성공합니다.
@end deffn

@geindex PyLong_FromLong (C function)
@anchor{c-api/long c PyLong_FromLong}@anchor{1bce}
@deffn {C 함수} @ref{5dc,,PyObject} *PyLong_FromLong (long v)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
`v'로부터 새 @ref{39e,,PyLongObject} 객체를 반환하거나, 실패하면 @code{NULL}을 반환합니다.

`CPython 구현 상세:' CPython keeps an array of integer objects for all integers
between @code{-5} and @code{256}.  When you create an int in that range
you actually just get back a reference to the existing object.
@end deffn

@geindex PyLong_FromUnsignedLong (C function)
@anchor{c-api/long c PyLong_FromUnsignedLong}@anchor{18be}
@deffn {C 함수} @ref{5dc,,PyObject} *PyLong_FromUnsignedLong (unsigned long v)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
C unsigned long으로부터 새 @ref{39e,,PyLongObject} 객체를 반환하거나, 실패하면 @code{NULL}을 반환합니다.
@end deffn

@geindex PyLong_FromSsize_t (C function)
@anchor{c-api/long c PyLong_FromSsize_t}@anchor{18a0}
@deffn {C 함수} @ref{5dc,,PyObject} *PyLong_FromSsize_t (Py_ssize_t v)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
C @ref{c54,,Py_ssize_t}로부터 새 @ref{39e,,PyLongObject} 객체를 반환하거나, 실패하면 @code{NULL}을 반환합니다.
@end deffn

@geindex PyLong_FromSize_t (C function)
@anchor{c-api/long c PyLong_FromSize_t}@anchor{18c0}
@deffn {C 함수} @ref{5dc,,PyObject} *PyLong_FromSize_t (size_t v)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
C @code{size_t}로부터 새 @ref{39e,,PyLongObject} 객체를 반환하거나, 실패하면 @code{NULL}을 반환합니다.
@end deffn

@geindex PyLong_FromLongLong (C function)
@anchor{c-api/long c PyLong_FromLongLong}@anchor{1bcf}
@deffn {C 함수} @ref{5dc,,PyObject} *PyLong_FromLongLong (long long v)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
C long long으로부터 새 @ref{39e,,PyLongObject} 객체를 반환하거나, 실패하면 @code{NULL}을 반환합니다.
@end deffn

@geindex PyLong_FromInt32 (C function)
@geindex PyLong_FromInt64 (C function)
@anchor{c-api/long c PyLong_FromInt32}@anchor{3a3}
@deffn {C 함수} @ref{5dc,,PyObject} *PyLong_FromInt32 (int32_t value)
@anchor{c-api/long c PyLong_FromInt64}@anchor{3a4}
@deffnx {C 함수} @ref{5dc,,PyObject} *PyLong_FromInt64 (int64_t value)
` Part of the @ref{774,,안정 ABI} 버전 3.14 이후로.'
Return a new @ref{39e,,PyLongObject} object from a signed C
int32_t or int64_t, or @code{NULL}
with an exception set on failure.


Added in version 3.14.

@end deffn

@geindex PyLong_FromUnsignedLongLong (C function)
@anchor{c-api/long c PyLong_FromUnsignedLongLong}@anchor{18bf}
@deffn {C 함수} @ref{5dc,,PyObject} *PyLong_FromUnsignedLongLong (unsigned long long v)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
C unsigned long long으로부터 새 @ref{39e,,PyLongObject} 객체를 반환하거나, 실패하면 @code{NULL}을 반환합니다.
@end deffn

@geindex PyLong_FromUInt32 (C function)
@geindex PyLong_FromUInt64 (C function)
@anchor{c-api/long c PyLong_FromUInt32}@anchor{3a5}
@deffn {C 함수} @ref{5dc,,PyObject} *PyLong_FromUInt32 (uint32_t value)
@anchor{c-api/long c PyLong_FromUInt64}@anchor{3a6}
@deffnx {C 함수} @ref{5dc,,PyObject} *PyLong_FromUInt64 (uint64_t value)
` Part of the @ref{774,,안정 ABI} 버전 3.14 이후로.'
Return a new @ref{39e,,PyLongObject} object from an unsigned C
uint32_t or uint64_t, or @code{NULL}
with an exception set on failure.


Added in version 3.14.

@end deffn

@geindex PyLong_FromDouble (C function)
@anchor{c-api/long c PyLong_FromDouble}@anchor{b3c}
@deffn {C 함수} @ref{5dc,,PyObject} *PyLong_FromDouble (double v)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
`v'의 정수 부분으로부터 새 @ref{39e,,PyLongObject} 객체를 반환하거나, 실패하면 @code{NULL}을 반환합니다.
@end deffn

@geindex PyLong_FromString (C function)
@anchor{c-api/long c PyLong_FromString}@anchor{508b}
@deffn {C 함수} @ref{5dc,,PyObject} *PyLong_FromString (const char *str, char **pend, int base)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
`str'의 문자열 값을 기반으로 한 새 @ref{39e,,PyLongObject}를 반환하거나, 실패하면 @code{NULL}을 반환합니다. 문자열 값은 `base'의 진수(기수)에 따라 해석됩니다. `pend'가 @code{NULL}이 아니면, `*pend'는 성공 시에 `str'의 끝을 가리키고, 에러 시에 처리할 수 없었던 첫 번째 문자를 가리킵니다. `base'가 @code{0}이면, `str'은 @ref{2308,,정수 리터럴} 정의를 사용해서 해석됩니다; 이때, 0이 아닌 십진수의 선행 0은 @ref{2ec,,ValueError}를 발생시킵니다. `base'가 @code{0}이 아니면, @code{2}와 @code{36} 사이에 있어야 하며, 경계를 포함합니다. 선행과 후행 공백과 진수 지정자 뒤나 숫자 사이의 단일 밑줄은 무시됩니다. 숫자가 없거나 `str'이 숫자와 후행 공백 뒤에 NULL-종료하지 않으면, @code{ValueError}가 발생합니다.


@subsubheading 더 보기


@ref{604,,PyLong_AsNativeBytes()} and
@ref{605,,PyLong_FromNativeBytes()} functions can be used to convert
a @ref{39e,,PyLongObject} to/from an array of bytes in base @code{256}.

@end deffn

@geindex PyLong_FromUnicodeObject (C function)
@anchor{c-api/long c PyLong_FromUnicodeObject}@anchor{ab7}
@deffn {C 함수} @ref{5dc,,PyObject} *PyLong_FromUnicodeObject (PyObject *u, int base)
`반환값: 새 참조.'
문자열 `u'에 있는 유니코드 숫자의 시퀀스를 파이썬 정숫값으로 변환합니다.


Added in version 3.3.

@end deffn

@geindex PyLong_FromVoidPtr (C function)
@anchor{c-api/long c PyLong_FromVoidPtr}@anchor{508c}
@deffn {C 함수} @ref{5dc,,PyObject} *PyLong_FromVoidPtr (void *p)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
포인터 `p'로부터 파이썬 정수를 만듭니다. 포인터 값은 @ref{508a,,PyLong_AsVoidPtr()}를 사용하여 결괏값에서 조회할 수 있습니다.
@end deffn

@geindex PyLong_FromNativeBytes (C function)
@anchor{c-api/long c PyLong_FromNativeBytes}@anchor{605}
@deffn {C 함수} @ref{5dc,,PyObject} *PyLong_FromNativeBytes (const void *buffer, size_t n_bytes, int flags)
` Part of the @ref{774,,안정 ABI} 버전 3.14 이후로.'
Create a Python integer from the value contained in the first `n_bytes' of
`buffer', interpreted as a two’s-complement signed number.

`flags' are as for @ref{604,,PyLong_AsNativeBytes()}. Passing @code{-1} will select
the native endian that CPython was compiled with and assume that the
most-significant bit is a sign bit. Passing
@code{Py_ASNATIVEBYTES_UNSIGNED_BUFFER} will produce the same result as calling
@ref{606,,PyLong_FromUnsignedNativeBytes()}. Other flags are ignored.


Added in version 3.13.

@end deffn

@geindex PyLong_FromUnsignedNativeBytes (C function)
@anchor{c-api/long c PyLong_FromUnsignedNativeBytes}@anchor{606}
@deffn {C 함수} @ref{5dc,,PyObject} *PyLong_FromUnsignedNativeBytes (const void *buffer, size_t n_bytes, int flags)
` Part of the @ref{774,,안정 ABI} 버전 3.14 이후로.'
Create a Python integer from the value contained in the first `n_bytes' of
`buffer', interpreted as an unsigned number.

`flags' are as for @ref{604,,PyLong_AsNativeBytes()}. Passing @code{-1} will select
the native endian that CPython was compiled with and assume that the
most-significant bit is not a sign bit. Flags other than endian are ignored.


Added in version 3.13.

@end deffn

@geindex PyLong_FromPid (C macro)
@anchor{c-api/long c PyLong_FromPid}@anchor{533d}
@deffn {C 매크로} PyLong_FromPid (pid)

Macro for creating a Python integer from a process identifier.

This can be defined as an alias to @ref{1bce,,PyLong_FromLong()} or
@ref{1bcf,,PyLong_FromLongLong()}, depending on the size of the system’s
PID type.


Added in version 3.2.

@end deffn

@geindex PyLong_AsLong (C function)
@anchor{c-api/long c PyLong_AsLong}@anchor{603}
@deffn {C 함수} long PyLong_AsLong (PyObject *obj)
` Part of the @ref{774,,안정 ABI}.'
@geindex LONG_MAX (C 매크로)
@geindex OverflowError (내장 예외)

`obj'의 C long 표현을 반환합니다. `obj'가 @ref{39e,,PyLongObject}의 인스턴스가 아니면, (있다면) 먼저 @ref{19e,,__index__()} 메서드를 호출하여 @code{PyLongObject}로 변환합니다.

`obj'의 값이 long의 범위를 벗어나면 @ref{a81,,OverflowError}를 발생시킵니다.

에러 시 @code{-1}을 반환합니다. 모호성을 제거하려면 @ref{1cac,,PyErr_Occurred()}를 사용하십시오.


버전 3.8에서 변경: 사용할 수 있으면 @ref{19e,,__index__()}를 사용합니다.



버전 3.10에서 변경: This function will no longer use @ref{19d,,__int__()}.


@geindex PyLong_AS_LONG (C function)
@anchor{c-api/long c PyLong_AS_LONG}@anchor{533e}
@deffn {C 함수} long PyLong_AS_LONG (PyObject *obj)

A @ref{23d,,soft deprecated} alias.
Exactly equivalent to the preferred @code{PyLong_AsLong}. In particular,
it can fail with @ref{a81,,OverflowError} or another exception.


버전 3.14부터 폐지됨: The function is soft deprecated.

@end deffn
@end deffn

@geindex PyLong_AsInt (C function)
@anchor{c-api/long c PyLong_AsInt}@anchor{602}
@deffn {C 함수} int PyLong_AsInt (PyObject *obj)
` Part of the @ref{774,,안정 ABI} 버전 3.13 이후로.'
Similar to @ref{603,,PyLong_AsLong()}, but store the result in a C
int instead of a C long.


Added in version 3.13.

@end deffn

@geindex PyLong_AsLongAndOverflow (C function)
@anchor{c-api/long c PyLong_AsLongAndOverflow}@anchor{146b}
@deffn {C 함수} long PyLong_AsLongAndOverflow (PyObject *obj, int *overflow)
` Part of the @ref{774,,안정 ABI}.'
`obj'의 C long 표현을 반환합니다. `obj'가 @ref{39e,,PyLongObject}의 인스턴스가 아니면, (있다면) 먼저 @ref{19e,,__index__()} 메서드를 호출하여 @code{PyLongObject}로 변환합니다.

`obj'의 값이 @code{LONG_MAX}보다 크거나 @code{LONG_MIN}보다 작으면, `*overflow'를 각각 @code{1}이나 @code{-1}로 설정하고 @code{-1}을 반환합니다; 그렇지 않으면, `*overflow'를 @code{0}으로 설정합니다. 다른 예외가 발생하면 `*overflow'를 @code{0}으로 설정하고 @code{-1}을 평소와 같이 반환합니다.

에러 시 @code{-1}을 반환합니다. 모호성을 제거하려면 @ref{1cac,,PyErr_Occurred()}를 사용하십시오.


버전 3.8에서 변경: 사용할 수 있으면 @ref{19e,,__index__()}를 사용합니다.



버전 3.10에서 변경: This function will no longer use @ref{19d,,__int__()}.

@end deffn

@geindex PyLong_AsLongLong (C function)
@anchor{c-api/long c PyLong_AsLongLong}@anchor{5085}
@deffn {C 함수} long long PyLong_AsLongLong (PyObject *obj)
` Part of the @ref{774,,안정 ABI}.'
@geindex OverflowError (내장 예외)

`obj'의 C long long 표현을 반환합니다. `obj'가 @ref{39e,,PyLongObject}의 인스턴스가 아니면, (있다면) 먼저 @ref{19e,,__index__()} 메서드를 호출하여 @code{PyLongObject}로 변환합니다.

`obj'의 값이 long long의 범위를 벗어나면 @ref{a81,,OverflowError}를 발생시킵니다.

에러 시 @code{-1}을 반환합니다. 모호성을 제거하려면 @ref{1cac,,PyErr_Occurred()}를 사용하십시오.


버전 3.8에서 변경: 사용할 수 있으면 @ref{19e,,__index__()}를 사용합니다.



버전 3.10에서 변경: This function will no longer use @ref{19d,,__int__()}.

@end deffn

@geindex PyLong_AsLongLongAndOverflow (C function)
@anchor{c-api/long c PyLong_AsLongLongAndOverflow}@anchor{146a}
@deffn {C 함수} long long PyLong_AsLongLongAndOverflow (PyObject *obj, int *overflow)
` Part of the @ref{774,,안정 ABI}.'
`obj'의 C long long 표현을 반환합니다. `obj'가 @ref{39e,,PyLongObject}의 인스턴스가 아니면, (있다면) 먼저 @ref{19e,,__index__()} 메서드를 호출하여 @code{PyLongObject}로 변환합니다.

`obj'의 값이 @code{LLONG_MAX}보다 크거나 @code{LLONG_MIN}보다 작으면, `*overflow'를 각각 @code{1}이나 @code{-1}로 설정하고 @code{-1}을 반환합니다; 그렇지 않으면, `*overflow'를 @code{0}으로 설정합니다. 다른 예외가 발생하면 `*overflow'를 @code{0}으로 설정하고 @code{-1}을 평소와 같이 반환합니다.

에러 시 @code{-1}을 반환합니다. 모호성을 제거하려면 @ref{1cac,,PyErr_Occurred()}를 사용하십시오.


Added in version 3.2.



버전 3.8에서 변경: 사용할 수 있으면 @ref{19e,,__index__()}를 사용합니다.



버전 3.10에서 변경: This function will no longer use @ref{19d,,__int__()}.

@end deffn

@geindex PyLong_AsSsize_t (C function)
@anchor{c-api/long c PyLong_AsSsize_t}@anchor{5087}
@deffn {C 함수} @ref{c54,,Py_ssize_t} PyLong_AsSsize_t (PyObject *pylong)
` Part of the @ref{774,,안정 ABI}.'
@geindex PY_SSIZE_T_MAX (C 매크로)
@geindex OverflowError (내장 예외)

`pylong'의 C @ref{c54,,Py_ssize_t} 표현을 반환합니다. `pylong'은 @ref{39e,,PyLongObject}의 인스턴스여야 합니다.

`pylong'의 값이 @ref{c54,,Py_ssize_t}의 범위를 벗어나면 @ref{a81,,OverflowError}를 발생시킵니다.

에러 시 @code{-1}을 반환합니다. 모호성을 제거하려면 @ref{1cac,,PyErr_Occurred()}를 사용하십시오.
@end deffn

@geindex PyLong_AsUnsignedLong (C function)
@anchor{c-api/long c PyLong_AsUnsignedLong}@anchor{5088}
@deffn {C 함수} unsigned long PyLong_AsUnsignedLong (PyObject *pylong)
` Part of the @ref{774,,안정 ABI}.'
@geindex ULONG_MAX (C 매크로)
@geindex OverflowError (내장 예외)

`pylong'의 C unsigned long 표현을 반환합니다. `pylong'은 @ref{39e,,PyLongObject}의 인스턴스여야 합니다.

`pylong'의 값이 unsigned long의 범위를 벗어나면 @ref{a81,,OverflowError}를 발생시킵니다.

에러 시 @code{(unsigned long)-1}을 반환합니다. 모호성을 제거하려면 @ref{1cac,,PyErr_Occurred()}를 사용하십시오.
@end deffn

@geindex PyLong_AsSize_t (C function)
@anchor{c-api/long c PyLong_AsSize_t}@anchor{5086}
@deffn {C 함수} size_t PyLong_AsSize_t (PyObject *pylong)
` Part of the @ref{774,,안정 ABI}.'
@geindex SIZE_MAX (C 매크로)
@geindex OverflowError (내장 예외)

`pylong'의 C @code{size_t} 표현을 반환합니다. `pylong'은 @ref{39e,,PyLongObject}의 인스턴스여야 합니다.

`pylong'의 값이 @code{size_t}의 범위를 벗어나면 @ref{a81,,OverflowError}를 발생시킵니다.

에러 시 @code{(size_t)-1}을 반환합니다. 모호성을 제거하려면 @ref{1cac,,PyErr_Occurred()}를 사용하십시오.
@end deffn

@geindex PyLong_AsUnsignedLongLong (C function)
@anchor{c-api/long c PyLong_AsUnsignedLongLong}@anchor{1499}
@deffn {C 함수} unsigned long long PyLong_AsUnsignedLongLong (PyObject *pylong)
` Part of the @ref{774,,안정 ABI}.'
@geindex OverflowError (내장 예외)

`pylong'의 C unsigned long long 표현을 반환합니다. `pylong'은 @ref{39e,,PyLongObject}의 인스턴스여야 합니다.

`pylong'의 값이 unsigned long long의 범위를 벗어나면 @ref{a81,,OverflowError}를 발생시킵니다.

에러 시 @code{(unsigned long long)-1}을 반환합니다. 모호성을 제거하려면 @ref{1cac,,PyErr_Occurred()}를 사용하십시오.


버전 3.1에서 변경: 음의 `pylong'는 이제 @ref{198,,TypeError}가 아니라 @ref{a81,,OverflowError}를 발생시킵니다.

@end deffn

@geindex PyLong_AsUnsignedLongMask (C function)
@anchor{c-api/long c PyLong_AsUnsignedLongMask}@anchor{5089}
@deffn {C 함수} unsigned long PyLong_AsUnsignedLongMask (PyObject *obj)
` Part of the @ref{774,,안정 ABI}.'
`obj'의 C unsigned long 표현을 반환합니다. `obj'가 @ref{39e,,PyLongObject}의 인스턴스가 아니면, (있다면) 먼저 @ref{19e,,__index__()} 메서드를 호출하여 @code{PyLongObject}로 변환합니다.

`obj'의 값이 unsigned long의 범위를 벗어나면, 그 값의 모듈로 @code{ULONG_MAX + 1} 환원을 반환합니다.

에러 시 @code{(unsigned long)-1}을 반환합니다. 모호성을 제거하려면 @ref{1cac,,PyErr_Occurred()}를 사용하십시오.


버전 3.8에서 변경: 사용할 수 있으면 @ref{19e,,__index__()}를 사용합니다.



버전 3.10에서 변경: This function will no longer use @ref{19d,,__int__()}.

@end deffn

@geindex PyLong_AsUnsignedLongLongMask (C function)
@anchor{c-api/long c PyLong_AsUnsignedLongLongMask}@anchor{1dc7}
@deffn {C 함수} unsigned long long PyLong_AsUnsignedLongLongMask (PyObject *obj)
` Part of the @ref{774,,안정 ABI}.'
`obj'의 C unsigned long long 표현을 반환합니다. `obj'가 @ref{39e,,PyLongObject}의 인스턴스가 아니면, (있다면) 먼저 @ref{19e,,__index__()} 메서드를 호출하여 @code{PyLongObject}로 변환합니다.

`obj'의 값이 unsigned long long의 범위를 벗어나면, 그 값의 모듈로 @code{ULLONG_MAX + 1} 환원을 반환합니다.

에러 시 @code{(unsigned long long)-1}을 반환합니다. 모호성을 제거하려면 @ref{1cac,,PyErr_Occurred()}를 사용하십시오.


버전 3.8에서 변경: 사용할 수 있으면 @ref{19e,,__index__()}를 사용합니다.



버전 3.10에서 변경: This function will no longer use @ref{19d,,__int__()}.

@end deffn

@geindex PyLong_AsInt32 (C function)
@geindex PyLong_AsInt64 (C function)
@anchor{c-api/long c PyLong_AsInt32}@anchor{39f}
@deffn {C 함수} int PyLong_AsInt32 (PyObject *obj, int32_t *value)
@anchor{c-api/long c PyLong_AsInt64}@anchor{3a0}
@deffnx {C 함수} int PyLong_AsInt64 (PyObject *obj, int64_t *value)
` Part of the @ref{774,,안정 ABI} 버전 3.14 이후로.'
Set `*value' to a signed C int32_t or int64_t
representation of `obj'.

If `obj' is not an instance of @ref{39e,,PyLongObject}, first call its
@ref{19e,,__index__()} method (if present) to convert it to a
@code{PyLongObject}.

If the `obj' value is out of range, raise an @ref{a81,,OverflowError}.

Set `*value' and return @code{0} on success.
Set an exception and return @code{-1} on error.

`value' must not be @code{NULL}.


Added in version 3.14.

@end deffn

@geindex PyLong_AsUInt32 (C function)
@geindex PyLong_AsUInt64 (C function)
@anchor{c-api/long c PyLong_AsUInt32}@anchor{3a1}
@deffn {C 함수} int PyLong_AsUInt32 (PyObject *obj, uint32_t *value)
@anchor{c-api/long c PyLong_AsUInt64}@anchor{3a2}
@deffnx {C 함수} int PyLong_AsUInt64 (PyObject *obj, uint64_t *value)
` Part of the @ref{774,,안정 ABI} 버전 3.14 이후로.'
Set `*value' to an unsigned C uint32_t or uint64_t
representation of `obj'.

If `obj' is not an instance of @ref{39e,,PyLongObject}, first call its
@ref{19e,,__index__()} method (if present) to convert it to a
@code{PyLongObject}.


@itemize *

@item 
If `obj' is negative, raise a @ref{2ec,,ValueError}.

@item 
If the `obj' value is out of range, raise an @ref{a81,,OverflowError}.
@end itemize

Set `*value' and return @code{0} on success.
Set an exception and return @code{-1} on error.

`value' must not be @code{NULL}.


Added in version 3.14.

@end deffn

@geindex PyLong_AsDouble (C function)
@anchor{c-api/long c PyLong_AsDouble}@anchor{1976}
@deffn {C 함수} double PyLong_AsDouble (PyObject *pylong)
` Part of the @ref{774,,안정 ABI}.'
`pylong'의 C double 표현을 반환합니다. `pylong'은 @ref{39e,,PyLongObject}의 인스턴스여야 합니다.

`pylong'의 값이 double의 범위를 벗어나면 @ref{a81,,OverflowError}를 발생시킵니다.

에러 시 @code{-1.0}을 반환합니다. 모호성을 제거하려면 @ref{1cac,,PyErr_Occurred()}를 사용하십시오.
@end deffn

@geindex PyLong_AsVoidPtr (C function)
@anchor{c-api/long c PyLong_AsVoidPtr}@anchor{508a}
@deffn {C 함수} void *PyLong_AsVoidPtr (PyObject *pylong)
` Part of the @ref{774,,안정 ABI}.'
파이썬 정수 `pylong'을 C void 포인터로 변환합니다. `pylong'을 변환할 수 없으면, @ref{a81,,OverflowError}가 발생합니다. 이것은 @ref{508c,,PyLong_FromVoidPtr()}로 만들어진 값에 대해서만 사용할 수 있는 void 포인터를 생성하는 것이 보장됩니다.

에러 시 @code{NULL}을 반환합니다. 모호성을 제거하려면 @ref{1cac,,PyErr_Occurred()}를 사용하십시오.
@end deffn

@geindex PyLong_AsNativeBytes (C function)
@anchor{c-api/long c PyLong_AsNativeBytes}@anchor{604}
@deffn {C 함수} @ref{c54,,Py_ssize_t} PyLong_AsNativeBytes (PyObject *pylong, void *buffer, Py_ssize_t n_bytes, int flags)
` Part of the @ref{774,,안정 ABI} 버전 3.14 이후로.'
Copy the Python integer value `pylong' to a native `buffer' of size
`n_bytes'. The `flags' can be set to @code{-1} to behave similarly to a C cast,
or to values documented below to control the behavior.

Returns @code{-1} with an exception raised on error.  This may happen if
`pylong' cannot be interpreted as an integer, or if `pylong' was negative
and the @code{Py_ASNATIVEBYTES_REJECT_NEGATIVE} flag was set.

Otherwise, returns the number of bytes required to store the value.
If this is equal to or less than `n_bytes', the entire value was copied.
All `n_bytes' of the buffer are written: remaining bytes filled by
copies of the sign bit.

If the returned value is greater than `n_bytes', the value was
truncated: as many of the lowest bits of the value as could fit are written,
and the higher bits are ignored. This matches the typical behavior
of a C-style downcast.

@cartouche
@quotation 참고 
Overflow is not considered an error. If the returned value
is larger than `n_bytes', most significant bits were discarded.
@end quotation
@end cartouche

@code{0} will never be returned.

Values are always copied as two’s-complement.

Usage example:

@example
int32_t value;
Py_ssize_t bytes = PyLong_AsNativeBytes(pylong, &value, sizeof(value), -1);
if (bytes < 0) @{
    // 실패. 이유와 함께 파이썬 예외가 설정됩니다.
    return NULL;
@}
else if (bytes <= (Py_ssize_t)sizeof(value)) @{
    // 성공!
@}
else @{
    // 오버플로우가 발생했지만, 'value' 에 pylong 의 잘린
    // 하위 비트들이 담깁니다.
@}
@end example

Passing zero to `n_bytes' will return the size of a buffer that would
be large enough to hold the value. This may be larger than technically
necessary, but not unreasonably so. If `n_bytes=0', `buffer' may be
@code{NULL}.

@cartouche
@quotation 참고 
Passing `n_bytes=0' to this function is not an accurate way to determine
the bit length of the value.
@end quotation
@end cartouche

To get at the entire Python value of an unknown size, the function can be
called twice: first to determine the buffer size, then to fill it:

@example
// 필요한 공간의 크기를 물어봅니다.
Py_ssize_t expected = PyLong_AsNativeBytes(pylong, NULL, 0, -1);
if (expected < 0) @{
    // 실패. 이유와 함께 파이썬 예외가 설정됩니다.
    return NULL;
@}
assert(expected != 0);  // API 정의에 따라 불가능합니다.
uint8_t *bignum = malloc(expected);
if (!bignum) @{
    PyErr_SetString(PyExc_MemoryError, "bignum malloc failed.");
    return NULL;
@}
// 안전하게 전체 값을 얻습니다.
Py_ssize_t bytes = PyLong_AsNativeBytes(pylong, bignum, expected, -1);
if (bytes < 0) @{  // 예외가 설정되었습니다.
    free(bignum);
    return NULL;
@}
else if (bytes > expected) @{  // 이는 불가능해야 합니다.
    PyErr_SetString(PyExc_RuntimeError,
        "Unexpected bignum truncation after a size check.");
    free(bignum);
    return NULL;
@}
// 위의 사전 점검을 고려할 때 예상되는 성공.
// ... bignum 을 사용합니다 ...
free(bignum);
@end example

`flags' is either @code{-1} (@code{Py_ASNATIVEBYTES_DEFAULTS}) to select defaults
that behave most like a C cast, or a combination of the other flags in
the table below.
Note that @code{-1} cannot be combined with other flags.

Currently, @code{-1} corresponds to
@code{Py_ASNATIVEBYTES_NATIVE_ENDIAN | Py_ASNATIVEBYTES_UNSIGNED_BUFFER}.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxx} 
@headitem

플래그

@tab

값

@item

@geindex Py_ASNATIVEBYTES_DEFAULTS (C macro)
@anchor{c-api/long c Py_ASNATIVEBYTES_DEFAULTS}@anchor{5162}
@deffn {C 매크로} Py_ASNATIVEBYTES_DEFAULTS
` Part of the @ref{774,,안정 ABI} 버전 3.14 이후로.'
@end deffn

@tab

@code{-1}

@item

@geindex Py_ASNATIVEBYTES_BIG_ENDIAN (C macro)
@anchor{c-api/long c Py_ASNATIVEBYTES_BIG_ENDIAN}@anchor{5161}
@deffn {C 매크로} Py_ASNATIVEBYTES_BIG_ENDIAN
` Part of the @ref{774,,안정 ABI} 버전 3.14 이후로.'
@end deffn

@tab

@code{0}

@item

@geindex Py_ASNATIVEBYTES_LITTLE_ENDIAN (C macro)
@anchor{c-api/long c Py_ASNATIVEBYTES_LITTLE_ENDIAN}@anchor{5163}
@deffn {C 매크로} Py_ASNATIVEBYTES_LITTLE_ENDIAN
` Part of the @ref{774,,안정 ABI} 버전 3.14 이후로.'
@end deffn

@tab

@code{1}

@item

@geindex Py_ASNATIVEBYTES_NATIVE_ENDIAN (C macro)
@anchor{c-api/long c Py_ASNATIVEBYTES_NATIVE_ENDIAN}@anchor{5164}
@deffn {C 매크로} Py_ASNATIVEBYTES_NATIVE_ENDIAN
` Part of the @ref{774,,안정 ABI} 버전 3.14 이후로.'
@end deffn

@tab

@code{3}

@item

@geindex Py_ASNATIVEBYTES_UNSIGNED_BUFFER (C macro)
@anchor{c-api/long c Py_ASNATIVEBYTES_UNSIGNED_BUFFER}@anchor{5166}
@deffn {C 매크로} Py_ASNATIVEBYTES_UNSIGNED_BUFFER
` Part of the @ref{774,,안정 ABI} 버전 3.14 이후로.'
@end deffn

@tab

@code{4}

@item

@geindex Py_ASNATIVEBYTES_REJECT_NEGATIVE (C macro)
@anchor{c-api/long c Py_ASNATIVEBYTES_REJECT_NEGATIVE}@anchor{5165}
@deffn {C 매크로} Py_ASNATIVEBYTES_REJECT_NEGATIVE
` Part of the @ref{774,,안정 ABI} 버전 3.14 이후로.'
@end deffn

@tab

@code{8}

@item

@geindex Py_ASNATIVEBYTES_ALLOW_INDEX (C macro)
@anchor{c-api/long c Py_ASNATIVEBYTES_ALLOW_INDEX}@anchor{5160}
@deffn {C 매크로} Py_ASNATIVEBYTES_ALLOW_INDEX
` Part of the @ref{774,,안정 ABI} 버전 3.14 이후로.'
@end deffn

@tab

@code{16}

@end multitable


Specifying @code{Py_ASNATIVEBYTES_NATIVE_ENDIAN} will override any other endian
flags. Passing @code{2} is reserved.

By default, sufficient buffer will be requested to include a sign bit.
For example, when converting 128 with `n_bytes=1', the function will return
2 (or more) in order to store a zero sign bit.

If @code{Py_ASNATIVEBYTES_UNSIGNED_BUFFER} is specified, a zero sign bit
will be omitted from size calculations. This allows, for example, 128 to fit
in a single-byte buffer. If the destination buffer is later treated as
signed, a positive input value may become negative.
Note that the flag does not affect handling of negative values: for those,
space for a sign bit is always requested.

Specifying @code{Py_ASNATIVEBYTES_REJECT_NEGATIVE} causes an exception to be set
if `pylong' is negative. Without this flag, negative values will be copied
provided there is enough space for at least one sign bit, regardless of
whether @code{Py_ASNATIVEBYTES_UNSIGNED_BUFFER} was specified.

If @code{Py_ASNATIVEBYTES_ALLOW_INDEX} is specified and a non-integer value is
passed, its @ref{19e,,__index__()} method will be called first. This may
result in Python code executing and other threads being allowed to run, which
could cause changes to other objects or values in use. When `flags' is
@code{-1}, this option is not set, and non-integer values will raise
@ref{198,,TypeError}.

@cartouche
@quotation 참고 
With the default `flags' (@code{-1}, or `UNSIGNED_BUFFER'  without
`REJECT_NEGATIVE'), multiple Python integers can map to a single value
without overflow. For example, both @code{255} and @code{-1} fit a single-byte
buffer and set all its bits.
This matches typical C cast behavior.
@end quotation
@end cartouche


Added in version 3.13.

@end deffn

@geindex PyLong_AsPid (C macro)
@anchor{c-api/long c PyLong_AsPid}@anchor{19cf}
@deffn {C 매크로} PyLong_AsPid (pid)

Macro for converting a Python integer into a process identifier.

This can be defined as an alias to @ref{603,,PyLong_AsLong()},
@ref{1bcf,,PyLong_FromLongLong()}, or @ref{602,,PyLong_AsInt()}, depending on the
size of the system’s PID type.


Added in version 3.2.

@end deffn

@geindex PyLong_GetSign (C function)
@anchor{c-api/long c PyLong_GetSign}@anchor{39a}
@deffn {C 함수} int PyLong_GetSign (PyObject *obj, int *sign)

Get the sign of the integer object `obj'.

On success, set `*sign' to the integer sign  (0, -1 or +1 for zero, negative or
positive integer, respectively) and return 0.

On failure, return -1 with an exception set.  This function always succeeds
if `obj' is a @ref{39e,,PyLongObject} or its subtype.


Added in version 3.14.

@end deffn

@geindex PyLong_IsPositive (C function)
@anchor{c-api/long c PyLong_IsPositive}@anchor{39b}
@deffn {C 함수} int PyLong_IsPositive (PyObject *obj)

Check if the integer object `obj' is positive (@code{obj > 0}).

If `obj' is an instance of @ref{39e,,PyLongObject} or its subtype,
return @code{1} when it’s positive and @code{0} otherwise.  Else set an
exception and return @code{-1}.


Added in version 3.14.

@end deffn

@geindex PyLong_IsNegative (C function)
@anchor{c-api/long c PyLong_IsNegative}@anchor{39c}
@deffn {C 함수} int PyLong_IsNegative (PyObject *obj)

Check if the integer object `obj' is negative (@code{obj < 0}).

If `obj' is an instance of @ref{39e,,PyLongObject} or its subtype,
return @code{1} when it’s negative and @code{0} otherwise.  Else set an
exception and return @code{-1}.


Added in version 3.14.

@end deffn

@geindex PyLong_IsZero (C function)
@anchor{c-api/long c PyLong_IsZero}@anchor{39d}
@deffn {C 함수} int PyLong_IsZero (PyObject *obj)

Check if the integer object `obj' is zero.

If `obj' is an instance of @ref{39e,,PyLongObject} or its subtype,
return @code{1} when it’s zero and @code{0} otherwise.  Else set an
exception and return @code{-1}.


Added in version 3.14.

@end deffn

@geindex PyLong_GetInfo (C function)
@anchor{c-api/long c PyLong_GetInfo}@anchor{508d}
@deffn {C 함수} @ref{5dc,,PyObject} *PyLong_GetInfo (void)
` Part of the @ref{774,,안정 ABI}.'
On success, return a read only @ref{85d,,named tuple}, that holds
information about Python’s internal representation of integers.
See @ref{1498,,sys.int_info} for description of individual fields.

On failure, return @code{NULL} with an exception set.


Added in version 3.1.

@end deffn

@geindex PyUnstable_Long_IsCompact (C function)
@anchor{c-api/long c PyUnstable_Long_IsCompact}@anchor{7a5}
@deffn {C 함수} int PyUnstable_Long_IsCompact (const PyLongObject *op)

@cartouche
@quotation 이것은 불안정 API. It may change without warning in minor releases. `이것은 @ref{768,,불안정 API}. It may change without warning in minor releases.'
@end quotation
@end cartouche

Return 1 if `op' is compact, 0 otherwise.

This function makes it possible for performance-critical code to implement
a “fast path” for small integers. For compact values use
@ref{7a6,,PyUnstable_Long_CompactValue()}; for others fall back to a
@ref{5086,,PyLong_As*} function or
@ref{604,,PyLong_AsNativeBytes()}.

The speedup is expected to be negligible for most users.

Exactly what values are considered compact is an implementation detail
and is subject to change.


Added in version 3.12.

@end deffn

@geindex PyUnstable_Long_CompactValue (C function)
@anchor{c-api/long c PyUnstable_Long_CompactValue}@anchor{7a6}
@deffn {C 함수} @ref{c54,,Py_ssize_t} PyUnstable_Long_CompactValue (const PyLongObject *op)

@cartouche
@quotation 이것은 불안정 API. It may change without warning in minor releases. `이것은 @ref{768,,불안정 API}. It may change without warning in minor releases.'
@end quotation
@end cartouche

If `op' is compact, as determined by @ref{7a5,,PyUnstable_Long_IsCompact()},
return its value.

Otherwise, the return value is undefined.


Added in version 3.12.

@end deffn

@menu
* Export API:: 
* PyLongWriter API:: 
* Deprecated API:: 

@end menu

@node Export API,PyLongWriter API,,정수 객체
@anchor{c-api/long export-api}@anchor{533f}
@subsubsection Export API



Added in version 3.14.


@geindex PyLongLayout (C struct)
@anchor{c-api/long c PyLongLayout}@anchor{5340}
@deffn {C 구조체} struct PyLongLayout

Layout of an array of “digits” (“limbs” in the GMP terminology), used to
represent absolute value for arbitrary precision integers.

Use @ref{3a7,,PyLong_GetNativeLayout()} to get the native layout of Python
@ref{19b,,int} objects, used internally for integers with “big enough”
absolute value.

See also @ref{1498,,sys.int_info} which exposes similar information in Python.

@geindex PyLongLayout.bits_per_digit (C member)
@anchor{c-api/long c PyLongLayout bits_per_digit}@anchor{5341}
@deffn {C 멤버 변수} uint8_t bits_per_digit

Bits per digit. For example, a 15 bit digit means that bits 0-14 contain
meaningful information.
@end deffn

@geindex PyLongLayout.digit_size (C member)
@anchor{c-api/long c PyLongLayout digit_size}@anchor{5342}
@deffn {C 멤버 변수} uint8_t digit_size

Digit size in bytes. For example, a 15 bit digit will require at least 2
bytes.
@end deffn

@geindex PyLongLayout.digits_order (C member)
@anchor{c-api/long c PyLongLayout digits_order}@anchor{5343}
@deffn {C 멤버 변수} int8_t digits_order

Digits order:


@itemize -

@item 
@code{1} for most significant digit first

@item 
@code{-1} for least significant digit first
@end itemize
@end deffn

@geindex PyLongLayout.digit_endianness (C member)
@anchor{c-api/long c PyLongLayout digit_endianness}@anchor{5344}
@deffn {C 멤버 변수} int8_t digit_endianness

Digit endianness:


@itemize -

@item 
@code{1} for most significant byte first (big endian)

@item 
@code{-1} for least significant byte first (little endian)
@end itemize
@end deffn
@end deffn

@geindex PyLong_GetNativeLayout (C function)
@anchor{c-api/long c PyLong_GetNativeLayout}@anchor{3a7}
@deffn {C 함수} const @ref{5340,,PyLongLayout} *PyLong_GetNativeLayout (void)

Get the native layout of Python @ref{19b,,int} objects.

See the @ref{5340,,PyLongLayout} structure.

The function must not be called before Python initialization nor after
Python finalization. The returned layout is valid until Python is
finalized. The layout is the same for all Python sub-interpreters
in a process, and so it can be cached.
@end deffn

@geindex PyLongExport (C struct)
@anchor{c-api/long c PyLongExport}@anchor{5345}
@deffn {C 구조체} struct PyLongExport

Export of a Python @ref{19b,,int} object.

There are two cases:


@itemize *

@item 
If @ref{5346,,digits} is @code{NULL}, only use the @ref{5347,,value} member.

@item 
If @ref{5346,,digits} is not @code{NULL}, use @ref{5348,,negative},
@ref{5349,,ndigits} and @code{digits} members.
@end itemize

@geindex PyLongExport.value (C member)
@anchor{c-api/long c PyLongExport value}@anchor{5347}
@deffn {C 멤버 변수} int64_t value

The native integer value of the exported @ref{19b,,int} object.
Only valid if @ref{5346,,digits} is @code{NULL}.
@end deffn

@geindex PyLongExport.negative (C member)
@anchor{c-api/long c PyLongExport negative}@anchor{5348}
@deffn {C 멤버 변수} uint8_t negative

@code{1} if the number is negative, @code{0} otherwise.
Only valid if @ref{5346,,digits} is not @code{NULL}.
@end deffn

@geindex PyLongExport.ndigits (C member)
@anchor{c-api/long c PyLongExport ndigits}@anchor{5349}
@deffn {C 멤버 변수} @ref{c54,,Py_ssize_t} ndigits

Number of digits in @ref{5346,,digits} array.
Only valid if @code{digits} is not @code{NULL}.
@end deffn

@geindex PyLongExport.digits (C member)
@anchor{c-api/long c PyLongExport digits}@anchor{5346}
@deffn {C 멤버 변수} const void *digits

Read-only array of unsigned digits. Can be @code{NULL}.
@end deffn
@end deffn

@geindex PyLong_Export (C function)
@anchor{c-api/long c PyLong_Export}@anchor{3a8}
@deffn {C 함수} int PyLong_Export (PyObject *obj, PyLongExport *export_long)

Export a Python @ref{19b,,int} object.

`export_long' must point to a @ref{5345,,PyLongExport} structure allocated
by the caller. It must not be @code{NULL}.

On success, fill in `*export_long' and return @code{0}.
On error, set an exception and return @code{-1}.

@ref{3a9,,PyLong_FreeExport()} must be called when the export is no longer
needed.

@quotation

`CPython 구현 상세:' This function always succeeds if `obj' is a Python @ref{19b,,int} object
or a subclass.
@end quotation
@end deffn

@geindex PyLong_FreeExport (C function)
@anchor{c-api/long c PyLong_FreeExport}@anchor{3a9}
@deffn {C 함수} void PyLong_FreeExport (PyLongExport *export_long)

Release the export `export_long' created by @ref{3a8,,PyLong_Export()}.

`CPython 구현 상세:' Calling @ref{3a9,,PyLong_FreeExport()} is optional if `export_long->digits'
is @code{NULL}.
@end deffn

@node PyLongWriter API,Deprecated API,Export API,정수 객체
@anchor{c-api/long pylongwriter-api}@anchor{534a}
@subsubsection PyLongWriter API


The @ref{534b,,PyLongWriter} API can be used to import an integer.


Added in version 3.14.


@geindex PyLongWriter (C struct)
@anchor{c-api/long c PyLongWriter}@anchor{534b}
@deffn {C 구조체} struct PyLongWriter

A Python @ref{19b,,int} writer instance.

The instance must be destroyed by @ref{3ab,,PyLongWriter_Finish()} or
@ref{3ac,,PyLongWriter_Discard()}.
@end deffn

@geindex PyLongWriter_Create (C function)
@anchor{c-api/long c PyLongWriter_Create}@anchor{3aa}
@deffn {C 함수} @ref{534b,,PyLongWriter} *PyLongWriter_Create (int negative, Py_ssize_t ndigits, void **digits)

Create a @ref{534b,,PyLongWriter}.

On success, allocate `*digits' and return a writer.
On error, set an exception and return @code{NULL}.

`negative' is @code{1} if the number is negative, or @code{0} otherwise.

`ndigits' is the number of digits in the `digits' array. It must be
greater than 0.

`digits' must not be NULL.

After a successful call to this function, the caller should fill in the
array of digits `digits' and then call @ref{3ab,,PyLongWriter_Finish()} to get
a Python @ref{19b,,int}.
The layout of `digits' is described by @ref{3a7,,PyLong_GetNativeLayout()}.

Digits must be in the range [@code{0}; @code{(1 << bits_per_digit) - 1}]
(where the @ref{5341,,bits_per_digit} is the number of bits
per digit).
Any unused most significant digits must be set to @code{0}.

Alternately, call @ref{3ac,,PyLongWriter_Discard()} to destroy the writer
instance without creating an @ref{19b,,int} object.
@end deffn

@geindex PyLongWriter_Finish (C function)
@anchor{c-api/long c PyLongWriter_Finish}@anchor{3ab}
@deffn {C 함수} @ref{5dc,,PyObject} *PyLongWriter_Finish (PyLongWriter *writer)
`반환값: 새 참조.'
Finish a @ref{534b,,PyLongWriter} created by @ref{3aa,,PyLongWriter_Create()}.

On success, return a Python @ref{19b,,int} object.
On error, set an exception and return @code{NULL}.

The function takes care of normalizing the digits and converts the object
to a compact integer if needed.

The writer instance and the `digits' array are invalid after the call.
@end deffn

@geindex PyLongWriter_Discard (C function)
@anchor{c-api/long c PyLongWriter_Discard}@anchor{3ac}
@deffn {C 함수} void PyLongWriter_Discard (PyLongWriter *writer)

Discard a @ref{534b,,PyLongWriter} created by @ref{3aa,,PyLongWriter_Create()}.

If `writer' is @code{NULL}, no operation is performed.

The writer instance and the `digits' array are invalid after the call.
@end deffn

@node Deprecated API,,PyLongWriter API,정수 객체
@anchor{c-api/long deprecated-api}@anchor{534c}
@subsubsection Deprecated API


These macros are @ref{23d,,soft deprecated}. They describe parameters
of the internal representation of @ref{39e,,PyLongObject} instances.

Use @ref{3a7,,PyLong_GetNativeLayout()} instead, along with @ref{3a8,,PyLong_Export()}
to read integer data or @ref{534b,,PyLongWriter} to write it.
These currently use the same layout, but are designed to continue working correctly
even if CPython’s internal integer representation changes.

@geindex PyLong_SHIFT (C macro)
@anchor{c-api/long c PyLong_SHIFT}@anchor{534d}
@deffn {C 매크로} PyLong_SHIFT

This is equivalent to @ref{5341,,bits_per_digit} in
the output of @ref{3a7,,PyLong_GetNativeLayout()}.
@end deffn

@geindex PyLong_BASE (C macro)
@anchor{c-api/long c PyLong_BASE}@anchor{1bfe}
@deffn {C 매크로} PyLong_BASE

This is currently equivalent to 1 << @ref{534d,,PyLong_SHIFT}.
@end deffn

@geindex PyLong_MASK (C macro)
@anchor{c-api/long c PyLong_MASK}@anchor{534e}
@deffn {C 매크로} PyLong_MASK

This is currently equivalent to (1 << @ref{534d,,PyLong_SHIFT}) - 1
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 불리언 객체,부동 소수점 객체,정수 객체,숫자 객체
@anchor{c-api/bool doc}@anchor{534f}@anchor{c-api/bool boolean-objects}@anchor{5350}@anchor{c-api/bool boolobjects}@anchor{5351}@anchor{c-api/bool translation-repo}@anchor{5352}
@subsubsection 불리언 객체


파이썬에서 불리언은 정수의 서브 클래스로 구현됩니다. @ref{5353,,Py_False}와 @ref{5354,,Py_True}라는 두 개의 부울만 있습니다. 따라서 일반적인 생성 및 삭제 함수는 부울에 적용되지 않습니다. 그러나 다음 매크로를 사용할 수 있습니다.

@geindex PyBool_Type (C var)
@anchor{c-api/bool c PyBool_Type}@anchor{4fb6}
@deffn {C 변수} @ref{c9b,,PyTypeObject} PyBool_Type
` Part of the @ref{774,,안정 ABI}.'
This instance of @ref{c9b,,PyTypeObject} represents the Python boolean type; it
is the same object as @ref{3c3,,bool} in the Python layer.
@end deffn

@geindex PyBool_Check (C function)
@anchor{c-api/bool c PyBool_Check}@anchor{5355}
@deffn {C 함수} int PyBool_Check (PyObject *o)

`o'가 @ref{4fb6,,PyBool_Type} 형이면 참을 돌려줍니다. 이 함수는 항상 성공합니다.
@end deffn

@geindex Py_False (C var)
@anchor{c-api/bool c Py_False}@anchor{5353}
@deffn {C 변수} @ref{5dc,,PyObject} *Py_False

파이썬 @code{False} 객체. 이 객체는 메서드가 없고 @ref{290,,불멸}입니다.


버전 3.12에서 변경: @ref{5353,,Py_False}는 @ref{290,,불멸}입니다.

@end deffn

@geindex Py_True (C var)
@anchor{c-api/bool c Py_True}@anchor{5354}
@deffn {C 변수} @ref{5dc,,PyObject} *Py_True

파이썬 @code{True} 객체. 이 객체는 메서드가 없고 @ref{290,,불멸}입니다.


버전 3.12에서 변경: @ref{5354,,Py_True}는 @ref{290,,불멸}입니다.

@end deffn

@geindex Py_RETURN_FALSE (C macro)
@anchor{c-api/bool c Py_RETURN_FALSE}@anchor{167a}
@deffn {C 매크로} Py_RETURN_FALSE

함수에서 @ref{5353,,Py_False}를 반환합니다.
@end deffn

@geindex Py_RETURN_TRUE (C macro)
@anchor{c-api/bool c Py_RETURN_TRUE}@anchor{1679}
@deffn {C 매크로} Py_RETURN_TRUE

함수에서 @ref{5354,,Py_True}를 반환합니다.
@end deffn

@geindex PyBool_FromLong (C function)
@anchor{c-api/bool c PyBool_FromLong}@anchor{4fb5}
@deffn {C 함수} @ref{5dc,,PyObject} *PyBool_FromLong (long v)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
`v'의 논리값에 따라 @ref{5354,,Py_True} 나 @ref{5353,,Py_False}를 반환합니다.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 부동 소수점 객체,복소수 객체,불리언 객체,숫자 객체
@anchor{c-api/float doc}@anchor{5356}@anchor{c-api/float floating-point-objects}@anchor{5357}@anchor{c-api/float floatobjects}@anchor{5358}@anchor{c-api/float translation-repo}@anchor{5359}
@subsubsection 부동 소수점 객체


@geindex 객체;부동 소수점

@geindex PyFloatObject (C type)
@anchor{c-api/float c PyFloatObject}@anchor{535a}
@deffn {C 자료형} type PyFloatObject

이 @ref{5dc,,PyObject}의 서브 형은 파이썬 부동 소수점 객체를 나타냅니다.
@end deffn

@geindex PyFloat_Type (C var)
@anchor{c-api/float c PyFloat_Type}@anchor{506a}
@deffn {C 변수} @ref{c9b,,PyTypeObject} PyFloat_Type
` Part of the @ref{774,,안정 ABI}.'
이 @ref{c9b,,PyTypeObject} 인스턴스는 파이썬 부동 소수점 형을 나타냅니다. 이것은 파이썬 계층에서 @ref{196,,float}와 같은 객체입니다.
@end deffn

@geindex PyFloat_Check (C function)
@anchor{c-api/float c PyFloat_Check}@anchor{535b}
@deffn {C 함수} int PyFloat_Check (PyObject *p)

인자가 @ref{535a,,PyFloatObject} 나 @code{PyFloatObject}의 서브 형이면 참을 반환합니다. 이 함수는 항상 성공합니다.
@end deffn

@geindex PyFloat_CheckExact (C function)
@anchor{c-api/float c PyFloat_CheckExact}@anchor{535c}
@deffn {C 함수} int PyFloat_CheckExact (PyObject *p)

인자가 @ref{535a,,PyFloatObject}이지만 @code{PyFloatObject}의 서브 형은 아니면 참을 반환합니다. 이 함수는 항상 성공합니다.
@end deffn

@geindex PyFloat_FromString (C function)
@anchor{c-api/float c PyFloat_FromString}@anchor{5069}
@deffn {C 함수} @ref{5dc,,PyObject} *PyFloat_FromString (PyObject *str)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
`str'의 문자열 값을 기반으로 @ref{535a,,PyFloatObject} 객체를 만들거나, 실패하면 @code{NULL}.
@end deffn

@geindex PyFloat_FromDouble (C function)
@anchor{c-api/float c PyFloat_FromDouble}@anchor{5068}
@deffn {C 함수} @ref{5dc,,PyObject} *PyFloat_FromDouble (double v)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
`v'로부터 @ref{535a,,PyFloatObject} 객체를 만들거나, 실패하면 @code{NULL}.
@end deffn

@geindex PyFloat_AsDouble (C function)
@anchor{c-api/float c PyFloat_AsDouble}@anchor{c5e}
@deffn {C 함수} double PyFloat_AsDouble (PyObject *pyfloat)
` Part of the @ref{774,,안정 ABI}.'
`pyfloat' 의 내용의 C double 표현을 반환합니다. `pyfloat'가 파이썬 부동 소수점 객체가 아니지만 @ref{bc0,,__float__()} 메서드가 있으면, `pyfloat'를 float로 변환하기 위해 이 메서드가 먼저 호출됩니다. @code{__float__()}가 정의되지 않았으면 @ref{19e,,__index__()}로 대체합니다. 이 메서드는 실패하면 @code{-1.0}을 반환하므로, @ref{1cac,,PyErr_Occurred()}를 호출하여 에러를 확인해야 합니다.


버전 3.8에서 변경: 사용할 수 있으면 @ref{19e,,__index__()}를 사용합니다.

@end deffn

@geindex PyFloat_AS_DOUBLE (C function)
@anchor{c-api/float c PyFloat_AS_DOUBLE}@anchor{535d}
@deffn {C 함수} double PyFloat_AS_DOUBLE (PyObject *pyfloat)

에러 검사 없이 `pyfloat' 의 내용의 C double 표현을 반환합니다.
@end deffn

@geindex PyFloat_GetInfo (C function)
@anchor{c-api/float c PyFloat_GetInfo}@anchor{15f5}
@deffn {C 함수} @ref{5dc,,PyObject} *PyFloat_GetInfo (void)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
float의 정밀도, 최솟값, 최댓값에 관한 정보를 포함한 structseq 인스턴스를 돌려줍니다. 헤더 파일 @code{float.h}를 감싸는 얇은 래퍼입니다.
@end deffn

@geindex PyFloat_GetMax (C function)
@anchor{c-api/float c PyFloat_GetMax}@anchor{15f3}
@deffn {C 함수} double PyFloat_GetMax ()
` Part of the @ref{774,,안정 ABI}.'
최대 표현 가능한 유한 float `DBL_MAX'를 C double로 반환합니다.
@end deffn

@geindex PyFloat_GetMin (C function)
@anchor{c-api/float c PyFloat_GetMin}@anchor{15f4}
@deffn {C 함수} double PyFloat_GetMin ()
` Part of the @ref{774,,안정 ABI}.'
최소 정규화된(normalized) 양의 float `DBL_MIN'를 C double로 반환합니다.
@end deffn

@geindex Py_INFINITY (C macro)
@anchor{c-api/float c Py_INFINITY}@anchor{535e}
@deffn {C 매크로} Py_INFINITY

This macro expands to a constant expression of type double, that
represents the positive infinity.

On most platforms, this is equivalent to the @code{INFINITY} macro from
the C11 standard @code{<math.h>} header.
@end deffn

@geindex Py_NAN (C macro)
@anchor{c-api/float c Py_NAN}@anchor{535f}
@deffn {C 매크로} Py_NAN

This macro expands to a constant expression of type double, that
represents a quiet not-a-number (qNaN) value.

On most platforms, this is equivalent to the @code{NAN} macro from
the C11 standard @code{<math.h>} header.
@end deffn

@geindex Py_HUGE_VAL (C macro)
@anchor{c-api/float c Py_HUGE_VAL}@anchor{5360}
@deffn {C 매크로} Py_HUGE_VAL

Equivalent to @code{INFINITY}.


버전 3.14부터 폐지됨: The macro is @ref{23d,,soft deprecated}.

@end deffn

@geindex Py_MATH_E (C macro)
@anchor{c-api/float c Py_MATH_E}@anchor{5361}
@deffn {C 매크로} Py_MATH_E

The definition (accurate for a double type) of the @ref{2aa7,,math.e} constant.
@end deffn

@geindex Py_MATH_El (C macro)
@anchor{c-api/float c Py_MATH_El}@anchor{5362}
@deffn {C 매크로} Py_MATH_El

High precision (long double) definition of @ref{2aa7,,e} constant.
@end deffn

@geindex Py_MATH_PI (C macro)
@anchor{c-api/float c Py_MATH_PI}@anchor{5363}
@deffn {C 매크로} Py_MATH_PI

The definition (accurate for a double type) of the @ref{2aa6,,math.pi} constant.
@end deffn

@geindex Py_MATH_PIl (C macro)
@anchor{c-api/float c Py_MATH_PIl}@anchor{5364}
@deffn {C 매크로} Py_MATH_PIl

High precision (long double) definition of @ref{2aa6,,pi} constant.
@end deffn

@geindex Py_MATH_TAU (C macro)
@anchor{c-api/float c Py_MATH_TAU}@anchor{5365}
@deffn {C 매크로} Py_MATH_TAU

The definition (accurate for a double type) of the @ref{2aa8,,math.tau} constant.


Added in version 3.6.

@end deffn

@geindex Py_RETURN_NAN (C macro)
@anchor{c-api/float c Py_RETURN_NAN}@anchor{5366}
@deffn {C 매크로} Py_RETURN_NAN

Return @ref{872,,math.nan} from a function.

On most platforms, this is equivalent to @code{return PyFloat_FromDouble(NAN)}.
@end deffn

@geindex Py_RETURN_INF (C macro)
@anchor{c-api/float c Py_RETURN_INF}@anchor{5367}
@deffn {C 매크로} Py_RETURN_INF (sign)

Return @ref{e7d,,math.inf} or @code{-math.inf} from a function,
depending on the sign of `sign'.

On most platforms, this is equivalent to the following:

@example
return PyFloat_FromDouble(copysign(INFINITY, sign));
@end example
@end deffn

@geindex Py_IS_FINITE (C macro)
@anchor{c-api/float c Py_IS_FINITE}@anchor{5368}
@deffn {C 매크로} Py_IS_FINITE (X)

Return @code{1} if the given floating-point number `X' is finite,
that is, it is normal, subnormal or zero, but not infinite or NaN.
Return @code{0} otherwise.


버전 3.14부터 폐지됨: The macro is @ref{23d,,soft deprecated}.  Use @code{isfinite} instead.

@end deffn

@geindex Py_IS_INFINITY (C macro)
@anchor{c-api/float c Py_IS_INFINITY}@anchor{5369}
@deffn {C 매크로} Py_IS_INFINITY (X)

Return @code{1} if the given floating-point number `X' is positive or negative
infinity.  Return @code{0} otherwise.


버전 3.14부터 폐지됨: The macro is @ref{23d,,soft deprecated}.  Use @code{isinf} instead.

@end deffn

@geindex Py_IS_NAN (C macro)
@anchor{c-api/float c Py_IS_NAN}@anchor{167b}
@deffn {C 매크로} Py_IS_NAN (X)

Return @code{1} if the given floating-point number `X' is a not-a-number (NaN)
value.  Return @code{0} otherwise.


버전 3.14부터 폐지됨: The macro is @ref{23d,,soft deprecated}.  Use @code{isnan} instead.

@end deffn

@menu
* Pack and Unpack functions:: 

@end menu

@node Pack and Unpack functions,,,부동 소수점 객체
@anchor{c-api/float pack-and-unpack-functions}@anchor{536a}
@subsubsection Pack and Unpack functions


The pack and unpack functions provide an efficient platform-independent way to
store floating-point values as byte strings. The Pack routines produce a bytes
string from a C double, and the Unpack routines produce a C
double from such a bytes string. The suffix (2, 4 or 8) specifies the
number of bytes in the bytes string.

On platforms that appear to use IEEE 754 formats these functions work by
copying bits. On other platforms, the 2-byte format is identical to the IEEE
754 binary16 half-precision format, the 4-byte format (32-bit) is identical to
the IEEE 754 binary32 single precision format, and the 8-byte format to the
IEEE 754 binary64 double precision format, although the packing of INFs and
NaNs (if such things exist on the platform) isn’t handled correctly, and
attempting to unpack a bytes string containing an IEEE INF or NaN will raise an
exception.

Note that NaN type may not be preserved on IEEE platforms (signaling NaNs become
quiet NaNs), for example on x86 systems in 32-bit mode.

On non-IEEE platforms with more precision, or larger dynamic range, than IEEE
754 supports, not all values can be packed; on non-IEEE platforms with less
precision, or smaller dynamic range, not all values can be unpacked. What
happens in such cases is partly accidental (alas).


Added in version 3.11.


@menu
* Pack functions:: 
* Unpack functions:: 

@end menu

@node Pack functions,Unpack functions,,Pack and Unpack functions
@anchor{c-api/float pack-functions}@anchor{536b}
@subsubsection Pack functions


The pack routines write 2, 4 or 8 bytes, starting at `p'. `le' is an
int argument, non-zero if you want the bytes string in little-endian
format (exponent last, at @code{p+1}, @code{p+3}, or @code{p+6} and @code{p+7}), zero if you
want big-endian format (exponent first, at `p'). The @code{PY_BIG_ENDIAN}
constant can be used to use the native endian: it is equal to @code{1} on big
endian processor, or @code{0} on little endian processor.

Return value: @code{0} if all is OK, @code{-1} if error (and an exception is set,
most likely @ref{a81,,OverflowError}).

There are two problems on non-IEEE platforms:


@itemize *

@item 
What this does is undefined if `x' is a NaN or infinity.

@item 
@code{-0.0} and @code{+0.0} produce the same bytes string.
@end itemize

@geindex PyFloat_Pack2 (C function)
@anchor{c-api/float c PyFloat_Pack2}@anchor{968}
@deffn {C 함수} int PyFloat_Pack2 (double x, char *p, int le)

Pack a C double as the IEEE 754 binary16 half-precision format.
@end deffn

@geindex PyFloat_Pack4 (C function)
@anchor{c-api/float c PyFloat_Pack4}@anchor{969}
@deffn {C 함수} int PyFloat_Pack4 (double x, char *p, int le)

Pack a C double as the IEEE 754 binary32 single precision format.
@end deffn

@geindex PyFloat_Pack8 (C function)
@anchor{c-api/float c PyFloat_Pack8}@anchor{96a}
@deffn {C 함수} int PyFloat_Pack8 (double x, char *p, int le)

Pack a C double as the IEEE 754 binary64 double precision format.
@end deffn

@node Unpack functions,,Pack functions,Pack and Unpack functions
@anchor{c-api/float unpack-functions}@anchor{536c}
@subsubsection Unpack functions


The unpack routines read 2, 4 or 8 bytes, starting at `p'.  `le' is an
int argument, non-zero if the bytes string is in little-endian format
(exponent last, at @code{p+1}, @code{p+3} or @code{p+6} and @code{p+7}), zero if big-endian
(exponent first, at `p'). The @code{PY_BIG_ENDIAN} constant can be used to
use the native endian: it is equal to @code{1} on big endian processor, or @code{0}
on little endian processor.

Return value: The unpacked double.  On error, this is @code{-1.0} and
@ref{1cac,,PyErr_Occurred()} is true (and an exception is set, most likely
@ref{a81,,OverflowError}).

Note that on a non-IEEE platform this will refuse to unpack a bytes string that
represents a NaN or infinity.

@geindex PyFloat_Unpack2 (C function)
@anchor{c-api/float c PyFloat_Unpack2}@anchor{96b}
@deffn {C 함수} double PyFloat_Unpack2 (const char *p, int le)

Unpack the IEEE 754 binary16 half-precision format as a C double.
@end deffn

@geindex PyFloat_Unpack4 (C function)
@anchor{c-api/float c PyFloat_Unpack4}@anchor{96c}
@deffn {C 함수} double PyFloat_Unpack4 (const char *p, int le)

Unpack the IEEE 754 binary32 single precision format as a C double.
@end deffn

@geindex PyFloat_Unpack8 (C function)
@anchor{c-api/float c PyFloat_Unpack8}@anchor{96d}
@deffn {C 함수} double PyFloat_Unpack8 (const char *p, int le)

Unpack the IEEE 754 binary64 double precision format as a C double.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 복소수 객체,,부동 소수점 객체,숫자 객체
@anchor{c-api/complex doc}@anchor{536d}@anchor{c-api/complex complex-number-objects}@anchor{536e}@anchor{c-api/complex complexobjects}@anchor{536f}@anchor{c-api/complex translation-repo}@anchor{5370}
@subsubsection 복소수 객체


@geindex 객체;복소수

파이썬의 복소수 객체는 C API에서 볼 때 두 개의 다른 형으로 구현됩니다: 하나는 파이썬 프로그램에 노출된 파이썬 객체이고, 다른 하나는 실제 복소수 값을 나타내는 C 구조체입니다. API는 두 가지 모두도 작업할 수 있는 함수를 제공합니다.

@menu
* C 구조체로서의 복소수:: 
* 파이썬 객체로서의 복소수:: 

@end menu

@node C 구조체로서의 복소수,파이썬 객체로서의 복소수,,복소수 객체
@anchor{c-api/complex complex-numbers-as-c-structures}@anchor{5371}
@subsubsection C 구조체로서의 복소수


매개 변수로 이러한 구조체를 받아들이고 결과로 반환하는 함수는 포인터를 통해 역참조하기보다는 `값으로' 다룹니다. 이는 API 전체에서 일관됩니다.

@geindex Py_complex (C type)
@anchor{c-api/complex c Py_complex}@anchor{527c}
@deffn {C 자료형} type Py_complex

파이썬 복소수 객체의 값 부분에 해당하는 C 구조체. 복소수 객체를 다루는 대부분 함수는 이 형의 구조체를 입력 또는 출력값으로 적절하게 사용합니다.

@geindex Py_complex.real (C member)
@geindex Py_complex.imag (C member)
@anchor{c-api/complex c Py_complex real}@anchor{5372}
@deffn {C 멤버 변수} double real
@anchor{c-api/complex c Py_complex imag}@anchor{5373}
@deffnx {C 멤버 변수} double imag
@end deffn

구조체는 다음과 같이 정의됩니다:

@example
typedef struct @{
    double real;
    double imag;
@} Py_complex;
@end example
@end deffn

@geindex _Py_c_sum (C function)
@anchor{c-api/complex c _Py_c_sum}@anchor{5374}
@deffn {C 함수} @ref{527c,,Py_complex} _Py_c_sum (Py_complex left, Py_complex right)

C @ref{527c,,Py_complex} 표현을 사용하여 두 복소수의 합을 반환합니다.
@end deffn

@geindex _Py_c_diff (C function)
@anchor{c-api/complex c _Py_c_diff}@anchor{5375}
@deffn {C 함수} @ref{527c,,Py_complex} _Py_c_diff (Py_complex left, Py_complex right)

C @ref{527c,,Py_complex} 표현을 사용하여 두 복소수의 차이를 반환합니다.
@end deffn

@geindex _Py_c_neg (C function)
@anchor{c-api/complex c _Py_c_neg}@anchor{5376}
@deffn {C 함수} @ref{527c,,Py_complex} _Py_c_neg (Py_complex num)

C @ref{527c,,Py_complex} 표현을 사용하여 복소수 `num'의 음의 값을 반환합니다.
@end deffn

@geindex _Py_c_prod (C function)
@anchor{c-api/complex c _Py_c_prod}@anchor{5377}
@deffn {C 함수} @ref{527c,,Py_complex} _Py_c_prod (Py_complex left, Py_complex right)

C @ref{527c,,Py_complex} 표현을 사용하여 두 복소수의 곱을 반환합니다.
@end deffn

@geindex _Py_c_quot (C function)
@anchor{c-api/complex c _Py_c_quot}@anchor{5378}
@deffn {C 함수} @ref{527c,,Py_complex} _Py_c_quot (Py_complex dividend, Py_complex divisor)

C @ref{527c,,Py_complex} 표현을 사용하여 두 복소수의 몫을 반환합니다.

`divisor'가 null이면, 이 메서드는 0을 반환하고, @code{errno}를 @code{EDOM}으로 설정합니다.
@end deffn

@geindex _Py_c_pow (C function)
@anchor{c-api/complex c _Py_c_pow}@anchor{18f3}
@deffn {C 함수} @ref{527c,,Py_complex} _Py_c_pow (Py_complex num, Py_complex exp)

C @ref{527c,,Py_complex} 표현을 사용하여 `num'의 `exp' 거듭제곱을 반환합니다.

`num'이 null이고 `exp'가 양의 실수가 아니면, 이 메서드는 0을 반환하고 @code{errno}를 @code{EDOM}으로 설정합니다.

오버플로면 @code{errno}를 @code{ERANGE}으로 설정합니다.
@end deffn

@node 파이썬 객체로서의 복소수,,C 구조체로서의 복소수,복소수 객체
@anchor{c-api/complex complex-numbers-as-python-objects}@anchor{5379}
@subsubsection 파이썬 객체로서의 복소수


@geindex PyComplexObject (C type)
@anchor{c-api/complex c PyComplexObject}@anchor{537a}
@deffn {C 자료형} type PyComplexObject

파이썬 복소수 객체를 나타내는 @ref{5dc,,PyObject}의 서브 형.
@end deffn

@geindex PyComplex_Type (C var)
@anchor{c-api/complex c PyComplex_Type}@anchor{4fed}
@deffn {C 변수} @ref{c9b,,PyTypeObject} PyComplex_Type
` Part of the @ref{774,,안정 ABI}.'
이 @ref{c9b,,PyTypeObject} 인스턴스는 파이썬 복소수 형을 나타냅니다. 파이썬 계층의 @ref{197,,complex}와 같은 객체입니다.
@end deffn

@geindex PyComplex_Check (C function)
@anchor{c-api/complex c PyComplex_Check}@anchor{537b}
@deffn {C 함수} int PyComplex_Check (PyObject *p)

인자가 @ref{537a,,PyComplexObject} 나 @code{PyComplexObject}의 서브 형이면 참을 반환합니다. 이 함수는 항상 성공합니다.
@end deffn

@geindex PyComplex_CheckExact (C function)
@anchor{c-api/complex c PyComplex_CheckExact}@anchor{537c}
@deffn {C 함수} int PyComplex_CheckExact (PyObject *p)

인자가 @ref{537a,,PyComplexObject}이지만, @code{PyComplexObject}의 서브 유형이 아니면 참을 반환합니다. 이 함수는 항상 성공합니다.
@end deffn

@geindex PyComplex_FromCComplex (C function)
@anchor{c-api/complex c PyComplex_FromCComplex}@anchor{537d}
@deffn {C 함수} @ref{5dc,,PyObject} *PyComplex_FromCComplex (Py_complex v)
`반환값: 새 참조.'
C @ref{527c,,Py_complex} 값으로 새로운 파이썬 복소수 객체를 만듭니다. 에러면 예외를 설정하고 @code{NULL}을 반환합니다.
@end deffn

@geindex PyComplex_FromDoubles (C function)
@anchor{c-api/complex c PyComplex_FromDoubles}@anchor{4fec}
@deffn {C 함수} @ref{5dc,,PyObject} *PyComplex_FromDoubles (double real, double imag)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
`real' 및 `imag'로 새로운 @ref{537a,,PyComplexObject} 객체를 반환합니다. 에러면 예외를 설정하고 @code{NULL}을 반환합니다.
@end deffn

@geindex PyComplex_RealAsDouble (C function)
@anchor{c-api/complex c PyComplex_RealAsDouble}@anchor{1a12}
@deffn {C 함수} double PyComplex_RealAsDouble (PyObject *op)
` Part of the @ref{774,,안정 ABI}.'
`op'의 실수부를 C double로 반환합니다.

`op'가 파이썬 복소수 객체가 아니지만 @ref{7fc,,__complex__()} 메서드가 있으면, 이 메서드는 먼저 `op'를 파이썬 복소수 객체로 변환하도록 그 메서드를 호출합니다. @code{__complex__()}가 정의되지 않았으면 @ref{c5e,,PyFloat_AsDouble()}을 호출하는 것으로 대체하고 그 결과를 반환합니다.

실패하면, 이 메서드는 예외를 설정하고 @code{-1.0}을 반환합니다. @ref{1cac,,PyErr_Occurred()}를 호출하여 에러를 확인해야 합니다.


버전 3.13에서 변경: 사용할 수 있다면 @ref{7fc,,__complex__()}를 사용합니다.

@end deffn

@geindex PyComplex_ImagAsDouble (C function)
@anchor{c-api/complex c PyComplex_ImagAsDouble}@anchor{1a13}
@deffn {C 함수} double PyComplex_ImagAsDouble (PyObject *op)
` Part of the @ref{774,,안정 ABI}.'
`op'의 허수부를 C double로 반환합니다.

`op'가 파이썬 복소수 객체가 아니지만 @ref{7fc,,__complex__()} 메서드가 있으면, 이 메서드는 먼저 `op'를 파이썬 복소수 객체로 변환하도록 그 메서드를 호출합니다. @code{__complex__()}가 정의되지 않았으면 @ref{c5e,,PyFloat_AsDouble()}을 호출하는 것으로 대체하고 성공할 때 @code{0.0}을 반환합니다.

실패하면, 이 메서드는 예외를 설정하고 @code{-1.0}을 반환합니다. @ref{1cac,,PyErr_Occurred()}를 호출하여 에러를 확인해야 합니다.


버전 3.13에서 변경: 사용할 수 있다면 @ref{7fc,,__complex__()}를 사용합니다.

@end deffn

@geindex PyComplex_AsCComplex (C function)
@anchor{c-api/complex c PyComplex_AsCComplex}@anchor{15f6}
@deffn {C 함수} @ref{527c,,Py_complex} PyComplex_AsCComplex (PyObject *op)

복소수 `op'의 @ref{527c,,Py_complex} 값을 반환합니다.

`op'가 파이썬 복소수 객체가 아니지만 @ref{7fc,,__complex__()} 메서드가 있으면, 이 메서드는 먼저 `op'를 파이썬 복소수 객체로 변환하도록 그 메서드를 호출합니다. @code{__complex__()}가 정의되지 않았으면 @ref{bc0,,__float__()}로 대체합니다. @code{__float__()}가 정의되지 않았으면 @ref{19e,,__index__()}로 대체합니다.

실패하면, 이 메서드는 예외를 설정하고 @ref{5372,,real}을 @code{-1.0}으로 설정한 @ref{527c,,Py_complex}를 반환합니다. @ref{1cac,,PyErr_Occurred()}를 호출하여 에러를 확인해야 합니다.


버전 3.8에서 변경: 사용할 수 있다면 @ref{19e,,__index__()}를 사용합니다.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 시퀀스 객체,컨테이너 객체,숫자 객체,구상 객체 계층
@anchor{c-api/concrete sequence-objects}@anchor{537e}@anchor{c-api/concrete sequenceobjects}@anchor{537f}
@subsection 시퀀스 객체


@geindex object;sequence

시퀀스 객체에 대한 일반적인 연산은 이전 장에서 논의했습니다; 이 절에서는 파이썬 언어에 고유한 특정 종류의 시퀀스 객체를 다룹니다.

@c XXX sort out unicode, str, bytes and bytearray

@menu
* 바이트열 객체: 바이트열 객체<2>. 
* 바이트 배열 객체: 바이트 배열 객체<2>. 
* 유니코드 객체와 코덱:: 
* 튜플 객체:: 
* 구조체 시퀀스 객체:: 
* 리스트 객체:: 

@end menu

@node 바이트열 객체<2>,바이트 배열 객체<2>,,시퀀스 객체
@anchor{c-api/bytes doc}@anchor{5380}@anchor{c-api/bytes bytes-objects}@anchor{5381}@anchor{c-api/bytes bytesobjects}@anchor{5382}
@subsubsection 바이트열 객체


이 함수들은 바이트열 매개 변수가 필요할 때 바이트열이 아닌 매개 변수로 호출하면 @ref{198,,TypeError}를 발생시킵니다.

@geindex 객체;바이트열

@geindex PyBytesObject (C type)
@anchor{c-api/bytes c PyBytesObject}@anchor{994}
@deffn {C 자료형} type PyBytesObject

이 @ref{5dc,,PyObject}의 서브 형은 파이썬 바이트열 객체를 나타냅니다.
@end deffn

@geindex PyBytes_Type (C var)
@anchor{c-api/bytes c PyBytes_Type}@anchor{4fc7}
@deffn {C 변수} @ref{c9b,,PyTypeObject} PyBytes_Type
` Part of the @ref{774,,안정 ABI}.'
이 @ref{c9b,,PyTypeObject}의 인스턴스는 파이썬 바이트열 형을 나타냅니다; 파이썬 계층의 @ref{192,,bytes}와 같은 객체입니다.
@end deffn

@geindex PyBytes_Check (C function)
@anchor{c-api/bytes c PyBytes_Check}@anchor{15a4}
@deffn {C 함수} int PyBytes_Check (PyObject *o)

객체 `o'가 바이트열 객체이거나 바이트열 형의 서브 형의 인스턴스면 참을 반환합니다. 이 함수는 항상 성공합니다.
@end deffn

@geindex PyBytes_CheckExact (C function)
@anchor{c-api/bytes c PyBytes_CheckExact}@anchor{5383}
@deffn {C 함수} int PyBytes_CheckExact (PyObject *o)

객체 `o'가 바이트열 객체이지만, 바이트열 형의 서브 형의 인스턴스는 아니면 참을 반환합니다. 이 함수는 항상 성공합니다.
@end deffn

@geindex PyBytes_FromString (C function)
@anchor{c-api/bytes c PyBytes_FromString}@anchor{4fc4}
@deffn {C 함수} @ref{5dc,,PyObject} *PyBytes_FromString (const char *v)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'` Thread safety: @ref{2735,,Atomic}.'
성공하면 값으로 `v' 문자열의 복사본을 갖는 새 바이트열 객체를 반환하고, 실패하면 @code{NULL}을 반환합니다. 매개 변수 `v'는 @code{NULL}이 아니어야 합니다; 검사하지 않습니다.
@end deffn

@geindex PyBytes_FromStringAndSize (C function)
@anchor{c-api/bytes c PyBytes_FromStringAndSize}@anchor{15a5}
@deffn {C 함수} @ref{5dc,,PyObject} *PyBytes_FromStringAndSize (const char *v, Py_ssize_t len)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'` Thread safety: @ref{2735,,Atomic}.'
성공하면 값이 `v' 문자열의 복사본이고 길이가 `len'인 새 바이트열 객체를 반환하고, 실패하면 @code{NULL}을 반환합니다. `v'가 @code{NULL}이면, 바이트열 객체의 내용은 초기화되지 않습니다.
@end deffn

@geindex PyBytes_FromFormat (C function)
@anchor{c-api/bytes c PyBytes_FromFormat}@anchor{1e08}
@deffn {C 함수} @ref{5dc,,PyObject} *PyBytes_FromFormat (const char *format, ...)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'` Thread safety: @ref{2735,,Atomic}.'
C @code{printf()}-스타일 `format' 문자열과 가변 개수의 인자를 받아서, 결과 파이썬 바이트열 객체의 크기를 계산하고 그 안에 값이 포맷된 바이트열 객체를 반환합니다. 가변 인자는 C 형이어야 하며 `format' 문자열에 있는 포맷 문자들과 정확히 대응해야 합니다. 허용되는 포맷 문자는 다음과 같습니다:

@c % XXX: This should be exactly the same as the table in PyErr_Format.

@c % One should just refer to the other.


@multitable {xxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

포맷 문자

@tab

형

@tab

주석

@item

@code{%%}

@tab

`n/a'

@tab

리터럴 % 문자.

@item

@code{%c}

@tab

int

@tab

단일 바이트, C int로 표현됩니다.

@item

@code{%d}

@tab

int

@tab

@code{printf("%d")}와 동등합니다. @footnote{
정수 지정자 (d, u, ld, lu, zd, zu, i, x)에서: 0-변환 플래그는 정밀도를 지정해도 영향을 미칩니다.
}

@item

@code{%u}

@tab

unsigned int

@tab

@code{printf("%u")}와 동등합니다. @footnote{
정수 지정자 (d, u, ld, lu, zd, zu, i, x)에서: 0-변환 플래그는 정밀도를 지정해도 영향을 미칩니다.
}

@item

@code{%ld}

@tab

long

@tab

@code{printf("%ld")}와 동등합니다. @footnote{
정수 지정자 (d, u, ld, lu, zd, zu, i, x)에서: 0-변환 플래그는 정밀도를 지정해도 영향을 미칩니다.
}

@item

@code{%lu}

@tab

unsigned long

@tab

@code{printf("%lu")}와 동등합니다. @footnote{
정수 지정자 (d, u, ld, lu, zd, zu, i, x)에서: 0-변환 플래그는 정밀도를 지정해도 영향을 미칩니다.
}

@item

@code{%zd}

@tab

@ref{c54,,Py_ssize_t}

@tab

@code{printf("%zd")}와 동등합니다. @footnote{
정수 지정자 (d, u, ld, lu, zd, zu, i, x)에서: 0-변환 플래그는 정밀도를 지정해도 영향을 미칩니다.
}

@item

@code{%zu}

@tab

size_t

@tab

@code{printf("%zu")}와 동등합니다. @footnote{
정수 지정자 (d, u, ld, lu, zd, zu, i, x)에서: 0-변환 플래그는 정밀도를 지정해도 영향을 미칩니다.
}

@item

@code{%i}

@tab

int

@tab

@code{printf("%i")}와 동등합니다. @footnote{
정수 지정자 (d, u, ld, lu, zd, zu, i, x)에서: 0-변환 플래그는 정밀도를 지정해도 영향을 미칩니다.
}

@item

@code{%x}

@tab

int

@tab

@code{printf("%x")}와 동등합니다. @footnote{
정수 지정자 (d, u, ld, lu, zd, zu, i, x)에서: 0-변환 플래그는 정밀도를 지정해도 영향을 미칩니다.
}

@item

@code{%s}

@tab

const char*

@tab

널-종료 C 문자 배열.

@item

@code{%p}

@tab

const void*

@tab

C 포인터의 16진수 표현. 플랫폼의 @code{printf}가 어떤 결과를 내는지에 상관없이 리터럴 @code{0x}로 시작함이 보장된다는 점을 제외하고는 거의 @code{printf("%p")}와 동등합니다.

@end multitable


인식할 수 없는 포맷 문자는 포맷 문자열의 나머지 부분이 모두 결과 객체에 그대로 복사되게 만들고, 추가 인자는 무시됩니다.
@end deffn

@geindex PyBytes_FromFormatV (C function)
@anchor{c-api/bytes c PyBytes_FromFormatV}@anchor{4fc2}
@deffn {C 함수} @ref{5dc,,PyObject} *PyBytes_FromFormatV (const char *format, va_list vargs)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'` Thread safety: @ref{2735,,Atomic}.'
정확히 두 개의 인자를 취한다는 것을 제외하고는 @ref{1e08,,PyBytes_FromFormat()}과 같습니다.
@end deffn

@geindex PyBytes_FromObject (C function)
@anchor{c-api/bytes c PyBytes_FromObject}@anchor{4fc3}
@deffn {C 함수} @ref{5dc,,PyObject} *PyBytes_FromObject (PyObject *o)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'` Thread safety: @ref{2730,,Safe for concurrent use on the same object}.'
버퍼 프로토콜을 구현하는 객체 `o'의 바이트열 표현을 반환합니다.

@cartouche
@quotation 참고 
If the object implements the buffer protocol, then the buffer
must not be mutated while the bytes object is being created.
@end quotation
@end cartouche
@end deffn

@geindex PyBytes_Size (C function)
@anchor{c-api/bytes c PyBytes_Size}@anchor{4fc6}
@deffn {C 함수} @ref{c54,,Py_ssize_t} PyBytes_Size (PyObject *o)
` Part of the @ref{774,,안정 ABI}.'` Thread safety: @ref{2735,,Atomic}.'
바이트열 객체 `o'의 길이를 반환합니다.
@end deffn

@geindex PyBytes_GET_SIZE (C function)
@anchor{c-api/bytes c PyBytes_GET_SIZE}@anchor{5384}
@deffn {C 함수} @ref{c54,,Py_ssize_t} PyBytes_GET_SIZE (PyObject *o)
` Thread safety: @ref{2735,,Atomic}.'
@ref{4fc6,,PyBytes_Size()}와 유사하지만, 에러 검사가 없습니다.
@end deffn

@geindex PyBytes_AsString (C function)
@anchor{c-api/bytes c PyBytes_AsString}@anchor{a87}
@deffn {C 함수} char *PyBytes_AsString (PyObject *o)
` Part of the @ref{774,,안정 ABI}.'` Thread safety: @ref{2729,,Safe to call from multiple threads with external synchronization only}.'
`o'의 내용에 대한 포인터를 반환합니다. 포인터는 @code{len(o) + 1} 바이트로 구성된 `o'의 내부 버퍼를 가리킵니다. 버퍼의 마지막 바이트는 다른 널(null) 바이트가 있는지에 관계없이 항상 널입니다. 객체가 @code{PyBytes_FromStringAndSize(NULL, size)}를 사용하여 방금 만들어진 경우가 아니면 데이터를 수정해서는 안 됩니다. 할당을 해제해서는 안 됩니다. `o'가 바이트열 객체가 아니면, @ref{a87,,PyBytes_AsString()}은 @code{NULL}을 반환하고 @ref{198,,TypeError}를 발생시킵니다.
@end deffn

@geindex PyBytes_AS_STRING (C function)
@anchor{c-api/bytes c PyBytes_AS_STRING}@anchor{5385}
@deffn {C 함수} char *PyBytes_AS_STRING (PyObject *string)
` Thread safety: @ref{2729,,Safe to call from multiple threads with external synchronization only}.'
@ref{a87,,PyBytes_AsString()}와 유사하지만, 에러 검사가 없습니다.
@end deffn

@geindex PyBytes_AsStringAndSize (C function)
@anchor{c-api/bytes c PyBytes_AsStringAndSize}@anchor{4fbe}
@deffn {C 함수} int PyBytes_AsStringAndSize (PyObject *obj, char **buffer, Py_ssize_t *length)
` Part of the @ref{774,,안정 ABI}.'` Thread safety: @ref{2729,,Safe to call from multiple threads with external synchronization only}.'
출력 변수 `buffer'와 `length'로 객체 `obj'의 널-종료 내용을 반환합니다. 성공하면 @code{0}을 반환합니다.

`length'가 @code{NULL}이면, 바이트열 객체는 내장된 널 바이트를 포함할 수 없습니다; 만약 그렇다면 함수는 @code{-1}을 반환하고 @ref{2ec,,ValueError}를 발생시킵니다.

buffer는 `obj'의 내부 버퍼를 가리키게 되는데, 끝에 추가 널 바이트가 포함됩니다 (`length'에는 포함되지 않습니다). 객체가 @code{PyBytes_FromStringAndSize(NULL, size)}를 사용하여 방금 만들어진 경우가 아니면 데이터를 수정해서는 안 됩니다. 할당을 해제해서는 안 됩니다. `obj'가 바이트열 객체가 아니면 @ref{4fbe,,PyBytes_AsStringAndSize()}는 @code{-1}을 반환하고 @ref{198,,TypeError}를 발생시킵니다.


버전 3.5에서 변경: 이전에는, 바이트열 객체에 널 바이트가 포함되어 있으면 @ref{198,,TypeError}가 발생했습니다.

@end deffn

@geindex PyBytes_Concat (C function)
@anchor{c-api/bytes c PyBytes_Concat}@anchor{4fbf}
@deffn {C 함수} void PyBytes_Concat (PyObject **bytes, PyObject *newpart)
` Part of the @ref{774,,안정 ABI}.'` Thread safety: @ref{2730,,Safe for concurrent use on the same object}.'
`bytes'에 `newpart'의 내용을 덧붙인 새 바이트열 객체를 `*bytes'에 만듭니다; 호출자가 새 참조를 소유합니다. `bytes'의 예전 값에 대한 참조를 훔칩니다. 새 객체가 만들어질 수 없으면, `bytes'에 대한 예전 참조는 여전히 버려지고 `*bytes'의 값은 @code{NULL}로 설정됩니다; 적절한 예외가 설정됩니다.

@cartouche
@quotation 참고 
If `newpart' implements the buffer protocol, then the buffer
must not be mutated while the new bytes object is being created.
@end quotation
@end cartouche
@end deffn

@geindex PyBytes_ConcatAndDel (C function)
@anchor{c-api/bytes c PyBytes_ConcatAndDel}@anchor{4fc0}
@deffn {C 함수} void PyBytes_ConcatAndDel (PyObject **bytes, PyObject *newpart)
` Part of the @ref{774,,안정 ABI}.'` Thread safety: @ref{2730,,Safe for concurrent use on the same object}.'
`bytes'에 `newpart'의 내용을 덧붙인 새 바이트열 객체를 `*bytes'에 만듭니다. 이 버전은 `newpart'로의 @ref{5df,,강한 참조}를 해제합니다 (즉 참조 횟수를 감소시킵니다).

@cartouche
@quotation 참고 
If `newpart' implements the buffer protocol, then the buffer
must not be mutated while the new bytes object is being created.
@end quotation
@end cartouche
@end deffn

@geindex PyBytes_Join (C function)
@anchor{c-api/bytes c PyBytes_Join}@anchor{383}
@deffn {C 함수} @ref{5dc,,PyObject} *PyBytes_Join (PyObject *sep, PyObject *iterable)
` Thread safety: @ref{2730,,Safe for concurrent use on the same object}.'
파이썬의 @code{sep.join(iterable)}와 유사합니다.

`sep'은 반드시 파이썬의 @ref{192,,bytes} 객체이어야 합니다.(@ref{13a7,,PyUnicode_Join()}는 @code{NULL} 구분자를 허용하고 이를 공백으로 취급하는 반면, @ref{383,,PyBytes_Join()}는 @code{NULL} 구분자를 허용하지 않음에 유의하십시오.)

`iterable'은 반드시 @ref{260,,버퍼 프로토콜}을 구현하는 객체를 생성하는 반복 가능한 객체이어야 합니다.

성공 시 새로운 @ref{192,,bytes} 객체를 반환합니다. 실패 시 예외를 설정하고 @code{NULL}을 반환합니다.


Added in version 3.14.


@cartouche
@quotation 참고 
If `iterable' objects implement the buffer protocol, then the buffers
must not be mutated while the new bytes object is being created.
@end quotation
@end cartouche
@end deffn

@geindex _PyBytes_Resize (C function)
@anchor{c-api/bytes c _PyBytes_Resize}@anchor{19ce}
@deffn {C 함수} int _PyBytes_Resize (PyObject **bytes, Py_ssize_t newsize)
` Thread safety: @ref{272e,,Safe to call without external synchronization on distinct objects}.'
바이트열 객체의 크기를 변경합니다. `newsize'는 바이트열 객체의 새 길이가 됩니다. 새 바이트열 객체를 생성하고 이전 객체를 파괴한다고 생각할 수 있습니다. 단지 더 효율적으로 수행합니다. 기존 바이트열 객체의 주소를 lvalue(내용을 기록할 수 있습니다)로 전달하고, 원하는 새 크기를 전달합니다. 성공하면, `*bytes'는 크기가 변경된 바이트열 객체를 갖게 되고 @code{0}이 반환됩니다; `*bytes'의 주소는 입력값과 다를 수 있습니다. 재할당이 실패하면, `*bytes'에 있는 원래 바이트열 객체는 할당 해제되고, `*bytes'가 @code{NULL}로 설정되고, @ref{175f,,MemoryError}가 설정되며 @code{-1}이 반환됩니다.
@end deffn

@geindex PyBytes_Repr (C function)
@anchor{c-api/bytes c PyBytes_Repr}@anchor{4fc5}
@deffn {C 함수} @ref{5dc,,PyObject} *PyBytes_Repr (PyObject *bytes, int smartquotes)
` Part of the @ref{774,,안정 ABI}.'` Thread safety: @ref{2735,,Atomic}.'
Get the string representation of `bytes'. This function is currently used to
implement @code{bytes.__repr__()} in Python.

This function does not do type checking; it is undefined behavior to pass
`bytes' as a non-bytes object or @code{NULL}.

If `smartquotes' is true, the representation will use a double-quoted string
instead of single-quoted string when single-quotes are present in `bytes'.
For example, the byte string @code{'Python'} would be represented as
@code{b"'Python'"} when `smartquotes' is true, or @code{b'\'Python\'@w{'}} when it is
false.

On success, this function returns a @ref{5df,,strong reference} to a
@ref{169,,str} object containing the representation. On failure, this
returns @code{NULL} with an exception set.
@end deffn

@geindex PyBytes_DecodeEscape (C function)
@anchor{c-api/bytes c PyBytes_DecodeEscape}@anchor{4fc1}
@deffn {C 함수} @ref{5dc,,PyObject} *PyBytes_DecodeEscape (const char *s, Py_ssize_t len, const char *errors, Py_ssize_t unicode, const char *recode_encoding)
` Part of the @ref{774,,안정 ABI}.'` Thread safety: @ref{2735,,Atomic}.'
Unescape a backslash-escaped string `s'. `s' must not be @code{NULL}.
`len' must be the size of `s'.

`errors' must be one of @code{"strict"}, @code{"replace"}, or @code{"ignore"}. If
`errors' is @code{NULL}, then @code{"strict"} is used by default.

On success, this function returns a @ref{5df,,strong reference} to a Python
@ref{192,,bytes} object containing the unescaped string. On failure, this
function returns @code{NULL} with an exception set.


버전 3.9에서 변경: `unicode' and `recode_encoding' are now unused.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 바이트 배열 객체<2>,유니코드 객체와 코덱,바이트열 객체<2>,시퀀스 객체
@anchor{c-api/bytearray doc}@anchor{5386}@anchor{c-api/bytearray byte-array-objects}@anchor{5387}@anchor{c-api/bytearray bytearrayobjects}@anchor{5388}@anchor{c-api/bytearray translation-repo}@anchor{5389}
@subsubsection 바이트 배열 객체


@geindex 객체;바이트 배열

@geindex PyByteArrayObject (C type)
@anchor{c-api/bytearray c PyByteArrayObject}@anchor{538a}
@deffn {C 자료형} type PyByteArrayObject

이 @ref{5dc,,PyObject}의 서브 형은 파이썬 bytearray 객체를 나타냅니다.
@end deffn

@geindex PyByteArray_Type (C var)
@anchor{c-api/bytearray c PyByteArray_Type}@anchor{4fbc}
@deffn {C 변수} @ref{c9b,,PyTypeObject} PyByteArray_Type
` Part of the @ref{774,,안정 ABI}.'
이 @ref{c9b,,PyTypeObject} 인스턴스는 파이썬 bytearray 형을 나타냅니다; 파이썬 계층의 @ref{344,,bytearray}와 같은 객체입니다.
@end deffn

@menu
* 형 검사 매크로:: 
* 직접 API 함수:: 
* 매크로:: 

@end menu

@node 형 검사 매크로,직접 API 함수,,바이트 배열 객체<2>
@anchor{c-api/bytearray type-check-macros}@anchor{538b}
@subsubsection 형 검사 매크로


@geindex PyByteArray_Check (C function)
@anchor{c-api/bytearray c PyByteArray_Check}@anchor{538c}
@deffn {C 함수} int PyByteArray_Check (PyObject *o)

객체 `o'가 bytearray 객체이거나 bytearray 형의 서브 형 인스턴스면 참을 반환합니다. 이 함수는 항상 성공합니다.
@end deffn

@geindex PyByteArray_CheckExact (C function)
@anchor{c-api/bytearray c PyByteArray_CheckExact}@anchor{538d}
@deffn {C 함수} int PyByteArray_CheckExact (PyObject *o)

객체 `o'가 bytearray 객체이지만, bytearray 형의 서브 형 인스턴스는 아니면 참을 반환합니다. 이 함수는 항상 성공합니다.
@end deffn

@node 직접 API 함수,매크로,형 검사 매크로,바이트 배열 객체<2>
@anchor{c-api/bytearray direct-api-functions}@anchor{538e}
@subsubsection 직접 API 함수


@geindex PyByteArray_FromObject (C function)
@anchor{c-api/bytearray c PyByteArray_FromObject}@anchor{15ad}
@deffn {C 함수} @ref{5dc,,PyObject} *PyByteArray_FromObject (PyObject *o)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'` Thread safety: @ref{2730,,Safe for concurrent use on the same object}.'
@ref{260,,버퍼 프로토콜}을 구현하는 임의의 객체(`o')로부터 써서 새로운 bytearray 객체를 돌려줍니다.

실패하면, @code{NULL}을 반환하고 예외를 설정합니다.

@cartouche
@quotation 참고 
If the object implements the buffer protocol, then the buffer
must not be mutated while the bytearray object is being created.
@end quotation
@end cartouche
@end deffn

@geindex PyByteArray_FromStringAndSize (C function)
@anchor{c-api/bytearray c PyByteArray_FromStringAndSize}@anchor{15ae}
@deffn {C 함수} @ref{5dc,,PyObject} *PyByteArray_FromStringAndSize (const char *string, Py_ssize_t len)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'` Thread safety: @ref{2735,,Atomic}.'
`string'과 그 길이(`len')로 새로운 bytearray 객체를 만듭니다.

실패하면, @code{NULL}을 반환하고 예외를 설정합니다.
@end deffn

@geindex PyByteArray_Concat (C function)
@anchor{c-api/bytearray c PyByteArray_Concat}@anchor{4fb9}
@deffn {C 함수} @ref{5dc,,PyObject} *PyByteArray_Concat (PyObject *a, PyObject *b)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'` Thread safety: @ref{2730,,Safe for concurrent use on the same object}.'
바이트 배열 `a' 와 `b'를 이어붙여 새로운 bytearray로 반환합니다.

실패하면, @code{NULL}을 반환하고 예외를 설정합니다.

@cartouche
@quotation 참고 
If the object implements the buffer protocol, then the buffer
must not be mutated while the bytearray object is being created.
@end quotation
@end cartouche
@end deffn

@geindex PyByteArray_Size (C function)
@anchor{c-api/bytearray c PyByteArray_Size}@anchor{4fbb}
@deffn {C 함수} @ref{c54,,Py_ssize_t} PyByteArray_Size (PyObject *bytearray)
` Part of the @ref{774,,안정 ABI}.'` Thread safety: @ref{2735,,Atomic}.'
@code{NULL} 포인터를 확인한 후 `bytearray'의 크기를 반환합니다.
@end deffn

@geindex PyByteArray_AsString (C function)
@anchor{c-api/bytearray c PyByteArray_AsString}@anchor{4fb8}
@deffn {C 함수} char *PyByteArray_AsString (PyObject *bytearray)
` Part of the @ref{774,,안정 ABI}.'` Thread safety: @ref{2729,,Safe to call from multiple threads with external synchronization only}.'
@code{NULL} 포인터를 확인한 후 `bytearray'의 내용을 char 배열로 반환합니다. 반환되는 배열에는 항상 여분의 널 바이트가 추가됩니다.

@cartouche
@quotation 참고 
It is not thread-safe to mutate the bytearray object while using the returned char array.
@end quotation
@end cartouche
@end deffn

@geindex PyByteArray_Resize (C function)
@anchor{c-api/bytearray c PyByteArray_Resize}@anchor{4fba}
@deffn {C 함수} int PyByteArray_Resize (PyObject *bytearray, Py_ssize_t len)
` Part of the @ref{774,,안정 ABI}.'
`bytearray'의 내부 버퍼의 크기를 `len'으로 조정합니다. 실패 시 예외와 함께 @code{-1}이 반환됩니다.


버전 3.14에서 변경: 음수 `len'을 사용하면 예외가 발생하고 -1이 반환됩니다.

@end deffn

@node 매크로,,직접 API 함수,바이트 배열 객체<2>
@anchor{c-api/bytearray macros}@anchor{538f}
@subsubsection 매크로


이 매크로는 속도를 위해 안전을 희생하며 포인터를 확인하지 않습니다.

@geindex PyByteArray_AS_STRING (C function)
@anchor{c-api/bytearray c PyByteArray_AS_STRING}@anchor{5390}
@deffn {C 함수} char *PyByteArray_AS_STRING (PyObject *bytearray)
` Thread safety: @ref{2729,,Safe to call from multiple threads with external synchronization only}.'
@ref{4fb8,,PyByteArray_AsString()}과 유사하지만 에러를 검사하지 않습니다.

@cartouche
@quotation 참고 
It is not thread-safe to mutate the bytearray object while using the returned char array.
@end quotation
@end cartouche
@end deffn

@geindex PyByteArray_GET_SIZE (C function)
@anchor{c-api/bytearray c PyByteArray_GET_SIZE}@anchor{5391}
@deffn {C 함수} @ref{c54,,Py_ssize_t} PyByteArray_GET_SIZE (PyObject *bytearray)
` Thread safety: @ref{2735,,Atomic}.'
@ref{4fbb,,PyByteArray_Size()}와 유사하지만 에러를 검사하지 않습니다.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 유니코드 객체와 코덱,튜플 객체,바이트 배열 객체<2>,시퀀스 객체
@anchor{c-api/unicode doc}@anchor{13a5}@anchor{c-api/unicode translation-repo}@anchor{5392}@anchor{c-api/unicode unicode-objects-and-codecs}@anchor{5393}@anchor{c-api/unicode unicodeobjects}@anchor{5394}
@subsubsection 유니코드 객체와 코덱


@menu
* 유니코드 객체:: 
* 내장 코덱:: 
* 메서드와 슬롯 함수:: 
* PyUnicodeWriter:: 
* Deprecated API: Deprecated API<2>. 

@end menu

@node 유니코드 객체,내장 코덱,,유니코드 객체와 코덱
@anchor{c-api/unicode unicode-objects}@anchor{5395}
@subsubsection 유니코드 객체


파이썬 3.3에서 
@geindex Python 향상 제안; PEP 393
PEP 393@footnote{https://peps.python.org/pep-0393/}을 구현한 이후, 유니코드 객체는 내부적으로 다양한 표현을 사용하여 전체 유니코드 문자 범위를 처리하면서 메모리 효율성을 유지합니다. 모든 코드 포인트가 128, 256 또는 65536 미만인 문자열에 대한 특별한 경우가 있습니다; 그렇지 않으면, 코드 포인트는 1114112 (전체 유니코드 범위) 미만이어야 합니다.

UTF-8 representation is created on demand and cached in the Unicode object.

@cartouche
@quotation 참고 
@ref{3e0,,Py_UNICODE} 표현은 폐지된 API와 함께 파이썬 3.12에서 제거되었습니다. 자세한 정보는 
@geindex Python 향상 제안; PEP 623
PEP 623@footnote{https://peps.python.org/pep-0623/}을 참조하십시오.
@end quotation
@end cartouche

@menu
* 유니코드 형:: 
* 유니코드 문자 속성:: 
* 유니코드 문자열 생성과 액세스:: 
* 로케일 인코딩:: 
* 파일 시스템 인코딩:: 
* wchar_t 지원:: 

@end menu

@node 유니코드 형,유니코드 문자 속성,,유니코드 객체
@anchor{c-api/unicode unicode-type}@anchor{5396}
@subsubsection 유니코드 형


다음은 파이썬에서 유니코드 구현에 사용되는 기본 유니코드 객체 형입니다:

@geindex PyUnicode_Type (C var)
@anchor{c-api/unicode c PyUnicode_Type}@anchor{515a}
@deffn {C 변수} @ref{c9b,,PyTypeObject} PyUnicode_Type
` Part of the @ref{774,,안정 ABI}.'
This instance of @ref{c9b,,PyTypeObject} represents the Python Unicode type.
It is exposed to Python code as @ref{169,,str}.
@end deffn

@geindex PyUnicodeIter_Type (C var)
@anchor{c-api/unicode c PyUnicodeIter_Type}@anchor{512b}
@deffn {C 변수} @ref{c9b,,PyTypeObject} PyUnicodeIter_Type
` Part of the @ref{774,,안정 ABI}.'
This instance of @ref{c9b,,PyTypeObject} represents the Python Unicode
iterator type. It is used to iterate over Unicode string objects.
@end deffn

@geindex Py_UCS4 (C type)
@geindex Py_UCS2 (C type)
@geindex Py_UCS1 (C type)
@anchor{c-api/unicode c Py_UCS4}@anchor{33d}
@deffn {C 자료형} type Py_UCS4
@anchor{c-api/unicode c Py_UCS2}@anchor{1379}
@deffnx {C 자료형} type Py_UCS2
@anchor{c-api/unicode c Py_UCS1}@anchor{1378}
@deffnx {C 자료형} type Py_UCS1
` Part of the @ref{774,,안정 ABI}.'
이 형들은 각각 32비트, 16비트 및 8비트의 문자를 포함하기에 충분한 부호 없는 정수 형을 위한 typedef 입니다. 단일 유니코드 문자를 처리할 때는, @ref{33d,,Py_UCS4}를 사용하십시오.


Added in version 3.3.

@end deffn

@geindex PyASCIIObject (C type)
@geindex PyCompactUnicodeObject (C type)
@geindex PyUnicodeObject (C type)
@anchor{c-api/unicode c PyASCIIObject}@anchor{137a}
@deffn {C 자료형} type PyASCIIObject
@anchor{c-api/unicode c PyCompactUnicodeObject}@anchor{137b}
@deffnx {C 자료형} type PyCompactUnicodeObject
@anchor{c-api/unicode c PyUnicodeObject}@anchor{996}
@deffnx {C 자료형} type PyUnicodeObject

이 @ref{5dc,,PyObject} 서브 형들은 파이썬 유니코드 객체를 나타냅니다. 거의 모든 경우에, 유니코드 객체를 처리하는 모든 API 함수가 @code{PyObject} 포인터를 취하고 반환하므로 직접 사용해서는 안 됩니다.


Added in version 3.3.


The structure of a particular object can be determined using the following
macros.
The macros cannot fail; their behavior is undefined if their argument
is not a Python Unicode object.

@geindex PyUnicode_IS_COMPACT (C macro)
@anchor{c-api/unicode c PyUnicode_IS_COMPACT}@anchor{5397}
@deffn {C 매크로} PyUnicode_IS_COMPACT (o)

True if `o' uses the @ref{137b,,PyCompactUnicodeObject} structure.


Added in version 3.3.

@end deffn

@geindex PyUnicode_IS_COMPACT_ASCII (C macro)
@anchor{c-api/unicode c PyUnicode_IS_COMPACT_ASCII}@anchor{5398}
@deffn {C 매크로} PyUnicode_IS_COMPACT_ASCII (o)

True if `o' uses the @ref{137a,,PyASCIIObject} structure.


Added in version 3.3.

@end deffn
@end deffn

다음 API는 빠른 검사를 수행하고 유니코드 객체의 내부 읽기 전용 데이터에 액세스하는 데 사용할 수 있는 C 매크로와 정적 인라인 함수입니다:

@geindex PyUnicode_Check (C function)
@anchor{c-api/unicode c PyUnicode_Check}@anchor{5399}
@deffn {C 함수} int PyUnicode_Check (PyObject *obj)

객체 `obj'가 유니코드 객체이거나 유니코드 서브 형의 인스턴스이면 참을 반환합니다. 이 함수는 항상 성공합니다.
@end deffn

@geindex PyUnicode_CheckExact (C function)
@anchor{c-api/unicode c PyUnicode_CheckExact}@anchor{539a}
@deffn {C 함수} int PyUnicode_CheckExact (PyObject *obj)

객체 `obj'가 유니코드 객체이지만, 서브 형의 인스턴스가 아니면 참을 반환합니다. 이 함수는 항상 성공합니다.
@end deffn

@geindex PyUnicode_GET_LENGTH (C function)
@anchor{c-api/unicode c PyUnicode_GET_LENGTH}@anchor{ab1}
@deffn {C 함수} @ref{c54,,Py_ssize_t} PyUnicode_GET_LENGTH (PyObject *unicode)

유니코드 문자열의 길이를 코드 포인트로 반환합니다. `unicode'는 “규범적(canonical)” 표현의 유니코드 객체여야 합니다 (검사하지 않습니다).


Added in version 3.3.

@end deffn

@geindex PyUnicode_1BYTE_DATA (C function)
@geindex PyUnicode_2BYTE_DATA (C function)
@geindex PyUnicode_4BYTE_DATA (C function)
@anchor{c-api/unicode c PyUnicode_1BYTE_DATA}@anchor{137f}
@deffn {C 함수} @ref{1378,,Py_UCS1} *PyUnicode_1BYTE_DATA (PyObject *unicode)
@anchor{c-api/unicode c PyUnicode_2BYTE_DATA}@anchor{1380}
@deffnx {C 함수} @ref{1379,,Py_UCS2} *PyUnicode_2BYTE_DATA (PyObject *unicode)
@anchor{c-api/unicode c PyUnicode_4BYTE_DATA}@anchor{1381}
@deffnx {C 함수} @ref{33d,,Py_UCS4} *PyUnicode_4BYTE_DATA (PyObject *unicode)

직접 문자 액세스를 위해 UCS1, UCS2 또는 UCS4 정수 형으로 캐스트 된 규범적(canonical) 표현에 대한 포인터를 반환합니다. 규범적(canonical) 표현이 올바른 문자 크기인지 검사하지 않습니다; @ref{1382,,PyUnicode_KIND()}를 사용하여 올바른 함수를 선택하십시오.


Added in version 3.3.

@end deffn

@geindex PyUnicode_1BYTE_KIND (C macro)
@geindex PyUnicode_2BYTE_KIND (C macro)
@geindex PyUnicode_4BYTE_KIND (C macro)
@anchor{c-api/unicode c PyUnicode_1BYTE_KIND}@anchor{1383}
@deffn {C 매크로} PyUnicode_1BYTE_KIND
@anchor{c-api/unicode c PyUnicode_2BYTE_KIND}@anchor{1384}
@deffnx {C 매크로} PyUnicode_2BYTE_KIND
@anchor{c-api/unicode c PyUnicode_4BYTE_KIND}@anchor{1385}
@deffnx {C 매크로} PyUnicode_4BYTE_KIND

@ref{1382,,PyUnicode_KIND()} 매크로의 값을 반환합니다.


Added in version 3.3.



버전 3.12에서 변경: @code{PyUnicode_WCHAR_KIND}는 제거되었습니다.

@end deffn

@geindex PyUnicode_KIND (C function)
@anchor{c-api/unicode c PyUnicode_KIND}@anchor{1382}
@deffn {C 함수} int PyUnicode_KIND (PyObject *unicode)

이 유니코드 객체가 데이터를 저장하는 데 사용하는 문자 당 바이트 수를 나타내는 PyUnicode 종류 상수 (위를 참조하십시오) 중 하나를 반환합니다. `unicode'는 “규범적(canonical)” 표현의 유니코드 객체여야 합니다 (검사하지 않습니다).


Added in version 3.3.

@end deffn

@geindex PyUnicode_DATA (C function)
@anchor{c-api/unicode c PyUnicode_DATA}@anchor{137e}
@deffn {C 함수} void *PyUnicode_DATA (PyObject *unicode)

원시 유니코드 버퍼에 대한 void 포인터를 반환합니다. `unicode'는 “규범적(canonical)” 표현의 유니코드 객체여야 합니다 (검사하지 않습니다).


Added in version 3.3.

@end deffn

@geindex PyUnicode_WRITE (C function)
@anchor{c-api/unicode c PyUnicode_WRITE}@anchor{1388}
@deffn {C 함수} void PyUnicode_WRITE (int kind, void *data, Py_ssize_t index, Py_UCS4 value)

Write the code point `value' to the given zero-based `index' in a string.

The `kind' value and `data' pointer must have been obtained from a
string using @ref{1382,,PyUnicode_KIND()} and @ref{137e,,PyUnicode_DATA()}
respectively. You must hold a reference to that string while calling
@code{PyUnicode_WRITE()}. All requirements of
@ref{1377,,PyUnicode_WriteChar()} also apply.

The function performs no checks for any of its requirements,
and is intended for usage in loops.


Added in version 3.3.

@end deffn

@geindex PyUnicode_READ (C function)
@anchor{c-api/unicode c PyUnicode_READ}@anchor{1386}
@deffn {C 함수} @ref{33d,,Py_UCS4} PyUnicode_READ (int kind, void *data, Py_ssize_t index)

규범적(canonical) 표현 `data'(@ref{137e,,PyUnicode_DATA()}로 얻은 대로)에서 코드 포인트를 읽습니다. 검사나 준비(ready) 호출이 수행되지 않습니다.


Added in version 3.3.

@end deffn

@geindex PyUnicode_READ_CHAR (C function)
@anchor{c-api/unicode c PyUnicode_READ_CHAR}@anchor{1387}
@deffn {C 함수} @ref{33d,,Py_UCS4} PyUnicode_READ_CHAR (PyObject *unicode, Py_ssize_t index)

“규범적(canonical)” 표현이어야 하는, 유니코드 객체 `unicode'에서 문자를 읽습니다. 여러 연속 읽기를 수행한다면 @ref{1386,,PyUnicode_READ()}보다 효율성이 떨어집니다.


Added in version 3.3.

@end deffn

@geindex PyUnicode_MAX_CHAR_VALUE (C function)
@anchor{c-api/unicode c PyUnicode_MAX_CHAR_VALUE}@anchor{1389}
@deffn {C 함수} @ref{33d,,Py_UCS4} PyUnicode_MAX_CHAR_VALUE (PyObject *unicode)

“규범적(canonical)” 표현이어야 하는, `unicode'를 기반으로 다른 문자열을 만드는 데 적합한 최대 코드 포인트를 반환합니다. 이것은 항상 근사치이지만 문자열을 이터레이트 하는 것보다 효율적입니다.


Added in version 3.3.

@end deffn

@geindex PyUnicode_IsIdentifier (C function)
@anchor{c-api/unicode c PyUnicode_IsIdentifier}@anchor{1d84}
@deffn {C 함수} int PyUnicode_IsIdentifier (PyObject *unicode)
` Part of the @ref{774,,안정 ABI}.'
언어 정의에 따라 문자열이 유효한 식별자이면 @code{1}을 반환합니다, 섹션 @ref{229d,,Names (identifiers and keywords)}. 그렇지 않으면 @code{0}을 반환합니다.


버전 3.9에서 변경: 문자열이 준비(ready)되지 않았을 때, 이 함수는 더는 @ref{b79,,Py_FatalError()}를 호출하지 않습니다.

@end deffn

@geindex PyUnicode_IS_ASCII (C function)
@anchor{c-api/unicode c PyUnicode_IS_ASCII}@anchor{539b}
@deffn {C 함수} unsigned int PyUnicode_IS_ASCII (PyObject *unicode)

Return true if the string only contains ASCII characters.
Equivalent to @ref{ce8,,str.isascii()}.


Added in version 3.2.

@end deffn

@node 유니코드 문자 속성,유니코드 문자열 생성과 액세스,유니코드 형,유니코드 객체
@anchor{c-api/unicode unicode-character-properties}@anchor{539c}
@subsubsection 유니코드 문자 속성


유니코드는 다양한 문자 속성을 제공합니다. 가장 자주 필요한 것은 파이썬 구성에 따라 C 함수에 매핑되는 이러한 매크로를 통해 사용할 수 있습니다.

@geindex Py_UNICODE_ISSPACE (C function)
@anchor{c-api/unicode c Py_UNICODE_ISSPACE}@anchor{1cc2}
@deffn {C 함수} int Py_UNICODE_ISSPACE (Py_UCS4 ch)

`ch'가 공백 문자인지에 따라 @code{1}이나 @code{0}을 반환합니다.
@end deffn

@geindex Py_UNICODE_ISLOWER (C function)
@anchor{c-api/unicode c Py_UNICODE_ISLOWER}@anchor{539d}
@deffn {C 함수} int Py_UNICODE_ISLOWER (Py_UCS4 ch)

`ch'가 소문자인지에 따라 @code{1}이나 @code{0}을 반환합니다.
@end deffn

@geindex Py_UNICODE_ISUPPER (C function)
@anchor{c-api/unicode c Py_UNICODE_ISUPPER}@anchor{539e}
@deffn {C 함수} int Py_UNICODE_ISUPPER (Py_UCS4 ch)

`ch'가 대문자인지에 따라 @code{1}이나 @code{0}을 반환합니다.
@end deffn

@geindex Py_UNICODE_ISTITLE (C function)
@anchor{c-api/unicode c Py_UNICODE_ISTITLE}@anchor{539f}
@deffn {C 함수} int Py_UNICODE_ISTITLE (Py_UCS4 ch)

`ch'가 제목 케이스 문자인지에 따라 @code{1}이나 @code{0}을 반환합니다.
@end deffn

@geindex Py_UNICODE_ISLINEBREAK (C function)
@anchor{c-api/unicode c Py_UNICODE_ISLINEBREAK}@anchor{53a0}
@deffn {C 함수} int Py_UNICODE_ISLINEBREAK (Py_UCS4 ch)

`ch'가 줄 바꿈 문자인지에 따라 @code{1}이나 @code{0}을 반환합니다.
@end deffn

@geindex Py_UNICODE_ISDECIMAL (C function)
@anchor{c-api/unicode c Py_UNICODE_ISDECIMAL}@anchor{53a1}
@deffn {C 함수} int Py_UNICODE_ISDECIMAL (Py_UCS4 ch)

`ch'가 10진수 문자인지에 따라 @code{1}이나 @code{0}을 반환합니다.
@end deffn

@geindex Py_UNICODE_ISDIGIT (C function)
@anchor{c-api/unicode c Py_UNICODE_ISDIGIT}@anchor{53a2}
@deffn {C 함수} int Py_UNICODE_ISDIGIT (Py_UCS4 ch)

`ch'가 디짓(digit) 문자인지에 따라 @code{1}이나 @code{0}을 반환합니다.
@end deffn

@geindex Py_UNICODE_ISNUMERIC (C function)
@anchor{c-api/unicode c Py_UNICODE_ISNUMERIC}@anchor{53a3}
@deffn {C 함수} int Py_UNICODE_ISNUMERIC (Py_UCS4 ch)

`ch'가 숫자(numeric) 문자인지에 따라 @code{1}이나 @code{0}을 반환합니다.
@end deffn

@geindex Py_UNICODE_ISALPHA (C function)
@anchor{c-api/unicode c Py_UNICODE_ISALPHA}@anchor{53a4}
@deffn {C 함수} int Py_UNICODE_ISALPHA (Py_UCS4 ch)

`ch'가 알파벳 문자인지에 따라 @code{1}이나 @code{0}을 반환합니다.
@end deffn

@geindex Py_UNICODE_ISALNUM (C function)
@anchor{c-api/unicode c Py_UNICODE_ISALNUM}@anchor{53a5}
@deffn {C 함수} int Py_UNICODE_ISALNUM (Py_UCS4 ch)

`ch'가 영숫자 문자인지에 따라 @code{1}이나 @code{0}을 반환합니다.
@end deffn

@geindex Py_UNICODE_ISPRINTABLE (C function)
@anchor{c-api/unicode c Py_UNICODE_ISPRINTABLE}@anchor{53a6}
@deffn {C 함수} int Py_UNICODE_ISPRINTABLE (Py_UCS4 ch)

`ch'가 @ref{fd7,,str.isprintable()}의 의미에서 인쇄 가능한 문자인지에 따라 @code{1}이나 @code{0}을 반환합니다.
@end deffn

다음 API는 빠른 직접 문자 변환에 사용할 수 있습니다:

@geindex Py_UNICODE_TOLOWER (C function)
@anchor{c-api/unicode c Py_UNICODE_TOLOWER}@anchor{53a7}
@deffn {C 함수} @ref{33d,,Py_UCS4} Py_UNICODE_TOLOWER (Py_UCS4 ch)

소문자로 변환된 문자 `ch'를 반환합니다.
@end deffn

@geindex Py_UNICODE_TOUPPER (C function)
@anchor{c-api/unicode c Py_UNICODE_TOUPPER}@anchor{53a8}
@deffn {C 함수} @ref{33d,,Py_UCS4} Py_UNICODE_TOUPPER (Py_UCS4 ch)

대문자로 변환된 문자 `ch'를 반환합니다.
@end deffn

@geindex Py_UNICODE_TOTITLE (C function)
@anchor{c-api/unicode c Py_UNICODE_TOTITLE}@anchor{53a9}
@deffn {C 함수} @ref{33d,,Py_UCS4} Py_UNICODE_TOTITLE (Py_UCS4 ch)

제목 케이스로 변환된 문자 `ch'를 반환합니다.
@end deffn

@geindex Py_UNICODE_TODECIMAL (C function)
@anchor{c-api/unicode c Py_UNICODE_TODECIMAL}@anchor{53aa}
@deffn {C 함수} int Py_UNICODE_TODECIMAL (Py_UCS4 ch)

10진 양의 정수로 변환된 문자 `ch'를 반환합니다. 이것이 불가능하면 @code{-1}을 반환합니다. 이 함수는 예외를 발생시키지 않습니다.
@end deffn

@geindex Py_UNICODE_TODIGIT (C function)
@anchor{c-api/unicode c Py_UNICODE_TODIGIT}@anchor{53ab}
@deffn {C 함수} int Py_UNICODE_TODIGIT (Py_UCS4 ch)

한 자리 정수로 변환된 문자 `ch'를 반환합니다. 이것이 불가능하면 @code{-1}을 반환합니다. 이 함수는 예외를 발생시키지 않습니다.
@end deffn

@geindex Py_UNICODE_TONUMERIC (C function)
@anchor{c-api/unicode c Py_UNICODE_TONUMERIC}@anchor{53ac}
@deffn {C 함수} double Py_UNICODE_TONUMERIC (Py_UCS4 ch)

double로 변환된 문자 `ch'를 반환합니다. 이것이 불가능하면 @code{-1.0}을 반환합니다. 이 함수는 예외를 발생시키지 않습니다.
@end deffn

다음 API를 사용하여 서로게이트를 다룰 수 있습니다:

@geindex Py_UNICODE_IS_SURROGATE (C function)
@anchor{c-api/unicode c Py_UNICODE_IS_SURROGATE}@anchor{53ad}
@deffn {C 함수} int Py_UNICODE_IS_SURROGATE (Py_UCS4 ch)

`ch'가 서로게이트인지 확인합니다 (@code{0xD800 <= ch <= 0xDFFF}).
@end deffn

@geindex Py_UNICODE_IS_HIGH_SURROGATE (C function)
@anchor{c-api/unicode c Py_UNICODE_IS_HIGH_SURROGATE}@anchor{53ae}
@deffn {C 함수} int Py_UNICODE_IS_HIGH_SURROGATE (Py_UCS4 ch)

`ch'가 상위 서로게이트인지 확인합니다 (@code{0xD800 <= ch <= 0xDBFF}).
@end deffn

@geindex Py_UNICODE_IS_LOW_SURROGATE (C function)
@anchor{c-api/unicode c Py_UNICODE_IS_LOW_SURROGATE}@anchor{53af}
@deffn {C 함수} int Py_UNICODE_IS_LOW_SURROGATE (Py_UCS4 ch)

`ch'가 하위 서로게이트인지 확인합니다 (@code{0xDC00 <= ch <= 0xDFFF}).
@end deffn

@geindex Py_UNICODE_HIGH_SURROGATE (C function)
@anchor{c-api/unicode c Py_UNICODE_HIGH_SURROGATE}@anchor{53b0}
@deffn {C 함수} @ref{33d,,Py_UCS4} Py_UNICODE_HIGH_SURROGATE (Py_UCS4 ch)

Return the high UTF-16 surrogate (@code{0xD800} to @code{0xDBFF}) for a Unicode
code point in the range @code{[0x10000; 0x10FFFF]}.
@end deffn

@geindex Py_UNICODE_LOW_SURROGATE (C function)
@anchor{c-api/unicode c Py_UNICODE_LOW_SURROGATE}@anchor{53b1}
@deffn {C 함수} @ref{33d,,Py_UCS4} Py_UNICODE_LOW_SURROGATE (Py_UCS4 ch)

Return the low UTF-16 surrogate (@code{0xDC00} to @code{0xDFFF}) for a Unicode
code point in the range @code{[0x10000; 0x10FFFF]}.
@end deffn

@geindex Py_UNICODE_JOIN_SURROGATES (C function)
@anchor{c-api/unicode c Py_UNICODE_JOIN_SURROGATES}@anchor{53b2}
@deffn {C 함수} @ref{33d,,Py_UCS4} Py_UNICODE_JOIN_SURROGATES (Py_UCS4 high, Py_UCS4 low)

Join two surrogate code points and return a single @ref{33d,,Py_UCS4} value.
`high' and `low' are respectively the leading and trailing surrogates in a
surrogate pair. `high' must be in the range @code{[0xD800; 0xDBFF]} and `low' must
be in the range @code{[0xDC00; 0xDFFF]}.
@end deffn

@node 유니코드 문자열 생성과 액세스,로케일 인코딩,유니코드 문자 속성,유니코드 객체
@anchor{c-api/unicode creating-and-accessing-unicode-strings}@anchor{53b3}
@subsubsection 유니코드 문자열 생성과 액세스


유니코드 객체를 만들고 기본 시퀀스 속성에 액세스하려면 다음 API를 사용하십시오:

@geindex PyUnicode_New (C function)
@anchor{c-api/unicode c PyUnicode_New}@anchor{aa9}
@deffn {C 함수} @ref{5dc,,PyObject} *PyUnicode_New (Py_ssize_t size, Py_UCS4 maxchar)
`반환값: 새 참조.'
새 유니코드 객체를 만듭니다. `maxchar'은 문자열에 배치할 실제 최대 코드 포인트여야 합니다. 근삿값으로, 127, 255, 65535, 1114111 시퀀스에서 가장 가까운 값으로 올림 할 수 있습니다.

On error, set an exception and return @code{NULL}.

After creation, the string can be filled by @ref{1377,,PyUnicode_WriteChar()},
@ref{ab2,,PyUnicode_CopyCharacters()}, @ref{1392,,PyUnicode_Fill()},
@ref{1388,,PyUnicode_WRITE()} or similar.
Since strings are supposed to be immutable, take care to not “use” the
result while it is being modified. In particular, before it’s filled
with its final contents, a string:


@itemize -

@item 
must not be hashed,

@item 
must not be @ref{a99,,converted to UTF-8},
or another non-“canonical” representation,

@item 
must not have its reference count changed,

@item 
must not be shared with code that might do one of the above.
@end itemize

This list is not exhaustive. Avoiding these uses is your responsibility;
Python does not always check these requirements.

To avoid accidentally exposing a partially-written string object, prefer
using the @ref{3b3,,PyUnicodeWriter} API, or one of the @code{PyUnicode_From*}
functions below.


Added in version 3.3.

@end deffn

@geindex PyUnicode_FromKindAndData (C function)
@anchor{c-api/unicode c PyUnicode_FromKindAndData}@anchor{137c}
@deffn {C 함수} @ref{5dc,,PyObject} *PyUnicode_FromKindAndData (int kind, const void *buffer, Py_ssize_t size)
`반환값: 새 참조.'
주어진 `kind'(가능한 값은 @ref{1382,,PyUnicode_KIND()}에 의해 반환된 @ref{1383,,PyUnicode_1BYTE_KIND} 등입니다)로 새로운 유니코드 객체를 만듭니다. `buffer'는 kind에 따라 문자 당 1, 2 또는 4바이트의 `size' 단위의 배열을 가리켜야 합니다.

If necessary, the input `buffer' is copied and transformed into the
canonical representation.  For example, if the `buffer' is a UCS4 string
(@ref{1385,,PyUnicode_4BYTE_KIND}) and it consists only of codepoints in
the UCS1 range, it will be transformed into UCS1
(@ref{1383,,PyUnicode_1BYTE_KIND}).


Added in version 3.3.

@end deffn

@geindex PyUnicode_FromStringAndSize (C function)
@anchor{c-api/unicode c PyUnicode_FromStringAndSize}@anchor{5152}
@deffn {C 함수} @ref{5dc,,PyObject} *PyUnicode_FromStringAndSize (const char *str, Py_ssize_t size)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
char 버퍼 `str'에서 유니코드 객체를 만듭니다. 바이트는 UTF-8로 인코딩된 것으로 해석됩니다. 버퍼는 새 객체에 복사됩니다. 반환 값은 공유 객체일 수 있습니다, 즉, 데이터 수정이 허용되지 않습니다.

이 함수는 다음과 같은 경우에 @ref{794,,SystemError}를 발생시킵니다:


@itemize *

@item 
`size' < 0,

@item 
`str' is @code{NULL} and `size' > 0
@end itemize


버전 3.12에서 변경: `str' == @code{NULL} with `size' > 0 is not allowed anymore.

@end deffn

@geindex PyUnicode_FromString (C function)
@anchor{c-api/unicode c PyUnicode_FromString}@anchor{5151}
@deffn {C 함수} @ref{5dc,,PyObject} *PyUnicode_FromString (const char *str)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
UTF-8로 인코딩된 널-종료 char 버퍼 `str'에서 유니코드 객체를 만듭니다.
@end deffn

@geindex PyUnicode_FromFormat (C function)
@anchor{c-api/unicode c PyUnicode_FromFormat}@anchor{629}
@deffn {C 함수} @ref{5dc,,PyObject} *PyUnicode_FromFormat (const char *format, ...)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
C @code{printf()}-스타일 `format' 문자열과 가변 개수의 인자를 취해서, 결과 파이썬 유니코드 문자열의 크기를 계산하고 포맷된 값이 들어간 문자열을 반환합니다. 변수 인자는 C형이어야 하며 `format' ASCII 인코딩된 문자열의 포맷 문자와 정확히 일치해야 합니다.

A conversion specifier contains two or more characters and has the following
components, which must occur in this order:


@enumerate 

@item 
The @code{'%'} character, which marks the start of the specifier.

@item 
Conversion flags (optional), which affect the result of some conversion
types.

@item 
Minimum field width (optional).
If specified as an @code{'*'} (asterisk), the actual width is given in the
next argument, which must be of type int, and the object to
convert comes after the minimum field width and optional precision.

@item 
Precision (optional), given as a @code{'.'} (dot) followed by the precision.
If specified as @code{'*'} (an asterisk), the actual precision is given in
the next argument, which must be of type int, and the value to
convert comes after the precision.

@item 
Length modifier (optional).

@item 
Conversion type.
@end enumerate

The conversion flag characters are:


@multitable {xxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Flag

@tab

Meaning

@item

@code{0}

@tab

The conversion will be zero padded for numeric values.

@item

@code{-}

@tab

The converted value is left adjusted (overrides the @code{0}
flag if both are given).

@end multitable


The length modifiers for following integer conversions (@code{d}, @code{i},
@code{o}, @code{u}, @code{x}, or @code{X}) specify the type of the argument
(int by default):


@multitable {xxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Modifier

@tab

형

@item

@code{l}

@tab

long 또는 unsigned long

@item

@code{ll}

@tab

long long 또는 unsigned long long

@item

@code{j}

@tab

@code{intmax_t} 또는 @code{uintmax_t}

@item

@code{z}

@tab

@code{size_t} 또는 @code{ssize_t}

@item

@code{t}

@tab

@code{ptrdiff_t}

@end multitable


The length modifier @code{l} for following conversions @code{s} or @code{V} specify
that the type of the argument is const wchar_t*.

The conversion specifiers are:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Conversion Specifier

@tab

형

@tab

주석

@item

@code{%}

@tab

`n/a'

@tab

리터럴 @code{%} 문자.

@item

@code{d}, @code{i}

@tab

Specified by the length modifier

@tab

The decimal representation of a signed C integer.

@item

@code{u}

@tab

Specified by the length modifier

@tab

The decimal representation of an unsigned C integer.

@item

@code{o}

@tab

Specified by the length modifier

@tab

The octal representation of an unsigned C integer.

@item

@code{x}

@tab

Specified by the length modifier

@tab

The hexadecimal representation of an unsigned C integer (lowercase).

@item

@code{X}

@tab

Specified by the length modifier

@tab

The hexadecimal representation of an unsigned C integer (uppercase).

@item

@code{c}

@tab

int

@tab

단일 문자.

@item

@code{s}

@tab

const char* 또는 const wchar_t*

@tab

널-종료 C 문자 배열.

@item

@code{p}

@tab

const void*

@tab

C 포인터의 16진수 표현. 플랫폼의 @code{printf}가 산출하는 내용과 관계없이 리터럴 @code{0x}로 시작하는 것이 보장된다는 점을 제외하면 거의 @code{printf("%p")}와 동등합니다.

@item

@code{A}

@tab

@ref{5dc,,PyObject}*

@tab

@ref{15eb,,ascii()}를 호출한 결과.

@item

@code{U}

@tab

@ref{5dc,,PyObject}*

@tab

유니코드 객체.

@item

@code{V}

@tab

@ref{5dc,,PyObject}*, const char* 또는 const wchar_t*

@tab

유니코드 객체(@code{NULL}일 수 있습니다)와 두 번째 매개 변수로서 널-종료 C 문자 배열 (첫 번째 매개 변수가 @code{NULL}이면 사용됩니다).

@item

@code{S}

@tab

@ref{5dc,,PyObject}*

@tab

@ref{122f,,PyObject_Str()}을 호출한 결과.

@item

@code{R}

@tab

@ref{5dc,,PyObject}*

@tab

@ref{122e,,PyObject_Repr()}을 호출한 결과.

@item

@code{T}

@tab

@ref{5dc,,PyObject}*

@tab

Get the fully qualified name of an object type;
call @ref{614,,PyType_GetFullyQualifiedName()}.

@item

@code{#T}

@tab

@ref{5dc,,PyObject}*

@tab

Similar to @code{T} format, but use a colon (@code{:}) as separator between
the module name and the qualified name.

@item

@code{N}

@tab

@ref{c9b,,PyTypeObject}*

@tab

Get the fully qualified name of a type;
call @ref{614,,PyType_GetFullyQualifiedName()}.

@item

@code{#N}

@tab

@ref{c9b,,PyTypeObject}*

@tab

Similar to @code{N} format, but use a colon (@code{:}) as separator between
the module name and the qualified name.

@end multitable


@cartouche
@quotation 참고 
너비 포매터 단위는 바이트가 아닌 문자 수입니다. 정밀도 포매터 단위는 @code{"%s"}와 @code{"%V"}의 경우는 바이트 수나 (길이 수정자 @code{l}이 사용되면) @code{wchar_t} 항목이고 (@code{PyObject*} 인자가 @code{NULL}이면), @code{"%A"}, @code{"%U"}, @code{"%S"}, @code{"%R"} 및 @code{"%V"}의 경우 문자 수입니다 (@code{PyObject*} 인자가 @code{NULL}이 아니면).
@end quotation
@end cartouche

@cartouche
@quotation 참고 
Unlike to C @code{printf()} the @code{0} flag has effect even when
a precision is given for integer conversions (@code{d}, @code{i}, @code{u}, @code{o},
@code{x}, or @code{X}).
@end quotation
@end cartouche


버전 3.2에서 변경: @code{"%lld"}와 @code{"%llu"}에 대한 지원이 추가되었습니다.



버전 3.3에서 변경: @code{"%li"}, @code{"%lli"} 및 @code{"%zi"}에 대한 지원이 추가되었습니다.



버전 3.4에서 변경: @code{"%s"}, @code{"%A"}, @code{"%U"}, @code{"%V"}, @code{"%S"}, @code{"%R"}에 대한 너비와 정밀도 포매터 지원이 추가되었습니다.



버전 3.12에서 변경: Support for conversion specifiers @code{o} and @code{X}.
Support for length modifiers @code{j} and @code{t}.
Length modifiers are now applied to all integer conversions.
Length modifier @code{l} is now applied to conversion specifiers @code{s} and @code{V}.
Support for variable width and precision @code{*}.
Support for flag @code{-}.

인식할 수 없는 포맷 문자는 이제 @ref{794,,SystemError}를 설정합니다. 이전 버전에서는 나머지 포맷 문자열이 모두 결과 문자열에 그대로 복사되고, 추가 인자는 버려지도록 했습니다.



버전 3.13에서 변경: @code{%T}, @code{%#T}, @code{%N} 및 @code{%#N}에 대한 지원이 추가되었습니다.

@end deffn

@geindex PyUnicode_FromFormatV (C function)
@anchor{c-api/unicode c PyUnicode_FromFormatV}@anchor{793}
@deffn {C 함수} @ref{5dc,,PyObject} *PyUnicode_FromFormatV (const char *format, va_list vargs)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
정확히 두 개의 인자를 취한다는 점을 제외하면 @ref{629,,PyUnicode_FromFormat()}과 동일합니다.
@end deffn

@geindex PyUnicode_FromObject (C function)
@anchor{c-api/unicode c PyUnicode_FromObject}@anchor{514f}
@deffn {C 함수} @ref{5dc,,PyObject} *PyUnicode_FromObject (PyObject *obj)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
필요하면 유니코드 서브 형의 인스턴스를 새로운 진짜 유니코드 객체에 복사합니다. `obj'가 이미 (서브 형이 아닌) 진짜 유니코드 객체이면, 객체에 대한 새로운 @ref{5df,,강한 참조}를 반환합니다.

유니코드나 이의 서브 형 이외의 객체는 @ref{198,,TypeError}를 발생시킵니다.
@end deffn

@geindex PyUnicode_FromOrdinal (C function)
@anchor{c-api/unicode c PyUnicode_FromOrdinal}@anchor{5150}
@deffn {C 함수} @ref{5dc,,PyObject} *PyUnicode_FromOrdinal (int ordinal)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
주어진 유니코드 코드 포인트 `ordinal'로 유니코드 객체를 만듭니다.

The ordinal must be in @code{range(0x110000)}. A @ref{2ec,,ValueError} is
raised in the case it is not.
@end deffn

@geindex PyUnicode_FromEncodedObject (C function)
@anchor{c-api/unicode c PyUnicode_FromEncodedObject}@anchor{514e}
@deffn {C 함수} @ref{5dc,,PyObject} *PyUnicode_FromEncodedObject (PyObject *obj, const char *encoding, const char *errors)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
인코딩된 객체 `obj'를 유니코드 객체로 디코딩합니다.

@ref{192,,bytes}, @ref{344,,bytearray} 및 기타 @ref{193,,바이트열류 객체}는 주어진 `encoding'에 따라 `errors'로 정의한 에러 처리를 사용하여 디코딩됩니다. 둘 다 @code{NULL}이 될 수 있고, 이 경우 인터페이스는 기본값을 사용합니다 (자세한 내용은 @ref{53b4,,내장 코덱}를 참조하십시오).

유니코드 객체를 포함한 다른 모든 객체는 @ref{198,,TypeError}가 설정되도록 합니다.

API는 에러가 있으면 @code{NULL}을 반환합니다. 호출자는 반환된 객체의 참조 횟수를 감소시킬 책임이 있습니다.
@end deffn

@geindex PyUnicode_Append (C function)
@anchor{c-api/unicode c PyUnicode_Append}@anchor{5133}
@deffn {C 함수} void PyUnicode_Append (PyObject **p_left, PyObject *right)
` Part of the @ref{774,,안정 ABI}.'
Append the string `right' to the end of `p_left'.
`p_left' must point to a @ref{5df,,strong reference} to a Unicode object;
@code{PyUnicode_Append()} releases (“steals”) this reference.

On error, set `*p_left' to @code{NULL} and set an exception.

On success, set `*p_left' to a new strong reference to the result.
@end deffn

@geindex PyUnicode_AppendAndDel (C function)
@anchor{c-api/unicode c PyUnicode_AppendAndDel}@anchor{5134}
@deffn {C 함수} void PyUnicode_AppendAndDel (PyObject **p_left, PyObject *right)
` Part of the @ref{774,,안정 ABI}.'
The function is similar to @ref{5133,,PyUnicode_Append()}, with the only
difference being that it decrements the reference count of `right' by one.
@end deffn

@geindex PyUnicode_BuildEncodingMap (C function)
@anchor{c-api/unicode c PyUnicode_BuildEncodingMap}@anchor{1a62}
@deffn {C 함수} @ref{5dc,,PyObject} *PyUnicode_BuildEncodingMap (PyObject *string)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
Return a mapping suitable for decoding a custom single-byte encoding.
Given a Unicode string `string' of up to 256 characters representing an encoding
table, returns either a compact internal mapping object or a dictionary
mapping character ordinals to byte values. Raises a @ref{198,,TypeError} and
return @code{NULL} on invalid input.


Added in version 3.2.

@end deffn

@geindex PyUnicode_GetDefaultEncoding (C function)
@anchor{c-api/unicode c PyUnicode_GetDefaultEncoding}@anchor{5153}
@deffn {C 함수} const char *PyUnicode_GetDefaultEncoding (void)
` Part of the @ref{774,,안정 ABI}.'
Return the name of the default string encoding, @code{"utf-8"}.
See @ref{4955,,sys.getdefaultencoding()}.

The returned string does not need to be freed, and is valid
until interpreter shutdown.
@end deffn

@geindex PyUnicode_GetLength (C function)
@anchor{c-api/unicode c PyUnicode_GetLength}@anchor{ab0}
@deffn {C 함수} @ref{c54,,Py_ssize_t} PyUnicode_GetLength (PyObject *unicode)
` Part of the @ref{774,,안정 ABI} 버전 3.7 이후로.'
유니코드 객체의 길이를 코드 포인트로 반환합니다.

On error, set an exception and return @code{-1}.


Added in version 3.3.

@end deffn

@geindex PyUnicode_CopyCharacters (C function)
@anchor{c-api/unicode c PyUnicode_CopyCharacters}@anchor{ab2}
@deffn {C 함수} @ref{c54,,Py_ssize_t} PyUnicode_CopyCharacters (PyObject *to, Py_ssize_t to_start, PyObject *from, Py_ssize_t from_start, Py_ssize_t how_many)

한 유니코드 객체에서 다른 객체로 문자를 복사합니다. 이 함수는 필요하면 문자 변환을 수행하고 가능하면 @code{memcpy()}로 폴백합니다. 에러 시 @code{-1}을 반환하고 예외를 설정합니다, 그렇지 않으면 복사된 문자 수를 반환합니다.

The string must not have been “used” yet.
See @ref{aa9,,PyUnicode_New()} for details.


Added in version 3.3.

@end deffn

@geindex PyUnicode_Resize (C function)
@anchor{c-api/unicode c PyUnicode_Resize}@anchor{5155}
@deffn {C 함수} int PyUnicode_Resize (PyObject **unicode, Py_ssize_t length);
` Part of the @ref{774,,안정 ABI}.'
Resize a Unicode object `*unicode' to the new `length' in code points.

Try to resize the string in place (which is usually faster than allocating
a new string and copying characters), or create a new string.

`*unicode' is modified to point to the new (resized) object and @code{0} is
returned on success. Otherwise, @code{-1} is returned and an exception is set,
and `*unicode' is left untouched.

The function doesn’t check string content, the result may not be a
string in canonical representation.
@end deffn

@geindex PyUnicode_Fill (C function)
@anchor{c-api/unicode c PyUnicode_Fill}@anchor{1392}
@deffn {C 함수} @ref{c54,,Py_ssize_t} PyUnicode_Fill (PyObject *unicode, Py_ssize_t start, Py_ssize_t length, Py_UCS4 fill_char)

문자로 문자열을 채웁니다: `fill_char'을 @code{unicode[start:start+length]}에 씁니다.

`fill_char'이 문자열 최대 문자보다 크거나, 문자열에 둘 이상의 참조가 있으면 실패합니다.

The string must not have been “used” yet.
See @ref{aa9,,PyUnicode_New()} for details.

기록된 문자 수를 반환하거나, 에러 시 @code{-1}을 반환하고 예외를 발생시킵니다.


Added in version 3.3.

@end deffn

@geindex PyUnicode_WriteChar (C function)
@anchor{c-api/unicode c PyUnicode_WriteChar}@anchor{1377}
@deffn {C 함수} int PyUnicode_WriteChar (PyObject *unicode, Py_ssize_t index, Py_UCS4 character)
` Part of the @ref{774,,안정 ABI} 버전 3.7 이후로.'
Write a `character' to the string `unicode' at the zero-based `index'.
Return @code{0} on success, @code{-1} on error with an exception set.

This function checks that `unicode' is a Unicode object, that the index is
not out of bounds, and that the object’s reference count is one.
See @ref{1388,,PyUnicode_WRITE()} for a version that skips these checks,
making them your responsibility.

The string must not have been “used” yet.
See @ref{aa9,,PyUnicode_New()} for details.


Added in version 3.3.

@end deffn

@geindex PyUnicode_ReadChar (C function)
@anchor{c-api/unicode c PyUnicode_ReadChar}@anchor{1376}
@deffn {C 함수} @ref{33d,,Py_UCS4} PyUnicode_ReadChar (PyObject *unicode, Py_ssize_t index)
` Part of the @ref{774,,안정 ABI} 버전 3.7 이후로.'
문자열에서 문자를 읽습니다. 이 함수는 에러를 검사하지 않는 @ref{1387,,PyUnicode_READ_CHAR()}와 달리 `unicode'가 유니코드 객체이고 인덱스가 범위를 벗어났는지 확인합니다.

성공 시 문자를, 에러 시 예외를 설정하고 @code{-1}을 반환합니다.


Added in version 3.3.

@end deffn

@geindex PyUnicode_Substring (C function)
@anchor{c-api/unicode c PyUnicode_Substring}@anchor{ab3}
@deffn {C 함수} @ref{5dc,,PyObject} *PyUnicode_Substring (PyObject *unicode, Py_ssize_t start, Py_ssize_t end)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI} 버전 3.7 이후로.'
문자 인덱스 `start'(포함합니다)에서 문자 인덱스 `end'(제외합니다)까지 `unicode'의 하위 문자열을 반환합니다. 음수 인덱스는 지원되지 않습니다. 에러 시, 예외를 설정하고 @code{NULL}을 반환합니다.


Added in version 3.3.

@end deffn

@geindex PyUnicode_AsUCS4 (C function)
@anchor{c-api/unicode c PyUnicode_AsUCS4}@anchor{137d}
@deffn {C 함수} @ref{33d,,Py_UCS4} *PyUnicode_AsUCS4 (PyObject *unicode, Py_UCS4 *buffer, Py_ssize_t buflen, int copy_null)
` Part of the @ref{774,,안정 ABI} 버전 3.7 이후로.'
`copy_null'이 설정되면, 널 문자를 포함하여 문자열 `unicode'를 UCS4 버퍼에 복사합니다. 에러 시 @code{NULL}을 반환하고 예외를 설정합니다 (특히, `buflen'이 `unicode'의 길이보다 작으면 @ref{794,,SystemError}). 성공하면 `buffer'가 반환됩니다.


Added in version 3.3.

@end deffn

@geindex PyUnicode_AsUCS4Copy (C function)
@anchor{c-api/unicode c PyUnicode_AsUCS4Copy}@anchor{ab8}
@deffn {C 함수} @ref{33d,,Py_UCS4} *PyUnicode_AsUCS4Copy (PyObject *unicode)
` Part of the @ref{774,,안정 ABI} 버전 3.7 이후로.'
문자열 `unicode'를 @ref{e5e,,PyMem_Malloc()}을 사용하여 할당된 새 UCS4 버퍼에 복사합니다. 이것이 실패하면, @code{NULL}이 반환되고 @ref{175f,,MemoryError}가 설정됩니다. 반환된 버퍼에는 항상 추가 널 코드 포인트가 있습니다.


Added in version 3.3.

@end deffn

@node 로케일 인코딩,파일 시스템 인코딩,유니코드 문자열 생성과 액세스,유니코드 객체
@anchor{c-api/unicode locale-encoding}@anchor{53b5}
@subsubsection 로케일 인코딩


현재 로케일 인코딩을 사용하여 운영 체제에서 온 텍스트를 디코딩 할 수 있습니다.

@geindex PyUnicode_DecodeLocaleAndSize (C function)
@anchor{c-api/unicode c PyUnicode_DecodeLocaleAndSize}@anchor{dc1}
@deffn {C 함수} @ref{5dc,,PyObject} *PyUnicode_DecodeLocaleAndSize (const char *str, Py_ssize_t length, const char *errors)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI} 버전 3.7 이후로.'
안드로이드와 VxWorks의 UTF-8이나 다른 플랫폼의 현재 로케일 인코딩의 문자열을 디코딩합니다. 지원되는 에러 처리기는 @code{"strict"}와 @code{"surrogateescape"}(
@geindex Python 향상 제안; PEP 383
PEP 383@footnote{https://peps.python.org/pep-0383/})입니다. 디코더는 `errors'가 @code{NULL}이면 @code{"strict"} 에러 처리기를 사용합니다. `str'은 널 문자로 끝나야 하지만 널 문자를 포함할 수 없습니다.

@ref{75c,,파일시스템 인코딩과 에러 처리기}로 문자열을 디코딩하려면 @ref{513e,,PyUnicode_DecodeFSDefaultAndSize()}를 사용하십시오.

이 함수는 @ref{865,,파이썬 UTF-8 모드}를 무시합니다.


@subsubheading 더 보기


@ref{dbf,,Py_DecodeLocale()} 함수.



Added in version 3.3.



버전 3.7에서 변경: 이 함수는 이제 안드로이드를 제외하고 @code{surrogateescape} 에러 처리기에 현재 로케일 인코딩도 사용합니다. 이전에는, @ref{dbf,,Py_DecodeLocale()}이 @code{surrogateescape}에 사용되었고, 현재 로케일 인코딩은 @code{strict}에 사용되었습니다.

@end deffn

@geindex PyUnicode_DecodeLocale (C function)
@anchor{c-api/unicode c PyUnicode_DecodeLocale}@anchor{5140}
@deffn {C 함수} @ref{5dc,,PyObject} *PyUnicode_DecodeLocale (const char *str, const char *errors)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI} 버전 3.7 이후로.'
@ref{dc1,,PyUnicode_DecodeLocaleAndSize()}와 유사하지만, @code{strlen()}을 사용하여 문자열 길이를 계산합니다.


Added in version 3.3.

@end deffn

@geindex PyUnicode_EncodeLocale (C function)
@anchor{c-api/unicode c PyUnicode_EncodeLocale}@anchor{dc2}
@deffn {C 함수} @ref{5dc,,PyObject} *PyUnicode_EncodeLocale (PyObject *unicode, const char *errors)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI} 버전 3.7 이후로.'
유니코드 객체를 안드로이드와 VxWorks에서 UTF-8로 인코딩하거나, 다른 플랫폼에서 현재 로케일 인코딩으로 인코딩합니다. 지원되는 에러 처리기는 @code{"strict"}와 @code{"surrogateescape"}(
@geindex Python 향상 제안; PEP 383
PEP 383@footnote{https://peps.python.org/pep-0383/})입니다. 인코더는 `errors'가 @code{NULL}이면 @code{"strict"} 에러 처리기를 사용합니다. @ref{192,,bytes} 객체를 반환합니다. `unicode'는 내장된 널 문자를 포함할 수 없습니다.

@ref{75c,,파일시스템 인코딩과 에러 처리기}로 문자열을 인코딩하려면 @ref{1e2d,,PyUnicode_EncodeFSDefault()}를 사용하십시오.

이 함수는 @ref{865,,파이썬 UTF-8 모드}를 무시합니다.


@subsubheading 더 보기


@ref{dc0,,Py_EncodeLocale()} 함수.



Added in version 3.3.



버전 3.7에서 변경: 이 함수는 이제 안드로이드를 제외하고 @code{surrogateescape} 에러 처리기에 현재 로케일 인코딩도 사용합니다. 이전에는 @ref{dc0,,Py_EncodeLocale()}이 @code{surrogateescape}에 사용되었고, 현재 로케일 인코딩은 @code{strict}에 사용되었습니다.

@end deffn

@node 파일 시스템 인코딩,wchar_t 지원,로케일 인코딩,유니코드 객체
@anchor{c-api/unicode file-system-encoding}@anchor{53b6}
@subsubsection 파일 시스템 인코딩


Functions encoding to and decoding from the @ref{75c,,filesystem encoding and error handler} (
@geindex Python 향상 제안; PEP 383
PEP 383@footnote{https://peps.python.org/pep-0383/} and 
@geindex Python 향상 제안; PEP 529
PEP 529@footnote{https://peps.python.org/pep-0529/}).

인자 구문 분석 중에 파일 이름을 @ref{192,,bytes}로 인코딩하려면, @code{"O&"} 변환기를 사용하고 @code{PyUnicode_FSConverter()}를 변환 함수로 전달해야 합니다:

@geindex PyUnicode_FSConverter (C function)
@anchor{c-api/unicode c PyUnicode_FSConverter}@anchor{f14}
@deffn {C 함수} int PyUnicode_FSConverter (PyObject *obj, void *result)
` Part of the @ref{774,,안정 ABI}.'
@ref{3d5,,PyArg_Parse* 변환기}: (직접 또는 @ref{e4a,,os.PathLike} 인터페이스를 통해 얻은) @ref{169,,str} 객체를 @ref{1e2d,,PyUnicode_EncodeFSDefault()}를 사용하여 @ref{192,,bytes}로 인코딩합니다; @code{bytes} 객체는 있는 그대로의 출력입니다. `result'는 형이 @ref{5dc,,PyObject}* (또는 @ref{994,,PyBytesObject}*) 인 C 변수의 주소여야 합니다. 성공 시, 더는 사용되지 않을 때 해제해야 하는 @ref{5382,,바이트열 객체}에 대한 @ref{5df,,강한 참조}로 변수를 설정하고 0이 아닌 값(@ref{527f,,Py_CLEANUP_SUPPORTED})을 반환합니다. 결과에 내장된 널 바이트는 허용되지 않습니다. 실패 시, 예외를 설정하고 @code{0}을 반환합니다.

If `obj' is @code{NULL}, the function releases a strong reference
stored in the variable referred by `result' and returns @code{1}.


Added in version 3.1.



버전 3.6에서 변경: @ref{5a0,,경로류 객체}를 받아들입니다.

@end deffn

인자 구문 분석 중에 파일 이름을 @ref{169,,str}로 디코딩하려면, @code{"O&"} 변환기를 사용하고 @code{PyUnicode_FSDecoder()}를 변환 함수로 전달해야 합니다:

@geindex PyUnicode_FSDecoder (C function)
@anchor{c-api/unicode c PyUnicode_FSDecoder}@anchor{796}
@deffn {C 함수} int PyUnicode_FSDecoder (PyObject *obj, void *result)
` Part of the @ref{774,,안정 ABI}.'
@ref{3d5,,PyArg_Parse* 변환기}: (직접 또는 @ref{e4a,,os.PathLike} 인터페이스를 통해 간접적으로 얻은) @ref{192,,bytes} 객체를 @ref{513e,,PyUnicode_DecodeFSDefaultAndSize()}를 사용하여 @ref{169,,str}로 디코딩합니다; @code{str} 객체는 있는 그대로의 출력입니다. `result'는 형이 @ref{5dc,,PyObject}* (또는 @ref{996,,PyUnicodeObject}*) 인 C 변수의 주소여야 합니다. 성공 시, 더는 사용되지 않을 때 해제해야 하는 @ref{5394,,유니코드 객체}에 대한 @ref{5df,,강한 참조}로 변수를 설정하고 0이 아닌 값(@ref{527f,,Py_CLEANUP_SUPPORTED})을 반환합니다. 결과에 내장된 널 바이트는 허용되지 않습니다. 실패 시, 예외를 설정하고 @code{0}을 반환합니다.

If `obj' is @code{NULL}, release the strong reference
to the object referred to by `result' and return @code{1}.


Added in version 3.2.



버전 3.6에서 변경: @ref{5a0,,경로류 객체}를 받아들입니다.

@end deffn

@geindex PyUnicode_DecodeFSDefaultAndSize (C function)
@anchor{c-api/unicode c PyUnicode_DecodeFSDefaultAndSize}@anchor{513e}
@deffn {C 함수} @ref{5dc,,PyObject} *PyUnicode_DecodeFSDefaultAndSize (const char *str, Py_ssize_t size)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
Decode a string from the @ref{75c,,filesystem encoding and error handler}.

현재 로케일 인코딩에서 문자열을 디코딩해야 하면, @ref{dc1,,PyUnicode_DecodeLocaleAndSize()}를 사용하십시오.


@subsubheading 더 보기


@ref{dbf,,Py_DecodeLocale()} 함수.



버전 3.6에서 변경: The @ref{75c,,filesystem error handler} is now used.

@end deffn

@geindex PyUnicode_DecodeFSDefault (C function)
@anchor{c-api/unicode c PyUnicode_DecodeFSDefault}@anchor{1a88}
@deffn {C 함수} @ref{5dc,,PyObject} *PyUnicode_DecodeFSDefault (const char *str)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
@ref{75c,,파일시스템 인코딩과 에러 처리기}로 널 종료 문자열을 디코딩합니다.

문자열 길이가 알려져 있으면, @ref{513e,,PyUnicode_DecodeFSDefaultAndSize()}를 사용하십시오.


버전 3.6에서 변경: The @ref{75c,,filesystem error handler} is now used.

@end deffn

@geindex PyUnicode_EncodeFSDefault (C function)
@anchor{c-api/unicode c PyUnicode_EncodeFSDefault}@anchor{1e2d}
@deffn {C 함수} @ref{5dc,,PyObject} *PyUnicode_EncodeFSDefault (PyObject *unicode)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
유니코드 객체를 @ref{75c,,파일시스템 인코딩과 에러 처리기}로 인코딩하고, @ref{192,,bytes}를 반환합니다. 결과 @code{bytes} 객체에는 널 바이트가 포함될 수 있음에 유의하십시오.

현재 로케일 인코딩으로 문자열을 인코딩해야 하면, @ref{dc2,,PyUnicode_EncodeLocale()}을 사용하십시오.


@subsubheading 더 보기


@ref{dc0,,Py_EncodeLocale()} 함수.



Added in version 3.2.



버전 3.6에서 변경: The @ref{75c,,filesystem error handler} is now used.

@end deffn

@node wchar_t 지원,,파일 시스템 인코딩,유니코드 객체
@anchor{c-api/unicode wchar-t-support}@anchor{53b7}
@subsubsection wchar_t 지원


지원하는 플랫폼에 대한 @code{wchar_t} 지원:

@geindex PyUnicode_FromWideChar (C function)
@anchor{c-api/unicode c PyUnicode_FromWideChar}@anchor{1391}
@deffn {C 함수} @ref{5dc,,PyObject} *PyUnicode_FromWideChar (const wchar_t *wstr, Py_ssize_t size)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
주어진 `size'의 @code{wchar_t} 버퍼 `wstr'에서 유니코드 객체를 만듭니다. @code{-1}을 `size'로 전달하면 함수가 @code{wcslen()}을 사용하여 길이를 스스로 계산해야 함을 나타냅니다. 실패하면 @code{NULL}을 반환합니다.
@end deffn

@geindex PyUnicode_AsWideChar (C function)
@anchor{c-api/unicode c PyUnicode_AsWideChar}@anchor{1e34}
@deffn {C 함수} @ref{c54,,Py_ssize_t} PyUnicode_AsWideChar (PyObject *unicode, wchar_t *wstr, Py_ssize_t size)
` Part of the @ref{774,,안정 ABI}.'
유니코드 객체 내용을 @code{wchar_t} 버퍼 `wstr'에 복사합니다. 최대 `size' @code{wchar_t} 문자가 복사됩니다 (후행 널 종료 문자가 제외될 수 있습니다). 복사된 @code{wchar_t} 문자 수나 에러가 발생하면 @code{-1}을 반환합니다.

When `wstr' is @code{NULL}, instead return the `size' that would be required
to store all of `unicode' including a terminating null.

결과 wchar_t* 문자열은 널로 종료될 수도 있고 아닐 수도 있음에 유의하십시오. 응용 프로그램에 필요하면 wchar_t* 문자열이 널로 끝나는지 확인하는 것은 호출자의 책임입니다. 또한, wchar_t* 문자열에는 널 문자가 포함될 수 있으며, 이로 인해 대부분의 C 함수와 함께 사용될 때 문자열이 잘리게 됨에 유의하십시오.
@end deffn

@geindex PyUnicode_AsWideCharString (C function)
@anchor{c-api/unicode c PyUnicode_AsWideCharString}@anchor{ab9}
@deffn {C 함수} wchar_t *PyUnicode_AsWideCharString (PyObject *unicode, Py_ssize_t *size)
` Part of the @ref{774,,안정 ABI} 버전 3.7 이후로.'
유니코드 객체를 와이드 문자 문자열로 변환합니다. 출력 문자열은 항상 널 문자로 끝납니다. `size'가 @code{NULL}이 아니면, (후행 널 종료 문자를 제외한) 와이드 문자의 수를 `*size'에 씁니다. 결과 @code{wchar_t} 문자열이 널 문자를 포함할 수 있고, 이로 인해 대부분의 C 함수와 함께 사용될 때 문자열이 잘리게 됨에 유의하십시오. `size'가 @code{NULL}이고 wchar_t* 문자열이 널 문자를 포함하면 @ref{2ec,,ValueError}가 발생합니다.

성공 시 @ref{1729,,PyMem_New}에 의해 할당된 버퍼를 반환합니다 (@ref{1647,,PyMem_Free()}를 사용하여 해제하십시오). 에러 시, @code{NULL}을 반환하고 `*size'는 정의되지 않습니다. 메모리 할당이 실패하면 @ref{175f,,MemoryError}를 발생시킵니다.


Added in version 3.2.



버전 3.7에서 변경: `size'가 @code{NULL}이고 wchar_t* 문자열이 널 문자를 포함하면 @ref{2ec,,ValueError}를 발생시킵니다.

@end deffn

@node 내장 코덱,메서드와 슬롯 함수,유니코드 객체,유니코드 객체와 코덱
@anchor{c-api/unicode built-in-codecs}@anchor{53b8}@anchor{c-api/unicode builtincodecs}@anchor{53b4}
@subsubsection 내장 코덱


파이썬은 속도를 위해 C로 작성된 내장 코덱 집합을 제공합니다. 이러한 코덱들은 모두 다음 함수들을 통해 직접 사용할 수 있습니다.

다음 API의 대부분은 두 개의 인자 encoding과 errors를 취하며, 내장 @ref{169,,str()} 문자열 객체 생성자의 것들과 같은 의미입니다.

encoding을 @code{NULL}로 설정하면 기본 인코딩인 UTF-8이 사용됩니다. 파일 시스템 호출은 파일 이름 인코딩에 @ref{f14,,PyUnicode_FSConverter()}를 사용해야 합니다. 이것은 내부적으로 @ref{75c,,파일시스템 인코딩과 에러 처리기}를 사용합니다.

에러 처리는 errors로 설정되는데, 코덱에 대해 정의된 기본 처리를 사용함을 의미하는 @code{NULL}로 설정될 수도 있습니다. 모든 내장 코덱에 대한 기본 에러 처리는 “strict” 입니다 (@ref{2ec,,ValueError}가 발생합니다).

코덱은 모두 유사한 인터페이스를 사용합니다. 단순성을 위해 다음에 나오는 일반 코덱과의 차이만 설명합니다.

@menu
* 일반 코덱:: 
* UTF-8 코덱:: 
* UTF-32 코덱:: 
* UTF-16 코덱:: 
* UTF-7 코덱:: 
* 유니코드 이스케이프 코덱:: 
* 원시 유니코드 이스케이프 코덱:: 
* Latin-1 코덱:: 
* ASCII 코덱:: 
* 문자 맵 코덱:: 
* 윈도우 용 MBCS 코덱:: 

@end menu

@node 일반 코덱,UTF-8 코덱,,내장 코덱
@anchor{c-api/unicode generic-codecs}@anchor{53b9}
@subsubsection 일반 코덱


The following macro is provided:

@geindex Py_UNICODE_REPLACEMENT_CHARACTER (C macro)
@anchor{c-api/unicode c Py_UNICODE_REPLACEMENT_CHARACTER}@anchor{53ba}
@deffn {C 매크로} Py_UNICODE_REPLACEMENT_CHARACTER

The Unicode code point @code{U+FFFD} (replacement character).

This Unicode character is used as the replacement character during
decoding if the `errors' argument is set to “replace”.
@end deffn

다음은 일반 코덱 API입니다:

@geindex PyUnicode_Decode (C function)
@anchor{c-api/unicode c PyUnicode_Decode}@anchor{1dc4}
@deffn {C 함수} @ref{5dc,,PyObject} *PyUnicode_Decode (const char *str, Py_ssize_t size, const char *encoding, const char *errors)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
인코딩된 문자열 `str'의 `size' 바이트를 디코딩하여 유니코드 객체를 만듭니다. `encoding'과 `errors'는 @ref{169,,str()} 내장 함수의 같은 이름의 매개 변수와 같은 의미입니다. 사용할 코덱은 파이썬 코덱 레지스트리를 사용하여 조회됩니다. 코덱에서 예외가 발생하면 @code{NULL}을 반환합니다.
@end deffn

@geindex PyUnicode_AsEncodedString (C function)
@anchor{c-api/unicode c PyUnicode_AsEncodedString}@anchor{5136}
@deffn {C 함수} @ref{5dc,,PyObject} *PyUnicode_AsEncodedString (PyObject *unicode, const char *encoding, const char *errors)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
유니코드 객체를 인코딩하고 결과를 파이썬 bytes 객체로 반환합니다. `encoding'과 `errors'는 유니코드 @ref{ad2,,encode()} 메서드의 같은 이름의 매개 변수와 같은 의미입니다. 사용할 코덱은 파이썬 코덱 레지스트리를 사용하여 조회됩니다. 코덱에서 예외가 발생하면 @code{NULL}을 반환합니다.
@end deffn

@node UTF-8 코덱,UTF-32 코덱,일반 코덱,내장 코덱
@anchor{c-api/unicode utf-8-codecs}@anchor{53bb}
@subsubsection UTF-8 코덱


다음은 UTF-8 코덱 API입니다:

@geindex PyUnicode_DecodeUTF8 (C function)
@anchor{c-api/unicode c PyUnicode_DecodeUTF8}@anchor{514a}
@deffn {C 함수} @ref{5dc,,PyObject} *PyUnicode_DecodeUTF8 (const char *str, Py_ssize_t size, const char *errors)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
UTF-8로 인코딩된 문자열 `str'의 `size' 바이트를 디코딩하여 유니코드 객체를 만듭니다. 코덱에서 예외가 발생하면 @code{NULL}을 반환합니다.
@end deffn

@geindex PyUnicode_DecodeUTF8Stateful (C function)
@anchor{c-api/unicode c PyUnicode_DecodeUTF8Stateful}@anchor{1b15}
@deffn {C 함수} @ref{5dc,,PyObject} *PyUnicode_DecodeUTF8Stateful (const char *str, Py_ssize_t size, const char *errors, Py_ssize_t *consumed)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
`consumed'가 @code{NULL}이면, @ref{514a,,PyUnicode_DecodeUTF8()}처럼 동작합니다. `consumed'가 @code{NULL}이 아니면, 후행 불완전한 UTF-8 바이트 시퀀스는 에러로 처리되지 않습니다. 이러한 바이트는 디코딩되지 않으며 디코딩된 바이트 수는 `consumed'에 저장됩니다.
@end deffn

@geindex PyUnicode_AsUTF8String (C function)
@anchor{c-api/unicode c PyUnicode_AsUTF8String}@anchor{1393}
@deffn {C 함수} @ref{5dc,,PyObject} *PyUnicode_AsUTF8String (PyObject *unicode)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
UTF-8을 사용하여 유니코드 객체를 인코딩하고 결과를 파이썬 bytes 객체로 반환합니다. 에러 처리는 “strict” 입니다. 코덱에서 예외가 발생하면 @code{NULL}을 반환합니다.

The function fails if the string contains surrogate code points
(@code{U+D800} - @code{U+DFFF}).
@end deffn

@geindex PyUnicode_AsUTF8AndSize (C function)
@anchor{c-api/unicode c PyUnicode_AsUTF8AndSize}@anchor{a99}
@deffn {C 함수} const char *PyUnicode_AsUTF8AndSize (PyObject *unicode, Py_ssize_t *size)
` Part of the @ref{774,,안정 ABI} 버전 3.10 이후로.'
유니코드 객체의 UTF-8 인코딩에 대한 포인터를 반환하고, 인코딩된 표현의 크기를 (바이트 단위로) `size'에 저장합니다. `size' 인자는 @code{NULL}일 수 있습니다; 이 경우 크기가 저장되지 않습니다. 반환된 버퍼에는 다른 널 코드 포인트가 있는지에 관계없이, 항상 추가 널 바이트가 추가됩니다 (`size'에 포함되지 않습니다).

On error, set an exception, set `size' to @code{-1} (if it’s not NULL) and
return @code{NULL}.

The function fails if the string contains surrogate code points
(@code{U+D800} - @code{U+DFFF}).

이것은 유니코드 객체에서 문자열의 UTF-8 표현을 캐시하고, 후속 호출은 같은 버퍼에 대한 포인터를 반환합니다. 호출자는 버퍼 할당 해제에 대한 책임이 없습니다. 유니코드 객체가 가비지 수거될 때 버퍼는 할당 해제되고 버퍼를 가리키는 포인터는 유효하지 않게 됩니다.


Added in version 3.3.



버전 3.7에서 변경: 반환형은 이제 @code{char *}가 아니라 @code{const char *}입니다.



버전 3.10에서 변경: This function is a part of the @ref{635,,limited API}.

@end deffn

@geindex PyUnicode_AsUTF8 (C function)
@anchor{c-api/unicode c PyUnicode_AsUTF8}@anchor{424}
@deffn {C 함수} const char *PyUnicode_AsUTF8 (PyObject *unicode)

@ref{a99,,PyUnicode_AsUTF8AndSize()}와 같지만, 크기를 저장하지 않습니다.

@cartouche
@quotation 경고 
This function does not have any special behavior for
null characters@footnote{https://en.wikipedia.org/wiki/Null_character} embedded within
`unicode'. As a result, strings containing null characters will remain in the returned
string, which some C functions might interpret as the end of the string, leading to
truncation. If truncation is an issue, it is recommended to use @ref{a99,,PyUnicode_AsUTF8AndSize()}
instead.
@end quotation
@end cartouche


Added in version 3.3.



버전 3.7에서 변경: 반환형은 이제 @code{char *}가 아니라 @code{const char *}입니다.

@end deffn

@node UTF-32 코덱,UTF-16 코덱,UTF-8 코덱,내장 코덱
@anchor{c-api/unicode utf-32-codecs}@anchor{53bc}
@subsubsection UTF-32 코덱


다음은 UTF-32 코덱 API입니다:

@geindex PyUnicode_DecodeUTF32 (C function)
@anchor{c-api/unicode c PyUnicode_DecodeUTF32}@anchor{5146}
@deffn {C 함수} @ref{5dc,,PyObject} *PyUnicode_DecodeUTF32 (const char *str, Py_ssize_t size, const char *errors, int *byteorder)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
UTF-32로 인코딩된 버퍼 문자열에서 `size' 바이트를 디코딩하고 해당 유니코드 객체를 반환합니다. `errors'(@code{NULL}이 아니면)는 에러 처리를 정의합니다. 기본값은 “strict”입니다.

`byteorder'가 @code{NULL}이 아니면, 디코더는 지정된 바이트 순서를 사용하여 디코딩을 시작합니다:

@example
*byteorder == -1: 리틀 엔디안
*byteorder == 0:  네이티브 엔디안
*byteorder == 1:  빅 엔디안
@end example

@code{*byteorder}가 0이고, 입력 데이터의 처음 4바이트가 바이트 순서 표시(BOM)이면, 디코더가 이 바이트 순서로 전환되고 BOM은 결과 유니코드 문자열에 복사되지 않습니다. @code{*byteorder}가 @code{-1}이나 @code{1}이면, 모든 바이트 순서 표시가 출력에 복사됩니다.

완료 후, `*byteorder'는 입력 데이터의 끝에서 현재 바이트 순서로 설정됩니다.

`byteorder'가 @code{NULL}이면, 코덱은 네이티브 순서 모드로 시작합니다.

코덱에서 예외가 발생하면 @code{NULL}을 반환합니다.
@end deffn

@geindex PyUnicode_DecodeUTF32Stateful (C function)
@anchor{c-api/unicode c PyUnicode_DecodeUTF32Stateful}@anchor{5147}
@deffn {C 함수} @ref{5dc,,PyObject} *PyUnicode_DecodeUTF32Stateful (const char *str, Py_ssize_t size, const char *errors, int *byteorder, Py_ssize_t *consumed)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
`consumed'가 @code{NULL}이면, @ref{5146,,PyUnicode_DecodeUTF32()}처럼 동작합니다. `consumed'가 @code{NULL}이 아니면, @ref{5147,,PyUnicode_DecodeUTF32Stateful()} 은 후행 불완전 UTF-32 바이트 시퀀스(가령 4로 나누어떨어지지 않는 바이트 수)를 에러로 처리하지 않습니다. 이러한 바이트는 디코딩되지 않으며 디코딩된 바이트 수는 `consumed'에 저장됩니다.
@end deffn

@geindex PyUnicode_AsUTF32String (C function)
@anchor{c-api/unicode c PyUnicode_AsUTF32String}@anchor{5138}
@deffn {C 함수} @ref{5dc,,PyObject} *PyUnicode_AsUTF32String (PyObject *unicode)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
네이티브 바이트 순서로 UTF-32 인코딩을 사용하여 파이썬 바이트 문자열을 반환합니다. 문자열은 항상 BOM 마크로 시작합니다. 에러 처리는 “strict”입니다. 코덱에서 예외가 발생하면 @code{NULL}을 반환합니다.
@end deffn

@node UTF-16 코덱,UTF-7 코덱,UTF-32 코덱,내장 코덱
@anchor{c-api/unicode utf-16-codecs}@anchor{53bd}
@subsubsection UTF-16 코덱


다음은 UTF-16 코덱 API입니다:

@geindex PyUnicode_DecodeUTF16 (C function)
@anchor{c-api/unicode c PyUnicode_DecodeUTF16}@anchor{5144}
@deffn {C 함수} @ref{5dc,,PyObject} *PyUnicode_DecodeUTF16 (const char *str, Py_ssize_t size, const char *errors, int *byteorder)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
UTF-16으로 인코딩된 버퍼 문자열에서 `size' 바이트를 디코딩하고 해당 유니코드 객체를 반환합니다. `errors'(@code{NULL}이 아니면)는 에러 처리를 정의합니다. 기본값은 “strict”입니다.

`byteorder'가 @code{NULL}이 아니면, 디코더는 지정된 바이트 순서를 사용하여 디코딩을 시작합니다:

@example
*byteorder == -1: 리틀 엔디안
*byteorder == 0:  네이티브 엔디안
*byteorder == 1:  빅 엔디안
@end example

@code{*byteorder}가 0이고, 입력 데이터의 처음 2바이트가 바이트 순서 표시(BOM)이면, 디코더는 이 바이트 순서로 전환되고 BOM은 결과 유니코드 문자열에 복사되지 않습니다. @code{*byteorder}가 @code{-1}이나 @code{1}이면 모든 바이트 순서 표시가 출력에 복사됩니다 (@code{\ufeff}나 @code{\ufffe} 문자가 됩니다).

완료 후, @code{*byteorder}는 입력 데이터의 끝에서 현재 바이트 순서로 설정됩니다.

`byteorder'가 @code{NULL}이면, 코덱은 네이티브 순서 모드로 시작합니다.

코덱에서 예외가 발생하면 @code{NULL}을 반환합니다.
@end deffn

@geindex PyUnicode_DecodeUTF16Stateful (C function)
@anchor{c-api/unicode c PyUnicode_DecodeUTF16Stateful}@anchor{5145}
@deffn {C 함수} @ref{5dc,,PyObject} *PyUnicode_DecodeUTF16Stateful (const char *str, Py_ssize_t size, const char *errors, int *byteorder, Py_ssize_t *consumed)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
`consumed'가 @code{NULL}이면, @ref{5144,,PyUnicode_DecodeUTF16()}처럼 동작합니다. `consumed'가 @code{NULL}이 아니면, @ref{5145,,PyUnicode_DecodeUTF16Stateful()} 은 후행 불완전 UTF-16 바이트 시퀀스(가령 홀수 바이트 수나 분할 서로게이트 쌍)를 에러로 처리하지 않습니다. 이러한 바이트는 디코딩되지 않으며 디코딩된 바이트 수는 `consumed'에 저장됩니다.
@end deffn

@geindex PyUnicode_AsUTF16String (C function)
@anchor{c-api/unicode c PyUnicode_AsUTF16String}@anchor{5137}
@deffn {C 함수} @ref{5dc,,PyObject} *PyUnicode_AsUTF16String (PyObject *unicode)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
네이티브 바이트 순서로 UTF-16 인코딩을 사용하여 파이썬 바이트 문자열을 반환합니다. 문자열은 항상 BOM 마크로 시작합니다. 에러 처리는 “strict”입니다. 코덱에서 예외가 발생하면 @code{NULL}을 반환합니다.
@end deffn

@node UTF-7 코덱,유니코드 이스케이프 코덱,UTF-16 코덱,내장 코덱
@anchor{c-api/unicode utf-7-codecs}@anchor{53be}
@subsubsection UTF-7 코덱


다음은 UTF-7 코덱 API입니다:

@geindex PyUnicode_DecodeUTF7 (C function)
@anchor{c-api/unicode c PyUnicode_DecodeUTF7}@anchor{5148}
@deffn {C 함수} @ref{5dc,,PyObject} *PyUnicode_DecodeUTF7 (const char *str, Py_ssize_t size, const char *errors)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
UTF-7로 인코딩된 문자열 `str'의 `size' 바이트를 디코딩하여 유니코드 객체를 만듭니다. 코덱에서 예외가 발생하면 @code{NULL}을 반환합니다.
@end deffn

@geindex PyUnicode_DecodeUTF7Stateful (C function)
@anchor{c-api/unicode c PyUnicode_DecodeUTF7Stateful}@anchor{5149}
@deffn {C 함수} @ref{5dc,,PyObject} *PyUnicode_DecodeUTF7Stateful (const char *str, Py_ssize_t size, const char *errors, Py_ssize_t *consumed)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
`consumed'가 @code{NULL}이면, @ref{5148,,PyUnicode_DecodeUTF7()}처럼 동작합니다. `consumed'가 @code{NULL}이 아니면, 후행 불완전한 UTF-7 base-64 섹션은 에러로 처리되지 않습니다. 이러한 바이트는 디코딩되지 않으며 디코딩된 바이트 수는 `consumed'에 저장됩니다.
@end deffn

@node 유니코드 이스케이프 코덱,원시 유니코드 이스케이프 코덱,UTF-7 코덱,내장 코덱
@anchor{c-api/unicode unicode-escape-codecs}@anchor{53bf}
@subsubsection 유니코드 이스케이프 코덱


다음은 “유니코드 이스케이프(Unicode Escape)” 코덱 API입니다:

@geindex PyUnicode_DecodeUnicodeEscape (C function)
@anchor{c-api/unicode c PyUnicode_DecodeUnicodeEscape}@anchor{514b}
@deffn {C 함수} @ref{5dc,,PyObject} *PyUnicode_DecodeUnicodeEscape (const char *str, Py_ssize_t size, const char *errors)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
유니코드 이스케이프 인코딩된 문자열 `str'의 `size' 바이트를 디코딩하여 유니코드 객체를 만듭니다. 코덱에서 예외가 발생하면 @code{NULL}을 반환합니다.
@end deffn

@geindex PyUnicode_AsUnicodeEscapeString (C function)
@anchor{c-api/unicode c PyUnicode_AsUnicodeEscapeString}@anchor{1394}
@deffn {C 함수} @ref{5dc,,PyObject} *PyUnicode_AsUnicodeEscapeString (PyObject *unicode)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
유니코드 이스케이프를 사용하여 유니코드 객체를 인코딩하고 결과를 bytes 객체로 반환합니다. 에러 처리는 “strict”입니다. 코덱에서 예외가 발생하면 @code{NULL}을 반환합니다.
@end deffn

@node 원시 유니코드 이스케이프 코덱,Latin-1 코덱,유니코드 이스케이프 코덱,내장 코덱
@anchor{c-api/unicode raw-unicode-escape-codecs}@anchor{53c0}
@subsubsection 원시 유니코드 이스케이프 코덱


다음은 “원시 유니코드 이스케이프(Raw Unicode Escape)” 코덱 API입니다:

@geindex PyUnicode_DecodeRawUnicodeEscape (C function)
@anchor{c-api/unicode c PyUnicode_DecodeRawUnicodeEscape}@anchor{5143}
@deffn {C 함수} @ref{5dc,,PyObject} *PyUnicode_DecodeRawUnicodeEscape (const char *str, Py_ssize_t size, const char *errors)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
원시 유니코드 이스케이프 인코딩된 문자열 `str'의 `size' 바이트를 디코딩하여 유니코드 객체를 만듭니다. 코덱에서 예외가 발생하면 @code{NULL}을 반환합니다.
@end deffn

@geindex PyUnicode_AsRawUnicodeEscapeString (C function)
@anchor{c-api/unicode c PyUnicode_AsRawUnicodeEscapeString}@anchor{1395}
@deffn {C 함수} @ref{5dc,,PyObject} *PyUnicode_AsRawUnicodeEscapeString (PyObject *unicode)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
원시 유니코드 이스케이프를 사용하여 유니코드 객체를 인코딩하고 결과를 bytes 객체로 반환합니다. 에러 처리는 “strict”입니다. 코덱에서 예외가 발생하면 @code{NULL}을 반환합니다.
@end deffn

@node Latin-1 코덱,ASCII 코덱,원시 유니코드 이스케이프 코덱,내장 코덱
@anchor{c-api/unicode latin-1-codecs}@anchor{53c1}
@subsubsection Latin-1 코덱


다음은 Latin-1 코덱 API입니다: Latin-1은 처음 256개의 유니코드 서수에 해당하며 인코딩 중에 코덱에서 이들만 허용됩니다.

@geindex PyUnicode_DecodeLatin1 (C function)
@anchor{c-api/unicode c PyUnicode_DecodeLatin1}@anchor{513f}
@deffn {C 함수} @ref{5dc,,PyObject} *PyUnicode_DecodeLatin1 (const char *str, Py_ssize_t size, const char *errors)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
Latin-1 인코딩된 문자열 `str'의 `size' 바이트를 디코딩하여 유니코드 객체를 만듭니다. 코덱에서 예외가 발생하면 @code{NULL}을 반환합니다.
@end deffn

@geindex PyUnicode_AsLatin1String (C function)
@anchor{c-api/unicode c PyUnicode_AsLatin1String}@anchor{1396}
@deffn {C 함수} @ref{5dc,,PyObject} *PyUnicode_AsLatin1String (PyObject *unicode)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
Latin-1을 사용하여 유니코드 객체를 인코딩하고 결과를 파이썬 bytes 객체로 반환합니다. 에러 처리는 “strict”입니다. 코덱에서 예외가 발생하면 @code{NULL}을 반환합니다.
@end deffn

@node ASCII 코덱,문자 맵 코덱,Latin-1 코덱,내장 코덱
@anchor{c-api/unicode ascii-codecs}@anchor{53c2}
@subsubsection ASCII 코덱


다음은 ASCII 코덱 API입니다. 7비트 ASCII 데이터만 허용됩니다. 다른 모든 코드는 에러를 생성합니다.

@geindex PyUnicode_DecodeASCII (C function)
@anchor{c-api/unicode c PyUnicode_DecodeASCII}@anchor{513b}
@deffn {C 함수} @ref{5dc,,PyObject} *PyUnicode_DecodeASCII (const char *str, Py_ssize_t size, const char *errors)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
ASCII 인코딩된 문자열 `str'의 `size' 바이트를 디코딩하여 유니코드 객체를 만듭니다. 코덱에서 예외가 발생하면 @code{NULL}을 반환합니다.
@end deffn

@geindex PyUnicode_AsASCIIString (C function)
@anchor{c-api/unicode c PyUnicode_AsASCIIString}@anchor{1397}
@deffn {C 함수} @ref{5dc,,PyObject} *PyUnicode_AsASCIIString (PyObject *unicode)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
ASCII를 사용하여 유니코드 객체를 인코딩하고 결과를 파이썬 bytes 객체로 반환합니다. 에러 처리는 “strict”입니다. 코덱에서 예외가 발생하면 @code{NULL}을 반환합니다.
@end deffn

@node 문자 맵 코덱,윈도우 용 MBCS 코덱,ASCII 코덱,내장 코덱
@anchor{c-api/unicode character-map-codecs}@anchor{53c3}
@subsubsection 문자 맵 코덱


이 코덱은 다양한 코덱을 구현하는 데 사용할 수 있다는 점에서 특별합니다 (실제로 @code{encodings} 패키지에 포함된 대부분의 표준 코덱을 얻기 위해 수행되었습니다). 코덱은 매핑을 사용하여 문자를 인코딩하고 디코딩합니다. 제공된 매핑 객체는 @ref{588,,__getitem__()} 매핑 인터페이스를 지원해야 합니다; 딕셔너리와 시퀀스가 잘 작동합니다.

다음은 매핑 코덱 API입니다:

@geindex PyUnicode_DecodeCharmap (C function)
@anchor{c-api/unicode c PyUnicode_DecodeCharmap}@anchor{513c}
@deffn {C 함수} @ref{5dc,,PyObject} *PyUnicode_DecodeCharmap (const char *str, Py_ssize_t length, PyObject *mapping, const char *errors)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
주어진 `mapping' 객체를 사용하여 인코딩된 문자열 `str'의 `size' 바이트를 디코딩하여 유니코드 객체를 만듭니다. 코덱에서 예외가 발생하면 @code{NULL}을 반환합니다.

`mapping'이 @code{NULL}이면, Latin-1 디코딩이 적용됩니다. 그렇지 않으면 `mapping'은 바이트 서수(0에서 255 사이의 정수)를 유니코드 문자열, 정수(유니코드 서수로 해석됩니다) 또는 @code{None}으로 매핑해야합니다. 매핑되지 않은 데이터 바이트(@code{None}, @code{0xFFFE} 또는 @code{'\ufffe'}로 매핑되는 것뿐만 아니라, @ref{23e5,,LookupError}를 유발하는 것)은 정의되지 않은 매핑으로 처리되어 에러를 발생시킵니다.
@end deffn

@geindex PyUnicode_AsCharmapString (C function)
@anchor{c-api/unicode c PyUnicode_AsCharmapString}@anchor{5135}
@deffn {C 함수} @ref{5dc,,PyObject} *PyUnicode_AsCharmapString (PyObject *unicode, PyObject *mapping)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
주어진 `mapping' 객체를 사용하여 유니코드 객체를 인코딩하고 결과를 bytes 객체로 반환합니다. 에러 처리는 “strict”입니다. 코덱에서 예외가 발생하면 @code{NULL}을 반환합니다.

`mapping' 객체는 유니코드 서수 정수를 bytes 객체, 0에서 255 사이의 정수 또는 @code{None}으로 매핑해야 합니다. @code{None}에 매핑되는 것뿐만 아니라 매핑되지 않은 문자 서수(@ref{23e5,,LookupError}를 유발하는 것)는 “정의되지 않은 매핑”으로 처리되어 에러가 발생합니다.
@end deffn

다음 코덱 API는 유니코드를 유니코드로 매핑한다는 점에서 특별합니다.

@geindex PyUnicode_Translate (C function)
@anchor{c-api/unicode c PyUnicode_Translate}@anchor{5159}
@deffn {C 함수} @ref{5dc,,PyObject} *PyUnicode_Translate (PyObject *unicode, PyObject *table, const char *errors)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
문자 매핑 테이블을 적용하여 문자열을 변환하고 결과 유니코드 객체를 반환합니다. 코덱에서 예외가 발생하면 @code{NULL}을 반환합니다.

매핑 테이블은 유니코드 서수 정수를 유니코드 서수 정수나 @code{None}(문자가 삭제되도록 합니다)에 매핑해야 합니다.

매핑 테이블은 @ref{588,,__getitem__()} 인터페이스 만 제공하면 됩니다; 딕셔너리와 시퀀스가 잘 작동합니다. 매핑되지 않은 문자 서수(@ref{23e5,,LookupError}를 유발하는 것)는 건드리지 않고 그대로 복사됩니다.

`errors'는 코덱에서의 일반적인 의미입니다. 기본 에러 처리를 사용함을 나타내는 @code{NULL}일 수 있습니다.
@end deffn

@node 윈도우 용 MBCS 코덱,,문자 맵 코덱,내장 코덱
@anchor{c-api/unicode mbcs-codecs-for-windows}@anchor{53c4}
@subsubsection 윈도우 용 MBCS 코덱


다음은 MBCS 코덱 API입니다. 현재 윈도우에서만 사용할 수 있으며 Win32 MBCS 변환기를 사용하여 변환을 구현합니다. MBCS(또는 DBCS)는 단지 하나가 아니라 인코딩 클래스임에 유의하십시오. 대상 인코딩은 코덱을 실행하는 기계의 사용자 설정에 의해 정의됩니다.

@geindex PyUnicode_DecodeMBCS (C function)
@anchor{c-api/unicode c PyUnicode_DecodeMBCS}@anchor{5141}
@deffn {C 함수} @ref{5dc,,PyObject} *PyUnicode_DecodeMBCS (const char *str, Py_ssize_t size, const char *errors)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI} on Windows 버전 3.7 이후로.'
MBCS 인코딩된 문자열 `str'의 `size' 바이트를 디코딩하여 유니코드 객체를 만듭니다. 코덱에서 예외가 발생하면 @code{NULL}을 반환합니다.
@end deffn

@geindex PyUnicode_DecodeMBCSStateful (C function)
@anchor{c-api/unicode c PyUnicode_DecodeMBCSStateful}@anchor{5142}
@deffn {C 함수} @ref{5dc,,PyObject} *PyUnicode_DecodeMBCSStateful (const char *str, Py_ssize_t size, const char *errors, Py_ssize_t *consumed)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI} on Windows 버전 3.7 이후로.'
`consumed'가 @code{NULL}이면, @ref{5141,,PyUnicode_DecodeMBCS()}처럼 동작합니다. `consumed'가 @code{NULL}이 아니면, @ref{5142,,PyUnicode_DecodeMBCSStateful()} 은 후행 선행(lead) 바이트를 디코딩하지 않고 디코딩된 바이트 수가 `consumed'에 저장됩니다.
@end deffn

@geindex PyUnicode_DecodeCodePageStateful (C function)
@anchor{c-api/unicode c PyUnicode_DecodeCodePageStateful}@anchor{513d}
@deffn {C 함수} @ref{5dc,,PyObject} *PyUnicode_DecodeCodePageStateful (int code_page, const char *str, Py_ssize_t size, const char *errors, Py_ssize_t *consumed)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI} on Windows 버전 3.7 이후로.'
Similar to @ref{5142,,PyUnicode_DecodeMBCSStateful()}, except uses the code page
specified by `code_page'.
@end deffn

@geindex PyUnicode_AsMBCSString (C function)
@anchor{c-api/unicode c PyUnicode_AsMBCSString}@anchor{1398}
@deffn {C 함수} @ref{5dc,,PyObject} *PyUnicode_AsMBCSString (PyObject *unicode)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI} on Windows 버전 3.7 이후로.'
MBCS를 사용하여 유니코드 객체를 인코딩하고 결과를 파이썬 bytes 객체로 반환합니다. 에러 처리는 “strict”입니다. 코덱에서 예외가 발생하면 @code{NULL}을 반환합니다.
@end deffn

@geindex PyUnicode_EncodeCodePage (C function)
@anchor{c-api/unicode c PyUnicode_EncodeCodePage}@anchor{1399}
@deffn {C 함수} @ref{5dc,,PyObject} *PyUnicode_EncodeCodePage (int code_page, PyObject *unicode, const char *errors)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI} on Windows 버전 3.7 이후로.'
지정된 코드 페이지를 사용하여 유니코드 객체를 인코딩하고 파이썬 bytes 객체를 반환합니다. 코덱에서 예외가 발생하면 @code{NULL}을 반환합니다. @code{CP_ACP} 코드 페이지를 사용하여 MBCS 인코더를 얻습니다.


Added in version 3.3.

@end deffn

@node 메서드와 슬롯 함수,PyUnicodeWriter,내장 코덱,유니코드 객체와 코덱
@anchor{c-api/unicode methods-and-slot-functions}@anchor{53c5}@anchor{c-api/unicode unicodemethodsandslots}@anchor{53c6}
@subsubsection 메서드와 슬롯 함수


다음 API는 입력의 유니코드 객체와 문자열을 (설명에서 문자열이라고 하겠습니다) 처리할 수 있으며 적절하게 유니코드 객체나 정수를 반환합니다.

예외가 발생하면 모두 @code{NULL}이나 @code{-1}을 반환합니다.

@geindex PyUnicode_Concat (C function)
@anchor{c-api/unicode c PyUnicode_Concat}@anchor{13a6}
@deffn {C 함수} @ref{5dc,,PyObject} *PyUnicode_Concat (PyObject *left, PyObject *right)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
두 문자열을 이어붙여 하나의 새로운 유니코드 문자열을 제공합니다.
@end deffn

@geindex PyUnicode_Split (C function)
@anchor{c-api/unicode c PyUnicode_Split}@anchor{5157}
@deffn {C 함수} @ref{5dc,,PyObject} *PyUnicode_Split (PyObject *unicode, PyObject *sep, Py_ssize_t maxsplit)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
문자열을 분할하여 유니코드 문자열 리스트를 제공합니다. `sep'이 @code{NULL}이면, 모든 공백 부분 문자열에서 분할이 수행됩니다. 그렇지 않으면, 주어진 구분자에서 분할이 일어납니다. 최대 `maxsplit' 분할이 수행됩니다. 음수이면, 제한이 설정되지 않습니다. 구분자는 결과 리스트에 포함되지 않습니다.

에러 시, 예외를 설정하고 @code{NULL}을 반환합니다.

Equivalent to @ref{10a9,,str.split()}.
@end deffn

@geindex PyUnicode_RSplit (C function)
@anchor{c-api/unicode c PyUnicode_RSplit}@anchor{1899}
@deffn {C 함수} @ref{5dc,,PyObject} *PyUnicode_RSplit (PyObject *unicode, PyObject *sep, Py_ssize_t maxsplit)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
Similar to @ref{5157,,PyUnicode_Split()}, but splitting will be done beginning
at the end of the string.

에러 시, 예외를 설정하고 @code{NULL}을 반환합니다.

Equivalent to @ref{145a,,str.rsplit()}.
@end deffn

@geindex PyUnicode_Splitlines (C function)
@anchor{c-api/unicode c PyUnicode_Splitlines}@anchor{5158}
@deffn {C 함수} @ref{5dc,,PyObject} *PyUnicode_Splitlines (PyObject *unicode, int keepends)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
줄 바꿈에서 유니코드 문자열을 분할하여, 유니코드 문자열 리스트를 반환합니다. CRLF는 하나의 줄 바꿈으로 간주합니다. `keepends'가 @code{0}이면, 결과 문자열에 줄 바꿈 문자가 포함되지 않습니다.
@end deffn

@geindex PyUnicode_Partition (C function)
@anchor{c-api/unicode c PyUnicode_Partition}@anchor{189a}
@deffn {C 함수} @ref{5dc,,PyObject} *PyUnicode_Partition (PyObject *unicode, PyObject *sep)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
Split a Unicode string at the first occurrence of `sep', and return
a 3-tuple containing the part before the separator, the separator itself,
and the part after the separator. If the separator is not found,
return a 3-tuple containing the string itself, followed by two empty strings.

`sep' must not be empty.

에러 시, 예외를 설정하고 @code{NULL}을 반환합니다.

Equivalent to @ref{10aa,,str.partition()}.
@end deffn

@geindex PyUnicode_RPartition (C function)
@anchor{c-api/unicode c PyUnicode_RPartition}@anchor{189b}
@deffn {C 함수} @ref{5dc,,PyObject} *PyUnicode_RPartition (PyObject *unicode, PyObject *sep)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
Similar to @ref{189a,,PyUnicode_Partition()}, but split a Unicode string at the
last occurrence of `sep'. If the separator is not found, return a 3-tuple
containing two empty strings, followed by the string itself.

`sep' must not be empty.

에러 시, 예외를 설정하고 @code{NULL}을 반환합니다.

Equivalent to @ref{145d,,str.rpartition()}.
@end deffn

@geindex PyUnicode_Join (C function)
@anchor{c-api/unicode c PyUnicode_Join}@anchor{13a7}
@deffn {C 함수} @ref{5dc,,PyObject} *PyUnicode_Join (PyObject *separator, PyObject *seq)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
주어진 `separator'를 사용하여 문자열 시퀀스를 연결하고 결과 유니코드 문자열을 반환합니다.
@end deffn

@geindex PyUnicode_Tailmatch (C function)
@anchor{c-api/unicode c PyUnicode_Tailmatch}@anchor{ab5}
@deffn {C 함수} @ref{c54,,Py_ssize_t} PyUnicode_Tailmatch (PyObject *unicode, PyObject *substr, Py_ssize_t start, Py_ssize_t end, int direction)
` Part of the @ref{774,,안정 ABI}.'
`substr'이 주어진 꼬리 끝에서 (`direction' == @code{-1}은 접두사 일치를 수행함을 의미하고, `direction' == @code{1}은 접미사 일치를 의미합니다) @code{unicode[start:end]}와 일치하면 @code{1}을 반환합니다, 그렇지 않으면 @code{0}을 반환합니다. 에러가 발생하면 @code{-1}을 반환합니다.
@end deffn

@geindex PyUnicode_Find (C function)
@anchor{c-api/unicode c PyUnicode_Find}@anchor{514c}
@deffn {C 함수} @ref{c54,,Py_ssize_t} PyUnicode_Find (PyObject *unicode, PyObject *substr, Py_ssize_t start, Py_ssize_t end, int direction)
` Part of the @ref{774,,안정 ABI}.'
주어진 `direction'을 사용하여 (`direction' == @code{1}은 정방향 검색을 의미하고, `direction' == @code{-1}은 역방향 검색을 의미합니다) @code{unicode[start:end]}에서 `substr'의 첫 번째 위치를 반환합니다. 반환 값은 첫 번째 일치의 인덱스입니다; @code{-1} 값은 일치하는 항목이 없음을 나타내고, @code{-2}는 에러가 발생했고 예외가 설정되었음을 나타냅니다.
@end deffn

@geindex PyUnicode_FindChar (C function)
@anchor{c-api/unicode c PyUnicode_FindChar}@anchor{ab6}
@deffn {C 함수} @ref{c54,,Py_ssize_t} PyUnicode_FindChar (PyObject *unicode, Py_UCS4 ch, Py_ssize_t start, Py_ssize_t end, int direction)
` Part of the @ref{774,,안정 ABI} 버전 3.7 이후로.'
주어진 `direction'을 사용하여 (`direction' == @code{1}은 정방향 검색을 의미하고, `direction' == @code{-1}은 역방향 검색을 의미합니다) @code{unicode[start:end]}에서 문자 `ch'의 첫 번째 위치를 반환합니다. 반환 값은 첫 번째 일치의 인덱스입니다; @code{-1} 값은 일치하는 항목이 없음을 나타내고, @code{-2}는 에러가 발생했고 예외가 설정되었음을 나타냅니다.


Added in version 3.3.



버전 3.7에서 변경: `start'와 `end'는 이제 @code{unicode[start:end]}처럼 작동하도록 조정됩니다.

@end deffn

@geindex PyUnicode_Count (C function)
@anchor{c-api/unicode c PyUnicode_Count}@anchor{513a}
@deffn {C 함수} @ref{c54,,Py_ssize_t} PyUnicode_Count (PyObject *unicode, PyObject *substr, Py_ssize_t start, Py_ssize_t end)
` Part of the @ref{774,,안정 ABI}.'
@code{unicode[start:end]}에서 `substr'이 겹치지 않게 등장하는 횟수를 반환합니다. 에러가 발생하면 @code{-1}을 반환합니다.
@end deffn

@geindex PyUnicode_Replace (C function)
@anchor{c-api/unicode c PyUnicode_Replace}@anchor{5154}
@deffn {C 함수} @ref{5dc,,PyObject} *PyUnicode_Replace (PyObject *unicode, PyObject *substr, PyObject *replstr, Py_ssize_t maxcount)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
`unicode'에서 `substr'의 최대 `maxcount' 등장을 `replstr'로 바꾸고 결과 유니코드 객체를 반환합니다. `maxcount' == @code{-1}은 모든 등장을 교체함을 의미합니다.
@end deffn

@geindex PyUnicode_Compare (C function)
@anchor{c-api/unicode c PyUnicode_Compare}@anchor{ab4}
@deffn {C 함수} int PyUnicode_Compare (PyObject *left, PyObject *right)
` Part of the @ref{774,,안정 ABI}.'
두 문자열을 비교하고 각각 작음, 같음, 큼에 대해 @code{-1}, @code{0}, @code{1}을 반환합니다.

이 함수는 실패 시 @code{-1}을 반환하므로, 에러를 확인하기 위해 @ref{1cac,,PyErr_Occurred()}를 호출해야 합니다.


@subsubheading 더 보기


The @ref{3b2,,PyUnicode_Equal()} function.

@end deffn

@geindex PyUnicode_Equal (C function)
@anchor{c-api/unicode c PyUnicode_Equal}@anchor{3b2}
@deffn {C 함수} int PyUnicode_Equal (PyObject *a, PyObject *b)
` Part of the @ref{774,,안정 ABI} 버전 3.14 이후로.'
Test if two strings are equal:


@itemize *

@item 
Return @code{1} if `a' is equal to `b'.

@item 
Return @code{0} if `a' is not equal to `b'.

@item 
Set a @ref{198,,TypeError} exception and return @code{-1} if `a' or `b' is not a
@ref{169,,str} object.
@end itemize

The function always succeeds if `a' and `b' are @ref{169,,str} objects.

The function works for @ref{169,,str} subclasses, but does not honor custom
@code{__eq__()} method.


@subsubheading 더 보기


The @ref{ab4,,PyUnicode_Compare()} function.



Added in version 3.14.

@end deffn

@geindex PyUnicode_EqualToUTF8AndSize (C function)
@anchor{c-api/unicode c PyUnicode_EqualToUTF8AndSize}@anchor{617}
@deffn {C 함수} int PyUnicode_EqualToUTF8AndSize (PyObject *unicode, const char *string, Py_ssize_t size)
` Part of the @ref{774,,안정 ABI} 버전 3.13 이후로.'
Compare a Unicode object with a char buffer which is interpreted as
being UTF-8 or ASCII encoded and return true (@code{1}) if they are equal,
or false (@code{0}) otherwise.
If the Unicode object contains surrogate code points
(@code{U+D800} - @code{U+DFFF}) or the C string is not valid UTF-8,
false (@code{0}) is returned.

이 함수는 예외를 발생시키지 않습니다.


Added in version 3.13.

@end deffn

@geindex PyUnicode_EqualToUTF8 (C function)
@anchor{c-api/unicode c PyUnicode_EqualToUTF8}@anchor{618}
@deffn {C 함수} int PyUnicode_EqualToUTF8 (PyObject *unicode, const char *string)
` Part of the @ref{774,,안정 ABI} 버전 3.13 이후로.'
@ref{617,,PyUnicode_EqualToUTF8AndSize()}와 유사하지만, @code{strlen()}을 사용하여 `string' 길이를 계산합니다. 유니코드 객체가 널 문자를 포함하면, 거짓(@code{0})을 반환합니다.


Added in version 3.13.

@end deffn

@geindex PyUnicode_CompareWithASCIIString (C function)
@anchor{c-api/unicode c PyUnicode_CompareWithASCIIString}@anchor{146c}
@deffn {C 함수} int PyUnicode_CompareWithASCIIString (PyObject *unicode, const char *string)
` Part of the @ref{774,,안정 ABI}.'
유니코드 객체 `unicode'를 `string'과 비교하고 각각 작음, 같음, 큼에 대해 @code{-1}, @code{0}, @code{1}을 반환합니다. ASCII로 인코딩된 문자열만 전달하는 것이 가장 좋지만, 비 ASCII 문자가 포함되면 함수는 입력 문자열을 ISO-8859-1로 해석합니다.

이 함수는 예외를 발생시키지 않습니다.
@end deffn

@geindex PyUnicode_RichCompare (C function)
@anchor{c-api/unicode c PyUnicode_RichCompare}@anchor{5156}
@deffn {C 함수} @ref{5dc,,PyObject} *PyUnicode_RichCompare (PyObject *left, PyObject *right, int op)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
두 유니코드 문자열을 풍부한 비교(rich comparison) 하고 다음 중 하나를 반환합니다:


@itemize *

@item 
예외가 발생하면 @code{NULL}

@item 
성공적인 비교는 @ref{5354,,Py_True}나 @ref{5353,,Py_False}

@item 
형 조합을 알 수 없으면 @ref{52c5,,Py_NotImplemented}
@end itemize

`op'에 가능한 값은 @ref{52cc,,Py_GT}, @ref{52cd,,Py_GE}, @ref{52ca,,Py_EQ}, @ref{52cb,,Py_NE}, @ref{52c8,,Py_LT} 및 @ref{52c9,,Py_LE}입니다.
@end deffn

@geindex PyUnicode_Format (C function)
@anchor{c-api/unicode c PyUnicode_Format}@anchor{514d}
@deffn {C 함수} @ref{5dc,,PyObject} *PyUnicode_Format (PyObject *format, PyObject *args)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
`format'과 `args'에서 새 문자열 객체를 반환합니다; 이것은 @code{format % args}와 유사합니다.
@end deffn

@geindex PyUnicode_Contains (C function)
@anchor{c-api/unicode c PyUnicode_Contains}@anchor{5139}
@deffn {C 함수} int PyUnicode_Contains (PyObject *unicode, PyObject *substr)
` Part of the @ref{774,,안정 ABI}.'
`substr'가 `unicode'에 포함되어 있는지 확인하고 그에 따라 참이나 거짓을 반환합니다.

`substr'는 단일 요소 유니코드 문자열로 강제 변환해야 합니다. 에러가 있으면 @code{-1}이 반환됩니다.
@end deffn

@geindex PyUnicode_InternInPlace (C function)
@anchor{c-api/unicode c PyUnicode_InternInPlace}@anchor{aae}
@deffn {C 함수} void PyUnicode_InternInPlace (PyObject **p_unicode)
` Part of the @ref{774,,안정 ABI}.'
인자 *@ref{aae,,p_unicode}를 제자리에서 인턴(intern) 합니다.  인자는 파이썬 유니코드 문자열을 가리키는 포인터 변수의 주소여야 합니다. *p_unicode와 같은 기존 인턴 문자열이 있으면, *p_unicode를 그것으로 설정합니다 (이전 문자열 객체에 대한 참조를 해제하고 인턴 된 문자열 객체에 대한 새로운 @ref{5df,,강한 참조}를 만듭니다), 그렇지 않으면 *p_unicode만 홀로 두고 인턴 합니다.

(설명: 참조에 대해 많은 이야기가 있지만, 이 함수를 참조 중립이라고 생각하십시오. 전달하는 객체의 소유권을 반드시 가져야 합니다; 호출 후 더는 전달된 참조를 소유하지 않지만, 결과를 새로 소유하게 됩니다.)

This function never raises an exception.
On error, it leaves its argument unchanged without interning it.

Instances of subclasses of @ref{169,,str} may not be interned, that is,
@ref{539a,,PyUnicode_CheckExact}(*@ref{aae,,p_unicode}) must be true. If it is not,
then – as with any other error – the argument is left unchanged.

Note that interned strings are not “immortal”.
You must keep a reference to the result to benefit from interning.
@end deffn

@geindex PyUnicode_InternFromString (C function)
@anchor{c-api/unicode c PyUnicode_InternFromString}@anchor{198d}
@deffn {C 함수} @ref{5dc,,PyObject} *PyUnicode_InternFromString (const char *str)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
@ref{5151,,PyUnicode_FromString()}과 @ref{aae,,PyUnicode_InternInPlace()}의 조합, 정적 할당된 문자열을 위한 것입니다.

인턴(intern) 된 새 유니코드 문자열 객체나, 같은 값을 가진 이전에 인턴 된 문자열 객체에 대한 새 (“소유된”) 참조를 반환합니다.

Python may keep a reference to the result, or make it @ref{290,,immortal},
preventing it from being garbage-collected promptly.
For interning an unbounded number of different strings, such as ones coming
from user input, prefer calling @ref{5151,,PyUnicode_FromString()} and
@ref{aae,,PyUnicode_InternInPlace()} directly.
@end deffn

@geindex PyUnicode_CHECK_INTERNED (C function)
@anchor{c-api/unicode c PyUnicode_CHECK_INTERNED}@anchor{53c7}
@deffn {C 함수} unsigned int PyUnicode_CHECK_INTERNED (PyObject *str)

Return a non-zero value if `str' is interned, zero if not.
The `str' argument must be a string; this is not checked.
This function always succeeds.

`CPython 구현 상세:' A non-zero return value may carry additional information
about `how' the string is interned.
The meaning of such non-zero values, as well as each specific string’s
intern-related details, may change between CPython versions.
@end deffn

@node PyUnicodeWriter,Deprecated API<2>,메서드와 슬롯 함수,유니코드 객체와 코덱
@anchor{c-api/unicode pyunicodewriter}@anchor{53c8}
@subsubsection PyUnicodeWriter


The @ref{3b3,,PyUnicodeWriter} API can be used to create a Python @ref{169,,str}
object.


Added in version 3.14.


@geindex PyUnicodeWriter (C type)
@anchor{c-api/unicode c PyUnicodeWriter}@anchor{3b3}
@deffn {C 자료형} type PyUnicodeWriter

A Unicode writer instance.

The instance must be destroyed by @ref{3b7,,PyUnicodeWriter_Finish()} on
success, or @ref{3b6,,PyUnicodeWriter_Discard()} on error.
@end deffn

@geindex PyUnicodeWriter_Create (C function)
@anchor{c-api/unicode c PyUnicodeWriter_Create}@anchor{3b4}
@deffn {C 함수} @ref{3b3,,PyUnicodeWriter} *PyUnicodeWriter_Create (Py_ssize_t length)

Create a Unicode writer instance.

`length' must be greater than or equal to @code{0}.

If `length' is greater than @code{0}, preallocate an internal buffer of
`length' characters.

Set an exception and return @code{NULL} on error.
@end deffn

@geindex PyUnicodeWriter_Finish (C function)
@anchor{c-api/unicode c PyUnicodeWriter_Finish}@anchor{3b7}
@deffn {C 함수} @ref{5dc,,PyObject} *PyUnicodeWriter_Finish (PyUnicodeWriter *writer)

Return the final Python @ref{169,,str} object and destroy the writer instance.

Set an exception and return @code{NULL} on error.

The writer instance is invalid after this call.
@end deffn

@geindex PyUnicodeWriter_Discard (C function)
@anchor{c-api/unicode c PyUnicodeWriter_Discard}@anchor{3b6}
@deffn {C 함수} void PyUnicodeWriter_Discard (PyUnicodeWriter *writer)

Discard the internal Unicode buffer and destroy the writer instance.

If `writer' is @code{NULL}, no operation is performed.

The writer instance is invalid after this call.
@end deffn

@geindex PyUnicodeWriter_WriteChar (C function)
@anchor{c-api/unicode c PyUnicodeWriter_WriteChar}@anchor{3ba}
@deffn {C 함수} int PyUnicodeWriter_WriteChar (PyUnicodeWriter *writer, Py_UCS4 ch)

Write the single Unicode character `ch' into `writer'.

On success, return @code{0}.
On error, set an exception, leave the writer unchanged, and return @code{-1}.
@end deffn

@geindex PyUnicodeWriter_WriteUTF8 (C function)
@anchor{c-api/unicode c PyUnicodeWriter_WriteUTF8}@anchor{3bf}
@deffn {C 함수} int PyUnicodeWriter_WriteUTF8 (PyUnicodeWriter *writer, const char *str, Py_ssize_t size)

Decode the string `str' from UTF-8 in strict mode and write the output into `writer'.

`size' is the string length in bytes. If `size' is equal to @code{-1}, call
@code{strlen(str)} to get the string length.

On success, return @code{0}.
On error, set an exception, leave the writer unchanged, and return @code{-1}.

See also @ref{3b5,,PyUnicodeWriter_DecodeUTF8Stateful()}.
@end deffn

@geindex PyUnicodeWriter_WriteASCII (C function)
@anchor{c-api/unicode c PyUnicodeWriter_WriteASCII}@anchor{3b9}
@deffn {C 함수} int PyUnicodeWriter_WriteASCII (PyUnicodeWriter *writer, const char *str, Py_ssize_t size)

Write the ASCII string `str' into `writer'.

`size' is the string length in bytes. If `size' is equal to @code{-1}, call
@code{strlen(str)} to get the string length.

`str' must only contain ASCII characters. The behavior is undefined if
`str' contains non-ASCII characters.

On success, return @code{0}.
On error, set an exception, leave the writer unchanged, and return @code{-1}.
@end deffn

@geindex PyUnicodeWriter_WriteWideChar (C function)
@anchor{c-api/unicode c PyUnicodeWriter_WriteWideChar}@anchor{3c0}
@deffn {C 함수} int PyUnicodeWriter_WriteWideChar (PyUnicodeWriter *writer, const wchar_t *str, Py_ssize_t size)

Write the wide string `str' into `writer'.

`size' is a number of wide characters. If `size' is equal to @code{-1}, call
@code{wcslen(str)} to get the string length.

On success, return @code{0}.
On error, set an exception, leave the writer unchanged, and return @code{-1}.
@end deffn

@geindex PyUnicodeWriter_WriteUCS4 (C function)
@anchor{c-api/unicode c PyUnicodeWriter_WriteUCS4}@anchor{3be}
@deffn {C 함수} int PyUnicodeWriter_WriteUCS4 (PyUnicodeWriter *writer, Py_UCS4 *str, Py_ssize_t size)

Writer the UCS4 string `str' into `writer'.

`size' is a number of UCS4 characters.

On success, return @code{0}.
On error, set an exception, leave the writer unchanged, and return @code{-1}.
@end deffn

@geindex PyUnicodeWriter_WriteStr (C function)
@anchor{c-api/unicode c PyUnicodeWriter_WriteStr}@anchor{3bc}
@deffn {C 함수} int PyUnicodeWriter_WriteStr (PyUnicodeWriter *writer, PyObject *obj)

Call @ref{122f,,PyObject_Str()} on `obj' and write the output into `writer'.

On success, return @code{0}.
On error, set an exception, leave the writer unchanged, and return @code{-1}.
@end deffn

@geindex PyUnicodeWriter_WriteRepr (C function)
@anchor{c-api/unicode c PyUnicodeWriter_WriteRepr}@anchor{3bb}
@deffn {C 함수} int PyUnicodeWriter_WriteRepr (PyUnicodeWriter *writer, PyObject *obj)

Call @ref{122e,,PyObject_Repr()} on `obj' and write the output into `writer'.

If `obj' is @code{NULL}, write the string @code{"<NULL>"} into `writer'.

On success, return @code{0}.
On error, set an exception, leave the writer unchanged, and return @code{-1}.


버전 3.14.4에서 변경: Added support for @code{NULL}.

@end deffn

@geindex PyUnicodeWriter_WriteSubstring (C function)
@anchor{c-api/unicode c PyUnicodeWriter_WriteSubstring}@anchor{3bd}
@deffn {C 함수} int PyUnicodeWriter_WriteSubstring (PyUnicodeWriter *writer, PyObject *str, Py_ssize_t start, Py_ssize_t end)

Write the substring @code{str[start:end]} into `writer'.

`str' must be Python @ref{169,,str} object. `start' must be greater than or
equal to 0, and less than or equal to `end'. `end' must be less than or
equal to `str' length.

On success, return @code{0}.
On error, set an exception, leave the writer unchanged, and return @code{-1}.
@end deffn

@geindex PyUnicodeWriter_Format (C function)
@anchor{c-api/unicode c PyUnicodeWriter_Format}@anchor{3b8}
@deffn {C 함수} int PyUnicodeWriter_Format (PyUnicodeWriter *writer, const char *format, ...)

Similar to @ref{629,,PyUnicode_FromFormat()}, but write the output directly into `writer'.

On success, return @code{0}.
On error, set an exception, leave the writer unchanged, and return @code{-1}.
@end deffn

@geindex PyUnicodeWriter_DecodeUTF8Stateful (C function)
@anchor{c-api/unicode c PyUnicodeWriter_DecodeUTF8Stateful}@anchor{3b5}
@deffn {C 함수} int PyUnicodeWriter_DecodeUTF8Stateful (PyUnicodeWriter *writer, const char *string, Py_ssize_t length, const char *errors, Py_ssize_t *consumed)

Decode the string `str' from UTF-8 with `errors' error handler and write the
output into `writer'.

`size' is the string length in bytes. If `size' is equal to @code{-1}, call
@code{strlen(str)} to get the string length.

`errors' is an @ref{1b6d,,error handler} name, such as
@code{"replace"}. If `errors' is @code{NULL}, use the strict error handler.

If `consumed' is not @code{NULL}, set `*consumed' to the number of decoded
bytes on success.
If `consumed' is @code{NULL}, treat trailing incomplete UTF-8 byte sequences
as an error.

On success, return @code{0}.
On error, set an exception, leave the writer unchanged, and return @code{-1}.

See also @ref{3bf,,PyUnicodeWriter_WriteUTF8()}.
@end deffn

@node Deprecated API<2>,,PyUnicodeWriter,유니코드 객체와 코덱
@anchor{c-api/unicode deprecated-api}@anchor{53c9}
@subsubsection Deprecated API


The following API is deprecated.

@geindex Py_UNICODE (C type)
@anchor{c-api/unicode c Py_UNICODE}@anchor{3e0}
@deffn {C 자료형} type Py_UNICODE

This is a typedef of @code{wchar_t}, which is a 16-bit type or 32-bit type
depending on the platform.
Please use @code{wchar_t} directly instead.


버전 3.3에서 변경: 이전 버전에서, 이것은 빌드 시 파이썬의 “내로우(narrow)”나 “와이드(wide)” 유니코드 버전 중 어느 것을 선택했는지에 따라 16비트 형이나 32비트 형이었습니다.



Deprecated since version 3.13, will be removed in version 3.15.

@end deffn

@geindex PyUnicode_READY (C function)
@anchor{c-api/unicode c PyUnicode_READY}@anchor{434}
@deffn {C 함수} int PyUnicode_READY (PyObject *unicode)

Do nothing and return @code{0}.
This API is kept only for backward compatibility, but there are no plans
to remove it.


Added in version 3.3.



버전 3.10부터 폐지됨: This API does nothing since Python 3.12.
Previously, this needed to be called for each string created using
the old API (@code{PyUnicode_FromUnicode()} or similar).

@end deffn

@geindex PyUnicode_IS_READY (C function)
@anchor{c-api/unicode c PyUnicode_IS_READY}@anchor{53ca}
@deffn {C 함수} unsigned int PyUnicode_IS_READY (PyObject *unicode)

Do nothing and return @code{1}.
This API is kept only for backward compatibility, but there are no plans
to remove it.


Added in version 3.3.



버전 3.14부터 폐지됨: This API does nothing since Python 3.12.
Previously, this could be called to check if
@ref{434,,PyUnicode_READY()} is necessary.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 튜플 객체,구조체 시퀀스 객체,유니코드 객체와 코덱,시퀀스 객체
@anchor{c-api/tuple doc}@anchor{53cb}@anchor{c-api/tuple translation-repo}@anchor{53cc}@anchor{c-api/tuple tuple-objects}@anchor{53cd}@anchor{c-api/tuple tupleobjects}@anchor{53ce}
@subsubsection 튜플 객체


@geindex 객체;튜플

@geindex PyTupleObject (C type)
@anchor{c-api/tuple c PyTupleObject}@anchor{5263}
@deffn {C 자료형} type PyTupleObject

이 @ref{5dc,,PyObject}의 서브 형은 파이썬 튜플 객체를 나타냅니다.
@end deffn

@geindex PyTuple_Type (C var)
@anchor{c-api/tuple c PyTuple_Type}@anchor{5118}
@deffn {C 변수} @ref{c9b,,PyTypeObject} PyTuple_Type
` Part of the @ref{774,,안정 ABI}.'
이 @ref{c9b,,PyTypeObject} 인스턴스는 파이썬 튜플 형을 나타냅니다. 파이썬 계층의 @ref{610,,tuple}과 같은 객체입니다.
@end deffn

@geindex PyTuple_Check (C function)
@anchor{c-api/tuple c PyTuple_Check}@anchor{53cf}
@deffn {C 함수} int PyTuple_Check (PyObject *p)

`p'가 튜플 객체이거나 튜플 형의 서브 형의 인스턴스면 참을 돌려줍니다. 이 함수는 항상 성공합니다.
@end deffn

@geindex PyTuple_CheckExact (C function)
@anchor{c-api/tuple c PyTuple_CheckExact}@anchor{53d0}
@deffn {C 함수} int PyTuple_CheckExact (PyObject *p)

`p'가 튜플 객체이지만, 튜플 형의 서브 형의 인스턴스는 아니면 참을 돌려줍니다. 이 함수는 항상 성공합니다.
@end deffn

@geindex PyTuple_New (C function)
@anchor{c-api/tuple c PyTuple_New}@anchor{63c}
@deffn {C 함수} @ref{5dc,,PyObject} *PyTuple_New (Py_ssize_t len)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
크기 `len' 인 튜플 객체나, 실패 시 예외를 설정하고 @code{NULL}을 반환합니다.
@end deffn

@geindex PyTuple_Pack (C function)
@anchor{c-api/tuple c PyTuple_Pack}@anchor{5116}
@deffn {C 함수} @ref{5dc,,PyObject} *PyTuple_Pack (Py_ssize_t n, ...)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
크기 `n' 인 새 튜플 객체나, 실패 시 예외를 설정하고 @code{NULL}을 반환합니다. 튜플 값은 파이썬 객체를 가리키는 후속 `n' 개의 C 인자로 초기화됩니다. @code{PyTuple_Pack(2, a, b)}는 @code{Py_BuildValue("(OO)", a, b)}와 동등합니다.
@end deffn

@geindex PyTuple_Size (C function)
@anchor{c-api/tuple c PyTuple_Size}@anchor{5117}
@deffn {C 함수} @ref{c54,,Py_ssize_t} PyTuple_Size (PyObject *p)
` Part of the @ref{774,,안정 ABI}.'
Take a pointer to a tuple object, and return the size of that tuple.
On error, return @code{-1} with an exception set.
@end deffn

@geindex PyTuple_GET_SIZE (C function)
@anchor{c-api/tuple c PyTuple_GET_SIZE}@anchor{53d1}
@deffn {C 함수} @ref{c54,,Py_ssize_t} PyTuple_GET_SIZE (PyObject *p)

@ref{5117,,PyTuple_Size()}와 비슷하지만, 에러 검사를 생략합니다.
@end deffn

@geindex PyTuple_GetItem (C function)
@anchor{c-api/tuple c PyTuple_GetItem}@anchor{4ef6}
@deffn {C 함수} @ref{5dc,,PyObject} *PyTuple_GetItem (PyObject *p, Py_ssize_t pos)
`반환값: 빌린 참조.'` Part of the @ref{774,,안정 ABI}.'
`p'가 가리키는 튜플의 `pos' 위치에 있는 객체를 반환합니다. `pos'가 음수이거나 범위를 벗어나면, @code{NULL}을 반환하고 @ref{173a,,IndexError} 예외를 설정합니다.

The returned reference is borrowed from the tuple `p'
(that is: it is only valid as long as you hold a reference to `p').
To get a @ref{5df,,strong reference}, use
@ref{a9a,,Py_NewRef(PyTuple_GetItem(...))}
or @ref{1e30,,PySequence_GetItem()}.
@end deffn

@geindex PyTuple_GET_ITEM (C function)
@anchor{c-api/tuple c PyTuple_GET_ITEM}@anchor{53d2}
@deffn {C 함수} @ref{5dc,,PyObject} *PyTuple_GET_ITEM (PyObject *p, Py_ssize_t pos)
`반환값: 빌린 참조.'
@ref{4ef6,,PyTuple_GetItem()}와 비슷하지만, 인자를 확인하지 않습니다.
@end deffn

@geindex PyTuple_GetSlice (C function)
@anchor{c-api/tuple c PyTuple_GetSlice}@anchor{5115}
@deffn {C 함수} @ref{5dc,,PyObject} *PyTuple_GetSlice (PyObject *p, Py_ssize_t low, Py_ssize_t high)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
`p'가 가리키는 튜플의 `low'와 `high' 사이의 슬라이스를 반환하거나, 실패하면 예외를 설정하고 @code{NULL}을 반환합니다.

이것은 파이썬 표현식 @code{p[low:high]}와 동등합니다. 튜플 끝으로부터의 인덱싱은 지원되지 않습니다.
@end deffn

@geindex PyTuple_SetItem (C function)
@anchor{c-api/tuple c PyTuple_SetItem}@anchor{4ef7}
@deffn {C 함수} int PyTuple_SetItem (PyObject *p, Py_ssize_t pos, PyObject *o)
` Part of the @ref{774,,안정 ABI}.'
`p'가 가리키는 튜플의 `pos' 위치에 객체 `o'에 대한 참조를 삽입합니다. 성공하면 @code{0}을 반환합니다. `pos'가 범위를 벗어나면, @code{-1}을 반환하고 @ref{173a,,IndexError} 예외를 설정합니다.

@cartouche
@quotation 참고 
이 함수는 `o'에 대한 참조를 “훔치고” 영향을 받는 위치에서 튜플에 이미 있는 항목에 대한 참조를 버립니다(discard).
@end quotation
@end cartouche
@end deffn

@geindex PyTuple_SET_ITEM (C function)
@anchor{c-api/tuple c PyTuple_SET_ITEM}@anchor{62c}
@deffn {C 함수} void PyTuple_SET_ITEM (PyObject *p, Py_ssize_t pos, PyObject *o)

@ref{4ef7,,PyTuple_SetItem()}과 비슷하지만, 에러 검사는 하지 않으며 새로운 튜플을 채울 때*만* 사용해야 합니다.

Bounds checking is performed as an assertion if Python is built in
@ref{508,,debug mode} or @ref{62b,,with assertions}.

@cartouche
@quotation 참고 
이 함수는 `o'에 대한 참조를 “훔치고”, @ref{4ef7,,PyTuple_SetItem()}와 달리, 교체 중인 항목에 대한 참조를 버리지 `않습니다'; `pos' 위치에서 튜플의 모든 참조는 누수됩니다.
@end quotation
@end cartouche

@cartouche
@quotation 경고 
This macro should `only' be used on tuples that are newly created.
Using this macro on a tuple that is already in use (or in other words, has
a refcount > 1) could lead to undefined behavior.
@end quotation
@end cartouche
@end deffn

@geindex _PyTuple_Resize (C function)
@anchor{c-api/tuple c _PyTuple_Resize}@anchor{1710}
@deffn {C 함수} int _PyTuple_Resize (PyObject **p, Py_ssize_t newsize)

튜플 크기를 조정하는 데 사용할 수 있습니다. `newsize'는 튜플의 새로운 길이가 됩니다. 튜플은 불변이라고 `여겨지므로', 객체에 대해 참조가 하나만 있을 때만 사용해야 합니다. 튜플이 코드의 다른 부분에 이미 알려졌으면 이것을 사용하지 `마십시오'. 튜플은 항상 끝에서 커지거나 줄어듭니다. 이것을 오래된 튜플을 파괴하고 새 튜플을 만드는 것으로 생각하십시오, 단지 더 효율적일 뿐입니다. 성공하면 @code{0}을 반환합니다. 클라이언트 코드는, @code{*p}의 결괏값이 이 함수를 호출하기 전과 같다고 가정해서는 안 됩니다. @code{*p}가 참조하는 객체가 바뀌면 원래 @code{*p}는 파괴됩니다. 실패하면, @code{-1}을 반환하고, @code{*p}를 @code{NULL}로 설정하고, @ref{175f,,MemoryError} 나 @ref{794,,SystemError}를 발생시킵니다.
@end deffn

@node 구조체 시퀀스 객체,리스트 객체,튜플 객체,시퀀스 객체
@anchor{c-api/tuple id1}@anchor{53d3}@anchor{c-api/tuple struct-sequence-objects}@anchor{13c4}
@subsubsection 구조체 시퀀스 객체


구조체 시퀀스(struct sequence) 객체는 @ref{4e0,,namedtuple()} 객체의 C 등가물입니다, 즉 어트리뷰트를 통해 항목에 액세스할 수 있는 시퀀스입니다. 구조체 시퀀스를 만들려면, 먼저 특정 구조체 시퀀스 형을 만들어야 합니다.

@geindex PyStructSequence_NewType (C function)
@anchor{c-api/tuple c PyStructSequence_NewType}@anchor{50f8}
@deffn {C 함수} @ref{c9b,,PyTypeObject} *PyStructSequence_NewType (PyStructSequence_Desc *desc)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
아래에 설명된 `desc'의 데이터로 새로운 구조체 시퀀스 형을 만듭니다. 결과 형의 인스턴스는 @ref{50f7,,PyStructSequence_New()}로 만들 수 있습니다.

실패 시 예외를 설정하고 @code{NULL}을 반환합니다.
@end deffn

@geindex PyStructSequence_InitType (C function)
@anchor{c-api/tuple c PyStructSequence_InitType}@anchor{1202}
@deffn {C 함수} void PyStructSequence_InitType (PyTypeObject *type, PyStructSequence_Desc *desc)

`desc'로 구조체 시퀀스 형 `type'을 재자리에서 초기화합니다.
@end deffn

@geindex PyStructSequence_InitType2 (C function)
@anchor{c-api/tuple c PyStructSequence_InitType2}@anchor{1201}
@deffn {C 함수} int PyStructSequence_InitType2 (PyTypeObject *type, PyStructSequence_Desc *desc)

@ref{1202,,PyStructSequence_InitType()}와 비슷하지만, 성공하면 @code{0}을, 실패하면 예외를 설정하고 @code{-1}을 반환합니다.


Added in version 3.4.

@end deffn

@geindex PyStructSequence_Desc (C type)
@anchor{c-api/tuple c PyStructSequence_Desc}@anchor{db3}
@deffn {C 자료형} type PyStructSequence_Desc
` Part of the @ref{774,,안정 ABI} (including all members).'
만들 구조체 시퀀스 형의 메타 정보를 포함합니다.

@geindex PyStructSequence_Desc.name (C member)
@anchor{c-api/tuple c PyStructSequence_Desc name}@anchor{53d4}
@deffn {C 멤버 변수} const char *name

Fully qualified name of the type; null-terminated UTF-8 encoded.
The name must contain the module name.
@end deffn

@geindex PyStructSequence_Desc.doc (C member)
@anchor{c-api/tuple c PyStructSequence_Desc doc}@anchor{53d5}
@deffn {C 멤버 변수} const char *doc

해당 형에 대한 독스트링에 대한 포인터나 생략하려면 @code{NULL}.
@end deffn

@geindex PyStructSequence_Desc.fields (C member)
@anchor{c-api/tuple c PyStructSequence_Desc fields}@anchor{53d6}
@deffn {C 멤버 변수} @ref{db2,,PyStructSequence_Field} *fields

새로운 형의 필드 이름을 가진 @code{NULL}로 끝나는 배열에 대한 포인터.
@end deffn

@geindex PyStructSequence_Desc.n_in_sequence (C member)
@anchor{c-api/tuple c PyStructSequence_Desc n_in_sequence}@anchor{53d7}
@deffn {C 멤버 변수} int n_in_sequence

파이썬 측에서 볼 수 있는 필드 수 (튜플로 사용된 경우).
@end deffn
@end deffn

@geindex PyStructSequence_Field (C type)
@anchor{c-api/tuple c PyStructSequence_Field}@anchor{db2}
@deffn {C 자료형} type PyStructSequence_Field
` Part of the @ref{774,,안정 ABI} (including all members).'
구조체 시퀀스의 필드를 기술합니다. 구조체 시퀀스는 튜플로 모형화되므로, 모든 필드는 @ref{5dc,,PyObject}* 형을 취합니다. @ref{db3,,PyStructSequence_Desc}의 @ref{53d6,,fields} 배열의 인덱스는 구조체 시퀀스의 어떤 필드가 기술되는지를 결정합니다.

@geindex PyStructSequence_Field.name (C member)
@anchor{c-api/tuple c PyStructSequence_Field name}@anchor{53d8}
@deffn {C 멤버 변수} const char *name

필드의 이름. 또는 이름있는 필드의 목록을 끝내려면 @code{NULL}, 이름이 없는 상태로 두려면 @ref{b78,,PyStructSequence_UnnamedField}로 설정합니다.
@end deffn

@geindex PyStructSequence_Field.doc (C member)
@anchor{c-api/tuple c PyStructSequence_Field doc}@anchor{53d9}
@deffn {C 멤버 변수} const char *doc

필드 독스트링이나 생략하려면 @code{NULL}.
@end deffn
@end deffn

@geindex PyStructSequence_UnnamedField (C var)
@anchor{c-api/tuple c PyStructSequence_UnnamedField}@anchor{b78}
@deffn {C 변수} const char *const PyStructSequence_UnnamedField
` Part of the @ref{774,,안정 ABI} 버전 3.11 이후로.'
이름 없는 상태로 남겨두기 위한 필드 이름의 특수 값.


버전 3.9에서 변경: 형이 @code{char *}에서 변경되었습니다.

@end deffn

@geindex PyStructSequence_New (C function)
@anchor{c-api/tuple c PyStructSequence_New}@anchor{50f7}
@deffn {C 함수} @ref{5dc,,PyObject} *PyStructSequence_New (PyTypeObject *type)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
@ref{50f8,,PyStructSequence_NewType()}으로 만든 `type'의 인스턴스를 만듭니다.

실패 시 예외를 설정하고 @code{NULL}을 반환합니다.
@end deffn

@geindex PyStructSequence_GetItem (C function)
@anchor{c-api/tuple c PyStructSequence_GetItem}@anchor{50f6}
@deffn {C 함수} @ref{5dc,,PyObject} *PyStructSequence_GetItem (PyObject *p, Py_ssize_t pos)
`반환값: 빌린 참조.'` Part of the @ref{774,,안정 ABI}.'
`p'가 가리키는 구조체 시퀀스의 위치 `pos'에 있는 객체를 돌려줍니다.

Bounds checking is performed as an assertion if Python is built in
@ref{508,,debug mode} or @ref{62b,,with assertions}.
@end deffn

@geindex PyStructSequence_GET_ITEM (C function)
@anchor{c-api/tuple c PyStructSequence_GET_ITEM}@anchor{53da}
@deffn {C 함수} @ref{5dc,,PyObject} *PyStructSequence_GET_ITEM (PyObject *p, Py_ssize_t pos)
`반환값: 빌린 참조.'
@ref{50f6,,PyStructSequence_GetItem()}의 별칭.


버전 3.13에서 변경: 이제 @ref{50f6,,PyStructSequence_GetItem()}의 별칭으로 구현됩니다.

@end deffn

@geindex PyStructSequence_SetItem (C function)
@anchor{c-api/tuple c PyStructSequence_SetItem}@anchor{50f9}
@deffn {C 함수} void PyStructSequence_SetItem (PyObject *p, Py_ssize_t pos, PyObject *o)
` Part of the @ref{774,,안정 ABI}.'
구조체 시퀀스 `p'의 인덱스 `pos'에 있는 필드를 값 `o'로 설정합니다. @ref{62c,,PyTuple_SET_ITEM()}과 마찬가지로, 이것은 새로운 인스턴스를 채울 때만 사용해야 합니다.

Bounds checking is performed as an assertion if Python is built in
@ref{508,,debug mode} or @ref{62b,,with assertions}.

@cartouche
@quotation 참고 
이 함수는 `o'에 대한 참조를 “훔칩니다”.
@end quotation
@end cartouche
@end deffn

@geindex PyStructSequence_SET_ITEM (C function)
@anchor{c-api/tuple c PyStructSequence_SET_ITEM}@anchor{53db}
@deffn {C 함수} void PyStructSequence_SET_ITEM (PyObject *p, Py_ssize_t *pos, PyObject *o)

@ref{50f9,,PyStructSequence_SetItem()}의 별칭.


버전 3.13에서 변경: 이제 @ref{50f9,,PyStructSequence_SetItem()}의 별칭으로 구현됩니다.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 리스트 객체,,구조체 시퀀스 객체,시퀀스 객체
@anchor{c-api/list doc}@anchor{53dc}@anchor{c-api/list list-objects}@anchor{53dd}@anchor{c-api/list listobjects}@anchor{53de}@anchor{c-api/list translation-repo}@anchor{53df}
@subsubsection 리스트 객체


@geindex 객체;리스트

@geindex PyListObject (C type)
@anchor{c-api/list c PyListObject}@anchor{2733}
@deffn {C 자료형} type PyListObject

이 @ref{5dc,,PyObject}의 서브 형은 파이썬 리스트 객체를 나타냅니다.
@end deffn

@geindex PyList_Type (C var)
@anchor{c-api/list c PyList_Type}@anchor{4f1a}
@deffn {C 변수} @ref{c9b,,PyTypeObject} PyList_Type
` Part of the @ref{774,,안정 ABI}.'
이 @ref{c9b,,PyTypeObject} 인스턴스는 파이썬 리스트 형을 나타냅니다. 이것은 파이썬 계층의 @ref{24d,,list}와 같은 객체입니다.
@end deffn

@geindex PyList_Check (C function)
@anchor{c-api/list c PyList_Check}@anchor{53e0}
@deffn {C 함수} int PyList_Check (PyObject *p)
` Thread safety: @ref{2735,,Atomic}.'
`p'가 리스트 객체나 리스트 형의 서브 형 인스턴스면 참을 반환합니다. 이 함수는 항상 성공합니다.
@end deffn

@geindex PyList_CheckExact (C function)
@anchor{c-api/list c PyList_CheckExact}@anchor{53e1}
@deffn {C 함수} int PyList_CheckExact (PyObject *p)
` Thread safety: @ref{2735,,Atomic}.'
`p'가 리스트 객체이지만 리스트 형의 서브 형의 인스턴스가 아니면 참을 반환합니다. 이 함수는 항상 성공합니다.
@end deffn

@geindex PyList_New (C function)
@anchor{c-api/list c PyList_New}@anchor{4f88}
@deffn {C 함수} @ref{5dc,,PyObject} *PyList_New (Py_ssize_t len)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'` Thread safety: @ref{2735,,Atomic}.'
성공하면 길이 `len' 인 새 리스트를, 실패하면 @code{NULL}을 반환합니다.

@cartouche
@quotation 참고 
`len'이 0보다 크면, 반환된 리스트 객체의 항목은 @code{NULL}로 설정됩니다. 따라서 모든 항목을 @ref{18bb,,PyList_SetItem()}이나 @ref{62d,,PyList_SET_ITEM()}으로 실제 객체로 설정하기 전에 @ref{1e31,,PySequence_SetItem()}와 같은 추상 API 함수를 사용하거나 파이썬 코드에 객체를 노출할 수 없습니다. 다음 API는 리스트가 완전히 초기화되기 전의 안전한 API 입니다: @code{PyList_SetItem()} 과 @code{PyList_SET_ITEM()}.
@end quotation
@end cartouche
@end deffn

@geindex PyList_Size (C function)
@anchor{c-api/list c PyList_Size}@anchor{161f}
@deffn {C 함수} @ref{c54,,Py_ssize_t} PyList_Size (PyObject *list)
` Part of the @ref{774,,안정 ABI}.'` Thread safety: @ref{2735,,Atomic}.'
@geindex 내장 함수;len

`list'에서 리스트 객체의 길이를 반환합니다; 이는 리스트 객체에 대한 @code{len(list)}와 동등합니다.
@end deffn

@geindex PyList_GET_SIZE (C function)
@anchor{c-api/list c PyList_GET_SIZE}@anchor{53e2}
@deffn {C 함수} @ref{c54,,Py_ssize_t} PyList_GET_SIZE (PyObject *list)
` Thread safety: @ref{2735,,Atomic}.'
@ref{161f,,PyList_Size()}와 유사하지만, 에러 검사가 없습니다.
@end deffn

@geindex PyList_GetItemRef (C function)
@anchor{c-api/list c PyList_GetItemRef}@anchor{5fd}
@deffn {C 함수} @ref{5dc,,PyObject} *PyList_GetItemRef (PyObject *list, Py_ssize_t index)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI} 버전 3.13 이후로.'` Thread safety: @ref{2735,,Atomic}.'
`list'가 가리키는 리스트에서 `index' 위치의 객체를 반환합니다. 위치는 음수가 아니어야 합니다; 리스트의 끝에서부터의 인덱싱은 지원되지 않습니다. `index'가 범위를 벗어나면 (@code{<0 or >=len(list)}), @code{NULL}을 반환하고 @ref{173a,,IndexError} 예외를 설정합니다.


Added in version 3.13.

@end deffn

@geindex PyList_GetItem (C function)
@anchor{c-api/list c PyList_GetItem}@anchor{5fc}
@deffn {C 함수} @ref{5dc,,PyObject} *PyList_GetItem (PyObject *list, Py_ssize_t index)
`반환값: 빌린 참조.'` Part of the @ref{774,,안정 ABI}.'` Thread safety: @ref{2729,,Safe to call from multiple threads with external synchronization only}.'
Like @ref{5fd,,PyList_GetItemRef()}, but returns a
@ref{3d7,,borrowed reference} instead of a @ref{5df,,strong reference}.

@cartouche
@quotation 참고 
In the @ref{1767,,free-threaded build}, the returned
@ref{3d7,,borrowed reference} may become invalid if another thread modifies
the list concurrently. Prefer @ref{5fd,,PyList_GetItemRef()}, which returns
a @ref{5df,,strong reference}.
@end quotation
@end cartouche
@end deffn

@geindex PyList_GET_ITEM (C function)
@anchor{c-api/list c PyList_GET_ITEM}@anchor{4f9e}
@deffn {C 함수} @ref{5dc,,PyObject} *PyList_GET_ITEM (PyObject *list, Py_ssize_t i)
`반환값: 빌린 참조.'` Thread safety: @ref{2729,,Safe to call from multiple threads with external synchronization only}.'
@ref{5fc,,PyList_GetItem()}와 유사하지만, 에러 검사가 없습니다.

@cartouche
@quotation 참고 
In the @ref{1767,,free-threaded build}, the returned
@ref{3d7,,borrowed reference} may become invalid if another thread modifies
the list concurrently. Prefer @ref{5fd,,PyList_GetItemRef()}, which returns
a @ref{5df,,strong reference}.
@end quotation
@end cartouche
@end deffn

@geindex PyList_SetItem (C function)
@anchor{c-api/list c PyList_SetItem}@anchor{18bb}
@deffn {C 함수} int PyList_SetItem (PyObject *list, Py_ssize_t index, PyObject *item)
` Part of the @ref{774,,안정 ABI}.'` Thread safety: @ref{2735,,Atomic}.'
리스트의 인덱스 `index'에 있는 항목을 `item'으로 설정합니다. 성공하면 @code{0}을 반환합니다. `index'가 범위를 벗어나면, @code{-1}을 반환하고 @ref{173a,,IndexError} 예외를 설정합니다.

@cartouche
@quotation 참고 
이 함수는 `item'에 대한 참조를 “훔치고” 영향을 받는 위치의 리스트에 이미 있는 항목에 대한 참조를 버립니다.
@end quotation
@end cartouche
@end deffn

@geindex PyList_SET_ITEM (C function)
@anchor{c-api/list c PyList_SET_ITEM}@anchor{62d}
@deffn {C 함수} void PyList_SET_ITEM (PyObject *list, Py_ssize_t i, PyObject *o)
` Thread safety: @ref{2729,,Safe to call from multiple threads with external synchronization only}.'
에러 검사 없는 @ref{18bb,,PyList_SetItem()}의 매크로 형식. 일반적으로 이전 내용이 없는 새 리스트를 채우는 데 사용됩니다.

Bounds checking is performed as an assertion if Python is built in
@ref{508,,debug mode} or @ref{62b,,with assertions}.

@cartouche
@quotation 참고 
이 매크로는 `item'에 대한 참조를 “훔치고”, @ref{18bb,,PyList_SetItem()}과는 달리 대체되는 항목에 대한 참조를 버리지 `않습니다'; `list' 의 `i' 위치에 있는 참조는 누수를 일으킵니다.
@end quotation
@end cartouche

@cartouche
@quotation 참고 
In the @ref{1767,,free-threaded build}, this macro has no internal
synchronization. It is normally only used to fill in new lists where no
other thread has a reference to the list. If the list may be shared,
use @ref{18bb,,PyList_SetItem()} instead, which uses a @ref{2731,,per-object lock}.
@end quotation
@end cartouche
@end deffn

@geindex PyList_Insert (C function)
@anchor{c-api/list c PyList_Insert}@anchor{18ba}
@deffn {C 함수} int PyList_Insert (PyObject *list, Py_ssize_t index, PyObject *item)
` Part of the @ref{774,,안정 ABI}.'` Thread safety: @ref{2730,,Safe for concurrent use on the same object}.'
항목 `item'을 리스트 `list'의 인덱스 `index' 앞에 삽입합니다. 성공하면 @code{0}을 반환합니다; 실패하면 @code{-1}을 반환하고 예외를 설정합니다. @code{list.insert(index, item)}에 해당합니다.
@end deffn

@geindex PyList_Append (C function)
@anchor{c-api/list c PyList_Append}@anchor{507e}
@deffn {C 함수} int PyList_Append (PyObject *list, PyObject *item)
` Part of the @ref{774,,안정 ABI}.'` Thread safety: @ref{2735,,Atomic}.'
리스트 `list'의 끝에 객체 `item'을 추가합니다. 성공하면 @code{0}을 반환합니다; 실패하면 @code{-1}을 반환하고 예외를 설정합니다. @code{list.append(item)}에 해당합니다.
@end deffn

@geindex PyList_GetSlice (C function)
@anchor{c-api/list c PyList_GetSlice}@anchor{5080}
@deffn {C 함수} @ref{5dc,,PyObject} *PyList_GetSlice (PyObject *list, Py_ssize_t low, Py_ssize_t high)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'` Thread safety: @ref{2735,,Atomic}.'
`list'에서 `low' 와 `high' `사이에'있는 객체들을 포함하는 리스트를 반환합니다. 실패하면 @code{NULL}을 반환하고 예외를 설정합니다. @code{list[low:high]}에 해당합니다. 리스트 끝에서부터의 인덱싱은 지원되지 않습니다.
@end deffn

@geindex PyList_SetSlice (C function)
@anchor{c-api/list c PyList_SetSlice}@anchor{5082}
@deffn {C 함수} int PyList_SetSlice (PyObject *list, Py_ssize_t low, Py_ssize_t high, PyObject *itemlist)
` Part of the @ref{774,,안정 ABI}.'` Thread safety: @ref{2730,,Safe for concurrent use on the same object}.'
`low'와 `high' 사이의 `list'슬라이스를 `itemlist'의 내용으로 설정합니다. @code{list[low:high] = itemlist}에 해당합니다. `itemlist'는 @code{NULL} 일 수 있는데, 빈 리스트의 대입을 나타냅니다 (슬라이스 삭제). 성공하면 @code{0}을, 실패하면 @code{-1}을 반환합니다. 리스트 끝에서부터의 인덱싱은 지원되지 않습니다.

@cartouche
@quotation 참고 
In the @ref{1767,,free-threaded build}, when `itemlist' is a @ref{24d,,list},
both `list' and `itemlist' are locked for the duration of the operation.
For other iterables (or @code{NULL}), only `list' is locked.
@end quotation
@end cartouche
@end deffn

@geindex PyList_Extend (C function)
@anchor{c-api/list c PyList_Extend}@anchor{5fe}
@deffn {C 함수} int PyList_Extend (PyObject *list, PyObject *iterable)
` Thread safety: @ref{2730,,Safe for concurrent use on the same object}.'
Extend `list' with the contents of `iterable'.  This is the same as
@code{PyList_SetSlice(list, PY_SSIZE_T_MAX, PY_SSIZE_T_MAX, iterable)}
and analogous to @code{list.extend(iterable)} or @code{list += iterable}.

Raise an exception and return @code{-1} if `list' is not a @ref{24d,,list}
object. Return 0 on success.


Added in version 3.13.


@cartouche
@quotation 참고 
In the @ref{1767,,free-threaded build}, when `iterable' is a @ref{24d,,list},
@ref{184,,set}, @ref{183,,dict}, or dict view, both `list' and `iterable'
(or its underlying dict) are locked for the duration of the operation.
For other iterables, only `list' is locked; `iterable' may be
concurrently modified by another thread.
@end quotation
@end cartouche
@end deffn

@geindex PyList_Clear (C function)
@anchor{c-api/list c PyList_Clear}@anchor{5ff}
@deffn {C 함수} int PyList_Clear (PyObject *list)
` Thread safety: @ref{2735,,Atomic}.'
Remove all items from `list'.  This is the same as
@code{PyList_SetSlice(list, 0, PY_SSIZE_T_MAX, NULL)} and analogous to
@code{list.clear()} or @code{del list[:]}.

Raise an exception and return @code{-1} if `list' is not a @ref{24d,,list}
object.  Return 0 on success.


Added in version 3.13.

@end deffn

@geindex PyList_Sort (C function)
@anchor{c-api/list c PyList_Sort}@anchor{5083}
@deffn {C 함수} int PyList_Sort (PyObject *list)
` Part of the @ref{774,,안정 ABI}.'` Thread safety: @ref{2730,,Safe for concurrent use on the same object}.'
`list' 항목을 제자리에서 정렬합니다. 성공하면 @code{0}을, 실패하면 @code{-1}을 반환합니다. 이것은 @code{list.sort()}와 동등합니다.

@cartouche
@quotation 참고 
In the @ref{1767,,free-threaded build}, element comparison via
@ref{14a5,,__lt__()} can execute arbitrary Python code, during which
the @ref{2731,,per-object lock} may be temporarily released. For built-in
types (@ref{169,,str}, @ref{19b,,int}, @ref{196,,float}), the lock is not
released during comparison.
@end quotation
@end cartouche
@end deffn

@geindex PyList_Reverse (C function)
@anchor{c-api/list c PyList_Reverse}@anchor{5081}
@deffn {C 함수} int PyList_Reverse (PyObject *list)
` Part of the @ref{774,,안정 ABI}.'` Thread safety: @ref{2730,,Safe for concurrent use on the same object}.'
`list'의 항목을 제자리에서 뒤집습니다. 성공하면 @code{0}을, 실패하면 @code{-1}을 반환합니다. 이것은 @code{list.reverse()}와 동등합니다.
@end deffn

@geindex PyList_AsTuple (C function)
@anchor{c-api/list c PyList_AsTuple}@anchor{507f}
@deffn {C 함수} @ref{5dc,,PyObject} *PyList_AsTuple (PyObject *list)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'` Thread safety: @ref{2735,,Atomic}.'
@geindex 내장 함수;튜플

`list'의 내용을 포함하는 새 튜플 객체를 반환합니다; @code{tuple(list)}와 동등합니다.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 컨테이너 객체,함수 객체,시퀀스 객체,구상 객체 계층
@anchor{c-api/concrete container-objects}@anchor{53e3}@anchor{c-api/concrete mapobjects}@anchor{53e4}
@subsection 컨테이너 객체


@geindex object;mapping

@menu
* 딕셔너리 객체:: 
* 집합 객체:: 

@end menu

@node 딕셔너리 객체,집합 객체,,컨테이너 객체
@anchor{c-api/dict doc}@anchor{53e5}@anchor{c-api/dict dictionary-objects}@anchor{53e6}@anchor{c-api/dict dictobjects}@anchor{53e7}
@subsubsection 딕셔너리 객체


@geindex 객체;딕셔너리

@geindex PyDictObject (C type)
@anchor{c-api/dict c PyDictObject}@anchor{64d}
@deffn {C 자료형} type PyDictObject

이 @ref{5dc,,PyObject}의 서브 형은 파이썬 딕셔너리 객체를 나타냅니다.
@end deffn

@geindex PyDict_Type (C var)
@anchor{c-api/dict c PyDict_Type}@anchor{5005}
@deffn {C 변수} @ref{c9b,,PyTypeObject} PyDict_Type
` Part of the @ref{774,,안정 ABI}.'
이 @ref{c9b,,PyTypeObject} 인스턴스는 파이썬 딕셔너리 형을 나타냅니다. 이것은 파이썬 계층의 @ref{183,,dict}와 같은 객체입니다.
@end deffn

@geindex PyDict_Check (C function)
@anchor{c-api/dict c PyDict_Check}@anchor{5314}
@deffn {C 함수} int PyDict_Check (PyObject *p)

`p'가 dict 객체이거나 dict 형의 서브 형의 인스턴스면 참을 반환합니다. 이 함수는 항상 성공합니다.
@end deffn

@geindex PyDict_CheckExact (C function)
@anchor{c-api/dict c PyDict_CheckExact}@anchor{53e8}
@deffn {C 함수} int PyDict_CheckExact (PyObject *p)

`p'가 dict 객체이지만, dict 형의 서브 형의 인스턴스는 아니면 참을 반환합니다. 이 함수는 항상 성공합니다.
@end deffn

@geindex PyDict_New (C function)
@anchor{c-api/dict c PyDict_New}@anchor{5003}
@deffn {C 함수} @ref{5dc,,PyObject} *PyDict_New ()
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
새로운 빈 딕셔너리를 반환하거나, 실패하면 @code{NULL}을 반환합니다.
@end deffn

@geindex PyDictProxy_New (C function)
@anchor{c-api/dict c PyDictProxy_New}@anchor{4ff6}
@deffn {C 함수} @ref{5dc,,PyObject} *PyDictProxy_New (PyObject *mapping)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
읽기 전용 동작을 강제하는 매핑을 위한 @ref{697,,types.MappingProxyType} 객체를 반환합니다. 이것은 일반적으로 비 동적 클래스 형을 위한 딕셔너리의 수정을 방지하기 위해 뷰를 만드는 데 사용됩니다.
@end deffn

@geindex PyDictProxy_Type (C var)
@anchor{c-api/dict c PyDictProxy_Type}@anchor{4ff7}
@deffn {C 변수} @ref{c9b,,PyTypeObject} PyDictProxy_Type
` Part of the @ref{774,,안정 ABI}.'
The type object for mapping proxy objects created by
@ref{4ff6,,PyDictProxy_New()} and for the read-only @code{__dict__} attribute
of many built-in types. A @ref{4ff7,,PyDictProxy_Type} instance provides a
dynamic, read-only view of an underlying dictionary: changes to the
underlying dictionary are reflected in the proxy, but the proxy itself
does not support mutation operations. This corresponds to
@ref{697,,types.MappingProxyType} in Python.
@end deffn

@geindex PyDict_Clear (C function)
@anchor{c-api/dict c PyDict_Clear}@anchor{4ffc}
@deffn {C 함수} void PyDict_Clear (PyObject *p)
` Part of the @ref{774,,안정 ABI}.'
기존 딕셔너리의 모든 키-값 쌍을 비웁니다.
@end deffn

@geindex PyDict_Contains (C function)
@anchor{c-api/dict c PyDict_Contains}@anchor{5db}
@deffn {C 함수} int PyDict_Contains (PyObject *p, PyObject *key)
` Part of the @ref{774,,안정 ABI}.'
Determine if dictionary `p' contains `key'.  If an item in `p' matches
`key', return @code{1}, otherwise return @code{0}.  On error, return @code{-1}.
This is equivalent to the Python expression @code{key in p}.
@end deffn

@geindex PyDict_ContainsString (C function)
@anchor{c-api/dict c PyDict_ContainsString}@anchor{5dd}
@deffn {C 함수} int PyDict_ContainsString (PyObject *p, const char *key)

이것은 @ref{5db,,PyDict_Contains()}와 같지만, `key'가 @ref{5dc,,PyObject}*가 아닌 const char* UTF-8 인코딩된 바이트 문자열로 지정됩니다.


Added in version 3.13.

@end deffn

@geindex PyDict_Copy (C function)
@anchor{c-api/dict c PyDict_Copy}@anchor{660}
@deffn {C 함수} @ref{5dc,,PyObject} *PyDict_Copy (PyObject *p)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
`p'와 같은 키-값 쌍을 포함하는 새 딕셔너리를 반환합니다.
@end deffn

@geindex PyDict_SetItem (C function)
@anchor{c-api/dict c PyDict_SetItem}@anchor{4ef8}
@deffn {C 함수} int PyDict_SetItem (PyObject *p, PyObject *key, PyObject *val)
` Part of the @ref{774,,안정 ABI}.'
딕셔너리 `p'에 `val'을 `key' 키로 삽입합니다. `key'는 @ref{823,,해시 가능}해야 합니다. 그렇지 않으면 @ref{198,,TypeError}가 발생합니다. 성공하면 @code{0}을, 실패하면 @code{-1}을 반환합니다. 이 함수는 `val'에 대한 참조를 훔치지 `않습니다'.
@end deffn

@geindex PyDict_SetItemString (C function)
@anchor{c-api/dict c PyDict_SetItemString}@anchor{198e}
@deffn {C 함수} int PyDict_SetItemString (PyObject *p, const char *key, PyObject *val)
` Part of the @ref{774,,안정 ABI}.'
이것은 @ref{4ef8,,PyDict_SetItem()}와 같지만, `key'가 @ref{5dc,,PyObject}*가 아닌 const char* UTF-8 인코딩된 바이트 문자열로 지정됩니다.
@end deffn

@geindex PyDict_DelItem (C function)
@anchor{c-api/dict c PyDict_DelItem}@anchor{4ffd}
@deffn {C 함수} int PyDict_DelItem (PyObject *p, PyObject *key)
` Part of the @ref{774,,안정 ABI}.'
딕셔너리 `p'에서 키가 `key'인 항목을 제거합니다. `key'는 @ref{823,,해시 가능}해야 합니다. 그렇지 않으면 @ref{198,,TypeError}가 발생합니다. `key'가 딕셔너리에 없으면, @ref{5e5,,KeyError}가 발생합니다. 성공하면 @code{0}을, 실패하면 @code{-1}을 반환합니다.
@end deffn

@geindex PyDict_DelItemString (C function)
@anchor{c-api/dict c PyDict_DelItemString}@anchor{4ffe}
@deffn {C 함수} int PyDict_DelItemString (PyObject *p, const char *key)
` Part of the @ref{774,,안정 ABI}.'
이것은 @ref{4ffd,,PyDict_DelItem()}와 같지만, `key'가 @ref{5dc,,PyObject}*가 아닌 const char* UTF-8 인코딩된 바이트 문자열로 지정됩니다.
@end deffn

@geindex PyDict_GetItemRef (C function)
@anchor{c-api/dict c PyDict_GetItemRef}@anchor{5e0}
@deffn {C 함수} int PyDict_GetItemRef (PyObject *p, PyObject *key, PyObject **result)
` Part of the @ref{774,,안정 ABI} 버전 3.13 이후로.'
Return a new @ref{5df,,strong reference} to the object from dictionary `p'
which has a key `key':


@itemize *

@item 
If the key is present, set `*result' to a new @ref{5df,,strong reference}
to the value and return @code{1}.

@item 
If the key is missing, set `*result' to @code{NULL} and return @code{0}.

@item 
On error, raise an exception and return @code{-1}.
@end itemize


Added in version 3.13.


See also the @ref{5e6,,PyObject_GetItem()} function.
@end deffn

@geindex PyDict_GetItem (C function)
@anchor{c-api/dict c PyDict_GetItem}@anchor{626}
@deffn {C 함수} @ref{5dc,,PyObject} *PyDict_GetItem (PyObject *p, PyObject *key)
`반환값: 빌린 참조.'` Part of the @ref{774,,안정 ABI}.'
딕셔너리 `p'에서 키가 `key'인 객체에 대한 @ref{3d7,,빌린 참조}를 반환합니다. `key' 키가 없으면 예외를 설정하지 `않고' @code{NULL}을 반환합니다.

@cartouche
@quotation 참고 
@ref{cf2,,__hash__()}와 @ref{cf1,,__eq__()} 메서드를 호출하는 동안 발생하는 예외는 조용히 무시됩니다. 대신 @ref{5de,,PyDict_GetItemWithError()} 함수를 사용하십시오.
@end quotation
@end cartouche


버전 3.10에서 변경: Calling this API without an @ref{4f10,,attached thread state} had been allowed for historical
reason. It is no longer allowed.

@end deffn

@geindex PyDict_GetItemWithError (C function)
@anchor{c-api/dict c PyDict_GetItemWithError}@anchor{5de}
@deffn {C 함수} @ref{5dc,,PyObject} *PyDict_GetItemWithError (PyObject *p, PyObject *key)
`반환값: 빌린 참조.'` Part of the @ref{774,,안정 ABI}.'
예외를 억제하지 않는 @ref{626,,PyDict_GetItem()}의 변형입니다. 예외가 발생하면 예외를 `설정하고' @code{NULL}을 반환합니다. 키가 없으면 예외를 설정하지 `않고' @code{NULL}을 반환합니다.
@end deffn

@geindex PyDict_GetItemString (C function)
@anchor{c-api/dict c PyDict_GetItemString}@anchor{627}
@deffn {C 함수} @ref{5dc,,PyObject} *PyDict_GetItemString (PyObject *p, const char *key)
`반환값: 빌린 참조.'` Part of the @ref{774,,안정 ABI}.'
이것은 @ref{626,,PyDict_GetItem()}와 같지만, `key'가 @ref{5dc,,PyObject}*가 아닌 const char* UTF-8로 인코딩된 바이트 문자열로 지정됩니다.

@cartouche
@quotation 참고 
@ref{cf2,,__hash__()}와 @ref{cf1,,__eq__()} 메서드를 호출하는 동안이나 임시 @ref{169,,str} 객체를 만드는 동안 발생하는 예외는 조용히 무시됩니다. 대신 자체 @ref{5151,,PyUnicode_FromString()} `key'와 함께 @ref{5de,,PyDict_GetItemWithError()} 함수를 사용하는 것이 좋습니다.
@end quotation
@end cartouche
@end deffn

@geindex PyDict_GetItemStringRef (C function)
@anchor{c-api/dict c PyDict_GetItemStringRef}@anchor{421}
@deffn {C 함수} int PyDict_GetItemStringRef (PyObject *p, const char *key, PyObject **result)
` Part of the @ref{774,,안정 ABI} 버전 3.13 이후로.'
이것은 @ref{5e0,,PyDict_GetItemRef()}와 유시하지만, `key'가 @ref{5dc,,PyObject}*가 아닌 const char* UTF-8로 인코딩된 바이트 문자열로 지정됩니다.


Added in version 3.13.

@end deffn

@geindex PyDict_SetDefault (C function)
@anchor{c-api/dict c PyDict_SetDefault}@anchor{5e1}
@deffn {C 함수} @ref{5dc,,PyObject} *PyDict_SetDefault (PyObject *p, PyObject *key, PyObject *defaultobj)
`반환값: 빌린 참조.'
이것은 파이썬 수준의 @ref{1278,,dict.setdefault()}와 같습니다. 존재하면, 딕셔너리 `p'에서 `key'에 해당하는 값을 반환합니다. 키가 dict에 없으면, 값 `defaultobj'로 삽입되고, `defaultobj'가 반환됩니다. 이 함수는 `key'의 해시 함수를 조회 및 삽입을 위해 독립적으로 평가하는 대신 한 번만 평가합니다.


Added in version 3.4.

@end deffn

@geindex PyDict_SetDefaultRef (C function)
@anchor{c-api/dict c PyDict_SetDefaultRef}@anchor{5e2}
@deffn {C 함수} int PyDict_SetDefaultRef (PyObject *p, PyObject *key, PyObject *default_value, PyObject **result)

Inserts `default_value' into the dictionary `p' with a key of `key' if the
key is not already present in the dictionary. If `result' is not @code{NULL},
then `*result' is set to a @ref{5df,,strong reference} to either
`default_value', if the key was not present, or the existing value, if `key'
was already present in the dictionary.
Returns @code{1} if the key was present and `default_value' was not inserted,
or @code{0} if the key was not present and `default_value' was inserted.
On failure, returns @code{-1}, sets an exception, and sets @code{*result}
to @code{NULL}.

For clarity: if you have a strong reference to `default_value' before
calling this function, then after it returns, you hold a strong reference
to both `default_value' and `*result' (if it’s not @code{NULL}).
These may refer to the same object: in that case you hold two separate
references to it.


Added in version 3.13.

@end deffn

@geindex PyDict_Pop (C function)
@anchor{c-api/dict c PyDict_Pop}@anchor{422}
@deffn {C 함수} int PyDict_Pop (PyObject *p, PyObject *key, PyObject **result)

Remove `key' from dictionary `p' and optionally return the removed value.
Do not raise @ref{5e5,,KeyError} if the key is missing.


@itemize -

@item 
If the key is present, set `*result' to a new reference to the removed
value if `result' is not @code{NULL}, and return @code{1}.

@item 
If the key is missing, set `*result' to @code{NULL} if `result' is not
@code{NULL}, and return @code{0}.

@item 
On error, raise an exception and return @code{-1}.
@end itemize

Similar to @ref{5e4,,dict.pop()}, but without the default value and
not raising @ref{5e5,,KeyError} if the key is missing.


Added in version 3.13.

@end deffn

@geindex PyDict_PopString (C function)
@anchor{c-api/dict c PyDict_PopString}@anchor{5e3}
@deffn {C 함수} int PyDict_PopString (PyObject *p, const char *key, PyObject **result)

이것은 @ref{422,,PyDict_Pop()}와 유사하지만, `key'가 @ref{5dc,,PyObject}*가 아닌 const char* UTF-8로 인코딩된 바이트 문자열로 지정됩니다.


Added in version 3.13.

@end deffn

@geindex PyDict_Items (C function)
@anchor{c-api/dict c PyDict_Items}@anchor{4fff}
@deffn {C 함수} @ref{5dc,,PyObject} *PyDict_Items (PyObject *p)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
딕셔너리의 모든 항목을 포함하는 @ref{2733,,PyListObject}를 반환합니다.
@end deffn

@geindex PyDict_Keys (C function)
@anchor{c-api/dict c PyDict_Keys}@anchor{5000}
@deffn {C 함수} @ref{5dc,,PyObject} *PyDict_Keys (PyObject *p)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
딕셔너리의 모든 키를 포함하는 @ref{2733,,PyListObject}를 반환합니다.
@end deffn

@geindex PyDict_Values (C function)
@anchor{c-api/dict c PyDict_Values}@anchor{5007}
@deffn {C 함수} @ref{5dc,,PyObject} *PyDict_Values (PyObject *p)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
딕셔너리 `p'의 모든 값을 포함하는 @ref{2733,,PyListObject}를 반환합니다.
@end deffn

@geindex PyDict_Size (C function)
@anchor{c-api/dict c PyDict_Size}@anchor{5004}
@deffn {C 함수} @ref{c54,,Py_ssize_t} PyDict_Size (PyObject *p)
` Part of the @ref{774,,안정 ABI}.'
@geindex 내장 함수;len

딕셔너리에 있는 항목의 수를 반환합니다. 이는 딕셔너리에 대한 @code{len(p)}와 동등합니다.
@end deffn

@geindex PyDict_GET_SIZE (C function)
@anchor{c-api/dict c PyDict_GET_SIZE}@anchor{53e9}
@deffn {C 함수} @ref{c54,,Py_ssize_t} PyDict_GET_SIZE (PyObject *p)

Similar to @ref{5004,,PyDict_Size()}, but without error checking.
@end deffn

@geindex PyDict_Next (C function)
@anchor{c-api/dict c PyDict_Next}@anchor{1990}
@deffn {C 함수} int PyDict_Next (PyObject *p, Py_ssize_t *ppos, PyObject **pkey, PyObject **pvalue)
` Part of the @ref{774,,안정 ABI}.'
딕셔너리 `p'의 모든 키-값 쌍을 이터레이트 합니다. `ppos'에 의해 참조된 @ref{c54,,Py_ssize_t}는, 이터레이션을 시작하기 위해 이 함수를 처음 호출하기 전에 @code{0}으로 초기화되어야 합니다; 이 함수는 딕셔너리의 각 쌍에 대해 참을 반환하고, 모든 쌍이 보고되었으면 거짓을 반환합니다. 매개 변수 `pkey'와 `pvalue'는 각각 키와 값으로 채울 @ref{5dc,,PyObject}* 변수를 가리 키거나, @code{NULL} 일 수 있습니다. 이들을 통해 반환된 참조는 모두 빌린(borrowed) 것입니다. 이터레이션 중에 `ppos'를 변경하면 안 됩니다. 이 값은 내부 딕셔너리 구조 내의 오프셋을 나타내며, 구조가 희박하므로 오프셋이 연속되지 않습니다.

예를 들면:

@example
PyObject *key, *value;
Py_ssize_t pos = 0;

while (PyDict_Next(self->dict, &pos, &key, &value)) @{
    /* 값으로 흥미로운 작업을 수행합니다... */
    ...
@}
@end example

딕셔너리 `p'는 이터레이션 중에 변경해서는 안 됩니다. 딕셔너리를 이터레이트 할 때 값을 변경하는 것은 안전하지만, 키 집합이 변경되지 않는 한만 그렇습니다. 예를 들면:

@example
PyObject *key, *value;
Py_ssize_t pos = 0;

while (PyDict_Next(self->dict, &pos, &key, &value)) @{
    long i = PyLong_AsLong(value);
    if (i == -1 && PyErr_Occurred()) @{
        return -1;
    @}
    PyObject *o = PyLong_FromLong(i + 1);
    if (o == NULL)
        return -1;
    if (PyDict_SetItem(self->dict, key, o) < 0) @{
        Py_DECREF(o);
        return -1;
    @}
    Py_DECREF(o);
@}
@end example

The function is not thread-safe in the @ref{1f4,,free-threaded}
build without external synchronization.  You can use
@ref{53ea,,Py_BEGIN_CRITICAL_SECTION} to lock the dictionary while iterating
over it:

@example
Py_BEGIN_CRITICAL_SECTION(self->dict);
while (PyDict_Next(self->dict, &pos, &key, &value)) @{
    ...
@}
Py_END_CRITICAL_SECTION();
@end example

@cartouche
@quotation 참고 
On the free-threaded build, this function can be used safely inside a
critical section. However, the references returned for `pkey' and `pvalue'
are @ref{3d7,,borrowed} and are only valid while the
critical section is held. If you need to use these objects outside the
critical section or when the critical section can be suspended, create a
@ref{5df,,strong reference} (for example, using
@ref{a9a,,Py_NewRef()}).
@end quotation
@end cartouche
@end deffn

@geindex PyDict_Merge (C function)
@anchor{c-api/dict c PyDict_Merge}@anchor{5001}
@deffn {C 함수} int PyDict_Merge (PyObject *a, PyObject *b, int override)
` Part of the @ref{774,,안정 ABI}.'
매핑 객체 `b'를 이터레이트 하면서, 키-값 쌍을 딕셔너리 `a'에 추가합니다. `b'는 딕셔너리거나 @ref{db4,,PyMapping_Keys()}와 @ref{5e6,,PyObject_GetItem()}를 지원하는 모든 객체일 수 있습니다. `override'가 참이면, `a'에 있는 기존 쌍이 `b'에서 일치하는 키가 있으면 교체되고, 그렇지 않으면 `a'와 일치하는 키가 없을 때만 쌍이 추가됩니다. 성공하면 @code{0}을 반환하고, 예외가 발생하면 @code{-1}을 반환합니다.
@end deffn

@geindex PyDict_Update (C function)
@anchor{c-api/dict c PyDict_Update}@anchor{5006}
@deffn {C 함수} int PyDict_Update (PyObject *a, PyObject *b)
` Part of the @ref{774,,안정 ABI}.'
이는 C에서 @code{PyDict_Merge(a, b, 1)}와 같고, 두 번째 인자에 “keys” 어트리뷰트가 없을 때 @ref{5006,,PyDict_Update()}가 키-값 쌍의 시퀀스에 대해 이터레이트 하지 않는다는 점만 제외하면, 파이썬에서 @code{a.update(b)}와 유사합니다. 성공하면 @code{0}을 반환하고, 예외가 발생하면 @code{-1}을 반환합니다.
@end deffn

@geindex PyDict_MergeFromSeq2 (C function)
@anchor{c-api/dict c PyDict_MergeFromSeq2}@anchor{5002}
@deffn {C 함수} int PyDict_MergeFromSeq2 (PyObject *a, PyObject *seq2, int override)
` Part of the @ref{774,,안정 ABI}.'
`seq2'의 키-값 쌍으로 딕셔너리 `a'를 갱신하거나 병합합니다. `seq2'는 키-값 쌍으로 간주하는 길이 2의 이터러블 객체를 생성하는 이터러블 객체여야 합니다. 중복 키가 있으면, `override'가 참이면 마지막이 승리하고, 그렇지 않으면 첫 번째가 승리합니다. 성공 시 @code{0}을 반환하고, 예외가 발생하면 @code{-1}을 반환합니다. 동등한 파이썬은 이렇습니다(반환 값 제외)

@example
def PyDict_MergeFromSeq2(a, seq2, override):
    for key, value in seq2:
        if override or key not in a:
            a[key] = value
@end example
@end deffn

@geindex PyDict_AddWatcher (C function)
@anchor{c-api/dict c PyDict_AddWatcher}@anchor{3d0}
@deffn {C 함수} int PyDict_AddWatcher (PyDict_WatchCallback callback)

Register `callback' as a dictionary watcher. Return a non-negative integer
id which must be passed to future calls to @ref{783,,PyDict_Watch()}. In case
of error (e.g. no more watcher IDs available), return @code{-1} and set an
exception.


Added in version 3.12.

@end deffn

@geindex PyDict_ClearWatcher (C function)
@anchor{c-api/dict c PyDict_ClearWatcher}@anchor{53eb}
@deffn {C 함수} int PyDict_ClearWatcher (int watcher_id)

Clear watcher identified by `watcher_id' previously returned from
@ref{3d0,,PyDict_AddWatcher()}. Return @code{0} on success, @code{-1} on error (e.g.
if the given `watcher_id' was never registered.)


Added in version 3.12.

@end deffn

@geindex PyDict_Watch (C function)
@anchor{c-api/dict c PyDict_Watch}@anchor{783}
@deffn {C 함수} int PyDict_Watch (int watcher_id, PyObject *dict)

Mark dictionary `dict' as watched. The callback granted `watcher_id' by
@ref{3d0,,PyDict_AddWatcher()} will be called when `dict' is modified or
deallocated. Return @code{0} on success or @code{-1} on error.


Added in version 3.12.

@end deffn

@geindex PyDict_Unwatch (C function)
@anchor{c-api/dict c PyDict_Unwatch}@anchor{53ec}
@deffn {C 함수} int PyDict_Unwatch (int watcher_id, PyObject *dict)

Mark dictionary `dict' as no longer watched. The callback granted
`watcher_id' by @ref{3d0,,PyDict_AddWatcher()} will no longer be called when
`dict' is modified or deallocated. The dict must previously have been
watched by this watcher. Return @code{0} on success or @code{-1} on error.


Added in version 3.12.

@end deffn

@geindex PyDict_WatchEvent (C type)
@anchor{c-api/dict c PyDict_WatchEvent}@anchor{53ed}
@deffn {C 자료형} type PyDict_WatchEvent

Enumeration of possible dictionary watcher events: @code{PyDict_EVENT_ADDED},
@code{PyDict_EVENT_MODIFIED}, @code{PyDict_EVENT_DELETED}, @code{PyDict_EVENT_CLONED},
@code{PyDict_EVENT_CLEARED}, or @code{PyDict_EVENT_DEALLOCATED}.


Added in version 3.12.

@end deffn

@geindex PyDict_WatchCallback (C type)
@anchor{c-api/dict c PyDict_WatchCallback}@anchor{53ee}
@deffn {C 자료형} typedef int (*PyDict_WatchCallback)(@ref{53ed,,PyDict_WatchEvent} event, @ref{5dc,,PyObject} *dict, @ref{5dc,,PyObject} *key, @ref{5dc,,PyObject} *new_value)

Type of a dict watcher callback function.

If `event' is @code{PyDict_EVENT_CLEARED} or @code{PyDict_EVENT_DEALLOCATED}, both
`key' and `new_value' will be @code{NULL}. If `event' is @code{PyDict_EVENT_ADDED}
or @code{PyDict_EVENT_MODIFIED}, `new_value' will be the new value for `key'.
If `event' is @code{PyDict_EVENT_DELETED}, `key' is being deleted from the
dictionary and `new_value' will be @code{NULL}.

@code{PyDict_EVENT_CLONED} occurs when `dict' was previously empty and another
dict is merged into it. To maintain efficiency of this operation, per-key
@code{PyDict_EVENT_ADDED} events are not issued in this case; instead a
single @code{PyDict_EVENT_CLONED} is issued, and `key' will be the source
dictionary.

The callback may inspect but must not modify `dict'; doing so could have
unpredictable effects, including infinite recursion. Do not trigger Python
code execution in the callback, as it could modify the dict as a side effect.

If `event' is @code{PyDict_EVENT_DEALLOCATED}, taking a new reference in the
callback to the about-to-be-destroyed dictionary will resurrect it and
prevent it from being freed at this time. When the resurrected object is
destroyed later, any watcher callbacks active at that time will be called
again.

Callbacks occur before the notified modification to `dict' takes place, so
the prior state of `dict' can be inspected.

If the callback sets an exception, it must return @code{-1}; this exception will
be printed as an unraisable exception using @ref{5ef,,PyErr_WriteUnraisable()}.
Otherwise it should return @code{0}.

There may already be a pending exception set on entry to the callback. In
this case, the callback should return @code{0} with the same exception still
set. This means the callback may not call any other API that can set an
exception unless it saves and clears the exception state first, and restores
it before returning.


Added in version 3.12.

@end deffn

@menu
* Dictionary View Objects:: 
* Ordered Dictionaries:: 

@end menu

@node Dictionary View Objects,Ordered Dictionaries,,딕셔너리 객체
@anchor{c-api/dict dictionary-view-objects}@anchor{53ef}
@subsubsection Dictionary View Objects


@geindex PyDictViewSet_Check (C function)
@anchor{c-api/dict c PyDictViewSet_Check}@anchor{53f0}
@deffn {C 함수} int PyDictViewSet_Check (PyObject *op)

Return true if `op' is a view of a set inside a dictionary. This is currently
equivalent to @ref{53f1,,PyDictKeys_Check}(@ref{53f0,,op}) || @ref{53f2,,PyDictItems_Check}(op). This
function always succeeds.
@end deffn

@geindex PyDictKeys_Type (C var)
@anchor{c-api/dict c PyDictKeys_Type}@anchor{4ff5}
@deffn {C 변수} @ref{c9b,,PyTypeObject} PyDictKeys_Type
` Part of the @ref{774,,안정 ABI}.'
Type object for a view of dictionary keys. In Python, this is the type of
the object returned by @ref{9d0,,dict.keys()}.
@end deffn

@geindex PyDictKeys_Check (C function)
@anchor{c-api/dict c PyDictKeys_Check}@anchor{53f1}
@deffn {C 함수} int PyDictKeys_Check (PyObject *op)

Return true if `op' is an instance of a dictionary keys view. This function
always succeeds.
@end deffn

@geindex PyDictValues_Type (C var)
@anchor{c-api/dict c PyDictValues_Type}@anchor{4ffb}
@deffn {C 변수} @ref{c9b,,PyTypeObject} PyDictValues_Type
` Part of the @ref{774,,안정 ABI}.'
Type object for a view of dictionary values. In Python, this is the type of
the object returned by @ref{9d1,,dict.values()}.
@end deffn

@geindex PyDictValues_Check (C function)
@anchor{c-api/dict c PyDictValues_Check}@anchor{53f3}
@deffn {C 함수} int PyDictValues_Check (PyObject *op)

Return true if `op' is an instance of a dictionary values view. This function
always succeeds.
@end deffn

@geindex PyDictItems_Type (C var)
@anchor{c-api/dict c PyDictItems_Type}@anchor{4ff1}
@deffn {C 변수} @ref{c9b,,PyTypeObject} PyDictItems_Type
` Part of the @ref{774,,안정 ABI}.'
Type object for a view of dictionary items. In Python, this is the type of
the object returned by @ref{9d2,,dict.items()}.
@end deffn

@geindex PyDictItems_Check (C function)
@anchor{c-api/dict c PyDictItems_Check}@anchor{53f2}
@deffn {C 함수} int PyDictItems_Check (PyObject *op)

Return true if `op' is an instance of a dictionary items view. This function
always succeeds.
@end deffn

@node Ordered Dictionaries,,Dictionary View Objects,딕셔너리 객체
@anchor{c-api/dict ordered-dictionaries}@anchor{53f4}
@subsubsection Ordered Dictionaries


Python’s C API provides interface for @ref{7f2,,collections.OrderedDict} from C.
Since Python 3.7, dictionaries are ordered by default, so there is usually
little need for these functions; prefer @code{PyDict*} where possible.

@geindex PyODict_Type (C var)
@anchor{c-api/dict c PyODict_Type}@anchor{53f5}
@deffn {C 변수} @ref{c9b,,PyTypeObject} PyODict_Type

Type object for ordered dictionaries. This is the same object as
@ref{7f2,,collections.OrderedDict} in the Python layer.
@end deffn

@geindex PyODict_Check (C function)
@anchor{c-api/dict c PyODict_Check}@anchor{53f6}
@deffn {C 함수} int PyODict_Check (PyObject *od)

Return true if `od' is an ordered dictionary object or an instance of a
subtype of the @ref{7f2,,OrderedDict} type.  This function
always succeeds.
@end deffn

@geindex PyODict_CheckExact (C function)
@anchor{c-api/dict c PyODict_CheckExact}@anchor{53f7}
@deffn {C 함수} int PyODict_CheckExact (PyObject *od)

Return true if `od' is an ordered dictionary object, but not an instance of
a subtype of the @ref{7f2,,OrderedDict} type.
This function always succeeds.
@end deffn

@geindex PyODictKeys_Type (C var)
@anchor{c-api/dict c PyODictKeys_Type}@anchor{53f8}
@deffn {C 변수} @ref{c9b,,PyTypeObject} PyODictKeys_Type

Analogous to @ref{4ff5,,PyDictKeys_Type} for ordered dictionaries.
@end deffn

@geindex PyODictValues_Type (C var)
@anchor{c-api/dict c PyODictValues_Type}@anchor{53f9}
@deffn {C 변수} @ref{c9b,,PyTypeObject} PyODictValues_Type

Analogous to @ref{4ffb,,PyDictValues_Type} for ordered dictionaries.
@end deffn

@geindex PyODictItems_Type (C var)
@anchor{c-api/dict c PyODictItems_Type}@anchor{53fa}
@deffn {C 변수} @ref{c9b,,PyTypeObject} PyODictItems_Type

Analogous to @ref{4ff1,,PyDictItems_Type} for ordered dictionaries.
@end deffn

@geindex PyODict_New (C function)
@anchor{c-api/dict c PyODict_New}@anchor{53fb}
@deffn {C 함수} @ref{5dc,,PyObject} *PyODict_New (void)

Return a new empty ordered dictionary, or @code{NULL} on failure.

This is analogous to @ref{5003,,PyDict_New()}.
@end deffn

@geindex PyODict_SetItem (C function)
@anchor{c-api/dict c PyODict_SetItem}@anchor{53fc}
@deffn {C 함수} int PyODict_SetItem (PyObject *od, PyObject *key, PyObject *value)

Insert `value' into the ordered dictionary `od' with a key of `key'.
Return @code{0} on success or @code{-1} with an exception set on failure.

This is analogous to @ref{4ef8,,PyDict_SetItem()}.
@end deffn

@geindex PyODict_DelItem (C function)
@anchor{c-api/dict c PyODict_DelItem}@anchor{53fd}
@deffn {C 함수} int PyODict_DelItem (PyObject *od, PyObject *key)

Remove the entry in the ordered dictionary `od' with key `key'.
Return @code{0} on success or @code{-1} with an exception set on failure.

This is analogous to @ref{4ffd,,PyDict_DelItem()}.
@end deffn

These are @ref{23d,,soft deprecated} aliases to @code{PyDict} APIs:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

@code{PyODict}

@tab

@code{PyDict}

@item

@geindex PyODict_GetItem (C macro)
@anchor{c-api/dict c PyODict_GetItem}@anchor{53fe}
@deffn {C 매크로} PyODict_GetItem (od, key)
@end deffn

@tab

@ref{626,,PyDict_GetItem()}

@item

@geindex PyODict_GetItemWithError (C macro)
@anchor{c-api/dict c PyODict_GetItemWithError}@anchor{53ff}
@deffn {C 매크로} PyODict_GetItemWithError (od, key)
@end deffn

@tab

@ref{5de,,PyDict_GetItemWithError()}

@item

@geindex PyODict_GetItemString (C macro)
@anchor{c-api/dict c PyODict_GetItemString}@anchor{5400}
@deffn {C 매크로} PyODict_GetItemString (od, key)
@end deffn

@tab

@ref{627,,PyDict_GetItemString()}

@item

@geindex PyODict_Contains (C macro)
@anchor{c-api/dict c PyODict_Contains}@anchor{5401}
@deffn {C 매크로} PyODict_Contains (od, key)
@end deffn

@tab

@ref{5db,,PyDict_Contains()}

@item

@geindex PyODict_Size (C macro)
@anchor{c-api/dict c PyODict_Size}@anchor{5402}
@deffn {C 매크로} PyODict_Size (od)
@end deffn

@tab

@ref{5004,,PyDict_Size()}

@item

@geindex PyODict_SIZE (C macro)
@anchor{c-api/dict c PyODict_SIZE}@anchor{5403}
@deffn {C 매크로} PyODict_SIZE (od)
@end deffn

@tab

@ref{53e9,,PyDict_GET_SIZE()}

@end multitable


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 집합 객체,,딕셔너리 객체,컨테이너 객체
@anchor{c-api/set doc}@anchor{5404}@anchor{c-api/set set-objects}@anchor{5405}@anchor{c-api/set setobjects}@anchor{5406}@anchor{c-api/set translation-repo}@anchor{5407}
@subsubsection 집합 객체


@geindex 객체;set
@geindex 객체;frozenset

이 절에서는 @ref{184,,set}과 @ref{7f1,,frozenset} 객체에 대한 공용 API에 대해 자세히 설명합니다. 아래 나열되지 않은 기능은 추상 객체 프로토콜 (@ref{63e,,PyObject_CallMethod()}, @ref{1d8a,,PyObject_RichCompareBool()}, @ref{436,,PyObject_Hash()}, @ref{122e,,PyObject_Repr()}, @ref{50d3,,PyObject_IsTrue()}, @ref{198c,,PyObject_Print()} 및 @ref{50d2,,PyObject_GetIter()}를 포함합니다)이나 추상 숫자 프로토콜 (@ref{50a6,,PyNumber_And()}, @ref{50bf,,PyNumber_Subtract()}, @ref{50ba,,PyNumber_Or()}, @ref{50c1,,PyNumber_Xor()}, @ref{50ab,,PyNumber_InPlaceAnd()}, @ref{50b3,,PyNumber_InPlaceSubtract()}, @ref{50af,,PyNumber_InPlaceOr()} 및 @ref{50b5,,PyNumber_InPlaceXor()}을 포함합니다).

@geindex PySetObject (C type)
@anchor{c-api/set c PySetObject}@anchor{5408}
@deffn {C 자료형} type PySetObject

이 @ref{5dc,,PyObject}의 서브 형은 @ref{184,,set}과 @ref{7f1,,frozenset} 객체 모두의 내부 데이터를 담는 데 사용됩니다. 이것은 작은 집합은 고정 크기(튜플 저장과 매우 흡사함)이고, 중형과 대형 집합은 별도의 가변 크기 메모리 블록(리스트 저장소처럼)을 가리킨다는 점에서 @ref{64d,,PyDictObject}와 비슷합니다. 이 구조체의 필드는 아무것도 공개되지 않은 것으로 취급되어야 하며, 모두 변경될 수 있습니다. 모든 액세스는 구조체의 값을 조작하기보다는 설명된 API를 통해 수행해야 합니다.
@end deffn

@geindex PySet_Type (C var)
@anchor{c-api/set c PySet_Type}@anchor{50ef}
@deffn {C 변수} @ref{c9b,,PyTypeObject} PySet_Type
` Part of the @ref{774,,안정 ABI}.'
이것은 파이썬 @ref{184,,set} 형을 나타내는 @ref{c9b,,PyTypeObject}의 인스턴스입니다.
@end deffn

@geindex PyFrozenSet_Type (C var)
@anchor{c-api/set c PyFrozenSet_Type}@anchor{506b}
@deffn {C 변수} @ref{c9b,,PyTypeObject} PyFrozenSet_Type
` Part of the @ref{774,,안정 ABI}.'
이것은 파이썬 @ref{7f1,,frozenset} 형을 나타내는 @ref{c9b,,PyTypeObject}의 인스턴스입니다.
@end deffn

다음 형 검사 매크로는 모든 파이썬 객체에 대한 포인터에서 작동합니다. 마찬가지로, 생성자 함수는 모든 이터러블 파이썬 객체에서 작동합니다.

@geindex PySet_Check (C function)
@anchor{c-api/set c PySet_Check}@anchor{5409}
@deffn {C 함수} int PySet_Check (PyObject *p)

`p'가 @ref{184,,set} 객체나 서브 형의 인스턴스면 참을 반환합니다. 이 함수는 항상 성공합니다.
@end deffn

@geindex PyFrozenSet_Check (C function)
@anchor{c-api/set c PyFrozenSet_Check}@anchor{540a}
@deffn {C 함수} int PyFrozenSet_Check (PyObject *p)

`p'가 @ref{7f1,,frozenset} 객체나 서브 형의 인스턴스면 참을 반환합니다. 이 함수는 항상 성공합니다.
@end deffn

@geindex PyAnySet_Check (C function)
@anchor{c-api/set c PyAnySet_Check}@anchor{540b}
@deffn {C 함수} int PyAnySet_Check (PyObject *p)

`p'가 @ref{184,,set} 객체, @ref{7f1,,frozenset} 객체 또는 서브 형의 인스턴스면 참을 반환합니다. 이 함수는 항상 성공합니다.
@end deffn

@geindex PySet_CheckExact (C function)
@anchor{c-api/set c PySet_CheckExact}@anchor{a9d}
@deffn {C 함수} int PySet_CheckExact (PyObject *p)

`p'가 @ref{184,,set} 객체이지만, 서브 형의 인스턴스는 아니면 참을 반환합니다. 이 함수는 항상 성공합니다.


Added in version 3.10.

@end deffn

@geindex PyAnySet_CheckExact (C function)
@anchor{c-api/set c PyAnySet_CheckExact}@anchor{540c}
@deffn {C 함수} int PyAnySet_CheckExact (PyObject *p)

`p'가 @ref{184,,set} 객체나 @ref{7f1,,frozenset} 객체이지만, 서브 형의 인스턴스는 아니면 참을 반환합니다. 이 함수는 항상 성공합니다.
@end deffn

@geindex PyFrozenSet_CheckExact (C function)
@anchor{c-api/set c PyFrozenSet_CheckExact}@anchor{540d}
@deffn {C 함수} int PyFrozenSet_CheckExact (PyObject *p)

`p'가 @ref{7f1,,frozenset} 객체이지만, 서브 형의 인스턴스는 아니면 참을 반환합니다. 이 함수는 항상 성공합니다.
@end deffn

@geindex PySet_New (C function)
@anchor{c-api/set c PySet_New}@anchor{1649}
@deffn {C 함수} @ref{5dc,,PyObject} *PySet_New (PyObject *iterable)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
`iterable'에 의해 반환된 객체를 포함하는 새로운 @ref{184,,set}을 반환합니다. `iterable'은 새로운 빈 집합을 만들기 위해 @code{NULL} 일 수 있습니다. 성공하면 새 집합을, 실패하면 @code{NULL}을 반환합니다. `iterable'이 실제로 이터러블이 아니면 @ref{198,,TypeError}를 발생시킵니다. 생성자는 집합을 복사할 때도 유용합니다 (@code{c=set(s)}).
@end deffn

@geindex PyFrozenSet_New (C function)
@anchor{c-api/set c PyFrozenSet_New}@anchor{164a}
@deffn {C 함수} @ref{5dc,,PyObject} *PyFrozenSet_New (PyObject *iterable)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
`iterable'에 의해 반환된 객체를 포함한 새로운 @ref{7f1,,frozenset}을 반환합니다. `iterable'은 새로운 빈 frozenset을 만들기 위해 @code{NULL} 일 수 있습니다. 성공하면 새 집합을, 실패하면 @code{NULL}을 반환합니다. `iterable'이 실제로 이터러블이 아니면 @ref{198,,TypeError}를 발생시킵니다.
@end deffn

@ref{184,,set} 이나 @ref{7f1,,frozenset}의 인스턴스 또는 그들의 서브 형의 인스턴스에 대해 다음 함수와 매크로를 사용할 수 있습니다.

@geindex PySet_Size (C function)
@anchor{c-api/set c PySet_Size}@anchor{164e}
@deffn {C 함수} @ref{c54,,Py_ssize_t} PySet_Size (PyObject *anyset)
` Part of the @ref{774,,안정 ABI}.'
@geindex 내장 함수;len

@ref{184,,set} 이나 @ref{7f1,,frozenset} 객체의 길이를 반환합니다. @code{len(anyset)}와 동등합니다. `anyset'이 @code{set}, @code{frozenset} 또는 서브 형의 인스턴스가 아니면 @ref{794,,SystemError}를 발생시킵니다.
@end deffn

@geindex PySet_GET_SIZE (C function)
@anchor{c-api/set c PySet_GET_SIZE}@anchor{540e}
@deffn {C 함수} @ref{c54,,Py_ssize_t} PySet_GET_SIZE (PyObject *anyset)

에러 검사 없는 @ref{164e,,PySet_Size()}의 매크로 형식.
@end deffn

@geindex PySet_Contains (C function)
@anchor{c-api/set c PySet_Contains}@anchor{164d}
@deffn {C 함수} int PySet_Contains (PyObject *anyset, PyObject *key)
` Part of the @ref{774,,안정 ABI}.'
발견되면 @code{1}을, 발견되지 않으면 @code{0}을, 에러가 발생하면 @code{-1}을 반환합니다. 파이썬 @ref{15be,,__contains__()} 메서드와는 달리, 이 함수는 해시 불가능한 집합을 임시 frozenset으로 자동 변환하지 않습니다. `key'가 해시 불가능하면, @ref{198,,TypeError}를 발생시킵니다. `anyset'이 @ref{184,,set}, @ref{7f1,,frozenset} 또는 서브 형의 인스턴스가 아니면 @ref{794,,SystemError}를 발생시킵니다.
@end deffn

@geindex PySet_Add (C function)
@anchor{c-api/set c PySet_Add}@anchor{164b}
@deffn {C 함수} int PySet_Add (PyObject *set, PyObject *key)
` Part of the @ref{774,,안정 ABI}.'
`key'를 @ref{184,,set} 인스턴스에 추가합니다. 또한 @ref{7f1,,frozenset} 인스턴스에도 작동합니다 (@ref{4ef7,,PyTuple_SetItem()}처럼 다른 코드에 노출되기 전에 새로운 frozenset의 값을 채우는 데 사용할 수 있습니다). 성공하면 @code{0}을, 실패하면 @code{-1}을 반환합니다. `key'가 해시 불가능하면, @ref{198,,TypeError}를 발생시킵니다. 성장할 공간이 없다면 @ref{175f,,MemoryError}를 발생시킵니다. `set'이 @code{set} 이나 그 서브 형의 인스턴스가 아니면 @ref{794,,SystemError}를 발생시킵니다.
@end deffn

다음 함수는 @ref{184,,set} 이나 그것의 서브 형의 인스턴스에는 사용할 수 있지만, @ref{7f1,,frozenset} 이나 그 서브 형의 인스턴스에는 사용할 수 없습니다.

@geindex PySet_Discard (C function)
@anchor{c-api/set c PySet_Discard}@anchor{164c}
@deffn {C 함수} int PySet_Discard (PyObject *set, PyObject *key)
` Part of the @ref{774,,안정 ABI}.'
Return @code{1} if found and removed, @code{0} if not found (no action taken), and @code{-1} if an
error is encountered.  Does not raise @ref{5e5,,KeyError} for missing keys.  Raise a
@ref{198,,TypeError} if the `key' is unhashable.  Unlike the Python @ref{26a4,,discard()}
method, this function does not automatically convert unhashable sets into
temporary frozensets. Raise @ref{794,,SystemError} if `set' is not an
instance of @ref{184,,set} or its subtype.
@end deffn

@geindex PySet_Pop (C function)
@anchor{c-api/set c PySet_Pop}@anchor{50ee}
@deffn {C 함수} @ref{5dc,,PyObject} *PySet_Pop (PyObject *set)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
`set'에 들어있는 임의의 객체에 대한 새 참조를 반환하고, `set'에서 객체를 제거합니다. 실패하면 @code{NULL}을 반환합니다. 집합이 비어 있으면, @ref{5e5,,KeyError}를 발생시킵니다. `set'이 @ref{184,,set} 이나 그 서브 형의 인스턴스가 아니면 @ref{794,,SystemError}를 발생시킵니다.
@end deffn

@geindex PySet_Clear (C function)
@anchor{c-api/set c PySet_Clear}@anchor{50ed}
@deffn {C 함수} int PySet_Clear (PyObject *set)
` Part of the @ref{774,,안정 ABI}.'
기존의 모든 요소 집합을 비웁니다. 성공하면 @code{0}을 반환합니다. `set'이 @ref{184,,set}이나 그 서브타입의 인스턴스가 아니면 @ref{794,,SystemError}를 발생시키고 @code{-1}을 반환합니다.
@end deffn

@menu
* Deprecated API: Deprecated API<3>. 

@end menu

@node Deprecated API<3>,,,집합 객체
@anchor{c-api/set deprecated-api}@anchor{540f}
@subsubsection Deprecated API


@geindex PySet_MINSIZE (C macro)
@anchor{c-api/set c PySet_MINSIZE}@anchor{5410}
@deffn {C 매크로} PySet_MINSIZE

A @ref{23d,,soft deprecated} constant representing the size of an internal
preallocated table inside @ref{5408,,PySetObject} instances.

This is documented solely for completeness, as there are no guarantees
that a given version of CPython uses preallocated tables with a fixed
size.
In code that does not deal with unstable set internals,
@code{PySet_MINSIZE} can be replaced with a small constant like @code{8}.

If looking for the size of a set, use @ref{164e,,PySet_Size()} instead.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 함수 객체,기타 객체<2>,컨테이너 객체,구상 객체 계층
@anchor{c-api/concrete function-objects}@anchor{5411}@anchor{c-api/concrete otherobjects}@anchor{5412}
@subsection 함수 객체


@menu
* 함수 객체: 함수 객체<2>. 
* 인스턴스 메서드 객체:: 
* 메서드 객체: 메서드 객체<2>. 
* 셀 객체:: 
* 코드 객체: 코드 객체<2>. 
* Code Object Flags:: 
* Extra information:: 

@end menu

@node 함수 객체<2>,인스턴스 메서드 객체,,함수 객체
@anchor{c-api/function doc}@anchor{5413}@anchor{c-api/function function-objects}@anchor{5414}@anchor{c-api/function id1}@anchor{5415}
@subsubsection 함수 객체


@geindex 객체;함수

파이썬 함수와 관련된 몇 가지 함수가 있습니다.

@geindex PyFunctionObject (C type)
@anchor{c-api/function c PyFunctionObject}@anchor{782}
@deffn {C 자료형} type PyFunctionObject

함수에 사용되는 C 구조체.
@end deffn

@geindex PyFunction_Type (C var)
@anchor{c-api/function c PyFunction_Type}@anchor{5416}
@deffn {C 변수} @ref{c9b,,PyTypeObject} PyFunction_Type

@geindex MethodType (types 모듈)

이것은 @ref{c9b,,PyTypeObject}의 인스턴스이며 파이썬 함수 형을 나타냅니다. 파이썬 프로그래머에게 @code{types.FunctionType}으로 노출됩니다.
@end deffn

@geindex PyFunction_Check (C function)
@anchor{c-api/function c PyFunction_Check}@anchor{5417}
@deffn {C 함수} int PyFunction_Check (PyObject *o)

`o'가 함수 객체(@ref{5416,,PyFunction_Type} 형)면 참을 반환합니다. 매개 변수는 @code{NULL}이 아니어야 합니다. 이 함수는 항상 성공합니다.
@end deffn

@geindex PyFunction_New (C function)
@anchor{c-api/function c PyFunction_New}@anchor{5418}
@deffn {C 함수} @ref{5dc,,PyObject} *PyFunction_New (PyObject *code, PyObject *globals)
`반환값: 새 참조.'
코드 객체 `code'와 연관된 새 함수 객체를 반환합니다. `globals'는 함수에서 액세스할 수 있는 전역 변수가 있는 딕셔너리이어야 합니다.

함수의 독스트링과 이름은 코드 객체에서 가져옵니다. @ref{2347,,__module__}은 `globals'에서 가져옵니다. 인자 기본값, 어노테이션 및 클로저는 @code{NULL}로 설정됩니다. @ref{2346,,__qualname__}은 코드 객체의 @ref{2386,,co_qualname} 필드와 같은 값으로 설정됩니다.
@end deffn

@geindex PyFunction_NewWithQualName (C function)
@anchor{c-api/function c PyFunction_NewWithQualName}@anchor{5419}
@deffn {C 함수} @ref{5dc,,PyObject} *PyFunction_NewWithQualName (PyObject *code, PyObject *globals, PyObject *qualname)
`반환값: 새 참조.'
@ref{5418,,PyFunction_New()}와 비슷하지만, 함수 객체의 @ref{2346,,__qualname__} 어트리뷰트를 설정할 수도 있도록 합니다. `qualname'는 유니코드 객체나 @code{NULL}이어야 합니다; @code{NULL}이면, @code{__qualname__} 어트리뷰트는 코드 객체의 @ref{2386,,co_qualname} 필드와 같은 값으로 설정됩니다.


Added in version 3.3.

@end deffn

@geindex PyFunction_GetCode (C function)
@anchor{c-api/function c PyFunction_GetCode}@anchor{541a}
@deffn {C 함수} @ref{5dc,,PyObject} *PyFunction_GetCode (PyObject *op)
`반환값: 빌린 참조.'
함수 객체 `op'와 연관된 코드 객체를 반환합니다.
@end deffn

@geindex PyFunction_GetGlobals (C function)
@anchor{c-api/function c PyFunction_GetGlobals}@anchor{541b}
@deffn {C 함수} @ref{5dc,,PyObject} *PyFunction_GetGlobals (PyObject *op)
`반환값: 빌린 참조.'
함수 객체 `op'와 연관된 전역 딕셔너리를 반환합니다.
@end deffn

@geindex PyFunction_GetModule (C function)
@anchor{c-api/function c PyFunction_GetModule}@anchor{541c}
@deffn {C 함수} @ref{5dc,,PyObject} *PyFunction_GetModule (PyObject *op)
`반환값: 빌린 참조.'
@ref{59b,,함수 객체} `op'의 @ref{2347,,__module__} 어트리뷰트에 대한 @ref{3d7,,빌린 참조}를 반환합니다. `NULL'일 수 있습니다.

이것은 일반적으로 모듈 이름을 포함하는 @ref{169,,문자열}이지만, 파이썬 코드로 다른 객체로 설정할 수 있습니다.
@end deffn

@geindex PyFunction_GetDefaults (C function)
@anchor{c-api/function c PyFunction_GetDefaults}@anchor{541d}
@deffn {C 함수} @ref{5dc,,PyObject} *PyFunction_GetDefaults (PyObject *op)
`반환값: 빌린 참조.'
함수 객체 `op'의 인자 기본값을 반환합니다. 이는 인자의 튜플이나 @code{NULL}일 수 있습니다.
@end deffn

@geindex PyFunction_SetDefaults (C function)
@anchor{c-api/function c PyFunction_SetDefaults}@anchor{541e}
@deffn {C 함수} int PyFunction_SetDefaults (PyObject *op, PyObject *defaults)

함수 객체 `op'의 인자 기본값을 설정합니다. `defaults'는 @code{Py_None} 이나 튜플이어야 합니다.

실패하면 @ref{794,,SystemError}를 발생시키고 @code{-1}을 반환합니다.
@end deffn

@geindex PyFunction_SetVectorcall (C function)
@anchor{c-api/function c PyFunction_SetVectorcall}@anchor{781}
@deffn {C 함수} void PyFunction_SetVectorcall (PyFunctionObject *func, vectorcallfunc vectorcall)

Set the vectorcall field of a given function object `func'.

Warning: extensions using this API must preserve the behavior
of the unaltered (default) vectorcall function!


Added in version 3.12.

@end deffn

@geindex PyFunction_GetKwDefaults (C function)
@anchor{c-api/function c PyFunction_GetKwDefaults}@anchor{541f}
@deffn {C 함수} @ref{5dc,,PyObject} *PyFunction_GetKwDefaults (PyObject *op)
`반환값: 빌린 참조.'
Return the keyword-only argument default values of the function object `op'. This can be a
dictionary of arguments or @code{NULL}.
@end deffn

@geindex PyFunction_SetKwDefaults (C function)
@anchor{c-api/function c PyFunction_SetKwDefaults}@anchor{5420}
@deffn {C 함수} int PyFunction_SetKwDefaults (PyObject *op, PyObject *defaults)

Set the keyword-only argument default values of the function object `op'.
`defaults' must be a dictionary of keyword-only arguments or @code{Py_None}.

This function returns @code{0} on success, and returns @code{-1} with an exception
set on failure.
@end deffn

@geindex PyFunction_GetClosure (C function)
@anchor{c-api/function c PyFunction_GetClosure}@anchor{5421}
@deffn {C 함수} @ref{5dc,,PyObject} *PyFunction_GetClosure (PyObject *op)
`반환값: 빌린 참조.'
함수 객체 `op'와 연관된 클로저를 반환합니다. 이것은 @code{NULL} 이나 셀 객체의 튜플일 수 있습니다.
@end deffn

@geindex PyFunction_SetClosure (C function)
@anchor{c-api/function c PyFunction_SetClosure}@anchor{5422}
@deffn {C 함수} int PyFunction_SetClosure (PyObject *op, PyObject *closure)

함수 객체 `op'와 연관된 클로저를 설정합니다. `closure'는 @code{Py_None} 이나 셀 객체의 튜플이어야 합니다.

실패하면 @ref{794,,SystemError}를 발생시키고 @code{-1}을 반환합니다.
@end deffn

@geindex PyFunction_GetAnnotations (C function)
@anchor{c-api/function c PyFunction_GetAnnotations}@anchor{1b35}
@deffn {C 함수} @ref{5dc,,PyObject} *PyFunction_GetAnnotations (PyObject *op)
`반환값: 빌린 참조.'
함수 객체 `op'의 어노테이션을 반환합니다. 이것은 가변 딕셔너리나 @code{NULL} 일 수 있습니다.
@end deffn

@geindex PyFunction_SetAnnotations (C function)
@anchor{c-api/function c PyFunction_SetAnnotations}@anchor{5423}
@deffn {C 함수} int PyFunction_SetAnnotations (PyObject *op, PyObject *annotations)

함수 객체 `op'의 어노테이션을 설정합니다. `annotations'은 딕셔너리나 @code{Py_None} 이어야 합니다.

실패하면 @ref{794,,SystemError}를 발생시키고 @code{-1}을 반환합니다.
@end deffn

@geindex PyFunction_GET_CODE (C function)
@geindex PyFunction_GET_GLOBALS (C function)
@geindex PyFunction_GET_MODULE (C function)
@geindex PyFunction_GET_DEFAULTS (C function)
@geindex PyFunction_GET_KW_DEFAULTS (C function)
@geindex PyFunction_GET_CLOSURE (C function)
@geindex PyFunction_GET_ANNOTATIONS (C function)
@anchor{c-api/function c PyFunction_GET_CODE}@anchor{5424}
@deffn {C 함수} @ref{5dc,,PyObject} *PyFunction_GET_CODE (PyObject *op)
@anchor{c-api/function c PyFunction_GET_GLOBALS}@anchor{5425}
@deffnx {C 함수} @ref{5dc,,PyObject} *PyFunction_GET_GLOBALS (PyObject *op)
@anchor{c-api/function c PyFunction_GET_MODULE}@anchor{5426}
@deffnx {C 함수} @ref{5dc,,PyObject} *PyFunction_GET_MODULE (PyObject *op)
@anchor{c-api/function c PyFunction_GET_DEFAULTS}@anchor{5427}
@deffnx {C 함수} @ref{5dc,,PyObject} *PyFunction_GET_DEFAULTS (PyObject *op)
@anchor{c-api/function c PyFunction_GET_KW_DEFAULTS}@anchor{5428}
@deffnx {C 함수} @ref{5dc,,PyObject} *PyFunction_GET_KW_DEFAULTS (PyObject *op)
@anchor{c-api/function c PyFunction_GET_CLOSURE}@anchor{5429}
@deffnx {C 함수} @ref{5dc,,PyObject} *PyFunction_GET_CLOSURE (PyObject *op)
@anchor{c-api/function c PyFunction_GET_ANNOTATIONS}@anchor{542a}
@deffnx {C 함수} @ref{5dc,,PyObject} *PyFunction_GET_ANNOTATIONS (PyObject *op)
`반환값: 빌린 참조.'
These functions are similar to their @code{PyFunction_Get*} counterparts, but
do not do type checking. Passing anything other than an instance of
@ref{5416,,PyFunction_Type} is undefined behavior.
@end deffn

@geindex PyFunction_AddWatcher (C function)
@anchor{c-api/function c PyFunction_AddWatcher}@anchor{542b}
@deffn {C 함수} int PyFunction_AddWatcher (PyFunction_WatchCallback callback)

Register `callback' as a function watcher for the current interpreter.
Return an ID which may be passed to @ref{542c,,PyFunction_ClearWatcher()}.
In case of error (e.g. no more watcher IDs available),
return @code{-1} and set an exception.


Added in version 3.12.

@end deffn

@geindex PyFunction_ClearWatcher (C function)
@anchor{c-api/function c PyFunction_ClearWatcher}@anchor{542c}
@deffn {C 함수} int PyFunction_ClearWatcher (int watcher_id)

Clear watcher identified by `watcher_id' previously returned from
@ref{542b,,PyFunction_AddWatcher()} for the current interpreter.
Return @code{0} on success, or @code{-1} and set an exception on error
(e.g.  if the given `watcher_id' was never registered.)


Added in version 3.12.

@end deffn

@geindex PyFunction_WatchEvent (C type)
@anchor{c-api/function c PyFunction_WatchEvent}@anchor{542d}
@deffn {C 자료형} type PyFunction_WatchEvent

@quotation

Enumeration of possible function watcher events:


@itemize -

@item 
@code{PyFunction_EVENT_CREATE}

@item 
@code{PyFunction_EVENT_DESTROY}

@item 
@code{PyFunction_EVENT_MODIFY_CODE}

@item 
@code{PyFunction_EVENT_MODIFY_DEFAULTS}

@item 
@code{PyFunction_EVENT_MODIFY_KWDEFAULTS}
@end itemize
@end quotation


Added in version 3.12.

@end deffn

@geindex PyFunction_WatchCallback (C type)
@anchor{c-api/function c PyFunction_WatchCallback}@anchor{542e}
@deffn {C 자료형} typedef int (*PyFunction_WatchCallback)(@ref{542d,,PyFunction_WatchEvent} event, @ref{782,,PyFunctionObject} *func, @ref{5dc,,PyObject} *new_value)

Type of a function watcher callback function.

If `event' is @code{PyFunction_EVENT_CREATE} or @code{PyFunction_EVENT_DESTROY}
then `new_value' will be @code{NULL}. Otherwise, `new_value' will hold a
@ref{3d7,,borrowed reference} to the new value that is about to be stored in
`func' for the attribute that is being modified.

The callback may inspect but must not modify `func'; doing so could have
unpredictable effects, including infinite recursion.

If `event' is @code{PyFunction_EVENT_CREATE}, then the callback is invoked
after `func' has been fully initialized. Otherwise, the callback is invoked
before the modification to `func' takes place, so the prior state of `func'
can be inspected. The runtime is permitted to optimize away the creation of
function objects when possible. In such cases no event will be emitted.
Although this creates the possibility of an observable difference of
runtime behavior depending on optimization decisions, it does not change
the semantics of the Python code being executed.

If `event' is @code{PyFunction_EVENT_DESTROY},  Taking a reference in the
callback to the about-to-be-destroyed function will resurrect it, preventing
it from being freed at this time. When the resurrected object is destroyed
later, any watcher callbacks active at that time will be called again.

If the callback sets an exception, it must return @code{-1}; this exception will
be printed as an unraisable exception using @ref{5ef,,PyErr_WriteUnraisable()}.
Otherwise it should return @code{0}.

There may already be a pending exception set on entry to the callback. In
this case, the callback should return @code{0} with the same exception still
set. This means the callback may not call any other API that can set an
exception unless it saves and clears the exception state first, and restores
it before returning.


Added in version 3.12.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 인스턴스 메서드 객체,메서드 객체<2>,함수 객체<2>,함수 객체
@anchor{c-api/method doc}@anchor{542f}@anchor{c-api/method instance-method-objects}@anchor{5430}@anchor{c-api/method instancemethod-objects}@anchor{5431}@anchor{c-api/method translation-repo}@anchor{5432}
@subsubsection 인스턴스 메서드 객체


@geindex 객체;인스턴스 메서드

인스턴스 메서드는 @ref{167d,,PyCFunction}에 대한 래퍼이며 @code{PyCFunction}를 클래스 객체에 연결하는 새로운 방법입니다. 이전의 @code{PyMethod_New(func, NULL, class)} 호출을 대체합니다.

@geindex PyInstanceMethod_Type (C var)
@anchor{c-api/method c PyInstanceMethod_Type}@anchor{5433}
@deffn {C 변수} @ref{c9b,,PyTypeObject} PyInstanceMethod_Type

이 @ref{c9b,,PyTypeObject} 인스턴스는 파이썬 인스턴스 메서드 형을 나타냅니다. 파이썬 프로그램에는 노출되지 않습니다.
@end deffn

@geindex PyInstanceMethod_Check (C function)
@anchor{c-api/method c PyInstanceMethod_Check}@anchor{5434}
@deffn {C 함수} int PyInstanceMethod_Check (PyObject *o)

`o'가 인스턴스 메서드 객체면 참을 반환합니다 (@ref{5433,,PyInstanceMethod_Type} 형입니다). 매개 변수는 @code{NULL}이 아니어야 합니다. 이 함수는 항상 성공합니다.
@end deffn

@geindex PyInstanceMethod_New (C function)
@anchor{c-api/method c PyInstanceMethod_New}@anchor{5435}
@deffn {C 함수} @ref{5dc,,PyObject} *PyInstanceMethod_New (PyObject *func)
`반환값: 새 참조.'
새 인스턴스 메서드 객체를 반환합니다. `func'는 임의의 콜러블 객체입니다. `func'는 인스턴스 메서드가 호출될 때 호출될 함수입니다.
@end deffn

@geindex PyInstanceMethod_Function (C function)
@anchor{c-api/method c PyInstanceMethod_Function}@anchor{5436}
@deffn {C 함수} @ref{5dc,,PyObject} *PyInstanceMethod_Function (PyObject *im)
`반환값: 빌린 참조.'
인스턴스 메서드 `im'과 연관된 함수 객체를 반환합니다.
@end deffn

@geindex PyInstanceMethod_GET_FUNCTION (C function)
@anchor{c-api/method c PyInstanceMethod_GET_FUNCTION}@anchor{5437}
@deffn {C 함수} @ref{5dc,,PyObject} *PyInstanceMethod_GET_FUNCTION (PyObject *im)
`반환값: 빌린 참조.'
오류 검사를 피하는 @ref{5436,,PyInstanceMethod_Function()}의 매크로 버전.
@end deffn

@node 메서드 객체<2>,셀 객체,인스턴스 메서드 객체,함수 객체
@anchor{c-api/method id1}@anchor{5438}@anchor{c-api/method method-objects}@anchor{5439}
@subsubsection 메서드 객체


@geindex 객체;메서드

메서드는 연결된(bound) 함수 객체입니다. 메서드는 항상 사용자 정의 클래스의 인스턴스에 연결됩니다. 연결되지 않은(unbound) 메서드(클래스 객체에 연결된 메서드)는 더는 사용할 수 없습니다.

@geindex PyMethod_Type (C var)
@anchor{c-api/method c PyMethod_Type}@anchor{543a}
@deffn {C 변수} @ref{c9b,,PyTypeObject} PyMethod_Type

@geindex MethodType (types 모듈)

이 @ref{c9b,,PyTypeObject} 인스턴스는 파이썬 메서드 형을 나타냅니다. 이것은 파이썬 프로그램에 @code{types.MethodType}로 노출됩니다.
@end deffn

@geindex PyMethod_Check (C function)
@anchor{c-api/method c PyMethod_Check}@anchor{543b}
@deffn {C 함수} int PyMethod_Check (PyObject *o)

`o'가 메서드 객체면 참을 반환합니다 (@ref{543a,,PyMethod_Type} 형입니다). 매개 변수는 @code{NULL}이 아니어야 합니다. 이 함수는 항상 성공합니다.
@end deffn

@geindex PyMethod_New (C function)
@anchor{c-api/method c PyMethod_New}@anchor{543c}
@deffn {C 함수} @ref{5dc,,PyObject} *PyMethod_New (PyObject *func, PyObject *self)
`반환값: 새 참조.'
새로운 메서드 객체를 돌려줍니다. `func'는 임의의 콜러블 객체이며, `self'는 메서드가 연결되어야 할 인스턴스입니다. `func'는 메서드가 호출될 때 호출될 함수입니다. `self'는 @code{NULL}이 아니어야 합니다.
@end deffn

@geindex PyMethod_Function (C function)
@anchor{c-api/method c PyMethod_Function}@anchor{543d}
@deffn {C 함수} @ref{5dc,,PyObject} *PyMethod_Function (PyObject *meth)
`반환값: 빌린 참조.'
`meth' 메서드와 연관된 함수 객체를 반환합니다.
@end deffn

@geindex PyMethod_GET_FUNCTION (C function)
@anchor{c-api/method c PyMethod_GET_FUNCTION}@anchor{543e}
@deffn {C 함수} @ref{5dc,,PyObject} *PyMethod_GET_FUNCTION (PyObject *meth)
`반환값: 빌린 참조.'
오류 검사를 피하는 @ref{543d,,PyMethod_Function()}의 매크로 버전.
@end deffn

@geindex PyMethod_Self (C function)
@anchor{c-api/method c PyMethod_Self}@anchor{543f}
@deffn {C 함수} @ref{5dc,,PyObject} *PyMethod_Self (PyObject *meth)
`반환값: 빌린 참조.'
`meth' 메서드와 연관된 인스턴스를 반환합니다.
@end deffn

@geindex PyMethod_GET_SELF (C function)
@anchor{c-api/method c PyMethod_GET_SELF}@anchor{5440}
@deffn {C 함수} @ref{5dc,,PyObject} *PyMethod_GET_SELF (PyObject *meth)
`반환값: 빌린 참조.'
오류 검사를 피하는 @ref{543f,,PyMethod_Self()}의 매크로 버전.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 셀 객체,코드 객체<2>,메서드 객체<2>,함수 객체
@anchor{c-api/cell doc}@anchor{5441}@anchor{c-api/cell cell-objects}@anchor{90f}@anchor{c-api/cell id1}@anchor{5442}@anchor{c-api/cell translation-repo}@anchor{5443}
@subsubsection 셀 객체


“Cell” objects are used to implement variables referenced by multiple scopes.
For each such variable, a cell object is created to store the value; the local
variables of each stack frame that references the value contain a reference to
the cells from outer scopes which also use that variable.  When the value is
accessed, the value contained in the cell is used instead of the cell object
itself.  This de-referencing of the cell object requires support from the
generated byte-code; these are not automatically de-referenced when accessed.
Cell objects are not likely to be useful elsewhere.

@geindex PyCellObject (C type)
@anchor{c-api/cell c PyCellObject}@anchor{5444}
@deffn {C 자료형} type PyCellObject

셀 객체에 사용되는 C 구조체.
@end deffn

@geindex PyCell_Type (C var)
@anchor{c-api/cell c PyCell_Type}@anchor{5445}
@deffn {C 변수} @ref{c9b,,PyTypeObject} PyCell_Type

셀 객체에 해당하는 형 객체.
@end deffn

@geindex PyCell_Check (C function)
@anchor{c-api/cell c PyCell_Check}@anchor{5446}
@deffn {C 함수} int PyCell_Check (PyObject *ob)

`ob'가 셀 객체면 참을 반환합니다; `ob'는 @code{NULL}이 아니어야 합니다. 이 함수는 항상 성공합니다.
@end deffn

@geindex PyCell_New (C function)
@anchor{c-api/cell c PyCell_New}@anchor{5447}
@deffn {C 함수} @ref{5dc,,PyObject} *PyCell_New (PyObject *ob)
`반환값: 새 참조.'
`ob' 값을 포함하는 새 셀 객체를 만들고 반환합니다. 매개 변수는 @code{NULL} 일 수 있습니다.
@end deffn

@geindex PyCell_Get (C function)
@anchor{c-api/cell c PyCell_Get}@anchor{5448}
@deffn {C 함수} @ref{5dc,,PyObject} *PyCell_Get (PyObject *cell)
`반환값: 새 참조.'
셀 `cell'의 내용을 반환합니다. `cell'은 @code{NULL}일 수 있습니다. `cell'이 셀 객체가 아니면, @code{NULL}을 반환하고 예외를 설정합니다.
@end deffn

@geindex PyCell_GET (C function)
@anchor{c-api/cell c PyCell_GET}@anchor{5449}
@deffn {C 함수} @ref{5dc,,PyObject} *PyCell_GET (PyObject *cell)
`반환값: 빌린 참조.'
셀 `cell'의 내용을 반환하지만, `cell'이 @code{NULL}이 아닌지와 셀 객체인지를 확인하지 않습니다.
@end deffn

@geindex PyCell_Set (C function)
@anchor{c-api/cell c PyCell_Set}@anchor{544a}
@deffn {C 함수} int PyCell_Set (PyObject *cell, PyObject *value)

셀 객체 `cell'의 내용을 `value'로 설정합니다. 이렇게 하면 셀의 현재 내용에 대한 참조를 해제합니다. `value'는 @code{NULL} 일 수 있습니다. `cell'는 @code{NULL}이 아니어야 합니다.

성공하면, @code{0}을 반환합니다. `cell'이 셀 객체가 아니면, 예외를 설정하고 @code{-1}을 반환합니다.
@end deffn

@geindex PyCell_SET (C function)
@anchor{c-api/cell c PyCell_SET}@anchor{aab}
@deffn {C 함수} void PyCell_SET (PyObject *cell, PyObject *value)

셀 객체 `cell'의 값을 `value'로 설정합니다. 참조 횟수는 조정되지 않고, 안전을 위한 검사가 이루어지지 않습니다; `cell'은 @code{NULL}이 아니어야 하고 셀 객체여야 합니다.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@geindex 객체;코드
@geindex 코드 객체

@node 코드 객체<2>,Code Object Flags,셀 객체,함수 객체
@anchor{c-api/code doc}@anchor{544b}@anchor{c-api/code code-objects}@anchor{544c}@anchor{c-api/code codeobjects}@anchor{7d1}@anchor{c-api/code translation-repo}@anchor{544d}
@subsubsection 코드 객체


코드 객체는 CPython 구현의 저수준 세부 사항입니다. 각 객체는 아직 함수에 묶여 있지 않은 실행 가능한 코드 덩어리를 나타냅니다.

@geindex PyCodeObject (C type)
@anchor{c-api/code c PyCodeObject}@anchor{97a}
@deffn {C 자료형} type PyCodeObject

코드 객체를 설명하는 데 사용되는 객체의 C 구조체. 이 형의 필드는 언제든지 변경될 수 있습니다.
@end deffn

@geindex PyCode_Type (C var)
@anchor{c-api/code c PyCode_Type}@anchor{544e}
@deffn {C 변수} @ref{c9b,,PyTypeObject} PyCode_Type

이것은 파이썬 @ref{4e6,,코드 객체}를 나타내는 @ref{c9b,,PyTypeObject}의 인스턴스입니다.
@end deffn

@geindex PyCode_Check (C function)
@anchor{c-api/code c PyCode_Check}@anchor{544f}
@deffn {C 함수} int PyCode_Check (PyObject *co)

`co'가 @ref{4e6,,코드 객체}면 참을 반환합니다. 이 함수는 항상 성공합니다.
@end deffn

@geindex PyCode_GetNumFree (C function)
@anchor{c-api/code c PyCode_GetNumFree}@anchor{5450}
@deffn {C 함수} @ref{c54,,Py_ssize_t} PyCode_GetNumFree (PyCodeObject *co)

코드 객체에 있는 @ref{1895,,자유 (클로저) 변수}의 개수를 반환합니다.
@end deffn

@geindex PyUnstable_Code_GetFirstFree (C function)
@anchor{c-api/code c PyUnstable_Code_GetFirstFree}@anchor{625}
@deffn {C 함수} int PyUnstable_Code_GetFirstFree (PyCodeObject *co)

@cartouche
@quotation 이것은 불안정 API. It may change without warning in minor releases. `이것은 @ref{768,,불안정 API}. It may change without warning in minor releases.'
@end quotation
@end cartouche

Return the position of the first @ref{1895,,free (closure) variable}
in a code object.


버전 3.13에서 변경: Renamed from @code{PyCode_GetFirstFree} as part of @ref{768,,Unstable C API}.
The old name is deprecated, but will remain available until the
signature changes again.

@end deffn

@geindex PyUnstable_Code_New (C function)
@anchor{c-api/code c PyUnstable_Code_New}@anchor{5451}
@deffn {C 함수} @ref{97a,,PyCodeObject} *PyUnstable_Code_New (int argcount, int kwonlyargcount, int nlocals, int stacksize, int flags, PyObject *code, PyObject *consts, PyObject *names, PyObject *varnames, PyObject *freevars, PyObject *cellvars, PyObject *filename, PyObject *name, PyObject *qualname, int firstlineno, PyObject *linetable, PyObject *exceptiontable)

@cartouche
@quotation 이것은 불안정 API. It may change without warning in minor releases. `이것은 @ref{768,,불안정 API}. It may change without warning in minor releases.'
@end quotation
@end cartouche

새 코드 객체를 반환합니다. 프레임을 만들기 위해 더미 코드 객체가 필요하면, 대신 @ref{1555,,PyCode_NewEmpty()}를 사용하십시오.

Since the definition of the bytecode changes often, calling
@ref{5451,,PyUnstable_Code_New()} directly can bind you to a precise Python version.

The many arguments of this function are inter-dependent in complex
ways, meaning that subtle changes to values are likely to result in incorrect
execution or VM crashes. Use this function only with extreme care.


버전 3.11에서 변경: Added @code{qualname} and @code{exceptiontable} parameters.


@geindex PyCode_New (C 함수)


버전 3.12에서 변경: Renamed from @code{PyCode_New} as part of @ref{768,,Unstable C API}.
The old name is deprecated, but will remain available until the
signature changes again.

@end deffn

@geindex PyCode_NewWithPosOnlyArgs (C function)

@geindex PyUnstable_Code_NewWithPosOnlyArgs (C function)
@anchor{c-api/code c PyCode_NewWithPosOnlyArgs}@anchor{5452}@anchor{c-api/code c PyUnstable_Code_NewWithPosOnlyArgs}@anchor{5453}
@deffn {C 함수} @ref{97a,,PyCodeObject} *PyUnstable_Code_NewWithPosOnlyArgs (int argcount, int posonlyargcount, int kwonlyargcount, int nlocals, int stacksize, int flags, PyObject *code, PyObject *consts, PyObject *names, PyObject *varnames, PyObject *freevars, PyObject *cellvars, PyObject *filename, PyObject *name, PyObject *qualname, int firstlineno, PyObject *linetable, PyObject *exceptiontable)

@cartouche
@quotation 이것은 불안정 API. It may change without warning in minor releases. `이것은 @ref{768,,불안정 API}. It may change without warning in minor releases.'
@end quotation
@end cartouche

@ref{5451,,PyUnstable_Code_New()}와 비슷하지만, 위치 전용 인자를 위한 추가 “posonlyargcount”가 있습니다. @code{PyUnstable_Code_New}에 적용되는 것과 같은 주의 사항이 이 함수에도 적용됩니다.


Added in version 3.8: as @code{PyCode_NewWithPosOnlyArgs}



버전 3.11에서 변경: Added @code{qualname} and  @code{exceptiontable} parameters.



버전 3.12에서 변경: Renamed to @code{PyUnstable_Code_NewWithPosOnlyArgs}.
The old name is deprecated, but will remain available until the
signature changes again.

@end deffn

@geindex PyCode_NewEmpty (C function)
@anchor{c-api/code c PyCode_NewEmpty}@anchor{1555}
@deffn {C 함수} @ref{97a,,PyCodeObject} *PyCode_NewEmpty (const char *filename, const char *funcname, int firstlineno)
`반환값: 새 참조.'
지정된 파일명, 함수명 및 첫 번째 줄 번호를 갖는 새 빈 코드 객체를 반환합니다. 결과 코드 객체를 실행하면 @code{Exception}을 발생시킵니다.
@end deffn

@geindex PyCode_Addr2Line (C function)
@anchor{c-api/code c PyCode_Addr2Line}@anchor{a89}
@deffn {C 함수} int PyCode_Addr2Line (PyCodeObject *co, int byte_offset)

Return the line number of the instruction that occurs on or before @code{byte_offset} and ends after it.
If you just need the line number of a frame, use @ref{98d,,PyFrame_GetLineNumber()} instead.

For efficiently iterating over the line numbers in a code object, use 
@geindex Python 향상 제안; PEP 0626#out-of-process-debuggers-and-profilers
the API described in PEP 626@footnote{https://peps.python.org/pep-0626/#out-of-process-debuggers-and-profilers}.
@end deffn

@geindex PyCode_Addr2Location (C function)
@anchor{c-api/code c PyCode_Addr2Location}@anchor{7d0}
@deffn {C 함수} int PyCode_Addr2Location (PyObject *co, int byte_offset, int *start_line, int *start_column, int *end_line, int *end_column)

Sets the passed @code{int} pointers to the source code line and column numbers
for the instruction at @code{byte_offset}. Sets the value to @code{0} when
information is not available for any particular element.

Returns @code{1} if the function succeeds and 0 otherwise.


Added in version 3.11.

@end deffn

@geindex PyCode_GetCode (C function)
@anchor{c-api/code c PyCode_GetCode}@anchor{97b}
@deffn {C 함수} @ref{5dc,,PyObject} *PyCode_GetCode (PyCodeObject *co)

Equivalent to the Python code @code{getattr(co, 'co_code')}.
Returns a strong reference to a @ref{994,,PyBytesObject} representing the
bytecode in a code object. On error, @code{NULL} is returned and an exception
is raised.

This @code{PyBytesObject} may be created on-demand by the interpreter and does
not necessarily represent the bytecode actually executed by CPython. The
primary use case for this function is debuggers and profilers.


Added in version 3.11.

@end deffn

@geindex PyCode_GetVarnames (C function)
@anchor{c-api/code c PyCode_GetVarnames}@anchor{97c}
@deffn {C 함수} @ref{5dc,,PyObject} *PyCode_GetVarnames (PyCodeObject *co)

Equivalent to the Python code @code{getattr(co, 'co_varnames')}.
Returns a new reference to a @ref{5263,,PyTupleObject} containing the names of
the local variables. On error, @code{NULL} is returned and an exception
is raised.


Added in version 3.11.

@end deffn

@geindex PyCode_GetCellvars (C function)
@anchor{c-api/code c PyCode_GetCellvars}@anchor{97d}
@deffn {C 함수} @ref{5dc,,PyObject} *PyCode_GetCellvars (PyCodeObject *co)

Equivalent to the Python code @code{getattr(co, 'co_cellvars')}.
Returns a new reference to a @ref{5263,,PyTupleObject} containing the names of
the local variables that are referenced by nested functions. On error, @code{NULL}
is returned and an exception is raised.


Added in version 3.11.

@end deffn

@geindex PyCode_GetFreevars (C function)
@anchor{c-api/code c PyCode_GetFreevars}@anchor{97e}
@deffn {C 함수} @ref{5dc,,PyObject} *PyCode_GetFreevars (PyCodeObject *co)

Equivalent to the Python code @code{getattr(co, 'co_freevars')}.
Returns a new reference to a @ref{5263,,PyTupleObject} containing the names of
the @ref{1895,,free (closure) variables}. On error, @code{NULL} is returned
and an exception is raised.


Added in version 3.11.

@end deffn

@geindex PyCode_AddWatcher (C function)
@anchor{c-api/code c PyCode_AddWatcher}@anchor{786}
@deffn {C 함수} int PyCode_AddWatcher (PyCode_WatchCallback callback)

Register `callback' as a code object watcher for the current interpreter.
Return an ID which may be passed to @ref{787,,PyCode_ClearWatcher()}.
In case of error (e.g. no more watcher IDs available),
return @code{-1} and set an exception.


Added in version 3.12.

@end deffn

@geindex PyCode_ClearWatcher (C function)
@anchor{c-api/code c PyCode_ClearWatcher}@anchor{787}
@deffn {C 함수} int PyCode_ClearWatcher (int watcher_id)

Clear watcher identified by `watcher_id' previously returned from
@ref{786,,PyCode_AddWatcher()} for the current interpreter.
Return @code{0} on success, or @code{-1} and set an exception on error
(e.g. if the given `watcher_id' was never registered.)


Added in version 3.12.

@end deffn

@geindex PyCodeEvent (C type)
@anchor{c-api/code c PyCodeEvent}@anchor{5454}
@deffn {C 자료형} type PyCodeEvent

Enumeration of possible code object watcher events:
- @code{PY_CODE_EVENT_CREATE}
- @code{PY_CODE_EVENT_DESTROY}


Added in version 3.12.

@end deffn

@geindex PyCode_WatchCallback (C type)
@anchor{c-api/code c PyCode_WatchCallback}@anchor{5455}
@deffn {C 자료형} typedef int (*PyCode_WatchCallback)(@ref{5454,,PyCodeEvent} event, @ref{97a,,PyCodeObject} *co)

Type of a code object watcher callback function.

If `event' is @code{PY_CODE_EVENT_CREATE}, then the callback is invoked
after `co' has been fully initialized. Otherwise, the callback is invoked
before the destruction of `co' takes place, so the prior state of `co'
can be inspected.

If `event' is @code{PY_CODE_EVENT_DESTROY}, taking a reference in the callback
to the about-to-be-destroyed code object will resurrect it and prevent it
from being freed at this time. When the resurrected object is destroyed
later, any watcher callbacks active at that time will be called again.

Users of this API should not rely on internal runtime implementation
details. Such details may include, but are not limited to, the exact
order and timing of creation and destruction of code objects. While
changes in these details may result in differences observable by watchers
(including whether a callback is invoked or not), it does not change
the semantics of the Python code being executed.

If the callback sets an exception, it must return @code{-1}; this exception will
be printed as an unraisable exception using @ref{5ef,,PyErr_WriteUnraisable()}.
Otherwise it should return @code{0}.

There may already be a pending exception set on entry to the callback. In
this case, the callback should return @code{0} with the same exception still
set. This means the callback may not call any other API that can set an
exception unless it saves and clears the exception state first, and restores
it before returning.


Added in version 3.12.

@end deffn

@geindex PyCode_Optimize (C function)
@anchor{c-api/code c PyCode_Optimize}@anchor{5456}
@deffn {C 함수} @ref{5dc,,PyObject} *PyCode_Optimize (PyObject *code, PyObject *consts, PyObject *names, PyObject *lnotab_obj)

This is a @ref{23d,,soft deprecated} function that does nothing.

Prior to Python 3.10, this function would perform basic optimizations to a
code object.


버전 3.10에서 변경: This function now does nothing.

@end deffn

@node Code Object Flags,Extra information,코드 객체<2>,함수 객체
@anchor{c-api/code c-codeobject-flags}@anchor{5220}@anchor{c-api/code code-object-flags}@anchor{5457}
@subsubsection Code Object Flags


Code objects contain a bit-field of flags, which can be retrieved as the
@ref{18dc,,co_flags} Python attribute (for example using
@ref{5ed,,PyObject_GetAttrString()}), and set using a `flags' argument to
@ref{5451,,PyUnstable_Code_New()} and similar functions.

Flags whose names start with @code{CO_FUTURE_} correspond to features normally
selectable by @ref{45d,,future statements}. These flags can be used in
@ref{5219,,PyCompilerFlags.cf_flags}.
Note that many @code{CO_FUTURE_} flags are mandatory in current versions of
Python, and setting them has no effect.

The following flags are available.
For their meaning, see the linked documentation of their Python equivalents.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Flag

@tab

Meaning

@item

@geindex CO_OPTIMIZED (C macro)
@anchor{c-api/code c CO_OPTIMIZED}@anchor{5458}
@deffn {C 매크로} CO_OPTIMIZED
@end deffn

@tab

@ref{4a91,,inspect.CO_OPTIMIZED}

@item

@geindex CO_NEWLOCALS (C macro)
@anchor{c-api/code c CO_NEWLOCALS}@anchor{5459}
@deffn {C 매크로} CO_NEWLOCALS
@end deffn

@tab

@ref{4a92,,inspect.CO_NEWLOCALS}

@item

@geindex CO_VARARGS (C macro)
@anchor{c-api/code c CO_VARARGS}@anchor{545a}
@deffn {C 매크로} CO_VARARGS
@end deffn

@tab

@ref{4a93,,inspect.CO_VARARGS}

@item

@geindex CO_VARKEYWORDS (C macro)
@anchor{c-api/code c CO_VARKEYWORDS}@anchor{545b}
@deffn {C 매크로} CO_VARKEYWORDS
@end deffn

@tab

@ref{4a94,,inspect.CO_VARKEYWORDS}

@item

@geindex CO_NESTED (C macro)
@anchor{c-api/code c CO_NESTED}@anchor{545c}
@deffn {C 매크로} CO_NESTED
@end deffn

@tab

@ref{4a95,,inspect.CO_NESTED}

@item

@geindex CO_GENERATOR (C macro)
@anchor{c-api/code c CO_GENERATOR}@anchor{545d}
@deffn {C 매크로} CO_GENERATOR
@end deffn

@tab

@ref{4a96,,inspect.CO_GENERATOR}

@item

@geindex CO_COROUTINE (C macro)
@anchor{c-api/code c CO_COROUTINE}@anchor{545e}
@deffn {C 매크로} CO_COROUTINE
@end deffn

@tab

@ref{4a97,,inspect.CO_COROUTINE}

@item

@geindex CO_ITERABLE_COROUTINE (C macro)
@anchor{c-api/code c CO_ITERABLE_COROUTINE}@anchor{545f}
@deffn {C 매크로} CO_ITERABLE_COROUTINE
@end deffn

@tab

@ref{4a98,,inspect.CO_ITERABLE_COROUTINE}

@item

@geindex CO_ASYNC_GENERATOR (C macro)
@anchor{c-api/code c CO_ASYNC_GENERATOR}@anchor{5460}
@deffn {C 매크로} CO_ASYNC_GENERATOR
@end deffn

@tab

@ref{4a99,,inspect.CO_ASYNC_GENERATOR}

@item

@geindex CO_HAS_DOCSTRING (C macro)
@anchor{c-api/code c CO_HAS_DOCSTRING}@anchor{5461}
@deffn {C 매크로} CO_HAS_DOCSTRING
@end deffn

@tab

@ref{2394,,inspect.CO_HAS_DOCSTRING}

@item

@geindex CO_METHOD (C macro)
@anchor{c-api/code c CO_METHOD}@anchor{5462}
@deffn {C 매크로} CO_METHOD
@end deffn

@tab

@ref{4a9a,,inspect.CO_METHOD}

@item

@geindex CO_FUTURE_DIVISION (C macro)
@anchor{c-api/code c CO_FUTURE_DIVISION}@anchor{5463}
@deffn {C 매크로} CO_FUTURE_DIVISION
@end deffn

@tab

no effect (@ref{4a3f,,__future__.division})

@item

@geindex CO_FUTURE_ABSOLUTE_IMPORT (C macro)
@anchor{c-api/code c CO_FUTURE_ABSOLUTE_IMPORT}@anchor{5464}
@deffn {C 매크로} CO_FUTURE_ABSOLUTE_IMPORT
@end deffn

@tab

no effect (@ref{4a40,,__future__.absolute_import})

@item

@geindex CO_FUTURE_WITH_STATEMENT (C macro)
@anchor{c-api/code c CO_FUTURE_WITH_STATEMENT}@anchor{5465}
@deffn {C 매크로} CO_FUTURE_WITH_STATEMENT
@end deffn

@tab

no effect (@ref{4a41,,__future__.with_statement})

@item

@geindex CO_FUTURE_PRINT_FUNCTION (C macro)
@anchor{c-api/code c CO_FUTURE_PRINT_FUNCTION}@anchor{5466}
@deffn {C 매크로} CO_FUTURE_PRINT_FUNCTION
@end deffn

@tab

no effect (@ref{4a42,,__future__.print_function})

@item

@geindex CO_FUTURE_UNICODE_LITERALS (C macro)
@anchor{c-api/code c CO_FUTURE_UNICODE_LITERALS}@anchor{5467}
@deffn {C 매크로} CO_FUTURE_UNICODE_LITERALS
@end deffn

@tab

no effect (@ref{4a43,,__future__.unicode_literals})

@item

@geindex CO_FUTURE_GENERATOR_STOP (C macro)
@anchor{c-api/code c CO_FUTURE_GENERATOR_STOP}@anchor{5468}
@deffn {C 매크로} CO_FUTURE_GENERATOR_STOP
@end deffn

@tab

no effect (@ref{4a44,,__future__.generator_stop})

@item

@geindex CO_FUTURE_ANNOTATIONS (C macro)
@anchor{c-api/code c CO_FUTURE_ANNOTATIONS}@anchor{521f}
@deffn {C 매크로} CO_FUTURE_ANNOTATIONS
@end deffn

@tab

@ref{4a45,,__future__.annotations}

@end multitable


@node Extra information,,Code Object Flags,함수 객체
@anchor{c-api/code extra-information}@anchor{5469}
@subsubsection Extra information


To support low-level extensions to frame evaluation, such as external
just-in-time compilers, it is possible to attach arbitrary extra data to
code objects.

These functions are part of the unstable C API tier:
this functionality is a CPython implementation detail, and the API
may change without deprecation warnings.

@geindex _PyEval_RequestCodeExtraIndex (C function)

@geindex PyUnstable_Eval_RequestCodeExtraIndex (C function)
@anchor{c-api/code c _PyEval_RequestCodeExtraIndex}@anchor{546a}@anchor{c-api/code c PyUnstable_Eval_RequestCodeExtraIndex}@anchor{1776}
@deffn {C 함수} @ref{c54,,Py_ssize_t} PyUnstable_Eval_RequestCodeExtraIndex (freefunc free)

@cartouche
@quotation 이것은 불안정 API. It may change without warning in minor releases. `이것은 @ref{768,,불안정 API}. It may change without warning in minor releases.'
@end quotation
@end cartouche

Return a new opaque index value used to adding data to code objects.

You generally call this function once (per interpreter) and use the result
with @code{PyCode_GetExtra} and @code{PyCode_SetExtra} to manipulate
data on individual code objects.

If `free' is not @code{NULL}: when a code object is deallocated,
`free' will be called on non-@code{NULL} data stored under the new index.
Use @ref{5169,,Py_DecRef()} when storing @ref{5dc,,PyObject}.


Added in version 3.6: as @code{_PyEval_RequestCodeExtraIndex}



버전 3.12에서 변경: Renamed to @code{PyUnstable_Eval_RequestCodeExtraIndex}.
The old private name is deprecated, but will be available until the API
changes.

@end deffn

@geindex _PyCode_GetExtra (C function)

@geindex PyUnstable_Code_GetExtra (C function)
@anchor{c-api/code c _PyCode_GetExtra}@anchor{546b}@anchor{c-api/code c PyUnstable_Code_GetExtra}@anchor{1775}
@deffn {C 함수} int PyUnstable_Code_GetExtra (PyObject *code, Py_ssize_t index, void **extra)

@cartouche
@quotation 이것은 불안정 API. It may change without warning in minor releases. `이것은 @ref{768,,불안정 API}. It may change without warning in minor releases.'
@end quotation
@end cartouche

Set `extra' to the extra data stored under the given index.
Return 0 on success. Set an exception and return -1 on failure.

If no data was set under the index, set `extra' to @code{NULL} and return
0 without setting an exception.


Added in version 3.6: as @code{_PyCode_GetExtra}



버전 3.12에서 변경: Renamed to @code{PyUnstable_Code_GetExtra}.
The old private name is deprecated, but will be available until the API
changes.

@end deffn

@geindex _PyCode_SetExtra (C function)

@geindex PyUnstable_Code_SetExtra (C function)
@anchor{c-api/code c _PyCode_SetExtra}@anchor{546c}@anchor{c-api/code c PyUnstable_Code_SetExtra}@anchor{1774}
@deffn {C 함수} int PyUnstable_Code_SetExtra (PyObject *code, Py_ssize_t index, void *extra)

@cartouche
@quotation 이것은 불안정 API. It may change without warning in minor releases. `이것은 @ref{768,,불안정 API}. It may change without warning in minor releases.'
@end quotation
@end cartouche

Set the extra data stored under the given index to `extra'.
Return 0 on success. Set an exception and return -1 on failure.


Added in version 3.6: as @code{_PyCode_SetExtra}



버전 3.12에서 변경: Renamed to @code{PyUnstable_Code_SetExtra}.
The old private name is deprecated, but will be available until the API
changes.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 기타 객체<2>,C API for extension modules,함수 객체,구상 객체 계층
@anchor{c-api/concrete other-objects}@anchor{546d}
@subsection 기타 객체


@menu
* 파일 객체:: 
* 모듈 객체:: 
* Module definitions:: 
* Creating extension modules dynamically:: 
* 지원 함수:: 
* 이터레이터 객체:: 
* 디스크립터 객체:: 
* 슬라이스 객체:: 
* MemoryView 객체:: 
* Pickle buffer objects:: 
* 약한 참조 객체: 약한 참조 객체<2>. 
* 캡슐:: 
* Frame Objects:: 
* 제너레이터 객체:: 
* 코루틴 객체:: 
* 컨텍스트 변수 객체:: 
* Objects for Type Hinting:: 

@end menu

@node 파일 객체,모듈 객체,,기타 객체<2>
@anchor{c-api/file doc}@anchor{546e}@anchor{c-api/file file-objects}@anchor{546f}@anchor{c-api/file fileobjects}@anchor{5470}
@subsubsection 파일 객체


@geindex 객체;파일

이 API는 C 표준 라이브러리의 버퍼링 된 I/O (FILE*) 지원에 의존하는 내장 파일 객체에 대한 파이썬 2 C API의 최소 에뮬레이션입니다. 파이썬 3에서, 파일과 스트림은 새로운 @ref{83,,io} 모듈을 사용합니다. 이 모듈은 운영 체제의 저수준 버퍼링 되지 않은 I/O 위에 여러 계층을 정의합니다. 아래에서 설명하는 함수는 이러한 새로운 API에 대한 편리한 C 래퍼이며, 주로 인터프리터의 내부 오류 보고를 위한 것입니다; 제삼자 코드는 대신 @code{io} API에 액세스하는 것이 좋습니다.

@geindex PyFile_FromFd (C function)
@anchor{c-api/file c PyFile_FromFd}@anchor{5063}
@deffn {C 함수} @ref{5dc,,PyObject} *PyFile_FromFd (int fd, const char *name, const char *mode, int buffering, const char *encoding, const char *errors, const char *newline, int closefd)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
이미 열려있는 파일의 파일 기술자 `fd'로 파이썬 파일 객체를 만듭니다. 인자 `name', `encoding', `errors' 및 `newline'은 기본값을 사용하기 위해 @code{NULL} 일 수 있습니다; `buffering'은 기본값을 사용하기 위해 `-1' 일 수 있습니다. `name'은 무시되고, 이전 버전과의 호환성을 위해 유지됩니다. 실패 시 @code{NULL}을 반환합니다. 인자에 대한 더 자세한 설명은 @ref{73f,,io.open()} 함수 설명서를 참조하십시오.

@cartouche
@quotation 경고 
파이썬 스트림이 자체적인 버퍼링 계층을 가지고 있으므로, OS 수준의 파일 기술자와 혼합하면 여러 예기치 못한 문제가 발생할 수 있습니다 (가령 데이터의 예상치 못한 순서).
@end quotation
@end cartouche


버전 3.2에서 변경: `name' 어트리뷰트를 무시합니다.

@end deffn

@geindex PyObject_AsFileDescriptor (C function)
@anchor{c-api/file c PyObject_AsFileDescriptor}@anchor{50c7}
@deffn {C 함수} int PyObject_AsFileDescriptor (PyObject *p)
` Part of the @ref{774,,안정 ABI}.'
`p'와 관련된 파일 기술자를 int로 반환합니다. 객체가 정수면, 값이 반환됩니다. 그렇지 않으면 객체의 @ref{17b4,,fileno()} 메서드가 있으면 호출됩니다; 메서드는 반드시 정수를 반환해야 하고, 그 값이 파일 기술자 값으로 반환됩니다. 실패하면 예외를 설정하고 @code{-1}을 반환합니다.
@end deffn

@geindex PyFile_GetLine (C function)
@anchor{c-api/file c PyFile_GetLine}@anchor{5064}
@deffn {C 함수} @ref{5dc,,PyObject} *PyFile_GetLine (PyObject *p, int n)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
@geindex EOFError (내장 예외)

@code{p.readline([n])}과 동등합니다. 이 함수는 객체 `p'에서 한 줄을 읽습니다. `p'는 파일 객체나 @ref{152e,,readline()} 메서드가 있는 임의의 객체일 수 있습니다. `n'이 @code{0}이면, 줄의 길이와 관계없이 정확히 한 줄을 읽습니다. `n'이 @code{0}보다 크면, `n' 바이트 이상을 파일에서 읽지 않습니다; 불완전한 줄이 반환될 수 있습니다. 두 경우 모두, 파일 끝에 즉시 도달하면 빈 문자열이 반환됩니다. 그러나 `n'이 @code{0}보다 작으면, 길이와 관계없이 한 줄을 읽지만, 파일 끝에 즉시 도달하면 @ref{14de,,EOFError}가 발생합니다.
@end deffn

@geindex PyFile_SetOpenCodeHook (C function)
@anchor{c-api/file c PyFile_SetOpenCodeHook}@anchor{1a99}
@deffn {C 함수} int PyFile_SetOpenCodeHook (Py_OpenCodeHookFunction handler)

제공된 handler를 통해 매개 변수를 전달하도록 @ref{175c,,io.open_code()}의 일반적인 동작을 재정의합니다.

`handler'는 다음과 같은 형의 함수입니다:

@geindex Py_OpenCodeHookFunction (C type)
@anchor{c-api/file c Py_OpenCodeHookFunction}@anchor{5471}
@deffn {C 자료형} typedef @ref{5dc,,PyObject} *(*Py_OpenCodeHookFunction)(@ref{5dc,,PyObject}*, void*)

@ref{5dc,,PyObject} *(*)(PyObject *path, void *userData)와 동등합니다. 여기서 `path'는 @ref{996,,PyUnicodeObject} 임이 보장됩니다.
@end deffn

`userData' 포인터는 훅 함수로 전달됩니다. 훅 함수는 다른 런타임에서 호출될 수 있으므로, 이 포인터는 파이썬 상태를 직접 참조하면 안 됩니다.

이 훅은 의도적으로 임포트 중에 사용되므로, 고정되었거나(frozen) @code{sys.modules}에 있다고 알려진 경우가 아니라면 훅 실행 중에 새로운 모듈을 임포트하는 것을 피하십시오.

일단 훅이 설정되면, 제거하거나 교체할 수 없으며, 이후의 @ref{1a99,,PyFile_SetOpenCodeHook()}에 대한 호출은 실패합니다. 실패 시, 함수는 -1을 반환하고 인터프리터가 초기화되었으면 예외를 설정합니다.

이 함수는 @ref{460,,Py_Initialize()} 전에 호출해도 안전합니다.

인자 없이 @ref{1c6c,,감사 이벤트} @code{setopencodehook}을 발생시킵니다.


Added in version 3.8.

@end deffn

@geindex PyFile_OpenCodeObject (C function)
@anchor{c-api/file c PyFile_OpenCodeObject}@anchor{5472}
@deffn {C 함수} @ref{5dc,,PyObject} *PyFile_OpenCodeObject (PyObject *path)

Open `path' with the mode @code{'rb'}. `path' must be a Python @ref{169,,str}
object. The behavior of this function may be overridden by
@ref{1a99,,PyFile_SetOpenCodeHook()} to allow for some preprocessing of the
text.

This is analogous to @ref{175c,,io.open_code()} in Python.

On success, this function returns a @ref{5df,,strong reference} to a Python
file object. On failure, this function returns @code{NULL} with an exception
set.


Added in version 3.8.

@end deffn

@geindex PyFile_OpenCode (C function)
@anchor{c-api/file c PyFile_OpenCode}@anchor{5473}
@deffn {C 함수} @ref{5dc,,PyObject} *PyFile_OpenCode (const char *path)

Similar to @ref{5472,,PyFile_OpenCodeObject()}, but `path' is a
UTF-8 encoded const char*.


Added in version 3.8.

@end deffn

@geindex PyFile_WriteObject (C function)
@anchor{c-api/file c PyFile_WriteObject}@anchor{5065}
@deffn {C 함수} int PyFile_WriteObject (PyObject *obj, PyObject *p, int flags)
` Part of the @ref{774,,안정 ABI}.'
@geindex Py_PRINT_RAW (C 매크로)

Write object `obj' to file object `p'.  The only supported flag for `flags' is
@ref{52c6,,Py_PRINT_RAW}; if given, the @ref{169,,str()} of the object is written
instead of the @ref{1c1,,repr()}.

If `obj' is @code{NULL}, write the string @code{"<NULL>"}.

Return @code{0} on success or @code{-1} on failure; the
appropriate exception will be set.
@end deffn

@geindex PyFile_WriteString (C function)
@anchor{c-api/file c PyFile_WriteString}@anchor{5066}
@deffn {C 함수} int PyFile_WriteString (const char *s, PyObject *p)
` Part of the @ref{774,,안정 ABI}.'
문자열 `s'를 파일 객체 `p'에 씁니다. 성공하면 @code{0}을 반환하고, 실패하면 @code{-1}을 반환합니다; 적절한 예외가 설정됩니다.
@end deffn

@menu
* Deprecated API: Deprecated API<4>. 

@end menu

@node Deprecated API<4>,,,파일 객체
@anchor{c-api/file deprecated-api}@anchor{5474}
@subsubsection Deprecated API


These are @ref{23d,,soft deprecated} APIs that were included in Python’s C API
by mistake. They are documented solely for completeness; use other
@code{PyFile*} APIs instead.

@geindex PyFile_NewStdPrinter (C function)
@anchor{c-api/file c PyFile_NewStdPrinter}@anchor{5475}
@deffn {C 함수} @ref{5dc,,PyObject} *PyFile_NewStdPrinter (int fd)

Use @ref{5063,,PyFile_FromFd()} with defaults (@code{fd, NULL, "w", -1, NULL, NULL, NULL, 0}) instead.
@end deffn

@geindex PyStdPrinter_Type (C var)
@anchor{c-api/file c PyStdPrinter_Type}@anchor{5476}
@deffn {C 변수} @ref{c9b,,PyTypeObject} PyStdPrinter_Type

Type of file-like objects used internally at Python startup when @ref{83,,io} is
not yet available.
Use Python @ref{316,,open()} or @ref{5063,,PyFile_FromFd()} to create file objects instead.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 모듈 객체,Module definitions,파일 객체,기타 객체<2>
@anchor{c-api/module doc}@anchor{5477}@anchor{c-api/module module-objects}@anchor{5478}@anchor{c-api/module moduleobjects}@anchor{5479}@anchor{c-api/module translation-repo}@anchor{547a}
@subsubsection 모듈 객체


@geindex 객체;모듈

@geindex PyModule_Type (C var)
@anchor{c-api/module c PyModule_Type}@anchor{50a3}
@deffn {C 변수} @ref{c9b,,PyTypeObject} PyModule_Type
` Part of the @ref{774,,안정 ABI}.'
@geindex ModuleType (모듈 types)

This instance of @ref{c9b,,PyTypeObject} represents the Python module type.  This
is exposed to Python programs as @ref{1013,,types.ModuleType}.
@end deffn

@geindex PyModule_Check (C function)
@anchor{c-api/module c PyModule_Check}@anchor{547b}
@deffn {C 함수} int PyModule_Check (PyObject *p)

`p'가 모듈 객체이거나 모듈 객체의 서브 형이면 참을 반환합니다. 이 함수는 항상 성공합니다.
@end deffn

@geindex PyModule_CheckExact (C function)
@anchor{c-api/module c PyModule_CheckExact}@anchor{547c}
@deffn {C 함수} int PyModule_CheckExact (PyObject *p)

`p'가 모듈 객체이지만, @ref{50a3,,PyModule_Type}의 서브 형이 아니면 참을 반환합니다. 이 함수는 항상 성공합니다.
@end deffn

@geindex PyModule_NewObject (C function)
@anchor{c-api/module c PyModule_NewObject}@anchor{50a1}
@deffn {C 함수} @ref{5dc,,PyObject} *PyModule_NewObject (PyObject *name)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI} 버전 3.7 이후로.'
@geindex __name__ (모듈 어트리뷰트)
@geindex __doc__ (모듈 어트리뷰트)
@geindex __file__ (모듈 어트리뷰트)
@geindex __package__ (모듈 어트리뷰트)
@geindex __loader__ (모듈 어트리뷰트)

@ref{1590,,module.__name__}이 `name'으로 설정된 새 모듈 객체를 반환합니다. 모듈의 @code{__name__}, @ref{1bed,,__doc__}, @ref{323,,__package__} 및 @ref{33b,,__loader__} 어트리뷰트가 채워집니다 (@code{__name__}을 제외하고 모두 @code{None}으로 설정됩니다). @ref{2366,,__file__} 어트리뷰트를 설정하는 것은 호출자의 책임입니다.

Return @code{NULL} with an exception set on error.


Added in version 3.3.



버전 3.4에서 변경: @ref{323,,__package__}와 @ref{33b,,__loader__}가 이제 @code{None}으로 설정됩니다.

@end deffn

@geindex PyModule_New (C function)
@anchor{c-api/module c PyModule_New}@anchor{50a0}
@deffn {C 함수} @ref{5dc,,PyObject} *PyModule_New (const char *name)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
@ref{50a1,,PyModule_NewObject()}와 비슷하지만, name이 유니코드 객체 대신 UTF-8로 인코딩된 문자열입니다.
@end deffn

@geindex PyModule_GetDict (C function)
@anchor{c-api/module c PyModule_GetDict}@anchor{509d}
@deffn {C 함수} @ref{5dc,,PyObject} *PyModule_GetDict (PyObject *module)
`반환값: 빌린 참조.'` Part of the @ref{774,,안정 ABI}.'
@geindex __dict__ (모듈 어트리뷰트)

`module'의 이름 공간을 구현하는 딕셔너리 객체를 반환합니다; 이 객체는 모듈 객체의 @ref{77c,,__dict__} 어트리뷰트와 같습니다. `module'이 모듈 객체(또는 모듈 객체의 서브 형)가 아니면, @ref{794,,SystemError}가 발생하고 @code{NULL}이 반환됩니다.

확장은 모듈의 @ref{77c,,__dict__}를 직접 조작하지 말고 다른 @code{PyModule_*}과 @code{PyObject_*} 함수를 사용하는 것이 좋습니다.

The returned reference is borrowed from the module; it is valid until
the module is destroyed.
@end deffn

@geindex PyModule_GetNameObject (C function)
@anchor{c-api/module c PyModule_GetNameObject}@anchor{509f}
@deffn {C 함수} @ref{5dc,,PyObject} *PyModule_GetNameObject (PyObject *module)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI} 버전 3.7 이후로.'
@geindex __name__ (모듈 어트리뷰트)
@geindex SystemError (내장 예외)

`module'의 @ref{1590,,__name__} 값을 반환합니다. 모듈이 제공하지 않거나, 문자열이 아니면, @ref{794,,SystemError}가 발생하고 @code{NULL}이 반환됩니다.


Added in version 3.3.

@end deffn

@geindex PyModule_GetName (C function)
@anchor{c-api/module c PyModule_GetName}@anchor{509e}
@deffn {C 함수} const char *PyModule_GetName (PyObject *module)
` Part of the @ref{774,,안정 ABI}.'
@ref{509f,,PyModule_GetNameObject()}와 비슷하지만 @code{'utf-8'}로 인코딩된 이름을 반환합니다.

The returned buffer is only valid until the module is renamed or destroyed.
Note that Python code may rename a module by setting its @ref{1590,,__name__}
attribute.
@end deffn

@geindex PyModule_GetState (C function)
@anchor{c-api/module c PyModule_GetState}@anchor{b76}
@deffn {C 함수} void *PyModule_GetState (PyObject *module)
` Part of the @ref{774,,안정 ABI}.'
모듈의 “상태”, 즉 모듈 생성 시 할당된 메모리 블록을 가리키는 포인터나 @code{NULL}을 반환합니다. @ref{1d74,,PyModuleDef.m_size}를 참조하십시오.
@end deffn

@geindex PyModule_GetDef (C function)
@anchor{c-api/module c PyModule_GetDef}@anchor{509c}
@deffn {C 함수} @ref{b71,,PyModuleDef} *PyModule_GetDef (PyObject *module)
` Part of the @ref{774,,안정 ABI}.'
모듈이 만들어진 @ref{b71,,PyModuleDef} 구조체에 대한 포인터나 모듈이 정의에서 만들어지지 않았으면 @code{NULL}을 반환합니다.

On error, return @code{NULL} with an exception set.
Use @ref{1cac,,PyErr_Occurred()} to tell this case apart from a missing
@code{PyModuleDef}.
@end deffn

@geindex PyModule_GetFilenameObject (C function)
@anchor{c-api/module c PyModule_GetFilenameObject}@anchor{42e}
@deffn {C 함수} @ref{5dc,,PyObject} *PyModule_GetFilenameObject (PyObject *module)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
@geindex __file__ (모듈 어트리뷰트)
@geindex SystemError (내장 예외)

`module'의 @ref{2366,,__file__} 어트리뷰트를 사용하여 `module'이 로드된 파일 이름을 반환합니다. 정의되지 않았거나 문자열이 아니면, @ref{794,,SystemError}를 발생시키고 @code{NULL}을 반환합니다; 그렇지 않으면 유니코드 객체에 대한 참조를 반환합니다.


Added in version 3.2.

@end deffn

@geindex PyModule_GetFilename (C function)
@anchor{c-api/module c PyModule_GetFilename}@anchor{42d}
@deffn {C 함수} const char *PyModule_GetFilename (PyObject *module)
` Part of the @ref{774,,안정 ABI}.'
@ref{42e,,PyModule_GetFilenameObject()}와 비슷하지만 ‘utf-8’로 인코딩된 파일명을 반환합니다.

The returned buffer is only valid until the module’s @ref{2366,,__file__} attribute
is reassigned or the module is destroyed.


버전 3.2부터 폐지됨: @ref{42d,,PyModule_GetFilename()}은 인코딩할 수 없는 파일명에 대해 @ref{886,,UnicodeEncodeError}를 발생시킵니다, 대신 @ref{42e,,PyModule_GetFilenameObject()}를 사용하십시오.

@end deffn

@node Module definitions,Creating extension modules dynamically,모듈 객체,기타 객체<2>
@anchor{c-api/module module-definitions}@anchor{547d}@anchor{c-api/module pymoduledef}@anchor{547e}
@subsubsection Module definitions


The functions in the previous section work on any module object, including
modules imported from Python code.

Modules defined using the C API typically use a `module definition',
@ref{b71,,PyModuleDef} – a statically allocated, constant “description” of
how a module should be created.

The definition is usually used to define an extension’s “main” module object
(see @ref{4f3b,,Defining extension modules} for details).
It is also used to
@ref{547f,,create extension modules dynamically}.

Unlike @ref{50a0,,PyModule_New()}, the definition allows management of
`module state' – a piece of memory that is allocated and cleared together
with the module object.
Unlike the module’s Python attributes, Python code cannot replace or delete
data stored in module state.

@geindex PyModuleDef (C type)
@anchor{c-api/module c PyModuleDef}@anchor{b71}
@deffn {C 자료형} type PyModuleDef
` Part of the @ref{774,,안정 ABI} (including all members).'
The module definition struct, which holds all information needed to create
a module object.
This structure must be statically allocated (or be otherwise guaranteed
to be valid while any modules created from it exist).
Usually, there is only one variable of this type for each extension module.

@geindex PyModuleDef.m_base (C member)
@anchor{c-api/module c PyModuleDef m_base}@anchor{5480}
@deffn {C 멤버 변수} PyModuleDef_Base m_base

이 멤버를 항상 @code{PyModuleDef_HEAD_INIT}로 초기화하십시오.
@end deffn

@geindex PyModuleDef.m_name (C member)
@anchor{c-api/module c PyModuleDef m_name}@anchor{5481}
@deffn {C 멤버 변수} const char *m_name

새 모듈의 이름.
@end deffn

@geindex PyModuleDef.m_doc (C member)
@anchor{c-api/module c PyModuleDef m_doc}@anchor{5482}
@deffn {C 멤버 변수} const char *m_doc

모듈의 독스트링; 일반적으로 @ref{1d58,,PyDoc_STRVAR}로 만들어진 독스트링 변수가 사용됩니다.
@end deffn

@geindex PyModuleDef.m_size (C member)
@anchor{c-api/module c PyModuleDef m_size}@anchor{1d74}
@deffn {C 멤버 변수} @ref{c54,,Py_ssize_t} m_size

모듈 상태는 정적 전역이 아닌 @ref{b76,,PyModule_GetState()}로 조회할 수 있는 모듈별 메모리 영역에 유지될 수 있습니다. 이것은 여러 서브 인터프리터에서 모듈을 사용하는 것을 안전하게 만듭니다.

이 메모리 영역은 모듈 생성 시 `m_size'를 기준으로 할당되며, 모듈 객체가 할당 해제될 때 (있다면 @ref{b74,,m_free} 함수가 호출된 후에) 해제됩니다.

Setting it to a non-negative value means that the module can be
re-initialized and specifies the additional amount of memory it requires
for its state.

Setting @code{m_size} to @code{-1} means that the module does not support
sub-interpreters, because it has global state.
Negative @code{m_size} is only allowed when using
@ref{524d,,legacy single-phase initialization}
or when @ref{547f,,creating modules dynamically}.

자세한 내용은 
@geindex Python 향상 제안; PEP 3121
PEP 3121@footnote{https://peps.python.org/pep-3121/}을 참조하십시오.
@end deffn

@geindex PyModuleDef.m_methods (C member)
@anchor{c-api/module c PyModuleDef m_methods}@anchor{5483}
@deffn {C 멤버 변수} @ref{16dc,,PyMethodDef} *m_methods

@ref{16dc,,PyMethodDef} 값으로 기술되는 모듈 수준 함수 테이블에 대한 포인터. 함수가 없으면 @code{NULL}일 수 있습니다.
@end deffn

@geindex PyModuleDef.m_slots (C member)
@anchor{c-api/module c PyModuleDef m_slots}@anchor{5254}
@deffn {C 멤버 변수} @ref{5098,,PyModuleDef_Slot} *m_slots

An array of slot definitions for multi-phase initialization, terminated by
a @code{@{0, NULL@}} entry.
When using legacy single-phase initialization, `m_slots' must be @code{NULL}.


버전 3.5에서 변경: 버전 3.5 이전에는, 이 멤버가 항상 @code{NULL}로 설정되었으며, 다음과 같이 정의되었습니다:

@quotation

@geindex PyModuleDef.m_slots.m_reload (C member)
@anchor{c-api/module c PyModuleDef m_slots m_reload}@anchor{5484}
@deffn {C 멤버 변수} @ref{51ea,,inquiry} m_reload
@end deffn
@end quotation

@end deffn

@geindex PyModuleDef.m_traverse (C member)
@anchor{c-api/module c PyModuleDef m_traverse}@anchor{b72}
@deffn {C 멤버 변수} @ref{51f9,,traverseproc} m_traverse

모듈 객체의 GC 탐색 중 호출할 탐색 함수나, 필요하지 않으면 @code{NULL}.

모듈 상태가 요청되었지만, 아직 할당되지 않았으면 이 함수가 호출되지 않습니다. 이것은 모듈이 만들이진 직후, 모듈이 실행되기 직전의 경우입니다 (@ref{b75,,Py_mod_exec} 함수). 더 정확하게는, @ref{1d74,,m_size}가 0보다 크고 모듈 상태(@ref{b76,,PyModule_GetState()}가 반환하는)가 @code{NULL}이면 이 함수가 호출되지 않습니다.


버전 3.9에서 변경: 모듈 상태가 할당되기 전에 더는 호출되지 않습니다.

@end deffn

@geindex PyModuleDef.m_clear (C member)
@anchor{c-api/module c PyModuleDef m_clear}@anchor{b73}
@deffn {C 멤버 변수} @ref{51ea,,inquiry} m_clear

모듈 객체의 GC 정리 중에 호출할 정리(clear) 함수나, 필요하지 않으면 @code{NULL}.

모듈 상태가 요청되었지만, 아직 할당되지 않았으면 이 함수가 호출되지 않습니다. 이것은 모듈이 만들이진 직후, 모듈이 실행되기 직전의 경우입니다 (@ref{b75,,Py_mod_exec} 함수). 더 정확하게는, @ref{1d74,,m_size}가 0보다 크고 모듈 상태(@ref{b76,,PyModule_GetState()}가 반환하는)가 @code{NULL}이면 이 함수가 호출되지 않습니다.

Like @ref{4f21,,PyTypeObject.tp_clear}, this function is not `always'
called before a module is deallocated. For example, when reference
counting is enough to determine that an object is no longer used,
the cyclic garbage collector is not involved and
@ref{b74,,m_free} is called directly.


버전 3.9에서 변경: 모듈 상태가 할당되기 전에 더는 호출되지 않습니다.

@end deffn

@geindex PyModuleDef.m_free (C member)
@anchor{c-api/module c PyModuleDef m_free}@anchor{b74}
@deffn {C 멤버 변수} @ref{5485,,freefunc} m_free

모듈 객체 할당 해제 중에 호출할 함수나, 필요하지 않으면 @code{NULL}.

모듈 상태가 요청되었지만, 아직 할당되지 않았으면 이 함수가 호출되지 않습니다. 이것은 모듈이 만들이진 직후, 모듈이 실행되기 직전의 경우입니다 (@ref{b75,,Py_mod_exec} 함수). 더 정확하게는, @ref{1d74,,m_size}가 0보다 크고 모듈 상태(@ref{b76,,PyModule_GetState()}가 반환하는)가 @code{NULL}이면 이 함수가 호출되지 않습니다.


버전 3.9에서 변경: 모듈 상태가 할당되기 전에 더는 호출되지 않습니다.

@end deffn
@end deffn

@geindex PyModuleDef_Type (C var)
@anchor{c-api/module c PyModuleDef_Type}@anchor{5099}
@deffn {C 변수} @ref{c9b,,PyTypeObject} PyModuleDef_Type
` Part of the @ref{774,,안정 ABI} 버전 3.5 이후로.'
The type of @code{PyModuleDef} objects.
@end deffn

@menu
* Module slots:: 

@end menu

@node Module slots,,,Module definitions
@anchor{c-api/module module-slots}@anchor{5486}
@subsubsection Module slots


@geindex PyModuleDef_Slot (C type)
@anchor{c-api/module c PyModuleDef_Slot}@anchor{5098}
@deffn {C 자료형} type PyModuleDef_Slot
` Part of the @ref{774,,안정 ABI} (including all members) 버전 3.5 이후로.'
@geindex PyModuleDef_Slot.slot (C member)
@anchor{c-api/module c PyModuleDef_Slot slot}@anchor{5487}
@deffn {C 멤버 변수} int slot

아래 설명된 사용 가능한 값 중에서 선택된, 슬롯 ID.
@end deffn

@geindex PyModuleDef_Slot.value (C member)
@anchor{c-api/module c PyModuleDef_Slot value}@anchor{5488}
@deffn {C 멤버 변수} void *value

슬롯 ID에 따라 그 의미가 달라지는, 슬롯의 값.
@end deffn


Added in version 3.5.

@end deffn

사용 가능한 슬롯 형은 다음과 같습니다:

@geindex Py_mod_create (C macro)
@anchor{c-api/module c Py_mod_create}@anchor{5190}
@deffn {C 매크로} Py_mod_create
` Part of the @ref{774,,안정 ABI} 버전 3.5 이후로.'
모듈 객체 자체를 만들기 위해 호출되는 함수를 지정합니다. 이 슬롯의 `value' 포인터는 다음과 같은 서명을 갖는 함수를 가리켜야 합니다:

@anchor{c-api/module c Py_mod_create create_module}@anchor{5489}
@deffn {C 함수} @ref{5dc,,PyObject} *create_module (PyObject *spec, PyModuleDef *def)
@end deffn

이 함수는 
@geindex Python 향상 제안; PEP 451
PEP 451@footnote{https://peps.python.org/pep-0451/}에 정의된 대로, @ref{2269,,ModuleSpec} 인스턴스와 모듈 정의를 받습니다. 새 모듈 객체를 반환하거나, 에러를 설정하고 @code{NULL}을 반환해야 합니다.

이 함수는 최소한으로 유지해야 합니다. 특히 같은 모듈을 다시 임포트 하려고 시도하면 무한 루프가 발생할 수 있어서, 임의의 파이썬 코드를 호출하면 안 됩니다.

하나의 모듈 정의에서 여러 @code{Py_mod_create} 슬롯을 지정할 수 없습니다.

@code{Py_mod_create}를 지정하지 않으면, 임포트 절차는 @ref{50a0,,PyModule_New()}를 사용하여 일반 모듈 객체를 만듭니다. 이름은 정의가 아니라 `spec'에서 취합니다, 확장 모듈이 단일 모듈 정의를 공유하면서 모듈 계층 구조에서 해당 위치에 동적으로 조정되고 심볼릭 링크를 통해 다른 이름으로 임포트 될 수 있도록 하기 위함입니다.

반환된 객체가 @ref{50a3,,PyModule_Type}의 인스턴스 일 필요는 없습니다. 임포트 관련 어트리뷰트 설정과 읽기를 지원하는 한 모든 형을 사용할 수 있습니다. 그러나, @code{PyModuleDef}에 @code{NULL}이 아닌 @code{m_traverse}, @code{m_clear}, @code{m_free}; 0이 아닌 @code{m_size}; 또는 @code{Py_mod_create} 이외의 슬롯이 있으면, @code{PyModule_Type} 인스턴스 만 반환될 수 있습니다.


Added in version 3.5.

@end deffn

@geindex Py_mod_exec (C macro)
@anchor{c-api/module c Py_mod_exec}@anchor{b75}
@deffn {C 매크로} Py_mod_exec
` Part of the @ref{774,,안정 ABI} 버전 3.5 이후로.'
모듈을 `실행'하기 위해 호출되는 함수를 지정합니다. 이것은 파이썬 모듈의 코드를 실행하는 것과 동등합니다: 일반적으로, 이 함수는 클래스와 상수를 모듈에 추가합니다. 함수의 서명은 다음과 같습니다:

@anchor{c-api/module c Py_mod_exec exec_module}@anchor{548a}
@deffn {C 함수} int exec_module (PyObject *module)
@end deffn

여러 개의 @code{Py_mod_exec} 슬롯이 지정되면, `m_slots' 배열에 나타나는 순서대로 처리됩니다.


Added in version 3.5.

@end deffn

@geindex Py_mod_multiple_interpreters (C macro)
@anchor{c-api/module c Py_mod_multiple_interpreters}@anchor{5191}
@deffn {C 매크로} Py_mod_multiple_interpreters
` Part of the @ref{774,,안정 ABI} 버전 3.12 이후로.'
Specifies one of the following values:

@geindex Py_MOD_MULTIPLE_INTERPRETERS_NOT_SUPPORTED (C macro)
@anchor{c-api/module c Py_MOD_MULTIPLE_INTERPRETERS_NOT_SUPPORTED}@anchor{4ee3}
@deffn {C 매크로} Py_MOD_MULTIPLE_INTERPRETERS_NOT_SUPPORTED

The module does not support being imported in subinterpreters.
@end deffn

@geindex Py_MOD_MULTIPLE_INTERPRETERS_SUPPORTED (C macro)
@anchor{c-api/module c Py_MOD_MULTIPLE_INTERPRETERS_SUPPORTED}@anchor{548b}
@deffn {C 매크로} Py_MOD_MULTIPLE_INTERPRETERS_SUPPORTED

The module supports being imported in subinterpreters,
but only when they share the main interpreter’s GIL.
(See @ref{166,,Isolating Extension Modules}.)
@end deffn

@geindex Py_MOD_PER_INTERPRETER_GIL_SUPPORTED (C macro)
@anchor{c-api/module c Py_MOD_PER_INTERPRETER_GIL_SUPPORTED}@anchor{548c}
@deffn {C 매크로} Py_MOD_PER_INTERPRETER_GIL_SUPPORTED

The module supports being imported in subinterpreters,
even when they have their own GIL.
(See @ref{166,,Isolating Extension Modules}.)
@end deffn

This slot determines whether or not importing this module
in a subinterpreter will fail.

하나의 모듈 정의에서 여러 @code{Py_mod_multiple_interpreters} 슬롯을 지정할 수 없습니다.

If @code{Py_mod_multiple_interpreters} is not specified, the import
machinery defaults to @code{Py_MOD_MULTIPLE_INTERPRETERS_SUPPORTED}.


Added in version 3.12.

@end deffn

@geindex Py_mod_gil (C macro)
@anchor{c-api/module c Py_mod_gil}@anchor{483}
@deffn {C 매크로} Py_mod_gil
` Part of the @ref{774,,안정 ABI} 버전 3.13 이후로.'
Specifies one of the following values:

@geindex Py_MOD_GIL_USED (C macro)
@anchor{c-api/module c Py_MOD_GIL_USED}@anchor{548d}
@deffn {C 매크로} Py_MOD_GIL_USED

The module depends on the presence of the global interpreter lock (GIL),
and may access global state without synchronization.
@end deffn

@geindex Py_MOD_GIL_NOT_USED (C macro)
@anchor{c-api/module c Py_MOD_GIL_NOT_USED}@anchor{548e}
@deffn {C 매크로} Py_MOD_GIL_NOT_USED

The module is safe to run without an active GIL.
@end deffn

This slot is ignored by Python builds not configured with
@ref{49a,,--disable-gil}.  Otherwise, it determines whether or not importing
this module will cause the GIL to be automatically enabled. See
@ref{46d,,제한 없는 스레드를 사용하는 파이썬(CPython)} for more detail.

하나의 모듈 정의에서 여러 @code{Py_mod_gil} 슬롯을 지정할 수 없습니다.

If @code{Py_mod_gil} is not specified, the import machinery defaults to
@code{Py_MOD_GIL_USED}.


Added in version 3.13.

@end deffn

@node Creating extension modules dynamically,지원 함수,Module definitions,기타 객체<2>
@anchor{c-api/module creating-extension-modules-dynamically}@anchor{548f}@anchor{c-api/module moduledef-dynamic}@anchor{547f}
@subsubsection Creating extension modules dynamically


The following functions may be used to create a module outside of an
extension’s @ref{524c,,initialization function}.
They are also used in
@ref{524d,,single-phase initialization}.

@geindex PyModule_Create (C function)
@anchor{c-api/module c PyModule_Create}@anchor{5256}
@deffn {C 함수} @ref{5dc,,PyObject} *PyModule_Create (PyModuleDef *def)
`반환값: 새 참조.'
Create a new module object, given the definition in `def'.
This is a macro that calls @ref{509b,,PyModule_Create2()} with
`module_api_version' set to @ref{496c,,PYTHON_API_VERSION}, or
to @ref{5490,,PYTHON_ABI_VERSION} if using the
@ref{635,,limited API}.
@end deffn

@geindex PyModule_Create2 (C function)
@anchor{c-api/module c PyModule_Create2}@anchor{509b}
@deffn {C 함수} @ref{5dc,,PyObject} *PyModule_Create2 (PyModuleDef *def, int module_api_version)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
`def'의 정의에 따라, API 버전 `module_api_version'을 가정하여 새 모듈 객체를 만듭니다. 해당 버전이 실행 중인 인터프리터 버전과 일치하지 않으면, @ref{4d8,,RuntimeWarning}을 발생시킵니다.

Return @code{NULL} with an exception set on error.

This function does not support slots.
The @ref{5254,,m_slots} member of `def' must be @code{NULL}.

@cartouche
@quotation 참고 
이 함수는 대부분 @ref{5256,,PyModule_Create()}를 대신 사용해야 합니다; 확실히 필요할 때만 사용하십시오.
@end quotation
@end cartouche
@end deffn

@geindex PyModule_FromDefAndSpec (C function)
@anchor{c-api/module c PyModule_FromDefAndSpec}@anchor{10b2}
@deffn {C 함수} @ref{5dc,,PyObject} *PyModule_FromDefAndSpec (PyModuleDef *def, PyObject *spec)
`반환값: 새 참조.'
This macro calls @ref{10b3,,PyModule_FromDefAndSpec2()} with
`module_api_version' set to @ref{496c,,PYTHON_API_VERSION}, or
to @ref{5490,,PYTHON_ABI_VERSION} if using the
@ref{635,,limited API}.


Added in version 3.5.

@end deffn

@geindex PyModule_FromDefAndSpec2 (C function)
@anchor{c-api/module c PyModule_FromDefAndSpec2}@anchor{10b3}
@deffn {C 함수} @ref{5dc,,PyObject} *PyModule_FromDefAndSpec2 (PyModuleDef *def, PyObject *spec, int module_api_version)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI} 버전 3.7 이후로.'
API 버전 `module_api_version'을 가정하여, 주어진 `def'의 정의와 ModuleSpec `spec'으로 새 모듈 객체를 만듭니다. 해당 버전이 실행 중인 인터프리터 버전과 일치하지 않으면, @ref{4d8,,RuntimeWarning}을 발생시킵니다.

Return @code{NULL} with an exception set on error.

Note that this does not process execution slots (@ref{b75,,Py_mod_exec}).
Both @code{PyModule_FromDefAndSpec} and @code{PyModule_ExecDef} must be called
to fully initialize a module.

@cartouche
@quotation 참고 
이 함수는 대부분 @ref{10b2,,PyModule_FromDefAndSpec()}을 대신 사용해야 합니다; 확실히 필요할 때만 사용하십시오.
@end quotation
@end cartouche


Added in version 3.5.

@end deffn

@geindex PyModule_ExecDef (C function)
@anchor{c-api/module c PyModule_ExecDef}@anchor{10b4}
@deffn {C 함수} int PyModule_ExecDef (PyObject *module, PyModuleDef *def)
` Part of the @ref{774,,안정 ABI} 버전 3.7 이후로.'
`def'에 지정된 모든 실행 슬롯(@ref{b75,,Py_mod_exec})을 처리합니다.


Added in version 3.5.

@end deffn

@geindex PYTHON_API_VERSION (C macro)
@anchor{c-api/module c PYTHON_API_VERSION}@anchor{496c}
@deffn {C 매크로} PYTHON_API_VERSION

The C API version. Defined for backwards compatibility.

Currently, this constant is not updated in new Python versions, and is not
useful for versioning. This may change in the future.
@end deffn

@geindex PYTHON_ABI_VERSION (C macro)
@anchor{c-api/module c PYTHON_ABI_VERSION}@anchor{5490}
@deffn {C 매크로} PYTHON_ABI_VERSION

Defined as @code{3} for backwards compatibility.

Currently, this constant is not updated in new Python versions, and is not
useful for versioning. This may change in the future.
@end deffn

@node 지원 함수,이터레이터 객체,Creating extension modules dynamically,기타 객체<2>
@anchor{c-api/module support-functions}@anchor{5491}
@subsubsection 지원 함수


The following functions are provided to help initialize a module
state.
They are intended for a module’s execution slots (@ref{b75,,Py_mod_exec}),
the initialization function for legacy @ref{524d,,single-phase initialization},
or code that creates modules dynamically.

@geindex PyModule_AddObjectRef (C function)
@anchor{c-api/module c PyModule_AddObjectRef}@anchor{607}
@deffn {C 함수} int PyModule_AddObjectRef (PyObject *module, const char *name, PyObject *value)
` Part of the @ref{774,,안정 ABI} 버전 3.10 이후로.'
`module'에 객체를 `name'으로 추가합니다. 모듈의 초기화 함수에서 사용할 수 있는 편의 함수입니다.

성공하면, @code{0}을 반환합니다. 에러 시, 예외를 발생시키고 @code{-1}을 반환합니다.

사용 예:

@example
static int
add_spam(PyObject *module, int value)
@{
    PyObject *obj = PyLong_FromLong(value);
    if (obj == NULL) @{
        return -1;
    @}
    int res = PyModule_AddObjectRef(module, "spam", obj);
    Py_DECREF(obj);
    return res;
 @}
@end example

To be convenient, the function accepts @code{NULL} `value' with an exception
set. In this case, return @code{-1} and just leave the raised exception
unchanged.

The example can also be written without checking explicitly if `obj' is
@code{NULL}:

@example
static int
add_spam(PyObject *module, int value)
@{
    PyObject *obj = PyLong_FromLong(value);
    int res = PyModule_AddObjectRef(module, "spam", obj);
    Py_XDECREF(obj);
    return res;
 @}
@end example

Note that @code{Py_XDECREF()} should be used instead of @code{Py_DECREF()} in
this case, since `obj' can be @code{NULL}.

The number of different `name' strings passed to this function
should be kept small, usually by only using statically allocated strings
as `name'.
For names that aren’t known at compile time, prefer calling
@ref{5151,,PyUnicode_FromString()} and @ref{1770,,PyObject_SetAttr()} directly.
For more details, see @ref{198d,,PyUnicode_InternFromString()}, which may be
used internally to create a key object.


Added in version 3.10.

@end deffn

@geindex PyModule_Add (C function)
@anchor{c-api/module c PyModule_Add}@anchor{609}
@deffn {C 함수} int PyModule_Add (PyObject *module, const char *name, PyObject *value)
` Part of the @ref{774,,안정 ABI} 버전 3.13 이후로.'
Similar to @ref{607,,PyModule_AddObjectRef()}, but “steals” a reference
to `value'.
It can be called with a result of function that returns a new reference
without bothering to check its result or even saving it to a variable.

사용 예:

@example
if (PyModule_Add(module, "spam", PyBytes_FromString(value)) < 0) @{
    goto error;
@}
@end example


Added in version 3.13.

@end deffn

@geindex PyModule_AddObject (C function)
@anchor{c-api/module c PyModule_AddObject}@anchor{608}
@deffn {C 함수} int PyModule_AddObject (PyObject *module, const char *name, PyObject *value)
` Part of the @ref{774,,안정 ABI}.'
Similar to @ref{607,,PyModule_AddObjectRef()}, but steals a reference to
`value' on success (if it returns @code{0}).

The new @ref{609,,PyModule_Add()} or @ref{607,,PyModule_AddObjectRef()}
functions are recommended, since it is
easy to introduce reference leaks by misusing the
@ref{608,,PyModule_AddObject()} function.

@cartouche
@quotation 참고 
참조를 훔치는 다른 함수와 달리, @code{PyModule_AddObject()}는 `성공 시'에만 `value'에 대한 참조를 해제합니다.

이는 반환 값을 확인해야 하며, 에러 시 호출하는 코드가 수동으로 `value'를 @ref{991,,Py_XDECREF()} 해야 함을 뜻합니다.
@end quotation
@end cartouche

사용 예:

@example
PyObject *obj = PyBytes_FromString(value);
if (PyModule_AddObject(module, "spam", obj) < 0) @{
    // 'obj' 가 NULL 이 아니고 PyModule_AddObject() 가 실패하면,
    // 'obj' 강한 참조는 Py_XDECREF() 로 삭제해야 합니다.
    // 'obj' 가 NULL 이면, Py_XDECREF() 는 아무것도 하지 않습니다.
    Py_XDECREF(obj);
    goto error;
@}
// PyModule_AddObject() 는 obj 에 대한 참조를 훔칩니다:
// 여기에서 Py_XDECREF(obj) 는 필요 없습니다.
@end example


버전 3.13부터 폐지됨: @ref{608,,PyModule_AddObject()} is @ref{23d,,soft deprecated}.

@end deffn

@geindex PyModule_AddIntConstant (C function)
@anchor{c-api/module c PyModule_AddIntConstant}@anchor{1741}
@deffn {C 함수} int PyModule_AddIntConstant (PyObject *module, const char *name, long value)
` Part of the @ref{774,,안정 ABI}.'
`module'에 정수 상수를 `name'으로 추가합니다. 이 편의 함수는 모듈의 초기화 함수에서 사용할 수 있습니다. 에러 시 예외를 설정하고 @code{-1}을, 성공하면 @code{0}을 반환합니다.

This is a convenience function that calls @ref{1bce,,PyLong_FromLong()} and
@ref{607,,PyModule_AddObjectRef()}; see their documentation for details.
@end deffn

@geindex PyModule_AddStringConstant (C function)
@anchor{c-api/module c PyModule_AddStringConstant}@anchor{1742}
@deffn {C 함수} int PyModule_AddStringConstant (PyObject *module, const char *name, const char *value)
` Part of the @ref{774,,안정 ABI}.'
`module'에 문자열 상수를 `name'으로 추가합니다. 이 편의 함수는 모듈의 초기화 함수에서 사용할 수 있습니다. 문자열 `value'는 @code{NULL}로 끝나야 합니다. 에러 시 예외를 설정하고 @code{-1}을, 성공 시 @code{0}을 반환합니다.

This is a convenience function that calls
@ref{198d,,PyUnicode_InternFromString()} and @ref{607,,PyModule_AddObjectRef()};
see their documentation for details.
@end deffn

@geindex PyModule_AddIntMacro (C macro)
@anchor{c-api/module c PyModule_AddIntMacro}@anchor{15f8}
@deffn {C 매크로} PyModule_AddIntMacro (module, macro)

`module'에 int 상수를 추가합니다. 이름과 값은 `macro'에서 취합니다. 예를 들어 @code{PyModule_AddIntMacro(module, AF_INET)}은 `AF_INET' 값을 가진 int 상수 `AF_INET'을 `module'에 추가합니다. 에러 시 예외를 설정하고 @code{-1}을, 성공하면 @code{0}을 반환합니다.
@end deffn

@geindex PyModule_AddStringMacro (C macro)
@anchor{c-api/module c PyModule_AddStringMacro}@anchor{15f7}
@deffn {C 매크로} PyModule_AddStringMacro (module, macro)

`module'에 문자열 상수를 추가합니다.
@end deffn

@geindex PyModule_AddType (C function)
@anchor{c-api/module c PyModule_AddType}@anchor{b6c}
@deffn {C 함수} int PyModule_AddType (PyObject *module, PyTypeObject *type)
` Part of the @ref{774,,안정 ABI} 버전 3.10 이후로.'
`module'에 형 객체를 추가합니다. 내부적으로 @ref{97f,,PyType_Ready()}를 호출하여 형 객체를 파이널라이즈합니다. 형 객체의 이름은 점 뒤 @ref{1cad,,tp_name}의 마지막 구성 요소에서 가져옵니다. 에러가 발생하면 예외를 설정하고 @code{-1}을, 성공하면 @code{0}을 반환합니다.


Added in version 3.9.

@end deffn

@geindex PyModule_AddFunctions (C function)
@anchor{c-api/module c PyModule_AddFunctions}@anchor{509a}
@deffn {C 함수} int PyModule_AddFunctions (PyObject *module, PyMethodDef *functions)
` Part of the @ref{774,,안정 ABI} 버전 3.7 이후로.'
Add the functions from the @code{NULL} terminated `functions' array to `module'.
Refer to the @ref{16dc,,PyMethodDef} documentation for details on individual
entries (due to the lack of a shared module namespace, module level
“functions” implemented in C typically receive the module as their first
parameter, making them similar to instance methods on Python classes).

This function is called automatically when creating a module from
@code{PyModuleDef} (such as when using @ref{5252,,Multi-phase initialization},
@code{PyModule_Create}, or @code{PyModule_FromDefAndSpec}).
Some module authors may prefer defining functions in multiple
@ref{16dc,,PyMethodDef} arrays; in that case they should call this function
directly.

The `functions' array must be statically allocated (or otherwise guaranteed
to outlive the module object).


Added in version 3.5.

@end deffn

@geindex PyModule_SetDocString (C function)
@anchor{c-api/module c PyModule_SetDocString}@anchor{50a2}
@deffn {C 함수} int PyModule_SetDocString (PyObject *module, const char *docstring)
` Part of the @ref{774,,안정 ABI} 버전 3.7 이후로.'
Set the docstring for `module' to `docstring'.
This function is called automatically when creating a module from
@code{PyModuleDef} (such as when using @ref{5252,,Multi-phase initialization},
@code{PyModule_Create}, or @code{PyModule_FromDefAndSpec}).

Return @code{0} on success.
Return @code{-1} with an exception set on error.


Added in version 3.5.

@end deffn

@geindex PyUnstable_Module_SetGIL (C function)
@anchor{c-api/module c PyUnstable_Module_SetGIL}@anchor{49e}
@deffn {C 함수} int PyUnstable_Module_SetGIL (PyObject *module, void *gil)

@cartouche
@quotation 이것은 불안정 API. It may change without warning in minor releases. `이것은 @ref{768,,불안정 API}. It may change without warning in minor releases.'
@end quotation
@end cartouche

Indicate that `module' does or does not support running without the global
interpreter lock (GIL), using one of the values from
@ref{483,,Py_mod_gil}. It must be called during `module'’s initialization
function when using @ref{524d,,Legacy single-phase initialization}.
If this function is not called during module initialization, the
import machinery assumes the module does not support running without the
GIL. This function is only available in Python builds configured with
@ref{49a,,--disable-gil}.
Return @code{-1} with an exception set on error, @code{0} on success.


Added in version 3.13.

@end deffn

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

@end menu

@node Module lookup single-phase initialization,,,지원 함수
@anchor{c-api/module module-lookup-single-phase-initialization}@anchor{5492}
@subsubsection Module lookup (single-phase initialization)


The legacy @ref{524d,,single-phase initialization}
initialization scheme creates singleton modules that can be looked up
in the context of the current interpreter. This allows the module object to be
retrieved later with only a reference to the module definition.

이 함수들은 다단계 초기화를 사용하여 만들어진 모듈에서는 작동하지 않습니다. 단일 정의에서 그러한 모듈이 여러 개 만들어질 수 있기 때문입니다.

@geindex PyState_FindModule (C function)
@anchor{c-api/module c PyState_FindModule}@anchor{50f4}
@deffn {C 함수} @ref{5dc,,PyObject} *PyState_FindModule (PyModuleDef *def)
`반환값: 빌린 참조.'` Part of the @ref{774,,안정 ABI}.'
현재 인터프리터에 대해 `def'에서 만들어진 모듈 객체를 반환합니다. 이 메서드를 사용하려면 먼저 모듈 객체가 @ref{50f3,,PyState_AddModule()}로 인터프리터 상태에 연결되어 있어야 합니다. 해당 모듈 객체를 찾을 수 없거나 인터프리터 상태에 아직 연결되지 않았으면, @code{NULL}을 반환합니다.
@end deffn

@geindex PyState_AddModule (C function)
@anchor{c-api/module c PyState_AddModule}@anchor{50f3}
@deffn {C 함수} int PyState_AddModule (PyObject *module, PyModuleDef *def)
` Part of the @ref{774,,안정 ABI} 버전 3.3 이후로.'
함수에 전달된 모듈 객체를 인터프리터 상태에 연결합니다. 이는 @ref{50f4,,PyState_FindModule()}을 통해 모듈 객체에 액세스 할 수 있도록 합니다.

단단계 초기화를 사용하여 만든 모듈에만 효과가 있습니다.

Python calls @code{PyState_AddModule} automatically after importing a module
that uses @ref{524d,,single-phase initialization},
so it is unnecessary (but harmless) to call it from module initialization
code. An explicit call is needed only if the module’s own init code
subsequently calls @code{PyState_FindModule}.
The function is mainly intended for implementing alternative import
mechanisms (either by calling it directly, or by referring to its
implementation for details of the required state updates).

If a module was attached previously using the same `def', it is replaced
by the new `module'.

The caller must have an @ref{4f10,,attached thread state}.

에러 시 예외를 설정하고 @code{-1}을, 성공 시 @code{0}을 반환합니다.


Added in version 3.3.

@end deffn

@geindex PyState_RemoveModule (C function)
@anchor{c-api/module c PyState_RemoveModule}@anchor{50f5}
@deffn {C 함수} int PyState_RemoveModule (PyModuleDef *def)
` Part of the @ref{774,,안정 ABI} 버전 3.3 이후로.'
`def'에서 만들어진 모듈 객체를 인터프리터 상태에서 제거합니다. 에러 시 예외를 설정하고 @code{-1}을, 성공 시 @code{0}을 반환합니다.

The caller must have an @ref{4f10,,attached thread state}.


Added in version 3.3.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 이터레이터 객체,디스크립터 객체,지원 함수,기타 객체<2>
@anchor{c-api/iterator doc}@anchor{5493}@anchor{c-api/iterator id1}@anchor{5494}@anchor{c-api/iterator iterator-objects}@anchor{5495}@anchor{c-api/iterator translation-repo}@anchor{5496}
@subsubsection 이터레이터 객체


파이썬은 두 개의 범용 이터레이터 객체를 제공합니다. 첫째, 시퀀스 이터레이터는 @ref{588,,__getitem__()} 메서드를 지원하는 임의의 시퀀스와 작동합니다. 둘째는 콜러블 객체와 종료 신호(sentinel) 값을 사용하고, 시퀀스의 각 항목에 대해 콜러블을 호출하고, 종료 신호 값이 반환될 때 이터레이션을 종료합니다.

@geindex PySeqIter_Type (C var)
@anchor{c-api/iterator c PySeqIter_Type}@anchor{50de}
@deffn {C 변수} @ref{c9b,,PyTypeObject} PySeqIter_Type
` Part of the @ref{774,,안정 ABI}.'
@ref{50dd,,PySeqIter_New()}와 내장 시퀀스 형에 대한 @ref{9d7,,iter()} 내장 함수의 단일 인자 형식에 의해 반환된 이터레이터 객체에 대한 형 객체.
@end deffn

@geindex PySeqIter_Check (C function)
@anchor{c-api/iterator c PySeqIter_Check}@anchor{5497}
@deffn {C 함수} int PySeqIter_Check (PyObject *op)

`op'의 형이 @ref{50de,,PySeqIter_Type}이면 참을 돌려줍니다. 이 함수는 항상 성공합니다.
@end deffn

@geindex PySeqIter_New (C function)
@anchor{c-api/iterator c PySeqIter_New}@anchor{50dd}
@deffn {C 함수} @ref{5dc,,PyObject} *PySeqIter_New (PyObject *seq)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
일반 시퀀스 객체 `seq'와 함께 작동하는 이터레이터를 반환합니다. 시퀀스가 서브스크립션 연산에서 @ref{173a,,IndexError}를 일으키면 이터레이션이 끝납니다.
@end deffn

@geindex PyCallIter_Type (C var)
@anchor{c-api/iterator c PyCallIter_Type}@anchor{4fd0}
@deffn {C 변수} @ref{c9b,,PyTypeObject} PyCallIter_Type
` Part of the @ref{774,,안정 ABI}.'
@ref{4fcf,,PyCallIter_New()}와 @ref{9d7,,iter()} 내장 함수의 두 인자 형식에 의해 반환된 이터레이터 객체에 대한 형 객체.
@end deffn

@geindex PyCallIter_Check (C function)
@anchor{c-api/iterator c PyCallIter_Check}@anchor{5498}
@deffn {C 함수} int PyCallIter_Check (PyObject *op)

`op'의 형이 @ref{4fd0,,PyCallIter_Type}이면 참을 돌려줍니다. 이 함수는 항상 성공합니다.
@end deffn

@geindex PyCallIter_New (C function)
@anchor{c-api/iterator c PyCallIter_New}@anchor{4fcf}
@deffn {C 함수} @ref{5dc,,PyObject} *PyCallIter_New (PyObject *callable, PyObject *sentinel)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
새로운 이터레이터를 돌려줍니다. 첫 번째 매개 변수 `callable'은 매개 변수 없이 호출할 수 있는 모든 파이썬 콜러블 객체일 수 있습니다; 각 호출은 이터레이션의 다음 항목을 반환해야 합니다. `callable'이 `sentinel'와 같은 값을 반환하면 이터레이션이 종료됩니다.
@end deffn

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

@end menu

@node Range Objects,Builtin Iterator Types,,이터레이터 객체
@anchor{c-api/iterator range-objects}@anchor{5499}
@subsubsection Range Objects


@geindex PyRange_Type (C var)
@anchor{c-api/iterator c PyRange_Type}@anchor{50db}
@deffn {C 변수} @ref{c9b,,PyTypeObject} PyRange_Type
` Part of the @ref{774,,안정 ABI}.'
The type object for @ref{b3d,,range} objects.
@end deffn

@geindex PyRange_Check (C function)
@anchor{c-api/iterator c PyRange_Check}@anchor{549a}
@deffn {C 함수} int PyRange_Check (PyObject *o)

Return true if the object `o' is an instance of a @ref{b3d,,range} object.
This function always succeeds.
@end deffn

@node Builtin Iterator Types,Other Iterator Objects,Range Objects,이터레이터 객체
@anchor{c-api/iterator builtin-iterator-types}@anchor{549b}
@subsubsection Builtin Iterator Types


These are built-in iteration types that are included in Python’s C API, but
provide no additional functions. They are here for completeness.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

C type

@tab

Python type

@item

@geindex PyEnum_Type (C var)
@anchor{c-api/iterator c PyEnum_Type}@anchor{5009}
@deffn {C 변수} @ref{c9b,,PyTypeObject} PyEnum_Type
` Part of the @ref{774,,안정 ABI}.'
@end deffn

@tab

@ref{1686,,enumerate}

@item

@geindex PyFilter_Type (C var)
@anchor{c-api/iterator c PyFilter_Type}@anchor{5067}
@deffn {C 변수} @ref{c9b,,PyTypeObject} PyFilter_Type
` Part of the @ref{774,,안정 ABI}.'
@end deffn

@tab

@ref{a64,,filter}

@item

@geindex PyMap_Type (C var)
@anchor{c-api/iterator c PyMap_Type}@anchor{508f}
@deffn {C 변수} @ref{c9b,,PyTypeObject} PyMap_Type
` Part of the @ref{774,,안정 ABI}.'
@end deffn

@tab

@ref{19f,,map}

@item

@geindex PyReversed_Type (C var)
@anchor{c-api/iterator c PyReversed_Type}@anchor{50dc}
@deffn {C 변수} @ref{c9b,,PyTypeObject} PyReversed_Type
` Part of the @ref{774,,안정 ABI}.'
@end deffn

@tab

@ref{a65,,reversed}

@item

@geindex PyZip_Type (C var)
@anchor{c-api/iterator c PyZip_Type}@anchor{515f}
@deffn {C 변수} @ref{c9b,,PyTypeObject} PyZip_Type
` Part of the @ref{774,,안정 ABI}.'
@end deffn

@tab

@ref{1a0,,zip}

@end multitable


@node Other Iterator Objects,,Builtin Iterator Types,이터레이터 객체
@anchor{c-api/iterator other-iterator-objects}@anchor{549c}
@subsubsection Other Iterator Objects


@geindex PyByteArrayIter_Type (C var)
@anchor{c-api/iterator c PyByteArrayIter_Type}@anchor{4fb7}
@deffn {C 변수} @ref{c9b,,PyTypeObject} PyByteArrayIter_Type
` Part of the @ref{774,,안정 ABI}.'
@end deffn

@geindex PyBytesIter_Type (C var)
@anchor{c-api/iterator c PyBytesIter_Type}@anchor{4fbd}
@deffn {C 변수} @ref{c9b,,PyTypeObject} PyBytesIter_Type
` Part of the @ref{774,,안정 ABI}.'
@end deffn

@geindex PyListIter_Type (C var)
@anchor{c-api/iterator c PyListIter_Type}@anchor{507c}
@deffn {C 변수} @ref{c9b,,PyTypeObject} PyListIter_Type
` Part of the @ref{774,,안정 ABI}.'
@end deffn

@geindex PyListRevIter_Type (C var)
@anchor{c-api/iterator c PyListRevIter_Type}@anchor{507d}
@deffn {C 변수} @ref{c9b,,PyTypeObject} PyListRevIter_Type
` Part of the @ref{774,,안정 ABI}.'
@end deffn

@geindex PySetIter_Type (C var)
@anchor{c-api/iterator c PySetIter_Type}@anchor{50ec}
@deffn {C 변수} @ref{c9b,,PyTypeObject} PySetIter_Type
` Part of the @ref{774,,안정 ABI}.'
@end deffn

@geindex PyTupleIter_Type (C var)
@anchor{c-api/iterator c PyTupleIter_Type}@anchor{5114}
@deffn {C 변수} @ref{c9b,,PyTypeObject} PyTupleIter_Type
` Part of the @ref{774,,안정 ABI}.'
@end deffn

@geindex PyRangeIter_Type (C var)
@anchor{c-api/iterator c PyRangeIter_Type}@anchor{50da}
@deffn {C 변수} @ref{c9b,,PyTypeObject} PyRangeIter_Type
` Part of the @ref{774,,안정 ABI}.'
@end deffn

@geindex PyLongRangeIter_Type (C var)
@anchor{c-api/iterator c PyLongRangeIter_Type}@anchor{5084}
@deffn {C 변수} @ref{c9b,,PyTypeObject} PyLongRangeIter_Type
` Part of the @ref{774,,안정 ABI}.'
@end deffn

@geindex PyDictIterKey_Type (C var)
@anchor{c-api/iterator c PyDictIterKey_Type}@anchor{4ff3}
@deffn {C 변수} @ref{c9b,,PyTypeObject} PyDictIterKey_Type
` Part of the @ref{774,,안정 ABI}.'
@end deffn

@geindex PyDictRevIterKey_Type (C var)
@anchor{c-api/iterator c PyDictRevIterKey_Type}@anchor{4ff9}
@deffn {C 변수} @ref{c9b,,PyTypeObject} PyDictRevIterKey_Type
` Part of the @ref{774,,안정 ABI} 버전 3.8 이후로.'
@end deffn

@geindex PyDictIterValue_Type (C var)
@anchor{c-api/iterator c PyDictIterValue_Type}@anchor{4ff4}
@deffn {C 변수} @ref{c9b,,PyTypeObject} PyDictIterValue_Type
` Part of the @ref{774,,안정 ABI}.'
@end deffn

@geindex PyDictRevIterValue_Type (C var)
@anchor{c-api/iterator c PyDictRevIterValue_Type}@anchor{4ffa}
@deffn {C 변수} @ref{c9b,,PyTypeObject} PyDictRevIterValue_Type
` Part of the @ref{774,,안정 ABI} 버전 3.8 이후로.'
@end deffn

@geindex PyDictIterItem_Type (C var)
@anchor{c-api/iterator c PyDictIterItem_Type}@anchor{4ff2}
@deffn {C 변수} @ref{c9b,,PyTypeObject} PyDictIterItem_Type
` Part of the @ref{774,,안정 ABI}.'
@end deffn

@geindex PyDictRevIterItem_Type (C var)
@anchor{c-api/iterator c PyDictRevIterItem_Type}@anchor{4ff8}
@deffn {C 변수} @ref{c9b,,PyTypeObject} PyDictRevIterItem_Type
` Part of the @ref{774,,안정 ABI} 버전 3.8 이후로.'
@end deffn

@geindex PyODictIter_Type (C var)
@anchor{c-api/iterator c PyODictIter_Type}@anchor{549d}
@deffn {C 변수} @ref{c9b,,PyTypeObject} PyODictIter_Type

Type objects for iterators of various built-in objects.

Do not create instances of these directly; prefer calling
@ref{50d2,,PyObject_GetIter()} instead.

Note that there is no guarantee that a given built-in type uses a given iterator
type. For example, iterating over @ref{b3d,,range} will use one of two iterator
types depending on the size of the range. Other types may start using a
similar scheme in the future, without warning.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 디스크립터 객체,슬라이스 객체,이터레이터 객체,기타 객체<2>
@anchor{c-api/descriptor doc}@anchor{549e}@anchor{c-api/descriptor descriptor-objects}@anchor{549f}@anchor{c-api/descriptor id1}@anchor{54a0}@anchor{c-api/descriptor translation-repo}@anchor{54a1}
@subsubsection 디스크립터 객체


“디스크립터”는 객체의 일부 어트리뷰트를 기술하는 객체입니다. 그것들은 형 객체의 딕셔너리에 있습니다.

@c XXX document these!

@geindex PyProperty_Type (C var)
@anchor{c-api/descriptor c PyProperty_Type}@anchor{50d9}
@deffn {C 변수} @ref{c9b,,PyTypeObject} PyProperty_Type
` Part of the @ref{774,,안정 ABI}.'
내장 디스크립터 형들을 위한 형 객체.
@end deffn

@geindex PyDescr_NewGetSet (C function)
@anchor{c-api/descriptor c PyDescr_NewGetSet}@anchor{4fef}
@deffn {C 함수} @ref{5dc,,PyObject} *PyDescr_NewGetSet (PyTypeObject *type, struct PyGetSetDef *getset)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
@end deffn

@geindex PyDescr_NewMember (C function)
@anchor{c-api/descriptor c PyDescr_NewMember}@anchor{4ff0}
@deffn {C 함수} @ref{5dc,,PyObject} *PyDescr_NewMember (PyTypeObject *type, struct PyMemberDef *meth)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
@end deffn

@geindex PyMemberDescr_Type (C var)
@anchor{c-api/descriptor c PyMemberDescr_Type}@anchor{5093}
@deffn {C 변수} @ref{c9b,,PyTypeObject} PyMemberDescr_Type
` Part of the @ref{774,,안정 ABI}.'
The type object for member descriptor objects created from
@ref{770,,PyMemberDef} structures. These descriptors expose fields of a
C struct as attributes on a type, and correspond
to @ref{2a0f,,types.MemberDescriptorType} objects in Python.
@end deffn

@geindex PyGetSetDescr_Type (C var)
@anchor{c-api/descriptor c PyGetSetDescr_Type}@anchor{506e}
@deffn {C 변수} @ref{c9b,,PyTypeObject} PyGetSetDescr_Type
` Part of the @ref{774,,안정 ABI}.'
The type object for get/set descriptor objects created from
@ref{db1,,PyGetSetDef} structures. These descriptors implement attributes
whose value is computed by C getter and setter functions, and are used
for many built-in type attributes.
@end deffn

@geindex PyDescr_NewMethod (C function)
@anchor{c-api/descriptor c PyDescr_NewMethod}@anchor{1d72}
@deffn {C 함수} @ref{5dc,,PyObject} *PyDescr_NewMethod (PyTypeObject *type, struct PyMethodDef *meth)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
@end deffn

@geindex PyMethodDescr_Type (C var)
@anchor{c-api/descriptor c PyMethodDescr_Type}@anchor{5097}
@deffn {C 변수} @ref{c9b,,PyTypeObject} PyMethodDescr_Type
` Part of the @ref{774,,안정 ABI}.'
The type object for method descriptor objects created from
@ref{16dc,,PyMethodDef} structures. These descriptors expose C functions as
methods on a type, and correspond to @ref{2a0f,,types.MemberDescriptorType}
objects in Python.
@end deffn

@geindex PyDescr_NewWrapper (C function)
@anchor{c-api/descriptor c PyDescr_NewWrapper}@anchor{54a2}
@deffn {C 함수} @ref{5dc,,PyObject} *PyDescr_NewWrapper (PyTypeObject *type, struct wrapperbase *wrapper, void *wrapped)
`반환값: 새 참조.'
@end deffn

@geindex PyWrapperDescr_Type (C var)
@anchor{c-api/descriptor c PyWrapperDescr_Type}@anchor{515d}
@deffn {C 변수} @ref{c9b,,PyTypeObject} PyWrapperDescr_Type
` Part of the @ref{774,,안정 ABI}.'
The type object for wrapper descriptor objects created by
@ref{54a2,,PyDescr_NewWrapper()} and @ref{515e,,PyWrapper_New()}. Wrapper
descriptors are used internally to expose special methods implemented
via wrapper structures, and appear in Python as
@ref{d91,,types.WrapperDescriptorType} objects.
@end deffn

@geindex PyDescr_NewClassMethod (C function)
@anchor{c-api/descriptor c PyDescr_NewClassMethod}@anchor{4fee}
@deffn {C 함수} @ref{5dc,,PyObject} *PyDescr_NewClassMethod (PyTypeObject *type, PyMethodDef *method)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
@end deffn

@geindex PyDescr_IsData (C function)
@anchor{c-api/descriptor c PyDescr_IsData}@anchor{1cb0}
@deffn {C 함수} int PyDescr_IsData (PyObject *descr)

Return non-zero if the descriptor object `descr' describes a data attribute, or
@code{0} if it describes a method.  `descr' must be a descriptor object; there is
no error checking.
@end deffn

@geindex PyWrapper_New (C function)
@anchor{c-api/descriptor c PyWrapper_New}@anchor{515e}
@deffn {C 함수} @ref{5dc,,PyObject} *PyWrapper_New (PyObject*, PyObject*)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
@end deffn

@menu
* Built-in descriptors:: 

@end menu

@node Built-in descriptors,,,디스크립터 객체
@anchor{c-api/descriptor built-in-descriptors}@anchor{54a3}
@subsubsection Built-in descriptors


@geindex PySuper_Type (C var)
@anchor{c-api/descriptor c PySuper_Type}@anchor{50fa}
@deffn {C 변수} @ref{c9b,,PyTypeObject} PySuper_Type
` Part of the @ref{774,,안정 ABI}.'
The type object for super objects. This is the same object as
@ref{1a6,,super} in the Python layer.
@end deffn

@geindex PyClassMethod_Type (C var)
@anchor{c-api/descriptor c PyClassMethod_Type}@anchor{54a4}
@deffn {C 변수} @ref{c9b,,PyTypeObject} PyClassMethod_Type

The type of class method objects. This is the same object as
@ref{48f,,classmethod} in the Python layer.
@end deffn

@geindex PyClassMethodDescr_Type (C var)
@anchor{c-api/descriptor c PyClassMethodDescr_Type}@anchor{4fdc}
@deffn {C 변수} @ref{c9b,,PyTypeObject} PyClassMethodDescr_Type
` Part of the @ref{774,,안정 ABI}.'
The type object for C-level class method descriptor objects.
This is the type of the descriptors created for @ref{48f,,classmethod()} defined in
C extension types, and is the same object as @ref{48f,,classmethod}
in Python.
@end deffn

@geindex PyClassMethod_New (C function)
@anchor{c-api/descriptor c PyClassMethod_New}@anchor{54a5}
@deffn {C 함수} @ref{5dc,,PyObject} *PyClassMethod_New (PyObject *callable)

Create a new @ref{48f,,classmethod} object wrapping `callable'.
`callable' must be a callable object and must not be @code{NULL}.

On success, this function returns a @ref{5df,,strong reference} to a new class
method descriptor. On failure, this function returns @code{NULL} with an
exception set.
@end deffn

@geindex PyStaticMethod_Type (C var)
@anchor{c-api/descriptor c PyStaticMethod_Type}@anchor{54a6}
@deffn {C 변수} @ref{c9b,,PyTypeObject} PyStaticMethod_Type

The type of static method objects. This is the same object as
@ref{453,,staticmethod} in the Python layer.
@end deffn

@geindex PyStaticMethod_New (C function)
@anchor{c-api/descriptor c PyStaticMethod_New}@anchor{54a7}
@deffn {C 함수} @ref{5dc,,PyObject} *PyStaticMethod_New (PyObject *callable)

Create a new @ref{453,,staticmethod} object wrapping `callable'.
`callable' must be a callable object and must not be @code{NULL}.

On success, this function returns a @ref{5df,,strong reference} to a new static
method descriptor. On failure, this function returns @code{NULL} with an
exception set.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 슬라이스 객체,MemoryView 객체,디스크립터 객체,기타 객체<2>
@anchor{c-api/slice doc}@anchor{54a8}@anchor{c-api/slice id1}@anchor{54a9}@anchor{c-api/slice slice-objects}@anchor{54aa}@anchor{c-api/slice translation-repo}@anchor{54ab}
@subsubsection 슬라이스 객체


@geindex PySlice_Type (C var)
@anchor{c-api/slice c PySlice_Type}@anchor{50f2}
@deffn {C 변수} @ref{c9b,,PyTypeObject} PySlice_Type
` Part of the @ref{774,,안정 ABI}.'
슬라이스 객체의 형 객체. 이것은 파이썬 계층의 @ref{693,,slice}와 같습니다.
@end deffn

@geindex PySlice_Check (C function)
@anchor{c-api/slice c PySlice_Check}@anchor{54ac}
@deffn {C 함수} int PySlice_Check (PyObject *ob)

`ob'가 슬라이스 객체면 참을 반환합니다. `ob'는 @code{NULL}이 아니어야 합니다. 이 함수는 항상 성공합니다.
@end deffn

@geindex PySlice_New (C function)
@anchor{c-api/slice c PySlice_New}@anchor{50f1}
@deffn {C 함수} @ref{5dc,,PyObject} *PySlice_New (PyObject *start, PyObject *stop, PyObject *step)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
지정된 값으로 새로운 슬라이스 객체를 반환합니다. `start', `stop' 및 `step' 매개 변수는 같은 이름의 슬라이스 객체 어트리뷰트의 값으로 사용됩니다. 모든 값은 @code{NULL} 일 수 있으며, 이 경우 @code{None}이 해당 어트리뷰트에 사용됩니다.

새 객체를 할당할 수 없으면 예외를 설정하고 @code{NULL}을 반환합니다.
@end deffn

@geindex PySlice_GetIndices (C function)
@anchor{c-api/slice c PySlice_GetIndices}@anchor{50f0}
@deffn {C 함수} int PySlice_GetIndices (PyObject *slice, Py_ssize_t length, Py_ssize_t *start, Py_ssize_t *stop, Py_ssize_t *step)
` Part of the @ref{774,,안정 ABI}.'
길이가 `length'인 시퀀스를 가정하여, 슬라이스 객체 `slice'에서 start, stop 및 step 인덱스를 가져옵니다. `length'보다 큰 인덱스를 에러로 처리합니다.

성공하면 @code{0}을 반환하고, 에러면 예외 설정 없이 @code{-1}을 반환합니다 (인덱스 중 하나가 @code{None}이 아니고 정수로 변환되지 않는 한, 이때는 예외를 설정하고 @code{-1}을 반환합니다).

이 기능을 사용하고 싶지는 않을 것입니다.


버전 3.2에서 변경: 전에는 `slice' 매개 변수의 매개 변수 형이 @code{PySliceObject*}였습니다.

@end deffn

@geindex PySlice_GetIndicesEx (C function)
@anchor{c-api/slice c PySlice_GetIndicesEx}@anchor{431}
@deffn {C 함수} int PySlice_GetIndicesEx (PyObject *slice, Py_ssize_t length, Py_ssize_t *start, Py_ssize_t *stop, Py_ssize_t *step, Py_ssize_t *slicelength)
` Part of the @ref{774,,안정 ABI}.'
@ref{50f0,,PySlice_GetIndices()}를 쓸만하게 대체합니다. 길이가 `length'인 시퀀스를 가정하여, 슬라이스 객체 `slice'에서 start, stop 및 step 인덱스를 가져오고, `slicelength'에 슬라이스의 길이를 저장합니다. 범위를 벗어난 인덱스는 일반 슬라이스의 처리와 일관된 방식으로 잘립니다.

성공하면 @code{0}을 반환하고, 에러면 예외를 설정하고 @code{-1}을 반환합니다.

@cartouche
@quotation 참고 
이 함수는 크기를 조정할 수 있는 시퀀스에는 안전하지 않은 것으로 간주합니다. 호출은 @ref{432,,PySlice_Unpack()}와 @ref{433,,PySlice_AdjustIndices()}의 조합으로 대체되어야 합니다. 즉

@example
if (PySlice_GetIndicesEx(slice, length, &start, &stop, &step, &slicelength) < 0) @{
    // 에러 반환
@}
@end example

은 다음으로 대체됩니다

@example
if (PySlice_Unpack(slice, &start, &stop, &step) < 0) @{
    // 에러 반환
@}
slicelength = PySlice_AdjustIndices(length, &start, &stop, step);
@end example
@end quotation
@end cartouche


버전 3.2에서 변경: 전에는 `slice' 매개 변수의 매개 변수 형이 @code{PySliceObject*}였습니다.



버전 3.6.1에서 변경: @code{Py_LIMITED_API}가 설정되어 있지 않거나 @code{0x03050400}과 @code{0x03060000} (포함하지 않음) 사이나 @code{0x03060100} 이상의 값으로 설정되었으면, @code{PySlice_GetIndicesEx()}는 @code{PySlice_Unpack()}과 @code{PySlice_AdjustIndices()}를 사용하는 매크로로 구현됩니다. 인자 `start', `stop' 및 `step'는 여러 번 평가됩니다.



버전 3.6.1부터 폐지됨: @code{Py_LIMITED_API}가 @code{0x03050400}보다 작거나 @code{0x03060000}과 @code{0x03060100} (포함하지 않음) 사이의 값으로 설정되었으면 @code{PySlice_GetIndicesEx()}는 폐지된 함수입니다.

@end deffn

@geindex PySlice_Unpack (C function)
@anchor{c-api/slice c PySlice_Unpack}@anchor{432}
@deffn {C 함수} int PySlice_Unpack (PyObject *slice, Py_ssize_t *start, Py_ssize_t *stop, Py_ssize_t *step)
` Part of the @ref{774,,안정 ABI} 버전 3.7 이후로.'
슬라이스 객체의 start, stop 및 step 데이터 멤버를 C 정수로 추출합니다. @code{PY_SSIZE_T_MAX}보다 큰 값을 @code{PY_SSIZE_T_MAX}로 조용히 줄이고, @code{PY_SSIZE_T_MIN}보다 작은 start 와 stop 값을 @code{PY_SSIZE_T_MIN}로 조용히 높이고, @code{-PY_SSIZE_T_MAX}보다 작은 step 값을 @code{-PY_SSIZE_T_MAX}로 조용히 높입니다.

에러면 예외를 설정하고 @code{-1}을, 성공하면 @code{0}을 반환합니다.


Added in version 3.6.1.

@end deffn

@geindex PySlice_AdjustIndices (C function)
@anchor{c-api/slice c PySlice_AdjustIndices}@anchor{433}
@deffn {C 함수} @ref{c54,,Py_ssize_t} PySlice_AdjustIndices (Py_ssize_t length, Py_ssize_t *start, Py_ssize_t *stop, Py_ssize_t step)
` Part of the @ref{774,,안정 ABI} 버전 3.7 이후로.'
지정된 length 길이의 시퀀스를 가정하여 start/stop 슬라이스 인덱스를 조정합니다. 범위를 벗어난 인덱스는 일반 슬라이스의 처리와 일관된 방식으로 잘립니다.

슬라이스의 길이를 반환합니다. 항상 성공합니다. 파이썬 코드를 호출하지 않습니다.


Added in version 3.6.1.

@end deffn

@menu
* Ellipsis 객체: Ellipsis 객체<2>. 

@end menu

@node Ellipsis 객체<2>,,,슬라이스 객체
@anchor{c-api/slice ellipsis-object}@anchor{54ad}
@subsubsection Ellipsis 객체


@geindex PyEllipsis_Type (C var)
@anchor{c-api/slice c PyEllipsis_Type}@anchor{5008}
@deffn {C 변수} @ref{c9b,,PyTypeObject} PyEllipsis_Type
` Part of the @ref{774,,안정 ABI}.'
파이썬 @ref{2325,,Ellipsis} 객체의 형. 파이썬 계층의 @ref{a51,,types.EllipsisType}과 같습니다.
@end deffn

@geindex Py_Ellipsis (C var)
@anchor{c-api/slice c Py_Ellipsis}@anchor{54ae}
@deffn {C 변수} @ref{5dc,,PyObject} *Py_Ellipsis

파이썬 @code{Ellipsis} 객체. 이 객체에는 메서드가 없습니다. @ref{4ede,,Py_None}과 마찬가지로, @ref{290,,불멸} 싱글톤 객체입니다.


버전 3.12에서 변경: @ref{54ae,,Py_Ellipsis}는 불멸입니다.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@geindex 객체;memoryview
@anchor{c-api/memoryview memoryview-objects}@anchor{52f9}
@node MemoryView 객체,Pickle buffer objects,슬라이스 객체,기타 객체<2>
@anchor{c-api/memoryview doc}@anchor{54af}@anchor{c-api/memoryview id1}@anchor{54b0}@anchor{c-api/memoryview translation-repo}@anchor{54b1}
@subsubsection MemoryView 객체


@ref{165,,memoryview} 객체는 C 수준 @ref{260,,버퍼 인터페이스}를 다른 객체와 마찬가지로 전달될 수 있는 파이썬 객체로 노출합니다.

@geindex PyMemoryView_Type (C var)
@anchor{c-api/memoryview c PyMemoryView_Type}@anchor{5096}
@deffn {C 변수} @ref{c9b,,PyTypeObject} PyMemoryView_Type
` Part of the @ref{774,,안정 ABI}.'
This instance of @ref{c9b,,PyTypeObject} represents the Python memoryview
type. This is the same object as @ref{165,,memoryview} in the Python layer.
@end deffn

@geindex PyMemoryView_FromObject (C function)
@anchor{c-api/memoryview c PyMemoryView_FromObject}@anchor{5094}
@deffn {C 함수} @ref{5dc,,PyObject} *PyMemoryView_FromObject (PyObject *obj)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
버퍼 인터페이스를 제공하는 객체에서 memoryview 객체를 만듭니다. `obj'가 쓰기 가능한 버퍼 제공을 지원하면, memoryview 객체는 읽기/쓰기가 되고, 그렇지 않으면 읽기 전용이거나 제공자의 재량에 따라 읽기/쓰기가 될 수 있습니다.
@end deffn

@geindex PyBUF_READ (C macro)
@anchor{c-api/memoryview c PyBUF_READ}@anchor{1a0b}
@deffn {C 매크로} PyBUF_READ
` Part of the @ref{774,,안정 ABI} 버전 3.11 이후로.'
읽기 전용 버퍼를 요청하는 플래그
@end deffn

@geindex PyBUF_WRITE (C macro)
@anchor{c-api/memoryview c PyBUF_WRITE}@anchor{1a0c}
@deffn {C 매크로} PyBUF_WRITE
` Part of the @ref{774,,안정 ABI} 버전 3.11 이후로.'
쓰기 가능한 버퍼를 요청하는 플래그
@end deffn

@geindex PyMemoryView_FromMemory (C function)
@anchor{c-api/memoryview c PyMemoryView_FromMemory}@anchor{1375}
@deffn {C 함수} @ref{5dc,,PyObject} *PyMemoryView_FromMemory (char *mem, Py_ssize_t size, int flags)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI} 버전 3.7 이후로.'
`mem'를 하부 버퍼로 사용하여 memoryview 객체를 만듭니다. `flags'는 @ref{1a0b,,PyBUF_READ} 나 @ref{1a0c,,PyBUF_WRITE} 중 하나일 수 있습니다.


Added in version 3.3.

@end deffn

@geindex PyMemoryView_FromBuffer (C function)
@anchor{c-api/memoryview c PyMemoryView_FromBuffer}@anchor{964}
@deffn {C 함수} @ref{5dc,,PyObject} *PyMemoryView_FromBuffer (const Py_buffer *view)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI} 버전 3.11 이후로.'
주어진 버퍼 구조체 `view'를 감싸는 memoryview 객체를 만듭니다. 간단한 바이트 버퍼의 경우는, @ref{1375,,PyMemoryView_FromMemory()}가 선호되는 함수입니다.
@end deffn

@geindex PyMemoryView_GetContiguous (C function)
@anchor{c-api/memoryview c PyMemoryView_GetContiguous}@anchor{5095}
@deffn {C 함수} @ref{5dc,,PyObject} *PyMemoryView_GetContiguous (PyObject *obj, int buffertype, char order)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
버퍼 인터페이스를 정의하는 객체로부터 메모리의 @ref{2689,,연속} 청크(‘C’ 나 ‘F’ortran `order'로)로 memoryview 객체를 만듭니다. 메모리가 연속적이면 memoryview 객체는 원래 메모리를 가리킵니다. 그렇지 않으면, 복사본이 만들어지고 memoryview는 새 바이트열 객체를 가리킵니다.

`buffertype'은 @ref{1a0b,,PyBUF_READ} 나 @ref{1a0c,,PyBUF_WRITE} 중 하나일 수 있습니다.
@end deffn

@geindex PyMemoryView_Check (C function)
@anchor{c-api/memoryview c PyMemoryView_Check}@anchor{54b2}
@deffn {C 함수} int PyMemoryView_Check (PyObject *obj)

객체 `obj'가 memoryview 객체면 참을 반환합니다. 현재는 @ref{165,,memoryview}의 서브 클래스를 만들 수 없습니다. 이 함수는 항상 성공합니다.
@end deffn

@geindex PyMemoryView_GET_BUFFER (C function)
@anchor{c-api/memoryview c PyMemoryView_GET_BUFFER}@anchor{54b3}
@deffn {C 함수} @ref{95b,,Py_buffer} *PyMemoryView_GET_BUFFER (PyObject *mview)

제공자 버퍼의 memoryview의 비공개 복사본의 포인터를 돌려줍니다. `mview'는 `반드시' memoryview 인스턴스여야 합니다; 이 매크로는 형을 확인하지 않으므로 직접 검사해야 합니다, 그렇지 않으면 충돌 위험이 있습니다.
@end deffn

@geindex PyMemoryView_GET_BASE (C function)
@anchor{c-api/memoryview c PyMemoryView_GET_BASE}@anchor{54b4}
@deffn {C 함수} @ref{5dc,,PyObject} *PyMemoryView_GET_BASE (PyObject *mview)

memoryview가 기반으로 하는 제공자 객체에 대한 포인터나 memoryview가 @ref{1375,,PyMemoryView_FromMemory()} 나 @ref{964,,PyMemoryView_FromBuffer()} 함수 중 하나로 만들어졌으면 @code{NULL}을 반환합니다. `mview'는 `반드시' memoryview 인스턴스여야 합니다.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@geindex object; PickleBuffer
@anchor{c-api/picklebuffer picklebuffer-objects}@anchor{54b5}
@node Pickle buffer objects,약한 참조 객체<2>,MemoryView 객체,기타 객체<2>
@anchor{c-api/picklebuffer doc}@anchor{54b6}@anchor{c-api/picklebuffer pickle-buffer-objects}@anchor{54b7}@anchor{c-api/picklebuffer translation-repo}@anchor{54b8}
@subsubsection Pickle buffer objects



Added in version 3.8.


A @ref{1782,,pickle.PickleBuffer} object wraps a @ref{260,,buffer-providing object} for out-of-band data transfer with the @ref{ab,,pickle} module.

@geindex PyPickleBuffer_Type (C var)
@anchor{c-api/picklebuffer c PyPickleBuffer_Type}@anchor{54b9}
@deffn {C 변수} @ref{c9b,,PyTypeObject} PyPickleBuffer_Type

This instance of @ref{c9b,,PyTypeObject} represents the Python pickle buffer type.
This is the same object as @ref{1782,,pickle.PickleBuffer} in the Python layer.
@end deffn

@geindex PyPickleBuffer_Check (C function)
@anchor{c-api/picklebuffer c PyPickleBuffer_Check}@anchor{54ba}
@deffn {C 함수} int PyPickleBuffer_Check (PyObject *op)

Return true if `op' is a pickle buffer instance.
This function always succeeds.
@end deffn

@geindex PyPickleBuffer_FromObject (C function)
@anchor{c-api/picklebuffer c PyPickleBuffer_FromObject}@anchor{54bb}
@deffn {C 함수} @ref{5dc,,PyObject} *PyPickleBuffer_FromObject (PyObject *obj)

Create a pickle buffer from the object `obj'.

This function will fail if `obj' doesn’t support the @ref{260,,buffer protocol}.

On success, return a new pickle buffer instance.
On failure, set an exception and return @code{NULL}.

Analogous to calling @ref{1782,,pickle.PickleBuffer} with `obj' in Python.
@end deffn

@geindex PyPickleBuffer_GetBuffer (C function)
@anchor{c-api/picklebuffer c PyPickleBuffer_GetBuffer}@anchor{54bc}
@deffn {C 함수} const @ref{95b,,Py_buffer} *PyPickleBuffer_GetBuffer (PyObject *picklebuf)

Get a pointer to the underlying @ref{95b,,Py_buffer} that the pickle buffer wraps.

The returned pointer is valid as long as `picklebuf' is alive and has not been
released. The caller must not modify or free the returned @ref{95b,,Py_buffer}.
If the pickle buffer has been released, raise @ref{2ec,,ValueError}.

On success, return a pointer to the buffer view.
On failure, set an exception and return @code{NULL}.
@end deffn

@geindex PyPickleBuffer_Release (C function)
@anchor{c-api/picklebuffer c PyPickleBuffer_Release}@anchor{54bd}
@deffn {C 함수} int PyPickleBuffer_Release (PyObject *picklebuf)

Release the underlying buffer held by the pickle buffer.

Return @code{0} on success. On failure, set an exception and return @code{-1}.

Analogous to calling @ref{2d43,,pickle.PickleBuffer.release()} in Python.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 약한 참조 객체<2>,캡슐,Pickle buffer objects,기타 객체<2>
@anchor{c-api/weakref doc}@anchor{54be}@anchor{c-api/weakref translation-repo}@anchor{54bf}@anchor{c-api/weakref weak-reference-objects}@anchor{54c0}@anchor{c-api/weakref weakrefobjects}@anchor{52ce}
@subsubsection 약한 참조 객체


파이썬은 `약한 참조'를 1급 객체로 지원합니다. 약한 참조를 직접 구현하는 두 가지 구체적인 객체 형이 있습니다. 첫 번째는 간단한 참조 객체이며, 두 번째는 가능한 한 원래 객체의 프락시 역할을 합니다.

@geindex PyWeakref_Check (C function)
@anchor{c-api/weakref c PyWeakref_Check}@anchor{54c1}
@deffn {C 함수} int PyWeakref_Check (PyObject *ob)

`ob'가 참조 객체나 프락시 객체면 0이 아닌 값을 반환합니다. 이 함수는 항상 성공합니다.
@end deffn

@geindex PyWeakref_CheckRef (C function)
@anchor{c-api/weakref c PyWeakref_CheckRef}@anchor{54c2}
@deffn {C 함수} int PyWeakref_CheckRef (PyObject *ob)

Return non-zero if `ob' is a reference object or a subclass of the reference
type.  This function always succeeds.
@end deffn

@geindex PyWeakref_CheckRefExact (C function)
@anchor{c-api/weakref c PyWeakref_CheckRefExact}@anchor{54c3}
@deffn {C 함수} int PyWeakref_CheckRefExact (PyObject *ob)

Return non-zero if `ob' is a reference object, but not a subclass of the
reference type.  This function always succeeds.
@end deffn

@geindex PyWeakref_CheckProxy (C function)
@anchor{c-api/weakref c PyWeakref_CheckProxy}@anchor{54c4}
@deffn {C 함수} int PyWeakref_CheckProxy (PyObject *ob)

`ob'가 프락시 객체면 0이 아닌 값을 반환합니다. 이 함수는 항상 성공합니다.
@end deffn

@geindex PyWeakref_NewRef (C function)
@anchor{c-api/weakref c PyWeakref_NewRef}@anchor{1be4}
@deffn {C 함수} @ref{5dc,,PyObject} *PyWeakref_NewRef (PyObject *ob, PyObject *callback)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
`ob' 객체에 대한 약한 참조 객체를 반환합니다. 이것은 항상 새로운 참조를 돌려주지만, 새로운 객체를 생성하는 것이 보장되지는 않습니다; 기존 참조 객체가 반환될 수 있습니다. 두 번째 매개 변수인 `callback'은 `ob'가 가비지 수집될 때 알림을 받는 콜러블 객체가 될 수 있습니다; 하나의 매개 변수를 받아들여야 하는데, 약한 참조 객체 자체입니다. `callback'은 @code{None} 이나 @code{NULL} 일 수도 있습니다. `ob'가 약하게 참조할 수 있는 객체가 아니거나, `callback'이 콜러블, @code{None} 또는 @code{NULL}이 아니면, @code{NULL}을 반환하고 @ref{198,,TypeError}를 발생시킵니다.


@subsubheading 더 보기


@ref{5323,,PyType_SUPPORTS_WEAKREFS()} for checking if `ob' is weakly
referenceable.

@end deffn

@geindex PyWeakref_NewProxy (C function)
@anchor{c-api/weakref c PyWeakref_NewProxy}@anchor{515c}
@deffn {C 함수} @ref{5dc,,PyObject} *PyWeakref_NewProxy (PyObject *ob, PyObject *callback)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
`ob' 객체에 대한 약한 참조 프락시 객체를 반환합니다. 이것은 항상 새로운 참조를 돌려주지만, 새로운 객체를 생성하는 것이 보장되지는 않습니다; 기존 프락시 객체가 반환될 수 있습니다. 두 번째 매개 변수인 `callback'은 `ob'가 가비지 수집될 때 알림을 받는 콜러블 객체가 될 수 있습니다; 하나의 매개 변수를 받아들여야 하는데, 약한 참조 객체 자체입니다. `callback'은 @code{None} 이나 @code{NULL} 일 수도 있습니다. `ob'가 약하게 참조할 수 있는 객체가 아니거나, `callback'이 콜러블, @code{None} 또는 @code{NULL}이 아니면, @code{NULL}을 반환하고 @ref{198,,TypeError}를 발생시킵니다.


@subsubheading 더 보기


@ref{5323,,PyType_SUPPORTS_WEAKREFS()} for checking if `ob' is weakly
referenceable.

@end deffn

@geindex PyWeakref_GetRef (C function)
@anchor{c-api/weakref c PyWeakref_GetRef}@anchor{3df}
@deffn {C 함수} int PyWeakref_GetRef (PyObject *ref, PyObject **pobj)
` Part of the @ref{774,,안정 ABI} 버전 3.13 이후로.'
Get a @ref{5df,,strong reference} to the referenced object from a weak
reference, `ref', into `*pobj'.


@itemize *

@item 
On success, set `*pobj' to a new @ref{5df,,strong reference} to the
referenced object and return 1.

@item 
If the reference is dead, set `*pobj' to @code{NULL} and return 0.

@item 
On error, raise an exception and return -1.
@end itemize


Added in version 3.13.

@end deffn

@geindex PyWeakref_GetObject (C function)
@anchor{c-api/weakref c PyWeakref_GetObject}@anchor{3dd}
@deffn {C 함수} @ref{5dc,,PyObject} *PyWeakref_GetObject (PyObject *ref)
`반환값: 빌린 참조.'` Part of the @ref{774,,안정 ABI}.'
약한 참조(`ref')로부터 참조된 객체에 대한 @ref{3d7,,빌린 참조}를 반환합니다. 참조가 더는 살아있지 않으면, @code{Py_None}을 반환합니다.

@cartouche
@quotation 참고 
이 함수는 참조된 객체에 대한 @ref{3d7,,빌린 참조}를 반환합니다. 이는 빌린 참조의 마지막 사용 전에 파괴될 수 없을 때를 제외하고, 객체에 대해 항상 @ref{78e,,Py_INCREF()}를 호출해야 함을 뜻합니다.
@end quotation
@end cartouche


Deprecated since version 3.13, will be removed in version 3.15: 대신 @ref{3df,,PyWeakref_GetRef()}를 사용하십시오.

@end deffn

@geindex PyWeakref_GET_OBJECT (C function)
@anchor{c-api/weakref c PyWeakref_GET_OBJECT}@anchor{3de}
@deffn {C 함수} @ref{5dc,,PyObject} *PyWeakref_GET_OBJECT (PyObject *ref)
`반환값: 빌린 참조.'
@ref{3dd,,PyWeakref_GetObject()}와 유사하지만, 에러 검사를 수행하지 않습니다.


Deprecated since version 3.13, will be removed in version 3.15: 대신 @ref{3df,,PyWeakref_GetRef()}를 사용하십시오.

@end deffn

@geindex PyWeakref_IsDead (C function)
@anchor{c-api/weakref c PyWeakref_IsDead}@anchor{18e0}
@deffn {C 함수} int PyWeakref_IsDead (PyObject *ref)

Test if the weak reference `ref' is dead. Returns 1 if the reference is
dead, 0 if it is alive, and -1 with an error set if `ref' is not a weak
reference object.


Added in version 3.14.

@end deffn

@geindex PyObject_ClearWeakRefs (C function)
@anchor{c-api/weakref c PyObject_ClearWeakRefs}@anchor{795}
@deffn {C 함수} void PyObject_ClearWeakRefs (PyObject *object)
` Part of the @ref{774,,안정 ABI}.'
This function is called by the @ref{4efb,,tp_dealloc} handler
to clear weak references.

This iterates through the weak references for `object' and calls callbacks
for those references which have one. It returns when all callbacks have
been attempted.
@end deffn

@geindex PyUnstable_Object_ClearWeakRefsNoCallbacks (C function)
@anchor{c-api/weakref c PyUnstable_Object_ClearWeakRefsNoCallbacks}@anchor{1996}
@deffn {C 함수} void PyUnstable_Object_ClearWeakRefsNoCallbacks (PyObject *object)

@cartouche
@quotation 이것은 불안정 API. It may change without warning in minor releases. `이것은 @ref{768,,불안정 API}. It may change without warning in minor releases.'
@end quotation
@end cartouche

Clears the weakrefs for `object' without calling the callbacks.

This function is called by the @ref{4efb,,tp_dealloc} handler
for types with finalizers (i.e., @ref{11fc,,__del__()}).  The handler for
those objects first calls @ref{795,,PyObject_ClearWeakRefs()} to clear weakrefs
and call their callbacks, then the finalizer, and finally this function to
clear any weakrefs that may have been created by the finalizer.

In most circumstances, it’s more appropriate to use
@ref{795,,PyObject_ClearWeakRefs()} to clear weakrefs instead of this function.


Added in version 3.13.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 캡슐,Frame Objects,약한 참조 객체<2>,기타 객체<2>
@anchor{c-api/capsule doc}@anchor{54c5}@anchor{c-api/capsule capsules}@anchor{2a16}@anchor{c-api/capsule id1}@anchor{54c6}@anchor{c-api/capsule translation-repo}@anchor{54c7}
@subsubsection 캡슐


@geindex 객체;캡슐

이 객체 사용에 대한 자세한 정보는 @ref{1562,,확장 모듈을 위한 C API 제공하기}를 참조하십시오.


Added in version 3.1.


@geindex PyCapsule (C type)
@anchor{c-api/capsule c PyCapsule}@anchor{1477}
@deffn {C 자료형} type PyCapsule

This subtype of @ref{5dc,,PyObject} represents an opaque value, useful for C
extension modules which need to pass an opaque value (as a void*
pointer) through Python code to other C code.  It is often used to make a C
function pointer defined in one module available to other modules, so the
regular import mechanism can be used to access C APIs defined in dynamically
loaded modules.
@end deffn

@geindex PyCapsule_Type (C var)
@anchor{c-api/capsule c PyCapsule_Type}@anchor{4fdb}
@deffn {C 변수} @ref{c9b,,PyTypeObject} PyCapsule_Type
` Part of the @ref{774,,안정 ABI}.'
The type object corresponding to capsule objects. This is the same object
as @ref{2a15,,types.CapsuleType} in the Python layer.
@end deffn

@geindex PyCapsule_Destructor (C type)
@anchor{c-api/capsule c PyCapsule_Destructor}@anchor{4fd2}
@deffn {C 자료형} type PyCapsule_Destructor
` Part of the @ref{774,,안정 ABI}.'
캡슐에 대한 파괴자(destructor) 콜백 형. 이렇게 정의됩니다:

@example
typedef void (*PyCapsule_Destructor)(PyObject *);
@end example

PyCapsule_Destructor 콜백의 의미는 @ref{4f02,,PyCapsule_New()}를 참조하십시오.
@end deffn

@geindex PyCapsule_CheckExact (C function)
@anchor{c-api/capsule c PyCapsule_CheckExact}@anchor{54c8}
@deffn {C 함수} int PyCapsule_CheckExact (PyObject *p)
` Thread safety: @ref{2735,,Atomic}.'
인자가 @ref{1477,,PyCapsule}이면 참을 돌려줍니다. 이 함수는 항상 성공합니다.
@end deffn

@geindex PyCapsule_New (C function)
@anchor{c-api/capsule c PyCapsule_New}@anchor{4f02}
@deffn {C 함수} @ref{5dc,,PyObject} *PyCapsule_New (void *pointer, const char *name, PyCapsule_Destructor destructor)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'` Thread safety: @ref{2735,,Atomic}.'
`pointer'를 캡슐화하는 @ref{1477,,PyCapsule}을 만듭니다. `pointer' 인자는 @code{NULL}이 아닐 수도 있습니다.

실패하면, 예외를 설정하고 @code{NULL}을 반환합니다.

`name' 문자열은 @code{NULL} 이나 유효한 C 문자열에 대한 포인터일 수 있습니다. @code{NULL}이 아니면, 이 문자열은 캡슐보다 오래 유지되어야 합니다. (`destructor' 내부에서 해제할 수는 있습니다.)

`destructor' 인자가 @code{NULL}이 아니면, 캡슐이 파괴될 때 캡슐을 인자로 호출됩니다.

이 캡슐을 모듈의 어트리뷰트로 저장하려면, `name'을 @code{modulename.attributename}로 지정해야 합니다. 이렇게 하면 다른 모듈이 @ref{1c0e,,PyCapsule_Import()}를 사용하여 캡슐을 임포트 할 수 있습니다.
@end deffn

@geindex PyCapsule_GetPointer (C function)
@anchor{c-api/capsule c PyCapsule_GetPointer}@anchor{4fd6}
@deffn {C 함수} void *PyCapsule_GetPointer (PyObject *capsule, const char *name)
` Part of the @ref{774,,안정 ABI}.'` Thread safety: @ref{272e,,Safe to call without external synchronization on distinct objects}.'
캡슐에 저장된 `pointer'를 가져옵니다. 실패하면, 예외를 설정하고 @code{NULL}을 반환합니다.

`name' 매개 변수는 캡슐에 저장된 이름과 정확하게 비교되어야 합니다. 캡슐에 저장된 이름이 @code{NULL}이면, 전달된 `name'도 @code{NULL} 이어야 합니다. 파이썬은 C 함수 @code{strcmp()}를 사용하여 캡슐 이름을 비교합니다.
@end deffn

@geindex PyCapsule_GetDestructor (C function)
@anchor{c-api/capsule c PyCapsule_GetDestructor}@anchor{4fd4}
@deffn {C 함수} @ref{4fd2,,PyCapsule_Destructor} PyCapsule_GetDestructor (PyObject *capsule)
` Part of the @ref{774,,안정 ABI}.'` Thread safety: @ref{272e,,Safe to call without external synchronization on distinct objects}.'
캡슐에 저장된 현재 파괴자를 반환합니다. 실패하면, 예외를 설정하고 @code{NULL}을 반환합니다.

캡슐이 @code{NULL} 파괴자를 갖는 것은 합법적입니다. 이것은 @code{NULL} 반환 코드를 다소 모호하게 만듭니다; 명확히 하려면 @ref{1561,,PyCapsule_IsValid()} 나 @ref{1cac,,PyErr_Occurred()}를 사용하십시오.
@end deffn

@geindex PyCapsule_GetContext (C function)
@anchor{c-api/capsule c PyCapsule_GetContext}@anchor{4fd3}
@deffn {C 함수} void *PyCapsule_GetContext (PyObject *capsule)
` Part of the @ref{774,,안정 ABI}.'` Thread safety: @ref{272e,,Safe to call without external synchronization on distinct objects}.'
캡슐에 저장된 현재 컨텍스트를 반환합니다. 실패하면, 예외를 설정하고 @code{NULL}을 반환합니다.

캡슐이 @code{NULL} 컨텍스트를 갖는 것은 합법적입니다. 이것은 @code{NULL} 반환 코드를 다소 모호하게 만듭니다; 명확히 하려면 @ref{1561,,PyCapsule_IsValid()} 나 @ref{1cac,,PyErr_Occurred()}를 사용하십시오.
@end deffn

@geindex PyCapsule_GetName (C function)
@anchor{c-api/capsule c PyCapsule_GetName}@anchor{4fd5}
@deffn {C 함수} const char *PyCapsule_GetName (PyObject *capsule)
` Part of the @ref{774,,안정 ABI}.'` Thread safety: @ref{272e,,Safe to call without external synchronization on distinct objects}.'
캡슐에 저장된 현재 이름을 반환합니다. 실패하면, 예외를 설정하고 @code{NULL}을 반환합니다.

캡슐이 @code{NULL} 이름을 갖는 것은 합법적입니다. 이것은 @code{NULL} 반환 코드를 다소 모호하게 만듭니다; 명확히 하려면 @ref{1561,,PyCapsule_IsValid()} 나 @ref{1cac,,PyErr_Occurred()}를 사용하십시오.
@end deffn

@geindex PyCapsule_Import (C function)
@anchor{c-api/capsule c PyCapsule_Import}@anchor{1c0e}
@deffn {C 함수} void *PyCapsule_Import (const char *name, int no_block)
` Part of the @ref{774,,안정 ABI}.'` Thread safety: @ref{2729,,Safe to call from multiple threads with external synchronization only}.'
모듈의 캡슐 어트리뷰트에서 C 객체에 대한 포인터를 임포트 합니다. `name' 매개 변수는 @code{module.attribute} 처럼 어트리뷰트의 전체 이름을 지정해야 합니다. 캡슐에 저장된 `name'은, 이 문자열과 정확히 일치해야 합니다.

이 함수는 `name'을 @code{.} 문자로 분리하고, 첫 번째 요소를 임포트 합니다. 그런 다음 어트리뷰트 조회를 사용하여 나머지 요소들을 처리합니다.

성공하면 캡슐의 내부 `pointer'를 반환합니다. 실패하면, 예외를 설정하고 @code{NULL}를 반환합니다.

@cartouche
@quotation 참고 
만약 `name'이 특정 서브 모듈이나 서브 패키지의 어트리뷰트를 가리키는 경우, 어트리뷰트 조회가 성공하려면 해당 서브 모듈이나 서브 패키지를 다른 방법(예를 들어, @ref{3dc,,PyImport_ImportModule()} 사용)으로 미리 임포트해야 합니다.
@end quotation
@end cartouche


버전 3.3에서 변경: `no_block'은 더는 효과가 없습니다.

@end deffn

@geindex PyCapsule_IsValid (C function)
@anchor{c-api/capsule c PyCapsule_IsValid}@anchor{1561}
@deffn {C 함수} int PyCapsule_IsValid (PyObject *capsule, const char *name)
` Part of the @ref{774,,안정 ABI}.'` Thread safety: @ref{272e,,Safe to call without external synchronization on distinct objects}.'
`capsule'이 유효한 캡슐인지를 판단합니다. 유효한 캡슐은 @code{NULL}이 아니며, @ref{54c8,,PyCapsule_CheckExact()}를 통과하고, @code{NULL}이 아닌 포인터가 저장되며, 내부 이름이 `name' 매개 변수와 일치합니다. (캡슐 이름을 비교하는 방법에 대한 정보는 @ref{4fd6,,PyCapsule_GetPointer()}를 참조하십시오.)

즉, @ref{1561,,PyCapsule_IsValid()}가 참값을 반환하면, 모든 접근자(@code{PyCapsule_Get}으로 시작하는 모든 함수)에 대한 호출이 성공함이 보장됩니다.

객체가 유효하고 전달된 이름과 일치하면 0이 아닌 값을 반환합니다. 그렇지 않으면 @code{0}을 반환합니다. 이 함수는 실패하지 않습니다.
@end deffn

@geindex PyCapsule_SetContext (C function)
@anchor{c-api/capsule c PyCapsule_SetContext}@anchor{4fd7}
@deffn {C 함수} int PyCapsule_SetContext (PyObject *capsule, void *context)
` Part of the @ref{774,,안정 ABI}.'` Thread safety: @ref{272e,,Safe to call without external synchronization on distinct objects}.'
`capsule' 내부의 컨텍스트 포인터를 `context'로 설정합니다.

성공하면 @code{0}을 반환합니다. 실패하면 0이 아닌 값을 반환하고 예외를 설정합니다.
@end deffn

@geindex PyCapsule_SetDestructor (C function)
@anchor{c-api/capsule c PyCapsule_SetDestructor}@anchor{4fd8}
@deffn {C 함수} int PyCapsule_SetDestructor (PyObject *capsule, PyCapsule_Destructor destructor)
` Part of the @ref{774,,안정 ABI}.'` Thread safety: @ref{272e,,Safe to call without external synchronization on distinct objects}.'
`capsule' 내부의 파괴자를 `destructor'로 설정합니다.

성공하면 @code{0}을 반환합니다. 실패하면 0이 아닌 값을 반환하고 예외를 설정합니다.
@end deffn

@geindex PyCapsule_SetName (C function)
@anchor{c-api/capsule c PyCapsule_SetName}@anchor{4fd9}
@deffn {C 함수} int PyCapsule_SetName (PyObject *capsule, const char *name)
` Part of the @ref{774,,안정 ABI}.'` Thread safety: @ref{272e,,Safe to call without external synchronization on distinct objects}.'
`capsule' 내부의 이름을 `name'으로 설정합니다. @code{NULL}이 아니면, 이름은 캡슐보다 오래 유지되어야 합니다. 캡슐에 저장된 이전 `name'이 @code{NULL}이 아니면, 이를 해제하려고 시도하지 않습니다.

성공하면 @code{0}을 반환합니다. 실패하면 0이 아닌 값을 반환하고 예외를 설정합니다.
@end deffn

@geindex PyCapsule_SetPointer (C function)
@anchor{c-api/capsule c PyCapsule_SetPointer}@anchor{4fda}
@deffn {C 함수} int PyCapsule_SetPointer (PyObject *capsule, void *pointer)
` Part of the @ref{774,,안정 ABI}.'` Thread safety: @ref{272e,,Safe to call without external synchronization on distinct objects}.'
`capsule' 내부의 void 포인터를 `pointer'로 설정합니다. 포인터는 @code{NULL}이 아닐 수 있습니다.

성공하면 @code{0}을 반환합니다. 실패하면 0이 아닌 값을 반환하고 예외를 설정합니다.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Frame Objects,제너레이터 객체,캡슐,기타 객체<2>
@anchor{c-api/frame doc}@anchor{54c9}@anchor{c-api/frame frame-objects}@anchor{54ca}@anchor{c-api/frame translation-repo}@anchor{54cb}
@subsubsection Frame Objects


@geindex PyFrameObject (C type)
@anchor{c-api/frame c PyFrameObject}@anchor{98b}
@deffn {C 자료형} type PyFrameObject
` Part of the @ref{774,,제한된 API} (as an opaque struct).'
The C structure of the objects used to describe frame objects.

There are no public members in this structure.


버전 3.11에서 변경: The members of this structure were removed from the public C API.
Refer to the @ref{98a,,What’s New entry}
for details.

@end deffn

The @ref{1b37,,PyEval_GetFrame()} and @ref{990,,PyThreadState_GetFrame()} functions
can be used to get a frame object.

See also @ref{52a1,,Reflection}.

@geindex PyFrame_Type (C var)
@anchor{c-api/frame c PyFrame_Type}@anchor{989}
@deffn {C 변수} @ref{c9b,,PyTypeObject} PyFrame_Type

The type of frame objects.
It is the same object as @ref{1bec,,types.FrameType} in the Python layer.


버전 3.11에서 변경: Previously, this type was only available after including
@code{<frameobject.h>}.

@end deffn

@geindex PyFrame_New (C function)
@anchor{c-api/frame c PyFrame_New}@anchor{1aed}
@deffn {C 함수} @ref{98b,,PyFrameObject} *PyFrame_New (PyThreadState *tstate, PyCodeObject *code, PyObject *globals, PyObject *locals)

Create a new frame object. This function returns a @ref{5df,,strong reference}
to the new frame object on success, and returns @code{NULL} with an exception
set on failure.
@end deffn

@geindex PyFrame_Check (C function)
@anchor{c-api/frame c PyFrame_Check}@anchor{987}
@deffn {C 함수} int PyFrame_Check (PyObject *obj)

Return non-zero if `obj' is a frame object.


버전 3.11에서 변경: Previously, this function was only available after including
@code{<frameobject.h>}.

@end deffn

@geindex PyFrame_GetBack (C function)
@anchor{c-api/frame c PyFrame_GetBack}@anchor{988}
@deffn {C 함수} @ref{98b,,PyFrameObject} *PyFrame_GetBack (PyFrameObject *frame)
`반환값: 새 참조.'
Get the `frame' next outer frame.

Return a @ref{5df,,strong reference}, or @code{NULL} if `frame' has no outer
frame.
This raises no exceptions.


Added in version 3.9.

@end deffn

@geindex PyFrame_GetBuiltins (C function)
@anchor{c-api/frame c PyFrame_GetBuiltins}@anchor{96e}
@deffn {C 함수} @ref{5dc,,PyObject} *PyFrame_GetBuiltins (PyFrameObject *frame)
`반환값: 새 참조.'
Get the `frame'’s @ref{239b,,f_builtins} attribute.

Return a @ref{5df,,strong reference}. The result cannot be @code{NULL}.


Added in version 3.11.

@end deffn

@geindex PyFrame_GetCode (C function)
@anchor{c-api/frame c PyFrame_GetCode}@anchor{98c}
@deffn {C 함수} @ref{97a,,PyCodeObject} *PyFrame_GetCode (PyFrameObject *frame)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI} 버전 3.10 이후로.'
Get the `frame' code.

Return a @ref{5df,,strong reference}.

The result (frame code) cannot be @code{NULL}.


Added in version 3.9.

@end deffn

@geindex PyFrame_GetGenerator (C function)
@anchor{c-api/frame c PyFrame_GetGenerator}@anchor{96f}
@deffn {C 함수} @ref{5dc,,PyObject} *PyFrame_GetGenerator (PyFrameObject *frame)
`반환값: 새 참조.'
Get the generator, coroutine, or async generator that owns this frame,
or @code{NULL} if this frame is not owned by a generator.
Does not raise an exception, even if the return value is @code{NULL}.

Return a @ref{5df,,strong reference}, or @code{NULL}.


Added in version 3.11.

@end deffn

@geindex PyFrame_GetGlobals (C function)
@anchor{c-api/frame c PyFrame_GetGlobals}@anchor{970}
@deffn {C 함수} @ref{5dc,,PyObject} *PyFrame_GetGlobals (PyFrameObject *frame)
`반환값: 새 참조.'
Get the `frame'’s @ref{239a,,f_globals} attribute.

Return a @ref{5df,,strong reference}. The result cannot be @code{NULL}.


Added in version 3.11.

@end deffn

@geindex PyFrame_GetLasti (C function)
@anchor{c-api/frame c PyFrame_GetLasti}@anchor{971}
@deffn {C 함수} int PyFrame_GetLasti (PyFrameObject *frame)

Get the `frame'’s @ref{a88,,f_lasti} attribute.

Returns -1 if @code{frame.f_lasti} is @code{None}.


Added in version 3.11.

@end deffn

@geindex PyFrame_GetVar (C function)
@anchor{c-api/frame c PyFrame_GetVar}@anchor{788}
@deffn {C 함수} @ref{5dc,,PyObject} *PyFrame_GetVar (PyFrameObject *frame, PyObject *name)
`반환값: 새 참조.'
Get the variable `name' of `frame'.


@itemize *

@item 
Return a @ref{5df,,strong reference} to the variable value on success.

@item 
Raise @ref{452,,NameError} and return @code{NULL} if the variable does not exist.

@item 
Raise an exception and return @code{NULL} on error.
@end itemize

`name' type must be a @ref{169,,str}.


Added in version 3.12.

@end deffn

@geindex PyFrame_GetVarString (C function)
@anchor{c-api/frame c PyFrame_GetVarString}@anchor{789}
@deffn {C 함수} @ref{5dc,,PyObject} *PyFrame_GetVarString (PyFrameObject *frame, const char *name)
`반환값: 새 참조.'
Similar to @ref{788,,PyFrame_GetVar()}, but the variable name is a C string
encoded in UTF-8.


Added in version 3.12.

@end deffn

@geindex PyFrame_GetLocals (C function)
@anchor{c-api/frame c PyFrame_GetLocals}@anchor{65f}
@deffn {C 함수} @ref{5dc,,PyObject} *PyFrame_GetLocals (PyFrameObject *frame)
`반환값: 새 참조.'
Get the `frame'’s @ref{4a6,,f_locals} attribute.
If the frame refers to an @ref{4a2,,optimized scope}, this returns a
write-through proxy object that allows modifying the locals.
In all other cases (classes, modules, @ref{4a3,,exec()}, @ref{4a4,,eval()}) it returns
the mapping representing the frame locals directly (as described for
@ref{46f,,locals()}).

Return a @ref{5df,,strong reference}.


Added in version 3.11.



버전 3.13에서 변경: As part of 
@geindex Python 향상 제안; PEP 667
PEP 667@footnote{https://peps.python.org/pep-0667/}, return an instance of @ref{54cc,,PyFrameLocalsProxy_Type}.

@end deffn

@geindex PyFrame_GetLineNumber (C function)
@anchor{c-api/frame c PyFrame_GetLineNumber}@anchor{98d}
@deffn {C 함수} int PyFrame_GetLineNumber (PyFrameObject *frame)
` Part of the @ref{774,,안정 ABI} 버전 3.10 이후로.'
Return the line number that `frame' is currently executing.
@end deffn

@menu
* Frame Locals Proxies:: 
* Legacy Local Variable APIs:: 
* Internal Frames:: 

@end menu

@node Frame Locals Proxies,Legacy Local Variable APIs,,Frame Objects
@anchor{c-api/frame frame-locals-proxies}@anchor{54cd}
@subsubsection Frame Locals Proxies



Added in version 3.13.


The @ref{4a6,,f_locals} attribute on a @ref{8ee,,frame object}
is an instance of a “frame-locals proxy”. The proxy object exposes a
write-through view of the underlying locals dictionary for the frame. This
ensures that the variables exposed by @code{f_locals} are always up to date with
the live local variables in the frame itself.

See 
@geindex Python 향상 제안; PEP 667
PEP 667@footnote{https://peps.python.org/pep-0667/} for more information.

@geindex PyFrameLocalsProxy_Type (C var)
@anchor{c-api/frame c PyFrameLocalsProxy_Type}@anchor{54cc}
@deffn {C 변수} @ref{c9b,,PyTypeObject} PyFrameLocalsProxy_Type

The type of frame @ref{46f,,locals()} proxy objects.
@end deffn

@geindex PyFrameLocalsProxy_Check (C function)
@anchor{c-api/frame c PyFrameLocalsProxy_Check}@anchor{54ce}
@deffn {C 함수} int PyFrameLocalsProxy_Check (PyObject *obj)

Return non-zero if `obj' is a frame @ref{46f,,locals()} proxy.
@end deffn

@node Legacy Local Variable APIs,Internal Frames,Frame Locals Proxies,Frame Objects
@anchor{c-api/frame legacy-local-variable-apis}@anchor{54cf}
@subsubsection Legacy Local Variable APIs


These APIs are @ref{23d,,soft deprecated}. As of Python 3.13, they do nothing.
They exist solely for backwards compatibility.

@geindex PyFrame_LocalsToFast (C function)
@anchor{c-api/frame c PyFrame_LocalsToFast}@anchor{54d0}
@deffn {C 함수} void PyFrame_LocalsToFast (PyFrameObject *f, int clear)

This function is @ref{23d,,soft deprecated} and does nothing.

Prior to Python 3.13, this function would copy the @ref{4a6,,f_locals}
attribute of `f' to the internal “fast” array of local variables, allowing
changes in frame objects to be visible to the interpreter. If `clear' was
true, this function would process variables that were unset in the locals
dictionary.


버전 3.13에서 변경: This function now does nothing.

@end deffn

@geindex PyFrame_FastToLocals (C function)
@anchor{c-api/frame c PyFrame_FastToLocals}@anchor{54d1}
@deffn {C 함수} void PyFrame_FastToLocals (PyFrameObject *f)

This function is @ref{23d,,soft deprecated} and does nothing.

Prior to Python 3.13, this function would copy the internal “fast” array
of local variables (which is used by the interpreter) to the
@ref{4a6,,f_locals} attribute of `f', allowing changes in local
variables to be visible to frame objects.


버전 3.13에서 변경: This function now does nothing.

@end deffn

@geindex PyFrame_FastToLocalsWithError (C function)
@anchor{c-api/frame c PyFrame_FastToLocalsWithError}@anchor{54d2}
@deffn {C 함수} int PyFrame_FastToLocalsWithError (PyFrameObject *f)

This function is @ref{23d,,soft deprecated} and does nothing.

Prior to Python 3.13, this function was similar to
@ref{54d1,,PyFrame_FastToLocals()}, but would return @code{0} on success, and
@code{-1} with an exception set on failure.


버전 3.13에서 변경: This function now does nothing.

@end deffn


@subsubheading 더 보기


@geindex Python 향상 제안; PEP 667
PEP 667@footnote{https://peps.python.org/pep-0667/}


@node Internal Frames,,Legacy Local Variable APIs,Frame Objects
@anchor{c-api/frame internal-frames}@anchor{54d3}
@subsubsection Internal Frames


Unless using 
@geindex Python 향상 제안; PEP 523
PEP 523@footnote{https://peps.python.org/pep-0523/}, you will not need this.

@geindex _PyInterpreterFrame (C struct)
@anchor{c-api/frame c _PyInterpreterFrame}@anchor{196f}
@deffn {C 구조체} struct _PyInterpreterFrame

The interpreter’s internal frame representation.


Added in version 3.11.

@end deffn

@geindex PyUnstable_InterpreterFrame_GetCode (C function)
@anchor{c-api/frame c PyUnstable_InterpreterFrame_GetCode}@anchor{54d4}
@deffn {C 함수} @ref{5dc,,PyObject} *PyUnstable_InterpreterFrame_GetCode (struct _PyInterpreterFrame *frame);

@cartouche
@quotation 이것은 불안정 API. It may change without warning in minor releases. `이것은 @ref{768,,불안정 API}. It may change without warning in minor releases.'
@end quotation
@end cartouche

@quotation

Return a @ref{5df,,strong reference} to the code object for the frame.
@end quotation


Added in version 3.12.

@end deffn

@geindex PyUnstable_InterpreterFrame_GetLasti (C function)
@anchor{c-api/frame c PyUnstable_InterpreterFrame_GetLasti}@anchor{54d5}
@deffn {C 함수} int PyUnstable_InterpreterFrame_GetLasti (struct _PyInterpreterFrame *frame);

@cartouche
@quotation 이것은 불안정 API. It may change without warning in minor releases. `이것은 @ref{768,,불안정 API}. It may change without warning in minor releases.'
@end quotation
@end cartouche

Return the byte offset into the last executed instruction.


Added in version 3.12.

@end deffn

@geindex PyUnstable_InterpreterFrame_GetLine (C function)
@anchor{c-api/frame c PyUnstable_InterpreterFrame_GetLine}@anchor{54d6}
@deffn {C 함수} int PyUnstable_InterpreterFrame_GetLine (struct _PyInterpreterFrame *frame);

@cartouche
@quotation 이것은 불안정 API. It may change without warning in minor releases. `이것은 @ref{768,,불안정 API}. It may change without warning in minor releases.'
@end quotation
@end cartouche

Return the currently executing line number, or -1 if there is no line number.


Added in version 3.12.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 제너레이터 객체,코루틴 객체,Frame Objects,기타 객체<2>
@anchor{c-api/gen doc}@anchor{54d7}@anchor{c-api/gen gen-objects}@anchor{54d8}@anchor{c-api/gen generator-objects}@anchor{54d9}@anchor{c-api/gen translation-repo}@anchor{54da}
@subsubsection 제너레이터 객체


제너레이터 객체는 파이썬이 제너레이터 이터레이터를 구현하기 위해 사용하는 객체입니다. 일반적으로 @ref{54db,,PyGen_New()} 또는 @ref{54dc,,PyGen_NewWithQualName()}를 명시적으로 호출하는 것이 아니라, 값을 일드(yield)하는 함수를 이터레이트하여 만들어집니다.

@geindex PyGenObject (C type)
@anchor{c-api/gen c PyGenObject}@anchor{54dd}
@deffn {C 자료형} type PyGenObject

제너레이터 객체에 사용되는 C 구조체.
@end deffn

@geindex PyGen_Type (C var)
@anchor{c-api/gen c PyGen_Type}@anchor{54de}
@deffn {C 변수} @ref{c9b,,PyTypeObject} PyGen_Type

제너레이터 객체에 해당하는 형 객체
@end deffn

@geindex PyGen_Check (C function)
@anchor{c-api/gen c PyGen_Check}@anchor{54df}
@deffn {C 함수} int PyGen_Check (PyObject *ob)

`ob'가 제너레이터 객체면 참을 돌려줍니다; `ob'는 @code{NULL}이 아니어야 합니다. 이 함수는 항상 성공합니다.
@end deffn

@geindex PyGen_CheckExact (C function)
@anchor{c-api/gen c PyGen_CheckExact}@anchor{54e0}
@deffn {C 함수} int PyGen_CheckExact (PyObject *ob)

`ob'의 형이 @ref{54de,,PyGen_Type}이면 참을 돌려줍니다; `ob'는 @code{NULL}이 아니어야 합니다. 이 함수는 항상 성공합니다.
@end deffn

@geindex PyGen_New (C function)
@anchor{c-api/gen c PyGen_New}@anchor{54db}
@deffn {C 함수} @ref{5dc,,PyObject} *PyGen_New (PyFrameObject *frame)
`반환값: 새 참조.'
`frame' 객체에 기반한 새 제너레이터 객체를 만들어 반환합니다. 이 함수는 `frame'에 대한 참조를 훔칩니다. 인자는 @code{NULL}이 아니어야 합니다.
@end deffn

@geindex PyGen_NewWithQualName (C function)
@anchor{c-api/gen c PyGen_NewWithQualName}@anchor{54dc}
@deffn {C 함수} @ref{5dc,,PyObject} *PyGen_NewWithQualName (PyFrameObject *frame, PyObject *name, PyObject *qualname)
`반환값: 새 참조.'
`frame' 객체에 기반한 새 제너레이터 객체를 만들어 반환하는데, @code{__name__} 과 @code{__qualname__}를 `name' 및 `qualname'로 설정합니다. 이 함수는 `frame'에 대한 참조를 훔칩니다. `frame' 인자는 @code{NULL}이 아니어야 합니다.
@end deffn

@geindex PyGen_GetCode (C function)
@anchor{c-api/gen c PyGen_GetCode}@anchor{54e1}
@deffn {C 함수} @ref{97a,,PyCodeObject} *PyGen_GetCode (PyGenObject *gen)

Return a new @ref{5df,,strong reference} to the code object wrapped by `gen'.
This function always succeeds.
@end deffn

@menu
* Asynchronous Generator Objects:: 
* Deprecated API: Deprecated API<5>. 

@end menu

@node Asynchronous Generator Objects,Deprecated API<5>,,제너레이터 객체
@anchor{c-api/gen asynchronous-generator-objects}@anchor{54e2}
@subsubsection Asynchronous Generator Objects



@subsubheading 더 보기


@geindex Python 향상 제안; PEP 525
PEP 525@footnote{https://peps.python.org/pep-0525/}


@geindex PyAsyncGen_Type (C var)
@anchor{c-api/gen c PyAsyncGen_Type}@anchor{54e3}
@deffn {C 변수} @ref{c9b,,PyTypeObject} PyAsyncGen_Type

The type object corresponding to asynchronous generator objects. This is
available as @ref{2a0a,,types.AsyncGeneratorType} in the Python layer.


Added in version 3.6.

@end deffn

@geindex PyAsyncGen_New (C function)
@anchor{c-api/gen c PyAsyncGen_New}@anchor{54e4}
@deffn {C 함수} @ref{5dc,,PyObject} *PyAsyncGen_New (PyFrameObject *frame, PyObject *name, PyObject *qualname)

Create a new asynchronous generator wrapping `frame', with @code{__name__} and
@code{__qualname__} set to `name' and `qualname'. `frame' is stolen by this
function and must not be @code{NULL}.

On success, this function returns a @ref{5df,,strong reference} to the
new asynchronous generator. On failure, this function returns @code{NULL}
with an exception set.


Added in version 3.6.

@end deffn

@geindex PyAsyncGen_CheckExact (C function)
@anchor{c-api/gen c PyAsyncGen_CheckExact}@anchor{54e5}
@deffn {C 함수} int PyAsyncGen_CheckExact (PyObject *op)

Return true if `op' is an asynchronous generator object, false otherwise.
This function always succeeds.


Added in version 3.6.

@end deffn

@node Deprecated API<5>,,Asynchronous Generator Objects,제너레이터 객체
@anchor{c-api/gen deprecated-api}@anchor{54e6}
@subsubsection Deprecated API


@geindex PyAsyncGenASend_CheckExact (C macro)
@anchor{c-api/gen c PyAsyncGenASend_CheckExact}@anchor{54e7}
@deffn {C 매크로} PyAsyncGenASend_CheckExact (op)

This is a @ref{23d,,soft deprecated} API that was included in Python’s C API
by mistake.

It is solely here for completeness; do not use this API.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 코루틴 객체,컨텍스트 변수 객체,제너레이터 객체,기타 객체<2>
@anchor{c-api/coro doc}@anchor{54e8}@anchor{c-api/coro coro-objects}@anchor{10cf}@anchor{c-api/coro coroutine-objects}@anchor{54e9}@anchor{c-api/coro translation-repo}@anchor{54ea}
@subsubsection 코루틴 객체



Added in version 3.5.


코루틴 객체는 @code{async} 키워드로 선언된 함수가 반환하는 것입니다.

@geindex PyCoroObject (C type)
@anchor{c-api/coro c PyCoroObject}@anchor{54eb}
@deffn {C 자료형} type PyCoroObject

코루틴 객체에 사용되는 C 구조체.
@end deffn

@geindex PyCoro_Type (C var)
@anchor{c-api/coro c PyCoro_Type}@anchor{54ec}
@deffn {C 변수} @ref{c9b,,PyTypeObject} PyCoro_Type

코루틴 객체에 해당하는 형 객체.
@end deffn

@geindex PyCoro_CheckExact (C function)
@anchor{c-api/coro c PyCoro_CheckExact}@anchor{54ed}
@deffn {C 함수} int PyCoro_CheckExact (PyObject *ob)

`ob'의 형이 @ref{54ec,,PyCoro_Type}이면 참을 반환합니다. `ob'는 @code{NULL}일 수 없습니다. 이 함수는 항상 성공합니다.
@end deffn

@geindex PyCoro_New (C function)
@anchor{c-api/coro c PyCoro_New}@anchor{54ee}
@deffn {C 함수} @ref{5dc,,PyObject} *PyCoro_New (PyFrameObject *frame, PyObject *name, PyObject *qualname)
`반환값: 새 참조.'
`frame' 객체를 기반으로 새 코루틴 객체를 만들어서 반환합니다. @code{__name__} 과 @code{__qualname__}은 `name' 과 `qualname'로 설정합니다. 이 함수는 `frame'에 대한 참조를 훔칩니다. `frame' 인자는 @code{NULL}일 수 없습니다.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 컨텍스트 변수 객체,Objects for Type Hinting,코루틴 객체,기타 객체<2>
@anchor{c-api/contextvars doc}@anchor{54ef}@anchor{c-api/contextvars context-variables-objects}@anchor{54f0}@anchor{c-api/contextvars contextvarsobjects}@anchor{cef}@anchor{c-api/contextvars translation-repo}@anchor{54f1}
@subsubsection 컨텍스트 변수 객체

@anchor{c-api/contextvars contextvarsobjects-pointertype-change}@anchor{e1e}

Added in version 3.7.



버전 3.7.1에서 변경: 

@cartouche
@quotation 참고 
파이썬 3.7.1에서 모든 컨텍스트 변수 C API의 서명이 @ref{54f2,,PyContext}, @ref{54f3,,PyContextVar} 및 @ref{54f4,,PyContextToken} 대신 @ref{5dc,,PyObject} 포인터를 사용하도록 `변경되었습니다', 예를 들어:

@example
// in 3.7.0:
PyContext *PyContext_New(void);

// in 3.7.1+:
PyObject *PyContext_New(void);
@end example

자세한 내용은 bpo-34762@footnote{https://bugs.python.org/issue?@@action=redirect&bpo=34762}를 참조하십시오.
@end quotation
@end cartouche


이 절에서는 @ref{28,,contextvars} 모듈을 위한 공용 C API에 대해 자세히 설명합니다.

@geindex PyContext (C type)
@anchor{c-api/contextvars c PyContext}@anchor{54f2}
@deffn {C 자료형} type PyContext

@ref{177,,contextvars.Context} 객체를 나타내는 데 사용되는 C 구조체.
@end deffn

@geindex PyContextVar (C type)
@anchor{c-api/contextvars c PyContextVar}@anchor{54f3}
@deffn {C 자료형} type PyContextVar

@ref{1878,,contextvars.ContextVar} 객체를 나타내는 데 사용되는 C 구조체.
@end deffn

@geindex PyContextToken (C type)
@anchor{c-api/contextvars c PyContextToken}@anchor{54f4}
@deffn {C 자료형} type PyContextToken

@ref{1e2,,contextvars.Token} 객체를 나타내는 데 사용되는 C 구조체.
@end deffn

@geindex PyContext_Type (C var)
@anchor{c-api/contextvars c PyContext_Type}@anchor{54f5}
@deffn {C 변수} @ref{c9b,,PyTypeObject} PyContext_Type

`context' 형을 나타내는 형 객체.
@end deffn

@geindex PyContextVar_Type (C var)
@anchor{c-api/contextvars c PyContextVar_Type}@anchor{54f6}
@deffn {C 변수} @ref{c9b,,PyTypeObject} PyContextVar_Type

`컨텍스트 변수' 형을 나타내는 형 객체.
@end deffn

@geindex PyContextToken_Type (C var)
@anchor{c-api/contextvars c PyContextToken_Type}@anchor{54f7}
@deffn {C 변수} @ref{c9b,,PyTypeObject} PyContextToken_Type

`컨텍스트 변수 토큰' 형을 나타내는 형 객체.
@end deffn

형 검사 매크로:

@geindex PyContext_CheckExact (C function)
@anchor{c-api/contextvars c PyContext_CheckExact}@anchor{54f8}
@deffn {C 함수} int PyContext_CheckExact (PyObject *o)

`o'가 @ref{54f5,,PyContext_Type} 형이면 참을 돌려줍니다. `o'는 @code{NULL}이 아니어야 합니다. 이 함수는 항상 성공합니다.
@end deffn

@geindex PyContextVar_CheckExact (C function)
@anchor{c-api/contextvars c PyContextVar_CheckExact}@anchor{54f9}
@deffn {C 함수} int PyContextVar_CheckExact (PyObject *o)

`o'가 @ref{54f6,,PyContextVar_Type} 형이면 참을 돌려줍니다. `o'는 @code{NULL}이 아니어야 합니다. 이 함수는 항상 성공합니다.
@end deffn

@geindex PyContextToken_CheckExact (C function)
@anchor{c-api/contextvars c PyContextToken_CheckExact}@anchor{54fa}
@deffn {C 함수} int PyContextToken_CheckExact (PyObject *o)

`o'가 @ref{54f7,,PyContextToken_Type} 형이면 참을 돌려줍니다. `o'는 @code{NULL}이 아니어야 합니다. 이 함수는 항상 성공합니다.
@end deffn

컨텍스트 객체 관리 함수:

@geindex PyContext_New (C function)
@anchor{c-api/contextvars c PyContext_New}@anchor{54fb}
@deffn {C 함수} @ref{5dc,,PyObject} *PyContext_New (void)
`반환값: 새 참조.'
새로운 빈 컨텍스트 객체를 만듭니다. 에러가 발생하면 @code{NULL}를 반환합니다.
@end deffn

@geindex PyContext_Copy (C function)
@anchor{c-api/contextvars c PyContext_Copy}@anchor{54fc}
@deffn {C 함수} @ref{5dc,,PyObject} *PyContext_Copy (PyObject *ctx)
`반환값: 새 참조.'
전달된 `ctx' 컨텍스트 객체의 얕은 복사본을 만듭니다. 에러가 발생하면 @code{NULL}을 반환합니다.
@end deffn

@geindex PyContext_CopyCurrent (C function)
@anchor{c-api/contextvars c PyContext_CopyCurrent}@anchor{54fd}
@deffn {C 함수} @ref{5dc,,PyObject} *PyContext_CopyCurrent (void)
`반환값: 새 참조.'
현재 스레드 컨텍스트의 얕은 복사본을 만듭니다. 에러가 발생하면 @code{NULL}을 반환합니다.
@end deffn

@geindex PyContext_Enter (C function)
@anchor{c-api/contextvars c PyContext_Enter}@anchor{54fe}
@deffn {C 함수} int PyContext_Enter (PyObject *ctx)

현재 스레드의 현재 컨텍스트로 `ctx'를 설정합니다. 성공 시 @code{0}을 반환하고, 에러 시 @code{-1}을 반환합니다.
@end deffn

@geindex PyContext_Exit (C function)
@anchor{c-api/contextvars c PyContext_Exit}@anchor{54ff}
@deffn {C 함수} int PyContext_Exit (PyObject *ctx)

`ctx' 컨텍스트를 비활성화하고 이전 컨텍스트를 현재 스레드의 현재 컨텍스트로 복원합니다. 성공 시 @code{0}을 반환하고, 에러 시 @code{-1}을 반환합니다.
@end deffn

@geindex PyContext_AddWatcher (C function)
@anchor{c-api/contextvars c PyContext_AddWatcher}@anchor{1993}
@deffn {C 함수} int PyContext_AddWatcher (PyContext_WatchCallback callback)

현재 인터프리터에 대한 컨텍스트 객체 감시자로 `callback'을 등록합니다. @ref{1994,,PyContext_ClearWatcher()}에 전달할 수 있는 ID를 반환합니다. 에러가 발생한 경우(예를 들어, 사용 가능한 감시자 ID가 더 이상 없는 경우) @code{-1}을 반환하고 예외를 설정합니다.


Added in version 3.14.

@end deffn

@geindex PyContext_ClearWatcher (C function)
@anchor{c-api/contextvars c PyContext_ClearWatcher}@anchor{1994}
@deffn {C 함수} int PyContext_ClearWatcher (int watcher_id)

현재 인터프리터에 대해 @ref{1993,,PyContext_AddWatcher()}에서 이전에 반환된 `watcher_id'로 식별된 감시자를 지웁니다. 성공 시 @code{0}을 반환하고, 에러 시(예를 들어, 주어진 `watcher_id'가 등록된 적이 없는 경우) @code{-1}을 반환하고 예외를 설정합니다.


Added in version 3.14.

@end deffn

@geindex PyContextEvent (C type)
@anchor{c-api/contextvars c PyContextEvent}@anchor{5500}
@deffn {C 자료형} type PyContextEvent

컨텍스트 객체 감시자 이벤트의 가능한 열거형:


@itemize -

@item 
@code{Py_CONTEXT_SWITCHED}: @ref{1965,,현재 컨텍스트}가 다른 컨텍스트로 전환되었습니다. 감시자 콜백에 전달된 객체는 이제 현재 @ref{177,,contextvars.Context} 객체이거나, 현재 컨텍스트가 없는 경우 None입니다.
@end itemize


Added in version 3.14.

@end deffn

@geindex PyContext_WatchCallback (C type)
@anchor{c-api/contextvars c PyContext_WatchCallback}@anchor{5501}
@deffn {C 자료형} typedef int (*PyContext_WatchCallback)(@ref{5500,,PyContextEvent} event, @ref{5dc,,PyObject} *obj)

컨텍스트 객체 감시자 콜백 함수. 콜백에 전달된 객체는 이벤트마다 다릅니다. 자세한 내용은 @ref{5500,,PyContextEvent}를 참조하십시오.

콜백이 예외가 설정된 상태로 반환되면, 반드시 @code{-1}을 반환해야 합니다; 이 예외는 @ref{5f0,,PyErr_FormatUnraisable()}을 사용하여 발생할 수 없는 예외로 인쇄됩니다. 그렇지 않으면 @code{0}을 반환해야 합니다.

콜백에 진입할 때 이미 예외가 설정되어 있을 수 있습니다. 이 경우, 콜백은 해당 예외를 그대로 유지한 채 @code{0}을 반환해야 합니다. 콜백에서 예외를 설정할 수 있는 다른 API를 호출하려면, 먼저 기존의 예외 상태를 저장하고 지운 후 반환 직전에 이를 다시 복원해야 합니다.


Added in version 3.14.

@end deffn

컨텍스트 변수 함수:

@geindex PyContextVar_New (C function)
@anchor{c-api/contextvars c PyContextVar_New}@anchor{5502}
@deffn {C 함수} @ref{5dc,,PyObject} *PyContextVar_New (const char *name, PyObject *def)
`반환값: 새 참조.'
새 @code{ContextVar} 객체를 만듭니다. `name' 매개 변수는 인트로스펙션과 디버그 목적으로 사용됩니다. `def' 매개 변수는 컨텍스트 변수의 기본값을 지정할 수 있습니다. @code{NULL}은 기본값 없음입니다. 에러가 발생하면, 이 함수는 @code{NULL}을 반환합니다.
@end deffn

@geindex PyContextVar_Get (C function)
@anchor{c-api/contextvars c PyContextVar_Get}@anchor{5503}
@deffn {C 함수} int PyContextVar_Get (PyObject *var, PyObject *default_value, PyObject **value)

컨텍스트 변수의 값을 가져옵니다. 조회하는 동안 에러가 발생하면 @code{-1}을 반환하고, 값이 있는지와 상관없이 에러가 발생하지 않으면 @code{0}을 반환합니다.

컨텍스트 변수가 발견되면, `value'는 그것을 가리키는 포인터가 됩니다. 컨텍스트 변수가 발견되지 `않으면', `value'는 다음을 가리 킵니다:


@itemize -

@item 
`default_value', @code{NULL}이 아니면;

@item 
`var'의 기본값, @code{NULL}이 아니면;

@item 
@code{NULL}
@end itemize

@code{NULL}일 때를 제외하고, 이 함수는 새 참조를 반환합니다.
@end deffn

@geindex PyContextVar_Set (C function)
@anchor{c-api/contextvars c PyContextVar_Set}@anchor{5504}
@deffn {C 함수} @ref{5dc,,PyObject} *PyContextVar_Set (PyObject *var, PyObject *value)
`반환값: 새 참조.'
현재 컨텍스트에서 `var'의 값을 `value'로 설정합니다. 이 변경에 대한 새 토큰 객체를 반환하거나, 에러가 발생하면 @code{NULL}을 반환합니다.
@end deffn

@geindex PyContextVar_Reset (C function)
@anchor{c-api/contextvars c PyContextVar_Reset}@anchor{5505}
@deffn {C 함수} int PyContextVar_Reset (PyObject *var, PyObject *token)

`var' 컨텍스트 변수의 상태를 `token'을 반환한 @ref{5504,,PyContextVar_Set()} 호출 전의 상태로 재설정합니다. 이 함수는 성공 시 @code{0}을 반환하고, 에러 시 @code{-1}을 반환합니다.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Objects for Type Hinting,,컨텍스트 변수 객체,기타 객체<2>
@anchor{c-api/typehints doc}@anchor{5506}@anchor{c-api/typehints objects-for-type-hinting}@anchor{5507}@anchor{c-api/typehints translation-repo}@anchor{5508}@anchor{c-api/typehints typehintobjects}@anchor{5509}
@subsubsection Objects for Type Hinting


Various built-in types for type hinting are provided.  Currently,
two types exist – @ref{8c0,,GenericAlias} and
@ref{9c5,,Union}.  Only @code{GenericAlias} is exposed to C.

@geindex Py_GenericAlias (C function)
@anchor{c-api/typehints c Py_GenericAlias}@anchor{516a}
@deffn {C 함수} @ref{5dc,,PyObject} *Py_GenericAlias (PyObject *origin, PyObject *args)
` Part of the @ref{774,,안정 ABI} 버전 3.9 이후로.'
Create a @ref{8c0,,GenericAlias} object.
Equivalent to calling the Python class
@ref{9ec,,types.GenericAlias}.  The `origin' and `args' arguments set the
@code{GenericAlias}‘s @code{__origin__} and @code{__args__} attributes respectively.
`origin' should be a @ref{c9b,,PyTypeObject}*, and `args' can be a
@ref{5263,,PyTupleObject}* or any @code{PyObject*}.  If `args' passed is
not a tuple, a 1-tuple is automatically constructed and @code{__args__} is set
to @code{(args,)}.
Minimal checking is done for the arguments, so the function will succeed even
if `origin' is not a type.
The @code{GenericAlias}‘s @code{__parameters__} attribute is constructed lazily
from @code{__args__}.  On failure, an exception is raised and @code{NULL} is
returned.

Here’s an example of how to make an extension type generic:

@example
...
static PyMethodDef my_obj_methods[] = @{
    // Other methods.
    ...
    @{"__class_getitem__", Py_GenericAlias, METH_O|METH_CLASS, "See PEP 585"@}
    ...
@}
@end example


@subsubheading 더 보기


The data model method @ref{942,,__class_getitem__()}.



Added in version 3.9.

@end deffn

@geindex Py_GenericAliasType (C var)
@anchor{c-api/typehints c Py_GenericAliasType}@anchor{516b}
@deffn {C 변수} @ref{c9b,,PyTypeObject} Py_GenericAliasType
` Part of the @ref{774,,안정 ABI} 버전 3.9 이후로.'
The C type of the object returned by @ref{516a,,Py_GenericAlias()}. Equivalent to
@ref{9ec,,types.GenericAlias} in Python.


Added in version 3.9.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node C API for extension modules,,기타 객체<2>,구상 객체 계층
@anchor{c-api/concrete c-api-for-extension-modules}@anchor{550a}
@subsection C API for extension modules


@menu
* Curses C API:: 
* Internal data:: 
* DateTime 객체: DateTime 객체<2>. 
* Internal data: Internal data<2>. 

@end menu

@node Curses C API,Internal data,,C API for extension modules
@anchor{c-api/curses doc}@anchor{550b}@anchor{c-api/curses curses-c-api}@anchor{550c}
@subsubsection Curses C API


@ref{2f,,curses} exposes a small C interface for extension modules.
Consumers must include the header file @code{py_curses.h} (which is not
included by default by @code{Python.h}) and @ref{550d,,import_curses()} must
be invoked, usually as part of the module initialisation function, to populate
@ref{550e,,PyCurses_API}.

@cartouche
@quotation 경고 
Neither the C API nor the pure Python @ref{2f,,curses} module are compatible
with subinterpreters.
@end quotation
@end cartouche

@geindex import_curses (C macro)
@anchor{c-api/curses c import_curses}@anchor{550d}
@deffn {C 매크로} import_curses ()

Import the curses C API. The macro does not need a semi-colon to be called.

On success, populate the @ref{550e,,PyCurses_API} pointer.

On failure, set @ref{550e,,PyCurses_API} to NULL and set an exception.
The caller must check if an error occurred via @ref{1cac,,PyErr_Occurred()}:

@example
import_curses();  // semi-colon is optional but recommended
if (PyErr_Occurred()) @{ /* cleanup */ @}
@end example
@end deffn

@geindex PyCurses_API (C var)
@anchor{c-api/curses c PyCurses_API}@anchor{550e}
@deffn {C 변수} void **PyCurses_API

Dynamically allocated object containing the curses C API.
This variable is only available once @ref{550d,,import_curses} succeeds.

@code{PyCurses_API[0]} corresponds to @ref{550f,,PyCursesWindow_Type}.

@code{PyCurses_API[1]}, @code{PyCurses_API[2]}, and @code{PyCurses_API[3]}
are pointers to predicate functions of type @code{int (*)(void)}.

When called, these predicates return whether @ref{34d6,,curses.setupterm()},
@ref{1910,,curses.initscr()}, and @ref{34d7,,curses.start_color()} have been called
respectively.

See also the convenience macros @ref{5510,,PyCursesSetupTermCalled},
@ref{5511,,PyCursesInitialised}, and @ref{5512,,PyCursesInitialisedColor}.

@cartouche
@quotation 참고 
The number of entries in this structure is subject to changes.
Consider using @ref{5513,,PyCurses_API_pointers} to check if
new fields are available or not.
@end quotation
@end cartouche
@end deffn

@geindex PyCurses_API_pointers (C macro)
@anchor{c-api/curses c PyCurses_API_pointers}@anchor{5513}
@deffn {C 매크로} PyCurses_API_pointers

The number of accessible fields (@code{4}) in @ref{550e,,PyCurses_API}.
This number is incremented whenever new fields are added.
@end deffn

@geindex PyCursesWindow_Type (C var)
@anchor{c-api/curses c PyCursesWindow_Type}@anchor{550f}
@deffn {C 변수} @ref{c9b,,PyTypeObject} PyCursesWindow_Type

The @ref{b5e,,heap type} corresponding to @ref{129a,,curses.window}.
@end deffn

@geindex PyCursesWindow_Check (C function)
@anchor{c-api/curses c PyCursesWindow_Check}@anchor{5514}
@deffn {C 함수} int PyCursesWindow_Check (PyObject *op)

Return true if `op' is a @ref{129a,,curses.window} instance, false otherwise.
@end deffn

The following macros are convenience macros expanding into C statements.
In particular, they can only be used as @code{macro;} or @code{macro}, but not
@code{macro()} or @code{macro();}.

@geindex PyCursesSetupTermCalled (C macro)
@anchor{c-api/curses c PyCursesSetupTermCalled}@anchor{5510}
@deffn {C 매크로} PyCursesSetupTermCalled

Macro checking if @ref{34d6,,curses.setupterm()} has been called.

The macro expansion is roughly equivalent to:

@example
@{
    typedef int (*predicate_t)(void);
    predicate_t was_setupterm_called = (predicate_t)PyCurses_API[1];
    if (!was_setupterm_called()) @{
        return NULL;
    @}
@}
@end example
@end deffn

@geindex PyCursesInitialised (C macro)
@anchor{c-api/curses c PyCursesInitialised}@anchor{5511}
@deffn {C 매크로} PyCursesInitialised

Macro checking if @ref{1910,,curses.initscr()} has been called.

The macro expansion is roughly equivalent to:

@example
@{
    typedef int (*predicate_t)(void);
    predicate_t was_initscr_called = (predicate_t)PyCurses_API[2];
    if (!was_initscr_called()) @{
        return NULL;
    @}
@}
@end example
@end deffn

@geindex PyCursesInitialisedColor (C macro)
@anchor{c-api/curses c PyCursesInitialisedColor}@anchor{5512}
@deffn {C 매크로} PyCursesInitialisedColor

Macro checking if @ref{34d7,,curses.start_color()} has been called.

The macro expansion is roughly equivalent to:

@example
@{
    typedef int (*predicate_t)(void);
    predicate_t was_start_color_called = (predicate_t)PyCurses_API[3];
    if (!was_start_color_called()) @{
        return NULL;
    @}
@}
@end example
@end deffn

@node Internal data,DateTime 객체<2>,Curses C API,C API for extension modules
@anchor{c-api/curses internal-data}@anchor{5515}
@subsubsection Internal data


The following objects are exposed by the C API but should be considered
internal-only.

@geindex PyCurses_CAPSULE_NAME (C macro)
@anchor{c-api/curses c PyCurses_CAPSULE_NAME}@anchor{5516}
@deffn {C 매크로} PyCurses_CAPSULE_NAME

Name of the curses capsule to pass to @ref{1c0e,,PyCapsule_Import()}.

Internal usage only. Use @ref{550d,,import_curses} instead.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node DateTime 객체<2>,Internal data<2>,Internal data,C API for extension modules
@anchor{c-api/datetime doc}@anchor{5517}@anchor{c-api/datetime datetime-objects}@anchor{5518}@anchor{c-api/datetime datetimeobjects}@anchor{52ac}@anchor{c-api/datetime translation-repo}@anchor{5519}
@subsubsection DateTime 객체


Various date and time objects are supplied by the @ref{34,,datetime} module.
Before using any of these functions, the header file @code{datetime.h} must be
included in your source (note that this is not included by @code{Python.h}),
and the macro @ref{551a,,PyDateTime_IMPORT} must be invoked, usually as part of
the module initialisation function.  The macro puts a pointer to a C structure
into a static variable, @ref{551b,,PyDateTimeAPI}, that is used by the following
macros.

@geindex PyDateTime_IMPORT (C macro)
@anchor{c-api/datetime c PyDateTime_IMPORT}@anchor{551a}
@deffn {C 매크로} PyDateTime_IMPORT ()

Import the datetime C API.

On success, populate the @ref{551b,,PyDateTimeAPI} pointer.
On failure, set @code{PyDateTimeAPI} to @code{NULL} and set an exception.
The caller must check if an error occurred via @ref{1cac,,PyErr_Occurred()}:

@example
PyDateTime_IMPORT;
if (PyErr_Occurred()) @{ /* cleanup */ @}
@end example

@cartouche
@quotation 경고 
This is not compatible with subinterpreters.
@end quotation
@end cartouche
@end deffn

@geindex PyDateTime_CAPI (C type)
@anchor{c-api/datetime c PyDateTime_CAPI}@anchor{551c}
@deffn {C 자료형} type PyDateTime_CAPI

Structure containing the fields for the datetime C API.

The fields of this structure are private and subject to change.

Do not use this directly; prefer @code{PyDateTime_*} APIs instead.
@end deffn

@geindex PyDateTimeAPI (C var)
@anchor{c-api/datetime c PyDateTimeAPI}@anchor{551b}
@deffn {C 변수} @ref{551c,,PyDateTime_CAPI} *PyDateTimeAPI

Dynamically allocated object containing the datetime C API.

This variable is only available once @ref{551a,,PyDateTime_IMPORT} succeeds.
@end deffn

@geindex PyDateTime_Date (C type)
@anchor{c-api/datetime c PyDateTime_Date}@anchor{551d}
@deffn {C 자료형} type PyDateTime_Date

This subtype of @ref{5dc,,PyObject} represents a Python date object.
@end deffn

@geindex PyDateTime_DateTime (C type)
@anchor{c-api/datetime c PyDateTime_DateTime}@anchor{551e}
@deffn {C 자료형} type PyDateTime_DateTime

This subtype of @ref{5dc,,PyObject} represents a Python datetime object.
@end deffn

@geindex PyDateTime_Time (C type)
@anchor{c-api/datetime c PyDateTime_Time}@anchor{551f}
@deffn {C 자료형} type PyDateTime_Time

This subtype of @ref{5dc,,PyObject} represents a Python time object.
@end deffn

@geindex PyDateTime_Delta (C type)
@anchor{c-api/datetime c PyDateTime_Delta}@anchor{5520}
@deffn {C 자료형} type PyDateTime_Delta

This subtype of @ref{5dc,,PyObject} represents the difference between two datetime values.
@end deffn

@geindex PyDateTime_DateType (C var)
@anchor{c-api/datetime c PyDateTime_DateType}@anchor{5521}
@deffn {C 변수} @ref{c9b,,PyTypeObject} PyDateTime_DateType

This instance of @ref{c9b,,PyTypeObject} represents the Python date type;
it is the same object as @ref{1fa,,datetime.date} in the Python layer.
@end deffn

@geindex PyDateTime_DateTimeType (C var)
@anchor{c-api/datetime c PyDateTime_DateTimeType}@anchor{5522}
@deffn {C 변수} @ref{c9b,,PyTypeObject} PyDateTime_DateTimeType

This instance of @ref{c9b,,PyTypeObject} represents the Python datetime type;
it is the same object as @ref{4e2,,datetime.datetime} in the Python layer.
@end deffn

@geindex PyDateTime_TimeType (C var)
@anchor{c-api/datetime c PyDateTime_TimeType}@anchor{5523}
@deffn {C 변수} @ref{c9b,,PyTypeObject} PyDateTime_TimeType

This instance of @ref{c9b,,PyTypeObject} represents the Python time type;
it is the same object as @ref{1fb,,datetime.time} in the Python layer.
@end deffn

@geindex PyDateTime_DeltaType (C var)
@anchor{c-api/datetime c PyDateTime_DeltaType}@anchor{5524}
@deffn {C 변수} @ref{c9b,,PyTypeObject} PyDateTime_DeltaType

This instance of @ref{c9b,,PyTypeObject} represents the Python type for
the difference between two datetime values;
it is the same object as @ref{bc2,,datetime.timedelta} in the Python layer.
@end deffn

@geindex PyDateTime_TZInfoType (C var)
@anchor{c-api/datetime c PyDateTime_TZInfoType}@anchor{5525}
@deffn {C 변수} @ref{c9b,,PyTypeObject} PyDateTime_TZInfoType

This instance of @ref{c9b,,PyTypeObject} represents the Python time zone info type;
it is the same object as @ref{7f5,,datetime.tzinfo} in the Python layer.
@end deffn

UTC 싱글톤에 액세스하기 위한 매크로:

@geindex PyDateTime_TimeZone_UTC (C var)
@anchor{c-api/datetime c PyDateTime_TimeZone_UTC}@anchor{dbb}
@deffn {C 변수} @ref{5dc,,PyObject} *PyDateTime_TimeZone_UTC

UTC를 나타내는 시간대 싱글톤을 반환합니다, @ref{826,,datetime.timezone.utc}와 같은 객체입니다.


Added in version 3.7.

@end deffn

형 검사 매크로:

@geindex PyDate_Check (C function)
@anchor{c-api/datetime c PyDate_Check}@anchor{5526}
@deffn {C 함수} int PyDate_Check (PyObject *ob)

`ob'가 @ref{5521,,PyDateTime_DateType} 형이거나 @code{PyDateTime_DateType}의 서브 형이면 참을 돌려줍니다. `ob'는 @code{NULL}이 아니어야 합니다. 이 함수는 항상 성공합니다.
@end deffn

@geindex PyDate_CheckExact (C function)
@anchor{c-api/datetime c PyDate_CheckExact}@anchor{5527}
@deffn {C 함수} int PyDate_CheckExact (PyObject *ob)

`ob'가 @ref{5521,,PyDateTime_DateType} 형이면 참을 돌려줍니다. `ob'는 @code{NULL}이 아니어야 합니다. 이 함수는 항상 성공합니다.
@end deffn

@geindex PyDateTime_Check (C function)
@anchor{c-api/datetime c PyDateTime_Check}@anchor{5528}
@deffn {C 함수} int PyDateTime_Check (PyObject *ob)

`ob'가 @ref{5522,,PyDateTime_DateTimeType} 형이거나 @code{PyDateTime_DateTimeType}의 서브 형이면 참을 돌려줍니다. `ob'는 @code{NULL}이 아니어야 합니다. 이 함수는 항상 성공합니다.
@end deffn

@geindex PyDateTime_CheckExact (C function)
@anchor{c-api/datetime c PyDateTime_CheckExact}@anchor{5529}
@deffn {C 함수} int PyDateTime_CheckExact (PyObject *ob)

`ob'가 @ref{5522,,PyDateTime_DateTimeType} 형이면 참을 돌려줍니다. `ob'는 @code{NULL}이 아니어야 합니다. 이 함수는 항상 성공합니다.
@end deffn

@geindex PyTime_Check (C function)
@anchor{c-api/datetime c PyTime_Check}@anchor{552a}
@deffn {C 함수} int PyTime_Check (PyObject *ob)

`ob'가 @ref{5523,,PyDateTime_TimeType} 형이거나 @code{PyDateTime_TimeType}의 서브 형이면 참을 돌려줍니다. `ob'는 @code{NULL}이 아니어야 합니다. 이 함수는 항상 성공합니다.
@end deffn

@geindex PyTime_CheckExact (C function)
@anchor{c-api/datetime c PyTime_CheckExact}@anchor{552b}
@deffn {C 함수} int PyTime_CheckExact (PyObject *ob)

`ob'가 @ref{5523,,PyDateTime_TimeType} 형이면 참을 돌려줍니다. `ob'는 @code{NULL}이 아니어야 합니다. 이 함수는 항상 성공합니다.
@end deffn

@geindex PyDelta_Check (C function)
@anchor{c-api/datetime c PyDelta_Check}@anchor{552c}
@deffn {C 함수} int PyDelta_Check (PyObject *ob)

`ob'가 @ref{5524,,PyDateTime_DeltaType} 형이거나 @code{PyDateTime_DeltaType}의 서브 형이면 참을 돌려줍니다. `ob'는 @code{NULL}이 아니어야 합니다. 이 함수는 항상 성공합니다.
@end deffn

@geindex PyDelta_CheckExact (C function)
@anchor{c-api/datetime c PyDelta_CheckExact}@anchor{552d}
@deffn {C 함수} int PyDelta_CheckExact (PyObject *ob)

`ob'가 @ref{5524,,PyDateTime_DeltaType} 형이면 참을 돌려줍니다. `ob'는 @code{NULL}이 아니어야 합니다. 이 함수는 항상 성공합니다.
@end deffn

@geindex PyTZInfo_Check (C function)
@anchor{c-api/datetime c PyTZInfo_Check}@anchor{552e}
@deffn {C 함수} int PyTZInfo_Check (PyObject *ob)

`ob'가 @ref{5525,,PyDateTime_TZInfoType} 형이거나 @code{PyDateTime_TZInfoType}의 서브 형이면 참을 돌려줍니다. `ob'는 @code{NULL}이 아니어야 합니다. 이 함수는 항상 성공합니다.
@end deffn

@geindex PyTZInfo_CheckExact (C function)
@anchor{c-api/datetime c PyTZInfo_CheckExact}@anchor{552f}
@deffn {C 함수} int PyTZInfo_CheckExact (PyObject *ob)

`ob'가 @ref{5525,,PyDateTime_TZInfoType} 형이면 참을 돌려줍니다. `ob'는 @code{NULL}이 아니어야 합니다. 이 함수는 항상 성공합니다.
@end deffn

객체를 만드는 매크로:

@geindex PyDate_FromDate (C function)
@anchor{c-api/datetime c PyDate_FromDate}@anchor{5530}
@deffn {C 함수} @ref{5dc,,PyObject} *PyDate_FromDate (int year, int month, int day)
`반환값: 새 참조.'
지정된 년, 월, 일의 @ref{1fa,,datetime.date} 객체를 반환합니다.
@end deffn

@geindex PyDateTime_FromDateAndTime (C function)
@anchor{c-api/datetime c PyDateTime_FromDateAndTime}@anchor{5531}
@deffn {C 함수} @ref{5dc,,PyObject} *PyDateTime_FromDateAndTime (int year, int month, int day, int hour, int minute, int second, int usecond)
`반환값: 새 참조.'
지정된 년, 월, 일, 시, 분, 초 및 마이크로초의 @ref{4e2,,datetime.datetime} 객체를 반환합니다.
@end deffn

@geindex PyDateTime_FromDateAndTimeAndFold (C function)
@anchor{c-api/datetime c PyDateTime_FromDateAndTimeAndFold}@anchor{5532}
@deffn {C 함수} @ref{5dc,,PyObject} *PyDateTime_FromDateAndTimeAndFold (int year, int month, int day, int hour, int minute, int second, int usecond, int fold)
`반환값: 새 참조.'
지정된 년, 월, 일, 시, 분, 초, 마이크로초 및 fold의 @ref{4e2,,datetime.datetime} 객체를 반환합니다.


Added in version 3.6.

@end deffn

@geindex PyTime_FromTime (C function)
@anchor{c-api/datetime c PyTime_FromTime}@anchor{5533}
@deffn {C 함수} @ref{5dc,,PyObject} *PyTime_FromTime (int hour, int minute, int second, int usecond)
`반환값: 새 참조.'
지정된 시, 분, 초 및 마이크로초의 @ref{1fb,,datetime.time} 객체를 반환합니다.
@end deffn

@geindex PyTime_FromTimeAndFold (C function)
@anchor{c-api/datetime c PyTime_FromTimeAndFold}@anchor{5534}
@deffn {C 함수} @ref{5dc,,PyObject} *PyTime_FromTimeAndFold (int hour, int minute, int second, int usecond, int fold)
`반환값: 새 참조.'
지정된 시, 분, 초, 마이크로초 및 fold의 @ref{1fb,,datetime.time} 객체를 반환합니다.


Added in version 3.6.

@end deffn

@geindex PyDelta_FromDSU (C function)
@anchor{c-api/datetime c PyDelta_FromDSU}@anchor{5535}
@deffn {C 함수} @ref{5dc,,PyObject} *PyDelta_FromDSU (int days, int seconds, int useconds)
`반환값: 새 참조.'
지정된 일, 초 및 마이크로초 수를 나타내는 @ref{bc2,,datetime.timedelta} 객체를 반환합니다. 결과 마이크로초와 초가 @code{datetime.timedelta} 객체에 관해 설명된 범위에 있도록 정규화가 수행됩니다.
@end deffn

@geindex PyTimeZone_FromOffset (C function)
@anchor{c-api/datetime c PyTimeZone_FromOffset}@anchor{db9}
@deffn {C 함수} @ref{5dc,,PyObject} *PyTimeZone_FromOffset (PyObject *offset)
`반환값: 새 참조.'
`offset' 인자로 나타내지는 이름이 없는 고정 오프셋의 @ref{12c4,,datetime.timezone} 객체를 돌려줍니다.


Added in version 3.7.

@end deffn

@geindex PyTimeZone_FromOffsetAndName (C function)
@anchor{c-api/datetime c PyTimeZone_FromOffsetAndName}@anchor{dba}
@deffn {C 함수} @ref{5dc,,PyObject} *PyTimeZone_FromOffsetAndName (PyObject *offset, PyObject *name)
`반환값: 새 참조.'
`offset' 인자와 tzname `name'으로 나타내지는 고정 오프셋의 @ref{12c4,,datetime.timezone} 객체를 돌려줍니다.


Added in version 3.7.

@end deffn

날짜 객체에서 필드를 추출하는 매크로. 인자는 서브 클래스(가령 @ref{551e,,PyDateTime_DateTime})를 포함하여 @ref{551d,,PyDateTime_Date}의 인스턴스여야 합니다. 인자는 @code{NULL}이 아니어야 하며, 형은 검사하지 않습니다:

@geindex PyDateTime_GET_YEAR (C function)
@anchor{c-api/datetime c PyDateTime_GET_YEAR}@anchor{5536}
@deffn {C 함수} int PyDateTime_GET_YEAR (PyDateTime_Date *o)

양의 int로, 년을 반환합니다.
@end deffn

@geindex PyDateTime_GET_MONTH (C function)
@anchor{c-api/datetime c PyDateTime_GET_MONTH}@anchor{5537}
@deffn {C 함수} int PyDateTime_GET_MONTH (PyDateTime_Date *o)

1에서 12까지의 int로, 월을 반환합니다.
@end deffn

@geindex PyDateTime_GET_DAY (C function)
@anchor{c-api/datetime c PyDateTime_GET_DAY}@anchor{5538}
@deffn {C 함수} int PyDateTime_GET_DAY (PyDateTime_Date *o)

1에서 31까지의 int로, 일을 반환합니다.
@end deffn

날짜 시간 객체에서 필드를 추출하는 매크로. 인자는 서브 클래스를 포함하여 @ref{551e,,PyDateTime_DateTime}의 인스턴스여야 합니다. 인자는 @code{NULL}이 아니어야 하며, 형은 검사하지 않습니다.:

@geindex PyDateTime_DATE_GET_HOUR (C function)
@anchor{c-api/datetime c PyDateTime_DATE_GET_HOUR}@anchor{5539}
@deffn {C 함수} int PyDateTime_DATE_GET_HOUR (PyDateTime_DateTime *o)

0부터 23까지의 int로, 시를 반환합니다.
@end deffn

@geindex PyDateTime_DATE_GET_MINUTE (C function)
@anchor{c-api/datetime c PyDateTime_DATE_GET_MINUTE}@anchor{553a}
@deffn {C 함수} int PyDateTime_DATE_GET_MINUTE (PyDateTime_DateTime *o)

0부터 59까지의 int로, 분을 반환합니다.
@end deffn

@geindex PyDateTime_DATE_GET_SECOND (C function)
@anchor{c-api/datetime c PyDateTime_DATE_GET_SECOND}@anchor{553b}
@deffn {C 함수} int PyDateTime_DATE_GET_SECOND (PyDateTime_DateTime *o)

0부터 59까지의 int로, 초를 반환합니다.
@end deffn

@geindex PyDateTime_DATE_GET_MICROSECOND (C function)
@anchor{c-api/datetime c PyDateTime_DATE_GET_MICROSECOND}@anchor{553c}
@deffn {C 함수} int PyDateTime_DATE_GET_MICROSECOND (PyDateTime_DateTime *o)

0부터 999999까지의 int로, 마이크로초를 반환합니다.
@end deffn

@geindex PyDateTime_DATE_GET_FOLD (C function)
@anchor{c-api/datetime c PyDateTime_DATE_GET_FOLD}@anchor{553d}
@deffn {C 함수} int PyDateTime_DATE_GET_FOLD (PyDateTime_DateTime *o)

0에서 1까지의 int로, 폴드를 반환합니다.


Added in version 3.6.

@end deffn

@geindex PyDateTime_DATE_GET_TZINFO (C function)
@anchor{c-api/datetime c PyDateTime_DATE_GET_TZINFO}@anchor{a95}
@deffn {C 함수} @ref{5dc,,PyObject} *PyDateTime_DATE_GET_TZINFO (PyDateTime_DateTime *o)

Return the tzinfo (which may be @code{None}).


Added in version 3.10.

@end deffn

시간 객체에서 필드를 추출하는 매크로. 인자는 서브 클래스를 포함하여 @ref{551f,,PyDateTime_Time}의 인스턴스여야 합니다. 인자는 @code{NULL}이 아니어야 하며 형은 검사하지 않습니다:

@geindex PyDateTime_TIME_GET_HOUR (C function)
@anchor{c-api/datetime c PyDateTime_TIME_GET_HOUR}@anchor{553e}
@deffn {C 함수} int PyDateTime_TIME_GET_HOUR (PyDateTime_Time *o)

0부터 23까지의 int로, 시를 반환합니다.
@end deffn

@geindex PyDateTime_TIME_GET_MINUTE (C function)
@anchor{c-api/datetime c PyDateTime_TIME_GET_MINUTE}@anchor{553f}
@deffn {C 함수} int PyDateTime_TIME_GET_MINUTE (PyDateTime_Time *o)

0부터 59까지의 int로, 분을 반환합니다.
@end deffn

@geindex PyDateTime_TIME_GET_SECOND (C function)
@anchor{c-api/datetime c PyDateTime_TIME_GET_SECOND}@anchor{5540}
@deffn {C 함수} int PyDateTime_TIME_GET_SECOND (PyDateTime_Time *o)

0부터 59까지의 int로, 초를 반환합니다.
@end deffn

@geindex PyDateTime_TIME_GET_MICROSECOND (C function)
@anchor{c-api/datetime c PyDateTime_TIME_GET_MICROSECOND}@anchor{5541}
@deffn {C 함수} int PyDateTime_TIME_GET_MICROSECOND (PyDateTime_Time *o)

0부터 999999까지의 int로, 마이크로초를 반환합니다.
@end deffn

@geindex PyDateTime_TIME_GET_FOLD (C function)
@anchor{c-api/datetime c PyDateTime_TIME_GET_FOLD}@anchor{5542}
@deffn {C 함수} int PyDateTime_TIME_GET_FOLD (PyDateTime_Time *o)

0에서 1까지의 int로, 폴드를 반환합니다.


Added in version 3.6.

@end deffn

@geindex PyDateTime_TIME_GET_TZINFO (C function)
@anchor{c-api/datetime c PyDateTime_TIME_GET_TZINFO}@anchor{a96}
@deffn {C 함수} @ref{5dc,,PyObject} *PyDateTime_TIME_GET_TZINFO (PyDateTime_Time *o)

Return the tzinfo (which may be @code{None}).


Added in version 3.10.

@end deffn

시간 델타 객체에서 필드를 추출하는 매크로. 인자는 서브 클래스를 포함하여 @ref{5520,,PyDateTime_Delta}의 인스턴스여야 합니다. 인자는 @code{NULL}이 아니어야 하며 형은 검사하지 않습니다.:

@geindex PyDateTime_DELTA_GET_DAYS (C function)
@anchor{c-api/datetime c PyDateTime_DELTA_GET_DAYS}@anchor{5543}
@deffn {C 함수} int PyDateTime_DELTA_GET_DAYS (PyDateTime_Delta *o)

-999999999에서 999999999까지의 int로, 일 수를 반환합니다.


Added in version 3.3.

@end deffn

@geindex PyDateTime_DELTA_GET_SECONDS (C function)
@anchor{c-api/datetime c PyDateTime_DELTA_GET_SECONDS}@anchor{5544}
@deffn {C 함수} int PyDateTime_DELTA_GET_SECONDS (PyDateTime_Delta *o)

0부터 86399까지의 int로, 초 수를 반환합니다.


Added in version 3.3.

@end deffn

@geindex PyDateTime_DELTA_GET_MICROSECONDS (C function)
@anchor{c-api/datetime c PyDateTime_DELTA_GET_MICROSECONDS}@anchor{5545}
@deffn {C 함수} int PyDateTime_DELTA_GET_MICROSECONDS (PyDateTime_Delta *o)

0에서 999999까지의 int로, 마이크로초 수를 반환합니다.


Added in version 3.3.

@end deffn

DB API를 구현하는 모듈의 편의를 위한 매크로:

@geindex PyDateTime_FromTimestamp (C function)
@anchor{c-api/datetime c PyDateTime_FromTimestamp}@anchor{5546}
@deffn {C 함수} @ref{5dc,,PyObject} *PyDateTime_FromTimestamp (PyObject *args)
`반환값: 새 참조.'
@ref{711,,datetime.datetime.fromtimestamp()}에 전달하는 데 적합한 인자 튜플로 새 @ref{4e2,,datetime.datetime} 객체를 만들고 반환합니다.
@end deffn

@geindex PyDate_FromTimestamp (C function)
@anchor{c-api/datetime c PyDate_FromTimestamp}@anchor{1dee}
@deffn {C 함수} @ref{5dc,,PyObject} *PyDate_FromTimestamp (PyObject *args)
`반환값: 새 참조.'
@ref{dcc,,datetime.date.fromtimestamp()}에 전달하는 데 적합한 인자 튜플로 새 @ref{1fa,,datetime.date} 객체를 만들고 반환합니다.
@end deffn

@node Internal data<2>,,DateTime 객체<2>,C API for extension modules
@anchor{c-api/datetime internal-data}@anchor{5547}
@subsubsection Internal data


The following symbols are exposed by the C API but should be considered
internal-only.

@geindex PyDateTime_CAPSULE_NAME (C macro)
@anchor{c-api/datetime c PyDateTime_CAPSULE_NAME}@anchor{5548}
@deffn {C 매크로} PyDateTime_CAPSULE_NAME

Name of the datetime capsule to pass to @ref{1c0e,,PyCapsule_Import()}.

Internal usage only. Use @ref{551a,,PyDateTime_IMPORT} instead.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Interpreter initialization and finalization,Thread states and the global interpreter lock,구상 객체 계층,Python/C API reference manual
@anchor{c-api/interp-lifecycle doc}@anchor{5549}@anchor{c-api/interp-lifecycle initialization}@anchor{554a}@anchor{c-api/interp-lifecycle interpreter-initialization-and-finalization}@anchor{554b}@anchor{c-api/interp-lifecycle translation-repo}@anchor{554c}
@section Interpreter initialization and finalization


See @ref{644,,Python Initialization Configuration} for details
on how to configure the interpreter prior to initialization.

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

@end menu

@node Before Python initialization,Global configuration variables,,Interpreter initialization and finalization
@anchor{c-api/interp-lifecycle before-python-initialization}@anchor{554d}@anchor{c-api/interp-lifecycle pre-init-safe}@anchor{dbd}
@subsection Before Python initialization


In an application embedding Python, the @ref{460,,Py_Initialize()} function must
be called before using any other Python/C API functions; with the exception of
a few functions and the @ref{554e,,global configuration variables}.

The following functions can be safely called before Python is initialized:


@itemize *

@item 
Functions that initialize the interpreter:


@itemize *

@item 
@ref{460,,Py_Initialize()}

@item 
@ref{5172,,Py_InitializeEx()}

@item 
@ref{3f6,,Py_InitializeFromConfig()}

@item 
@ref{bb7,,Py_BytesMain()}

@item 
@ref{e1d,,Py_Main()}

@item 
the runtime pre-initialization functions covered in @ref{644,,파이썬 초기화 구성}
@end itemize

@item 
Configuration functions:


@itemize *

@item 
@ref{1b1a,,PyImport_AppendInittab()}

@item 
@ref{1b1b,,PyImport_ExtendInittab()}

@item 
@code{PyInitFrozenExtensions()}

@item 
@ref{7a7,,PyMem_SetAllocator()}

@item 
@ref{e63,,PyMem_SetupDebugHooks()}

@item 
@ref{554f,,PyObject_SetArenaAllocator()}

@item 
@ref{19b6,,Py_SetProgramName()}

@item 
@ref{19b5,,Py_SetPythonHome()}

@item 
the configuration functions covered in @ref{644,,파이썬 초기화 구성}
@end itemize

@item 
Informative functions:


@itemize *

@item 
@ref{4f90,,Py_IsInitialized()}

@item 
@ref{5550,,PyMem_GetAllocator()}

@item 
@ref{5551,,PyObject_GetArenaAllocator()}

@item 
@ref{1637,,Py_GetBuildInfo()}

@item 
@ref{516c,,Py_GetCompiler()}

@item 
@ref{516d,,Py_GetCopyright()}

@item 
@ref{516e,,Py_GetPlatform()}

@item 
@ref{5170,,Py_GetVersion()}

@item 
@ref{4f90,,Py_IsInitialized()}
@end itemize

@item 
Utilities:


@itemize *

@item 
@ref{dbf,,Py_DecodeLocale()}

@item 
the status reporting and utility functions covered in @ref{644,,파이썬 초기화 구성}
@end itemize

@item 
Memory allocators:


@itemize *

@item 
@ref{62f,,PyMem_RawMalloc()}

@item 
@ref{631,,PyMem_RawRealloc()}

@item 
@ref{630,,PyMem_RawCalloc()}

@item 
@ref{632,,PyMem_RawFree()}
@end itemize

@item 
Synchronization:


@itemize *

@item 
@ref{5ce,,PyMutex_Lock()}

@item 
@ref{5cf,,PyMutex_Unlock()}
@end itemize
@end itemize

@cartouche
@quotation 참고 
Despite their apparent similarity to some of the functions listed above,
the following functions `should not be called' before the interpreter has
been initialized: @ref{dc0,,Py_EncodeLocale()}, @ref{19b9,,PyEval_InitThreads()}, and
@ref{bbb,,Py_RunMain()}.
@end quotation
@end cartouche

@node Global configuration variables,Initializing and finalizing the interpreter,Before Python initialization,Interpreter initialization and finalization
@anchor{c-api/interp-lifecycle global-conf-vars}@anchor{554e}@anchor{c-api/interp-lifecycle global-configuration-variables}@anchor{5552}
@subsection Global configuration variables


Python has variables for the global configuration to control different features
and options. By default, these flags are controlled by @ref{2118,,command line options}.

When a flag is set by an option, the value of the flag is the number of times
that the option was set. For example, @code{-b} sets @ref{406,,Py_BytesWarningFlag}
to 1 and @code{-bb} sets @code{Py_BytesWarningFlag} to 2.

@geindex Py_BytesWarningFlag (C var)
@anchor{c-api/interp-lifecycle c Py_BytesWarningFlag}@anchor{406}
@deffn {C 변수} int Py_BytesWarningFlag

This API is kept for backward compatibility: setting
@ref{407,,PyConfig.bytes_warning} should be used instead, see @ref{644,,Python Initialization Configuration}.

Issue a warning when comparing @ref{192,,bytes} or @ref{344,,bytearray} with
@ref{169,,str} or @code{bytes} with @ref{19b,,int}.  Issue an error if greater
or equal to @code{2}.

Set by the @ref{7f8,,-b} option.


Deprecated since version 3.12, will be removed in version 3.15.

@end deffn

@geindex Py_DebugFlag (C var)
@anchor{c-api/interp-lifecycle c Py_DebugFlag}@anchor{3f8}
@deffn {C 변수} int Py_DebugFlag

This API is kept for backward compatibility: setting
@ref{3f9,,PyConfig.parser_debug} should be used instead, see @ref{644,,Python Initialization Configuration}.

Turn on parser debugging output (for expert only, depending on compilation
options).

Set by the @ref{2120,,-d} option and the 
@geindex PYTHONDEBUG
@geindex 환경 변수; PYTHONDEBUG
@ref{2121,,PYTHONDEBUG} environment
variable.


Deprecated since version 3.12, will be removed in version 3.15.

@end deffn

@geindex Py_DontWriteBytecodeFlag (C var)
@anchor{c-api/interp-lifecycle c Py_DontWriteBytecodeFlag}@anchor{40c}
@deffn {C 변수} int Py_DontWriteBytecodeFlag

This API is kept for backward compatibility: setting
@ref{40d,,PyConfig.write_bytecode} should be used instead, see @ref{644,,Python Initialization Configuration}.

If set to non-zero, Python won’t try to write @code{.pyc} files on the
import of source modules.

Set by the @ref{15d2,,-B} option and the 
@geindex PYTHONDONTWRITEBYTECODE
@geindex 환경 변수; PYTHONDONTWRITEBYTECODE
@ref{15d3,,PYTHONDONTWRITEBYTECODE}
environment variable.


Deprecated since version 3.12, will be removed in version 3.15.

@end deffn

@geindex Py_FrozenFlag (C var)
@anchor{c-api/interp-lifecycle c Py_FrozenFlag}@anchor{408}
@deffn {C 변수} int Py_FrozenFlag

This API is kept for backward compatibility: setting
@ref{409,,PyConfig.pathconfig_warnings} should be used instead, see
@ref{644,,Python Initialization Configuration}.

Private flag used by @code{_freeze_module} and @code{frozenmain} programs.


Deprecated since version 3.12, will be removed in version 3.15.

@end deffn

@geindex Py_HashRandomizationFlag (C var)
@anchor{c-api/interp-lifecycle c Py_HashRandomizationFlag}@anchor{412}
@deffn {C 변수} int Py_HashRandomizationFlag

This API is kept for backward compatibility: setting
@ref{414,,PyConfig.hash_seed} and @ref{413,,PyConfig.use_hash_seed} should
be used instead, see @ref{644,,Python Initialization Configuration}.

Set to @code{1} if the 
@geindex PYTHONHASHSEED
@geindex 환경 변수; PYTHONHASHSEED
@ref{127c,,PYTHONHASHSEED} environment variable is set to
a non-empty string.

If the flag is non-zero, read the 
@geindex PYTHONHASHSEED
@geindex 환경 변수; PYTHONHASHSEED
@ref{127c,,PYTHONHASHSEED} environment
variable to initialize the secret hash seed.


Deprecated since version 3.12, will be removed in version 3.15.

@end deffn

@geindex Py_IgnoreEnvironmentFlag (C var)
@anchor{c-api/interp-lifecycle c Py_IgnoreEnvironmentFlag}@anchor{40a}
@deffn {C 변수} int Py_IgnoreEnvironmentFlag

This API is kept for backward compatibility: setting
@ref{40b,,PyConfig.use_environment} should be used instead, see
@ref{644,,Python Initialization Configuration}.

Ignore all @code{PYTHON*} environment variables, e.g.
@geindex PYTHONPATH
@geindex 환경 변수; PYTHONPATH
@ref{121c,,PYTHONPATH} and 
@geindex PYTHONHOME
@geindex 환경 변수; PYTHONHOME
@ref{3f0,,PYTHONHOME}, that might be set.

Set by the @ref{b55,,-E} and @ref{b56,,-I} options.


Deprecated since version 3.12, will be removed in version 3.15.

@end deffn

@geindex Py_InspectFlag (C var)
@anchor{c-api/interp-lifecycle c Py_InspectFlag}@anchor{400}
@deffn {C 변수} int Py_InspectFlag

This API is kept for backward compatibility: setting
@ref{401,,PyConfig.inspect} should be used instead, see
@ref{644,,Python Initialization Configuration}.

When a script is passed as first argument or the @ref{1a8,,-c} option is used,
enter interactive mode after executing the script or the command, even when
@ref{75e,,sys.stdin} does not appear to be a terminal.

Set by the @ref{16e0,,-i} option and the 
@geindex PYTHONINSPECT
@geindex 환경 변수; PYTHONINSPECT
@ref{16df,,PYTHONINSPECT} environment
variable.


Deprecated since version 3.12, will be removed in version 3.15.

@end deffn

@geindex Py_InteractiveFlag (C var)
@anchor{c-api/interp-lifecycle c Py_InteractiveFlag}@anchor{3fe}
@deffn {C 변수} int Py_InteractiveFlag

This API is kept for backward compatibility: setting
@ref{3ff,,PyConfig.interactive} should be used instead, see
@ref{644,,Python Initialization Configuration}.

Set by the @ref{16e0,,-i} option.


Deprecated since version 3.12, will be removed in version 3.15.

@end deffn

@geindex Py_IsolatedFlag (C var)
@anchor{c-api/interp-lifecycle c Py_IsolatedFlag}@anchor{415}
@deffn {C 변수} int Py_IsolatedFlag

This API is kept for backward compatibility: setting
@ref{416,,PyConfig.isolated} should be used instead, see
@ref{644,,Python Initialization Configuration}.

Run Python in isolated mode. In isolated mode @ref{3e4,,sys.path} contains
neither the script’s directory nor the user’s site-packages directory.

Set by the @ref{b56,,-I} option.


Added in version 3.4.



Deprecated since version 3.12, will be removed in version 3.15.

@end deffn

@geindex Py_LegacyWindowsFSEncodingFlag (C var)
@anchor{c-api/interp-lifecycle c Py_LegacyWindowsFSEncodingFlag}@anchor{417}
@deffn {C 변수} int Py_LegacyWindowsFSEncodingFlag

This API is kept for backward compatibility: setting
@ref{418,,PyPreConfig.legacy_windows_fs_encoding} should be used instead, see
@ref{644,,Python Initialization Configuration}.

If the flag is non-zero, use the @code{mbcs} encoding with @code{replace} error
handler, instead of the UTF-8 encoding with @code{surrogatepass} error handler,
for the @ref{75c,,filesystem encoding and error handler}.

Set to @code{1} if the 
@geindex PYTHONLEGACYWINDOWSFSENCODING
@geindex 환경 변수; PYTHONLEGACYWINDOWSFSENCODING
@ref{33f,,PYTHONLEGACYWINDOWSFSENCODING} environment
variable is set to a non-empty string.

See 
@geindex Python 향상 제안; PEP 529
PEP 529@footnote{https://peps.python.org/pep-0529/} for more details.

@ref{213c,,가용성}: Windows.


Deprecated since version 3.12, will be removed in version 3.15.

@end deffn

@geindex Py_LegacyWindowsStdioFlag (C var)
@anchor{c-api/interp-lifecycle c Py_LegacyWindowsStdioFlag}@anchor{419}
@deffn {C 변수} int Py_LegacyWindowsStdioFlag

This API is kept for backward compatibility: setting
@ref{41a,,PyConfig.legacy_windows_stdio} should be used instead, see
@ref{644,,Python Initialization Configuration}.

If the flag is non-zero, use @ref{1514,,io.FileIO} instead of
@code{io._WindowsConsoleIO} for @ref{df,,sys} standard streams.

Set to @code{1} if the 
@geindex PYTHONLEGACYWINDOWSSTDIO
@geindex 환경 변수; PYTHONLEGACYWINDOWSSTDIO
@ref{e54,,PYTHONLEGACYWINDOWSSTDIO} environment
variable is set to a non-empty string.

See 
@geindex Python 향상 제안; PEP 528
PEP 528@footnote{https://peps.python.org/pep-0528/} for more details.

@ref{213c,,가용성}: Windows.


Deprecated since version 3.12, will be removed in version 3.15.

@end deffn

@geindex Py_NoSiteFlag (C var)
@anchor{c-api/interp-lifecycle c Py_NoSiteFlag}@anchor{404}
@deffn {C 변수} int Py_NoSiteFlag

This API is kept for backward compatibility: setting
@ref{405,,PyConfig.site_import} should be used instead, see
@ref{644,,Python Initialization Configuration}.

Disable the import of the module @ref{cc,,site} and the site-dependent
manipulations of @ref{3e4,,sys.path} that it entails.  Also disable these
manipulations if @code{site} is explicitly imported later (call
@ref{2124,,site.main()} if you want them to be triggered).

Set by the @ref{13ad,,-S} option.


Deprecated since version 3.12, will be removed in version 3.15.

@end deffn

@geindex Py_NoUserSiteDirectory (C var)
@anchor{c-api/interp-lifecycle c Py_NoUserSiteDirectory}@anchor{40e}
@deffn {C 변수} int Py_NoUserSiteDirectory

This API is kept for backward compatibility: setting
@ref{40f,,PyConfig.user_site_directory} should be used instead, see
@ref{644,,Python Initialization Configuration}.

Don’t add the @ref{2123,,user site-packages directory} to
@ref{3e4,,sys.path}.

Set by the @ref{1593,,-s} and @ref{b56,,-I} options, and the
@geindex PYTHONNOUSERSITE
@geindex 환경 변수; PYTHONNOUSERSITE
@ref{1594,,PYTHONNOUSERSITE} environment variable.


Deprecated since version 3.12, will be removed in version 3.15.

@end deffn

@geindex Py_OptimizeFlag (C var)
@anchor{c-api/interp-lifecycle c Py_OptimizeFlag}@anchor{402}
@deffn {C 변수} int Py_OptimizeFlag

This API is kept for backward compatibility: setting
@ref{403,,PyConfig.optimization_level} should be used instead, see
@ref{644,,Python Initialization Configuration}.

Set by the @ref{18c,,-O} option and the 
@geindex PYTHONOPTIMIZE
@geindex 환경 변수; PYTHONOPTIMIZE
@ref{2122,,PYTHONOPTIMIZE} environment
variable.


Deprecated since version 3.12, will be removed in version 3.15.

@end deffn

@geindex Py_QuietFlag (C var)
@anchor{c-api/interp-lifecycle c Py_QuietFlag}@anchor{3fc}
@deffn {C 변수} int Py_QuietFlag

This API is kept for backward compatibility: setting
@ref{3fd,,PyConfig.quiet} should be used instead, see @ref{644,,Python Initialization Configuration}.

Don’t display the copyright and version messages even in interactive mode.

Set by the @ref{1785,,-q} option.


Added in version 3.2.



Deprecated since version 3.12, will be removed in version 3.15.

@end deffn

@geindex Py_UnbufferedStdioFlag (C var)
@anchor{c-api/interp-lifecycle c Py_UnbufferedStdioFlag}@anchor{410}
@deffn {C 변수} int Py_UnbufferedStdioFlag

This API is kept for backward compatibility: setting
@ref{411,,PyConfig.buffered_stdio} should be used instead, see @ref{644,,Python Initialization Configuration}.

Force the stdout and stderr streams to be unbuffered.

Set by the @ref{1d8b,,-u} option and the 
@geindex PYTHONUNBUFFERED
@geindex 환경 변수; PYTHONUNBUFFERED
@ref{1d8c,,PYTHONUNBUFFERED}
environment variable.


Deprecated since version 3.12, will be removed in version 3.15.

@end deffn

@geindex Py_VerboseFlag (C var)
@anchor{c-api/interp-lifecycle c Py_VerboseFlag}@anchor{3fa}
@deffn {C 변수} int Py_VerboseFlag

This API is kept for backward compatibility: setting
@ref{3fb,,PyConfig.verbose} should be used instead, see @ref{644,,Python Initialization Configuration}.

Print a message each time a module is initialized, showing the place
(filename or built-in module) from which it is loaded.  If greater or equal
to @code{2}, print a message for each file that is checked for when
searching for a module. Also provides information on module cleanup at exit.

Set by the @ref{162a,,-v} option and the 
@geindex PYTHONVERBOSE
@geindex 환경 변수; PYTHONVERBOSE
@ref{2125,,PYTHONVERBOSE} environment
variable.


Deprecated since version 3.12, will be removed in version 3.15.

@end deffn

@node Initializing and finalizing the interpreter,Cautions regarding runtime finalization,Global configuration variables,Interpreter initialization and finalization
@anchor{c-api/interp-lifecycle initializing-and-finalizing-the-interpreter}@anchor{5553}
@subsection Initializing and finalizing the interpreter


@geindex Py_Initialize (C function)
@anchor{c-api/interp-lifecycle c Py_Initialize}@anchor{460}
@deffn {C 함수} void Py_Initialize ()
` Part of the @ref{774,,안정 ABI}.'
@geindex PyEval_InitThreads()
@geindex modules (in module sys)
@geindex path (in module sys)
@geindex module; builtins
@geindex module; __main__
@geindex module; sys
@geindex module; search; path
@geindex Py_FinalizeEx (C function)

Initialize the Python interpreter.  In an application embedding Python,
this should be called before using any other Python/C API functions; see
@ref{dbd,,Before Python Initialization} for the few exceptions.

This initializes the table of loaded modules (@code{sys.modules}), and creates
the fundamental modules @ref{13,,builtins}, @ref{1,,__main__} and @ref{df,,sys}.
It also initializes the module search path (@code{sys.path}). It does not set
@code{sys.argv}; use the @ref{644,,Python Initialization Configuration}
API for that. This is a no-op when called for a second time (without calling
@ref{f10,,Py_FinalizeEx()} first).  There is no return value; it is a fatal
error if the initialization fails.

Use @ref{3f6,,Py_InitializeFromConfig()} to customize the
@ref{644,,Python Initialization Configuration}.

@cartouche
@quotation 참고 
On Windows, changes the console mode from @code{O_TEXT} to @code{O_BINARY},
which will also affect non-Python uses of the console using the C Runtime.
@end quotation
@end cartouche
@end deffn

@geindex Py_InitializeEx (C function)
@anchor{c-api/interp-lifecycle c Py_InitializeEx}@anchor{5172}
@deffn {C 함수} void Py_InitializeEx (int initsigs)
` Part of the @ref{774,,안정 ABI}.'
This function works like @ref{460,,Py_Initialize()} if `initsigs' is @code{1}. If
`initsigs' is @code{0}, it skips initialization registration of signal handlers,
which may be useful when CPython is embedded as part of a larger application.

Use @ref{3f6,,Py_InitializeFromConfig()} to customize the
@ref{644,,Python Initialization Configuration}.
@end deffn

@geindex Py_InitializeFromConfig (C function)
@anchor{c-api/interp-lifecycle c Py_InitializeFromConfig}@anchor{3f6}
@deffn {C 함수} @ref{ba3,,PyStatus} Py_InitializeFromConfig (const PyConfig *config)

Initialize Python from `config' configuration, as described in
@ref{5554,,PyConfig를 사용한 초기화}.

See the @ref{644,,파이썬 초기화 구성} section for details on pre-initializing the
interpreter, populating the runtime configuration structure, and querying
the returned status structure.
@end deffn

@geindex Py_IsInitialized (C function)
@anchor{c-api/interp-lifecycle c Py_IsInitialized}@anchor{4f90}
@deffn {C 함수} int Py_IsInitialized ()
` Part of the @ref{774,,안정 ABI}.'
Return true (nonzero) when the Python interpreter has been initialized, false
(zero) if not.  After @ref{f10,,Py_FinalizeEx()} is called, this returns false until
@ref{460,,Py_Initialize()} is called again.
@end deffn

@geindex Py_IsFinalizing (C function)
@anchor{c-api/interp-lifecycle c Py_IsFinalizing}@anchor{5fb}
@deffn {C 함수} int Py_IsFinalizing ()
` Part of the @ref{774,,안정 ABI} 버전 3.13 이후로.'
Return true (non-zero) if the main Python interpreter is
@ref{47a,,shutting down}. Return false (zero) otherwise.


Added in version 3.13.

@end deffn

@geindex Py_FinalizeEx (C function)
@anchor{c-api/interp-lifecycle c Py_FinalizeEx}@anchor{f10}
@deffn {C 함수} int Py_FinalizeEx ()
` Part of the @ref{774,,안정 ABI} 버전 3.6 이후로.'
Undo all initializations made by @ref{460,,Py_Initialize()} and subsequent use of
Python/C API functions, and destroy all sub-interpreters (see
@ref{1b2f,,Py_NewInterpreter()} below) that were created and not yet destroyed since
the last call to @code{Py_Initialize()}.  This is a no-op when called for a second
time (without calling @code{Py_Initialize()} again first).

Since this is the reverse of @ref{460,,Py_Initialize()}, it should be called
in the same thread with the same interpreter active.  That means
the main thread and the main interpreter.
This should never be called while @ref{bbb,,Py_RunMain()} is running.

Normally the return value is @code{0}.
If there were errors during finalization (flushing buffered data),
@code{-1} is returned.

Note that Python will do a best effort at freeing all memory allocated by the Python
interpreter.  Therefore, any C-Extension should make sure to correctly clean up all
of the previously allocated PyObjects before using them in subsequent calls to
@ref{460,,Py_Initialize()}.  Otherwise it could introduce vulnerabilities and incorrect
behavior.

This function is provided for a number of reasons.  An embedding application
might want to restart Python without having to restart the application itself.
An application that has loaded the Python interpreter from a dynamically
loadable library (or DLL) might want to free all memory allocated by Python
before unloading the DLL. During a hunt for memory leaks in an application a
developer might want to free all memory allocated by Python before exiting from
the application.

`Bugs and caveats:' The destruction of modules and objects in modules is done
in random order; this may cause destructors (@ref{11fc,,__del__()} methods) to fail
when they depend on other objects (even functions) or modules.  Dynamically
loaded extension modules loaded by Python are not unloaded.  Small amounts of
memory allocated by the Python interpreter may not be freed (if you find a leak,
please report it).  Memory tied up in circular references between objects is not
freed.  Interned strings will all be deallocated regardless of their reference count.
Some memory allocated by extension modules may not be freed.  Some extensions may not
work properly if their initialization routine is called more than once; this can
happen if an application calls @ref{460,,Py_Initialize()} and @ref{f10,,Py_FinalizeEx()}
more than once.  @code{Py_FinalizeEx()} must not be called recursively from
within itself.  Therefore, it must not be called by any code that may be run
as part of the interpreter shutdown process, such as @ref{d,,atexit}
handlers, object finalizers, or any code that may be run while flushing the
stdout and stderr files.

Raises an @ref{1c6c,,auditing event} @code{cpython._PySys_ClearAuditHooks} with no arguments.


Added in version 3.6.

@end deffn

@geindex Py_Finalize (C function)
@anchor{c-api/interp-lifecycle c Py_Finalize}@anchor{45f}
@deffn {C 함수} void Py_Finalize ()
` Part of the @ref{774,,안정 ABI}.'
This is a backwards-compatible version of @ref{f10,,Py_FinalizeEx()} that
disregards the return value.
@end deffn

@geindex Py_BytesMain (C function)
@anchor{c-api/interp-lifecycle c Py_BytesMain}@anchor{bb7}
@deffn {C 함수} int Py_BytesMain (int argc, char **argv)
` Part of the @ref{774,,안정 ABI} 버전 3.8 이후로.'
Similar to @ref{e1d,,Py_Main()} but `argv' is an array of bytes strings,
allowing the calling application to delegate the text decoding step to
the CPython runtime.


Added in version 3.8.

@end deffn

@geindex Py_Main (C function)
@anchor{c-api/interp-lifecycle c Py_Main}@anchor{e1d}
@deffn {C 함수} int Py_Main (int argc, wchar_t **argv)
` Part of the @ref{774,,안정 ABI}.'
The main program for the standard interpreter, encapsulating a full
initialization/finalization cycle, as well as additional
behaviour to implement reading configurations settings from the environment
and command line, and then executing @code{__main__} in accordance with
@ref{1206,,명령 줄}.

This is made available for programs which wish to support the full CPython
command line interface, rather than just embedding a Python runtime in a
larger application.

The `argc' and `argv' parameters are similar to those which are passed to a
C program’s @code{main()} function, except that the `argv' entries are first
converted to @code{wchar_t} using @ref{dbf,,Py_DecodeLocale()}. It is also
important to note that the argument list entries may be modified to point to
strings other than those passed in (however, the contents of the strings
pointed to by the argument list are not modified).

The return value is @code{2} if the argument list does not represent a valid
Python command line, and otherwise the same as @ref{bbb,,Py_RunMain()}.

In terms of the CPython runtime configuration APIs documented in the
@ref{644,,runtime configuration} section (and without accounting
for error handling), @code{Py_Main} is approximately equivalent to:

@example
PyConfig config;
PyConfig_InitPythonConfig(&config);
PyConfig_SetArgv(&config, argc, argv);
Py_InitializeFromConfig(&config);
PyConfig_Clear(&config);

Py_RunMain();
@end example

In normal usage, an embedding application will call this function
`instead' of calling @ref{460,,Py_Initialize()}, @ref{5172,,Py_InitializeEx()} or
@ref{3f6,,Py_InitializeFromConfig()} directly, and all settings will be applied
as described elsewhere in this documentation. If this function is instead
called `after' a preceding runtime initialization API call, then exactly
which environmental and command line configuration settings will be updated
is version dependent (as it depends on which settings correctly support
being modified after they have already been set once when the runtime was
first initialized).
@end deffn

@geindex Py_RunMain (C function)
@anchor{c-api/interp-lifecycle c Py_RunMain}@anchor{bbb}
@deffn {C 함수} int Py_RunMain (void)

Executes the main module in a fully configured CPython runtime.

Executes the command (@ref{5555,,PyConfig.run_command}), the script
(@ref{5556,,PyConfig.run_filename}) or the module
(@ref{5557,,PyConfig.run_module}) specified on the command line or in the
configuration. If none of these values are set, runs the interactive Python
prompt (REPL) using the @code{__main__} module’s global namespace.

If @ref{401,,PyConfig.inspect} is not set (the default), the return value
will be @code{0} if the interpreter exits normally (that is, without raising
an exception), the exit status of an unhandled @ref{f3b,,SystemExit}, or @code{1}
for any other unhandled exception.

If @ref{401,,PyConfig.inspect} is set (such as when the @ref{16e0,,-i} option
is used), rather than returning when the interpreter exits, execution will
instead resume in an interactive Python prompt (REPL) using the @code{__main__}
module’s global namespace. If the interpreter exited with an exception, it
is immediately raised in the REPL session. The function return value is
then determined by the way the `REPL session' terminates: @code{0}, @code{1}, or
the status of a @ref{f3b,,SystemExit}, as specified above.

This function always finalizes the Python interpreter before it returns.

See @ref{5558,,Python Configuration} for an example of a
customized Python that always runs in isolated mode using
@ref{bbb,,Py_RunMain()}.
@end deffn

@geindex PyUnstable_AtExit (C function)
@anchor{c-api/interp-lifecycle c PyUnstable_AtExit}@anchor{18fb}
@deffn {C 함수} int PyUnstable_AtExit (PyInterpreterState *interp, void (*func)(void*), void *data)

@cartouche
@quotation 이것은 불안정 API. It may change without warning in minor releases. `이것은 @ref{768,,불안정 API}. It may change without warning in minor releases.'
@end quotation
@end cartouche

Register an @ref{d,,atexit} callback for the target interpreter `interp'.
This is similar to @ref{5167,,Py_AtExit()}, but takes an explicit interpreter and
data pointer for the callback.

There must be an @ref{4f10,,attached thread state} for `interp'.


Added in version 3.13.

@end deffn

@node Cautions regarding runtime finalization,Process-wide parameters,Initializing and finalizing the interpreter,Interpreter initialization and finalization
@anchor{c-api/interp-lifecycle cautions-regarding-runtime-finalization}@anchor{5559}@anchor{c-api/interp-lifecycle id1}@anchor{555a}
@subsection Cautions regarding runtime finalization


In the late stage of @ref{47a,,interpreter shutdown}, after attempting to wait for
non-daemon threads to exit (though this can be interrupted by
@ref{bc4,,KeyboardInterrupt}) and running the @ref{d,,atexit} functions, the runtime
is marked as `finalizing': @ref{5fb,,Py_IsFinalizing()} and
@ref{c7f,,sys.is_finalizing()} return true.  At this point, only the `finalization
thread' that initiated finalization (typically the main thread) is allowed to
acquire the @ref{164,,GIL}.

If any thread, other than the finalization thread, attempts to attach a @ref{1848,,thread state}
during finalization, either explicitly or
implicitly, the thread enters `a permanently blocked state'
where it remains until the program exits.  In most cases this is harmless, but this can result
in deadlock if a later stage of finalization attempts to acquire a lock owned by the
blocked thread, or otherwise waits on the blocked thread.

Gross? Yes. This prevents random crashes and/or unexpectedly skipped C++
finalizations further up the call stack when such threads were forcibly exited
here in CPython 3.13 and earlier. The CPython runtime @ref{1848,,thread state} C APIs
have never had any error reporting or handling expectations at thread state
attachment time that would’ve allowed for graceful exit from this situation. Changing that
would require new stable C APIs and rewriting the majority of C code in the
CPython ecosystem to use those with error handling.

@node Process-wide parameters,,Cautions regarding runtime finalization,Interpreter initialization and finalization
@anchor{c-api/interp-lifecycle process-wide-parameters}@anchor{555b}
@subsection Process-wide parameters


@geindex Py_SetProgramName (C function)
@anchor{c-api/interp-lifecycle c Py_SetProgramName}@anchor{19b6}
@deffn {C 함수} void Py_SetProgramName (const wchar_t *name)
` Part of the @ref{774,,안정 ABI}.'
@geindex Py_Initialize()
@geindex main()
@geindex Py_GetPath()

This API is kept for backward compatibility: setting
@ref{3f2,,PyConfig.program_name} should be used instead, see @ref{644,,Python Initialization Configuration}.

This function should be called before @ref{460,,Py_Initialize()} is called for
the first time, if it is called at all.  It tells the interpreter the value
of the @code{argv[0]} argument to the @code{main()} function of the program
(converted to wide characters).
This is used by @ref{3e3,,Py_GetPath()} and some other functions below to find
the Python run-time libraries relative to the interpreter executable.  The
default value is @code{'python'}.  The argument should point to a
zero-terminated wide character string in static storage whose contents will not
change for the duration of the program’s execution.  No code in the Python
interpreter will change the contents of this storage.

Use @ref{dbf,,Py_DecodeLocale()} to decode a bytes string to get a
wchar_t* string.


Deprecated since version 3.11, will be removed in version 3.15.

@end deffn

@geindex Py_GetProgramName (C function)
@anchor{c-api/interp-lifecycle c Py_GetProgramName}@anchor{3ee}
@deffn {C 함수} wchar_t *Py_GetProgramName ()
` Part of the @ref{774,,안정 ABI}.'
Return the program name set with @ref{3f2,,PyConfig.program_name}, or the default.
The returned string points into static storage; the caller should not modify its
value.

This function should not be called before @ref{460,,Py_Initialize()}, otherwise
it returns @code{NULL}.


버전 3.10에서 변경: It now returns @code{NULL} if called before @ref{460,,Py_Initialize()}.



Deprecated since version 3.13, will be removed in version 3.15: Use @ref{37c,,PyConfig_Get("executable")}
(@ref{3ed,,sys.executable}) instead.

@end deffn

@geindex Py_GetPrefix (C function)
@anchor{c-api/interp-lifecycle c Py_GetPrefix}@anchor{3e5}
@deffn {C 함수} wchar_t *Py_GetPrefix ()
` Part of the @ref{774,,안정 ABI}.'
Return the `prefix' for installed platform-independent files. This is derived
through a number of complicated rules from the program name set with
@ref{3f2,,PyConfig.program_name} and some environment variables; for example, if the
program name is @code{'/usr/local/bin/python'}, the prefix is @code{'/usr/local'}. The
returned string points into static storage; the caller should not modify its
value.  This corresponds to the @code{prefix} variable in the top-level
@code{Makefile} and the @ref{214c,,--prefix} argument to the @code{configure}
script at build time.  The value is available to Python code as @code{sys.base_prefix}.
It is only useful on Unix.  See also the next function.

This function should not be called before @ref{460,,Py_Initialize()}, otherwise
it returns @code{NULL}.


버전 3.10에서 변경: It now returns @code{NULL} if called before @ref{460,,Py_Initialize()}.



Deprecated since version 3.13, will be removed in version 3.15: Use @ref{37c,,PyConfig_Get("base_prefix")}
(@ref{3e6,,sys.base_prefix}) instead. Use @code{PyConfig_Get("prefix")} (@ref{3e7,,sys.prefix}) if @ref{3e8,,virtual environments} need to be handled.

@end deffn

@geindex Py_GetExecPrefix (C function)
@anchor{c-api/interp-lifecycle c Py_GetExecPrefix}@anchor{3e9}
@deffn {C 함수} wchar_t *Py_GetExecPrefix ()
` Part of the @ref{774,,안정 ABI}.'
Return the `exec-prefix' for installed platform-`dependent' files.  This is
derived through a number of complicated rules from the program name set with
@ref{3f2,,PyConfig.program_name} and some environment variables; for example, if the
program name is @code{'/usr/local/bin/python'}, the exec-prefix is
@code{'/usr/local'}.  The returned string points into static storage; the caller
should not modify its value.  This corresponds to the @code{exec_prefix}
variable in the top-level @code{Makefile} and the @code{--exec-prefix}
argument to the @code{configure} script at build  time.  The value is
available to Python code as @code{sys.base_exec_prefix}.  It is only useful on
Unix.

Background: The exec-prefix differs from the prefix when platform dependent
files (such as executables and shared libraries) are installed in a different
directory tree.  In a typical installation, platform dependent files may be
installed in the @code{/usr/local/plat} subtree while platform independent may
be installed in @code{/usr/local}.

Generally speaking, a platform is a combination of hardware and software
families, e.g.  Sparc machines running the Solaris 2.x operating system are
considered the same platform, but Intel machines running Solaris 2.x are another
platform, and Intel machines running Linux are yet another platform.  Different
major revisions of the same operating system generally also form different
platforms.  Non-Unix operating systems are a different story; the installation
strategies on those systems are so different that the prefix and exec-prefix are
meaningless, and set to the empty string. Note that compiled Python bytecode
files are platform independent (but not independent from the Python version by
which they were compiled!).

System administrators will know how to configure the @code{mount} or
@code{automount} programs to share @code{/usr/local} between platforms
while having @code{/usr/local/plat} be a different filesystem for each
platform.

This function should not be called before @ref{460,,Py_Initialize()}, otherwise
it returns @code{NULL}.


버전 3.10에서 변경: It now returns @code{NULL} if called before @ref{460,,Py_Initialize()}.



Deprecated since version 3.13, will be removed in version 3.15: Use @ref{37c,,PyConfig_Get("base_exec_prefix")}
(@ref{3ea,,sys.base_exec_prefix}) instead. Use
@code{PyConfig_Get("exec_prefix")}
(@ref{3eb,,sys.exec_prefix}) if @ref{3e8,,virtual environments} need
to be handled.

@end deffn

@geindex Py_GetProgramFullPath (C function)
@anchor{c-api/interp-lifecycle c Py_GetProgramFullPath}@anchor{3ec}
@deffn {C 함수} wchar_t *Py_GetProgramFullPath ()
` Part of the @ref{774,,안정 ABI}.'
@geindex executable (in module sys)

Return the full program name of the Python executable; this is  computed as a
side-effect of deriving the default module search path  from the program name
(set by @ref{3f2,,PyConfig.program_name}). The returned string points into
static storage; the caller should not modify its value.  The value is available
to Python code as @code{sys.executable}.

This function should not be called before @ref{460,,Py_Initialize()}, otherwise
it returns @code{NULL}.


버전 3.10에서 변경: It now returns @code{NULL} if called before @ref{460,,Py_Initialize()}.



Deprecated since version 3.13, will be removed in version 3.15: Use @ref{37c,,PyConfig_Get("executable")}
(@ref{3ed,,sys.executable}) instead.

@end deffn

@geindex Py_GetPath (C function)
@anchor{c-api/interp-lifecycle c Py_GetPath}@anchor{3e3}
@deffn {C 함수} wchar_t *Py_GetPath ()
` Part of the @ref{774,,안정 ABI}.'
@geindex module; search; path
@geindex path (in module sys)

Return the default module search path; this is computed from the program name
(set by @ref{3f2,,PyConfig.program_name}) and some environment variables.
The returned string consists of a series of directory names separated by a
platform dependent delimiter character.  The delimiter character is @code{':'}
on Unix and macOS, @code{';'} on Windows.  The returned string points into
static storage; the caller should not modify its value.  The list
@ref{3e4,,sys.path} is initialized with this value on interpreter startup; it
can be (and usually is) modified later to change the search path for loading
modules.

This function should not be called before @ref{460,,Py_Initialize()}, otherwise
it returns @code{NULL}.

@c XXX should give the exact rules


버전 3.10에서 변경: It now returns @code{NULL} if called before @ref{460,,Py_Initialize()}.



Deprecated since version 3.13, will be removed in version 3.15: Use @ref{37c,,PyConfig_Get("module_search_paths")}
(@ref{3e4,,sys.path}) instead.

@end deffn

@geindex Py_GetVersion (C function)
@anchor{c-api/interp-lifecycle c Py_GetVersion}@anchor{5170}
@deffn {C 함수} const char *Py_GetVersion ()
` Part of the @ref{774,,안정 ABI}.'
Return the version of this Python interpreter.  This is a string that looks
something like

@example
"3.0a5+ (py3k:63103M, May 12 2008, 00:53:55) \n[GCC 4.2.3]"
@end example

@geindex version (in module sys)

The first word (up to the first space character) is the current Python version;
the first characters are the major and minor version separated by a
period.  The returned string points into static storage; the caller should not
modify its value.  The value is available to Python code as @ref{49d,,sys.version}.

See also the @ref{381,,Py_Version} constant.
@end deffn

@geindex Py_GetPlatform (C function)
@anchor{c-api/interp-lifecycle c Py_GetPlatform}@anchor{516e}
@deffn {C 함수} const char *Py_GetPlatform ()
` Part of the @ref{774,,안정 ABI}.'
@geindex platform (in module sys)

Return the platform identifier for the current platform.  On Unix, this is
formed from the “official” name of the operating system, converted to lower
case, followed by the major revision number; e.g., for Solaris 2.x, which is
also known as SunOS 5.x, the value is @code{'sunos5'}.  On macOS, it is
@code{'darwin'}.  On Windows, it is @code{'win'}.  The returned string points into
static storage; the caller should not modify its value.  The value is available
to Python code as @code{sys.platform}.
@end deffn

@geindex Py_GetCopyright (C function)
@anchor{c-api/interp-lifecycle c Py_GetCopyright}@anchor{516d}
@deffn {C 함수} const char *Py_GetCopyright ()
` Part of the @ref{774,,안정 ABI}.'
Return the official copyright string for the current Python version, for example

@code{'Copyright 1991-1995 Stichting Mathematisch Centrum, Amsterdam'}

@geindex copyright (in module sys)

The returned string points into static storage; the caller should not modify its
value.  The value is available to Python code as @code{sys.copyright}.
@end deffn

@geindex Py_GetCompiler (C function)
@anchor{c-api/interp-lifecycle c Py_GetCompiler}@anchor{516c}
@deffn {C 함수} const char *Py_GetCompiler ()
` Part of the @ref{774,,안정 ABI}.'
Return an indication of the compiler used to build the current Python version,
in square brackets, for example:

@example
"[GCC 2.7.2.2]"
@end example

@geindex version (in module sys)

The returned string points into static storage; the caller should not modify its
value.  The value is available to Python code as part of the variable
@code{sys.version}.
@end deffn

@geindex Py_GetBuildInfo (C function)
@anchor{c-api/interp-lifecycle c Py_GetBuildInfo}@anchor{1637}
@deffn {C 함수} const char *Py_GetBuildInfo ()
` Part of the @ref{774,,안정 ABI}.'
Return information about the sequence number and build date and time of the
current Python interpreter instance, for example

@example
"#67, Aug  1 1997, 22:34:28"
@end example

@geindex version (in module sys)

The returned string points into static storage; the caller should not modify its
value.  The value is available to Python code as part of the variable
@code{sys.version}.
@end deffn

@geindex PySys_SetArgvEx (C function)
@anchor{c-api/interp-lifecycle c PySys_SetArgvEx}@anchor{19b7}
@deffn {C 함수} void PySys_SetArgvEx (int argc, wchar_t **argv, int updatepath)
` Part of the @ref{774,,안정 ABI}.'
@geindex main()
@geindex Py_FatalError()
@geindex argv (in module sys)

This API is kept for backward compatibility: setting
@ref{3f1,,PyConfig.argv}, @ref{1cee,,PyConfig.parse_argv} and
@ref{976,,PyConfig.safe_path} should be used instead, see @ref{644,,Python Initialization Configuration}.

Set @ref{1469,,sys.argv} based on `argc' and `argv'.  These parameters are
similar to those passed to the program’s @code{main()} function with the
difference that the first entry should refer to the script file to be
executed rather than the executable hosting the Python interpreter.  If there
isn’t a script that will be run, the first entry in `argv' can be an empty
string.  If this function fails to initialize @code{sys.argv}, a fatal
condition is signalled using @ref{b79,,Py_FatalError()}.

If `updatepath' is zero, this is all the function does.  If `updatepath'
is non-zero, the function also modifies @ref{3e4,,sys.path} according to the
following algorithm:


@itemize -

@item 
If the name of an existing script is passed in @code{argv[0]}, the absolute
path of the directory where the script is located is prepended to
@ref{3e4,,sys.path}.

@item 
Otherwise (that is, if `argc' is @code{0} or @code{argv[0]} doesn’t point
to an existing file name), an empty string is prepended to
@ref{3e4,,sys.path}, which is the same as prepending the current working
directory (@code{"."}).
@end itemize

Use @ref{dbf,,Py_DecodeLocale()} to decode a bytes string to get a
wchar_t* string.

See also @ref{a94,,PyConfig.orig_argv} and @ref{3f1,,PyConfig.argv}
members of the @ref{644,,Python Initialization Configuration}.

@cartouche
@quotation 참고 
It is recommended that applications embedding the Python interpreter
for purposes other than executing a single script pass @code{0} as `updatepath',
and update @ref{3e4,,sys.path} themselves if desired.
See 
@geindex Common Vulnerabilities and Exposures; CVE 2008-5983
CVE 2008-5983@footnote{https://www.cve.org/CVERecord?id=CVE-2008-5983}.

On versions before 3.1.3, you can achieve the same effect by manually
popping the first @ref{3e4,,sys.path} element after having called
@ref{19b8,,PySys_SetArgv()}, for example using:

@example
PyRun_SimpleString("import sys; sys.path.pop(0)\n");
@end example
@end quotation
@end cartouche


Added in version 3.1.3.



Deprecated since version 3.11, will be removed in version 3.15.

@end deffn

@geindex PySys_SetArgv (C function)
@anchor{c-api/interp-lifecycle c PySys_SetArgv}@anchor{19b8}
@deffn {C 함수} void PySys_SetArgv (int argc, wchar_t **argv)
` Part of the @ref{774,,안정 ABI}.'
This API is kept for backward compatibility: setting
@ref{3f1,,PyConfig.argv} and @ref{1cee,,PyConfig.parse_argv} should be used
instead, see @ref{644,,Python Initialization Configuration}.

This function works like @ref{19b7,,PySys_SetArgvEx()} with `updatepath' set
to @code{1} unless the @code{python} interpreter was started with the
@ref{b56,,-I}.

Use @ref{dbf,,Py_DecodeLocale()} to decode a bytes string to get a
wchar_t* string.

See also @ref{a94,,PyConfig.orig_argv} and @ref{3f1,,PyConfig.argv}
members of the @ref{644,,Python Initialization Configuration}.


버전 3.4에서 변경: The `updatepath' value depends on @ref{b56,,-I}.



Deprecated since version 3.11, will be removed in version 3.15.

@end deffn

@geindex Py_SetPythonHome (C function)
@anchor{c-api/interp-lifecycle c Py_SetPythonHome}@anchor{19b5}
@deffn {C 함수} void Py_SetPythonHome (const wchar_t *home)
` Part of the @ref{774,,안정 ABI}.'
This API is kept for backward compatibility: setting
@ref{3f3,,PyConfig.home} should be used instead, see @ref{644,,Python Initialization Configuration}.

Set the default “home” directory, that is, the location of the standard
Python libraries.  See 
@geindex PYTHONHOME
@geindex 환경 변수; PYTHONHOME
@ref{3f0,,PYTHONHOME} for the meaning of the
argument string.

The argument should point to a zero-terminated character string in static
storage whose contents will not change for the duration of the program’s
execution.  No code in the Python interpreter will change the contents of
this storage.

Use @ref{dbf,,Py_DecodeLocale()} to decode a bytes string to get a
wchar_t* string.


Deprecated since version 3.11, will be removed in version 3.15.

@end deffn

@geindex Py_GetPythonHome (C function)
@anchor{c-api/interp-lifecycle c Py_GetPythonHome}@anchor{3ef}
@deffn {C 함수} wchar_t *Py_GetPythonHome ()
` Part of the @ref{774,,안정 ABI}.'
Return the default “home”, that is, the value set by
@ref{3f3,,PyConfig.home}, or the value of the 
@geindex PYTHONHOME
@geindex 환경 변수; PYTHONHOME
@ref{3f0,,PYTHONHOME}
environment variable if it is set.

This function should not be called before @ref{460,,Py_Initialize()}, otherwise
it returns @code{NULL}.


버전 3.10에서 변경: It now returns @code{NULL} if called before @ref{460,,Py_Initialize()}.



Deprecated since version 3.13, will be removed in version 3.15: Use @ref{37c,,PyConfig_Get("home")} or the
@geindex PYTHONHOME
@geindex 환경 변수; PYTHONHOME
@ref{3f0,,PYTHONHOME} environment variable instead.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Thread states and the global interpreter lock,Asynchronous notifications,Interpreter initialization and finalization,Python/C API reference manual
@anchor{c-api/threads doc}@anchor{555c}@anchor{c-api/threads thread-states-and-the-global-interpreter-lock}@anchor{555d}@anchor{c-api/threads threads}@anchor{555e}@anchor{c-api/threads translation-repo}@anchor{555f}
@section Thread states and the global interpreter lock


@geindex global interpreter lock
@geindex interpreter lock
@geindex lock@comma{} interpreter

Unless on a @ref{1767,,free-threaded build} of @ref{904,,CPython},
the Python interpreter is generally not thread-safe.  In order to support
multi-threaded Python programs, there’s a global lock, called the @ref{474,,global interpreter lock} or @ref{164,,GIL}, that must be held by a thread before
accessing Python objects. Without the lock, even the simplest operations
could cause problems in a multi-threaded program: for example, when
two threads simultaneously increment the reference count of the same object, the
reference count could end up being incremented only once instead of twice.

As such, only a thread that holds the GIL may operate on Python objects or
invoke Python’s C API.

@geindex setswitchinterval (in module sys)

In order to emulate concurrency, the interpreter regularly tries to switch
threads between bytecode instructions (see @ref{b44,,sys.setswitchinterval()}).
This is why locks are also necessary for thread-safety in pure-Python code.

Additionally, the global interpreter lock is released around blocking I/O
operations, such as reading or writing to a file. From the C API, this is done
by @ref{5560,,detaching the thread state}.

@geindex PyThreadState (C type)

The Python interpreter keeps some thread-local information inside
a data structure called @ref{98f,,PyThreadState}, known as a @ref{1848,,thread state}.
Each thread has a thread-local pointer to a @code{PyThreadState}; a thread state
referenced by this pointer is considered to be @ref{4f10,,attached}.

A thread can only have one @ref{4f10,,attached thread state} at a time. An attached
thread state is typically analogous with holding the GIL, except on
free-threaded builds.  On builds with the GIL enabled, attaching a thread state
will block until the GIL can be acquired. However, even on builds with the GIL
disabled, it is still required to have an attached thread state, as the interpreter
needs to keep track of which threads may access Python objects.

@cartouche
@quotation 참고 
Even on the free-threaded build, attaching a thread state may block, as the
GIL can be re-enabled or threads might be temporarily suspended (such as during
a garbage collection).
@end quotation
@end cartouche

Generally, there will always be an attached thread state when using Python’s
C API, including during embedding and when implementing methods, so it’s uncommon
to need to set up a thread state on your own. Only in some specific cases, such
as in a @ref{4efc,,Py_BEGIN_ALLOW_THREADS} block or in a fresh thread, will the
thread not have an attached thread state.
If uncertain, check if @ref{423,,PyThreadState_GetUnchecked()} returns @code{NULL}.

If it turns out that you do need to create a thread state, call @ref{5102,,PyThreadState_New()}
followed by @ref{5103,,PyThreadState_Swap()}, or use the dangerous
@ref{648,,PyGILState_Ensure()} function.

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

@end menu

@node Detaching the thread state from extension code,Non-Python created threads,,Thread states and the global interpreter lock
@anchor{c-api/threads detaching-the-thread-state-from-extension-code}@anchor{5561}@anchor{c-api/threads detaching-thread-state}@anchor{5560}
@subsection Detaching the thread state from extension code


Most extension code manipulating the @ref{1848,,thread state} has the following simple
structure:

@example
Save the thread state in a local variable.
... Do some blocking I/O operation ...
Restore the thread state from the local variable.
@end example

This is so common that a pair of macros exists to simplify it:

@example
Py_BEGIN_ALLOW_THREADS
... Do some blocking I/O operation ...
Py_END_ALLOW_THREADS
@end example

@geindex Py_BEGIN_ALLOW_THREADS (C macro)
@geindex Py_END_ALLOW_THREADS (C macro)

The @ref{4efc,,Py_BEGIN_ALLOW_THREADS} macro opens a new block and declares a
hidden local variable; the @ref{c7e,,Py_END_ALLOW_THREADS} macro closes the
block.

The block above expands to the following code:

@example
PyThreadState *_save;

_save = PyEval_SaveThread();
... Do some blocking I/O operation ...
PyEval_RestoreThread(_save);
@end example

@geindex PyEval_RestoreThread (C function)
@geindex PyEval_SaveThread (C function)

Here is how these functions work:

The attached thread state implies that the GIL is held for the interpreter.
To detach it, @ref{645,,PyEval_SaveThread()} is called and the result is stored
in a local variable.

By detaching the thread state, the GIL is released, which allows other threads
to attach to the interpreter and execute while the current thread performs
blocking I/O. When the I/O operation is complete, the old thread state is
reattached by calling @ref{646,,PyEval_RestoreThread()}, which will wait until
the GIL can be acquired.

@cartouche
@quotation 참고 
Performing blocking I/O is the most common use case for detaching
the thread state, but it is also useful to call it over long-running
native code that doesn’t need access to Python objects or Python’s C API.
For example, the standard @ref{139,,zlib} and @ref{6c,,hashlib} modules detach the
@ref{4f10,,thread state} when compressing or hashing
data.
@end quotation
@end cartouche

On a @ref{1767,,free-threaded build}, the @ref{164,,GIL} is usually out of the question,
but `detaching the thread state is still required', because the interpreter
periodically needs to block all threads to get a consistent view of Python objects
without the risk of race conditions.
For example, CPython currently suspends all threads for a short period of time
while running the garbage collector.

@cartouche
@quotation 경고 
Detaching the thread state can lead to unexpected behavior during interpreter
finalization. See @ref{5559,,Cautions regarding runtime finalization} for more
details.
@end quotation
@end cartouche

@menu
* APIs:: 

@end menu

@node APIs,,,Detaching the thread state from extension code
@anchor{c-api/threads apis}@anchor{5562}
@subsubsection APIs


The following macros are normally used without a trailing semicolon; look for
example usage in the Python source distribution.

@cartouche
@quotation 참고 
These macros are still necessary on the @ref{1767,,free-threaded build} to prevent
deadlocks.
@end quotation
@end cartouche

@geindex Py_BEGIN_ALLOW_THREADS (C macro)
@anchor{c-api/threads c Py_BEGIN_ALLOW_THREADS}@anchor{4efc}
@deffn {C 매크로} Py_BEGIN_ALLOW_THREADS
` Part of the @ref{774,,안정 ABI}.'
This macro expands to @code{@{ PyThreadState *_save; _save = PyEval_SaveThread();}.
Note that it contains an opening brace; it must be matched with a following
@ref{c7e,,Py_END_ALLOW_THREADS} macro.  See above for further discussion of this
macro.
@end deffn

@geindex Py_END_ALLOW_THREADS (C macro)
@anchor{c-api/threads c Py_END_ALLOW_THREADS}@anchor{c7e}
@deffn {C 매크로} Py_END_ALLOW_THREADS
` Part of the @ref{774,,안정 ABI}.'
This macro expands to @code{PyEval_RestoreThread(_save); @}}. Note that it contains
a closing brace; it must be matched with an earlier
@ref{4efc,,Py_BEGIN_ALLOW_THREADS} macro.  See above for further discussion of
this macro.
@end deffn

@geindex Py_BLOCK_THREADS (C macro)
@anchor{c-api/threads c Py_BLOCK_THREADS}@anchor{5168}
@deffn {C 매크로} Py_BLOCK_THREADS
` Part of the @ref{774,,안정 ABI}.'
This macro expands to @code{PyEval_RestoreThread(_save);}: it is equivalent to
@ref{c7e,,Py_END_ALLOW_THREADS} without the closing brace.
@end deffn

@geindex Py_UNBLOCK_THREADS (C macro)
@anchor{c-api/threads c Py_UNBLOCK_THREADS}@anchor{5188}
@deffn {C 매크로} Py_UNBLOCK_THREADS
` Part of the @ref{774,,안정 ABI}.'
This macro expands to @code{_save = PyEval_SaveThread();}: it is equivalent to
@ref{4efc,,Py_BEGIN_ALLOW_THREADS} without the opening brace and variable
declaration.
@end deffn

@node Non-Python created threads,Legacy API,Detaching the thread state from extension code,Thread states and the global interpreter lock
@anchor{c-api/threads non-python-created-threads}@anchor{5563}
@subsection Non-Python created threads


When threads are created using the dedicated Python APIs (such as the
@ref{f3,,threading} module), a thread state is automatically associated with them,
However, when a thread is created from native code (for example, by a
third-party library with its own thread management), it doesn’t hold an
attached thread state.

If you need to call Python code from these threads (often this will be part
of a callback API provided by the aforementioned third-party library),
you must first register these threads with the interpreter by
creating a new thread state and attaching it.

The most robust way to do this is through @ref{5102,,PyThreadState_New()} followed
by @ref{5103,,PyThreadState_Swap()}.

@cartouche
@quotation 참고 
@code{PyThreadState_New} requires an argument pointing to the desired
interpreter; such a pointer can be acquired via a call to
@ref{64a,,PyInterpreterState_Get()} from the code where the thread was
created.
@end quotation
@end cartouche

For example:

@example
/* The return value of PyInterpreterState_Get() from the
   function that created this thread. */
PyInterpreterState *interp = thread_data->interp;

/* Create a new thread state for the interpreter. It does not start out
   attached. */
PyThreadState *tstate = PyThreadState_New(interp);

/* Attach the thread state, which will acquire the GIL. */
PyThreadState_Swap(tstate);

/* Perform Python actions here. */
result = CallSomeFunction();
/* evaluate result or handle exception */

/* Destroy the thread state. No Python API allowed beyond this point. */
PyThreadState_Clear(tstate);
PyThreadState_DeleteCurrent();
@end example

@cartouche
@quotation 경고 
If the interpreter finalized before @code{PyThreadState_Swap} was called, then
@code{interp} will be a dangling pointer!
@end quotation
@end cartouche

@node Legacy API,Cautions about fork,Non-Python created threads,Thread states and the global interpreter lock
@anchor{c-api/threads gilstate}@anchor{5564}@anchor{c-api/threads legacy-api}@anchor{5565}
@subsection Legacy API


Another common pattern to call Python code from a non-Python thread is to use
@ref{648,,PyGILState_Ensure()} followed by a call to @ref{649,,PyGILState_Release()}.

These functions do not work well when multiple interpreters exist in the Python
process. If no Python interpreter has ever been used in the current thread (which
is common for threads created outside Python), @code{PyGILState_Ensure} will create
and attach a thread state for the “main” interpreter (the first interpreter in
the Python process).

Additionally, these functions have thread-safety issues during interpreter
finalization. Using @code{PyGILState_Ensure} during finalization will likely
crash the process.

Usage of these functions look like such:

@example
PyGILState_STATE gstate;
gstate = PyGILState_Ensure();

/* Perform Python actions here. */
result = CallSomeFunction();
/* evaluate result or handle exception */

/* Release the thread. No Python API allowed beyond this point. */
PyGILState_Release(gstate);
@end example

@node Cautions about fork,High-level APIs,Legacy API,Thread states and the global interpreter lock
@anchor{c-api/threads cautions-about-fork}@anchor{5566}@anchor{c-api/threads fork-and-threads}@anchor{525f}
@subsection Cautions about fork()


Another important thing to note about threads is their behaviour in the face
of the C @code{fork()} call. On most systems with @code{fork()}, after a
process forks only the thread that issued the fork will exist.  This has a
concrete impact both on how locks must be handled and on all stored state
in CPython’s runtime.

The fact that only the “current” thread remains
means any locks held by other threads will never be released. Python solves
this for @ref{4b6,,os.fork()} by acquiring the locks it uses internally before
the fork, and releasing them afterwards. In addition, it resets any
@ref{3654,,Lock objects} in the child. When extending or embedding Python, there
is no way to inform Python of additional (non-Python) locks that need to be
acquired before or reset after a fork. OS facilities such as
@code{pthread_atfork()} would need to be used to accomplish the same thing.
Additionally, when extending or embedding Python, calling @code{fork()}
directly rather than through @code{os.fork()} (and returning to or calling
into Python) may result in a deadlock by one of Python’s internal locks
being held by a thread that is defunct after the fork.
@ref{430,,PyOS_AfterFork_Child()} tries to reset the necessary locks, but is not
always able to.

The fact that all other threads go away also means that CPython’s
runtime state there must be cleaned up properly, which @ref{4b6,,os.fork()}
does.  This means finalizing all other @ref{98f,,PyThreadState} objects
belonging to the current interpreter and all other
@ref{aba,,PyInterpreterState} objects.  Due to this and the special
nature of the @ref{163,,“main” interpreter},
@code{fork()} should only be called in that interpreter’s “main”
thread, where the CPython global runtime was originally initialized.
The only exception is if @code{exec()} will be called immediately
after.

@node High-level APIs,GIL-state APIs,Cautions about fork,Thread states and the global interpreter lock
@anchor{c-api/threads high-level-apis}@anchor{5567}
@subsection High-level APIs


These are the most commonly used types and functions when writing multi-threaded
C extensions.

@geindex PyThreadState (C type)
@anchor{c-api/threads c PyThreadState}@anchor{98f}
@deffn {C 자료형} type PyThreadState
` Part of the @ref{774,,제한된 API} (as an opaque struct).'
This data structure represents the state of a single thread.  The only public
data member is:

@geindex PyThreadState.interp (C member)
@anchor{c-api/threads c PyThreadState interp}@anchor{5568}
@deffn {C 멤버 변수} @ref{aba,,PyInterpreterState} *interp

This thread’s interpreter state.
@end deffn
@end deffn

@geindex PyEval_InitThreads (C function)
@anchor{c-api/threads c PyEval_InitThreads}@anchor{19b9}
@deffn {C 함수} void PyEval_InitThreads ()
` Part of the @ref{774,,안정 ABI}.'
@geindex PyEval_AcquireThread()
@geindex PyEval_ReleaseThread()
@geindex PyEval_SaveThread()
@geindex PyEval_RestoreThread()

Deprecated function which does nothing.

In Python 3.6 and older, this function created the GIL if it didn’t exist.


버전 3.9에서 변경: The function now does nothing.



버전 3.7에서 변경: This function is now called by @ref{460,,Py_Initialize()}, so you don’t
have to call it yourself anymore.



버전 3.2에서 변경: This function cannot be called before @ref{460,,Py_Initialize()} anymore.



버전 3.9부터 폐지됨.


@geindex module; _thread
@end deffn

@geindex PyEval_SaveThread (C function)
@anchor{c-api/threads c PyEval_SaveThread}@anchor{645}
@deffn {C 함수} @ref{98f,,PyThreadState} *PyEval_SaveThread ()
` Part of the @ref{774,,안정 ABI}.'
Detach the @ref{4f10,,attached thread state} and return it.
The thread will have no @ref{1848,,thread state} upon returning.
@end deffn

@geindex PyEval_RestoreThread (C function)
@anchor{c-api/threads c PyEval_RestoreThread}@anchor{646}
@deffn {C 함수} void PyEval_RestoreThread (PyThreadState *tstate)
` Part of the @ref{774,,안정 ABI}.'
Set the @ref{4f10,,attached thread state} to `tstate'.
The passed @ref{1848,,thread state} `should not' be attached,
otherwise deadlock ensues. `tstate' will be attached upon returning.

@cartouche
@quotation 참고 
Calling this function from a thread when the runtime is finalizing will
hang the thread until the program exits, even if the thread was not
created by Python.  Refer to
@ref{5559,,Cautions regarding runtime finalization} for more details.
@end quotation
@end cartouche


버전 3.14에서 변경: Hangs the current thread, rather than terminating it, if called while the
interpreter is finalizing.

@end deffn

@geindex PyThreadState_Get (C function)
@anchor{c-api/threads c PyThreadState_Get}@anchor{613}
@deffn {C 함수} @ref{98f,,PyThreadState} *PyThreadState_Get ()
` Part of the @ref{774,,안정 ABI}.'
Return the @ref{4f10,,attached thread state}. If the thread has no attached
thread state, (such as when inside of @ref{4efc,,Py_BEGIN_ALLOW_THREADS}
block), then this issues a fatal error (so that the caller needn’t check
for @code{NULL}).

See also @ref{423,,PyThreadState_GetUnchecked()}.
@end deffn

@geindex PyThreadState_GetUnchecked (C function)
@anchor{c-api/threads c PyThreadState_GetUnchecked}@anchor{423}
@deffn {C 함수} @ref{98f,,PyThreadState} *PyThreadState_GetUnchecked ()

Similar to @ref{613,,PyThreadState_Get()}, but don’t kill the process with a
fatal error if it is NULL. The caller is responsible to check if the result
is NULL.


Added in version 3.13: In Python 3.5 to 3.12, the function was private and known as
@code{_PyThreadState_UncheckedGet()}.

@end deffn

@geindex PyThreadState_Swap (C function)
@anchor{c-api/threads c PyThreadState_Swap}@anchor{5103}
@deffn {C 함수} @ref{98f,,PyThreadState} *PyThreadState_Swap (PyThreadState *tstate)
` Part of the @ref{774,,안정 ABI}.'
Set the @ref{4f10,,attached thread state} to `tstate', and return the
@ref{1848,,thread state} that was attached prior to calling.

This function is safe to call without an @ref{4f10,,attached thread state}; it
will simply return @code{NULL} indicating that there was no prior thread state.


@subsubheading 더 보기


@ref{501d,,PyEval_ReleaseThread()}


@cartouche
@quotation 참고 
Similar to @ref{648,,PyGILState_Ensure()}, this function will hang the
thread if the runtime is finalizing.
@end quotation
@end cartouche
@end deffn

@node GIL-state APIs,Low-level APIs,High-level APIs,Thread states and the global interpreter lock
@anchor{c-api/threads gil-state-apis}@anchor{5569}
@subsection GIL-state APIs


The following functions use thread-local storage, and are not compatible
with sub-interpreters:

@geindex PyGILState_STATE (C type)
@anchor{c-api/threads c PyGILState_STATE}@anchor{506d}
@deffn {C 자료형} type PyGILState_STATE
` Part of the @ref{774,,안정 ABI}.'
The type of the value returned by @ref{648,,PyGILState_Ensure()} and passed to
@ref{649,,PyGILState_Release()}.

@geindex PyGILState_STATE.PyGILState_LOCKED (C enumerator)
@anchor{c-api/threads c PyGILState_STATE PyGILState_LOCKED}@anchor{556a}
@deffn {C 열거자} enumerator PyGILState_LOCKED

The GIL was already held when @ref{648,,PyGILState_Ensure()} was called.
@end deffn

@geindex PyGILState_STATE.PyGILState_UNLOCKED (C enumerator)
@anchor{c-api/threads c PyGILState_STATE PyGILState_UNLOCKED}@anchor{556b}
@deffn {C 열거자} enumerator PyGILState_UNLOCKED

The GIL was not held when @ref{648,,PyGILState_Ensure()} was called.
@end deffn
@end deffn

@geindex PyGILState_Ensure (C function)
@anchor{c-api/threads c PyGILState_Ensure}@anchor{648}
@deffn {C 함수} @ref{506d,,PyGILState_STATE} PyGILState_Ensure ()
` Part of the @ref{774,,안정 ABI}.'
Ensure that the current thread is ready to call the Python C API regardless
of the current state of Python, or of the @ref{4f10,,attached thread state}. This may
be called as many times as desired by a thread as long as each call is
matched with a call to @ref{649,,PyGILState_Release()}. In general, other
thread-related APIs may be used between @ref{648,,PyGILState_Ensure()} and
@code{PyGILState_Release()} calls as long as the thread state is restored to
its previous state before the Release().  For example, normal usage of the
@ref{4efc,,Py_BEGIN_ALLOW_THREADS} and @ref{c7e,,Py_END_ALLOW_THREADS} macros is
acceptable.

The return value is an opaque “handle” to the @ref{4f10,,attached thread state} when
@ref{648,,PyGILState_Ensure()} was called, and must be passed to
@ref{649,,PyGILState_Release()} to ensure Python is left in the same state. Even
though recursive calls are allowed, these handles `cannot' be shared - each
unique call to @code{PyGILState_Ensure()} must save the handle for its call
to @code{PyGILState_Release()}.

When the function returns, there will be an @ref{4f10,,attached thread state}
and the thread will be able to call arbitrary Python code.  Failure is a fatal error.

@cartouche
@quotation 경고 
Calling this function when the runtime is finalizing is unsafe. Doing
so will either hang the thread until the program ends, or fully crash
the interpreter in rare cases. Refer to
@ref{5559,,Cautions regarding runtime finalization} for more details.
@end quotation
@end cartouche


버전 3.14에서 변경: Hangs the current thread, rather than terminating it, if called while the
interpreter is finalizing.

@end deffn

@geindex PyGILState_Release (C function)
@anchor{c-api/threads c PyGILState_Release}@anchor{649}
@deffn {C 함수} void PyGILState_Release (PyGILState_STATE)
` Part of the @ref{774,,안정 ABI}.'
Release any resources previously acquired.  After this call, Python’s state will
be the same as it was prior to the corresponding @ref{648,,PyGILState_Ensure()} call
(but generally this state will be unknown to the caller, hence the use of the
GILState API).

Every call to @ref{648,,PyGILState_Ensure()} must be matched by a call to
@ref{649,,PyGILState_Release()} on the same thread.
@end deffn

@geindex PyGILState_GetThisThreadState (C function)
@anchor{c-api/threads c PyGILState_GetThisThreadState}@anchor{506c}
@deffn {C 함수} @ref{98f,,PyThreadState} *PyGILState_GetThisThreadState ()
` Part of the @ref{774,,안정 ABI}.'
Get the @ref{4f10,,attached thread state} for this thread.  May return @code{NULL} if no
GILState API has been used on the current thread.  Note that the main thread
always has such a thread-state, even if no auto-thread-state call has been
made on the main thread.  This is mainly a helper/diagnostic function.

@cartouche
@quotation 참고 
This function may return non-@code{NULL} even when the @ref{1848,,thread state}
is detached.
Prefer @ref{613,,PyThreadState_Get()} or @ref{423,,PyThreadState_GetUnchecked()}
for most cases.
@end quotation
@end cartouche


@subsubheading 더 보기


@ref{613,,PyThreadState_Get()}

@end deffn

@geindex PyGILState_Check (C function)
@anchor{c-api/threads c PyGILState_Check}@anchor{556c}
@deffn {C 함수} int PyGILState_Check ()

Return @code{1} if the current thread is holding the @ref{164,,GIL} and @code{0} otherwise.
This function can be called from any thread at any time.
Only if it has had its @ref{4f10,,thread state} initialized
via @ref{648,,PyGILState_Ensure()} will it return @code{1}.
This is mainly a helper/diagnostic function.  It can be useful
for example in callback contexts or memory allocation functions when
knowing that the GIL is locked can allow the caller to perform sensitive
actions or otherwise behave differently.

@cartouche
@quotation 참고 
If the current Python process has ever created a subinterpreter, this
function will `always' return @code{1}. Prefer @ref{423,,PyThreadState_GetUnchecked()}
for most cases.
@end quotation
@end cartouche


Added in version 3.4.

@end deffn

@node Low-level APIs,,GIL-state APIs,Thread states and the global interpreter lock
@anchor{c-api/threads low-level-apis}@anchor{556d}
@subsection Low-level APIs


@geindex PyThreadState_New (C function)
@anchor{c-api/threads c PyThreadState_New}@anchor{5102}
@deffn {C 함수} @ref{98f,,PyThreadState} *PyThreadState_New (PyInterpreterState *interp)
` Part of the @ref{774,,안정 ABI}.'
Create a new thread state object belonging to the given interpreter object.
An @ref{4f10,,attached thread state} is not needed.
@end deffn

@geindex PyThreadState_Clear (C function)
@anchor{c-api/threads c PyThreadState_Clear}@anchor{1992}
@deffn {C 함수} void PyThreadState_Clear (PyThreadState *tstate)
` Part of the @ref{774,,안정 ABI}.'
Reset all information in a @ref{1848,,thread state} object.  `tstate'
must be @ref{4f10,,attached}


버전 3.9에서 변경: This function now calls the @code{PyThreadState.on_delete} callback.
Previously, that happened in @ref{1d87,,PyThreadState_Delete()}.



버전 3.13에서 변경: The @code{PyThreadState.on_delete} callback was removed.

@end deffn

@geindex PyThreadState_Delete (C function)
@anchor{c-api/threads c PyThreadState_Delete}@anchor{1d87}
@deffn {C 함수} void PyThreadState_Delete (PyThreadState *tstate)
` Part of the @ref{774,,안정 ABI}.'
Destroy a @ref{1848,,thread state} object.  `tstate' should not
be @ref{4f10,,attached} to any thread.
`tstate' must have been reset with a previous call to
@ref{1992,,PyThreadState_Clear()}.
@end deffn

@geindex PyThreadState_DeleteCurrent (C function)
@anchor{c-api/threads c PyThreadState_DeleteCurrent}@anchor{1db5}
@deffn {C 함수} void PyThreadState_DeleteCurrent (void)

Detach the @ref{4f10,,attached thread state} (which must have been reset
with a previous call to @ref{1992,,PyThreadState_Clear()}) and then destroy it.

No @ref{1848,,thread state} will be @ref{4f10,,attached} upon
returning.
@end deffn

@geindex PyThreadState_GetFrame (C function)
@anchor{c-api/threads c PyThreadState_GetFrame}@anchor{990}
@deffn {C 함수} @ref{98b,,PyFrameObject} *PyThreadState_GetFrame (PyThreadState *tstate)
` Part of the @ref{774,,안정 ABI} 버전 3.10 이후로.'
Get the current frame of the Python thread state `tstate'.

Return a @ref{5df,,strong reference}. Return @code{NULL} if no frame is currently
executing.

See also @ref{1b37,,PyEval_GetFrame()}.

`tstate' must not be @code{NULL}, and must be @ref{4f10,,attached}.


Added in version 3.9.

@end deffn

@geindex PyThreadState_GetID (C function)
@anchor{c-api/threads c PyThreadState_GetID}@anchor{b6a}
@deffn {C 함수} uint64_t PyThreadState_GetID (PyThreadState *tstate)
` Part of the @ref{774,,안정 ABI} 버전 3.10 이후로.'
Get the unique @ref{1848,,thread state} identifier of the Python thread state `tstate'.

`tstate' must not be @code{NULL}, and must be @ref{4f10,,attached}.


Added in version 3.9.

@end deffn

@geindex PyThreadState_GetInterpreter (C function)
@anchor{c-api/threads c PyThreadState_GetInterpreter}@anchor{b69}
@deffn {C 함수} @ref{aba,,PyInterpreterState} *PyThreadState_GetInterpreter (PyThreadState *tstate)
` Part of the @ref{774,,안정 ABI} 버전 3.10 이후로.'
Get the interpreter of the Python thread state `tstate'.

`tstate' must not be @code{NULL}, and must be @ref{4f10,,attached}.


Added in version 3.9.

@end deffn

@geindex PyThreadState_EnterTracing (C function)
@anchor{c-api/threads c PyThreadState_EnterTracing}@anchor{959}
@deffn {C 함수} void PyThreadState_EnterTracing (PyThreadState *tstate)

Suspend tracing and profiling in the Python thread state `tstate'.

Resume them using the @ref{95a,,PyThreadState_LeaveTracing()} function.


Added in version 3.11.

@end deffn

@geindex PyThreadState_LeaveTracing (C function)
@anchor{c-api/threads c PyThreadState_LeaveTracing}@anchor{95a}
@deffn {C 함수} void PyThreadState_LeaveTracing (PyThreadState *tstate)

Resume tracing and profiling in the Python thread state `tstate' suspended
by the @ref{959,,PyThreadState_EnterTracing()} function.

See also @ref{661,,PyEval_SetTrace()} and @ref{1702,,PyEval_SetProfile()}
functions.


Added in version 3.11.

@end deffn

@geindex PyUnstable_ThreadState_SetStackProtection (C function)
@anchor{c-api/threads c PyUnstable_ThreadState_SetStackProtection}@anchor{466}
@deffn {C 함수} int PyUnstable_ThreadState_SetStackProtection (PyThreadState *tstate, void *stack_start_addr, size_t stack_size)

@cartouche
@quotation 이것은 불안정 API. It may change without warning in minor releases. `이것은 @ref{768,,불안정 API}. It may change without warning in minor releases.'
@end quotation
@end cartouche

Set the stack protection start address and stack protection size
of a Python thread state.

On success, return @code{0}.
On failure, set an exception and return @code{-1}.

CPython implements @ref{523e,,recursion control} for C code by raising
@ref{f67,,RecursionError} when it notices that the machine execution stack is close
to overflow. See for example the @ref{3d2,,Py_EnterRecursiveCall()} function.
For this, it needs to know the location of the current thread’s stack, which it
normally gets from the operating system.
When the stack is changed, for example using context switching techniques like the
Boost library’s @code{boost::context}, you must call
@ref{466,,PyUnstable_ThreadState_SetStackProtection()} to inform CPython of the change.

Call @ref{466,,PyUnstable_ThreadState_SetStackProtection()} either before
or after changing the stack.
Do not call any other Python C API between the call and the stack
change.

See @ref{467,,PyUnstable_ThreadState_ResetStackProtection()} for undoing this operation.


Added in version 3.15.

@end deffn

@geindex PyUnstable_ThreadState_ResetStackProtection (C function)
@anchor{c-api/threads c PyUnstable_ThreadState_ResetStackProtection}@anchor{467}
@deffn {C 함수} void PyUnstable_ThreadState_ResetStackProtection (PyThreadState *tstate)

@cartouche
@quotation 이것은 불안정 API. It may change without warning in minor releases. `이것은 @ref{768,,불안정 API}. It may change without warning in minor releases.'
@end quotation
@end cartouche

Reset the stack protection start address and stack protection size
of a Python thread state to the operating system defaults.

See @ref{466,,PyUnstable_ThreadState_SetStackProtection()} for an explanation.


Added in version 3.15.

@end deffn

@geindex PyThreadState_GetDict (C function)
@anchor{c-api/threads c PyThreadState_GetDict}@anchor{5101}
@deffn {C 함수} @ref{5dc,,PyObject} *PyThreadState_GetDict ()
`반환값: 빌린 참조.'` Part of the @ref{774,,안정 ABI}.'
Return a dictionary in which extensions can store thread-specific state
information.  Each extension should use a unique key to use to store state in
the dictionary.  It is okay to call this function when no @ref{1848,,thread state}
is @ref{4f10,,attached}. If this function returns
@code{NULL}, no exception has been raised and the caller should assume no
thread state is attached.
@end deffn

@geindex PyEval_AcquireThread (C function)
@anchor{c-api/threads c PyEval_AcquireThread}@anchor{647}
@deffn {C 함수} void PyEval_AcquireThread (PyThreadState *tstate)
` Part of the @ref{774,,안정 ABI}.'
@ref{4f10,,Attach} `tstate' to the current thread,
which must not be @code{NULL} or already attached.

The calling thread must not already have an @ref{4f10,,attached thread state}.

@cartouche
@quotation 참고 
Calling this function from a thread when the runtime is finalizing will
hang the thread until the program exits, even if the thread was not
created by Python.  Refer to
@ref{5559,,Cautions regarding runtime finalization} for more details.
@end quotation
@end cartouche


버전 3.8에서 변경: Updated to be consistent with @ref{646,,PyEval_RestoreThread()},
@ref{c7e,,Py_END_ALLOW_THREADS()}, and @ref{648,,PyGILState_Ensure()},
and terminate the current thread if called while the interpreter is finalizing.



버전 3.14에서 변경: Hangs the current thread, rather than terminating it, if called while the
interpreter is finalizing.


@ref{646,,PyEval_RestoreThread()} is a higher-level function which is always
available (even when threads have not been initialized).
@end deffn

@geindex PyEval_ReleaseThread (C function)
@anchor{c-api/threads c PyEval_ReleaseThread}@anchor{501d}
@deffn {C 함수} void PyEval_ReleaseThread (PyThreadState *tstate)
` Part of the @ref{774,,안정 ABI}.'
Detach the @ref{4f10,,attached thread state}.
The `tstate' argument, which must not be @code{NULL}, is only used to check
that it represents the attached thread state — if it isn’t, a fatal error is
reported.

@ref{645,,PyEval_SaveThread()} is a higher-level function which is always
available (even when threads have not been initialized).
@end deffn

@node Asynchronous notifications,Operating system thread APIs,Thread states and the global interpreter lock,Python/C API reference manual
@anchor{c-api/threads asynchronous-notifications}@anchor{556e}
@section Asynchronous notifications


A mechanism is provided to make asynchronous notifications to the main
interpreter thread.  These notifications take the form of a function
pointer and a void pointer argument.

@geindex Py_AddPendingCall (C function)
@anchor{c-api/threads c Py_AddPendingCall}@anchor{b77}
@deffn {C 함수} int Py_AddPendingCall (int (*func)(void*), void *arg)
` Part of the @ref{774,,안정 ABI}.'
Schedule a function to be called from the main interpreter thread.  On
success, @code{0} is returned and `func' is queued for being called in the
main thread.  On failure, @code{-1} is returned without setting any exception.

When successfully queued, `func' will be `eventually' called from the
main interpreter thread with the argument `arg'.  It will be called
asynchronously with respect to normally running Python code, but with
both these conditions met:


@itemize *

@item 
on a @ref{4ab,,bytecode} boundary;

@item 
with the main thread holding an @ref{4f10,,attached thread state}
(`func' can therefore use the full C API).
@end itemize

`func' must return @code{0} on success, or @code{-1} on failure with an exception
set.  `func' won’t be interrupted to perform another asynchronous
notification recursively, but it can still be interrupted to switch
threads if the @ref{4f10,,thread state} is detached.

This function doesn’t need an @ref{4f10,,attached thread state}. However, to call this
function in a subinterpreter, the caller must have an attached thread state.
Otherwise, the function `func' can be scheduled to be called from the wrong interpreter.

@cartouche
@quotation 경고 
This is a low-level function, only useful for very special cases.
There is no guarantee that `func' will be called as quick as
possible.  If the main thread is busy executing a system call,
`func' won’t be called before the system call returns.  This
function is generally `not' suitable for calling Python code from
arbitrary C threads.  Instead, use the @ref{5564,,PyGILState API}.
@end quotation
@end cartouche


Added in version 3.1.



버전 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.



버전 3.12에서 변경: This function now always schedules `func' to be run in the main
interpreter.

@end deffn

@geindex Py_MakePendingCalls (C function)
@anchor{c-api/threads c Py_MakePendingCalls}@anchor{5173}
@deffn {C 함수} int Py_MakePendingCalls (void)
` Part of the @ref{774,,안정 ABI}.'
Execute all pending calls. This is usually executed automatically by the
interpreter.

This function returns @code{0} on success, and returns @code{-1} with an exception
set on failure.

If this is not called in the main thread of the main
interpreter, this function does nothing and returns @code{0}.
The caller must hold an @ref{4f10,,attached thread state}.


Added in version 3.1.



버전 3.12에서 변경: This function only runs pending calls in the main interpreter.

@end deffn

@geindex PyThreadState_SetAsyncExc (C function)
@anchor{c-api/threads c PyThreadState_SetAsyncExc}@anchor{dbc}
@deffn {C 함수} int PyThreadState_SetAsyncExc (unsigned long id, PyObject *exc)
` Part of the @ref{774,,안정 ABI}.'
Asynchronously raise an exception in a thread. The `id' argument is the thread
id of the target thread; `exc' is the exception object to be raised. This
function does not steal any references to `exc'. To prevent naive misuse, you
must write your own C extension to call this.  Must be called with an @ref{4f10,,attached thread state}.
Returns the number of thread states modified; this is normally one, but will be
zero if the thread id isn’t found.  If `exc' is @code{NULL}, the pending
exception (if any) for the thread is cleared. This raises no exceptions.


버전 3.7에서 변경: The type of the `id' parameter changed from long to
unsigned long.

@end deffn

@node Operating system thread APIs,Synchronization primitives,Asynchronous notifications,Python/C API reference manual
@anchor{c-api/threads operating-system-thread-apis}@anchor{556f}
@section Operating system thread APIs


@geindex PYTHREAD_INVALID_THREAD_ID (C macro)
@anchor{c-api/threads c PYTHREAD_INVALID_THREAD_ID}@anchor{5570}
@deffn {C 매크로} PYTHREAD_INVALID_THREAD_ID

Sentinel value for an invalid thread ID.

This is currently equivalent to @code{(unsigned long)-1}.
@end deffn

@geindex PyThread_start_new_thread (C function)
@anchor{c-api/threads c PyThread_start_new_thread}@anchor{1e27}
@deffn {C 함수} unsigned long PyThread_start_new_thread (void (*func)(void*), void *arg)
` Part of the @ref{774,,안정 ABI}.'
Start function `func' in a new thread with argument `arg'.
The resulting thread is not intended to be joined.

`func' must not be @code{NULL}, but `arg' may be @code{NULL}.

On success, this function returns the identifier of the new thread; on failure,
this returns @ref{5570,,PYTHREAD_INVALID_THREAD_ID}.

The caller does not need to hold an @ref{4f10,,attached thread state}.
@end deffn

@geindex PyThread_get_thread_ident (C function)
@anchor{c-api/threads c PyThread_get_thread_ident}@anchor{510b}
@deffn {C 함수} unsigned long PyThread_get_thread_ident (void)
` Part of the @ref{774,,안정 ABI}.'
Return the identifier of the current thread, which will never be zero.

This function cannot fail, and the caller does not need to hold an
@ref{4f10,,attached thread state}.


@subsubheading 더 보기


@ref{135f,,threading.get_ident()}

@end deffn

@geindex PyThread_GetInfo (C function)
@anchor{c-api/threads c PyThread_GetInfo}@anchor{5104}
@deffn {C 함수} @ref{5dc,,PyObject} *PyThread_GetInfo (void)
` Part of the @ref{774,,안정 ABI} 버전 3.3 이후로.'
Get general information about the current thread in the form of a
@ref{13c4,,struct sequence} object. This information is
accessible as @ref{1355,,sys.thread_info} in Python.

On success, this returns a new @ref{5df,,strong reference} to the thread
information; on failure, this returns @code{NULL} with an exception set.

The caller must hold an @ref{4f10,,attached thread state}.
@end deffn

@geindex PY_HAVE_THREAD_NATIVE_ID (C macro)
@anchor{c-api/threads c PY_HAVE_THREAD_NATIVE_ID}@anchor{5571}
@deffn {C 매크로} PY_HAVE_THREAD_NATIVE_ID

This macro is defined when the system supports native thread IDs.
@end deffn

@geindex PyThread_get_thread_native_id (C function)
@anchor{c-api/threads c PyThread_get_thread_native_id}@anchor{1ba0}
@deffn {C 함수} unsigned long PyThread_get_thread_native_id (void)
` Part of the @ref{774,,안정 ABI} on platforms with native thread IDs.'
Get the native identifier of the current thread as it was assigned by the operating
system’s kernel, which will never be less than zero.

This function is only available when @ref{5571,,PY_HAVE_THREAD_NATIVE_ID} is
defined.

This function cannot fail, and the caller does not need to hold an
@ref{4f10,,attached thread state}.


@subsubheading 더 보기


@ref{c31,,threading.get_native_id()}

@end deffn

@geindex PyThread_exit_thread (C function)
@anchor{c-api/threads c PyThread_exit_thread}@anchor{5108}
@deffn {C 함수} void PyThread_exit_thread (void)
` Part of the @ref{774,,안정 ABI}.'
Terminate the current thread. This function is generally considered unsafe
and should be avoided. It is kept solely for backwards compatibility.

This function is only safe to call if all functions in the full call
stack are written to safely allow it.

@cartouche
@quotation 경고 
If the current system uses POSIX threads (also known as “pthreads”),
this calls @code{pthread_exit(3)@footnote{https://manpages.debian.org/pthread_exit(3)}}, which attempts to unwind the stack
and call C++ destructors on some libc implementations. However, if a
@code{noexcept} function is reached, it may terminate the process.
Other systems, such as macOS, do unwinding.

On Windows, this function calls @code{_endthreadex()}, which kills the thread
without calling C++ destructors.

In any case, there is a risk of corruption on the thread’s stack.
@end quotation
@end cartouche


버전 3.14부터 폐지됨.

@end deffn

@geindex PyThread_init_thread (C function)
@anchor{c-api/threads c PyThread_init_thread}@anchor{510c}
@deffn {C 함수} void PyThread_init_thread (void)
` Part of the @ref{774,,안정 ABI}.'
Initialize @code{PyThread*} APIs. Python executes this function automatically,
so there’s little need to call it from an extension module.
@end deffn

@geindex PyThread_set_stacksize (C function)
@anchor{c-api/threads c PyThread_set_stacksize}@anchor{510e}
@deffn {C 함수} int PyThread_set_stacksize (size_t size)
` Part of the @ref{774,,안정 ABI}.'
Set the stack size of the current thread to `size' bytes.

This function returns @code{0} on success, @code{-1} if `size' is invalid, or
@code{-2} if the system does not support changing the stack size. This function
does not set exceptions.

The caller does not need to hold an @ref{4f10,,attached thread state}.
@end deffn

@geindex PyThread_get_stacksize (C function)
@anchor{c-api/threads c PyThread_get_stacksize}@anchor{510a}
@deffn {C 함수} size_t PyThread_get_stacksize (void)
` Part of the @ref{774,,안정 ABI}.'
Return the stack size of the current thread in bytes, or @code{0} if the system’s
default stack size is in use.

The caller does not need to hold an @ref{4f10,,attached thread state}.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Synchronization primitives,Thread-local storage support,Operating system thread APIs,Python/C API reference manual
@anchor{c-api/synchronization doc}@anchor{5572}@anchor{c-api/synchronization synchronization}@anchor{5573}@anchor{c-api/synchronization synchronization-primitives}@anchor{5574}@anchor{c-api/synchronization translation-repo}@anchor{5575}
@section Synchronization primitives


The C-API provides a basic mutual exclusion lock.

@geindex PyMutex (C type)
@anchor{c-api/synchronization c PyMutex}@anchor{485}
@deffn {C 자료형} type PyMutex

A mutual exclusion lock.  The @code{PyMutex} should be initialized to
zero to represent the unlocked state.  For example:

@example
PyMutex mutex = @{0@};
@end example

Instances of @code{PyMutex} should not be copied or moved.  Both the
contents and address of a @code{PyMutex} are meaningful, and it must
remain at a fixed, writable location in memory.

@cartouche
@quotation 참고 
A @code{PyMutex} currently occupies one byte, but the size should be
considered unstable.  The size may change in future Python releases
without a deprecation period.
@end quotation
@end cartouche


Added in version 3.13.

@end deffn

@geindex PyMutex_Lock (C function)
@anchor{c-api/synchronization c PyMutex_Lock}@anchor{5ce}
@deffn {C 함수} void PyMutex_Lock (PyMutex *m)
` Thread safety: @ref{2730,,Safe for concurrent use on the same object}.'
Lock mutex `m'.  If another thread has already locked it, the calling
thread will block until the mutex is unlocked.  While blocked, the thread
will temporarily detach the @ref{4f10,,thread state} if one exists.


Added in version 3.13.

@end deffn

@geindex PyMutex_Unlock (C function)
@anchor{c-api/synchronization c PyMutex_Unlock}@anchor{5cf}
@deffn {C 함수} void PyMutex_Unlock (PyMutex *m)
` Thread safety: @ref{2730,,Safe for concurrent use on the same object}.'
Unlock mutex `m'. The mutex must be locked — otherwise, the function will
issue a fatal error.


Added in version 3.13.

@end deffn

@geindex PyMutex_IsLocked (C function)
@anchor{c-api/synchronization c PyMutex_IsLocked}@anchor{463}
@deffn {C 함수} int PyMutex_IsLocked (PyMutex *m)
` Thread safety: @ref{2735,,Atomic}.'
Returns non-zero if the mutex `m' is currently locked, zero otherwise.

@cartouche
@quotation 참고 
This function is intended for use in assertions and debugging only and
should not be used to make concurrency control decisions, as the lock
state may change immediately after the check.
@end quotation
@end cartouche


Added in version 3.14.

@end deffn

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

@end menu

@node Python critical section API,Legacy locking APIs,,Synchronization primitives
@anchor{c-api/synchronization id1}@anchor{5576}@anchor{c-api/synchronization python-critical-section-api}@anchor{2732}
@subsection Python critical section API


The critical section API provides a deadlock avoidance layer on top of
per-object locks for @ref{1f4,,free-threaded} CPython.  They are
intended to replace reliance on the @ref{474,,global interpreter lock}, and are
no-ops in versions of Python with the global interpreter lock.

Critical sections are intended to be used for custom types implemented
in C-API extensions. They should generally not be used with built-in types like
@ref{24d,,list} and @ref{183,,dict} because their public C-APIs
already use critical sections internally, with the notable
exception of @ref{1990,,PyDict_Next()}, which requires critical section
to be acquired externally.

Critical sections avoid deadlocks by implicitly suspending active critical
sections, hence, they do not provide exclusive access such as provided by
traditional locks like @ref{485,,PyMutex}.  When a critical section is started,
the per-object lock for the object is acquired. If the code executed inside the
critical section calls C-API functions then it can suspend the critical section thereby
releasing the per-object lock, so other threads can acquire the per-object lock
for the same object.

Variants that accept @ref{485,,PyMutex} pointers rather than Python objects are also
available. Use these variants to start a critical section in a situation where
there is no @ref{5dc,,PyObject} – for example, when working with a C type that
does not extend or wrap @code{PyObject} but still needs to call into the C
API in a manner that might lead to deadlocks.

The functions and structs used by the macros are exposed for cases
where C macros are not available. They should only be used as in the
given macro expansions. Note that the sizes and contents of the structures may
change in future Python versions.

@cartouche
@quotation 참고 
Operations that need to lock two objects at once must use
@ref{5577,,Py_BEGIN_CRITICAL_SECTION2}.  You `cannot' use nested critical
sections to lock more than one object at once, because the inner critical
section may suspend the outer critical sections.  This API does not provide
a way to lock more than two objects at once.
@end quotation
@end cartouche

Example usage:

@example
static PyObject *
set_field(MyObject *self, PyObject *value)
@{
   Py_BEGIN_CRITICAL_SECTION(self);
   Py_SETREF(self->field, Py_XNewRef(value));
   Py_END_CRITICAL_SECTION();
   Py_RETURN_NONE;
@}
@end example

In the above example, @ref{798,,Py_SETREF} calls @ref{78f,,Py_DECREF}, which
can call arbitrary code through an object’s deallocation function.  The critical
section API avoids potential deadlocks due to reentrancy and lock ordering
by allowing the runtime to temporarily suspend the critical section if the
code triggered by the finalizer blocks and calls @ref{645,,PyEval_SaveThread()}.

@geindex Py_BEGIN_CRITICAL_SECTION (C macro)
@anchor{c-api/synchronization c Py_BEGIN_CRITICAL_SECTION}@anchor{53ea}
@deffn {C 매크로} Py_BEGIN_CRITICAL_SECTION (op)

Acquires the per-object lock for the object `op' and begins a
critical section.

In the free-threaded build, this macro expands to:

@example
@{
    PyCriticalSection _py_cs;
    PyCriticalSection_Begin(&_py_cs, (PyObject*)(op))
@end example

In the default build, this macro expands to @code{@{}.


Added in version 3.13.

@end deffn

@geindex Py_BEGIN_CRITICAL_SECTION_MUTEX (C macro)
@anchor{c-api/synchronization c Py_BEGIN_CRITICAL_SECTION_MUTEX}@anchor{5578}
@deffn {C 매크로} Py_BEGIN_CRITICAL_SECTION_MUTEX (m)

Locks the mutex `m' and begins a critical section.

In the free-threaded build, this macro expands to:

@example
@{
     PyCriticalSection _py_cs;
     PyCriticalSection_BeginMutex(&_py_cs, m)
@end example

Note that unlike @ref{53ea,,Py_BEGIN_CRITICAL_SECTION}, there is no cast for
the argument of the macro - it must be a @ref{485,,PyMutex} pointer.

On the default build, this macro expands to @code{@{}.


Added in version 3.14.

@end deffn

@geindex Py_END_CRITICAL_SECTION (C macro)
@anchor{c-api/synchronization c Py_END_CRITICAL_SECTION}@anchor{5579}
@deffn {C 매크로} Py_END_CRITICAL_SECTION ()

Ends the critical section and releases the per-object lock.

In the free-threaded build, this macro expands to:

@example
    PyCriticalSection_End(&_py_cs);
@}
@end example

In the default build, this macro expands to @code{@}}.


Added in version 3.13.

@end deffn

@geindex Py_BEGIN_CRITICAL_SECTION2 (C macro)
@anchor{c-api/synchronization c Py_BEGIN_CRITICAL_SECTION2}@anchor{5577}
@deffn {C 매크로} Py_BEGIN_CRITICAL_SECTION2 (a, b)

Acquires the per-object locks for the objects `a' and `b' and begins a
critical section.  The locks are acquired in a consistent order (lowest
address first) to avoid lock ordering deadlocks.

In the free-threaded build, this macro expands to:

@example
@{
    PyCriticalSection2 _py_cs2;
    PyCriticalSection2_Begin(&_py_cs2, (PyObject*)(a), (PyObject*)(b))
@end example

In the default build, this macro expands to @code{@{}.


Added in version 3.13.

@end deffn

@geindex Py_BEGIN_CRITICAL_SECTION2_MUTEX (C macro)
@anchor{c-api/synchronization c Py_BEGIN_CRITICAL_SECTION2_MUTEX}@anchor{557a}
@deffn {C 매크로} Py_BEGIN_CRITICAL_SECTION2_MUTEX (m1, m2)

Locks the mutexes `m1' and `m2' and begins a critical section.

In the free-threaded build, this macro expands to:

@example
@{
     PyCriticalSection2 _py_cs2;
     PyCriticalSection2_BeginMutex(&_py_cs2, m1, m2)
@end example

Note that unlike @ref{5577,,Py_BEGIN_CRITICAL_SECTION2}, there is no cast for
the arguments of the macro - they must be @ref{485,,PyMutex} pointers.

On the default build, this macro expands to @code{@{}.


Added in version 3.14.

@end deffn

@geindex Py_END_CRITICAL_SECTION2 (C macro)
@anchor{c-api/synchronization c Py_END_CRITICAL_SECTION2}@anchor{557b}
@deffn {C 매크로} Py_END_CRITICAL_SECTION2 ()

Ends the critical section and releases the per-object locks.

In the free-threaded build, this macro expands to:

@example
    PyCriticalSection2_End(&_py_cs2);
@}
@end example

In the default build, this macro expands to @code{@}}.


Added in version 3.13.

@end deffn

@node Legacy locking APIs,,Python critical section API,Synchronization primitives
@anchor{c-api/synchronization legacy-locking-apis}@anchor{557c}
@subsection Legacy locking APIs


These APIs are obsolete since Python 3.13 with the introduction of
@ref{485,,PyMutex}.

@geindex PyThread_type_lock (C type)
@anchor{c-api/synchronization c PyThread_type_lock}@anchor{557d}
@deffn {C 자료형} type PyThread_type_lock

A pointer to a mutual exclusion lock.
@end deffn

@geindex PyLockStatus (C type)
@anchor{c-api/synchronization c PyLockStatus}@anchor{557e}
@deffn {C 자료형} type PyLockStatus

The result of acquiring a lock with a timeout.

@geindex PY_LOCK_FAILURE (C enumerator)
@anchor{c-api/synchronization c PY_LOCK_FAILURE}@anchor{557f}
@deffn {C 열거자} enumerator PY_LOCK_FAILURE

Failed to acquire the lock.
@end deffn

@geindex PY_LOCK_ACQUIRED (C enumerator)
@anchor{c-api/synchronization c PY_LOCK_ACQUIRED}@anchor{5580}
@deffn {C 열거자} enumerator PY_LOCK_ACQUIRED

The lock was successfully acquired.
@end deffn

@geindex PY_LOCK_INTR (C enumerator)
@anchor{c-api/synchronization c PY_LOCK_INTR}@anchor{5581}
@deffn {C 열거자} enumerator PY_LOCK_INTR

The lock was interrupted by a signal.
@end deffn
@end deffn

@geindex PyThread_allocate_lock (C function)
@anchor{c-api/synchronization c PyThread_allocate_lock}@anchor{5107}
@deffn {C 함수} @ref{557d,,PyThread_type_lock} PyThread_allocate_lock (void)
` Part of the @ref{774,,안정 ABI}.'
Allocate a new lock.

On success, this function returns a lock; on failure, this
function returns @code{0} without an exception set.

The caller does not need to hold an @ref{4f10,,attached thread state}.
@end deffn

@geindex PyThread_free_lock (C function)
@anchor{c-api/synchronization c PyThread_free_lock}@anchor{5109}
@deffn {C 함수} void PyThread_free_lock (PyThread_type_lock lock)
` Part of the @ref{774,,안정 ABI}.'
Destroy `lock'. The lock should not be held by any thread when calling
this.

The caller does not need to hold an @ref{4f10,,attached thread state}.
@end deffn

@geindex PyThread_acquire_lock_timed (C function)
@anchor{c-api/synchronization c PyThread_acquire_lock_timed}@anchor{5106}
@deffn {C 함수} @ref{557e,,PyLockStatus} PyThread_acquire_lock_timed (PyThread_type_lock lock, long long microseconds, int intr_flag)
` Part of the @ref{774,,안정 ABI}.'
Acquire `lock' with a timeout.

This will wait for `microseconds' microseconds to acquire the lock. If the
timeout expires, this function returns @ref{557f,,PY_LOCK_FAILURE}.
If `microseconds' is @code{-1}, this will wait indefinitely until the lock has
been released.

If `intr_flag' is @code{1}, acquiring the lock may be interrupted by a signal,
in which case this function returns @ref{5581,,PY_LOCK_INTR}. Upon
interruption, it’s generally expected that the caller makes a call to
@ref{5173,,Py_MakePendingCalls()} to propagate an exception to Python code.

If the lock is successfully acquired, this function returns
@ref{5580,,PY_LOCK_ACQUIRED}.

The caller does not need to hold an @ref{4f10,,attached thread state}.
@end deffn

@geindex PyThread_acquire_lock (C function)
@anchor{c-api/synchronization c PyThread_acquire_lock}@anchor{5105}
@deffn {C 함수} int PyThread_acquire_lock (PyThread_type_lock lock, int waitflag)
` Part of the @ref{774,,안정 ABI}.'
Acquire `lock'.

If `waitflag' is @code{1} and another thread currently holds the lock, this
function will wait until the lock can be acquired and will always return
@code{1}.

If `waitflag' is @code{0} and another thread holds the lock, this function will
not wait and instead return @code{0}. If the lock is not held by any other
thread, then this function will acquire it and return @code{1}.

Unlike @ref{5106,,PyThread_acquire_lock_timed()}, acquiring the lock cannot be
interrupted by a signal.

The caller does not need to hold an @ref{4f10,,attached thread state}.
@end deffn

@geindex PyThread_release_lock (C function)
@anchor{c-api/synchronization c PyThread_release_lock}@anchor{510d}
@deffn {C 함수} int PyThread_release_lock (PyThread_type_lock lock)
` Part of the @ref{774,,안정 ABI}.'
Release `lock'. If `lock' is not held, then this function issues a
fatal error.

The caller does not need to hold an @ref{4f10,,attached thread state}.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Thread-local storage support,Multiple interpreters in a Python process,Synchronization primitives,Python/C API reference manual
@anchor{c-api/tls doc}@anchor{5582}@anchor{c-api/tls thread-local-storage}@anchor{5583}@anchor{c-api/tls thread-local-storage-support}@anchor{5584}@anchor{c-api/tls translation-repo}@anchor{5585}
@section Thread-local storage support


The Python interpreter provides low-level support for thread-local storage
(TLS) which wraps the underlying native TLS implementation to support the
Python-level thread-local storage API (@ref{1862,,threading.local}).  The
CPython C level APIs are similar to those offered by pthreads and Windows:
use a thread key and functions to associate a void* value per
thread.

A @ref{1848,,thread state} does `not' need to be @ref{4f10,,attached}
when calling these functions; they supply their own locking.

Note that @code{Python.h} does not include the declaration of the TLS APIs,
you need to include @code{pythread.h} to use thread-local storage.

@cartouche
@quotation 참고 
None of these API functions handle memory management on behalf of the
void* values.  You need to allocate and deallocate them yourself.
If the void* values happen to be @ref{5dc,,PyObject}*, these
functions don’t do refcount operations on them either.
@end quotation
@end cartouche

@menu
* Thread-specific storage API:: 
* Dynamic allocation:: 
* Methods:: 
* Legacy APIs:: 

@end menu

@node Thread-specific storage API,Dynamic allocation,,Thread-local storage support
@anchor{c-api/tls id1}@anchor{5586}@anchor{c-api/tls thread-specific-storage-api}@anchor{cd4}
@subsection Thread-specific storage API


The thread-specific storage (TSS) API was introduced to supersede the use of the existing TLS API within the
CPython interpreter.  This API uses a new type @ref{cd5,,Py_tss_t} instead of
int to represent thread keys.


Added in version 3.7.



@subsubheading 더 보기


“A New C-API for Thread-Local Storage in CPython” (
@geindex Python 향상 제안; PEP 539
PEP 539@footnote{https://peps.python.org/pep-0539/})


@geindex Py_tss_t (C type)
@anchor{c-api/tls c Py_tss_t}@anchor{cd5}
@deffn {C 자료형} type Py_tss_t

This data structure represents the state of a thread key, the definition of
which may depend on the underlying TLS implementation, and it has an
internal field representing the key’s initialization state.  There are no
public members in this structure.

When @ref{774,,Py_LIMITED_API} is not defined, static allocation of
this type by @ref{5587,,Py_tss_NEEDS_INIT} is allowed.
@end deffn

@geindex Py_tss_NEEDS_INIT (C macro)
@anchor{c-api/tls c Py_tss_NEEDS_INIT}@anchor{5587}
@deffn {C 매크로} Py_tss_NEEDS_INIT

This macro expands to the initializer for @ref{cd5,,Py_tss_t} variables.
Note that this macro won’t be defined with @ref{774,,Py_LIMITED_API}.
@end deffn

@node Dynamic allocation,Methods,Thread-specific storage API,Thread-local storage support
@anchor{c-api/tls dynamic-allocation}@anchor{5588}
@subsection Dynamic allocation


Dynamic allocation of the @ref{cd5,,Py_tss_t}, required in extension modules
built with @ref{774,,Py_LIMITED_API}, where static allocation of this type
is not possible due to its implementation being opaque at build time.

@geindex PyThread_tss_alloc (C function)
@anchor{c-api/tls c PyThread_tss_alloc}@anchor{438}
@deffn {C 함수} @ref{cd5,,Py_tss_t} *PyThread_tss_alloc ()
` Part of the @ref{774,,안정 ABI} 버전 3.7 이후로.'
Return a value which is the same state as a value initialized with
@ref{5587,,Py_tss_NEEDS_INIT}, or @code{NULL} in the case of dynamic allocation
failure.
@end deffn

@geindex PyThread_tss_free (C function)
@anchor{c-api/tls c PyThread_tss_free}@anchor{43a}
@deffn {C 함수} void PyThread_tss_free (Py_tss_t *key)
` Part of the @ref{774,,안정 ABI} 버전 3.7 이후로.'
Free the given `key' allocated by @ref{438,,PyThread_tss_alloc()}, after
first calling @ref{440,,PyThread_tss_delete()} to ensure any associated
thread locals have been unassigned. This is a no-op if the `key'
argument is @code{NULL}.

@cartouche
@quotation 참고 
A freed key becomes a dangling pointer. You should reset the key to
@code{NULL}.
@end quotation
@end cartouche
@end deffn

@node Methods,Legacy APIs,Dynamic allocation,Thread-local storage support
@anchor{c-api/tls methods}@anchor{5589}
@subsection Methods


The parameter `key' of these functions must not be @code{NULL}.  Moreover, the
behaviors of @ref{43c,,PyThread_tss_set()} and @ref{43e,,PyThread_tss_get()} are
undefined if the given @ref{cd5,,Py_tss_t} has not been initialized by
@ref{510f,,PyThread_tss_create()}.

@geindex PyThread_tss_is_created (C function)
@anchor{c-api/tls c PyThread_tss_is_created}@anchor{5110}
@deffn {C 함수} int PyThread_tss_is_created (Py_tss_t *key)
` Part of the @ref{774,,안정 ABI} 버전 3.7 이후로.'
Return a non-zero value if the given @ref{cd5,,Py_tss_t} has been initialized
by @ref{510f,,PyThread_tss_create()}.
@end deffn

@geindex PyThread_tss_create (C function)
@anchor{c-api/tls c PyThread_tss_create}@anchor{510f}
@deffn {C 함수} int PyThread_tss_create (Py_tss_t *key)
` Part of the @ref{774,,안정 ABI} 버전 3.7 이후로.'
Return a zero value on successful initialization of a TSS key.  The behavior
is undefined if the value pointed to by the `key' argument is not
initialized by @ref{5587,,Py_tss_NEEDS_INIT}.  This function can be called
repeatedly on the same key – calling it on an already initialized key is a
no-op and immediately returns success.
@end deffn

@geindex PyThread_tss_delete (C function)
@anchor{c-api/tls c PyThread_tss_delete}@anchor{440}
@deffn {C 함수} void PyThread_tss_delete (Py_tss_t *key)
` Part of the @ref{774,,안정 ABI} 버전 3.7 이후로.'
Destroy a TSS key to forget the values associated with the key across all
threads, and change the key’s initialization state to uninitialized.  A
destroyed key is able to be initialized again by
@ref{510f,,PyThread_tss_create()}. This function can be called repeatedly on
the same key – calling it on an already destroyed key is a no-op.
@end deffn

@geindex PyThread_tss_set (C function)
@anchor{c-api/tls c PyThread_tss_set}@anchor{43c}
@deffn {C 함수} int PyThread_tss_set (Py_tss_t *key, void *value)
` Part of the @ref{774,,안정 ABI} 버전 3.7 이후로.'
Return a zero value to indicate successfully associating a void*
value with a TSS key in the current thread.  Each thread has a distinct
mapping of the key to a void* value.
@end deffn

@geindex PyThread_tss_get (C function)
@anchor{c-api/tls c PyThread_tss_get}@anchor{43e}
@deffn {C 함수} void *PyThread_tss_get (Py_tss_t *key)
` Part of the @ref{774,,안정 ABI} 버전 3.7 이후로.'
Return the void* value associated with a TSS key in the current
thread.  This returns @code{NULL} if no value is associated with the key in the
current thread.
@end deffn

@node Legacy APIs,,Methods,Thread-local storage support
@anchor{c-api/tls legacy-apis}@anchor{558a}@anchor{c-api/tls thread-local-storage-api}@anchor{cd3}
@subsection Legacy APIs



버전 3.7부터 폐지됨: This API is superseded by the
@ref{cd4,,thread-specific storage (TSS) API}.


@cartouche
@quotation 참고 
This version of the API does not support platforms where the native TLS key
is defined in a way that cannot be safely cast to @code{int}.  On such platforms,
@ref{437,,PyThread_create_key()} will return immediately with a failure status,
and the other TLS functions will all be no-ops on such platforms.
@end quotation
@end cartouche

Due to the compatibility problem noted above, this version of the API should not
be used in new code.

@geindex PyThread_create_key (C function)
@anchor{c-api/tls c PyThread_create_key}@anchor{437}
@deffn {C 함수} int PyThread_create_key ()
` Part of the @ref{774,,안정 ABI}.'
@end deffn

@geindex PyThread_delete_key (C function)
@anchor{c-api/tls c PyThread_delete_key}@anchor{439}
@deffn {C 함수} void PyThread_delete_key (int key)
` Part of the @ref{774,,안정 ABI}.'
@end deffn

@geindex PyThread_set_key_value (C function)
@anchor{c-api/tls c PyThread_set_key_value}@anchor{43b}
@deffn {C 함수} int PyThread_set_key_value (int key, void *value)
` Part of the @ref{774,,안정 ABI}.'
@end deffn

@geindex PyThread_get_key_value (C function)
@anchor{c-api/tls c PyThread_get_key_value}@anchor{43d}
@deffn {C 함수} void *PyThread_get_key_value (int key)
` Part of the @ref{774,,안정 ABI}.'
@end deffn

@geindex PyThread_delete_key_value (C function)
@anchor{c-api/tls c PyThread_delete_key_value}@anchor{43f}
@deffn {C 함수} void PyThread_delete_key_value (int key)
` Part of the @ref{774,,안정 ABI}.'
@end deffn

@geindex PyThread_ReInitTLS (C function)
@anchor{c-api/tls c PyThread_ReInitTLS}@anchor{441}
@deffn {C 함수} void PyThread_ReInitTLS ()
` Part of the @ref{774,,안정 ABI}.'
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Multiple interpreters in a Python process,Profiling and tracing,Thread-local storage support,Python/C API reference manual
@anchor{c-api/subinterpreters doc}@anchor{558b}@anchor{c-api/subinterpreters multiple-interpreters-in-a-python-process}@anchor{558c}@anchor{c-api/subinterpreters sub-interpreter-support}@anchor{163}@anchor{c-api/subinterpreters translation-repo}@anchor{558d}
@section Multiple interpreters in a Python process


While in most uses, you will only embed a single Python interpreter, there
are cases where you need to create several independent interpreters in the
same process and perhaps even in the same thread. Sub-interpreters allow
you to do that.

The “main” interpreter is the first one created when the runtime initializes.
It is usually the only Python interpreter in a process.  Unlike sub-interpreters,
the main interpreter has unique process-global responsibilities like signal
handling.  It is also responsible for execution during runtime initialization and
is usually the active interpreter during runtime finalization.  The
@ref{558e,,PyInterpreterState_Main()} function returns a pointer to its state.

You can switch between sub-interpreters using the @ref{5103,,PyThreadState_Swap()}
function. You can create and destroy them using the following functions:

@geindex PyInterpreterConfig (C type)
@anchor{c-api/subinterpreters c PyInterpreterConfig}@anchor{78d}
@deffn {C 자료형} type PyInterpreterConfig

Structure containing most parameters to configure a sub-interpreter.
Its values are used only in @ref{688,,Py_NewInterpreterFromConfig()} and
never modified by the runtime.


Added in version 3.12.


Structure fields:

@geindex PyInterpreterConfig.use_main_obmalloc (C member)
@anchor{c-api/subinterpreters c PyInterpreterConfig use_main_obmalloc}@anchor{4956}
@deffn {C 멤버 변수} int use_main_obmalloc

If this is @code{0} then the sub-interpreter will use its own
“object” allocator state.
Otherwise it will use (share) the main interpreter’s.

If this is @code{0} then
@ref{558f,,check_multi_interp_extensions}
must be @code{1} (non-zero).
If this is @code{1} then @ref{5590,,gil}
must not be @ref{5591,,PyInterpreterConfig_OWN_GIL}.
@end deffn

@geindex PyInterpreterConfig.allow_fork (C member)
@anchor{c-api/subinterpreters c PyInterpreterConfig allow_fork}@anchor{5592}
@deffn {C 멤버 변수} int allow_fork

If this is @code{0} then the runtime will not support forking the
process in any thread where the sub-interpreter is currently active.
Otherwise fork is unrestricted.

Note that the @ref{dc,,subprocess} module still works
when fork is disallowed.
@end deffn

@geindex PyInterpreterConfig.allow_exec (C member)
@anchor{c-api/subinterpreters c PyInterpreterConfig allow_exec}@anchor{5593}
@deffn {C 멤버 변수} int allow_exec

If this is @code{0} then the runtime will not support replacing the
current process via exec (e.g. @ref{3040,,os.execv()}) in any thread
where the sub-interpreter is currently active.
Otherwise exec is unrestricted.

Note that the @ref{dc,,subprocess} module still works
when exec is disallowed.
@end deffn

@geindex PyInterpreterConfig.allow_threads (C member)
@anchor{c-api/subinterpreters c PyInterpreterConfig allow_threads}@anchor{5594}
@deffn {C 멤버 변수} int allow_threads

If this is @code{0} then the sub-interpreter’s @ref{f3,,threading} module
won’t create threads.
Otherwise threads are allowed.
@end deffn

@geindex PyInterpreterConfig.allow_daemon_threads (C member)
@anchor{c-api/subinterpreters c PyInterpreterConfig allow_daemon_threads}@anchor{5595}
@deffn {C 멤버 변수} int allow_daemon_threads

If this is @code{0} then the sub-interpreter’s @ref{f3,,threading} module
won’t create daemon threads.
Otherwise daemon threads are allowed (as long as
@ref{5594,,allow_threads} is non-zero).
@end deffn

@geindex PyInterpreterConfig.check_multi_interp_extensions (C member)
@anchor{c-api/subinterpreters c PyInterpreterConfig check_multi_interp_extensions}@anchor{558f}
@deffn {C 멤버 변수} int check_multi_interp_extensions

If this is @code{0} then all extension modules may be imported,
including legacy (single-phase init) modules,
in any thread where the sub-interpreter is currently active.
Otherwise only multi-phase init extension modules
(see 
@geindex Python 향상 제안; PEP 489
PEP 489@footnote{https://peps.python.org/pep-0489/}) may be imported.
(Also see @ref{5191,,Py_mod_multiple_interpreters}.)

This must be @code{1} (non-zero) if
@ref{4956,,use_main_obmalloc} is @code{0}.
@end deffn

@geindex PyInterpreterConfig.gil (C member)
@anchor{c-api/subinterpreters c PyInterpreterConfig gil}@anchor{5590}
@deffn {C 멤버 변수} int gil

This determines the operation of the GIL for the sub-interpreter.
It may be one of the following:

@geindex PyInterpreterConfig_DEFAULT_GIL (C macro)
@anchor{c-api/subinterpreters c PyInterpreterConfig_DEFAULT_GIL}@anchor{5596}
@deffn {C 매크로} PyInterpreterConfig_DEFAULT_GIL

Use the default selection (@ref{5597,,PyInterpreterConfig_SHARED_GIL}).
@end deffn

@geindex PyInterpreterConfig_SHARED_GIL (C macro)
@anchor{c-api/subinterpreters c PyInterpreterConfig_SHARED_GIL}@anchor{5597}
@deffn {C 매크로} PyInterpreterConfig_SHARED_GIL

Use (share) the main interpreter’s GIL.
@end deffn

@geindex PyInterpreterConfig_OWN_GIL (C macro)
@anchor{c-api/subinterpreters c PyInterpreterConfig_OWN_GIL}@anchor{5591}
@deffn {C 매크로} PyInterpreterConfig_OWN_GIL

Use the sub-interpreter’s own GIL.
@end deffn

If this is @ref{5591,,PyInterpreterConfig_OWN_GIL} then
@ref{4956,,PyInterpreterConfig.use_main_obmalloc} must be @code{0}.
@end deffn
@end deffn

@geindex Py_NewInterpreterFromConfig (C function)
@anchor{c-api/subinterpreters c Py_NewInterpreterFromConfig}@anchor{688}
@deffn {C 함수} @ref{ba3,,PyStatus} Py_NewInterpreterFromConfig (PyThreadState **tstate_p, const PyInterpreterConfig *config)

@geindex module; builtins
@geindex module; __main__
@geindex module; sys
@geindex stdout (in module sys)
@geindex stderr (in module sys)
@geindex stdin (in module sys)

Create a new sub-interpreter.  This is an (almost) totally separate environment
for the execution of Python code.  In particular, the new interpreter has
separate, independent versions of all imported modules, including the
fundamental modules @ref{13,,builtins}, @ref{1,,__main__} and @ref{df,,sys}.  The
table of loaded modules (@code{sys.modules}) and the module search path
(@code{sys.path}) are also separate.  The new environment has no @code{sys.argv}
variable.  It has new standard I/O stream file objects @code{sys.stdin},
@code{sys.stdout} and @code{sys.stderr} (however these refer to the same underlying
file descriptors).

The given `config' controls the options with which the interpreter
is initialized.

Upon success, `tstate_p' will be set to the first @ref{1848,,thread state}
created in the new sub-interpreter.  This thread state is
@ref{4f10,,attached}.
Note that no actual thread is created; see the discussion of thread states
below.  If creation of the new interpreter is unsuccessful,
`tstate_p' is set to @code{NULL};
no exception is set since the exception state is stored in the
attached thread state, which might not exist.

Like all other Python/C API functions, an @ref{4f10,,attached thread state}
must be present before calling this function, but it might be detached upon
returning. On success, the returned thread state will be attached.
If the sub-interpreter is created with its own @ref{164,,GIL} then the
attached thread state of the calling interpreter will be detached.
When the function returns, the new interpreter’s @ref{1848,,thread state}
will be attached to the current thread and
the previous interpreter’s attached thread state will remain detached.


Added in version 3.12.


Sub-interpreters are most effective when isolated from each other,
with certain functionality restricted:

@example
PyInterpreterConfig config = @{
    .use_main_obmalloc = 0,
    .allow_fork = 0,
    .allow_exec = 0,
    .allow_threads = 1,
    .allow_daemon_threads = 0,
    .check_multi_interp_extensions = 1,
    .gil = PyInterpreterConfig_OWN_GIL,
@};
PyThreadState *tstate = NULL;
PyStatus status = Py_NewInterpreterFromConfig(&tstate, &config);
if (PyStatus_Exception(status)) @{
    Py_ExitStatusException(status);
@}
@end example

Note that the config is used only briefly and does not get modified.
During initialization the config’s values are converted into various
@ref{aba,,PyInterpreterState} values.  A read-only copy of the config
may be stored internally on the @code{PyInterpreterState}.

@geindex Py_FinalizeEx (C function)
@geindex Py_Initialize (C function)

Extension modules are shared between (sub-)interpreters as follows:


@itemize *

@item 
For modules using multi-phase initialization,
e.g. @ref{10b2,,PyModule_FromDefAndSpec()}, a separate module object is
created and initialized for each interpreter.
Only C-level static and global variables are shared between these
module objects.

@item 
For modules using legacy
@ref{524d,,single-phase initialization},
e.g. @ref{5256,,PyModule_Create()}, the first time a particular extension
is imported, it is initialized normally, and a (shallow) copy of its
module’s dictionary is squirreled away.
When the same extension is imported by another (sub-)interpreter, a new
module is initialized and filled with the contents of this copy; the
extension’s @code{init} function is not called.
Objects in the module’s dictionary thus end up shared across
(sub-)interpreters, which might cause unwanted behavior (see
@ref{5598,,Bugs and caveats} below).

Note that this is different from what happens when an extension is
imported after the interpreter has been completely re-initialized by
calling @ref{f10,,Py_FinalizeEx()} and @ref{460,,Py_Initialize()}; in that
case, the extension’s @code{initmodule} function `is' called again.
As with multi-phase initialization, this means that only C-level static
and global variables are shared between these modules.
@end itemize

@geindex close (in module os)
@end deffn

@geindex Py_NewInterpreter (C function)
@anchor{c-api/subinterpreters c Py_NewInterpreter}@anchor{1b2f}
@deffn {C 함수} @ref{98f,,PyThreadState} *Py_NewInterpreter (void)
` Part of the @ref{774,,안정 ABI}.'
@geindex module; builtins
@geindex module; __main__
@geindex module; sys
@geindex stdout (in module sys)
@geindex stderr (in module sys)
@geindex stdin (in module sys)

Create a new sub-interpreter.  This is essentially just a wrapper
around @ref{688,,Py_NewInterpreterFromConfig()} with a config that
preserves the existing behavior.  The result is an unisolated
sub-interpreter that shares the main interpreter’s GIL, allows
fork/exec, allows daemon threads, and allows single-phase init
modules.
@end deffn

@geindex Py_EndInterpreter (C function)
@anchor{c-api/subinterpreters c Py_EndInterpreter}@anchor{1847}
@deffn {C 함수} void Py_EndInterpreter (PyThreadState *tstate)
` Part of the @ref{774,,안정 ABI}.'
@geindex Py_FinalizeEx (C function)

Destroy the (sub-)interpreter represented by the given @ref{1848,,thread state}.
The given thread state must be @ref{4f10,,attached}.
When the call returns, there will be no attached thread state.
All thread states associated with this interpreter are destroyed.

@ref{f10,,Py_FinalizeEx()} will destroy all sub-interpreters that
haven’t been explicitly destroyed at that point.
@end deffn

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

@end menu

@node A per-interpreter GIL,Bugs and caveats,,Multiple interpreters in a Python process
@anchor{c-api/subinterpreters a-per-interpreter-gil}@anchor{5599}@anchor{c-api/subinterpreters per-interpreter-gil}@anchor{559a}
@subsection A per-interpreter GIL



Added in version 3.12.


Using @ref{688,,Py_NewInterpreterFromConfig()} you can create
a sub-interpreter that is completely isolated from other interpreters,
including having its own GIL.  The most important benefit of this
isolation is that such an interpreter can execute Python code without
being blocked by other interpreters or blocking any others.  Thus a
single Python process can truly take advantage of multiple CPU cores
when running Python code.  The isolation also encourages a different
approach to concurrency than that of just using threads.
(See 
@geindex Python 향상 제안; PEP 554
PEP 554@footnote{https://peps.python.org/pep-0554/} and 
@geindex Python 향상 제안; PEP 684
PEP 684@footnote{https://peps.python.org/pep-0684/}.)

Using an isolated interpreter requires vigilance in preserving that
isolation.  That especially means not sharing any objects or mutable
state without guarantees about thread-safety.  Even objects that are
otherwise immutable (e.g. @code{None}, @code{(1, 5)}) can’t normally be shared
because of the refcount.  One simple but less-efficient approach around
this is to use a global lock around all use of some state (or object).
Alternately, effectively immutable objects (like integers or strings)
can be made safe in spite of their refcounts by making them @ref{290,,immortal}.
In fact, this has been done for the builtin singletons, small integers,
and a number of other builtin objects.

If you preserve isolation then you will have access to proper multi-core
computing without the complications that come with free-threading.
Failure to preserve isolation will expose you to the full consequences
of free-threading, including races and hard-to-debug crashes.

Aside from that, one of the main challenges of using multiple isolated
interpreters is how to communicate between them safely (not break
isolation) and efficiently.  The runtime and stdlib do not provide
any standard approach to this yet.  A future stdlib module would help
mitigate the effort of preserving isolation and expose effective tools
for communicating (and sharing) data between interpreters.

@node Bugs and caveats,High-level APIs<2>,A per-interpreter GIL,Multiple interpreters in a Python process
@anchor{c-api/subinterpreters bugs-and-caveats}@anchor{5598}
@subsection Bugs and caveats


Because sub-interpreters (and the main interpreter) are part of the same
process, the insulation between them isn’t perfect — for example, using
low-level file operations like @ref{d6a,,os.close()} they can
(accidentally or maliciously) affect each other’s open files.  Because of the
way extensions are shared between (sub-)interpreters, some extensions may not
work properly; this is especially likely when using single-phase initialization
or (static) global variables.
It is possible to insert objects created in one sub-interpreter into
a namespace of another (sub-)interpreter; this should be avoided if possible.

Special care should be taken to avoid sharing user-defined functions,
methods, instances or classes between sub-interpreters, since import
operations executed by such objects may affect the wrong (sub-)interpreter’s
dictionary of loaded modules. It is equally important to avoid sharing
objects from which the above are reachable.

Also note that combining this functionality with @code{PyGILState_*} APIs
is delicate, because these APIs assume a bijection between Python thread states
and OS-level threads, an assumption broken by the presence of sub-interpreters.
It is highly recommended that you don’t switch sub-interpreters between a pair
of matching @ref{648,,PyGILState_Ensure()} and @ref{649,,PyGILState_Release()} calls.
Furthermore, extensions (such as @ref{2e,,ctypes}) using these APIs to allow calling
of Python code from non-Python created threads will probably be broken when using
sub-interpreters.

@node High-level APIs<2>,Low-level APIs<2>,Bugs and caveats,Multiple interpreters in a Python process
@anchor{c-api/subinterpreters high-level-apis}@anchor{559b}
@subsection High-level APIs


@geindex PyInterpreterState (C type)
@anchor{c-api/subinterpreters c PyInterpreterState}@anchor{aba}
@deffn {C 자료형} type PyInterpreterState
` Part of the @ref{774,,제한된 API} (as an opaque struct).'
This data structure represents the state shared by a number of cooperating
threads.  Threads belonging to the same interpreter share their module
administration and a few other internal items. There are no public members in
this structure.

Threads belonging to different interpreters initially share nothing, except
process state like available memory, open file descriptors and such.  The global
interpreter lock is also shared by all threads, regardless of to which
interpreter they belong.


버전 3.12에서 변경: 
@geindex Python 향상 제안; PEP 684
PEP 684@footnote{https://peps.python.org/pep-0684/} introduced the possibility
of a @ref{559a,,per-interpreter GIL}.
See @ref{688,,Py_NewInterpreterFromConfig()}.

@end deffn

@geindex PyInterpreterState_Get (C function)
@anchor{c-api/subinterpreters c PyInterpreterState_Get}@anchor{64a}
@deffn {C 함수} @ref{aba,,PyInterpreterState} *PyInterpreterState_Get (void)
` Part of the @ref{774,,안정 ABI} 버전 3.9 이후로.'
Get the current interpreter.

Issue a fatal error if there is no @ref{4f10,,attached thread state}.
It cannot return NULL.


Added in version 3.9.

@end deffn

@geindex PyInterpreterState_GetID (C function)
@anchor{c-api/subinterpreters c PyInterpreterState_GetID}@anchor{dbe}
@deffn {C 함수} int64_t PyInterpreterState_GetID (PyInterpreterState *interp)
` Part of the @ref{774,,안정 ABI} 버전 3.7 이후로.'
Return the interpreter’s unique ID.  If there was any error in doing
so then @code{-1} is returned and an error is set.

The caller must have an @ref{4f10,,attached thread state}.


Added in version 3.7.

@end deffn

@geindex PyInterpreterState_GetDict (C function)
@anchor{c-api/subinterpreters c PyInterpreterState_GetDict}@anchor{507b}
@deffn {C 함수} @ref{5dc,,PyObject} *PyInterpreterState_GetDict (PyInterpreterState *interp)
`반환값: 빌린 참조.'` Part of the @ref{774,,안정 ABI} 버전 3.8 이후로.'
Return a dictionary in which interpreter-specific data may be stored.
If this function returns @code{NULL} then no exception has been raised and
the caller should assume no interpreter-specific dict is available.

This is not a replacement for @ref{b76,,PyModule_GetState()}, which
extensions should use to store interpreter-specific state information.

The returned dictionary is borrowed from the interpreter and is valid until
interpreter shutdown.


Added in version 3.8.

@end deffn

@geindex _PyFrameEvalFunction (C type)
@anchor{c-api/subinterpreters c _PyFrameEvalFunction}@anchor{979}
@deffn {C 자료형} typedef @ref{5dc,,PyObject} *(*_PyFrameEvalFunction)(@ref{98f,,PyThreadState} *tstate, @ref{196f,,_PyInterpreterFrame} *frame, int throwflag)

Type of a frame evaluation function.

The `throwflag' parameter is used by the @code{throw()} method of generators:
if non-zero, handle the current exception.


버전 3.9에서 변경: The function now takes a `tstate' parameter.



버전 3.11에서 변경: The `frame' parameter changed from @code{PyFrameObject*} to @code{_PyInterpreterFrame*}.

@end deffn

@geindex _PyInterpreterState_GetEvalFrameFunc (C function)
@anchor{c-api/subinterpreters c _PyInterpreterState_GetEvalFrameFunc}@anchor{1d75}
@deffn {C 함수} @ref{979,,_PyFrameEvalFunction} _PyInterpreterState_GetEvalFrameFunc (PyInterpreterState *interp)

Get the frame evaluation function.

See the 
@geindex Python 향상 제안; PEP 523
PEP 523@footnote{https://peps.python.org/pep-0523/} “Adding a frame evaluation API to CPython”.


Added in version 3.9.

@end deffn

@geindex _PyInterpreterState_SetEvalFrameFunc (C function)
@anchor{c-api/subinterpreters c _PyInterpreterState_SetEvalFrameFunc}@anchor{1d76}
@deffn {C 함수} void _PyInterpreterState_SetEvalFrameFunc (PyInterpreterState *interp, _PyFrameEvalFunction eval_frame)

Set the frame evaluation function.

See the 
@geindex Python 향상 제안; PEP 523
PEP 523@footnote{https://peps.python.org/pep-0523/} “Adding a frame evaluation API to CPython”.


Added in version 3.9.

@end deffn

@node Low-level APIs<2>,Advanced debugger support,High-level APIs<2>,Multiple interpreters in a Python process
@anchor{c-api/subinterpreters low-level-apis}@anchor{559c}
@subsection Low-level APIs


All of the following functions must be called after @ref{460,,Py_Initialize()}.


버전 3.7에서 변경: @ref{460,,Py_Initialize()} now initializes the @ref{164,,GIL}
and sets an @ref{4f10,,attached thread state}.


@geindex PyInterpreterState_New (C function)
@anchor{c-api/subinterpreters c PyInterpreterState_New}@anchor{4793}
@deffn {C 함수} @ref{aba,,PyInterpreterState} *PyInterpreterState_New ()
` Part of the @ref{774,,안정 ABI}.'
Create a new interpreter state object.  An @ref{4f10,,attached thread state} is not needed,
but may optionally exist if it is necessary to serialize calls to this
function.

Raises an @ref{1c6c,,auditing event} @code{cpython.PyInterpreterState_New} with no arguments.
@end deffn

@geindex PyInterpreterState_Clear (C function)
@anchor{c-api/subinterpreters c PyInterpreterState_Clear}@anchor{4792}
@deffn {C 함수} void PyInterpreterState_Clear (PyInterpreterState *interp)
` Part of the @ref{774,,안정 ABI}.'
Reset all information in an interpreter state object.  There must be
an @ref{4f10,,attached thread state} for the interpreter.

Raises an @ref{1c6c,,auditing event} @code{cpython.PyInterpreterState_Clear} with no arguments.
@end deffn

@geindex PyInterpreterState_Delete (C function)
@anchor{c-api/subinterpreters c PyInterpreterState_Delete}@anchor{507a}
@deffn {C 함수} void PyInterpreterState_Delete (PyInterpreterState *interp)
` Part of the @ref{774,,안정 ABI}.'
Destroy an interpreter state object.  There `should not' be an
@ref{4f10,,attached thread state} for the target interpreter. The interpreter
state must have been reset with a previous call to @ref{4792,,PyInterpreterState_Clear()}.
@end deffn

@node Advanced debugger support,,Low-level APIs<2>,Multiple interpreters in a Python process
@anchor{c-api/subinterpreters advanced-debugger-support}@anchor{559d}@anchor{c-api/subinterpreters advanced-debugging}@anchor{559e}
@subsection Advanced debugger support


These functions are only intended to be used by advanced debugging tools.

@geindex PyInterpreterState_Head (C function)
@anchor{c-api/subinterpreters c PyInterpreterState_Head}@anchor{1704}
@deffn {C 함수} @ref{aba,,PyInterpreterState} *PyInterpreterState_Head ()

Return the interpreter state object at the head of the list of all such objects.
@end deffn

@geindex PyInterpreterState_Main (C function)
@anchor{c-api/subinterpreters c PyInterpreterState_Main}@anchor{558e}
@deffn {C 함수} @ref{aba,,PyInterpreterState} *PyInterpreterState_Main ()

Return the main interpreter state object.
@end deffn

@geindex PyInterpreterState_Next (C function)
@anchor{c-api/subinterpreters c PyInterpreterState_Next}@anchor{1705}
@deffn {C 함수} @ref{aba,,PyInterpreterState} *PyInterpreterState_Next (PyInterpreterState *interp)

Return the next interpreter state object after `interp' from the list of all
such objects.
@end deffn

@geindex PyInterpreterState_ThreadHead (C function)
@anchor{c-api/subinterpreters c PyInterpreterState_ThreadHead}@anchor{1706}
@deffn {C 함수} @ref{98f,,PyThreadState} *PyInterpreterState_ThreadHead (PyInterpreterState *interp)

Return the pointer to the first @ref{98f,,PyThreadState} object in the list of
threads associated with the interpreter `interp'.
@end deffn

@geindex PyThreadState_Next (C function)
@anchor{c-api/subinterpreters c PyThreadState_Next}@anchor{1707}
@deffn {C 함수} @ref{98f,,PyThreadState} *PyThreadState_Next (PyThreadState *tstate)

Return the next thread state object after `tstate' from the list of all such
objects belonging to the same @ref{aba,,PyInterpreterState} object.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Profiling and tracing,Reference tracing,Multiple interpreters in a Python process,Python/C API reference manual
@anchor{c-api/profiling doc}@anchor{559f}@anchor{c-api/profiling profiling}@anchor{55a0}@anchor{c-api/profiling profiling-and-tracing}@anchor{55a1}@anchor{c-api/profiling translation-repo}@anchor{55a2}
@section Profiling and tracing


The Python interpreter provides some low-level support for attaching profiling
and execution tracing facilities.  These are used for profiling, debugging, and
coverage analysis tools.

This C interface allows the profiling or tracing code to avoid the overhead of
calling through Python-level callable objects, making a direct C function call
instead.  The essential attributes of the facility have not changed; the
interface allows trace functions to be installed per-thread, and the basic
events reported to the trace function are the same as had been reported to the
Python-level trace functions in previous versions.

@geindex Py_tracefunc (C type)
@anchor{c-api/profiling c Py_tracefunc}@anchor{55a3}
@deffn {C 자료형} typedef int (*Py_tracefunc)(@ref{5dc,,PyObject} *obj, @ref{98b,,PyFrameObject} *frame, int what, @ref{5dc,,PyObject} *arg)

The type of the trace function registered using @ref{1702,,PyEval_SetProfile()} and
@ref{661,,PyEval_SetTrace()}. The first parameter is the object passed to the
registration function as `obj', `frame' is the frame object to which the event
pertains, `what' is one of the constants @ref{55a4,,PyTrace_CALL},
@ref{55a5,,PyTrace_EXCEPTION}, @ref{55a6,,PyTrace_LINE}, @ref{55a7,,PyTrace_RETURN},
@ref{55a8,,PyTrace_C_CALL}, @ref{55a9,,PyTrace_C_EXCEPTION}, @ref{55aa,,PyTrace_C_RETURN},
or @ref{55ab,,PyTrace_OPCODE}, and `arg' depends on the value of `what':


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Value of `what'

@tab

Meaning of `arg'

@item

@ref{55a4,,PyTrace_CALL}

@tab

Always @ref{4ede,,Py_None}.

@item

@ref{55a5,,PyTrace_EXCEPTION}

@tab

Exception information as returned by
@ref{899,,sys.exc_info()}.

@item

@ref{55a6,,PyTrace_LINE}

@tab

Always @ref{4ede,,Py_None}.

@item

@ref{55a7,,PyTrace_RETURN}

@tab

Value being returned to the caller,
or @code{NULL} if caused by an exception.

@item

@ref{55a8,,PyTrace_C_CALL}

@tab

Function object being called.

@item

@ref{55a9,,PyTrace_C_EXCEPTION}

@tab

Function object being called.

@item

@ref{55aa,,PyTrace_C_RETURN}

@tab

Function object being called.

@item

@ref{55ab,,PyTrace_OPCODE}

@tab

Always @ref{4ede,,Py_None}.

@end multitable

@end deffn

@geindex PyTrace_CALL (C var)
@anchor{c-api/profiling c PyTrace_CALL}@anchor{55a4}
@deffn {C 변수} int PyTrace_CALL

The value of the `what' parameter to a @ref{55a3,,Py_tracefunc} function when a new
call to a function or method is being reported, or a new entry into a generator.
Note that the creation of the iterator for a generator function is not reported
as there is no control transfer to the Python bytecode in the corresponding
frame.
@end deffn

@geindex PyTrace_EXCEPTION (C var)
@anchor{c-api/profiling c PyTrace_EXCEPTION}@anchor{55a5}
@deffn {C 변수} int PyTrace_EXCEPTION

The value of the `what' parameter to a @ref{55a3,,Py_tracefunc} function when an
exception has been raised.  The callback function is called with this value for
`what' when after any bytecode is processed after which the exception becomes
set within the frame being executed.  The effect of this is that as exception
propagation causes the Python stack to unwind, the callback is called upon
return to each frame as the exception propagates.  Only trace functions receive
these events; they are not needed by the profiler.
@end deffn

@geindex PyTrace_LINE (C var)
@anchor{c-api/profiling c PyTrace_LINE}@anchor{55a6}
@deffn {C 변수} int PyTrace_LINE

The value passed as the `what' parameter to a @ref{55a3,,Py_tracefunc} function
(but not a profiling function) when a line-number event is being reported.
It may be disabled for a frame by setting @ref{dd5,,f_trace_lines} to
`0' on that frame.
@end deffn

@geindex PyTrace_RETURN (C var)
@anchor{c-api/profiling c PyTrace_RETURN}@anchor{55a7}
@deffn {C 변수} int PyTrace_RETURN

The value for the `what' parameter to @ref{55a3,,Py_tracefunc} functions when a
call is about to return.
@end deffn

@geindex PyTrace_C_CALL (C var)
@anchor{c-api/profiling c PyTrace_C_CALL}@anchor{55a8}
@deffn {C 변수} int PyTrace_C_CALL

The value for the `what' parameter to @ref{55a3,,Py_tracefunc} functions when a C
function is about to be called.
@end deffn

@geindex PyTrace_C_EXCEPTION (C var)
@anchor{c-api/profiling c PyTrace_C_EXCEPTION}@anchor{55a9}
@deffn {C 변수} int PyTrace_C_EXCEPTION

The value for the `what' parameter to @ref{55a3,,Py_tracefunc} functions when a C
function has raised an exception.
@end deffn

@geindex PyTrace_C_RETURN (C var)
@anchor{c-api/profiling c PyTrace_C_RETURN}@anchor{55aa}
@deffn {C 변수} int PyTrace_C_RETURN

The value for the `what' parameter to @ref{55a3,,Py_tracefunc} functions when a C
function has returned.
@end deffn

@geindex PyTrace_OPCODE (C var)
@anchor{c-api/profiling c PyTrace_OPCODE}@anchor{55ab}
@deffn {C 변수} int PyTrace_OPCODE

The value for the `what' parameter to @ref{55a3,,Py_tracefunc} functions (but not
profiling functions) when a new opcode is about to be executed.  This event is
not emitted by default: it must be explicitly requested by setting
@ref{dd6,,f_trace_opcodes} to `1' on the frame.
@end deffn

@geindex PyEval_SetProfile (C function)
@anchor{c-api/profiling c PyEval_SetProfile}@anchor{1702}
@deffn {C 함수} void PyEval_SetProfile (Py_tracefunc func, PyObject *obj)

Set the profiler function to `func'.  The `obj' parameter is passed to the
function as its first parameter, and may be any Python object, or @code{NULL}.  If
the profile function needs to maintain state, using a different value for `obj'
for each thread provides a convenient and thread-safe place to store it.  The
profile function is called for all monitored events except @ref{55a6,,PyTrace_LINE}
@ref{55ab,,PyTrace_OPCODE} and @ref{55a5,,PyTrace_EXCEPTION}.

See also the @ref{1703,,sys.setprofile()} function.

The caller must have an @ref{4f10,,attached thread state}.
@end deffn

@geindex PyEval_SetProfileAllThreads (C function)
@anchor{c-api/profiling c PyEval_SetProfileAllThreads}@anchor{780}
@deffn {C 함수} void PyEval_SetProfileAllThreads (Py_tracefunc func, PyObject *obj)

Like @ref{1702,,PyEval_SetProfile()} but sets the profile function in all running threads
belonging to the current interpreter instead of the setting it only on the current thread.

The caller must have an @ref{4f10,,attached thread state}.

As @ref{1702,,PyEval_SetProfile()}, this function ignores any exceptions raised while
setting the profile functions in all threads.
@end deffn


Added in version 3.12.


@geindex PyEval_SetTrace (C function)
@anchor{c-api/profiling c PyEval_SetTrace}@anchor{661}
@deffn {C 함수} void PyEval_SetTrace (Py_tracefunc func, PyObject *obj)

Set the tracing function to `func'.  This is similar to
@ref{1702,,PyEval_SetProfile()}, except the tracing function does receive line-number
events and per-opcode events, but does not receive any event related to C function
objects being called.  Any trace function registered using @ref{661,,PyEval_SetTrace()}
will not receive @ref{55a8,,PyTrace_C_CALL}, @ref{55a9,,PyTrace_C_EXCEPTION} or
@ref{55aa,,PyTrace_C_RETURN} as a value for the `what' parameter.

See also the @ref{2e1,,sys.settrace()} function.

The caller must have an @ref{4f10,,attached thread state}.
@end deffn

@geindex PyEval_SetTraceAllThreads (C function)
@anchor{c-api/profiling c PyEval_SetTraceAllThreads}@anchor{662}
@deffn {C 함수} void PyEval_SetTraceAllThreads (Py_tracefunc func, PyObject *obj)

Like @ref{661,,PyEval_SetTrace()} but sets the tracing function in all running threads
belonging to the current interpreter instead of the setting it only on the current thread.

The caller must have an @ref{4f10,,attached thread state}.

As @ref{661,,PyEval_SetTrace()}, this function ignores any exceptions raised while
setting the trace functions in all threads.
@end deffn


Added in version 3.12.


@node Reference tracing,파이썬 초기화 구성,Profiling and tracing,Python/C API reference manual
@anchor{c-api/profiling reference-tracing}@anchor{55ac}
@section Reference tracing



Added in version 3.13.


@geindex PyRefTracer (C type)
@anchor{c-api/profiling c PyRefTracer}@anchor{55ad}
@deffn {C 자료형} typedef int (*PyRefTracer)(@ref{5dc,,PyObject}*, int event, void *data)

The type of the trace function registered using @ref{60e,,PyRefTracer_SetTracer()}.
The first parameter is a Python object that has been just created (when `event'
is set to @ref{55ae,,PyRefTracer_CREATE}) or about to be destroyed (when `event'
is set to @ref{55af,,PyRefTracer_DESTROY}). The `data' argument is the opaque pointer
that was provided when @code{PyRefTracer_SetTracer()} was called.

If a new tracing function is registered replacing the current one, a call to the
trace function will be made with the object set to `NULL' and `event' set to
@ref{55b0,,PyRefTracer_TRACKER_REMOVED}. This will happen just before the new
function is registered.
@end deffn


Added in version 3.13.


@geindex PyRefTracer_CREATE (C var)
@anchor{c-api/profiling c PyRefTracer_CREATE}@anchor{55ae}
@deffn {C 변수} int PyRefTracer_CREATE

The value for the `event' parameter to @ref{55ad,,PyRefTracer} functions when a Python
object has been created.
@end deffn

@geindex PyRefTracer_DESTROY (C var)
@anchor{c-api/profiling c PyRefTracer_DESTROY}@anchor{55af}
@deffn {C 변수} int PyRefTracer_DESTROY

The value for the `event' parameter to @ref{55ad,,PyRefTracer} functions when a Python
object has been destroyed.
@end deffn

@geindex PyRefTracer_TRACKER_REMOVED (C var)
@anchor{c-api/profiling c PyRefTracer_TRACKER_REMOVED}@anchor{55b0}
@deffn {C 변수} int PyRefTracer_TRACKER_REMOVED

The value for the `event' parameter to @ref{55ad,,PyRefTracer} functions when the
current tracer is about to be replaced by a new one.


Added in version 3.14.

@end deffn

@geindex PyRefTracer_SetTracer (C function)
@anchor{c-api/profiling c PyRefTracer_SetTracer}@anchor{60e}
@deffn {C 함수} int PyRefTracer_SetTracer (PyRefTracer tracer, void *data)

Register a reference tracer function. The function will be called when a new
Python object has been created or when an object is going to be destroyed. If
`data' is provided it must be an opaque pointer that will be provided when
the tracer function is called. Return @code{0} on success. Set an exception and
return @code{-1} on error.

Note that tracer functions `must not' create Python objects inside or
otherwise the call will be re-entrant. The tracer also `must not' clear
any existing exception or set an exception.  A @ref{1848,,thread state} will be active
every time the tracer function is called.

There must be an @ref{4f10,,attached thread state} when calling this function.

If another tracer function was already registered, the old function will be
called with `event' set to @ref{55b0,,PyRefTracer_TRACKER_REMOVED} just before
the new function is registered.
@end deffn


Added in version 3.13.


@geindex PyRefTracer_GetTracer (C function)
@anchor{c-api/profiling c PyRefTracer_GetTracer}@anchor{60f}
@deffn {C 함수} @ref{55ad,,PyRefTracer} PyRefTracer_GetTracer (void **data)

Get the registered reference tracer function and the value of the opaque data
pointer that was registered when @ref{60e,,PyRefTracer_SetTracer()} was called.
If no tracer was registered this function will return NULL and will set the
`data' pointer to NULL.

There must be an @ref{4f10,,attached thread state} when calling this function.
@end deffn


Added in version 3.13.


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 파이썬 초기화 구성,메모리 관리,Reference tracing,Python/C API reference manual
@anchor{c-api/init_config doc}@anchor{55b1}@anchor{c-api/init_config init-config}@anchor{644}@anchor{c-api/init_config python-initialization-configuration}@anchor{55b2}@anchor{c-api/init_config translation-repo}@anchor{55b3}
@section 파이썬 초기화 구성


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

@end menu

@node PyInitConfig C API,Configuration Options,,파이썬 초기화 구성
@anchor{c-api/init_config pyinitconfig-api}@anchor{379}@anchor{c-api/init_config pyinitconfig-c-api}@anchor{55b4}
@subsection PyInitConfig C API



Added in version 3.14.


Python can be initialized with @ref{386,,Py_InitializeFromInitConfig()}.

The @ref{bbb,,Py_RunMain()} function can be used to write a customized Python
program.

@ref{554a,,초기화@comma{} 파이널리제이션 및 스레드}도 참조하십시오.


@subsubheading 더 보기


@geindex Python 향상 제안; PEP 741
PEP 741@footnote{https://peps.python.org/pep-0741/} “Python Configuration C API”.


@menu
* Example:: 
* Create Config:: 
* Error Handling:: 
* Get Options:: 
* Set Options:: 
* Module:: 
* Initialize Python:: 

@end menu

@node Example,Create Config,,PyInitConfig C API
@anchor{c-api/init_config example}@anchor{55b5}
@subsubsection Example


Example of customized Python always running with the @ref{507,,Python Development Mode} enabled; return @code{-1} on error:

@example
int init_python(void)
@{
    PyInitConfig *config = PyInitConfig_Create();
    if (config == NULL) @{
        printf("PYTHON INIT ERROR: memory allocation failed\n");
        return -1;
    @}

    // Enable the Python Development Mode
    if (PyInitConfig_SetInt(config, "dev_mode", 1) < 0) @{
        goto error;
    @}

    // Initialize Python with the configuration
    if (Py_InitializeFromInitConfig(config) < 0) @{
        goto error;
    @}
    PyInitConfig_Free(config);
    return 0;

error:
    @{
        // Display the error message.
        //
        // This uncommon braces style is used, because you cannot make
        // goto targets point to variable declarations.
        const char *err_msg;
        (void)PyInitConfig_GetError(config, &err_msg);
        printf("PYTHON INIT ERROR: %s\n", err_msg);
        PyInitConfig_Free(config);
        return -1;
    @}
@}
@end example

@node Create Config,Error Handling,Example,PyInitConfig C API
@anchor{c-api/init_config create-config}@anchor{55b6}
@subsubsection Create Config


@geindex PyInitConfig (C struct)
@anchor{c-api/init_config c PyInitConfig}@anchor{55b7}
@deffn {C 구조체} struct PyInitConfig

Opaque structure to configure the Python initialization.
@end deffn

@geindex PyInitConfig_Create (C function)
@anchor{c-api/init_config c PyInitConfig_Create}@anchor{387}
@deffn {C 함수} @ref{55b7,,PyInitConfig} *PyInitConfig_Create (void)

Create a new initialization configuration using @ref{55b8,,Isolated Configuration} default values.

It must be freed by @ref{388,,PyInitConfig_Free()}.

Return @code{NULL} on memory allocation failure.
@end deffn

@geindex PyInitConfig_Free (C function)
@anchor{c-api/init_config c PyInitConfig_Free}@anchor{388}
@deffn {C 함수} void PyInitConfig_Free (PyInitConfig *config)

Free memory of the initialization configuration `config'.

If `config' is @code{NULL}, no operation is performed.
@end deffn

@node Error Handling,Get Options,Create Config,PyInitConfig C API
@anchor{c-api/init_config error-handling}@anchor{55b9}
@subsubsection Error Handling


@geindex PyInitConfig_GetError (C function)
@anchor{c-api/init_config c PyInitConfig_GetError}@anchor{38a}
@deffn {C 함수} int PyInitConfig_GetError (PyInitConfig *config, const char **err_msg)

Get the `config' error message.


@itemize *

@item 
Set `*err_msg' and return @code{1} if an error is set.

@item 
Set `*err_msg' to @code{NULL} and return @code{0} otherwise.
@end itemize

An error message is a UTF-8 encoded string.

If `config' has an exit code, format the exit code as an error
message.

The error message remains valid until another @code{PyInitConfig}
function is called with `config'. The caller doesn’t have to free the
error message.
@end deffn

@geindex PyInitConfig_GetExitCode (C function)
@anchor{c-api/init_config c PyInitConfig_GetExitCode}@anchor{38b}
@deffn {C 함수} int PyInitConfig_GetExitCode (PyInitConfig *config, int *exitcode)

Get the `config' exit code.


@itemize *

@item 
Set `*exitcode' and return @code{1} if `config' has an exit code set.

@item 
Return @code{0} if `config' has no exit code set.
@end itemize

Only the @code{Py_InitializeFromInitConfig()} function can set an exit
code if the @code{parse_argv} option is non-zero.

An exit code can be set when parsing the command line failed (exit
code @code{2}) or when a command line option asks to display the command
line help (exit code @code{0}).
@end deffn

@node Get Options,Set Options,Error Handling,PyInitConfig C API
@anchor{c-api/init_config get-options}@anchor{55ba}
@subsubsection Get Options


The configuration option `name' parameter must be a non-NULL null-terminated
UTF-8 encoded string. See @ref{55bb,,Configuration Options}.

@geindex PyInitConfig_HasOption (C function)
@anchor{c-api/init_config c PyInitConfig_HasOption}@anchor{38f}
@deffn {C 함수} int PyInitConfig_HasOption (PyInitConfig *config, const char *name)

Test if the configuration has an option called `name'.

Return @code{1} if the option exists, or return @code{0} otherwise.
@end deffn

@geindex PyInitConfig_GetInt (C function)
@anchor{c-api/init_config c PyInitConfig_GetInt}@anchor{38c}
@deffn {C 함수} int PyInitConfig_GetInt (PyInitConfig *config, const char *name, int64_t *value)

Get an integer configuration option.


@itemize *

@item 
Set `*value', and return @code{0} on success.

@item 
Set an error in `config' and return @code{-1} on error.
@end itemize
@end deffn

@geindex PyInitConfig_GetStr (C function)
@anchor{c-api/init_config c PyInitConfig_GetStr}@anchor{38d}
@deffn {C 함수} int PyInitConfig_GetStr (PyInitConfig *config, const char *name, char **value)

Get a string configuration option as a null-terminated UTF-8
encoded string.


@itemize *

@item 
Set `*value', and return @code{0} on success.

@item 
Set an error in `config' and return @code{-1} on error.
@end itemize

`*value' can be set to @code{NULL} if the option is an optional string and the
option is unset.

On success, the string must be released with @code{free(value)} if it’s not
@code{NULL}.
@end deffn

@geindex PyInitConfig_GetStrList (C function)
@anchor{c-api/init_config c PyInitConfig_GetStrList}@anchor{38e}
@deffn {C 함수} int PyInitConfig_GetStrList (PyInitConfig *config, const char *name, size_t *length, char ***items)

Get a string list configuration option as an array of
null-terminated UTF-8 encoded strings.


@itemize *

@item 
Set `*length' and `*value', and return @code{0} on success.

@item 
Set an error in `config' and return @code{-1} on error.
@end itemize

On success, the string list must be released with
@code{PyInitConfig_FreeStrList(length, items)}.
@end deffn

@geindex PyInitConfig_FreeStrList (C function)
@anchor{c-api/init_config c PyInitConfig_FreeStrList}@anchor{389}
@deffn {C 함수} void PyInitConfig_FreeStrList (size_t length, char **items)

Free memory of a string list created by
@code{PyInitConfig_GetStrList()}.
@end deffn

@node Set Options,Module,Get Options,PyInitConfig C API
@anchor{c-api/init_config set-options}@anchor{55bc}
@subsubsection Set Options


The configuration option `name' parameter must be a non-NULL null-terminated
UTF-8 encoded string. See @ref{55bb,,Configuration Options}.

Some configuration options have side effects on other options. This logic is
only implemented when @code{Py_InitializeFromInitConfig()} is called, not by the
“Set” functions below. For example, setting @code{dev_mode} to @code{1} does not set
@code{faulthandler} to @code{1}.

@geindex PyInitConfig_SetInt (C function)
@anchor{c-api/init_config c PyInitConfig_SetInt}@anchor{390}
@deffn {C 함수} int PyInitConfig_SetInt (PyInitConfig *config, const char *name, int64_t value)

Set an integer configuration option.


@itemize *

@item 
Return @code{0} on success.

@item 
Set an error in `config' and return @code{-1} on error.
@end itemize
@end deffn

@geindex PyInitConfig_SetStr (C function)
@anchor{c-api/init_config c PyInitConfig_SetStr}@anchor{391}
@deffn {C 함수} int PyInitConfig_SetStr (PyInitConfig *config, const char *name, const char *value)

Set a string configuration option from a null-terminated UTF-8
encoded string. The string is copied.


@itemize *

@item 
Return @code{0} on success.

@item 
Set an error in `config' and return @code{-1} on error.
@end itemize
@end deffn

@geindex PyInitConfig_SetStrList (C function)
@anchor{c-api/init_config c PyInitConfig_SetStrList}@anchor{392}
@deffn {C 함수} int PyInitConfig_SetStrList (PyInitConfig *config, const char *name, size_t length, char *const *items)

Set a string list configuration option from an array of
null-terminated UTF-8 encoded strings. The string list is copied.


@itemize *

@item 
Return @code{0} on success.

@item 
Set an error in `config' and return @code{-1} on error.
@end itemize
@end deffn

@node Module,Initialize Python,Set Options,PyInitConfig C API
@anchor{c-api/init_config module}@anchor{55bd}
@subsubsection Module


@geindex PyInitConfig_AddModule (C function)
@anchor{c-api/init_config c PyInitConfig_AddModule}@anchor{37b}
@deffn {C 함수} int PyInitConfig_AddModule (PyInitConfig *config, const char *name, PyObject *(*initfunc)(void))

Add a built-in extension module to the table of built-in modules.

The new module can be imported by the name `name', and uses the function
`initfunc' as the initialization function called on the first attempted
import.


@itemize *

@item 
Return @code{0} on success.

@item 
Set an error in `config' and return @code{-1} on error.
@end itemize

If Python is initialized multiple times, @code{PyInitConfig_AddModule()} must
be called at each Python initialization.

Similar to the @ref{1b1a,,PyImport_AppendInittab()} function.
@end deffn

@node Initialize Python,,Module,PyInitConfig C API
@anchor{c-api/init_config initialize-python}@anchor{55be}
@subsubsection Initialize Python


@geindex Py_InitializeFromInitConfig (C function)
@anchor{c-api/init_config c Py_InitializeFromInitConfig}@anchor{386}
@deffn {C 함수} int Py_InitializeFromInitConfig (PyInitConfig *config)

Initialize Python from the initialization configuration.


@itemize *

@item 
Return @code{0} on success.

@item 
Set an error in `config' and return @code{-1} on error.

@item 
Set an exit code in `config' and return @code{-1} if Python wants to
exit.
@end itemize

See @code{PyInitConfig_GetExitcode()} for the exit code case.
@end deffn

@node Configuration Options,Runtime Python configuration API,PyInitConfig C API,파이썬 초기화 구성
@anchor{c-api/init_config configuration-options}@anchor{55bf}@anchor{c-api/init_config pyinitconfig-opts}@anchor{55bb}
@subsection Configuration Options



@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Option

@tab

PyConfig/PyPreConfig member

@tab

Type

@tab

Visibility

@item

@code{"allocator"}

@tab

@ref{55c0,,allocator}

@tab

@code{int}

@tab

Read-only

@item

@code{"argv"}

@tab

@ref{3f1,,argv}

@tab

@code{list[str]}

@tab

Public

@item

@code{"base_exec_prefix"}

@tab

@ref{55c1,,base_exec_prefix}

@tab

@code{str}

@tab

Public

@item

@code{"base_executable"}

@tab

@ref{55c2,,base_executable}

@tab

@code{str}

@tab

Public

@item

@code{"base_prefix"}

@tab

@ref{55c3,,base_prefix}

@tab

@code{str}

@tab

Public

@item

@code{"buffered_stdio"}

@tab

@ref{411,,buffered_stdio}

@tab

@code{bool}

@tab

Read-only

@item

@code{"bytes_warning"}

@tab

@ref{407,,bytes_warning}

@tab

@code{int}

@tab

Public

@item

@code{"check_hash_pycs_mode"}

@tab

@ref{55c4,,check_hash_pycs_mode}

@tab

@code{str}

@tab

Read-only

@item

@code{"code_debug_ranges"}

@tab

@ref{55c5,,code_debug_ranges}

@tab

@code{bool}

@tab

Read-only

@item

@code{"coerce_c_locale"}

@tab

@ref{55c6,,coerce_c_locale}

@tab

@code{bool}

@tab

Read-only

@item

@code{"coerce_c_locale_warn"}

@tab

@ref{55c7,,coerce_c_locale_warn}

@tab

@code{bool}

@tab

Read-only

@item

@code{"configure_c_stdio"}

@tab

@ref{55c8,,configure_c_stdio}

@tab

@code{bool}

@tab

Read-only

@item

@code{"configure_locale"}

@tab

@ref{55c9,,configure_locale}

@tab

@code{bool}

@tab

Read-only

@item

@code{"cpu_count"}

@tab

@ref{55ca,,cpu_count}

@tab

@code{int}

@tab

Public

@item

@code{"dev_mode"}

@tab

@ref{55cb,,dev_mode}

@tab

@code{bool}

@tab

Read-only

@item

@code{"dump_refs"}

@tab

@ref{55cc,,dump_refs}

@tab

@code{bool}

@tab

Read-only

@item

@code{"dump_refs_file"}

@tab

@ref{55cd,,dump_refs_file}

@tab

@code{str}

@tab

Read-only

@item

@code{"exec_prefix"}

@tab

@ref{55ce,,exec_prefix}

@tab

@code{str}

@tab

Public

@item

@code{"executable"}

@tab

@ref{643,,executable}

@tab

@code{str}

@tab

Public

@item

@code{"faulthandler"}

@tab

@ref{55cf,,faulthandler}

@tab

@code{bool}

@tab

Read-only

@item

@code{"filesystem_encoding"}

@tab

@ref{41b,,filesystem_encoding}

@tab

@code{str}

@tab

Read-only

@item

@code{"filesystem_errors"}

@tab

@ref{41c,,filesystem_errors}

@tab

@code{str}

@tab

Read-only

@item

@code{"hash_seed"}

@tab

@ref{414,,hash_seed}

@tab

@code{int}

@tab

Read-only

@item

@code{"home"}

@tab

@ref{3f3,,home}

@tab

@code{str}

@tab

Read-only

@item

@code{"import_time"}

@tab

@ref{55d0,,import_time}

@tab

@code{int}

@tab

Read-only

@item

@code{"inspect"}

@tab

@ref{401,,inspect}

@tab

@code{bool}

@tab

Public

@item

@code{"install_signal_handlers"}

@tab

@ref{abb,,install_signal_handlers}

@tab

@code{bool}

@tab

Read-only

@item

@code{"int_max_str_digits"}

@tab

@ref{55d1,,int_max_str_digits}

@tab

@code{int}

@tab

Public

@item

@code{"interactive"}

@tab

@ref{3ff,,interactive}

@tab

@code{bool}

@tab

Public

@item

@code{"isolated"}

@tab

@ref{416,,isolated}

@tab

@code{bool}

@tab

Read-only

@item

@code{"legacy_windows_fs_encoding"}

@tab

@ref{418,,legacy_windows_fs_encoding}

@tab

@code{bool}

@tab

Read-only

@item

@code{"legacy_windows_stdio"}

@tab

@ref{41a,,legacy_windows_stdio}

@tab

@code{bool}

@tab

Read-only

@item

@code{"malloc_stats"}

@tab

@ref{55d2,,malloc_stats}

@tab

@code{bool}

@tab

Read-only

@item

@code{"module_search_paths"}

@tab

@ref{641,,module_search_paths}

@tab

@code{list[str]}

@tab

Public

@item

@code{"optimization_level"}

@tab

@ref{403,,optimization_level}

@tab

@code{int}

@tab

Public

@item

@code{"orig_argv"}

@tab

@ref{a94,,orig_argv}

@tab

@code{list[str]}

@tab

Read-only

@item

@code{"parse_argv"}

@tab

@ref{1cee,,parse_argv}

@tab

@code{bool}

@tab

Read-only

@item

@code{"parser_debug"}

@tab

@ref{3f9,,parser_debug}

@tab

@code{bool}

@tab

Public

@item

@code{"pathconfig_warnings"}

@tab

@ref{409,,pathconfig_warnings}

@tab

@code{bool}

@tab

Read-only

@item

@code{"perf_profiling"}

@tab

@ref{55d3,,perf_profiling}

@tab

@code{bool}

@tab

Read-only

@item

@code{"platlibdir"}

@tab

@ref{1d1e,,platlibdir}

@tab

@code{str}

@tab

Public

@item

@code{"prefix"}

@tab

@ref{55d4,,prefix}

@tab

@code{str}

@tab

Public

@item

@code{"program_name"}

@tab

@ref{3f2,,program_name}

@tab

@code{str}

@tab

Read-only

@item

@code{"pycache_prefix"}

@tab

@ref{55d5,,pycache_prefix}

@tab

@code{str}

@tab

Public

@item

@code{"quiet"}

@tab

@ref{3fd,,quiet}

@tab

@code{bool}

@tab

Public

@item

@code{"run_command"}

@tab

@ref{5555,,run_command}

@tab

@code{str}

@tab

Read-only

@item

@code{"run_filename"}

@tab

@ref{5556,,run_filename}

@tab

@code{str}

@tab

Read-only

@item

@code{"run_module"}

@tab

@ref{5557,,run_module}

@tab

@code{str}

@tab

Read-only

@item

@code{"run_presite"}

@tab

@ref{55d6,,run_presite}

@tab

@code{str}

@tab

Read-only

@item

@code{"safe_path"}

@tab

@ref{976,,safe_path}

@tab

@code{bool}

@tab

Read-only

@item

@code{"show_ref_count"}

@tab

@ref{55d7,,show_ref_count}

@tab

@code{bool}

@tab

Read-only

@item

@code{"site_import"}

@tab

@ref{405,,site_import}

@tab

@code{bool}

@tab

Read-only

@item

@code{"skip_source_first_line"}

@tab

@ref{55d8,,skip_source_first_line}

@tab

@code{bool}

@tab

Read-only

@item

@code{"stdio_encoding"}

@tab

@ref{642,,stdio_encoding}

@tab

@code{str}

@tab

Read-only

@item

@code{"stdio_errors"}

@tab

@ref{4966,,stdio_errors}

@tab

@code{str}

@tab

Read-only

@item

@code{"stdlib_dir"}

@tab

@ref{55d9,,stdlib_dir}

@tab

@code{str}

@tab

Public

@item

@code{"tracemalloc"}

@tab

@ref{55da,,tracemalloc}

@tab

@code{int}

@tab

Read-only

@item

@code{"use_environment"}

@tab

@ref{40b,,use_environment}

@tab

@code{bool}

@tab

Public

@item

@code{"use_frozen_modules"}

@tab

@ref{55db,,use_frozen_modules}

@tab

@code{bool}

@tab

Read-only

@item

@code{"use_hash_seed"}

@tab

@ref{413,,use_hash_seed}

@tab

@code{bool}

@tab

Read-only

@item

@code{"use_system_logger"}

@tab

@ref{226e,,use_system_logger}

@tab

@code{bool}

@tab

Read-only

@item

@code{"user_site_directory"}

@tab

@ref{40f,,user_site_directory}

@tab

@code{bool}

@tab

Read-only

@item

@code{"utf8_mode"}

@tab

@ref{41d,,utf8_mode}

@tab

@code{bool}

@tab

Read-only

@item

@code{"verbose"}

@tab

@ref{3fb,,verbose}

@tab

@code{int}

@tab

Public

@item

@code{"warn_default_encoding"}

@tab

@ref{55dc,,warn_default_encoding}

@tab

@code{bool}

@tab

Read-only

@item

@code{"warnoptions"}

@tab

@ref{63f,,warnoptions}

@tab

@code{list[str]}

@tab

Public

@item

@code{"write_bytecode"}

@tab

@ref{40d,,write_bytecode}

@tab

@code{bool}

@tab

Public

@item

@code{"xoptions"}

@tab

@ref{640,,xoptions}

@tab

@code{dict[str, str]}

@tab

Public

@item

@code{"_pystats"}

@tab

@ref{55dd,,_pystats}

@tab

@code{bool}

@tab

Read-only

@end multitable


Visibility:


@itemize *

@item 
Public: Can be retrieved by @ref{37c,,PyConfig_Get()} and set by
@ref{37d,,PyConfig_Set()}.

@item 
Read-only: Can be retrieved by @ref{37c,,PyConfig_Get()}, but cannot be set by
@ref{37d,,PyConfig_Set()}.
@end itemize

@node Runtime Python configuration API,PyConfig C API,Configuration Options,파이썬 초기화 구성
@anchor{c-api/init_config runtime-python-configuration-api}@anchor{55de}
@subsection Runtime Python configuration API


At runtime, it’s possible to get and set configuration options using
@ref{37c,,PyConfig_Get()} and  @ref{37d,,PyConfig_Set()} functions.

The configuration option `name' parameter must be a non-NULL null-terminated
UTF-8 encoded string. See @ref{55bb,,Configuration Options}.

Some options are read from the @ref{df,,sys} attributes. For example, the option
@code{"argv"} is read from @ref{1469,,sys.argv}.

@geindex PyConfig_Get (C function)
@anchor{c-api/init_config c PyConfig_Get}@anchor{37c}
@deffn {C 함수} @ref{5dc,,PyObject} *PyConfig_Get (const char *name)

Get the current runtime value of a configuration option as a Python object.


@itemize *

@item 
Return a new reference on success.

@item 
Set an exception and return @code{NULL} on error.
@end itemize

The object type depends on the configuration option. It can be:


@itemize *

@item 
@code{bool}

@item 
@code{int}

@item 
@code{str}

@item 
@code{list[str]}

@item 
@code{dict[str, str]}
@end itemize

The caller must have an @ref{4f10,,attached thread state}. The function cannot
be called before Python initialization nor after Python finalization.


Added in version 3.14.

@end deffn

@geindex PyConfig_GetInt (C function)
@anchor{c-api/init_config c PyConfig_GetInt}@anchor{384}
@deffn {C 함수} int PyConfig_GetInt (const char *name, int *value)

Similar to @ref{37c,,PyConfig_Get()}, but get the value as a C int.


@itemize *

@item 
Return @code{0} on success.

@item 
Set an exception and return @code{-1} on error.
@end itemize


Added in version 3.14.

@end deffn

@geindex PyConfig_Names (C function)
@anchor{c-api/init_config c PyConfig_Names}@anchor{385}
@deffn {C 함수} @ref{5dc,,PyObject} *PyConfig_Names (void)

Get all configuration option names as a @code{frozenset}.


@itemize *

@item 
Return a new reference on success.

@item 
Set an exception and return @code{NULL} on error.
@end itemize

The caller must have an @ref{4f10,,attached thread state}. The function cannot
be called before Python initialization nor after Python finalization.


Added in version 3.14.

@end deffn

@geindex PyConfig_Set (C function)
@anchor{c-api/init_config c PyConfig_Set}@anchor{37d}
@deffn {C 함수} int PyConfig_Set (const char *name, PyObject *value)

Set the current runtime value of a configuration option.


@itemize *

@item 
Raise a @ref{2ec,,ValueError} if there is no option `name'.

@item 
Raise a @ref{2ec,,ValueError} if `value' is an invalid value.

@item 
Raise a @ref{2ec,,ValueError} if the option is read-only (cannot be set).

@item 
Raise a @ref{198,,TypeError} if `value' has not the proper type.
@end itemize

The caller must have an @ref{4f10,,attached thread state}. The function cannot
be called before Python initialization nor after Python finalization.

Raises an @ref{1c6c,,auditing event} @code{cpython.PyConfig_Set} with arguments @code{name}, @code{value}.


Added in version 3.14.

@end deffn

@node PyConfig C API,Py_GetArgcArgv,Runtime Python configuration API,파이썬 초기화 구성
@anchor{c-api/init_config pyconfig-api}@anchor{37a}@anchor{c-api/init_config pyconfig-c-api}@anchor{55df}
@subsection PyConfig C API



Added in version 3.8.


Python can be initialized with @ref{3f6,,Py_InitializeFromConfig()} and the
@ref{3f7,,PyConfig} structure. It can be preinitialized with
@ref{41e,,Py_PreInitialize()} and the @ref{ba2,,PyPreConfig} structure.

There are two kinds of configuration:


@itemize *

@item 
The @ref{5558,,Python Configuration} can be used to build a
customized Python which behaves as the regular Python. For example,
environment variables and command line arguments are used to configure
Python.

@item 
The @ref{55b8,,Isolated Configuration} can be used to embed
Python into an application. It isolates Python from the system. For example,
environment variables are ignored, the LC_CTYPE locale is left unchanged and
no signal handler is registered.
@end itemize

The @ref{bbb,,Py_RunMain()} function can be used to write a customized Python
program.

@ref{554a,,초기화@comma{} 파이널리제이션 및 스레드}도 참조하십시오.


@subsubheading 더 보기


@geindex Python 향상 제안; PEP 587
PEP 587@footnote{https://peps.python.org/pep-0587/} “파이썬 초기화 구성”.


@menu
* Example: Example<2>. 
* PyWideStringList:: 
* PyStatus:: 
* PyPreConfig:: 
* Preinitialize Python with PyPreConfig:: 
* PyConfig:: 
* PyConfig를 사용한 초기화:: 
* 격리된 구성:: 
* 파이썬 구성:: 
* Python Path Configuration:: 

@end menu

@node Example<2>,PyWideStringList,,PyConfig C API
@anchor{c-api/init_config id1}@anchor{55e0}
@subsubsection Example


항상 격리 모드에서 실행되는 사용자 정의 파이썬의 예:

@example
int main(int argc, char **argv)
@{
    PyStatus status;

    PyConfig config;
    PyConfig_InitPythonConfig(&config);
    config.isolated = 1;

    /* Decode command line arguments.
       Implicitly preinitialize Python (in isolated mode). */
    status = PyConfig_SetBytesArgv(&config, argc, argv);
    if (PyStatus_Exception(status)) @{
        goto exception;
    @}

    status = Py_InitializeFromConfig(&config);
    if (PyStatus_Exception(status)) @{
        goto exception;
    @}
    PyConfig_Clear(&config);

    return Py_RunMain();

exception:
    PyConfig_Clear(&config);
    if (PyStatus_IsExit(status)) @{
        return status.exitcode;
    @}
    /* Display the error message and exit the process with
       non-zero exit code */
    Py_ExitStatusException(status);
@}
@end example

@node PyWideStringList,PyStatus,Example<2>,PyConfig C API
@anchor{c-api/init_config pywidestringlist}@anchor{55e1}
@subsubsection PyWideStringList


@geindex PyWideStringList (C type)
@anchor{c-api/init_config c PyWideStringList}@anchor{ba4}
@deffn {C 자료형} type PyWideStringList

@code{wchar_t*} 문자열의 리스트.

`length'가 0이 아니면, `items'는 @code{NULL}이 아니어야 하고 모든 문자열은 @code{NULL}이 아니어야 합니다.

메서드:

@geindex PyWideStringList_Append (C function)
@anchor{c-api/init_config c PyWideStringList_Append}@anchor{bb5}
@deffn {C 함수} @ref{ba3,,PyStatus} PyWideStringList_Append (PyWideStringList *list, const wchar_t *item)

`item'을 `list'에 추가합니다.

이 함수를 호출하려면 파이썬을 사전 초기화해야 합니다.
@end deffn

@geindex PyWideStringList_Insert (C function)
@anchor{c-api/init_config c PyWideStringList_Insert}@anchor{bb6}
@deffn {C 함수} @ref{ba3,,PyStatus} PyWideStringList_Insert (PyWideStringList *list, Py_ssize_t index, const wchar_t *item)

`item'을 `list'의 `index'에 삽입합니다.

`index'가 `list' 길이보다 크거나 같으면, `item'을 `list'에 추가(append)합니다.

`index' must be greater than or equal to @code{0}.

이 함수를 호출하려면 파이썬을 사전 초기화해야 합니다.
@end deffn

구조체 필드:

@geindex PyWideStringList.length (C member)
@anchor{c-api/init_config c PyWideStringList length}@anchor{55e2}
@deffn {C 멤버 변수} @ref{c54,,Py_ssize_t} length

리스트 길이.
@end deffn

@geindex PyWideStringList.items (C member)
@anchor{c-api/init_config c PyWideStringList items}@anchor{55e3}
@deffn {C 멤버 변수} wchar_t **items

리스트 항목들.
@end deffn
@end deffn

@node PyStatus,PyPreConfig,PyWideStringList,PyConfig C API
@anchor{c-api/init_config pystatus}@anchor{55e4}
@subsubsection PyStatus


@geindex PyStatus (C type)
@anchor{c-api/init_config c PyStatus}@anchor{ba3}
@deffn {C 자료형} type PyStatus

초기화 함수 상태를 저장하는 구조체: 성공, 에러 또는 종료.

에러의 경우, 에러를 만든 C 함수 이름을 저장할 수 있습니다.

구조체 필드:

@geindex PyStatus.exitcode (C member)
@anchor{c-api/init_config c PyStatus exitcode}@anchor{55e5}
@deffn {C 멤버 변수} int exitcode

종료 코드. @code{exit()}에 전달된 인자.
@end deffn

@geindex PyStatus.err_msg (C member)
@anchor{c-api/init_config c PyStatus err_msg}@anchor{55e6}
@deffn {C 멤버 변수} const char *err_msg

에러 메시지.
@end deffn

@geindex PyStatus.func (C member)
@anchor{c-api/init_config c PyStatus func}@anchor{55e7}
@deffn {C 멤버 변수} const char *func

에러를 만든 함수의 이름, @code{NULL}일 수 있습니다.
@end deffn

상태를 만드는 함수:

@geindex PyStatus_Ok (C function)
@anchor{c-api/init_config c PyStatus_Ok}@anchor{bb4}
@deffn {C 함수} @ref{ba3,,PyStatus} PyStatus_Ok (void)

성공.
@end deffn

@geindex PyStatus_Error (C function)
@anchor{c-api/init_config c PyStatus_Error}@anchor{bae}
@deffn {C 함수} @ref{ba3,,PyStatus} PyStatus_Error (const char *err_msg)

메시지가 포함된 초기화 에러.

`err_msg' must not be @code{NULL}.
@end deffn

@geindex PyStatus_NoMemory (C function)
@anchor{c-api/init_config c PyStatus_NoMemory}@anchor{bb3}
@deffn {C 함수} @ref{ba3,,PyStatus} PyStatus_NoMemory (void)

메모리 할당 실패 (메모리 부족).
@end deffn

@geindex PyStatus_Exit (C function)
@anchor{c-api/init_config c PyStatus_Exit}@anchor{bb0}
@deffn {C 함수} @ref{ba3,,PyStatus} PyStatus_Exit (int exitcode)

지정된 종료 코드로 파이썬을 종료합니다.
@end deffn

상태를 처리하는 함수:

@geindex PyStatus_Exception (C function)
@anchor{c-api/init_config c PyStatus_Exception}@anchor{baf}
@deffn {C 함수} int PyStatus_Exception (PyStatus status)

상태가 에러입니까? 아니면 종료입니까? 참이면, 예외를 처리해야 합니다; 예를 들어 @ref{bb8,,Py_ExitStatusException()} 을 호출하여.
@end deffn

@geindex PyStatus_IsError (C function)
@anchor{c-api/init_config c PyStatus_IsError}@anchor{bb1}
@deffn {C 함수} int PyStatus_IsError (PyStatus status)

결과가 에러입니까?
@end deffn

@geindex PyStatus_IsExit (C function)
@anchor{c-api/init_config c PyStatus_IsExit}@anchor{bb2}
@deffn {C 함수} int PyStatus_IsExit (PyStatus status)

결과가 종료입니까?
@end deffn

@geindex Py_ExitStatusException (C function)
@anchor{c-api/init_config c Py_ExitStatusException}@anchor{bb8}
@deffn {C 함수} void Py_ExitStatusException (PyStatus status)

`status'가 종료이면 @code{exit(exitcode)}를 호출합니다. `status'가 에러이면 에러 메시지를 인쇄하고 0이 아닌 종료 코드로 종료합니다. @code{PyStatus_Exception(status)}가 0이 아닐 때만 호출해야 합니다.
@end deffn
@end deffn

@cartouche
@quotation 참고 
내부적으로, 파이썬은 @code{PyStatus.func}를 설정하는 데는 매크로를 사용하는 반면, @code{func}가 @code{NULL}로 설정된 상태를 만드는 데는 함수를 사용합니다.
@end quotation
@end cartouche

예:

@example
PyStatus alloc(void **ptr, size_t size)
@{
    *ptr = PyMem_RawMalloc(size);
    if (*ptr == NULL) @{
        return PyStatus_NoMemory();
    @}
    return PyStatus_Ok();
@}

int main(int argc, char **argv)
@{
    void *ptr;
    PyStatus status = alloc(&ptr, 16);
    if (PyStatus_Exception(status)) @{
        Py_ExitStatusException(status);
    @}
    PyMem_Free(ptr);
    return 0;
@}
@end example

@node PyPreConfig,Preinitialize Python with PyPreConfig,PyStatus,PyConfig C API
@anchor{c-api/init_config pypreconfig}@anchor{55e8}
@subsubsection PyPreConfig


@geindex PyPreConfig (C type)
@anchor{c-api/init_config c PyPreConfig}@anchor{ba2}
@deffn {C 자료형} type PyPreConfig

Structure used to preinitialize Python.

사전 구성을 초기화하는 함수:

@geindex PyPreConfig_InitPythonConfig (C function)
@anchor{c-api/init_config c PyPreConfig_InitPythonConfig}@anchor{bad}
@deffn {C 함수} void PyPreConfig_InitPythonConfig (PyPreConfig *preconfig)

@ref{5558,,파이썬 구성}으로 사전 구성을 초기화합니다.
@end deffn

@geindex PyPreConfig_InitIsolatedConfig (C function)
@anchor{c-api/init_config c PyPreConfig_InitIsolatedConfig}@anchor{bac}
@deffn {C 함수} void PyPreConfig_InitIsolatedConfig (PyPreConfig *preconfig)

@ref{55b8,,격리된 구성}으로 사전 구성을 초기화합니다.
@end deffn

구조체 필드:

@geindex PyPreConfig.allocator (C member)
@anchor{c-api/init_config c PyPreConfig allocator}@anchor{55c0}
@deffn {C 멤버 변수} int allocator

Name of the Python memory allocators:


@itemize *

@item 
@code{PYMEM_ALLOCATOR_NOT_SET} (@code{0}): don’t change memory allocators
(use defaults).

@item 
@code{PYMEM_ALLOCATOR_DEFAULT} (@code{1}): @ref{2138,,default memory allocators}.

@item 
@code{PYMEM_ALLOCATOR_DEBUG} (@code{2}): @ref{2138,,default memory allocators} with @ref{213b,,debug hooks}.

@item 
@code{PYMEM_ALLOCATOR_MALLOC} (@code{3}): use @code{malloc()} of the C library.

@item 
@code{PYMEM_ALLOCATOR_MALLOC_DEBUG} (@code{4}): force usage of
@code{malloc()} with @ref{213b,,debug hooks}.

@item 
@code{PYMEM_ALLOCATOR_PYMALLOC} (@code{5}): @ref{f0a,,Python pymalloc memory allocator}.

@item 
@code{PYMEM_ALLOCATOR_PYMALLOC_DEBUG} (@code{6}): @ref{f0a,,Python pymalloc memory allocator} with @ref{213b,,debug hooks}.

@item 
@code{PYMEM_ALLOCATOR_MIMALLOC} (@code{6}): use @code{mimalloc}, a fast
malloc replacement.

@item 
@code{PYMEM_ALLOCATOR_MIMALLOC_DEBUG} (@code{7}): use @code{mimalloc}, a fast
malloc replacement with @ref{213b,,debug hooks}.
@end itemize

@code{PYMEM_ALLOCATOR_PYMALLOC} and @code{PYMEM_ALLOCATOR_PYMALLOC_DEBUG} are
not supported if Python is @ref{219e,,configured using --without-pymalloc}.

@code{PYMEM_ALLOCATOR_MIMALLOC} and @code{PYMEM_ALLOCATOR_MIMALLOC_DEBUG} are
not supported if Python is @ref{219d,,configured using --without-mimalloc} or if the underlying atomic support isn’t
available.

@ref{55e9,,메모리 관리}를 참조하십시오.

Default: @code{PYMEM_ALLOCATOR_NOT_SET}.
@end deffn

@geindex PyPreConfig.configure_locale (C member)
@anchor{c-api/init_config c PyPreConfig configure_locale}@anchor{55c9}
@deffn {C 멤버 변수} int configure_locale

Set the LC_CTYPE locale to the user preferred locale.

If equals to @code{0}, set @ref{55c6,,coerce_c_locale} and
@ref{55c7,,coerce_c_locale_warn} members to @code{0}.

See the @ref{54a,,locale encoding}.

Default: @code{1} in Python config, @code{0} in isolated config.
@end deffn

@geindex PyPreConfig.coerce_c_locale (C member)
@anchor{c-api/init_config c PyPreConfig coerce_c_locale}@anchor{55c6}
@deffn {C 멤버 변수} int coerce_c_locale

If equals to @code{2}, coerce the C locale.

If equals to @code{1}, read the LC_CTYPE locale to decide if it should be
coerced.

See the @ref{54a,,locale encoding}.

Default: @code{-1} in Python config, @code{0} in isolated config.
@end deffn

@geindex PyPreConfig.coerce_c_locale_warn (C member)
@anchor{c-api/init_config c PyPreConfig coerce_c_locale_warn}@anchor{55c7}
@deffn {C 멤버 변수} int coerce_c_locale_warn

0이 아니면, C 로케일이 강제될 때 경고가 발생합니다.

Default: @code{-1} in Python config, @code{0} in isolated config.
@end deffn

@geindex PyPreConfig.dev_mode (C member)
@anchor{c-api/init_config c PyPreConfig dev_mode}@anchor{55ea}
@deffn {C 멤버 변수} int dev_mode

@ref{507,,Python Development Mode}: see
@ref{55cb,,PyConfig.dev_mode}.

Default: @code{-1} in Python mode, @code{0} in isolated mode.
@end deffn

@geindex PyPreConfig.isolated (C member)
@anchor{c-api/init_config c PyPreConfig isolated}@anchor{55eb}
@deffn {C 멤버 변수} int isolated

Isolated mode: see @ref{416,,PyConfig.isolated}.

Default: @code{0} in Python mode, @code{1} in isolated mode.
@end deffn

@geindex PyPreConfig.legacy_windows_fs_encoding (C member)
@anchor{c-api/init_config c PyPreConfig legacy_windows_fs_encoding}@anchor{418}
@deffn {C 멤버 변수} int legacy_windows_fs_encoding

If non-zero:


@itemize *

@item 
Set @ref{41d,,PyPreConfig.utf8_mode} to @code{0},

@item 
Set @ref{41b,,PyConfig.filesystem_encoding} to @code{"mbcs"},

@item 
Set @ref{41c,,PyConfig.filesystem_errors} to @code{"replace"}.
@end itemize

Initialized from the 
@geindex PYTHONLEGACYWINDOWSFSENCODING
@geindex 환경 변수; PYTHONLEGACYWINDOWSFSENCODING
@ref{33f,,PYTHONLEGACYWINDOWSFSENCODING} environment
variable value.

윈도우에서만 사용 가능합니다. @code{#ifdef MS_WINDOWS} 매크로는 윈도우 특정 코드에 사용할 수 있습니다.

Default: @code{0}.
@end deffn

@geindex PyPreConfig.parse_argv (C member)
@anchor{c-api/init_config c PyPreConfig parse_argv}@anchor{55ec}
@deffn {C 멤버 변수} int parse_argv

0이 아니면, @ref{bb9,,Py_PreInitializeFromArgs()}와 @ref{bba,,Py_PreInitializeFromBytesArgs()}는 일반 파이썬이 명령 줄 인자를 구문 분석하는 것과 같은 방식으로 @code{argv} 인자를 구문 분석합니다. @ref{1206,,명령 줄 인자}를 참조하십시오.

Default: @code{1} in Python config, @code{0} in isolated config.
@end deffn

@geindex PyPreConfig.use_environment (C member)
@anchor{c-api/init_config c PyPreConfig use_environment}@anchor{55ed}
@deffn {C 멤버 변수} int use_environment

Use @ref{806,,environment variables}? See
@ref{40b,,PyConfig.use_environment}.

Default: @code{1} in Python config and @code{0} in isolated config.
@end deffn

@geindex PyPreConfig.utf8_mode (C member)
@anchor{c-api/init_config c PyPreConfig utf8_mode}@anchor{41d}
@deffn {C 멤버 변수} int utf8_mode

If non-zero, enable the @ref{865,,Python UTF-8 Mode}.

Set to @code{0} or @code{1} by the @ref{16f,,-X utf8} command line option
and the 
@geindex PYTHONUTF8
@geindex 환경 변수; PYTHONUTF8
@ref{cce,,PYTHONUTF8} environment variable.

Also set to @code{1} if the @code{LC_CTYPE} locale is @code{C} or @code{POSIX}.

Default: @code{-1} in Python config and @code{0} in isolated config.
@end deffn
@end deffn

@node Preinitialize Python with PyPreConfig,PyConfig,PyPreConfig,PyConfig C API
@anchor{c-api/init_config c-preinit}@anchor{4306}@anchor{c-api/init_config preinitialize-python-with-pypreconfig}@anchor{55ee}
@subsubsection Preinitialize Python with PyPreConfig


The preinitialization of Python:


@itemize *

@item 
Set the Python memory allocators (@ref{55c0,,PyPreConfig.allocator})

@item 
Configure the LC_CTYPE locale (@ref{54a,,locale encoding})

@item 
Set the @ref{865,,Python UTF-8 Mode}
(@ref{41d,,PyPreConfig.utf8_mode})
@end itemize

The current preconfiguration (@code{PyPreConfig} type) is stored in
@code{_PyRuntime.preconfig}.

파이썬을 사전 초기화하는 함수:

@geindex Py_PreInitialize (C function)
@anchor{c-api/init_config c Py_PreInitialize}@anchor{41e}
@deffn {C 함수} @ref{ba3,,PyStatus} Py_PreInitialize (const PyPreConfig *preconfig)

`preconfig' 사전 구성에서 파이썬을 사전 초기화합니다.

`preconfig' must not be @code{NULL}.
@end deffn

@geindex Py_PreInitializeFromBytesArgs (C function)
@anchor{c-api/init_config c Py_PreInitializeFromBytesArgs}@anchor{bba}
@deffn {C 함수} @ref{ba3,,PyStatus} Py_PreInitializeFromBytesArgs (const PyPreConfig *preconfig, int argc, char *const *argv)

`preconfig' 사전 구성에서 파이썬을 사전 초기화합니다.

Parse `argv' command line arguments (bytes strings) if
@ref{55ec,,parse_argv} of `preconfig' is non-zero.

`preconfig' must not be @code{NULL}.
@end deffn

@geindex Py_PreInitializeFromArgs (C function)
@anchor{c-api/init_config c Py_PreInitializeFromArgs}@anchor{bb9}
@deffn {C 함수} @ref{ba3,,PyStatus} Py_PreInitializeFromArgs (const PyPreConfig *preconfig, int argc, wchar_t *const *argv)

`preconfig' 사전 구성에서 파이썬을 사전 초기화합니다.

Parse `argv' command line arguments (wide strings) if
@ref{55ec,,parse_argv} of `preconfig' is non-zero.

`preconfig' must not be @code{NULL}.
@end deffn

호출자는 @ref{baf,,PyStatus_Exception()}과 @ref{bb8,,Py_ExitStatusException()} 을 사용하여 예외(에러나 종료)를 처리해야 합니다.

For @ref{5558,,Python Configuration}
(@ref{bad,,PyPreConfig_InitPythonConfig()}), if Python is initialized with
command line arguments, the command line arguments must also be passed to
preinitialize Python, since they have an effect on the pre-configuration
like encodings. For example, the @ref{16f,,-X utf8} command line option
enables the @ref{865,,Python UTF-8 Mode}.

@code{PyMem_SetAllocator()}는 @ref{41e,,Py_PreInitialize()} 이후에 @ref{3f6,,Py_InitializeFromConfig()} 이전에 호출하여 사용자 정의 메모리 할당자를 설치할 수 있습니다. @ref{55c0,,PyPreConfig.allocator}가 @code{PYMEM_ALLOCATOR_NOT_SET}으로 설정되면 @code{Py_PreInitialize()} 전에 호출할 수 있습니다.

Python memory allocation functions like @ref{62f,,PyMem_RawMalloc()} must not be
used before the Python preinitialization, whereas calling directly @code{malloc()}
and @code{free()} is always safe. @ref{dbf,,Py_DecodeLocale()} must not be called
before the Python preinitialization.

Example using the preinitialization to enable
the @ref{865,,Python UTF-8 Mode}:

@example
PyStatus status;
PyPreConfig preconfig;
PyPreConfig_InitPythonConfig(&preconfig);

preconfig.utf8_mode = 1;

status = Py_PreInitialize(&preconfig);
if (PyStatus_Exception(status)) @{
    Py_ExitStatusException(status);
@}

/* at this point, Python speaks UTF-8 */

Py_Initialize();
/* ... use Python API here ... */
Py_Finalize();
@end example

@node PyConfig,PyConfig를 사용한 초기화,Preinitialize Python with PyPreConfig,PyConfig C API
@anchor{c-api/init_config pyconfig}@anchor{55ef}
@subsubsection PyConfig


@geindex PyConfig (C type)
@anchor{c-api/init_config c PyConfig}@anchor{3f7}
@deffn {C 자료형} type PyConfig

파이썬을 구성하기 위한 대부분의 파라미터를 포함하는 구조체.

When done, the @ref{ba5,,PyConfig_Clear()} function must be used to release the
configuration memory.

구조체 메서드:

@geindex PyConfig_InitPythonConfig (C function)
@anchor{c-api/init_config c PyConfig_InitPythonConfig}@anchor{ba7}
@deffn {C 함수} void PyConfig_InitPythonConfig (PyConfig *config)

Initialize configuration with the @ref{5558,,Python Configuration}.
@end deffn

@geindex PyConfig_InitIsolatedConfig (C function)
@anchor{c-api/init_config c PyConfig_InitIsolatedConfig}@anchor{ba6}
@deffn {C 함수} void PyConfig_InitIsolatedConfig (PyConfig *config)

Initialize configuration with the @ref{55b8,,Isolated Configuration}.
@end deffn

@geindex PyConfig_SetString (C function)
@anchor{c-api/init_config c PyConfig_SetString}@anchor{bab}
@deffn {C 함수} @ref{ba3,,PyStatus} PyConfig_SetString (PyConfig *config, wchar_t *const *config_str, const wchar_t *str)

와이드 문자열 `str'을 @code{*config_str}로 복사합니다.

@ref{4306,,Preinitialize Python} if needed.
@end deffn

@geindex PyConfig_SetBytesString (C function)
@anchor{c-api/init_config c PyConfig_SetBytesString}@anchor{baa}
@deffn {C 함수} @ref{ba3,,PyStatus} PyConfig_SetBytesString (PyConfig *config, wchar_t *const *config_str, const char *str)

Decode `str' using @ref{dbf,,Py_DecodeLocale()} and set the result into
@code{*config_str}.

@ref{4306,,Preinitialize Python} if needed.
@end deffn

@geindex PyConfig_SetArgv (C function)
@anchor{c-api/init_config c PyConfig_SetArgv}@anchor{ba8}
@deffn {C 함수} @ref{ba3,,PyStatus} PyConfig_SetArgv (PyConfig *config, int argc, wchar_t *const *argv)

Set command line arguments (@ref{3f1,,argv} member of
`config') from the `argv' list of wide character strings.

@ref{4306,,Preinitialize Python} if needed.
@end deffn

@geindex PyConfig_SetBytesArgv (C function)
@anchor{c-api/init_config c PyConfig_SetBytesArgv}@anchor{ba9}
@deffn {C 함수} @ref{ba3,,PyStatus} PyConfig_SetBytesArgv (PyConfig *config, int argc, char *const *argv)

Set command line arguments (@ref{3f1,,argv} member of
`config') from the `argv' list of bytes strings. Decode bytes using
@ref{dbf,,Py_DecodeLocale()}.

@ref{4306,,Preinitialize Python} if needed.
@end deffn

@geindex PyConfig_SetWideStringList (C function)
@anchor{c-api/init_config c PyConfig_SetWideStringList}@anchor{1dc6}
@deffn {C 함수} @ref{ba3,,PyStatus} PyConfig_SetWideStringList (PyConfig *config, PyWideStringList *list, Py_ssize_t length, wchar_t **items)

와이드 문자열 리스트 `list'를 `length'와 `items'로 설정합니다.

@ref{4306,,Preinitialize Python} if needed.
@end deffn

@geindex PyConfig_Read (C function)
@anchor{c-api/init_config c PyConfig_Read}@anchor{992}
@deffn {C 함수} @ref{ba3,,PyStatus} PyConfig_Read (PyConfig *config)

모든 파이썬 구성을 읽습니다.

이미 초기화된 필드는 변경되지 않습니다.

Fields for @ref{aaa,,path configuration} are no longer
calculated or modified when calling this function, as of Python 3.11.

The @ref{992,,PyConfig_Read()} function only parses
@ref{3f1,,PyConfig.argv} arguments once: @ref{1cee,,PyConfig.parse_argv}
is set to @code{2} after arguments are parsed. Since Python arguments are
stripped from @code{PyConfig.argv}, parsing arguments twice would
parse the application options as Python options.

@ref{4306,,Preinitialize Python} if needed.


버전 3.10에서 변경: The @ref{3f1,,PyConfig.argv} arguments are now only parsed once,
@ref{1cee,,PyConfig.parse_argv} is set to @code{2} after arguments are
parsed, and arguments are only parsed if
@code{PyConfig.parse_argv} equals @code{1}.



버전 3.11에서 변경: @ref{992,,PyConfig_Read()} no longer calculates all paths, and so fields
listed under @ref{aaa,,Python Path Configuration} may
no longer be updated until @ref{3f6,,Py_InitializeFromConfig()} is
called.

@end deffn

@geindex PyConfig_Clear (C function)
@anchor{c-api/init_config c PyConfig_Clear}@anchor{ba5}
@deffn {C 함수} void PyConfig_Clear (PyConfig *config)

구성 메모리를 해제합니다.
@end deffn

Most @code{PyConfig} methods @ref{4306,,preinitialize Python} if needed.
In that case, the Python preinitialization configuration
(@ref{ba2,,PyPreConfig}) is based on the @ref{3f7,,PyConfig}. If configuration
fields which are in common with @code{PyPreConfig} are tuned, they must
be set before calling a @code{PyConfig} method:


@itemize *

@item 
@ref{55cb,,PyConfig.dev_mode}

@item 
@ref{416,,PyConfig.isolated}

@item 
@ref{1cee,,PyConfig.parse_argv}

@item 
@ref{40b,,PyConfig.use_environment}
@end itemize

Moreover, if @ref{ba8,,PyConfig_SetArgv()} or @ref{ba9,,PyConfig_SetBytesArgv()}
is used, this method must be called before other methods, since the
preinitialization configuration depends on command line arguments (if
@ref{1cee,,parse_argv} is non-zero).

이 메서드의 호출자는 @code{PyStatus_Exception()}과 @code{Py_ExitStatusException()} 을 사용하여 예외(에러나 종료)를 처리해야 합니다.

구조체 필드:

@geindex PyConfig.argv (C member)
@anchor{c-api/init_config c PyConfig argv}@anchor{3f1}
@deffn {C 멤버 변수} @ref{ba4,,PyWideStringList} argv

@geindex main()
@geindex argv (in module sys)

Set @ref{1469,,sys.argv} command line arguments based on
@ref{3f1,,argv}.  These parameters are similar to those passed
to the program’s @code{main()} function with the difference that the
first entry should refer to the script file to be executed rather than
the executable hosting the Python interpreter.  If there isn’t a script
that will be run, the first entry in @code{argv} can be an
empty string.

Set @ref{1cee,,parse_argv} to @code{1} to parse
@ref{3f1,,argv} the same way the regular Python parses Python
command line arguments and then to strip Python arguments from
@code{argv}.

If @ref{3f1,,argv} is empty, an empty string is added to
ensure that @ref{1469,,sys.argv} always exists and is never empty.

Default: @code{NULL}.

See also the @ref{a94,,orig_argv} member.
@end deffn

@geindex PyConfig.safe_path (C member)
@anchor{c-api/init_config c PyConfig safe_path}@anchor{976}
@deffn {C 멤버 변수} int safe_path

If equals to zero, @code{Py_RunMain()} prepends a potentially unsafe path to
@ref{3e4,,sys.path} at startup:


@itemize *

@item 
If @ref{3f1,,argv[0]} is equal to @code{L"-m"}
(@code{python -m module}), prepend the current working directory.

@item 
If running a script (@code{python script.py}), prepend the script’s
directory.  If it’s a symbolic link, resolve symbolic links.

@item 
Otherwise (@code{python -c code} and @code{python}), prepend an empty string,
which means the current working directory.
@end itemize

Set to @code{1} by the @ref{7c0,,-P} command line option and the
@geindex PYTHONSAFEPATH
@geindex 환경 변수; PYTHONSAFEPATH
@ref{7c1,,PYTHONSAFEPATH} environment variable.

Default: @code{0} in Python config, @code{1} in isolated config.


Added in version 3.11.

@end deffn

@geindex PyConfig.base_exec_prefix (C member)
@anchor{c-api/init_config c PyConfig base_exec_prefix}@anchor{55c1}
@deffn {C 멤버 변수} wchar_t *base_exec_prefix

@ref{3ea,,sys.base_exec_prefix}.

Default: @code{NULL}.

Part of the @ref{aaa,,Python Path Configuration} output.

See also @ref{55ce,,PyConfig.exec_prefix}.
@end deffn

@geindex PyConfig.base_executable (C member)
@anchor{c-api/init_config c PyConfig base_executable}@anchor{55c2}
@deffn {C 멤버 변수} wchar_t *base_executable

Python base executable: @code{sys._base_executable}.

Set by the 
@geindex __PYVENV_LAUNCHER__
@geindex 환경 변수; __PYVENV_LAUNCHER__
@code{__PYVENV_LAUNCHER__} environment variable.

Set from @ref{643,,PyConfig.executable} if @code{NULL}.

Default: @code{NULL}.

Part of the @ref{aaa,,Python Path Configuration} output.

See also @ref{643,,PyConfig.executable}.
@end deffn

@geindex PyConfig.base_prefix (C member)
@anchor{c-api/init_config c PyConfig base_prefix}@anchor{55c3}
@deffn {C 멤버 변수} wchar_t *base_prefix

@ref{3e6,,sys.base_prefix}.

Default: @code{NULL}.

Part of the @ref{aaa,,Python Path Configuration} output.

See also @ref{55d4,,PyConfig.prefix}.
@end deffn

@geindex PyConfig.buffered_stdio (C member)
@anchor{c-api/init_config c PyConfig buffered_stdio}@anchor{411}
@deffn {C 멤버 변수} int buffered_stdio

If equals to @code{0} and @ref{55c8,,configure_c_stdio} is non-zero,
disable buffering on the C streams stdout and stderr.

Set to @code{0} by the @ref{1d8b,,-u} command line option and the
@geindex PYTHONUNBUFFERED
@geindex 환경 변수; PYTHONUNBUFFERED
@ref{1d8c,,PYTHONUNBUFFERED} environment variable.

stdin은 항상 버퍼링 모드로 열립니다.

Default: @code{1}.
@end deffn

@geindex PyConfig.bytes_warning (C member)
@anchor{c-api/init_config c PyConfig bytes_warning}@anchor{407}
@deffn {C 멤버 변수} int bytes_warning

If equals to @code{1}, issue a warning when comparing @ref{192,,bytes} or
@ref{344,,bytearray} with @ref{169,,str}, or comparing @code{bytes} with
@ref{19b,,int}.

If equal or greater to @code{2}, raise a @ref{e1b,,BytesWarning} exception in these
cases.

Incremented by the @ref{7f8,,-b} command line option.

Default: @code{0}.
@end deffn

@geindex PyConfig.warn_default_encoding (C member)
@anchor{c-api/init_config c PyConfig warn_default_encoding}@anchor{55dc}
@deffn {C 멤버 변수} int warn_default_encoding

If non-zero, emit a @ref{212b,,EncodingWarning} warning when @ref{9be,,io.TextIOWrapper}
uses its default encoding. See @ref{213d,,Opt-in EncodingWarning} for details.

Default: @code{0}.


Added in version 3.10.

@end deffn

@geindex PyConfig.code_debug_ranges (C member)
@anchor{c-api/init_config c PyConfig code_debug_ranges}@anchor{55c5}
@deffn {C 멤버 변수} int code_debug_ranges

If equals to @code{0}, disables the inclusion of the end line and column
mappings in code objects. Also disables traceback printing carets to
specific error locations.

Set to @code{0} by the 
@geindex PYTHONNODEBUGRANGES
@geindex 환경 변수; PYTHONNODEBUGRANGES
@ref{7d2,,PYTHONNODEBUGRANGES} environment variable
and by the @ref{16f,,-X no_debug_ranges} command line option.

Default: @code{1}.


Added in version 3.11.

@end deffn

@geindex PyConfig.check_hash_pycs_mode (C member)
@anchor{c-api/init_config c PyConfig check_hash_pycs_mode}@anchor{55c4}
@deffn {C 멤버 변수} wchar_t *check_hash_pycs_mode

Control the validation behavior of hash-based @code{.pyc} files:
value of the @ref{211f,,--check-hash-based-pycs} command line option.

Valid values:


@itemize -

@item 
@code{L"always"}: Hash the source file for invalidation regardless of
value of the ‘check_source’ flag.

@item 
@code{L"never"}: Assume that hash-based pycs always are valid.

@item 
@code{L"default"}: The ‘check_source’ flag in hash-based pycs
determines invalidation.
@end itemize

Default: @code{L"default"}.

See also 
@geindex Python 향상 제안; PEP 552
PEP 552@footnote{https://peps.python.org/pep-0552/} “Deterministic pycs”.
@end deffn

@geindex PyConfig.configure_c_stdio (C member)
@anchor{c-api/init_config c PyConfig configure_c_stdio}@anchor{55c8}
@deffn {C 멤버 변수} int configure_c_stdio

If non-zero, configure C standard streams:


@itemize *

@item 
On Windows, set the binary mode (@code{O_BINARY}) on stdin, stdout and
stderr.

@item 
If @ref{411,,buffered_stdio} equals zero, disable buffering
of stdin, stdout and stderr streams.

@item 
If @ref{3ff,,interactive} is non-zero, enable stream
buffering on stdin and stdout (only stdout on Windows).
@end itemize

Default: @code{1} in Python config, @code{0} in isolated config.
@end deffn

@geindex PyConfig.dev_mode (C member)
@anchor{c-api/init_config c PyConfig dev_mode}@anchor{55cb}
@deffn {C 멤버 변수} int dev_mode

0이 아니면, @ref{507,,파이썬 개발 모드}를 활성화합니다.

Set to @code{1} by the @ref{16f,,-X dev} option and the
@geindex PYTHONDEVMODE
@geindex 환경 변수; PYTHONDEVMODE
@ref{ce6,,PYTHONDEVMODE} environment variable.

Default: @code{-1} in Python mode, @code{0} in isolated mode.
@end deffn

@geindex PyConfig.dump_refs (C member)
@anchor{c-api/init_config c PyConfig dump_refs}@anchor{55cc}
@deffn {C 멤버 변수} int dump_refs

Dump Python references?

0이 아니면, 종료 시 여전히 활성 상태인 모든 객체를 덤프합니다.

Set to @code{1} by the 
@geindex PYTHONDUMPREFS
@geindex 환경 변수; PYTHONDUMPREFS
@ref{b9d,,PYTHONDUMPREFS} environment variable.

Needs a special build of Python with the @code{Py_TRACE_REFS} macro defined:
see the @ref{634,,configure --with-trace-refs option}.

Default: @code{0}.
@end deffn

@geindex PyConfig.dump_refs_file (C member)
@anchor{c-api/init_config c PyConfig dump_refs_file}@anchor{55cd}
@deffn {C 멤버 변수} wchar_t *dump_refs_file

Filename where to dump Python references.

Set by the 
@geindex PYTHONDUMPREFSFILE
@geindex 환경 변수; PYTHONDUMPREFSFILE
@ref{1c3d,,PYTHONDUMPREFSFILE} environment variable.

Default: @code{NULL}.


Added in version 3.11.

@end deffn

@geindex PyConfig.exec_prefix (C member)
@anchor{c-api/init_config c PyConfig exec_prefix}@anchor{55ce}
@deffn {C 멤버 변수} wchar_t *exec_prefix

The site-specific directory prefix where the platform-dependent Python
files are installed: @ref{3eb,,sys.exec_prefix}.

Default: @code{NULL}.

Part of the @ref{aaa,,Python Path Configuration} output.

See also @ref{55c1,,PyConfig.base_exec_prefix}.
@end deffn

@geindex PyConfig.executable (C member)
@anchor{c-api/init_config c PyConfig executable}@anchor{643}
@deffn {C 멤버 변수} wchar_t *executable

The absolute path of the executable binary for the Python interpreter:
@ref{3ed,,sys.executable}.

Default: @code{NULL}.

Part of the @ref{aaa,,Python Path Configuration} output.

See also @ref{55c2,,PyConfig.base_executable}.
@end deffn

@geindex PyConfig.faulthandler (C member)
@anchor{c-api/init_config c PyConfig faulthandler}@anchor{55cf}
@deffn {C 멤버 변수} int faulthandler

Enable faulthandler?

0이 아니면, 시작 시 @ref{20f,,faulthandler.enable()}을 호출합니다.

Set to @code{1} by @ref{16f,,-X faulthandler} and the
@geindex PYTHONFAULTHANDLER
@geindex 환경 변수; PYTHONFAULTHANDLER
@ref{1284,,PYTHONFAULTHANDLER} environment variable.

Default: @code{-1} in Python mode, @code{0} in isolated mode.
@end deffn

@geindex PyConfig.filesystem_encoding (C member)
@anchor{c-api/init_config c PyConfig filesystem_encoding}@anchor{41b}
@deffn {C 멤버 변수} wchar_t *filesystem_encoding

@ref{75c,,Filesystem encoding}:
@ref{e52,,sys.getfilesystemencoding()}.

On macOS, Android and VxWorks: use @code{"utf-8"} by default.

On Windows: use @code{"utf-8"} by default, or @code{"mbcs"} if
@ref{418,,legacy_windows_fs_encoding} of
@ref{ba2,,PyPreConfig} is non-zero.

Default encoding on other platforms:


@itemize *

@item 
@code{"utf-8"} if @ref{41d,,PyPreConfig.utf8_mode} is non-zero.

@item 
@code{"ascii"} if Python detects that @code{nl_langinfo(CODESET)} announces
the ASCII encoding, whereas the @code{mbstowcs()} function
decodes from a different encoding (usually Latin1).

@item 
@code{"utf-8"} if @code{nl_langinfo(CODESET)} returns an empty string.

@item 
Otherwise, use the @ref{54a,,locale encoding}:
@code{nl_langinfo(CODESET)} result.
@end itemize

At Python startup, the encoding name is normalized to the Python codec
name. For example, @code{"ANSI_X3.4-1968"} is replaced with @code{"ascii"}.

See also the @ref{41c,,filesystem_errors} member.
@end deffn

@geindex PyConfig.filesystem_errors (C member)
@anchor{c-api/init_config c PyConfig filesystem_errors}@anchor{41c}
@deffn {C 멤버 변수} wchar_t *filesystem_errors

@ref{75c,,Filesystem error handler}:
@ref{ee1,,sys.getfilesystemencodeerrors()}.

On Windows: use @code{"surrogatepass"} by default, or @code{"replace"}  if
@ref{418,,legacy_windows_fs_encoding} of
@ref{ba2,,PyPreConfig} is non-zero.

On other platforms: use @code{"surrogateescape"} by default.

Supported error handlers:


@itemize *

@item 
@code{"strict"}

@item 
@code{"surrogateescape"}

@item 
@code{"surrogatepass"} (only supported with the UTF-8 encoding)
@end itemize

See also the @ref{41b,,filesystem_encoding} member.
@end deffn

@geindex PyConfig.use_frozen_modules (C member)
@anchor{c-api/init_config c PyConfig use_frozen_modules}@anchor{55db}
@deffn {C 멤버 변수} int use_frozen_modules

If non-zero, use frozen modules.

Set by the 
@geindex PYTHON_FROZEN_MODULES
@geindex 환경 변수; PYTHON_FROZEN_MODULES
@ref{4ae,,PYTHON_FROZEN_MODULES} environment variable.

Default: @code{1} in a release build, or @code{0} in a @ref{508,,debug build}.
@end deffn

@geindex PyConfig.hash_seed (C member)
@anchor{c-api/init_config c PyConfig hash_seed}@anchor{414}
@deffn {C 멤버 변수} unsigned long hash_seed
@end deffn

@geindex PyConfig.use_hash_seed (C member)
@anchor{c-api/init_config c PyConfig use_hash_seed}@anchor{413}
@deffn {C 멤버 변수} int use_hash_seed

무작위 해시 함수 시드.

If @ref{413,,use_hash_seed} is zero, a seed is chosen randomly
at Python startup, and @ref{414,,hash_seed} is ignored.

Set by the 
@geindex PYTHONHASHSEED
@geindex 환경 변수; PYTHONHASHSEED
@ref{127c,,PYTHONHASHSEED} environment variable.

Default `use_hash_seed' value: @code{-1} in Python mode, @code{0} in isolated
mode.
@end deffn

@geindex PyConfig.home (C member)
@anchor{c-api/init_config c PyConfig home}@anchor{3f3}
@deffn {C 멤버 변수} wchar_t *home

Set the default Python “home” directory, that is, the location of the
standard Python libraries (see 
@geindex PYTHONHOME
@geindex 환경 변수; PYTHONHOME
@ref{3f0,,PYTHONHOME}).

Set by the 
@geindex PYTHONHOME
@geindex 환경 변수; PYTHONHOME
@ref{3f0,,PYTHONHOME} environment variable.

Default: @code{NULL}.

Part of the @ref{aaa,,Python Path Configuration} input.
@end deffn

@geindex PyConfig.import_time (C member)
@anchor{c-api/init_config c PyConfig import_time}@anchor{55d0}
@deffn {C 멤버 변수} int import_time

@quotation

If @code{1}, profile import time.
If @code{2}, include additional output that indicates
when an imported module has already been loaded.

Set by the @ref{16f,,-X importtime} option and the
@geindex PYTHONPROFILEIMPORTTIME
@geindex 환경 변수; PYTHONPROFILEIMPORTTIME
@ref{cec,,PYTHONPROFILEIMPORTTIME} environment variable.

Default: @code{0}.
@end quotation


버전 3.14에서 변경: Added support for @code{import_time = 2}

@end deffn

@geindex PyConfig.inspect (C member)
@anchor{c-api/init_config c PyConfig inspect}@anchor{401}
@deffn {C 멤버 변수} int inspect

스크립트나 명령을 실행한 후 대화식 모드로 들어갑니다.

If greater than @code{0}, enable inspect: when a script is passed as first
argument or the -c option is used, enter interactive mode after executing
the script or the command, even when @ref{75e,,sys.stdin} does not appear to
be a terminal.

Incremented by the @ref{16e0,,-i} command line option. Set to @code{1} if the
@geindex PYTHONINSPECT
@geindex 환경 변수; PYTHONINSPECT
@ref{16df,,PYTHONINSPECT} environment variable is non-empty.

Default: @code{0}.
@end deffn

@geindex PyConfig.install_signal_handlers (C member)
@anchor{c-api/init_config c PyConfig install_signal_handlers}@anchor{abb}
@deffn {C 멤버 변수} int install_signal_handlers

Install Python signal handlers?

Default: @code{1} in Python mode, @code{0} in isolated mode.
@end deffn

@geindex PyConfig.interactive (C member)
@anchor{c-api/init_config c PyConfig interactive}@anchor{3ff}
@deffn {C 멤버 변수} int interactive

If greater than @code{0}, enable the interactive mode (REPL).

Incremented by the @ref{16e0,,-i} command line option.

Default: @code{0}.
@end deffn

@geindex PyConfig.int_max_str_digits (C member)
@anchor{c-api/init_config c PyConfig int_max_str_digits}@anchor{55d1}
@deffn {C 멤버 변수} int int_max_str_digits

Configures the @ref{80a,,integer string conversion length limitation}.  An initial value of @code{-1} means the value will
be taken from the command line or environment or otherwise default to
4300 (@ref{26e2,,sys.int_info.default_max_str_digits}).  A value of @code{0}
disables the limitation.  Values greater than zero but less than 640
(@ref{4963,,sys.int_info.str_digits_check_threshold}) are unsupported and
will produce an error.

Configured by the @ref{16f,,-X int_max_str_digits} command line
flag or the 
@geindex PYTHONINTMAXSTRDIGITS
@geindex 환경 변수; PYTHONINTMAXSTRDIGITS
@ref{1b38,,PYTHONINTMAXSTRDIGITS} environment variable.

Default: @code{-1} in Python mode.  4300
(@ref{26e2,,sys.int_info.default_max_str_digits}) in isolated mode.


Added in version 3.12.

@end deffn

@geindex PyConfig.cpu_count (C member)
@anchor{c-api/init_config c PyConfig cpu_count}@anchor{55ca}
@deffn {C 멤버 변수} int cpu_count

If the value of @ref{55ca,,cpu_count} is not @code{-1} then it will
override the return values of @ref{4db,,os.cpu_count()},
@ref{51d,,os.process_cpu_count()}, and @ref{116e,,multiprocessing.cpu_count()}.

Configured by the @code{-X cpu_count=@var{n|default}} command line
flag or the 
@geindex PYTHON_CPU_COUNT
@geindex 환경 변수; PYTHON_CPU_COUNT
@ref{51e,,PYTHON_CPU_COUNT} environment variable.

Default: @code{-1}.


Added in version 3.13.

@end deffn

@geindex PyConfig.isolated (C member)
@anchor{c-api/init_config c PyConfig isolated}@anchor{416}
@deffn {C 멤버 변수} int isolated

If greater than @code{0}, enable isolated mode:


@itemize *

@item 
Set @ref{976,,safe_path} to @code{1}:
don’t prepend a potentially unsafe path to @ref{3e4,,sys.path} at Python
startup, such as the current directory, the script’s directory or an
empty string.

@item 
Set @ref{40b,,use_environment} to @code{0}: ignore @code{PYTHON}
environment variables.

@item 
Set @ref{40f,,user_site_directory} to @code{0}: don’t add the user
site directory to @ref{3e4,,sys.path}.

@item 
파이썬 REPL은 대화식 프롬프트에서 @ref{bf,,readline}을 임포트 하지도 기본 readline 구성을 활성화하지도 않습니다.
@end itemize

Set to @code{1} by the @ref{b56,,-I} command line option.

Default: @code{0} in Python mode, @code{1} in isolated mode.

See also the @ref{55b8,,Isolated Configuration} and
@ref{55eb,,PyPreConfig.isolated}.
@end deffn

@geindex PyConfig.legacy_windows_stdio (C member)
@anchor{c-api/init_config c PyConfig legacy_windows_stdio}@anchor{41a}
@deffn {C 멤버 변수} int legacy_windows_stdio

If non-zero, use @ref{1514,,io.FileIO} instead of
@code{io._WindowsConsoleIO} for @ref{75e,,sys.stdin}, @ref{ccc,,sys.stdout}
and @ref{b33,,sys.stderr}.

Set to @code{1} if the 
@geindex PYTHONLEGACYWINDOWSSTDIO
@geindex 환경 변수; PYTHONLEGACYWINDOWSSTDIO
@ref{e54,,PYTHONLEGACYWINDOWSSTDIO} environment
variable is set to a non-empty string.

윈도우에서만 사용 가능합니다. @code{#ifdef MS_WINDOWS} 매크로는 윈도우 특정 코드에 사용할 수 있습니다.

Default: @code{0}.

See also the 
@geindex Python 향상 제안; PEP 528
PEP 528@footnote{https://peps.python.org/pep-0528/} (Change Windows console encoding to UTF-8).
@end deffn

@geindex PyConfig.malloc_stats (C member)
@anchor{c-api/init_config c PyConfig malloc_stats}@anchor{55d2}
@deffn {C 멤버 변수} int malloc_stats

0이 아니면, 종료 시 @ref{f0a,,파이썬 pymalloc 메모리 할당자}에 대한 통계를 덤프합니다.

Set to @code{1} by the 
@geindex PYTHONMALLOCSTATS
@geindex 환경 변수; PYTHONMALLOCSTATS
@ref{1f33,,PYTHONMALLOCSTATS} environment variable.

The option is ignored if Python is @ref{219e,,configured using the --without-pymalloc option}.

Default: @code{0}.
@end deffn

@geindex PyConfig.platlibdir (C member)
@anchor{c-api/init_config c PyConfig platlibdir}@anchor{1d1e}
@deffn {C 멤버 변수} wchar_t *platlibdir

Platform library directory name: @ref{b32,,sys.platlibdir}.

Set by the 
@geindex PYTHONPLATLIBDIR
@geindex 환경 변수; PYTHONPLATLIBDIR
@ref{1d20,,PYTHONPLATLIBDIR} environment variable.

Default: value of the @code{PLATLIBDIR} macro which is set by the
@ref{2169,,configure --with-platlibdir option}
(default: @code{"lib"}, or @code{"DLLs"} on Windows).

Part of the @ref{aaa,,Python Path Configuration} input.


Added in version 3.9.



버전 3.11에서 변경: This macro is now used on Windows to locate the standard
library extension modules, typically under @code{DLLs}. However,
for compatibility, note that this value is ignored for any
non-standard layouts, including in-tree builds and virtual
environments.

@end deffn

@geindex PyConfig.pythonpath_env (C member)
@anchor{c-api/init_config c PyConfig pythonpath_env}@anchor{55f0}
@deffn {C 멤버 변수} wchar_t *pythonpath_env

Module search paths (@ref{3e4,,sys.path}) as a string separated by @code{DELIM}
(@ref{2131,,os.pathsep}).

Set by the 
@geindex PYTHONPATH
@geindex 환경 변수; PYTHONPATH
@ref{121c,,PYTHONPATH} environment variable.

Default: @code{NULL}.

Part of the @ref{aaa,,Python Path Configuration} input.
@end deffn

@geindex PyConfig.module_search_paths (C member)
@anchor{c-api/init_config c PyConfig module_search_paths}@anchor{641}
@deffn {C 멤버 변수} @ref{ba4,,PyWideStringList} module_search_paths
@end deffn

@geindex PyConfig.module_search_paths_set (C member)
@anchor{c-api/init_config c PyConfig module_search_paths_set}@anchor{804}
@deffn {C 멤버 변수} int module_search_paths_set

Module search paths: @ref{3e4,,sys.path}.

If @ref{804,,module_search_paths_set} is equal to @code{0},
@ref{3f6,,Py_InitializeFromConfig()} will replace
@ref{641,,module_search_paths} and sets
@code{module_search_paths_set} to @code{1}.

Default: empty list (@code{module_search_paths}) and @code{0}
(@code{module_search_paths_set}).

Part of the @ref{aaa,,Python Path Configuration} output.
@end deffn

@geindex PyConfig.optimization_level (C member)
@anchor{c-api/init_config c PyConfig optimization_level}@anchor{403}
@deffn {C 멤버 변수} int optimization_level

컴파일 최적화 수준:


@itemize *

@item 
@code{0}: Peephole optimizer, set @code{__debug__} to @code{True}.

@item 
@code{1}: Level 0, remove assertions, set @code{__debug__} to @code{False}.

@item 
@code{2}: Level 1, strip docstrings.
@end itemize

Incremented by the @ref{18c,,-O} command line option. Set to the
@geindex PYTHONOPTIMIZE
@geindex 환경 변수; PYTHONOPTIMIZE
@ref{2122,,PYTHONOPTIMIZE} environment variable value.

Default: @code{0}.
@end deffn

@geindex PyConfig.orig_argv (C member)
@anchor{c-api/init_config c PyConfig orig_argv}@anchor{a94}
@deffn {C 멤버 변수} @ref{ba4,,PyWideStringList} orig_argv

The list of the original command line arguments passed to the Python
executable: @ref{a41,,sys.orig_argv}.

If @ref{a94,,orig_argv} list is empty and
@ref{3f1,,argv} is not a list only containing an empty
string, @ref{992,,PyConfig_Read()} copies @code{argv} into
@code{orig_argv} before modifying
@code{argv} (if @ref{1cee,,parse_argv} is
non-zero).

See also the @ref{3f1,,argv} member and the
@ref{1d3e,,Py_GetArgcArgv()} function.

Default: empty list.


Added in version 3.10.

@end deffn

@geindex PyConfig.parse_argv (C member)
@anchor{c-api/init_config c PyConfig parse_argv}@anchor{1cee}
@deffn {C 멤버 변수} int parse_argv

Parse command line arguments?

If equals to @code{1}, parse @ref{3f1,,argv} the same way the regular
Python parses @ref{1206,,command line arguments}, and strip
Python arguments from @code{argv}.

The @ref{992,,PyConfig_Read()} function only parses
@ref{3f1,,PyConfig.argv} arguments once: @ref{1cee,,PyConfig.parse_argv}
is set to @code{2} after arguments are parsed. Since Python arguments are
stripped from @code{PyConfig.argv}, parsing arguments twice would
parse the application options as Python options.

Default: @code{1} in Python mode, @code{0} in isolated mode.


버전 3.10에서 변경: The @ref{3f1,,PyConfig.argv} arguments are now only parsed if
@ref{1cee,,PyConfig.parse_argv} equals to @code{1}.

@end deffn

@geindex PyConfig.parser_debug (C member)
@anchor{c-api/init_config c PyConfig parser_debug}@anchor{3f9}
@deffn {C 멤버 변수} int parser_debug

Parser debug mode. If greater than @code{0}, turn on parser debugging output (for expert only, depending
on compilation options).

Incremented by the @ref{2120,,-d} command line option. Set to the
@geindex PYTHONDEBUG
@geindex 환경 변수; PYTHONDEBUG
@ref{2121,,PYTHONDEBUG} environment variable value.

Needs a @ref{508,,debug build of Python} (the @code{Py_DEBUG} macro
must be defined).

Default: @code{0}.
@end deffn

@geindex PyConfig.pathconfig_warnings (C member)
@anchor{c-api/init_config c PyConfig pathconfig_warnings}@anchor{409}
@deffn {C 멤버 변수} int pathconfig_warnings

If non-zero, calculation of path configuration is allowed to log
warnings into @code{stderr}. If equals to @code{0}, suppress these warnings.

Default: @code{1} in Python mode, @code{0} in isolated mode.

Part of the @ref{aaa,,Python Path Configuration} input.


버전 3.11에서 변경: Now also applies on Windows.

@end deffn

@geindex PyConfig.prefix (C member)
@anchor{c-api/init_config c PyConfig prefix}@anchor{55d4}
@deffn {C 멤버 변수} wchar_t *prefix

The site-specific directory prefix where the platform independent Python
files are installed: @ref{3e7,,sys.prefix}.

Default: @code{NULL}.

Part of the @ref{aaa,,Python Path Configuration} output.

See also @ref{55c3,,PyConfig.base_prefix}.
@end deffn

@geindex PyConfig.program_name (C member)
@anchor{c-api/init_config c PyConfig program_name}@anchor{3f2}
@deffn {C 멤버 변수} wchar_t *program_name

Program name used to initialize @ref{643,,executable} and in
early error messages during Python initialization.


@itemize *

@item 
On macOS, use 
@geindex PYTHONEXECUTABLE
@geindex 환경 변수; PYTHONEXECUTABLE
@ref{2135,,PYTHONEXECUTABLE} environment variable if set.

@item 
If the @code{WITH_NEXT_FRAMEWORK} macro is defined, use
@geindex __PYVENV_LAUNCHER__
@geindex 환경 변수; __PYVENV_LAUNCHER__
@code{__PYVENV_LAUNCHER__} environment variable if set.

@item 
Use @code{argv[0]} of @ref{3f1,,argv} if available and
non-empty.

@item 
Otherwise, use @code{L"python"} on Windows, or @code{L"python3"} on other
platforms.
@end itemize

Default: @code{NULL}.

Part of the @ref{aaa,,Python Path Configuration} input.
@end deffn

@geindex PyConfig.pycache_prefix (C member)
@anchor{c-api/init_config c PyConfig pycache_prefix}@anchor{55d5}
@deffn {C 멤버 변수} wchar_t *pycache_prefix

Directory where cached @code{.pyc} files are written:
@ref{b9b,,sys.pycache_prefix}.

Set by the @ref{16f,,-X pycache_prefix=PATH} command line option and
the 
@geindex PYTHONPYCACHEPREFIX
@geindex 환경 변수; PYTHONPYCACHEPREFIX
@ref{b9a,,PYTHONPYCACHEPREFIX} environment variable.
The command-line option takes precedence.

@code{NULL}이면, @ref{b9b,,sys.pycache_prefix}는 @code{None}으로 설정됩니다.

Default: @code{NULL}.
@end deffn

@geindex PyConfig.quiet (C member)
@anchor{c-api/init_config c PyConfig quiet}@anchor{3fd}
@deffn {C 멤버 변수} int quiet

Quiet mode. If greater than @code{0}, don’t display the copyright and version at
Python startup in interactive mode.

Incremented by the @ref{1785,,-q} command line option.

Default: @code{0}.
@end deffn

@geindex PyConfig.run_command (C member)
@anchor{c-api/init_config c PyConfig run_command}@anchor{5555}
@deffn {C 멤버 변수} wchar_t *run_command

Value of the @ref{1a8,,-c} command line option.

Used by @ref{bbb,,Py_RunMain()}.

Default: @code{NULL}.
@end deffn

@geindex PyConfig.run_filename (C member)
@anchor{c-api/init_config c PyConfig run_filename}@anchor{5556}
@deffn {C 멤버 변수} wchar_t *run_filename

Filename passed on the command line: trailing command line argument
without @ref{1a8,,-c} or @ref{23c,,-m}. It is used by the
@ref{bbb,,Py_RunMain()} function.

For example, it is set to @code{script.py} by the @code{python3 script.py arg}
command line.

See also the @ref{55d8,,PyConfig.skip_source_first_line} option.

Default: @code{NULL}.
@end deffn

@geindex PyConfig.run_module (C member)
@anchor{c-api/init_config c PyConfig run_module}@anchor{5557}
@deffn {C 멤버 변수} wchar_t *run_module

Value of the @ref{23c,,-m} command line option.

Used by @ref{bbb,,Py_RunMain()}.

Default: @code{NULL}.
@end deffn

@geindex PyConfig.run_presite (C member)
@anchor{c-api/init_config c PyConfig run_presite}@anchor{55d6}
@deffn {C 멤버 변수} wchar_t *run_presite

@code{package.module} path to module that should be imported before
@code{site.py} is run.

Set by the @ref{16f,,-X presite=package.module} command-line
option and the 
@geindex PYTHON_PRESITE
@geindex 환경 변수; PYTHON_PRESITE
@ref{212c,,PYTHON_PRESITE} environment variable.
The command-line option takes precedence.

Needs a @ref{508,,debug build of Python} (the @code{Py_DEBUG} macro
must be defined).

Default: @code{NULL}.
@end deffn

@geindex PyConfig.show_ref_count (C member)
@anchor{c-api/init_config c PyConfig show_ref_count}@anchor{55d7}
@deffn {C 멤버 변수} int show_ref_count

Show total reference count at exit (excluding @ref{290,,immortal} objects)?

Set to @code{1} by @ref{16f,,-X showrefcount} command line option.

Needs a @ref{508,,debug build of Python} (the @code{Py_REF_DEBUG}
macro must be defined).

Default: @code{0}.
@end deffn

@geindex PyConfig.site_import (C member)
@anchor{c-api/init_config c PyConfig site_import}@anchor{405}
@deffn {C 멤버 변수} int site_import

시작할 때 @ref{cc,,site} 모듈을 임포트 합니까?

If equal to zero, disable the import of the module site and the
site-dependent manipulations of @ref{3e4,,sys.path} that it entails.

Also disable these manipulations if the @ref{cc,,site} module is explicitly
imported later (call @ref{2124,,site.main()} if you want them to be triggered).

Set to @code{0} by the @ref{13ad,,-S} command line option.

@ref{89b,,sys.flags.no_site} is set to the inverted value of
@ref{405,,site_import}.

Default: @code{1}.
@end deffn

@geindex PyConfig.skip_source_first_line (C member)
@anchor{c-api/init_config c PyConfig skip_source_first_line}@anchor{55d8}
@deffn {C 멤버 변수} int skip_source_first_line

If non-zero, skip the first line of the @ref{5556,,PyConfig.run_filename}
source.

It allows the usage of non-Unix forms of @code{#!cmd}. This is intended for
a DOS specific hack only.

Set to @code{1} by the @ref{2128,,-x} command line option.

Default: @code{0}.
@end deffn

@geindex PyConfig.stdio_encoding (C member)
@anchor{c-api/init_config c PyConfig stdio_encoding}@anchor{642}
@deffn {C 멤버 변수} wchar_t *stdio_encoding
@end deffn

@geindex PyConfig.stdio_errors (C member)
@anchor{c-api/init_config c PyConfig stdio_errors}@anchor{4966}
@deffn {C 멤버 변수} wchar_t *stdio_errors

Encoding and encoding errors of @ref{75e,,sys.stdin}, @ref{ccc,,sys.stdout} and
@ref{b33,,sys.stderr} (but @code{sys.stderr} always uses
@code{"backslashreplace"} error handler).

Use the 
@geindex PYTHONIOENCODING
@geindex 환경 변수; PYTHONIOENCODING
@ref{1209,,PYTHONIOENCODING} environment variable if it is
non-empty.

Default encoding:


@itemize *

@item 
@code{"UTF-8"} if @ref{41d,,PyPreConfig.utf8_mode} is non-zero.

@item 
Otherwise, use the @ref{54a,,locale encoding}.
@end itemize

Default error handler:


@itemize *

@item 
On Windows: use @code{"surrogateescape"}.

@item 
@code{"surrogateescape"} if @ref{41d,,PyPreConfig.utf8_mode} is non-zero,
or if the LC_CTYPE locale is “C” or “POSIX”.

@item 
@code{"strict"} otherwise.
@end itemize

See also @ref{41a,,PyConfig.legacy_windows_stdio}.
@end deffn

@geindex PyConfig.tracemalloc (C member)
@anchor{c-api/init_config c PyConfig tracemalloc}@anchor{55da}
@deffn {C 멤버 변수} int tracemalloc

Enable tracemalloc?

0이 아니면, 시작 시 @ref{2129,,tracemalloc.start()}를 호출합니다.

Set by @ref{16f,,-X tracemalloc=N} command line option and by the
@geindex PYTHONTRACEMALLOC
@geindex 환경 변수; PYTHONTRACEMALLOC
@ref{212a,,PYTHONTRACEMALLOC} environment variable.

Default: @code{-1} in Python mode, @code{0} in isolated mode.
@end deffn

@geindex PyConfig.perf_profiling (C member)
@anchor{c-api/init_config c PyConfig perf_profiling}@anchor{55d3}
@deffn {C 멤버 변수} int perf_profiling

Enable the Linux @code{perf} profiler support?

If equals to @code{1}, enable support for the Linux @code{perf} profiler.

If equals to @code{2}, enable support for the Linux @code{perf} profiler with
DWARF JIT support.

Set to @code{1} by @ref{16f,,-X perf} command-line option and the
@geindex PYTHONPERFSUPPORT
@geindex 환경 변수; PYTHONPERFSUPPORT
@ref{698,,PYTHONPERFSUPPORT} environment variable.

Set to @code{2} by the @ref{16f,,-X perf_jit} command-line option and
the 
@geindex PYTHON_PERF_JIT_SUPPORT
@geindex 환경 변수; PYTHON_PERF_JIT_SUPPORT
@ref{4af,,PYTHON_PERF_JIT_SUPPORT} environment variable.

Default: @code{-1}.


@subsubheading 더 보기


See @ref{4b0,,Python support for the Linux perf profiler} for more information.



Added in version 3.12.

@end deffn

@geindex PyConfig.stdlib_dir (C member)
@anchor{c-api/init_config c PyConfig stdlib_dir}@anchor{55d9}
@deffn {C 멤버 변수} wchar_t *stdlib_dir

Directory of the Python standard library.

Default: @code{NULL}.


Added in version 3.11.

@end deffn

@geindex PyConfig.use_environment (C member)
@anchor{c-api/init_config c PyConfig use_environment}@anchor{40b}
@deffn {C 멤버 변수} int use_environment

Use @ref{806,,environment variables}?

If equals to zero, ignore the @ref{806,,environment variables}.

Set to @code{0} by the @ref{b55,,-E} environment variable.

Default: @code{1} in Python config and @code{0} in isolated config.
@end deffn

@geindex PyConfig.use_system_logger (C member)
@anchor{c-api/init_config c PyConfig use_system_logger}@anchor{226e}
@deffn {C 멤버 변수} int use_system_logger

If non-zero, @code{stdout} and @code{stderr} will be redirected to the system
log.

Only available on macOS 10.12 and later, and on iOS.

Default: @code{0} (don’t use the system log) on macOS; @code{1} on iOS (use the
system log).


Added in version 3.14.

@end deffn

@geindex PyConfig.user_site_directory (C member)
@anchor{c-api/init_config c PyConfig user_site_directory}@anchor{40f}
@deffn {C 멤버 변수} int user_site_directory

If non-zero, add the user site directory to @ref{3e4,,sys.path}.

Set to @code{0} by the @ref{1593,,-s} and @ref{b56,,-I} command line options.

Set to @code{0} by the 
@geindex PYTHONNOUSERSITE
@geindex 환경 변수; PYTHONNOUSERSITE
@ref{1594,,PYTHONNOUSERSITE} environment variable.

Default: @code{1} in Python mode, @code{0} in isolated mode.
@end deffn

@geindex PyConfig.verbose (C member)
@anchor{c-api/init_config c PyConfig verbose}@anchor{3fb}
@deffn {C 멤버 변수} int verbose

Verbose mode. If greater than @code{0}, print a message each time a module is
imported, showing the place (filename or built-in module) from which
it is loaded.

If greater than or equal to @code{2}, print a message for each file that is
checked for when searching for a module. Also provides information on
module cleanup at exit.

Incremented by the @ref{162a,,-v} command line option.

Set by the 
@geindex PYTHONVERBOSE
@geindex 환경 변수; PYTHONVERBOSE
@ref{2125,,PYTHONVERBOSE} environment variable value.

Default: @code{0}.
@end deffn

@geindex PyConfig.warnoptions (C member)
@anchor{c-api/init_config c PyConfig warnoptions}@anchor{63f}
@deffn {C 멤버 변수} @ref{ba4,,PyWideStringList} warnoptions

Options of the @ref{118,,warnings} module to build warnings filters, lowest
to highest priority: @ref{3f5,,sys.warnoptions}.

@ref{118,,warnings} 모듈은 @ref{3f5,,sys.warnoptions}를 역순으로 추가합니다: 마지막 @ref{63f,,PyConfig.warnoptions} 항목은 가장 먼저 검사되는 @code{warnings.filters}의 첫 번째 항목이 됩니다 (가장 높은 우선순위).

The @ref{ac5,,-W} command line options adds its value to
@ref{63f,,warnoptions}, it can be used multiple times.

The 
@geindex PYTHONWARNINGS
@geindex 환경 변수; PYTHONWARNINGS
@ref{da2,,PYTHONWARNINGS} environment variable can also be used to add
warning options. Multiple options can be specified, separated by commas
(@code{,}).

Default: empty list.
@end deffn

@geindex PyConfig.write_bytecode (C member)
@anchor{c-api/init_config c PyConfig write_bytecode}@anchor{40d}
@deffn {C 멤버 변수} int write_bytecode

If equal to @code{0}, Python won’t try to write @code{.pyc} files on the import of
source modules.

Set to @code{0} by the @ref{15d2,,-B} command line option and the
@geindex PYTHONDONTWRITEBYTECODE
@geindex 환경 변수; PYTHONDONTWRITEBYTECODE
@ref{15d3,,PYTHONDONTWRITEBYTECODE} environment variable.

@ref{4930,,sys.dont_write_bytecode}는 @ref{40d,,write_bytecode}의 반전된 값으로 초기화됩니다.

Default: @code{1}.
@end deffn

@geindex PyConfig.xoptions (C member)
@anchor{c-api/init_config c PyConfig xoptions}@anchor{640}
@deffn {C 멤버 변수} @ref{ba4,,PyWideStringList} xoptions

Values of the @ref{16f,,-X} command line options: @ref{212e,,sys._xoptions}.

Default: empty list.
@end deffn

@geindex PyConfig._pystats (C member)
@anchor{c-api/init_config c PyConfig _pystats}@anchor{55dd}
@deffn {C 멤버 변수} int _pystats

If non-zero, write performance statistics at Python exit.

Need a special build with the @code{Py_STATS} macro:
see @ref{1b36,,--enable-pystats}.

Default: @code{0}.
@end deffn
@end deffn

If @ref{1cee,,parse_argv} is non-zero, @ref{3f1,,argv}
arguments are parsed the same way the regular Python parses @ref{1206,,command line arguments}, and Python arguments are stripped from
@code{argv}.

The @ref{640,,xoptions} options are parsed to set other options: see
the @ref{16f,,-X} command line option.


버전 3.9에서 변경: @code{show_alloc_count} 필드가 제거되었습니다.


@node PyConfig를 사용한 초기화,격리된 구성,PyConfig,PyConfig C API
@anchor{c-api/init_config init-from-config}@anchor{5554}@anchor{c-api/init_config initialization-with-pyconfig}@anchor{55f1}
@subsubsection PyConfig를 사용한 초기화


Initializing the interpreter from a populated configuration struct is handled
by calling @ref{3f6,,Py_InitializeFromConfig()}.

호출자는 @ref{baf,,PyStatus_Exception()}과 @ref{bb8,,Py_ExitStatusException()} 을 사용하여 예외(에러나 종료)를 처리해야 합니다.

If @ref{3344,,PyImport_FrozenModules()}, @ref{1b1a,,PyImport_AppendInittab()} or
@ref{1b1b,,PyImport_ExtendInittab()} are used, they must be set or called after
Python preinitialization and before the Python initialization. If Python is
initialized multiple times, @code{PyImport_AppendInittab()} or
@code{PyImport_ExtendInittab()} must be called before each Python
initialization.

The current configuration (@code{PyConfig} type) is stored in
@code{PyInterpreterState.config}.

프로그램 이름을 설정하는 예:

@example
void init_python(void)
@{
    PyStatus status;

    PyConfig config;
    PyConfig_InitPythonConfig(&config);

    /* Set the program name. Implicitly preinitialize Python. */
    status = PyConfig_SetString(&config, &config.program_name,
                                L"/path/to/my_program");
    if (PyStatus_Exception(status)) @{
        goto exception;
    @}

    status = Py_InitializeFromConfig(&config);
    if (PyStatus_Exception(status)) @{
        goto exception;
    @}
    PyConfig_Clear(&config);
    return;

exception:
    PyConfig_Clear(&config);
    Py_ExitStatusException(status);
@}
@end example

More complete example modifying the default configuration, read the
configuration, and then override some parameters. Note that since
3.11, many parameters are not calculated until initialization, and
so values cannot be read from the configuration structure. Any values
set before initialize is called will be left unchanged by
initialization:

@example
PyStatus init_python(const char *program_name)
@{
    PyStatus status;

    PyConfig config;
    PyConfig_InitPythonConfig(&config);

    /* Set the program name before reading the configuration
       (decode byte string from the locale encoding).

       Implicitly preinitialize Python. */
    status = PyConfig_SetBytesString(&config, &config.program_name,
                                     program_name);
    if (PyStatus_Exception(status)) @{
        goto done;
    @}

    /* Read all configuration at once */
    status = PyConfig_Read(&config);
    if (PyStatus_Exception(status)) @{
        goto done;
    @}

    /* Specify sys.path explicitly */
    /* If you want to modify the default set of paths, finish
       initialization first and then use PySys_GetObject("path") */
    config.module_search_paths_set = 1;
    status = PyWideStringList_Append(&config.module_search_paths,
                                     L"/path/to/stdlib");
    if (PyStatus_Exception(status)) @{
        goto done;
    @}
    status = PyWideStringList_Append(&config.module_search_paths,
                                     L"/path/to/more/modules");
    if (PyStatus_Exception(status)) @{
        goto done;
    @}

    /* Override executable computed by PyConfig_Read() */
    status = PyConfig_SetString(&config, &config.executable,
                                L"/path/to/my_executable");
    if (PyStatus_Exception(status)) @{
        goto done;
    @}

    status = Py_InitializeFromConfig(&config);

done:
    PyConfig_Clear(&config);
    return status;
@}
@end example

@node 격리된 구성,파이썬 구성,PyConfig를 사용한 초기화,PyConfig C API
@anchor{c-api/init_config init-isolated-conf}@anchor{55b8}@anchor{c-api/init_config isolated-configuration}@anchor{55f2}
@subsubsection 격리된 구성


@ref{bac,,PyPreConfig_InitIsolatedConfig()}와 @ref{ba6,,PyConfig_InitIsolatedConfig()} 함수는 시스템에서 파이썬을 격리하는 구성을 만듭니다. 예를 들어, 파이썬을 응용 프로그램에 내장하기 위해.

This configuration ignores global configuration variables, environment
variables, command line arguments (@ref{3f1,,PyConfig.argv} is not parsed)
and user site directory. The C standard streams (ex: @code{stdout}) and the
LC_CTYPE locale are left unchanged. Signal handlers are not installed.

Configuration files are still used with this configuration to determine
paths that are unspecified. Ensure @ref{3f3,,PyConfig.home} is specified
to avoid computing the default path configuration.

@node 파이썬 구성,Python Path Configuration,격리된 구성,PyConfig C API
@anchor{c-api/init_config init-python-config}@anchor{5558}@anchor{c-api/init_config python-configuration}@anchor{55f3}
@subsubsection 파이썬 구성


@ref{bad,,PyPreConfig_InitPythonConfig()}와 @ref{ba7,,PyConfig_InitPythonConfig()} 함수는 일반 파이썬처럼 동작하는 사용자 정의된 파이썬을 빌드하기 위한 구성을 만듭니다.

환경 변수와 명령 줄 인자는 파이썬을 구성하는 데 사용되는 반면, 전역 구성 변수는 무시됩니다.

This function enables C locale coercion (
@geindex Python 향상 제안; PEP 538
PEP 538@footnote{https://peps.python.org/pep-0538/})
and @ref{865,,Python UTF-8 Mode}
(
@geindex Python 향상 제안; PEP 540
PEP 540@footnote{https://peps.python.org/pep-0540/}) depending on the LC_CTYPE locale, 
@geindex PYTHONUTF8
@geindex 환경 변수; PYTHONUTF8
@ref{cce,,PYTHONUTF8} and
@geindex PYTHONCOERCECLOCALE
@geindex 환경 변수; PYTHONCOERCECLOCALE
@ref{ccb,,PYTHONCOERCECLOCALE} environment variables.

@node Python Path Configuration,,파이썬 구성,PyConfig C API
@anchor{c-api/init_config init-path-config}@anchor{aaa}@anchor{c-api/init_config python-path-configuration}@anchor{55f4}
@subsubsection Python Path Configuration


@ref{3f7,,PyConfig}에는 경로 구성을 위한 여러 필드가 포함되어 있습니다:


@itemize *

@item 
경로 구성 입력:


@itemize *

@item 
@ref{3f3,,PyConfig.home}

@item 
@ref{1d1e,,PyConfig.platlibdir}

@item 
@ref{409,,PyConfig.pathconfig_warnings}

@item 
@ref{3f2,,PyConfig.program_name}

@item 
@ref{55f0,,PyConfig.pythonpath_env}

@item 
현재 작업 디렉터리: 절대 경로를 얻기 위해

@item 
(@ref{3f2,,PyConfig.program_name}에서) 프로그램 전체 경로를 얻기 위한 @code{PATH} 환경 변수

@item 
@code{__PYVENV_LAUNCHER__} 환경 변수

@item 
(윈도우 전용) HKEY_CURRENT_USER와 HKEY_LOCAL_MACHINE의 “SoftwarePythonPythonCoreX.YPythonPath” 아래에 있는 레지스트리의 응용 프로그램 경로 (여기서 X.Y는 파이썬 버전입니다).
@end itemize

@item 
경로 구성 출력 필드:


@itemize *

@item 
@ref{55c1,,PyConfig.base_exec_prefix}

@item 
@ref{55c2,,PyConfig.base_executable}

@item 
@ref{55c3,,PyConfig.base_prefix}

@item 
@ref{55ce,,PyConfig.exec_prefix}

@item 
@ref{643,,PyConfig.executable}

@item 
@ref{804,,PyConfig.module_search_paths_set},
@ref{641,,PyConfig.module_search_paths}

@item 
@ref{55d4,,PyConfig.prefix}
@end itemize
@end itemize

If at least one “output field” is not set, Python calculates the path
configuration to fill unset fields. If
@ref{804,,module_search_paths_set} is equal to @code{0},
@ref{641,,module_search_paths} is overridden and
@code{module_search_paths_set} is set to @code{1}.

It is possible to completely ignore the function calculating the default
path configuration by setting explicitly all path configuration output
fields listed above. A string is considered as set even if it is non-empty.
@code{module_search_paths} is considered as set if
@code{module_search_paths_set} is set to @code{1}. In this case,
@code{module_search_paths} will be used without modification.

Set @ref{409,,pathconfig_warnings} to @code{0} to suppress warnings when
calculating the path configuration (Unix only, Windows does not log any warning).

@ref{55c3,,base_prefix}나 @ref{55c1,,base_exec_prefix} 필드가 설정되지 않으면, 각각 @ref{55d4,,prefix}와 @ref{55ce,,exec_prefix}의 값을 상속합니다.

@ref{bbb,,Py_RunMain()}과 @ref{e1d,,Py_Main()}은 @ref{3e4,,sys.path}를 수정합니다:


@itemize *

@item 
@ref{5556,,run_filename}이 설정되고 @code{__main__.py} 스크립트를 포함하는 디렉터리이면, @code{run_filename}을 @ref{3e4,,sys.path} 앞에 추가합니다.

@item 
@ref{416,,isolated}가 0이면:


@itemize *

@item 
@ref{5557,,run_module}이 설정되면, 현재 디렉터리를 @ref{3e4,,sys.path} 앞에 추가합니다. 현재 디렉터리를 읽을 수 없으면 아무것도 하지 않습니다.

@item 
@ref{5556,,run_filename}이 설정되면, 파일명의 디렉터리를 @ref{3e4,,sys.path} 앞에 추가합니다.

@item 
그렇지 않으면, 빈 문자열을 @ref{3e4,,sys.path} 앞에 추가합니다.
@end itemize
@end itemize

@ref{405,,site_import}가 0이 아니면, @ref{cc,,site} 모듈이 @ref{3e4,,sys.path}를 수정할 수 있습니다. @ref{40f,,user_site_directory}가 0이 아니고 사용자의 site-package 디렉터리가 존재하면, @code{site} 모듈은 사용자의 site-package 디렉터리를 @code{sys.path}에 추가합니다.

다음과 같은 구성 파일이 경로 구성에 사용됩니다:


@itemize *

@item 
@code{pyvenv.cfg}

@item 
@code{._pth} file (ex: @code{python._pth})

@item 
@code{pybuilddir.txt} (유닉스 전용)
@end itemize

If a @code{._pth} file is present:


@itemize *

@item 
Set @ref{416,,isolated} to @code{1}.

@item 
Set @ref{40b,,use_environment} to @code{0}.

@item 
Set @ref{405,,site_import} to @code{0}.

@item 
Set @ref{976,,safe_path} to @code{1}.
@end itemize

If @ref{3f3,,home} is not set and a @code{pyvenv.cfg} file is present in
the same directory as @ref{643,,executable}, or its parent,
@ref{55d4,,prefix} and @ref{55ce,,exec_prefix} are set that
location. When this happens, @ref{55c3,,base_prefix} and
@ref{55c1,,base_exec_prefix} still keep their value, pointing to the
base installation. See @ref{48f2,,Virtual Environments} for more
information.

The @code{__PYVENV_LAUNCHER__} environment variable is used to set
@ref{55c2,,PyConfig.base_executable}.


버전 3.14에서 변경: @ref{55d4,,prefix}, and @ref{55ce,,exec_prefix}, are now
set to the @code{pyvenv.cfg} directory. This was previously done by @ref{cc,,site},
therefore affected by @ref{13ad,,-S}.


@node Py_GetArgcArgv,Delaying main module execution,PyConfig C API,파이썬 초기화 구성
@anchor{c-api/init_config py-getargcargv}@anchor{55f5}
@subsection Py_GetArgcArgv()


@geindex Py_GetArgcArgv (C function)
@anchor{c-api/init_config c Py_GetArgcArgv}@anchor{1d3e}
@deffn {C 함수} void Py_GetArgcArgv (int *argc, wchar_t ***argv)

파이썬이 수정하기 전의, 원래 명령 줄 인자를 가져옵니다.

See also @ref{a94,,PyConfig.orig_argv} member.
@end deffn

@node Delaying main module execution,,Py_GetArgcArgv,파이썬 초기화 구성
@anchor{c-api/init_config delaying-main-module-execution}@anchor{55f6}
@subsection Delaying main module execution


In some embedding use cases, it may be desirable to separate interpreter initialization
from the execution of the main module.

This separation can be achieved by setting @code{PyConfig.run_command} to the empty
string during initialization (to prevent the interpreter from dropping into the
interactive prompt), and then subsequently executing the desired main module
code using @code{__main__.__dict__} as the global namespace.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 메모리 관리,객체 구현 지원,파이썬 초기화 구성,Python/C API reference manual
@anchor{c-api/memory doc}@anchor{55f7}@anchor{c-api/memory memory}@anchor{55e9}@anchor{c-api/memory memory-management}@anchor{55f8}@anchor{c-api/memory translation-repo}@anchor{55f9}
@section 메모리 관리


@menu
* 개요: 개요<4>. 
* Allocator Domains:: 
* 원시 메모리 인터페이스:: 
* 메모리 인터페이스:: 
* 객체 할당자:: 
* 기본 메모리 할당자:: 
* 메모리 할당자 사용자 정의:: 
* 파이썬 메모리 할당자의 디버그 훅:: 
* pymalloc 할당자:: 
* mimalloc 할당자:: 
* tracemalloc C API:: 
* 예: 예<18>. 

@end menu

@node 개요<4>,Allocator Domains,,메모리 관리
@anchor{c-api/memory memoryoverview}@anchor{55fa}@anchor{c-api/memory overview}@anchor{55fb}
@subsection 개요


파이썬의 메모리 관리에는 모든 파이썬 객체와 데이터 구조를 포함하는 비공개 힙(private heap)을 수반합니다. 이 비공개 힙의 관리는 `파이썬 메모리 관리자'에 의해 내부적으로 이루어집니다. 파이썬 메모리 관리자는 공유, 세그먼트 화, 사전 할당 또는 캐싱과 같은 동적 스토리지 관리의 다양한 측면을 처리하는 서로 다른 구성 요소를 가지고 있습니다.

가장 낮은 수준에서, 원시 메모리 할당자는 운영 체제의 메모리 관리자와 상호 작용하여 비공개 힙에 모든 파이썬 관련 데이터를 저장하기에 충분한 공간이 있는지 확인합니다. 원시 메모리 할당자 위에, 여러 개의 객체별 할당자가 같은 힙에서 작동하며 각 객체 형의 특성에 맞는 고유한 메모리 관리 정책을 구현합니다. 예를 들어, 정수는 다른 스토리지 요구 사항과 속도/공간 절충을 의미하므로, 정수 객체는 힙 내에서 문자열, 튜플 또는 딕셔너리와는 다르게 관리됩니다. 따라서 파이썬 메모리 관리자는 일부 작업을 객체별 할당자에게 위임하지만, 후자가 비공개 힙의 경계 내에서 작동하도록 합니다.

파이썬 힙의 관리는 인터프리터 자체에 의해 수행되며, 사용자는 힙 내부의 메모리 블록에 대한 객체 포인터를 규칙적으로 조작하더라도, 사용자가 제어할 수 없다는 것을 이해하는 것이 중요합니다. 파이썬 객체와 기타 내부 버퍼를 위한 힙 공간 할당은 이 설명서에 나열된 파이썬/C API 함수를 통해 파이썬 메모리 관리자의 요청에 따라 수행됩니다.

@geindex malloc (C 함수)
@geindex calloc (C 함수)
@geindex realloc (C 함수)
@geindex free (C 함수)

메모리 손상을 피하고자, 확장 작성자는 C 라이브러리에서 내보낸 함수를 파이썬 객체에 대해 실행하지 않아야 합니다: @code{malloc()}, @code{calloc()}, @code{realloc()} 및 @code{free()}. 그렇게 한다면, 서로 다른 알고리즘을 구현하고 다른 힘에 작동하기 때문에, C 할당자와 파이썬 메모리 관리자 간에 혼합 호출이 발생하여 치명적인 결과를 초래합니다. 그러나, 다음 예제와 같이 개별 목적으로 C 라이브러리 할당자를 사용하여 메모리 블록을 안전하게 할당하고 해제할 수 있습니다:

@example
PyObject *res;
char *buf = (char *) malloc(BUFSIZ); /* I/O 용 */

if (buf == NULL)
    return PyErr_NoMemory();
...buf 를 사용하는 I/O 연산을 수행합니다...
res = PyBytes_FromString(buf);
free(buf); /* malloc 으로 할당했습니다 */
return res;
@end example

이 예에서, I/O 버퍼에 대한 메모리 요청은 C 라이브러리 할당자에 의해 처리됩니다. 파이썬 메모리 관리자는 결과로 반환되는 바이트열 객체의 할당에만 관여합니다.

그러나 대부분의 경우, 파이썬 힙에서 메모리를 할당하는 것이 좋습니다. 파이썬 힙은 파이썬 메모리 관리자가 제어하기 때문입니다. 예를 들어, 인터프리터가 C로 작성된 새로운 객체 형으로 확장될 때 필요합니다. 파이썬 힙을 사용하는 또 다른 이유는 확장 모듈의 메모리 요구에 대해 파이썬 메모리 관리자에게 `알리고자' 하는 것입니다. 요청된 메모리가 내부적이고 매우 특정한 목적으로만 사용될 때도, 모든 메모리 요청을 파이썬 메모리 관리자에 위임하면 인터프리터가 전체 메모리 요구량에 대한 더 정확한 이미지를 갖게 됩니다. 결과적으로, 특정 상황에서, 파이썬 메모리 관리자는 가비지 수집, 메모리 압축 또는 기타 예방 절차와 같은 적절한 작업을 트리거 하거나 그러지 않을 수 있습니다. 앞의 예에서와같이 C 라이브러리 할당자를 사용하면, I/O 버퍼에 할당된 메모리가 파이썬 메모리 관리자를 완전히 우회하게 됨에 유의하십시오.


@subsubheading 더 보기


@geindex PYTHONMALLOC
@geindex 환경 변수; PYTHONMALLOC
@ref{e5d,,PYTHONMALLOC} 환경 변수를 사용하여 파이썬에서 사용하는 메모리 할당자를 구성할 수 있습니다.

@geindex PYTHONMALLOCSTATS
@geindex 환경 변수; PYTHONMALLOCSTATS
@ref{1f33,,PYTHONMALLOCSTATS} 환경 변수는 새로운 pymalloc 객체 아레나(arena)가 만들어질 때마다 그리고 종료 시 @ref{f0a,,pymalloc 메모리 할당자}의 통계를 인쇄하는 데 사용될 수 있습니다.


@node Allocator Domains,원시 메모리 인터페이스,개요<4>,메모리 관리
@anchor{c-api/memory allocator-domains}@anchor{55fc}
@subsection Allocator Domains

@anchor{c-api/memory id1}@anchor{55fd}
All allocating functions belong to one of three different “domains” (see also
@ref{55fe,,PyMemAllocatorDomain}). These domains represent different allocation
strategies and are optimized for different purposes. The specific details on
how every domain allocates memory or what internal functions each domain calls
is considered an implementation detail, but for debugging purposes a simplified
table can be found at @ref{2138,,기본 메모리 할당자}.
The APIs used to allocate and free a block of memory must be from the same domain.
For example, @ref{1647,,PyMem_Free()} must be used to free memory allocated using @ref{e5e,,PyMem_Malloc()}.

The three allocation domains are:


@itemize *

@item 
Raw domain: intended for allocating memory for general-purpose memory
buffers where the allocation `must' go to the system allocator or where the
allocator can operate without an @ref{4f10,,attached thread state}. The memory
is requested directly from the system. See @ref{55ff,,Raw Memory Interface}.

@item 
“Mem” domain: intended for allocating memory for Python buffers and
general-purpose memory buffers where the allocation must be performed with
an @ref{4f10,,attached thread state}. The memory is taken from the Python private heap.
See @ref{5600,,Memory Interface}.

@item 
Object domain: intended for allocating memory for Python objects. The
memory is taken from the Python private heap. See @ref{5601,,Object allocators}.
@end itemize

@cartouche
@quotation 참고 
The @ref{1f4,,free-threaded} build requires that only Python objects are allocated using the “object” domain
and that all Python objects are allocated using that domain. This differs from the prior Python versions,
where this was only a best practice and not a hard requirement.

For example, buffers (non-Python objects) should be allocated using @ref{e5e,,PyMem_Malloc()},
@ref{62f,,PyMem_RawMalloc()}, or @code{malloc()}, but not @ref{e61,,PyObject_Malloc()}.

See @ref{5602,,Memory Allocation APIs}.
@end quotation
@end cartouche

@node 원시 메모리 인터페이스,메모리 인터페이스,Allocator Domains,메모리 관리
@anchor{c-api/memory raw-memory-interface}@anchor{5603}@anchor{c-api/memory raw-memoryinterface}@anchor{55ff}
@subsection 원시 메모리 인터페이스


The following function sets are wrappers to the system allocator. These
functions are thread-safe, so a @ref{1848,,thread state} does not
need to be @ref{4f10,,attached}.

@ref{2138,,기본 원시 메모리 할당자}는 다음 함수를 사용합니다: @code{malloc()}, @code{calloc()}, @code{realloc()} 및 @code{free()}; 0바이트를 요청할 때 @code{malloc(1)}(또는 @code{calloc(1, 1)})을 호출합니다.


Added in version 3.4.


@geindex PyMem_RawMalloc (C function)
@anchor{c-api/memory c PyMem_RawMalloc}@anchor{62f}
@deffn {C 함수} void *PyMem_RawMalloc (size_t n)
` Part of the @ref{774,,안정 ABI} 버전 3.13 이후로.'
`n' 바이트를 할당하고 할당된 메모리를 가리키는 void* 형의 포인터를 반환하거나, 요청이 실패하면 @code{NULL}을 반환합니다.

0바이트를 요청하면 가능하면 @code{PyMem_RawMalloc(1)}이 대신 호출된 것처럼 가능하면 고유한 @code{NULL}이 아닌 포인터를 반환합니다. 메모리는 어떤 식으로든 초기화되지 않습니다.
@end deffn

@geindex PyMem_RawCalloc (C function)
@anchor{c-api/memory c PyMem_RawCalloc}@anchor{630}
@deffn {C 함수} void *PyMem_RawCalloc (size_t nelem, size_t elsize)
` Part of the @ref{774,,안정 ABI} 버전 3.13 이후로.'
크기가 각각 `elsize' 바이트인 `nelem' 개의 요소를 할당하고 할당된 메모리를 가리키는 void* 형의 포인터를 반환하거나, 요청이 실패하면 @code{NULL}을 반환합니다. 메모리는 0으로 초기화됩니다.

0개의 요소나 0바이트 크기의 요소를 요청하면 @code{PyMem_RawCalloc(1, 1)}이 대신 호출된 것처럼 가능하면 고유한 @code{NULL}이 아닌 포인터를 반환합니다.


Added in version 3.5.

@end deffn

@geindex PyMem_RawRealloc (C function)
@anchor{c-api/memory c PyMem_RawRealloc}@anchor{631}
@deffn {C 함수} void *PyMem_RawRealloc (void *p, size_t n)
` Part of the @ref{774,,안정 ABI} 버전 3.13 이후로.'
`p'가 가리키는 메모리 블록의 크기를 `n' 바이트로 조정합니다. 내용은 이전과 새로운 크기의 최솟값 내에서는 변경되지 않습니다.

`p'가 @code{NULL}이면, 호출은 @code{PyMem_RawMalloc(n)}과 동등합니다; `n'이 0과 같으면, 메모리 블록의 크기는 조정되지만 해제되지는 않고, 반환된 포인터는 @code{NULL}이 아닙니다.

`p'가 @code{NULL}이 아닌 한, @ref{62f,,PyMem_RawMalloc()}, @ref{631,,PyMem_RawRealloc()} 또는 @ref{630,,PyMem_RawCalloc()}에 대한 이전 호출에 의해 반환된 것이어야 합니다.

요청이 실패하면, @ref{631,,PyMem_RawRealloc()}은 @code{NULL}을 반환하고 `p'는 이전 메모리 영역에 대한 유효한 포인터로 유지됩니다.
@end deffn

@geindex PyMem_RawFree (C function)
@anchor{c-api/memory c PyMem_RawFree}@anchor{632}
@deffn {C 함수} void PyMem_RawFree (void *p)
` Part of the @ref{774,,안정 ABI} 버전 3.13 이후로.'
`p'가 가리키는 메모리 블록을 해제합니다. `p'는 @ref{62f,,PyMem_RawMalloc()}, @ref{631,,PyMem_RawRealloc()} 또는 @ref{630,,PyMem_RawCalloc()}에 대한 이전 호출로 반환된 것이어야 합니다. 그렇지 않거나 @code{PyMem_RawFree(p)}가 앞서 호출되었으면, 정의되지 않은 동작이 일어납니다.

`p'가 @code{NULL}이면, 아무 작업도 수행되지 않습니다.
@end deffn

@node 메모리 인터페이스,객체 할당자,원시 메모리 인터페이스,메모리 관리
@anchor{c-api/memory memory-interface}@anchor{5604}@anchor{c-api/memory memoryinterface}@anchor{5600}
@subsection 메모리 인터페이스


ANSI C 표준에 따라 모델링 되었지만 0바이트를 요청할 때의 동작을 지정한 다음 함수 집합은 파이썬 힙에서 메모리를 할당하고 해제하는 데 사용할 수 있습니다.

In the GIL-enabled build (default build) the
@ref{2138,,default memory allocator} uses the
@ref{f0a,,pymalloc memory allocator}, whereas in the
@ref{1767,,free-threaded build}, the default is the
@ref{213a,,mimalloc memory allocator} instead.

@cartouche
@quotation 경고 
There must be an @ref{4f10,,attached thread state} when using these functions.
@end quotation
@end cartouche


버전 3.6에서 변경: 기본 할당자는 이제 시스템 @code{malloc()} 대신 pymalloc 입니다.



버전 3.13에서 변경: In the @ref{1f4,,free-threaded} build, the default allocator
is now @ref{213a,,mimalloc}.


@geindex PyMem_Malloc (C function)
@anchor{c-api/memory c PyMem_Malloc}@anchor{e5e}
@deffn {C 함수} void *PyMem_Malloc (size_t n)
` Part of the @ref{774,,안정 ABI}.'
`n' 바이트를 할당하고 할당된 메모리를 가리키는 void* 형의 포인터를 반환하거나, 요청이 실패하면 @code{NULL}을 반환합니다.

0바이트를 요청하면 @code{PyMem_Malloc(1)}이 대신 호출된 것처럼 가능하면 고유한 @code{NULL}이 아닌 포인터를 반환합니다. 메모리는 어떤 식으로든 초기화되지 않습니다.
@end deffn

@geindex PyMem_Calloc (C function)
@anchor{c-api/memory c PyMem_Calloc}@anchor{10ac}
@deffn {C 함수} void *PyMem_Calloc (size_t nelem, size_t elsize)
` Part of the @ref{774,,안정 ABI} 버전 3.7 이후로.'
크기가 각각 `elsize' 바이트인 `nelem' 개의 요소를 할당하고 할당된 메모리를 가리키는 void* 형의 포인터를 반환하거나, 요청이 실패하면 @code{NULL}을 반환합니다. 메모리는 0으로 초기화됩니다.

0개의 요소나 0바이트 크기의 요소를 요청하면 @code{PyMem_Calloc(1, 1)}이 대신 호출된 것처럼 가능하면 고유한 @code{NULL}이 아닌 포인터를 반환합니다.


Added in version 3.5.

@end deffn

@geindex PyMem_Realloc (C function)
@anchor{c-api/memory c PyMem_Realloc}@anchor{1231}
@deffn {C 함수} void *PyMem_Realloc (void *p, size_t n)
` Part of the @ref{774,,안정 ABI}.'
`p'가 가리키는 메모리 블록의 크기를 `n' 바이트로 조정합니다. 내용은 이전과 새로운 크기의 최솟값 내에서는 변경되지 않습니다.

`p'가 @code{NULL}이면, 호출은 @code{PyMem_Malloc(n)}과 동등합니다; 그렇지 않고 `n'이 0과 같으면, 메모리 블록의 크기는 조정되지만 해제되지는 않으며, 반환된 포인터는 @code{NULL}이 아닙니다.

`p'가 @code{NULL}이 아닌 한, @ref{e5e,,PyMem_Malloc()}, @ref{1231,,PyMem_Realloc()} 또는 @ref{10ac,,PyMem_Calloc()}에 대한 이전 호출이 반환한 것이어야 합니다.

요청이 실패하면, @ref{1231,,PyMem_Realloc()}은 @code{NULL}을 반환하고 `p'는 이전 메모리 영역에 대한 유효한 포인터로 유지됩니다.
@end deffn

@geindex PyMem_Free (C function)
@anchor{c-api/memory c PyMem_Free}@anchor{1647}
@deffn {C 함수} void PyMem_Free (void *p)
` Part of the @ref{774,,안정 ABI}.'
`p'가 가리키는 메모리 블록을 해제합니다. `p'는 @ref{e5e,,PyMem_Malloc()}, @ref{1231,,PyMem_Realloc()} 또는 @ref{10ac,,PyMem_Calloc()}에 대한 이전 호출이 반환한 것이어야 합니다. 그렇지 않거나 @code{PyMem_Free(p)}가 앞서 호출되었으면 정의되지 않은 동작이 일어납니다.

`p'가 @code{NULL}이면, 아무 작업도 수행되지 않습니다.
@end deffn

편의를 위해 다음과 같은 형 지향 매크로가 제공됩니다. `TYPE'이 모든 C형을 나타냄에 유의하십시오.

@geindex PyMem_New (C macro)
@anchor{c-api/memory c PyMem_New}@anchor{1729}
@deffn {C 매크로} PyMem_New (TYPE, n)

@ref{e5e,,PyMem_Malloc()}과 같지만, @code{(n * sizeof(TYPE))} 바이트의 메모리를 할당합니다. @code{TYPE*}로 캐스트 된 포인터를 반환합니다. 메모리는 어떤 식으로든 초기화되지 않습니다.
@end deffn

@geindex PyMem_Resize (C macro)
@anchor{c-api/memory c PyMem_Resize}@anchor{5605}
@deffn {C 매크로} PyMem_Resize (p, TYPE, n)

@ref{1231,,PyMem_Realloc()}과 같지만, 메모리 블록의 크기는 @code{(n * sizeof(TYPE))} 바이트로 조정됩니다. @code{TYPE*}로 캐스트 된 포인터를 반환합니다. 반환한 후에, `p'는 새로운 메모리 영역에 대한 포인터이거나, 실패하면 @code{NULL}이 됩니다.

이것은 C 전처리기 매크로입니다; `p'는 항상 다시 대입됩니다. 에러를 처리할 때 메모리 손실을 피하려면 `p'의 원래 값을 보관하십시오.
@end deffn

@geindex PyMem_Del (C function)
@anchor{c-api/memory c PyMem_Del}@anchor{172a}
@deffn {C 함수} void PyMem_Del (void *p)

@ref{1647,,PyMem_Free()}와 같습니다.
@end deffn

@menu
* Deprecated aliases: Deprecated aliases<2>. 

@end menu

@node Deprecated aliases<2>,,,메모리 인터페이스
@anchor{c-api/memory deprecated-aliases}@anchor{5606}
@subsubsection Deprecated aliases


These are @ref{23d,,soft deprecated} aliases to existing functions and macros.
They exist solely for backwards compatibility.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Deprecated alias

@tab

Corresponding function or macro

@item

@geindex PyMem_MALLOC (C macro)
@anchor{c-api/memory c PyMem_MALLOC}@anchor{5607}
@deffn {C 매크로} PyMem_MALLOC (size)
@end deffn

@tab

@ref{e5e,,PyMem_Malloc()}

@item

@geindex PyMem_NEW (C macro)
@anchor{c-api/memory c PyMem_NEW}@anchor{5608}
@deffn {C 매크로} PyMem_NEW (type, size)
@end deffn

@tab

@ref{1729,,PyMem_New}

@item

@geindex PyMem_REALLOC (C macro)
@anchor{c-api/memory c PyMem_REALLOC}@anchor{5609}
@deffn {C 매크로} PyMem_REALLOC (ptr, size)
@end deffn

@tab

@ref{1231,,PyMem_Realloc()}

@item

@geindex PyMem_RESIZE (C macro)
@anchor{c-api/memory c PyMem_RESIZE}@anchor{560a}
@deffn {C 매크로} PyMem_RESIZE (ptr, type, size)
@end deffn

@tab

@ref{5605,,PyMem_Resize}

@item

@geindex PyMem_FREE (C macro)
@anchor{c-api/memory c PyMem_FREE}@anchor{560b}
@deffn {C 매크로} PyMem_FREE (ptr)
@end deffn

@tab

@ref{1647,,PyMem_Free()}

@item

@geindex PyMem_DEL (C macro)
@anchor{c-api/memory c PyMem_DEL}@anchor{560c}
@deffn {C 매크로} PyMem_DEL (ptr)
@end deffn

@tab

@ref{1647,,PyMem_Free()}

@end multitable



버전 3.4에서 변경: The macros are now aliases of the corresponding functions and macros.
Previously, their behavior was the same, but their use did not necessarily
preserve binary compatibility across Python versions.



버전 2.0부터 폐지됨.


@node 객체 할당자,기본 메모리 할당자,메모리 인터페이스,메모리 관리
@anchor{c-api/memory object-allocators}@anchor{560d}@anchor{c-api/memory objectinterface}@anchor{5601}
@subsection 객체 할당자


ANSI C 표준에 따라 모델링 되었지만 0바이트를 요청할 때의 동작을 지정한 다음 함수 집합은 파이썬 힙에서 메모리를 할당하고 해제하는 데 사용할 수 있습니다.

@cartouche
@quotation 참고 
There is no guarantee that the memory returned by these allocators can be
successfully cast to a Python object when intercepting the allocating
functions in this domain by the methods described in
the @ref{560e,,Customize Memory Allocators} section.
@end quotation
@end cartouche

The @ref{2138,,default object allocator} uses the
@ref{f0a,,pymalloc memory allocator}.  In the
@ref{1f4,,free-threaded} build, the default is the
@ref{213a,,mimalloc memory allocator} instead.

@cartouche
@quotation 경고 
There must be an @ref{4f10,,attached thread state} when using these functions.
@end quotation
@end cartouche

@geindex PyObject_Malloc (C function)
@anchor{c-api/memory c PyObject_Malloc}@anchor{e61}
@deffn {C 함수} void *PyObject_Malloc (size_t n)
` Part of the @ref{774,,안정 ABI}.'
`n' 바이트를 할당하고 할당된 메모리를 가리키는 void* 형의 포인터를 반환하거나, 요청이 실패하면 @code{NULL}을 반환합니다.

0바이트를 요청하면 @code{PyObject_Malloc(1)}이 대신 호출된 것처럼 가능하면 고유한 @code{NULL}이 아닌 포인터를 반환합니다. 메모리는 어떤 식으로든 초기화되지 않습니다.
@end deffn

@geindex PyObject_Calloc (C function)
@anchor{c-api/memory c PyObject_Calloc}@anchor{10ad}
@deffn {C 함수} void *PyObject_Calloc (size_t nelem, size_t elsize)
` Part of the @ref{774,,안정 ABI} 버전 3.7 이후로.'
크기가 각각 `elsize' 바이트인 `nelem' 개의 요소를 할당하고 할당된 메모리를 가리키는 void* 형의 포인터를 반환하거나, 요청이 실패하면 @code{NULL}을 반환합니다. 메모리는 0으로 초기화됩니다.

0개의 요소나 0바이트 크기의 요소를 요청하면 @code{PyObject_Calloc(1, 1)}이 대신 호출된 것처럼 가능하면 고유한 @code{NULL}이 아닌 포인터를 반환합니다.


Added in version 3.5.

@end deffn

@geindex PyObject_Realloc (C function)
@anchor{c-api/memory c PyObject_Realloc}@anchor{1648}
@deffn {C 함수} void *PyObject_Realloc (void *p, size_t n)
` Part of the @ref{774,,안정 ABI}.'
`p'가 가리키는 메모리 블록의 크기를 `n' 바이트로 조정합니다. 내용은 이전과 새로운 크기의 최솟값 내에서는 변경되지 않습니다.

`p'가 @code{NULL}이면, 호출은 @code{PyObject_Malloc(n)}과 동등합니다; 그렇지 않고 `n'이 0과 같으면, 메모리 블록의 크기는 조정되지만 해제되지 않고, 반환된 포인터는 @code{NULL}이 아닙니다.

`p'가 @code{NULL}이 아닌 한, @ref{e61,,PyObject_Malloc()}, @ref{1648,,PyObject_Realloc()} 또는 @ref{10ad,,PyObject_Calloc()}에 대한 이전 호출에 의해 반환된 것이어야 합니다.

요청이 실패하면, @ref{1648,,PyObject_Realloc()}은 @code{NULL}을 반환하고 `p'는 이전 메모리 영역에 대한 유효한 포인터로 유지됩니다.
@end deffn

@geindex PyObject_Free (C function)
@anchor{c-api/memory c PyObject_Free}@anchor{e5f}
@deffn {C 함수} void PyObject_Free (void *p)
` Part of the @ref{774,,안정 ABI}.'
`p'가 가리키는 메모리 블록을 해제합니다. 이 블록은 @ref{e61,,PyObject_Malloc()}, @ref{1648,,PyObject_Realloc()} 또는 @ref{10ad,,PyObject_Calloc()}에 대한 이전 호출에 의해 반환된 것이어야 합니다. 그렇지 않거나 @code{PyObject_Free(p)}가 이전에 호출되었으면 정의되지 않은 동작이 일어납니다.

`p'가 @code{NULL}이면, 아무 작업도 수행되지 않습니다.

Do not call this directly to free an object’s memory; call the type’s
@ref{4f0e,,tp_free} slot instead.

Do not use this for memory allocated by @ref{c98,,PyObject_GC_New} or
@ref{c99,,PyObject_GC_NewVar}; use @ref{1708,,PyObject_GC_Del()} instead.


@subsubheading 더 보기



@itemize *

@item 
@ref{1708,,PyObject_GC_Del()} is the equivalent of this function for memory
allocated by types that support garbage collection.

@item 
@ref{e61,,PyObject_Malloc()}

@item 
@ref{1648,,PyObject_Realloc()}

@item 
@ref{10ad,,PyObject_Calloc()}

@item 
@ref{b7b,,PyObject_New}

@item 
@ref{b7c,,PyObject_NewVar}

@item 
@ref{c5f,,PyType_GenericAlloc()}

@item 
@ref{4f0e,,tp_free}
@end itemize

@end deffn

@node 기본 메모리 할당자,메모리 할당자 사용자 정의,객체 할당자,메모리 관리
@anchor{c-api/memory default-memory-allocators}@anchor{2138}@anchor{c-api/memory id2}@anchor{560f}
@subsection 기본 메모리 할당자


기본 메모리 할당자:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

구성

@tab

이름

@tab

PyMem_RawMalloc

@tab

PyMem_Malloc

@tab

PyObject_Malloc

@item

릴리스 빌드

@tab

@code{"pymalloc"}

@tab

@code{malloc}

@tab

@code{pymalloc}

@tab

@code{pymalloc}

@item

디버그 빌드

@tab

@code{"pymalloc_debug"}

@tab

@code{malloc} + 디버그

@tab

@code{pymalloc} + 디버그

@tab

@code{pymalloc} + 디버그

@item

pymalloc 없는 배포 빌드

@tab

@code{"malloc"}

@tab

@code{malloc}

@tab

@code{malloc}

@tab

@code{malloc}

@item

pymalloc 없는 디버그 빌드

@tab

@code{"malloc_debug"}

@tab

@code{malloc} + 디버그

@tab

@code{malloc} + 디버그

@tab

@code{malloc} + 디버그

@item

Free-threaded build

@tab

@code{"mimalloc"}

@tab

@code{mimalloc}

@tab

@code{mimalloc}

@tab

@code{mimalloc}

@item

Free-threaded debug build

@tab

@code{"mimalloc_debug"}

@tab

@code{mimalloc} + debug

@tab

@code{mimalloc} + debug

@tab

@code{mimalloc} + debug

@end multitable


범례:


@itemize *

@item 
이름: 
@geindex PYTHONMALLOC
@geindex 환경 변수; PYTHONMALLOC
@ref{e5d,,PYTHONMALLOC} 환경 변수의 값.

@item 
@code{malloc}: 표준 C 라이브러리의 시스템 할당자, C 함수: @code{malloc()}, @code{calloc()}, @code{realloc()} 및 @code{free()}.

@item 
@code{pymalloc}: @ref{f0a,,pymalloc 메모리 할당자}.

@item 
@code{mimalloc}: @ref{213a,,mimalloc memory allocator}.

@item 
“+ 디버그”: @ref{213b,,파이썬 메모리 할당기의 디버그 훅} 포함.

@item 
“Debug build”: @ref{508,,Python build in debug mode}.
@end itemize

@node 메모리 할당자 사용자 정의,파이썬 메모리 할당자의 디버그 훅,기본 메모리 할당자,메모리 관리
@anchor{c-api/memory customize-memory-allocators}@anchor{560e}@anchor{c-api/memory id3}@anchor{5610}
@subsection 메모리 할당자 사용자 정의



Added in version 3.4.


@geindex PyMemAllocatorEx (C type)
@anchor{c-api/memory c PyMemAllocatorEx}@anchor{10cd}
@deffn {C 자료형} type PyMemAllocatorEx

메모리 블록 할당자를 기술하는 데 사용되는 구조체. 구조체에는 다음과 같은 필드가 있습니다:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

필드

@tab

의미

@item

@code{void *ctx}

@tab

첫 번째 인자로 전달된 사용자 컨텍스트

@item

@code{void* malloc(void *ctx, size_t size)}

@tab

메모리 블록을 할당합니다

@item

@code{void* calloc(void *ctx, size_t nelem, size_t elsize)}

@tab

0으로 초기화된 메모리 블록을 할당합니다

@item

@code{void* realloc(void *ctx, void *ptr, size_t new_size)}

@tab

메모리 블록을 할당하거나 크기 조정합니다

@item

@code{void free(void *ctx, void *ptr)}

@tab

메모리 블록을 해제합니다

@end multitable



버전 3.5에서 변경: @code{PyMemAllocator} 구조체의 이름이 @ref{10cd,,PyMemAllocatorEx}로 바뀌고 새로운 @code{calloc} 필드가 추가되었습니다.

@end deffn

@geindex PyMemAllocatorDomain (C type)
@anchor{c-api/memory c PyMemAllocatorDomain}@anchor{55fe}
@deffn {C 자료형} type PyMemAllocatorDomain

할당자 도메인을 식별하는 데 사용되는 열거형. 도메인:

@geindex PYMEM_DOMAIN_RAW (C macro)
@anchor{c-api/memory c PYMEM_DOMAIN_RAW}@anchor{2139}
@deffn {C 매크로} PYMEM_DOMAIN_RAW

함수:


@itemize *

@item 
@ref{62f,,PyMem_RawMalloc()}

@item 
@ref{631,,PyMem_RawRealloc()}

@item 
@ref{630,,PyMem_RawCalloc()}

@item 
@ref{632,,PyMem_RawFree()}
@end itemize
@end deffn

@geindex PYMEM_DOMAIN_MEM (C macro)
@anchor{c-api/memory c PYMEM_DOMAIN_MEM}@anchor{e62}
@deffn {C 매크로} PYMEM_DOMAIN_MEM

함수:


@itemize *

@item 
@ref{e5e,,PyMem_Malloc()},

@item 
@ref{1231,,PyMem_Realloc()}

@item 
@ref{10ac,,PyMem_Calloc()}

@item 
@ref{1647,,PyMem_Free()}
@end itemize
@end deffn

@geindex PYMEM_DOMAIN_OBJ (C macro)
@anchor{c-api/memory c PYMEM_DOMAIN_OBJ}@anchor{e60}
@deffn {C 매크로} PYMEM_DOMAIN_OBJ

함수:


@itemize *

@item 
@ref{e61,,PyObject_Malloc()}

@item 
@ref{1648,,PyObject_Realloc()}

@item 
@ref{10ad,,PyObject_Calloc()}

@item 
@ref{e5f,,PyObject_Free()}
@end itemize
@end deffn
@end deffn

@geindex PyMem_GetAllocator (C function)
@anchor{c-api/memory c PyMem_GetAllocator}@anchor{5550}
@deffn {C 함수} void PyMem_GetAllocator (PyMemAllocatorDomain domain, PyMemAllocatorEx *allocator)

지정된 도메인의 메모리 블록 할당자를 가져옵니다.
@end deffn

@geindex PyMem_SetAllocator (C function)
@anchor{c-api/memory c PyMem_SetAllocator}@anchor{7a7}
@deffn {C 함수} void PyMem_SetAllocator (PyMemAllocatorDomain domain, PyMemAllocatorEx *allocator)

지정된 도메인의 메모리 블록 할당자를 설정합니다.

새 할당자는 0바이트를 요청할 때 고유한 @code{NULL}이 아닌 포인터를 반환해야 합니다.

For the @ref{2139,,PYMEM_DOMAIN_RAW} domain, the allocator must be
thread-safe: a @ref{1848,,thread state} is not @ref{4f10,,attached}
when the allocator is called.

For the remaining domains, the allocator must also be thread-safe:
the allocator may be called in different interpreters that do not
share a @ref{164,,GIL}.

새 할당자가 훅이 아니면 (이전 할당자를 호출하지 않으면), @ref{e63,,PyMem_SetupDebugHooks()} 함수를 호출하여 새 할당자 위에 디버그 훅을 다시 설치해야 합니다.

See also @ref{55c0,,PyPreConfig.allocator} and @ref{4306,,Preinitialize Python with PyPreConfig}.

@cartouche
@quotation 경고 
@ref{7a7,,PyMem_SetAllocator()} does have the following contract:


@itemize *

@item 
It can be called after @ref{41e,,Py_PreInitialize()} and before
@ref{3f6,,Py_InitializeFromConfig()} to install a custom memory
allocator. There are no restrictions over the installed allocator
other than the ones imposed by the domain (for instance, the Raw
Domain allows the allocator to be called without an @ref{4f10,,attached thread state}).
See @ref{55fd,,the section on allocator domains} for more
information.

@item 
If called after Python has finish initializing (after
@ref{3f6,,Py_InitializeFromConfig()} has been called) the allocator
`must' wrap the existing allocator. Substituting the current
allocator for some other arbitrary one is `not supported'.
@end itemize
@end quotation
@end cartouche


버전 3.12에서 변경: All allocators must be thread-safe.

@end deffn

@geindex PyMem_SetupDebugHooks (C function)
@anchor{c-api/memory c PyMem_SetupDebugHooks}@anchor{e63}
@deffn {C 함수} void PyMem_SetupDebugHooks (void)

Setup @ref{213b,,debug hooks in the Python memory allocators}
to detect memory errors.
@end deffn

@node 파이썬 메모리 할당자의 디버그 훅,pymalloc 할당자,메모리 할당자 사용자 정의,메모리 관리
@anchor{c-api/memory debug-hooks-on-the-python-memory-allocators}@anchor{5611}@anchor{c-api/memory pymem-debug-hooks}@anchor{213b}
@subsection 파이썬 메모리 할당자의 디버그 훅


When @ref{508,,Python is built in debug mode}, the
@ref{e63,,PyMem_SetupDebugHooks()} function is called at the @ref{4306,,Python preinitialization} to setup debug hooks on Python memory allocators
to detect memory errors.

@geindex PYTHONMALLOC
@geindex 환경 변수; PYTHONMALLOC
@ref{e5d,,PYTHONMALLOC} 환경 변수를 사용하여 릴리스 모드에서 컴파일된 파이썬에 디버그 훅을 설치할 수 있습니다 (예: @code{PYTHONMALLOC=debug}).

The @ref{e63,,PyMem_SetupDebugHooks()} function can be used to set debug hooks
after calling @ref{7a7,,PyMem_SetAllocator()}.

이 디버그 훅은 동적으로 할당된 메모리 블록을 특수하고, 인식 가능한 비트 패턴으로 채웁니다. 새로 할당된 메모리는 바이트 @code{0xCD}(@code{PYMEM_CLEANBYTE})로 채워지고, 해제된 메모리는 바이트 @code{0xDD}(@code{PYMEM_DEADBYTE})로 채워집니다. 메모리 블록은 바이트 @code{0xFD} (@code{PYMEM_FORBIDDENBYTE})로 채워진 “금지된 바이트”로 둘러싸입니다. 이 바이트들의 문자열은 유효한 주소, 부동 소수점 또는 ASCII 문자열일 가능성이 낮습니다.

실행 시간 검사:


@itemize -

@item 
API 위반 탐지. 예를 들어, @ref{e5e,,PyMem_Malloc()}이 할당한 메모리 블록에 @ref{e5f,,PyObject_Free()}가 호출되었는지 탐지합니다.

@item 
버퍼 시작 전에 쓰기 감지 (버퍼 언더플로).

@item 
버퍼 끝 뒤에 쓰기 감지 (버퍼 오버플로).

@item 
Check that there is an @ref{4f10,,attached thread state} when
allocator functions of @ref{e60,,PYMEM_DOMAIN_OBJ} (ex:
@ref{e61,,PyObject_Malloc()}) and @ref{e62,,PYMEM_DOMAIN_MEM} (ex:
@ref{e5e,,PyMem_Malloc()}) domains are called.
@end itemize

에러가 발생하면, 디버그 훅은 @ref{105,,tracemalloc} 모듈을 사용하여 메모리 블록이 할당된 곳의 트레이스백을 가져옵니다. @code{tracemalloc}이 파이썬 메모리 할당을 추적 중이고 메모리 블록이 추적될 때만 트레이스백이 표시됩니다.

Let `S' = @code{sizeof(size_t)}. @code{2*S} bytes are added at each end of each block
of `N' bytes requested.  The memory layout is like so, where p represents the
address returned by a malloc-like or realloc-like function (@code{p[i:j]} means
the slice of bytes from @code{*(p+i)} inclusive up to @code{*(p+j)} exclusive; note
that the treatment of negative indices differs from a Python slice):


@table @asis

@item @code{p[-2*S:-S]}

Number of bytes originally asked for.  This is a size_t, big-endian (easier
to read in a memory dump).

@item @code{p[-S]}

API identifier (ASCII character):


@itemize *

@item 
@code{'r'} for @ref{2139,,PYMEM_DOMAIN_RAW}.

@item 
@code{'m'} for @ref{e62,,PYMEM_DOMAIN_MEM}.

@item 
@code{'o'} for @ref{e60,,PYMEM_DOMAIN_OBJ}.
@end itemize

@item @code{p[-S+1:0]}

Copies of PYMEM_FORBIDDENBYTE.  Used to catch under- writes and reads.

@item @code{p[0:N]}

The requested memory, filled with copies of PYMEM_CLEANBYTE, used to catch
reference to uninitialized memory.  When a realloc-like function is called
requesting a larger memory block, the new excess bytes are also filled with
PYMEM_CLEANBYTE.  When a free-like function is called, these are
overwritten with PYMEM_DEADBYTE, to catch reference to freed memory.  When
a realloc- like function is called requesting a smaller memory block, the
excess old bytes are also filled with PYMEM_DEADBYTE.

@item @code{p[N:N+S]}

Copies of PYMEM_FORBIDDENBYTE.  Used to catch over- writes and reads.

@item @code{p[N+S:N+2*S]}

Only used if the @code{PYMEM_DEBUG_SERIALNO} macro is defined (not defined by
default).

A serial number, incremented by 1 on each call to a malloc-like or
realloc-like function.  Big-endian @code{size_t}.  If “bad memory” is detected
later, the serial number gives an excellent way to set a breakpoint on the
next run, to capture the instant at which this block was passed out.  The
static function bumpserialno() in obmalloc.c is the only place the serial
number is incremented, and exists so you can set such a breakpoint easily.
@end table

A realloc-like or free-like function first checks that the PYMEM_FORBIDDENBYTE
bytes at each end are intact.  If they’ve been altered, diagnostic output is
written to stderr, and the program is aborted via Py_FatalError().  The other
main failure mode is provoking a memory error when a program reads up one of
the special bit patterns and tries to use it as an address.  If you get in a
debugger then and look at the object, you’re likely to see that it’s entirely
filled with PYMEM_DEADBYTE (meaning freed memory is getting used) or
PYMEM_CLEANBYTE (meaning uninitialized memory is getting used).


버전 3.6에서 변경: The @ref{e63,,PyMem_SetupDebugHooks()} function now also works on Python
compiled in release mode.  On error, the debug hooks now use
@ref{105,,tracemalloc} to get the traceback where a memory block was allocated.
The debug hooks now also check if there is an @ref{4f10,,attached thread state} when
functions of @ref{e60,,PYMEM_DOMAIN_OBJ} and @ref{e62,,PYMEM_DOMAIN_MEM} domains are
called.



버전 3.8에서 변경: 바이트 패턴 @code{0xCB}(@code{PYMEM_CLEANBYTE}), @code{0xDB}(@code{PYMEM_DEADBYTE}) 및 @code{0xFB}(@code{PYMEM_FORBIDDENBYTE})는 윈도우 CRT 디버그 @code{malloc()} 및 @code{free()}와 같은 값을 사용하도록 @code{0xCD}, @code{0xDD} 및 @code{0xFD}로 대체되었습니다.


@node pymalloc 할당자,mimalloc 할당자,파이썬 메모리 할당자의 디버그 훅,메모리 관리
@anchor{c-api/memory pymalloc}@anchor{f0a}@anchor{c-api/memory the-pymalloc-allocator}@anchor{5612}
@subsection pymalloc 할당자


파이썬에는 수명이 짧은 작은 (512바이트 이하) 객체에 최적화된 `pymalloc' 할당자가 있습니다. 32-비트 플랫폼에서는 256 KiB, 64-비트 플랫폼에서는 1 MiB의 고정 크기를 갖는 “아레나(arena)”라는 메모리 매핑을 사용합니다. 512 바이트보다 큰 할당의 경우 @ref{62f,,PyMem_RawMalloc()}과 @ref{631,,PyMem_RawRealloc()}으로 대체됩니다.

`pymalloc'은 @ref{e62,,PYMEM_DOMAIN_MEM}(예: @ref{e5e,,PyMem_Malloc()})과 @ref{e60,,PYMEM_DOMAIN_OBJ}(예: @ref{e61,,PyObject_Malloc()}) 도메인의 @ref{2138,,기본 할당자}입니다.

아레나 할당자는 다음 함수를 사용합니다:


@itemize *

@item 
윈도우에서 @code{VirtualAlloc()}과 @code{VirtualFree()},

@item 
사용할 수 있으면 @code{mmap()}과 @code{munmap()}

@item 
그렇지 않으면 @code{malloc()}과 @code{free()}
@end itemize

This allocator is disabled if Python is configured with the
@ref{219e,,--without-pymalloc} option. It can also be disabled at runtime using
the 
@geindex PYTHONMALLOC
@geindex 환경 변수; PYTHONMALLOC
@ref{e5d,,PYTHONMALLOC} environment variable (ex: @code{PYTHONMALLOC=malloc}).

Typically, it makes sense to disable the pymalloc allocator when building
Python with AddressSanitizer (@ref{21a7,,--with-address-sanitizer}) which helps
uncover low level bugs within the C code.

@menu
* pymalloc 아레나 할당자 사용자 정의:: 

@end menu

@node pymalloc 아레나 할당자 사용자 정의,,,pymalloc 할당자
@anchor{c-api/memory customize-pymalloc-arena-allocator}@anchor{5613}
@subsubsection pymalloc 아레나 할당자 사용자 정의



Added in version 3.4.


@geindex PyObjectArenaAllocator (C type)
@anchor{c-api/memory c PyObjectArenaAllocator}@anchor{5614}
@deffn {C 자료형} type PyObjectArenaAllocator

아레나 할당자를 기술하는 데 사용되는 구조체. 이 구조체에는 세 개의 필드가 있습니다:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

필드

@tab

의미

@item

@code{void *ctx}

@tab

첫 번째 인자로 전달된 사용자 컨텍스트

@item

@code{void* alloc(void *ctx, size_t size)}

@tab

size 바이트의 아레나를 할당합니다

@item

@code{void free(void *ctx, void *ptr, size_t size)}

@tab

아레나를 해제합니다

@end multitable

@end deffn

@geindex PyObject_GetArenaAllocator (C function)
@anchor{c-api/memory c PyObject_GetArenaAllocator}@anchor{5551}
@deffn {C 함수} void PyObject_GetArenaAllocator (PyObjectArenaAllocator *allocator)

아레나 할당자를 얻습니다.
@end deffn

@geindex PyObject_SetArenaAllocator (C function)
@anchor{c-api/memory c PyObject_SetArenaAllocator}@anchor{554f}
@deffn {C 함수} void PyObject_SetArenaAllocator (PyObjectArenaAllocator *allocator)

아레나 할당자를 설정합니다.
@end deffn

@node mimalloc 할당자,tracemalloc C API,pymalloc 할당자,메모리 관리
@anchor{c-api/memory mimalloc}@anchor{213a}@anchor{c-api/memory the-mimalloc-allocator}@anchor{5615}
@subsection mimalloc 할당자



Added in version 3.13.


Python supports the mimalloc@footnote{https://github.com/microsoft/mimalloc/}
allocator when the underlying platform support is available.
mimalloc is a general purpose allocator with excellent performance
characteristics, initially developed by Daan Leijen for the runtime systems
of the Koka and Lean languages.

Unlike @ref{f0a,,pymalloc}, which is optimized for small objects (512
bytes or fewer), mimalloc handles allocations of any size.

In the @ref{1f4,,free-threaded} build, mimalloc is the default
and `required' allocator for the @ref{e62,,PYMEM_DOMAIN_MEM} and
@ref{e60,,PYMEM_DOMAIN_OBJ} domains.  It cannot be disabled in free-threaded
builds.  The free-threaded build uses per-thread mimalloc heaps, which allows
allocation and deallocation to proceed without locking in most cases.

In the default (non-free-threaded) build, mimalloc is available but not the
default allocator.  It can be selected at runtime using
@geindex PYTHONMALLOC
@geindex 환경 변수; PYTHONMALLOC
@ref{e5d,,PYTHONMALLOC}@code{=mimalloc} (or @code{mimalloc_debug} to include
@ref{213b,,debug hooks}).  It can be disabled at build time
using the @ref{219d,,--without-mimalloc} configure option, but this option
cannot be combined with @ref{49a,,--disable-gil}.

@node tracemalloc C API,예<18>,mimalloc 할당자,메모리 관리
@anchor{c-api/memory tracemalloc-c-api}@anchor{5616}
@subsection tracemalloc C API



Added in version 3.7.


@geindex PyTraceMalloc_Track (C function)
@anchor{c-api/memory c PyTraceMalloc_Track}@anchor{dae}
@deffn {C 함수} int PyTraceMalloc_Track (unsigned int domain, uintptr_t ptr, size_t size)

@ref{105,,tracemalloc} 모듈에서 할당된 메모리 블록을 추적합니다.

성공하면 @code{0}을 반환하고, 에러가 발생하면 (추적을 저장하기 위한 메모리를 할당하지 못했습니다) @code{-1}을 반환합니다. tracemalloc이 비활성화되었으면 @code{-2}를 반환합니다.

메모리 블록이 이미 추적되면, 기존 추적을 갱신합니다.
@end deffn

@geindex PyTraceMalloc_Untrack (C function)
@anchor{c-api/memory c PyTraceMalloc_Untrack}@anchor{daf}
@deffn {C 함수} int PyTraceMalloc_Untrack (unsigned int domain, uintptr_t ptr)

@ref{105,,tracemalloc} 모듈에서 할당된 메모리 블록을 추적 해제합니다. 블록이 추적되지 않으면 아무것도 하지 않습니다.

tracemalloc이 비활성화되었으면 @code{-2}를 반환하고, 그렇지 않으면 @code{0}을 반환합니다.
@end deffn

@node 예<18>,,tracemalloc C API,메모리 관리
@anchor{c-api/memory examples}@anchor{5617}@anchor{c-api/memory memoryexamples}@anchor{5618}
@subsection 예


다음은 @ref{55fa,,개요} 섹션에서 따온 예제입니다. I/O 버퍼가 첫 번째 함수 집합을 사용하여 파이썬 힙에서 할당되도록 다시 작성되었습니다:

@example
PyObject *res;
char *buf = (char *) PyMem_Malloc(BUFSIZ); /* I/O 용 */

if (buf == NULL)
    return PyErr_NoMemory();
/* ...buf 를 사용하는 I/O 연산을 수행합니다... */
res = PyBytes_FromString(buf);
PyMem_Free(buf); /* PyMem_Malloc 으로 할당했습니다 */
return res;
@end example

형 지향 함수 집합을 사용하는 같은 코드입니다:

@example
PyObject *res;
char *buf = PyMem_New(char, BUFSIZ); /* for I/O */

if (buf == NULL)
    return PyErr_NoMemory();
/* ...Do some I/O operation involving buf... */
res = PyBytes_FromString(buf);
PyMem_Free(buf); /* allocated with PyMem_New */
return res;
@end example

위의 두 가지 예에서, 버퍼는 항상 같은 집합에 속하는 함수를 통해 조작됨에 유의하십시오. 실제로, 서로 다른 할당자를 혼합할 위험이 최소로 줄어들도록, 주어진 메모리 블록에 대해 같은 메모리 API 패밀리를 사용하는 것은 필수입니다 . 다음 코드 시퀀스에는 두 개의 에러가 있으며, 그중 하나는 서로 다른 힙에서 작동하는 두 개의 다른 할당자를 혼합하기 때문에 `치명적(fatal)'인 것으로 표시됩니다.

@example
char *buf1 = PyMem_New(char, BUFSIZ);
char *buf2 = (char *) malloc(BUFSIZ);
char *buf3 = (char *) PyMem_Malloc(BUFSIZ);
...
PyMem_Del(buf3);  /* Wrong -- should be PyMem_Free() */
free(buf2);       /* Right -- allocated via malloc() */
free(buf1);       /* Fatal -- should be PyMem_Free()  */
@end example

In addition to the functions aimed at handling raw memory blocks from the Python
heap, objects in Python are allocated and released with @ref{b7b,,PyObject_New},
@ref{b7c,,PyObject_NewVar} and @ref{e5f,,PyObject_Free()}.

이것들은 C로 새로운 객체 형을 정의하고 구현하는 것에 대한 다음 장에서 설명될 것입니다.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 객체 구현 지원,API와 ABI 버전 붙이기,메모리 관리,Python/C API reference manual
@anchor{c-api/objimpl doc}@anchor{5619}@anchor{c-api/objimpl newtypes}@anchor{561a}@anchor{c-api/objimpl object-implementation-support}@anchor{561b}@anchor{c-api/objimpl translation-repo}@anchor{561c}
@section 객체 구현 지원


이 장에서는 새 객체 형을 정의할 때 사용되는 함수, 형 및 매크로에 관해 설명합니다.

@menu
* 힙에 객체 할당하기:: 
* Object Life Cycle:: 
* 공통 객체 구조체:: 
* Type Object Structures:: 
* 순환 가비지 수집 지원:: 

@end menu

@node 힙에 객체 할당하기,Object Life Cycle,,객체 구현 지원
@anchor{c-api/allocation doc}@anchor{561d}@anchor{c-api/allocation allocating-objects}@anchor{561e}@anchor{c-api/allocation allocating-objects-on-the-heap}@anchor{561f}
@subsection 힙에 객체 할당하기


@geindex _PyObject_New (C function)
@anchor{c-api/allocation c _PyObject_New}@anchor{5620}
@deffn {C 함수} @ref{5dc,,PyObject} *_PyObject_New (PyTypeObject *type)
`반환값: 새 참조.'
@end deffn

@geindex _PyObject_NewVar (C function)
@anchor{c-api/allocation c _PyObject_NewVar}@anchor{5621}
@deffn {C 함수} @ref{4715,,PyVarObject} *_PyObject_NewVar (PyTypeObject *type, Py_ssize_t size)
`반환값: 새 참조.'
@end deffn

@geindex PyObject_Init (C function)
@anchor{c-api/allocation c PyObject_Init}@anchor{c60}
@deffn {C 함수} @ref{5dc,,PyObject} *PyObject_Init (PyObject *op, PyTypeObject *type)
`반환값: 빌린 참조.'` Part of the @ref{774,,안정 ABI}.'
Initialize a newly allocated object `op' with its type and initial
reference.  Returns the initialized object.  Other fields of the object are
not initialized.  Despite its name, this function is unrelated to the
object’s @ref{8be,,__init__()} method (@ref{7a0,,tp_init}
slot).  Specifically, this function does `not' call the object’s
@code{__init__()} method.

In general, consider this function to be a low-level routine. Use
@ref{4f0f,,tp_alloc} where possible.
For implementing @code{tp_alloc} for your type, prefer
@ref{c5f,,PyType_GenericAlloc()} or @ref{b7b,,PyObject_New()}.

@cartouche
@quotation 참고 
This function only initializes the object’s memory corresponding to the
initial @ref{5dc,,PyObject} structure.  It does not zero the rest.
@end quotation
@end cartouche
@end deffn

@geindex PyObject_InitVar (C function)
@anchor{c-api/allocation c PyObject_InitVar}@anchor{1d3d}
@deffn {C 함수} @ref{4715,,PyVarObject} *PyObject_InitVar (PyVarObject *op, PyTypeObject *type, Py_ssize_t size)
`반환값: 빌린 참조.'` Part of the @ref{774,,안정 ABI}.'
이것은 @ref{c60,,PyObject_Init()}가 수행하는 모든 작업을 수행하고, 가변 크기 객체의 길이 정보도 초기화합니다.

@cartouche
@quotation 참고 
This function only initializes some of the object’s memory.  It does not
zero the rest.
@end quotation
@end cartouche
@end deffn

@geindex PyObject_New (C macro)
@anchor{c-api/allocation c PyObject_New}@anchor{b7b}
@deffn {C 매크로} PyObject_New (TYPE, typeobj)

Allocates a new Python object using the C structure type `TYPE' and the
Python type object `typeobj' (@code{PyTypeObject*}) by calling
@ref{e61,,PyObject_Malloc()} to allocate memory and initializing it like
@ref{c60,,PyObject_Init()}.  The caller will own the only reference to the
object (i.e. its reference count will be one).

Avoid calling this directly to allocate memory for an object; call the type’s
@ref{4f0f,,tp_alloc} slot instead.

When populating a type’s @ref{4f0f,,tp_alloc} slot,
@ref{c5f,,PyType_GenericAlloc()} is preferred over a custom function that
simply calls this macro.

This macro does not call @ref{4f0f,,tp_alloc},
@ref{79e,,tp_new} (@ref{79f,,__new__()}), or
@ref{7a0,,tp_init} (@ref{8be,,__init__()}).

This cannot be used for objects with @ref{980,,Py_TPFLAGS_HAVE_GC} set in
@ref{1c6f,,tp_flags}; use @ref{c98,,PyObject_GC_New} instead.

Memory allocated by this macro must be freed with @ref{e5f,,PyObject_Free()}
(usually called via the object’s @ref{4f0e,,tp_free} slot).

@cartouche
@quotation 참고 
The returned memory is not guaranteed to have been completely zeroed
before it was initialized.
@end quotation
@end cartouche

@cartouche
@quotation 참고 
This macro does not construct a fully initialized object of the given
type; it merely allocates memory and prepares it for further
initialization by @ref{7a0,,tp_init}.  To construct a
fully initialized object, call `typeobj' instead.  For example:

@example
PyObject *foo = PyObject_CallNoArgs((PyObject *)&PyFoo_Type);
@end example
@end quotation
@end cartouche


@subsubheading 더 보기



@itemize *

@item 
@ref{e5f,,PyObject_Free()}

@item 
@ref{c98,,PyObject_GC_New}

@item 
@ref{c5f,,PyType_GenericAlloc()}

@item 
@ref{4f0f,,tp_alloc}
@end itemize

@end deffn

@geindex PyObject_NewVar (C macro)
@anchor{c-api/allocation c PyObject_NewVar}@anchor{b7c}
@deffn {C 매크로} PyObject_NewVar (TYPE, typeobj, size)

Like @ref{b7b,,PyObject_New} except:


@itemize *

@item 
It allocates enough memory for the `TYPE' structure plus `size'
(@code{Py_ssize_t}) fields of the size given by the
@ref{23bb,,tp_itemsize} field of `typeobj'.

@item 
The memory is initialized like @ref{1d3d,,PyObject_InitVar()}.
@end itemize

This is useful for implementing objects like tuples, which are able to
determine their size at construction time.  Embedding the array of fields
into the same allocation decreases the number of allocations, improving the
memory management efficiency.

Avoid calling this directly to allocate memory for an object; call the type’s
@ref{4f0f,,tp_alloc} slot instead.

When populating a type’s @ref{4f0f,,tp_alloc} slot,
@ref{c5f,,PyType_GenericAlloc()} is preferred over a custom function that
simply calls this macro.

This cannot be used for objects with @ref{980,,Py_TPFLAGS_HAVE_GC} set in
@ref{1c6f,,tp_flags}; use @ref{c99,,PyObject_GC_NewVar}
instead.

Memory allocated by this function must be freed with @ref{e5f,,PyObject_Free()}
(usually called via the object’s @ref{4f0e,,tp_free} slot).

@cartouche
@quotation 참고 
The returned memory is not guaranteed to have been completely zeroed
before it was initialized.
@end quotation
@end cartouche

@cartouche
@quotation 참고 
This macro does not construct a fully initialized object of the given
type; it merely allocates memory and prepares it for further
initialization by @ref{7a0,,tp_init}.  To construct a
fully initialized object, call `typeobj' instead.  For example:

@example
PyObject *list_instance = PyObject_CallNoArgs((PyObject *)&PyList_Type);
@end example
@end quotation
@end cartouche


@subsubheading 더 보기



@itemize *

@item 
@ref{e5f,,PyObject_Free()}

@item 
@ref{c99,,PyObject_GC_NewVar}

@item 
@ref{c5f,,PyType_GenericAlloc()}

@item 
@ref{4f0f,,tp_alloc}
@end itemize

@end deffn

@geindex _Py_NoneStruct (C var)
@anchor{c-api/allocation c _Py_NoneStruct}@anchor{5622}
@deffn {C 변수} @ref{5dc,,PyObject} _Py_NoneStruct

파이썬에서 @code{None}으로 노출되는 객체. 이 객체에 대한 포인터로 평가되는 @ref{4ede,,Py_None} 매크로를 사용해서 액세스해야 합니다.
@end deffn


@subsubheading 더 보기



@table @asis

@item @ref{5479,,모듈 객체}

확장 모듈을 할당하고 만듭니다.
@end table


@menu
* Deprecated aliases: Deprecated aliases<3>. 

@end menu

@node Deprecated aliases<3>,,,힙에 객체 할당하기
@anchor{c-api/allocation deprecated-aliases}@anchor{5623}
@subsubsection Deprecated aliases


These are @ref{23d,,soft deprecated} aliases to existing functions and macros.
They exist solely for backwards compatibility.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Deprecated alias

@tab

Function

@item

@geindex PyObject_NEW (C macro)
@anchor{c-api/allocation c PyObject_NEW}@anchor{5624}
@deffn {C 매크로} PyObject_NEW (type, typeobj)
@end deffn

@tab

@ref{b7b,,PyObject_New}

@item

@geindex PyObject_NEW_VAR (C macro)
@anchor{c-api/allocation c PyObject_NEW_VAR}@anchor{5625}
@deffn {C 매크로} PyObject_NEW_VAR (type, typeobj, n)
@end deffn

@tab

@ref{b7c,,PyObject_NewVar}

@item

@geindex PyObject_INIT (C macro)
@anchor{c-api/allocation c PyObject_INIT}@anchor{1d3b}
@deffn {C 매크로} PyObject_INIT (op, typeobj)
@end deffn

@tab

@ref{c60,,PyObject_Init()}

@item

@geindex PyObject_INIT_VAR (C macro)
@anchor{c-api/allocation c PyObject_INIT_VAR}@anchor{1d3c}
@deffn {C 매크로} PyObject_INIT_VAR (op, typeobj, n)
@end deffn

@tab

@ref{1d3d,,PyObject_InitVar()}

@item

@geindex PyObject_MALLOC (C macro)
@anchor{c-api/allocation c PyObject_MALLOC}@anchor{5626}
@deffn {C 매크로} PyObject_MALLOC (n)
@end deffn

@tab

@ref{e61,,PyObject_Malloc()}

@item

@geindex PyObject_REALLOC (C macro)
@anchor{c-api/allocation c PyObject_REALLOC}@anchor{5627}
@deffn {C 매크로} PyObject_REALLOC (p, n)
@end deffn

@tab

@ref{1648,,PyObject_Realloc()}

@item

@geindex PyObject_FREE (C macro)
@anchor{c-api/allocation c PyObject_FREE}@anchor{5628}
@deffn {C 매크로} PyObject_FREE (p)
@end deffn

@tab

@ref{e5f,,PyObject_Free()}

@item

@geindex PyObject_DEL (C macro)
@anchor{c-api/allocation c PyObject_DEL}@anchor{5629}
@deffn {C 매크로} PyObject_DEL (p)
@end deffn

@tab

@ref{e5f,,PyObject_Free()}

@item

@geindex PyObject_Del (C macro)
@anchor{c-api/allocation c PyObject_Del}@anchor{16d6}
@deffn {C 매크로} PyObject_Del (p)
@end deffn

@tab

@ref{e5f,,PyObject_Free()}

@end multitable


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Object Life Cycle,공통 객체 구조체,힙에 객체 할당하기,객체 구현 지원
@anchor{c-api/lifecycle doc}@anchor{562a}@anchor{c-api/lifecycle life-cycle}@anchor{562b}@anchor{c-api/lifecycle object-life-cycle}@anchor{562c}@anchor{c-api/lifecycle translation-repo}@anchor{562d}
@subsection Object Life Cycle


This section explains how a type’s slots relate to each other throughout the
life of an object.  It is not intended to be a complete canonical reference for
the slots; instead, refer to the slot-specific documentation in
@ref{b83,,Type Object Structures} for details about a particular slot.

@menu
* Life Events:: 
* Cyclic Isolate Destruction:: 
* Functions: Functions<3>. 

@end menu

@node Life Events,Cyclic Isolate Destruction,,Object Life Cycle
@anchor{c-api/lifecycle life-events}@anchor{562e}
@subsubsection Life Events


The figure below illustrates the order of events that can occur throughout an
object’s life.  An arrow from `A' to `B' indicates that event `B' can occur
after event `A' has occurred, with the arrow’s label indicating the condition
that must be true for `B' to occur after `A'.


@image{python-figures/lifecycle.dot,,,Diagram showing events in an object's life. Explained in detail below.,svg}


Explanation:


@itemize *

@item 
When a new object is constructed by calling its type:


@enumerate 

@item 
@ref{79e,,tp_new} is called to create a new object.

@item 
@ref{4f0f,,tp_alloc} is directly called by
@ref{79e,,tp_new} to allocate the memory for the new
object.

@item 
@ref{7a0,,tp_init} initializes the newly created object.
@code{tp_init} can be called again to re-initialize an object, if
desired. The @code{tp_init} call can also be skipped entirely,
for example by Python code calling @ref{79f,,__new__()}.
@end enumerate

@item 
After @code{tp_init} completes, the object is ready to use.

@item 
Some time after the last reference to an object is removed:


@enumerate 

@item 
If an object is not marked as `finalized', it might be finalized by
marking it as `finalized' and calling its
@ref{c9c,,tp_finalize} function.  Python does
`not' finalize an object when the last reference to it is deleted; use
@ref{562f,,PyObject_CallFinalizerFromDealloc()} to ensure that
@code{tp_finalize} is always called.

@item 
If the object is marked as finalized,
@ref{4f21,,tp_clear} might be called by the garbage collector
to clear references held by the object.  It is `not' called when the
object’s reference count reaches zero.

@item 
@ref{4efb,,tp_dealloc} is called to destroy the object.
To avoid code duplication, @code{tp_dealloc} typically
calls into @ref{4f21,,tp_clear} to free up the object’s
references.

@item 
When @ref{4efb,,tp_dealloc} finishes object destruction,
it directly calls @ref{4f0e,,tp_free} (usually set to
@ref{e5f,,PyObject_Free()} or @ref{1708,,PyObject_GC_Del()} automatically as
appropriate for the type) to deallocate the memory.
@end enumerate

@item 
The @ref{c9c,,tp_finalize} function is permitted to add a
reference to the object if desired.  If it does, the object is
`resurrected', preventing its pending destruction.  (Only
@code{tp_finalize} is allowed to resurrect an object;
@ref{4f21,,tp_clear} and
@ref{4efb,,tp_dealloc} cannot without calling into
@code{tp_finalize}.)  Resurrecting an object may
or may not cause the object’s `finalized' mark to be removed.  Currently,
Python does not remove the `finalized' mark from a resurrected object if
it supports garbage collection (i.e., the @ref{980,,Py_TPFLAGS_HAVE_GC}
flag is set) but does remove the mark if the object does not support
garbage collection; either or both of these behaviors may change in the
future.

@item 
@ref{4efb,,tp_dealloc} can optionally call
@ref{c9c,,tp_finalize} via
@ref{562f,,PyObject_CallFinalizerFromDealloc()} if it wishes to reuse that
code to help with object destruction.  This is recommended because it
guarantees that @code{tp_finalize} is always called before
destruction.  See the @code{tp_dealloc} documentation
for example code.

@item 
If the object is a member of a @ref{5630,,cyclic isolate} and either
@ref{4f21,,tp_clear} fails to break the reference cycle or
the cyclic isolate is not detected (perhaps @ref{4a4d,,gc.disable()} was called,
or the @ref{980,,Py_TPFLAGS_HAVE_GC} flag was erroneously omitted in one
of the involved types), the objects remain indefinitely uncollectable
(they “leak”).  See @ref{13c6,,gc.garbage}.
@end itemize

If the object is marked as supporting garbage collection (the
@ref{980,,Py_TPFLAGS_HAVE_GC} flag is set in
@ref{1c6f,,tp_flags}), the following events are also possible:


@itemize *

@item 
The garbage collector occasionally calls
@ref{981,,tp_traverse} to identify @ref{5630,,cyclic isolates}.

@item 
When the garbage collector discovers a @ref{5630,,cyclic isolate}, it
finalizes one of the objects in the group by marking it as `finalized' and
calling its @ref{c9c,,tp_finalize} function, if it has one.
This repeats until the cyclic isolate doesn’t exist or all of the objects
have been finalized.

@item 
@ref{c9c,,tp_finalize} is permitted to resurrect the object
by adding a reference from outside the @ref{5630,,cyclic isolate}.  The new
reference causes the group of objects to no longer form a cyclic isolate
(the reference cycle may still exist, but if it does the objects are no
longer isolated).

@item 
When the garbage collector discovers a @ref{5630,,cyclic isolate} and all of
the objects in the group have already been marked as `finalized', the
garbage collector clears one or more of the uncleared objects in the group
(possibly concurrently) by calling each’s
@ref{4f21,,tp_clear} function.  This repeats as long as the
cyclic isolate still exists and not all of the objects have been cleared.
@end itemize

@node Cyclic Isolate Destruction,Functions<3>,Life Events,Object Life Cycle
@anchor{c-api/lifecycle cyclic-isolate-destruction}@anchor{5631}
@subsubsection Cyclic Isolate Destruction


Listed below are the stages of life of a hypothetical @ref{5630,,cyclic isolate}
that continues to exist after each member object is finalized or cleared.  It
is a memory leak if a cyclic isolate progresses through all of these stages; it should
vanish once all objects are cleared, if not sooner.  A cyclic isolate can
vanish either because the reference cycle is broken or because the objects are
no longer isolated due to finalizer resurrection (see
@ref{c9c,,tp_finalize}).


@enumerate 0

@item 
`Reachable' (not yet a cyclic isolate): All objects are in their normal,
reachable state.  A reference cycle could exist, but an external reference
means the objects are not yet isolated.

@item 
`Unreachable but consistent:' The final reference from outside the cyclic
group of objects has been removed, causing the objects to become isolated
(thus a cyclic isolate is born).  None of the group’s objects have been
finalized or cleared yet.  The cyclic isolate remains at this stage until
some future run of the garbage collector (not necessarily the next run
because the next run might not scan every object).

@item 
`Mix of finalized and not finalized:' Objects in a cyclic isolate are
finalized one at a time, which means that there is a period of time when the
cyclic isolate is composed of a mix of finalized and non-finalized objects.
Finalization order is unspecified, so it can appear random.  A finalized
object must behave in a sane manner when non-finalized objects interact with
it, and a non-finalized object must be able to tolerate the finalization of
an arbitrary subset of its referents.

@item 
`All finalized:' All objects in a cyclic isolate are finalized before any
of them are cleared.

@item 
`Mix of finalized and cleared:' The objects can be cleared serially or
concurrently (but with the @ref{164,,GIL} held); either way, some will finish
before others.  A finalized object must be able to tolerate the clearing of
a subset of its referents.  
@geindex Python 향상 제안; PEP 442
PEP 442@footnote{https://peps.python.org/pep-0442/} calls this stage “cyclic trash”.

@item 
`Leaked:' If a cyclic isolate still exists after all objects in the group
have been finalized and cleared, then the objects remain indefinitely
uncollectable (see @ref{13c6,,gc.garbage}).  It is a bug if a cyclic isolate
reaches this stage—it means the @ref{4f21,,tp_clear} methods
of the participating objects have failed to break the reference cycle as
required.
@end enumerate

If @ref{4f21,,tp_clear} did not exist, then Python would have no
way to safely break a reference cycle.  Simply destroying an object in a cyclic
isolate would result in a dangling pointer, triggering undefined behavior when
an object referencing the destroyed object is itself destroyed.  The clearing
step makes object destruction a two-phase process: first
@code{tp_clear} is called to partially destroy the objects
enough to detangle them from each other, then
@ref{4efb,,tp_dealloc} is called to complete the destruction.

Unlike clearing, finalization is not a phase of destruction.  A finalized
object must still behave properly by continuing to fulfill its design
contracts.  An object’s finalizer is allowed to execute arbitrary Python code,
and is even allowed to prevent the impending destruction by adding a reference.
The finalizer is only related to destruction by call order—if it runs, it runs
before destruction, which starts with @ref{4f21,,tp_clear} (if
called) and concludes with @ref{4efb,,tp_dealloc}.

The finalization step is not necessary to safely reclaim the objects in a
cyclic isolate, but its existence makes it easier to design types that behave
in a sane manner when objects are cleared.  Clearing an object might
necessarily leave it in a broken, partially destroyed state—it might be
unsafe to call any of the cleared object’s methods or access any of its
attributes.  With finalization, only finalized objects can possibly interact
with cleared objects; non-finalized objects are guaranteed to interact with
only non-cleared (but potentially finalized) objects.

To summarize the possible interactions:


@itemize *

@item 
A non-finalized object might have references to or from non-finalized and
finalized objects, but not to or from cleared objects.

@item 
A finalized object might have references to or from non-finalized, finalized,
and cleared objects.

@item 
A cleared object might have references to or from finalized and cleared
objects, but not to or from non-finalized objects.
@end itemize

Without any reference cycles, an object can be simply destroyed once its last
reference is deleted; the finalization and clearing steps are not necessary to
safely reclaim unused objects.  However, it can be useful to automatically call
@ref{c9c,,tp_finalize} and @ref{4f21,,tp_clear}
before destruction anyway because type design is simplified when all objects
always experience the same series of events regardless of whether they
participated in a cyclic isolate.  Python currently only calls
@code{tp_finalize} and @code{tp_clear} as
needed to destroy a cyclic isolate; this may change in a future version.

@node Functions<3>,,Cyclic Isolate Destruction,Object Life Cycle
@anchor{c-api/lifecycle functions}@anchor{5632}
@subsubsection Functions


To allocate and free memory, see @ref{561e,,힙에 객체 할당하기}.

@geindex PyObject_CallFinalizer (C function)
@anchor{c-api/lifecycle c PyObject_CallFinalizer}@anchor{5633}
@deffn {C 함수} void PyObject_CallFinalizer (PyObject *op)

Finalizes the object as described in @ref{c9c,,tp_finalize}.
Call this function (or @ref{562f,,PyObject_CallFinalizerFromDealloc()}) instead
of calling @code{tp_finalize} directly because this
function may deduplicate multiple calls to @code{tp_finalize}.
Currently, calls are only deduplicated if the type supports garbage
collection (i.e., the @ref{980,,Py_TPFLAGS_HAVE_GC} flag is set); this may
change in the future.


Added in version 3.4.

@end deffn

@geindex PyObject_CallFinalizerFromDealloc (C function)
@anchor{c-api/lifecycle c PyObject_CallFinalizerFromDealloc}@anchor{562f}
@deffn {C 함수} int PyObject_CallFinalizerFromDealloc (PyObject *op)

Same as @ref{5633,,PyObject_CallFinalizer()} but meant to be called at the
beginning of the object’s destructor (@ref{4efb,,tp_dealloc}).
There must not be any references to the object.  If the object’s finalizer
resurrects the object, this function returns -1; no further destruction
should happen.  Otherwise, this function returns 0 and destruction can
continue normally.


Added in version 3.4.



@subsubheading 더 보기


@ref{4efb,,tp_dealloc} for example code.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 공통 객체 구조체,Type Object Structures,Object Life Cycle,객체 구현 지원
@anchor{c-api/structures doc}@anchor{5634}@anchor{c-api/structures common-object-structures}@anchor{5635}@anchor{c-api/structures common-structs}@anchor{5636}@anchor{c-api/structures translation-repo}@anchor{5637}
@subsection 공통 객체 구조체


파이썬의 객체 형 정의에 사용되는 많은 구조체가 있습니다. 이 섹션에서는 이러한 구조체와 사용 방법에 관해 설명합니다.

@menu
* 기본 객체 형과 매크로:: 
* 함수와 메서드 구현:: 
* 확장형의 어트리뷰트 액세스:: 

@end menu

@node 기본 객체 형과 매크로,함수와 메서드 구현,,공통 객체 구조체
@anchor{c-api/structures base-object-types-and-macros}@anchor{5638}
@subsubsection 기본 객체 형과 매크로


모든 파이썬 객체는 궁극적으로 객체의 메모리 표현의 처음에서 적은 수의 필드를 공유합니다. 이들은 @ref{5dc,,PyObject}와 @ref{4715,,PyVarObject} 형으로 표시되며, 다른 모든 파이썬 객체의 정의에서, 직접 또는 간접적으로, 사용되는 일부 매크로의 확장을 통해 정의됩니다. 추가 매크로는 @ref{5226,,참조 횟수}에서 찾을 수 있습니다.

@geindex PyObject (C type)
@anchor{c-api/structures c PyObject}@anchor{5dc}
@deffn {C 자료형} type PyObject
` Part of the @ref{774,,제한된 API}. (Only some members are part of the stable ABI.)'
All object types are extensions of this type.  This is a type which
contains the information Python needs to treat a pointer to an object as an
object.  In a normal “release” build, it contains only the object’s
reference count and a pointer to the corresponding type object.
Nothing is actually declared to be a @ref{5dc,,PyObject}, but every pointer
to a Python object can be cast to a @ref{5dc,,PyObject}*.

The members must not be accessed directly; instead use macros such as
@ref{2cf,,Py_REFCNT} and @ref{3c9,,Py_TYPE}.

@geindex PyObject.ob_refcnt (C member)
@anchor{c-api/structures c PyObject ob_refcnt}@anchor{a9f}
@deffn {C 멤버 변수} @ref{c54,,Py_ssize_t} ob_refcnt
` Part of the @ref{774,,안정 ABI}.'
The object’s reference count, as returned by @ref{2cf,,Py_REFCNT}.
Do not use this field directly; instead use functions and macros such as
@code{Py_REFCNT}, @ref{78e,,Py_INCREF()} and @ref{5169,,Py_DecRef()}.

The field type may be different from @code{Py_ssize_t}, depending on
build configuration and platform.
@end deffn

@geindex PyObject.ob_type (C member)
@anchor{c-api/structures c PyObject ob_type}@anchor{4f0c}
@deffn {C 멤버 변수} @ref{c9b,,PyTypeObject} *ob_type
` Part of the @ref{774,,안정 ABI}.'
The object’s type.
Do not use this field directly; use @ref{3c9,,Py_TYPE} and
@ref{983,,Py_SET_TYPE()} instead.
@end deffn
@end deffn

@geindex PyVarObject (C type)
@anchor{c-api/structures c PyVarObject}@anchor{4715}
@deffn {C 자료형} type PyVarObject
` Part of the @ref{774,,제한된 API}. (Only some members are part of the stable ABI.)'
An extension of @ref{5dc,,PyObject} that adds the
@ref{515b,,ob_size} field.
This is intended for objects that have some notion of `length'.

As with @code{PyObject}, the members must not be accessed directly;
instead use macros such as @ref{984,,Py_SIZE}, @ref{2cf,,Py_REFCNT} and
@ref{3c9,,Py_TYPE}.

@geindex PyVarObject.ob_size (C member)
@anchor{c-api/structures c PyVarObject ob_size}@anchor{515b}
@deffn {C 멤버 변수} @ref{c54,,Py_ssize_t} ob_size
` Part of the @ref{774,,안정 ABI}.'
A size field, whose contents should be considered an object’s internal
implementation detail.

Do not use this field directly; use @ref{984,,Py_SIZE} instead.

Object creation functions such as @ref{b7c,,PyObject_NewVar()} will
generally set this field to the requested size (number of items).
After creation, arbitrary values can be stored in @code{ob_size}
using @ref{985,,Py_SET_SIZE}.

To get an object’s publicly exposed length, as returned by
the Python function @ref{83f,,len()}, use @ref{50d4,,PyObject_Length()}
instead.
@end deffn
@end deffn

@geindex PyObject_HEAD (C macro)
@anchor{c-api/structures c PyObject_HEAD}@anchor{14e2}
@deffn {C 매크로} PyObject_HEAD

길이가 변하지 않는 객체를 나타내는 새로운 형을 선언할 때 사용되는 매크로입니다. PyObject_HEAD 매크로는 다음과 같이 확장됩니다:

@example
PyObject ob_base;
@end example

위의 @ref{5dc,,PyObject} 설명서를 참조하십시오.
@end deffn

@geindex PyObject_VAR_HEAD (C macro)
@anchor{c-api/structures c PyObject_VAR_HEAD}@anchor{5639}
@deffn {C 매크로} PyObject_VAR_HEAD

인스턴스마다 길이가 다른 객체를 나타내는 새로운 형을 선언할 때 사용되는 매크로입니다. PyObject_VAR_HEAD 매크로는 다음과 같이 확장됩니다:

@example
PyVarObject ob_base;
@end example

위의 @ref{4715,,PyVarObject} 설명서를 참조하십시오.
@end deffn

@geindex PyBaseObject_Type (C var)
@anchor{c-api/structures c PyBaseObject_Type}@anchor{4fb4}
@deffn {C 변수} @ref{c9b,,PyTypeObject} PyBaseObject_Type
` Part of the @ref{774,,안정 ABI}.'
The base class of all other objects, the same as @ref{c7d,,object} in Python.
@end deffn

@geindex Py_Is (C function)
@anchor{c-api/structures c Py_Is}@anchor{aa0}
@deffn {C 함수} int Py_Is (PyObject *x, PyObject *y)
` Part of the @ref{774,,안정 ABI} 버전 3.10 이후로.'
Test if the `x' object is the `y' object, the same as @code{x is y} in Python.


Added in version 3.10.

@end deffn

@geindex Py_IsNone (C function)
@anchor{c-api/structures c Py_IsNone}@anchor{aa1}
@deffn {C 함수} int Py_IsNone (PyObject *x)
` Part of the @ref{774,,안정 ABI} 버전 3.10 이후로.'
Test if an object is the @code{None} singleton,
the same as @code{x is None} in Python.


Added in version 3.10.

@end deffn

@geindex Py_IsTrue (C function)
@anchor{c-api/structures c Py_IsTrue}@anchor{aa2}
@deffn {C 함수} int Py_IsTrue (PyObject *x)
` Part of the @ref{774,,안정 ABI} 버전 3.10 이후로.'
Test if an object is the @code{True} singleton,
the same as @code{x is True} in Python.


Added in version 3.10.

@end deffn

@geindex Py_IsFalse (C function)
@anchor{c-api/structures c Py_IsFalse}@anchor{aa3}
@deffn {C 함수} int Py_IsFalse (PyObject *x)
` Part of the @ref{774,,안정 ABI} 버전 3.10 이후로.'
Test if an object is the @code{False} singleton,
the same as @code{x is False} in Python.


Added in version 3.10.

@end deffn

@geindex Py_TYPE (C function)
@anchor{c-api/structures c Py_TYPE}@anchor{3c9}
@deffn {C 함수} @ref{c9b,,PyTypeObject} *Py_TYPE (PyObject *o)
`반환값: 빌린 참조.'` Part of the @ref{774,,안정 ABI} 버전 3.14 이후로.'
Get the type of the Python object `o'.

The returned reference is @ref{3d7,,borrowed} from `o'.
Do not release it with @ref{78f,,Py_DECREF()} or similar.


버전 3.11에서 변경: @ref{3c9,,Py_TYPE()} is changed to an inline static function.
The parameter type is no longer const @ref{5dc,,PyObject}*.

@end deffn

@geindex Py_IS_TYPE (C function)
@anchor{c-api/structures c Py_IS_TYPE}@anchor{1b9e}
@deffn {C 함수} int Py_IS_TYPE (PyObject *o, PyTypeObject *type)

객체 `o'의 형이 `type'이면 0이 아닌 값을 반환합니다. 그렇지 않으면 0을 반환합니다. @code{Py_TYPE(o) == type}과 동등합니다.


Added in version 3.9.

@end deffn

@geindex Py_SET_TYPE (C function)
@anchor{c-api/structures c Py_SET_TYPE}@anchor{983}
@deffn {C 함수} void Py_SET_TYPE (PyObject *o, PyTypeObject *type)

Set the type of object `o' to `type', without any checking or reference
counting.

This is a very low-level operation.
Consider instead setting the Python attribute @ref{16b2,,__class__}
using @ref{198f,,PyObject_SetAttrString()} or similar.

Note that assigning an incompatible type can lead to undefined behavior.

If `type' is a @ref{b5e,,heap type}, the caller must create a
new reference to it.
Similarly, if the old type of `o' is a heap type, the caller must release
a reference to that type.


Added in version 3.9.

@end deffn

@geindex Py_SIZE (C function)
@anchor{c-api/structures c Py_SIZE}@anchor{984}
@deffn {C 함수} @ref{c54,,Py_ssize_t} Py_SIZE (PyVarObject *o)

Get the @ref{515b,,ob_size} field of `o'.


버전 3.11에서 변경: @ref{984,,Py_SIZE()} is changed to an inline static function.
The parameter type is no longer const @ref{4715,,PyVarObject}*.

@end deffn

@geindex Py_SET_SIZE (C function)
@anchor{c-api/structures c Py_SET_SIZE}@anchor{985}
@deffn {C 함수} void Py_SET_SIZE (PyVarObject *o, Py_ssize_t size)

Set the @ref{515b,,ob_size} field of `o' to `size'.


Added in version 3.9.

@end deffn

@geindex PyObject_HEAD_INIT (C macro)
@anchor{c-api/structures c PyObject_HEAD_INIT}@anchor{563a}
@deffn {C 매크로} PyObject_HEAD_INIT (type)

이것은 새로운 @ref{5dc,,PyObject} 형의 초기화 값으로 확장되는 매크로입니다. 이 매크로는 다음으로 확장됩니다:

@example
_PyObject_EXTRA_INIT
1, type,
@end example
@end deffn

@geindex PyVarObject_HEAD_INIT (C macro)
@anchor{c-api/structures c PyVarObject_HEAD_INIT}@anchor{563b}
@deffn {C 매크로} PyVarObject_HEAD_INIT (type, size)

이것은 @ref{515b,,ob_size} 필드를 포함하여, 새로운 @ref{4715,,PyVarObject} 형의 초기화 값으로 확장되는 매크로입니다. 이 매크로는 다음으로 확장됩니다:

@example
_PyObject_EXTRA_INIT
1, type, size,
@end example
@end deffn

@node 함수와 메서드 구현,확장형의 어트리뷰트 액세스,기본 객체 형과 매크로,공통 객체 구조체
@anchor{c-api/structures implementing-functions-and-methods}@anchor{563c}
@subsubsection 함수와 메서드 구현


@geindex PyCFunction (C type)
@anchor{c-api/structures c PyCFunction}@anchor{167d}
@deffn {C 자료형} type PyCFunction
` Part of the @ref{774,,안정 ABI}.'
대부분 파이썬 콜러블을 C로 구현하는 데 사용되는 함수 형. 이 형의 함수는 두 개의 @ref{5dc,,PyObject}* 매개 변수를 취하고 하나의 값을 반환합니다. 반환 값이 `NULL'이면, 예외가 설정되어 있어야 합니다. @code{NULL}이 아니면, 반환 값은 파이썬에 노출된 함수의 반환 값으로 해석됩니다. 함수는 새로운 참조를 반환해야 합니다.

함수 서명은 다음과 같습니다:

@example
PyObject *PyCFunction(PyObject *self,
                      PyObject *args);
@end example
@end deffn

@geindex PyCFunctionWithKeywords (C type)
@anchor{c-api/structures c PyCFunctionWithKeywords}@anchor{4fca}
@deffn {C 자료형} type PyCFunctionWithKeywords
` Part of the @ref{774,,안정 ABI}.'
서명이 @ref{563d,,METH_VARARGS | METH_KEYWORDS} 인 파이썬 콜러블을 C로 구현하는 데 사용되는 함수 형. 함수 서명은 다음과 같습니다:

@example
PyObject *PyCFunctionWithKeywords(PyObject *self,
                                  PyObject *args,
                                  PyObject *kwargs);
@end example
@end deffn

@geindex PyCFunctionFast (C type)
@anchor{c-api/structures c PyCFunctionFast}@anchor{4fc8}
@deffn {C 자료형} type PyCFunctionFast
` Part of the @ref{774,,안정 ABI} 버전 3.13 이후로.'
서명이 @ref{199f,,METH_FASTCALL} 인 파이썬 콜러블을 C로 구현하는 데 사용되는 함수 형. 함수 서명은 다음과 같습니다:

@example
PyObject *PyCFunctionFast(PyObject *self,
                          PyObject *const *args,
                          Py_ssize_t nargs);
@end example
@end deffn

@geindex PyCFunctionFastWithKeywords (C type)
@anchor{c-api/structures c PyCFunctionFastWithKeywords}@anchor{4fc9}
@deffn {C 자료형} type PyCFunctionFastWithKeywords
` Part of the @ref{774,,안정 ABI} 버전 3.13 이후로.'
서명이 @ref{563e,,METH_FASTCALL | METH_KEYWORDS} 인 파이썬 콜러블을 C로 구현하는 데 사용되는 함수 형. 함수 서명은 다음과 같습니다:

@example
PyObject *PyCFunctionFastWithKeywords(PyObject *self,
                                      PyObject *const *args,
                                      Py_ssize_t nargs,
                                      PyObject *kwnames);
@end example
@end deffn

@geindex PyCMethod (C type)
@anchor{c-api/structures c PyCMethod}@anchor{967}
@deffn {C 자료형} type PyCMethod

서명이 @ref{1a09,,METH_METHOD | METH_FASTCALL | METH_KEYWORDS} 인 파이썬 콜러블을 C로 구현하는 데 사용되는 함수 형. 함수 서명은 다음과 같습니다:

@example
PyObject *PyCMethod(PyObject *self,
                    PyTypeObject *defining_class,
                    PyObject *const *args,
                    Py_ssize_t nargs,
                    PyObject *kwnames)
@end example


Added in version 3.9.

@end deffn

@geindex PyMethodDef (C type)
@anchor{c-api/structures c PyMethodDef}@anchor{16dc}
@deffn {C 자료형} type PyMethodDef
` Part of the @ref{774,,안정 ABI} (including all members).'
확장형의 메서드를 기술하는 데 사용되는 구조체. 이 구조체에는 네 개의 필드가 있습니다:

@geindex PyMethodDef.ml_name (C member)
@anchor{c-api/structures c PyMethodDef ml_name}@anchor{4f28}
@deffn {C 멤버 변수} const char *ml_name

메서드의 이름.
@end deffn

@geindex PyMethodDef.ml_meth (C member)
@anchor{c-api/structures c PyMethodDef ml_meth}@anchor{563f}
@deffn {C 멤버 변수} @ref{167d,,PyCFunction} ml_meth

C 구현에 대한 포인터.
@end deffn

@geindex PyMethodDef.ml_flags (C member)
@anchor{c-api/structures c PyMethodDef ml_flags}@anchor{5640}
@deffn {C 멤버 변수} int ml_flags

호출 구성 방법을 나타내는 플래그 비트.
@end deffn

@geindex PyMethodDef.ml_doc (C member)
@anchor{c-api/structures c PyMethodDef ml_doc}@anchor{5641}
@deffn {C 멤버 변수} const char *ml_doc

독스트링의 내용을 가리킵니다.
@end deffn
@end deffn

@ref{563f,,ml_meth}는 C 함수 포인터입니다. 함수는 형이 다를 수 있지만, 항상 @ref{5dc,,PyObject}*를 반환합니다. 함수가 @ref{167d,,PyCFunction}이 아니면, 컴파일러는 메서드 테이블에서 캐스트를 요구합니다. @code{PyCFunction}이 첫 번째 매개 변수를 PyObject*로 정의하더라도, 일반적으로 메서드 구현은 `self' 객체의 특정 C 형을 사용합니다.

@ref{5640,,ml_flags} 필드는 다음 플래그를 포함 할 수 있는 비트 필드입니다. 개별 플래그는 호출 규칙이나 바인딩 규칙을 나타냅니다.

다음과 같은 호출 규칙이 있습니다:

@geindex METH_VARARGS (C macro)
@anchor{c-api/structures c METH_VARARGS}@anchor{170d}
@deffn {C 매크로} METH_VARARGS
` Part of the @ref{774,,안정 ABI}.'
이는 메서드가 @ref{167d,,PyCFunction} 형인 일반적인 호출 규칙입니다. 함수는 두 개의 @ref{5dc,,PyObject}* 값을 기대합니다. 첫 번째는 메서드의 `self' 객체입니다; 모듈 함수의 경우, 모듈 객체입니다. 두 번째 매개 변수(종종 `args'라고 합니다)는 모든 인자를 나타내는 튜플 객체입니다. 이 매개 변수는 일반적으로 @ref{3c1,,PyArg_ParseTuple()}이나 @ref{170b,,PyArg_UnpackTuple()}을 사용하여 처리됩니다.
@end deffn

@geindex METH_KEYWORDS (C macro)
@anchor{c-api/structures c METH_KEYWORDS}@anchor{4ee1}
@deffn {C 매크로} METH_KEYWORDS

Can only be used in certain combinations with other flags:
@ref{563d,,METH_VARARGS | METH_KEYWORDS},
@ref{563e,,METH_FASTCALL | METH_KEYWORDS} and
@ref{1a09,,METH_METHOD | METH_FASTCALL | METH_KEYWORDS}.
@end deffn
@anchor{c-api/structures meth-varargs-meth-keywords}@anchor{563d}

@table @asis

@item @ref{170d,,METH_VARARGS} | @ref{4ee1,,METH_KEYWORDS}

이러한 플래그가 있는 메서드는 @ref{4fca,,PyCFunctionWithKeywords} 형이어야 합니다. 이 함수는 세 개의 매개 변수를 기대합니다: `self', `args', `kwargs'. 여기서 `kwargs'는 모든 키워드 인자의 딕셔너리이거나 키워드 인자가 없으면 @code{NULL}일 수 있습니다. 매개 변수는 일반적으로 @ref{622,,PyArg_ParseTupleAndKeywords()}를 사용하여 처리됩니다.
@end table

@geindex METH_FASTCALL (C macro)
@anchor{c-api/structures c METH_FASTCALL}@anchor{199f}
@deffn {C 매크로} METH_FASTCALL
` Part of the @ref{774,,안정 ABI} 버전 3.7 이후로.'
위치 인자만 지원하는 빠른 호출 규칙. 메서드의 형은 @ref{4fc8,,PyCFunctionFast} 입니다. 첫 번째 매개 변수는 `self'이고, 두 번째 매개 변수는 인자를 나타내는 @ref{5dc,,PyObject}* 값의 C 배열이며, 세 번째 매개 변수는 인자 수(배열의 길이)입니다.


Added in version 3.7.



버전 3.10에서 변경: @code{METH_FASTCALL}은 이제 @ref{4f9c,,안정 API}의 일부입니다.

@end deffn
@anchor{c-api/structures meth-fastcall-meth-keywords}@anchor{563e}

@table @asis

@item @ref{199f,,METH_FASTCALL} | @ref{4ee1,,METH_KEYWORDS}

@ref{4fc9,,PyCFunctionFastWithKeywords} 형의 메서드를 사용하여, 키워드 인자도 지원하는 @ref{199f,,METH_FASTCALL}의 확장. 키워드 인자는 @ref{773,,벡터콜(vectorcall) 프로토콜}과 같은 방식으로 전달됩니다: 추가의 네 번째 @ref{5dc,,PyObject}* 매개 변수가 있는데, 키워드 인자의 이름(문자열임이 보장됩니다)을 나타내는 튜플이거나 키워드가 없으면 @code{NULL}일 수 있습니다. 키워드 인자의 값은 위치 인자 다음에 `args' 배열에 저장됩니다.


Added in version 3.7.

@end table

@geindex METH_METHOD (C macro)
@anchor{c-api/structures c METH_METHOD}@anchor{b68}
@deffn {C 매크로} METH_METHOD
` Part of the @ref{774,,안정 ABI} 버전 3.7 이후로.'
Can only be used in the combination with other flags:
@ref{1a09,,METH_METHOD | METH_FASTCALL | METH_KEYWORDS}.
@end deffn
@anchor{c-api/structures meth-method-meth-fastcall-meth-keywords}@anchor{1a09}

@table @asis

@item @ref{b68,,METH_METHOD} | @ref{199f,,METH_FASTCALL} | @ref{4ee1,,METH_KEYWORDS}

`정의하는 클래스(defining class)', 즉, 문제의 메서드를 포함하는 클래스를 지원하는 @ref{563e,,METH_FASTCALL | METH_KEYWORDS}의 확장. 정의하는 클래스는 @code{Py_TYPE(self)}의 슈퍼 클래스일 수 있습니다.

메서드는 @ref{967,,PyCMethod} 형이어야 하는데, @code{self} 뒤에 @code{defining_class} 인자가 추가된 @code{METH_FASTCALL | METH_KEYWORDS}와 같습니다.


Added in version 3.9.

@end table

@geindex METH_NOARGS (C macro)
@anchor{c-api/structures c METH_NOARGS}@anchor{16d9}
@deffn {C 매크로} METH_NOARGS
` Part of the @ref{774,,안정 ABI}.'
매개 변수가 없는 메서드는 @ref{16d9,,METH_NOARGS} 플래그로 나열되어 있으면, 인자가 주어졌는지 확인할 필요가 없습니다. @ref{167d,,PyCFunction} 형이어야 합니다. 첫 번째 매개 변수의 이름은 일반적으로 `self'이며 모듈이나 객체 인스턴스에 대한 참조를 보유합니다. 모든 경우에 두 번째 매개 변수는 @code{NULL}입니다.

The function must have 2 parameters. Since the second parameter is unused,
@ref{1a8a,,Py_UNUSED} can be used to prevent a compiler warning.
@end deffn

@geindex METH_O (C macro)
@anchor{c-api/structures c METH_O}@anchor{170c}
@deffn {C 매크로} METH_O
` Part of the @ref{774,,안정 ABI}.'
@code{"O"} 인자로 @ref{3c1,,PyArg_ParseTuple()}을 호출하는 대신, 단일 객체 인자가 있는 메서드는 @ref{170c,,METH_O} 플래그로 나열 할 수 있습니다. @ref{167d,,PyCFunction} 형이고, `self' 매개 변수와 단일 인자를 나타내는 @ref{5dc,,PyObject}* 매개 변수를 갖습니다.
@end deffn

These two constants are not used to indicate the calling convention but the
binding when used with methods of classes.  These may not be used for functions
defined for modules.  At most one of these flags may be set for any given
method.

@geindex METH_CLASS (C macro)
@anchor{c-api/structures c METH_CLASS}@anchor{16da}
@deffn {C 매크로} METH_CLASS
` Part of the @ref{774,,안정 ABI}.'
@geindex 내장 함수;classmethod

메서드로 형의 인스턴스가 아닌 형 객체가 첫 번째 매개 변수로 전달됩니다. @ref{48f,,classmethod()} 내장 함수를 사용할 때 만들어지는 것과 유사한 `클래스 메서드(class methods)'를 만드는 데 사용됩니다.
@end deffn

@geindex METH_STATIC (C macro)
@anchor{c-api/structures c METH_STATIC}@anchor{16db}
@deffn {C 매크로} METH_STATIC
` Part of the @ref{774,,안정 ABI}.'
@geindex 내장 함수;staticmethod

메서드로 형의 인스턴스가 아닌 @code{NULL}이 첫 번째 매개 변수로 전달됩니다. @ref{453,,staticmethod()} 내장 함수를 사용할 때 만들어지는 것과 유사한 `정적 메서드(static methods)'를 만드는 데 사용됩니다.
@end deffn

하나의 다른 상수는 같은 메서드 이름을 가진 다른 정의 대신 메서드가 로드되는지를 제어합니다.

@geindex METH_COEXIST (C macro)
@anchor{c-api/structures c METH_COEXIST}@anchor{167c}
@deffn {C 매크로} METH_COEXIST
` Part of the @ref{774,,안정 ABI}.'
기존 정의 대신 메서드가 로드됩니다. `METH_COEXIST'가 없으면, 기본값은 반복되는 정의를 건너뛰는 것입니다. 슬롯 래퍼가 메서드 테이블 전에 로드되므로, 예를 들어 `sq_contains' 슬롯의 존재는 @ref{15be,,__contains__()}라는 래핑 된 메서드를 생성하고 같은 이름의 해당 PyCFunction을 로드하지 않습니다. 플래그가 정의되면, PyCFunction이 래퍼 객체 자리에 로드되고 슬롯과 공존합니다. 이는 PyCFunction에 대한 호출이 래퍼 객체 호출보다 최적화되어 있기 때문에 유용합니다.
@end deffn

@geindex PyCMethod_Type (C var)
@anchor{c-api/structures c PyCMethod_Type}@anchor{5642}
@deffn {C 변수} @ref{c9b,,PyTypeObject} PyCMethod_Type

The type object corresponding to Python C method objects. This is
available as @ref{2a0d,,types.BuiltinMethodType} in the Python layer.
@end deffn

@geindex PyCMethod_Check (C function)
@anchor{c-api/structures c PyCMethod_Check}@anchor{5643}
@deffn {C 함수} int PyCMethod_Check (PyObject *op)

Return true if `op' is an instance of the @ref{5642,,PyCMethod_Type} type
or a subtype of it. This function always succeeds.
@end deffn

@geindex PyCMethod_CheckExact (C function)
@anchor{c-api/structures c PyCMethod_CheckExact}@anchor{5644}
@deffn {C 함수} int PyCMethod_CheckExact (PyObject *op)

This is the same as @ref{5643,,PyCMethod_Check()}, but does not account for
subtypes.
@end deffn

@geindex PyCMethod_New (C function)
@anchor{c-api/structures c PyCMethod_New}@anchor{1ca8}
@deffn {C 함수} @ref{5dc,,PyObject} *PyCMethod_New (PyMethodDef *ml, PyObject *self, PyObject *module, PyTypeObject *cls)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI} 버전 3.9 이후로.'
Turn `ml' into a Python @ref{2da2,,callable} object.
The caller must ensure that `ml' outlives the callable.
Typically, `ml' is defined as a static variable.

The `self' parameter will be passed as the `self' argument
to the C function in @code{ml->ml_meth} when invoked.
`self' can be @code{NULL}.

The @ref{2da2,,callable} object’s @code{__module__} attribute
can be set from the given `module' argument.
`module' should be a Python string,
which will be used as name of the module the function is defined in.
If unavailable, it can be set to @ref{884,,None} or @code{NULL}.


@subsubheading 더 보기


@ref{2347,,function.__module__}


The `cls' parameter will be passed as the `defining_class'
argument to the C function.
Must be set if @ref{b68,,METH_METHOD} is set on @code{ml->ml_flags}.


Added in version 3.9.

@end deffn

@geindex PyCFunction_Type (C var)
@anchor{c-api/structures c PyCFunction_Type}@anchor{4fce}
@deffn {C 변수} @ref{c9b,,PyTypeObject} PyCFunction_Type
` Part of the @ref{774,,안정 ABI}.'
The type object corresponding to Python C function objects. This is
available as @ref{2a0c,,types.BuiltinFunctionType} in the Python layer.
@end deffn

@geindex PyCFunction_Check (C function)
@anchor{c-api/structures c PyCFunction_Check}@anchor{5645}
@deffn {C 함수} int PyCFunction_Check (PyObject *op)

Return true if `op' is an instance of the @ref{4fce,,PyCFunction_Type} type
or a subtype of it. This function always succeeds.
@end deffn

@geindex PyCFunction_CheckExact (C function)
@anchor{c-api/structures c PyCFunction_CheckExact}@anchor{5646}
@deffn {C 함수} int PyCFunction_CheckExact (PyObject *op)

This is the same as @ref{5645,,PyCFunction_Check()}, but does not account for
subtypes.
@end deffn

@geindex PyCFunction_NewEx (C function)
@anchor{c-api/structures c PyCFunction_NewEx}@anchor{1d73}
@deffn {C 함수} @ref{5dc,,PyObject} *PyCFunction_NewEx (PyMethodDef *ml, PyObject *self, PyObject *module)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI}.'
Equivalent to @code{PyCMethod_New(ml, self, module, NULL)}.
@end deffn

@geindex PyCFunction_New (C function)
@anchor{c-api/structures c PyCFunction_New}@anchor{1cae}
@deffn {C 함수} @ref{5dc,,PyObject} *PyCFunction_New (PyMethodDef *ml, PyObject *self)
`반환값: 새 참조.'` Part of the @ref{774,,안정 ABI} 버전 3.4 이후로.'
Equivalent to @code{PyCMethod_New(ml, self, NULL, NULL)}.
@end deffn

@geindex PyCFunction_GetFlags (C function)
@anchor{c-api/structures c PyCFunction_GetFlags}@anchor{4fcb}
@deffn {C 함수} int PyCFunction_GetFlags (PyObject *func)
` Part of the @ref{774,,안정 ABI}.'
Get the function’s flags on `func' as they were passed to
@ref{5640,,ml_flags}.

If `func' is not a C function object, this fails with an exception.
`func' must not be @code{NULL}.

This function returns the function’s flags on success, and @code{-1} with an
exception set on failure.
@end deffn

@geindex PyCFunction_GET_FLAGS (C function)
@anchor{c-api/structures c PyCFunction_GET_FLAGS}@anchor{5647}
@deffn {C 함수} int PyCFunction_GET_FLAGS (PyObject *func)

This is the same as @ref{4fcb,,PyCFunction_GetFlags()}, but without error
or type checking.
@end deffn

@geindex PyCFunction_GetFunction (C function)
@anchor{c-api/structures c PyCFunction_GetFunction}@anchor{4fcc}
@deffn {C 함수} @ref{167d,,PyCFunction} PyCFunction_GetFunction (PyObject *func)
` Part of the @ref{774,,안정 ABI}.'
Get the function pointer on `func' as it was passed to
@ref{563f,,ml_meth}.

If `func' is not a C function object, this fails with an exception.
`func' must not be @code{NULL}.

This function returns the function pointer on success, and @code{NULL} with an
exception set on failure.
@end deffn

@geindex PyCFunction_GET_FUNCTION (C function)
@anchor{c-api/structures c PyCFunction_GET_FUNCTION}@anchor{5648}
@deffn {C 함수} int PyCFunction_GET_FUNCTION (PyObject *func)

This is the same as @ref{4fcc,,PyCFunction_GetFunction()}, but without error
or type checking.
@end deffn

@geindex PyCFunction_GetSelf (C function)
@anchor{c-api/structures c PyCFunction_GetSelf}@anchor{4fcd}
@deffn {C 함수} @ref{5dc,,PyObject} *PyCFunction_GetSelf (PyObject *func)
` Part of the @ref{774,,안정 ABI}.'
Get the “self” object on `func'. This is the object that would be passed
to the first argument of a @ref{167d,,PyCFunction}. For C function objects
created through a @ref{16dc,,PyMethodDef} on a @ref{b71,,PyModuleDef}, this
is the resulting module object.

If `func' is not a C function object, this fails with an exception.
`func' must not be @code{NULL}.

This function returns a @ref{3d7,,borrowed reference} to the “self” object
on success, and @code{NULL} with an exception set on failure.
@end deffn

@geindex PyCFunction_GET_SELF (C function)
@anchor{c-api/structures c PyCFunction_GET_SELF}@anchor{5649}
@deffn {C 함수} @ref{5dc,,PyObject} *PyCFunction_GET_SELF (PyObject *func)

This is the same as @ref{4fcd,,PyCFunction_GetSelf()}, but without error or
type checking.
@end deffn

@node 확장형의 어트리뷰트 액세스,,함수와 메서드 구현,공통 객체 구조체
@anchor{c-api/structures accessing-attributes-of-extension-types}@anchor{564a}
@subsubsection 확장형의 어트리뷰트 액세스


@geindex PyMemberDef (C type)
@anchor{c-api/structures c PyMemberDef}@anchor{770}
@deffn {C 자료형} type PyMemberDef
` Part of the @ref{774,,안정 ABI} (including all members).'
C 구조체 멤버에 해당하는 형의 어트리뷰트를 기술하는 구조체. 클래스를 정의할 때, 이 구조체들의 NULL-종료 배열을 @ref{4f11,,tp_members} 슬롯에 넣습니다.

필드는 순서대로 다음과 같습니다:

@geindex PyMemberDef.name (C member)
@anchor{c-api/structures c PyMemberDef name}@anchor{564b}
@deffn {C 멤버 변수} const char *name

Name of the member.
A NULL value marks the end of a @code{PyMemberDef[]} array.

The string should be static, no copy is made of it.
@end deffn

@geindex PyMemberDef.type (C member)
@anchor{c-api/structures c PyMemberDef type}@anchor{4f29}
@deffn {C 멤버 변수} int type

The type of the member in the C struct.
See @ref{19f0,,Member types} for the possible values.
@end deffn

@geindex PyMemberDef.offset (C member)
@anchor{c-api/structures c PyMemberDef offset}@anchor{564c}
@deffn {C 멤버 변수} @ref{c54,,Py_ssize_t} offset

멤버가 형의 객체 구조체에 위치하는 바이트 단위의 오프셋.
@end deffn

@geindex PyMemberDef.flags (C member)
@anchor{c-api/structures c PyMemberDef flags}@anchor{4f2a}
@deffn {C 멤버 변수} int flags

Zero or more of the @ref{564d,,Member flags}, combined using bitwise OR.
@end deffn

@geindex PyMemberDef.doc (C member)
@anchor{c-api/structures c PyMemberDef doc}@anchor{564e}
@deffn {C 멤버 변수} const char *doc

The docstring, or NULL.
The string should be static, no copy is made of it.
Typically, it is defined using @ref{1b94,,PyDoc_STR}.
@end deffn

By default (when @ref{4f2a,,flags} is @code{0}), members allow
both read and write access.
Use the @ref{7ad,,Py_READONLY} flag for read-only access.
Certain types, like @ref{5181,,Py_T_STRING}, imply @code{Py_READONLY}.
Only @ref{7b0,,Py_T_OBJECT_EX} (and legacy @ref{7af,,T_OBJECT}) members can
be deleted.
@anchor{c-api/structures pymemberdef-offsets}@anchor{532c}
For heap-allocated types (created using @ref{79c,,PyType_FromSpec()} or similar),
@code{PyMemberDef} may contain a definition for the special member
@code{"__vectorcalloffset__"}, corresponding to
@ref{52d5,,tp_vectorcall_offset} in type objects.
This member must be defined with @code{Py_T_PYSSIZET}, and either
@code{Py_READONLY} or @code{Py_READONLY | Py_RELATIVE_OFFSET}. For example:

@example
static PyMemberDef spam_type_members[] = @{
    @{"__vectorcalloffset__", Py_T_PYSSIZET,
     offsetof(Spam_object, vectorcall), Py_READONLY@},
    @{NULL@}  /* Sentinel */
@};
@end example

(You may need to @code{#include <stddef.h>} for @code{offsetof()}.)

The legacy offsets @ref{532b,,tp_dictoffset} and
@ref{b7e,,tp_weaklistoffset} can be defined similarly using
@code{"__dictoffset__"} and @code{"__weaklistoffset__"} members, but extensions
are strongly encouraged to use @ref{60d,,Py_TPFLAGS_MANAGED_DICT} and
@ref{77b,,Py_TPFLAGS_MANAGED_WEAKREF} instead.


버전 3.12에서 변경: @code{PyMemberDef} is always available.
Previously, it required including @code{"structmember.h"}.



버전 3.14에서 변경: @ref{76f,,Py_RELATIVE_OFFSET} is now allowed for
@code{"__vectorcalloffset__"}, @code{"__dictoffset__"} and
@code{"__weaklistoffset__"}.

@end deffn

@geindex PyMember_GetOne (C function)
@anchor{c-api/structures c PyMember_GetOne}@anchor{7a9}
@deffn {C 함수} @ref{5dc,,PyObject} *PyMember_GetOne (const char *obj_addr, struct PyMemberDef *m)
` Part of the @ref{774,,안정 ABI}.'
Get an attribute belonging to the object at address `obj_addr'.  The
attribute is described by @code{PyMemberDef} `m'.  Returns @code{NULL}
on error.


버전 3.12에서 변경: @code{PyMember_GetOne} is always available.
Previously, it required including @code{"structmember.h"}.

@end deffn

@geindex PyMember_SetOne (C function)
@anchor{c-api/structures c PyMember_SetOne}@anchor{7aa}
@deffn {C 함수} int PyMember_SetOne (char *obj_addr, struct PyMemberDef *m, PyObject *o)
` Part of the @ref{774,,안정 ABI}.'
Set an attribute belonging to the object at address `obj_addr' to object `o'.
The attribute to set is described by @code{PyMemberDef} `m'.  Returns @code{0}
if successful and a negative value on failure.


버전 3.12에서 변경: @code{PyMember_SetOne} is always available.
Previously, it required including @code{"structmember.h"}.

@end deffn

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

@end menu

@node Member flags,Member types,,확장형의 어트리뷰트 액세스
@anchor{c-api/structures member-flags}@anchor{564f}@anchor{c-api/structures pymemberdef-flags}@anchor{564d}
@subsubsection Member flags


The following flags can be used with @ref{4f2a,,PyMemberDef.flags}:

@geindex Py_READONLY (C macro)
@anchor{c-api/structures c Py_READONLY}@anchor{7ad}
@deffn {C 매크로} Py_READONLY
` Part of the @ref{774,,안정 ABI} 버전 3.12 이후로.'
Not writable.
@end deffn

@geindex Py_AUDIT_READ (C macro)
@anchor{c-api/structures c Py_AUDIT_READ}@anchor{7ae}
@deffn {C 매크로} Py_AUDIT_READ
` Part of the @ref{774,,안정 ABI} 버전 3.12 이후로.'
Emit an @code{object.__getattr__} @ref{1c11,,audit event}
before reading.
@end deffn

@geindex Py_RELATIVE_OFFSET (C macro)
@anchor{c-api/structures c Py_RELATIVE_OFFSET}@anchor{76f}
@deffn {C 매크로} Py_RELATIVE_OFFSET
` Part of the @ref{774,,안정 ABI} 버전 3.12 이후로.'
Indicates that the @ref{564c,,offset} of this @code{PyMemberDef}
entry indicates an offset from the subclass-specific data, rather than
from @code{PyObject}.

Can only be used as part of the @ref{51d4,,Py_tp_members}
@ref{511b,,slot} when creating a class using negative
@ref{769,,basicsize}.
It is mandatory in that case.
When setting @ref{4f11,,tp_members} from the slot during
class creation, Python clears the flag and sets
@ref{564c,,PyMemberDef.offset} to the offset from the @code{PyObject} struct.
@end deffn

@geindex READ_RESTRICTED (C 매크로)
@geindex WRITE_RESTRICTED (C 매크로)
@geindex RESTRICTED (C 매크로)


버전 3.10에서 변경: The @code{RESTRICTED}, @code{READ_RESTRICTED} and
@code{WRITE_RESTRICTED} macros available with
@code{#include "structmember.h"} are deprecated.
@code{READ_RESTRICTED} and @code{RESTRICTED} are equivalent to
@ref{7ae,,Py_AUDIT_READ}; @code{WRITE_RESTRICTED} does nothing.


@geindex READONLY (C 매크로)


버전 3.12에서 변경: The @code{READONLY} macro was renamed to @ref{7ad,,Py_READONLY}.
The @code{PY_AUDIT_READ} macro was renamed with the @code{Py_} prefix.
The new names are now always available.
Previously, these required @code{#include "structmember.h"}.
The header is still available and it provides the old names.


@node Member types,Defining Getters and Setters,Member flags,확장형의 어트리뷰트 액세스
@anchor{c-api/structures member-types}@anchor{5650}@anchor{c-api/structures pymemberdef-types}@anchor{19f0}
@subsubsection Member types


@ref{4f29,,PyMemberDef.type} can be one of the following macros corresponding
to various C types.
When the member is accessed in Python, it will be converted to the
equivalent Python type.
When it is set from Python, it will be converted back to the C type.
If that is not possible, an exception such as @ref{198,,TypeError} or
@ref{2ec,,ValueError} is raised.

Unless marked (D), attributes defined this way cannot be deleted
using e.g. @ref{1b1d,,del} or @ref{25b7,,delattr()}.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

매크로 이름

@tab

C 형

@tab

Python type

@item

@geindex Py_T_BYTE (C macro)
@anchor{c-api/structures c Py_T_BYTE}@anchor{517a}
@deffn {C 매크로} Py_T_BYTE
` Part of the @ref{774,,안정 ABI} 버전 3.12 이후로.'
@end deffn

@tab

char

@tab

@ref{19b,,int}

@item

@geindex Py_T_SHORT (C macro)
@anchor{c-api/structures c Py_T_SHORT}@anchor{5180}
@deffn {C 매크로} Py_T_SHORT
` Part of the @ref{774,,안정 ABI} 버전 3.12 이후로.'
@end deffn

@tab

short

@tab

@ref{19b,,int}

@item

@geindex Py_T_INT (C macro)
@anchor{c-api/structures c Py_T_INT}@anchor{7ab}
@deffn {C 매크로} Py_T_INT
` Part of the @ref{774,,안정 ABI} 버전 3.12 이후로.'
@end deffn

@tab

int

@tab

@ref{19b,,int}

@item

@geindex Py_T_LONG (C macro)
@anchor{c-api/structures c Py_T_LONG}@anchor{517d}
@deffn {C 매크로} Py_T_LONG
` Part of the @ref{774,,안정 ABI} 버전 3.12 이후로.'
@end deffn

@tab

long

@tab

@ref{19b,,int}

@item

@geindex Py_T_LONGLONG (C macro)
@anchor{c-api/structures c Py_T_LONGLONG}@anchor{517e}
@deffn {C 매크로} Py_T_LONGLONG
` Part of the @ref{774,,안정 ABI} 버전 3.12 이후로.'
@end deffn

@tab

long long

@tab

@ref{19b,,int}

@item

@geindex Py_T_UBYTE (C macro)
@anchor{c-api/structures c Py_T_UBYTE}@anchor{5183}
@deffn {C 매크로} Py_T_UBYTE
` Part of the @ref{774,,안정 ABI} 버전 3.12 이후로.'
@end deffn

@tab

unsigned char

@tab

@ref{19b,,int}

@item

@geindex Py_T_UINT (C macro)
@anchor{c-api/structures c Py_T_UINT}@anchor{5184}
@deffn {C 매크로} Py_T_UINT
` Part of the @ref{774,,안정 ABI} 버전 3.12 이후로.'
@end deffn

@tab

unsigned int

@tab

@ref{19b,,int}

@item

@geindex Py_T_USHORT (C macro)
@anchor{c-api/structures c Py_T_USHORT}@anchor{5187}
@deffn {C 매크로} Py_T_USHORT
` Part of the @ref{774,,안정 ABI} 버전 3.12 이후로.'
@end deffn

@tab

unsigned short

@tab

@ref{19b,,int}

@item

@geindex Py_T_ULONG (C macro)
@anchor{c-api/structures c Py_T_ULONG}@anchor{5185}
@deffn {C 매크로} Py_T_ULONG
` Part of the @ref{774,,안정 ABI} 버전 3.12 이후로.'
@end deffn

@tab

unsigned long

@tab

@ref{19b,,int}

@item

@geindex Py_T_ULONGLONG (C macro)
@anchor{c-api/structures c Py_T_ULONGLONG}@anchor{5186}
@deffn {C 매크로} Py_T_ULONGLONG
` Part of the @ref{774,,안정 ABI} 버전 3.12 이후로.'
@end deffn

@tab

unsigned long long

@tab

@ref{19b,,int}

@item

@geindex Py_T_PYSSIZET (C macro)
@anchor{c-api/structures c Py_T_PYSSIZET}@anchor{517f}
@deffn {C 매크로} Py_T_PYSSIZET
` Part of the @ref{774,,안정 ABI} 버전 3.12 이후로.'
@end deffn

@tab

@ref{c54,,Py_ssize_t}

@tab

@ref{19b,,int}

@item

@geindex Py_T_FLOAT (C macro)
@anchor{c-api/structures c Py_T_FLOAT}@anchor{517c}
@deffn {C 매크로} Py_T_FLOAT
` Part of the @ref{774,,안정 ABI} 버전 3.12 이후로.'
@end deffn

@tab

float

@tab

@ref{196,,float}

@item

@geindex Py_T_DOUBLE (C macro)
@anchor{c-api/structures c Py_T_DOUBLE}@anchor{7ac}
@deffn {C 매크로} Py_T_DOUBLE
` Part of the @ref{774,,안정 ABI} 버전 3.12 이후로.'
@end deffn

@tab

double

@tab

@ref{196,,float}

@item

@geindex Py_T_BOOL (C macro)
@anchor{c-api/structures c Py_T_BOOL}@anchor{5179}
@deffn {C 매크로} Py_T_BOOL
` Part of the @ref{774,,안정 ABI} 버전 3.12 이후로.'
@end deffn

@tab

char
(written as 0 or 1)

@tab

@ref{3c3,,bool}

@item

@geindex Py_T_STRING (C macro)
@anchor{c-api/structures c Py_T_STRING}@anchor{5181}
@deffn {C 매크로} Py_T_STRING
` Part of the @ref{774,,안정 ABI} 버전 3.12 이후로.'
@end deffn

@tab

const char* (*)

@tab

@ref{169,,str} (RO)

@item

@geindex Py_T_STRING_INPLACE (C macro)
@anchor{c-api/structures c Py_T_STRING_INPLACE}@anchor{5182}
@deffn {C 매크로} Py_T_STRING_INPLACE
` Part of the @ref{774,,안정 ABI} 버전 3.12 이후로.'
@end deffn

@tab

const char[] (*)

@tab

@ref{169,,str} (RO)

@item

@geindex Py_T_CHAR (C macro)
@anchor{c-api/structures c Py_T_CHAR}@anchor{517b}
@deffn {C 매크로} Py_T_CHAR
` Part of the @ref{774,,안정 ABI} 버전 3.12 이후로.'
@end deffn

@tab

char (0-127)

@tab

@ref{169,,str} (**)

@item

@geindex Py_T_OBJECT_EX (C macro)
@anchor{c-api/structures c Py_T_OBJECT_EX}@anchor{7b0}
@deffn {C 매크로} Py_T_OBJECT_EX
` Part of the @ref{774,,안정 ABI} 버전 3.12 이후로.'
@end deffn

@tab

@ref{5dc,,PyObject}*

@tab

@ref{c7d,,object} (D)

@end multitable


@quotation

(*): Zero-terminated, UTF8-encoded C string.
With @code{Py_T_STRING} the C representation is a pointer;
with @code{Py_T_STRING_INPLACE} the string is stored directly
in the structure.

(**): String of length 1. Only ASCII is accepted.

(RO): Implies @ref{7ad,,Py_READONLY}.

(D): Can be deleted, in which case the pointer is set to @code{NULL}.
Reading a @code{NULL} pointer raises @ref{5ee,,AttributeError}.
@end quotation

@geindex T_BYTE (C 매크로)
@geindex T_SHORT (C 매크로)
@geindex T_INT (C 매크로)
@geindex T_LONG (C 매크로)
@geindex T_LONGLONG (C 매크로)
@geindex T_UBYTE (C 매크로)
@geindex T_USHORT (C 매크로)
@geindex T_UINT (C 매크로)
@geindex T_ULONG (C 매크로)
@geindex T_ULONGULONG (C 매크로)
@geindex T_PYSSIZET (C 매크로)
@geindex T_FLOAT (C 매크로)
@geindex T_DOUBLE (C 매크로)
@geindex T_BOOL (C 매크로)
@geindex T_CHAR (C 매크로)
@geindex T_STRING (C 매크로)
@geindex T_STRING_INPLACE (C 매크로)
@geindex T_OBJECT_EX (C 매크로)
@geindex structmember.h


Added in version 3.12: In previous versions, the macros were only available with
@code{#include "structmember.h"} and were named without the @code{Py_} prefix
(e.g. as @code{T_INT}).
The header is still available and contains the old names, along with
the following deprecated types:

@geindex T_OBJECT (C macro)
@anchor{c-api/structures c T_OBJECT}@anchor{7af}
@deffn {C 매크로} T_OBJECT

Like @code{Py_T_OBJECT_EX}, but @code{NULL} is converted to @code{None}.
This results in surprising behavior in Python: deleting the attribute
effectively sets it to @code{None}.
@end deffn

@geindex T_NONE (C macro)
@anchor{c-api/structures c T_NONE}@anchor{7b1}
@deffn {C 매크로} T_NONE

Always @code{None}. Must be used with @ref{7ad,,Py_READONLY}.
@end deffn


@node Defining Getters and Setters,,Member types,확장형의 어트리뷰트 액세스
@anchor{c-api/structures defining-getters-and-setters}@anchor{5651}
@subsubsection Defining Getters and Setters


@geindex PyGetSetDef (C type)
@anchor{c-api/structures c PyGetSetDef}@anchor{db1}
@deffn {C 자료형} type PyGetSetDef
` Part of the @ref{774,,안정 ABI} (including all members).'
형에 대한 프로퍼티 같은 액세스를 정의하는 구조체. @ref{4f16,,PyTypeObject.tp_getset} 슬롯에 대한 설명도 참조하십시오.

@geindex PyGetSetDef.name (C member)
@anchor{c-api/structures c PyGetSetDef name}@anchor{5652}
@deffn {C 멤버 변수} const char *name

어트리뷰트 이름
@end deffn

@geindex PyGetSetDef.get (C member)
@anchor{c-api/structures c PyGetSetDef get}@anchor{5653}
@deffn {C 멤버 변수} @ref{51e7,,getter} get

어트리뷰트를 얻는 C 함수.
@end deffn

@geindex PyGetSetDef.set (C member)
@anchor{c-api/structures c PyGetSetDef set}@anchor{5654}
@deffn {C 멤버 변수} @ref{51f5,,setter} set

어트리뷰트를 설정하거나 삭제하는 선택적 C 함수. @code{NULL}이면, 어트리뷰트는 읽기 전용입니다.
@end deffn

@geindex PyGetSetDef.doc (C member)
@anchor{c-api/structures c PyGetSetDef doc}@anchor{5655}
@deffn {C 멤버 변수} const char *doc

선택적 독스트링
@end deffn

@geindex PyGetSetDef.closure (C member)
@anchor{c-api/structures c PyGetSetDef closure}@anchor{5656}
@deffn {C 멤버 변수} void *closure

선택적 사용자 데이터 포인터, getter와 setter에 추가 데이터를 제공합니다.
@end deffn
@end deffn

@geindex getter (C type)
@anchor{c-api/structures c getter}@anchor{51e7}
@deffn {C 자료형} typedef @ref{5dc,,PyObject} *(*getter)(@ref{5dc,,PyObject}*, void*)
` Part of the @ref{774,,안정 ABI}.'
@code{get} 함수는 하나의 @ref{5dc,,PyObject}* 매개 변수(인스턴스)와 사용자 데이터 포인터(연관된 @code{closure})를 받아들입니다:

성공하면 새 참조를 반환하고, 실패하면 설정된 예외와 함께 @code{NULL}을 반환해야 합니다.
@end deffn

@geindex setter (C type)
@anchor{c-api/structures c setter}@anchor{51f5}
@deffn {C 자료형} typedef int (*setter)(@ref{5dc,,PyObject}*, @ref{5dc,,PyObject}*, void*)
` Part of the @ref{774,,안정 ABI}.'
@code{set} 함수는 두 개의 @ref{5dc,,PyObject}* 매개 변수(인스턴스와 설정할 값)와 사용자 데이터 포인터(연관된 @code{closure})를 받아들입니다:

어트리뷰트를 삭제해야 하는 경우 두 번째 매개 변수는 @code{NULL}입니다. 성공하면 @code{0}을, 실패하면 설정된 예외와 함께 @code{-1}을 반환해야 합니다.
@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Type Object Structures,순환 가비지 수집 지원,공통 객체 구조체,객체 구현 지원
@anchor{c-api/typeobj doc}@anchor{5657}@anchor{c-api/typeobj translation-repo}@anchor{5658}@anchor{c-api/typeobj type-object-structures}@anchor{5659}@anchor{c-api/typeobj type-structs}@anchor{b83}
@subsection Type Object Structures


Perhaps one of the most important structures of the Python object system is the
structure that defines a new type: the @ref{c9b,,PyTypeObject} structure.  Type
objects can be handled using any of the @code{PyObject_*} or
@code{PyType_*} functions, but do not offer much that’s interesting to most
Python applications. These objects are fundamental to how objects behave, so
they are very important to the interpreter itself and to any extension module
that implements new types.

형 객체는 대부분 표준형보다 상당히 큽니다. 크기가 큰 이유는 각 형 객체가 많은 수의 값을 저장하기 때문인데, 주로 C 함수 포인터이고 각기 형의 기능 중 작은 부분을 구현합니다. 이 섹션에서는 형 객체의 필드를 자세히 살펴봅니다. 필드는 구조체에서 나타나는 순서대로 설명됩니다.

다음의 간략 참조 외에도, @ref{565a,,예} 섹션은 @ref{c9b,,PyTypeObject}의 의미와 사용에 대한 통찰을 제공합니다.

@menu
* 간략 참조:: 
* PyTypeObject 정의:: 
* PyObject 슬롯:: 
* PyVarObject 슬롯:: 
* PyTypeObject 슬롯:: 
* Static Types:: 
* 힙 형:: 
* 숫자 객체 구조체:: 
* 매핑 객체 구조체:: 
* 시퀀스 객체 구조체:: 
* 버퍼 객체 구조체:: 
* 비동기 객체 구조체:: 
* 슬롯 형 typedef:: 
* 예: 예<19>. 

@end menu

@node 간략 참조,PyTypeObject 정의,,Type Object Structures
@anchor{c-api/typeobj quick-reference}@anchor{565b}
@subsubsection 간략 참조


@menu
* “tp 슬롯”:: 
* 서브 슬롯:: 
* 슬롯 typedef:: 

@end menu

@node “tp 슬롯”,서브 슬롯,,간략 참조
@anchor{c-api/typeobj tp-slots}@anchor{565c}@anchor{c-api/typeobj tp-slots-table}@anchor{565d}
@subsubsection “tp 슬롯”



@multitable {xxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxx} {xxx} {xxx} {xxx} {xxx} 
@headitem

PyTypeObject 슬롯 @footnote{
`()': A slot name in parentheses indicates it is (effectively) deprecated.

`<>': Names in angle brackets should be initially set to @code{NULL} and
treated as read-only.

`[]': Names in square brackets are for internal use only.

`<R>' (as a prefix) means the field is required (must be non-@code{NULL}).
}

@tab

@ref{565e,,형}

@tab

특수 메서드/어트리뷰트

@tab

정보 @footnote{
열:

`“O”':  set on @ref{4fb4,,PyBaseObject_Type}

`“T”':  set on @ref{76e,,PyType_Type}

`“D”': 기본값 (슬롯이 @code{NULL}로 설정된 경우)

@example
X - PyType_Ready sets this value if it is NULL
~ - PyType_Ready always sets this value (it should be NULL)
? - PyType_Ready may set this value depending on other slots

Also see the inheritance column ("I").
@end example

`“I”': 상속

@example
X - type slot is inherited via *PyType_Ready* if defined with a *NULL* value
% - the slots of the sub-struct are inherited individually
G - inherited, but only in combination with other slots; see the slot's description
? - it's complicated; see the slot's description
@end example

일부 슬롯은 일반 어트리뷰트 조회 체인을 통해 효과적으로 상속됨에 유의하십시오.
}

@tab

@tab

@tab

@item

O

@tab

T

@tab

D

@tab

I

@item

<R> @ref{1cad,,tp_name}

@tab

const char *

@tab

__name__

@tab

X

@tab

X

@tab

@tab

@item

@ref{b7d,,tp_basicsize}

@tab

@ref{c54,,Py_ssize_t}

@tab

@tab

X

@tab

X

@tab

@tab

X

@item

@ref{23bb,,tp_itemsize}

@tab

@ref{c54,,Py_ssize_t}

@tab

@tab

@tab

X

@tab

@tab

X

@item

@ref{4efb,,tp_dealloc}

@tab

@ref{51e2,,destructor}

@tab

@tab

X

@tab

X

@tab

@tab

X

@item

@ref{52d5,,tp_vectorcall_offset}

@tab

@ref{c54,,Py_ssize_t}

@tab

@tab

@tab

X

@tab

@tab

X

@item

(@ref{4f2c,,tp_getattr})

@tab

@ref{51e3,,getattrfunc}

@tab

__getattribute__,
__getattr__

@tab

@tab

@tab

@tab

G

@item

(@ref{4f2d,,tp_setattr})

@tab

@ref{51f3,,setattrfunc}

@tab

__setattr__,
__delattr__

@tab

@tab

@tab

@tab

G

@item

@ref{10ce,,tp_as_async}

@tab

@ref{5329,,PyAsyncMethods} *

@tab

@ref{565f,,서브 슬롯}

@tab

@tab

@tab

@tab

%

@item

@ref{4f23,,tp_repr}

@tab

@ref{51f1,,reprfunc}

@tab

__repr__

@tab

X

@tab

X

@tab

@tab

X

@item

@ref{b81,,tp_as_number}

@tab

@ref{1623,,PyNumberMethods} *

@tab

@ref{565f,,서브 슬롯}

@tab

@tab

@tab

@tab

%

@item

@ref{5660,,tp_as_sequence}

@tab

@ref{4f33,,PySequenceMethods} *

@tab

@ref{565f,,서브 슬롯}

@tab

@tab

@tab

@tab

%

@item

@ref{5661,,tp_as_mapping}

@tab

@ref{4f34,,PyMappingMethods} *

@tab

@ref{565f,,서브 슬롯}

@tab

@tab

@tab

@tab

%

@item

@ref{4f35,,tp_hash}

@tab

@ref{51e8,,hashfunc}

@tab

__hash__

@tab

X

@tab

@tab

@tab

G

@item

@ref{77a,,tp_call}

@tab

@ref{51f8,,ternaryfunc}

@tab

__call__

@tab

@tab

X

@tab

@tab

X

@item

@ref{4f24,,tp_str}

@tab

@ref{51f1,,reprfunc}

@tab

__str__

@tab

X

@tab

@tab

@tab

X

@item

@ref{1a64,,tp_getattro}

@tab

@ref{51e4,,getattrofunc}

@tab

__getattribute__,
__getattr__

@tab

X

@tab

X

@tab

@tab

G

@item

@ref{4f27,,tp_setattro}

@tab

@ref{51f4,,setattrofunc}

@tab

__setattr__,
__delattr__

@tab

X

@tab

X

@tab

@tab

G

@item

@ref{b7f,,tp_as_buffer}

@tab

@ref{5330,,PyBufferProcs} *

@tab

@ref{565f,,서브 슬롯}

@tab

@tab

@tab

@tab

%

@item

@ref{1c6f,,tp_flags}

@tab

unsigned long

@tab

@tab

X

@tab

X

@tab

@tab

?

@item

@ref{4f0a,,tp_doc}

@tab

const char *

@tab

__doc__

@tab

X

@tab

X

@tab

@tab

@item

@ref{981,,tp_traverse}

@tab

@ref{51f9,,traverseproc}

@tab

@tab

@tab

X

@tab

@tab

G

@item

@ref{4f21,,tp_clear}

@tab

@ref{51ea,,inquiry}

@tab

@tab

@tab

X

@tab

@tab

G

@item

@ref{4f2f,,tp_richcompare}

@tab

@ref{51f2,,richcmpfunc}

@tab

__lt__,
__le__,
__eq__,
__ne__,
__gt__,
__ge__

@tab

X

@tab

@tab

@tab

G

@item

(@ref{b7e,,tp_weaklistoffset})

@tab

@ref{c54,,Py_ssize_t}

@tab

@tab

@tab

X

@tab

@tab

?

@item

@ref{16f4,,tp_iter}

@tab

@ref{51e6,,getiterfunc}

@tab

__iter__

@tab

@tab

@tab

@tab

X

@item

@ref{16f5,,tp_iternext}

@tab

@ref{51eb,,iternextfunc}

@tab

__next__

@tab

@tab

@tab

@tab

X

@item

@ref{4f13,,tp_methods}

@tab

@ref{16dc,,PyMethodDef} []

@tab

@tab

X

@tab

X

@tab

@tab

@item

@ref{4f11,,tp_members}

@tab

@ref{770,,PyMemberDef} []

@tab

@tab

@tab

X

@tab

@tab

@item

@ref{4f16,,tp_getset}

@tab

@ref{db1,,PyGetSetDef} []

@tab

@tab

X

@tab

X

@tab

@tab

@item

@ref{2372,,tp_base}

@tab

@ref{c9b,,PyTypeObject} *

@tab

__base__

@tab

@tab

@tab

X

@tab

@item

@ref{1a8c,,tp_dict}

@tab

@ref{5dc,,PyObject} *

@tab

__dict__

@tab

@tab

@tab

?

@tab

@item

@ref{5662,,tp_descr_get}

@tab

@ref{51e0,,descrgetfunc}

@tab

__get__

@tab

@tab

@tab

@tab

X

@item

@ref{1cb1,,tp_descr_set}

@tab

@ref{51e1,,descrsetfunc}

@tab

__set__,
__delete__

@tab

@tab

@tab

@tab

X

@item

(@ref{532b,,tp_dictoffset})

@tab

@ref{c54,,Py_ssize_t}

@tab

@tab

@tab

X

@tab

@tab

?

@item

@ref{7a0,,tp_init}

@tab

@ref{51e9,,initproc}

@tab

__init__

@tab

X

@tab

X

@tab

@tab

X

@item

@ref{4f0f,,tp_alloc}

@tab

@ref{51de,,allocfunc}

@tab

@tab

X

@tab

@tab

?

@tab

?

@item

@ref{79e,,tp_new}

@tab

@ref{51ed,,newfunc}

@tab

__new__

@tab

X

@tab

X

@tab

?

@tab

?

@item

@ref{4f0e,,tp_free}

@tab

@ref{5485,,freefunc}

@tab

@tab

X

@tab

X

@tab

?

@tab

?

@item

@ref{5663,,tp_is_gc}

@tab

@ref{51ea,,inquiry}

@tab

@tab

@tab

X

@tab

@tab

X

@item

<@ref{5664,,tp_bases}>

@tab

@ref{5dc,,PyObject} *

@tab

__bases__

@tab

@tab

@tab

~

@tab

@item

<@ref{532d,,tp_mro}>

@tab

@ref{5dc,,PyObject} *

@tab

__mro__

@tab

@tab

@tab

~

@tab

@item

[@ref{532e,,tp_cache}]

@tab

@ref{5dc,,PyObject} *

@tab

@tab

@tab

@tab

@tab

@item

[@ref{791,,tp_subclasses}]

@tab

void *

@tab

__subclasses__

@tab

@tab

@tab

@tab

@item

[@ref{532f,,tp_weaklist}]

@tab

@ref{5dc,,PyObject} *

@tab

@tab

@tab

@tab

@tab

@item

(@ref{5665,,tp_del})

@tab

@ref{51e2,,destructor}

@tab

@tab

@tab

@tab

@tab

@item

[@ref{5666,,tp_version_tag}]

@tab

unsigned int

@tab

@tab

@tab

@tab

@tab

@item

@ref{c9c,,tp_finalize}

@tab

@ref{51e2,,destructor}

@tab

__del__

@tab

@tab

@tab

@tab

X

@item

@ref{198b,,tp_vectorcall}

@tab

@ref{778,,vectorcallfunc}

@tab

@tab

@tab

@tab

@tab

@item

[@ref{5667,,tp_watched}]

@tab

unsigned char

@tab

@tab

@tab

@tab

@tab

@end multitable


@node 서브 슬롯,슬롯 typedef,“tp 슬롯”,간략 참조
@anchor{c-api/typeobj id3}@anchor{5668}@anchor{c-api/typeobj sub-slots}@anchor{565f}
@subsubsection 서브 슬롯



@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxx} 
@headitem

슬롯

@tab

@ref{565e,,형}

@tab

특수 메서드

@item

@ref{5669,,am_await}

@tab

@ref{51fa,,unaryfunc}

@tab

__await__

@item

@ref{566a,,am_aiter}

@tab

@ref{51fa,,unaryfunc}

@tab

__aiter__

@item

@ref{566b,,am_anext}

@tab

@ref{51fa,,unaryfunc}

@tab

__anext__

@item

@ref{566c,,am_send}

@tab

@ref{566d,,sendfunc}

@tab

@item

@tab

@tab

@item

@ref{5321,,nb_add}

@tab

@ref{51df,,binaryfunc}

@tab

__add__
__radd__

@item

@ref{566e,,nb_inplace_add}

@tab

@ref{51df,,binaryfunc}

@tab

__iadd__

@item

@ref{566f,,nb_subtract}

@tab

@ref{51df,,binaryfunc}

@tab

__sub__
__rsub__

@item

@ref{5670,,nb_inplace_subtract}

@tab

@ref{51df,,binaryfunc}

@tab

__isub__

@item

@ref{5671,,nb_multiply}

@tab

@ref{51df,,binaryfunc}

@tab

__mul__
__rmul__

@item

@ref{5672,,nb_inplace_multiply}

@tab

@ref{51df,,binaryfunc}

@tab

__imul__

@item

@ref{5673,,nb_remainder}

@tab

@ref{51df,,binaryfunc}

@tab

__mod__
__rmod__

@item

@ref{5674,,nb_inplace_remainder}

@tab

@ref{51df,,binaryfunc}

@tab

__imod__

@item

@ref{5675,,nb_divmod}

@tab

@ref{51df,,binaryfunc}

@tab

__divmod__
__rdivmod__

@item

@ref{5676,,nb_power}

@tab

@ref{51f8,,ternaryfunc}

@tab

__pow__
__rpow__

@item

@ref{5677,,nb_inplace_power}

@tab

@ref{51f8,,ternaryfunc}

@tab

__ipow__

@item

@ref{5678,,nb_negative}

@tab

@ref{51fa,,unaryfunc}

@tab

__neg__

@item

@ref{5679,,nb_positive}

@tab

@ref{51fa,,unaryfunc}

@tab

__pos__

@item

@ref{567a,,nb_absolute}

@tab

@ref{51fa,,unaryfunc}

@tab

__abs__

@item

@ref{567b,,nb_bool}

@tab

@ref{51ea,,inquiry}

@tab

__bool__

@item

@ref{567c,,nb_invert}

@tab

@ref{51fa,,unaryfunc}

@tab

__invert__

@item

@ref{567d,,nb_lshift}

@tab

@ref{51df,,binaryfunc}

@tab

__lshift__
__rlshift__

@item

@ref{567e,,nb_inplace_lshift}

@tab

@ref{51df,,binaryfunc}

@tab

__ilshift__

@item

@ref{567f,,nb_rshift}

@tab

@ref{51df,,binaryfunc}

@tab

__rshift__
__rrshift__

@item

@ref{5680,,nb_inplace_rshift}

@tab

@ref{51df,,binaryfunc}

@tab

__irshift__

@item

@ref{5681,,nb_and}

@tab

@ref{51df,,binaryfunc}

@tab

__and__
__rand__

@item

@ref{5682,,nb_inplace_and}

@tab

@ref{51df,,binaryfunc}

@tab

__iand__

@item

@ref{5683,,nb_xor}

@tab

@ref{51df,,binaryfunc}

@tab

__xor__
__rxor__

@item

@ref{5684,,nb_inplace_xor}

@tab

@ref{51df,,binaryfunc}

@tab

__ixor__

@item

@ref{5685,,nb_or}

@tab

@ref{51df,,binaryfunc}

@tab

__or__
__ror__

@item

@ref{5686,,nb_inplace_or}

@tab

@ref{51df,,binaryfunc}

@tab

__ior__

@item

@ref{5687,,nb_int}

@tab

@ref{51fa,,unaryfunc}

@tab

__int__

@item

@ref{5688,,nb_reserved}

@tab

void *

@tab

@item

@ref{5689,,nb_float}

@tab

@ref{51fa,,unaryfunc}

@tab

__float__

@item

@ref{568a,,nb_floor_divide}

@tab

@ref{51df,,binaryfunc}

@tab

__floordiv__

@item

@ref{568b,,nb_inplace_floor_divide}

@tab

@ref{51df,,binaryfunc}

@tab

__ifloordiv__

@item

@ref{568c,,nb_true_divide}

@tab

@ref{51df,,binaryfunc}

@tab

__truediv__

@item

@ref{568d,,nb_inplace_true_divide}

@tab

@ref{51df,,binaryfunc}

@tab

__itruediv__

@item

@ref{1622,,nb_index}

@tab

@ref{51fa,,unaryfunc}

@tab

__index__

@item

@ref{568e,,nb_matrix_multiply}

@tab

@ref{51df,,binaryfunc}

@tab

__matmul__
__rmatmul__

@item

@ref{568f,,nb_inplace_matrix_multiply}

@tab

@ref{51df,,binaryfunc}

@tab

__imatmul__

@item

@tab

@tab

@item

@ref{5690,,mp_length}

@tab

@ref{51ec,,lenfunc}

@tab

__len__

@item

@ref{1cf3,,mp_subscript}

@tab

@ref{51df,,binaryfunc}

@tab

__getitem__

@item

@ref{5691,,mp_ass_subscript}

@tab

@ref{51ee,,objobjargproc}

@tab

__setitem__,
__delitem__

@item

@tab

@tab

@item

@ref{532a,,sq_length}

@tab

@ref{51ec,,lenfunc}

@tab

__len__

@item

@ref{5692,,sq_concat}

@tab

@ref{51df,,binaryfunc}

@tab

__add__

@item

@ref{5693,,sq_repeat}

@tab

@ref{51f6,,ssizeargfunc}

@tab

__mul__

@item

@ref{1cf2,,sq_item}

@tab

@ref{51f6,,ssizeargfunc}

@tab

__getitem__

@item

@ref{5694,,sq_ass_item}

@tab

@ref{51f7,,ssizeobjargproc}

@tab

__setitem__
__delitem__

@item

@ref{5695,,sq_contains}

@tab

@ref{51ef,,objobjproc}

@tab

__contains__

@item

@ref{5696,,sq_inplace_concat}

@tab

@ref{51df,,binaryfunc}

@tab

__iadd__

@item

@ref{5697,,sq_inplace_repeat}

@tab

@ref{51f6,,ssizeargfunc}

@tab

__imul__

@item

@tab

@tab

@item

@ref{965,,bf_getbuffer}

@tab

@ref{51e5,,getbufferproc()}

@tab

__buffer__

@item

@ref{966,,bf_releasebuffer}

@tab

@ref{51f0,,releasebufferproc()}

@tab

__release_buffer__

@end multitable


@node 슬롯 typedef,,서브 슬롯,간략 참조
@anchor{c-api/typeobj slot-typedefs}@anchor{5698}@anchor{c-api/typeobj slot-typedefs-table}@anchor{565e}
@subsubsection 슬롯 typedef



@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

typedef

@tab

매개 변수 형

@tab

반환형

@item

@ref{51de,,allocfunc}

@tab


@display
@ref{c9b,,PyTypeObject} *@w{ }
@ref{c54,,Py_ssize_t}@w{ }
@end display



@tab

@ref{5dc,,PyObject} *

@item

@ref{51e2,,destructor}

@tab

@ref{5dc,,PyObject} *

@tab

void

@item

@ref{5485,,freefunc}

@tab

void *

@tab

void

@item

@ref{51f9,,traverseproc}

@tab


@display
@ref{5dc,,PyObject} *@w{ }
@ref{51fb,,visitproc}@w{ }
void *@w{ }
@end display



@tab

int

@item

@ref{51ed,,newfunc}

@tab


@display
@ref{c9b,,PyTypeObject} *@w{ }
@ref{5dc,,PyObject} *@w{ }
@ref{5dc,,PyObject} *@w{ }
@end display



@tab

@ref{5dc,,PyObject} *

@item

@ref{51e9,,initproc}

@tab


@display
@ref{5dc,,PyObject} *@w{ }
@ref{5dc,,PyObject} *@w{ }
@ref{5dc,,PyObject} *@w{ }
@end display



@tab

int

@item

@ref{51f1,,reprfunc}

@tab

@ref{5dc,,PyObject} *

@tab

@ref{5dc,,PyObject} *

@item

@ref{51e3,,getattrfunc}

@tab


@display
@ref{5dc,,PyObject} *@w{ }
const char *@w{ }
@end display



@tab

@ref{5dc,,PyObject} *

@item

@ref{51f3,,setattrfunc}

@tab


@display
@ref{5dc,,PyObject} *@w{ }
const char *@w{ }
@ref{5dc,,PyObject} *@w{ }
@end display



@tab

int

@item

@ref{51e4,,getattrofunc}

@tab


@display
@ref{5dc,,PyObject} *@w{ }
@ref{5dc,,PyObject} *@w{ }
@end display



@tab

@ref{5dc,,PyObject} *

@item

@ref{51f4,,setattrofunc}

@tab


@display
@ref{5dc,,PyObject} *@w{ }
@ref{5dc,,PyObject} *@w{ }
@ref{5dc,,PyObject} *@w{ }
@end display



@tab

int

@item

@ref{51e0,,descrgetfunc}

@tab


@display
@ref{5dc,,PyObject} *@w{ }
@ref{5dc,,PyObject} *@w{ }
@ref{5dc,,PyObject} *@w{ }
@end display



@tab

@ref{5dc,,PyObject} *

@item

@ref{51e1,,descrsetfunc}

@tab


@display
@ref{5dc,,PyObject} *@w{ }
@ref{5dc,,PyObject} *@w{ }
@ref{5dc,,PyObject} *@w{ }
@end display



@tab

int

@item

@ref{51e8,,hashfunc}

@tab

@ref{5dc,,PyObject} *

@tab

Py_hash_t

@item

@ref{51f2,,richcmpfunc}

@tab


@display
@ref{5dc,,PyObject} *@w{ }
@ref{5dc,,PyObject} *@w{ }
int@w{ }
@end display



@tab

@ref{5dc,,PyObject} *

@item

@ref{51e6,,getiterfunc}

@tab

@ref{5dc,,PyObject} *

@tab

@ref{5dc,,PyObject} *

@item

@ref{51eb,,iternextfunc}

@tab

@ref{5dc,,PyObject} *

@tab

@ref{5dc,,PyObject} *

@item

@ref{51ec,,lenfunc}

@tab

@ref{5dc,,PyObject} *

@tab

@ref{c54,,Py_ssize_t}

@item

@ref{51e5,,getbufferproc}

@tab


@display
@ref{5dc,,PyObject} *@w{ }
@ref{95b,,Py_buffer} *@w{ }
int@w{ }
@end display



@tab

int

@item

@ref{51f0,,releasebufferproc}

@tab


@display
@ref{5dc,,PyObject} *@w{ }
@ref{95b,,Py_buffer} *@w{ }
@end display



@tab

void

@item

@ref{51ea,,inquiry}

@tab

@ref{5dc,,PyObject} *

@tab

int

@item

@ref{51fa,,unaryfunc}

@tab


@display
@ref{5dc,,PyObject} *@w{ }
@end display



@tab

@ref{5dc,,PyObject} *

@item

@ref{51df,,binaryfunc}

@tab


@display
@ref{5dc,,PyObject} *@w{ }
@ref{5dc,,PyObject} *@w{ }
@end display



@tab

@ref{5dc,,PyObject} *

@item

@ref{51f8,,ternaryfunc}

@tab


@display
@ref{5dc,,PyObject} *@w{ }
@ref{5dc,,PyObject} *@w{ }
@ref{5dc,,PyObject} *@w{ }
@end display



@tab

@ref{5dc,,PyObject} *

@item

@ref{51f6,,ssizeargfunc}

@tab


@display
@ref{5dc,,PyObject} *@w{ }
@ref{c54,,Py_ssize_t}@w{ }
@end display



@tab

@ref{5dc,,PyObject} *

@item

@ref{51f7,,ssizeobjargproc}

@tab


@display
@ref{5dc,,PyObject} *@w{ }
@ref{c54,,Py_ssize_t}@w{ }
@ref{5dc,,PyObject} *@w{ }
@end display



@tab

int

@item

@ref{51ef,,objobjproc}

@tab


@display
@ref{5dc,,PyObject} *@w{ }
@ref{5dc,,PyObject} *@w{ }
@end display



@tab

int

@item

@ref{51ee,,objobjargproc}

@tab


@display
@ref{5dc,,PyObject} *@w{ }
@ref{5dc,,PyObject} *@w{ }
@ref{5dc,,PyObject} *@w{ }
@end display



@tab

int

@end multitable


자세한 내용은 아래 @ref{5699,,슬롯 형 typedef}를 참조하십시오.

@node PyTypeObject 정의,PyObject 슬롯,간략 참조,Type Object Structures
@anchor{c-api/typeobj pytypeobject-definition}@anchor{569a}
@subsubsection PyTypeObject 정의


The structure definition for @ref{c9b,,PyTypeObject} can be found in
@code{Include/cpython/object.h}.  For convenience of reference, this repeats the
definition found there:

@c XXX Drop this?

@example
typedef struct _typeobject @{
    PyObject_VAR_HEAD
    const char *tp_name; /* For printing, in format "<module>.<name>" */
    Py_ssize_t tp_basicsize, tp_itemsize; /* For allocation */

    /* Methods to implement standard operations */

    destructor tp_dealloc;
    Py_ssize_t tp_vectorcall_offset;
    getattrfunc tp_getattr;
    setattrfunc tp_setattr;
    PyAsyncMethods *tp_as_async; /* formerly known as tp_compare (Python 2)
                                    or tp_reserved (Python 3) */
    reprfunc tp_repr;

    /* Method suites for standard classes */

    PyNumberMethods *tp_as_number;
    PySequenceMethods *tp_as_sequence;
    PyMappingMethods *tp_as_mapping;

    /* More standard operations (here for binary compatibility) */

    hashfunc tp_hash;
    ternaryfunc tp_call;
    reprfunc tp_str;
    getattrofunc tp_getattro;
    setattrofunc tp_setattro;

    /* Functions to access object as input/output buffer */
    PyBufferProcs *tp_as_buffer;

    /* Flags to define presence of optional/expanded features */
    unsigned long tp_flags;

    const char *tp_doc; /* Documentation string */

    /* Assigned meaning in release 2.0 */
    /* call function for all accessible objects */
    traverseproc tp_traverse;

    /* delete references to contained objects */
    inquiry tp_clear;

    /* Assigned meaning in release 2.1 */
    /* rich comparisons */
    richcmpfunc tp_richcompare;

    /* weak reference enabler */
    Py_ssize_t tp_weaklistoffset;

    /* Iterators */
    getiterfunc tp_iter;
    iternextfunc tp_iternext;

    /* Attribute descriptor and subclassing stuff */
    PyMethodDef *tp_methods;
    PyMemberDef *tp_members;
    PyGetSetDef *tp_getset;
    // Strong reference on a heap type, borrowed reference on a static type
    PyTypeObject *tp_base;
    PyObject *tp_dict;
    descrgetfunc tp_descr_get;
    descrsetfunc tp_descr_set;
    Py_ssize_t tp_dictoffset;
    initproc tp_init;
    allocfunc tp_alloc;
    newfunc tp_new;
    freefunc tp_free; /* Low-level free-memory routine */
    inquiry tp_is_gc; /* For PyObject_IS_GC */
    PyObject *tp_bases;
    PyObject *tp_mro; /* method resolution order */
    PyObject *tp_cache; /* no longer used */
    void *tp_subclasses;  /* for static builtin types this is an index */
    PyObject *tp_weaklist; /* not used for static builtin types */
    destructor tp_del;

    /* Type attribute cache version tag. Added in version 2.6.
     * If zero, the cache is invalid and must be initialized.
     */
    unsigned int tp_version_tag;

    destructor tp_finalize;
    vectorcallfunc tp_vectorcall;

    /* bitset of which type-watchers care about this type */
    unsigned char tp_watched;

    /* Number of tp_version_tag values used.
     * Set to _Py_ATTR_CACHE_UNUSED if the attribute cache is
     * disabled for this type (e.g. due to custom MRO entries).
     * Otherwise, limited to MAX_VERSIONS_PER_CLASS (defined elsewhere).
     */
    uint16_t tp_versions_used;
@} PyTypeObject;
@end example

@node PyObject 슬롯,PyVarObject 슬롯,PyTypeObject 정의,Type Object Structures
@anchor{c-api/typeobj pyobject-slots}@anchor{569b}
@subsubsection PyObject 슬롯


The type object structure extends the @ref{4715,,PyVarObject} structure. The
@ref{515b,,ob_size} field is used for dynamic types (created by @code{type_new()},
usually called from a class statement). Note that @ref{76e,,PyType_Type} (the
metatype) initializes @ref{23bb,,tp_itemsize}, which means that its instances (i.e.
type objects) `must' have the @code{ob_size} field.

@ref{a9f,,PyObject.ob_refcnt}

@quotation

The type object’s reference count is initialized to @code{1} by the
@code{PyObject_HEAD_INIT} macro.  Note that for @ref{982,,statically allocated type objects}, the type’s instances (objects whose @ref{4f0c,,ob_type}
points back to the type) do `not' count as references.  But for
@ref{b5e,,dynamically allocated type objects}, the instances `do'
count as references.

`계승:'

이 필드는 서브 형에 의해 상속되지 않습니다.
@end quotation

@ref{4f0c,,PyObject.ob_type}

@quotation

이것은 형의 형, 즉 메타 형(metatype)입니다. @code{PyObject_HEAD_INIT} 매크로에 대한 인자로 초기화되며, 값은 일반적으로 @code{&PyType_Type}이어야 합니다. 그러나, (적어도) 윈도우에서 사용 가능해야 하는 동적으로 로드 가능한 확장 모듈의 경우, 컴파일러는 유효한 초기화자가 아니라고 불평합니다. 따라서, 규칙은 @code{NULL}을 @code{PyObject_HEAD_INIT} 매크로로 전달하고, 다른 작업을 수행하기 전에 모듈의 초기화 함수 시작에서 필드를 명시적으로 초기화하는 것입니다. 이것은 일반적으로 다음과 같이 수행됩니다:

@example
Foo_Type.ob_type = &PyType_Type;
@end example

This should be done before any instances of the type are created.
@ref{97f,,PyType_Ready()} checks if @ref{4f0c,,ob_type} is @code{NULL}, and if so,
initializes it to the @code{ob_type} field of the base class.
@code{PyType_Ready()} will not change this field if it is non-zero.

`계승:'

이 필드는 서브 형으로 상속됩니다.
@end quotation

@node PyVarObject 슬롯,PyTypeObject 슬롯,PyObject 슬롯,Type Object Structures
@anchor{c-api/typeobj pyvarobject-slots}@anchor{569c}
@subsubsection PyVarObject 슬롯


@ref{515b,,PyVarObject.ob_size}

@quotation

For @ref{982,,statically allocated type objects}, this should be
initialized to zero. For @ref{b5e,,dynamically allocated type objects}, this field has a special internal meaning.

This field should be accessed using the @ref{984,,Py_SIZE()} macro.

`계승:'

이 필드는 서브 형에 의해 상속되지 않습니다.
@end quotation

@node PyTypeObject 슬롯,Static Types,PyVarObject 슬롯,Type Object Structures
@anchor{c-api/typeobj pytypeobject-slots}@anchor{569d}
@subsubsection PyTypeObject 슬롯


Each slot has a section describing inheritance.  If @ref{97f,,PyType_Ready()}
may set a value when the field is set to @code{NULL} then there will also be
a “Default” section.  (Note that many fields set on @ref{4fb4,,PyBaseObject_Type}
and @ref{76e,,PyType_Type} effectively act as defaults.)

@geindex PyTypeObject.tp_name (C member)
@anchor{c-api/typeobj c PyTypeObject tp_name}@anchor{1cad}
@deffn {C 멤버 변수} const char *@ref{c9b,,PyTypeObject}.tp_name

Pointer to a NUL-terminated string containing the name of the type. For types
that are accessible as module globals, the string should be the full module
name, followed by a dot, followed by the type name; for built-in types, it
should be just the type name.  If the module is a submodule of a package, the
full package name is part of the full module name.  For example, a type named
@code{T} defined in module @code{M} in subpackage @code{Q} in package @code{P}
should have the @ref{1cad,,tp_name} initializer @code{"P.Q.M.T"}.

For @ref{b5e,,dynamically allocated type objects},
this should just be the type name, and
the module name explicitly stored in the type dict as the value for key
@code{'__module__'}.

For @ref{982,,statically allocated type objects},
the `tp_name' field should contain a dot.
Everything before the last dot is made accessible as the @ref{615,,__module__}
attribute, and everything after the last dot is made accessible as the
@ref{16b0,,__name__} attribute.

If no dot is present, the entire @ref{1cad,,tp_name} field is made accessible as the
@ref{16b0,,__name__} attribute, and the @ref{615,,__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.

이 필드는 @code{NULL}이 아니어야 합니다. @ref{c9b,,PyTypeObject()}에서 유일하게 필요한 필드입니다 (잠재적인 @ref{23bb,,tp_itemsize}를 제외하고).

`계승:'

이 필드는 서브 형에 의해 상속되지 않습니다.
@end deffn

@geindex PyTypeObject.tp_basicsize (C member)
@geindex PyTypeObject.tp_itemsize (C member)
@anchor{c-api/typeobj c PyTypeObject tp_basicsize}@anchor{b7d}
@deffn {C 멤버 변수} @ref{c54,,Py_ssize_t} @ref{c9b,,PyTypeObject}.tp_basicsize
@anchor{c-api/typeobj c PyTypeObject tp_itemsize}@anchor{23bb}
@deffnx {C 멤버 변수} @ref{c54,,Py_ssize_t} @ref{c9b,,PyTypeObject}.tp_itemsize

이 필드를 사용하면 형 인스턴스의 크기를 바이트 단위로 계산할 수 있습니다.

There are two kinds of types: types with fixed-length instances have a zero
@code{tp_itemsize} field, types with variable-length instances have a non-zero
@code{tp_itemsize} field.  For a type with fixed-length instances, all
instances have the same size, given in @code{tp_basicsize}.
(Exceptions to this rule can be made using
@ref{1aa7,,PyUnstable_Object_GC_NewWithExtraData()}.)

For a type with variable-length instances, the instances must have an
@ref{515b,,ob_size} field, and the instance size is
@code{tp_basicsize} plus N times @code{tp_itemsize},
where N is the “length” of the object.

Functions like @ref{b7c,,PyObject_NewVar()} will take the value of N as an
argument, and store in the instance’s @ref{515b,,ob_size} field.
Note that the @code{ob_size} field may later be used for
other purposes. For example, @ref{19b,,int} instances use the bits of
@code{ob_size} in an implementation-defined
way; the underlying storage and its size should be accessed using
@ref{3a8,,PyLong_Export()}.

@cartouche
@quotation 참고 
The @ref{515b,,ob_size} field should be accessed using
the @ref{984,,Py_SIZE()} and @ref{985,,Py_SET_SIZE()} macros.
@end quotation
@end cartouche

Also, the presence of an @ref{515b,,ob_size} field in the
instance layout doesn’t mean that the instance structure is variable-length.
For example, the @ref{24d,,list} type has fixed-length instances, yet those
instances have a @code{ob_size} field.
(As with @ref{19b,,int}, avoid reading lists’ @code{ob_size} directly.
Call @ref{161f,,PyList_Size()} instead.)

The @code{tp_basicsize} includes size needed for data of the type’s
@ref{2372,,tp_base}, plus any extra data needed
by each instance.

The  correct way to set @code{tp_basicsize} is to use the
@code{sizeof} operator on the struct used to declare the instance layout.
This struct must include the struct used to declare the base type.
In other words, @code{tp_basicsize} must be greater than or equal
to the base’s @code{tp_basicsize}.

Since every type is a subtype of @ref{c7d,,object}, this struct must
include @ref{5dc,,PyObject} or @ref{4715,,PyVarObject} (depending on
whether @ref{515b,,ob_size} should be included). These are
usually defined by the macro @ref{14e2,,PyObject_HEAD} or
@ref{5639,,PyObject_VAR_HEAD}, respectively.

The basic size does not include the GC header size, as that header is not
part of @ref{14e2,,PyObject_HEAD}.

For cases where struct used to declare the base type is unknown,
see @ref{769,,PyType_Spec.basicsize} and @ref{771,,PyType_FromMetaclass()}.

Notes about alignment:


@itemize -

@item 
@code{tp_basicsize} must be a multiple of @code{_Alignof(PyObject)}.
When using @code{sizeof} on a @code{struct} that includes
@ref{14e2,,PyObject_HEAD}, as recommended, the compiler ensures this.
When not using a C @code{struct}, or when using compiler
extensions like @code{__attribute__((packed))}, it is up to you.

@item 
If the variable items require a particular alignment,
@code{tp_basicsize} and @code{tp_itemsize} must each be a
multiple of that alignment.
For example, if a type’s variable part stores a @code{double}, it is
your responsibility that both fields are a multiple of
@code{_Alignof(double)}.
@end itemize

`계승:'

These fields are inherited separately by subtypes.
(That is, if the field is set to zero, @ref{97f,,PyType_Ready()} will copy
the value from the base type, indicating that the instances do not
need additional storage.)

If the base type has a non-zero @ref{23bb,,tp_itemsize}, it is generally not safe to set
@code{tp_itemsize} to a different non-zero value in a subtype (though this
depends on the implementation of the base type).
@end deffn

@geindex PyTypeObject.tp_dealloc (C member)
@anchor{c-api/typeobj c PyTypeObject tp_dealloc}@anchor{4efb}
@deffn {C 멤버 변수} @ref{51e2,,destructor} @ref{c9b,,PyTypeObject}.tp_dealloc

` The corresponding @ref{511b,,slot ID} @code{Py_tp_dealloc} is part of the @ref{774,,안정 ABI}.'
@geindex Py_tp_dealloc (C macro)
@anchor{c-api/typeobj c Py_tp_dealloc}@anchor{51c5}

A pointer to the instance destructor function.  The function signature is:

@example
void tp_dealloc(PyObject *self);
@end example

The destructor function should remove all references which the instance owns
(e.g., call @ref{797,,Py_CLEAR()}), free all memory buffers owned by the
instance, and call the type’s @ref{4f0e,,tp_free} function to
free the object itself.

If you may call functions that may set the error indicator, you must use
@ref{429,,PyErr_GetRaisedException()} and @ref{42c,,PyErr_SetRaisedException()}
to ensure you don’t clobber a preexisting error indicator (the deallocation
could have occurred while processing a different error):

@example
static void
foo_dealloc(foo_object *self)
@{
    PyObject *et, *ev, *etb;
    PyObject *exc = PyErr_GetRaisedException();
    ...
    PyErr_SetRaisedException(exc);
@}
@end example

The dealloc handler itself must not raise an exception; if it hits an error
case it should call @ref{5f0,,PyErr_FormatUnraisable()} to log (and clear) an
unraisable exception.

No guarantees are made about when an object is destroyed, except:


@itemize *

@item 
Python will destroy an object immediately or some time after the final
reference to the object is deleted, unless its finalizer
(@ref{c9c,,tp_finalize}) subsequently resurrects the
object.

@item 
An object will not be destroyed while it is being automatically finalized
(@ref{c9c,,tp_finalize}) or automatically cleared
(@ref{4f21,,tp_clear}).
@end itemize

CPython currently destroys an object immediately from @ref{78f,,Py_DECREF()}
when the new reference count is zero, but this may change in a future
version.

It is recommended to call @ref{562f,,PyObject_CallFinalizerFromDealloc()} at the
beginning of @code{tp_dealloc} to guarantee that the object is always
finalized before destruction.

If the type supports garbage collection (the @ref{980,,Py_TPFLAGS_HAVE_GC}
flag is set), the destructor should call @ref{170a,,PyObject_GC_UnTrack()}
before clearing any member fields.

It is permissible to call @ref{4f21,,tp_clear} from
@code{tp_dealloc} to reduce code duplication and to guarantee that the
object is always cleared before destruction.  Beware that
@code{tp_clear} might have already been called.

If the type is heap allocated (@ref{aac,,Py_TPFLAGS_HEAPTYPE}), the
deallocator should release the owned reference to its type object (via
@ref{78f,,Py_DECREF()}) after calling the type deallocator.  See the example
code below.:

@example
static void
foo_dealloc(PyObject *op)
@{
   foo_object *self = (foo_object *) op;
   PyObject_GC_UnTrack(self);
   Py_CLEAR(self->ref);
   Py_TYPE(self)->tp_free(self);
@}
@end example

@code{tp_dealloc} must leave the exception status unchanged.  If it
needs to call something that might raise an exception, the exception state
must be backed up first and restored later (after logging any exceptions
with @ref{5ef,,PyErr_WriteUnraisable()}).

Example:

@example
static void
foo_dealloc(PyObject *self)
@{
    PyObject *exc = PyErr_GetRaisedException();

    if (PyObject_CallFinalizerFromDealloc(self) < 0) @{
        // self was resurrected.
        goto done;
    @}

    PyTypeObject *tp = Py_TYPE(self);

    if (tp->tp_flags & Py_TPFLAGS_HAVE_GC) @{
        PyObject_GC_UnTrack(self);
    @}

    // Optional, but convenient to avoid code duplication.
    if (tp->tp_clear && tp->tp_clear(self) < 0) @{
        PyErr_WriteUnraisable(self);
    @}

    // Any additional destruction goes here.

    tp->tp_free(self);
    self = NULL;  // In case PyErr_WriteUnraisable() is called below.

    if (tp->tp_flags & Py_TPFLAGS_HEAPTYPE) @{
        Py_CLEAR(tp);
    @}

done:
    // Optional, if something was called that might have raised an
    // exception.
    if (PyErr_Occurred()) @{
        PyErr_WriteUnraisable(self);
    @}
    PyErr_SetRaisedException(exc);
@}
@end example

@code{tp_dealloc} may be called from
any Python thread, not just the thread which created the object (if the
object becomes part of a refcount cycle, that cycle might be collected by
a garbage collection on any thread).  This is not a problem for Python
API calls, since the thread on which @code{tp_dealloc} is called
with an @ref{4f10,,attached thread state}.  However, if the object being
destroyed in turn destroys objects from some other C library, care
should be taken to ensure that destroying those objects on the thread
which called @code{tp_dealloc} will not violate any assumptions of
the library.

`계승:'

이 필드는 서브 형으로 상속됩니다.


@subsubheading 더 보기


@ref{562b,,Object Life Cycle} for details about how this slot relates to other slots.

@end deffn

@geindex PyTypeObject.tp_vectorcall_offset (C member)
@anchor{c-api/typeobj c PyTypeObject tp_vectorcall_offset}@anchor{52d5}
@deffn {C 멤버 변수} @ref{c54,,Py_ssize_t} @ref{c9b,,PyTypeObject}.tp_vectorcall_offset

간단한 @ref{77a,,tp_call}의 더 효율적인 대안인 @ref{773,,벡터콜(vectorcall) 프로토콜}을 사용하여 객체를 호출하는 것을 구현하는 인스턴스별 함수에 대한 선택적 오프셋입니다.

This field is only used if the flag @ref{775,,Py_TPFLAGS_HAVE_VECTORCALL}
is set. If so, this must be a positive integer containing the offset in the
instance of a @ref{778,,vectorcallfunc} pointer.

The `vectorcallfunc' pointer may be @code{NULL}, in which case the instance behaves
as if @ref{775,,Py_TPFLAGS_HAVE_VECTORCALL} was not set: calling the instance
falls back to @ref{77a,,tp_call}.

@code{Py_TPFLAGS_HAVE_VECTORCALL}을 설정하는 모든 클래스는 @ref{77a,,tp_call}도 설정해야 하고, 해당 동작이 `vectorcallfunc' 함수와 일관되도록 만들어야 합니다. `tp_call'을 @ref{777,,PyVectorcall_Call()}로 설정하면 됩니다:


버전 3.8에서 변경: 버전 3.8 이전에는, 이 슬롯의 이름이 @code{tp_print}였습니다. 파이썬 2.x에서는, 파일로 인쇄하는 데 사용되었습니다. 파이썬 3.0에서 3.7까지는, 사용되지 않았습니다.



버전 3.12에서 변경: Before version 3.12, it was not recommended for
@ref{b5e,,mutable heap types} to implement the vectorcall
protocol.
When a user sets @ref{779,,__call__} in Python code, only `tp_call' is
updated, likely making it inconsistent with the vectorcall function.
Since 3.12, setting @code{__call__} will disable vectorcall optimization
by clearing the @ref{775,,Py_TPFLAGS_HAVE_VECTORCALL} flag.


`계승:'

This field is always inherited.
However, the @ref{775,,Py_TPFLAGS_HAVE_VECTORCALL} flag is not
always inherited. If it’s not set, then the subclass won’t use
@ref{773,,vectorcall}, except when
@ref{777,,PyVectorcall_Call()} is explicitly called.
@end deffn

@geindex PyTypeObject.tp_getattr (C member)
@anchor{c-api/typeobj c PyTypeObject tp_getattr}@anchor{4f2c}
@deffn {C 멤버 변수} @ref{51e3,,getattrfunc} @ref{c9b,,PyTypeObject}.tp_getattr

` The corresponding @ref{511b,,slot ID} @code{Py_tp_getattr} is part of the @ref{774,,안정 ABI}.'
@geindex Py_tp_getattr (C macro)
@anchor{c-api/typeobj c Py_tp_getattr}@anchor{51cc}

get-attribute-string 함수에 대한 선택적 포인터.

이 필드는 폐지되었습니다. 정의될 때, @ref{1a64,,tp_getattro} 함수와 같게 작동하지만, 어트리뷰트 이름을 제공하기 위해 파이썬 문자열 객체 대신 C 문자열을 받아들이는 함수를 가리켜야 합니다.

`계승:'

Group: @ref{4f2c,,tp_getattr}, @ref{1a64,,tp_getattro}

이 필드는 @ref{1a64,,tp_getattro}와 함께 서브 형에 의해 상속됩니다: 서브 형은 서브 형의 @ref{4f2c,,tp_getattr}과 @code{tp_getattro}가 모두 @code{NULL}일 때 베이스형에서 @code{tp_getattr}과 @code{tp_getattro}를 모두 상속합니다.
@end deffn

@geindex PyTypeObject.tp_setattr (C member)
@anchor{c-api/typeobj c PyTypeObject tp_setattr}@anchor{4f2d}
@deffn {C 멤버 변수} @ref{51f3,,setattrfunc} @ref{c9b,,PyTypeObject}.tp_setattr

` The corresponding @ref{511b,,slot ID} @code{Py_tp_setattr} is part of the @ref{774,,안정 ABI}.'
@geindex Py_tp_setattr (C macro)
@anchor{c-api/typeobj c Py_tp_setattr}@anchor{51d9}

어트리뷰트 설정과 삭제를 위한 함수에 대한 선택적 포인터.

이 필드는 폐지되었습니다. 정의될 때, @ref{4f27,,tp_setattro} 함수와 같게 작동하지만, 어트리뷰트 이름을 제공하기 위해 파이썬 문자열 객체 대신 C 문자열을 받아들이는 함수를 가리켜야 합니다.

`계승:'

Group: @ref{4f2d,,tp_setattr}, @ref{4f27,,tp_setattro}

이 필드는 @ref{4f27,,tp_setattro}와 함께 서브 형에 의해 상속됩니다. 서브 형은 서브 형의 @ref{4f2d,,tp_setattr}과 @code{tp_setattro}가 모두 @code{NULL}일 때 베이스형에서 @code{tp_setattr}과 @code{tp_setattro}를 모두 상속합니다.
@end deffn

@geindex PyTypeObject.tp_as_async (C member)
@anchor{c-api/typeobj c PyTypeObject tp_as_async}@anchor{10ce}
@deffn {C 멤버 변수} @ref{5329,,PyAsyncMethods} *@ref{c9b,,PyTypeObject}.tp_as_async

C 수준에서 @ref{4c9,,어웨이터블}과 @ref{4c8,,비동기 이터레이터} 프로토콜을 구현하는 객체에만 관련된 필드를 포함하는 추가 구조체에 대한 포인터. 자세한 내용은 @ref{569e,,비동기 객체 구조체}를 참조하십시오.


Added in version 3.5: 이전에는 @code{tp_compare}와 @code{tp_reserved}라고 했습니다.


`계승:'

@ref{10ce,,tp_as_async} 필드는 상속되지 않지만, 포함된 필드는 개별적으로 상속됩니다.
@end deffn

@geindex PyTypeObject.tp_repr (C member)
@anchor{c-api/typeobj c PyTypeObject tp_repr}@anchor{4f23}
@deffn {C 멤버 변수} @ref{51f1,,reprfunc} @ref{c9b,,PyTypeObject}.tp_repr

` The corresponding @ref{511b,,slot ID} @code{Py_tp_repr} is part of the @ref{774,,안정 ABI}.'
@geindex Py_tp_repr (C macro)
@anchor{c-api/typeobj c Py_tp_repr}@anchor{51d7}

@geindex built-in function;repr

내장 함수 @ref{1c1,,repr()}을 구현하는 함수에 대한 선택적 포인터.

서명은 @ref{122e,,PyObject_Repr()}과 같습니다:

@example
PyObject *tp_repr(PyObject *self);
@end example

함수는 문자열이나 유니코드 객체를 반환해야 합니다. 이상적으로, 이 함수는 @ref{4a4,,eval()}에 전달될 때 적합한 환경이 주어지면 같은 값을 가진 객체를 반환하는 문자열을 반환해야 합니다. 이것이 가능하지 않으면, @code{'<'}로 시작하고 @code{'>'}로 끝나는 문자열을 반환해야 하는데, 이 문자열에서 객체의 형과 값을 모두 추론할 수 있어야 합니다.

`계승:'

이 필드는 서브 형으로 상속됩니다.

`기본값:'

이 필드를 설정하지 않으면, @code{<%s object at %p>} 형식의 문자열이 반환됩니다. 여기서 @code{%s}는 형 이름으로, @code{%p}는 객체의 메모리 주소로 치환됩니다.
@end deffn

@geindex PyTypeObject.tp_as_number (C member)
@anchor{c-api/typeobj c PyTypeObject tp_as_number}@anchor{b81}
@deffn {C 멤버 변수} @ref{1623,,PyNumberMethods} *@ref{c9b,,PyTypeObject}.tp_as_number

숫자 프로토콜을 구현하는 객체에만 관련된 필드를 포함하는 추가 구조체에 대한 포인터. 이 필드는 @ref{569f,,숫자 객체 구조체}에서 설명합니다.

`계승:'

@ref{b81,,tp_as_number} 필드는 상속되지 않지만, 포함된 필드는 개별적으로 상속됩니다.
@end deffn

@geindex PyTypeObject.tp_as_sequence (C member)
@anchor{c-api/typeobj c PyTypeObject tp_as_sequence}@anchor{5660}
@deffn {C 멤버 변수} @ref{4f33,,PySequenceMethods} *@ref{c9b,,PyTypeObject}.tp_as_sequence

시퀀스 프로토콜을 구현하는 객체에만 관련된 필드를 포함하는 추가 구조체에 대한 포인터. 이 필드는 @ref{56a0,,시퀀스 객체 구조체}에서 설명합니다.

`계승:'

@ref{5660,,tp_as_sequence} 필드는 상속되지 않지만, 포함된 필드는 개별적으로 상속됩니다.
@end deffn

@geindex PyTypeObject.tp_as_mapping (C member)
@anchor{c-api/typeobj c PyTypeObject tp_as_mapping}@anchor{5661}
@deffn {C 멤버 변수} @ref{4f34,,PyMappingMethods} *@ref{c9b,,PyTypeObject}.tp_as_mapping

매핑 프로토콜을 구현하는 객체에만 관련된 필드를 포함하는 추가 구조체에 대한 포인터. 이 필드는 @ref{56a1,,매핑 객체 구조체}에서 설명합니다.

`계승:'

@ref{5661,,tp_as_mapping} 필드는 상속되지 않지만, 포함된 필드는 개별적으로 상속됩니다.
@end deffn

@geindex PyTypeObject.tp_hash (C member)
@anchor{c-api/typeobj c PyTypeObject tp_hash}@anchor{4f35}
@deffn {C 멤버 변수} @ref{51e8,,hashfunc} @ref{c9b,,PyTypeObject}.tp_hash

` The corresponding @ref{511b,,slot ID} @code{Py_tp_hash} is part of the @ref{774,,안정 ABI}.'
@geindex Py_tp_hash (C macro)
@anchor{c-api/typeobj c Py_tp_hash}@anchor{51cf}

@geindex built-in function;hash

내장 함수 @ref{800,,hash()}를 구현하는 함수에 대한 선택적 포인터.

서명은 @ref{436,,PyObject_Hash()}와 같습니다:

@example
Py_hash_t tp_hash(PyObject *);
@end example

@code{-1} 값은 정상적인 반환 값으로 반환되지 않아야 합니다; 해시값을 계산하는 동안 에러가 발생하면 함수는 예외를 설정하고 @code{-1}을 반환해야 합니다.

When this field is not set (`and' @ref{4f2f,,tp_richcompare} is not set),
an attempt to take the hash of the object raises @ref{198,,TypeError}.
This is the same as setting it to @ref{15cb,,PyObject_HashNotImplemented()}.

이 필드는 부모 형에서 해시 메서드의 상속을 차단하기 위해 @ref{15cb,,PyObject_HashNotImplemented()}로 명시적으로 설정할 수 있습니다. 이것은 파이썬 수준에서의 @code{__hash__ = None}과 동등한 것으로 해석되어, @code{isinstance(o, collections.Hashable)}이 @code{False}를 올바르게 반환하게 합니다. 반대의 경우도 마찬가지입니다 - 파이썬 수준의 클래스에서 @code{__hash__ = None}을 설정하면 @code{tp_hash} 슬롯이 @code{PyObject_HashNotImplemented()}로 설정됩니다.

`계승:'

Group: @ref{4f35,,tp_hash}, @ref{4f2f,,tp_richcompare}

이 필드는 @ref{4f2f,,tp_richcompare}와 함께 서브 형에 의해 상속됩니다: 서브 형의 @code{tp_richcompare}와 @ref{4f35,,tp_hash}가 모두 @code{NULL}일 때, 서브 형은 @code{tp_richcompare}와 @code{tp_hash}를 모두 상속합니다.

`기본값:'

@ref{4fb4,,PyBaseObject_Type} uses @ref{60a,,PyObject_GenericHash()}.
@end deffn

@geindex PyTypeObject.tp_call (C member)
@anchor{c-api/typeobj c PyTypeObject tp_call}@anchor{77a}
@deffn {C 멤버 변수} @ref{51f8,,ternaryfunc} @ref{c9b,,PyTypeObject}.tp_call

` The corresponding @ref{511b,,slot ID} @code{Py_tp_call} is part of the @ref{774,,안정 ABI}.'
@geindex Py_tp_call (C macro)
@anchor{c-api/typeobj c Py_tp_call}@anchor{51c3}

객체 호출을 구현하는 함수에 대한 선택적 포인터. 객체가 콜러블이 아니면 @code{NULL}이어야 합니다. 서명은 @ref{63b,,PyObject_Call()}과 같습니다:

@example
PyObject *tp_call(PyObject *self, PyObject *args, PyObject *kwargs);
@end example

`계승:'

이 필드는 서브 형으로 상속됩니다.
@end deffn

@geindex PyTypeObject.tp_str (C member)
@anchor{c-api/typeobj c PyTypeObject tp_str}@anchor{4f24}
@deffn {C 멤버 변수} @ref{51f1,,reprfunc} @ref{c9b,,PyTypeObject}.tp_str

` The corresponding @ref{511b,,slot ID} @code{Py_tp_str} is part of the @ref{774,,안정 ABI}.'
@geindex Py_tp_str (C macro)
@anchor{c-api/typeobj c Py_tp_str}@anchor{51db}

내장 연산 @ref{169,,str()}을 구현하는 함수에 대한 선택적 포인터. (@ref{169,,str}는 이제 형이며, @code{str()}은 그 형의 생성자를 호출함에 유의하십시오. 이 생성자는 @ref{122f,,PyObject_Str()}를 호출하여 실제 작업을 수행하고, @code{PyObject_Str()}은 이 처리기를 호출합니다.)

서명은 @ref{122f,,PyObject_Str()}과 같습니다:

@example
PyObject *tp_str(PyObject *self);
@end example

함수는 문자열이나 유니코드 객체를 반환해야 합니다. 다른 것 중에서도, @ref{1174,,print()} 함수에 의해 사용될 표현이기 때문에, 객체의 “친숙한” 문자열 표현이어야 합니다.

`계승:'

이 필드는 서브 형으로 상속됩니다.

`기본값:'

이 필드를 설정하지 않으면, 문자열 표현을 반환하기 위해 @ref{122e,,PyObject_Repr()}이 호출됩니다.
@end deffn

@geindex PyTypeObject.tp_getattro (C member)
@anchor{c-api/typeobj c PyTypeObject tp_getattro}@anchor{1a64}
@deffn {C 멤버 변수} @ref{51e4,,getattrofunc} @ref{c9b,,PyTypeObject}.tp_getattro

` The corresponding @ref{511b,,slot ID} @code{Py_tp_getattro} is part of the @ref{774,,안정 ABI}.'
@geindex Py_tp_getattro (C macro)
@anchor{c-api/typeobj c Py_tp_getattro}@anchor{51cd}

어트리뷰트 읽기(get-attribute) 함수에 대한 선택적 포인터.

서명은 @ref{5ec,,PyObject_GetAttr()}과 같습니다:

@example
PyObject *tp_getattro(PyObject *self, PyObject *attr);
@end example

일반적으로 이 필드를 @ref{50ce,,PyObject_GenericGetAttr()}로 설정하는 것이 편리합니다, 객체 어트리뷰트를 찾는 일반적인 방법을 구현합니다.

`계승:'

Group: @ref{4f2c,,tp_getattr}, @ref{1a64,,tp_getattro}

이 필드는 @ref{4f2c,,tp_getattr}과 함께 서브 형에 의해 상속됩니다: 서브 형의 @code{tp_getattr}과 @ref{1a64,,tp_getattro}가 모두 @code{NULL}일 때 서브 형은 베이스형에서 @code{tp_getattr}과 @code{tp_getattro}를 모두 상속합니다.

`기본값:'

@ref{4fb4,,PyBaseObject_Type} uses @ref{50ce,,PyObject_GenericGetAttr()}.
@end deffn

@geindex PyTypeObject.tp_setattro (C member)
@anchor{c-api/typeobj c PyTypeObject tp_setattro}@anchor{4f27}
@deffn {C 멤버 변수} @ref{51f4,,setattrofunc} @ref{c9b,,PyTypeObject}.tp_setattro

` The corresponding @ref{511b,,slot ID} @code{Py_tp_setattro} is part of the @ref{774,,안정 ABI}.'
@geindex Py_tp_setattro (C macro)
@anchor{c-api/typeobj c Py_tp_setattro}@anchor{51da}

어트리뷰트 설정과 삭제를 위한 함수에 대한 선택적 포인터.

서명은 @ref{1770,,PyObject_SetAttr()}과 같습니다:

@example
int tp_setattro(PyObject *self, PyObject *attr, PyObject *value);
@end example

또한, `value'를 @code{NULL}로 설정하여 어트리뷰트를 삭제하는 것을 반드시 지원해야 합니다. 일반적으로 이 필드를 @ref{50cf,,PyObject_GenericSetAttr()}로 설정하는 것이 편리합니다, 객체 어트리뷰트를 설정하는 일반적인 방법을 구현합니다.

`계승:'

Group: @ref{4f2d,,tp_setattr}, @ref{4f27,,tp_setattro}

이 필드는 @ref{4f2d,,tp_setattr}과 함께 서브 형에 의해 상속됩니다: 서브 형의 @code{tp_setattr}과 @ref{4f27,,tp_setattro}가 모두 @code{NULL}일 때, 서브 형은 베이스형에서 @code{tp_setattr}과 @code{tp_setattro}를 모두 상속합니다.

`기본값:'

@ref{4fb4,,PyBaseObject_Type} uses @ref{50cf,,PyObject_GenericSetAttr()}.
@end deffn

@geindex PyTypeObject.tp_as_buffer (C member)
@anchor{c-api/typeobj c PyTypeObject tp_as_buffer}@anchor{b7f}
@deffn {C 멤버 변수} @ref{5330,,PyBufferProcs} *@ref{c9b,,PyTypeObject}.tp_as_buffer

버퍼 인터페이스를 구현하는 객체에만 관련된 필드를 포함하는 추가 구조체에 대한 포인터. 이 필드는 @ref{52f6,,버퍼 객체 구조체}에서 설명합니다.

`계승:'

@ref{b7f,,tp_as_buffer} 필드는 상속되지 않지만, 포함된 필드는 개별적으로 상속됩니다.
@end deffn

@geindex PyTypeObject.tp_flags (C member)
@anchor{c-api/typeobj c PyTypeObject tp_flags}@anchor{1c6f}
@deffn {C 멤버 변수} unsigned long @ref{c9b,,PyTypeObject}.tp_flags

이 필드는 다양한 플래그의 비트 마스크입니다. 일부 플래그는 특정 상황에 대한 변형 의미론을 나타냅니다; 다른 것들은 역사적으로 항상 존재하지는 않았던 형 객체(또는 @ref{b81,,tp_as_number}, @ref{5660,,tp_as_sequence}, @ref{5661,,tp_as_mapping} 및 @ref{b7f,,tp_as_buffer}를 통해 참조되는 확장 구조체)의 특정 필드가 유효함을 나타내는 데 사용됩니다; 이러한 플래그 비트가 없으면, 이것이 보호하는 형 필드에 액세스하지 말아야 하며 대신 0이나 @code{NULL} 값을 갖는 것으로 간주해야 합니다.

`계승:'

Inheritance of this field is complicated.  Most flag bits are inherited
individually, i.e. if the base type has a flag bit set, the subtype inherits
this flag bit.  The flag bits that pertain to extension structures are strictly
inherited if the extension structure is inherited, i.e. the base type’s value of
the flag bit is copied into the subtype together with a pointer to the extension
structure.  The @ref{980,,Py_TPFLAGS_HAVE_GC} flag bit is inherited together with
the @ref{981,,tp_traverse} and @ref{4f21,,tp_clear} fields, i.e. if the
@code{Py_TPFLAGS_HAVE_GC} flag bit is clear in the subtype and the
@code{tp_traverse} and @code{tp_clear} fields in the subtype exist and have
@code{NULL} values.

@c XXX are most flag bits *really* inherited individually?

`기본값:'

@ref{4fb4,,PyBaseObject_Type} uses
@code{Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE}.

`비트 마스크:'

다음 비트 마스크가 현재 정의되어 있습니다; 이들은 @code{|} 연산자로 함께 OR 하여 @ref{1c6f,,tp_flags} 필드의 값을 형성할 수 있습니다. 매크로 @ref{1d39,,PyType_HasFeature()}는 형과 플래그 값 `tp'와 `f'를 취하고 @code{tp->tp_flags & f}가 0이 아닌지 확인합니다.

@geindex Py_TPFLAGS_HEAPTYPE (C macro)
@anchor{c-api/typeobj c Py_TPFLAGS_HEAPTYPE}@anchor{aac}
@deffn {C 매크로} Py_TPFLAGS_HEAPTYPE

This bit is set when the type object itself is allocated on the heap, for
example, types created dynamically using @ref{79c,,PyType_FromSpec()}.  In this
case, the @ref{4f0c,,ob_type} field of its instances is considered a reference to
the type, and the type object is INCREF’ed when a new instance is created, and
DECREF’ed when an instance is destroyed (this does not apply to instances of
subtypes; only the type referenced by the instance’s ob_type gets INCREF’ed or
DECREF’ed). Heap types should also @ref{56a2,,support garbage collection}
as they can form a reference cycle with their own module object.

`계승:'

???
@end deffn

@geindex Py_TPFLAGS_BASETYPE (C macro)
@anchor{c-api/typeobj c Py_TPFLAGS_BASETYPE}@anchor{4f14}
@deffn {C 매크로} Py_TPFLAGS_BASETYPE
` Part of the @ref{774,,안정 ABI}.'
이 비트는 형을 다른 형의 베이스형으로 사용할 수 있을 때 설정됩니다. 이 비트가 설정되지 않으면 이 형으로 서브 형을 만들 수 없습니다 (Java의 “final” 클래스와 유사합니다).

`계승:'

???
@end deffn

@geindex Py_TPFLAGS_READY (C macro)
@anchor{c-api/typeobj c Py_TPFLAGS_READY}@anchor{56a3}
@deffn {C 매크로} Py_TPFLAGS_READY

이 비트는 @ref{97f,,PyType_Ready()}에 의해 형 객체가 완전히 초기화될 때 설정됩니다.

`계승:'

???
@end deffn

@geindex Py_TPFLAGS_READYING (C macro)
@anchor{c-api/typeobj c Py_TPFLAGS_READYING}@anchor{56a4}
@deffn {C 매크로} Py_TPFLAGS_READYING

이 비트는 @ref{97f,,PyType_Ready()}가 형 객체를 초기화하는 동안 설정됩니다.

`계승:'

???
@end deffn

@geindex Py_TPFLAGS_HAVE_GC (C macro)
@anchor{c-api/typeobj c Py_TPFLAGS_HAVE_GC}@anchor{980}
@deffn {C 매크로} Py_TPFLAGS_HAVE_GC
` Part of the @ref{774,,안정 ABI}.'
This bit is set when the object supports garbage collection.  If this bit
is set, memory for new instances (see @ref{4f0f,,tp_alloc})
must be allocated using @ref{c98,,PyObject_GC_New} or
@ref{c5f,,PyType_GenericAlloc()} and deallocated (see
@ref{4f0e,,tp_free}) using @ref{1708,,PyObject_GC_Del()}.  More
information in section @ref{56a2,,순환 가비지 수집 지원}.

`계승:'

Group: @ref{980,,Py_TPFLAGS_HAVE_GC}, @ref{981,,tp_traverse}, @ref{4f21,,tp_clear}

The @ref{980,,Py_TPFLAGS_HAVE_GC} flag bit is inherited
together with the @ref{981,,tp_traverse} and @ref{4f21,,tp_clear}
fields, i.e.  if the @code{Py_TPFLAGS_HAVE_GC} flag bit is
clear in the subtype and the @code{tp_traverse} and
@code{tp_clear} fields in the subtype exist and have @code{NULL}
values.
@end deffn

@geindex Py_TPFLAGS_DEFAULT (C macro)
@anchor{c-api/typeobj c Py_TPFLAGS_DEFAULT}@anchor{4f09}
@deffn {C 매크로} Py_TPFLAGS_DEFAULT
` Part of the @ref{774,,안정 ABI}.'
This is a bitmask of all the bits that pertain to the existence of certain
fields in the type object and its extension structures. Currently, it includes
the following bits: @ref{56a5,,Py_TPFLAGS_HAVE_STACKLESS_EXTENSION}.

`계승:'

???
@end deffn

@geindex Py_TPFLAGS_METHOD_DESCRIPTOR (C macro)
@anchor{c-api/typeobj c Py_TPFLAGS_METHOD_DESCRIPTOR}@anchor{5177}
@deffn {C 매크로} Py_TPFLAGS_METHOD_DESCRIPTOR
` Part of the @ref{774,,안정 ABI} 버전 3.8 이후로.'
이 비트는 객체가 연결되지 않은 메서드(unbound method)처럼 동작함을 나타냅니다.

이 플래그가 @code{type(meth)}에 설정되면:


@itemize -

@item 
@code{meth.__get__(obj, cls)(*args, **kwds)}(@code{obj}가 None이 아닐 때)는 @code{meth(obj, *args, **kwds)}와 동등해야 합니다.

@item 
@code{meth.__get__(None, cls)(*args, **kwds)}는 @code{meth(*args, **kwds)}와 동등해야 합니다.
@end itemize

이 플래그는 @code{obj.meth()}와 같은 일반적인 메서드 호출에 대한 최적화를 가능하게 합니다: @code{obj.meth}에 대한 임시 “연결된 메서드(bound method)” 객체를 만들지 않습니다.


Added in version 3.8.


`계승:'

This flag is never inherited by types without the
@ref{3cf,,Py_TPFLAGS_IMMUTABLETYPE} flag set.  For extension types, it is
inherited whenever @ref{5662,,tp_descr_get} is inherited.
@end deffn

@geindex Py_TPFLAGS_MANAGED_DICT (C macro)
@anchor{c-api/typeobj c Py_TPFLAGS_MANAGED_DICT}@anchor{60d}
@deffn {C 매크로} Py_TPFLAGS_MANAGED_DICT

This bit indicates that instances of the class have a @ref{77c,,__dict__}
attribute, and that the space for the dictionary is managed by the VM.

If this flag is set, @ref{980,,Py_TPFLAGS_HAVE_GC} should also be set.

The type traverse function must call @ref{60b,,PyObject_VisitManagedDict()}
and its clear function must call @ref{60c,,PyObject_ClearManagedDict()}.


Added in version 3.12.


`계승:'

This flag is inherited unless the
@ref{532b,,tp_dictoffset} field is set in a superclass.
@end deffn

@geindex Py_TPFLAGS_MANAGED_WEAKREF (C macro)
@anchor{c-api/typeobj c Py_TPFLAGS_MANAGED_WEAKREF}@anchor{77b}
@deffn {C 매크로} Py_TPFLAGS_MANAGED_WEAKREF

This bit indicates that instances of the class should be weakly
referenceable.


Added in version 3.12.


`계승:'

This flag is inherited unless the
@ref{b7e,,tp_weaklistoffset} field is set in a superclass.
@end deffn

@geindex Py_TPFLAGS_ITEMS_AT_END (C macro)
@anchor{c-api/typeobj c Py_TPFLAGS_ITEMS_AT_END}@anchor{76c}
@deffn {C 매크로} Py_TPFLAGS_ITEMS_AT_END
` Part of the @ref{774,,안정 ABI} 버전 3.12 이후로.'
Only usable with variable-size types, i.e. ones with non-zero
@ref{23bb,,tp_itemsize}.

Indicates that the variable-sized portion of an instance of this type is
at the end of the instance’s memory area, at an offset of
@code{Py_TYPE(obj)->tp_basicsize} (which may be different in each
subclass).

When setting this flag, be sure that all superclasses either
use this memory layout, or are not variable-sized.
Python does not check this.


Added in version 3.12.


`계승:'

This flag is inherited.
@end deffn

@c XXX Document more flags here?

@geindex Py_TPFLAGS_LONG_SUBCLASS (C macro)
@anchor{c-api/typeobj c Py_TPFLAGS_LONG_SUBCLASS}@anchor{531e}
@deffn {C 매크로} Py_TPFLAGS_LONG_SUBCLASS
@end deffn

@geindex Py_TPFLAGS_LIST_SUBCLASS (C macro)
@anchor{c-api/typeobj c Py_TPFLAGS_LIST_SUBCLASS}@anchor{56a6}
@deffn {C 매크로} Py_TPFLAGS_LIST_SUBCLASS
@end deffn

@geindex Py_TPFLAGS_TUPLE_SUBCLASS (C macro)
@anchor{c-api/typeobj c Py_TPFLAGS_TUPLE_SUBCLASS}@anchor{56a7}
@deffn {C 매크로} Py_TPFLAGS_TUPLE_SUBCLASS
@end deffn

@geindex Py_TPFLAGS_BYTES_SUBCLASS (C macro)
@anchor{c-api/typeobj c Py_TPFLAGS_BYTES_SUBCLASS}@anchor{56a8}
@deffn {C 매크로} Py_TPFLAGS_BYTES_SUBCLASS
@end deffn

@geindex Py_TPFLAGS_UNICODE_SUBCLASS (C macro)
@anchor{c-api/typeobj c Py_TPFLAGS_UNICODE_SUBCLASS}@anchor{56a9}
@deffn {C 매크로} Py_TPFLAGS_UNICODE_SUBCLASS
@end deffn

@geindex Py_TPFLAGS_DICT_SUBCLASS (C macro)
@anchor{c-api/typeobj c Py_TPFLAGS_DICT_SUBCLASS}@anchor{56aa}
@deffn {C 매크로} Py_TPFLAGS_DICT_SUBCLASS
@end deffn

@geindex Py_TPFLAGS_BASE_EXC_SUBCLASS (C macro)
@anchor{c-api/typeobj c Py_TPFLAGS_BASE_EXC_SUBCLASS}@anchor{56ab}
@deffn {C 매크로} Py_TPFLAGS_BASE_EXC_SUBCLASS
@end deffn

@geindex Py_TPFLAGS_TYPE_SUBCLASS (C macro)
@anchor{c-api/typeobj c Py_TPFLAGS_TYPE_SUBCLASS}@anchor{56ac}
@deffn {C 매크로} Py_TPFLAGS_TYPE_SUBCLASS

Functions such as @ref{533b,,PyLong_Check()} will call @ref{531d,,PyType_FastSubclass()}
with one of these flags to quickly determine if a type is a subclass
of a built-in type; such specific checks are faster than a generic
check, like @ref{10a5,,PyObject_IsInstance()}. Custom types that inherit
from built-ins should have their @ref{1c6f,,tp_flags}
set appropriately, or the code that interacts with such types
will behave differently depending on what kind of check is used.
@end deffn

@geindex Py_TPFLAGS_HAVE_FINALIZE (C macro)
@anchor{c-api/typeobj c Py_TPFLAGS_HAVE_FINALIZE}@anchor{427}
@deffn {C 매크로} Py_TPFLAGS_HAVE_FINALIZE

이 비트는 @ref{c9c,,tp_finalize} 슬롯이 형 구조체에 있을 때 설정됩니다.


Added in version 3.4.



버전 3.8부터 폐지됨: 인터프리터는 @ref{c9c,,tp_finalize} 슬롯이 항상 형 구조체에 있다고 가정하기 때문에, 이 플래그는 더는 필요하지 않습니다.

@end deffn

@geindex _Py_TPFLAGS_HAVE_VECTORCALL (C macro)

@geindex Py_TPFLAGS_HAVE_VECTORCALL (C macro)
@anchor{c-api/typeobj c _Py_TPFLAGS_HAVE_VECTORCALL}@anchor{56ad}@anchor{c-api/typeobj c Py_TPFLAGS_HAVE_VECTORCALL}@anchor{775}
@deffn {C 매크로} Py_TPFLAGS_HAVE_VECTORCALL
` Part of the @ref{774,,안정 ABI} 버전 3.12 이후로.'
이 비트는 클래스가 @ref{773,,벡터콜 프로토콜}을 구현할 때 설정됩니다. 자세한 내용은 @ref{52d5,,tp_vectorcall_offset}을 참조하십시오.

`계승:'

This bit is inherited if @ref{77a,,tp_call} is also
inherited.


Added in version 3.8: as @code{_Py_TPFLAGS_HAVE_VECTORCALL}



버전 3.9에서 변경.


Renamed to the current name, without the leading underscore.
The old provisional name is @ref{23d,,soft deprecated}.


버전 3.12에서 변경: This flag is now removed from a class when the class’s
@ref{779,,__call__()} method is reassigned.

This flag can now be inherited by mutable classes.

@end deffn

@geindex Py_TPFLAGS_IMMUTABLETYPE (C macro)
@anchor{c-api/typeobj c Py_TPFLAGS_IMMUTABLETYPE}@anchor{3cf}
@deffn {C 매크로} Py_TPFLAGS_IMMUTABLETYPE

This bit is set for type objects that are immutable: type attributes cannot be set nor deleted.

@ref{97f,,PyType_Ready()} automatically applies this flag to
@ref{982,,static types}.

`계승:'

This flag is not inherited.


Added in version 3.10.

@end deffn

@geindex Py_TPFLAGS_DISALLOW_INSTANTIATION (C macro)
@anchor{c-api/typeobj c Py_TPFLAGS_DISALLOW_INSTANTIATION}@anchor{7a1}
@deffn {C 매크로} Py_TPFLAGS_DISALLOW_INSTANTIATION

Disallow creating instances of the type: set
@ref{79e,,tp_new} to NULL and don’t create the @code{__new__}
key in the type dictionary.

The flag must be set before creating the type, not after. For example, it
must be set before @ref{97f,,PyType_Ready()} is called on the type.

The flag is set automatically on @ref{982,,static types} if
@ref{2372,,tp_base} is NULL or @code{&PyBaseObject_Type} and
@ref{79e,,tp_new} is NULL.

`계승:'

This flag is not inherited.
However, subclasses will not be instantiable unless they provide a
non-NULL @ref{79e,,tp_new} (which is only possible
via the C API).

@cartouche
@quotation 참고 
To disallow instantiating a class directly but allow instantiating
its subclasses (e.g. for an @ref{13bb,,abstract base class}),
do not use this flag.
Instead, make @ref{79e,,tp_new} only succeed for
subclasses.
@end quotation
@end cartouche


Added in version 3.10.

@end deffn

@geindex Py_TPFLAGS_MAPPING (C macro)
@anchor{c-api/typeobj c Py_TPFLAGS_MAPPING}@anchor{1c56}
@deffn {C 매크로} Py_TPFLAGS_MAPPING

This bit indicates that instances of the class may match mapping patterns
when used as the subject of a @ref{a0e,,match} block. It is automatically
set when registering or subclassing @ref{ac7,,collections.abc.Mapping}, and
unset when registering @ref{13c9,,collections.abc.Sequence}.

@cartouche
@quotation 참고 
@ref{1c56,,Py_TPFLAGS_MAPPING} and @ref{1c57,,Py_TPFLAGS_SEQUENCE} are
mutually exclusive; it is an error to enable both flags simultaneously.
@end quotation
@end cartouche

`계승:'

This flag is inherited by types that do not already set
@ref{1c57,,Py_TPFLAGS_SEQUENCE}.


@subsubheading 더 보기


@geindex Python 향상 제안; PEP 634
PEP 634@footnote{https://peps.python.org/pep-0634/} – Structural Pattern Matching: Specification



Added in version 3.10.

@end deffn

@geindex Py_TPFLAGS_SEQUENCE (C macro)
@anchor{c-api/typeobj c Py_TPFLAGS_SEQUENCE}@anchor{1c57}
@deffn {C 매크로} Py_TPFLAGS_SEQUENCE

This bit indicates that instances of the class may match sequence patterns
when used as the subject of a @ref{a0e,,match} block. It is automatically
set when registering or subclassing @ref{13c9,,collections.abc.Sequence}, and
unset when registering @ref{ac7,,collections.abc.Mapping}.

@cartouche
@quotation 참고 
@ref{1c56,,Py_TPFLAGS_MAPPING} and @ref{1c57,,Py_TPFLAGS_SEQUENCE} are
mutually exclusive; it is an error to enable both flags simultaneously.
@end quotation
@end cartouche

`계승:'

This flag is inherited by types that do not already set
@ref{1c56,,Py_TPFLAGS_MAPPING}.


@subsubheading 더 보기


@geindex Python 향상 제안; PEP 634
PEP 634@footnote{https://peps.python.org/pep-0634/} – Structural Pattern Matching: Specification



Added in version 3.10.

@end deffn

@geindex Py_TPFLAGS_VALID_VERSION_TAG (C macro)
@anchor{c-api/typeobj c Py_TPFLAGS_VALID_VERSION_TAG}@anchor{56ae}
@deffn {C 매크로} Py_TPFLAGS_VALID_VERSION_TAG

Internal. Do not set or unset this flag.
To indicate that a class has changed call @ref{1b79,,PyType_Modified()}

@cartouche
@quotation 경고 
This flag is present in header files, but is not be used.
It will be removed in a future version of CPython
@end quotation
@end cartouche
@end deffn

@geindex Py_TPFLAGS_HAVE_VERSION_TAG (C macro)
@anchor{c-api/typeobj c Py_TPFLAGS_HAVE_VERSION_TAG}@anchor{15cf}
@deffn {C 매크로} Py_TPFLAGS_HAVE_VERSION_TAG

This is a @ref{23d,,soft deprecated} macro that does nothing.
Historically, this would indicate that the
@ref{5666,,tp_version_tag} field was available and
initialized.
@end deffn

@geindex Py_TPFLAGS_INLINE_VALUES (C macro)
@anchor{c-api/typeobj c Py_TPFLAGS_INLINE_VALUES}@anchor{56af}
@deffn {C 매크로} Py_TPFLAGS_INLINE_VALUES

This bit indicates that instances of this type will have an “inline values”
array (containing the object’s attributes) placed directly after the end
of the object.

This requires that @ref{980,,Py_TPFLAGS_HAVE_GC} is set.

`계승:'

This flag is not inherited.


Added in version 3.13.

@end deffn

@geindex Py_TPFLAGS_IS_ABSTRACT (C macro)
@anchor{c-api/typeobj c Py_TPFLAGS_IS_ABSTRACT}@anchor{56b0}
@deffn {C 매크로} Py_TPFLAGS_IS_ABSTRACT

This bit indicates that this is an abstract type and therefore cannot
be instantiated.

`계승:'

This flag is not inherited.


@subsubheading 더 보기


@ref{4,,abc}

@end deffn

@geindex Py_TPFLAGS_HAVE_STACKLESS_EXTENSION (C macro)
@anchor{c-api/typeobj c Py_TPFLAGS_HAVE_STACKLESS_EXTENSION}@anchor{56a5}
@deffn {C 매크로} Py_TPFLAGS_HAVE_STACKLESS_EXTENSION

Internal. Do not set or unset this flag.
Historically, this was a reserved flag for use in Stackless Python.

@cartouche
@quotation 경고 
This flag is present in header files, but is not be used.
This may be removed in a future version of CPython.
@end quotation
@end cartouche
@end deffn
@end deffn

@geindex PyTypeObject.tp_doc (C member)
@anchor{c-api/typeobj c PyTypeObject tp_doc}@anchor{4f0a}
@deffn {C 멤버 변수} const char *@ref{c9b,,PyTypeObject}.tp_doc

` The corresponding @ref{511b,,slot ID} @code{Py_tp_doc} is part of the @ref{774,,안정 ABI}.'
@geindex Py_tp_doc (C macro)
@anchor{c-api/typeobj c Py_tp_doc}@anchor{51c9}

An optional pointer to a NUL-terminated C string giving the docstring for this
type object.  This is exposed as the @ref{2093,,__doc__} attribute on the
type and instances of the type.

`계승:'

이 필드는 서브 형에 의해 상속되지 `않습니다'.
@end deffn

@geindex PyTypeObject.tp_traverse (C member)
@anchor{c-api/typeobj c PyTypeObject tp_traverse}@anchor{981}
@deffn {C 멤버 변수} @ref{51f9,,traverseproc} @ref{c9b,,PyTypeObject}.tp_traverse

` The corresponding @ref{511b,,slot ID} @code{Py_tp_traverse} is part of the @ref{774,,안정 ABI}.'
@geindex Py_tp_traverse (C macro)
@anchor{c-api/typeobj c Py_tp_traverse}@anchor{51dc}

An optional pointer to a traversal function for the garbage collector.  This is
only used if the @ref{980,,Py_TPFLAGS_HAVE_GC} flag bit is set.  The signature is:

@example
int tp_traverse(PyObject *self, visitproc visit, void *arg);
@end example

파이썬의 가비지 수집 체계에 대한 자세한 정보는 섹션 @ref{56a2,,순환 가비지 수집 지원}에서 찾을 수 있습니다.

The @ref{981,,tp_traverse} pointer is used by the garbage collector to detect
reference cycles. A typical implementation of a @code{tp_traverse} function
simply calls @ref{4f18,,Py_VISIT()} on each of the instance’s members that are Python
objects that the instance owns. For example, this is function @code{local_traverse()} from the
@code{_thread} extension module:

@example
static int
local_traverse(PyObject *op, visitproc visit, void *arg)
@{
    localobject *self = (localobject *) op;
    Py_VISIT(self->args);
    Py_VISIT(self->kw);
    Py_VISIT(self->dict);
    return 0;
@}
@end example

@ref{4f18,,Py_VISIT()}는 참조 순환에 참여할 수 있는 멤버에 대해서만 호출됨에 유의하십시오. @code{self->key} 멤버도 있지만, @code{NULL}이나 파이썬 문자열만 가능해서 참조 순환의 일부가 될 수 없습니다.

반면에, 멤버가 사이클의 일부가 될 수 없다는 것을 알고 있더라도, 디버깅 지원을 위해 @ref{64,,gc} 모듈의 @ref{a06,,get_referents()} 함수가 그것을 포함하도록 어쨌거나 방문하고 싶을 수 있습니다.

Heap types (@ref{aac,,Py_TPFLAGS_HEAPTYPE}) must visit their type with:

@example
Py_VISIT(Py_TYPE(self));
@end example

It is only needed since Python 3.9. To support Python 3.8 and older, this
line must be conditional:

@example
#if PY_VERSION_HEX >= 0x03090000
    Py_VISIT(Py_TYPE(self));
#endif
@end example

If the @ref{60d,,Py_TPFLAGS_MANAGED_DICT} bit is set in the
@ref{1c6f,,tp_flags} field, the traverse function must call
@ref{60b,,PyObject_VisitManagedDict()} like this:

@example
PyObject_VisitManagedDict((PyObject*)self, visit, arg);
@end example

@cartouche
@quotation 경고 
When implementing @ref{981,,tp_traverse}, only the
members that the instance `owns' (by having @ref{5df,,strong references} to them) must be
visited. For instance, if an object supports weak references via the
@ref{532f,,tp_weaklist} slot, the pointer supporting
the linked list (what `tp_weaklist' points to) must `not' be
visited as the instance does not directly own the weak references to itself
(the weakreference list is there to support the weak reference machinery,
but the instance has no strong reference to the elements inside it, as they
are allowed to be removed even if the instance is still alive).
@end quotation
@end cartouche

@cartouche
@quotation 경고 
The traversal function must not have any side effects.  It must not
modify the reference counts of any Python objects nor create or destroy
any Python objects.
@end quotation
@end cartouche

Note that @ref{4f18,,Py_VISIT()} requires the `visit' and `arg' parameters to
@code{local_traverse()} to have these specific names; don’t name them just
anything.

Instances of @ref{b5e,,heap-allocated types} hold a reference to
their type. Their traversal function must therefore either visit
@ref{3c9,,Py_TYPE(self)}, or delegate this responsibility by
calling @code{tp_traverse} of another heap-allocated type (such as a
heap-allocated superclass).
If they do not, the type object may not be garbage-collected.

@cartouche
@quotation 참고 
The @ref{981,,tp_traverse} function can be called from any
thread.
@end quotation
@end cartouche


버전 3.9에서 변경: 힙 할당 형은 @code{tp_traverse}에서 @code{Py_TYPE(self)}를 방문할 것으로 기대됩니다. 이전 버전의 파이썬에서는, 버그 40217@footnote{https://bugs.python.org/issue40217}로 인해, 이렇게 하면 서브 클래스에서 충돌이 발생할 수 있습니다.


`계승:'

Group: @ref{980,,Py_TPFLAGS_HAVE_GC}, @ref{981,,tp_traverse}, @ref{4f21,,tp_clear}

This field is inherited by subtypes together with @ref{4f21,,tp_clear} and the
@ref{980,,Py_TPFLAGS_HAVE_GC} flag bit: the flag bit, @ref{981,,tp_traverse}, and
@code{tp_clear} are all inherited from the base type if they are all zero in
the subtype.
@end deffn

@geindex PyTypeObject.tp_clear (C member)
@anchor{c-api/typeobj c PyTypeObject tp_clear}@anchor{4f21}
@deffn {C 멤버 변수} @ref{51ea,,inquiry} @ref{c9b,,PyTypeObject}.tp_clear

` The corresponding @ref{511b,,slot ID} @code{Py_tp_clear} is part of the @ref{774,,안정 ABI}.'
@geindex Py_tp_clear (C macro)
@anchor{c-api/typeobj c Py_tp_clear}@anchor{51c4}

An optional pointer to a clear function.  The signature is:

@example
int tp_clear(PyObject *);
@end example

The purpose of this function is to break reference cycles that are causing a
@ref{5630,,cyclic isolate} so that the objects can be safely destroyed.  A
cleared object is a partially destroyed object; the object is not obligated
to satisfy design invariants held during normal use.

@code{tp_clear} does not need to delete references to objects that
can’t participate in reference cycles, such as Python strings or Python
integers.  However, it may be convenient to clear all references, and write
the type’s @ref{4efb,,tp_dealloc} function to invoke
@code{tp_clear} to avoid code duplication.  (Beware that
@code{tp_clear} might have already been called. Prefer calling
idempotent functions like @ref{797,,Py_CLEAR()}.)

Any non-trivial cleanup should be performed in
@ref{c9c,,tp_finalize} instead of @code{tp_clear}.

@cartouche
@quotation 참고 
If @code{tp_clear} fails to break a reference cycle then the
objects in the @ref{5630,,cyclic isolate} may remain indefinitely
uncollectable (“leak”).  See @ref{13c6,,gc.garbage}.
@end quotation
@end cartouche

@cartouche
@quotation 참고 
Referents (direct and indirect) might have already been cleared; they are
not guaranteed to be in a consistent state.
@end quotation
@end cartouche

@cartouche
@quotation 참고 
The @ref{4f21,,tp_clear} function can be called from any
thread.
@end quotation
@end cartouche

@cartouche
@quotation 참고 
An object is not guaranteed to be automatically cleared before its
destructor (@ref{4efb,,tp_dealloc}) is called.
@end quotation
@end cartouche

This function differs from the destructor
(@ref{4efb,,tp_dealloc}) in the following ways:


@itemize *

@item 
The purpose of clearing an object is to remove references to other objects
that might participate in a reference cycle.  The purpose of the
destructor, on the other hand, is a superset: it must release `all'
resources it owns, including references to objects that cannot participate
in a reference cycle (e.g., integers) as well as the object’s own memory
(by calling @ref{4f0e,,tp_free}).

@item 
When @code{tp_clear} is called, other objects might still hold
references to the object being cleared.  Because of this,
@code{tp_clear} must not deallocate the object’s own memory
(@ref{4f0e,,tp_free}).  The destructor, on the other hand,
is only called when no (strong) references exist, and as such, must
safely destroy the object itself by deallocating it.

@item 
@code{tp_clear} might never be automatically called.  An object’s
destructor, on the other hand, will be automatically called some time
after the object becomes unreachable (i.e., either there are no references
to the object or the object is a member of a @ref{5630,,cyclic isolate}).
@end itemize

No guarantees are made about when, if, or how often Python automatically
clears an object, except:


@itemize *

@item 
Python will not automatically clear an object if it is reachable, i.e.,
there is a reference to it and it is not a member of a @ref{5630,,cyclic isolate}.

@item 
Python will not automatically clear an object if it has not been
automatically finalized (see @ref{c9c,,tp_finalize}).  (If
the finalizer resurrected the object, the object may or may not be
automatically finalized again before it is cleared.)

@item 
If an object is a member of a @ref{5630,,cyclic isolate}, Python will not
automatically clear it if any member of the cyclic isolate has not yet
been automatically finalized (@ref{c9c,,tp_finalize}).

@item 
Python will not destroy an object until after any automatic calls to its
@code{tp_clear} function have returned.  This ensures that the act
of breaking a reference cycle does not invalidate the @code{self} pointer
while @code{tp_clear} is still executing.

@item 
Python will not automatically call @code{tp_clear} multiple times
concurrently.
@end itemize

CPython currently only automatically clears objects as needed to break
reference cycles in a @ref{5630,,cyclic isolate}, but future versions might
clear objects regularly before their destruction.

Taken together, all @ref{4f21,,tp_clear} functions in the
system must combine to break all reference cycles.  This is subtle, and if
in any doubt supply a @code{tp_clear} function.  For
example, the tuple type does not implement a
@code{tp_clear} function, because it’s possible to prove
that no reference cycle can be composed entirely of tuples.  Therefore the
@code{tp_clear} functions of other types are responsible
for breaking any cycle containing a tuple.  This isn’t immediately obvious,
and there’s rarely a good reason to avoid implementing
@code{tp_clear}.

@ref{4f21,,tp_clear}의 구현은 다음 예제와 같이 파이썬 객체일 수 있는 자신의 멤버에 대한 인스턴스의 참조를 삭제하고 해당 멤버에 대한 포인터를 @code{NULL}로 설정해야 합니다:

@example
static int
local_clear(PyObject *op)
@{
    localobject *self = (localobject *) op;
    Py_CLEAR(self->key);
    Py_CLEAR(self->args);
    Py_CLEAR(self->kw);
    Py_CLEAR(self->dict);
    return 0;
@}
@end example

The @ref{797,,Py_CLEAR()} macro should be used, because clearing references is
delicate:  the reference to the contained object must not be released
(via @ref{78f,,Py_DECREF()}) until
after the pointer to the contained object is set to @code{NULL}.  This is because
releasing the reference may cause the contained object to become trash,
triggering a chain of reclamation activity that may include invoking arbitrary
Python code (due to finalizers, or weakref callbacks, associated with the
contained object). If it’s possible for such code to reference `self' again,
it’s important that the pointer to the contained object be @code{NULL} at that time,
so that `self' knows the contained object can no longer be used.  The
@code{Py_CLEAR()} macro performs the operations in a safe order.

If the @ref{60d,,Py_TPFLAGS_MANAGED_DICT} bit is set in the
@ref{1c6f,,tp_flags} field, the clear function must call
@ref{60c,,PyObject_ClearManagedDict()} like this:

@example
PyObject_ClearManagedDict((PyObject*)self);
@end example

파이썬의 가비지 수집 체계에 대한 자세한 정보는 섹션 @ref{56a2,,순환 가비지 수집 지원}에서 찾을 수 있습니다.

`계승:'

Group: @ref{980,,Py_TPFLAGS_HAVE_GC}, @ref{981,,tp_traverse}, @ref{4f21,,tp_clear}

This field is inherited by subtypes together with @ref{981,,tp_traverse} and the
@ref{980,,Py_TPFLAGS_HAVE_GC} flag bit: the flag bit, @code{tp_traverse}, and
@ref{4f21,,tp_clear} are all inherited from the base type if they are all zero in
the subtype.


@subsubheading 더 보기


@ref{562b,,Object Life Cycle} for details about how this slot relates to other slots.

@end deffn

@geindex PyTypeObject.tp_richcompare (C member)
@anchor{c-api/typeobj c PyTypeObject tp_richcompare}@anchor{4f2f}
@deffn {C 멤버 변수} @ref{51f2,,richcmpfunc} @ref{c9b,,PyTypeObject}.tp_richcompare

` The corresponding @ref{511b,,slot ID} @code{Py_tp_richcompare} is part of the @ref{774,,안정 ABI}.'
@geindex Py_tp_richcompare (C macro)
@anchor{c-api/typeobj c Py_tp_richcompare}@anchor{51d8}

풍부한 비교 함수(rich comparison function)에 대한 선택적 포인터. 서명은 다음과 같습니다:

@example
PyObject *tp_richcompare(PyObject *self, PyObject *other, int op);
@end example

첫 번째 매개 변수는 @ref{c9b,,PyTypeObject}에 의해 정의된 형의 인스턴스임이 보장됩니다.

이 함수는 비교 결과(일반적으로 @code{Py_True}나 @code{Py_False})를 반환해야 합니다. 비교가 정의되어 있지 않으면, @code{Py_NotImplemented}를 반환하고, 다른 에러가 발생하면 @code{NULL}을 반환하고 예외 조건을 설정해야 합니다.

다음 상수는 @ref{4f2f,,tp_richcompare}와 @ref{4f30,,PyObject_RichCompare()}의 세 번째 인자로 사용되도록 정의됩니다:


@multitable {xxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxx} 
@headitem

상수

@tab

비교

@item

@geindex Py_LT (C macro)
@anchor{c-api/typeobj c Py_LT}@anchor{52c8}
@deffn {C 매크로} Py_LT
@end deffn

@tab

@code{<}

@item

@geindex Py_LE (C macro)
@anchor{c-api/typeobj c Py_LE}@anchor{52c9}
@deffn {C 매크로} Py_LE
@end deffn

@tab

@code{<=}

@item

@geindex Py_EQ (C macro)
@anchor{c-api/typeobj c Py_EQ}@anchor{52ca}
@deffn {C 매크로} Py_EQ
@end deffn

@tab

@code{==}

@item

@geindex Py_NE (C macro)
@anchor{c-api/typeobj c Py_NE}@anchor{52cb}
@deffn {C 매크로} Py_NE
@end deffn

@tab

@code{!=}

@item

@geindex Py_GT (C macro)
@anchor{c-api/typeobj c Py_GT}@anchor{52cc}
@deffn {C 매크로} Py_GT
@end deffn

@tab

@code{>}

@item

@geindex Py_GE (C macro)
@anchor{c-api/typeobj c Py_GE}@anchor{52cd}
@deffn {C 매크로} Py_GE
@end deffn

@tab

@code{>=}

@end multitable


풍부한 비교 함수를 쉽게 작성할 수 있도록 다음 매크로가 정의됩니다:

@geindex Py_RETURN_RICHCOMPARE (C macro)
@anchor{c-api/typeobj c Py_RETURN_RICHCOMPARE}@anchor{dac}
@deffn {C 매크로} Py_RETURN_RICHCOMPARE (VAL_A, VAL_B, op)

비교 결과에 따라, 함수에서 @code{Py_True}나 @code{Py_False}를 반환합니다. VAL_A와 VAL_B는 C 비교 연산자로 순서를 정할 수 있어야 합니다 (예를 들어, C int나 float일 수 있습니다). 세 번째 인자는 @ref{4f30,,PyObject_RichCompare()}에서처럼 요청된 연산을 지정합니다.

The returned value is a new @ref{5df,,strong reference}.

에러가 발생하면, 예외를 설정하고 함수에서 @code{NULL}을 반환합니다.


Added in version 3.7.

@end deffn

`계승:'

Group: @ref{4f35,,tp_hash}, @ref{4f2f,,tp_richcompare}

이 필드는 @ref{4f35,,tp_hash}와 함께 서브 형에 의해 상속됩니다. 서브 형의 @ref{4f2f,,tp_richcompare}와 @code{tp_hash}가 모두 @code{NULL}이면 서브 형은 @code{tp_richcompare}와 @code{tp_hash}를 상속합니다.

`기본값:'

@ref{4fb4,,PyBaseObject_Type} provides a @ref{4f2f,,tp_richcompare}
implementation, which may be inherited.  However, if only
@ref{4f35,,tp_hash} is defined, not even the inherited function is used
and instances of the type will not be able to participate in any
comparisons.
@end deffn

@geindex PyTypeObject.tp_weaklistoffset (C member)
@anchor{c-api/typeobj c PyTypeObject tp_weaklistoffset}@anchor{b7e}
@deffn {C 멤버 변수} @ref{c54,,Py_ssize_t} @ref{c9b,,PyTypeObject}.tp_weaklistoffset

While this field is still supported, @ref{77b,,Py_TPFLAGS_MANAGED_WEAKREF}
should be used instead, if at all possible.

If the instances of this type are weakly referenceable, this field is greater
than zero and contains the offset in the instance structure of the weak
reference list head (ignoring the GC header, if present); this offset is used by
@ref{795,,PyObject_ClearWeakRefs()} and the @code{PyWeakref_*} functions.  The
instance structure needs to include a field of type @ref{5dc,,PyObject}* which is
initialized to @code{NULL}.

이 필드를 @ref{532f,,tp_weaklist}와 혼동하지 마십시오; 그것은 형 객체 자체에 대한 약한 참조의 리스트 헤드입니다.

It is an error to set both the @ref{77b,,Py_TPFLAGS_MANAGED_WEAKREF} bit and
@ref{b7e,,tp_weaklistoffset}.

`계승:'

이 필드는 서브 형에 의해 상속되지만, 아래 나열된 규칙을 참조하십시오. 서브 형이 이 오프셋을 재정의할 수 있습니다; 이는 서브 형이 베이스형과 다른 약한 참조 리스트 헤드를 사용함을 의미합니다. 리스트 헤드는 항상 @ref{b7e,,tp_weaklistoffset}을 통해 발견되므로, 문제가 되지 않습니다.

`기본값:'

If the @ref{77b,,Py_TPFLAGS_MANAGED_WEAKREF} bit is set in the
@ref{1c6f,,tp_flags} field, then
@ref{b7e,,tp_weaklistoffset} will be set to a negative value,
to indicate that it is unsafe to use this field.
@end deffn

@geindex PyTypeObject.tp_iter (C member)
@anchor{c-api/typeobj c PyTypeObject tp_iter}@anchor{16f4}
@deffn {C 멤버 변수} @ref{51e6,,getiterfunc} @ref{c9b,,PyTypeObject}.tp_iter

` The corresponding @ref{511b,,slot ID} @code{Py_tp_iter} is part of the @ref{774,,안정 ABI}.'
@geindex Py_tp_iter (C macro)
@anchor{c-api/typeobj c Py_tp_iter}@anchor{51d2}

An optional pointer to a function that returns an @ref{4ca,,iterator} for the
object.  Its presence normally signals that the instances of this type are
@ref{142c,,iterable} (although sequences may be iterable without this function).

이 함수는 @ref{50d2,,PyObject_GetIter()}와 같은 서명을 갖습니다:

@example
PyObject *tp_iter(PyObject *self);
@end example

`계승:'

이 필드는 서브 형으로 상속됩니다.
@end deffn

@geindex PyTypeObject.tp_iternext (C member)
@anchor{c-api/typeobj c PyTypeObject tp_iternext}@anchor{16f5}
@deffn {C 멤버 변수} @ref{51eb,,iternextfunc} @ref{c9b,,PyTypeObject}.tp_iternext

` The corresponding @ref{511b,,slot ID} @code{Py_tp_iternext} is part of the @ref{774,,안정 ABI}.'
@geindex Py_tp_iternext (C macro)
@anchor{c-api/typeobj c Py_tp_iternext}@anchor{51d3}

An optional pointer to a function that returns the next item in an
@ref{4ca,,iterator}. The signature is:

@example
PyObject *tp_iternext(PyObject *self);
@end example

이터레이터가 소진되면 @code{NULL}을 반환해야 합니다; @ref{df4,,StopIteration} 예외가 설정될 수도, 그렇지 않을 수도 있습니다. 다른 에러가 발생하면, 역시 @code{NULL}을 반환해야 합니다. 그 존재는 이 형의 인스턴스가 이터레이터라는 신호입니다.

이터레이터 형은 @ref{16f4,,tp_iter} 함수도 정의해야 하며, 해당 함수는 (새 이터레이터 인스턴스가 아닌) 이터레이터 인스턴스 자체를 반환해야 합니다.

이 함수는 @ref{399,,PyIter_Next()}와 같은 서명을 갖습니다.

`계승:'

이 필드는 서브 형으로 상속됩니다.
@end deffn

@geindex PyTypeObject.tp_methods (C member)
@anchor{c-api/typeobj c PyTypeObject tp_methods}@anchor{4f13}
@deffn {C 멤버 변수} struct @ref{16dc,,PyMethodDef} *@ref{c9b,,PyTypeObject}.tp_methods

` The corresponding @ref{511b,,slot ID} @code{Py_tp_methods} is part of the @ref{774,,안정 ABI}.'
@geindex Py_tp_methods (C macro)
@anchor{c-api/typeobj c Py_tp_methods}@anchor{51d5}

이 형의 일반 메서드를 선언하는 @ref{16dc,,PyMethodDef} 구조체의 정적 @code{NULL}-종료 배열에 대한 선택적 포인터.

배열의 항목마다, 메서드 디스크립터를 포함하는 형의 딕셔너리(아래 @ref{1a8c,,tp_dict}를 참조하십시오)에 항목이 추가됩니다.

`계승:'

이 필드는 서브 형에 의해 상속되지 않습니다 (메서드는 다른 메커니즘을 통해 상속됩니다).
@end deffn

@geindex PyTypeObject.tp_members (C member)
@anchor{c-api/typeobj c PyTypeObject tp_members}@anchor{4f11}
@deffn {C 멤버 변수} struct @ref{770,,PyMemberDef} *@ref{c9b,,PyTypeObject}.tp_members

` The corresponding @ref{511b,,slot ID} @code{Py_tp_members} is part of the @ref{774,,안정 ABI}.'
@geindex Py_tp_members (C macro)
@anchor{c-api/typeobj c Py_tp_members}@anchor{51d4}

이 형의 인스턴스의 일반 데이터 멤버(필드나 슬롯)를 선언하는 @ref{770,,PyMemberDef} 구조체의 정적 @code{NULL}-종료 배열에 대한 선택적 포인터.

배열의 항목마다, 멤버 디스크립터를 포함하는 형의 딕셔너리(아래 @ref{1a8c,,tp_dict}를 참조하십시오)에 항목이 추가됩니다.

`계승:'

이 필드는 서브 형에 의해 상속되지 않습니다 (멤버는 다른 메커니즘을 통해 상속됩니다).
@end deffn

@geindex PyTypeObject.tp_getset (C member)
@anchor{c-api/typeobj c PyTypeObject tp_getset}@anchor{4f16}
@deffn {C 멤버 변수} struct @ref{db1,,PyGetSetDef} *@ref{c9b,,PyTypeObject}.tp_getset

` The corresponding @ref{511b,,slot ID} @code{Py_tp_getset} is part of the @ref{774,,안정 ABI}.'
@geindex Py_tp_getset (C macro)
@anchor{c-api/typeobj c Py_tp_getset}@anchor{51ce}

이 형의 인스턴스의 계산된 어트리뷰트를 선언하는 @ref{db1,,PyGetSetDef} 구조체의 정적 @code{NULL}-종료 배열에 대한 선택적 포인터.

배열의 항목마다, getset 디스크립터를 포함하는 형의 딕셔너리(아래 @ref{1a8c,,tp_dict}를 참조하십시오)에 항목이 추가됩니다.

`계승:'

이 필드는 서브 형에 의해 상속되지 않습니다 (계산된 어트리뷰트는 다른 메커니즘을 통해 상속됩니다).
@end deffn

@geindex PyTypeObject.tp_base (C member)
@anchor{c-api/typeobj c PyTypeObject tp_base}@anchor{2372}
@deffn {C 멤버 변수} @ref{c9b,,PyTypeObject} *@ref{c9b,,PyTypeObject}.tp_base

` The corresponding @ref{511b,,slot ID} @code{Py_tp_base} is part of the @ref{774,,안정 ABI}.'
@geindex Py_tp_base (C macro)
@anchor{c-api/typeobj c Py_tp_base}@anchor{51c1}

형 속성이 상속되는 베이스형에 대한 선택적 포인터. 이 수준에서는, 단일 상속만 지원됩니다; 다중 상속은 메타 형을 호출하여 형 객체를 동적으로 작성해야 합니다.

@cartouche
@quotation 참고 
@c from Modules/xxmodule.c

슬롯 초기화에는 전역 초기화 규칙이 적용됩니다. C99에서는 초기화자가 “주소 상수(address constants)”여야 합니다. 포인터로 묵시적으로 변환되는 @ref{4f0b,,PyType_GenericNew()}와 같은 함수 지정자는 유효한 C99 주소 상수입니다.

However, the unary ‘&’ operator applied to a non-static variable
like @ref{4fb4,,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.

결과적으로, @ref{2372,,tp_base}는 확장 모듈의 초기화 함수에서 설정되어야 합니다.
@end quotation
@end cartouche

`계승:'

이 필드는 서브 형에 의해 상속되지 않습니다 (명백히).

`기본값:'

이 필드의 기본값은 @code{&PyBaseObject_Type}입니다 (파이썬 프로그래머에게는 @ref{c7d,,object} 형으로 알려져 있습니다).
@end deffn

@geindex PyTypeObject.tp_dict (C member)
@anchor{c-api/typeobj c PyTypeObject tp_dict}@anchor{1a8c}
@deffn {C 멤버 변수} @ref{5dc,,PyObject} *@ref{c9b,,PyTypeObject}.tp_dict

형의 딕셔너리는 @ref{97f,,PyType_Ready()}에 의해 여기에 저장됩니다.

This field should normally be initialized to @code{NULL} before PyType_Ready is
called; it may also be initialized to a dictionary containing initial attributes
for the type.  Once @ref{97f,,PyType_Ready()} has initialized the type, extra
attributes for the type may be added to this dictionary only if they don’t
correspond to overloaded operations (like @ref{23dd,,__add__()}).  Once
initialization for the type has finished, this field should be
treated as read-only.

Some types may not store their dictionary in this slot.
Use @ref{1a8b,,PyType_GetDict()} to retrieve the dictionary for an arbitrary
type.


버전 3.12에서 변경: Internals detail: For static builtin types, this is always @code{NULL}.
Instead, the dict for such types is stored on @code{PyInterpreterState}.
Use @ref{1a8b,,PyType_GetDict()} to get the dict for an arbitrary type.


`계승:'

이 필드는 서브 형에 의해 상속되지 않습니다 (여기에 정의된 어트리뷰트는 다른 메커니즘을 통해 상속됩니다).

`기본값:'

이 필드가 @code{NULL}이면, @ref{97f,,PyType_Ready()}는 새 딕셔너리를 할당합니다.

@cartouche
@quotation 경고 
@ref{4ef8,,PyDict_SetItem()}을 사용하거나 다른 식으로 딕셔너리 C-API로 @ref{1a8c,,tp_dict}를 수정하는 것은 안전하지 않습니다.
@end quotation
@end cartouche
@end deffn

@geindex PyTypeObject.tp_descr_get (C member)
@anchor{c-api/typeobj c PyTypeObject tp_descr_get}@anchor{5662}
@deffn {C 멤버 변수} @ref{51e0,,descrgetfunc} @ref{c9b,,PyTypeObject}.tp_descr_get

` The corresponding @ref{511b,,slot ID} @code{Py_tp_descr_get} is part of the @ref{774,,안정 ABI}.'
@geindex Py_tp_descr_get (C macro)
@anchor{c-api/typeobj c Py_tp_descr_get}@anchor{51c7}

“디스크립터 get” 함수에 대한 선택적 포인터.

함수 서명은 다음과 같습니다:

@example
PyObject * tp_descr_get(PyObject *self, PyObject *obj, PyObject *type);
@end example

@c XXX explain more?

`계승:'

이 필드는 서브 형으로 상속됩니다.
@end deffn

@geindex PyTypeObject.tp_descr_set (C member)
@anchor{c-api/typeobj c PyTypeObject tp_descr_set}@anchor{1cb1}
@deffn {C 멤버 변수} @ref{51e1,,descrsetfunc} @ref{c9b,,PyTypeObject}.tp_descr_set

` The corresponding @ref{511b,,slot ID} @code{Py_tp_descr_set} is part of the @ref{774,,안정 ABI}.'
@geindex Py_tp_descr_set (C macro)
@anchor{c-api/typeobj c Py_tp_descr_set}@anchor{51c8}

디스크립터 값을 설정하고 삭제하기 위한 함수에 대한 선택적 포인터.

함수 서명은 다음과 같습니다:

@example
int tp_descr_set(PyObject *self, PyObject *obj, PyObject *value);
@end example

`value' 인자는 값을 삭제하기 위해 @code{NULL}로 설정됩니다.

@c XXX explain more?

`계승:'

이 필드는 서브 형으로 상속됩니다.
@end deffn

@geindex PyTypeObject.tp_dictoffset (C member)
@anchor{c-api/typeobj c PyTypeObject tp_dictoffset}@anchor{532b}
@deffn {C 멤버 변수} @ref{c54,,Py_ssize_t} @ref{c9b,,PyTypeObject}.tp_dictoffset

While this field is still supported, @ref{60d,,Py_TPFLAGS_MANAGED_DICT} should be
used instead, if at all possible.

이 형의 인스턴스에 인스턴스 변수를 포함하는 딕셔너리가 있으면, 이 필드는 0이 아니며 인스턴스 변수 딕셔너리 형의 인스턴스에서의 오프셋을 포함합니다; 이 오프셋은 @ref{50ce,,PyObject_GenericGetAttr()}에서 사용됩니다.

이 필드를 @ref{1a8c,,tp_dict}와 혼동하지 마십시오; 그것은 형 객체 자체의 어트리뷰트에 대한 딕셔너리입니다.

The value specifies the offset of the dictionary from the start of the instance structure.

The @ref{532b,,tp_dictoffset} should be regarded as write-only.
To get the pointer to the dictionary call @ref{1d02,,PyObject_GenericGetDict()}.
Calling @code{PyObject_GenericGetDict()} may need to allocate memory for the
dictionary, so it is may be more efficient to call @ref{5ec,,PyObject_GetAttr()}
when accessing an attribute on the object.

It is an error to set both the @ref{60d,,Py_TPFLAGS_MANAGED_DICT} bit and
@ref{532b,,tp_dictoffset}.

`계승:'

This field is inherited by subtypes. A subtype should not override this offset;
doing so could be unsafe, if C code tries to access the dictionary at the
previous offset.
To properly support inheritance, use @ref{60d,,Py_TPFLAGS_MANAGED_DICT}.

`기본값:'

This slot has no default.  For @ref{982,,static types}, if the
field is @code{NULL} then no @ref{77c,,__dict__} gets created for instances.

If the @ref{60d,,Py_TPFLAGS_MANAGED_DICT} bit is set in the
@ref{1c6f,,tp_flags} field, then
@ref{532b,,tp_dictoffset} will be set to @code{-1}, to indicate
that it is unsafe to use this field.
@end deffn

@geindex PyTypeObject.tp_init (C member)
@anchor{c-api/typeobj c PyTypeObject tp_init}@anchor{7a0}
@deffn {C 멤버 변수} @ref{51e9,,initproc} @ref{c9b,,PyTypeObject}.tp_init

` The corresponding @ref{511b,,slot ID} @code{Py_tp_init} is part of the @ref{774,,안정 ABI}.'
@geindex Py_tp_init (C macro)
@anchor{c-api/typeobj c Py_tp_init}@anchor{51d0}

인스턴스 초기화 함수에 대한 선택적 포인터.

This function corresponds to the @ref{8be,,__init__()} method of classes.  Like
@code{__init__()}, it is possible to create an instance without calling
@code{__init__()}, and it is possible to reinitialize an instance by calling its
@code{__init__()} method again.

함수 서명은 다음과 같습니다:

@example
int tp_init(PyObject *self, PyObject *args, PyObject *kwds);
@end example

The self argument is the instance to be initialized; the `args' and `kwds'
arguments represent positional and keyword arguments of the call to
@ref{8be,,__init__()}.

@code{NULL}이 아닐 때, @ref{7a0,,tp_init} 함수는 형을 호출하여 인스턴스를 정상적으로 만들 때, 형의 @ref{79e,,tp_new} 함수가 형의 인스턴스를 반환한 후 호출됩니다. @code{tp_new} 함수가 원래 형의 서브 형이 아닌 다른 형의 인스턴스를 반환하면, 아무런 @code{tp_init} 함수도 호출되지 않습니다; @code{tp_new}가 원래 형의 서브 형 인스턴스를 반환하면, 서브 형의 @code{tp_init}가 호출됩니다.

성공하면 @code{0}을 반환하고, 에러 시에는 @code{-1}을 반환하고 예외를 설정합니다.

`계승:'

이 필드는 서브 형으로 상속됩니다.

`기본값:'

For @ref{982,,static types} this field does not have a default.
@end deffn

@geindex PyTypeObject.tp_alloc (C member)
@anchor{c-api/typeobj c PyTypeObject tp_alloc}@anchor{4f0f}
@deffn {C 멤버 변수} @ref{51de,,allocfunc} @ref{c9b,,PyTypeObject}.tp_alloc

` The corresponding @ref{511b,,slot ID} @code{Py_tp_alloc} is part of the @ref{774,,안정 ABI}.'
@geindex Py_tp_alloc (C macro)
@anchor{c-api/typeobj c Py_tp_alloc}@anchor{51c0}

인스턴스 할당 함수에 대한 선택적 포인터.

함수 서명은 다음과 같습니다:

@example
PyObject *tp_alloc(PyTypeObject *self, Py_ssize_t nitems);
@end example

`계승:'

Static subtypes inherit this slot, which will be
@ref{c5f,,PyType_GenericAlloc()} if inherited from @ref{c7d,,object}.

@ref{b5e,,Heap subtypes} do not inherit this slot.

`기본값:'

For heap subtypes, this field is always set to
@ref{c5f,,PyType_GenericAlloc()}.

For static subtypes, this slot is inherited (see above).
@end deffn

@geindex PyTypeObject.tp_new (C member)
@anchor{c-api/typeobj c PyTypeObject tp_new}@anchor{79e}
@deffn {C 멤버 변수} @ref{51ed,,newfunc} @ref{c9b,,PyTypeObject}.tp_new

` The corresponding @ref{511b,,slot ID} @code{Py_tp_new} is part of the @ref{774,,안정 ABI}.'
@geindex Py_tp_new (C macro)
@anchor{c-api/typeobj c Py_tp_new}@anchor{51d6}

인스턴스 생성 함수에 대한 선택적 포인터.

함수 서명은 다음과 같습니다:

@example
PyObject *tp_new(PyTypeObject *subtype, PyObject *args, PyObject *kwds);
@end example

`subtype' 인자는 만들어지고 있는 객체의 형입니다; `args'와 `kwds' 인자는 형 호출의 위치와 키워드 인자를 나타냅니다. `subtype'이 @ref{79e,,tp_new} 함수가 호출되는 형과 같을 필요는 없음에 유의하십시오; 이 형의 서브 형일 수 있습니다 (하지만 관련이 없는 형은 아닙니다).

@ref{79e,,tp_new} 함수는 객체에 공간을 할당하기 위해 @code{subtype->tp_alloc(subtype, nitems)}를 호출해야 하고, 그런 다음 꼭 필요한 만큼만 추가 초기화를 수행해야 합니다. 안전하게 무시하거나 반복할 수 있는 초기화는 @ref{7a0,,tp_init} 처리기에 배치해야 합니다. 간단한 규칙은, 불변 형의 경우 모든 초기화가 @code{tp_new}에서 수행되어야 하고, 가변형의 경우 대부분 초기화는 @code{tp_init}로 미뤄져야 합니다.

Set the @ref{7a1,,Py_TPFLAGS_DISALLOW_INSTANTIATION} flag to disallow creating
instances of the type in Python.

`계승:'

This field is inherited by subtypes, except it is not inherited by
@ref{982,,static types} whose @ref{2372,,tp_base}
is @code{NULL} or @code{&PyBaseObject_Type}.

`기본값:'

For @ref{982,,static types} this field has no default.
This means if the slot is defined as @code{NULL}, the type cannot be called
to create new instances; presumably there is some other way to create
instances, like a factory function.
@end deffn

@geindex PyTypeObject.tp_free (C member)
@anchor{c-api/typeobj c PyTypeObject tp_free}@anchor{4f0e}
@deffn {C 멤버 변수} @ref{5485,,freefunc} @ref{c9b,,PyTypeObject}.tp_free

` The corresponding @ref{511b,,slot ID} @code{Py_tp_free} is part of the @ref{774,,안정 ABI}.'
@geindex Py_tp_free (C macro)
@anchor{c-api/typeobj c Py_tp_free}@anchor{51cb}

인스턴스 할당 해제 함수에 대한 선택적 포인터. 서명은 다음과 같습니다:

@example
void tp_free(void *self);
@end example

This function must free the memory allocated by
@ref{4f0f,,tp_alloc}.

`계승:'

Static subtypes inherit this slot, which will be @ref{e5f,,PyObject_Free()} if
inherited from @ref{c7d,,object}.  Exception: If the type supports garbage
collection (i.e., the @ref{980,,Py_TPFLAGS_HAVE_GC} flag is set in
@ref{1c6f,,tp_flags}) and it would inherit
@code{PyObject_Free()}, then this slot is not inherited but instead defaults
to @ref{1708,,PyObject_GC_Del()}.

@ref{b5e,,Heap subtypes} do not inherit this slot.

`기본값:'

For @ref{b5e,,heap subtypes}, this slot defaults to a deallocator suitable to match
@ref{c5f,,PyType_GenericAlloc()} and the value of the
@ref{980,,Py_TPFLAGS_HAVE_GC} flag.

For static subtypes, this slot is inherited (see above).
@end deffn

@geindex PyTypeObject.tp_is_gc (C member)
@anchor{c-api/typeobj c PyTypeObject tp_is_gc}@anchor{5663}
@deffn {C 멤버 변수} @ref{51ea,,inquiry} @ref{c9b,,PyTypeObject}.tp_is_gc

` The corresponding @ref{511b,,slot ID} @code{Py_tp_is_gc} is part of the @ref{774,,안정 ABI}.'
@geindex Py_tp_is_gc (C macro)
@anchor{c-api/typeobj c Py_tp_is_gc}@anchor{51d1}

가비지 수집기에서 호출되는 함수에 대한 선택적 포인터.

The garbage collector needs to know whether a particular object is collectible
or not.  Normally, it is sufficient to look at the object’s type’s
@ref{1c6f,,tp_flags} field, and check the @ref{980,,Py_TPFLAGS_HAVE_GC} flag bit.  But
some types have a mixture of statically and dynamically allocated instances, and
the statically allocated instances are not collectible.  Such types should
define this function; it should return @code{1} for a collectible instance, and
@code{0} for a non-collectible instance. The signature is:

@example
int tp_is_gc(PyObject *self);
@end example

(The only example of this are types themselves.  The metatype,
@ref{76e,,PyType_Type}, defines this function to distinguish between statically
and @ref{b5e,,dynamically allocated types}.)

`계승:'

이 필드는 서브 형으로 상속됩니다.

`기본값:'

This slot has no default.  If this field is @code{NULL},
@ref{980,,Py_TPFLAGS_HAVE_GC} is used as the functional equivalent.
@end deffn

@geindex PyTypeObject.tp_bases (C member)
@anchor{c-api/typeobj c PyTypeObject tp_bases}@anchor{5664}
@deffn {C 멤버 변수} @ref{5dc,,PyObject} *@ref{c9b,,PyTypeObject}.tp_bases

` The corresponding @ref{511b,,slot ID} @code{Py_tp_bases} is part of the @ref{774,,안정 ABI}.'
@geindex Py_tp_bases (C macro)
@anchor{c-api/typeobj c Py_tp_bases}@anchor{51c2}

베이스형의 튜플.

This field should be set to @code{NULL} and treated as read-only.
Python will fill it in when the type is @ref{97f,,initialized}.

For dynamically created classes, the @ref{51c2,,Py_tp_bases}
@ref{511b,,slot} can be used instead of the `bases' argument
of @ref{79d,,PyType_FromSpecWithBases()}.
The argument form is preferred.

@cartouche
@quotation 경고 
Multiple inheritance does not work well for statically defined types.
If you set @code{tp_bases} to a tuple, Python will not raise an error,
but some slots will only be inherited from the first base.
@end quotation
@end cartouche

`계승:'

이 필드는 상속되지 않습니다.
@end deffn

@geindex PyTypeObject.tp_mro (C member)
@anchor{c-api/typeobj c PyTypeObject tp_mro}@anchor{532d}
@deffn {C 멤버 변수} @ref{5dc,,PyObject} *@ref{c9b,,PyTypeObject}.tp_mro

형 자체에서 시작하여 @ref{c7d,,object}로 끝나는 확장된 베이스형 집합을 포함하는 튜플.

This field should be set to @code{NULL} and treated as read-only.
Python will fill it in when the type is @ref{97f,,initialized}.

`계승:'

이 필드는 상속되지 않습니다; @ref{97f,,PyType_Ready()}에 의해 새로 계산됩니다.
@end deffn

@geindex PyTypeObject.tp_cache (C member)
@anchor{c-api/typeobj c PyTypeObject tp_cache}@anchor{532e}
@deffn {C 멤버 변수} @ref{5dc,,PyObject} *@ref{c9b,,PyTypeObject}.tp_cache

사용되지 않습니다. 내부 전용.

`계승:'

이 필드는 상속되지 않습니다.
@end deffn

@geindex PyTypeObject.tp_subclasses (C member)
@anchor{c-api/typeobj c PyTypeObject tp_subclasses}@anchor{791}
@deffn {C 멤버 변수} void *@ref{c9b,,PyTypeObject}.tp_subclasses

A collection of subclasses.  Internal use only.  May be an invalid pointer.

To get a list of subclasses, call the Python method
@ref{792,,__subclasses__()}.


버전 3.12에서 변경: For some types, this field does not hold a valid @ref{5dc,,PyObject}*.
The type was changed to void* to indicate this.


`계승:'

이 필드는 상속되지 않습니다.
@end deffn

@geindex PyTypeObject.tp_weaklist (C member)
@anchor{c-api/typeobj c PyTypeObject tp_weaklist}@anchor{532f}
@deffn {C 멤버 변수} @ref{5dc,,PyObject} *@ref{c9b,,PyTypeObject}.tp_weaklist

이 형 객체에 대한 약한 참조를 위한 약한 참조 리스트 헤드. 상속되지 않습니다. 내부 전용.


버전 3.12에서 변경: Internals detail: For the static builtin types this is always @code{NULL},
even if weakrefs are added.  Instead, the weakrefs for each are stored
on @code{PyInterpreterState}.  Use the public C-API or the internal
@code{_PyObject_GET_WEAKREFS_LISTPTR()} macro to avoid the distinction.


`계승:'

이 필드는 상속되지 않습니다.
@end deffn

@geindex PyTypeObject.tp_del (C member)
@anchor{c-api/typeobj c PyTypeObject tp_del}@anchor{5665}
@deffn {C 멤버 변수} @ref{51e2,,destructor} @ref{c9b,,PyTypeObject}.tp_del

` The corresponding @ref{511b,,slot ID} @code{Py_tp_del} is part of the @ref{774,,안정 ABI}.'
@geindex Py_tp_del (C macro)
@anchor{c-api/typeobj c Py_tp_del}@anchor{51c6}

이 필드는 폐지되었습니다. 대신 @ref{c9c,,tp_finalize}를 사용하십시오.
@end deffn

@geindex PyTypeObject.tp_version_tag (C member)
@anchor{c-api/typeobj c PyTypeObject tp_version_tag}@anchor{5666}
@deffn {C 멤버 변수} unsigned int @ref{c9b,,PyTypeObject}.tp_version_tag

메서드 캐시에 인덱싱하는 데 사용됩니다. 내부 전용.

`계승:'

이 필드는 상속되지 않습니다.
@end deffn

@geindex PyTypeObject.tp_finalize (C member)
@anchor{c-api/typeobj c PyTypeObject tp_finalize}@anchor{c9c}
@deffn {C 멤버 변수} @ref{51e2,,destructor} @ref{c9b,,PyTypeObject}.tp_finalize

` The corresponding @ref{511b,,slot ID} @code{Py_tp_finalize} is part of the @ref{774,,안정 ABI} 버전 3.5 이후로.'
@geindex Py_tp_finalize (C macro)
@anchor{c-api/typeobj c Py_tp_finalize}@anchor{51ca}

An optional pointer to an instance finalization function.  This is the C
implementation of the @ref{11fc,,__del__()} special method.  Its signature
is:

@example
void tp_finalize(PyObject *self);
@end example

The primary purpose of finalization is to perform any non-trivial cleanup
that must be performed before the object is destroyed, while the object and
any other objects it directly or indirectly references are still in a
consistent state.  The finalizer is allowed to execute
arbitrary Python code.

Before Python automatically finalizes an object, some of the object’s direct
or indirect referents might have themselves been automatically finalized.
However, none of the referents will have been automatically cleared
(@ref{4f21,,tp_clear}) yet.

Other non-finalized objects might still be using a finalized object, so the
finalizer must leave the object in a sane state (e.g., invariants are still
met).

@cartouche
@quotation 참고 
After Python automatically finalizes an object, Python might start
automatically clearing (@ref{4f21,,tp_clear}) the object
and its referents (direct and indirect).  Cleared objects are not
guaranteed to be in a consistent state; a finalized object must be able
to tolerate cleared referents.
@end quotation
@end cartouche

@cartouche
@quotation 참고 
An object is not guaranteed to be automatically finalized before its
destructor (@ref{4efb,,tp_dealloc}) is called.  It is
recommended to call @ref{562f,,PyObject_CallFinalizerFromDealloc()} at the
beginning of @code{tp_dealloc} to guarantee that the object is
always finalized before destruction.
@end quotation
@end cartouche

@cartouche
@quotation 참고 
The @ref{c9c,,tp_finalize} function can be called from any
thread, although the @ref{164,,GIL} will be held.
@end quotation
@end cartouche

@cartouche
@quotation 참고 
The @code{tp_finalize} function can be called during shutdown,
after some global variables have been deleted.  See the documentation of
the @ref{11fc,,__del__()} method for details.
@end quotation
@end cartouche

When Python finalizes an object, it behaves like the following algorithm:


@enumerate 

@item 
Python might mark the object as `finalized'.  Currently, Python always
marks objects whose type supports garbage collection (i.e., the
@ref{980,,Py_TPFLAGS_HAVE_GC} flag is set in
@ref{1c6f,,tp_flags}) and never marks other types of
objects; this might change in a future version.

@item 
If the object is not marked as `finalized' and its
@code{tp_finalize} finalizer function is non-@code{NULL}, the
finalizer function is called.

@item 
If the finalizer function was called and the finalizer made the object
reachable (i.e., there is a reference to the object and it is not a
member of a @ref{5630,,cyclic isolate}), then the finalizer is said to have
`resurrected' the object.  It is unspecified whether the finalizer can
also resurrect the object by adding a new reference to the object that
does not make it reachable, i.e., the object is (still) a member of a
cyclic isolate.

@item 
If the finalizer resurrected the object, the object’s pending destruction
is canceled and the object’s `finalized' mark might be removed if
present.  Currently, Python never removes the `finalized' mark; this
might change in a future version.
@end enumerate

`Automatic finalization' refers to any finalization performed by Python
except via calls to @ref{5633,,PyObject_CallFinalizer()} or
@ref{562f,,PyObject_CallFinalizerFromDealloc()}.  No guarantees are made about
when, if, or how often an object is automatically finalized, except:


@itemize *

@item 
Python will not automatically finalize an object if it is reachable, i.e.,
there is a reference to it and it is not a member of a @ref{5630,,cyclic isolate}.

@item 
Python will not automatically finalize an object if finalizing it would
not mark the object as `finalized'.  Currently, this applies to objects
whose type does not support garbage collection, i.e., the
@ref{980,,Py_TPFLAGS_HAVE_GC} flag is not set.  Such objects can still be
manually finalized by calling @ref{5633,,PyObject_CallFinalizer()} or
@ref{562f,,PyObject_CallFinalizerFromDealloc()}.

@item 
Python will not automatically finalize any two members of a @ref{5630,,cyclic isolate} concurrently.

@item 
Python will not automatically finalize an object after it has
automatically cleared (@ref{4f21,,tp_clear}) the object.

@item 
If an object is a member of a @ref{5630,,cyclic isolate}, Python will not
automatically finalize it after automatically clearing (see
@ref{4f21,,tp_clear}) any other member.

@item 
Python will automatically finalize every member of a @ref{5630,,cyclic isolate} before it automatically clears (see
@ref{4f21,,tp_clear}) any of them.

@item 
If Python is going to automatically clear an object
(@ref{4f21,,tp_clear}), it will automatically finalize the
object first.
@end itemize

Python currently only automatically finalizes objects that are members of a
@ref{5630,,cyclic isolate}, but future versions might finalize objects regularly
before their destruction.

To manually finalize an object, do not call this function directly; call
@ref{5633,,PyObject_CallFinalizer()} or
@ref{562f,,PyObject_CallFinalizerFromDealloc()} instead.

@ref{c9c,,tp_finalize} should leave the current exception
status unchanged.  The recommended way to write a non-trivial finalizer is
to back up the exception at the beginning by calling
@ref{429,,PyErr_GetRaisedException()} and restore the exception at the end by
calling @ref{42c,,PyErr_SetRaisedException()}.  If an exception is encountered
in the middle of the finalizer, log and clear it with
@ref{5ef,,PyErr_WriteUnraisable()} or @ref{5f0,,PyErr_FormatUnraisable()}.  For
example:

@example
static void
foo_finalize(PyObject *self)
@{
    // Save the current exception, if any.
    PyObject *exc = PyErr_GetRaisedException();

    // ...

    if (do_something_that_might_raise() != success_indicator) @{
        PyErr_WriteUnraisable(self);
        goto done;
    @}

done:
    // Restore the saved exception.  This silently discards any exception
    // raised above, so be sure to call PyErr_WriteUnraisable first if
    // necessary.
    PyErr_SetRaisedException(exc);
@}
@end example

`계승:'

이 필드는 서브 형으로 상속됩니다.


Added in version 3.4.



버전 3.8에서 변경: Before version 3.8 it was necessary to set the
@ref{427,,Py_TPFLAGS_HAVE_FINALIZE} flags bit in order for this field to be
used.  This is no longer required.



@subsubheading 더 보기



@itemize *

@item 
@geindex Python 향상 제안; PEP 442
PEP 442@footnote{https://peps.python.org/pep-0442/}: “Safe object finalization”

@item 
@ref{562b,,Object Life Cycle} for details about how this slot relates to other
slots.

@item 
@ref{5633,,PyObject_CallFinalizer()}

@item 
@ref{562f,,PyObject_CallFinalizerFromDealloc()}
@end itemize

@end deffn

@geindex PyTypeObject.tp_vectorcall (C member)
@anchor{c-api/typeobj c PyTypeObject tp_vectorcall}@anchor{198b}
@deffn {C 멤버 변수} @ref{778,,vectorcallfunc} @ref{c9b,,PyTypeObject}.tp_vectorcall

` The corresponding @ref{511b,,slot ID} @code{Py_tp_vectorcall} is part of the @ref{774,,안정 ABI} 버전 3.14 이후로.'
@geindex Py_tp_vectorcall (C macro)
@anchor{c-api/typeobj c Py_tp_vectorcall}@anchor{51dd}

A @ref{773,,vectorcall function} to use for calls of this type
object (rather than instances).
In other words, @code{tp_vectorcall} can be used to optimize @code{type.__call__},
which typically returns a new instance of `type'.

As with any vectorcall function, if @code{tp_vectorcall} is @code{NULL},
the `tp_call' protocol (@code{Py_TYPE(type)->tp_call}) is used instead.

@cartouche
@quotation 참고 
The @ref{773,,vectorcall protocol} requires that the vectorcall
function has the same behavior as the corresponding @code{tp_call}.
This means that @code{type->tp_vectorcall} must match the behavior of
@code{Py_TYPE(type)->tp_call}.

Specifically, if `type' uses the default metaclass,
@code{type->tp_vectorcall} must behave the same as
@ref{76e,,PyType_Type}->tp_call, which:


@itemize -

@item 
calls @code{type->tp_new},

@item 
if the result is a subclass of `type', calls @code{type->tp_init}
on the result of @code{tp_new}, and

@item 
returns the result of @code{tp_new}.
@end itemize

Typically, @code{tp_vectorcall} is overridden to optimize this process
for specific @ref{79e,,tp_new} and
@ref{7a0,,tp_init}.
When doing this for user-subclassable types, note that both can be
overridden (using @ref{79f,,__new__()} and
@ref{8be,,__init__()}, respectively).
@end quotation
@end cartouche

`계승:'

이 필드는 상속되지 않습니다.


Added in version 3.9: (필드는 3.8부터 존재하지만 3.9부터 사용됩니다)

@end deffn

@geindex PyTypeObject.tp_watched (C member)
@anchor{c-api/typeobj c PyTypeObject tp_watched}@anchor{5667}
@deffn {C 멤버 변수} unsigned char @ref{c9b,,PyTypeObject}.tp_watched

Internal. Do not use.


Added in version 3.12.

@end deffn

@node Static Types,힙 형,PyTypeObject 슬롯,Type Object Structures
@anchor{c-api/typeobj id4}@anchor{56b1}@anchor{c-api/typeobj static-types}@anchor{982}
@subsubsection Static Types


전통적으로, C 코드에서 정의된 형은 `정적(static)'입니다. 즉 정적 @ref{c9b,,PyTypeObject} 구조체는 코드에서 직접 정의되고 @ref{97f,,PyType_Ready()}를 사용하여 초기화됩니다.

결과적으로 파이썬에서 정의된 형에 비해 형이 제한됩니다:


@itemize *

@item 
정적 형은 하나의 베이스로 제한됩니다. 즉, 다중 상속을 사용할 수 없습니다.

@item 
정적 형 객체(그러나 이들의 인스턴스는 아닙니다)는 불변입니다. 파이썬에서 형 객체의 어트리뷰트를 추가하거나 수정할 수 없습니다.

@item 
정적 형 객체는 @ref{163,,서브 인터프리터}에서 공유되므로, 서브 인터프리터 관련 상태를 포함하지 않아야 합니다.
@end itemize

Also, since @ref{c9b,,PyTypeObject} is only part of the @ref{635,,Limited API} as an opaque struct, any extension modules using static types must be
compiled for a specific Python minor version.

@node 힙 형,숫자 객체 구조체,Static Types,Type Object Structures
@anchor{c-api/typeobj heap-types}@anchor{b5e}@anchor{c-api/typeobj id5}@anchor{56b2}
@subsubsection 힙 형


An alternative to @ref{982,,static types} is `heap-allocated types',
or `heap types' for short, which correspond closely to classes created by
Python’s @code{class} statement. Heap types have the @ref{aac,,Py_TPFLAGS_HEAPTYPE}
flag set.

This is done by filling a @ref{1a89,,PyType_Spec} structure and calling
@ref{79c,,PyType_FromSpec()}, @ref{79d,,PyType_FromSpecWithBases()},
@ref{772,,PyType_FromModuleAndSpec()}, or @ref{771,,PyType_FromMetaclass()}.

@node 숫자 객체 구조체,매핑 객체 구조체,힙 형,Type Object Structures
@anchor{c-api/typeobj number-object-structures}@anchor{56b3}@anchor{c-api/typeobj number-structs}@anchor{569f}
@subsubsection 숫자 객체 구조체


@geindex PyNumberMethods (C type)
@anchor{c-api/typeobj c PyNumberMethods}@anchor{1623}
@deffn {C 자료형} type PyNumberMethods

이 구조체는 객체가 숫자 프로토콜을 구현하는 데 사용하는 함수에 대한 포인터를 담습니다. 각 함수는 @ref{52e0,,숫자 프로토콜} 섹션에서 설명하는 유사한 이름의 함수가 사용합니다.

@c XXX Drop the definition?

구조체 정의는 다음과 같습니다:

@example
typedef struct @{
     binaryfunc nb_add;
     binaryfunc nb_subtract;
     binaryfunc nb_multiply;
     binaryfunc nb_remainder;
     binaryfunc nb_divmod;
     ternaryfunc nb_power;
     unaryfunc nb_negative;
     unaryfunc nb_positive;
     unaryfunc nb_absolute;
     inquiry nb_bool;
     unaryfunc nb_invert;
     binaryfunc nb_lshift;
     binaryfunc nb_rshift;
     binaryfunc nb_and;
     binaryfunc nb_xor;
     binaryfunc nb_or;
     unaryfunc nb_int;
     void *nb_reserved;
     unaryfunc nb_float;

     binaryfunc nb_inplace_add;
     binaryfunc nb_inplace_subtract;
     binaryfunc nb_inplace_multiply;
     binaryfunc nb_inplace_remainder;
     ternaryfunc nb_inplace_power;
     binaryfunc nb_inplace_lshift;
     binaryfunc nb_inplace_rshift;
     binaryfunc nb_inplace_and;
     binaryfunc nb_inplace_xor;
     binaryfunc nb_inplace_or;

     binaryfunc nb_floor_divide;
     binaryfunc nb_true_divide;
     binaryfunc nb_inplace_floor_divide;
     binaryfunc nb_inplace_true_divide;

     unaryfunc nb_index;

     binaryfunc nb_matrix_multiply;
     binaryfunc nb_inplace_matrix_multiply;
@} PyNumberMethods;
@end example

@cartouche
@quotation 참고 
이항과 삼항 함수는 모든 피연산자의 형을 확인하고, 필요한 변환을 구현해야합니다 (적어도 피연산자 중 하나는 정의된 형의 인스턴스입니다). 주어진 피연산자에 대해 연산이 정의되지 않으면, 이항과 삼항 함수는 @code{Py_NotImplemented}를 반환해야하며, 다른 에러가 발생하면 @code{NULL}을 반환하고 예외를 설정해야 합니다.
@end quotation
@end cartouche

@cartouche
@quotation 참고 
The @ref{5688,,nb_reserved} field should always be @code{NULL}.  It
was previously called @code{nb_long}, and was renamed in
Python 3.0.1.
@end quotation
@end cartouche
@end deffn

@geindex PyNumberMethods.nb_add (C member)
@anchor{c-api/typeobj c PyNumberMethods nb_add}@anchor{5321}
@deffn {C 멤버 변수} @ref{51df,,binaryfunc} @ref{1623,,PyNumberMethods}.nb_add

` The corresponding @ref{511b,,slot ID} @code{Py_nb_add} is part of the @ref{774,,안정 ABI}.'
@geindex Py_nb_add (C macro)
@anchor{c-api/typeobj c Py_nb_add}@anchor{5196}
@end deffn

@geindex PyNumberMethods.nb_subtract (C member)
@anchor{c-api/typeobj c PyNumberMethods nb_subtract}@anchor{566f}
@deffn {C 멤버 변수} @ref{51df,,binaryfunc} @ref{1623,,PyNumberMethods}.nb_subtract

` The corresponding @ref{511b,,slot ID} @code{Py_nb_subtract} is part of the @ref{774,,안정 ABI}.'
@geindex Py_nb_subtract (C macro)
@anchor{c-api/typeobj c Py_nb_subtract}@anchor{51b5}
@end deffn

@geindex PyNumberMethods.nb_multiply (C member)
@anchor{c-api/typeobj c PyNumberMethods nb_multiply}@anchor{5671}
@deffn {C 멤버 변수} @ref{51df,,binaryfunc} @ref{1623,,PyNumberMethods}.nb_multiply

` The corresponding @ref{511b,,slot ID} @code{Py_nb_multiply} is part of the @ref{774,,안정 ABI}.'
@geindex Py_nb_multiply (C macro)
@anchor{c-api/typeobj c Py_nb_multiply}@anchor{51ae}
@end deffn

@geindex PyNumberMethods.nb_remainder (C member)
@anchor{c-api/typeobj c PyNumberMethods nb_remainder}@anchor{5673}
@deffn {C 멤버 변수} @ref{51df,,binaryfunc} @ref{1623,,PyNumberMethods}.nb_remainder

` The corresponding @ref{511b,,slot ID} @code{Py_nb_remainder} is part of the @ref{774,,안정 ABI}.'
@geindex Py_nb_remainder (C macro)
@anchor{c-api/typeobj c Py_nb_remainder}@anchor{51b3}
@end deffn

@geindex PyNumberMethods.nb_divmod (C member)
@anchor{c-api/typeobj c PyNumberMethods nb_divmod}@anchor{5675}
@deffn {C 멤버 변수} @ref{51df,,binaryfunc} @ref{1623,,PyNumberMethods}.nb_divmod

` The corresponding @ref{511b,,slot ID} @code{Py_nb_divmod} is part of the @ref{774,,안정 ABI}.'
@geindex Py_nb_divmod (C macro)
@anchor{c-api/typeobj c Py_nb_divmod}@anchor{5199}
@end deffn

@geindex PyNumberMethods.nb_power (C member)
@anchor{c-api/typeobj c PyNumberMethods nb_power}@anchor{5676}
@deffn {C 멤버 변수} @ref{51f8,,ternaryfunc} @ref{1623,,PyNumberMethods}.nb_power

` The corresponding @ref{511b,,slot ID} @code{Py_nb_power} is part of the @ref{774,,안정 ABI}.'
@geindex Py_nb_power (C macro)
@anchor{c-api/typeobj c Py_nb_power}@anchor{51b2}
@end deffn

@geindex PyNumberMethods.nb_negative (C member)
@anchor{c-api/typeobj c PyNumberMethods nb_negative}@anchor{5678}
@deffn {C 멤버 변수} @ref{51fa,,unaryfunc} @ref{1623,,PyNumberMethods}.nb_negative

` The corresponding @ref{511b,,slot ID} @code{Py_nb_negative} is part of the @ref{774,,안정 ABI}.'
@geindex Py_nb_negative (C macro)
@anchor{c-api/typeobj c Py_nb_negative}@anchor{51af}
@end deffn

@geindex PyNumberMethods.nb_positive (C member)
@anchor{c-api/typeobj c PyNumberMethods nb_positive}@anchor{5679}
@deffn {C 멤버 변수} @ref{51fa,,unaryfunc} @ref{1623,,PyNumberMethods}.nb_positive

` The corresponding @ref{511b,,slot ID} @code{Py_nb_positive} is part of the @ref{774,,안정 ABI}.'
@geindex Py_nb_positive (C macro)
@anchor{c-api/typeobj c Py_nb_positive}@anchor{51b1}
@end deffn

@geindex PyNumberMethods.nb_absolute (C member)
@anchor{c-api/typeobj c PyNumberMethods nb_absolute}@anchor{567a}
@deffn {C 멤버 변수} @ref{51fa,,unaryfunc} @ref{1623,,PyNumberMethods}.nb_absolute

` The corresponding @ref{511b,,slot ID} @code{Py_nb_absolute} is part of the @ref{774,,안정 ABI}.'
@geindex Py_nb_absolute (C macro)
@anchor{c-api/typeobj c Py_nb_absolute}@anchor{5195}
@end deffn

@geindex PyNumberMethods.nb_bool (C member)
@anchor{c-api/typeobj c PyNumberMethods nb_bool}@anchor{567b}
@deffn {C 멤버 변수} @ref{51ea,,inquiry} @ref{1623,,PyNumberMethods}.nb_bool

` The corresponding @ref{511b,,slot ID} @code{Py_nb_bool} is part of the @ref{774,,안정 ABI}.'
@geindex Py_nb_bool (C macro)
@anchor{c-api/typeobj c Py_nb_bool}@anchor{5198}
@end deffn

@geindex PyNumberMethods.nb_invert (C member)
@anchor{c-api/typeobj c PyNumberMethods nb_invert}@anchor{567c}
@deffn {C 멤버 변수} @ref{51fa,,unaryfunc} @ref{1623,,PyNumberMethods}.nb_invert

` The corresponding @ref{511b,,slot ID} @code{Py_nb_invert} is part of the @ref{774,,안정 ABI}.'
@geindex Py_nb_invert (C macro)
@anchor{c-api/typeobj c Py_nb_invert}@anchor{51ab}
@end deffn

@geindex PyNumberMethods.nb_lshift (C member)
@anchor{c-api/typeobj c PyNumberMethods nb_lshift}@anchor{567d}
@deffn {C 멤버 변수} @ref{51df,,binaryfunc} @ref{1623,,PyNumberMethods}.nb_lshift

` The corresponding @ref{511b,,slot ID} @code{Py_nb_lshift} is part of the @ref{774,,안정 ABI}.'
@geindex Py_nb_lshift (C macro)
@anchor{c-api/typeobj c Py_nb_lshift}@anchor{51ac}
@end deffn

@geindex PyNumberMethods.nb_rshift (C member)
@anchor{c-api/typeobj c PyNumberMethods nb_rshift}@anchor{567f}
@deffn {C 멤버 변수} @ref{51df,,binaryfunc} @ref{1623,,PyNumberMethods}.nb_rshift

` The corresponding @ref{511b,,slot ID} @code{Py_nb_rshift} is part of the @ref{774,,안정 ABI}.'
@geindex Py_nb_rshift (C macro)
@anchor{c-api/typeobj c Py_nb_rshift}@anchor{51b4}
@end deffn

@geindex PyNumberMethods.nb_and (C member)
@anchor{c-api/typeobj c PyNumberMethods nb_and}@anchor{5681}
@deffn {C 멤버 변수} @ref{51df,,binaryfunc} @ref{1623,,PyNumberMethods}.nb_and

` The corresponding @ref{511b,,slot ID} @code{Py_nb_and} is part of the @ref{774,,안정 ABI}.'
@geindex Py_nb_and (C macro)
@anchor{c-api/typeobj c Py_nb_and}@anchor{5197}
@end deffn

@geindex PyNumberMethods.nb_xor (C member)
@anchor{c-api/typeobj c PyNumberMethods nb_xor}@anchor{5683}
@deffn {C 멤버 변수} @ref{51df,,binaryfunc} @ref{1623,,PyNumberMethods}.nb_xor

` The corresponding @ref{511b,,slot ID} @code{Py_nb_xor} is part of the @ref{774,,안정 ABI}.'
@geindex Py_nb_xor (C macro)
@anchor{c-api/typeobj c Py_nb_xor}@anchor{51b7}
@end deffn

@geindex PyNumberMethods.nb_or (C member)
@anchor{c-api/typeobj c PyNumberMethods nb_or}@anchor{5685}
@deffn {C 멤버 변수} @ref{51df,,binaryfunc} @ref{1623,,PyNumberMethods}.nb_or

` The corresponding @ref{511b,,slot ID} @code{Py_nb_or} is part of the @ref{774,,안정 ABI}.'
@geindex Py_nb_or (C macro)
@anchor{c-api/typeobj c Py_nb_or}@anchor{51b0}
@end deffn

@geindex PyNumberMethods.nb_int (C member)
@anchor{c-api/typeobj c PyNumberMethods nb_int}@anchor{5687}
@deffn {C 멤버 변수} @ref{51fa,,unaryfunc} @ref{1623,,PyNumberMethods}.nb_int

` The corresponding @ref{511b,,slot ID} @code{Py_nb_int} is part of the @ref{774,,안정 ABI}.'
@geindex Py_nb_int (C macro)
@anchor{c-api/typeobj c Py_nb_int}@anchor{51aa}
@end deffn

@geindex PyNumberMethods.nb_reserved (C member)
@anchor{c-api/typeobj c PyNumberMethods nb_reserved}@anchor{5688}
@deffn {C 멤버 변수} void *@ref{1623,,PyNumberMethods}.nb_reserved
@end deffn

@geindex PyNumberMethods.nb_float (C member)
@anchor{c-api/typeobj c PyNumberMethods nb_float}@anchor{5689}
@deffn {C 멤버 변수} @ref{51fa,,unaryfunc} @ref{1623,,PyNumberMethods}.nb_float

` The corresponding @ref{511b,,slot ID} @code{Py_nb_float} is part of the @ref{774,,안정 ABI}.'
@geindex Py_nb_float (C macro)
@anchor{c-api/typeobj c Py_nb_float}@anchor{519a}
@end deffn

@geindex PyNumberMethods.nb_inplace_add (C member)
@anchor{c-api/typeobj c PyNumberMethods nb_inplace_add}@anchor{566e}
@deffn {C 멤버 변수} @ref{51df,,binaryfunc} @ref{1623,,PyNumberMethods}.nb_inplace_add

` The corresponding @ref{511b,,slot ID} @code{Py_nb_inplace_add} is part of the @ref{774,,안정 ABI}.'
@geindex Py_nb_inplace_add (C macro)
@anchor{c-api/typeobj c Py_nb_inplace_add}@anchor{519d}
@end deffn

@geindex PyNumberMethods.nb_inplace_subtract (C member)
@anchor{c-api/typeobj c PyNumberMethods nb_inplace_subtract}@anchor{5670}
@deffn {C 멤버 변수} @ref{51df,,binaryfunc} @ref{1623,,PyNumberMethods}.nb_inplace_subtract

` The corresponding @ref{511b,,slot ID} @code{Py_nb_inplace_subtract} is part of the @ref{774,,안정 ABI}.'
@geindex Py_nb_inplace_subtract (C macro)
@anchor{c-api/typeobj c Py_nb_inplace_subtract}@anchor{51a7}
@end deffn

@geindex PyNumberMethods.nb_inplace_multiply (C member)
@anchor{c-api/typeobj c PyNumberMethods nb_inplace_multiply}@anchor{5672}
@deffn {C 멤버 변수} @ref{51df,,binaryfunc} @ref{1623,,PyNumberMethods}.nb_inplace_multiply

` The corresponding @ref{511b,,slot ID} @code{Py_nb_inplace_multiply} is part of the @ref{774,,안정 ABI}.'
@geindex Py_nb_inplace_multiply (C macro)
@anchor{c-api/typeobj c Py_nb_inplace_multiply}@anchor{51a2}
@end deffn

@geindex PyNumberMethods.nb_inplace_remainder (C member)
@anchor{c-api/typeobj c PyNumberMethods nb_inplace_remainder}@anchor{5674}
@deffn {C 멤버 변수} @ref{51df,,binaryfunc} @ref{1623,,PyNumberMethods}.nb_inplace_remainder

` The corresponding @ref{511b,,slot ID} @code{Py_nb_inplace_remainder} is part of the @ref{774,,안정 ABI}.'
@geindex Py_nb_inplace_remainder (C macro)
@anchor{c-api/typeobj c Py_nb_inplace_remainder}@anchor{51a5}
@end deffn

@geindex PyNumberMethods.nb_inplace_power (C member)
@anchor{c-api/typeobj c PyNumberMethods nb_inplace_power}@anchor{5677}
@deffn {C 멤버 변수} @ref{51f8,,ternaryfunc} @ref{1623,,PyNumberMethods}.nb_inplace_power

` The corresponding @ref{511b,,slot ID} @code{Py_nb_inplace_power} is part of the @ref{774,,안정 ABI}.'
@geindex Py_nb_inplace_power (C macro)
@anchor{c-api/typeobj c Py_nb_inplace_power}@anchor{51a4}
@end deffn

@geindex PyNumberMethods.nb_inplace_lshift (C member)
@anchor{c-api/typeobj c PyNumberMethods nb_inplace_lshift}@anchor{567e}
@deffn {C 멤버 변수} @ref{51df,,binaryfunc} @ref{1623,,PyNumberMethods}.nb_inplace_lshift

` The corresponding @ref{511b,,slot ID} @code{Py_nb_inplace_lshift} is part of the @ref{774,,안정 ABI}.'
@geindex Py_nb_inplace_lshift (C macro)
@anchor{c-api/typeobj c Py_nb_inplace_lshift}@anchor{51a0}
@end deffn

@geindex PyNumberMethods.nb_inplace_rshift (C member)
@anchor{c-api/typeobj c PyNumberMethods nb_inplace_rshift}@anchor{5680}
@deffn {C 멤버 변수} @ref{51df,,binaryfunc} @ref{1623,,PyNumberMethods}.nb_inplace_rshift

` The corresponding @ref{511b,,slot ID} @code{Py_nb_inplace_rshift} is part of the @ref{774,,안정 ABI}.'
@geindex Py_nb_inplace_rshift (C macro)
@anchor{c-api/typeobj c Py_nb_inplace_rshift}@anchor{51a6}
@end deffn

@geindex PyNumberMethods.nb_inplace_and (C member)
@anchor{c-api/typeobj c PyNumberMethods nb_inplace_and}@anchor{5682}
@deffn {C 멤버 변수} @ref{51df,,binaryfunc} @ref{1623,,PyNumberMethods}.nb_inplace_and

` The corresponding @ref{511b,,slot ID} @code{Py_nb_inplace_and} is part of the @ref{774,,안정 ABI}.'
@geindex Py_nb_inplace_and (C macro)
@anchor{c-api/typeobj c Py_nb_inplace_and}@anchor{519e}
@end deffn

@geindex PyNumberMethods.nb_inplace_xor (C member)
@anchor{c-api/typeobj c PyNumberMethods nb_inplace_xor}@anchor{5684}
@deffn {C 멤버 변수} @ref{51df,,binaryfunc} @ref{1623,,PyNumberMethods}.nb_inplace_xor

` The corresponding @ref{511b,,slot ID} @code{Py_nb_inplace_xor} is part of the @ref{774,,안정 ABI}.'
@geindex Py_nb_inplace_xor (C macro)
@anchor{c-api/typeobj c Py_nb_inplace_xor}@anchor{51a9}
@end deffn

@geindex PyNumberMethods.nb_inplace_or (C member)
@anchor{c-api/typeobj c PyNumberMethods nb_inplace_or}@anchor{5686}
@deffn {C 멤버 변수} @ref{51df,,binaryfunc} @ref{1623,,PyNumberMethods}.nb_inplace_or

` The corresponding @ref{511b,,slot ID} @code{Py_nb_inplace_or} is part of the @ref{774,,안정 ABI}.'
@geindex Py_nb_inplace_or (C macro)
@anchor{c-api/typeobj c Py_nb_inplace_or}@anchor{51a3}
@end deffn

@geindex PyNumberMethods.nb_floor_divide (C member)
@anchor{c-api/typeobj c PyNumberMethods nb_floor_divide}@anchor{568a}
@deffn {C 멤버 변수} @ref{51df,,binaryfunc} @ref{1623,,PyNumberMethods}.nb_floor_divide

` The corresponding @ref{511b,,slot ID} @code{Py_nb_floor_divide} is part of the @ref{774,,안정 ABI}.'
@geindex Py_nb_floor_divide (C macro)
@anchor{c-api/typeobj c Py_nb_floor_divide}@anchor{519b}
@end deffn

@geindex PyNumberMethods.nb_true_divide (C member)
@anchor{c-api/typeobj c PyNumberMethods nb_true_divide}@anchor{568c}
@deffn {C 멤버 변수} @ref{51df,,binaryfunc} @ref{1623,,PyNumberMethods}.nb_true_divide

` The corresponding @ref{511b,,slot ID} @code{Py_nb_true_divide} is part of the @ref{774,,안정 ABI}.'
@geindex Py_nb_true_divide (C macro)
@anchor{c-api/typeobj c Py_nb_true_divide}@anchor{51b6}
@end deffn

@geindex PyNumberMethods.nb_inplace_floor_divide (C member)
@anchor{c-api/typeobj c PyNumberMethods nb_inplace_floor_divide}@anchor{568b}
@deffn {C 멤버 변수} @ref{51df,,binaryfunc} @ref{1623,,PyNumberMethods}.nb_inplace_floor_divide

` The corresponding @ref{511b,,slot ID} @code{Py_nb_inplace_floor_divide} is part of the @ref{774,,안정 ABI}.'
@geindex Py_nb_inplace_floor_divide (C macro)
@anchor{c-api/typeobj c Py_nb_inplace_floor_divide}@anchor{519f}
@end deffn

@geindex PyNumberMethods.nb_inplace_true_divide (C member)
@anchor{c-api/typeobj c PyNumberMethods nb_inplace_true_divide}@anchor{568d}
@deffn {C 멤버 변수} @ref{51df,,binaryfunc} @ref{1623,,PyNumberMethods}.nb_inplace_true_divide

` The corresponding @ref{511b,,slot ID} @code{Py_nb_inplace_true_divide} is part of the @ref{774,,안정 ABI}.'
@geindex Py_nb_inplace_true_divide (C macro)
@anchor{c-api/typeobj c Py_nb_inplace_true_divide}@anchor{51a8}
@end deffn

@geindex PyNumberMethods.nb_index (C member)
@anchor{c-api/typeobj c PyNumberMethods nb_index}@anchor{1622}
@deffn {C 멤버 변수} @ref{51fa,,unaryfunc} @ref{1623,,PyNumberMethods}.nb_index

` The corresponding @ref{511b,,slot ID} @code{Py_nb_index} is part of the @ref{774,,안정 ABI}.'
@geindex Py_nb_index (C macro)
@anchor{c-api/typeobj c Py_nb_index}@anchor{519c}
@end deffn

@geindex PyNumberMethods.nb_matrix_multiply (C member)
@anchor{c-api/typeobj c PyNumberMethods nb_matrix_multiply}@anchor{568e}
@deffn {C 멤버 변수} @ref{51df,,binaryfunc} @ref{1623,,PyNumberMethods}.nb_matrix_multiply

` The corresponding @ref{511b,,slot ID} @code{Py_nb_matrix_multiply} is part of the @ref{774,,안정 ABI} 버전 3.5 이후로.'
@geindex Py_nb_matrix_multiply (C macro)
@anchor{c-api/typeobj c Py_nb_matrix_multiply}@anchor{51ad}
@end deffn

@geindex PyNumberMethods.nb_inplace_matrix_multiply (C member)
@anchor{c-api/typeobj c PyNumberMethods nb_inplace_matrix_multiply}@anchor{568f}
@deffn {C 멤버 변수} @ref{51df,,binaryfunc} @ref{1623,,PyNumberMethods}.nb_inplace_matrix_multiply

` The corresponding @ref{511b,,slot ID} @code{Py_nb_inplace_matrix_multiply} is part of the @ref{774,,안정 ABI} 버전 3.5 이후로.'
@geindex Py_nb_inplace_matrix_multiply (C macro)
@anchor{c-api/typeobj c Py_nb_inplace_matrix_multiply}@anchor{51a1}
@end deffn

@node 매핑 객체 구조체,시퀀스 객체 구조체,숫자 객체 구조체,Type Object Structures
@anchor{c-api/typeobj mapping-object-structures}@anchor{56b4}@anchor{c-api/typeobj mapping-structs}@anchor{56a1}
@subsubsection 매핑 객체 구조체


@geindex PyMappingMethods (C type)
@anchor{c-api/typeobj c PyMappingMethods}@anchor{4f34}
@deffn {C 자료형} type PyMappingMethods

이 구조체에는 객체가 매핑 프로토콜을 구현하는 데 사용하는 함수에 대한 포인터를 담습니다. 세 개의 멤버가 있습니다:
@end deffn

@geindex PyMappingMethods.mp_length (C member)
@anchor{c-api/typeobj c PyMappingMethods mp_length}@anchor{5690}
@deffn {C 멤버 변수} @ref{51ec,,lenfunc} @ref{4f34,,PyMappingMethods}.mp_length

` The corresponding @ref{511b,,slot ID} @code{Py_mp_length} is part of the @ref{774,,안정 ABI}.'
@geindex Py_mp_length (C macro)
@anchor{c-api/typeobj c Py_mp_length}@anchor{5193}

이 함수는 @ref{1e33,,PyMapping_Size()}와 @ref{50d7,,PyObject_Size()}에서 사용되며, 같은 서명을 갖습니다. 객체에 길이가 정의되어 있지 않으면 이 슬롯을 @code{NULL}로 설정할 수 있습니다.
@end deffn

@geindex PyMappingMethods.mp_subscript (C member)
@anchor{c-api/typeobj c PyMappingMethods mp_subscript}@anchor{1cf3}
@deffn {C 멤버 변수} @ref{51df,,binaryfunc} @ref{4f34,,PyMappingMethods}.mp_subscript

` The corresponding @ref{511b,,slot ID} @code{Py_mp_subscript} is part of the @ref{774,,안정 ABI}.'
@geindex Py_mp_subscript (C macro)
@anchor{c-api/typeobj c Py_mp_subscript}@anchor{5194}

이 함수는 @ref{5e6,,PyObject_GetItem()}과 @ref{50e3,,PySequence_GetSlice()}에서 사용되며, @code{PyObject_GetItem()}과 같은 서명을 갖습니다. @ref{5090,,PyMapping_Check()} 함수가 @code{1}을 반환하려면, 이 슬롯을 채워야합니다, 그렇지 않으면 @code{NULL}일 수 있습니다.
@end deffn

@geindex PyMappingMethods.mp_ass_subscript (C member)
@anchor{c-api/typeobj c PyMappingMethods mp_ass_subscript}@anchor{5691}
@deffn {C 멤버 변수} @ref{51ee,,objobjargproc} @ref{4f34,,PyMappingMethods}.mp_ass_subscript

` The corresponding @ref{511b,,slot ID} @code{Py_mp_ass_subscript} is part of the @ref{774,,안정 ABI}.'
@geindex Py_mp_ass_subscript (C macro)
@anchor{c-api/typeobj c Py_mp_ass_subscript}@anchor{5192}

This function is used by @ref{4f87,,PyObject_SetItem()},
@ref{50ca,,PyObject_DelItem()}, @ref{50ea,,PySequence_SetSlice()} and
@ref{50e2,,PySequence_DelSlice()}.  It has the same signature as
@code{PyObject_SetItem()}, but `v' can also be set to @code{NULL} to delete
an item.  If this slot is @code{NULL}, the object does not support item
assignment and deletion.
@end deffn

@node 시퀀스 객체 구조체,버퍼 객체 구조체,매핑 객체 구조체,Type Object Structures
@anchor{c-api/typeobj sequence-object-structures}@anchor{56b5}@anchor{c-api/typeobj sequence-structs}@anchor{56a0}
@subsubsection 시퀀스 객체 구조체


@geindex PySequenceMethods (C type)
@anchor{c-api/typeobj c PySequenceMethods}@anchor{4f33}
@deffn {C 자료형} type PySequenceMethods

이 구조체는 객체가 시퀀스 프로토콜을 구현하는 데 사용하는 함수에 대한 포인터를 담습니다.
@end deffn

@geindex PySequenceMethods.sq_length (C member)
@anchor{c-api/typeobj c PySequenceMethods sq_length}@anchor{532a}
@deffn {C 멤버 변수} @ref{51ec,,lenfunc} @ref{4f33,,PySequenceMethods}.sq_length

` The corresponding @ref{511b,,slot ID} @code{Py_sq_length} is part of the @ref{774,,안정 ABI}.'
@geindex Py_sq_length (C macro)
@anchor{c-api/typeobj c Py_sq_length}@anchor{51be}

이 함수는 @ref{1e2f,,PySequence_Size()}와 @ref{50d7,,PyObject_Size()}에서 사용되며, 같은 서명을 갖습니다. 또한 @ref{1cf2,,sq_item}과 @ref{5694,,sq_ass_item} 슬롯을 통해 음수 인덱스를 처리하는 데 사용됩니다.
@end deffn

@geindex PySequenceMethods.sq_concat (C member)
@anchor{c-api/typeobj c PySequenceMethods sq_concat}@anchor{5692}
@deffn {C 멤버 변수} @ref{51df,,binaryfunc} @ref{4f33,,PySequenceMethods}.sq_concat

` The corresponding @ref{511b,,slot ID} @code{Py_sq_concat} is part of the @ref{774,,안정 ABI}.'
@geindex Py_sq_concat (C macro)
@anchor{c-api/typeobj c Py_sq_concat}@anchor{51b9}

이 함수는 @ref{50e0,,PySequence_Concat()}에서 사용되며 같은 서명을 갖습니다. @ref{5321,,nb_add} 슬롯을 통해 숫자 덧셈을 시도한 후, @code{+} 연산자에서도 사용됩니다.
@end deffn

@geindex PySequenceMethods.sq_repeat (C member)
@anchor{c-api/typeobj c PySequenceMethods sq_repeat}@anchor{5693}
@deffn {C 멤버 변수} @ref{51f6,,ssizeargfunc} @ref{4f33,,PySequenceMethods}.sq_repeat

` The corresponding @ref{511b,,slot ID} @code{Py_sq_repeat} is part of the @ref{774,,안정 ABI}.'
@geindex Py_sq_repeat (C macro)
@anchor{c-api/typeobj c Py_sq_repeat}@anchor{51bf}

이 함수는 @ref{50e9,,PySequence_Repeat()}에서 사용되며 같은 서명을 갖습니다. @ref{5671,,nb_multiply} 슬롯을 통해 숫자 곱셈을 시도한 후, @code{*} 연산자에서도 사용됩니다.
@end deffn

@geindex PySequenceMethods.sq_item (C member)
@anchor{c-api/typeobj c PySequenceMethods sq_item}@anchor{1cf2}
@deffn {C 멤버 변수} @ref{51f6,,ssizeargfunc} @ref{4f33,,PySequenceMethods}.sq_item

` The corresponding @ref{511b,,slot ID} @code{Py_sq_item} is part of the @ref{774,,안정 ABI}.'
@geindex Py_sq_item (C macro)
@anchor{c-api/typeobj c Py_sq_item}@anchor{51bd}

이 함수는 @ref{1e30,,PySequence_GetItem()}에서 사용되며 같은 서명을 갖습니다. @ref{1cf3,,mp_subscript} 슬롯을 통해 서브스크립션(subscription)을 시도한 후, @ref{5e6,,PyObject_GetItem()}에서도 사용됩니다. @ref{50df,,PySequence_Check()} 함수가 @code{1}을 반환하려면, 이 슬롯을 채워야합니다, 그렇지 않으면 @code{NULL}일 수 있습니다.

Negative indexes are handled as follows: if the @ref{532a,,sq_length} slot is
filled, it is called and the sequence length is used to compute a positive
index which is passed to  @ref{1cf2,,sq_item}.  If @code{sq_length} is @code{NULL},
the index is passed as is to the function.
@end deffn

@geindex PySequenceMethods.sq_ass_item (C member)
@anchor{c-api/typeobj c PySequenceMethods sq_ass_item}@anchor{5694}
@deffn {C 멤버 변수} @ref{51f7,,ssizeobjargproc} @ref{4f33,,PySequenceMethods}.sq_ass_item

` The corresponding @ref{511b,,slot ID} @code{Py_sq_ass_item} is part of the @ref{774,,안정 ABI}.'
@geindex Py_sq_ass_item (C macro)
@anchor{c-api/typeobj c Py_sq_ass_item}@anchor{51b8}

이 함수는 @ref{1e31,,PySequence_SetItem()}에서 사용되며 같은 서명을 갖습니다. @ref{5691,,mp_ass_subscript} 슬롯을 통해 항목 대입과 삭제를 시도한 후, @ref{4f87,,PyObject_SetItem()}과 @ref{50ca,,PyObject_DelItem()}에서도 사용됩니다. 객체가 항목 대입과 삭제를 지원하지 않으면 이 슬롯은 @code{NULL}로 남겨 둘 수 있습니다.
@end deffn

@geindex PySequenceMethods.sq_contains (C member)
@anchor{c-api/typeobj c PySequenceMethods sq_contains}@anchor{5695}
@deffn {C 멤버 변수} @ref{51ef,,objobjproc} @ref{4f33,,PySequenceMethods}.sq_contains

` The corresponding @ref{511b,,slot ID} @code{Py_sq_contains} is part of the @ref{774,,안정 ABI}.'
@geindex Py_sq_contains (C macro)
@anchor{c-api/typeobj c Py_sq_contains}@anchor{51ba}

이 함수는 @ref{3d9,,PySequence_Contains()}에서 사용될 수 있으며 같은 서명을 갖습니다. 이 슬롯은 @code{NULL}로 남겨 둘 수 있습니다, 이때 @code{PySequence_Contains()}는 일치하는 것을 찾을 때까지 시퀀스를 단순히 탐색합니다.
@end deffn

@geindex PySequenceMethods.sq_inplace_concat (C member)
@anchor{c-api/typeobj c PySequenceMethods sq_inplace_concat}@anchor{5696}
@deffn {C 멤버 변수} @ref{51df,,binaryfunc} @ref{4f33,,PySequenceMethods}.sq_inplace_concat

` The corresponding @ref{511b,,slot ID} @code{Py_sq_inplace_concat} is part of the @ref{774,,안정 ABI}.'
@geindex Py_sq_inplace_concat (C macro)
@anchor{c-api/typeobj c Py_sq_inplace_concat}@anchor{51bb}

이 함수는 @ref{50e4,,PySequence_InPlaceConcat()}에서 사용되며 같은 서명을 갖습니다. 첫 번째 피연산자를 수정하고 그것을 반환해야 합니다. 이 슬롯은 @code{NULL}로 남겨 둘 수 있으며, 이때 @code{PySequence_InPlaceConcat()}은 @ref{50e0,,PySequence_Concat()}으로 폴백 됩니다. @ref{566e,,nb_inplace_add} 슬롯을 통해 숫자 제자리 덧셈을 시도한 후, 증분 대입 @code{+=}에서 사용됩니다.
@end deffn

@geindex PySequenceMethods.sq_inplace_repeat (C member)
@anchor{c-api/typeobj c PySequenceMethods sq_inplace_repeat}@anchor{5697}
@deffn {C 멤버 변수} @ref{51f6,,ssizeargfunc} @ref{4f33,,PySequenceMethods}.sq_inplace_repeat

` The corresponding @ref{511b,,slot ID} @code{Py_sq_inplace_repeat} is part of the @ref{774,,안정 ABI}.'
@geindex Py_sq_inplace_repeat (C macro)
@anchor{c-api/typeobj c Py_sq_inplace_repeat}@anchor{51bc}

이 함수는 @ref{50e5,,PySequence_InPlaceRepeat()}에서 사용되며 같은 서명을 갖습니다. 첫 번째 피연산자를 수정하고 그것을 반환해야 합니다. 이 슬롯은 @code{NULL}로 남겨 둘 수 있으며, 이때 @code{PySequence_InPlaceRepeat()}는 @ref{50e9,,PySequence_Repeat()}로 폴백 됩니다. @ref{5672,,nb_inplace_multiply} 슬롯을 통해 숫자 제자리 곱셈을 시도한 후, 증분 대입 @code{*=}에서도 사용됩니다.
@end deffn

@node 버퍼 객체 구조체,비동기 객체 구조체,시퀀스 객체 구조체,Type Object Structures
@anchor{c-api/typeobj buffer-object-structures}@anchor{56b6}@anchor{c-api/typeobj buffer-structs}@anchor{52f6}
@subsubsection 버퍼 객체 구조체


@geindex PyBufferProcs (C type)
@anchor{c-api/typeobj c PyBufferProcs}@anchor{5330}
@deffn {C 자료형} type PyBufferProcs

이 구조체는 @ref{260,,버퍼 프로토콜}에 필요한 함수에 대한 포인터를 담습니다. 프로토콜은 제공자(exporter) 객체가 내부 데이터를 소비자 객체에 노출하는 방법을 정의합니다.
@end deffn

@geindex PyBufferProcs.bf_getbuffer (C member)
@anchor{c-api/typeobj c PyBufferProcs bf_getbuffer}@anchor{965}
@deffn {C 멤버 변수} @ref{51e5,,getbufferproc} @ref{5330,,PyBufferProcs}.bf_getbuffer

` The corresponding @ref{511b,,slot ID} @code{Py_bf_getbuffer} is part of the @ref{774,,안정 ABI} 버전 3.11 이후로.'
@geindex Py_bf_getbuffer (C macro)
@anchor{c-api/typeobj c Py_bf_getbuffer}@anchor{518e}

이 함수의 서명은 다음과 같습니다:

@example
int (PyObject *exporter, Py_buffer *view, int flags);
@end example

`view'를 채우기 위해 `exporter'에 대한 `flags'에 지정된 요청을 처리합니다. 포인트 (3) 을 제외하고, 이 함수의 구현은 다음 단계를 반드시 수행해야 합니다:


@enumerate 

@item 
Check if the request can be met. If not, raise @ref{179f,,BufferError},
set view->obj to @code{NULL} and return @code{-1}.

@item 
요청된 필드를 채웁니다.

@item 
내보내기 횟수에 대한 내부 카운터를 증가시킵니다.

@item 
Set view->obj to `exporter' and increment view->obj.

@item 
@code{0}을 반환합니다.
@end enumerate

`Thread safety:'

In the @ref{1767,,free-threaded build}, implementations must ensure:


@itemize *

@item 
The export counter increment in step (3) is atomic.

@item 
The underlying buffer data remains valid and at a stable memory
location for the lifetime of all exports.

@item 
For objects that support resizing or reallocation (such as
@ref{344,,bytearray}), the export counter is checked atomically before
such operations, and @ref{179f,,BufferError} is raised if exports exist.

@item 
The function is safe to call concurrently from multiple threads.
@end itemize

See also @ref{2411,,Thread safety for memoryview objects} for the Python-level
thread safety guarantees of @ref{165,,memoryview} objects.

`exporter'가 버퍼 공급자의 체인이나 트리의 일부이면, 두 가지 주요 체계를 사용할 수 있습니다:


@itemize *

@item 
Re-export: Each member of the tree acts as the exporting object and
sets view->obj to a new reference to itself.

@item 
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.
@end itemize

`view'의 개별 필드는 섹션 @ref{52f7,,버퍼 구조체}에 설명되어 있으며, 제공자가 특정 요청에 응답해야 하는 규칙은 섹션 @ref{4a9c,,버퍼 요청 유형}에 있습니다.

@ref{95b,,Py_buffer} 구조체에서 가리키는 모든 메모리는 제공자에게 속하며 남은 소비자가 없어질 때까지 유효해야 합니다. @ref{5300,,format}, @ref{5301,,shape}, @ref{52fb,,strides}, @ref{5303,,suboffsets} 및 @ref{5305,,internal}은 소비자에게는 읽기 전용입니다.

@ref{963,,PyBuffer_FillInfo()}는 모든 요청 유형을 올바르게 처리하면서 간단한 바이트열 버퍼를 쉽게 노출 할 수 있는 방법을 제공합니다.

@ref{638,,PyObject_GetBuffer()}는 이 함수를 감싸는 소비자 용 인터페이스입니다.
@end deffn

@geindex PyBufferProcs.bf_releasebuffer (C member)
@anchor{c-api/typeobj c PyBufferProcs bf_releasebuffer}@anchor{966}
@deffn {C 멤버 변수} @ref{51f0,,releasebufferproc} @ref{5330,,PyBufferProcs}.bf_releasebuffer

` The corresponding @ref{511b,,slot ID} @code{Py_bf_releasebuffer} is part of the @ref{774,,안정 ABI} 버전 3.11 이후로.'
@geindex Py_bf_releasebuffer (C macro)
@anchor{c-api/typeobj c Py_bf_releasebuffer}@anchor{518f}

이 함수의 서명은 다음과 같습니다:

@example
void (PyObject *exporter, Py_buffer *view);
@end example

버퍼 자원 해제 요청을 처리합니다. 자원을 해제할 필요가 없으면, @ref{966,,PyBufferProcs.bf_releasebuffer}는 @code{NULL}일 수 있습니다. 그렇지 않으면, 이 함수의 표준 구현은 다음과 같은 선택적 단계를 수행합니다:


@enumerate 

@item 
내보내기 횟수에 대한 내부 카운터를 줄입니다.

@item 
카운터가 @code{0}이면, `view'와 관련된 모든 메모리를 해제합니다.
@end enumerate

`Thread safety:'

In the @ref{1767,,free-threaded build}:


@itemize *

@item 
The export counter decrement in step (1) must be atomic.

@item 
Resource cleanup when the counter reaches zero must be done atomically,
as the final release may race with concurrent releases from other
threads and dellocation must only happen once.
@end itemize

제공자는 반드시 @ref{5305,,internal} 필드를 사용하여 버퍼 특정 자원을 추적해야 합니다. 이 필드는 변경되지 않고 유지됨이 보장되지만, 소비자는 원래 버퍼의 사본을 `view' 인자로 전달할 수 있습니다.

This function MUST NOT decrement view->obj, since that is
done automatically in @ref{639,,PyBuffer_Release()} (this scheme is
useful for breaking reference cycles).

@ref{639,,PyBuffer_Release()}는 이 기능을 감싸는 소비자 용 인터페이스입니다.
@end deffn

@node 비동기 객체 구조체,슬롯 형 typedef,버퍼 객체 구조체,Type Object Structures
@anchor{c-api/typeobj async-object-structures}@anchor{56b7}@anchor{c-api/typeobj async-structs}@anchor{569e}
@subsubsection 비동기 객체 구조체



Added in version 3.5.


@geindex PyAsyncMethods (C type)
@anchor{c-api/typeobj c PyAsyncMethods}@anchor{5329}
@deffn {C 자료형} type PyAsyncMethods

이 구조체는 @ref{4c9,,어웨이터블}와 @ref{4c8,,비동기 이터레이터} 객체를 구현하는 데 필요한 함수에 대한 포인터를 담습니다.

구조체 정의는 다음과 같습니다:

@example
typedef struct @{
    unaryfunc am_await;
    unaryfunc am_aiter;
    unaryfunc am_anext;
    sendfunc am_send;
@} PyAsyncMethods;
@end example
@end deffn

@geindex PyAsyncMethods.am_await (C member)
@anchor{c-api/typeobj c PyAsyncMethods am_await}@anchor{5669}
@deffn {C 멤버 변수} @ref{51fa,,unaryfunc} @ref{5329,,PyAsyncMethods}.am_await

` The corresponding @ref{511b,,slot ID} @code{Py_am_await} is part of the @ref{774,,안정 ABI} 버전 3.5 이후로.'
@geindex Py_am_await (C macro)
@anchor{c-api/typeobj c Py_am_await}@anchor{518c}

이 함수의 서명은 다음과 같습니다:

@example
PyObject *am_await(PyObject *self);
@end example

The returned object must be an @ref{4ca,,iterator}, i.e. @ref{1caf,,PyIter_Check()}
must return @code{1} for it.

객체가 @ref{4c9,,어웨이터블}이 아니면 이 슬롯을 @code{NULL}로 설정할 수 있습니다.
@end deffn

@geindex PyAsyncMethods.am_aiter (C member)
@anchor{c-api/typeobj c PyAsyncMethods am_aiter}@anchor{566a}
@deffn {C 멤버 변수} @ref{51fa,,unaryfunc} @ref{5329,,PyAsyncMethods}.am_aiter

` The corresponding @ref{511b,,slot ID} @code{Py_am_aiter} is part of the @ref{774,,안정 ABI} 버전 3.5 이후로.'
@geindex Py_am_aiter (C macro)
@anchor{c-api/typeobj c Py_am_aiter}@anchor{518a}

이 함수의 서명은 다음과 같습니다:

@example
PyObject *am_aiter(PyObject *self);
@end example

Must return an @ref{4c8,,asynchronous iterator} object.
See @ref{1885,,__anext__()} for details.

객체가 비동기 이터레이션 프로토콜을 구현하지 않으면 이 슬롯은 @code{NULL}로 설정될 수 있습니다.
@end deffn

@geindex PyAsyncMethods.am_anext (C member)
@anchor{c-api/typeobj c PyAsyncMethods am_anext}@anchor{566b}
@deffn {C 멤버 변수} @ref{51fa,,unaryfunc} @ref{5329,,PyAsyncMethods}.am_anext

` The corresponding @ref{511b,,slot ID} @code{Py_am_anext} is part of the @ref{774,,안정 ABI} 버전 3.5 이후로.'
@geindex Py_am_anext (C macro)
@anchor{c-api/typeobj c Py_am_anext}@anchor{518b}

이 함수의 서명은 다음과 같습니다:

@example
PyObject *am_anext(PyObject *self);
@end example

Must return an @ref{4c9,,awaitable} object.
See @ref{1885,,__anext__()} for details.
This slot may be set to @code{NULL}.
@end deffn

@geindex PyAsyncMethods.am_send (C member)
@anchor{c-api/typeobj c PyAsyncMethods am_send}@anchor{566c}
@deffn {C 멤버 변수} @ref{566d,,sendfunc} @ref{5329,,PyAsyncMethods}.am_send

` The corresponding @ref{511b,,slot ID} @code{Py_am_send} is part of the @ref{774,,안정 ABI} 버전 3.10 이후로.'
@geindex Py_am_send (C macro)
@anchor{c-api/typeobj c Py_am_send}@anchor{518d}

이 함수의 서명은 다음과 같습니다:

@example
PySendResult am_send(PyObject *self, PyObject *arg, PyObject **result);
@end example

See @ref{a98,,PyIter_Send()} for details.
This slot may be set to @code{NULL}.


Added in version 3.10.

@end deffn

@node 슬롯 형 typedef,예<19>,비동기 객체 구조체,Type Object Structures
@anchor{c-api/typeobj id6}@anchor{5699}@anchor{c-api/typeobj slot-type-typedefs}@anchor{56b8}
@subsubsection 슬롯 형 typedef


@geindex allocfunc (C type)
@anchor{c-api/typeobj c allocfunc}@anchor{51de}
@deffn {C 자료형} typedef @ref{5dc,,PyObject} *(*allocfunc)(@ref{c9b,,PyTypeObject} *cls, @ref{c54,,Py_ssize_t} nitems)
` Part of the @ref{774,,안정 ABI}.'
The purpose of this function is to separate memory allocation from memory
initialization.  It should return a pointer to a block of memory of adequate
length for the instance, suitably aligned, and initialized to zeros, but with
@ref{a9f,,ob_refcnt} set to @code{1} and @ref{4f0c,,ob_type} set to the type argument.  If
the type’s @ref{23bb,,tp_itemsize} is non-zero, the object’s @ref{515b,,ob_size} field
should be initialized to `nitems' and the length of the allocated memory block
should be @code{tp_basicsize + nitems*tp_itemsize}, rounded up to a multiple of
@code{sizeof(void*)}; otherwise, `nitems' is not used and the length of the block
should be @ref{b7d,,tp_basicsize}.

이 함수는 다른 인스턴스 초기화를 수행하지 않아야 합니다, 추가 메모리를 할당도 안 됩니다; 그것은 @ref{79e,,tp_new}에 의해 수행되어야 합니다.
@end deffn

@geindex destructor (C type)
@anchor{c-api/typeobj c destructor}@anchor{51e2}
@deffn {C 자료형} typedef void (*destructor)(@ref{5dc,,PyObject}*)
` Part of the @ref{774,,안정 ABI}.'
@end deffn

@geindex freefunc (C type)
@anchor{c-api/typeobj c freefunc}@anchor{5485}
@deffn {C 자료형} typedef void (*freefunc)(void*)

@ref{4f0e,,tp_free}를 참조하십시오.
@end deffn

@geindex newfunc (C type)
@anchor{c-api/typeobj c newfunc}@anchor{51ed}
@deffn {C 자료형} typedef @ref{5dc,,PyObject} *(*newfunc)(@ref{c9b,,PyTypeObject}*, @ref{5dc,,PyObject}*, @ref{5dc,,PyObject}*)
` Part of the @ref{774,,안정 ABI}.'
@ref{79e,,tp_new}를 참조하십시오.
@end deffn

@geindex initproc (C type)
@anchor{c-api/typeobj c initproc}@anchor{51e9}
@deffn {C 자료형} typedef int (*initproc)(@ref{5dc,,PyObject}*, @ref{5dc,,PyObject}*, @ref{5dc,,PyObject}*)
` Part of the @ref{774,,안정 ABI}.'
@ref{7a0,,tp_init}를 참조하십시오.
@end deffn

@geindex reprfunc (C type)
@anchor{c-api/typeobj c reprfunc}@anchor{51f1}
@deffn {C 자료형} typedef @ref{5dc,,PyObject} *(*reprfunc)(@ref{5dc,,PyObject}*)
` Part of the @ref{774,,안정 ABI}.'
@ref{4f23,,tp_repr}을 참조하십시오.
@end deffn

@geindex getattrfunc (C type)
@anchor{c-api/typeobj c getattrfunc}@anchor{51e3}
@deffn {C 자료형} typedef @ref{5dc,,PyObject} *(*getattrfunc)(@ref{5dc,,PyObject} *self, char *attr)
` Part of the @ref{774,,안정 ABI}.'
객체의 명명된 어트리뷰트 값을 반환합니다.
@end deffn

@geindex setattrfunc (C type)
@anchor{c-api/typeobj c setattrfunc}@anchor{51f3}
@deffn {C 자료형} typedef int (*setattrfunc)(@ref{5dc,,PyObject} *self, char *attr, @ref{5dc,,PyObject} *value)
` Part of the @ref{774,,안정 ABI}.'
객체의 명명된 어트리뷰트 값을 설정합니다. 어트리뷰트를 삭제하려면 value 인자가 @code{NULL}로 설정됩니다.
@end deffn

@geindex getattrofunc (C type)
@anchor{c-api/typeobj c getattrofunc}@anchor{51e4}
@deffn {C 자료형} typedef @ref{5dc,,PyObject} *(*getattrofunc)(@ref{5dc,,PyObject} *self, @ref{5dc,,PyObject} *attr)
` Part of the @ref{774,,안정 ABI}.'
객체의 명명된 어트리뷰트 값을 반환합니다.

@ref{1a64,,tp_getattro}를 참조하십시오.
@end deffn

@geindex setattrofunc (C type)
@anchor{c-api/typeobj c setattrofunc}@anchor{51f4}
@deffn {C 자료형} typedef int (*setattrofunc)(@ref{5dc,,PyObject} *self, @ref{5dc,,PyObject} *attr, @ref{5dc,,PyObject} *value)
` Part of the @ref{774,,안정 ABI}.'
객체의 명명된 어트리뷰트 값을 설정합니다. 어트리뷰트를 삭제하려면 value 인자가 @code{NULL}로 설정됩니다.

@ref{4f27,,tp_setattro}를 참조하십시오.
@end deffn

@geindex descrgetfunc (C type)
@anchor{c-api/typeobj c descrgetfunc}@anchor{51e0}
@deffn {C 자료형} typedef @ref{5dc,,PyObject} *(*descrgetfunc)(@ref{5dc,,PyObject}*, @ref{5dc,,PyObject}*, @ref{5dc,,PyObject}*)
` Part of the @ref{774,,안정 ABI}.'
See @ref{5662,,tp_descr_get}.
@end deffn

@geindex descrsetfunc (C type)
@anchor{c-api/typeobj c descrsetfunc}@anchor{51e1}
@deffn {C 자료형} typedef int (*descrsetfunc)(@ref{5dc,,PyObject}*, @ref{5dc,,PyObject}*, @ref{5dc,,PyObject}*)
` Part of the @ref{774,,안정 ABI}.'
See @ref{1cb1,,tp_descr_set}.
@end deffn

@geindex hashfunc (C type)
@anchor{c-api/typeobj c hashfunc}@anchor{51e8}
@deffn {C 자료형} typedef @ref{1468,,Py_hash_t} (*hashfunc)(@ref{5dc,,PyObject}*)
` Part of the @ref{774,,안정 ABI}.'
@ref{4f35,,tp_hash}를 참조하십시오.
@end deffn

@geindex richcmpfunc (C type)
@anchor{c-api/typeobj c richcmpfunc}@anchor{51f2}
@deffn {C 자료형} typedef @ref{5dc,,PyObject} *(*richcmpfunc)(@ref{5dc,,PyObject}*, @ref{5dc,,PyObject}*, int)
` Part of the @ref{774,,안정 ABI}.'
@ref{4f2f,,tp_richcompare}를 참조하십시오.
@end deffn

@geindex getiterfunc (C type)
@anchor{c-api/typeobj c getiterfunc}@anchor{51e6}
@deffn {C 자료형} typedef @ref{5dc,,PyObject} *(*getiterfunc)(@ref{5dc,,PyObject}*)
` Part of the @ref{774,,안정 ABI}.'
@ref{16f4,,tp_iter}를 참조하십시오.
@end deffn

@geindex iternextfunc (C type)
@anchor{c-api/typeobj c iternextfunc}@anchor{51eb}
@deffn {C 자료형} typedef @ref{5dc,,PyObject} *(*iternextfunc)(@ref{5dc,,PyObject}*)
` Part of the @ref{774,,안정 ABI}.'
@ref{16f5,,tp_iternext}를 참조하십시오.
@end deffn

@geindex lenfunc (C type)
@anchor{c-api/typeobj c lenfunc}@anchor{51ec}
@deffn {C 자료형} typedef @ref{c54,,Py_ssize_t} (*lenfunc)(@ref{5dc,,PyObject}*)
` Part of the @ref{774,,안정 ABI}.'
@end deffn

@geindex getbufferproc (C type)
@anchor{c-api/typeobj c getbufferproc}@anchor{51e5}
@deffn {C 자료형} typedef int (*getbufferproc)(@ref{5dc,,PyObject}*, @ref{95b,,Py_buffer}*, int)
` Part of the @ref{774,,안정 ABI} 버전 3.12 이후로.'
@end deffn

@geindex releasebufferproc (C type)
@anchor{c-api/typeobj c releasebufferproc}@anchor{51f0}
@deffn {C 자료형} typedef void (*releasebufferproc)(@ref{5dc,,PyObject}*, @ref{95b,,Py_buffer}*)
` Part of the @ref{774,,안정 ABI} 버전 3.12 이후로.'
@end deffn

@geindex unaryfunc (C type)
@anchor{c-api/typeobj c unaryfunc}@anchor{51fa}
@deffn {C 자료형} typedef @ref{5dc,,PyObject} *(*unaryfunc)(@ref{5dc,,PyObject}*)
` Part of the @ref{774,,안정 ABI}.'
@end deffn

@geindex binaryfunc (C type)
@anchor{c-api/typeobj c binaryfunc}@anchor{51df}
@deffn {C 자료형} typedef @ref{5dc,,PyObject} *(*binaryfunc)(@ref{5dc,,PyObject}*, @ref{5dc,,PyObject}*)
` Part of the @ref{774,,안정 ABI}.'
@end deffn

@geindex sendfunc (C type)
@anchor{c-api/typeobj c sendfunc}@anchor{566d}
@deffn {C 자료형} typedef @ref{52f2,,PySendResult} (*sendfunc)(@ref{5dc,,PyObject}*, @ref{5dc,,PyObject}*, @ref{5dc,,PyObject}**)

See @ref{566c,,am_send}.
@end deffn

@geindex ternaryfunc (C type)
@anchor{c-api/typeobj c ternaryfunc}@anchor{51f8}
@deffn {C 자료형} typedef @ref{5dc,,PyObject} *(*ternaryfunc)(@ref{5dc,,PyObject}*, @ref{5dc,,PyObject}*, @ref{5dc,,PyObject}*)
` Part of the @ref{774,,안정 ABI}.'
@end deffn

@geindex ssizeargfunc (C type)
@anchor{c-api/typeobj c ssizeargfunc}@anchor{51f6}
@deffn {C 자료형} typedef @ref{5dc,,PyObject} *(*ssizeargfunc)(@ref{5dc,,PyObject}*, @ref{c54,,Py_ssize_t})
` Part of the @ref{774,,안정 ABI}.'
@end deffn

@geindex ssizeobjargproc (C type)
@anchor{c-api/typeobj c ssizeobjargproc}@anchor{51f7}
@deffn {C 자료형} typedef int (*ssizeobjargproc)(@ref{5dc,,PyObject}*, @ref{c54,,Py_ssize_t}, @ref{5dc,,PyObject}*)
` Part of the @ref{774,,안정 ABI}.'
@end deffn

@geindex objobjproc (C type)
@anchor{c-api/typeobj c objobjproc}@anchor{51ef}
@deffn {C 자료형} typedef int (*objobjproc)(@ref{5dc,,PyObject}*, @ref{5dc,,PyObject}*)
` Part of the @ref{774,,안정 ABI}.'
@end deffn

@geindex objobjargproc (C type)
@anchor{c-api/typeobj c objobjargproc}@anchor{51ee}
@deffn {C 자료형} typedef int (*objobjargproc)(@ref{5dc,,PyObject}*, @ref{5dc,,PyObject}*, @ref{5dc,,PyObject}*)
` Part of the @ref{774,,안정 ABI}.'
@end deffn

@node 예<19>,,슬롯 형 typedef,Type Object Structures
@anchor{c-api/typeobj examples}@anchor{56b9}@anchor{c-api/typeobj typedef-examples}@anchor{565a}
@subsubsection 예


다음은 파이썬 형 정의의 간단한 예입니다. 여기에는 여러분이 만날 수 있는 일반적인 사용법이 포함됩니다. 일부는 까다로운 코너 사례를 보여줍니다. 더 많은 예제, 실용 정보 및 자습서는 @ref{4f04,,확장형 정의하기; 자습서}와 @ref{4f1d,,확장형 정의하기; 여러 가지 주제}를 참조하십시오.

A basic @ref{982,,static type}:

@example
typedef struct @{
    PyObject_HEAD
    const char *data;
@} MyObject;

static PyTypeObject MyObject_Type = @{
    PyVarObject_HEAD_INIT(NULL, 0)
    .tp_name = "mymod.MyObject",
    .tp_basicsize = sizeof(MyObject),
    .tp_doc = PyDoc_STR("My objects"),
    .tp_new = myobj_new,
    .tp_dealloc = (destructor)myobj_dealloc,
    .tp_repr = (reprfunc)myobj_repr,
@};
@end example

더 상세한 초기화자를 사용하는 이전 코드(특히 CPython 코드 베이스에서)를 찾을 수도 있습니다:

@example
static PyTypeObject MyObject_Type = @{
    PyVarObject_HEAD_INIT(NULL, 0)
    "mymod.MyObject",               /* tp_name */
    sizeof(MyObject),               /* tp_basicsize */
    0,                              /* tp_itemsize */
    (destructor)myobj_dealloc,      /* tp_dealloc */
    0,                              /* tp_vectorcall_offset */
    0,                              /* tp_getattr */
    0,                              /* tp_setattr */
    0,                              /* tp_as_async */
    (reprfunc)myobj_repr,           /* tp_repr */
    0,                              /* tp_as_number */
    0,                              /* tp_as_sequence */
    0,                              /* tp_as_mapping */
    0,                              /* tp_hash */
    0,                              /* tp_call */
    0,                              /* tp_str */
    0,                              /* tp_getattro */
    0,                              /* tp_setattro */
    0,                              /* tp_as_buffer */
    0,                              /* tp_flags */
    PyDoc_STR("My objects"),        /* tp_doc */
    0,                              /* tp_traverse */
    0,                              /* tp_clear */
    0,                              /* tp_richcompare */
    0,                              /* tp_weaklistoffset */
    0,                              /* tp_iter */
    0,                              /* tp_iternext */
    0,                              /* tp_methods */
    0,                              /* tp_members */
    0,                              /* tp_getset */
    0,                              /* tp_base */
    0,                              /* tp_dict */
    0,                              /* tp_descr_get */
    0,                              /* tp_descr_set */
    0,                              /* tp_dictoffset */
    0,                              /* tp_init */
    0,                              /* tp_alloc */
    myobj_new,                      /* tp_new */
@};
@end example

약한 참조, 인스턴스 딕셔너리 및 해싱을 지원하는 형:

@example
typedef struct @{
    PyObject_HEAD
    const char *data;
@} MyObject;

static PyTypeObject MyObject_Type = @{
    PyVarObject_HEAD_INIT(NULL, 0)
    .tp_name = "mymod.MyObject",
    .tp_basicsize = sizeof(MyObject),
    .tp_doc = PyDoc_STR("My objects"),
    .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE |
         Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_MANAGED_DICT |
         Py_TPFLAGS_MANAGED_WEAKREF,
    .tp_new = myobj_new,
    .tp_traverse = (traverseproc)myobj_traverse,
    .tp_clear = (inquiry)myobj_clear,
    .tp_alloc = PyType_GenericNew,
    .tp_dealloc = (destructor)myobj_dealloc,
    .tp_repr = (reprfunc)myobj_repr,
    .tp_hash = (hashfunc)myobj_hash,
    .tp_richcompare = PyBaseObject_Type.tp_richcompare,
@};
@end example

A str subclass that cannot be subclassed and cannot be called
to create instances (e.g. uses a separate factory func) using
@ref{7a1,,Py_TPFLAGS_DISALLOW_INSTANTIATION} flag:

@example
typedef struct @{
    PyUnicodeObject raw;
    char *extra;
@} MyStr;

static PyTypeObject MyStr_Type = @{
    PyVarObject_HEAD_INIT(NULL, 0)
    .tp_name = "mymod.MyStr",
    .tp_basicsize = sizeof(MyStr),
    .tp_base = NULL,  // set to &PyUnicode_Type in module init
    .tp_doc = PyDoc_STR("my custom str"),
    .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION,
    .tp_repr = (reprfunc)myobj_repr,
@};
@end example

The simplest @ref{982,,static type} with fixed-length instances:

@example
typedef struct @{
    PyObject_HEAD
@} MyObject;

static PyTypeObject MyObject_Type = @{
    PyVarObject_HEAD_INIT(NULL, 0)
    .tp_name = "mymod.MyObject",
@};
@end example

The simplest @ref{982,,static type} with variable-length instances:

@example
typedef struct @{
    PyObject_VAR_HEAD
    const char *data[1];
@} MyObject;

static PyTypeObject MyObject_Type = @{
    PyVarObject_HEAD_INIT(NULL, 0)
    .tp_name = "mymod.MyObject",
    .tp_basicsize = sizeof(MyObject) - sizeof(char *),
    .tp_itemsize = sizeof(char *),
@};
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 순환 가비지 수집 지원,,Type Object Structures,객체 구현 지원
@anchor{c-api/gcsupport doc}@anchor{56ba}@anchor{c-api/gcsupport supporting-cycle-detection}@anchor{56a2}@anchor{c-api/gcsupport supporting-cyclic-garbage-collection}@anchor{56bb}@anchor{c-api/gcsupport translation-repo}@anchor{56bc}
@subsection 순환 가비지 수집 지원


순환 참조를 포함하는 가비지를 탐지하고 수집하는 파이썬의 지원은 역시 컨테이너일 수 있는 다른 객체의 “컨테이너” 인 객체 형의 지원이 필요합니다. 다른 객체에 대한 참조를 저장하지 않거나, 원자 형(가령 숫자나 문자열)에 대한 참조만 저장하는 형은 가비지 수집에 대한 어떤 명시적인 지원을 제공할 필요가 없습니다.

컨테이너형을 만들려면, 형 객체의 @ref{1c6f,,tp_flags} 필드가 @ref{980,,Py_TPFLAGS_HAVE_GC}를 포함해야 하고 @ref{981,,tp_traverse} 처리기 구현을 제공해야 합니다. 형의 인스턴스가 가변이면, @ref{4f21,,tp_clear} 구현도 제공해야 합니다.


@table @asis

@item @ref{980,,Py_TPFLAGS_HAVE_GC}

이 플래그가 설정된 형의 객체는 여기에 설명된 규칙을 준수해야 합니다. 편의를 위해 이러한 객체를 컨테이너 객체라고 하겠습니다.
@end table

컨테이너형의 생성자는 두 가지 규칙을 준수해야 합니다:


@enumerate 

@item 
객체의 메모리는 @ref{c98,,PyObject_GC_New} 나 @ref{c99,,PyObject_GC_NewVar}를 사용하여 할당해야 합니다.

@item 
다른 컨테이너에 대한 참조를 포함할 수 있는 모든 필드가 초기화되면, @ref{1709,,PyObject_GC_Track()}를 호출해야 합니다.
@end enumerate

마찬가지로, 객체의 할당해제자(deallocator)는 비슷한 규칙 쌍을 준수해야 합니다:


@enumerate 

@item 
다른 컨테이너를 참조하는 필드가 무효화 되기 전에, @ref{170a,,PyObject_GC_UnTrack()}를 호출해야 합니다.

@item 
객체의 메모리는 @ref{1708,,PyObject_GC_Del()}를 사용하여 할당 해제되어야 합니다.

@cartouche
@quotation 경고 
If a type adds the Py_TPFLAGS_HAVE_GC, then it `must' implement at least
a @ref{981,,tp_traverse} handler or explicitly use one
from its subclass or subclasses.

When calling @ref{97f,,PyType_Ready()} or some of the APIs that indirectly
call it like @ref{79d,,PyType_FromSpecWithBases()} or
@ref{79c,,PyType_FromSpec()} the interpreter will automatically populate the
@ref{1c6f,,tp_flags}, @ref{981,,tp_traverse}
and @ref{4f21,,tp_clear} fields if the type inherits from a
class that implements the garbage collector protocol and the child class
does `not' include the @ref{980,,Py_TPFLAGS_HAVE_GC} flag.
@end quotation
@end cartouche
@end enumerate

@geindex PyObject_GC_New (C macro)
@anchor{c-api/gcsupport c PyObject_GC_New}@anchor{c98}
@deffn {C 매크로} PyObject_GC_New (TYPE, typeobj)

@ref{b7b,,PyObject_New}와 유사하지만, @ref{980,,Py_TPFLAGS_HAVE_GC} 플래그가 설정된 컨테이너 객체를 위한 것.

Do not call this directly to allocate memory for an object; call the type’s
@ref{4f0f,,tp_alloc} slot instead.

When populating a type’s @ref{4f0f,,tp_alloc} slot,
@ref{c5f,,PyType_GenericAlloc()} is preferred over a custom function that
simply calls this macro.

Memory allocated by this macro must be freed with
@ref{1708,,PyObject_GC_Del()} (usually called via the object’s
@ref{4f0e,,tp_free} slot).


@subsubheading 더 보기



@itemize *

@item 
@ref{1708,,PyObject_GC_Del()}

@item 
@ref{b7b,,PyObject_New}

@item 
@ref{c5f,,PyType_GenericAlloc()}

@item 
@ref{4f0f,,tp_alloc}
@end itemize

@end deffn

@geindex PyObject_GC_NewVar (C macro)
@anchor{c-api/gcsupport c PyObject_GC_NewVar}@anchor{c99}
@deffn {C 매크로} PyObject_GC_NewVar (TYPE, typeobj, size)

@ref{b7c,,PyObject_NewVar}와 유사하지만, @ref{980,,Py_TPFLAGS_HAVE_GC} 플래그가 설정된 컨테이너 객체를 위한 것.

Do not call this directly to allocate memory for an object; call the type’s
@ref{4f0f,,tp_alloc} slot instead.

When populating a type’s @ref{4f0f,,tp_alloc} slot,
@ref{c5f,,PyType_GenericAlloc()} is preferred over a custom function that
simply calls this macro.

Memory allocated by this macro must be freed with
@ref{1708,,PyObject_GC_Del()} (usually called via the object’s
@ref{4f0e,,tp_free} slot).


@subsubheading 더 보기



@itemize *

@item 
@ref{1708,,PyObject_GC_Del()}

@item 
@ref{b7c,,PyObject_NewVar}

@item 
@ref{c5f,,PyType_GenericAlloc()}

@item 
@ref{4f0f,,tp_alloc}
@end itemize

@end deffn

@geindex PyUnstable_Object_GC_NewWithExtraData (C function)
@anchor{c-api/gcsupport c PyUnstable_Object_GC_NewWithExtraData}@anchor{1aa7}
@deffn {C 함수} @ref{5dc,,PyObject} *PyUnstable_Object_GC_NewWithExtraData (PyTypeObject *type, size_t extra_size)

@cartouche
@quotation 이것은 불안정 API. It may change without warning in minor releases. `이것은 @ref{768,,불안정 API}. It may change without warning in minor releases.'
@end quotation
@end cartouche

Analogous to @ref{c98,,PyObject_GC_New} but allocates `extra_size'
bytes at the end of the object (at offset
@ref{b7d,,tp_basicsize}).
The allocated memory is initialized to zeros,
except for the @ref{5dc,,Python object header}.

The extra data will be deallocated with the object, but otherwise it is
not managed by Python.

Memory allocated by this function must be freed with
@ref{1708,,PyObject_GC_Del()} (usually called via the object’s
@ref{4f0e,,tp_free} slot).

@cartouche
@quotation 경고 
The function is marked as unstable because the final mechanism
for reserving extra data after an instance is not yet decided.
For allocating a variable number of fields, prefer using
@ref{4715,,PyVarObject} and @ref{23bb,,tp_itemsize}
instead.
@end quotation
@end cartouche


Added in version 3.12.

@end deffn

@geindex PyObject_GC_Resize (C macro)
@anchor{c-api/gcsupport c PyObject_GC_Resize}@anchor{1aac}
@deffn {C 매크로} PyObject_GC_Resize (TYPE, op, newsize)

@ref{b7c,,PyObject_NewVar}에 의해 할당된 객체의 크기를 변경합니다. 형 @code{TYPE*} (모든 C 형을 나타냅니다) 의 크기가 조정된 객체나 실패하면 @code{NULL}을 반환합니다.

`op'는 형 @ref{4715,,PyVarObject}*이어야 하고 아직 수거기가 추적하지 않아야 합니다. `newsize'는 형 @ref{c54,,Py_ssize_t}이어야 합니다.
@end deffn

@geindex PyObject_GC_Track (C function)
@anchor{c-api/gcsupport c PyObject_GC_Track}@anchor{1709}
@deffn {C 함수} void PyObject_GC_Track (PyObject *op)
` Part of the @ref{774,,안정 ABI}.'
수거기가 추적하는 컨테이너 객체 집합에 객체 `op'를 추가합니다. 수거기는 예기치 않은 시간에 실행될 수 있으므로 추적되는 동안 객체가 유효해야 합니다. @ref{981,,tp_traverse} 처리기가 탐색하는 모든 필드가 유효해지면 호출해야 합니다, 보통 생성자의 끝부분 근처입니다.
@end deffn

@geindex PyObject_IS_GC (C function)
@anchor{c-api/gcsupport c PyObject_IS_GC}@anchor{b7a}
@deffn {C 함수} int PyObject_IS_GC (PyObject *obj)

객체가 가비지 수거기 프로토콜을 구현하면 0이 아닌 값을 반환하고, 그렇지 않으면 0을 반환합니다.

이 함수가 0을 반환하면 가비지 수거기가 객체를 추적할 수 없습니다.
@end deffn

@geindex PyObject_GC_IsTracked (C function)
@anchor{c-api/gcsupport c PyObject_GC_IsTracked}@anchor{b6d}
@deffn {C 함수} int PyObject_GC_IsTracked (PyObject *op)
` Part of the @ref{774,,안정 ABI} 버전 3.9 이후로.'
`op'의 객체 형이 GC 프로토콜을 구현하고 `op'가 현재 가비지 수거기가 추적 중이면 1을 반환하고 그렇지 않으면 0을 반환합니다.

이것은 파이썬 함수 @ref{1512,,gc.is_tracked()}에 해당합니다.


Added in version 3.9.

@end deffn

@geindex PyObject_GC_IsFinalized (C function)
@anchor{c-api/gcsupport c PyObject_GC_IsFinalized}@anchor{b6e}
@deffn {C 함수} int PyObject_GC_IsFinalized (PyObject *op)
` Part of the @ref{774,,안정 ABI} 버전 3.9 이후로.'
`op'의 객체 형이 GC 프로토콜을 구현하고 가비지 수거기가 `op'를 이미 파이널라이즈 했으면 1을 반환하고 그렇지 않으면 0을 반환합니다.

이것은 파이썬 함수 @ref{af9,,gc.is_finalized()}에 해당합니다.


Added in version 3.9.

@end deffn

@geindex PyObject_GC_Del (C function)
@anchor{c-api/gcsupport c PyObject_GC_Del}@anchor{1708}
@deffn {C 함수} void PyObject_GC_Del (void *op)
` Part of the @ref{774,,안정 ABI}.'
@ref{c98,,PyObject_GC_New} 나 @ref{c99,,PyObject_GC_NewVar}를 사용하여 객체에 할당된 메모리를 해제합니다.

Do not call this directly to free an object’s memory; call the type’s
@ref{4f0e,,tp_free} slot instead.

Do not use this for memory allocated by @ref{b7b,,PyObject_New},
@ref{b7c,,PyObject_NewVar}, or related allocation functions; use
@ref{e5f,,PyObject_Free()} instead.


@subsubheading 더 보기



@itemize *

@item 
@ref{e5f,,PyObject_Free()} is the non-GC equivalent of this function.

@item 
@ref{c98,,PyObject_GC_New}

@item 
@ref{c99,,PyObject_GC_NewVar}

@item 
@ref{c5f,,PyType_GenericAlloc()}

@item 
@ref{4f0e,,tp_free}
@end itemize

@end deffn

@geindex PyObject_GC_UnTrack (C function)
@anchor{c-api/gcsupport c PyObject_GC_UnTrack}@anchor{170a}
@deffn {C 함수} void PyObject_GC_UnTrack (void *op)
` Part of the @ref{774,,안정 ABI}.'
수거기가 추적하는 컨테이너 객체 집합에서 `op' 객체를 제거합니다. @ref{1709,,PyObject_GC_Track()}를 이 객체에 대해 다시 호출하여 추적 객체 집합에 다시 추가할 수 있음에 유의하십시오. 할당해제자(@ref{4efb,,tp_dealloc} 처리기)는 @ref{981,,tp_traverse} 처리기에서 사용하는 필드가 무효화 되기 전에 객체에 대해 이 함수를 호출해야 합니다.
@end deffn


버전 3.8에서 변경: @code{_PyObject_GC_TRACK()}과 @code{_PyObject_GC_UNTRACK()} 매크로는 공용 C API에서 제거되었습니다.


@ref{981,,tp_traverse} 처리기는 다음과 같은 형의 함수 매개 변수를 받아들입니다:

@geindex visitproc (C type)
@anchor{c-api/gcsupport c visitproc}@anchor{51fb}
@deffn {C 자료형} typedef int (*visitproc)(@ref{5dc,,PyObject} *object, void *arg)
` Part of the @ref{774,,안정 ABI}.'
@ref{981,,tp_traverse} 처리기에 전달되는 방문자 함수의 형. 이 함수는 탐색하는 객체를 `object'로, @code{tp_traverse} 처리기의 세 번째 매개 변수를 `arg'로 호출되어야 합니다. 파이썬 코어는 순환 가비지 탐지를 구현하기 위해 여러 방문자 함수를 사용합니다; 사용자가 자신의 방문자 함수를 작성해야 할 필요는 없습니다.
@end deffn

@ref{981,,tp_traverse} 처리기는 다음 형이어야 합니다:

@geindex traverseproc (C type)
@anchor{c-api/gcsupport c traverseproc}@anchor{51f9}
@deffn {C 자료형} typedef int (*traverseproc)(@ref{5dc,,PyObject} *self, @ref{51fb,,visitproc} visit, void *arg)
` Part of the @ref{774,,안정 ABI}.'
컨테이너 객체의 탐색 함수입니다. 구현은 `self'에 직접 포함된 각 객체에 대해 `visit' 함수를 호출해야 하며, `visit'에 대한 매개 변수는 포함된 객체와 처리기로 전달된 `arg' 값입니다. `visit' 함수는 @code{NULL} object 인자로 호출하면 안 됩니다. `visit'가 0이 아닌 값을 반환하면 그 값이 즉시 반환되어야 합니다.

The traversal function must not have any side effects.  Implementations
may not modify the reference counts of any Python objects nor create or
destroy any Python objects.
@end deffn

@ref{981,,tp_traverse} 처리기 작성을 단순화하기 위해, @ref{4f18,,Py_VISIT()} 매크로가 제공됩니다. 이 매크로를 사용하려면, @code{tp_traverse} 구현은 인자의 이름을 정확히 `visit' 와 `arg'로 지정해야 합니다:

@geindex Py_VISIT (C macro)
@anchor{c-api/gcsupport c Py_VISIT}@anchor{4f18}
@deffn {C 매크로} Py_VISIT (o)

If the @ref{5dc,,PyObject}* `o' is not @code{NULL}, call the `visit' callback, with arguments `o'
and `arg'.  If `visit' returns a non-zero value, then return it.
Using this macro, @ref{981,,tp_traverse} handlers
look like:

@example
static int
my_traverse(Noddy *self, visitproc visit, void *arg)
@{
    Py_VISIT(self->foo);
    Py_VISIT(self->bar);
    return 0;
@}
@end example
@end deffn

@ref{4f21,,tp_clear} 처리기는 @ref{51ea,,inquiry} 형이거나 객체가 불변이면 @code{NULL}이어야 합니다.

@geindex inquiry (C type)
@anchor{c-api/gcsupport c inquiry}@anchor{51ea}
@deffn {C 자료형} typedef int (*inquiry)(@ref{5dc,,PyObject} *self)
` Part of the @ref{774,,안정 ABI}.'
참조 순환을 생성했을 수 있는 참조를 삭제합니다. 불변 객체는 참조 순환을 직접 생성할 수 없으므로, 이 메서드를 정의 할 필요가 없습니다. 이 메서드를 호출한 후에도 객체가 유효해야 합니다 (단지 참조에 대해 @ref{78f,,Py_DECREF()}를 호출하지 마십시오). 이 객체가 참조 순환에 참여하고 있음을 수거기가 감지하면 이 메서드를 호출합니다.
@end deffn

@menu
* 가비지 수거기 상태 제어하기:: 
* 가비지 수거기 상태 조회하기:: 

@end menu

@node 가비지 수거기 상태 제어하기,가비지 수거기 상태 조회하기,,순환 가비지 수집 지원
@anchor{c-api/gcsupport controlling-the-garbage-collector-state}@anchor{56bd}
@subsubsection 가비지 수거기 상태 제어하기


The C-API provides the following functions for controlling
garbage collection runs.

@geindex PyGC_Collect (C function)
@anchor{c-api/gcsupport c PyGC_Collect}@anchor{b84}
@deffn {C 함수} @ref{c54,,Py_ssize_t} PyGC_Collect (void)
` Part of the @ref{774,,안정 ABI}.'
Perform a full garbage collection, if the garbage collector is enabled.
(Note that @ref{1b3,,gc.collect()} runs it unconditionally.)

Returns the number of collected + unreachable objects which cannot
be collected.
If the garbage collector is disabled or already collecting,
returns @code{0} immediately.
Errors during garbage collection are passed to @ref{506,,sys.unraisablehook}.
This function does not raise exceptions.
@end deffn

@geindex PyGC_Enable (C function)
@anchor{c-api/gcsupport c PyGC_Enable}@anchor{aa4}
@deffn {C 함수} int PyGC_Enable (void)
` Part of the @ref{774,,안정 ABI} 버전 3.10 이후로.'
Enable the garbage collector: similar to @ref{4a4c,,gc.enable()}.
Returns the previous state, 0 for disabled and 1 for enabled.


Added in version 3.10.

@end deffn

@geindex PyGC_Disable (C function)
@anchor{c-api/gcsupport c PyGC_Disable}@anchor{aa5}
@deffn {C 함수} int PyGC_Disable (void)
` Part of the @ref{774,,안정 ABI} 버전 3.10 이후로.'
Disable the garbage collector: similar to @ref{4a4d,,gc.disable()}.
Returns the previous state, 0 for disabled and 1 for enabled.


Added in version 3.10.

@end deffn

@geindex PyGC_IsEnabled (C function)
@anchor{c-api/gcsupport c PyGC_IsEnabled}@anchor{aa6}
@deffn {C 함수} int PyGC_IsEnabled (void)
` Part of the @ref{774,,안정 ABI} 버전 3.10 이후로.'
Query the state of the garbage collector: similar to @ref{4a4e,,gc.isenabled()}.
Returns the current state, 0 for disabled and 1 for enabled.


Added in version 3.10.

@end deffn

@node 가비지 수거기 상태 조회하기,,가비지 수거기 상태 제어하기,순환 가비지 수집 지원
@anchor{c-api/gcsupport querying-garbage-collector-state}@anchor{56be}
@subsubsection 가비지 수거기 상태 조회하기


The C-API provides the following interface for querying information about
the garbage collector.

@geindex PyUnstable_GC_VisitObjects (C function)
@anchor{c-api/gcsupport c PyUnstable_GC_VisitObjects}@anchor{56bf}
@deffn {C 함수} void PyUnstable_GC_VisitObjects (gcvisitobjects_t callback, void *arg)

@cartouche
@quotation 이것은 불안정 API. It may change without warning in minor releases. `이것은 @ref{768,,불안정 API}. It may change without warning in minor releases.'
@end quotation
@end cartouche

Run supplied `callback' on all live GC-capable objects. `arg' is passed through to
all invocations of `callback'.

@cartouche
@quotation 경고 
If new objects are (de)allocated by the callback it is undefined if they
will be visited.

Garbage collection is disabled during operation. Explicitly running a collection
in the callback may lead to undefined behaviour e.g. visiting the same objects
multiple times or not at all.
@end quotation
@end cartouche


Added in version 3.12.

@end deffn

@geindex gcvisitobjects_t (C type)
@anchor{c-api/gcsupport c gcvisitobjects_t}@anchor{56c0}
@deffn {C 자료형} typedef int (*gcvisitobjects_t)(@ref{5dc,,PyObject} *object, void *arg)

Type of the visitor function to be passed to @ref{56bf,,PyUnstable_GC_VisitObjects()}.
`arg' is the same as the `arg' passed to @code{PyUnstable_GC_VisitObjects}.
Return @code{1} to continue iteration, return @code{0} to stop iteration. Other return
values are reserved for now so behavior on returning anything else is undefined.


Added in version 3.12.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node API와 ABI 버전 붙이기,Monitoring C API,객체 구현 지원,Python/C API reference manual
@anchor{c-api/apiabiversion doc}@anchor{56c1}@anchor{c-api/apiabiversion api-and-abi-versioning}@anchor{56c2}@anchor{c-api/apiabiversion apiabiversion}@anchor{4960}@anchor{c-api/apiabiversion translation-repo}@anchor{56c3}
@section API와 ABI 버전 붙이기


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

@end menu

@node Build-time version constants,Run-time version,,API와 ABI 버전 붙이기
@anchor{c-api/apiabiversion build-time-version-constants}@anchor{56c4}
@subsection Build-time version constants


CPython exposes its version number in the following macros.
Note that these correspond to the version code is `built' with.
See @ref{381,,Py_Version} for the version used at `run time'.

See @ref{774,,C API Stability} for a discussion of API and ABI stability across versions.

@geindex PY_MAJOR_VERSION (C macro)
@anchor{c-api/apiabiversion c PY_MAJOR_VERSION}@anchor{56c5}
@deffn {C 매크로} PY_MAJOR_VERSION

@code{3.4.1a2}의 @code{3}.
@end deffn

@geindex PY_MINOR_VERSION (C macro)
@anchor{c-api/apiabiversion c PY_MINOR_VERSION}@anchor{56c6}
@deffn {C 매크로} PY_MINOR_VERSION

@code{3.4.1a2}의 @code{4}.
@end deffn

@geindex PY_MICRO_VERSION (C macro)
@anchor{c-api/apiabiversion c PY_MICRO_VERSION}@anchor{56c7}
@deffn {C 매크로} PY_MICRO_VERSION

@code{3.4.1a2}의 @code{1}.
@end deffn

@geindex PY_RELEASE_LEVEL (C macro)
@anchor{c-api/apiabiversion c PY_RELEASE_LEVEL}@anchor{56c8}
@deffn {C 매크로} PY_RELEASE_LEVEL

@code{3.4.1a2}의 @code{a}. 알파는 @code{0xA}, 베타는 @code{0xB}, 배포 후보는 @code{0xC}, 최종은 @code{0xF} 가 될 수 있습니다.
@end deffn

@geindex PY_RELEASE_SERIAL (C macro)
@anchor{c-api/apiabiversion c PY_RELEASE_SERIAL}@anchor{56c9}
@deffn {C 매크로} PY_RELEASE_SERIAL

@code{3.4.1a2}의 @code{2}. 최종 배포는 0.
@end deffn

@geindex PY_VERSION_HEX (C macro)
@anchor{c-api/apiabiversion c PY_VERSION_HEX}@anchor{382}
@deffn {C 매크로} PY_VERSION_HEX

The Python version number encoded in a single integer.
See @ref{380,,Py_PACK_FULL_VERSION()} for the encoding details.

Use this for numeric comparisons, for example,
@code{#if PY_VERSION_HEX >= ...}.
@end deffn

These macros are defined in Include/patchlevel.h@footnote{https://github.com/python/cpython/tree/3.14/Include/patchlevel.h}.

@node Run-time version,Bit-packing macros,Build-time version constants,API와 ABI 버전 붙이기
@anchor{c-api/apiabiversion run-time-version}@anchor{56ca}
@subsection Run-time version


@geindex Py_Version (C var)
@anchor{c-api/apiabiversion c Py_Version}@anchor{381}
@deffn {C 변수} const unsigned long Py_Version
` Part of the @ref{774,,안정 ABI} 버전 3.11 이후로.'
The Python runtime version number encoded in a single constant integer.
See @ref{380,,Py_PACK_FULL_VERSION()} for the encoding details.
This contains the Python version used at run time.

Use this for numeric comparisons, for example, @code{if (Py_Version >= ...)}.


Added in version 3.11.

@end deffn

@node Bit-packing macros,,Run-time version,API와 ABI 버전 붙이기
@anchor{c-api/apiabiversion bit-packing-macros}@anchor{56cb}
@subsection Bit-packing macros


@geindex Py_PACK_FULL_VERSION (C function)
@anchor{c-api/apiabiversion c Py_PACK_FULL_VERSION}@anchor{380}
@deffn {C 함수} uint32_t Py_PACK_FULL_VERSION (int major, int minor, int micro, int release_level, int release_serial)
` Part of the @ref{774,,안정 ABI} 버전 3.14 이후로.'
Return the given version, encoded as a single 32-bit integer with
the following structure:


@multitable {xxxxxxxxxxxxxxxxxxxx} {xxxxxxxxx} {xxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxx} {xxxxxxxxxxxxxxx} {xxxxxxxxxxxxxx} 
@headitem

Argument

@tab

No.
of
bits

@tab

Bit mask

@tab

Bit shift

@tab

Example values

@tab

@item

@code{3.4.1a2}

@tab

@code{3.10.0}

@item

`major'

@tab

8

@tab

@code{0xFF000000}

@tab

24

@tab

@code{0x03}

@tab

@code{0x03}

@item

`minor'

@tab

8

@tab

@code{0x00FF0000}

@tab

16

@tab

@code{0x04}

@tab

@code{0x0A}

@item

`micro'

@tab

8

@tab

@code{0x0000FF00}

@tab

8

@tab

@code{0x01}

@tab

@code{0x00}

@item

`release_level'

@tab

4

@tab

@code{0x000000F0}

@tab

4

@tab

@code{0xA}

@tab

@code{0xF}

@item

`release_serial'

@tab

4

@tab

@code{0x0000000F}

@tab

0

@tab

@code{0x2}

@tab

@code{0x0}

@end multitable


For example:


@multitable {xxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxx} 
@headitem

Version

@tab

@code{Py_PACK_FULL_VERSION} arguments

@tab

Encoded version

@item

@code{3.4.1a2}

@tab

@code{(3, 4, 1, 0xA, 2)}

@tab

@code{0x030401a2}

@item

@code{3.10.0}

@tab

@code{(3, 10, 0, 0xF, 0)}

@tab

@code{0x030a00f0}

@end multitable


Out-of range bits in the arguments are ignored.
That is, the macro can be defined as:

@example
#ifndef Py_PACK_FULL_VERSION
#define Py_PACK_FULL_VERSION(X, Y, Z, LEVEL, SERIAL) ( \
   (((X) & 0xff) << 24) |                              \
   (((Y) & 0xff) << 16) |                              \
   (((Z) & 0xff) << 8) |                               \
   (((LEVEL) & 0xf) << 4) |                            \
   (((SERIAL) & 0xf) << 0))
#endif
@end example

@code{Py_PACK_FULL_VERSION} is primarily a macro, intended for use in
@code{#if} directives, but it is also available as an exported function.


Added in version 3.14.

@end deffn

@geindex Py_PACK_VERSION (C function)
@anchor{c-api/apiabiversion c Py_PACK_VERSION}@anchor{37f}
@deffn {C 함수} uint32_t Py_PACK_VERSION (int major, int minor)
` Part of the @ref{774,,안정 ABI} 버전 3.14 이후로.'
Equivalent to @code{Py_PACK_FULL_VERSION(major, minor, 0, 0, 0)}.
The result does not correspond to any Python release, but is useful
in numeric comparisons.


Added in version 3.14.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Monitoring C API,Generating Execution Events,API와 ABI 버전 붙이기,Python/C API reference manual
@anchor{c-api/monitoring doc}@anchor{56cc}@anchor{c-api/monitoring c-api-monitoring}@anchor{486}@anchor{c-api/monitoring monitoring-c-api}@anchor{56cd}@anchor{c-api/monitoring translation-repo}@anchor{56ce}
@section Monitoring C API


Added in version 3.13.

An extension may need to interact with the event monitoring system. Subscribing
to events and registering callbacks can be done via the Python API exposed in
@ref{e0,,sys.monitoring}.

@node Generating Execution Events,,Monitoring C API,Python/C API reference manual
@anchor{c-api/monitoring generating-execution-events}@anchor{56cf}
@section Generating Execution Events


The functions below make it possible for an extension to fire monitoring
events as it emulates the execution of Python code. Each of these functions
accepts a @code{PyMonitoringState} struct which contains concise information
about the activation state of events, as well as the event arguments, which
include a @code{PyObject*} representing the code object, the instruction offset
and sometimes additional, event-specific arguments (see @ref{e0,,sys.monitoring}
for details about the signatures of the different event callbacks).
The @code{codelike} argument should be an instance of @ref{32f,,types.CodeType}
or of a type that emulates it.

The VM disables tracing when firing an event, so there is no need for user
code to do that.

Monitoring functions should not be called with an exception set,
except those listed below as working with the current exception.

@geindex PyMonitoringState (C type)
@anchor{c-api/monitoring c PyMonitoringState}@anchor{5bc}
@deffn {C 자료형} type PyMonitoringState

Representation of the state of an event type. It is allocated by the user
while its contents are maintained by the monitoring API functions described below.
@end deffn

All of the functions below return 0 on success and -1 (with an exception set) on error.

See @ref{e0,,sys.monitoring} for descriptions of the events.

@geindex PyMonitoring_FirePyStartEvent (C function)
@anchor{c-api/monitoring c PyMonitoring_FirePyStartEvent}@anchor{5bd}
@deffn {C 함수} int PyMonitoring_FirePyStartEvent (PyMonitoringState *state, PyObject *codelike, int32_t offset)

Fire a @code{PY_START} event.
@end deffn

@geindex PyMonitoring_FirePyResumeEvent (C function)
@anchor{c-api/monitoring c PyMonitoring_FirePyResumeEvent}@anchor{5be}
@deffn {C 함수} int PyMonitoring_FirePyResumeEvent (PyMonitoringState *state, PyObject *codelike, int32_t offset)

Fire a @code{PY_RESUME} event.
@end deffn

@geindex PyMonitoring_FirePyReturnEvent (C function)
@anchor{c-api/monitoring c PyMonitoring_FirePyReturnEvent}@anchor{5bf}
@deffn {C 함수} int PyMonitoring_FirePyReturnEvent (PyMonitoringState *state, PyObject *codelike, int32_t offset, PyObject *retval)

Fire a @code{PY_RETURN} event.
@end deffn

@geindex PyMonitoring_FirePyYieldEvent (C function)
@anchor{c-api/monitoring c PyMonitoring_FirePyYieldEvent}@anchor{5c0}
@deffn {C 함수} int PyMonitoring_FirePyYieldEvent (PyMonitoringState *state, PyObject *codelike, int32_t offset, PyObject *retval)

Fire a @code{PY_YIELD} event.
@end deffn

@geindex PyMonitoring_FireCallEvent (C function)
@anchor{c-api/monitoring c PyMonitoring_FireCallEvent}@anchor{5c1}
@deffn {C 함수} int PyMonitoring_FireCallEvent (PyMonitoringState *state, PyObject *codelike, int32_t offset, PyObject *callable, PyObject *arg0)

Fire a @code{CALL} event.
@end deffn

@geindex PyMonitoring_FireLineEvent (C function)
@anchor{c-api/monitoring c PyMonitoring_FireLineEvent}@anchor{5c2}
@deffn {C 함수} int PyMonitoring_FireLineEvent (PyMonitoringState *state, PyObject *codelike, int32_t offset, int lineno)

Fire a @code{LINE} event.
@end deffn

@geindex PyMonitoring_FireJumpEvent (C function)
@anchor{c-api/monitoring c PyMonitoring_FireJumpEvent}@anchor{5c3}
@deffn {C 함수} int PyMonitoring_FireJumpEvent (PyMonitoringState *state, PyObject *codelike, int32_t offset, PyObject *target_offset)

Fire a @code{JUMP} event.
@end deffn

@geindex PyMonitoring_FireBranchLeftEvent (C function)
@anchor{c-api/monitoring c PyMonitoring_FireBranchLeftEvent}@anchor{3ad}
@deffn {C 함수} int PyMonitoring_FireBranchLeftEvent (PyMonitoringState *state, PyObject *codelike, int32_t offset, PyObject *target_offset)

Fire a @code{BRANCH_LEFT} event.
@end deffn

@geindex PyMonitoring_FireBranchRightEvent (C function)
@anchor{c-api/monitoring c PyMonitoring_FireBranchRightEvent}@anchor{3ae}
@deffn {C 함수} int PyMonitoring_FireBranchRightEvent (PyMonitoringState *state, PyObject *codelike, int32_t offset, PyObject *target_offset)

Fire a @code{BRANCH_RIGHT} event.
@end deffn

@geindex PyMonitoring_FireCReturnEvent (C function)
@anchor{c-api/monitoring c PyMonitoring_FireCReturnEvent}@anchor{5c4}
@deffn {C 함수} int PyMonitoring_FireCReturnEvent (PyMonitoringState *state, PyObject *codelike, int32_t offset, PyObject *retval)

Fire a @code{C_RETURN} event.
@end deffn

@geindex PyMonitoring_FirePyThrowEvent (C function)
@anchor{c-api/monitoring c PyMonitoring_FirePyThrowEvent}@anchor{5c5}
@deffn {C 함수} int PyMonitoring_FirePyThrowEvent (PyMonitoringState *state, PyObject *codelike, int32_t offset)

Fire a @code{PY_THROW} event with the current exception (as returned by
@ref{429,,PyErr_GetRaisedException()}).
@end deffn

@geindex PyMonitoring_FireRaiseEvent (C function)
@anchor{c-api/monitoring c PyMonitoring_FireRaiseEvent}@anchor{5c6}
@deffn {C 함수} int PyMonitoring_FireRaiseEvent (PyMonitoringState *state, PyObject *codelike, int32_t offset)

Fire a @code{RAISE} event with the current exception (as returned by
@ref{429,,PyErr_GetRaisedException()}).
@end deffn

@geindex PyMonitoring_FireCRaiseEvent (C function)
@anchor{c-api/monitoring c PyMonitoring_FireCRaiseEvent}@anchor{5c7}
@deffn {C 함수} int PyMonitoring_FireCRaiseEvent (PyMonitoringState *state, PyObject *codelike, int32_t offset)

Fire a @code{C_RAISE} event with the current exception (as returned by
@ref{429,,PyErr_GetRaisedException()}).
@end deffn

@geindex PyMonitoring_FireReraiseEvent (C function)
@anchor{c-api/monitoring c PyMonitoring_FireReraiseEvent}@anchor{5c8}
@deffn {C 함수} int PyMonitoring_FireReraiseEvent (PyMonitoringState *state, PyObject *codelike, int32_t offset)

Fire a @code{RERAISE} event with the current exception (as returned by
@ref{429,,PyErr_GetRaisedException()}).
@end deffn

@geindex PyMonitoring_FireExceptionHandledEvent (C function)
@anchor{c-api/monitoring c PyMonitoring_FireExceptionHandledEvent}@anchor{5c9}
@deffn {C 함수} int PyMonitoring_FireExceptionHandledEvent (PyMonitoringState *state, PyObject *codelike, int32_t offset)

Fire an @code{EXCEPTION_HANDLED} event with the current exception (as returned by
@ref{429,,PyErr_GetRaisedException()}).
@end deffn

@geindex PyMonitoring_FirePyUnwindEvent (C function)
@anchor{c-api/monitoring c PyMonitoring_FirePyUnwindEvent}@anchor{5ca}
@deffn {C 함수} int PyMonitoring_FirePyUnwindEvent (PyMonitoringState *state, PyObject *codelike, int32_t offset)

Fire a @code{PY_UNWIND} event with the current exception (as returned by
@ref{429,,PyErr_GetRaisedException()}).
@end deffn

@geindex PyMonitoring_FireStopIterationEvent (C function)
@anchor{c-api/monitoring c PyMonitoring_FireStopIterationEvent}@anchor{5cb}
@deffn {C 함수} int PyMonitoring_FireStopIterationEvent (PyMonitoringState *state, PyObject *codelike, int32_t offset, PyObject *value)

Fire a @code{STOP_ITERATION} event. If @code{value} is an instance of @ref{df4,,StopIteration}, it is used. Otherwise,
a new @code{StopIteration} instance is created with @code{value} as its argument.
@end deffn

@menu
* Managing the Monitoring State:: 

@end menu

@node Managing the Monitoring State,,,Generating Execution Events
@anchor{c-api/monitoring managing-the-monitoring-state}@anchor{56d0}
@subsection Managing the Monitoring State


Monitoring states can be managed with the help of monitoring scopes. A scope
would typically correspond to a Python function.

@geindex PyMonitoring_EnterScope (C function)
@anchor{c-api/monitoring c PyMonitoring_EnterScope}@anchor{5cc}
@deffn {C 함수} int PyMonitoring_EnterScope (PyMonitoringState *state_array, uint64_t *version, const uint8_t *event_types, Py_ssize_t length)

Enter a monitored scope. @code{event_types} is an array of the event IDs for
events that may be fired from the scope. For example, the ID of a @code{PY_START}
event is the value @code{PY_MONITORING_EVENT_PY_START}, which is numerically equal
to the base-2 logarithm of @code{sys.monitoring.events.PY_START}.
@code{state_array} is an array with a monitoring state entry for each event in
@code{event_types}, it is allocated by the user but populated by
@code{PyMonitoring_EnterScope()} with information about the activation state of
the event. The size of @code{event_types} (and hence also of @code{state_array})
is given in @code{length}.

The @code{version} argument is a pointer to a value which should be allocated
by the user together with @code{state_array} and initialized to 0,
and then set only by @code{PyMonitoring_EnterScope()} itself. It allows this
function to determine whether event states have changed since the previous call,
and to return quickly if they have not.

The scopes referred to here are lexical scopes: a function, class or method.
@code{PyMonitoring_EnterScope()} should be called whenever the lexical scope is
entered. Scopes can be reentered, reusing the same `state_array' and `version',
in situations like when emulating a recursive Python function. When a code-like’s
execution is paused, such as when emulating a generator, the scope needs to
be exited and re-entered.

The macros for `event_types' are:

@c The table is here to make the docs searchable, and to allow automatic
@c links to the identifiers.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Macro

@tab

Event

@item

@geindex PY_MONITORING_EVENT_BRANCH_LEFT (C macro)
@anchor{c-api/monitoring c PY_MONITORING_EVENT_BRANCH_LEFT}@anchor{56d1}
@deffn {C 매크로} PY_MONITORING_EVENT_BRANCH_LEFT
@end deffn

@tab

@ref{295,,BRANCH_LEFT}

@item

@geindex PY_MONITORING_EVENT_BRANCH_RIGHT (C macro)
@anchor{c-api/monitoring c PY_MONITORING_EVENT_BRANCH_RIGHT}@anchor{56d2}
@deffn {C 매크로} PY_MONITORING_EVENT_BRANCH_RIGHT
@end deffn

@tab

@ref{296,,BRANCH_RIGHT}

@item

@geindex PY_MONITORING_EVENT_CALL (C macro)
@anchor{c-api/monitoring c PY_MONITORING_EVENT_CALL}@anchor{56d3}
@deffn {C 매크로} PY_MONITORING_EVENT_CALL
@end deffn

@tab

@ref{19bd,,CALL}

@item

@geindex PY_MONITORING_EVENT_C_RAISE (C macro)
@anchor{c-api/monitoring c PY_MONITORING_EVENT_C_RAISE}@anchor{56d4}
@deffn {C 매크로} PY_MONITORING_EVENT_C_RAISE
@end deffn

@tab

@ref{4978,,C_RAISE}

@item

@geindex PY_MONITORING_EVENT_C_RETURN (C macro)
@anchor{c-api/monitoring c PY_MONITORING_EVENT_C_RETURN}@anchor{56d5}
@deffn {C 매크로} PY_MONITORING_EVENT_C_RETURN
@end deffn

@tab

@ref{4979,,C_RETURN}

@item

@geindex PY_MONITORING_EVENT_EXCEPTION_HANDLED (C macro)
@anchor{c-api/monitoring c PY_MONITORING_EVENT_EXCEPTION_HANDLED}@anchor{56d6}
@deffn {C 매크로} PY_MONITORING_EVENT_EXCEPTION_HANDLED
@end deffn

@tab

@ref{497a,,EXCEPTION_HANDLED}

@item

@geindex PY_MONITORING_EVENT_INSTRUCTION (C macro)
@anchor{c-api/monitoring c PY_MONITORING_EVENT_INSTRUCTION}@anchor{56d7}
@deffn {C 매크로} PY_MONITORING_EVENT_INSTRUCTION
@end deffn

@tab

@ref{497b,,INSTRUCTION}

@item

@geindex PY_MONITORING_EVENT_JUMP (C macro)
@anchor{c-api/monitoring c PY_MONITORING_EVENT_JUMP}@anchor{56d8}
@deffn {C 매크로} PY_MONITORING_EVENT_JUMP
@end deffn

@tab

@ref{497c,,JUMP}

@item

@geindex PY_MONITORING_EVENT_LINE (C macro)
@anchor{c-api/monitoring c PY_MONITORING_EVENT_LINE}@anchor{56d9}
@deffn {C 매크로} PY_MONITORING_EVENT_LINE
@end deffn

@tab

@ref{497d,,LINE}

@item

@geindex PY_MONITORING_EVENT_PY_RESUME (C macro)
@anchor{c-api/monitoring c PY_MONITORING_EVENT_PY_RESUME}@anchor{56da}
@deffn {C 매크로} PY_MONITORING_EVENT_PY_RESUME
@end deffn

@tab

@ref{497e,,PY_RESUME}

@item

@geindex PY_MONITORING_EVENT_PY_RETURN (C macro)
@anchor{c-api/monitoring c PY_MONITORING_EVENT_PY_RETURN}@anchor{56db}
@deffn {C 매크로} PY_MONITORING_EVENT_PY_RETURN
@end deffn

@tab

@ref{497f,,PY_RETURN}

@item

@geindex PY_MONITORING_EVENT_PY_START (C macro)
@anchor{c-api/monitoring c PY_MONITORING_EVENT_PY_START}@anchor{56dc}
@deffn {C 매크로} PY_MONITORING_EVENT_PY_START
@end deffn

@tab

@ref{4980,,PY_START}

@item

@geindex PY_MONITORING_EVENT_PY_THROW (C macro)
@anchor{c-api/monitoring c PY_MONITORING_EVENT_PY_THROW}@anchor{56dd}
@deffn {C 매크로} PY_MONITORING_EVENT_PY_THROW
@end deffn

@tab

@ref{1858,,PY_THROW}

@item

@geindex PY_MONITORING_EVENT_PY_UNWIND (C macro)
@anchor{c-api/monitoring c PY_MONITORING_EVENT_PY_UNWIND}@anchor{56de}
@deffn {C 매크로} PY_MONITORING_EVENT_PY_UNWIND
@end deffn

@tab

@ref{4981,,PY_UNWIND}

@item

@geindex PY_MONITORING_EVENT_PY_YIELD (C macro)
@anchor{c-api/monitoring c PY_MONITORING_EVENT_PY_YIELD}@anchor{56df}
@deffn {C 매크로} PY_MONITORING_EVENT_PY_YIELD
@end deffn

@tab

@ref{4982,,PY_YIELD}

@item

@geindex PY_MONITORING_EVENT_RAISE (C macro)
@anchor{c-api/monitoring c PY_MONITORING_EVENT_RAISE}@anchor{56e0}
@deffn {C 매크로} PY_MONITORING_EVENT_RAISE
@end deffn

@tab

@ref{1975,,RAISE}

@item

@geindex PY_MONITORING_EVENT_RERAISE (C macro)
@anchor{c-api/monitoring c PY_MONITORING_EVENT_RERAISE}@anchor{56e1}
@deffn {C 매크로} PY_MONITORING_EVENT_RERAISE
@end deffn

@tab

@ref{4984,,RERAISE}

@item

@geindex PY_MONITORING_EVENT_STOP_ITERATION (C macro)
@anchor{c-api/monitoring c PY_MONITORING_EVENT_STOP_ITERATION}@anchor{56e2}
@deffn {C 매크로} PY_MONITORING_EVENT_STOP_ITERATION
@end deffn

@tab

@ref{4983,,STOP_ITERATION}

@end multitable

@end deffn

@geindex PyMonitoring_ExitScope (C function)
@anchor{c-api/monitoring c PyMonitoring_ExitScope}@anchor{5cd}
@deffn {C 함수} int PyMonitoring_ExitScope (void)

Exit the last scope that was entered with @code{PyMonitoring_EnterScope()}.
@end deffn

@geindex PY_MONITORING_IS_INSTRUMENTED_EVENT (C function)
@anchor{c-api/monitoring c PY_MONITORING_IS_INSTRUMENTED_EVENT}@anchor{56e3}
@deffn {C 함수} int PY_MONITORING_IS_INSTRUMENTED_EVENT (uint8_t ev)

Return true if the event corresponding to the event ID `ev' is
a @ref{4988,,local event}.


Added in version 3.13.



버전 3.14부터 폐지됨: This function is @ref{23d,,soft deprecated}.

@end deffn

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 파이썬 모듈 설치하기,파이썬 HOWTO,Python/C API reference manual,Top
@anchor{installing/index doc}@anchor{56e4}@anchor{installing/index installing-index}@anchor{10f7}@anchor{installing/index installing-python-modules}@anchor{56e5}@anchor{installing/index translation-repo}@anchor{56e6}
@chapter 파이썬 모듈 설치하기


널리 사용되는 공개 소스 개발 프로젝트로서, 파이썬에는 적극적으로 지원하는 기여자와 사용자의 커뮤니티가 있어, 자신들의 소프트웨어를 공개 소스 라이센스 계약에 따라 다른 파이썬 개발자가 사용할 수 있도록 합니다.

이를 통해 파이썬 사용자는 효과적으로 공유하고 공동 작업할 수 있으며, 다른 사람들이 공통 (심지어 때로는 희귀한) 문제에 대해 이미 만든 솔루션의 이점을 누릴 수 있을 뿐 아니라, 자체 솔루션을 공동 풀에 잠재적으로 제공할 수 있습니다.

이 지침서는 이 절차의 설치 부분을 다룹니다. 자신의 파이썬 프로젝트를 만들고 공유하는 지침은 Python packaging user guide@footnote{https://packaging.python.org/en/latest/tutorials/packaging-projects/}를 참조하십시오.

@cartouche
@quotation 참고 
기업 및 기타 기관 사용자의 경우, 많은 조직에서 공개 소스 소프트웨어를 사용하고 공헌하는 데 대한 자체 정책을 시행하고 있음을 알고 있어야 합니다. 파이썬과 함께 제공되는 배포 및 설치 도구를 사용할 때 이러한 정책을 고려하십시오.
@end quotation
@end cartouche

@menu
* 핵심 용어:: 
* 기본 사용법: 기본 사용법<2>. 
* 어떻게 …?:: 
* 흔히 만나는 설치 문제:: 

@end menu

@node 핵심 용어,기본 사용법<2>,,파이썬 모듈 설치하기
@anchor{installing/index key-terms}@anchor{56e7}
@section 핵심 용어



@itemize *

@item 
@code{pip} 는 선호되는 설치 프로그램입니다. 파이썬 3.4부터, 기본적으로 파이썬 바이너리 설치 프로그램에 포함되어 있습니다.

@item 
`가상 환경' 은 패키지가 시스템 전체에 설치되는 것이 아니라, 특정 응용 프로그램에 사용되도록 설치될 수 있도록 하는 반 격리 된 파이썬 환경입니다.

@item 
@code{venv} 는 가상 환경을 만들기 위한 표준 도구이며, 파이썬 3.3 이후로 파이썬의 일부입니다. 파이썬 3.4부터, 생성되는 모든 가상 환경에 기본적으로 @code{pip} 를 설치합니다.

@item 
@code{virtualenv} 는 @code{venv} 에 대한 제삼자 대안(그리고 전임자)입니다. @code{venv} 를 아예 제공하지 않거나, 생성되는 환경에 @code{pip} 를 자동으로 설치할 수 없는, 3.4 이전의 파이썬 버전에서 가상 환경을 사용할 수 있도록 합니다.

@item 
파이썬 패키지 색인@footnote{https://pypi.org} 은 다른 파이썬 사용자가 사용할 수 있도록 만들어진 공개 소스 라이선스 패키지의 공용 저장소입니다.

@item 
파이썬 패키징 위원회@footnote{https://www.pypa.io/} 는 표준 패키징 도구와 관련 메타 데이터 및 파일 형식 표준의 유지 보수 및 발전을 담당하는 개발자 및 문서 작성자 모임입니다. 그들은 GitHub@footnote{https://github.com/pypa} 에 다양한 도구, 문서, 이슈 추적기를 유지합니다.

@item 
@code{distutils} 는 1998년에 파이썬 표준 라이브러리에 처음 추가된 최초의 빌드 및 배포 시스템입니다. @code{distutils} 의 직접 사용이 단계적으로 폐지되고 있지만, 여전히 현재의 패키징 및 배포 기반 시설의 기초를 이루고 있고, 표준 라이브러리의 일부로 남아있을 뿐만 아니라, 그 이름은 다른 방식으로도 (가령 파이썬 패키징 표준 개발을 조정하는 데 사용되는 메일링 리스트의 이름으로) 남아있습니다.
@end itemize


버전 3.5에서 변경: 이제 가상 환경을 만드는데 @code{venv} 사용을 권장합니다.



@subsubheading 더 보기


파이썬 패키징 사용자 지침서: 가상 환경 생성과 사용@footnote{https://packaging.python.org/installing/#creating-virtual-environments}


@node 기본 사용법<2>,어떻게 …?,핵심 용어,파이썬 모듈 설치하기
@anchor{installing/index basic-usage}@anchor{56e8}
@section 기본 사용법


표준 패키징 도구는 모두 명령 줄에서 사용하도록 설계되었습니다.

다음 명령은 파이썬 패키지 색인에서 최신 버전의 모듈과 그 의존성을 설치합니다:

@example
python -m pip install SomePackage
@end example

@cartouche
@quotation 참고 
POSIX 사용자(맥 OS 와 리눅스 사용자를 포함합니다)의 경우, 이 지침서의의 예제는 @ref{20eb,,가상 환경} 을 사용한다고 가정합니다.

윈도우 사용자의 경우, 이 지침서의 예제는 파이썬을 설치할 때 시스템 PATH 환경 변수를 조정하는 옵션이 선택되었다고 가정합니다.
@end quotation
@end cartouche

정확한 버전이나 최소 버전을 명령 줄에서 직접 지정할 수도 있습니다. @code{>}, @code{<} 와 같은 비교 연산자나 셸에서 해석되는 다른 특수 문자를 사용할 때는, 패키지 이름과 버전을 큰따옴표로 묶어야 합니다:

@example
python -m pip install SomePackage==1.0.4    # 특정 버전
python -m pip install "SomePackage>=1.0.4"  # 최소 버전
@end example

일반적으로, 적절한 모듈이 이미 설치되어있으면, 다시 설치하려고 해도 아무런 효과가 없습니다. 기존 모듈을 업그레이드하려면 명시적으로 요청해야 합니다:

@example
python -m pip install --upgrade SomePackage
@end example

@code{pip} 와 그 기능에 관한 더 많은 정보와 자원은 파이썬 패키징 사용자 지침서@footnote{https://packaging.python.org} 에서 찾을 수 있습니다.

가상 환경의 생성은 @ref{117,,venv} 모듈을 통해 수행됩니다. 활성 가상 환경에 패키지를 설치하려면 위에 표시된 명령을 사용합니다.


@subsubheading 더 보기


파이썬 패키징 사용자 지침서: 파이썬 배포 패키지 설치하기@footnote{https://packaging.python.org/installing/}


@node 어떻게 …?,흔히 만나는 설치 문제,기본 사용법<2>,파이썬 모듈 설치하기
@anchor{installing/index how-do-i}@anchor{56e9}
@section 어떻게 …?


이것들은 몇 가지 일반적인 작업에 대한 빠른 답변 또는 링크입니다.

@menu
* … 파이썬 3.4 이전 버전의 파이썬에서 pip 를 설치합니까?: … 파이썬 3 4 이전 버전의 파이썬에서 pip 를 설치합니까?. 
* … 현재 사용자만을 위해 패키지를 설치합니까?:: 
* … 과학 계산용 파이썬 패키지를 설치합니까?:: 
* … 병렬로 설치된 여러 버전의 파이썬으로 작업합니까?:: 

@end menu

@node … 파이썬 3 4 이전 버전의 파이썬에서 pip 를 설치합니까?,… 현재 사용자만을 위해 패키지를 설치합니까?,,어떻게 …?
@anchor{installing/index install-pip-in-versions-of-python-prior-to-python-3-4}@anchor{56ea}
@subsection … 파이썬 3.4 이전 버전의 파이썬에서 @code{pip} 를 설치합니까?


파이썬은 @code{pip} 를 파이썬 3.4에 와서야 포함하기 시작했습니다. 이전 버전의 경우, @code{pip} 는 파이썬 패키징 사용자 지침서에 설명된 대로 “부트스트랩(bootstrapped)” 될 필요가 있습니다.


@subsubheading 더 보기


파이썬 패키징 사용자 지침서: 패키지 설치 요구 사항@footnote{https://packaging.python.org/installing/#requirements-for-installing-packages}


@c installing-per-user-installation:

@node … 현재 사용자만을 위해 패키지를 설치합니까?,… 과학 계산용 파이썬 패키지를 설치합니까?,… 파이썬 3 4 이전 버전의 파이썬에서 pip 를 설치합니까?,어떻게 …?
@anchor{installing/index install-packages-just-for-the-current-user}@anchor{56eb}
@subsection … 현재 사용자만을 위해 패키지를 설치합니까?


@code{--user} 옵션을 @code{python -m pip install} 에 넘겨주면 시스템의 모든 사용자가 아닌 현재 사용자를 위해서만 패키지를 설치합니다.

@node … 과학 계산용 파이썬 패키지를 설치합니까?,… 병렬로 설치된 여러 버전의 파이썬으로 작업합니까?,… 현재 사용자만을 위해 패키지를 설치합니까?,어떻게 …?
@anchor{installing/index install-scientific-python-packages}@anchor{56ec}
@subsection … 과학 계산용 파이썬 패키지를 설치합니까?


많은 과학 계산용 파이썬 패키지는 복잡한 바이너리 의존성을 가지고 있고, 현재 @code{pip} 를 사용하여 직접 설치하기가 쉽지 않습니다. 이 시점에서, 사용자가 이 패키지들을 @code{pip} 로 설치하려고 시도하는 것보다 다른 방법@footnote{https://packaging.python.org/science/} 으로 설치하는 것이 더 쉬운 경우가 종종 있습니다.


@subsubheading 더 보기


파이썬 패키징 사용자 지침서: 과학 계산용 패키지 설치하기@footnote{https://packaging.python.org/science/}


@node … 병렬로 설치된 여러 버전의 파이썬으로 작업합니까?,,… 과학 계산용 파이썬 패키지를 설치합니까?,어떻게 …?
@anchor{installing/index work-with-multiple-versions-of-python-installed-in-parallel}@anchor{56ed}
@subsection … 병렬로 설치된 여러 버전의 파이썬으로 작업합니까?


리눅스, 맥 OS 및 다른 POSIX 시스템에서는, 버전이 지정된 파이썬 명령을 @code{-m} 스위치와 조합하여 적절한 @code{pip} 사본을 실행하십시오:

@example
python2   -m pip install SomePackage  # 기본 파이썬 2
python2.7 -m pip install SomePackage  # 특정하여 파이썬 2.7
python3   -m pip install SomePackage  # 기본 파이썬 3
python3.4 -m pip install SomePackage  # 특정하여 파이썬 3.4
@end example

적절히 버전이 지정된 @code{pip} 명령도 제공될 수 있습니다.

윈도우에서는 @code{py} 파이썬 실행기를 @code{-m} 스위치와 조합해서 사용하십시오:

@example
py -2   -m pip install SomePackage  # 기본 파이썬 2
py -2.7 -m pip install SomePackage  # 특정하여 파이썬 2.7
py -3   -m pip install SomePackage  # 기본 파이썬 3
py -3.4 -m pip install SomePackage  # 특정하여 파이썬 3.4
@end example

@c other questions:
@c 
@c Once the Development & Deployment part of PPUG is fleshed out, some of
@c those sections should be linked from new questions here (most notably,
@c we should have a question about avoiding depending on PyPI that links to
@c https://packaging.python.org/en/latest/guides/index-mirrors-and-caches/)

@node 흔히 만나는 설치 문제,,어떻게 …?,파이썬 모듈 설치하기
@anchor{installing/index common-installation-issues}@anchor{56ee}
@section 흔히 만나는 설치 문제


@menu
* 리눅스에 시스템 파이썬 설치하기:: 
* Pip가 설치되지 않았습니다.: Pip가 설치되지 않았습니다. 
* 바이너리 확장 설치하기:: 

@end menu

@node 리눅스에 시스템 파이썬 설치하기,Pip가 설치되지 않았습니다,,흔히 만나는 설치 문제
@anchor{installing/index installing-into-the-system-python-on-linux}@anchor{56ef}
@subsection 리눅스에 시스템 파이썬 설치하기


리눅스 시스템에서, 보통 파이썬 설치가 배포 일부로 포함됩니다. 이 파이썬 설치에 설치하려면 시스템에 대한 루트 액세스가 필요하며, @code{pip} 를 사용하여 구성 요소가 예기치 않게 업그레이드되면 시스템 패키지 관리자와 시스템의 다른 구성 요소의 작동을 방해할 수 있습니다.

이러한 시스템에서는, @code{pip} 로 패키지를 설치할 때 가상 환경이나 사용자별 설치를 사용하는 것이 더 좋습니다.

@node Pip가 설치되지 않았습니다,바이너리 확장 설치하기,리눅스에 시스템 파이썬 설치하기,흔히 만나는 설치 문제
@anchor{installing/index pip-not-installed}@anchor{56f0}
@subsection Pip가 설치되지 않았습니다.


@code{pip} 가 기본적으로 설치되지 않았을 수도 있습니다. 한가지 가능한 해결법은 다음과 같습니다:

@example
python -m ensurepip --default-pip
@end example

pip 설치@footnote{https://packaging.python.org/en/latest/tutorials/installing-packages/#ensure-pip-setuptools-and-wheel-are-up-to-date} 에 대한 추가 자원도 있습니다.

@node 바이너리 확장 설치하기,,Pip가 설치되지 않았습니다,흔히 만나는 설치 문제
@anchor{installing/index installing-binary-extensions}@anchor{56f1}
@subsection 바이너리 확장 설치하기


파이썬은 일반적으로 소스 기반 배포에 크게 의존하고 있으며, 최종 사용자가 설치 프로세스의 일부로 소스로부터 확장 모듈을 컴파일할 것으로 기대합니다.

바이너리 @code{wheel} 형식에 대한 지원의 도입과 파이썬 패키지 색인을 통해 적어도 윈도우와 맥 OS 용의 휠을 게시할 수 있게 됨에 따라, 사용자가 스스로 빌드하기 보다는 점차 사전 빌드된 확장들을 설치할 수 있게 되어, 이 문제는 시간이 지날수록 줄어들 것으로 예상합니다.

@code{wheel} 파일로 아직 사용할 수 없는 과학 계산용 소프트웨어@footnote{https://packaging.python.org/science/}  설치를 위한 어떤 해결책들은 로컬에서 빌드할 필요 없이 다른 바이너리 확장을 얻는 데 도움이 될 수 있습니다.


@subsubheading 더 보기


파이썬 패키징 사용자 지침서: 바이너리 확장@footnote{https://packaging.python.org/extensions/}


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 파이썬 HOWTO,파이썬 자주 나오는 질문들,파이썬 모듈 설치하기,Top
@anchor{howto/index doc}@anchor{56f2}@anchor{howto/index how-tos}@anchor{56f3}@anchor{howto/index python-howtos}@anchor{56f4}@anchor{howto/index translation-repo}@anchor{56f5}
@chapter 파이썬 HOWTO


파이썬 HOWTO 는 구체적인 주제를 심도 있게 다루는 문서입니다. 리눅스 설명서 프로젝트의 HOWTO 컬렉션을 모델로 삼아, 이 컬렉션은 파이썬 라이브러리 레퍼런스보다 자세한 문서를 작성하기 위한 노력입니다.

@menu
* A Conceptual Overview of asyncio:: 
* 확장 모듈을 파이썬 3에 이식하기:: 
* 파이썬 curses 프로그래밍:: 
* Descriptor Guide:: 
* Debugging C API extensions and CPython Internals with GDB:: 
* Enum HOWTO:: 
* 함수형 프로그래밍 HOWTO:: 
* 로깅 HOWTO:: 
* 로깅 요리책:: 
* 정규식 HOWTO:: 
* 소켓 프로그래밍 HOWTO:: 
* 정렬 기법:: 
* 유니코드 HOWTO:: 
* urllib 패키지를 사용하여 인터넷 리소스를 가져오는 방법:: 
* ipaddress 모듈에 대한 소개:: 
* DTrace와 SystemTap으로 CPython 계측하기:: 
* Python support for the Linux perf profiler:: 
* Annotations Best Practices:: 
* Isolating Extension Modules:: 
* timer file descriptor HOWTO:: 
* The Python 2.3 Method Resolution Order: The Python 2 3 Method Resolution Order. 
* Python support for free threading:: 
* C API Extension Support for Free Threading:: 
* Remote debugging attachment protocol:: 
* Permission requirements:: 
* Locating the PyRuntime structure:: 
* Reading _Py_DebugOffsets:: 
* Locating the interpreter and thread state:: 
* Writing control information:: 
* Summary:: 

@end menu

@node A Conceptual Overview of asyncio,확장 모듈을 파이썬 3에 이식하기,,파이썬 HOWTO
@anchor{howto/a-conceptual-overview-of-asyncio doc}@anchor{56f6}@anchor{howto/a-conceptual-overview-of-asyncio a-conceptual-overview-of-asyncio}@anchor{37e8}@anchor{howto/a-conceptual-overview-of-asyncio id1}@anchor{56f7}
@section A Conceptual Overview of @code{asyncio}


This @ref{56f3,,HOWTO} article seeks to help you build a sturdy mental
model of how @ref{b,,asyncio} fundamentally works, helping you understand the
how and why behind the recommended patterns.

You might be curious about some key @code{asyncio} concepts.
By the end of this article, you’ll be able to comfortably answer these questions:


@itemize -

@item 
What’s happening behind the scenes when an object is awaited?

@item 
How does @code{asyncio} differentiate between a task which doesn’t need
CPU time (such as a network request or file read) as opposed to a task that
does (such as computing n-factorial)?

@item 
How to write an asynchronous variant of an operation, such as
an async sleep or database request.
@end itemize


@subsubheading 더 보기



@itemize *

@item 
The guide@footnote{https://github.com/anordin95/a-conceptual-overview-of-asyncio/tree/main} that inspired this HOWTO article, by Alexander Nordin.

@item 
This in-depth YouTube tutorial series@footnote{https://www.youtube.com/watch?v=Xbl7XjFYsN4&list=PLhNSoGM2ik6SIkVGXWBwerucXjgP1rHmB} on
@code{asyncio} created by Python core team member, Łukasz Langa.

@item 
500 Lines or Less: A Web Crawler With asyncio Coroutines@footnote{https://aosabook.org/en/500L/a-web-crawler-with-asyncio-coroutines.html} by A.
Jesse Jiryu Davis and Guido van Rossum.
@end itemize


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

@end menu

@node A conceptual overview part 1 the high-level,A conceptual overview part 2 the nuts and bolts,,A Conceptual Overview of asyncio
@anchor{howto/a-conceptual-overview-of-asyncio a-conceptual-overview-part-1-the-high-level}@anchor{56f8}
@subsection A conceptual overview part 1: the high-level


In part 1, we’ll cover the main, high-level building blocks of @code{asyncio}:
the event loop, coroutine functions, coroutine objects, tasks, and @code{await}.

@menu
* Event Loop:: 
* Asynchronous functions and coroutines:: 
* Tasks:: 
* await:: 

@end menu

@node Event Loop,Asynchronous functions and coroutines,,A conceptual overview part 1 the high-level
@anchor{howto/a-conceptual-overview-of-asyncio event-loop}@anchor{56f9}
@subsubsection Event Loop


Everything in @code{asyncio} happens relative to the event loop.
It’s the star of the show.
It’s like an orchestra conductor.
It’s behind the scenes managing resources.
Some power is explicitly granted to it, but a lot of its ability to get things
done comes from the respect and cooperation of its worker bees.

In more technical terms, the event loop contains a collection of jobs to be run.
Some jobs are added directly by you, and some indirectly by @code{asyncio}.
The event loop takes a job from its backlog of work and invokes it (or “gives
it control”), similar to calling a function, and then that job runs.
Once it pauses or completes, it returns control to the event loop.
The event loop will then select another job from its pool and invoke it.
You can `roughly' think of the collection of jobs as a queue: jobs are added and
then processed one at a time, generally (but not always) in order.
This process repeats indefinitely, with the event loop cycling endlessly
onwards.
If there are no more jobs pending execution, the event loop is smart enough to
rest and avoid needlessly wasting CPU cycles, and will come back when there’s
more work to be done.

Effective execution relies on jobs sharing well and cooperating; a greedy job
could hog control and leave the other jobs to starve, rendering the overall
event loop approach rather useless.

@example
import asyncio

# This creates an event loop and indefinitely cycles through
# its collection of jobs.
event_loop = asyncio.new_event_loop()
event_loop.run_forever()
@end example

@node Asynchronous functions and coroutines,Tasks,Event Loop,A conceptual overview part 1 the high-level
@anchor{howto/a-conceptual-overview-of-asyncio asynchronous-functions-and-coroutines}@anchor{56fa}
@subsubsection Asynchronous functions and coroutines


This is a basic, boring Python function:

@example
def hello_printer():
    print(
        "Hi, I am a lowly, simple printer, though I have all I "
        "need in life -- \nfresh paper and my dearly beloved octopus "
        "partner in crime."
    )
@end example

Calling a regular function invokes its logic or body:

@example
>>> hello_printer()
Hi, I am a lowly, simple printer, though I have all I need in life --
fresh paper and my dearly beloved octopus partner in crime.
@end example

The @ref{7ec,,async def}, as opposed to just a plain @code{def}, makes
this an asynchronous function (or “coroutine function”).
Calling it creates and returns a @ref{37e9,,coroutine} object.

@example
async def loudmouth_penguin(magic_number: int):
    print(
     "I am a super special talking penguin. Far cooler than that printer. "
     f"By the way, my lucky number is: @{magic_number@}."
    )
@end example

Calling the async function, @code{loudmouth_penguin}, does not execute the print statement;
instead, it creates a coroutine object:

@example
>>> loudmouth_penguin(magic_number=3)
<coroutine object loudmouth_penguin at 0x104ed2740>
@end example

The terms “coroutine function” and “coroutine object” are often conflated
as coroutine.
That can be confusing!
In this article, coroutine specifically refers to a coroutine object, or more
precisely, an instance of @ref{1088,,types.CoroutineType} (native coroutine).
Note that coroutines can also exist as instances of
@ref{fdc,,collections.abc.Coroutine} – a distinction that matters for type
checking.

A coroutine represents the function’s body or logic.
A coroutine has to be explicitly started; again, merely creating the coroutine
does not start it.
Notably, the coroutine can be paused and resumed at various points within the
function’s body.
That pausing and resuming ability is what allows for asynchronous behavior!

Coroutines and coroutine functions were built by leveraging the functionality
of @ref{dd8,,generators} and
@ref{1260,,generator functions}.
Recall, a generator function is a function that @ref{bc1,,yield}s, like this
one:

@example
def get_random_number():
    # This would be a bad random number generator!
    print("Hi")
    yield 1
    print("Hello")
    yield 7
    print("Howdy")
    yield 4
    ...
@end example

Similar to a coroutine function, calling a generator function does not run it.
Instead, it creates a generator object:

@example
>>> get_random_number()
<generator object get_random_number at 0x1048671c0>
@end example

You can proceed to the next @code{yield} of a generator by using the
built-in function @ref{9d8,,next()}.
In other words, the generator runs, then pauses.
For example:

@example
>>> generator = get_random_number()
>>> next(generator)
Hi
1
>>> next(generator)
Hello
7
@end example

@node Tasks,await,Asynchronous functions and coroutines,A conceptual overview part 1 the high-level
@anchor{howto/a-conceptual-overview-of-asyncio tasks}@anchor{56fb}
@subsubsection Tasks


Roughly speaking, @ref{381b,,tasks} are coroutines (not coroutine
functions) tied to an event loop.
A task also maintains a list of callback functions whose importance will become
clear in a moment when we discuss @ref{18d,,await}.
The recommended way to create tasks is via @ref{1c9,,asyncio.create_task()}.

Creating a task automatically schedules it for execution (by adding a
callback to run it in the event loop’s to-do list, that is, collection of jobs).

@code{asyncio} automatically associates tasks with the event loop for you.
This automatic association was purposely designed into @code{asyncio} for
the sake of simplicity.
Without it, you’d have to keep track of the event loop object and pass it to
any coroutine function that wants to create tasks, adding redundant clutter
to your code.

@example
coroutine = loudmouth_penguin(magic_number=5)
# This creates a Task object and schedules its execution via the event loop.
task = asyncio.create_task(coroutine)
@end example

Earlier, we manually created the event loop and set it to run forever.
In practice, it’s recommended to use (and common to see) @ref{2f3,,asyncio.run()},
which takes care of managing the event loop and ensuring the provided
coroutine finishes before advancing.
For example, many async programs follow this setup:

@example
import asyncio

async def main():
    # Perform all sorts of wacky, wild asynchronous things...
    ...

if __name__ == "__main__":
    asyncio.run(main())
    # The program will not reach the following print statement until the
    # coroutine main() finishes.
    print("coroutine main() is done!")
@end example

It’s important to be aware that the task itself is not added to the event loop,
only a callback to the task is.
This matters if the task object you created is garbage collected before it’s
called by the event loop.
For example, consider this program:

@example
async def hello():
    print("hello!")

async def main():
    asyncio.create_task(hello())
    # Other asynchronous instructions which run for a while
    # and cede control to the event loop...
    ...

asyncio.run(main())
@end example

Because there’s no reference to the task object created on line 5, it `might'
be garbage collected before the event loop invokes it.
Later instructions in the coroutine @code{main()} hand control back to the event
loop so it can invoke other jobs.
When the event loop eventually tries to run the task, it might fail and
discover the task object does not exist!
This can also happen even if a coroutine keeps a reference to a task but
completes before that task finishes.
When the coroutine exits, local variables go out of scope and may be subject
to garbage collection.
In practice, @code{asyncio} and Python’s garbage collector work pretty hard to
ensure this sort of thing doesn’t happen.
But that’s no reason to be reckless!

@node await,,Tasks,A conceptual overview part 1 the high-level
@anchor{howto/a-conceptual-overview-of-asyncio await}@anchor{56fc}
@subsubsection await


@ref{18d,,await} is a Python keyword that’s commonly used in one of two
different ways:

@example
await task
await coroutine
@end example

In a crucial way, the behavior of @code{await} depends on the type of object
being awaited.

Awaiting a task will cede control from the current task or coroutine to
the event loop.
In the process of relinquishing control, a few important things happen.
We’ll use the following code example to illustrate:

@example
async def plant_a_tree():
    dig_the_hole_task = asyncio.create_task(dig_the_hole())
    await dig_the_hole_task

    # Other instructions associated with planting a tree.
    ...
@end example

In this example, imagine the event loop has passed control to the start of the
coroutine @code{plant_a_tree()}.
As seen above, the coroutine creates a task and then awaits it.
The @code{await dig_the_hole_task} instruction adds a callback (which will resume
@code{plant_a_tree()}) to the @code{dig_the_hole_task} object’s list of callbacks.
And then, the instruction cedes control to the event loop.
Some time later, the event loop will pass control to @code{dig_the_hole_task}
and the task will finish whatever it needs to do.
Once the task finishes, it will add its various callbacks to the event loop,
in this case, a call to resume @code{plant_a_tree()}.

Generally speaking, when the awaited task finishes (@code{dig_the_hole_task}),
the original task or coroutine (@code{plant_a_tree()}) is added back to the event
loop’s to-do list to be resumed.

This is a basic, yet reliable mental model.
In practice, the control handoffs are slightly more complex, but not by much.
In part 2, we’ll walk through the details that make this possible.

`Unlike tasks, awaiting a coroutine does not hand control back to the event
loop!'
Wrapping a coroutine in a task first, then awaiting that would cede
control.
The behavior of @code{await coroutine} is effectively the same as invoking a
regular, synchronous Python function.
Consider this program:

@example
import asyncio

async def coro_a():
   print("I am coro_a(). Hi!")

async def coro_b():
   print("I am coro_b(). I sure hope no one hogs the event loop...")

async def main():
   task_b = asyncio.create_task(coro_b())
   num_repeats = 3
   for _ in range(num_repeats):
      await coro_a()
   await task_b

asyncio.run(main())
@end example

The first statement in the coroutine @code{main()} creates @code{task_b} and schedules
it for execution via the event loop.
Then, @code{coro_a()} is repeatedly awaited. Control never cedes to the
event loop, which is why we see the output of all three @code{coro_a()}
invocations before @code{coro_b()}’s output:

@example
I am coro_a(). Hi!
I am coro_a(). Hi!
I am coro_a(). Hi!
I am coro_b(). I sure hope no one hogs the event loop...
@end example

If we change @code{await coro_a()} to @code{await asyncio.create_task(coro_a())}, the
behavior changes.
The coroutine @code{main()} cedes control to the event loop with that statement.
The event loop then proceeds through its backlog of work, calling @code{task_b}
and then the task which wraps @code{coro_a()} before resuming the coroutine
@code{main()}.

@example
I am coro_b(). I sure hope no one hogs the event loop...
I am coro_a(). Hi!
I am coro_a(). Hi!
I am coro_a(). Hi!
@end example

This behavior of @code{await coroutine} can trip a lot of people up!
That example highlights how using only @code{await coroutine} could
unintentionally hog control from other tasks and effectively stall the event
loop.
@ref{2f3,,asyncio.run()} can help you detect such occurrences via the
@code{debug=True} flag, which enables
@ref{2137,,debug mode}.
Among other things, it will log any coroutines that monopolize execution for
100ms or longer.

The design intentionally trades off some conceptual clarity around usage of
@code{await} for improved performance.
Each time a task is awaited, control needs to be passed all the way up the
call stack to the event loop.
That might sound minor, but in a large program with many @code{await} statements and a deep
call stack, that overhead can add up to a meaningful performance drag.

@node A conceptual overview part 2 the nuts and bolts,,A conceptual overview part 1 the high-level,A Conceptual Overview of asyncio
@anchor{howto/a-conceptual-overview-of-asyncio a-conceptual-overview-part-2-the-nuts-and-bolts}@anchor{56fd}
@subsection A conceptual overview part 2: the nuts and bolts


Part 2 goes into detail on the mechanisms @code{asyncio} uses to manage
control flow.
This is where the magic happens.
You’ll come away from this section knowing what @code{await} does behind the scenes
and how to make your own asynchronous operators.

@menu
* The inner workings of coroutines:: 
* Futures:: 
* A homemade asyncio.sleep: A homemade asyncio sleep. 

@end menu

@node The inner workings of coroutines,Futures,,A conceptual overview part 2 the nuts and bolts
@anchor{howto/a-conceptual-overview-of-asyncio the-inner-workings-of-coroutines}@anchor{56fe}
@subsubsection The inner workings of coroutines


@code{asyncio} leverages four components to pass around control.

@ref{241a,,coroutine.send(arg)} is the method used to start or
resume a coroutine.
If the coroutine was paused and is now being resumed, the argument @code{arg}
will be sent in as the return value of the @code{yield} statement which originally
paused it.
If the coroutine is being used for the first time (as opposed to being resumed),
@code{arg} must be @code{None}.

@example
class Rock:
    def __await__(self):
        value_sent_in = yield 7
        print(f"Rock.__await__ resuming with value: @{value_sent_in@}.")
        return value_sent_in

async def main():
    print("Beginning coroutine main().")
    rock = Rock()
    print("Awaiting rock...")
    value_from_rock = await rock
    print(f"Coroutine received value: @{value_from_rock@} from rock.")
    return 23

coroutine = main()
intermediate_result = coroutine.send(None)
print(f"Coroutine paused and returned intermediate value: @{intermediate_result@}.")

print(f"Resuming coroutine and sending in value: 42.")
try:
    coroutine.send(42)
except StopIteration as e:
    returned_value = e.value
print(f"Coroutine main() finished and provided value: @{returned_value@}.")
@end example

@ref{2498,,yield}, as usual, pauses execution and returns control
to the caller.
In the example above, the @code{yield}, on line 3, is called by
@code{... = await rock} on line 11.
More broadly speaking, @code{await} calls the @ref{f74,,__await__()} method of
the given object.
@code{await} also does one more very special thing: it propagates (or “passes
along”) any @code{yield}s it receives up the call chain.
In this case, that’s back to @code{... = coroutine.send(None)} on line 16.

The coroutine is resumed via the @code{coroutine.send(42)} call on line 21.
The coroutine picks back up from where it @code{yield}ed (or paused) on line 3
and executes the remaining statements in its body.
When a coroutine finishes, it raises a @ref{df4,,StopIteration} exception with the
return value attached in the @ref{2417,,value} attribute.

That snippet produces this output:

@example
Beginning coroutine main().
Awaiting rock...
Coroutine paused and returned intermediate value: 7.
Resuming coroutine and sending in value: 42.
Rock.__await__ resuming with value: 42.
Coroutine received value: 42 from rock.
Coroutine main() finished and provided value: 23.
@end example

It’s worth pausing for a moment here and making sure you followed the various
ways that control flow and values were passed. A lot of important ideas were
covered and it’s worth ensuring your understanding is firm.

The only way to yield (or effectively cede control) from a coroutine is to
@code{await} an object that @code{yield}s in its @code{__await__} method.
That might sound odd to you. You might be thinking:

@quotation

1. What about a @code{yield} directly within the coroutine function? The
coroutine function becomes an
@ref{249c,,async generator function}, a
different beast entirely.

2. What about a @ref{2498,,yield from} within the coroutine function to a (plain)
generator?
That causes the error: @code{SyntaxError: yield from not allowed in a coroutine.}
This was intentionally designed for the sake of simplicity – mandating only
one way of using coroutines.
Initially @code{yield} was barred as well, but was re-accepted to allow for
async generators.
Despite that, @code{yield from} and @code{await} effectively do the same thing.
@end quotation

@node Futures,A homemade asyncio sleep,The inner workings of coroutines,A conceptual overview part 2 the nuts and bolts
@anchor{howto/a-conceptual-overview-of-asyncio futures}@anchor{56ff}
@subsubsection Futures


A @ref{38f5,,future} is an object meant to represent a
computation’s status and result.
The term is a nod to the idea of something still to come or not yet happened,
and the object is a way to keep an eye on that something.

A future has a few important attributes. One is its state, which can be either
“pending”, “cancelled”, or “done”.
Another is its result, which is set when the state transitions to done.
Unlike a coroutine, a future does not represent the actual computation to be
done; instead, it represents the status and result of that computation, kind of
like a status light (red, yellow, or green) or indicator.

@ref{1c7,,asyncio.Task} subclasses @ref{dc5,,asyncio.Future} in order to gain
these various capabilities.
The prior section said tasks store a list of callbacks, which wasn’t entirely
accurate.
It’s actually the @code{Future} class that implements this logic, which @code{Task}
inherits.

Futures may also be used directly (not via tasks).
Tasks mark themselves as done when their coroutine is complete.
Futures are much more versatile and will be marked as done when you say so.
In this way, they’re the flexible interface for you to make your own conditions
for waiting and resuming.

@node A homemade asyncio sleep,,Futures,A conceptual overview part 2 the nuts and bolts
@anchor{howto/a-conceptual-overview-of-asyncio a-homemade-asyncio-sleep}@anchor{5700}
@subsubsection A homemade asyncio.sleep


We’ll go through an example of how you could leverage a future to create your
own variant of asynchronous sleep (@code{async_sleep}) which mimics
@ref{c63,,asyncio.sleep()}.

This snippet registers a few tasks with the event loop and then awaits the task
created by @code{asyncio.create_task}, which wraps the @code{async_sleep(3)} coroutine.
We want that task to finish only after three seconds have elapsed, but without
preventing other tasks from running.

@example
async def other_work():
    print("I like work. Work work.")

async def main():
    # Add a few other tasks to the event loop, so there's something
    # to do while asynchronously sleeping.
    work_tasks = [
        asyncio.create_task(other_work()),
        asyncio.create_task(other_work()),
        asyncio.create_task(other_work())
    ]
    print(
        "Beginning asynchronous sleep at time: "
        f"@{datetime.datetime.now().strftime("%H:%M:%S")@}."
    )
    await asyncio.create_task(async_sleep(3))
    print(
        "Done asynchronous sleep at time: "
        f"@{datetime.datetime.now().strftime("%H:%M:%S")@}."
    )
    # asyncio.gather effectively awaits each task in the collection.
    await asyncio.gather(*work_tasks)
@end example

Below, we use a future to enable custom control over when that task will be
marked as done.
If @ref{381e,,future.set_result()} (the method
responsible for marking that future as done) is never called, then this task
will never finish.
We’ve also enlisted the help of another task, which we’ll see in a moment, that
will monitor how much time has elapsed and, accordingly, call
@code{future.set_result()}.

@example
async def async_sleep(seconds: float):
    future = asyncio.Future()
    time_to_wake = time.time() + seconds
    # Add the watcher-task to the event loop.
    watcher_task = asyncio.create_task(_sleep_watcher(future, time_to_wake))
    # Block until the future is marked as done.
    await future
@end example

Below, we use a rather bare @code{YieldToEventLoop()} object to @code{yield}
from its @code{__await__} method, ceding control to the event loop.
This is effectively the same as calling @code{asyncio.sleep(0)}, but this approach
offers more clarity, not to mention it’s somewhat cheating to use
@code{asyncio.sleep} when showcasing how to implement it!

As usual, the event loop cycles through its tasks, giving them control
and receiving control back when they pause or finish.
The @code{watcher_task}, which runs the coroutine @code{_sleep_watcher(...)}, will
be invoked once per full cycle of the event loop.
On each resumption, it’ll check the time and if not enough has elapsed, then
it’ll pause once again and hand control back to the event loop.
Once enough time has elapsed, @code{_sleep_watcher(...)}
marks the future as done and completes by exiting its
infinite @code{while} loop.
Given this helper task is only invoked once per cycle of the event loop,
you’d be correct to note that this asynchronous sleep will sleep `at least'
three seconds, rather than exactly three seconds.
Note this is also true of @code{asyncio.sleep}.

@example
class YieldToEventLoop:
    def __await__(self):
        yield

async def _sleep_watcher(future, time_to_wake):
    while True:
        if time.time() >= time_to_wake:
            # This marks the future as done.
            future.set_result(None)
            break
        else:
            await YieldToEventLoop()
@end example

Here is the full program’s output:

@example
$ python custom-async-sleep.py
Beginning asynchronous sleep at time: 14:52:22.
I like work. Work work.
I like work. Work work.
I like work. Work work.
Done asynchronous sleep at time: 14:52:25.
@end example

You might feel this implementation of asynchronous sleep was unnecessarily
convoluted.
And, well, it was.
The example was meant to showcase the versatility of futures with a simple
example that could be mimicked for more complex needs.
For reference, you could implement it without futures, like so:

@example
async def simpler_async_sleep(seconds):
    time_to_wake = time.time() + seconds
    while True:
        if time.time() >= time_to_wake:
            return
        else:
            await YieldToEventLoop()
@end example

But that’s all for now. Hopefully you’re ready to more confidently dive into
some async programming or check out advanced topics in the
@ref{b,,rest of the documentation}.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 확장 모듈을 파이썬 3에 이식하기,파이썬 curses 프로그래밍,A Conceptual Overview of asyncio,파이썬 HOWTO
@anchor{howto/cporting doc}@anchor{5701}@anchor{howto/cporting cporting-howto}@anchor{14e5}@anchor{howto/cporting porting-extension-modules-to-python-3}@anchor{5702}@anchor{howto/cporting translation-repo}@anchor{5703}
@section 확장 모듈을 파이썬 3에 이식하기


확장 모듈을 파이썬 3에 이식하는 것에 관해서는 다음과 같은 리소스를 추천합니다:


@itemize *

@item 
파이썬 2에서 파이썬 3으로 옮겨가는 것에 관한 일반적인 책인 `Supporting Python 3: An in-depth guide'의 Migrating C extensions@footnote{http://python3porting.com/cextensions.html} 장은 독자에게 확장 모듈을 이식하는 과정을 안내합니다.

@item 
`py3c' 프로젝트의 Porting guide@footnote{https://py3c.readthedocs.io/en/latest/guide.html}는 지원 코드와 함께 전문적인 제안을 제공합니다.

@item 
@ref{4ecd,,Recommended third party tools} offer abstractions over
the Python’s C API.
Extensions generally need to be re-written to use one of them,
but the library then handles differences between various Python
versions and implementations.
@end itemize

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 파이썬 curses 프로그래밍,Descriptor Guide,확장 모듈을 파이썬 3에 이식하기,파이썬 HOWTO
@anchor{howto/curses doc}@anchor{5704}@anchor{howto/curses curses-howto}@anchor{3490}@anchor{howto/curses curses-programming-with-python}@anchor{5705}@anchor{howto/curses translation-repo}@anchor{5706}
@section 파이썬 curses 프로그래밍


@*저자: 
A.M. Kuchling, Eric S. Raymond


@*버전: 
2.04


@subsubheading 요약



이 문서는 @ref{2f,,curses} 확장 모듈을 사용하여 텍스트 모드 디스플레이를 제어하는 방법을 설명합니다.

@menu
* curses란 무엇입니까?:: 
* curses 응용 프로그램 시작과 종료:: 
* 창과 패드:: 
* 텍스트 표시:: 
* 사용자 입력:: 
* 추가 정보:: 

@end menu

@node curses란 무엇입니까?,curses 응용 프로그램 시작과 종료,,파이썬 curses 프로그래밍
@anchor{howto/curses what-is-curses}@anchor{5707}
@subsection curses란 무엇입니까?


curses 라이브러리는 텍스트 기반 터미널을 위한 터미널 독립적인 스크린 페인팅과 키보드 처리 기능을 제공합니다; 이러한 터미널에는 VT100, 리눅스 콘솔 및 다양한 프로그램에서 제공하는 시뮬레이트 된 터미널이 포함됩니다. 디스플레이 터미널은 커서 이동, 화면 스크롤 및 영역 지우기와 같은 일반적인 작업을 수행하기 위해 다양한 제어 코드를 지원합니다. 터미널마다 서로 다른 코드를 사용하며 종종 자신만의 사소한 문제가 있습니다.

그래픽 디스플레이의 세계에서, 이렇게 물을 수 있습니다. “왜 신경 써야 하나요”? 문자 셀 디스플레이 터미널은 한물간 기술이지만, 사실 여전히 가치 있는 멋진 작업을 수행할 수 있는 틈새가 존재합니다. 한가지 틈새는 X 서버를 실행하지 않는 작은 크기 혹은 내장 유닉스입니다. 다른 것으로는 그래픽 지원을 사용할 수 있기 전에 실행해야 할 OS 설치 프로그램과 커널 구성기와 같은 도구가 있습니다.

curses 라이브러리는 상당히 기본적인 기능을 제공하여, 프로그래머에게 겹치지 않는 여러 개의 텍스트 창을 포함하는 디스플레이의 추상화를 제공합니다. 창의 내용은 텍스트 추가, 삭제, 모양 변경 등 다양한 방법으로 변경될 수 있으며 curses 라이브러리는 올바른 출력을 생성하기 위해 터미널에 어떤 제어 코드를 보내야 하는지 파악합니다. curses는 버튼, 체크 박스 또는 대화 상자와 같은 많은 사용자 인터페이스 개념을 제공하지 않습니다; 이러한 기능이 필요하면 Urwid@footnote{https://pypi.org/project/Urwid/}와 같은 사용자 인터페이스 라이브러리를 고려하십시오.

curses 라이브러리는 원래 BSD 유닉스용으로 작성되었습니다; 그 이후 AT&T의 유닉스 시스템 V 버전에는 많은 개선 사항과 새로운 기능이 추가되었습니다. BSD curses는 더는 유지되지 않고, AT&T 인터페이스의 오픈 소스 구현인 ncurses로 대체되었습니다. 리눅스나 FreeBSD 와 같은 오픈 소스 유닉스를 사용하고 있다면, 시스템은 거의 확실히 ncurses를 사용합니다. 최신 상용 유닉스 버전은 대부분 시스템 V 코드를 기반으로 하므로, 여기에 설명된 모든 기능을 아마도 사용할 수 있을 것입니다. 그러나 일부 독점적 유닉스가 제공하는 이전 버전의 curses는 모든 것을 지원하지 않을 수 있습니다.

윈도우 버전의 파이썬은 @ref{2f,,curses} 모듈을 포함하지 않습니다. 이식된 버전인 UniCurses@footnote{https://pypi.org/project/UniCurses/}를 사용할 수 있습니다.

@menu
* 파이썬 curses 모듈:: 

@end menu

@node 파이썬 curses 모듈,,,curses란 무엇입니까?
@anchor{howto/curses the-python-curses-module}@anchor{5708}
@subsubsection 파이썬 curses 모듈


파이썬 모듈은 curses가 제공하는 C 함수에 대한 상당히 간단한 래퍼입니다; C의 curses 프로그래밍에 이미 익숙하다면 이 지식을 파이썬으로 쉽게 옮길 수 있습니다. 가장 큰 차이점은 파이썬 인터페이스가 @code{addstr()}, @code{mvaddstr()} 및 @code{mvwaddstr()}와 같은 다른 C 함수를 단일 @ref{34a5,,addstr()} 메서드로 병합하여 작업을 단순화한다는 것입니다. 나중에 자세히 다루겠습니다.

이 HOWTO는 curses와 파이썬으로 텍스트 모드 프로그램을 작성하는 방법을 소개합니다. curses API에 대한 완전한 안내서가 되려는 것은 아닙니다; 그것을 위해서는 ncurses에 대한 파이썬 라이브러리 안내서 섹션과 ncurses에 대한 C 매뉴얼 페이지를 참조하십시오. 그러나 기본 아이디어는 제공합니다.

@node curses 응용 프로그램 시작과 종료,창과 패드,curses란 무엇입니까?,파이썬 curses 프로그래밍
@anchor{howto/curses starting-and-ending-a-curses-application}@anchor{5709}
@subsection curses 응용 프로그램 시작과 종료


무언가를 하기 전에 curses를 초기화해야 합니다. 이것은 @ref{1910,,initscr()} 함수를 호출함으로써 수행되는데, 터미널 유형을 결정하고, 필요한 설정 코드를 터미널에 보내고, 다양한 내부 데이터 구조를 만듭니다. 성공하면 @code{initscr()}은 전체 화면을 나타내는 창 객체를 반환합니다; 이를 일반적으로 해당 C 변수 이름을 따라 @code{stdscr}이라고 합니다.

@example
import curses
stdscr = curses.initscr()
@end example

일반적으로 curses 응용 프로그램은 키를 읽고 특정 상황에서만 표시할 수 있도록 화면으로 키를 자동 에코 하는 기능을 끕니다. 이를 위해서는 @ref{34cd,,noecho()} 함수를 호출해야 합니다.

@example
curses.noecho()
@end example

응용 프로그램은 또한 일반적으로 Enter 키를 누르지 않아도 즉시 키에 반응해야 합니다; 이것을 일반적인 버퍼 입력 모드와 대비하여 cbreak 모드라고 합니다.

@example
curses.cbreak()
@end example

터미널은 일반적으로 커서 키나 Page Up, Home 등의 탐색 키와 같은 특수 키를 멀티 바이트 이스케이프 시퀀스로 반환합니다. 이러한 시퀀스를 예상하고 적절하게 처리하도록 응용 프로그램을 작성할 수는 있지만, curses가 이를 수행하여 @ref{3544,,curses.KEY_LEFT}와 같은 특수 값을 반환할 수 있습니다. curses가 이런 일을 하도록 하려면, 키패드 모드를 활성화해야 합니다.

@example
stdscr.keypad(True)
@end example

curses 응용 프로그램을 종료하는 것은 시작하기보다 훨씬 쉽습니다. 다음과 같이 호출합니다:

@example
curses.nocbreak()
stdscr.keypad(False)
curses.echo()
@end example

curses 친화적인 터미널 설정을 되돌립니다. 그런 다음 @ref{34a9,,endwin()} 함수를 호출하여 터미널을 원래 작동 모드로 복원하십시오.

@example
curses.endwin()
@end example

curses 응용 프로그램을 디버깅할 때 일반적인 문제점은 터미널을 이전 상태로 복원하지 않고 응용 프로그램이 죽을 때 터미널이 엉망이 되는 것입니다. 파이썬에서 코드에 버그가 있고 잡히지 않는 예외를 일으킬 때 흔히 일어납니다. 예를 들어, 키를 입력해도 키가 더는 화면에 표시되지 않아 셸 사용이 어려워집니다.

파이썬에서는 @ref{c72,,curses.wrapper()} 함수를 임포트하고 다음과 같이 사용하여 이러한 복잡성을 피하고 디버깅을 훨씬 쉽게 할 수 있습니다:

@example
from curses import wrapper

def main(stdscr):
    # 화면을 지웁니다
    stdscr.clear()

    # i == 10일 때 ZeroDivisionError를 발생시킵니다.
    for i in range(0, 11):
        v = i-10
        stdscr.addstr(i, 0, '10 divided by @{@} is @{@}'.format(v, 10/v))

        stdscr.refresh()
        stdscr.getkey()

wrapper(main)
@end example

@ref{c72,,wrapper()} 함수는 콜러블 객체를 취하고 위에서 설명한 초기화를 수행합니다, 색상 지원이 있으면 색상도 초기화합니다. 그런 다음 @code{wrapper()}는 제공된 콜러블을 실행합니다. 일단 콜러블이 반환되면, @code{wrapper()}는 터미널의 원래 상태를 복원합니다. 콜러블은 예외를 잡는 @ref{8f7,,try}…@ref{1ab,,except} 내에서 호출되고, 터미널의 상태를 복원한 다음 예외를 다시 발생시킵니다. 따라서 터미널은 예외 상황에서 망가진 상태로 남지 않고 예외 메시지와 트레이스백을 읽을 수 있습니다.

@node 창과 패드,텍스트 표시,curses 응용 프로그램 시작과 종료,파이썬 curses 프로그래밍
@anchor{howto/curses windows-and-pads}@anchor{570a}
@subsection 창과 패드


창은 curses의 기본 추상화입니다. 창 객체는 화면의 사각형 영역을 나타내며, 텍스트를 표시하고, 지우고, 사용자가 문자열을 입력할 수 있도록 하는 등의 메서드를 지원합니다.

@ref{1910,,initscr()} 함수가 반환한 @code{stdscr} 객체는 전체 화면을 덮는 창 객체입니다. 많은 프로그램에서 이 창 하나만 필요할 수도 있지만, 따로 다시 그리거나 지우기 위해 화면을 작은 창으로 나누고 싶을 수 있습니다. @ref{34cb,,newwin()} 함수는 지정된 크기의 새 창을 만들어 새 창 객체를 반환합니다.

@example
begin_x = 20; begin_y = 7
height = 5; width = 40
win = curses.newwin(height, width, begin_y, begin_x)
@end example

curses에 사용된 좌표계는 일반적이지 않음에 주의하십시오. 좌표는 항상 `y,x' 순서로 전달되며, 창의 왼쪽 상단 모서리는 좌표 (0,0) 입니다. 이것은 `x' 좌표가 먼저 오는, 좌표를 다루는 일반적인 규칙을 위반합니다. 이것은 대부분 다른 컴퓨터 응용 프로그램과의 불행한 차이점이지만, 처음 작성된 이후로 curses 일부였으며, 지금 되돌리기에는 너무 늦었습니다.

응용 프로그램은 `y'와 `x' 크기를 얻기 위해 @ref{feb,,curses.LINES}와 @ref{fec,,curses.COLS} 변수를 사용하여 화면 크기를 결정할 수 있습니다. 그러면 유효한 좌표는 @code{(0,0)}에서 @code{(curses.LINES - 1, curses.COLS - 1)}에 이릅니다.

텍스트를 표시하거나 지우기 위해 메서드를 호출할 때, 효과는 즉시 디스플레이에 나타나지 않습니다. 대신 화면을 갱신하기 위해 창 객체의 @ref{34a7,,refresh()} 메서드를 호출해야 합니다.

curses는 원래 300-baud 터미널 연결을 염두에 두고 작성되었기 때문입니다; 이러한 터미널에서는 화면을 다시 그리는 데 필요한 시간을 최소화하는 것이 매우 중요했습니다. 대신 curses는 화면의 변경 사항을 누적하고 @code{refresh()}를 호출할 때 가장 효율적인 방식으로 표시합니다. 예를 들어, 프로그램이 창에 일부 텍스트를 표시한 다음 창을 지우면, 원래 텍스트가 표시되지 않기 때문에 보낼 필요가 없습니다.

실제로는, 창을 다시 그리도록 명시적으로 curses에 지시한다고 해서 curses 프로그래밍이 실제로 복잡해지는 것은 아닙니다. 대부분 프로그램은 복잡한 행동을 한 다음 키 입력이나 사용자의 다른 동작을 기다리기 위해 일시 중지합니다. 여러분이 해야 할 것은 사용자 입력을 기다리기 위해 일시 중지하기 전에 @code{stdscr.refresh()}나 다른 적절한 창의 @code{refresh()} 메서드를 먼저 호출하여 화면을 다시 그리도록 하는 것뿐입니다.

패드(pad)는 창의 특별한 경우입니다; 실제 디스플레이 화면보다 클 수 있으며, 한 번에 패드의 일부만 표시될 수 있습니다. 패드를 만들려면 패드의 높이와 너비가 필요하지만, 패드를 새로 고치려면 패드의 서브 섹션이 표시될 화면 영역의 좌표를 지정해야 합니다.

@example
pad = curses.newpad(100, 100)
# 이 루프는 패드를 글자로 채웁니다; addch()는
# 다음 섹션에서 설명합니다
for y in range(0, 99):
    for x in range(0, 99):
        pad.addch(y,x, ord('a') + (x*x+y*y) % 26)

# 화면 중간에 패드의 섹션을 표시합니다.
# (0,0) : 표시할 패드 영역의 왼쪽 위 모서리 좌표.
# (5,5) : 패드 내용으로 채울 창 영역의 왼쪽 위
#         모서리 좌표.
# (20, 75) : 패드 내용으로 채울 창 영역의 오른쪽 아래
#          : 모서리 좌표.
pad.refresh( 0,0, 5,5, 20,75)
@end example

@code{refresh()} 호출은 화면의 좌표 (5,5)에서 좌표 (20,75) 까지 확장된 사각형에 패드 섹션을 표시합니다; 표시된 섹션의 왼쪽 위 모서리는 패드의 좌표 (0,0) 입니다. 이 차이를 제외하고, 패드는 일반 창과 똑같으며 같은 메서드를 지원합니다.

화면에 여러 개의 창과 패드가 있으면, 화면을 갱신하고 화면의 각 부분이 갱신될 때 성가신 화면 깜박임을 방지하는 더 효율적인 방법이 있습니다. @code{refresh()}는 실제로 두 가지 작업을 수행합니다:


@enumerate 

@item 
각 창의 @ref{34a6,,noutrefresh()} 메서드를 호출하여 원하는 화면 상태를 나타내는 하부 데이터 구조를 갱신합니다.

@item 
@ref{34a4,,doupdate()} 함수를 호출하여 데이터 구조에 기록된 원하는 상태와 일치하도록 물리적 화면을 변경합니다.
@end enumerate

대신 여러 창에서 @code{noutrefresh()}를 호출하여 데이터 구조를 갱신한 다음, @code{doupdate()}를 호출하여 화면을 갱신할 수 있습니다.

@node 텍스트 표시,사용자 입력,창과 패드,파이썬 curses 프로그래밍
@anchor{howto/curses displaying-text}@anchor{570b}
@subsection 텍스트 표시


C 프로그래머의 관점에서 보면, curses는 때때로 모두 조금씩 다른 함수의 미로처럼 보일 수 있습니다. 예를 들어, @code{addstr()}은 @code{stdscr} 창의 현재 커서 위치에 문자열을 표시하고, @code{mvaddstr()}은 문자열을 표시하기 전에 주어진 y,x 좌표로 먼저 이동합니다. @code{waddstr()}은 @code{addstr()}과 비슷하지만, 기본적으로 @code{stdscr}을 사용하는 대신 사용할 창을 지정할 수 있습니다. @code{mvwaddstr()}은 창과 좌표를 모두 지정할 수 있습니다.

다행히 파이썬 인터페이스는 이러한 모든 세부 사항을 숨깁니다. @code{stdscr}은 다른 것과 마찬가지로 창 객체이며, @ref{34a5,,addstr()}과 같은 메서드는 여러 인자 형식을 허용합니다. 일반적으로 네 가지 형식이 있습니다.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

형식

@tab

설명

@item

`str' 또는 `ch'

@tab

현재 위치에 문자열 `str'이나 문자 `ch'를 표시합니다

@item

`str' 또는 `ch', `attr'

@tab

현재 위치에 속성 `attr'을 사용하여 문자열 `str'이나 문자 `ch'를 표시합니다

@item

`y', `x', `str' 또는 `ch'

@tab

창에서 `y,x' 위치로 이동하고, `str'이나 `ch'를 표시합니다

@item

`y', `x', `str' 또는 `ch', `attr'

@tab

창에서 `y,x' 위치로 이동하고, `attr' 속성을 사용하여 `str'이나 `ch'를 표시합니다

@end multitable


속성을 사용하면 굵은 체, 밑줄, 반전 코드 또는 색상과 같은 강조 표시된 형태로 텍스트를 표시할 수 있습니다. 이에 대해서는 다음 서브 섹션에서 자세히 설명합니다.

@ref{34a5,,addstr()} 메서드는 표시할 값으로 파이썬 문자열이나 바이트열을 추합니다. 바이트열의 내용은 그대로 터미널로 전송됩니다. 문자열은 창의 @ref{129b,,encoding} 어트리뷰트 값을 사용하여 바이트열로 인코딩됩니다; 이 어트리뷰트의 기본값은 @ref{329,,locale.getencoding()} 에 의해 반환되는 기본 시스템 인코딩입니다.

@ref{34e6,,addch()} 메서드는 길이가 1인 문자열, 길이가 1인 바이트열 또는 정수일 수 있는 문자를 취합니다.

확장 문자를 위한 상수가 제공됩니다; 이 상수는 255보다 큰 정수입니다. 예를 들어, @ref{35b1,,ACS_PLMINUS}는 +/- 기호이고, @ref{34f0,,ACS_ULCORNER}는 상자의 왼쪽 위 모서리입니다 (경계를 그리기에 편리합니다). 적절한 유니코드 문자를 사용할 수도 있습니다.

창은 마지막 조작 후 커서가 있던 위치를 기억하므로, `y,x' 좌표를 생략하면 마지막 조작이 중단된 위치에 문자열이나 문자가 표시됩니다. @code{move(y,x)} 메서드로 커서를 이동할 수도 있습니다. 일부 터미널은 항상 깜빡이는 커서를 표시하기 때문에, 방해받지 않는 위치에 커서를 놓아야 합니다; 임의의 위치에서 커서가 깜박이는 것은 혼란스러울 수 있습니다.

응용 프로그램에 깜박이는 커서가 전혀 필요하지 않으면, @code{curs_set(False)}를 호출하여 보이지 않게 할 수 있습니다. 이전 curses 버전과의 호환성을 위해, @ref{349e,,curs_set()}과 동의어인 @code{leaveok(bool)} 함수가 있습니다. `bool' 이 참이면, curses 라이브러리는 깜박이는 커서를 억제하려고 시도하고, 커서를 부적절한 위치에 두는 것에 대해 걱정할 필요가 없습니다.

@menu
* 속성과 색상:: 

@end menu

@node 속성과 색상,,,텍스트 표시
@anchor{howto/curses attributes-and-color}@anchor{570c}
@subsubsection 속성과 색상


문자는 다른 방식으로 표시될 수 있습니다. 텍스트 기반 응용 프로그램의 상태 줄(status line)은 일반적으로 반전 비디오로 표시되거나 텍스트 뷰어에서 특정 단어를 강조 표시해야 할 수 있습니다. curses는 화면에 있는 각 셀의 속성을 지정할 수 있도록 하여 이를 지원합니다.

속성은 정수이며, 각 비트는 다른 속성을 나타냅니다. 여러 속성 비트가 설정된 텍스트를 표시하려고 시도 할 수 있지만, curses는 가능한 모든 조합을 사용할 수 있거나 시각적으로 구별됨을 보증하지 않습니다. 사용하는 터미널의 기능에 따라 다르므로, 여기에 나열된 가장 일반적으로 사용 가능한 속성을 고수하는 것이 가장 안전합니다.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

속성

@tab

설명

@item

@ref{3530,,A_BLINK}

@tab

깜박거리는 텍스트

@item

@ref{3531,,A_BOLD}

@tab

매우 밝거나 굵은 텍스트

@item

@ref{3532,,A_DIM}

@tab

절반 밝기의 텍스트

@item

@ref{349c,,A_REVERSE}

@tab

반전 비디오 텍스트

@item

@ref{349b,,A_STANDOUT}

@tab

사용 가능한 최고 강조 표시 모드

@item

@ref{3536,,A_UNDERLINE}

@tab

밑줄이 그어진 텍스트

@end multitable


따라서 화면 상단 줄에 반전 비디오 상태 줄을 표시하려면, 다음과 같이 코딩할 수 있습니다:

@example
stdscr.addstr(0, 0, "Current mode: Typing mode",
              curses.A_REVERSE)
stdscr.refresh()
@end example

curses 라이브러리는 또한 색상을 제공하는 터미널에서 색상을 지원합니다. 이러한 터미널 중 가장 일반적인 터미널은 리눅스 콘솔이고, 그다음은 컬러 xterm입니다.

색상을 사용하려면, @ref{1910,,initscr()}을 호출한 직후 @ref{34d7,,start_color()} 함수를 호출하여, 기본 색상 집합을 초기화해야 합니다 (@ref{c72,,curses.wrapper()} 함수는 이것을 자동으로 수행합니다). 일단 이렇게 하면, @ref{34bc,,has_colors()} 함수는 사용 중인 터미널이 실제로 색상을 표시할 수 있으면 True를 반환합니다. (참고: curses는 캐나다/영국 철자법 ‘colour’ 대신 미국식 철자법 ‘color’를 사용합니다. 영국 철자법에 익숙하다면 이러한 함수를 위해 철자법을 바꾸는 것을 감수해야 합니다.)

curses 라이브러리는 전경(또는 텍스트)색과 배경색을 포함하여 유한한 수의 색 쌍을 유지합니다. @ref{349a,,color_pair()} 함수를 사용하여 색상 쌍에 해당하는 속성값을 얻을 수 있습니다; 이것은 @ref{349c,,A_REVERSE}와 같은 다른 속성과 비트별 OR 될 수 있지만, 다시 한번, 이러한 조합이 모든 터미널에서 작동하는 것은 아닙니다.

색상 쌍 1을 사용하여 텍스트 줄을 표시하는 예:

@example
stdscr.addstr("Pretty text", curses.color_pair(1))
stdscr.refresh()
@end example

앞에서 말했듯이, 색상 쌍은 전경색과 배경색으로 구성됩니다. @code{init_pair(n, f, b)} 함수는 색상 쌍 `n'의 정의를 전경색 f와 배경색 b로 변경합니다. 색상 쌍 0은 검은 배경에 흰 전경으로 강제되어 있으며 변경할 수 없습니다.

색상은 번호가 매겨지며, @ref{34d7,,start_color()}는 색상 모드를 활성화할 때 8가지 기본 색상을 초기화합니다. 0:검정(black), 1:빨강(red), 2:녹색(green), 3:노랑(yellow), 4:파랑(blue), 5:자홍색(magenta), 6:청록색(cyan) 및 7:하양(white) 입니다. @ref{2f,,curses} 모듈은 @ref{35c3,,curses.COLOR_BLACK}, @ref{35c8,,curses.COLOR_RED} 등 각 색상에 대해 이름 붙인 상수를 정의합니다.

이 모든 것을 써봅시다. 색상 1을 흰색 배경의 빨간색 텍스트로 변경하려면, 다음과 같이 호출할 수 있습니다:

@example
curses.init_pair(1, curses.COLOR_RED, curses.COLOR_WHITE)
@end example

색상 쌍을 변경할 때, 해당 색상 쌍을 사용하여 이미 표시된 텍스트가 새 색상으로 변경됩니다. 이 색상으로 새 텍스트를 표시 할 수도 있습니다:

@example
stdscr.addstr(0,0, "RED ALERT!", curses.color_pair(1))
@end example

매우 멋진 터미널은 실제 색상의 정의를 주어진 RGB 값으로 변경할 수 있습니다. 이를 통해 일반적으로 빨간색인 색상 1을 보라색이나 파란색 또는 원하는 어떤 색상으로도 변경할 수 있습니다. 불행히도, 리눅스 콘솔은 이것을 지원하지 않아서, 저는 시도해 볼 수 없고 예제를 제공할 수 없습니다. @ref{3497,,can_change_color()}를 호출하여 여러분의 터미널이 이를 수행 할 수 있는지를 확인할 수 있습니다. 기능이 있으면 @code{True}를 반환합니다. 이러한 재능있는 터미널을 보유할 만큼 운이 좋다면, 자세한 내용은 시스템 매뉴얼 페이지를 참조하십시오.

@node 사용자 입력,추가 정보,텍스트 표시,파이썬 curses 프로그래밍
@anchor{howto/curses user-input}@anchor{570d}
@subsection 사용자 입력


C curses 라이브러리는 매우 간단한 입력 메커니즘만 제공합니다. 파이썬의 @ref{2f,,curses} 모듈은 기본 텍스트 입력 위젯을 추가합니다. (Urwid@footnote{https://pypi.org/project/Urwid/}와 같은 다른 라이브러리에는 더 광범위한 위젯 모음이 있습니다.)

창에서 입력을 얻는 메서드는 두 가지가 있습니다.:


@itemize *

@item 
@ref{1828,,getch()}는 화면을 새로 고친 다음 사용자가 키를 누를 때까지 기다립니다. @ref{34a8,,echo()}가 이전에 호출되었으면 키를 표시합니다. 일시 정지하기 전에 커서를 이동시킬 좌표를 선택적으로 지정할 수 있습니다.

@item 
@ref{3504,,getkey()}는 같은 작업을 수행하지만, 정수를 문자열로 변환합니다. 개별 문자는 1-문자 문자열로 반환되며, 기능 키와 같은 특수키는 @code{KEY_UP}이나 @code{^G}와 같은 키 이름을 포함하는 더 긴 문자열을 반환합니다.
@end itemize

@ref{3518,,nodelay()} 창 메서드를 사용하여 사용자를 기다리지 않을 수 있습니다. @code{nodelay(True)} 이후에는, 창의 @code{getch()}와 @code{getkey()}가 블로킹 되지 않습니다. 입력이 준비되지 않았다는 신호를 보내기 위해 @code{getch()}는 @code{curses.ERR}(-1 값)을 반환하고 @code{getkey()}는 예외를 발생시킵니다. @ref{34c0,,halfdelay()} 함수도 있는데, 각 @code{getch()}에 (효과적으로) 타이머를 설정하는 데 사용할 수 있습니다; 지정된 지연 시간 (10분의 1초로 측정됩니다) 내에 입력이 없으면 curses는 예외를 발생시킵니다.

@code{getch()} 메서드는 정수를 반환합니다; 0에서 255 사이이면, 누른 키의 ASCII 코드를 나타냅니다. 255보다 큰 값은 Page Up, Home 또는 커서 키와 같은 특수 키입니다. 반환 값을 @ref{3555,,curses.KEY_PPAGE}, @ref{3546,,curses.KEY_HOME} 또는 @ref{3544,,curses.KEY_LEFT}와 같은 상수와 비교할 수 있습니다. 프로그램의 메인 루프는 이런 식입니다:

@example
while True:
    c = stdscr.getch()
    if c == ord('p'):
        PrintDocument()
    elif c == ord('q'):
        break  # while 루프를 종료합니다
    elif c == curses.KEY_HOME:
        x = y = 0
@end example

@ref{30,,curses.ascii} 모듈은 정수나 1문자 문자열 인자를 취하는 ASCII 클래스 멤버십 함수를 제공합니다; 이러한 루프에서 더 읽기 쉬운 검사를 작성하는 데 유용 할 수 있습니다. 이것은 또한 정수나 1문자 문자열 인자를 취하고 같은 유형을 반환하는 변환 함수를 제공합니다. 예를 들어, @ref{360b,,curses.ascii.ctrl()}은 인자에 해당하는 제어 문자를 반환합니다.

전체 문자열을 꺼내는 메서드도 있습니다, @ref{1840,,getstr()}. 기능이 상당히 제한되어 있기 때문에 자주 사용되지 않습니다; 사용 가능한 편집 키는 백스페이스키와 문자열을 종료하는 Enter 키뿐입니다. 고정된 수의 문자로 선택적으로 제한될 수 있습니다.

@example
curses.echo()            # 문자 에코를 활성화합니다

# 커서를 맨 윗줄에 놓고 15자 문자열을 가져옵니다
s = stdscr.getstr(0,0, 15)
@end example

@ref{32,,curses.textpad} 모듈은 Emacs와 같은 키 바인딩 집합을 지원하는 텍스트 상자를 제공합니다. @ref{35cc,,Textbox} 클래스의 다양한 메서드는 입력 유효성 검증을 사용한 편집과 후행 공백이 있거나 없는 편집 결과 수집을 지원합니다. 예를 들면 다음과 같습니다:

@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)

    # Ctrl-G를 칠 때까지 사용자가 편집하도록 합니다.
    box.edit()

    # 결과 내용물을 얻습니다
    message = box.gather()
@end example

자세한 내용은 @ref{32,,curses.textpad}의 라이브러리 설명서를 참조하십시오.

@node 추가 정보,,사용자 입력,파이썬 curses 프로그래밍
@anchor{howto/curses for-more-information}@anchor{570e}
@subsection 추가 정보


이 HOWTO는 화면의 내용을 읽거나 xterm 인스턴스에서 마우스 이벤트를 캡처하는 등의 고급 주제를 다루지 않지만, @ref{2f,,curses} 모듈의 파이썬 라이브러리 페이지는 이제 어느 정도 완전합니다. 다음으로 그 페이지를 보십시오.

curses 함수의 자세한 동작에 대해 확신이 없으면, curses 구현(ncurses이건 독점 유닉스 벤더의 것이건)에 대한 매뉴얼 페이지를 참조하십시오. 매뉴얼 페이지는 모든 뒤틀림(quirks)을 문서화하고, 사용 가능한 모든 함수, 속성 및 @ref{359d,,ACS_*} 문자의 전체 목록을 제공합니다.

curses API가 아주 크기 때문에, 일부 함수는 파이썬 인터페이스에서 지원되지 않습니다. 종종 구현하기가 어렵기 때문이 아니라, 아직 아무도 원하지 않았기 때문입니다. 또한, 파이썬은 ncurses와 관련된 메뉴 라이브러리를 아직 지원하지 않습니다. 이들에 대한 지원을 추가하는 패치를 환영합니다; 파이썬에 패치를 제출하는 방법에 대한 자세한 내용은 파이썬 개발자 지침서@footnote{https://devguide.python.org/}를 참조하십시오.


@itemize *

@item 
Writing Programs with NCURSES@footnote{https://invisible-island.net/ncurses/ncurses-intro.html}: C 프로그래머를 위한 긴 자습서.

@item 
ncurses 매뉴얼 페이지@footnote{https://linux.die.net/man/3/ncurses}

@item 
The ncurses FAQ@footnote{https://invisible-island.net/ncurses/ncurses.faq.html}

@item 
"Use curses... don't swear"@footnote{https://www.youtube.com/watch?v=eN1eZtjLEnU}: curses나 Urwid를 사용하여 터미널을 제어하는 PyCon 2013 발표 비디오.

@item 
"Console Applications with Urwid"@footnote{https://pyvideo.org/video/1568/console-applications-with-urwid}: Urwid를 사용하여 작성된 몇몇 응용 프로그램을 보여주는 PyCon CA 2012 발표 비디오.
@end itemize

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Descriptor Guide,Debugging C API extensions and CPython Internals with GDB,파이썬 curses 프로그래밍,파이썬 HOWTO
@anchor{howto/descriptor doc}@anchor{570f}@anchor{howto/descriptor descriptor-guide}@anchor{5710}@anchor{howto/descriptor descriptorhowto}@anchor{16f2}@anchor{howto/descriptor translation-repo}@anchor{5711}
@section Descriptor Guide


@*저자: 
Raymond Hettinger


@*연락처: 
<python at rcn dot com>


@ref{1884,,디스크립터}는 객체가 어트리뷰트 조회, 저장 및 삭제를 사용자 정의 할 수 있도록 합니다.

이 지침서는 네 개의 주요 섹션으로 구성됩니다:


@enumerate 

@item 
“입문”은 간단한 예제에서 부드럽게 이동하여 한 번에 하나의 기능을 추가하는 기본 개요를 제공합니다. 디스크립터를 처음 사용하면 여기에서 시작하세요.

@item 
두 번째 섹션은 완전하고 실용적인 디스크립터 예제를 보여줍니다. 이미 기본 사항을 알고 있다면, 여기에서 시작하십시오.

@item 
세 번째 섹션에서는 디스크립터가 작동하는 방식에 대한 자세한 메커니즘에 관해 설명하는 더 기술적인 자습서를 제공합니다. 대부분의 사람은 이러한 수준의 세부 정보가 필요하지 않습니다.

@item 
마지막 섹션에는 C로 작성된 내장 디스크립터에 대한 순수한 파이썬 등가물이 있습니다. 함수가 연결된 메서드로 바뀌는 방법이나 @ref{48f,,classmethod()}, @ref{453,,staticmethod()}, @ref{4b3,,property()} 및 @ref{7f6,,__slots__}와 같은 일반적인 도구의 구현에 대해 궁금하면 이 문서를 읽으십시오.
@end enumerate

@menu
* 입문:: 
* 완전한 실용적인 예:: 
* 기술적인 자습서:: 
* 순수한 파이썬 등가물:: 

@end menu

@node 입문,완전한 실용적인 예,,Descriptor Guide
@anchor{howto/descriptor primer}@anchor{5712}
@subsection 입문


이 입문서에서는, 가능한 가장 기본적인 예제로 시작한 다음 새로운 기능을 하나씩 추가할 것입니다.

@menu
* 간단한 예; 상수를 반환하는 디스크립터: 간단한 예 상수를 반환하는 디스크립터. 
* 동적 조회:: 
* 관리되는 어트리뷰트:: 
* 사용자 정의 이름:: 
* 마무리 생각:: 

@end menu

@node 간단한 예 상수를 반환하는 디스크립터,동적 조회,,입문
@anchor{howto/descriptor simple-example-a-descriptor-that-returns-a-constant}@anchor{5713}
@subsubsection 간단한 예: 상수를 반환하는 디스크립터


The @code{Ten} class is a descriptor whose @ref{16ed,,__get__()} method always
returns the constant @code{10}:

@example
class Ten:
    def __get__(self, obj, objtype=None):
        return 10
@end example

디스크립터를 사용하려면, 다른 클래스에 클래스 변수로 저장해야 합니다:

@example
class A:
    x = 5                       # Regular class attribute
    y = Ten()                   # Descriptor instance
@end example

대화 형 세션은 일반 어트리뷰트 조회와 디스크립터 조회의 차이점을 보여줍니다:

@example
>>> a = A()                     # Make an instance of class A
>>> a.x                         # Normal attribute lookup
5
>>> a.y                         # Descriptor lookup
10
@end example

In the @code{a.x} attribute lookup, the dot operator finds @code{'x': 5}
in the class dictionary.  In the @code{a.y} lookup, the dot operator
finds a descriptor instance, recognized by its @code{__get__} method.
Calling that method returns @code{10}.

@code{10} 값이 클래스 딕셔너리나 인스턴스 딕셔너리에 저장되지 않음에 유의하십시오. 대신, @code{10} 값은 요청 시 계산됩니다.

이 예는 간단한 디스크립터가 어떻게 작동하는지 보여 주지만, 그다지 유용하지는 않습니다. 상수를 꺼내려면, 일반 어트리뷰트 조회가 더 좋습니다.

다음 섹션에서는, 좀 더 유용한 동적 조회를 만들 것입니다.

@node 동적 조회,관리되는 어트리뷰트,간단한 예 상수를 반환하는 디스크립터,입문
@anchor{howto/descriptor dynamic-lookups}@anchor{5714}
@subsubsection 동적 조회


흥미로운 디스크립터는 보통 상수를 반환하는 대신 계산을 실행합니다:

@example
import os

class DirectorySize:

    def __get__(self, obj, objtype=None):
        return len(os.listdir(obj.dirname))

class Directory:

    size = DirectorySize()              # Descriptor instance

    def __init__(self, dirname):
        self.dirname = dirname          # Regular instance attribute
@end example

대화 형 세션은 조회가 동적임을 보여줍니다 - 매번 다른 갱신된 답변을 계산합니다:

@example
>>> s = Directory('songs')
>>> g = Directory('games')
>>> s.size                              # The songs directory has twenty files
20
>>> g.size                              # The games directory has three files
3
>>> os.remove('games/chess')            # Delete a game
>>> g.size                              # File count is automatically updated
2
@end example

Besides showing how descriptors can run computations, this example also
reveals the purpose of the parameters to @ref{16ed,,__get__()}.  The `self'
parameter is `size', an instance of `DirectorySize'.  The `obj' parameter is
either `g' or `s', an instance of `Directory'.  It is the `obj' parameter that
lets the @code{__get__()} method learn the target directory.  The `objtype'
parameter is the class `Directory'.

@node 관리되는 어트리뷰트,사용자 정의 이름,동적 조회,입문
@anchor{howto/descriptor managed-attributes}@anchor{5715}
@subsubsection 관리되는 어트리뷰트


A popular use for descriptors is managing access to instance data.  The
descriptor is assigned to a public attribute in the class dictionary while the
actual data is stored as a private attribute in the instance dictionary.  The
descriptor’s @ref{16ed,,__get__()} and @ref{23b5,,__set__()} methods are triggered when
the public attribute is accessed.

다음 예에서, `age'는 공용 어트리뷰트이고 `_age'는 개인 어트리뷰트입니다. 공용 어트리뷰트에 액세스하면, 디스크립터는 조회나 갱신을 로그 합니다:

@example
import logging

logging.basicConfig(level=logging.INFO)

class LoggedAgeAccess:

    def __get__(self, obj, objtype=None):
        value = obj._age
        logging.info('Accessing %r giving %r', 'age', value)
        return value

    def __set__(self, obj, value):
        logging.info('Updating %r to %r', 'age', value)
        obj._age = value

class Person:

    age = LoggedAgeAccess()             # Descriptor instance

    def __init__(self, name, age):
        self.name = name                # Regular instance attribute
        self.age = age                  # Calls __set__()

    def birthday(self):
        self.age += 1                   # Calls both __get__() and __set__()
@end example

대화 형 세션은 관리되는 어트리뷰트 `age'에 대한 모든 액세스가 로그 되지만, 일반 어트리뷰트 `name'은 로그 되지 않음을 보여줍니다:

@c import logging, sys
@c logging.basicConfig(level=logging.INFO, stream=sys.stdout, force=True)

@example
>>> mary = Person('Mary M', 30)         # The initial age update is logged
INFO:root:Updating 'age' to 30
>>> dave = Person('David D', 40)
INFO:root:Updating 'age' to 40

>>> vars(mary)                          # The actual data is in a private attribute
@{'name': 'Mary M', '_age': 30@}
>>> vars(dave)
@{'name': 'David D', '_age': 40@}

>>> mary.age                            # Access the data and log the lookup
INFO:root:Accessing 'age' giving 30
30
>>> mary.birthday()                     # Updates are logged as well
INFO:root:Accessing 'age' giving 30
INFO:root:Updating 'age' to 31

>>> dave.name                           # Regular attribute lookup isn't logged
'David D'
>>> dave.age                            # Only the managed attribute is logged
INFO:root:Accessing 'age' giving 40
40
@end example

이 예제의 한 가지 주요 문제는 개인 이름 `_age'가 `LoggedAgeAccess' 클래스에 고정되어 있다는 것입니다. 즉, 각 인스턴스는 하나의 로그 되는 어트리뷰트 만 가질 수 있으며 해당 이름을 변경할 수 없습니다. 다음 예에서는, 이 문제를 수정합니다.

@node 사용자 정의 이름,마무리 생각,관리되는 어트리뷰트,입문
@anchor{howto/descriptor customized-names}@anchor{5716}
@subsubsection 사용자 정의 이름


클래스가 디스크립터를 사용할 때, 어떤 변수 이름이 사용되었는지 각 디스크립터에 알릴 수 있습니다.

In this example, the @code{Person} class has two descriptor instances,
`name' and `age'.  When the @code{Person} class is defined, it makes a
callback to @ref{e47,,__set_name__()} in `LoggedAccess' so that the field names can
be recorded, giving each descriptor its own `public_name' and `private_name':

@example
import logging

logging.basicConfig(level=logging.INFO)

class LoggedAccess:

    def __set_name__(self, owner, name):
        self.public_name = name
        self.private_name = '_' + name

    def __get__(self, obj, objtype=None):
        value = getattr(obj, self.private_name)
        logging.info('Accessing %r giving %r', self.public_name, value)
        return value

    def __set__(self, obj, value):
        logging.info('Updating %r to %r', self.public_name, value)
        setattr(obj, self.private_name, value)

class Person:

    name = LoggedAccess()                # First descriptor instance
    age = LoggedAccess()                 # Second descriptor instance

    def __init__(self, name, age):
        self.name = name                 # Calls the first descriptor
        self.age = age                   # Calls the second descriptor

    def birthday(self):
        self.age += 1
@end example

An interactive session shows that the @code{Person} class has called
@ref{e47,,__set_name__()} so that the field names would be recorded.  Here
we call @ref{1e1f,,vars()} to look up the descriptor without triggering it:

@example
>>> vars(vars(Person)['name'])
@{'public_name': 'name', 'private_name': '_name'@}
>>> vars(vars(Person)['age'])
@{'public_name': 'age', 'private_name': '_age'@}
@end example

이제 새 클래스는 `name'과 `age' 모두에 대한 액세스를 로그 합니다:

@c import logging, sys
@c logging.basicConfig(level=logging.INFO, stream=sys.stdout, force=True)

@example
>>> pete = Person('Peter P', 10)
INFO:root:Updating 'name' to 'Peter P'
INFO:root:Updating 'age' to 10
>>> kate = Person('Catherine C', 20)
INFO:root:Updating 'name' to 'Catherine C'
INFO:root:Updating 'age' to 20
@end example

두 개의 `Person' 인스턴스에는 개인 이름만 포함됩니다:

@example
>>> vars(pete)
@{'_name': 'Peter P', '_age': 10@}
>>> vars(kate)
@{'_name': 'Catherine C', '_age': 20@}
@end example

@node 마무리 생각,,사용자 정의 이름,입문
@anchor{howto/descriptor closing-thoughts}@anchor{5717}
@subsubsection 마무리 생각


A @ref{1884,,descriptor} is what we call any object that defines @ref{16ed,,__get__()},
@ref{23b5,,__set__()}, or @ref{1950,,__delete__()}.

Optionally, descriptors can have a @ref{e47,,__set_name__()} method.  This is only
used in cases where a descriptor needs to know either the class where it was
created or the name of class variable it was assigned to.  (This method, if
present, is called even if the class is not a descriptor.)

Descriptors get invoked by the dot operator during attribute lookup.  If a
descriptor is accessed indirectly with @code{vars(some_class)[descriptor_name]},
the descriptor instance is returned without invoking it.

디스크립터는 클래스 변수로 사용될 때만 작동합니다. 인스턴스에 넣으면, 효과가 없습니다.

디스크립터의 주요 동기는 클래스 변수에 저장된 객체가 어트리뷰트 조회 중에 발생하는 일을 제어 할 수 있도록 하는 훅을 제공하는 것입니다.

전통적으로, 호출하는 클래스가 조회 중에 어떤 일이 일어날지 제어합니다. 디스크립터는 그 관계를 역전시키고 조회 중인 데이터가 발언권을 갖도록 합니다.

디스크립터는 언어 전체에서 사용됩니다. 함수가 연결된 메서드로 바뀌는 방법입니다. @ref{48f,,classmethod()}, @ref{453,,staticmethod()}, @ref{4b3,,property()} 및 @ref{762,,functools.cached_property()}와 같은 일반적인 도구는 모두 디스크립터로 구현됩니다.

@node 완전한 실용적인 예,기술적인 자습서,입문,Descriptor Guide
@anchor{howto/descriptor complete-practical-example}@anchor{5718}
@subsection 완전한 실용적인 예


이 예에서는, 찾기가 매우 어려운 것으로 악명 높은 데이터 손상 버그의 위치를 찾기 위한 실용적이고 강력한 도구를 만듭니다.

@menu
* 유효성 검사기 클래스:: 
* 사용자 정의 유효성 검사기:: 
* 실용적인 응용:: 

@end menu

@node 유효성 검사기 클래스,사용자 정의 유효성 검사기,,완전한 실용적인 예
@anchor{howto/descriptor validator-class}@anchor{5719}
@subsubsection 유효성 검사기 클래스


유효성 검사기는 관리되는 어트리뷰트 액세스를 위한 디스크립터입니다. 데이터를 저장하기 전에, 새 값이 다양한 형과 범위 제한을 충족하는지 확인합니다. 이러한 제한 사항이 충족되지 않으면, 데이터 손상을 방지하기 위해 원천에서 예외가 발생합니다.

This @code{Validator} class is both an @ref{13bb,,abstract base class} and a
managed attribute descriptor:

@example
from abc import ABC, abstractmethod

class Validator(ABC):

    def __set_name__(self, owner, name):
        self.private_name = '_' + name

    def __get__(self, obj, objtype=None):
        return getattr(obj, self.private_name)

    def __set__(self, obj, value):
        self.validate(value)
        setattr(obj, self.private_name, value)

    @@abstractmethod
    def validate(self, value):
        pass
@end example

Custom validators need to inherit from @code{Validator} and must supply a
@code{validate()} method to test various restrictions as needed.

@node 사용자 정의 유효성 검사기,실용적인 응용,유효성 검사기 클래스,완전한 실용적인 예
@anchor{howto/descriptor custom-validators}@anchor{571a}
@subsubsection 사용자 정의 유효성 검사기


다음은 세 가지 실용적인 데이터 유효성 검사 유틸리티입니다:


@enumerate 

@item 
@code{OneOf} verifies that a value is one of a restricted set of options.

@item 
@code{Number} verifies that a value is either an @ref{19b,,int} or
@ref{196,,float}.  Optionally, it verifies that a value is between a given
minimum or maximum.

@item 
@code{String} verifies that a value is a @ref{169,,str}.  Optionally, it
validates a given minimum or maximum length.  It can validate a
user-defined predicate@footnote{https://en.wikipedia.org/wiki/Predicate_(mathematical_logic)} as well.
@end enumerate

@example
class OneOf(Validator):

    def __init__(self, *options):
        self.options = set(options)

    def validate(self, value):
        if value not in self.options:
            raise ValueError(
                f'Expected @{value!r@} to be one of @{self.options!r@}'
            )

class Number(Validator):

    def __init__(self, minvalue=None, maxvalue=None):
        self.minvalue = minvalue
        self.maxvalue = maxvalue

    def validate(self, value):
        if not isinstance(value, (int, float)):
            raise TypeError(f'Expected @{value!r@} to be an int or float')
        if self.minvalue is not None and value < self.minvalue:
            raise ValueError(
                f'Expected @{value!r@} to be at least @{self.minvalue!r@}'
            )
        if self.maxvalue is not None and value > self.maxvalue:
            raise ValueError(
                f'Expected @{value!r@} to be no more than @{self.maxvalue!r@}'
            )

class String(Validator):

    def __init__(self, minsize=None, maxsize=None, predicate=None):
        self.minsize = minsize
        self.maxsize = maxsize
        self.predicate = predicate

    def validate(self, value):
        if not isinstance(value, str):
            raise TypeError(f'Expected @{value!r@} to be a str')
        if self.minsize is not None and len(value) < self.minsize:
            raise ValueError(
                f'Expected @{value!r@} to be no smaller than @{self.minsize!r@}'
            )
        if self.maxsize is not None and len(value) > self.maxsize:
            raise ValueError(
                f'Expected @{value!r@} to be no bigger than @{self.maxsize!r@}'
            )
        if self.predicate is not None and not self.predicate(value):
            raise ValueError(
                f'Expected @{self.predicate@} to be true for @{value!r@}'
            )
@end example

@node 실용적인 응용,,사용자 정의 유효성 검사기,완전한 실용적인 예
@anchor{howto/descriptor practical-application}@anchor{571b}
@subsubsection 실용적인 응용


실제 클래스에서 데이터 유효성 검사기를 사용하는 방법은 다음과 같습니다:

@example
class Component:

    name = String(minsize=3, maxsize=10, predicate=str.isupper)
    kind = OneOf('wood', 'metal', 'plastic')
    quantity = Number(minvalue=0)

    def __init__(self, name, kind, quantity):
        self.name = name
        self.kind = kind
        self.quantity = quantity
@end example

디스크립터는 잘못된 인스턴스가 만들어지는 것을 방지합니다:

@example
>>> Component('Widget', 'metal', 5)      # Blocked: 'Widget' is not all uppercase
Traceback (most recent call last):
    ...
ValueError: Expected <method 'isupper' of 'str' objects> to be true for 'Widget'

>>> Component('WIDGET', 'metle', 5)      # Blocked: 'metle' is misspelled
Traceback (most recent call last):
    ...
ValueError: Expected 'metle' to be one of @{'metal', 'plastic', 'wood'@}

>>> Component('WIDGET', 'metal', -5)     # Blocked: -5 is negative
Traceback (most recent call last):
    ...
ValueError: Expected -5 to be at least 0

>>> Component('WIDGET', 'metal', 'V')    # Blocked: 'V' isn't a number
Traceback (most recent call last):
    ...
TypeError: Expected 'V' to be an int or float

>>> c = Component('WIDGET', 'metal', 5)  # Allowed:  The inputs are valid
@end example

@node 기술적인 자습서,순수한 파이썬 등가물,완전한 실용적인 예,Descriptor Guide
@anchor{howto/descriptor technical-tutorial}@anchor{571c}
@subsection 기술적인 자습서


다음은 디스크립터의 작동 원리와 세부 사항에 대한 더 기술적인 자습서입니다.

@menu
* 요약:: 
* 정의와 소개:: 
* 디스크립터 프로토콜:: 
* 디스크립터 호출의 개요:: 
* 인스턴스에서 호출:: 
* 클래스에서 호출:: 
* super에서 호출:: 
* 호출 로직 요약:: 
* 자동 이름 알림:: 
* ORM 예제:: 

@end menu

@node 요약,정의와 소개,,기술적인 자습서
@anchor{howto/descriptor abstract}@anchor{571d}
@subsubsection 요약


디스크립터를 정의하고, 프로토콜을 요약하며 디스크립터를 호출하는 방법을 보여줍니다. 객체 관계형 매핑(object relational mappings)이 작동하는 방식을 보여주는 예를 제공합니다.

디스크립터에 대한 학습은 더 큰 도구 집합에 대한 액세스를 제공할 뿐만 아니라, 파이썬의 작동 방식에 대한 심층적인 이해를 만듭니다.

@node 정의와 소개,디스크립터 프로토콜,요약,기술적인 자습서
@anchor{howto/descriptor definition-and-introduction}@anchor{571e}
@subsubsection 정의와 소개


In general, a descriptor is an attribute value that has one of the methods in
the descriptor protocol.  Those methods are @ref{16ed,,__get__()}, @ref{23b5,,__set__()},
and @ref{1950,,__delete__()}.  If any of those methods are defined for an
attribute, it is said to be a @ref{1884,,descriptor}.

어트리뷰트 액세스의 기본 동작은 객체의 딕셔너리에서 어트리뷰트를 가져오거나(get) 설정하거나(set) 삭제하는(delete) 것입니다. 예를 들어, @code{a.x}는 @code{a.__dict__['x']}로 시작한 다음 @code{type(a).__dict__['x']}를 거쳐, @code{type(a)}의 메서드 결정 순서로 계속되는 조회 체인을 갖습니다. 조회된 값이 디스크립터 메서드 중 하나를 정의하는 객체이면, 파이썬은 기본 동작을 대체하고 대신 디스크립터 메서드를 호출 할 수 있습니다. 우선순위 체인에서 이것이 어디쯤 등장하는지는 어떤 디스크립터 메서드가 정의되었는지에 따라 다릅니다.

Descriptors are a powerful, general purpose protocol.  They are the mechanism
behind properties, methods, static methods, class methods, and
@ref{1a6,,super()}.  They are used throughout Python itself.  Descriptors
simplify the underlying C code and offer a flexible set of new tools for
everyday Python programs.

@node 디스크립터 프로토콜,디스크립터 호출의 개요,정의와 소개,기술적인 자습서
@anchor{howto/descriptor descriptor-protocol}@anchor{571f}
@subsubsection 디스크립터 프로토콜


@code{descr.__get__(self, obj, type=None)}

@code{descr.__set__(self, obj, value)}

@code{descr.__delete__(self, obj)}

이것이 전부입니다. 이러한 메서드 중 하나를 정의하십시오, 그러면 객체를 디스크립터로 간주하고 어트리뷰트로 조회될 때 기본 동작을 재정의할 수 있습니다.

If an object defines @ref{23b5,,__set__()} or @ref{1950,,__delete__()}, it is considered
a data descriptor.  Descriptors that only define @ref{16ed,,__get__()} are called
non-data descriptors (they are often used for methods but other uses are
possible).

데이터와 비 데이터 디스크립터는 인스턴스 딕셔너리의 항목과 관련하여 재정의가 계산되는 방식이 다릅니다. 인스턴스 딕셔너리에 데이터 디스크립터와 이름이 같은 항목이 있으면, 데이터 디스크립터가 우선합니다. 인스턴스의 딕셔너리에 비 데이터 디스크립터와 이름이 같은 항목이 있으면, 딕셔너리 항목이 우선합니다.

To make a read-only data descriptor, define both @ref{16ed,,__get__()} and
@ref{23b5,,__set__()} with the @code{__set__()} raising an @ref{5ee,,AttributeError} when
called.  Defining the @code{__set__()} method with an exception raising
placeholder is enough to make it a data descriptor.

@node 디스크립터 호출의 개요,인스턴스에서 호출,디스크립터 프로토콜,기술적인 자습서
@anchor{howto/descriptor overview-of-descriptor-invocation}@anchor{5720}
@subsubsection 디스크립터 호출의 개요


디스크립터는 @code{desc.__get__(obj)}나 @code{desc.__get__(None, cls)}로 직접 호출 할 수 있습니다.

하지만 어트리뷰트 액세스 시 디스크립터가 자동으로 호출되는 것이 더 일반적입니다.

The expression @code{obj.x} looks up the attribute @code{x} in the chain of
namespaces for @code{obj}.  If the search finds a descriptor outside of the
instance @ref{77c,,__dict__}, its @ref{16ed,,__get__()} method is
invoked according to the precedence rules listed below.

호출 세부 사항은 @code{obj}가 객체, 클래스 혹은 super의 인스턴스인지에 따라 다릅니다.

@node 인스턴스에서 호출,클래스에서 호출,디스크립터 호출의 개요,기술적인 자습서
@anchor{howto/descriptor invocation-from-an-instance}@anchor{5721}
@subsubsection 인스턴스에서 호출


Instance lookup scans through a chain of namespaces giving data descriptors
the highest priority, followed by instance variables, then non-data
descriptors, then class variables, and lastly @ref{6f9,,__getattr__()} if it is
provided.

@code{a.x}에 대한 디스크립터가 발견되면, @code{desc.__get__(a, type(a))}로 호출됩니다.

점 조회의 로직은 @ref{dca,,object.__getattribute__()}에 있습니다. 다음은 순수한 파이썬 등가물입니다:

@example
def find_name_in_mro(cls, name, default):
    "Emulate _PyType_Lookup() in Objects/typeobject.c"
    for base in cls.__mro__:
        if name in vars(base):
            return vars(base)[name]
    return default

def object_getattribute(obj, name):
    "Emulate PyObject_GenericGetAttr() in Objects/object.c"
    null = object()
    objtype = type(obj)
    cls_var = find_name_in_mro(objtype, name, null)
    descr_get = getattr(type(cls_var), '__get__', null)
    if descr_get is not null:
        if (hasattr(type(cls_var), '__set__')
            or hasattr(type(cls_var), '__delete__')):
            return descr_get(cls_var, obj, objtype)     # data descriptor
    if hasattr(obj, '__dict__') and name in vars(obj):
        return vars(obj)[name]                          # instance variable
    if descr_get is not null:
        return descr_get(cls_var, obj, objtype)         # non-data descriptor
    if cls_var is not null:
        return cls_var                                  # class variable
    raise AttributeError(name)
@end example

@c # Test the fidelity of object_getattribute() by comparing it with the
@c # normal object.__getattribute__().  The former will be accessed by
@c # square brackets and the latter by the dot operator.
@c 
@c class Object:
@c 
@c     def __getitem__(obj, name):
@c         try:
@c             return object_getattribute(obj, name)
@c         except AttributeError:
@c             if not hasattr(type(obj), '__getattr__'):
@c                 raise
@c         return type(obj).__getattr__(obj, name)             # __getattr__
@c 
@c class DualOperator(Object):
@c 
@c     x = 10
@c 
@c     def __init__(self, z):
@c         self.z = z
@c 
@c     @property
@c     def p2(self):
@c         return 2 * self.x
@c 
@c     @property
@c     def p3(self):
@c         return 3 * self.x
@c 
@c     def m5(self, y):
@c         return 5 * y
@c 
@c     def m7(self, y):
@c         return 7 * y
@c 
@c     def __getattr__(self, name):
@c         return ('getattr_hook', self, name)
@c 
@c class DualOperatorWithSlots:
@c 
@c     __getitem__ = Object.__getitem__
@c 
@c     __slots__ = ['z']
@c 
@c     x = 15
@c 
@c     def __init__(self, z):
@c         self.z = z
@c 
@c     @property
@c     def p2(self):
@c         return 2 * self.x
@c 
@c     def m5(self, y):
@c         return 5 * y
@c 
@c     def __getattr__(self, name):
@c         return ('getattr_hook', self, name)
@c 
@c class D1:
@c     def __get__(self, obj, objtype=None):
@c         return type(self), obj, objtype
@c 
@c class U1:
@c     x = D1()
@c 
@c class U2(U1):
@c     pass

@c >>> a = DualOperator(11)
@c >>> vars(a).update(p3 = '_p3', m7 = '_m7')
@c >>> a.x == a['x'] == 10
@c True
@c >>> a.z == a['z'] == 11
@c True
@c >>> a.p2 == a['p2'] == 20
@c True
@c >>> a.p3 == a['p3'] == 30
@c True
@c >>> a.m5(100) == a.m5(100) == 500
@c True
@c >>> a.m7 == a['m7'] == '_m7'
@c True
@c >>> a.g == a['g'] == ('getattr_hook', a, 'g')
@c True
@c 
@c >>> b = DualOperatorWithSlots(22)
@c >>> b.x == b['x'] == 15
@c True
@c >>> b.z == b['z'] == 22
@c True
@c >>> b.p2 == b['p2'] == 30
@c True
@c >>> b.m5(200) == b['m5'](200) == 1000
@c True
@c >>> b.g == b['g'] == ('getattr_hook', b, 'g')
@c True
@c 
@c >>> u2 = U2()
@c >>> object_getattribute(u2, 'x') == u2.x == (D1, u2, U2)
@c True

Note, there is no @ref{6f9,,__getattr__()} hook in the @ref{dca,,__getattribute__()}
code.  That is why calling @code{__getattribute__()} directly or with
@code{super().__getattribute__} will bypass @code{__getattr__()} entirely.

Instead, it is the dot operator and the @ref{dc9,,getattr()} function that are
responsible for invoking @ref{6f9,,__getattr__()} whenever @ref{dca,,__getattribute__()}
raises an @ref{5ee,,AttributeError}.  Their logic is encapsulated in a helper
function:

@example
def getattr_hook(obj, name):
    "Emulate slot_tp_getattr_hook() in Objects/typeobject.c"
    try:
        return obj.__getattribute__(name)
    except AttributeError:
        if not hasattr(type(obj), '__getattr__'):
            raise
    return type(obj).__getattr__(obj, name)             # __getattr__
@end example

@c >>> class ClassWithGetAttr:
@c ...     x = 123
@c ...     def __getattr__(self, attr):
@c ...         return attr.upper()
@c ...
@c >>> cw = ClassWithGetAttr()
@c >>> cw.y = 456
@c >>> getattr_hook(cw, 'x')
@c 123
@c >>> getattr_hook(cw, 'y')
@c 456
@c >>> getattr_hook(cw, 'z')
@c 'Z'
@c 
@c >>> class ClassWithoutGetAttr:
@c ...     x = 123
@c ...
@c >>> cwo = ClassWithoutGetAttr()
@c >>> cwo.y = 456
@c >>> getattr_hook(cwo, 'x')
@c 123
@c >>> getattr_hook(cwo, 'y')
@c 456
@c >>> getattr_hook(cwo, 'z')
@c Traceback (most recent call last):
@c     ...
@c AttributeError: 'ClassWithoutGetAttr' object has no attribute 'z'

@node 클래스에서 호출,super에서 호출,인스턴스에서 호출,기술적인 자습서
@anchor{howto/descriptor invocation-from-a-class}@anchor{5722}
@subsubsection 클래스에서 호출


The logic for a dotted lookup such as @code{A.x} is in
@code{type.__getattribute__()}.  The steps are similar to those for
@code{object.__getattribute__()} but the instance dictionary lookup is replaced
by a search through the class’s @ref{25e0,,method resolution order}.

디스크립터가 발견되면, @code{desc.__get__(None, A)}로 호출됩니다.

The full C implementation can be found in @code{type_getattro()} and
@code{_PyType_Lookup()} in Objects/typeobject.c@footnote{https://github.com/python/cpython/tree/3.14/Objects/typeobject.c}.

@node super에서 호출,호출 로직 요약,클래스에서 호출,기술적인 자습서
@anchor{howto/descriptor invocation-from-super}@anchor{5723}
@subsubsection super에서 호출


The logic for super’s dotted lookup is in the @ref{dca,,__getattribute__()} method for
object returned by @ref{1a6,,super()}.

점 조회 @code{super(A, obj).m}은 @code{obj.__class__.__mro__}에서 @code{A} 바로 다음에 오는 베이스 클래스 @code{B}를 검색한 다음 @code{B.__dict__['m'].__get__(obj, A)}를 반환합니다. 디스크립터가 아니면, @code{m}이 변경되지 않은 상태로 반환됩니다.

The full C implementation can be found in @code{super_getattro()} in
Objects/typeobject.c@footnote{https://github.com/python/cpython/tree/3.14/Objects/typeobject.c}.  A pure Python equivalent can be found in
Guido's Tutorial@footnote{https://www.python.org/download/releases/2.2.3/descrintro/#cooperation}.

@node 호출 로직 요약,자동 이름 알림,super에서 호출,기술적인 자습서
@anchor{howto/descriptor summary-of-invocation-logic}@anchor{5724}
@subsubsection 호출 로직 요약


The mechanism for descriptors is embedded in the @ref{dca,,__getattribute__()}
methods for @ref{c7d,,object}, @ref{f43,,type}, and @ref{1a6,,super()}.

기억해야 할 중요한 사항은 다음과 같습니다:


@itemize *

@item 
Descriptors are invoked by the @ref{dca,,__getattribute__()} method.

@item 
클래스는 @ref{c7d,,object}, @ref{f43,,type} 또는 @ref{1a6,,super()}로부터 이 절차를 상속합니다.

@item 
Overriding @ref{dca,,__getattribute__()} prevents automatic descriptor calls
because all the descriptor logic is in that method.

@item 
@code{object.__getattribute__()} and @code{type.__getattribute__()} make
different calls to @ref{16ed,,__get__()}.  The first includes the instance and may
include the class.  The second puts in @code{None} for the instance and always
includes the class.

@item 
데이터 디스크립터는 항상 인스턴스 딕셔너리를 대체합니다.

@item 
비 데이터 디스크립터는 인스턴스 딕셔너리로 대체될 수 있습니다.
@end itemize

@node 자동 이름 알림,ORM 예제,호출 로직 요약,기술적인 자습서
@anchor{howto/descriptor automatic-name-notification}@anchor{5725}
@subsubsection 자동 이름 알림


Sometimes it is desirable for a descriptor to know what class variable name it
was assigned to.  When a new class is created, the @ref{f43,,type} metaclass
scans the dictionary of the new class.  If any of the entries are descriptors
and if they define @ref{e47,,__set_name__()}, that method is called with two
arguments.  The `owner' is the class where the descriptor is used, and the
`name' is the class variable the descriptor was assigned to.

The implementation details are in @code{type_new()} and
@code{set_names()} in Objects/typeobject.c@footnote{https://github.com/python/cpython/tree/3.14/Objects/typeobject.c}.

Since the update logic is in @code{type.__new__()}, notifications only take
place at the time of class creation.  If descriptors are added to the class
afterwards, @ref{e47,,__set_name__()} will need to be called manually.

@node ORM 예제,,자동 이름 알림,기술적인 자습서
@anchor{howto/descriptor orm-example}@anchor{5726}
@subsubsection ORM 예제


The following code is a simplified skeleton showing how data descriptors could
be used to implement an object relational mapping@footnote{https://en.wikipedia.org/wiki/Object%E2%80%93relational_mapping}.

핵심 아이디어는 데이터가 외부 데이터베이스에 저장된다는 것입니다. 파이썬 인스턴스는 데이터베이스 테이블에 대한 키만 보유합니다. 디스크립터가 조회나 갱신을 처리합니다:

@example
class Field:

    def __set_name__(self, owner, name):
        self.fetch = f'SELECT @{name@} FROM @{owner.table@} WHERE @{owner.key@}=?;'
        self.store = f'UPDATE @{owner.table@} SET @{name@}=? WHERE @{owner.key@}=?;'

    def __get__(self, obj, objtype=None):
        return conn.execute(self.fetch, [obj.key]).fetchone()[0]

    def __set__(self, obj, value):
        conn.execute(self.store, [value, obj.key])
        conn.commit()
@end example

We can use the @code{Field} class to define models@footnote{https://en.wikipedia.org/wiki/Database_model} that describe the schema for
each table in a database:

@example
class Movie:
    table = 'Movies'                    # Table name
    key = 'title'                       # Primary key
    director = Field()
    year = Field()

    def __init__(self, key):
        self.key = key

class Song:
    table = 'Music'
    key = 'title'
    artist = Field()
    year = Field()
    genre = Field()

    def __init__(self, key):
        self.key = key
@end example

모델을 사용하려면, 먼저 데이터베이스에 연결하십시오:

@example
>>> import sqlite3
>>> conn = sqlite3.connect('entertainment.db')
@end example

대화 형 세션은 데이터베이스에서 데이터를 꺼내는 방법과 데이터를 갱신하는 방법을 보여줍니다:

@c song_data = [
@c     ('Country Roads', 'John Denver', 1972),
@c     ('Me and Bobby McGee', 'Janice Joplin', 1971),
@c     ('Coal Miners Daughter', 'Loretta Lynn', 1970),
@c ]
@c 
@c movie_data = [
@c     ('Star Wars', 'George Lucas', 1977),
@c     ('Jaws', 'Steven Spielberg', 1975),
@c     ('Aliens', 'James Cameron', 1986),
@c ]
@c 
@c import sqlite3
@c 
@c conn = sqlite3.connect(':memory:')
@c conn.execute('CREATE TABLE Music (title text, artist text, year integer);')
@c conn.execute('CREATE INDEX MusicNdx ON Music (title);')
@c conn.executemany('INSERT INTO Music VALUES (?, ?, ?);', song_data)
@c conn.execute('CREATE TABLE Movies (title text, director text, year integer);')
@c conn.execute('CREATE INDEX MovieNdx ON Music (title);')
@c conn.executemany('INSERT INTO Movies VALUES (?, ?, ?);', movie_data)
@c conn.commit()

@example
>>> Movie('Star Wars').director
'George Lucas'
>>> jaws = Movie('Jaws')
>>> f'Released in @{jaws.year@} by @{jaws.director@}'
'Released in 1975 by Steven Spielberg'

>>> Song('Country Roads').artist
'John Denver'

>>> Movie('Star Wars').director = 'J.J. Abrams'
>>> Movie('Star Wars').director
'J.J. Abrams'
@end example

@c conn.close()

@node 순수한 파이썬 등가물,,기술적인 자습서,Descriptor Guide
@anchor{howto/descriptor pure-python-equivalents}@anchor{5727}
@subsection 순수한 파이썬 등가물


디스트립터 프로토콜은 간단하고 흥미로운 가능성을 제공합니다. 몇 가지 유스 케이스는 아주 흔해서 내장 도구에 미리 패키징되었습니다. 프로퍼티, 연결된 메서드, 정적 메서드, 클래스 메서드 및 __slots__는 모두 디스크립터 프로토콜을 기반으로 합니다.

@menu
* 프로퍼티:: 
* 함수와 메서드:: 
* 메서드의 종류:: 
* 정적 메서드:: 
* 클래스 메서드:: 
* 멤버 객체와 __slots__:: 

@end menu

@node 프로퍼티,함수와 메서드,,순수한 파이썬 등가물
@anchor{howto/descriptor properties}@anchor{5728}
@subsubsection 프로퍼티


@ref{4b3,,property()} 호출은 어트리뷰트에 액세스할 때 함수 호출을 트리거 하는 데이터 디스크립터를 작성하는 간결한 방법입니다. 서명은 다음과 같습니다:

@example
property(fget=None, fset=None, fdel=None, doc=None) -> property
@end example

설명(doc)은 관리되는 어트리뷰트 @code{x}를 정의하는 일반적인 사용법을 보여줍니다:

@example
class C:
    def getx(self): return self.__x
    def setx(self, value): self.__x = value
    def delx(self): del self.__x
    x = property(getx, setx, delx, "I'm the 'x' property.")
@end example

@c >>> C.x.__doc__
@c "I'm the 'x' property."
@c >>> c.x = 2.71828
@c >>> c.x
@c 2.71828
@c >>> del c.x
@c >>> c.x
@c Traceback (most recent call last):
@c   ...
@c AttributeError: 'C' object has no attribute '_C__x'

To see how @ref{4b3,,property()} is implemented in terms of the descriptor protocol,
here is a pure Python equivalent that implements most of the core functionality:

@example
class Property:
    "Emulate PyProperty_Type() in Objects/descrobject.c"

    def __init__(self, fget=None, fset=None, fdel=None, doc=None):
        self.fget = fget
        self.fset = fset
        self.fdel = fdel
        if doc is None and fget is not None:
            doc = fget.__doc__
        self.__doc__ = doc

    def __set_name__(self, owner, name):
        self.__name__ = name

    def __get__(self, obj, objtype=None):
        if obj is None:
            return self
        if self.fget is None:
            raise AttributeError
        return self.fget(obj)

    def __set__(self, obj, value):
        if self.fset is None:
            raise AttributeError
        self.fset(obj, value)

    def __delete__(self, obj):
        if self.fdel is None:
            raise AttributeError
        self.fdel(obj)

    def getter(self, fget):
        return type(self)(fget, self.fset, self.fdel, self.__doc__)

    def setter(self, fset):
        return type(self)(self.fget, fset, self.fdel, self.__doc__)

    def deleter(self, fdel):
        return type(self)(self.fget, self.fset, fdel, self.__doc__)
@end example

@c # Verify the Property() emulation
@c 
@c class CC:
@c     def getx(self):
@c         return self.__x
@c     def setx(self, value):
@c         self.__x = value
@c     def delx(self):
@c         del self.__x
@c     x = Property(getx, setx, delx, "I'm the 'x' property.")
@c     no_getter = Property(None, setx, delx, "I'm the 'x' property.")
@c     no_setter = Property(getx, None, delx, "I'm the 'x' property.")
@c     no_deleter = Property(getx, setx, None, "I'm the 'x' property.")
@c     no_doc = Property(getx, setx, delx, None)
@c 
@c 
@c # Now do it again but use the decorator style
@c 
@c class CCC:
@c     @Property
@c     def x(self):
@c         return self.__x
@c     @x.setter
@c     def x(self, value):
@c         self.__x = value
@c     @x.deleter
@c     def x(self):
@c         del self.__x

@c >>> cc = CC()
@c >>> hasattr(cc, 'x')
@c False
@c >>> cc.x = 33
@c >>> cc.x
@c 33
@c >>> del cc.x
@c >>> hasattr(cc, 'x')
@c False
@c 
@c >>> ccc = CCC()
@c >>> hasattr(ccc, 'x')
@c False
@c >>> ccc.x = 333
@c >>> ccc.x == 333
@c True
@c >>> del ccc.x
@c >>> hasattr(ccc, 'x')
@c False
@c 
@c >>> cc = CC()
@c >>> cc.x = 33
@c >>> try:
@c ...     cc.no_getter
@c ... except AttributeError as e:
@c ...     type(e).__name__
@c ...
@c 'AttributeError'
@c 
@c >>> try:
@c ...     cc.no_setter = 33
@c ... except AttributeError as e:
@c ...     type(e).__name__
@c ...
@c 'AttributeError'
@c 
@c >>> try:
@c ...     del cc.no_deleter
@c ... except AttributeError as e:
@c ...     type(e).__name__
@c ...
@c 'AttributeError'
@c 
@c >>> CC.no_doc.__doc__ is None
@c True

@ref{4b3,,property()} 내장은 사용자 인터페이스가 어트리뷰트 액세스를 허가한 후 후속 변경이 메서드의 개입을 요구할 때 도움을 줍니다.

예를 들어, 스프레드시트 클래스는 @code{Cell('b10').value}를 통해 셀 값에 대한 액세스를 허가할 수 있습니다. 프로그램에 대한 후속 개선은 액세스할 때마다 셀이 재계산될 것을 요구합니다; 하지만, 프로그래머는 어트리뷰트에 직접 액세스하는 기존 클라이언트 코드에 영향을 미치고 싶지 않습니다. 해결책은 프로퍼티 데이터 디스크립터로 value 어트리뷰트에 대한 액세스를 감싸는 것입니다:

@example
class Cell:
    ...

    @@property
    def value(self):
        "Recalculate the cell before returning value"
        self.recalc()
        return self._value
@end example

Either the built-in @ref{4b3,,property()} or our @code{Property()} equivalent would
work in this example.

@node 함수와 메서드,메서드의 종류,프로퍼티,순수한 파이썬 등가물
@anchor{howto/descriptor functions-and-methods}@anchor{5729}
@subsubsection 함수와 메서드


파이썬의 객체 지향 기능은 함수 기반 환경을 기반으로 합니다. 비 데이터 디스크립터를 사용하면, 두 개가 매끄럽게 병합됩니다.

클래스 딕셔너리에 저장된 함수는 호출될 때 메서드로 바뀝니다. 객체 인스턴스가 다른 인자들 앞에 추가된다는 점에서만 메서드가 일반 함수와 다릅니다. 관례에 따라, 이 인스턴스는 `self'라고 하지만 `this'나 다른 어떤 변수 이름도 될 수 있습니다.

대략 다음과 동등한 @ref{1b81,,types.MethodType}을 사용하여 메서드를 수동으로 만들 수 있습니다:

@example
class MethodType:
    "Emulate PyMethod_Type in Objects/classobject.c"

    def __init__(self, func, obj):
        self.__func__ = func
        self.__self__ = obj

    def __call__(self, *args, **kwargs):
        func = self.__func__
        obj = self.__self__
        return func(obj, *args, **kwargs)

    def __getattribute__(self, name):
        "Emulate method_getset() in Objects/classobject.c"
        if name == '__doc__':
            return self.__func__.__doc__
        return object.__getattribute__(self, name)

    def __getattr__(self, name):
        "Emulate method_getattro() in Objects/classobject.c"
        return getattr(self.__func__, name)

    def __get__(self, obj, objtype=None):
        "Emulate method_descr_get() in Objects/classobject.c"
        return self
@end example

To support automatic creation of methods, functions include the
@ref{16ed,,__get__()} method for binding methods during attribute access.  This
means that functions are non-data descriptors that return bound methods
during dotted lookup from an instance.  Here’s how it works:

@example
class Function:
    ...

    def __get__(self, obj, objtype=None):
        "Simulate func_descr_get() in Objects/funcobject.c"
        if obj is None:
            return self
        return MethodType(self, obj)
@end example

인터프리터에서 다음 클래스를 실행하면 실제로 함수 디스크립터가 작동하는 방식을 보여줍니다:

@example
class D:
    def f(self):
         return self

class D2:
    pass
@end example

@c >>> d = D()
@c >>> d2 = D2()
@c >>> d2.f = d.f.__get__(d2, D2)
@c >>> d2.f() is d
@c True

함수에는 내부 검사를 지원하는 @ref{1d21,,정규화된 이름} 어트리뷰트가 있습니다:

@example
>>> D.f.__qualname__
'D.f'
@end example

Accessing the function through the class dictionary does not invoke
@ref{16ed,,__get__()}.  Instead, it just returns the underlying function object:

@example
>>> D.__dict__['f']
<function D.f at 0x00C45070>
@end example

Dotted access from a class calls @ref{16ed,,__get__()} which just returns the
underlying function unchanged:

@example
>>> D.f
<function D.f at 0x00C45070>
@end example

The interesting behavior occurs during dotted access from an instance.  The
dotted lookup calls @ref{16ed,,__get__()} which returns a bound method object:

@example
>>> d = D()
>>> d.f
<bound method D.f of <__main__.D object at 0x00B18C90>>
@end example

내부적으로, 연결된 메서드는 하부 함수와 연결된 인스턴스를 저장합니다.

@example
>>> d.f.__func__
<function D.f at 0x00C45070>

>>> d.f.__self__
<__main__.D object at 0x00B18C90>
@end example

일반 메서드에서 `self'가 어디에서 오는지 또는 클래스 메서드에서 `cls'가 어디에서 오는지 궁금한 적이 있다면, 바로 이겁니다!

@node 메서드의 종류,정적 메서드,함수와 메서드,순수한 파이썬 등가물
@anchor{howto/descriptor kinds-of-methods}@anchor{572a}
@subsubsection 메서드의 종류


비 데이터 디스크립터는 함수에 메서드를 바인딩하는 일반적인 패턴을 변형하는 간단한 메커니즘을 제공합니다.

To recap, functions have a @ref{16ed,,__get__()} method so that they can be converted
to a method when accessed as attributes.  The non-data descriptor transforms an
@code{obj.f(*args)} call into @code{f(obj, *args)}.  Calling @code{cls.f(*args)}
becomes @code{f(*args)}.

이 표는 연결과 가장 유용한 두 가지 변형을 요약합니다:

@quotation


@multitable {xxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxx} 
@headitem

변환

@tab

객체에서 호출

@tab

클래스에서 호출

@item

함수

@tab

f(obj, *args)

@tab

f(*args)

@item

staticmethod

@tab

f(*args)

@tab

f(*args)

@item

classmethod

@tab

f(type(obj), *args)

@tab

f(cls, *args)

@end multitable

@end quotation

@node 정적 메서드,클래스 메서드,메서드의 종류,순수한 파이썬 등가물
@anchor{howto/descriptor static-methods}@anchor{572b}
@subsubsection 정적 메서드


정적 메서드는 변경 없이 하부 함수를 반환합니다. @code{c.f}나 @code{C.f} 호출은 @code{object.__getattribute__(c, "f")}나 @code{object.__getattribute__(C, "f")}를 직접 조회하는 것과 동등합니다. 결과적으로, 함수는 객체나 클래스에서 동일하게 액세스 할 수 있습니다.

정적 메서드에 적합한 후보는 @code{self} 변수를 참조하지 않는 메서드입니다.

For instance, a statistics package may include a container class for
experimental data.  The class provides normal methods for computing the average,
mean, median, and other descriptive statistics that depend on the data. However,
there may be useful functions which are conceptually related but do not depend
on the data.  For instance, @code{erf(x)} is handy conversion routine that comes up
in statistical work but does not directly depend on a particular dataset.
It can be called either from an object or the class:  @code{s.erf(1.5) --> 0.9332}
or @code{Sample.erf(1.5) --> 0.9332}.

정적 메서드는 변경 없이 하부 함수를 반환하므로, 예제 호출은 흥미롭지 않습니다:

@example
class E:
    @@staticmethod
    def f(x):
        return x * 10
@end example

@example
>>> E.f(3)
30
>>> E().f(3)
30
@end example

비 데이터 디스크립터 프로토콜을 사용하면, 순수 파이썬 버전의 @ref{453,,staticmethod()}는 다음과 같습니다:

@example
import functools

class StaticMethod:
    "Emulate PyStaticMethod_Type() in Objects/funcobject.c"

    def __init__(self, f):
        self.f = f
        functools.update_wrapper(self, f)

    def __get__(self, obj, objtype=None):
        return self.f

    def __call__(self, *args, **kwds):
        return self.f(*args, **kwds)

    @@property
    def __annotations__(self):
        return self.f.__annotations__
@end example

The @ref{1221,,functools.update_wrapper()} call adds a @code{__wrapped__} attribute
that refers to the underlying function.  Also it carries forward
the attributes necessary to make the wrapper look like the wrapped
function, including @ref{14d9,,__name__}, @ref{2346,,__qualname__},
and @ref{13de,,__doc__}.

@c class E_sim:
@c     @StaticMethod
@c     def f(x: int) -> str:
@c         "Simple function example"
@c         return "!" * x
@c 
@c wrapped_ord = StaticMethod(ord)

@c >>> E_sim.f(3)
@c '!!!'
@c >>> E_sim().f(3)
@c '!!!'
@c 
@c >>> sm = vars(E_sim)['f']
@c >>> type(sm).__name__
@c 'StaticMethod'
@c >>> f = E_sim.f
@c >>> type(f).__name__
@c 'function'
@c >>> sm.__name__
@c 'f'
@c >>> f.__name__
@c 'f'
@c >>> sm.__qualname__
@c 'E_sim.f'
@c >>> f.__qualname__
@c 'E_sim.f'
@c >>> sm.__doc__
@c 'Simple function example'
@c >>> f.__doc__
@c 'Simple function example'
@c >>> sm.__annotations__
@c {'x': <class 'int'>, 'return': <class 'str'>}
@c >>> f.__annotations__
@c {'x': <class 'int'>, 'return': <class 'str'>}
@c >>> sm.__module__ == f.__module__
@c True
@c >>> sm(3)
@c '!!!'
@c >>> f(3)
@c '!!!'
@c 
@c >>> wrapped_ord('A')
@c 65
@c >>> wrapped_ord.__module__ == ord.__module__
@c True
@c >>> wrapped_ord.__wrapped__ == ord
@c True
@c >>> wrapped_ord.__name__ == ord.__name__
@c True
@c >>> wrapped_ord.__qualname__ == ord.__qualname__
@c True
@c >>> wrapped_ord.__doc__ == ord.__doc__
@c True

@node 클래스 메서드,멤버 객체와 __slots__,정적 메서드,순수한 파이썬 등가물
@anchor{howto/descriptor class-methods}@anchor{572c}
@subsubsection 클래스 메서드


정적 메서드와 달리, 클래스 메서드는 함수를 호출하기 전에 클래스 참조를 인자 목록 앞에 추가합니다. 이 형식은 호출자가 객체나 클래스일 때 같습니다:

@example
class F:
    @@classmethod
    def f(cls, x):
        return cls.__name__, x
@end example

@example
>>> F.f(3)
('F', 3)
>>> F().f(3)
('F', 3)
@end example

이 동작은 함수가 클래스 참조 만 필요하고 특정 인스턴스에 저장된 데이터에 의존하지 않을 때 유용합니다. 클래스 메서드의 한 가지 용도는 대체 클래스 생성자를 만드는 것입니다. 예를 들어, 클래스 메서드 @ref{24e,,dict.fromkeys()}는 키 리스트에서 새 딕셔너리를 만듭니다. 순수한 파이썬 동등 물은 다음과 같습니다:

@example
class Dict(dict):
    @@classmethod
    def fromkeys(cls, iterable, value=None):
        "Emulate dict_fromkeys() in Objects/dictobject.c"
        d = cls()
        for key in iterable:
            d[key] = value
        return d
@end example

이제 고유 키의 새로운 딕셔너리를 다음과 같이 구성 할 수 있습니다:

@example
>>> d = Dict.fromkeys('abracadabra')
>>> type(d) is Dict
True
>>> d
@{'a': None, 'b': None, 'r': None, 'c': None, 'd': None@}
@end example

비 데이터 디스크립터 프로토콜을 사용하면, 순수 파이썬 버전의 @ref{48f,,classmethod()}는 다음과 같습니다:

@example
import functools

class ClassMethod:
    "Emulate PyClassMethod_Type() in Objects/funcobject.c"

    def __init__(self, f):
        self.f = f
        functools.update_wrapper(self, f)

    def __get__(self, obj, cls=None):
        if cls is None:
            cls = type(obj)
        return MethodType(self.f, cls)
@end example

@c # Verify the emulation works
@c class T:
@c     @ClassMethod
@c     def cm(cls, x: int, y: str) -> tuple[str, int, str]:
@c         "Class method that returns a tuple"
@c         return (cls.__name__, x, y)

@c >>> T.cm(11, 22)
@c ('T', 11, 22)
@c 
@c # Also call it from an instance
@c >>> t = T()
@c >>> t.cm(11, 22)
@c ('T', 11, 22)
@c 
@c # Verify that T uses our emulation
@c >>> type(vars(T)['cm']).__name__
@c 'ClassMethod'
@c 
@c # Verify that update_wrapper() correctly copied attributes
@c >>> T.cm.__name__
@c 'cm'
@c >>> T.cm.__qualname__
@c 'T.cm'
@c >>> T.cm.__doc__
@c 'Class method that returns a tuple'
@c >>> T.cm.__annotations__
@c {'x': <class 'int'>, 'y': <class 'str'>, 'return': tuple[str, int, str]}
@c 
@c # Verify that __wrapped__ was added and works correctly
@c >>> f = vars(T)['cm'].__wrapped__
@c >>> type(f).__name__
@c 'function'
@c >>> f.__name__
@c 'cm'
@c >>> f(T, 11, 22)
@c ('T', 11, 22)

The @ref{1221,,functools.update_wrapper()} call in @code{ClassMethod} adds a
@code{__wrapped__} attribute that refers to the underlying function.  Also
it carries forward the attributes necessary to make the wrapper look
like the wrapped function: @ref{14d9,,__name__},
@ref{2346,,__qualname__}, @ref{13de,,__doc__},
and @ref{13dd,,__annotations__}.

@node 멤버 객체와 __slots__,,클래스 메서드,순수한 파이썬 등가물
@anchor{howto/descriptor member-objects-and-slots}@anchor{572d}
@subsubsection 멤버 객체와 __slots__


클래스가 @code{__slots__}를 정의하면, 인스턴스 딕셔너리를 슬롯값의 고정 길이 배열로 바꿉니다. 사용자 관점에서 여러 가지 효과가 있습니다:

1 - 철자가 잘못된 어트리뷰트 대입으로 인한 버그를 즉시 감지합니다. @code{__slots__}에 지정된 어트리뷰트 이름 만 허용됩니다:

@example
class Vehicle:
    __slots__ = ('id_number', 'make', 'model')
@end example

@example
>>> auto = Vehicle()
>>> auto.id_nubmer = 'VYE483814LQEX'
Traceback (most recent call last):
    ...
AttributeError: 'Vehicle' object has no attribute 'id_nubmer'
@end example

2 - 디스크립터가 @code{__slots__}에 저장된 개인 어트리뷰트에 대한 액세스를 관리하는 불변 객체를 만드는 데 도움이 됩니다:

@example
class Immutable:

    __slots__ = ('_dept', '_name')          # Replace the instance dictionary

    def __init__(self, dept, name):
        self._dept = dept                   # Store to private attribute
        self._name = name                   # Store to private attribute

    @@property                               # Read-only descriptor
    def dept(self):
        return self._dept

    @@property
    def name(self):                         # Read-only descriptor
        return self._name
@end example

@example
>>> mark = Immutable('Botany', 'Mark Watney')
>>> mark.dept
'Botany'
>>> mark.dept = 'Space Pirate'
Traceback (most recent call last):
    ...
AttributeError: property 'dept' of 'Immutable' object has no setter
>>> mark.location = 'Mars'
Traceback (most recent call last):
    ...
AttributeError: 'Immutable' object has no attribute 'location'
@end example

3 - 메모리를 절약합니다. 64비트 리눅스 빌드에서 두 개의 어트리뷰트가 있는 인스턴스는 @code{__slots__}가 있으면 48바이트, 없으면 152바이트를 사용합니다. 이 플라이웨이트(flyweight) 디자인 패턴@footnote{https://en.wikipedia.org/wiki/Flyweight_pattern}은 많은 수의 인스턴스가 만들어질 때만 중요합니다.

4. Improves speed.  Reading instance variables is 35% faster with
@code{__slots__} (as measured with Python 3.10 on an Apple M1 processor).

5. Blocks tools like @ref{762,,functools.cached_property()} which require an
instance dictionary to function correctly:

@example
from functools import cached_property

class CP:
    __slots__ = ()                          # Eliminates the instance dict

    @@cached_property                        # Requires an instance dict
    def pi(self):
        return 4 * sum((-1.0)**n / (2.0*n + 1.0)
                       for n in reversed(range(100_000)))
@end example

@example
>>> CP().pi
Traceback (most recent call last):
  ...
TypeError: No '__dict__' attribute on 'CP' instance to cache 'pi' property.
@end example

@code{__slots__}의 정확한 순수 파이썬 드롭인 버전을 만드는 것은 불가능합니다. C 구조체에 직접 액세스하고 객체 메모리 할당을 제어해야 하기 때문입니다. 그러나, 슬롯에 대한 실제 C 구조체가 개인 @code{_slotvalues} 리스트에 의해 모사되는 가장 충실한 시뮬레이션을 구축 할 수 있습니다. 해당 개인 구조체에 대한 읽기와 쓰기는 멤버 디스크립터에 의해 관리됩니다:

@example
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'<Member @{self.name!r@} of @{self.clsname!r@}>'
@end example

The @code{type.__new__()} method takes care of adding member objects to class
variables:

@example
class Type(type):
    'Simulate how the type metaclass adds member objects for slots'

    def __new__(mcls, clsname, bases, mapping, **kwargs):
        'Emulate type_new() in Objects/typeobject.c'
        # type_new() calls PyTypeReady() which calls add_methods()
        slot_names = mapping.get('slot_names', [])
        for offset, name in enumerate(slot_names):
            mapping[name] = Member(name, clsname, offset)
        return type.__new__(mcls, clsname, bases, mapping, **kwargs)
@end example

@ref{79f,,object.__new__()} 메서드는 인스턴스 딕셔너리 대신 슬롯이 있는 인스턴스를 만드는 것을 관장합니다. 다음은 순수 파이썬의 대략적인 시뮬레이션입니다:

@example
class Object:
    'Simulate how object.__new__() allocates memory for __slots__'

    def __new__(cls, *args, **kwargs):
        'Emulate object_new() in Objects/typeobject.c'
        inst = super().__new__(cls)
        if hasattr(cls, 'slot_names'):
            empty_slots = [null] * len(cls.slot_names)
            object.__setattr__(inst, '_slotvalues', empty_slots)
        return inst

    def __setattr__(self, name, value):
        'Emulate _PyObject_GenericSetAttrWithDict() Objects/object.c'
        cls = type(self)
        if hasattr(cls, 'slot_names') and name not in cls.slot_names:
            raise AttributeError(
                f'@{cls.__name__!r@} object has no attribute @{name!r@}'
            )
        super().__setattr__(name, value)

    def __delattr__(self, name):
        'Emulate _PyObject_GenericSetAttrWithDict() Objects/object.c'
        cls = type(self)
        if hasattr(cls, 'slot_names') and name not in cls.slot_names:
            raise AttributeError(
                f'@{cls.__name__!r@} object has no attribute @{name!r@}'
            )
        super().__delattr__(name)
@end example

To use the simulation in a real class, just inherit from @code{Object} and
set the @ref{23d0,,metaclass} to @code{Type}:

@example
class H(Object, metaclass=Type):
    'Instance variables stored in slots'

    slot_names = ['x', 'y']

    def __init__(self, x, y):
        self.x = x
        self.y = y
@end example

이 시점에서, 메타 클래스는 `x' 와 `y'에 대한 멤버 객체를 로드했습니다:

@example
>>> from pprint import pp
>>> pp(dict(vars(H)))
@{'__module__': '__main__',
 '__doc__': 'Instance variables stored in slots',
 'slot_names': ['x', 'y'],
 '__init__': <function H.__init__ at 0x7fb5d302f9d0>,
 'x': <Member 'x' of 'H'>,
 'y': <Member 'y' of 'H'>@}
@end example

@c # We test this separately because the preceding section is not
@c # doctestable due to the hex memory address for the __init__ function
@c >>> isinstance(vars(H)['x'], Member)
@c True
@c >>> isinstance(vars(H)['y'], Member)
@c True

인스턴스가 만들어질 때, 어트리뷰트가 저장되는 @code{slot_values} 리스트를 갖습니다:

@example
>>> h = H(10, 20)
>>> vars(h)
@{'_slotvalues': [10, 20]@}
>>> h.x = 55
>>> vars(h)
@{'_slotvalues': [55, 20]@}
@end example

철자가 틀리거나 지정되지 않은 어트리뷰트는 예외를 발생시킵니다:

@example
>>> h.xz
Traceback (most recent call last):
    ...
AttributeError: 'H' object has no attribute 'xz'
@end example

@c  # Examples for deleted attributes are not shown because this section
@c  # is already a bit lengthy.  We still test that code here.
@c  >>> del h.x
@c  >>> hasattr(h, 'x')
@c  False
@c 
@c  # Also test the code for uninitialized slots
@c  >>> class HU(Object, metaclass=Type):
@c  ...     slot_names = ['x', 'y']
@c  ...
@c  >>> hu = HU()
@c  >>> hasattr(hu, 'x')
@c  False
@c  >>> hasattr(hu, 'y')
@c  False

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Debugging C API extensions and CPython Internals with GDB,Enum HOWTO,Descriptor Guide,파이썬 HOWTO
@anchor{howto/gdb_helpers doc}@anchor{572e}@anchor{howto/gdb_helpers debugging-c-api-extensions-and-cpython-internals-with-gdb}@anchor{572f}@anchor{howto/gdb_helpers gdb}@anchor{5730}@anchor{howto/gdb_helpers translation-repo}@anchor{5731}
@section Debugging C API extensions and CPython Internals with GDB


This document explains how the Python GDB extension, @code{python-gdb.py}, can
be used with the GDB debugger to debug CPython extensions and the
CPython interpreter itself.

When debugging low-level problems such as crashes or deadlocks, a low-level
debugger, such as GDB, is useful to diagnose and correct the issue.
By default, GDB (or any of its front-ends) doesn’t support high-level
information specific to the CPython interpreter.

The @code{python-gdb.py} extension adds CPython interpreter information to GDB.
The extension helps introspect the stack of currently executing Python functions.
Given a Python object represented by a @ref{5dc,,PyObject}* pointer,
the extension surfaces the type and value of the object.

Developers who are working on CPython extensions or tinkering with parts
of CPython that are written in C can use this document to learn how to use the
@code{python-gdb.py} extension with GDB.

@cartouche
@quotation 참고 
This document assumes that you are familiar with the basics of GDB and the
CPython C API. It consolidates guidance from the
devguide@footnote{https://devguide.python.org}  and the
Python wiki@footnote{https://wiki.python.org/moin/DebuggingWithGdb}.
@end quotation
@end cartouche

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

@end menu

@node Prerequisites,Using the Debug build and Development mode,,Debugging C API extensions and CPython Internals with GDB
@anchor{howto/gdb_helpers prerequisites}@anchor{5732}
@subsection Prerequisites


You need to have:


@itemize -

@item 
GDB 7 or later. (For earlier versions of GDB, see @code{Misc/gdbinit} in the
sources of Python 3.11 or earlier.)

@item 
GDB-compatible debugging information for Python and any extension you are
debugging.

@item 
The @code{python-gdb.py} extension.
@end itemize

The extension is built with Python, but might be distributed separately or
not at all. Below, we include tips for a few common systems as examples.
Note that even if the instructions match your system, they might be outdated.

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

@end menu

@node Setup with Python built from source,Setup for Python from a Linux distro,,Prerequisites
@anchor{howto/gdb_helpers setup-with-python-built-from-source}@anchor{5733}
@subsubsection Setup with Python built from source


When you build CPython from source, debugging information should be available,
and the build should add a @code{python-gdb.py} file to the root directory of
your repository.

To activate support, you must add the directory containing @code{python-gdb.py}
to GDB’s “auto-load-safe-path”.
If you haven’t done this, recent versions of GDB will print out a warning
with instructions on how to do this.

@cartouche
@quotation 참고 
If you do not see instructions for your version of GDB, put this in your
configuration file (@code{~/.gdbinit} or @code{~/.config/gdb/gdbinit}):

@example
add-auto-load-safe-path /path/to/cpython
@end example

You can also add multiple paths, separated by @code{:}.
@end quotation
@end cartouche

@node Setup for Python from a Linux distro,,Setup with Python built from source,Prerequisites
@anchor{howto/gdb_helpers setup-for-python-from-a-linux-distro}@anchor{5734}
@subsubsection Setup for Python from a Linux distro


Most Linux systems provide debug information for the system Python
in a package called @code{python-debuginfo}, @code{python-dbg} or similar.
For example:


@itemize -

@item 
Fedora:

@quotation

@example
sudo dnf install gdb
sudo dnf debuginfo-install python3
@end example
@end quotation

@item 
Ubuntu:

@quotation

@example
sudo apt install gdb python3-dbg
@end example
@end quotation
@end itemize

On several recent Linux systems, GDB can download debugging symbols
automatically using `debuginfod'.
However, this will not install the @code{python-gdb.py} extension;
you generally do need to install the debug info package separately.

@node Using the Debug build and Development mode,Using the python-gdb extension,Prerequisites,Debugging C API extensions and CPython Internals with GDB
@anchor{howto/gdb_helpers using-the-debug-build-and-development-mode}@anchor{5735}
@subsection Using the Debug build and Development mode


For easier debugging, you might want to:


@itemize -

@item 
Use a @ref{508,,debug build} of Python. (When building from source,
use @code{configure --with-pydebug}. On Linux distros, install and run a package
like @code{python-debug} or @code{python-dbg}, if available.)

@item 
Use the runtime @ref{507,,development mode} (@code{-X dev}).
@end itemize

Both enable extra assertions and disable some optimizations.
Sometimes this hides the bug you are trying to find, but in most cases they
make the process easier.

@node Using the python-gdb extension,Use with GDB commands,Using the Debug build and Development mode,Debugging C API extensions and CPython Internals with GDB
@anchor{howto/gdb_helpers using-the-python-gdb-extension}@anchor{5736}
@subsection Using the @code{python-gdb} extension


When the extension is loaded, it provides two main features:
pretty printers for Python values, and additional commands.

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

@end menu

@node Pretty-printers,py-list,,Using the python-gdb extension
@anchor{howto/gdb_helpers pretty-printers}@anchor{5737}
@subsubsection Pretty-printers


This is what a GDB backtrace looks like (truncated) when this extension is
enabled:

@example
#0  0x000000000041a6b1 in PyObject_Malloc (nbytes=Cannot access memory at address 0x7fffff7fefe8
) at Objects/obmalloc.c:748
#1  0x000000000041b7c0 in _PyObject_DebugMallocApi (id=111 'o', nbytes=24) at Objects/obmalloc.c:1445
#2  0x000000000041b717 in _PyObject_DebugMalloc (nbytes=24) at Objects/obmalloc.c:1412
#3  0x000000000044060a in _PyUnicode_New (length=11) at Objects/unicodeobject.c:346
#4  0x00000000004466aa in PyUnicodeUCS2_DecodeUTF8Stateful (s=0x5c2b8d "__lltrace__", size=11, errors=0x0, consumed=
    0x0) at Objects/unicodeobject.c:2531
#5  0x0000000000446647 in PyUnicodeUCS2_DecodeUTF8 (s=0x5c2b8d "__lltrace__", size=11, errors=0x0)
    at Objects/unicodeobject.c:2495
#6  0x0000000000440d1b in PyUnicodeUCS2_FromStringAndSize (u=0x5c2b8d "__lltrace__", size=11)
    at Objects/unicodeobject.c:551
#7  0x0000000000440d94 in PyUnicodeUCS2_FromString (u=0x5c2b8d "__lltrace__") at Objects/unicodeobject.c:569
#8  0x0000000000584abd in PyDict_GetItemString (v=
    @{'Yuck': <type at remote 0xad4730>, '__builtins__': <module at remote 0x7ffff7fd5ee8>, '__file__': 'Lib/test/crashers/nasty_eq_vs_dict.py', '__package__': None, 'y': <Yuck(i=0) at remote 0xaacd80>, 'dict': @{0: 0, 1: 1, 2: 2, 3: 3@}, '__cached__': None, '__name__': '__main__', 'z': <Yuck(i=0) at remote 0xaace60>, '__doc__': None@}, key=
    0x5c2b8d "__lltrace__") at Objects/dictobject.c:2171
@end example

Notice how the dictionary argument to @code{PyDict_GetItemString} is displayed
as its @code{repr()}, rather than an opaque @code{PyObject *} pointer.

The extension works by supplying a custom printing routine for values of type
@code{PyObject *}.  If you need to access lower-level details of an object, then
cast the value to a pointer of the appropriate type.  For example:

@example
(gdb) p globals
$1 = @{'__builtins__': <module at remote 0x7ffff7fb1868>, '__name__':
'__main__', 'ctypes': <module at remote 0x7ffff7f14360>, '__doc__': None,
'__package__': None@}

(gdb) p *(PyDictObject*)globals
$2 = @{ob_refcnt = 3, ob_type = 0x3dbdf85820, ma_fill = 5, ma_used = 5,
ma_mask = 7, ma_table = 0x63d0f8, ma_lookup = 0x3dbdc7ea70
<lookdict_string>, ma_smalltable = @{@{me_hash = 7065186196740147912,
me_key = '__builtins__', me_value = <module at remote 0x7ffff7fb1868>@},
@{me_hash = -368181376027291943, me_key = '__name__',
me_value ='__main__'@}, @{me_hash = 0, me_key = 0x0, me_value = 0x0@},
@{me_hash = 0, me_key = 0x0, me_value = 0x0@},
@{me_hash = -9177857982131165996, me_key = 'ctypes',
me_value = <module at remote 0x7ffff7f14360>@},
@{me_hash = -8518757509529533123, me_key = '__doc__', me_value = None@},
@{me_hash = 0, me_key = 0x0, me_value = 0x0@}, @{
  me_hash = 6614918939584953775, me_key = '__package__', me_value = None@}@}@}
@end example

Note that the pretty-printers do not actually call @code{repr()}.
For basic types, they try to match its result closely.

An area that can be confusing is that the custom printer for some types look a
lot like GDB’s built-in printer for standard types.  For example, the
pretty-printer for a Python @code{int} (@ref{39e,,PyLongObject}*)
gives a representation that is not distinguishable from one of a
regular machine-level integer:

@example
(gdb) p some_machine_integer
$3 = 42

(gdb) p some_python_integer
$4 = 42
@end example

The internal structure can be revealed with a cast to @ref{39e,,PyLongObject}*:

@example
(gdb) p *(PyLongObject*)some_python_integer
$5 = @{ob_base = @{ob_base = @{ob_refcnt = 8, ob_type = 0x3dad39f5e0@}, ob_size = 1@},
ob_digit = @{42@}@}
@end example

A similar confusion can arise with the @code{str} type, where the output looks a
lot like gdb’s built-in printer for @code{char *}:

@example
(gdb) p ptr_to_python_str
$6 = '__builtins__'
@end example

The pretty-printer for @code{str} instances defaults to using single-quotes (as
does Python’s @code{repr} for strings) whereas the standard printer for @code{char *}
values uses double-quotes and contains a hexadecimal address:

@example
(gdb) p ptr_to_char_star
$7 = 0x6d72c0 "hello world"
@end example

Again, the implementation details can be revealed with a cast to
@ref{996,,PyUnicodeObject}*:

@example
(gdb) p *(PyUnicodeObject*)$6
$8 = @{ob_base = @{ob_refcnt = 33, ob_type = 0x3dad3a95a0@}, length = 12,
str = 0x7ffff2128500, hash = 7065186196740147912, state = 1, defenc = 0x0@}
@end example

@node py-list,py-up and py-down,Pretty-printers,Using the python-gdb extension
@anchor{howto/gdb_helpers py-list}@anchor{5738}
@subsubsection @code{py-list}


@quotation

The extension adds a @code{py-list} command, which
lists the Python source code (if any) for the current frame in the selected
thread.  The current line is marked with a “>”:

@example
(gdb) py-list
 901        if options.profile:
 902            options.profile = False
 903            profile_me()
 904            return
 905
>906        u = UI()
 907        if not u.quit:
 908            try:
 909                gtk.main()
 910            except KeyboardInterrupt:
 911                # properly quit on a keyboard interrupt...
@end example

Use @code{py-list START} to list at a different line number within the Python
source, and @code{py-list START,END} to list a specific range of lines within
the Python source.
@end quotation

@node py-up and py-down,py-bt,py-list,Using the python-gdb extension
@anchor{howto/gdb_helpers py-up-and-py-down}@anchor{5739}
@subsubsection @code{py-up} and @code{py-down}


@quotation

The @code{py-up} and @code{py-down} commands are analogous to GDB’s regular @code{up}
and @code{down} commands, but try to move at the level of CPython frames, rather
than C frames.

GDB is not always able to read the relevant frame information, depending on
the optimization level with which CPython was compiled. Internally, the
commands look for C frames that are executing the default frame evaluation
function (that is, the core bytecode interpreter loop within CPython) and
look up the value of the related @code{PyFrameObject *}.

They emit the frame number (at the C level) within the thread.

For example:

@example
(gdb) py-up
#37 Frame 0x9420b04, for file /usr/lib/python2.6/site-packages/
gnome_sudoku/main.py, line 906, in start_game ()
    u = UI()
(gdb) py-up
#40 Frame 0x948e82c, for file /usr/lib/python2.6/site-packages/
gnome_sudoku/gnome_sudoku.py, line 22, in start_game(main=<module at remote 0xb771b7f4>)
    main.start_game()
(gdb) py-up
Unable to find an older python frame
@end example

so we’re at the top of the Python stack.

The frame numbers correspond to those displayed by GDB’s standard
@code{backtrace} command.
The command skips C frames which are not executing Python code.

Going back down:

@example
(gdb) py-down
#37 Frame 0x9420b04, for file /usr/lib/python2.6/site-packages/gnome_sudoku/main.py, line 906, in start_game ()
    u = UI()
(gdb) py-down
#34 (unable to read python frame information)
(gdb) py-down
#23 (unable to read python frame information)
(gdb) py-down
#19 (unable to read python frame information)
(gdb) py-down
#14 Frame 0x99262ac, for file /usr/lib/python2.6/site-packages/gnome_sudoku/game_selector.py, line 201, in run_swallowed_dialog (self=<NewOrSavedGameSelector(new_game_model=<gtk.ListStore at remote 0x98fab44>, puzzle=None, saved_games=[@{'gsd.auto_fills': 0, 'tracking': @{@}, 'trackers': @{@}, 'notes': [], 'saved_at': 1270084485, 'game': '7 8 0 0 0 0 0 5 6 0 0 9 0 8 0 1 0 0 0 4 6 0 0 0 0 7 0 6 5 0 0 0 4 7 9 2 0 0 0 9 0 1 0 0 0 3 9 7 6 0 0 0 1 8 0 6 0 0 0 0 2 8 0 0 0 5 0 4 0 6 0 0 2 1 0 0 0 0 0 4 5\n7 8 0 0 0 0 0 5 6 0 0 9 0 8 0 1 0 0 0 4 6 0 0 0 0 7 0 6 5 1 8 3 4 7 9 2 0 0 0 9 0 1 0 0 0 3 9 7 6 0 0 0 1 8 0 6 0 0 0 0 2 8 0 0 0 5 0 4 0 6 0 0 2 1 0 0 0 0 0 4 5', 'gsd.impossible_hints': 0, 'timer.__absolute_start_time__': <float at remote 0x984b474>, 'gsd.hints': 0, 'timer.active_time': <float at remote 0x984b494>, 'timer.total_time': <float at remote 0x984b464>@}], dialog=<gtk.Dialog at remote 0x98faaa4>, saved_game_model=<gtk.ListStore at remote 0x98fad24>, sudoku_maker=<SudokuMaker(terminated=False, played=[], batch_siz...(truncated)
            swallower.run_dialog(self.dialog)
(gdb) py-down
#11 Frame 0x9aead74, for file /usr/lib/python2.6/site-packages/gnome_sudoku/dialog_swallower.py, line 48, in run_dialog (self=<SwappableArea(running=<gtk.Dialog at remote 0x98faaa4>, main_page=0) at remote 0x98fa6e4>, d=<gtk.Dialog at remote 0x98faaa4>)
            gtk.main()
(gdb) py-down
#8 (unable to read python frame information)
(gdb) py-down
Unable to find a newer python frame
@end example

and we’re at the bottom of the Python stack.

Note that in Python 3.12 and newer, the same C stack frame can be used for
multiple Python stack frames. This means that @code{py-up} and @code{py-down}
may move multiple Python frames at once. For example:

@example
(gdb) py-up
#6 Frame 0x7ffff7fb62b0, for file /tmp/rec.py, line 5, in recursive_function (n=0)
   time.sleep(5)
#6 Frame 0x7ffff7fb6240, for file /tmp/rec.py, line 7, in recursive_function (n=1)
   recursive_function(n-1)
#6 Frame 0x7ffff7fb61d0, for file /tmp/rec.py, line 7, in recursive_function (n=2)
   recursive_function(n-1)
#6 Frame 0x7ffff7fb6160, for file /tmp/rec.py, line 7, in recursive_function (n=3)
   recursive_function(n-1)
#6 Frame 0x7ffff7fb60f0, for file /tmp/rec.py, line 7, in recursive_function (n=4)
   recursive_function(n-1)
#6 Frame 0x7ffff7fb6080, for file /tmp/rec.py, line 7, in recursive_function (n=5)
   recursive_function(n-1)
#6 Frame 0x7ffff7fb6020, for file /tmp/rec.py, line 9, in <module> ()
   recursive_function(5)
(gdb) py-up
Unable to find an older python frame
@end example
@end quotation

@node py-bt,py-print,py-up and py-down,Using the python-gdb extension
@anchor{howto/gdb_helpers py-bt}@anchor{573a}
@subsubsection @code{py-bt}


@quotation

The @code{py-bt} command attempts to display a Python-level backtrace of the
current thread.

For example:

@example
(gdb) py-bt
#8 (unable to read python frame information)
#11 Frame 0x9aead74, for file /usr/lib/python2.6/site-packages/gnome_sudoku/dialog_swallower.py, line 48, in run_dialog (self=<SwappableArea(running=<gtk.Dialog at remote 0x98faaa4>, main_page=0) at remote 0x98fa6e4>, d=<gtk.Dialog at remote 0x98faaa4>)
            gtk.main()
#14 Frame 0x99262ac, for file /usr/lib/python2.6/site-packages/gnome_sudoku/game_selector.py, line 201, in run_swallowed_dialog (self=<NewOrSavedGameSelector(new_game_model=<gtk.ListStore at remote 0x98fab44>, puzzle=None, saved_games=[@{'gsd.auto_fills': 0, 'tracking': @{@}, 'trackers': @{@}, 'notes': [], 'saved_at': 1270084485, 'game': '7 8 0 0 0 0 0 5 6 0 0 9 0 8 0 1 0 0 0 4 6 0 0 0 0 7 0 6 5 0 0 0 4 7 9 2 0 0 0 9 0 1 0 0 0 3 9 7 6 0 0 0 1 8 0 6 0 0 0 0 2 8 0 0 0 5 0 4 0 6 0 0 2 1 0 0 0 0 0 4 5\n7 8 0 0 0 0 0 5 6 0 0 9 0 8 0 1 0 0 0 4 6 0 0 0 0 7 0 6 5 1 8 3 4 7 9 2 0 0 0 9 0 1 0 0 0 3 9 7 6 0 0 0 1 8 0 6 0 0 0 0 2 8 0 0 0 5 0 4 0 6 0 0 2 1 0 0 0 0 0 4 5', 'gsd.impossible_hints': 0, 'timer.__absolute_start_time__': <float at remote 0x984b474>, 'gsd.hints': 0, 'timer.active_time': <float at remote 0x984b494>, 'timer.total_time': <float at remote 0x984b464>@}], dialog=<gtk.Dialog at remote 0x98faaa4>, saved_game_model=<gtk.ListStore at remote 0x98fad24>, sudoku_maker=<SudokuMaker(terminated=False, played=[], batch_siz...(truncated)
            swallower.run_dialog(self.dialog)
#19 (unable to read python frame information)
#23 (unable to read python frame information)
#34 (unable to read python frame information)
#37 Frame 0x9420b04, for file /usr/lib/python2.6/site-packages/gnome_sudoku/main.py, line 906, in start_game ()
    u = UI()
#40 Frame 0x948e82c, for file /usr/lib/python2.6/site-packages/gnome_sudoku/gnome_sudoku.py, line 22, in start_game (main=<module at remote 0xb771b7f4>)
    main.start_game()
@end example

The frame numbers correspond to those displayed by GDB’s standard
@code{backtrace} command.
@end quotation

@node py-print,py-locals,py-bt,Using the python-gdb extension
@anchor{howto/gdb_helpers py-print}@anchor{573b}
@subsubsection @code{py-print}


@quotation

The @code{py-print} command looks up a Python name and tries to print it.
It looks in locals within the current thread, then globals, then finally
builtins:

@example
(gdb) py-print self
local 'self' = <SwappableArea(running=<gtk.Dialog at remote 0x98faaa4>,
main_page=0) at remote 0x98fa6e4>
(gdb) py-print __name__
global '__name__' = 'gnome_sudoku.dialog_swallower'
(gdb) py-print len
builtin 'len' = <built-in function len>
(gdb) py-print scarlet_pimpernel
'scarlet_pimpernel' not found
@end example

If the current C frame corresponds to multiple Python frames, @code{py-print}
only considers the first one.
@end quotation

@node py-locals,,py-print,Using the python-gdb extension
@anchor{howto/gdb_helpers py-locals}@anchor{573c}
@subsubsection @code{py-locals}


@quotation

The @code{py-locals} command looks up all Python locals within the current
Python frame in the selected thread, and prints their representations:

@example
(gdb) py-locals
self = <SwappableArea(running=<gtk.Dialog at remote 0x98faaa4>,
main_page=0) at remote 0x98fa6e4>
d = <gtk.Dialog at remote 0x98faaa4>
@end example

If the current C frame corresponds to multiple Python frames, locals from
all of them will be shown:

@example
(gdb) py-locals
Locals for recursive_function
n = 0
Locals for recursive_function
n = 1
Locals for recursive_function
n = 2
Locals for recursive_function
n = 3
Locals for recursive_function
n = 4
Locals for recursive_function
n = 5
Locals for <module>
@end example
@end quotation

@node Use with GDB commands,,Using the python-gdb extension,Debugging C API extensions and CPython Internals with GDB
@anchor{howto/gdb_helpers use-with-gdb-commands}@anchor{573d}
@subsection Use with GDB commands


The extension commands complement GDB’s built-in commands.
For example, you can use a frame numbers shown by @code{py-bt} with the @code{frame}
command to go a specific frame within the selected thread, like this:

@example
(gdb) py-bt
(output snipped)
#68 Frame 0xaa4560, for file Lib/test/regrtest.py, line 1548, in <module> ()
        main()
(gdb) frame 68
#68 0x00000000004cd1e6 in PyEval_EvalFrameEx (f=Frame 0xaa4560, for file Lib/test/regrtest.py, line 1548, in <module> (), throwflag=0) at Python/ceval.c:2665
2665                            x = call_function(&sp, oparg);
(gdb) py-list
1543        # Run the tests in a context manager that temporary changes the CWD to a
1544        # temporary and writable directory. If it's not possible to create or
1545        # change the CWD, the original CWD will be used. The original CWD is
1546        # available from test_support.SAVEDCWD.
1547        with test_support.temp_cwd(TESTCWD, quiet=True):
>1548            main()
@end example

The @code{info threads} command will give you a list of the threads within the
process, and you can use the @code{thread} command to select a different one:

@example
(gdb) info threads
  105 Thread 0x7fffefa18710 (LWP 10260)  sem_wait () at ../nptl/sysdeps/unix/sysv/linux/x86_64/sem_wait.S:86
  104 Thread 0x7fffdf5fe710 (LWP 10259)  sem_wait () at ../nptl/sysdeps/unix/sysv/linux/x86_64/sem_wait.S:86
* 1 Thread 0x7ffff7fe2700 (LWP 10145)  0x00000038e46d73e3 in select () at ../sysdeps/unix/syscall-template.S:82
@end example

You can use @code{thread apply all COMMAND} or (@code{t a a COMMAND} for short) to run
a command on all threads.  With @code{py-bt}, this lets you see what every
thread is doing at the Python level:

@example
(gdb) t a a py-bt

Thread 105 (Thread 0x7fffefa18710 (LWP 10260)):
#5 Frame 0x7fffd00019d0, for file /home/david/coding/python-svn/Lib/threading.py, line 155, in _acquire_restore (self=<_RLock(_Verbose__verbose=False, _RLock__owner=140737354016512, _RLock__block=<thread.lock at remote 0x858770>, _RLock__count=1) at remote 0xd7ff40>, count_owner=(1, 140737213728528), count=1, owner=140737213728528)
        self.__block.acquire()
#8 Frame 0x7fffac001640, for file /home/david/coding/python-svn/Lib/threading.py, line 269, in wait (self=<_Condition(_Condition__lock=<_RLock(_Verbose__verbose=False, _RLock__owner=140737354016512, _RLock__block=<thread.lock at remote 0x858770>, _RLock__count=1) at remote 0xd7ff40>, acquire=<instancemethod at remote 0xd80260>, _is_owned=<instancemethod at remote 0xd80160>, _release_save=<instancemethod at remote 0xd803e0>, release=<instancemethod at remote 0xd802e0>, _acquire_restore=<instancemethod at remote 0xd7ee60>, _Verbose__verbose=False, _Condition__waiters=[]) at remote 0xd7fd10>, timeout=None, waiter=<thread.lock at remote 0x858a90>, saved_state=(1, 140737213728528))
            self._acquire_restore(saved_state)
#12 Frame 0x7fffb8001a10, for file /home/david/coding/python-svn/Lib/test/lock_tests.py, line 348, in f ()
            cond.wait()
#16 Frame 0x7fffb8001c40, for file /home/david/coding/python-svn/Lib/test/lock_tests.py, line 37, in task (tid=140737213728528)
                f()

Thread 104 (Thread 0x7fffdf5fe710 (LWP 10259)):
#5 Frame 0x7fffe4001580, for file /home/david/coding/python-svn/Lib/threading.py, line 155, in _acquire_restore (self=<_RLock(_Verbose__verbose=False, _RLock__owner=140737354016512, _RLock__block=<thread.lock at remote 0x858770>, _RLock__count=1) at remote 0xd7ff40>, count_owner=(1, 140736940992272), count=1, owner=140736940992272)
        self.__block.acquire()
#8 Frame 0x7fffc8002090, for file /home/david/coding/python-svn/Lib/threading.py, line 269, in wait (self=<_Condition(_Condition__lock=<_RLock(_Verbose__verbose=False, _RLock__owner=140737354016512, _RLock__block=<thread.lock at remote 0x858770>, _RLock__count=1) at remote 0xd7ff40>, acquire=<instancemethod at remote 0xd80260>, _is_owned=<instancemethod at remote 0xd80160>, _release_save=<instancemethod at remote 0xd803e0>, release=<instancemethod at remote 0xd802e0>, _acquire_restore=<instancemethod at remote 0xd7ee60>, _Verbose__verbose=False, _Condition__waiters=[]) at remote 0xd7fd10>, timeout=None, waiter=<thread.lock at remote 0x858860>, saved_state=(1, 140736940992272))
            self._acquire_restore(saved_state)
#12 Frame 0x7fffac001c90, for file /home/david/coding/python-svn/Lib/test/lock_tests.py, line 348, in f ()
            cond.wait()
#16 Frame 0x7fffac0011c0, for file /home/david/coding/python-svn/Lib/test/lock_tests.py, line 37, in task (tid=140736940992272)
                f()

Thread 1 (Thread 0x7ffff7fe2700 (LWP 10145)):
#5 Frame 0xcb5380, for file /home/david/coding/python-svn/Lib/test/lock_tests.py, line 16, in _wait ()
    time.sleep(0.01)
#8 Frame 0x7fffd00024a0, for file /home/david/coding/python-svn/Lib/test/lock_tests.py, line 378, in _check_notify (self=<ConditionTests(_testMethodName='test_notify', _resultForDoCleanups=<TestResult(_original_stdout=<cStringIO.StringO at remote 0xc191e0>, skipped=[], _mirrorOutput=False, testsRun=39, buffer=False, _original_stderr=<file at remote 0x7ffff7fc6340>, _stdout_buffer=<cStringIO.StringO at remote 0xc9c7f8>, _stderr_buffer=<cStringIO.StringO at remote 0xc9c790>, _moduleSetUpFailed=False, expectedFailures=[], errors=[], _previousTestClass=<type at remote 0x928310>, unexpectedSuccesses=[], failures=[], shouldStop=False, failfast=False) at remote 0xc185a0>, _threads=(0,), _cleanups=[], _type_equality_funcs=@{<type at remote 0x7eba00>: <instancemethod at remote 0xd750e0>, <type at remote 0x7e7820>: <instancemethod at remote 0xd75160>, <type at remote 0x7e30e0>: <instancemethod at remote 0xd75060>, <type at remote 0x7e7d20>: <instancemethod at remote 0xd751e0>, <type at remote 0x7f19e0...(truncated)
        _wait()
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Enum HOWTO,함수형 프로그래밍 HOWTO,Debugging C API extensions and CPython Internals with GDB,파이썬 HOWTO
@anchor{howto/enum doc}@anchor{573e}@anchor{howto/enum enum-howto}@anchor{573f}@anchor{howto/enum id1}@anchor{5740}@anchor{howto/enum translation-repo}@anchor{5741}
@section Enum HOWTO

@anchor{howto/enum enum-basic-tutorial}@anchor{2a49}
An @ref{841,,Enum} is a set of symbolic names bound to unique values.  They are
similar to global variables, but they offer a more useful @ref{1c1,,repr()},
grouping, type-safety, and a few other features.

They are most useful when you have a variable that can take one of a limited
selection of values.  For example, the days of the week:

@example
>>> from enum import Enum
>>> class Weekday(Enum):
...     MONDAY = 1
...     TUESDAY = 2
...     WEDNESDAY = 3
...     THURSDAY = 4
...     FRIDAY = 5
...     SATURDAY = 6
...     SUNDAY = 7
@end example

Or perhaps the RGB primary colors:

@example
>>> from enum import Enum
>>> class Color(Enum):
...     RED = 1
...     GREEN = 2
...     BLUE = 3
@end example

As you can see, creating an @ref{841,,Enum} is as simple as writing a class that
inherits from @code{Enum} itself.

@cartouche
@quotation 참고 
Case of Enum Members

Because Enums are used to represent constants, and to help avoid issues
with name clashes between mixin-class methods/attributes and enum names,
we strongly recommend using UPPER_CASE names for members, and will be using
that style in our examples.
@end quotation
@end cartouche

Depending on the nature of the enum a member’s value may or may not be
important, but either way that value can be used to get the corresponding
member:

@example
>>> Weekday(3)
<Weekday.WEDNESDAY: 3>
@end example

As you can see, the @code{repr()} of a member shows the enum name, the member name,
and the value.  The @code{str()} of a member shows only the enum name and member
name:

@example
>>> print(Weekday.THURSDAY)
Weekday.THURSDAY
@end example

The `type' of an enumeration member is the enum it belongs to:

@example
>>> type(Weekday.MONDAY)
<enum 'Weekday'>
>>> isinstance(Weekday.FRIDAY, Weekday)
True
@end example

Enum members have an attribute that contains just their @code{name}:

@example
>>> print(Weekday.TUESDAY.name)
TUESDAY
@end example

Likewise, they have an attribute for their @code{value}:

@example
>>> Weekday.WEDNESDAY.value
3
@end example

Unlike many languages that treat enumerations solely as name/value pairs,
Python Enums can have behavior added.  For example, @ref{1fa,,datetime.date}
has two methods for returning the weekday:
@ref{28e4,,weekday()} and @ref{28e5,,isoweekday()}.
The difference is that one of them counts from 0-6 and the other from 1-7.
Rather than keep track of that ourselves we can add a method to the @code{Weekday}
enum to extract the day from the @code{date} instance and return the matching
enum member:

@example
@@classmethod
def from_date(cls, date):
    return cls(date.isoweekday())
@end example

The complete @code{Weekday} enum now looks like this:

@example
>>> class Weekday(Enum):
...     MONDAY = 1
...     TUESDAY = 2
...     WEDNESDAY = 3
...     THURSDAY = 4
...     FRIDAY = 5
...     SATURDAY = 6
...     SUNDAY = 7
...     #
...     @@classmethod
...     def from_date(cls, date):
...         return cls(date.isoweekday())
@end example

Now we can find out what today is!  Observe:

@example
>>> import datetime as dt
>>> Weekday.from_date(dt.date.today())
<Weekday.TUESDAY: 2>
@end example

Of course, if you’re reading this on some other day, you’ll see that day instead.

This @code{Weekday} enum is great if our variable only needs one day, but
what if we need several?  Maybe we’re writing a function to plot chores during
a week, and don’t want to use a @ref{24d,,list} – we could use a different type
of @ref{841,,Enum}:

@example
>>> from enum import Flag
>>> class Weekday(Flag):
...     MONDAY = 1
...     TUESDAY = 2
...     WEDNESDAY = 4
...     THURSDAY = 8
...     FRIDAY = 16
...     SATURDAY = 32
...     SUNDAY = 64
@end example

We’ve changed two things: we’re inherited from @ref{834,,Flag}, and the values are
all powers of 2.

Just like the original @code{Weekday} enum above, we can have a single selection:

@example
>>> first_week_day = Weekday.MONDAY
>>> first_week_day
<Weekday.MONDAY: 1>
@end example

But @ref{834,,Flag} also allows us to combine several members into a single
variable:

@example
>>> weekend = Weekday.SATURDAY | Weekday.SUNDAY
>>> weekend
<Weekday.SATURDAY|SUNDAY: 96>
@end example

You can even iterate over a @ref{834,,Flag} variable:

@example
>>> for day in weekend:
...     print(day)
Weekday.SATURDAY
Weekday.SUNDAY
@end example

Okay, let’s get some chores set up:

@example
>>> chores_for_ethan = @{
...     'feed the cat': Weekday.MONDAY | Weekday.WEDNESDAY | Weekday.FRIDAY,
...     'do the dishes': Weekday.TUESDAY | Weekday.THURSDAY,
...     'answer SO questions': Weekday.SATURDAY,
...     @}
@end example

And a function to display the chores for a given day:

@example
>>> def show_chores(chores, day):
...     for chore, days in chores.items():
...         if day in days:
...             print(chore)
...
>>> show_chores(chores_for_ethan, Weekday.SATURDAY)
answer SO questions
@end example

In cases where the actual values of the members do not matter, you can save
yourself some work and use @ref{e9a,,auto()} for the values:

@example
>>> from enum import auto
>>> class Weekday(Flag):
...     MONDAY = auto()
...     TUESDAY = auto()
...     WEDNESDAY = auto()
...     THURSDAY = auto()
...     FRIDAY = auto()
...     SATURDAY = auto()
...     SUNDAY = auto()
...     WEEKEND = SATURDAY | SUNDAY
@end example

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

@end menu

@node Programmatic access to enumeration members and their attributes,Duplicating enum members and values,,Enum HOWTO
@anchor{howto/enum enum-advanced-tutorial}@anchor{2a4a}@anchor{howto/enum programmatic-access-to-enumeration-members-and-their-attributes}@anchor{5742}
@subsection Programmatic access to enumeration members and their attributes


Sometimes it’s useful to access members in enumerations programmatically (i.e.
situations where @code{Color.RED} won’t do because the exact color is not known
at program-writing time).  @code{Enum} allows such access:

@example
>>> Color(1)
<Color.RED: 1>
>>> Color(3)
<Color.BLUE: 3>
@end example

If you want to access enum members by `name', use item access:

@example
>>> Color['RED']
<Color.RED: 1>
>>> Color['GREEN']
<Color.GREEN: 2>
@end example

If you have an enum member and need its @code{name} or @code{value}:

@example
>>> member = Color.RED
>>> member.name
'RED'
>>> member.value
1
@end example

@node Duplicating enum members and values,Ensuring unique enumeration values,Programmatic access to enumeration members and their attributes,Enum HOWTO
@anchor{howto/enum duplicating-enum-members-and-values}@anchor{5743}
@subsection Duplicating enum members and values


Having two enum members with the same name is invalid:

@example
>>> class Shape(Enum):
...     SQUARE = 2
...     SQUARE = 3
...
Traceback (most recent call last):
...
TypeError: 'SQUARE' already defined as 2
@end example

However, an enum member can have other names associated with it.  Given two
entries @code{A} and @code{B} with the same value (and @code{A} defined first), @code{B}
is an alias for the member @code{A}.  By-value lookup of the value of @code{A} will
return the member @code{A}.  By-name lookup of @code{A} will return the member @code{A}.
By-name lookup of @code{B} will also return the member @code{A}:

@example
>>> class Shape(Enum):
...     SQUARE = 2
...     DIAMOND = 1
...     CIRCLE = 3
...     ALIAS_FOR_SQUARE = 2
...
>>> Shape.SQUARE
<Shape.SQUARE: 2>
>>> Shape.ALIAS_FOR_SQUARE
<Shape.SQUARE: 2>
>>> Shape(2)
<Shape.SQUARE: 2>
@end example

@cartouche
@quotation 참고 
Attempting to create a member with the same name as an already
defined attribute (another member, a method, etc.) or attempting to create
an attribute with the same name as a member is not allowed.
@end quotation
@end cartouche

@node Ensuring unique enumeration values,Using automatic values,Duplicating enum members and values,Enum HOWTO
@anchor{howto/enum ensuring-unique-enumeration-values}@anchor{5744}
@subsection Ensuring unique enumeration values


By default, enumerations allow multiple names as aliases for the same value.
When this behavior isn’t desired, you can use the @ref{2a4f,,unique()} decorator:

@example
>>> from enum import Enum, unique
>>> @@unique
... class Mistake(Enum):
...     ONE = 1
...     TWO = 2
...     THREE = 3
...     FOUR = 3
...
Traceback (most recent call last):
...
ValueError: duplicate values found in <enum 'Mistake'>: FOUR -> THREE
@end example

@node Using automatic values,Iteration,Ensuring unique enumeration values,Enum HOWTO
@anchor{howto/enum using-automatic-values}@anchor{5745}
@subsection Using automatic values


If the exact value is unimportant you can use @ref{e9a,,auto}:

@example
>>> from enum import Enum, auto
>>> class Color(Enum):
...     RED = auto()
...     BLUE = auto()
...     GREEN = auto()
...
>>> [member.value for member in Color]
[1, 2, 3]
@end example

The values are chosen by @ref{2a63,,_generate_next_value_()}, which can be
overridden:

@example
>>> class AutoName(Enum):
...     @@staticmethod
...     def _generate_next_value_(name, start, count, last_values):
...         return name
...
>>> class Ordinal(AutoName):
...     NORTH = auto()
...     SOUTH = auto()
...     EAST = auto()
...     WEST = auto()
...
>>> [member.value for member in Ordinal]
['NORTH', 'SOUTH', 'EAST', 'WEST']
@end example

@cartouche
@quotation 참고 
The @ref{2a63,,_generate_next_value_()} method must be defined before any members.
@end quotation
@end cartouche

@node Iteration,Comparisons,Using automatic values,Enum HOWTO
@anchor{howto/enum iteration}@anchor{5746}
@subsection Iteration


Iterating over the members of an enum does not provide the aliases:

@example
>>> list(Shape)
[<Shape.SQUARE: 2>, <Shape.DIAMOND: 1>, <Shape.CIRCLE: 3>]
>>> list(Weekday)
[<Weekday.MONDAY: 1>, <Weekday.TUESDAY: 2>, <Weekday.WEDNESDAY: 4>, <Weekday.THURSDAY: 8>, <Weekday.FRIDAY: 16>, <Weekday.SATURDAY: 32>, <Weekday.SUNDAY: 64>]
@end example

Note that the aliases @code{Shape.ALIAS_FOR_SQUARE} and @code{Weekday.WEEKEND} aren’t shown.

The special attribute @code{__members__} is a read-only ordered mapping of names
to members.  It includes all names defined in the enumeration, including the
aliases:

@example
>>> for name, member in Shape.__members__.items():
...     name, member
...
('SQUARE', <Shape.SQUARE: 2>)
('DIAMOND', <Shape.DIAMOND: 1>)
('CIRCLE', <Shape.CIRCLE: 3>)
('ALIAS_FOR_SQUARE', <Shape.SQUARE: 2>)
@end example

The @code{__members__} attribute can be used for detailed programmatic access to
the enumeration members.  For example, finding all the aliases:

@example
>>> [name for name, member in Shape.__members__.items() if member.name != name]
['ALIAS_FOR_SQUARE']
@end example

@cartouche
@quotation 참고 
Aliases for flags include values with multiple flags set, such as @code{3},
and no flags set, i.e. @code{0}.
@end quotation
@end cartouche

@node Comparisons,Allowed members and attributes of enumerations,Iteration,Enum HOWTO
@anchor{howto/enum comparisons}@anchor{5747}
@subsection Comparisons


Enumeration members are compared by identity:

@example
>>> Color.RED is Color.RED
True
>>> Color.RED is Color.BLUE
False
>>> Color.RED is not Color.BLUE
True
@end example

Ordered comparisons between enumeration values are `not' supported.  Enum
members are not integers (but see @ref{5748,,IntEnum} below):

@example
>>> Color.RED < Color.BLUE
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: '<' not supported between instances of 'Color' and 'Color'
@end example

Equality comparisons are defined though:

@example
>>> Color.BLUE == Color.RED
False
>>> Color.BLUE != Color.RED
True
>>> Color.BLUE == Color.BLUE
True
@end example

Comparisons against non-enumeration values will always compare not equal
(again, @ref{eda,,IntEnum} was explicitly designed to behave differently, see
below):

@example
>>> Color.BLUE == 2
False
@end example

@cartouche
@quotation 경고 
It is possible to reload modules – if a reloaded module contains
enums, they will be recreated, and the new members may not
compare identical/equal to the original members.
@end quotation
@end cartouche

@node Allowed members and attributes of enumerations,Restricted Enum subclassing,Comparisons,Enum HOWTO
@anchor{howto/enum allowed-members-and-attributes-of-enumerations}@anchor{5749}
@subsection Allowed members and attributes of enumerations


Most of the examples above use integers for enumeration values.  Using integers
is short and handy (and provided by default by the @ref{574a,,Functional API}), but not
strictly enforced.  In the vast majority of use-cases, one doesn’t care what
the actual value of an enumeration is.  But if the value `is' important,
enumerations can have arbitrary values.

Enumerations are Python classes, and can have methods and special methods as
usual.  If we have this enumeration:

@example
>>> class Mood(Enum):
...     FUNKY = 1
...     HAPPY = 3
...
...     def describe(self):
...         # self is the member here
...         return self.name, self.value
...
...     def __str__(self):
...         return 'my custom str! @{0@}'.format(self.value)
...
...     @@classmethod
...     def favorite_mood(cls):
...         # cls here is the enumeration
...         return cls.HAPPY
...
@end example

Then:

@example
>>> Mood.favorite_mood()
<Mood.HAPPY: 3>
>>> Mood.HAPPY.describe()
('HAPPY', 3)
>>> str(Mood.FUNKY)
'my custom str! 1'
@end example

The rules for what is allowed are as follows: names that start and end with
a single underscore are reserved by enum and cannot be used; all other
attributes defined within an enumeration will become members of this
enumeration, with the exception of special methods (@ref{82f,,__str__()},
@ref{23dd,,__add__()}, etc.), descriptors (methods are also descriptors), and
variable names listed in @ref{2a61,,_ignore_}.

Note:  if your enumeration defines @ref{79f,,__new__()} and/or @ref{8be,,__init__()},
any value(s) given to the enum member will be passed into those methods.
See @ref{574b,,Planet} for an example.

@cartouche
@quotation 참고 
The @ref{79f,,__new__()} method, if defined, is used during creation of the Enum
members; it is then replaced by Enum’s @code{__new__()} which is used after
class creation for lookup of existing members.  See @ref{574c,,When to use __new__() vs. __init__()} for
more details.
@end quotation
@end cartouche

@node Restricted Enum subclassing,Dataclass support,Allowed members and attributes of enumerations,Enum HOWTO
@anchor{howto/enum restricted-enum-subclassing}@anchor{574d}
@subsection Restricted Enum subclassing


A new @ref{841,,Enum} class must have one base enum class, up to one concrete
data type, and as many @ref{c7d,,object}-based mixin classes as needed.  The
order of these base classes is:

@example
class EnumName([mix-in, ...,] [data-type,] base-enum):
    pass
@end example

Also, subclassing an enumeration is allowed only if the enumeration does not define
any members.  So this is forbidden:

@example
>>> class MoreColor(Color):
...     PINK = 17
...
Traceback (most recent call last):
...
TypeError: <enum 'MoreColor'> cannot extend <enum 'Color'>
@end example

But this is allowed:

@example
>>> class Foo(Enum):
...     def some_behavior(self):
...         pass
...
>>> class Bar(Foo):
...     HAPPY = 1
...     SAD = 2
...
@end example

Allowing subclassing of enums that define members would lead to a violation of
some important invariants of types and instances.  On the other hand, it makes
sense to allow sharing some common behavior between a group of enumerations.
(See @ref{574e,,OrderedEnum} for an example.)

@node Dataclass support,Pickling,Restricted Enum subclassing,Enum HOWTO
@anchor{howto/enum dataclass-support}@anchor{574f}@anchor{howto/enum enum-dataclass-support}@anchor{1af7}
@subsection Dataclass support


When inheriting from a @ref{4e1,,dataclass},
the @ref{1af8,,__repr__()} omits the inherited class’ name.  For example:

@example
>>> from dataclasses import dataclass, field
>>> @@dataclass
... class CreatureDataMixin:
...     size: str
...     legs: int
...     tail: bool = field(repr=False, default=True)
...
>>> class Creature(CreatureDataMixin, Enum):
...     BEETLE = 'small', 6
...     DOG = 'medium', 4
...
>>> Creature.DOG
<Creature.DOG: size='medium', legs=4>
@end example

Use the @ref{4e1,,dataclass()} argument @code{repr=False}
to use the standard @ref{1c1,,repr()}.


버전 3.12에서 변경: Only the dataclass fields are shown in the value area, not the dataclass’
name.


@cartouche
@quotation 참고 
Adding @ref{4e1,,dataclass()} decorator to @ref{841,,Enum}
and its subclasses is not supported. It will not raise any errors,
but it will produce very strange results at runtime, such as members
being equal to each other:

@example
>>> @@dataclass               # don't do this: it does not make any sense
... class Color(Enum):
...    RED = 1
...    BLUE = 2
...
>>> Color.RED is Color.BLUE
False
>>> Color.RED == Color.BLUE  # problem is here: they should not be equal
True
@end example
@end quotation
@end cartouche

@node Pickling,Functional API<2>,Dataclass support,Enum HOWTO
@anchor{howto/enum pickling}@anchor{5750}
@subsection Pickling


Enumerations can be pickled and unpickled:

@example
>>> from test.test_enum import Fruit
>>> from pickle import dumps, loads
>>> Fruit.TOMATO is loads(dumps(Fruit.TOMATO))
True
@end example

The usual restrictions for pickling apply: picklable enums must be defined in
the top level of a module, since unpickling requires them to be importable
from that module.

@cartouche
@quotation 참고 
With pickle protocol version 4 it is possible to easily pickle enums
nested in other classes.
@end quotation
@end cartouche

It is possible to modify how enum members are pickled/unpickled by defining
@ref{196c,,__reduce_ex__()} in the enumeration class.  The default method is by-value,
but enums with complicated values may want to use by-name:

@example
>>> import enum
>>> class MyEnum(enum.Enum):
...     __reduce_ex__ = enum.pickle_by_enum_name
@end example

@cartouche
@quotation 참고 
Using by-name for flags is not recommended, as unnamed aliases will
not unpickle.
@end quotation
@end cartouche

@node Functional API<2>,Derived Enumerations,Pickling,Enum HOWTO
@anchor{howto/enum functional-api}@anchor{574a}
@subsection Functional API


The @ref{841,,Enum} class is callable, providing the following functional API:

@example
>>> Animal = Enum('Animal', 'ANT BEE CAT DOG')
>>> Animal
<enum 'Animal'>
>>> Animal.ANT
<Animal.ANT: 1>
>>> list(Animal)
[<Animal.ANT: 1>, <Animal.BEE: 2>, <Animal.CAT: 3>, <Animal.DOG: 4>]
@end example

The semantics of this API resemble @ref{4e0,,namedtuple}. The first
argument of the call to @ref{841,,Enum} is the name of the enumeration.

The second argument is the `source' of enumeration member names.  It can be a
whitespace-separated string of names, a sequence of names, a sequence of
2-tuples with key/value pairs, or a mapping (e.g. dictionary) of names to
values.  The last two options enable assigning arbitrary values to
enumerations; the others auto-assign increasing integers starting with 1 (use
the @code{start} parameter to specify a different starting value).  A
new class derived from @ref{841,,Enum} is returned.  In other words, the above
assignment to @code{Animal} is equivalent to:

@example
>>> class Animal(Enum):
...     ANT = 1
...     BEE = 2
...     CAT = 3
...     DOG = 4
...
@end example

The reason for defaulting to @code{1} as the starting number and not @code{0} is
that @code{0} is @code{False} in a boolean sense, but by default enum members all
evaluate to @code{True}.

Pickling enums created with the functional API can be tricky as frame stack
implementation details are used to try and figure out which module the
enumeration is being created in (e.g. it will fail if you use a utility
function in a separate module, and also may not work on IronPython or Jython).
The solution is to specify the module name explicitly as follows:

@example
>>> Animal = Enum('Animal', 'ANT BEE CAT DOG', module=__name__)
@end example

@cartouche
@quotation 경고 
If @code{module} is not supplied, and Enum cannot determine what it is,
the new Enum members will not be unpicklable; to keep errors closer to
the source, pickling will be disabled.
@end quotation
@end cartouche

The new pickle protocol 4 also, in some circumstances, relies on
@ref{2370,,__qualname__} being set to the location where pickle will be able
to find the class.  For example, if the class was made available in class
SomeData in the global scope:

@example
>>> Animal = Enum('Animal', 'ANT BEE CAT DOG', qualname='SomeData.Animal')
@end example

The complete signature is:

@example
Enum(
    value='NewEnumName',
    names=<...>,
    *,
    module='...',
    qualname='...',
    type=<mixed-in class>,
    start=1,
    )
@end example


@itemize *

@item 
`value': What the new enum class will record as its name.

@item 
`names': The enum members.  This can be a whitespace- or comma-separated string
(values will start at 1 unless otherwise specified):

@example
'RED GREEN BLUE' | 'RED,GREEN,BLUE' | 'RED, GREEN, BLUE'
@end example

or an iterator of names:

@example
['RED', 'GREEN', 'BLUE']
@end example

or an iterator of (name, value) pairs:

@example
[('CYAN', 4), ('MAGENTA', 5), ('YELLOW', 6)]
@end example

or a mapping:

@example
@{'CHARTREUSE': 7, 'SEA_GREEN': 11, 'ROSEMARY': 42@}
@end example

@item 
`module': name of module where new enum class can be found.

@item 
`qualname': where in module new enum class can be found.

@item 
`type': type to mix in to new enum class.

@item 
`start': number to start counting at if only names are passed in.
@end itemize


버전 3.5에서 변경: The `start' parameter was added.


@node Derived Enumerations,When to use __new__ vs __init__,Functional API<2>,Enum HOWTO
@anchor{howto/enum derived-enumerations}@anchor{5751}
@subsection Derived Enumerations


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

@end menu

@node IntEnum,StrEnum,,Derived Enumerations
@anchor{howto/enum intenum}@anchor{5748}
@subsubsection IntEnum


The first variation of @ref{841,,Enum} that is provided is also a subclass of
@ref{19b,,int}.  Members of an @ref{eda,,IntEnum} can be compared to integers;
by extension, integer enumerations of different types can also be compared
to each other:

@example
>>> from enum import IntEnum
>>> class Shape(IntEnum):
...     CIRCLE = 1
...     SQUARE = 2
...
>>> class Request(IntEnum):
...     POST = 1
...     GET = 2
...
>>> Shape == 1
False
>>> Shape.CIRCLE == 1
True
>>> Shape.CIRCLE == Request.POST
True
@end example

However, they still can’t be compared to standard @ref{841,,Enum} enumerations:

@example
>>> class Shape(IntEnum):
...     CIRCLE = 1
...     SQUARE = 2
...
>>> class Color(Enum):
...     RED = 1
...     GREEN = 2
...
>>> Shape.CIRCLE == Color.RED
False
@end example

@ref{eda,,IntEnum} values behave like integers in other ways you’d expect:

@example
>>> int(Shape.CIRCLE)
1
>>> ['a', 'b', 'c'][Shape.CIRCLE]
'b'
>>> [i for i in range(Shape.SQUARE)]
[0, 1]
@end example

@node StrEnum,IntFlag,IntEnum,Derived Enumerations
@anchor{howto/enum strenum}@anchor{5752}
@subsubsection StrEnum


The second variation of @ref{841,,Enum} that is provided is also a subclass of
@ref{169,,str}.  Members of a @ref{82c,,StrEnum} can be compared to strings;
by extension, string enumerations of different types can also be compared
to each other.


Added in version 3.11.


@node IntFlag,Flag,StrEnum,Derived Enumerations
@anchor{howto/enum intflag}@anchor{5753}
@subsubsection IntFlag


The next variation of @ref{841,,Enum} provided, @ref{e99,,IntFlag}, is also based
on @ref{19b,,int}.  The difference being @code{IntFlag} members can be combined
using the bitwise operators (&, |, ^, ~) and the result is still an
@code{IntFlag} member, if possible.  Like @ref{eda,,IntEnum}, @code{IntFlag}
members are also integers and can be used wherever an @code{int} is used.

@cartouche
@quotation 참고 
Any operation on an @ref{e99,,IntFlag} member besides the bit-wise operations will
lose the @code{IntFlag} membership.

Bit-wise operations that result in invalid @ref{e99,,IntFlag} values will lose the
@code{IntFlag} membership.  See @ref{835,,FlagBoundary} for
details.
@end quotation
@end cartouche


Added in version 3.6.



버전 3.11에서 변경.


Sample @ref{e99,,IntFlag} class:

@example
>>> from enum import IntFlag
>>> class Perm(IntFlag):
...     R = 4
...     W = 2
...     X = 1
...
>>> Perm.R | Perm.W
<Perm.R|W: 6>
>>> Perm.R + Perm.W
6
>>> RW = Perm.R | Perm.W
>>> Perm.R in RW
True
@end example

It is also possible to name the combinations:

@example
>>> class Perm(IntFlag):
...     R = 4
...     W = 2
...     X = 1
...     RWX = 7
...
>>> Perm.RWX
<Perm.RWX: 7>
>>> ~Perm.RWX
<Perm: 0>
>>> Perm(7)
<Perm.RWX: 7>
@end example

@cartouche
@quotation 참고 
Named combinations are considered aliases.  Aliases do not show up during
iteration, but can be returned from by-value lookups.
@end quotation
@end cartouche


버전 3.11에서 변경.


Another important difference between @ref{e99,,IntFlag} and @ref{841,,Enum} is that
if no flags are set (the value is 0), its boolean evaluation is @ref{d2a,,False}:

@example
>>> Perm.R & Perm.X
<Perm: 0>
>>> bool(Perm.R & Perm.X)
False
@end example

Because @ref{e99,,IntFlag} members are also subclasses of @ref{19b,,int} they can
be combined with them (but may lose @code{IntFlag} membership:

@example
>>> Perm.X | 4
<Perm.R|X: 5>

>>> Perm.X + 8
9
@end example

@cartouche
@quotation 참고 
The negation operator, @code{~}, always returns an @ref{e99,,IntFlag} member with a
positive value:

@example
>>> (~Perm.X).value == (Perm.R|Perm.W).value == 6
True
@end example
@end quotation
@end cartouche

@ref{e99,,IntFlag} members can also be iterated over:

@example
>>> list(RW)
[<Perm.R: 4>, <Perm.W: 2>]
@end example


Added in version 3.11.


@node Flag,Others<2>,IntFlag,Derived Enumerations
@anchor{howto/enum flag}@anchor{5754}
@subsubsection Flag


The last variation is @ref{834,,Flag}.  Like @ref{e99,,IntFlag}, @code{Flag}
members can be combined using the bitwise operators (&, |, ^, ~).  Unlike
@code{IntFlag}, they cannot be combined with, nor compared against, any
other @code{Flag} enumeration, nor @ref{19b,,int}.  While it is possible to
specify the values directly it is recommended to use @ref{e9a,,auto} as the
value and let @code{Flag} select an appropriate value.


Added in version 3.6.


Like @ref{e99,,IntFlag}, if a combination of @ref{834,,Flag} members results in no
flags being set, the boolean evaluation is @ref{d2a,,False}:

@example
>>> from enum import Flag, auto
>>> class Color(Flag):
...     RED = auto()
...     BLUE = auto()
...     GREEN = auto()
...
>>> Color.RED & Color.GREEN
<Color: 0>
>>> bool(Color.RED & Color.GREEN)
False
@end example

Individual flags should have values that are powers of two (1, 2, 4, 8, …),
while combinations of flags will not:

@example
>>> class Color(Flag):
...     RED = auto()
...     BLUE = auto()
...     GREEN = auto()
...     WHITE = RED | BLUE | GREEN
...
>>> Color.WHITE
<Color.WHITE: 7>
@end example

Giving a name to the “no flags set” condition does not change its boolean
value:

@example
>>> class Color(Flag):
...     BLACK = 0
...     RED = auto()
...     BLUE = auto()
...     GREEN = auto()
...
>>> Color.BLACK
<Color.BLACK: 0>
>>> bool(Color.BLACK)
False
@end example

@ref{834,,Flag} members can also be iterated over:

@example
>>> purple = Color.RED | Color.BLUE
>>> list(purple)
[<Color.RED: 1>, <Color.BLUE: 2>]
@end example


Added in version 3.11.


@cartouche
@quotation 참고 
For the majority of new code, @ref{841,,Enum} and @ref{834,,Flag} are strongly
recommended, since @ref{eda,,IntEnum} and @ref{e99,,IntFlag} break some
semantic promises of an enumeration (by being comparable to integers, and
thus by transitivity to other unrelated enumerations).  @code{IntEnum}
and @code{IntFlag} should be used only in cases where @code{Enum} and
@code{Flag} will not do; for example, when integer constants are replaced
with enumerations, or for interoperability with other systems.
@end quotation
@end cartouche

@node Others<2>,,Flag,Derived Enumerations
@anchor{howto/enum others}@anchor{5755}
@subsubsection Others


While @ref{eda,,IntEnum} is part of the @ref{5a,,enum} module, it would be very
simple to implement independently:

@example
class IntEnum(int, ReprEnum):   # or Enum instead of ReprEnum
    pass
@end example

This demonstrates how similar derived enumerations can be defined; for example
a @code{FloatEnum} that mixes in @ref{196,,float} instead of @ref{19b,,int}.

Some rules:


@enumerate 

@item 
When subclassing @ref{841,,Enum}, mix-in types must appear before the
@code{Enum} class itself in the sequence of bases, as in the @ref{eda,,IntEnum}
example above.

@item 
Mix-in types must be subclassable. For example, @ref{3c3,,bool} and
@ref{b3d,,range} are not subclassable and will throw an error during Enum
creation if used as the mix-in type.

@item 
While @ref{841,,Enum} can have members of any type, once you mix in an
additional type, all the members must have values of that type, e.g.
@ref{19b,,int} above.  This restriction does not apply to mix-ins which only
add methods and don’t specify another type.

@item 
When another data type is mixed in, the @ref{2a5c,,value} attribute is `not the
same' as the enum member itself, although it is equivalent and will compare
equal.

@item 
A @code{data type} is a mixin that defines @ref{79f,,__new__()}, or a
@ref{4e1,,dataclass}

@item 
%-style formatting:  @code{%s} and @code{%r} call the @ref{841,,Enum} class’s
@ref{82f,,__str__()} and @ref{82e,,__repr__()} respectively; other codes (such as
@code{%i} or @code{%h} for IntEnum) treat the enum member as its mixed-in type.

@item 
@ref{19a,,Formatted string literals}, @ref{832,,str.format()},
and @ref{199,,format()} will use the enum’s @ref{82f,,__str__()} method.
@end enumerate

@cartouche
@quotation 참고 
Because @ref{eda,,IntEnum}, @ref{e99,,IntFlag}, and @ref{82c,,StrEnum} are
designed to be drop-in replacements for existing constants, their
@ref{82f,,__str__()} method has been reset to their data types’
@code{__str__()} method.
@end quotation
@end cartouche

@node When to use __new__ vs __init__,Finer Points,Derived Enumerations,Enum HOWTO
@anchor{howto/enum new-vs-init}@anchor{574c}@anchor{howto/enum when-to-use-new-vs-init}@anchor{5756}
@subsection When to use @code{__new__()} vs. @code{__init__()}


@ref{79f,,__new__()} must be used whenever you want to customize the actual value of
the @ref{841,,Enum} member.  Any other modifications may go in either
@code{__new__()} or @ref{8be,,__init__()}, with @code{__init__()} being preferred.

For example, if you want to pass several items to the constructor, but only
want one of them to be the value:

@example
>>> class Coordinate(bytes, Enum):
...     """
...     Coordinate with binary codes that can be indexed by the int code.
...     """
...     def __new__(cls, value, label, unit):
...         obj = bytes.__new__(cls, [value])
...         obj._value_ = value
...         obj.label = label
...         obj.unit = unit
...         return obj
...     PX = (0, 'P.X', 'km')
...     PY = (1, 'P.Y', 'km')
...     VX = (2, 'V.X', 'km/s')
...     VY = (3, 'V.Y', 'km/s')
...

>>> print(Coordinate['PY'])
Coordinate.PY

>>> print(Coordinate(3))
Coordinate.VY
@end example

@cartouche
@quotation 경고 
`Do not' call @code{super().__new__()}, as the lookup-only @code{__new__} is the one
that is found; instead, use the data type directly.
@end quotation
@end cartouche

@node Finer Points,How are Enums and Flags different?,When to use __new__ vs __init__,Enum HOWTO
@anchor{howto/enum finer-points}@anchor{5757}
@subsection Finer Points


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

@end menu

@node Supported __dunder__ and _sunder_ names,_Private__names,,Finer Points
@anchor{howto/enum supported-dunder-and-sunder-names}@anchor{5758}
@subsubsection Supported @code{__dunder__} and @code{_sunder_} names


The supported @code{__dunder__} and @code{_sunder_} names can be found in the @ref{2a77,,Enum API documentation}.

@node _Private__names,Enum member type,Supported __dunder__ and _sunder_ names,Finer Points
@anchor{howto/enum private-names}@anchor{5759}
@subsubsection _Private__names


@ref{20a1,,Private names} are not converted to enum members,
but remain normal attributes.


버전 3.11에서 변경.


@node Enum member type,Creating members that are mixed with other data types,_Private__names,Finer Points
@anchor{howto/enum enum-member-type}@anchor{575a}
@subsubsection @code{Enum} member type


Enum members are instances of their enum class, and are normally accessed as
@code{EnumClass.member}.  In certain situations, such as writing custom enum
behavior, being able to access one member directly from another is useful,
and is supported; however, in order to avoid name clashes between member names
and attributes/methods from mixed-in classes, upper-case names are strongly
recommended.


버전 3.5에서 변경.


@node Creating members that are mixed with other data types,Boolean value of Enum classes and members,Enum member type,Finer Points
@anchor{howto/enum creating-members-that-are-mixed-with-other-data-types}@anchor{575b}
@subsubsection Creating members that are mixed with other data types


When subclassing other data types, such as @ref{19b,,int} or @ref{169,,str}, with
an @ref{841,,Enum}, all values after the @code{=} are passed to that data type’s
constructor.  For example:

@example
>>> class MyEnum(IntEnum):      # help(int) -> int(x, base=10) -> integer
...     example = '11', 16      # so x='11' and base=16
...
>>> MyEnum.example.value        # and hex(11) is...
17
@end example

@node Boolean value of Enum classes and members,Enum classes with methods,Creating members that are mixed with other data types,Finer Points
@anchor{howto/enum boolean-value-of-enum-classes-and-members}@anchor{575c}
@subsubsection Boolean value of @code{Enum} classes and members


Enum classes that are mixed with non-@ref{841,,Enum} types (such as
@ref{19b,,int}, @ref{169,,str}, etc.) are evaluated according to the mixed-in
type’s rules; otherwise, all members evaluate as @ref{e06,,True}.  To make your
own enum’s boolean evaluation depend on the member’s value add the following to
your class:

@example
def __bool__(self):
    return bool(self.value)
@end example

Plain @ref{841,,Enum} classes always evaluate as @ref{e06,,True}.

@node Enum classes with methods,Combining members of Flag,Boolean value of Enum classes and members,Finer Points
@anchor{howto/enum enum-classes-with-methods}@anchor{575d}
@subsubsection @code{Enum} classes with methods


If you give your enum subclass extra methods, like the @ref{574b,,Planet}
class below, those methods will show up in a @ref{843,,dir()} of the member,
but not of the class:

@example
>>> dir(Planet)
['EARTH', 'JUPITER', 'MARS', 'MERCURY', 'NEPTUNE', 'SATURN', 'URANUS', 'VENUS', '__class__', '__doc__', '__members__', '__module__']
>>> dir(Planet.EARTH)
['__class__', '__doc__', '__module__', 'mass', 'name', 'radius', 'surface_gravity', 'value']
@end example

@node Combining members of Flag,Flag and IntFlag minutia,Enum classes with methods,Finer Points
@anchor{howto/enum combining-members-of-flag}@anchor{575e}
@subsubsection Combining members of @code{Flag}


Iterating over a combination of @ref{834,,Flag} members will only return the members that
are comprised of a single bit:

@example
>>> class Color(Flag):
...     RED = auto()
...     GREEN = auto()
...     BLUE = auto()
...     MAGENTA = RED | BLUE
...     YELLOW = RED | GREEN
...     CYAN = GREEN | BLUE
...
>>> Color(3)  # named combination
<Color.YELLOW: 3>
>>> Color(7)      # not named combination
<Color.RED|GREEN|BLUE: 7>
@end example

@node Flag and IntFlag minutia,,Combining members of Flag,Finer Points
@anchor{howto/enum flag-and-intflag-minutia}@anchor{575f}
@subsubsection @code{Flag} and @code{IntFlag} minutia


Using the following snippet for our examples:

@example
>>> class Color(IntFlag):
...     BLACK = 0
...     RED = 1
...     GREEN = 2
...     BLUE = 4
...     PURPLE = RED | BLUE
...     WHITE = RED | GREEN | BLUE
...
@end example

the following are true:


@itemize -

@item 
single-bit flags are canonical

@item 
multi-bit and zero-bit flags are aliases

@item 
only canonical flags are returned during iteration:

@example
>>> list(Color.WHITE)
[<Color.RED: 1>, <Color.GREEN: 2>, <Color.BLUE: 4>]
@end example

@item 
negating a flag or flag set returns a new flag/flag set with the
corresponding positive integer value:

@example
>>> Color.BLUE
<Color.BLUE: 4>

>>> ~Color.BLUE
<Color.RED|GREEN: 3>
@end example

@item 
names of pseudo-flags are constructed from their members’ names:

@example
>>> (Color.RED | Color.GREEN).name
'RED|GREEN'

>>> class Perm(IntFlag):
...     R = 4
...     W = 2
...     X = 1
...
>>> (Perm.R & Perm.W).name is None  # effectively Perm(0)
True
@end example

@item 
multi-bit flags, aka aliases, can be returned from operations:

@example
>>> Color.RED | Color.BLUE
<Color.PURPLE: 5>

>>> Color(7)  # or Color(-1)
<Color.WHITE: 7>

>>> Color(0)
<Color.BLACK: 0>
@end example

@item 
membership / containment checking: zero-valued flags are always considered
to be contained:

@example
>>> Color.BLACK in Color.WHITE
True
@end example

otherwise, only if all bits of one flag are in the other flag will True
be returned:

@example
>>> Color.PURPLE in Color.WHITE
True

>>> Color.GREEN in Color.PURPLE
False
@end example
@end itemize

There is a new boundary mechanism that controls how out-of-range / invalid
bits are handled: @code{STRICT}, @code{CONFORM}, @code{EJECT}, and @code{KEEP}:


@itemize *

@item 
STRICT –> raises an exception when presented with invalid values

@item 
CONFORM –> discards any invalid bits

@item 
EJECT –> lose Flag status and become a normal int with the given value

@item 
KEEP –> keep the extra bits


@itemize -

@item 
keeps Flag status and extra bits

@item 
extra bits do not show up in iteration

@item 
extra bits do show up in repr() and str()
@end itemize
@end itemize

The default for Flag is @code{STRICT}, the default for @code{IntFlag} is @code{EJECT},
and the default for @code{_convert_} is @code{KEEP} (see @code{ssl.Options} for an
example of when @code{KEEP} is needed).

@node How are Enums and Flags different?,Enum Cookbook,Finer Points,Enum HOWTO
@anchor{howto/enum enum-class-differences}@anchor{2a4c}@anchor{howto/enum how-are-enums-and-flags-different}@anchor{5760}
@subsection How are Enums and Flags different?


Enums have a custom metaclass that affects many aspects of both derived @ref{841,,Enum}
classes and their instances (members).

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

@end menu

@node Enum Classes,Flag Classes,,How are Enums and Flags different?
@anchor{howto/enum enum-classes}@anchor{5761}
@subsubsection Enum Classes


The @ref{4f7,,EnumType} metaclass is responsible for providing the
@ref{15be,,__contains__()}, @ref{176c,,__dir__()}, @ref{e68,,__iter__()} and other methods that
allow one to do things with an @ref{841,,Enum} class that fail on a typical
class, such as @code{list(Color)} or @code{some_enum_var in Color}.  @code{EnumType} is
responsible for ensuring that various other methods on the final @code{Enum}
class are correct (such as @ref{79f,,__new__()}, @ref{fd3,,__getnewargs__()},
@ref{82f,,__str__()} and @ref{82e,,__repr__()}).

@node Flag Classes,Enum Members aka instances,Enum Classes,How are Enums and Flags different?
@anchor{howto/enum flag-classes}@anchor{5762}
@subsubsection Flag Classes


Flags have an expanded view of aliasing: to be canonical, the value of a flag
needs to be a power-of-two value, and not a duplicate name.  So, in addition to the
@ref{841,,Enum} definition of alias, a flag with no value (a.k.a. @code{0}) or with more than one
power-of-two value (e.g. @code{3}) is considered an alias.

@node Enum Members aka instances,Flag Members,Flag Classes,How are Enums and Flags different?
@anchor{howto/enum enum-members-aka-instances}@anchor{5763}
@subsubsection Enum Members (aka instances)


The most interesting thing about enum members is that they are singletons.
@ref{4f7,,EnumType} creates them all while it is creating the enum class itself,
and then puts a custom @ref{79f,,__new__()} in place to ensure that no new ones are
ever instantiated by returning only the existing member instances.

@node Flag Members,,Enum Members aka instances,How are Enums and Flags different?
@anchor{howto/enum flag-members}@anchor{5764}
@subsubsection Flag Members


Flag members can be iterated over just like the @ref{834,,Flag} class, and only the
canonical members will be returned.  For example:

@example
>>> list(Color)
[<Color.RED: 1>, <Color.GREEN: 2>, <Color.BLUE: 4>]
@end example

(Note that @code{BLACK}, @code{PURPLE}, and @code{WHITE} do not show up.)

Inverting a flag member returns the corresponding positive value,
rather than a negative value — for example:

@example
>>> ~Color.RED
<Color.GREEN|BLUE: 6>
@end example

Flag members have a length corresponding to the number of power-of-two values
they contain.  For example:

@example
>>> len(Color.PURPLE)
2
@end example

@node Enum Cookbook,Subclassing EnumType,How are Enums and Flags different?,Enum HOWTO
@anchor{howto/enum enum-cookbook}@anchor{2a4b}@anchor{howto/enum id2}@anchor{5765}
@subsection Enum Cookbook


While @ref{841,,Enum}, @ref{eda,,IntEnum}, @ref{82c,,StrEnum}, @ref{834,,Flag}, and
@ref{e99,,IntFlag} are expected to cover the majority of use-cases, they cannot
cover them all.  Here are recipes for some different types of enumerations
that can be used directly, or as examples for creating one’s own.

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

@end menu

@node Omitting values,OrderedEnum,,Enum Cookbook
@anchor{howto/enum omitting-values}@anchor{5766}
@subsubsection Omitting values


In many use-cases, one doesn’t care what the actual value of an enumeration
is. There are several ways to define this type of simple enumeration:


@itemize -

@item 
use instances of @ref{e9a,,auto} for the value

@item 
use instances of @ref{c7d,,object} as the value

@item 
use a descriptive string as the value

@item 
use a tuple as the value and a custom @ref{79f,,__new__()} to replace the
tuple with an @ref{19b,,int} value
@end itemize

Using any of these methods signifies to the user that these values are not
important, and also enables one to add, remove, or reorder members without
having to renumber the remaining members.

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

@end menu

@node Using auto,Using object,,Omitting values
@anchor{howto/enum using-auto}@anchor{5767}
@subsubsection Using @code{auto}


Using @ref{e9a,,auto} would look like:

@example
>>> class Color(Enum):
...     RED = auto()
...     BLUE = auto()
...     GREEN = auto()
...
>>> Color.GREEN
<Color.GREEN: 3>
@end example

@node Using object,Using a descriptive string,Using auto,Omitting values
@anchor{howto/enum using-object}@anchor{5768}
@subsubsection Using @code{object}


Using @ref{c7d,,object} would look like:

@example
>>> class Color(Enum):
...     RED = object()
...     GREEN = object()
...     BLUE = object()
...
>>> Color.GREEN
<Color.GREEN: <object object at 0x...>>
@end example

This is also a good example of why you might want to write your own
@ref{82e,,__repr__()}:

@example
>>> class Color(Enum):
...     RED = object()
...     GREEN = object()
...     BLUE = object()
...     def __repr__(self):
...         return "<%s.%s>" % (self.__class__.__name__, self._name_)
...
>>> Color.GREEN
<Color.GREEN>
@end example

@node Using a descriptive string,Using a custom __new__,Using object,Omitting values
@anchor{howto/enum using-a-descriptive-string}@anchor{5769}
@subsubsection Using a descriptive string


Using a string as the value would look like:

@example
>>> class Color(Enum):
...     RED = 'stop'
...     GREEN = 'go'
...     BLUE = 'too fast!'
...
>>> Color.GREEN
<Color.GREEN: 'go'>
@end example

@node Using a custom __new__,,Using a descriptive string,Omitting values
@anchor{howto/enum using-a-custom-new}@anchor{576a}
@subsubsection Using a custom @code{__new__()}


Using an auto-numbering @ref{79f,,__new__()} would look like:

@example
>>> class AutoNumber(Enum):
...     def __new__(cls):
...         value = len(cls.__members__) + 1
...         obj = object.__new__(cls)
...         obj._value_ = value
...         return obj
...
>>> class Color(AutoNumber):
...     RED = ()
...     GREEN = ()
...     BLUE = ()
...
>>> Color.GREEN
<Color.GREEN: 2>
@end example

To make a more general purpose @code{AutoNumber}, add @code{*args} to the signature:

@example
>>> class AutoNumber(Enum):
...     def __new__(cls, *args):      # this is the only change from above
...         value = len(cls.__members__) + 1
...         obj = object.__new__(cls)
...         obj._value_ = value
...         return obj
...
@end example

Then when you inherit from @code{AutoNumber} you can write your own @code{__init__}
to handle any extra arguments:

@example
>>> class Swatch(AutoNumber):
...     def __init__(self, pantone='unknown'):
...         self.pantone = pantone
...     AUBURN = '3497'
...     SEA_GREEN = '1246'
...     BLEACHED_CORAL = () # New color, no Pantone code yet!
...
>>> Swatch.SEA_GREEN
<Swatch.SEA_GREEN: 2>
>>> Swatch.SEA_GREEN.pantone
'1246'
>>> Swatch.BLEACHED_CORAL.pantone
'unknown'
@end example

@cartouche
@quotation 참고 
The @ref{79f,,__new__()} method, if defined, is used during creation of the Enum
members; it is then replaced by Enum’s @code{__new__()} which is used after
class creation for lookup of existing members.
@end quotation
@end cartouche

@cartouche
@quotation 경고 
`Do not' call @code{super().__new__()}, as the lookup-only @code{__new__} is the one
that is found; instead, use the data type directly – e.g.:

@example
obj = int.__new__(cls, value)
@end example
@end quotation
@end cartouche

@node OrderedEnum,DuplicateFreeEnum,Omitting values,Enum Cookbook
@anchor{howto/enum orderedenum}@anchor{574e}
@subsubsection OrderedEnum


An ordered enumeration that is not based on @ref{eda,,IntEnum} and so maintains
the normal @ref{841,,Enum} invariants (such as not being comparable to other
enumerations):

@example
>>> class OrderedEnum(Enum):
...     def __ge__(self, other):
...         if self.__class__ is other.__class__:
...             return self.value >= other.value
...         return NotImplemented
...     def __gt__(self, other):
...         if self.__class__ is other.__class__:
...             return self.value > other.value
...         return NotImplemented
...     def __le__(self, other):
...         if self.__class__ is other.__class__:
...             return self.value <= other.value
...         return NotImplemented
...     def __lt__(self, other):
...         if self.__class__ is other.__class__:
...             return self.value < other.value
...         return NotImplemented
...
>>> class Grade(OrderedEnum):
...     A = 5
...     B = 4
...     C = 3
...     D = 2
...     F = 1
...
>>> Grade.C < Grade.A
True
@end example

@node DuplicateFreeEnum,MultiValueEnum,OrderedEnum,Enum Cookbook
@anchor{howto/enum duplicatefreeenum}@anchor{576b}
@subsubsection DuplicateFreeEnum


Raises an error if a duplicate member value is found instead of creating an
alias:

@example
>>> class DuplicateFreeEnum(Enum):
...     def __init__(self, *args):
...         cls = self.__class__
...         if any(self.value == e.value for e in cls):
...             a = self.name
...             e = cls(self.value).name
...             raise ValueError(
...                 "aliases not allowed in DuplicateFreeEnum:  %r --> %r"
...                 % (a, e))
...
>>> class Color(DuplicateFreeEnum):
...     RED = 1
...     GREEN = 2
...     BLUE = 3
...     GRENE = 2
...
Traceback (most recent call last):
  ...
ValueError: aliases not allowed in DuplicateFreeEnum:  'GRENE' --> 'GREEN'
@end example

@cartouche
@quotation 참고 
This is a useful example for subclassing Enum to add or change other
behaviors as well as disallowing aliases.  If the only desired change is
disallowing aliases, the @ref{2a4f,,unique()} decorator can be used instead.
@end quotation
@end cartouche

@node MultiValueEnum,Planet,DuplicateFreeEnum,Enum Cookbook
@anchor{howto/enum multi-value-enum}@anchor{2a69}@anchor{howto/enum multivalueenum}@anchor{576c}
@subsubsection MultiValueEnum


Supports having more than one value per member:

@example
>>> class MultiValueEnum(Enum):
...     def __new__(cls, value, *values):
...         self = object.__new__(cls)
...         self._value_ = value
...         for v in values:
...             self._add_value_alias_(v)
...         return self
...
>>> class DType(MultiValueEnum):
...     float32 = 'f', 8
...     double64 = 'd', 9
...
>>> DType('f')
<DType.float32: 'f'>
>>> DType(9)
<DType.double64: 'd'>
@end example

@node Planet,TimePeriod,MultiValueEnum,Enum Cookbook
@anchor{howto/enum planet}@anchor{574b}
@subsubsection Planet


If @ref{79f,,__new__()} or @ref{8be,,__init__()} is defined, the value of the enum member
will be passed to those methods:

@example
>>> class Planet(Enum):
...     MERCURY = (3.303e+23, 2.4397e6)
...     VENUS   = (4.869e+24, 6.0518e6)
...     EARTH   = (5.976e+24, 6.37814e6)
...     MARS    = (6.421e+23, 3.3972e6)
...     JUPITER = (1.9e+27,   7.1492e7)
...     SATURN  = (5.688e+26, 6.0268e7)
...     URANUS  = (8.686e+25, 2.5559e7)
...     NEPTUNE = (1.024e+26, 2.4746e7)
...     def __init__(self, mass, radius):
...         self.mass = mass       # in kilograms
...         self.radius = radius   # in meters
...     @@property
...     def surface_gravity(self):
...         # universal gravitational constant  (m3 kg-1 s-2)
...         G = 6.67300E-11
...         return G * self.mass / (self.radius * self.radius)
...
>>> Planet.EARTH.value
(5.976e+24, 6378140.0)
>>> Planet.EARTH.surface_gravity
9.802652743337129
@end example

@node TimePeriod,,Planet,Enum Cookbook
@anchor{howto/enum enum-time-period}@anchor{2a62}@anchor{howto/enum timeperiod}@anchor{576d}
@subsubsection TimePeriod


An example to show the @ref{2a61,,_ignore_} attribute in use:

@example
>>> import datetime as dt
>>> class Period(dt.timedelta, Enum):
...     "different lengths of time"
...     _ignore_ = 'Period i'
...     Period = vars()
...     for i in range(367):
...         Period['day_%d' % i] = i
...
>>> list(Period)[:2]
[<Period.day_0: datetime.timedelta(0)>, <Period.day_1: datetime.timedelta(days=1)>]
>>> list(Period)[-2:]
[<Period.day_365: datetime.timedelta(days=365)>, <Period.day_366: datetime.timedelta(days=366)>]
@end example

@node Subclassing EnumType,,Enum Cookbook,Enum HOWTO
@anchor{howto/enum enumtype-examples}@anchor{2a52}@anchor{howto/enum subclassing-enumtype}@anchor{576e}
@subsection Subclassing EnumType


While most enum needs can be met by customizing @ref{841,,Enum} subclasses,
either with class decorators or custom functions, @ref{4f7,,EnumType} can be
subclassed to provide a different Enum experience.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 함수형 프로그래밍 HOWTO,로깅 HOWTO,Enum HOWTO,파이썬 HOWTO
@anchor{howto/functional doc}@anchor{576f}@anchor{howto/functional functional-howto}@anchor{5770}@anchor{howto/functional functional-programming-howto}@anchor{5771}@anchor{howto/functional translation-repo}@anchor{5772}
@section 함수형 프로그래밍 HOWTO


@*저자: 
A. M. Kuchling


@*버전: 
0.32


이 문서에서는, 함수형 방식으로 프로그램을 구현하는데 적합한 파이썬의 특성에 대해 알아볼 것입니다. 함수형 프로그래밍의 개념을 소개한 뒤에, @ref{4ca,,이터레이터} , @ref{1260,,제너레이터} 와 같은 언어의 특성과 @ref{85,,itertools} , @ref{63,,functools} 와 같은 관련 라이브러리 모듈을 살펴볼 것입니다.

@menu
* 소개: 소개<8>. 
* 이터레이터: 이터레이터<2>. 
* 제너레이터 표현식과 리스트 컴프리헨션:: 
* 제너레이터: 제너레이터<2>. 
* 내장 함수: 내장 함수<2>. 
* itertools 모듈:: 
* functools 모듈:: 
* 작은 함수와 람다 표현식:: 
* 개정내역 및 감사의 글:: 
* 참고 문헌:: 

@end menu

@node 소개<8>,이터레이터<2>,,함수형 프로그래밍 HOWTO
@anchor{howto/functional introduction}@anchor{5773}
@subsection 소개


이 절에서는 함수형 프로그래밍의 기본적인 개념을 설명합니다; 만약 단순히 파이썬의 언어적 특성에 관해서만 관심이 있으시다면, @ref{5774,,이터레이터} 절로 건너뛰세요.

프로그래밍 언어들은 다음과 같이 각각 다른 방식으로 문제를 더 작은 부분으로 분할하는 방법을 지원합니다:


@itemize *

@item 
대부분의 프로그래밍 언어들은 `절차적' 입니다: 프로그램은 컴퓨터에 프로그램의 입력을 어떻게 할지 알려주는 명령 목록입니다. C, 파스칼, 유닉스 셸과 같은 것들은 절차적 언어입니다.

@item 
`선언적' 언어에서는 해결해야 할 문제를 설명하는 명세서를 작성하고, 언어 구현은 계산을 효과적으로 수행하는 방법을 파악합니다. SQL은 가장 친숙한 선언적 언어입니다; SQL 질의는 검색하고 싶은 데이터 세트를 설명하고, SQL 엔진은 테이블을 스캔하거나 인덱스를 사용할 것인지, 어떤 하위 구문을 먼저 수행해야 하는지 등을 결정합니다.

@item 
`객체지향' 프로그램은 객체들의 컬렉션을 다룹니다. 객체는 내부적인 상태를 갖고 있으며 이 내부적인 상태를 어떤 방식으로 가져오거나 수정하는 메서드를 제공합니다. 스몰토크와 자바는 객체지향 언어입니다. C++ 와 파이썬은 객체지향 프로그래밍을 지원하는 언어이지만, 객체 지향적인 특성들을 사용하도록 강제하지는 않습니다.

@item 
`함수형' 프로그래밍은 함수들의 세트로 문제를 분해합니다. 이상적으로 말하면, 함수들은 입력을 받아서 출력을 만들어내기만 하며, 주어진 입력에 대해 생성된 출력에 영향을 끼칠만한 어떠한 내부적인 상태도 가지지 않습니다. 잘 알려진 함수형 언어로는 ML 계열(Standard ML, OCaml 및 다른 변형)과 하스켈이 있습니다.
@end itemize

일부 컴퓨터 언어의 설계자들은 프로그래밍에 대한 한 가지의 특별한 접근 방식을 강조합니다. 이것은 종종 다른 접근 방식으로 프로그램을 작성하는 것을 어렵게 만듭니다. 다른 언어들은 다양한 접근 방법을 지원하는 다중 패러다임 언어입니다. Lisp, C++, 파이썬 등은 다중 패러다임 언어입니다; 이러한 언어에서는 절차적, 객체 지향적 혹은 함수형으로 프로그램이나 라이브러리를 작성할 수 있습니다. 거대한 프로그램에서, 각 구역은 서로 다른 접근 방법을 사용하여 작성될 수 있습니다; 예를 들어 처리 로직이 절차적 혹은 함수형으로 작성되었을 때, GUI는 객체 지향적으로 작성될 수 있습니다.

함수형 프로그램에서, 입력은 여러 함수의 세트를 통해 흘러 다닙니다. 각 함수는 입력으로부터 동작해서 출력을 만들어냅니다. 함수형 방식은 내부 상태를 수정하거나 함수의 반환 값에서 보이지 않는 다른 변경사항들을 만드는 부작용이 있는 함수를 사용하지 않습니다. 부작용이 전혀 없는 함수를 `순수 함수' 라고 합니다. 부작용을 피한다는 것은 프로그램이 실행될 때 수정될 수 있는 자료 구조를 사용하지 않는다는 의미입니다; 모든 함수의 출력은 입력에만 의존해야 합니다.

어떤 언어는 순수성에 대해 매우 엄격하며, @code{a=3} 혹은 @code{c = a + b} 와 같은 대입문조차 없지만, 화면에 출력하거나 디스크 파일에 쓰는 작업과 같은, 모든 부작용을 피하는 것은 어렵습니다. 다른 예로, @ref{1174,,print()} 혹은 @ref{8ab,,time.sleep()} 함수를 호출하면 쓸모 있는 값을 반환하지 않습니다. 이 함수들은 화면에 문자열을 보내거나 잠시 동안 실행을 일시 중지하는 작업과 같은 부작용을 위해 호출합니다.

함수형 방식으로 작성된 파이썬 프로그램은 보통 극단적으로 모든 I/O 혹은 대입문을 회피하는 방식으로 나아가지는 않습니다; 대신 함수형처럼 보이는 인터페이스를 제공하며 내부적으로는 함수형이 아닌 기능들을 사용합니다. 예를 들어 함수의 구현은 여전히 지역 변수에 값을 대입하는 방식이 사용되지만 전역 변수를 수정하거나 다른 부작용을 발생시키지는 않습니다.

함수형 프로그래밍은 객체 지향 프로그래밍의 반대라고 생각할 수 있습니다. 객체는 내부 상태들을 갖고 있으며 이 상태들을 수정할 수 있는 메서드의 호출 모음이 포함된 작은 캡슐이며, 프로그램은 올바른 상태 변경 집합을 구성합니다. 함수형 프로그래밍은 가능한 한 상태 변경을 피하고자 하며 함수 간의 데이터 흐름을 사용합니다. 파이썬에서는 응용 프로그램의 객체를 나타내는 인스턴스(전자 우편 메시지, 트랜잭션 등)를 가져와서 반환하는 함수를 작성함으로써 두 가지 접근 방식을 결합할 수 있습니다.

함수형 설계는 동작 방식에 이상한 제약이 있는 것처럼 보일 수 있습니다. 왜 객체와 부작용을 피해야만 할까요? 함수형 방식은 이론적으로도, 실질적으로도 다음과 같은 장점이 있습니다:


@itemize *

@item 
형식적 증명 가능성.

@item 
모듈성.

@item 
결합성.

@item 
디버깅과 테스트 용이성.
@end itemize

@menu
* 형식적 증명 가능성:: 
* 모듈성:: 
* 디버깅과 테스트 용이성:: 
* 결합성:: 

@end menu

@node 형식적 증명 가능성,모듈성,,소개<8>
@anchor{howto/functional formal-provability}@anchor{5775}
@subsubsection 형식적 증명 가능성


이론적인 장점은 함수형 프로그램이 정확하다는 수학적 증명을 만드는 것이 더 쉽다는 것입니다.

오랫동안 연구자들은 수학적으로 프로그램이 정확하다는 것을 증명하는 방법을 찾는 데 관심을 보여왔습니다. 이것은 수많은 입력에 대해 프로그램을 테스트하고 출력이 정확하다고 결론짓거나, 프로그램의 소스코드를 읽어보고 코드가 올바르다고 결론짓는 것과는 다릅니다; 그들의 목표는 입력 가능한 모든 것에 대해 프로그램이 올바른 결과를 산출한다는 엄격한 증거를 찾는 것입니다.

프로그램이 올바른지 증명하기 위해 사용하는 기술은 항상 참인 입력 데이터와 프로그램의 변수라는 특성을 지닌 `불변자' 를 작성하는 것입니다. 각 코드 행에 대해, 그 행이 실행되기 `전에' 불변자 X와 Y가 참이라면, 그 행이 실행된 `후에' 약간 다른 불변자 X’ 및 Y’가 참이라는 것을 보여줍니다. 이 작업은 프로그램이 종료될 때까지 계속되며, 종료 시점에서 불변자는 프로그램의 출력으로써 원하는 조건과 일치해야만 합니다.

함수형 프로그래밍에서 값 대입을 피하려는 이유는 값 대입이 이러한 기법을 활용하는 것을 어렵게 만들기 때문입니다; 대입은 다음 단계로 나아갈 수 있는 새 불변자를 만들지 않은 채로, 대입전에 참이었던 불변자를 무너뜨릴 수 있습니다.

불행하게도, 정확한 프로그램임을 증명하는 것은 실제로는 비실용적이며 파이썬 소프트웨어와 관련이 없습니다. 사소한 프로그램일지라도 여러 페이지 분량의 증명이 필요합니다; 적당히 복잡한 프로그램에 대한 정확성의 증명은 엄청난 양일 것이며, 매일 사용하는 프로그램 (파이썬 인터프리터, XML 파서, 웹 브라우저)의 정확성은 거의 증명이 불가능할 수도 있습니다. 만약 증명을 작성하거나 만들었더라도, 그 증명이 검증된 것인지 의구심이 들 것입니다; 어쩌면 그 증명에 오류가 있을 수도 있고, 프로그램의 정확성이 증명되었다고 잘못 믿고 있을 수도 있습니다.

@node 모듈성,디버깅과 테스트 용이성,형식적 증명 가능성,소개<8>
@anchor{howto/functional modularity}@anchor{5776}
@subsubsection 모듈성


함수형 프로그래밍의 실질적인 이점은 문제를 작은 조각으로 분해하도록 강제한다는 점입니다. 결과적으로 프로그램은 더욱 모듈화가 됩니다. 복잡한 변환을 수행하는 거대한 함수보다, 한 가지 작업을 수행하는 작은 함수를 명시하고 작성하기가 더 쉽습니다. 작은 함수는 읽기에도 더 쉽고 오류를 확인하기도 쉽습니다.

@node 디버깅과 테스트 용이성,결합성,모듈성,소개<8>
@anchor{howto/functional ease-of-debugging-and-testing}@anchor{5777}
@subsubsection 디버깅과 테스트 용이성


함수형 방식 프로그램은 테스트하고 디버깅하는 것이 더 쉽습니다.

일반적으로 함수가 작고 분명하게 명시되기 때문에 디버깅이 단순화됩니다. 프로그램이 동작하지 않는다면, 각 함수는 데이터가 올바른지 확인할 수 있는 접점이 됩니다. 중간 지점의 입력과 출력을 살펴보면 버그가 있는 함수를 빠르게 분간할 수 있습니다.

각 함수는 잠재적으로 단위 테스트의 대상이기 때문에 테스트가 더 쉽습니다. 함수는 테스트를 실행하기 전에 복제해야 하는 시스템 상태에 의존하지 않습니다; 올바른 입력을 만들고 결과가 예상과 일치하는지 확인만 하면 됩니다.

@node 결합성,,디버깅과 테스트 용이성,소개<8>
@anchor{howto/functional composability}@anchor{5778}
@subsubsection 결합성


함수형 방식의 프로그램을 만들 때, 다양한 입력과 출력으로 여러 가지 함수를 작성하게 됩니다. 이러한 함수 중 일부는 불가피하게 특정 응용 프로그램에 특화될 수 있지만, 대체로 다양한 프로그램에서 유용하게 사용할 수 있습니다. 예를 들어 디렉터리 경로를 받아서 그 디렉터리 내의 모든 XML 파일을 반환하는 함수나, 혹은 파일명을 받아서 그 내용을 반환하는 함수는 다양한 상황에 적용할 수 있습니다.

시간이 흐르면, 여러분은 개인적인 유틸리티 라이브러리를 구성하게 될 것입니다. 보통, 새로운 구성으로 기존 함수를 배치하고 현재 작업에 특화된 몇 가지 함수만을 작성해서 새로운 프로그램을 구성하게 됩니다.

@node 이터레이터<2>,제너레이터 표현식과 리스트 컴프리헨션,소개<8>,함수형 프로그래밍 HOWTO
@anchor{howto/functional functional-howto-iterators}@anchor{5774}@anchor{howto/functional iterators}@anchor{5779}
@subsection 이터레이터


함수형 방식의 프로그램을 작성하는 중요한 토대가 되는 파이썬 언어의 기능을 살펴보겠습니다: 이터레이터.

이터레이터는 데이터 스트림을 나타내는 객체입니다; 이 객체는 한 번에 한 요소씩 데이터를 반환합니다. 파이썬 이터레이터는 반드시 @ref{14d2,,__next__()} 라는 메서드를 지원해야 합니다. 이 메서드는 인자를 취하지 않고 항상 스트림의 다음 요소를 반환합니다. 만약 스트림에 더는 요소가 없다면, @code{__next__()} 는 @ref{df4,,StopIteration} 예외를 발생시켜야 합니다. 이터레이터가 유한할 필요는 없습니다; 무한한 데이터 스트림을 생성하는 이터레이터를 작성하는 것도 합리적인 방법입니다.

내장 함수 @ref{9d7,,iter()} 는 임의의 객체를 취하여 객체의 내용이나 요소를 반환하는 이터레이터를 반환합니다. 객체가 이터레이션을 지원하지 않으면 @ref{198,,TypeError} 를 발생시킵니다. 파이썬의 내장 데이터형 중 몇 가지가 이터레이션을 지원하는데, 가장 일반적인 것은 리스트와 딕셔너리입니다. 이터레이터를 얻을 수 있는 객체는 @ref{142c,,이터러블} 이라고 불립니다.

수동으로 이터레이션 인터페이스를 실험해볼 수 있습니다:

@example
>>> L = [1, 2, 3]
>>> it = iter(L)
>>> it
<...iterator object at ...>
>>> it.__next__()  # same as next(it)
1
>>> next(it)
2
>>> next(it)
3
>>> next(it)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
>>>
@end example

파이썬은 여러 다른 컨텍스트에서 이터러블 객체를 기대하며, 가장 중요한 것은 @ref{34a,,for} 문입니다. @code{for X in Y} 문에서 Y는 반드시 이터레이터 혹은 @ref{9d7,,iter()} 가 이터레이터를 생성할 수 있는 객체이어야 합니다. 다음 두 문장은 같은 의미입니다:

@example
for i in iter(obj):
    print(i)

for i in obj:
    print(i)
@end example

이터레이터는 @ref{24d,,list()} 또는 @ref{610,,tuple()} 생성자 함수를 사용하여 리스트나 튜플로 나타낼 수 있습니다:

@example
>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> t = tuple(iterator)
>>> t
(1, 2, 3)
@end example

시퀀스 언 패킹 또한 이터레이터를 지원합니다: 이터레이터가 N개의 요소를 반환한다는 것을 알고 있다면, 그것들을 N-튜플로 언 패킹할 수 있습니다:

@example
>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> a, b, c = iterator
>>> a, b, c
(1, 2, 3)
@end example

@ref{110b,,max()} 및 @ref{110a,,min()} 과 같은 내장 함수는 하나의 이터레이터 인자를 취할 수 있으며 가장 큰 혹은 가장 작은 요소를 반환합니다. @code{"in"} 과 @code{"not in"} 연산자 또한 이터레이터를 지원합니다: 이터레이터가 반환한 스트림에서 X가 발견되면 @code{X in iterator} 는 참입니다. 이터레이터가 무한하다면 명백한 문제에 부딪힙니다; @code{max()} 와 @code{min()} 는 영원히 결과를 반환하지 않으며, 요소 X가 스트림에서 나타나지 않으면 @code{"in"} 과 @code{"not in"} 연산자 역시 영원히 결과를 반환하지 않을 것입니다.

이터레이터에서는 오직 앞으로만 나아갈 수 있다는 점에 유의하세요; 이전 요소를 가져오거나, 이터레이터를 재설정하거나, 사본을 만들 방법은 없습니다. 이터레이터 객체는 선택적으로 이러한 추가 기능을 제공할 수 있지만, 이터레이터 프로토콜은 @ref{14d2,,__next__()} 메서드만 명시해두었습니다. 함수는 모든 이터레이터의 출력을 소비할 수 있으므로 같은 스트림에서 다른 작업을 수행해야 하는 경우 새로운 이터레이터를 만들어야 합니다.

@menu
* 이터레이터를 지원하는 데이터형:: 

@end menu

@node 이터레이터를 지원하는 데이터형,,,이터레이터<2>
@anchor{howto/functional data-types-that-support-iterators}@anchor{577a}
@subsubsection 이터레이터를 지원하는 데이터형


리스트와 튜플이 이터레이터를 어떻게 지원하는지 이미 살펴보았습니다. 실제로 문자열과 같은 파이썬 시퀀스형은 이터레이터의 생성을 자동으로 지원합니다.

@ref{9d7,,iter()} 를 딕셔너리에 적용하면 딕셔너리의 키를 반복하는 이터레이터를 반환합니다:

@example
>>> m = @{'Jan': 1, 'Feb': 2, 'Mar': 3, 'Apr': 4, 'May': 5, 'Jun': 6,
...      'Jul': 7, 'Aug': 8, 'Sep': 9, 'Oct': 10, 'Nov': 11, 'Dec': 12@}
>>> for key in m:
...     print(key, m[key])
Jan 1
Feb 2
Mar 3
Apr 4
May 5
Jun 6
Jul 7
Aug 8
Sep 9
Oct 10
Nov 11
Dec 12
@end example

파이썬 3.7부터는, 딕셔너리 이터레이션 순서가 삽입 순서와 같음을 보장합니다. 이전 버전에서는, 동작이 지정되지 않았고 구현마다 다를 수 있었습니다.

@ref{9d7,,iter()} 를 딕셔너리에 적용하는 것은 항상 키를 반복하지만, 딕셔너리에는 다른 이터레이터를 반환하는 메서드가 있습니다. 값이나 키/값 쌍을 반복하는 경우에는 명시적으로 @ref{9d1,,values()} 혹은 @ref{9d2,,items()} 메서드를 사용하여 적절한 이터레이터를 얻을 수 있습니다.

@ref{183,,dict()} 생성자는 @code{(키, 값)} 튜플의 유한한 스트림을 반환하는 이터레이터를 받을 수 있습니다:

@example
>>> L = [('Italy', 'Rome'), ('France', 'Paris'), ('US', 'Washington DC')]
>>> dict(iter(L))
@{'Italy': 'Rome', 'France': 'Paris', 'US': 'Washington DC'@}
@end example

또한 파일은 더는 새로운 줄이 없을 때까지 @ref{20a4,,readline()} 메서드를 호출하여 이터레이션을 지원합니다. 즉, 다음과 같이 파일의 각 행을 읽을 수 있습니다:

@example
for line in file:
    # 각 줄마다 뭔가 합니다
    ...
@end example

집합은 이터러블에서 내용을 가져와서 집합의 원소를 반복할 수 있습니다:

@example
>>> S = @{2, 3, 5, 7, 11, 13@}
>>> for i in S:
...     print(i)
2
3
5
7
11
13
@end example

@node 제너레이터 표현식과 리스트 컴프리헨션,제너레이터<2>,이터레이터<2>,함수형 프로그래밍 HOWTO
@anchor{howto/functional generator-expressions-and-list-comprehensions}@anchor{577b}
@subsection 제너레이터 표현식과 리스트 컴프리헨션


이터레이터의 출력에 대한 두 가지 일반적인 연산은 1) 모든 요소에 대해 어떤 연산을 수행하고, 2) 어떤 조건을 만족하는 요소의 부분 집합을 선택하는 것입니다. 예를 들어 문자열 리스트가 있으면 각 줄에서 후미 공백을 제거하거나, 주어진 부분 문자열을 포함하는 모든 문자열을 추출할 수 있습니다.

리스트 컴프리헨션과 제너레이터 표현식(줄임말: “listcomps” 및 “genexps”)은 함수형 프로그래밍 언어 하스켈(@indicateurl{https://www.haskell.org/})에서 빌린 이러한 작업을 위한 간결한 표기법입니다. 다음 코드를 사용하여 문자열 스트림에서 모든 공백을 제거할 수 있습니다:

@example
>>> line_list = ['  line 1\n', 'line 2  \n', ' \n', '@w{'}]

>>> # 제너레이터 표현식 -- 이터레이터를 돌려줍니다
>>> stripped_iter = (line.strip() for line in line_list)

>>> # 리스트 컴프리헨션 -- 리스트를 돌려줍니다
>>> stripped_list = [line.strip() for line in line_list]
@end example

@code{"if"} 조건을 추가하여 특정 요소만 선택할 수도 있습니다:

@example
>>> stripped_list = [line.strip() for line in line_list
...                  if line != ""]
@end example

리스트 컴프리헨션을 사용하면 파이썬 리스트를 얻을 수 있습니다; @code{stripped_list} 는 이터레이터가 아니라 결과 행을 담고 있는 리스트입니다. 제너레이터 표현식은 필요에 따라 값을 계산하는 이터레이터를 반환하며 모든 값을 한 번에 구체화할 필요가 없습니다. 즉, 무한 스트림이나 매우 많은 양의 데이터를 반환하는 이터레이터로 작업하는 경우 리스트 컴프리헨션은 유용하지 않습니다. 제너레이터 표현식은 이러한 상황에서 유용합니다.

제너레이터 표현식은 괄호(“()”)로 묶여 있으며 리스트 컴프리헨션은 대괄호(“[]”)로 묶여 있습니다. 제너레이터 표현식은 다음과 같은 형식입니다:

@example
( expression for expr in sequence1
             if condition1
             for expr2 in sequence2
             if condition2
             for expr3 in sequence3
             ...
             if condition3
             for exprN in sequenceN
             if conditionN )
@end example

다시 말하면, 리스트 컴프리헨션을 위해서는 바깥쪽 괄호만 다릅니다(괄호 대신 대괄호).

생성된 출력의 요소는 @code{expression} 의 연속적인 값이 될 것입니다. @code{if} 절은 모두 선택적입니다; if 절이 존재한다면, @code{expression} 은 @code{condition} 이 참일 때만 평가되고 결과에 추가됩니다.

제너레이터 표현식은 항상 괄호 안에 작성해야 하지만 함수 호출을 알리는 괄호도 포함됩니다. 함수에 즉시 전달되는 이터레이터를 만들고 싶다면 다음과 같이 작성할 수 있습니다:

@example
obj_total = sum(obj.count for obj in list_all_objects())
@end example

@code{for...in} 절은 반복할 시퀀스를 포함합니다. 시퀀스는 왼쪽에서 오른쪽으로 반복되며 병렬로 처리되지 `않기' 때문에 같은 길이일 필요는 없습니다. @code{sequence1} 의 각 요소에 대해 @code{sequence2} 는 처음부터 반복됩니다. @code{sequence3} 은 @code{sequence1} 과 @code{sequence2} 의 각각 모든 결과에 대해 반복됩니다.

다른 식으로 표현하면, 리스트 컴프리헨션 혹은 제너레이터 표현식은 다음 파이썬 코드와 같습니다:

@example
for expr1 in sequence1:
    if not (condition1):
        continue   # 이 요소를 건너뜁니다
    for expr2 in sequence2:
        if not (condition2):
            continue   # 이 요소를 건너뜁니다
        ...
        for exprN in sequenceN:
            if not (conditionN):
                continue   # 이 요소를 건너뜁니다

            # expression 의 값을
            # 출력합니다.
@end example

이것은 여러 개의 @code{for...in} 절이 있지만 @code{if} 절이 없을 때 결과 출력의 길이가 모든 시퀀스 길이의 곱과 같음을 의미합니다. 길이가 3인 두 개의 리스트가 있는 경우 출력 목록의 길이는 9개입니다:

@example
>>> seq1 = 'abc'
>>> seq2 = (1, 2, 3)
>>> [(x, y) for x in seq1 for y in seq2]
[('a', 1), ('a', 2), ('a', 3),
 ('b', 1), ('b', 2), ('b', 3),
 ('c', 1), ('c', 2), ('c', 3)]
@end example

파이썬 문법의 모호함을 피하고자, @code{expression} 이 튜플을 생성하고 있다면, 괄호로 묶어야 합니다. 아래의 첫 번째 리스트 컴프리헨션은 구문 오류이며, 두 번째는 올바릅니다:

@example
# 문법 에러
[x, y for x in seq1 for y in seq2]
# 올바릅니다
[(x, y) for x in seq1 for y in seq2]
@end example

@node 제너레이터<2>,내장 함수<2>,제너레이터 표현식과 리스트 컴프리헨션,함수형 프로그래밍 HOWTO
@anchor{howto/functional generators}@anchor{577c}
@subsection 제너레이터


제너레이터는 이터레이터를 작성하는 작업을 단순화하는 특별한 클래스의 함수입니다. 일반 함수는 값을 계산하여 반환하지만, 제너레이터는 값의 스트림을 반환하는 이터레이터를 반환합니다.

파이썬이나 C에서 정규 함수 호출이 어떻게 작동하는지 잘 알고 있을 것입니다. 함수를 호출하면 지역 변수가 생성되는 비공개 이름 공간이 생깁니다. 함수가 @code{return} 문에 도달하면 지역 변수가 소멸하고 그 값이 호출자에게 반환됩니다. 같은 함수를 나중에 호출하면 새로운 비공개 이름 공간과 새로운 지역 변수 집합이 만들어집니다. 그러나 지역 변수가 함수를 빠져나갈 때 버려지지 않으면 어떻게 될까요? 나중에 중단했던 곳에서 함수를 다시 시작할 수 있다면 어떨까요? 이것이 제너레이터가 제공하는 것입니다; 그들은 재개 가능한 함수라고 생각할 수 있습니다.

다음은 제너레이터 함수의 가장 간단한 예입니다:

@example
>>> def generate_ints(N):
...    for i in range(N):
...        yield i
@end example

@ref{bc1,,yield} 키워드를 포함하는 함수는 제너레이터 함수입니다; 이것은 파이썬의 @ref{4ab,,바이트 코드} 컴파일러에 의해 감지됩니다. 결과적으로 컴파일러는 특별하게 함수를 컴파일합니다.

제너레이터 함수를 호출하면 단일 값을 반환하지 않습니다; 대신 이터레이터 프로토콜을 지원하는 제너레이터 객체를 반환합니다. @code{yield} 표현식을 실행하면 제너레이터는 @code{return} 문과 비슷하게 @code{i} 의 값을 출력합니다. @code{yield} 와 @code{return} 의 큰 차이점은 @code{yield} 에 도달하면 제너레이터의 실행 상태가 일시 중단되고 지역 변수가 보존된다는 것입니다. 제너레이터의 @ref{20ac,,__next__()} 메서드가 다음에 실행될 때, 함수가 다시 실행됩니다.

다음은 @code{generate_ints()} 제너레이터의 사용 예입니다:

@example
>>> gen = generate_ints(3)
>>> gen
<generator object generate_ints at ...>
>>> next(gen)
0
>>> next(gen)
1
>>> next(gen)
2
>>> next(gen)
Traceback (most recent call last):
  File "stdin", line 1, in <module>
  File "stdin", line 2, in generate_ints
StopIteration
@end example

여러분은 똑같이 @code{for i in generate_ints(5)} 또는 @code{a, b, c = generate_ints(3)} 라고 쓸 수 있습니다.

제너레이터 함수 내에서, @code{return value} 는 @ref{20ac,,__next__()} 메서드에서 @code{StopIteration(value)} 를 발생시킵니다. 이런 일이 발생하거나 함수의 맨 아래에 도달하면 값의 행렬이 끝나고 제너레이터는 더는 값을 산출할 수 없습니다.

직접 클래스를 작성하고 제너레이터의 모든 지역 변수를 인스턴스 변수로 저장하여 제너레이터의 효과를 수동으로 얻을 수 있습니다. 예를 들어, 정수 리스트를 반환하는 것은 @code{self.count} 를 0으로 설정하고 @ref{14d2,,__next__()} 메서드로 @code{self.count} 를 증가시켜 반환하는 식으로 수행할 수 있습니다. 그러나, 다소 복잡한 제너레이터의 경우에는 해당 클래스를 작성하는 것이 훨씬 더 복잡할 수 있습니다.

파이썬의 라이브러리인 Lib/test/test_generators.py@footnote{https://github.com/python/cpython/tree/3.14/Lib/test/test_generators.py} 에 포함된 테스트 묶음에는 더 많은 흥미로운 예제들이 있습니다. 제너레이터를 재귀적으로 사용하여 트리를 중위 순회하는 것을 구현하는 하나의 제너레이터가 있습니다.

@example
# 트리 노드를 중위(in-order) 순회 순으로 생성하는 재귀적 제너레이터
def inorder(t):
    if t:
        for x in inorder(t.left):
            yield x

        yield t.label

        for x in inorder(t.right):
            yield x
@end example

@code{test_generators.py} 의 다른 두 가지 예는, N-여왕 문제(NxN 체스판에 서로 다른  왕비를 위협할 수 없도록 N개의 왕비를 배치하는 문제)와 기사의 여행(기사가 NxN 체스판의 모든 칸을 정확히 한 번씩 갈 수 있도록 하는 방법을 찾는 문제)입니다.

@menu
* 제너레이터에 값 전달하기:: 

@end menu

@node 제너레이터에 값 전달하기,,,제너레이터<2>
@anchor{howto/functional passing-values-into-a-generator}@anchor{577d}
@subsubsection 제너레이터에 값 전달하기


파이썬 2.4 및 그 이전 버전에서 제너레이터는 출력만 생성했습니다. 제너레이터의 코드가 이터레이터를 만들기 위해 호출된 후에는 그 실행이 다시 시작될 때 함수에 새로운 정보를 전달할 방법이 없었습니다. 제너레이터가 전역 변수를 보거나 호출자가 수정할 수 있는 변경 가능한 객체를 전달함으로써 이 기능을 해킹할 수 있지만, 이러한 접근법은 지저분한 방식입니다.

파이썬 2.5에서는 제너레이터에 값을 전달하는 간단한 방법이 있습니다. @ref{bc1,,yield} 는 표현식이 되어 변수에 대입하거나 다른 식으로 조작할 수 있는 값을 반환합니다:

@example
val = (yield i)
@end example

위 예제처럼 반환 값으로 무엇인가를 할 때 @code{yield} 표현식 주위에 `항상' 괄호를 넣는 것이 좋습니다. 괄호는 항상 필요한 것은 아니지만 필요한 시점을 기억하지 않고 항상 추가하기가 더 쉽습니다.

(
@geindex Python 향상 제안; PEP 342
PEP 342@footnote{https://peps.python.org/pep-0342/} 는 정확한 규칙을 설명합니다. 이것은 대입의 오른쪽에 있는 최상위 표현식에서 발생하는 경우를 제외하고 항상 @code{yield} 표현식을 괄호로 묶어야 한다는 것입니다. @code{val = yield i} 라고 쓸 수도 있지만, @code{val = (yield i) + 12} 처럼 연산이 있을 때는 괄호를 써야합니다.)

값은 @ref{241a,,send(value)} 메서드를 호출하여 제너레이터로 보내집니다. 이 메서드는 제너레이터의 코드를 다시 시작하고 @code{yield} 표현식은 지정된 값을 반환합니다. 만약 정규 @ref{20ac,,__next__()} 메서드가 호출되면 @code{yield} 는 @code{None} 을 반환합니다.

다음은 1씩 증가하며 내부 카운터값을 변경할 수 있는 간단한 카운터입니다.

@example
def counter(maximum):
    i = 0
    while i < maximum:
        val = (yield i)
        # 값이 제공되면, 카운터를 변경합니다
        if val is not None:
            i = val
        else:
            i += 1
@end example

다음은 카운터 변경의 예시입니다:

@example
>>> it = counter(10)
>>> next(it)
0
>>> next(it)
1
>>> it.send(8)
8
>>> next(it)
9
>>> next(it)
Traceback (most recent call last):
  File "t.py", line 15, in <module>
    it.next()
StopIteration
@end example

@code{yield} 가 종종 @code{None} 을 반환할 것이므로, 항상 이 경우를 확인해야 합니다. @ref{241a,,send()} 메서드가 제너레이터 함수를 다시 시작하는데 사용되는 유일한 메서드가 아니라면, 표현식의 결괏값을 확인없이 사용하지 마세요.

@ref{241a,,send()} 외에도 제너레이터에 대한 두 가지 다른 메서드가 있습니다:


@itemize *

@item 
@ref{71b,,throw(value)} 는 제너레이터 내에서 예외를 발생시키는 데 사용됩니다; 예외는 제너레이터의 실행이 일시 중지된 @code{yield} 표현식에 의해 발생합니다.

@item 
@ref{179b,,close()} sends a @ref{15cc,,GeneratorExit} exception to the
generator to terminate the iteration.  On receiving this exception, the
generator’s code must either raise @code{GeneratorExit} or
@ref{df4,,StopIteration}; catching the exception and doing anything else is
illegal and will trigger a @ref{244,,RuntimeError}.  @code{close()}
will also be called by Python’s garbage collector when the generator is
garbage-collected.

@ref{15cc,,GeneratorExit} 이 발생할 때 정리 작업을 위한 코드를 실행해야 한다면 @code{GeneratorExit} 를 잡는 대신 @code{try: ... finally:} 를 사용하는 것이 좋습니다.
@end itemize

이러한 변화의 누적 효과는 제너레이터를 일방적인 정보 생산자에서 생산자와 소비자 모두로 전환하는 것입니다.

제너레이터는 `코루틴' 이 되어 더 일반적인 형태의 서브루틴이 됩니다. 서브루틴은 한 지점에서 시작되고 다른 한 지점(함수의 맨 위와 @code{return} 문)에서 빠져나옵니다. 그러나 여러 다른 지점에서 코루틴을 시작하고 빠져나오고 다시 시작할 수 있습니다(@code{yield} 문).

@node 내장 함수<2>,itertools 모듈,제너레이터<2>,함수형 프로그래밍 HOWTO
@anchor{howto/functional built-in-functions}@anchor{577e}
@subsection 내장 함수


이터레이터에서 자주 사용되는 내장 함수를 자세히 살펴보겠습니다.

파이썬의 두 가지 내장 함수인 @ref{19f,,map()} 와 @ref{a64,,filter()} 는 제너레이터 표현식의 기능을 복제합니다:


@table @asis

@item @ref{19f,,map(f@comma{} iterA@comma{} iterB@comma{} ...)} 은 다음과 같은 시퀀스에 대한 이터레이터를 반환합니다.

@code{f(iterA[0], iterB[0]), f(iterA[1], iterB[1]), f(iterA[2], iterB[2]), ...}.

@example
>>> def upper(s):
...     return s.upper()
@end example

@example
>>> list(map(upper, ['sentence', 'fragment']))
['SENTENCE', 'FRAGMENT']
>>> [upper(s) for s in ['sentence', 'fragment']]
['SENTENCE', 'FRAGMENT']
@end example
@end table

물론 리스트 컴프리헨션으로 같은 효과를 얻을 수 있습니다.

@ref{a64,,filter(predicate@comma{} iter)} 는 특정 조건을 만족하는 모든 시퀀스 요소에 대한 이터레이터를 반환하며, 마찬가지로 리스트 컴프리헨션에 의해 복제됩니다. `predicate' 는 어떤 조건의 진릿값을 반환하는 함수입니다; @code{filter()} 와 함께 사용하는 경우, predicate는 단일 값을 받아들여야 합니다.

@example
>>> def is_even(x):
...     return (x % 2) == 0
@end example

@example
>>> list(filter(is_even, range(10)))
[0, 2, 4, 6, 8]
@end example

또한 이것은 리스트 컴프리헨션으로 작성될 수 있습니다:

@example
>>> list(x for x in range(10) if is_even(x))
[0, 2, 4, 6, 8]
@end example

@ref{1686,,enumerate(iter@comma{} start=0)} 는 카운트(`start' 부터)와 각 요소를 포함하는 2-튜플을 반환하는 이터러블의 요소를 계산합니다.

@example
>>> for item in enumerate(['subject', 'verb', 'object']):
...     print(item)
(0, 'subject')
(1, 'verb')
(2, 'object')
@end example

@ref{1686,,enumerate()} 는 리스트를 반복하고 특정 조건이 충족되는 인덱스를 기록할 때 자주 사용됩니다:

@example
f = open('data.txt', 'r')
for i, line in enumerate(f):
    if line.strip() == '@w{'}:
        print('Blank line at line #%i' % i)
@end example

@ref{dc6,,sorted(iterable@comma{} key=None@comma{} reverse=False)} 는 이터러블의 모든 요소를 리스트로 모으고, 리스트를 정렬하고, 정렬된 결과를 반환합니다. `key' 와 `reverse' 인자는 생성된 리스트의 @ref{dc7,,sort()} 메서드로 전달됩니다.

@example
>>> import random
>>> # Generate 8 random numbers between [0, 10000)
>>> rand_list = random.sample(range(10000), 8)
>>> rand_list
[769, 7953, 9828, 6431, 8442, 9878, 6213, 2207]
>>> sorted(rand_list)
[769, 2207, 6213, 6431, 7953, 8442, 9828, 9878]
>>> sorted(rand_list, reverse=True)
[9878, 9828, 8442, 7953, 6431, 6213, 2207, 769]
@end example

(정렬에 대한 자세한 설명은 @ref{25de,,정렬 기법} 를 참고하세요.)

@ref{1626,,any(iter)} 및 @ref{1627,,all(iter)} 내장 함수는 이터러블의 진릿값을 봅니다. @code{any()} 는 이터러블의 어떤 요소가 참이면 @code{True} 를 반환하고, @code{all()} 은 모든 요소가 참이면 @code{True} 를 반환합니다:

@example
>>> any([0, 1, 0])
True
>>> any([0, 0, 0])
False
>>> any([1, 1, 1])
True
>>> all([0, 1, 0])
False
>>> all([0, 0, 0])
False
>>> all([1, 1, 1])
True
@end example

@ref{1a0,,zip(iterA@comma{} iterB@comma{} ...)} 은 각 이터러블에서 하나의 요소를 취하여 튜플로 반환합니다:

@example
zip(['a', 'b', 'c'], (1, 2, 3)) =>
  ('a', 1), ('b', 2), ('c', 3)
@end example

이 함수는 결과를 반환하기 전에 메모리 내의 리스트를 구성하거나 모든 입력 이터레이터를 처리하지 않습니다; 대신 튜플은 요청된 경우에만 생성하여 반환합니다. (이 동작의 전문 용어는 느긋한 평가@footnote{https://en.wikipedia.org/wiki/Lazy_evaluation} 입니다.)

이 이터레이터는 모두 같은 길이의 이터러블과 함께 사용하기 위한 것입니다. 이터러블의 길이가 다른 경우 결과 스트림은 가장 짧은 이터러블과 같은 길이가 됩니다.

@example
zip(['a', 'b'], (1, 2, 3)) =>
  ('a', 1), ('b', 2)
@end example

더 긴 이터레이터에서 나머지 요소는 버려질 수 있기 때문에 이런 방식은 피해야 합니다. 즉, 삭제된 요소를 건너뛸 위험이 있으므로 이터레이터를 계속 사용할 수 없습니다.

@node itertools 모듈,functools 모듈,내장 함수<2>,함수형 프로그래밍 HOWTO
@anchor{howto/functional the-itertools-module}@anchor{577f}
@subsection itertools 모듈


@ref{85,,itertools} 모듈은 공통적으로 사용되는 많은 이터레이터와 몇몇 이터레이터를 결합하기 위한 함수를 포함합니다. 이 절에서는 작은 예제를 보여줌으로써 모듈의 내용을 소개합니다.

모듈의 기능은 몇 가지 광범위한 클래스로 분류됩니다:


@itemize *

@item 
기존 이터레이터를 기반으로 새로운 이터레이터를 만드는 함수.

@item 
이터레이터의 요소를 함수 인자로 처리하는 함수.

@item 
이터레이터의 출력 부분을 선택하는 함수.

@item 
이터레이터의 출력을 분류하는 함수.
@end itemize

@menu
* 새로운 이터레이터 만들기:: 
* 요소에 대한 함수 호출:: 
* 요소 선택하기:: 
* 조합 함수:: 
* 요소 분류:: 

@end menu

@node 새로운 이터레이터 만들기,요소에 대한 함수 호출,,itertools 모듈
@anchor{howto/functional creating-new-iterators}@anchor{5780}
@subsubsection 새로운 이터레이터 만들기


@ref{1488,,itertools.count(start@comma{} step)} 는 균등하게 간격을 둔 값들의 무한한 스트림을 반환합니다. 선택적으로 기본값이 0인 시작 번호와 기본값이 1인 숫자 사이의 간격을 제공할 수 있습니다:

@example
itertools.count() =>
  0, 1, 2, 3, 4, 5, 6, 7, 8, 9, ...
itertools.count(10) =>
  10, 11, 12, 13, 14, 15, 16, 17, 18, 19, ...
itertools.count(10, 5) =>
  10, 15, 20, 25, 30, 35, 40, 45, 50, 55, ...
@end example

@ref{2bca,,itertools.cycle(iter)} 은 제공된 이터러블의 내용 사본을 저장하고 처음부터 마지막까지 요소를 반환하는 새로운 이터레이터를 반환합니다. 새로운 이터레이터는 이러한 요소를 무한히 반복합니다.

@example
itertools.cycle([1, 2, 3, 4, 5]) =>
  1, 2, 3, 4, 5, 1, 2, 3, 4, 5, ...
@end example

@ref{185c,,itertools.repeat(elem@comma{} [n])} 는 제공된 요소를 `n' 번 반환하거나, `n' 이 제공되지 않으면 끝없이 요소를 반환합니다.

@example
itertools.repeat('abc') =>
  abc, abc, abc, abc, abc, abc, abc, abc, abc, abc, ...
itertools.repeat('abc', 5) =>
  abc, abc, abc, abc, abc
@end example

@ref{25df,,itertools.chain(iterA@comma{} iterB@comma{} ...)} 은 임의의 수의 이터러블을 입력으로 취하여, 첫 번째 이터러블의 모든 요소를 반환한 다음 두 번째 요소의 모든 요소를 반환하고, 모든 이터러블이 다 소모될 때까지 이 동작을 반복합니다.

@example
itertools.chain(['a', 'b', 'c'], (1, 2, 3)) =>
  a, b, c, 1, 2, 3
@end example

@ref{d42,,itertools.islice(iter@comma{} [start]@comma{} stop@comma{} [step])} 는 이터레이터의 조각 스트림을 반환합니다. 단일 `stop' 인자를 사용하면 처음 `stop'개 요소가 반환됩니다. 시작 인덱스를 지정하면 `stop-start' 요소가 생기고, `step' 에 값을 지정하면 요소는 그에 따라 생략됩니다. 파이썬의 문자열 및 리스트 슬라이싱과 달리, `start', `stop', `step' 에 음수값을 사용할 수 없습니다.

@example
itertools.islice(range(10), 8) =>
  0, 1, 2, 3, 4, 5, 6, 7
itertools.islice(range(10), 2, 8) =>
  2, 3, 4, 5, 6, 7
itertools.islice(range(10), 2, 8, 2) =>
  2, 4, 6
@end example

@ref{2bce,,itertools.tee(iter@comma{} [n])} 는 이터레이터를 복제합니다; 원본 이터레이터의 내용을 모두 반환하는 `n' 개의 독립적인 이터레이터를 반환합니다. `n' 에 대한 값을 제공하지 않으면 기본값은 2입니다. 이터레이터를 복제하려면 원본 이터레이터의 일부 내용을 저장해야 하므로 이터레이터가 크고 새로운 이터레이터 중 하나가 다른 것보다 많이 소비된다면 이것은 상당한 메모리를 소비할 수 있습니다.

@example
itertools.tee( itertools.count() ) =>
   iterA, iterB

where iterA ->
   0, 1, 2, 3, 4, 5, 6, 7, 8, 9, ...

and   iterB ->
   0, 1, 2, 3, 4, 5, 6, 7, 8, 9, ...
@end example

@node 요소에 대한 함수 호출,요소 선택하기,새로운 이터레이터 만들기,itertools 모듈
@anchor{howto/functional calling-functions-on-elements}@anchor{5781}
@subsubsection 요소에 대한 함수 호출


@ref{a3,,operator} 모듈은 파이썬의 연산자에 대응하는 함수 집합을 포함합니다. 예를 들어 @ref{2bf5,,operator.add(a@comma{} b)} (두 개의 값을 더하기), @ref{2be5,,operator.ne(a@comma{} b)} (@code{a != b} 와 동일) 및 @ref{1032,,operator.attrgetter('id')} (@code{.id} 어트리뷰트를 가져오는 콜러블을 반환)와 같은 함수가 있습니다.

@ref{12e9,,itertools.starmap(func@comma{} iter)} 은 이터러블이 튜플의 스트림을 반환할 것이라고 가정하고, 이 튜플을 인자로 사용하여 `func' 를 호출합니다:

@example
itertools.starmap(os.path.join,
                  [('/bin', 'python'), ('/usr', 'bin', 'java'),
                   ('/usr', 'bin', 'perl'), ('/usr', 'bin', 'ruby')])
=>
  /bin/python, /usr/bin/java, /usr/bin/perl, /usr/bin/ruby
@end example

@node 요소 선택하기,조합 함수,요소에 대한 함수 호출,itertools 모듈
@anchor{howto/functional selecting-elements}@anchor{5782}
@subsubsection 요소 선택하기


또 다른 함수 모음은 서술자에 기초하여 이터러블 요소의 부분 집합을 선택합니다.

@ref{25ce,,itertools.filterfalse(predicate@comma{} iter)} 는 @ref{a64,,filter()} 의 반대이며, predicate가 거짓을 반환하는 모든 요소를 반환합니다:

@example
itertools.filterfalse(is_even, itertools.count()) =>
  1, 3, 5, 7, 9, 11, 13, 15, ...
@end example

@ref{2bcd,,itertools.takewhile(predicate@comma{} iter)} 은 predicate가 참을 반환하는 한, 요소를 반환합니다. predicate가 거짓을 반환하면 이터레이터는 결과의 종료를 알립니다.

@example
def less_than_10(x):
    return x < 10

itertools.takewhile(less_than_10, itertools.count()) =>
  0, 1, 2, 3, 4, 5, 6, 7, 8, 9

itertools.takewhile(is_even, itertools.count()) =>
  0
@end example

@ref{2bcb,,itertools.dropwhile(predicate@comma{} iter)} 은 predicate가 참을 반환하는 동안 요소를 버리고, 나머지 이터러블의 결과를 반환합니다.

@example
itertools.dropwhile(less_than_10, itertools.count()) =>
  10, 11, 12, 13, 14, 15, 16, 17, 18, 19, ...

itertools.dropwhile(is_even, itertools.count()) =>
  1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ...
@end example

@ref{1487,,itertools.compress(data@comma{} selectors)} 는 두 개의 이터레이터를 취하고 `selectors' 의 해당 요소가 참인 `data' 의 요소만을 반환하고, 한쪽이 고갈될 때마다 중단합니다:

@example
itertools.compress([1, 2, 3, 4, 5], [True, True, False, False, True]) =>
   1, 2, 5
@end example

@node 조합 함수,요소 분류,요소 선택하기,itertools 모듈
@anchor{howto/functional combinatoric-functions}@anchor{5783}
@subsubsection 조합 함수


@ref{1516,,itertools.combinations(iterable@comma{} r)} 는 `iterable' 에 포함된 모든 요소의 가능한 `r'-튜플 조합을 제공하는 이터레이터를 반환합니다.

@example
itertools.combinations([1, 2, 3, 4, 5], 2) =>
  (1, 2), (1, 3), (1, 4), (1, 5),
  (2, 3), (2, 4), (2, 5),
  (3, 4), (3, 5),
  (4, 5)

itertools.combinations([1, 2, 3, 4, 5], 3) =>
  (1, 2, 3), (1, 2, 4), (1, 2, 5), (1, 3, 4), (1, 3, 5), (1, 4, 5),
  (2, 3, 4), (2, 3, 5), (2, 4, 5),
  (3, 4, 5)
@end example

각 튜플 내의 원소들은 `iterable' 이 반환한 것과 같은 순서로 유지됩니다. 예를 들어 위의 예시에서 숫자 1은 항상 2, 3, 4 또는 5 앞에 옵니다. 비슷한 함수인 @ref{1cda,,itertools.permutations(iterable@comma{} r=None)} 은 제약 조건을 제거하여 길이 `r' 의 가능한 모든 순열을 반환합니다:

@example
itertools.permutations([1, 2, 3, 4, 5], 2) =>
  (1, 2), (1, 3), (1, 4), (1, 5),
  (2, 1), (2, 3), (2, 4), (2, 5),
  (3, 1), (3, 2), (3, 4), (3, 5),
  (4, 1), (4, 2), (4, 3), (4, 5),
  (5, 1), (5, 2), (5, 3), (5, 4)

itertools.permutations([1, 2, 3, 4, 5]) =>
  (1, 2, 3, 4, 5), (1, 2, 3, 5, 4), (1, 2, 4, 3, 5),
  ...
  (5, 4, 3, 2, 1)
@end example

`r' 에 값을 지정하지 않으면 이터러블의 길이가 사용됩니다. 즉, 모든 요소가 치환됩니다.

이 함수는 위치별로 가능한 모든 조합을 생성하며 `iterable' 의 내용이 고유해야 할 필요는 없습니다:

@example
itertools.permutations('aba', 3) =>
  ('a', 'b', 'a'), ('a', 'a', 'b'), ('b', 'a', 'a'),
  ('b', 'a', 'a'), ('a', 'a', 'b'), ('a', 'b', 'a')
@end example

같은 튜플 @code{('a', 'a', 'b')} 가 두 번 발생하지만, 두 개의 ‘a’ 문자열은 다른 위치에서 왔습니다.

@ref{1486,,itertools.combinations_with_replacement(iterable@comma{} r)} 함수는 다른 제약을 완화합니다: 요소는 단일 튜플 내에서 반복될 수 있습니다. 개념적으로 요소는 각 튜플의 첫 번째 위치에 대해 선택되고 두 번째 요소가 선택되기 전에 대체됩니다.

@example
itertools.combinations_with_replacement([1, 2, 3, 4, 5], 2) =>
  (1, 1), (1, 2), (1, 3), (1, 4), (1, 5),
  (2, 2), (2, 3), (2, 4), (2, 5),
  (3, 3), (3, 4), (3, 5),
  (4, 4), (4, 5),
  (5, 5)
@end example

@node 요소 분류,,조합 함수,itertools 모듈
@anchor{howto/functional grouping-elements}@anchor{5784}
@subsubsection 요소 분류


마지막으로 소개할 @ref{2bcc,,itertools.groupby(iter@comma{} key_func=None)} 함수는 가장 복잡합니다. @code{key_func(elem)} 는 이터러블에 의해 반환된 각 요소에 대한 키값을 계산할 수 있는 함수입니다. 키 함수를 제공하지 않으면 키는 단순히 각 요소 자체입니다.

@ref{2bcc,,groupby()} 는 이터러블 내부에서 키값이 같은 연속된 모든 요소를 수집하여 키값과 해당 키를 가진 요소의 이터러블을 포함하는 2-튜플의 스트림을 반환합니다.

@example
city_list = [('Decatur', 'AL'), ('Huntsville', 'AL'), ('Selma', 'AL'),
             ('Anchorage', 'AK'), ('Nome', 'AK'),
             ('Flagstaff', 'AZ'), ('Phoenix', 'AZ'), ('Tucson', 'AZ'),
             ...
            ]

def get_state(city_state):
    return city_state[1]

itertools.groupby(city_list, get_state) =>
  ('AL', iterator-1),
  ('AK', iterator-2),
  ('AZ', iterator-3), ...

where
iterator-1 =>
  ('Decatur', 'AL'), ('Huntsville', 'AL'), ('Selma', 'AL')
iterator-2 =>
  ('Anchorage', 'AK'), ('Nome', 'AK')
iterator-3 =>
  ('Flagstaff', 'AZ'), ('Phoenix', 'AZ'), ('Tucson', 'AZ')
@end example

@ref{2bcc,,groupby()} 는 이터러블 내부의 내용이 키에 따라 이미 정렬되었다고 가정합니다. 반환된 이터레이터 역시 이터러블 내부를 사용하므로 이터레이터-2와 해당 키를 요청하기 전에 이터레이터-1의 결과를 소진해야 합니다.

@node functools 모듈,작은 함수와 람다 표현식,itertools 모듈,함수형 프로그래밍 HOWTO
@anchor{howto/functional the-functools-module}@anchor{5785}
@subsection functools 모듈


@ref{63,,functools} 모듈은 고차 함수를 포함하고 있습니다. `고차 함수' 는 하나 이상의 함수를 입력으로 사용하고 새로운 함수를 반환합니다. 이 모듈에서 가장 유용한 도구는 @ref{217,,functools.partial()} 함수입니다.

함수형 방식으로 작성된 프로그램의 경우, 일부 매개 변수가 채워진 기존 함수의 변형이 필요한 경우가 있습니다. 파이썬 함수 @code{f(a, b, c)} 를 고려해보세요; 파이썬 함수인 @code{f(1, b, c)} 에 해당하는 새로운 함수 @code{g(b, c)} 를 만들 수 있습니다; 이를 “부분적 함수 적용” 이라고 합니다.

@ref{217,,partial()} 의 생성자는 @code{(function, arg1, arg2, ..., kwarg1=value1, kwarg2=value2)} 와 같은 인자를 취합니다. 결과 객체는 콜러블이므로, 채워진 인자로 @code{function} 을 실행하기 위해서는 결과 객체를 호출하면 됩니다.

작지만 현실적인 예가 있습니다:

@example
import functools

def log(message, subsystem):
    """'message' 의 내용을 주어진 subsystem 으로 출력합니다."""
    print('%s: %s' % (subsystem, message))
    ...

server_log = functools.partial(log, subsystem='server')
server_log('Unable to open socket')
@end example

@ref{21a,,functools.reduce(func@comma{} iter@comma{} [initial_value])} 는 모든 이터러블 요소에 대해 누적 연산을 수행하므로 무한 이터러블에 적용할 수 없습니다. `func' 는 두 요소를 사용하여 하나의 값을 반환하는 함수이어야 합니다. @code{functools.reduce()} 는 이터레이터가 반환한 처음 두 요소 A와 B를 취해 @code{func(A, B)} 를 계산합니다. 그다음 세 번째 요소인 C를 취해 @code{func(func(A, B), C)} 를 계산하고, 이 결과를 반환된 네 번째 요소와 결합해 이터러블이 소진될 때까지 계속합니다. 이터러블이 전혀 값을 반환하지 않으면 @ref{198,,TypeError} 예외가 발생합니다. 초기값이 제공되면 시작점으로 사용되며 @code{func(initial_value, A)} 가 첫 번째로 계산됩니다.

@example
>>> import operator, functools
>>> functools.reduce(operator.concat, ['A', 'BB', 'C'])
'ABBC'
>>> functools.reduce(operator.concat, [])
Traceback (most recent call last):
  ...
TypeError: reduce() of empty sequence with no initial value
>>> functools.reduce(operator.mul, [1, 2, 3], 1)
6
>>> functools.reduce(operator.mul, [], 1)
1
@end example

@ref{2bf5,,operator.add()} 를 @ref{21a,,functools.reduce()} 와 함께 사용하면 이터러블의 모든 요소를 합합니다. 이 경우는 매우 일반적이어서 이를 계산하기 위해 @ref{694,,sum()} 이라는 특수 내장 함수가 제공됩니다:

@example
>>> import functools, operator
>>> functools.reduce(operator.add, [1, 2, 3, 4], 0)
10
>>> sum([1, 2, 3, 4])
10
>>> sum([])
0
@end example

그렇지만 @ref{21a,,functools.reduce()} 를 사용하는 많은 경우에 명백하게 @ref{34a,,for} 루프만 작성하는 것이 더 명확할 수 있습니다:

@example
import functools
# 다음 문장 대신에:
product = functools.reduce(operator.mul, [1, 2, 3], 1)

# 이렇게 쓸 수 있습니다:
product = 1
for i in [1, 2, 3]:
    product *= i
@end example

관련 함수는 @ref{bef,,itertools.accumulate(iterable@comma{} func=operator.add)} 입니다. 같은 계산을 수행하지만, 최종 결과만 반환하는 대신 @code{accumulate()} 는 각 부분 결과를 반환하는 이터레이터를 반환합니다:

@example
itertools.accumulate([1, 2, 3, 4, 5]) =>
  1, 3, 6, 10, 15

itertools.accumulate([1, 2, 3, 4, 5], operator.mul) =>
  1, 2, 6, 24, 120
@end example

@menu
* operator 모듈:: 

@end menu

@node operator 모듈,,,functools 모듈
@anchor{howto/functional the-operator-module}@anchor{5786}
@subsubsection operator 모듈


@ref{a3,,operator} 모듈은 이전에 언급되었습니다. 여기에는 파이썬 연산자에 해당하는 함수 집합이 포함되어 있습니다. 단일 연산을 수행하는 사소한 함수를 작성하지 않아도 되므로 이러한 함수는 함수형 방식 코드에서 유용합니다.

이 모듈의 몇몇 함수는 다음과 같습니다:


@itemize *

@item 
수학 연산: @code{add()}, @code{sub()}, @code{mul()}, @code{floordiv()}, @code{abs()}, …

@item 
논리 연산: @code{not_()}, @code{truth()}.

@item 
비트 연산: @code{and_()}, @code{or_()}, @code{invert()}.

@item 
비교: @code{eq()}, @code{ne()}, @code{lt()}, @code{le()}, @code{gt()}, @code{ge()}.

@item 
객체 아이덴티티: @code{is_()}, @code{is_not()}.
@end itemize

전체 목록은 연산자 모듈의 문서를 참고하세요.

@node 작은 함수와 람다 표현식,개정내역 및 감사의 글,functools 모듈,함수형 프로그래밍 HOWTO
@anchor{howto/functional small-functions-and-the-lambda-expression}@anchor{5787}
@subsection 작은 함수와 람다 표현식


함수형 방식의 프로그램을 작성할 때, 서술자로 동작하거나 어떤 식으로든 요소를 결합하는 작은 함수가 필요할 것입니다.

파이썬 내장 함수나 적당한 모듈 함수가 있다면, 새로운 함수를 정의할 필요가 전혀 없습니다:

@example
stripped_lines = [line.strip() for line in lines]
existing_files = filter(os.path.exists, file_list)
@end example

필요한 기능이 없다면 작성해야 합니다. 작은 함수를 작성하는 한 가지 방법은 @ref{14a2,,lambda} 표현식을 사용하는 것입니다. @code{lambda} 는 여러 매개 변수와 이들 매개 변수를 결합하는 표현식을 취해 표현식의 값을 반환하는 익명의 함수를 만듭니다:

@example
adder = lambda x, y: x+y

print_assign = lambda name, value: name + '=' + str(value)
@end example

다른 방법은 @code{def} 문을 사용하고 일반적인 방식으로 함수를 정의하는 것입니다:

@example
def adder(x, y):
    return x + y

def print_assign(name, value):
    return name + '=' + str(value)
@end example

어떤 대안이 바람직할까요? 이것은 스타일에 대한 질문입니다; 필자가 평소에 사용하는 방법은 @code{lambda} 사용을 피하는 것입니다.

필자가 선호하는 방식에 대한 이유 중 하나는 @code{lambda} 가 정의할 수 있는 함수가 상당히 제한적이기 때문입니다. 결과는 단일 표현식으로 계산할 수 있어야 합니다. 즉, @code{if... elif... else} 비교 또는 @code{try... except} 문을 가질 수 없습니다. @code{lambda} 문에서 너무 많은 것을 하려고 하면, 읽기 어려운 복잡한 표현으로 끝날 것입니다. 다음 코드가 무엇을 하는지 빠르게 알아보세요.

@example
import functools
total = functools.reduce(lambda a, b: (0, a[1] + b[1]), items)[1]
@end example

여러분은 이해할 수 있지만, 어떻게 동작하는지 이해하기 위해 표현식을 풀어내는 데 시간이 걸립니다. 짧게 중첩된 @code{def} 문을 사용하면 좀 더 나은 것을 만들 수 있습니다:

@example
import functools
def combine(a, b):
    return 0, a[1] + b[1]

total = functools.reduce(combine, items)[1]
@end example

그러나 단순히 @code{for} 루프를 사용했다면 가장 좋았을 것입니다:

@example
total = 0
for a, b in items:
    total += b
@end example

혹은 @ref{694,,sum()} 내장 함수와 제너레이터 표현식이었어도 좋았을 것입니다:

@example
total = sum(b for a, b in items)
@end example

@ref{21a,,functools.reduce()} 를 사용하는 많은 경우, @code{for} 루프로 작성했을 때 더 명확합니다.

Fredrik Lundh는 한때 @code{lambda} 사용법의 리팩토링을 위해 다음과 같은 규칙 집합을 제안했습니다:


@enumerate 

@item 
람다 함수를 작성하세요.

@item 
람다가 하는 일에 관해 설명하는 글을 쓰세요.

@item 
잠깐 설명을 검토하고 설명의 본질을 포착하는 이름을 생각해보세요.

@item 
해당 이름을 사용하여 람다를 def 문으로 변환합니다.

@item 
설명을 삭제하세요.
@end enumerate

필자는 이 규칙을 정말 좋아하지만, 여러분은 이렇게 람다가 없는 방식이 더 나은지에 대해 동의하지 않을 수 있습니다.

@node 개정내역 및 감사의 글,참고 문헌,작은 함수와 람다 표현식,함수형 프로그래밍 HOWTO
@anchor{howto/functional revision-history-and-acknowledgements}@anchor{5788}
@subsection 개정내역 및 감사의 글


필자는 이 글의 다양한 초안을 제안하고 수정하고 도와준 다음 사람들에게 감사하고 싶습니다: Ian Bicking, Nick Coghlan, Nick Efford, Raymond Hettinger, Jim Jewett, Mike Krell, Leandro Lameiro, Jussi Salmela, Collin Winter, Blake Winton.

버전 0.1: 2006년 6월 30일 게시.

버전 0.11: 2006년 7월 1일 게시. 오타 수정.

버전 0.2: 2006년 7월 10일 게시. 제너레이터 표현식과 리스트 컴프리헨션 섹션을 하나로 통합. 오타 수정.

버전 0.21: 튜터 메일링 리스트에서 추천된 참고 문헌을 추가.

버전 0.30: Collin Winter가 작성한 @code{functional} 모듈에 대한 섹션 추가; 연산자 모듈에 대한 짧은 섹션 추가; 몇 가지 다른 편집.

@node 참고 문헌,,개정내역 및 감사의 글,함수형 프로그래밍 HOWTO
@anchor{howto/functional references}@anchor{5789}
@subsection 참고 문헌


@menu
* 일반:: 
* 파이썬 특정:: 
* 파이썬 설명서:: 

@end menu

@node 일반,파이썬 특정,,참고 문헌
@anchor{howto/functional general}@anchor{578a}
@subsubsection 일반


Harold Abelson과 Gerald Jay Sussman, Julie Sussman의 `Structure and Interpretation of Computer Programs'. 책은 @indicateurl{https://mitpress.mit.edu/sicp} 에서 찾을 수 있습니다. 이 고전적인 컴퓨터 과학 교과서에서 2장과 3장은 프로그램 내에서 데이터 흐름을 구성하기 위해 시퀀스와 스트림을 사용하는 방법을 설명합니다. 이 책은 스킴(Scheme)을 예제로 사용하지만, 이 장에서 설명한 디자인 방식 중 상당수는 함수형 방식 파이썬 코드에 적용할 수 있습니다.

@indicateurl{https://defmacro.org/2006/06/19/fp.html}: A general introduction to functional
programming that uses Java examples and has a lengthy historical introduction.

@indicateurl{https://en.wikipedia.org/wiki/Functional_programming}: 함수형 프로그래밍을 설명하는 일반 위키피디아 항목.

@indicateurl{https://en.wikipedia.org/wiki/Coroutine}: 코루틴에 대한 항목.

@indicateurl{https://en.wikipedia.org/wiki/Partial_application}: 부분 함수 적용 개념에 대한 항목.

@indicateurl{https://en.wikipedia.org/wiki/Currying}: 커링 개념에 대한 항목.

@node 파이썬 특정,파이썬 설명서,일반,참고 문헌
@anchor{howto/functional python-specific}@anchor{578b}
@subsubsection 파이썬 특정


@indicateurl{https://gnosis.cx/TPiP/}: David Mertz의 책 @cite{Text Processing in Python} 의 첫 번째 장에서는 “Utilizing Higher-Order Functions in Text Processing” 절에서 텍스트 처리를 위한 함수형 프로그래밍에 관해 설명합니다.

Mertz는 또한 IBM의 DeveloperWorks 사이트에서 함수형 프로그래밍 기사 시리즈 3부작을 작성했습니다; part 1@footnote{https://developer.ibm.com/articles/l-prog/}, part 2@footnote{https://developer.ibm.com/tutorials/l-prog2/}, part 3@footnote{https://developer.ibm.com/tutorials/l-prog3/},

@node 파이썬 설명서,,파이썬 특정,참고 문헌
@anchor{howto/functional python-documentation}@anchor{578c}
@subsubsection 파이썬 설명서


@ref{85,,itertools} 모듈에 대한 설명서

@ref{63,,functools} 모듈에 대한 설명서

@ref{a3,,operator} 모듈에 대한 설명서

@geindex Python 향상 제안; PEP 289
PEP 289@footnote{https://peps.python.org/pep-0289/}: “제너레이터 표현식”

@geindex Python 향상 제안; PEP 342
PEP 342@footnote{https://peps.python.org/pep-0342/}: “개선된 제너레이터를 통한 코루틴” 은 파이썬 2.5의 새로운 제너레이터 기능을 설명합니다.

@c comment
@c 
@c Handy little function for printing part of an iterator -- used
@c while writing this document.
@c 
@c import itertools
@c def print_iter(it):
@c      slice = itertools.islice(it, 10)
@c      for elem in slice[:-1]:
@c          sys.stdout.write(str(elem))
@c          sys.stdout.write(', ')
@c     print(elem[-1])

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 로깅 HOWTO,로깅 요리책,함수형 프로그래밍 HOWTO,파이썬 HOWTO
@anchor{howto/logging doc}@anchor{578d}@anchor{howto/logging id1}@anchor{578e}@anchor{howto/logging logging-howto}@anchor{578f}@anchor{howto/logging translation-repo}@anchor{5790}
@section 로깅 HOWTO


@*저자: 
Vinay Sajip <vinay_sajip at red-dove dot com>

@anchor{howto/logging logging-basic-tutorial}@anchor{13fa}
This page contains tutorial information. For links to reference information and a
logging cookbook, please see @ref{5791,,기타 자료}.

@menu
* 기초 로깅 자습서:: 
* 고급 로깅 자습서:: 
* 로깅 수준: 로깅 수준<2>. 
* 유용한 처리기:: 
* 로깅 중에 발생하는 예외:: 
* 임의의 객체를 메시지로 사용하기:: 
* 최적화: 최적화<6>. 
* 기타 자료:: 

@end menu

@node 기초 로깅 자습서,고급 로깅 자습서,,로깅 HOWTO
@anchor{howto/logging basic-logging-tutorial}@anchor{5792}
@subsection 기초 로깅 자습서


로깅은 어떤 소프트웨어가 실행될 때 발생하는 이벤트를 추적하는 수단입니다. 소프트웨어 개발자는 코드에 로깅 호출을 추가하여 특정 이벤트가 발생했음을 나타냅니다. 이벤트는 선택적으로 가변 데이터 (즉, 이벤트 발생마다 잠재적으로 다른 데이터)를 포함할 수 있는 설명 메시지로 기술됩니다. 이벤트는 또한 개발자가 이벤트에 부여한 중요도를 가지고 있습니다; 중요도는 `수준(level)' 또는 `심각도(severity)' 라고도 부를 수 있습니다.

@menu
* 로깅을 사용할 때:: 
* 간단한 예: 간단한 예<2>. 
* 파일에 로깅 하기:: 
* 변수 데이터 로깅:: 
* 표시된 메시지의 포맷 변경:: 
* 메시지에 날짜/시간 표시:: 
* 다음 단계:: 

@end menu

@node 로깅을 사용할 때,간단한 예<2>,,기초 로깅 자습서
@anchor{howto/logging when-to-use-logging}@anchor{5793}
@subsubsection 로깅을 사용할 때


You can access logging functionality by creating a logger via @code{logger =
logging.getLogger(__name__)}, and then calling the logger’s @ref{102a,,debug()},
@ref{3184,,info()}, @ref{1a74,,warning()}, @ref{3186,,error()} and
@ref{1029,,critical()} methods. To determine when to use logging, and to see
which logger methods to use when, see the table below. It states, for each of a
set of common tasks, the best tool to use for that task.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

수행하려는 작업

@tab

작업을 위한 최상의 도구

@item

명령행 스크립트 또는 프로그램의 일반적인 사용을 위한 콘솔 출력 표시

@tab

@ref{1174,,print()}

@item

프로그램의 정상 작동 중에 발생하는 이벤트 보고 (가령 상태 모니터링이나 결함 조사)

@tab

로거의 @ref{3184,,info()} (또는 진단 목적의 아주 자세한 출력의 경우 @ref{102a,,debug()} 메서드)

@item

특정 실행시간 이벤트와 관련하여 경고를 발행

@tab

라이브러리 코드에서 @ref{171e,,warnings.warn()}: 문제를 피할 수 있고 경고를 제거하기 위해 클라이언트 응용 프로그램이 수정되어야 하는 경우

로거의 @ref{1a74,,warning()} 메서드: 클라이언트 응용 프로그램이 할 수 있는 일이 없는 상황이지만 이벤트를 계속 주목해야 하는 경우

@item

특정 실행시간 이벤트와 관련하여 에러를 보고

@tab

예외를 일으킵니다

@item

예외를 발생시키지 않고 에러의 억제를 보고 (가령 장기 실행 서버 프로세스의 에러 처리기)

@tab

구체적인 에러와 응용 프로그램 영역에 적절한 로거의 @ref{3186,,error()}, @ref{1028,,exception()}, @ref{1029,,critical()} 메서드

@end multitable


로거 메서드는 추적되는 이벤트의 수준 또는 심각도를 따라 명명됩니다. 표준 수준과 그 용도는 아래에 설명되어 있습니다 (심각도가 높아지는 순서대로).:


@multitable {xxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

수준

@tab

사용할 때

@item

@code{DEBUG}

@tab

상세한 정보. 보통 문제를 진단할 때만 필요합니다.

@item

@code{INFO}

@tab

예상대로 작동하는지에 대한 확인.

@item

@code{WARNING}

@tab

예상치 못한 일이 발생했거나 가까운 미래에 발생할 문제(예를 들어 ‘디스크 공간 부족’)에 대한 표시. 소프트웨어는 여전히 예상대로 작동합니다.

@item

@code{ERROR}

@tab

더욱 심각한 문제로 인해, 소프트웨어가 일부 기능을 수행하지 못했습니다.

@item

@code{CRITICAL}

@tab

심각한 에러. 프로그램 자체가 계속 실행되지 않을 수 있음을 나타냅니다.

@end multitable


기본 수준은 @code{WARNING} 입니다. 이는 logging 패키지가 달리 구성되지 않는 한, 이 심각도 이상의 이벤트만 추적된다는 것을 의미합니다.

추적되는 이벤트는 여러 방식으로 처리될 수 있습니다. 추적된 이벤트를 처리하는 가장 간단한 방법은 콘솔에 인쇄하는 것입니다. 또 다른 일반적인 방법은 디스크 파일에 기록하는 것입니다.

@node 간단한 예<2>,파일에 로깅 하기,로깅을 사용할 때,기초 로깅 자습서
@anchor{howto/logging a-simple-example}@anchor{5794}@anchor{howto/logging howto-minimal-example}@anchor{5795}
@subsubsection 간단한 예


아주 간단한 예는 이렇습니다:

@example
import logging
logging.warning('Watch out!')  # 콘솔에 메시지를 인쇄합니다
logging.info('I told you so')  # 아무것도 인쇄하지 않습니다
@end example

이 줄들을 스크립트에 입력하고 실행하면:

@example
WARNING:root:Watch out!
@end example

이 콘솔에 출력됩니다. 기본 수준이 @code{WARNING} 이므로, @code{INFO} 메시지는 나타나지 않습니다. 인쇄된 메시지에는 수준 표시와 로깅 호출에 제공된 이벤트의 설명(즉, ‘Watch out!’)이 포함됩니다. 필요한 경우 실제 출력을 매우 유연하게 포맷 할 수 있습니다; 포매팅 옵션도 나중에 설명합니다.

Notice that in this example, we use functions directly on the @code{logging}
module, like @code{logging.debug}, rather than creating a logger and calling
functions on it. These functions operate on the root logger, but can be useful
as they will call @ref{bf2,,basicConfig()} for you if it has not been called yet, like in
this example.  In larger programs you’ll usually want to control the logging
configuration explicitly however - so for that reason as well as others, it’s
better to create loggers and call their methods.

@node 파일에 로깅 하기,변수 데이터 로깅,간단한 예<2>,기초 로깅 자습서
@anchor{howto/logging logging-to-a-file}@anchor{5796}
@subsubsection 파일에 로깅 하기


매우 일반적인 상황은 로깅 이벤트를 파일에 기록하는 것이므로, 다음으로 살펴보겠습니다. 새로 시작된 파이썬 인터프리터에서 다음을 시도해보고, 위에서 설명한 세션을 계속 진행하지는 마십시오:

@example
import logging
logger = logging.getLogger(__name__)
logging.basicConfig(filename='example.log', encoding='utf-8', level=logging.DEBUG)
logger.debug('This message should go to the log file')
logger.info('So should this')
logger.warning('And this, too')
logger.error('And non-ASCII stuff, too, like Øresund and Malmö')
@end example


버전 3.9에서 변경: `encoding' 인자가 추가되었습니다. 이전 파이썬 버전에서, 또는 지정되지 않으면, 사용된 인코딩은 @ref{316,,open()}에서 사용되는 기본값입니다. 위의 예제에는 표시되지 않았지만, 이제 `errors' 인자를 전달하여 인코딩 에러 처리 방법을 결정할 수 있습니다. 사용 가능한 값과 기본값은, @code{open()} 설명서를 참조하십시오.


이제 파일을 열고 내용을 살펴본다면, 로그 메시지를 찾을 수 있습니다:

@example
DEBUG:__main__:This message should go to the log file
INFO:__main__:So should this
WARNING:__main__:And this, too
ERROR:__main__:And non-ASCII stuff, too, like Øresund and Malmö
@end example

이 예제는 추적 임곗값 역할을 하는 로깅 수준을 설정하는 방법도 보여줍니다. 이 경우 임곗값을 @code{DEBUG} 로 설정했기 때문에 모든 메시지가 출력되었습니다.

다음과 같은 방식으로 명령행 옵션에서 로깅 수준을 설정하려고 하고:

@example
--log=INFO
@end example

어떤 변수 `loglevel' 에 @code{--log} 로 전달된 매개 변수의 값이 들어있다면, 이런 방법으로:

@example
getattr(logging, loglevel.upper())
@end example

`level' 인자를 통해 @ref{bf2,,basicConfig()} 에게 전달할 값을 얻습니다. 아마 다음 예제에서와같이, 사용자 입력 값을 오류 검사 하고 싶을 겁니다:

@example
# loglevel이 명령행 인자에서 얻은 문자열 값에 연결되어
# 있다고 가정합니다. 사용자가 --log=DEBUG 또는
# --log=debug를 지정할 수 있도록 대문자로 변환합니다.
numeric_level = getattr(logging, loglevel.upper(), None)
if not isinstance(numeric_level, int):
    raise ValueError('Invalid log level: %s' % loglevel)
logging.basicConfig(level=numeric_level, ...)
@end example

The call to @ref{bf2,,basicConfig()} should come `before' any calls to a logger’s
methods such as @ref{102a,,debug()}, @ref{3184,,info()}, etc. Otherwise,
that logging event may not be handled in the desired manner.

위의 스크립트를 여러 번 실행하면, 후속 실행의 메시지가 `example.log' 파일에 추가됩니다. 이전 실행의 메시지를 기억하지 않고, 각 실행이 새로 시작하게 하려면, 위 예제에서 호출이 `filemode' 인자를 지정하도록 다음과 같이 변경할 수 있습니다:

@example
logging.basicConfig(filename='example.log', filemode='w', level=logging.DEBUG)
@end example

출력은 이전과 같지만, 더는 로그 파일에 덧붙여지지 않으므로 이전 실행의 메시지는 손실됩니다.

@node 변수 데이터 로깅,표시된 메시지의 포맷 변경,파일에 로깅 하기,기초 로깅 자습서
@anchor{howto/logging logging-variable-data}@anchor{5797}
@subsubsection 변수 데이터 로깅


변수 데이터를 기록하려면, 이벤트 설명 메시지에 포맷 문자열을 사용하고 변수 데이터를 인자로 추가하십시오. 예를 들면:

@example
import logging
logging.warning('%s before you %s', 'Look', 'leap!')
@end example

이것은 다음과 같이 출력합니다:

@example
WARNING:root:Look before you leap!
@end example

보시다시피, 이벤트 설명 메시지에 가변 데이터를 병합하는데 이전 %-스타일의 문자열 포매팅을 사용합니다. 이전 버전과의 호환성을 위한 것입니다: logging 패키지는 @ref{832,,str.format()} 과 @ref{896,,string.Template} 과 같은 새로운 포매팅 옵션 이전부터 존재해왔습니다. 이 새로운 포매팅 옵션 `역시' 지원되지만, 이 자습서의 범위를 벗어납니다: 좀 더 자세한 정보는 @ref{31a3,,응용 프로그램 전체에서 특정 포맷 스타일 사용하기}를 참조하세요.

@node 표시된 메시지의 포맷 변경,메시지에 날짜/시간 표시,변수 데이터 로깅,기초 로깅 자습서
@anchor{howto/logging changing-the-format-of-displayed-messages}@anchor{5798}
@subsubsection 표시된 메시지의 포맷 변경


메시지를 표시하는 데 사용되는 포맷을 변경하려면 사용할 format을 지정해야 합니다:

@example
import logging
logging.basicConfig(format='%(levelname)s:%(message)s', level=logging.DEBUG)
logging.debug('This message should appear on the console')
logging.info('So should this')
logging.warning('And this, too')
@end example

이것은 다음과 같이 인쇄합니다:

@example
DEBUG:This message should appear on the console
INFO:So should this
WARNING:And this, too
@end example

앞의 예제에서 나타난 ‘root’ 가 사라졌음에 주목하십시오. 포맷 문자열에 나타날 수 있는 모든 것은 @ref{3183,,LogRecord 어트리뷰트} 문서를 참고하게요. 하지만, 간단한 사용을 위해서는 `levelname' (심각도), `message' (이벤트 설명, 변수 데이터 포함) 와 아마도 발생 시각을 표시해야 할 것입니다. 이것은 다음 섹션에서 설명합니다.

@node 메시지에 날짜/시간 표시,다음 단계,표시된 메시지의 포맷 변경,기초 로깅 자습서
@anchor{howto/logging displaying-the-date-time-in-messages}@anchor{5799}
@subsubsection 메시지에 날짜/시간 표시


이벤트의 날짜와 시간을 표시하려면, 포맷 문자열에 ‘%(asctime)s’ 을 넣으십시오:

@example
import logging
logging.basicConfig(format='%(asctime)s %(message)s')
logging.warning('is when this event was logged.')
@end example

이것은 이런 식으로 인쇄합니다:

@example
2010-12-12 11:41:42,612 is when this event was logged.
@end example

(위에 나온) 날짜/시간 표시의 기본 포맷은 ISO8601 또는 
@geindex RFC; RFC 3339
RFC 3339@footnote{https://datatracker.ietf.org/doc/html/rfc3339.html}와 같습니다. 날짜/시간의 포맷을 좀 더 제어해야 하는 경우, 이 예제에서와같이 @code{basicConfig} 에 `datefmt' 인자를 제공하십시오:

@example
import logging
logging.basicConfig(format='%(asctime)s %(message)s', datefmt='%m/%d/%Y %I:%M:%S %p')
logging.warning('is when this event was logged.')
@end example

그러면 다음과 같이 표시됩니다:

@example
12/12/2010 11:46:36 AM is when this event was logged.
@end example

`datefmt' 인자의 형식은 @ref{13ee,,time.strftime()} 에 의해 지원되는 것과 같습니다.

@node 다음 단계,,메시지에 날짜/시간 표시,기초 로깅 자습서
@anchor{howto/logging next-steps}@anchor{579a}
@subsubsection 다음 단계


이것으로 기본 자습서를 마칩니다. 여러분이 로깅을 시작하고 사용하는데 충분할 겁니다. logging 패키지가 더 많은 것들을 제공하지만, 최선의 결과를 얻으려면 다음 섹션을 읽는 데 시간을 조금 더 투자하시기 바랍니다. 준비되었다면, 좋아하는 음료 한잔 준비하시고 계속합시다.

If your logging needs are simple, then use the above examples to incorporate
logging into your own scripts, and if you run into problems or don’t understand
something, please post a question in the Help category of the Python discussion forum@footnote{https://discuss.python.org/c/help/7} and you should receive
help before too long.

아직 계신가요? 위의 기본 섹션보다 약간 더 고급/심층적인 자습서를 제공하는 다음 몇 섹션을 계속 읽을 수 있습니다. 그 후에, @ref{13fc,,로깅 요리책}을 살펴볼 수 있습니다.

@node 고급 로깅 자습서,로깅 수준<2>,기초 로깅 자습서,로깅 HOWTO
@anchor{howto/logging advanced-logging-tutorial}@anchor{579b}@anchor{howto/logging logging-advanced-tutorial}@anchor{13fb}
@subsection 고급 로깅 자습서


logging 라이브러리는 모듈 방식으로 구성되며, 로거, 처리기, 필터 및 포매터와 같은 여러 범주의 구성 요소를 제공합니다.


@itemize *

@item 
로거는 응용 프로그램 코드가 직접 사용하는 인터페이스를 노출합니다.

@item 
처리기는 (로거에 의해 만들어진) 로그 레코드를 적절한 목적지로 보냅니다.

@item 
필터는 출력할 로그 레코드를 결정하기 위한 보다 정밀한 기능을 제공합니다.

@item 
포매터는 최종 출력에서 로그 레코드의 배치를 지정합니다.
@end itemize

로그 이벤트 정보는 @ref{11e5,,LogRecord} 인스턴스를 통해 로거, 처리기, 필터 및 포매터 간에 전달됩니다.

로깅은 @ref{d45,,Logger} 클래스(이하 `로거 (loggers)' 라고 합니다) 인스턴스의 메서드를 호출하여 수행됩니다. 각 인스턴스에는 이름이 있으며, 점(마침표)을 구분 기호로 사용하여 개념적으로는 이름 공간 계층 구조로 배열됩니다. 예를 들어, ‘scan’이라는 로거는 ‘scan.text’, ‘scan.html’ 및 ‘scan.pdf’ 로거의 부모입니다. 로거 이름은 원하는 어떤 것이건 될 수 있으며, 로그 된 메시지가 시작된 응용 프로그램 영역을 나타냅니다.

로거의 이름을 지을 때 사용할 좋은 규칙은 다음과 같이 로깅을 사용하는 각 모듈에서 모듈 수준 로거를 사용하는 것입니다:

@example
logger = logging.getLogger(__name__)
@end example

이것은 로거 이름이 패키지/모듈 계층을 추적한다는 것을 의미하며, 로거 이름으로부터 이벤트가 기록되는 위치를 직관적으로 명확히 알 수 있습니다.

로거 계층의 뿌리를 루트 로거라고 합니다. 이것이 @ref{3185,,debug()}, @ref{31ae,,info()}, @ref{354,,warning()}, @ref{31c2,,error()} 그리고 @ref{31c3,,critical()} 함수에 의해 사용되는 로거인데, 루트 로거의 같은 이름의 메서드들 호출합니다. 함수와 메서드는 같은 서명을 가집니다. 루트 로거의 이름은 로그 된 출력에 ‘root’ 로 인쇄됩니다.

물론 로그 메시지를 다른 대상에 기록하는 것도 가능합니다. 로그 메시지를 파일, HTTP GET/POST 위치, SMTP를 통한 전자 메일, 일반 소켓, 큐 또는 syslog 나 윈도우 NT 이벤트 로그와 같은 OS 특정 로깅 메커니즘에 쓰는 지원이 패키지에 포함되어 있습니다. 목적지는 `처리기 (handler)' 클래스에 의해 제공됩니다. 내장된 처리기 클래스에 의해 충족되지 않는 특별한 요구 사항이 있는 경우, 자체 로그 대상 클래스를 작성할 수 있습니다.

기본적으로, 로그 메시지에는 대상이 설정되지 않습니다. 자습서 예제에서와같이 @ref{bf2,,basicConfig()}를 사용하여 대상(가령 콘솔 또는 파일)을 지정할 수 있습니다. @ref{3185,,debug()}, @ref{31ae,,info()}, @ref{354,,warning()}, @ref{31c2,,error()} 및 @ref{31c3,,critical()} 함수를 호출하면 목적지가 설정되어 있지 않은지 확인합니다; 설정되지 않았다면, 실제 메시지 출력을 하기 위해 루트 로거에 위임하기 전에, 콘솔(@code{sys.stderr})을 대상으로 설정하고 표시되는 메시지의 기본 포맷을 설정합니다.

메시지에 대해 @ref{bf2,,basicConfig()} 에 의해 설정된 기본 포맷은 다음과 같습니다:

@example
severity:logger name:message
@end example

포맷 문자열을 `format' 키워드 인자로 @ref{bf2,,basicConfig()} 에 전달하여 이를 변경할 수 있습니다. 포맷 문자열 작성 방법과 관련된 모든 옵션은 @ref{31a0,,Formatter 객체}를 참조하십시오.

@menu
* 로깅 흐름:: 
* 로거:: 
* 처리기:: 
* 포매터:: 
* 로깅 구성:: 
* 구성이 제공되지 않으면 어떻게 되는가:: 
* 라이브러리 로깅 구성:: 

@end menu

@node 로깅 흐름,로거,,고급 로깅 자습서
@anchor{howto/logging logging-flow}@anchor{579c}
@subsubsection 로깅 흐름


로거 및 처리기에서 로그 이벤트 정보의 흐름은 다음 도표에 설명되어 있습니다.

@image{python-figures/logging_flow,,,,png}

@node 로거,처리기,로깅 흐름,고급 로깅 자습서
@anchor{howto/logging loggers}@anchor{579d}
@subsubsection 로거


@ref{d45,,Logger} 객체는 세 가지 작업을 합니다. 첫째, 응용 프로그램이 실행시간에 메시지를 기록 할 수 있도록 여러 메서드를 응용 프로그램 코드에 노출합니다. 둘째, 로거 객체는 심각도 (기본 필터링 장치) 또는 필터 객체에 따라 어떤 로그 메시지를 처리할지 결정합니다. 셋째, 로거 객체는 관련 로그 메시지를 관심 있는 모든 로그 처리기로 전달합니다.

로거 객체에서 가장 널리 사용되는 메서드는 두 가지 범주로 분류됩니다: 구성 및 메시지 전송

다음은 가장 일반적인 구성 메서드입니다:


@itemize *

@item 
@ref{1698,,Logger.setLevel()}은 로거가 처리할 가장 낮은 심각도의 로그 메시지를 지정합니다. debug은 가장 낮은 내장 심각도 수준이고 critical은 가장 높은 내장 심각도입니다. 예를 들어, 심각도 수준이 INFO이면 로거는 INFO, WARNING, ERROR 및 CRITICAL 메시지만 처리하고 DEBUG 메시지는 무시합니다.

@item 
@ref{317e,,Logger.addHandler()} 와 @ref{317f,,Logger.removeHandler()} 는 로거 객체에서 처리기 객체를 추가하고 제거합니다. 처리기는 @ref{579e,,처리기}에서 더욱 자세히 다룹니다.

@item 
@ref{3187,,Logger.addFilter()} 와 @ref{3188,,Logger.removeFilter()} 는 로거 객체에서 필터 객체를 추가하고 제거합니다. 필터는 @ref{31ab,,Filter 객체}에서 더욱 자세히 다룹니다.
@end itemize

생성 한 모든 로거에서 항상 이 메서드를 호출할 필요는 없습니다. 이 섹션의 마지막 두 단락을 참조하십시오.

로거 객체가 구성된 상태에서 다음 메서드는 로그 메시지를 만듭니다:


@itemize *

@item 
@ref{102a,,Logger.debug()}, @ref{3184,,Logger.info()}, @ref{1a74,,Logger.warning()}, @ref{3186,,Logger.error()} 그리고 @ref{1029,,Logger.critical()}은 모두 메시지 와 메서드 이름에 해당하는 수준으로 로그 레코드를 만듭니다. 메시지는 실제로는 포맷 문자열이며, @code{%s}, @code{%d}, @code{%f} 등의 표준 문자열 치환 문법을 포함 할 수 있습니다. 나머지 인자들은 메시지의 치환 필드에 해당하는 객체 목록입니다. @code{**kwargs} 의 경우, 로깅 메서드는 @code{exc_info} 라는 키워드에 대해서만 신경을 쓰고 예외 정보를 로깅 할지를 결정할 때 사용합니다.

@item 
@ref{1028,,Logger.exception()} 은 @ref{3186,,Logger.error()} 와 비슷한 로그 메시지를 생성합니다. 차이점은 @code{Logger.exception()} 가 스택 트레이스를 덤프한다는 것입니다. 예외 처리기에서만 이 메서드를 호출하십시오.

@item 
@ref{1027,,Logger.log()} 는 명시적 인자로 로그 수준을 받아들입니다. 위에 나열된 로그 수준 편의 메서드를 사용하는 것보다 로깅 메시지를 만들 때 더 장황해지지만, 사용자 정의 로그 수준으로 로깅 하는 방법입니다.
@end itemize

@ref{b59,,getLogger()} 는 이름이 제공되는 경우 지정된 이름을 가진 로거 인스턴스에 대한 참조를 반환하고, 그렇지 않으면 @code{root} 를 반환합니다. 이름은 마침표로 구분된 계층적 구조입니다. 같은 이름으로 @code{getLogger()} 를 여러 번 호출하면 같은 로거 객체에 대한 참조를 반환합니다. 계층적 목록에서 더 아래쪽에 있는 로거는 목록에서 상위에 있는 로거의 자식입니다. 예를 들어, 이름이 @code{foo} 인 로거가 주어지면, @code{foo.bar}, @code{foo.bar.baz}, 그리고 @code{foo.bam} 의 이름을 가진 로거는 모두 @code{foo} 의 자손입니다.

로거에는 `실효 수준' 이라는 개념이 있습니다. 수준이 로거에 명시적으로 설정되지 않은 경우, 부모 수준을 실효 수준으로 대신 사용합니다. 부모가 명시적 수준 집합을 가지고 있지 않으면, 다시 그것의 부모가 검사되고, 등등 - 명시적으로 설정된 수준이 발견될 때까지 모든 조상이 검색됩니다. 루트 로거는 항상 명시적인 수준 집합(기본적으로 @code{WARNING})을 가지고 있습니다. 이벤트 처리 여부를 결정할 때, 로거의 실효 수준이 이벤트가 로거 처리기로 전달되는지를 판별하는 데 사용됩니다.

자식 로거는 조상 로거와 연관된 처리기로 메시지를 전달합니다. 이 때문에 응용 프로그램에서 사용하는 모든 로거에 대해 처리기를 정의하고 구성할 필요가 없습니다. 최상위 수준 로거에 대한 처리기를 구성하고 필요에 따라 자식 로거를 만드는 것으로 충분합니다. (그러나, 로거의 `propagate' 어트리뷰트를 @code{False} 로 설정하여 전파를 끌 수 있습니다.)

@node 처리기,포매터,로거,고급 로깅 자습서
@anchor{howto/logging handler-basic}@anchor{579e}@anchor{howto/logging handlers}@anchor{579f}
@subsubsection 처리기


@ref{169b,,Handler} 객체는 (로그 메시지의 심각도를 기반으로) 적절한 로그 메시지를 처리기의 지정된 대상으로 전달하는 역할을 합니다. @ref{d45,,Logger} 객체는 @ref{317e,,addHandler()} 메서드를 사용하여 0개 이상의 처리기 객체를 자신에게 추가 할 수 있습니다. 예를 들어, 응용 프로그램은 모든 로그 메시지를 로그 파일로 보내고, 에러(error)와 그 이상의 모든 로그 메시지를 표준 출력으로 보내고, 모든 심각한 에러(critical) 메시지를 전자 메일 주소로 보낼 수 있습니다. 이 시나리오에서는 각 처리기가 특정 심각도의 메시지를 특정 위치로 보내는 3개의 개별 처리기가 필요합니다.

표준 라이브러리에는 꽤 많은 처리기형이 포함되어있습니다 (@ref{57a0,,유용한 처리기} 참조). 자습서는 주로 @ref{13fd,,StreamHandler} 와 @ref{1c51,,FileHandler} 를 예제에서 사용합니다.

처리기에는 응용 프로그램 개발자가 직접 신경 써야 할 메서드가 거의 없습니다. 기본 제공 처리기 객체를 사용하는 (즉, 사용자 정의 처리기를 만들지 않는) 응용 프로그램 개발자와 관련이 있는 처리기 메서드는 다음과 같은 구성 메서드뿐입니다:


@itemize *

@item 
@ref{3195,,setLevel()} 메서드는 로거 객체에서와 마찬가지로 적절한 목적지로 보내지는 가장 낮은 심각도를 지정합니다. 왜 두 개의 @code{setLevel()} 메서드가 있어야 할까요? 로거에 설정된 수준은 처리기에 전달할 메시지의 심각도를 판별합니다. 각 처리기에 설정된 수준은 처리기가 전송할 메시지를 결정합니다.

@item 
@ref{3196,,setFormatter()} 는 처리기가 사용할 포매터 객체를 선택합니다.

@item 
@ref{3197,,addFilter()} 와 @ref{3198,,removeFilter()} 는 각각 처리기에서 필터 객체를 구성하고 해제합니다.
@end itemize

응용 프로그램 코드는 @ref{169b,,Handler} 의 인스턴스를 직접 인스턴스화해서 사용해서는 안 됩니다. 대신, @code{Handler} 클래스는 모든 처리기가 가져야 하는 인터페이스를 정의하고 자식 클래스가 사용할 수 있는 (또는 재정의할 수 있는) 기본 동작을 설정하는 베이스 클래스입니다.

@node 포매터,로깅 구성,처리기,고급 로깅 자습서
@anchor{howto/logging formatters}@anchor{57a1}
@subsubsection 포매터


포매터 객체는 로그 메시지의 최종 순서, 구조 및 내용을 구성합니다. 베이스 @ref{169b,,logging.Handler} 클래스와는 달리, 응용 프로그램 코드는 포매터 클래스를 인스턴스화 할 수 있습니다. 응용 프로그램에 특별한 동작이 필요한 경우 포매터의 서브 클래스를 만들 수도 있습니다. 생성자는 세 가지 선택적 인자를 취합니다 – 메시지 포맷 문자열, 날짜 포맷 문자열 및 스타일 지시자.

@geindex __init__() (logging.logging.Formatter 메서드)
@anchor{howto/logging logging logging Formatter __init__}@anchor{57a2}
@deffn {메서드} logging.Formatter.__init__ (fmt=None, datefmt=None, style='%')
@end deffn

메시지 포맷 문자열이 없으면, 기본값은 날 메시지를 사용하는 것입니다. 날짜 포맷 문자열이 없으면, 기본 날짜 형식은 다음과 같습니다:

@example
%Y-%m-%d %H:%M:%S
@end example

끝에 밀리 초가 기록됩니다. @code{style} 은 @code{'%'}, @code{'@{'} 또는 @code{'$'} 중 하나입니다. 이 중 하나가 지정되지 않으면, @code{'%'} 가 사용됩니다.

@code{style} 이 @code{'%'} 이면, 메시지 포맷 문자열은 @code{%(<dictionary key>)s} 스타일의 문자열 치환을 사용합니다; 가능한 키는 @ref{3183,,LogRecord 어트리뷰트} 에 문서로 만들어져 있습니다. style이 @code{'@{'} 인 경우 메시지 포맷 문자열은 @ref{832,,str.format()}(키워드 인자 사용)과 호환되는 것으로 가정하고, 스타일이 @code{'$'} 이면 메시지 포맷 문자열은 @ref{20d3,,string.Template.substitute()} 가 기대하는 것과 일치해야 합니다.


버전 3.2에서 변경: @code{style} 매개 변수를 추가했습니다.


다음 메시지 포맷 문자열은 사람이 읽을 수 있는 형식의 시간, 메시지의 심각도 및 메시지의 내용을 순서대로 기록합니다:

@example
'%(asctime)s - %(levelname)s - %(message)s'
@end example

포매터는 사용자가 구성 할 수 있는 함수를 사용하여 레코드의 생성 시간을 튜플로 변환합니다. 기본적으로, @ref{16fe,,time.localtime()} 이 사용됩니다; 특정 포매터 인스턴스에 대해 이를 변경하려면, 인스턴스의 @code{converter} 어트리뷰트를 @code{time.localtime()} 또는 @ref{13c5,,time.gmtime()} 과 같은 서명을 가진 함수로 설정하십시오. 모든 포매터를 변경하려면, 예를 들어 모든 로깅 시간을 GMT로 표시하려면, Formatter 클래스의 @code{converter} 어트리뷰트를 설정하십시오 (GMT 표시를 위해 @code{time.gmtime} 으로).

@node 로깅 구성,구성이 제공되지 않으면 어떻게 되는가,포매터,고급 로깅 자습서
@anchor{howto/logging configuring-logging}@anchor{57a3}
@subsubsection 로깅 구성


프로그래머는 세 가지 방법으로 로깅을 구성 할 수 있습니다:


@enumerate 

@item 
위에 나열된 구성 메서드를 호출하는 파이썬 코드를 사용하여 로거, 처리기 및 포매터를 명시적으로 만듭니다.

@item 
로깅 구성 파일을 만들고, @ref{d47,,fileConfig()} 함수를 사용하여 그것을 읽습니다.

@item 
구성 정보의 딕셔너리를 만들고, @ref{13b5,,dictConfig()} 함수에 전달합니다.
@end enumerate

마지막 두 옵션에 대한 참조 설명서는 @ref{14f6,,구성 함수}를 참조하십시오. 다음 예제는 파이썬 코드를 사용하여 매우 단순한 로거, 콘솔 처리기 및 간단한 포매터를 구성합니다:

@example
import logging

# 로거를 만듭니다
logger = logging.getLogger('simple_example')
logger.setLevel(logging.DEBUG)

# 콘솔 처리기를 만들고 수준을 DEBUG 로 설정합니다
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)

# 포매터를 만듭니다
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

# 포매터를 ch 에 추가합니다
ch.setFormatter(formatter)

# ch 를 로거에 추가합니다
logger.addHandler(ch)

# '응용 프로그램' 코드
logger.debug('debug message')
logger.info('info message')
logger.warning('warn message')
logger.error('error message')
logger.critical('critical message')
@end example

명령행에서 이 모듈을 실행하면 다음과 같이 출력됩니다:

@example
$ python simple_logging_module.py
2005-03-19 15:10:26,618 - simple_example - DEBUG - debug message
2005-03-19 15:10:26,620 - simple_example - INFO - info message
2005-03-19 15:10:26,695 - simple_example - WARNING - warn message
2005-03-19 15:10:26,697 - simple_example - ERROR - error message
2005-03-19 15:10:26,773 - simple_example - CRITICAL - critical message
@end example

다음의 파이썬 모듈은 위에 열거된 예제와 거의 같고 객체의 이름 만 다른 로거, 처리기 및 포매터를 생성합니다:

@example
import logging
import logging.config

logging.config.fileConfig('logging.conf')

# 로거를 만듭니다
logger = logging.getLogger('simpleExample')

# '응용 프로그램' 코드
logger.debug('debug message')
logger.info('info message')
logger.warning('warn message')
logger.error('error message')
logger.critical('critical message')
@end example

logging.conf 파일은 이렇습니다:

@example
[loggers]
keys=root,simpleExample

[handlers]
keys=consoleHandler

[formatters]
keys=simpleFormatter

[logger_root]
level=DEBUG
handlers=consoleHandler

[logger_simpleExample]
level=DEBUG
handlers=consoleHandler
qualname=simpleExample
propagate=0

[handler_consoleHandler]
class=StreamHandler
level=DEBUG
formatter=simpleFormatter
args=(sys.stdout,)

[formatter_simpleFormatter]
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
@end example

출력은 구성 파일 기반이 아닌 예제와 거의 같습니다:

@example
$ python simple_logging_config.py
2005-03-19 15:38:55,977 - simpleExample - DEBUG - debug message
2005-03-19 15:38:55,979 - simpleExample - INFO - info message
2005-03-19 15:38:56,054 - simpleExample - WARNING - warn message
2005-03-19 15:38:56,055 - simpleExample - ERROR - error message
2005-03-19 15:38:56,130 - simpleExample - CRITICAL - critical message
@end example

구성 파일 접근법이 파이썬 코드 접근법보다 몇 가지 장점이 있음을 알 수 있습니다. 주로 구성과 코드의 분리와 코더가 아니라도 로깅 속성을 쉽게 수정할 수 있다는 것입니다.

@cartouche
@quotation 경고 
@ref{d47,,fileConfig()} 함수는 기본 매개 변수 @code{disable_existing_loggers} 를 취하는데, 하위 호환성을 위해 기본값은 @code{True} 입니다. 이것들은 여러분이 원하는 것일 수도 있고 아닐 수도 있습니다. 왜냐하면 @code{fileConfig()} 호출 전에 존재하는 모든 비 루트 로거들이, 구성에서 명시적으로 명명되지 않는 한, 비활성화되기 때문입니다. 자세한 내용은 참조 설명서를 참조하고, 원한다면 이 매개 변수에 @code{False} 를 지정하십시오.

@ref{13b5,,dictConfig()} 에 전달된 딕셔너리 또한 @code{disable_existing_loggers} 키로 논리값을 지정할 수 있습니다. 딕셔너리에 명시적으로 지정되지 않으면 기본적으로 @code{True} 로 해석됩니다. 이것은 위에서 설명한 로거 비활성화 동작으로 이어지는데, 여러분이 원하는 것이 아닐 수도 있습니다. 이 경우 키에 명시적으로 @code{False} 값을 제공하십시오.
@end quotation
@end cartouche

구성 파일에서 참조되는 클래스 이름은 logging 모듈에 상대적이거나, 일반적인 임포트 메커니즘을 사용하여 결정할 수 있는 절댓값이어야 합니다. 따라서, @ref{3202,,WatchedFileHandler} (logging 모듈에 상대적) 또는 @code{mypackage.mymodule.MyHandler} (패키지 @code{mypackage} 와 모듈 @code{mymodule} 에 정의된 클래스, 여기서 @code{mypackage} 는 파이썬 임포트 경로에서 사용 가능해야 합니다).

파이썬 3.2에서는 구성 정보를 보관하는 딕셔너리를 사용하여 로깅을 구성하는 새로운 방법이 도입되었습니다. 이는 위에 설명된 구성 파일 기반 접근 방식의 기능을 제공하며, 새로운 응용 프로그램 및 배포에 권장되는 구성 방법입니다. 파이썬 딕셔너리가 구성 정보를 저장하는 데 사용되고, 다른 방법을 사용하여 해당 딕셔너리를 채울 수 있으므로 더 많은 구성 옵션을 갖게 됩니다. 예를 들어, 구성 딕셔너리를 채우는데 JSON 형식의 구성 파일이나, YAML 처리 기능에 액세스할 수 있는 경우, YAML 형식의 파일을 사용할 수 있습니다. 물론, 파이썬 코드로 딕셔너리를 만들거나, 소켓을 통해 피클 된 형태로 수신하거나, 그 밖의 응용 프로그램에 적합한 어떤 방식도 사용할 수 있습니다.

다음은 새로운 딕셔너리 기반 접근 방식으로 YAML 형식으로 위와 같이 구성한 예입니다:

@example
version: 1
formatters:
  simple:
    format: '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
handlers:
  console:
    class: logging.StreamHandler
    level: DEBUG
    formatter: simple
    stream: ext://sys.stdout
loggers:
  simpleExample:
    level: DEBUG
    handlers: [console]
    propagate: no
root:
  level: DEBUG
  handlers: [console]
@end example

딕셔너리를 사용하여 로깅 하는 방법에 대한 자세한 내용은 @ref{14f6,,구성 함수}를 참조하십시오.

@node 구성이 제공되지 않으면 어떻게 되는가,라이브러리 로깅 구성,로깅 구성,고급 로깅 자습서
@anchor{howto/logging what-happens-if-no-configuration-is-provided}@anchor{57a4}
@subsubsection 구성이 제공되지 않으면 어떻게 되는가


로깅 구성이 제공되지 않으면, 로깅 이벤트를 출력해야 하지만 이벤트를 출력하는 처리기를 찾을 수 없는 상황이 발생할 수 있습니다.

이 이벤트는 @ref{13ff,,lastResort} 에 저장된 ‘최후 수단 처리기’를 사용하여 출력됩니다. 이 내부 처리기는 어떤 로거와도 연관되어 있지 않고, 이벤트 설명 메시지를 @code{sys.stderr} 의 현재 값으로 쓰는 (따라서 현재 효과를 발휘하고 있는 모든 리디렉션을 존중합니다) @ref{13fd,,StreamHandler} 처럼 동작합니다. 메시지에는 어떤 포매팅도 적용되지 않습니다 - 이벤트 설명 메시지가 그대로 인쇄됩니다. 처리기의 수준은 @code{WARNING} 으로 설정되어 있으므로, 이보다 크거나 같은 심각도의 모든 이벤트가 출력됩니다.


버전 3.2에서 변경: 3.2 이전의 파이썬 버전의 경우 동작은 다음과 같습니다:


@itemize *

@item 
@ref{13fe,,raiseExceptions} 가 @code{False} (프로덕션 모드)이면, 이벤트가 조용히 무시됩니다.

@item 
@ref{13fe,,raiseExceptions} 가 @code{True} (개발 모드) 이면, ‘No handlers could be found for logger X.Y.Z’ 라는 메시지가 한 번 인쇄됩니다.
@end itemize

3.2 이전의 동작을 얻으려면, @ref{13ff,,lastResort} 를 @code{None} 으로 설정할 수 있습니다.


@node 라이브러리 로깅 구성,,구성이 제공되지 않으면 어떻게 되는가,고급 로깅 자습서
@anchor{howto/logging configuring-logging-for-a-library}@anchor{57a5}@anchor{howto/logging library-config}@anchor{31ff}
@subsubsection 라이브러리 로깅 구성


로깅을 사용하는 라이브러리를 개발할 때, 라이브러리에서 로깅을 사용하는 방법을 문서로 만들어야 합니다 - 예를 들어, 사용된 로거의 이름. 또한, 로깅 구성에 대한 고려가 필요합니다. 사용하는 응용 프로그램이 로깅을 사용하지 않고 라이브러리 코드가 로깅을 호출하면, (앞 절에서 설명했듯이) 심각도가 @code{WARNING} 이상인 이벤트는 @code{sys.stderr} 에 출력됩니다. 이것이 최상의 기본 동작인 것으로 간주합니다.

어떤 이유로 로깅 구성이 없을 때 이 메시지가 인쇄되는 것을 원하지 `않는'다면, 라이브러리의 최상위 로거에 아무것도 하지 않는 처리기를 연결할 수 있습니다. 이렇게 하면 메시지가 인쇄되는 것을 피할 수 있습니다. 라이브러리의 이벤트를 위한 처리기가 항상 존재하기 때문입니다: 단지 아무런 출력도 만들지 않을 뿐입니다. 라이브러리 사용자가 응용 프로그램이 사용하기 위해 로깅을 구성하면, 아마도 그 구성이 어떤 처리기를 추가할 것이고, 수준이 적절하게 구성된 경우 라이브러리에서 이루어진 로깅 호출은 그 처리기로 정상적으로 출력을 보낼 것입니다.

아무것도 하지 않는 처리기가 logging 패키지에 포함되어 있습니다: @ref{1489,,NullHandler} (파이썬 3.1부터). 이 처리기의 인스턴스는 라이브러리가 사용하는 로깅 이름 공간의 최상위 로거에 추가될 수 있습니다 (`만약' 로깅 구성이 없는 경우 라이브러리가 로깅한 이벤트가 @code{sys.stderr} 에 출력되는 것을 막으려면). 라이브러리 `foo' 에 의한 모든 로깅이 ‘foo.x’, ‘foo.x.y’ 등과 일치하는 이름을 가진 로거들만 사용한다면, 다음과 같은 코드가:

@example
import logging
logging.getLogger('foo').addHandler(logging.NullHandler())
@end example

원하는 효과를 주어야 합니다. 만약 조직이 여러 라이브러리를 만든다면, 지정된 로거 이름으로 단순한 ‘foo’ 대신에 ‘orgname.foo’를 사용할 수 있습니다.

@cartouche
@quotation 참고 
It is strongly advised that you `do not log to the root logger'
in your library. Instead, use a logger with a unique and easily
identifiable name, such as the @code{__name__} for your library’s top-level package
or module. Logging to the root logger will make it difficult or impossible for
the application developer to configure the logging verbosity or handlers of
your library as they wish.
@end quotation
@end cartouche

@cartouche
@quotation 참고 
@ref{1489,,NullHandler} `이외의 처리기를 라이브러리의 로거에 추가하지 않는 것이' 좋습니다. 이것은 처리기 구성이 라이브러리를 사용하는 응용 프로그램 개발자의 특권이기 때문입니다. 응용 프로그램 개발자는 사용자와 응용 프로그램에 가장 적합한 처리기가 무엇인지 알고 있습니다. 여러분이 처리기를 ‘이면에서’ 추가하면, 단위 테스트를 수행하고 그들의 요구사항에 맞는 로그를 전달하는 작업을 방해할 수 있습니다.
@end quotation
@end cartouche

@node 로깅 수준<2>,유용한 처리기,고급 로깅 자습서,로깅 HOWTO
@anchor{howto/logging logging-levels}@anchor{57a6}
@subsection 로깅 수준


로깅 수준의 숫자 값은 다음 표에 나와 있습니다. 이것은 주로 여러분 자신의 수준을 정의하고 사전 정의된 수준에 상대적인 특정 값을 갖도록 하려는 경우 관심의 대상입니다. 같은 숫자 값을 가진 수준을 정의하면 미리 정의된 값을 덮어씁니다; 사전 정의된 이름이 유실됩니다.


@multitable {xxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxx} 
@headitem

수준

@tab

숫자 값

@item

@code{CRITICAL}

@tab

50

@item

@code{ERROR}

@tab

40

@item

@code{WARNING}

@tab

30

@item

@code{INFO}

@tab

20

@item

@code{DEBUG}

@tab

10

@item

@code{NOTSET}

@tab

0

@end multitable


또한, 수준은 개발자가 설정하거나 저장된 로깅 구성을 로드하여 로거와 연관될 수 있습니다. 로깅 메서드가 로거에 호출되면, 로거는 자체 수준을 메서드 호출과 연관된 수준과 비교합니다. 로거 수준이 메서드 호출보다 높으면 실제로 로깅 메시지가 생성되지 않습니다. 이것은 로그 출력의 상세도를 제어하는 기본 메커니즘입니다.

로깅 메시지는 @ref{11e5,,LogRecord} 클래스의 인스턴스로 인코딩됩니다. 로거가 실제로 이벤트를 로그 하기로 하면, @code{LogRecord} 인스턴스가 로깅 메시지로부터 만들어집니다.

로깅 메시지는 @ref{169b,,Handler} 클래스의 서브 클래스의 인스턴스인 `처리기 (handlers)' 를 통한 전달 메커니즘을 적용받게 됩니다. 처리기는 로그된 메시지(@ref{11e5,,LogRecord} 형식)가 대상 독자(가령 최종 사용자, 지원 데스크 직원, 시스템 관리자, 개발자)에게 유용한 특정 위치(또는 위치 집합)에 도달하도록 할 책임이 있습니다. 처리기로는 특정 목적지를 위한 @code{LogRecord} 인스턴스가 전달됩니다. 각 로거에는 0개 이상의 처리기가 연관될 수 있습니다 (@ref{d45,,Logger} 의 @ref{317e,,addHandler()} 메서드를 통해). 로거에 직접 연관된 모든 처리기뿐만 아니라, (로거의 `propagate' 플래그가 거짓 값으로 설정되어 있지 않은 한, 그 지점에서 부모 처리기로의 전달이 멈춥니다) `로거의 모든 조상과 연관된 모든 처리기'가 메시지를 전달하도록 호출됩니다.

로거와 마찬가지로, 처리기도 연관된 수준을 가질 수 있습니다. 처리기의 수준은 로거의 수준과 같은 방식으로 필터의 역할을 합니다. 처리기가 실제로 이벤트를 전달하기로 하면, @ref{319e,,emit()} 메서드가 목적지로 메시지를 보내기 위해 사용됩니다. @ref{169b,,Handler} 의 대부분의 사용자 정의 서브 클래스는 이 @code{emit()} 를 재정의해야 합니다.

@menu
* 사용자 정의 수준:: 

@end menu

@node 사용자 정의 수준,,,로깅 수준<2>
@anchor{howto/logging custom-levels}@anchor{31c7}@anchor{howto/logging id2}@anchor{57a7}
@subsubsection 사용자 정의 수준


여러분 자신의 수준을 정의하는 것이 가능하지만 필요하지는 않은데, 현재의 수준이 실무 경험에 근거하여 선택되었기 때문입니다. 하지만, 사용자 정의 수준이 필요하다고 확신하는 경우, 이를 수행할 때 많은 주의를 기울여야 합니다. `라이브러리를 개발하고 있다면 사용자 지정 수준을 정의하는 것은 매우 나쁜 생각'일 수 있습니다. 왜냐하면, 여러 라이브러리 작성자가 모두 자신의 사용자 정의 수준을 정의하면, 주어진 숫자 값이 라이브러리마다 각기 다른 것을 의미 할 수 있으므로, 사용 중인 개발자가 함께 사용하는 여러 라이브러리의 로깅 결과를 제어하거나 해석하는 것이 어려울 수 있기 때문입니다.

@node 유용한 처리기,로깅 중에 발생하는 예외,로깅 수준<2>,로깅 HOWTO
@anchor{howto/logging id3}@anchor{57a8}@anchor{howto/logging useful-handlers}@anchor{57a0}
@subsection 유용한 처리기


베이스 @ref{169b,,Handler} 클래스 외에도 많은 유용한 서브 클래스가 제공됩니다:


@enumerate 

@item 
@ref{13fd,,StreamHandler} 인스턴스는 스트림(파일류 객체)에 메시지를 보냅니다.

@item 
@ref{1c51,,FileHandler} 인스턴스는 디스크 파일에 메시지를 보냅니다.

@item 
@ref{3206,,BaseRotatingHandler} 는 특정 지점에서 로그 파일을 회전시키는 처리기의 베이스 클래스입니다. 직접 인스턴스화하는 것은 아닙니다. 대신 @ref{1942,,RotatingFileHandler} 또는 @ref{1160,,TimedRotatingFileHandler} 를 사용하십시오.

@item 
@ref{1942,,RotatingFileHandler} 인스턴스는 디스크 파일에 메시지를 보내는데, 최대 로그 파일 크기와 로그 파일 회전을 지원합니다.

@item 
@ref{1160,,TimedRotatingFileHandler} 인스턴스는 디스크 파일에 메시지를 보내는데, 일정한 시간 간격으로 로그 파일을 회전시킵니다.

@item 
@ref{1161,,SocketHandler} 인스턴스는 TCP/IP 소켓에 메시지를 보냅니다. 3.4부터, 유닉스 도메인 소켓도 지원됩니다.

@item 
@ref{1162,,DatagramHandler} 인스턴스는 UDP 소켓에 메시지를 보냅니다. 3.4부터, 유닉스 도메인 소켓도 지원됩니다.

@item 
@ref{18b3,,SMTPHandler} 인스턴스는 지정된 전자 우편 주소로 메시지를 보냅니다.

@item 
@ref{86b,,SysLogHandler} 인스턴스는 유닉스 syslog 데몬(원격 기계에 있는 것도 가능합니다)에 메시지를 보냅니다.

@item 
@ref{322c,,NTEventLogHandler} 인스턴스는 윈도우 NT/2000/XP 이벤트 로그에 메시지를 보냅니다.

@item 
@ref{31e5,,MemoryHandler} 인스턴스는 메모리에 있는 버퍼에 메시지를 보내는데, 특정 기준이 만족 될 때마다 플러시 됩니다.

@item 
@ref{102b,,HTTPHandler} 인스턴스는 @code{GET} 또는 @code{POST} 을 사용해서 HTTP 서버에 메시지를 보냅니다.

@item 
@ref{3202,,WatchedFileHandler} 인스턴스는 그들이 로깅하고 있는 파일을 감시합니다. 파일이 변경되면 닫히고 파일 이름을 사용하여 다시 열립니다. 이 처리기는 유닉스 계열 시스템에서만 유용합니다; 윈도우는 사용된 하부 메커니즘을 지원하지 않습니다.

@item 
@ref{1b5f,,QueueHandler} 인스턴스는 @ref{bb,,queue} 또는 @ref{98,,multiprocessing} 모듈에 구현된 것과 같은 큐로 메시지를 보냅니다.

@item 
@ref{1489,,NullHandler} 인스턴스는 에러 메시지로 아무것도 하지 않습니다. 라이브러리 개발자가 로깅을 사용하지만, 라이브러리 사용자가 로깅을 구성하지 않으면 표시될 수 있는 ‘No handlers could be found for logger `XXX'’ 라는 메시지를 피하려고 할 때 사용합니다. 자세한 정보는 @ref{31ff,,라이브러리 로깅 구성} 를 보십시오.
@end enumerate


Added in version 3.1: @ref{1489,,NullHandler} 클래스.



Added in version 3.2: @ref{1b5f,,QueueHandler} 클래스.


@ref{1489,,NullHandler}, @ref{13fd,,StreamHandler} 와 @ref{1c51,,FileHandler} 클래스는 코어 logging 패키지에 정의되어 있습니다. 다른 처리기는 하위 모듈인 @ref{8d,,logging.handlers} 에 정의되어 있습니다. (구성 기능을 위한, 또 다른 하위 모듈 @ref{8c,,logging.config} 도 있습니다.)

로그된 메시지는 @ref{169c,,Formatter} 클래스의 인스턴스를 통해 표시를 위해 포맷됩니다. % 연산자와 딕셔너리와 함께 사용하기에 적합한 포맷 문자열로 초기화됩니다.

일괄 처리로 여러 개의 메시지를 포맷하려면, @ref{31a7,,BufferingFormatter} 의 인스턴스를 사용할 수 있습니다. 포맷 문자열(일괄 처리 때 각 메시지에 적용됩니다)에 더해, 헤더와 트레일러 포맷 문자열에 대한 고려가 있습니다.

로거 수준과 처리기 수준을 기반으로 필터링하는 것만으로는 충분하지 않은 경우, @ref{d45,,Logger} 및 @ref{169b,,Handler} 인스턴스에 (@ref{3197,,addFilter()} 메서드를 통해) @ref{1400,,Filter} 인스턴스를 추가 할 수 있습니다. 메시지를 더 처리하기로 하기 전에, 로거와 처리기는 모든 필터에 허락을 요청합니다. 한 필터라도 거짓 값을 반환하면 메시지는 더 처리되지 않습니다.

기본적인 @ref{1400,,Filter} 기능은 특정 로거 이름으로 필터링하는 것을 지원합니다. 이 기능을 사용하면, 명명된 로거와 그 자식으로 보낸 메시지는 필터를 통과하도록 허용되고, 다른 모든 메시지는 삭제됩니다.

@node 로깅 중에 발생하는 예외,임의의 객체를 메시지로 사용하기,유용한 처리기,로깅 HOWTO
@anchor{howto/logging exceptions-raised-during-logging}@anchor{57a9}@anchor{howto/logging logging-exceptions}@anchor{57aa}
@subsection 로깅 중에 발생하는 예외


logging 패키지는 프로덕션에서 로깅 하는 동안 발생하는 예외를 삼키도록 설계되었습니다. 이는 로깅 이벤트를 처리하는 동안 발생하는 에러(가령 잘못된 로깅 구성, 네트워크 또는 기타 유사한 에러)가 로깅을 사용하는 응용 프로그램을 조기에 종료시키지 않도록 하기 위한 것입니다.

@ref{f3b,,SystemExit} 과 @ref{bc4,,KeyboardInterrupt} 예외는 절대 삼켜지지 않습니다. @ref{169b,,Handler} 서브 클래스의 @ref{319e,,emit()} 메서드가 실행되는 동안 발생하는 다른 예외는 @ref{319d,,handleError()} 메서드에 전달됩니다.

@ref{169b,,Handler} 에 있는 @ref{319d,,handleError()} 의 기본 구현은 모듈 수준 변수 @ref{13fe,,raiseExceptions} 가 설정되어 있는지를 검사합니다. 설정되어있으면, 트레이스백이 @ref{b33,,sys.stderr} 에 인쇄됩니다. 설정되지 않았으면 예외를 삼킵니다.

@cartouche
@quotation 참고 
@ref{13fe,,raiseExceptions} 의 기본값은 @code{True} 입니다. 개발 중에는, 보통 발생하는 예외에 대한 알림을 받기를 원하기 때문입니다. 프로덕션 용도로는 @code{raiseExceptions} 를 @code{False} 로 설정하는 것이 좋습니다.
@end quotation
@end cartouche

@node 임의의 객체를 메시지로 사용하기,최적화<6>,로깅 중에 발생하는 예외,로깅 HOWTO
@anchor{howto/logging arbitrary-object-messages}@anchor{31b3}@anchor{howto/logging using-arbitrary-objects-as-messages}@anchor{57ab}
@subsection 임의의 객체를 메시지로 사용하기


앞의 절과 예제에서 이벤트를 로깅할 때 전달되는 메시지는 문자열이라고 가정했습니다. 그러나 이것만 가능한 것은 아닙니다. 임의의 객체를 메시지로 전달할 수 있으며, 로깅 시스템이 이를 문자열 표현으로 변환해야 할 때 @ref{82f,,__str__()} 메서드가 호출됩니다. 사실, 원한다면, 문자열 표현을 계산하는 것을 완전히 피할 수 있습니다 - 예를 들어, @ref{1161,,SocketHandler} 는 이벤트를 피클링해서 와이어를 통해 전송하는 방식으로 이벤트를 보냅니다.

@node 최적화<6>,기타 자료,임의의 객체를 메시지로 사용하기,로깅 HOWTO
@anchor{howto/logging optimization}@anchor{57ac}
@subsection 최적화


메시지 인자의 포매팅은 피할 수 없을 때까지 연기됩니다. 하지만, 로깅 메서드에 전달된 인자를 계산하는 것 또한 비용이 많이들 수 있고, 로거가 이벤트를 버리는 경우에는 수행하지 않고 싶을 수 있습니다. 꼭 해야 할 것을 결정하기 위해서, level 인자를 취하고 해당 수준의 호출이 로거에 의해 이벤트가 생성되면 참을 반환하는 @ref{14fb,,isEnabledFor()} 메서드를 호출 할 수 있습니다. 다음과 같은 코드를 작성할 수 있습니다:

@example
if logger.isEnabledFor(logging.DEBUG):
    logger.debug('Message with %s, %s', expensive_func1(),
                                        expensive_func2())
@end example

그러면, 로거의 수준이 @code{DEBUG} 보다 높게 설정된 경우, @code{expensive_func1} 과 @code{expensive_func2} 호출은 절대 일어나지 않습니다.

@cartouche
@quotation 참고 
때에 따라, @ref{14fb,,isEnabledFor()} 자체가 원하는 것보다 더 비쌀 수 있습니다 (예를 들어, 명시적 수준이 로거 계층의 상단에서만 설정된 깊이 중첩된 로거의 경우). 그러한 경우 (또는 꽉 짜인 루프 내에서 메서드를 호출하지 않으려는 경우) 지역이나 인스턴스 변수에 @code{isEnabledFor()} 의 호출 결과를 캐시하고, 매번 메서드를 호출하는 대신 그 값을 사용할 수 있습니다. 이러한 캐시 된 값은 응용 프로그램이 실행되는 동안 로깅 구성이 동적으로 변경될 때(그리 흔한 경우는 아닙니다)만 재계산될 필요가 있습니다.
@end quotation
@end cartouche

로깅 정보를 수집하는 방법을 보다 정밀하게 제어해야 하는 특정 응용 프로그램에 대해 수행할 수 있는 다른 최적화가 있습니다. 다음은 필요하지 않은 로깅 처리를 피하고자 수행할 수 있는 작업 목록입니다:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

수집하고 싶지 않은 것

@tab

수집하는 것을 피하는 방법

@item

호출이 이루어진 위치에 관한 정보.

@tab

@code{logging._srcfile} 을 @code{None} 으로 설정하십시오. 이렇게 하면 @ref{8ef,,sys._getframe()} 호출을 피할 수 있는데, PyPy(@code{sys._getframe()} 을 사용하는 코드의 속도를 높일 수 없습니다)와 같은 환경에서 코드 속도를 높이는 데 도움이 됩니다.

@item

스레딩 정보.

@tab

@code{logging.logThreads} 를 @code{False} 으로 설정하십시오.

@item

Current process ID (@ref{3028,,os.getpid()})

@tab

@code{logging.logProcesses} 를 @code{False} 으로 설정하십시오.

@item

Current process name when using @code{multiprocessing}
to manage multiple processes.

@tab

@code{logging.logMultiprocessing} 를 @code{False} 으로 설정하십시오.

@item

Current @ref{1c7,,asyncio.Task} name when using
@code{asyncio}.

@tab

@code{logging.logAsyncioTasks} 를 @code{False} 으로 설정하십시오.

@end multitable


또한, 코어 logging 모듈에는 기본 처리기만 포함됩니다. @ref{8d,,logging.handlers} 와 @ref{8c,,logging.config} 를 임포트 하지 않으면 메모리를 차지하지 않습니다.

@node 기타 자료,,최적화<6>,로깅 HOWTO
@anchor{howto/logging other-resources}@anchor{57ad}@anchor{howto/logging tutorial-ref-links}@anchor{5791}
@subsection 기타 자료



@subsubheading 더 보기



@table @asis

@item 모듈 @ref{8b,,logging}

logging 모듈에 관한 API 레퍼런스.

@item 모듈 @ref{8c,,logging.config}

logging 모듈용 구성 API.

@item 모듈 @ref{8d,,logging.handlers}

logging 모듈에 포함된 유용한 처리기.
@end table

@ref{13fc,,로깅 요리책}


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 로깅 요리책,정규식 HOWTO,로깅 HOWTO,파이썬 HOWTO
@anchor{howto/logging-cookbook doc}@anchor{57ae}@anchor{howto/logging-cookbook id1}@anchor{57af}@anchor{howto/logging-cookbook logging-cookbook}@anchor{13fc}@anchor{howto/logging-cookbook translation-repo}@anchor{57b0}
@section 로깅 요리책


@*저자: 
Vinay Sajip <vinay_sajip at red-dove dot com>


This page contains a number of recipes related to logging, which have been found
useful in the past. For links to tutorial and reference information, please see
@ref{57b1,,Other resources}.

@menu
* 여러 모듈에서 로깅 사용하기:: 
* 여러 스레드에서 로깅 하기:: 
* 다중 처리기 및 포매터:: 
* 여러 대상으로 로깅 하기:: 
* Custom handling of levels:: 
* 구성 서버 예제:: 
* 블록 하는 처리기 다루기:: 
* 네트워크에서 로깅 이벤트 보내고 받기:: 
* 로그 출력에 문맥 정보 추가:: 
* Use of contextvars:: 
* Imparting contextual information in handlers:: 
* 여러 프로세스에서 단일 파일에 로깅 하기:: 
* 파일 회전 사용하기:: 
* 대체 포매팅 스타일 사용하기:: 
* 사용자 정의 LogRecord:: 
* Subclassing QueueHandler and QueueListener- a ZeroMQ example:: 
* Subclassing QueueHandler and QueueListener- a pynng example:: 
* 딕셔너리 기반 구성의 예:: 
* rotator와 namer를 사용해서 로그 회전 처리하기:: 
* 좀 더 정교한 multiprocessing 예제:: 
* SysLogHandler로 전송된 메시지에 BOM 삽입하기:: 
* 구조적 로깅 구현:: 
* dictConfig()로 처리기를 사용자 정의하기: dictConfig 로 처리기를 사용자 정의하기. 
* 응용 프로그램 전체에서 특정 포맷 스타일 사용하기:: 
* dictConfig()로 필터 구성하기: dictConfig 로 필터 구성하기. 
* 사용자 정의된 예외 포매팅:: 
* 로깅 메시지 말하기:: 
* 로깅 메시지를 버퍼링하고 조건부 출력하기:: 
* Sending logging messages to email@comma{} with buffering: Sending logging messages to email with buffering. 
* 구성을 통해 UTC(GMT)로 시간을 포맷하기: 구성을 통해 UTC GMT 로 시간을 포맷하기. 
* 선택적 로깅을 위해 컨텍스트 관리자 사용하기:: 
* CLI 응용 프로그램 시작 템플릿:: 
* 로깅을 위한 Qt GUI:: 
* Logging to syslog with RFC5424 support:: 
* How to treat a logger like an output stream:: 
* How to uniformly handle newlines in logging output:: 
* Patterns to avoid:: 
* Other resources:: 

@end menu

@node 여러 모듈에서 로깅 사용하기,여러 스레드에서 로깅 하기,,로깅 요리책
@anchor{howto/logging-cookbook using-logging-in-multiple-modules}@anchor{57b2}
@subsection 여러 모듈에서 로깅 사용하기


@code{logging.getLogger('someLogger')} 를 여러 번 호출하면 같은 로거 객체에 대한 참조가 반환됩니다. 같은 모듈 내에서뿐만 아니라, 같은 파이썬 인터프리터 프로세스에 있는 한, 여러 모듈에서도 마찬가지입니다. 참조가 같은 객체를 가리킨다는 것에 더해, 응용 프로그램 코드는 하나의 모듈에서 부모 로거를 정의 및 구성하고 별도의 모듈에서 자식 로거를 생성 (구성하지 않음) 할 수 있으며, 자식에 대한 모든 로거 호출은 부모로 전달됩니다. 다음은 메인 모듈입니다:

@example
import logging
import auxiliary_module

# create logger with 'spam_application'
logger = logging.getLogger('spam_application')
logger.setLevel(logging.DEBUG)
# create file handler which logs even debug messages
fh = logging.FileHandler('spam.log')
fh.setLevel(logging.DEBUG)
# create console handler with a higher log level
ch = logging.StreamHandler()
ch.setLevel(logging.ERROR)
# create formatter and add it to the handlers
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh.setFormatter(formatter)
ch.setFormatter(formatter)
# add the handlers to the logger
logger.addHandler(fh)
logger.addHandler(ch)

logger.info('creating an instance of auxiliary_module.Auxiliary')
a = auxiliary_module.Auxiliary()
logger.info('created an instance of auxiliary_module.Auxiliary')
logger.info('calling auxiliary_module.Auxiliary.do_something')
a.do_something()
logger.info('finished auxiliary_module.Auxiliary.do_something')
logger.info('calling auxiliary_module.some_function()')
auxiliary_module.some_function()
logger.info('done with auxiliary_module.some_function()')
@end example

다음은 보조 모듈입니다:

@example
import logging

# create logger
module_logger = logging.getLogger('spam_application.auxiliary')

class Auxiliary:
    def __init__(self):
        self.logger = logging.getLogger('spam_application.auxiliary.Auxiliary')
        self.logger.info('creating an instance of Auxiliary')

    def do_something(self):
        self.logger.info('doing something')
        a = 1 + 1
        self.logger.info('done doing something')

def some_function():
    module_logger.info('received a call to "some_function"')
@end example

출력은 이렇게 됩니다:

@example
2005-03-23 23:47:11,663 - spam_application - INFO -
   creating an instance of auxiliary_module.Auxiliary
2005-03-23 23:47:11,665 - spam_application.auxiliary.Auxiliary - INFO -
   creating an instance of Auxiliary
2005-03-23 23:47:11,665 - spam_application - INFO -
   created an instance of auxiliary_module.Auxiliary
2005-03-23 23:47:11,668 - spam_application - INFO -
   calling auxiliary_module.Auxiliary.do_something
2005-03-23 23:47:11,668 - spam_application.auxiliary.Auxiliary - INFO -
   doing something
2005-03-23 23:47:11,669 - spam_application.auxiliary.Auxiliary - INFO -
   done doing something
2005-03-23 23:47:11,670 - spam_application - INFO -
   finished auxiliary_module.Auxiliary.do_something
2005-03-23 23:47:11,671 - spam_application - INFO -
   calling auxiliary_module.some_function()
2005-03-23 23:47:11,672 - spam_application.auxiliary - INFO -
   received a call to 'some_function'
2005-03-23 23:47:11,673 - spam_application - INFO -
   done with auxiliary_module.some_function()
@end example

@node 여러 스레드에서 로깅 하기,다중 처리기 및 포매터,여러 모듈에서 로깅 사용하기,로깅 요리책
@anchor{howto/logging-cookbook logging-from-multiple-threads}@anchor{57b3}
@subsection 여러 스레드에서 로깅 하기


여러 스레드에서 로깅 하는데 특별한 노력이 필요하지는 않습니다. 다음 예제에서는 메인 (최초) 스레드와 다른 스레드에서의 로깅을 보여줍니다:

@example
import logging
import threading
import time

def worker(arg):
    while not arg['stop']:
        logging.debug('Hi from myfunc')
        time.sleep(0.5)

def main():
    logging.basicConfig(level=logging.DEBUG, format='%(relativeCreated)6d %(threadName)s %(message)s')
    info = @{'stop': False@}
    thread = threading.Thread(target=worker, args=(info,))
    thread.start()
    while True:
        try:
            logging.debug('Hello from main')
            time.sleep(0.75)
        except KeyboardInterrupt:
            info['stop'] = True
            break
    thread.join()

if __name__ == '__main__':
    main()
@end example

실행하면 스크립트는 다음과 같이 인쇄합니다:

@example
   0 Thread-1 Hi from myfunc
   3 MainThread Hello from main
 505 Thread-1 Hi from myfunc
 755 MainThread Hello from main
1007 Thread-1 Hi from myfunc
1507 MainThread Hello from main
1508 Thread-1 Hi from myfunc
2010 Thread-1 Hi from myfunc
2258 MainThread Hello from main
2512 Thread-1 Hi from myfunc
3009 MainThread Hello from main
3013 Thread-1 Hi from myfunc
3515 Thread-1 Hi from myfunc
3761 MainThread Hello from main
4017 Thread-1 Hi from myfunc
4513 MainThread Hello from main
4518 Thread-1 Hi from myfunc
@end example

예상대로 로그 출력이 산재해 있음을 볼 수 있습니다. 물론, 이 방법은 여기에 표시된 것보다 많은 스레드에서도 작동합니다.

@node 다중 처리기 및 포매터,여러 대상으로 로깅 하기,여러 스레드에서 로깅 하기,로깅 요리책
@anchor{howto/logging-cookbook multiple-handlers-and-formatters}@anchor{57b4}
@subsection 다중 처리기 및 포매터


로거는 일반 파이썬 객체입니다. @ref{317e,,addHandler()} 메서드에는 추가할 수 있는 처리기의 수에 대한 최소 또는 최대 할당량이 없습니다. 때로는 응용 프로그램이 모든 심각도의 모든 메시지를 텍스트 파일에 기록하는 동시에, 에러 또는 그 이상을 콘솔에 기록하는 것이 유용 할 수 있습니다. 이렇게 설정하려면, 적절한 처리기를 구성하기만 하면 됩니다. 응용 프로그램 코드의 로깅 호출은 변경되지 않습니다. 다음은 앞의 간단한 모듈 기반 구성 예제를 약간 수정 한 것입니다:

@example
import logging

logger = logging.getLogger('simple_example')
logger.setLevel(logging.DEBUG)
# create file handler which logs even debug messages
fh = logging.FileHandler('spam.log')
fh.setLevel(logging.DEBUG)
# create console handler with a higher log level
ch = logging.StreamHandler()
ch.setLevel(logging.ERROR)
# create formatter and add it to the handlers
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
ch.setFormatter(formatter)
fh.setFormatter(formatter)
# add the handlers to logger
logger.addHandler(ch)
logger.addHandler(fh)

# 'application' code
logger.debug('debug message')
logger.info('info message')
logger.warning('warn message')
logger.error('error message')
logger.critical('critical message')
@end example

‘응용 프로그램’ 코드는 여러 처리기에 신경 쓰지 않습니다. 변경된 것은 `fh' 라는 새로운 처리기의 추가 및 구성뿐입니다.

중요도가 높거나 낮은 필터를 사용하여 새 처리기를 만드는 기능은 응용 프로그램을 작성하고 테스트할 때 매우 유용합니다. 디버깅을 위해 많은 @code{print} 문을 사용하는 대신에 @code{logger.debug} 를 사용하십시오: 나중에 삭제하거나 주석 처리해야 할 print 문과 달리, logger.debug 문은 소스 코드에서 그대로 유지될 수 있고, 그들을 다시 필요로 할 때까지 휴면 상태로 남아 있습니다. 그때, 필요한 유일한 변경은 로거 또는 처리기의 심각도 수준을 DEBUG로 수정하는 것입니다.

@node 여러 대상으로 로깅 하기,Custom handling of levels,다중 처리기 및 포매터,로깅 요리책
@anchor{howto/logging-cookbook logging-to-multiple-destinations}@anchor{57b5}@anchor{howto/logging-cookbook multiple-destinations}@anchor{57b6}
@subsection 여러 대상으로 로깅 하기


다른 메시지 포맷으로 다른 상황에서 콘솔과 파일에 기록하려고 한다고 가정 해 봅시다. DEBUG 이상 수준의 메시지를 파일에 기록하고, 수준 INFO 이상인 메시지를 콘솔에 기록하려고 한다고 가정 해보십시오. 또한, 타임스탬프가 파일에는 포함되어야 하지만, 콘솔 메시지에는 없어야 한다고 가정합시다. 이렇게 하면 됩니다:

@example
import logging

# set up logging to file - see previous section for more details
logging.basicConfig(level=logging.DEBUG,
                    format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s',
                    datefmt='%m-%d %H:%M',
                    filename='/tmp/myapp.log',
                    filemode='w')
# define a Handler which writes INFO messages or higher to the sys.stderr
console = logging.StreamHandler()
console.setLevel(logging.INFO)
# set a format which is simpler for console use
formatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s')
# tell the handler to use this format
console.setFormatter(formatter)
# add the handler to the root logger
logging.getLogger().addHandler(console)

# Now, we can log to the root logger, or any other logger. First the root...
logging.info('Jackdaws love my big sphinx of quartz.')

# Now, define a couple of other loggers which might represent areas in your
# application:

logger1 = logging.getLogger('myapp.area1')
logger2 = logging.getLogger('myapp.area2')

logger1.debug('Quick zephyrs blow, vexing daft Jim.')
logger1.info('How quickly daft jumping zebras vex.')
logger2.warning('Jail zesty vixen who grabbed pay from quack.')
logger2.error('The five boxing wizards jump quickly.')
@end example

실행하면 콘솔에는 다음과 같이 출력됩니다.

@example
root        : INFO     Jackdaws love my big sphinx of quartz.
myapp.area1 : INFO     How quickly daft jumping zebras vex.
myapp.area2 : WARNING  Jail zesty vixen who grabbed pay from quack.
myapp.area2 : ERROR    The five boxing wizards jump quickly.
@end example

파일에는 이렇게 기록됩니다.

@example
10-22 22:19 root         INFO     Jackdaws love my big sphinx of quartz.
10-22 22:19 myapp.area1  DEBUG    Quick zephyrs blow, vexing daft Jim.
10-22 22:19 myapp.area1  INFO     How quickly daft jumping zebras vex.
10-22 22:19 myapp.area2  WARNING  Jail zesty vixen who grabbed pay from quack.
10-22 22:19 myapp.area2  ERROR    The five boxing wizards jump quickly.
@end example

보시다시피 DEBUG 메시지는 파일에만 표시됩니다. 다른 메시지는 두 목적지로 전송됩니다.

이 예제는 콘솔과 파일 처리기를 사용하지만, 여러분이 선택하는 처리기의 수나 조합에 제약이 없습니다.

Note that the above choice of log filename @code{/tmp/myapp.log} implies use of a
standard location for temporary files on POSIX systems. On Windows, you may need to
choose a different directory name for the log - just ensure that the directory exists
and that you have the permissions to create and update files in it.

@node Custom handling of levels,구성 서버 예제,여러 대상으로 로깅 하기,로깅 요리책
@anchor{howto/logging-cookbook custom-handling-of-levels}@anchor{57b7}@anchor{howto/logging-cookbook custom-level-handling}@anchor{57b8}
@subsection Custom handling of levels


Sometimes, you might want to do something slightly different from the standard
handling of levels in handlers, where all levels above a threshold get
processed by a handler. To do this, you need to use filters. Let’s look at a
scenario where you want to arrange things as follows:


@itemize *

@item 
Send messages of severity @code{INFO} and @code{WARNING} to @code{sys.stdout}

@item 
Send messages of severity @code{ERROR} and above to @code{sys.stderr}

@item 
Send messages of severity @code{DEBUG} and above to file @code{app.log}
@end itemize

Suppose you configure logging with the following JSON:

@example
@{
    "version": 1,
    "disable_existing_loggers": false,
    "formatters": @{
        "simple": @{
            "format": "%(levelname)-8s - %(message)s"
        @}
    @},
    "handlers": @{
        "stdout": @{
            "class": "logging.StreamHandler",
            "level": "INFO",
            "formatter": "simple",
            "stream": "ext://sys.stdout"
        @},
        "stderr": @{
            "class": "logging.StreamHandler",
            "level": "ERROR",
            "formatter": "simple",
            "stream": "ext://sys.stderr"
        @},
        "file": @{
            "class": "logging.FileHandler",
            "formatter": "simple",
            "filename": "app.log",
            "mode": "w"
        @}
    @},
    "root": @{
        "level": "DEBUG",
        "handlers": [
            "stderr",
            "stdout",
            "file"
        ]
    @}
@}
@end example

This configuration does `almost' what we want, except that @code{sys.stdout} would show messages
of severity @code{ERROR} and only events of this severity and higher will be tracked
as well as @code{INFO} and @code{WARNING} messages. To prevent this, we can set up a filter which
excludes those messages and add it to the relevant handler. This can be configured by
adding a @code{filters} section parallel to @code{formatters} and @code{handlers}:

@example
@{
    "filters": @{
        "warnings_and_below": @{
            "()" : "__main__.filter_maker",
            "level": "WARNING"
        @}
    @}
@}
@end example

and changing the section on the @code{stdout} handler to add it:

@example
@{
    "stdout": @{
        "class": "logging.StreamHandler",
        "level": "INFO",
        "formatter": "simple",
        "stream": "ext://sys.stdout",
        "filters": ["warnings_and_below"]
    @}
@}
@end example

A filter is just a function, so we can define the @code{filter_maker} (a factory
function) as follows:

@example
def filter_maker(level):
    level = getattr(logging, level)

    def filter(record):
        return record.levelno <= level

    return filter
@end example

This converts the string argument passed in to a numeric level, and returns a
function which only returns @code{True} if the level of the passed in record is
at or below the specified level. Note that in this example I have defined the
@code{filter_maker} in a test script @code{main.py} that I run from the command line,
so its module will be @code{__main__} - hence the @code{__main__.filter_maker} in the
filter configuration. You will need to change that if you define it in a
different module.

With the filter added, we can run @code{main.py}, which in full is:

@example
import json
import logging
import logging.config

CONFIG = '@w{'}'
@{
    "version": 1,
    "disable_existing_loggers": false,
    "formatters": @{
        "simple": @{
            "format": "%(levelname)-8s - %(message)s"
        @}
    @},
    "filters": @{
        "warnings_and_below": @{
            "()" : "__main__.filter_maker",
            "level": "WARNING"
        @}
    @},
    "handlers": @{
        "stdout": @{
            "class": "logging.StreamHandler",
            "level": "INFO",
            "formatter": "simple",
            "stream": "ext://sys.stdout",
            "filters": ["warnings_and_below"]
        @},
        "stderr": @{
            "class": "logging.StreamHandler",
            "level": "ERROR",
            "formatter": "simple",
            "stream": "ext://sys.stderr"
        @},
        "file": @{
            "class": "logging.FileHandler",
            "formatter": "simple",
            "filename": "app.log",
            "mode": "w"
        @}
    @},
    "root": @{
        "level": "DEBUG",
        "handlers": [
            "stderr",
            "stdout",
            "file"
        ]
    @}
@}
'@w{'}'

def filter_maker(level):
    level = getattr(logging, level)

    def filter(record):
        return record.levelno <= level

    return filter

logging.config.dictConfig(json.loads(CONFIG))
logging.debug('A DEBUG message')
logging.info('An INFO message')
logging.warning('A WARNING message')
logging.error('An ERROR message')
logging.critical('A CRITICAL message')
@end example

And after running it like this:

@example
python main.py 2>stderr.log >stdout.log
@end example

We can see the results are as expected:

@example
$ more *.log
::::::::::::::
app.log
::::::::::::::
DEBUG    - A DEBUG message
INFO     - An INFO message
WARNING  - A WARNING message
ERROR    - An ERROR message
CRITICAL - A CRITICAL message
::::::::::::::
stderr.log
::::::::::::::
ERROR    - An ERROR message
CRITICAL - A CRITICAL message
::::::::::::::
stdout.log
::::::::::::::
INFO     - An INFO message
WARNING  - A WARNING message
@end example

@node 구성 서버 예제,블록 하는 처리기 다루기,Custom handling of levels,로깅 요리책
@anchor{howto/logging-cookbook configuration-server-example}@anchor{57b9}
@subsection 구성 서버 예제


다음은 로깅 구성 서버를 사용하는 모듈의 예입니다:

@example
import logging
import logging.config
import time
import os

# read initial config file
logging.config.fileConfig('logging.conf')

# create and start listener on port 9999
t = logging.config.listen(9999)
t.start()

logger = logging.getLogger('simpleExample')

try:
    # loop through logging calls to see the difference
    # new configurations make, until Ctrl+C is pressed
    while True:
        logger.debug('debug message')
        logger.info('info message')
        logger.warning('warn message')
        logger.error('error message')
        logger.critical('critical message')
        time.sleep(5)
except KeyboardInterrupt:
    # cleanup
    logging.config.stopListening()
    t.join()
@end example

다음은 파일 이름을 받아서, 그 파일을 새 로깅 구성으로 (이진 인코딩된 길이를 적절하게 앞에 붙여서) 서버로 보내는 스크립트입니다:

@example
#!/usr/bin/env python
import socket, sys, struct

with open(sys.argv[1], 'rb') as f:
    data_to_send = f.read()

HOST = 'localhost'
PORT = 9999
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print('connecting...')
s.connect((HOST, PORT))
print('sending config...')
s.send(struct.pack('>L', len(data_to_send)))
s.send(data_to_send)
s.close()
print('complete')
@end example

@node 블록 하는 처리기 다루기,네트워크에서 로깅 이벤트 보내고 받기,구성 서버 예제,로깅 요리책
@anchor{howto/logging-cookbook blocking-handlers}@anchor{396f}@anchor{howto/logging-cookbook dealing-with-handlers-that-block}@anchor{57ba}
@subsection 블록 하는 처리기 다루기


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.

흔히 느린 행동을 보이는 범인은 @ref{18b3,,SMTPHandler} 입니다: 개발자의 통제 밖에 있는 여러 가지 이유로, 전자 우편을 보내는 데 오랜 시간이 걸릴 수 있습니다 (예를 들어, 잘 동작하지 않는 메일 또는 네트워크 인프라). 그러나 거의 모든 네트워크 기반 처리기는 블록 할 수 있습니다. @ref{1161,,SocketHandler} 작업도 너무 느린 DNS 질의를 이면에서 수행 할 수 있습니다 (그리고 이 질의는 여러분의 통제 밖에 있는, 파이썬 계층 아래의 소켓 라이브러리 코드 깊숙이 있을 수 있습니다).

한 가지 해결책은 두 부분으로 된 접근법을 사용하는 것입니다. 첫 번째 부분에서는, 성능이 중요한 스레드에서 액세스하는 로거에 @ref{1b5f,,QueueHandler} 만 붙입니다. 그들은 단순히 큐에 씁니다. 충분한 용량으로 큐의 크기를 조정하거나, 크기의 상한이 없도록 초기화 할 수 있습니다. 큐에 대한 쓰기는 일반적으로 신속하게 받아들여지지만, 코드에서 예방책으로 @ref{369e,,queue.Full} 예외를 잡아야 할 것입니다. 코드에 성능이 중요한 스레드가 있는 라이브러리 개발자인 경우, 코드를 사용할 다른 개발자의 이익을 위해 이것을 (여러분의 로거에 @code{QueueHandlers} 만 붙이라는 제안과 함께) 문서로 만들어야 합니다.

해결책의 두 번째 부분은 @ref{242,,QueueListener}며, 이는 @ref{1b5f,,QueueHandler} 에 상응하여 설계되었습니다. @code{QueueListener} 는 매우 간단합니다: 큐와 처리기를 넘겨주면 @code{QueueHandlers} (또는 @code{LogRecords} 의 다른 소스)에서 보낸 LogRecord를 큐에서 수신하는 내부 스레드를 시작합니다. @code{LogRecords} 는 큐에서 제거되고 처리를 위해 처리기로 전달됩니다.

별도의 @ref{242,,QueueListener} 클래스를 사용하면 같은 인스턴스를 사용하여 여러 개의 @code{QueueHandlers} 를 처리할 수 있다는 장점이 있습니다. 이것은 특별한 이점 없이 처리기당 하나의 스레드를 먹게 되는 기존의 처리기 클래스의 스레드 버전을 만드는 것보다 자원 친화적입니다.

이 두 클래스를 사용하는 예제는 다음과 같습니다 (임포트 생략):

@example
que = queue.Queue(-1)  # no limit on size
queue_handler = QueueHandler(que)
handler = logging.StreamHandler()
listener = QueueListener(que, handler)
root = logging.getLogger()
root.addHandler(queue_handler)
formatter = logging.Formatter('%(threadName)s: %(message)s')
handler.setFormatter(formatter)
listener.start()
# The log output will display the thread which generated
# the event (the main thread) rather than the internal
# thread which monitors the internal queue. This is what
# you want to happen.
root.warning('Look out!')
listener.stop()
@end example

실행하면, 다음과 같은 결과를 만듭니다:

@example
MainThread: Look out!
@end example

@cartouche
@quotation 참고 
Although the earlier discussion wasn’t specifically talking about
async code, but rather about slow logging handlers, it should be noted that
when logging from async code, network and even file handlers could lead to
problems (blocking the event loop) because some logging is done from
@ref{b,,asyncio} internals. It might be best, if any async code is used in an
application, to use the above approach for logging, so that any blocking code
runs only in the @code{QueueListener} thread.
@end quotation
@end cartouche


버전 3.5에서 변경: 파이썬 3.5 이전 버전에서는, @ref{242,,QueueListener} 는 항상 큐에서 받은 모든 메시지를 초기화될 때 제공된 모든 처리기로 전달했습니다. (이것은 큐가 채워질 때 수준 필터링이 모두 반대편에서 행해졌다고 가정했기 때문입니다.) 3.5 이후부터, 이 동작은 키워드 인자 @code{respect_handler_level=True} 를 리스너의 생성자에 전달함으로써 변경될 수 있습니다. 이렇게 할 때, 리스너는 각 메시지의 수준을 처리기의 수준과 비교하여, 적절한 메시지만 처리기에 전달되도록 합니다.



버전 3.14에서 변경: The @ref{242,,QueueListener} can be started (and stopped) via the
@ref{186,,with} statement. For example:

@example
with QueueListener(que, handler) as listener:
    # The queue listener automatically starts
    # when the 'with' block is entered.
    pass
# The queue listener automatically stops once
# the 'with' block is exited.
@end example


@node 네트워크에서 로깅 이벤트 보내고 받기,로그 출력에 문맥 정보 추가,블록 하는 처리기 다루기,로깅 요리책
@anchor{howto/logging-cookbook network-logging}@anchor{57bb}@anchor{howto/logging-cookbook sending-and-receiving-logging-events-across-a-network}@anchor{57bc}
@subsection 네트워크에서 로깅 이벤트 보내고 받기


네트워크를 통해 로깅 이벤트를 보내고, 받는 쪽에서 처리하려고 한다고 합시다. 이렇게 하는 간단한 방법은 @ref{1161,,SocketHandler} 인스턴스를 보내는 쪽의 루트 로거에 연결하는 것입니다:

@example
import logging, logging.handlers

rootLogger = logging.getLogger()
rootLogger.setLevel(logging.DEBUG)
socketHandler = logging.handlers.SocketHandler('localhost',
                    logging.handlers.DEFAULT_TCP_LOGGING_PORT)
# don't bother with a formatter, since a socket handler sends the event as
# an unformatted pickle
rootLogger.addHandler(socketHandler)

# Now, we can log to the root logger, or any other logger. First the root...
logging.info('Jackdaws love my big sphinx of quartz.')

# Now, define a couple of other loggers which might represent areas in your
# application:

logger1 = logging.getLogger('myapp.area1')
logger2 = logging.getLogger('myapp.area2')

logger1.debug('Quick zephyrs blow, vexing daft Jim.')
logger1.info('How quickly daft jumping zebras vex.')
logger2.warning('Jail zesty vixen who grabbed pay from quack.')
logger2.error('The five boxing wizards jump quickly.')
@end example

수신 측에서는 @ref{d2,,socketserver} 모듈을 사용하여 수신기를 구성할 수 있습니다. 기본적인 작업 예제는 다음과 같습니다:

@example
import pickle
import logging
import logging.handlers
import socketserver
import struct


class LogRecordStreamHandler(socketserver.StreamRequestHandler):
    """Handler for a streaming logging request.

    This basically logs the record using whatever logging policy is
    configured locally.
    """

    def handle(self):
        """
        Handle multiple requests - each expected to be a 4-byte length,
        followed by the LogRecord in pickle format. Logs the record
        according to whatever policy is configured locally.
        """
        while True:
            chunk = self.connection.recv(4)
            if len(chunk) < 4:
                break
            slen = struct.unpack('>L', chunk)[0]
            chunk = self.connection.recv(slen)
            while len(chunk) < slen:
                chunk = chunk + self.connection.recv(slen - len(chunk))
            obj = self.unPickle(chunk)
            record = logging.makeLogRecord(obj)
            self.handleLogRecord(record)

    def unPickle(self, data):
        return pickle.loads(data)

    def handleLogRecord(self, record):
        # if a name is specified, we use the named logger rather than the one
        # implied by the record.
        if self.server.logname is not None:
            name = self.server.logname
        else:
            name = record.name
        logger = logging.getLogger(name)
        # N.B. EVERY record gets logged. This is because Logger.handle
        # is normally called AFTER logger-level filtering. If you want
        # to do filtering, do it at the client end to save wasting
        # cycles and network bandwidth!
        logger.handle(record)

class LogRecordSocketReceiver(socketserver.ThreadingTCPServer):
    """
    Simple TCP socket-based logging receiver suitable for testing.
    """

    allow_reuse_address = True

    def __init__(self, host='localhost',
                 port=logging.handlers.DEFAULT_TCP_LOGGING_PORT,
                 handler=LogRecordStreamHandler):
        socketserver.ThreadingTCPServer.__init__(self, (host, port), handler)
        self.abort = 0
        self.timeout = 1
        self.logname = None

    def serve_until_stopped(self):
        import select
        abort = 0
        while not abort:
            rd, wr, ex = select.select([self.socket.fileno()],
                                       [], [],
                                       self.timeout)
            if rd:
                self.handle_request()
            abort = self.abort

def main():
    logging.basicConfig(
        format='%(relativeCreated)5d %(name)-15s %(levelname)-8s %(message)s')
    tcpserver = LogRecordSocketReceiver()
    print('About to start TCP server...')
    tcpserver.serve_until_stopped()

if __name__ == '__main__':
    main()
@end example

먼저 서버를 실행한 다음 클라이언트를 실행합니다. 클라이언트 쪽에서는 콘솔에 아무것도 인쇄되지 않습니다. 서버 측에서 다음과 같은 내용이 보여야 합니다.:

@example
About to start TCP server...
   59 root            INFO     Jackdaws love my big sphinx of quartz.
   59 myapp.area1     DEBUG    Quick zephyrs blow, vexing daft Jim.
   69 myapp.area1     INFO     How quickly daft jumping zebras vex.
   69 myapp.area2     WARNING  Jail zesty vixen who grabbed pay from quack.
   69 myapp.area2     ERROR    The five boxing wizards jump quickly.
@end example

Note that there are some security issues with pickle in some scenarios. If
these affect you, you can use an alternative serialization scheme by overriding
the @ref{321d,,makePickle()} method and implementing your
alternative there, as well as adapting the above script to use your alternative
serialization.

@menu
* Running a logging socket listener in production:: 

@end menu

@node Running a logging socket listener in production,,,네트워크에서 로깅 이벤트 보내고 받기
@anchor{howto/logging-cookbook running-a-logging-socket-listener-in-production}@anchor{57bd}
@subsubsection Running a logging socket listener in production


To run a logging listener in production, you may need to use a
process-management tool such as Supervisor@footnote{http://supervisord.org/}.
Here is a Gist@footnote{https://gist.github.com/vsajip/4b227eeec43817465ca835ca66f75e2b}
which provides the bare-bones files to run the above functionality using
Supervisor. It consists of the following files:


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

File

@tab

Purpose

@item

@code{prepare.sh}

@tab

A Bash script to prepare the environment for
testing

@item

@code{supervisor.conf}

@tab

The Supervisor configuration file, which has
entries for the listener and a multi-process web
application

@item

@code{ensure_app.sh}

@tab

A Bash script to ensure that Supervisor is running
with the above configuration

@item

@code{log_listener.py}

@tab

The socket listener program which receives log
events and records them to a file

@item

@code{main.py}

@tab

A simple web application which performs logging
via a socket connected to the listener

@item

@code{webapp.json}

@tab

A JSON configuration file for the web application

@item

@code{client.py}

@tab

A Python script to exercise the web application

@end multitable


The web application uses Gunicorn@footnote{https://gunicorn.org/}, which is a
popular web application server that starts multiple worker processes to handle
requests. This example setup shows how the workers can write to the same log file
without conflicting with one another — they all go through the socket listener.

To test these files, do the following in a POSIX environment:


@enumerate 

@item 
Download the Gist@footnote{https://gist.github.com/vsajip/4b227eeec43817465ca835ca66f75e2b}
as a ZIP archive using the Download ZIP button.

@item 
Unzip the above files from the archive into a scratch directory.

@item 
In the scratch directory, run @code{bash prepare.sh} to get things ready.
This creates a @code{run} subdirectory to contain Supervisor-related and
log files, and a @code{venv} subdirectory to contain a virtual environment
into which @code{bottle}, @code{gunicorn} and @code{supervisor} are installed.

@item 
Run @code{bash ensure_app.sh} to ensure that Supervisor is running with
the above configuration.

@item 
Run @code{venv/bin/python client.py} to exercise the web application,
which will lead to records being written to the log.

@item 
Inspect the log files in the @code{run} subdirectory. You should see the
most recent log lines in files matching the pattern @code{app.log*}. They
won’t be in any particular order, since they have been handled concurrently
by different worker processes in a non-deterministic way.

@item 
You can shut down the listener and the web application by running
@code{venv/bin/supervisorctl -c supervisor.conf shutdown}.
@end enumerate

You may need to tweak the configuration files in the unlikely event that the
configured ports clash with something else in your test environment.

The default configuration uses a TCP socket on port 9020. You can use a Unix
Domain socket instead of a TCP socket by doing the following:


@enumerate 

@item 
In @code{listener.json}, add a @code{socket} key with the path to the domain
socket you want to use. If this key is present, the listener listens on the
corresponding domain socket and not on a TCP socket (the @code{port} key is
ignored).

@item 
In @code{webapp.json}, change the socket handler configuration dictionary
so that the @code{host} value is the path to the domain socket, and set the
@code{port} value to @code{null}.
@end enumerate

@node 로그 출력에 문맥 정보 추가,Use of contextvars,네트워크에서 로깅 이벤트 보내고 받기,로깅 요리책
@anchor{howto/logging-cookbook adding-contextual-information-to-your-logging-output}@anchor{57be}@anchor{howto/logging-cookbook context-info}@anchor{31ba}
@subsection 로그 출력에 문맥 정보 추가


로깅 호출에 전달된 매개 변수 외에도 로깅 출력에 문맥 정보가 포함되기 원하는 경우가 있습니다. 예를 들어, 네트워크 응용 프로그램에서, (원격 클라이언트의 사용자 이름 또는 IP 주소와 같은) 클라이언트별 정보를 로그에 기록하는 것이 바람직 할 수 있습니다. 이를 달성하기 위해 `extra' 매개 변수를 사용할 수는 있지만, 이러한 방식으로 정보를 전달하는 것이 항상 편리하지는 않습니다. 연결마다 @ref{d45,,Logger} 인스턴스를 만들고 싶을지 모르지만, 이러한 인스턴스는 가비지 수집되지 않기 때문에 좋지 않습니다. @code{Logger} 인스턴스의 수가 응용 프로그램 로깅에 사용하고자 하는 세분성 수준에 의존적일 때 이것이 실제로 문제가 되지는 않지만, @code{Logger} 인스턴스의 수가 실질적으로 무제한이 되면 관리하기 어려울 수 있습니다.

@menu
* 문맥 정보 전달에 LoggerAdapters 사용하기:: 
* 문맥 정보 전달에 필터 사용하기:: 

@end menu

@node 문맥 정보 전달에 LoggerAdapters 사용하기,문맥 정보 전달에 필터 사용하기,,로그 출력에 문맥 정보 추가
@anchor{howto/logging-cookbook using-loggeradapters-to-impart-contextual-information}@anchor{57bf}
@subsubsection 문맥 정보 전달에 LoggerAdapters 사용하기


로깅 이벤트 정보와 함께 출력되는 문맥 정보를 전달하는 쉬운 방법은 @ref{14fa,,LoggerAdapter} 클래스를 사용하는 것입니다. 이 클래스는 @ref{d45,,Logger}처럼 보이도록 설계되어 있어서, @ref{3185,,debug()}, @ref{31ae,,info()}, @ref{354,,warning()}, @ref{31c2,,error()}, @ref{1699,,exception()}, @ref{31c3,,critical()} 및 @ref{31c4,,log()}를 호출할 수 있습니다. 이 메서드들은 @code{Logger} 에 있는 것과 똑같은 서명을 가지므로, 두 형의 인스턴스를 같은 의미로 사용할 수 있습니다.

@ref{14fa,,LoggerAdapter} 의 인스턴스를 생성할 때, @ref{d45,,Logger} 인스턴스와 문맥 정보가 포함된 딕셔너리류 객체를 전달합니다. @code{LoggerAdapter} 의 인스턴스에서 로깅 메서드 중 하나를 호출하면, 생성자에 전달된 하위 @code{Logger} 인스턴스에 호출을 위임하고, 이 호출에 문맥 정보를 전달하도록 배치합니다. 다음은 @code{LoggerAdapter} 코드에서 발췌한 내용입니다:

@example
def debug(self, msg, /, *args, **kwargs):
    """
    Delegate a debug call to the underlying logger, after adding
    contextual information from this adapter instance.
    """
    msg, kwargs = self.process(msg, kwargs)
    self.logger.debug(msg, *args, **kwargs)
@end example

@ref{14fa,,LoggerAdapter} 의 @ref{31bb,,process()} 메서드는 문맥 정보가 로그 출력에 추가되는 곳입니다. 로깅 호출의 메시지 및 키워드 인자를 받아서, 하부 로거에 대한 호출에서 사용될 (대체로) 수정된 버전을 돌려줍니다. 이 메서드의 기본 구현은 메시지는 그대로 두고, 키워드 인자에 생성자로 전달된 딕셔너리류 객체를 값으로 갖는 ‘extra’ 키를 삽입합니다. 물론, 어댑터에 대한 호출에서 ‘extra’ 키워드 인자를 전달한 경우 자동으로 덮어씁니다.

‘extra’를 사용하는 장점은, 딕셔너리류 객체에 들어있는 값이 @ref{11e5,,LogRecord} 인스턴스의 __dict__에 병합되어, 키에 대해 알고 있는 @ref{169c,,Formatter} 인스턴스로 사용자 정의된 문자열을 사용할 수 있게 된다는 것입니다. 다른 방법이 필요한 경우, 가령 메시지 문자열의 앞이나 뒤에 문맥 정보를 덧붙이려는 경우, @ref{14fa,,LoggerAdapter} 의 서브 클래스를 만들고, 필요한 작업을 수행하기 위해 @ref{31bb,,process()} 를 재정의해야 합니다. 다음은 간단한 예제입니다:

@example
class CustomAdapter(logging.LoggerAdapter):
    """
    This example adapter expects the passed in dict-like object to have a
    'connid' key, whose value in brackets is prepended to the log message.
    """
    def process(self, msg, kwargs):
        return '[%s] %s' % (self.extra['connid'], msg), kwargs
@end example

이런 식으로 사용할 수 있습니다:

@example
logger = logging.getLogger(__name__)
adapter = CustomAdapter(logger, @{'connid': some_conn_id@})
@end example

그러면 어댑터에 로그 하는 모든 이벤트는 로그 메시지 앞에 @code{some_conn_id} 값이 붙습니다.

@menu
* 딕셔너리 이외의 객체를 사용하여 문맥 정보 전달하기:: 

@end menu

@node 딕셔너리 이외의 객체를 사용하여 문맥 정보 전달하기,,,문맥 정보 전달에 LoggerAdapters 사용하기
@anchor{howto/logging-cookbook using-objects-other-than-dicts-to-pass-contextual-information}@anchor{57c0}
@subsubsection 딕셔너리 이외의 객체를 사용하여 문맥 정보 전달하기


실제 딕셔너리를 @ref{14fa,,LoggerAdapter} 에 전달할 필요는 없습니다 - 로깅에 딕셔너리처럼 보일 수 있도록, @code{__getitem__} 과 @code{__iter__} 를 구현하는 클래스의 인스턴스를 전달할 수 있습니다. 값을 동적으로 생성하려는 경우 (반면에 딕셔너리에 들어있는 값은 바뀌지 않습니다) 유용합니다.

@node 문맥 정보 전달에 필터 사용하기,,문맥 정보 전달에 LoggerAdapters 사용하기,로그 출력에 문맥 정보 추가
@anchor{howto/logging-cookbook filters-contextual}@anchor{31af}@anchor{howto/logging-cookbook using-filters-to-impart-contextual-information}@anchor{57c1}
@subsubsection 문맥 정보 전달에 필터 사용하기


사용자 정의 @ref{1400,,Filter}를 사용하여 로그 출력에 문맥 정보를 추가할 수도 있습니다. @code{Filter} 인스턴스는 전달된 @code{LogRecords} 를 수정할 수 있는데, 어트리뷰트를 추가해서 적절한 포맷 문자열이나 필요하다면 사용자 정의 @ref{169c,,Formatter}를 사용해서 출력되도록 할 수 있습니다.

예를 들어 웹 응용 프로그램에서, 처리 중인 요청(또는 적어도 그것의 흥미로운 부분)을 스레드 로컬 (@ref{1862,,threading.local}) 변수에 저장한 다음, @code{Filter} 에서 액세스해서, 요청에서 온 정보를 - 원격 IP 주소와 원격 사용자의 사용자 이름이라고 합시다 - 위의 @code{LoggerAdapter} 예제에서와같이 어트리뷰트 이름 ‘ip’와 ‘user’를 사용하여 @code{LogRecord} 에 추가할 수 있습니다. 이 경우 같은 포맷 문자열을 사용하여 위에 표시된 것과 비슷한 출력을 얻을 수 있습니다. 다음은 스크립트 예입니다:

@example
import logging
from random import choice

class ContextFilter(logging.Filter):
    """
    This is a filter which injects contextual information into the log.

    Rather than use actual contextual information, we just use random
    data in this demo.
    """

    USERS = ['jim', 'fred', 'sheila']
    IPS = ['123.231.231.123', '127.0.0.1', '192.168.0.1']

    def filter(self, record):

        record.ip = choice(ContextFilter.IPS)
        record.user = choice(ContextFilter.USERS)
        return True

if __name__ == '__main__':
    levels = (logging.DEBUG, logging.INFO, logging.WARNING, logging.ERROR, logging.CRITICAL)
    logging.basicConfig(level=logging.DEBUG,
                        format='%(asctime)-15s %(name)-5s %(levelname)-8s IP: %(ip)-15s User: %(user)-8s %(message)s')
    a1 = logging.getLogger('a.b.c')
    a2 = logging.getLogger('d.e.f')

    f = ContextFilter()
    a1.addFilter(f)
    a2.addFilter(f)
    a1.debug('A debug message')
    a1.info('An info message with %s', 'some parameters')
    for x in range(10):
        lvl = choice(levels)
        lvlname = logging.getLevelName(lvl)
        a2.log(lvl, 'A message at %s level with %d %s', lvlname, 2, 'parameters')
@end example

실행하면 다음과 같은 결과가 나옵니다:

@example
2010-09-06 22:38:15,292 a.b.c DEBUG    IP: 123.231.231.123 User: fred     A debug message
2010-09-06 22:38:15,300 a.b.c INFO     IP: 192.168.0.1     User: sheila   An info message with some parameters
2010-09-06 22:38:15,300 d.e.f CRITICAL IP: 127.0.0.1       User: sheila   A message at CRITICAL level with 2 parameters
2010-09-06 22:38:15,300 d.e.f ERROR    IP: 127.0.0.1       User: jim      A message at ERROR level with 2 parameters
2010-09-06 22:38:15,300 d.e.f DEBUG    IP: 127.0.0.1       User: sheila   A message at DEBUG level with 2 parameters
2010-09-06 22:38:15,300 d.e.f ERROR    IP: 123.231.231.123 User: fred     A message at ERROR level with 2 parameters
2010-09-06 22:38:15,300 d.e.f CRITICAL IP: 192.168.0.1     User: jim      A message at CRITICAL level with 2 parameters
2010-09-06 22:38:15,300 d.e.f CRITICAL IP: 127.0.0.1       User: sheila   A message at CRITICAL level with 2 parameters
2010-09-06 22:38:15,300 d.e.f DEBUG    IP: 192.168.0.1     User: jim      A message at DEBUG level with 2 parameters
2010-09-06 22:38:15,301 d.e.f ERROR    IP: 127.0.0.1       User: sheila   A message at ERROR level with 2 parameters
2010-09-06 22:38:15,301 d.e.f DEBUG    IP: 123.231.231.123 User: fred     A message at DEBUG level with 2 parameters
2010-09-06 22:38:15,301 d.e.f INFO     IP: 123.231.231.123 User: fred     A message at INFO level with 2 parameters
@end example

@node Use of contextvars,Imparting contextual information in handlers,로그 출력에 문맥 정보 추가,로깅 요리책
@anchor{howto/logging-cookbook use-of-contextvars}@anchor{57c2}
@subsection Use of @code{contextvars}


Since Python 3.7, the @ref{28,,contextvars} module has provided context-local storage
which works for both @ref{f3,,threading} and @ref{b,,asyncio} processing needs. This type
of storage may thus be generally preferable to thread-locals. The following example
shows how, in a multi-threaded environment, logs can populated with contextual
information such as, for example, request attributes handled by web applications.

For the purposes of illustration, say that you have different web applications, each
independent of the other but running in the same Python process and using a library
common to them. How can each of these applications have their own log, where all
logging messages from the library (and other request processing code) are directed to
the appropriate application’s log file, while including in the log additional
contextual information such as client IP, HTTP request method and client username?

Let’s assume that the library can be simulated by the following code:

@example
# webapplib.py
import logging
import time

logger = logging.getLogger(__name__)

def useful():
    # Just a representative event logged from the library
    logger.debug('Hello from webapplib!')
    # Just sleep for a bit so other threads get to run
    time.sleep(0.01)
@end example

We can simulate the multiple web applications by means of two simple classes,
@code{Request} and @code{WebApp}. These simulate how real threaded web applications work -
each request is handled by a thread:

@example
# main.py
import argparse
from contextvars import ContextVar
import logging
import os
from random import choice
import threading
import webapplib

logger = logging.getLogger(__name__)
root = logging.getLogger()
root.setLevel(logging.DEBUG)

class Request:
    """
    A simple dummy request class which just holds dummy HTTP request method,
    client IP address and client username
    """
    def __init__(self, method, ip, user):
        self.method = method
        self.ip = ip
        self.user = user

# A dummy set of requests which will be used in the simulation - we'll just pick
# from this list randomly. Note that all GET requests are from 192.168.2.XXX
# addresses, whereas POST requests are from 192.16.3.XXX addresses. Three users
# are represented in the sample requests.

REQUESTS = [
    Request('GET', '192.168.2.20', 'jim'),
    Request('POST', '192.168.3.20', 'fred'),
    Request('GET', '192.168.2.21', 'sheila'),
    Request('POST', '192.168.3.21', 'jim'),
    Request('GET', '192.168.2.22', 'fred'),
    Request('POST', '192.168.3.22', 'sheila'),
]

# Note that the format string includes references to request context information
# such as HTTP method, client IP and username

formatter = logging.Formatter('%(threadName)-11s %(appName)s %(name)-9s %(user)-6s %(ip)s %(method)-4s %(message)s')

# Create our context variables. These will be filled at the start of request
# processing, and used in the logging that happens during that processing

ctx_request = ContextVar('request')
ctx_appname = ContextVar('appname')

class InjectingFilter(logging.Filter):
    """
    A filter which injects context-specific information into logs and ensures
    that only information for a specific webapp is included in its log
    """
    def __init__(self, app):
        self.app = app

    def filter(self, record):
        request = ctx_request.get()
        record.method = request.method
        record.ip = request.ip
        record.user = request.user
        record.appName = appName = ctx_appname.get()
        return appName == self.app.name

class WebApp:
    """
    A dummy web application class which has its own handler and filter for a
    webapp-specific log.
    """
    def __init__(self, name):
        self.name = name
        handler = logging.FileHandler(name + '.log', 'w')
        f = InjectingFilter(self)
        handler.setFormatter(formatter)
        handler.addFilter(f)
        root.addHandler(handler)
        self.num_requests = 0

    def process_request(self, request):
        """
        This is the dummy method for processing a request. It's called on a
        different thread for every request. We store the context information into
        the context vars before doing anything else.
        """
        ctx_request.set(request)
        ctx_appname.set(self.name)
        self.num_requests += 1
        logger.debug('Request processing started')
        webapplib.useful()
        logger.debug('Request processing finished')

def main():
    fn = os.path.splitext(os.path.basename(__file__))[0]
    adhf = argparse.ArgumentDefaultsHelpFormatter
    ap = argparse.ArgumentParser(formatter_class=adhf, prog=fn,
                                 description='Simulate a couple of web '
                                             'applications handling some '
                                             'requests, showing how request '
                                             'context can be used to '
                                             'populate logs')
    aa = ap.add_argument
    aa('--count', '-c', type=int, default=100, help='How many requests to simulate')
    options = ap.parse_args()

    # Create the dummy webapps and put them in a list which we can use to select
    # from randomly
    app1 = WebApp('app1')
    app2 = WebApp('app2')
    apps = [app1, app2]
    threads = []
    # Add a common handler which will capture all events
    handler = logging.FileHandler('app.log', 'w')
    handler.setFormatter(formatter)
    root.addHandler(handler)

    # Generate calls to process requests
    for i in range(options.count):
        try:
            # Pick an app at random and a request for it to process
            app = choice(apps)
            request = choice(REQUESTS)
            # Process the request in its own thread
            t = threading.Thread(target=app.process_request, args=(request,))
            threads.append(t)
            t.start()
        except KeyboardInterrupt:
            break

    # Wait for the threads to terminate
    for t in threads:
        t.join()

    for app in apps:
        print('%s processed %s requests' % (app.name, app.num_requests))

if __name__ == '__main__':
    main()
@end example

If you run the above, you should find that roughly half the requests go
into @code{app1.log} and the rest into @code{app2.log}, and the all the requests are
logged to @code{app.log}. Each webapp-specific log will contain only log entries for
only that webapp, and the request information will be displayed consistently in the
log (i.e. the information in each dummy request will always appear together in a log
line). This is illustrated by the following shell output:

@example
~/logging-contextual-webapp$ python main.py
app1 processed 51 requests
app2 processed 49 requests
~/logging-contextual-webapp$ wc -l *.log
  153 app1.log
  147 app2.log
  300 app.log
  600 total
~/logging-contextual-webapp$ head -3 app1.log
Thread-3 (process_request) app1 __main__  jim    192.168.3.21 POST Request processing started
Thread-3 (process_request) app1 webapplib jim    192.168.3.21 POST Hello from webapplib!
Thread-5 (process_request) app1 __main__  jim    192.168.3.21 POST Request processing started
~/logging-contextual-webapp$ head -3 app2.log
Thread-1 (process_request) app2 __main__  sheila 192.168.2.21 GET  Request processing started
Thread-1 (process_request) app2 webapplib sheila 192.168.2.21 GET  Hello from webapplib!
Thread-2 (process_request) app2 __main__  jim    192.168.2.20 GET  Request processing started
~/logging-contextual-webapp$ head app.log
Thread-1 (process_request) app2 __main__  sheila 192.168.2.21 GET  Request processing started
Thread-1 (process_request) app2 webapplib sheila 192.168.2.21 GET  Hello from webapplib!
Thread-2 (process_request) app2 __main__  jim    192.168.2.20 GET  Request processing started
Thread-3 (process_request) app1 __main__  jim    192.168.3.21 POST Request processing started
Thread-2 (process_request) app2 webapplib jim    192.168.2.20 GET  Hello from webapplib!
Thread-3 (process_request) app1 webapplib jim    192.168.3.21 POST Hello from webapplib!
Thread-4 (process_request) app2 __main__  fred   192.168.2.22 GET  Request processing started
Thread-5 (process_request) app1 __main__  jim    192.168.3.21 POST Request processing started
Thread-4 (process_request) app2 webapplib fred   192.168.2.22 GET  Hello from webapplib!
Thread-6 (process_request) app1 __main__  jim    192.168.3.21 POST Request processing started
~/logging-contextual-webapp$ grep app1 app1.log | wc -l
153
~/logging-contextual-webapp$ grep app2 app2.log | wc -l
147
~/logging-contextual-webapp$ grep app1 app.log | wc -l
153
~/logging-contextual-webapp$ grep app2 app.log | wc -l
147
@end example

@node Imparting contextual information in handlers,여러 프로세스에서 단일 파일에 로깅 하기,Use of contextvars,로깅 요리책
@anchor{howto/logging-cookbook imparting-contextual-information-in-handlers}@anchor{57c3}
@subsection Imparting contextual information in handlers


Each @ref{169b,,Handler} has its own chain of filters.
If you want to add contextual information to a @ref{11e5,,LogRecord} without leaking
it to other handlers, you can use a filter that returns
a new @code{LogRecord} instead of modifying it in-place, as shown in the following script:

@example
import copy
import logging

def filter(record: logging.LogRecord):
    record = copy.copy(record)
    record.user = 'jim'
    return record

if __name__ == '__main__':
    logger = logging.getLogger()
    logger.setLevel(logging.INFO)
    handler = logging.StreamHandler()
    formatter = logging.Formatter('%(message)s from %(user)-8s')
    handler.setFormatter(formatter)
    handler.addFilter(filter)
    logger.addHandler(handler)

    logger.info('A log message')
@end example

@node 여러 프로세스에서 단일 파일에 로깅 하기,파일 회전 사용하기,Imparting contextual information in handlers,로깅 요리책
@anchor{howto/logging-cookbook logging-to-a-single-file-from-multiple-processes}@anchor{57c4}@anchor{howto/logging-cookbook multiple-processes}@anchor{57c5}
@subsection 여러 프로세스에서 단일 파일에 로깅 하기


logging 이 스레드-안전하고, 단일 프로세스의 여러 스레드에서 단일 파일로 로깅 하는 것이 `지원되지만', 파이썬에서 여러 프로세스가 단일 파일에 액세스하는 것을 직렬화하는 표준적인 방법이 없으므로, `여러 프로세스'에서 단일 파일로 로깅 하는 것은 지원되지 `않습니다'. 여러 프로세스에서 하나의 파일에 로그 해야 하는 경우, 이 작업을 수행하는 한 가지 방법은 모든 프로세스가 로그를 @ref{1161,,SocketHandler} 에 기록하고, 소켓에서 읽어서 파일로 로그 하는 소켓 서버를 구현하는 별도의 프로세스를 사용하는 것입니다. (원한다면, 기존 프로세스 중 하나에서 한 스레드가 이 기능을 전담하도록 할 수 있습니다.) @ref{57bb,,이 섹션}에서 이 접근법을 더 자세하게 설명하고, 여러분의 응용 프로그램에 적용하기 위한 출발점으로 사용할 수 있는 작동하는 소켓 수신기를 제공합니다.

You could also write your own handler which uses the @ref{1856,,Lock}
class from the @ref{98,,multiprocessing} module to serialize access to the
file from your processes. The stdlib @ref{1c51,,FileHandler} and subclasses do
not make use of @code{multiprocessing}.

또는, @code{Queue} 와 @ref{1b5f,,QueueHandler} 를 사용하여, 모든 로깅 이벤트를 다중 프로세스 응용 프로그램의 프로세스 중 하나에 보낼 수 있습니다. 다음 예제 스크립트는 이렇게 하는 방법을 보여줍니다; 예제에서 별도의 리스너 프로세스가 다른 프로세스가 보낸 이벤트를 수신하고 자체 로깅 구성에 따라 이벤트를 기록합니다. 이 예제가 한 가지 방법만을 보여 주지만 (예를 들어, 별도의 리스너 프로세스 대신 리스너 스레드를 사용할 수도 있습니다 – 구현은 비슷할 것입니다), 리스너와 응용 프로그램의 다른 프로세스가 완전히 다른 로깅 구성을 사용하도록 허용하고, 여러분 자신의 특별한 요구 사항을 충족하는 코드의 기초로 사용할 수 있습니다:

@example
# You'll need these imports in your own code
import logging
import logging.handlers
import multiprocessing

# Next two import lines for this demo only
from random import choice, random
import time

#
# Because you'll want to define the logging configurations for listener and workers, the
# listener and worker process functions take a configurer parameter which is a callable
# for configuring logging for that process. These functions are also passed the queue,
# which they use for communication.
#
# In practice, you can configure the listener however you want, but note that in this
# simple example, the listener does not apply level or filter logic to received records.
# In practice, you would probably want to do this logic in the worker processes, to avoid
# sending events which would be filtered out between processes.
#
# The size of the rotated files is made small so you can see the results easily.
def listener_configurer():
    root = logging.getLogger()
    h = logging.handlers.RotatingFileHandler('mptest.log', 'a', 300, 10)
    f = logging.Formatter('%(asctime)s %(processName)-10s %(name)s %(levelname)-8s %(message)s')
    h.setFormatter(f)
    root.addHandler(h)

# This is the listener process top-level loop: wait for logging events
# (LogRecords)on the queue and handle them, quit when you get a None for a
# LogRecord.
def listener_process(queue, configurer):
    configurer()
    while True:
        try:
            record = queue.get()
            if record is None:  # We send this as a sentinel to tell the listener to quit.
                break
            logger = logging.getLogger(record.name)
            logger.handle(record)  # No level or filter logic applied - just do it!
        except Exception:
            import sys, traceback
            print('Whoops! Problem:', file=sys.stderr)
            traceback.print_exc(file=sys.stderr)

# Arrays used for random selections in this demo

LEVELS = [logging.DEBUG, logging.INFO, logging.WARNING,
          logging.ERROR, logging.CRITICAL]

LOGGERS = ['a.b.c', 'd.e.f']

MESSAGES = [
    'Random message #1',
    'Random message #2',
    'Random message #3',
]

# The worker configuration is done at the start of the worker process run.
# Note that on Windows you can't rely on fork semantics, so each process
# will run the logging configuration code when it starts.
def worker_configurer(queue):
    h = logging.handlers.QueueHandler(queue)  # Just the one handler needed
    root = logging.getLogger()
    root.addHandler(h)
    # send all messages, for demo; no other level or filter logic applied.
    root.setLevel(logging.DEBUG)

# This is the worker process top-level loop, which just logs ten events with
# random intervening delays before terminating.
# The print messages are just so you know it's doing something!
def worker_process(queue, configurer):
    configurer(queue)
    name = multiprocessing.current_process().name
    print('Worker started: %s' % name)
    for i in range(10):
        time.sleep(random())
        logger = logging.getLogger(choice(LOGGERS))
        level = choice(LEVELS)
        message = choice(MESSAGES)
        logger.log(level, message)
    print('Worker finished: %s' % name)

# Here's where the demo gets orchestrated. Create the queue, create and start
# the listener, create ten workers and start them, wait for them to finish,
# then send a None to the queue to tell the listener to finish.
def main():
    queue = multiprocessing.Queue(-1)
    listener = multiprocessing.Process(target=listener_process,
                                       args=(queue, listener_configurer))
    listener.start()
    workers = []
    for i in range(10):
        worker = multiprocessing.Process(target=worker_process,
                                         args=(queue, worker_configurer))
        workers.append(worker)
        worker.start()
    for w in workers:
        w.join()
    queue.put_nowait(None)
    listener.join()

if __name__ == '__main__':
    main()
@end example

위의 스크립트 변형은 로깅을 메인 프로세스의 별도의 스레드에서 유지합니다:

@example
import logging
import logging.config
import logging.handlers
from multiprocessing import Process, Queue
import random
import threading
import time

def logger_thread(q):
    while True:
        record = q.get()
        if record is None:
            break
        logger = logging.getLogger(record.name)
        logger.handle(record)


def worker_process(q):
    qh = logging.handlers.QueueHandler(q)
    root = logging.getLogger()
    root.setLevel(logging.DEBUG)
    root.addHandler(qh)
    levels = [logging.DEBUG, logging.INFO, logging.WARNING, logging.ERROR,
              logging.CRITICAL]
    loggers = ['foo', 'foo.bar', 'foo.bar.baz',
               'spam', 'spam.ham', 'spam.ham.eggs']
    for i in range(100):
        lvl = random.choice(levels)
        logger = logging.getLogger(random.choice(loggers))
        logger.log(lvl, 'Message no. %d', i)

if __name__ == '__main__':
    q = Queue()
    d = @{
        'version': 1,
        'formatters': @{
            'detailed': @{
                'class': 'logging.Formatter',
                'format': '%(asctime)s %(name)-15s %(levelname)-8s %(processName)-10s %(message)s'
            @}
        @},
        'handlers': @{
            'console': @{
                'class': 'logging.StreamHandler',
                'level': 'INFO',
            @},
            'file': @{
                'class': 'logging.FileHandler',
                'filename': 'mplog.log',
                'mode': 'w',
                'formatter': 'detailed',
            @},
            'foofile': @{
                'class': 'logging.FileHandler',
                'filename': 'mplog-foo.log',
                'mode': 'w',
                'formatter': 'detailed',
            @},
            'errors': @{
                'class': 'logging.FileHandler',
                'filename': 'mplog-errors.log',
                'mode': 'w',
                'level': 'ERROR',
                'formatter': 'detailed',
            @},
        @},
        'loggers': @{
            'foo': @{
                'handlers': ['foofile']
            @}
        @},
        'root': @{
            'level': 'DEBUG',
            'handlers': ['console', 'file', 'errors']
        @},
    @}
    workers = []
    for i in range(5):
        wp = Process(target=worker_process, name='worker %d' % (i + 1), args=(q,))
        workers.append(wp)
        wp.start()
    logging.config.dictConfig(d)
    lp = threading.Thread(target=logger_thread, args=(q,))
    lp.start()
    # At this point, the main process could do some useful work of its own
    # Once it's done that, it can wait for the workers to terminate...
    for wp in workers:
        wp.join()
    # And now tell the logging thread to finish up, too
    q.put(None)
    lp.join()
@end example

이 변형은 특정 로거에 대한 구성을 적용하는 방법을 보여줍니다 - 예를 들어, @code{foo} 로거는 @code{foo} 서브 시스템의 모든 이벤트를 @code{mplog-foo.log} 파일에 저장하는 특별한 처리기를 갖고 있습니다. 이것은 메인 프로세스의 로깅 시스템이 ( 로깅 이벤트가 작업자 프로세스에서 만들어졌다 하더라도) 메시지를 적절한 대상으로 전달하는 데 사용됩니다.

@menu
* concurrent.futures.ProcessPoolExecutor 사용하기: concurrent futures ProcessPoolExecutor 사용하기. 
* Deploying web applications using Gunicorn and uWSGI:: 

@end menu

@node concurrent futures ProcessPoolExecutor 사용하기,Deploying web applications using Gunicorn and uWSGI,,여러 프로세스에서 단일 파일에 로깅 하기
@anchor{howto/logging-cookbook using-concurrent-futures-processpoolexecutor}@anchor{57c6}
@subsubsection concurrent.futures.ProcessPoolExecutor 사용하기


@ref{1d6,,concurrent.futures.ProcessPoolExecutor}를 사용하여 작업자 프로세스를 시작하려면, 약간 다른 방법으로 큐를 만들어야 합니다.

@example
queue = multiprocessing.Queue(-1)
@end example

대신에, 다음을 사용해야 합니다

@example
queue = multiprocessing.Manager().Queue(-1)  # also works with the examples above
@end example

그런 다음 작업자 생성을:

@example
workers = []
for i in range(10):
    worker = multiprocessing.Process(target=worker_process,
                                     args=(queue, worker_configurer))
    workers.append(worker)
    worker.start()
for w in workers:
    w.join()
@end example

에서 다음과 같이 대체할 수 있습니다 (먼저 @ref{24,,concurrent.futures}를 임포트 하는 것을 기억하십시오):

@example
with concurrent.futures.ProcessPoolExecutor(max_workers=10) as executor:
    for i in range(10):
        executor.submit(worker_process, queue, worker_configurer)
@end example

@node Deploying web applications using Gunicorn and uWSGI,,concurrent futures ProcessPoolExecutor 사용하기,여러 프로세스에서 단일 파일에 로깅 하기
@anchor{howto/logging-cookbook deploying-web-applications-using-gunicorn-and-uwsgi}@anchor{57c7}
@subsubsection Deploying web applications using Gunicorn and uWSGI


When deploying web applications using Gunicorn@footnote{https://gunicorn.org/} or uWSGI@footnote{https://uwsgi-docs.readthedocs.io/en/latest/} (or similar), multiple worker
processes are created to handle client requests. In such environments, avoid creating
file-based handlers directly in your web application. Instead, use a
@ref{1161,,SocketHandler} to log from the web application to a listener in a separate
process. This can be set up using a process management tool such as Supervisor - see
@ref{57bd,,Running a logging socket listener in production} for more details.

@node 파일 회전 사용하기,대체 포매팅 스타일 사용하기,여러 프로세스에서 단일 파일에 로깅 하기,로깅 요리책
@anchor{howto/logging-cookbook using-file-rotation}@anchor{57c8}
@subsection 파일 회전 사용하기


@c (see <https://pymotw.com/3/logging/>)

Sometimes you want to let a log file grow to a certain size, then open a new
file and log to that. You may want to keep a certain number of these files, and
when that many files have been created, rotate the files so that the number of
files and the size of the files both remain bounded. For this usage pattern, the
logging package provides a @ref{1942,,RotatingFileHandler}:

@example
import glob
import logging
import logging.handlers

LOG_FILENAME = 'logging_rotatingfile_example.out'

# Set up a specific logger with our desired output level
my_logger = logging.getLogger('MyLogger')
my_logger.setLevel(logging.DEBUG)

# Add the log message handler to the logger
handler = logging.handlers.RotatingFileHandler(
              LOG_FILENAME, maxBytes=20, backupCount=5)

my_logger.addHandler(handler)

# Log some messages
for i in range(20):
    my_logger.debug('i = %d' % i)

# See what files are created
logfiles = glob.glob('%s*' % LOG_FILENAME)

for filename in logfiles:
    print(filename)
@end example

결과는 6개의 파일이어야 하고, 각기 응용 프로그램에 대한 로그 기록의 일부입니다:

@example
logging_rotatingfile_example.out
logging_rotatingfile_example.out.1
logging_rotatingfile_example.out.2
logging_rotatingfile_example.out.3
logging_rotatingfile_example.out.4
logging_rotatingfile_example.out.5
@end example

가장 최근의 파일은 항상 @code{logging_rotatingfile_example.out} 이며, 크기 제한에 도달할 때마다 접미사 @code{.1} 이 붙은 이름으로 변경됩니다. 기존 백업 파일 각각의 이름이 변경되어 접미사가 증가하고 ( @code{.1} 이 @code{.2} 가 되는 등) @code{.6} 파일이 지워집니다.

분명, 이 예제는 로그 길이를 극단적으로 작게 설정합니다. `maxBytes' 를 적절한 값으로 설정하고 싶을 겁니다.

@node 대체 포매팅 스타일 사용하기,사용자 정의 LogRecord,파일 회전 사용하기,로깅 요리책
@anchor{howto/logging-cookbook format-styles}@anchor{57c9}@anchor{howto/logging-cookbook use-of-alternative-formatting-styles}@anchor{57ca}
@subsection 대체 포매팅 스타일 사용하기


logging이 파이썬 표준 라이브러리에 추가되었을 때, 가변 내용으로 메시지를 포맷하는 유일한 방법은 %-포매팅 방법을 사용하는 것이었습니다. 그 이후로, 파이썬은 두 개의 새로운 포매팅 접근법을 얻었습니다: @ref{896,,string.Template}(파이썬 2.4에 추가됨)과 @ref{832,,str.format()}(파이썬 2.6에 추가됨).

로깅은 (3.2부터) 이 두 가지 추가 포매팅 스타일에 대해 개선된 지원을 제공합니다. @ref{169c,,Formatter} 클래스는 @code{style} 이라는 추가적인 키워드 매개 변수를 취하도록 개선되었습니다. 기본값은 @code{'%'} 이지만, 다른 두 가지 포매팅 스타일에 해당하는 @code{'@{'} 및 @code{'$'} 를 사용할 수 있습니다. (여러분이 기대하듯이) 이전 버전과의 호환성은 기본적으로 유지되지만, style 매개변수를 명시적으로 지정하면 @ref{832,,str.format()} 또는 @ref{896,,string.Template} 과 함께 작동하는 포맷 문자열을 지정할 수 있습니다. 다음은 가능성을 보여주기 위한 예제 콘솔 세션입니다:

@example
>>> import logging
>>> root = logging.getLogger()
>>> root.setLevel(logging.DEBUG)
>>> handler = logging.StreamHandler()
>>> bf = logging.Formatter('@{asctime@} @{name@} @{levelname:8s@} @{message@}',
...                        style='@{')
>>> handler.setFormatter(bf)
>>> root.addHandler(handler)
>>> logger = logging.getLogger('foo.bar')
>>> logger.debug('This is a DEBUG message')
2010-10-28 15:11:55,341 foo.bar DEBUG    This is a DEBUG message
>>> logger.critical('This is a CRITICAL message')
2010-10-28 15:12:11,526 foo.bar CRITICAL This is a CRITICAL message
>>> df = logging.Formatter('$asctime $name $@{levelname@} $message',
...                        style='$')
>>> handler.setFormatter(df)
>>> logger.debug('This is a DEBUG message')
2010-10-28 15:13:06,924 foo.bar DEBUG This is a DEBUG message
>>> logger.critical('This is a CRITICAL message')
2010-10-28 15:13:11,494 foo.bar CRITICAL This is a CRITICAL message
>>>
@end example

로그로 최종 출력하기 위해 로깅 메시지를 포매팅하는 것은 개별 로깅 메시지가 구성되는 방식과 완전히 별개입니다. 개별 메시지에는 다음과 같이 %-포매팅을 사용할 수 있습니다:

@example
>>> logger.error('This is an%s %s %s', 'other,', 'ERROR,', 'message')
2010-10-28 15:19:29,833 foo.bar ERROR This is another, ERROR, message
>>>
@end example

로깅 호출(@code{logger.debug()}, @code{logger.info()} 등)은 실제 로깅 메시지 자체를 위해서는 위치 매개 변수만을 취하고, 키워드 매개 변수는 실제 로깅 호출을 어떻게 다뤄야 하는지를 지정하는 옵션을 결정하는 용도로만 사용됩니다 (예를 들어, 트레이스백 정보를 로그 해야 할지를 가리키는 @code{exc_info} 키워드 매개 변수나 로그에 추가되는 문맥 정보를 나타내는 @code{extra} 키워드 매개 변수). 그래서 여러분은 @ref{832,,str.format()} 또는 @ref{896,,string.Template} 문법을 사용하여 직접 로깅 호출을 할 수 없습니다, 내부적으로 logging 패키지가 %-포매팅을 사용하여 포맷 문자열과 변수 인자를 병합하기 때문입니다. 이전 버전과의 호환성을 유지하는 동안은 이 상황이 바뀌지 않을 것입니다. 기존 코드에 있는 모든 로깅 호출이 %-포맷 문자열을 사용하기 때문입니다.

그러나 @{@}- 및 $- 포매팅을 사용하여 개별 로그 메시지를 구성하는 방법이 있습니다. 메시지의 경우, 메시지 포맷 문자열로 임의의 객체를 사용할 수 있으며, logging 패키지는 실제 형식 문자열을 얻기 위해 그 객체에 대해 @code{str()} 을 호출한다는 것을 상기하십시오. 다음 두 가지 클래스를 고려하십시오:

@example
class BraceMessage:
    def __init__(self, fmt, /, *args, **kwargs):
        self.fmt = fmt
        self.args = args
        self.kwargs = kwargs

    def __str__(self):
        return self.fmt.format(*self.args, **self.kwargs)

class DollarMessage:
    def __init__(self, fmt, /, **kwargs):
        self.fmt = fmt
        self.kwargs = kwargs

    def __str__(self):
        from string import Template
        return Template(self.fmt).substitute(**self.kwargs)
@end example

이 중 하나를 포맷 문자열 대신 사용하면, @{@}- 또는 $-포매팅을 사용하여 포맷된 로그 출력의 “%(message)s”, “@{message@}” 또는 “$message” 자리에 나타나는 실제 “message” 부분을 만들 수 있습니다. 어떤 것을 로그 하고 싶을 때마다 클래스 이름을 사용하는 것은 다소 꼴사납지만, __(두 개의 밑줄 —- @ref{166e,,gettext.gettext()} 나 그 형제들의 동의어/별칭으로 사용되는 _ 과 혼동하지 마세요)와 같은 별칭을 사용하면 꽤 쓸만합니다.

위의 클래스가 파이썬에 포함되어 있지는 않지만, 아주 쉽게 여러분의 코드에 복사하여 붙여넣을 수 있습니다. 다음과 같이 사용될 수 있습니다 (@code{wherever} 라는 모듈에서 선언되었다고 가정합니다):

@example
>>> from wherever import BraceMessage as __
>>> print(__('Message with @{0@} @{name@}', 2, name='placeholders'))
Message with 2 placeholders
>>> class Point: pass
...
>>> p = Point()
>>> p.x = 0.5
>>> p.y = 0.5
>>> print(__('Message with coordinates: (@{point.x:.2f@}, @{point.y:.2f@})',
...       point=p))
Message with coordinates: (0.50, 0.50)
>>> from wherever import DollarMessage as __
>>> print(__('Message with $num $what', num=2, what='placeholders'))
Message with 2 placeholders
>>>
@end example

위의 예제는 @code{print()} 를 사용하여 포매팅이 어떻게 작동하는지 보여주고 있지만, 물론 이 접근법으로 실제 로깅 할 때는 @code{logger.debug()} 나 그와 유사한 것을 사용해야 합니다.

One thing to note is that you pay no significant performance penalty with this
approach: the actual formatting happens not when you make the logging call, but
when (and if) the logged message is actually about to be output to a log by a
handler. So the only slightly unusual thing which might trip you up is that the
parentheses go around the format string and the arguments, not just the format
string. That’s because the __ notation is just syntax sugar for a constructor
call to one of the @code{@var{XXX}Message} classes.

원한다면, @ref{14fa,,LoggerAdapter} 를 사용하여 다음 예제와 같이 위와 유사한 효과를 얻을 수 있습니다:

@example
import logging

class Message:
    def __init__(self, fmt, args):
        self.fmt = fmt
        self.args = args

    def __str__(self):
        return self.fmt.format(*self.args)

class StyleAdapter(logging.LoggerAdapter):
    def log(self, level, msg, /, *args, stacklevel=1, **kwargs):
        if self.isEnabledFor(level):
            msg, kwargs = self.process(msg, kwargs)
            self.logger.log(level, Message(msg, args), **kwargs,
                            stacklevel=stacklevel+1)

logger = StyleAdapter(logging.getLogger(__name__))

def main():
    logger.debug('Hello, @{@}', 'world!')

if __name__ == '__main__':
    logging.basicConfig(level=logging.DEBUG)
    main()
@end example

The above script should log the message @code{Hello, world!} when run with
Python 3.8 or later.

@node 사용자 정의 LogRecord,Subclassing QueueHandler and QueueListener- a ZeroMQ example,대체 포매팅 스타일 사용하기,로깅 요리책
@anchor{howto/logging-cookbook custom-logrecord}@anchor{57cb}@anchor{howto/logging-cookbook customizing-logrecord}@anchor{57cc}
@subsection 사용자 정의 @code{LogRecord}


모든 로깅 이벤트는 @ref{11e5,,LogRecord} 인스턴스로 표현됩니다. 이벤트가 로그 되고 로거 수준에 의해 필터링 되지 않으면, @code{LogRecord} 가 생성되고 이벤트에 대한 정보로 채워진 다음 해당 로거(와 그 조상들, 계층 상위로의 전파가 비활성화된 지점의 로거까지)의 처리기로 전달됩니다. 파이썬 3.2 이전에는, 이 생성이 일어나는 곳이 두 곳밖에 없었습니다:


@itemize *

@item 
@ref{318c,,Logger.makeRecord()}, 이벤트 로깅의 일반적인 프로세스에서 호출됩니다. 인스턴스를 생성하기 위해 @ref{11e5,,LogRecord} 를 직접 호출합니다.

@item 
@ref{31b2,,makeLogRecord()}, LogRecord에 추가될 어트리뷰트를 포함하는 딕셔너리와 함께 호출됩니다. 보통 적절한 딕셔너리가 네트워크를 통해 (예를 들어, @ref{1161,,SocketHandler} 를 통해 피클 형태로, 또는 @ref{102b,,HTTPHandler} 를 통해 JSON 형식으로) 수신될 때 호출됩니다.
@end itemize

이것은 보통 @ref{11e5,,LogRecord} 로 특별한 것을 할 필요가 있다면, 다음 중 하나를 해야 한다는 것을 의미합니다.


@itemize *

@item 
@ref{318c,,Logger.makeRecord()} 를 재정의하는 자신만의 @ref{d45,,Logger} 서브 클래스를 만들고, 관심 있는 로거의 인스턴스가 만들어지기 전에 @ref{31c1,,setLoggerClass()} 를 사용하여 설정하십시오.

@item 
로거나 처리기에 @ref{1400,,Filter}를 추가해서 @ref{31ad,,filter()} 메서드가 호출될 때 필요한 특별한 조작을 하십시오.
@end itemize

첫 번째 접근법은 여러 라이브러리가 서로 다른 일을 하고 싶어 하는 시나리오에서는 다루기 힘들 것입니다. 각자 자신의 @ref{d45,,Logger} 서브 클래스를 설정하려고 시도할 것이고, 마지막 것이 이기게 될 것입니다.

두 번째 접근법은 많은 경우에 합리적으로 잘 작동하지만, @ref{11e5,,LogRecord} 의 특별한 서브 클래스를 사용할 수는 없습니다. 라이브러리 개발자는 로거에 적절한 필터를 설정할 수 있지만, 새로운 로거를 도입할 때마다 이를 수행해야 한다는 것을 기억해야 합니다. 이를 고려하지 않는다면 새 패키지나 모듈을 추가하고 모듈 수준에서 단순히 다음과 같이 합니다:

@example
logger = logging.getLogger(__name__)
@end example

이것은 아마도 고려해야 할 많은 것 중 하나일 뿐입니다. 개발자는 자신의 최상위 로거에 첨부된 @ref{1489,,NullHandler} 에도 필터를 추가 할 수 있지만, 응용 프로그램 개발자가 하위 수준 라이브러리 로거에 처리기를 연결하면 호출되지 않습니다 — 그래서 그 처리기로부터의 출력은 라이브러리 개발자의 의도를 반영하지 못합니다.

파이썬 3.2 이상에서는, @ref{11e5,,LogRecord} 생성이 사용자가 지정할 수 있는 팩토리를 통해 수행됩니다. 팩토리는 @ref{31b6,,setLogRecordFactory()} 로 설정할 수 있고, @ref{31b5,,getLogRecordFactory()} 로 조회할 수 있는 콜러블입니다. 팩토리는 @code{LogRecord} 생성자와 같은 서명으로 호출되고, 기본 설정은 @ref{11e5,,LogRecord} 입니다.

이 방법을 사용하면 사용자 정의 팩토리가 LogRecord 생성의 모든 측면을 제어 할 수 있습니다. 예를 들어, 서브 클래스를 반환하거나, 다음과 같은 방법으로 생성된 레코드에 어트리뷰트를 추가 할 수 있습니다:

@example
old_factory = logging.getLogRecordFactory()

def record_factory(*args, **kwargs):
    record = old_factory(*args, **kwargs)
    record.custom_attribute = 0xdecafbad
    return record

logging.setLogRecordFactory(record_factory)
@end example

이 패턴은 서로 다른 라이브러리가 팩토리를 체인으로 연결할 수 있도록 하며, 서로의 어트리뷰트를 덮어쓰거나 의도하지 않게 표준으로 제공된 어트리뷰트를 덮어쓰지 않는 한, 놀랄 일은 없어야 합니다. 그러나 체인의 각 고리는 모든 로깅 작업에 실행시간 오버헤드를 추가하므로, @ref{1400,,Filter}를 사용해서 원하는 결과를 얻을 수 없을 때만 이 기법을 사용해야 합니다.

@node Subclassing QueueHandler and QueueListener- a ZeroMQ example,Subclassing QueueHandler and QueueListener- a pynng example,사용자 정의 LogRecord,로깅 요리책
@anchor{howto/logging-cookbook subclassing-queuehandler-and-queuelistener-a-zeromq-example}@anchor{57cd}@anchor{howto/logging-cookbook zeromq-handlers}@anchor{57ce}
@subsection Subclassing QueueHandler and QueueListener- a ZeroMQ example


@menu
* Subclass QueueHandler:: 
* Subclass QueueListener:: 

@end menu

@node Subclass QueueHandler,Subclass QueueListener,,Subclassing QueueHandler and QueueListener- a ZeroMQ example
@anchor{howto/logging-cookbook subclass-queuehandler}@anchor{57cf}
@subsubsection Subclass @code{QueueHandler}


@ref{1b5f,,QueueHandler} 서브 클래스를 사용하여 다른 유형의 큐에 메시지를 보낼 수 있습니다, 예를 들어 ZeroMQ ‘publish’ 소켓. 아래 예제에서, 소켓은 별도로 생성되어 처리기로 (‘queue’로) 전달됩니다:

@example
import zmq   # using pyzmq, the Python binding for ZeroMQ
import json  # for serializing records portably

ctx = zmq.Context()
sock = zmq.Socket(ctx, zmq.PUB)  # or zmq.PUSH, or other suitable value
sock.bind('tcp://*:5556')        # or wherever

class ZeroMQSocketHandler(QueueHandler):
    def enqueue(self, record):
        self.queue.send_json(record.__dict__)


handler = ZeroMQSocketHandler(sock)
@end example

물론 구성하는 다른 방법이 있습니다. 예를 들어 처리기가 소켓을 만드는데 필요한 데이터를 전달하는 것입니다:

@example
class ZeroMQSocketHandler(QueueHandler):
    def __init__(self, uri, socktype=zmq.PUB, ctx=None):
        self.ctx = ctx or zmq.Context()
        socket = zmq.Socket(self.ctx, socktype)
        socket.bind(uri)
        super().__init__(socket)

    def enqueue(self, record):
        self.queue.send_json(record.__dict__)

    def close(self):
        self.queue.close()
@end example

@node Subclass QueueListener,,Subclass QueueHandler,Subclassing QueueHandler and QueueListener- a ZeroMQ example
@anchor{howto/logging-cookbook subclass-queuelistener}@anchor{57d0}
@subsubsection Subclass @code{QueueListener}


다른 유형의 큐에서 메시지를 받기 위해 @ref{242,,QueueListener} 의 서브 클래스를 만들 수도 있습니다, 예를 들어 ZeroMQ ‘subscribe’ 소켓. 다음은 그 예입니다:

@example
class ZeroMQSocketListener(QueueListener):
    def __init__(self, uri, /, *handlers, **kwargs):
        self.ctx = kwargs.get('ctx') or zmq.Context()
        socket = zmq.Socket(self.ctx, zmq.SUB)
        socket.setsockopt_string(zmq.SUBSCRIBE, '@w{'})  # subscribe to everything
        socket.connect(uri)
        super().__init__(socket, *handlers, **kwargs)

    def dequeue(self):
        msg = self.queue.recv_json()
        return logging.makeLogRecord(msg)
@end example

@node Subclassing QueueHandler and QueueListener- a pynng example,딕셔너리 기반 구성의 예,Subclassing QueueHandler and QueueListener- a ZeroMQ example,로깅 요리책
@anchor{howto/logging-cookbook pynng-handlers}@anchor{57d1}@anchor{howto/logging-cookbook subclassing-queuehandler-and-queuelistener-a-pynng-example}@anchor{57d2}
@subsection Subclassing QueueHandler and QueueListener- a @code{pynng} example


In a similar way to the above section, we can implement a listener and handler
using pynng@footnote{https://pypi.org/project/pynng/}, which is a Python binding to
NNG@footnote{https://nng.nanomsg.org/}, billed as a spiritual successor to ZeroMQ.
The following snippets illustrate – you can test them in an environment which has
@code{pynng} installed. Just for variety, we present the listener first.

@menu
* Subclass QueueListener: Subclass QueueListener<2>. 
* Subclass QueueHandler: Subclass QueueHandler<2>. 

@end menu

@node Subclass QueueListener<2>,Subclass QueueHandler<2>,,Subclassing QueueHandler and QueueListener- a pynng example
@anchor{howto/logging-cookbook id3}@anchor{57d3}
@subsubsection Subclass @code{QueueListener}


@example
# listener.py
import json
import logging
import logging.handlers

import pynng

DEFAULT_ADDR = "tcp://localhost:13232"

interrupted = False

class NNGSocketListener(logging.handlers.QueueListener):

    def __init__(self, uri, /, *handlers, **kwargs):
        # Have a timeout for interruptability, and open a
        # subscriber socket
        socket = pynng.Sub0(listen=uri, recv_timeout=500)
        # The b'@w{'} subscription matches all topics
        topics = kwargs.pop('topics', None) or b'@w{'}
        socket.subscribe(topics)
        # We treat the socket as a queue
        super().__init__(socket, *handlers, **kwargs)

    def dequeue(self, block):
        data = None
        # Keep looping while not interrupted and no data received over the
        # socket
        while not interrupted:
            try:
                data = self.queue.recv(block=block)
                break
            except pynng.Timeout:
                pass
            except pynng.Closed:  # sometimes happens when you hit Ctrl-C
                break
        if data is None:
            return None
        # Get the logging event sent from a publisher
        event = json.loads(data.decode('utf-8'))
        return logging.makeLogRecord(event)

    def enqueue_sentinel(self):
        # Not used in this implementation, as the socket isn't really a
        # queue
        pass

logging.getLogger('pynng').propagate = False
listener = NNGSocketListener(DEFAULT_ADDR, logging.StreamHandler(), topics=b'@w{'})
listener.start()
print('Press Ctrl-C to stop.')
try:
    while True:
        pass
except KeyboardInterrupt:
    interrupted = True
finally:
    listener.stop()
@end example

@node Subclass QueueHandler<2>,,Subclass QueueListener<2>,Subclassing QueueHandler and QueueListener- a pynng example
@anchor{howto/logging-cookbook id4}@anchor{57d4}
@subsubsection Subclass @code{QueueHandler}


@example
# sender.py
import json
import logging
import logging.handlers
import time
import random

import pynng

DEFAULT_ADDR = "tcp://localhost:13232"

class NNGSocketHandler(logging.handlers.QueueHandler):

    def __init__(self, uri):
        socket = pynng.Pub0(dial=uri, send_timeout=500)
        super().__init__(socket)

    def enqueue(self, record):
        # Send the record as UTF-8 encoded JSON
        d = dict(record.__dict__)
        data = json.dumps(d)
        self.queue.send(data.encode('utf-8'))

    def close(self):
        self.queue.close()

logging.getLogger('pynng').propagate = False
handler = NNGSocketHandler(DEFAULT_ADDR)
# Make sure the process ID is in the output
logging.basicConfig(level=logging.DEBUG,
                    handlers=[logging.StreamHandler(), handler],
                    format='%(levelname)-8s %(name)10s %(process)6s %(message)s')
levels = (logging.DEBUG, logging.INFO, logging.WARNING, logging.ERROR,
          logging.CRITICAL)
logger_names = ('myapp', 'myapp.lib1', 'myapp.lib2')
msgno = 1
while True:
    # Just randomly select some loggers and levels and log away
    level = random.choice(levels)
    logger = logging.getLogger(random.choice(logger_names))
    logger.log(level, 'Message no. %5d' % msgno)
    msgno += 1
    delay = random.random() * 2 + 0.5
    time.sleep(delay)
@end example

You can run the above two snippets in separate command shells. If we run the
listener in one shell and run the sender in two separate shells, we should see
something like the following. In the first sender shell:

@example
$ python sender.py
DEBUG         myapp    613 Message no.     1
WARNING  myapp.lib2    613 Message no.     2
CRITICAL myapp.lib2    613 Message no.     3
WARNING  myapp.lib2    613 Message no.     4
CRITICAL myapp.lib1    613 Message no.     5
DEBUG         myapp    613 Message no.     6
CRITICAL myapp.lib1    613 Message no.     7
INFO     myapp.lib1    613 Message no.     8
(and so on)
@end example

In the second sender shell:

@example
$ python sender.py
INFO     myapp.lib2    657 Message no.     1
CRITICAL myapp.lib2    657 Message no.     2
CRITICAL      myapp    657 Message no.     3
CRITICAL myapp.lib1    657 Message no.     4
INFO     myapp.lib1    657 Message no.     5
WARNING  myapp.lib2    657 Message no.     6
CRITICAL      myapp    657 Message no.     7
DEBUG    myapp.lib1    657 Message no.     8
(and so on)
@end example

In the listener shell:

@example
$ python listener.py
Press Ctrl-C to stop.
DEBUG         myapp    613 Message no.     1
WARNING  myapp.lib2    613 Message no.     2
INFO     myapp.lib2    657 Message no.     1
CRITICAL myapp.lib2    613 Message no.     3
CRITICAL myapp.lib2    657 Message no.     2
CRITICAL      myapp    657 Message no.     3
WARNING  myapp.lib2    613 Message no.     4
CRITICAL myapp.lib1    613 Message no.     5
CRITICAL myapp.lib1    657 Message no.     4
INFO     myapp.lib1    657 Message no.     5
DEBUG         myapp    613 Message no.     6
WARNING  myapp.lib2    657 Message no.     6
CRITICAL      myapp    657 Message no.     7
CRITICAL myapp.lib1    613 Message no.     7
INFO     myapp.lib1    613 Message no.     8
DEBUG    myapp.lib1    657 Message no.     8
(and so on)
@end example

As you can see, the logging from the two sender processes is interleaved in the
listener’s output.

@node 딕셔너리 기반 구성의 예,rotator와 namer를 사용해서 로그 회전 처리하기,Subclassing QueueHandler and QueueListener- a pynng example,로깅 요리책
@anchor{howto/logging-cookbook an-example-dictionary-based-configuration}@anchor{57d5}
@subsection 딕셔너리 기반 구성의 예


다음은 로깅 구성 딕셔너리의 예입니다 - 장고 프로젝트 설명서@footnote{https://docs.djangoproject.com/en/stable/topics/logging/#configuring-logging} 에서 가져왔습니다. 이 딕셔너리를 @ref{13b5,,dictConfig()} 로 전달하여 구성을 적용합니다:

@example
LOGGING = @{
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': @{
        'verbose': @{
            'format': '@{levelname@} @{asctime@} @{module@} @{process:d@} @{thread:d@} @{message@}',
            'style': '@{',
        @},
        'simple': @{
            'format': '@{levelname@} @{message@}',
            'style': '@{',
        @},
    @},
    'filters': @{
        'special': @{
            '()': 'project.logging.SpecialFilter',
            'foo': 'bar',
        @},
    @},
    'handlers': @{
        'console': @{
            'level': 'INFO',
            'class': 'logging.StreamHandler',
            'formatter': 'simple',
        @},
        'mail_admins': @{
            'level': 'ERROR',
            'class': 'django.utils.log.AdminEmailHandler',
            'filters': ['special']
        @}
    @},
    'loggers': @{
        'django': @{
            'handlers': ['console'],
            'propagate': True,
        @},
        'django.request': @{
            'handlers': ['mail_admins'],
            'level': 'ERROR',
            'propagate': False,
        @},
        'myproject.custom': @{
            'handlers': ['console', 'mail_admins'],
            'level': 'INFO',
            'filters': ['special']
        @}
    @}
@}
@end example

이 구성에 대한 더 자세한 정보는 장고 설명서의 관련 섹션@footnote{https://docs.djangoproject.com/en/stable/topics/logging/#configuring-logging} 을 참조하세요.

@node rotator와 namer를 사용해서 로그 회전 처리하기,좀 더 정교한 multiprocessing 예제,딕셔너리 기반 구성의 예,로깅 요리책
@anchor{howto/logging-cookbook cookbook-rotator-namer}@anchor{320c}@anchor{howto/logging-cookbook using-a-rotator-and-namer-to-customize-log-rotation-processing}@anchor{57d6}
@subsection rotator와 namer를 사용해서 로그 회전 처리하기


An example of how you can define a namer and rotator is given in the following
runnable script, which shows gzip compression of the log file:

@example
import gzip
import logging
import logging.handlers
import os
import shutil

def namer(name):
    return name + ".gz"

def rotator(source, dest):
    with open(source, 'rb') as f_in:
        with gzip.open(dest, 'wb') as f_out:
            shutil.copyfileobj(f_in, f_out)
    os.remove(source)


rh = logging.handlers.RotatingFileHandler('rotated.log', maxBytes=128, backupCount=5)
rh.rotator = rotator
rh.namer = namer

root = logging.getLogger()
root.setLevel(logging.INFO)
root.addHandler(rh)
f = logging.Formatter('%(asctime)s %(message)s')
rh.setFormatter(f)
for i in range(1000):
    root.info(f'Message no. @{i + 1@}')
@end example

After running this, you will see six new files, five of which are compressed:

@example
$ ls rotated.log*
rotated.log       rotated.log.2.gz  rotated.log.4.gz
rotated.log.1.gz  rotated.log.3.gz  rotated.log.5.gz
$ zcat rotated.log.1.gz
2023-01-20 02:28:17,767 Message no. 996
2023-01-20 02:28:17,767 Message no. 997
2023-01-20 02:28:17,767 Message no. 998
@end example

@node 좀 더 정교한 multiprocessing 예제,SysLogHandler로 전송된 메시지에 BOM 삽입하기,rotator와 namer를 사용해서 로그 회전 처리하기,로깅 요리책
@anchor{howto/logging-cookbook a-more-elaborate-multiprocessing-example}@anchor{57d7}
@subsection 좀 더 정교한 multiprocessing 예제


다음 동작하는 예제에서는 구성 파일을 사용하여 로깅을 multiprocessing과 함께 사용하는 방법을 보여줍니다. 구성은 매우 간단하지만, 실제 multiprocessing 시나리오에서 더 복잡한 구성을 구현할 수 있음을 예시합니다.

이 예에서, 주 프로세스는 리스너 프로세스와 몇 개의 작업자 프로세스를 생성합니다. 주 프로세스, 리스너 및 작업자를 위한 세 가지 구성이 있습니다 (모든 작업자는 같은 구성을 공유합니다). 주 프로세스에서의 로깅, 작업자가 QueueHandler에 로그 하는 방법, 그리고 리스너가 QueueListener 및 더욱 복잡한 로깅 구성을 구현하고 큐를 통해 수신한 이벤트를 구성에서 지정된 처리기로 전달하도록 배치하는 는 방법을 볼 수 있습니다. 이러한 구성은 설명을 위한 것이지만, 이 예제를 여러분 자신의 시나리오에 적용할 수 있어야 합니다.

스크립트는 다음과 같습니다 - 독스트링과 주석이 어떻게 작동하는지 잘 설명하기를 바랍니다:

@example
import logging
import logging.config
import logging.handlers
from multiprocessing import Process, Queue, Event, current_process
import os
import random
import time

class MyHandler:
    """
    A simple handler for logging events. It runs in the listener process and
    dispatches events to loggers based on the name in the received record,
    which then get dispatched, by the logging system, to the handlers
    configured for those loggers.
    """

    def handle(self, record):
        if record.name == "root":
            logger = logging.getLogger()
        else:
            logger = logging.getLogger(record.name)

        if logger.isEnabledFor(record.levelno):
            # The process name is transformed just to show that it's the listener
            # doing the logging to files and console
            record.processName = '%s (for %s)' % (current_process().name, record.processName)
            logger.handle(record)

def listener_process(q, stop_event, config):
    """
    This could be done in the main process, but is just done in a separate
    process for illustrative purposes.

    This initialises logging according to the specified configuration,
    starts the listener and waits for the main process to signal completion
    via the event. The listener is then stopped, and the process exits.
    """
    logging.config.dictConfig(config)
    listener = logging.handlers.QueueListener(q, MyHandler())
    listener.start()
    if os.name == 'posix':
        # On POSIX, the setup logger will have been configured in the
        # parent process, but should have been disabled following the
        # dictConfig call.
        # On Windows, since fork isn't used, the setup logger won't
        # exist in the child, so it would be created and the message
        # would appear - hence the "if posix" clause.
        logger = logging.getLogger('setup')
        logger.critical('Should not appear, because of disabled logger ...')
    stop_event.wait()
    listener.stop()

def worker_process(config):
    """
    A number of these are spawned for the purpose of illustration. In
    practice, they could be a heterogeneous bunch of processes rather than
    ones which are identical to each other.

    This initialises logging according to the specified configuration,
    and logs a hundred messages with random levels to randomly selected
    loggers.

    A small sleep is added to allow other processes a chance to run. This
    is not strictly needed, but it mixes the output from the different
    processes a bit more than if it's left out.
    """
    logging.config.dictConfig(config)
    levels = [logging.DEBUG, logging.INFO, logging.WARNING, logging.ERROR,
              logging.CRITICAL]
    loggers = ['foo', 'foo.bar', 'foo.bar.baz',
               'spam', 'spam.ham', 'spam.ham.eggs']
    if os.name == 'posix':
        # On POSIX, the setup logger will have been configured in the
        # parent process, but should have been disabled following the
        # dictConfig call.
        # On Windows, since fork isn't used, the setup logger won't
        # exist in the child, so it would be created and the message
        # would appear - hence the "if posix" clause.
        logger = logging.getLogger('setup')
        logger.critical('Should not appear, because of disabled logger ...')
    for i in range(100):
        lvl = random.choice(levels)
        logger = logging.getLogger(random.choice(loggers))
        logger.log(lvl, 'Message no. %d', i)
        time.sleep(0.01)

def main():
    q = Queue()
    # The main process gets a simple configuration which prints to the console.
    config_initial = @{
        'version': 1,
        'handlers': @{
            'console': @{
                'class': 'logging.StreamHandler',
                'level': 'INFO'
            @}
        @},
        'root': @{
            'handlers': ['console'],
            'level': 'DEBUG'
        @}
    @}
    # The worker process configuration is just a QueueHandler attached to the
    # root logger, which allows all messages to be sent to the queue.
    # We disable existing loggers to disable the "setup" logger used in the
    # parent process. This is needed on POSIX because the logger will
    # be there in the child following a fork().
    config_worker = @{
        'version': 1,
        'disable_existing_loggers': True,
        'handlers': @{
            'queue': @{
                'class': 'logging.handlers.QueueHandler',
                'queue': q
            @}
        @},
        'root': @{
            'handlers': ['queue'],
            'level': 'DEBUG'
        @}
    @}
    # The listener process configuration shows that the full flexibility of
    # logging configuration is available to dispatch events to handlers however
    # you want.
    # We disable existing loggers to disable the "setup" logger used in the
    # parent process. This is needed on POSIX because the logger will
    # be there in the child following a fork().
    config_listener = @{
        'version': 1,
        'disable_existing_loggers': True,
        'formatters': @{
            'detailed': @{
                'class': 'logging.Formatter',
                'format': '%(asctime)s %(name)-15s %(levelname)-8s %(processName)-10s %(message)s'
            @},
            'simple': @{
                'class': 'logging.Formatter',
                'format': '%(name)-15s %(levelname)-8s %(processName)-10s %(message)s'
            @}
        @},
        'handlers': @{
            'console': @{
                'class': 'logging.StreamHandler',
                'formatter': 'simple',
                'level': 'INFO'
            @},
            'file': @{
                'class': 'logging.FileHandler',
                'filename': 'mplog.log',
                'mode': 'w',
                'formatter': 'detailed'
            @},
            'foofile': @{
                'class': 'logging.FileHandler',
                'filename': 'mplog-foo.log',
                'mode': 'w',
                'formatter': 'detailed'
            @},
            'errors': @{
                'class': 'logging.FileHandler',
                'filename': 'mplog-errors.log',
                'mode': 'w',
                'formatter': 'detailed',
                'level': 'ERROR'
            @}
        @},
        'loggers': @{
            'foo': @{
                'handlers': ['foofile']
            @}
        @},
        'root': @{
            'handlers': ['console', 'file', 'errors'],
            'level': 'DEBUG'
        @}
    @}
    # Log some initial events, just to show that logging in the parent works
    # normally.
    logging.config.dictConfig(config_initial)
    logger = logging.getLogger('setup')
    logger.info('About to create workers ...')
    workers = []
    for i in range(5):
        wp = Process(target=worker_process, name='worker %d' % (i + 1),
                     args=(config_worker,))
        workers.append(wp)
        wp.start()
        logger.info('Started worker: %s', wp.name)
    logger.info('About to create listener ...')
    stop_event = Event()
    lp = Process(target=listener_process, name='listener',
                 args=(q, stop_event, config_listener))
    lp.start()
    logger.info('Started listener')
    # We now hang around for the workers to finish their work.
    for wp in workers:
        wp.join()
    # Workers all done, listening can now stop.
    # Logging in the parent still works normally.
    logger.info('Telling listener to stop ...')
    stop_event.set()
    lp.join()
    logger.info('All done.')

if __name__ == '__main__':
    main()
@end example

@node SysLogHandler로 전송된 메시지에 BOM 삽입하기,구조적 로깅 구현,좀 더 정교한 multiprocessing 예제,로깅 요리책
@anchor{howto/logging-cookbook inserting-a-bom-into-messages-sent-to-a-sysloghandler}@anchor{57d8}
@subsection SysLogHandler로 전송된 메시지에 BOM 삽입하기


@geindex RFC; RFC 5424
RFC 5424@footnote{https://datatracker.ietf.org/doc/html/rfc5424.html} 는 유니코드 메시지가 다음 구조를 갖는 바이트들로 syslog 데몬에 전송되어야 함을 요구합니다: 선택적인 순수 ASCII 구성 요소, 그 뒤를 이어 UTF-8 바이트 순서 표식 (BOM), 그 뒤를 이어 UTF-8으로 인코딩된 유니코드. (
@geindex RFC; RFC 5424 Section 6
이 규격의 관련 절@footnote{https://datatracker.ietf.org/doc/html/rfc5424.html#section-6} 을 참조하십시오.)

파이썬 3.1에서, BOM을 메시지에 삽입하는 코드가 @ref{86b,,SysLogHandler} 에 추가되었지만, 유감스럽게도, BOM이 메시지의 시작 부분에 나타나서 그 앞에 순수 ASCII 구성 요소를 허락하지 않도록 잘못 구현되었습니다.

이 동작이 잘못됨에 따라, 잘못된 BOM 삽입 코드가 파이썬 3.2.4 이상에서 제거되었습니다. 그러나, 올바른 코드로 대체되지는 않았고, BOM을 포함하고, 그 앞에 순수 ASCII 시퀀스, 그 뒤에 UTF-8으로 인코딩된 임의의 유니코드로 구성된 
@geindex RFC; RFC 5424
RFC 5424@footnote{https://datatracker.ietf.org/doc/html/rfc5424.html}-호환 메시지를 생성하려는 경우 다음과 같이 해야 합니다:


@enumerate 

@item 
@ref{169c,,Formatter} 인스턴스를 @ref{86b,,SysLogHandler} 인스턴스에 다음과 같은 포맷 문자열과 함께 첨부하십시오:

@example
'ASCII section\ufeffUnicode section'
@end example

유니코드 코드 포인트 U+FEFF는, UTF-8을 사용하여 인코딩될 때, UTF-8 BOM으로 인코딩됩니다 – 바이트열 @code{b'\xef\xbb\xbf'}.

@item 
ASCII section을 원하는 자리 표시기로 바꾸십시오. 그러나 치환 후 나타나는 데이터가 항상 ASCII임미 보장되어야 합니다 (그렇게 되면, UTF-8 인코딩 이후에는 변경되지 않은 채로 유지됩니다).

@item 
Unidcode section을 원하는 자리 표시기로 바꾸십시오; 치환 후 나타나는 데이터에 ASCII 범위를 벗어나는 문자가 포함되어 있어도 괜찮습니다 – UTF-8을 사용하여 인코딩됩니다.
@end enumerate

포맷된 된 메시지는 @code{SysLogHandler} 에 의해 UTF-8 인코딩을 사용하여 인코딩*됩니다*. 위의 규칙을 따르는 경우, 
@geindex RFC; RFC 5424
RFC 5424@footnote{https://datatracker.ietf.org/doc/html/rfc5424.html}-호환 메시지를 생성할 수 있어야 합니다. 그렇지 않으면, logging이 불평하지 않을 수도 있지만, 메시지가 RFC 5424와 호환되지 않고 syslog 데몬이 불평 할 수 있습니다.

@node 구조적 로깅 구현,dictConfig 로 처리기를 사용자 정의하기,SysLogHandler로 전송된 메시지에 BOM 삽입하기,로깅 요리책
@anchor{howto/logging-cookbook implementing-structured-logging}@anchor{57d9}
@subsection 구조적 로깅 구현


대부분의 로깅 메시지는 사람이 읽을 수 있도록 만들어졌기 때문에 쉽게 기계에서 파싱 할 수 없지만, 프로그램에서 (복잡한 정규식을 사용하지 않고도) 구문 분석할 수 `있는' 구조화된 포맷으로 메시지를 출력하려는 상황이 있을 수 있습니다. 이것은 logging 패키지를 사용하여 쉽게 달성 할 수 있습니다. 이것이 달성될 수 있는 여러 가지 방법이 있지만, 다음은 JSON을 사용하여 기계가 파싱할 수 있는 방식으로 이벤트를 직렬화하는 간단한 접근법입니다:

@example
import json
import logging

class StructuredMessage:
    def __init__(self, message, /, **kwargs):
        self.message = message
        self.kwargs = kwargs

    def __str__(self):
        return '%s >>> %s' % (self.message, json.dumps(self.kwargs))

_ = StructuredMessage   # optional, to improve readability

logging.basicConfig(level=logging.INFO, format='%(message)s')
logging.info(_('message 1', foo='bar', bar='baz', num=123, fnum=123.456))
@end example

위의 스크립트가 실행되면 다음과 같이 인쇄됩니다:

@example
message 1 >>> @{"fnum": 123.456, "num": 123, "bar": "baz", "foo": "bar"@}
@end example

항목의 순서는 사용된 파이썬 버전에 따라 다를 수 있습니다.

좀 더 특별한 처리가 필요한 경우, 다음 예제와 같이 사용자 정의 JSON 인코더를 사용할 수 있습니다:

@example
import json
import logging


class Encoder(json.JSONEncoder):
    def default(self, o):
        if isinstance(o, set):
            return tuple(o)
        elif isinstance(o, str):
            return o.encode('unicode_escape').decode('ascii')
        return super().default(o)

class StructuredMessage:
    def __init__(self, message, /, **kwargs):
        self.message = message
        self.kwargs = kwargs

    def __str__(self):
        s = Encoder().encode(self.kwargs)
        return '%s >>> %s' % (self.message, s)

_ = StructuredMessage   # optional, to improve readability

def main():
    logging.basicConfig(level=logging.INFO, format='%(message)s')
    logging.info(_('message 1', set_value=@{1, 2, 3@}, snowman='\u2603'))

if __name__ == '__main__':
    main()
@end example

위의 스크립트를 실행하면 다음과 같이 인쇄합니다:

@example
message 1 >>> @{"snowman": "\u2603", "set_value": [1, 2, 3]@}
@end example

항목의 순서는 사용된 파이썬 버전에 따라 다를 수 있습니다.

@node dictConfig 로 처리기를 사용자 정의하기,응용 프로그램 전체에서 특정 포맷 스타일 사용하기,구조적 로깅 구현,로깅 요리책
@anchor{howto/logging-cookbook custom-handlers}@anchor{57da}@anchor{howto/logging-cookbook customizing-handlers-with-dictconfig}@anchor{57db}
@subsection @code{dictConfig()}로 처리기를 사용자 정의하기


특정 상황에서 로깅 처리기를 사용자 정의하고 싶을 때가 있고, @ref{13b5,,dictConfig()}를 사용하고 있다면 서브 클래스를 만들지 않고도 이 작업을 수행 할 수 있습니다. 예를 들어, 로그 파일의 소유권을 설정하고 싶다고 합시다. POSIX에서, @ref{548,,shutil.chown()} 을 사용하면 쉽게 할 수 있지만, 표준 라이브러리의 파일 처리기는 내장된 지원을 제공하지 않습니다. 다음과 같은 일반 함수를 사용하여 처리기 생성을 사용자 정의 할 수 있습니다:

@example
def owned_file_handler(filename, mode='a', encoding=None, owner=None):
    if owner:
        if not os.path.exists(filename):
            open(filename, 'a').close()
        shutil.chown(filename, *owner)
    return logging.FileHandler(filename, mode, encoding)
@end example

그런 다음, @ref{13b5,,dictConfig()} 에 전달되는 로깅 구성에서, 이 함수를 호출하여 로깅 처리기를 생성하도록 지정할 수 있습니다:

@example
LOGGING = @{
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': @{
        'default': @{
            'format': '%(asctime)s %(levelname)s %(name)s %(message)s'
        @},
    @},
    'handlers': @{
        'file':@{
            # The values below are popped from this dictionary and
            # used to create the handler, set the handler's level and
            # its formatter.
            '()': owned_file_handler,
            'level':'DEBUG',
            'formatter': 'default',
            # The values below are passed to the handler creator callable
            # as keyword arguments.
            'owner': ['pulse', 'pulse'],
            'filename': 'chowntest.log',
            'mode': 'w',
            'encoding': 'utf-8',
        @},
    @},
    'root': @{
        'handlers': ['file'],
        'level': 'DEBUG',
    @},
@}
@end example

이 예제에서는 단지 예를 들기 위해 @code{pulse} 라는 사용자와 그룹을 사용하여 소유권을 설정합니다. 작동하는 스크립트 @code{chowntest.py} 로 정리하면:

@example
import logging, logging.config, os, shutil

def owned_file_handler(filename, mode='a', encoding=None, owner=None):
    if owner:
        if not os.path.exists(filename):
            open(filename, 'a').close()
        shutil.chown(filename, *owner)
    return logging.FileHandler(filename, mode, encoding)

LOGGING = @{
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': @{
        'default': @{
            'format': '%(asctime)s %(levelname)s %(name)s %(message)s'
        @},
    @},
    'handlers': @{
        'file':@{
            # The values below are popped from this dictionary and
            # used to create the handler, set the handler's level and
            # its formatter.
            '()': owned_file_handler,
            'level':'DEBUG',
            'formatter': 'default',
            # The values below are passed to the handler creator callable
            # as keyword arguments.
            'owner': ['pulse', 'pulse'],
            'filename': 'chowntest.log',
            'mode': 'w',
            'encoding': 'utf-8',
        @},
    @},
    'root': @{
        'handlers': ['file'],
        'level': 'DEBUG',
    @},
@}

logging.config.dictConfig(LOGGING)
logger = logging.getLogger('mylogger')
logger.debug('A debug message')
@end example

이것을 실행하기 위해서는, 아마도 @code{root} 로 실행해야 할 것입니다:

@example
$ sudo python3.3 chowntest.py
$ cat chowntest.log
2013-11-05 09:34:51,128 DEBUG mylogger A debug message
$ ls -l chowntest.log
-rw-r--r-- 1 pulse pulse 55 2013-11-05 09:34 chowntest.log
@end example

이 예제는 @ref{548,,shutil.chown()} 이 등장한 파이썬 3.3을 사용합니다. 이 접근법은 @ref{13b5,,dictConfig()}를 지원하는 모든 파이썬 버전에서 작동합니다 - 파이썬 2.7, 3.2 이상. 3.3 이전 버전의 경우, (예를 들어) @ref{12f3,,os.chown()} 을 사용하여 실제 소유권 변경을 구현해야 합니다.

실제로는, 처리기 생성 함수가 프로젝트 어딘가에 있는 유틸리티 모듈에 있을 수 있습니다. 구성에 있는 다음과 같은 줄 대신:

@example
'()': owned_file_handler,
@end example

예를 들면 이렇게 쓸 수 있습니다:

@example
'()': 'ext://project.util.owned_file_handler',
@end example

여기서 @code{project.util} 은 함수가 있는 패키지의 실제 이름으로 바꿀 수 있습니다. 위의 작업 스크립트에서 @code{'ext://__main__.owned_file_handler'} 를 사용해도 됩니다. 여기서, 실제 콜러블은 @code{ext://} 스펙으로부터 @ref{13b5,,dictConfig()} 에 의해 결정됩니다.

이 예제는 희망하건대 다른 형태의 파일 변경을 - 예를 들어 특정 POSIX 권한 비트 설정 - 같은 방법으로 (@ref{529,,os.chmod()} 를 사용해서) 구현하는 방법도 알려줍니다.

물론 이 접근법은 @ref{1c51,,FileHandler} 이외의 처리기 유형으로도 확장될 수 있습니다 - 예를 들어, 회전 파일 처리기 중 하나 또는 다른 유형의 처리기 모두.

@node 응용 프로그램 전체에서 특정 포맷 스타일 사용하기,dictConfig 로 필터 구성하기,dictConfig 로 처리기를 사용자 정의하기,로깅 요리책
@anchor{howto/logging-cookbook formatting-styles}@anchor{31a3}@anchor{howto/logging-cookbook using-particular-formatting-styles-throughout-your-application}@anchor{57dc}
@subsection 응용 프로그램 전체에서 특정 포맷 스타일 사용하기


파이썬 3.2에서, @ref{169c,,Formatter} 는 @code{style} 키워드 매개변수를 얻었는데, 이전 버전과의 호환성을 위해 @code{%} 를 기본값으로 사용하면서 @code{@{} 또는 @code{$} 를 지정하면 @ref{832,,str.format()} 과 @ref{896,,string.Template} 에 의해 지원되는 포매팅 접근법을 사용할 수 있도록 합니다. 이것은 로그 되는 최종 출력으로 로깅 메시지를 포매팅하는 것과 관계된 것이고, 개별 로깅 메시지가 만들어지는 방법과는 무관함에 주의하십시오.

Logging calls (@ref{102a,,debug()}, @ref{3184,,info()} etc.) only take
positional parameters for the actual logging message itself, with keyword
parameters used only for determining options for how to handle the logging call
(e.g. the @code{exc_info} keyword parameter to indicate that traceback information
should be logged, or the @code{extra} keyword parameter to indicate additional
contextual information to be added to the log). So you cannot directly make
logging calls using @ref{832,,str.format()} or @ref{896,,string.Template} syntax,
because internally the logging package uses %-formatting to merge the format
string and the variable arguments. There would be no changing this while preserving
backward compatibility, since all logging calls which are out there in existing
code will be using %-format strings.

포맷 스타일을 특정 로거와 연관시키는 제안이 있었지만, 이전 버전과의 호환성 문제가 있는데, 기존 코드가 그 로거 이름으로 %-포매팅을 사용할 수 있기 때문입니다.

제삼자 라이브러리와 여러분의 코드 간에 상호 운용이 가능하도록 로깅 하려면, 개별 로깅 호출 수준에서 포매팅을 결정해야 합니다. 이렇게 할 때 대체 포매팅 스타일을 수용 할 수 있는 몇 가지 길이 열립니다.

@menu
* LogRecord 팩토리 사용:: 
* 사용자 정의 메시지 객체 사용:: 

@end menu

@node LogRecord 팩토리 사용,사용자 정의 메시지 객체 사용,,응용 프로그램 전체에서 특정 포맷 스타일 사용하기
@anchor{howto/logging-cookbook using-logrecord-factories}@anchor{57dd}
@subsubsection LogRecord 팩토리 사용


파이썬 3.2에서, 위에서 언급 한 @ref{169c,,Formatter} 변경 사항과 함께, logging 패키지는 @ref{31b6,,setLogRecordFactory()} 함수를 사용하여 사용자가 자신의 @ref{11e5,,LogRecord} 서브 클래스를 설정할 수 있는 기능을 얻었습니다. 이것을 사용하면, 원하는 일을 하도록 @ref{31b4,,getMessage()} 메서드를 재정의하는 여러분 자신의 @code{LogRecord} 서브 클래스를 설정할 수 있습니다. 이 메서드의 베이스 클래스 구현이 @code{msg % args} 포매팅이 일어나는 곳이며, 여러분이 대체 포매팅으로 치환할 수 있는 곳입니다; 그러나, 모든 포매팅 스타일을 지원하면서 다른 코드와의 상호 운용성을 보장하기 위해 %-포매팅을 기본값으로 사용하도록 주의해야 합니다. 또한, 베이스 구현과 마찬가지로 @code{str(self.msg)} 를 호출하도록 주의해야 합니다.

자세한 정보는 @ref{31b6,,setLogRecordFactory()}와 @ref{11e5,,LogRecord} 에 대한 레퍼런스 설명서를 참조하십시오.

@node 사용자 정의 메시지 객체 사용,,LogRecord 팩토리 사용,응용 프로그램 전체에서 특정 포맷 스타일 사용하기
@anchor{howto/logging-cookbook using-custom-message-objects}@anchor{57de}
@subsubsection 사용자 정의 메시지 객체 사용


@{@}- 및 $-포매팅을 사용하여 개별 로그 메시지를 작성할 수 있는 또 다른, 아마도 더 간단한 방법이 있습니다. (@ref{31b3,,임의의 객체를 메시지로 사용하기}에서) 로깅 할 때 임의의 객체를 메시지 포맷 문자열로 사용할 수 있고, logging 패키지는 그 객체에 대해 @ref{169,,str()} 을 호출하여 실제 형식 문자열을 얻는다고 했던 것을 기억하실 수 있을 겁니다. 다음 두 클래스를 생각해봅시다:

@example
class BraceMessage:
    def __init__(self, fmt, /, *args, **kwargs):
        self.fmt = fmt
        self.args = args
        self.kwargs = kwargs

    def __str__(self):
        return self.fmt.format(*self.args, **self.kwargs)

class DollarMessage:
    def __init__(self, fmt, /, **kwargs):
        self.fmt = fmt
        self.kwargs = kwargs

    def __str__(self):
        from string import Template
        return Template(self.fmt).substitute(**self.kwargs)
@end example

이 중 하나를 포맷 문자열 대신 사용하면, @{@}- 또는 $-포매팅을 사용하여 포맷된 로그 출력의 “%(message)s”, “@{message@}” 또는 “$message” 자리에 나타나는 실제 “message” 부분을 만들 수 있습니다. 어떤 것을 로그 하고 싶을 때마다 클래스 이름을 사용하는 것이 다소 꼴사납다면, 메시지에 @code{M} 이나 @code{_} 과 같은 별칭을 사용해서 더 쓸만하게 만들 수 있습니다 (또는 지역화에 @code{_} 를 사용하고 있다면, 아마도 @code{__}).

이 접근법의 예가 아래에 나와 있습니다. 먼저, @ref{832,,str.format()} 를 사용하는 포매팅입니다:

@example
>>> __ = BraceMessage
>>> print(__('Message with @{0@} @{1@}', 2, 'placeholders'))
Message with 2 placeholders
>>> class Point: pass
...
>>> p = Point()
>>> p.x = 0.5
>>> p.y = 0.5
>>> print(__('Message with coordinates: (@{point.x:.2f@}, @{point.y:.2f@})', point=p))
Message with coordinates: (0.50, 0.50)
@end example

두 번째로, @ref{896,,string.Template} 를 사용하는 포매팅입니다:

@example
>>> __ = DollarMessage
>>> print(__('Message with $num $what', num=2, what='placeholders'))
Message with 2 placeholders
>>>
@end example

One thing to note is that you pay no significant performance penalty with this
approach: the actual formatting happens not when you make the logging call, but
when (and if) the logged message is actually about to be output to a log by a
handler. So the only slightly unusual thing which might trip you up is that the
parentheses go around the format string and the arguments, not just the format
string. That’s because the __ notation is just syntax sugar for a constructor
call to one of the @code{@var{XXX}Message} classes shown above.

@node dictConfig 로 필터 구성하기,사용자 정의된 예외 포매팅,응용 프로그램 전체에서 특정 포맷 스타일 사용하기,로깅 요리책
@anchor{howto/logging-cookbook configuring-filters-with-dictconfig}@anchor{57df}@anchor{howto/logging-cookbook filters-dictconfig}@anchor{57e0}
@subsection @code{dictConfig()}로 필터 구성하기


@ref{13b5,,dictConfig()} 를 사용하여 필터를 구성할 수 `있습니다'. 하지만 처음에는 어떻게 해야 할지 명확하지 않을 수 있습니다 (그래서 이 조리법을 제공합니다). @ref{1400,,Filter} 가 표준 라이브러리에 포함된 유일한 필터 클래스이고, 많은 요구 사항을 충족시키지는 않을 것이기 때문에 (오직 베이스 클래스로 제공됩니다), 일반적으로 @ref{31ad,,filter()} 메서드를 재정의하는 여러분 자신의 @code{Filter} 서브 클래스를 정의할 필요가 있습니다. 이렇게 하려면, 필터를 생성하는 데 사용될 콜러블을 필터의 구성 딕셔너리에 @code{()} 키로 지정하십시오 (클래스가 가장 분명하지만 @code{Filter} 인스턴스를 반환하는 콜러블은 모두 가능합니다). 다음은 완전한 예입니다:

@example
import logging
import logging.config
import sys

class MyFilter(logging.Filter):
    def __init__(self, param=None):
        self.param = param

    def filter(self, record):
        if self.param is None:
            allow = True
        else:
            allow = self.param not in record.msg
        if allow:
            record.msg = 'changed: ' + record.msg
        return allow

LOGGING = @{
    'version': 1,
    'filters': @{
        'myfilter': @{
            '()': MyFilter,
            'param': 'noshow',
        @}
    @},
    'handlers': @{
        'console': @{
            'class': 'logging.StreamHandler',
            'filters': ['myfilter']
        @}
    @},
    'root': @{
        'level': 'DEBUG',
        'handlers': ['console']
    @},
@}

if __name__ == '__main__':
    logging.config.dictConfig(LOGGING)
    logging.debug('hello')
    logging.debug('hello - noshow')
@end example

이 예제는 인스턴스를 만드는 콜러블로 키워드 매개 변수 형식으로 구성 데이터를 전달하는 방법을 보여줍니다. 실행하면, 위의 스크립트는 다음을 인쇄합니다:

@example
changed: hello
@end example

필터가 구성된 대로 작동하고 있음을 보여줍니다.

주목해야 할 몇 가지 추가 사항:


@itemize *

@item 
구성에서 직접 참조할 수 없는 경우 (예를 들어, 다른 모듈에 있고 구성 딕셔너리가 있는 곳에서 직접 임포트 할 수 없는 경우), @ref{31e2,,외부 객체에 대한 액세스} 에 설명된 대로 @code{ext://...} 형식을 사용할 수 있습니다. 예를 들어, 위의 예에서 @code{MyFilter} 대신 @code{'ext://__main__.MyFilter'} 를 사용할 수 있습니다.

@item 
필터뿐만 아니라, 이 기술을 사용자 정의 처리기 및 포매터를 구성하는데 사용할 수도 있습니다. logging이 구성에서 사용자 정의 객체를 어떻게 지원하는지에 대한 더 많은 정보는 @ref{31d6,,사용자 정의 객체} 를 보시고, 위의 다른 요리책 조리법 @ref{57da,,dictConfig()로 처리기를 사용자 정의하기} 도 보십시오.
@end itemize

@node 사용자 정의된 예외 포매팅,로깅 메시지 말하기,dictConfig 로 필터 구성하기,로깅 요리책
@anchor{howto/logging-cookbook custom-format-exception}@anchor{57e1}@anchor{howto/logging-cookbook customized-exception-formatting}@anchor{57e2}
@subsection 사용자 정의된 예외 포매팅


예외 포매팅을 사용자 정의하고 싶을 때가 있습니다 - 논쟁의 여지는 있지만, 예외 정보가 포함된 경우에도 이벤트 당 정확히 한 줄이 기록되기 원한다고 합시다. 다음 예제처럼, 사용자 정의 포매터 클래스를 사용할 수 있습니다:

@example
import logging

class OneLineExceptionFormatter(logging.Formatter):
    def formatException(self, exc_info):
        """
        Format an exception so that it prints on a single line.
        """
        result = super().formatException(exc_info)
        return repr(result)  # or format into one line however you want to

    def format(self, record):
        s = super().format(record)
        if record.exc_text:
            s = s.replace('\n', '@w{'}) + '|'
        return s

def configure_logging():
    fh = logging.FileHandler('output.txt', 'w')
    f = OneLineExceptionFormatter('%(asctime)s|%(levelname)s|%(message)s|',
                                  '%d/%m/%Y %H:%M:%S')
    fh.setFormatter(f)
    root = logging.getLogger()
    root.setLevel(logging.DEBUG)
    root.addHandler(fh)

def main():
    configure_logging()
    logging.info('Sample message')
    try:
        x = 1 / 0
    except ZeroDivisionError as e:
        logging.exception('ZeroDivisionError: %s', e)

if __name__ == '__main__':
    main()
@end example

실행하면, 정확하게 두 줄의 파일이 생성됩니다:

@example
28/01/2015 07:21:23|INFO|Sample message|
28/01/2015 07:21:23|ERROR|ZeroDivisionError: division by zero|'Traceback (most recent call last):\n  File "logtest7.py", line 30, in main\n    x = 1 / 0\nZeroDivisionError: division by zero'|
@end example

위의 처리는 단순하지만, 예외 정보를 원하는 대로 포맷하는 방법을 알려줍니다. @ref{104,,traceback} 모듈은 더욱 전문화된 요구에 도움이 될 수 있습니다.

@node 로깅 메시지 말하기,로깅 메시지를 버퍼링하고 조건부 출력하기,사용자 정의된 예외 포매팅,로깅 요리책
@anchor{howto/logging-cookbook speaking-logging-messages}@anchor{57e3}@anchor{howto/logging-cookbook spoken-messages}@anchor{57e4}
@subsection 로깅 메시지 말하기


로깅 메시지를 보여주는 대신 들려주는 것이 바람직한 상황이 있을 수 있습니다. 여러분의 시스템에 텍스트-음성 변환 (TTS) 기능이 있다면 쉽습니다, 파이썬 바인딩이 없어도 됩니다. 대부분의 TTS 시스템에는 실행할 수 있는 명령행 프로그램이 있으며, 이것을 @ref{dc,,subprocess} 를 사용하여 처리기에서 호출 할 수 있습니다. 여기서 TTS 명령행 프로그램이 사용자와 상호 작용하거나, 완료하는 데 오랜 시간이 걸릴 것으로 기대되지 않으며, 로그 되는 메시지의 빈도가 메시지로 사용자를 압도할 정도로 높지 않으며, 메시지는 동시에 처리되지 않고 한 번에 하나씩 읽어도 된다고 가정합니다. 아래의 예제 구현은 다음 메시지가 처리되기 전에 하나의 메시지를 다 읽을 때까지 대기하고, 이 때문에 다른 처리기가 대기 상태로 유지될 수 있습니다. 다음은 @code{espeak} TTS 패키지가 사용 가능하다고 가정하는 접근법을 보여주는 간단한 예입니다:

@example
import logging
import subprocess
import sys

class TTSHandler(logging.Handler):
    def emit(self, record):
        msg = self.format(record)
        # Speak slowly in a female English voice
        cmd = ['espeak', '-s150', '-ven+f3', msg]
        p = subprocess.Popen(cmd, stdout=subprocess.PIPE,
                             stderr=subprocess.STDOUT)
        # wait for the program to finish
        p.communicate()

def configure_logging():
    h = TTSHandler()
    root = logging.getLogger()
    root.addHandler(h)
    # the default formatter just returns the message
    root.setLevel(logging.DEBUG)

def main():
    logging.info('Hello')
    logging.debug('Goodbye')

if __name__ == '__main__':
    configure_logging()
    sys.exit(main())
@end example

실행하면, 이 스크립트는 여성 음성으로 “Hello”와 “Goodbye”를 차례대로 말합니다.

물론 위의 접근법은 다른 TTS 시스템과 명령행에서 실행되는 외부 프로그램을 통해 메시지를 처리 할 수 있는 전혀 다른 시스템에도 적용될 수 있습니다.

@node 로깅 메시지를 버퍼링하고 조건부 출력하기,Sending logging messages to email with buffering,로깅 메시지 말하기,로깅 요리책
@anchor{howto/logging-cookbook buffered-logging}@anchor{57e5}@anchor{howto/logging-cookbook buffering-logging-messages-and-outputting-them-conditionally}@anchor{57e6}
@subsection 로깅 메시지를 버퍼링하고 조건부 출력하기


임시 영역에 메시지를 기록하고 특정 조건이 발생할 때만 메시지를 출력하려는 상황이 있을 수 있습니다. 예를 들어, 함수에서 디버그 이벤트를 로깅 하기를 원할 수 있습니다. 함수가 에러 없이 완료되면 수집된 디버그 정보로 로그를 어지럽히고 싶지 않지만, 에러가 있으면 에러뿐만 아니라 모든 디버그 정보를 출력하고 싶습니다.

다음은 로깅이 이러한 방식으로 작동하기 원하는 함수에 데코레이터를 사용하여 이를 수행할 방법을 보여주는 예제입니다. @ref{31e5,,logging.handlers.MemoryHandler} 를 사용하는데, 어떤 상황이 발생할 때까지 로그 된 이벤트를 버퍼링할 수 있도록 하고, 때가 되면 버퍼링 된 이벤트들이 @code{flush} 됩니다 - 처리를 위해 다른 처리기(@code{target} 처리기)로 전달됩니다. 기본적으로, @code{MemoryHandler} 는 버퍼가 다 차거나 수준이 지정된 임계값보다 크거나 같은 이벤트가 발생하면 플러시 됩니다. 사용자 정의 플러시 동작을 원할 경우, 이 조리법을 @code{MemoryHandler} 의 더 특수한 서브 클래스와 함께 사용할 수 있습니다.

예제 스크립트에는 간단한 함수 @code{foo} 가 있는데, 모든 로그 수준을 순회하면서, 어떤 수준으로 로그 할지를 @code{sys.stderr} 에 쓴 다음, 그 수준으로 실제 메시지를 로깅 합니다. 매개 변수를 @code{foo} 에 전달할 수 있는데, 참이면 ERROR 및 CRITICAL 수준으로 로그 합니다 - 그렇지 않으면 DEBUG, INFO 및 WARNING 수준에서만 로그 합니다.

이 스크립트는 필요한 조건부 로깅을 수행할 데코레이터로 @code{foo} 를 데코레이트 하기만 합니다. 데코레이터는 로거를 매개 변수로 받고 데코레이트 된 함수가 호출되는 동안 메모리 처리기를 연결합니다. 데코레이터는 target 처리기, 플러싱이 발생해야 하는 수준 및 버퍼 용량(버퍼 된 레코드의 수)을 추가로 매개 변수로 받을 수 있습니다. 이것들은 각각 @code{sys.stderr} 로 쓰는 @ref{13fd,,StreamHandler}, @code{logging.ERROR}, @code{100} 을 기본값으로 합니다.

스크립트는 다음과 같습니다:

@example
import logging
from logging.handlers import MemoryHandler
import sys

logger = logging.getLogger(__name__)
logger.addHandler(logging.NullHandler())

def log_if_errors(logger, target_handler=None, flush_level=None, capacity=None):
    if target_handler is None:
        target_handler = logging.StreamHandler()
    if flush_level is None:
        flush_level = logging.ERROR
    if capacity is None:
        capacity = 100
    handler = MemoryHandler(capacity, flushLevel=flush_level, target=target_handler)

    def decorator(fn):
        def wrapper(*args, **kwargs):
            logger.addHandler(handler)
            try:
                return fn(*args, **kwargs)
            except Exception:
                logger.exception('call failed')
                raise
            finally:
                super(MemoryHandler, handler).flush()
                logger.removeHandler(handler)
        return wrapper

    return decorator

def write_line(s):
    sys.stderr.write('%s\n' % s)

def foo(fail=False):
    write_line('about to log at DEBUG ...')
    logger.debug('Actually logged at DEBUG')
    write_line('about to log at INFO ...')
    logger.info('Actually logged at INFO')
    write_line('about to log at WARNING ...')
    logger.warning('Actually logged at WARNING')
    if fail:
        write_line('about to log at ERROR ...')
        logger.error('Actually logged at ERROR')
        write_line('about to log at CRITICAL ...')
        logger.critical('Actually logged at CRITICAL')
    return fail

decorated_foo = log_if_errors(logger)(foo)

if __name__ == '__main__':
    logger.setLevel(logging.DEBUG)
    write_line('Calling undecorated foo with False')
    assert not foo(False)
    write_line('Calling undecorated foo with True')
    assert foo(True)
    write_line('Calling decorated foo with False')
    assert not decorated_foo(False)
    write_line('Calling decorated foo with True')
    assert decorated_foo(True)
@end example

이 스크립트를 실행하면 다음과 같은 출력이 나타납니다.:

@example
Calling undecorated foo with False
about to log at DEBUG ...
about to log at INFO ...
about to log at WARNING ...
Calling undecorated foo with True
about to log at DEBUG ...
about to log at INFO ...
about to log at WARNING ...
about to log at ERROR ...
about to log at CRITICAL ...
Calling decorated foo with False
about to log at DEBUG ...
about to log at INFO ...
about to log at WARNING ...
Calling decorated foo with True
about to log at DEBUG ...
about to log at INFO ...
about to log at WARNING ...
about to log at ERROR ...
Actually logged at DEBUG
Actually logged at INFO
Actually logged at WARNING
Actually logged at ERROR
about to log at CRITICAL ...
Actually logged at CRITICAL
@end example

보시다시피, 실제 로깅 출력은 심각도가 ERROR 이상인 이벤트가 기록될 때만 발생하지만, 이 경우 심각도가 낮은 이전 이벤트도 기록됩니다.

물론 전통적인 데코레이션 수단을 쓸 수 있습니다.:

@example
@@log_if_errors(logger)
def foo(fail=False):
    ...
@end example

@node Sending logging messages to email with buffering,구성을 통해 UTC GMT 로 시간을 포맷하기,로깅 메시지를 버퍼링하고 조건부 출력하기,로깅 요리책
@anchor{howto/logging-cookbook buffered-smtp}@anchor{57e7}@anchor{howto/logging-cookbook sending-logging-messages-to-email-with-buffering}@anchor{57e8}
@subsection Sending logging messages to email, with buffering


To illustrate how you can send log messages via email, so that a set number of
messages are sent per email, you can subclass
@ref{3238,,BufferingHandler}. In the following  example, which you can
adapt to suit your specific needs, a simple test harness is provided which allows you
to run the script with command line arguments specifying what you typically need to
send things via SMTP. (Run the downloaded script with the @code{-h} argument to see the
required and optional arguments.)

@example
import logging
import logging.handlers
import smtplib

class BufferingSMTPHandler(logging.handlers.BufferingHandler):
    def __init__(self, mailhost, port, username, password, fromaddr, toaddrs,
                 subject, capacity):
        logging.handlers.BufferingHandler.__init__(self, capacity)
        self.mailhost = mailhost
        self.mailport = port
        self.username = username
        self.password = password
        self.fromaddr = fromaddr
        if isinstance(toaddrs, str):
            toaddrs = [toaddrs]
        self.toaddrs = toaddrs
        self.subject = subject
        self.setFormatter(logging.Formatter("%(asctime)s %(levelname)-5s %(message)s"))

    def flush(self):
        if len(self.buffer) > 0:
            try:
                smtp = smtplib.SMTP(self.mailhost, self.mailport)
                smtp.starttls()
                smtp.login(self.username, self.password)
                msg = "From: %s\r\nTo: %s\r\nSubject: %s\r\n\r\n" % (self.fromaddr, ','.join(self.toaddrs), self.subject)
                for record in self.buffer:
                    s = self.format(record)
                    msg = msg + s + "\r\n"
                smtp.sendmail(self.fromaddr, self.toaddrs, msg)
                smtp.quit()
            except Exception:
                if logging.raiseExceptions:
                    raise
            self.buffer = []

if __name__ == '__main__':
    import argparse

    ap = argparse.ArgumentParser()
    aa = ap.add_argument
    aa('host', metavar='HOST', help='SMTP server')
    aa('--port', '-p', type=int, default=587, help='SMTP port')
    aa('user', metavar='USER', help='SMTP username')
    aa('password', metavar='PASSWORD', help='SMTP password')
    aa('to', metavar='TO', help='Addressee for emails')
    aa('sender', metavar='SENDER', help='Sender email address')
    aa('--subject', '-s',
       default='Test Logging email from Python logging module (buffering)',
       help='Subject of email')
    options = ap.parse_args()
    logger = logging.getLogger()
    logger.setLevel(logging.DEBUG)
    h = BufferingSMTPHandler(options.host, options.port, options.user,
                             options.password, options.sender,
                             options.to, options.subject, 10)
    logger.addHandler(h)
    for i in range(102):
        logger.info("Info index = %d", i)
    h.flush()
    h.close()
@end example

If you run this script and your SMTP server is correctly set up, you should find that
it sends eleven emails to the addressee you specify. The first ten emails will each
have ten log messages, and the eleventh will have two messages. That makes up 102
messages as specified in the script.

@node 구성을 통해 UTC GMT 로 시간을 포맷하기,선택적 로깅을 위해 컨텍스트 관리자 사용하기,Sending logging messages to email with buffering,로깅 요리책
@anchor{howto/logging-cookbook formatting-times-using-utc-gmt-via-configuration}@anchor{57e9}@anchor{howto/logging-cookbook utc-formatting}@anchor{57ea}
@subsection 구성을 통해 UTC(GMT)로 시간을 포맷하기


Sometimes you want to format times using UTC, which can be done using a class
such as @code{UTCFormatter}, shown below:

@example
import logging
import time

class UTCFormatter(logging.Formatter):
    converter = time.gmtime
@end example

이제 @ref{169c,,Formatter} 대신 코드에서 @code{UTCFormatter} 를 사용할 수 있습니다. 구성을 통해 이를 수행하려면, 다음에 나오는 완전한 예제에 의해 설명된 접근법으로 @ref{13b5,,dictConfig()} API를 사용할 수 있습니다:

@example
import logging
import logging.config
import time

class UTCFormatter(logging.Formatter):
    converter = time.gmtime

LOGGING = @{
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': @{
        'utc': @{
            '()': UTCFormatter,
            'format': '%(asctime)s %(message)s',
        @},
        'local': @{
            'format': '%(asctime)s %(message)s',
        @}
    @},
    'handlers': @{
        'console1': @{
            'class': 'logging.StreamHandler',
            'formatter': 'utc',
        @},
        'console2': @{
            'class': 'logging.StreamHandler',
            'formatter': 'local',
        @},
    @},
    'root': @{
        'handlers': ['console1', 'console2'],
   @}
@}

if __name__ == '__main__':
    logging.config.dictConfig(LOGGING)
    logging.warning('The local time is %s', time.asctime())
@end example

이 스크립트를 실행하면, 다음과 같은 내용을 인쇄합니다:

@example
2015-10-17 12:53:29,501 The local time is Sat Oct 17 13:53:29 2015
2015-10-17 13:53:29,501 The local time is Sat Oct 17 13:53:29 2015
@end example

시간이 한 처리기에서는 UTC로, 다른 처리기에서는 지역 시간으로 포맷되는 것을 보여줍니다.

@node 선택적 로깅을 위해 컨텍스트 관리자 사용하기,CLI 응용 프로그램 시작 템플릿,구성을 통해 UTC GMT 로 시간을 포맷하기,로깅 요리책
@anchor{howto/logging-cookbook context-manager}@anchor{57eb}@anchor{howto/logging-cookbook using-a-context-manager-for-selective-logging}@anchor{57ec}
@subsection 선택적 로깅을 위해 컨텍스트 관리자 사용하기


로깅 구성을 일시적으로 변경하고 무언가를 한 후에 되돌리는 것이 유용할 때가 있습니다. 이를 위해, 컨텍스트 관리자는 로깅 컨텍스트를 저장하고 복원하는 가장 분명한 방법입니다. 다음은 그러한 컨텍스트 관리자의 간단한 예입니다. 컨텍스트 관리자의 범위 안에서 선택적으로 로깅 수준을 변경하고 로깅 처리기를 추가 할 수 있습니다:

@example
import logging
import sys

class LoggingContext:
    def __init__(self, logger, level=None, handler=None, close=True):
        self.logger = logger
        self.level = level
        self.handler = handler
        self.close = close

    def __enter__(self):
        if self.level is not None:
            self.old_level = self.logger.level
            self.logger.setLevel(self.level)
        if self.handler:
            self.logger.addHandler(self.handler)

    def __exit__(self, et, ev, tb):
        if self.level is not None:
            self.logger.setLevel(self.old_level)
        if self.handler:
            self.logger.removeHandler(self.handler)
        if self.handler and self.close:
            self.handler.close()
        # implicit return of None => don't swallow exceptions
@end example

수준 값을 지정하면, 로거의 수준은 컨텍스트 관리자가 적용되는 with 블록의 범위 안에서 해당 값으로 설정됩니다. 처리기를 지정하면, 블록 진입 시 로거에 추가되고 블록에서 빠져나갈 때 제거됩니다. 블록을 빠져나갈 때 처리기를 닫도록 관리자에게 요청할 수도 있습니다 - 더는 처리기가 필요하지 않으면 이렇게 할 수 있습니다.

작동 원리를 보여주기 위해, 다음 코드 블록을 위에 추가 할 수 있습니다:

@example
if __name__ == '__main__':
    logger = logging.getLogger('foo')
    logger.addHandler(logging.StreamHandler())
    logger.setLevel(logging.INFO)
    logger.info('1. This should appear just once on stderr.')
    logger.debug('2. This should not appear.')
    with LoggingContext(logger, level=logging.DEBUG):
        logger.debug('3. This should appear once on stderr.')
    logger.debug('4. This should not appear.')
    h = logging.StreamHandler(sys.stdout)
    with LoggingContext(logger, level=logging.DEBUG, handler=h, close=True):
        logger.debug('5. This should appear twice - once on stderr and once on stdout.')
    logger.info('6. This should appear just once on stderr.')
    logger.debug('7. This should not appear.')
@end example

우리는 초기에 로거 수준을 @code{INFO} 로 설정합니다. 그래서 메시지 #1은 나타나고 메시지 #2는 나타나지 않습니다. 그다음에 @code{with} 블록에서 수준을 @code{DEBUG} 로 임시 변경하면, 메시지 #3이 나타납니다. 블록이 종료되면 로거 수준이 @code{INFO} 로 복원되므로, 메시지 #4가 표시되지 않습니다. 그다음 @code{with} 블록에서 수준을 다시 @code{DEBUG} 로 다시 설정하지만, @code{sys.stdout} 으로 쓰는 처리기도 추가합니다. 따라서 메시지 #5는 콘솔에 두 번 표시됩니다 (@code{stderr} 를 통해 한 번, @code{stdout} 을 통해 한 번). @code{with} 문장이 완료된 후에 상태는 이전과 같으므로, (메시지 #1처럼) 메시지 #6이 나타나고, (메시지 #2처럼) 메시지 #7은 보이지 않습니다.

이렇게 만든 스크립트를 실행하면, 결과는 다음과 같습니다:

@example
$ python logctx.py
1. This should appear just once on stderr.
3. This should appear once on stderr.
5. This should appear twice - once on stderr and once on stdout.
5. This should appear twice - once on stderr and once on stdout.
6. This should appear just once on stderr.
@end example

다시 실행하면서 @code{stderr} 를 @code{/dev/null} 로 리디렉트하면, 다음과 같이 @code{stdout} 으로 출력된 메시지만 나타납니다:

@example
$ python logctx.py 2>/dev/null
5. This should appear twice - once on stderr and once on stdout.
@end example

다시 한번, 하지만 @code{stdout} 을 @code{/dev/null} 로 리디렉트하면, 이렇게 됩니다:

@example
$ python logctx.py >/dev/null
1. This should appear just once on stderr.
3. This should appear once on stderr.
5. This should appear twice - once on stderr and once on stdout.
6. This should appear just once on stderr.
@end example

이 경우, @code{stdout} 에 인쇄된 메시지 #5는 예상대로 나타나지 않습니다.

물론 여기서 설명한 방법을 일반화 할 수 있습니다. 예를 들어 로깅 필터를 임시로 첨부 할 수 있습니다. 위의 코드는 파이썬 2와 파이썬 3에서 모두 작동합니다.

@node CLI 응용 프로그램 시작 템플릿,로깅을 위한 Qt GUI,선택적 로깅을 위해 컨텍스트 관리자 사용하기,로깅 요리책
@anchor{howto/logging-cookbook a-cli-application-starter-template}@anchor{57ed}@anchor{howto/logging-cookbook starter-template}@anchor{57ee}
@subsection CLI 응용 프로그램 시작 템플릿


다음과 같은 것들을 하는 방법을 보여주는 예입니다:


@itemize *

@item 
명령 줄 인자에 기반한 로깅 수준 사용하기

@item 
별도의 파일에 있는 여러 부속 명령으로 분기하고, 모두 일관된 방식으로 같은 수준에서 로깅 하기

@item 
간단하고 최소의 구성을 사용하기
@end itemize

어떤 서비스를 중지, 시작 또는 다시 시작하는 작업을 위한 명령 줄 응용 프로그램이 있다고 가정합니다. 이것은 예시의 목적을 위해 @code{start.py}, @code{stop.py} 및 @code{restart.py}에 개별 명령이 구현되고, 응용 프로그램의 메인 스크립트는 @code{app.py} 파일이 되도록 구성할 수 있습니다. 명령 줄 인자를 통해 응용 프로그램의 상세도를 제어하려고 하고, @code{logging.INFO}를 기본값으로 한다고 더 가정해 봅시다. @code{app.py}를 작성할 수 있는 한 가지 방법은 다음과 같습니다:

@example
import argparse
import importlib
import logging
import os
import sys

def main(args=None):
    scriptname = os.path.basename(__file__)
    parser = argparse.ArgumentParser(scriptname)
    levels = ('DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL')
    parser.add_argument('--log-level', default='INFO', choices=levels)
    subparsers = parser.add_subparsers(dest='command',
                                       help='Available commands:')
    start_cmd = subparsers.add_parser('start', help='Start a service')
    start_cmd.add_argument('name', metavar='NAME',
                           help='Name of service to start')
    stop_cmd = subparsers.add_parser('stop',
                                     help='Stop one or more services')
    stop_cmd.add_argument('names', metavar='NAME', nargs='+',
                          help='Name of service to stop')
    restart_cmd = subparsers.add_parser('restart',
                                        help='Restart one or more services')
    restart_cmd.add_argument('names', metavar='NAME', nargs='+',
                             help='Name of service to restart')
    options = parser.parse_args()
    # the code to dispatch commands could all be in this file. For the purposes
    # of illustration only, we implement each command in a separate module.
    try:
        mod = importlib.import_module(options.command)
        cmd = getattr(mod, 'command')
    except (ImportError, AttributeError):
        print('Unable to find the code for command \'%s\'@w{'} % options.command)
        return 1
    # Could get fancy here and load configuration from file or dictionary
    logging.basicConfig(level=options.log_level,
                        format='%(levelname)s %(name)s %(message)s')
    cmd(options)

if __name__ == '__main__':
    sys.exit(main())
@end example

그리고 @code{start}, @code{stop} 및 @code{restart} 명령은 별도의 모듈로 구현할 수 있습니다, 가령 시작하려면:

@example
# start.py
import logging

logger = logging.getLogger(__name__)

def command(options):
    logger.debug('About to start %s', options.name)
    # actually do the command processing here ...
    logger.info('Started the \'%s\' service.', options.name)
@end example

그리고 멈추려면:

@example
# stop.py
import logging

logger = logging.getLogger(__name__)

def command(options):
    n = len(options.names)
    if n == 1:
        plural = '@w{'}
        services = '\'%s\'@w{'} % options.names[0]
    else:
        plural = 's'
        services = ', '.join('\'%s\'@w{'} % name for name in options.names)
        i = services.rfind(', ')
        services = services[:i] + ' and ' + services[i + 2:]
    logger.debug('About to stop %s', services)
    # actually do the command processing here ...
    logger.info('Stopped the %s service%s.', services, plural)
@end example

비슷하게, 다시 시작하려면:

@example
# restart.py
import logging

logger = logging.getLogger(__name__)

def command(options):
    n = len(options.names)
    if n == 1:
        plural = '@w{'}
        services = '\'%s\'@w{'} % options.names[0]
    else:
        plural = 's'
        services = ', '.join('\'%s\'@w{'} % name for name in options.names)
        i = services.rfind(', ')
        services = services[:i] + ' and ' + services[i + 2:]
    logger.debug('About to restart %s', services)
    # actually do the command processing here ...
    logger.info('Restarted the %s service%s.', services, plural)
@end example

이 응용 프로그램을 기본 로그 수준으로 실행하면, 이런 출력을 얻습니다:

@example
$ python app.py start foo
INFO start Started the 'foo' service.

$ python app.py stop foo bar
INFO stop Stopped the 'foo' and 'bar' services.

$ python app.py restart foo bar baz
INFO restart Restarted the 'foo', 'bar' and 'baz' services.
@end example

첫 번째 단어는 로깅 수준이고, 두 번째 단어는 이벤트가 로그 된 장소의 모듈이나 패키지 이름입니다.

로깅 수준을 변경하면, 로그로 전송되는 정보를 변경할 수 있습니다. 예를 들어, 우리가 더 많은 정보를 원한다면:

@example
$ python app.py --log-level DEBUG start foo
DEBUG start About to start foo
INFO start Started the 'foo' service.

$ python app.py --log-level DEBUG stop foo bar
DEBUG stop About to stop 'foo' and 'bar'
INFO stop Stopped the 'foo' and 'bar' services.

$ python app.py --log-level DEBUG restart foo bar baz
DEBUG restart About to restart 'foo', 'bar' and 'baz'
INFO restart Restarted the 'foo', 'bar' and 'baz' services.
@end example

그리고 덜 원한다면:

@example
$ python app.py --log-level WARNING start foo
$ python app.py --log-level WARNING stop foo bar
$ python app.py --log-level WARNING restart foo bar baz
@end example

이 경우, @code{WARNING} 수준 이상으로 아무것도 로그 하지 않았으므로, 명령은 콘솔에 아무것도 인쇄하지 않습니다.

@node 로깅을 위한 Qt GUI,Logging to syslog with RFC5424 support,CLI 응용 프로그램 시작 템플릿,로깅 요리책
@anchor{howto/logging-cookbook a-qt-gui-for-logging}@anchor{57ef}@anchor{howto/logging-cookbook qt-gui}@anchor{57f0}
@subsection 로깅을 위한 Qt GUI


A question that comes up from time to time is about how to log to a GUI
application. The Qt@footnote{https://www.qt.io/} framework is a popular
cross-platform UI framework with Python bindings using PySide2@footnote{https://pypi.org/project/PySide2/}
or PyQt5@footnote{https://pypi.org/project/PyQt5/} libraries.

다음 예는 Qt GUI에 로그 하는 방법을 보여줍니다. 이것은 콜러블을 취하는 간단한 @code{QtHandler} 클래스를 소개합니다. 이 클래스는 GUI 업데이트를 하는 메인 스레드의 슬롯이어야 합니다. 또한 UI 자체 (수동 로깅을 위한 버튼을 통해) 뿐만 아니라 백그라운드에서 작업하는 작업자 스레드에서 GUI에 로그 하는 방법을 보여주기 위해 작업자 스레드도 만듭니다 (여기서는, 단지 임의의 짧은 지연을 주고 임의의 수준으로 메시지를 로깅 합니다).

작업자 스레드는 @ref{f3,,threading} 모듈 대신 Qt의 @code{QThread} 클래스를 사용하여 구현되는데, 다른 @code{Qt} 구성 요소와 더 잘 통합되는 @code{QThread}를 사용해야 하는 상황이 있기 때문입니다.

The code should work with recent releases of any of @code{PySide6}, @code{PyQt6},
@code{PySide2} or @code{PyQt5}. You should be able to adapt the approach to earlier
versions of Qt. Please refer to the comments in the code snippet for more
detailed information.

@example
import logging
import random
import sys
import time

# Deal with minor differences between different Qt packages
try:
    from PySide6 import QtCore, QtGui, QtWidgets
    Signal = QtCore.Signal
    Slot = QtCore.Slot
except ImportError:
    try:
        from PyQt6 import QtCore, QtGui, QtWidgets
        Signal = QtCore.pyqtSignal
        Slot = QtCore.pyqtSlot
    except ImportError:
        try:
            from PySide2 import QtCore, QtGui, QtWidgets
            Signal = QtCore.Signal
            Slot = QtCore.Slot
        except ImportError:
            from PyQt5 import QtCore, QtGui, QtWidgets
            Signal = QtCore.pyqtSignal
            Slot = QtCore.pyqtSlot

logger = logging.getLogger(__name__)


#
# Signals need to be contained in a QObject or subclass in order to be correctly
# initialized.
#
class Signaller(QtCore.QObject):
    signal = Signal(str, logging.LogRecord)

#
# Output to a Qt GUI is only supposed to happen on the main thread. So, this
# handler is designed to take a slot function which is set up to run in the main
# thread. In this example, the function takes a string argument which is a
# formatted log message, and the log record which generated it. The formatted
# string is just a convenience - you could format a string for output any way
# you like in the slot function itself.
#
# You specify the slot function to do whatever GUI updates you want. The handler
# doesn't know or care about specific UI elements.
#
class QtHandler(logging.Handler):
    def __init__(self, slotfunc, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.signaller = Signaller()
        self.signaller.signal.connect(slotfunc)

    def emit(self, record):
        s = self.format(record)
        self.signaller.signal.emit(s, record)

#
# This example uses QThreads, which means that the threads at the Python level
# are named something like "Dummy-1". The function below gets the Qt name of the
# current thread.
#
def ctname():
    return QtCore.QThread.currentThread().objectName()


#
# Used to generate random levels for logging.
#
LEVELS = (logging.DEBUG, logging.INFO, logging.WARNING, logging.ERROR,
          logging.CRITICAL)

#
# This worker class represents work that is done in a thread separate to the
# main thread. The way the thread is kicked off to do work is via a button press
# that connects to a slot in the worker.
#
# Because the default threadName value in the LogRecord isn't much use, we add
# a qThreadName which contains the QThread name as computed above, and pass that
# value in an "extra" dictionary which is used to update the LogRecord with the
# QThread name.
#
# This example worker just outputs messages sequentially, interspersed with
# random delays of the order of a few seconds.
#
class Worker(QtCore.QObject):
    @@Slot()
    def start(self):
        extra = @{'qThreadName': ctname() @}
        logger.debug('Started work', extra=extra)
        i = 1
        # Let the thread run until interrupted. This allows reasonably clean
        # thread termination.
        while not QtCore.QThread.currentThread().isInterruptionRequested():
            delay = 0.5 + random.random() * 2
            time.sleep(delay)
            try:
                if random.random() < 0.1:
                    raise ValueError('Exception raised: %d' % i)
                else:
                    level = random.choice(LEVELS)
                    logger.log(level, 'Message after delay of %3.1f: %d', delay, i, extra=extra)
            except ValueError as e:
                logger.exception('Failed: %s', e, extra=extra)
            i += 1

#
# Implement a simple UI for this cookbook example. This contains:
#
# * A read-only text edit window which holds formatted log messages
# * A button to start work and log stuff in a separate thread
# * A button to log something from the main thread
# * A button to clear the log window
#
class Window(QtWidgets.QWidget):

    COLORS = @{
        logging.DEBUG: 'black',
        logging.INFO: 'blue',
        logging.WARNING: 'orange',
        logging.ERROR: 'red',
        logging.CRITICAL: 'purple',
    @}

    def __init__(self, app):
        super().__init__()
        self.app = app
        self.textedit = te = QtWidgets.QPlainTextEdit(self)
        # Set whatever the default monospace font is for the platform
        f = QtGui.QFont('nosuchfont')
        if hasattr(f, 'Monospace'):
            f.setStyleHint(f.Monospace)
        else:
            f.setStyleHint(f.StyleHint.Monospace)  # for Qt6
        te.setFont(f)
        te.setReadOnly(True)
        PB = QtWidgets.QPushButton
        self.work_button = PB('Start background work', self)
        self.log_button = PB('Log a message at a random level', self)
        self.clear_button = PB('Clear log window', self)
        self.handler = h = QtHandler(self.update_status)
        # Remember to use qThreadName rather than threadName in the format string.
        fs = '%(asctime)s %(qThreadName)-12s %(levelname)-8s %(message)s'
        formatter = logging.Formatter(fs)
        h.setFormatter(formatter)
        logger.addHandler(h)
        # Set up to terminate the QThread when we exit
        app.aboutToQuit.connect(self.force_quit)

        # Lay out all the widgets
        layout = QtWidgets.QVBoxLayout(self)
        layout.addWidget(te)
        layout.addWidget(self.work_button)
        layout.addWidget(self.log_button)
        layout.addWidget(self.clear_button)
        self.setFixedSize(900, 400)

        # Connect the non-worker slots and signals
        self.log_button.clicked.connect(self.manual_update)
        self.clear_button.clicked.connect(self.clear_display)

        # Start a new worker thread and connect the slots for the worker
        self.start_thread()
        self.work_button.clicked.connect(self.worker.start)
        # Once started, the button should be disabled
        self.work_button.clicked.connect(lambda : self.work_button.setEnabled(False))

    def start_thread(self):
        self.worker = Worker()
        self.worker_thread = QtCore.QThread()
        self.worker.setObjectName('Worker')
        self.worker_thread.setObjectName('WorkerThread')  # for qThreadName
        self.worker.moveToThread(self.worker_thread)
        # This will start an event loop in the worker thread
        self.worker_thread.start()

    def kill_thread(self):
        # Just tell the worker to stop, then tell it to quit and wait for that
        # to happen
        self.worker_thread.requestInterruption()
        if self.worker_thread.isRunning():
            self.worker_thread.quit()
            self.worker_thread.wait()
        else:
            print('worker has already exited.')

    def force_quit(self):
        # For use when the window is closed
        if self.worker_thread.isRunning():
            self.kill_thread()

    # The functions below update the UI and run in the main thread because
    # that's where the slots are set up

    @@Slot(str, logging.LogRecord)
    def update_status(self, status, record):
        color = self.COLORS.get(record.levelno, 'black')
        s = '<pre><font color="%s">%s</font></pre>' % (color, status)
        self.textedit.appendHtml(s)

    @@Slot()
    def manual_update(self):
        # This function uses the formatted message passed in, but also uses
        # information from the record to format the message in an appropriate
        # color according to its severity (level).
        level = random.choice(LEVELS)
        extra = @{'qThreadName': ctname() @}
        logger.log(level, 'Manually logged!', extra=extra)

    @@Slot()
    def clear_display(self):
        self.textedit.clear()


def main():
    QtCore.QThread.currentThread().setObjectName('MainThread')
    logging.getLogger().setLevel(logging.DEBUG)
    app = QtWidgets.QApplication(sys.argv)
    example = Window(app)
    example.show()
    if hasattr(app, 'exec'):
        rc = app.exec()
    else:
        rc = app.exec_()
    sys.exit(rc)

if __name__=='__main__':
    main()
@end example

@node Logging to syslog with RFC5424 support,How to treat a logger like an output stream,로깅을 위한 Qt GUI,로깅 요리책
@anchor{howto/logging-cookbook logging-to-syslog-with-rfc5424-support}@anchor{57f1}
@subsection Logging to syslog with RFC5424 support


Although 
@geindex RFC; RFC 5424
RFC 5424@footnote{https://datatracker.ietf.org/doc/html/rfc5424.html} dates from 2009, most syslog servers are configured by default to
use the older 
@geindex RFC; RFC 3164
RFC 3164@footnote{https://datatracker.ietf.org/doc/html/rfc3164.html}, which hails from 2001. When @code{logging} was added to Python
in 2003, it supported the earlier (and only existing) protocol at the time. Since
RFC 5424 came out, as there has not been widespread deployment of it in syslog
servers, the @ref{86b,,SysLogHandler} functionality has not been
updated.

RFC 5424 contains some useful features such as support for structured data, and if you
need to be able to log to a syslog server with support for it, you can do so with a
subclassed handler which looks something like this:

@example
import datetime as dt
import logging.handlers
import re
import socket
import time

class SysLogHandler5424(logging.handlers.SysLogHandler):

    tz_offset = re.compile(r'([+-]\d@{2@})(\d@{2@})$')
    escaped = re.compile(r'([\]"\\])')

    def __init__(self, *args, **kwargs):
        self.msgid = kwargs.pop('msgid', None)
        self.appname = kwargs.pop('appname', None)
        super().__init__(*args, **kwargs)

    def format(self, record):
        version = 1
        asctime = dt.datetime.fromtimestamp(record.created).isoformat()
        m = self.tz_offset.match(time.strftime('%z'))
        has_offset = False
        if m and time.timezone:
            hrs, mins = m.groups()
            if int(hrs) or int(mins):
                has_offset = True
        if not has_offset:
            asctime += 'Z'
        else:
            asctime += f'@{hrs@}:@{mins@}'
        try:
            hostname = socket.gethostname()
        except Exception:
            hostname = '-'
        appname = self.appname or '-'
        procid = record.process
        msgid = '-'
        msg = super().format(record)
        sdata = '-'
        if hasattr(record, 'structured_data'):
            sd = record.structured_data
            # This should be a dict where the keys are SD-ID and the value is a
            # dict mapping PARAM-NAME to PARAM-VALUE (refer to the RFC for what these
            # mean)
            # There's no error checking here - it's purely for illustration, and you
            # can adapt this code for use in production environments
            parts = []

            def replacer(m):
                g = m.groups()
                return '\\' + g[0]

            for sdid, dv in sd.items():
                part = f'[@{sdid@}'
                for k, v in dv.items():
                    s = str(v)
                    s = self.escaped.sub(replacer, s)
                    part += f' @{k@}="@{s@}"'
                part += ']'
                parts.append(part)
            sdata = '@w{'}.join(parts)
        return f'@{version@} @{asctime@} @{hostname@} @{appname@} @{procid@} @{msgid@} @{sdata@} @{msg@}'
@end example

You’ll need to be familiar with RFC 5424 to fully understand the above code, and it
may be that you have slightly different needs (e.g. for how you pass structural data
to the log). Nevertheless, the above should be adaptable to your speciric needs. With
the above handler, you’d pass structured data using something like this:

@example
sd = @{
    'foo@@12345': @{'bar': 'baz', 'baz': 'bozz', 'fizz': r'buzz'@},
    'foo@@54321': @{'rab': 'baz', 'zab': 'bozz', 'zzif': r'buzz'@}
@}
extra = @{'structured_data': sd@}
i = 1
logger.debug('Message %d', i, extra=extra)
@end example

@node How to treat a logger like an output stream,How to uniformly handle newlines in logging output,Logging to syslog with RFC5424 support,로깅 요리책
@anchor{howto/logging-cookbook how-to-treat-a-logger-like-an-output-stream}@anchor{57f2}
@subsection How to treat a logger like an output stream


Sometimes, you need to interface to a third-party API which expects a file-like
object to write to, but you want to direct the API’s output to a logger. You
can do this using a class which wraps a logger with a file-like API.
Here’s a short script illustrating such a class:

@example
import logging

class LoggerWriter:
    def __init__(self, logger, level):
        self.logger = logger
        self.level = level

    def write(self, message):
        if message != '\n':  # avoid printing bare newlines, if you like
            self.logger.log(self.level, message)

    def flush(self):
        # doesn't actually do anything, but might be expected of a file-like
        # object - so optional depending on your situation
        pass

    def close(self):
        # doesn't actually do anything, but might be expected of a file-like
        # object - so optional depending on your situation. You might want
        # to set a flag so that later calls to write raise an exception
        pass

def main():
    logging.basicConfig(level=logging.DEBUG)
    logger = logging.getLogger('demo')
    info_fp = LoggerWriter(logger, logging.INFO)
    debug_fp = LoggerWriter(logger, logging.DEBUG)
    print('An INFO message', file=info_fp)
    print('A DEBUG message', file=debug_fp)

if __name__ == "__main__":
    main()
@end example

When this script is run, it prints

@example
INFO:demo:An INFO message
DEBUG:demo:A DEBUG message
@end example

You could also use @code{LoggerWriter} to redirect @code{sys.stdout} and
@code{sys.stderr} by doing something like this:

@example
import sys

sys.stdout = LoggerWriter(logger, logging.INFO)
sys.stderr = LoggerWriter(logger, logging.WARNING)
@end example

You should do this `after' configuring logging for your needs. In the above
example, the @ref{bf2,,basicConfig()} call does this (using the
@code{sys.stderr} value `before' it is overwritten by a @code{LoggerWriter}
instance). Then, you’d get this kind of result:

@example
>>> print('Foo')
INFO:demo:Foo
>>> print('Bar', file=sys.stderr)
WARNING:demo:Bar
>>>
@end example

Of course, the examples above show output according to the format used by
@ref{bf2,,basicConfig()}, but you can use a different formatter when you
configure logging.

Note that with the above scheme, you are somewhat at the mercy of buffering and
the sequence of write calls which you are intercepting. For example, with the
definition of @code{LoggerWriter} above, if you have the snippet

@example
sys.stderr = LoggerWriter(logger, logging.WARNING)
1 / 0
@end example

then running the script results in

@example
WARNING:demo:Traceback (most recent call last):

WARNING:demo:  File "/home/runner/cookbook-loggerwriter/test.py", line 53, in <module>

WARNING:demo:
WARNING:demo:main()
WARNING:demo:  File "/home/runner/cookbook-loggerwriter/test.py", line 49, in main

WARNING:demo:
WARNING:demo:1 / 0
WARNING:demo:ZeroDivisionError
WARNING:demo::
WARNING:demo:division by zero
@end example

As you can see, this output isn’t ideal. That’s because the underlying code
which writes to @code{sys.stderr} makes multiple writes, each of which results in a
separate logged line (for example, the last three lines above). To get around
this problem, you need to buffer things and only output log lines when newlines
are seen. Let’s use a slightly better implementation of @code{LoggerWriter}:

@example
class BufferingLoggerWriter(LoggerWriter):
    def __init__(self, logger, level):
        super().__init__(logger, level)
        self.buffer = '@w{'}

    def write(self, message):
        if '\n' not in message:
            self.buffer += message
        else:
            parts = message.split('\n')
            if self.buffer:
                s = self.buffer + parts.pop(0)
                self.logger.log(self.level, s)
            self.buffer = parts.pop()
            for part in parts:
                self.logger.log(self.level, part)
@end example

This just buffers up stuff until a newline is seen, and then logs complete
lines. With this approach, you get better output:

@example
WARNING:demo:Traceback (most recent call last):
WARNING:demo:  File "/home/runner/cookbook-loggerwriter/main.py", line 55, in <module>
WARNING:demo:    main()
WARNING:demo:  File "/home/runner/cookbook-loggerwriter/main.py", line 52, in main
WARNING:demo:    1/0
WARNING:demo:ZeroDivisionError: division by zero
@end example

@node How to uniformly handle newlines in logging output,Patterns to avoid,How to treat a logger like an output stream,로깅 요리책
@anchor{howto/logging-cookbook how-to-uniformly-handle-newlines-in-logging-output}@anchor{57f3}
@subsection How to uniformly handle newlines in logging output


Usually, messages that are logged (say to console or file) consist of a single
line of text. However, sometimes there is a need to handle messages with
multiple lines - whether because a logging format string contains newlines, or
logged data contains newlines. If you want to handle such messages uniformly, so
that each line in the logged message appears uniformly formatted as if it was
logged separately, you can do this using a handler mixin, as in the following
snippet:

@example
# Assume this is in a module mymixins.py
import copy

class MultilineMixin:
    def emit(self, record):
        s = record.getMessage()
        if '\n' not in s:
            super().emit(record)
        else:
            lines = s.splitlines()
            rec = copy.copy(record)
            rec.args = None
            for line in lines:
                rec.msg = line
                super().emit(rec)
@end example

You can use the mixin as in the following script:

@example
import logging

from mymixins import MultilineMixin

logger = logging.getLogger(__name__)

class StreamHandler(MultilineMixin, logging.StreamHandler):
    pass

if __name__ == '__main__':
    logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(levelname)-9s %(message)s',
                        handlers = [StreamHandler()])
    logger.debug('Single line')
    logger.debug('Multiple lines:\nfool me once ...')
    logger.debug('Another single line')
    logger.debug('Multiple lines:\n%s', 'fool me ...\ncan\'t get fooled again')
@end example

The script, when run, prints something like:

@example
2025-07-02 13:54:47,234 DEBUG     Single line
2025-07-02 13:54:47,234 DEBUG     Multiple lines:
2025-07-02 13:54:47,234 DEBUG     fool me once ...
2025-07-02 13:54:47,234 DEBUG     Another single line
2025-07-02 13:54:47,234 DEBUG     Multiple lines:
2025-07-02 13:54:47,234 DEBUG     fool me ...
2025-07-02 13:54:47,234 DEBUG     can't get fooled again
@end example

If, on the other hand, you are concerned about log injection@footnote{https://owasp.org/www-community/attacks/Log_Injection}, you can use a
formatter which escapes newlines, as per the following example:

@example
import logging

logger = logging.getLogger(__name__)

class EscapingFormatter(logging.Formatter):
    def format(self, record):
        s = super().format(record)
        return s.replace('\n', r'\n')

if __name__ == '__main__':
    h = logging.StreamHandler()
    h.setFormatter(EscapingFormatter('%(asctime)s %(levelname)-9s %(message)s'))
    logging.basicConfig(level=logging.DEBUG, handlers = [h])
    logger.debug('Single line')
    logger.debug('Multiple lines:\nfool me once ...')
    logger.debug('Another single line')
    logger.debug('Multiple lines:\n%s', 'fool me ...\ncan\'t get fooled again')
@end example

You can, of course, use whatever escaping scheme makes the most sense for you.
The script, when run, should produce output like this:

@example
2025-07-09 06:47:33,783 DEBUG     Single line
2025-07-09 06:47:33,783 DEBUG     Multiple lines:\nfool me once ...
2025-07-09 06:47:33,783 DEBUG     Another single line
2025-07-09 06:47:33,783 DEBUG     Multiple lines:\nfool me ...\ncan't get fooled again
@end example

Escaping behaviour can’t be the stdlib default , as it would break backwards
compatibility.

@c patterns-to-avoid:

@node Patterns to avoid,Other resources,How to uniformly handle newlines in logging output,로깅 요리책
@anchor{howto/logging-cookbook patterns-to-avoid}@anchor{57f4}
@subsection Patterns to avoid


Although the preceding sections have described ways of doing things you might
need to do or deal with, it is worth mentioning some usage patterns which are
`unhelpful', and which should therefore be avoided in most cases. The following
sections are in no particular order.

@menu
* Opening the same log file multiple times:: 
* Using loggers as attributes in a class or passing them as parameters:: 
* Adding handlers other than NullHandler to a logger in a library:: 
* Creating a lot of loggers:: 

@end menu

@node Opening the same log file multiple times,Using loggers as attributes in a class or passing them as parameters,,Patterns to avoid
@anchor{howto/logging-cookbook opening-the-same-log-file-multiple-times}@anchor{57f5}
@subsubsection Opening the same log file multiple times


On Windows, you will generally not be able to open the same file multiple times
as this will lead to a “file is in use by another process” error. However, on
POSIX platforms you’ll not get any errors if you open the same file multiple
times. This could be done accidentally, for example by:


@itemize *

@item 
Adding a file handler more than once which references the same file (e.g. by
a copy/paste/forget-to-change error).

@item 
Opening two files that look different, as they have different names, but are
the same because one is a symbolic link to the other.

@item 
Forking a process, following which both parent and child have a reference to
the same file. This might be through use of the @ref{98,,multiprocessing} module,
for example.
@end itemize

Opening a file multiple times might `appear' to work most of the time, but can
lead to a number of problems in practice:


@itemize *

@item 
Logging output can be garbled because multiple threads or processes try to
write to the same file. Although logging guards against concurrent use of the
same handler instance by multiple threads, there is no such protection if
concurrent writes are attempted by two different threads using two different
handler instances which happen to point to the same file.

@item 
An attempt to delete a file (e.g. during file rotation) silently fails,
because there is another reference pointing to it. This can lead to confusion
and wasted debugging time - log entries end up in unexpected places, or are
lost altogether. Or a file that was supposed to be moved remains in place,
and grows in size unexpectedly despite size-based rotation being supposedly
in place.
@end itemize

Use the techniques outlined in @ref{57c5,,여러 프로세스에서 단일 파일에 로깅 하기} to circumvent such
issues.

@node Using loggers as attributes in a class or passing them as parameters,Adding handlers other than NullHandler to a logger in a library,Opening the same log file multiple times,Patterns to avoid
@anchor{howto/logging-cookbook using-loggers-as-attributes-in-a-class-or-passing-them-as-parameters}@anchor{57f6}
@subsubsection Using loggers as attributes in a class or passing them as parameters


While there might be unusual cases where you’ll need to do this, in general
there is no point because loggers are singletons. Code can always access a
given logger instance by name using @code{logging.getLogger(name)}, so passing
instances around and holding them as instance attributes is pointless. Note
that in other languages such as Java and C#, loggers are often static class
attributes. However, this pattern doesn’t make sense in Python, where the
module (and not the class) is the unit of software decomposition.

@node Adding handlers other than NullHandler to a logger in a library,Creating a lot of loggers,Using loggers as attributes in a class or passing them as parameters,Patterns to avoid
@anchor{howto/logging-cookbook adding-handlers-other-than-nullhandler-to-a-logger-in-a-library}@anchor{57f7}
@subsubsection Adding handlers other than @code{NullHandler} to a logger in a library


Configuring logging by adding handlers, formatters and filters is the
responsibility of the application developer, not the library developer. If you
are maintaining a library, ensure that you don’t add handlers to any of your
loggers other than a @ref{1489,,NullHandler} instance.

@node Creating a lot of loggers,,Adding handlers other than NullHandler to a logger in a library,Patterns to avoid
@anchor{howto/logging-cookbook creating-a-lot-of-loggers}@anchor{57f8}
@subsubsection Creating a lot of loggers


Loggers are singletons that are never freed during a script execution, and so
creating lots of loggers will use up memory which can’t then be freed. Rather
than create a logger per e.g. file processed or network connection made, use
the @ref{31ba,,existing mechanisms} for passing contextual
information into your logs and restrict the loggers created to those describing
areas within your application (generally modules, but occasionally slightly
more fine-grained than that).

@node Other resources,,Patterns to avoid,로깅 요리책
@anchor{howto/logging-cookbook cookbook-ref-links}@anchor{57b1}@anchor{howto/logging-cookbook other-resources}@anchor{57f9}
@subsection Other resources



@subsubheading 더 보기



@table @asis

@item 모듈 @ref{8b,,logging}

logging 모듈에 대한 API 레퍼런스

@item 모듈 @ref{8c,,logging.config}

logging 모듈용 구성 API.

@item 모듈 @ref{8d,,logging.handlers}

logging 모듈에 포함된 유용한 처리기.
@end table

@ref{13fa,,Basic Tutorial}

@ref{13fb,,Advanced Tutorial}


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 정규식 HOWTO,소켓 프로그래밍 HOWTO,로깅 요리책,파이썬 HOWTO
@anchor{howto/regex doc}@anchor{57fa}@anchor{howto/regex regex-howto}@anchor{2786}@anchor{howto/regex regular-expression-howto}@anchor{57fb}@anchor{howto/regex translation-repo}@anchor{57fc}
@section 정규식 HOWTO


@*저자: 
A.M. Kuchling <@email{amk@@amk.ca}>


@c TODO:
@c Document lookbehind assertions
@c Better way of displaying a RE, a string, and what it matches
@c Mention optional argument to match.groups()
@c Unicode (at least a reference)

@subsubheading 요약



이 설명서는 파이썬에서 @ref{be,,re} 모듈로 정규식을 사용하는 방법을 소개하는 입문서입니다. 라이브러리 레퍼런스의 해당 절보다 더 부드러운 소개를 제공합니다.

@menu
* 소개: 소개<9>. 
* 단순한 패턴:: 
* 정규식 사용하기:: 
* 더 많은 패턴 기능:: 
* 문자열 수정하기:: 
* 일반적인 문제들:: 
* 피드백:: 

@end menu

@node 소개<9>,단순한 패턴,,정규식 HOWTO
@anchor{howto/regex introduction}@anchor{57fd}
@subsection 소개


정규식(RE, regexes 또는 regex 패턴이라고 불립니다)은 본질적으로 파이썬에 내장된 매우 작고 고도로 특수화된 프로그래밍 언어이며, @ref{be,,re} 모듈을 통해 사용할 수 있습니다. 이 작은 언어를 사용하여, 일치시키려는 가능한 문자열 집합에 대한 규칙을 지정합니다; 이 집합은 영어 문장, 전자 메일 주소, TeX 명령 또는 원하는 어떤 것이건 포함 할 수 있습니다. 그런 다음 “이 문자열이 패턴과 일치합니까?”, 또는 “이 문자열의 어느 부분에 패턴과 일치하는 것이 있습니까?”와 같은 질문을 할 수 있습니다. 또한 RE를 사용하여 문자열을 수정하거나 여러 방법으로 분할할 수 있습니다.

정규식 패턴은 일련의 바이트 코드로 컴파일된 다음 C로 작성된 일치 엔진에 의해 실행됩니다. 고급 사용을 위해서는, 엔진이 지정된 RE를 실행하는 방법에 주의를 기울이고, 더 빠르게 실행되는 바이트 코드를 생성하기 위해 특정한 방법으로 RE를 작성하는 것이 필요할 수 있습니다. 최적화는 일치 엔진의 내부를 잘 이해하고 있어야 하므로 이 설명서에서 다루지 않습니다.

정규식 언어는 비교적 작고 제한적이므로, 정규식을 사용하여 가능한 모든 문자열 처리 작업을 수행할 수 있는 것은 아닙니다. 정규식으로 수행할 `수'는 있지만, 표현이 아주 복잡해지는 작업도 있습니다. 이럴 때, 처리하기 위한 파이썬 코드를 작성하는 것이 더 나을 수 있습니다; 파이썬 코드는 정교한 정규식보다 느리겠지만, 아마도 더 이해하기 쉬울 겁니다.

@node 단순한 패턴,정규식 사용하기,소개<9>,정규식 HOWTO
@anchor{howto/regex simple-patterns}@anchor{57fe}
@subsection 단순한 패턴


우리는 가능한 가장 단순한 정규식에 대해 배우는 것으로 시작합니다. 정규식은 문자열에 대한 연산에 사용되므로, 가장 일반적인 작업으로 시작하겠습니다: 문자 일치.

정규식의 기초가 되는 컴퓨터 과학(결정적인 혹은 비결정적인 유한 오토마타)에 대한 자세한 설명은, 컴파일러 작성에 관한 거의 모든 교과서를 참조 할 수 있습니다.

@menu
* 문자 일치:: 
* 반복하기:: 

@end menu

@node 문자 일치,반복하기,,단순한 패턴
@anchor{howto/regex matching-characters}@anchor{57ff}
@subsubsection 문자 일치


대부분 글자와 문자는 단순히 자신과 일치합니다. 예를 들어, 정규식 @code{test}는 문자열 @code{test}와 정확히 일치합니다. (이 RE가 @code{Test}나 @code{TEST}와 일치하도록 대/소문자를 구분하지 않는 모드를 활성화할 수 있습니다; 나중에 자세히 설명합니다.)

이 규칙에는 예외가 있습니다; 일부 문자는 특수한 `메타 문자 (metacharacters)'이며, 자신과 일치하지 않습니다. 그 대신, 그들은 일반적이지 않은 것을 일치시켜야 한다는 신호를 보냅니다. 또는 반복하거나 의미를 바꾸어 RE의 다른 부분에 영향을 줍니다. 이 설명서의 많은 부분은 다양한 메타 문자와 그 기능에 대해 논의하는데 할애하고 있습니다.

다음은 메타 문자의 전체 목록입니다; 이것들의 의미는 이 HOWTO의 나머지 부분에서 논의될 것입니다.

@example
. ^ $ * + ? @{ @} [ ] \ | ( )
@end example

우리가 살펴볼 첫 번째 메타 문자는 @code{[}와 @code{]}입니다. 일치시키려는 문자 집합인 문자 클래스를 지정하는 데 사용됩니다. 문자는 개별적으로 나열되거나, 두 문자를 주고 @code{'-'}로 구분하여 문자의 범위를 나타낼 수 있습니다. 예를 들어, @code{[abc]} 는 @code{a}, @code{b} 또는 @code{c} 문자와 일치합니다; 이것은 @code{[a-c]}와 같은데, 같은 문자 집합을 표현하기 위해 범위를 사용합니다. 소문자들만 일치시키려면, RE가 @code{[a-z]}가 됩니다.

메타 문자(@code{\} 제외)는 클래스 내부에서는 활성화되지 않습니다. 예를 들어, @code{[akm$]}는 @code{'a'}, @code{'k'}, @code{'m'} 또는 @code{'$'} 문자와 일치합니다; @code{'$'}는 대개 메타 문자이지만, 문자 클래스 안에서는 특수한 특성이 없어집니다.

`여집합 (complement set)'을 사용해서 클래스에 나열되지 않은 문자를 일치시킬 수 있습니다. 이것은 클래스의 첫 번째 문자로 @code{'^'}를 포함하는 것으로 나타냅니다. 예를 들어, @code{[^5]} 는 @code{'5'}를 제외한 모든 문자와 일치합니다. 캐럿이 문자 클래스의 다른 곳에 나타나면, 특별한 의미가 없습니다. 예를 들어, @code{[5^]} 는 @code{'5'}나 @code{'^'}와 일치합니다.

아마도 가장 중요한 메타 문자는 백 슬래시(@code{\})입니다. 파이썬 문자열 리터럴에서와 같이, 백 슬래시 다음에 다양한 특수 시퀀스를 알리는 다양한 문자가 따라올 수 있습니다. 또한, 모든 메타 문자를 이스케이프 처리하여 패턴으로 일치시킬 수 있도록 합니다. 예를 들어, @code{[}나 @code{\}와 일치시켜야 할 때, 특별한 의미를 제거하기 위해 앞에 백 슬래시를 붙일 수 있습니다: @code{\[}나 @code{\\}.

@code{'\'}로 시작하는 특수 시퀀스 중 일부는 숫자(digit) 집합, 글자(letter) 집합 또는 공백이 아닌 모든 것의 집합과 같이 종종 유용한 미리 정의된 문자 집합을 나타냅니다.

예를 들어 보겠습니다: @code{\w}는 모든 영숫자(alphanumeric character)와 일치합니다. 정규식 패턴을 바이트열로 표현하면, 이것은 @code{[a-zA-Z0-9_]} 클래스와 동등합니다. 정규식 패턴이 문자열이면, @code{\w}는 @ref{10b,,unicodedata} 모듈이 제공하는 유니코드 데이터베이스에서 글자(letter)로 표시된 모든 문자를 일치시킵니다. 정규식을 컴파일할 때 @ref{83d,,re.ASCII} 플래그를 제공하여 문자열 패턴에서 @code{\w}의 더 제한된 정의를 사용할 수 있습니다.

다음 특수 시퀀스 목록은 완전하지 않습니다. 유니코드 문자열 패턴에 대한 시퀀스와 확장 클래스 정의의 전체 목록은, 표준 라이브러리 레퍼런스에서 @ref{92d,,정규식 문법}의 마지막 부분을 참조하십시오. 일반적으로, 유니코드 버전은 유니코드 데이터베이스의 적절한 범주에 있는 모든 문자와 일치합니다.


@table @asis

@item @code{\d}

모든 십진 숫자와 일치합니다; 이것은 클래스 @code{[0-9]}와 동등합니다.

@item @code{\D}

모든 비 숫자 문자와 일치합니다; 이것은 클래스 @code{[^0-9]}와 동등합니다.

@item @code{\s}

모든 공백 문자와 일치합니다; 이것은 클래스 @code{[ \t\n\r\f\v]} 와 동등합니다.

@item @code{\S}

모든 비 공백 문자와 일치합니다; 이것은 클래스 @code{[^ \t\n\r\f\v]} 와 동등합니다.

@item @code{\w}

모든 영숫자(alphanumeric character)와 일치합니다; 이것은 클래스 @code{[a-zA-Z0-9_]}와 동등합니다.

@item @code{\W}

모든 비 영숫자와 일치합니다; 이것은 클래스 @code{[^a-zA-Z0-9_]}와 동등합니다.
@end table

이 시퀀스들은 문자 클래스 내에 포함될 수 있습니다. 예를 들어, @code{[\s,.]} 는 모든 공백 문자, @code{','} 또는 @code{'.'}와 일치하는 문자 클래스입니다.

이 절의 마지막 메타 문자는 @code{.}입니다. 개행 문자를 제외한 모든 문자와 일치하며, 개행 문자와도 일치하는 대체 모드(@ref{2787,,re.DOTALL})가 있습니다. @code{.} 은 “모든 문자”와 일치시키려고 할 때 자주 사용됩니다.

@node 반복하기,,문자 일치,단순한 패턴
@anchor{howto/regex repeating-things}@anchor{5800}
@subsubsection 반복하기


다양한 문자 집합을 일치시킬 수 있다는 것이 문자열에서 사용할 수 있는 메서드로 이미 가능하지 않은 것을 정규식이 수행할 수 있는 첫 번째 것입니다. 그러나, 이것이 정규식의 유일한 추가 기능이라면, 그다지 진보했다고 할 수 없습니다. 또 다른 기능은 RE의 일부가 특정 횟수만큼 반복되어야 한다고 지정할 수 있다는 것입니다.

우리가 살펴볼 반복을 위한 첫 번째 메타 문자는 @code{*}입니다. @code{*}는 리터럴 문자 @code{'*'}와 일치하지 않습니다; 대신 이전 문자를 정확히 한 번이 아닌 0번 이상 일치시킬 수 있도록 지정합니다.

예를 들어, @code{ca*t}는 @code{'ct'} (0개의 @code{'a'} 문자), @code{'cat'} (1개의 @code{'a'}), @code{'caaat'} (3개의 @code{'a'} 문자) 등과 일치합니다.

@code{*}와 같은 반복은 `탐욕스럽습니다 (greedy)'; RE를 반복할 때, 일치 엔진은 가능한 한 여러 번 반복하려고 시도합니다. 패턴의 뒷부분이 일치하지 않으면, 일치 엔진은 되돌아가서 더 작은 반복으로 다시 시도합니다.

단계별 예제를 통해 더 명확하게 알 수 있습니다. 정규식 @code{a[bcd]*b}를 생각해 봅시다. 이 문자는 @code{'a'} 문자와 일치하고, 0개 이상의 @code{[bcd]} 클래스 문자가 뒤따르고, 마지막에 @code{'b'}로 끝납니다. 이제 이 RE를 문자열 @code{'abcbd'}와 일치시킨다고 상상해보십시오.


@multitable {xxxxxxxx} {xxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

단계

@tab

일치된 것

@tab

설명

@item

1

@tab

@code{a}

@tab

RE의 @code{a}가 일치합니다.

@item

2

@tab

@code{abcbd}

@tab

엔진은 가능한 한 길게 @code{[bcd]*}와 일치시키려고 문자열의 끝까지 갑니다.

@item

3

@tab

`실패'

@tab

엔진은 @code{b}를 일치하려고 시도하지만, 현재 위치가 문자열의 끝이므로 실패합니다.

@item

4

@tab

@code{abcb}

@tab

물러서서, @code{[bcd]*}가 하나 적은 문자와 일치합니다.

@item

5

@tab

`실패'

@tab

@code{b}를 다시 시도하지만, 현재 위치는 @code{'d'} 인 마지막 문자에 있습니다.

@item

6

@tab

@code{abc}

@tab

다시 물러서서, @code{[bcd]*}가 @code{bc}하고 만 일치합니다.

@item

6

@tab

@code{abcb}

@tab

@code{b}를 다시 시도합니다. 이번에는 현재 위치의 문자가 @code{'b'}이므로 성공합니다.

@end multitable


RE의 끝에 도달했으며, @code{'abcb'}와 일치했습니다. 이것은 일치 엔진이 처음에는 갈 수 있는 데까지 가본 다음, 일치하는 것이 발견되지 않으면 점진적으로 물러서고, 나머지 RE의 나머지 부분을 반복해서 다시 시도하는 것을 보여줍니다. @code{[bcd]*}에 대한 일치 항목의 길이가 0이 될 때까지 물러서고, 그것마저도 실패하면, 엔진은 문자열이 RE와 전혀 일치하지 않는다고 결론을 내립니다.

또 다른 반복 메타 문자는 @code{+}인 데, 하나 이상과 일치합니다. @code{*}와 @code{+}의 차이점에 주의하십시오; @code{*}는 `0' 이상과 일치하므로, 반복되는 내용이 전혀 표시되지 않을 수 있습니다. 반면 @code{+}는 적어도 `1'번 이상 나타날 것을 요구합니다. 비슷한 예제를 사용하면, @code{ca+t}는 @code{'cat'} (1 @code{'a'}), @code{'caaat'} (3 @code{'a'})와 일치하지만 @code{'ct'}와 일치하지는 않습니다.

반복 연산자나 한정자가 두 개 더 있습니다. 물음표 문자 @code{?}는 한 번이나 0번 일치합니다; 무언가를 선택적이라고 표시한다고 생각해도 좋습니다. 예를 들어, @code{home-?brew}는 @code{'homebrew'}나 @code{'home-brew'}와 일치합니다.

가장 복잡한 한정자는 @code{@{m,n@}}입니다. 여기서 `m'과 `n'은 십진수입니다. 이 한정자는 적어도 `m' 반복, 최대 `n' 반복이 있어야 함을 의미합니다. 예를 들어, @code{a/@{1,3@}b}는 @code{'a/b'}, @code{'a//b'} 및 @code{'a///b'}와 일치합니다. @code{'ab'}에는 슬래시가 없어서 일치하지 않고, @code{'a////b'}에는 4개 있어서 일치하지 않습니다.

`m'이나 `n'을 생략 할 수 있습니다; 이때, 빠진 값에 대해 합리적인 값이 가정됩니다. `m'을 생략하면 0 하한으로 해석하는 반면, `m'을 생략하면 무한대의 상한을 뜻합니다.

가장 간단한 경우 @code{@{m@}}은 앞의 항목을 정확히 `m' 번 일치시킵니다. 예를 들어, @code{a/@{2@}b}는 @code{'a//b'}와만 일치합니다.

환원주의로 기울어진 독자는 다른 세 한정자들을 이 표기법을 사용하여 표현할 수 있음을 알아챌 수 있을 겁니다. @code{@{0,@}}은 @code{*}와 같고, @code{@{1,@}}은 @code{+}와 같으며, @code{@{0,1@}}은 @code{?}와 같습니다. 그럴 수 있다면 @code{*}, @code{+} 또는 @code{?}를 사용하는 것이 좋은데, 더 짧고 읽기 쉽기 때문입니다.

@node 정규식 사용하기,더 많은 패턴 기능,단순한 패턴,정규식 HOWTO
@anchor{howto/regex using-regular-expressions}@anchor{5801}
@subsection 정규식 사용하기


이제 간단한 정규식을 살펴보았습니다. 실제로 파이썬에서 어떻게 사용해야 할까요? @ref{be,,re} 모듈은 정규식 엔진에 대한 인터페이스를 제공해서, RE를 객체로 컴파일한 다음 일치를 수행 할 수 있도록 합니다.

@menu
* 정규식 컴파일하기:: 
* 백 슬래시 전염병:: 
* 일치 수행하기:: 
* 모듈 수준 함수: 모듈 수준 함수<3>. 
* 컴파일 플래그:: 

@end menu

@node 정규식 컴파일하기,백 슬래시 전염병,,정규식 사용하기
@anchor{howto/regex compiling-regular-expressions}@anchor{5802}
@subsubsection 정규식 컴파일하기


정규식은 패턴 객체로 컴파일되는데, 패턴 일치를 검색하거나 문자열 치환을 수행하는 등의 다양한 작업을 위한 메서드를 갖고 있습니다.

@example
>>> import re
>>> p = re.compile('ab*')
>>> p
re.compile('ab*')
@end example

@ref{dcd,,re.compile()}은 다양한 특수 기능과 문법 변형을 가능하게 하는 선택적 `flags' 인자도 받아들입니다. 나중에 사용할 수 있는 설정을 살펴보도록 하겠지만, 지금은 한 가지 예 만 보겠습니다:

@example
>>> p = re.compile('ab*', re.IGNORECASE)
@end example

RE는 문자열로 @ref{dcd,,re.compile()}에 전달됩니다. 정규식이 핵심 파이썬 언어의 일부가 아니고, 정규식을 표현하기 위한 특수 문법이 만들어지지 않았기 때문에 RE는 문자열로 다뤄집니다. (RE를 전혀 필요로하지 않는 응용 프로그램이 있기 때문에, 이를 포함해서 언어 사양을 부풀릴 필요가 없습니다.) 대신, @ref{be,,re} 모듈은 @ref{d1,,socket}이나 @ref{139,,zlib} 모듈과 마찬가지로 파이썬에 포함된 C 확장 모듈일 뿐입니다.

RE를 문자열에 넣는 것은 파이썬 언어가 더 간단하게 유지되도록 하지만, 다음 절의 주제인 한 가지 단점이 있습니다.

@node 백 슬래시 전염병,일치 수행하기,정규식 컴파일하기,정규식 사용하기
@anchor{howto/regex id1}@anchor{5803}@anchor{howto/regex the-backslash-plague}@anchor{5804}
@subsubsection 백 슬래시 전염병


앞에서 언급한 것처럼, 정규식은 백 슬래시 문자(@code{'\'})를 사용하여 특수 형식을 나타내거나 특수 문자 특별한 의미를 갖지 않고 사용되도록 합니다. 이것은 파이썬이 문자열 리터럴에서 같은 목적으로 같은 문자를 사용하는 것과 충돌합니다.

LaTeX 파일에서 발견되는 문자열 @code{\section}과 일치하는 RE를 작성한다고 가정해 봅시다. 프로그램 코드에 무엇을 쓸지 알아내기 위해, 일치시키고자 하는 문자열로 시작하십시오. 그런 다음, 백 슬래시와 다른 메타 문자 앞에 백 슬래시를 붙여 이스케이프 처리하면, 문자열 @code{\\section}을 얻게 됩니다. @ref{dcd,,re.compile()}에 전달되어야 하는 결과 문자열은 @code{\\section}이어야 합니다. 그러나, 이를 파이썬 문자열 리터럴로 표현하려면, 두 개의 백 슬래시를 모두 `다시' 이스케이프 처리해야 합니다.


@multitable {xxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

문자

@tab

단계

@item

@code{\section}

@tab

일치시킬 텍스트 문자열

@item

@code{\\section}

@tab

@ref{dcd,,re.compile()}을 위해 이스케이프 처리된 백 슬래시

@item

@code{"\\\\section"}

@tab

문자열 리터럴을 위해 이스케이프 처리된 백 슬래시

@end multitable


즉, 리터럴 백 슬래시와 일치시키려면, RE 문자열로 @code{'\\\\'}을 작성해야 하는데, 정규식은 @code{\\}이어야하고, 일반 파이썬 문자열 리터럴 안에서 각 백 슬래시를 @code{\\}로 표현해야 하기 때문입니다. 백 슬래시를 반복적으로 사용하는 RE에서는, 수없이 반복되는 백 슬래시로 이어져, 결과 문자열을 이해하기 어렵게 만듭니다.

해결책은 정규식에 파이썬의 날 문자열 표기법을 사용하는 것입니다; 백 슬래시는 @code{'r'} 접두사가 붙은 문자열 리터럴에서 특별한 방법으로 처리되지 않아서, @code{r"\n"}는 @code{'\'}과 @code{'n'}을 포함하는 두 문자 문자열이지만, @code{"\n"}는 줄 넘김을 포함하는 한 문자 문자열입니다. 정규식은 종종 이 날 문자열 표기법을 사용하여 파이썬 코드로 작성됩니다.

또한, 정규식에서는 유효하지만, 파이썬 문자열 리터럴에서는 유효하지 않은 특수 이스케이프 시퀀스는 이제 @ref{1a3,,DeprecationWarning}을 발생시키고 결국에는 @ref{18e,,SyntaxError}가 될 것입니다. 이는 날 문자열 표기법이나 백 슬래시 이스케이핑이 사용되지 않으면 시퀀스가 유효하지 않게 됨을 뜻합니다.


@multitable {xxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxx} 
@headitem

일반 문자열

@tab

날 문자열

@item

@code{"ab*"}

@tab

@code{r"ab*"}

@item

@code{"\\\\section"}

@tab

@code{r"\\section"}

@item

@code{"\\w+\\s+\\1"}

@tab

@code{r"\w+\s+\1"}

@end multitable


@node 일치 수행하기,모듈 수준 함수<3>,백 슬래시 전염병,정규식 사용하기
@anchor{howto/regex performing-matches}@anchor{5805}
@subsubsection 일치 수행하기


일단 컴파일된 정규식을 나타내는 객체가 있으면, 이것으로 무엇을 할까요? 패턴 객체에는 여러 가지 메서드와 어트리뷰트가 있습니다. 가장 중요한 것만 여기서 다루어집니다; 전체 목록을 보려면 @ref{be,,re} 설명서를 참조하십시오.


@multitable {xxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

메서드/어트리뷰트

@tab

목적

@item

@code{match()}

@tab

문자열의 시작 부분에서 RE가 일치하는지 판단합니다.

@item

@code{search()}

@tab

이 RE가 일치하는 위치를 찾으면서, 문자열을 훑습니다.

@item

@code{findall()}

@tab

RE가 일치하는 모든 부분 문자열을 찾아 리스트로 반환합니다.

@item

@code{finditer()}

@tab

RE가 일치하는 모든 부분 문자열을 찾아 @ref{4ca,,이터레이터}로 반환합니다.

@end multitable


@ref{2798,,match()}와 @ref{2799,,search()}는 일치하는 항목이 없으면 @code{None}을 반환합니다. 성공하면, @ref{1187,,일치 객체} 인스턴스가 반환되고, 일치에 대한 정보가 들어 있습니다: 어디에서 시작하고 끝나는지, 일치하는 부분 문자열 등입니다.

@ref{be,,re} 모듈로 대화식으로 실험해보면 알 수 있습니다.

이 HOWTO는 예제에 표준 파이썬 인터프리터를 사용합니다. 먼저, 파이썬 인터프리터를 실행하고, @ref{be,,re} 모듈을 임포트 한 다음, RE를 컴파일하십시오:

@example
>>> import re
>>> p = re.compile('[a-z]+')
>>> p
re.compile('[a-z]+')
@end example

이제, 다양한 문자열을 RE @code{[a-z]+}와 일치시켜볼 수 있습니다. @code{+}는 ‘하나 이상의 반복’을 의미하므로, 빈 문자열은 전혀 일치하지 않아야 합니다. 이때 @ref{2798,,match()}는 @code{None}을 반환해야 하며, 인터프리터는 출력을 인쇄하지 않습니다. 분명하게 하기 위해 @code{match()}의 결과를 명시적으로 인쇄 할 수 있습니다.

@example
>>> p.match("")
>>> print(p.match(""))
None
@end example

이제, 일치해야 하는 문자열을 시도해 봅시다, 가령 @code{tempo}. 이때, @ref{2798,,match()}는 @ref{1187,,일치 객체}를 반환하므로, 나중에 사용할 수 있도록 결과를 변수에 저장해야 합니다.

@example
>>> m = p.match('tempo')
>>> m
<re.Match object; span=(0, 5), match='tempo'>
@end example

이제 @ref{1187,,match object}를 조회하여 일치하는 문자열에 대한 정보를 얻을 수 있습니다. 일치 객체 인스턴스에는 여러 메서드와 어트리뷰트가 있습니다; 가장 중요한 것들은 다음과 같습니다:


@multitable {xxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

메서드/어트리뷰트

@tab

목적

@item

@code{group()}

@tab

RE와 일치하는 문자열을 반환합니다.

@item

@code{start()}

@tab

일치의 시작 위치를 반환합니다

@item

@code{end()}

@tab

일치의 끝 위치를 반환합니다

@item

@code{span()}

@tab

일치의 (시작, 끝) 위치를 포함하는 튜플을 반환합니다.

@end multitable


이 메서드를 실험해보면 곧 그 의미가 분명해질 것입니다:

@example
>>> m.group()
'tempo'
>>> m.start(), m.end()
(0, 5)
>>> m.span()
(0, 5)
@end example

@ref{122a,,group()}은 RE에 의해 일치된 부분 문자열을 반환합니다. @ref{27ab,,start()}와 @ref{27ac,,end()}는 일치의 시작과 끝 인덱스를 반환합니다. @ref{27ad,,span()}은 시작과 끝 인덱스를 단일 튜플로 반환합니다. @ref{2798,,match()} 메서드는 문자열의 시작 부분에서 RE가 일치하는지 검사하므로, @code{start()}는 항상 0입니다. 그러나, 패턴의 @ref{2799,,search()} 메서드는 문자열을 훑기 때문에, 일치가 0에서 시작하지 않을 수 있습니다.

@example
>>> print(p.match('::: message'))
None
>>> m = p.search('::: message'); print(m)
<re.Match object; span=(4, 11), match='message'>
>>> m.group()
'message'
>>> m.span()
(4, 11)
@end example

실제 프로그램에서, 가장 일반적인 스타일은 @ref{1187,,일치 객체}를 변수에 저장한 다음, @code{None}인지 확인하는 것입니다. 보통 이런 식입니다:

@example
p = re.compile( ... )
m = p.match( 'string goes here' )
if m:
    print('Match found: ', m.group())
else:
    print('No match')
@end example

두 패턴 메서드는 패턴에 대한 모든 일치를 반환합니다. @ref{279f,,findall()}은 일치하는 문자열 리스트를 반환합니다:

@example
>>> p = re.compile(r'\d+')
>>> p.findall('12 drummers drumming, 11 pipers piping, 10 lords a-leaping')
['12', '11', '10']
@end example

이 예제에서는 리터럴을 날 문자열 리터럴로 만드는 @code{r} 접두어가 필요한데, 일반적인 “요리된(cooked)” 문자열 리터럴에 있는, 정규식에서는 허락되지만, 파이썬에서 인식하지 못하는, 이스케이프 시퀀스가 이제 @ref{1a3,,DeprecationWarning}을 발생시키고, 결국에는 결국 @ref{18e,,SyntaxError}가 될 것이기 때문입니다. @ref{5804,,백 슬래시 전염병}를 참조하십시오.

@ref{279f,,findall()}은 결과로 반환하기 전에 전체 리스트를 만들어야 합니다. @ref{27a0,,finditer()} 메서드는 @ref{1187,,매치 객체} 인스턴스의 시퀀스를 @ref{4ca,,이터레이터}로 반환합니다:

@example
>>> iterator = p.finditer('12 drummers drumming, 11 ... 10 ...')
>>> iterator
<callable_iterator object at 0x...>
>>> for match in iterator:
...     print(match.span())
...
(0, 2)
(22, 24)
(29, 31)
@end example

@node 모듈 수준 함수<3>,컴파일 플래그,일치 수행하기,정규식 사용하기
@anchor{howto/regex module-level-functions}@anchor{5806}
@subsubsection 모듈 수준 함수


패턴 객체를 생성하고 메서드를 호출해야만 하는 것은 아닙니다; @ref{be,,re} 모듈은 @ref{1432,,match()}, @ref{1431,,search()}, @ref{1229,,findall()}, @ref{5a2,,sub()} 등의 최상위 수준 함수도 제공합니다. 이 함수들은 첫 번째 인자로 RE 문자열이 추가된 해당 패턴 메서드와 같은 인자를 취하고, 여전히 @code{None}이나 @ref{1187,,일치 객체} 인스턴스를 반환합니다.

@example
>>> print(re.match(r'From\s+', 'Fromage amk'))
None
>>> re.match(r'From\s+', 'From amk Thu May 14 19:12:10 1998')
<re.Match object; span=(0, 5), match='From '>
@end example

내부적으로, 이 함수는 단순히 패턴 객체를 만들고 적절한 메서드를 호출합니다. 또한 컴파일된 객체를 캐시에 저장하므로, 같은 RE를 사용하는 이후의 호출에서는 패턴을 반복해서 구문 분석할 필요가 없습니다.

이러한 모듈 수준의 함수를 사용해야 할까요, 아니면 패턴을 얻어서 메서드를 직접 호출해야 할까요? 루프 내에서 정규식에 액세스하고 있다면, 사전 컴파일이 몇 번의 함수 호출을 절약할 수 있습니다. 루프 바깥에서는, 내부 캐시 덕분에 큰 차이가 없습니다.

@node 컴파일 플래그,,모듈 수준 함수<3>,정규식 사용하기
@anchor{howto/regex compilation-flags}@anchor{5807}
@subsubsection 컴파일 플래그


컴파일 플래그를 사용하면 정규식의 작동 방식을 수정할 수 있습니다. 플래그는 @ref{be,,re} 모듈에서 @ref{1a96,,IGNORECASE}와 같은 긴 이름과 @ref{278a,,I}와 같은 간단한 한 글자 형식의 두 가지 이름으로 사용 가능합니다. (Perl의 패턴 수정자에 익숙하다면, 한 글자 형식은 같은 글자를 사용합니다; 예를 들어, @ref{2796,,re.VERBOSE}의 짧은 형식은 @ref{278f,,re.X}입니다.) 다중 플래그는 비트별 OR 하여 지정할 수 있습니다; 예를 들어, @code{re.I | re.M}은 @code{I}와 @ref{278c,,M} 플래그를 모두 설정합니다.

다음은 사용 가능한 플래그와 각 플래그에 대한 자세한 설명입니다.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

플래그

@tab

의미

@item

@ref{83d,,ASCII}, @ref{2789,,A}

@tab

@code{\w}, @code{\b}, @code{\s} 및 @code{\d}와 같은 여러 이스케이프가 해당 속성이 있는 ASCII 문자에만 일치하도록 합니다.

@item

@ref{2787,,DOTALL}, @ref{278d,,S}

@tab

@code{.}가 개행 문자를 포함한 모든 문자와 일치하도록 합니다.

@item

@ref{1a96,,IGNORECASE}, @ref{278a,,I}

@tab

대소 문자 구분 없는 일치를 수행합니다.

@item

@ref{d62,,LOCALE}, @ref{278b,,L}

@tab

로케일을 고려하는 일치를 수행합니다.

@item

@ref{2788,,MULTILINE}, @ref{278c,,M}

@tab

다중 행 일치, @code{^}와 @code{$}에 영향을 줍니다.

@item

@ref{2796,,VERBOSE}, @ref{278f,,X} (‘확장’ 용)

@tab

더 명확하고 이해하기 쉽게 정리될 수 있는 상세한 RE를 활성화합니다.

@end multitable



@deffn {데이터} re.I

@deffnx {데이터} re.IGNORECASE

대소 문자를 구분하지 않는 일치를 수행합니다; 문자 클래스와 리터럴 문자열은 대소 문자를 무시하여 문자와 일치합니다. 예를 들어 @code{[A-Z]}는 소문자와도 일치합니다. @ref{83d,,ASCII} 플래그로 ASCII가 아닌 일치를 막지 않는 한, 전체 유니코드 일치도 작동합니다. 유니코드 패턴 @code{[a-z]}나 @code{[A-Z]}가 @ref{1a96,,IGNORECASE} 플래그와 함께 사용되면, 52 ASCII 문자와 4개의 추가 비 ASCII 문자와 일치합니다: ‘İ’ (U+0130, 위에 점이 있는 라틴 대문자 I), ‘ı’ (U+0131, 라틴 소문자 점 없는 i), ‘ſ’ (U+017F, 라틴 소문자 긴 s) 및 ‘K’ (U+212A, 켈빈 기호). @code{Spam}은 @code{'Spam'}, @code{'spam'}, @code{'spAM'} 또는 @code{'ſpam'}과 일치합니다 (마지막은 유니코드 모드에서만 일치합니다). 이 소문자화는 현재 로케일을 고려하지 않습니다; 고려하려면 @ref{d62,,LOCALE} 플래그를 설정하면 됩니다.
@end deffn


@deffn {데이터} re.L

@deffnx {데이터} re.LOCALE

@code{\w}, @code{\W}, @code{\b}, @code{\B} 및 대소 문자를 구분하지 않는 일치를 유니코드 데이터베이스 대신 현재 로케일에 의존하도록 만듭니다.

로케일은 언어 차이를 고려한 프로그램을 작성하는 데 도움이 되는 C 라이브러리의 기능입니다. 예를 들어, 인코딩된 프랑스어 텍스트를 처리할 때, 단어와 일치하도록 @code{\w+}를 쓰고 싶습니다, 하지만 @code{\w}는 바이트열 패턴에서 @code{[A-Za-z]} 문자 클래스하고만 일치합니다; @code{é}나 @code{ç}에 해당하는 바이트는 일치하지 않습니다. 시스템이 올바르게 구성되고 프랑스어 로케일이 선택되면, 특정 C 함수는 @code{é}에 해당하는 바이트도 문자로 간주하여야 함을 프로그램에 알립니다. 정규식을 컴파일할 때 @ref{d62,,LOCALE} 플래그를 설정하면, 컴파일된 결과 객체가 @code{\w}에 대해 이러한 C 함수를 사용하게 됩니다; 더 느리기는 하지만, 기대하는 대로 @code{\w+}가 프랑스어 단어를 일치시킬 수 있습니다. 이 플래그의 사용은 파이썬 3에서는 권장하지 않는데, 로케일 메커니즘이 매우 신뢰성이 떨어지고, 한 번에 하나의 “컬처(culture)” 만 처리하고, 8비트 로케일에서 만 작동하기 때문입니다. 파이썬 3에서 유니코드 (str) 패턴에 대해 유니코드 일치가 기본적으로 이미 활성화되어 있으며, 다른 로케일/언어를 처리할 수 있습니다.
@end deffn


@deffn {데이터} re.M

@deffnx {데이터} re.MULTILINE

(@code{^}과 @code{$}는 아직 설명되지 않았습니다; @ref{5808,,메타 문자 더 보기} 절에서 소개될 예정입니다.)

보통 @code{^}는 문자열의 시작 부분에서만 일치하고, @code{$}는 문자열의 끝부분과 문자열 끝에 있는 줄 바꿈 (있다면) 바로 앞에서 일치합니다. 이 플래그를 지정하면 @code{^}는 문자열 시작 부분과 문자열 내의 각 줄 시작 부분(각 줄 바꿈의 바로 뒤)에서 일치합니다. 비슷하게, @code{$} 메타 문자는 문자열 끝과 각 줄의 끝(각 줄 바꿈 바로 앞)에서 일치합니다.
@end deffn


@deffn {데이터} re.S

@deffnx {데이터} re.DOTALL

@code{'.'} 특수 문자가 개행 문자를 포함하는 모든 문자와 일치하도록 만듭니다; 이 플래그가 없으면, @code{'.'}는 개행 문자를 `제외한' 모든 문자와 일치합니다.
@end deffn


@deffn {데이터} re.A

@deffnx {데이터} re.ASCII

@code{\w}, @code{\W}, @code{\b}, @code{\B}, @code{\s} 및 @code{\S}가 전체 유니코드 일치 대신 ASCII 전용 일치를 수행하도록 만듭니다. 유니코드 패턴에서만 의미가 있으며, 바이트열 패턴에서는 무시됩니다.
@end deffn


@deffn {데이터} re.X

@deffnx {데이터} re.VERBOSE

이 플래그는 정규식을 포매팅하는 더 유연한 방법을 제공해서 더 가독성 있는 정규식을 작성할 수 있도록 합니다. 이 플래그가 지정되면, 문자 클래스에 있거나 이스케이프 되지 않은 백 슬래시 뒤에 있을 때를 제외하고, RE 문자열 내의 공백을 무시합니다; 이것은 RE를 보다 명확하게 구성하고 들여쓰기 할 수 있도록 합니다. 이 플래그는 RE 내에 엔진이 무시하는 주석을 넣을 수도 있게 합니다; 주석은 문자 클래스나 이스케이프 처리되지 않은 백 슬래시 뒤에 있지 않은 @code{'#'}로 표시됩니다.

예를 들어, 여기에 @ref{2796,,re.VERBOSE}를 사용하는 RE가 있습니다; 얼마다 더 읽기 쉬워지는지 보이십니까?

@example
charref = re.compile(r"""
 &[#]                # 숫자 엔티티 참조의 시작
 (
     0[0-7]+         # 8진수 형식
   | [0-9]+          # 십진수 형식
   | x[0-9a-fA-F]+   # 16진수 형식
 )
 ;                   # 후행 세미콜론
""", re.VERBOSE)
@end example

상세 설정이 없으면, RE는 이렇게 됩니다:

@example
charref = re.compile("&#(0[0-7]+"
                     "|[0-9]+"
                     "|x[0-9a-fA-F]+);")
@end example

위의 예에서, 파이썬의 문자열 리터럴 자동 이어붙이기를 사용해서 RE를 더 작은 조각으로 나누었지만, @ref{2796,,re.VERBOSE}를 사용하는 버전보다 여전히 이해하기가 어렵습니다.
@end deffn

@node 더 많은 패턴 기능,문자열 수정하기,정규식 사용하기,정규식 HOWTO
@anchor{howto/regex more-pattern-power}@anchor{5809}
@subsection 더 많은 패턴 기능


지금까지 정규식의 일부 기능에 관해서만 설명했습니다. 이 절에서는, 몇 가지 새로운 메타 문자와 그룹을 사용하여 일치하는 텍스트의 부분을 꺼내는 방법을 다룹니다.

@menu
* 메타 문자 더 보기:: 
* 그룹:: 
* 비 포착 그룹과 이름 있는 그룹:: 
* 미리 보기 어서션:: 

@end menu

@node 메타 문자 더 보기,그룹,,더 많은 패턴 기능
@anchor{howto/regex id2}@anchor{580a}@anchor{howto/regex more-metacharacters}@anchor{5808}
@subsubsection 메타 문자 더 보기


우리가 아직 다루지 않은 몇 가지 메타 문자가 있습니다. 대부분 이 절에서 다룰 것입니다.

논의할 나머지 메타 문자 중 일부는 `폭이 없는 어서션(zero-width assertions)'입니다. 이들은 엔진이 문자열을 통해 앞으로 나아가도록 하지 않습니다; 대신, 문자를 전혀 소비하지 않고, 단순히 성공하거나 실패합니다. 예를 들어, @code{\b}는 현재 위치가 단어 경계에 위치한다는 어서션입니다; 위치는 @code{\b}에 의해 전혀 변경되지 않습니다. 이것은 폭이 없는 어서션을 반복해서는 안 된다는 뜻인데, 주어진 위치에서 일단 일치하면 명백히 무한한 횟수만큼 일치 할 수 있기 때문입니다.


@table @asis

@item @code{|}

대안, 또는 “or” 연산자. `A'와 `B'가 정규식이면, @code{A|B}는 `A'나 `B'와 일치하는 문자열과 일치합니다. @code{|}는 여러 문자로 된 문자열의 대안을 사용할 때 합리적으로 작동하도록 하기 위해 우선순위가 매우 낮습니다. @code{Crow|Servo}는 @code{'Crow'}나 @code{'Servo'}와 일치합니다, @code{'Cro'}, @code{'w'}나 @code{'S'} 그리고 @code{'ervo'}가 아닙니다.

리터럴 @code{'|'}를 일치시키려면, @code{\|}를 사용하거나 @code{[|]} 처럼 문자 클래스 안에 넣으십시오.

@item @code{^}

줄의 시작 부분에 일치합니다. @ref{2788,,MULTILINE} 플래그가 설정되어 있지 않은 한, 문자열 시작 부분에서만 일치합니다. @code{MULTILINE} 모드에서는, 문자열 내의 각 줄 바꿈 바로 뒤에서도 일치합니다.

예를 들어, @code{From}이라는 단어를 줄의 시작 부분에서만 일치시키려면, 사용할 RE는 @code{^From}입니다.

@example
>>> print(re.search('^From', 'From Here to Eternity'))
<re.Match object; span=(0, 4), match='From'>
>>> print(re.search('^From', 'Reciting From Memory'))
None
@end example

리터럴 @code{'^'}를 일치시키려면, @code{\^}를 사용하십시오.

@item @code{$}

줄의 끝부분과 일치하는데, 문자열의 끝이나 줄 바꿈 문자 다음에 오는 모든 위치로 정의됩니다.

@example
>>> print(re.search('@}$', '@{block@}'))
<re.Match object; span=(6, 7), match='@}'>
>>> print(re.search('@}$', '@{block@} '))
None
>>> print(re.search('@}$', '@{block@}\n'))
<re.Match object; span=(6, 7), match='@}'>
@end example

리터럴 @code{'$'}를 일치시키려면, @code{\$}를 사용하거나 @code{[$]} 처럼 문자 클래스 안에 넣으십시오.

@item @code{\A}

문자열의 시작 부분에서만 일치합니다. @ref{2788,,MULTILINE} 모드가 아닐 때, @code{\A}와 @code{^}는 실질적으로 같습니다. @code{MULTILINE} 모드에서는, 다릅니다: @code{\A}는 여전히 문자열의 시작 부분에서만 일치하지만, @code{^}는 문자열 내의 줄 바꿈 문자 뒤에 오는 모든 위치에서 일치 할 수 있습니다.

@item @code{\z}

문자열 끝부분에서만 일치합니다.

@item @code{\Z}

The same as @code{\z}.  For compatibility with old Python versions.

@item @code{\b}

단어 경계. 이것은 단어(word)의 시작이니 끝부분에서만 일치하는 폭이 없는 어서션입니다. 단어는 영숫자 문자의 시퀀스로 정의되므로, 단어의 끝은 공백이나 영숫자가 아닌 문자로 표시됩니다.

다음 예제는 완전한 단어일 때만 @code{class}와 일치합니다. 다른 단어 안에 포함되어 있으면 일치하지 않습니다.

@example
>>> p = re.compile(r'\bclass\b')
>>> print(p.search('no class at all'))
<re.Match object; span=(3, 8), match='class'>
>>> print(p.search('the declassified algorithm'))
None
>>> print(p.search('one subclass is'))
None
@end example

이 특수 시퀀스를 사용할 때 기억해야 할 두 가지 미묘한 점이 있습니다. 첫째, 이것은 파이썬의 문자열 리터럴과 정규식 시퀀스 간의 최악의 충돌입니다. 파이썬의 문자열 리터럴에서 @code{\b}는 ASCII 값 8을 갖는 백스페이스 문자입니다. 날 문자열을 사용하지 않으면, 파이썬이 @code{\b}를 백스페이스로 변환하고, 여러분의 RE는 예상대로 일치하지 않습니다. 다음 예제는 앞의 RE와 같아 보이지만, RE 문자열 앞의 @code{'r'}가 빠졌습니다.

@example
>>> p = re.compile('\bclass\b')
>>> print(p.search('no class at all'))
None
>>> print(p.search('\b' + 'class' + '\b'))
<re.Match object; span=(0, 7), match='\x08class\x08'>
@end example

둘째, 이 어서선이 사용되지 않는 문자 클래스 내에서, @code{\b}는 파이썬의 문자열 리터럴과의 호환성을 위해 백스페이스 문자를 나타냅니다.

@item @code{\B}

또 다른 폭이 없는 어서션, 이것은 @code{\b}의 반대이며, 현재 위치가 단어 경계에 있지 않을 때만 일치합니다.
@end table

@node 그룹,비 포착 그룹과 이름 있는 그룹,메타 문자 더 보기,더 많은 패턴 기능
@anchor{howto/regex grouping}@anchor{580b}
@subsubsection 그룹


종종 단지 RE가 일치하는지보다 많은 정보를 얻을 필요가 있습니다. 정규식은 종종 관심 있는 다른 구성 요소와 일치하는 몇 개의 서브 그룹으로 나누어진 RE를 작성하여 문자열을 해부하는 데 사용됩니다. 예를 들어, RFC-822 헤더 행은 다음과 같이 @code{':'}로 구분된 헤더 이름과 값으로 나뉩니다:

@example
From: author@@example.com
User-Agent: Thunderbird 1.5.0.9 (X11/20061227)
MIME-Version: 1.0
To: editor@@example.com
@end example

이것은 전체 헤더 행과 일치하는 정규식을 작성하고, 헤더 이름과 일치하는 그룹 하나와 헤더 값과 일치하는 다른 그룹을 가짐으로써 처리 할 수 있습니다.

그룹은 @code{'('}, @code{')'} 메타 문자로 표시됩니다. @code{'('}와 @code{')'}는 수학적 표현에서와 거의 같은 의미가 있습니다; 내부에 포함된 표현식을 함께 묶고, @code{*}, @code{+}, @code{?} 또는 @code{@{m,n@}}과 같은 한정자로 그룹의 내용을 반복 할 수 있습니다. 예를 들어, @code{(ab)*}는 @code{ab}를 0번 이상 반복한 것에 일치합니다.

@example
>>> p = re.compile('(ab)*')
>>> print(p.match('ababababab').span())
(0, 10)
@end example

@code{'('}, @code{')'}로 표시된 그룹은 일치하는 텍스트의 시작과 끝 인덱스도 포착합니다; 이것은 @ref{122a,,group()}, @ref{27ab,,start()}, @ref{27ac,,end()} 및 @ref{27ad,,span()}에 인자를 전달하여 꺼낼 수 있습니다. 그룹은 0부터 시작하여 번호가 매겨집니다. 그룹 0은 항상 존재합니다; 이것은 전체 RE이므로 @ref{1187,,일치 객체} 메서드는 모두 그룹 0을 기본 인자로 사용합니다. 나중에 일치하는 텍스트 범위를 포착하지 않는 그룹을 표현하는 방법을 살펴보겠습니다.

@example
>>> p = re.compile('(a)b')
>>> m = p.match('ab')
>>> m.group()
'ab'
>>> m.group(0)
'ab'
@end example

서브 그룹은 왼쪽에서 오른쪽으로 1부터 위로 번호가 매겨집니다. 그룹은 중첩될 수 있습니다; 숫자를 결정하려면, 왼쪽에서 오른쪽으로 가면서 여는 괄호 문자를 세십시오.

@example
>>> p = re.compile('(a(b)c)d')
>>> m = p.match('abcd')
>>> m.group(0)
'abcd'
>>> m.group(1)
'abc'
>>> m.group(2)
'b'
@end example

@ref{122a,,group()}으로는 한 번에 여러 개의 그룹 번호를 전달할 수 있으며, 이때 해당 그룹에 해당하는 값을 포함하는 튜플을 반환합니다.

@example
>>> m.group(2,1,2)
('b', 'abc', 'b')
@end example

@ref{122b,,groups()} 메서드는 모든 서브 그룹에 대한 문자열을 포함하는 튜플을 반환합니다,  1에서 최대까지.

@example
>>> m.groups()
('abc', 'b')
@end example

패턴의 역참조를 사용하면 이전 포착 그룹의 내용이 문자열의 현재 위치에서도 발견되어야 한다고 지정할 수 있습니다. 예를 들어, @code{\1}은 그룹 1의 정확한 내용이 현재 위치에서 발견되면 성공하고, 그렇지 않으면 실패합니다. 파이썬의 문자열 리터럴은 백 슬래시 뒤에 숫자를 붙여 문자열에 임의의 문자를 포함할 수 있기 때문에, RE에 역참조를 포함할 때 날 문자열을 사용해야 합니다.

예를 들어, 다음 RE는 문자열에서 중복 단어를 감지합니다.

@example
>>> p = re.compile(r'\b(\w+)\s+\1\b')
>>> p.search('Paris in the the spring').group()
'the the'
@end example

이와 같은 역참조는 단순히 문자열을 검색하는 데는 별로 유용하지 않습니다 — 이런 식으로 데이터를 반복하는 텍스트 형식은 거의 없습니다 — 하지만 곧 문자열 치환을 수행할 때 `아주' 유용하다는 것을 알게 될 것입니다.

@node 비 포착 그룹과 이름 있는 그룹,미리 보기 어서션,그룹,더 많은 패턴 기능
@anchor{howto/regex non-capturing-and-named-groups}@anchor{580c}
@subsubsection 비 포착 그룹과 이름 있는 그룹


정교한 RE는 관심 있는 부분 문자열을 포착하고 RE 자체를 그룹화하고 구조화하기 위해 많은 그룹을 사용할 수 있습니다. 복잡한 RE에서는, 그룹 번호를 추적하기가 어려워집니다. 이 문제를 해결하는 데 도움이 되는 두 가지 기능이 있습니다. 둘 다 정규식 확장에 같은 문법을 사용하므로, 그것부터 살펴보겠습니다.

Perl 5는 표준 정규식에 대한 강력한 추가 기능으로 유명합니다. 이러한 새로운 기능을 위해 Perl 개발자는 Perl의 정규식을 표준 RE와 혼란스러울 만큼 다르게 만들지 않으면서 한 글자 메타 문자나 @code{\}로 시작하는 새로운 특수 시퀀스를 선택할 수 없었습니다. 예를 들어, @code{&}를 새로운 메타 문자로 선택하면, 예전 정규식은 @code{&}가 일반 문자라고 가정하고 @code{\&}나 @code{[&]}로 작성하여 이스케이프 하지 않을 것입니다.

Perl 개발자가 선택한 해법은 @code{(?...)}를 확장 문법으로 사용하는 것입니다. 괄호 바로 뒤에 있는 @code{?}는 @code{?}가 반복할 것이 없기 때문에 문법 에러였습니다. 따라서 이것은 어떤 호환성 문제도 일으키지 않습니다. @code{?} 다음에 나오는 문자는 어떤 확장이 사용되는지 나타내므로, @code{(?=foo)} 는 한가지 확장이고 (긍정적인 미리 보기 어서션), @code{(?:foo)} 는 또 다른 것입니다 (서브 정규식 @code{foo}를 포함하는 비 포착 그룹).

파이썬은 여러 Perl의 확장을 지원하고 Perl의 확장 문법에 확장 문법을 추가합니다. 물음표 뒤의 첫 번째 문자가 @code{P}이면, 파이썬에 특유한 확장임을 알 수 있습니다.

이제 일반적인 확장 문법을 살펴보았으므로, 복잡한 RE에서 그룹 작업을 단순화하는 기능으로 돌아갈 수 있습니다.

때로 그룹을 사용하여 정규식의 일부를 나타내고 싶지만, 그룹의 내용을 꺼내는 데는 관심이 없습니다. 이 사실을 비 포착 그룹을 사용해서 명시적으로 만들 수 있습니다: @code{(?:...)}, 여기서 @code{...}을 다른 정규식으로 바꿀 수 있습니다.

@example
>>> m = re.match("([abc])+", "abc")
>>> m.groups()
('c',)
>>> m = re.match("(?:[abc])+", "abc")
>>> m.groups()
()
@end example

그룹과 일치하는 내용을 꺼낼 수 없다는 점을 제외하면, 비 포착 그룹은 포착 그룹과 정확히 같게 작동합니다; 안에 어떤 것이든 넣을 수 있고, @code{*}와 같은 반복 메타 문자로 반복할 수 있고, 다른 그룹(포착이나 비 포착) 내에 중첩할 수 있습니다. @code{(?:...)}는 기존 패턴을 수정할 때 특히 유용합니다. 다른 모든 그룹의 번호가 매겨지는 방식을 변경하지 않고 새 그룹을 추가 할 수 있기 때문입니다. 포착 그룹과 비 포착 그룹을 검색할 때 성능 차이가 없다는 점을 짚고 넘어가야 할 것 같습니다; 두 형태 중 어느 것도 다른 것보다 빠르지 않습니다.

더 중요한 기능은 이름 있는 그룹입니다: 번호로 참조하는 대신, 이름으로 그룹을 참조 할 수 있습니다.

이름 있는 그룹의 문법은 파이썬 특정 확장 중 하나입니다: @code{(?P<name>...)}. `name'은, 당연히, 그룹의 이름입니다. 이름 있는 그룹은 포착 그룹과 똑같이 동작하며, 추가로 이름을 그룹과 연관시킵니다. 포착 그룹을 다루는 @ref{1187,,일치 객체} 메서드는 모두 숫자로 그룹을 가리키는 정수나 원하는 그룹의 이름을 포함하는 문자열을 받아들입니다. 이름 있는 그룹에는 여전히 번호가 매겨지므로, 두 가지 방법으로 그룹에 대한 정보를 꺼낼 수 있습니다:

@example
>>> p = re.compile(r'(?P<word>\b\w+\b)')
>>> m = p.search( '(((( Lots of punctuation )))' )
>>> m.group('word')
'Lots'
>>> m.group(1)
'Lots'
@end example

또한, @ref{27aa,,groupdict()}로 이름 있는 그룹을 딕셔너리로 꺼낼 수 있습니다:

@example
>>> m = re.match(r'(?P<first>\w+) (?P<last>\w+)', 'Jane Doe')
>>> m.groupdict()
@{'first': 'Jane', 'last': 'Doe'@}
@end example

이름 있는 그룹은 숫자를 기억하는 대신 쉽게 기억할 수 있는 이름을 사용할 수 있어서 편리합니다. 다음은 @ref{78,,imaplib} 모듈에서 온 예제 RE입니다:

@example
InternalDate = re.compile(r'INTERNALDATE "'
        r'(?P<day>[ 123][0-9])-(?P<mon>[A-Z][a-z][a-z])-'
        r'(?P<year>[0-9][0-9][0-9][0-9])'
        r' (?P<hour>[0-9][0-9]):(?P<min>[0-9][0-9]):(?P<sec>[0-9][0-9])'
        r' (?P<zonen>[-+])(?P<zoneh>[0-9][0-9])(?P<zonem>[0-9][0-9])'
        r'"')
@end example

그룹 9를 꺼내는 것을 기억하는 대신, @code{m.group('zonem')}을 꺼내기가 훨씬 쉽습니다.

@code{(...)\1}과 같은 정규식에서 역참조 문법은 그룹 번호를 나타냅니다. 자연스럽게 번호 대신 그룹 이름을 사용하는 변형이 있습니다. 이것은 다른 파이썬 확장입니다: @code{(?P=name)}은 `name'이라는 그룹의 내용이 현재 위치에서 다시 일치해야 함을 나타냅니다. 중복된 단어를 찾는 정규식인 @code{\b(\w+)\s+\1\b}는 @code{\b(?P<word>\w+)\s+(?P=word)\b}로 표현할 수도 있습니다:

@example
>>> p = re.compile(r'\b(?P<word>\w+)\s+(?P=word)\b')
>>> p.search('Paris in the the spring').group()
'the the'
@end example

@node 미리 보기 어서션,,비 포착 그룹과 이름 있는 그룹,더 많은 패턴 기능
@anchor{howto/regex lookahead-assertions}@anchor{580d}
@subsubsection 미리 보기 어서션


또 다른 폭이 없는 어서션은 미리 보기 어서션(lookahead assertion)입니다. 미리 보기 어서션은 긍정과 부정 형식 모두 제공되며, 다음과 같이 표시됩니다:


@table @asis

@item @code{(?=...)}

긍정적인 미리 보기 어서션. 포함된 정규식(여기에서는 @code{...}로 표시되었습니다)이 현재 위치에서 성공적으로 일치하면 성공하고, 그렇지 않으면 실패합니다. 그러나, 일단 포함된 정규식이 시도되면, 일치 엔진은 전혀 앞으로 나아가지 않습니다; 어서선이 시작한 곳에서 나머지 패턴을 시도합니다.

@item @code{(?!...)}

부정적인 미리 보기 어서션. 이것은 긍정적인 어서션의 반대입니다; 포함된 정규식이 문자열의 현재 위치에서 일치하지 `않으면' 성공합니다.
@end table

이를 구체적으로 설명하기 위해, 미리 보기가 유용한 경우를 살펴보겠습니다. 파일 이름을 일치시키고 @code{.}로 구분된 기본 이름과 확장자로 분리하는 간단한 패턴을 생각해봅시다. 예를 들어, @code{news.rc}에서, @code{news}는 기본 이름이고 @code{rc}는 파일명의 확장자입니다.

이것과 일치하는 패턴은 매우 간단합니다:

@code{.*[.].*$}

@code{.}는 메타 문자이므로 특수하게 처리해야 하므로, 해당 문자에만 일치하기 위해 문자 클래스 내에 있습니다. 또한 후행 @code{$}도 유의하십시오; 나머지 문자열이 확장에 포함되어야 함을 보장하기 위해 추가됩니다. 이 정규식은 @code{foo.bar}와 @code{autoexec.bat}와 @code{sendmail.cf}와 @code{printers.conf}와 일치합니다.

자, 문제를 조금 복잡하게 생각해보십시오; 확장자가 @code{bat}이 아닌 파일명을 일치시키려면 어떻게 해야 합니까? 몇 가지 잘못된 시도:

@code{.*[.][^b].*$}

The first attempt above tries to exclude @code{bat} by requiring
that the first character of the extension is not a @code{b}.  This is wrong,
because the pattern also doesn’t match @code{foo.bar}.

@code{.*[.]([^b]..|.[^a].|..[^t])$}

다음에서 하나를 요구하여 첫 번째 해결 방법을 패치할 때 정규식이 더 복잡해집니다: 확장자의 첫 번째 문자가 @code{b}가 아닙니다; 두 번째 문자가 @code{a}가 아닙니다; 또는 세 번째 문자가 @code{t}가 아닙니다. 이것은 @code{foo.bar}를 받아들이고 @code{autoexec.bat}를 거부하지만, 세 문자 확장자를 요구하고 @code{sendmail.cf}와 같은 두 문자로 된 확장자를 가진 파일명을 허용하지 않습니다. 문제를 해결하기 위해 패턴을 다시 복잡하게 만들 것입니다.

@code{.*[.]([^b].?.?|.[^a]?.?|..?[^t]?)$}

세 번째 시도에서, @code{sendmail.cf}와 같이 세 문자보다 짧은 확장자를 허용하기 위해 두 번째와 세 번째 문자는 모두 선택적입니다.

이제 패턴이 정말 복잡해져서, 읽고 이해하기 어렵습니다. 더욱이, 문제가 변경되어 확장자 @code{bat}와 @code{exe}를 모두 제외하려면, 패턴이 훨씬 복잡하고 혼란스러워집니다.

부정적인 미리 보기는 이 모든 혼란을 제거합니다:

@code{.*[.](?!bat$)[^.]*$}

The negative lookahead means: if the expression @code{bat}
doesn’t match at this point, try the rest of the pattern; if @code{bat$} does
match, the whole pattern will fail.  The trailing @code{$} is required to ensure
that something like @code{sample.batch}, where the extension only starts with
@code{bat}, will be allowed.  The @code{[^.]*} makes sure that the pattern works
when there are multiple dots in the filename.

다른 파일명 확장자를 제외하는 것이 이제는 쉽습니다; 단순히 어서션 안에 대안으로 추가하십시오. 다음 패턴은 @code{bat}나 @code{exe}로 끝나는 파일명을 제외합니다:

@code{.*[.](?!bat$|exe$)[^.]*$}

@node 문자열 수정하기,일반적인 문제들,더 많은 패턴 기능,정규식 HOWTO
@anchor{howto/regex modifying-strings}@anchor{580e}
@subsection 문자열 수정하기


지금까지는, 정적 문자열에 대한 검색만 수행했습니다. 정규식은 다음과 같은 패턴 메서드를 사용하여 다양한 방법으로 문자열을 수정하는 데 흔히 사용됩니다:


@multitable {xxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

메서드/어트리뷰트

@tab

목적

@item

@code{split()}

@tab

RE가 일치하는 모든 곳에서 분할하여, 문자열을 리스트로 분할합니다

@item

@code{sub()}

@tab

RE가 일치하는 모든 부분 문자열을 찾고, 다른 문자열로 대체합니다.

@item

@code{subn()}

@tab

@code{sub()}와 같은 일을 하지만, 새로운 문자열과 치환 횟수를 반환합니다

@end multitable


@menu
* 문자열 분할하기:: 
* 검색과 치환: 검색과 치환<2>. 

@end menu

@node 문자열 분할하기,검색과 치환<2>,,문자열 수정하기
@anchor{howto/regex splitting-strings}@anchor{580f}
@subsubsection 문자열 분할하기


패턴의 @ref{279e,,split()} 메서드는 RE가 일치하는 모든 곳에서 문자열을 분할하여, 조각의 리스트를 반환합니다. 이것은 @ref{10a9,,split()} 문자열 메서드와 비슷하지만 분리하는 데 사용되는 구분자에 훨씬 더 일반성을 제공합니다; 문자열 @code{split()}는 공백이나 고정 문자열로의 분할 만 지원합니다. 예상대로, 모듈 수준의 @ref{5a1,,re.split()} 함수도 있습니다.


@deffn {메서드} .split (string[, maxsplit=0])

정규식과 일치하는 것으로 `string'을 분할합니다. RE에서 포착하는 괄호가 사용되면, 해당 내용도 결과 리스트의 일부로 반환됩니다. `maxsplit'가 0이 아니면, 최대 `maxsplit' 번 분할만 수행됩니다.
@end deffn

`maxsplit' 값을 전달하여, 분할 수를 제한 할 수 있습니다. `maxsplit'가 0이 아니면, 최대 `maxsplit' 번 분할만 이루어지고, 나머지 문자열은 리스트의 마지막 요소로 반환됩니다. 다음 예제에서, 구분자는 영숫자가 아닌 문자 시퀀스입니다.

@example
>>> p = re.compile(r'\W+')
>>> p.split('This is a test, short and sweet, of split().')
['This', 'is', 'a', 'test', 'short', 'and', 'sweet', 'of', 'split', '@w{'}]
>>> p.split('This is a test, short and sweet, of split().', 3)
['This', 'is', 'a', 'test, short and sweet, of split().']
@end example

때로는 구분자 사이의 텍스트가 무엇인지에 관심이 있을 뿐만 아니라, 구분자가 무엇인지도 알아야 할 필요가 있습니다. RE에서 포착하는 괄호가 사용되면, 해당 값도 리스트의 일부로 반환됩니다. 다음 호출을 비교하십시오:

@example
>>> p = re.compile(r'\W+')
>>> p2 = re.compile(r'(\W+)')
>>> p.split('This... is a test.')
['This', 'is', 'a', 'test', '@w{'}]
>>> p2.split('This... is a test.')
['This', '... ', 'is', ' ', 'a', ' ', 'test', '.', '@w{'}]
@end example

모듈 수준 함수 @ref{5a1,,re.split()}는 첫 번째 인자로 사용할 RE를 추가하지만, 이를 제외하고는 같습니다.

@example
>>> re.split(r'[\W]+', 'Words, words, words.')
['Words', 'words', 'words', '@w{'}]
>>> re.split(r'([\W]+)', 'Words, words, words.')
['Words', ', ', 'words', ', ', 'words', '.', '@w{'}]
>>> re.split(r'[\W]+', 'Words, words, words.', 1)
['Words', 'words, words.']
@end example

@node 검색과 치환<2>,,문자열 분할하기,문자열 수정하기
@anchor{howto/regex search-and-replace}@anchor{5810}
@subsubsection 검색과 치환


또 다른 흔한 작업은 패턴에 대한 모든 일치를 찾아 다른 문자열로 치환하는 것입니다. @ref{27a1,,sub()} 메서드는 치환 값(문자열이나 함수일 수 있습니다)과 처리할 문자열을 취합니다.


@deffn {메서드} .sub (replacement, string[, count=0])

`string'에서 가장 왼쪽에 나타나는 겹쳐지지 않은 RE의 일치를 `replacement'로 치환한 문자열을 반환합니다. 패턴이 없으면, `string'이 변경 없이 반환됩니다.

선택적 인자 `count'는 치환될 패턴 일치의 최대 수입니다; `count'는 음수가 아닌 정수여야 합니다. 기본값 0은 모든 일치를 치환하는 것을 의미합니다.
@end deffn

다음은 @ref{27a1,,sub()} 메서드를 사용하는 간단한 예제입니다. 색상 이름을 @code{colour}라는 단어로 바꿉니다:

@example
>>> p = re.compile('(blue|white|red)')
>>> p.sub('colour', 'blue socks and red shoes')
'colour socks and colour shoes'
>>> p.sub('colour', 'blue socks and red shoes', count=1)
'colour socks and red shoes'
@end example

@ref{27a2,,subn()} 메서드는 같은 작업을 수행하지만, 새 문자열 값과 수행된 치환 수가 포함된 2-튜플을 반환합니다:

@example
>>> p = re.compile('(blue|white|red)')
>>> p.subn('colour', 'blue socks and red shoes')
('colour socks and colour shoes', 2)
>>> p.subn('colour', 'no colours at all')
('no colours at all', 0)
@end example

빈 일치는 이전의 빈 일치와 인접하지 않은 경우에만 치환됩니다.

@example
>>> p = re.compile('x*')
>>> p.sub('-', 'abxd')
'-a-b--d-'
@end example

`replacement'가 문자열이면, 그 안에 있는 모든 역 슬래시 이스케이프가 처리됩니다. 즉, @code{\n}은 단일 개행 문자로 변환되고, @code{\r}은 캐리지 리턴으로 변환되고, 나머지도 마찬가지입니다. @code{\&}와 같은 알 수 없는 이스케이프는 그대로 남습니다. @code{\6}과 같은 역참조는 RE의 해당 그룹과 일치하는 부분 문자열로 치환됩니다. 이렇게 하면 결과 치환 문자열에 원본 텍스트의 일부를 통합할 수 있습니다.

이 예제는 뒤에 @code{@{}, @code{@}}로 묶인 문자열이 오는 단어 @code{section}과 일치하고, @code{section}을 @code{subsection}으로 변경합니다:

@example
>>> p = re.compile('section@{ ( [^@}]* ) @}', re.VERBOSE)
>>> p.sub(r'subsection@{\1@}','section@{First@} section@{second@}')
'subsection@{First@} subsection@{second@}'
@end example

또한 @code{(?P<name>...)} 문법으로 정의된 이름 있는 그룹을 참조하기 위한 문법이 있습니다. @code{\g<name>}은 @code{name} 그룹과 일치하는 부분 문자열을 사용하고, @code{\g<number>}는 해당 그룹 번호를 사용합니다. 따라서 @code{\g<2>}는 @code{\2}와 동등하지만, @code{\g<2>0}과 같은 치환 문자열에서 모호하지 않습니다. (@code{\20}은 @code{'0'}이 뒤에 오는 그룹 2에 대한 참조가 아닌, 그룹 20에 대한 참조로 해석됩니다.) 다음 치환은 모두 동등하지만, 치환 문자열의 세 가지 변형을 모두 사용합니다.

@example
>>> p = re.compile('section@{ (?P<name> [^@}]* ) @}', re.VERBOSE)
>>> p.sub(r'subsection@{\1@}','section@{First@}')
'subsection@{First@}'
>>> p.sub(r'subsection@{\g<1>@}','section@{First@}')
'subsection@{First@}'
>>> p.sub(r'subsection@{\g<name>@}','section@{First@}')
'subsection@{First@}'
@end example

`replacement'는 함수일 수도 있는데, 더 많은 제어를 제공합니다. `replacement'가 함수면, `pattern'의 겹쳐지지 않는 모든 일치에 대해 함수가 호출됩니다. 각 호출에서, 함수는 그 일치에 대한 @ref{1187,,일치 객체} 인자를 전달받고, 이 정보를 사용하여 원하는 치환 문자열을 계산하고 이를 반환 할 수 있습니다.

다음 예제에서, 치환 함수는 십진수를 16진수로 변환합니다:

@example
>>> def hexrepl(match):
...     "십진수의 16진수 문자열을 반환합니다"
...     value = int(match.group())
...     return hex(value)
...
>>> p = re.compile(r'\d+')
>>> p.sub(hexrepl, 'Call 65490 for printing, 49152 for user code.')
'Call 0xffd2 for printing, 0xc000 for user code.'
@end example

모듈 수준의 @ref{5a2,,re.sub()} 함수를 사용할 때, 패턴은 첫 번째 인자로 전달됩니다. 패턴은 객체나 문자열로 제공될 수 있습니다; 정규식 플래그를 지정해야 하면, 패턴 객체를 첫 번째 매개 변수로 사용하거나 패턴 문자열에 포함된 수정자를 사용해야 합니다, 예를 들어 @code{sub("(?i)b+", "x", "bbbb BBBB")}는 @code{'x x'}를 반환합니다.

@node 일반적인 문제들,피드백,문자열 수정하기,정규식 HOWTO
@anchor{howto/regex common-problems}@anchor{5811}
@subsection 일반적인 문제들


정규식은 일부 응용을 위한 강력한 도구이지만, 어떤 면에서는 동작이 직관적이지 않고 때때로 예상대로 동작하지 않을 수도 있습니다. 이 절에서는 가장 일반적인 함정 중 일부를 지적합니다.

@menu
* 문자열 메서드를 사용하십시오:: 
* match()와 search() 비교: match 와 search 비교. 
* 탐욕적 과 비 탐욕적 비교:: 
* re.VERBOSE 사용하기: re VERBOSE 사용하기. 

@end menu

@node 문자열 메서드를 사용하십시오,match 와 search 비교,,일반적인 문제들
@anchor{howto/regex use-string-methods}@anchor{5812}
@subsubsection 문자열 메서드를 사용하십시오


때때로 @ref{be,,re} 모듈을 사용하는 것은 실수입니다. 고정된 문자열이나 단일 문자 클래스와 일치시키려고 하고, @ref{1a96,,IGNORECASE} 플래그와 같은 @code{re} 기능을 사용하지 않는다면, 정규식의 모든 기능이 필요하지 않을 수 있습니다. 문자열은 고정 문자열을 사용하는 연산을 수행하는 몇 가지 메서드를 가지고 있으며, 대개 훨씬 빠릅니다. 더 크고, 더 일반화된 정규식 엔진 대신, 구현이 목적에 맞게 최적화된 단일하고 작은 C 루프이기 때문입니다.

한가지 예는 하나의 고정 된 문자열을 다른 것으로 치환하는 것일 수 있습니다; 예를 들어, @code{word}를 @code{deed}로 바꿀 수 있습니다. @ref{5a2,,re.sub()}가 이를 위한 함수인 것처럼 보이지만, @ref{4b9,,replace()} 메서드를 고려하십시오. @code{replace()}는 또한 단어 안에 있는 @code{word}를 치환해서, @code{swordfish}를 @code{sdeedfish}로 바꾸지만, 나이브한 RE @code{word}도 그렇게 했을 것입니다. (단어의 일부에 대한 치환을 수행하는 것을 피하고자, 패턴은 @code{word} 양쪽에 단어 경계가 있도록 @code{\bword\b}여야 합니다. 이 작업은 @code{replace()}의 능력을 넘어섭니다.)

또 다른 일반적인 작업은 문자열에서 단일 문자를 모두 삭제하거나 다른 단일 문자로 바꾸는 것입니다. @code{re.sub('\n', ' ', S)}와 같은 방식으로 이 작업을 수행 할 수 있지만, @ref{2648,,translate()}는 두 가지 작업을 모두 수행 할 수 있으며 정규식 연산보다 빠릅니다.

정리하면, @ref{be,,re} 모듈을 사용하기 전에, 더 빠르고 간단한 문자열 메서드로 문제를 해결할 수 있는지 고려하십시오.

@node match 와 search 비교,탐욕적 과 비 탐욕적 비교,문자열 메서드를 사용하십시오,일반적인 문제들
@anchor{howto/regex match-versus-search}@anchor{5813}
@subsubsection match()와 search() 비교


@ref{1432,,match()} 함수는 문자열 시작 부분에서 RE가 일치하는지만 확인하는 반면, @ref{1431,,search()}는 일치를 찾기 위해 문자열을 정방향으로 검색합니다. 이 차이를 염두에 두는 것이 중요합니다. 기억하십시오, @code{match()}는 0에서 시작하는 성공적인 일치만을 보고합니다; 일치가 0에서 시작하지 않으면, @code{match()}는 이를 보고하지 `않습니다'.

@example
>>> print(re.match('super', 'superstition').span())
(0, 5)
>>> print(re.match('super', 'insuperable'))
None
@end example

반면에, @ref{1431,,search()}는 문자열을 정방향으로 검색하여, 발견된 첫 번째 일치를 보고합니다.

@example
>>> print(re.search('super', 'superstition').span())
(0, 5)
>>> print(re.search('super', 'insuperable').span())
(2, 7)
@end example

때로 @ref{1432,,re.match()}를 계속 사용하면서, 단지 @code{.*}를 RE 앞에 추가하고 싶을 수 있습니다. 이 유혹에 저항하고, 대신 @ref{1431,,re.search()}를 사용하십시오. 정규식 컴파일러는 일치를 찾는 프로세스의 속도를 높이기 위해 RE에 대한 분석을 수행합니다. 그러한 분석의 하나는 일치의 첫 번째 문자가 무엇인지 알아내는 것입니다; 예를 들어, @code{Crow}로 시작하는 패턴은 @code{'C'}로 시작하는 것과 일치해야 합니다. 이 분석을 통해 엔진은 시작 문자를 찾기 위해 문자열을 빠르게 검색하고, @code{'C'}가 발견될 때만 전체 일치를 시도합니다.

@code{.*}를 추가하면 이 최적화가 실패하고, 문자열의 끝부분까지 스캔한 다음, RE의 나머지에 대한 일치를 찾기 위해 역 추적합니다. 대신 @ref{1431,,re.search()}를 사용하십시오.

@node 탐욕적 과 비 탐욕적 비교,re VERBOSE 사용하기,match 와 search 비교,일반적인 문제들
@anchor{howto/regex greedy-versus-non-greedy}@anchor{5814}
@subsubsection 탐욕적 과 비 탐욕적 비교


@code{a*}에서와같이 정규식을 반복할 때, 결과 동작은 가능한 한 많은 패턴을 소비하는 것입니다. 이 사실은 HTML 태그를 둘러싼 화살 괄호(angle brackets)와 같이 쌍을 이루는 구분 기호 쌍을 일치시키려고 할 때 여러분을 물어뜯을 수 있습니다. 하나의 HTML 태그를 일치하는 나이브한 패턴은 @code{.*}의 탐욕스러운 성격 때문에 작동하지 않습니다.

@example
>>> s = '<html><head><title>Title</title>'
>>> len(s)
32
>>> print(re.match('<.*>', s).span())
(0, 32)
>>> print(re.match('<.*>', s).group())
<html><head><title>Title</title>
@end example

RE는 @code{'<html>'}의 @code{'<'}와 일치하고, @code{.*}는 나머지 문자열을 소비합니다. RE에는 여전히 남아있는 것이 있고, @code{>}는 문자열의 끝에서 일치할 수 없기 때문에, 정규식 엔진은 @code{>}와 일치하는 것을 찾을 때까지 문자 단위로 역 추적해야 합니다. 최종 일치는 @code{'<html>'}의 @code{'<'}에서 @code{'</title>'}의 @code{'>'}까지 확장되는데, 이는 여러분이 원하는 것이 아닙니다.

이 경우, 해결 방법은 가능한 한 `적은' 텍스트에 일치하는 비 탐욕적 한정자 @code{*?}, @code{+?}, @code{??} 또는 @code{@{m,n@}?}를 사용하는 것입니다. 위의 예에서, 첫 번째 @code{'<'}가 일치하면 @code{'>'}가 즉시 시도되고, 실패하면 엔진은 한 번에 한 문자씩 앞으로 이동하여 단계마다 @code{'>'}를 다시 시도합니다. 이렇게 하면 올바른 결과를 얻을 수 있습니다:

@example
>>> print(re.match('<.*?>', s).group())
<html>
@end example

(정규식으로 HTML이나 XML을 구문 분석하기는 쉽지 않습니다. 빠르지만 지저분한 패턴은 일반적인 경우를 처리할 것이지만, HTML과 XML에는 명확한 정규식을 깨뜨릴 특수 사례가 있습니다; 모든 가능한 경우를 처리하도록 정규식을 작성하면, 패턴이 `아주' 복잡해질 수 있습니다. 이러한 작업에는 HTML이나 XML 구문 분석 모듈을 사용하십시오.)

@node re VERBOSE 사용하기,,탐욕적 과 비 탐욕적 비교,일반적인 문제들
@anchor{howto/regex using-re-verbose}@anchor{5815}
@subsubsection re.VERBOSE 사용하기


지금까지 정규식이 매우 콤팩트한 표기법이라는 사실을 눈치챘을 것입니다만, 극단적으로 읽기 어렵지는 않았습니다. 중간 정도의 복잡성을 가진 RE는 역 슬래시, 괄호 및 메타 문자의 긴 모음이 되어 읽고 이해하기 어려울 수 있습니다.

이러한 RE의 경우, 정규식을 컴파일할 때 @ref{2796,,re.VERBOSE} 플래그를 지정하면 정규식을 보다 명확하게 포맷할 수 있어서 도움이 됩니다.

@code{re.VERBOSE} 플래그는 여러 가지 효과가 있습니다. 문자 클래스 안에 `있지 않은' 공백이 무시됩니다. 이것은, @code{dog | cat}과 같은 정규식은 가독성이 떨어지는 @code{dog|cat}과 동등하지만, @code{[a b]}는 여전히 @code{'a'}, @code{'b'} 또는 스페이스 문자와 일치함을 뜻합니다. 또한, 주석을 RE에 넣을 수도 있습니다; 주석은 @code{#} 문자에서 다음 줄 바꿈까지 확장됩니다. 삼중 따옴표로 묶은 문자열과 함께 사용하면, RE를 더 깔끔하게 포맷할 수 있습니다:

@example
pat = re.compile(r"""
 \s*                 # 선행 공백을 건너뜁니다
 (?P<header>[^:]+)   # 헤더 이름
 \s* :               # 공백과 콜론
 (?P<value>.*?)      # 헤더의 값 -- *? 을 사용해서
                     # 뒤에 오는 공백을 버립니다
 \s*$                # 줄 끝까지의 후행 공백
""", re.VERBOSE)
@end example

이것이 다음보다 훨씬 읽기 쉽습니다:

@example
pat = re.compile(r"\s*(?P<header>[^:]+)\s*:(?P<value>.*?)\s*$")
@end example

@node 피드백,,일반적인 문제들,정규식 HOWTO
@anchor{howto/regex feedback}@anchor{5816}
@subsection 피드백


정규식은 복잡한 주제입니다. 이 문서가 도움이 되었습니까? 불분명 한 부분이 있거나, 여기에서 다루지 않은 문제가 있습니까? 그렇다면 저자에게 개선을 위한 제안을 보내주십시오.

정규식에 대한 가장 완벽한 책은 거의 확실히 O’Reilly가 출판한 Jeffrey Friedl의 Mastering Regular Expressions 입니다. 불행히도, 이 책은 Perl과 Java의 정규식에만 집중하고, 파이썬 자료를 전혀 포함하지 않아서 파이썬 프로그래밍에 대한 참조로는 유용하지 않습니다. (첫 번째 판은 지금은 제거된 파이썬의 @code{regex} 모듈을 다뤘습니다만, 큰 도움은 되지 못합니다.) 여러분의 도서관에서 확인해보십시오.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 소켓 프로그래밍 HOWTO,정렬 기법,정규식 HOWTO,파이썬 HOWTO
@anchor{howto/sockets doc}@anchor{5817}@anchor{howto/sockets socket-howto}@anchor{39d8}@anchor{howto/sockets socket-programming-howto}@anchor{5818}@anchor{howto/sockets translation-repo}@anchor{5819}
@section 소켓 프로그래밍 HOWTO


@*저자: 
Gordon McMillan


@subsubheading 개요



소켓은 거의 모든 곳에서 사용되지만, 가장 심하게 오해된 기술 중 하나입니다. 이것은 10,000피트 상공에서 본 소켓 개요입니다. 진짜 자습서는 아닙니다 - 여러분은 여전히 작동하도록 만들기 위해 해야 할 일이 있습니다. 세부 사항을 다루지는 않습니다만 (그것 것들이 많이 있습니다), 그것들을 적당히 사용하기에 충분한 배경을 줄 수 있기를 바랍니다.

@menu
* 소켓:: 
* 소켓 만들기: 소켓 만들기<2>. 
* 소켓 사용하기:: 
* 연결 끊기:: 
* 비 블로킹 소켓:: 

@end menu

@node 소켓,소켓 만들기<2>,,소켓 프로그래밍 HOWTO
@anchor{howto/sockets sockets}@anchor{581a}
@subsection 소켓


INET (즉, IPv4) 소켓에 관해서만 이야기할 것이지만, 사용 중인 소켓의 99% 이상을 차지합니다. 또한, STREAM (즉, TCP) 소켓에 관해서만 이야기할 것입니다 - 여러분이 무엇을 하고 있는지 정말로 알고 있지 (그럴 때 이 HOWTO는 필요 없습니다!) 않다면, 다른 모든 것보다 STREAM 소켓으로 더 나은 동작과 성능을 얻을 수 있습니다. 소켓이 무엇인지에 대한 수수께끼뿐만 아니라 블로킹과 비 블로킹 소켓으로 작업하는 방법에 대한 힌트를 분명하게 하려고 합니다. 하지만 블로킹 소켓에 관해 이야기하는 것으로 시작할 것입니다. 비 블로킹 소켓을 다루기 전에 이것이 어떻게 작동하는지 알아야 합니다.

이러한 것들을 이해하는데 어려움을 주는 한 부분은 문맥에 따라 “소켓”이 여러 가지 미묘하게 다른 것을 뜻할 수 있다는 것입니다. 그래서 먼저, 대화의 끝점인 “클라이언트” 소켓과, 배전반 운영자와 비슷한 “서버” 소켓을 구별해 보겠습니다. 클라이언트 응용 프로그램(예를 들어, 여러분의 브라우저)은 “클라이언트” 소켓만 사용합니다; 이것이 대화하는 웹 서버는 “서버” 소켓과 “클라이언트” 소켓을 모두 사용합니다.

@menu
* 역사:: 

@end menu

@node 역사,,,소켓
@anchor{howto/sockets history}@anchor{581b}
@subsubsection 역사


@abbr{IPC,Inter Process Communication@comma{} 프로세스 간 통신}의 다양한 형태 중에서, 소켓이 가장 많이 사용됩니다. 특정 플랫폼에서 다른 형태의 IPC가 더 빠를 가능성이 있지만, 크로스 플랫폼 통신의 경우 소켓이 유일한 게임의 법칙입니다.

BSD 계열 유닉스의 일부로 버클리에서 발명되었습니다. 인터넷과 함께 산불처럼 퍼졌습니다. 좋은 의미에서 — INET과 소켓의 조합은 전 세계의 임의의 기계와 믿을 수 없을 만큼 쉽게 대화를 나눌 수 있도록 합니다 (적어도 다른 체계와 비교할 때).

@node 소켓 만들기<2>,소켓 사용하기,소켓,소켓 프로그래밍 HOWTO
@anchor{howto/sockets creating-a-socket}@anchor{581c}
@subsection 소켓 만들기


대충 말하면, 이 페이지로 연결되는 링크를 클릭하면 브라우저가 다음과 같은 작업을 수행합니다:

@example
# INET, STREAMing 소켓을 만듭니다
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 이제 포트 80의 웹 서버에 연결합니다 - 일반적인 http 포트
s.connect(("www.python.org", 80))
@end example

@code{connect}가 완료되면, 소켓 @code{s}를 사용하여 페이지의 텍스트 요청을 보낼 수 있습니다. 같은 소켓으로 응답을 읽은 다음 파괴됩니다. 그렇습니다, 파괴됩니다. 클라이언트 소켓은 일반적으로 하나의 교환(또는 일련의 작은 교환 집합)에서만 사용됩니다.

웹 서버에서 일어나는 일은 좀 더 복잡합니다. 첫째, 웹 서버는 “서버 소켓”을 만듭니다:

@example
# INET, STREAMing 소켓을 만듭니다
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 소켓을 공개 호스트와 잘 알려진 포트에 바인드 합니다
serversocket.bind((socket.gethostname(), 80))
# 서버 소켓이 됩니다
serversocket.listen(5)
@end example

알아 두어야 할 몇 가지 사항: 소켓을 외부 세계에서 볼 수 있도록 @code{socket.gethostname()}를 사용했습니다. @code{s.bind(('localhost', 80))} 이나 @code{s.bind(('127.0.0.1', 80))}을 사용했다면, 여전히 “서버” 소켓을 가지게 되지만 같은 기계 내에서만 볼 수 있는 소켓을 갖게 됩니다. @code{s.bind(('@w{'}, 80))}은 시스템에 있는 모든 주소로 소켓에 연결할 수 있음을 나타냅니다.

두 번째로 주목해야 할 점: 낮은 번호의 포트는 일반적으로 “잘 알려진” 서비스(HTTP, SNMP 등)를 위해 예약되어 있습니다. 연습 중이라면 적당히 높은 번호(4 자릿수)를 사용하십시오.

마지막으로, @code{listen}에 대한 인자는 외부 연결을 거부하기 전에 최대 5개의 연결 요청을 큐에 넣기를 원한다는 것을 소켓 라이브러리에 알립니다. 코드의 나머지 부분이 제대로 작성되었다면, 이것으로 충분합니다.

이제 우리는 포트 80에서 대기하는 “서버” 소켓을 가지고 있고, 웹 서버의 메인 루프를 입력할 수 있습니다:

@example
while True:
    # accept connections from outside
    (clientsocket, address) = serversocket.accept()
    # now do something with the clientsocket
    # in this case, we'll pretend this is a threaded server
    ct = make_client_thread(clientsocket)
    ct.start()
@end example

실제로 이 루프가 작동할 수 있는 3가지 일반적인 방법이 있습니다 - @code{clientsocket}를 처리하기 위해 스레드로 보내거나, @code{clientsocket}를 처리할 새 프로세스를 만들거나, 비 블로킹 소켓을 사용하도록 이 응용 프로그램을 재구성하고, @code{select}를 사용하여 “서버” 소켓과 활성 @code{clientsocket}들 간에 다중화(multiplexing)합니다. 나중에 자세히 다룹니다. 지금 이해해야 할 중요한 점: 이것이 “서버” 소켓이 하는 `전부'입니다. 어떤 데이터도 보내지 않습니다. 어떤 데이터도 수신하지 않습니다. 단지 “클라이언트” 소켓을 생성할 뿐입니다. 각 @code{clientsocket}은 우리가 바인드 한 호스트와 포트로 @code{connect()}를 수행하는 `다른' “클라이언트” 소켓에 대한 응답으로 만들어집니다. @code{clientsocket}를 만들자마자, 더 많은 연결을 기다리는 것으로 돌아갑니다. 두 개의 “클라이언트” 는 자유롭게 대화를 나눌 수 있습니다 - 그들은 대화를 끝낼 때 재활용되는 어떤 동적으로 할당된 포트를 사용합니다.

@menu
* IPC:: 

@end menu

@node IPC,,,소켓 만들기<2>
@anchor{howto/sockets ipc}@anchor{581d}
@subsubsection IPC


한 기계의 두 프로세스 간에 빠른 IPC가 필요하다면, 파이프나 공유 메모리를 살펴야 합니다. AF_INET 소켓을 사용하기로 했다면, “서버” 소켓을 @code{'localhost'}에 바인드 하십시오. 대부분 플랫폼에서, 이것은 네트워크 코드의 두어 개의 계층을 건너뛰는 지름길을 취할 것이고, 꽤 빨라집니다.


@subsubheading 더 보기


@ref{98,,multiprocessing}은 교차 플랫폼 IPC를 고수준 API로 통합합니다.


@node 소켓 사용하기,연결 끊기,소켓 만들기<2>,소켓 프로그래밍 HOWTO
@anchor{howto/sockets using-a-socket}@anchor{581e}
@subsection 소켓 사용하기


첫 번째로 주목해야 할 점은 웹 브라우저의 “클라이언트” 소켓과 웹 서버의 “클라이언트” 소켓은 같은 녀석이라는 것입니다. 즉, 이것은 “피어 투 피어(peer to peer)” 대화입니다. 또는 다른 방식으로 표현하면, `설계자로서, 대화를 위한 예절의 규칙이 무엇인지 결정해야 합니다'. 일반적으로, @code{connect}하는 소켓이 요청이나 로그인을 보내 대화를 시작합니다. 그러나 이것은 설계상의 결정입니다 - 소켓의 규칙이 아닙니다.

이제 통신에 사용할 두 벌의 동사가 있습니다. @code{send}와 @code{recv}를 사용하거나, 클라이언트 소켓을 파일류로 변환한 후 @code{read}와 @code{write}를 사용할 수 있습니다. 후자는 자바가 소켓을 제공하는 방식입니다. @code{flush}를 소켓에 사용해야 한다고 경고하는 것 외에는, 여기에 대해서는 언급하지 않을 것입니다. 이것들은 버퍼 된 “파일”이며, 일반적인 실수는 어떤 것을 @code{write}하고는 응답을 @code{read}하는 것입니다. @code{flush}가 없으면, 요청이 여전히 출력 버퍼에 남아있을 수 있으므로 응답을 영원히 기다리게 될 수 있습니다.

이제 소켓의 주요 걸림돌에 도달했습니다 - @code{send}와 @code{recv}는 네트워크 버퍼에서 작동합니다. 이것들은 여러분이 넘겨준 모든 바이트를 처리하지 않을 수 있습니다, 그들의 주 관심사는 네트워크 버퍼를 처리하는 것이기 때문입니다. 일반적으로, 연관된 네트워크 버퍼가 채워지거나(@code{send}) 비워지면(@code{recv}) 반환됩니다. 그런 다음 처리 한 바이트 수를 알려줍니다. 메시지가 완전히 처리될 때까지 다시 호출하는 것은 `여러분'의 책임입니다.

@code{recv}가 0바이트를 반환하면, 다른 쪽이 연결을 닫았거나 닫고 있다는 뜻입니다. 이 연결에서 더는 데이터를 받지 못합니다. 영원히. 데이터를 성공적으로 보낼 수는 있습니다; 나중에 이것에 대해 더 이야기하겠습니다.

HTTP와 같은 프로토콜은 하나의 전송에만 소켓을 사용합니다. 클라이언트는 요청을 보낸 다음 응답을 읽습니다. 그게 전부입니다. 소켓은 버려집니다. 이는 클라이언트가 0바이트를 수신하여 응답의 끝을 감지할 수 있음을 뜻합니다.

그러나 추가 전송을 위해 소켓을 재사용할 계획이라면, `소켓에는' @abbr{EOT,End of Transfer@comma{} 전송의 끝} `가 없다'는 것을 알아야 합니다. 반복합니다: 소켓 @code{send} 또는 @code{recv}가 0바이트를 처리한 후 반환되면 연결이 끊어진 것입니다. 연결이 끊어진 것이 `아니라면', 소켓은 (당분간) 읽을 것이 아무것도 없다는 것을 알려주지 `않을' 것이므로, @code{recv}에서 영원히 기다릴 수 있습니다. 이것에 대해 조금 더 생각해보면, 소켓의 근본적인 진실을 깨닫게 될 것입니다: `메시지는 고정 길이거나' (억), `구분자로 표시되거나' (어깨를 으쓱), `얼마나 긴지 표시하거나' (훨씬 낫다), `연결을 닫아서 끝내야 합니다'. 선택은 전적으로 여러분의 것입니다, (하지만 어떤 방법이 다른 것보다 올바릅니다).

연결을 끝내기를 원하지 않는다고 가정하면, 가장 간단한 해결책은 고정 길이 메시지입니다:

@example
class MySocket:
    """시연용 클래스
      - 효율성이 아니라 명확성을 위해 코드 되었습니다
    """

    def __init__(self, sock=None):
        if sock is None:
            self.sock = socket.socket(
                            socket.AF_INET, socket.SOCK_STREAM)
        else:
            self.sock = sock

    def connect(self, host, port):
        self.sock.connect((host, port))

    def mysend(self, msg):
        totalsent = 0
        while totalsent < MSGLEN:
            sent = self.sock.send(msg[totalsent:])
            if sent == 0:
                raise RuntimeError("socket connection broken")
            totalsent = totalsent + sent

    def myreceive(self):
        chunks = []
        bytes_recd = 0
        while bytes_recd < MSGLEN:
            chunk = self.sock.recv(min(MSGLEN - bytes_recd, 2048))
            if chunk == b'@w{'}:
                raise RuntimeError("socket connection broken")
            chunks.append(chunk)
            bytes_recd = bytes_recd + len(chunk)
        return b'@w{'}.join(chunks)
@end example

여기에 있는 전송 코드는 거의 모든 메시지전달 체계에서 사용할 수 있습니다 - 파이썬에서는 문자열을 보내고 @code{len()}를 사용하여 길이를 파악할 수 있습니다 (@code{\0} 문자가 포함되어 있어도). 더 복잡한 부분은 대부분 수신 코드입니다. (그리고 C에서도, 메시지가 @code{\0}을 포함하고 있을 때 @code{strlen}을 사용할 수 없다는 점을 제외하면 몹시 나쁘지는 않습니다.)

가장 쉬운 개선은 메시지의 첫 번째 문자를 메시지 유형의 표시자로 만들고, 유형이 길이를 결정하도록 하는 것입니다. 이제 두 개의 @code{recv}가 있습니다 - (적어도) 첫 번째 문자를 가져와서 길이를 조회할 수 있도록 하는 첫 번째와 나머지를 얻는 루프로 구성된 두 번째입니다. 구분자로 가기로 했다면, 임의의 청크 크기(4096이나 8192는 네트워크 버퍼 크기와 종종 잘 맞습니다)로 수신하고 받은 내용에서 구분자를 검색하게 될 것입니다.

하나의 복잡성을 알아 두어야 합니다: 여러분의 대화형 프로토콜이 (어떤 종류의 응답 없이) 여러 메시지를 연속적으로 보내는 것을 허락하고, @code{recv}에 임의의 청크 크기를 전달하면 다음 메시지의 시작 부분도 함께 읽는 일이 일어날 수 있습니다. 필요할 때까지 보관해 두어야 합니다.

메시지의 길이를 앞에 붙이면 (5자리 숫자라고 합시다) 더 복잡해집니다, (믿거나 말거나) 한 번의 @code{recv}로 5문자를 모두 얻을 수 없을 수 있기 때문입니다. 연습 중에는 이런 일이 일어나지 않을 것입니다; 하지만 네트워크 로드가 높으면, 두 개의 @code{recv} 루프를 사용하지 않는 한 여러분의 코드는 금방 망가지게 됩니다 - 길이를 결정하는 첫 번째와 메시지의 데이터 부분을 가져오는 두 번째입니다. 지저분합니다. 또한 @code{send}가 항상 한 번에 모든 것을 처리하지 못하는 것을 발견하게 될 것입니다. 그리고 이 단락을 읽었음에도, 결국 당신은 이 문제에 당하게 될 것입니다!

공간을 절약하고, 여러분의 성격을 단련하고, (그리고 제 경쟁적 지위를 유지하기 위해) 이러한 향상은 독자를 위한 연습으로 남겨둡니다. 이제 정리해봅시다.

@menu
* 바이너리 데이터:: 

@end menu

@node 바이너리 데이터,,,소켓 사용하기
@anchor{howto/sockets binary-data}@anchor{581f}
@subsubsection 바이너리 데이터


바이너리 데이터를 소켓을 통해 전송하는 것은 완벽히 가능합니다. 가장 큰 문제점은 모든 기계가 바이너리 데이터에 대해 같은 형식을 사용하는 것은 아니라는 점입니다. 예를 들어, 네트워크 바이트 순서@footnote{https://en.wikipedia.org/wiki/Endianness#Networking}는 빅 엔디안이며, 가장 높은 자리가 먼저와서, 값이 @code{1}인 16비트 정수는, 두 개의 16진수 바이트 @code{00 01}이 됩니다. 그러나, 대부분의 일반적인 프로세서들(x86/AMD64, ARM, RISC-V)은 리틀 엔디안미며, 가장 낮은 자리가 먼저와서, 같은 @code{1}은 @code{01 00}이 됩니다.

소켓 라이브러리에는 16과 32비트 정수 변환을 위한 호출이 있습니다 - @code{ntohl, htonl, ntohs, htons} 여기서 “n”은 `network'을 의미하고, “h”는 `host'를 의미하고, “s”는 `short'를 의미하고, “l”은 `long'를 의미합니다. 네트워크 순서가 호스트 순서인 곳에서는 아무것도 수행하지 않지만, 바이트 반전되는 기계에서는 바이트가 적절히 스와프됩니다.

오늘날의 64비트 기계에서는, 바이너리 데이터의 ASCII 표현이 바이너리 표현보다 작은 경우가 많습니다. 놀라울 정도로 많은 경우에, 대부분의 정수는 값 0이나 1을 갖기 때문입니다. 문자열 @code{"0"} 은 2바이트지만, 완전한 64비트 정수는 8바이트입니다. 물론, 이것은 고정 길이 메시지에는 적합하지 않습니다. 결정, 결정.

@node 연결 끊기,비 블로킹 소켓,소켓 사용하기,소켓 프로그래밍 HOWTO
@anchor{howto/sockets disconnecting}@anchor{5820}
@subsection 연결 끊기


엄밀히 말하면, @code{close}를 사용하기 전에 소켓에 @code{shutdown}을 사용해야 합니다. @code{shutdown}은 반대편 소켓에 대한 권고입니다. 전달하는 인자에 따라, “더는 보내지 않을 것이지만, 여전히 들을 겁니다” 나 “듣고 있지 않습니다, 즐거웠습니다!”를 뜻할 수 있습니다. 그러나, 대부분 소켓 라이브러리는 프로그래머가 이 예절을 무시하는 방식으로 사용되었고 일반적으로 @code{close}가 @code{shutdown(); close()}와 같습니다. 따라서 대부분 상황에서 명시적인 @code{shutdown}은 필요하지 않습니다.

@code{shutdown}을 효과적으로 사용하는 한 가지 방법은 HTTP와 비슷한 교환에서입니다. 클라이언트는 요청을 보낸 다음 @code{shutdown(1)}을 수행합니다. 그러면 서버에 “이 클라이언트는 전송을 완료했지만 계속 받을 수 있습니다.”라고 말하게 됩니다. 서버는 0바이트의 수신으로 “EOF”를 감지할 수 있습니다. 요청을 완료했다고 가정할 수 있습니다. 서버가 응답을 보냅니다. @code{send}가 성공적으로 완료되면, 클라이언트는 여전히 수신 중입니다.

파이썬은 자동 shutdown을 한 걸음 더 나아가서, 소켓이 가비지 수집될 때 필요하면 자동으로 @code{close}를 수행한다고 말합니다. 그러나 이것에 의존하는 것은 매우 나쁜 습관입니다. @code{close}를 하지 않고 소켓이 사라지면, 반대편 끝은 여러분이 단지 느려지고 있다고 생각하면서 무한정 멈출 수 있습니다. `제발' 완료되면 소켓을 @code{close}해 주세요.

@menu
* 소켓이 죽을 때:: 

@end menu

@node 소켓이 죽을 때,,,연결 끊기
@anchor{howto/sockets when-sockets-die}@anchor{5821}
@subsubsection 소켓이 죽을 때


아마도 블로킹 소켓 사용에 관한 최악의 경우는 상대방이 (@code{close}를 수행하지 않고) 갑자기 다운되었을 때 일어나는 일입니다. 소켓이 멈출 수 있습니다. TCP는 신뢰성 있는 프로토콜이며, 연결을 포기하기 전에 아주 오랜 시간 동안 기다립니다. 스레드를 사용하고 있다면, 스레드 전체가 실질적으로 죽습니다. 이것에 대해 당신이 할 수 있는 일이 별로 없습니다. 블로킹 읽기를 수행하는 동안 록을 잡는 것과 같은 어리석은 짓을 하지 않는 한, 스레드는 자원을 많이 소비하지 않습니다. 스레드를 죽이려고 하지 `마십시오' - 스레드가 프로세스보다 효율적인 부분적인 이유는 자원 재활용과 관련된 오버헤드를 회피한다는 것입니다. 즉, 스레드를 죽이면 전체 프로세스가 엉망이 될 가능성이 있습니다.

@node 비 블로킹 소켓,,연결 끊기,소켓 프로그래밍 HOWTO
@anchor{howto/sockets non-blocking-sockets}@anchor{5822}
@subsection 비 블로킹 소켓


앞의 내용을 이해했다면 소켓을 사용하는 방법에 대해 알아야 할 대부분을 이미 알고 있습니다. 거의 같은 방식으로 같은 호출을 계속 사용합니다. 여러분이 올바르게 사용하기만 한다면, 여러분의 앱을 거의 완전해질 겁니다.

파이썬에서, @code{socket.setblocking(False)}를 사용하여 비 블로킹으로 만듭니다. C에서는, 더 복잡하지만 (한가지 예를 들면, BSD 계열의 @code{O_NONBLOCK}과 POSIX 계열의 거의 같은 @code{O_NDELAY} 중에서 선택해야 합니다; @code{O_NDELAY}는 @code{TCP_NODELAY}와는 완전히 다른 것입니다) 똑같은 아이디어입니다. 소켓을 만든 후에, 하지만 사용하기 전에 이것을 수행합니다. (실제로는, 여러분이 괴짜라면, 계속 변경할 수 있습니다.)

동작의 주요 차이점은 @code{send}, @code{recv}, @code{connect} 및 @code{accept}가 아무것도 하지 않고 반환될 수 있다는 것입니다. 여러분에게는 (물론) 많은 선택지가 있습니다. 반환 코드와 에러 코드를 확인하면서 일반적으로 자신을 미치게 만들 수 있습니다. 믿기지 않는다면, 한번 시도해보십시오. 여러분의 앱은 커지고, 버그가 많으며 CPU를 소진할 겁니다. 그러니 뇌사에 이르게 할 해결책은 건너뛰고 올바르게 해 봅시다.

@code{select}를 사용하십시오.

C에서, @code{select} 코딩은 상당히 복잡합니다. 파이썬에서, 이것은 달콤한 조각이지만, 여러분이 파이썬에서 @code{select}를 이해한다면 C에서도 거의 문제가 없을 만큼 C 버전에 아주 가깝습니다:

@example
ready_to_read, ready_to_write, in_error = \
               select.select(
                  potential_readers,
                  potential_writers,
                  potential_errs,
                  timeout)
@end example

@code{select}로 세 개의 리스트를 전달합니다: 첫 번째는 읽으려는 모든 소켓을 포함합니다; 두 번째는 쓰려는 모든 소켓, 그리고 마지막으로 (보통 비어있는데) 에러를 검사하려는 소켓들입니다. 소켓이 둘 이상의 리스트에 들어갈 수 있음에 유의해야 합니다. @code{select} 호출은 블로킹이지만, 시간제한을 지정할 수 있습니다. 이것은 일반적으로 민감한 작업입니다 - 달리할 좋은 이유가 없다면 긴 제한 시간(가령 1분)을 주십시오.

반환 값으로, 세 개의 리스트를 얻게 됩니다. 실제로 읽을 수 있고, 쓸 수 있고, 에러가 있는 소켓이 들어있습니다. 이 리스트는 각기 여러분이 전달한 해당 목록의 부분집합(비어있는 것도 가능합니다)입니다.

소켓이 반환된 읽기 가능한 리스트에 있다면, 그 소켓에 대한 @code{recv}가 `무언가를' 반환하리라는 것을 알 수 있습니다. 쓰기 가능한 리스트도 마찬가지입니다. `무언가를' 보낼 수 있습니다. 아마 당신이 원하는 전부는 아니겠지만, `무언가'는 아무것도 아닌 것보다 낫습니다. (사실, 합리적으로 건강한 소켓은 쓰기 가능 상태로 반환될 것입니다 - 단지 네트워크 송신 버퍼 공간을 사용할 수 있음을 뜻합니다.)

“서버” 소켓이 있다면, potential_readers 리스트에 넣으십시오. 읽기 가능한 리스트에 등장하면, @code{accept}가 (거의 확실하게) 작동합니다. 다른 곳으로 @code{connect}하는 새 소켓을 만들었으면, potential_writers 리스트에 넣으십시오. 쓰기 가능한 리스트에 등장하면, 연결되었을 확률이 높습니다.

사실, @code{select}는 블로킹 소켓에서도 편리할 수 있습니다. 블록 할지 판단하는 한 가지 방법입니다 - 소켓은 버퍼에 무엇인가가 있으면 읽기 가능으로 반환됩니다. 그러나, 이것은 상대방이 완료했는지 아니면 단지 다른 일로 바쁜 것인지를 결정하는 문제에는 여전히 도움이 되지 않습니다.

`이식성 경고': 유닉스에서, @code{select}는 소켓과 파일 모두에서 작동합니다. 윈도우에서 이런 시도를 하지 마십시오. 윈도우에서 @code{select}는 소켓에서만 작동합니다. 또한, C에서 많은 고급 소켓 옵션은 윈도우에서 다르게 동작함에 유의하십시오. 사실, 윈도우에서 저는 보통 소켓에 스레드를 사용합니다 (아주 잘 작동합니다).

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 정렬 기법,유니코드 HOWTO,소켓 프로그래밍 HOWTO,파이썬 HOWTO
@anchor{howto/sorting doc}@anchor{5823}@anchor{howto/sorting sorting-techniques}@anchor{5824}@anchor{howto/sorting sortinghowto}@anchor{25de}@anchor{howto/sorting translation-repo}@anchor{5825}
@section 정렬 기법


@*저자: 
Andrew Dalke와 Raymond Hettinger


파이썬 리스트에는 리스트를 제자리에서(in-place) 수정하는 내장 @ref{dc7,,list.sort()} 메서드가 있습니다. 또한, 이터러블로부터 새로운 정렬된 리스트를 만드는 @ref{dc6,,sorted()} 내장 함수가 있습니다.

이 문서에서는, 파이썬을 사용하여 데이터를 정렬하는 다양한 기술을 살펴봅니다.

@menu
* 정렬 기초:: 
* 키 함수:: 
* operator 모듈 함수와 부분 함수 평가:: 
* 오름차순과 내림차순:: 
* 정렬 안정성과 복잡한 정렬:: 
* 장식-정렬-복원:: 
* 비교 함수:: 
* Strategies For Unorderable Types and Values:: 
* 잡동사니: 잡동사니<4>. 
* Partial Sorts:: 

@end menu

@node 정렬 기초,키 함수,,정렬 기법
@anchor{howto/sorting sorting-basics}@anchor{5826}
@subsection 정렬 기초


간단한 오름차순 정렬은 매우 쉽습니다; 그저 @ref{dc6,,sorted()} 함수를 호출하면 됩니다. 새로운 정렬된 리스트를 반환합니다:

@example
>>> sorted([5, 2, 3, 1, 4])
[1, 2, 3, 4, 5]
@end example

@ref{dc7,,list.sort()} 메서드를 사용할 수도 있습니다. 리스트를 제자리에서 수정합니다 (그리고 혼동을 피하고자 @code{None}을 반환합니다). 일반적으로 @ref{dc6,,sorted()}보다 덜 편리합니다 - 하지만 원래 목록이 필요하지 않다면, 이것이 약간 더 효율적입니다.

@example
>>> a = [5, 2, 3, 1, 4]
>>> a.sort()
>>> a
[1, 2, 3, 4, 5]
@end example

또 다른 점은 @ref{dc7,,list.sort()} 메서드가 리스트에게만 정의된다는 것입니다. 이와 달리, @ref{dc6,,sorted()} 함수는 모든 이터러블을 받아들입니다.

@example
>>> sorted(@{1: 'D', 2: 'B', 3: 'B', 4: 'E', 5: 'A'@})
[1, 2, 3, 4, 5]
@end example

@node 키 함수,operator 모듈 함수와 부분 함수 평가,정렬 기초,정렬 기법
@anchor{howto/sorting key-functions}@anchor{5827}
@subsection 키 함수


The @ref{dc7,,list.sort()} method and the functions @ref{dc6,,sorted()},
@ref{110a,,min()}, @ref{110b,,max()}, @ref{29c9,,heapq.nsmallest()}, and
@ref{29c8,,heapq.nlargest()} have a `key' parameter to specify a function (or
other callable) to be called on each list element prior to making
comparisons.

For example, here’s a case-insensitive string comparison using
@ref{fd5,,str.casefold()}:

@example
>>> sorted("This is a test string from Andrew".split(), key=str.casefold)
['a', 'Andrew', 'from', 'is', 'string', 'test', 'This']
@end example

`key' 매개 변수의 값은 단일 인자를 취하고 정렬 목적으로 사용할 키를 반환하는 함수(또는 다른 콜러블)여야 합니다. 키 함수가 각 입력 레코드에 대해 정확히 한 번 호출되기 때문에 이 기법은 빠릅니다.

일반적인 패턴은 객체의 인덱스 중 일부를 키로 사용하여 복잡한 객체를 정렬하는 것입니다. 예를 들어:

@example
>>> student_tuples = [
...     ('john', 'A', 15),
...     ('jane', 'B', 12),
...     ('dave', 'B', 10),
... ]
>>> sorted(student_tuples, key=lambda student: student[2])   # 나이로 정렬합니다
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
@end example

같은 기법이 이름있는 어트리뷰트를 갖는 객체에서도 작동합니다. 예를 들어:

@example
>>> class Student:
...     def __init__(self, name, grade, age):
...         self.name = name
...         self.grade = grade
...         self.age = age
...     def __repr__(self):
...         return repr((self.name, self.grade, self.age))

>>> student_objects = [
...     Student('john', 'A', 15),
...     Student('jane', 'B', 12),
...     Student('dave', 'B', 10),
... ]
>>> sorted(student_objects, key=lambda student: student.age)   # 나이로 정렬합니다
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
@end example

Objects with named attributes can be made by a regular class as shown
above, or they can be instances of @ref{4e1,,dataclass} or
a @ref{85d,,named tuple}.

@node operator 모듈 함수와 부분 함수 평가,오름차순과 내림차순,키 함수,정렬 기법
@anchor{howto/sorting operator-module-functions-and-partial-function-evaluation}@anchor{5828}
@subsection operator 모듈 함수와 부분 함수 평가


위에서 보여준 @ref{1005,,키 함수} 패턴은 매우 일반적이므로, 파이썬은 액세스 함수를 더 쉽고 빠르게 만드는 편리 함수를 제공합니다. @ref{a3,,operator} 모듈에는 @ref{c56,,itemgetter()}, @ref{1032,,attrgetter()} 및 @ref{1033,,methodcaller()} 함수가 있습니다.

이러한 함수를 사용하면, 위의 예제가 더 간단 해지고 빨라집니다:

@example
>>> from operator import itemgetter, attrgetter

>>> sorted(student_tuples, key=itemgetter(2))
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]

>>> sorted(student_objects, key=attrgetter('age'))
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
@end example

operator 모듈 함수는 다중 수준의 정렬을 허용합니다. 예를 들어, 먼저 `grade'로 정렬한 다음 `age'로 정렬하려면, 이렇게 합니다:

@example
>>> sorted(student_tuples, key=itemgetter(1,2))
[('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)]

>>> sorted(student_objects, key=attrgetter('grade', 'age'))
[('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)]
@end example

The @ref{63,,functools} module provides another helpful tool for making
key-functions.  The @ref{217,,partial()} function can reduce the
arity@footnote{https://en.wikipedia.org/wiki/Arity} of a multi-argument
function making it suitable for use as a key-function.

@example
>>> from functools import partial
>>> from unicodedata import normalize

>>> names = 'Zoë Åbjørn Núñez Élana Zeke Abe Nubia Eloise'.split()

>>> sorted(names, key=partial(normalize, 'NFD'))
['Abe', 'Åbjørn', 'Eloise', 'Élana', 'Nubia', 'Núñez', 'Zeke', 'Zoë']

>>> sorted(names, key=partial(normalize, 'NFC'))
['Abe', 'Eloise', 'Nubia', 'Núñez', 'Zeke', 'Zoë', 'Åbjørn', 'Élana']
@end example

@node 오름차순과 내림차순,정렬 안정성과 복잡한 정렬,operator 모듈 함수와 부분 함수 평가,정렬 기법
@anchor{howto/sorting ascending-and-descending}@anchor{5829}
@subsection 오름차순과 내림차순


@ref{dc7,,list.sort()}와 @ref{dc6,,sorted()}는 모두 불리언 값을 갖는 `reverse' 매개 변수를 받아들입니다. 내림차순 정렬을 지정하는 데 사용됩니다. 예를 들어, 학생 데이터를 역 `age' 순서로 얻으려면, 이렇게 합니다:

@example
>>> sorted(student_tuples, key=itemgetter(2), reverse=True)
[('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]

>>> sorted(student_objects, key=attrgetter('age'), reverse=True)
[('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]
@end example

@node 정렬 안정성과 복잡한 정렬,장식-정렬-복원,오름차순과 내림차순,정렬 기법
@anchor{howto/sorting sort-stability-and-complex-sorts}@anchor{582a}
@subsection 정렬 안정성과 복잡한 정렬


정렬은 안정적@footnote{https://en.wikipedia.org/wiki/Sorting_algorithm#Stability}임이 보장됩니다. 즉, 여러 레코드가 같은 키를 가질 때, 원래의 순서가 유지됩니다.

@example
>>> data = [('red', 1), ('blue', 1), ('red', 2), ('blue', 2)]
>>> sorted(data, key=itemgetter(0))
[('blue', 1), ('blue', 2), ('red', 1), ('red', 2)]
@end example

`blue'에 대한 두 레코드가 원래 순서를 유지해서 @code{('blue', 1)}이 @code{('blue', 2)}보다 앞에 나옴이 보장됨에 유의하십시오.

이 멋진 속성은 일련의 정렬 단계로 복잡한 정렬을 만들 수 있도록 합니다. 예를 들어, 학생 데이터를 `grade'의 내림차순으로 정렬한 다음, `age'의 오름차순으로 정렬하려면, 먼저 `age' 정렬을 수행한 다음 `grade'를 사용하여 다시 정렬합니다:

@example
>>> s = sorted(student_objects, key=attrgetter('age'))     # 두 번째 키로 정렬합니다
>>> sorted(s, key=attrgetter('grade'), reverse=True)       # 이제 첫 번째 키로 내림차순 정렬합니다
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
@end example

이것은 다중 패스로 정렬하기 위해 필드와 순서의 튜플 리스트를 받을 수 있는 래퍼 함수로 추상화할 수 있습니다.

@example
>>> def multisort(xs, specs):
...     for key, reverse in reversed(specs):
...         xs.sort(key=attrgetter(key), reverse=reverse)
...     return xs

>>> multisort(list(student_objects), (('grade', True), ('age', False)))
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
@end example

파이썬에서 사용된 Timsort@footnote{https://en.wikipedia.org/wiki/Timsort} 알고리즘은 데이터 집합에 이미 존재하는 순서를 활용할 수 있으므로 효율적으로 여러 번의 정렬을 수행합니다.

@node 장식-정렬-복원,비교 함수,정렬 안정성과 복잡한 정렬,정렬 기법
@anchor{howto/sorting decorate-sort-undecorate}@anchor{582b}
@subsection 장식-정렬-복원


이 관용구는 그것의 세 단계를 따라 장식-정렬-복원(Decorate-Sort-Undecorate)이라고 합니다:


@itemize *

@item 
첫째, 초기 리스트가 정렬 순서를 제어하는 새로운 값으로 장식됩니다.

@item 
둘째, 장식된 리스트를 정렬합니다.

@item 
마지막으로, 장식을 제거하여, 새 순서로 초깃값만 포함하는 리스트를 만듭니다.
@end itemize

예를 들어, DSU 방식을 사용하여 `grade'로 학생 데이터를 정렬하려면 다음과 같이 합니다:

@example
>>> decorated = [(student.grade, i, student) for i, student in enumerate(student_objects)]
>>> decorated.sort()
>>> [student for grade, i, student in decorated]               # 복원
[('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]
@end example

이 관용구는 튜플이 사전식으로 비교되기 때문에 작동합니다; 첫 번째 항목이 비교됩니다; 그들이 같으면 두 번째 항목이 비교되고, 이런 식으로 계속됩니다.

모든 경우에 장식된 리스트에 인덱스 `i'를 포함할 필요는 없지만, 두 가지 이점이 있습니다:


@itemize *

@item 
정렬이 안정적입니다 – 두 항목이 같은 키를 가지면, 그 들의 순서가 정렬된 리스트에 유지됩니다.

@item 
장식된 튜플의 순서는 최대 처음 두 항목에 의해 결정되므로 원래 항목은 비교 가능할 필요가 없습니다. 그래서 예를 들어, 원래 리스트에는 직접 정렬될 수 없는 복소수가 포함될 수 있습니다.
@end itemize

이 관용구의 또 다른 이름은 펄 프로그래머들 사이에서 이것을 대중화한 Randal L. Schwartz의 이름을 딴 Schwartzian 변환@footnote{https://en.wikipedia.org/wiki/Schwartzian_transform}입니다.

이제 파이썬 정렬이 키 함수를 제공하기 때문에, 이 기법은 자주 필요하지 않습니다.

@node 비교 함수,Strategies For Unorderable Types and Values,장식-정렬-복원,정렬 기법
@anchor{howto/sorting comparison-functions}@anchor{582c}
@subsection 비교 함수


Unlike key functions that return an absolute value for sorting, a comparison
function computes the relative ordering for two inputs.

For example, a balance scale@footnote{https://upload.wikimedia.org/wikipedia/commons/1/17/Balance_à_tabac_1850.JPG}
compares two samples giving a relative ordering: lighter, equal, or heavier.
Likewise, a comparison function such as @code{cmp(a, b)} will return a negative
value for less-than, zero if the inputs are equal, or a positive value for
greater-than.

It is common to encounter comparison functions when translating algorithms from
other languages.  Also, some libraries provide comparison functions as part of
their API.  For example, @ref{4308,,locale.strcoll()} is a comparison function.

To accommodate those situations, Python provides
@ref{13df,,functools.cmp_to_key} to wrap the comparison function
to make it usable as a key function:

@example
sorted(words, key=cmp_to_key(strcoll))  # 로케일 인식 정렬 순서
@end example

@node Strategies For Unorderable Types and Values,잡동사니<4>,비교 함수,정렬 기법
@anchor{howto/sorting strategies-for-unorderable-types-and-values}@anchor{582d}
@subsection Strategies For Unorderable Types and Values


A number of type and value issues can arise when sorting.
Here are some strategies that can help:


@itemize *

@item 
Convert non-comparable input types to strings prior to sorting:
@end itemize

@example
>>> data = ['twelve', '11', 10]
>>> sorted(map(str, data))
['10', '11', 'twelve']
@end example

This is needed because most cross-type comparisons raise a
@ref{198,,TypeError}.


@itemize *

@item 
Remove special values prior to sorting:
@end itemize

@example
>>> from math import isnan
>>> from itertools import filterfalse
>>> data = [3.3, float('nan'), 1.1, 2.2]
>>> sorted(filterfalse(isnan, data))
[1.1, 2.2, 3.3]
@end example

This is needed because the IEEE-754 standard@footnote{https://en.wikipedia.org/wiki/IEEE_754} specifies that, “Every NaN
shall compare unordered with everything, including itself.”

Likewise, @code{None} can be stripped from datasets as well:

@example
>>> data = [3.3, None, 1.1, 2.2]
>>> sorted(x for x in data if x is not None)
[1.1, 2.2, 3.3]
@end example

This is needed because @code{None} is not comparable to other types.


@itemize *

@item 
Convert mapping types into sorted item lists before sorting:
@end itemize

@example
>>> data = [@{'a': 1@}, @{'b': 2@}]
>>> sorted(data, key=lambda d: sorted(d.items()))
[@{'a': 1@}, @{'b': 2@}]
@end example

This is needed because dict-to-dict comparisons raise a
@ref{198,,TypeError}.


@itemize *

@item 
Convert set types into sorted lists before sorting:
@end itemize

@example
>>> data = [@{'a', 'b', 'c'@}, @{'b', 'c', 'd'@}]
>>> sorted(map(sorted, data))
[['a', 'b', 'c'], ['b', 'c', 'd']]
@end example

This is needed because the elements contained in set types do not have a
deterministic order.  For example, @code{list(@{'a', 'b'@})} may produce
either @code{['a', 'b']} or @code{['b', 'a']}.

@node 잡동사니<4>,Partial Sorts,Strategies For Unorderable Types and Values,정렬 기법
@anchor{howto/sorting odds-and-ends}@anchor{582e}
@subsection 잡동사니



@itemize *

@item 
로케일 인식 정렬의 경우, 키 함수로는 @ref{17c3,,locale.strxfrm()}를, 비교 함수로는 @ref{4308,,locale.strcoll()}을 사용하십시오. 이는 하부 알파벳이 같더라도 문화권마다 “알파벳순” 정렬 순서가 다를 수 있기 때문에 필요합니다.

@item 
`reverse' 매개 변수는 여전히 정렬 안정성을 유지합니다 (그래서 같은 키를 갖는 레코드는 원래 순서를 유지합니다). 흥미롭게도, 그 효과는 내장 @ref{a65,,reversed()} 함수를 두 번 사용하여 매개 변수 없이 흉내 낼 수 있습니다:

@example
>>> data = [('red', 1), ('blue', 1), ('red', 2), ('blue', 2)]
>>> standard_way = sorted(data, key=itemgetter(0), reverse=True)
>>> double_reversed = list(reversed(sorted(reversed(data), key=itemgetter(0))))
>>> assert standard_way == double_reversed
>>> standard_way
[('red', 1), ('red', 2), ('blue', 1), ('blue', 2)]
@end example

@item 
정렬 루틴은 두 객체를 비교할 때 @code{<}를 사용합니다. 따라서 @ref{14a5,,__lt__()} 메서드를 정의하여, 표준 정렬 순서를 클래스에 추가하기는 쉽습니다:

@example
>>> Student.__lt__ = lambda self, other: self.age < other.age
>>> sorted(student_objects)
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
@end example

However, note that @code{<} can fall back to using @ref{1510,,__gt__()} if
@ref{14a5,,__lt__()} is not implemented (see @ref{14a5,,object.__lt__()}
for details on the mechanics).  To avoid surprises, 
@geindex Python 향상 제안; PEP 8
PEP 8@footnote{https://peps.python.org/pep-0008/}
recommends that all six comparison methods be implemented.
The @ref{1141,,total_ordering()} decorator is provided to make that
task easier.

@item 
키 함수는 정렬되는 객체에 직접 의존할 필요가 없습니다. 키 함수는 외부 자원에 액세스할 수도 있습니다. 예를 들어, 학생 성적이 딕셔너리에 저장되어 있다면, 학생 이름의 별도 리스트를 정렬하는 데 사용할 수 있습니다:

@example
>>> students = ['dave', 'john', 'jane']
>>> newgrades = @{'john': 'F', 'jane':'A', 'dave': 'C'@}
>>> sorted(students, key=newgrades.__getitem__)
['jane', 'dave', 'john']
@end example
@end itemize

@node Partial Sorts,,잡동사니<4>,정렬 기법
@anchor{howto/sorting partial-sorts}@anchor{582f}
@subsection Partial Sorts


Some applications require only some of the data to be ordered.  The standard
library provides several tools that do less work than a full sort:


@itemize *

@item 
@ref{110a,,min()} and @ref{110b,,max()} return the smallest and largest values,
respectively.  These functions make a single pass over the input data and
require almost no auxiliary memory.

@item 
@ref{29c9,,heapq.nsmallest()} and @ref{29c8,,heapq.nlargest()} return
the `n' smallest and largest values, respectively.  These functions
make a single pass over the data keeping only `n' elements in memory
at a time.  For values of `n' that are small relative to the number of
inputs, these functions make far fewer comparisons than a full sort.

@item 
@ref{16c1,,heapq.heappush()} and @ref{16c2,,heapq.heappop()} create and maintain a
partially sorted arrangement of data that keeps the smallest element
at position @code{0}.  These functions are suitable for implementing
priority queues which are commonly used for task scheduling.
@end itemize

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 유니코드 HOWTO,urllib 패키지를 사용하여 인터넷 리소스를 가져오는 방법,정렬 기법,파이썬 HOWTO
@anchor{howto/unicode doc}@anchor{5830}@anchor{howto/unicode id1}@anchor{5831}@anchor{howto/unicode translation-repo}@anchor{5832}@anchor{howto/unicode unicode-howto}@anchor{14a9}
@section 유니코드 HOWTO


@*버전: 
1.12


이 HOWTO는 텍스트 데이터를 나타내기 위한 유니코드 명세를 지원하는 파이썬에 대한 설명과 유니코드로 작업할 때 일반적으로 마주하는 다양한 문제들에 관해 설명합니다.

@menu
* 유니코드 소개:: 
* 파이썬의 유니코드 지원:: 
* 유니코드 데이터 읽고 쓰기:: 
* 감사 인사:: 

@end menu

@node 유니코드 소개,파이썬의 유니코드 지원,,유니코드 HOWTO
@anchor{howto/unicode introduction-to-unicode}@anchor{5833}
@subsection 유니코드 소개


@menu
* 정의:: 
* 인코딩:: 
* 참조:: 

@end menu

@node 정의,인코딩,,유니코드 소개
@anchor{howto/unicode definitions}@anchor{5834}
@subsubsection 정의


오늘날의 프로그램은 다양한 문자를 처리할 수 있어야 합니다. 응용 프로그램은 종종 국제화되어 다양한 사용자 선택 가능한 언어로 메시지를 표시하고 출력합니다; 같은 프로그램이 영어, 프랑스어, 일본어, 히브리어 또는 러시아어로 에러 메시지를 출력해야 할 수 있습니다. 웹 콘텐츠는 이러한 언어로 작성될 수 있으며 다양한 이모티콘 기호를 포함할 수도 있습니다. 파이썬의 문자열형은 문자를 표현하기 위해 유니코드 표준을 사용하므로, 파이썬 프로그램은 가능한 모든 다른 문자로 작업 할 수 있습니다.

유니코드(@indicateurl{https://www.unicode.org/})는 인간 언어에서 사용하는 모든 문자를 나열하고 각 문자에 고유한 코드를 부여하고자 하는 명세입니다. 새로운 언어와 기호를 추가하기 위해 유니코드 명세가 계속 개정되고 갱신됩니다.

`문자'는 텍스트의 가능한 최소 구성요소입니다. ‘A’, ‘B’, ‘C’ 등은 전부 다른 문자입니다. ‘È’와 ‘Í’ 역시 그렇습니다. 문자는 언어나 문맥에 따라 다릅니다. 예를 들어 대문자 ‘I’와는 별개로, “로마 숫자 하나(Roman Numeral One)”를 위한 문자 ‘Ⅰ’가 있습니다. 이들은 보통 똑같아 보이지만, 서로 다른 의미를 가진 두 개의 다른 문자입니다.

유니코드 표준은 문자를 어떻게 `코드 포인트'로 표현하는지 서술하고 있습니다. 코드 포인트 값은 0에서 0x10FFFF 사이의 정수입니다 (약 110만 개의 값입니다, 할당된 실제 수@footnote{https://www.unicode.org/versions/latest/#Summary}는 이보다 적습니다). 표준과 이 문서에서 코드 포인트는 @code{U+265E} 표기법을 사용하며, 이는 값 @code{0x265e}(10진수로는 9,822)인 문자를 의미합니다.

유니코드 표준은 문자와 그에 상응하는 코드 포인트를 나열한 수많은 표를 포함하고 있습니다:

@example
0061    'a'; LATIN SMALL LETTER A
0062    'b'; LATIN SMALL LETTER B
0063    'c'; LATIN SMALL LETTER C
...
007B    '@{'; LEFT CURLY BRACKET
...
2167    'Ⅷ'; ROMAN NUMERAL EIGHT
2168    'Ⅸ'; ROMAN NUMERAL NINE
...
265E    '♞'; BLACK CHESS KNIGHT
265F    '♟'; BLACK CHESS PAWN
...
1F600   '😀'; GRINNING FACE
1F609   '😉'; WINKING FACE
...
@end example

엄밀히 말하자면, 이러한 정의는 ‘이것이 문자 @code{U+265E}’라고 말하는 것은 의미가 없음을 뜻합니다. @code{U+265E}는 어떤 특정 문자를 표현하는 코드 포인트일 뿐입니다; 이 경우에는 ‘BLACK CHESS KNIGHT’(’♞’)를 나타냅니다. 일상적인 문맥에서 코드 포인트와 문자 사이의 구분은 때때로 잊힐 겁니다.

문자는 화면이나 종이에 `글리프'라 불리는 그래픽 요소의 집합으로 표시됩니다. 예를 들어 대문자 A의 글리프는 두 개의 대각 획과 한 개의 수평 획이지만, 정확한 세부사항은 글꼴에 따라 다릅니다. 대부분의 파이썬 코드는 글리프를 걱정할 필요가 없습니다; 표시할 올바른 글리프를 찾는 것은 일반적으로 GUI 툴킷이나 터미널의 글꼴 렌더러의 일입니다.

@node 인코딩,참조,정의,유니코드 소개
@anchor{howto/unicode encodings}@anchor{5835}
@subsubsection 인코딩


이전 섹션 요약: 유니코드 문자열은 코드 포인트의 시퀀스이며, 0부터 @code{0x10FFFF} (십진수 1,114,111)의 범위를 갖는 수입니다. 이 코드 포인트의 시퀀스는 메모리에서 `코드 단위(code units)'의 집합으로 표현될 필요가 있고, 그런 다음 `코드 단위'는 8비트 바이트로 매핑됩니다. 유니코드 문자열을 바이트 시퀀스로 변환하는 규칙을 `문자 인코딩(character encoding)', 또는 단지 `인코딩(encoding)'이라고 부릅니다.

생각할 수 있는 첫 번째 인코딩은 코드 단위로 32비트 정수를 사용한 다음 32비트 정수의 CPU 표현을 사용하는 것입니다. 이 표현에서 문자열 “Python”은 다음과 같습니다:

@example
P           y           t           h           o           n
0x50 00 00 00 79 00 00 00 74 00 00 00 68 00 00 00 6f 00 00 00 6e 00 00 00
   0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
@end example

이 표현은 간단하지만 여러 문제를 가지고 있습니다.


@enumerate 

@item 
이식성이 없습니다; 다른 프로세서는 바이트를 다르게 정렬합니다.

@item 
이는 공간을 매우 낭비하는 겁니다. 대부분 텍스트에서 주요 코드 포인트는 127 또는 255보다 작으므로 많은 공간이 @code{0x00}으로 채워집니다. 위의 문자열은 ASCII 표현에 필요한 6 바이트와 비교하여 24 바이트를 사용합니다. 늘어난 RAM 사용은 중요하지 않지만(데스크톱 컴퓨터는 기가바이트 단위의 RAM을 갖고 있고, 문자열은 대개 그 정도로 크지 않습니다), 디스크와 네트워크 대역폭 사용을 4배로 확장하는 것은 용납할 수 없습니다.

@item 
@code{strlen()}과 같은 기존의 C 함수와 호환이 안 되기 때문에 새로운 와이드 문자열 함수 계열을 사용해야 합니다.
@end enumerate

따라서 이 인코딩은 많이 사용되지 않으며, 사람들은 UTF-8과 같은 더 효율적이고 편리한 다른 인코딩을 선택합니다.

UTF-8은 일반적으로 가장 많이 사용되는 인코딩 중 하나이고, 파이썬은 종종 기본적으로 이것을 사용합니다. UTF는 “Unicode Transformation Format”의 약자이며 ‘8’은 8비트 값이 인코딩에 사용됨을 뜻합니다. (UTF-16과 UTF-32 인코딩도 있지만, UTF-8보다 낮은 빈도로 사용됩니다.) UTF-8은 다음의 규칙을 따릅니다:


@enumerate 

@item 
만약 코드 포인트가 128보다 작다면, 해당 바이트 값으로 표현됩니다.

@item 
만약 코드 포인트가 128보다 크거나 같다면, 시퀀스의 각 바이트가 128에서 255 사이인 둘, 셋 또는 네 개의 바이트 시퀀스로 바뀝니다.
@end enumerate

UTF-8은 몇 가지 편리한 특징이 있습니다:


@enumerate 

@item 
모든 유니코드 코드 포인트를 처리 할 수 있습니다.

@item 
유니코드 문자열은 널 문자를 표현하는 곳에만 내장된 0바이트를 포함하는 바이트 시퀀스로 변환됩니다. 이는 UTF-8 문자열을 @code{strcpy()}와 같은 C 함수로 처리하고 문자열 끝 표시 이외의 0바이트를 처리하지 못하는 프로토콜을 통해 전송할 수 있음을 의미합니다.

@item 
ASCII 텍스트의 문자열 역시 유효한 UTF-8 텍스트입니다.

@item 
UTF-8은 꽤 알찹니다; 일반적으로 사용되는 문자 대부분을 한두 개의 바이트로 표현할 수 있습니다.

@item 
만약 바이트가 손상 또는 손실되었다면, 다음 UTF-8 인코딩 코드 포인트의 시작을 결정하고 다시 동기화할 수 있습니다. 무작위 8비트 데이터가 유효한 UTF-8처럼 보일 가능성은 낮습니다.

@item 
UTF-8은 바이트 지향 인코딩입니다. 인코딩은 각 문자가 하나 이상의 바이트의 특정 시퀀스로 표시되도록 지정합니다. 이렇게 하면 UTF-16과 UTF-32와 같이 바이트의 시퀀스가 문자열이 인코딩된 하드웨어에 따라 달라지는 정수와 워드(word) 지향 인코딩에서 발생할 수 있는 바이트 순서 문제를 피할 수 있습니다.
@end enumerate

@node 참조,,인코딩,유니코드 소개
@anchor{howto/unicode references}@anchor{5836}
@subsubsection 참조


유니코드 컨소시엄 사이트@footnote{https://www.unicode.org}는 유니코드 사양의 문자 차트, 용어집 그리고 PDF 버전의 유니코드 명세를 갖고 있습니다. 어려운 읽기를 준비하세요. 유니코드의 기원과 개발의 연대기@footnote{https://www.unicode.org/history/} 역시 이 사이트에서 볼 수 있습니다.

Computerphile 유튜브 채널에서, Tom Scott가 간략하게 유니코드와 UTF-8의 역사를 논의합니다@footnote{https://www.youtube.com/watch?v=MijmeoH9LT4} (9분 36초).

Jukka Korpela는 표준을 이해할 수 있도록 유니코드 문자표 읽기에 대한 입문 안내서@footnote{https://jkorpela.fi/unicode/guide.html}를 작성했습니다.

또 다른 좋은 입문 글@footnote{https://www.joelonsoftware.com/2003/10/08/the-absolute-minimum-every-software-developer-absolutely-positively-must-know-about-unicode-and-character-sets-no-excuses/}을 Joel Spolsky가 썼습니다. 이 입문서로도 명확하지 않은 경우 계속하기 전에 이 대체 문서를 읽으세요.

위키피디아 항목은 때때로 도움이 됩니다; 예를 들어, “문자 인코딩@footnote{https://en.wikipedia.org/wiki/Character_encoding}”과 UTF-8@footnote{https://en.wikipedia.org/wiki/UTF-8} 항목을 보세요.

@node 파이썬의 유니코드 지원,유니코드 데이터 읽고 쓰기,유니코드 소개,유니코드 HOWTO
@anchor{howto/unicode python-s-unicode-support}@anchor{5837}
@subsection 파이썬의 유니코드 지원


이제 유니코드의 기초를 배웠으므로 파이썬의 유니코드 기능을 살펴볼 수 있습니다.

@menu
* 문자열 형:: 
* 바이트열로 변환:: 
* 파이썬 소스 코드에서 유니코드 리터럴:: 
* 유니코드 속성:: 
* 문자열 비교:: 
* 유니코드 정규식:: 
* 참조: 참조<2>. 

@end menu

@node 문자열 형,바이트열로 변환,,파이썬의 유니코드 지원
@anchor{howto/unicode the-string-type}@anchor{5838}
@subsubsection 문자열 형


파이썬 3.0부터는 언어의 @ref{169,,str} 형은 유니코드 문자를 포함하고, 이는 어떤 문자열이든 @code{"unicode rocks!"}, @code{'unicode rocks!'} 또는 삼중 따옴표로 묶인 문자열 문법을 사용한다면 유니코드로 저장됨을 뜻합니다.

파이썬 소스 코드의 기본 인코딩은 UTF-8이므로 문자열 리터럴에 유니코드 문자를 쉽게 포함할 수 있습니다:

@example
try:
    with open('/tmp/input.txt', 'r') as f:
        ...
except OSError:
    # 'File not found' error message.
    print("Fichier non trouvé")
@end example

사이드 노트: 파이썬 3은 유니코드 문자를 식별자에서도 지원합니다:

@example
répertoire = "/tmp/records.log"
with open(répertoire, "w") as f:
    f.write("test\n")
@end example

편집기에서 특정 문자를 입력 할수 없거나 어떤 이유에서 ASCII만으로 소스 코드를 작성하고자 한다면, 문자열 리터럴에 이스케이프 시퀀스를 사용할 수 있습니다. (시스템에 따라 다르지만, u 이스케이프 대신에 진짜 대문자 델타 글리프가 나타날 수 있습니다.)

@example
>>> "\N@{GREEK CAPITAL LETTER DELTA@}"  # 문자 이름 사용
'\u0394'
>>> "\u0394"                          # 16비트 16진수 값 사용
'\u0394'
>>> "\U00000394"                      # 32비트 16진수 값 사용
'\u0394'
@end example

추가로, 문자열을 @ref{192,,bytes}의 @ref{ad3,,decode()} 메서드를 사용하여 만들 수 있습니다. 이 메서드는 @code{UTF-8}과 같은 `encoding' 인자와 선택적으로 `erros' 인자를 받습니다.

`errors' 인자는 인코딩의 규칙에 따라 입력 문자열을 변환할 수 없는 경우의 응답을 지정합니다. 이 인자의 유효한 값은 @code{'strict'} (@ref{c07,,UnicodeDecodeError} 예외 발생), @code{'replace'} (@code{U+FFFD}, @code{REPLACEMENT CHARACTER} 사용), @code{'ignore'} (유니코드 결과에서 문자를 그냥 생략), 또는 @code{'backslashreplace'} (@code{\xNN} 이스케이프 시퀀스를 삽입)입니다. 다음 에제는 그 차이점을 보여줍니다:

@example
>>> b'\x80abc'.decode("utf-8", "strict")
Traceback (most recent call last):
    ...
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x80 in position 0:
  invalid start byte
>>> b'\x80abc'.decode("utf-8", "replace")
'\ufffdabc'
>>> b'\x80abc'.decode("utf-8", "backslashreplace")
'\\x80abc'
>>> b'\x80abc'.decode("utf-8", "ignore")
'abc'
@end example

인코딩은 인코딩의 이름을 포함하는 문자열로 지정됩니다. 파이썬에는 대략 100개의 서로 다른 인코딩이 있습니다. 리스트는 @ref{fb7,,표준 인코딩}에서 파이썬 라이브러리 레퍼런스를 보세요. 어떤 인코딩은 다양한 이름을 갖습니다; 예를 들어, @code{'latin-1'}, @code{'iso_8859_1'} 그리고 @code{'8859}’ 는 전부 같은 인코딩의 동의어입니다.

한 문자 유니코드 문자열은 정수를 받고 해당 코드 포인트를 포함하는 길이 1인 유니코드 문자열을 반환하는 @ref{19ef,,chr()} 내장 함수로도 만들 수 있습니다. 반대 작업은 한 문자 유니코드 문자열을 받고 코드 포인트 값을 반환하는 @ref{2338,,ord()} 내장 함수입니다:

@example
>>> chr(57344)
'\ue000'
>>> ord('\ue000')
57344
@end example

@node 바이트열로 변환,파이썬 소스 코드에서 유니코드 리터럴,문자열 형,파이썬의 유니코드 지원
@anchor{howto/unicode converting-to-bytes}@anchor{5839}
@subsubsection 바이트열로 변환


@ref{ad3,,bytes.decode()}의 반대 메서드는 요청된 `encoding'으로 인코딩 된 유니코드 문자열의 @ref{192,,bytes}를 반환하는 @ref{ad2,,str.encode()}입니다.

`errors' 매개변수는 @ref{ad3,,decode()} 메서드의 매개변수와 같지만 가능한 핸들러를 조금 더 제공합니다. @code{'strict'}, @code{'ignore'}, @code{'replace'} (이 경우 인코딩할 수 없는 문자 대신에 물음표를 삽입)뿐만 아니라 @code{'xmlcharrefreplace'} (XML 문자 참조 삽입), @code{backslashreplace} (@code{\uNNNN} 이스케이프 시퀀스 삽입) 그리고 @code{namereplace} (@code{\N@{...@}} 이스케이프 시퀀스 삽입)도 있습니다.

아래 예제에서 서로 다른 결과를 보여줍니다:

@example
>>> u = chr(40960) + 'abcd' + chr(1972)
>>> u.encode('utf-8')
b'\xea\x80\x80abcd\xde\xb4'
>>> u.encode('ascii')
Traceback (most recent call last):
    ...
UnicodeEncodeError: 'ascii' codec can't encode character '\ua000' in
  position 0: ordinal not in range(128)
>>> u.encode('ascii', 'ignore')
b'abcd'
>>> u.encode('ascii', 'replace')
b'?abcd?'
>>> u.encode('ascii', 'xmlcharrefreplace')
b'&#40960;abcd&#1972;'
>>> u.encode('ascii', 'backslashreplace')
b'\\ua000abcd\\u07b4'
>>> u.encode('ascii', 'namereplace')
b'\\N@{YI SYLLABLE IT@}abcd\\u07b4'
@end example

사용 가능한 인코딩을 등록하고 접근할 수 있도록 하는 저수준 루틴은 @ref{1c,,codecs} 모듈에서 찾을 수 있습니다. 새로운 인코딩을 구현하는 것도 @code{codecs} 모듈의 이해가 필요합니다. 하지만 이 모듈에 의해서 반환되는 인코딩과 디코딩 함수는 대체로 편안한 것보다는 저수준이며, 새로운 인코딩을 작성하는 것은 전문적인 작업이므로 HOWTO에서 이 모듈을 다루지는 않겠습니다.

@node 파이썬 소스 코드에서 유니코드 리터럴,유니코드 속성,바이트열로 변환,파이썬의 유니코드 지원
@anchor{howto/unicode unicode-literals-in-python-source-code}@anchor{583a}
@subsubsection 파이썬 소스 코드에서 유니코드 리터럴


파이썬 소스 코드에서 특정한 유니코드 코드 포인트는 @code{\u} 이스케이프 시퀀스로 쓸 수 있으며, 코드 포인트를 의미하는 네 개의 16진수가 뒤따릅니다. @code{\U} 이스케이프 시퀀스와 비슷하지만 네 개가 아닌 여덟 개의 숫자여야 합니다:

@example
>>> s = "a\xac\u1234\u20ac\U00008000"
... #     ^^^^ 두 자리 16진수 이스케이프
... #         ^^^^^^ 네 자리 유ㅣ니코드 이스케이프
... #                     ^^^^^^^^^^ 8자리 유니코드 이스케이프
>>> [ord(c) for c in s]
[97, 172, 4660, 8364, 32768]
@end example

127보다 큰 코드 포인트에 대해 이스케이프 시퀀스를 사용하는 것은 양이 적을 때 괜찮지만, 프랑스어나 다른 악센트를 사용하는 언어로 작성된 프로그램 메시지 같이 악센트가 있는 문자를 사용할 경우 성가십니다. @ref{19ef,,chr()} 내장 함수를 이용하여 문자열을 조립할 수는 있지만 더 짜증납니다.

사용하는 언어의 자연스러운 인코딩으로 리터럴을 쓸 수 있어야 이상적입니다. 그래야 악센트가 있는 문자를 자연스럽게 표시하는 사용자가 가장 좋아하는 편집기로 파이썬 소스 코드를 편집할 수 있고, 실행시점에 올바른 문자를 가질 수 있습니다.

파이썬은 소스 코드를 UTF-8로 작성하는 것을 기본으로 지원하지만, 원하는 인코딩을 선언한다면 거의 모든 인코딩을 쓸 수 있습니다. 이는 소스 파일의 첫 번째 또는 두 번째 줄에 특별한 주석을 포함해 작동합니다:

@example
#!/usr/bin/env python
# -*- coding: latin-1 -*-

u = 'abcdé'
print(ord(u[-1]))
@end example

이 문법은 파일에 지역적인 변수를 명시하는데 사용되는 이맥스 표기법에서 영감을 받았습니다. 이맥스는 수많은 서로 다른 변수를 지원하지만 파이썬은 오직 ‘coding’만을 지원합니다. @code{-*-} 기호는 이맥스에게 주석이 특별함을 나타냅니다; 파이썬에게 아무 의미도 없지만 그저 관례를 따르는 것뿐입니다. 파이썬은 주석에서 @code{coding: name}이나 @code{coding=name}을 찾습니다.

이러한 주석을 포함하지 않는다면, 이미 언급한 것처럼 기본 인코딩으로 UTF-8이 사용됩니다. 
@geindex Python 향상 제안; PEP 263
PEP 263@footnote{https://peps.python.org/pep-0263/}에서 정보를 더 보시기 바랍니다.

@node 유니코드 속성,문자열 비교,파이썬 소스 코드에서 유니코드 리터럴,파이썬의 유니코드 지원
@anchor{howto/unicode id2}@anchor{583b}@anchor{howto/unicode unicode-properties}@anchor{264f}
@subsubsection 유니코드 속성


유니코드 사양은 코드 포인트에 대한 정보 데이터베이스를 포함합니다. 각각 정의한 코드 포인트에 대해서, 정보는 문자의 이름, 카테고리, 적용 가능한 숫자 값(로마 숫자와 같은 숫자 개념을 나타내는 문자, 3분의 1이나 5분의 4와 같은 분수를 표현하는 문자 등)을 포함합니다. 양방향 텍스트에서 코드 포인트를 사용하는 방법과 같은 디스플레이 관련 속성도 있습니다.

아래의 프로그램은 몇몇 개의 문자에 대한 정보를 표시하고 특정한 문자의 숫자 값을 출력합니다:

@example
import unicodedata

u = chr(233) + chr(0x0bf2) + chr(3972) + chr(6000) + chr(13231)

for i, c in enumerate(u):
    print(i, '%04x' % ord(c), unicodedata.category(c), end=" ")
    print(unicodedata.name(c))

# 두 번째 문자의 숫자 값을 가져옵니다
print(unicodedata.numeric(u[1]))
@end example

실행했을 때 다음을 출력합니다:

@example
0 00e9 Ll LATIN SMALL LETTER E WITH ACUTE
1 0bf2 No TAMIL NUMBER ONE THOUSAND
2 0f84 Mn TIBETAN MARK HALANTA
3 1770 Lo TAGBANWA LETTER SA
4 33af So SQUARE RAD OVER S SQUARED
1000.0
@end example

카테고리 코드는 문자의 유형을 설명하는 약어입니다. 이것들은 “Letter”, “Number”, “Punctuation”, 또는 “Symbol”과 같은 카테고리로 묶여 있고, 이는 하위 카테고리로 나누어 집니다. 위 결과물에서 코드를 가져와 보면, @code{'Ll'}는 ‘Letter, lowercase’, @code{'No'}는 “Number, other”, @code{'Mn'}은 “Mark, nonspacing”, 그리고 @code{'So'}는 “Symbol, other”를 뜻합니다. 카테고리 코드 목록에 대해서는 유니코드 문자 데이터베이스 문서의 일반 카테고리값 섹션@footnote{https://www.unicode.org/reports/tr44/#General_Category_Values}을 보세요.

@node 문자열 비교,유니코드 정규식,유니코드 속성,파이썬의 유니코드 지원
@anchor{howto/unicode comparing-strings}@anchor{583c}
@subsubsection 문자열 비교


유니코드는 문자열 비교를 약간 복잡하게 만듭니다, 같은 문자 집합이 다른 코드 포인트 시퀀스로 표시될 수 있기 때문입니다. 예를 들어, ‘ê’와 같은 문자는 단일 코드 포인트 U+00EA로 표시되거나, ‘e’의 코드 포인트 다음에 ‘COMBINING CIRCUMFLEX ACCENT’의 코드 포인트가 오는 U+0065 U+0302로 표시될 수 있습니다. 인쇄될 때 같은 출력을 생성하지만, 하나는 길이 1의 문자열이고 다른 하나는 길이 2입니다.

대소 문자를 구분하지 않는 비교를 위한 한 가지 도구는 문자열을 유니코드 표준에 설명된 알고리즘에 따라 대소 문자를 구분하지 않는 형식으로 변환하는 @ref{fd5,,casefold()} 문자열 메서드입니다. 이 알고리즘은 독일어 문자 ‘ß’(코드 포인트 U+00DF)를 소문자 ‘ss’ 쌍이 되도록 하는 것과 같이 문자를 특수하게 처리합니다.

@example
>>> street = 'Gürzenichstraße'
>>> street.casefold()
'gürzenichstrasse'
@end example

두 번째 도구는 @ref{10b,,unicodedata} 모듈의 @ref{8e3,,normalize()} 함수인데, 문자열을 여러 정규 형식 중 하나로 변환합니다. 여기서 뒤에 결합 문자가 오는 문자는 단일 문자로 바뀝니다. @code{normalize()}를 사용하면 두 문자열이 문자 결합을 다르게 사용할 때 같지 않다고 잘못 보고하지 않는 문자열 비교를 수행할 수 있습니다:

@example
import unicodedata

def compare_strs(s1, s2):
    def NFD(s):
        return unicodedata.normalize('NFD', s)

    return NFD(s1) == NFD(s2)

single_char = 'ê'
multiple_chars = '\N@{LATIN SMALL LETTER E@}\N@{COMBINING CIRCUMFLEX ACCENT@}'
print('length of first string=', len(single_char))
print('length of second string=', len(multiple_chars))
print(compare_strs(single_char, multiple_chars))
@end example

실행했을 때 다음을 출력합니다:

@example
$ python compare-strs.py
length of first string= 1
length of second string= 2
True
@end example

@ref{8e3,,normalize()} 함수의 첫 번째 인자는 원하는 정규화 형식을 제공하는 문자열입니다. ‘NFC’, ‘NFKC’, ‘NFD’ 및 ‘NFKD’ 중 하나일 수 있습니다.

유니코드 표준은 또한 대소 문자를 구별하지 않고 비교하지 않는 방법을 지정합니다:

@example
import unicodedata

def compare_caseless(s1, s2):
    def NFD(s):
        return unicodedata.normalize('NFD', s)

    return NFD(NFD(s1).casefold()) == NFD(NFD(s2).casefold())

# Example usage
single_char = 'ê'
multiple_chars = '\N@{LATIN CAPITAL LETTER E@}\N@{COMBINING CIRCUMFLEX ACCENT@}'

print(compare_caseless(single_char, multiple_chars))
@end example

이것은 @code{True}를 인쇄합니다. (왜 @code{NFD()}가 두 번 호출될까요? @ref{fd5,,casefold()}가 정규화되지 않은 문자열을 반환하도록 하는 문자가 몇 개 있기 때문입니다, 그래서 결과를 다시 정규화해야 합니다. 토론과 예제는 유니코드 표준의 3.13 절을 참조하십시오.)

@node 유니코드 정규식,참조<2>,문자열 비교,파이썬의 유니코드 지원
@anchor{howto/unicode unicode-regular-expressions}@anchor{583d}
@subsubsection 유니코드 정규식


@ref{be,,re} 모듈이 지원하는 정규식은 바이트열 또는 문자열로 제공됩니다. @code{\d}와 @code{\w} 같은 특별한 문자 시퀀스 몇몇은 패턴이 바이트열 또는 문자열에 의해 지원되는지 여부에 따라 다른 의미가 있습니다. 예를 들어, 바이트열에서 @code{\d}는 @code{[0-9]}와 일치하지만, 문자열에서는 @code{'Nd'} 카테고리에 속하는 아무 문자와 일치합니다.

이 예제의 문자열은 태국과 아라비아 숫자로 쓰인 숫자 57을 갖고 있습니다:

@example
import re
p = re.compile(r'\d+')

s = "Over \u0e55\u0e57 57 flavours"
m = p.search(s)
print(repr(m.group()))
@end example

실행했을 때, @code{\d+}은 태국 숫자와 일치하고 출력합니다. @ref{83d,,re.ASCII} 플래그를 @ref{dcd,,compile()}에 제공했을 경우, @code{\d+}는 부분 문자열 “57”을 대신 일치시킵니다.

비슷하게, @code{\w}는 매우 다양한 유니코드와 일치하지만, 바이트열이거나 @ref{83d,,re.ASCII}가 제공되면 오직 @code{[a-zA-Z0-9_]}과 일치하고, @code{\s}는 유니코드 공백 문자나 @code{[ \t\n\r\f\v]}와 일치합니다.

@node 참조<2>,,유니코드 정규식,파이썬의 유니코드 지원
@anchor{howto/unicode id3}@anchor{583e}
@subsubsection 참조


@c comment should these be mentioned earlier, e.g. at the start of the "introduction to Unicode" first section?

파이썬 유니코드 지원에 대한 몇 개의 좋은 대안 토론은 다음과 같습니다:


@itemize *

@item 
Nick Coghlan의 파이썬 3의 텍스트 파일 처리@footnote{https://python-notes.curiousefficiency.org/en/latest/python3/text_file_processing.html}.

@item 
Ned Batchelder가 PyCon 2012에서 발표한 실용 유니코드@footnote{https://nedbatchelder.com/text/unipain.html}.
@end itemize

@ref{169,,str} 타입은 파이썬 라이브러리 레퍼런스 @ref{1fdd,,텍스트 시퀀스 형 — str}에 설명되어 있습니다.

@ref{10b,,unicodedata} 모듈에 대한 문서입니다.

@ref{1c,,codecs} 모듈에 대한 문서입니다.

Marc-André Lemburg는 EuroPython 2002에서 발표한 "파이썬과 유니코드"라는 제목의 프레젠테이션 (PDF 슬라이드)@footnote{https://downloads.egenix.com/python/Unicode-EPC2002-Talk.pdf}을 주었습니다. 이 슬라이드는 파이썬 2의 유니코드 기능(유니코드 문자열 타입을 @code{unicode}라 부르고 리터럴 @code{u}로 시작하는) 디자인에 대한 훌륭한 개요서입니다.

@node 유니코드 데이터 읽고 쓰기,감사 인사,파이썬의 유니코드 지원,유니코드 HOWTO
@anchor{howto/unicode reading-and-writing-unicode-data}@anchor{583f}
@subsection 유니코드 데이터 읽고 쓰기


유니코드 데이터로 동작하는 코드를 작성했다면, 다음은 입출력이 문제입니다. 프로그램에 유니코드 문자열을 어떻게 집어넣을 것인가, 그리고 유니코드를 어떻게 저장 또는 전송에 적합한 형식으로 유니코드를 전환할 것인가?

입력 소스 및 출력 대상에 따라 아무것도 할 필요 없을 수도 있습니다; 응용 프로그램에서 사용되는 라이브러리가 유니코드를 기본 지원하는지 확인해야 됩니다. 예를 들어, XML 파서는 종종 유니코드 데이터를 반환합니다. 많은 관계형 데이터베이스 역시 유니코드 값 칼럼을 지원하고, SQL 질의로부터 유니코드 값을 반환받을 수 있습니다.

유니코드 데이터는 디스크에 쓰이거나 소켓에 전달되기 전에 보통 특정 인코딩으로 변경됩니다. 다음의 모든 작업을 직접 할 수 있습니다: 파일 열기, 8-bit 바이트열 객체 읽기, 그리고 @code{bytes.decode(encoding)}로 바이트열 전환하기. 하지만 이러한 수동 접근은 권장하지 않습니다.

한 가지 문제는 인코딩의 멀티 바이트 특성입니다; 하나의 유니코드 문자는 여러 바이트로 표현됩니다. 임의의 크기의 청크로 파일을 읽으려면 (1024 또는 4096바이트라 할 때), 단일 유니코드 문자를 인코딩하는 바이트 일부만 청크 끝에 읽는 경우를 잡기 위해 에러 처리 코드를 작성해야 합니다. 한 가지 해결책은 파일 전체를 메모리에 읽고 디코딩을 수행하는 것이지만, 극도로 큰 파일로 작업하는 것을 방해합니다; 2기가바이트 파일을 읽어야만 한다면, 2기가바이트 메모리가 필요합니다. (인코딩된 문자열과 유니코드 버전을 잠깐 메모리에 가지고 있어야 하므로 실제로는 더 필요합니다.)

부분 코딩 시퀀스의 경우를 잡기 위해 저수준 디코딩 인터페이스를 사용하는 것이 해결방법입니다. 이를 구현하는 작업은 이미 수행되었습니다: 내장 @ref{316,,open()} 함수는 파일 내용물이 지정된 인코딩이라고 가정하고, @ref{206a,,read()} 또는 @ref{2059,,write()}와 같은 메서드에서 유니코드 매개변수를 받아들이는 파일 객체를 반환할 수 있습니다. 이는 @ref{ad2,,str.encode()}와 @ref{ad3,,bytes.decode()}에서처럼 해석되는 @code{open()}의 `encoding'과 `errors' 매개변수를 통해 작동합니다.

그러므로 파일에서 유니코드를 읽는 것은 간단합니다:

@example
with open('unicode.txt', encoding='utf-8') as f:
    for line in f:
        print(repr(line))
@end example

업데이트 모드로 파일을 열어 읽기 또는 쓰기를 할 수도 있습니다:

@example
with open('test', encoding='utf-8', mode='w+') as f:
    f.write('\u4500 blah blah blah\n')
    f.seek(0)
    print(repr(f.readline()[:1]))
@end example

유니코드 문자 @code{U+FEFF}는 바이트 순서 표시(BOM)로 사용되고, 파일의 바이트 순서를 자동감지하기 위해 파일의 맨 처음 문자로 쓰이기도 합니다. UTF-16과 같은 일부 인코딩에서는 파일 시작 부분에 BOM이 있어야합니다; 이러한 인코딩이 쓰일 때, BOM이 자동으로 첫번째 문자로 작성되고 파일을 읽을 때 조용히 없어집니다. 리틀 엔디안과 빅 엔디안을 위해 특정 바이트 순서를 지정하고 BOM을 생략하지 않는 ‘utf-16-le’와 ‘utf-16-be’ 같은 인코딩의 변종들이 있습니다.

일부 영역에서는 UTF-8로 인코딩된 파일의 시작 부분에 “BOM”을 사용하는 것이 관례이기도 합니다; UTF-8은 바이트 순서에 의존하지 않으므로 이 이름은 오해의 소지가 있습니다. 이 표시는 이 파일이 UTF-8로 인코딩했음을 단순히 알립니다. 그런 파일을 읽으려면 자동으로 이 표시를 건너뛰기 위해 ‘utf-8-sig’ 코덱을 사용하세요.

@menu
* 유니코드 파일 이름:: 
* 유니코드 인식 프로그램 작성 팁:: 
* 참조: 참조<3>. 

@end menu

@node 유니코드 파일 이름,유니코드 인식 프로그램 작성 팁,,유니코드 데이터 읽고 쓰기
@anchor{howto/unicode unicode-filenames}@anchor{5840}
@subsubsection 유니코드 파일 이름


오늘날 자주 쓰이는 대부분의 운영체제는 임의의 유니코드 문자를 갖는 파일 이름을 지원합니다. 이는 보통 유니코드 문자열을 시스템에 의존적인 인코딩으로 변환하여 구현합니다. 오늘날의 파이썬은 UTF-8을 사용하는 것으로 수렴하고 있습니다: 맥 OS X의 파이썬은 여러 버전에서 UTF-8을 사용했으며, 파이썬 3.6은 윈도우에서도 UTF-8을 사용하도록 전환했습니다. 유닉스 시스템에서 @code{LANG} 또는 @code{LC_CTYPE} 환경변수를 설정했다면, @ref{75c,,파일 시스템 인코딩}만을 사용합니다; 그렇지 않은 경우, 기본 인코딩은 다시 UTF-8입니다.

인코딩을 수동으로 하고 싶을 때를 대비하여 @ref{e52,,sys.getfilesystemencoding()} 함수는 현재 사용하고 있는 시스템의 인코딩을 반환하지만, 귀찮게 그럴 이유는 없습니다. 읽기 또는 쓰기를 위해 파일을 열 때, 보통 파일 이름으로 유니코드 문자열을 제공하기만 하면 되고, 자동으로 올바른 인코딩으로 변환됩니다:

@example
filename = 'filename\u4500abc'
with open(filename, 'w') as f:
    f.write('blah\n')
@end example

@ref{a5,,os} 모듈 안의 @ref{26d,,os.stat()}과 같은 함수 역시 유니코드 파일 이름을 수용합니다.

@ref{12ff,,os.listdir()} 함수는 파일 이름을 반환하는데, 문제를 일으킵니다: 이 함수가 파일 이름의 유니코드 버전을 반환해야 할까요? 아니면 인코딩 버전을 포함한 바이트열을 반환해야 할까요? @code{os.listdir()}은 디렉터리 경로를 바이트열이나 유니코드 문자열로 제공했는지에 따라 둘 모두를 수행할 수 있습니다. 경로를 유니코드 문자열로 넘겨주었을 때 파일 이름은 파일 시스템의 인코딩으로 디코딩되고 유니코드 문자열의 목록이 반환되는 반면, 바이트를 넘겨주었을 때 파일 이름을 바이트열로 반환합니다. 예를 들어, 기본 @ref{75c,,파일 시스템 인코딩}이 UTF-8이라 가정할 때, 다음의 프로그램을 실행할 시:

@example
fn = 'filename\u4500abc'
f = open(fn, 'w')
f.close()

import os
print(os.listdir(b'.'))
print(os.listdir('.'))
@end example

아래의 출력을 만들 것입니다:

@example
$ python listdir-test.py
[b'filename\xe4\x94\x80abc', ...]
['filename\u4500abc', ...]
@end example

첫번째 리스트는 UTF-8로 인코딩된 파일 이름을 갖고, 두 번째 리스트는 유니코드 버전을 갖습니다.

대부분의 경우, 이러한 API로 유니코드만 사용할 수 있음에 유의하십시오. 바이트열 API는 디코딩할 수 없는 파일 이름이 존재하는 시스템에서만 사용해야 합니다; 지금은 유닉스 시스템에 불과합니다.

@node 유니코드 인식 프로그램 작성 팁,참조<3>,유니코드 파일 이름,유니코드 데이터 읽고 쓰기
@anchor{howto/unicode tips-for-writing-unicode-aware-programs}@anchor{5841}
@subsubsection 유니코드 인식 프로그램 작성 팁


이 섹션은 유니코드를 다루는 소프트웨어를 작성할 때의 몇 가지 제안을 제공합니다.

가장 중요한 팁은:

@quotation

소프트웨어는 가능한 한 빨리 입력 데이터를 디코딩하고 마지막에만 출력을 인코딩하여 내부적으로는 유니코드 문자열에서만 작동하는 것이 좋습니다.
@end quotation

유니코드와 바이트 문자열을 수용하는 처리 함수를 작성하려고 시도한다면, 두 가지 다른 종류의 문자열을 결합할 때마다 프로그램이 버그에 취약하다는 것을 알 수 있습니다. 자동 인코딩이나 디코딩은 없습니다: @code{str + bytes}을 수행한다면 @ref{198,,TypeError}가 발생합니다.

웹 브라우저나 다른 신뢰할 수 없는 소스로부터 온 데이터를 사용할 때, 일반적인 기법은 생성된 명령행에서 문자열을 사용하거나 데이터베이스에 저장하기 전에 문자열에서 잘못된 문자를 검사하는 것입니다. 이렇게 하고 있다면, 인코딩된 바이트열 데이터가 아닌 디코딩 된 문자열을 검사하도록 조심하기 바랍니다; 어떤 인코딩은 일대일 대응되지 않거나 ASCII와 완전히 호환되지 않는 흥미로운 속성을 가지고 있습니다. 입력 데이터가 인코딩을 지정하는 경우 특히 그러한데, 공격자가 인코딩한 바이트 스트림 안에 악의적인 텍스트를 숨기는 방법을 택할 수 있기 때문입니다.

@menu
* 파일 인코딩끼리 변환:: 
* 알 수 없는 인코딩의 파일:: 

@end menu

@node 파일 인코딩끼리 변환,알 수 없는 인코딩의 파일,,유니코드 인식 프로그램 작성 팁
@anchor{howto/unicode converting-between-file-encodings}@anchor{5842}
@subsubsection 파일 인코딩끼리 변환


@ref{1dd1,,StreamRecoder} 클래스는 인코딩 #1으로 데이터를 반환하는 스트림을 받아서 인코딩 #2로 데이터를 반환하는 스트림처럼 동작하여 인코딩 간에 투명하게 변환할 수 있습니다.

예를 들어, Latin-1을 사용하는 `f' 입력 파일을 가지고 있다면, 이를 UTF-8로 인코딩한 바이트열을 반환하기 위해 @ref{1dd1,,StreamRecoder}로 감쌀 수 있습니다:

@example
new_f = codecs.StreamRecoder(f,
    # en/decoder: read() 가 결과를 인코딩하고
    # write() 가 입력을 디코딩하는 데 사용됩니다.
    codecs.getencoder('utf-8'), codecs.getdecoder('utf-8'),

    # reader/writer: 스트림을 읽고 쓰는데 사용됩니다.
    codecs.getreader('latin-1'), codecs.getwriter('latin-1') )
@end example

@node 알 수 없는 인코딩의 파일,,파일 인코딩끼리 변환,유니코드 인식 프로그램 작성 팁
@anchor{howto/unicode files-in-an-unknown-encoding}@anchor{5843}
@subsubsection 알 수 없는 인코딩의 파일


파일을 변경해야 하지만 파일의 인코딩을 모를 때 할 수 있는 일은 무엇일까요? 인코딩이 ASCII 호환이라는 것을 알고 있고 ASCII 일부분을 검토 또는 수정만 하고자 한다면, @code{surrogateescape} 에러 핸들러와 함께 파일을 열 수 있습니다:

@example
with open(fname, 'r', encoding="ascii", errors="surrogateescape") as f:
    data = f.read()

# 문자열 'data' 를 변경합니다

with open(fname + '.new', 'w',
          encoding="ascii", errors="surrogateescape") as f:
    f.write(data)
@end example

@code{surrogateescape} 에러 핸들러는 비 ASCII 바이트들을 U+DC80부터 U+DCFF까지의 특수한 범위에 있는 코드 포인트로 디코딩합니다. 이러한 코드 포인트는 @code{surrogateescape} 에러 핸들러가 데이터를 인코딩하고 다시 쓰는 경우에 사용될 때 같은 바이트열로 다시 되돌려집니다.

@node 참조<3>,,유니코드 인식 프로그램 작성 팁,유니코드 데이터 읽고 쓰기
@anchor{howto/unicode id4}@anchor{5844}
@subsubsection 참조


David Beazley가 PyCon 2010에서 발표한 파이썬3 입출력 마스터하기@footnote{https://pyvideo.org/video/289/pycon-2010--mastering-python-3-i-o}의 한 섹션은 텍스트 처리와 바이너리 데이터 처리에 대해 논의합니다.

Marc-André Lemburg의 프레젠테이션 PDF 슬라이드 "파이썬에서 유니코드 인식 프로그램 작성"@footnote{https://downloads.egenix.com/python/LSM2005-Developing-Unicode-aware-applications-in-Python.pdf}은 문자 인코딩에 관한 질문은 물론 응용 프로그램을 국제화하고 지역화하는 방법에 관해 설명합니다. 이 슬라이드는 파이썬 2.x만을 다룹니다.

PyCon 2013에서 Benjamin Peterson이 발표한 파이썬에서 유니코드의 내부@footnote{https://pyvideo.org/video/1768/the-guts-of-unicode-in-python}은 파이썬 3.3에서 내부 유니코드 표현에 대해 논의합니다.

@node 감사 인사,,유니코드 데이터 읽고 쓰기,유니코드 HOWTO
@anchor{howto/unicode acknowledgements}@anchor{5845}
@subsection 감사 인사


이 문서의 초안은 Andrew Kuchling이 썼습니다. 이후 Alexander Belopolsky, Georg Brandl, Andrew Kuchling, 그리고 Ezio Melotti에 의해 개정되었습니다.

이 문서에 오류를 알려주거나 제안을 해주신 아래의 사람들에게 감사를 전합니다: Éric Araujo, Nicholas Bastin, Nick Coghlan, Marius Gedminas, Kent Johnson, Ken Krugler, Marc-André Lemburg, Martin von Löwis, Terry J. Reedy, Serhiy Storchaka, Eryk Sun, Chad Whitacre, Graham Wideman.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node urllib 패키지를 사용하여 인터넷 리소스를 가져오는 방법,ipaddress 모듈에 대한 소개,유니코드 HOWTO,파이썬 HOWTO
@anchor{howto/urllib2 doc}@anchor{5846}@anchor{howto/urllib2 howto-fetch-internet-resources-using-the-urllib-package}@anchor{5847}@anchor{howto/urllib2 translation-repo}@anchor{5848}@anchor{howto/urllib2 urllib-howto}@anchor{3fc2}
@section urllib 패키지를 사용하여 인터넷 리소스를 가져오는 방법


@*저자: 
Michael Foord@footnote{https://agileabstractions.com/}


@menu
* 소개: 소개<10>. 
* URL을 가져오기:: 
* 예외 처리: 예외 처리<2>. 
* info와 geturl:: 
* 오프너와 처리기:: 
* 기본 인증:: 
* 프락시:: 
* 소켓과 계층:: 
* 각주:: 

@end menu

@node 소개<10>,URL을 가져오기,,urllib 패키지를 사용하여 인터넷 리소스를 가져오는 방법
@anchor{howto/urllib2 introduction}@anchor{5849}
@subsection 소개


@subsubheading Related Articles



파이썬으로 웹 리소스를 가져오는 방법에 대한 다음 기사도 유용합니다:


@itemize *

@item 
Basic Authentication@footnote{https://web.archive.org/web/20201215133350/http://www.voidspace.org.uk/python/articles/authentication.shtml}

@quotation

파이썬 예제가 있는 `기본 인증(Basic Authentication)'에 대한 자습서.
@end quotation
@end itemize

`urllib.request'는 URL(Uniform Resource Locator)을 가져오기 위한 파이썬 모듈입니다. `urlopen' 함수의 형태로, 매우 간단한 인터페이스를 제공합니다. 다양한 프로토콜을 사용하여 URL을 가져올 수 있습니다. 또한 기본 인증(basic authentication), 쿠키, 프락시 등과 같은 일반적인 상황을 처리하기 위한 약간 더 복잡한 인터페이스도 제공합니다. 이들은 처리기와 오프너라는 객체에 의해 제공됩니다.

urllib.request는 관련 네트워크 프로토콜(예를 들어 FTP, HTTP)을 사용하여 많은 “URL 스킴(scheme)” (URL에서 @code{":"} 앞의 문자열로 식별됩니다 - 예를 들어 @code{"ftp"}는 @code{"ftp://python.org/"}의 URL 스킴입니다)에 대해 URL을 가져오는 것을 지원합니다. 이 자습서는 가장 흔한 경우인 HTTP에 초점을 맞춥니다.

간단한 상황에서 `urlopen'은 사용하기가 매우 쉽습니다. 그러나 HTTP URL을 열 때 에러나 사소하지 않은 사례를 만나자마자, HTTP(HyperText Transfer Protocol)에 대한 이해가 필요합니다. HTTP에 대한 가장 포괄적이고 권위 있는 레퍼런스는 
@geindex RFC; RFC 2616
RFC 2616@footnote{https://datatracker.ietf.org/doc/html/rfc2616.html}입니다. 이것은 기술 문서이며 읽기 쉽지 않습니다. 이 HOWTO에서는 `urllib'를 사용하는 방법을 설명하고, HTTP에 대해 충분히 자세하게 설명합니다. @ref{111,,urllib.request} 문서를 대체하려는 것이 아니라, 보조하려는 것입니다.

@node URL을 가져오기,예외 처리<2>,소개<10>,urllib 패키지를 사용하여 인터넷 리소스를 가져오는 방법
@anchor{howto/urllib2 fetching-urls}@anchor{584a}
@subsection URL을 가져오기


urllib.request를 사용하는 가장 간단한 방법은 다음과 같습니다:

@example
import urllib.request
with urllib.request.urlopen('http://python.org/') as response:
   html = response.read()
@end example

URL을 통해 리소스를 가져와서 임시 위치에 저장하려면, @ref{c51,,shutil.copyfileobj()}와 @ref{6ec,,tempfile.NamedTemporaryFile()} 함수를 통해 수행할 수 있습니다:

@example
import shutil
import tempfile
import urllib.request

with urllib.request.urlopen('http://python.org/') as response:
    with tempfile.NamedTemporaryFile(delete=False) as tmp_file:
        shutil.copyfileobj(response, tmp_file)

with open(tmp_file.name) as html:
    pass
@end example

urllib의 많은 용도는 이렇게 간단합니다 (‘http:’ URL 대신 ‘ftp:’, ‘file:’ 등으로 시작하는 URL을 사용할 수 있음에 유의하십시오). 그러나, 이 자습서의 목적은 HTTP에 집중하여 더 복잡한 경우를 설명하는 것입니다.

HTTP는 요청과 응답을 기반으로 합니다 - 클라이언트는 요청하고 서버는 응답을 보냅니다. urllib.request는 HTTP 요청을 나타내는 @code{Request} 객체로 이것을 반영합니다. 가장 간단한 형식에서 가져오려는 URL을 지정하는 Request 객체를 만듭니다. 이 Request 객체로 @code{urlopen}을 호출하면 요청된 URL에 대한 응답 객체를 반환합니다. 이 응답은 파일류 객체입니다, 응답에서 예를 들어 @code{.read()}를 호출할 수 있다는 뜻입니다:

@example
import urllib.request

req = urllib.request.Request('http://python.org/')
with urllib.request.urlopen(req) as response:
   the_page = response.read()
@end example

urllib.request는 모든 URL 스킴을 처리하기 위해 같은 Request 인터페이스를 사용합니다. 예를 들어, 다음과 같이 FTP 요청을 할 수 있습니다:

@example
req = urllib.request.Request('ftp://example.com/')
@end example

HTTP의 경우, Request 객체로 수행할 수 있는 추가 작업이 두 가지 있습니다: 첫째, 서버로 보낼 데이터를 전달할 수 있습니다. 둘째, 데이터나 요청 자체에 `관한' 추가 정보(“메타 데이터”)를 서버에 전달할 수 있습니다 - 이 정보는 HTTP “헤더”로 전송됩니다. 이들을 차례로 살펴봅시다.

@menu
* 데이터:: 
* 헤더:: 

@end menu

@node 데이터,헤더,,URL을 가져오기
@anchor{howto/urllib2 data}@anchor{584b}
@subsubsection 데이터


URL로 데이터를 보내려고 할 때도 있습니다 (종종 URL은 CGI (Common Gateway Interface) 스크립트나 다른 웹 응용 프로그램을 가리킵니다). HTTP에서, 이것은 종종 `POST' 요청이라고 알려진 것을 사용하여 수행됩니다. 이것은 종종 웹에서 채워 넣은 HTML 폼(form)을 제출할 때 브라우저가 수행하는 것입니다. 모든 POST가 폼에서 비롯될 필요는 없습니다: POST를 사용하여 임의의 데이터를 여러분 자신의 응용 프로그램으로 전송할 수 있습니다. 일반적인 HTML 폼의 경우, 데이터를 표준 방식으로 인코딩할 필요가 있고, 그런 다음 @code{data} 인자로 Request 객체에 전달합니다. 인코딩은 @ref{110,,urllib.parse} 라이브러리의 함수를 사용하여 수행됩니다.

@example
import urllib.parse
import urllib.request

url = 'http://www.someserver.com/cgi-bin/register.cgi'
values = @{'name' : 'Michael Foord',
          'location' : 'Northampton',
          'language' : 'Python' @}

data = urllib.parse.urlencode(values)
data = data.encode('ascii') # data는 바이트열이어야 합니다
req = urllib.request.Request(url, data)
with urllib.request.urlopen(req) as response:
   the_page = response.read()
@end example

다른 인코딩이 필요한 경우도 있음에 유의하십시오 (예를 들어 HTML 폼에서 파일을 업로드하는 경우 자세한 내용은 HTML Specification@comma{} Form Submission@footnote{https://www.w3.org/TR/REC-html40/interact/forms.html#h-17.13}을 참조하십시오).

@code{data} 인자를 전달하지 않으면, urllib는 `GET' 요청을 사용합니다. GET과 POST 요청이 다른 한 가지는 POST 요청에 종종 “부작용”이 있다는 것입니다: 어떤 방식으로든 시스템의 상태를 변경합니다 (예를 들어 캔에 담긴 스팸이 여러분의 문 앞에 배달되도록 주문을 넣습니다). HTTP 표준이 POST는 `항상' 부작용을 일으키려는 것이고, GET은 `절대' 부작용을 일으키지 않는다고 분명히 하고 있지만, GET 요청이 부작용을 일으키거나 POST 요청에 부작용이 없는 것을 막을 수는 없습니다. URL 자체에 인코딩하여 HTTP GET 요청에 데이터를 전달할 수도 있습니다.

다음과 같이 수행됩니다:

@example
>>> import urllib.request
>>> import urllib.parse
>>> data = @{@}
>>> data['name'] = 'Somebody Here'
>>> data['location'] = 'Northampton'
>>> data['language'] = 'Python'
>>> url_values = urllib.parse.urlencode(data)
>>> print(url_values)  # The order may differ from below.
name=Somebody+Here&language=Python&location=Northampton
>>> url = 'http://www.example.com/example.cgi'
>>> full_url = url + '?' + url_values
>>> data = urllib.request.urlopen(full_url)
@end example

전체 URL은 URL에 @code{?}를 추가한 다음 인코딩된 값을 추가하여 만들어짐에 유의하십시오.

@node 헤더,,데이터,URL을 가져오기
@anchor{howto/urllib2 headers}@anchor{584c}
@subsubsection 헤더


여기서는 HTTP 요청에 헤더를 추가하는 방법을 설명하기 위해 한 가지 특정 HTTP 헤더에 관해 설명합니다.

일부 웹 사이트는 @footnote{
예를 들어 구글.
} 프로그램이 브라우징하는 것을 싫어하거나, 브라우저에 따라 다른 버전을 보냅니다 @footnote{
브라우저 스니핑(browser sniffing)은 웹 사이트 디자인에 매우 나쁜 습관입니다 - 웹 표준을 사용하여 사이트를 구축하는 것이 훨씬 합리적입니다. 불행히도 많은 사이트가 여전히 브라우저마다 다른 버전을 보냅니다.
}. 기본적으로, urllib는 자신을 @code{Python-urllib/x.y}(여기서 @code{x} 와 @code{y}는 파이썬 배포의 주 버전과 부 버전 번호입니다, 예를 들어 @code{Python-urllib/2.5})로 식별하는데, 이는 사이트를 혼동시키거나, 단지 작동하지 않을 수 있습니다. 브라우저가 자신을 식별하는 방식은 @code{User-Agent} 헤더를 @footnote{
MSIE 6의 사용자 에이전트(user agent)는 `‘Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)’'입니다.
} 통하는 것입니다. Request 객체를 만들 때 헤더가 담긴 딕셔너리를 전달할 수 있습니다. 다음 예제는 위와 같은 요청을 하지만, 자신을 Internet Explorer의 한 버전으로 식별합니다 @footnote{
더 많은 HTTP 요청 헤더에 대한 자세한 내용은 @uref{https://jkorpela.fi/http.html,Quick Reference to HTTP Headers}를 참조하십시오.
}.

@example
import urllib.parse
import urllib.request

url = 'http://www.someserver.com/cgi-bin/register.cgi'
user_agent = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64)'
values = @{'name': 'Michael Foord',
          'location': 'Northampton',
          'language': 'Python' @}
headers = @{'User-Agent': user_agent@}

data = urllib.parse.urlencode(values)
data = data.encode('ascii')
req = urllib.request.Request(url, data, headers)
with urllib.request.urlopen(req) as response:
   the_page = response.read()
@end example

응답에는 두 가지 유용한 메서드도 있습니다. 문제가 발생했을 때 어떤 일이 발생했는지 살펴본 후에 나오는 @ref{584d,,info와 geturl} 섹션을 참조하십시오.

@node 예외 처리<2>,info와 geturl,URL을 가져오기,urllib 패키지를 사용하여 인터넷 리소스를 가져오는 방법
@anchor{howto/urllib2 handling-exceptions}@anchor{584e}
@subsection 예외 처리


`urlopen'은 응답을 처리할 수 없을 때 @ref{2be,,URLError}를 발생시킵니다 (하지만 파이썬 API에서 일상적으로 발생하는 @ref{2ec,,ValueError}, @ref{198,,TypeError} 등과 같은 내장 예외도 발생할 수 있습니다).

@ref{11dd,,HTTPError}는 HTTP URL의 특정 경우에 발생하는 @ref{2be,,URLError}의 서브 클래스입니다.

예외 클래스는 @ref{10f,,urllib.error} 모듈이 내보냅니다.

@menu
* URLError:: 
* HTTPError:: 
* 마무리:: 

@end menu

@node URLError,HTTPError,,예외 처리<2>
@anchor{howto/urllib2 urlerror}@anchor{584f}
@subsubsection URLError


종종, 네트워크 연결이 없거나 (지정된 서버로의 경로가 없거나), 지정된 서버가 없기 때문에 URLError가 발생합니다. 이 경우, 발생한 예외에는 ‘reason’ 어트리뷰트가 있으며, 이는 에러 코드와 텍스트 에러 메시지를 포함하는 튜플입니다.

예를 들어

@example
>>> req = urllib.request.Request('http://www.pretend_server.org')
>>> try: urllib.request.urlopen(req)
... except urllib.error.URLError as e:
...     print(e.reason)
...
(4, 'getaddrinfo failed')
@end example

@node HTTPError,마무리,URLError,예외 처리<2>
@anchor{howto/urllib2 httperror}@anchor{5850}
@subsubsection HTTPError


서버의 모든 HTTP 응답에는 숫자 “상태 코드”가 포함됩니다. 때때로 상태 코드는 서버가 요청을 이행할 수 없음을 나타냅니다. 기본 처리기는 이러한 응답 중 일부를 처리합니다 (예를 들어, 응답이 클라이언트가 다른 URL에서 문서를 가져오도록 요청하는 “리디렉션”인 경우, urllib가 이를 처리합니다). 처리할 수 없는 것들의 경우, urlopen은 @ref{11dd,,HTTPError}를 발생시킵니다. 일반적인 에러에는 ‘404’ (page not found - 페이지를 찾을 수 없음), ‘403’ (request forbidden - 요청이 금지됨) 및 ‘401’ (authentication required - 인증이 필요함)이 있습니다.

모든 HTTP 에러 코드에 대한 레퍼런스는 
@geindex RFC; RFC 2616
RFC 2616@footnote{https://datatracker.ietf.org/doc/html/rfc2616.html}의 섹션 10을 참조하십시오.

발생한 @ref{11dd,,HTTPError} 인스턴스는 서버에서 전송된 에러에 해당하는 정수 ‘code’ 어트리뷰트를 갖습니다.

@menu
* 에러 코드:: 

@end menu

@node 에러 코드,,,HTTPError
@anchor{howto/urllib2 error-codes}@anchor{5851}
@subsubsection 에러 코드


기본 처리기는 리디렉션(300 범위의 코드)을 처리하고, 100–299 범위의 코드는 성공을 나타내므로, 보통 400–599 범위의 에러 코드만 보게 됩니다.

@ref{3fe7,,http.server.BaseHTTPRequestHandler.responses} is a useful dictionary of
response codes that shows all the response codes used by 
@geindex RFC; RFC 2616
RFC 2616@footnote{https://datatracker.ietf.org/doc/html/rfc2616.html}.
An excerpt from the dictionary is shown below

@example
responses = @{
    ...
    <HTTPStatus.OK: 200>: ('OK', 'Request fulfilled, document follows'),
    ...
    <HTTPStatus.FORBIDDEN: 403>: ('Forbidden',
                                  'Request forbidden -- authorization will '
                                  'not help'),
    <HTTPStatus.NOT_FOUND: 404>: ('Not Found',
                                  'Nothing matches the given URI'),
    ...
    <HTTPStatus.IM_A_TEAPOT: 418>: ("I'm a Teapot",
                                    'Server refuses to brew coffee because '
                                    'it is a teapot'),
    ...
    <HTTPStatus.SERVICE_UNAVAILABLE: 503>: ('Service Unavailable',
                                            'The server cannot process the '
                                            'request due to a high load'),
    ...
    @}
@end example

에러가 발생할 때 서버는 HTTP 에러 코드*와* 에러 페이지를 반환하여 응답합니다. @ref{11dd,,HTTPError} 인스턴스를 반환된 페이지의 응답으로 사용할 수 있습니다. 이것은 code 어트리뷰트뿐만 아니라, @code{urllib.response} 모듈이 반환하는 것처럼 read, geturl 및 info 메서드도 가지고 있음을 의미합니다:

@example
>>> req = urllib.request.Request('http://www.python.org/fish.html')
>>> try:
...     urllib.request.urlopen(req)
... except urllib.error.HTTPError as e:
...     print(e.code)
...     print(e.read())
...
404
b'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\n\n\n<html
  ...
  <title>Page Not Found</title>\n
  ...
@end example

@node 마무리,,HTTPError,예외 처리<2>
@anchor{howto/urllib2 wrapping-it-up}@anchor{5852}
@subsubsection 마무리


따라서 @ref{11dd,,HTTPError} `또는' @ref{2be,,URLError}를 대비하려면 두 가지 기본적인 접근법이 있습니다. 저는 두 번째 접근법을 선호합니다.

@menu
* 1번:: 
* 2번:: 

@end menu

@node 1번,2번,,마무리
@anchor{howto/urllib2 number-1}@anchor{5853}
@subsubsection 1번


@example
from urllib.request import Request, urlopen
from urllib.error import URLError, HTTPError
req = Request(someurl)
try:
    response = urlopen(req)
except HTTPError as e:
    print('The server couldn\'t fulfill the request.')
    print('Error code: ', e.code)
except URLError as e:
    print('We failed to reach a server.')
    print('Reason: ', e.reason)
else:
    # 문제없습니다
@end example

@cartouche
@quotation 참고 
@code{except HTTPError}가 `반드시' 먼저 나와야 합니다. 그렇지 않으면 @code{except URLError}가 @ref{11dd,,HTTPError} `도' 잡습니다.
@end quotation
@end cartouche

@node 2번,,1번,마무리
@anchor{howto/urllib2 number-2}@anchor{5854}
@subsubsection 2번


@example
from urllib.request import Request, urlopen
from urllib.error import URLError
req = Request(someurl)
try:
    response = urlopen(req)
except URLError as e:
    if hasattr(e, 'reason'):
        print('We failed to reach a server.')
        print('Reason: ', e.reason)
    elif hasattr(e, 'code'):
        print('The server couldn\'t fulfill the request.')
        print('Error code: ', e.code)
else:
    # 문제없습니다
@end example

@node info와 geturl,오프너와 처리기,예외 처리<2>,urllib 패키지를 사용하여 인터넷 리소스를 가져오는 방법
@anchor{howto/urllib2 info-and-geturl}@anchor{584d}
@subsection info와 geturl


urlopen에 의해 반환된 응답(또는 @ref{11dd,,HTTPError} 인스턴스)에는 두 가지 유용한 메서드 @code{info()}와 @code{geturl()}이 있으며 @ref{112,,urllib.response} 모듈에 정의되어 있습니다.


@itemize *

@item 
`geturl' - 가져온 페이지의 실제 URL을 반환합니다. 이는 @code{urlopen}(또는 사용된 오프너 객체)이 리디렉션을 수행했을 수 있기 때문에 유용합니다. 가져온 페이지의 URL은 요청한 URL과 같지 않을 수 있습니다.

@item 
`info' - 가져온 페이지를 설명하는 딕셔너리류 객체, 특히 서버가 보낸 헤더. 현재 @ref{4000,,http.client.HTTPMessage} 인스턴스입니다.
@end itemize

일반적인 헤더에는 ‘Content-length’, ‘Content-type’ 등이 있습니다. 의미와 용도에 대한 간단한 설명이 붙은 유용한 HTTP 헤더 목록은 Quick Reference to HTTP Headers@footnote{https://jkorpela.fi/http.html}를 참조하십시오.

@node 오프너와 처리기,기본 인증,info와 geturl,urllib 패키지를 사용하여 인터넷 리소스를 가져오는 방법
@anchor{howto/urllib2 openers-and-handlers}@anchor{5855}
@subsection 오프너와 처리기


URL을 가져올 때 오프너(아마도 혼란스럽게 이름 붙여진 @ref{3f50,,urllib.request.OpenerDirector}의 인스턴스)를 사용합니다. 일반적으로 @code{urlopen}을 통해 기본 오프너를 사용했지만, 사용자 정의 오프너를 만들 수 있습니다. 오프너는 처리기를 사용합니다. 모든 “어려운 일은”은 처리기가 수행합니다. 각 처리기는 특정 URL 스킴(http, ftp 등)에 대한 URL을 여는 방법이나 URL 열기의 한 측면(예를 들어 HTTP 리디렉션이나 HTTP 쿠키)을 처리하는 방법을 알고 있습니다.

특정 처리기가 설치된 상태로 URL을 가져오려면 오프너를 만듭니다, 예를 들면 쿠키를 처리하는 오프너를 얻거나, 리디렉션을 처리하지 않는 오프너를 얻는 것이 있습니다.

오프너를 만들려면, @code{OpenerDirector}를 인스턴스화 한 다음, @code{.add_handler(some_handler_instance)}를 반복적으로 호출합니다.

또는, 단일 함수 호출로 오프너 객체를 만드는 편의 함수인 @code{build_opener}를 사용할 수 있습니다. @code{build_opener}는 기본적으로 여러 처리기를 추가하지만, 더 추가하거나 기본 처리기를 재정의하는 빠른 방법을 제공합니다.

여러분이 원할 수도 있는 다른 유형의 처리기는 프락시, 인증 및 다른 흔하지만 약간 특수한 상황을 처리할 수 있습니다.

@code{install_opener}를 사용하여 @code{opener} 객체를 (전역) 기본 오프너로 만들 수 있습니다. 즉, @code{urlopen}을 호출하면 설치한 오프너가 사용됩니다.

오프너 객체에는 @code{urlopen} 함수와 같은 방식으로 URL을 가져오기 위해 직접 호출할 수 있는 @code{open} 메서드가 있습니다: 편의 이외에, @code{install_opener}를 호출할 필요는 없습니다.

@node 기본 인증,프락시,오프너와 처리기,urllib 패키지를 사용하여 인터넷 리소스를 가져오는 방법
@anchor{howto/urllib2 basic-authentication}@anchor{5856}
@subsection 기본 인증


처리기를 만들고 설치하는 것을 설명하기 위해 @code{HTTPBasicAuthHandler}를 사용합니다. 기본 인증(Basic Authentication) 작동 방식에 대한 설명을 포함하여 이 주제에 대한 자세한 설명은 Basic Authentication Tutorial@footnote{https://web.archive.org/web/20201215133350/http://www.voidspace.org.uk/python/articles/authentication.shtml}을 참조하십시오.

인증이 필요할 때, 서버는 (401 에러 코드와 함께) 인증을 요청하는 헤더를 보냅니다. 이것은 인증 스킴과 ‘영역(realm)’을 지정합니다. 헤더는 이렇게 생겼습니다: @code{WWW-Authenticate: SCHEME realm="REALM"}.

예를 들어

@example
WWW-Authenticate: Basic realm="cPanel Users"
@end example

그러면 클라이언트는 영역에 적절한 이름과 비밀번호를 요청의 헤더로 포함해 요청을 다시 시도해야 합니다. 이것이 ‘기본 인증(basic authentication)’입니다. 이 프로세스를 단순화하기 위해 @code{HTTPBasicAuthHandler} 인스턴스와 이 처리기를 사용할 오프너를 만들 수 있습니다.

@code{HTTPBasicAuthHandler}는 비밀번호 관리자(password manager)라는 객체를 사용하여 URL과 영역에서 비밀번호(password)와 사용자 이름(username)으로의 매핑을 처리합니다. (서버가 보낸 인증 헤더로부터) 영역이 무엇인지 안다면, @code{HTTPPasswordMgr}를 사용할 수 있습니다. 종종 영역이 무엇인지 상관하지 않습니다. 이 경우, @code{HTTPPasswordMgrWithDefaultRealm}를 사용하는 것이 편리합니다. 이것은 URL의 기본 사용자 이름과 비밀번호를 지정할 수 있습니다. 특정 영역에 대한 대체 조합을 제공하지 않으면 이것이 제공됩니다. @code{None}을 @code{add_password} 메서드에 대한 realm 인자로 제공하여 이를 나타냅니다.

최상위 URL은 인증이 필요한 첫 번째 URL입니다. .add_password()에 전달한 URL보다 “더 깊은” URL도 일치합니다.

@example
# 비밀번호 관리자를 만듭니다
password_mgr = urllib.request.HTTPPasswordMgrWithDefaultRealm()

# 사용자 이름과 비밀번호를 추가합니다.
# 영역을 알면, None 대신 사용할 수 있습니다.
top_level_url = "http://example.com/foo/"
password_mgr.add_password(None, top_level_url, username, password)

handler = urllib.request.HTTPBasicAuthHandler(password_mgr)

# "오프너(opener)" (OpenerDirector 인스턴스)를 만듭니다
opener = urllib.request.build_opener(handler)

# 오프너를 사용해서 URL을 가져옵니다
opener.open(a_url)

# 오프너를 설치합니다.
# 이제 모든 urllib.request.urlopen 호출은 이 오프너를 사용합니다.
urllib.request.install_opener(opener)
@end example

@cartouche
@quotation 참고 
위의 예에서 @code{HTTPBasicAuthHandler} 만 @code{build_opener}에 제공했습니다. 기본적으로 오프너에는 일반적인 상황을 위한 처리기가 있습니다 – @code{ProxyHandler} (@code{http_proxy} 환경 변수와 같은 프락시 설정이 설정된 경우), @code{UnknownHandler}, @code{HTTPHandler}, @code{HTTPDefaultErrorHandler}, @code{HTTPRedirectHandler}, @code{FTPHandler}, @code{FileHandler}, @code{DataHandler}, @code{HTTPErrorProcessor}.
@end quotation
@end cartouche

@code{top_level_url}은 실제로 (‘http:’ 스킴 구성 요소와 호스트 이름 및 선택적인 포트 번호를 포함하는) 전체 URL, 예를 들어 @code{"http://example.com/"} `이거나' “주체(authority)” (즉, 선택적으로 포트 번호를 포함하는 호스트명), 예를 들어 @code{"example.com"}이나 @code{"example.com:8080"} (후자의 예는 포트 번호를 포함합니다)입니다. 주체가 있다면 “userinfo” 구성 요소를 포함하지 않아야 합니다 - 예를 들어 @code{"joe:password@@example.com"}은 올바르지 않습니다.

@node 프락시,소켓과 계층,기본 인증,urllib 패키지를 사용하여 인터넷 리소스를 가져오는 방법
@anchor{howto/urllib2 proxies}@anchor{5857}
@subsection 프락시


`urllib'는 프락시 설정을 자동 감지하여 사용합니다. 이는 프락시 설정이 감지될 때 일반 처리기 체인의 일부가 되는 @code{ProxyHandler}를 통해 이루어집니다. 일반적으로 좋은 일이지만, 도움이 되지 않는 경우가 있습니다 @footnote{
제 경우에는 직장에서 인터넷에 액세스하려면 프락시를 사용해야 합니다. 이 프락시를 통해 `localhost' URL을 가져오려고 시도하면 차단됩니다. IE는 프락시를 사용하도록 설정되어 있고, urllib는 이것을 선택합니다. localhost 서버로 스크립트를 테스트하려면, urllib가 프락시를 사용하지 못하게 해야 합니다.
}. 이를 위한 한 가지 방법은 프락시가 정의되지 않은 자체 @code{ProxyHandler}를 설정하는 것입니다. 이것은 @ref{5856,,Basic Authentication} 처리기 설정과 비슷한 단계를 사용하여 수행됩니다:

@example
>>> proxy_support = urllib.request.ProxyHandler(@{@})
>>> opener = urllib.request.build_opener(proxy_support)
>>> urllib.request.install_opener(opener)
@end example

@cartouche
@quotation 참고 
현재 @code{urllib.request}는 프락시를 통한 @code{https} 위치를 가져오는 것을 지원하지 `않습니다'. 그러나, 조리법에 표시된 대로 urllib.request를 확장하여 활성화할 수 있습니다 @footnote{
SSL 프락시용 urllib 오프너 (CONNECT 메서드): @uref{https://code.activestate.com/recipes/456195-urrlib2-opener-for-ssl-proxy-connect-method/,ASPN Cookbook Recipe}.
}.
@end quotation
@end cartouche

@cartouche
@quotation 참고 
변수 @code{REQUEST_METHOD}가 설정되면 @code{HTTP_PROXY}는 무시됩니다; @ref{3f4d,,getproxies()}의 설명서를 참조하십시오.
@end quotation
@end cartouche

@node 소켓과 계층,각주,프락시,urllib 패키지를 사용하여 인터넷 리소스를 가져오는 방법
@anchor{howto/urllib2 sockets-and-layers}@anchor{5858}
@subsection 소켓과 계층


웹에서 리소스를 가져오기 위한 파이썬 지원은 계층화되어 있습니다. urllib는 @ref{73,,http.client} 라이브러리를 사용하고, 이것은 다시 socket 라이브러리를 사용합니다.

파이썬 2.3부터 시간제한으로 중단되기 전에 소켓이 응답을 기다리는 시간을 지정할 수 있습니다. 웹 페이지를 가져와야 하는 응용 프로그램에서 유용 할 수 있습니다. 기본적으로 소켓 모듈에는 `시간제한이 없고' 멈출(hang) 수 있습니다. 현재, 소켓 시간제한은 http.client나 urllib.request 수준에서 노출되지 않습니다. 그러나, 다음과 같이 모든 소켓에 대해 기본 시간제한을 전역적으로 설정할 수 있습니다

@example
import socket
import urllib.request

# 초 단위 시간제한
timeout = 10
socket.setdefaulttimeout(timeout)

# 이 urllib.request.urlopen 호출은 이제 우리가 socket 모듈에 설정한 기본
# 시간제한을 사용합니다
req = urllib.request.Request('http://www.voidspace.org.uk')
response = urllib.request.urlopen(req)
@end example


__________________________________________________________________


@node 각주,,소켓과 계층,urllib 패키지를 사용하여 인터넷 리소스를 가져오는 방법
@anchor{howto/urllib2 footnotes}@anchor{5859}
@subsection 각주


이 문서는 John Lee가 검토하고 수정했습니다.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c import ipaddress

@node ipaddress 모듈에 대한 소개,DTrace와 SystemTap으로 CPython 계측하기,urllib 패키지를 사용하여 인터넷 리소스를 가져오는 방법,파이썬 HOWTO
@anchor{howto/ipaddress doc}@anchor{585a}@anchor{howto/ipaddress an-introduction-to-the-ipaddress-module}@anchor{585b}@anchor{howto/ipaddress ipaddress-howto}@anchor{41ff}@anchor{howto/ipaddress translation-repo}@anchor{585c}
@section ipaddress 모듈에 대한 소개


@*저자: 
Peter Moody


@*저자: 
Nick Coghlan


@subsubheading 개요



이 문서에서는 @ref{84,,ipaddress} 모듈을 간략하게 소개하고자 합니다. 주로 IP 네트워킹 용어에 익숙하지 않은 사용자를 대상으로 하지만, @code{ipaddress}가 IP 네트워크 주소 개념을 나타내는 방식에 대한 개요를 원하는 네트워크 엔지니어에게 유용할 수도 있습니다.

@menu
* 주소/네트워크/인터페이스 객체 만들기:: 
* 주소/네트워크/인터페이스 객체 검사:: 
* 주소 리스트로서의 네트워크:: 
* 비교: 비교<3>. 
* 다른 모듈과 함께 IP 주소 사용하기:: 
* 인스턴스 생성 실패 시 세부 사항 가져오기:: 

@end menu

@node 주소/네트워크/인터페이스 객체 만들기,주소/네트워크/인터페이스 객체 검사,,ipaddress 모듈에 대한 소개
@anchor{howto/ipaddress creating-address-network-interface-objects}@anchor{585d}
@subsection 주소/네트워크/인터페이스 객체 만들기


@ref{84,,ipaddress}는 IP 주소를 검사하고 조작하는 모듈이기 때문에, 가장 먼저 하고 싶어 할 일은 몇몇 객체를 만드는 것입니다. @code{ipaddress}를 사용하여 문자열과 정수로 객체를 만들 수 있습니다.

@menu
* IP 버전에 대한 참고 사항:: 
* IP 호스트 주소:: 
* 네트워크 정의:: 
* 호스트 인터페이스:: 

@end menu

@node IP 버전에 대한 참고 사항,IP 호스트 주소,,주소/네트워크/인터페이스 객체 만들기
@anchor{howto/ipaddress a-note-on-ip-versions}@anchor{585e}
@subsubsection IP 버전에 대한 참고 사항


특히 IP 주소 지정에 익숙하지 않은 독자는, 인터넷 프로토콜(IP)이 현재 프로토콜 버전 4에서 버전 6으로 이동하는 과정에 있음을 아는 것이 중요합니다. 이러한 전환은 주로 프로토콜 버전 4가 전 세계의 요구 사항을 처리할 수 있는 충분한 주소를 제공하지 못하기 때문에 발생하고 있습니다. 특히 인터넷에 직접 연결되는 장치의 수가 증가함에 따라 더욱더 그렇습니다.

프로토콜의 두 버전 간의 차이점에 대한 자세한 설명은 이 소개의 범위를 벗어나지만, 독자는 최소한 이 두 버전이 존재한다는 사실을 알고 있어야 하며, 때로는 한 버전이나 다른 버전을 강제로 사용해야 할 필요가 있습니다.

@node IP 호스트 주소,네트워크 정의,IP 버전에 대한 참고 사항,주소/네트워크/인터페이스 객체 만들기
@anchor{howto/ipaddress ip-host-addresses}@anchor{585f}
@subsubsection IP 호스트 주소


주소, 종종 “호스트 주소” 라고 하는 것은 IP 주소 지정으로 작업할 때 가장 기본 단위입니다. 주소를 만드는 가장 간단한 방법은 @ref{4201,,ipaddress.ip_address()} 팩토리 함수를 사용하는 것인데, 전달된 값을 기반으로 IPv4나 IPv6 주소 중 어느 것을 만들지 자동으로 결정합니다:

@example
>>> ipaddress.ip_address('192.0.2.1')
IPv4Address('192.0.2.1')
>>> ipaddress.ip_address('2001:DB8::1')
IPv6Address('2001:db8::1')
@end example

주소는 정수에서 직접 만들 수도 있습니다. 32비트에 들어맞는 값은 IPv4 주소로 간주합니다:

@example
>>> ipaddress.ip_address(3221225985)
IPv4Address('192.0.2.1')
>>> ipaddress.ip_address(42540766411282592856903984951653826561)
IPv6Address('2001:db8::1')
@end example

IPv4나 IPv6 주소를 강제로 사용하려면, 해당 클래스를 직접 호출할 수 있습니다. 이것은 작은 정수를 위한 IPv6 주소 생성을 강제하는 데 특히 유용합니다:

@example
>>> ipaddress.ip_address(1)
IPv4Address('0.0.0.1')
>>> ipaddress.IPv4Address(1)
IPv4Address('0.0.0.1')
>>> ipaddress.IPv6Address(1)
IPv6Address('::1')
@end example

@node 네트워크 정의,호스트 인터페이스,IP 호스트 주소,주소/네트워크/인터페이스 객체 만들기
@anchor{howto/ipaddress defining-networks}@anchor{5860}
@subsubsection 네트워크 정의


호스트 주소는 대개 IP 네트워크로 그룹화되므로, @ref{84,,ipaddress}는 네트워크 정의를 만들고, 검사하고, 조작할 방법을 제공합니다. IP 네트워크 객체는 해당 네트워크의 일부인 호스트 주소의 범위를 정의하는 문자열로 만들어집니다. 이 정보의 가장 간단한 형식은 “네트워크 주소/네트워크 접두사” 쌍입니다. 접두어는 주소가 네트워크 일부인지 판별하기 위해 비교되는 선행 비트 수를 정의하고, 네트워크 주소는 그 비트들의 기대되는 값을 정의합니다.

주소의 경우, 정확한 IP 버전을 자동으로 결정하는 팩토리 함수가 제공됩니다:

@example
>>> ipaddress.ip_network('192.0.2.0/24')
IPv4Network('192.0.2.0/24')
>>> ipaddress.ip_network('2001:db8::0/96')
IPv6Network('2001:db8::/96')
@end example

네트워크 객체는 호스트 비트가 설정될 수 없습니다. 이것의 실제 효과는 @code{192.0.2.1/24}가 네트워크를 설명하지 않는다는 것입니다. 이러한 정의는 인터페이스 객체라고 불리는데, 그 이유는 주어진 네트워크상의 컴퓨터의 네트워크 인터페이스를 기술하기 위해 네트워크상의 IP(ip-on-a-network) 표기법이 일반적으로 사용되기 때문입니다. 자세한 내용은 다음 절에서 설명합니다.

기본적으로, 호스트 비트가 설정된 네트워크 객체를 만들려고 하면 @ref{2ec,,ValueError}가 발생합니다. 추가 비트를 강제로 0으로 변환하도록 요청하려면, 플래그 @code{strict=False}를 생성자에 전달할 수 있습니다:

@example
>>> ipaddress.ip_network('192.0.2.1/24')
Traceback (most recent call last):
   ...
ValueError: 192.0.2.1/24 has host bits set
>>> ipaddress.ip_network('192.0.2.1/24', strict=False)
IPv4Network('192.0.2.0/24')
@end example

문자열 형식은 유연성이 훨씬 뛰어나지만, 호스트 주소와 마찬가지로 정수로 네트워크를 정의할 수도 있습니다. 이 경우, 네트워크는 정수로 식별되는 단일 주소만 포함하는 것으로 간주하므로, 네트워크 접두사는 전체 네트워크 주소를 포함합니다:

@example
>>> ipaddress.ip_network(3221225984)
IPv4Network('192.0.2.0/32')
>>> ipaddress.ip_network(42540766411282592856903984951653826560)
IPv6Network('2001:db8::/128')
@end example

주소와 마찬가지로, 팩토리 함수를 사용하는 대신 클래스 생성자를 직접 호출하여 특정 종류의 네트워크를 만들 수 있습니다.

@node 호스트 인터페이스,,네트워크 정의,주소/네트워크/인터페이스 객체 만들기
@anchor{howto/ipaddress host-interfaces}@anchor{5861}
@subsubsection 호스트 인터페이스


위에서 언급했듯이, 특정 네트워크상의 주소를 설명해야 하는 경우, 주소로도 네트워크 클래스로도 충분하지 않습니다. @code{192.0.2.1/24}와 같은 표기법은 네트워크 엔지니어와 방화벽과 라우터 용 도구를 작성하는 사람들이 “네트워크 @code{192.0.2.0/24} 상의 호스트 @code{192.0.2.1}" 의 줄임말로 많이 사용합니다. 따라서, @ref{84,,ipaddress}는 주소를 특정 네트워크와 결합하는 혼성 클래스 집합을 제공합니다. 생성을 위한 인터페이스는 주소 부분이 네트워크 주소로 제한되지 않는 것을 제외하고는 네트워크 객체를 정의하는 것과 같습니다.

@example
>>> ipaddress.ip_interface('192.0.2.1/24')
IPv4Interface('192.0.2.1/24')
>>> ipaddress.ip_interface('2001:db8::1/96')
IPv6Interface('2001:db8::1/96')
@end example

정수 입력이 받아들여지고 (네트워크처럼), 특정 IP 버전의 사용은 관련 생성자를 직접 호출함으로써 강제될 수 있습니다.

@node 주소/네트워크/인터페이스 객체 검사,주소 리스트로서의 네트워크,주소/네트워크/인터페이스 객체 만들기,ipaddress 모듈에 대한 소개
@anchor{howto/ipaddress inspecting-address-network-interface-objects}@anchor{5862}
@subsection 주소/네트워크/인터페이스 객체 검사


여러분은 IPv(4|6)(Address|Network|Interface) 객체를 만드는 데 어려움을 겪었다면, 아마도 이에 대한 정보를 얻고 자 할 것입니다. @ref{84,,ipaddress}는 이 작업을 쉽고 직관적으로 만들려고 합니다.

IP 버전 추출하기:

@example
>>> addr4 = ipaddress.ip_address('192.0.2.1')
>>> addr6 = ipaddress.ip_address('2001:db8::1')
>>> addr6.version
6
>>> addr4.version
4
@end example

인터페이스에서 네트워크 얻기:

@example
>>> host4 = ipaddress.ip_interface('192.0.2.1/24')
>>> host4.network
IPv4Network('192.0.2.0/24')
>>> host6 = ipaddress.ip_interface('2001:db8::1/96')
>>> host6.network
IPv6Network('2001:db8::/96')
@end example

네트워크에 있는 개별 주소의 개수 찾기:

@example
>>> net4 = ipaddress.ip_network('192.0.2.0/24')
>>> net4.num_addresses
256
>>> net6 = ipaddress.ip_network('2001:db8::0/96')
>>> net6.num_addresses
4294967296
@end example

네트워크에서 “사용 가능한” 주소 이터레이트하기:

@example
>>> net4 = ipaddress.ip_network('192.0.2.0/24')
>>> for x in net4.hosts():
...     print(x)
192.0.2.1
192.0.2.2
192.0.2.3
192.0.2.4
...
192.0.2.252
192.0.2.253
192.0.2.254
@end example

넷 마스크(netmask)(즉, 네트워크 접두사에 해당하는 비트들)나 호스트 마스크(hostmask)(넷 마스크에 포함되지 않은 비트들) 얻기:

@example
>>> net4 = ipaddress.ip_network('192.0.2.0/24')
>>> net4.netmask
IPv4Address('255.255.255.0')
>>> net4.hostmask
IPv4Address('0.0.0.255')
>>> net6 = ipaddress.ip_network('2001:db8::0/96')
>>> net6.netmask
IPv6Address('ffff:ffff:ffff:ffff:ffff:ffff::')
>>> net6.hostmask
IPv6Address('::ffff:ffff')
@end example

주소를 펼치거나 압축하기:

@example
>>> addr6.exploded
'2001:0db8:0000:0000:0000:0000:0000:0001'
>>> addr6.compressed
'2001:db8::1'
>>> net6.exploded
'2001:0db8:0000:0000:0000:0000:0000:0000/96'
>>> net6.compressed
'2001:db8::/96'
@end example

IPv4는 펼치기와 압축을 지원하지 않지만, 연관된 객체는 여전히 관련 프로퍼티를 제공하므로 버전 중립적인 코드가 IPv4 주소를 올바르게 처리하면서도 IPv6 주소에 대해 가장 간결하거나 가장 자세한 형식을 쉽게 사용할 수 있습니다.

@node 주소 리스트로서의 네트워크,비교<3>,주소/네트워크/인터페이스 객체 검사,ipaddress 모듈에 대한 소개
@anchor{howto/ipaddress networks-as-lists-of-addresses}@anchor{5863}
@subsection 주소 리스트로서의 네트워크


네트워크를 리스트로 취급하는 것이 때로 유용합니다. 즉, 다음과 같이 인덱싱할 수 있습니다:

@example
>>> net4[1]
IPv4Address('192.0.2.1')
>>> net4[-1]
IPv4Address('192.0.2.255')
>>> net6[1]
IPv6Address('2001:db8::1')
>>> net6[-1]
IPv6Address('2001:db8::ffff:ffff')
@end example

이것은 또한 네트워크 객체가 다음과 같은 리스트 멤버십 테스트 문법을 사용하는 데 적합하다는 것을 의미합니다:

@example
if address in network:
    # 뭔가 합니다
@end example

포함 테스트는 네트워크 접두어를 기반으로 효율적으로 수행됩니다:

@example
>>> addr4 = ipaddress.ip_address('192.0.2.1')
>>> addr4 in ipaddress.ip_network('192.0.2.0/24')
True
>>> addr4 in ipaddress.ip_network('192.0.3.0/24')
False
@end example

@node 비교<3>,다른 모듈과 함께 IP 주소 사용하기,주소 리스트로서의 네트워크,ipaddress 모듈에 대한 소개
@anchor{howto/ipaddress comparisons}@anchor{5864}
@subsection 비교


@ref{84,,ipaddress}는 의미가 있는 곳에서 객체를 비교하는 간단하고 직관적인 방법을 제공합니다:

@example
>>> ipaddress.ip_address('192.0.2.1') < ipaddress.ip_address('192.0.2.2')
True
@end example

다른 버전이나 다른 형의 객체를 비교하려고 하면 @ref{198,,TypeError} 예외가 발생합니다.

@node 다른 모듈과 함께 IP 주소 사용하기,인스턴스 생성 실패 시 세부 사항 가져오기,비교<3>,ipaddress 모듈에 대한 소개
@anchor{howto/ipaddress using-ip-addresses-with-other-modules}@anchor{5865}
@subsection 다른 모듈과 함께 IP 주소 사용하기


IP 주소를 사용하는 다른 모듈(가령 @ref{d1,,socket})은 일반적으로 이 모듈의 객체를 직접 받아들이지 않습니다. 대신, 다른 모듈이 받아들일 수 있는 정수나 문자열로 강제 변환되어야 합니다:

@example
>>> addr4 = ipaddress.ip_address('192.0.2.1')
>>> str(addr4)
'192.0.2.1'
>>> int(addr4)
3221225985
@end example

@node 인스턴스 생성 실패 시 세부 사항 가져오기,,다른 모듈과 함께 IP 주소 사용하기,ipaddress 모듈에 대한 소개
@anchor{howto/ipaddress getting-more-detail-when-instance-creation-fails}@anchor{5866}
@subsection 인스턴스 생성 실패 시 세부 사항 가져오기


버전에 구애받지 않는 팩토리 함수를 사용하여 주소/네트워크/인터페이스 객체를 만들 때, 단순히 전달된 값이 해당 형의 객체로 인식되지 않는다는 일반 에러 메시지와 함께 에러가 @ref{2ec,,ValueError}로 보고됩니다. 구체적인 에러가 없는 이유는 거부된 이유에 대한 자세한 정보를 제공하기 위해서는 값이 IPv4나 IPv6 중 어는 것으로 `가정되는지'를 알아야 하기 때문입니다.

이 추가 세부 정보를 액세스하는 것이 유용한 사용 사례를 지원하기 위해, 개별 클래스 생성자는 실제로 @ref{2ec,,ValueError} 서브 클래스 @ref{4206,,ipaddress.AddressValueError}와 @ref{4227,,ipaddress.NetmaskValueError}를 발생시켜 정의의 어느 부분에서 구문 분석하는 데 실패했는지 정확히 가리킵니다.

에러 메시지는 클래스 생성자를 직접 사용할 때 훨씬 자세해집니다. 예를 들어:

@example
>>> ipaddress.ip_address("192.168.0.256")
Traceback (most recent call last):
  ...
ValueError: '192.168.0.256' does not appear to be an IPv4 or IPv6 address
>>> ipaddress.IPv4Address("192.168.0.256")
Traceback (most recent call last):
  ...
ipaddress.AddressValueError: Octet 256 (> 255) not permitted in '192.168.0.256'

>>> ipaddress.ip_network("192.168.0.1/64")
Traceback (most recent call last):
  ...
ValueError: '192.168.0.1/64' does not appear to be an IPv4 or IPv6 network
>>> ipaddress.IPv4Network("192.168.0.1/64")
Traceback (most recent call last):
  ...
ipaddress.NetmaskValueError: '64' is not a valid netmask
@end example

그러나, 두 모듈 특정 예외 모두 부모 클래스로 @ref{2ec,,ValueError}를 가지므로, 특정 유형의 에러에 관심이 없다면, 여전히 다음과 같은 코드를 작성할 수 있습니다:

@example
try:
    network = ipaddress.IPv4Network(address)
except ValueError:
    print('address/netmask is invalid for IPv4:', address)
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node DTrace와 SystemTap으로 CPython 계측하기,Python support for the Linux perf profiler,ipaddress 모듈에 대한 소개,파이썬 HOWTO
@anchor{howto/instrumentation doc}@anchor{5867}@anchor{howto/instrumentation instrumentation}@anchor{e65}@anchor{howto/instrumentation instrumenting-cpython-with-dtrace-and-systemtap}@anchor{5868}@anchor{howto/instrumentation translation-repo}@anchor{5869}
@section DTrace와 SystemTap으로 CPython 계측하기


@*저자: 
David Malcolm


@*저자: 
Łukasz Langa


DTrace와 SystemTap은 컴퓨터 시스템의 프로세스가 하는 일을 검사할 수 있는 모니터링 도구입니다. 둘 다 도메인 특정 언어를 사용하여 다음과 같은 작업을 하는 스크립트를 작성할 수 있도록 합니다:


@itemize -

@item 
관찰할 프로세스를 걸러내기

@item 
관심 있는 프로세스에서 자료를 수집하기

@item 
데이터에 대한 보고서를 생성하기
@end itemize

파이썬 3.6부터, CPython은 DTrace나 SystemTap 스크립트에서 볼 수 있는 “마커(markers)”(“프로브(probes)”라고도 합니다)를 내장하도록 빌드할 수 있어서, 시스템에서 CPython 프로세스가 수행하고 있는 작업을 쉽게 관찰할 수 있습니다.

DTrace 마커는 CPython 인터프리터의 구현 세부 사항입니다. CPython 버전 간의 프로브 호환성에 대한 보장은 없습니다. CPython 버전을 변경할 때 경고 없이 DTrace 스크립트가 작동하지 않거나 올바르게 작동하지 않을 수 있습니다.

@menu
* 정적 마커 활성화하기:: 
* 정적 DTrace 프로브:: 
* 정적 SystemTap 마커:: 
* 사용 가능한 정적 마커:: 
* SystemTap 탭셋:: 
* 예제: 예제<34>. 

@end menu

@node 정적 마커 활성화하기,정적 DTrace 프로브,,DTrace와 SystemTap으로 CPython 계측하기
@anchor{howto/instrumentation enabling-the-static-markers}@anchor{586a}
@subsection 정적 마커 활성화하기


macOS는 DTrace를 기본적으로 지원합니다. 리눅스에서는, SystemTap을 위한 마커를 내장하도록 CPython을 빌드하려면, SystemTap 개발 도구를 설치해야 합니다.

리눅스 기계에서, 이렇게 하면 됩니다:

@example
$ yum install systemtap-sdt-devel
@end example

또는:

@example
$ sudo apt-get install systemtap-sdt-dev
@end example

그런 다음 CPython은 @ref{21a6,,--with-dtrace 옵션으로 구성}되어야 합니다:

@example
checking for --with-dtrace... yes
@end example

macOS에서, 배경에서 파이썬 프로세스를 실행하고 파이썬 공급자가 제공 한 모든 프로브를 나열하여 사용 가능한 DTrace 프로브를 나열할 수 있습니다:

@example
$ python3.6 -q &
$ sudo dtrace -l -P python$!  # or: dtrace -l -m python3.6

   ID   PROVIDER            MODULE                          FUNCTION NAME
29564 python18035        python3.6          _PyEval_EvalFrameDefault function-entry
29565 python18035        python3.6             dtrace_function_entry function-entry
29566 python18035        python3.6          _PyEval_EvalFrameDefault function-return
29567 python18035        python3.6            dtrace_function_return function-return
29568 python18035        python3.6                           collect gc-done
29569 python18035        python3.6                           collect gc-start
29570 python18035        python3.6          _PyEval_EvalFrameDefault line
29571 python18035        python3.6                 maybe_dtrace_line line
@end example

리눅스에서, “.note.stapsdt” 섹션이 있는지 확인하여 빌드 된 바이너리에 SystemTap 정적 마커가 있는지 확인할 수 있습니다.

@example
$ readelf -S ./python | grep .note.stapsdt
[30] .note.stapsdt        NOTE         0000000000000000 00308d78
@end example

파이썬을 (@ref{a63,,--enable-shared} 구성 옵션으로) 공유 라이브러리로 빌드했다면, 공유 라이브러리 내에서 대신 찾아야 합니다. 예를 들면:

@example
$ readelf -S libpython3.3dm.so.1.0 | grep .note.stapsdt
[29] .note.stapsdt        NOTE         0000000000000000 00365b68
@end example

충분히 최신의 readelf는 메타 데이터를 인쇄할 수 있습니다:

@example
$ readelf -n ./python

Displaying notes found at file offset 0x00000254 with length 0x00000020:
    Owner                 Data size          Description
    GNU                  0x00000010          NT_GNU_ABI_TAG (ABI version tag)
        OS: Linux, ABI: 2.6.32

Displaying notes found at file offset 0x00000274 with length 0x00000024:
    Owner                 Data size          Description
    GNU                  0x00000014          NT_GNU_BUILD_ID (unique build ID bitstring)
        Build ID: df924a2b08a7e89f6e11251d4602022977af2670

Displaying notes found at file offset 0x002d6c30 with length 0x00000144:
    Owner                 Data size          Description
    stapsdt              0x00000031          NT_STAPSDT (SystemTap probe descriptors)
        Provider: python
        Name: gc__start
        Location: 0x00000000004371c3, Base: 0x0000000000630ce2, Semaphore: 0x00000000008d6bf6
        Arguments: -4@@%ebx
    stapsdt              0x00000030          NT_STAPSDT (SystemTap probe descriptors)
        Provider: python
        Name: gc__done
        Location: 0x00000000004374e1, Base: 0x0000000000630ce2, Semaphore: 0x00000000008d6bf8
        Arguments: -8@@%rax
    stapsdt              0x00000045          NT_STAPSDT (SystemTap probe descriptors)
        Provider: python
        Name: function__entry
        Location: 0x000000000053db6c, Base: 0x0000000000630ce2, Semaphore: 0x00000000008d6be8
        Arguments: 8@@%rbp 8@@%r12 -4@@%eax
    stapsdt              0x00000046          NT_STAPSDT (SystemTap probe descriptors)
        Provider: python
        Name: function__return
        Location: 0x000000000053dba8, Base: 0x0000000000630ce2, Semaphore: 0x00000000008d6bea
        Arguments: 8@@%rbp 8@@%r12 -4@@%eax
@end example

위의 메타 데이터에는 SystemTap 스크립트에서 사용되는 추적 훅을 활성화하도록 전략적으로 배치된 기계 코드 명령어를 패치하는 방법을 설명하는 SystemTap에 대한 정보가 포함되어 있습니다.

@node 정적 DTrace 프로브,정적 SystemTap 마커,정적 마커 활성화하기,DTrace와 SystemTap으로 CPython 계측하기
@anchor{howto/instrumentation static-dtrace-probes}@anchor{586b}
@subsection 정적 DTrace 프로브


다음 예제 DTrace 스크립트는 파이썬 스크립트의 호출/반환 계층 구조를 표시하는 데 사용할 수 있습니다. “start”라는 함수의 호출 내부에서만 추적합니다. 즉, 임포트 시점의 함수 호출은 나열되지 않습니다:

@example
self int indent;

python$target:::function-entry
/copyinstr(arg1) == "start"/
@{
        self->trace = 1;
@}

python$target:::function-entry
/self->trace/
@{
        printf("%d\t%*s:", timestamp, 15, probename);
        printf("%*s", self->indent, "");
        printf("%s:%s:%d\n", basename(copyinstr(arg0)), copyinstr(arg1), arg2);
        self->indent++;
@}

python$target:::function-return
/self->trace/
@{
        self->indent--;
        printf("%d\t%*s:", timestamp, 15, probename);
        printf("%*s", self->indent, "");
        printf("%s:%s:%d\n", basename(copyinstr(arg0)), copyinstr(arg1), arg2);
@}

python$target:::function-return
/copyinstr(arg1) == "start"/
@{
        self->trace = 0;
@}
@end example

다음과 같은 식으로 호출할 수 있습니다:

@example
$ sudo dtrace -q -s call_stack.d -c "python3.6 script.py"
@end example

출력은 이런 식입니다:

@example
156641360502280  function-entry:call_stack.py:start:23
156641360518804  function-entry: call_stack.py:function_1:1
156641360532797  function-entry:  call_stack.py:function_3:9
156641360546807 function-return:  call_stack.py:function_3:10
156641360563367 function-return: call_stack.py:function_1:2
156641360578365  function-entry: call_stack.py:function_2:5
156641360591757  function-entry:  call_stack.py:function_1:1
156641360605556  function-entry:   call_stack.py:function_3:9
156641360617482 function-return:   call_stack.py:function_3:10
156641360629814 function-return:  call_stack.py:function_1:2
156641360642285 function-return: call_stack.py:function_2:6
156641360656770  function-entry: call_stack.py:function_3:9
156641360669707 function-return: call_stack.py:function_3:10
156641360687853  function-entry: call_stack.py:function_4:13
156641360700719 function-return: call_stack.py:function_4:14
156641360719640  function-entry: call_stack.py:function_5:18
156641360732567 function-return: call_stack.py:function_5:21
156641360747370 function-return:call_stack.py:start:28
@end example

@node 정적 SystemTap 마커,사용 가능한 정적 마커,정적 DTrace 프로브,DTrace와 SystemTap으로 CPython 계측하기
@anchor{howto/instrumentation static-systemtap-markers}@anchor{586c}
@subsection 정적 SystemTap 마커


SystemTap 통합을 사용하는 저수준의 방법은 정적 마커를 직접 사용하는 것입니다. 이를 포함하는 바이너리 파일을 명시적으로 지정해야 합니다.

예를 들어, 이 SystemTap 스크립트는 파이썬 스크립트의 호출/반환 계층 구조를 표시하는 데 사용할 수 있습니다:

@example
probe process("python").mark("function__entry") @{
     filename = user_string($arg1);
     funcname = user_string($arg2);
     lineno = $arg3;

     printf("%s => %s in %s:%d\\n",
            thread_indent(1), funcname, filename, lineno);
@}

probe process("python").mark("function__return") @{
    filename = user_string($arg1);
    funcname = user_string($arg2);
    lineno = $arg3;

    printf("%s <= %s in %s:%d\\n",
           thread_indent(-1), funcname, filename, lineno);
@}
@end example

다음과 같은 식으로 호출할 수 있습니다:

@example
$ stap \
  show-call-hierarchy.stp \
  -c "./python test.py"
@end example

출력은 이런 식입니다:

@example
11408 python(8274):        => __contains__ in Lib/_abcoll.py:362
11414 python(8274):         => __getitem__ in Lib/os.py:425
11418 python(8274):          => encode in Lib/os.py:490
11424 python(8274):          <= encode in Lib/os.py:493
11428 python(8274):         <= __getitem__ in Lib/os.py:426
11433 python(8274):        <= __contains__ in Lib/_abcoll.py:366
@end example

이때 열은 다음과 같습니다:


@itemize -

@item 
스크립트 시작으로부터 마이크로초 단위의 시간

@item 
실행 파일의 이름

@item 
프로세스의 PID
@end itemize

나머지는 스크립트가 실행될 때 호출/반환 계층 구조를 나타냅니다.

CPython의 @ref{a63,,--enable-shared} 빌드의 경우, 마커는 libpython 공유 라이브러리 내에 포함되어 있으며, 프로브의 점으로 구분된 경로는 이를 반영해야 합니다. 예를 들어, 위의 예제에서 다음과 같은 줄은:

@example
probe process("python").mark("function__entry") @{
@end example

대신 이렇게 되어야 합니다:

@example
probe process("python").library("libpython3.6dm.so.1.0").mark("function__entry") @{
@end example

(CPython 3.6의 @ref{508,,디버그 빌드}를 가정하고 있습니다)

@node 사용 가능한 정적 마커,SystemTap 탭셋,정적 SystemTap 마커,DTrace와 SystemTap으로 CPython 계측하기
@anchor{howto/instrumentation available-static-markers}@anchor{586d}@anchor{howto/instrumentation static-markers}@anchor{db0}
@subsection 사용 가능한 정적 마커



@deffn {Object} function__entry(str filename, str funcname, int lineno)

이 마커는 파이썬 함수의 실행이 시작되었음을 나타냅니다. 순수 파이썬 (바이트 코드) 함수에서만 트리거 됩니다.

파일명, 함수 이름 및 줄 번호가 위치 인자로 추적 스크립트에 제공됩니다. @code{$arg1}, @code{$arg2}, @code{$arg3}를 사용하여 액세스해야 합니다:

@quotation


@itemize *

@item 
@code{$arg1} : @code{(const char *)} 파일명, @code{user_string($arg1)}를 사용하여 액세스할 수 있습니다

@item 
@code{$arg2} : @code{(const char *)} 함수 이름, @code{user_string($arg2)}를 사용하여 액세스할 수 있습니다

@item 
@code{$arg3} : @code{int} 줄 번호
@end itemize
@end quotation
@end deffn


@deffn {Object} function__return(str filename, str funcname, int lineno)

이 마커는 @code{function__entry()}의 반대이며, 파이썬 함수의 실행이 종료되었음을 나타냅니다 (@code{return}를 통해서나 예외를 통해). 순수 파이썬 (바이트 코드) 함수에서만 트리거 됩니다.

인자는 @code{function__entry()}와 같습니다.
@end deffn


@deffn {Object} line(str filename, str funcname, int lineno)

이 마커는 파이썬 줄이 실행되려고 함을 나타냅니다. 파이썬 프로파일러를 사용하는 줄 단위 추적과 동등합니다. C 함수 내에서는 트리거 되지 않습니다.

인자는 @code{function__entry()}와 같습니다.
@end deffn


@deffn {Object} gc__start(int generation)

파이썬 인터프리터가 가비지 수집 사이클을 시작할 때 발생합니다. @code{arg0}은 @ref{1b3,,gc.collect()}처럼 스캔할 세대(generation)입니다.
@end deffn


@deffn {Object} gc__done(long collected)

파이썬 인터프리터가 가비지 수집 사이클을 끝낼 때 발생합니다. @code{arg0}은 수집된 객체 수입니다.
@end deffn


@deffn {Object} import__find__load__start(str modulename)

@ref{7b,,importlib}가 모듈을 찾고 로드하기 전에 발생합니다. @code{arg0}은 모듈 이름입니다.


Added in version 3.7.

@end deffn


@deffn {Object} import__find__load__done(str modulename, int found)

@ref{7b,,importlib}의 모듈을 찾고 로드하는 함수가 호출 된 후에 발생합니다. @code{arg0}은 모듈 이름이고, @code{arg1}은 모듈이 성공적으로 로드되었는지를 나타냅니다.


Added in version 3.7.

@end deffn


@deffn {Object} audit(str event, void *tuple)

@ref{191c,,sys.audit()}나 @ref{611,,PySys_Audit()}가 호출될 때 발생합니다. @code{arg0}는 C 문자열로 된 이벤트 이름이고, @code{arg1}은 튜플 객체를 가리키는 @ref{5dc,,PyObject} 포인터입니다.


Added in version 3.8.

@end deffn

@menu
* C Entry Points:: 
* C Probing Checks:: 

@end menu

@node C Entry Points,C Probing Checks,,사용 가능한 정적 마커
@anchor{howto/instrumentation c-entry-points}@anchor{586e}
@subsubsection C Entry Points


To simplify triggering of DTrace markers, Python’s C API comes with a number
of helper functions that mirror each static marker. On builds of Python without
DTrace enabled, these do nothing.

In general, it is not necessary to call these yourself, as Python will do
it for you.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

C API Function

@tab

Static Marker

@tab

Notes

@item

@geindex PyDTrace_LINE (C function)
@anchor{howto/instrumentation c PyDTrace_LINE}@anchor{586f}
@deffn {C 함수} void PyDTrace_LINE (const char *arg0, const char *arg1, int arg2)
@end deffn

@tab

@code{line()}

@tab

@item

@geindex PyDTrace_FUNCTION_ENTRY (C function)
@anchor{howto/instrumentation c PyDTrace_FUNCTION_ENTRY}@anchor{5870}
@deffn {C 함수} void PyDTrace_FUNCTION_ENTRY (const char *arg0, const char *arg1, int arg2)
@end deffn

@tab

@code{function__entry()}

@tab

@item

@geindex PyDTrace_FUNCTION_RETURN (C function)
@anchor{howto/instrumentation c PyDTrace_FUNCTION_RETURN}@anchor{5871}
@deffn {C 함수} void PyDTrace_FUNCTION_RETURN (const char *arg0, const char *arg1, int arg2)
@end deffn

@tab

@code{function__return()}

@tab

@item

@geindex PyDTrace_GC_START (C function)
@anchor{howto/instrumentation c PyDTrace_GC_START}@anchor{5872}
@deffn {C 함수} void PyDTrace_GC_START (int arg0)
@end deffn

@tab

@code{gc__start()}

@tab

@item

@geindex PyDTrace_GC_DONE (C function)
@anchor{howto/instrumentation c PyDTrace_GC_DONE}@anchor{5873}
@deffn {C 함수} void PyDTrace_GC_DONE (Py_ssize_t arg0)
@end deffn

@tab

@code{gc__done()}

@tab

@item

@geindex PyDTrace_INSTANCE_NEW_START (C function)
@anchor{howto/instrumentation c PyDTrace_INSTANCE_NEW_START}@anchor{5874}
@deffn {C 함수} void PyDTrace_INSTANCE_NEW_START (int arg0)
@end deffn

@tab

@code{instance__new__start()}

@tab

Not used by Python

@item

@geindex PyDTrace_INSTANCE_NEW_DONE (C function)
@anchor{howto/instrumentation c PyDTrace_INSTANCE_NEW_DONE}@anchor{5875}
@deffn {C 함수} void PyDTrace_INSTANCE_NEW_DONE (int arg0)
@end deffn

@tab

@code{instance__new__done()}

@tab

Not used by Python

@item

@geindex PyDTrace_INSTANCE_DELETE_START (C function)
@anchor{howto/instrumentation c PyDTrace_INSTANCE_DELETE_START}@anchor{5876}
@deffn {C 함수} void PyDTrace_INSTANCE_DELETE_START (int arg0)
@end deffn

@tab

@code{instance__delete__start()}

@tab

Not used by Python

@item

@geindex PyDTrace_INSTANCE_DELETE_DONE (C function)
@anchor{howto/instrumentation c PyDTrace_INSTANCE_DELETE_DONE}@anchor{5877}
@deffn {C 함수} void PyDTrace_INSTANCE_DELETE_DONE (int arg0)
@end deffn

@tab

@code{instance__delete__done()}

@tab

Not used by Python

@item

@geindex PyDTrace_IMPORT_FIND_LOAD_START (C function)
@anchor{howto/instrumentation c PyDTrace_IMPORT_FIND_LOAD_START}@anchor{5878}
@deffn {C 함수} void PyDTrace_IMPORT_FIND_LOAD_START (const char *arg0)
@end deffn

@tab

@code{import__find__load__start()}

@tab

@item

@geindex PyDTrace_IMPORT_FIND_LOAD_DONE (C function)
@anchor{howto/instrumentation c PyDTrace_IMPORT_FIND_LOAD_DONE}@anchor{5879}
@deffn {C 함수} void PyDTrace_IMPORT_FIND_LOAD_DONE (const char *arg0, int arg1)
@end deffn

@tab

@code{import__find__load__done()}

@tab

@item

@geindex PyDTrace_AUDIT (C function)
@anchor{howto/instrumentation c PyDTrace_AUDIT}@anchor{587a}
@deffn {C 함수} void PyDTrace_AUDIT (const char *arg0, void *arg1)
@end deffn

@tab

@code{audit()}

@tab

@end multitable


@node C Probing Checks,,C Entry Points,사용 가능한 정적 마커
@anchor{howto/instrumentation c-probing-checks}@anchor{587b}
@subsubsection C Probing Checks


@geindex PyDTrace_LINE_ENABLED (C function)
@anchor{howto/instrumentation c PyDTrace_LINE_ENABLED}@anchor{587c}
@deffn {C 함수} int PyDTrace_LINE_ENABLED (void)
@end deffn

@geindex PyDTrace_FUNCTION_ENTRY_ENABLED (C function)
@anchor{howto/instrumentation c PyDTrace_FUNCTION_ENTRY_ENABLED}@anchor{587d}
@deffn {C 함수} int PyDTrace_FUNCTION_ENTRY_ENABLED (void)
@end deffn

@geindex PyDTrace_FUNCTION_RETURN_ENABLED (C function)
@anchor{howto/instrumentation c PyDTrace_FUNCTION_RETURN_ENABLED}@anchor{587e}
@deffn {C 함수} int PyDTrace_FUNCTION_RETURN_ENABLED (void)
@end deffn

@geindex PyDTrace_GC_START_ENABLED (C function)
@anchor{howto/instrumentation c PyDTrace_GC_START_ENABLED}@anchor{587f}
@deffn {C 함수} int PyDTrace_GC_START_ENABLED (void)
@end deffn

@geindex PyDTrace_GC_DONE_ENABLED (C function)
@anchor{howto/instrumentation c PyDTrace_GC_DONE_ENABLED}@anchor{5880}
@deffn {C 함수} int PyDTrace_GC_DONE_ENABLED (void)
@end deffn

@geindex PyDTrace_INSTANCE_NEW_START_ENABLED (C function)
@anchor{howto/instrumentation c PyDTrace_INSTANCE_NEW_START_ENABLED}@anchor{5881}
@deffn {C 함수} int PyDTrace_INSTANCE_NEW_START_ENABLED (void)
@end deffn

@geindex PyDTrace_INSTANCE_NEW_DONE_ENABLED (C function)
@anchor{howto/instrumentation c PyDTrace_INSTANCE_NEW_DONE_ENABLED}@anchor{5882}
@deffn {C 함수} int PyDTrace_INSTANCE_NEW_DONE_ENABLED (void)
@end deffn

@geindex PyDTrace_INSTANCE_DELETE_START_ENABLED (C function)
@anchor{howto/instrumentation c PyDTrace_INSTANCE_DELETE_START_ENABLED}@anchor{5883}
@deffn {C 함수} int PyDTrace_INSTANCE_DELETE_START_ENABLED (void)
@end deffn

@geindex PyDTrace_INSTANCE_DELETE_DONE_ENABLED (C function)
@anchor{howto/instrumentation c PyDTrace_INSTANCE_DELETE_DONE_ENABLED}@anchor{5884}
@deffn {C 함수} int PyDTrace_INSTANCE_DELETE_DONE_ENABLED (void)
@end deffn

@geindex PyDTrace_IMPORT_FIND_LOAD_START_ENABLED (C function)
@anchor{howto/instrumentation c PyDTrace_IMPORT_FIND_LOAD_START_ENABLED}@anchor{5885}
@deffn {C 함수} int PyDTrace_IMPORT_FIND_LOAD_START_ENABLED (void)
@end deffn

@geindex PyDTrace_IMPORT_FIND_LOAD_DONE_ENABLED (C function)
@anchor{howto/instrumentation c PyDTrace_IMPORT_FIND_LOAD_DONE_ENABLED}@anchor{5886}
@deffn {C 함수} int PyDTrace_IMPORT_FIND_LOAD_DONE_ENABLED (void)
@end deffn

@geindex PyDTrace_AUDIT_ENABLED (C function)
@anchor{howto/instrumentation c PyDTrace_AUDIT_ENABLED}@anchor{5887}
@deffn {C 함수} int PyDTrace_AUDIT_ENABLED (void)

All calls to @code{PyDTrace} functions must be guarded by a call to one
of these functions. This allows Python to minimize performance impact
when probing is disabled.

On builds without DTrace enabled, these functions do nothing and return
@code{0}.
@end deffn

@node SystemTap 탭셋,예제<34>,사용 가능한 정적 마커,DTrace와 SystemTap으로 CPython 계측하기
@anchor{howto/instrumentation systemtap-tapsets}@anchor{5888}
@subsection SystemTap 탭셋


SystemTap 통합을 사용하는 고수준의 방법은 “탭셋(tapset)”을 사용하는 것입니다: SystemTap의 라이브러리에 해당하는 것입니다, 정적 마커의 저수준 세부 정보를 숨깁니다.

다음은 CPython의 비공유 빌드에 기반한 탭셋 파일입니다:

@example
/*
   function__entry 와 function__return 마커를 감싸는
   고수준 래핑을 제공합니다:
 \*/
probe python.function.entry = process("python").mark("function__entry")
@{
    filename = user_string($arg1);
    funcname = user_string($arg2);
    lineno = $arg3;
    frameptr = $arg4
@}
probe python.function.return = process("python").mark("function__return")
@{
    filename = user_string($arg1);
    funcname = user_string($arg2);
    lineno = $arg3;
    frameptr = $arg4
@}
@end example

이 파일을 SystemTap의 tapset 디렉터리(예를 들어, @code{/usr/share/systemtap/tapset})에 설치하면, 다음과 같은 추가 프로브 포인트를 사용할 수 있습니다:


@deffn {Object} python.function.entry(str filename, str funcname, int lineno, frameptr)

이 프로브 포인트는 파이썬 함수의 실행이 시작되었음을 나타냅니다. 순수 파이썬 (바이트 코드) 함수에서만 트리거 됩니다.
@end deffn


@deffn {Object} python.function.return(str filename, str funcname, int lineno, frameptr)

이 프로브 포인트는 @code{python.function.return}의 반대이며, 파이썬 함수의 실행이 종료되었음을 나타냅니다 (@code{return}를 통해서나 예외를 통해). 순수 파이썬 (바이트 코드) 함수에서만 트리거 됩니다.
@end deffn

@node 예제<34>,,SystemTap 탭셋,DTrace와 SystemTap으로 CPython 계측하기
@anchor{howto/instrumentation examples}@anchor{5889}
@subsection 예제


이 SystemTap 스크립트는 위의 탭셋을 사용하여, 정적 마커의 이름을 직접 지정하지 않고도, 파이썬 함수 호출 계층 구조를 추적하는 위의 예제를 보다 명확하게 구현합니다.:

@example
probe python.function.entry
@{
  printf("%s => %s in %s:%d\n",
         thread_indent(1), funcname, filename, lineno);
@}

probe python.function.return
@{
  printf("%s <= %s in %s:%d\n",
         thread_indent(-1), funcname, filename, lineno);
@}
@end example

다음 스크립트는 위의 탭셋을 사용하여 실행 중인 모든 CPython 코드의 top과 비슷한 보기를 제공합니다. 전체 시스템에서 1초마다 가장 자주 진입하는 바이트 코드 프레임 20개를 표시합니다:

@example
global fn_calls;

probe python.function.entry
@{
    fn_calls[pid(), filename, funcname, lineno] += 1;
@}

probe timer.ms(1000) @{
    printf("\033[2J\033[1;1H") /* clear screen \*/
    printf("%6s %80s %6s %30s %6s\n",
           "PID", "FILENAME", "LINE", "FUNCTION", "CALLS")
    foreach ([pid, filename, funcname, lineno] in fn_calls- limit 20) @{
        printf("%6d %80s %6d %30s %6d\n",
            pid, filename, lineno, funcname,
            fn_calls[pid, filename, funcname, lineno]);
    @}
    delete fn_calls;
@}
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Python support for the Linux perf profiler,Annotations Best Practices,DTrace와 SystemTap으로 CPython 계측하기,파이썬 HOWTO
@anchor{howto/perf_profiling doc}@anchor{1aab}@anchor{howto/perf_profiling perf-profiling}@anchor{4b0}@anchor{howto/perf_profiling python-support-for-the-linux-perf-profiler}@anchor{588a}@anchor{howto/perf_profiling translation-repo}@anchor{588b}
@section Python support for the Linux @code{perf} profiler


@*author: 
Pablo Galindo


The Linux perf profiler@footnote{https://perf.wiki.kernel.org}
is a very powerful tool that allows you to profile and obtain
information about the performance of your application.
@code{perf} also has a very vibrant ecosystem of tools
that aid with the analysis of the data that it produces.

The main problem with using the @code{perf} profiler with Python applications is that
@code{perf} only gets information about native symbols, that is, the names of
functions and procedures written in C. This means that the names and file names
of Python functions in your code will not appear in the output of @code{perf}.

Since Python 3.12, the interpreter can run in a special mode that allows Python
functions to appear in the output of the @code{perf} profiler. When this mode is
enabled, the interpreter will interpose a small piece of code compiled on the
fly before the execution of every Python function and it will teach @code{perf} the
relationship between this piece of code and the associated Python function using
@ref{52b1,,perf map files}.

@cartouche
@quotation 참고 
Support for the @code{perf} profiler is currently only available for Linux on
select architectures. Check the output of the @code{configure} build step or
check the output of @code{python -m sysconfig | grep HAVE_PERF_TRAMPOLINE}
to see if your system is supported.
@end quotation
@end cartouche

For example, consider the following script:

@example
def foo(n):
    result = 0
    for _ in range(n):
        result += 1
    return result

def bar(n):
    foo(n)

def baz(n):
    bar(n)

if __name__ == "__main__":
    baz(1000000)
@end example

We can run @code{perf} to sample CPU stack traces at 9999 hertz:

@example
$ perf record -F 9999 -g -o perf.data python my_script.py
@end example

Then we can use @code{perf report} to analyze the data:

@example
$ perf report --stdio -n -g

# Children      Self       Samples  Command     Shared Object       Symbol
# ........  ........  ............  ..........  ..................  ..........................................
#
    91.08%     0.00%             0  python.exe  python.exe          [.] _start
            |
            ---_start
            |
                --90.71%--__libc_start_main
                        Py_BytesMain
                        |
                        |--56.88%--pymain_run_python.constprop.0
                        |          |
                        |          |--56.13%--_PyRun_AnyFileObject
                        |          |          _PyRun_SimpleFileObject
                        |          |          |
                        |          |          |--55.02%--run_mod
                        |          |          |          |
                        |          |          |           --54.65%--PyEval_EvalCode
                        |          |          |                     _PyEval_EvalFrameDefault
                        |          |          |                     PyObject_Vectorcall
                        |          |          |                     _PyEval_Vector
                        |          |          |                     _PyEval_EvalFrameDefault
                        |          |          |                     PyObject_Vectorcall
                        |          |          |                     _PyEval_Vector
                        |          |          |                     _PyEval_EvalFrameDefault
                        |          |          |                     PyObject_Vectorcall
                        |          |          |                     _PyEval_Vector
                        |          |          |                     |
                        |          |          |                     |--51.67%--_PyEval_EvalFrameDefault
                        |          |          |                     |          |
                        |          |          |                     |          |--11.52%--_PyLong_Add
                        |          |          |                     |          |          |
                        |          |          |                     |          |          |--2.97%--_PyObject_Malloc
...
@end example

As you can see, the Python functions are not shown in the output, only @code{_PyEval_EvalFrameDefault}
(the function that evaluates the Python bytecode) shows up. Unfortunately that’s not very useful because all Python
functions use the same C function to evaluate bytecode so we cannot know which Python function corresponds to which
bytecode-evaluating function.

Instead, if we run the same experiment with @code{perf} support enabled we get:

@example
$ perf report --stdio -n -g

# Children      Self       Samples  Command     Shared Object       Symbol
# ........  ........  ............  ..........  ..................  .....................................................................
#
    90.58%     0.36%             1  python.exe  python.exe          [.] _start
            |
            ---_start
            |
                --89.86%--__libc_start_main
                        Py_BytesMain
                        |
                        |--55.43%--pymain_run_python.constprop.0
                        |          |
                        |          |--54.71%--_PyRun_AnyFileObject
                        |          |          _PyRun_SimpleFileObject
                        |          |          |
                        |          |          |--53.62%--run_mod
                        |          |          |          |
                        |          |          |           --53.26%--PyEval_EvalCode
                        |          |          |                     py::<module>:/src/script.py
                        |          |          |                     _PyEval_EvalFrameDefault
                        |          |          |                     PyObject_Vectorcall
                        |          |          |                     _PyEval_Vector
                        |          |          |                     py::baz:/src/script.py
                        |          |          |                     _PyEval_EvalFrameDefault
                        |          |          |                     PyObject_Vectorcall
                        |          |          |                     _PyEval_Vector
                        |          |          |                     py::bar:/src/script.py
                        |          |          |                     _PyEval_EvalFrameDefault
                        |          |          |                     PyObject_Vectorcall
                        |          |          |                     _PyEval_Vector
                        |          |          |                     py::foo:/src/script.py
                        |          |          |                     |
                        |          |          |                     |--51.81%--_PyEval_EvalFrameDefault
                        |          |          |                     |          |
                        |          |          |                     |          |--13.77%--_PyLong_Add
                        |          |          |                     |          |          |
                        |          |          |                     |          |          |--3.26%--_PyObject_Malloc
@end example

@menu
* How to enable perf profiling support:: 
* How to obtain the best results:: 
* How to work without frame pointers:: 

@end menu

@node How to enable perf profiling support,How to obtain the best results,,Python support for the Linux perf profiler
@anchor{howto/perf_profiling how-to-enable-perf-profiling-support}@anchor{588c}
@subsection How to enable @code{perf} profiling support


@code{perf} profiling support can be enabled either from the start using
the environment variable 
@geindex PYTHONPERFSUPPORT
@geindex 환경 변수; PYTHONPERFSUPPORT
@ref{698,,PYTHONPERFSUPPORT} or the
@ref{16f,,-X perf} option,
or dynamically using @ref{699,,sys.activate_stack_trampoline()} and
@ref{69a,,sys.deactivate_stack_trampoline()}.

The @code{sys} functions take precedence over the @code{-X} option,
the @code{-X} option takes precedence over the environment variable.

Example, using the environment variable:

@example
$ PYTHONPERFSUPPORT=1 perf record -F 9999 -g -o perf.data python my_script.py
$ perf report -g -i perf.data
@end example

Example, using the @code{-X} option:

@example
$ perf record -F 9999 -g -o perf.data python -X perf my_script.py
$ perf report -g -i perf.data
@end example

Example, using the @ref{df,,sys} APIs in file @code{example.py}:

@example
import sys

sys.activate_stack_trampoline("perf")
do_profiled_stuff()
sys.deactivate_stack_trampoline()

non_profiled_stuff()
@end example

…then:

@example
$ perf record -F 9999 -g -o perf.data python ./example.py
$ perf report -g -i perf.data
@end example

@node How to obtain the best results,How to work without frame pointers,How to enable perf profiling support,Python support for the Linux perf profiler
@anchor{howto/perf_profiling how-to-obtain-the-best-results}@anchor{588d}
@subsection How to obtain the best results


For best results, Python should be compiled with
@code{CFLAGS="-fno-omit-frame-pointer -mno-omit-leaf-frame-pointer"} as this allows
profilers to unwind using only the frame pointer and not on DWARF debug
information. This is because as the code that is interposed to allow @code{perf}
support is dynamically generated it doesn’t have any DWARF debugging information
available.

You can check if your system has been compiled with this flag by running:

@example
$ python -m sysconfig | grep 'no-omit-frame-pointer'
@end example

If you don’t see any output it means that your interpreter has not been compiled with
frame pointers and therefore it may not be able to show Python functions in the output
of @code{perf}.

@node How to work without frame pointers,,How to obtain the best results,Python support for the Linux perf profiler
@anchor{howto/perf_profiling how-to-work-without-frame-pointers}@anchor{588e}
@subsection How to work without frame pointers


If you are working with a Python interpreter that has been compiled without
frame pointers, you can still use the @code{perf} profiler, but the overhead will be
a bit higher because Python needs to generate unwinding information for every
Python function call on the fly. Additionally, @code{perf} will take more time to
process the data because it will need to use the DWARF debugging information to
unwind the stack and this is a slow process.

To enable this mode, you can use the environment variable
@geindex PYTHON_PERF_JIT_SUPPORT
@geindex 환경 변수; PYTHON_PERF_JIT_SUPPORT
@ref{4af,,PYTHON_PERF_JIT_SUPPORT} or the @ref{16f,,-X perf_jit} option,
which will enable the JIT mode for the @code{perf} profiler.

@cartouche
@quotation 참고 
Due to a bug in the @code{perf} tool, only @code{perf} versions higher than v6.8
will work with the JIT mode.  The fix was also backported to the v6.7.2
version of the tool.

Note that when checking the version of the @code{perf} tool (which can be done
by running @code{perf version}) you must take into account that some distros
add some custom version numbers including a @code{-} character.  This means
that @code{perf 6.7-3} is not necessarily @code{perf 6.7.3}.
@end quotation
@end cartouche

When using the perf JIT mode, you need an extra step before you can run @code{perf
report}. You need to call the @code{perf inject} command to inject the JIT
information into the @code{perf.data} file.:

@example
$ perf record -F 9999 -g -k 1 --call-graph dwarf -o perf.data python -Xperf_jit my_script.py
$ perf inject -i perf.data --jit --output perf.jit.data
$ perf report -g -i perf.jit.data
@end example

or using the environment variable:

@example
$ PYTHON_PERF_JIT_SUPPORT=1 perf record -F 9999 -g --call-graph dwarf -o perf.data python my_script.py
$ perf inject -i perf.data --jit --output perf.jit.data
$ perf report -g -i perf.jit.data
@end example

@code{perf inject --jit} command will read @code{perf.data},
automatically pick up the perf dump file that Python creates (in
@code{/tmp/perf-$PID.dump}), and then create @code{perf.jit.data} which merges all the
JIT information together. It should also create a lot of @code{jitted-XXXX-N.so}
files in the current directory which are ELF images for all the JIT trampolines
that were created by Python.

@cartouche
@quotation 경고 
When using @code{--call-graph dwarf}, the @code{perf} tool will take
snapshots of the stack of the process being profiled and save the
information in the @code{perf.data} file. By default, the size of the stack dump
is 8192 bytes, but you can change the size by passing it after
a comma like @code{--call-graph dwarf,16384}.

The size of the stack dump is important because if the size is too small
@code{perf} will not be able to unwind the stack and the output will be
incomplete. On the other hand, if the size is too big, then @code{perf} won’t
be able to sample the process as frequently as it would like as the overhead
will be higher.

The stack size is particularly important when profiling Python code compiled
with low optimization levels (like @code{-O0}), as these builds tend to have
larger stack frames. If you are compiling Python with @code{-O0} and not seeing
Python functions in your profiling output, try increasing the stack dump
size to 65528 bytes (the maximum):

@example
$ perf record -F 9999 -g -k 1 --call-graph dwarf,65528 -o perf.data python -Xperf_jit my_script.py
@end example

Different compilation flags can significantly impact stack sizes:


@itemize -

@item 
Builds with @code{-O0} typically have much larger stack frames than those with @code{-O1} or higher

@item 
Adding optimizations (@code{-O1}, @code{-O2}, etc.) typically reduces stack size

@item 
Frame pointers (@code{-fno-omit-frame-pointer}) generally provide more reliable stack unwinding
@end itemize
@end quotation
@end cartouche

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Annotations Best Practices,Isolating Extension Modules,Python support for the Linux perf profiler,파이썬 HOWTO
@anchor{howto/annotations doc}@anchor{588f}@anchor{howto/annotations annotations-best-practices}@anchor{5890}@anchor{howto/annotations annotations-howto}@anchor{9d9}@anchor{howto/annotations translation-repo}@anchor{5891}
@section Annotations Best Practices


@*author: 
Larry Hastings


@subsubheading Abstract



This document is designed to encapsulate the best practices
for working with annotations dicts.  If you write Python code
that examines @code{__annotations__} on Python objects, we
encourage you to follow the guidelines described below.

The document is organized into four sections:
best practices for accessing the annotations of an object
in Python versions 3.10 and newer,
best practices for accessing the annotations of an object
in Python versions 3.9 and older,
other best practices
for @code{__annotations__} that apply to any Python version,
and
quirks of @code{__annotations__}.

Note that this document is specifically about working with
@code{__annotations__}, not uses `for' annotations.
If you’re looking for information on how to use “type hints”
in your code, please see the @ref{10a,,typing} module.

@menu
* Accessing The Annotations Dict Of An Object In Python 3.10 And Newer: Accessing The Annotations Dict Of An Object In Python 3 10 And Newer. 
* Accessing The Annotations Dict Of An Object In Python 3.9 And Older: Accessing The Annotations Dict Of An Object In Python 3 9 And Older. 
* Manually Un-Stringizing Stringized Annotations:: 
* Best Practices For __annotations__ In Any Python Version:: 
* __annotations__ Quirks:: 

@end menu

@node Accessing The Annotations Dict Of An Object In Python 3 10 And Newer,Accessing The Annotations Dict Of An Object In Python 3 9 And Older,,Annotations Best Practices
@anchor{howto/annotations accessing-the-annotations-dict-of-an-object-in-python-3-10-and-newer}@anchor{5892}
@subsection Accessing The Annotations Dict Of An Object In Python 3.10 And Newer


Python 3.10 adds a new function to the standard library:
@ref{a14,,inspect.get_annotations()}.  In Python versions 3.10
through 3.13, calling this function is the best practice for
accessing the annotations dict of any object that supports
annotations.  This function can also “un-stringize”
stringized annotations for you.

In Python 3.14, there is a new @ref{6,,annotationlib} module
with functionality for working with annotations. This
includes a @ref{459,,annotationlib.get_annotations()} function,
which supersedes @ref{a14,,inspect.get_annotations()}.

If for some reason @ref{a14,,inspect.get_annotations()} isn’t
viable for your use case, you may access the
@code{__annotations__} data member manually.  Best practice
for this changed in Python 3.10 as well: as of Python 3.10,
@code{o.__annotations__} is guaranteed to `always' work
on Python functions, classes, and modules.  If you’re
certain the object you’re examining is one of these three
`specific' objects, you may simply use @code{o.__annotations__}
to get at the object’s annotations dict.

However, other types of callables–for example,
callables created by @ref{217,,functools.partial()}–may
not have an @code{__annotations__} attribute defined.  When
accessing the @code{__annotations__} of a possibly unknown
object,  best practice in Python versions 3.10 and
newer is to call @ref{dc9,,getattr()} with three arguments,
for example @code{getattr(o, '__annotations__', None)}.

Before Python 3.10, accessing @code{__annotations__} on a class that
defines no annotations but that has a parent class with
annotations would return the parent’s @code{__annotations__}.
In Python 3.10 and newer, the child class’s annotations
will be an empty dict instead.

@node Accessing The Annotations Dict Of An Object In Python 3 9 And Older,Manually Un-Stringizing Stringized Annotations,Accessing The Annotations Dict Of An Object In Python 3 10 And Newer,Annotations Best Practices
@anchor{howto/annotations accessing-the-annotations-dict-of-an-object-in-python-3-9-and-older}@anchor{5893}
@subsection Accessing The Annotations Dict Of An Object In Python 3.9 And Older


In Python 3.9 and older, accessing the annotations dict
of an object is much more complicated than in newer versions.
The problem is a design flaw in these older versions of Python,
specifically to do with class annotations.

Best practice for accessing the annotations dict of other
objects–functions, other callables, and modules–is the same
as best practice for 3.10, assuming you aren’t calling
@ref{a14,,inspect.get_annotations()}: you should use three-argument
@ref{dc9,,getattr()} to access the object’s @code{__annotations__}
attribute.

Unfortunately, this isn’t best practice for classes.  The problem
is that, since @code{__annotations__} is optional on classes, and
because classes can inherit attributes from their base classes,
accessing the @code{__annotations__} attribute of a class may
inadvertently return the annotations dict of a `base class.'
As an example:

@example
class Base:
    a: int = 3
    b: str = 'abc'

class Derived(Base):
    pass

print(Derived.__annotations__)
@end example

This will print the annotations dict from @code{Base}, not
@code{Derived}.

Your code will have to have a separate code path if the object
you’re examining is a class (@code{isinstance(o, type)}).
In that case, best practice relies on an implementation detail
of Python 3.9 and before: if a class has annotations defined,
they are stored in the class’s @ref{e56,,__dict__} dictionary.  Since
the class may or may not have annotations defined, best practice
is to call the @ref{2032,,get()} method on the class dict.

To put it all together, here is some sample code that safely
accesses the @code{__annotations__} attribute on an arbitrary
object in Python 3.9 and before:

@example
if isinstance(o, type):
    ann = o.__dict__.get('__annotations__', None)
else:
    ann = getattr(o, '__annotations__', None)
@end example

After running this code, @code{ann} should be either a
dictionary or @code{None}.  You’re encouraged to double-check
the type of @code{ann} using @ref{2ad,,isinstance()} before further
examination.

Note that some exotic or malformed type objects may not have
a @ref{e56,,__dict__} attribute, so for extra safety you may also wish
to use @ref{dc9,,getattr()} to access @code{__dict__}.

@node Manually Un-Stringizing Stringized Annotations,Best Practices For __annotations__ In Any Python Version,Accessing The Annotations Dict Of An Object In Python 3 9 And Older,Annotations Best Practices
@anchor{howto/annotations manually-un-stringizing-stringized-annotations}@anchor{5894}
@subsection Manually Un-Stringizing Stringized Annotations


In situations where some annotations may be “stringized”,
and you wish to evaluate those strings to produce the
Python values they represent, it really is best to
call @ref{a14,,inspect.get_annotations()} to do this work
for you.

If you’re using Python 3.9 or older, or if for some reason
you can’t use @ref{a14,,inspect.get_annotations()}, you’ll need
to duplicate its logic.  You’re encouraged to examine the
implementation of @code{inspect.get_annotations()} in the
current Python version and follow a similar approach.

In a nutshell, if you wish to evaluate a stringized annotation
on an arbitrary object @code{o}:


@itemize *

@item 
If @code{o} is a module, use @code{o.__dict__} as the
@code{globals} when calling @ref{4a4,,eval()}.

@item 
If @code{o} is a class, use @code{sys.modules[o.__module__].__dict__}
as the @code{globals}, and @code{dict(vars(o))} as the @code{locals},
when calling @ref{4a4,,eval()}.

@item 
If @code{o} is a wrapped callable using @ref{1221,,functools.update_wrapper()},
@ref{115c,,functools.wraps()}, or @ref{217,,functools.partial()}, iteratively
unwrap it by accessing either @code{o.__wrapped__} or @code{o.func} as
appropriate, until you have found the root unwrapped function.

@item 
If @code{o} is a callable (but not a class), use
@ref{14d8,,o.__globals__} as the globals when calling
@ref{4a4,,eval()}.
@end itemize

However, not all string values used as annotations can
be successfully turned into Python values by @ref{4a4,,eval()}.
String values could theoretically contain any valid string,
and in practice there are valid use cases for type hints that
require annotating with string values that specifically
`can’t' be evaluated.  For example:


@itemize *

@item 
@geindex Python 향상 제안; PEP 604
PEP 604@footnote{https://peps.python.org/pep-0604/} union types using @code{|}, before support for this
was added to Python 3.10.

@item 
Definitions that aren’t needed at runtime, only imported
when @ref{eef,,typing.TYPE_CHECKING} is true.
@end itemize

If @ref{4a4,,eval()} attempts to evaluate such values, it will
fail and raise an exception.  So, when designing a library
API that works with annotations, it’s recommended to only
attempt to evaluate string values when explicitly requested
to by the caller.

@node Best Practices For __annotations__ In Any Python Version,__annotations__ Quirks,Manually Un-Stringizing Stringized Annotations,Annotations Best Practices
@anchor{howto/annotations best-practices-for-annotations-in-any-python-version}@anchor{5895}
@subsection Best Practices For @code{__annotations__} In Any Python Version



@itemize *

@item 
You should avoid assigning to the @code{__annotations__} member
of objects directly.  Let Python manage setting @code{__annotations__}.

@item 
If you do assign directly to the @code{__annotations__} member
of an object, you should always set it to a @code{dict} object.

@item 
You should avoid accessing @code{__annotations__} directly on any object.
Instead, use @ref{459,,annotationlib.get_annotations()} (Python 3.14+)
or @ref{a14,,inspect.get_annotations()} (Python 3.10+).

@item 
If you do directly access the @code{__annotations__} member
of an object, you should ensure that it’s a
dictionary before attempting to examine its contents.

@item 
You should avoid modifying @code{__annotations__} dicts.

@item 
You should avoid deleting the @code{__annotations__} attribute
of an object.
@end itemize

@node __annotations__ Quirks,,Best Practices For __annotations__ In Any Python Version,Annotations Best Practices
@anchor{howto/annotations annotations-quirks}@anchor{5896}
@subsection @code{__annotations__} Quirks


In all versions of Python 3, function
objects lazy-create an annotations dict if no annotations
are defined on that object.  You can delete the @code{__annotations__}
attribute using @code{del fn.__annotations__}, but if you then
access @code{fn.__annotations__} the object will create a new empty dict
that it will store and return as its annotations.  Deleting the
annotations on a function before it has lazily created its annotations
dict will throw an @code{AttributeError}; using @code{del fn.__annotations__}
twice in a row is guaranteed to always throw an @code{AttributeError}.

Everything in the above paragraph also applies to class and module
objects in Python 3.10 and newer.

In all versions of Python 3, you can set @code{__annotations__}
on a function object to @code{None}.  However, subsequently
accessing the annotations on that object using @code{fn.__annotations__}
will lazy-create an empty dictionary as per the first paragraph of
this section.  This is `not' true of modules and classes, in any Python
version; those objects permit setting @code{__annotations__} to any
Python value, and will retain whatever value is set.

If Python stringizes your annotations for you
(using @code{from __future__ import annotations}), and you
specify a string as an annotation, the string will
itself be quoted.  In effect the annotation is quoted
`twice.'  For example:

@example
from __future__ import annotations
def foo(a: "str"): pass

print(foo.__annotations__)
@end example

This prints @code{@{'a': "'str'"@}}.  This shouldn’t really be considered
a “quirk”; it’s mentioned here simply because it might be surprising.

If you use a class with a custom metaclass and access @code{__annotations__}
on the class, you may observe unexpected behavior; see
@geindex Python 향상 제안; PEP 749#pep749-metaclasses
749@footnote{https://peps.python.org/pep-0749/#pep749-metaclasses} for some examples. You can avoid these
quirks by using @ref{459,,annotationlib.get_annotations()} on Python 3.14+ or
@ref{a14,,inspect.get_annotations()} on Python 3.10+. On earlier versions of
Python, you can avoid these bugs by accessing the annotations from the
class’s @ref{e56,,__dict__}
(for example, @code{cls.__dict__.get('__annotations__', None)}).

In some versions of Python, instances of classes may have an @code{__annotations__}
attribute. However, this is not supported functionality. If you need the
annotations of an instance, you can use @ref{f43,,type()} to access its class
(for example, @code{annotationlib.get_annotations(type(myinstance))} on Python 3.14+).

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Isolating Extension Modules,timer file descriptor HOWTO,Annotations Best Practices,파이썬 HOWTO
@anchor{howto/isolating-extensions doc}@anchor{5897}@anchor{howto/isolating-extensions isolating-extension-modules}@anchor{5898}@anchor{howto/isolating-extensions isolating-extensions-howto}@anchor{166}@anchor{howto/isolating-extensions translation-repo}@anchor{5899}
@section Isolating Extension Modules


@subsubheading Abstract



Traditionally, state belonging to Python extension modules was kept in C
@code{static} variables, which have process-wide scope. This document
describes problems of such per-process state and shows a safer way:
per-module state.

The document also describes how to switch to per-module state where
possible. This transition involves allocating space for that state, potentially
switching from static types to heap types, and—perhaps most
importantly—accessing per-module state from code.

@menu
* Who should read this:: 
* Background:: 
* Making Modules Safe with Multiple Interpreters:: 
* Heap Types:: 
* Open Issues:: 

@end menu

@node Who should read this,Background,,Isolating Extension Modules
@anchor{howto/isolating-extensions who-should-read-this}@anchor{589a}
@subsection Who should read this


This guide is written for maintainers of @ref{1fba,,C-API} extensions
who would like to make that extension safer to use in applications where
Python itself is used as a library.

@node Background,Making Modules Safe with Multiple Interpreters,Who should read this,Isolating Extension Modules
@anchor{howto/isolating-extensions background}@anchor{589b}
@subsection Background


An `interpreter' is the context in which Python code runs. It contains
configuration (e.g. the import path) and runtime state (e.g. the set of
imported modules).

Python supports running multiple interpreters in one process. There are
two cases to think about—users may run interpreters:


@itemize -

@item 
in sequence, with several @ref{5172,,Py_InitializeEx()}/@ref{f10,,Py_FinalizeEx()}
cycles, and

@item 
in parallel, managing “sub-interpreters” using
@ref{1b2f,,Py_NewInterpreter()}/@ref{1847,,Py_EndInterpreter()}.
@end itemize

Both cases (and combinations of them) would be most useful when
embedding Python within a library. Libraries generally shouldn’t make
assumptions about the application that uses them, which include
assuming a process-wide “main Python interpreter”.

Historically, Python extension modules don’t handle this use case well.
Many extension modules (and even some stdlib modules) use `per-process'
global state, because C @code{static} variables are extremely easy to use.
Thus, data that should be specific to an interpreter ends up being shared
between interpreters. Unless the extension developer is careful, it is very
easy to introduce edge cases that lead to crashes when a module is loaded in
more than one interpreter in the same process.

Unfortunately, `per-interpreter' state is not easy to achieve. Extension
authors tend to not keep multiple interpreters in mind when developing,
and it is currently cumbersome to test the behavior.

@menu
* Enter Per-Module State:: 
* Isolated Module Objects:: 
* Surprising Edge Cases:: 

@end menu

@node Enter Per-Module State,Isolated Module Objects,,Background
@anchor{howto/isolating-extensions enter-per-module-state}@anchor{589c}
@subsubsection Enter Per-Module State


Instead of focusing on per-interpreter state, Python’s C API is evolving
to better support the more granular `per-module' state.
This means that C-level data should be attached to a `module object'.
Each interpreter creates its own module object, keeping the data separate.
For testing the isolation, multiple module objects corresponding to a single
extension can even be loaded in a single interpreter.

Per-module state provides an easy way to think about lifetime and
resource ownership: the extension module will initialize when a
module object is created, and clean up when it’s freed. In this regard,
a module is just like any other @ref{5dc,,PyObject}*; there are no “on
interpreter shutdown” hooks to think—or forget—about.

Note that there are use cases for different kinds of “globals”:
per-process, per-interpreter, per-thread or per-task state.
With per-module state as the default, these are still possible,
but you should treat them as exceptional cases:
if you need them, you should give them additional care and testing.
(Note that this guide does not cover them.)

@node Isolated Module Objects,Surprising Edge Cases,Enter Per-Module State,Background
@anchor{howto/isolating-extensions isolated-module-objects}@anchor{589d}
@subsubsection Isolated Module Objects


The key point to keep in mind when developing an extension module is
that several module objects can be created from a single shared library.
For example:

@example
>>> import sys
>>> import binascii
>>> old_binascii = binascii
>>> del sys.modules['binascii']
>>> import binascii  # create a new module object
>>> old_binascii == binascii
False
@end example

As a rule of thumb, the two modules should be completely independent.
All objects and state specific to the module should be encapsulated
within the module object, not shared with other module objects, and
cleaned up when the module object is deallocated.
Since this just is a rule of thumb, exceptions are possible
(see @ref{589e,,Managing Global State}), but they will need more
thought and attention to edge cases.

While some modules could do with less stringent restrictions, isolated
modules make it easier to set clear expectations and guidelines that
work across a variety of use cases.

@node Surprising Edge Cases,,Isolated Module Objects,Background
@anchor{howto/isolating-extensions surprising-edge-cases}@anchor{589f}
@subsubsection Surprising Edge Cases


Note that isolated modules do create some surprising edge cases. Most
notably, each module object will typically not share its classes and
exceptions with other similar modules. Continuing from the
@ref{589d,,example above},
note that @code{old_binascii.Error} and @code{binascii.Error} are
separate objects. In the following code, the exception is `not' caught:

@example
>>> old_binascii.Error == binascii.Error
False
>>> try:
...     old_binascii.unhexlify(b'qwertyuiop')
... except binascii.Error:
...     print('boo')
...
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
binascii.Error: Non-hexadecimal digit found
@end example

This is expected. Notice that pure-Python modules behave the same way:
it is a part of how Python works.

The goal is to make extension modules safe at the C level, not to make
hacks behave intuitively. Mutating @code{sys.modules} “manually” counts
as a hack.

@node Making Modules Safe with Multiple Interpreters,Heap Types,Background,Isolating Extension Modules
@anchor{howto/isolating-extensions making-modules-safe-with-multiple-interpreters}@anchor{58a0}
@subsection Making Modules Safe with Multiple Interpreters


@menu
* Managing Global State:: 
* Managing Per-Module State:: 
* Opt-Out; Limiting to One Module Object per Process: Opt-Out Limiting to One Module Object per Process. 
* Module State Access from Functions:: 

@end menu

@node Managing Global State,Managing Per-Module State,,Making Modules Safe with Multiple Interpreters
@anchor{howto/isolating-extensions managing-global-state}@anchor{589e}
@subsubsection Managing Global State


Sometimes, the state associated with a Python module is not specific to that module, but
to the entire process (or something else “more global” than a module).
For example:


@itemize -

@item 
The @code{readline} module manages `the' terminal.

@item 
A module running on a circuit board wants to control `the' on-board
LED.
@end itemize

In these cases, the Python module should provide `access' to the global
state, rather than `own' it. If possible, write the module so that
multiple copies of it can access the state independently (along with
other libraries, whether for Python or other languages). If that is not
possible, consider explicit locking.

If it is necessary to use process-global state, the simplest way to
avoid issues with multiple interpreters is to explicitly prevent a
module from being loaded more than once per process—see
@ref{524f,,Opt-Out; Limiting to One Module Object per Process}.

@node Managing Per-Module State,Opt-Out Limiting to One Module Object per Process,Managing Global State,Making Modules Safe with Multiple Interpreters
@anchor{howto/isolating-extensions managing-per-module-state}@anchor{58a1}
@subsubsection Managing Per-Module State


To use per-module state, use
@ref{5252,,multi-phase extension module initialization}.
This signals that your module supports multiple interpreters correctly.

Set @code{PyModuleDef.m_size} to a positive number to request that many
bytes of storage local to the module. Usually, this will be set to the
size of some module-specific @code{struct}, which can store all of the
module’s C-level state. In particular, it is where you should put
pointers to classes (including exceptions, but excluding static types)
and settings (e.g. @code{csv}’s @ref{1b8f,,field_size_limit})
which the C code needs to function.

@cartouche
@quotation 참고 
Another option is to store state in the module’s @code{__dict__},
but you must avoid crashing when users modify @code{__dict__} from
Python code. This usually means error- and type-checking at the C level,
which is easy to get wrong and hard to test sufficiently.

However, if module state is not needed in C code, storing it in
@code{__dict__} only is a good idea.
@end quotation
@end cartouche

If the module state includes @code{PyObject} pointers, the module object
must hold references to those objects and implement the module-level hooks
@code{m_traverse}, @code{m_clear} and @code{m_free}. These work like
@code{tp_traverse}, @code{tp_clear} and @code{tp_free} of a class. Adding them will
require some work and make the code longer; this is the price for
modules which can be unloaded cleanly.

An example of a module with per-module state is currently available as
xxlimited@footnote{https://github.com/python/cpython/blob/master/Modules/xxlimited.c};
example module initialization shown at the bottom of the file.

@node Opt-Out Limiting to One Module Object per Process,Module State Access from Functions,Managing Per-Module State,Making Modules Safe with Multiple Interpreters
@anchor{howto/isolating-extensions isolating-extensions-optout}@anchor{524f}@anchor{howto/isolating-extensions opt-out-limiting-to-one-module-object-per-process}@anchor{58a2}
@subsubsection Opt-Out: Limiting to One Module Object per Process


A non-negative @code{PyModuleDef.m_size} signals that a module supports
multiple interpreters correctly. If this is not yet the case for your
module, you can explicitly make your module loadable only once per
process. For example:

@example
// A process-wide flag
static int loaded = 0;

// Mutex to provide thread safety (only needed for free-threaded Python)
static PyMutex modinit_mutex = @{0@};

static int
exec_module(PyObject* module)
@{
    PyMutex_Lock(&modinit_mutex);
    if (loaded) @{
        PyMutex_Unlock(&modinit_mutex);
        PyErr_SetString(PyExc_ImportError,
                        "cannot load module more than once per process");
        return -1;
    @}
    loaded = 1;
    PyMutex_Unlock(&modinit_mutex);
    // ... rest of initialization
@}
@end example

If your module’s @ref{b73,,PyModuleDef.m_clear} function is able to prepare
for future re-initialization, it should clear the @code{loaded} flag.
In this case, your module won’t support multiple instances existing
`concurrently', but it will, for example, support being loaded after
Python runtime shutdown (@ref{f10,,Py_FinalizeEx()}) and re-initialization
(@ref{460,,Py_Initialize()}).

@node Module State Access from Functions,,Opt-Out Limiting to One Module Object per Process,Making Modules Safe with Multiple Interpreters
@anchor{howto/isolating-extensions module-state-access-from-functions}@anchor{58a3}
@subsubsection Module State Access from Functions


Accessing the state from module-level functions is straightforward.
Functions get the module object as their first argument; for extracting
the state, you can use @code{PyModule_GetState}:

@example
static PyObject *
func(PyObject *module, PyObject *args)
@{
    my_struct *state = (my_struct*)PyModule_GetState(module);
    if (state == NULL) @{
        return NULL;
    @}
    // ... rest of logic
@}
@end example

@cartouche
@quotation 참고 
@code{PyModule_GetState} may return @code{NULL} without setting an
exception if there is no module state, i.e. @code{PyModuleDef.m_size} was
zero. In your own module, you’re in control of @code{m_size}, so this is
easy to prevent.
@end quotation
@end cartouche

@node Heap Types,Open Issues,Making Modules Safe with Multiple Interpreters,Isolating Extension Modules
@anchor{howto/isolating-extensions heap-types}@anchor{58a4}
@subsection Heap Types


Traditionally, types defined in C code are `static'; that is,
@code{static PyTypeObject} structures defined directly in code and
initialized using @code{PyType_Ready()}.

Such types are necessarily shared across the process. Sharing them
between module objects requires paying attention to any state they own
or access. To limit the possible issues, static types are immutable at
the Python level: for example, you can’t set @code{str.myattribute = 123}.

`CPython 구현 상세:' Sharing truly immutable objects between interpreters is fine,
as long as they don’t provide access to mutable objects.
However, in CPython, every Python object has a mutable implementation
detail: the reference count. Changes to the refcount are guarded by the GIL.
Thus, code that shares any Python objects across interpreters implicitly
depends on CPython’s current, process-wide GIL.

Because they are immutable and process-global, static types cannot access
“their” module state.
If any method of such a type requires access to module state,
the type must be converted to a `heap-allocated type', or `heap type'
for short. These correspond more closely to classes created by Python’s
@code{class} statement.

For new modules, using heap types by default is a good rule of thumb.

@menu
* Changing Static Types to Heap Types:: 
* Defining Heap Types:: 
* Garbage-Collection Protocol:: 
* Module State Access from Classes:: 
* Module State Access from Regular Methods:: 
* Module State Access from Slot Methods@comma{} Getters and Setters: Module State Access from Slot Methods Getters and Setters. 
* Lifetime of the Module State:: 

@end menu

@node Changing Static Types to Heap Types,Defining Heap Types,,Heap Types
@anchor{howto/isolating-extensions changing-static-types-to-heap-types}@anchor{58a5}
@subsubsection Changing Static Types to Heap Types


Static types can be converted to heap types, but note that
the heap type API was not designed for “lossless” conversion
from static types—that is, creating a type that works exactly like a given
static type.
So, when rewriting the class definition in a new API,
you are likely to unintentionally change a few details (e.g. pickleability
or inherited slots).
Always test the details that are important to you.

Watch out for the following two points in particular (but note that this is not
a comprehensive list):


@itemize *

@item 
Unlike static types, heap type objects are mutable by default.
Use the @ref{3cf,,Py_TPFLAGS_IMMUTABLETYPE} flag to prevent mutability.

@item 
Heap types inherit @ref{79e,,tp_new} by default,
so it may become possible to instantiate them from Python code.
You can prevent this with the @ref{7a1,,Py_TPFLAGS_DISALLOW_INSTANTIATION} flag.
@end itemize

@node Defining Heap Types,Garbage-Collection Protocol,Changing Static Types to Heap Types,Heap Types
@anchor{howto/isolating-extensions defining-heap-types}@anchor{58a6}
@subsubsection Defining Heap Types


Heap types can be created by filling a @ref{1a89,,PyType_Spec} structure, a
description or “blueprint” of a class, and calling
@ref{772,,PyType_FromModuleAndSpec()} to construct a new class object.

@cartouche
@quotation 참고 
Other functions, like @ref{79c,,PyType_FromSpec()}, can also create
heap types, but @ref{772,,PyType_FromModuleAndSpec()} associates the module
with the class, allowing access to the module state from methods.
@end quotation
@end cartouche

The class should generally be stored in `both' the module state (for
safe access from C) and the module’s @code{__dict__} (for access from
Python code).

@node Garbage-Collection Protocol,Module State Access from Classes,Defining Heap Types,Heap Types
@anchor{howto/isolating-extensions garbage-collection-protocol}@anchor{58a7}
@subsubsection Garbage-Collection Protocol


Instances of heap types hold a reference to their type.
This ensures that the type isn’t destroyed before all its instances are,
but may result in reference cycles that need to be broken by the
garbage collector.

To avoid memory leaks, instances of heap types must implement the
garbage collection protocol.
That is, heap types should:


@itemize -

@item 
Have the @ref{980,,Py_TPFLAGS_HAVE_GC} flag.

@item 
Define a traverse function using @ref{51dc,,Py_tp_traverse}, which
visits the type (e.g. using @code{Py_VISIT(Py_TYPE(self))}).
@end itemize

Please refer to the documentation of
@ref{980,,Py_TPFLAGS_HAVE_GC} and @ref{981,,tp_traverse}
for additional considerations.

The API for defining heap types grew organically, leaving it
somewhat awkward to use in its current state.
The following sections will guide you through common issues.

@menu
* tp_traverse in Python 3.8 and lower: tp_traverse in Python 3 8 and lower. 
* Delegating tp_traverse:: 
* Defining tp_dealloc:: 
* Not overriding tp_free:: 
* Avoiding PyObject_New:: 

@end menu

@node tp_traverse in Python 3 8 and lower,Delegating tp_traverse,,Garbage-Collection Protocol
@anchor{howto/isolating-extensions tp-traverse-in-python-3-8-and-lower}@anchor{58a8}
@subsubsection @code{tp_traverse} in Python 3.8 and lower


The requirement to visit the type from @code{tp_traverse} was added in Python 3.9.
If you support Python 3.8 and lower, the traverse function must `not'
visit the type, so it must be more complicated:

@example
static int my_traverse(PyObject *self, visitproc visit, void *arg)
@{
    if (Py_Version >= 0x03090000) @{
        Py_VISIT(Py_TYPE(self));
    @}
    return 0;
@}
@end example

Unfortunately, @ref{381,,Py_Version} was only added in Python 3.11.
As a replacement, use:


@itemize *

@item 
@ref{382,,PY_VERSION_HEX}, if not using the stable ABI, or

@item 
@ref{8ae,,sys.version_info} (via @ref{628,,PySys_GetObject()} and
@ref{3c1,,PyArg_ParseTuple()}).
@end itemize

@node Delegating tp_traverse,Defining tp_dealloc,tp_traverse in Python 3 8 and lower,Garbage-Collection Protocol
@anchor{howto/isolating-extensions delegating-tp-traverse}@anchor{58a9}
@subsubsection Delegating @code{tp_traverse}


If your traverse function delegates to the @ref{981,,tp_traverse}
of its base class (or another type), ensure that @code{Py_TYPE(self)} is visited
only once.
Note that only heap type are expected to visit the type in @code{tp_traverse}.

For example, if your traverse function includes:

@example
base->tp_traverse(self, visit, arg)
@end example

…and @code{base} may be a static type, then it should also include:

@example
if (base->tp_flags & Py_TPFLAGS_HEAPTYPE) @{
    // a heap type's tp_traverse already visited Py_TYPE(self)
@} else @{
    if (Py_Version >= 0x03090000) @{
        Py_VISIT(Py_TYPE(self));
    @}
@}
@end example

It is not necessary to handle the type’s reference count in
@ref{79e,,tp_new} and @ref{4f21,,tp_clear}.

@node Defining tp_dealloc,Not overriding tp_free,Delegating tp_traverse,Garbage-Collection Protocol
@anchor{howto/isolating-extensions defining-tp-dealloc}@anchor{58aa}
@subsubsection Defining @code{tp_dealloc}


If your type has a custom @ref{4efb,,tp_dealloc} function,
it needs to:


@itemize -

@item 
call @ref{170a,,PyObject_GC_UnTrack()} before any fields are invalidated, and

@item 
decrement the reference count of the type.
@end itemize

To keep the type valid while @code{tp_free} is called, the type’s refcount needs
to be decremented `after' the instance is deallocated. For example:

@example
static void my_dealloc(PyObject *self)
@{
    PyObject_GC_UnTrack(self);
    ...
    PyTypeObject *type = Py_TYPE(self);
    type->tp_free(self);
    Py_DECREF(type);
@}
@end example

The default @code{tp_dealloc} function does this, so
if your type does `not' override
@code{tp_dealloc} you don’t need to add it.

@node Not overriding tp_free,Avoiding PyObject_New,Defining tp_dealloc,Garbage-Collection Protocol
@anchor{howto/isolating-extensions not-overriding-tp-free}@anchor{58ab}
@subsubsection Not overriding @code{tp_free}


The @ref{4f0e,,tp_free} slot of a heap type must be set to
@ref{1708,,PyObject_GC_Del()}.
This is the default; do not override it.

@node Avoiding PyObject_New,,Not overriding tp_free,Garbage-Collection Protocol
@anchor{howto/isolating-extensions avoiding-pyobject-new}@anchor{58ac}
@subsubsection Avoiding @code{PyObject_New}


GC-tracked objects need to be allocated using GC-aware functions.

If you use @ref{b7b,,PyObject_New()} or @ref{b7c,,PyObject_NewVar()}:


@itemize -

@item 
Get and call type’s @ref{4f0f,,tp_alloc} slot, if possible.
That is, replace @code{TYPE *o = PyObject_New(TYPE, typeobj)} with:

@example
TYPE *o = typeobj->tp_alloc(typeobj, 0);
@end example

Replace @code{o = PyObject_NewVar(TYPE, typeobj, size)} with the same,
but use size instead of the 0.

@item 
If the above is not possible (e.g. inside a custom @code{tp_alloc}),
call @ref{c98,,PyObject_GC_New()} or @ref{c99,,PyObject_GC_NewVar()}:

@example
TYPE *o = PyObject_GC_New(TYPE, typeobj);

TYPE *o = PyObject_GC_NewVar(TYPE, typeobj, size);
@end example
@end itemize

@node Module State Access from Classes,Module State Access from Regular Methods,Garbage-Collection Protocol,Heap Types
@anchor{howto/isolating-extensions module-state-access-from-classes}@anchor{58ad}
@subsubsection Module State Access from Classes


If you have a type object defined with @ref{772,,PyType_FromModuleAndSpec()},
you can call @ref{b66,,PyType_GetModule()} to get the associated module, and then
@ref{b76,,PyModule_GetState()} to get the module’s state.

To save a some tedious error-handling boilerplate code, you can combine
these two steps with @ref{b67,,PyType_GetModuleState()}, resulting in:

@example
my_struct *state = (my_struct*)PyType_GetModuleState(type);
if (state == NULL) @{
    return NULL;
@}
@end example

@node Module State Access from Regular Methods,Module State Access from Slot Methods Getters and Setters,Module State Access from Classes,Heap Types
@anchor{howto/isolating-extensions module-state-access-from-regular-methods}@anchor{58ae}
@subsubsection Module State Access from Regular Methods


Accessing the module-level state from methods of a class is somewhat more
complicated, but is possible thanks to API introduced in Python 3.9.
To get the state, you need to first get the `defining class', and then
get the module state from it.

The largest roadblock is getting `the class a method was defined in', or
that method’s “defining class” for short. The defining class can have a
reference to the module it is part of.

Do not confuse the defining class with @code{Py_TYPE(self)}. If the method
is called on a `subclass' of your type, @code{Py_TYPE(self)} will refer to
that subclass, which may be defined in different module than yours.

@cartouche
@quotation 참고 
The following Python code can illustrate the concept.
@code{Base.get_defining_class} returns @code{Base} even
if @code{type(self) == Sub}:

@example
class Base:
    def get_type_of_self(self):
        return type(self)

    def get_defining_class(self):
        return __class__

class Sub(Base):
    pass
@end example
@end quotation
@end cartouche

For a method to get its “defining class”, it must use the
@ref{1a09,,METH_METHOD | METH_FASTCALL | METH_KEYWORDS}
@ref{16dc,,calling convention}
and the corresponding @ref{967,,PyCMethod} signature:

@example
PyObject *PyCMethod(
    PyObject *self,               // object the method was called on
    PyTypeObject *defining_class, // defining class
    PyObject *const *args,        // C array of arguments
    Py_ssize_t nargs,             // length of "args"
    PyObject *kwnames)            // NULL, or dict of keyword arguments
@end example

Once you have the defining class, call @ref{b67,,PyType_GetModuleState()} to get
the state of its associated module.

For example:

@example
static PyObject *
example_method(PyObject *self,
        PyTypeObject *defining_class,
        PyObject *const *args,
        Py_ssize_t nargs,
        PyObject *kwnames)
@{
    my_struct *state = (my_struct*)PyType_GetModuleState(defining_class);
    if (state == NULL) @{
        return NULL;
    @}
    ... // rest of logic
@}

PyDoc_STRVAR(example_method_doc, "...");

static PyMethodDef my_methods[] = @{
    @{"example_method",
      (PyCFunction)(void(*)(void))example_method,
      METH_METHOD|METH_FASTCALL|METH_KEYWORDS,
      example_method_doc@}
    @{NULL@},
@}
@end example

@node Module State Access from Slot Methods Getters and Setters,Lifetime of the Module State,Module State Access from Regular Methods,Heap Types
@anchor{howto/isolating-extensions module-state-access-from-slot-methods-getters-and-setters}@anchor{58af}
@subsubsection Module State Access from Slot Methods, Getters and Setters


@cartouche
@quotation 참고 
This is new in Python 3.11.

@c After adding to limited API:
@c 
@c If you use the :ref:`limited API <limited-c-api>`,
@c you must update ``Py_LIMITED_API`` to ``0x030b0000``, losing ABI
@c compatibility with earlier versions.
@end quotation
@end cartouche

Slot methods—the fast C equivalents for special methods, such as
@ref{5321,,nb_add} for @ref{23dd,,__add__} or
@ref{79e,,tp_new} for initialization—have a very simple API that
doesn’t allow passing in the defining class, unlike with @ref{967,,PyCMethod}.
The same goes for getters and setters defined with
@ref{db1,,PyGetSetDef}.

To access the module state in these cases, use the
@ref{633,,PyType_GetModuleByDef()} function, and pass in the module definition.
Once you have the module, call @ref{b76,,PyModule_GetState()}
to get the state:

@example
PyObject *module = PyType_GetModuleByDef(Py_TYPE(self), &module_def);
my_struct *state = (my_struct*)PyModule_GetState(module);
if (state == NULL) @{
    return NULL;
@}
@end example

@code{PyType_GetModuleByDef()} works by searching the
@ref{25e0,,method resolution order} (i.e. all superclasses) for the first
superclass that has a corresponding module.

@cartouche
@quotation 참고 
In very exotic cases (inheritance chains spanning multiple modules
created from the same definition), @code{PyType_GetModuleByDef()} might not
return the module of the true defining class. However, it will always
return a module with the same definition, ensuring a compatible
C memory layout.
@end quotation
@end cartouche

@node Lifetime of the Module State,,Module State Access from Slot Methods Getters and Setters,Heap Types
@anchor{howto/isolating-extensions lifetime-of-the-module-state}@anchor{58b0}
@subsubsection Lifetime of the Module State


When a module object is garbage-collected, its module state is freed.
For each pointer to (a part of) the module state, you must hold a reference
to the module object.

Usually this is not an issue, because types created with
@ref{772,,PyType_FromModuleAndSpec()}, and their instances, hold a reference
to the module.
However, you must be careful in reference counting when you reference
module state from other places, such as callbacks for external
libraries.

@node Open Issues,,Heap Types,Isolating Extension Modules
@anchor{howto/isolating-extensions open-issues}@anchor{58b1}
@subsection Open Issues


Several issues around per-module state and heap types are still open.

Discussions about improving the situation are best held on the discuss forum under c-api tag@footnote{https://discuss.python.org/c/core-dev/c-api/30}.

@menu
* Per-Class Scope:: 
* Lossless Conversion to Heap Types:: 

@end menu

@node Per-Class Scope,Lossless Conversion to Heap Types,,Open Issues
@anchor{howto/isolating-extensions per-class-scope}@anchor{58b2}
@subsubsection Per-Class Scope


It is currently (as of Python 3.11) not possible to attach state to individual
`types' without relying on CPython implementation details (which may change
in the future—perhaps, ironically, to allow a proper solution for
per-class scope).

@node Lossless Conversion to Heap Types,,Per-Class Scope,Open Issues
@anchor{howto/isolating-extensions lossless-conversion-to-heap-types}@anchor{58b3}
@subsubsection Lossless Conversion to Heap Types


The heap type API was not designed for “lossless” conversion from static types;
that is, creating a type that works exactly like a given static type.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node timer file descriptor HOWTO,The Python 2 3 Method Resolution Order,Isolating Extension Modules,파이썬 HOWTO
@anchor{howto/timerfd doc}@anchor{58b4}@anchor{howto/timerfd timer-file-descriptor-howto}@anchor{58b5}@anchor{howto/timerfd timerfd-howto}@anchor{58b6}@anchor{howto/timerfd translation-repo}@anchor{58b7}
@section timer file descriptor HOWTO


@*Release: 
1.13


This HOWTO discusses Python’s support for the linux timer file descriptor.

@menu
* Examples: Examples<3>. 

@end menu

@node Examples<3>,,,timer file descriptor HOWTO
@anchor{howto/timerfd examples}@anchor{58b8}
@subsection Examples


The following example shows how to use a timer file descriptor
to execute a function twice a second:

@example
# Practical scripts should use really use a non-blocking timer,
# we use a blocking timer here for simplicity.
import os, time

# Create the timer file descriptor
fd = os.timerfd_create(time.CLOCK_REALTIME)

# Start the timer in 1 second, with an interval of half a second
os.timerfd_settime(fd, initial=1, interval=0.5)

try:
    # Process timer events four times.
    for _ in range(4):
        # read() will block until the timer expires
        _ = os.read(fd, 8)
        print("Timer expired")
finally:
    # Remember to close the timer file descriptor!
    os.close(fd)
@end example

To avoid the precision loss caused by the @ref{196,,float} type,
timer file descriptors allow specifying initial expiration and interval
in integer nanoseconds with @code{_ns} variants of the functions.

This example shows how @ref{1193,,epoll()} can be used with timer file
descriptors to wait until the file descriptor is ready for reading:

@example
import os, time, select, socket, sys

# Create an epoll object
ep = select.epoll()

# In this example, use loopback address to send "stop" command to the server.
#
# $ telnet 127.0.0.1 1234
# Trying 127.0.0.1...
# Connected to 127.0.0.1.
# Escape character is '^]'.
# stop
# Connection closed by foreign host.
#
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(("127.0.0.1", 1234))
sock.setblocking(False)
sock.listen(1)
ep.register(sock, select.EPOLLIN)

# Create timer file descriptors in non-blocking mode.
num = 3
fds = []
for _ in range(num):
    fd = os.timerfd_create(time.CLOCK_REALTIME, flags=os.TFD_NONBLOCK)
    fds.append(fd)
    # Register the timer file descriptor for read events
    ep.register(fd, select.EPOLLIN)

# Start the timer with os.timerfd_settime_ns() in nanoseconds.
# Timer 1 fires every 0.25 seconds; timer 2 every 0.5 seconds; etc
for i, fd in enumerate(fds, start=1):
    one_sec_in_nsec = 10**9
    i = i * one_sec_in_nsec
    os.timerfd_settime_ns(fd, initial=i//4, interval=i//4)

timeout = 3
try:
    conn = None
    is_active = True
    while is_active:
        # Wait for the timer to expire for 3 seconds.
        # epoll.poll() returns a list of (fd, event) pairs.
        # fd is a file descriptor.
        # sock and conn[=returned value of socket.accept()] are socket objects, not file descriptors.
        # So use sock.fileno() and conn.fileno() to get the file descriptors.
        events = ep.poll(timeout)

        # If more than one timer file descriptors are ready for reading at once,
        # epoll.poll() returns a list of (fd, event) pairs.
        #
        # In this example settings,
        #    1st timer fires every 0.25 seconds in 0.25 seconds. (0.25, 0.5, 0.75, 1.0, ...)
        #    2nd timer every 0.5 seconds in 0.5 seconds. (0.5, 1.0, 1.5, 2.0, ...)
        #    3rd timer every 0.75 seconds in 0.75 seconds. (0.75, 1.5, 2.25, 3.0, ...)
        #
        #    In 0.25 seconds, only 1st timer fires.
        #    In 0.5 seconds, 1st timer and 2nd timer fires at once.
        #    In 0.75 seconds, 1st timer and 3rd timer fires at once.
        #    In 1.5 seconds, 1st timer, 2nd timer and 3rd timer fires at once.
        #
        # If a timer file descriptor is signaled more than once since
        # the last os.read() call, os.read() returns the number of signaled
        # as host order of class bytes.
        print(f"Signaled events=@{events@}")
        for fd, event in events:
            if event & select.EPOLLIN:
                if fd == sock.fileno():
                    # Check if there is a connection request.
                    print(f"Accepting connection @{fd@}")
                    conn, addr = sock.accept()
                    conn.setblocking(False)
                    print(f"Accepted connection @{conn@} from @{addr@}")
                    ep.register(conn, select.EPOLLIN)
                elif conn and fd == conn.fileno():
                    # Check if there is data to read.
                    print(f"Reading data @{fd@}")
                    data = conn.recv(1024)
                    if data:
                        # You should catch UnicodeDecodeError exception for safety.
                        cmd = data.decode()
                        if cmd.startswith("stop"):
                            print(f"Stopping server")
                            is_active = False
                        else:
                            print(f"Unknown command: @{cmd@}")
                    else:
                        # No more data, close connection
                        print(f"Closing connection @{fd@}")
                        ep.unregister(conn)
                        conn.close()
                        conn = None
                elif fd in fds:
                    print(f"Reading timer @{fd@}")
                    count = int.from_bytes(os.read(fd, 8), byteorder=sys.byteorder)
                    print(f"Timer @{fds.index(fd) + 1@} expired @{count@} times")
                else:
                    print(f"Unknown file descriptor @{fd@}")
finally:
    for fd in fds:
        ep.unregister(fd)
        os.close(fd)
    ep.close()
@end example

This example shows how @ref{f9f,,select()} can be used with timer file
descriptors to wait until the file descriptor is ready for reading:

@example
import os, time, select, socket, sys

# In this example, use loopback address to send "stop" command to the server.
#
# $ telnet 127.0.0.1 1234
# Trying 127.0.0.1...
# Connected to 127.0.0.1.
# Escape character is '^]'.
# stop
# Connection closed by foreign host.
#
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(("127.0.0.1", 1234))
sock.setblocking(False)
sock.listen(1)

# Create timer file descriptors in non-blocking mode.
num = 3
fds = [os.timerfd_create(time.CLOCK_REALTIME, flags=os.TFD_NONBLOCK)
       for _ in range(num)]
select_fds = fds + [sock]

# Start the timers with os.timerfd_settime() in seconds.
# Timer 1 fires every 0.25 seconds; timer 2 every 0.5 seconds; etc
for i, fd in enumerate(fds, start=1):
   os.timerfd_settime(fd, initial=i/4, interval=i/4)

timeout = 3
try:
    conn = None
    is_active = True
    while is_active:
       # Wait for the timer to expire for 3 seconds.
       # select.select() returns a list of file descriptors or objects.
       rfd, wfd, xfd = select.select(select_fds, select_fds, select_fds, timeout)
       for fd in rfd:
           if fd == sock:
               # Check if there is a connection request.
               print(f"Accepting connection @{fd@}")
               conn, addr = sock.accept()
               conn.setblocking(False)
               print(f"Accepted connection @{conn@} from @{addr@}")
               select_fds.append(conn)
           elif conn and fd == conn:
               # Check if there is data to read.
               print(f"Reading data @{fd@}")
               data = conn.recv(1024)
               if data:
                   # You should catch UnicodeDecodeError exception for safety.
                   cmd = data.decode()
                   if cmd.startswith("stop"):
                       print(f"Stopping server")
                       is_active = False
                   else:
                       print(f"Unknown command: @{cmd@}")
               else:
                   # No more data, close connection
                   print(f"Closing connection @{fd@}")
                   select_fds.remove(conn)
                   conn.close()
                   conn = None
           elif fd in fds:
               print(f"Reading timer @{fd@}")
               count = int.from_bytes(os.read(fd, 8), byteorder=sys.byteorder)
               print(f"Timer @{fds.index(fd) + 1@} expired @{count@} times")
           else:
               print(f"Unknown file descriptor @{fd@}")
finally:
    for fd in fds:
       os.close(fd)
    sock.close()
    sock = None
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node The Python 2 3 Method Resolution Order,Python support for free threading,timer file descriptor HOWTO,파이썬 HOWTO
@anchor{howto/mro doc}@anchor{58b9}@anchor{howto/mro python-2-3-mro}@anchor{16af}@anchor{howto/mro the-python-2-3-method-resolution-order}@anchor{58ba}@anchor{howto/mro translation-repo}@anchor{58bb}
@section The Python 2.3 Method Resolution Order


@cartouche
@quotation 참고 
This is a historical document, provided as an appendix to the official
documentation.
The Method Resolution Order discussed here was `introduced' in Python 2.3,
but it is still used in later versions – including Python 3.
@end quotation
@end cartouche

By Michele Simionato@footnote{https://www.phyast.pitt.edu/~micheles/}.

@*Abstract: 
`This document is intended for Python programmers who want to
understand the C3 Method Resolution Order used in Python 2.3.
Although it is not intended for newbies, it is quite pedagogical with
many worked out examples.  I am not aware of other publicly available
documents with the same scope, therefore it should be useful.'


Disclaimer:

@quotation

`I donate this document to the Python Software Foundation, under the
Python 2.3 license.  As usual in these circumstances, I warn the
reader that what follows' should `be correct, but I don’t give any
warranty.  Use it at your own risk and peril!'
@end quotation

Acknowledgments:

@quotation

`All the people of the Python mailing list who sent me their support.
Paul Foley who pointed out various imprecisions and made me to add the
part on local precedence ordering. David Goodger for help with the
formatting in reStructuredText. David Mertz for help with the editing.
Finally, Guido van Rossum who enthusiastically added this document to
the official Python 2.3 home-page.'
@end quotation

@menu
* The beginning:: 
* The C3 Method Resolution Order:: 
* Examples: Examples<4>. 
* Bad Method Resolution Orders:: 
* The end:: 
* Resources:: 

@end menu

@node The beginning,The C3 Method Resolution Order,,The Python 2 3 Method Resolution Order
@anchor{howto/mro the-beginning}@anchor{58bc}
@subsection The beginning


@quotation

`Felix qui potuit rerum cognoscere causas' – Virgilius
@end quotation

Everything started with a post by Samuele Pedroni to the Python
development mailing list @footnote{
The thread on python-dev started by Samuele Pedroni:
@indicateurl{https://mail.python.org/pipermail/python-dev/2002-October/029035.html}
}.  In his post, Samuele showed that the
Python 2.2 method resolution order is not monotonic and he proposed to
replace it with the C3 method resolution order.  Guido agreed with his
arguments and therefore now Python 2.3 uses C3.  The C3 method itself
has nothing to do with Python, since it was invented by people working
on Dylan and it is described in a paper intended for lispers @footnote{
The paper `A Monotonic Superclass Linearization for Dylan':
@indicateurl{https://doi.org/10.1145/236337.236343}
}.  The
present paper gives a (hopefully) readable discussion of the C3
algorithm for Pythonistas who want to understand the reasons for the
change.

First of all, let me point out that what I am going to say only applies
to the `new style classes' introduced in Python 2.2:  `classic classes'
maintain their old method resolution order, depth first and then left to
right.  Therefore, there is no breaking of old code for classic classes;
and even if in principle there could be breaking of code for Python 2.2
new style classes, in practice the cases in which the C3 resolution
order differs from the Python 2.2 method resolution order are so rare
that no real breaking of code is expected.  Therefore:

@quotation

`Don’t be scared!'
@end quotation

Moreover, unless you make strong use of multiple inheritance and you
have non-trivial hierarchies, you don’t need to understand the C3
algorithm, and you can easily skip this paper.  On the other hand, if
you really want to know how multiple inheritance works, then this paper
is for you.  The good news is that things are not as complicated as you
might expect.

Let me begin with some basic definitions.


@enumerate 

@item 
Given a class C in a complicated multiple inheritance hierarchy, it
is a non-trivial task to specify the order in which methods are
overridden, i.e. to specify the order of the ancestors of C.

@item 
The list of the ancestors of a class C, including the class itself,
ordered from the nearest ancestor to the furthest, is called the
class precedence list or the `linearization' of C.

@item 
The `Method Resolution Order' (MRO) is the set of rules that
construct the linearization.  In the Python literature, the idiom
“the MRO of C” is also used as a synonymous for the linearization of
the class C.

@item 
For instance, in the case of single inheritance hierarchy, if C is a
subclass of C1, and C1 is a subclass of C2, then the linearization of
C is simply the list [C, C1 , C2].  However, with multiple
inheritance hierarchies, the construction of the linearization is
more cumbersome, since it is more difficult to construct a
linearization that respects `local precedence ordering' and
`monotonicity'.

@item 
I will discuss the local precedence ordering later, but I can give
the definition of monotonicity here.  A MRO is monotonic when the
following is true:  `if C1 precedes C2 in the linearization of C,
then C1 precedes C2 in the linearization of any subclass of C'.
Otherwise, the innocuous operation of deriving a new class could
change the resolution order of methods, potentially introducing very
subtle bugs.  Examples where this happens will be shown later.

@item 
Not all classes admit a linearization.  There are cases, in
complicated hierarchies, where it is not possible to derive a class
such that its linearization respects all the desired properties.
@end enumerate

Here I give an example of this situation. Consider the hierarchy

@example
>>> O = object
>>> class X(O): pass
>>> class Y(O): pass
>>> class A(X,Y): pass
>>> class B(Y,X): pass
@end example

which can be represented with the following inheritance graph, where I
have denoted with O the @code{object} class, which is the beginning of any
hierarchy for new style classes:

@quotation

@example
 -----------
|           |
|    O      |
|  /   \    |
 - X    Y  /
   |  / | /
   | /  |/
   A    B
   \   /
     ?
@end example
@end quotation

In this case, it is not possible to derive a new class C from A and B,
since X precedes Y in A, but Y precedes X in B, therefore the method
resolution order would be ambiguous in C.

Python 2.3 raises an exception in this situation (TypeError:  MRO
conflict among bases Y, X) forbidding the naive programmer from creating
ambiguous hierarchies.  Python 2.2 instead does not raise an exception,
but chooses an `ad hoc' ordering (CABXYO in this case).

@node The C3 Method Resolution Order,Examples<4>,The beginning,The Python 2 3 Method Resolution Order
@anchor{howto/mro the-c3-method-resolution-order}@anchor{58bd}
@subsection The C3 Method Resolution Order


Let me introduce a few simple notations which will be useful for the
following discussion.  I will use the shortcut notation:

@example
C1 C2 ... CN
@end example

to indicate the list of classes [C1, C2, … , CN].

The `head' of the list is its first element:

@example
head = C1
@end example

whereas the `tail' is the rest of the list:

@example
tail = C2 ... CN.
@end example

I shall also use the notation:

@example
C + (C1 C2 ... CN) = C C1 C2 ... CN
@end example

to denote the sum of the lists [C] + [C1, C2, … ,CN].

Now I can explain how the MRO works in Python 2.3.

Consider a class C in a multiple inheritance hierarchy, with C
inheriting from the base classes B1, B2, …  , BN.  We want to
compute the linearization L[C] of the class C. The rule is the
following:

@quotation

`the linearization of C is the sum of C plus the merge of the
linearizations of the parents and the list of the parents.'
@end quotation

In symbolic notation:

@example
L[C(B1 ... BN)] = C + merge(L[B1] ... L[BN], B1 ... BN)
@end example

In particular, if C is the @code{object} class, which has no parents, the
linearization is trivial:

@example
L[object] = object.
@end example

However, in general one has to compute the merge according to the following
prescription:

@quotation

`take the head of the first list, i.e L[B1][0]; if this head is not in
the tail of any of the other lists, then add it to the linearization
of C and remove it from the lists in the merge, otherwise look at the
head of the next list and take it, if it is a good head.  Then repeat
the operation until all the class are removed or it is impossible to
find good heads.  In this case, it is impossible to construct the
merge, Python 2.3 will refuse to create the class C and will raise an
exception.'
@end quotation

This prescription ensures that the merge operation `preserves' the
ordering, if the ordering can be preserved.  On the other hand, if the
order cannot be preserved (as in the example of serious order
disagreement discussed above) then the merge cannot be computed.

The computation of the merge is trivial if C has only one parent
(single inheritance); in this case:

@example
L[C(B)] = C + merge(L[B],B) = C + L[B]
@end example

However, in the case of multiple inheritance things are more cumbersome
and I don’t expect you can understand the rule without a couple of
examples ;-)

@node Examples<4>,Bad Method Resolution Orders,The C3 Method Resolution Order,The Python 2 3 Method Resolution Order
@anchor{howto/mro examples}@anchor{58be}
@subsection Examples


First example. Consider the following hierarchy:

@example
>>> O = object
>>> class F(O): pass
>>> class E(O): pass
>>> class D(O): pass
>>> class C(D,F): pass
>>> class B(D,E): pass
>>> class A(B,C): pass
@end example

In this case the inheritance graph can be drawn as:

@quotation

@example
                          6
                         ---
Level 3                 | O |                  (more general)
                      /  ---  \
                     /    |    \                      |
                    /     |     \                     |
                   /      |      \                    |
                  ---    ---    ---                   |
Level 2        3 | D | 4| E |  | F | 5                |
                  ---    ---    ---                   |
                   \  \ _ /       |                   |
                    \    / \ _    |                   |
                     \  /      \  |                   |
                      ---      ---                    |
Level 1            1 | B |    | C | 2                 |
                      ---      ---                    |
                        \      /                      |
                         \    /                      \ /
                           ---
Level 0                 0 | A |                (more specialized)
                           ---
@end example
@end quotation

The linearizations of O,D,E and F are trivial:

@example
L[O] = O
L[D] = D O
L[E] = E O
L[F] = F O
@end example

The linearization of B can be computed as:

@example
L[B] = B + merge(DO, EO, DE)
@end example

We see that D is a good head, therefore we take it and we are reduced to
compute @code{merge(O,EO,E)}.  Now O is not a good head, since it is in the
tail of the sequence EO.  In this case the rule says that we have to
skip to the next sequence.  Then we see that E is a good head; we take
it and we are reduced to compute @code{merge(O,O)} which gives O. Therefore:

@example
L[B] =  B D E O
@end example

Using the same procedure one finds:

@example
L[C] = C + merge(DO,FO,DF)
     = C + D + merge(O,FO,F)
     = C + D + F + merge(O,O)
     = C D F O
@end example

Now we can compute:

@example
L[A] = A + merge(BDEO,CDFO,BC)
     = A + B + merge(DEO,CDFO,C)
     = A + B + C + merge(DEO,DFO)
     = A + B + C + D + merge(EO,FO)
     = A + B + C + D + E + merge(O,FO)
     = A + B + C + D + E + F + merge(O,O)
     = A B C D E F O
@end example

In this example, the linearization is ordered in a pretty nice way
according to the inheritance level, in the sense that lower levels (i.e.
more specialized classes) have higher precedence (see the inheritance
graph).  However, this is not the general case.

I leave as an exercise for the reader to compute the linearization for
my second example:

@example
>>> O = object
>>> class F(O): pass
>>> class E(O): pass
>>> class D(O): pass
>>> class C(D,F): pass
>>> class B(E,D): pass
>>> class A(B,C): pass
@end example

The only difference with the previous example is the change B(D,E) –>
B(E,D); however even such a little modification completely changes the
ordering of the hierarchy:

@quotation

@example
                           6
                          ---
Level 3                  | O |
                       /  ---  \
                      /    |    \
                     /     |     \
                    /      |      \
                  ---     ---    ---
Level 2        2 | E | 4 | D |  | F | 5
                  ---     ---    ---
                   \      / \     /
                    \    /   \   /
                     \  /     \ /
                      ---     ---
Level 1            1 | B |   | C | 3
                      ---     ---
                       \       /
                        \     /
                          ---
Level 0                0 | A |
                          ---
@end example
@end quotation

Notice that the class E, which is in the second level of the hierarchy,
precedes the class C, which is in the first level of the hierarchy, i.e.
E is more specialized than C, even if it is in a higher level.

A lazy programmer can obtain the MRO directly from Python 2.2, since in
this case it coincides with the Python 2.3 linearization.  It is enough
to invoke the @ref{2376,,mro()} method of class A:

@example
>>> A.mro()
[<class 'A'>, <class 'B'>, <class 'E'>,
<class 'C'>, <class 'D'>, <class 'F'>,
<class 'object'>]
@end example

Finally, let me consider the example discussed in the first section,
involving a serious order disagreement.  In this case, it is
straightforward to compute the linearizations of O, X, Y, A and B:

@quotation

@example
L[O] = 0
L[X] = X O
L[Y] = Y O
L[A] = A X Y O
L[B] = B Y X O
@end example
@end quotation

However, it is impossible to compute the linearization for a class C
that inherits from A and B:

@example
L[C] = C + merge(AXYO, BYXO, AB)
     = C + A + merge(XYO, BYXO, B)
     = C + A + B + merge(XYO, YXO)
@end example

At this point we cannot merge the lists XYO and YXO, since X is in the
tail of YXO whereas Y is in the tail of XYO:  therefore there are no
good heads and the C3 algorithm stops.  Python 2.3 raises an error and
refuses to create the class C.

@node Bad Method Resolution Orders,The end,Examples<4>,The Python 2 3 Method Resolution Order
@anchor{howto/mro bad-method-resolution-orders}@anchor{58bf}
@subsection Bad Method Resolution Orders


A MRO is `bad' when it breaks such fundamental properties as local
precedence ordering and monotonicity.  In this section, I will show
that both the MRO for classic classes and the MRO for new style classes
in Python 2.2 are bad.

It is easier to start with the local precedence ordering.  Consider the
following example:

@example
>>> F=type('Food',(),@{'remember2buy':'spam'@})
>>> E=type('Eggs',(F,),@{'remember2buy':'eggs'@})
>>> G=type('GoodFood',(F,E),@{@}) # under Python 2.3 this is an error!
@end example

with inheritance diagram

@quotation

@example
             O
             |
(buy spam)   F
             | \
             | E   (buy eggs)
             | /
             G

      (buy eggs or spam ?)
@end example
@end quotation

We see that class G inherits from F and E, with F `before' E:  therefore
we would expect the attribute `G.remember2buy' to be inherited by
`F.remember2buy' and not by `E.remember2buy':  nevertheless Python 2.2
gives

@example
>>> G.remember2buy
'eggs'
@end example

This is a breaking of local precedence ordering since the order in the
local precedence list, i.e. the list of the parents of G, is not
preserved in the Python 2.2 linearization of G:

@example
L[G,P22]= G E F object   # F *follows* E
@end example

One could argue that the reason why F follows E in the Python 2.2
linearization is that F is less specialized than E, since F is the
superclass of E; nevertheless the breaking of local precedence ordering
is quite non-intuitive and error prone.  This is particularly true since
it is a different from old style classes:

@example
>>> class F: remember2buy='spam'
>>> class E(F): remember2buy='eggs'
>>> class G(F,E): pass
>>> G.remember2buy
'spam'
@end example

In this case the MRO is GFEF and the local precedence ordering is
preserved.

As a general rule, hierarchies such as the previous one should be
avoided, since it is unclear if F should override E or vice-versa.
Python 2.3 solves the ambiguity by raising an exception in the creation
of class G, effectively stopping the programmer from generating
ambiguous hierarchies.  The reason for that is that the C3 algorithm
fails when the merge:

@example
merge(FO,EFO,FE)
@end example

cannot be computed, because F is in the tail of EFO and E is in the tail
of FE.

The real solution is to design a non-ambiguous hierarchy, i.e. to derive
G from E and F (the more specific first) and not from F and E; in this
case the MRO is GEF without any doubt.

@quotation

@example
           O
           |
           F (spam)
         / |
(eggs)   E |
         \ |
           G
             (eggs, no doubt)
@end example
@end quotation

Python 2.3 forces the programmer to write good hierarchies (or, at
least, less error-prone ones).

On a related note, let me point out that the Python 2.3 algorithm is
smart enough to recognize obvious mistakes, as the duplication of
classes in the list of parents:

@example
>>> class A(object): pass
>>> class C(A,A): pass # error
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
TypeError: duplicate base class A
@end example

Python 2.2 (both for classic classes and new style classes) in this
situation, would not raise any exception.

Finally, I would like to point out two lessons we have learned from this
example:


@enumerate 

@item 
despite the name, the MRO determines the resolution order of
attributes, not only of methods;

@item 
the default food for Pythonistas is spam !  (but you already knew
that ;-)
@end enumerate

Having discussed the issue of local precedence ordering, let me now
consider the issue of monotonicity.  My goal is to show that neither the
MRO for classic classes nor that for Python 2.2 new style classes is
monotonic.

To prove that the MRO for classic classes is non-monotonic is rather
trivial, it is enough to look at the diamond diagram:

@quotation

@example
   C
  / \
 /   \
A     B
 \   /
  \ /
   D
@end example
@end quotation

One easily discerns the inconsistency:

@example
L[B,P21] = B C        # B precedes C : B's methods win
L[D,P21] = D A C B C  # B follows C  : C's methods win!
@end example

On the other hand, there are no problems with the Python 2.2 and 2.3
MROs, they give both:

@example
L[D] = D A B C
@end example

Guido points out in his essay @footnote{
Guido van Rossum’s essay, `Unifying types and classes in Python 2.2':
@indicateurl{https://web.archive.org/web/20140210194412/http://www.python.org/download/releases/2.2.2/descrintro}
} that the classic MRO is not so bad in
practice, since one can typically avoids diamonds for classic classes.
But all new style classes inherit from @code{object}, therefore diamonds are
unavoidable and inconsistencies shows up in every multiple inheritance
graph.

The MRO of Python 2.2 makes breaking monotonicity difficult, but not
impossible.  The following example, originally provided by Samuele
Pedroni, shows that the MRO of Python 2.2 is non-monotonic:

@example
>>> class A(object): pass
>>> class B(object): pass
>>> class C(object): pass
>>> class D(object): pass
>>> class E(object): pass
>>> class K1(A,B,C): pass
>>> class K2(D,B,E): pass
>>> class K3(D,A):   pass
>>> class Z(K1,K2,K3): pass
@end example

Here are the linearizations according to the C3 MRO (the reader should
verify these linearizations as an exercise and draw the inheritance
diagram ;-)

@example
L[A] = A O
L[B] = B O
L[C] = C O
L[D] = D O
L[E] = E O
L[K1]= K1 A B C O
L[K2]= K2 D B E O
L[K3]= K3 D A O
L[Z] = Z K1 K2 K3 D A B C E O
@end example

Python 2.2 gives exactly the same linearizations for A, B, C, D, E, K1,
K2 and K3, but a different linearization for Z:

@example
L[Z,P22] = Z K1 K3 A K2 D B C E O
@end example

It is clear that this linearization is `wrong', since A comes before D
whereas in the linearization of K3 A comes `after' D. In other words, in
K3 methods derived by D override methods derived by A, but in Z, which
still is a subclass of K3, methods derived by A override methods derived
by D!  This is a violation of monotonicity.  Moreover, the Python 2.2
linearization of Z is also inconsistent with local precedence ordering,
since the local precedence list of the class Z is [K1, K2, K3] (K2
precedes K3), whereas in the linearization of Z K2 `follows' K3.  These
problems explain why the 2.2 rule has been dismissed in favor of the C3
rule.

@node The end,Resources,Bad Method Resolution Orders,The Python 2 3 Method Resolution Order
@anchor{howto/mro the-end}@anchor{58c0}
@subsection The end


This section is for the impatient reader, who skipped all the previous
sections and jumped immediately to the end.  This section is for the
lazy programmer too, who didn’t want to exercise her/his brain.
Finally, it is for the programmer with some hubris, otherwise s/he would
not be reading a paper on the C3 method resolution order in multiple
inheritance hierarchies ;-) These three virtues taken all together (and
`not' separately) deserve a prize:  the prize is a short Python 2.2
script that allows you to compute the 2.3 MRO without risk to your
brain.  Simply change the last line to play with the various examples I
have discussed in this paper.:

@example
#<mro.py>

"""C3 algorithm by Samuele Pedroni (with readability enhanced by me)."""

class __metaclass__(type):
    "All classes are metamagically modified to be nicely printed"
    __repr__ = lambda cls: cls.__name__

class ex_2:
    "Serious order disagreement" #From Guido
    class O: pass
    class X(O): pass
    class Y(O): pass
    class A(X,Y): pass
    class B(Y,X): pass
    try:
        class Z(A,B): pass #creates Z(A,B) in Python 2.2
    except TypeError:
        pass # Z(A,B) cannot be created in Python 2.3

class ex_5:
    "My first example"
    class O: pass
    class F(O): pass
    class E(O): pass
    class D(O): pass
    class C(D,F): pass
    class B(D,E): pass
    class A(B,C): pass

class ex_6:
    "My second example"
    class O: pass
    class F(O): pass
    class E(O): pass
    class D(O): pass
    class C(D,F): pass
    class B(E,D): pass
    class A(B,C): pass

class ex_9:
    "Difference between Python 2.2 MRO and C3" #From Samuele
    class O: pass
    class A(O): pass
    class B(O): pass
    class C(O): pass
    class D(O): pass
    class E(O): pass
    class K1(A,B,C): pass
    class K2(D,B,E): pass
    class K3(D,A): pass
    class Z(K1,K2,K3): pass

def merge(seqs):
    print '\n\nCPL[%s]=%s' % (seqs[0][0],seqs),
    res = []; i=0
    while 1:
      nonemptyseqs=[seq for seq in seqs if seq]
      if not nonemptyseqs: return res
      i+=1; print '\n',i,'round: candidates...',
      for seq in nonemptyseqs: # find merge candidates among seq heads
          cand = seq[0]; print ' ',cand,
          nothead=[s for s in nonemptyseqs if cand in s[1:]]
          if nothead: cand=None #reject candidate
          else: break
      if not cand: raise "Inconsistent hierarchy"
      res.append(cand)
      for seq in nonemptyseqs: # remove cand
          if seq[0] == cand: del seq[0]

def mro(C):
    "Compute the class precedence list (mro) according to C3"
    return merge([[C]]+map(mro,C.__bases__)+[list(C.__bases__)])

def print_mro(C):
    print '\nMRO[%s]=%s' % (C,mro(C))
    print '\nP22 MRO[%s]=%s' % (C,C.mro())

print_mro(ex_9.Z)

#</mro.py>
@end example

That’s all folks,

@quotation

enjoy !
@end quotation

@node Resources,,The end,The Python 2 3 Method Resolution Order
@anchor{howto/mro resources}@anchor{58c1}
@subsection Resources


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Python support for free threading,C API Extension Support for Free Threading,The Python 2 3 Method Resolution Order,파이썬 HOWTO
@anchor{howto/free-threading-python doc}@anchor{58c2}@anchor{howto/free-threading-python freethreading-python-howto}@anchor{2723}@anchor{howto/free-threading-python python-support-for-free-threading}@anchor{58c3}@anchor{howto/free-threading-python translation-repo}@anchor{58c4}
@section Python support for free threading


Starting with the 3.13 release, CPython has support for a build of
Python called @ref{1f4,,free threading} where the @ref{474,,global interpreter lock}
(GIL) is disabled.  Free-threaded execution allows for full utilization of the
available processing power by running threads in parallel on available CPU cores.
While not all software will benefit from this automatically, programs
designed with threading in mind will run faster on multi-core hardware.

Some third-party packages, in particular ones
with an @ref{224e,,extension module}, may not be ready for use in a
free-threaded build, and will re-enable the @ref{164,,GIL}.

This document describes the implications of free threading
for Python code.  See @ref{58c5,,C API Extension Support for Free Threading} for information on
how to write C extensions that support the free-threaded build.


@subsubheading 더 보기


@geindex Python 향상 제안; PEP 703
PEP 703@footnote{https://peps.python.org/pep-0703/} – Making the Global Interpreter Lock Optional in CPython for an
overall description of free-threaded Python.


@menu
* Installation: Installation<2>. 
* Identifying free-threaded Python:: 
* The global interpreter lock in free-threaded Python:: 
* Thread safety:: 
* Known limitations:: 
* Behavioral changes:: 

@end menu

@node Installation<2>,Identifying free-threaded Python,,Python support for free threading
@anchor{howto/free-threading-python installation}@anchor{58c6}
@subsection Installation


Starting with Python 3.13, the official macOS and Windows installers
optionally support installing free-threaded Python binaries.  The installers
are available at @indicateurl{https://www.python.org/downloads/}.

For information on other platforms, see the Installing a Free-Threaded Python@footnote{https://py-free-threading.github.io/installing-cpython/}, a
community-maintained installation guide for installing free-threaded Python.

When building CPython from source, the @ref{49a,,--disable-gil} configure option
should be used to build a free-threaded Python interpreter.

@node Identifying free-threaded Python,The global interpreter lock in free-threaded Python,Installation<2>,Python support for free threading
@anchor{howto/free-threading-python identifying-free-threaded-python}@anchor{58c7}
@subsection Identifying free-threaded Python


To check if the current interpreter supports free-threading, @ref{49c,,python -VV}
and @ref{49d,,sys.version} contain “free-threading build”.
The new @ref{4964,,sys._is_gil_enabled()} function can be used to check whether
the GIL is actually disabled in the running process.

The @code{sysconfig.get_config_var("Py_GIL_DISABLED")} configuration variable can
be used to determine whether the build supports free threading.  If the variable
is set to @code{1}, then the build supports free threading.  This is the recommended
mechanism for decisions related to the build configuration.

@node The global interpreter lock in free-threaded Python,Thread safety,Identifying free-threaded Python,Python support for free threading
@anchor{howto/free-threading-python the-global-interpreter-lock-in-free-threaded-python}@anchor{58c8}
@subsection The global interpreter lock in free-threaded Python


Free-threaded builds of CPython support optionally running with the GIL enabled
at runtime using the environment variable 
@geindex PYTHON_GIL
@geindex 환경 변수; PYTHON_GIL
@ref{49b,,PYTHON_GIL} or
the command-line option @ref{16f,,-X gil}.

The GIL may also automatically be enabled when importing a C-API extension
module that is not explicitly marked as supporting free threading.  A warning
will be printed in this case.

In addition to individual package documentation, the following websites track
the status of popular packages support for free threading:


@itemize *

@item 
@indicateurl{https://py-free-threading.github.io/tracking/}

@item 
@indicateurl{https://hugovk.github.io/free-threaded-wheels/}
@end itemize

@node Thread safety,Known limitations,The global interpreter lock in free-threaded Python,Python support for free threading
@anchor{howto/free-threading-python thread-safety}@anchor{58c9}
@subsection Thread safety


The free-threaded build of CPython aims to provide similar thread-safety
behavior at the Python level to the default GIL-enabled build.  Built-in
types like @ref{183,,dict}, @ref{24d,,list}, and @ref{184,,set} use internal locks
to protect against concurrent modifications in ways that behave similarly to
the GIL.  However, Python has not historically guaranteed specific behavior for
concurrent modifications to these built-in types, so this should be treated
as a description of the current implementation, not a guarantee of current or
future behavior.

@cartouche
@quotation 참고 
It’s recommended to use the @ref{19f4,,threading.Lock} or other synchronization
primitives instead of relying on the internal locks of built-in types, when
possible.
@end quotation
@end cartouche

@node Known limitations,Behavioral changes,Thread safety,Python support for free threading
@anchor{howto/free-threading-python known-limitations}@anchor{58ca}
@subsection Known limitations


This section describes known limitations of the free-threaded CPython build.

@menu
* Immortalization:: 
* Frame objects:: 
* Iterators:: 
* Single-threaded performance:: 

@end menu

@node Immortalization,Frame objects,,Known limitations
@anchor{howto/free-threading-python immortalization}@anchor{58cb}
@subsubsection Immortalization


In the free-threaded build, some objects are @ref{290,,immortal}.
Immortal objects are not deallocated and have reference counts that are
never modified.  This is done to avoid reference count contention that would
prevent efficient multi-threaded scaling.

As of the 3.14 release, immortalization is limited to:


@itemize *

@item 
Code constants: numeric literals, string literals, and tuple literals
composed of other constants.

@item 
Strings interned by @ref{14e0,,sys.intern()}.
@end itemize

@node Frame objects,Iterators,Immortalization,Known limitations
@anchor{howto/free-threading-python frame-objects}@anchor{58cc}
@subsubsection Frame objects


It is not safe to access @ref{4a6,,frame.f_locals} from a @ref{8ee,,frame}
object if that frame is currently executing in another thread, and doing so may
crash the interpreter.

@node Iterators,Single-threaded performance,Frame objects,Known limitations
@anchor{howto/free-threading-python iterators}@anchor{58cd}
@subsubsection Iterators


It is generally not thread-safe to access the same iterator object from
multiple threads concurrently, and threads may see duplicate or missing
elements.

@node Single-threaded performance,,Iterators,Known limitations
@anchor{howto/free-threading-python single-threaded-performance}@anchor{58ce}
@subsubsection Single-threaded performance


The free-threaded build has additional overhead when executing Python code
compared to the default GIL-enabled build.  The amount of overhead depends
on the workload and hardware.  On the pyperformance benchmark suite, the
average overhead ranges from about 1% on macOS aarch64 to 8% on x86-64 Linux
systems.

@node Behavioral changes,,Known limitations,Python support for free threading
@anchor{howto/free-threading-python behavioral-changes}@anchor{58cf}
@subsection Behavioral changes


This section describes CPython behavioural changes with the free-threaded
build.

@menu
* Context variables:: 
* Warning filters:: 

@end menu

@node Context variables,Warning filters,,Behavioral changes
@anchor{howto/free-threading-python context-variables}@anchor{58d0}
@subsubsection Context variables


In the free-threaded build, the flag @ref{175,,thread_inherit_context}
is set to true by default which causes threads created with
@ref{176,,threading.Thread} to start with a copy of the
@ref{177,,Context()} of the caller of
@ref{178,,start()}.  In the default GIL-enabled build, the flag
defaults to false so threads start with an
empty @code{Context()}.

@node Warning filters,,Context variables,Behavioral changes
@anchor{howto/free-threading-python warning-filters}@anchor{58d1}
@subsubsection Warning filters


In the free-threaded build, the flag @ref{18a,,context_aware_warnings}
is set to true by default.  In the default GIL-enabled build, the flag defaults
to false.  If the flag is true then the @ref{179,,warnings.catch_warnings}
context manager uses a context variable for warning filters.  If the flag is
false then @code{catch_warnings} modifies the global filters list,
which is not thread-safe.  See the @ref{118,,warnings} module for more details.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node C API Extension Support for Free Threading,Remote debugging attachment protocol,Python support for free threading,파이썬 HOWTO
@anchor{howto/free-threading-extensions doc}@anchor{58d2}@anchor{howto/free-threading-extensions c-api-extension-support-for-free-threading}@anchor{58d3}@anchor{howto/free-threading-extensions freethreading-extensions-howto}@anchor{58c5}@anchor{howto/free-threading-extensions translation-repo}@anchor{58d4}
@section C API Extension Support for Free Threading


Starting with the 3.13 release, CPython has support for running with
the @ref{474,,global interpreter lock} (GIL) disabled in a configuration
called @ref{1f4,,free threading}.  This document describes how to adapt C API
extensions to support free threading.

@menu
* Identifying the Free-Threaded Build in C:: 
* Module Initialization:: 
* General API Guidelines:: 
* Borrowed References:: 
* Memory Allocation APIs:: 
* Thread State and GIL APIs:: 
* Protecting Internal Extension State:: 
* Critical Sections:: 
* Building Extensions for the Free-Threaded Build:: 

@end menu

@node Identifying the Free-Threaded Build in C,Module Initialization,,C API Extension Support for Free Threading
@anchor{howto/free-threading-extensions identifying-the-free-threaded-build-in-c}@anchor{58d5}
@subsection Identifying the Free-Threaded Build in C


The CPython C API exposes the @code{Py_GIL_DISABLED} macro: in the free-threaded
build it’s defined to @code{1}, and in the regular build it’s not defined.
You can use it to enable code that only runs under the free-threaded build:

@example
#ifdef Py_GIL_DISABLED
/* code that only runs in the free-threaded build */
#endif
@end example

@cartouche
@quotation 참고 
On Windows, this macro is not defined automatically, but must be specified
to the compiler when building. The @ref{174,,sysconfig.get_config_var()} function
can be used to determine whether the current running interpreter had the
macro defined.
@end quotation
@end cartouche

@node Module Initialization,General API Guidelines,Identifying the Free-Threaded Build in C,C API Extension Support for Free Threading
@anchor{howto/free-threading-extensions module-initialization}@anchor{58d6}
@subsection Module Initialization


Extension modules need to explicitly indicate that they support running with
the GIL disabled; otherwise importing the extension will raise a warning and
enable the GIL at runtime.

There are two ways to indicate that an extension module supports running with
the GIL disabled depending on whether the extension uses multi-phase or
single-phase initialization.

@menu
* Multi-Phase Initialization:: 
* Single-Phase Initialization:: 

@end menu

@node Multi-Phase Initialization,Single-Phase Initialization,,Module Initialization
@anchor{howto/free-threading-extensions multi-phase-initialization}@anchor{58d7}
@subsubsection Multi-Phase Initialization


Extensions that use multi-phase initialization (i.e.,
@ref{4ee2,,PyModuleDef_Init()}) should add a @ref{483,,Py_mod_gil} slot in the
module definition.  If your extension supports older versions of CPython,
you should guard the slot with a @ref{382,,PY_VERSION_HEX} check.

@example
static struct PyModuleDef_Slot module_slots[] = @{
    ...
#if PY_VERSION_HEX >= 0x030D0000
    @{Py_mod_gil, Py_MOD_GIL_NOT_USED@},
#endif
    @{0, NULL@}
@};

static struct PyModuleDef moduledef = @{
    PyModuleDef_HEAD_INIT,
    .m_slots = module_slots,
    ...
@};
@end example

@node Single-Phase Initialization,,Multi-Phase Initialization,Module Initialization
@anchor{howto/free-threading-extensions single-phase-initialization}@anchor{58d8}
@subsubsection Single-Phase Initialization


Extensions that use single-phase initialization (i.e.,
@ref{5256,,PyModule_Create()}) should call @ref{49e,,PyUnstable_Module_SetGIL()} to
indicate that they support running with the GIL disabled.  The function is
only defined in the free-threaded build, so you should guard the call with
@code{#ifdef Py_GIL_DISABLED} to avoid compilation errors in the regular build.

@example
static struct PyModuleDef moduledef = @{
    PyModuleDef_HEAD_INIT,
    ...
@};

PyMODINIT_FUNC
PyInit_mymodule(void)
@{
    PyObject *m = PyModule_Create(&moduledef);
    if (m == NULL) @{
        return NULL;
    @}
#ifdef Py_GIL_DISABLED
    PyUnstable_Module_SetGIL(m, Py_MOD_GIL_NOT_USED);
#endif
    return m;
@}
@end example

@node General API Guidelines,Borrowed References,Module Initialization,C API Extension Support for Free Threading
@anchor{howto/free-threading-extensions general-api-guidelines}@anchor{58d9}
@subsection General API Guidelines


Most of the C API is thread-safe, but there are some exceptions.


@itemize *

@item 
`Struct Fields': Accessing fields in Python C API objects or structs
directly is not thread-safe if the field may be concurrently modified.

@item 
`Macros': Accessor macros like @ref{4f9e,,PyList_GET_ITEM},
@ref{62d,,PyList_SET_ITEM}, and macros like
@ref{3ca,,PySequence_Fast_GET_SIZE} that use the object returned by
@ref{18a4,,PySequence_Fast()} do not perform any error checking or locking.
These macros are not thread-safe if the container object may be modified
concurrently.

@item 
`Borrowed References': C API functions that return
@ref{3d7,,borrowed references} may not be thread-safe if
the containing object is modified concurrently.  See the section on
@ref{58da,,borrowed references} for more information.
@end itemize

@menu
* Container Thread Safety:: 

@end menu

@node Container Thread Safety,,,General API Guidelines
@anchor{howto/free-threading-extensions container-thread-safety}@anchor{58db}
@subsubsection Container Thread Safety


Containers like @ref{2733,,PyListObject},
@ref{64d,,PyDictObject}, and @ref{5408,,PySetObject} perform internal locking
in the free-threaded build.  For example, the @ref{507e,,PyList_Append()} will
lock the list before appending an item.

@menu
* PyDict_Next:: 

@end menu

@node PyDict_Next,,,Container Thread Safety
@anchor{howto/free-threading-extensions id1}@anchor{58dc}@anchor{howto/free-threading-extensions pydict-next}@anchor{58dd}
@subsubsection @code{PyDict_Next}


A notable exception is @ref{1990,,PyDict_Next()}, which does not lock the
dictionary.  You should use @ref{53ea,,Py_BEGIN_CRITICAL_SECTION} to protect
the dictionary while iterating over it if the dictionary may be concurrently
modified:

@example
Py_BEGIN_CRITICAL_SECTION(dict);
PyObject *key, *value;
Py_ssize_t pos = 0;
while (PyDict_Next(dict, &pos, &key, &value)) @{
    ...
@}
Py_END_CRITICAL_SECTION();
@end example

@node Borrowed References,Memory Allocation APIs,General API Guidelines,C API Extension Support for Free Threading
@anchor{howto/free-threading-extensions borrowed-references}@anchor{58de}
@subsection Borrowed References

@anchor{howto/free-threading-extensions id2}@anchor{58da}
Some C API functions return @ref{3d7,,borrowed references}.
These APIs are not thread-safe if the containing object is modified
concurrently.  For example, it’s not safe to use @ref{5fc,,PyList_GetItem()}
if the list may be modified concurrently.

The following table lists some borrowed reference APIs and their replacements
that return @ref{5df,,strong references}.


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

Borrowed reference API

@tab

Strong reference API

@item

@ref{5fc,,PyList_GetItem()}

@tab

@ref{5fd,,PyList_GetItemRef()}

@item

@ref{4f9e,,PyList_GET_ITEM()}

@tab

@ref{5fd,,PyList_GetItemRef()}

@item

@ref{626,,PyDict_GetItem()}

@tab

@ref{5e0,,PyDict_GetItemRef()}

@item

@ref{5de,,PyDict_GetItemWithError()}

@tab

@ref{5e0,,PyDict_GetItemRef()}

@item

@ref{627,,PyDict_GetItemString()}

@tab

@ref{421,,PyDict_GetItemStringRef()}

@item

@ref{5e1,,PyDict_SetDefault()}

@tab

@ref{5e2,,PyDict_SetDefaultRef()}

@item

@ref{1990,,PyDict_Next()}

@tab

none (see @ref{58dd,,PyDict_Next})

@item

@ref{3dd,,PyWeakref_GetObject()}

@tab

@ref{3df,,PyWeakref_GetRef()}

@item

@ref{3de,,PyWeakref_GET_OBJECT()}

@tab

@ref{3df,,PyWeakref_GetRef()}

@item

@ref{5f9,,PyImport_AddModule()}

@tab

@ref{5fa,,PyImport_AddModuleRef()}

@item

@ref{5449,,PyCell_GET()}

@tab

@ref{5448,,PyCell_Get()}

@end multitable


Not all APIs that return borrowed references are problematic.  For
example, @ref{4ef6,,PyTuple_GetItem()} is safe because tuples are immutable.
Similarly, not all uses of the above APIs are problematic.  For example,
@ref{626,,PyDict_GetItem()} is often used for parsing keyword argument
dictionaries in function calls; those keyword argument dictionaries are
effectively private (not accessible by other threads), so using borrowed
references in that context is safe.

Some of these functions were added in Python 3.13.  You can use the
pythoncapi-compat@footnote{https://github.com/python/pythoncapi-compat} package
to provide implementations of these functions for older Python versions.

@node Memory Allocation APIs,Thread State and GIL APIs,Borrowed References,C API Extension Support for Free Threading
@anchor{howto/free-threading-extensions free-threaded-memory-allocation}@anchor{5602}@anchor{howto/free-threading-extensions memory-allocation-apis}@anchor{58df}
@subsection Memory Allocation APIs


Python’s memory management C API provides functions in three different
@ref{55fd,,allocation domains}: “raw”, “mem”, and “object”.
For thread-safety, the free-threaded build requires that only Python objects
are allocated using the object domain, and that all Python objects are
allocated using that domain.  This differs from the prior Python versions,
where this was only a best practice and not a hard requirement.

@cartouche
@quotation 참고 
Search for uses of @ref{e61,,PyObject_Malloc()} in your
extension and check that the allocated memory is used for Python objects.
Use @ref{e5e,,PyMem_Malloc()} to allocate buffers instead of
@code{PyObject_Malloc()}.
@end quotation
@end cartouche

@node Thread State and GIL APIs,Protecting Internal Extension State,Memory Allocation APIs,C API Extension Support for Free Threading
@anchor{howto/free-threading-extensions thread-state-and-gil-apis}@anchor{58e0}
@subsection Thread State and GIL APIs


Python provides a set of functions and macros to manage thread state and the
GIL, such as:


@itemize *

@item 
@ref{648,,PyGILState_Ensure()} and @ref{649,,PyGILState_Release()}

@item 
@ref{645,,PyEval_SaveThread()} and @ref{646,,PyEval_RestoreThread()}

@item 
@ref{4efc,,Py_BEGIN_ALLOW_THREADS} and @ref{c7e,,Py_END_ALLOW_THREADS}
@end itemize

These functions should still be used in the free-threaded build to manage
thread state even when the @ref{164,,GIL} is disabled.  For example, if you
create a thread outside of Python, you must call @ref{648,,PyGILState_Ensure()}
before calling into the Python API to ensure that the thread has a valid
Python thread state.

You should continue to call @ref{645,,PyEval_SaveThread()} or
@ref{4efc,,Py_BEGIN_ALLOW_THREADS} around blocking operations, such as I/O or
lock acquisitions, to allow other threads to run the
@ref{17dd,,cyclic garbage collector}.

@node Protecting Internal Extension State,Critical Sections,Thread State and GIL APIs,C API Extension Support for Free Threading
@anchor{howto/free-threading-extensions protecting-internal-extension-state}@anchor{58e1}
@subsection Protecting Internal Extension State


Your extension may have internal state that was previously protected by the
GIL.  You may need to add locking to protect this state.  The approach will
depend on your extension, but some common patterns include:


@itemize *

@item 
`Caches': global caches are a common source of shared state.  Consider
using a lock to protect the cache or disabling it in the free-threaded build
if the cache is not critical for performance.

@item 
`Global State': global state may need to be protected by a lock or moved
to thread local storage. C11 and C++11 provide the @code{thread_local} or
@code{_Thread_local} for
thread-local storage@footnote{https://en.cppreference.com/w/c/language/storage_duration}.
@end itemize

@node Critical Sections,Building Extensions for the Free-Threaded Build,Protecting Internal Extension State,C API Extension Support for Free Threading
@anchor{howto/free-threading-extensions critical-sections}@anchor{58e2}
@subsection Critical Sections

@anchor{howto/free-threading-extensions id3}@anchor{58e3}
In the free-threaded build, CPython provides a mechanism called “critical
sections” to protect data that would otherwise be protected by the GIL.
While extension authors may not interact with the internal critical section
implementation directly, understanding their behavior is crucial when using
certain C API functions or managing shared state in the free-threaded build.

@menu
* What Are Critical Sections?:: 
* Using Critical Sections:: 
* How Critical Sections Work:: 
* Deadlock Avoidance:: 
* Important Considerations:: 

@end menu

@node What Are Critical Sections?,Using Critical Sections,,Critical Sections
@anchor{howto/free-threading-extensions what-are-critical-sections}@anchor{58e4}
@subsubsection What Are Critical Sections?


Conceptually, critical sections act as a deadlock avoidance layer built on
top of simple mutexes. Each thread maintains a stack of active critical
sections. When a thread needs to acquire a lock associated with a critical
section (e.g., implicitly when calling a thread-safe C API function like
@ref{4ef8,,PyDict_SetItem()}, or explicitly using macros), it attempts to acquire
the underlying mutex.

@node Using Critical Sections,How Critical Sections Work,What Are Critical Sections?,Critical Sections
@anchor{howto/free-threading-extensions using-critical-sections}@anchor{58e5}
@subsubsection Using Critical Sections


The primary APIs for using critical sections are:


@itemize *

@item 
@ref{53ea,,Py_BEGIN_CRITICAL_SECTION} and @ref{5579,,Py_END_CRITICAL_SECTION} -
For locking a single object

@item 
@ref{5577,,Py_BEGIN_CRITICAL_SECTION2} and @ref{557b,,Py_END_CRITICAL_SECTION2}
- For locking two objects simultaneously
@end itemize

These macros must be used in matching pairs and must appear in the same C
scope, since they establish a new local scope.  These macros are no-ops in
non-free-threaded builds, so they can be safely added to code that needs to
support both build types.

A common use of a critical section would be to lock an object while accessing
an internal attribute of it.  For example, if an extension type has an internal
count field, you could use a critical section while reading or writing that
field:

@example
// read the count, returns new reference to internal count value
PyObject *result;
Py_BEGIN_CRITICAL_SECTION(obj);
result = Py_NewRef(obj->count);
Py_END_CRITICAL_SECTION();
return result;

// write the count, consumes reference from new_count
Py_BEGIN_CRITICAL_SECTION(obj);
obj->count = new_count;
Py_END_CRITICAL_SECTION();
@end example

@node How Critical Sections Work,Deadlock Avoidance,Using Critical Sections,Critical Sections
@anchor{howto/free-threading-extensions how-critical-sections-work}@anchor{58e6}
@subsubsection How Critical Sections Work


Unlike traditional locks, critical sections do not guarantee exclusive access
throughout their entire duration. If a thread would block while holding a
critical section (e.g., by acquiring another lock or performing I/O), the
critical section is temporarily suspended—all locks are released—and then
resumed when the blocking operation completes.

This behavior is similar to what happens with the GIL when a thread makes a
blocking call. The key differences are:


@itemize *

@item 
Critical sections operate on a per-object basis rather than globally

@item 
Critical sections follow a stack discipline within each thread (the “begin” and
“end” macros enforce this since they must be paired and within the same scope)

@item 
Critical sections automatically release and reacquire locks around potential
blocking operations
@end itemize

@node Deadlock Avoidance,Important Considerations,How Critical Sections Work,Critical Sections
@anchor{howto/free-threading-extensions deadlock-avoidance}@anchor{58e7}
@subsubsection Deadlock Avoidance


Critical sections help avoid deadlocks in two ways:


@enumerate 

@item 
If a thread tries to acquire a lock that’s already held by another thread,
it first suspends all of its active critical sections, temporarily releasing
their locks

@item 
When the blocking operation completes, only the top-most critical section is
reacquired first
@end enumerate

This means you cannot rely on nested critical sections to lock multiple objects
at once, as the inner critical section may suspend the outer ones. Instead, use
@ref{5577,,Py_BEGIN_CRITICAL_SECTION2} to lock two objects simultaneously.

Note that the locks described above are only @ref{485,,PyMutex} based locks.
The critical section implementation does not know about or affect other locking
mechanisms that might be in use, like POSIX mutexes.  Also note that while
blocking on any @code{PyMutex} causes the critical sections to be
suspended, only the mutexes that are part of the critical sections are
released.  If @code{PyMutex} is used without a critical section, it will
not be released and therefore does not get the same deadlock avoidance.

@node Important Considerations,,Deadlock Avoidance,Critical Sections
@anchor{howto/free-threading-extensions important-considerations}@anchor{58e8}
@subsubsection Important Considerations



@itemize *

@item 
Critical sections may temporarily release their locks, allowing other threads
to modify the protected data. Be careful about making assumptions about the
state of the data after operations that might block.

@item 
Because locks can be temporarily released (suspended), entering a critical
section does not guarantee exclusive access to the protected resource
throughout the section’s duration. If code within a critical section calls
another function that blocks (e.g., acquires another lock, performs blocking
I/O), all locks held by the thread via critical sections will be released.
This is similar to how the GIL can be released during blocking calls.

@item 
Only the lock(s) associated with the most recently entered (top-most)
critical section are guaranteed to be held at any given time. Locks for
outer, nested critical sections might have been suspended.

@item 
You can lock at most two objects simultaneously with these APIs. If you need
to lock more objects, you’ll need to restructure your code.

@item 
While critical sections will not deadlock if you attempt to lock the same
object twice, they are less efficient than purpose-built reentrant locks for
this use case.

@item 
When using @ref{5577,,Py_BEGIN_CRITICAL_SECTION2}, the order of the objects
doesn’t affect correctness (the implementation handles deadlock avoidance),
but it’s good practice to always lock objects in a consistent order.

@item 
Remember that the critical section macros are primarily for protecting access
to `Python objects' that might be involved in internal CPython operations
susceptible to the deadlock scenarios described above. For protecting purely
internal extension state, standard mutexes or other synchronization
primitives might be more appropriate.
@end itemize

@node Building Extensions for the Free-Threaded Build,,Critical Sections,C API Extension Support for Free Threading
@anchor{howto/free-threading-extensions building-extensions-for-the-free-threaded-build}@anchor{58e9}
@subsection Building Extensions for the Free-Threaded Build


C API extensions need to be built specifically for the free-threaded build.
The wheels, shared libraries, and binaries are indicated by a @code{t} suffix.


@itemize *

@item 
pypa/manylinux@footnote{https://github.com/pypa/manylinux} supports the
free-threaded build, with the @code{t} suffix, such as @code{python3.13t}.

@item 
pypa/cibuildwheel@footnote{https://github.com/pypa/cibuildwheel} supports the
free-threaded build on Python 3.13 and 3.14. On Python 3.14, free-threaded
wheels will be built by default. On Python 3.13, you will need to set
CIBW_ENABLE to cpython-freethreading@footnote{https://cibuildwheel.pypa.io/en/stable/options/#enable}.
@end itemize

@menu
* Limited C API and Stable ABI:: 
* Windows: Windows<84>. 

@end menu

@node Limited C API and Stable ABI,Windows<84>,,Building Extensions for the Free-Threaded Build
@anchor{howto/free-threading-extensions limited-c-api-and-stable-abi}@anchor{58ea}
@subsubsection Limited C API and Stable ABI


The free-threaded build does not currently support the
@ref{635,,Limited C API} or the stable ABI.  If you use
setuptools@footnote{https://setuptools.pypa.io/en/latest/setuptools.html} to build
your extension and currently set @code{py_limited_api=True} you can use
@code{py_limited_api=not sysconfig.get_config_var("Py_GIL_DISABLED")} to opt out
of the limited API when building with the free-threaded build.

@cartouche
@quotation 참고 
You will need to build separate wheels specifically for the free-threaded
build.  If you currently use the stable ABI, you can continue to build a
single wheel for multiple non-free-threaded Python versions.
@end quotation
@end cartouche

@node Windows<84>,,Limited C API and Stable ABI,Building Extensions for the Free-Threaded Build
@anchor{howto/free-threading-extensions windows}@anchor{58eb}
@subsubsection Windows


Due to a limitation of the official Windows installer, you will need to
manually define @code{Py_GIL_DISABLED=1} when building extensions from source.


@subsubheading 더 보기


Porting Extension Modules to Support Free-Threading@footnote{https://py-free-threading.github.io/porting/}:
A community-maintained porting guide for extension authors.


@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Remote debugging attachment protocol,Permission requirements,C API Extension Support for Free Threading,파이썬 HOWTO
@anchor{howto/remote_debugging doc}@anchor{58ec}@anchor{howto/remote_debugging remote-debugging}@anchor{4965}@anchor{howto/remote_debugging remote-debugging-attachment-protocol}@anchor{58ed}@anchor{howto/remote_debugging translation-repo}@anchor{58ee}
@section Remote debugging attachment protocol


This protocol enables external tools to attach to a running CPython process and
execute Python code remotely.

Most platforms require elevated privileges to attach to another Python process.

@menu
* Disabling remote debugging:: 

@end menu

@node Disabling remote debugging,,,Remote debugging attachment protocol
@anchor{howto/remote_debugging disabling-remote-debugging}@anchor{58ef}
@subsection Disabling remote debugging


To disable remote debugging support, use any of the following:


@itemize *

@item 
Set the 
@geindex PYTHON_DISABLE_REMOTE_DEBUG
@geindex 환경 변수; PYTHON_DISABLE_REMOTE_DEBUG
@ref{16e,,PYTHON_DISABLE_REMOTE_DEBUG} environment variable to @code{1} before
starting the interpreter.

@item 
Use the @ref{16f,,-X disable_remote_debug} command-line option.

@item 
Compile Python with the @ref{170,,--without-remote-debug} build flag.
@end itemize

@node Permission requirements,Locating the PyRuntime structure,Remote debugging attachment protocol,파이썬 HOWTO
@anchor{howto/remote_debugging id1}@anchor{58f0}@anchor{howto/remote_debugging permission-requirements}@anchor{58f1}
@section Permission requirements


Attaching to a running Python process for remote debugging requires elevated
privileges on most platforms. The specific requirements and troubleshooting
steps depend on your operating system:

@subsubheading Linux


The tracer process must have the @code{CAP_SYS_PTRACE} capability or equivalent
privileges. You can only trace processes you own and can signal. Tracing may
fail if the process is already being traced, or if it is running with
set-user-ID or set-group-ID. Security modules like Yama may further restrict
tracing.

To temporarily relax ptrace restrictions (until reboot), run:

@quotation

@code{echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope}
@end quotation

@cartouche
@quotation 참고 
Disabling @code{ptrace_scope} reduces system hardening and should only be done
in trusted environments.
@end quotation
@end cartouche

If running inside a container, use @code{--cap-add=SYS_PTRACE} or
@code{--privileged}, and run as root if needed.

Try re-running the command with elevated privileges:

@quotation

@code{sudo -E !!}
@end quotation

@subsubheading macOS


To attach to another process, you typically need to run your debugging tool
with elevated privileges. This can be done by using @code{sudo} or running as
root.

Even when attaching to processes you own, macOS may block debugging unless
the debugger is run with root privileges due to system security restrictions.

@subsubheading Windows


To attach to another process, you usually need to run your debugging tool
with administrative privileges. Start the command prompt or terminal as
Administrator.

Some processes may still be inaccessible even with Administrator rights,
unless you have the @code{SeDebugPrivilege} privilege enabled.

To resolve file or folder access issues, adjust the security permissions:

@quotation


@enumerate 

@item 
Right-click the file or folder and select `Properties'.

@item 
Go to the `Security' tab to view users and groups with access.

@item 
Click `Edit' to modify permissions.

@item 
Select your user account.

@item 
In `Permissions', check `Read' or `Full control' as needed.

@item 
Click `Apply', then `OK' to confirm.
@end enumerate
@end quotation

@cartouche
@quotation 참고 
Ensure you’ve satisfied all @ref{58f1,,Permission requirements} before proceeding.
@end quotation
@end cartouche

This section describes the low-level protocol that enables external tools to
inject and execute a Python script within a running CPython process.

This mechanism forms the basis of the @ref{16d,,sys.remote_exec()} function, which
instructs a remote Python process to execute a @code{.py} file. However, this
section does not document the usage of that function. Instead, it provides a
detailed explanation of the underlying protocol, which takes as input the
@code{pid} of a target Python process and the path to a Python source file to be
executed. This information supports independent reimplementation of the
protocol, regardless of programming language.

@cartouche
@quotation 경고 
The execution of the injected script depends on the interpreter reaching a
safe evaluation point. As a result, execution may be delayed depending on
the runtime state of the target process.
@end quotation
@end cartouche

Once injected, the script is executed by the interpreter within the target
process the next time a safe evaluation point is reached. This approach enables
remote execution capabilities without modifying the behavior or structure of
the running Python application.

Subsequent sections provide a step-by-step description of the protocol,
including techniques for locating interpreter structures in memory, safely
accessing internal fields, and triggering code execution. Platform-specific
variations are noted where applicable, and example implementations are included
to clarify each operation.

@node Locating the PyRuntime structure,Reading _Py_DebugOffsets,Permission requirements,파이썬 HOWTO
@anchor{howto/remote_debugging locating-the-pyruntime-structure}@anchor{58f2}
@section Locating the PyRuntime structure


CPython places the @code{PyRuntime} structure in a dedicated binary section to
help external tools find it at runtime. The name and format of this section
vary by platform. For example, @code{.PyRuntime} is used on ELF systems, and
@code{__DATA,__PyRuntime} is used on macOS. Tools can find the offset of this
structure by examining the binary on disk.

The @code{PyRuntime} structure contains CPython’s global interpreter state and
provides access to other internal data, including the list of interpreters,
thread states, and debugger support fields.

To work with a remote Python process, a debugger must first find the memory
address of the @code{PyRuntime} structure in the target process. This address
can’t be hardcoded or calculated from a symbol name, because it depends on
where the operating system loaded the binary.

The method for finding @code{PyRuntime} depends on the platform, but the steps are
the same in general:


@enumerate 

@item 
Find the base address where the Python binary or shared library was loaded
in the target process.

@item 
Use the on-disk binary to locate the offset of the @code{.PyRuntime} section.

@item 
Add the section offset to the base address to compute the address in memory.
@end enumerate

The sections below explain how to do this on each supported platform and
include example code.

@subsubheading Linux (ELF)


To find the @code{PyRuntime} structure on Linux:


@enumerate 

@item 
Read the process’s memory map (for example, @code{/proc/<pid>/maps}) to find
the address where the Python executable or @code{libpython} was loaded.

@item 
Parse the ELF section headers in the binary to get the offset of the
@code{.PyRuntime} section.

@item 
Add that offset to the base address from step 1 to get the memory address of
@code{PyRuntime}.
@end enumerate

The following is an example implementation:

@example
def find_py_runtime_linux(pid: int) -> int:
    # Step 1: Try to find the Python executable in memory
    binary_path, base_address = find_mapped_binary(
        pid, name_contains="python"
    )

    # Step 2: Fallback to shared library if executable is not found
    if binary_path is None:
        binary_path, base_address = find_mapped_binary(
            pid, name_contains="libpython"
        )

    # Step 3: Parse ELF headers to get .PyRuntime section offset
    section_offset = parse_elf_section_offset(
        binary_path, ".PyRuntime"
    )

    # Step 4: Compute PyRuntime address in memory
    return base_address + section_offset
@end example

On Linux systems, there are two main approaches to read memory from another
process. The first is through the @code{/proc} filesystem, specifically by reading from
@code{/proc/[pid]/mem} which provides direct access to the process’s memory. This
requires appropriate permissions - either being the same user as the target
process or having root access. The second approach is using the
@code{process_vm_readv()} system call which provides a more efficient way to copy
memory between processes. While ptrace’s @code{PTRACE_PEEKTEXT} operation can also be
used to read memory, it is significantly slower as it only reads one word at a
time and requires multiple context switches between the tracer and tracee
processes.

For parsing ELF sections, the process involves reading and interpreting the ELF
file format structures from the binary file on disk. The ELF header contains a
pointer to the section header table. Each section header contains metadata about
a section including its name (stored in a separate string table), offset, and
size. To find a specific section like .PyRuntime, you need to walk through these
headers and match the section name. The section header then provides the offset
where that section exists in the file, which can be used to calculate its
runtime address when the binary is loaded into memory.

You can read more about the ELF file format in the ELF specification@footnote{https://en.wikipedia.org/wiki/Executable_and_Linkable_Format}.

@subsubheading macOS (Mach-O)


To find the @code{PyRuntime} structure on macOS:


@enumerate 

@item 
Call @code{task_for_pid()} to get the @code{mach_port_t} task port for the target
process. This handle is needed to read memory using APIs like
@code{mach_vm_read_overwrite} and @code{mach_vm_region}.

@item 
Scan the memory regions to find the one containing the Python executable or
@code{libpython}.

@item 
Load the binary file from disk and parse the Mach-O headers to find the
section named @code{PyRuntime} in the @code{__DATA} segment.  On macOS, symbol
names are automatically prefixed with an underscore, so the @code{PyRuntime}
symbol appears as @code{_PyRuntime} in the symbol table, but the section name
is not affected.
@end enumerate

The following is an example implementation:

@example
def find_py_runtime_macos(pid: int) -> int:
    # Step 1: Get access to the process's memory
    handle = get_memory_access_handle(pid)

    # Step 2: Try to find the Python executable in memory
    binary_path, base_address = find_mapped_binary(
        handle, name_contains="python"
    )

    # Step 3: Fallback to libpython if the executable is not found
    if binary_path is None:
        binary_path, base_address = find_mapped_binary(
            handle, name_contains="libpython"
        )

    # Step 4: Parse Mach-O headers to get __DATA,__PyRuntime section offset
    section_offset = parse_macho_section_offset(
        binary_path, "__DATA", "__PyRuntime"
    )

    # Step 5: Compute the PyRuntime address in memory
    return base_address + section_offset
@end example

On macOS, accessing another process’s memory requires using Mach-O specific APIs
and file formats. The first step is obtaining a @code{task_port} handle via
@code{task_for_pid()}, which provides access to the target process’s memory space.
This handle enables memory operations through APIs like
@code{mach_vm_read_overwrite()}.

The process memory can be examined using @code{mach_vm_region()} to scan through the
virtual memory space, while @code{proc_regionfilename()} helps identify which binary
files are loaded at each memory region. When the Python binary or library is
found, its Mach-O headers need to be parsed to locate the @code{PyRuntime} structure.

The Mach-O format organizes code and data into segments and sections. The
@code{PyRuntime} structure lives in a section named @code{__PyRuntime} within the
@code{__DATA} segment. The actual runtime address calculation involves finding the
@code{__TEXT} segment which serves as the binary’s base address, then locating the
@code{__DATA} segment containing our target section. The final address is computed by
combining the base address with the appropriate section offsets from the Mach-O
headers.

Note that accessing another process’s memory on macOS typically requires
elevated privileges - either root access or special security entitlements
granted to the debugging process.

@subsubheading Windows (PE)


To find the @code{PyRuntime} structure on Windows:


@enumerate 

@item 
Use the ToolHelp API to enumerate all modules loaded in the target process.
This is done using functions such as CreateToolhelp32Snapshot@footnote{https://learn.microsoft.com/en-us/windows/win32/api/tlhelp32/nf-tlhelp32-createtoolhelp32snapshot},
Module32First@footnote{https://learn.microsoft.com/en-us/windows/win32/api/tlhelp32/nf-tlhelp32-module32first},
and Module32Next@footnote{https://learn.microsoft.com/en-us/windows/win32/api/tlhelp32/nf-tlhelp32-module32next}.

@item 
Identify the module corresponding to @code{python.exe} or
@code{python`XY'.dll}, where @code{X} and @code{Y} are the major and minor
version numbers of the Python version, and record its base address.

@item 
Locate the @code{PyRuntim} section. Due to the PE format’s 8-character limit
on section names (defined as @code{IMAGE_SIZEOF_SHORT_NAME}), the original
name @code{PyRuntime} is truncated. This section contains the @code{PyRuntime}
structure.

@item 
Retrieve the section’s relative virtual address (RVA) and add it to the base
address of the module.
@end enumerate

The following is an example implementation:

@example
def find_py_runtime_windows(pid: int) -> int:
    # Step 1: Try to find the Python executable in memory
    binary_path, base_address = find_loaded_module(
        pid, name_contains="python"
    )

    # Step 2: Fallback to shared pythonXY.dll if the executable is not
    # found
    if binary_path is None:
        binary_path, base_address = find_loaded_module(
            pid, name_contains="python3"
        )

    # Step 3: Parse PE section headers to get the RVA of the PyRuntime
    # section. The section name appears as "PyRuntim" due to the
    # 8-character limit defined by the PE format (IMAGE_SIZEOF_SHORT_NAME).
    section_rva = parse_pe_section_offset(binary_path, "PyRuntim")

    # Step 4: Compute PyRuntime address in memory
    return base_address + section_rva
@end example

On Windows, accessing another process’s memory requires using the Windows API
functions like @code{CreateToolhelp32Snapshot()} and @code{Module32First()/Module32Next()}
to enumerate loaded modules. The @code{OpenProcess()} function provides a handle to
access the target process’s memory space, enabling memory operations through
@code{ReadProcessMemory()}.

The process memory can be examined by enumerating loaded modules to find the
Python binary or DLL. When found, its PE headers need to be parsed to locate the
@code{PyRuntime} structure.

The PE format organizes code and data into sections. The @code{PyRuntime} structure
lives in a section named “PyRuntim” (truncated from “PyRuntime” due to PE’s
8-character name limit). The actual runtime address calculation involves finding
the module’s base address from the module entry, then locating our target
section in the PE headers. The final address is computed by combining the base
address with the section’s virtual address from the PE section headers.

Note that accessing another process’s memory on Windows typically requires
appropriate privileges - either administrative access or the @code{SeDebugPrivilege}
privilege granted to the debugging process.

@node Reading _Py_DebugOffsets,Locating the interpreter and thread state,Locating the PyRuntime structure,파이썬 HOWTO
@anchor{howto/remote_debugging reading-py-debugoffsets}@anchor{58f3}
@section Reading _Py_DebugOffsets


Once the address of the @code{PyRuntime} structure has been determined, the next
step is to read the @code{_Py_DebugOffsets} structure located at the beginning of
the @code{PyRuntime} block.

This structure provides version-specific field offsets that are needed to
safely read interpreter and thread state memory. These offsets vary between
CPython versions and must be checked before use to ensure they are compatible.

To read and check the debug offsets, follow these steps:


@enumerate 

@item 
Read memory from the target process starting at the @code{PyRuntime} address,
covering the same number of bytes as the @code{_Py_DebugOffsets} structure.
This structure is located at the very start of the @code{PyRuntime} memory
block. Its layout is defined in CPython’s internal headers and stays the
same within a given minor version, but may change in major versions.

@item 
Check that the structure contains valid data:


@itemize -

@item 
The @code{cookie} field must match the expected debug marker.

@item 
The @code{version} field must match the version of the Python interpreter
used by the debugger.

@item 
If either the debugger or the target process is using a pre-release
version (for example, an alpha, beta, or release candidate), the versions
must match exactly.

@item 
The @code{free_threaded} field must have the same value in both the debugger
and the target process.
@end itemize

@item 
If the structure is valid, the offsets it contains can be used to locate
fields in memory. If any check fails, the debugger should stop the operation
to avoid reading memory in the wrong format.
@end enumerate

The following is an example implementation that reads and checks
@code{_Py_DebugOffsets}:

@example
def read_debug_offsets(pid: int, py_runtime_addr: int) -> DebugOffsets:
    # Step 1: Read memory from the target process at the PyRuntime address
    data = read_process_memory(
        pid, address=py_runtime_addr, size=DEBUG_OFFSETS_SIZE
    )

    # Step 2: Deserialize the raw bytes into a _Py_DebugOffsets structure
    debug_offsets = parse_debug_offsets(data)

    # Step 3: Validate the contents of the structure
    if debug_offsets.cookie != EXPECTED_COOKIE:
        raise RuntimeError("Invalid or missing debug cookie")
    if debug_offsets.version != LOCAL_PYTHON_VERSION:
        raise RuntimeError(
            "Mismatch between caller and target Python versions"
        )
    if debug_offsets.free_threaded != LOCAL_FREE_THREADED:
        raise RuntimeError("Mismatch in free-threaded configuration")

    return debug_offsets
@end example

@cartouche
@quotation 경고 
`Process suspension recommended'

To avoid race conditions and ensure memory consistency, it is strongly
recommended that the target process be suspended before performing any
operations that read or write internal interpreter state. The Python runtime
may concurrently mutate interpreter data structures—such as creating or
destroying threads—during normal execution. This can result in invalid
memory reads or writes.

A debugger may suspend execution by attaching to the process with @code{ptrace}
or by sending a @code{SIGSTOP} signal. Execution should only be resumed after
debugger-side memory operations are complete.

@cartouche
@quotation 참고 
Some tools, such as profilers or sampling-based debuggers, may operate on
a running process without suspension. In such cases, tools must be
explicitly designed to handle partially updated or inconsistent memory.
For most debugger implementations, suspending the process remains the
safest and most robust approach.
@end quotation
@end cartouche
@end quotation
@end cartouche

@node Locating the interpreter and thread state,Writing control information,Reading _Py_DebugOffsets,파이썬 HOWTO
@anchor{howto/remote_debugging locating-the-interpreter-and-thread-state}@anchor{58f4}
@section Locating the interpreter and thread state


Before code can be injected and executed in a remote Python process, the
debugger must choose a thread in which to schedule execution. This is necessary
because the control fields used to perform remote code injection are located in
the @code{_PyRemoteDebuggerSupport} structure, which is embedded in a
@code{PyThreadState} object. These fields are modified by the debugger to request
execution of injected scripts.

The @code{PyThreadState} structure represents a thread running inside a Python
interpreter.  It maintains the thread’s evaluation context and contains the
fields required for debugger coordination.  Locating a valid @code{PyThreadState}
is therefore a key prerequisite for triggering execution remotely.

A thread is typically selected based on its role or ID. In most cases, the main
thread is used, but some tools may target a specific thread by its native
thread ID. Once the target thread is chosen, the debugger must locate both the
interpreter and the associated thread state structures in memory.

The relevant internal structures are defined as follows:


@itemize -

@item 
@code{PyInterpreterState} represents an isolated Python interpreter instance.
Each interpreter maintains its own set of imported modules, built-in state,
and thread state list. Although most Python applications use a single
interpreter, CPython supports multiple interpreters in the same process.

@item 
@code{PyThreadState} represents a thread running within an interpreter. It
contains execution state and the control fields used by the debugger.
@end itemize

To locate a thread:


@enumerate 

@item 
Use the offset @code{runtime_state.interpreters_head} to obtain the address of
the first interpreter in the @code{PyRuntime} structure. This is the entry point
to the linked list of active interpreters.

@item 
Use the offset @code{interpreter_state.threads_main} to access the main thread
state associated with the selected interpreter. This is typically the most
reliable thread to target.

@item 
Optionally, use the offset @code{interpreter_state.threads_head} to iterate
through the linked list of all thread states. Each @code{PyThreadState}
structure contains a @code{native_thread_id} field, which may be compared to
a target thread ID to find a specific thread.

@item 
Once a valid @code{PyThreadState} has been found, its address can be used in
later steps of the protocol, such as writing debugger control fields and
scheduling execution.
@end enumerate

The following is an example implementation that locates the main thread state:

@example
def find_main_thread_state(
    pid: int, py_runtime_addr: int, debug_offsets: DebugOffsets,
) -> int:
    # Step 1: Read interpreters_head from PyRuntime
    interp_head_ptr = (
        py_runtime_addr + debug_offsets.runtime_state.interpreters_head
    )
    interp_addr = read_pointer(pid, interp_head_ptr)
    if interp_addr == 0:
        raise RuntimeError("No interpreter found in the target process")

    # Step 2: Read the threads_main pointer from the interpreter
    threads_main_ptr = (
        interp_addr + debug_offsets.interpreter_state.threads_main
    )
    thread_state_addr = read_pointer(pid, threads_main_ptr)
    if thread_state_addr == 0:
        raise RuntimeError("Main thread state is not available")

    return thread_state_addr
@end example

The following example demonstrates how to locate a thread by its native thread
ID:

@example
def find_thread_by_id(
    pid: int,
    interp_addr: int,
    debug_offsets: DebugOffsets,
    target_tid: int,
) -> int:
    # Start at threads_head and walk the linked list
    thread_ptr = read_pointer(
        pid,
        interp_addr + debug_offsets.interpreter_state.threads_head
    )

    while thread_ptr:
        native_tid_ptr = (
            thread_ptr + debug_offsets.thread_state.native_thread_id
        )
        native_tid = read_int(pid, native_tid_ptr)
        if native_tid == target_tid:
            return thread_ptr
        thread_ptr = read_pointer(
            pid,
            thread_ptr + debug_offsets.thread_state.next
        )

    raise RuntimeError("Thread with the given ID was not found")
@end example

Once a valid thread state has been located, the debugger can proceed with
modifying its control fields and scheduling execution, as described in the next
section.

@node Writing control information,Summary,Locating the interpreter and thread state,파이썬 HOWTO
@anchor{howto/remote_debugging writing-control-information}@anchor{58f5}
@section Writing control information


Once a valid @code{PyThreadState} structure has been identified, the debugger may
modify control fields within it to schedule the execution of a specified Python
script. These control fields are checked periodically by the interpreter, and
when set correctly, they trigger the execution of remote code at a safe point
in the evaluation loop.

Each @code{PyThreadState} contains a @code{_PyRemoteDebuggerSupport} structure used
for communication between the debugger and the interpreter. The locations of
its fields are defined by the @code{_Py_DebugOffsets} structure and include the
following:


@itemize -

@item 
@code{debugger_script_path}: A fixed-size buffer that holds the full path to a
Python source file (@code{.py}).  This file must be accessible and readable by
the target process when execution is triggered.

@item 
@code{debugger_pending_call}: An integer flag. Setting this to @code{1} tells the
interpreter that a script is ready to be executed.

@item 
@code{eval_breaker}: A field checked by the interpreter during execution.
Setting bit 5 (@code{_PY_EVAL_PLEASE_STOP_BIT}, value @code{1U << 5}) in this
field causes the interpreter to pause and check for debugger activity.
@end itemize

To complete the injection, the debugger must perform the following steps:


@enumerate 

@item 
Write the full script path into the @code{debugger_script_path} buffer.

@item 
Set @code{debugger_pending_call} to @code{1}.

@item 
Read the current value of @code{eval_breaker}, set bit 5
(@code{_PY_EVAL_PLEASE_STOP_BIT}), and write the updated value back. This
signals the interpreter to check for debugger activity.
@end enumerate

The following is an example implementation:

@example
def inject_script(
    pid: int,
    thread_state_addr: int,
    debug_offsets: DebugOffsets,
    script_path: str
) -> None:
    # Compute the base offset of _PyRemoteDebuggerSupport
    support_base = (
        thread_state_addr +
        debug_offsets.debugger_support.remote_debugger_support
    )

    # Step 1: Write the script path into debugger_script_path
    script_path_ptr = (
        support_base +
        debug_offsets.debugger_support.debugger_script_path
    )
    write_string(pid, script_path_ptr, script_path)

    # Step 2: Set debugger_pending_call to 1
    pending_ptr = (
        support_base +
        debug_offsets.debugger_support.debugger_pending_call
    )
    write_int(pid, pending_ptr, 1)

    # Step 3: Set _PY_EVAL_PLEASE_STOP_BIT (bit 5, value 1 << 5) in
    # eval_breaker
    eval_breaker_ptr = (
        thread_state_addr +
        debug_offsets.debugger_support.eval_breaker
    )
    breaker = read_int(pid, eval_breaker_ptr)
    breaker |= (1 << 5)
    write_int(pid, eval_breaker_ptr, breaker)
@end example

Once these fields are set, the debugger may resume the process (if it was
suspended).  The interpreter will process the request at the next safe
evaluation point, load the script from disk, and execute it.

It is the responsibility of the debugger to ensure that the script file remains
present and accessible to the target process during execution.

@cartouche
@quotation 참고 
Script execution is asynchronous. The script file cannot be deleted
immediately after injection. The debugger should wait until the injected
script has produced an observable effect before removing the file.
This effect depends on what the script is designed to do. For example,
a debugger might wait until the remote process connects back to a socket
before removing the script. Once such an effect is observed, it is safe to
assume the file is no longer needed.
@end quotation
@end cartouche

@node Summary,,Writing control information,파이썬 HOWTO
@anchor{howto/remote_debugging summary}@anchor{58f6}
@section Summary


To inject and execute a Python script in a remote process:


@enumerate 

@item 
Locate the @code{PyRuntime} structure in the target process’s memory.

@item 
Read and validate the @code{_Py_DebugOffsets} structure at the beginning of
@code{PyRuntime}.

@item 
Use the offsets to locate a valid @code{PyThreadState}.

@item 
Write the path to a Python script into @code{debugger_script_path}.

@item 
Set the @code{debugger_pending_call} flag to @code{1}.

@item 
Set @code{_PY_EVAL_PLEASE_STOP_BIT} in the @code{eval_breaker} field.

@item 
Resume the process (if suspended). The script will execute at the next safe
evaluation point.
@end enumerate

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

General:


@itemize *

@item 
@ref{37e8,,A Conceptual Overview of asyncio}

@item 
@ref{9d9,,Annotations Best Practices}

@item 
@ref{339d,,Argparse 자습서}

@item 
@ref{16f2,,Descriptor Guide}

@item 
@ref{573f,,Enum HOWTO}

@item 
@ref{5770,,함수형 프로그래밍 HOWTO}

@item 
@ref{41ff,,ipaddress 모듈에 대한 소개}

@item 
@ref{578f,,로깅 HOWTO}

@item 
@ref{13fc,,로깅 요리책}

@item 
@ref{2786,,정규식 HOWTO}

@item 
@ref{25de,,정렬 기법}

@item 
@ref{14a9,,유니코드 HOWTO}

@item 
@ref{3fc2,,urllib 패키지를 사용하여 인터넷 리소스를 가져오는 방법}
@end itemize

Advanced development:


@itemize *

@item 
@ref{3490,,파이썬 curses 프로그래밍}

@item 
@ref{2723,,Python support for free threading}

@item 
@ref{58c5,,C API Extension Support for Free Threading}

@item 
@ref{166,,Isolating Extension Modules}

@item 
@ref{16af,,The Python 2.3 Method Resolution Order}

@item 
@ref{39d8,,소켓 프로그래밍 HOWTO}

@item 
@ref{58b6,,timer file descriptor HOWTO}

@item 
@ref{14e5,,확장 모듈을 파이썬 3에 이식하기}
@end itemize

Debugging and profiling:


@itemize *

@item 
@ref{5730,,Debugging C API extensions and CPython Internals with GDB}

@item 
@ref{e65,,DTrace와 SystemTap으로 CPython 계측하기}

@item 
@ref{4b0,,Python support for the Linux perf profiler}

@item 
@ref{4965,,Remote debugging attachment protocol}
@end itemize

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 파이썬 자주 나오는 질문들,Deprecations,파이썬 HOWTO,Top
@anchor{faq/index doc}@anchor{58f7}@anchor{faq/index faq-index}@anchor{20f2}@anchor{faq/index python-frequently-asked-questions}@anchor{58f8}@anchor{faq/index translation-repo}@anchor{58f9}
@chapter 파이썬 자주 나오는 질문들


@menu
* 일반적인 파이썬 FAQ:: 
* 프로그래밍 FAQ:: 
* 설계와 역사 FAQ:: 
* 라이브러리와 확장 FAQ:: 
* 확장/내장 FAQ:: 
* 윈도우 파이썬 FAQ:: 
* 그래픽 사용자 인터페이스 FAQ:: 
* “왜 내 컴퓨터에 파이썬이 설치되어 있습니까?” FAQ:: 

@end menu

@node 일반적인 파이썬 FAQ,프로그래밍 FAQ,,파이썬 자주 나오는 질문들
@anchor{faq/general doc}@anchor{58fa}@anchor{faq/general general-python-faq}@anchor{58fb}
@section 일반적인 파이썬 FAQ



@menu
* 일반적인 정보:: 
* 현실 속의 파이썬:: 

@end menu

@node 일반적인 정보,현실 속의 파이썬,,일반적인 파이썬 FAQ
@anchor{faq/general general-information}@anchor{58fc}
@subsection 일반적인 정보


@menu
* 파이썬이 무엇입니까?:: 
* 파이썬 소프트웨어 재단이 무엇입니까?:: 
* 파이썬을 사용할 때 저작권 관련 제한이 있습니까?:: 
* 파이썬은 애초에 왜 만들어졌습니까?:: 
* 파이썬의 강점은 무엇입니까?:: 
* 파이썬 버전 관리 규칙은 무엇입니까?:: 
* 파이썬 소스를 어떻게 얻을 수 있습니까?:: 
* 파이썬 설명 문서는 어떻게 구합니까?:: 
* 저는 프로그래밍을 해본 적이 없습니다. 파이썬 튜토리얼이 있습니까?: 저는 프로그래밍을 해본 적이 없습니다 파이썬 튜토리얼이 있습니까?. 
* 파이썬에 특화된 뉴스 그룹이나 메일링 리스트가 있습니까?:: 
* 파이썬 베타 테스트 버전은 어떻게 구합니까?:: 
* 파이썬 버그 리포트나 패치는 어떻게 제출합니까?:: 
* 제가 참고할만한 파이썬 관련 기사가 있습니까?:: 
* 파이썬 관련 책이 있습니까?:: 
* 도대체 www.python.org는 어디에 있는 겁니까?: 도대체 www python org는 어디에 있는 겁니까?. 
* 왜 이 언어는 파이썬이라 불립니까?:: 
* “몬티 파이튼의 플라잉 서커스”를 좋아해야합니까?:: 

@end menu

@node 파이썬이 무엇입니까?,파이썬 소프트웨어 재단이 무엇입니까?,,일반적인 정보
@anchor{faq/general what-is-python}@anchor{58fd}
@subsubsection 파이썬이 무엇입니까?


파이썬은 인터프리터 방식의, 해석되고 상호작용이 가능한, 객체 지향적 프로그래밍 언어입니다. 모듈, 예외, 동적 타이핑, 굉장히 높은 수준의 동적 데이터 타입, 그리고 클래스를 내포하고 있습니다. 절차적이나 함수형 프로그래밍과 같은 객체 지향 프로그래밍 이외의 여러 프로그래밍 패러다임을 지원합니다. 파이썬은 굉장히 깔끔한 구문으로 놀랄만한 힘을 결합합니다. 이 언어는 다양한 시스템 호출과 라이브러리 뿐만 아니라 다양한 윈도우 시스템 관련 인터페이스를 갖고 있으며, C 언어와 C++ 언어로 확장이 가능합니다. 또한 프로그래밍 인터페이스가 필요한 애플리케이션의 확장 언어로도 사용할 수 있습니다. 마지막으로, 파이썬은 리눅스와 macOS를 포함하는 많은 유닉스 변종과 윈도우에서 돌아가는 포터블 언어입니다.

추가 정보는 @ref{1fb8,,파이썬 자습서}에 있습니다. 파이썬 초보자 가이드@footnote{https://wiki.python.org/moin/BeginnersGuide}에서 다른 기초 자습서와 파이썬을 배우기 위한 자료들을 볼 수 있습니다.

@node 파이썬 소프트웨어 재단이 무엇입니까?,파이썬을 사용할 때 저작권 관련 제한이 있습니까?,파이썬이 무엇입니까?,일반적인 정보
@anchor{faq/general what-is-the-python-software-foundation}@anchor{58fe}
@subsubsection 파이썬 소프트웨어 재단이 무엇입니까?


파이썬 소프트웨어 재단이란 파이썬 2.1과 그 윗 버전의 저작권을 소유하고 있는 독립적이고 비영리적인 단체입니다. 이 재단의 사명은 파이썬의 사용을 대중화 시키고 파이썬 관련 오픈소스 기술을 발전시키는 것입니다. 파이썬 소프트웨어 재단의 홈페이지: @indicateurl{https://www.python.org/psf/}.

파이썬 소프트웨어 재단으로의 기부는 미국에서 세액공제 적용 대상입니다. 파이썬을 사용하고 도움이 된다고 생각한다면 PSF 기부 페이지@footnote{https://www.python.org/psf/donations/}를 통해 기여해 주십시오.

@node 파이썬을 사용할 때 저작권 관련 제한이 있습니까?,파이썬은 애초에 왜 만들어졌습니까?,파이썬 소프트웨어 재단이 무엇입니까?,일반적인 정보
@anchor{faq/general are-there-copyright-restrictions-on-the-use-of-python}@anchor{58ff}
@subsubsection 파이썬을 사용할 때 저작권 관련 제한이 있습니까?


본인이 생성한 파이썬에 대해 저작권을 명시하고, 이와 관련된 정보를 어떠한 형태로든 설명서에 표시하면 본인의 소스로 무엇이든 할 수 있습니다. 저작권 관련 규칙을 따르면 파이썬을 상업 목적으로 사용해도 괜찮으며, 소스코드나 (수정된 또는 수정되지 않은) 이진형태의 파이썬을 팔거나, 파이썬을 내장하는 상품을 팔아도 괜찮습니다. 그럼에도 저희는 파이썬이 사용된 모든 상업 활동을 알고 싶습니다.

PSF 라이선스에 관한 구체적인 설명과 원본은 라이선스 페이지@footnote{https://docs.python.org/3/license.html}에서 확인할 수 있습니다.

파이썬 로고는 상표로 등록되어 있으며, 일부 경우에는 사용하기 위한 허가가 필요합니다. 더 많은 정보를 원하시면 상표 사용 정책@footnote{https://www.python.org/psf/trademakrs/}을 참조하십시오.

@node 파이썬은 애초에 왜 만들어졌습니까?,파이썬의 강점은 무엇입니까?,파이썬을 사용할 때 저작권 관련 제한이 있습니까?,일반적인 정보
@anchor{faq/general why-was-python-created-in-the-first-place}@anchor{5900}
@subsubsection 파이썬은 애초에 왜 만들어졌습니까?


여기 Guido van Rossum 씨가 작성한 `굉장히' 요약된 파이썬의 탄생 계기입니다:

@quotation

저는 CWI(Centrum Wiskunde & Informatica)의 ABC 그룹에서 인터프리터 언어를 도입하며 광범위한 경험을 해봤고, 그 그룹과 일하며 언어의 디자인에 대해 많은 것을 배웠습니다. 들여쓰기로 문단 묶기나 매우-상위-레벨 자료형을 포함한 것과 같은 파이썬의 다양한 기능들이 이 당시 경험을 바탕으로 만들어졌습니다.

ABC 언어에 있어서 저는 불만도 있었지만, 마음에 드는 기능도 많았습니다. ABC 언어(그리고 언어의 이행과정)는 제 불만을 극복할 만큼 확장할 방법이 없었죠. –사실 확장성이 떨어지는 것이 이 언어의 가장 큰 문제점 중 하나였습니다. 저는 Modula-2+를 사용하는데 약간의 경험이 있었고 Modula-3의 디자이너 분들과 대화도 나눠보았으며 Modula-3 관련 레포트도 읽어본 상태였습니다. Modula-3은 예외에서 쓰인 문법과 의미론을 비롯한 일부 파이썬 기능들의 기원입니다.

저는 CWI에서 Amoeba 분산 운영체제 그룹에 속해 일하고 있었습니다. Amoeba는 Bourne 셸로는 쉽게 접근하지 못하는 고유의 시스템 호출 인터페이스를 내장하고 있었기 때문에 저희는 C 프로그램이나 Bourne 셸 스크립트를 작성하는 것이 아닌 더 좋은 시스템 관리 방법이 필요했습니다. Amoeba에서 에러 처리를 해본 경험 덕분에 저는 프로그래밍 언어의 기능에 있어서 예외의 중요성을 인지하고 있었습니다.

ABC의 문법을 지키면서 Amoeba 시스템 호출에 접근 가능한 스크립트 언어가 필요하다는 것을 깨달았죠. Amoeba 특유의 언어를 만드는 건 어리석은 행동이라고 느껴서 대체로 확장 가능한 언어가 필요한 상황이라고 판단했습니다.

1989년 크리스마스 연휴에 저는 많은 시간이 있었고, 그 참에 도전해보기로 했습니다. 다음 해에도 제 개인적인 시간을 투자하며 언어를 완성시켜 가는 와중에 Python은 Amoeba 프로젝트에서 날이 갈수록 성공적으로 사용되고 있었습니다. 그리고 제 동료들의 피드백을 통해 저는 초기 개선사항들을 추가할 수 있었죠.

1991년 2월, 1년이 조금 넘는 개발 기간 후, 저는 USENET에 올리기로 했습니다. 나머지는 @code{Misc/HSTORY} 파일에 있습니다.
@end quotation

@node 파이썬의 강점은 무엇입니까?,파이썬 버전 관리 규칙은 무엇입니까?,파이썬은 애초에 왜 만들어졌습니까?,일반적인 정보
@anchor{faq/general what-is-python-good-for}@anchor{5901}
@subsubsection 파이썬의 강점은 무엇입니까?


파이썬은 다양한 상황에 적용 가능한, 범용성 있는 고급언어입니다.

언어와 함께 오는 표준 라이브러리는 문자열 처리 (정규 표현식, 유니코드, 파일 간의 차이 계산), 인터넷 프로토콜 (HTTP, FTP, SMTP, XML-RPC, POP, IMAP), 소프트웨어 공학 (유닛 테스트, 로깅, 프로파일링, 파이썬 코드 파싱), 그리고 운영체제 인터페이스 (시스템콜, 파일 시스템, TCP/IP 소켓) 등 넓은 영역을 아우릅니다. 구체적인 목차를 보고싶다면 @ref{149,,파이썬 표준 라이브러리}을 확인하십시오. 다양한 제삼자 확장도 가능합니다. 파이썬 패키지 인덱스@footnote{https://pypi.org}에서 당신이 필요한 패키지를 찾을 수 있습니다.

@node 파이썬 버전 관리 규칙은 무엇입니까?,파이썬 소스를 어떻게 얻을 수 있습니까?,파이썬의 강점은 무엇입니까?,일반적인 정보
@anchor{faq/general faq-version-numbering-scheme}@anchor{5902}@anchor{faq/general how-does-the-python-version-numbering-scheme-work}@anchor{5903}
@subsubsection 파이썬 버전 관리 규칙은 무엇입니까?


Python versions are numbered “A.B.C” or “A.B”:


@itemize *

@item 
`A' is the major version number – it is only incremented for really major
changes in the language.

@item 
`B' is the minor version number – it is incremented for less earth-shattering
changes.

@item 
`C' is the micro version number – it is incremented for each bugfix release.
@end itemize

모든 배포판이 버그 수정 배포판은 아닙니다. 새로운 기능 배포판을 만드는 과정에서 알파, 베타, 또는 배포판 후보라 불리는 개발 배포판이 만들어집니다. 알파버전은 이른 배포판으로, 인터페이스들이 확정되지 않은 배포이므로 두 알파버전 사이에 인터페이스의 변경이 생기곤 합니다. 베타버전은 더 안정적이며 기존의 인터페이스는 유지하지만 새로운 모듈을 추가할 수 있고, 배포판 후보들은 치명적인 버그 수정 외에는 변경사항을 포함하지 않습니다.

Alpha, beta and release candidate versions have an additional suffix:


@itemize *

@item 
The suffix for an alpha version is “aN” for some small number `N'.

@item 
The suffix for a beta version is “bN” for some small number `N'.

@item 
The suffix for a release candidate version is “rcN” for some small number `N'.
@end itemize

In other words, all versions labeled `2.0aN' precede the versions labeled
`2.0bN', which precede versions labeled `2.0rcN', and `those' precede 2.0.

또한 “+” 접미사가 붙은 버전을 마주할 수도 있습니다.  예) “2.2+”. 이는 CPython 개발 저장소에서 바로 빌드된, 배포되지 않은 버전입니다. 실제는 이 버전의 최종 소규모 배포가 이루어질 때 다음 소규모 버전으로 증가하여 “a0” 버전이 됩니다. 예) “2.4a0”.

See the Developer's Guide@footnote{https://devguide.python.org/developer-workflow/development-cycle/}
for more information about the development cycle, and
@geindex Python 향상 제안; PEP 387
PEP 387@footnote{https://peps.python.org/pep-0387/} to learn more about Python’s backward compatibility policy.  See also
the documentation for @ref{49d,,sys.version}, @ref{495f,,sys.hexversion}, and
@ref{8ae,,sys.version_info}.

@node 파이썬 소스를 어떻게 얻을 수 있습니까?,파이썬 설명 문서는 어떻게 구합니까?,파이썬 버전 관리 규칙은 무엇입니까?,일반적인 정보
@anchor{faq/general how-do-i-obtain-a-copy-of-the-python-source}@anchor{5904}
@subsubsection 파이썬 소스를 어떻게 얻을 수 있습니까?


최신 파이썬 소스는 python.org 또는 @indicateurl{https://www.python.org/downloads/} 에서 항상 구할 수 있고, 최신 개발 소스는 @indicateurl{https://github.com/python/cpython/} 에서 구할 수 있습니다.

소스 배포판은 모든 C 언어 코드, 스핑크스 형식의 문서, 파이썬 라이브러리 모듈, 예제 프로그램들, 그리고 일부 유용한 무료 배포 소프트웨어를 포함합니다. 소스는 대부분의 유닉스 플랫폼에서 추가 설정 없이 컴파일되고 실행 가능합니다.

소스 코드를 받고 컴파일하는 부분에서 추가 정보를 원하시면 파이썬 개발자 가이드의 개요@footnote{https://devguide.python.org/setup/}를 참고하십시오.

@node 파이썬 설명 문서는 어떻게 구합니까?,저는 프로그래밍을 해본 적이 없습니다 파이썬 튜토리얼이 있습니까?,파이썬 소스를 어떻게 얻을 수 있습니까?,일반적인 정보
@anchor{faq/general how-do-i-get-documentation-on-python}@anchor{5905}
@subsubsection 파이썬 설명 문서는 어떻게 구합니까?


The standard documentation for the current stable version of Python is available
at @indicateurl{https://docs.python.org/3/}.  EPUB, plain text, and downloadable HTML versions are
also available at @indicateurl{https://docs.python.org/3/download.html}.

문서는 reStructuredText로 쓰여졌으며 스핑크스 문서화 툴@footnote{https://www.sphinx-doc.org/}로 프로세스되어 있습니다. 문서의 reStructuredText 소스는파이썬 배포 소스의 일부입니다.

@node 저는 프로그래밍을 해본 적이 없습니다 파이썬 튜토리얼이 있습니까?,파이썬에 특화된 뉴스 그룹이나 메일링 리스트가 있습니까?,파이썬 설명 문서는 어떻게 구합니까?,일반적인 정보
@anchor{faq/general i-ve-never-programmed-before-is-there-a-python-tutorial}@anchor{5906}
@subsubsection 저는 프로그래밍을 해본 적이 없습니다. 파이썬 튜토리얼이 있습니까?


다양한 튜토리얼과 책이 존재합니다. 표준 문서로는 @ref{1fb8,,파이썬 자습서}가 있습니다.

초보자 가이드@footnote{https://wiki.python.org/moin/BeginnersGuide}에서 튜토리얼 목록과 같은 초보 파이썬 개발자를 위한 정보를 확인하십시오.

@node 파이썬에 특화된 뉴스 그룹이나 메일링 리스트가 있습니까?,파이썬 베타 테스트 버전은 어떻게 구합니까?,저는 프로그래밍을 해본 적이 없습니다 파이썬 튜토리얼이 있습니까?,일반적인 정보
@anchor{faq/general is-there-a-newsgroup-or-mailing-list-devoted-to-python}@anchor{5907}
@subsubsection 파이썬에 특화된 뉴스 그룹이나 메일링 리스트가 있습니까?


뉴스 그룹은 @code{comp.lang.python}, 그리고 메일링 리스트는 python-list@footnote{https://mail.python.org/mailman/listinfo/python-list}에서 확인 할 수 있습니다. 뉴스 그룹과 메일링 리스트는 서로 연동되어 있어서 뉴스를 읽는다면 메일을 구독할 필요가 없습니다. @code{comp.lang.python}은 활발하고 하루에도 수백 개의 포스팅이 올라오기 때문에 Usenet 독자들은 이 매체를 통해 더 원활하게 소통할 수 있을 것입니다.

새로운 소프트웨어의 배포와 이벤트에 관련된 공지는 하루 다섯 개 정도의 포스팅이 올라오는 comp.lang.python.announce 에서 확인할 수 있습니다. 이는 the python-announce mailing list@footnote{https://mail.python.org/mailman3/lists/python-announce-list.python.org/}라는 메일링 리스트에서도 얻을 수 있습니다.

@indicateurl{https://www.python.org/community/lists/} 에서 다른 메일링 리스트와 뉴스 그룹에 대한 정보를 확인할 수 있습니다.

@node 파이썬 베타 테스트 버전은 어떻게 구합니까?,파이썬 버그 리포트나 패치는 어떻게 제출합니까?,파이썬에 특화된 뉴스 그룹이나 메일링 리스트가 있습니까?,일반적인 정보
@anchor{faq/general how-do-i-get-a-beta-test-version-of-python}@anchor{5908}
@subsubsection 파이썬 베타 테스트 버전은 어떻게 구합니까?


알파와 베타 배포판은 @indicateurl{https://www.python.org/downloads/} 에서 확인할 수 있습니다. 모든 배포는 comp.lang.python 과 comp.lang.python.announce 뉴스그룹, 그리고 파이썬 홈페이지 @indicateurl{https://www.python.org/} 에서 공지됩니다. 뉴스의 RSS 피드가 제공됩니다.

Git을 통해 파이썬의 개발 버전을 사용할 수 있습니다. 파이썬 개발자 가이드@footnote{https://devguide.python.org/}를 확인하십시오.

@node 파이썬 버그 리포트나 패치는 어떻게 제출합니까?,제가 참고할만한 파이썬 관련 기사가 있습니까?,파이썬 베타 테스트 버전은 어떻게 구합니까?,일반적인 정보
@anchor{faq/general how-do-i-submit-bug-reports-and-patches-for-python}@anchor{5909}
@subsubsection 파이썬 버그 리포트나 패치는 어떻게 제출합니까?


버그 리포트나 패치 제출은 @indicateurl{https://github.com/python/cpython/issues} 의 문제 추적기를 사용하십시오.

파이썬이 어떻게 개발되는지 더 알고 싶으시다면 파이썬 개발자 가이드@footnote{https://devguide.python.org/}를 참조하십시오.

@node 제가 참고할만한 파이썬 관련 기사가 있습니까?,파이썬 관련 책이 있습니까?,파이썬 버그 리포트나 패치는 어떻게 제출합니까?,일반적인 정보
@anchor{faq/general are-there-any-published-articles-about-python-that-i-can-reference}@anchor{590a}
@subsubsection 제가 참고할만한 파이썬 관련 기사가 있습니까?


당신이 가장 좋아하는 파이썬 책을 인용하는 것이 제일 좋을 것 같습니다.

파이썬에 관련된 최초의 기사@footnote{https://ir.cwi.nl/pub/18204}는 1991년에 작성되어서 이제는 구식입니다.

@quotation

Guido van Rossum and Jelke de Boer, “Interactively Testing Remote Servers Using the Python Programming Language”, CWI Quearterly, Volume 4, Issue 4 (December 1991), Amsterdam, pp 283–303.
@end quotation

@node 파이썬 관련 책이 있습니까?,도대체 www python org는 어디에 있는 겁니까?,제가 참고할만한 파이썬 관련 기사가 있습니까?,일반적인 정보
@anchor{faq/general are-there-any-books-on-python}@anchor{590b}
@subsubsection 파이썬 관련 책이 있습니까?


예, 많이 있고 현재 출판되는 책들도 있습니다. 리스트를 원한다면 @indicateurl{https://wiki.python.org/moin/PythonBooks} 에서 파이썬 위키를 확인하십시오.

아니면 온라인 서점에서 “파이썬”을 검색하고 몬티 파이썬 관련 항목을 필터링해도 괜찮습니다; 검색할 때 “파이썬”과 “언어”를 검색해도 좋습니다.

@node 도대체 www python org는 어디에 있는 겁니까?,왜 이 언어는 파이썬이라 불립니까?,파이썬 관련 책이 있습니까?,일반적인 정보
@anchor{faq/general where-in-the-world-is-www-python-org-located}@anchor{590c}
@subsubsection 도대체 www.python.org는 어디에 있는 겁니까?


파이썬 프로젝트의 기반 시설은 전 세계 각지에 존재하며 Python Infrastructure Team에 의해 관리되고 있습니다. 추가 정보는 여기@footnote{https://infra.psf.io}있습니다.

@node 왜 이 언어는 파이썬이라 불립니까?,“몬티 파이튼의 플라잉 서커스”를 좋아해야합니까?,도대체 www python org는 어디에 있는 겁니까?,일반적인 정보
@anchor{faq/general why-is-it-called-python}@anchor{590d}
@subsubsection 왜 이 언어는 파이썬이라 불립니까?


Guido van Rossum 씨가 파이썬을 구현할 당시 그는 1970년대에 BBC에서 방영된 코미디 시리즈인 "몬티 파이튼의 플라잉 서커스"@footnote{https://ko.wikipedia.org/wiki/몬티_파이튼}대본을 읽고 있었습니다. 판 로쉼은 자신이 만든 언어가 짧고 독창적이면서도 약간 신비한 느낌의 이름이 필요하다고 생각했기에 언어를 파이썬이라고 부르기로 결정했습니다.

@node “몬티 파이튼의 플라잉 서커스”를 좋아해야합니까?,,왜 이 언어는 파이썬이라 불립니까?,일반적인 정보
@anchor{faq/general do-i-have-to-like-monty-python-s-flying-circus}@anchor{590e}
@subsubsection “몬티 파이튼의 플라잉 서커스”를 좋아해야합니까?


아니요, 하지만 도움은 됩니다. :)

@node 현실 속의 파이썬,,일반적인 정보,일반적인 파이썬 FAQ
@anchor{faq/general python-in-the-real-world}@anchor{590f}
@subsection 현실 속의 파이썬


@menu
* 파이썬은 어느 정도 안정화 되어있습니까?:: 
* 얼마나 많은 사람이 파이썬을 씁니까?:: 
* 파이썬으로 진행된 중요한 프로젝트가 존재합니까?:: 
* 파이썬에 어떤 새로운 개발요소들이 예정되어 있습니까?:: 
* 기존의 파이썬과 호환 가능하지 않은 변경안을 제시해도 괜찮습니까?:: 
* 파이썬이 초보 프로그래머들에게 좋은 언어입니까?:: 

@end menu

@node 파이썬은 어느 정도 안정화 되어있습니까?,얼마나 많은 사람이 파이썬을 씁니까?,,현실 속의 파이썬
@anchor{faq/general how-stable-is-python}@anchor{5910}
@subsubsection 파이썬은 어느 정도 안정화 되어있습니까?


굉장히 안정적입니다. 새롭고 안정적인 배포판을 1991년부터 대략 6개월에서 18개월 사이에 계속해서 출시하고 있고, 이는 앞으로도 계속될 것 같습니다. 버전 3.9부터, 파이썬은 12개월마다 새로운 기능 배포판을 제공합니다 (
@geindex Python 향상 제안; PEP 602
PEP 602@footnote{https://peps.python.org/pep-0602/}).

개발자분들이 옛 버전의 버그 수정 배포판들을 공개하기 때문에 기존에 배포된 버전의 안정성은 서서히 증가합니다. 버그 수정 배포판은 버전의 세 번쨰숫자로 표시하며 (예: 3.5.3, 3.6.2), 안정성을 위해 관리됩니다. 버그 수정 배포판은 현재까지 알려진 버그만을 수정하며, 인터페이스는 절대 변하지 않습니다.

최신 안정적인 배포판은 파이썬 다운로드 페이지@footnote{https://www.python.org/downloads/}에서 확인할 수 있습니다. 파이썬 3.x 가 권장 버전이고 광범위하게 사용되는 대부분의 라이브러리가 지원합니다. 파이썬 2.x 는 
@geindex Python 향상 제안; PEP 373
더는 유지 보수되지 않습니다@footnote{https://peps.python.org/pep-0373/}.

@node 얼마나 많은 사람이 파이썬을 씁니까?,파이썬으로 진행된 중요한 프로젝트가 존재합니까?,파이썬은 어느 정도 안정화 되어있습니까?,현실 속의 파이썬
@anchor{faq/general how-many-people-are-using-python}@anchor{5911}
@subsubsection 얼마나 많은 사람이 파이썬을 씁니까?


아마 수백만의 사용자가 있을 텐데, 정확한 수를 얻기는 힘듭니다.

파이썬은 무료로 다운로드받을 수 있기 때문에 판매액이 없습니다. 그리고 파이썬은 다양한 사이트에서, 다양한 리눅스 배포판과 패키지로 제공되므로 다운로드 통계치 역시 모든 것을 알려주지 못합니다.

활발하게 활동하는 comp.lang.python이라는 뉴스그룹이 있지만 모든 파이썬 유저들이 그곳에 글을 올리지 않으며 심지어 읽는 것도 아닙니다.

@node 파이썬으로 진행된 중요한 프로젝트가 존재합니까?,파이썬에 어떤 새로운 개발요소들이 예정되어 있습니까?,얼마나 많은 사람이 파이썬을 씁니까?,현실 속의 파이썬
@anchor{faq/general have-any-significant-projects-been-done-in-python}@anchor{5912}
@subsubsection 파이썬으로 진행된 중요한 프로젝트가 존재합니까?


@indicateurl{https://www.python.org/about/success} 에서 파이썬을 사용한 프로젝트를 확인할 수 있습니다. 과거 파이썬 회의들@footnote{https://www.python.org/community/workshops/}을 통해 파이썬의 성장에 기여한 다양한 기업들과 단체들을 확인할 수 있습니다.

세간의 이목을 끈 프로젝트로는 Mailman 메일링 리스트 매니저@footnote{https://www.list.org}와 Zope 애플리케이션 서버@footnote{https://www.zope.dev}가 있습니다. 레드햇@footnote{https://www.redhat.com}으로 대표되는 리눅스 배포판들은 시스템 관리 소프트웨어와 설치 프로그램의 일부 또는 전부를 파이썬으로 만들었습니다. 구글, 야휴, 그리고 루카스필름과 같은 회사들이 사내 개발 환경에서 파이썬을 사용합니다.

@node 파이썬에 어떤 새로운 개발요소들이 예정되어 있습니까?,기존의 파이썬과 호환 가능하지 않은 변경안을 제시해도 괜찮습니까?,파이썬으로 진행된 중요한 프로젝트가 존재합니까?,현실 속의 파이썬
@anchor{faq/general what-new-developments-are-expected-for-python-in-the-future}@anchor{5913}
@subsubsection 파이썬에 어떤 새로운 개발요소들이 예정되어 있습니까?


@indicateurl{https://peps.python.org/} 에서 Python Enhancement Proposals (PEPs) 를 확인하십시오. PEPs 는 파이썬의 새로운 기능을 제안하는 디자인 문서로, 간결한 기술 사양과 제안 이유를 적는 곳입니다. “Python X.Y Release Schedule”이라고 적힌 PEP를 확인하시면 됩니다. X.Y 는 아직 배포되지 않은 버전을 의미합니다.

신규 개발요소들은 python-dev 메일링 리스트@footnote{https://mail.python.org/mailman3/lists/python-dev.python.org/}에서 논의되고 있습니다.

@node 기존의 파이썬과 호환 가능하지 않은 변경안을 제시해도 괜찮습니까?,파이썬이 초보 프로그래머들에게 좋은 언어입니까?,파이썬에 어떤 새로운 개발요소들이 예정되어 있습니까?,현실 속의 파이썬
@anchor{faq/general is-it-reasonable-to-propose-incompatible-changes-to-python}@anchor{5914}
@subsubsection 기존의 파이썬과 호환 가능하지 않은 변경안을 제시해도 괜찮습니까?


일반적으로, 아니요. 현재 전 세계에 수 없이 많은 파이썬 코드들이 작성되어 있으며, 이미 존재하는 프로그램의 아주 작은 부분이라도 무효화한다면 그 변경안은 눈살을 찌푸리고 봐야합니다. 당신이 변환 프로그램을 제공한다고 해도 설명서를 전부 업데이트 해야하는 문제가 남아있습니다. 뿐만 아니라 수 많은 책들이 파이썬에 관련해서 쓰여져 있는데, 저희는 한 순간에 그 모든 책들을 무효화 시키고 싶지 않습니다.

만약 기능이 바뀌어야 한다면 점차적인 업그레이드 방안의 제시를 필요로 합니다. 
@geindex Python 향상 제안; PEP 5
PEP 5@footnote{https://peps.python.org/pep-0005/}에서 하위호환 불가능한 변경을 도입할 때 사용자의 불편함을 최소화 하는 절차를 확인할 수 있습니다.

@node 파이썬이 초보 프로그래머들에게 좋은 언어입니까?,,기존의 파이썬과 호환 가능하지 않은 변경안을 제시해도 괜찮습니까?,현실 속의 파이썬
@anchor{faq/general is-python-a-good-language-for-beginning-programmers}@anchor{5915}
@subsubsection 파이썬이 초보 프로그래머들에게 좋은 언어입니까?


예.

파스칼, C, 또는 C++나 Java의 일부처럼 절차적이고 정적인 언어를 학생들의 첫 언어로 가르치는 것은 아직 흔한 교육 방식입니다. 하지만 그들이 파이썬을 첫 언어로 배우는 것이 더 이로울 수도 있습니다. 파이썬은 굉장히 간단하면서도 일관된 문법과 방대한 표준 라이브러리를 가지고 있으며, 무엇보다 초기 프로그래밍 교육에서 파이썬을 이용하면 학생들이 자료형 디자인, 그리고 문제 분석과 같은 중요한 프로그래밍 능력에 집중할 수 있도록 해줍니다. 학생들은 파이썬을 통해 반복문과 절차 같은 기초적인 콘셉트를 빠르게 접할 수 있습니다. 더 나아가 그들은 첫 강의에서 사용자 정의 객체를 활용하여 작업을 할 수도 있을 것입니다.

프로그래밍을 한 번도 해본 적이 없는 학생이라면 정적인 프로그래밍 언어를 사용하는 것은 자연스럽게 느껴지지 않을 것입니다. 그 과정을 해결하기 위해서는 부가적인 요소를 익혀야하며, 이는 강의 속도를 낮춥니다. 학생들은 컴퓨터처럼 사고하는 방식, 문제를 분석하는 방법, 일정한 인터페이스를 디자인하는 방법, 그리고 정보를 캡슐화하는 것을 배우려 합니다. 장기적으로 본다면 정적인 언어를 배우는 것이 중요할 수도 있지만, 학생들의 첫 프로그래밍 언어로 보았을 때는 좋다고 볼 수 없습니다.

파이썬이 첫 개발 언어로 좋은 이유로 다양한 요소들을 뽑습니다. 파이썬은 자바처럼 방대한 표준 라이브러리를 가지고 있어서 학생들이 수업의 극 초반에 `뭔가 진짜 하는' 프로그래밍 프로젝트를 경험할 수 있습니다. 네 개의 함수로 만들어보는 계산기나 가계부 프로그램이 과제의 전부가 아닙니다. 표준 라이브러리를 사용하므로써 학생들은 프로그래밍의 기본을 배우며 그럴싸한 애플리케이션을 만들어 볼 수 있습니다. 표준 라이브러리를 사용하면서 학생들에게 코드의 재활용 역시 가르쳐 줄 수 있습니다. 뿐만 아니라 PyGame 같은 제삼자 모듈 역시 학생들의 시야를 넓히는데 도움이 됩니다.

파이썬의 상호작용 가능한 인터프리터는 학생들이 코딩하며 언어의 기능을 테스트해 볼 수 있게 해줍니다. 학생들은 하나의 창에서 코드를 수정하며 다른 창에서 인터프리터를 돌려볼 수 있습니다. 만약 그들이 리스트에 대한 메서드가 기억나지 않는다면, 이와 같은 시도를 해볼 수 있습니다:

@example
>>> L = []
>>> dir(L)
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__',
'__dir__', '__doc__', '__eq__', '__format__', '__ge__',
'__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__',
'__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__',
'__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__',
'__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__',
'__sizeof__', '__str__', '__subclasshook__', 'append', 'clear',
'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove',
'reverse', 'sort']
>>> [d for d in dir(L) if '__' not in d]
['append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']

>>> help(L.append)
Help on built-in function append:

append(...)
    L.append(object) -> None -- append object to end

>>> L.append(1)
>>> L
[1]
@end example

인터프리터가 있다면, 학생들이 코딩하면서 설명서를 열람하기 쉽습니다.

파이썬을 위한 좋은 IDE들이 있습니다. IDLE은 Tkinter를 사용하여 파이썬으로 만들어진, 파이썬을 위한 크로스-플랫폼 IDE입니다. Emacs 유저들은 Emacs에 굉장히 좋은 파이썬 모드가 있다는 사실을 알게 되면 기뻐할 것입니다. 이 모든 개발 환경이 구문 강조, 자동 들여쓰기, 그리고 코딩하면서 상호작용이 가능한 인터프리터를 지원합니다. 파이썬 개발 환경의 전체 리스트는 파이썬 위키@footnote{https://wiki.python.org/moin/PythonEditors}를 참조하십시오.

만약 파이썬이 교육 분야에서 어떻게 사용되는지에 대해 논의하고 싶으시면 the edu-sig mailing list@footnote{https://www.python.org/community/sigs/current/edu-sig}에 들어와 주십시오.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 프로그래밍 FAQ,설계와 역사 FAQ,일반적인 파이썬 FAQ,파이썬 자주 나오는 질문들
@anchor{faq/programming doc}@anchor{5916}@anchor{faq/programming programming-faq}@anchor{5917}@anchor{faq/programming translation-repo}@anchor{5918}
@section 프로그래밍 FAQ



@menu
* General questions:: 
* Core language:: 
* 숫자와 문자열:: 
* 성능: 성능<3>. 
* Sequences (tuples/lists): Sequences tuples/lists. 
* 객체:: 
* 모듈: 모듈<3>. 

@end menu

@node General questions,Core language,,프로그래밍 FAQ
@anchor{faq/programming general-questions}@anchor{5919}
@subsection General questions


@menu
* Is there a source code-level debugger with breakpoints and single-stepping?:: 
* 버그를 찾거나 정적 분석을 수행하는 데 도움이 되는 도구가 있습니까?:: 
* 파이썬 스크립트로 독립 실행형 바이너리를 만들려면 어떻게 해야 합니까?:: 
* 파이썬 프로그램을 위한 코딩 표준이나 스타일 지침서가 있습니까?:: 

@end menu

@node Is there a source code-level debugger with breakpoints and single-stepping?,버그를 찾거나 정적 분석을 수행하는 데 도움이 되는 도구가 있습니까?,,General questions
@anchor{faq/programming is-there-a-source-code-level-debugger-with-breakpoints-and-single-stepping}@anchor{591a}
@subsubsection Is there a source code-level debugger with breakpoints and single-stepping?


예.

파이썬을 위한 여러 디버거가 아래에 설명되어 있으며, 내장 함수 @ref{271,,breakpoint()}를 사용하면 이들 중 하나로 들어갈 수 있습니다.

pdb 모듈은 간단하지만 적절한 파이썬 용 콘솔 모드 디버거입니다. 표준 파이썬 라이브러리의 일부이며, @ref{aa,,라이브러리 레퍼런스 매뉴얼에서 설명}하고 있습니다. pdb의 코드를 예로 사용하여 자체 디버거를 작성할 수도 있습니다.

The IDLE interactive development environment, which is part of the standard
Python distribution (normally available as @ref{77,,idlelib}),
includes a graphical debugger.

PythonWin is a Python IDE that includes a GUI debugger based on pdb.  The
PythonWin debugger colors breakpoints and has quite a few cool features such as
debugging non-PythonWin programs.  PythonWin is available as part of
pywin32@footnote{https://github.com/mhammond/pywin32} project and
as a part of the
ActivePython@footnote{https://www.activestate.com/products/python/} distribution.

Eric@footnote{https://eric-ide.python-projects.org/} is an IDE built on PyQt
and the Scintilla editing component.

trepan3k@footnote{https://github.com/rocky/python3-trepan/} is a gdb-like debugger.

Visual Studio Code@footnote{https://code.visualstudio.com/} is an IDE with debugging
tools that integrates with version-control software.

그래픽 디버거를 포함하는 많은 상용 파이썬 IDE가 있습니다. 다음을 포함합니다:


@itemize *

@item 
Wing IDE@footnote{https://wingware.com/}

@item 
PyCharm@footnote{https://www.jetbrains.com/pycharm/}
@end itemize

@node 버그를 찾거나 정적 분석을 수행하는 데 도움이 되는 도구가 있습니까?,파이썬 스크립트로 독립 실행형 바이너리를 만들려면 어떻게 해야 합니까?,Is there a source code-level debugger with breakpoints and single-stepping?,General questions
@anchor{faq/programming are-there-tools-to-help-find-bugs-or-perform-static-analysis}@anchor{591b}
@subsubsection 버그를 찾거나 정적 분석을 수행하는 데 도움이 되는 도구가 있습니까?


예.

Ruff@footnote{https://docs.astral.sh/ruff/},
Pylint@footnote{https://pylint.readthedocs.io/} and
Pyflakes@footnote{https://github.com/PyCQA/pyflakes} do basic checking that will
help you catch bugs sooner.

Static type checkers such as mypy@footnote{https://mypy-lang.org/},
ty@footnote{https://docs.astral.sh/ty/},
Pyrefly@footnote{https://pyrefly.org/}, and
pytype@footnote{https://github.com/google/pytype} can check type hints in Python
source code.

@node 파이썬 스크립트로 독립 실행형 바이너리를 만들려면 어떻게 해야 합니까?,파이썬 프로그램을 위한 코딩 표준이나 스타일 지침서가 있습니까?,버그를 찾거나 정적 분석을 수행하는 데 도움이 되는 도구가 있습니까?,General questions
@anchor{faq/programming faq-create-standalone-binary}@anchor{591c}@anchor{faq/programming how-can-i-create-a-stand-alone-binary-from-a-python-script}@anchor{591d}
@subsubsection 파이썬 스크립트로 독립 실행형 바이너리를 만들려면 어떻게 해야 합니까?


사용자가 파이썬 배포를 먼저 설치하지 않고도 다운로드하여 실행할 수 있는 독립 실행형 프로그램을 원하는 것이 전부라면 파이썬을 C 코드로 컴파일하는 기능이 필요하지는 않습니다. 프로그램에 필요한 모듈 집합을 파악하고 이러한 모듈들을 파이썬 바이너리와 결합하여 단일 실행 파일을 생성하는 많은 도구가 있습니다.

One is to use the freeze tool, which is included in the Python source tree as
Tools/freeze@footnote{https://github.com/python/cpython/tree/3.14/Tools/freeze}.
It converts Python byte code to C arrays; with a C compiler you can
embed all your modules into a new program, which is then linked with the
standard Python modules.

소스를 재귀적으로 검색하여 import 문(두 형식 모두)을 찾고 표준 파이썬 경로뿐만 아니라 소스 디렉터리에서 모듈을 찾습니다 (내장할 모듈을 위해). 그런 다음 파이썬으로 작성된 모듈의 바이트 코드를 C 코드 (marshal 모듈을 사용하여 코드 객체로 변환할 수 있는 배열 초기화기)로 바꾸고 프로그램에서 실제로 사용되는 내장 모듈만 포함하는 특별한 구성 파일을 만듭니다. 그런 다음 생성된 C 코드를 컴파일하고 이를 나머지 파이썬 인터프리터와 링크하여 스크립트와 똑같게 작동하는 자체 포함 바이너리를 형성합니다.

The following packages can help with the creation of console and GUI
executables:


@itemize *

@item 
Nuitka@footnote{https://nuitka.net/} (Cross-platform)

@item 
PyInstaller@footnote{https://pyinstaller.org/} (Cross-platform)

@item 
PyOxidizer@footnote{https://pyoxidizer.readthedocs.io/en/stable/} (Cross-platform)

@item 
cx_Freeze@footnote{https://marcelotduarte.github.io/cx_Freeze/} (Cross-platform)

@item 
py2app@footnote{https://github.com/ronaldoussoren/py2app} (macOS only)

@item 
py2exe@footnote{https://www.py2exe.org/} (Windows only)
@end itemize

@node 파이썬 프로그램을 위한 코딩 표준이나 스타일 지침서가 있습니까?,,파이썬 스크립트로 독립 실행형 바이너리를 만들려면 어떻게 해야 합니까?,General questions
@anchor{faq/programming are-there-coding-standards-or-a-style-guide-for-python-programs}@anchor{591e}
@subsubsection 파이썬 프로그램을 위한 코딩 표준이나 스타일 지침서가 있습니까?


예. 표준 라이브러리 모듈에 요구되는 코딩 스타일은 
@geindex Python 향상 제안; PEP 8
PEP 8@footnote{https://peps.python.org/pep-0008/}에서 설명합니다.

@node Core language,숫자와 문자열,General questions,프로그래밍 FAQ
@anchor{faq/programming core-language}@anchor{591f}
@subsection Core language


@menu
* 변수에 값이 있을 때 UnboundLocalError 가 발생하는 이유는 무엇입니까?:: 
* 파이썬에서 지역과 전역 변수에 대한 규칙은 무엇입니까?:: 
* 다른 값으로 루프에서 정의된 람다는 왜 모두 같은 결과를 반환합니까?:: 
* 모듈 간에 전역 변수를 공유하려면 어떻게 해야 합니까?:: 
* 모듈에서 임포트를 사용하는 “모범 사례”는 무엇입니까?:: 
* 객체 간에 기본값이 공유되는 이유는 무엇입니까?:: 
* 한 함수에서 다른 함수로 선택적이나 키워드 매개변수를 전달하려면 어떻게 해야 합니까?:: 
* 인자와 매개변수의 차이점은 무엇입니까?:: 
* 리스트 ‘y’를 변경할 때 리스트 ‘x’도 변경되는 이유는 무엇입니까?:: 
* 출력 매개변수가 있는 함수를 작성하려면 어떻게 해야 합니까 (참조에 의한 호출)?: 출력 매개변수가 있는 함수를 작성하려면 어떻게 해야 합니까 참조에 의한 호출 ?. 
* 파이썬에서 고차 함수(higher order function)를 어떻게 만드나요?: 파이썬에서 고차 함수 higher order function 를 어떻게 만드나요?. 
* 파이썬에서 객체를 어떻게 복사합니까?:: 
* 객체의 메서드나 어트리뷰트를 어떻게 찾을 수 있습니까?:: 
* 코드에서 객체 이름을 어떻게 찾을 수 있습니까?:: 
* 쉼표 연산자의 우선순위는 어떻게 되나요?:: 
* C의 “?;” 삼항 연산자와 동등한 것이 있습니까?: C의 “? ” 삼항 연산자와 동등한 것이 있습니까?. 
* 파이썬에서 난독화된 한 줄 코드를 작성할 수 있습니까?:: 
* 함수의 매개변수 목록에서 슬래시(/)는 무엇을 의미합니까?: 함수의 매개변수 목록에서 슬래시 / 는 무엇을 의미합니까?. 

@end menu

@node 변수에 값이 있을 때 UnboundLocalError 가 발생하는 이유는 무엇입니까?,파이썬에서 지역과 전역 변수에 대한 규칙은 무엇입니까?,,Core language
@anchor{faq/programming faq-unboundlocalerror}@anchor{242c}@anchor{faq/programming why-am-i-getting-an-unboundlocalerror-when-the-variable-has-a-value}@anchor{5920}
@subsubsection 변수에 값이 있을 때 UnboundLocalError 가 발생하는 이유는 무엇입니까?


It can be a surprise to get the @ref{173b,,UnboundLocalError} in previously working
code when it is modified by adding an assignment statement somewhere in
the body of a function.

이 코드는:

@example
>>> x = 10
>>> def bar():
...     print(x)
...
>>> bar()
10
@end example

작동하지만, 이 코드는:

@example
>>> x = 10
>>> def foo():
...     print(x)
...     x += 1
@end example

results in an @code{UnboundLocalError}:

@example
>>> foo()
Traceback (most recent call last):
  ...
UnboundLocalError: cannot access local variable 'x' where it is not associated with a value
@end example

이는 스코프에서 변수에 대입할 때, 해당 변수가 그 스코프에 대해 지역(local)이 되고 외부 스코프에서 비슷한 이름의 변수를 가리기 때문입니다. foo의 마지막 문장은 @code{x}에 새 값을 대입하므로, 컴파일러는 이 값을 지역 변수로 인식합니다. 결과적으로 앞의 @code{print(x)}가 초기화되지 않은 지역 변수를 인쇄하려고 할 때 에러가 발생합니다.

위의 예에서 변수를 전역(global)으로 선언하여 외부 스코프 변수에 액세스 할 수 있습니다:

@example
>>> x = 10
>>> def foobar():
...     global x
...     print(x)
...     x += 1
...
>>> foobar()
10
@end example

이 명시적 선언은 (클래스와 인스턴스 변수의 표면적으로 유사한 상황과 달리) 실제로 외부 스코프에 있는 변수의 값을 수정하고 있음을 상기시키기 위해 필요합니다:

@example
>>> print(x)
11
@end example

@ref{14ac,,nonlocal} 키워드를 사용하여 중첩된 스코프에서 비슷한 일을 할 수 있습니다:

@example
>>> def foo():
...    x = 10
...    def bar():
...        nonlocal x
...        print(x)
...        x += 1
...    bar()
...    print(x)
...
>>> foo()
10
11
@end example

@node 파이썬에서 지역과 전역 변수에 대한 규칙은 무엇입니까?,다른 값으로 루프에서 정의된 람다는 왜 모두 같은 결과를 반환합니까?,변수에 값이 있을 때 UnboundLocalError 가 발생하는 이유는 무엇입니까?,Core language
@anchor{faq/programming what-are-the-rules-for-local-and-global-variables-in-python}@anchor{5921}
@subsubsection 파이썬에서 지역과 전역 변수에 대한 규칙은 무엇입니까?


파이썬에서, 함수 내에서 참조되기만 하는 변수는 묵시적으로 전역입니다. 변수가 함수 본문 내 어디에서건 값을 대입하면, 명시적으로 전역으로 선언되지 않는 한 지역으로 간주합니다.

처음에는 조금 의외지만, 잠시 생각해보면 이해가 됩니다. 한편으로, 대입된 변수에 @ref{4ad,,global}을 요구하면 의도하지 않은 부작용에 대한 저지선을 제공합니다. 반면에, 모든 전역 참조에 @code{global}이 요구된다면, 항상 @code{global}을 사용하게 됩니다. 내장 함수나 임포트 한 모듈의 구성 요소에 대한 모든 참조를 전역으로 선언해야 합니다. 이 혼란은 부작용을 식별하기 위한 @code{global} 선언의 유용성을 무효로 합니다.

@node 다른 값으로 루프에서 정의된 람다는 왜 모두 같은 결과를 반환합니까?,모듈 간에 전역 변수를 공유하려면 어떻게 해야 합니까?,파이썬에서 지역과 전역 변수에 대한 규칙은 무엇입니까?,Core language
@anchor{faq/programming why-do-lambdas-defined-in-a-loop-with-different-values-all-return-the-same-result}@anchor{5922}
@subsubsection 다른 값으로 루프에서 정의된 람다는 왜 모두 같은 결과를 반환합니까?


Assume you use a for loop to define a few different lambdas (or even plain
functions), for example:

@example
>>> squares = []
>>> for x in range(5):
...     squares.append(lambda: x**2)
@end example

이것은 @code{x**2}를 계산하는 5개의 람다가 포함된 리스트를 제공합니다. 호출되면, 각각 @code{0}, @code{1}, @code{4}, @code{9} 및 @code{16}을 반환할 것으로 예상할 수 있습니다. 그러나, 실제로 시도하면 모두 @code{16}을 반환한다는 것을 알 수 있습니다:

@example
>>> squares[2]()
16
>>> squares[4]()
16
@end example

This happens because @code{x} is not local to the lambdas, but is defined in
the outer scope, and it is accessed when the lambda is called — not when it
is defined.  At the end of the loop, the value of @code{x} is @code{4}, so all the
functions now return @code{4**2}, that is @code{16}.  You can also verify this by
changing the value of @code{x} and see how the results of the lambdas change:

@example
>>> x = 8
>>> squares[2]()
64
@end example

이를 피하려면, 람다에 대해 지역인 변수에 값을 저장하여, 전역 @code{x}의 값에 의존하지 않도록 할 필요가 있습니다:

@example
>>> squares = []
>>> for x in range(5):
...     squares.append(lambda n=x: n**2)
@end example

여기서 @code{n=x}는 람다에 지역인 새 변수 @code{n}을 만들고, 루프의 해당 시점에서 @code{x} 와 같은 값을 갖도록 람다가 정의될 때 계산됩니다. 이는 @code{n}의 값이 첫 번째 람다에서 @code{0}, 두 번째에서 @code{1}, 세 번째에서 @code{2} 등이 됨을 의미합니다. 따라서 각 람다는 이제 올바른 결과를 반환합니다:

@example
>>> squares[2]()
4
>>> squares[4]()
16
@end example

이 동작은 람다에만 국한된 것이 아니라 일반 함수에도 적용됩니다.

@node 모듈 간에 전역 변수를 공유하려면 어떻게 해야 합니까?,모듈에서 임포트를 사용하는 “모범 사례”는 무엇입니까?,다른 값으로 루프에서 정의된 람다는 왜 모두 같은 결과를 반환합니까?,Core language
@anchor{faq/programming how-do-i-share-global-variables-across-modules}@anchor{5923}
@subsubsection 모듈 간에 전역 변수를 공유하려면 어떻게 해야 합니까?


단일 프로그램 내에서 모듈 간에 정보를 공유하는 규범적인 방법은 특별한 모듈(종종 config나 cfg라고 불립니다)을 만드는 것입니다. 응용 프로그램의 모든 모듈에서 config 모듈을 임포트 하기만 하면 됩니다; 그러면 모듈이 전역 이름으로 사용 가능해집니다. 각 모듈의 인스턴스는 오직 하나이기 때문에, 모듈 객체에 대한 변경 사항은 모든 곳에 반영됩니다. 예를 들면 다음과 같습니다:

config.py:

@example
x = 0   # Default value of the 'x' configuration setting
@end example

mod.py:

@example
import config
config.x = 1
@end example

main.py:

@example
import config
import mod
print(config.x)
@end example

Note that using a module is also the basis for implementing the singleton design
pattern, for the same reason.

@node 모듈에서 임포트를 사용하는 “모범 사례”는 무엇입니까?,객체 간에 기본값이 공유되는 이유는 무엇입니까?,모듈 간에 전역 변수를 공유하려면 어떻게 해야 합니까?,Core language
@anchor{faq/programming what-are-the-best-practices-for-using-import-in-a-module}@anchor{5924}
@subsubsection 모듈에서 임포트를 사용하는 “모범 사례”는 무엇입니까?


일반적으로, @code{from modulename import *}를 사용하지 마십시오. 그렇게 하면 임포트 하는 곳의 이름 공간이 어수선해지고, 린터(linter)가 정의되지 않은 이름을 감지하기가 훨씬 어려워집니다.

파일 맨 위에서 모듈을 임포트 하십시오. 그렇게 하면 코드에 필요한 다른 모듈을 명확하게 하고 모듈 이름이 스코프에 있는지에 대한 질문을 피할 수 있습니다. 한 줄에 하나의 임포트를 사용하면 모듈 임포트를 쉽게 추가하고 삭제할 수 있지만, 한 줄에 여러 임포트를 사용하면 화면 공간을 덜 사용합니다.

다음 순서로 모듈을 임포트 하는 것이 좋습니다:


@enumerate 

@item 
standard library modules – such as @ref{df,,sys}, @ref{a5,,os}, @ref{7,,argparse}, @ref{be,,re}

@item 
third-party library modules (anything installed in Python’s site-packages
directory) – such as dateutil@footnote{https://pypi.org/project/dateutil/}, requests@footnote{https://pypi.org/project/requests/}, tzdata@footnote{https://pypi.org/project/tzdata/}

@item 
locally developed modules
@end enumerate

순환 임포트 관련 문제를 피하고자 임포트를 함수나 클래스로 이동해야 하는 경우가 있습니다. Gordon McMillan은 다음과 같이 말했습니다:

@quotation

두 모듈 모두 “import <module>” 형식의 임포트를 사용하면 순환 임포트는 괜찮습니다. 두 번째 모듈이 첫 번째 모듈의 이름(name)을 붙잡으려고 하고 (“from module import name”) 임포트가 최상위 수준에 있으면 실패합니다. 첫 번째 모듈이 두 번째 모듈을 임포트 하는 중이라서 첫 번째 모듈에 있는 이름을 아직 사용할 수 없기 때문입니다.
@end quotation

이 경우, 두 번째 모듈이 하나의 함수에서만 사용된다면, 임포트를 해당 함수로 쉽게 이동할 수 있습니다. 임포트가 호출될 때, 첫 번째 모듈의 초기화가 완료되었고, 두 번째 모듈은 임포트를 수행할 수 있습니다.

일부 모듈이 플랫폼 특정이면 임포트를 코드의 최상위 수준에서 다른 곳으로 이동해야 할 수도 있습니다. 이 경우, 파일 맨 위에서 모든 모듈을 임포트 하는 것이 가능하지 않을 수도 있습니다. 이 경우, 해당 플랫폼 특정 코드에서 올바른 모듈을 임포트 하는 것이 좋은 선택입니다.

순환 임포트를 피하거나 모듈의 초기화 시간을 줄이려는 등의 문제를 해결하는 데 필요할 때만, 함수 정의 내부와 같은 지역 스코프로 임포트를 옮기십시오. 이 기법은 프로그램 실행 방법에 따라 많은 임포트가 필요하지 않을 때 특히 유용합니다. 모듈이 해당 함수에서만 사용될 때 임포트를 함수로 옮기고 싶을 수도 있습니다. 모듈의 일회성 초기화 때문에 모듈을 처음 로드하는 데 비용이 많이들 수 있지만, 모듈을 여러 번 로드하는 것은 사실상 무료임에 유의하십시오, 두 번의 딕셔너리 조회만 발생합니다. 모듈 이름이 스코프를 벗어난 경우에도, 모듈은 아마도 @ref{17ea,,sys.modules}에 있을 겁니다.

@node 객체 간에 기본값이 공유되는 이유는 무엇입니까?,한 함수에서 다른 함수로 선택적이나 키워드 매개변수를 전달하려면 어떻게 해야 합니까?,모듈에서 임포트를 사용하는 “모범 사례”는 무엇입니까?,Core language
@anchor{faq/programming why-are-default-values-shared-between-objects}@anchor{5925}
@subsubsection 객체 간에 기본값이 공유되는 이유는 무엇입니까?


이 유형의 버그는 흔히 신참 프로그래머들을 깨뭅니다. 이 함수를 생각해보십시오:

@example
def foo(mydict=@{@}):  # Danger: shared reference to one dict for all calls
    ... compute something ...
    mydict[key] = value
    return mydict
@end example

이 함수를 처음 호출하면, @code{mydict}에 단일 항목이 포함됩니다. 두 번째는, @code{foo()}가 실행되기 시작할 때, @code{mydict}가 이미 항목에 들어 있는 상태로 시작하기 때문에, @code{mydict}가 두 개의 항목을 포함합니다.

종종 함수 호출이 기본값으로 새 객체를 만들 것으로 기대합니다. 그렇게 되지 않습니다. 함수가 정의될 때, 기본값은 정확히 한 번 만들어집니다. 이 예제의 딕셔너리와 같이, 해당 객체가 변경되면, 함수에 대한 후속 호출은 이 변경된 객체를 참조합니다.

정의에 따라, 숫자, 문자열, 튜플 및 @code{None}과 같은 불변 객체는 변경에 안전합니다. 딕셔너리, 리스트 및 클래스 인스턴스와 같은 가변 객체를 변경하면 혼란스러울 수 있습니다.

이 기능으로 인해, 가변 객체를 기본값으로 사용하지 않는 것이 좋습니다. 대신, @code{None}을 기본값으로 사용하고 함수 내부에서 매개변수가 @code{None}인지 확인한 다음 새 리스트/딕셔너리/무엇이든 새로 만드십시오. 예를 들어, 다음과 같이 쓰지 마십시오:

@example
def foo(mydict=@{@}):
    ...
@end example

대신 이렇게 쓰십시오:

@example
def foo(mydict=None):
    if mydict is None:
        mydict = @{@}  # create a new dict for local namespace
@end example

이 기능은 유용할 수 있습니다. 계산하는 데 시간이 걸리는 함수가 있을 때, 일반적인 기법은 각 함수 호출의 매개변수와 결괏값을 캐시하고, 같은 값이 다시 요청되면 캐시 된 값을 반환하는 것입니다. 이것을 “memoizing” 이라고 하며, 다음과 같이 구현할 수 있습니다:

@example
# Callers can only provide two parameters and optionally pass _cache by keyword
def expensive(arg1, arg2, *, _cache=@{@}):
    if (arg1, arg2) in _cache:
        return _cache[(arg1, arg2)]

    # Calculate the value
    result = ... expensive computation ...
    _cache[(arg1, arg2)] = result           # Store result in the cache
    return result
@end example

기본값 대신 딕셔너리를 포함하는 전역 변수를 사용할 수 있습니다; 취향의 문제입니다.

@node 한 함수에서 다른 함수로 선택적이나 키워드 매개변수를 전달하려면 어떻게 해야 합니까?,인자와 매개변수의 차이점은 무엇입니까?,객체 간에 기본값이 공유되는 이유는 무엇입니까?,Core language
@anchor{faq/programming how-can-i-pass-optional-or-keyword-parameters-from-one-function-to-another}@anchor{5926}
@subsubsection 한 함수에서 다른 함수로 선택적이나 키워드 매개변수를 전달하려면 어떻게 해야 합니까?


함수의 매개변수 목록에 @code{*}와 @code{**} 지정자를 사용하여 인자를 수집하십시오; 이것은 위치 인자를 튜플로, 키워드 인자를 딕셔너리로 제공합니다. 그런 다음 @code{*}와 @code{**}를 사용하여 다른 함수를 호출할 때 이러한 인자를 전달할 수 있습니다:

@example
def f(x, *args, **kwargs):
    ...
    kwargs['width'] = '14.3c'
    ...
    g(x, *args, **kwargs)
@end example

@geindex argument;difference from parameter
@geindex parameter;difference from argument

@node 인자와 매개변수의 차이점은 무엇입니까?,리스트 ‘y’를 변경할 때 리스트 ‘x’도 변경되는 이유는 무엇입니까?,한 함수에서 다른 함수로 선택적이나 키워드 매개변수를 전달하려면 어떻게 해야 합니까?,Core language
@anchor{faq/programming faq-argument-vs-parameter}@anchor{5927}@anchor{faq/programming what-is-the-difference-between-arguments-and-parameters}@anchor{5928}
@subsubsection 인자와 매개변수의 차이점은 무엇입니까?


@ref{2348,,Parameters} are defined by the names that appear in a
function definition, whereas @ref{679,,arguments} are the values
actually passed to a function when calling it.  Parameters define what
kind of arguments a function can accept.  For
example, given the function definition:

@example
def func(foo, bar=None, **kwargs):
    pass
@end example

`foo', `bar' 및 `kwargs'는 @code{func}의 매개변수입니다. 그러나, @code{func}를 호출할 때, 예를 들면:

@example
func(42, bar=314, extra=somevar)
@end example

@code{42}, @code{314} 및 @code{somevar} 값은 인자입니다.

@node 리스트 ‘y’를 변경할 때 리스트 ‘x’도 변경되는 이유는 무엇입니까?,출력 매개변수가 있는 함수를 작성하려면 어떻게 해야 합니까 참조에 의한 호출 ?,인자와 매개변수의 차이점은 무엇입니까?,Core language
@anchor{faq/programming why-did-changing-list-y-also-change-list-x}@anchor{5929}
@subsubsection 리스트 ‘y’를 변경할 때 리스트 ‘x’도 변경되는 이유는 무엇입니까?


다음과 같은 코드를 작성하면:

@example
>>> x = []
>>> y = x
>>> y.append(10)
>>> y
[10]
>>> x
[10]
@end example

@code{y}에 요소를 추가하면 @code{x}도 변경되는 이유가 궁금할 것입니다.

이 결과를 만드는 두 가지 요소가 있습니다:


@enumerate 

@item 
변수는 단순히 객체를 가리키는 이름입니다. @code{y = x}를 수행하면 리스트의 사본을 만들지 않습니다 – @code{x}가 참조하는 것과 같은 객체를 참조하는 새 변수 @code{y}를 만듭니다. 이는 하나의 객체(리스트)만 있고, @code{x} 와 @code{y} 모두 그 객체를 참조함을 의미합니다.

@item 
리스트는 @ref{1fe1,,가변}입니다, 내용을 변경할 수 있다는 뜻입니다.
@end enumerate

After the call to @ref{23d6,,append()}, the content of the mutable object has
changed from @code{[]} to @code{[10]}.  Since both the variables refer to the same
object, using either name accesses the modified value @code{[10]}.

대신 불변 객체를 @code{x}에 대입하면:

@example
>>> x = 5  # ints are immutable
>>> y = x
>>> x = x + 1  # 5 can't be mutated, we are creating a new object here
>>> x
6
>>> y
5
@end example

이 경우 @code{x} 와 @code{y}가 더는 같지 않다는 것을 알 수 있습니다. 이는 정수가 @ref{1fdc,,불변}이기 때문이고, @code{x = x + 1}을 수행할 때 값을 증가시켜서 정수 @code{5}를 변경하는 것이 아닙니다; 대신 새 객체(정수 @code{6})를 만들어 @code{x}에 대입합니다 (즉, @code{x}가 참조하는 객체를 바꿉니다). 이 대입 후에는 두 개의 객체(정수 @code{6}과 @code{5})와 이를 참조하는 두 개의 변수를 갖게 됩니다 (@code{x}는 이제 @code{6}을 참조하지만, @code{y}는 여전히 @code{5}를 참조합니다).

Some operations (for example @code{y.append(10)} and @code{y.sort()}) mutate the
object, whereas superficially similar operations (for example @code{y = y + [10]}
and @ref{dc6,,sorted(y)}) create a new object.  In general in Python (and in all cases
in the standard library) a method that mutates an object will return @code{None}
to help avoid getting the two types of operations confused.  So if you
mistakenly write @code{y.sort()} thinking it will give you a sorted copy of @code{y},
you’ll instead end up with @code{None}, which will likely cause your program to
generate an easily diagnosed error.

그러나, 같은 연산이 때때로 형에 따라 다른 동작을 갖는 한 가지 연산 클래스가 있습니다: 증분 대입 연산자. 예를 들어, @code{+=}는 리스트를 변경하지만, 튜플이나 정수는 변경하지 않습니다 (@code{a_list += [1, 2, 3]}은 @code{a_list.extend([1, 2, 3])}과 동등하고 @code{a_list}를  변경하지만, @code{some_tuple += (1, 2, 3)}과 @code{some_int += 1}은 새 객체를 만듭니다).

달리 표현하면:


@itemize *

@item 
If we have a mutable object (such as @ref{24d,,list}, @ref{183,,dict}, @ref{184,,set}),
we can use some specific operations to mutate it and all the variables
that refer to it will see the change.

@item 
If we have an immutable object (such as @ref{169,,str}, @ref{19b,,int}, @ref{610,,tuple}),
all the variables that refer to it will always see the same value,
but operations that transform that value into a new value always return a new
object.
@end itemize

두 변수가 같은 객체를 참조하는지를 알고 싶다면, @ref{34c,,is} 연산자나 내장 함수 @ref{1628,,id()}를 사용할 수 있습니다.

@node 출력 매개변수가 있는 함수를 작성하려면 어떻게 해야 합니까 참조에 의한 호출 ?,파이썬에서 고차 함수 higher order function 를 어떻게 만드나요?,리스트 ‘y’를 변경할 때 리스트 ‘x’도 변경되는 이유는 무엇입니까?,Core language
@anchor{faq/programming how-do-i-write-a-function-with-output-parameters-call-by-reference}@anchor{592a}
@subsubsection 출력 매개변수가 있는 함수를 작성하려면 어떻게 해야 합니까 (참조에 의한 호출)?


Remember that arguments are passed by assignment in Python.  Since assignment
just creates references to objects, there’s no alias between an argument name in
the caller and callee, and consequently no call-by-reference.  You can achieve the
desired effect in a number of ways.


@enumerate 

@item 
결과의 튜플을 반환하여:

@example
>>> def func1(a, b):
...     a = 'new-value'        # a and b are local names
...     b = b + 1              # assigned to new objects
...     return a, b            # return new values
...
>>> x, y = 'old-value', 99
>>> func1(x, y)
('new-value', 100)
@end example

이것은 거의 항상 가장 명확한 해법입니다.

@item 
전역 변수를 사용하여. 이것은 스레드 안전하지 않고, 권장하지 않습니다.

@item 
가변 (제자리에서 변경할 수 있는) 객체를 전달하여:

@example
>>> def func2(a):
...     a[0] = 'new-value'     # 'a' references a mutable list
...     a[1] = a[1] + 1        # changes a shared object
...
>>> args = ['old-value', 99]
>>> func2(args)
>>> args
['new-value', 100]
@end example

@item 
변경되는 딕셔너리를 전달하여:

@example
>>> def func3(args):
...     args['a'] = 'new-value'     # args is a mutable dictionary
...     args['b'] = args['b'] + 1   # change it in-place
...
>>> args = @{'a': 'old-value', 'b': 99@}
>>> func3(args)
>>> args
@{'a': 'new-value', 'b': 100@}
@end example

@item 
또는 클래스 인스턴스에 값을 묶어서:

@example
>>> class Namespace:
...     def __init__(self, /, **args):
...         for key, value in args.items():
...             setattr(self, key, value)
...
>>> def func4(args):
...     args.a = 'new-value'        # args is a mutable Namespace
...     args.b = args.b + 1         # change object in-place
...
>>> args = Namespace(a='old-value', b=99)
>>> func4(args)
>>> vars(args)
@{'a': 'new-value', 'b': 100@}
@end example

이렇게 복잡하게 만들어야 할 좋은 이유는 거의 없습니다.
@end enumerate

최선의 선택은 여러 결과가 포함된 튜플을 반환하는 것입니다.

@node 파이썬에서 고차 함수 higher order function 를 어떻게 만드나요?,파이썬에서 객체를 어떻게 복사합니까?,출력 매개변수가 있는 함수를 작성하려면 어떻게 해야 합니까 참조에 의한 호출 ?,Core language
@anchor{faq/programming how-do-you-make-a-higher-order-function-in-python}@anchor{592b}
@subsubsection 파이썬에서 고차 함수(higher order function)를 어떻게 만드나요?


두 가지 선택이 있습니다: 중첩된 스코프를 사용하거나 콜러블 객체를 사용할 수 있습니다. 예를 들어, 값 @code{a*x+b}를 계산하는 함수 @code{f(x)}를 반환하는 @code{linear(a,b)}를 정의하려고 한다고 가정하십시오. 중첩된 스코프를 사용해서:

@example
def linear(a, b):
    def result(x):
        return a * x + b
    return result
@end example

또는 콜러블 객체를 사용해서:

@example
class linear:

    def __init__(self, a, b):
        self.a, self.b = a, b

    def __call__(self, x):
        return self.a * x + self.b
@end example

두 경우 모두,

@example
taxes = linear(0.3, 2)
@end example

@code{taxes(10e6) == 0.3 * 10e6 + 2}가 되도록 하는 콜러블 객체를 제공합니다.

콜러블 객체 접근 방식은 약간 느리고 코드가 약간 길어진다는 단점이 있습니다. 그러나, 콜러블 컬렉션은 상속을 통해 서명을 공유할 수 있습니다:

@example
class exponential(linear):
    # __init__ inherited
    def __call__(self, x):
        return self.a * (x ** self.b)
@end example

객체는 여러 메서드의 상태를 캡슐화 할 수 있습니다:

@example
class counter:

    value = 0

    def set(self, x):
        self.value = x

    def up(self):
        self.value = self.value + 1

    def down(self):
        self.value = self.value - 1

count = counter()
inc, dec, reset = count.up, count.down, count.set
@end example

여기서 @code{inc()}, @code{dec()} 및 @code{reset()}은 같은 계수 변수를 공유하는 함수처럼 작동합니다.

@node 파이썬에서 객체를 어떻게 복사합니까?,객체의 메서드나 어트리뷰트를 어떻게 찾을 수 있습니까?,파이썬에서 고차 함수 higher order function 를 어떻게 만드나요?,Core language
@anchor{faq/programming how-do-i-copy-an-object-in-python}@anchor{592c}
@subsubsection 파이썬에서 객체를 어떻게 복사합니까?


일반적으로, 일반적일 때 @ref{756,,copy.copy()}나 @ref{d64,,copy.deepcopy()}를 시도하십시오. 모든 객체를 복사할 수는 없지만, 대부분 가능합니다.

일부 객체는 더 쉽게 복사할 수 있습니다. 딕셔너리에는 @ref{dc8,,copy()} 메서드가 있습니다:

@example
newdict = olddict.copy()
@end example

시퀀스는 슬라이싱으로 복사할 수 있습니다:

@example
new_l = l[:]
@end example

@node 객체의 메서드나 어트리뷰트를 어떻게 찾을 수 있습니까?,코드에서 객체 이름을 어떻게 찾을 수 있습니까?,파이썬에서 객체를 어떻게 복사합니까?,Core language
@anchor{faq/programming how-can-i-find-the-methods-or-attributes-of-an-object}@anchor{592d}
@subsubsection 객체의 메서드나 어트리뷰트를 어떻게 찾을 수 있습니까?


For an instance @code{x} of a user-defined class, @ref{843,,dir(x)} returns an alphabetized
list of the names containing the instance attributes and methods and attributes
defined by its class.

@node 코드에서 객체 이름을 어떻게 찾을 수 있습니까?,쉼표 연산자의 우선순위는 어떻게 되나요?,객체의 메서드나 어트리뷰트를 어떻게 찾을 수 있습니까?,Core language
@anchor{faq/programming how-can-my-code-discover-the-name-of-an-object}@anchor{592e}
@subsubsection 코드에서 객체 이름을 어떻게 찾을 수 있습니까?


일반적으로 말하자면, 객체에는 실제로 이름이 없기 때문에 그럴 수 없습니다. 기본적으로, 대입은 항상 이름을 값에 연결합니다; @code{def}와 @code{class} 문의 경우도 마찬가지이지만, 이 경우 값은 콜러블입니다. 다음 코드를 고려하십시오:

@example
>>> class A:
...     pass
...
>>> B = A
>>> a = B()
>>> b = a
>>> print(b)
<__main__.A object at 0x16D07CC>
>>> print(a)
<__main__.A object at 0x16D07CC>
@end example

Arguably the class has a name: even though it is bound to two names and invoked
through the name @code{B} the created instance is still reported as an instance of
class @code{A}.  However, it is impossible to say whether the instance’s name is @code{a} or
@code{b}, since both names are bound to the same value.

일반적으로 말해 코드가 특정 값의 “이름을 알아야” 할 필요는 없습니다. 의도적으로 내성적인(introspective) 프로그램을 작성하지 않는 한, 이는 일반적으로 접근 방식의 변경이 도움이 될 수 있다는 신호입니다.

comp.lang.python에서, Fredrik Lundh는 언젠가 이 질문에 대해 훌륭한 비유를 했습니다:

@quotation

여러분이 현관에서 발견한 고양이의 이름을 얻는 것과 같은 방법: 고양이(객체) 자체는 여러분에게 자신의 이름을 말할 수 없고, 전혀 신경 쓰지도 않습니다 – 따라서 그것이 어떻게 불리는지 알아내는 유일한 방법은 여러분 이웃 모두(이름 공간)에게 자신의 고양이(객체)인지 묻는 것입니다…

…. 여러 이름으로 알려져 있거나 전혀 이름이 없다는 것을 알게 되더라도 놀라지 마십시오!
@end quotation

@node 쉼표 연산자의 우선순위는 어떻게 되나요?,C의 “? ” 삼항 연산자와 동등한 것이 있습니까?,코드에서 객체 이름을 어떻게 찾을 수 있습니까?,Core language
@anchor{faq/programming what-s-up-with-the-comma-operator-s-precedence}@anchor{592f}
@subsubsection 쉼표 연산자의 우선순위는 어떻게 되나요?


쉼표는 파이썬에서 연산자가 아닙니다. 이 세션을 고려하십시오:

@example
>>> "a" in "b", "a"
(False, 'a')
@end example

쉼표는 연산자가 아니라 표현식 사이의 구분자이기 때문에 위는 다음과 같이 입력한 것처럼 평가됩니다:

@example
("a" in "b"), "a"
@end example

다음과 같이 평가되지 않습니다:

@example
"a" in ("b", "a")
@end example

The same is true of the various assignment operators (@code{=}, @code{+=}, and so on).
They are not truly operators but syntactic delimiters in assignment statements.

@node C의 “? ” 삼항 연산자와 동등한 것이 있습니까?,파이썬에서 난독화된 한 줄 코드를 작성할 수 있습니까?,쉼표 연산자의 우선순위는 어떻게 되나요?,Core language
@anchor{faq/programming is-there-an-equivalent-of-c-s-ternary-operator}@anchor{5930}
@subsubsection C의 “?:” 삼항 연산자와 동등한 것이 있습니까?


예, 있습니다. 문법은 다음과 같습니다:

@example
[on_true] if [expression] else [on_false]

x, y = 50, 25
small = x if x < y else y
@end example

이 문법이 파이썬 2.5에서 소개되기 전에, 일반적인 관용구는 논리 연산자를 사용하는 것이었습니다:

@example
[expression] and [on_true] or [on_false]
@end example

그러나, 이 관용구는 안전하지 않습니다. `on_true'가 거짓 불리언 값을 가질 때 잘못된 결과가 나올 수 있습니다. 따라서, 항상 @code{... if ... else ...} 형식을 사용하는 것이 좋습니다.

@node 파이썬에서 난독화된 한 줄 코드를 작성할 수 있습니까?,함수의 매개변수 목록에서 슬래시 / 는 무엇을 의미합니까?,C의 “? ” 삼항 연산자와 동등한 것이 있습니까?,Core language
@anchor{faq/programming is-it-possible-to-write-obfuscated-one-liners-in-python}@anchor{5931}
@subsubsection 파이썬에서 난독화된 한 줄 코드를 작성할 수 있습니까?


Yes.  Usually this is done by nesting @ref{14a2,,lambda} within
@code{lambda}.  See the following three examples, slightly adapted from Ulf Bartelt:

@example
from functools import reduce

# Primes < 1000
print(list(filter(None,map(lambda y:y*reduce(lambda x,y:x*y!=0,
map(lambda x,y=y:y%x,range(2,int(pow(y,0.5)+1))),1),range(2,1000)))))

# First 10 Fibonacci numbers
print(list(map(lambda x,f=lambda x,f:(f(x-1,f)+f(x-2,f)) if x>1 else 1:
f(x,f), range(10))))

# Mandelbrot set
print((lambda Ru,Ro,Iu,Io,IM,Sx,Sy:reduce(lambda x,y:x+'\n'+y,map(lambda y,
Iu=Iu,Io=Io,Ru=Ru,Ro=Ro,Sy=Sy,L=lambda yc,Iu=Iu,Io=Io,Ru=Ru,Ro=Ro,i=IM,
Sx=Sx,Sy=Sy:reduce(lambda x,y:x+y,map(lambda x,xc=Ru,yc=yc,Ru=Ru,Ro=Ro,
i=i,Sx=Sx,F=lambda xc,yc,x,y,k,f=lambda xc,yc,x,y,k,f:(k<=0)or (x*x+y*y
>=4.0) or 1+f(xc,yc,x*x-y*y+xc,2.0*x*y+yc,k-1,f):f(xc,yc,x,y,k,f):chr(
64+F(Ru+x*(Ro-Ru)/Sx,yc,0,0,i)),range(Sx))):L(Iu+y*(Io-Iu)/Sy),range(Sy
))))(-2.1, 0.7, -1.2, 1.2, 30, 80, 24))
#    \___ ___/  \___ ___/  |   |   |__ lines on screen
#        V          V      |   |______ columns on screen
#        |          |      |__________ maximum of "iterations"
#        |          |_________________ range on y axis
#        |____________________________ range on x axis
@end example

집에서 이것을 시도하지 마십시오, 어린이들!

@node 함수의 매개변수 목록에서 슬래시 / 는 무엇을 의미합니까?,,파이썬에서 난독화된 한 줄 코드를 작성할 수 있습니까?,Core language
@anchor{faq/programming faq-positional-only-arguments}@anchor{25d6}@anchor{faq/programming what-does-the-slash-in-the-parameter-list-of-a-function-mean}@anchor{5932}
@subsubsection 함수의 매개변수 목록에서 슬래시(/)는 무엇을 의미합니까?


A slash in the argument list of a function denotes that the parameters prior to
it are positional-only.  Positional-only parameters are the ones without an
externally usable name.  Upon calling a function that accepts positional-only
parameters, arguments are mapped to parameters based solely on their position.
For example, @ref{b98,,divmod()} is a function that accepts positional-only
parameters. Its documentation looks like this:

@example
>>> help(divmod)
Help on built-in function divmod in module builtins:

divmod(x, y, /)
    Return the tuple (x//y, x%y).  Invariant: div*y + mod == x.
@end example

매개변수 목록 끝의 슬래시는 두 매개변수가 위치 전용임을 의미합니다. 따라서, 키워드 인자로 @ref{b98,,divmod()}를 호출하면 에러가 발생합니다:

@example
>>> divmod(x=3, y=4)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: divmod() takes no keyword arguments
@end example

@node 숫자와 문자열,성능<3>,Core language,프로그래밍 FAQ
@anchor{faq/programming numbers-and-strings}@anchor{5933}
@subsection 숫자와 문자열


@menu
* 16진수와 8진수 정수는 어떻게 지정합니까?:: 
* 왜 -22 // 10 이 -3을 반환합니까?:: 
* How do I get int literal attribute instead of SyntaxError?:: 
* 문자열을 숫자로 어떻게 변환합니까?:: 
* 숫자를 문자열로 어떻게 변환합니까?:: 
* 제자리에서 문자열을 어떻게 수정합니까?:: 
* 문자열을 사용하여 어떻게 함수/메서드를 호출합니까?:: 
* Is there an equivalent to Perl’s chomp() for removing trailing newlines from strings?: Is there an equivalent to Perl’s chomp for removing trailing newlines from strings?. 
* Is there a scanf() or sscanf() equivalent?: Is there a scanf or sscanf equivalent?. 
* What does UnicodeDecodeError or UnicodeEncodeError error mean?:: 
* Can I end a raw string with an odd number of backslashes?:: 

@end menu

@node 16진수와 8진수 정수는 어떻게 지정합니까?,왜 -22 // 10 이 -3을 반환합니까?,,숫자와 문자열
@anchor{faq/programming how-do-i-specify-hexadecimal-and-octal-integers}@anchor{5934}
@subsubsection 16진수와 8진수 정수는 어떻게 지정합니까?


8진수를 지정하려면, 8진수 값 앞에 0을 붙이고, 소문자나 대문자 “o”를 붙입니다. 예를 들어, 변수 “a”를 8진수 값 “10”(10진수 8)으로 설정하려면, 이렇게 입력하십시오:

@example
>>> a = 0o10
>>> a
8
@end example

16진수도 쉽습니다. 16진수 앞에 0을 붙이고, 소문자나 대문자 “x”를 붙이기만 하면 됩니다. 16진 숫자는 소문자나 대문자로 지정할 수 있습니다. 예를 들어, 파이썬 인터프리터에서:

@example
>>> a = 0xa5
>>> a
165
>>> b = 0XB2
>>> b
178
@end example

@node 왜 -22 // 10 이 -3을 반환합니까?,How do I get int literal attribute instead of SyntaxError?,16진수와 8진수 정수는 어떻게 지정합니까?,숫자와 문자열
@anchor{faq/programming why-does-22-10-return-3}@anchor{5935}
@subsubsection 왜 -22 // 10 이 -3을 반환합니까?


주로 @code{i % j}가 @code{j}와 같은 부호를 갖도록 하려는 것입니다. 여러분이 이것을 원하고, 다음과 같은 것도 원한다면:

@example
i == (i // j) * j + (i % j)
@end example

정수 나누기는 floor를 반환해야 합니다. C 또한 이 항등식을 만족하도록 요구하고, @code{i // j}를 자르는(truncate) 컴파일러는 @code{i % j}가 @code{i} 와 같은 부호를 갖도록 할 필요가 있습니다.

@code{j}가 음수인 경우 @code{i % j}에 대한 실제 사용 사례는 거의 없습니다. @code{j}가 양수이면, 많은 사례가 있으며, 사실상 모든 경우에 @code{i % j}가 @code{>= 0}인 것이 더 유용합니다. 시계가 지금 10을 가리킨다면, 200시간 전에는 어디를 가리키겠습니까? @code{-190 % 12 == 2}가 유용합니다; @code{-190 % 12 == -10}은 물기를 기다리는 버그입니다.

@node How do I get int literal attribute instead of SyntaxError?,문자열을 숫자로 어떻게 변환합니까?,왜 -22 // 10 이 -3을 반환합니까?,숫자와 문자열
@anchor{faq/programming how-do-i-get-int-literal-attribute-instead-of-syntaxerror}@anchor{5936}
@subsubsection How do I get int literal attribute instead of SyntaxError?


Trying to lookup an @code{int} literal attribute in the normal manner gives
a @ref{18e,,SyntaxError} because the period is seen as a decimal point:

@example
>>> 1.__class__
  File "<stdin>", line 1
  1.__class__
   ^
SyntaxError: invalid decimal literal
@end example

The solution is to separate the literal from the period
with either a space or parentheses.

@example
>>> 1 .__class__
<class 'int'>
>>> (1).__class__
<class 'int'>
@end example

@node 문자열을 숫자로 어떻게 변환합니까?,숫자를 문자열로 어떻게 변환합니까?,How do I get int literal attribute instead of SyntaxError?,숫자와 문자열
@anchor{faq/programming how-do-i-convert-a-string-to-a-number}@anchor{5937}
@subsubsection 문자열을 숫자로 어떻게 변환합니까?


For integers, use the built-in @ref{19b,,int()} type constructor, for example, @code{int('144')
== 144}.  Similarly, @ref{196,,float()} converts to a floating-point number,
for example, @code{float('144') == 144.0}.

기본적으로 이것은 숫자를 심진수로 해석합니다. 그래서 @code{int('0144') == 144}는 참이고 @code{int('0x144')}는 @ref{2ec,,ValueError}를 발생시킵니다. @code{int(string, base)}는 두 번째 선택적 인자로 변환에 사용할 진수(base)를 받아들여서, @code{int( '0x144', 16) == 324}입니다. base가 0으로 지정되면, 숫자는 파이썬의 규칙을 사용하여 해석됩니다: 선행 ‘0o’는 8진수를 나타내고, ‘0x’는 16진수를 나타냅니다.

필요한 것이 문자열을 숫자로 변환하는 것뿐이라면 내장 함수 @ref{4a4,,eval()}을 사용하지 마십시오. @code{eval()}은 상당히 느리며 보안 위험을 초래할 수 있습니다: 누군가 원하지 않는 부작용이 있는 파이썬 표현식을 전달할 수 있습니다. 예를 들어, 누군가 여러분의 홈 디렉터리를 지우는 @code{__import__('os').system("rm -rf $HOME")}을 전달할 수 있습니다.

@ref{4a4,,eval()} also has the effect of interpreting numbers as Python expressions,
so that, for example, @code{eval('09')} gives a syntax error because Python does not allow
leading ‘0’ in a decimal number (except ‘0’).

@node 숫자를 문자열로 어떻게 변환합니까?,제자리에서 문자열을 어떻게 수정합니까?,문자열을 숫자로 어떻게 변환합니까?,숫자와 문자열
@anchor{faq/programming how-do-i-convert-a-number-to-a-string}@anchor{5938}
@subsubsection 숫자를 문자열로 어떻게 변환합니까?


For example, to convert the number @code{144} to the string @code{'144'}, use the built-in type
constructor @ref{169,,str()}.  If you want a hexadecimal or octal representation, use
the built-in functions @ref{14d4,,hex()} or @ref{14d3,,oct()}.  For fancy formatting, see
the @ref{19a,,포맷 문자열 리터럴} and @ref{15a0,,Format string syntax} sections.
For example, @code{"@{:04d@}".format(144)} yields
@code{'0144'} and @code{"@{:.3f@}".format(1.0/3.0)} yields @code{'0.333'}.

@node 제자리에서 문자열을 어떻게 수정합니까?,문자열을 사용하여 어떻게 함수/메서드를 호출합니까?,숫자를 문자열로 어떻게 변환합니까?,숫자와 문자열
@anchor{faq/programming how-do-i-modify-a-string-in-place}@anchor{5939}
@subsubsection 제자리에서 문자열을 어떻게 수정합니까?


You can’t, because strings are immutable.  In most situations, you should
simply construct a new string from the various parts you want to assemble
it from.  However, if you need an object with the ability to modify in-place
Unicode data, try using an @ref{1128,,io.StringIO} object or the @ref{8,,array}
module:

@example
>>> import io
>>> s = "Hello, world"
>>> sio = io.StringIO(s)
>>> sio.getvalue()
'Hello, world'
>>> sio.seek(7)
7
>>> sio.write("there!")
6
>>> sio.getvalue()
'Hello, there!'

>>> import array
>>> a = array.array('w', s)
>>> print(a)
array('w', 'Hello, world')
>>> a[0] = 'y'
>>> print(a)
array('w', 'yello, world')
>>> a.tounicode()
'yello, world'
@end example

@node 문자열을 사용하여 어떻게 함수/메서드를 호출합니까?,Is there an equivalent to Perl’s chomp for removing trailing newlines from strings?,제자리에서 문자열을 어떻게 수정합니까?,숫자와 문자열
@anchor{faq/programming how-do-i-use-strings-to-call-functions-methods}@anchor{593a}
@subsubsection 문자열을 사용하여 어떻게 함수/메서드를 호출합니까?


다양한 기법이 있습니다.


@itemize *

@item 
문자열을 함수로 매핑하는 딕셔너리를 사용하는 것이 가장 좋습니다. 이 기법의 주요 장점은 문자열이 함수 이름과 일치할 필요가 없다는 것입니다. 이것은 또한 case 구문을 흉내 내는 데 사용되는 기본 기법입니다:

@example
def a():
    pass

def b():
    pass

dispatch = @{'go': a, 'stop': b@}  # Note lack of parens for funcs

dispatch[get_input()]()  # Note trailing parens to call function
@end example

@item 
내장 함수 @ref{dc9,,getattr()}을 사용하십시오:

@example
import foo
getattr(foo, 'bar')()
@end example

@ref{dc9,,getattr()}은 클래스, 클래스 인스턴스, 모듈 등을 포함하는 모든 객체에서 작동함에 유의하십시오.

이것은 다음과 같이 표준 라이브러리의 여러 곳에서 사용됩니다:

@example
class Foo:
    def do_foo(self):
        ...

    def do_bar(self):
        ...

f = getattr(foo_instance, 'do_' + opname)
f()
@end example

@item 
함수 이름을 해석(resolve)하려면 @ref{46f,,locals()}를 사용하십시오:

@example
def myFunc():
    print("hello")

fname = "myFunc"

f = locals()[fname]
f()
@end example
@end itemize

@node Is there an equivalent to Perl’s chomp for removing trailing newlines from strings?,Is there a scanf or sscanf equivalent?,문자열을 사용하여 어떻게 함수/메서드를 호출합니까?,숫자와 문자열
@anchor{faq/programming is-there-an-equivalent-to-perl-s-chomp-for-removing-trailing-newlines-from-strings}@anchor{593b}
@subsubsection Is there an equivalent to Perl’s @code{chomp()} for removing trailing newlines from strings?


@code{S.rstrip("\r\n")}을 사용하면 다른 후행 공백을 제거하지 않고 문자열 @code{S}의 끝에 있는 모든 줄 종결자를 제거 할 수 있습니다. 문자열 @code{S}가 끝에 빈 줄이 여러 개 붙어 한 줄 이상을 나타내면, 모든 빈 줄의 줄 종결자가 제거됩니다:

@example
>>> lines = ("line 1 \r\n"
...          "\r\n"
...          "\r\n")
>>> lines.rstrip("\n\r")
'line 1 '
@end example

일반적으로 한 번에 한 줄씩 텍스트를 읽을 때만 필요하기 때문에, @code{S.rstrip()}을 이런 식으로 사용하면 잘 작동합니다.

@node Is there a scanf or sscanf equivalent?,What does UnicodeDecodeError or UnicodeEncodeError error mean?,Is there an equivalent to Perl’s chomp for removing trailing newlines from strings?,숫자와 문자열
@anchor{faq/programming is-there-a-scanf-or-sscanf-equivalent}@anchor{593c}
@subsubsection Is there a @code{scanf()} or @code{sscanf()} equivalent?


그런 식으로는 없습니다.

For simple input parsing, the easiest approach is usually to split the line into
whitespace-delimited words using the @ref{10a9,,split()} method of string objects
and then convert decimal strings to numeric values using @ref{19b,,int()} or
@ref{196,,float()}.  @code{split()} supports an optional “sep” parameter which is useful
if the line uses something other than whitespace as a separator.

For more complicated input parsing, regular expressions are more powerful
than C’s @code{sscanf} and better suited for the task.

@node What does UnicodeDecodeError or UnicodeEncodeError error mean?,Can I end a raw string with an odd number of backslashes?,Is there a scanf or sscanf equivalent?,숫자와 문자열
@anchor{faq/programming what-does-unicodedecodeerror-or-unicodeencodeerror-error-mean}@anchor{593d}
@subsubsection What does @code{UnicodeDecodeError} or @code{UnicodeEncodeError} error mean?


@ref{14a9,,유니코드 HOWTO}를 참조하십시오.

@node Can I end a raw string with an odd number of backslashes?,,What does UnicodeDecodeError or UnicodeEncodeError error mean?,숫자와 문자열
@anchor{faq/programming can-i-end-a-raw-string-with-an-odd-number-of-backslashes}@anchor{593e}@anchor{faq/programming faq-programming-raw-string-backslash}@anchor{1fdb}
@subsubsection Can I end a raw string with an odd number of backslashes?


A raw string ending with an odd number of backslashes will escape the string’s quote:

@example
>>> r'C:\this\will\not\work\'
  File "<stdin>", line 1
    r'C:\this\will\not\work\'
    ^
SyntaxError: unterminated string literal (detected at line 1)
@end example

There are several workarounds for this. One is to use regular strings and double
the backslashes:

@example
>>> 'C:\\this\\will\\work\\'
'C:\\this\\will\\work\\'
@end example

Another is to concatenate a regular string containing an escaped backslash to the
raw string:

@example
>>> r'C:\this\will\work' '\\'
'C:\\this\\will\\work\\'
@end example

It is also possible to use @ref{19a9,,os.path.join()} to append a backslash on Windows:

@example
>>> os.path.join(r'C:\this\will\work', '@w{'})
'C:\\this\\will\\work\\'
@end example

Note that while a backslash will “escape” a quote for the purposes of
determining where the raw string ends, no escaping occurs when interpreting the
value of the raw string. That is, the backslash remains present in the value of
the raw string:

@example
>>> r'backslash\'preserved'
"backslash\\'preserved"
@end example

Also see the specification in the @ref{229c,,language reference}.

@node 성능<3>,Sequences tuples/lists,숫자와 문자열,프로그래밍 FAQ
@anchor{faq/programming performance}@anchor{593f}
@subsection 성능


@menu
* 내 프로그램이 너무 느립니다. 속도를 높이려면 어떻게 해야 합니까?: 내 프로그램이 너무 느립니다 속도를 높이려면 어떻게 해야 합니까?. 
* 많은 문자열을 함께 이어붙이는 가장 효율적인 방법은 무엇입니까?:: 

@end menu

@node 내 프로그램이 너무 느립니다 속도를 높이려면 어떻게 해야 합니까?,많은 문자열을 함께 이어붙이는 가장 효율적인 방법은 무엇입니까?,,성능<3>
@anchor{faq/programming my-program-is-too-slow-how-do-i-speed-it-up}@anchor{5940}
@subsubsection 내 프로그램이 너무 느립니다. 속도를 높이려면 어떻게 해야 합니까?


That’s a tough one, in general.  First, here is a list of things to
remember before diving further:


@itemize *

@item 
성능 특성은 파이썬 구현마다 다릅니다. 이 FAQ는 @ref{904,,CPython}에 중점을 둡니다.

@item 
동작은 운영 체제마다 다를 수 있습니다, 특히 I/O 나 다중 스레드에 관해 이야기할 때 그렇습니다.

@item 
코드를 최적화하려고 시도하기 `전에' 프로그램에서 항상 핫스팟을 찾아야 합니다 (@ref{b4,,profile} 모듈을 참조하십시오).

@item 
벤치마크 스크립트를 작성하면 개선 사항을 탐색할 때 빠르게 반복할 수 있습니다 (@ref{f5,,timeit} 모듈 참조).

@item 
정교한 최적화에 숨겨진 회귀(regressions)를 잠재적으로 도입하기 전에 (단위 테스트나 기타 기법을 통해) 우수한 코드 커버리지를 갖는 것이 좋습니다.
@end itemize

이것을 전제로, 파이썬 코드 속도를 높이는 많은 트릭이 있습니다. 다음은 수용 가능한 성능 수준에 도달하기 위해 먼 길을 갈 때 도움이 되는 몇 가지 일반적인 원칙입니다:


@itemize *

@item 
알고리즘을 더 빠르게 만들면 (또는 더 빠른 알고리즘으로 변경하면) 코드 전체에 미세 최적화 트릭을 뿌리는 것보다 훨씬 큰 이점을 얻을 수 있습니다.

@item 
올바른 데이터 구조를 사용하십시오. @ref{25ea,,내장형}과 @ref{1e,,collections} 모듈에 대한 설명서를 연구하십시오.

@item 
표준 라이브러리가 무언가를 하기 위한 프리미티브를 제공할 때, 여러분이 떠올린 다른 대안보다 빠를 가능성이 높습니다 (보장되지는 않습니다). 이것은 내장과 일부 확장형과 같이 C로 작성된 프리미티브의 경우에는 두 배로 그렇습니다. 예를 들어, 정렬하려면 @ref{dc7,,list.sort()} 내장 메서드나 관련 @ref{dc6,,sorted()} 함수를 사용하십시오 (그리고 약간 고급 사용법의 예는 @ref{25de,,정렬 기법}를 참조하십시오).

@item 
추상화는 간접(indirections)을 만드는 경향이 있고 인터프리터가 더 많은 일을 하도록 강요합니다. 간접의 수준이 유용한 작업의 양을 초과하면, 프로그램 속도가 느려집니다. 과도한 추상화를 피해야 합니다, 특히 작은 함수나 메서드의 형태에서 그렇습니다 (종종 가독성에도 해롭습니다).
@end itemize

If you have reached the limit of what pure Python can allow, there are tools
to take you further away.  For example, Cython@footnote{https://cython.org} can
compile a slightly modified version of Python code into a C extension, and
can be used on many different platforms.  Cython can take advantage of
compilation (and optional type annotations) to make your code significantly
faster than when interpreted.  If you are confident in your C programming
skills, you can also @ref{1fb9,,write a C extension module}
yourself.


@subsubheading 더 보기


성능 팁@footnote{https://wiki.python.org/moin/PythonSpeed/PerformanceTips}에 할당된 위키 페이지.


@node 많은 문자열을 함께 이어붙이는 가장 효율적인 방법은 무엇입니까?,,내 프로그램이 너무 느립니다 속도를 높이려면 어떻게 해야 합니까?,성능<3>
@anchor{faq/programming efficient-string-concatenation}@anchor{5941}@anchor{faq/programming what-is-the-most-efficient-way-to-concatenate-many-strings-together}@anchor{5942}
@subsubsection 많은 문자열을 함께 이어붙이는 가장 효율적인 방법은 무엇입니까?


@ref{169,,str}과 @ref{192,,bytes} 객체는 불변이므로, 많은 문자열을 함께 이어붙이면 각 이어붙이기가 새 객체를 생성하기 때문에 비효율적입니다. 일반적일 때, 총 실행 시간 비용은 전체 문자열 길이의 제곱에 비례합니다.

많은 @ref{169,,str} 객체를 누적하기 위해, 권장되는 관용구는 객체를 리스트에 배치하고 마지막에 @ref{260a,,str.join()}을 호출하는 것입니다:

@example
chunks = []
for s in my_strings:
    chunks.append(s)
result = '@w{'}.join(chunks)
@end example

(Another reasonably efficient idiom is to use @ref{1128,,io.StringIO}.)

많은 @ref{192,,bytes} 객체를 누적하기 위해, 권장되는 관용구는 제자리 이어붙이기(@code{+=} 연산자)을 사용하여 @ref{344,,bytearray} 객체를 확장하는 것입니다:

@example
result = bytearray()
for b in my_bytes_objects:
    result += b
@end example

@node Sequences tuples/lists,객체,성능<3>,프로그래밍 FAQ
@anchor{faq/programming sequences-tuples-lists}@anchor{5943}
@subsection Sequences (tuples/lists)


@menu
* 튜플과 리스트를 어떻게 변환합니까?:: 
* 음수 인덱스는 무엇입니까?:: 
* 시퀀스를 역순으로 이터레이트 하려면 어떻게 합니까?:: 
* 리스트에서 중복을 어떻게 제거합니까?:: 
* How do you remove multiple items from a list?:: 
* 파이썬에서 어떻게 배열을 만드나요?:: 
* 다차원 리스트를 어떻게 만듭니까?:: 
* How do I apply a method or function to a sequence of objects?:: 
* 덧셈은 작동하는데@comma{} 왜 a_tuple[i] += [‘item’]이 예외를 일으킵니까?: 덧셈은 작동하는데 왜 a_tuple[i] += [‘item’]이 예외를 일으킵니까?. 
* 복잡한 정렬을 하고 싶습니다; 파이썬에서 Schwartzian 변환을 할 수 있습니까?: 복잡한 정렬을 하고 싶습니다 파이썬에서 Schwartzian 변환을 할 수 있습니까?. 
* 한 리스트를 다른 리스트의 값으로 정렬하려면 어떻게 해야 합니까?:: 

@end menu

@node 튜플과 리스트를 어떻게 변환합니까?,음수 인덱스는 무엇입니까?,,Sequences tuples/lists
@anchor{faq/programming how-do-i-convert-between-tuples-and-lists}@anchor{5944}
@subsubsection 튜플과 리스트를 어떻게 변환합니까?


형 생성자 @code{tuple(seq)}는 임의의 시퀀스(실제로는, 모든 이터러블)를 같은 순서로 같은 항목을 가진 튜플로 변환합니다.

예를 들어, @code{tuple([1, 2, 3])}은 @code{(1, 2, 3)}을 산출하고 @code{tuple('abc')}는 @code{('a', 'b', 'c')}를 산출합니다. 인자가 튜플이면 사본을 만들지 않고 같은 객체를 반환하므로, 객체가 이미 튜플인지 확실하지 않을 때 @ref{610,,tuple()}을 호출하는 것이 저렴합니다.

형 생성자 @code{list(seq)}는 임의의 시퀀스나 이터러블을 같은 순서로 같은 항목이 있는 리스트로 변환합니다. 예를 들어, @code{list((1, 2, 3))}은 @code{[1, 2, 3]}을 산출하고 @code{list('abc')}는 @code{['a', 'b', 'c']}를 산출합니다. 인자가 리스트이면, @code{seq[:]}와 같이 사본을 만듭니다.

@node 음수 인덱스는 무엇입니까?,시퀀스를 역순으로 이터레이트 하려면 어떻게 합니까?,튜플과 리스트를 어떻게 변환합니까?,Sequences tuples/lists
@anchor{faq/programming what-s-a-negative-index}@anchor{5945}
@subsubsection 음수 인덱스는 무엇입니까?


파이썬 시퀀스는 양수와 음수로 인덱싱됩니다. 양수의 경우 0은 첫 번째 인덱스이고 1은 두 번째 인덱스이고 이런 식으로 계속됩니다. 음수 인덱스의 경우 -1은 마지막 인덱스이고 -2는 끝에서 두 번째 인덱스이고 이런 식으로 계속됩니다. @code{seq[-n]}을 @code{seq[len(seq)-n]}과 같다고 생각하십시오.

음수 인덱스를 사용하면 매우 편리할 수 있습니다. 예를 들어 @code{S[:-1]}은 마지막 문자를 제외한 문자열의 모든 것인데, 문자열에서 후행 줄 바꿈을 제거하는 데 유용합니다.

@node 시퀀스를 역순으로 이터레이트 하려면 어떻게 합니까?,리스트에서 중복을 어떻게 제거합니까?,음수 인덱스는 무엇입니까?,Sequences tuples/lists
@anchor{faq/programming how-do-i-iterate-over-a-sequence-in-reverse-order}@anchor{5946}
@subsubsection 시퀀스를 역순으로 이터레이트 하려면 어떻게 합니까?


@ref{a65,,reversed()} 내장 함수를 사용하십시오:

@example
for x in reversed(sequence):
    ...  # do something with x ...
@end example

이것은 원본 시퀀스에는 영향을 미치지 않지만, 이터레이트 할 뒤집힌 순서의 새 사본을 만듭니다.

@node 리스트에서 중복을 어떻게 제거합니까?,How do you remove multiple items from a list?,시퀀스를 역순으로 이터레이트 하려면 어떻게 합니까?,Sequences tuples/lists
@anchor{faq/programming how-do-you-remove-duplicates-from-a-list}@anchor{5947}
@subsubsection 리스트에서 중복을 어떻게 제거합니까?


이 작업을 수행하는 여러 가지 방법에 대한 긴 논의는 파이썬 요리책을 참조하십시오:

@quotation

@indicateurl{https://code.activestate.com/recipes/52560/}
@end quotation

리스트 순서를 바꿔도 상관없다면, 리스트를 정렬한 다음 리스트 끝에서 스캔하면서 중복 항목을 삭제하십시오:

@example
if mylist:
    mylist.sort()
    last = mylist[-1]
    for i in range(len(mylist)-2, -1, -1):
        if last == mylist[i]:
            del mylist[i]
        else:
            last = mylist[i]
@end example

If all elements of the list may be used as set keys (that is, they are all
@ref{823,,hashable}) this is often faster:

@example
mylist = list(set(mylist))
@end example

이것은 리스트를 집합으로 변환하여, 중복을 제거한 다음, 리스트로 되돌립니다.

@node How do you remove multiple items from a list?,파이썬에서 어떻게 배열을 만드나요?,리스트에서 중복을 어떻게 제거합니까?,Sequences tuples/lists
@anchor{faq/programming how-do-you-remove-multiple-items-from-a-list}@anchor{5948}
@subsubsection How do you remove multiple items from a list?


As with removing duplicates, explicitly iterating in reverse with a
delete condition is one possibility.  However, it is easier and faster
to use slice replacement with an implicit or explicit forward iteration.
Here are three variations:

@example
mylist[:] = filter(keep_function, mylist)
mylist[:] = (x for x in mylist if keep_condition)
mylist[:] = [x for x in mylist if keep_condition]
@end example

리스트 컴프리헨션이 아마 가장 빠릅니다.

@node 파이썬에서 어떻게 배열을 만드나요?,다차원 리스트를 어떻게 만듭니까?,How do you remove multiple items from a list?,Sequences tuples/lists
@anchor{faq/programming how-do-you-make-an-array-in-python}@anchor{5949}
@subsubsection 파이썬에서 어떻게 배열을 만드나요?


리스트를 사용하십시오:

@example
["this", 1, "is", "an", "array"]
@end example

리스트는 시간 복잡성 면에서 C나 파스칼(Pascal) 배열과 동등합니다; 가장 큰 차이점은 파이썬 리스트에 다양한 형의 객체가 포함될 수 있다는 것입니다.

The @code{array} module also provides methods for creating arrays of fixed types
with compact representations, but they are slower to index than lists.  Also
note that NumPy@footnote{https://numpy.org/}
and other third-party packages define array-like structures with
various characteristics as well.

To get Lisp-style linked lists, you can emulate `cons cells' using tuples:

@example
lisp_list = ("like",  ("this",  ("example", None) ) )
@end example

If mutability is desired, you could use lists instead of tuples.  Here the
analogue of a Lisp `car' is @code{lisp_list[0]} and the analogue of `cdr' is
@code{lisp_list[1]}.  Only do this if you’re sure you really need to, because it’s
usually a lot slower than using Python lists.

@node 다차원 리스트를 어떻게 만듭니까?,How do I apply a method or function to a sequence of objects?,파이썬에서 어떻게 배열을 만드나요?,Sequences tuples/lists
@anchor{faq/programming faq-multidimensional-list}@anchor{2609}@anchor{faq/programming how-do-i-create-a-multidimensional-list}@anchor{594a}
@subsubsection 다차원 리스트를 어떻게 만듭니까?


다음과 같이 다차원 배열을 만들려고 했을 것입니다:

@example
>>> A = [[None] * 2] * 3
@end example

인쇄하면 올바르게 보입니다:

@c A = [[None] * 2] * 3

@example
>>> A
[[None, None], [None, None], [None, None]]
@end example

그러나 값을 대입하면, 여러 위치에 나타납니다:

@c A = [[None] * 2] * 3

@example
>>> A[0][0] = 5
>>> A
[[5, None], [5, None], [5, None]]
@end example

그 이유는 @code{*}로 리스트를 복제해도 복사본을 만들지 않고 기존 객체에 대한 참조만 만들기 때문입니다. @code{*3}은 길이 2의 같은 리스트에 대한 3개의 참조를 포함하는 리스트를 만듭니다. 한 행에 대한 변경 사항은 모든 행에 나타나는데, 거의 확실히 여러분이 원하는 것은 아닙니다.

제안된 방법은 원하는 길이의 리스트를 먼저 만든 다음 새로 만든 리스트로 각 요소를 채우는 것입니다:

@example
A = [None] * 3
for i in range(3):
    A[i] = [None] * 2
@end example

그러면 길이가 2인 3개의 다른 리스트를 포함하는 리스트가 생성됩니다. 리스트 컴프리헨션도 사용할 수 있습니다:

@example
w, h = 2, 3
A = [[None] * w for i in range(h)]
@end example

Or, you can use an extension that provides a matrix datatype; NumPy@footnote{https://numpy.org/} is the best known.

@node How do I apply a method or function to a sequence of objects?,덧셈은 작동하는데 왜 a_tuple[i] += [‘item’]이 예외를 일으킵니까?,다차원 리스트를 어떻게 만듭니까?,Sequences tuples/lists
@anchor{faq/programming how-do-i-apply-a-method-or-function-to-a-sequence-of-objects}@anchor{594b}
@subsubsection How do I apply a method or function to a sequence of objects?


To call a method or function and accumulate the return values in a list,
a @ref{8dc,,list comprehension} is an elegant solution:

@example
result = [obj.method() for obj in mylist]

result = [function(obj) for obj in mylist]
@end example

To just run the method or function without saving the return values,
a plain @ref{34a,,for} loop will suffice:

@example
for obj in mylist:
    obj.method()

for obj in mylist:
    function(obj)
@end example

@node 덧셈은 작동하는데 왜 a_tuple[i] += [‘item’]이 예외를 일으킵니까?,복잡한 정렬을 하고 싶습니다 파이썬에서 Schwartzian 변환을 할 수 있습니까?,How do I apply a method or function to a sequence of objects?,Sequences tuples/lists
@anchor{faq/programming faq-augmented-assignment-tuple-error}@anchor{2402}@anchor{faq/programming why-does-a-tuple-i-item-raise-an-exception-when-the-addition-works}@anchor{594c}
@subsubsection 덧셈은 작동하는데, 왜 a_tuple[i] += [‘item’]이 예외를 일으킵니까?


이는 증분 대입 연산자가 `대입' 연산자라는 사실과 파이썬에서 가변 객체와 불변 객체의 차이점이 결합하기 때문입니다.

이 논의는 증분 대입 연산자가 가변 객체를 가리키는 튜플의 요소에 적용될 때 일반적으로 적용되지만, 우리는 @code{list}와 @code{+=}를 예제로 사용합니다.

다음과 같이 작성한다면:

@example
>>> a_tuple = (1, 2)
>>> a_tuple[0] += 1
Traceback (most recent call last):
   ...
TypeError: 'tuple' object does not support item assignment
@end example

예외의 이유는 명확합니다: @code{1}이 @code{a_tuple[0]}이 가리키는 객체(@code{1})에 더해져서, 결과 객체 @code{2}를 생성하지만, 계산 결과 @code{2}를 튜플의 요소 @code{0}에 대입하려고 하면, 튜플의 요소가 가리키는 것을 변경할 수 없기 때문에 에러가 발생합니다.

수면 아래에서, 이 증분 대입문이 하는 일은 대략 다음과 같습니다:

@example
>>> result = a_tuple[0] + 1
>>> a_tuple[0] = result
Traceback (most recent call last):
  ...
TypeError: 'tuple' object does not support item assignment
@end example

튜플은 불변이므로, 연산의 대입 부분이 에러를 발생시킵니다.

다음과 같이 작성하면:

@example
>>> a_tuple = (['foo'], 'bar')
>>> a_tuple[0] += ['item']
Traceback (most recent call last):
  ...
TypeError: 'tuple' object does not support item assignment
@end example

예외는 조금 더 놀랍습니다, 더 놀라운 것은 에러가 있었지만 더하기가 동작했다는 사실입니다:

@example
>>> a_tuple[0]
['foo', 'item']
@end example

To see why this happens, you need to know that (a) if an object implements an
@ref{23df,,__iadd__()} magic method, it gets called when the @code{+=} augmented
assignment
is executed, and its return value is what gets used in the assignment statement;
and (b) for lists, @code{__iadd__()} is equivalent to calling
@ref{23d9,,extend()} on the list and returning the list.
That’s why we say that for lists, @code{+=} is a “shorthand” for @ref{600,,list.extend()}:

@example
>>> a_list = []
>>> a_list += [1]
>>> a_list
[1]
@end example

이것은 다음과 동등합니다:

@example
>>> result = a_list.__iadd__([1])
>>> a_list = result
@end example

a_list가 가리키는 객체가 변경되었고, 변경된 객체에 대한 포인터가 다시 @code{a_list}에 대입됩니다. 대입의 최종 결과는 no-op인데, @code{a_list}가 이전에 가리키고 있던 것과 같은 객체에 대한 포인터이기 때문입니다, 하지만 대입은 여전히 일어납니다.

따라서, 우리의 튜플 예제에서 일어나는 일은 다음과 동등합니다:

@example
>>> result = a_tuple[0].__iadd__(['item'])
>>> a_tuple[0] = result
Traceback (most recent call last):
  ...
TypeError: 'tuple' object does not support item assignment
@end example

The @code{__iadd__()} succeeds, and thus the list is extended, but even though
@code{result} points to the same object that @code{a_tuple[0]} already points to,
that final assignment still results in an error, because tuples are immutable.

@node 복잡한 정렬을 하고 싶습니다 파이썬에서 Schwartzian 변환을 할 수 있습니까?,한 리스트를 다른 리스트의 값으로 정렬하려면 어떻게 해야 합니까?,덧셈은 작동하는데 왜 a_tuple[i] += [‘item’]이 예외를 일으킵니까?,Sequences tuples/lists
@anchor{faq/programming i-want-to-do-a-complicated-sort-can-you-do-a-schwartzian-transform-in-python}@anchor{594d}
@subsubsection 복잡한 정렬을 하고 싶습니다: 파이썬에서 Schwartzian 변환을 할 수 있습니까?


Perl 커뮤니티의 Randal Schwartz에 의한 이 기법은 리스트의 각 요소를 각 요소를 “정렬 값”에 매핑하는 메트릭으로 정렬합니다. 파이썬에서는, @ref{dc7,,list.sort()} 메서드의 @code{key} 인자를 사용하십시오:

@example
Isorted = L[:]
Isorted.sort(key=lambda s: int(s[10:15]))
@end example

@node 한 리스트를 다른 리스트의 값으로 정렬하려면 어떻게 해야 합니까?,,복잡한 정렬을 하고 싶습니다 파이썬에서 Schwartzian 변환을 할 수 있습니까?,Sequences tuples/lists
@anchor{faq/programming how-can-i-sort-one-list-by-values-from-another-list}@anchor{594e}
@subsubsection 한 리스트를 다른 리스트의 값으로 정렬하려면 어떻게 해야 합니까?


Merge them into an iterator of tuples, sort the resulting list, and then pick
out the element you want.

@example
>>> list1 = ["what", "I'm", "sorting", "by"]
>>> list2 = ["something", "else", "to", "sort"]
>>> pairs = zip(list1, list2)
>>> pairs = sorted(pairs)
>>> pairs
[("I'm", 'else'), ('by', 'sort'), ('sorting', 'to'), ('what', 'something')]
>>> result = [x[1] for x in pairs]
>>> result
['else', 'sort', 'to', 'something']
@end example

@node 객체,모듈<3>,Sequences tuples/lists,프로그래밍 FAQ
@anchor{faq/programming objects}@anchor{594f}
@subsection 객체


@menu
* 클래스는 무엇입니까?:: 
* 메서드는 무엇입니까?:: 
* self는 무엇입니까?:: 
* 객체가 주어진 클래스나 그 서브 클래스의 인스턴스인지 어떻게 확인합니까?:: 
* 위임이란 무엇입니까?:: 
* How do I call a method defined in a base class from a derived class that extends it?:: 
* 베이스 클래스를 쉽게 변경할 수 있도록 코드를 구성하려면 어떻게 해야 합니까?:: 
* 정적 클래스 데이터와 정적 클래스 메서드를 만들려면 어떻게 해야 합니까?:: 
* 파이썬에서 생성자(또는 메서드)를 어떻게 재정의할 수 있습니까?: 파이썬에서 생성자 또는 메서드 를 어떻게 재정의할 수 있습니까?. 
* __spam을 사용하려고 하는데 _SomeClassName__spam에 대한 에러가 발생합니다.: __spam을 사용하려고 하는데 _SomeClassName__spam에 대한 에러가 발생합니다. 
* 내 클래스는 __del__을 정의하지만 객체를 삭제할 때 호출되지 않습니다.: 내 클래스는 __del__을 정의하지만 객체를 삭제할 때 호출되지 않습니다. 
* 주어진 클래스의 모든 인스턴스 목록을 어떻게 얻습니까?:: 
* id()의 결과가 고유하지 않은 것처럼 보이는 이유는 무엇입니까?: id 의 결과가 고유하지 않은 것처럼 보이는 이유는 무엇입니까?. 
* is 연산자를 사용한 아이덴티티 검사는 언제 신뢰할 수 있습니까?:: 
* How can a subclass control what data is stored in an immutable instance?:: 
* How do I cache method calls?:: 

@end menu

@node 클래스는 무엇입니까?,메서드는 무엇입니까?,,객체
@anchor{faq/programming what-is-a-class}@anchor{5950}
@subsubsection 클래스는 무엇입니까?


클래스는 class 문을 실행하여 만든 특정 객체 형입니다. 클래스 객체는 인스턴스 객체를 만들기 위한 주형으로 사용되며, 데이터형과 관련된 데이터(어트리뷰트)와 코드(메서드)를 모두 내장합니다.

클래스는 베이스 클래스라고 하는 하나 이상의 다른 클래스를 기반으로 할 수 있습니다. 그러면 베이스 클래스의 어트리뷰트와 메서드를 상속합니다. 이는 상속을 통해 객체 모델을 점진적으로 재정의할 수 있도록 합니다. 우편함에 대한 기본 접근자 메서드를 제공하는 일반 @code{Mailbox} 클래스와 다양한 특정 사서함 형식을 처리하는 @code{MboxMailbox}, @code{MaildirMailbox}, @code{OutlookMailbox}와 같은 서브 클래스가 있을 수 있습니다.

@node 메서드는 무엇입니까?,self는 무엇입니까?,클래스는 무엇입니까?,객체
@anchor{faq/programming what-is-a-method}@anchor{5951}
@subsubsection 메서드는 무엇입니까?


메서드는 일반적으로 @code{x.name(arguments...)}로 호출하는 어떤 객체 @code{x}의 함수입니다. 메서드는 클래스 정의 내에서 함수로 정의됩니다:

@example
class C:
    def meth(self, arg):
        return arg * 2 + self.attribute
@end example

@node self는 무엇입니까?,객체가 주어진 클래스나 그 서브 클래스의 인스턴스인지 어떻게 확인합니까?,메서드는 무엇입니까?,객체
@anchor{faq/programming what-is-self}@anchor{5952}
@subsubsection self는 무엇입니까?


self는 단지 메서드의 첫 번째 인자를 위한 관례적 이름입니다. @code{meth(self, a, b, c)}로 정의된 메서드는 정의가 등장한 클래스의 어떤 인스턴스 @code{x}에 대해 @code{x.meth(a, b, c)}로 호출되어야 합니다; 호출된 메서드는 @code{meth(x, a, b, c)}처럼 호출되었다고 생각합니다.

@ref{5953,,메서드 정의와 호출에서 ‘self’를 명시적으로 사용해야 하는 이유는 무엇입니까?} 도 참조하십시오.

@node 객체가 주어진 클래스나 그 서브 클래스의 인스턴스인지 어떻게 확인합니까?,위임이란 무엇입니까?,self는 무엇입니까?,객체
@anchor{faq/programming how-do-i-check-if-an-object-is-an-instance-of-a-given-class-or-of-a-subclass-of-it}@anchor{5954}
@subsubsection 객체가 주어진 클래스나 그 서브 클래스의 인스턴스인지 어떻게 확인합니까?


Use the built-in function @ref{2ad,,isinstance(obj@comma{} cls)}.  You can
check if an object
is an instance of any of a number of classes by providing a tuple instead of a
single class, for example, @code{isinstance(obj, (class1, class2, ...))}, and can also
check whether an object is one of Python’s built-in types, for example,
@code{isinstance(obj, str)} or @code{isinstance(obj, (int, float, complex))}.

Note that @ref{2ad,,isinstance()} also checks for virtual inheritance from an
@ref{13bb,,abstract base class}.  So, the test will return @code{True} for a
registered class even if hasn’t directly or indirectly inherited from it.  To
test for “true inheritance”, scan the @ref{25e0,,method resolution order} (MRO) of
the class:

@example
from collections.abc import Mapping

class P:
     pass

class C(P):
    pass

Mapping.register(P)
@end example

@example
>>> c = C()
>>> isinstance(c, C)        # direct
True
>>> isinstance(c, P)        # indirect
True
>>> isinstance(c, Mapping)  # virtual
True

# Actual inheritance chain
>>> type(c).__mro__
(<class 'C'>, <class 'P'>, <class 'object'>)

# Test for "true inheritance"
>>> Mapping in type(c).__mro__
False
@end example

대부분의 프로그램은 사용자 정의 클래스에서 @ref{2ad,,isinstance()}를 자주 사용하지 않음에 유의하십시오. 클래스를 직접 개발하고 있다면, 더 적절한 객체 지향 스타일은 객체의 클래스를 확인하고 클래스에 따라 다른 작업을 수행하는 대신 특정 동작을 캡슐화하는 클래스의 메서드를 정의하는 것입니다. 예를 들어, 무언가를 수행하는 함수가 있다면:

@example
def search(obj):
    if isinstance(obj, Mailbox):
        ...  # code to search a mailbox
    elif isinstance(obj, Document):
        ...  # code to search a document
    elif ...
@end example

더 나은 접근법은 모든 클래스에서 @code{search()} 메서드를 정의하고 단지 그것을 호출하는 것입니다:

@example
class Mailbox:
    def search(self):
        ...  # code to search a mailbox

class Document:
    def search(self):
        ...  # code to search a document

obj.search()
@end example

@node 위임이란 무엇입니까?,How do I call a method defined in a base class from a derived class that extends it?,객체가 주어진 클래스나 그 서브 클래스의 인스턴스인지 어떻게 확인합니까?,객체
@anchor{faq/programming what-is-delegation}@anchor{5955}
@subsubsection 위임이란 무엇입니까?


Delegation is an object-oriented technique (also called a design pattern).
Let’s say you have an object @code{x} and want to change the behaviour of just one
of its methods.  You can create a new class that provides a new implementation
of the method you’re interested in changing and delegates all other methods to
the corresponding method of @code{x}.

파이썬 프로그래머는 쉽게 위임을 구현할 수 있습니다. 예를 들어, 다음 클래스는 파일처럼 동작하지만, 기록되는 모든 데이터를 대문자로 변환하는 클래스를 구현합니다:

@example
class UpperOut:

    def __init__(self, outfile):
        self._outfile = outfile

    def write(self, s):
        self._outfile.write(s.upper())

    def __getattr__(self, name):
        return getattr(self._outfile, name)
@end example

Here the @code{UpperOut} class redefines the @code{write()} method to convert the
argument string to uppercase before calling the underlying
@code{self._outfile.write()} method.  All other methods are delegated to the
underlying @code{self._outfile} object.  The delegation is accomplished via the
@ref{6f9,,__getattr__()} method; consult @ref{23af,,the language reference}
for more information about controlling attribute access.

Note that for more general cases delegation can get trickier. When attributes
must be set as well as retrieved, the class must define a @ref{2378,,__setattr__()}
method too, and it must do so carefully.  The basic implementation of
@code{__setattr__()} is roughly equivalent to the following:

@example
class X:
    ...
    def __setattr__(self, name, value):
        self.__dict__[name] = value
    ...
@end example

Many @ref{2378,,__setattr__()} implementations call @code{object.__setattr__()} to set
an attribute on self without causing infinite recursion:

@example
class X:
    def __setattr__(self, name, value):
        # Custom logic here...
        object.__setattr__(self, name, value)
@end example

Alternatively, it is possible to set attributes by inserting
entries into @ref{77c,,self.__dict__} directly.

@node How do I call a method defined in a base class from a derived class that extends it?,베이스 클래스를 쉽게 변경할 수 있도록 코드를 구성하려면 어떻게 해야 합니까?,위임이란 무엇입니까?,객체
@anchor{faq/programming how-do-i-call-a-method-defined-in-a-base-class-from-a-derived-class-that-extends-it}@anchor{5956}
@subsubsection How do I call a method defined in a base class from a derived class that extends it?


내장 @ref{1a6,,super()} 함수를 사용하십시오:

@example
class Derived(Base):
    def meth(self):
        super().meth()  # calls Base.meth
@end example

In the example, @ref{1a6,,super()} will automatically determine the instance from
which it was called (the @code{self} value), look up the @ref{25e0,,method resolution order} (MRO) with @code{type(self).__mro__}, and return the next in line after
@code{Derived} in the MRO: @code{Base}.

@node 베이스 클래스를 쉽게 변경할 수 있도록 코드를 구성하려면 어떻게 해야 합니까?,정적 클래스 데이터와 정적 클래스 메서드를 만들려면 어떻게 해야 합니까?,How do I call a method defined in a base class from a derived class that extends it?,객체
@anchor{faq/programming how-can-i-organize-my-code-to-make-it-easier-to-change-the-base-class}@anchor{5957}
@subsubsection 베이스 클래스를 쉽게 변경할 수 있도록 코드를 구성하려면 어떻게 해야 합니까?


You could assign the base class to an alias and derive from the alias.  Then all
you have to change is the value assigned to the alias.  Incidentally, this trick
is also handy if you want to decide dynamically (such as depending on availability
of resources) which base class to use.  Example:

@example
class Base:
    ...

BaseAlias = Base

class Derived(BaseAlias):
    ...
@end example

@node 정적 클래스 데이터와 정적 클래스 메서드를 만들려면 어떻게 해야 합니까?,파이썬에서 생성자 또는 메서드 를 어떻게 재정의할 수 있습니까?,베이스 클래스를 쉽게 변경할 수 있도록 코드를 구성하려면 어떻게 해야 합니까?,객체
@anchor{faq/programming how-do-i-create-static-class-data-and-static-class-methods}@anchor{5958}
@subsubsection 정적 클래스 데이터와 정적 클래스 메서드를 만들려면 어떻게 해야 합니까?


(C++나 Java의 의미에서) 정적 데이터와 정적 메서드 모두 파이썬에서 지원됩니다.

정적 데이터의 경우, 단순히 클래스 어트리뷰트를 정의하십시오. 어트리뷰트에 새 값을 대입하려면, 대입에서 클래스 이름을 명시적으로 사용해야 합니다:

@example
class C:
    count = 0   # number of times C.__init__ called

    def __init__(self):
        C.count = C.count + 1

    def getcount(self):
        return C.count  # or return self.count
@end example

@code{c} 자체나 @code{c.__class__}에서 @code{C}로 돌아가는 베이스 클래스 검색 경로에 놓인 일부 클래스에 의해 재정의되지 않는 한, @code{c.count}는 @code{isinstance(c, C)}가 성립하는 모든 @code{c}에 대해 @code{C.count}를 참조합니다.

주의: C의 메서드 내에서, @code{self.count = 42}와 같은 대입은 @code{self}의 자체 딕셔너리에 “count”라는 새롭고 관련이 없는 인스턴스를 만듭니다. 클래스 정적 데이터 이름의 재연결은 항상 메서드 내부에 있는지에 관계없이 클래스를 지정해야 합니다:

@example
C.count = 314
@end example

정적 메서드도 가능합니다:

@example
class C:
    @@staticmethod
    def static(arg1, arg2, arg3):
        # No 'self' parameter!
        ...
@end example

그러나, 정적 메서드의 효과를 얻는 훨씬 간단한 방법은 단순한 모듈 수준 함수를 사용하는 것입니다:

@example
def getcount():
    return C.count
@end example

여러분의 코드가 모듈 당 하나의 클래스 (또는 밀접하게 관련된 클래스 계층 구조)를 정의하도록 구조화되었다면, 이것이 원하는 캡슐화를 제공합니다.

@node 파이썬에서 생성자 또는 메서드 를 어떻게 재정의할 수 있습니까?,__spam을 사용하려고 하는데 _SomeClassName__spam에 대한 에러가 발생합니다,정적 클래스 데이터와 정적 클래스 메서드를 만들려면 어떻게 해야 합니까?,객체
@anchor{faq/programming how-can-i-overload-constructors-or-methods-in-python}@anchor{5959}
@subsubsection 파이썬에서 생성자(또는 메서드)를 어떻게 재정의할 수 있습니까?


이 답변은 실제로 모든 메서드에 적용되지만, 질문은 일반적으로 생성자 문맥에서 가장 먼저 나옵니다.

In C++ you’d write:

@example
class C @{
    C() @{ cout << "No arguments\n"; @}
    C(int i) @{ cout << "Argument is " << i << "\n"; @}
@}
@end example

파이썬에서는 기본 인자를 사용하여 모든 경우를 다루는 단일 생성자를 작성해야 합니다. 예를 들면:

@example
class C:
    def __init__(self, i=None):
        if i is None:
            print("No arguments")
        else:
            print("Argument is", i)
@end example

이것은 완전히 동등하지는 않지만, 실제로는 아주 가깝습니다.

You could also try a variable-length argument list, for example:

@example
def __init__(self, *args):
    ...
@end example

같은 접근법이 모든 메서드 정의에서도 동작합니다.

@node __spam을 사용하려고 하는데 _SomeClassName__spam에 대한 에러가 발생합니다,내 클래스는 __del__을 정의하지만 객체를 삭제할 때 호출되지 않습니다,파이썬에서 생성자 또는 메서드 를 어떻게 재정의할 수 있습니까?,객체
@anchor{faq/programming i-try-to-use-spam-and-i-get-an-error-about-someclassname-spam}@anchor{595a}
@subsubsection __spam을 사용하려고 하는데 _SomeClassName__spam에 대한 에러가 발생합니다.


이중 선행 밑줄이 있는 변수 이름은 클래스 비공개(private) 변수를 정의하는 간단하지만, 효과적인 방법을 제공하기 위해 “뒤섞입니다(mangled)”. @code{__spam} 형식(적어도 두 개의 선행 밑줄, 최대 하나의 후행 밑줄)의 모든 식별자는 @code{_classname__spam}으로 텍스트 대체되는데, 여기서 @code{classname} 은 모든 선행 밑줄이 제거된 현재 클래스 이름입니다.

The identifier can be used unchanged within the class, but to access it outside
the class, the mangled name must be used:

@example
class A:
    def __one(self):
        return 1
    def two(self):
        return 2 * self.__one()

class B(A):
    def three(self):
        return 3 * self._A__one()

four = 4 * A()._A__one()
@end example

In particular, this does not guarantee privacy since an outside user can still
deliberately access the private attribute; many Python programmers never bother
to use private variable names at all.


@subsubheading 더 보기


The @ref{20a1,,private name mangling specifications}
for details and special cases.


@node 내 클래스는 __del__을 정의하지만 객체를 삭제할 때 호출되지 않습니다,주어진 클래스의 모든 인스턴스 목록을 어떻게 얻습니까?,__spam을 사용하려고 하는데 _SomeClassName__spam에 대한 에러가 발생합니다,객체
@anchor{faq/programming my-class-defines-del-but-it-is-not-called-when-i-delete-the-object}@anchor{595b}
@subsubsection 내 클래스는 __del__을 정의하지만 객체를 삭제할 때 호출되지 않습니다.


몇 가지 가능한 이유가 있습니다.

The @ref{1b1d,,del} statement does not necessarily call @ref{11fc,,__del__()} – it simply
decrements the object’s reference count, and if this reaches zero
@code{__del__()} is called.

If your data structures contain circular links (for example, a tree where each child has
a parent reference and each parent has a list of children) the reference counts
will never go back to zero.  Once in a while Python runs an algorithm to detect
such cycles, but the garbage collector might run some time after the last
reference to your data structure vanishes, so your @code{__del__()} method may be
called at an inconvenient and random time. This is inconvenient if you’re trying
to reproduce a problem. Worse, the order in which object’s @code{__del__()}
methods are executed is arbitrary.  You can run @ref{1b3,,gc.collect()} to force a
collection, but there `are' pathological cases where objects will never be
collected.

Despite the cycle collector, it’s still a good idea to define an explicit
@code{close()} method on objects to be called whenever you’re done with them.  The
@code{close()} method can then remove attributes that refer to subobjects.  Don’t
call @code{__del__()} directly – @code{__del__()} should call @code{close()} and
@code{close()} should make sure that it can be called more than once for the same
object.

순환 참조를 피하는 또 다른 방법은 @ref{11a,,weakref} 모듈을 사용하는 것입니다. 이 모듈은 참조 횟수를 늘리지 않고 객체를 가리킬 수 있도록 합니다. 예를 들어, 트리 자료 구조는 부모와 형제 참조에 대해 약한 참조를 사용해야 합니다 (이런 것들이 필요하다면!).

@c XXX relevant for Python 3?
@c 
@c If the object has ever been a local variable in a function that caught an
@c expression in an except clause, chances are that a reference to the object
@c still exists in that function's stack frame as contained in the stack trace.
@c Normally, calling :func:`sys.exc_clear` will take care of this by clearing
@c the last recorded exception.

Finally, if your @code{__del__()} method raises an exception, a warning message
is printed to @ref{b33,,sys.stderr}.

@node 주어진 클래스의 모든 인스턴스 목록을 어떻게 얻습니까?,id 의 결과가 고유하지 않은 것처럼 보이는 이유는 무엇입니까?,내 클래스는 __del__을 정의하지만 객체를 삭제할 때 호출되지 않습니다,객체
@anchor{faq/programming how-do-i-get-a-list-of-all-instances-of-a-given-class}@anchor{595c}
@subsubsection 주어진 클래스의 모든 인스턴스 목록을 어떻게 얻습니까?


파이썬은 클래스(또는 내장형)의 모든 인스턴스를 추적하지 않습니다. 클래스 생성자가 각 인스턴스에 대한 약한 참조 리스트를 유지하여 모든 인스턴스를 추적하도록 프로그래밍 할 수 있습니다.

@node id 의 결과가 고유하지 않은 것처럼 보이는 이유는 무엇입니까?,is 연산자를 사용한 아이덴티티 검사는 언제 신뢰할 수 있습니까?,주어진 클래스의 모든 인스턴스 목록을 어떻게 얻습니까?,객체
@anchor{faq/programming why-does-the-result-of-id-appear-to-be-not-unique}@anchor{595d}
@subsubsection @code{id()}의 결과가 고유하지 않은 것처럼 보이는 이유는 무엇입니까?


@ref{1628,,id()} 내장은 객체 수명 동안 고유하도록 보장되는 정수를 반환합니다. CPython에서는 이것이 객체의 메모리 주소이므로, 객체가 메모리에서 삭제된 후 새로 만들어진 다음 객체가 메모리의 같은 위치에 할당되는 경우가 자주 발생합니다. 다음과 같이 예시할 수 있습니다:

@example
>>> id(1000)
13901272
>>> id(2000)
13901272
@end example

두 개의 id는 다른 정수 객체에 속하는데, @code{id()} 호출 실행 앞에 만들어지고, 호출 직후 삭제됩니다. id를 검사하려는 객체가 여전히 살아 있도록 하려면, 그 객체에 대한 다른 참조를 만드십시오:

@example
>>> a = 1000; b = 2000
>>> id(a)
13901272
>>> id(b)
13891296
@end example

@node is 연산자를 사용한 아이덴티티 검사는 언제 신뢰할 수 있습니까?,How can a subclass control what data is stored in an immutable instance?,id 의 결과가 고유하지 않은 것처럼 보이는 이유는 무엇입니까?,객체
@anchor{faq/programming faq-identity-with-is}@anchor{2480}@anchor{faq/programming when-can-i-rely-on-identity-tests-with-the-is-operator}@anchor{595e}
@subsubsection `is' 연산자를 사용한 아이덴티티 검사는 언제 신뢰할 수 있습니까?


@code{is} 연산자는 객체 아이덴티티를 검사합니다. 검사 @code{a is b}는 @code{id(a) == id(b)}와 동등합니다.

아이덴티티 검사의 가장 중요한 속성은 객체가 항상 자신과 동일하고 @code{a is a}는 항상 @code{True}를 반환한다는 것입니다. 아이덴티티 검사는 일반적으로 동등성 검사보다 빠릅니다. 동등성 검사와 달리, 아이덴티티 테스트는 불리언 @code{True}나 @code{False}를 반환함이 보장됩니다.

그러나, 객체 아이덴티티가 보장될 때 아이덴티티 검사가 동등성 검사를 대체할 수 있습니다. 일반적으로, 아이덴티티가 보장되는 세 가지 상황이 있습니다:


@enumerate 

@item 
Assignments create new names but do not change object identity.  After the
assignment @code{new = old}, it is guaranteed that @code{new is old}.

@item 
Putting an object in a container that stores object references does not
change object identity.  After the list assignment @code{s[0] = x}, it is
guaranteed that @code{s[0] is x}.

@item 
If an object is a singleton, it means that only one instance of that object
can exist.  After the assignments @code{a = None} and @code{b = None}, it is
guaranteed that @code{a is b} because @code{None} is a singleton.
@end enumerate

대부분의 다른 상황에서는 아이덴티티 검사가 권장되지 않으며 동등성 테스트가 선호됩니다. 특히, 싱글톤이 보장되지 않는 @ref{19b,,int}와 @ref{169,,str}과 같은 상수를 확인하는 데 아이덴티티 검사를 사용해서는 안 됩니다:

@example
>>> a = 10_000_000
>>> b = 5_000_000
>>> c = b + 5_000_000
>>> a is c
False

>>> a = 'Python'
>>> b = 'Py'
>>> c = b + 'thon'
>>> a is c
False
@end example

마찬가지로, 가변 컨테이너의 새 인스턴스는 절대 동일하지 않습니다:

@example
>>> a = []
>>> b = []
>>> a is b
False
@end example

표준 라이브러리 코드에서, 아이덴티티 검사를 올바르게 사용하는 몇 가지 일반적인 패턴을 볼 수 있습니다:


@enumerate 

@item 
As recommended by 
@geindex Python 향상 제안; PEP 8
PEP 8@footnote{https://peps.python.org/pep-0008/}, an identity test is the preferred way to check
for @code{None}.  This reads like plain English in code and avoids confusion
with other objects that may have boolean values that evaluate to false.

@item 
Detecting optional arguments can be tricky when @code{None} is a valid input
value.  In those situations, you can create a singleton sentinel object
guaranteed to be distinct from other objects.  For example, here is how
to implement a method that behaves like @ref{5e4,,dict.pop()}:

@example
_sentinel = object()

def pop(self, key, default=_sentinel):
    if key in self:
        value = self[key]
        del self[key]
        return value
    if default is _sentinel:
        raise KeyError(key)
    return default
@end example

@item 
Container implementations sometimes need to augment equality tests with
identity tests.  This prevents the code from being confused by objects
such as @code{float('NaN')} that are not equal to themselves.
@end enumerate

For example, here is the implementation of
@code{collections.abc.Sequence.__contains__()}:

@example
def __contains__(self, value):
    for v in self:
        if v is value or v == value:
            return True
    return False
@end example

@node How can a subclass control what data is stored in an immutable instance?,How do I cache method calls?,is 연산자를 사용한 아이덴티티 검사는 언제 신뢰할 수 있습니까?,객체
@anchor{faq/programming how-can-a-subclass-control-what-data-is-stored-in-an-immutable-instance}@anchor{595f}
@subsubsection How can a subclass control what data is stored in an immutable instance?


When subclassing an immutable type, override the @ref{79f,,__new__()} method
instead of the @ref{8be,,__init__()} method.  The latter only runs `after' an
instance is created, which is too late to alter data in an immutable
instance.

All of these immutable classes have a different signature than their
parent class:

@example
import datetime as dt

class FirstOfMonthDate(dt.date):
    "Always choose the first day of the month"
    def __new__(cls, year, month, day):
        return super().__new__(cls, year, month, 1)

class NamedInt(int):
    "Allow text names for some numbers"
    xlat = @{'zero': 0, 'one': 1, 'ten': 10@}
    def __new__(cls, value):
        value = cls.xlat.get(value, value)
        return super().__new__(cls, value)

class TitleStr(str):
    "Convert str to name suitable for a URL path"
    def __new__(cls, s):
        s = s.lower().replace(' ', '-')
        s = '@w{'}.join([c for c in s if c.isalnum() or c == '-'])
        return super().__new__(cls, s)
@end example

The classes can be used like this:

@example
>>> FirstOfMonthDate(2012, 2, 14)
FirstOfMonthDate(2012, 2, 1)
>>> NamedInt('ten')
10
>>> NamedInt(20)
20
>>> TitleStr('Blog: Why Python Rocks')
'blog-why-python-rocks'
@end example

@node How do I cache method calls?,,How can a subclass control what data is stored in an immutable instance?,객체
@anchor{faq/programming faq-cache-method-calls}@anchor{2bd6}@anchor{faq/programming how-do-i-cache-method-calls}@anchor{5960}
@subsubsection How do I cache method calls?


The two principal tools for caching methods are
@ref{762,,functools.cached_property()} and @ref{be1,,functools.lru_cache()}.  The
former stores results at the instance level and the latter at the class
level.

The @code{cached_property} approach only works with methods that do not take
any arguments.  It does not create a reference to the instance.  The
cached method result will be kept only as long as the instance is alive.

The advantage is that when an instance is no longer used, the cached
method result will be released right away.  The disadvantage is that if
instances accumulate, so too will the accumulated method results.  They
can grow without bound.

The @code{lru_cache} approach works with methods that have @ref{823,,hashable}
arguments.  It creates a reference to the instance unless special
efforts are made to pass in weak references.

The advantage of the least recently used algorithm is that the cache is
bounded by the specified `maxsize'.  The disadvantage is that instances
are kept alive until they age out of the cache or until the cache is
cleared.

This example shows the various techniques:

@example
class Weather:
    "Lookup weather information on a government website"

    def __init__(self, station_id):
        self._station_id = station_id
        # The _station_id is private and immutable

    def current_temperature(self):
        "Latest hourly observation"
        # Do not cache this because old results
        # can be out of date.

    @@cached_property
    def location(self):
        "Return the longitude/latitude coordinates of the station"
        # Result only depends on the station_id

    @@lru_cache(maxsize=20)
    def historic_rainfall(self, date, units='mm'):
        "Rainfall on a given date"
        # Depends on the station_id, date, and units.
@end example

The above example assumes that the `station_id' never changes.  If the
relevant instance attributes are mutable, the @code{cached_property} approach
can’t be made to work because it cannot detect changes to the
attributes.

To make the @code{lru_cache} approach work when the `station_id' is mutable,
the class needs to define the @ref{cf1,,__eq__()} and @ref{cf2,,__hash__()}
methods so that the cache can detect relevant attribute updates:

@example
class Weather:
    "Example with a mutable station identifier"

    def __init__(self, station_id):
        self.station_id = station_id

    def change_station(self, station_id):
        self.station_id = station_id

    def __eq__(self, other):
        return self.station_id == other.station_id

    def __hash__(self):
        return hash(self.station_id)

    @@lru_cache(maxsize=20)
    def historic_rainfall(self, date, units='cm'):
        'Rainfall on a given date'
        # Depends on the station_id, date, and units.
@end example

@node 모듈<3>,,객체,프로그래밍 FAQ
@anchor{faq/programming modules}@anchor{5961}
@subsection 모듈


@menu
* .pyc 파일을 어떻게 만듭니까?: pyc 파일을 어떻게 만듭니까?. 
* 현재 모듈 이름을 어떻게 찾습니까?:: 
* 서로 임포트 하는 모듈을 어떻게 만들 수 있습니까?:: 
* __import__(‘x.y.z’)는 <module ‘x’>를 반환합니다; z를 어떻게 얻습니까?: __import__ ‘x y z’ 는 <module ‘x’>를 반환합니다; z를 어떻게 얻습니까?. 
* 임포트 된 모듈을 편집하고 다시 임포트 할 때@comma{} 변경 사항이 표시되지 않습니다. 왜 이런 일이 발생합니까?: 임포트 된 모듈을 편집하고 다시 임포트 할 때 변경 사항이 표시되지 않습니다 왜 이런 일이 발생합니까?. 

@end menu

@node pyc 파일을 어떻게 만듭니까?,현재 모듈 이름을 어떻게 찾습니까?,,모듈<3>
@anchor{faq/programming how-do-i-create-a-pyc-file}@anchor{5962}
@subsubsection .pyc 파일을 어떻게 만듭니까?


모듈이 처음 임포트 될 때 (또는 현재 컴파일된 파일이 만들어진 후 소스 파일이 변경되었을 때) 컴파일된 코드를 포함하는 @code{.pyc} 파일은 @code{.py} 파일을 포함하는 디렉터리의 @code{__pycache__} 서브 디렉터리에 만들어져야 합니다. @code{.pyc} 파일은 @code{.py} 파일과 같은 이름으로 시작하고, @code{.pyc}로 끝나며, 파일을 만든 특정 @code{python} 바이너리 파일에 종속되는 중간 구성 요소를 갖는 파일명을 갖습니다. (자세한 내용은 
@geindex Python 향상 제안; PEP 3147
PEP 3147@footnote{https://peps.python.org/pep-3147/}을 참조하십시오.)

@code{.pyc} 파일이 만들어지지 않을 수 있는 한 가지 이유는 소스 파일이 포함된 디렉터리의 권한 문제입니다. 즉, @code{__pycache__} 서브 디렉터리를 만들 수 없다는 뜻입니다. 예를 들어, 한 사용자로 개발했지만 다른 사용자로 실행하는 경우에 이런 일이 일어날 수 있습니다, 가령 웹 서버로 테스트하고 있을 때입니다.

Unless the 
@geindex PYTHONDONTWRITEBYTECODE
@geindex 환경 변수; PYTHONDONTWRITEBYTECODE
@ref{15d3,,PYTHONDONTWRITEBYTECODE} environment variable is set,
creation of a .pyc file is automatic if you’re importing a module and Python
has the ability (permissions, free space, and so on) to create a @code{__pycache__}
subdirectory and write the compiled module to that subdirectory.

Running Python on a top-level script is not considered an import and no
@code{.pyc} will be created.  For example, if you have a top-level module
@code{foo.py} that imports another module @code{xyz.py}, when you run @code{foo} (by
typing @code{python foo.py} as a shell command), a @code{.pyc} will be created for
@code{xyz} because @code{xyz} is imported, but no @code{.pyc} file will be created for
@code{foo} since @code{foo.py} isn’t being imported.

@code{foo}에 대한 @code{.pyc} 파일을 만들 필요가 있으면 – 즉, 임포트 되지 않는 모듈에 대한 @code{.pyc} 파일을 만들려면 – @ref{b8,,py_compile}과 @ref{21,,compileall} 모듈을 사용할 수 있습니다.

@ref{b8,,py_compile} 모듈은 임의의 모듈을 수동으로 컴파일할 수 있습니다. 한 가지 방법은 해당 모듈에서 @code{compile()} 함수를 대화식으로 사용하는 것입니다:

@example
>>> import py_compile
>>> py_compile.compile('foo.py')
@end example

This will write the @code{.pyc} to a @code{__pycache__} subdirectory in the same
location as @code{foo.py} (or you can override that with the optional parameter
`cfile').

@ref{21,,compileall} 모듈을 사용하여 디렉터리의 모든 파일을 자동으로 컴파일할 수도 있습니다. @code{compileall.py}를 실행하고 컴파일할 파이썬 파일이 포함된 디렉터리의 경로를 제공하여 셸 프롬프트에서 이를 수행할 수 있습니다:

@example
python -m compileall .
@end example

@node 현재 모듈 이름을 어떻게 찾습니까?,서로 임포트 하는 모듈을 어떻게 만들 수 있습니까?,pyc 파일을 어떻게 만듭니까?,모듈<3>
@anchor{faq/programming how-do-i-find-the-current-module-name}@anchor{5963}
@subsubsection 현재 모듈 이름을 어떻게 찾습니까?


모듈은 사전 정의된 전역 변수 @code{__name__}을 봄으로써 모듈 자신의 이름을 찾을 수 있습니다. 값이 @code{'__main__'}이면, 프로그램이 스크립트로 실행 중입니다. 일반적으로 모듈을 임포트 해서 사용하는 많은 모듈은 명령 줄 인터페이스나 자체 테스트를 제공하며, @code{__name__}을 확인한 후에 만 이 코드를 실행합니다:

@example
def main():
    print('Running test...')
    ...

if __name__ == '__main__':
    main()
@end example

@node 서로 임포트 하는 모듈을 어떻게 만들 수 있습니까?,__import__ ‘x y z’ 는 <module ‘x’>를 반환합니다; z를 어떻게 얻습니까?,현재 모듈 이름을 어떻게 찾습니까?,모듈<3>
@anchor{faq/programming how-can-i-have-modules-that-mutually-import-each-other}@anchor{5964}
@subsubsection 서로 임포트 하는 모듈을 어떻게 만들 수 있습니까?


다음 모듈이 있다고 가정하십시오:

@code{foo.py}:

@example
from bar import bar_var
foo_var = 1
@end example

@code{bar.py}:

@example
from foo import foo_var
bar_var = 2
@end example

문제는 인터프리터가 다음 단계를 수행한다는 것입니다:


@itemize *

@item 
main imports @code{foo}

@item 
Empty globals for @code{foo} are created

@item 
@code{foo} is compiled and starts executing

@item 
@code{foo} imports @code{bar}

@item 
Empty globals for @code{bar} are created

@item 
@code{bar} is compiled and starts executing

@item 
@code{bar} imports @code{foo} (which is a no-op since there already is a module named @code{foo})

@item 
The import mechanism tries to read @code{foo_var} from @code{foo} globals, to set @code{bar.foo_var = foo.foo_var}
@end itemize

마지막 단계가 실패합니다. 파이썬이 아직 @code{foo}를 인터프리트 하는 것을 완료하지 않았고 @code{foo}의 전역 기호 딕셔너리가 여전히 비어 있기 때문입니다.

@code{import foo}를 사용하고 전역 코드에서 @code{foo.foo_var}에 액세스하려고 할 때도 같은 일이 일어납니다.

이 문제에 대해 가능한 (최소한) 세 가지 해결 방법이 있습니다.

Guido van Rossum은 @code{from <module> import ...}을 아예 사용하지 말고, 모든 코드를 함수 내에 배치할 것을 권장합니다. 전역 변수와 클래스 변수의 초기화는 상수나 내장 함수만 사용해야 합니다. 이것은 임포트 된 모듈의 모든 것이 @code{<module>.<name>}으로 참조됨을 의미합니다.

Jim Roskind는 각 모듈에서 다음 순서로 단계를 수행할 것을 제안합니다:


@itemize *

@item 
내보내기 (전역, 함수 및 베이스 클래스를 임포트 할 필요가 없는 클래스)

@item 
@code{import} 문

@item 
활성 코드 (임포트 된 값에서 초기화된 전역 포함).
@end itemize

Van Rossum doesn’t like this approach much because the imports appear in a
strange place, but it does work.

Matthias Urlichs는 처음부터 재귀 임포트가 필요하지 않도록 코드를 재구성할 것을 권합니다.

이 해결 방법들은 상호 배타적이지 않습니다.

@node __import__ ‘x y z’ 는 <module ‘x’>를 반환합니다; z를 어떻게 얻습니까?,임포트 된 모듈을 편집하고 다시 임포트 할 때 변경 사항이 표시되지 않습니다 왜 이런 일이 발생합니까?,서로 임포트 하는 모듈을 어떻게 만들 수 있습니까?,모듈<3>
@anchor{faq/programming import-x-y-z-returns-module-x-how-do-i-get-z}@anchor{5965}
@subsubsection __import__(‘x.y.z’)는 <module ‘x’>를 반환합니다; z를 어떻게 얻습니까?


@ref{7b,,importlib}의 편의 함수 @ref{73b,,import_module()}을 대신 사용하는 곳을 고려하십시오:

@example
z = importlib.import_module('x.y.z')
@end example

@node 임포트 된 모듈을 편집하고 다시 임포트 할 때 변경 사항이 표시되지 않습니다 왜 이런 일이 발생합니까?,,__import__ ‘x y z’ 는 <module ‘x’>를 반환합니다; z를 어떻게 얻습니까?,모듈<3>
@anchor{faq/programming when-i-edit-an-imported-module-and-reimport-it-the-changes-don-t-show-up-why-does-this-happen}@anchor{5966}
@subsubsection 임포트 된 모듈을 편집하고 다시 임포트 할 때, 변경 사항이 표시되지 않습니다. 왜 이런 일이 발생합니까?


효율성뿐만 아니라 일관성의 이유로, 파이썬은 모듈을 처음 임포트 할 때만 모듈 파일을 읽습니다. 그렇지 않으면, 각 모듈이 같은 기본 모듈을 임포트 하는 많은 모듈로 구성된 프로그램에서, 기본 모듈을 여러 번 구문 분석하고 다시 구문 분석하게 됩니다. 변경된 모듈을 강제로 다시 읽으려면, 다음과 같이 하십시오:

@example
import importlib
import modname
importlib.reload(modname)
@end example

Warning: this technique is not 100% fool-proof.  In particular, modules
containing statements like:

@example
from modname import some_objects
@end example

임포트 된 객체의 이전 버전으로 계속 작업합니다. 모듈에 클래스 정의가 포함되면, 새 클래스 정의를 사용하도록 기존 클래스 인스턴스가 갱신되지 `않습니다'. 이것은 다음과 같은 역설적인 동작으로 이어집니다:

@example
>>> import importlib
>>> import cls
>>> c = cls.C()                # Create an instance of C
>>> importlib.reload(cls)
<module 'cls' from 'cls.py'>
>>> isinstance(c, cls.C)       # isinstance is false?!?
False
@end example

클래스 객체의 “아이덴티티”를 인쇄하면 문제의 본질이 분명해집니다:

@example
>>> hex(id(c.__class__))
'0x7352a0'
>>> hex(id(cls.C))
'0x4198d0'
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 설계와 역사 FAQ,라이브러리와 확장 FAQ,프로그래밍 FAQ,파이썬 자주 나오는 질문들
@anchor{faq/design doc}@anchor{5967}@anchor{faq/design design-and-history-faq}@anchor{5968}@anchor{faq/design translation-repo}@anchor{5969}
@section 설계와 역사 FAQ



@menu
* 파이썬은 왜 문장의 그룹화에 들여쓰기를 사용합니까?:: 
* 간단한 산술 연산으로 이상한 결과가 나오는 이유는 무엇입니까?:: 
* 부동 소수점 계산이 왜 그렇게 부정확합니까?:: 
* 파이썬 문자열이 불변인 이유는 무엇입니까?:: 
* 메서드 정의와 호출에서 ‘self’를 명시적으로 사용해야 하는 이유는 무엇입니까?:: 
* 표현식에서 대입을 사용할 수 없는 이유는 무엇입니까?:: 
* 파이썬은 왜 일부 기능(예를 들어 list.index())에는 메서드를 사용하고 다른 기능(예를 들어 len(list))에는 함수를 사용합니까?: 파이썬은 왜 일부 기능 예를 들어 list index 에는 메서드를 사용하고 다른 기능 예를 들어 len list 에는 함수를 사용합니까?. 
* join()이 리스트나 튜플 메서드가 아니라 문자열 메서드인 이유는 무엇입니까?: join 이 리스트나 튜플 메서드가 아니라 문자열 메서드인 이유는 무엇입니까?. 
* 예외는 얼마나 빠릅니까?:: 
* 파이썬에 switch 나 case 문이 없는 이유는 무엇입니까?:: 
* OS별 스레드 구현에 의존하는 대신 인터프리터에서 스레드를 에뮬레이션할 수 없습니까?:: 
* 람다 표현식이 문장을 포함할 수 없는 이유는 무엇입니까?:: 
* 파이썬을 기계 코드@comma{} C 또는 다른 언어로 컴파일 할 수 있습니까?: 파이썬을 기계 코드 C 또는 다른 언어로 컴파일 할 수 있습니까?. 
* 파이썬은 메모리를 어떻게 관리합니까?:: 
* CPython이 더 전통적인 가비지 수거 체계를 사용하지 않는 이유는 무엇입니까?:: 
* CPython이 종료될 때 모든 메모리가 해제되지 않는 이유는 무엇입니까?:: 
* 별도의 튜플과 리스트 데이터형이 있는 이유는 무엇입니까?:: 
* CPython에서 리스트는 어떻게 구현됩니까?:: 
* CPython에서 딕셔너리는 어떻게 구현됩니까?:: 
* 딕셔너리 키가 불변이어야 하는 이유는 무엇입니까?:: 
* list.sort()가 정렬된 리스트를 반환하지 않는 이유는 무엇입니까?: list sort 가 정렬된 리스트를 반환하지 않는 이유는 무엇입니까?. 
* 파이썬에서 인터페이스 명세를 어떻게 지정하고 강제합니까?:: 
* goto가 없는 이유는 무엇입니까?:: 
* 날 문자열(r-strings)이 역 슬래시로 끝날 수 없는 이유는 무엇입니까?: 날 문자열 r-strings 이 역 슬래시로 끝날 수 없는 이유는 무엇입니까?. 
* 왜 파이썬에는 어트리뷰트 대입을 위한 “with” 문이 없습니까?:: 
* Why don’t generators support the with statement?:: 
* if/while/def/class 문에 콜론이 필요한 이유는 무엇입니까?:: 
* 파이썬은 왜 리스트와 튜플 끝에 쉼표를 허용합니까?:: 

@end menu

@node 파이썬은 왜 문장의 그룹화에 들여쓰기를 사용합니까?,간단한 산술 연산으로 이상한 결과가 나오는 이유는 무엇입니까?,,설계와 역사 FAQ
@anchor{faq/design why-does-python-use-indentation-for-grouping-of-statements}@anchor{596a}
@subsection 파이썬은 왜 문장의 그룹화에 들여쓰기를 사용합니까?


Guido van Rossum은 그룹화에 들여쓰기를 사용하는 것이 매우 우아하고 일반적인 파이썬 프로그램의 명확성에 크게 기여한다고 믿습니다. 대부분의 사람은 시간이 좀 흐른 후에 이 기능을 사랑하는 법을 배웁니다.

시작/끝 괄호가 없기 때문에 구문 분석기와 사람 독자가 인식하는 그룹 간에 불일치가 있을 수 없습니다. 때때로 C 프로그래머는 다음과 같은 코드 조각을 만나게 됩니다:

@example
if (x <= y)
        x++;
        y--;
z++;
@end example

조건이 참이면 @code{x++} 문만 실행되지만, 들여쓰기는 많은 사람이 그렇지 않다고 믿게 만듭니다. 경험 많은 C 프로그래머조차도 @code{x > y}일 때도 @code{y}가 감소하는 이유를 궁금해하면서 오래 들여다볼 때가 있습니다.

시작/끝 괄호가 없기 때문에, 파이썬은 코딩 스타일 충돌이 훨씬 적습니다. C에서는 중괄호를 배치하는 여러 가지 방법이 있습니다. 특정 스타일을 사용하여 코드를 읽고 쓰는 데 익숙해지면, 다른 스타일로 읽을 (또는 작성해야 할) 때 다소 불편함을 느끼는 것은 정상입니다.

많은 코딩 스타일은 시작/끝 괄호를 그 자신만의 줄에 배치합니다. 이로 인해 프로그램이 상당히 길어지고 귀중한 화면 공간이 낭비되어, 프로그램을 조망하기가 더 어려워집니다. 이상적으로는, 함수가 한 화면에 맞아야 합니다 (가령, 20–30줄). 20줄의 파이썬은 C의 20줄보다 훨씬 더 많은 작업을 수행할 수 있습니다. 이것은 시작/끝 괄호가 필요 없기 때문 만은 아닙니다만 – 선언이 없는 것과 고수준의 데이터형도 기여합니다 – 들여쓰기 기반 문법은 확실히 도움이 됩니다.

@node 간단한 산술 연산으로 이상한 결과가 나오는 이유는 무엇입니까?,부동 소수점 계산이 왜 그렇게 부정확합니까?,파이썬은 왜 문장의 그룹화에 들여쓰기를 사용합니까?,설계와 역사 FAQ
@anchor{faq/design why-am-i-getting-strange-results-with-simple-arithmetic-operations}@anchor{596b}
@subsection 간단한 산술 연산으로 이상한 결과가 나오는 이유는 무엇입니까?


다음 질문을 보십시오.

@node 부동 소수점 계산이 왜 그렇게 부정확합니까?,파이썬 문자열이 불변인 이유는 무엇입니까?,간단한 산술 연산으로 이상한 결과가 나오는 이유는 무엇입니까?,설계와 역사 FAQ
@anchor{faq/design why-are-floating-point-calculations-so-inaccurate}@anchor{596c}
@subsection 부동 소수점 계산이 왜 그렇게 부정확합니까?


사용자는 종종 다음과 같은 결과에 놀라게 됩니다:

@example
>>> 1.2 - 1.0
0.19999999999999996
@end example

그리고 이것을 파이썬의 버그라고 생각합니다. 그렇지 않습니다. 이것은 파이썬과 거의 관련이 없으며, 하부 플랫폼이 부동 소수점 숫자를 처리하는 방법과 훨씬 더 관련이 있습니다.

CPython의 @ref{196,,float} 형은 저장을 위해 C @code{double}을 사용합니다. @code{float} 객체의 값은 고정 정밀도(일반적으로 53비트)의 이진 부동 소수점에 저장되고 파이썬은 부동 소수점 연산을 수행하는 데 C 연산을 사용하며, 이는 다시 프로세서의 하드웨어 구현에 의존합니다. 즉, 부동 소수점 연산에 관한 한, 파이썬은 C와 Java를 포함한 많은 널리 알려진 언어들처럼 작동합니다.

십진 표기법으로 쉽게 쓸 수 있는 많은 숫자가 이진 부동 소수점으로는 정확하게 표현할 수 없습니다. 예를 들어,:

@example
>>> x = 1.2
@end example

이후에, @code{x}에 대해 저장된 값은 10진수 값 @code{1.2}에 대한 (매우 좋은) 근사치이지만, 정확히 같지는 않습니다. 일반적인 기계에서 실제 저장되는 값은 다음과 같습니다:

@example
1.0011001100110011001100110011001100110011001100110011 (이진수)
@end example

이것은 정확하게는 다음과 같습니다:

@example
1.1999999999999999555910790149937383830547332763671875 (십진수)
@end example

53비트의 일반적인 정밀도는 파이썬 부동 소수점에 15–16자리의 10진수 정확도를 제공합니다.

자세한 설명은, 파이썬 자습서의 @ref{20fe,,부동 소수점 산술} 장을 참조하십시오.

@node 파이썬 문자열이 불변인 이유는 무엇입니까?,메서드 정의와 호출에서 ‘self’를 명시적으로 사용해야 하는 이유는 무엇입니까?,부동 소수점 계산이 왜 그렇게 부정확합니까?,설계와 역사 FAQ
@anchor{faq/design why-are-python-strings-immutable}@anchor{596d}
@subsection 파이썬 문자열이 불변인 이유는 무엇입니까?


몇 가지 장점이 있습니다.

하나는 성능입니다: 문자열이 불변임을 안다는 것은 만들 때 이를 위한 공간을 할당할 수 있다는 것을 의미하며, 스토리지 요구 사항은 고정되고 변경되지 않습니다. 이것은 또한 튜플과 리스트를 구분하는 이유 중 하나입니다.

또 다른 장점은 파이썬의 문자열을 숫자만큼 “기본적”으로 간주한다는 것입니다. 어떤 방법도 값 8을 다른 것으로 변경하지 않으며, 파이썬에서는 어떤 방법도 문자열 “eight”을 다른 것으로 변경하지 않습니다.

@node 메서드 정의와 호출에서 ‘self’를 명시적으로 사용해야 하는 이유는 무엇입니까?,표현식에서 대입을 사용할 수 없는 이유는 무엇입니까?,파이썬 문자열이 불변인 이유는 무엇입니까?,설계와 역사 FAQ
@anchor{faq/design why-must-self-be-used-explicitly-in-method-definitions-and-calls}@anchor{596e}@anchor{faq/design why-self}@anchor{5953}
@subsection 메서드 정의와 호출에서 ‘self’를 명시적으로 사용해야 하는 이유는 무엇입니까?


아이디어는 Modula-3에서 빌렸습니다. 여러 가지 이유로 매우 유용합니다.

첫째, 로컬 변수 대신 메서드나 인스턴스 어트리뷰트를 사용하고 있다는 것이 더 분명합니다. @code{self.x}나 @code{self.meth()}를 읽으면 클래스 정의를 기억하지  못하더라도 인스턴스 변수나 메서드가 사용된다는 것을 분명히 알 수 있습니다. C++에서는, 지역 변수 선언이 없는 것으로 구분할 수 있습니다 (전역은 드물거나 쉽게 인식할 수 있다고 가정할 때) – 하지만 파이썬에서는, 지역 변수 선언이 없어서, 확실히 하려면 클래스 정의를 찾아야 합니다. 일부 C++와 Java 코딩 표준에서는 인스턴스 어트리뷰트에 @code{m_} 접두어를 요청합니다, 따라서 이러한 명시성은 이런 언어들에서도 여전히 유용합니다.

둘째, 특정 클래스에서 메서드를 명시적으로 참조하거나 호출하려고 할 때 특별한 문법이 필요하지 않음을 의미합니다. C++에서, 파생 클래스에서 재정의된 베이스 클래스의 메서드를 사용하려면, @code{::} 연산자를 사용해야 합니다 – 파이썬에서는 @code{baseclass.methodname(self, <argument list>)}라고 쓸 수 있습니다. 이것은 @ref{8be,,__init__()} 메서드에, 일반적으로 파생 클래스 메서드가 같은 이름의 베이스 클래스 메서드를 확장하려고 해서 어떻게든 베이스 클래스 메서드를 호출해야 하는 경우에 특히 유용합니다.

마지막으로, 인스턴스 변수의 경우 대입과 관련된 문법 문제를 해결합니다: 파이썬의 지역 변수는 (정의상!) 함수 본문에서 값이 대입되는 (그리고 전역으로 명시적으로 선언되지 않은) 변수이기 때문에, 인터프리터에게 대입이 지역 변수가 아니라 인스턴스 변수에 대한 대입이라는 것을 알릴 방법이 있어야 하고, (효율성의 측면에서) 구문적이면 좋습니다. C++는 선언을 통해 이 작업을 수행하지만, 파이썬에는 선언이 없어서 이러한 목적으로만 문법을 도입해야 하는 것은 유감입니다. 명시적 @code{self.var}를 사용하면 이 문제가 잘 해결됩니다. 마찬가지로, 인스턴스 변수를 사용하는 경우, @code{self.var}라고 써야 한다는 것은, 메서드 내에서 정규화되지 않은 이름에 대한 참조가 인스턴스의 디렉터리를 검색할 필요가 없음을 의미합니다. 다시 말해, 지역 변수와 인스턴스 변수는 두 개의 서로 다른 이름 공간에 있으며, 사용할 이름 공간을 파이썬에 알려야 합니다.

@node 표현식에서 대입을 사용할 수 없는 이유는 무엇입니까?,파이썬은 왜 일부 기능 예를 들어 list index 에는 메서드를 사용하고 다른 기능 예를 들어 len list 에는 함수를 사용합니까?,메서드 정의와 호출에서 ‘self’를 명시적으로 사용해야 하는 이유는 무엇입니까?,설계와 역사 FAQ
@anchor{faq/design id2}@anchor{596f}@anchor{faq/design why-can-t-i-use-an-assignment-in-an-expression}@anchor{2036}
@subsection 표현식에서 대입을 사용할 수 없는 이유는 무엇입니까?


파이썬 3.8부터, 가능합니다!

바다코끼리(walrus) 연산자 @code{:=}를 사용하는 대입 표현식은 표현식에 있는 변수를 대입합니다:

@example
while chunk := fp.read(200):
   print(chunk)
@end example

자세한 정보는 
@geindex Python 향상 제안; PEP 572
PEP 572@footnote{https://peps.python.org/pep-0572/}를 참조하십시오.

@node 파이썬은 왜 일부 기능 예를 들어 list index 에는 메서드를 사용하고 다른 기능 예를 들어 len list 에는 함수를 사용합니까?,join 이 리스트나 튜플 메서드가 아니라 문자열 메서드인 이유는 무엇입니까?,표현식에서 대입을 사용할 수 없는 이유는 무엇입니까?,설계와 역사 FAQ
@anchor{faq/design why-does-python-use-methods-for-some-functionality-e-g-list-index-but-functions-for-other-e-g-len-list}@anchor{5970}
@subsection 파이썬은 왜 일부 기능(예를 들어 list.index())에는 메서드를 사용하고 다른 기능(예를 들어 len(list))에는 함수를 사용합니까?


Guido가 말했듯이:

@quotation

(a) For some operations, prefix notation just reads better than
postfix – prefix (and infix!) operations have a long tradition in
mathematics which likes notations where the visuals help the
mathematician thinking about a problem. Compare the easy with which we
rewrite a formula like x*(a+b) into x*a + x*b to the clumsiness of
doing the same thing using a raw OO notation.

(b) When I read code that says len(x) I `know' that it is asking for
the length of something. This tells me two things: the result is an
integer, and the argument is some kind of container. To the contrary,
when I read x.len(), I have to already know that x is some kind of
container implementing an interface or inheriting from a class that
has a standard len(). Witness the confusion we occasionally have when
a class that is not implementing a mapping has a get() or keys()
method, or something that isn’t a file has a write() method.


@center --- @indicateurl{https://mail.python.org/pipermail/python-3000/2006-November/004643.html}

@end quotation

@node join 이 리스트나 튜플 메서드가 아니라 문자열 메서드인 이유는 무엇입니까?,예외는 얼마나 빠릅니까?,파이썬은 왜 일부 기능 예를 들어 list index 에는 메서드를 사용하고 다른 기능 예를 들어 len list 에는 함수를 사용합니까?,설계와 역사 FAQ
@anchor{faq/design why-is-join-a-string-method-instead-of-a-list-or-tuple-method}@anchor{5971}
@subsection join()이 리스트나 튜플 메서드가 아니라 문자열 메서드인 이유는 무엇입니까?


항상 string 모듈의 함수를 사용하여 제공되었던 것과 같은 기능을 제공하는 메서드가 추가된, 파이썬 1.6부터 문자열은 다른 표준형과 훨씬 더 비슷해졌습니다. 이러한 새로운 메서드의 대부분은 널리 받아들여졌지만, 일부 프로그래머가 불편해하는 것은 다음과 같습니다:

@example
", ".join(['1', '2', '4', '8', '16'])
@end example

이것은 다음과 같은 결과를 제공합니다:

@example
"1, 2, 4, 8, 16"
@end example

이 사용법에 대해 두 가지 자주 나오는 반론이 있습니다.

첫 번째는 “문자열 리터럴(문자열 상수)의 메서드를 사용하는 것이 정말 보기 흉합니다”라는 줄이 따라옵니다. 이에 대한 대답은 그럴 수 있지만, 문자열 리터럴은 그저 고정된 값일 뿐이라는 것입니다. 메서드가 문자열에 연결된 이름에 허용된다면, 리터럴에서 사용할 수 없게 만드는 논리적 이유가 없습니다.

두 번째 이의는 보통 다음과 같이 표현됩니다: “나는 시퀀스가 멤버를 문자열 상수로 연결하라고 말하고 있습니다”. 슬프게도, 당신은 그렇지 않습니다. 어떤 이유로 @ref{10a9,,split()}를 문자열 메서드로 사용하는 데 훨씬 덜 어려움을 겪는 것 같습니다, 그럴 때 다음과 같은 표현이

@example
"1, 2, 4, 8, 16".split(", ")
@end example

문자열 리터럴에게 주어진 구분자(또는, 기본적으로, 임의의 공백 연속)로 구분된 하위 문자열을 반환하도록 하는 명령임을 쉽게 알 수 있기 때문입니다.

@ref{260a,,join()}은 문자열 메서드입니다. 사용 시 구분자 문자열에게 문자열 시퀀스를 이터레이트 하고 인접한 요소 사이에 자신을 삽입하도록 지시하기 때문입니다. 이 메서드는 사용자가 직접 정의할 수 있는 새 클래스를 포함하여, 시퀀스 객체에 대한 규칙을 따르는 모든 인자와 함께 사용할 수 있습니다. 바이트열과 bytearray 객체에 대해 유사한 메서드가 존재합니다.

@node 예외는 얼마나 빠릅니까?,파이썬에 switch 나 case 문이 없는 이유는 무엇입니까?,join 이 리스트나 튜플 메서드가 아니라 문자열 메서드인 이유는 무엇입니까?,설계와 역사 FAQ
@anchor{faq/design how-fast-are-exceptions}@anchor{5972}
@subsection 예외는 얼마나 빠릅니까?


예외가 발생하지 않으면 @ref{8f7,,try}/@ref{1ab,,except} 블록은 매우 효율적입니다. 실제로 예외를 잡는 것은 비용이 많이 듭니다. 2.0 이전의 파이썬 버전에서는 다음 관용구를 사용하는 것이 일반적이었습니다:

@example
try:
    value = mydict[key]
except KeyError:
    mydict[key] = getvalue(key)
    value = mydict[key]
@end example

이것은 딕셔너리에 거의 항상 키가 있을 것으로 예상했을 때만 의미가 있습니다. 그렇지 않으면, 다음과 같이 코딩했습니다:

@example
if key in mydict:
    value = mydict[key]
else:
    value = mydict[key] = getvalue(key)
@end example

이 특정 경우에, @code{value = dict.setdefault(key, getvalue(key))}를 사용할 수도 있지만, @code{getvalue()} 호출이 모든 경우에 평가되기 때문에 충분히 저렴한 경우에만 사용할 수 있습니다.

@node 파이썬에 switch 나 case 문이 없는 이유는 무엇입니까?,OS별 스레드 구현에 의존하는 대신 인터프리터에서 스레드를 에뮬레이션할 수 없습니까?,예외는 얼마나 빠릅니까?,설계와 역사 FAQ
@anchor{faq/design why-isn-t-there-a-switch-or-case-statement-in-python}@anchor{5973}
@subsection 파이썬에 switch 나 case 문이 없는 이유는 무엇입니까?


In general, structured switch statements execute one block of code
when an expression has a particular value or set of values.
Since Python 3.10 one can easily match literal values, or constants
within a namespace, with a @code{match ... case} statement.
An older alternative is a sequence of @code{if... elif... elif... else}.

매우 많은 가능성 중에서 선택해야 하는 경우에는, case 값을 호출할 함수에 매핑하는 딕셔너리를 만들 수 있습니다. 예를 들면:

@example
functions = @{'a': function_1,
             'b': function_2,
             'c': self.method_1@}

func = functions[value]
func()
@end example

객체에 대한 메서드 호출의 경우, @ref{dc9,,getattr()} 내장 함수를 사용하여 특정 이름을 가진 메서드를 꺼내어 더욱 단순화 할 수 있습니다:

@example
class MyVisitor:
    def visit_a(self):
        ...

    def dispatch(self, value):
        method_name = 'visit_' + str(value)
        method = getattr(self, method_name)
        method()
@end example

이 예제의 @code{visit_}와 같이 메서드 이름에 접두사를 사용하는 것이 좋습니다. 이러한 접두사가 없으면, 값이 신뢰할 수 없는 소스에서 오는 경우, 공격자가 객체의 모든 메서드를 호출할 수 있습니다.

Imitating switch with fallthrough, as with C’s switch-case-default,
is possible, much harder, and less needed.

@node OS별 스레드 구현에 의존하는 대신 인터프리터에서 스레드를 에뮬레이션할 수 없습니까?,람다 표현식이 문장을 포함할 수 없는 이유는 무엇입니까?,파이썬에 switch 나 case 문이 없는 이유는 무엇입니까?,설계와 역사 FAQ
@anchor{faq/design can-t-you-emulate-threads-in-the-interpreter-instead-of-relying-on-an-os-specific-thread-implementation}@anchor{5974}
@subsection OS별 스레드 구현에 의존하는 대신 인터프리터에서 스레드를 에뮬레이션할 수 없습니까?


답변 1: 불행히도, 인터프리터는 각 파이썬 스택 프레임에 대해 적어도 하나의 C 스택 프레임을 푸시합니다. 또한, 확장은 거의 임의의 순간에 파이썬으로 콜백 할 수 있습니다. 따라서, 전체 스레드 구현에는 C에 대한 스레드 지원이 필요합니다.

답변 2: 다행히, C 스택을 피하도록 완전히 재설계된 인터프리터 루프가 있는 Stackless Python@footnote{https://github.com/stackless-dev/stackless/wiki}이 있습니다.

@node 람다 표현식이 문장을 포함할 수 없는 이유는 무엇입니까?,파이썬을 기계 코드 C 또는 다른 언어로 컴파일 할 수 있습니까?,OS별 스레드 구현에 의존하는 대신 인터프리터에서 스레드를 에뮬레이션할 수 없습니까?,설계와 역사 FAQ
@anchor{faq/design why-can-t-lambda-expressions-contain-statements}@anchor{5975}
@subsection 람다 표현식이 문장을 포함할 수 없는 이유는 무엇입니까?


파이썬의 구문 프레임워크는 표현식 내부에 중첩된 문장을 처리할 수 없기 때문에 파이썬 람다 표현식은 문장을 포함할 수 없습니다. 그러나, 파이썬에서, 이것은 심각한 문제가 아닙니다. 기능을 추가하는 다른 언어의 람다 형식과 달리, 파이썬 람다는 함수를 정의하기에 너무 게으른 경우를 위한 줄임 표기법일 뿐입니다.

함수는 이미 파이썬의 일급 객체이며, 지역 스코프에서 선언할 수 있습니다. 따라서 지역에 정의된 함수 대신 람다를 사용하는 유일한 이점은 함수의 이름을 만들 필요가 없다는 것입니다 – 하지만 그것은 단지 함수 객체(람다 표현식이 산출하는 것과 정확히 같은 형의 객체)가 대입되는 지역 변수일 뿐입니다!

@node 파이썬을 기계 코드 C 또는 다른 언어로 컴파일 할 수 있습니까?,파이썬은 메모리를 어떻게 관리합니까?,람다 표현식이 문장을 포함할 수 없는 이유는 무엇입니까?,설계와 역사 FAQ
@anchor{faq/design can-python-be-compiled-to-machine-code-c-or-some-other-language}@anchor{5976}
@subsection 파이썬을 기계 코드, C 또는 다른 언어로 컴파일 할 수 있습니까?


Cython@footnote{https://cython.org/}은 수정된 버전의 파이썬을 선택적 주석이 있는 C 확장으로 컴파일합니다. Nuitka@footnote{https://nuitka.net/}는 완전한 파이썬 언어 지원을 목표로 하는 파이썬을 C++ 코드로 변환하는 유망한 컴파일러입니다.

@node 파이썬은 메모리를 어떻게 관리합니까?,CPython이 더 전통적인 가비지 수거 체계를 사용하지 않는 이유는 무엇입니까?,파이썬을 기계 코드 C 또는 다른 언어로 컴파일 할 수 있습니까?,설계와 역사 FAQ
@anchor{faq/design how-does-python-manage-memory}@anchor{5977}
@subsection 파이썬은 메모리를 어떻게 관리합니까?


파이썬 메모리 관리의 세부 사항은 구현에 따라 다릅니다. 파이썬의 표준 구현인 @ref{904,,CPython}은 참조 카운팅을 사용하여 액세스할 수 없는 객체를 감지하고, 또 다른 메커니즘을 사용하여 참조 순환을 수집하고, 액세스할 수 없는 순환을 찾고 관련된 객체를 삭제하는 순환 감지 알고리즘을 주기적으로 실행합니다. @ref{64,,gc} 모듈은 가비지 수집을 수행하고, 디버깅 통계를 얻고, 수거기의 매개 변수를 조정하는 함수를 제공합니다.

그러나, 다른 구현(가령 Jython@footnote{https://www.jython.org}이나 PyPy@footnote{https://pypy.org})은 완전한 가비지 수거기와 같은 다른 메커니즘에 의존할 수 있습니다. 이 차이는 파이썬 코드가 참조 카운팅 구현의 동작에 의존하는 경우 미묘한 이식 문제를 일으킬 수 있습니다.

일부 파이썬 구현에서, 다음 코드(CPython에서는 괜찮습니다)는 아마도 파일 기술자의 소진을 일으킵니다:

@example
for file in very_long_list_of_files:
    f = open(file)
    c = f.read(1)
@end example

실제로, CPython의 참조 카운팅과 파괴자 체계를 사용할 때, @code{f}에 대한 각각의 새로운 대입은 이전 파일을 닫습니다. 그러나 전통적인 GC를 사용하면, 이러한 파일 객체는 다양하고 어쩌면 긴 간격으로만 수집(그리고 닫히게)됩니다.

모든 파이썬 구현에서 작동하는 코드를 작성하려면, 명시적으로 파일을 닫거나 @ref{186,,with} 문을 사용해야 합니다; 다음은 메모리 관리 체계와 관계없이 작동합니다:

@example
for file in very_long_list_of_files:
    with open(file) as f:
        c = f.read(1)
@end example

@node CPython이 더 전통적인 가비지 수거 체계를 사용하지 않는 이유는 무엇입니까?,CPython이 종료될 때 모든 메모리가 해제되지 않는 이유는 무엇입니까?,파이썬은 메모리를 어떻게 관리합니까?,설계와 역사 FAQ
@anchor{faq/design why-doesn-t-cpython-use-a-more-traditional-garbage-collection-scheme}@anchor{5978}
@subsection CPython이 더 전통적인 가비지 수거 체계를 사용하지 않는 이유는 무엇입니까?


우선, 이것은 C 표준 기능이 아니라서 이식성이 없습니다. (예, 우리는 Boehm GC 라이브러리에 대해 알고 있습니다. `대부분의' 일반 플랫폼용 (그들 전부는 아닙니다) 어셈블러 코드가 있고, 대체로 투명하지만, 완전히 투명하지는 않습니다; 파이썬이 이것으로 작동하도록 하려면 패치가 필요합니다.)

전통적인 GC는 파이썬이 다른 응용 프로그램에 내장될 때도 문제가 됩니다. 독립형 파이썬에서는 표준 @code{malloc()}과 @code{free()}를 GC 라이브러리에서 제공하는 버전으로 대체해도 상관없지만, 파이썬을 내장하는 응용 프로그램은 @code{malloc()}과 @code{free()}에 대한 `자신만의' 대체를 원할 수 있습니다, 그리고 파이썬의 것을 원하지 않을 수 있습니다. 현재, CPython은 @code{malloc()}과 @code{free()}를 올바르게 구현하는 모든 것과 동작합니다.

@node CPython이 종료될 때 모든 메모리가 해제되지 않는 이유는 무엇입니까?,별도의 튜플과 리스트 데이터형이 있는 이유는 무엇입니까?,CPython이 더 전통적인 가비지 수거 체계를 사용하지 않는 이유는 무엇입니까?,설계와 역사 FAQ
@anchor{faq/design why-isn-t-all-memory-freed-when-cpython-exits}@anchor{5979}
@subsection CPython이 종료될 때 모든 메모리가 해제되지 않는 이유는 무엇입니까?


파이썬 모듈의 전역 이름 공간에서 참조된 객체는 파이썬이 종료될 때 항상 할당 해제되지는 않습니다. 순환 참조가 있으면 발생할 수 있습니다. C 라이브러리에 의해 할당된 해제가 불가능한 특정 메모리도 있습니다 (예를 들어 Purify와 같은 도구는 이에 대해 불평합니다). 그러나, 파이썬은 종료 시 메모리 정리에 적극적이며 모든 단일 객체를 파괴하려고 시도합니다.

할당 해제 시 파이썬이 특정 항목을 삭제하도록 강제하려면 @ref{d,,atexit} 모듈을 사용하여 해당 삭제를 강제하는 함수를 실행하십시오.

@node 별도의 튜플과 리스트 데이터형이 있는 이유는 무엇입니까?,CPython에서 리스트는 어떻게 구현됩니까?,CPython이 종료될 때 모든 메모리가 해제되지 않는 이유는 무엇입니까?,설계와 역사 FAQ
@anchor{faq/design why-are-there-separate-tuple-and-list-data-types}@anchor{597a}
@subsection 별도의 튜플과 리스트 데이터형이 있는 이유는 무엇입니까?


리스트와 튜플은, 여러 면에서 비슷하지만, 일반적으로 근본적으로 다른 방식으로 사용됩니다. 튜플은 파스칼 @code{레코드(record)}나 C @code{구조체(struct)}와 유사하다고 생각할 수 있습니다; 그룹으로 다뤄지는 다양한 형을 갖는 관련 데이터의 작은 모음입니다. 예를 들어, 직교 좌표는 2개나 3개의 숫자로 구성된 튜플로 적절하게 표시됩니다.

반면에, 리스트는 다른 언어의 배열과 더 비슷합니다. 이들은 모두 같은 형을 가지고 하나씩 다뤄지는 다양한 수의 객체를 보유하는 경향이 있습니다. 예를 들어, @ref{12ff,,os.listdir('.')}은 현재 디렉터리의 파일을 나타내는 문자열 리스트를 반환합니다. 이 출력에 작동하는 함수는 디렉터리에 다른 파일 한두 개를 추가해도 일반적으로 오동작하지 않습니다.

튜플은 불변입니다. 즉, 일단 튜플이 만들어지면, 어느 요소도 새 값으로 바꿀 수 없습니다. 리스트는 가변이라서, 언제든지 리스트의 요소를 변경할 수 있습니다. 불변인 요소만 딕셔너리 키로 사용할 수 있어서, 리스트가 아니라 튜플만 키로 사용할 수 있습니다.

@node CPython에서 리스트는 어떻게 구현됩니까?,CPython에서 딕셔너리는 어떻게 구현됩니까?,별도의 튜플과 리스트 데이터형이 있는 이유는 무엇입니까?,설계와 역사 FAQ
@anchor{faq/design how-are-lists-implemented-in-cpython}@anchor{597b}
@subsection CPython에서 리스트는 어떻게 구현됩니까?


CPython의 리스트는 실제로는 가변 길이 배열입니다, Lisp 스타일의 연결 리스트(linked lists)가 아닙니다. 구현은 다른 객체에 대한 참조의 연속적인 배열을 사용하고, 이 배열에 대한 포인터와 배열의 길이를 리스트 헤드 구조체에 유지합니다.

이것은 리스트 인덱싱 @code{a[i]}의 비용이 리스트의 크기나 인덱스의 값과 무관한 연산으로 만듭니다.

항목이 추가되거나 삽입되면, 참조 배열의 크기가 조정됩니다. 항목을 반복적으로 추가하는 성능을 향상하기 위해 약간 영리하게 처리합니다; 배열을 확장해야 할 때, 추가 공간이 할당되어 다음 몇 번에는 실제 크기 조정이 필요하지 않습니다.

@node CPython에서 딕셔너리는 어떻게 구현됩니까?,딕셔너리 키가 불변이어야 하는 이유는 무엇입니까?,CPython에서 리스트는 어떻게 구현됩니까?,설계와 역사 FAQ
@anchor{faq/design how-are-dictionaries-implemented-in-cpython}@anchor{597c}
@subsection CPython에서 딕셔너리는 어떻게 구현됩니까?


CPython의 딕셔너리는 크기 조정 가능한 해시 테이블로 구현됩니다. B-트리와 비교해, 대부분의 상황에서 조회(지금까지 가장 흔한 연산) 성능이 향상되고, 구현이 더 간단합니다.

딕셔너리는 @ref{800,,hash()} 내장 함수를 사용하여 딕셔너리에 저장된 각 키에 대한 해시 코드를 계산하여 작동합니다. 해시 코드는 키와 프로세스별 시드에 따라 크게 다릅니다; 예를 들어, @code{'Python'}은 @code{-539294296}으로 해시 할 수 있는 반면, 한 글자만 다른 문자열인 @code{'python'}은 @code{1142331976}로 해시 할 수 있습니다. 그런 다음 해시 코드는 값이 저장될 내부 배열의 위치를 계산하는 데 사용됩니다. 모든 해시값이 다른 키를 저장한다고 가정하면, 딕셔너리가 키를 검색하는 데 상수 시간이 걸린다는 뜻입니다 – Big-O 표기법으로 `O'(1).

@node 딕셔너리 키가 불변이어야 하는 이유는 무엇입니까?,list sort 가 정렬된 리스트를 반환하지 않는 이유는 무엇입니까?,CPython에서 딕셔너리는 어떻게 구현됩니까?,설계와 역사 FAQ
@anchor{faq/design why-must-dictionary-keys-be-immutable}@anchor{597d}
@subsection 딕셔너리 키가 불변이어야 하는 이유는 무엇입니까?


딕셔너리의 해시 테이블 구현은 키값에서 계산된 해시값을 사용하여 키를 찾습니다. 키가 가변 객체이면, 값이 변경될 수 있어서, 해시도 변경될 수 있습니다. 그러나 키 객체를 변경하는 주체는 그것이 딕셔너리 키로 사용되고 있음을 알 수 없기 때문에, 딕셔너리에서 항목을 이동할 수 없습니다. 그런 다음, 딕셔너리에서 같은 객체를 찾으려고 하면 해시값이 다르기 때문에 찾을 수 없습니다. 이전 값을 찾으려고 해도 해당 해시 저장소에서 발견된 객체의 값이 다르기 때문에 역시 찾을 수 없습니다.

딕셔너리를 리스트로 인덱싱하려면, 먼저 리스트를 튜플로 변환하십시오; @code{tuple(L)} 함수는 리스트 @code{L}과 같은 항목을 가진 튜플을 만듭니다. 튜플은 불변이므로 딕셔너리 키로 사용할 수 있습니다.

제안되었지만 받아들여지지 않은 몇 가지 해법:


@itemize -

@item 
주소(객체 ID)로 리스트를 해시 합니다. 같은 값으로 새 리스트를 생성하면 찾을 수 없기 때문에 작동하지 않습니다; 예를 들어:

@example
mydict = @{[1, 2]: '12'@}
print(mydict[[1, 2]])
@end example

는 두 번째 줄에 사용된 @code{[1, 2]}의 id가 첫 번째 줄의 것과 다르기 때문에 @ref{5e5,,KeyError} 예외가 발생합니다. 즉, 딕셔너리 키는 @ref{34c,,is}가 아니라 @code{==}를 사용하여 비교해야 합니다.

@item 
리스트를 키로 사용할 때 사본을 만듭니다. 가변 객체인 리스트가 자신에 대한 참조를 포함할 수 있고, 복사 코드가 무한 루프에 빠질 수 있기 때문에 작동하지 않습니다.

@item 
리스트를 키로 허용하지만, 사용자에게 수정하지 않도록 지시합니다. 이것은 잊거나 실수로 리스트를 수정했을 때 프로그램에 추적하기 어려운 버그를 만듭니다. 또한 딕셔너리의 중요한 불변성을 깨뜨립니다; @code{d.keys()}의 모든 값은 딕셔너리의 키로 사용할 수 있다.

@item 
딕셔너리 키로 사용되면 리스트를 읽기 전용으로 표시합니다. 문제는 그 값을 변경할 수 있는 것은 최상위 객체만이 아니라는 것입니다; 리스트를 포함하는 튜플을 키로 사용할 수 있습니다. 무엇이든 키로 딕셔너리에 입력하면 거기에서 도달할 수 있는 모든 객체를 읽기 전용으로 표시해야 합니다 – 그리고 다시, 자기 참조 객체는 무한 루프를 일으킬 수 있습니다.
@end itemize

필요하면 이 문제를 회피하는 트릭이 있지만, 위험을 감수하고 사용하십시오: @ref{cf1,,__eq__()}와 @ref{cf2,,__hash__()} 메서드를 모두 가진 클래스 인스턴스 내부에 가변 구조를 래핑할 수 있습니다. 그런 다음 딕셔너리(또는 다른 해시 기반 구조)에 상주하는 모든 래퍼 객체의 해시값이 객체가 딕셔너리(또는 다른 구조)에 있는 동안 고정되도록 해야 합니다.

@example
class ListWrapper:
    def __init__(self, the_list):
        self.the_list = the_list

    def __eq__(self, other):
        return self.the_list == other.the_list

    def __hash__(self):
        l = self.the_list
        result = 98767 - len(l)*555
        for i, el in enumerate(l):
            try:
                result = result + (hash(el) % 9999999) * 1001 + i
            except Exception:
                result = (result % 7777777) + i * 333
        return result
@end example

해시 계산은 리스트의 일부 멤버가 해시 불가능할 가능성과 산술 오버플로의 가능성으로 인해 복잡함에 유의하십시오.

또한 객체가 딕셔너리에 있는지에 관계없이, 항상 @code{o1 == o2}(즉 @code{o1.__eq__(o2) is True})이면 @code{hash(o1) == hash(o2)}(즉 @code{o1.__hash__() == o2.__hash__()}) 여야 합니다. 이러한 제한 사항을 충족하지 못하면 딕셔너리와 다른 해시 기반 구조가 오작동합니다.

@code{ListWrapper}의 경우, 래퍼 객체가 딕셔너리에 있을 때마다 래핑 된 리스트는 이상 동작을 피하려면 변경되지 않아야 합니다. 요구 사항과 이를 올바르게 충족하지 못한 결과에 대해 충분히 생각할 준비가 되어 있지 않은 한 이 작업을 수행하지 마십시오. 경고받았다고 생각하십시오.

@node list sort 가 정렬된 리스트를 반환하지 않는 이유는 무엇입니까?,파이썬에서 인터페이스 명세를 어떻게 지정하고 강제합니까?,딕셔너리 키가 불변이어야 하는 이유는 무엇입니까?,설계와 역사 FAQ
@anchor{faq/design why-doesn-t-list-sort-return-the-sorted-list}@anchor{597e}
@subsection list.sort()가 정렬된 리스트를 반환하지 않는 이유는 무엇입니까?


성능이 중요한 상황에서, 단지 정렬하기 위해 리스트를 복사하는 것은 낭비입니다. 따라서, @ref{dc7,,list.sort()}는 리스트를 제자리에서 정렬합니다. 이 사실을 상기시키기 위해, 정렬된 리스트를 반환하지 않습니다. 이렇게 하면, 정렬된 복사본이 필요하지만 정렬되지 않은 버전을 유지해야 할 때 실수로 리스트를 덮어쓰지 않도록 합니다.

새 리스트를 반환하려면, 대신 내장 @ref{dc6,,sorted()} 함수를 사용하십시오. 이 함수는 제공된 이터러블에서 새 리스트를 만들고, 정렬한 다음 반환합니다. 예를 들어, 정렬된 순서로 딕셔너리의 키를 이터레이트 하는 방법은 다음과 같습니다:

@example
for key in sorted(mydict):
    ...  # mydict[key]로 뭔가 합니다...
@end example

@node 파이썬에서 인터페이스 명세를 어떻게 지정하고 강제합니까?,goto가 없는 이유는 무엇입니까?,list sort 가 정렬된 리스트를 반환하지 않는 이유는 무엇입니까?,설계와 역사 FAQ
@anchor{faq/design how-do-you-specify-and-enforce-an-interface-spec-in-python}@anchor{597f}
@subsection 파이썬에서 인터페이스 명세를 어떻게 지정하고 강제합니까?


C++와 Java와 같은 언어에서 제공하는 모듈에 대한 인터페이스 명세는 모듈의 메서드와 함수에 대한 프로토타입을 설명합니다. 많은 사람은 컴파일 타임에 인터페이스 명세를 적용하는 것이 대규모 프로그램을 구축하는 데 도움이 된다고 생각합니다.

파이썬 2.6은 추상 베이스 클래스(ABC)를 정의할 수 있는 @ref{4,,abc} 모듈을 추가합니다. 그런 다음 @ref{2ad,,isinstance()}와 @ref{9c4,,issubclass()}를 사용하여 인스턴스나 클래스가 특정 ABC를 구현하는지 확인할 수 있습니다. @ref{1f,,collections.abc} 모듈은 @ref{26b4,,Iterable}, @ref{26b6,,Container} 및 @ref{12b1,,MutableMapping}과 같은 유용한 ABC 집합을 정의합니다.

파이썬의 경우, 구성 요소에 대한 적절한 테스트 규율을 통해 인터페이스 명세의 많은 이점을 얻을 수 있습니다.

모듈에 대한 좋은 테스트 스위트는 회귀 테스트를 제공함과 동시에 모듈 인터페이스 명세와 예제 집합으로 사용할 수 있습니다. 많은 파이썬 모듈은 스크립트로 실행하여 간단한 “자체 테스트”를 제공할 수 있습니다. 복잡한 외부 인터페이스를 사용하는 모듈조차도 외부 인터페이스의 간단한 “스텁(stub)” 에뮬레이션을 사용하여 종종 격리 테스트 할 수 있습니다. @ref{3e,,doctest}와 @ref{10c,,unittest} 모듈 또는 제삼자 테스트 프레임워크를 사용하여 모듈의 모든 코드 줄을 실행하는 포괄적인 테스트 스위트를 구축할 수 있습니다.

An appropriate testing discipline can help build large complex applications in
Python as well as having interface specifications would.  In fact, it can be
better because an interface specification cannot test certain properties of a
program.  For example, the @ref{8db,,list.append()} method is expected to add new elements
to the end of some internal list; an interface specification cannot test that
your @code{list.append()} implementation will actually do this correctly, but it’s
trivial to check this property in a test suite.

테스트 스위트를 작성하는 것은 매우 도움이 되며, 쉽게 테스트 할 수 있도록 코드를 설계할 수 있습니다. 점점 더 많이 사용되는 기술인 테스트 기반 개발(test-driven development)에서는, 실제 코드를 작성하기 전에 먼저 테스트 스위트의 일부를 작성해야 합니다. 물론 파이썬은 여러분이 지저분해지거나 테스트 케이스를 전혀 작성하지 않을 수 있도록 허락합니다.

@node goto가 없는 이유는 무엇입니까?,날 문자열 r-strings 이 역 슬래시로 끝날 수 없는 이유는 무엇입니까?,파이썬에서 인터페이스 명세를 어떻게 지정하고 강제합니까?,설계와 역사 FAQ
@anchor{faq/design why-is-there-no-goto}@anchor{5980}
@subsection goto가 없는 이유는 무엇입니까?


1970년대에 사람들은 무제한 goto가 이해하고 수정하기 어려운 지저분한 “스파게티” 코드로 이어질 수 있다는 것을 깨달았습니다. 고수준 언어에서는, 분기(파이썬에서 @ref{181,,if} 문, @ref{34d,,or}, @ref{349,,and} 및 @code{if}/@ref{17c,,else} 표현식)와 루프(@ref{1974,,while}과 @ref{34a,,for} 문, @ref{180,,continue}와 @ref{17f,,break}를 포함할 수 있습니다)가 있는 한 필요하지 않습니다.

예외를 사용하여 함수 호출 간에도 작동하는 “구조적 goto”를 제공할 수 있습니다. 많은 사람은 예외가 C, Fortran 및 기타 언어의 @code{go}나 @code{goto} 구조의 모든 합리적 사용을 편리하게 에뮬레이트 할 수 있다고 생각합니다. 예를 들면:

@example
class label(Exception): pass  # label을 선언합니다

try:
    ...
    if condition: raise label()  # label로 goto 합니다
    ...
except label:  # goto 할 곳
    pass
...
@end example

이것은 당신이 루프의 중간으로 점프하는 것을 허용하지 않지만, 어쨌든 그것은 일반적으로 @code{goto}의 남용으로 간주합니다. 아껴서 사용하십시오.

@node 날 문자열 r-strings 이 역 슬래시로 끝날 수 없는 이유는 무엇입니까?,왜 파이썬에는 어트리뷰트 대입을 위한 “with” 문이 없습니까?,goto가 없는 이유는 무엇입니까?,설계와 역사 FAQ
@anchor{faq/design why-can-t-raw-strings-r-strings-end-with-a-backslash}@anchor{5981}
@subsection 날 문자열(r-strings)이 역 슬래시로 끝날 수 없는 이유는 무엇입니까?


더 정확하게는, 홀수 개의 역 슬래시로 끝날 수 없습니다: 끝의 쌍이 없는 역 슬래시는 닫는 따옴표 문자를 이스케이프 하여, 끝나지 않은 문자열을 남깁니다.

날 문자열은 자체 역 슬래시 이스케이프 처리를 수행하려는 프로세서(주로 정규식 엔진)에 대한 입력을 쉽게 만들 수 있도록 설계되었습니다. 이러한 프로세서는 일치하지 않는 후행 역 슬래시를 에러로 간주하므로, 날 문자열은 이를 허용하지 않습니다. 그 대가로, 역 슬래시로 이스케이프 하여 문자열 따옴표 문자를 전달할 수 있습니다. 이 규칙은 r-문자열이 의도된 목적으로 사용될 때 잘 작동합니다.

윈도우 경로명을 빌드하려는 경우, 모든 윈도우 시스템 호출은 슬래시도 허용함에 유의하십시오:

@example
f = open("/mydir/file.txt")  # 잘 동작합니다!
@end example

DOS 명령에 대한 경로명을 빌드하려는 경우, 예를 들어, 다음 중 하나를 시도하십시오

@example
dir = r"\this\is\my\dos\dir" "\\"
dir = r"\this\is\my\dos\dir\ "[:-1]
dir = "\\this\\is\\my\\dos\\dir\\"
@end example

@node 왜 파이썬에는 어트리뷰트 대입을 위한 “with” 문이 없습니까?,Why don’t generators support the with statement?,날 문자열 r-strings 이 역 슬래시로 끝날 수 없는 이유는 무엇입니까?,설계와 역사 FAQ
@anchor{faq/design why-doesn-t-python-have-a-with-statement-for-attribute-assignments}@anchor{5982}
@subsection 왜 파이썬에는 어트리뷰트 대입을 위한 “with” 문이 없습니까?


파이썬에는 블록에 진입하고 탈출할 때 코드를 호출하면서 블록 실행을 감싸는 @ref{186,,with} 문이 있습니다. 일부 언어에는 다음과 같은 구조가 있습니다:

@example
with obj:
    a = 1               # obj.a = 1 과 동등합니다
    total = total + 1   # obj.total = obj.total + 1
@end example

파이썬에서는, 이러한 구조가 모호해집니다.

오브젝트 파스칼, 델파이 및 C++와 같은 다른 언어는 정적 형을 사용하므로, 어떤 멤버가 대입되고 있는지 명확하게 알 수 있습니다. 이것이 정적 타이핑의 요점입니다 – 컴파일러는 `항상' 컴파일 시점에 모든 변수의 스코프를 알고 있습니다.

파이썬은 동적 형을 사용합니다. 실행 시간에 어떤 어트리뷰트가 참조되는지 미리 알 수 없습니다. 멤버 어트리뷰트는 실행 중에 객체에 추가하거나 제거할 수 있습니다. 이로 인해 단순한 읽기만으로는 어떤 어트리뷰트가 참조되는 중인지 알 수 없습니다: 지역 변수, 전역 변수 또는 멤버 어트리뷰트?

예를 들어, 다음과 같은 불완전한 스니펫을 보십시오:

@example
def foo(a):
    with a:
        print(x)
@end example

스니펫은 @code{a} 에 @code{x} 라는 멤버 어트리뷰트가 있어야 한다고 가정합니다. 그러나, 파이썬에는 인터프리터에게 이것을 알려주는 것이 없습니다. 가령, @code{a}가 정수이면 어떻게 됩니까? @code{x} 라는 전역 변수가 있으면, @ref{186,,with} 블록 내에서 사용됩니까? 보시다시피, 파이썬의 동적 특성은 이런 선택을 훨씬 더 어렵게 만듭니다.

그러나, @ref{186,,with}와 유사한 언어 기능의 주요 이점(코드 볼륨 감소)은 대입을 통해 파이썬에서 쉽게 달성할 수 있습니다. 다음과 같이 하는 대신에:

@example
function(args).mydict[index][index].a = 21
function(args).mydict[index][index].b = 42
function(args).mydict[index][index].c = 63
@end example

이렇게 작성하십시오:

@example
ref = function(args).mydict[index][index]
ref.a = 21
ref.b = 42
ref.c = 63
@end example

이름 연결은 파이썬에서 실행 시간에 결정되는데, 두 번째 버전은 확인을 한 번만 수행하면 되므로 실행 속도를 높이는 부작용도 있습니다.

Similar proposals that would introduce syntax to further reduce code volume,
such as using a ‘leading dot’, have been rejected in favour of explicitness (see
@indicateurl{https://mail.python.org/pipermail/python-ideas/2016-May/040070.html}).

@node Why don’t generators support the with statement?,if/while/def/class 문에 콜론이 필요한 이유는 무엇입니까?,왜 파이썬에는 어트리뷰트 대입을 위한 “with” 문이 없습니까?,설계와 역사 FAQ
@anchor{faq/design why-don-t-generators-support-the-with-statement}@anchor{5983}
@subsection Why don’t generators support the with statement?


For technical reasons, a generator used directly as a context manager
would not work correctly.  When, as is most common, a generator is used as
an iterator run to completion, no closing is needed.  When it is, wrap
it as @ref{158e,,contextlib.closing(generator)}
in the @ref{186,,with} statement.

@node if/while/def/class 문에 콜론이 필요한 이유는 무엇입니까?,파이썬은 왜 리스트와 튜플 끝에 쉼표를 허용합니까?,Why don’t generators support the with statement?,설계와 역사 FAQ
@anchor{faq/design why-are-colons-required-for-the-if-while-def-class-statements}@anchor{5984}
@subsection if/while/def/class 문에 콜론이 필요한 이유는 무엇입니까?


콜론은 주로 가독성을 높이기 위해 필요합니다 (실험적 ABC 언어의 결과 중 하나입니다). 이걸 고려해보십시오:

@example
if a == b
    print(a)
@end example

와

@example
if a == b:
    print(a)
@end example

두 번째 것이 어떻게 약간 더 읽기 쉬운지 주목하십시오. 이 FAQ 답변에서 콜론이 어떻게 예제를 시작하는지도 주목하십시오; 영어의 표준 사용법입니다.

또 다른 사소한 이유는 콜론이 구문 강조 표시가 있는 편집기를 도와준다는 것입니다: 들여쓰기를 늘려야 하는 때를 결정하기 위해, 프로그램 텍스트를 더 정교하게 구문 분석하는 대신 콜론을 찾을 수 있습니다.

@node 파이썬은 왜 리스트와 튜플 끝에 쉼표를 허용합니까?,,if/while/def/class 문에 콜론이 필요한 이유는 무엇입니까?,설계와 역사 FAQ
@anchor{faq/design why-does-python-allow-commas-at-the-end-of-lists-and-tuples}@anchor{5985}
@subsection 파이썬은 왜 리스트와 튜플 끝에 쉼표를 허용합니까?


파이썬은 리스트, 튜플 및 딕셔너리 끝에 후행 쉼표를 추가할 수 있도록 합니다:

@example
[1, 2, 3,]
('a', 'b', 'c',)
d = @{
    "A": [1, 5],
    "B": [6, 7],  # 마지막 후행 쉼표는 선택적이지만 좋은 스타일입니다
@}
@end example

이를 허용하는 데에는 몇 가지 이유가 있습니다.

리스트, 튜플 또는 딕셔너리에 대한 리터럴 값이 여러 줄에 걸쳐 있는 경우, 이전 줄에 쉼표를 추가할 필요가 없기 때문에 요소를 추가하기가 더 쉽습니다. 문법 에러를 만들지 않고 줄을 재정렬할 수도 있습니다.

실수로 쉼표를 누락하면 진단하기 어려운 에러가 발생할 수 있습니다. 예를 들면:

@example
x = [
  "fee",
  "fie"
  "foo",
  "fum"
]
@end example

이 리스트에는 네 개의 요소가 있는 것처럼 보이지만, 실제로는 세 가지 요소만 있습니다: “fee”, “fiefoo” 및 “fum”. 항상 쉼표를 추가하면 이러한 에러 원인을 피할 수 있습니다.

후행 쉼표를 허용하면 프로그래밍적인 코드 생성이 더 쉬워질 수도 있습니다.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 라이브러리와 확장 FAQ,확장/내장 FAQ,설계와 역사 FAQ,파이썬 자주 나오는 질문들
@anchor{faq/library doc}@anchor{5986}@anchor{faq/library library-and-extension-faq}@anchor{5987}@anchor{faq/library translation-repo}@anchor{5988}
@section 라이브러리와 확장 FAQ



@menu
* 일반 라이브러리 관련 질문:: 
* 일반적인 작업:: 
* 스레드:: 
* 입력과 출력: 입력과 출력<2>. 
* 네트워크/인터넷 프로그래밍:: 
* 데이터베이스:: 
* 수학과 숫자:: 

@end menu

@node 일반 라이브러리 관련 질문,일반적인 작업,,라이브러리와 확장 FAQ
@anchor{faq/library general-library-questions}@anchor{5989}
@subsection 일반 라이브러리 관련 질문


@menu
* 작업 X를 수행할 모듈이나 응용 프로그램을 어떻게 찾습니까?:: 
* math.py (socket.py@comma{} regex.py 등) 소스 파일은 어디에 있습니까?: math py socket py regex py 등 소스 파일은 어디에 있습니까?. 
* 유닉스에서 파이썬 스크립트를 실행 파일로 만들려면 어떻게 해야 합니까?:: 
* 파이썬 용 curses/termcap 패키지가 있습니까?:: 
* 파이썬에 C의 onexit()와 동등한 것이 있습니까?: 파이썬에 C의 onexit 와 동등한 것이 있습니까?. 
* 시그널 처리기가 작동하지 않는 이유는 무엇입니까?:: 

@end menu

@node 작업 X를 수행할 모듈이나 응용 프로그램을 어떻게 찾습니까?,math py socket py regex py 등 소스 파일은 어디에 있습니까?,,일반 라이브러리 관련 질문
@anchor{faq/library how-do-i-find-a-module-or-application-to-perform-task-x}@anchor{598a}
@subsubsection 작업 X를 수행할 모듈이나 응용 프로그램을 어떻게 찾습니까?


관련 표준 라이브러리 모듈이 있는지 @ref{149,,라이브러리 레퍼런스}를 확인하십시오. (결국에는 표준 라이브러리에 있는 내용을 배우고 이 단계를 건너뛸 수 있게 됩니다.)

제삼자 패키지의 경우 파이썬 패키지 색인@footnote{https://pypi.org}을 검색하거나 구글@footnote{https://www.google.com} 또는 다른 웹 검색 엔진을 사용해보십시오. “Python”에 관심 있는 주제에 관한 한두 개의 키워드를 더해 검색하면 보통 도움이 될만한 것을 찾게 될 것입니다.

@node math py socket py regex py 등 소스 파일은 어디에 있습니까?,유닉스에서 파이썬 스크립트를 실행 파일로 만들려면 어떻게 해야 합니까?,작업 X를 수행할 모듈이나 응용 프로그램을 어떻게 찾습니까?,일반 라이브러리 관련 질문
@anchor{faq/library where-is-the-math-py-socket-py-regex-py-etc-source-file}@anchor{598b}
@subsubsection math.py (socket.py, regex.py 등) 소스 파일은 어디에 있습니까?


모듈의 소스 파일을 찾을 수 없으면 C, C++ 또는 기타 컴파일된 언어로 구현된 내장이나 동적으로 로드된 모듈일 수 있습니다. 이 경우 소스 파일이 없거나 C 소스 디렉터리(파이썬 경로에 없는)의 @code{mathmodule.c}와 같은 파일일 수 있습니다.

파이썬에는 (적어도) 세 가지 종류의 모듈이 있습니다:


@enumerate 

@item 
파이썬으로 작성된 모듈 (.py);

@item 
C로 작성되고 동적으로 로드되는 모듈 (.dll, .pyd, .so, .sl 등);

@item 
C로 작성되고 인터프리터와 링크된 모듈; 이 목록을 얻으려면, 다음을 입력하십시오:

@example
import sys
print(sys.builtin_module_names)
@end example
@end enumerate

@node 유닉스에서 파이썬 스크립트를 실행 파일로 만들려면 어떻게 해야 합니까?,파이썬 용 curses/termcap 패키지가 있습니까?,math py socket py regex py 등 소스 파일은 어디에 있습니까?,일반 라이브러리 관련 질문
@anchor{faq/library how-do-i-make-a-python-script-executable-on-unix}@anchor{598c}
@subsubsection 유닉스에서 파이썬 스크립트를 실행 파일로 만들려면 어떻게 해야 합니까?


두 가지를 해야 합니다: 스크립트 파일의 모드는 실행 가능해야 하고 첫 번째 줄은 @code{#!}로 시작하고 그 뒤에 파이썬 인터프리터 경로가 있어야 합니다.

첫 번째는 @code{chmod +x scriptfile}이나 아마도 @code{chmod 755 scriptfile}을 실행하여 수행됩니다.

두 번째는 여러 가지 방법으로 수행 할 수 있습니다. 가장 간단한 방법은 다음과 같은 줄을

@example
#!/usr/local/bin/python
@end example

파이썬 인터프리터가 플랫폼에 설치된 경로 이름을 사용하여 파일의 첫 번째 줄로 작성하는 것입니다.

스크립트가 파이썬 인터프리터가 있는 위치와 독립적으로 되도록 하려면, @code{env} 프로그램을 사용할 수 있습니다. 파이썬 인터프리터가 사용자 
@geindex PATH
@geindex 환경 변수; PATH
@code{PATH}의 디렉터리에 있다고 가정하면, 거의 모든 유닉스 변형이 다음을 지원합니다:

@example
#!/usr/bin/env python
@end example

이것을 CGI 스크립트에 적용하지 `마십시오'. CGI 스크립트의 
@geindex PATH
@geindex 환경 변수; PATH
@code{PATH} 변수는 종종 최소한이라서, 인터프리터의 실제 절대 경로명을 사용해야 합니다.

때때로, 사용자 환경이 가득 차서 @code{/usr/bin/env} 프로그램이 실패합니다; 또는 env 프로그램이 아예 없습니다. 이 경우, 다음과 같은 핵을 시도할 수 있습니다 (Alex Rezinsky의 기법입니다):

@example
#! /bin/sh
""":"
exec python $0 $@{1+"$@@"@}
"""
@end example

작은 단점은 이것이 스크립트의 __doc__ 문자열을 정의한다는 것입니다. 그러나, 다음을 추가하여 문제를 해결할 수 있습니다

@example
__doc__ = """...Whatever..."""
@end example

@node 파이썬 용 curses/termcap 패키지가 있습니까?,파이썬에 C의 onexit 와 동등한 것이 있습니까?,유닉스에서 파이썬 스크립트를 실행 파일로 만들려면 어떻게 해야 합니까?,일반 라이브러리 관련 질문
@anchor{faq/library is-there-a-curses-termcap-package-for-python}@anchor{598d}
@subsubsection 파이썬 용 curses/termcap 패키지가 있습니까?


@c XXX curses *is* built by default, isn't it?

유닉스 변형의 경우: 표준 파이썬 소스 배포판은 기본적으로 컴파일되지는 않지만, Modules@footnote{https://github.com/python/cpython/tree/3.14/Modules} 서브 디렉터리에 curses 모듈을 포함합니다. (윈도우 배포판에서는 사용할 수 없습니다 – 윈도우용 curses 모듈은 없습니다.)

@ref{2f,,curses} 모듈은 기본 curses 기능뿐만 아니라 색상, 대체 문자 집합 지원, 패드 및 마우스 지원과 같은 ncurses와 SYSV curses의 많은 추가 기능을 지원합니다. 이는 모듈이 BSD curses만 있는 운영 체제와 호환되지 않음을 뜻하지만, 현재 유지 보수되는 OS들은 어느 것도 이 범주에 속하지 않는 것 같습니다.

@node 파이썬에 C의 onexit 와 동등한 것이 있습니까?,시그널 처리기가 작동하지 않는 이유는 무엇입니까?,파이썬 용 curses/termcap 패키지가 있습니까?,일반 라이브러리 관련 질문
@anchor{faq/library is-there-an-equivalent-to-c-s-onexit-in-python}@anchor{598e}
@subsubsection 파이썬에 C의 onexit()와 동등한 것이 있습니까?


@ref{d,,atexit} 모듈은 C의 @code{onexit()}와 유사한 등록 함수를 제공합니다.

@node 시그널 처리기가 작동하지 않는 이유는 무엇입니까?,,파이썬에 C의 onexit 와 동등한 것이 있습니까?,일반 라이브러리 관련 질문
@anchor{faq/library why-don-t-my-signal-handlers-work}@anchor{598f}
@subsubsection 시그널 처리기가 작동하지 않는 이유는 무엇입니까?


가장 흔한 문제점은 시그널 처리기가 잘못된 인자 목록으로 선언되는 것입니다. 이렇게 호출됩니다

@example
handler(signum, frame)
@end example

따라서 두 개의 매개 변수로 선언해야 합니다:

@example
def handler(signum, frame):
    ...
@end example

@node 일반적인 작업,스레드,일반 라이브러리 관련 질문,라이브러리와 확장 FAQ
@anchor{faq/library common-tasks}@anchor{5990}
@subsection 일반적인 작업


@menu
* 파이썬 프로그램이나 컴포넌트를 어떻게 테스트합니까?:: 
* 독스트링으로 설명서를 어떻게 만듭니까?:: 
* 한 번에 하나의 키 입력을 받는 방법은 무엇입니까?:: 

@end menu

@node 파이썬 프로그램이나 컴포넌트를 어떻게 테스트합니까?,독스트링으로 설명서를 어떻게 만듭니까?,,일반적인 작업
@anchor{faq/library how-do-i-test-a-python-program-or-component}@anchor{5991}
@subsubsection 파이썬 프로그램이나 컴포넌트를 어떻게 테스트합니까?


파이썬에는 두 가지 테스트 프레임워크가 있습니다. @ref{3e,,doctest} 모듈은 모듈의 독스트링에 있는 예제를 찾고 실행한 후, 출력을 독스트링에 제공된 예상 출력과 비교합니다.

@ref{10c,,unittest} 모듈은 Java와 Smalltalk 테스트 프레임 워크에서 모델링 된 더 멋진 테스트 프레임워크입니다.

테스트를 더 쉽게 하려면, 여러분의 프로그램에 좋은 모듈식 디자인을 사용해야 합니다. 프로그램은 거의 모든 기능을 함수나 클래스 메서드로 캡슐화해야 합니다 – 그리고 이는 때로 프로그램을 더 빠르게 실행하는 놀라운 효과가 있습니다 (지역 변수 액세스가 전역 액세스보다 빠르기 때문에). 또한 프로그램은 전역 변수를 변경하는 것에 의존하지 않아야 합니다, 이렇게 하면 테스트하기가 훨씬 어렵기 때문입니다.

프로그램의 “전역 메인 논리”는 다음과 같은 코드를

@example
if __name__ == "__main__":
    main_logic()
@end example

프로그램의 메인 모듈 하단에 넣는 것처럼 간단할 수 있습니다.

일단 프로그램이 다루기 쉬운 함수와 클래스 동작의 모음으로 구성되면, 이 동작을 검사하는 테스트 함수를 작성해야 합니다. 일련의 테스트를 자동화하는 테스트 스위트는 각 모듈과 연관될 수 있습니다. 이것은 많은 작업처럼 들리지만, 파이썬이 아주 간결하고 유연하기 때문에 놀랍도록 쉽습니다. “프로덕션 코드”와 함께 테스트 함수를 작성하여 코딩을 훨씬 더 즐겁고 재미있게 만들 수 있습니다. 버그를 쉽게 찾고 결함을 조기에 발견할 수 있기 때문입니다.

프로그램의 메인 모듈이 아닌 “지원 모듈”에는 모듈의 자체 테스트가 포함될 수 있습니다.

@example
if __name__ == "__main__":
    self_test()
@end example

복잡한 외부 인터페이스와 상호 작용하는 프로그램조차도 파이썬으로 구현된 “가짜” 인터페이스를 사용하여 외부 인터페이스를 사용할 수 없을 때 테스트할 수 있습니다.

@node 독스트링으로 설명서를 어떻게 만듭니까?,한 번에 하나의 키 입력을 받는 방법은 무엇입니까?,파이썬 프로그램이나 컴포넌트를 어떻게 테스트합니까?,일반적인 작업
@anchor{faq/library how-do-i-create-documentation-from-doc-strings}@anchor{5992}
@subsubsection 독스트링으로 설명서를 어떻게 만듭니까?


@ref{ba,,pydoc} 모듈은 파이썬 소스 코드의 독스트링에서 HTML을 만들 수 있습니다. 순수하게 독스트링에서 API 설명서를 만드는 대안은 epydoc@footnote{https://epydoc.sourceforge.net/}입니다. Sphinx@footnote{https://www.sphinx-doc.org}도 독스트링 내용을 포함할 수 있습니다.

@node 한 번에 하나의 키 입력을 받는 방법은 무엇입니까?,,독스트링으로 설명서를 어떻게 만듭니까?,일반적인 작업
@anchor{faq/library how-do-i-get-a-single-keypress-at-a-time}@anchor{5993}
@subsubsection 한 번에 하나의 키 입력을 받는 방법은 무엇입니까?


유닉스 변형에는 몇 가지 해결책이 있습니다. curses를 사용하여 이 작업을 수행하는 것은 간단하지만, curses는 배우기에 상당히 큰 모듈입니다.

@c XXX this doesn't work out of the box, some IO expert needs to check why
@c 
@c Here's a solution without curses::
@c 
@c import termios, fcntl, sys, os
@c fd = sys.stdin.fileno()
@c 
@c oldterm = termios.tcgetattr(fd)
@c newattr = termios.tcgetattr(fd)
@c newattr[3] = newattr[3] & ~termios.ICANON & ~termios.ECHO
@c termios.tcsetattr(fd, termios.TCSANOW, newattr)
@c 
@c oldflags = fcntl.fcntl(fd, fcntl.F_GETFL)
@c fcntl.fcntl(fd, fcntl.F_SETFL, oldflags | os.O_NONBLOCK)
@c 
@c try:
@c     while True:
@c         try:
@c             c = sys.stdin.read(1)
@c             print("Got character", repr(c))
@c         except OSError:
@c             pass
@c finally:
@c     termios.tcsetattr(fd, termios.TCSAFLUSH, oldterm)
@c     fcntl.fcntl(fd, fcntl.F_SETFL, oldflags)
@c 
@c You need the :mod:`termios` and the :mod:`fcntl` module for any of this to
@c work, and I've only tried it on Linux, though it should work elsewhere.  In
@c this code, characters are read and printed one at a time.
@c 
@c :func:`termios.tcsetattr` turns off stdin's echoing and disables canonical
@c mode.  :func:`fcntl.fnctl` is used to obtain stdin's file descriptor flags
@c and modify them for non-blocking mode.  Since reading stdin when it is empty
@c results in an :exc:`OSError`, this error is caught and ignored.
@c 
@c .. versionchanged:: 3.3
@c    *sys.stdin.read* used to raise :exc:`IOError`. Starting from Python 3.3
@c    :exc:`IOError` is alias for :exc:`OSError`.

@node 스레드,입력과 출력<2>,일반적인 작업,라이브러리와 확장 FAQ
@anchor{faq/library threads}@anchor{5994}
@subsection 스레드


@menu
* 스레드를 사용하여 어떻게 프로그래밍합니까?:: 
* 제 스레드가 아무것도 실행되지 않는 것 같습니다; 왜 그런가요?: 제 스레드가 아무것도 실행되지 않는 것 같습니다 왜 그런가요?. 
* 여러 작업자 스레드 간에 작업을 어떻게 배달합니까?:: 
* 어떤 종류의 전역 값 변경이 스레드 안전합니까?:: 
* 전역 인터프리터 록을 제거할 수 없습니까?:: 

@end menu

@node 스레드를 사용하여 어떻게 프로그래밍합니까?,제 스레드가 아무것도 실행되지 않는 것 같습니다 왜 그런가요?,,스레드
@anchor{faq/library how-do-i-program-using-threads}@anchor{5995}
@subsubsection 스레드를 사용하여 어떻게 프로그래밍합니까?


@ref{2,,_thread} 모듈이 아닌 @ref{f3,,threading} 모듈을 사용하십시오. @code{threading} 모듈은 @code{_thread} 모듈이 제공하는 저수준 프리미티브 위에 편리한 추상화를 구축합니다.

@node 제 스레드가 아무것도 실행되지 않는 것 같습니다 왜 그런가요?,여러 작업자 스레드 간에 작업을 어떻게 배달합니까?,스레드를 사용하여 어떻게 프로그래밍합니까?,스레드
@anchor{faq/library none-of-my-threads-seem-to-run-why}@anchor{5996}
@subsubsection 제 스레드가 아무것도 실행되지 않는 것 같습니다: 왜 그런가요?


메인 스레드가 종료되자마자, 모든 스레드가 죽습니다. 메인 스레드가 너무 빨리 실행되어, 스레드가 작업을 수행할 시간이 없습니다.

간단한 수정은 프로그램 끝에 모든 스레드가 완료될 만큼 충분히 긴 휴면을 추가하는 것입니다:

@example
import threading, time

def thread_task(name, n):
    for i in range(n):
        print(name, i)

for i in range(10):
    T = threading.Thread(target=thread_task, args=(str(i), i))
    T.start()

time.sleep(10)  # <---------------------------!
@end example

그러나 이제 (많은 플랫폼에서) 스레드는 병렬로 실행되지 않고, 한 번에 하나씩 순차적으로 실행되는 것처럼 보입니다! 그 이유는 OS 스레드 스케줄러가 이전 스레드가 블록 될 때까지 새 스레드를 시작하지 않기 때문입니다.

간단한 수정은 실행 함수의 시작 부분에 작은 휴면을 추가하는 것입니다:

@example
def thread_task(name, n):
    time.sleep(0.001)  # <--------------------!
    for i in range(n):
        print(name, i)

for i in range(10):
    T = threading.Thread(target=thread_task, args=(str(i), i))
    T.start()

time.sleep(10)
@end example

@ref{8ab,,time.sleep()}을 위한 좋은 지연 값을 추측하는 대신, 일종의 세마포어 메커니즘을 사용하는 것이 좋습니다. 한 가지 아이디어는 @ref{bb,,queue} 모듈을 사용하여 큐 객체를 만들고, 각 스레드가 완료될 때 큐에 토큰을 추가하게 하고, 메인 스레드가 스레드 수 만큼의 토큰을 읽도록 하는 것입니다.

@node 여러 작업자 스레드 간에 작업을 어떻게 배달합니까?,어떤 종류의 전역 값 변경이 스레드 안전합니까?,제 스레드가 아무것도 실행되지 않는 것 같습니다 왜 그런가요?,스레드
@anchor{faq/library how-do-i-parcel-out-work-among-a-bunch-of-worker-threads}@anchor{5997}
@subsubsection 여러 작업자 스레드 간에 작업을 어떻게 배달합니까?


가장 쉬운 방법은 @ref{24,,concurrent.futures} 모듈, 특히 @ref{948,,ThreadPoolExecutor} 클래스를 사용하는 것입니다.

또는, 디스패치 알고리즘을 세밀하게 제어하려면, 직접 논리를 작성할 수 있습니다. @ref{bb,,queue} 모듈을 사용하여 작업 목록을 포함하는 큐를 만드십시오. @ref{1599,,Queue} 클래스는 객체 목록을 유지하고 큐에 항목을 추가하는 @code{.put(obj)} 메서드와 이를 반환하는 @code{.get()} 메서드를 갖습니다. 클래스는 각 작업이 정확히 한 번만 전달되도록 하는 데 필요한 록을 관리합니다.

간단한 예를 들면 다음과 같습니다:

@example
import threading, queue, time

# 작업자 스레드는 큐에서 작업을 가져옵니다.
# 큐가 비어 있으면, 더는 작업이 없다고 가정하고 종료합니다.
# (실제 상황에서는 작업자가 종료할 때까지 실행합니다.)
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)

# 큐를 만듭니다
q = queue.Queue()

# 5 작업자의 풀을 시작합니다
for i in range(5):
    t = threading.Thread(target=worker, name='worker %i' % (i+1))
    t.start()

# 큐에 작업을 추가하기 시작합니다
for i in range(50):
    q.put(i)

# 스레드가 실행할 시간을 줍니다
print('Main thread sleeping')
time.sleep(5)
@end example

실행하면 다음과 같은 출력이 생성됩니다:

@example
Running worker
Running worker
Running worker
Running worker
Running worker
Main thread sleeping
Worker <Thread(worker 1, started 130283832797456)> running with argument 0
Worker <Thread(worker 2, started 130283824404752)> running with argument 1
Worker <Thread(worker 3, started 130283816012048)> running with argument 2
Worker <Thread(worker 4, started 130283807619344)> running with argument 3
Worker <Thread(worker 5, started 130283799226640)> running with argument 4
Worker <Thread(worker 1, started 130283832797456)> running with argument 5
...
@end example

자세한 내용은 모듈 설명서를 참조하십시오. @ref{1599,,Queue} 클래스는 기능이 풍부한 인터페이스를 제공합니다.

@node 어떤 종류의 전역 값 변경이 스레드 안전합니까?,전역 인터프리터 록을 제거할 수 없습니까?,여러 작업자 스레드 간에 작업을 어떻게 배달합니까?,스레드
@anchor{faq/library what-kinds-of-global-value-mutation-are-thread-safe}@anchor{5998}
@subsubsection 어떤 종류의 전역 값 변경이 스레드 안전합니까?


내부적으로 @ref{474,,전역 인터프리터 록}(GIL)이 사용되어 한 번에 하나의 스레드 만 파이썬 VM에서 실행되도록 합니다. 일반적으로, 파이썬은 바이트 코드 명령어들 사이에서만 스레드 간 전환을 제공합니다; @ref{b44,,sys.setswitchinterval()}을 통해 얼마나 자주 전환할지를 설정할 수 있습니다. 따라서 각 바이트 코드 명령어와 각 명령어에서 도달하는 모든 C 구현 코드는 파이썬 프로그램의 관점에서 원자 적입니다.

이론적으로, 이것은 정확하게 따지기 위해서는 PVM 바이트 코드 구현에 대한 정확한 이해가 필요하다는 것을 의미합니다. 경험적으로는, 이것은 “원자 적으로 보이는” 내장 데이터형(정수, 리스트, 딕셔너리 등)의 공유 변수에 대한 조작이 실제로 원자 적임을 의미합니다.

예를 들어, 다음 연산은 모두 원자 적입니다 (L, L1, L2는 리스트, D, D1, D2는 딕셔너리, x, y는 객체, i, j는 정수입니다):

@example
L.append(x)
L1.extend(L2)
x = L[i]
x = L.pop()
L1[i:j] = L2
L.sort()
x = y
x.field = y
D[x] = y
D1.update(D2)
D.keys()
@end example

이것들은 아닙니다:

@example
i = i+1
L.append(L[-1])
L[i] = L[j]
D[x] = D[x] + 1
@end example

다른 객체를 대체하는 연산은 객체의 참조 횟수가 0에 도달할 때 그들의 @ref{11fc,,__del__()} 메서드를 호출할 수 있으며, 이는 영향을 줄 수 있습니다. 이것은 딕셔너리와 리스트의 대량 갱신 때 특히 그렇습니다. 의심스러우면, 뮤텍스를 사용하십시오!

@node 전역 인터프리터 록을 제거할 수 없습니까?,,어떤 종류의 전역 값 변경이 스레드 안전합니까?,스레드
@anchor{faq/library can-t-we-get-rid-of-the-global-interpreter-lock}@anchor{5999}
@subsubsection 전역 인터프리터 록을 제거할 수 없습니까?


@ref{474,,전역 인터프리터 록}(GIL)은 종종 하이 엔드 다중 프로세서 서버 기계에 파이썬을 배치하는 데 방해가 된다고 여겨집니다, (거의) 모든 파이썬 코드가 GIL을 잡고 있는 동안에만 실행하려고 해서, 다중 스레드 파이썬 프로그램이 사실상 오직 하나의 CPU만 사용하기 때문입니다.

With the approval of 
@geindex Python 향상 제안; PEP 703
PEP 703@footnote{https://peps.python.org/pep-0703/} work is now underway to remove the GIL from the
CPython implementation of Python.  Initially it will be implemented as an
optional compiler flag when building the interpreter, and so separate
builds will be available with and without the GIL.  Long-term, the hope is
to settle on a single build, once the performance implications of removing the
GIL are fully understood.  Python 3.13 is likely to be the first release
containing this work, although it may not be completely functional in this
release.

현재 GIL을 제거하는 작업은 Sam Gross의 GIL이 제거된 파이썬 3.9 포크@footnote{https://github.ckom/colesbury/nogil}를 기반으로 합니다. 그 이전에는, 파이썬 1.5 시절에, Greg Stein은 실제로 GIL을 제거하고 세밀한 록으로 대체한 포괄적인 패치 모음(“자유로운 스레딩” 패치)을 구현했습니다. Adam Olsen은 그의 python-safethread@footnote{https://code.google.com/archive/p/python-safethread} 프로젝트에서 유사한 실험을 수행했습니다. 불행히도, 이 두 초기 실험 모두 GIL 제거를 보상하는 데 필요한 세밀한 록의 양으로 인해 단일 스레드 성능이 급격히 떨어졌습니다 (적어도 30% 더 느립니다). 파이썬 3.9 포크는 성능에 영향을 미치지 않으면서 GIL을 제거하려는 첫 번째 시도입니다.

현재 파이썬 배포판에 GIL이 있다는 것이 다중 CPU 기계에서 파이썬을 제대로 사용할 수는 없다는 뜻은 아닙니다! 여러 `스레드' 대신에 여러 `프로세스'로 작업을 분할하는 창의력을 발휘해야 합니다. 새로운 @ref{24,,concurrent.futures} 모듈의 @ref{1d6,,ProcessPoolExecutor} 클래스는 그렇게 하는 쉬운 방법을 제공합니다; @ref{98,,multiprocessing} 모듈은 작업 디스패치에 대한 제어를 더 원할 때를 위한 저수준 API를 제공합니다.

C 확장을 신중하게 사용하는 것도 도움이 됩니다; C 확장을 사용하여 시간이 오래 걸리는 작업을 수행하면, 확장은 실행 스레드가 C 코드에 있는 동안 GIL을 해제하고 다른 스레드가 어떤 작업을 수행할 수 있도록 할 수 있습니다. @ref{139,,zlib}와 @ref{6c,,hashlib}와 같은 일부 표준 라이브러리 모듈은 이미 이렇게 합니다.

An alternative approach to reducing the impact of the GIL is
to make the GIL a per-interpreter-state lock rather than truly global.
This was @ref{66e,,first implemented in Python 3.12} and is
available in the C API. A Python interface to it is expected in Python 3.13.
The main limitation to it at the moment is likely to be 3rd party extension
modules, since these must be written with multiple interpreters in mind in
order to be usable, so many older extension modules will not be usable.

@node 입력과 출력<2>,네트워크/인터넷 프로그래밍,스레드,라이브러리와 확장 FAQ
@anchor{faq/library input-and-output}@anchor{599a}
@subsection 입력과 출력


@menu
* 파일을 어떻게 삭제합니까? (그리고 다른 파일 질문들…): 파일을 어떻게 삭제합니까? 그리고 다른 파일 질문들…. 
* 파일을 어떻게 복사합니까?:: 
* 바이너리 데이터를 읽는 (또는 쓰는) 방법은 무엇입니까?: 바이너리 데이터를 읽는 또는 쓰는 방법은 무엇입니까?. 
* os.popen()으로 만든 파이프에서 os.read()를 사용할 수 없는 것처럼 보입니다; 왜입니까?: os popen 으로 만든 파이프에서 os read 를 사용할 수 없는 것처럼 보입니다; 왜입니까?. 
* 직렬 (RS232) 포트에 어떻게 액세스합니까?: 직렬 RS232 포트에 어떻게 액세스합니까?. 
* 왜 sys.stdout(stdin@comma{} stderr)을 닫아도 닫히지 않습니까?: 왜 sys stdout stdin stderr 을 닫아도 닫히지 않습니까?. 

@end menu

@node 파일을 어떻게 삭제합니까? 그리고 다른 파일 질문들…,파일을 어떻게 복사합니까?,,입력과 출력<2>
@anchor{faq/library how-do-i-delete-a-file-and-other-file-questions}@anchor{599b}
@subsubsection 파일을 어떻게 삭제합니까? (그리고 다른 파일 질문들…)


@code{os.remove(filename)}이나 @code{os.unlink(filename)}을 사용하십시오; 설명서는 @ref{a5,,os} 모듈을 참조하십시오. 두 함수는 동일합니다; @ref{12fa,,unlink()}는 단순히 이 함수에 대한 유닉스 시스템 호출의 이름입니다.

디렉터리를 제거하려면, @ref{12f8,,os.rmdir()}을 사용하십시오; 만들려면 @ref{52b,,os.mkdir()}을 사용하십시오. @code{os.makedirs(path)}는 존재하지 않는 @code{path}의 중간 디렉터리를 만듭니다. @code{os.removedirs(path)}는 비어있는 한, 중간 디렉터리를 제거합니다; 전체 디렉터리 트리와 그 내용을 삭제하려면 @ref{356,,shutil.rmtree()}를 사용하십시오.

파일 이름을 바꾸려면 @code{os.rename(old_path, new_path)}를 사용하십시오.

파일을 자르려면, @code{f = open(filename, "rb+")}를 사용하여 열고 @code{f.truncate(offset)}을 사용하십시오; offset의 기본값은 현재 탐색(seek) 위치입니다. @ref{f91,,os.open()}으로 열린 파일의 경우 @code{os.ftruncate(fd, offset)}도 있습니다. 여기서 `fd'는 파일 기술자(작은 정수)입니다.

@ref{ca,,shutil} 모듈에도 @ref{c4d,,copyfile()}, @ref{c1d,,copytree()} 및 @ref{356,,rmtree()}를 포함한 파일에서 작동하는 많은 함수가 포함되어 있습니다.

@node 파일을 어떻게 복사합니까?,바이너리 데이터를 읽는 또는 쓰는 방법은 무엇입니까?,파일을 어떻게 삭제합니까? 그리고 다른 파일 질문들…,입력과 출력<2>
@anchor{faq/library how-do-i-copy-a-file}@anchor{599c}
@subsubsection 파일을 어떻게 복사합니까?


The @ref{ca,,shutil} module contains a @ref{c4d,,copyfile()} function.
Note that on Windows NTFS volumes, it does not copy
alternate data streams@footnote{https://en.wikipedia.org/wiki/NTFS#Alternate_data_stream_(ADS)}
nor resource forks@footnote{https://en.wikipedia.org/wiki/Resource_fork}
on macOS HFS+ volumes, though both are now rarely used.
It also doesn’t copy file permissions and metadata, though using
@ref{c4f,,shutil.copy2()} instead will preserve most (though not all) of it.

@node 바이너리 데이터를 읽는 또는 쓰는 방법은 무엇입니까?,os popen 으로 만든 파이프에서 os read 를 사용할 수 없는 것처럼 보입니다; 왜입니까?,파일을 어떻게 복사합니까?,입력과 출력<2>
@anchor{faq/library how-do-i-read-or-write-binary-data}@anchor{599d}
@subsubsection 바이너리 데이터를 읽는 (또는 쓰는) 방법은 무엇입니까?


복잡한 바이너리 데이터 형식을 읽거나 쓰려면, @ref{db,,struct} 모듈을 사용하는 것이 가장 좋습니다. 바이너리 데이터(보통 숫자)를 포함하는 문자열을 취해서 파이썬 객체로 변환할 수 있도록 합니다; 그리고 그 반대도 가능합니다.

예를 들어, 다음 코드는 파일에서 빅 엔디안 형식의 두 개의 2-바이트 정수와 하나의 4-바이트 정수를 읽습니다:

@example
import struct

with open(filename, "rb") as f:
    s = f.read(8)
    x, y, z = struct.unpack(">hhl", s)
@end example

포맷 문자열의 ‘>’는 빅 엔디안 데이터를 강제합니다; 문자 ‘h’는 하나의 “짧은(short) 정수”(2바이트)를 읽고, ‘l’은 문자열에서 하나의 “긴(long) 정수”(4바이트)를 읽습니다.

더욱 규칙적인 데이터(예를 들어 int나 float의 동종 리스트)의 경우, @ref{8,,array} 모듈을 사용할 수도 있습니다.

@cartouche
@quotation 참고 
바이너리 데이터를 읽고 쓰려면, 바이너리 모드로 파일을 열어야 합니다 (여기서는, @code{"rb"}를 @ref{316,,open()}으로 전달합니다). 대신 @code{"r"}(기본값)을 사용하면, 파일이 텍스트 모드로 열리고 @code{f.read()}는 @ref{192,,bytes} 객체 대신 @ref{169,,str} 객체를 반환합니다.
@end quotation
@end cartouche

@node os popen 으로 만든 파이프에서 os read 를 사용할 수 없는 것처럼 보입니다; 왜입니까?,직렬 RS232 포트에 어떻게 액세스합니까?,바이너리 데이터를 읽는 또는 쓰는 방법은 무엇입니까?,입력과 출력<2>
@anchor{faq/library i-can-t-seem-to-use-os-read-on-a-pipe-created-with-os-popen-why}@anchor{599e}
@subsubsection os.popen()으로 만든 파이프에서 os.read()를 사용할 수 없는 것처럼 보입니다; 왜입니까?


@ref{f94,,os.read()}는 열린 파일을 나타내는 작은 정수인 파일 기술자를 취하는 저수준 함수입니다. @ref{31a,,os.popen()}은 내장 @ref{316,,open()} 함수에서 반환하는 것과 같은 형의 고수준 파일 객체를 만듭니다. 따라서, @code{os.popen()}으로 만들어진 파이프 `p'에서 `n' 바이트를 읽으려면, @code{p.read(n)}을 사용해야 합니다.

@node 직렬 RS232 포트에 어떻게 액세스합니까?,왜 sys stdout stdin stderr 을 닫아도 닫히지 않습니까?,os popen 으로 만든 파이프에서 os read 를 사용할 수 없는 것처럼 보입니다; 왜입니까?,입력과 출력<2>
@anchor{faq/library how-do-i-access-the-serial-rs232-port}@anchor{599f}
@subsubsection 직렬 (RS232) 포트에 어떻게 액세스합니까?


Win32, OSX, Linux, BSD, Jython, IronPython의 경우:

@quotation

pyserial@footnote{https://pypi.org/project/pyserial/}
@end quotation

유닉스의 경우, Mitch Chapman의 유즈넷 게시물을 참조하십시오:

@quotation

@indicateurl{https://groups.google.com/groups?selm=34A04430.CF9@@ohioee.com}
@end quotation

@node 왜 sys stdout stdin stderr 을 닫아도 닫히지 않습니까?,,직렬 RS232 포트에 어떻게 액세스합니까?,입력과 출력<2>
@anchor{faq/library why-doesn-t-closing-sys-stdout-stdin-stderr-really-close-it}@anchor{59a0}
@subsubsection 왜 sys.stdout(stdin, stderr)을 닫아도 닫히지 않습니까?


파이썬 @ref{13c8,,파일 객체}는 저수준 C 파일 기술자의 고수준 추상화 계층입니다.

내장 @ref{316,,open()} 함수를 통해 파이썬에서 만드는 대부분 파일 객체의 경우, @code{f.close()}는 파이썬 파일 객체를 파이썬의 관점에서 닫은 것으로 표시하고 하부 C 파일 기술자를 닫도록 합니다. 이것은 @code{f}가 가비지가 될 때 @code{f}의 파괴자에서 자동으로 일어나기도 합니다.

그러나 stdin, stdout 및 stderr은 파이썬에서 특별하게 처리되는데, C 역시 이들에게 특수한 상태를 부여하기 때문입니다. @code{sys.stdout.close()}를 실행하면 파이썬 수준 파일 객체가 닫힌 것으로 표시되지만, 연관된 C 파일 기술자를 닫지 `않습니다'.

이 세 가지 중 하나에 대한 하부 C 파일 기술자를 닫으려면, 먼저 이것이 정말로 여러분이 하고 싶은 것인지 확인해야 합니다 (예를 들어, I/O를 수행하려는 확장 모듈이 혼동할 수 있습니다). 그렇다면, @ref{d6a,,os.close()}를 사용하십시오:

@example
os.close(stdin.fileno())
os.close(stdout.fileno())
os.close(stderr.fileno())
@end example

또는 숫자 상수 0, 1 및 2를 각각 사용할 수 있습니다.

@node 네트워크/인터넷 프로그래밍,데이터베이스,입력과 출력<2>,라이브러리와 확장 FAQ
@anchor{faq/library network-internet-programming}@anchor{59a1}
@subsection 네트워크/인터넷 프로그래밍


@menu
* 파이썬에는 어떤 WWW 도구가 있습니까?:: 
* HTML 생성을 위해 어떤 모듈을 사용해야 합니까?:: 
* 파이썬 스크립트에서 메일을 보내려면 어떻게 해야 합니까?:: 
* 소켓의 connect() 메서드에서 블로킹을 피하려면 어떻게 해야 합니까?: 소켓의 connect 메서드에서 블로킹을 피하려면 어떻게 해야 합니까?. 

@end menu

@node 파이썬에는 어떤 WWW 도구가 있습니까?,HTML 생성을 위해 어떤 모듈을 사용해야 합니까?,,네트워크/인터넷 프로그래밍
@anchor{faq/library what-www-tools-are-there-for-python}@anchor{59a2}
@subsubsection 파이썬에는 어떤 WWW 도구가 있습니까?


라이브러리 레퍼런스 매뉴얼의 @ref{3ef5,,인터넷 프로토콜과 지원}과 @ref{3ae8,,인터넷 데이터 처리} 장을 참조하십시오. 파이썬에는 서버 측과 클라이언트 측 웹 시스템을 구축하는 데 도움이 되는 많은 모듈이 있습니다.

@c XXX check if wiki page is still up to date

사용 가능한 프레임워크 요약은 Paul Boddie가 @indicateurl{https://wiki.python.org/moin/WebProgramming}에서 유지 관리합니다.

@node HTML 생성을 위해 어떤 모듈을 사용해야 합니까?,파이썬 스크립트에서 메일을 보내려면 어떻게 해야 합니까?,파이썬에는 어떤 WWW 도구가 있습니까?,네트워크/인터넷 프로그래밍
@anchor{faq/library what-module-should-i-use-to-help-with-generating-html}@anchor{59a3}
@subsubsection HTML 생성을 위해 어떤 모듈을 사용해야 합니까?


@c XXX add modern template languages

Web Programming wiki page@footnote{https://wiki.python.org/moin/WebProgramming}에서 유용한 링크 모음을 찾을 수 있습니다.

@node 파이썬 스크립트에서 메일을 보내려면 어떻게 해야 합니까?,소켓의 connect 메서드에서 블로킹을 피하려면 어떻게 해야 합니까?,HTML 생성을 위해 어떤 모듈을 사용해야 합니까?,네트워크/인터넷 프로그래밍
@anchor{faq/library how-do-i-send-mail-from-a-python-script}@anchor{59a4}
@subsubsection 파이썬 스크립트에서 메일을 보내려면 어떻게 해야 합니까?


표준 라이브러리 모듈 @ref{cf,,smtplib}를 사용하십시오.

다음은 이를 사용하는 매우 간단한 대화식 메일 발신기입니다. 이 방법은 SMTP 리스너를 지원하는 모든 호스트에서 작동합니다.

@example
import sys, smtplib

fromaddr = input("From: ")
toaddrs  = input("To: ").split(',')
print("Enter message, end with ^D:")
msg = '@w{'}
while True:
    line = sys.stdin.readline()
    if not line:
        break
    msg += line

# 실제 우편 전송
server = smtplib.SMTP('localhost')
server.sendmail(fromaddr, toaddrs, msg)
server.quit()
@end example

유닉스 전용 대안은 sendmail을 사용합니다. sendmail 프로그램의 위치는 시스템마다 다릅니다; 때로는 @code{/usr/lib/sendmail}, 때로는 @code{/usr/sbin/sendmail}. sendmail 매뉴얼 페이지가 도움이 될 것입니다. 샘플 코드는 다음과 같습니다:

@example
import os

SENDMAIL = "/usr/sbin/sendmail"  # sendmail location
p = os.popen("%s -t -i" % SENDMAIL, "w")
p.write("To: receiver@@example.com\n")
p.write("Subject: test\n")
p.write("\n")  # 헤더와 본문을 구분하는 빈 줄
p.write("Some text\n")
p.write("some more text\n")
sts = p.close()
if sts != 0:
    print("Sendmail exit status", sts)
@end example

@node 소켓의 connect 메서드에서 블로킹을 피하려면 어떻게 해야 합니까?,,파이썬 스크립트에서 메일을 보내려면 어떻게 해야 합니까?,네트워크/인터넷 프로그래밍
@anchor{faq/library how-do-i-avoid-blocking-in-the-connect-method-of-a-socket}@anchor{59a5}
@subsubsection 소켓의 connect() 메서드에서 블로킹을 피하려면 어떻게 해야 합니까?


@ref{c6,,select} 모듈이 소켓의 비동기 I/O를 지원하는 데 흔히 사용됩니다.

TCP 연결이 블록 되지 않도록 하기 위해, 소켓을 비 블로킹 모드로 설정할 수 있습니다. 그런 다음 @ref{fa2,,connect()}를 수행하면, 즉시 연결되거나 (그다지 가능성이 없습니다) 에러 번호를 @code{.errno}에 포함하는 예외가 발생합니다. @code{errno.EINPROGRESS}는 연결이 진행 중이지만, 아직 완료되지 않았음을 나타냅니다. OS마다 다른 값을 반환해서, 여러분의 시스템에서 무엇이 반환되는지 확인해야 합니다.

예외를 피하려면 @ref{173e,,connect_ex()} 메서드를 사용할 수 있습니다. errno 값만 반환합니다. 폴링하려면, 나중에 @code{connect_ex()}를 다시 호출할 수 있습니다 – @code{0}이나 @code{errno.EISCONN}은 연결되었음을 나타냅니다 – 또는 이 소켓을 @ref{f9f,,select.select()}로 전달하여 쓸 수 있는지 확인할 수 있습니다.

@cartouche
@quotation 참고 
@ref{b,,asyncio} 모듈은 비 블로킹 네트워크 코드를 작성하는 데 사용할 수 있는 범용 단일 스레드 및 동시성 비동기 라이브러리를 제공합니다. 제삼자 Twisted@footnote{https://twisted.org/} 라이브러리는 널리 사용되는 기능이 풍부한 대안입니다.
@end quotation
@end cartouche

@node 데이터베이스,수학과 숫자,네트워크/인터넷 프로그래밍,라이브러리와 확장 FAQ
@anchor{faq/library databases}@anchor{59a6}
@subsection 데이터베이스


@menu
* 파이썬에 데이터베이스 패키지에 대한 인터페이스가 있습니까?:: 
* 파이썬에서 영속 객체를 어떻게 구현합니까?:: 

@end menu

@node 파이썬에 데이터베이스 패키지에 대한 인터페이스가 있습니까?,파이썬에서 영속 객체를 어떻게 구현합니까?,,데이터베이스
@anchor{faq/library are-there-any-interfaces-to-database-packages-in-python}@anchor{59a7}
@subsubsection 파이썬에 데이터베이스 패키지에 대한 인터페이스가 있습니까?


예.

@ref{38,,DBM}과 @ref{37,,GDBM}같은 디스크 기반 해시에 대한 인터페이스도 표준 파이썬에 포함되어 있습니다. 경량 디스크 기반 관계형 데이터베이스를 제공하는 @ref{d4,,sqlite3} 모듈도 있습니다.

대부분 관계형 데이터베이스에 대한 지원이 제공됩니다. 자세한 내용은 DatabaseProgramming wiki page@footnote{https://wiki.python.org/moin/DatabaseProgramming}를 참조하십시오.

@node 파이썬에서 영속 객체를 어떻게 구현합니까?,,파이썬에 데이터베이스 패키지에 대한 인터페이스가 있습니까?,데이터베이스
@anchor{faq/library how-do-you-implement-persistent-objects-in-python}@anchor{59a8}
@subsubsection 파이썬에서 영속 객체를 어떻게 구현합니까?


@ref{ab,,pickle} 라이브러리 모듈은 이것을 매우 일반적인 방식으로 해결하고 (여전히 열린 파일, 소켓 또는 창과 같은 것을 저장할 수는 없지만), @ref{c8,,shelve} 라이브러리 모듈은 pickle과 (g)dbm을 사용하여 임의의 파이썬 객체를 포함하는 영속적(persistent) 매핑을 만듭니다.

@node 수학과 숫자,,데이터베이스,라이브러리와 확장 FAQ
@anchor{faq/library mathematics-and-numerics}@anchor{59a9}
@subsection 수학과 숫자


@menu
* 파이썬에서 난수를 어떻게 생성합니까?:: 

@end menu

@node 파이썬에서 난수를 어떻게 생성합니까?,,,수학과 숫자
@anchor{faq/library how-do-i-generate-random-numbers-in-python}@anchor{59aa}
@subsubsection 파이썬에서 난수를 어떻게 생성합니까?


표준 모듈 @ref{bd,,random}은 난수 생성기를 구현합니다. 사용법은 간단합니다:

@example
import random
random.random()
@end example

이것은 [0, 1) 범위의 무작위 부동 소수점 숫자를 반환합니다.

이 모듈에는 다른 많은 특수 생성기가 있습니다, 가령:


@itemize *

@item 
@code{randrange(a, b)}는 [a, b) 범위의 정수를 선택합니다.

@item 
@code{uniform(a, b)}는 [a, b) 범위의 부동 소수점 숫자를 선택합니다.

@item 
@code{normalvariate(mean, sdev)}는 정규 (가우시안) 분포를 샘플링합니다.
@end itemize

일부 고수준 함수는 시퀀스에서 직접 작동합니다, 가령:


@itemize *

@item 
@code{choice(S)}는 주어진 시퀀스에서 무작위 요소 하나를 선택합니다.

@item 
@code{shuffle(L)}은 리스트를 제자리에서 섞습니다, 즉 무작위로 순서를 바꿉니다.
@end itemize

독립적인 여러 개의 난수 생성기를 만들기 위해 인스턴스 화 할 수 있는 @code{Random} 클래스도 있습니다.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 확장/내장 FAQ,윈도우 파이썬 FAQ,라이브러리와 확장 FAQ,파이썬 자주 나오는 질문들
@anchor{faq/extending doc}@anchor{59ab}@anchor{faq/extending extending-embedding-faq}@anchor{59ac}@anchor{faq/extending translation-repo}@anchor{59ad}
@section 확장/내장 FAQ



@c XXX need review for Python 3.

@menu
* C로 나만의 함수를 만들 수 있습니까?:: 
* C++로 나만의 함수를 만들 수 있습니까?:: 
* C를 쓰는 것은 어렵습니다; 대안이 있습니까?:: 
* C에서 임의의 파이썬 문장을 어떻게 실행할 수 있습니까?:: 
* C에서 임의의 파이썬 표현식을 어떻게 평가할 수 있습니까?:: 
* 파이썬 객체에서 C값을 어떻게 추출합니까?:: 
* Py_BuildValue()를 사용하여 임의 길이의 튜플을 만드는 방법은 무엇입니까?: Py_BuildValue 를 사용하여 임의 길이의 튜플을 만드는 방법은 무엇입니까?. 
* C에서 객체의 메서드를 어떻게 호출합니까?:: 
* PyErr_Print()의 출력(또는 stdout/stderr로 인쇄되는 모든 것)을 어떻게 잡습니까?: PyErr_Print 의 출력 또는 stdout/stderr로 인쇄되는 모든 것 을 어떻게 잡습니까?. 
* C에서 파이썬으로 작성된 모듈에 어떻게 액세스합니까?:: 
* 파이썬에서 C++ 객체에 어떻게 인터페이스 합니까?:: 
* Setup 파일을 사용하여 모듈을 추가했는데 make가 실패합니다; 왜 그렇습니까?:: 
* 확장을 어떻게 디버깅합니까?:: 
* 리눅스 시스템에서 파이썬 모듈을 컴파일하고 싶지만@comma{} 일부 파일이 없습니다. 왜 그렇습니까?: 리눅스 시스템에서 파이썬 모듈을 컴파일하고 싶지만 일부 파일이 없습니다 왜 그렇습니까?. 
* “잘못된 입력”과 “불완전한 입력”을 어떻게 구별할 수 있습니까?:: 
* 정의되지 않은 g++ 기호 __builtin_new나 __pure_virtual을 어떻게 찾을 수 있습니까?:: 
* 일부 메서드는 C로 구현되고 그 밖의 것은 파이썬으로 구현된 (예를 들어 상속을 통해) 객체 클래스를 만들 수 있습니까?: 일부 메서드는 C로 구현되고 그 밖의 것은 파이썬으로 구현된 예를 들어 상속을 통해 객체 클래스를 만들 수 있습니까?. 

@end menu

@node C로 나만의 함수를 만들 수 있습니까?,C++로 나만의 함수를 만들 수 있습니까?,,확장/내장 FAQ
@anchor{faq/extending can-i-create-my-own-functions-in-c}@anchor{59ae}
@subsection C로 나만의 함수를 만들 수 있습니까?


그렇습니다. 함수, 변수, 예외 및 심지어 새로운 형을 포함하는 내장 모듈을 C로 만들 수 있습니다. @ref{1fb9,,파이썬 인터프리터 확장 및 내장} 문서에 설명되어 있습니다.

대부분의 중급이나 고급 파이썬 서적에서도 이 주제를 다룰 것입니다.

@node C++로 나만의 함수를 만들 수 있습니까?,C를 쓰는 것은 어렵습니다; 대안이 있습니까?,C로 나만의 함수를 만들 수 있습니까?,확장/내장 FAQ
@anchor{faq/extending id2}@anchor{59af}
@subsection C++로 나만의 함수를 만들 수 있습니까?


그렇습니다, C++에 있는 C 호환성 기능을 사용합니다. 파이썬 인클루드(include) 파일 주위에 @code{extern "C" @{ ... @}}를 배치하고 파이썬 인터프리터가 호출할 각 함수 앞에 @code{extern "C"}를 배치하십시오. 생성자를 가진 전역이나 정적(static) C++ 객체는 대개 좋은 생각이 아닙니다.

@node C를 쓰는 것은 어렵습니다; 대안이 있습니까?,C에서 임의의 파이썬 문장을 어떻게 실행할 수 있습니까?,C++로 나만의 함수를 만들 수 있습니까?,확장/내장 FAQ
@anchor{faq/extending c-wrapper-software}@anchor{59b0}@anchor{faq/extending writing-c-is-hard-are-there-any-alternatives}@anchor{59b1}
@subsection C를 쓰는 것은 어렵습니다; 대안이 있습니까?


There are a number of alternatives to writing your own C extensions, depending
on what you’re trying to do. @ref{4ecd,,Recommended third party tools}
offer both simpler and more sophisticated approaches to creating C and C++
extensions for Python.

@node C에서 임의의 파이썬 문장을 어떻게 실행할 수 있습니까?,C에서 임의의 파이썬 표현식을 어떻게 평가할 수 있습니까?,C를 쓰는 것은 어렵습니다; 대안이 있습니까?,확장/내장 FAQ
@anchor{faq/extending how-can-i-execute-arbitrary-python-statements-from-c}@anchor{59b2}
@subsection C에서 임의의 파이썬 문장을 어떻게 실행할 수 있습니까?


이를 수행하는 최상위 수준 함수는 @ref{4f4a,,PyRun_SimpleString()}이며, 이는 모듈 @code{__main__}의 컨텍스트에서 실행될 단일 문자열 인자를 취하고 성공하면 @code{0}을 반환하고 (@ref{18e,,SyntaxError}를 포함하는) 예외가 발생하면 @code{-1}을 반환합니다. 더 많은 제어를 원하면, @ref{1dbd,,PyRun_String()}을 사용하십시오; @code{Python/pythonrun.c}에 있는 @code{PyRun_SimpleString()} 소스를 참조하십시오.

@node C에서 임의의 파이썬 표현식을 어떻게 평가할 수 있습니까?,파이썬 객체에서 C값을 어떻게 추출합니까?,C에서 임의의 파이썬 문장을 어떻게 실행할 수 있습니까?,확장/내장 FAQ
@anchor{faq/extending how-can-i-evaluate-an-arbitrary-python-expression-from-c}@anchor{59b3}
@subsection C에서 임의의 파이썬 표현식을 어떻게 평가할 수 있습니까?


이전 질문에서 나온 @ref{1dbd,,PyRun_String()} 함수를 start 기호 @ref{5200,,Py_eval_input}을 사용하여 호출하십시오; 표현식을 구문 분석하고, 평가하고 값을 반환합니다.

@node 파이썬 객체에서 C값을 어떻게 추출합니까?,Py_BuildValue 를 사용하여 임의 길이의 튜플을 만드는 방법은 무엇입니까?,C에서 임의의 파이썬 표현식을 어떻게 평가할 수 있습니까?,확장/내장 FAQ
@anchor{faq/extending how-do-i-extract-c-values-from-a-python-object}@anchor{59b4}
@subsection 파이썬 객체에서 C값을 어떻게 추출합니까?


이는 객체의 형에 따라 다릅니다. 튜플이면, @ref{5117,,PyTuple_Size()}는 길이를 반환하고 @ref{4ef6,,PyTuple_GetItem()}은 지정된 인덱스의 항목을 반환합니다. 리스트는 비슷한 함수를 가지고 있습니다, @ref{161f,,PyList_Size()}와 @ref{5fc,,PyList_GetItem()}.

바이트열에서는, @ref{4fc6,,PyBytes_Size()}는 길이를 반환하고 @ref{4fbe,,PyBytes_AsStringAndSize()}는 값과 길이에 대한 포인터를 제공합니다. 파이썬 바이트열 객체는 널(null) 바이트를 포함할 수 있어서 C의 @code{strlen()}을 사용할 수 없음에 유의하십시오.

객체의 형을 검사하려면, 먼저 @code{NULL}이 아닌지 확인한 다음 @ref{15a4,,PyBytes_Check()}, @ref{53cf,,PyTuple_Check()}, @ref{53e0,,PyList_Check()} 등을 사용하십시오.

소위 ‘추상’ 인터페이스가 제공하는 파이썬 객체에 대한 고수준 API도 있습니다 – 자세한 내용은 @code{Include/abstract.h}를 읽으십시오. @ref{50e7,,PySequence_Length()}, @ref{1e30,,PySequence_GetItem()} 등과 같은 호출로 모든 종류의 파이썬 시퀀스와 인터페이스 할 수 있을 뿐만 아니라 숫자(@ref{a93,,PyNumber_Index()} 등)와 PyMapping API의 매핑과 같은 다른 많은 유용한 프로토콜을 지원합니다.

@node Py_BuildValue 를 사용하여 임의 길이의 튜플을 만드는 방법은 무엇입니까?,C에서 객체의 메서드를 어떻게 호출합니까?,파이썬 객체에서 C값을 어떻게 추출합니까?,확장/내장 FAQ
@anchor{faq/extending how-do-i-use-py-buildvalue-to-create-a-tuple-of-arbitrary-length}@anchor{59b5}
@subsection Py_BuildValue()를 사용하여 임의 길이의 튜플을 만드는 방법은 무엇입니까?


그럴 수 없습니다. 대신 @ref{5116,,PyTuple_Pack()}을 사용하십시오.

@node C에서 객체의 메서드를 어떻게 호출합니까?,PyErr_Print 의 출력 또는 stdout/stderr로 인쇄되는 모든 것 을 어떻게 잡습니까?,Py_BuildValue 를 사용하여 임의 길이의 튜플을 만드는 방법은 무엇입니까?,확장/내장 FAQ
@anchor{faq/extending how-do-i-call-an-object-s-method-from-c}@anchor{59b6}
@subsection C에서 객체의 메서드를 어떻게 호출합니까?


@ref{63e,,PyObject_CallMethod()} 함수는 객체의 임의의 메서드를 호출하는 데 사용할 수 있습니다. 매개 변수는 객체, 호출할 메서드의 이름, @ref{3c2,,Py_BuildValue()}에 사용되는 것과 같은 포맷 문자열 및 인자 값입니다:

@example
PyObject *
PyObject_CallMethod(PyObject *object, const char *method_name,
                    const char *arg_format, ...);
@end example

메서드가 있는 모든 객체에서 작동합니다 – 내장이나 사용자 정의 모두 작동합니다. 반환 값을 @ref{78f,,Py_DECREF()}할 책임은 여러분에게 있습니다.

예를 들어, 인자 10, 0으로 파일 객체의 “seek” 메서드를 호출하려면 (파일 객체 포인터가 “f”라고 가정합니다):

@example
res = PyObject_CallMethod(f, "seek", "(ii)", 10, 0);
if (res == NULL) @{
        ... an exception occurred ...
@}
else @{
        Py_DECREF(res);
@}
@end example

@ref{4eeb,,PyObject_CallObject()}는 `항상' 인자 목록에 대한 튜플을 원하므로, 인자 없이 함수를 호출하려면, format으로 “()”를 전달하고, 하나의 인자로 함수를 호출하려면, 인자를 괄호로 묶습니다, 예를 들어 “(i)”.

@node PyErr_Print 의 출력 또는 stdout/stderr로 인쇄되는 모든 것 을 어떻게 잡습니까?,C에서 파이썬으로 작성된 모듈에 어떻게 액세스합니까?,C에서 객체의 메서드를 어떻게 호출합니까?,확장/내장 FAQ
@anchor{faq/extending how-do-i-catch-the-output-from-pyerr-print-or-anything-that-prints-to-stdout-stderr}@anchor{59b7}
@subsection PyErr_Print()의 출력(또는 stdout/stderr로 인쇄되는 모든 것)을 어떻게 잡습니까?


파이썬 코드에서, @code{write()} 메서드를 지원하는 객체를 정의하십시오. 이 객체를 @ref{ccc,,sys.stdout}과 @ref{b33,,sys.stderr}에 대입하십시오. print_error를 호출하거나 표준 트레이스백 메커니즘이 작동하도록 두십시오. 그러면 출력은 여러분의 @code{write()} 메서드가 보내는 곳으로 갑니다.

이렇게 하는 가장 쉬운 방법은 @ref{1128,,io.StringIO} 클래스를 사용하는 것입니다:

@example
>>> import io, sys
>>> sys.stdout = io.StringIO()
>>> print('foo')
>>> print('hello world!')
>>> sys.stderr.write(sys.stdout.getvalue())
foo
hello world!
@end example

같은 작업을 수행하는 사용자 정의 객체는 다음과 같습니다:

@example
>>> import io, sys
>>> class StdoutCatcher(io.TextIOBase):
...     def __init__(self):
...         self.data = []
...     def write(self, stuff):
...         self.data.append(stuff)
...
>>> import sys
>>> sys.stdout = StdoutCatcher()
>>> print('foo')
>>> print('hello world!')
>>> sys.stderr.write('@w{'}.join(sys.stdout.data))
foo
hello world!
@end example

@node C에서 파이썬으로 작성된 모듈에 어떻게 액세스합니까?,파이썬에서 C++ 객체에 어떻게 인터페이스 합니까?,PyErr_Print 의 출력 또는 stdout/stderr로 인쇄되는 모든 것 을 어떻게 잡습니까?,확장/내장 FAQ
@anchor{faq/extending how-do-i-access-a-module-written-in-python-from-c}@anchor{59b8}
@subsection C에서 파이썬으로 작성된 모듈에 어떻게 액세스합니까?


다음과 같이 모듈 객체에 대한 포인터를 얻을 수 있습니다:

@example
module = PyImport_ImportModule("<modulename>");
@end example

모듈을 아직 임포트 하지 않았으면 (즉, @ref{17ea,,sys.modules}에 아직 없으면), 이것은 모듈을 초기화합니다; 그렇지 않으면 단순히 @code{sys.modules["<modulename>"]}의 값을 반환합니다. 이것은 모듈을 어떤 이름 공간에도 넣지 않음에 유의하십시오 – 단지 초기화되도록 하고 @code{sys.modules}에 저장되도록 합니다.

그런 다음, 다음과 같이 모듈의 어트리뷰트(즉 모듈에 정의된 모든 이름)에 액세스할 수 있습니다:

@example
attr = PyObject_GetAttrString(module, "<attrname>");
@end example

모듈에 있는 변수에 대입하기 위해 @ref{198f,,PyObject_SetAttrString()}을 호출하는 것도 작동합니다.

@node 파이썬에서 C++ 객체에 어떻게 인터페이스 합니까?,Setup 파일을 사용하여 모듈을 추가했는데 make가 실패합니다; 왜 그렇습니까?,C에서 파이썬으로 작성된 모듈에 어떻게 액세스합니까?,확장/내장 FAQ
@anchor{faq/extending how-do-i-interface-to-c-objects-from-python}@anchor{59b9}
@subsection 파이썬에서 C++ 객체에 어떻게 인터페이스 합니까?


요구 사항에 따라 여러 가지 접근 방식이 있습니다. 이 작업을 수동으로 수행하려면, @ref{1fb9,,“확장 및 내장” 문서}를 읽는 것으로 시작하십시오. 파이썬 런타임 시스템의 경우 C와 C++ 사이에는 큰 차이가 없다는 것을 상기하십시오 – 따라서 C 구조체 (포인터) 형을 중심으로 새로운 파이썬 형을 작성하는 전략이 C++ 객체에도 적용됩니다.

C++ 라이브러리의 경우, @ref{59b0,,C를 쓰는 것은 어렵습니다; 대안이 있습니까?}를 참조하십시오.

@node Setup 파일을 사용하여 모듈을 추가했는데 make가 실패합니다; 왜 그렇습니까?,확장을 어떻게 디버깅합니까?,파이썬에서 C++ 객체에 어떻게 인터페이스 합니까?,확장/내장 FAQ
@anchor{faq/extending i-added-a-module-using-the-setup-file-and-the-make-fails-why}@anchor{59ba}
@subsection Setup 파일을 사용하여 모듈을 추가했는데 make가 실패합니다; 왜 그렇습니까?


Setup은 개행으로 끝나야 하며, 개행이 없으면 빌드 프로세스가 실패합니다. (이 문제를 해결하려면 지저분한 셸 스크립트 해킹이 필요하며, 이 버그는 너무 사소해서 그런 노력을 들일만 한 가치가 없는 것 같습니다.)

@node 확장을 어떻게 디버깅합니까?,리눅스 시스템에서 파이썬 모듈을 컴파일하고 싶지만 일부 파일이 없습니다 왜 그렇습니까?,Setup 파일을 사용하여 모듈을 추가했는데 make가 실패합니다; 왜 그렇습니까?,확장/내장 FAQ
@anchor{faq/extending how-do-i-debug-an-extension}@anchor{59bb}
@subsection 확장을 어떻게 디버깅합니까?


동적으로 로드된 확장에 GDB를 사용할 때, 확장이 로드될 때까지 확장에 중단점을 설정할 수 없습니다.

@code{.gdbinit} 파일에서 (또는 대화식으로) 다음 명령을 추가하십시오:

@example
br _PyImport_LoadDynamicModule
@end example

그런 다음, GDB를 실행할 때:

@example
$ gdb /local/bin/python
gdb) run myscript.py
gdb) continue # repeat until your extension is loaded
gdb) finish   # so that your extension is loaded
gdb) br myfunction.c:50
gdb) continue
@end example

@node 리눅스 시스템에서 파이썬 모듈을 컴파일하고 싶지만 일부 파일이 없습니다 왜 그렇습니까?,“잘못된 입력”과 “불완전한 입력”을 어떻게 구별할 수 있습니까?,확장을 어떻게 디버깅합니까?,확장/내장 FAQ
@anchor{faq/extending i-want-to-compile-a-python-module-on-my-linux-system-but-some-files-are-missing-why}@anchor{59bc}
@subsection 리눅스 시스템에서 파이썬 모듈을 컴파일하고 싶지만, 일부 파일이 없습니다. 왜 그렇습니까?


대부분의 포장된 버전의 파이썬은 파이썬 확장을 컴파일하는 데 필요한 일부 파일을 생략하고 있습니다.

레드햇의 경우, 필요한 파일을 얻으려면 python3-devel RPM을 설치하십시오.

데비안의 경우, @code{apt-get install python3-dev}를 실행하십시오.

@node “잘못된 입력”과 “불완전한 입력”을 어떻게 구별할 수 있습니까?,정의되지 않은 g++ 기호 __builtin_new나 __pure_virtual을 어떻게 찾을 수 있습니까?,리눅스 시스템에서 파이썬 모듈을 컴파일하고 싶지만 일부 파일이 없습니다 왜 그렇습니까?,확장/내장 FAQ
@anchor{faq/extending how-do-i-tell-incomplete-input-from-invalid-input}@anchor{59bd}
@subsection “잘못된 입력”과 “불완전한 입력”을 어떻게 구별할 수 있습니까?


때로 파이썬 대화식 인터프리터의 동작을 흉내 내고 싶을 때가 있습니다. 이것은 입력이 불완전할 때 (예를 들어, “if” 문의 시작을 입력했거나 괄호나 삼중 문자열 따옴표를 닫지 않았을 때) 계속 프롬프트를 표시하지만, 입력이 유효하지 않으면 즉시 문법 에러 메시지를 표시합니다.

파이썬에서는 @ref{1d,,codeop} 모듈을 사용할 수 있습니다. 이 모듈은 구문 분석기의 동작을 충분히 근사합니다. 예를 들어, IDLE은 이것을 사용합니다.

C에서 이렇게 하는 가장 쉬운 방법은 @ref{5208,,PyRun_InteractiveLoop()}를 호출하고 (아마 별도의 스레드에서), 파이썬 인터프리터가 입력을 처리하도록 하는 것입니다. @ref{7a4,,PyOS_ReadlineFunctionPointer()} 가 여러분의 사용자 정의 입력 함수를 가리 키도록 설정할 수도 있습니다. 자세한 힌트는 @code{Modules/readline.c}와 @code{Parser/myreadline.c}를 참조하십시오.

@node 정의되지 않은 g++ 기호 __builtin_new나 __pure_virtual을 어떻게 찾을 수 있습니까?,일부 메서드는 C로 구현되고 그 밖의 것은 파이썬으로 구현된 예를 들어 상속을 통해 객체 클래스를 만들 수 있습니까?,“잘못된 입력”과 “불완전한 입력”을 어떻게 구별할 수 있습니까?,확장/내장 FAQ
@anchor{faq/extending how-do-i-find-undefined-g-symbols-builtin-new-or-pure-virtual}@anchor{59be}
@subsection 정의되지 않은 g++ 기호 __builtin_new나 __pure_virtual을 어떻게 찾을 수 있습니까?


g++ 확장 모듈을 동적으로 로드하려면, 파이썬을 다시 컴파일하고, g++를 사용하여 다시 링크하고 (파이썬 Modules Makefile에서 LINKCC를 변경하십시오), g++를 사용하여 여러분의 확장 모듈을 링크해야 합니다 (예를 들어, @code{g++ -shared -o mymodule.so mymodule.o}).

@node 일부 메서드는 C로 구현되고 그 밖의 것은 파이썬으로 구현된 예를 들어 상속을 통해 객체 클래스를 만들 수 있습니까?,,정의되지 않은 g++ 기호 __builtin_new나 __pure_virtual을 어떻게 찾을 수 있습니까?,확장/내장 FAQ
@anchor{faq/extending can-i-create-an-object-class-with-some-methods-implemented-in-c-and-others-in-python-e-g-through-inheritance}@anchor{59bf}
@subsection 일부 메서드는 C로 구현되고 그 밖의 것은 파이썬으로 구현된 (예를 들어 상속을 통해) 객체 클래스를 만들 수 있습니까?


그렇습니다, @ref{19b,,int}, @ref{24d,,list}, @ref{183,,dict} 등과 같은 내장 클래스를 상속할 수 있습니다.

Boost 파이썬 라이브러리(BPL, @indicateurl{https://www.boost.org/libs/python/doc/index.html})는 C++에서 이를 수행하는 방법을 제공합니다 (즉, BPL을 사용하여 C++로 작성된 확장 클래스를 상속할 수 있습니다).

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 윈도우 파이썬 FAQ,그래픽 사용자 인터페이스 FAQ,확장/내장 FAQ,파이썬 자주 나오는 질문들
@anchor{faq/windows doc}@anchor{59c0}@anchor{faq/windows python-on-windows-faq}@anchor{59c1}@anchor{faq/windows translation-repo}@anchor{59c2}@anchor{faq/windows windows-faq}@anchor{59c3}
@section 윈도우 파이썬 FAQ



@c XXX need review for Python 3.
@c XXX need review for Windows Vista/Seven?

@menu
* 윈도우에서 파이썬 프로그램을 실행하려면 어떻게 해야 합니까?:: 
* 파이썬 스크립트 실행 파일로 만들려면 어떻게 해야 합니까?:: 
* 왜 때때로 파이썬은 시작하는 데 시간이 오래 걸립니까?:: 
* 파이썬 스크립트에서 실행 파일을 만드는 방법은 무엇입니까?:: 
* *.pyd 파일은 DLL과 동일합니까?: * pyd 파일은 DLL과 동일합니까?. 
* 윈도우 응용프로그램에 파이썬을 포함하려면 어떻게 해야 합니까?:: 
* 편집기가 내 파이썬 소스에 탭을 삽입하지 않도록 하려면 어떻게 해야 합니까?:: 
* 블로킹 없이 키 입력을 확인하려면 어떻게 해야 합니까?:: 
* How do I solve the missing api-ms-win-crt-runtime-l1-1-0.dll error?: How do I solve the missing api-ms-win-crt-runtime-l1-1-0 dll error?. 

@end menu

@node 윈도우에서 파이썬 프로그램을 실행하려면 어떻게 해야 합니까?,파이썬 스크립트 실행 파일로 만들려면 어떻게 해야 합니까?,,윈도우 파이썬 FAQ
@anchor{faq/windows faq-run-program-under-windows}@anchor{59c4}@anchor{faq/windows how-do-i-run-a-python-program-under-windows}@anchor{59c5}
@subsection 윈도우에서 파이썬 프로그램을 실행하려면 어떻게 해야 합니까?


이 질문은 명확한 질문이 아닙니다. 이미 윈도우 명령 줄에서 프로그램을 실행하는 것에 익숙 하다면 이 모든 것이 분명할 것입니다. 그렇지 않으면, 좀 더 지침이 필요할 수 있습니다.

당신이 어떤 통합 개발 환경을 쓰지 않는 이상, 결국 “명령 프롬프트 창”이라 불리는 것에 윈도우 명령어를 `입력' 할 것입니다. 보통 윈도우 검색 창에서 @code{cmd} 를 입력하여 이 창을 띄울 수 있습니다. 일반적으로 다음과 같은 윈도우의 “명령 프롬프트”가 표시되기 때문에 이러한 창이 언제 시작했는지 인지할 수 있어야 합니다:

@example
C:\>
@end example

아마 글자가 다르고, 그 뒤에 다른 것들이 있을 수 있습니다. 그러므로 다음과 같은 것을 쉽게 볼 수 있습니다:

@example
D:\YourName\Projects\Python>
@end example

컴퓨터 설정 방법과 최근에 끝낸 그 밖의 것에 의존적입니다. 일단 이런 창을 시작했다면, 파이썬 프로그램을 실행할 준비가 된 것입니다.

파이썬 스크립트는 파이썬 `인터프리터' 라는 다른 프로그램에서 진행할 필요가 있다는 것을 알고 있어야 합니다. 인터프리터는 스크립트를 읽고, 바이트 코드로 컴파일하고, 바이트 코드를 실행하여 프로그램을 구동합니다. 그렇다면, 인터프리터를 통해 파이썬을 처리하려면 어떻게 준비해야 하겠습니까?

먼저, 명령 창이 “py”라는 단어를 해석기를 시작하는 지시로 인식하는지 확인해야합니다. 명령 창을 열고 있으면, 명령 @code{py} 를 입력하고 return 키를 눌러야 합니다:

@example
C:\Users\YourName> py
@end example

다음과 같이 표시됩니다:

@example
Python 3.6.4 (v3.6.4:d48eceb, Dec 19 2017, 06:04:45) [MSC v.1900 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>
@end example

인터프리터를 “대화형 모드”로 시작했습니다. 즉, 파이썬 문장이나 표현식을 대화식으로 입력하여 대기하는 중에 실행 혹은 평가시킬 수 있습니다. 이것은 파이썬의 가장 강력한 기능 중 하나입니다. 선택한 몇 가지 수식을 입력하여 확인하고 그 결과를 확인하십시오:

@example
>>> print("Hello")
Hello
>>> "Hello" * 3
'HelloHelloHello'
@end example

많은 사람이 대화형 모드를 편리하면서도 프로그래밍이 가능한 계산기로 사용합니다. 대화형 파이썬 세션을 종료하려면, @ref{25e8,,exit()} 함수를 호출하거나 @code{Z} 를 입력하면서 @code{Ctrl} 키를 누르고 나서 “@code{Enter}” 키를 눌러 윈도우 명령 프롬프트로 돌아갑니다.

또한, 시작 ‣ 프로그램 ‣ Python 3.x ‣ Python(명령 줄) 메뉴 선택과 같은 시작 메뉴 항목을 찾아볼 수 있으며, 그 결과 새 창에서 @code{>>>} 프롬프트를 볼 수 있습니다. 이 경우, @ref{25e8,,exit()} 함수를 호출하거나 @code{Ctrl}-@code{Z} 를 입력하면 창이 사라집니다. 윈도우에서 단일 “python” 명령을 실행하는 중이고, 인터프리터를 종료하면 창을 닫습니다.

이제 @code{py} 명령이 인식되었으므로, 당신은 당신의 파이썬 스크립트를 줄 수 있습니다. 파이썬 스크립트에 절대 경로나 상대 경로를 지정해야 할 것입니다. 당신의 파이썬 스크립트가 @code{hello.py} 라는 이름으로 당신의 데스크톱에 위치한다고 하면, 명령 프롬프트가 홈 디렉토리에 잘 열려있으므로 다음과 같이 내용이 표시됩니다:

@example
C:\Users\YourName>
@end example

그래서 이제 스크립트 경로 뒤에 @code{py} 를 입력하여 파이썬 스크립트를 제공하기 위해 @code{py} 명령을 요청할 것입니다:

@example
C:\Users\YourName> py Desktop\hello.py
hello
@end example

@node 파이썬 스크립트 실행 파일로 만들려면 어떻게 해야 합니까?,왜 때때로 파이썬은 시작하는 데 시간이 오래 걸립니까?,윈도우에서 파이썬 프로그램을 실행하려면 어떻게 해야 합니까?,윈도우 파이썬 FAQ
@anchor{faq/windows how-do-i-make-python-scripts-executable}@anchor{59c6}
@subsection 파이썬 스크립트 실행 파일로 만들려면 어떻게 해야 합니까?


윈도우에서 표준 파이썬 설치관리자는 이미 .py 확장자와 파일 유형(Python.File)을 연결했고, 인터프리터(@code{D:\Program Files\Python\python.exe "%1" %*})를 실행하는 open 명령의 파일 유형을 제공합니다. 이것은 명령 프롬프트에서 ‘foo.py’ 과 같은 스크립트 실행파일을 만들기에 충분합니다. 확장자명 없이 ‘foo’ 를 입력하여 스크립트를 실행하려면 PATHEXT 환경 변수에 .py를 추가해야 합니다.

@node 왜 때때로 파이썬은 시작하는 데 시간이 오래 걸립니까?,파이썬 스크립트에서 실행 파일을 만드는 방법은 무엇입니까?,파이썬 스크립트 실행 파일로 만들려면 어떻게 해야 합니까?,윈도우 파이썬 FAQ
@anchor{faq/windows why-does-python-sometimes-take-so-long-to-start}@anchor{59c7}
@subsection 왜 때때로 파이썬은 시작하는 데 시간이 오래 걸립니까?


일반적으로 파이썬은 윈도우에서 매우 빠르게 시작되지만, 때때로 파이썬을 시작하는 데 갑자기 오랜 시간이 걸린다는 버그 보고서가 있습니다. 이러한 것은 파이썬이 동일하게 구성된 것으로 보이는 다른 윈도우 시스템에서 잘 작동하기 때문에 더욱 더 곤혹스럽게 만듭니다.

이 문제는 해당 컴퓨터의 바이러스 검사 소프트웨어의 잘못된 설정으로 발생하는 것일 수 있습니다. 일부 바이러스 스캐너는 파일 시스템으로부터 읽은 모든 것을 모니터링하도록 스캐너를 구성할 때 두 자릿수 규모의 시동 오버헤드를 도입하는 것으로 알려져 있습니다. 시스템에서 바이러스 검사 소프트웨어의 구성을 확인하여 실제로 동일하게 구성되었는지 확인하십시오. 모든 파일 시스템 읽기 작업을 검색하도록 구성된 경우, McAfee는 특히 문제를 일으킵니다.

@node 파이썬 스크립트에서 실행 파일을 만드는 방법은 무엇입니까?,* pyd 파일은 DLL과 동일합니까?,왜 때때로 파이썬은 시작하는 데 시간이 오래 걸립니까?,윈도우 파이썬 FAQ
@anchor{faq/windows how-do-i-make-an-executable-from-a-python-script}@anchor{59c8}
@subsection 파이썬 스크립트에서 실행 파일을 만드는 방법은 무엇입니까?


See @ref{591c,,파이썬 스크립트로 독립 실행형 바이너리를 만들려면 어떻게 해야 합니까?} for a list of tools that can be used to
make executables.

@node * pyd 파일은 DLL과 동일합니까?,윈도우 응용프로그램에 파이썬을 포함하려면 어떻게 해야 합니까?,파이썬 스크립트에서 실행 파일을 만드는 방법은 무엇입니까?,윈도우 파이썬 FAQ
@anchor{faq/windows is-a-pyd-file-the-same-as-a-dll}@anchor{59c9}
@subsection @code{*.pyd} 파일은 DLL과 동일합니까?


예, .pyd 파일은 dll 이지만, 몇 가지 차이점이 있습니다. 만약 당신이 @code{foo.pyd} 라는 이름의 DLL을 가지고 있다면, @code{PyInit_foo()} 함수를 반드시 가지고 있어야 합니다. 당신은 파이썬 “import foo”를 쓸 수 있으며, 파이썬은 (foo.py, foo.pyc 뿐만 아니라) foo.pyd 를 검색할 것이고, 이를 발견하면 초기화하기 위해 @code{PyInit_foo()} 호출을 시도할 것입니다. 윈도우에서 DLL 의 존재를 요구할 것이기 때문에 .exe를 foo.lib와 링크하면 안 됩니다.

foo.pyd에 대한 검색 경로는 윈도우에서 foo.dll을 검색하는 데 사용하는 경로가 아닌 PYTHONPATH임을 유의하십시오. 또한, 프로그램을 실행하기 위해 foo.pyd가 있을 필요는 없지만, 프로그램을 dll과 링크한 경우에는 dll이 필요합니다. 물론, @code{import foo} 를 하기 위해서는 foo.pyd가 필요합니다. DLL에서 링키지는 소스 코드에서 @code{__declspec(dllexport)} 로 선언됩니다. .pyd에서 링키지는 사용 가능한 함수 목록에 정의됩니다.

@node 윈도우 응용프로그램에 파이썬을 포함하려면 어떻게 해야 합니까?,편집기가 내 파이썬 소스에 탭을 삽입하지 않도록 하려면 어떻게 해야 합니까?,* pyd 파일은 DLL과 동일합니까?,윈도우 파이썬 FAQ
@anchor{faq/windows how-can-i-embed-python-into-a-windows-application}@anchor{59ca}
@subsection 윈도우 응용프로그램에 파이썬을 포함하려면 어떻게 해야 합니까?


윈도우 앱에서 파이썬 인터프리터를 포함하려면 다음과 같이 요약할 수 있습니다:


@enumerate 

@item 
.exe 파일에 직접 파이썬을 빌드하면 `안' 됩니다. 윈도우에서 파이썬은 그 자신이 DLL인 모듈의 임포트를 처리하기 위해서는 DLL이어야 합니다. (이것이 문서화되지 않은 첫 번째 사실입니다) 대신에, @code{python`NN'.dll} 에 링크하면 됩니다. 일반적으로 @code{C:\Windows\System} 에 설치됩니다. `NN'은 파이썬 버전이고, Python 3.3의 경우 “33”과 같은 숫자입니다.

두 가지 방법으로 파이썬에 링크할 수 있습니다. 로드 타임 링크는 @code{python`NN'.lib} 에 대한 링크를 의미하고, 런타임 링크는 @code{python`NN'.dll} 에 대한 링크를 의미합니다. (일반 참고: @code{python`NN'.lib} 는 @code{python`NN'.dll} 에 해당하는 소위 “import lib”입니다. 오직 링커를 위해 기호만 정의합니다)

런타임 링크는 링크 옵션을 크게 단순화합니다. 모든 것은 런타임 중에 발생합니다. 당신의 코드는 윈도우 @code{LoadLibraryEx()} 루틴을 사용하여 @code{python`NN'.dll} 을 로드해야 합니다. 그 코드는 윈도우 @code{GetProcAddress()} 루틴에서 얻은 포인터를 사용하여 @code{python`NN'.dll} (파이썬의 C API)의 엑세스 루틴 및 데이터를 사용해야 합니다. 매크로는 이러한 포인터를 파이썬 C API에서 루틴을 호출하는 모든 C 코드에 투명하게 사용할 수 있습니다.

@c XXX what about static linking?

@item 
SWIG를 사용할 경우, 앱의 데이터와 메서드를 파이썬에서 사용할 수 있게 만드는 파이썬 “확장 모듈”을 생성하는 것이 쉽습니다. SWIG는 당신을 위해 모든 성가신 세부사항들을 처리할 것입니다. 그 결과로 .exe 파일에 링크한 C 코드가 생성됩니다! DLL 파일을 만들 필요가 `없으며', 만들지 않으면 링크하는 것도 간단해집니다.

@item 
SWIG는 확장 모듈의 이름에 따라 이름이 달라지는 초기화 함수(C 함수)를 생성합니다. 예를 들어, 모듈의 이름이 leo인 경우, 초기화 함수를 initleo()로 합니다. SWIG 섀도 클래스를 사용하면 initleoc()로 합니다. 이것은 섀도 클래스가 사용하는 대부분 숨겨진 조력자 클래스를 초기화합니다.

2단계에서 C 코드를 .exe 파일에 링크할 수 있는 이유는 초기화 함수를 호출하는 것이 모듈을 파이썬으로 임포트하는 것과 동일하기 때문입니다! (이것이 문서화되지 않은 두 번째 사실입니다)

@item 
간단히 말해서, 당신은 당신의 확장 모듈로 파이썬 인터프리터를 초기화하기 위해 다음 코드를 사용할 수 있습니다.

@example
#include <Python.h>
...
Py_Initialize();  // 파이썬을 초기화합니다.
initmyAppc();  // 헬퍼 클래스를 초기화(임포트)합니다.
PyRun_SimpleString("import myApp");  // 섀도 클래스를 임포트합니다.
@end example

@item 
파이썬의 C API에는 두 가지 문제가 있는데, 이것은 당신이 PythonNN.dll을 만드는 데 사용되는 컴파일러인 MSVC 이외의 컴파일러를 사용하면 명백해집니다.

문제 1: @code{FILE *} 인자를 취하는 소위 “매우 높은 수준”의 함수는 각 컴파일러의 구조체 FILE 개념이 다르기 때문에 멀티 컴파일러 환경에서는 작동하지 않습니다. 구현 관점에서 볼 때 이들은 매우 낮은 수준의 함수입니다.

문제 2: 반환값이 void인 C 함수의 래퍼를 생성할 때 SWIG는 다음과 같은 코드를 생성합니다:

@example
Py_INCREF(Py_None);
_resultobj = Py_None;
return _resultobj;
@end example

아아, Py_None은 pythonNN.dll 내부의 _Py_NoneStruct라는 복잡한 데이터 구조에 대한 참조로 확장하는 매크로입니다. 다시 말하자면, 이 코드는 멀티 컴파일러 환경에서 실패할 것입니다. 다음과 같은 코드로 바꾸십시오:

@example
return Py_BuildValue("");
@end example

저는 이것을 작동시키지는 못했지만, SWIG의 @code{%typemap} 명령을 사용하여 자동으로 변경하는 것이 가능할지도 모릅니다(저는 완전 SWIG 초보자입니다).

@item 
윈도우 앱 내부에서 파이썬 셸 스크립트를 사용하여 파이썬 인터프리터 창을 설치하는 것은 좋은 생각이 아닙니다. 결과 창은 앱의 창 시스템과는 독립적일 것입니다. 오히려, 당신(또는 wxPythonWindow 클래스)은 “native” 인터프리터 창을 만들어야 합니다. 이 창은 파이썬 인터프리터와 연결하기 쉽습니다. 당신은 파이썬의 i/o를 읽기 및 쓰기를 지원하는 모든 객체로 리디렉션할 수 있으므로 read() 와 write() 메서드를 포함하는 파이썬 객체(확장 모듈에 정의됨)만 있으면 됩니다.
@end enumerate

@node 편집기가 내 파이썬 소스에 탭을 삽입하지 않도록 하려면 어떻게 해야 합니까?,블로킹 없이 키 입력을 확인하려면 어떻게 해야 합니까?,윈도우 응용프로그램에 파이썬을 포함하려면 어떻게 해야 합니까?,윈도우 파이썬 FAQ
@anchor{faq/windows how-do-i-keep-editors-from-inserting-tabs-into-my-python-source}@anchor{59cb}
@subsection 편집기가 내 파이썬 소스에 탭을 삽입하지 않도록 하려면 어떻게 해야 합니까?


FAQ는 탭을 사용하는 것을 권장하지 않으며, 파이썬 스타일 안내서( 
@geindex Python 향상 제안; PEP 8
PEP 8@footnote{https://peps.python.org/pep-0008/} )는 분산된 파이썬 코드에 대해 4 개의 스페이스를 권장합니다. 이 또한 Emacs python-mode의 기본값입니다.

모든 편집기에서 탭과 스페이스를 혼용하는 것은 좋은 생각이 아닙니다. 이 점에서 MSVC는 다르지 않으며 스페이스를 사용하기 쉽게 구성됩니다: 다음 행동을 따라 해보십시오 Tools ‣ Options ‣ Tabs, 그리고 파일 유형은 “”Default”로 하고 “Tab size”와 “Indent size”는 4로 설정하고, “Insert spaces”를 라디오 버튼으로 선택합니다.

만일 혼용된 탭과 스페이스로 인해 선행 공백에 문제가 발생하는 경우, 파이썬이 @ref{9ab,,IndentationError} 나 @ref{764,,TabError} 를 발생시킵니다. 또한, @ref{e3,,tabnanny} 모듈을 실행하여 배치 모드에서 디렉터리 트리를 확인할 수도 있습니다.

@node 블로킹 없이 키 입력을 확인하려면 어떻게 해야 합니까?,How do I solve the missing api-ms-win-crt-runtime-l1-1-0 dll error?,편집기가 내 파이썬 소스에 탭을 삽입하지 않도록 하려면 어떻게 해야 합니까?,윈도우 파이썬 FAQ
@anchor{faq/windows how-do-i-check-for-a-keypress-without-blocking}@anchor{59cc}
@subsection 블로킹 없이 키 입력을 확인하려면 어떻게 해야 합니까?


@ref{97,,msvcrt} 모듈을 사용합니다. 이것은 표준 윈도우-특정 확장 모듈입니다. 이것은 키보드 히트가 존재하는지를 확인하는 @code{kbhit()} 와 에코 없이 문자를 얻는 @code{getch()} 를 정의합니다.

@node How do I solve the missing api-ms-win-crt-runtime-l1-1-0 dll error?,,블로킹 없이 키 입력을 확인하려면 어떻게 해야 합니까?,윈도우 파이썬 FAQ
@anchor{faq/windows how-do-i-solve-the-missing-api-ms-win-crt-runtime-l1-1-0-dll-error}@anchor{59cd}
@subsection How do I solve the missing api-ms-win-crt-runtime-l1-1-0.dll error?


This can occur on Python 3.5 and later when using Windows 8.1 or earlier without all updates having been installed.
First ensure your operating system is supported and is up to date, and if that does not resolve the issue,
visit the Microsoft support page@footnote{https://support.microsoft.com/en-us/help/3118401/}
for guidance on manually installing the C Runtime update.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 그래픽 사용자 인터페이스 FAQ,“왜 내 컴퓨터에 파이썬이 설치되어 있습니까?” FAQ,윈도우 파이썬 FAQ,파이썬 자주 나오는 질문들
@anchor{faq/gui doc}@anchor{59ce}@anchor{faq/gui graphic-user-interface-faq}@anchor{59cf}@anchor{faq/gui translation-repo}@anchor{59d0}
@section 그래픽 사용자 인터페이스 FAQ



@c XXX need review for Python 3.

@menu
* 일반적인 GUI 질문:: 
* 파이썬에 어떤 GUI 툴킷이 있습니까?:: 
* Tkinter 질문:: 

@end menu

@node 일반적인 GUI 질문,파이썬에 어떤 GUI 툴킷이 있습니까?,,그래픽 사용자 인터페이스 FAQ
@anchor{faq/gui general-gui-questions}@anchor{59d1}
@subsection 일반적인 GUI 질문


@node 파이썬에 어떤 GUI 툴킷이 있습니까?,Tkinter 질문,일반적인 GUI 질문,그래픽 사용자 인터페이스 FAQ
@anchor{faq/gui what-gui-toolkits-exist-for-python}@anchor{59d2}
@subsection 파이썬에 어떤 GUI 툴킷이 있습니까?


파이썬의 표준 빌드에는 Tcl/Tk 위젯 집합에 대한 객체 지향 인터페이스가 포함되는데, @ref{431f,,tkinter}라고 불립니다. 이것이 아마도 가장 (파이썬의 대부분 바이너리 배포@footnote{https://www.python.org/downloads/}에 포함되어 있으므로) 설치하고 사용하기 쉽습니다. 소스에 대한 안내를 포함하는 Tk에 대한 자세한 내용은 Tcl/Tk 홈페이지@footnote{https://www.tcl.tk}를 참조하십시오. Tcl/Tk는 맥 OS, 윈도우 및 유닉스 플랫폼에 완벽하게 호환됩니다.

여러분이 목표로 하는 플랫폼에 따라, 몇 가지 대안이 있습니다. 크로스 플랫폼@footnote{https://wiki.python.org/moin/GuiProgramming#Cross-Platform_Frameworks} 및 플랫폼 특정@footnote{https://wiki.python.org/moin/GuiProgramming#Platform-specific_Frameworks} GUI 프레임워크의 목록을 파이썬 위키에서 확인할 수 있습니다.

@node Tkinter 질문,,파이썬에 어떤 GUI 툴킷이 있습니까?,그래픽 사용자 인터페이스 FAQ
@anchor{faq/gui tkinter-questions}@anchor{59d3}
@subsection Tkinter 질문


@menu
* Tkinter 응용 프로그램을 어떻게 고정(freeze)합니까?: Tkinter 응용 프로그램을 어떻게 고정 freeze 합니까?. 
* I/O를 기다리는 동안 Tk 이벤트를 처리하도록 할 수 있습니까?:: 
* Tkinter에서 키 바인딩이 동작하지 않습니다; 이유가 무엇입니까?: Tkinter에서 키 바인딩이 동작하지 않습니다 이유가 무엇입니까?. 

@end menu

@node Tkinter 응용 프로그램을 어떻게 고정 freeze 합니까?,I/O를 기다리는 동안 Tk 이벤트를 처리하도록 할 수 있습니까?,,Tkinter 질문
@anchor{faq/gui how-do-i-freeze-tkinter-applications}@anchor{59d4}
@subsubsection Tkinter 응용 프로그램을 어떻게 고정(freeze)합니까?


Freeze는 독립 실행형 응용 프로그램을 만드는 도구입니다. Tkinter 응용 프로그램을 고정할 때, 응용 프로그램은 여전히 Tcl과 Tk 라이브러리가 필요하므로 진정한 독립 실행형이 아닙니다.

한 가지 해결책은 응용 프로그램을 Tcl과 Tk 라이브러리와 함께 제공하고, 그것들을 실행 시간에 @code{TCL_LIBRARY}와 @code{TK_LIBRARY} 환경 변수를 사용하여 가리키는 것입니다.

Various third-party freeze libraries such as py2exe and cx_Freeze have
handling for Tkinter applications built-in.

@node I/O를 기다리는 동안 Tk 이벤트를 처리하도록 할 수 있습니까?,Tkinter에서 키 바인딩이 동작하지 않습니다 이유가 무엇입니까?,Tkinter 응용 프로그램을 어떻게 고정 freeze 합니까?,Tkinter 질문
@anchor{faq/gui can-i-have-tk-events-handled-while-waiting-for-i-o}@anchor{59d5}
@subsubsection I/O를 기다리는 동안 Tk 이벤트를 처리하도록 할 수 있습니까?


윈도우 이외의 다른 플랫폼에서라면, 그렇습니다, 그리고 스레드가 필요하지도 않습니다! 그러나 I/O 코드를 약간 재구성해야 합니다. Tk는 Xt의 @code{XtAddInput()} 호출과 동등한 것을 갖고 있는데, 파일 기술자에서 I/O가 가능할 때 Tk 메인 루프에서 호출할 콜백 함수를 등록할 수 있도록 합니다. @ref{433d,,파일 처리기}를 참조하십시오.

@node Tkinter에서 키 바인딩이 동작하지 않습니다 이유가 무엇입니까?,,I/O를 기다리는 동안 Tk 이벤트를 처리하도록 할 수 있습니까?,Tkinter 질문
@anchor{faq/gui i-can-t-get-key-bindings-to-work-in-tkinter-why}@anchor{59d6}
@subsubsection Tkinter에서 키 바인딩이 동작하지 않습니다: 이유가 무엇입니까?


자주 들리는 불만은 적절한 키를 눌러도 @code{bind()} 메서드로 이벤트에 @ref{4338,,연결된} 이벤트 처리기가 처리되지 않는다는 것입니다.

가장 흔한 원인은 바인딩이 적용되는 위젯에 “키보드 포커스”가 없는 것입니다. focus 명령에 대한 Tk 설명서를 확인하십시오. 보통 위젯은 그것을 클릭할 때 키보드 포커스를 받습니다 (레이블은 그렇지 않습니다; takefocus 옵션을 보십시오).

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node “왜 내 컴퓨터에 파이썬이 설치되어 있습니까?” FAQ,,그래픽 사용자 인터페이스 FAQ,파이썬 자주 나오는 질문들
@anchor{faq/installed doc}@anchor{59d7}@anchor{faq/installed translation-repo}@anchor{59d8}@anchor{faq/installed why-is-python-installed-on-my-computer-faq}@anchor{59d9}
@section “왜 내 컴퓨터에 파이썬이 설치되어 있습니까?” FAQ


@menu
* 파이썬이 무엇입니까?: 파이썬이 무엇입니까?<2>. 
* 내 컴퓨터에 파이썬이 설치된 이유는 무엇입니까?:: 
* 파이썬을 삭제할 수 있습니까?:: 

@end menu

@node 파이썬이 무엇입니까?<2>,내 컴퓨터에 파이썬이 설치된 이유는 무엇입니까?,,“왜 내 컴퓨터에 파이썬이 설치되어 있습니까?” FAQ
@anchor{faq/installed what-is-python}@anchor{59da}
@subsection 파이썬이 무엇입니까?


파이썬은 프로그래밍 언어입니다. 많은 다른 응용 프로그램에 사용됩니다. 파이썬은 배우기 쉬우므로 일부 고등학교와 대학에서는 입문 프로그래밍 언어로 사용되지만, Google, NASA 및 Lucasfilm Ltd.와 같은 곳에서 전문 소프트웨어 개발자가 사용하기도 합니다.

파이썬에 대해 더 알고 싶다면, 파이썬 입문자 지침서@footnote{https://wiki.python.org/moin/BeginnersGuide}부터 시작하십시오.

@node 내 컴퓨터에 파이썬이 설치된 이유는 무엇입니까?,파이썬을 삭제할 수 있습니까?,파이썬이 무엇입니까?<2>,“왜 내 컴퓨터에 파이썬이 설치되어 있습니까?” FAQ
@anchor{faq/installed why-is-python-installed-on-my-machine}@anchor{59db}
@subsection 내 컴퓨터에 파이썬이 설치된 이유는 무엇입니까?


파이썬이 시스템에 설치되어 있지만 설치한 기억이 없다면, 그렇게 될 수 있는 몇 가지 가능한 방법이 있습니다.


@itemize *

@item 
아마도 컴퓨터의 다른 사용자가 프로그래밍을 배우고 싶어 하고 그것을 설치했을 것입니다; 당신은 누가 컴퓨터를 사용했고 설치했는지 추측해야 합니다.

@item 
컴퓨터에 설치된 제삼자 응용 프로그램이 파이썬으로 작성되었으며, 파이썬 설치를 포함할 수 있습니다. GUI 프로그램에서 네트워크 서버와 관리 스크립트에 이르기까지 그런 응용 프로그램이 많이 있습니다.

@item 
일부 윈도우 컴퓨터에는 파이썬이 설치되어 있습니다. 이 글을 쓰는 시점에, 우리는 파이썬이 포함된 Hewlett-Packard와 Compaq의 컴퓨터에 대해 알고 있습니다. 분명히 HP/Compaq의 관리 도구 중 일부가 파이썬으로 작성되었을 겁니다.

@item 
맥 OS 및 일부 리눅스 배포판과 같은 많은 유닉스 호환 운영 체제에는 기본적으로 파이썬이 설치되어 있습니다; 기본 설치에 포함되어 있습니다.
@end itemize

@node 파이썬을 삭제할 수 있습니까?,,내 컴퓨터에 파이썬이 설치된 이유는 무엇입니까?,“왜 내 컴퓨터에 파이썬이 설치되어 있습니까?” FAQ
@anchor{faq/installed can-i-delete-python}@anchor{59dc}
@subsection 파이썬을 삭제할 수 있습니까?


파이썬이 어디서 왔는지에 달려 있습니다.

누군가 의도적으로 설치했으면, 아무 문제도 일으키지 않고 제거할 수 있습니다. 윈도우에서는, 제어판의 프로그램 추가/제거 아이콘을 사용하십시오.

제삼자 응용 프로그램에서 파이썬을 설치했다면, 제거할 수도 있지만, 해당 응용 프로그램이 더는 작동하지 않게 됩니다. 파이썬을 직접 제거하는 대신 해당 응용 프로그램의 제거 프로그램을 사용해야 합니다.

파이썬이 운영체제와 함께 제공되었다면, 제거하는 것은 바람직하지 않습니다. 제거하면, 파이썬으로 작성된 모든 도구가 더는 실행되지 않으며, 그중 일부는 중요할 수 있습니다. 문제를 해결하려면 다시 시스템을 재설치해야 할 수 있습니다.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Deprecations,용어집,파이썬 자주 나오는 질문들,Top
@anchor{deprecations/index doc}@anchor{59dd}@anchor{deprecations/index deprecations}@anchor{59de}@anchor{deprecations/index translation-repo}@anchor{59df}
@chapter Deprecations


@menu
* Pending removal in Python 3.15: Pending removal in Python 3 15<5>. 
* Pending removal in Python 3.16: Pending removal in Python 3 16<5>. 
* Pending removal in Python 3.17: Pending removal in Python 3 17<3>. 
* Pending removal in Python 3.18: Pending removal in Python 3 18<3>. 
* Pending removal in Python 3.19: Pending removal in Python 3 19<3>. 
* Pending removal in future versions: Pending removal in future versions<5>. 
* C API deprecations:: 

@end menu

@node Pending removal in Python 3 15<5>,Pending removal in Python 3 16<5>,,Deprecations
@anchor{deprecations/index pending-removal-in-python-3-15}@anchor{59e0}
@section Pending removal in Python 3.15



@itemize *

@item 
The import system:


@itemize *

@item 
Setting @ref{321,,__cached__} on a module while
failing to set @ref{322,,__spec__.cached}
is deprecated. In Python 3.15, @code{__cached__} will cease to be set or
take into consideration by the import system or standard library. (gh-97879@footnote{https://github.com/python/cpython/issues/97879})

@item 
Setting @ref{323,,__package__} on a module while
failing to set @ref{324,,__spec__.parent}
is deprecated. In Python 3.15, @code{__package__} will cease to be set or
take into consideration by the import system or standard library. (gh-97879@footnote{https://github.com/python/cpython/issues/97879})
@end itemize

@item 
@ref{2e,,ctypes}:


@itemize *

@item 
The undocumented @code{ctypes.SetPointerType()} function
has been deprecated since Python 3.13.
@end itemize

@item 
@ref{76,,http.server}:


@itemize *

@item 
The obsolete and rarely used @ref{325,,CGIHTTPRequestHandler}
has been deprecated since Python 3.13.
No direct replacement exists.
`Anything' is better than CGI to interface
a web server with a request handler.

@item 
The @code{--cgi} flag to the @code{python -m http.server}
command-line interface has been deprecated since Python 3.13.
@end itemize

@item 
@ref{7b,,importlib}:


@itemize *

@item 
@code{load_module()} method: use @code{exec_module()} instead.
@end itemize

@item 
@ref{8a,,locale}:


@itemize *

@item 
The @ref{326,,getdefaultlocale()} function
has been deprecated since Python 3.11.
Its removal was originally planned for Python 3.13 (gh-90817@footnote{https://github.com/python/cpython/issues/90817}),
but has been postponed to Python 3.15.
Use @ref{327,,getlocale()}, @ref{328,,setlocale()},
and @ref{329,,getencoding()} instead.
(Contributed by Hugo van Kemenade in gh-111187@footnote{https://github.com/python/cpython/issues/111187}.)
@end itemize

@item 
@ref{a8,,pathlib}:


@itemize *

@item 
@ref{32a,,PurePath.is_reserved()}
has been deprecated since Python 3.13.
Use @ref{32b,,os.path.isreserved()} to detect reserved paths on Windows.
@end itemize

@item 
@ref{af,,platform}:


@itemize *

@item 
@ref{32c,,java_ver()} has been deprecated since Python 3.13.
This function is only useful for Jython support, has a confusing API,
and is largely untested.
@end itemize

@item 
@ref{e1,,sysconfig}:


@itemize *

@item 
The `check_home' argument of @ref{32d,,sysconfig.is_python_build()} has been
deprecated since Python 3.12.
@end itemize

@item 
@ref{f3,,threading}:


@itemize *

@item 
@ref{32e,,RLock()} will take no arguments in Python 3.15.
Passing any arguments has been deprecated since Python 3.14,
as the Python version does not permit any arguments,
but the C version allows any number of positional or keyword arguments,
ignoring every argument.
@end itemize

@item 
@ref{109,,types}:


@itemize *

@item 
@ref{32f,,types.CodeType}: Accessing @ref{330,,co_lnotab} was
deprecated in 
@geindex Python 향상 제안; PEP 626
PEP 626@footnote{https://peps.python.org/pep-0626/}
since 3.10 and was planned to be removed in 3.12,
but it only got a proper @ref{1a3,,DeprecationWarning} in 3.12.
May be removed in 3.15.
(Contributed by Nikita Sobolev in gh-101866@footnote{https://github.com/python/cpython/issues/101866}.)
@end itemize

@item 
@ref{10a,,typing}:


@itemize *

@item 
The undocumented keyword argument syntax for creating
@ref{331,,NamedTuple} classes
(for example, @code{Point = NamedTuple("Point", x=int, y=int)})
has been deprecated since Python 3.13.
Use the class-based syntax or the functional syntax instead.

@item 
When using the functional syntax of @ref{332,,TypedDict}s, failing
to pass a value to the `fields' parameter (@code{TD = TypedDict("TD")}) or
passing @code{None} (@code{TD = TypedDict("TD", None)}) has been deprecated
since Python 3.13.
Use @code{class TD(TypedDict): pass} or @code{TD = TypedDict("TD", @{@})}
to create a TypedDict with zero field.

@item 
The @ref{333,,typing.no_type_check_decorator()} decorator function
has been deprecated since Python 3.13.
After eight years in the @ref{10a,,typing} module,
it has yet to be supported by any major type checker.
@end itemize

@item 
@ref{119,,wave}:


@itemize *

@item 
The @ref{334,,getmark()}, @code{setmark()},
and @ref{335,,getmarkers()} methods of
the @ref{336,,Wave_read} and @ref{337,,Wave_write} classes
have been deprecated since Python 3.13.
@end itemize

@item 
@ref{138,,zipimport}:


@itemize *

@item 
@ref{338,,load_module()} has been deprecated since
Python 3.10. Use @ref{339,,exec_module()} instead.
(Contributed by Jiahao Li in gh-125746@footnote{https://github.com/python/cpython/issues/125746}.)
@end itemize
@end itemize

@node Pending removal in Python 3 16<5>,Pending removal in Python 3 17<3>,Pending removal in Python 3 15<5>,Deprecations
@anchor{deprecations/index pending-removal-in-python-3-16}@anchor{59e1}
@section Pending removal in Python 3.16



@itemize *

@item 
The import system:


@itemize *

@item 
Setting @ref{33b,,__loader__} on a module while
failing to set @ref{33c,,__spec__.loader}
is deprecated. In Python 3.16, @code{__loader__} will cease to be set or
taken into consideration by the import system or the standard library.
@end itemize

@item 
@ref{8,,array}:


@itemize *

@item 
The @code{'u'} format code (@code{wchar_t})
has been deprecated in documentation since Python 3.3
and at runtime since Python 3.13.
Use the @code{'w'} format code (@ref{33d,,Py_UCS4})
for Unicode characters instead.
@end itemize

@item 
@ref{b,,asyncio}:


@itemize *

@item 
@code{asyncio.iscoroutinefunction()} is deprecated
and will be removed in Python 3.16;
use @ref{30d,,inspect.iscoroutinefunction()} instead.
(Contributed by Jiahao Li and Kumar Aditya in gh-122875@footnote{https://github.com/python/cpython/issues/122875}.)

@item 
@ref{b,,asyncio} policy system is deprecated and will be removed in Python 3.16.
In particular, the following classes and functions are deprecated:


@itemize *

@item 
@ref{30e,,asyncio.AbstractEventLoopPolicy}

@item 
@ref{30f,,asyncio.DefaultEventLoopPolicy}

@item 
@ref{310,,asyncio.WindowsSelectorEventLoopPolicy}

@item 
@ref{311,,asyncio.WindowsProactorEventLoopPolicy}

@item 
@ref{312,,asyncio.get_event_loop_policy()}

@item 
@ref{313,,asyncio.set_event_loop_policy()}
@end itemize

Users should use @ref{2f3,,asyncio.run()} or @ref{2f5,,asyncio.Runner} with
`loop_factory' to use the desired event loop implementation.

For example, to use @ref{314,,asyncio.SelectorEventLoop} on Windows:

@example
import asyncio

async def main():
    ...

asyncio.run(main(), loop_factory=asyncio.SelectorEventLoop)
@end example

(Contributed by Kumar Aditya in gh-127949@footnote{https://github.com/python/cpython/issues/127949}.)
@end itemize

@item 
@ref{13,,builtins}:


@itemize *

@item 
Bitwise inversion on boolean types, @code{~True} or @code{~False}
has been deprecated since Python 3.12,
as it produces surprising and unintuitive results (@code{-2} and @code{-1}).
Use @code{not x} instead for the logical negation of a Boolean.
In the rare case that you need the bitwise inversion of
the underlying integer, convert to @code{int} explicitly (@code{~int(x)}).
@end itemize

@item 
@ref{63,,functools}:


@itemize *

@item 
Calling the Python implementation of @ref{21a,,functools.reduce()} with `function'
or `sequence' as keyword arguments has been deprecated since Python 3.14.
@end itemize

@item 
@ref{8b,,logging}:

Support for custom logging handlers with the `strm' argument is deprecated
and scheduled for removal in Python 3.16. Define handlers with the `stream'
argument instead. (Contributed by Mariusz Felisiak in gh-115032@footnote{https://github.com/python/cpython/issues/115032}.)

@item 
@ref{93,,mimetypes}:


@itemize *

@item 
Valid extensions start with a ‘.’ or are empty for
@ref{319,,mimetypes.MimeTypes.add_type()}.
Undotted extensions are deprecated and will
raise a @ref{2ec,,ValueError} in Python 3.16.
(Contributed by Hugo van Kemenade in gh-75223@footnote{https://github.com/python/cpython/issues/75223}.)
@end itemize

@item 
@ref{ca,,shutil}:


@itemize *

@item 
The @code{ExecError} exception
has been deprecated since Python 3.14.
It has not been used by any function in @code{shutil} since Python 3.4,
and is now an alias of @ref{244,,RuntimeError}.
@end itemize

@item 
@ref{de,,symtable}:


@itemize *

@item 
The @ref{31d,,Class.get_methods} method
has been deprecated since Python 3.14.
@end itemize

@item 
@ref{df,,sys}:


@itemize *

@item 
The @ref{33e,,_enablelegacywindowsfsencoding()} function
has been deprecated since Python 3.13.
Use the 
@geindex PYTHONLEGACYWINDOWSFSENCODING
@geindex 환경 변수; PYTHONLEGACYWINDOWSFSENCODING
@ref{33f,,PYTHONLEGACYWINDOWSFSENCODING} environment variable instead.
@end itemize

@item 
@ref{e1,,sysconfig}:


@itemize *

@item 
The @code{sysconfig.expand_makefile_vars()} function
has been deprecated since Python 3.14.
Use the @code{vars} argument of @ref{340,,sysconfig.get_paths()} instead.
@end itemize

@item 
@ref{e4,,tarfile}:


@itemize *

@item 
The undocumented and unused @code{TarFile.tarfile} attribute
has been deprecated since Python 3.13.
@end itemize
@end itemize

@node Pending removal in Python 3 17<3>,Pending removal in Python 3 18<3>,Pending removal in Python 3 16<5>,Deprecations
@anchor{deprecations/index pending-removal-in-python-3-17}@anchor{59e2}
@section Pending removal in Python 3.17



@itemize *

@item 
@ref{1f,,collections.abc}:


@itemize -

@item 
@ref{342,,collections.abc.ByteString} is scheduled for removal in Python 3.17.

Use @code{isinstance(obj, collections.abc.Buffer)} to test if @code{obj}
implements the @ref{260,,buffer protocol} at runtime. For use
in type annotations, either use @ref{343,,Buffer} or a union
that explicitly specifies the types your code supports (e.g.,
@code{bytes | bytearray | memoryview}).

@code{ByteString} was originally intended to be an abstract class that
would serve as a supertype of both @ref{192,,bytes} and @ref{344,,bytearray}.
However, since the ABC never had any methods, knowing that an object was an
instance of @code{ByteString} never actually told you anything useful
about the object. Other common buffer types such as @ref{165,,memoryview}
were also never understood as subtypes of @code{ByteString} (either at
runtime or by static type checkers).

See 
@geindex Python 향상 제안; PEP 688#current-options
PEP 688@footnote{https://peps.python.org/pep-0688/#current-options} for more details.
(Contributed by Shantanu Jain in gh-91896@footnote{https://github.com/python/cpython/issues/91896}.)
@end itemize

@item 
@ref{10a,,typing}:


@itemize -

@item 
Before Python 3.14, old-style unions were implemented using the private class
@code{typing._UnionGenericAlias}. This class is no longer needed for the implementation,
but it has been retained for backward compatibility, with removal scheduled for Python
3.17. Users should use documented introspection helpers like @ref{2ab,,typing.get_origin()}
and @ref{2ac,,typing.get_args()} instead of relying on private implementation details.

@item 
@ref{345,,typing.ByteString}, deprecated since Python 3.9, is scheduled for removal in
Python 3.17.

Use @code{isinstance(obj, collections.abc.Buffer)} to test if @code{obj}
implements the @ref{260,,buffer protocol} at runtime. For use
in type annotations, either use @ref{343,,Buffer} or a union
that explicitly specifies the types your code supports (e.g.,
@code{bytes | bytearray | memoryview}).

@code{ByteString} was originally intended to be an abstract class that
would serve as a supertype of both @ref{192,,bytes} and @ref{344,,bytearray}.
However, since the ABC never had any methods, knowing that an object was an
instance of @code{ByteString} never actually told you anything useful
about the object. Other common buffer types such as @ref{165,,memoryview}
were also never understood as subtypes of @code{ByteString} (either at
runtime or by static type checkers).

See 
@geindex Python 향상 제안; PEP 688#current-options
PEP 688@footnote{https://peps.python.org/pep-0688/#current-options} for more details.
(Contributed by Shantanu Jain in gh-91896@footnote{https://github.com/python/cpython/issues/91896}.)
@end itemize
@end itemize

@node Pending removal in Python 3 18<3>,Pending removal in Python 3 19<3>,Pending removal in Python 3 17<3>,Deprecations
@anchor{deprecations/index pending-removal-in-python-3-18}@anchor{59e3}
@section Pending removal in Python 3.18



@itemize *

@item 
@ref{3a,,decimal}:


@itemize *

@item 
The non-standard and undocumented @ref{1fe,,Decimal} format
specifier @code{'N'}, which is only supported in the @code{decimal} module’s
C implementation, has been deprecated since Python 3.13.
(Contributed by Serhiy Storchaka in gh-89902@footnote{https://github.com/python/cpython/issues/89902}.)
@end itemize
@end itemize

@node Pending removal in Python 3 19<3>,Pending removal in future versions<5>,Pending removal in Python 3 18<3>,Deprecations
@anchor{deprecations/index pending-removal-in-python-3-19}@anchor{59e4}
@section Pending removal in Python 3.19



@itemize *

@item 
@ref{2e,,ctypes}:


@itemize *

@item 
Implicitly switching to the MSVC-compatible struct layout by setting
@ref{317,,_pack_} but not @ref{1e7,,_layout_}
on non-Windows platforms.
@end itemize
@end itemize

@node Pending removal in future versions<5>,C API deprecations,Pending removal in Python 3 19<3>,Deprecations
@anchor{deprecations/index pending-removal-in-future-versions}@anchor{59e5}
@section Pending removal in future versions


The following APIs will be removed in the future,
although there is currently no date scheduled for their removal.


@itemize *

@item 
@ref{7,,argparse}:


@itemize *

@item 
Nesting argument groups and nesting mutually exclusive
groups are deprecated.

@item 
Passing the undocumented keyword argument `prefix_chars' to
@ref{2eb,,add_argument_group()} is now
deprecated.

@item 
The @ref{30c,,argparse.FileType} type converter is deprecated.
@end itemize

@item 
@ref{13,,builtins}:


@itemize *

@item 
Generators: @code{throw(type, exc, tb)} and @code{athrow(type, exc, tb)}
signature is deprecated: use @code{throw(exc)} and @code{athrow(exc)} instead,
the single argument signature.

@item 
Currently Python accepts numeric literals immediately followed by keywords,
for example @code{0in x}, @code{1or x}, @code{0if 1else 2}.  It allows confusing and
ambiguous expressions like @code{[0x1for x in y]} (which can be interpreted as
@code{[0x1 for x in y]} or @code{[0x1f or x in y]}).  A syntax warning is raised
if the numeric literal is immediately followed by one of keywords
@ref{349,,and}, @ref{17c,,else}, @ref{34a,,for}, @ref{181,,if},
@ref{34b,,in}, @ref{34c,,is} and @ref{34d,,or}.  In a future release it
will be changed to a syntax error. (gh-87999@footnote{https://github.com/python/cpython/issues/87999})

@item 
Support for @code{__index__()} and @code{__int__()} method returning non-int type:
these methods will be required to return an instance of a strict subclass of
@ref{19b,,int}.

@item 
Support for @code{__float__()} method returning a strict subclass of
@ref{196,,float}: these methods will be required to return an instance of
@code{float}.

@item 
Support for @code{__complex__()} method returning a strict subclass of
@ref{197,,complex}: these methods will be required to return an instance of
@code{complex}.

@item 
Passing a complex number as the `real' or `imag' argument in the
@ref{197,,complex()} constructor is now deprecated; it should only be passed
as a single positional argument.
(Contributed by Serhiy Storchaka in gh-109218@footnote{https://github.com/python/cpython/issues/109218}.)
@end itemize

@item 
@ref{15,,calendar}: @code{calendar.January} and @code{calendar.February} constants are
deprecated and replaced by @ref{34e,,calendar.JANUARY} and
@ref{34f,,calendar.FEBRUARY}.
(Contributed by Prince Roshan in gh-103636@footnote{https://github.com/python/cpython/issues/103636}.)

@item 
@ref{1c,,codecs}: use @ref{316,,open()} instead of @ref{315,,codecs.open()}. (gh-133038@footnote{https://github.com/python/cpython/issues/133038})

@item 
@ref{330,,codeobject.co_lnotab}: use the @ref{350,,codeobject.co_lines()} method
instead.

@item 
@ref{34,,datetime}:


@itemize *

@item 
@ref{351,,utcnow()}:
use @code{datetime.datetime.now(tz=datetime.UTC)}.

@item 
@ref{352,,utcfromtimestamp()}:
use @code{datetime.datetime.fromtimestamp(timestamp, tz=datetime.UTC)}.
@end itemize

@item 
@ref{67,,gettext}: Plural value must be an integer.

@item 
@ref{7b,,importlib}:


@itemize *

@item 
@ref{353,,cache_from_source()} `debug_override' parameter is
deprecated: use the `optimization' parameter instead.
@end itemize

@item 
@ref{7e,,importlib.metadata}:


@itemize *

@item 
@code{EntryPoints} tuple interface.

@item 
Implicit @code{None} on return values.
@end itemize

@item 
@ref{8b,,logging}: the @code{warn()} method has been deprecated
since Python 3.3, use @ref{354,,warning()} instead.

@item 
@ref{8f,,mailbox}: Use of StringIO input and text mode is deprecated, use
BytesIO and binary mode instead.

@item 
@ref{a5,,os}: Calling @ref{355,,os.register_at_fork()} in multi-threaded process.

@item 
@code{pydoc.ErrorDuringImport}: A tuple value for `exc_info' parameter is
deprecated, use an exception instance.

@item 
@ref{be,,re}: More strict rules are now applied for numerical group references
and group names in regular expressions.  Only sequence of ASCII digits is now
accepted as a numerical reference.  The group name in bytes patterns and
replacement strings can now only contain ASCII letters and digits and
underscore.
(Contributed by Serhiy Storchaka in gh-91760@footnote{https://github.com/python/cpython/issues/91760}.)

@item 
@code{sre_compile}, @code{sre_constants} and @code{sre_parse} modules.

@item 
@ref{ca,,shutil}: @ref{356,,rmtree()}’s `onerror' parameter is deprecated in
Python 3.12; use the `onexc' parameter instead.

@item 
@ref{d5,,ssl} options and protocols:


@itemize *

@item 
@ref{357,,ssl.SSLContext} without protocol argument is deprecated.

@item 
@ref{357,,ssl.SSLContext}: @ref{358,,set_npn_protocols()} and
@code{selected_npn_protocol()} are deprecated: use ALPN
instead.

@item 
@code{ssl.OP_NO_SSL*} options

@item 
@code{ssl.OP_NO_TLS*} options

@item 
@code{ssl.PROTOCOL_SSLv3}

@item 
@code{ssl.PROTOCOL_TLS}

@item 
@code{ssl.PROTOCOL_TLSv1}

@item 
@code{ssl.PROTOCOL_TLSv1_1}

@item 
@code{ssl.PROTOCOL_TLSv1_2}

@item 
@code{ssl.TLSVersion.SSLv3}

@item 
@code{ssl.TLSVersion.TLSv1}

@item 
@code{ssl.TLSVersion.TLSv1_1}
@end itemize

@item 
@ref{f3,,threading} methods:


@itemize *

@item 
@code{threading.Condition.notifyAll()}: use @ref{359,,notify_all()}.

@item 
@code{threading.Event.isSet()}: use @ref{35a,,is_set()}.

@item 
@code{threading.Thread.isDaemon()}, @ref{35b,,threading.Thread.setDaemon()}:
use @ref{35c,,threading.Thread.daemon} attribute.

@item 
@code{threading.Thread.getName()}, @ref{35d,,threading.Thread.setName()}:
use @ref{2a0,,threading.Thread.name} attribute.

@item 
@code{threading.currentThread()}: use @ref{35e,,threading.current_thread()}.

@item 
@code{threading.activeCount()}: use @ref{35f,,threading.active_count()}.
@end itemize

@item 
@ref{360,,typing.Text} (gh-92332@footnote{https://github.com/python/cpython/issues/92332}).

@item 
The internal class @code{typing._UnionGenericAlias} is no longer used to implement
@ref{2a8,,typing.Union}. To preserve compatibility with users using this private
class, a compatibility shim will be provided until at least Python 3.17. (Contributed by
Jelle Zijlstra in gh-105499@footnote{https://github.com/python/cpython/issues/105499}.)

@item 
@ref{361,,unittest.IsolatedAsyncioTestCase}: it is deprecated to return a value
that is not @code{None} from a test case.

@item 
@ref{110,,urllib.parse} deprecated functions: @ref{362,,urlparse()} instead


@itemize *

@item 
@code{splitattr()}

@item 
@code{splithost()}

@item 
@code{splitnport()}

@item 
@code{splitpasswd()}

@item 
@code{splitport()}

@item 
@code{splitquery()}

@item 
@code{splittag()}

@item 
@code{splittype()}

@item 
@code{splituser()}

@item 
@code{splitvalue()}

@item 
@code{to_bytes()}
@end itemize

@item 
@ref{11e,,wsgiref}: @code{SimpleHandler.stdout.write()} should not do partial
writes.

@item 
@ref{12b,,xml.etree.ElementTree}: Testing the truth value of an
@ref{363,,Element} is deprecated. In a future release it
will always return @code{True}. Prefer explicit @code{len(elem)} or
@code{elem is not None} tests instead.

@item 
@ref{292,,sys._clear_type_cache()} is deprecated:
use @ref{364,,sys._clear_internal_caches()} instead.
@end itemize

@node C API deprecations,,Pending removal in future versions<5>,Deprecations
@anchor{deprecations/index c-api-deprecations}@anchor{59e6}
@section C API deprecations


@menu
* Pending removal in Python 3.15: Pending removal in Python 3 15<6>. 
* Pending removal in Python 3.18: Pending removal in Python 3 18<4>. 
* Pending removal in future versions: Pending removal in future versions<6>. 

@end menu

@node Pending removal in Python 3 15<6>,Pending removal in Python 3 18<4>,,C API deprecations
@anchor{deprecations/index id1}@anchor{59e7}
@subsection Pending removal in Python 3.15



@itemize *

@item 
The @ref{3db,,PyImport_ImportModuleNoBlock()}:
Use @ref{3dc,,PyImport_ImportModule()} instead.

@item 
@ref{3dd,,PyWeakref_GetObject()} and @ref{3de,,PyWeakref_GET_OBJECT()}:
Use @ref{3df,,PyWeakref_GetRef()} instead. The pythoncapi-compat project@footnote{https://github.com/python/pythoncapi-compat/} can be used to get
@code{PyWeakref_GetRef()} on Python 3.12 and older.

@item 
@ref{3e0,,Py_UNICODE} type and the @code{Py_UNICODE_WIDE} macro:
Use @code{wchar_t} instead.

@item 
@code{PyUnicode_AsDecodedObject()}:
Use @ref{3e1,,PyCodec_Decode()} instead.

@item 
@code{PyUnicode_AsDecodedUnicode()}:
Use @ref{3e1,,PyCodec_Decode()} instead; Note that some codecs (for example, “base64”)
may return a type other than @ref{169,,str}, such as @ref{192,,bytes}.

@item 
@code{PyUnicode_AsEncodedObject()}:
Use @ref{3e2,,PyCodec_Encode()} instead.

@item 
@code{PyUnicode_AsEncodedUnicode()}:
Use @ref{3e2,,PyCodec_Encode()} instead; Note that some codecs (for example, “base64”)
may return a type other than @ref{192,,bytes}, such as @ref{169,,str}.

@item 
Python initialization functions, deprecated in Python 3.13:


@itemize *

@item 
@ref{3e3,,Py_GetPath()}:
Use @ref{37c,,PyConfig_Get("module_search_paths")}
(@ref{3e4,,sys.path}) instead.

@item 
@ref{3e5,,Py_GetPrefix()}:
Use @ref{37c,,PyConfig_Get("base_prefix")}
(@ref{3e6,,sys.base_prefix}) instead. Use @code{PyConfig_Get("prefix")} (@ref{3e7,,sys.prefix}) if @ref{3e8,,virtual environments} need to be handled.

@item 
@ref{3e9,,Py_GetExecPrefix()}:
Use @ref{37c,,PyConfig_Get("base_exec_prefix")}
(@ref{3ea,,sys.base_exec_prefix}) instead. Use
@code{PyConfig_Get("exec_prefix")}
(@ref{3eb,,sys.exec_prefix}) if @ref{3e8,,virtual environments} need to
be handled.

@item 
@ref{3ec,,Py_GetProgramFullPath()}:
Use @ref{37c,,PyConfig_Get("executable")}
(@ref{3ed,,sys.executable}) instead.

@item 
@ref{3ee,,Py_GetProgramName()}:
Use @ref{37c,,PyConfig_Get("executable")}
(@ref{3ed,,sys.executable}) instead.

@item 
@ref{3ef,,Py_GetPythonHome()}:
Use @ref{37c,,PyConfig_Get("home")} or the
@geindex PYTHONHOME
@geindex 환경 변수; PYTHONHOME
@ref{3f0,,PYTHONHOME} environment variable instead.
@end itemize

The pythoncapi-compat project@footnote{https://github.com/python/pythoncapi-compat/} can be used to get
@ref{37c,,PyConfig_Get()} on Python 3.13 and older.

@item 
Functions to configure Python’s initialization, deprecated in Python 3.11:


@itemize *

@item 
@code{PySys_SetArgvEx()}:
Set @ref{3f1,,PyConfig.argv} instead.

@item 
@code{PySys_SetArgv()}:
Set @ref{3f1,,PyConfig.argv} instead.

@item 
@code{Py_SetProgramName()}:
Set @ref{3f2,,PyConfig.program_name} instead.

@item 
@code{Py_SetPythonHome()}:
Set @ref{3f3,,PyConfig.home} instead.

@item 
@ref{3f4,,PySys_ResetWarnOptions()}:
Clear @ref{3f5,,sys.warnoptions} and @code{warnings.filters} instead.
@end itemize

The @ref{3f6,,Py_InitializeFromConfig()} API should be used with
@ref{3f7,,PyConfig} instead.

@item 
Global configuration variables:


@itemize *

@item 
@ref{3f8,,Py_DebugFlag}:
Use @ref{3f9,,PyConfig.parser_debug} or
@ref{37c,,PyConfig_Get("parser_debug")} instead.

@item 
@ref{3fa,,Py_VerboseFlag}:
Use @ref{3fb,,PyConfig.verbose} or
@ref{37c,,PyConfig_Get("verbose")} instead.

@item 
@ref{3fc,,Py_QuietFlag}:
Use @ref{3fd,,PyConfig.quiet} or
@ref{37c,,PyConfig_Get("quiet")} instead.

@item 
@ref{3fe,,Py_InteractiveFlag}:
Use @ref{3ff,,PyConfig.interactive} or
@ref{37c,,PyConfig_Get("interactive")} instead.

@item 
@ref{400,,Py_InspectFlag}:
Use @ref{401,,PyConfig.inspect} or
@ref{37c,,PyConfig_Get("inspect")} instead.

@item 
@ref{402,,Py_OptimizeFlag}:
Use @ref{403,,PyConfig.optimization_level} or
@ref{37c,,PyConfig_Get("optimization_level")} instead.

@item 
@ref{404,,Py_NoSiteFlag}:
Use @ref{405,,PyConfig.site_import} or
@ref{37c,,PyConfig_Get("site_import")} instead.

@item 
@ref{406,,Py_BytesWarningFlag}:
Use @ref{407,,PyConfig.bytes_warning} or
@ref{37c,,PyConfig_Get("bytes_warning")} instead.

@item 
@ref{408,,Py_FrozenFlag}:
Use @ref{409,,PyConfig.pathconfig_warnings} or
@ref{37c,,PyConfig_Get("pathconfig_warnings")} instead.

@item 
@ref{40a,,Py_IgnoreEnvironmentFlag}:
Use @ref{40b,,PyConfig.use_environment} or
@ref{37c,,PyConfig_Get("use_environment")} instead.

@item 
@ref{40c,,Py_DontWriteBytecodeFlag}:
Use @ref{40d,,PyConfig.write_bytecode} or
@ref{37c,,PyConfig_Get("write_bytecode")} instead.

@item 
@ref{40e,,Py_NoUserSiteDirectory}:
Use @ref{40f,,PyConfig.user_site_directory} or
@ref{37c,,PyConfig_Get("user_site_directory")} instead.

@item 
@ref{410,,Py_UnbufferedStdioFlag}:
Use @ref{411,,PyConfig.buffered_stdio} or
@ref{37c,,PyConfig_Get("buffered_stdio")} instead.

@item 
@ref{412,,Py_HashRandomizationFlag}:
Use @ref{413,,PyConfig.use_hash_seed}
and @ref{414,,PyConfig.hash_seed} or
@ref{37c,,PyConfig_Get("hash_seed")} instead.

@item 
@ref{415,,Py_IsolatedFlag}:
Use @ref{416,,PyConfig.isolated} or
@ref{37c,,PyConfig_Get("isolated")} instead.

@item 
@ref{417,,Py_LegacyWindowsFSEncodingFlag}:
Use @ref{418,,PyPreConfig.legacy_windows_fs_encoding} or
@ref{37c,,PyConfig_Get("legacy_windows_fs_encoding")} instead.

@item 
@ref{419,,Py_LegacyWindowsStdioFlag}:
Use @ref{41a,,PyConfig.legacy_windows_stdio} or
@ref{37c,,PyConfig_Get("legacy_windows_stdio")} instead.

@item 
@code{Py_FileSystemDefaultEncoding}, @code{Py_HasFileSystemDefaultEncoding}:
Use @ref{41b,,PyConfig.filesystem_encoding} or
@ref{37c,,PyConfig_Get("filesystem_encoding")} instead.

@item 
@code{Py_FileSystemDefaultEncodeErrors}:
Use @ref{41c,,PyConfig.filesystem_errors} or
@ref{37c,,PyConfig_Get("filesystem_errors")} instead.

@item 
@code{Py_UTF8Mode}:
Use @ref{41d,,PyPreConfig.utf8_mode} or
@ref{37c,,PyConfig_Get("utf8_mode")} instead.
(see @ref{41e,,Py_PreInitialize()})
@end itemize

The @ref{3f6,,Py_InitializeFromConfig()} API should be used with
@ref{3f7,,PyConfig} to set these options. Or @ref{37c,,PyConfig_Get()} can be
used to get these options at runtime.
@end itemize

@node Pending removal in Python 3 18<4>,Pending removal in future versions<6>,Pending removal in Python 3 15<6>,C API deprecations
@anchor{deprecations/index id2}@anchor{59e8}
@subsection Pending removal in Python 3.18



@itemize *

@item 
The following private functions are deprecated
and planned for removal in Python 3.18:


@itemize *

@item 
@code{_PyBytes_Join()}: use @ref{383,,PyBytes_Join()}.

@item 
@code{_PyDict_GetItemStringWithError()}: use @ref{421,,PyDict_GetItemStringRef()}.

@item 
@code{_PyDict_Pop()}: use @ref{422,,PyDict_Pop()}.

@item 
@code{_PyLong_Sign()}: use @ref{39a,,PyLong_GetSign()}.

@item 
@code{_PyLong_FromDigits()} and @code{_PyLong_New()}:
use @ref{3aa,,PyLongWriter_Create()}.

@item 
@code{_PyThreadState_UncheckedGet()}: use @ref{423,,PyThreadState_GetUnchecked()}.

@item 
@code{_PyUnicode_AsString()}: use @ref{424,,PyUnicode_AsUTF8()}.

@item 
@code{_PyUnicodeWriter_Init()}:
replace @code{_PyUnicodeWriter_Init(&writer)} with
@ref{3b4,,writer = PyUnicodeWriter_Create(0)}.

@item 
@code{_PyUnicodeWriter_Finish()}:
replace @code{_PyUnicodeWriter_Finish(&writer)} with
@ref{3b7,,PyUnicodeWriter_Finish(writer)}.

@item 
@code{_PyUnicodeWriter_Dealloc()}:
replace @code{_PyUnicodeWriter_Dealloc(&writer)} with
@ref{3b6,,PyUnicodeWriter_Discard(writer)}.

@item 
@code{_PyUnicodeWriter_WriteChar()}:
replace @code{_PyUnicodeWriter_WriteChar(&writer, ch)} with
@ref{3ba,,PyUnicodeWriter_WriteChar(writer@comma{} ch)}.

@item 
@code{_PyUnicodeWriter_WriteStr()}:
replace @code{_PyUnicodeWriter_WriteStr(&writer, str)} with
@ref{3bc,,PyUnicodeWriter_WriteStr(writer@comma{} str)}.

@item 
@code{_PyUnicodeWriter_WriteSubstring()}:
replace @code{_PyUnicodeWriter_WriteSubstring(&writer, str, start, end)} with
@ref{3bd,,PyUnicodeWriter_WriteSubstring(writer@comma{} str@comma{} start@comma{} end)}.

@item 
@code{_PyUnicodeWriter_WriteASCIIString()}:
replace @code{_PyUnicodeWriter_WriteASCIIString(&writer, str)} with
@ref{3b9,,PyUnicodeWriter_WriteASCII(writer@comma{} str)}.

@item 
@code{_PyUnicodeWriter_WriteLatin1String()}:
replace @code{_PyUnicodeWriter_WriteLatin1String(&writer, str)} with
@ref{3bf,,PyUnicodeWriter_WriteUTF8(writer@comma{} str)}.

@item 
@code{_PyUnicodeWriter_Prepare()}: (no replacement).

@item 
@code{_PyUnicodeWriter_PrepareKind()}: (no replacement).

@item 
@code{_Py_HashPointer()}: use @ref{425,,Py_HashPointer()}.

@item 
@code{_Py_fopen_obj()}: use @ref{393,,Py_fopen()}.
@end itemize

The pythoncapi-compat project@footnote{https://github.com/python/pythoncapi-compat/} can be used to get
these new public functions on Python 3.13 and older.
(Contributed by Victor Stinner in gh-128863@footnote{https://github.com/python/cpython/issues/128863}.)
@end itemize

@node Pending removal in future versions<6>,,Pending removal in Python 3 18<4>,C API deprecations
@anchor{deprecations/index id3}@anchor{59e9}
@subsection Pending removal in future versions


The following APIs are deprecated and will be removed,
although there is currently no date scheduled for their removal.


@itemize *

@item 
@ref{427,,Py_TPFLAGS_HAVE_FINALIZE}:
Unneeded since Python 3.8.

@item 
@ref{428,,PyErr_Fetch()}:
Use @ref{429,,PyErr_GetRaisedException()} instead.

@item 
@ref{42a,,PyErr_NormalizeException()}:
Use @ref{429,,PyErr_GetRaisedException()} instead.

@item 
@ref{42b,,PyErr_Restore()}:
Use @ref{42c,,PyErr_SetRaisedException()} instead.

@item 
@ref{42d,,PyModule_GetFilename()}:
Use @ref{42e,,PyModule_GetFilenameObject()} instead.

@item 
@ref{42f,,PyOS_AfterFork()}:
Use @ref{430,,PyOS_AfterFork_Child()} instead.

@item 
@ref{431,,PySlice_GetIndicesEx()}:
Use @ref{432,,PySlice_Unpack()} and @ref{433,,PySlice_AdjustIndices()} instead.

@item 
@ref{434,,PyUnicode_READY()}:
Unneeded since Python 3.12

@item 
@code{PyErr_Display()}:
Use @ref{435,,PyErr_DisplayException()} instead.

@item 
@code{_PyErr_ChainExceptions()}:
Use @code{_PyErr_ChainExceptions1()} instead.

@item 
@code{PyBytesObject.ob_shash} member:
call @ref{436,,PyObject_Hash()} instead.

@item 
Thread Local Storage (TLS) API:


@itemize *

@item 
@ref{437,,PyThread_create_key()}:
Use @ref{438,,PyThread_tss_alloc()} instead.

@item 
@ref{439,,PyThread_delete_key()}:
Use @ref{43a,,PyThread_tss_free()} instead.

@item 
@ref{43b,,PyThread_set_key_value()}:
Use @ref{43c,,PyThread_tss_set()} instead.

@item 
@ref{43d,,PyThread_get_key_value()}:
Use @ref{43e,,PyThread_tss_get()} instead.

@item 
@ref{43f,,PyThread_delete_key_value()}:
Use @ref{440,,PyThread_tss_delete()} instead.

@item 
@ref{441,,PyThread_ReInitTLS()}:
Unneeded since Python 3.7.
@end itemize
@end itemize

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 용어집,이 설명서에 관하여,Deprecations,Top
@anchor{glossary doc}@anchor{59ea}@anchor{glossary glossary}@anchor{1fbb}@anchor{glossary id1}@anchor{59eb}@anchor{glossary translation-repo}@anchor{59ec}
@chapter 용어집


@c if you add new entries, keep the alphabetical sorting!


@table @asis
@anchor{glossary term-0}@anchor{493}
@geindex >>>

@item @code{>>>}

@ref{1b5,,대화형} 셸의 기본 파이썬 프롬프트. 인터프리터에서 대화형으로 실행될 수 있는 코드 예에서 자주 볼 수 있습니다.
@anchor{glossary term-}@anchor{494}
@geindex ...

@item @code{...}

다음과 같은 것들을 가리킬 수 있습니다:


@itemize *

@item 
들여쓰기 된 코드 블록의 코드를 입력할 때, 쌍을 이루는 구분자 (괄호, 대괄호, 중괄호) 안에 코드를 입력할 때, 데코레이터 지정 후의 @ref{1b5,,대화형} 셸의 기본 파이썬 프롬프트.
@end itemize

@geindex ...;ellipsis literal


@itemize *

@item 
The three dots form of the @ref{1ffa,,Ellipsis} object.
@end itemize
@anchor{glossary term-abstract-base-class}@anchor{13bb}
@geindex abstract base class (추상 베이스 클래스)

@item abstract base class (추상 베이스 클래스)

추상 베이스 클래스는 @ref{6f8,,hasattr()} 같은 다른 테크닉들이 불편하거나 미묘하게 잘못된 (예를 들어, @ref{23b1,,매직 메서드}) 경우, 인터페이스를 정의하는 방법을 제공함으로써 @ref{59ed,,덕 타이핑} 을 보완합니다. ABC는 가상 서브 클래스를 도입하는데, 클래스를 계승하지 않으면서도 @ref{2ad,,isinstance()} 와 @ref{9c4,,issubclass()} 에 의해 감지될 수 있는 클래스들입니다; @ref{4,,abc} 모듈 설명서를 보세요. 파이썬에는 많은 내장 ABC 들이 따라오는데 다음과 같은 것들이 있습니다: 자료 구조 (@ref{1f,,collections.abc} 모듈에서), 숫자 (@ref{a2,,numbers} 모듈에서), 스트림 (@ref{83,,io} 모듈에서), 임포트 파인더와 로더 (@ref{7c,,importlib.abc} 모듈에서). @code{abc} 모듈을 사용해서 자신만의 ABC를 만들 수도 있습니다.
@anchor{glossary term-annotate-function}@anchor{15d}
@geindex annotate function

@item annotate function

A function that can be called to retrieve the @ref{15c,,annotations}
of an object. This function is accessible as the @ref{1984,,__annotate__}
attribute of functions, classes, and modules. Annotate functions are a
subset of @ref{452d,,evaluate functions}.
@anchor{glossary term-annotation}@anchor{15c}
@geindex annotation (어노테이션)

@item annotation (어노테이션)

관습에 따라 @ref{23cb,,형 힌트} 로 사용되는 변수, 클래스 어트리뷰트 또는 함수 매개변수 나 반환 값과 연결된 레이블입니다.

Annotations of local variables cannot be accessed at runtime, but
annotations of global variables, class attributes, and functions
can be retrieved by calling @ref{459,,annotationlib.get_annotations()}
on modules, classes, and functions, respectively.

See @ref{f4f,,variable annotation}, @ref{2017,,function annotation}, 
@geindex Python 향상 제안; PEP 484
PEP 484@footnote{https://peps.python.org/pep-0484/},
@geindex Python 향상 제안; PEP 526
PEP 526@footnote{https://peps.python.org/pep-0526/}, and 
@geindex Python 향상 제안; PEP 649
PEP 649@footnote{https://peps.python.org/pep-0649/}, which describe this functionality.
Also see @ref{9d9,,Annotations Best Practices}
for best practices on working with annotations.
@anchor{glossary term-argument}@anchor{679}
@geindex argument (인자)

@item argument (인자)

함수를 호출할 때 @ref{24b7,,함수} (또는 @ref{1867,,메서드}) 로 전달되는 값. 두 종류의 인자가 있습니다:


@itemize *

@item 
`키워드 인자 (keyword argument)': 함수 호출 때 식별자가 앞에 붙은 인자 (예를 들어, @code{name=}) 또는 @code{**} 를 앞에 붙인 딕셔너리로 전달되는 인자. 예를 들어, 다음과 같은 @ref{197,,complex()} 호출에서 @code{3} 과 @code{5} 는 모두 키워드 인자입니다:

@example
complex(real=3, imag=5)
complex(**@{'real': 3, 'imag': 5@})
@end example

@item 
`위치 인자 (positional argument)': 키워드 인자가 아닌 인자. 위치 인자들은 인자 목록의 처음에 나오거나 @ref{142c,,이터러블} 의 앞에 @code{*} 를 붙여 전달할 수 있습니다. 예를 들어, 다음과 같은 호출에서 @code{3} 과 @code{5} 는 모두 위치 인자입니다.

@example
complex(3, 5)
complex(*(3, 5))
@end example
@end itemize

인자는 함수 바디의 이름 붙은 지역 변수에 대입됩니다. 이 대입에 적용되는 규칙들에 대해서는 @ref{f7c,,호출} 절을 보세요. 문법적으로, 어떤 표현식이건 인자로 사용될 수 있습니다; 구해진 값이 지역 변수에 대입됩니다.

용어집의 @ref{2348,,매개변수} 항목과 FAQ 질문 @ref{5927,,인자와 매개변수의 차이} 와 
@geindex Python 향상 제안; PEP 362
PEP 362@footnote{https://peps.python.org/pep-0362/}도 보세요.
@anchor{glossary term-asynchronous-context-manager}@anchor{7ef}
@geindex asynchronous context manager (비동기 컨텍스트 관리자)

@item asynchronous context manager (비동기 컨텍스트 관리자)

@ref{241e,,__aenter__()} 와 @ref{19a2,,__aexit__()} 메서드를 정의함으로써 @ref{185,,async with} 문에서 보이는 환경을 제어하는 객체. 
@geindex Python 향상 제안; PEP 492
PEP 492@footnote{https://peps.python.org/pep-0492/}로 도입되었습니다.
@anchor{glossary term-asynchronous-generator}@anchor{249b}
@geindex asynchronous generator (비동기 제너레이터)

@item asynchronous generator (비동기 제너레이터)

@ref{3975,,비동기 제너레이터 이터레이터} 를 돌려주는 함수. @ref{7ec,,async def} 로 정의되는 코루틴 함수처럼 보이는데, @ref{c9f,,async for} 루프가 사용할 수 있는 일련의 값들을 만드는 @ref{bc1,,yield} 표현식을 포함한다는 점이 다릅니다.

보통 비동기 제너레이터 함수를 가리키지만, 어떤 문맥에서는 `비동기 제너레이터 이터레이터' 를 가리킵니다. 의도하는 의미가 명확하지 않은 경우는, 완전한 용어를 써서 모호함을 없앱니다.

비동기 제너레이터 함수는 @ref{18d,,await} 표현식과, @ref{c9f,,async for} 문과, @ref{185,,async with} 문을 포함할 수 있습니다.
@anchor{glossary term-asynchronous-generator-iterator}@anchor{3975}
@geindex asynchronous generator iterator (비동기 제너레이터 이터레이터)

@item asynchronous generator iterator (비동기 제너레이터 이터레이터)

An object created by an @ref{249b,,asynchronous generator} function.

@ref{4c8,,비동기 이터레이터} 인데 @ref{1885,,__anext__()} 를 호출하면 어웨이터블 객체를 돌려주고, 이것은 다음 @ref{bc1,,yield} 표현식 까지 비동기 제너레이터 함수의 바디를 실행합니다.

각 @ref{bc1,,yield}는 일시적으로 처리를 중단하고, (지역 변수들과 대기 중인 try-문들을 포함하는) 실행 상태를 기억합니다. `비동기 제너레이터 이터레이터' 가 @ref{1885,,__anext__()} 가 돌려주는 또 하나의 어웨이터블로 재개되면, 떠난 곳으로 복귀합니다. 
@geindex Python 향상 제안; PEP 492
PEP 492@footnote{https://peps.python.org/pep-0492/}와 
@geindex Python 향상 제안; PEP 525
PEP 525@footnote{https://peps.python.org/pep-0525/}를 보세요.
@anchor{glossary term-asynchronous-iterable}@anchor{f73}
@geindex asynchronous iterable (비동기 이터러블)

@item asynchronous iterable (비동기 이터러블)

@ref{c9f,,async for} 문에서 사용될 수 있는 객체. @ref{df5,,__aiter__()} 메서드는 @ref{4c8,,비동기 이터레이터} 를 돌려줘야 합니다. 
@geindex Python 향상 제안; PEP 492
PEP 492@footnote{https://peps.python.org/pep-0492/} 로 도입되었습니다.
@anchor{glossary term-asynchronous-iterator}@anchor{4c8}
@geindex asynchronous iterator (비동기 이터레이터)

@item asynchronous iterator (비동기 이터레이터)

@ref{df5,,__aiter__()} 와 @ref{1885,,__anext__()} 메서드를 구현하는 객체. @code{__anext__()} 는 @ref{4c9,,어웨이터블} 객체를 돌려줘야 합니다. @ref{c9f,,async for}는 @ref{1e0c,,StopAsyncIteration} 예외가 발생할 때까지 비동기 이터레이터의 @code{__anext__()} 메서드가 돌려주는 어웨이터블을 풉니다. 
@geindex Python 향상 제안; PEP 492
PEP 492@footnote{https://peps.python.org/pep-0492/}로 도입되었습니다.
@anchor{glossary term-atomic-operation}@anchor{2736}
@geindex atomic operation

@item atomic operation

An operation that appears to execute as a single, indivisible step: no
other thread can observe it half-done, and its effects become visible all
at once.  Python does not guarantee that high-level statements are atomic
(for example, @code{x += 1} performs multiple bytecode operations and is not
atomic).  Atomicity is only guaranteed where explicitly documented.  See
also @ref{272b,,race condition} and @ref{272c,,data race}.
@anchor{glossary term-attached-thread-state}@anchor{4f10}
@geindex attached thread state

@item attached thread state

A @ref{1848,,thread state} that is active for the current OS thread.

When a @ref{1848,,thread state} is attached, the OS thread has
access to the full Python C API and can safely invoke the
bytecode interpreter.

Unless a function explicitly notes otherwise, attempting to call
the C API without an attached thread state will result in a fatal
error or undefined behavior.  A thread state can be attached and detached
explicitly by the user through the C API, or implicitly by the runtime,
including during blocking C calls and by the bytecode interpreter in between
calls.

On most builds of Python, having an attached thread state implies that the
caller holds the @ref{164,,GIL} for the current interpreter, so only
one OS thread can have an attached thread state at a given moment. In
@ref{1767,,free-threaded builds} of Python, threads can
concurrently hold an attached thread state, allowing for true parallelism of
the bytecode interpreter.
@anchor{glossary term-attribute}@anchor{292f}
@geindex attribute (어트리뷰트)

@item attribute (어트리뷰트)

흔히 점표현식을 사용하는 이름으로 참조되는 객체와 결합한 값. 예를 들어, 객체 `o'가 어트리뷰트 `a'를 가지면, `o.a'처럼 참조됩니다.

It is possible to give an object an attribute whose name is not an
identifier as defined by @ref{229d,,Names (identifiers and keywords)}, for example using
@ref{25be,,setattr()}, if the object allows it.
Such an attribute will not be accessible using a dotted expression,
and would instead need to be retrieved with @ref{dc9,,getattr()}.
@anchor{glossary term-awaitable}@anchor{4c9}
@geindex awaitable (어웨이터블)

@item awaitable (어웨이터블)

@ref{18d,,await} 표현식에 사용할 수 있는 객체. @ref{6b8,,코루틴} 이나 @ref{f74,,__await__()} 메서드를 가진 객체가 될 수 있습니다. 
@geindex Python 향상 제안; PEP 492
PEP 492@footnote{https://peps.python.org/pep-0492/}를 보세요.
@anchor{glossary term-BDFL}@anchor{59ee}
@geindex BDFL

@item BDFL

자비로운 종신 독재자 (Benevolent Dictator For Life), 즉 Guido van Rossum@footnote{https://gvanrossum.github.io/}, 파이썬의 창시자.
@anchor{glossary term-binary-file}@anchor{206c}
@geindex binary file (바이너리 파일)

@item binary file (바이너리 파일)

@ref{193,,바이트열류 객체들}을 읽고 쓸 수 있는 @ref{13c8,,파일 객체}. 바이너리 파일의 예로는 바이너리 모드 (@code{'rb'}, @code{'wb'} 또는 @code{'rb+'}) 로 열린 파일, @ref{75e,,sys.stdin.buffer}, @ref{ccc,,sys.stdout.buffer}, @ref{10a3,,io.BytesIO} 와 @ref{65a,,gzip.GzipFile} 의 인스턴스를 들 수 있습니다.

@ref{169,,str} 객체를 읽고 쓸 수 있는 파일 객체에 대해서는 @ref{206b,,텍스트 파일} 도 참조하세요.
@anchor{glossary term-borrowed-reference}@anchor{3d7}
@geindex borrowed reference (빌린 참조)

@item borrowed reference (빌린 참조)

In Python’s C API, a borrowed reference is a reference to an object,
where the code using the object does not own the reference.
It becomes a dangling
pointer if the object is destroyed. For example, a garbage collection can
remove the last @ref{5df,,strong reference} to the object and so destroy it.

Calling @ref{78e,,Py_INCREF()} on the @ref{3d7,,borrowed reference} is
recommended to convert it to a @ref{5df,,strong reference} in-place, except
when the object cannot be destroyed before the last usage of the borrowed
reference. The @ref{a9a,,Py_NewRef()} function can be used to create a new
strong reference.
@anchor{glossary term-bytes-like-object}@anchor{193}
@geindex bytes-like object (바이트열류 객체)

@item bytes-like object (바이트열류 객체)

@ref{260,,버퍼 프로토콜} 를 지원하고 C-@ref{2689,,연속} 버퍼를 익스포트 할 수 있습니다. 여러 공통 @ref{165,,memoryview} 객체들은 물론이고 @ref{192,,bytes}, @ref{344,,bytearray}, @ref{4c0,,array.array} 객체들을 포함합니다. 바이트열류 객체들은 바이너리 데이터를 다루는 여러 가지 연산들에 사용될 수 있습니다; 압축, 바이너리 파일로 저장, 소켓을 통한 전송 같은 것들이 있습니다.

어떤 연산들은 바이너리 데이터가 가변적일 필요가 있습니다. 이런 경우에 설명서는 종종 “읽고-쓰기 바이트열류 객체”라고 표현합니다. 가변 버퍼 객체의 예로는 @ref{344,,bytearray} 와 @code{bytearray} 의 @ref{165,,memoryview} 가 있습니다. 다른 연산들은 바이너리 데이터가 불변 객체 (“읽기 전용 바이트열류 객체”)에 저장되도록 요구합니다; 이런 것들의 예로는 @ref{192,,bytes}와 @code{bytes} 객체의 @code{memoryview} 가 있습니다.
@anchor{glossary term-bytecode}@anchor{4ab}
@geindex bytecode (바이트 코드)

@item bytecode (바이트 코드)

파이썬 소스 코드는 바이트 코드로 컴파일되는데, CPython 인터프리터에서 파이썬 프로그램의 내부 표현입니다. 바이트 코드는 @code{.pyc} 파일에 캐시 되어, 같은 파일을 두 번째 실행할 때 더 빨라지게 만듭니다 (소스에서 바이트 코드로의 재컴파일을 피할 수 있습니다). 이 “중간 언어” 는 각 바이트 코드에 대응하는 기계를 실행하는 @ref{3a92,,가상 기계} 에서 실행된다고 말합니다. 바이트 코드는 서로 다른 파이썬 가상 기계에서 작동할 것으로 기대하지도, 파이썬 배포 간에 안정적이지도 않다는 것에 주의해야 합니다.

바이트 코드 명령어들의 목록은 @ref{7ce,,dis 모듈} 설명서에 나옵니다.
@anchor{glossary term-callable}@anchor{2da2}
@geindex callable (콜러블)

@item callable (콜러블)

A callable is an object that can be called, possibly with a set
of arguments (see @ref{679,,argument}), with the following syntax:

@example
callable(argument1, argument2, argumentN)
@end example

A @ref{24b7,,function}, and by extension a @ref{1867,,method}, is a callable.
An instance of a class that implements the @ref{779,,__call__()}
method is also a callable.
@anchor{glossary term-callback}@anchor{2dc3}
@geindex callback (콜백)

@item callback (콜백)

인자로 전달되는 미래의 어느 시점에서 실행될 서브 루틴 함수.
@anchor{glossary term-class}@anchor{1cfa}
@geindex class (클래스)

@item class (클래스)

사용자 정의 객체들을 만들기 위한 주형. 클래스 정의는 보통 클래스의 인스턴스를 대상으로 연산하는 메서드 정의들을 포함합니다.
@anchor{glossary term-class-variable}@anchor{59ef}
@geindex class variable (클래스 변수)

@item class variable (클래스 변수)

클래스에서 정의되고 클래스 수준 (즉, 클래스의 인스턴스에서가 아니라) 에서만 수정되는 변수.
@anchor{glossary term-closure-variable}@anchor{1895}
@geindex closure variable (클로저 변수)

@item closure variable (클로저 변수)

A @ref{2429,,free variable} referenced from a @ref{238d,,nested scope} that is defined in an outer
scope rather than being resolved at runtime from the globals or builtin namespaces.
May be explicitly defined with the @ref{14ac,,nonlocal} keyword to allow write access,
or implicitly defined if the variable is only being read.

For example, in the @code{inner} function in the following code, both @code{x} and @code{print} are
@ref{2429,,free variables}, but only @code{x} is a `closure variable':

@example
def outer():
    x = 0
    def inner():
        nonlocal x
        x += 1
        print(x)
    return inner
@end example

Due to the @ref{2344,,codeobject.co_freevars} attribute (which, despite its name, only
includes the names of closure variables rather than listing all referenced free
variables), the more general @ref{2429,,free variable} term is sometimes used even
when the intended meaning is to refer specifically to closure variables.
@anchor{glossary term-complex-number}@anchor{59f0}
@geindex complex number (복소수)

@item complex number (복소수)

익숙한 실수 시스템의 확장인데, 모든 숫자가 실수부와 허수부의 합으로 표현됩니다. 허수부는 실수에 허수 단위(@code{-1}의 제곱근)를 곱한 것인데, 종종 수학에서는 @code{i}로, 공학에서는 @code{j}로 표기합니다. 파이썬은 후자의 표기법을 쓰는 복소수를 기본 지원합니다; 허수부는 @code{j} 접미사를 붙여서 표기합니다, 예를 들어, @code{3+1j}. @ref{92,,math} 모듈의 복소수 버전이 필요하면, @ref{19,,cmath}를 사용합니다. 복소수의 활용은 꽤 수준 높은 수학적 기능입니다. 필요하다고 느끼지 못한다면, 거의 확실히 무시해도 좋습니다.
@anchor{glossary term-concurrency}@anchor{59f1}
@geindex concurrency

@item concurrency

The ability of a computer program to perform multiple tasks at the same
time.  Python provides libraries for writing programs that make use of
different forms of concurrency.  @ref{b,,asyncio} is a library for dealing
with asynchronous tasks and coroutines.  @ref{f3,,threading} provides
access to operating system threads and @ref{98,,multiprocessing} to
operating system processes. Multi-core processors can execute threads and
processes on different CPU cores at the same time (see
@ref{59f2,,parallelism}).
@anchor{glossary term-concurrent-modification}@anchor{59f3}
@geindex concurrent modification

@item concurrent modification

When multiple threads modify shared data at the same time.  Concurrent
modification without proper synchronization can cause
@ref{272b,,race conditions}, and might also trigger a
@ref{272c,,data race}, data corruption, or both.
@anchor{glossary term-context}@anchor{1964}
@geindex context (컨텍스트)

@item context (컨텍스트)

This term has different meanings depending on where and how it is used.
Some common meanings:


@itemize *

@item 
The temporary state or environment established by a @ref{1e1,,context manager} via a @ref{186,,with} statement.

@item 
The collection of key­value bindings associated with a particular
@ref{177,,contextvars.Context} object and accessed via
@ref{1878,,ContextVar} objects.  Also see @ref{59f4,,context variable}.

@item 
A @ref{177,,contextvars.Context} object.  Also see @ref{1965,,current context}.
@end itemize
@anchor{glossary term-context-management-protocol}@anchor{1966}
@geindex context management protocol (컨텍스트 관리 프로토콜)

@item context management protocol (컨텍스트 관리 프로토콜)

The @ref{7e3,,__enter__()} and @ref{1505,,__exit__()} methods called
by the @ref{186,,with} statement.  See 
@geindex Python 향상 제안; PEP 343
PEP 343@footnote{https://peps.python.org/pep-0343/}.
@anchor{glossary term-context-manager}@anchor{1e1}
@geindex context manager (컨텍스트 관리자)

@item context manager (컨텍스트 관리자)

@ref{1966,,컨텍스트 관리 프로토콜}을 구현하고 @ref{186,,with} 문에서 보이는 환경을 제어하는 객체. 
@geindex Python 향상 제안; PEP 343
PEP 343@footnote{https://peps.python.org/pep-0343/}을 참조하십시오.
@anchor{glossary term-context-variable}@anchor{59f4}
@geindex context variable (컨텍스트 변수)

@item context variable (컨텍스트 변수)

A variable whose value depends on which context is the @ref{1965,,current context}.  Values are accessed via @ref{1878,,contextvars.ContextVar}
objects.  Context variables are primarily used to isolate state between
concurrent asynchronous tasks.
@anchor{glossary term-contiguous}@anchor{2689}
@geindex contiguous (연속)

@item contiguous (연속)

@geindex C-contiguous
@geindex Fortran contiguous

버퍼는 정확히 `C-연속(C-contiguous)'이거나 `포트란 연속(Fortran contiguous)'일 때 연속이라고 여겨집니다. 영차원 버퍼는 C-연속이면서 포트란 연속입니다. 일차원 배열에서, 항목들은 서로에 인접하고, 0에서 시작하는 오름차순 인덱스의 순서대로 메모리에 배치되어야 합니다. 다차원 C-연속 배열에서, 메모리 주소의 순서대로 항목들을 방문할 때 마지막 인덱스가 가장 빨리 변합니다. 하지만, 포트란 연속 배열에서는, 첫 번째 인덱스가 가장 빨리 변합니다.
@anchor{glossary term-coroutine}@anchor{6b8}
@geindex coroutine (코루틴)

@item coroutine (코루틴)

코루틴은 서브루틴의 더 일반화된 형태입니다. 서브루틴은 한 지점에서 진입하고 다른 지점에서 탈출합니다. 코루틴은 여러 다른 지점에서 진입하고, 탈출하고, 재개할 수 있습니다. 이것들은 @ref{7ec,,async def} 문으로 구현할 수 있습니다. 
@geindex Python 향상 제안; PEP 492
PEP 492@footnote{https://peps.python.org/pep-0492/}를 보세요.
@anchor{glossary term-coroutine-function}@anchor{f72}
@geindex coroutine function (코루틴 함수)

@item coroutine function (코루틴 함수)

@ref{6b8,,코루틴} 객체를 돌려주는 함수. 코루틴 함수는 @ref{7ec,,async def} 문으로 정의될 수 있고, @ref{18d,,await} 와 @ref{c9f,,async for}와 @ref{185,,async with} 키워드를 포함할 수 있습니다. 이것들은 
@geindex Python 향상 제안; PEP 492
PEP 492@footnote{https://peps.python.org/pep-0492/} 에 의해 도입되었습니다.
@anchor{glossary term-CPython}@anchor{904}
@geindex CPython

@item CPython

파이썬 프로그래밍 언어의 규범적인 구현인데, python.org@footnote{https://www.python.org}에서 배포됩니다. 이 구현을 Jython 이나 IronPython 과 같은 다른 것들과 구별할 필요가 있을 때 용어 “CPython” 이 사용됩니다.
@anchor{glossary term-current-context}@anchor{1965}
@geindex current context (현재 컨텍스트)

@item current context (현재 컨텍스트)

The @ref{1964,,context} (@ref{177,,contextvars.Context} object) that is
currently used by @ref{1878,,ContextVar} objects to access (get
or set) the values of @ref{59f4,,context variables}.  Each
thread has its own current context.  Frameworks for executing asynchronous
tasks (see @ref{b,,asyncio}) associate each task with a context which
becomes the current context whenever the task starts or resumes execution.
@anchor{glossary term-cyclic-isolate}@anchor{5630}
@geindex cyclic isolate

@item cyclic isolate

A subgroup of one or more objects that reference each other in a reference
cycle, but are not referenced by objects outside the group.  The goal of
the @ref{17dd,,cyclic garbage collector} is to identify these groups and break the reference
cycles so that the memory can be reclaimed.
@anchor{glossary term-data-race}@anchor{272c}
@geindex data race

@item data race

A situation where multiple threads access the same memory location
concurrently, at least one of the accesses is a write, and the threads
do not use any synchronization to control their access.  Data races
lead to @ref{59f5,,non-deterministic} behavior and can cause data corruption.
Proper use of @ref{272a,,locks} and other @ref{59f6,,synchronization primitives} prevents data races.  Note that data races
can only happen in native code, but that @ref{59f7,,native code} might be
exposed in a Python API.  See also @ref{272b,,race condition} and
@ref{59f8,,thread-safe}.
@anchor{glossary term-deadlock}@anchor{59f9}
@geindex deadlock

@item deadlock

A situation in which two or more tasks (threads, processes, or coroutines)
wait indefinitely for each other to release resources or complete actions,
preventing any from making progress.  For example, if thread A holds lock
1 and waits for lock 2, while thread B holds lock 2 and waits for lock 1,
both threads will wait indefinitely.  In Python this often arises from
acquiring multiple locks in conflicting orders or from circular
join/await dependencies.  Deadlocks can be avoided by always acquiring
multiple @ref{272a,,locks} in a consistent order.  See also
lock and @ref{59fa,,reentrant}.
@anchor{glossary term-decorator}@anchor{939}
@geindex decorator (데코레이터)

@item decorator (데코레이터)

다른 함수를 돌려주는 함수인데, 보통 @code{@@wrapper} 문법을 사용한 함수 변환으로 적용됩니다. 데코레이터의 흔한 예는 @ref{48f,,classmethod()} 과 @ref{453,,staticmethod()} 입니다.

데코레이터 문법은 단지 편의 문법일 뿐입니다. 다음 두 함수 정의는 의미상으로 동등합니다:

@example
def f(arg):
    ...
f = staticmethod(f)

@@staticmethod
def f(arg):
    ...
@end example

같은 개념이 클래스에도 존재하지만, 덜 자주 쓰입니다. 데코레이터에 대한 더 자세한 내용은 @ref{2016,,함수 정의} 와 @ref{14dc,,클래스 정의} 의 설명서를 보면 됩니다.
@anchor{glossary term-descriptor}@anchor{1884}
@geindex descriptor (디스크립터)

@item descriptor (디스크립터)

메서드 @ref{16ed,,__get__()} 이나 @ref{23b5,,__set__()} 이나 @ref{1950,,__delete__()}를 정의하는 객체. 클래스 어트리뷰트가 디스크립터일 때, 어트리뷰트 조회는 특별한 연결 작용을 일으킵니다. 보통, `a.b'를 읽거나, 쓰거나, 삭제하는데 사용할 때, `a'의 클래스 딕셔너리에서 `b' 라고 이름 붙여진 객체를 찾습니다. 하지만 `b'가 디스크립터면, 해당하는 디스크립터 메서드가 호출됩니다. 디스크립터를 이해하는 것은 파이썬에 대한 깊은 이해의 열쇠인데, 함수, 메서드, 프로퍼티, 클래스 메서드, 스태틱 메서드, 슈퍼 클래스 참조 등의 많은 기능의 기초를 이루고 있기 때문입니다.

디스크립터의 메서드들에 대한 자세한 내용은 @ref{e48,,디스크립터 구현하기}나 @ref{16f2,,디스크립터 사용법 안내서}에 나옵니다.
@anchor{glossary term-dictionary}@anchor{23d5}
@geindex dictionary (딕셔너리)

@item dictionary (딕셔너리)

임의의 키를 값에 대응시키는 연관 배열 (associative array). 키는 @ref{cf2,,__hash__()} 와 @ref{cf1,,__eq__()} 메서드를 갖는 모든 객체가 될 수 있습니다. 펄에서 해시라고 부릅니다.
@anchor{glossary term-dictionary-comprehension}@anchor{59fb}
@geindex dictionary comprehension (딕셔너리 컴프리헨션)

@item dictionary comprehension (딕셔너리 컴프리헨션)

이터러블에 있는 요소 전체나 일부를 처리하고 결과를 담은 딕셔너리를 반환하는 간결한 방법. @code{results = @{n: n ** 2 for n in range(10)@}}은 값 @code{n ** 2}에 매핑된 키 @code{n}을 포함하는 딕셔너리를 생성합니다. @ref{7eb,,리스트@comma{} 집합@comma{} 딕셔너리의 디스플레이(display)}을 참조하십시오.
@anchor{glossary term-dictionary-view}@anchor{29b1}
@geindex dictionary view (딕셔너리 뷰)

@item dictionary view (딕셔너리 뷰)

@ref{9d0,,dict.keys()}, @ref{9d1,,dict.values()}, @ref{9d2,,dict.items()} 메서드가 돌려주는 객체들을 딕셔너리 뷰라고 부릅니다. 이것들은 딕셔너리 항목들에 대한 동적인 뷰를 제공하는데, 딕셔너리가 변경될 때, 뷰가 이 변화를 반영한다는 뜻입니다. 딕셔너리 뷰를 완전한 리스트로 바꾸려면 @code{list(dictview)}를 사용하면 됩니다. @ref{26a9,,딕셔너리 뷰 객체}를 보세요.
@anchor{glossary term-docstring}@anchor{22e9}
@geindex docstring (독스트링)

@item docstring (독스트링)

클래스, 함수, 모듈에서 첫 번째 표현식으로 나타나는 문자열 리터럴. 스위트가 실행될 때는 무시되지만, 컴파일러에 의해 인지되어 둘러싼 클래스, 함수, 모듈의 @ref{b21,,__doc__} 어트리뷰트로 삽입됩니다. 인트로스펙션을 통해 사용할 수 있으므로, 객체의 설명서를 위한 규범적인 장소입니다.
@anchor{glossary term-duck-typing}@anchor{59ed}
@geindex duck-typing (덕 타이핑)

@item duck-typing (덕 타이핑)

올바른 인터페이스를 가졌는지 판단하는데 객체의 형을 보지 않는 프로그래밍 스타일; 대신, 단순히 메서드나 어트리뷰트가 호출되거나 사용됩니다 (“오리처럼 보이고 오리처럼 꽥꽥댄다면, 그것은 오리다.”) 특정한 형 대신에 인터페이스를 강조함으로써, 잘 설계된 코드는 다형적인 치환을 허락함으로써 유연성을 개선할 수 있습니다. 덕 타이핑은 @ref{f43,,type()} 이나 @ref{2ad,,isinstance()} 을 사용한 검사를 피합니다. (하지만, 덕 타이핑이 @ref{13bb,,추상 베이스 클래스} 로 보완될 수 있음에 유의해야 합니다.) 대신에, @ref{6f8,,hasattr()} 검사나 @ref{30a0,,EAFP} 프로그래밍을 씁니다.
@anchor{glossary term-dunder}@anchor{59fc}
@geindex dunder

@item dunder

An informal short-hand for “double underscore”, used when talking about a
@ref{1c5e,,special method}. For example, @code{__init__} is often pronounced
“dunder init”.
@anchor{glossary term-EAFP}@anchor{30a0}
@geindex EAFP

@item EAFP

허락보다는 용서를 구하기가 쉽다 (Easier to ask for forgiveness than permission). 이 흔히 볼 수 있는 파이썬 코딩 스타일은, 올바른 키나 어트리뷰트의 존재를 가정하고, 그 가정이 틀리면 예외를 잡습니다. 이 깔끔하고 빠른 스타일은 많은 @ref{8f7,,try}와 @ref{1ab,,except} 문의 존재로 특징지어집니다. 이 테크닉은 C와 같은 다른 많은 언어에서 자주 사용되는 @ref{59fd,,LBYL} 스타일과 대비됩니다.
@anchor{glossary term-evaluate-function}@anchor{452d}
@geindex evaluate function

@item evaluate function

A function that can be called to evaluate a lazily evaluated attribute
of an object, such as the value of type aliases created with the @ref{66b,,type}
statement.
@anchor{glossary term-expression}@anchor{23cf}
@geindex expression (표현식)

@item expression (표현식)

어떤 값으로 구해질 수 있는 문법적인 조각. 다른 말로 표현하면, 표현식은 리터럴, 이름, 어트리뷰트 액세스, 연산자, 함수들과 같은 값을 돌려주는 표현 요소들을 쌓아 올린 것입니다. 다른 많은 언어와 대조적으로, 모든 언어 구성물들이 표현식인 것은 아닙니다. @ref{1974,,while}처럼, 표현식으로 사용할 수 없는 @ref{2c23,,문장} 들이 있습니다. 대입 또한 문장이고, 표현식이 아닙니다.
@anchor{glossary term-extension-module}@anchor{224e}
@geindex extension module (확장 모듈)

@item extension module (확장 모듈)

C 나 C++로 작성된 모듈인데, 파이썬의 C API를 사용해서 핵심이나 사용자 코드와 상호 작용합니다.
@anchor{glossary term-f-string}@anchor{669}
@geindex f-string (f-문자열)

@item f-string (f-문자열)@anchor{glossary term-f-strings}@anchor{59fe}
@geindex f-strings

@itemx f-strings

String literals prefixed with @code{f} or @code{F} are commonly called
“f-strings” which is short for
@ref{19a,,formatted string literals}.  See also 
@geindex Python 향상 제안; PEP 498
PEP 498@footnote{https://peps.python.org/pep-0498/}.
@anchor{glossary term-file-object}@anchor{13c8}
@geindex file object (파일 객체)

@item file object (파일 객체)

하부 자원에 대해 파일 지향적 API(@code{read()} 나 @code{write()} 같은 메서드들)를 드러내는 객체. 만들어진 방법에 따라, 파일 객체는 실제 디스크 상의 파일이나 다른 저장 장치나 통신 장치 (예를 들어, 표준 입출력, 인-메모리 버퍼, 소켓, 파이프, 등등)에 대한 액세스를 중계할 수 있습니다. 파일 객체는 `파일류 객체 (file-like objects)'나 `스트림 (streams)' 이라고도 불립니다.

실제로는 세 부류의 파일 객체들이 있습니다. 날(raw) @ref{206c,,바이너리 파일}, 버퍼드(buffered) 바이너리 파일, @ref{206b,,텍스트 파일}. 이들의 인터페이스는 @ref{83,,io} 모듈에서 정의됩니다. 파일 객체를 만드는 규범적인 방법은 @ref{316,,open()} 함수를 쓰는 것입니다.
@anchor{glossary term-file-like-object}@anchor{17b3}
@geindex file-like object (파일류 객체)

@item file-like object (파일류 객체)

@ref{13c8,,파일 객체} 의 비슷한 말.
@anchor{glossary term-filesystem-encoding-and-error-handler}@anchor{75c}
@geindex filesystem encoding and error handler (파일시스템 인코딩과 에러 처리기)

@item filesystem encoding and error handler (파일시스템 인코딩과 에러 처리기)

Encoding and error handler used by Python to decode bytes from the
operating system and encode Unicode to the operating system.

The filesystem encoding must guarantee to successfully decode all bytes
below 128. If the file system encoding fails to provide this guarantee,
API functions can raise @ref{462,,UnicodeError}.

The @ref{e52,,sys.getfilesystemencoding()} and
@ref{ee1,,sys.getfilesystemencodeerrors()} functions can be used to get the
filesystem encoding and error handler.

The @ref{75c,,filesystem encoding and error handler} are configured at
Python startup by the @ref{992,,PyConfig_Read()} function: see
@ref{41b,,filesystem_encoding} and
@ref{41c,,filesystem_errors} members of @ref{3f7,,PyConfig}.

@ref{54a,,로케일 인코딩} 도 보세요.
@anchor{glossary term-finder}@anchor{2367}
@geindex finder (파인더)

@item finder (파인더)

임포트될 모듈을 위한 @ref{1a28,,로더} 를 찾으려고 시도하는 객체.

두 종류의 파인더가 있습니다: @ref{f26,,sys.meta_path} 와 함께 사용하는 @ref{126f,,메타 경로 파인더} 와 @ref{1223,,sys.path_hooks} 과 함께 사용하는 @ref{1270,,경로 엔트리 파인더}.

더 자세한 내용은 @ref{2447,,파인더(finder)와 로더(loader)} 와 @ref{7b,,importlib}를 참조하십시오.
@anchor{glossary term-floor-division}@anchor{b3e}
@geindex floor division (정수 나눗셈)

@item floor division (정수 나눗셈)

가장 가까운 정수로 내림하는 수학적 나눗셈. 정수 나눗셈 연산자는 @code{//} 다. 예를 들어, 표현식 @code{11 // 4} 의 값은 @code{2}가 되지만, 실수 나눗셈은 @code{2.75}를 돌려줍니다. @code{(-11) // 4} 가 @code{-2.75}를 `내림' 한 @code{-3}이 됨에 유의해야 합니다. 
@geindex Python 향상 제안; PEP 238
PEP 238@footnote{https://peps.python.org/pep-0238/}을 보세요.
@anchor{glossary term-free-threading}@anchor{1f4}
@geindex free threading (자유 스레딩)

@item free threading (자유 스레딩)

A threading model where multiple threads can run Python bytecode
simultaneously within the same interpreter.  This is in contrast to
the @ref{474,,global interpreter lock} which allows only one thread to
execute Python bytecode at a time.  See 
@geindex Python 향상 제안; PEP 703
PEP 703@footnote{https://peps.python.org/pep-0703/}.
@anchor{glossary term-free-threaded-build}@anchor{1767}
@geindex free-threaded build

@item free-threaded build

A build of @ref{904,,CPython} that supports @ref{1f4,,free threading},
configured using the @ref{49a,,--disable-gil} option before compilation.

See @ref{2723,,Python support for free threading}.
@anchor{glossary term-free-variable}@anchor{2429}
@geindex free variable (자유 변수)

@item free variable (자유 변수)

Formally, as defined in the @ref{2426,,language execution model}, a free
variable is any variable used in a namespace which is not a local variable in that
namespace. See @ref{1895,,closure variable} for an example.
Pragmatically, due to the name of the @ref{2344,,codeobject.co_freevars} attribute,
the term is also sometimes used as a synonym for closure variable.
@anchor{glossary term-function}@anchor{24b7}
@geindex function (함수)

@item function (함수)

호출자에게 어떤 값을 돌려주는 일련의 문장들. 없거나 그 이상의 @ref{679,,인자} 가 전달될 수 있는데, 바디의 실행에 사용될 수 있습니다. @ref{2348,,매개변수} 와 @ref{1867,,메서드} 와 @ref{2016,,함수 정의} 섹션도 보세요.
@anchor{glossary term-function-annotation}@anchor{2017}
@geindex function annotation (함수 어노테이션)

@item function annotation (함수 어노테이션)

함수 매개변수나 반환 값의 @ref{15c,,어노테이션}.

함수 어노테이션은 일반적으로 @ref{23cb,,형 힌트} 로 사용됩니다: 예를 들어, 이 함수는 두 개의 @ref{19b,,int} 인자를 받아들일 것으로 기대되고, 동시에 @code{int} 반환 값을 줄 것으로 기대됩니다:

@example
def sum_two_numbers(a: int, b: int) -> int:
   return a + b
@end example

함수 어노테이션 문법은 @ref{2016,,함수 정의} 절에서 설명합니다.

이 기능을 설명하는 @ref{f4f,,변수 어노테이션} 과 
@geindex Python 향상 제안; PEP 484
PEP 484@footnote{https://peps.python.org/pep-0484/}를 참조하세요. 또한 어노테이션에 대한 모범 사례는 @ref{9d9,,Annotations Best Practices}를 참조하세요.
@anchor{glossary term-__future__}@anchor{fac}
@geindex __future__

@item __future__

A @ref{45d,,future statement}, @code{from __future__ import <feature>},
directs the compiler to compile the current module using syntax or
semantics that will become standard in a future release of Python.
The @ref{0,,__future__} module documents the possible values of
`feature'.  By importing this module and evaluating its variables,
you can see when a new feature was first added to the language and
when it will (or did) become the default:

@example
>>> import __future__
>>> __future__.division
_Feature((2, 2, 0, 'alpha', 2), (3, 0, 0, 'alpha', 0), 8192)
@end example
@anchor{glossary term-garbage-collection}@anchor{17dd}
@geindex garbage collection (가비지 수거)

@item garbage collection (가비지 수거)

더 사용되지 않는 메모리를 반납하는 절차. 파이썬은 참조 횟수 추적과 참조 순환을 감지하고 끊을 수 있는 순환 가비지 수거기를 통해 가비지 수거를 수행합니다. 가비지 수거기는 @ref{64,,gc} 모듈을 사용해서 제어할 수 있습니다.

@geindex generator (제너레이터)
@anchor{glossary term-generator}@anchor{1260}
@geindex generator (제너레이터)

@item generator (제너레이터)

@ref{dd8,,제너레이터 이터레이터} 를 돌려주는 함수. 일반 함수처럼 보이는데, 일련의 값들을 만드는 @ref{bc1,,yield} 표현식을 포함한다는 점이 다릅니다. 이 값들은 for-루프로 사용하거나 @ref{9d8,,next()} 함수로 한 번에 하나씩 꺼낼 수 있습니다.

보통 제너레이터 함수를 가리키지만, 어떤 문맥에서는 `제너레이터 이터레이터' 를 가리킵니다. 의도하는 의미가 명확하지 않은 경우는, 완전한 용어를 써서 모호함을 없앱니다.
@anchor{glossary term-generator-iterator}@anchor{dd8}
@geindex generator iterator (제너레이터 이터레이터)

@item generator iterator (제너레이터 이터레이터)

@ref{1260,,제너레이터} 함수가 만드는 객체.

각 @ref{bc1,,yield}는 일시적으로 처리를 중단하고, (지역 변수들과 대기 중인 try-문들을 포함하는) 실행 상태를 기억합니다. `제너레이터 이터레이터' 가 재개되면, 떠난 곳으로 복귀합니다 (호출마다 새로 시작하는 함수와 대비됩니다).

@geindex generator expression (제너레이터 표현식)
@anchor{glossary term-generator-expression}@anchor{59ff}
@geindex generator expression (제너레이터 표현식)

@item generator expression (제너레이터 표현식)

@ref{4ca,,이터레이터}를 돌려주는 @ref{23cf,,표현식}. 루프 변수와 범위를 정의하는 @code{for} 절과 생략 가능한 @code{if} 절이 뒤에 붙는 일반 표현식 처럼 보입니다. 결합한 표현식은 둘러싼 함수를 위한 값들을 만들어냅니다:

@example
>>> sum(i*i for i in range(10))         # sum of squares 0, 1, 4, ... 81
285
@end example
@anchor{glossary term-generic-function}@anchor{be3}
@geindex generic function (제네릭 함수)

@item generic function (제네릭 함수)

같은 연산을 서로 다른 형들에 대해 구현한 여러 함수로 구성된 함수. 호출 때 어떤 구현이 사용될지는 디스패치 알고리즘에 의해 결정됩니다.

@ref{be2,,싱글 디스패치} 용어집 항목과 @ref{84a,,functools.singledispatch()} 데코레이터와 
@geindex Python 향상 제안; PEP 443
PEP 443@footnote{https://peps.python.org/pep-0443/}도 보세요.
@anchor{glossary term-generic-type}@anchor{1a1}
@geindex generic type (제네릭 형)

@item generic type (제네릭 형)

매개 변수화 할 수 있는 @ref{1cfb,,형}; 일반적으로 @ref{24d,,list} 나 @ref{183,,dict}와 같은 @ref{23d4,,컨테이너 클래스}. @ref{23cb,,형 힌트}와 @ref{15c,,어노테이션}에 사용됩니다.

For more details, see @ref{8c0,,generic alias types},
@geindex Python 향상 제안; PEP 483
PEP 483@footnote{https://peps.python.org/pep-0483/}, 
@geindex Python 향상 제안; PEP 484
PEP 484@footnote{https://peps.python.org/pep-0484/}, 
@geindex Python 향상 제안; PEP 585
PEP 585@footnote{https://peps.python.org/pep-0585/}, and the @ref{10a,,typing} module.
@anchor{glossary term-GIL}@anchor{164}
@geindex GIL

@item GIL

@ref{474,,전역 인터프리터 록} 을 보세요.
@anchor{glossary term-global-interpreter-lock}@anchor{474}
@geindex global interpreter lock (전역 인터프리터 록)

@item global interpreter lock (전역 인터프리터 록)

한 번에 오직 하나의 스레드가 파이썬 @ref{4ab,,바이트 코드} 를 실행하도록 보장하기 위해 @ref{904,,CPython} 인터프리터가 사용하는 메커니즘. (@ref{183,,dict}와 같은 중요한 내장형들을 포함하는) 객체 모델이 묵시적으로 동시 액세스에 대해 안전하도록 만들어서 CPython 구현을 단순하게 만듭니다. 인터프리터 전체를 잠그는 것은 인터프리터를 다중스레드화하기 쉽게 만드는 대신, 다중 프로세서 기계가 제공하는 병렬성의 많은 부분을 희생합니다.

하지만, 어떤 확장 모듈들은, 표준이나 제삼자 모두, 압축이나 해싱 같은 계산 집약적인 작업을 수행할 때는 GIL을 반납하도록 설계되었습니다. 또한, I/O를 할 때는 항상 GIL을 반납합니다.

As of Python 3.13, the GIL can be disabled using the @ref{49a,,--disable-gil}
build configuration. After building Python with this option, code must be
run with @ref{16f,,-X gil=0} or after setting the 
@geindex PYTHON_GIL
@geindex 환경 변수; PYTHON_GIL
@ref{49b,,PYTHON_GIL=0}
environment variable. This feature enables improved performance for
multi-threaded applications and makes it easier to use multi-core CPUs
efficiently. For more details, see 
@geindex Python 향상 제안; PEP 703
PEP 703@footnote{https://peps.python.org/pep-0703/}.

In prior versions of Python’s C API, a function might declare that it
requires the GIL to be held in order to use it. This refers to having an
@ref{4f10,,attached thread state}.
@anchor{glossary term-global-state}@anchor{5a00}
@geindex global state

@item global state

Data that is accessible throughout a program, such as module-level
variables, class variables, or C static variables in @ref{224e,,extension modules}.  In multi-threaded programs, global state shared
between threads typically requires synchronization to avoid
@ref{272b,,race conditions} and
@ref{272c,,data races}.
@anchor{glossary term-hash-based-pyc}@anchor{5a01}
@geindex hash-based pyc (해시 기반 pyc)

@item hash-based pyc (해시 기반 pyc)

유효성을 판별하기 위해 해당 소스 파일의 최종 수정 시간이 아닌 해시를 사용하는 바이트 코드 캐시 파일. @ref{801,,캐시된 바이트 코드 무효화}을 참조하세요.
@anchor{glossary term-hashable}@anchor{823}
@geindex hashable (해시 가능)

@item hashable (해시 가능)

객체가 일생 그 값이 변하지 않는 해시값을 갖고 (@ref{cf2,,__hash__()} 메서드가 필요합니다), 다른 객체와 비교될 수 있으면 (@ref{cf1,,__eq__()} 메서드가 필요합니다), `해시 가능'하다고 합니다. 같다고 비교되는 해시 가능한 객체들의 해시값은 같아야 합니다.

해시 가능성은 객체를 딕셔너리의 키나 집합의 멤버로 사용할 수 있게 하는데, 이 자료 구조들이 내부적으로 해시값을 사용하기 때문입니다.

대부분 파이썬의 불변 내장 객체들은 해시 가능합니다; (리스트나 딕셔너리 같은) 가변 컨테이너들은 그렇지 않습니다; (튜플이나 frozenset 같은) 불변 컨테이너들은 그들의 요소들이 해시 가능할 때만 해시 가능합니다. 사용자 정의 클래스의 인스턴스 객체들은 기본적으로 해시 가능합니다. (자기 자신을 제외하고는) 모두 다르다고 비교되고, 해시값은 @ref{1628,,id()}로 부터 만들어집니다.
@anchor{glossary term-IDLE}@anchor{5a02}
@geindex IDLE

@item IDLE

파이썬을 위한 통합 개발 및 학습 환경 (Integrated Development and Learning Environment). @ref{1214,,IDLE — 파이썬 편집기와 셸}은 파이썬의 표준 배포판에 따라오는 기초적인 편집기와 인터프리터 환경입니다.
@anchor{glossary term-immortal}@anchor{290}
@geindex immortal (불멸)

@item immortal (불멸)

`Immortal objects' are a CPython implementation detail introduced
in 
@geindex Python 향상 제안; PEP 683
PEP 683@footnote{https://peps.python.org/pep-0683/}.

If an object is immortal, its @ref{4f08,,reference count} is never modified,
and therefore it is never deallocated while the interpreter is running.
For example, @ref{e06,,True} and @ref{884,,None} are immortal in CPython.

Immortal objects can be identified via @ref{28f,,sys._is_immortal()}, or
via @ref{3c4,,PyUnstable_IsImmortal()} in the C API.
@anchor{glossary term-immutable}@anchor{1fdc}
@geindex immutable (불변)

@item immutable (불변)

An object with a fixed value.  Immutable objects include numbers, strings and
tuples.  Such an object cannot be altered.  A new object has to
be created if a different value has to be stored.  They play an important
role in places where a constant hash value is needed, for example as a key
in a dictionary.  Immutable objects are inherently @ref{59f8,,thread-safe}
because their state cannot be modified after creation, eliminating concerns
about improperly synchronized @ref{59f3,,concurrent modification}.
@anchor{glossary term-import-path}@anchor{244a}
@geindex import path (임포트 경로)

@item import path (임포트 경로)

@ref{244d,,경로 기반 파인더} 가 임포트 할 모듈을 찾기 위해 검색하는 장소들 (또는 @ref{2458,,경로 엔트리}) 의 목록. 임포트 하는 동안, 이 장소들의 목록은 보통 @ref{3e4,,sys.path} 로부터 옵니다, 하지만 서브 패키지의 경우 부모 패키지의 @code{__path__} 어트리뷰트로부터 올 수도 있습니다.
@anchor{glossary term-importing}@anchor{243d}
@geindex importing (임포팅)

@item importing (임포팅)

한 모듈의 파이썬 코드가 다른 모듈의 파이썬 코드에서 사용될 수 있도록 하는 절차.
@anchor{glossary term-importer}@anchor{2449}
@geindex importer (임포터)

@item importer (임포터)

모듈을 찾기도 하고 로드 하기도 하는 객체; 동시에 @ref{2367,,파인더} 이자 @ref{1a28,,로더} 객체입니다.
@anchor{glossary term-index}@anchor{23e3}
@geindex index

@item index

A numeric value that represents the position of an element in
a @ref{715,,sequence}.

In Python, indexing starts at zero.
For example, @code{things[0]} names the `first' element of @code{things};
@code{things[1]} names the second one.

In some contexts, Python allows negative indexes for counting from the
end of a sequence, and indexing using @ref{24ae,,slices}.

See also @ref{5a03,,subscript}.
@anchor{glossary term-interactive}@anchor{1b5}
@geindex interactive (대화형)

@item interactive (대화형)

파이썬은 대화형 인터프리터를 갖고 있는데, 인터프리터 프롬프트에서 문장과 표현식을 입력할 수 있고, 즉각 실행된 결과를 볼 수 있다는 뜻입니다. 인자 없이 단지 @code{python}을 실행하세요 (컴퓨터의 주메뉴에서 선택하는 것도 가능할 수 있습니다). 새 아이디어를 검사하거나 모듈과 패키지를 들여다보는 매우 강력한 방법입니다 (@code{help(x)}를 기억하세요). 대화형 모드에 대한 자세한 내용은 @ref{495,,대화형 모드}를 보세요.
@anchor{glossary term-interpreted}@anchor{5a04}
@geindex interpreted (인터프리티드)

@item interpreted (인터프리티드)

바이트 코드 컴파일러의 존재 때문에 그 구분이 흐릿해지기는 하지만, 파이썬은 컴파일 언어가 아니라 인터프리터 언어입니다. 이것은 명시적으로 실행 파일을 만들지 않고도, 소스 파일을 직접 실행할 수 있다는 뜻입니다. 그 프로그램이 좀 더 천천히 실행되기는 하지만, 인터프리터 언어는 보통 컴파일 언어보다 짧은 개발/디버깅 주기를 갖습니다. @ref{1b5,,대화형} 도 보세요.
@anchor{glossary term-interpreter-shutdown}@anchor{47a}
@geindex interpreter shutdown (인터프리터 종료)

@item interpreter shutdown (인터프리터 종료)

종료하라는 요청을 받을 때, 파이썬 인터프리터는 특별한 시기에 진입하는데, 모듈이나 여러 가지 중요한 내부 구조들과 같은 모든 할당된 자원들을 단계적으로 반납합니다. 또한, @ref{17dd,,가비지 수거기} 를 여러 번 호출합니다. 사용자 정의 파괴자나 weakref 콜백에 있는 코드들의 실행을 시작시킬 수 있습니다. 종료 시기 동안 실행되는 코드는 다양한 예외들을 만날 수 있는데, 그것이 의존하는 자원들이 더 기능하지 않을 수 있기 때문입니다 (흔한 예는 라이브러리 모듈이나 경고 장치들입니다).

인터프리터 종료의 주된 원인은 실행되는 @code{__main__} 모듈이나 스크립트가 실행을 끝내는 것입니다.
@anchor{glossary term-iterable}@anchor{142c}
@geindex iterable (이터러블)

@item iterable (이터러블)

멤버들을 한 번에 하나씩 돌려줄 수 있는 객체. 이터러블의 예로는 모든 (@ref{24d,,list}, @ref{169,,str}, @ref{610,,tuple} 같은) 시퀀스 형들, @ref{183,,dict} 같은 몇몇 비 시퀀스 형들, @ref{13c8,,파일 객체들}, @ref{e68,,__iter__()} 나 @ref{715,,시퀀스} 개념을 구현하는 @ref{588,,__getitem__()} 메서드를 써서 정의한 모든 클래스의 객체들이 있습니다.

이터러블은 @ref{34a,,for} 루프에 사용될 수 있고, 시퀀스를 필요로 하는 다른 많은 곳 (@ref{1a0,,zip()}, @ref{19f,,map()}, …) 에 사용될 수 있습니다. 이터러블 객체가 내장 함수 @ref{9d7,,iter()} 에 인자로 전달되면, 그 객체의 이터레이터를 돌려줍니다. 이 이터레이터는 값들의 집합을 한 번 거치는 동안 유효합니다. 이터러블을 사용할 때, 보통은 @code{iter()} 를 호출하거나, 이터레이터 객체를 직접 다룰 필요는 없습니다. @code{for} 문은 이것들을 여러분을 대신해서 자동으로 해주는데, 루프를 도는 동안 이터레이터를 잡아둘 이름 없는 변수를 만듭니다. @ref{4ca,,이터레이터}, @ref{715,,시퀀스}, @ref{1260,,제너레이터} 도 보세요.
@anchor{glossary term-iterator}@anchor{4ca}
@geindex iterator (이터레이터)

@item iterator (이터레이터)

데이터의 스트림을 표현하는 객체. 이터레이터의 @ref{14d2,,__next__()} 메서드를 반복적으로 호출하면 (또는 내장 함수 @ref{9d8,,next()} 로 전달하면) 스트림에 있는 항목들을 차례대로 돌려줍니다. 더 이상의 데이터가 없을 때는 대신 @ref{df4,,StopIteration} 예외를 일으킵니다. 이 지점에서, 이터레이터 객체는 소진되고, 이후의 모든 @code{__next__()} 메서드 호출은 @code{StopIteration} 예외를 다시 일으키기만 합니다. 이터레이터는 이터레이터 객체 자신을 돌려주는 @ref{20ab,,__iter__()} 메서드를 가질 것이 요구되기 때문에, 이터레이터는 이터러블이기도 하고 다른 이터러블들을 받아들이는 대부분의 곳에서 사용될 수 있습니다. 중요한 예외는 여러 번의 이터레이션을 시도하는 코드입니다. (@ref{24d,,list} 같은) 컨테이너 객체는 @ref{9d7,,iter()} 함수로 전달하거나 @ref{34a,,for} 루프에 사용할 때마다 새 이터레이터를 만듭니다. 이런 것을 이터레이터에 대해서 수행하려고 하면, 지난 이터레이션에 사용된 이미 소진된 이터레이터를 돌려줘서, 빈 컨테이너처럼 보이게 만듭니다.

@ref{25d7,,이터레이터 형} 에 더 자세한 내용이 있습니다.

`CPython 구현 상세:' CPython does not consistently apply the requirement that an iterator
define @ref{20ab,,__iter__()}.
And also please note that @ref{1f4,,free-threaded}
CPython does not guarantee @ref{59f8,,thread-safe} behavior of iterator
operations.
@anchor{glossary term-key}@anchor{23e4}
@geindex key

@item key

A value that identifies an entry in a @ref{13c0,,mapping}.
See also @ref{5a03,,subscript}.
@anchor{glossary term-key-function}@anchor{1005}
@geindex key function (키 함수)

@item key function (키 함수)

키 함수 또는 콜레이션(collation) 함수는 정렬(sorting)이나 배열(ordering)에 사용되는 값을 돌려주는 콜러블입니다. 예를 들어, @ref{17c3,,locale.strxfrm()} 은 로케일 특정 방식을 따르는 정렬 키를 만드는 데 사용됩니다.

파이썬의 많은 도구가 요소들이 어떻게 순서 지어지고 묶이는지를 제어하기 위해 키 함수를 받아들입니다. 이런 것들에는 @ref{110a,,min()}, @ref{110b,,max()}, @ref{dc6,,sorted()}, @ref{dc7,,list.sort()}, @ref{1004,,heapq.merge()}, @ref{29c9,,heapq.nsmallest()}, @ref{29c8,,heapq.nlargest()}, @ref{2bcc,,itertools.groupby()} 이 있습니다.

There are several ways to create a key function.  For example. the
@ref{fd5,,str.casefold()} method can serve as a key function for case insensitive
sorts.  Alternatively, a key function can be built from a
@ref{14a2,,lambda} expression such as @code{lambda r: (r[0], r[2])}.  Also,
@ref{1032,,operator.attrgetter()}, @ref{c56,,operator.itemgetter()}, and
@ref{1033,,operator.methodcaller()} are three key function constructors.  See the @ref{25de,,Sorting HOW TO} for examples of how to create and use key functions.
@anchor{glossary term-keyword-argument}@anchor{f0d}
@geindex keyword argument (키워드 인자)

@item keyword argument (키워드 인자)

@ref{679,,인자} 를 보세요.
@anchor{glossary term-lambda}@anchor{2bda}
@geindex lambda (람다)

@item lambda (람다)

호출될 때 값이 구해지는 하나의 @ref{23cf,,표현식} 으로 구성된 이름 없는 인라인 함수. 람다 함수를 만드는 문법은 @code{lambda [parameters]: expression} 입니다.
@anchor{glossary term-LBYL}@anchor{59fd}
@geindex LBYL

@item LBYL

뛰기 전에 보라 (Look before you leap). 이 코딩 스타일은 호출이나 조회를 하기 전에 명시적으로 사전 조건들을 검사합니다. 이 스타일은 @ref{30a0,,EAFP} 접근법과 대비되고, 많은 @ref{181,,if} 문의 존재로 특징지어집니다.

In a multi-threaded environment, the LBYL approach can risk introducing a
@ref{272b,,race condition} between “the looking” and “the leaping”.  For example,
the code, @code{if key in mapping: return mapping[key]} can fail if another
thread removes `key' from `mapping' after the test, but before the lookup.
This issue can be solved with @ref{272a,,locks} or by using the
@ref{30a0,,EAFP} approach.  See also @ref{59f8,,thread-safe}.
@anchor{glossary term-lexical-analyzer}@anchor{228f}
@geindex lexical analyzer (어휘 분석기)

@item lexical analyzer (어휘 분석기)

Formal name for the `tokenizer'; see @ref{2285,,token}.
@anchor{glossary term-list}@anchor{5a05}
@geindex list (리스트)

@item list (리스트)

내장 파이썬 @ref{715,,시퀀스}. 그 이름에도 불구하고, 원소에 대한 액세스가 `O'(1)이기 때문에, 연결 리스트(linked list)보다는 다른 언어의 배열과 유사합니다.
@anchor{glossary term-list-comprehension}@anchor{8dc}
@geindex list comprehension (리스트 컴프리헨션)

@item list comprehension (리스트 컴프리헨션)

시퀀스의 요소들 전부 또는 일부를 처리하고 그 결과를 리스트로 돌려주는 간결한 방법. @code{result = ['@{:#04x@}'.format(x) for x in range(256) if x % 2 == 0]} 는 0에서 255 사이에 있는 짝수들의 16진수 (0x..) 들을 포함하는 문자열의 리스트를 만듭니다. @ref{181,,if} 절은 생략할 수 있습니다. 생략하면, @code{range(256)}에 있는 모든 요소가 처리됩니다.
@anchor{glossary term-lock}@anchor{272a}
@geindex lock

@item lock

A @ref{59f6,,synchronization primitive} that allows only one thread at a
time to access a shared resource.  A thread must acquire a lock before
accessing the protected resource and release it afterward.  If a thread
attempts to acquire a lock that is already held by another thread, it
will block until the lock becomes available.  Python’s @ref{f3,,threading}
module provides @ref{19f4,,Lock} (a basic lock) and
@ref{32e,,RLock} (a @ref{59fa,,reentrant} lock).  Locks are used
to prevent @ref{272b,,race conditions} and ensure
@ref{59f8,,thread-safe} access to shared data.  Alternative design patterns
to locks exist such as queues, producer/consumer patterns, and
thread-local state. See also @ref{59f9,,deadlock}, and reentrant.
@anchor{glossary term-lock-free}@anchor{2738}
@geindex lock-free

@item lock-free

An operation that does not acquire any @ref{272a,,lock} and uses atomic CPU
instructions to ensure correctness. Lock-free operations can execute
concurrently without blocking each other and cannot be blocked by
operations that hold locks. In @ref{1f4,,free-threaded}
Python, built-in types like @ref{183,,dict} and @ref{24d,,list} provide
lock-free read operations, which means other threads may observe
intermediate states during multi-step modifications even when those
modifications hold the @ref{2731,,per-object lock}.
@anchor{glossary term-loader}@anchor{1a28}
@geindex loader (로더)

@item loader (로더)

An object that loads a module.
It must define the @code{exec_module()} and @code{create_module()} methods
to implement the @ref{10c6,,Loader} interface.
A loader is typically returned by a @ref{2367,,finder}.
See also:


@itemize *

@item 
@ref{2447,,파인더(finder)와 로더(loader)}

@item 
@ref{10c6,,importlib.abc.Loader}

@item 
@geindex Python 향상 제안; PEP 302
PEP 302@footnote{https://peps.python.org/pep-0302/}
@end itemize
@anchor{glossary term-locale-encoding}@anchor{54a}
@geindex locale encoding (로케일 인코딩)

@item locale encoding (로케일 인코딩)

On Unix, it is the encoding of the LC_CTYPE locale. It can be set with
@ref{328,,locale.setlocale(locale.LC_CTYPE@comma{} new_locale)}.

On Windows, it is the ANSI code page (ex: @code{"cp1252"}).

On Android and VxWorks, Python uses @code{"utf-8"} as the locale encoding.

@ref{329,,locale.getencoding()} can be used to get the locale encoding.

See also the @ref{75c,,filesystem encoding and error handler}.
@anchor{glossary term-magic-method}@anchor{46a6}
@geindex magic method (매직 메서드)

@item magic method (매직 메서드)

@geindex magic;method (메서드)

@ref{1c5e,,특수 메서드} 의 비공식적인 비슷한 말.
@anchor{glossary term-mapping}@anchor{13c0}
@geindex mapping (매핑)

@item mapping (매핑)

임의의 키 조회를 지원하고 @ref{ac7,,collections.abc.Mapping} 이나 @ref{12b1,,collections.abc.MutableMapping} @ref{a78,,추상 베이스 클래스} 에 지정된 메서드들을 구현하는 컨테이너 객체. 예로는 @ref{183,,dict}, @ref{13c1,,collections.defaultdict}, @ref{7f2,,collections.OrderedDict}, @ref{1296,,collections.Counter} 를 들 수 있습니다.
@anchor{glossary term-meta-path-finder}@anchor{126f}
@geindex meta path finder (메타 경로 파인더)

@item meta path finder (메타 경로 파인더)

@ref{f26,,sys.meta_path} 의 검색이 돌려주는 @ref{2367,,파인더}. 메타 경로 파인더는 @ref{1270,,경로 엔트리 파인더} 와 관련되어 있기는 하지만 다릅니다.

메타 경로 파인더가 구현하는 메서드들에 대해서는 @ref{a6e,,importlib.abc.MetaPathFinder} 를 보면 됩니다.
@anchor{glossary term-metaclass}@anchor{23d0}
@geindex metaclass (메타 클래스)

@item metaclass (메타 클래스)

클래스의 클래스. 클래스 정의는 클래스 이름, 클래스 딕셔너리, 베이스 클래스들의 목록을 만듭니다. 메타 클래스는 이 세 인자를 받아서 클래스를 만드는 책임을 집니다. 대부분의 객체 지향형 프로그래밍 언어들은 기본 구현을 제공합니다. 파이썬을 특별하게 만드는 것은 커스텀 메타 클래스를 만들 수 있다는 것입니다. 대부분 사용자에게는 이 도구가 전혀 필요 없지만, 필요가 생길 때, 메타 클래스는 강력하고 우아한 해법을 제공합니다. 어트리뷰트 액세스의 로깅(logging), 스레드 안전성의 추가, 객체 생성 추적, 싱글톤 구현과 많은 다른 작업에 사용됐습니다.

@ref{23be,,메타 클래스} 에서 더 자세한 내용을 찾을 수 있습니다.
@anchor{glossary term-method}@anchor{1867}
@geindex method (메서드)

@item method (메서드)

클래스 바디 안에서 정의되는 함수. 그 클래스의 인스턴스의 어트리뷰트로서 호출되면, 그 메서드는 첫 번째 @ref{679,,인자} (보통 @code{self} 라고 불린다) 로 인스턴스 객체를 받습니다. @ref{24b7,,함수} 와 @ref{238d,,중첩된 스코프} 를 보세요.
@anchor{glossary term-method-resolution-order}@anchor{25e0}
@geindex method resolution order (메서드 결정 순서)

@item method resolution order (메서드 결정 순서)

메서드 결정 순서는 조회하는 동안 멤버를 검색하는 베이스 클래스들의 순서입니다. 2.3 릴리스부터 파이썬 인터프리터에 사용된 알고리즘의 상세한 내용은 @ref{16af,,The Python 2.3 Method Resolution Order}를 보세요.
@anchor{glossary term-module}@anchor{19de}
@geindex module (모듈)

@item module (모듈)

파이썬 코드의 조직화 단위를 담당하는 객체. 모듈은 임의의 파이썬 객체들을 담는 이름 공간을 갖습니다. 모듈은 @ref{243d,,임포팅} 절차에 의해 파이썬으로 로드됩니다.

@ref{233,,패키지} 도 보세요.
@anchor{glossary term-module-spec}@anchor{2360}
@geindex module spec (모듈 스펙)

@item module spec (모듈 스펙)

모듈을 로드하는데 사용되는 임포트 관련 정보들을 담고 있는 이름 공간. @ref{2269,,importlib.machinery.ModuleSpec} 의 인스턴스.

@ref{2363,,모듈 스펙} 도 보세요.
@anchor{glossary term-MRO}@anchor{18de}
@geindex MRO

@item MRO

@ref{25e0,,메서드 결정 순서} 를 보세요.
@anchor{glossary term-mutable}@anchor{1fe1}
@geindex mutable (가변)

@item mutable (가변)

An @ref{5a06,,object} with state that is allowed to change during the course
of the program.  In multi-threaded programs, mutable objects that are
shared between threads require careful synchronization to avoid
@ref{272b,,race conditions}.  See also @ref{1fdc,,immutable},
@ref{59f8,,thread-safe}, and @ref{59f3,,concurrent modification}.
@anchor{glossary term-named-tuple}@anchor{85d}
@geindex named tuple (네임드 튜플)

@item named tuple (네임드 튜플)

“named tuple(네임드 튜플)”이라는 용어는 튜플에서 상속하고 이름 붙은 어트리뷰트를 사용하여 인덱스 할 수 있는 요소에 액세스 할 수 있는 모든 형이나 클래스에 적용됩니다. 형이나 클래스에는 다른 기능도 있을 수 있습니다.

@ref{16fe,,time.localtime()}과 @ref{26d,,os.stat()}가 반환한 값을 포함하여, 여러 내장형이 네임드 튜플입니다. 또 다른 예는 @ref{1dcc,,sys.float_info}입니다:

@example
>>> sys.float_info[1]                   # indexed access
1024
>>> sys.float_info.max_exp              # named field access
1024
>>> isinstance(sys.float_info, tuple)   # kind of tuple
True
@end example

일부 네임드 튜플은 내장형(위의 예)입니다. 또는, @ref{610,,tuple}에서 상속하고 이름 붙은 필드를 정의하는 일반 클래스 정의로 네임드 튜플을 만들 수 있습니다. 이러한 클래스는 직접 작성하거나, @ref{331,,typing.NamedTuple}를 계승하거나 팩토리 함수 @ref{4e0,,collections.namedtuple()}로 만들 수 있습니다. 후자의 기법은 직접 작성하거나 내장 네임드 튜플에서는 찾을 수 없는 몇 가지 추가 메서드를 추가하기도 합니다.
@anchor{glossary term-namespace}@anchor{203d}
@geindex namespace (이름 공간)

@item namespace (이름 공간)

변수가 저장되는 장소. 이름 공간은 딕셔너리로 구현됩니다. 객체에 중첩된 이름 공간 (메서드 에서) 뿐만 아니라 지역, 전역, 내장 이름 공간이 있습니다. 이름 공간은 이름 충돌을 방지해서 모듈성을 지원합니다. 예를 들어, 함수 @ref{316,,builtins.open} 과 @ref{f91,,os.open()} 은 그들의 이름 공간에 의해 구별됩니다. 또한, 이름 공간은 어떤 모듈이 함수를 구현하는지를 분명하게 만들어서 가독성과 유지 보수성에 도움을 줍니다. 예를 들어, @ref{1478,,random.seed()} 또는 @ref{d42,,itertools.islice()} 라고 쓰면 그 함수들이 각각 @ref{bd,,random} 과 @ref{85,,itertools} 모듈에 의해 구현되었음이 명확해집니다.
@anchor{glossary term-namespace-package}@anchor{2b2}
@geindex namespace package (이름 공간 패키지)

@item namespace package (이름 공간 패키지)

오직 서브 패키지들의 컨테이너로만 기능하는 @ref{233,,패키지}. 이름 공간 패키지는 물리적인 실체가 없을 수도 있고, 특히 @code{__init__.py} 파일이 없으므로 @ref{2441,,정규 패키지} 와는 다릅니다.

Namespace packages allow several individually installable packages to have a common parent package.
Otherwise, it is recommended to use a @ref{2441,,regular package}.

For more information, see 
@geindex Python 향상 제안; PEP 420
PEP 420@footnote{https://peps.python.org/pep-0420/} and @ref{2443,,이름 공간 패키지}.

@ref{19de,,모듈} 도 보세요.
@anchor{glossary term-native-code}@anchor{59f7}
@geindex native code

@item native code

Code that is compiled to machine instructions and runs directly on the
processor, as opposed to code that is interpreted or runs in a virtual
machine.  In the context of Python, native code typically refers to
C, C++, Rust or Fortran code in @ref{224e,,extension modules}
that can be called from Python.  See also extension module.
@anchor{glossary term-nested-scope}@anchor{238d}
@geindex nested scope (중첩된 스코프)

@item nested scope (중첩된 스코프)

둘러싼 정의에서 변수를 참조하는 능력. 예를 들어, 다른 함수 내부에서 정의된 함수는 바깥 함수에 있는 변수들을 참조할 수 있습니다. 중첩된 스코프는 기본적으로는 참조만 가능할 뿐, 대입은 되지 않는다는 것에 주의해야 합니다. 지역 변수들은 가장 내부의 스코프에서 읽고 씁니다. 마찬가지로, 전역 변수들은 전역 이름 공간에서 읽고 씁니다. @ref{14ac,,nonlocal} 은 바깥 스코프에 쓰는 것을 허락합니다.
@anchor{glossary term-new-style-class}@anchor{2d31}
@geindex new-style class (뉴스타일 클래스)

@item new-style class (뉴스타일 클래스)

지금은 모든 클래스 객체에 사용되고 있는 클래스 버전의 예전 이름. 초기의 파이썬 버전에서는, 오직 뉴스타일 클래스만 @ref{16f0,,__slots__}, 디스크립터, 프라퍼티, @ref{dca,,__getattribute__()}, 클래스 메서드, 스태틱 메서드와 같은 파이썬의 새롭고 다양한 기능들을 사용할 수 있었습니다.
@anchor{glossary term-non-deterministic}@anchor{59f5}
@geindex non-deterministic

@item non-deterministic

Behavior where the outcome of a program can vary between executions with
the same inputs.  In multi-threaded programs, non-deterministic behavior
often results from @ref{272b,,race conditions} where the
relative timing or interleaving of threads affects the result.
Proper synchronization using @ref{272a,,locks} and other
@ref{59f6,,synchronization primitives} helps
ensure deterministic behavior.
@anchor{glossary term-object}@anchor{5a06}
@geindex object (객체)

@item object (객체)

상태 (어트리뷰트나 값) 를 갖고 동작 (메서드) 이 정의된 모든 데이터. 또한, 모든 @ref{2d31,,뉴스타일 클래스} 의 최종적인 베이스 클래스입니다.
@anchor{glossary term-optimized-scope}@anchor{4a2}
@geindex optimized scope (최적화된 스코프)

@item optimized scope (최적화된 스코프)

A scope where target local variable names are reliably known to the
compiler when the code is compiled, allowing optimization of read and
write access to these names. The local namespaces for functions,
generators, coroutines, comprehensions, and generator expressions are
optimized in this fashion. Note: most interpreter optimizations are
applied to all scopes, only those relying on a known set of local
and nonlocal variable names are restricted to optimized scopes.
@anchor{glossary term-optional-module}@anchor{2157}
@geindex optional module

@item optional module

An @ref{224e,,extension module} that is part of the @ref{5a07,,standard library},
but may be absent in some builds of @ref{904,,CPython},
usually due to missing third-party libraries or because the module
is not available for a given platform.

See @ref{2155,,Requirements for optional modules} for a list of optional modules
that require third-party libraries.
@anchor{glossary term-package}@anchor{233}
@geindex package (패키지)

@item package (패키지)

서브 모듈들이나, 재귀적으로 서브 패키지들을 포함할 수 있는 파이썬 @ref{19de,,모듈}. 기술적으로, 패키지는 @code{__path__} 어트리뷰트가 있는 파이썬 모듈입니다.

@ref{2441,,정규 패키지} 와 @ref{2b2,,이름 공간 패키지} 도 보세요.
@anchor{glossary term-parallelism}@anchor{59f2}
@geindex parallelism

@item parallelism

Executing multiple operations at the same time (e.g. on multiple CPU
cores).  In Python builds with the
@ref{474,,global interpreter lock (GIL)}, only one
thread runs Python bytecode at a time, so taking advantage of multiple
CPU cores typically involves multiple processes
(e.g. @ref{98,,multiprocessing}) or native extensions that release the GIL.
In @ref{1f4,,free-threaded} Python, multiple Python threads
can run Python code simultaneously on different cores.
@anchor{glossary term-parameter}@anchor{2348}
@geindex parameter (매개변수)

@item parameter (매개변수)

@ref{24b7,,함수} (또는 메서드) 정의에서 함수가 받을 수 있는 @ref{679,,인자} (또는 어떤 경우 인자들) 를 지정하는 이름 붙은 엔티티. 다섯 종류의 매개변수가 있습니다:


@itemize *

@item 
`위치-키워드 (positional-or-keyword)': @ref{f0e,,위치 인자} 나 @ref{f0d,,키워드 인자} 로 전달될 수 있는 인자를 지정합니다. 이것이 기본 형태의 매개변수입니다, 예를 들어 다음에서 `foo' 와 `bar':

@example
def func(foo, bar=None): ...
@end example
@end itemize
@anchor{glossary positional-only-parameter}@anchor{c77}

@itemize *

@item 
`위치-전용 (positional-only)': 위치로만 제공될 수 있는 인자를 지정합니다. 위치 전용 매개변수는 함수 정의의 매개변수 목록에 @code{/} 문자를 포함하고 그 뒤에 정의할 수 있습니다, 예를 들어 다음에서 `posonly1'과 `posonly2':

@example
def func(posonly1, posonly2, /, positional_or_keyword): ...
@end example
@end itemize
@anchor{glossary keyword-only-parameter}@anchor{5a4}

@itemize *

@item 
`키워드-전용 (keyword-only)': 키워드로만 제공될 수 있는 인자를 지정합니다. 키워드-전용 매개변수는 함수 정의의 매개변수 목록에서 앞에 하나의 가변-위치 매개변수나 @code{*}를 그대로 포함해서 정의할 수 있습니다. 예를 들어, 다음에서 `kw_only1' 와 `kw_only2':

@example
def func(arg, *, kw_only1, kw_only2): ...
@end example

@item 
`가변-위치 (var-positional)': (다른 매개변수들에 의해서 이미 받아들여진 위치 인자들에 더해) 제공될 수 있는 위치 인자들의 임의의 시퀀스를 지정합니다. 이런 매개변수는 매개변수 이름에 @code{*} 를 앞에 붙여서 정의될 수 있습니다, 예를 들어 다음에서 `args':

@example
def func(*args, **kwargs): ...
@end example

@item 
`가변-키워드 (var-keyword)': (다른 매개변수들에 의해서 이미 받아들여진 키워드 인자들에 더해) 제공될 수 있는 임의의 개수 키워드 인자들을 지정합니다. 이런 매개변수는 매개변수 이름에 @code{**}를 앞에 붙여서 정의될 수 있습니다, 예를 들어 위의 예에서 `kwargs'.
@end itemize

매개변수는 선택적 인자들을 위한 기본값뿐만 아니라 선택적이거나 필수 인자들을 지정할 수 있습니다.

@ref{679,,인자} 용어집 항목, @ref{5927,,인자와 매개변수의 차이}에 나오는 FAQ 질문, @ref{4e4,,inspect.Parameter} 클래스, @ref{2016,,함수 정의} 절, 
@geindex Python 향상 제안; PEP 362
PEP 362@footnote{https://peps.python.org/pep-0362/}도 보세요.
@anchor{glossary term-per-object-lock}@anchor{2731}
@geindex per-object lock

@item per-object lock

A @ref{272a,,lock} associated with an individual object instance rather than
a global lock shared across all objects. In @ref{1f4,,free-threaded} Python, built-in types like @ref{183,,dict} and
@ref{24d,,list} use per-object locks to allow concurrent operations on
different objects while serializing operations on the same object.
Operations that hold the per-object lock prevent other locking operations
on the same object from proceeding, but do not block @ref{2738,,lock-free}
operations.
@anchor{glossary term-path-entry}@anchor{2458}
@geindex path entry (경로 엔트리)

@item path entry (경로 엔트리)

@ref{244d,,경로 기반 파인더} 가 임포트 할 모듈들을 찾기 위해 참고하는 @ref{244a,,임포트 경로} 상의 하나의 장소.
@anchor{glossary term-path-entry-finder}@anchor{1270}
@geindex path entry finder (경로 엔트리 파인더)

@item path entry finder (경로 엔트리 파인더)

@ref{1223,,sys.path_hooks} 에 있는 콜러블 (즉, @ref{245a,,경로 엔트리 훅}) 이 돌려주는 @ref{2367,,파인더} 인데, 주어진 @ref{2458,,경로 엔트리} 로 모듈을 찾는 방법을 알고 있습니다.

경로 엔트리 파인더들이 구현하는 메서드들은 @ref{a6f,,importlib.abc.PathEntryFinder} 에 나옵니다.
@anchor{glossary term-path-entry-hook}@anchor{245a}
@geindex path entry hook (경로 엔트리 훅)

@item path entry hook (경로 엔트리 훅)

@ref{1223,,sys.path_hooks} 리스트에 있는 콜러블인데, 특정 @ref{2458,,경로 엔트리} 에서 모듈을 찾는 법을 알고 있다면 @ref{1270,,경로 엔트리 파인더} 를 돌려줍니다.
@anchor{glossary term-path-based-finder}@anchor{244d}
@geindex path based finder (경로 기반 파인더)

@item path based finder (경로 기반 파인더)

기본 @ref{126f,,메타 경로 파인더들} 중 하나인데, @ref{244a,,임포트 경로} 에서 모듈을 찾습니다.
@anchor{glossary term-path-like-object}@anchor{5a0}
@geindex path-like object (경로류 객체)

@item path-like object (경로류 객체)

파일 시스템 경로를 나타내는 객체. 경로류 객체는 경로를 나타내는 @ref{169,,str} 나 @ref{192,,bytes} 객체이거나 @ref{e4a,,os.PathLike} 프로토콜을 구현하는 객체입니다. @code{os.PathLike} 프로토콜을 지원하는 객체는 @ref{e4c,,os.fspath()} 함수를 호출해서 @code{str} 나 @code{bytes} 파일 시스템 경로로 변환될 수 있습니다; 대신 @ref{e4d,,os.fsdecode()} 와 @ref{e4e,,os.fsencode()} 는 각각 @code{str} 나 @code{bytes} 결과를 보장하는데 사용될 수 있습니다. 
@geindex Python 향상 제안; PEP 519
PEP 519@footnote{https://peps.python.org/pep-0519/}로 도입되었습니다.
@anchor{glossary term-PEP}@anchor{5a08}
@geindex PEP

@item PEP

파이썬 개선 제안. PEP는 파이썬 커뮤니티에 정보를 제공하거나 파이썬 또는 그 프로세스 또는 환경에 대한 새로운 기능을 설명하는 설계 문서입니다. PEP는 제안된 기능에 대한 간결한 기술 사양 및 근거를 제공해야 합니다.

PEP는 주요 새로운 기능을 제안하고 문제에 대한 커뮤니티 입력을 수집하며 파이썬에 들어간 설계 결정을 문서로 만들기 위한 기본 메커니즘입니다. PEP 작성자는 커뮤니티 내에서 합의를 구축하고 반대 의견을 문서화 할 책임이 있습니다.

@geindex Python 향상 제안; PEP 1
PEP 1@footnote{https://peps.python.org/pep-0001/} 참조하세요.
@anchor{glossary term-portion}@anchor{2444}
@geindex portion (포션)

@item portion (포션)

@geindex Python 향상 제안; PEP 420
PEP 420@footnote{https://peps.python.org/pep-0420/} 에서 정의한 것처럼, 이름 공간 패키지에 이바지하는 하나의 디렉터리에 들어있는 파일들의 집합 (zip 파일에 저장되는 것도 가능합니다).
@anchor{glossary term-positional-argument}@anchor{f0e}
@geindex positional argument (위치 인자)

@item positional argument (위치 인자)

@ref{679,,인자} 를 보세요.
@anchor{glossary term-provisional-API}@anchor{3d1}
@geindex provisional API (잠정 API)

@item provisional API (잠정 API)

잠정 API는 표준 라이브러리의 과거 호환성 보장으로부터 신중히 제외된 것입니다. 인터페이스의 큰 변화가 예상되지는 않지만, 잠정적이라고 표시되는 한, 코어 개발자들이 필요하다고 생각한다면 과거 호환성이 유지되지 않는 변경이 일어날 수 있습니다. 그런 변경은 불필요한 방식으로 일어나지는 않을 것입니다 — API를 포함하기 전에 놓친 중대하고 근본적인 결함이 발견된 경우에만 일어날 것입니다.

잠정 API에서조차도, 과거 호환성이 유지되지 않는 변경은 “최후의 수단”으로 여겨집니다 - 모든 식별된 문제들에 대해 과거 호환성을 유지하는 해법을 찾으려는 모든 시도가 선행됩니다.

이 절차는 표준 라이브러리가 오랜 시간 동안 잘못된 설계 오류에 발목 잡히지 않고 발전할 수 있도록 만듭니다. 더 자세한 내용은 
@geindex Python 향상 제안; PEP 411
PEP 411@footnote{https://peps.python.org/pep-0411/}을 보면 됩니다.
@anchor{glossary term-provisional-package}@anchor{1241}
@geindex provisional package (잠정 패키지)

@item provisional package (잠정 패키지)

@ref{3d1,,잠정 API} 를 보세요.
@anchor{glossary term-Python-3000}@anchor{5a09}
@geindex Python 3000 (파이썬 3000)

@item Python 3000 (파이썬 3000)

파이썬 3.x 배포 라인의 별명 (버전 3의 배포가 먼 미래의 이야기던 시절에 만들어진 이름이다.) 이것을 “Py3k” 로 줄여 쓰기도 합니다.
@anchor{glossary term-Pythonic}@anchor{5a0a}
@geindex Pythonic (파이썬다운)

@item Pythonic (파이썬다운)

다른 언어들에서 일반적인 개념들을 사용해서 코드를 구현하는 대신, 파이썬 언어에서 가장 자주 사용되는 이디엄들을 가까이 따르는 아이디어나 코드 조각. 예를 들어, 파이썬에서 자주 쓰는 이디엄은 @ref{34a,,for} 문을 사용해서 이터러블의 모든 요소로 루핑하는 것입니다. 다른 많은 언어에는 이런 종류의 구성물이 없으므로, 파이썬에 익숙하지 않은 사람들은 대신에 숫자 카운터를 사용하기도 합니다:

@example
for i in range(len(food)):
    print(food[i])
@end example

더 깔끔한, 파이썬다운 방법은 이렇습니다:

@example
for piece in food:
    print(piece)
@end example
@anchor{glossary term-qualified-name}@anchor{1d21}
@geindex qualified name (정규화된 이름)

@item qualified name (정규화된 이름)

모듈의 전역 스코프에서 모듈에 정의된 클래스, 함수, 메서드에 이르는 “경로”를 보여주는 점으로 구분된 이름. 
@geindex Python 향상 제안; PEP 3155
PEP 3155@footnote{https://peps.python.org/pep-3155/} 에서 정의됩니다. 최상위 함수와 클래스의 경우에, 정규화된 이름은 객체의 이름과 같습니다:

@example
>>> class C:
...     class D:
...         def meth(self):
...             pass
...
>>> C.__qualname__
'C'
>>> C.D.__qualname__
'C.D'
>>> C.D.meth.__qualname__
'C.D.meth'
@end example

모듈을 가리키는데 사용될 때, `완전히 정규화된 이름(fully qualified name)'은 모든 부모 패키지들을 포함해서 모듈로 가는 점으로 분리된 이름을 의미합니다, 예를 들어, @code{email.mime.text}:

@example
>>> import email.mime.text
>>> email.mime.text.__name__
'email.mime.text'
@end example
@anchor{glossary term-race-condition}@anchor{272b}
@geindex race condition

@item race condition

A condition of a program where the behavior
depends on the relative timing or ordering of events, particularly in
multi-threaded programs.  Race conditions can lead to
@ref{59f5,,non-deterministic} behavior and bugs that are difficult to
reproduce.  A @ref{272c,,data race} is a specific type of race condition
involving unsynchronized access to shared memory.  The @ref{59fd,,LBYL}
coding style is particularly susceptible to race conditions in
multi-threaded code.  Using @ref{272a,,locks} and other
@ref{59f6,,synchronization primitives}
helps prevent race conditions.
@anchor{glossary term-reference-count}@anchor{4f08}
@geindex reference count (참조 횟수)

@item reference count (참조 횟수)

객체에 대한 참조의 개수. 객체의 참조 횟수가 0으로 떨어지면, 메모리가 반납됩니다. 일부 객체는 @ref{290,,불멸}이며 참조 횟수가 수정되지 않아서, 객체가 할당 해제되지 않습니다. 참조 횟수 추적은 일반적으로 파이썬 코드에 노출되지는 않지만, @ref{904,,CPython} 구현의 핵심 요소입니다. 프로그래머는 특정 객체의 참조 횟수를 돌려주는 @ref{2ce,,sys.getrefcount()} 함수를 호출할 수 있습니다.

In @ref{904,,CPython}, reference counts are not considered to be stable
or well-defined values; the number of references to an object, and how
that number is affected by Python code, may be different between
versions.
@anchor{glossary term-regular-package}@anchor{2441}
@geindex regular package (정규 패키지)

@item regular package (정규 패키지)

@code{__init__.py} 파일을 포함하는 디렉터리와 같은 전통적인 @ref{233,,패키지}.

@ref{2b2,,이름 공간 패키지} 도 보세요.
@anchor{glossary term-reentrant}@anchor{59fa}
@geindex reentrant

@item reentrant

A property of a function or @ref{272a,,lock} that allows it to be called or
acquired multiple times by the same thread without causing errors or a
@ref{59f9,,deadlock}.

For functions, reentrancy means the function can be safely called again
before a previous invocation has completed, which is important when
functions may be called recursively or from signal handlers. Thread-unsafe
functions may be @ref{59f5,,non-deterministic} if they’re called reentrantly in a
multithreaded program.

For locks, Python’s @ref{32e,,threading.RLock} (reentrant lock) is
reentrant, meaning a thread that already holds the lock can acquire it
again without blocking.  In contrast, @ref{19f4,,threading.Lock} is not
reentrant - attempting to acquire it twice from the same thread will cause
a deadlock.

See also @ref{272a,,lock} and @ref{59f9,,deadlock}.
@anchor{glossary term-REPL}@anchor{492}
@geindex REPL

@item REPL

An acronym for the “read–eval–print loop”, another name for the
@ref{1b5,,interactive} interpreter shell.
@anchor{glossary term-__slots__}@anchor{7f6}
@geindex __slots__

@item __slots__

클래스 내부의 선언인데, 인스턴스 어트리뷰트들을 위한 공간을 미리 선언하고 인스턴스 딕셔너리를 제거함으로써 메모리를 절감하는 효과를 줍니다. 인기 있기는 하지만, 이 테크닉은 올바르게 사용하기가 좀 까다로운 편이라서, 메모리에 민감한 응용 프로그램에서 많은 수의 인스턴스가 있는 특별한 경우로 한정하는 것이 좋습니다.
@anchor{glossary term-sequence}@anchor{715}
@geindex sequence (시퀀스)

@item sequence (시퀀스)

@ref{588,,__getitem__()} 특수 메서드를 통해 정수 인덱스를 사용한 빠른 요소 액세스를 지원하고, 시퀀스의 길이를 돌려주는 @ref{1797,,__len__()} 메서드를 정의하는 @ref{142c,,이터러블}. 몇몇 내장 시퀀스들을 나열해보면, @ref{24d,,list}, @ref{169,,str}, @ref{610,,tuple}, @ref{192,,bytes} 가 있습니다. @ref{183,,dict} 또한 @code{__getitem__()} 과 @code{__len__()} 을 지원하지만, 조회에 정수 대신 임의의 @ref{823,,해시 가능} 키를 사용하기 때문에 시퀀스가 아니라 매핑으로 취급된다는 것에 주의해야 합니다.

The @ref{13c9,,collections.abc.Sequence} abstract base class
defines a much richer interface that goes beyond just
@ref{588,,__getitem__()} and @ref{1797,,__len__()}, adding
@ref{23d8,,count()}, @ref{197a,,index()},
@ref{15be,,__contains__()}, and @ref{e85,,__reversed__()}.
Types that implement this expanded
interface can be registered explicitly using
@ref{128d,,register()}. For more documentation on sequence
methods generally, see
@ref{2608,,Common Sequence Operations}.
@anchor{glossary term-set-comprehension}@anchor{5a0b}
@geindex set comprehension (집합 컴프리헨션)

@item set comprehension (집합 컴프리헨션)

이터러블에 있는 요소 전체나 일부를 처리하고 결과를 담은 집합을 반환하는 간결한 방법. @code{results = @{c for c in 'abracadabra' if c not in 'abc'@}}는 문자열의 집합 @code{@{'r', 'd'@}}를 생성합니다. @ref{7eb,,리스트@comma{} 집합@comma{} 딕셔너리의 디스플레이(display)}을 참조하십시오.
@anchor{glossary term-single-dispatch}@anchor{be2}
@geindex single dispatch (싱글 디스패치)

@item single dispatch (싱글 디스패치)

구현이 하나의 인자의 형에 기초해서 결정되는 @ref{be3,,제네릭 함수} 디스패치의 한 형태.
@anchor{glossary term-slice}@anchor{24ae}
@geindex slice (슬라이스)

@item slice (슬라이스)

An object of type @ref{693,,slice}, used to describe a portion of
a @ref{715,,sequence}.
A slice object is created when using the @ref{24ad,,slicing} form
of @ref{23ce,,subscript notation}, with colons inside square
brackets, such as in @code{variable_name[1:3:5]}.
@anchor{glossary term-soft-deprecated}@anchor{23d}
@geindex soft deprecated (약하게 폐지된)

@item soft deprecated (약하게 폐지된)

A soft deprecated API should not be used in new code,
but it is safe for already existing code to use it.
The API remains documented and tested, but will not be enhanced further.

Soft deprecation, unlike normal deprecation, does not plan on removing the API
and will not emit warnings.

See PEP 387: Soft Deprecation@footnote{https://peps.python.org/pep-0387/#soft-deprecation}.
@anchor{glossary term-special-method}@anchor{1c5e}
@geindex special method (특수 메서드)

@item special method (특수 메서드)

@geindex special;method (메서드)

파이썬이 형에 어떤 연산을, 덧셈 같은, 실행할 때 묵시적으로 호출되는 메서드. 이런 메서드는 두 개의 밑줄로 시작하고 끝나는 이름을 갖고 있습니다. 특수 메서드는 @ref{e67,,특수 메서드 이름들} 에 문서로 만들어져 있습니다.
@anchor{glossary term-standard-library}@anchor{5a07}
@geindex standard library

@item standard library

The collection of @ref{233,,packages}, @ref{19de,,modules}
and @ref{224e,,extension modules} distributed as a part
of the official Python interpreter package.  The exact membership of the
collection may vary based on platform, available system libraries, or
other criteria.  Documentation can be found at @ref{149,,파이썬 표준 라이브러리}.

See also @ref{a42,,sys.stdlib_module_names} for a list of all possible
standard library module names.
@anchor{glossary term-statement}@anchor{2c23}
@geindex statement (문장)

@item statement (문장)

문장은 스위트 (코드의 “블록(block)”) 를 구성하는 부분입니다. 문장은 @ref{23cf,,표현식} 이거나 키워드를 사용하는 여러 가지 구조물 중의 하나입니다. 가령 @ref{181,,if}, @ref{1974,,while}, @ref{34a,,for}.
@anchor{glossary term-static-type-checker}@anchor{573}
@geindex static type checker (정적 형 검사기)

@item static type checker (정적 형 검사기)

An external tool that reads Python code and analyzes it, looking for
issues such as incorrect types. See also @ref{23cb,,type hints}
and the @ref{10a,,typing} module.
@anchor{glossary term-stdlib}@anchor{178e}
@geindex stdlib

@item stdlib

An abbreviation of @ref{5a07,,standard library}.
@anchor{glossary term-strong-reference}@anchor{5df}
@geindex strong reference (강한 참조)

@item strong reference (강한 참조)

In Python’s C API, a strong reference is a reference to an object
which is owned by the code holding the reference.  The strong
reference is taken by calling @ref{78e,,Py_INCREF()} when the
reference is created and released with @ref{78f,,Py_DECREF()}
when the reference is deleted.

The @ref{a9a,,Py_NewRef()} function can be used to create a strong reference
to an object. Usually, the @ref{78f,,Py_DECREF()} function must be called on
the strong reference before exiting the scope of the strong reference, to
avoid leaking one reference.

@ref{3d7,,빌린 참조} 도 보세요.
@anchor{glossary term-subscript}@anchor{5a03}
@geindex subscript

@item subscript

The expression in square brackets of a
@ref{23ce,,subscription expression}, for example,
the @code{3} in @code{items[3]}.
Usually used to select an element of a container.
Also called a @ref{23e4,,key} when subscripting a @ref{13c0,,mapping},
or an @ref{23e3,,index} when subscripting a @ref{715,,sequence}.
@anchor{glossary term-synchronization-primitive}@anchor{59f6}
@geindex synchronization primitive

@item synchronization primitive

A basic building block for coordinating (synchronizing) the execution of
multiple threads to ensure @ref{59f8,,thread-safe} access to shared resources.
Python’s @ref{f3,,threading} module provides several synchronization primitives
including @ref{19f4,,Lock}, @ref{32e,,RLock},
@ref{135b,,Semaphore}, @ref{135a,,Condition},
@ref{135d,,Event}, and @ref{13e8,,Barrier}.  Additionally,
the @ref{bb,,queue} module provides multi-producer, multi-consumer queues
that are especially useful in multithreaded programs. These
primitives help prevent @ref{272b,,race conditions} and
coordinate thread execution.  See also @ref{272a,,lock}.
@anchor{glossary term-t-string}@anchor{5a0c}
@geindex t-string

@item t-string@anchor{glossary term-t-strings}@anchor{5a0d}
@geindex t-strings

@itemx t-strings

String literals prefixed with @code{t} or @code{T} are commonly called
“t-strings” which is short for
@ref{17fd,,template string literals}.
@anchor{glossary term-text-encoding}@anchor{25db}
@geindex text encoding (텍스트 인코딩)

@item text encoding (텍스트 인코딩)

A string in Python is a sequence of Unicode code points (in range
@code{U+0000}–@code{U+10FFFF}). To store or transfer a string, it needs to be
serialized as a sequence of bytes.

Serializing a string into a sequence of bytes is known as “encoding”, and
recreating the string from the sequence of bytes is known as “decoding”.

There are a variety of different text serialization
@ref{fb7,,codecs}, which are collectively referred to as
“text encodings”.
@anchor{glossary term-text-file}@anchor{206b}
@geindex text file (텍스트 파일)

@item text file (텍스트 파일)

@ref{169,,str} 객체를 읽고 쓸 수 있는 @ref{13c8,,파일 객체}. 종종, 텍스트 파일은 실제로는 바이트 지향 데이터스트림을 액세스하고 @ref{25db,,텍스트 인코딩} 을 자동 처리합니다. 텍스트 파일의 예로는 텍스트 모드 (@code{'r'} 또는 @code{'w'}) 로 열린 파일, @ref{75e,,sys.stdin}, @ref{ccc,,sys.stdout}, @ref{1128,,io.StringIO} 의 인스턴스를 들 수 있습니다.

@ref{193,,바이트열류 객체} 를 읽고 쓸 수 있는 파일 객체에 대해서는 @ref{206c,,바이너리 파일} 도 참조하세요.
@anchor{glossary term-thread-state}@anchor{1848}
@geindex thread state

@item thread state

The information used by the @ref{904,,CPython} runtime to run in an OS thread.
For example, this includes the current exception, if any, and the
state of the bytecode interpreter.

Each thread state is bound to a single OS thread, but threads may have
many thread states available.  At most, one of them may be
@ref{4f10,,attached} at once.

An @ref{4f10,,attached thread state} is required to call most
of Python’s C API, unless a function explicitly documents otherwise.
The bytecode interpreter only runs under an attached thread state.

Each thread state belongs to a single interpreter, but each interpreter
may have many thread states, including multiple for the same OS thread.
Thread states from multiple interpreters may be bound to the same
thread, but only one can be @ref{4f10,,attached} in
that thread at any given moment.

See @ref{555e,,Thread State and the Global Interpreter Lock} for more
information.
@anchor{glossary term-thread-safe}@anchor{59f8}
@geindex thread-safe

@item thread-safe

A module, function, or class that behaves correctly when used by multiple
threads concurrently.  Thread-safe code uses appropriate
@ref{59f6,,synchronization primitives} like
@ref{272a,,locks} to protect shared mutable state, or is designed
to avoid shared mutable state entirely.  In the
@ref{1f4,,free-threaded} build, built-in types like
@ref{183,,dict}, @ref{24d,,list}, and @ref{184,,set} use internal locking
to make many operations thread-safe, although thread safety is not
necessarily guaranteed.  Code that is not thread-safe may experience
@ref{272b,,race conditions} and @ref{272c,,data races}
when used in multi-threaded programs.
@anchor{glossary term-token}@anchor{2285}
@geindex token (토큰)

@item token (토큰)

A small unit of source code, generated by the
@ref{2292,,lexical analyzer} (also called the `tokenizer').
Names, numbers, strings, operators,
newlines and similar are represented by tokens.

The @ref{101,,tokenize} module exposes Python’s lexical analyzer.
The @ref{100,,token} module contains information on the various types
of tokens.
@anchor{glossary term-triple-quoted-string}@anchor{5a0e}
@geindex triple-quoted string (삼중 따옴표 된 문자열)

@item triple-quoted string (삼중 따옴표 된 문자열)

따옴표 (”) 나 작은따옴표 (’) 세 개로 둘러싸인 문자열. 그냥 따옴표 하나로 둘러싸인 문자열에 없는 기능을 제공하지는 않지만, 여러 가지 이유에서 쓸모가 있습니다. 이스케이프 되지 않은 작은따옴표나 큰따옴표를 문자열 안에 포함할 수 있도록 하고, 연결 문자를 쓰지 않고도 여러 줄에 걸칠 수 있는데, 독스트링을 쓸 때 특히 쓸모 있습니다.
@anchor{glossary term-type}@anchor{1cfb}
@geindex type (형)

@item type (형)

파이썬 객체의 형은 그것이 어떤 종류의 객체인지를 결정합니다; 모든 객체는 형이 있습니다. 객체의 형은 @ref{16b2,,__class__} 어트리뷰트로 액세스할 수 있거나 @code{type(obj)}로 얻을 수 있습니다.
@anchor{glossary term-type-alias}@anchor{66c}
@geindex type alias (형 에일리어스)

@item type alias (형 에일리어스)

형을 식별자에 대입하여 만들어지는 형의 동의어.

형 에일리어스는 @ref{23cb,,형 힌트}를 단순화하는 데 유용합니다. 예를 들면:

@example
def remove_gray_shades(
        colors: list[tuple[int, int, int]]) -> list[tuple[int, int, int]]:
    pass
@end example

는 다음과 같이 더 읽기 쉽게 만들 수 있습니다:

@example
Color = tuple[int, int, int]

def remove_gray_shades(colors: list[Color]) -> list[Color]:
    pass
@end example

이 기능을 설명하는 @ref{10a,,typing}과 
@geindex Python 향상 제안; PEP 484
PEP 484@footnote{https://peps.python.org/pep-0484/}를 참조하세요.
@anchor{glossary term-type-hint}@anchor{23cb}
@geindex type hint (형 힌트)

@item type hint (형 힌트)

변수, 클래스 어트리뷰트 및 함수 매개변수 나 반환 값의 기대되는 형을 지정하는 @ref{15c,,어노테이션}.

형 힌트는 선택 사항이고 파이썬에서 강제되지는 않지만, @ref{573,,정적 형 검사기}에 유용합니다. 또한 IDE의 코드 완성 및 리팩토링을 돕습니다.

지역 변수를 제외하고, 전역 변수, 클래스 어트리뷰트 및 함수의 형 힌트는 @ref{8bf,,typing.get_type_hints()}를 사용하여 액세스할 수 있습니다.

이 기능을 설명하는 @ref{10a,,typing}과 
@geindex Python 향상 제안; PEP 484
PEP 484@footnote{https://peps.python.org/pep-0484/}를 참조하세요.
@anchor{glossary term-universal-newlines}@anchor{f34}
@geindex universal newlines (유니버설 줄 넘김)

@item universal newlines (유니버설 줄 넘김)

다음과 같은 것들을 모두 줄의 끝으로 인식하는, 텍스트 스트림을 해석하는 태도: 유닉스 개행 문자 관례 @code{'\n'}, 윈도우즈 관례 @code{'\r\n'}, 예전의 매킨토시 관례 @code{'\r'}. 추가적인 사용에 관해서는 @ref{2624,,bytes.splitlines()} 뿐만 아니라 
@geindex Python 향상 제안; PEP 278
PEP 278@footnote{https://peps.python.org/pep-0278/} 와 
@geindex Python 향상 제안; PEP 3116
PEP 3116@footnote{https://peps.python.org/pep-3116/} 도 보세요.
@anchor{glossary term-variable-annotation}@anchor{f4f}
@geindex variable annotation (변수 어노테이션)

@item variable annotation (변수 어노테이션)

변수 또는 클래스 어트리뷰트의 @ref{15c,,어노테이션}.

변수 또는 클래스 어트리뷰트에 어노테이션을 달 때 대입은 선택 사항입니다:

@example
class C:
    field: 'annotation'
@end example

변수 어노테이션은 일반적으로 @ref{23cb,,형 힌트}로 사용됩니다: 예를 들어, 이 변수는 @ref{19b,,int} 값을 가질 것으로 기대됩니다:

@example
count: int = 0
@end example

변수 어노테이션 문법은 섹션 @ref{250b,,어노테이트된 대입문(Annotated assignment statements)} 에서 설명합니다.

이 기능을 설명하는 @ref{2017,,함수 어노테이션}, 
@geindex Python 향상 제안; PEP 484
PEP 484@footnote{https://peps.python.org/pep-0484/} 및 
@geindex Python 향상 제안; PEP 526
PEP 526@footnote{https://peps.python.org/pep-0526/}을 참조하세요. 또한 어노테이션 작업에 대한 모범 사례는 @ref{9d9,,Annotations Best Practices}를 참조하세요.
@anchor{glossary term-virtual-environment}@anchor{20eb}
@geindex virtual environment (가상 환경)

@item virtual environment (가상 환경)

파이썬 사용자와 응용 프로그램이, 같은 시스템에서 실행되는 다른 파이썬 응용 프로그램들의 동작에 영향을 주지 않으면서, 파이썬 배포 패키지들을 설치하거나 업그레이드하는 것을 가능하게 하는, 협력적으로 격리된 실행 환경.

@ref{117,,venv} 도 보세요.
@anchor{glossary term-virtual-machine}@anchor{3a92}
@geindex virtual machine (가상 기계)

@item virtual machine (가상 기계)

소프트웨어만으로 정의된 컴퓨터. 파이썬의 가상 기계는 바이트 코드 컴파일러가 출력하는 @ref{4ab,,바이트 코드}를 실행합니다.
@anchor{glossary term-walrus-operator}@anchor{5a0f}
@geindex walrus operator

@item walrus operator

A light-hearted way to refer to the @ref{24dd,,assignment expression} operator @code{:=} because it looks a bit like a
walrus if you turn your head.
@anchor{glossary term-Zen-of-Python}@anchor{5a10}
@geindex Zen of Python (파이썬 젠)

@item Zen of Python (파이썬 젠)

파이썬 디자인 원리와 철학들의 목록인데, 언어를 이해하고 사용하는 데 도움이 됩니다. 이 목록은 대화형 프롬프트에서 “@code{import this}” 를 입력하면 보입니다.
@end table

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 이 설명서에 관하여,버그 다루기,용어집,Top
@anchor{about doc}@anchor{5a11}@anchor{about about-this-documentation}@anchor{5a12}@anchor{about translation-repo}@anchor{5a13}
@chapter 이 설명서에 관하여


파이썬 설명서는 reStructuredText@footnote{https://docutils.sourceforge.io/rst.html} 소스에서 만들어진 것으로, 원래 파이썬을 위해 제작되었고 이제는 독립 프로젝트로 유지 관리되는 설명서 생성기인 Sphinx@footnote{https://www.sphinx-doc.org/} 를 사용했습니다.

@c In the online version of these documents, you can submit comments and suggest
@c changes directly on the documentation pages.

설명서와 이를 위한 툴체인 개발은 파이썬 자체와 마찬가지로 전적으로 자원봉사자의 노력입니다. 기여하고 싶다면, 참여 방법에 대한 정보는 @ref{4f58,,버그 다루기} 페이지를 참고하십시오. 새로운 자원봉사자는 언제나 환영합니다!

다음 분들에게 많은 감사를 드립니다:


@itemize *

@item 
Fred L. Drake, Jr., 원래 파이썬 설명서 도구 집합의 작성자이자 많은 콘텐츠의 저자;

@item 
reStructuredText와 Docutils 스위트를 만드는 Docutils@footnote{https://docutils.sourceforge.io/} 프로젝트.

@item 
Fredrik Lundh, 그의 대안 파이썬 참조(Alternative Python Reference) 프로젝트에서 Sphinx가 많은 아이디어를 얻었습니다.
@end itemize

@menu
* 파이썬 설명서의 공헌자들:: 

@end menu

@node 파이썬 설명서의 공헌자들,,,이 설명서에 관하여
@anchor{about contributors-to-the-python-documentation}@anchor{5a14}
@section 파이썬 설명서의 공헌자들


많은 사람이 파이썬 언어, 파이썬 표준 라이브러리 및 파이썬 설명서에 기여했습니다. 기여자의 부분적인 목록은 파이썬 소스 배포판의 Misc/ACKS@footnote{https://github.com/python/cpython/tree/3.14/Misc/ACKS} 를 참조하십시오.

파이썬이 이런 멋진 설명서를 갖게 된 것은 파이썬 커뮤니티의 입력과 기여 때문입니다 – 감사합니다!

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 버그 다루기,저작권,이 설명서에 관하여,Top
@anchor{bugs doc}@anchor{5a15}@anchor{bugs dealing-with-bugs}@anchor{5a16}@anchor{bugs reporting-bugs}@anchor{4f58}@anchor{bugs translation-repo}@anchor{5a17}
@chapter 버그 다루기


파이썬은 안정성에 대해 명성을 쌓아온 성숙한 프로그래밍 언어입니다. 이 평판을 유지하기 위해, 개발자는 파이썬에서 여러분이 발견한 결함을 알고 싶어 합니다.

It can be sometimes faster to fix bugs yourself and contribute patches to
Python as it streamlines the process and involves fewer people. Learn how to
@ref{5a18,,contribute}.

@menu
* 설명서 버그:: 
* 파이썬 문제 추적기 사용하기:: 
* 파이썬에 직접 이바지하기 입문:: 

@end menu

@node 설명서 버그,파이썬 문제 추적기 사용하기,,버그 다루기
@anchor{bugs documentation-bugs}@anchor{5a19}
@section 설명서 버그


If you find a bug in this documentation or would like to propose an improvement,
please submit a bug report on the @ref{556,,issue tracker}.  If you
have a suggestion on how to fix it, include that as well.

If the bug or suggested improvement concerns the translation of this
documentation, submit the report to the
translation’s repository@footnote{https://github.com/python/python-docs-ko} instead.

You can also open a discussion item on our
Documentation Discourse forum@footnote{https://discuss.python.org/c/documentation/26}.

If you find a bug in the theme (HTML / CSS / JavaScript) of the
documentation, please submit a bug report on the python-doc-theme issue tracker@footnote{https://github.com/python/python-docs-theme}.


@subsubheading 더 보기



@table @asis

@item 설명서 버그@footnote{https://github.com/python/cpython/issues?q=is%3Aissue+is%3Aopen+label%3Adocs}

파이썬 문제 추적기에 제출된 설명서 버그 목록.

@item 이슈 추적@footnote{https://devguide.python.org/tracker/}

추적기에 개선을 보고하는 것과 관련된 절차 개요.

@item 설명서에 도움 주기@footnote{https://devguide.python.org/docquality/#helping-with-documentation}

파이썬 설명서에 기여하는 데 관심이 있는 개인을 위한 종합 지침서.

@item 설명서 번역@footnote{https://devguide.python.org/documentation/translating/}

A list of GitHub pages for documentation translation and their primary contacts.
@end table


@node 파이썬 문제 추적기 사용하기,파이썬에 직접 이바지하기 입문,설명서 버그,버그 다루기
@anchor{bugs using-the-python-issue-tracker}@anchor{5a1a}@anchor{bugs using-the-tracker}@anchor{556}
@section 파이썬 문제 추적기 사용하기


파이썬 자체의 문제 보고서는 GitHub 문제 추적기(@indicateurl{https://github.com/python/cpython/issues})에 제출해야 합니다. GitHub 문제 추적기는 관련 정보를 입력하여 개발자에게 제출할 수 있는 웹 양식을 제공합니다.

보고서를 작성하는 첫 번째 단계는 문제가 이미 보고되었는지를 확인하는 것입니다. 개발자가 시간을 절약하는 것 외에도, 이렇게 하는 것의 이점은 문제를 해결하기 위해 수행된 작업을 배우게 되는 것입니다. 다음 배포에 포함될 이미 해결된 문제이거나, 추가 정보가 필요할 수 있습니다 (이 경우 가능하다면 직접 제공하는 것을 환영합니다!). 이렇게 하려면, 페이지 상단의 검색 상자를 사용하여 추적기를 검색해야 합니다.

보고하는 문제가 아직 목록에 없다면, GitHub 에 로그인해야 합니다. 아직 GitHub 계정이 없다면, “Sign up” 링크를 사용하여 계정을 만듭니다. 익명으로 버그 보고서를 제출할 수는 없습니다.

지금 로그인되어있다면, 문제를 제출할 수 있습니다. 상단 바에서 “New issue” 버튼을 클릭하여 새 문제를 보고해주세요.

The submission form has two fields, “Title” and “Comment”.

For the “Title” field, enter a `very' short description of the problem;
fewer than ten words is good.

“Comment” 입력란에, 문제를 자세히 설명하는데, 기대한 것과 실제로 일어난 것을 포함합니다. 확장 모듈이 개입하고 있는지, 그리고 사용 중인 하드웨어 및 소프트웨어 플랫폼 (적절한 버전 정보 포함)을 포함해야 합니다.

각 문제 보고서는 문제를 해결하기 위해 수행해야 할 작업을 결정하는 개발자가 검토합니다. 여러분은 문제에 액션이 취해질 때마다 업데이트를 받게 됩니다.


@subsubheading 더 보기



@table @asis

@item 버그를 효과적으로 보고하는 방법@footnote{https://www.chiark.greenend.org.uk/~sgtatham/bugs.html}

유용한 버그 보고서를 작성하는 방법에 대해 자세히 설명하는 기사. 이것은 어떤 종류의 정보가 유용하고 왜 유용한지를 설명합니다.

@item 버그 작성 지침@footnote{https://bugzilla.mozilla.org/page.cgi?id=bug-writing.html}

좋은 버그 리포트 작성에 관한 정보. 이 중 일부는 모질라(Mozilla) 프로젝트에만 적용되지만, 일반적인 우수 사례를 설명합니다.
@end table


@node 파이썬에 직접 이바지하기 입문,,파이썬 문제 추적기 사용하기,버그 다루기
@anchor{bugs contributing-to-python}@anchor{5a18}@anchor{bugs getting-started-contributing-to-python-yourself}@anchor{5a1b}
@section 파이썬에 직접 이바지하기 입문


발견한 버그를 보고하는 것 외에도, 패치를 제출하여 문제를 해결할 수 있습니다. 파이썬을 패치하는 방법에 대한 더 많은 정보는 Python Developer's Guide@footnote{https://devguide.python.org/} 에서 찾을 수 있습니다. 질문이 있으면, core-mentorship mailing list@footnote{https://mail.python.org/mailman3/lists/core-mentorship.python.org/} 는 파이썬에서 문제를 수정하는 과정에 관한 모든 질문에 대한 답변을 얻을 수 있는 친근한 곳입니다.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 저작권,역사와 라이센스,버그 다루기,Top
@anchor{copyright doc}@anchor{5a1c}@anchor{copyright copyright}@anchor{5a1d}@anchor{copyright translation-repo}@anchor{5a1e}
@chapter 저작권


파이썬과 이 설명서는:

Copyright © 2001 Python Software Foundation. All rights reserved.

Copyright © 2000 BeOpen.com. All rights reserved.

Copyright © 1995-2000 Corporation for National Research Initiatives. All rights
reserved.

Copyright © 1991-1995 Stichting Mathematisch Centrum. All rights reserved.


__________________________________________________________________


전체 라이센스 및 사용 권한 정보는 @ref{5a1f,,역사와 라이센스} 에서 제공합니다.

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node 역사와 라이센스,Python 모듈 목록,저작권,Top
@anchor{license doc}@anchor{5a20}@anchor{license history-and-license}@anchor{5a1f}@anchor{license id1}@anchor{5a21}@anchor{license translation-repo}@anchor{5a22}
@chapter 역사와 라이센스


@menu
* 소프트웨어의 역사:: 
* 파이썬에 액세스하거나 사용하기 위한 이용 약관:: 
* 포함된 소프트웨어에 대한 라이센스 및 승인:: 

@end menu

@node 소프트웨어의 역사,파이썬에 액세스하거나 사용하기 위한 이용 약관,,역사와 라이센스
@anchor{license history-of-the-software}@anchor{5a23}
@section 소프트웨어의 역사


Python was created in the early 1990s by Guido van Rossum at Stichting
Mathematisch Centrum (CWI, see @indicateurl{https://www.cwi.nl}) in the Netherlands as a
successor of a language called ABC.  Guido remains Python’s principal author,
although it includes many contributions from others.

In 1995, Guido continued his work on Python at the Corporation for National
Research Initiatives (CNRI, see @indicateurl{https://www.cnri.reston.va.us}) in Reston,
Virginia where he released several versions of the software.

In May 2000, Guido and the Python core development team moved to BeOpen.com to
form the BeOpen PythonLabs team.  In October of the same year, the PythonLabs
team moved to Digital Creations, which became
Zope Corporation.  In 2001, the Python Software Foundation (PSF, see
@indicateurl{https://www.python.org/psf/}) was formed, a non-profit organization created
specifically to own Python-related Intellectual Property.  Zope Corporation was a
sponsoring member of the PSF.

All Python releases are Open Source (see @indicateurl{https://opensource.org} for the Open
Source Definition). Historically, most, but not all, Python releases have also
been GPL-compatible; the table below summarizes the various releases.


@multitable {xxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxx} {xxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxx} 
@headitem

배포판

@tab

파생된 곳

@tab

해

@tab

소유자

@tab

GPL-compatible? (1)

@item

0.9.0 ~ 1.2

@tab

n/a

@tab

1991-1995

@tab

CWI

@tab

yes

@item

1.3 ~ 1.5.2

@tab

1.2

@tab

1995-1999

@tab

CNRI

@tab

yes

@item

1.6

@tab

1.5.2

@tab

2000

@tab

CNRI

@tab

no

@item

2.0

@tab

1.6

@tab

2000

@tab

BeOpen.com

@tab

no

@item

1.6.1

@tab

1.6

@tab

2001

@tab

CNRI

@tab

yes (2)

@item

2.1

@tab

2.0+1.6.1

@tab

2001

@tab

PSF

@tab

no

@item

2.0.1

@tab

2.0+1.6.1

@tab

2001

@tab

PSF

@tab

yes

@item

2.1.1

@tab

2.1+2.0.1

@tab

2001

@tab

PSF

@tab

yes

@item

2.1.2

@tab

2.1.1

@tab

2002

@tab

PSF

@tab

yes

@item

2.1.3

@tab

2.1.2

@tab

2002

@tab

PSF

@tab

yes

@item

2.2 이상

@tab

2.1.1

@tab

2001-현재

@tab

PSF

@tab

yes

@end multitable


@cartouche
@quotation 참고 

@enumerate 

@item 
GPL-compatible doesn’t mean that we’re distributing Python under the GPL.
All Python licenses, unlike the GPL, let you distribute a modified version
without making your changes open source. The GPL-compatible licenses make
it possible to combine Python with other software that is released under
the GPL; the others don’t.

@item 
According to Richard Stallman, 1.6.1 is not GPL-compatible, because its license
has a choice of law clause. According to CNRI, however, Stallman’s lawyer has
told CNRI’s lawyer that 1.6.1 is “not incompatible” with the GPL.
@end enumerate
@end quotation
@end cartouche

Guido의 지도하에 이 배포를 가능하게 만든 많은 외부 자원봉사자들에게 감사드립니다.

@node 파이썬에 액세스하거나 사용하기 위한 이용 약관,포함된 소프트웨어에 대한 라이센스 및 승인,소프트웨어의 역사,역사와 라이센스
@anchor{license terms-and-conditions-for-accessing-or-otherwise-using-python}@anchor{5a24}
@section 파이썬에 액세스하거나 사용하기 위한 이용 약관


Python software and documentation are licensed under the
Python Software Foundation License Version 2.

Starting with Python 3.8.6, examples, recipes, and other code in
the documentation are dual licensed under the PSF License Version 2
and the @ref{5a25,,Zero-Clause BSD license}.

파이썬에 통합된 일부 소프트웨어에는 다른 라이센스가 적용됩니다. 라이센스는 해당 라이센스에 해당하는 코드와 함께 나열됩니다. 이러한 라이센스의 불완전한 목록은 @ref{5a26,,포함된 소프트웨어에 대한 라이센스 및 승인}를 참조하십시오.

@menu
* PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2:: 
* BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0: BEOPEN COM LICENSE AGREEMENT FOR PYTHON 2 0. 
* CNRI LICENSE AGREEMENT FOR PYTHON 1.6.1: CNRI LICENSE AGREEMENT FOR PYTHON 1 6 1. 
* CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2: CWI LICENSE AGREEMENT FOR PYTHON 0 9 0 THROUGH 1 2. 
* ZERO-CLAUSE BSD LICENSE FOR CODE IN THE PYTHON DOCUMENTATION:: 

@end menu

@node PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2,BEOPEN COM LICENSE AGREEMENT FOR PYTHON 2 0,,파이썬에 액세스하거나 사용하기 위한 이용 약관
@anchor{license psf-license}@anchor{5a27}@anchor{license python-software-foundation-license-version-2}@anchor{5a28}
@subsection PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2


@example
1. This LICENSE AGREEMENT is between the Python Software Foundation ("PSF"), and
   the Individual or Organization ("Licensee") accessing and otherwise using this
   software ("Python") in source or binary form and its associated documentation.

2. Subject to the terms and conditions of this License Agreement, PSF hereby
   grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce,
   analyze, test, perform and/or display publicly, prepare derivative works,
   distribute, and otherwise use Python alone or in any derivative
   version, provided, however, that PSF's License Agreement and PSF's notice of
   copyright, i.e., "Copyright © 2001 Python Software Foundation; All Rights
   Reserved" are retained in Python alone or in any derivative version
   prepared by Licensee.

3. In the event Licensee prepares a derivative work that is based on or
   incorporates Python or any part thereof, and wants to make the
   derivative work available to others as provided herein, then Licensee hereby
   agrees to include in any such work a brief summary of the changes made to Python.

4. PSF is making Python available to Licensee on an "AS IS" basis.
   PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED.  BY WAY OF
   EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND DISCLAIMS ANY REPRESENTATION OR
   WARRANTY OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE
   USE OF PYTHON WILL NOT INFRINGE ANY THIRD PARTY RIGHTS.

5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
   FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS A RESULT OF
   MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON, OR ANY DERIVATIVE
   THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.

6. This License Agreement will automatically terminate upon a material breach of
   its terms and conditions.

7. Nothing in this License Agreement shall be deemed to create any relationship
   of agency, partnership, or joint venture between PSF and Licensee.  This License
   Agreement does not grant permission to use PSF trademarks or trade name in a
   trademark sense to endorse or promote products or services of Licensee, or any
   third party.

8. By copying, installing or otherwise using Python, Licensee agrees
   to be bound by the terms and conditions of this License Agreement.
@end example

@node BEOPEN COM LICENSE AGREEMENT FOR PYTHON 2 0,CNRI LICENSE AGREEMENT FOR PYTHON 1 6 1,PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2,파이썬에 액세스하거나 사용하기 위한 이용 약관
@anchor{license beopen-com-license-agreement-for-python-2-0}@anchor{5a29}
@subsection BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0


BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1

@example
1. This LICENSE AGREEMENT is between BeOpen.com ("BeOpen"), having an office at
   160 Saratoga Avenue, Santa Clara, CA 95051, and the Individual or Organization
   ("Licensee") accessing and otherwise using this software in source or binary
   form and its associated documentation ("the Software").

2. Subject to the terms and conditions of this BeOpen Python License Agreement,
   BeOpen hereby grants Licensee a non-exclusive, royalty-free, world-wide license
   to reproduce, analyze, test, perform and/or display publicly, prepare derivative
   works, distribute, and otherwise use the Software alone or in any derivative
   version, provided, however, that the BeOpen Python License is retained in the
   Software, alone or in any derivative version prepared by Licensee.

3. BeOpen is making the Software available to Licensee on an "AS IS" basis.
   BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED.  BY WAY OF
   EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND DISCLAIMS ANY REPRESENTATION OR
   WARRANTY OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE
   USE OF THE SOFTWARE WILL NOT INFRINGE ANY THIRD PARTY RIGHTS.

4. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE SOFTWARE FOR
   ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS A RESULT OF USING,
   MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY DERIVATIVE THEREOF, EVEN IF
   ADVISED OF THE POSSIBILITY THEREOF.

5. This License Agreement will automatically terminate upon a material breach of
   its terms and conditions.

6. This License Agreement shall be governed by and interpreted in all respects
   by the law of the State of California, excluding conflict of law provisions.
   Nothing in this License Agreement shall be deemed to create any relationship of
   agency, partnership, or joint venture between BeOpen and Licensee.  This License
   Agreement does not grant permission to use BeOpen trademarks or trade names in a
   trademark sense to endorse or promote products or services of Licensee, or any
   third party.  As an exception, the "BeOpen Python" logos available at
   @indicateurl{http://www.pythonlabs.com/logos.html} may be used according to the permissions
   granted on that web page.

7. By copying, installing or otherwise using the software, Licensee agrees to be
   bound by the terms and conditions of this License Agreement.
@end example

@node CNRI LICENSE AGREEMENT FOR PYTHON 1 6 1,CWI LICENSE AGREEMENT FOR PYTHON 0 9 0 THROUGH 1 2,BEOPEN COM LICENSE AGREEMENT FOR PYTHON 2 0,파이썬에 액세스하거나 사용하기 위한 이용 약관
@anchor{license cnri-license-agreement-for-python-1-6-1}@anchor{5a2a}
@subsection CNRI LICENSE AGREEMENT FOR PYTHON 1.6.1


@example
1. This LICENSE AGREEMENT is between the Corporation for National Research
   Initiatives, having an office at 1895 Preston White Drive, Reston, VA 20191
   ("CNRI"), and the Individual or Organization ("Licensee") accessing and
   otherwise using Python 1.6.1 software in source or binary form and its
   associated documentation.

2. Subject to the terms and conditions of this License Agreement, CNRI hereby
   grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce,
   analyze, test, perform and/or display publicly, prepare derivative works,
   distribute, and otherwise use Python 1.6.1 alone or in any derivative version,
   provided, however, that CNRI's License Agreement and CNRI's notice of copyright,
   i.e., "Copyright © 1995-2001 Corporation for National Research Initiatives; All
   Rights Reserved" are retained in Python 1.6.1 alone or in any derivative version
   prepared by Licensee.  Alternately, in lieu of CNRI's License Agreement,
   Licensee may substitute the following text (omitting the quotes): "Python 1.6.1
   is made available subject to the terms and conditions in CNRI's License
   Agreement.  This Agreement together with Python 1.6.1 may be located on the
   internet using the following unique, persistent identifier (known as a handle):
   1895.22/1013.  This Agreement may also be obtained from a proxy server on the
   internet using the following URL: @indicateurl{http://hdl.handle.net/1895.22/1013}".

3. In the event Licensee prepares a derivative work that is based on or
   incorporates Python 1.6.1 or any part thereof, and wants to make the derivative
   work available to others as provided herein, then Licensee hereby agrees to
   include in any such work a brief summary of the changes made to Python 1.6.1.

4. CNRI is making Python 1.6.1 available to Licensee on an "AS IS" basis.  CNRI
   MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED.  BY WAY OF EXAMPLE,
   BUT NOT LIMITATION, CNRI MAKES NO AND DISCLAIMS ANY REPRESENTATION OR WARRANTY
   OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF
   PYTHON 1.6.1 WILL NOT INFRINGE ANY THIRD PARTY RIGHTS.

5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON 1.6.1 FOR
   ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS A RESULT OF
   MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6.1, OR ANY DERIVATIVE
   THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.

6. This License Agreement will automatically terminate upon a material breach of
   its terms and conditions.

7. This License Agreement shall be governed by the federal intellectual property
   law of the United States, including without limitation the federal copyright
   law, and, to the extent such U.S. federal law does not apply, by the law of the
   Commonwealth of Virginia, excluding Virginia's conflict of law provisions.
   Notwithstanding the foregoing, with regard to derivative works based on Python
   1.6.1 that incorporate non-separable material that was previously distributed
   under the GNU General Public License (GPL), the law of the Commonwealth of
   Virginia shall govern this License Agreement only as to issues arising under or
   with respect to Paragraphs 4, 5, and 7 of this License Agreement.  Nothing in
   this License Agreement shall be deemed to create any relationship of agency,
   partnership, or joint venture between CNRI and Licensee.  This License Agreement
   does not grant permission to use CNRI trademarks or trade name in a trademark
   sense to endorse or promote products or services of Licensee, or any third
   party.

8. By clicking on the "ACCEPT" button where indicated, or by copying, installing
   or otherwise using Python 1.6.1, Licensee agrees to be bound by the terms and
   conditions of this License Agreement.
@end example

@node CWI LICENSE AGREEMENT FOR PYTHON 0 9 0 THROUGH 1 2,ZERO-CLAUSE BSD LICENSE FOR CODE IN THE PYTHON DOCUMENTATION,CNRI LICENSE AGREEMENT FOR PYTHON 1 6 1,파이썬에 액세스하거나 사용하기 위한 이용 약관
@anchor{license cwi-license-agreement-for-python-0-9-0-through-1-2}@anchor{5a2b}
@subsection CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2


@example
Copyright © 1991 - 1995, Stichting Mathematisch Centrum Amsterdam, The
Netherlands.  All rights reserved.

Permission to use, copy, modify, and distribute this software and its
documentation for any purpose and without fee is hereby granted, provided that
the above copyright notice appear in all copies and that both that copyright
notice and this permission notice appear in supporting documentation, and that
the name of Stichting Mathematisch Centrum or CWI not be used in advertising or
publicity pertaining to distribution of the software without specific, written
prior permission.

STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE FOR ANY SPECIAL, INDIRECT
OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
SOFTWARE.
@end example

@node ZERO-CLAUSE BSD LICENSE FOR CODE IN THE PYTHON DOCUMENTATION,,CWI LICENSE AGREEMENT FOR PYTHON 0 9 0 THROUGH 1 2,파이썬에 액세스하거나 사용하기 위한 이용 약관
@anchor{license bsd0}@anchor{5a25}@anchor{license zero-clause-bsd-license-for-code-in-the-python-documentation}@anchor{5a2c}
@subsection ZERO-CLAUSE BSD LICENSE FOR CODE IN THE PYTHON DOCUMENTATION


@example
Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
@end example

@node 포함된 소프트웨어에 대한 라이센스 및 승인,,파이썬에 액세스하거나 사용하기 위한 이용 약관,역사와 라이센스
@anchor{license licenses-and-acknowledgements-for-incorporated-software}@anchor{5a2d}@anchor{license otherlicenses}@anchor{5a26}
@section 포함된 소프트웨어에 대한 라이센스 및 승인


이 섹션은 파이썬 배포판에 포함된 제삼자 소프트웨어에 대한 불완전하지만 늘어나고 있는 라이센스와 승인의 목록입니다.

@menu
* 메르센 트위스터:: 
* 소켓: 소켓<2>. 
* 비동기 소켓 서비스:: 
* 쿠키 관리:: 
* 실행 추적:: 
* UUencode 및 UUdecode 함수:: 
* XML 원격 프로시저 호출:: 
* test_epoll:: 
* Select kqueue:: 
* SipHash24:: 
* strtod 와 dtoa:: 
* OpenSSL: OpenSSL<2>. 
* expat:: 
* libffi:: 
* zlib: zlib<4>. 
* cfuhash:: 
* libmpdec:: 
* W3C C14N 테스트 스위트:: 
* mimalloc:: 
* asyncio: asyncio<15>. 
* Global Unbounded Sequences (GUS): Global Unbounded Sequences GUS. 
* Zstandard bindings:: 

@end menu

@node 메르센 트위스터,소켓<2>,,포함된 소프트웨어에 대한 라이센스 및 승인
@anchor{license mersenne-twister}@anchor{5a2e}
@subsection 메르센 트위스터


The @code{_random} C extension underlying the @ref{bd,,random} module
includes code based on a download from
@indicateurl{http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/MT2002/emt19937ar.html}. The following are
the verbatim comments from the original code:

@example
A C-program for MT19937, with initialization improved 2002/1/26.
Coded by Takuji Nishimura and Makoto Matsumoto.

Before using, initialize the state by using init_genrand(seed)
or init_by_array(init_key, key_length).

Copyright (C) 1997 - 2002, Makoto Matsumoto and Takuji Nishimura,
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:

 1. Redistributions of source code must retain the above copyright
    notice, this list of conditions and the following disclaimer.

 2. Redistributions in binary form must reproduce the above copyright
    notice, this list of conditions and the following disclaimer in the
    documentation and/or other materials provided with the distribution.

 3. The names of its contributors may not be used to endorse or promote
    products derived from this software without specific prior written
    permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.


Any feedback is very welcome.
http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html
email: m-mat @@ math.sci.hiroshima-u.ac.jp (remove space)
@end example

@node 소켓<2>,비동기 소켓 서비스,메르센 트위스터,포함된 소프트웨어에 대한 라이센스 및 승인
@anchor{license sockets}@anchor{5a2f}
@subsection 소켓


The @ref{d1,,socket} module uses the functions, @code{getaddrinfo()}, and
@code{getnameinfo()}, which are coded in separate source files from the WIDE
Project, @indicateurl{https://www.wide.ad.jp/}.

@example
Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
   notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
   notice, this list of conditions and the following disclaimer in the
   documentation and/or other materials provided with the distribution.
3. Neither the name of the project nor the names of its contributors
   may be used to endorse or promote products derived from this software
   without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
SUCH DAMAGE.
@end example

@node 비동기 소켓 서비스,쿠키 관리,소켓<2>,포함된 소프트웨어에 대한 라이센스 및 승인
@anchor{license asynchronous-socket-services}@anchor{5a30}
@subsection 비동기 소켓 서비스


The @code{test.support.asynchat} and @code{test.support.asyncore}
modules contain the following notice:

@example
Copyright 1996 by Sam Rushing

                        All Rights Reserved

Permission to use, copy, modify, and distribute this software and
its documentation for any purpose and without fee is hereby
granted, provided that the above copyright notice appear in all
copies and that both that copyright notice and this permission
notice appear in supporting documentation, and that the name of Sam
Rushing not be used in advertising or publicity pertaining to
distribution of the software without specific, written prior
permission.

SAM RUSHING DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN
NO EVENT SHALL SAM RUSHING BE LIABLE FOR ANY SPECIAL, INDIRECT OR
CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
@end example

@node 쿠키 관리,실행 추적,비동기 소켓 서비스,포함된 소프트웨어에 대한 라이센스 및 승인
@anchor{license cookie-management}@anchor{5a31}
@subsection 쿠키 관리


@ref{75,,http.cookies} 모듈은 다음과 같은 주의 사항을 포함합니다:

@example
Copyright 2000 by Timothy O'Malley <timo@@alum.mit.edu>

               All Rights Reserved

Permission to use, copy, modify, and distribute this software
and its documentation for any purpose and without fee is hereby
granted, provided that the above copyright notice appear in all
copies and that both that copyright notice and this permission
notice appear in supporting documentation, and that the name of
Timothy O'Malley  not be used in advertising or publicity
pertaining to distribution of the software without specific, written
prior permission.

Timothy O'Malley DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS, IN NO EVENT SHALL Timothy O'Malley BE LIABLE FOR
ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
@end example

@node 실행 추적,UUencode 및 UUdecode 함수,쿠키 관리,포함된 소프트웨어에 대한 라이센스 및 승인
@anchor{license execution-tracing}@anchor{5a32}
@subsection 실행 추적


@ref{103,,trace} 모듈은 다음과 같은 주의 사항을 포함합니다:

@example
portions copyright 2001, Autonomous Zones Industries, Inc., all rights...
err...  reserved and offered to the public under the terms of the
Python 2.2 license.
Author: Zooko O'Whielacronx
http://zooko.com/
mailto:zooko@@zooko.com

Copyright 2000, Mojam Media, Inc., all rights reserved.
Author: Skip Montanaro

Copyright 1999, Bioreason, Inc., all rights reserved.
Author: Andrew Dalke

Copyright 1995-1997, Automatrix, Inc., all rights reserved.
Author: Skip Montanaro

Copyright 1991-1995, Stichting Mathematisch Centrum, all rights reserved.


Permission to use, copy, modify, and distribute this Python software and
its associated documentation for any purpose without fee is hereby
granted, provided that the above copyright notice appears in all copies,
and that both that copyright notice and this permission notice appear in
supporting documentation, and that the name of neither Automatrix,
Bioreason or Mojam Media be used in advertising or publicity pertaining to
distribution of the software without specific, written prior permission.
@end example

@node UUencode 및 UUdecode 함수,XML 원격 프로시저 호출,실행 추적,포함된 소프트웨어에 대한 라이센스 및 승인
@anchor{license uuencode-and-uudecode-functions}@anchor{5a33}
@subsection UUencode 및 UUdecode 함수


The @code{uu} codec contains the following notice:

@example
Copyright 1994 by Lance Ellinghouse
Cathedral City, California Republic, United States of America.
                       All Rights Reserved
Permission to use, copy, modify, and distribute this software and its
documentation for any purpose and without fee is hereby granted,
provided that the above copyright notice appear in all copies and that
both that copyright notice and this permission notice appear in
supporting documentation, and that the name of Lance Ellinghouse
not be used in advertising or publicity pertaining to distribution
of the software without specific, written prior permission.
LANCE ELLINGHOUSE DISCLAIMS ALL WARRANTIES WITH REGARD TO
THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS, IN NO EVENT SHALL LANCE ELLINGHOUSE CENTRUM BE LIABLE
FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

Modified by Jack Jansen, CWI, July 1995:
- Use binascii module to do the actual line-by-line conversion
  between ascii and binary. This results in a 1000-fold speedup. The C
  version is still 5 times faster, though.
- Arguments more compliant with Python standard
@end example

@node XML 원격 프로시저 호출,test_epoll,UUencode 및 UUdecode 함수,포함된 소프트웨어에 대한 라이센스 및 승인
@anchor{license xml-remote-procedure-calls}@anchor{5a34}
@subsection XML 원격 프로시저 호출


@ref{134,,xmlrpc.client} 모듈은 다음과 같은 주의 사항을 포함합니다:

@example
    The XML-RPC client interface is

Copyright (c) 1999-2002 by Secret Labs AB
Copyright (c) 1999-2002 by Fredrik Lundh

By obtaining, using, and/or copying this software and/or its
associated documentation, you agree that you have read, understood,
and will comply with the following terms and conditions:

Permission to use, copy, modify, and distribute this software and
its associated documentation for any purpose and without fee is
hereby granted, provided that the above copyright notice appears in
all copies, and that both that copyright notice and this permission
notice appear in supporting documentation, and that the name of
Secret Labs AB or the author not be used in advertising or publicity
pertaining to distribution of the software without specific, written
prior permission.

SECRET LABS AB AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD
TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT-
ABILITY AND FITNESS.  IN NO EVENT SHALL SECRET LABS AB OR THE AUTHOR
BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY
DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
OF THIS SOFTWARE.
@end example

@node test_epoll,Select kqueue,XML 원격 프로시저 호출,포함된 소프트웨어에 대한 라이센스 및 승인
@anchor{license test-epoll}@anchor{5a35}
@subsection test_epoll


The @code{test.test_epoll} module contains the following notice:

@example
Copyright (c) 2001-2006 Twisted Matrix Laboratories.

Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@end example

@node Select kqueue,SipHash24,test_epoll,포함된 소프트웨어에 대한 라이센스 및 승인
@anchor{license select-kqueue}@anchor{5a36}
@subsection Select kqueue


@ref{c6,,select} 모듈은 kqueue 인터페이스에 대해 다음과 같은 주의 사항을 포함합니다:

@example
Copyright (c) 2000 Doug White, 2006 James Knight, 2007 Christian Heimes
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
   notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
   notice, this list of conditions and the following disclaimer in the
   documentation and/or other materials provided with the distribution.

THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
SUCH DAMAGE.
@end example

@node SipHash24,strtod 와 dtoa,Select kqueue,포함된 소프트웨어에 대한 라이센스 및 승인
@anchor{license siphash24}@anchor{5a37}
@subsection SipHash24


파일 @code{Python/pyhash.c} 에는 Dan Bernstein의 SipHash24 알고리즘의 Marek Majkowski의 구현이 포함되어 있습니다. 여기에는 다음과 같은 내용이 포함되어 있습니다:

@example
<MIT License>
Copyright (c) 2013  Marek Majkowski <marek@@popcount.org>

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
</MIT License>

Original location:
   https://github.com/majek/csiphash/

Solution inspired by code from:
   Samuel Neves (supercop/crypto_auth/siphash24/little)
   djb (supercop/crypto_auth/siphash24/little2)
   Jean-Philippe Aumasson (https://131002.net/siphash/siphash24.c)
@end example

@node strtod 와 dtoa,OpenSSL<2>,SipHash24,포함된 소프트웨어에 대한 라이센스 및 승인
@anchor{license strtod-and-dtoa}@anchor{5a38}
@subsection strtod 와 dtoa


The file @code{Python/dtoa.c}, which supplies C functions dtoa and
strtod for conversion of C doubles to and from strings, is derived
from the file of the same name by David M. Gay, currently available
from @indicateurl{https://web.archive.org/web/20220517033456/http://www.netlib.org/fp/dtoa.c}.
The original file, as retrieved on March 16, 2009, contains the following
copyright and licensing notice:

@example
/****************************************************************
 *
 * The author of this software is David M. Gay.
 *
 * Copyright (c) 1991, 2000, 2001 by Lucent Technologies.
 *
 * Permission to use, copy, modify, and distribute this software for any
 * purpose without fee is hereby granted, provided that this entire notice
 * is included in all copies of any software which is or includes a copy
 * or modification of this software and in all copies of the supporting
 * documentation for such software.
 *
 * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
 * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHOR NOR LUCENT MAKES ANY
 * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
 * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
 *
 ***************************************************************/
@end example

@node OpenSSL<2>,expat,strtod 와 dtoa,포함된 소프트웨어에 대한 라이센스 및 승인
@anchor{license openssl}@anchor{5a39}
@subsection OpenSSL


The modules @ref{6c,,hashlib}, @ref{b2,,posix} and @ref{d5,,ssl} use
the OpenSSL library for added performance if made available by the
operating system. Additionally, the Windows and macOS installers for
Python may include a copy of the OpenSSL libraries, so we include a copy
of the OpenSSL license here. For the OpenSSL 3.0 release,
and later releases derived from that, the Apache License v2 applies:

@example
                              Apache License
                        Version 2.0, January 2004
                     https://www.apache.org/licenses/

TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

1. Definitions.

   "License" shall mean the terms and conditions for use, reproduction,
   and distribution as defined by Sections 1 through 9 of this document.

   "Licensor" shall mean the copyright owner or entity authorized by
   the copyright owner that is granting the License.

   "Legal Entity" shall mean the union of the acting entity and all
   other entities that control, are controlled by, or are under common
   control with that entity. For the purposes of this definition,
   "control" means (i) the power, direct or indirect, to cause the
   direction or management of such entity, whether by contract or
   otherwise, or (ii) ownership of fifty percent (50%) or more of the
   outstanding shares, or (iii) beneficial ownership of such entity.

   "You" (or "Your") shall mean an individual or Legal Entity
   exercising permissions granted by this License.

   "Source" form shall mean the preferred form for making modifications,
   including but not limited to software source code, documentation
   source, and configuration files.

   "Object" form shall mean any form resulting from mechanical
   transformation or translation of a Source form, including but
   not limited to compiled object code, generated documentation,
   and conversions to other media types.

   "Work" shall mean the work of authorship, whether in Source or
   Object form, made available under the License, as indicated by a
   copyright notice that is included in or attached to the work
   (an example is provided in the Appendix below).

   "Derivative Works" shall mean any work, whether in Source or Object
   form, that is based on (or derived from) the Work and for which the
   editorial revisions, annotations, elaborations, or other modifications
   represent, as a whole, an original work of authorship. For the purposes
   of this License, Derivative Works shall not include works that remain
   separable from, or merely link (or bind by name) to the interfaces of,
   the Work and Derivative Works thereof.

   "Contribution" shall mean any work of authorship, including
   the original version of the Work and any modifications or additions
   to that Work or Derivative Works thereof, that is intentionally
   submitted to Licensor for inclusion in the Work by the copyright owner
   or by an individual or Legal Entity authorized to submit on behalf of
   the copyright owner. For the purposes of this definition, "submitted"
   means any form of electronic, verbal, or written communication sent
   to the Licensor or its representatives, including but not limited to
   communication on electronic mailing lists, source code control systems,
   and issue tracking systems that are managed by, or on behalf of, the
   Licensor for the purpose of discussing and improving the Work, but
   excluding communication that is conspicuously marked or otherwise
   designated in writing by the copyright owner as "Not a Contribution."

   "Contributor" shall mean Licensor and any individual or Legal Entity
   on behalf of whom a Contribution has been received by Licensor and
   subsequently incorporated within the Work.

2. Grant of Copyright License. Subject to the terms and conditions of
   this License, each Contributor hereby grants to You a perpetual,
   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
   copyright license to reproduce, prepare Derivative Works of,
   publicly display, publicly perform, sublicense, and distribute the
   Work and such Derivative Works in Source or Object form.

3. Grant of Patent License. Subject to the terms and conditions of
   this License, each Contributor hereby grants to You a perpetual,
   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
   (except as stated in this section) patent license to make, have made,
   use, offer to sell, sell, import, and otherwise transfer the Work,
   where such license applies only to those patent claims licensable
   by such Contributor that are necessarily infringed by their
   Contribution(s) alone or by combination of their Contribution(s)
   with the Work to which such Contribution(s) was submitted. If You
   institute patent litigation against any entity (including a
   cross-claim or counterclaim in a lawsuit) alleging that the Work
   or a Contribution incorporated within the Work constitutes direct
   or contributory patent infringement, then any patent licenses
   granted to You under this License for that Work shall terminate
   as of the date such litigation is filed.

4. Redistribution. You may reproduce and distribute copies of the
   Work or Derivative Works thereof in any medium, with or without
   modifications, and in Source or Object form, provided that You
   meet the following conditions:

   (a) You must give any other recipients of the Work or
       Derivative Works a copy of this License; and

   (b) You must cause any modified files to carry prominent notices
       stating that You changed the files; and

   (c) You must retain, in the Source form of any Derivative Works
       that You distribute, all copyright, patent, trademark, and
       attribution notices from the Source form of the Work,
       excluding those notices that do not pertain to any part of
       the Derivative Works; and

   (d) If the Work includes a "NOTICE" text file as part of its
       distribution, then any Derivative Works that You distribute must
       include a readable copy of the attribution notices contained
       within such NOTICE file, excluding those notices that do not
       pertain to any part of the Derivative Works, in at least one
       of the following places: within a NOTICE text file distributed
       as part of the Derivative Works; within the Source form or
       documentation, if provided along with the Derivative Works; or,
       within a display generated by the Derivative Works, if and
       wherever such third-party notices normally appear. The contents
       of the NOTICE file are for informational purposes only and
       do not modify the License. You may add Your own attribution
       notices within Derivative Works that You distribute, alongside
       or as an addendum to the NOTICE text from the Work, provided
       that such additional attribution notices cannot be construed
       as modifying the License.

   You may add Your own copyright statement to Your modifications and
   may provide additional or different license terms and conditions
   for use, reproduction, or distribution of Your modifications, or
   for any such Derivative Works as a whole, provided Your use,
   reproduction, and distribution of the Work otherwise complies with
   the conditions stated in this License.

5. Submission of Contributions. Unless You explicitly state otherwise,
   any Contribution intentionally submitted for inclusion in the Work
   by You to the Licensor shall be under the terms and conditions of
   this License, without any additional terms or conditions.
   Notwithstanding the above, nothing herein shall supersede or modify
   the terms of any separate license agreement you may have executed
   with Licensor regarding such Contributions.

6. Trademarks. This License does not grant permission to use the trade
   names, trademarks, service marks, or product names of the Licensor,
   except as required for reasonable and customary use in describing the
   origin of the Work and reproducing the content of the NOTICE file.

7. Disclaimer of Warranty. Unless required by applicable law or
   agreed to in writing, Licensor provides the Work (and each
   Contributor provides its Contributions) on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
   implied, including, without limitation, any warranties or conditions
   of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
   PARTICULAR PURPOSE. You are solely responsible for determining the
   appropriateness of using or redistributing the Work and assume any
   risks associated with Your exercise of permissions under this License.

8. Limitation of Liability. In no event and under no legal theory,
   whether in tort (including negligence), contract, or otherwise,
   unless required by applicable law (such as deliberate and grossly
   negligent acts) or agreed to in writing, shall any Contributor be
   liable to You for damages, including any direct, indirect, special,
   incidental, or consequential damages of any character arising as a
   result of this License or out of the use or inability to use the
   Work (including but not limited to damages for loss of goodwill,
   work stoppage, computer failure or malfunction, or any and all
   other commercial damages or losses), even if such Contributor
   has been advised of the possibility of such damages.

9. Accepting Warranty or Additional Liability. While redistributing
   the Work or Derivative Works thereof, You may choose to offer,
   and charge a fee for, acceptance of support, warranty, indemnity,
   or other liability obligations and/or rights consistent with this
   License. However, in accepting such obligations, You may act only
   on Your own behalf and on Your sole responsibility, not on behalf
   of any other Contributor, and only if You agree to indemnify,
   defend, and hold each Contributor harmless for any liability
   incurred by, or claims asserted against, such Contributor by reason
   of your accepting any such warranty or additional liability.

END OF TERMS AND CONDITIONS
@end example

@node expat,libffi,OpenSSL<2>,포함된 소프트웨어에 대한 라이센스 및 승인
@anchor{license expat}@anchor{5a3a}
@subsection expat


The @ref{12c,,pyexpat} extension is built using an included copy of the expat
sources unless the build is configured @code{--with-system-expat}:

@example
Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd
                               and Clark Cooper

Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@end example

@node libffi,zlib<4>,expat,포함된 소프트웨어에 대한 라이센스 및 승인
@anchor{license libffi}@anchor{5a3b}
@subsection libffi


The @code{_ctypes} C extension underlying the @ref{2e,,ctypes} module
is built using an included copy of the libffi
sources unless the build is configured @code{--with-system-libffi}:

@example
Copyright (c) 1996-2008  Red Hat, Inc and others.

Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.
@end example

@node zlib<4>,cfuhash,libffi,포함된 소프트웨어에 대한 라이센스 및 승인
@anchor{license zlib}@anchor{5a3c}
@subsection zlib


@ref{139,,zlib} 확장은 시스템에서 발견된 zlib 버전이 너무 오래되어서 빌드에 사용될 수 없으면, 포함된 zlib 소스 사본을 사용하여 빌드됩니다:

@example
Copyright (C) 1995-2011 Jean-loup Gailly and Mark Adler

This software is provided 'as-is', without any express or implied
warranty.  In no event will the authors be held liable for any damages
arising from the use of this software.

Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:

1. The origin of this software must not be misrepresented; you must not
   claim that you wrote the original software. If you use this software
   in a product, an acknowledgment in the product documentation would be
   appreciated but is not required.

2. Altered source versions must be plainly marked as such, and must not be
   misrepresented as being the original software.

3. This notice may not be removed or altered from any source distribution.

Jean-loup Gailly        Mark Adler
jloup@@gzip.org          madler@@alumni.caltech.edu
@end example

@node cfuhash,libmpdec,zlib<4>,포함된 소프트웨어에 대한 라이센스 및 승인
@anchor{license cfuhash}@anchor{5a3d}
@subsection cfuhash


@ref{105,,tracemalloc} 에 의해 사용되는 해시 테이블의 구현은 cfuhash 프로젝트를 기반으로 합니다:

@example
Copyright (c) 2005 Don Owens
All rights reserved.

This code is released under the BSD license:

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:

  * Redistributions of source code must retain the above copyright
    notice, this list of conditions and the following disclaimer.

  * Redistributions in binary form must reproduce the above
    copyright notice, this list of conditions and the following
    disclaimer in the documentation and/or other materials provided
    with the distribution.

  * Neither the name of the author nor the names of its
    contributors may be used to endorse or promote products derived
    from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
OF THE POSSIBILITY OF SUCH DAMAGE.
@end example

@node libmpdec,W3C C14N 테스트 스위트,cfuhash,포함된 소프트웨어에 대한 라이센스 및 승인
@anchor{license libmpdec}@anchor{5a3e}
@subsection libmpdec


The @code{_decimal} C extension underlying the @ref{3a,,decimal} module
is built using an included copy of the libmpdec
library unless the build is configured @code{--with-system-libmpdec}:

@example
Copyright (c) 2008-2020 Stefan Krah. All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:

1. Redistributions of source code must retain the above copyright
   notice, this list of conditions and the following disclaimer.

2. Redistributions in binary form must reproduce the above copyright
   notice, this list of conditions and the following disclaimer in the
   documentation and/or other materials provided with the distribution.

THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
SUCH DAMAGE.
@end example

@node W3C C14N 테스트 스위트,mimalloc,libmpdec,포함된 소프트웨어에 대한 라이센스 및 승인
@anchor{license w3c-c14n-test-suite}@anchor{5a3f}
@subsection W3C C14N 테스트 스위트


The C14N 2.0 test suite in the @ref{e8,,test} package
(@code{Lib/test/xmltestdata/c14n-20/}) was retrieved from the W3C website at
@indicateurl{https://www.w3.org/TR/xml-c14n2-testcases/} and is distributed under the
3-clause BSD license:

@example
Copyright (c) 2013 W3C(R) (MIT, ERCIM, Keio, Beihang),
All Rights Reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:

* Redistributions of works must retain the original copyright notice,
  this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the original copyright
  notice, this list of conditions and the following disclaimer in the
  documentation and/or other materials provided with the distribution.
* Neither the name of the W3C nor the names of its contributors may be
  used to endorse or promote products derived from this work without
  specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@end example

@node mimalloc,asyncio<15>,W3C C14N 테스트 스위트,포함된 소프트웨어에 대한 라이센스 및 승인
@anchor{license mimalloc}@anchor{5a40}@anchor{license mimalloc-license}@anchor{654}
@subsection mimalloc


MIT License:

@example
Copyright (c) 2018-2021 Microsoft Corporation, Daan Leijen

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
@end example

@node asyncio<15>,Global Unbounded Sequences GUS,mimalloc,포함된 소프트웨어에 대한 라이센스 및 승인
@anchor{license asyncio}@anchor{5a41}
@subsection asyncio


Parts of the @ref{b,,asyncio} module are incorporated from
uvloop 0.16@footnote{https://github.com/MagicStack/uvloop/tree/v0.16.0},
which is distributed under the MIT license:

@example
Copyright (c) 2015-2021 MagicStack Inc.  http://magic.io

Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@end example

@node Global Unbounded Sequences GUS,Zstandard bindings,asyncio<15>,포함된 소프트웨어에 대한 라이센스 및 승인
@anchor{license global-unbounded-sequences-gus}@anchor{5a42}
@subsection Global Unbounded Sequences (GUS)


The file @code{Python/qsbr.c} is adapted from FreeBSD’s “Global Unbounded
Sequences” safe memory reclamation scheme in
subr_smr.c@footnote{https://github.com/freebsd/freebsd-src/blob/main/sys/kern/subr_smr.c}.
The file is distributed under the 2-Clause BSD License:

@example
Copyright (c) 2019,2020 Jeffrey Roberson <jeff@@FreeBSD.org>

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
   notice unmodified, this list of conditions, and the following
   disclaimer.
2. Redistributions in binary form must reproduce the above copyright
   notice, this list of conditions and the following disclaimer in the
   documentation and/or other materials provided with the distribution.

THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@end example

@node Zstandard bindings,,Global Unbounded Sequences GUS,포함된 소프트웨어에 대한 라이센스 및 승인
@anchor{license zstandard-bindings}@anchor{5a43}
@subsection Zstandard bindings


Zstandard bindings in @code{Modules/_zstd} and @code{Lib/compression/zstd}
are based on code from the
pyzstd library@footnote{https://github.com/Rogdham/pyzstd/}, copyright Ma Lin and
contributors. The pyzstd code is distributed under the 3-Clause BSD License:

@example
Copyright (c) 2020-present, Ma Lin and contributors.
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:

1. Redistributions of source code must retain the above copyright notice, this
   list of conditions and the following disclaimer.

2. Redistributions in binary form must reproduce the above copyright notice,
   this list of conditions and the following disclaimer in the documentation
   and/or other materials provided with the distribution.

3. Neither the name of the copyright holder nor the names of its
   contributors may be used to endorse or promote products derived from
   this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@end example

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@c Apparently this how you hack together a formatted link:
@c (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text)

@node Python 모듈 목록,색인,역사와 라이센스,Top
@unnumbered Python 모듈 목록


@menu
* __future__: 0. Future statement definitions
* __main__: 1. The environment where top-level code is run. Covers
                        command-line interfaces@comma{} import-time
                        behavior@comma{} and `@w{`}__name__ ==
                        '__main__'`@w{`}.
* _thread: 2. Low-level threading API.
* _tkinter: 3. A binary module that contains the low-level interface
                        to Tcl/Tk.
* abc: 4. Abstract base classes according to :pep:`3119`.
* aifc: 5. Removed in 3.13.
* annotationlib: 6. Functionality for introspecting annotations
* argparse: 7. Command-line option and argument parsing library.
* array: 8. Space efficient arrays of uniformly typed numeric
                        values.
* ast: 9. Abstract Syntax Tree classes and manipulation.
* asynchat: a. Removed in 3.12.
* asyncio: b. Asynchronous I/O.
* asyncore: c. Removed in 3.12.
* atexit: d. Register and execute cleanup functions.
* audioop: e. Removed in 3.13.
* base64: f. RFC 4648: Base16@comma{} Base32@comma{} Base64 Data
                        Encodings; Base85 and Ascii85
* bdb: 10. Debugger framework.
* binascii: 11. Tools for converting between binary and various ASCII-
                        encoded binary representations.
* bisect: 12. Array bisection algorithms for binary searching.
* builtins: 13. The module that provides the built-in namespace.
* bz2: 14. Interfaces for bzip2 compression and decompression.
* calendar: 15. Functions for working with calendars@comma{} including
                        some emulation of the Unix cal program.
* cgi: 16. Removed in 3.13.
* cgitb: 17. Removed in 3.13.
* chunk: 18. Removed in 3.13.
* cmath: 19. Mathematical functions for complex numbers.
* cmd: 1a. Build line-oriented command interpreters.
* code: 1b. Facilities to implement read-eval-print loops.
* codecs: 1c. Encode and decode data and streams.
* codeop: 1d. Compile (possibly incomplete) Python code.
* collections: 1e. Container datatypes
* collections.abc: 1f. Abstract base classes for containers
* colorsys: 20. Conversion functions between RGB and other color
                        systems.
* compileall: 21. Tools for byte-compiling all Python source files in a
                        directory tree.
* compression: 22. 
* compression.zstd: 23. Low-level interface to compression and decompression
                        routines in the zstd library.
* concurrent.futures: 24. Execute computations concurrently using threads or
                        processes.
* concurrent.interpreters: 25. Multiple interpreters in the same process
* configparser: 26. Configuration file parser.
* contextlib: 27. Utilities for with-statement contexts.
* contextvars: 28. Context Variables
* copy: 29. Shallow and deep copy operations.
* copyreg: 2a. Register pickle support functions.
* cProfile: 2b. 
* crypt: 2c. Removed in 3.13.
* csv: 2d. Write and read tabular data to and from delimited
                        files.
* ctypes: 2e. A foreign function library for Python.
* curses: 2f. An interface to the curses library@comma{} providing
                        portable terminal handling.
* curses.ascii: 30. Constants and set-membership functions for ASCII
                        characters.
* curses.panel: 31. A panel stack extension that adds depth to curses
                        windows.
* curses.textpad: 32. Emacs-like input editing in a curses window.
* dataclasses: 33. Generate special methods on user-defined classes.
* datetime: 34. Basic date and time types.
* dbm: 35. Interfaces to various Unix "database" formats.
* dbm.dumb: 36. Portable implementation of the simple DBM interface.
* dbm.gnu: 37. GNU database manager
* dbm.ndbm: 38. The New Database Manager
* dbm.sqlite3: 39. SQLite backend for dbm
* decimal: 3a. Implementation of the General Decimal Arithmetic
                        Specification.
* difflib: 3b. Helpers for computing differences between objects.
* dis: 3c. Disassembler for Python bytecode.
* distutils: 3d. Removed in 3.12.
* doctest: 3e. Test pieces of code within docstrings.
* email: 3f. Package supporting the parsing@comma{}
                        manipulating@comma{} and generating email messages.
* email.charset: 40. Character Sets
* email.contentmanager: 41. Storing and Retrieving Content from MIME Parts
* email.encoders: 42. Encoders for email message payloads.
* email.errors: 43. The exception classes used by the email package.
* email.generator: 44. Generate flat text email messages from a message
                        structure.
* email.header: 45. Representing non-ASCII headers
* email.headerregistry: 46. Automatic Parsing of headers based on the field name
* email.iterators: 47. Iterate over a message object tree.
* email.message: 48. The base class representing email messages.
* email.mime: 49. Build MIME messages.
* email.mime.application: 4a. 
* email.mime.audio: 4b. 
* email.mime.base: 4c. 
* email.mime.image: 4d. 
* email.mime.message: 4e. 
* email.mime.multipart: 4f. 
* email.mime.nonmultipart: 50. 
* email.mime.text: 51. 
* email.parser: 52. Parse flat text email messages to produce a message
                        object structure.
* email.policy: 53. Controlling the parsing and generating of messages
* email.utils: 54. Miscellaneous email package utilities.
* encodings: 55. Encodings package
* encodings.idna: 56. Internationalized Domain Names implementation
* encodings.mbcs: 57. Windows ANSI codepage
* encodings.utf_8_sig: 58. UTF-8 codec with BOM signature
* ensurepip: 59. Bootstrapping the "pip" installer into an existing
                        Python installation or virtual environment.
* enum: 5a. Implementation of an enumeration class.
* errno: 5b. Standard errno system symbols.
* faulthandler: 5c. Dump the Python traceback.
* fcntl: 5d. The fcntl() and ioctl() system calls.
* filecmp: 5e. Compare files efficiently.
* fileinput: 5f. Loop over standard input or a list of files.
* fnmatch: 60. Unix shell style filename pattern matching.
* fractions: 61. Rational numbers.
* ftplib: 62. FTP protocol client (requires sockets).
* functools: 63. Higher-order functions and operations on callable
                        objects.
* gc: 64. Interface to the cycle-detecting garbage collector.
* getopt: 65. Portable parser for command line options; support both
                        short and long option names.
* getpass: 66. Portable reading of passwords and retrieval of the
                        userid.
* gettext: 67. Multilingual internationalization services.
* glob: 68. Unix shell style pathname pattern expansion.
* graphlib: 69. Functionality to operate with graph-like structures
* grp: 6a. The group database (getgrnam() and friends).
* gzip: 6b. Interfaces for gzip compression and decompression
                        using file objects.
* hashlib: 6c. Secure hash and message digest algorithms.
* heapq: 6d. Heap queue algorithm (a.k.a. priority queue).
* hmac: 6e. Keyed-Hashing for Message Authentication (HMAC)
                        implementation
* html: 6f. Helpers for manipulating HTML.
* html.entities: 70. Definitions of HTML general entities.
* html.parser: 71. A simple parser that can handle HTML and XHTML.
* http: 72. HTTP status codes and messages
* http.client: 73. HTTP and HTTPS protocol client (requires sockets).
* http.cookiejar: 74. Classes for automatic handling of HTTP cookies.
* http.cookies: 75. Support for HTTP state management (cookies).
* http.server: 76. HTTP server and request handlers.
* idlelib: 77. Implementation package for the IDLE shell/editor.
* imaplib: 78. IMAP4 protocol client (requires sockets).
* imghdr: 79. Removed in 3.13.
* imp: 7a. Removed in 3.12.
* importlib: 7b. The implementation of the import machinery.
* importlib.abc: 7c. Abstract base classes related to import
* importlib.machinery: 7d. Importers and path hooks
* importlib.metadata: 7e. Accessing package metadata
* importlib.resources: 7f. Package resource reading@comma{} opening@comma{} and
                        access
* importlib.resources.abc: 80. Abstract base classes for resources
* importlib.util: 81. Utility code for importers
* inspect: 82. Extract information and source code from live objects.
* io: 83. Core tools for working with streams.
* ipaddress: 84. IPv4/IPv6 manipulation library.
* itertools: 85. Functions creating iterators for efficient looping.
* json: 86. Encode and decode the JSON format.
* json.tool: 87. A command-line interface to validate and pretty-print
                        JSON.
* keyword: 88. Test whether a string is a keyword in Python.
* linecache: 89. Provides random access to individual lines from text
                        files.
* locale: 8a. Internationalization services.
* logging: 8b. Flexible event logging system for applications.
* logging.config: 8c. Configuration of the logging module.
* logging.handlers: 8d. Handlers for the logging module.
* lzma: 8e. A Python wrapper for the liblzma compression library.
* mailbox: 8f. Manipulate mailboxes in various formats
* mailcap: 90. Removed in 3.13.
* marshal: 91. Convert Python objects to streams of bytes and back
                        (with different constraints).
* math: 92. Mathematical functions (sin() etc.).
* mimetypes: 93. Mapping of filename extensions to MIME types.
* mmap: 94. Interface to memory-mapped files for Unix and Windows.
* modulefinder: 95. Find modules used by a script.
* msilib: 96. Removed in 3.13.
* msvcrt: 97. Miscellaneous useful routines from the MS VC++
                        runtime.
* multiprocessing: 98. Process-based parallelism.
* multiprocessing.connection: 99. API for dealing with sockets.
* multiprocessing.dummy: 9a. Dumb wrapper around threading.
* multiprocessing.managers: 9b. Share data between process with shared objects.
* multiprocessing.pool: 9c. Create pools of processes.
* multiprocessing.shared_memory: 9d. Provides shared memory for direct access
                                 across processes.
* multiprocessing.sharedctypes: 9e. Allocate ctypes objects from shared memory.
* netrc: 9f. Loading of .netrc files.
* nis: a0. Removed in 3.13.
* nntplib: a1. Removed in 3.13.
* numbers: a2. Numeric abstract base classes (Complex@comma{}
                        Real@comma{} Integral@comma{} etc.).
* operator: a3. Functions corresponding to the standard operators.
* optparse: a4. Command-line option parsing library.
* os: a5. Miscellaneous operating system interfaces.
* os.path: a6. Operations on pathnames.
* ossaudiodev: a7. Removed in 3.13.
* pathlib: a8. Object-oriented filesystem paths
* pathlib.types: a9. pathlib types for static type checking
* pdb: aa. The Python debugger for interactive interpreters.
* pickle: ab. Convert Python objects to streams of bytes and back.
* pickletools: ac. Contains extensive comments about the pickle protocols
                        and pickle-machine opcodes@comma{} as well as some
                        useful functions.
* pipes: ad. Removed in 3.13.
* pkgutil: ae. Utilities for the import system.
* platform: af. Retrieves as much platform identifying data as
                        possible.
* plistlib: b0. Generate and parse Apple plist files.
* poplib: b1. POP3 protocol client (requires sockets).
* posix: b2. The most common POSIX system calls (normally used via
                        module os).
* pprint: b3. Data pretty printer.
* profile: b4. Python source profiler.
* pstats: b5. Statistics object for use with the profiler.
* pty: b6. Pseudo-Terminal Handling for Unix.
* pwd: b7. The password database (getpwnam() and friends).
* py_compile: b8. Generate byte-code files from Python source files.
* pyclbr: b9. Supports information extraction for a Python module
                        browser.
* pydoc: ba. Documentation generator and online help system.
* queue: bb. A synchronized queue class.
* quopri: bc. Encode and decode files using the MIME quoted-
                        printable encoding.
* random: bd. Generate pseudo-random numbers with various common
                        distributions.
* re: be. Regular expression operations.
* readline: bf. GNU readline support for Python.
* reprlib: c0. Alternate repr() implementation with size limits.
* resource: c1. An interface to provide resource usage information on
                        the current process.
* rlcompleter: c2. Python identifier completion@comma{} suitable for the
                        GNU readline library.
* runpy: c3. Locate and run Python modules without importing them
                        first.
* sched: c4. General purpose event scheduler.
* secrets: c5. Generate secure random numbers for managing secrets.
* select: c6. Wait for I/O completion on multiple streams.
* selectors: c7. High-level I/O multiplexing.
* shelve: c8. Python object persistence.
* shlex: c9. Simple lexical analysis for Unix shell-like languages.
* shutil: ca. High-level file operations@comma{} including copying.
* signal: cb. Set handlers for asynchronous events.
* site: cc. Module responsible for site-specific configuration.
* sitecustomize: cd. 
* smtpd: ce. Removed in 3.12.
* smtplib: cf. SMTP protocol client (requires sockets).
* sndhdr: d0. Removed in 3.13.
* socket: d1. Low-level networking interface.
* socketserver: d2. A framework for network servers.
* spwd: d3. Removed in 3.13.
* sqlite3: d4. A DB-API 2.0 implementation using SQLite 3.x.
* ssl: d5. TLS/SSL wrapper for socket objects
* stat: d6. Utilities for interpreting the results of
                        os.stat()@comma{} os.lstat() and os.fstat().
* statistics: d7. Mathematical statistics functions
* string: d8. Common string operations.
* string.templatelib: d9. Support for template string literals.
* stringprep: da. String preparation@comma{} as per RFC 3453
* struct: db. Interpret bytes as packed binary data.
* subprocess: dc. Subprocess management.
* sunau: dd. Removed in 3.13.
* symtable: de. Interface to the compiler's internal symbol tables.
* sys: df. Access system-specific parameters and functions.
* sys.monitoring: e0. Access and control event monitoring
* sysconfig: e1. Python's configuration information
* syslog: e2. An interface to the Unix syslog library routines.
* tabnanny: e3. Tool for detecting white space related problems in
                        Python source files in a directory tree.
* tarfile: e4. Read and write tar-format archive files.
* telnetlib: e5. Removed in 3.13.
* tempfile: e6. Generate temporary files and directories.
* termios: e7. POSIX style tty control.
* test: e8. Regression tests package containing the testing suite
                        for Python.
* test.regrtest: e9. Drives the regression test suite.
* test.support: ea. Support for Python's regression test suite.
* test.support.bytecode_helper: eb. Support tools for testing correct bytecode
                                generation.
* test.support.import_helper: ec. Support for import tests.
* test.support.os_helper: ed. Support for os tests.
* test.support.script_helper: ee. Support for Python's script execution tests.
* test.support.socket_helper: ef. Support for socket tests.
* test.support.threading_helper: f0. Support for threading tests.
* test.support.warnings_helper: f1. Support for warnings tests.
* textwrap: f2. Text wrapping and filling
* threading: f3. Thread-based parallelism.
* time: f4. Time access and conversions.
* timeit: f5. Measure the execution time of small code snippets.
* tkinter: f6. Interface to Tcl/Tk for graphical user interfaces
* tkinter.colorchooser: f7. Color choosing dialog
* tkinter.commondialog: f8. Tkinter base class for dialogs
* tkinter.dnd: f9. Tkinter drag-and-drop interface
* tkinter.filedialog: fa. Dialog classes for file selection
* tkinter.font: fb. Tkinter font-wrapping class
* tkinter.messagebox: fc. Various types of alert dialogs
* tkinter.scrolledtext: fd. Text widget with a vertical scroll bar.
* tkinter.simpledialog: fe. Simple dialog windows
* tkinter.ttk: ff. Tk themed widget set
* token: 100. Constants representing terminal nodes of the parse
                        tree.
* tokenize: 101. Lexical scanner for Python source code.
* tomllib: 102. Parse TOML files.
* trace: 103. Trace or track Python statement execution.
* traceback: 104. Print or retrieve a stack traceback.
* tracemalloc: 105. Trace memory allocations.
* tty: 106. Utility functions that perform common terminal control
                        operations.
* turtle: 107. An educational framework for simple graphics
                        applications
* turtledemo: 108. A viewer for example turtle scripts
* types: 109. Names for built-in types.
* typing: 10a. Support for type hints (see :pep:`484`).
* unicodedata: 10b. Access the Unicode Database.
* unittest: 10c. Unit testing framework for Python.
* unittest.mock: 10d. Mock object library.
* urllib: 10e. 
* urllib.error: 10f. Exception classes raised by urllib.request.
* urllib.parse: 110. Parse URLs into or assemble them from components.
* urllib.request: 111. Extensible library for opening URLs.
* urllib.response: 112. Response classes used by urllib.
* urllib.robotparser: 113. Load a robots.txt file and answer questions about
                        fetchability of other URLs.
* usercustomize: 114. 
* uu: 115. Removed in 3.13.
* uuid: 116. UUID objects (universally unique identifiers)
                        according to RFC 9562
* venv: 117. Creation of virtual environments.
* warnings: 118. Issue warning messages and control their disposition.
* wave: 119. Provide an interface to the WAV sound format.
* weakref: 11a. Support for weak references and weak dictionaries.
* webbrowser: 11b. Easy-to-use controller for web browsers.
* winreg: 11c. Routines and objects for manipulating the Windows
                        registry.
* winsound: 11d. Access to the sound-playing machinery for Windows.
* wsgiref: 11e. WSGI Utilities and Reference Implementation.
* wsgiref.handlers: 11f. WSGI server/gateway base classes.
* wsgiref.headers: 120. WSGI response header tools.
* wsgiref.simple_server: 121. A simple WSGI HTTP server.
* wsgiref.types: 122. WSGI types for static type checking
* wsgiref.util: 123. WSGI environment utilities.
* wsgiref.validate: 124. WSGI conformance checker.
* xdrlib: 125. Removed in 3.13.
* xml: 126. Package containing XML processing modules
* xml.dom: 127. Document Object Model API for Python.
* xml.dom.minidom: 128. Minimal Document Object Model (DOM) implementation.
* xml.dom.pulldom: 129. Support for building partial DOM trees from SAX
                        events.
* xml.etree.ElementInclude: 12a. 
* xml.etree.ElementTree: 12b. Implementation of the ElementTree API.
* xml.parsers.expat: 12c. An interface to the Expat non-validating XML parser.
* xml.parsers.expat.errors: 12d. 
* xml.parsers.expat.model: 12e. 
* xml.sax: 12f. Package containing SAX2 base classes and convenience
                        functions.
* xml.sax.handler: 130. Base classes for SAX event handlers.
* xml.sax.saxutils: 131. Convenience functions and classes for use with SAX.
* xml.sax.xmlreader: 132. Interface which SAX-compliant XML parsers must
                        implement.
* xmlrpc: 133. Server and client modules implementing XML-RPC.
* xmlrpc.client: 134. XML-RPC client access.
* xmlrpc.server: 135. Basic XML-RPC server implementations.
* zipapp: 136. Manage executable Python zip archives
* zipfile: 137. Read and write ZIP-format archive files.
* zipimport: 138. Support for importing Python modules from ZIP
                        archives.
* zlib: 139. Low-level interface to compression and decompression
                        routines compatible with gzip.
* zoneinfo: 13a. IANA time zone support
@end menu


@node 색인,,Python 모듈 목록,Top
@unnumbered 색인


@printindex ge

@anchor{47a2}@w{                              }
@anchor{2023}@w{                              }
@anchor{4799}@w{                              }
@anchor{153b}@w{                              }
@anchor{library/stdtypes range index}@w{                              }
@anchor{using/cmdline audit_event_cpython_run_file_0}@w{                              }
@anchor{library/stdtypes list pop}@w{                              }
@anchor{4795}@w{                              }
@anchor{using/cmdline audit_event_cpython_run_stdin_1}@w{                              }
@anchor{47a0}@w{                              }
@anchor{600}@w{                              }
@anchor{1a5b}@w{                              }
@anchor{139d}@w{                              }
@anchor{library/ctypes audit_event_ctypes_memoryview_at_0}@w{                              }
@anchor{library/stdtypes list clear}@w{                              }
@anchor{1979}@w{                              }
@anchor{library/unittest unittest tearDownModule}@w{                              }
@anchor{library/stdtypes list remove}@w{                              }
@anchor{4797}@w{                              }
@anchor{library/stdtypes list extend}@w{                              }
@anchor{library/stdtypes list insert}@w{                              }
@anchor{8db}@w{                              }
@anchor{4798}@w{                              }
@anchor{15c7}@w{                              }
@anchor{4796}@w{                              }
@anchor{library/_thread start_new_thread}@w{                              }
@anchor{601}@w{                              }
@anchor{15c8}@w{                              }
@anchor{library/sys script_path}@w{                              }
@anchor{4794}@w{                              }
@anchor{library/stdtypes list append}@w{                              }
@anchor{library/sys audit_event_cpython_remote_debugger_script_0}@w{                              }
@anchor{library/stdtypes tuple index}@w{                              }
@anchor{using/cmdline audit_event_cpython_run_stdin_0}@w{                              }
@anchor{library/stdtypes tuple count}@w{                              }
@anchor{library/time audit_event_time_sleep_0}@w{                              }
@anchor{4791}@w{                              }
@anchor{library/asyncio audit_event_cpython_run_stdin_2}@w{                              }

@c %**end of body
@bye
